From 4fd73878cafea557d94827f34cc591c611ea0aa0 Mon Sep 17 00:00:00 2001 From: cccs-RyanK <102618419+cccs-RyanK@users.noreply.github.com> Date: Thu, 27 Apr 2023 13:41:58 -0400 Subject: [PATCH] Feature/update cccs main to 2.1.0 add cccs 2.0 (#281) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add ssh tunneling to dynamic form for Database Connection UI (#22689) Co-authored-by: Antonio Rivero Martinez <38889534+Antonio-RiveroMartnez@users.noreply.github.com> Co-authored-by: Antonio Rivero Co-authored-by: Elizabeth Thompson Co-authored-by: Lyndsi Kay Williams <55605634+lyndsiWilliams@users.noreply.github.com> * chore(dashboard): Log events for download as image (#22793) * docs: link docker readme in docker config section (#22796) * chore: Add explicit bidirectional performant relationships for SQLA model (#22413) * fix: better logic to extract errors on databricks (#22792) * fix(hive): Regression in #21794 (#22794) * fix: Unexpected error on simple filter (#22814) * feat(docker): Build multiple python version images (#22770) Co-authored-by: Daniel Draper * fix: allow CSV upload in Other db (#22807) * chore: Convert direct uses of antd icons to 'Icons' component (#22516) * fix(sqllab): type error on renderBigIntStr (#22813) * chore: upgrade react-datetime, react-intersection-observer and react-checkbox-tree (#22585) * feat(helm): Add ability to customize affinity per deployment (#22827) * chore(issue templates): discouraging Issues for feature requests (#22617) * docs(alerts & reports): add, prune, reorganize (#20872) * chore(tests): Streamline Cypress login to fix fails/flakes (#22844) * feat: export/import `allow_dml` flag (#22806) * chore: Migrate /superset/recent_activity// to /api/v1/ (#22789) * test: Fix act errors in DatasourceControl test (#22845) * test: Fix act errors in DatabaseModal test (#22846) * feat: Move cross filters to Dashboard (#22785) * fix(cpq): Add `schema` to Query.data() payload (#22791) * fix(Annotation Layers): Error when render options with renamed columns (#22453) * build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.48.2 to 5.49.0 in /superset-websocket (#22838) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(misc): Spelling (#19678) Signed-off-by: Josh Soref Co-authored-by: Josh Soref * build(deps): bump ua-parser-js from 0.7.31 to 0.7.33 in /docs (#22858) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * docs(cache): update doc strings (#22865) * chore: migrate react-diff-viewer to react-diff-viewer-continued for react 18 upgrade (#22834) * chore: upgrade react-table for react 18 upgrade (#22780) * chore: upgrade react-reverse-portal for react upgrade (#22779) * chore: removing unnecessary double spaces, a.k.a. "shotgun holes" (#22852) * fix: Convert TIMESTAMP_* to TIMESTAMP in Snowflake (#22872) * fix(sqllab): reverts #22695 (#22861) * feat(ssh_tunnel): Add feature flag to SSH Tunnel API (#22805) * fix: revert RESTful apis and react view for RLS (#22818) * chore: deprecate /superset/slice_json/ and /superset/annotation_json/ (#22496) * chore: add statsd support to base API and refactor (#22887) * chore: Migrate /superset/queries/ to API v1 (#22611) * docs: add Skyscanner to users list (#22888) Co-authored-by: Calum * feat: Add excel export (#22006) Co-authored-by: Igor Șincariov Co-authored-by: EugeneTorap * build(deps): bump moment from 2.29.2 to 2.29.4 in /docs (#22891) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump underscore from 1.12.0 to 1.12.1 in /superset-frontend (#22892) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: deprecate /superset/filter/... endpoint, migrate to apiv1 (#22882) * fix: bump isort to fix pre-commit CI (#22907) * chore: migrate /sql_json and /results to apiv1 (#22809) * chore: Localization of superset pt. 2 (#22772) * fix: edit pyarrow stringify to better handle emojis and accents (#22881) * fix(sqllab): inconsistent addNewQueryEditor behavior (#21999) * fix(i18n): greatly optimize Chinese translation (#22036) * chore: skip puppeteer chromium download (#22623) * fix(dependency): update cryptography import (#22744) Co-authored-by: Daniel Draper * feat: add pyproject.toml file to project (#20291) * chore(db_engine_specs): clean up column spec logic and add tests (#22871) * feat: Adds the ECharts Sunburst chart (#22833) * fix: Time range filter applied on a dashboard is not persisting to the chart explore (#22920) * fix(fab): Fix regression on FAB dropdowns (#22889) * chore: migrate @vx/responsive to @visx/responsive for react 18 upgrade (#22815) * fix: fix warning in ssh tunnel (#22912) * chore: upgrade packages for react v17 upgrade (#22914) * chore: upgrade react-router-dom to 5.3.4 (#22878) * build(deps-dev): bump eslint from 8.32.0 to 8.33.0 in /superset-websocket (#22902) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(helm): Make Chart.AppVersion default value for image tag (#22854) * chore: Migrate /superset/tables/* to API v1 (#22501) * fix(native-filters): Ensure that time range filter loses focus after closing modal (#22937) * fix: Remove button is broken for metrics on Explore (#22940) * feat: Enable new dataset creation flow II (#22835) * fix(datasets): Fix property selection on JSON response (#22944) * fix: Improve performance of CSV download (#22929) * test: Clean up AdhocFilterOption test warnings (#22915) * chore: Bump Flask-AppBuilder constraints (#22927) * chore(welcome): change default last tab to "all" (#22798) * fix(explore): Time comparison in Mixed Chart in GENERIC_CHART_AXES not working (#22945) * chore(superset-ui-chart-controls): refactor pivot and rename operator (#22963) * build(deps): bump http-cache-semantics from 4.1.0 to 4.1.1 in /superset-frontend (#22958) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(explore): unable to update linked charts (#22896) * chore(frontend): Spelling (#19676) Signed-off-by: Josh Soref Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> Co-authored-by: Josh Soref * chore: add waitress for win32 platform (#22935) * fix(datasets): Include expression and description in duplicated dataset columns (#22943) * feat: add tabs to edit dataset page (#22043) Co-authored-by: AAfghahi <48933336+AAfghahi@users.noreply.github.com> Co-authored-by: Lyndsi Kay Williams <55605634+lyndsiWilliams@users.noreply.github.com> Co-authored-by: lyndsiWilliams * docs: add Caizin to the user list (#22961) * test: Fix act errors in DatabaseList test (#22970) * test: Clean up QueryList test warnings (#22972) * fix(native-filters): Don't include description icon in truncation calc (#22941) * fix: Prevents last temporal filter removal (#22982) * fix(explore): Mark time range dashboard filter with warning icon (#22984) * docs(alerts & reports): clarify nature of "-dev" labeled container images (#22988) * chore: bump python version to 3.8.16 in Dockerfile (#22934) * fix: Form data was not being passed to save/update slice (#22989) * feat(ssh_tunnel): SSH Tunnel Switch extension (#22967) * chore: Fix grammar (#22831) * docs: added Orange inside the inthewild.md doc (#22986) * fix: add new config to allow for specific import data urls (#22942) * build(deps): bump pre-commit from 2.20.0 to 3.0.4 in /requirements (#22996) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(explore): Save button incorrectly disabled when adding new metric with dnd (#23000) * build(deps): bump http-cache-semantics from 4.1.0 to 4.1.1 in /docs (#22956) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix: Make cte_alias a property of db engine spec (#22947) * fix(migrations): Flask-Migrate output is not logged during alembic migrations #17991 (#22991) * fix(dashboard): export & import chart description and certification details (#22471) * chore: updating link to sandbox.js (#23005) * fix(sqllab): clean unwanted scrollbar (#22990) * chore: Localization of superset pt. 3 (#22938) Co-authored-by: Evan Rusackas * chore(deps): bump ajv and react-jsonschema-form in /superset-frontend (#21809) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps-dev): bump eslint-config-prettier from 7.2.0 to 8.6.0 in /superset-websocket (#22767) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump http-cache-semantics from 4.1.0 to 4.1.1 in /superset-frontend/cypress-base (#22955) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps-dev): bump @types/node from 18.11.13 to 18.11.19 in /superset-websocket (#22997) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(datasets): Populate Usage tab in Edit Dataset view (#22670) * build(deps-dev): bump @typescript-eslint/parser from 5.48.1 to 5.51.0 in /superset-websocket (#23013) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps-dev): bump typescript from 4.9.4 to 4.9.5 in /superset-websocket (#22933) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(tests): Cypress optimizations to help with fails (#23023) * chore: refactor SliceAdder for react 17 and react 18 (#23009) * fix(explore): Enable saving metric after changing title (#23020) * fix: dataset import error message (#23025) * fix(ssh_tunnel): Fix bug on database edition for databases with ssh tunnels (#23006) Co-authored-by: Lyndsi Kay Williams <55605634+lyndsiWilliams@users.noreply.github.com> * fix: Handles disabled options on Select All (#22830) * fix(dashboard): Stop updating chart owners for charts removed from dashboard (#21720) Co-authored-by: Michael S. Molina * docs(teradata): fix connection string (#23051) * fix: Time Column on Generic X-axis (#23021) * fix: Menu items are not disappearing when deleting a dashboard (#23039) * fix(i18n): improve Russian translation (#22939) * fix(sqllab): Invalid schema fetch by deprecated value (#22968) * chore: Removes icon warnings from tests (#23054) * feat(sqllab): Add event logger (#23040) * chore(datasets): Refactor DatasetDAO update to leverage bulk logic for create, update, and delete operations (#22957) * chore: remove db_engines (#22444) * feat(helm): allow persisting nodePort for services (#22713) Signed-off-by: DASTC\gupta_rajan Co-authored-by: DASTC\gupta_rajan * build(deps-dev): bump @typescript-eslint/eslint-plugin from 5.49.0 to 5.52.0 in /superset-websocket (#23073) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump hot-shots from 9.3.0 to 10.0.0 in /superset-websocket (#23031) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps-dev): bump prettier from 2.8.3 to 2.8.4 in /superset-websocket (#23030) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps-dev): bump @types/node from 18.11.19 to 18.13.0 in /superset-websocket (#23029) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix: cache warmup solution non legacy charts. (#23012) * docs: remove duplicate navbar item (#22486) Signed-off-by: tison * chore: Migrate get_or_create_table endpoint to api v1 (#22931) * chore: Migrate /superset/csv/ to API v1 (#22913) * fix: css template permissions for gamma role (#23083) * build(deps): bump ws from 8.12.0 to 8.12.1 in /superset-websocket (#23080) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps-dev): bump eslint from 8.33.0 to 8.34.0 in /superset-websocket (#23079) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(style): make brand icon max width customizable (#23081) * chore: Remove dependency warnings from SqlEditorLeftBar/index.tsx (#22975) * chore: Remove dependency warnings from SqlEditor/index.jsx (#22974) * chore: Remove dependency warnings from DatasetList.tsx (#22973) * test: Convert DatasetList test from jsx to tsx (#22971) * test: Clean up SelectAsyncControl test warnings (#22969) * chore: move dashboard screenshot standalone logic (#23003) * fix: dict bug on QueryContextFactory (#23093) Co-authored-by: ok9897 * chore: Improve greeting message (#23077) * chore: Updating connection URI for MS SQL Server (#22903) Co-authored-by: Evan Rusackas * chore: increment statsd as warn (#23041) * fix: removing pyproject.toml (#23101) * chore: change AlertQueryError to 400 (#23102) * fix: missing __init__ on module sqllab commands (#23107) * updating package json * post merge fixes * [cccs-2.0] updating docker file (#188) * [CLDN-1565] Fixing bugs (#189) * [CLDN-1565] Fixing bugs * removing uneeded import * Feature/cldn 1565 (#192) * [CLDN-1565] Fixing bugs * removing uneeded import * [CLDN-1565] Adding new image * Feature/cldn 1609 (#195) * Add row number option to CCCS-Grid (#181) * Add row number option to CCCS-Grid * Have row numbers show by default Co-authored-by: cccs-Dustin <96579982+cccs-Dustin@users.noreply.github.com> Co-authored-by: cccs-Dustin <96579982+cccs-Dustin@users.noreply.github.com> * Use new build agent (#187) * Use new build agent * Remove quotes * Display datahub link for datasets with defined URN (#177) * Display datahub link for datasets with defined URN * Add datahub SVG * Reorder imports * Add datahub link to dashboards * Convert to camel case * Add tests for DatasetList * Add tests for dashboard header * Provide explanation for empty catch * [CLDN-1540] Added ability for multiple user emails to be filtered on at once * [CLDN-1540] temp update to docker image tag so that we can deploy code changes to PB-stg * [CLDN-1540] revert of temp update to docker image tag so that we can deploy code changes to PB-stg * Add path to url (#193) * [CLDN-1609] Fixing post merge build errors * Update cccs-build/superset-base/azure-pipelines.yml Co-authored-by: Reese <10563996+reesercollins@users.noreply.github.com> * Update superset-frontend/src/cccs-viz/plugins/plugin-chart-at-a-glance-user-id/src/styles.js Co-authored-by: Reese <10563996+reesercollins@users.noreply.github.com> Co-authored-by: Reese <10563996+reesercollins@users.noreply.github.com> Co-authored-by: cccs-Dustin <96579982+cccs-Dustin@users.noreply.github.com> * [CLDN-1609] Updating image (#196) * [CLDN-1620] Making rendering use advanced type (#197) * updating image (#198) * [CLDN-1609] Fixing all QA bugs (#201) * [CLDN-1609] Fixing all QA bugs * [CLDN-1609] Fixing build errors * [CLDN-1609] adding additional fixes * [CLDN-1609] Removing log files * [CLDN-1609] Fixing build error Co-authored-by: reesercollins <10563996+reesercollins@users.noreply.github.com> * Feature/cldn 1541 (#200) * [CLDN-1541] Added the ability to filter on multiple user ID's and IP's at the same time in the Application Links custom viz * Temp update to image for deploying to PB-stg * Reverting change to image * [CLDN-1541] Added a tooltip to the Alfred icon * Temp update to base image * Reverting temporary change to image tag * Update superset-frontend/src/cccs-viz/plugins/plugin-chart-application-links/src/ApplicationLinks.tsx Co-authored-by: cccs-rc <62034438+cccs-rc@users.noreply.github.com> * Update superset-frontend/src/cccs-viz/plugins/plugin-chart-application-links/src/ApplicationLinks.tsx Co-authored-by: cccs-rc <62034438+cccs-rc@users.noreply.github.com> * [CLDN-1541] Changed the logic around creating the proper links/URL * Temp update to img * Undo temp img change Co-authored-by: cccs-rc <62034438+cccs-rc@users.noreply.github.com> * [CLDN-1609] Updating docker image (#202) * [cccs-2.0] Fixing case sensitivity (#203) * [cccs-2.0] Fixing case sensitivity * [cccs-2.0] Pusing temp image * [cccs-2.0] fixing two order bys * [cccs-2.0] fixing verbose names, fixing sizing, fixing ordering * [cccs-2.0] fixing build error * [cccs-2.0] updating image * [cccs-2.0] fixing time columns * [cccs-2.0] Fixing build errors * [cccs-2.0] updating docker file * [cccs-2.0] Fixing time column to populate default time col * Fixing default time col * [cccs-2.0] updating image * Fix issue where datasets without a date/datetime column would not load in the explore view * Time column dropdown list is now properly populated with either the default temporal column, or the first temporal column (if a default is not set) * Temp update to base image tag * Fixed the bug where when there are no dttm columns, the non-dttm columns were being displayed * Temp update to base image tag * Reverting changes to the img Co-authored-by: cccs-Dustin <96579982+cccs-Dustin@users.noreply.github.com> * Fix/cccs 2.0 (#204) * [cccs-2.0] Fixing case sensitivity * [cccs-2.0] Pusing temp image * [cccs-2.0] fixing two order bys * [cccs-2.0] fixing verbose names, fixing sizing, fixing ordering * [cccs-2.0] fixing build error * [cccs-2.0] updating image * [cccs-2.0] fixing time columns * [cccs-2.0] Fixing build errors * [cccs-2.0] updating docker file * [cccs-2.0] Fixing time column to populate default time col * Fixing default time col * [cccs-2.0] updating image * Fix issue where datasets without a date/datetime column would not load in the explore view * Time column dropdown list is now properly populated with either the default temporal column, or the first temporal column (if a default is not set) * Temp update to base image tag * Fixed the bug where when there are no dttm columns, the non-dttm columns were being displayed * Temp update to base image tag * Reverting changes to the img * Updating image tag Co-authored-by: cccs-RyanS <71385290+cccs-RyanS@users.noreply.github.com> * Fixed issue with Typescript (#205) * Fix cccs 2.0 (#206) * Fixed issue with Typescript * Update image tag * Feature/cldn 1563 (#207) * Ran pre-commit hook on the front-end * Removed unused file & removed duplicate method * Made changes so that the pre-commit hook would pass all tests * Temp update to build img * revert temp change to build img * Updated image (#208) * [CLDN-1683] Added code to show column descriptions as tooltips in the… (#209) * [CLDN-1683] Added code to show column descriptions as tooltips in the Hogwarts Table custom visualisation * [CLDN-1683] Temp update to build image * [CLDN-1683] Revert update to image tag * Feature/cldn 1676 (#210) * [CLDN-1676] Added ability to search for the IPv4 rendered value of an IP address instead of the raw value * [CLDN-1676] Temp update to img for deploying to UDev * [CLDN-1676] Undo temp update to img for deploying to UDev * Updating Superset Base Image Tag (#211) * added adhoc filter plugin files * Made sure that adhoc filter uses the adhoc filter object * added adhocfiltercontrol to native adhoc filter * fixed hook that made too many requests * fixed applied filter label * removed duplicate files * Removed uneeded functions * Removed uneeded functions and variables * Removed unused props variables * modifying base image tag * Removed unused config settings * removed column for filter config form * Improved the applied filter(s) modal * Temp update to build image * fixed string formatting issue: * updating superset base image tag * added setFocused hooks to filter when hovering * Fixed the right click to emit dashboard cross-filters (#213) * Fixed the right click to emit filters through the context menu as it was not working * Temp update to build image * Revert temp update to build image * Updated superset base image (#214) * fixed unused declaration error * updating image * Prevent invalid filter values from being saved (#215) By assuming that all input is invalid until the api tells us otherwise, we can prevent the user from clicking the save button in the time between the value being entered and the api returning. * [cccs-2.0] fixing trino req (#216) * updating superset-base image tag * added option to emit a filter from a default column for a row in ag grid * Update trino python client (#219) * Updated trino python client from 0.316.0 to 0.318.0 * Temp update to base image tag * Removing temp change to build image * Updated superset's base image tag (#221) * Update superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/CccsGrid.tsx Co-authored-by: cccs-Dustin <96579982+cccs-Dustin@users.noreply.github.com> * changed control panel to plural * disallow columns that are not a part of the chart to be selected as default emit filters * updated image tag * updated control panel logic for agg mode * update image tag * fixed issues * updating base image * fixed refactor error * updating base image * fixed so that option disables properly * updating base image * Add users API to get and delete users (#223) * Add users API to get and delete users * Allow browser login for users api * updating image * Update cccs-build/superset/Dockerfile Co-authored-by: cccs-Dustin <96579982+cccs-Dustin@users.noreply.github.com> * Added ability to certify entities with multiple values (#224) * Added ability to certify entities with multiple values * Update description text to reflect new feature * Add tests for multiple certified by values * Feature/cldn 1749 (#222) * [CLDN-1749] adding new viz * chanigng to work with standard filters * Adding generic filter extraction * Removing unused imports * [CLDN-1749] Cleaning up code for reusablility * [CLDN-1749] removing unused files * [CLDN-1746] fixing case * [CLDN-1749] adding parameter validation * [CLDN-1749] adding error message and prefix parameter * [CLDN-1749] removing unused files * [CLDN-1749] adding temp base image for docker deployment * [CLDN-1749] Better error handling and new icon * [CLDN-1749] remove unused imports * temp dockerfile change * [CLDN-1749] Adding the adhoc filters back in * [CLDN-1749] Updating image * [CLDN-1749] Adding new thumbnail * Updating dockerfile * [CLDN-1749] Removing uneeded control panel elements * [CLDN-1749] Fixing build errors * [CLDN-1749] New image * Change to use data from dataset * Removing unsed function * Fixing typos * renove unused import * updating image * error message and label fixes * updating image * Update cccs-build/superset/Dockerfile Co-authored-by: cccs-Dustin <96579982+cccs-Dustin@users.noreply.github.com> * Update superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/transformProps.ts Co-authored-by: cccs-RyanK <102618419+cccs-RyanK@users.noreply.github.com> * Update superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/transformProps.ts Co-authored-by: cccs-RyanK <102618419+cccs-RyanK@users.noreply.github.com> Co-authored-by: cccs-Dustin <96579982+cccs-Dustin@users.noreply.github.com> Co-authored-by: cccs-RyanK <102618419+cccs-RyanK@users.noreply.github.com> * Prevent non-admins from using users api (#236) * Prevent non-admins from using users api * Add tests * added styles to highlight adhoc filter when focused and fix awkward empty header * removed suggestions from popping up * added comment * fixed unused import error * updating base image * Update Dockerfile * [CLDN-1829] fixing principle filter logic with state (#234) (#244) * [CLDN-1829] fixing principle filter logic with state * [CLDN-1829] Fixing build error * [cccs-2.0] Updating image (#245) * value set to empty list instead of undefined * updating base image * Feature/cldn 1748 (#243) * [CLDN-1748] adding base component * [CLDN-1748] changing state to use advanced data type * [CLDN-1748] add multi select for musiness type * [CLDN-1748] adding config manager * [CLDN-1748] fixing build errors * temp update of base image * [CLDN-1748] Fixing Url parameter encoding and show name of dashboard drilling to * temp update of image * Pulling extra data from dashboard endpoint * Adding more data to filters object * [CLDN-1748] passing mroe fitler information * [CLDN-1748] QA feedback * [CLDN-1748] Fixing build issues * [CLDN-1748] Updating dockerfile * [CLDN-1748] Updating dockerfile * fixing props name * update image * updating docker file * [CLDN-1748] Name changes * [CLDN-1748] updating image * [CLDN-1748] Adding icon * [CLDN-1748] fixing build errors * [CLDN-1748] update image * [CLDN-1748] fixing context menue to renderering * UPdating docker file * CLDN-1710 including schema in search columns for datasets api (#253) * Update Dockerfile * CLDN-1710 tag update (#255) * update image tag * updating image tag * Update vault image to get new CAs * update image tag * Update Dockerfile * Update Dockerfile * Feature/cldn 1773 (#269) * [CLDN-1773] Adding default group by * Updating DockerFile * Fixing Groupby * Updating base image * [CLDN-1773] Saving Group by order * Updating dockerfile * Update controlPanel.tsx * Update superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/plugin/transformProps.ts Co-authored-by: cccs-tom <59839056+cccs-tom@users.noreply.github.com> * Update superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/plugin/transformProps.ts Co-authored-by: cccs-tom <59839056+cccs-tom@users.noreply.github.com> * Update superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/plugin/transformProps.ts Co-authored-by: cccs-RyanK <102618419+cccs-RyanK@users.noreply.github.com> --------- Co-authored-by: cccs-tom <59839056+cccs-tom@users.noreply.github.com> Co-authored-by: cccs-RyanK <102618419+cccs-RyanK@users.noreply.github.com> * Updating docker file (#270) * Feature/cldn 1968 (Display JSON data inline) (#268) * Add buttons to expand and minimize JSON data as well as ability to expand and/or collapse all rows in a certain column * [CLDN-1968] Added expand button for full row * [CLDN-1968] Resize JSON columns * [CLDN-1968] Added new array which tracks JSON cell state * Revert "[CLDN-1968] Added new array which tracks JSON cell state" This reverts commit dabc3daee96cfbe39d9615837076e54736e518b6. * [CLDN-1968] Added ability for row level expand all button to track if cells are expanded or not * [CLDN-1968] Ran pre-commit hook * [CLDN-1968] Improved UI * [CLDN-1968] Update image tag for testing * [CLDN-1968] Revert image tag for testing * [CLDN-1968] Added multiple UI/UX changes based on QA feedback * [CLDN-1968] Added more UI/UX changes based on QA feedback * [CLDN-1968] Temp change to image * Revert "[CLDN-1968] Temp change to image" This reverts commit 57490bd71dbf14499f08e21e691933d6bbaf914d. * Update superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/CccsGrid.tsx Co-authored-by: cccs-rc <62034438+cccs-rc@users.noreply.github.com> * [CLDN-1968] Remove 'TODO's as they are no longer needed * [CLDN-1968] Changed a variable name, and condensed a few lines * [CLDN-1968] Modified a setState so that only one is needed instead of 2 --------- Co-authored-by: cccs-rc <62034438+cccs-rc@users.noreply.github.com> * Feature/cldn 1968 (#272) * Add buttons to expand and minimize JSON data as well as ability to expand and/or collapse all rows in a certain column * [CLDN-1968] Added expand button for full row * [CLDN-1968] Resize JSON columns * [CLDN-1968] Added new array which tracks JSON cell state * Revert "[CLDN-1968] Added new array which tracks JSON cell state" This reverts commit dabc3daee96cfbe39d9615837076e54736e518b6. * [CLDN-1968] Added ability for row level expand all button to track if cells are expanded or not * [CLDN-1968] Ran pre-commit hook * [CLDN-1968] Improved UI * [CLDN-1968] Update image tag for testing * [CLDN-1968] Revert image tag for testing * [CLDN-1968] Added multiple UI/UX changes based on QA feedback * [CLDN-1968] Added more UI/UX changes based on QA feedback * [CLDN-1968] Temp change to image * Revert "[CLDN-1968] Temp change to image" This reverts commit 57490bd71dbf14499f08e21e691933d6bbaf914d. * Update superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/CccsGrid.tsx Co-authored-by: cccs-rc <62034438+cccs-rc@users.noreply.github.com> * [CLDN-1968] Remove 'TODO's as they are no longer needed * [CLDN-1968] Changed a variable name, and condensed a few lines * [CLDN-1968] Modified a setState so that only one is needed instead of 2 * Update superset base image --------- Co-authored-by: cccs-rc <62034438+cccs-rc@users.noreply.github.com> * post merge fixes * updating package lock * fix npm install * npm fixes * updating base image tag * fixed typing extensions version * grabbing cldn 2076 changes * fixed dev version number * updating base image --------- Signed-off-by: dependabot[bot] Signed-off-by: Josh Soref Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> Signed-off-by: DASTC\gupta_rajan Signed-off-by: tison Co-authored-by: Hugh A. Miles II Co-authored-by: Antonio Rivero Martinez <38889534+Antonio-RiveroMartnez@users.noreply.github.com> Co-authored-by: Antonio Rivero Co-authored-by: Elizabeth Thompson Co-authored-by: Lyndsi Kay Williams <55605634+lyndsiWilliams@users.noreply.github.com> Co-authored-by: JUST.in DO IT Co-authored-by: ʈᵃᵢ Co-authored-by: John Bodley <4567245+john-bodley@users.noreply.github.com> Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com> Co-authored-by: Daniel Draper Co-authored-by: Daniel Draper Co-authored-by: Beto Dealmeida Co-authored-by: Cody Leff Co-authored-by: Lily Kuang Co-authored-by: Sergey Shevchenko Co-authored-by: Evan Rusackas Co-authored-by: Sam Firke Co-authored-by: Jack Fragassi Co-authored-by: Geido <60598000+geido@users.noreply.github.com> Co-authored-by: Stepan <66589759+Always-prog@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com> Co-authored-by: Josh Soref Co-authored-by: Cemre Mengu Co-authored-by: Mayur Co-authored-by: Diego Medina Co-authored-by: Daniel Vaz Gaspar Co-authored-by: cleslie Co-authored-by: Calum Co-authored-by: Igor Șincariov <102555782+igorsinc@users.noreply.github.com> Co-authored-by: Igor Șincariov Co-authored-by: EugeneTorap Co-authored-by: Artem Shumeiko <53895552+artemonsh@users.noreply.github.com> Co-authored-by: 王一川 Co-authored-by: nisheldo Co-authored-by: Leo Schick <67712864+leo-schick@users.noreply.github.com> Co-authored-by: Ville Brofeldt <33317356+villebro@users.noreply.github.com> Co-authored-by: Arash Afghahi <48933336+AAfghahi@users.noreply.github.com> Co-authored-by: Denis Krivenko Co-authored-by: Kamil Gabryjelski Co-authored-by: Erik Ritter Co-authored-by: Phillip Kelley-Dotson Co-authored-by: lyndsiWilliams Co-authored-by: tejaskatariya <42517374+tejaskatariya@users.noreply.github.com> Co-authored-by: Adrian Co-authored-by: alexclavel-ocient <111374753+alexclavel-ocient@users.noreply.github.com> Co-authored-by: Trey Gilliland Co-authored-by: Michael S. Molina Co-authored-by: Rajan Gupta Co-authored-by: DASTC\gupta_rajan Co-authored-by: Dheeraj Jaiswal <118437694+dheeraj-jaiswal-lowes@users.noreply.github.com> Co-authored-by: tison Co-authored-by: Changhoon Oh <81631424+okayhooni@users.noreply.github.com> Co-authored-by: ok9897 Co-authored-by: kuruv Co-authored-by: Zef Lin Co-authored-by: cccs-RyanS <71385290+cccs-RyanS@users.noreply.github.com> Co-authored-by: Reese <10563996+reesercollins@users.noreply.github.com> Co-authored-by: cccs-Dustin <96579982+cccs-Dustin@users.noreply.github.com> Co-authored-by: cccs-rc <62034438+cccs-rc@users.noreply.github.com> Co-authored-by: GITHUB_USERNAME Co-authored-by: cccs-nik <68961854+cccs-nik@users.noreply.github.com> Co-authored-by: cccs-tom <59839056+cccs-tom@users.noreply.github.com> --- .github/CODEOWNERS | 8 +- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 14 - .github/ISSUE_TEMPLATE/sip.md | 8 +- .github/actions/chart-testing-action | 2 +- .github/dependabot.yml | 21 + .github/workflows/bashlib.sh | 11 +- .github/workflows/caches.js | 2 + .github/workflows/chromatic-master.yml | 55 + .github/workflows/docker_build_push.sh | 28 + .github/workflows/license-check.yml | 51 + .../{misc.yml => prefer-typescript.yml} | 45 +- .../workflows/superset-applitool-cypress.yml | 2 +- .github/workflows/superset-cli.yml | 2 +- .github/workflows/superset-e2e.yml | 2 +- .github/workflows/superset-frontend.yml | 5 + .github/workflows/superset-helm-lint.yml | 1 + .github/workflows/superset-helm-release.yml | 7 +- .../superset-python-integrationtest.yml | 6 +- .github/workflows/superset-python-misc.yml | 19 +- .../workflows/superset-python-presto-hive.yml | 4 +- .github/workflows/superset-websocket.yml | 2 +- .github/workflows/welcome-new-users.yml | 13 +- .markdownlint.json | 4 + .pre-commit-config.yaml | 11 +- .pylintrc | 6 +- CHANGELOG.md | 619 + CODE_OF_CONDUCT.md | 2 +- CONTRIBUTING.md | 55 +- Dockerfile | 79 +- Makefile | 16 +- README.md | 89 +- RELEASING/Dockerfile.from_local_tarball | 4 +- RELEASING/Dockerfile.from_svn_tarball | 4 +- RELEASING/README.md | 22 +- RELEASING/release-notes-2-0/README.md | 152 + RELEASING/release-notes-2-0/changelog.md | 491 + RELEASING/test_run_tarball.sh | 2 +- RESOURCES/FEATURE_FLAGS.md | 47 +- RESOURCES/INTHEWILD.md | 22 + UPDATING.md | 45 + cccs-build/superset/Dockerfile | 4 +- cccs-build/superset/requirements.txt | 2 +- docker-compose-non-dev.yml | 10 +- docker-compose.yml | 10 +- docker/.env | 3 +- docker/.env-non-dev | 3 +- docker/README.md | 4 +- docker/docker-bootstrap.sh | 2 +- docker/docker-frontend.sh | 5 +- docker/pythonpath_dev/superset_config.py | 13 +- docs/README.md | 34 +- docs/docs/contributing/contributing-page.mdx | 2 +- docs/docs/contributing/testing-locally.mdx | 14 + docs/docs/contributing/translations.mdx | 6 +- .../contributing/types-of-contributions.mdx | 8 +- .../creating-your-first-dashboard.mdx | 2 +- docs/docs/databases/athena.mdx | 8 + docs/docs/databases/bigquery.mdx | 4 +- docs/docs/databases/clickhouse.mdx | 18 +- docs/docs/databases/databricks.mdx | 5 +- docs/docs/databases/docker-add-drivers.mdx | 2 +- docs/docs/databases/druid.mdx | 6 + docs/docs/databases/dynamodb.mdx | 20 + docs/docs/databases/elasticsearch.mdx | 8 + .../databases/installing-database-drivers.mdx | 15 +- docs/docs/databases/kusto.mdx | 26 + docs/docs/databases/risingwave.mdx | 17 + docs/docs/databases/snowflake.mdx | 30 +- docs/docs/databases/sql-server.mdx | 7 + docs/docs/databases/teradata.mdx | 2 +- docs/docs/databases/timescaledb.mdx | 38 + docs/docs/databases/trino.mdx | 18 +- docs/docs/frequently-asked-questions.mdx | 10 +- docs/docs/installation/alerts-reports.mdx | 444 +- docs/docs/installation/cache.mdx | 79 +- .../installation/configuring-superset.mdx | 4 + docs/docs/installation/event-logging.mdx | 4 +- .../installing-superset-from-scratch.mdx | 2 +- ...stalling-superset-using-docker-compose.mdx | 8 +- .../installation/running-on-kubernetes.mdx | 31 +- docs/docs/installation/sql-templating.mdx | 4 +- docs/docs/intro.mdx | 2 +- docs/docs/miscellaneous/country-map-tools.mdx | 1 + docs/docs/security.mdx | 37 + docs/docusaurus.config.js | 23 +- docs/src/pages/community.tsx | 7 +- docs/src/pages/index.tsx | 22 +- docs/src/resources/data.js | 10 + docs/static/img/applitools.png | Bin 0 -> 3658 bytes docs/static/img/dashboard.jpg | Bin 0 -> 128565 bytes docs/static/img/dashboard3.png | Bin 728491 -> 0 bytes docs/static/img/databases/databricks.png | Bin 0 -> 20293 bytes docs/static/img/databases/timescale.png | Bin 0 -> 16120 bytes docs/static/img/explore.jpg | Bin 0 -> 150805 bytes docs/static/img/explorer5.jpg | Bin 314853 -> 0 bytes docs/static/img/sql_lab.jpg | Bin 0 -> 117310 bytes docs/static/img/sqllab5.jpg | Bin 345510 -> 0 bytes docs/static/resources/openapi.json | 3600 +- docs/static/script/matomo.js | 36 + docs/yarn.lock | 562 +- helm/superset/Chart.lock | 9 + helm/superset/Chart.yaml | 27 +- helm/superset/README.md | 267 + helm/superset/README.md.gotmpl | 44 + helm/superset/templates/_helpers.tpl | 6 - .../templates/configmap-superset.yaml | 1 + helm/superset/templates/deployment-beat.yaml | 71 +- .../superset/templates/deployment-flower.yaml | 157 + .../superset/templates/deployment-worker.yaml | 94 +- helm/superset/templates/deployment-ws.yaml | 153 + helm/superset/templates/deployment.yaml | 78 +- helm/superset/templates/ingress.yaml | 16 +- helm/superset/templates/init-job.yaml | 17 +- helm/superset/templates/secret-env.yaml | 1 + .../templates/secret-superset-config.yaml | 1 + helm/superset/templates/secret-ws.yaml | 32 + helm/superset/templates/service-account.yaml | 4 + helm/superset/templates/service.yaml | 70 + helm/superset/values.schema.json | 607 - helm/superset/values.yaml | 514 +- lintconf.yaml | 8 +- requirements/base.txt | 95 +- requirements/development.txt | 12 +- requirements/docker.txt | 4 +- requirements/integration.txt | 42 +- requirements/testing.txt | 69 +- scripts/babel_update.sh | 2 +- scripts/cancel_github_workflows.py | 2 +- scripts/generate_frontend_ts_tasklist.js | 4 +- scripts/permissions_cleanup.py | 12 +- scripts/python_tests.sh | 2 +- scripts/tests/run.sh | 2 +- setup.cfg | 8 +- setup.py | 85 +- superset-embedded-sdk/README.md | 7 +- superset-embedded-sdk/package-lock.json | 221 +- superset-embedded-sdk/package.json | 5 +- superset-embedded-sdk/src/const.ts | 4 + .../src/guestTokenRefresh.ts | 3 +- superset-embedded-sdk/src/index.ts | 39 +- superset-frontend/.eslintrc.js | 2 + superset-frontend/.storybook/main.js | 5 +- superset-frontend/.storybook/preview.jsx | 26 +- superset-frontend/babel.config.js | 15 +- .../cypress-base/applitools.config.js | 3 +- superset-frontend/cypress-base/cypress.json | 2 +- .../cypress-base/cypress/fixtures/charts.json | 42 + .../cypress/fixtures/dashboards.json | 46 + .../cypress/fixtures/example.json | 5 - .../alerts_and_reports/alerts.test.ts | 37 +- .../alerts_and_reports/reports.test.ts | 37 +- .../integration/chart_list/card_view.test.ts | 129 - .../chart_list/chartlist.applitools.test.ts | 7 +- .../integration/chart_list/filter.test.ts | 123 +- .../integration/chart_list/list.test.ts | 294 + .../integration/chart_list/list_view.test.ts | 73 - ...ontrols.test.ts => _skip.controls.test.ts} | 13 +- .../{filter.test.ts => _skip.filter.test.ts} | 14 +- ..._value.test.ts => _skip.key_value.test.ts} | 13 +- ...arams.test.ts => _skip.url_params.test.ts} | 15 +- .../integration/dashboard/actions.test.js | 44 + .../dashboard/dashboard.applitools.test.ts | 9 +- .../integration/dashboard/dashboard.helper.ts | 209 - .../dashboard/drilltodetail.test.ts | 612 + .../integration/dashboard/edit_mode.test.js | 97 - .../dashboard/edit_properties.test.ts | 204 - .../integration/dashboard/editmode.test.ts | 803 + .../integration/dashboard/fav_star.test.js | 63 - .../integration/dashboard/load.test.ts | 19 +- .../integration/dashboard/markdown.test.ts | 72 - .../dashboard/nativeFilters.test.ts | 1426 +- .../integration/dashboard/save.test.js | 160 - .../integration/dashboard/tabs.test.ts | 113 +- .../{nativeFilter.helper.ts => utils.ts} | 247 +- .../dashboard_list/card_view.test.ts | 124 - .../dashboardlist.applitools.test.ts | 7 +- .../integration/dashboard_list/filter.test.ts | 86 +- .../integration/dashboard_list/list.test.ts | 244 + .../dashboard_list/list_view.test.ts | 61 - .../integration/database/modal.test.ts | 26 +- .../integration/dataset/dataset_list.test.ts | 42 + .../integration/explore/AdhocMetrics.test.ts | 1 - ...ers.test.ts => _skip.AdhocFilters.test.ts} | 13 +- .../explore/advanced_analytics.test.ts | 12 +- .../integration/explore/annotations.test.ts | 1 - .../cypress/integration/explore/chart.test.js | 107 +- .../integration/explore/control.test.ts | 108 +- .../explore/explore.applitools.test.ts | 3 +- .../integration/explore/filter_box.test.js | 3 +- .../cypress/integration/explore/link.test.ts | 6 +- .../cypress/integration/explore/utils.ts | 91 + .../explore/visualizations/area.test.js | 59 +- .../explore/visualizations/big_number.test.js | 15 +- .../visualizations/big_number_total.test.js | 9 +- .../explore/visualizations/box_plot.test.js | 24 +- .../explore/visualizations/bubble.test.js | 55 +- .../explore/visualizations/compare.test.js | 27 +- .../explore/visualizations/dist_bar.test.js | 40 +- .../visualizations/download_chart.test.js | 5 +- .../explore/visualizations/dual_line.test.js | 29 +- .../explore/visualizations/gauge.test.js | 29 +- .../explore/visualizations/graph.test.ts | 24 +- .../explore/visualizations/histogram.test.ts | 28 +- .../explore/visualizations/line.test.ts | 61 +- .../explore/visualizations/pie.test.js | 24 +- .../visualizations/pivot_table.test.js | 13 +- .../explore/visualizations/sankey.test.js | 28 +- .../explore/visualizations/shared.helper.js | 4 +- .../explore/visualizations/sunburst.test.js | 24 +- .../explore/visualizations/table.test.ts | 17 +- .../explore/visualizations/time_table.js | 15 +- .../explore/visualizations/treemap.test.js | 25 +- .../explore/visualizations/world_map.test.js | 23 +- ...est.js => _skip.sourcePanel.index.test.js} | 5 +- .../cypress/integration/sqllab/query.test.ts | 63 +- .../sqllab/sqllab.applitools.test.ts | 1 - .../cypress/integration/sqllab/tabs.test.ts | 67 +- .../cypress/support/directories.ts | 19 +- .../cypress-base/cypress/support/index.d.ts | 32 +- .../cypress-base/cypress/support/index.ts | 297 +- .../cypress-base/cypress/utils/index.ts | 106 + .../cypress-base/cypress/utils/urls.ts | 30 + .../cypress-base/package-lock.json | 77 +- superset-frontend/cypress-base/package.json | 1 + superset-frontend/jest.config.js | 2 +- superset-frontend/package-lock.json | 37898 ++++++++-------- superset-frontend/package.json | 109 +- .../plugin-chart/templates/src/MyChart.erb | 2 +- .../templates/src/plugin/controlPanel.erb | 4 +- .../packages/generator-superset/package.json | 38 +- .../superset-ui-chart-controls/package.json | 4 +- .../src/components/labelUtils.tsx | 12 +- .../src/constants.ts | 1 - .../src/fixtures.ts | 149 + .../superset-ui-chart-controls/src/index.ts | 12 +- .../src/operators/pivotOperator.ts | 16 +- .../src/operators/prophetOperator.ts | 12 +- .../src/operators/renameOperator.ts | 26 +- .../src/operators/sortOperator.ts | 42 +- .../src/operators/timeCompareOperator.ts | 4 +- .../src/operators/timeComparePivotOperator.ts | 15 +- .../src/operators/utils/isDerivedSeries.ts | 4 +- .../src/operators/utils/isTimeComparison.ts | 4 +- .../src/sections/advancedAnalytics.tsx | 67 +- .../src/sections/chartTitle.tsx | 9 +- .../src/sections/echartsTimeSeriesQuery.tsx | 60 + .../src/sections/forecastInterval.tsx | 24 +- .../src/sections/index.ts | 1 + .../src/sections/sections.tsx | 24 +- .../ColumnConfigControl.tsx | 17 - .../ColumnConfigControl/constants.tsx | 28 +- .../src/shared-controls/customControls.tsx | 122 + .../src/shared-controls/dndControls.tsx | 195 +- .../src/shared-controls/index.ts | 25 + .../src/shared-controls/index.tsx | 603 - .../src/shared-controls/mixins.tsx | 121 + .../src/shared-controls/sharedControls.tsx | 409 + .../superset-ui-chart-controls/src/types.ts | 90 +- .../src/utils/D3Formatting.ts | 7 + .../src/utils/expandControlConfig.tsx | 5 +- .../src/utils/getStandardizedControls.ts | 68 + .../src/utils/getTemporalColumns.ts | 77 + .../src/utils/index.ts | 2 + .../test/operators/pivotOperator.test.ts | 61 +- .../test/operators/prophetOperator.test.ts | 3 +- .../test/operators/renameOperator.test.ts | 35 +- .../operators/rollingWindowOperator.test.ts | 4 +- .../test/operators/sortOperator.test.ts | 121 +- .../operators/timeCompareOperator.test.ts | 6 +- .../timeComparePivotOperator.test.ts | 50 +- .../operators/utils/isDerivedSeries.test.ts | 18 +- .../test/types.test.ts | 9 - .../test/utils/columnChoices.test.tsx | 4 +- .../utils/getStandardizedControls.test.ts | 82 + .../test/utils/getTemporalColumns.test.ts | 104 + .../packages/superset-ui-core/package.json | 1 + .../superset-ui-core/src/api/types/core.ts | 31 + .../chart/components/FallbackComponent.tsx | 5 +- .../src/chart/components/SuperChart.tsx | 14 +- .../src/chart/components/SuperChartCore.tsx | 3 +- .../src/chart/models/ChartMetadata.ts | 5 + .../src/chart/models/ChartProps.ts | 25 + .../superset-ui-core/src/chart/types/Base.ts | 13 + .../src/color/CategoricalColorScale.ts | 25 +- .../src/color/ColorSchemeRegistry.ts | 13 +- .../src/color/SharedLabelColorSingleton.ts | 148 +- .../superset-ui-core/src/color/index.ts | 1 + .../src/connection/SupersetClient.ts | 1 + .../src/connection/SupersetClientClass.ts | 4 + .../src/connection/callApi/callApi.ts | 23 +- .../src/connection/callApi/parseResponse.ts | 19 +- .../superset-ui-core/src/connection/types.ts | 9 +- .../src/math-expression/index.ts | 2 +- .../superset-ui-core/src/models/Registry.ts | 2 +- .../src/number-format/NumberFormats.ts | 2 + .../src/query/DatasourceKey.ts | 4 +- .../src/query/buildQueryContext.ts | 10 +- .../src/query/buildQueryObject.ts | 29 +- .../superset-ui-core/src/query/constants.ts | 19 +- .../src/query/extractExtras.ts | 32 +- .../src/query/extractTimegrain.ts | 2 +- .../src/query/getColumnLabel.ts | 4 +- .../src/query/getMetricLabel.ts | 2 +- .../superset-ui-core/src/query/getXAxis.ts | 57 + .../superset-ui-core/src/query/index.ts | 3 + .../src/query/normalizeOrderBy.ts | 12 +- .../src/query/normalizeTimeColumn.ts | 84 + .../src/query/processFilters.ts | 4 - .../src/query/types/AdvancedAnalytics.ts | 4 +- .../src/query/types/AnnotationLayer.ts | 3 +- .../src/query/types/Column.ts | 34 +- .../src/query/types/Dashboard.ts | 17 +- .../src/query/types/Datasource.ts | 3 +- .../src/query/types/Filter.ts | 6 + .../src/query/types/Metric.ts | 26 +- .../src/query/types/Operator.ts | 1 + .../src/query/types/PostProcessing.ts | 14 +- .../superset-ui-core/src/query/types/Query.ts | 154 +- .../src/query/types/QueryFormData.ts | 34 +- .../src/query/types/QueryResponse.ts | 1 + .../superset-ui-core/src/query/types/Time.ts | 1 - .../superset-ui-core/src/style/index.tsx | 2 + .../superset-ui-core/src/translation/index.ts | 2 +- .../superset-ui-core/src/types/index.ts | 4 + .../src/ui-overrides/ExtensionsRegistry.ts | 97 + .../src/ui-overrides/UiOverrideRegistry.ts | 46 - .../src/ui-overrides/index.tsx | 2 +- .../src/utils/featureFlags.ts | 70 +- .../superset-ui-core/src/utils/index.ts | 1 + .../superset-ui-core/src/utils/isDefined.ts | 2 +- .../superset-ui-core/src/utils/lruCache.ts | 74 + .../__mocks__/resize-observer-polyfill.ts | 5 + .../test/chart/fixtures/formData.ts | 3 +- .../test/color/CategoricalColorScale.test.ts | 2 +- .../test/color/ColorSchemeRegistry.test.ts | 16 + .../color/SharedLabelColorSingleton.test.ts | 121 +- .../test/connection/SupersetClient.test.ts | 10 +- .../connection/SupersetClientClass.test.ts | 3 +- .../test/connection/callApi/callApi.test.ts | 44 + .../connection/callApi/parseResponse.test.ts | 32 + .../test/models/Registry.test.ts | 2 +- .../factories/createD3NumberFormatter.test.ts | 2 +- .../test/query/DatasourceKey.test.ts | 15 +- .../test/query/buildQueryContext.test.ts | 53 +- .../test/query/buildQueryObject.test.ts | 43 +- .../test/query/extractExtras.test.ts | 3 +- .../test/query/getAxis.test.ts | 26 + .../test/query/normalizeOrderBy.test.ts | 8 +- .../test/query/normalizeTimeColumn.test.ts | 291 + .../test/query/processFilters.test.ts | 38 +- .../test/query/types/Column.test.ts | 63 + .../test/query/types/Dashboard.test.ts | 65 +- .../test/query/types/Datasource.test.ts} | 32 +- .../test/query/types/Filter.test.ts | 23 + .../test/query/types/Metric.test.ts | 88 + .../test/query/types/PostProcessing.test.ts | 8 +- ...try.test.ts => ExtensionsRegistry.test.ts} | 6 +- .../test/utils/featureFlag.test.ts | 43 +- .../test/utils/lruCache.test.ts | 60 + .../superset-ui-core/types/external.d.ts | 2 +- .../packages/superset-ui-demo/package.json | 2 +- .../shared/components/VerifyCORS.tsx | 3 +- .../Area/stories/controlsShown.tsx | 2 +- .../Area/stories/expanded.tsx | 2 +- .../Area/stories/stackedWithBounds.tsx | 4 +- .../AreaTimeseries/Stories.tsx | 88 + .../AreaTimeseries/data.ts | 771 + .../plugin-chart-echarts/Sunburst/Stories.tsx | 57 + .../plugin-chart-echarts/Sunburst/data.ts | 32 + .../Timeseries/Stories.tsx | 74 +- .../Timeseries/confbandData.ts | 329 + .../Timeseries/stackWithNulls.ts | 36 + .../PivotTableStories.tsx | 74 + .../plugin-chart-pivot-table/testData.ts | 126 + .../plugin-chart-table/birthNames.json | 1 - .../superset-ui-chart/SuperChartStories.tsx | 2 +- .../superset-ui-switchboard/package.json | 2 +- .../superset-ui-switchboard/src/index.ts | 3 + .../src/switchboard.test.ts | 31 +- .../src/switchboard.ts | 38 +- .../src/Calendar.js | 6 +- .../src/controlPanel.ts | 34 +- .../src/images/example.jpg | Bin 0 -> 36394 bytes .../legacy-plugin-chart-calendar/src/index.js | 2 + .../src/vendor/cal-heatmap.js | 8 +- .../src/controlPanel.ts | 18 +- .../Country Map GeoJSON Generator.ipynb | 715 +- .../src/controlPanel.ts | 6 + .../src/countries.ts | 44 + .../src/countries/argentina.geojson | 30 + .../src/countries/bolivia.geojson | 15 + .../src/countries/chile.geojson | 22 + .../src/countries/colombia.geojson | 40 + .../src/countries/costa rica.geojson | 13 + .../src/countries/cuba.geojson | 22 + .../src/countries/dominican republic.geojson | 38 + .../src/countries/ecuador.geojson | 30 + .../src/countries/el salvador.geojson | 20 + .../src/countries/guatemala.geojson | 28 + .../src/countries/haiti.geojson | 16 + .../src/countries/honduras.geojson | 24 + .../src/countries/latvia.geojson | 125 + .../src/countries/nicaragua.geojson | 23 + .../src/countries/panama.geojson | 18 + .../src/countries/papua new guinea.geojson | 28 + .../src/countries/paraguay.geojson | 24 + .../src/countries/puerto rico.geojson | 7 + .../src/countries/saint barthelemy.geojson | 7 + .../src/countries/saint martin.geojson | 7 + .../src/countries/turkey.geojson | 87 + .../src/countries/venezuela.geojson | 32 + .../src/images/exampleGermany.jpg | Bin 0 -> 31211 bytes .../src/images/exampleUsa.jpg | Bin 0 -> 85089 bytes .../src/index.js | 5 +- .../src/images/example.jpg | Bin 0 -> 85099 bytes .../src/index.ts | 2 + .../src/types/external.d.ts | 1 + .../src/Heatmap.js | 2 +- .../src/{controlPanel.ts => controlPanel.tsx} | 82 +- .../src/Histogram.jsx | 2 +- .../src/controlPanel.ts | 34 +- .../src/controlPanel.ts | 6 +- .../legacy-plugin-chart-map-box/package.json | 38 +- .../src/controlPanel.ts | 59 +- .../src/ReactParallelCoordinates.jsx | 6 +- .../src/images/example1.jpg | Bin 0 -> 62434 bytes .../src/images/example2.jpg | Bin 0 -> 106374 bytes .../src/index.js | 3 + .../src/controlPanel.tsx | 92 +- .../src/images/example.jpg | Bin 0 -> 44054 bytes .../src/index.js | 2 + .../src/controlPanel.ts | 17 +- .../src/images/example.jpg | Bin 0 -> 59676 bytes .../src/index.js | 4 +- .../src/controlPanel.tsx | 85 +- .../src/images/example1.jpg | Bin 0 -> 116296 bytes .../src/images/example2.jpg | Bin 0 -> 50161 bytes .../legacy-plugin-chart-rose/src/index.js | 3 + .../src/SankeyLoop.js | 4 +- .../src/controlPanel.ts | 11 +- .../src/Sunburst.js | 8 +- .../src/controlPanel.ts | 7 + .../legacy-plugin-chart-treemap/src/index.js | 2 +- .../src/WorldMap.js | 47 +- .../src/controlPanel.ts | 14 +- .../src/index.js | 3 +- .../src/transformProps.js | 10 +- .../legacy-preset-chart-deckgl/package.json | 12 +- .../src/components/PlaySlider.jsx | 4 +- .../src/layers/Arc/Arc.jsx | 4 +- .../src/layers/Grid/Grid.jsx | 20 +- .../src/layers/Grid/controlPanel.ts | 16 +- .../src/layers/Hex/Hex.jsx | 19 +- .../src/layers/Hex/controlPanel.ts | 41 +- .../src/layers/Path/controlPanel.ts | 4 +- .../src/layers/Polygon/Polygon.jsx | 11 +- .../src/layers/Polygon/controlPanel.ts | 10 +- .../src/layers/Scatter/Scatter.jsx | 6 +- .../src/layers/Scatter/controlPanel.ts | 14 +- .../src/layers/Screengrid/Screengrid.jsx | 9 +- .../src/layers/Screengrid/controlPanel.ts | 10 +- .../src/utilities/Shared_DeckGL.jsx | 42 +- .../src/utilities/sharedDndControls.jsx | 6 +- .../src/utils/explore.js | 2 +- .../src/utils/fitViewport.ts | 2 +- .../src/utils/time.js | 8 +- .../src/Area/controlPanel.ts | 6 +- .../src/Area/index.js | 2 +- .../src/Bar/controlPanel.ts | 9 +- .../legacy-preset-chart-nvd3/src/Bar/index.js | 2 +- .../src/Bubble/controlPanel.ts | 9 + .../src/Bubble/images/example.jpg | Bin 0 -> 61529 bytes .../src/Bubble/index.js | 2 + .../src/Bullet/images/example.jpg | Bin 0 -> 23045 bytes .../src/Bullet/index.js | 2 + .../src/Compare/controlPanel.ts | 11 +- .../src/Compare/images/example.jpg | Bin 0 -> 66360 bytes .../src/Compare/index.js | 2 + .../src/DistBar/controlPanel.ts | 15 +- .../src/DistBar/index.js | 9 +- .../src/DualLine/images/example.jpg | Bin 0 -> 121614 bytes .../src/DualLine/index.js | 2 + .../src/Line/controlPanel.ts | 12 +- .../src/Line/index.js | 2 +- .../src/LineMulti/images/example.jpg | Bin 0 -> 223147 bytes .../src/LineMulti/index.js | 2 + .../src/NVD3Controls.tsx | 123 +- .../src/Pie/controlPanel.ts | 22 +- .../src/TimePivot/controlPanel.ts | 17 +- .../src/vendor/superset/AnnotationTypes.js | 10 +- .../src/vendor/superset/exploreUtils.js | 2 +- .../plugins/plugin-chart-echarts/package.json | 2 +- .../BigNumber/BigNumberTotal/controlPanel.ts | 11 +- .../src/BigNumber/BigNumberTotal/index.ts | 3 +- .../BigNumberTotal/transformProps.ts | 17 +- .../src/BigNumber/BigNumberViz.tsx | 100 +- .../BigNumberWithTrendline/buildQuery.ts | 42 +- .../BigNumberWithTrendline/controlPanel.tsx | 72 +- .../BigNumber/BigNumberWithTrendline/index.ts | 3 +- .../BigNumberWithTrendline/transformProps.ts | 47 +- .../src/BigNumber/types.ts | 60 +- .../src/BoxPlot/EchartsBoxPlot.tsx | 39 +- .../src/BoxPlot/buildQuery.ts | 54 +- .../src/BoxPlot/controlPanel.ts | 114 +- .../plugin-chart-echarts/src/BoxPlot/index.ts | 2 +- .../src/BoxPlot/transformProps.ts | 57 +- .../plugin-chart-echarts/src/BoxPlot/types.ts | 39 +- .../src/Funnel/EchartsFunnel.tsx | 39 +- .../src/Funnel/controlPanel.tsx | 31 +- .../src/Funnel/images/example.jpg | Bin 0 -> 43090 bytes .../plugin-chart-echarts/src/Funnel/index.ts | 4 +- .../src/Funnel/transformProps.ts | 57 +- .../plugin-chart-echarts/src/Funnel/types.ts | 40 +- .../src/Gauge/EchartsGauge.tsx | 39 +- .../src/Gauge/buildQuery.ts | 1 - .../src/Gauge/controlPanel.tsx | 13 +- .../src/Gauge/images/example1.jpg | Bin 0 -> 56912 bytes .../src/Gauge/images/example2.jpg | Bin 0 -> 37092 bytes .../plugin-chart-echarts/src/Gauge/index.ts | 5 +- .../src/Gauge/transformProps.ts | 31 +- .../plugin-chart-echarts/src/Gauge/types.ts | 22 +- .../src/Graph/EchartsGraph.tsx | 56 +- .../src/Graph/controlPanel.tsx | 9 +- .../src/Graph/images/example.jpg | Bin 0 -> 57705 bytes .../plugin-chart-echarts/src/Graph/index.ts | 5 +- .../src/Graph/transformProps.ts | 27 +- .../plugin-chart-echarts/src/Graph/types.ts | 17 +- .../EchartsMixedTimeseries.tsx | 67 +- .../src/MixedTimeseries/buildQuery.ts | 28 +- .../src/MixedTimeseries/controlPanel.tsx | 61 +- .../src/MixedTimeseries/images/example.jpg | Bin 0 -> 65380 bytes .../src/MixedTimeseries/index.ts | 14 +- .../src/MixedTimeseries/transformProps.ts | 189 +- .../src/MixedTimeseries/types.ts | 66 +- .../src/Pie/EchartsPie.tsx | 39 +- .../src/Pie/controlPanel.tsx | 31 +- .../plugin-chart-echarts/src/Pie/index.ts | 2 +- .../src/Pie/transformProps.ts | 59 +- .../plugin-chart-echarts/src/Pie/types.ts | 41 +- .../src/Radar/EchartsRadar.tsx | 39 +- .../src/Radar/buildQuery.ts | 8 +- .../src/Radar/controlPanel.tsx | 20 +- .../src/Radar/images/example1.jpg | Bin 0 -> 68385 bytes .../src/Radar/images/example2.jpg | Bin 0 -> 66606 bytes .../plugin-chart-echarts/src/Radar/index.ts | 7 +- .../src/Radar/transformProps.ts | 34 +- .../plugin-chart-echarts/src/Radar/types.ts | 35 +- .../src/Sunburst/EchartsSunburst.tsx | 127 + .../src/Sunburst/buildQuery.ts | 29 + .../src/Sunburst/controlPanel.tsx | 205 + .../src/Sunburst/images/Sunburst1.png | Bin 0 -> 130270 bytes .../src/Sunburst/images/Sunburst2.png | Bin 0 -> 126313 bytes .../src/Sunburst/images/thumbnail.png | Bin 0 -> 130270 bytes .../src/Sunburst/index.ts | 53 + .../src/Sunburst/transformProps.ts | 381 + .../src/Sunburst/types.ts | 71 + .../src/Timeseries/Area/controlPanel.tsx | 68 +- .../src/Timeseries/Area/index.ts | 11 +- .../src/Timeseries/EchartsTimeseries.tsx | 73 +- .../Timeseries/Regular/Bar/controlPanel.tsx | 95 +- .../src/Timeseries/Regular/Bar/index.ts | 19 +- .../{ => Regular/Line}/controlPanel.tsx | 73 +- .../src/Timeseries/Regular/Line/index.ts | 17 +- .../Regular/Scatter/controlPanel.tsx | 39 +- .../src/Timeseries/Regular/Scatter/index.ts | 17 +- .../Regular/{ => SmoothLine}/controlPanel.tsx | 58 +- .../Timeseries/Regular/SmoothLine/index.ts | 17 +- .../src/Timeseries/Step/controlPanel.tsx | 64 +- .../src/Timeseries/Step/index.ts | 17 +- .../src/Timeseries/buildQuery.ts | 28 +- .../src/Timeseries/constants.ts | 70 + .../src/Timeseries/index.ts | 17 +- .../src/Timeseries/transformProps.ts | 86 +- .../src/Timeseries/transformers.ts | 9 +- .../src/Timeseries/types.ts | 82 +- .../src/Tree/EchartsTree.tsx | 12 +- .../src/Tree/constants.ts | 16 + .../src/Tree/controlPanel.tsx | 13 +- .../src/Tree/transformProps.ts | 20 +- .../plugin-chart-echarts/src/Tree/types.ts | 34 +- .../src/Treemap/EchartsTreemap.tsx | 43 +- .../src/Treemap/constants.ts | 2 +- .../src/Treemap/controlPanel.tsx | 24 +- .../plugin-chart-echarts/src/Treemap/index.ts | 8 +- .../src/Treemap/transformProps.ts | 176 +- .../plugin-chart-echarts/src/Treemap/types.ts | 34 +- .../src/components/Echart.tsx | 28 +- .../plugin-chart-echarts/src/constants.ts | 34 +- .../plugin-chart-echarts/src/controls.tsx | 58 +- .../plugin-chart-echarts/src/defaults.ts | 8 +- .../plugins/plugin-chart-echarts/src/index.ts | 4 +- .../plugins/plugin-chart-echarts/src/types.ts | 74 +- .../src/utils/annotation.ts | 20 +- .../src/utils/eventHandlers.ts | 82 + .../plugin-chart-echarts/src/utils/series.ts | 34 +- .../plugin-chart-echarts/src/utils/tooltip.ts | 79 + .../src/utils/treeBuilder.ts | 88 + .../test/BigNumber/transformProps.test.ts | 15 +- .../test/BoxPlot/buildQuery.test.ts | 3 +- .../test/Gauge/buildQuery.test.ts | 6 +- .../test/Graph/transformProps.test.ts | 49 +- .../test/MixedTimeseries/buildQuery.test.ts | 204 +- .../test/Timeseries/buildQuery.test.ts | 183 +- .../test/Tree/transformProps.test.ts | 11 +- .../test/utils/annotation.test.ts | 31 +- .../test/utils/series.test.ts | 13 + .../test/utils/treeBuilder.test.ts | 274 + .../plugin-chart-handlebars/package.json | 9 +- .../Handlebars/HandlebarsViewer.tsx | 7 +- .../plugin-chart-handlebars/src/consts.ts | 5 +- .../plugin-chart-handlebars/src/i18n.ts | 65 - .../src/images/example1.jpg | Bin 0 -> 97899 bytes .../src/images/example2.jpg | Bin 0 -> 294384 bytes .../src/plugin/buildQuery.ts | 3 - .../src/plugin/controlPanel.tsx | 15 +- .../src/plugin/controls/columns.tsx | 4 +- .../src/plugin/controls/metrics.tsx | 2 +- .../src/plugin/index.ts | 5 +- .../plugin-chart-handlebars/src/types.ts | 1 - .../test/plugin/buildQuery.test.ts | 2 +- .../test/plugin/transformProps.test.ts | 4 +- .../types/external.d.ts | 2 + .../plugin-chart-pivot-table/package.json | 3 +- .../src/PivotTableChart.tsx | 65 +- .../src/images/example.jpg | Bin 0 -> 66959 bytes .../src/plugin/buildQuery.ts | 38 +- .../src/plugin/controlPanel.tsx | 98 +- .../src/plugin/index.ts | 6 +- .../src/plugin/transformProps.ts | 9 +- .../src/react-pivottable/PivotTable.jsx | 5 +- .../src/react-pivottable/Styles.js | 8 +- .../src/react-pivottable/TableRenderers.jsx | 28 +- .../src/react-pivottable/utilities.js | 12 +- .../plugin-chart-pivot-table/src/types.ts | 10 +- .../test/plugin/transformProps.test.ts | 3 +- .../types/external.d.ts | 2 + .../plugins/plugin-chart-table/package.json | 9 +- .../src/DataTable/DataTable.tsx | 19 +- .../DataTable/components/SelectPageSize.tsx | 5 +- .../src/DataTable/hooks/useSticky.tsx | 25 +- .../plugins/plugin-chart-table/src/Styles.tsx | 11 + .../plugin-chart-table/src/TableChart.tsx | 252 +- .../plugin-chart-table/src/buildQuery.ts | 28 +- .../plugin-chart-table/src/controlPanel.tsx | 105 +- .../plugins/plugin-chart-table/src/index.ts | 2 +- .../plugin-chart-table/src/transformProps.ts | 11 +- .../plugins/plugin-chart-table/src/types.ts | 9 +- .../test/TableChart.test.tsx | 75 +- .../plugin-chart-word-cloud/package.json | 1 + .../src/chart/WordCloud.tsx | 5 +- .../src/plugin/controlPanel.ts | 17 +- .../src/BoxPlot/controlPanel.ts | 30 +- .../utils/convertScaleToDataUIScaleShape.ts | 2 +- .../spec/fixtures/mockChartQueries.js | 24 +- superset-frontend/spec/fixtures/mockCharts.ts | 55 + .../spec/fixtures/mockDashboardInfo.js | 3 + .../spec/fixtures/mockDashboardState.js | 86 + .../spec/fixtures/mockDatasource.js | 1 - .../spec/fixtures/mockNativeFilters.ts | 1 + .../spec/fixtures/mockSliceEntities.js | 22 +- superset-frontend/spec/fixtures/mockStore.js | 99 +- .../spec/helpers/reducerIndex.ts | 15 +- superset-frontend/spec/helpers/setup.ts | 4 +- superset-frontend/spec/helpers/shim.tsx | 31 + .../spec/helpers/testing-library.tsx | 33 +- superset-frontend/src/GlobalStyles.tsx | 33 + superset-frontend/src/SqlLab/App.jsx | 36 +- .../src/SqlLab/SqlLabGlobalStyles.tsx | 36 + .../src/SqlLab/actions/sqlLab.js | 312 +- .../src/SqlLab/actions/sqlLab.test.js | 330 +- .../AceEditorWrapper.test.tsx | 98 + .../components/AceEditorWrapper/index.tsx | 261 +- .../src/SqlLab/components/App/App.test.jsx | 49 +- .../src/SqlLab/components/App/index.jsx | 95 +- .../SqlLab/components/ColumnElement/index.tsx | 8 +- .../EstimateQueryCostButton.test.tsx | 93 + .../EstimateQueryCostButton/index.tsx | 49 +- .../ExploreCtasResultsButton/index.tsx | 33 +- .../components/ExploreResultsButton/index.tsx | 3 +- .../QueryAutoRefresh.test.jsx | 68 - .../QueryAutoRefresh.test.tsx | 133 + .../components/QueryAutoRefresh/index.jsx | 124 - .../components/QueryAutoRefresh/index.tsx | 110 + .../QueryHistory/QueryHistory.test.tsx | 8 - .../SqlLab/components/QueryHistory/index.tsx | 9 - .../QueryLimitSelect.test.tsx | 144 + .../components/QueryLimitSelect/index.tsx | 112 + .../QuerySearch/QuerySearch.test.jsx | 140 - .../SqlLab/components/QuerySearch/index.tsx | 292 - .../QueryStateLabel/QueryStateLabel.test.jsx | 5 +- .../components/QueryStateLabel/index.tsx | 14 +- .../components/QueryTable/QueryTable.test.jsx | 2 - .../SqlLab/components/QueryTable/index.tsx | 67 +- .../components/ResultSet/ResultSet.test.jsx | 219 - .../components/ResultSet/ResultSet.test.tsx | 271 + .../src/SqlLab/components/ResultSet/index.tsx | 628 +- .../RunQueryActionButton.test.jsx | 53 - .../RunQueryActionButton.test.tsx | 160 + .../components/RunQueryActionButton/index.tsx | 35 +- .../SaveDatasetActionButton.test.tsx | 68 + .../SaveDatasetActionButton/index.tsx | 85 + .../SaveDatasetModal.test.tsx | 116 +- .../components/SaveDatasetModal/index.tsx | 296 +- .../components/SaveQuery/SaveQuery.test.jsx | 88 - .../components/SaveQuery/SaveQuery.test.tsx | 225 + .../src/SqlLab/components/SaveQuery/index.tsx | 154 +- .../components/ScheduleQueryButton/index.tsx | 24 +- ...ery.test.jsx => ShareSqlLabQuery.test.tsx} | 92 +- .../components/ShareSqlLabQuery/index.tsx | 35 +- .../components/SouthPane/SouthPane.test.jsx | 181 +- .../src/SqlLab/components/SouthPane/index.tsx | 87 +- .../components/SqlEditor/SqlEditor.test.jsx | 213 +- .../src/SqlLab/components/SqlEditor/index.jsx | 1051 +- .../SqlEditorLeftBar.test.jsx | 211 +- .../components/SqlEditorLeftBar/index.tsx | 188 +- .../SqlEditorTabHeader.test.tsx | 220 + .../components/SqlEditorTabHeader/index.tsx | 153 + ...usIcon.test.jsx => TabStatusIcon.test.tsx} | 18 +- .../SqlLab/components/TabStatusIcon/index.tsx | 54 +- .../TabbedSqlEditors.test.jsx | 105 +- .../components/TabbedSqlEditors/index.jsx | 215 +- .../TableElement/TableElement.test.jsx | 27 +- .../SqlLab/components/TableElement/index.tsx | 63 +- .../TemplateParamsEditor.test.tsx | 93 +- .../components/TemplateParamsEditor/index.tsx | 36 +- superset-frontend/src/SqlLab/constants.ts | 27 + superset-frontend/src/SqlLab/fixtures.ts | 195 +- .../src/SqlLab/hooks/useQueryEditor/index.ts | 38 + .../useQueryEditor/useQueryEditor.test.ts | 92 + superset-frontend/src/SqlLab/main.less | 493 - .../src/SqlLab/reducers/getInitialState.js | 44 +- .../src/SqlLab/reducers/sqlLab.js | 454 +- .../src/SqlLab/reducers/sqlLab.test.js | 117 +- superset-frontend/src/SqlLab/types.ts | 57 +- .../src/SqlLab/utils/newQueryTabName.test.ts | 6 +- .../src/SqlLab/utils/newQueryTabName.ts | 4 +- .../utils/reduxStateToLocalStorageHelper.js | 2 +- .../src/SqlLab/utils/useInterval.ts | 47 + .../src/addSlice/AddSliceContainer.test.tsx | 87 - superset-frontend/src/addSlice/App.tsx | 49 - .../src/assets/images/apache-kylin.png | Bin 13694 -> 9780 bytes .../src/assets/images/clickhouse.png | Bin 7651 -> 9841 bytes .../src/assets/images/databricks.png | Bin 0 -> 11073 bytes superset-frontend/src/assets/images/db2.png | Bin 9010 -> 7493 bytes superset-frontend/src/assets/images/druid.png | Bin 12839 -> 11845 bytes .../src/assets/images/empty-dataset.svg | 38 + .../src/assets/images/empty-table.svg | 22 + .../src/assets/images/exasol.png | Bin 8582 -> 8965 bytes .../src/assets/images/firebird.png | Bin 10895 -> 7953 bytes .../src/assets/images/firebolt.png | Bin 27249 -> 9061 bytes .../src/assets/images/google-biquery.png | Bin 16418 -> 15539 bytes .../src/assets/images/greenplum.png | Bin 17811 -> 18956 bytes .../src/assets/images/hologres.png | Bin 23843 -> 4529 bytes .../src/assets/images/mariadb.png | Bin 16770 -> 9663 bytes .../src/assets/images/monet-db.png | Bin 21830 -> 14327 bytes .../src/assets/images/mssql-server.png | Bin 21970 -> 10710 bytes superset-frontend/src/assets/images/mysql.png | Bin 14453 -> 9362 bytes .../src/assets/images/netezza.png | Bin 54596 -> 8460 bytes .../src/assets/images/no-columns.svg | 22 + .../src/assets/images/oracle.png | Bin 8231 -> 8577 bytes superset-frontend/src/assets/images/pinot.png | Bin 68618 -> 7127 bytes .../src/assets/images/postgresql.png | Bin 18364 -> 16942 bytes .../src/assets/images/presto.png | Bin 18505 -> 10865 bytes .../src/assets/images/redshift.png | Bin 9168 -> 10885 bytes .../src/assets/images/rockset.png | Bin 23189 -> 8570 bytes .../src/assets/images/snowflake.png | Bin 21654 -> 15635 bytes .../src/assets/images/sqlite.png | Bin 11330 -> 10972 bytes .../src/assets/images/sybase.png | Bin 11992 -> 18309 bytes .../src/assets/images/teradata.png | Bin 93361 -> 9993 bytes .../src/assets/images/timescale.png | Bin 16120 -> 15319 bytes superset-frontend/src/assets/images/trino.png | Bin 23773 -> 10322 bytes .../src/assets/images/vertica.png | Bin 6800 -> 11479 bytes .../src/assets/images/yugabyte.png | Bin 6460 -> 12123 bytes .../src/assets/stylesheets/superset.less | 34 +- .../plugin-chart-cccs-grid/src/Buttons.css | 31 + .../plugin-chart-cccs-grid/src/CccsGrid.tsx | 312 +- .../src/ExpandAllValueRenderer.tsx | 118 + .../src/JsonValueRenderer.tsx | 132 +- .../JumpActionConfig.tsx | 386 +- .../JumpActionConfigControll/index.tsx | 296 +- .../src/plugin/controlPanel.tsx | 100 +- .../src/plugin/transformProps.ts | 68 +- .../plugin-chart-cccs-grid/src/types.ts | 2 +- .../src/IFrameVisualization.tsx | 32 +- .../src/plugin/buildQuery.ts | 69 +- .../src/plugin/controlPanel.ts | 25 +- .../src/plugin/transformProps.ts | 25 +- .../src/components/Alert/Alert.test.tsx | 11 +- .../src/components/AlteredSliceTag/index.jsx | 6 +- .../AsyncSelect/AsyncSelect.test.jsx | 2 +- .../src/components/AsyncSelect/index.jsx | 2 +- .../src/components/Badge/index.tsx | 4 +- .../src/components/Button/index.tsx | 58 +- .../CertifiedBadge/CertifiedBadge.test.tsx | 19 +- .../src/components/Chart/Chart.jsx | 28 +- .../src/components/Chart/ChartContextMenu.tsx | 152 + .../src/components/Chart/ChartRenderer.jsx | 135 +- .../DrillDetail/DrillDetailMenuItems.test.tsx | 345 + .../DrillDetail/DrillDetailMenuItems.tsx | 255 + .../DrillDetail/DrillDetailModal.test.tsx | 95 + .../Chart/DrillDetail/DrillDetailModal.tsx | 118 + .../DrillDetail/DrillDetailPane.test.tsx | 200 + .../Chart/DrillDetail/DrillDetailPane.tsx | 397 + .../DrillDetailTableControls.test.tsx | 109 + .../DrillDetail/DrillDetailTableControls.tsx | 140 + .../components/Chart/DrillDetail/index.ts} | 3 +- .../Chart/DrillDetail}/types.ts | 35 +- .../src/components/Chart/DrillDetail/utils.ts | 46 + .../src/components/Chart/chartAction.js | 68 +- .../src/components/Chart/chartActions.test.js | 38 + .../src/components/Chart/chartReducer.ts | 8 +- .../src/components/Chart/utils.test.ts | 42 + .../src/components/Chart/utils.ts | 40 + .../src/components/Checkbox/Checkbox.tsx | 9 +- .../components/ConfirmStatusChange/index.tsx | 2 +- .../src/components/CopyToClipboard/index.jsx | 2 +- .../src/components/CronPicker/CronPicker.tsx | 9 + .../DatabaseSelector.test.tsx | 277 +- .../src/components/DatabaseSelector/index.tsx | 122 +- .../Datasource/ChangeDatasourceModal.tsx | 8 +- .../components/Datasource/CollectionTable.tsx | 22 +- .../Datasource/DatasourceEditor.jsx | 73 +- .../Datasource/DatasourceEditor.test.jsx | 44 +- .../Datasource/DatasourceModal.test.jsx | 9 +- .../components/Datasource/DatasourceModal.tsx | 4 +- .../DeprecatedSelect.stories.tsx | 0 .../DeprecatedSelect.tsx | 6 +- .../NativeSelect.tsx | 0 .../OnPasteSelect.jsx | 2 +- .../OnPasteSelect.test.jsx | 8 +- .../WindowedSelect/WindowedMenuList.tsx | 2 +- .../WindowedSelect/index.tsx | 0 .../WindowedSelect/windowed.tsx | 22 +- .../{Select => DeprecatedSelect}/index.ts | 0 .../components/DeprecatedSelect/styles.tsx | 406 + .../{Select => DeprecatedSelect}/utils.ts | 40 - .../src/components/DesignSystem.stories.mdx | 25 + .../src/components/Dropdown/index.tsx | 28 +- .../src/components/DropdownButton/index.tsx | 3 +- .../DropdownContainer.stories.tsx | 109 + .../DropdownContainer.test.tsx | 156 + .../DropdownContainer/Overview.stories.mdx | 17 + .../components/DropdownContainer/index.tsx | 408 + .../DropdownSelectableIcon.stories.tsx | 65 + .../DropdownSelectableIcon.test.tsx | 99 + .../DropdownSelectableIcon/index.tsx | 154 + .../components/DynamicEditableTitle/index.tsx | 2 +- .../src/components/EditableTitle/index.tsx | 21 +- .../src/components/EmptyState/index.tsx | 38 +- .../ErrorMessage/BasicErrorAlert.test.tsx | 7 + .../DatabaseErrorMessage.test.tsx | 7 + .../ErrorMessage/DatabaseErrorMessage.tsx | 19 +- .../DatasetNotFoundErrorMessage.test.tsx | 7 + .../ErrorMessage/ErrorAlert.test.tsx | 13 + .../components/ErrorMessage/ErrorAlert.tsx | 24 +- .../ErrorMessageWithStackTrace.test.tsx | 7 + .../ErrorMessageWithStackTrace.tsx | 5 +- .../ParameterErrorMessage.test.tsx | 7 + .../ErrorMessage/TimeoutErrorMessage.test.tsx | 7 + .../src/components/FacePile/index.tsx | 4 +- .../src/components/FaveStar/FaveStar.test.tsx | 17 +- .../FilterableTable/FilterableTable.test.tsx | 17 + .../src/components/FilterableTable/index.tsx | 499 +- .../Form/LabeledErrorBoundInput.test.jsx | 14 + .../Form/LabeledErrorBoundInput.tsx | 26 +- .../GenericLink/GenericLink.test.tsx | 59 + .../components/GenericLink/GenericLink.tsx | 52 + .../src/components/Icons/index.tsx | 2 +- .../src/components/ImportModal/ErrorAlert.tsx | 2 +- .../src/components/ImportModal/index.tsx | 4 +- .../IndeterminateCheckbox.test.tsx | 37 +- .../LastUpdated/LastUpdated.test.tsx | 4 +- .../components/ListView/CrossLinks.test.tsx | 97 + .../src/components/ListView/CrossLinks.tsx | 122 + .../ListView/CrossLinksTooltip.test.tsx | 89 + .../components/ListView/CrossLinksTooltip.tsx | 73 + .../components/ListView/Filters/DateRange.tsx | 3 +- .../components/ListView/Filters/Select.tsx | 46 +- .../src/components/ListView/Filters/index.tsx | 47 +- .../src/components/ListView/types.ts | 4 + .../src/components/ListView/utils.ts | 4 +- .../ListViewCard/ListViewCard.stories.tsx | 26 +- .../src/components/ListViewCard/index.tsx | 29 +- .../components/Loading/Loading.stories.tsx | 4 +- .../src/components/Loading/Loading.test.tsx | 4 +- .../src/components/Loading/index.tsx | 7 +- .../src/components/Menu/index.tsx | 3 + .../src/components/MessageToasts/Toast.tsx | 2 +- .../components/MetadataBar/ContentConfig.tsx | 136 + .../src/components/MetadataBar/ContentType.ts | 91 + .../MetadataBar/MetadataBar.stories.mdx | 145 + .../MetadataBar/MetadataBar.stories.tsx | 109 + .../MetadataBar/MetadataBar.test.tsx | 268 + .../components/MetadataBar/MetadataBar.tsx | 237 + .../components/MetadataBar/index.tsx} | 15 +- .../src/components/Modal/Modal.stories.tsx | 15 + .../src/components/Modal/Modal.tsx | 79 +- .../ModalTrigger/ModalTrigger.stories.tsx | 8 +- .../src/components/ModalTrigger/index.jsx | 129 - .../src/components/ModalTrigger/index.tsx | 130 + .../PageHeaderWithActions/index.tsx | 11 +- .../PopoverDropdown/PopoverDropdown.test.tsx | 20 +- .../PopoverSection/PopoverSection.test.tsx | 14 +- .../src/components/ProgressBar/index.tsx | 2 +- .../src/components/Radio/index.tsx | 1 + .../RefreshLabel/RefreshLabel.test.tsx | 8 +- .../HeaderReportDropdown/index.test.tsx | 92 +- .../HeaderReportDropdown/index.tsx | 30 +- .../ReportModal/ReportModal.test.tsx | 21 +- .../src/components/ReportModal/index.tsx | 2 +- .../src/components/ResizableSidebar/index.tsx | 82 + .../useStoredSidebarWidth.test.ts | 92 + .../ResizableSidebar/useStoredSidebarWidth.ts | 51 + .../components/Select/AsyncSelect.stories.tsx | 368 + .../components/Select/AsyncSelect.test.tsx | 813 + .../src/components/Select/AsyncSelect.tsx | 532 + .../src/components/Select/CustomTag.tsx | 82 + .../src/components/Select/Select.stories.tsx | 247 +- .../src/components/Select/Select.test.tsx | 596 +- .../src/components/Select/Select.tsx | 1128 +- .../src/components/Select/constants.ts | 52 + .../src/components/Select/styles.tsx | 496 +- .../src/components/Select/types.ts | 217 + .../src/components/Select/utils.tsx | 224 + .../src/components/Table/Table.overview.mdx | 339 + .../src/components/Table/Table.stories.tsx | 682 + .../src/components/Table/Table.test.tsx | 80 + .../src/components/Table/VirtualTable.tsx | 247 + .../ActionCell/ActionCell.overview.mdx | 69 + .../ActionCell/ActionCell.stories.tsx | 36 + .../ActionCell/ActionCell.test.tsx | 50 + .../cell-renderers/ActionCell/fixtures.ts | 47 + .../Table/cell-renderers/ActionCell/index.tsx | 145 + .../BooleanCell/BooleanCell.stories.tsx | 34 + .../BooleanCell/BooleanCell.test.tsx | 37 + .../cell-renderers/BooleanCell/index.tsx | 30 + .../ButtonCell/ButtonCell.stories.tsx | 62 + .../ButtonCell/ButtonCell.test.tsx | 40 + .../cell-renderers/ButtonCell/index.tsx} | 57 +- .../NullCell/NullCell.stories.tsx} | 19 +- .../NullCell/NullCell.test.tsx} | 31 +- .../Table/cell-renderers/NullCell/index.tsx | 37 + .../NumericCell/NumericCell.stories.tsx} | 44 +- .../NumericCell/NumericCell.test.tsx} | 52 +- .../cell-renderers/NumericCell/index.tsx | 418 + .../TimeCell/TimeCell.stories.tsx} | 56 +- .../cell-renderers/TimeCell/TimeCell.test.tsx | 49 + .../Table/cell-renderers/TimeCell/index.tsx | 38 + .../Table/cell-renderers/fixtures.ts | 25 + .../header-renderers/HeaderWithRadioGroup.tsx | 94 + .../src/components/Table/index.tsx | 454 + .../src/components/Table/sorters.test.ts | 100 + .../state.ts => components/Table/sorters.ts} | 35 +- .../Table/utils/InteractiveTableUtils.ts | 233 + .../src/components/Table/utils/utils.test.ts | 48 + .../src/components/Table/utils/utils.ts | 40 + .../src/components/TableCollection/index.tsx | 6 +- .../TableSelector/TableSelector.test.tsx | 95 +- .../src/components/TableSelector/index.tsx | 206 +- .../TableView/TableView.stories.tsx | 1 + .../src/components/TableView/TableView.tsx | 48 +- .../src/components/Timer/index.tsx | 1 + .../TimezoneSelector.test.tsx | 8 +- .../src/components/Tooltip/index.tsx | 7 +- .../src/components/TruncatedList/index.tsx | 160 + .../src/components/atomic-design.png | Bin 0 -> 163100 bytes superset-frontend/src/components/index.ts | 1 + superset-frontend/src/constants.ts | 82 +- .../src/dashboard/actions/dashboardInfo.ts | 100 +- .../src/dashboard/actions/dashboardState.js | 186 +- .../dashboard/actions/dashboardState.test.js | 86 +- .../src/dashboard/actions/hydrate.js | 121 +- .../src/dashboard/actions/nativeFilters.ts | 24 + .../src/dashboard/actions/sliceEntities.js | 213 +- .../dashboard/actions/sliceEntities.test.js | 102 + .../src/dashboard/components/AddSliceCard.jsx | 148 - .../AddSliceCard/AddSliceCard.test.tsx | 62 + .../components/AddSliceCard/AddSliceCard.tsx | 288 + .../components/AddSliceCard/index.ts} | 5 +- .../dashboard/components/AnchorLink/index.tsx | 3 +- .../BuilderComponentPane.test.tsx | 2 +- .../components/BuilderComponentPane/index.tsx | 159 +- .../CrossFilterScopingModal.tsx | 14 +- .../src/dashboard/components/Dashboard.jsx | 7 +- .../dashboard/components/Dashboard.test.jsx | 3 +- .../DashboardBuilder.test.jsx | 196 - .../DashboardBuilder.test.tsx | 291 + .../DashboardBuilder/DashboardBuilder.tsx | 543 +- .../DashboardBuilder/DashboardContainer.tsx | 98 +- .../components/DashboardEmbedControls.tsx | 35 +- .../dashboard/components/DashboardGrid.jsx | 88 +- .../components/DashboardGrid.test.jsx | 7 - .../DetailsPanel/DetailsPanel.test.tsx | 22 +- .../FiltersBadge/DetailsPanel/index.tsx | 17 +- .../FilterIndicator/FilterIndicator.test.tsx | 16 +- .../FiltersBadge/FilterIndicator/index.tsx | 12 +- .../components/FiltersBadge/index.tsx | 4 +- .../components/FiltersBadge/selectors.ts | 17 +- .../components/Header/Header.test.tsx | 26 +- .../HeaderActionsDropdown.test.tsx | 8 +- .../Header/HeaderActionsDropdown/index.jsx | 29 +- .../src/dashboard/components/Header/index.jsx | 62 +- .../src/dashboard/components/Header/types.ts | 3 +- .../OverwriteConfirm.test.tsx | 50 + .../OverwriteConfirmModal.test.tsx | 90 + .../OverwriteConfirmModal.tsx | 209 + .../OverwriteConfirm/index.tsx} | 52 +- .../PropertiesModal/PropertiesModal.test.tsx | 185 +- .../components/PropertiesModal/index.tsx | 127 +- .../components/PublishedStatus/index.jsx | 6 +- .../components/RefreshIntervalModal.test.tsx | 17 +- .../components/RefreshIntervalModal.tsx | 44 +- .../src/dashboard/components/SaveModal.tsx | 18 +- .../src/dashboard/components/SliceAdder.jsx | 98 +- .../dashboard/components/SliceAdder.test.jsx | 13 +- .../SliceHeader/SliceHeader.test.tsx | 92 +- .../components/SliceHeader/index.tsx | 113 +- .../SliceHeaderControls.test.tsx | 167 +- .../components/SliceHeaderControls/index.tsx | 180 +- .../components/URLShortLinkButton/index.tsx | 34 +- .../components/dnd/DragDroppable.jsx | 89 +- .../components/dnd/DragDroppable.test.jsx | 5 +- .../components/dnd/dragDroppableConfig.js | 2 +- .../dashboard/components/dnd/handleHover.js | 2 + .../filterscope/FilterScopeModal.tsx | 12 +- .../filterscope/FilterScopeSelector.jsx | 280 +- .../components/gridComponents/Chart.jsx | 77 +- .../components/gridComponents/Chart.test.jsx | 11 +- .../components/gridComponents/ChartHolder.jsx | 420 - .../gridComponents/ChartHolder.test.jsx | 138 - .../gridComponents/ChartHolder.test.tsx | 375 +- .../components/gridComponents/ChartHolder.tsx | 334 + .../components/gridComponents/Column.jsx | 87 +- .../components/gridComponents/Column.test.jsx | 9 +- .../components/gridComponents/Divider.jsx | 28 +- .../components/gridComponents/Header.jsx | 63 +- .../components/gridComponents/Markdown.jsx | 46 +- .../components/gridComponents/Row.jsx | 129 +- .../components/gridComponents/Row.test.jsx | 9 +- .../components/gridComponents/Tab.jsx | 10 + .../components/gridComponents/Tabs.jsx | 73 +- .../components/gridComponents/Tabs.test.jsx | 14 +- .../new/DraggableNewComponent.jsx | 66 +- .../new/DraggableNewComponent.test.jsx | 6 +- .../gridComponents/new/NewMarkdown.jsx | 5 +- .../menu/BackgroundStyleDropdown.tsx | 56 +- .../ShareMenuItems/ShareMenuItems.test.tsx | 5 + .../components/menu/ShareMenuItems/index.tsx | 20 +- .../components/menu/WithPopoverMenu.tsx | 70 +- .../ActionButtons/ActionButtons.test.tsx | 28 +- .../FilterBar/ActionButtons/index.tsx | 115 +- .../FilterBar/FilterBar.test.tsx | 35 +- .../FilterBarSettings.test.tsx | 299 + .../FilterBar/FilterBarSettings/index.tsx | 192 + .../FilterConfigurationLink/index.tsx | 38 +- .../FilterControls/FilterControl.tsx | 225 +- .../FilterControls/FilterControls.tsx | 297 +- .../FilterControls/FilterDivider.stories.tsx | 121 + .../FilterControls/FilterDivider.test.tsx | 135 + .../FilterControls/FilterDivider.tsx | 162 + .../FilterBar/FilterControls/FilterValue.tsx | 52 +- .../FilterBar/FilterControls/types.ts | 15 +- .../FilterBar/FilterControls/utils.ts | 16 +- .../FilterBar/FilterSets/EditSection.tsx | 6 +- .../FilterSets/FilterSetUnit.test.tsx | 2 +- .../FilterBar/FilterSets/FilterSetUnit.tsx | 11 +- .../FilterBar/FilterSets/FilterSets.test.tsx | 2 +- .../FilterBar/FilterSets/FiltersHeader.tsx | 2 +- .../FilterBar/FilterSets/Footer.tsx | 2 +- .../FilterBar/FilterSets/index.tsx | 4 +- .../FiltersDropdownContent/index.tsx | 54 + .../FiltersOutOfScopeCollapsible/index.tsx | 89 + .../nativeFilters/FilterBar/Header/index.tsx | 52 +- .../nativeFilters/FilterBar/Horizontal.tsx | 138 + .../FilterBar/HorizontalFilterBar.test.tsx | 97 + .../nativeFilters/FilterBar/Vertical.tsx | 316 + .../nativeFilters/FilterBar/index.tsx | 357 +- .../nativeFilters/FilterBar/state.ts | 2 +- .../nativeFilters/FilterBar/types.ts | 67 + .../FilterBar/useFilterControlFactory.tsx | 87 + .../nativeFilters/FilterBar/utils.ts | 9 +- .../FilterCard/DependenciesRow.tsx | 17 +- .../FilterCard/FilterCard.test.tsx | 173 +- .../FilterCard/FilterCardContent.tsx | 12 +- .../nativeFilters/FilterCard/NameRow.tsx | 55 +- .../nativeFilters/FilterCard/ScopeRow.tsx | 16 +- .../nativeFilters/FilterCard/Styles.ts | 5 + .../nativeFilters/FilterCard/index.tsx | 10 +- .../nativeFilters/FilterCard/types.ts | 7 + .../FilterCard/useFilterScope.ts | 7 +- .../FilterConfigPane.test.tsx | 8 - .../FilterConfigurePane.tsx | 58 +- .../FiltersConfigModal/FilterTitlePane.tsx | 4 +- .../FiltersConfigForm/DatasetSelect.tsx | 5 +- .../FiltersConfigForm/DefaultValue.tsx | 4 +- .../FilterScope/utils.test.ts | 18204 ++++++++ .../FiltersConfigForm/FilterScope/utils.ts | 53 +- .../FiltersConfigForm/FiltersConfigForm.tsx | 37 +- .../FiltersConfigForm/getControlItemsMap.tsx | 2 +- .../FiltersConfigForm/utils.ts | 10 +- .../FiltersConfigModal.test.tsx | 3 +- .../FiltersConfigModal/FiltersConfigModal.tsx | 237 +- .../NativeFiltersModal.test.tsx | 2 +- .../components/nativeFilters/utils.ts | 17 +- .../resizable/ResizableContainer.jsx | 92 +- superset-frontend/src/dashboard/constants.ts | 2 + .../src/dashboard/containers/Chart.jsx | 7 +- .../src/dashboard/containers/Dashboard.ts | 2 +- .../containers/DashboardComponent.jsx | 2 - .../dashboard/containers/DashboardHeader.jsx | 6 +- .../dashboard/containers/DashboardPage.tsx | 153 +- .../src/dashboard/containers/SliceAdder.jsx | 8 +- .../src/dashboard/reducers/dashboardInfo.js | 16 +- .../src/dashboard/reducers/dashboardLayout.js | 64 +- .../reducers/dashboardLayout.test.js | 23 +- .../src/dashboard/reducers/dashboardState.js | 30 +- .../dashboard/reducers/dashboardState.test.js | 9 +- .../src/dashboard/reducers/nativeFilters.ts | 14 + .../src/dashboard/reducers/types.ts | 1 + superset-frontend/src/dashboard/styles.ts | 42 + .../stylesheets/builder-sidepane.less | 132 - .../stylesheets/components/chart.less | 151 - .../stylesheets/components/column.less | 64 - .../stylesheets/components/header.less | 87 - .../stylesheets/components/index.less | 25 - .../dashboard/stylesheets/components/row.less | 86 - .../src/dashboard/stylesheets/dashboard.less | 165 - .../src/dashboard/stylesheets/dnd.less | 130 - .../stylesheets/filter-scope-selector.less | 259 - .../dashboard/stylesheets/popover-menu.less | 140 - .../src/dashboard/stylesheets/resizable.less | 105 - superset-frontend/src/dashboard/types.ts | 56 +- .../util/activeAllDashboardFilters.ts | 87 +- .../dashboard/util/activeDashboardFilters.js | 4 +- .../charts/getFormDataWithExtraFilters.ts | 24 +- .../src/dashboard/util/constants.ts | 1 + .../src/dashboard/util/crossFilters.ts | 26 + .../util/filterboxMigrationHelper.test.ts | 4 +- .../util/filterboxMigrationHelper.ts | 108 +- ...dParentId.test.js => findParentId.test.ts} | 11 + .../src/dashboard/util/findParentId.ts | 68 + .../util/findTabIndexByComponentId.test.js | 2 +- .../util/getFilterConfigsFromFormdata.js | 8 - .../util/getFormDataWithExtraFilters.test.ts | 13 +- .../dashboard/util/getOverwriteItems.test.ts | 57 + .../src/dashboard/util/getOverwriteItems.ts | 46 + .../dashboard/util/getSliceHeaderTooltip.tsx | 44 + .../util/logging/childChartsDidLoad.js | 2 +- .../src/dashboard/util/newComponentFactory.js | 2 +- ...ission.test.ts => permissionUtils.test.ts} | 87 +- .../{findPermission.ts => permissionUtils.ts} | 30 +- .../src/dashboard/util/propShapes.jsx | 14 +- .../util/updateComponentParentsList.js | 40 +- .../util/updateComponentParentsList.test.js | 67 +- .../useFilterFocusHighlightStyles.test.tsx | 248 + .../util/useFilterFocusHighlightStyles.ts | 92 + superset-frontend/src/embedded/api.tsx | 68 + superset-frontend/src/embedded/index.tsx | 40 +- superset-frontend/src/explore/App.jsx | 52 - superset-frontend/src/explore/ExplorePage.tsx | 162 + .../actions/datasourcesActions.test.ts | 139 + .../src/explore/actions/datasourcesActions.ts | 93 + .../src/explore/actions/exploreActions.ts | 44 +- .../explore/actions/hydrateExplore.test.ts | 214 + .../src/explore/actions/hydrateExplore.ts | 195 + .../src/explore/actions/saveModalActions.js | 212 +- .../explore/actions/saveModalActions.test.js | 341 + .../src/explore/components/Control.test.tsx | 2 +- .../src/explore/components/ControlHeader.tsx | 54 +- .../ControlPanelsContainer.test.tsx | 8 +- .../components/ControlPanelsContainer.tsx | 290 +- .../DataTableControl/FilterInput.test.tsx | 1 + .../components/DataTableControl/index.tsx | 4 +- .../DataTablesPane/DataTablesPane.tsx | 8 +- .../components/ResultsPaneOnDashboard.tsx | 34 +- .../DataTablesPane/components/SamplesPane.tsx | 4 +- .../components/useResultsPane.tsx | 52 +- .../test/DataTablesPane.test.tsx | 21 +- .../test/ResultsPaneOnDashboard.test.tsx | 20 +- .../DataTablesPane/test/SamplesPane.test.tsx | 51 +- .../DatasourcePanel/DatasourcePanel.test.tsx | 148 +- .../DatasourcePanelDragOption.test.tsx | 39 +- .../components/DatasourcePanel/fixtures.tsx | 3 +- .../components/DatasourcePanel/index.tsx | 192 +- .../src/explore/components/ExploreAlert.tsx | 9 +- .../ExploreChartHeader.test.tsx | 102 +- .../components/ExploreChartHeader/index.jsx | 191 +- .../explore/components/ExploreChartPanel.jsx | 70 +- .../components/ExploreChartPanel.test.jsx | 56 +- .../ExploreViewContainer.test.tsx | 101 +- .../components/ExploreViewContainer/index.jsx | 159 +- .../ExportToCSVDropdown.test.tsx | 42 +- .../PropertiesModal/PropertiesModal.test.tsx | 3 + .../components/PropertiesModal/index.tsx | 17 +- .../components/RowCountLabel/index.tsx | 12 +- .../src/explore/components/SaveModal.test.jsx | 461 +- .../src/explore/components/SaveModal.tsx | 468 +- .../AnnotationLayer.jsx | 73 +- .../AnnotationLayer.test.tsx | 21 +- .../controls/AnnotationLayerControl/index.jsx | 11 +- .../CollectionControl.test.tsx | 27 +- .../controls/ColorPickerControl.jsx | 4 +- .../ColorSchemeControl.test.tsx | 4 +- .../ColorSchemeLabel.test.tsx | 59 + .../ColorSchemeControl/ColorSchemeLabel.tsx | 126 + .../controls/ColorSchemeControl/index.jsx | 208 - .../controls/ColorSchemeControl/index.tsx | 189 + .../FormattingPopoverContent.tsx | 2 +- .../ControlPopover/ControlPopover.tsx | 24 +- .../DatasourceControl.test.jsx | 59 +- .../DatasourceControl.test.tsx | 257 +- .../controls/DatasourceControl/index.jsx | 208 +- .../DateFilterControl/DateFilterLabel.tsx | 254 +- .../components/AdvancedFrame.tsx | 24 +- .../components/CommonFrame.tsx | 8 +- .../components/DateLabel.tsx | 100 + .../DateFilterControl/components/index.ts | 1 + .../controls/DateFilterControl/index.ts | 1 + .../AdvancedFrame.test.tsx | 2 +- .../CustomFrame.test.tsx | 12 +- .../tests/DateFilterLabel.test.tsx | 108 + .../{utils => tests}/utils.test.ts | 0 .../controls/DateFilterControl/types.ts | 10 + .../DateFilterControl/utils/constants.ts | 15 +- .../utils/dateFilterUtils.ts | 65 +- .../ColumnSelectPopover.tsx | 90 +- .../ColumnSelectPopoverTrigger.tsx | 50 +- .../DndAdhocFilterOption.tsx | 78 + .../DndColumnSelect.test.tsx | 43 +- .../DndColumnSelect.tsx | 121 +- .../DndFilterSelect.test.tsx | 106 +- .../DndFilterSelect.tsx | 127 +- .../DndMetricSelect.test.tsx | 28 +- .../DndMetricSelect.tsx | 156 +- .../DndColumnSelectControl/Option.test.tsx | 24 +- .../DndColumnSelectControl/Option.tsx | 10 +- .../OptionWrapper.test.tsx | 12 +- .../DndColumnSelectControl/OptionWrapper.tsx | 6 +- .../controls/DndColumnSelectControl/types.ts | 2 + .../AdhocFilter/AdhocFilter.test.js | 1 + .../FilterControl/AdhocFilter/index.js | 5 +- .../AdhocFilterControl/index.jsx | 43 +- .../AdhocFilterEditPopover.test.jsx | 3 +- .../AdhocFilterEditPopover/index.jsx | 29 +- ...FilterEditPopoverSimpleTabContent.test.tsx | 44 +- .../index.tsx | 206 +- .../AdhocFilterOption.test.tsx | 39 +- .../FilterControl/AdhocFilterOption/index.jsx | 86 - .../FilterControl/AdhocFilterOption/index.tsx | 80 + .../AdhocFilterPopoverTrigger/index.tsx | 2 + .../controls/FilterControl/utils/index.ts | 20 + .../utils/useDatePickerInAdhocFilter.tsx | 52 + .../utils/useDatePickerInAdhocfilter.test.ts | 64 + .../utils/useGetTimeRangeLabel.test.ts | 103 + .../utils/useGetTimeRangeLabel.tsx | 75 + .../FixedOrMetricControl.test.tsx | 7 + .../controls/FixedOrMetricControl/index.jsx | 2 +- .../controls/MetricControl/AdhocMetric.js | 5 +- .../MetricControl/AdhocMetric.test.js | 7 +- .../AdhocMetricEditPopover.test.jsx | 6 +- .../AdhocMetricEditPopover.test.tsx | 76 +- .../AdhocMetricEditPopover/index.jsx | 97 +- .../AdhocMetricEditPopoverTitle.tsx | 2 +- .../MetricControl/AdhocMetricOption.jsx | 3 + .../AdhocMetricPopoverTrigger.tsx | 61 +- .../MetricControl/MetricDefinitionValue.jsx | 5 +- .../controls/MetricControl/MetricsControl.jsx | 6 +- .../MetricControl/MetricsControl.test.jsx | 1 - .../controls/MetricControl/savedMetricType.js | 4 +- .../controls/OptionControls/index.tsx | 13 +- .../SelectAsyncControl.test.tsx | 16 +- .../controls/SelectAsyncControl/index.tsx | 6 +- .../components/controls/SelectControl.jsx | 4 +- .../controls/SelectControl.test.jsx | 16 - .../components/controls/SpatialControl.jsx | 6 +- .../components/controls/TextAreaControl.jsx | 25 +- .../TimeSeriesColumnControl/index.jsx | 92 +- .../explore/components/controls/ViewQuery.tsx | 76 + .../components/controls/ViewQueryModal.tsx | 53 +- .../controls/ViewQueryModalFooter.tsx | 83 + .../components/controls/ViewportControl.jsx | 3 +- .../VizTypeControl/FastVizSwitcher.tsx | 44 +- .../VizTypeControl/VizTypeControl.test.tsx | 80 +- .../VizTypeControl/VizTypeGallery.tsx | 12 +- .../controls/VizTypeControl/index.tsx | 5 + .../components/controls/XAxisSortControl.tsx} | 36 +- .../src/explore/components/controls/index.js | 2 + .../DashboardsSubMenu.test.tsx | 78 + .../DashboardsSubMenu.tsx | 146 + .../useExploreAdditionalActionsMenu/index.jsx | 124 +- superset-frontend/src/explore/constants.ts | 57 +- .../src/explore/controlPanels/sections.tsx | 85 +- .../controlUtils/controlUtils.test.tsx | 1 + .../explore/controlUtils/getControlState.ts | 17 +- ...trolValuesCompatibleWithDatasource.test.ts | 287 + ...etControlValuesCompatibleWithDatasource.ts | 16 +- .../getFormDataFromDashboardContext.test.ts | 305 + .../getFormDataWithDashboardContext.ts | 236 + .../controlUtils/getSectionsToRender.ts | 10 +- .../controlUtils/standardizedFormData.test.ts | 364 +- .../controlUtils/standardizedFormData.ts | 181 +- superset-frontend/src/explore/controls.jsx | 60 +- .../exploreUtils/exploreUtils.test.jsx | 4 +- .../exploreUtils/getExploreUrl.test.ts | 2 +- .../explore/exploreUtils/getHostName.test.ts | 2 +- .../getParsedExploreURLParams.test.ts | 62 + .../exploreUtils/getParsedExploreURLParams.ts | 125 + .../exploreUtils/getURIDirectory.test.ts | 4 +- .../src/explore/exploreUtils/index.js | 22 +- superset-frontend/src/explore/fixtures.tsx | 63 +- superset-frontend/src/explore/index.jsx | 42 - superset-frontend/src/explore/main.less | 137 - .../reducers/datasourcesReducer.ts} | 47 +- .../src/explore/reducers/exploreReducer.js | 111 +- .../src/explore/reducers/getInitialState.ts | 125 - .../src/explore/reducers/saveModalReducer.js | 7 + superset-frontend/src/explore/store.js | 5 +- superset-frontend/src/explore/types.ts | 40 +- superset-frontend/src/featureFlags.ts | 12 +- .../GroupBy/GroupByFilterPlugin.tsx | 4 + .../components/GroupBy/controlPanel.ts | 2 +- .../components/GroupBy/transformProps.ts | 4 + .../Range/RangeFilterPlugin.test.tsx | 26 +- .../components/Range/RangeFilterPlugin.tsx | 43 +- .../filters/components/Range/buildQuery.ts | 6 +- .../filters/components/Range/controlPanel.ts | 2 +- .../components/Range/transformProps.ts | 7 + .../src/filters/components/Range/types.ts | 3 + .../Select/SelectFilterPlugin.test.tsx | 32 +- .../components/Select/SelectFilterPlugin.tsx | 28 +- .../components/Select/buildQuery.test.ts | 10 +- .../filters/components/Select/buildQuery.ts | 2 +- .../filters/components/Select/controlPanel.ts | 2 +- .../components/Select/transformProps.ts | 7 + .../src/filters/components/Select/types.ts | 3 + .../components/Time/TimeFilterPlugin.tsx | 42 +- .../filters/components/Time/controlPanel.ts | 2 +- .../filters/components/Time/transformProps.ts | 7 + .../src/filters/components/Time/types.ts | 1 + .../TimeColumn/TimeColumnFilterPlugin.tsx | 8 +- .../components/TimeColumn/transformProps.ts | 4 + .../TimeGrain/TimeGrainFilterPlugin.tsx | 8 +- .../components/TimeGrain/transformProps.ts | 4 + .../src/filters/components/types.ts | 5 + .../src/hooks/apiResources/dashboards.ts | 1 + .../src/hooks/apiResources/index.ts | 2 + .../src/hooks/apiResources/schemas.test.ts | 138 + .../src/hooks/apiResources/schemas.ts | 80 + .../src/hooks/apiResources/tables.test.ts | 248 + .../src/hooks/apiResources/tables.ts | 115 + superset-frontend/src/hooks/useTabId.ts | 15 + .../utils.ts => hooks/useTruncation/index.ts} | 9 +- .../useTruncation/useCSSTextTruncation.ts | 61 + .../useChildElementTruncation.ts} | 55 +- superset-frontend/src/logger/LogUtils.ts | 28 + .../src/middleware/asyncEvent.ts | 19 +- .../src/middleware/logger.test.js | 35 + .../src/middleware/loggerMiddleware.js | 20 +- .../src/modules/AnnotationTypes.js | 10 +- .../ChartCreation/ChartCreation.test.tsx | 153 + .../ChartCreation/index.tsx} | 184 +- .../chart => pages/ChartList}/ChartCard.tsx | 7 +- .../ChartList}/ChartList.test.jsx | 4 +- .../ChartList/index.tsx} | 112 +- superset-frontend/src/preamble.ts | 38 +- superset-frontend/src/profile/App.tsx | 10 +- .../src/profile/components/App.tsx | 4 +- .../src/profile/components/CreatedContent.tsx | 43 +- .../src/profile/components/Favorites.tsx | 7 +- .../src/profile/components/RecentActivity.tsx | 16 +- .../src/profile/components/Security.tsx | 13 +- .../src/profile/components/UserInfo.tsx | 21 +- superset-frontend/src/profile/types.ts | 4 + superset-frontend/src/reduxUtils.ts | 25 +- .../src/reports/actions/reports.js | 5 +- superset-frontend/src/setup/setupApp.ts | 2 +- superset-frontend/src/setup/setupClient.ts | 2 +- ...ponents.ts => setupDashboardComponents.ts} | 0 .../setup/setupExtensions.ts} | 5 +- .../src/showSavedQuery/index.jsx | 5 +- superset-frontend/src/types/Chart.ts | 15 + .../helper.ts => src/types/ChartSource.ts} | 6 +- superset-frontend/src/types/Dashboard.ts | 2 - .../src/types/DashboardContextForExplore.ts | 43 + superset-frontend/src/types/Database.ts | 3 +- superset-frontend/src/types/bootstrapTypes.ts | 97 +- superset-frontend/src/types/files.d.ts | 1 + .../src/utils/DebouncedMessageQueue.js | 4 +- superset-frontend/src/utils/common.js | 17 +- superset-frontend/src/utils/common.test.jsx | 9 +- .../src/utils/datasourceUtils.js | 25 + .../src/utils/downloadAsImage.ts | 10 +- .../src/utils/findPermission.test.ts | 63 + superset-frontend/src/utils/findPermission.ts | 28 + .../src/utils/getBootstrapData.ts | 27 + .../getChartRequiredFieldsMissingMessage.ts | 5 +- .../src/utils/getClientErrorObject.ts | 58 +- .../src/utils/getDatasourceUid.test.ts | 49 + .../index.tsx => utils/getDatasourceUid.ts} | 7 +- .../src/utils/hostNamesConfig.js | 5 +- superset-frontend/src/utils/isBot.ts | 21 + .../utils/isDashboardVirtualizationEnabled.ts | 30 + .../src/utils/localStorageHelpers.ts | 20 +- superset-frontend/src/utils/urlUtils.test.ts | 54 + superset-frontend/src/utils/urlUtils.ts | 80 +- superset-frontend/src/views/App.tsx | 71 +- .../src/views/CRUD/alert/AlertList.test.jsx | 4 +- .../src/views/CRUD/alert/AlertList.tsx | 78 +- .../CRUD/alert/AlertReportModal.test.jsx | 20 +- .../CRUD/alert/AlertReportModal.test.tsx | 34 + .../src/views/CRUD/alert/AlertReportModal.tsx | 292 +- .../src/views/CRUD/alert/ExecutionLog.tsx | 14 +- .../components/AlertReportCronScheduler.tsx | 2 +- .../views/CRUD/annotation/AnnotationList.tsx | 6 +- .../CRUD/annotation/AnnotationModal.test.jsx | 4 +- .../views/CRUD/annotation/AnnotationModal.tsx | 22 +- .../annotationlayers/AnnotationLayerModal.tsx | 4 +- .../annotationlayers/AnnotationLayersList.tsx | 12 +- .../CRUD/csstemplates/CssTemplateModal.tsx | 12 +- .../CRUD/csstemplates/CssTemplatesList.tsx | 4 +- .../views/CRUD/dashboard/DashboardCard.tsx | 55 +- .../views/CRUD/dashboard/DashboardList.tsx | 59 +- .../src/views/CRUD/data/common.ts | 14 +- .../CRUD/data/database/DatabaseList.test.jsx | 22 +- .../views/CRUD/data/database/DatabaseList.tsx | 45 +- .../CommonParameters.tsx | 53 +- .../DatabaseConnectionForm/EncryptedField.tsx | 17 +- .../DatabaseConnectionForm/TableCatalog.tsx | 17 +- .../ValidatedInputField.tsx | 6 +- .../DatabaseConnectionForm/index.tsx | 62 +- .../database/DatabaseModal/ExtraOptions.tsx | 163 +- .../database/DatabaseModal/ModalHeader.tsx | 78 +- .../database/DatabaseModal/SSHTunnelForm.tsx | 228 + .../DatabaseModal/SSHTunnelSwitch.tsx | 58 + .../database/DatabaseModal/SqlAlchemyForm.tsx | 7 +- .../database/DatabaseModal/index.test.jsx | 1069 - .../database/DatabaseModal/index.test.tsx | 2101 + .../data/database/DatabaseModal/index.tsx | 611 +- .../data/database/DatabaseModal/styles.ts | 22 +- .../src/views/CRUD/data/database/types.ts | 127 +- .../dataset/AddDataset/AddDataset.test.tsx | 47 + .../DatasetPanel/DatasetPanel.stories.tsx | 44 + .../DatasetPanel/DatasetPanel.test.tsx | 160 + .../AddDataset/DatasetPanel/DatasetPanel.tsx | 353 + .../DatasetPanel/MessageContent.tsx | 107 + .../AddDataset/DatasetPanel/fixtures.ts} | 46 +- .../dataset/AddDataset/DatasetPanel/index.tsx | 140 + .../dataset/AddDataset/DatasetPanel/types.ts | 92 + .../EditDataset/EditDataset.test.tsx | 43 + .../EditDataset/UsageTab/UsageTab.test.tsx | 405 + .../AddDataset/EditDataset/UsageTab/index.tsx | 261 + .../dataset/AddDataset/EditDataset/index.tsx | 78 + .../dataset/AddDataset/Footer/Footer.test.tsx | 87 + .../data/dataset/AddDataset/Footer/index.tsx | 130 + .../dataset/AddDataset/Header/Header.test.tsx | 54 + .../data/dataset/AddDataset/Header/index.tsx | 109 + .../AddDataset/LeftPanel/LeftPanel.test.tsx | 283 + .../dataset/AddDataset/LeftPanel/index.tsx | 378 + .../AddDataset/RightPanel/RightPanel.test.tsx | 29 + .../dataset/AddDataset/RightPanel/index.tsx | 23 + .../CRUD/data/dataset/AddDataset/index.tsx | 136 + .../CRUD/data/dataset/AddDataset/types.tsx} | 57 +- .../CRUD/data/dataset/AddDatasetModal.tsx | 144 - .../DatasetLayout/DatasetLayout.test.tsx | 88 + .../CRUD/data/dataset/DatasetLayout/index.tsx | 77 + ...asetList.test.jsx => DatasetList.test.tsx} | 74 +- .../views/CRUD/data/dataset/DatasetList.tsx | 113 +- .../data/dataset/DuplicateDatasetModal.tsx | 19 + .../src/views/CRUD/data/dataset/styles.ts | 146 + .../src/views/CRUD/data/hooks.ts | 105 +- .../views/CRUD/data/query/QueryList.test.tsx | 26 +- .../src/views/CRUD/data/query/QueryList.tsx | 41 +- .../data/query/QueryPreviewModal.test.tsx | 3 +- .../CRUD/data/query/QueryPreviewModal.tsx | 54 +- .../data/savedquery/SavedQueryList.test.jsx | 27 +- .../CRUD/data/savedquery/SavedQueryList.tsx | 10 +- .../savedquery/SavedQueryPreviewModal.tsx | 54 +- superset-frontend/src/views/CRUD/hooks.ts | 29 +- superset-frontend/src/views/CRUD/types.ts | 31 +- .../src/views/CRUD/utils.test.tsx | 174 +- superset-frontend/src/views/CRUD/utils.tsx | 109 +- .../views/CRUD/welcome/ActivityTable.test.tsx | 13 +- .../src/views/CRUD/welcome/ActivityTable.tsx | 85 +- .../views/CRUD/welcome/ChartTable.test.tsx | 29 +- .../src/views/CRUD/welcome/ChartTable.tsx | 102 +- .../src/views/CRUD/welcome/DashboardTable.tsx | 140 +- .../views/CRUD/welcome/EmptyState.test.tsx | 33 +- .../src/views/CRUD/welcome/EmptyState.tsx | 67 +- .../src/views/CRUD/welcome/SavedQueries.tsx | 61 +- .../src/views/CRUD/welcome/Welcome.test.tsx | 82 +- .../src/views/CRUD/welcome/Welcome.tsx | 318 +- .../src/views/CRUD/welcome/types.ts | 4 + superset-frontend/src/views/QueryProvider.tsx | 43 + .../src/views/RootContextProviders.tsx | 62 +- .../views/components/LanguagePicker.test.tsx | 7 +- .../src/views/components/Menu.test.tsx | 182 +- .../src/views/components/Menu.tsx | 83 +- .../src/views/components/RightMenu.test.tsx | 354 + .../{MenuRight.tsx => RightMenu.tsx} | 251 +- .../src/views/components/SubMenu.test.tsx | 59 +- .../src/views/components/SubMenu.tsx | 4 +- .../src/views/components/types.ts | 5 +- superset-frontend/src/views/menu.tsx | 12 +- superset-frontend/src/views/routes.test.tsx | 5 +- superset-frontend/src/views/routes.tsx | 44 +- superset-frontend/src/views/store.ts | 99 +- .../visualizations/FilterBox/FilterBox.jsx | 20 +- .../FilterBox/FilterBoxChartPlugin.js | 3 + .../visualizations/FilterBox/controlPanel.jsx | 2 +- .../FilterBox/images/example1.jpg | Bin 0 -> 10921 bytes .../FilterBox/images/example2.jpg | Bin 0 -> 16969 bytes .../visualizations/TimeTable/TimeTable.jsx | 7 +- .../visualizations/TimeTable/controlPanel.js | 7 +- .../TimeTable/images/example.jpg | Bin 0 -> 72275 bytes .../src/visualizations/TimeTable/index.ts | 2 + .../src/visualizations/presets/MainPreset.js | 4 +- superset-frontend/webpack.config.js | 31 +- superset-websocket/.nvmrc | 2 +- superset-websocket/Dockerfile | 25 +- superset-websocket/README.md | 2 +- superset-websocket/package-lock.json | 2659 +- superset-websocket/package.json | 38 +- superset-websocket/spec/index.test.ts | 2 +- .../utils/client-ws-app/package-lock.json | 965 +- .../utils/client-ws-app/package.json | 10 +- .../utils/client-ws-app/views/index.pug | 2 +- superset/__init__.py | 1 - superset/advanced_data_type/api.py | 6 +- superset/annotation_layers/annotations/api.py | 10 +- .../annotations/commands/bulk_delete.py | 5 +- .../annotations/commands/create.py | 6 +- .../annotations/commands/delete.py | 4 +- .../annotations/commands/update.py | 4 +- superset/annotation_layers/annotations/dao.py | 3 +- superset/annotation_layers/api.py | 10 +- .../annotation_layers/commands/bulk_delete.py | 5 +- superset/annotation_layers/commands/create.py | 4 +- superset/annotation_layers/commands/delete.py | 4 +- superset/annotation_layers/commands/update.py | 4 +- superset/annotation_layers/dao.py | 3 +- superset/async_events/api.py | 8 +- .../__init__.py | 0 superset/available_domains/api.py | 76 + superset/available_domains/schemas.py | 21 + superset/cachekeys/api.py | 12 +- superset/charts/api.py | 75 +- superset/charts/commands/bulk_delete.py | 8 +- superset/charts/commands/create.py | 9 +- superset/charts/commands/delete.py | 8 +- superset/charts/commands/export.py | 10 +- superset/charts/commands/update.py | 18 +- superset/charts/dao.py | 8 +- superset/charts/data/api.py | 45 +- .../data/commands/create_async_job_command.py | 2 +- .../charts/data/commands/get_data_command.py | 6 +- superset/charts/filters.py | 32 + superset/charts/post_processing.py | 33 +- superset/charts/schemas.py | 32 +- superset/cli/examples.py | 3 + superset/cli/importexport.py | 8 +- superset/cli/thumbnails.py | 9 +- superset/cli/update.py | 40 +- superset/commands/base.py | 14 +- superset/commands/importers/v1/__init__.py | 3 + superset/commands/importers/v1/assets.py | 36 +- superset/commands/importers/v1/examples.py | 1 - superset/commands/importers/v1/utils.py | 6 +- superset/commands/utils.py | 26 +- superset/common/chart_data.py | 7 + superset/common/query_actions.py | 30 +- superset/common/query_context_factory.py | 107 +- superset/common/query_context_processor.py | 176 +- superset/common/query_object.py | 10 +- superset/common/query_object_factory.py | 42 +- superset/common/tags.py | 343 +- superset/common/utils/dataframe_utils.py | 15 +- superset/common/utils/time_range_utils.py | 77 + superset/config.py | 286 +- superset/connectors/base/models.py | 16 +- superset/connectors/connector_registry.py | 164 - superset/connectors/sqla/models.py | 790 +- superset/connectors/sqla/utils.py | 34 +- superset/connectors/sqla/views.py | 55 +- superset/constants.py | 14 +- superset/css_templates/api.py | 4 +- .../css_templates/commands/bulk_delete.py | 5 +- superset/dao/base.py | 21 +- superset/dao/datasource/dao.py | 147 - superset/dao/exceptions.py | 2 + superset/dashboards/api.py | 72 +- superset/dashboards/commands/bulk_delete.py | 8 +- superset/dashboards/commands/create.py | 6 +- superset/dashboards/commands/delete.py | 8 +- superset/dashboards/commands/export.py | 8 +- superset/dashboards/commands/importers/v0.py | 13 +- .../commands/importers/v1/__init__.py | 1 - superset/dashboards/commands/update.py | 12 +- superset/dashboards/dao.py | 37 +- superset/dashboards/filter_sets/api.py | 8 +- .../dashboards/filter_sets/commands/base.py | 17 +- .../dashboards/filter_sets/commands/create.py | 11 +- .../dashboards/filter_sets/commands/delete.py | 5 +- .../dashboards/filter_sets/commands/update.py | 7 +- superset/dashboards/filter_sets/filters.py | 12 +- .../filter_state/commands/create.py | 6 +- .../filter_state/commands/delete.py | 5 +- .../filter_state/commands/update.py | 6 +- superset/dashboards/filters.py | 37 +- superset/dashboards/permalink/api.py | 19 +- .../dashboards/permalink/commands/create.py | 23 +- superset/dashboards/permalink/commands/get.py | 4 +- superset/dashboards/permalink/schemas.py | 16 +- superset/dashboards/permalink/types.py | 5 +- superset/dashboards/schemas.py | 6 +- superset/databases/api.py | 268 +- superset/databases/commands/create.py | 56 +- superset/databases/commands/delete.py | 4 +- superset/databases/commands/exceptions.py | 5 + superset/databases/commands/export.py | 16 +- superset/databases/commands/tables.py | 113 + .../databases/commands/test_connection.py | 129 +- superset/databases/commands/update.py | 109 +- superset/databases/commands/validate.py | 60 +- superset/databases/dao.py | 35 + superset/databases/decorators.py | 5 +- superset/databases/schemas.py | 144 +- superset/databases/ssh_tunnel/__init__.py | 16 + .../databases/ssh_tunnel/commands/__init__.py | 16 + .../databases/ssh_tunnel/commands/create.py | 92 + .../databases/ssh_tunnel/commands/delete.py | 55 + .../ssh_tunnel/commands/exceptions.py | 59 + .../databases/ssh_tunnel/commands/update.py | 63 + superset/databases/ssh_tunnel/dao.py | 49 + superset/databases/ssh_tunnel/models.py | 85 + superset/datasets/api.py | 219 +- superset/datasets/columns/api.py | 4 +- superset/datasets/columns/commands/delete.py | 8 +- superset/datasets/commands/bulk_delete.py | 11 +- superset/datasets/commands/create.py | 27 +- superset/datasets/commands/delete.py | 34 +- superset/datasets/commands/duplicate.py | 133 + superset/datasets/commands/exceptions.py | 8 + superset/datasets/commands/export.py | 16 +- superset/datasets/commands/importers/v0.py | 2 +- .../datasets/commands/importers/v1/utils.py | 65 +- superset/datasets/commands/refresh.py | 8 +- superset/datasets/commands/samples.py | 83 - superset/datasets/commands/update.py | 12 +- superset/datasets/dao.py | 180 +- superset/datasets/metrics/api.py | 4 +- superset/datasets/metrics/commands/delete.py | 8 +- superset/datasets/schemas.py | 23 +- superset/datasource/__init__.py | 16 + superset/datasource/api.py | 130 + superset/datasource/dao.py | 70 + superset/db_engine_specs/__init__.py | 61 +- superset/db_engine_specs/athena.py | 10 +- superset/db_engine_specs/base.py | 449 +- superset/db_engine_specs/bigquery.py | 207 +- superset/db_engine_specs/clickhouse.py | 11 +- superset/db_engine_specs/crate.py | 12 +- superset/db_engine_specs/databricks.py | 314 +- superset/db_engine_specs/dremio.py | 10 +- superset/db_engine_specs/drill.py | 28 +- superset/db_engine_specs/druid.py | 38 +- superset/db_engine_specs/duckdb.py | 16 +- superset/db_engine_specs/dynamodb.py | 65 + superset/db_engine_specs/elasticsearch.py | 12 +- superset/db_engine_specs/exceptions.py | 2 +- superset/db_engine_specs/firebird.py | 14 +- superset/db_engine_specs/firebolt.py | 14 +- superset/db_engine_specs/gsheets.py | 84 +- superset/db_engine_specs/hana.py | 10 +- superset/db_engine_specs/hive.py | 190 +- superset/db_engine_specs/impala.py | 99 +- superset/db_engine_specs/kusto.py | 46 +- superset/db_engine_specs/kylin.py | 10 +- superset/db_engine_specs/mssql.py | 24 +- superset/db_engine_specs/mysql.py | 40 +- superset/db_engine_specs/oracle.py | 16 +- superset/db_engine_specs/pinot.py | 1 - superset/db_engine_specs/postgres.py | 48 +- superset/db_engine_specs/presto.py | 1142 +- .../risingwave.py} | 12 +- superset/db_engine_specs/rockset.py | 16 +- superset/db_engine_specs/shillelagh.py | 6 +- superset/db_engine_specs/snowflake.py | 92 +- superset/db_engine_specs/spark.py | 41 + superset/db_engine_specs/sqlite.py | 46 +- superset/db_engine_specs/teradata.py | 2 +- superset/db_engine_specs/trino.py | 173 +- superset/db_engines/hive.py | 67 - superset/embedded/view.py | 23 +- superset/errors.py | 5 +- superset/examples/bart_lines.py | 48 +- superset/examples/birth_names.py | 142 +- .../dashboards/COVID_Vaccine_Dashboard.yaml | 2 +- superset/examples/country_map.py | 67 +- superset/examples/data_loading.py | 1 + superset/examples/energy.py | 37 +- superset/examples/flights.py | 56 +- superset/examples/helpers.py | 20 +- superset/examples/long_lat.py | 88 +- superset/examples/multiformat_time_series.py | 68 +- superset/examples/paris.py | 44 +- superset/examples/random_time_series.py | 42 +- superset/examples/sf_population_polygons.py | 44 +- .../examples/supported_charts_dashboard.py | 1288 + superset/examples/tabbed_dashboard.py | 34 +- superset/examples/world_bank.py | 61 +- superset/exceptions.py | 12 + superset/explore/api.py | 138 + superset/explore/commands/__init__.py | 16 + superset/explore/commands/get.py | 191 + superset/explore/commands/parameters.py | 30 + superset/explore/exceptions.py | 49 + superset/explore/form_data/api.py | 27 +- superset/explore/form_data/commands/create.py | 10 +- superset/explore/form_data/commands/delete.py | 8 +- superset/explore/form_data/commands/get.py | 2 - .../explore/form_data/commands/parameters.py | 3 - superset/explore/form_data/commands/state.py | 4 +- superset/explore/form_data/commands/update.py | 10 +- superset/explore/form_data/commands/utils.py | 5 +- superset/explore/permalink/api.py | 22 +- superset/explore/permalink/commands/create.py | 9 +- superset/explore/permalink/commands/get.py | 6 +- superset/explore/schemas.py | 114 + superset/explore/utils.py | 22 +- superset/extensions/__init__.py | 5 +- superset/extensions/ssh.py | 92 + .../extensions/stats_logger.py | 23 +- superset/importexport/api.py | 8 +- superset/initialization/__init__.py | 137 +- superset/jinja_context.py | 11 +- superset/key_value/commands/create.py | 12 +- superset/key_value/commands/delete.py | 1 - superset/key_value/commands/delete_expired.py | 1 - superset/key_value/commands/get.py | 1 - superset/key_value/commands/update.py | 12 +- superset/key_value/commands/upsert.py | 27 +- superset/key_value/exceptions.py | 4 + superset/key_value/models.py | 4 +- superset/key_value/utils.py | 12 +- superset/migrations/alembic.ini | 7 +- .../migrations/shared/migrate_viz/__init__.py | 17 + .../migrations/shared/migrate_viz/base.py | 145 + .../shared/migrate_viz/processors.py | 55 + superset/migrations/shared/utils.py | 68 +- ..._08-43_27ae655e4247_make_creator_owners.py | 10 +- ...a_rewriting_url_from_shortner_with_new_.py | 2 +- ..._migrate_num_period_compare_and_period_.py | 2 +- ...26_11-10_c82ee8a39623_add_implicit_tags.py | 9 +- ..._f9a30386bd74_cleanup_time_grainularity.py | 12 +- ...0de1855_add_uuid_column_to_import_mixin.py | 2 +- ...dd_advanced_data_types_to_column_models.py | 4 +- ...add_type_to_native_filter_configuration.py | 4 +- ...9_14-42_b92d69a6643c_rename_csv_to_file.py | 2 +- ...fbb1a5849b_add_embedded_dahshoard_table.py | 2 +- ..._a9422eeaae74_new_dataset_models_take_2.py | 33 +- ...be71abde154_fix_report_schedule_and_log.py | 2 +- ...7_f3afaf1f11f0_add_unique_name_desc_rls.py | 78 + ...b8bca906d2_permalink_rename_filterstate.py | 88 + ...409c7b420ab0_add_created_by_fk_as_owner.py | 135 + ...4daf4_add_user_id_dttm_idx_to_log_model.py | 33 +- ...0_c747c78868b6_migrating_legacy_treemap.py | 47 + ...4-00_06e1e70058c7_migrating_legacy_area.py | 36 + ..._rename_report_schedule_extra_to_extra_.py | 53 + ...39867932713_query_context_to_mediumtext.py | 43 + ...fix_table_chart_conditional_formatting_.py | 82 + ...olumn_allow_multi_schema_metadata_fetch.py | 48 + ...eb4c9d4a4ef_parameters_in_saved_queries.py | 46 + ...c8595_create_ssh_tunnel_credentials_tbl.py | 89 + ...1d9b25135_remove_filter_bar_orientation.py | 65 + superset/models/core.py | 386 +- superset/models/dashboard.py | 78 +- superset/models/datasource_access_request.py | 6 +- superset/models/filter_set.py | 5 +- superset/models/helpers.py | 1441 +- superset/models/slice.py | 53 +- superset/models/sql_lab.py | 187 +- superset/models/sql_types/presto_sql_types.py | 2 +- superset/proxy/api.py | 1 - superset/queries/api.py | 147 +- superset/queries/dao.py | 41 +- superset/queries/filters.py | 4 +- superset/queries/saved_queries/api.py | 15 +- .../saved_queries/commands/bulk_delete.py | 5 +- superset/queries/saved_queries/dao.py | 3 +- superset/queries/schemas.py | 16 + superset/reports/api.py | 28 +- superset/reports/commands/alert.py | 24 +- superset/reports/commands/base.py | 10 +- superset/reports/commands/bulk_delete.py | 11 +- superset/reports/commands/create.py | 42 +- superset/reports/commands/delete.py | 10 +- superset/reports/commands/exceptions.py | 56 +- superset/reports/commands/execute.py | 277 +- superset/reports/commands/log_prune.py | 2 +- superset/reports/commands/update.py | 12 +- superset/reports/dao.py | 19 +- superset/reports/filters.py | 18 +- superset/reports/logs/api.py | 2 +- .../{models/reports.py => reports/models.py} | 26 +- superset/reports/notifications/__init__.py | 2 +- superset/reports/notifications/base.py | 4 +- superset/reports/notifications/email.py | 72 +- superset/reports/notifications/exceptions.py | 30 +- superset/reports/notifications/slack.py | 46 +- superset/reports/schemas.py | 3 +- superset/reports/types.py | 23 + superset/result_set.py | 29 +- superset/security/api.py | 10 +- superset/security/manager.py | 1024 +- superset/sql_lab.py | 68 +- superset/sql_parse.py | 8 +- superset/sql_validators/presto_db.py | 26 +- superset/sqllab/api.py | 311 + superset/sqllab/commands/__init__.py | 16 + .../{command.py => commands/execute.py} | 10 +- superset/sqllab/commands/export.py | 134 + superset/sqllab/commands/results.py | 130 + superset/sqllab/exceptions.py | 11 +- superset/sqllab/query_render.py | 4 +- superset/sqllab/schemas.py | 83 + superset/sqllab/sqllab_execution_context.py | 10 +- superset/sqllab/validators.py | 2 +- superset/tags/__init__.py | 16 + superset/tags/core.py | 89 + superset/{models/tags.py => tags/models.py} | 46 +- superset/tasks/async_queries.py | 170 +- superset/tasks/cache.py | 10 +- superset/tasks/exceptions.py | 24 + superset/tasks/scheduler.py | 27 +- superset/tasks/slack_util.py | 6 +- superset/tasks/thumbnails.py | 52 +- superset/tasks/types.py | 44 + superset/tasks/utils.py | 94 + .../templates/appbuilder/navbar_right.html | 127 - superset/templates/email/role_extended.txt | 2 +- superset/templates/email/role_granted.txt | 2 +- superset/templates/superset/add_slice.html | 35 - superset/templates/superset/basic.html | 2 +- .../superset/form_view/csv_macros.html | 75 + .../superset/form_view/csv_scripts.html | 37 + .../form_view/csv_to_database_view/edit.html | 116 +- .../form_view/database_schemas_selector.html | 2 +- .../superset/models/database/macros.html | 2 +- superset/templates/tail_js_custom_extra.html | 2 +- superset/temporary_cache/api.py | 16 +- .../temporary_cache/commands/parameters.py | 3 - superset/thumbnails/__init__.py | 16 + superset/thumbnails/digest.py | 83 + .../translations/de/LC_MESSAGES/messages.json | 4 +- .../translations/de/LC_MESSAGES/messages.po | 34 +- .../translations/en/LC_MESSAGES/messages.po | 44 +- .../translations/es/LC_MESSAGES/messages.po | 115 +- .../translations/fr/LC_MESSAGES/messages.json | 14 +- .../translations/fr/LC_MESSAGES/messages.po | 34 +- .../translations/it/LC_MESSAGES/messages.po | 34 +- .../translations/ja/LC_MESSAGES/messages.po | 34 +- .../translations/ko/LC_MESSAGES/messages.po | 34 +- superset/translations/messages.pot | 44 +- .../translations/nl/LC_MESSAGES/messages.json | 6 +- .../translations/nl/LC_MESSAGES/messages.po | 34 +- .../translations/pt/LC_MESSAGES/message.po | 30 - .../pt_BR/LC_MESSAGES/messages.po | 34 +- .../translations/ru/LC_MESSAGES/messages.json | 7605 +++- .../translations/ru/LC_MESSAGES/messages.po | 18639 +++++--- .../translations/sk/LC_MESSAGES/messages.po | 34 +- .../translations/sl/LC_MESSAGES/messages.json | 6571 +-- .../translations/sl/LC_MESSAGES/messages.po | 26130 ++++++----- .../translations/zh/LC_MESSAGES/messages.json | 6677 +-- .../translations/zh/LC_MESSAGES/messages.po | 2712 +- superset/utils/async_query_manager.py | 25 +- superset/utils/core.py | 377 +- superset/utils/csv.py | 18 +- .../dashboard_filter_scopes_converter.py | 4 - superset/utils/database.py | 10 +- superset/utils/date_parser.py | 12 +- superset/utils/dates.py | 1 + superset/utils/decorators.py | 12 +- superset/utils/encrypt.py | 15 +- superset/utils/excel.py | 29 + superset/utils/file.py | 23 + superset/utils/log.py | 37 +- superset/utils/machine_auth.py | 8 +- superset/utils/mock_data.py | 48 +- superset/utils/network.py | 25 +- .../utils/pandas_postprocessing/__init__.py | 8 +- .../utils/pandas_postprocessing/boxplot.py | 10 +- .../utils/pandas_postprocessing/flatten.py | 7 +- superset/utils/pandas_postprocessing/pivot.py | 13 - superset/utils/pandas_postprocessing/sort.py | 24 +- superset/utils/pandas_postprocessing/utils.py | 50 +- superset/utils/screenshots.py | 38 +- superset/utils/ssh_tunnel.py | 43 + superset/utils/url_map_converters.py | 2 +- superset/utils/urls.py | 4 +- superset/utils/webdriver.py | 100 +- superset/views/__init__.py | 1 - superset/views/access_requests.py | 7 +- superset/views/annotations.py | 109 +- superset/views/api.py | 3 +- superset/views/base.py | 162 +- superset/views/base_api.py | 197 +- superset/views/base_schemas.py | 7 +- superset/views/chart/views.py | 24 +- superset/views/core.py | 665 +- superset/views/css_templates.py | 7 +- superset/views/dashboard/mixin.py | 8 +- superset/views/dashboard/views.py | 13 +- superset/views/database/forms.py | 192 +- superset/views/database/mixins.py | 9 +- superset/views/database/views.py | 93 +- superset/views/datasource/schemas.py | 43 +- superset/views/datasource/utils.py | 128 + superset/views/datasource/views.py | 80 +- superset/views/explore.py | 49 + superset/views/filters.py | 58 +- superset/views/health.py | 17 +- superset/views/log/api.py | 91 +- superset/views/log/dao.py | 131 + superset/views/log/schemas.py | 45 + superset/views/log/views.py | 5 +- superset/views/redirects.py | 39 +- superset/views/sql_lab/__init__.py | 16 + superset/views/sql_lab/schemas.py | 35 + .../views/{sql_lab.py => sql_lab/views.py} | 42 +- superset/views/tags.py | 30 +- superset/views/users/api.py | 8 +- superset/views/utils.py | 36 +- superset/viz.py | 23 +- tests/common/query_context_generator.py | 6 +- tests/conftest.py | 7 +- tests/integration_tests/access_tests.py | 127 +- .../advanced_data_type/api_tests.py | 18 +- .../annotation_layers/fixtures.py | 2 +- .../available_domains/__init__.py | 16 + .../available_domains/api_tests.py | 30 + tests/integration_tests/base_api_tests.py | 120 +- tests/integration_tests/base_tests.py | 29 +- .../integration_tests/cachekeys/api_tests.py | 28 +- tests/integration_tests/celery_tests.py | 95 +- tests/integration_tests/charts/api_tests.py | 211 +- .../charts/commands_tests.py | 89 +- .../charts/data/api_tests.py | 109 +- tests/integration_tests/cli_tests.py | 24 +- tests/integration_tests/config_tests.py | 173 - tests/integration_tests/conftest.py | 215 +- tests/integration_tests/core_tests.py | 238 +- tests/integration_tests/csv_upload_tests.py | 367 +- tests/integration_tests/dashboard_tests.py | 52 +- tests/integration_tests/dashboard_utils.py | 15 +- .../integration_tests/dashboards/api_tests.py | 272 +- .../integration_tests/dashboards/dao_tests.py | 67 +- .../filter_sets/create_api_tests.py | 9 +- .../filter_sets/delete_api_tests.py | 2 +- .../dashboards/filter_sets/get_api_tests.py | 2 +- .../filter_sets/update_api_tests.py | 2 +- .../dashboards/filter_state/api_tests.py | 242 +- .../dashboards/permalink/api_tests.py | 51 +- .../security/security_dataset_tests.py | 12 +- .../integration_tests/databases/api_tests.py | 598 +- .../databases/commands_tests.py | 154 +- .../databases/schema_tests.py | 153 - .../databases/ssh_tunnel/__init__.py | 16 + .../databases/ssh_tunnel/commands/__init__.py | 16 + .../ssh_tunnel/commands/commands_tests.py | 78 + tests/integration_tests/datasets/api_tests.py | 639 +- .../datasets/commands_tests.py | 53 +- .../integration_tests/datasets/model_tests.py | 87 - .../integration_tests/datasource/__init__.py | 16 + .../integration_tests/datasource/api_tests.py | 137 + tests/integration_tests/datasource_tests.py | 298 +- .../db_engine_specs/base_engine_spec_tests.py | 90 +- .../db_engine_specs/base_tests.py | 14 - .../db_engine_specs/bigquery_tests.py | 39 +- .../db_engine_specs/clickhouse_tests.py | 47 - .../db_engine_specs/crate_tests.py | 53 - .../db_engine_specs/databricks_tests.py | 61 + .../db_engine_specs/druid_tests.py | 78 - .../db_engine_specs/elasticsearch_tests.py | 104 - .../db_engine_specs/firebird_tests.py | 81 - .../db_engine_specs/firebolt_tests.py | 39 - .../db_engine_specs/hive_tests.py | 59 +- .../db_engine_specs/mysql_tests.py | 65 +- .../db_engine_specs/oracle_tests.py | 87 - .../db_engine_specs/postgres_tests.py | 78 +- .../db_engine_specs/presto_tests.py | 215 +- .../db_engine_specs/trino_tests.py | 150 - tests/integration_tests/email_tests.py | 57 + tests/integration_tests/embedded/test_view.py | 72 + tests/integration_tests/event_logger_tests.py | 10 +- tests/integration_tests/explore/api_tests.py | 240 + .../explore/form_data/api_tests.py | 187 +- .../explore/form_data/commands_tests.py | 17 +- .../explore/permalink/api_tests.py | 47 +- .../explore/permalink/commands_tests.py | 8 +- .../fixtures/birth_names_dashboard.py | 37 +- .../integration_tests/fixtures/datasource.py | 2 +- .../fixtures/deck_geojson_form_data.json | 2 +- .../fixtures/deck_path_form_data.json | 2 +- .../fixtures/energy_dashboard.py | 24 +- .../fixtures/importexport.py | 1 + .../fixtures/tabbed_dashboard.py | 102 +- .../dremio_tests.py => fixtures/tags.py} | 26 +- .../fixtures/unicode_dashboard.py | 25 +- .../fixtures/world_bank_dashboard.py | 25 +- .../integration_tests/import_export_tests.py | 46 +- tests/integration_tests/insert_chart_mixin.py | 7 +- .../key_value/commands/create_test.py | 19 +- .../key_value/commands/update_test.py | 37 +- .../key_value/commands/upsert_test.py | 37 +- tests/integration_tests/log_api_tests.py | 183 +- ...06e1e70058c7_migrate_legacy_area__tests.py | 99 + ...78868b6_migrating_legacy_treemap__tests.py | 91 + tests/integration_tests/model_tests.py | 94 +- tests/integration_tests/queries/api_tests.py | 109 +- .../queries/saved_queries/api_tests.py | 16 +- .../integration_tests/query_context_tests.py | 443 +- .../integration_tests/reports/alert_tests.py | 81 + tests/integration_tests/reports/api_tests.py | 241 +- .../commands/create_dashboard_report_tests.py | 91 + .../execute_dashboard_report_tests.py | 113 + .../reports/commands_tests.py | 522 +- .../reports/scheduler_tests.py | 90 +- tests/integration_tests/reports/utils.py | 148 +- tests/integration_tests/result_set_tests.py | 4 +- .../security/migrate_roles_tests.py | 8 +- .../security/row_level_security_tests.py | 93 +- tests/integration_tests/security_tests.py | 1021 +- tests/integration_tests/sql_lab/__init__.py | 16 + tests/integration_tests/sql_lab/api_tests.py | 215 + .../sql_lab/commands_tests.py | 293 + tests/integration_tests/sql_lab/conftest.py | 71 + .../sql_lab/test_execute_sql_statements.py | 56 + .../integration_tests/sql_validator_tests.py | 4 +- tests/integration_tests/sqla_models_tests.py | 235 +- tests/integration_tests/sqllab_tests.py | 109 +- tests/integration_tests/strategy_tests.py | 2 +- .../integration_tests/superset_test_config.py | 9 + tests/integration_tests/tagging_tests.py | 276 + .../tasks/async_queries_tests.py | 85 +- tests/integration_tests/test_app.py | 6 - tests/integration_tests/thumbnails_tests.py | 255 +- .../utils/decorators_tests.py | 61 - tests/integration_tests/utils_tests.py | 73 +- tests/integration_tests/viz_tests.py | 28 +- .../advanced_data_type/types_tests.py | 55 +- .../commands/importers/v1/import_test.py | 4 +- tests/unit_tests/charts/dao/__init__.py | 16 + tests/unit_tests/charts/dao/dao_tests.py | 67 + .../unit_tests/charts/test_post_processing.py | 724 +- tests/unit_tests/columns/test_models.py | 2 +- tests/unit_tests/commands/export_test.py | 2 +- .../unit_tests/commands/importers/__init__.py | 16 + .../commands/importers/v1/__init__.py | 16 + .../commands/importers/v1/assets_test.py | 131 + .../unit_tests/common/test_dataframe_utils.py | 50 + .../common/test_time_range_utils.py | 94 + tests/unit_tests/config_test.py | 330 + tests/unit_tests/conftest.py | 52 +- tests/unit_tests/core_tests.py | 13 +- tests/unit_tests/dao/queries_test.py | 223 +- .../commands/importers/v1/import_test.py | 6 +- .../commands/importers/v1/utils_test.py | 2 +- tests/unit_tests/databases/api_test.py | 289 + .../commands/importers/v1/import_test.py | 16 +- .../commands/test_connection_test.py | 32 + tests/unit_tests/databases/dao/__init__.py | 16 + tests/unit_tests/databases/dao/dao_tests.py | 69 + tests/unit_tests/databases/schema_tests.py | 227 + .../databases/ssh_tunnel/__init__.py | 16 + .../databases/ssh_tunnel/commands/__init__.py | 16 + .../ssh_tunnel/commands/create_test.py | 68 + .../ssh_tunnel/commands/delete_test.py | 73 + .../ssh_tunnel/commands/update_test.py | 93 + .../databases/ssh_tunnel/dao_tests.py | 43 + tests/unit_tests/databases/utils_test.py | 4 +- tests/unit_tests/dataframe_test.py | 102 +- .../datasets/commands/export_test.py | 3 +- .../commands/importers/v1/import_test.py | 265 +- tests/unit_tests/datasets/dao/__init__.py | 16 + tests/unit_tests/datasets/dao/dao_tests.py | 103 + tests/unit_tests/datasets/test_models.py | 1154 - .../dao_tests.py} | 83 +- .../unit_tests/db_engine_specs/test_athena.py | 33 +- tests/unit_tests/db_engine_specs/test_base.py | 52 +- .../db_engine_specs/test_bigquery.py | 177 +- .../db_engine_specs/test_clickhouse.py | 55 + .../unit_tests/db_engine_specs/test_crate.py | 71 + .../db_engine_specs/test_databricks.py | 246 + .../unit_tests/db_engine_specs/test_dremio.py | 42 + .../unit_tests/db_engine_specs/test_drill.py | 51 +- .../unit_tests/db_engine_specs/test_druid.py | 95 + .../unit_tests/db_engine_specs/test_duckdb.py | 40 + .../db_engine_specs/test_dynamodb.py | 40 + .../db_engine_specs/test_elasticsearch.py | 106 + .../db_engine_specs/test_firebird.py | 102 + .../db_engine_specs/test_firebolt.py | 57 + .../db_engine_specs/test_gsheets.py | 141 +- .../db_engine_specs/test_hana.py} | 34 +- tests/unit_tests/db_engine_specs/test_hive.py | 44 + .../unit_tests/db_engine_specs/test_impala.py | 40 + tests/unit_tests/db_engine_specs/test_init.py | 80 + .../unit_tests/db_engine_specs/test_kusto.py | 61 +- .../unit_tests/db_engine_specs/test_kylin.py | 40 + .../unit_tests/db_engine_specs/test_mssql.py | 91 +- .../unit_tests/db_engine_specs/test_mysql.py | 130 + .../unit_tests/db_engine_specs/test_oracle.py | 113 + .../db_engine_specs/test_postgres.py | 91 + .../unit_tests/db_engine_specs/test_presto.py | 44 +- .../db_engine_specs/test_rockset.py | 41 + .../db_engine_specs/test_snowflake.py | 68 +- .../unit_tests/db_engine_specs/test_sqlite.py | 88 +- .../db_engine_specs/test_teradata.py | 2 - .../unit_tests/db_engine_specs/test_trino.py | 348 +- tests/unit_tests/db_engine_specs/utils.py | 67 + tests/unit_tests/explore/api_test.py | 30 + tests/unit_tests/explore/utils_test.py | 148 +- tests/unit_tests/fixtures/__init__.py | 16 + tests/unit_tests/fixtures/assets_configs.py | 260 + tests/unit_tests/importexport/api_test.py | 70 +- tests/unit_tests/jinja_context_test.py | 2 +- tests/unit_tests/models/__init__.py | 16 + tests/unit_tests/models/core_test.py | 147 + tests/unit_tests/notifications/email_tests.py | 54 + .../pandas_postprocessing/test_compare.py | 2 - .../pandas_postprocessing/test_cum.py | 4 - .../pandas_postprocessing/test_flatten.py | 19 + .../pandas_postprocessing/test_pivot.py | 129 +- .../pandas_postprocessing/test_resample.py | 2 - .../pandas_postprocessing/test_rolling.py | 6 - .../pandas_postprocessing/test_sort.py | 29 +- .../pandas_postprocessing/test_utils.py | 30 + tests/unit_tests/result_set_test.py | 77 +- tests/unit_tests/sql_lab_test.py | 3 +- tests/unit_tests/sql_parse_tests.py | 24 +- tests/unit_tests/tables/test_models.py | 2 +- tests/unit_tests/tasks/__init__.py | 16 + tests/unit_tests/tasks/test_cron_util.py | 11 +- tests/unit_tests/tasks/test_utils.py | 323 + tests/unit_tests/test_jinja_context.py | 39 +- tests/unit_tests/thumbnails/__init__.py | 16 + tests/unit_tests/thumbnails/test_digest.py | 258 + tests/unit_tests/utils/cache_test.py | 2 +- tests/unit_tests/utils/date_parser_tests.py | 4 +- .../utils/log_tests.py} | 29 +- tests/unit_tests/utils/test_core.py | 86 + tests/unit_tests/utils/test_decorators.py | 87 + tests/unit_tests/utils/test_file.py | 44 + tests/unit_tests/utils/urls_tests.py | 11 +- 2154 files changed, 185167 insertions(+), 89081 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/chromatic-master.yml create mode 100644 .github/workflows/license-check.yml rename .github/workflows/{misc.yml => prefer-typescript.yml} (55%) create mode 100644 .markdownlint.json create mode 100644 RELEASING/release-notes-2-0/README.md create mode 100644 RELEASING/release-notes-2-0/changelog.md create mode 100644 docs/docs/databases/dynamodb.mdx create mode 100644 docs/docs/databases/kusto.mdx create mode 100644 docs/docs/databases/risingwave.mdx create mode 100644 docs/docs/databases/timescaledb.mdx create mode 100644 docs/static/img/applitools.png create mode 100644 docs/static/img/dashboard.jpg delete mode 100644 docs/static/img/dashboard3.png create mode 100644 docs/static/img/databases/databricks.png create mode 100644 docs/static/img/databases/timescale.png create mode 100644 docs/static/img/explore.jpg delete mode 100644 docs/static/img/explorer5.jpg create mode 100644 docs/static/img/sql_lab.jpg delete mode 100644 docs/static/img/sqllab5.jpg create mode 100644 docs/static/script/matomo.js create mode 100644 helm/superset/Chart.lock create mode 100644 helm/superset/README.md create mode 100644 helm/superset/README.md.gotmpl create mode 100644 helm/superset/templates/deployment-flower.yaml create mode 100644 helm/superset/templates/deployment-ws.yaml create mode 100644 helm/superset/templates/secret-ws.yaml delete mode 100644 helm/superset/values.schema.json create mode 100644 superset-frontend/cypress-base/cypress/fixtures/charts.json create mode 100644 superset-frontend/cypress-base/cypress/fixtures/dashboards.json delete mode 100644 superset-frontend/cypress-base/cypress/fixtures/example.json delete mode 100644 superset-frontend/cypress-base/cypress/integration/chart_list/card_view.test.ts create mode 100644 superset-frontend/cypress-base/cypress/integration/chart_list/list.test.ts delete mode 100644 superset-frontend/cypress-base/cypress/integration/chart_list/list_view.test.ts rename superset-frontend/cypress-base/cypress/integration/dashboard/{controls.test.ts => _skip.controls.test.ts} (92%) rename superset-frontend/cypress-base/cypress/integration/dashboard/{filter.test.ts => _skip.filter.test.ts} (91%) rename superset-frontend/cypress-base/cypress/integration/dashboard/{key_value.test.ts => _skip.key_value.test.ts} (90%) rename superset-frontend/cypress-base/cypress/integration/dashboard/{url_params.test.ts => _skip.url_params.test.ts} (83%) create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/actions.test.js delete mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/dashboard.helper.ts create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/drilltodetail.test.ts delete mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/edit_mode.test.js delete mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/edit_properties.test.ts create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/editmode.test.ts delete mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/fav_star.test.js delete mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/markdown.test.ts delete mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/save.test.js rename superset-frontend/cypress-base/cypress/integration/dashboard/{nativeFilter.helper.ts => utils.ts} (71%) delete mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard_list/card_view.test.ts create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard_list/list.test.ts delete mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard_list/list_view.test.ts create mode 100644 superset-frontend/cypress-base/cypress/integration/dataset/dataset_list.test.ts rename superset-frontend/cypress-base/cypress/integration/explore/{AdhocFilters.test.ts => _skip.AdhocFilters.test.ts} (92%) create mode 100644 superset-frontend/cypress-base/cypress/integration/explore/utils.ts rename superset-frontend/cypress-base/cypress/integration/sqllab/{sourcePanel.index.test.js => _skip.sourcePanel.index.test.js} (94%) create mode 100644 superset-frontend/cypress-base/cypress/utils/urls.ts create mode 100644 superset-frontend/packages/superset-ui-chart-controls/src/fixtures.ts create mode 100644 superset-frontend/packages/superset-ui-chart-controls/src/sections/echartsTimeSeriesQuery.tsx create mode 100644 superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx create mode 100644 superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.ts delete mode 100644 superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx create mode 100644 superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/mixins.tsx create mode 100644 superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx create mode 100644 superset-frontend/packages/superset-ui-chart-controls/src/utils/getStandardizedControls.ts create mode 100644 superset-frontend/packages/superset-ui-chart-controls/src/utils/getTemporalColumns.ts create mode 100644 superset-frontend/packages/superset-ui-chart-controls/test/utils/getStandardizedControls.test.ts create mode 100644 superset-frontend/packages/superset-ui-chart-controls/test/utils/getTemporalColumns.test.ts create mode 100644 superset-frontend/packages/superset-ui-core/src/api/types/core.ts create mode 100644 superset-frontend/packages/superset-ui-core/src/query/getXAxis.ts create mode 100644 superset-frontend/packages/superset-ui-core/src/query/normalizeTimeColumn.ts create mode 100644 superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts delete mode 100644 superset-frontend/packages/superset-ui-core/src/ui-overrides/UiOverrideRegistry.ts create mode 100644 superset-frontend/packages/superset-ui-core/src/utils/lruCache.ts create mode 100644 superset-frontend/packages/superset-ui-core/test/query/getAxis.test.ts create mode 100644 superset-frontend/packages/superset-ui-core/test/query/normalizeTimeColumn.test.ts create mode 100644 superset-frontend/packages/superset-ui-core/test/query/types/Column.test.ts rename superset-frontend/packages/{superset-ui-chart-controls/src/shared-controls/legacySortBy.tsx => superset-ui-core/test/query/types/Datasource.test.ts} (60%) create mode 100644 superset-frontend/packages/superset-ui-core/test/query/types/Metric.test.ts rename superset-frontend/packages/superset-ui-core/test/ui-overrides/{UiOverrideRegistry.test.ts => ExtensionsRegistry.test.ts} (81%) create mode 100644 superset-frontend/packages/superset-ui-core/test/utils/lruCache.test.ts create mode 100644 superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/AreaTimeseries/Stories.tsx create mode 100644 superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/AreaTimeseries/data.ts create mode 100644 superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Sunburst/Stories.tsx create mode 100644 superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Sunburst/data.ts create mode 100644 superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Timeseries/confbandData.ts create mode 100644 superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Timeseries/stackWithNulls.ts create mode 100644 superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-pivot-table/PivotTableStories.tsx create mode 100644 superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-pivot-table/testData.ts create mode 100644 superset-frontend/plugins/legacy-plugin-chart-calendar/src/images/example.jpg create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/argentina.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/bolivia.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/chile.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/colombia.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/costa rica.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/cuba.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/dominican republic.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/ecuador.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/el salvador.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/guatemala.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/haiti.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/honduras.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/latvia.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/nicaragua.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/panama.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/papua new guinea.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/paraguay.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/puerto rico.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/saint barthelemy.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/saint martin.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/turkey.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/venezuela.geojson create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/images/exampleGermany.jpg create mode 100644 superset-frontend/plugins/legacy-plugin-chart-country-map/src/images/exampleUsa.jpg create mode 100644 superset-frontend/plugins/legacy-plugin-chart-event-flow/src/images/example.jpg rename superset-frontend/plugins/legacy-plugin-chart-heatmap/src/{controlPanel.ts => controlPanel.tsx} (82%) create mode 100644 superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/images/example1.jpg create mode 100644 superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/images/example2.jpg create mode 100644 superset-frontend/plugins/legacy-plugin-chart-partition/src/images/example.jpg create mode 100644 superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/images/example.jpg create mode 100644 superset-frontend/plugins/legacy-plugin-chart-rose/src/images/example1.jpg create mode 100644 superset-frontend/plugins/legacy-plugin-chart-rose/src/images/example2.jpg create mode 100644 superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/images/example.jpg create mode 100644 superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/images/example.jpg create mode 100644 superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/images/example.jpg create mode 100644 superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/images/example.jpg create mode 100644 superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/images/example.jpg create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Funnel/images/example.jpg create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Gauge/images/example1.jpg create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Gauge/images/example2.jpg create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Graph/images/example.jpg create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/images/example.jpg create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Radar/images/example1.jpg create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Radar/images/example2.jpg create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/EchartsSunburst.tsx create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/buildQuery.ts create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/images/Sunburst1.png create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/images/Sunburst2.png create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/images/thumbnail.png create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/index.ts create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/transformProps.ts create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/types.ts rename superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/{ => Regular/Line}/controlPanel.tsx (78%) rename superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/{ => SmoothLine}/controlPanel.tsx (79%) create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/constants.ts create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/utils/eventHandlers.ts create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/utils/tooltip.ts create mode 100644 superset-frontend/plugins/plugin-chart-echarts/src/utils/treeBuilder.ts create mode 100644 superset-frontend/plugins/plugin-chart-echarts/test/utils/treeBuilder.test.ts delete mode 100644 superset-frontend/plugins/plugin-chart-handlebars/src/i18n.ts create mode 100644 superset-frontend/plugins/plugin-chart-handlebars/src/images/example1.jpg create mode 100644 superset-frontend/plugins/plugin-chart-handlebars/src/images/example2.jpg create mode 100644 superset-frontend/plugins/plugin-chart-pivot-table/src/images/example.jpg create mode 100644 superset-frontend/spec/fixtures/mockCharts.ts create mode 100644 superset-frontend/src/SqlLab/SqlLabGlobalStyles.tsx create mode 100644 superset-frontend/src/SqlLab/components/AceEditorWrapper/AceEditorWrapper.test.tsx create mode 100644 superset-frontend/src/SqlLab/components/EstimateQueryCostButton/EstimateQueryCostButton.test.tsx delete mode 100644 superset-frontend/src/SqlLab/components/QueryAutoRefresh/QueryAutoRefresh.test.jsx create mode 100644 superset-frontend/src/SqlLab/components/QueryAutoRefresh/QueryAutoRefresh.test.tsx delete mode 100644 superset-frontend/src/SqlLab/components/QueryAutoRefresh/index.jsx create mode 100644 superset-frontend/src/SqlLab/components/QueryAutoRefresh/index.tsx create mode 100644 superset-frontend/src/SqlLab/components/QueryLimitSelect/QueryLimitSelect.test.tsx create mode 100644 superset-frontend/src/SqlLab/components/QueryLimitSelect/index.tsx delete mode 100644 superset-frontend/src/SqlLab/components/QuerySearch/QuerySearch.test.jsx delete mode 100644 superset-frontend/src/SqlLab/components/QuerySearch/index.tsx delete mode 100644 superset-frontend/src/SqlLab/components/ResultSet/ResultSet.test.jsx create mode 100644 superset-frontend/src/SqlLab/components/ResultSet/ResultSet.test.tsx delete mode 100644 superset-frontend/src/SqlLab/components/RunQueryActionButton/RunQueryActionButton.test.jsx create mode 100644 superset-frontend/src/SqlLab/components/RunQueryActionButton/RunQueryActionButton.test.tsx create mode 100644 superset-frontend/src/SqlLab/components/SaveDatasetActionButton/SaveDatasetActionButton.test.tsx create mode 100644 superset-frontend/src/SqlLab/components/SaveDatasetActionButton/index.tsx delete mode 100644 superset-frontend/src/SqlLab/components/SaveQuery/SaveQuery.test.jsx create mode 100644 superset-frontend/src/SqlLab/components/SaveQuery/SaveQuery.test.tsx rename superset-frontend/src/SqlLab/components/ShareSqlLabQuery/{ShareSqlLabQuery.test.jsx => ShareSqlLabQuery.test.tsx} (65%) create mode 100644 superset-frontend/src/SqlLab/components/SqlEditorTabHeader/SqlEditorTabHeader.test.tsx create mode 100644 superset-frontend/src/SqlLab/components/SqlEditorTabHeader/index.tsx rename superset-frontend/src/SqlLab/components/TabStatusIcon/{TabStatusIcon.test.jsx => TabStatusIcon.test.tsx} (72%) create mode 100644 superset-frontend/src/SqlLab/hooks/useQueryEditor/index.ts create mode 100644 superset-frontend/src/SqlLab/hooks/useQueryEditor/useQueryEditor.test.ts delete mode 100644 superset-frontend/src/SqlLab/main.less create mode 100644 superset-frontend/src/SqlLab/utils/useInterval.ts delete mode 100644 superset-frontend/src/addSlice/AddSliceContainer.test.tsx delete mode 100644 superset-frontend/src/addSlice/App.tsx create mode 100644 superset-frontend/src/assets/images/databricks.png create mode 100644 superset-frontend/src/assets/images/empty-dataset.svg create mode 100644 superset-frontend/src/assets/images/empty-table.svg create mode 100644 superset-frontend/src/assets/images/no-columns.svg create mode 100644 superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/Buttons.css create mode 100644 superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/ExpandAllValueRenderer.tsx create mode 100644 superset-frontend/src/components/Chart/ChartContextMenu.tsx create mode 100644 superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.test.tsx create mode 100644 superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx create mode 100644 superset-frontend/src/components/Chart/DrillDetail/DrillDetailModal.test.tsx create mode 100644 superset-frontend/src/components/Chart/DrillDetail/DrillDetailModal.tsx create mode 100644 superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.test.tsx create mode 100644 superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.tsx create mode 100644 superset-frontend/src/components/Chart/DrillDetail/DrillDetailTableControls.test.tsx create mode 100644 superset-frontend/src/components/Chart/DrillDetail/DrillDetailTableControls.tsx rename superset-frontend/{cypress-base/cypress/integration/dashboard_list/dashboard_list.helper.ts => src/components/Chart/DrillDetail/index.ts} (91%) rename superset-frontend/src/{views/CRUD/chart => components/Chart/DrillDetail}/types.ts (60%) create mode 100644 superset-frontend/src/components/Chart/DrillDetail/utils.ts create mode 100644 superset-frontend/src/components/Chart/utils.test.ts create mode 100644 superset-frontend/src/components/Chart/utils.ts rename superset-frontend/src/components/{Select => DeprecatedSelect}/DeprecatedSelect.stories.tsx (100%) rename superset-frontend/src/components/{Select => DeprecatedSelect}/DeprecatedSelect.tsx (99%) rename superset-frontend/src/components/{Select => DeprecatedSelect}/NativeSelect.tsx (100%) rename superset-frontend/src/components/{Select => DeprecatedSelect}/OnPasteSelect.jsx (98%) rename superset-frontend/src/components/{Select => DeprecatedSelect}/OnPasteSelect.test.jsx (97%) rename superset-frontend/src/components/{Select => DeprecatedSelect}/WindowedSelect/WindowedMenuList.tsx (98%) rename superset-frontend/src/components/{Select => DeprecatedSelect}/WindowedSelect/index.tsx (100%) rename superset-frontend/src/components/{Select => DeprecatedSelect}/WindowedSelect/windowed.tsx (85%) rename superset-frontend/src/components/{Select => DeprecatedSelect}/index.ts (100%) create mode 100644 superset-frontend/src/components/DeprecatedSelect/styles.tsx rename superset-frontend/src/components/{Select => DeprecatedSelect}/utils.ts (66%) create mode 100644 superset-frontend/src/components/DesignSystem.stories.mdx create mode 100644 superset-frontend/src/components/DropdownContainer/DropdownContainer.stories.tsx create mode 100644 superset-frontend/src/components/DropdownContainer/DropdownContainer.test.tsx create mode 100644 superset-frontend/src/components/DropdownContainer/Overview.stories.mdx create mode 100644 superset-frontend/src/components/DropdownContainer/index.tsx create mode 100644 superset-frontend/src/components/DropdownSelectableIcon/DropdownSelectableIcon.stories.tsx create mode 100644 superset-frontend/src/components/DropdownSelectableIcon/DropdownSelectableIcon.test.tsx create mode 100644 superset-frontend/src/components/DropdownSelectableIcon/index.tsx create mode 100644 superset-frontend/src/components/GenericLink/GenericLink.test.tsx create mode 100644 superset-frontend/src/components/GenericLink/GenericLink.tsx create mode 100644 superset-frontend/src/components/ListView/CrossLinks.test.tsx create mode 100644 superset-frontend/src/components/ListView/CrossLinks.tsx create mode 100644 superset-frontend/src/components/ListView/CrossLinksTooltip.test.tsx create mode 100644 superset-frontend/src/components/ListView/CrossLinksTooltip.tsx create mode 100644 superset-frontend/src/components/MetadataBar/ContentConfig.tsx create mode 100644 superset-frontend/src/components/MetadataBar/ContentType.ts create mode 100644 superset-frontend/src/components/MetadataBar/MetadataBar.stories.mdx create mode 100644 superset-frontend/src/components/MetadataBar/MetadataBar.stories.tsx create mode 100644 superset-frontend/src/components/MetadataBar/MetadataBar.test.tsx create mode 100644 superset-frontend/src/components/MetadataBar/MetadataBar.tsx rename superset-frontend/{packages/superset-ui-chart-controls/test/shared-controls/emitFilterControl.test.tsx => src/components/MetadataBar/index.tsx} (77%) delete mode 100644 superset-frontend/src/components/ModalTrigger/index.jsx create mode 100644 superset-frontend/src/components/ModalTrigger/index.tsx create mode 100644 superset-frontend/src/components/ResizableSidebar/index.tsx create mode 100644 superset-frontend/src/components/ResizableSidebar/useStoredSidebarWidth.test.ts create mode 100644 superset-frontend/src/components/ResizableSidebar/useStoredSidebarWidth.ts create mode 100644 superset-frontend/src/components/Select/AsyncSelect.stories.tsx create mode 100644 superset-frontend/src/components/Select/AsyncSelect.test.tsx create mode 100644 superset-frontend/src/components/Select/AsyncSelect.tsx create mode 100644 superset-frontend/src/components/Select/CustomTag.tsx create mode 100644 superset-frontend/src/components/Select/constants.ts create mode 100644 superset-frontend/src/components/Select/types.ts create mode 100644 superset-frontend/src/components/Select/utils.tsx create mode 100644 superset-frontend/src/components/Table/Table.overview.mdx create mode 100644 superset-frontend/src/components/Table/Table.stories.tsx create mode 100644 superset-frontend/src/components/Table/Table.test.tsx create mode 100644 superset-frontend/src/components/Table/VirtualTable.tsx create mode 100644 superset-frontend/src/components/Table/cell-renderers/ActionCell/ActionCell.overview.mdx create mode 100644 superset-frontend/src/components/Table/cell-renderers/ActionCell/ActionCell.stories.tsx create mode 100644 superset-frontend/src/components/Table/cell-renderers/ActionCell/ActionCell.test.tsx create mode 100644 superset-frontend/src/components/Table/cell-renderers/ActionCell/fixtures.ts create mode 100644 superset-frontend/src/components/Table/cell-renderers/ActionCell/index.tsx create mode 100644 superset-frontend/src/components/Table/cell-renderers/BooleanCell/BooleanCell.stories.tsx create mode 100644 superset-frontend/src/components/Table/cell-renderers/BooleanCell/BooleanCell.test.tsx create mode 100644 superset-frontend/src/components/Table/cell-renderers/BooleanCell/index.tsx create mode 100644 superset-frontend/src/components/Table/cell-renderers/ButtonCell/ButtonCell.stories.tsx create mode 100644 superset-frontend/src/components/Table/cell-renderers/ButtonCell/ButtonCell.test.tsx rename superset-frontend/src/{dashboard/stylesheets/builder.less => components/Table/cell-renderers/ButtonCell/index.tsx} (51%) rename superset-frontend/src/{dashboard/stylesheets/index.less => components/Table/cell-renderers/NullCell/NullCell.stories.tsx} (70%) rename superset-frontend/src/{explore/reducers/index.js => components/Table/cell-renderers/NullCell/NullCell.test.tsx} (60%) create mode 100644 superset-frontend/src/components/Table/cell-renderers/NullCell/index.tsx rename superset-frontend/src/{explore/components/controls/ColorSchemeControl/ColorScheme.test.jsx => components/Table/cell-renderers/NumericCell/NumericCell.stories.tsx} (55%) rename superset-frontend/src/{explore/exploreUtils/getAnnotationJsonUrl.test.ts => components/Table/cell-renderers/NumericCell/NumericCell.test.tsx} (51%) create mode 100644 superset-frontend/src/components/Table/cell-renderers/NumericCell/index.tsx rename superset-frontend/src/{dashboard/stylesheets/components/markdown.less => components/Table/cell-renderers/TimeCell/TimeCell.stories.tsx} (57%) create mode 100644 superset-frontend/src/components/Table/cell-renderers/TimeCell/TimeCell.test.tsx create mode 100644 superset-frontend/src/components/Table/cell-renderers/TimeCell/index.tsx create mode 100644 superset-frontend/src/components/Table/cell-renderers/fixtures.ts create mode 100644 superset-frontend/src/components/Table/header-renderers/HeaderWithRadioGroup.tsx create mode 100644 superset-frontend/src/components/Table/index.tsx create mode 100644 superset-frontend/src/components/Table/sorters.test.ts rename superset-frontend/src/{SqlLab/components/SouthPane/state.ts => components/Table/sorters.ts} (56%) create mode 100644 superset-frontend/src/components/Table/utils/InteractiveTableUtils.ts create mode 100644 superset-frontend/src/components/Table/utils/utils.test.ts create mode 100644 superset-frontend/src/components/Table/utils/utils.ts create mode 100644 superset-frontend/src/components/TruncatedList/index.tsx create mode 100644 superset-frontend/src/components/atomic-design.png create mode 100644 superset-frontend/src/dashboard/actions/sliceEntities.test.js delete mode 100644 superset-frontend/src/dashboard/components/AddSliceCard.jsx create mode 100644 superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.test.tsx create mode 100644 superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.tsx rename superset-frontend/{cypress-base/cypress/integration/chart_list/chart_list.helper.ts => src/dashboard/components/AddSliceCard/index.ts} (91%) delete mode 100644 superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.test.jsx create mode 100644 superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.test.tsx create mode 100644 superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirm.test.tsx create mode 100644 superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.test.tsx create mode 100644 superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.tsx rename superset-frontend/src/dashboard/{stylesheets/components/new-component.less => components/OverwriteConfirm/index.tsx} (54%) delete mode 100644 superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx delete mode 100644 superset-frontend/src/dashboard/components/gridComponents/ChartHolder.test.jsx create mode 100644 superset-frontend/src/dashboard/components/gridComponents/ChartHolder.tsx create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/FilterBarSettings.test.tsx create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/index.tsx create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.stories.tsx create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.test.tsx create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.tsx create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FiltersDropdownContent/index.tsx create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FiltersOutOfScopeCollapsible/index.tsx create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FilterBar/HorizontalFilterBar.test.tsx create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FilterBar/types.ts create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FilterBar/useFilterControlFactory.tsx create mode 100644 superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.test.ts delete mode 100644 superset-frontend/src/dashboard/stylesheets/builder-sidepane.less delete mode 100644 superset-frontend/src/dashboard/stylesheets/components/chart.less delete mode 100644 superset-frontend/src/dashboard/stylesheets/components/column.less delete mode 100644 superset-frontend/src/dashboard/stylesheets/components/header.less delete mode 100644 superset-frontend/src/dashboard/stylesheets/components/index.less delete mode 100644 superset-frontend/src/dashboard/stylesheets/components/row.less delete mode 100644 superset-frontend/src/dashboard/stylesheets/dashboard.less delete mode 100644 superset-frontend/src/dashboard/stylesheets/dnd.less delete mode 100644 superset-frontend/src/dashboard/stylesheets/filter-scope-selector.less delete mode 100644 superset-frontend/src/dashboard/stylesheets/popover-menu.less delete mode 100644 superset-frontend/src/dashboard/stylesheets/resizable.less create mode 100644 superset-frontend/src/dashboard/util/crossFilters.ts rename superset-frontend/src/dashboard/util/{findParentId.test.js => findParentId.test.ts} (79%) create mode 100644 superset-frontend/src/dashboard/util/findParentId.ts create mode 100644 superset-frontend/src/dashboard/util/getOverwriteItems.test.ts create mode 100644 superset-frontend/src/dashboard/util/getOverwriteItems.ts create mode 100644 superset-frontend/src/dashboard/util/getSliceHeaderTooltip.tsx rename superset-frontend/src/dashboard/util/{findPermission.test.ts => permissionUtils.test.ts} (74%) rename superset-frontend/src/dashboard/util/{findPermission.ts => permissionUtils.ts} (78%) create mode 100644 superset-frontend/src/dashboard/util/useFilterFocusHighlightStyles.test.tsx create mode 100644 superset-frontend/src/dashboard/util/useFilterFocusHighlightStyles.ts create mode 100644 superset-frontend/src/embedded/api.tsx delete mode 100644 superset-frontend/src/explore/App.jsx create mode 100644 superset-frontend/src/explore/ExplorePage.tsx create mode 100644 superset-frontend/src/explore/actions/datasourcesActions.test.ts create mode 100644 superset-frontend/src/explore/actions/datasourcesActions.ts create mode 100644 superset-frontend/src/explore/actions/hydrateExplore.test.ts create mode 100644 superset-frontend/src/explore/actions/hydrateExplore.ts create mode 100644 superset-frontend/src/explore/actions/saveModalActions.test.js create mode 100644 superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeLabel.test.tsx create mode 100644 superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeLabel.tsx delete mode 100644 superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx create mode 100644 superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx create mode 100644 superset-frontend/src/explore/components/controls/DateFilterControl/components/DateLabel.tsx rename superset-frontend/src/explore/components/controls/DateFilterControl/{components => tests}/AdvancedFrame.test.tsx (97%) rename superset-frontend/src/explore/components/controls/DateFilterControl/{components => tests}/CustomFrame.test.tsx (95%) create mode 100644 superset-frontend/src/explore/components/controls/DateFilterControl/tests/DateFilterLabel.test.tsx rename superset-frontend/src/explore/components/controls/DateFilterControl/{utils => tests}/utils.test.ts (100%) create mode 100644 superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndAdhocFilterOption.tsx delete mode 100644 superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/index.jsx create mode 100644 superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/index.tsx create mode 100644 superset-frontend/src/explore/components/controls/FilterControl/utils/index.ts create mode 100644 superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocFilter.tsx create mode 100644 superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocfilter.test.ts create mode 100644 superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.test.ts create mode 100644 superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.tsx create mode 100644 superset-frontend/src/explore/components/controls/ViewQuery.tsx create mode 100644 superset-frontend/src/explore/components/controls/ViewQueryModalFooter.tsx rename superset-frontend/src/{dashboard/stylesheets/components/divider.less => explore/components/controls/XAxisSortControl.tsx} (61%) create mode 100644 superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/DashboardsSubMenu.test.tsx create mode 100644 superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/DashboardsSubMenu.tsx create mode 100644 superset-frontend/src/explore/controlUtils/getControlValuesCompatibleWithDatasource.test.ts create mode 100644 superset-frontend/src/explore/controlUtils/getFormDataFromDashboardContext.test.ts create mode 100644 superset-frontend/src/explore/controlUtils/getFormDataWithDashboardContext.ts create mode 100644 superset-frontend/src/explore/exploreUtils/getParsedExploreURLParams.test.ts create mode 100644 superset-frontend/src/explore/exploreUtils/getParsedExploreURLParams.ts delete mode 100644 superset-frontend/src/explore/index.jsx delete mode 100644 superset-frontend/src/explore/main.less rename superset-frontend/src/{dashboard/util/findParentId.js => explore/reducers/datasourcesReducer.ts} (51%) delete mode 100644 superset-frontend/src/explore/reducers/getInitialState.ts create mode 100644 superset-frontend/src/hooks/apiResources/schemas.test.ts create mode 100644 superset-frontend/src/hooks/apiResources/schemas.ts create mode 100644 superset-frontend/src/hooks/apiResources/tables.test.ts create mode 100644 superset-frontend/src/hooks/apiResources/tables.ts rename superset-frontend/src/{explore/components/DataTablesPane/utils.ts => hooks/useTruncation/index.ts} (80%) create mode 100644 superset-frontend/src/hooks/useTruncation/useCSSTextTruncation.ts rename superset-frontend/src/{dashboard/components/nativeFilters/FilterCard/useTruncation.ts => hooks/useTruncation/useChildElementTruncation.ts} (62%) create mode 100644 superset-frontend/src/pages/ChartCreation/ChartCreation.test.tsx rename superset-frontend/src/{addSlice/AddSliceContainer.tsx => pages/ChartCreation/index.tsx} (62%) rename superset-frontend/src/{views/CRUD/chart => pages/ChartList}/ChartCard.tsx (96%) rename superset-frontend/src/{views/CRUD/chart => pages/ChartList}/ChartList.test.jsx (98%) rename superset-frontend/src/{views/CRUD/chart/ChartList.tsx => pages/ChartList/index.tsx} (87%) rename superset-frontend/src/setup/{setupDasboardComponents.ts => setupDashboardComponents.ts} (100%) rename superset-frontend/{cypress-base/cypress/integration/alerts_and_reports/alert_report.helper.ts => src/setup/setupExtensions.ts} (88%) rename superset-frontend/{cypress-base/cypress/integration/database/helper.ts => src/types/ChartSource.ts} (91%) create mode 100644 superset-frontend/src/types/DashboardContextForExplore.ts create mode 100644 superset-frontend/src/utils/datasourceUtils.js create mode 100644 superset-frontend/src/utils/findPermission.test.ts create mode 100644 superset-frontend/src/utils/findPermission.ts create mode 100644 superset-frontend/src/utils/getBootstrapData.ts create mode 100644 superset-frontend/src/utils/getDatasourceUid.test.ts rename superset-frontend/src/{addSlice/index.tsx => utils/getDatasourceUid.ts} (81%) create mode 100644 superset-frontend/src/utils/isBot.ts create mode 100644 superset-frontend/src/utils/isDashboardVirtualizationEnabled.ts create mode 100644 superset-frontend/src/utils/urlUtils.test.ts create mode 100644 superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx create mode 100644 superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelSwitch.tsx delete mode 100644 superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.jsx create mode 100644 superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/AddDataset.test.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.stories.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.test.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/MessageContent.tsx rename superset-frontend/{packages/superset-ui-chart-controls/src/shared-controls/emitFilterControl.tsx => src/views/CRUD/data/dataset/AddDataset/DatasetPanel/fixtures.ts} (57%) create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/index.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/types.ts create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/EditDataset.test.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/UsageTab/UsageTab.test.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/UsageTab/index.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/index.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/Footer/Footer.test.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/Footer/index.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/Header.test.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/index.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/LeftPanel.test.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/index.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/RightPanel/RightPanel.test.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/RightPanel/index.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDataset/index.tsx rename superset-frontend/src/{dashboard/stylesheets/grid.less => views/CRUD/data/dataset/AddDataset/types.tsx} (50%) delete mode 100644 superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/DatasetLayout/DatasetLayout.test.tsx create mode 100644 superset-frontend/src/views/CRUD/data/dataset/DatasetLayout/index.tsx rename superset-frontend/src/views/CRUD/data/dataset/{DatasetList.test.jsx => DatasetList.test.tsx} (79%) create mode 100644 superset-frontend/src/views/CRUD/data/dataset/styles.ts create mode 100644 superset-frontend/src/views/QueryProvider.tsx create mode 100644 superset-frontend/src/views/components/RightMenu.test.tsx rename superset-frontend/src/views/components/{MenuRight.tsx => RightMenu.tsx} (65%) create mode 100644 superset-frontend/src/visualizations/FilterBox/images/example1.jpg create mode 100644 superset-frontend/src/visualizations/FilterBox/images/example2.jpg create mode 100644 superset-frontend/src/visualizations/TimeTable/images/example.jpg rename superset/{db_engines => available_domains}/__init__.py (100%) create mode 100644 superset/available_domains/api.py create mode 100644 superset/available_domains/schemas.py create mode 100644 superset/common/utils/time_range_utils.py delete mode 100644 superset/connectors/connector_registry.py delete mode 100644 superset/dao/datasource/dao.py create mode 100644 superset/databases/commands/tables.py create mode 100644 superset/databases/ssh_tunnel/__init__.py create mode 100644 superset/databases/ssh_tunnel/commands/__init__.py create mode 100644 superset/databases/ssh_tunnel/commands/create.py create mode 100644 superset/databases/ssh_tunnel/commands/delete.py create mode 100644 superset/databases/ssh_tunnel/commands/exceptions.py create mode 100644 superset/databases/ssh_tunnel/commands/update.py create mode 100644 superset/databases/ssh_tunnel/dao.py create mode 100644 superset/databases/ssh_tunnel/models.py create mode 100644 superset/datasets/commands/duplicate.py delete mode 100644 superset/datasets/commands/samples.py create mode 100644 superset/datasource/__init__.py create mode 100644 superset/datasource/api.py create mode 100644 superset/datasource/dao.py create mode 100644 superset/db_engine_specs/dynamodb.py rename superset/{common/request_contexed_based.py => db_engine_specs/risingwave.py} (73%) create mode 100644 superset/db_engine_specs/spark.py delete mode 100644 superset/db_engines/hive.py create mode 100644 superset/examples/supported_charts_dashboard.py create mode 100644 superset/explore/api.py create mode 100644 superset/explore/commands/__init__.py create mode 100644 superset/explore/commands/get.py create mode 100644 superset/explore/commands/parameters.py create mode 100644 superset/explore/exceptions.py create mode 100644 superset/explore/schemas.py create mode 100644 superset/extensions/ssh.py rename tests/integration_tests/db_engine_specs/kylin_tests.py => superset/extensions/stats_logger.py (60%) create mode 100644 superset/migrations/shared/migrate_viz/__init__.py create mode 100644 superset/migrations/shared/migrate_viz/base.py create mode 100644 superset/migrations/shared/migrate_viz/processors.py create mode 100644 superset/migrations/versions/2022-06-19_16-17_f3afaf1f11f0_add_unique_name_desc_rls.py create mode 100644 superset/migrations/versions/2022-06-27_14-59_7fb8bca906d2_permalink_rename_filterstate.py create mode 100644 superset/migrations/versions/2022-07-05_15-48_409c7b420ab0_add_created_by_fk_as_owner.py rename tests/integration_tests/db_engine_specs/drill_tests.py => superset/migrations/versions/2022-07-07_00-00_cdcf3d64daf4_add_user_id_dttm_idx_to_log_model.py (58%) create mode 100644 superset/migrations/versions/2022-07-07_13-00_c747c78868b6_migrating_legacy_treemap.py create mode 100644 superset/migrations/versions/2022-07-07_14-00_06e1e70058c7_migrating_legacy_area.py create mode 100644 superset/migrations/versions/2022-07-11_11-26_ffa79af61a56_rename_report_schedule_extra_to_extra_.py create mode 100644 superset/migrations/versions/2022-07-19_15-16_a39867932713_query_context_to_mediumtext.py create mode 100644 superset/migrations/versions/2022-08-16_15-23_6d3c6f9d665d_fix_table_chart_conditional_formatting_.py create mode 100644 superset/migrations/versions/2022-08-31_19-30_291f024254b5_drop_column_allow_multi_schema_metadata_fetch.py create mode 100644 superset/migrations/versions/2022-10-03_17-34_deb4c9d4a4ef_parameters_in_saved_queries.py create mode 100644 superset/migrations/versions/2022-10-20_10-48_f3c2d8ec8595_create_ssh_tunnel_credentials_tbl.py create mode 100644 superset/migrations/versions/2022-11-28_17-51_4ce1d9b25135_remove_filter_bar_orientation.py rename superset/{models/reports.py => reports/models.py} (92%) create mode 100644 superset/reports/types.py create mode 100644 superset/sqllab/api.py create mode 100644 superset/sqllab/commands/__init__.py rename superset/sqllab/{command.py => commands/execute.py} (96%) create mode 100644 superset/sqllab/commands/export.py create mode 100644 superset/sqllab/commands/results.py create mode 100644 superset/sqllab/schemas.py create mode 100644 superset/tags/__init__.py create mode 100644 superset/tags/core.py rename superset/{models/tags.py => tags/models.py} (84%) create mode 100644 superset/tasks/exceptions.py create mode 100644 superset/tasks/types.py create mode 100644 superset/tasks/utils.py delete mode 100644 superset/templates/appbuilder/navbar_right.html delete mode 100644 superset/templates/superset/add_slice.html create mode 100644 superset/templates/superset/form_view/csv_macros.html create mode 100644 superset/templates/superset/form_view/csv_scripts.html create mode 100644 superset/thumbnails/__init__.py create mode 100644 superset/thumbnails/digest.py create mode 100644 superset/utils/excel.py create mode 100644 superset/utils/file.py create mode 100644 superset/utils/ssh_tunnel.py create mode 100644 superset/views/datasource/utils.py create mode 100644 superset/views/explore.py create mode 100644 superset/views/log/dao.py create mode 100644 superset/views/log/schemas.py create mode 100644 superset/views/sql_lab/__init__.py create mode 100644 superset/views/sql_lab/schemas.py rename superset/views/{sql_lab.py => sql_lab/views.py} (91%) create mode 100644 tests/integration_tests/available_domains/__init__.py create mode 100644 tests/integration_tests/available_domains/api_tests.py delete mode 100644 tests/integration_tests/config_tests.py delete mode 100644 tests/integration_tests/databases/schema_tests.py create mode 100644 tests/integration_tests/databases/ssh_tunnel/__init__.py create mode 100644 tests/integration_tests/databases/ssh_tunnel/commands/__init__.py create mode 100644 tests/integration_tests/databases/ssh_tunnel/commands/commands_tests.py delete mode 100644 tests/integration_tests/datasets/model_tests.py create mode 100644 tests/integration_tests/datasource/__init__.py create mode 100644 tests/integration_tests/datasource/api_tests.py delete mode 100644 tests/integration_tests/db_engine_specs/clickhouse_tests.py delete mode 100644 tests/integration_tests/db_engine_specs/crate_tests.py create mode 100644 tests/integration_tests/db_engine_specs/databricks_tests.py delete mode 100644 tests/integration_tests/db_engine_specs/druid_tests.py delete mode 100644 tests/integration_tests/db_engine_specs/elasticsearch_tests.py delete mode 100644 tests/integration_tests/db_engine_specs/firebird_tests.py delete mode 100644 tests/integration_tests/db_engine_specs/firebolt_tests.py delete mode 100644 tests/integration_tests/db_engine_specs/oracle_tests.py delete mode 100644 tests/integration_tests/db_engine_specs/trino_tests.py create mode 100644 tests/integration_tests/embedded/test_view.py create mode 100644 tests/integration_tests/explore/api_tests.py rename tests/integration_tests/{db_engine_specs/dremio_tests.py => fixtures/tags.py} (57%) create mode 100644 tests/integration_tests/migrations/06e1e70058c7_migrate_legacy_area__tests.py create mode 100644 tests/integration_tests/migrations/c747c78868b6_migrating_legacy_treemap__tests.py create mode 100644 tests/integration_tests/reports/commands/create_dashboard_report_tests.py create mode 100644 tests/integration_tests/reports/commands/execute_dashboard_report_tests.py create mode 100644 tests/integration_tests/sql_lab/__init__.py create mode 100644 tests/integration_tests/sql_lab/api_tests.py create mode 100644 tests/integration_tests/sql_lab/commands_tests.py create mode 100644 tests/integration_tests/sql_lab/conftest.py create mode 100644 tests/integration_tests/sql_lab/test_execute_sql_statements.py delete mode 100644 tests/integration_tests/utils/decorators_tests.py create mode 100644 tests/unit_tests/charts/dao/__init__.py create mode 100644 tests/unit_tests/charts/dao/dao_tests.py create mode 100644 tests/unit_tests/commands/importers/__init__.py create mode 100644 tests/unit_tests/commands/importers/v1/__init__.py create mode 100644 tests/unit_tests/commands/importers/v1/assets_test.py create mode 100644 tests/unit_tests/common/test_dataframe_utils.py create mode 100644 tests/unit_tests/common/test_time_range_utils.py create mode 100644 tests/unit_tests/config_test.py create mode 100644 tests/unit_tests/databases/commands/test_connection_test.py create mode 100644 tests/unit_tests/databases/dao/__init__.py create mode 100644 tests/unit_tests/databases/dao/dao_tests.py create mode 100644 tests/unit_tests/databases/schema_tests.py create mode 100644 tests/unit_tests/databases/ssh_tunnel/__init__.py create mode 100644 tests/unit_tests/databases/ssh_tunnel/commands/__init__.py create mode 100644 tests/unit_tests/databases/ssh_tunnel/commands/create_test.py create mode 100644 tests/unit_tests/databases/ssh_tunnel/commands/delete_test.py create mode 100644 tests/unit_tests/databases/ssh_tunnel/commands/update_test.py create mode 100644 tests/unit_tests/databases/ssh_tunnel/dao_tests.py create mode 100644 tests/unit_tests/datasets/dao/__init__.py create mode 100644 tests/unit_tests/datasets/dao/dao_tests.py delete mode 100644 tests/unit_tests/datasets/test_models.py rename tests/unit_tests/{dao/datasource_test.py => datasource/dao_tests.py} (68%) create mode 100644 tests/unit_tests/db_engine_specs/test_clickhouse.py create mode 100644 tests/unit_tests/db_engine_specs/test_crate.py create mode 100644 tests/unit_tests/db_engine_specs/test_databricks.py create mode 100644 tests/unit_tests/db_engine_specs/test_dremio.py create mode 100644 tests/unit_tests/db_engine_specs/test_druid.py create mode 100644 tests/unit_tests/db_engine_specs/test_duckdb.py create mode 100644 tests/unit_tests/db_engine_specs/test_dynamodb.py create mode 100644 tests/unit_tests/db_engine_specs/test_elasticsearch.py create mode 100644 tests/unit_tests/db_engine_specs/test_firebird.py create mode 100644 tests/unit_tests/db_engine_specs/test_firebolt.py rename tests/{integration_tests/db_engine_specs/hana_tests.py => unit_tests/db_engine_specs/test_hana.py} (57%) create mode 100644 tests/unit_tests/db_engine_specs/test_hive.py create mode 100644 tests/unit_tests/db_engine_specs/test_impala.py create mode 100644 tests/unit_tests/db_engine_specs/test_init.py create mode 100644 tests/unit_tests/db_engine_specs/test_kylin.py create mode 100644 tests/unit_tests/db_engine_specs/test_mysql.py create mode 100644 tests/unit_tests/db_engine_specs/test_oracle.py create mode 100644 tests/unit_tests/db_engine_specs/test_postgres.py create mode 100644 tests/unit_tests/db_engine_specs/test_rockset.py create mode 100644 tests/unit_tests/db_engine_specs/utils.py create mode 100644 tests/unit_tests/explore/api_test.py create mode 100644 tests/unit_tests/fixtures/__init__.py create mode 100644 tests/unit_tests/fixtures/assets_configs.py create mode 100644 tests/unit_tests/models/__init__.py create mode 100644 tests/unit_tests/models/core_test.py create mode 100644 tests/unit_tests/notifications/email_tests.py create mode 100644 tests/unit_tests/pandas_postprocessing/test_utils.py create mode 100644 tests/unit_tests/tasks/__init__.py create mode 100644 tests/unit_tests/tasks/test_utils.py create mode 100644 tests/unit_tests/thumbnails/__init__.py create mode 100644 tests/unit_tests/thumbnails/test_digest.py rename tests/{integration_tests/db_engine_specs/impala_tests.py => unit_tests/utils/log_tests.py} (62%) create mode 100644 tests/unit_tests/utils/test_core.py create mode 100644 tests/unit_tests/utils/test_decorators.py create mode 100644 tests/unit_tests/utils/test_file.py diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e2f6a79affc5..27aebdb4220b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -10,10 +10,16 @@ .github/workflows/docker-ephemeral-env.yml @robdiciuccio @craig-rueda @rusackas @eschutho @dpgaspar @nytai @mistercrunch .github/workflows/ephemeral*.yml @robdiciuccio @craig-rueda @rusackas @eschutho @dpgaspar @nytai @mistercrunch -# Notify some committers of changes in the Select component +# Notify some committers of changes in the components /superset-frontend/src/components/Select/ @michael-s-molina @geido @ktmud +/superset-frontend/src/components/MetadataBar/ @michael-s-molina +/superset-frontend/src/components/DropdownContainer/ @michael-s-molina # Notify Helm Chart maintainers about changes in it /helm/superset/ @craig-rueda @dpgaspar @villebro + +# Notify E2E test maintainers of changes + +/superset-frontend/cypress-base/ @jinghua-qa @geido @eschutho @rusackas @betodealmeida diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 0e506cf9fb92..f821eb35246b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,6 +1,6 @@ --- name: Bug report -about: Create a report to help us improve +about: Create a report to help us improve Superset's stability! For feature requests please open a discussion at https://github.com/apache/superset/discussions/categories/ideas labels: "#bug" --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 8e6e0da9c959..000000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -labels: "#enhancement" - ---- - -Github Discussions is our new home for discussing features and improvements! - -https://github.com/apache/superset/discussions/categories/ideas - -We'd like to keep Github Issues focuses on bugs and SIP's (Superset Improvement Proposals)! - -Please note that feature requests opened as Github Issues will be moved to Discussions. diff --git a/.github/ISSUE_TEMPLATE/sip.md b/.github/ISSUE_TEMPLATE/sip.md index 6c526d6d1fa0..c2b0a14b9140 100644 --- a/.github/ISSUE_TEMPLATE/sip.md +++ b/.github/ISSUE_TEMPLATE/sip.md @@ -1,14 +1,16 @@ --- name: SIP -about: Superset Improvement Proposal +about: Superset Improvement Proposal (See SIP-0: https://github.com/apache/superset/issues/5602) labels: "#SIP" +title: "[SIP] Your Title Here (do not add SIP number)" +asignees: "apache/superset-committers" --- *Please make sure you are familiar with the SIP process documented* -(here)[https://github.com/apache/superset/issues/5602]. The SIP number should be the next number after the latest SIP listed [here](https://github.com/apache/superset/issues?q=is%3Aissue+label%3Asip). +(here)[https://github.com/apache/superset/issues/5602]. The SIP will be numbered by a committer upon acceptance. -## [SIP-\] Proposal for +## [SIP] Proposal for ...<title> ### Motivation diff --git a/.github/actions/chart-testing-action b/.github/actions/chart-testing-action index b0d4458c7115..afea100a5135 160000 --- a/.github/actions/chart-testing-action +++ b/.github/actions/chart-testing-action @@ -1 +1 @@ -Subproject commit b0d4458c71155b54fcf33e11dd465dc923550009 +Subproject commit afea100a513515fbd68b0e72a7bb0ae34cb62aec diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 493868eab966..7320c23a1432 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,6 +7,7 @@ updates: labels: - npm - dependabot + versioning-strategy: increase - package-ecosystem: "pip" directory: "/requirements/" @@ -21,9 +22,29 @@ updates: schedule: interval: "daily" open-pull-requests-limit: 0 + versioning-strategy: increase - package-ecosystem: "npm" directory: "/docs/" schedule: interval: "daily" open-pull-requests-limit: 0 + versioning-strategy: increase + + - package-ecosystem: "npm" + directory: "/superset-websocket/" + schedule: + interval: "daily" + labels: + - npm + - dependabot + versioning-strategy: increase + + - package-ecosystem: "npm" + directory: "/superset-websocket/utils/client-ws-app/" + schedule: + interval: "daily" + labels: + - npm + - dependabot + versioning-strategy: increase diff --git a/.github/workflows/bashlib.sh b/.github/workflows/bashlib.sh index ae10c342e854..3eb460f7fd85 100644 --- a/.github/workflows/bashlib.sh +++ b/.github/workflows/bashlib.sh @@ -183,7 +183,7 @@ cypress-run-all() { nohup flask run --no-debugger -p $port >"$flasklog" 2>&1 </dev/null & local flaskProcessId=$! - cypress-run "*/**/!(*.applitools.test.ts)" + cypress-run "*/**/*" # After job is done, print out Flask log for debugging say "::group::Flask log for default run" @@ -198,7 +198,7 @@ cypress-run-all() { nohup flask run --no-debugger -p $port >"$flasklog" 2>&1 </dev/null & local flaskProcessId=$! - cypress-run "sqllab/!(*.applitools.test.ts)" "Backend persist" + cypress-run "sqllab/*" "Backend persist" # Upload code coverage separately so each page can have separate flags # -c will clean existing coverage reports, -F means add flags @@ -220,14 +220,19 @@ eyes-storybook-dependencies() { } cypress-run-applitools() { + cd "$GITHUB_WORKSPACE/superset-frontend/cypress-base" + local flasklog="${HOME}/flask.log" local port=8081 + local cypress="./node_modules/.bin/cypress run" + local browser=${CYPRESS_BROWSER:-chrome} + export CYPRESS_BASE_URL="http://localhost:${port}" nohup flask run --no-debugger -p $port >"$flasklog" 2>&1 </dev/null & local flaskProcessId=$! - cypress-run "*/**/*.applitools.test.ts" + $cypress --spec "cypress/integration/*/**/*.applitools.test.ts" --browser "$browser" --headless --config ignoreTestFiles="[]" codecov -c -F "cypress" || true diff --git a/.github/workflows/caches.js b/.github/workflows/caches.js index 39d0ad2e6aaf..66fd7ee95933 100644 --- a/.github/workflows/caches.js +++ b/.github/workflows/caches.js @@ -25,6 +25,8 @@ const assetsConfig = { path: [`${workspaceDirectory}/superset/static/assets`], hashFiles: [ `${workspaceDirectory}/superset-frontend/src/**/*`, + `${workspaceDirectory}/superset-frontend/packages/**/*`, + `${workspaceDirectory}/superset-frontend/plugins/**/*`, `${workspaceDirectory}/superset-frontend/*.js`, `${workspaceDirectory}/superset-frontend/*.json`, ], diff --git a/.github/workflows/chromatic-master.yml b/.github/workflows/chromatic-master.yml new file mode 100644 index 000000000000..6cdf10506f00 --- /dev/null +++ b/.github/workflows/chromatic-master.yml @@ -0,0 +1,55 @@ +# .github/workflows/chromatic.yml +# seee https://www.chromatic.com/docs/github-actions +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Workflow name +name: 'Chromatic Storybook Master' + +# Event for the workflow +# Only run if changes were made in superset-frontend folder of repo on merge to Master +on: + # This will trigger when a branch merges to master when the PR has changes in the frontend folder updating the chromatic baseline + push: + branches: + - master + paths: + - "superset-frontend/**" + +# List of jobs +jobs: + chromatic-deployment: + # Operating System + runs-on: ubuntu-latest + # Job steps + steps: + - uses: actions/checkout@v1 + - name: Install dependencies + run: npm ci + working-directory: superset-frontend + # 👇 Build and publish Storybook to Chromatic + - name: Build and publish Storybook to Chromatic + id: chromatic-master + uses: chromaui/action@v1 + # Required options for the Chromatic GitHub Action + with: + # 👇 Location of package.json from root of mono-repo + workingDir: superset-frontend + # 👇 Chromatic projectToken, refer to the manage page to obtain it. + projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} + exitZeroOnChanges: true # 👈 Option to prevent the workflow from failing + autoAcceptChanges: true # 👈 Option to accept all changes when merging to master diff --git a/.github/workflows/docker_build_push.sh b/.github/workflows/docker_build_push.sh index 4feea5d802d4..b969813627c5 100755 --- a/.github/workflows/docker_build_push.sh +++ b/.github/workflows/docker_build_push.sh @@ -50,12 +50,40 @@ docker build --target lean \ -t "${REPO_NAME}:${SHA}" \ -t "${REPO_NAME}:${REFSPEC}" \ -t "${REPO_NAME}:${LATEST_TAG}" \ + --build-arg PY_VER="3.8-slim"\ --label "sha=${SHA}" \ --label "built_at=$(date)" \ --label "target=lean" \ --label "build_actor=${GITHUB_ACTOR}" \ . +# +# Build the "lean39" image +# +docker build --target lean \ + -t "${REPO_NAME}:${SHA}-py39" \ + -t "${REPO_NAME}:${REFSPEC}-py39" \ + -t "${REPO_NAME}:${LATEST_TAG}-py39" \ + --build-arg PY_VER="3.9-slim"\ + --label "sha=${SHA}" \ + --label "built_at=$(date)" \ + --label "target=lean39" \ + --label "build_actor=${GITHUB_ACTOR}" \ + . + +# +# Build the "websocket" image +# +docker build \ + -t "${REPO_NAME}:${SHA}-websocket" \ + -t "${REPO_NAME}:${REFSPEC}-websocket" \ + -t "${REPO_NAME}:${LATEST_TAG}-websocket" \ + --label "sha=${SHA}" \ + --label "built_at=$(date)" \ + --label "target=websocket" \ + --label "build_actor=${GITHUB_ACTOR}" \ + superset-websocket + # # Build the dev image # diff --git a/.github/workflows/license-check.yml b/.github/workflows/license-check.yml new file mode 100644 index 000000000000..9ae633bdc492 --- /dev/null +++ b/.github/workflows/license-check.yml @@ -0,0 +1,51 @@ +name: License Check + +on: + push: + branches-ignore: + - "dependabot/**" + pull_request: + +jobs: + license_check: + name: License Check + runs-on: ubuntu-20.04 + steps: + - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" + uses: actions/checkout@v2 + with: + persist-credentials: false + submodules: recursive + - name: Setup Java + uses: actions/setup-java@v1 + with: + java-version: 8 + - name: Generate fossa report + env: + FOSSA_API_KEY: ${{ secrets.FOSSA_API_KEY }} + run: | + set -eo pipefail + if [[ "${{github.event_name}}" != "pull_request" ]]; then + ./scripts/fossa.sh + exit 0 + fi + + URL="https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files" + FILES=$(curl -s -X GET -G $URL | jq -r '.[] | .filename') + + cat<<EOF + CHANGED FILES: + $FILES + + EOF + + if [[ "${FILES}" =~ (.*package*\.json|requirements\/[a-z_-]+\.txt|setup\.py) ]]; then + echo "Detected dependency changes... running fossa check" + + ./scripts/fossa.sh + else + echo "No dependency changes... skiping fossa check" + fi + shell: bash + - name: Run license check + run: ./scripts/check_license.sh diff --git a/.github/workflows/misc.yml b/.github/workflows/prefer-typescript.yml similarity index 55% rename from .github/workflows/misc.yml rename to .github/workflows/prefer-typescript.yml index f8b5fb3fc6ff..8005cf36a355 100644 --- a/.github/workflows/misc.yml +++ b/.github/workflows/prefer-typescript.yml @@ -1,4 +1,4 @@ -name: Miscellaneous +name: Prefer Typescript on: push: @@ -7,49 +7,6 @@ on: pull_request: jobs: - license_check: - name: License Check - runs-on: ubuntu-20.04 - steps: - - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )" - uses: actions/checkout@v2 - with: - persist-credentials: false - submodules: recursive - - name: Setup Java - uses: actions/setup-java@v1 - with: - java-version: 8 - - name: Generate fossa report - env: - FOSSA_API_KEY: ${{ secrets.FOSSA_API_KEY }} - run: | - set -eo pipefail - if [[ "${{github.event_name}}" != "pull_request" ]]; then - ./scripts/fossa.sh - exit 0 - fi - - URL="https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files" - FILES=$(curl -s -X GET -G $URL | jq -r '.[] | .filename') - - cat<<EOF - CHANGED FILES: - $FILES - - EOF - - if [[ "${FILES}" =~ (.*package*\.json|requirements\/[a-z_-]+\.txt|setup\.py) ]]; then - echo "Detected dependency changes... running fossa check" - - ./scripts/fossa.sh - else - echo "No dependency changes... skiping fossa check" - fi - shell: bash - - name: Run license check - run: ./scripts/check_license.sh - prefer_typescript: if: github.ref == 'ref/heads/master' && github.event_name == 'pull_request' name: Prefer Typescript diff --git a/.github/workflows/superset-applitool-cypress.yml b/.github/workflows/superset-applitool-cypress.yml index eb7d774233bb..47fc1a24e4c2 100644 --- a/.github/workflows/superset-applitool-cypress.yml +++ b/.github/workflows/superset-applitool-cypress.yml @@ -32,7 +32,7 @@ jobs: ports: - 15432:5432 redis: - image: redis:5-alpine + image: redis:7-alpine ports: - 16379:6379 steps: diff --git a/.github/workflows/superset-cli.yml b/.github/workflows/superset-cli.yml index 369447e1509c..65ec8b018f21 100644 --- a/.github/workflows/superset-cli.yml +++ b/.github/workflows/superset-cli.yml @@ -30,7 +30,7 @@ jobs: # GitHub action runner's default installations - 15432:5432 redis: - image: redis:5-alpine + image: redis:7-alpine ports: - 16379:6379 steps: diff --git a/.github/workflows/superset-e2e.yml b/.github/workflows/superset-e2e.yml index f936b544a9cf..ab82731ac481 100644 --- a/.github/workflows/superset-e2e.yml +++ b/.github/workflows/superset-e2e.yml @@ -38,7 +38,7 @@ jobs: ports: - 15432:5432 redis: - image: redis:5-alpine + image: redis:7-alpine ports: - 16379:6379 steps: diff --git a/.github/workflows/superset-frontend.yml b/.github/workflows/superset-frontend.yml index 03e2b9e7d420..bf09d293c6e3 100644 --- a/.github/workflows/superset-frontend.yml +++ b/.github/workflows/superset-frontend.yml @@ -51,6 +51,11 @@ jobs: if: steps.check.outcome == 'failure' working-directory: ./superset-frontend run: npm run plugins:build-storybook + - name: superset-ui/core coverage + if: steps.check.outcome == 'failure' + working-directory: ./superset-frontend + run: | + npm run core:cover - name: unit tests if: steps.check.outcome == 'failure' working-directory: ./superset-frontend diff --git a/.github/workflows/superset-helm-lint.yml b/.github/workflows/superset-helm-lint.yml index a7f83f561ac2..d0e650839f9a 100644 --- a/.github/workflows/superset-helm-lint.yml +++ b/.github/workflows/superset-helm-lint.yml @@ -44,3 +44,4 @@ jobs: CT_CHART_DIRS: helm CT_LINT_CONF: lintconf.yaml CT_SINCE: HEAD + CT_CHART_REPOS: bitnami=https://charts.bitnami.com/bitnami diff --git a/.github/workflows/superset-helm-release.yml b/.github/workflows/superset-helm-release.yml index bf896140b6d1..1559432eb247 100644 --- a/.github/workflows/superset-helm-release.yml +++ b/.github/workflows/superset-helm-release.yml @@ -3,9 +3,9 @@ name: Release Charts on: push: branches: - - 'master' + - "master" paths: - - 'helm/**' + - "helm/**" jobs: release: @@ -28,6 +28,9 @@ jobs: with: version: v3.5.4 + - name: Add bitnami repo dependency + run: helm repo add bitnami https://charts.bitnami.com/bitnami + - name: Run chart-releaser uses: ./.github/actions/chart-releaser-action with: diff --git a/.github/workflows/superset-python-integrationtest.yml b/.github/workflows/superset-python-integrationtest.yml index 926d6185bf4e..eae19b234cf3 100644 --- a/.github/workflows/superset-python-integrationtest.yml +++ b/.github/workflows/superset-python-integrationtest.yml @@ -29,7 +29,7 @@ jobs: ports: - 13306:3306 redis: - image: redis:5-alpine + image: redis:7-alpine options: --entrypoint redis-server ports: - 16379:6379 @@ -97,7 +97,7 @@ jobs: # GitHub action runner's default installations - 15432:5432 redis: - image: redis:5-alpine + image: redis:7-alpine ports: - 16379:6379 steps: @@ -156,7 +156,7 @@ jobs: sqlite:///${{ github.workspace }}/.temp/unittest.db services: redis: - image: redis:5-alpine + image: redis:7-alpine ports: - 16379:6379 steps: diff --git a/.github/workflows/superset-python-misc.yml b/.github/workflows/superset-python-misc.yml index 39c52c51bb8c..739869a7bb91 100644 --- a/.github/workflows/superset-python-misc.yml +++ b/.github/workflows/superset-python-misc.yml @@ -33,8 +33,8 @@ jobs: uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - cache: 'pip' - cache-dependency-path: 'requirements/testing.txt' + cache: "pip" + cache-dependency-path: "requirements/testing.txt" - name: Install dependencies if: steps.check.outcome == 'failure' uses: ./.github/actions/cached-dependencies @@ -65,7 +65,7 @@ jobs: uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - cache: 'pip' + cache: "pip" cache-dependency-path: | requirements/base.txt requirements/integration.txt @@ -78,6 +78,15 @@ jobs: pip install wheel pip install -r requirements/base.txt pip install -r requirements/integration.txt + # Add brew to the path - see https://github.com/actions/runner-images/issues/6283 + - name: Enable brew and helm-docs + run: | + echo "/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" + echo "HOMEBREW_PREFIX=$HOMEBREW_PREFIX" >>"${GITHUB_ENV}" + echo "HOMEBREW_CELLAR=$HOMEBREW_CELLAR" >>"${GITHUB_ENV}" + echo "HOMEBREW_REPOSITORY=$HOMEBREW_REPOSITORY" >>"${GITHUB_ENV}" + brew install norwoodj/tap/helm-docs - name: pre-commit run: pre-commit run --all-files @@ -97,8 +106,8 @@ jobs: uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - cache: 'pip' - cache-dependency-path: 'requirements/base.txt' + cache: "pip" + cache-dependency-path: "requirements/base.txt" - name: Install dependencies uses: ./.github/actions/cached-dependencies with: diff --git a/.github/workflows/superset-python-presto-hive.yml b/.github/workflows/superset-python-presto-hive.yml index 097b2f45adf9..875901b1ec6d 100644 --- a/.github/workflows/superset-python-presto-hive.yml +++ b/.github/workflows/superset-python-presto-hive.yml @@ -41,7 +41,7 @@ jobs: # GitHub action runner's default installations - 15433:8080 redis: - image: redis:5-alpine + image: redis:7-alpine ports: - 16379:6379 steps: @@ -110,7 +110,7 @@ jobs: # GitHub action runner's default installations - 15432:5432 redis: - image: redis:5-alpine + image: redis:7-alpine ports: - 16379:6379 steps: diff --git a/.github/workflows/superset-websocket.yml b/.github/workflows/superset-websocket.yml index 8a8dc9de2cac..2f4b0aea04a0 100644 --- a/.github/workflows/superset-websocket.yml +++ b/.github/workflows/superset-websocket.yml @@ -18,7 +18,7 @@ jobs: persist-credentials: false - name: Install dependencies working-directory: ./superset-websocket - run: npm install + run: npm ci - name: lint working-directory: ./superset-websocket run: npm run lint diff --git a/.github/workflows/welcome-new-users.yml b/.github/workflows/welcome-new-users.yml index e55028af9446..ae16bf49c649 100644 --- a/.github/workflows/welcome-new-users.yml +++ b/.github/workflows/welcome-new-users.yml @@ -8,18 +8,15 @@ jobs: welcome: runs-on: ubuntu-latest permissions: - issues: write + pull-requests: write steps: - name: Welcome Message - uses: actions/first-interaction@v1.0.0 + uses: actions/first-interaction@v1 + continue-on-error: true with: repo-token: ${{ secrets.GITHUB_TOKEN }} pr-message: |- Congrats on making your first PR and thank you for contributing to Superset! :tada: :heart: - We hope to see you in our [Slack](https://apache-superset.slack.com/) community too! - - name: First Time Label - uses: andymckay/labeler@master - with: - add-labels: "new:contributor" - repo-token: ${{ secrets.GITHUB_TOKEN }} + + We hope to see you in our [Slack](https://apache-superset.slack.com/) community too! Not signed up? Use our [Slack App](http://bit.ly/join-superset-slack) to self-register. diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 000000000000..dcc40721cea2 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,4 @@ +{ + "no-bare-urls": false, + "line-length": false +} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b43e10c2cb78..aa0cf4af62d1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,7 +16,7 @@ # repos: - repo: https://github.com/PyCQA/isort - rev: 5.9.3 + rev: 5.12.0 hooks: - id: isort - repo: https://github.com/pre-commit/mirrors-mypy @@ -49,11 +49,16 @@ repos: rev: v2.4.1 # Use the sha or tag you want to point at hooks: - id: prettier - args: ['--ignore-path=./superset-frontend/.prettierignore'] - files: 'superset-frontend' + args: ["--ignore-path=./superset-frontend/.prettierignore"] + files: "superset-frontend" # blacklist unsafe functions like make_url (see #19526) - repo: https://github.com/skorokithakis/blacklist-pre-commit-hook rev: e2f070289d8eddcaec0b580d3bde29437e7c8221 hooks: - id: blacklist args: ["--blacklisted-names=make_url", "--ignore=tests/"] + - repo: https://github.com/norwoodj/helm-docs + rev: v1.11.0 + hooks: + - id: helm-docs + files: helm diff --git a/.pylintrc b/.pylintrc index 8814957194ba..848767fe5dcb 100644 --- a/.pylintrc +++ b/.pylintrc @@ -134,7 +134,9 @@ include-naming-hint=no # List of decorators that produce properties, such as abc.abstractproperty. Add # to this list to register other decorators that produce valid properties. -property-classes=abc.abstractproperty +property-classes= + abc.abstractproperty, + sqlalchemy.ext.hybrid.hybrid_property # Regular expression matching correct argument names argument-rgx=[a-z_][a-z0-9_]{2,30}$ @@ -303,7 +305,7 @@ ignored-modules=numpy,pandas,alembic.op,sqlalchemy,alembic.context,flask_appbuil # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. -ignored-classes=contextlib.closing,optparse.Values,thread._local,_thread._local,sqlalchemy.orm.scoping.scoped_session +ignored-classes=contextlib.closing,optparse.Values,thread._local,_thread._local # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular diff --git a/CHANGELOG.md b/CHANGELOG.md index b48fd53560b9..31a7e33c0737 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -570,6 +570,625 @@ under the License. - [#19016](https://github.com/apache/superset/pull/19016) chore: Adding PR to Updating.md (@AAfghahi) - [#18970](https://github.com/apache/superset/pull/18970) chore: Change Dataset legacy editor flag to true (@AAfghahi) +- [2.0.1](#201-fri-nov-4-103402-2022--0400) +- [2.0.0](#200-tue-jun-28-085302-2022--0400) +- [1.5.3 (LTS)](#153-thu-jan-5-150544-2023--0500) +- [1.5.2](#152-wed-sep-14-171151-2022-0530) +- [1.5.1](#151-thu-may-26-144520-2022-0300) +- [1.5.0](#150-fri-apr-22-172330-2022--0400) +- [1.4.2](#142-sat-mar-19-000806-2022-0200) +- [1.4.1](#141) + +### 2.0.1 (Fri Nov 4 10:34:02 2022 -0400) + +**Database Migrations** + +**Features** + +**Fixes** + +- [#22417](https://github.com/apache/superset/pull/22417) fix: fix: Force configuration for SafeMarkdown component in Handlebars(@geido) +- [#21895](https://github.com/apache/superset/pull/21895) feat: Improves SafeMarkdown HTML sanitization (@michael-s-molina) (security-improvement) +- [#21874](https://github.com/apache/superset/pull/21874) feat: Adds a Content Security Policy (CSP) check for production environments (@michael-s-molina)(security-improvement) +- [#21853](https://github.com/apache/superset/pull/21853) feat: Disables HTML rendering in Toast by default (@michael-s-molina)(security-improvement) +- [#21776](https://github.com/apache/superset/pull/21776) fix(CustomFrame): Resolves issue #21731 where date range in explore throws runtime error (@eric-briscoe) +- [#21637](https://github.com/apache/superset/pull/21637) fix: respect chart cache timeout setting (@mayurnewase) +- [#21729](https://github.com/apache/superset/pull/21729) fix: allow adhoc columns in non-aggregate query (@mayurnewase) +- [#21441](https://github.com/apache/superset/pull/21441) fix(cache): respect default cache timeout on v1 chart data requests (@villebro) +- [#22038](https://github.com/apache/superset/pull/22038) fix: datasource save, improve data validation (@dpgaspar) +- [#22022](https://github.com/apache/superset/pull/22022) fix: deprecate approve and request_access endpoint (@dpgaspar) +- [#21964](https://github.com/apache/superset/pull/21964) fix: dashboard api cache decorator (@dpgaspar) +- [#21875](https://github.com/apache/superset/pull/21875) fix: check that imports are ZIPs (@betodealmeida) +- [#21761](https://github.com/apache/superset/pull/21761) fix: flash message on database data upload forms (@dpgaspar) +- [#21759](https://github.com/apache/superset/pull/21759) fix: database schema selector on import data (@dpgaspar) +- [#21729](https://github.com/apache/superset/pull/21729) fix: allow adhoc columns in non-aggregate query (@mayurnewase) +- [#21773](https://github.com/apache/superset/pull/21773) fix: remove deprecated ETagResponseMixin (@eschutho) +- [#21561](https://github.com/apache/superset/pull/21561) fix(report): Fix permission check for set up email report on charts/dashboards. Fixes #21559 (@zhaorui2022) +- [#20651](https://github.com/apache/superset/pull/20651) fix: annotation broken (@zhaoyongjie) +- [#20830](https://github.com/apache/superset/pull/20830) fix: remove element reference in alerts report fetchs (@hughhhh) +- [#20063](https://github.com/apache/superset/pull/20063) fix: Add locale for DatePicker component (@aehanno) +- [#21302](https://github.com/apache/superset/pull/21302) fix: disallow users from viewing other user's profile on config (@dpgaspar) +- [#21154](https://github.com/apache/superset/pull/21154) fix(explore): Prevent unnecessary series limit subquery (@codyml) +- [#21498](https://github.com/apache/superset/pull/21498) fix: set correct favicon from config for login and FAB list views (@mayurnewase) +- [#21380](https://github.com/apache/superset/pull/21380) fix(sqllab): Fix cursor alignment in SQL lab editor by avoiding Lucida Console font on Windows (@MichaelHintz) +- [#20061](https://github.com/apache/superset/pull/20061) fix: Add french translation missing (@aehanno) +- [#21044](https://github.com/apache/superset/pull/21044) fix(plugin-chart-echarts): missing value format in mixed timeseries (@justinpark) +- [#21419](https://github.com/apache/superset/pull/21419) fix: cached common bootstrap Revert (#21018) (@dpgaspar) +- [#21296](https://github.com/apache/superset/pull/21296) fix(plugin-chart-echarts): show zero value in tooltip (@villebro) +- [#21294](https://github.com/apache/superset/pull/21294) fix(explore): Time column label not formatted when GENERIC_X_AXES enabled (@kgabryje) +- [#21272](https://github.com/apache/superset/pull/21272) fix: adds TLS certificate validation option for SMTP (@dpgaspar) +- [#21076](https://github.com/apache/superset/pull/21076) fix(celery cache warmup): add auth and use warm_up_cache endpoint (@nytai) +- [#21216](https://github.com/apache/superset/pull/21216) fix(database-list): hide upload file button if no permission (@stephenLYZ) +- [#21153](https://github.com/apache/superset/pull/21153) fix(sqllab): missing zero values while copy-to-clipboard (@justinpark) +- [#21084](https://github.com/apache/superset/pull/21084) fix(native filters): groupby filter issue (@stevetracvc) +- [#21005](https://github.com/apache/superset/pull/21005) fix(plugin-chart-handlebars): Sort-By and Sort-By-Descending control not work (@stephenLYZ) +- [#20969](https://github.com/apache/superset/pull/20969) fix(dashboard): Fix scroll behaviour in DashboardBuilderSidepane (@EugeneTorap) +- [#21007](https://github.com/apache/superset/pull/21007) fix(plugin-chart-echarts): gauge chart enhancements and fixes (@stephenLYZ) +- [#21032](https://github.com/apache/superset/pull/21032) fix(plugin-chart-echarts): invalid total label location for negative values in stacked bar chart (@justinpark) +- [#20962](https://github.com/apache/superset/pull/20962) fix: Explore scrolled down when navigating from dashboard (@kgabryje) +- [#20946](https://github.com/apache/superset/pull/20946) fix(viz): Show zero percent changes in Big Number Viz (@Antonio-RiveroMartnez) +- [#20819](https://github.com/apache/superset/pull/20819) fix: Temporal X Axis values are not properly displayed if the time column has a custom label defined (@diegomedina248) +- [#20736](https://github.com/apache/superset/pull/20736) fix: getting default value in run-server.sh (@zhaoyongjie) +- [#20733](https://github.com/apache/superset/pull/20733) fix(docker): Make Gunicorn max_requests and max_requests_jitter adjustable (@mdeshmu) +- [#20714](https://github.com/apache/superset/pull/20714) fix: logger message (@betodealmeida) + +**Others** + +- [#21811](https://github.com/apache/superset/pull/21811) chore(sqla): refactor query utils (@villebro) +- [#21811](https://github.com/apache/superset/pull/21811) chore(sqla): refactor query utils (@villebro) +- [#20644](https://github.com/apache/superset/pull/20644) chore(deps): bump moment from 2.29.2 to 2.29.4 in /superset-frontend (@dependabot[bot]) +- [#21721](https://github.com/apache/superset/pull/21721) build: changelog for 2.0.1 (@AAfghahi) +- [#21018](https://github.com/apache/superset/pull/21018) perf: Memoize the common_bootstrap_payload (@bkyryliuk) +- [#21091](https://github.com/apache/superset/pull/21091) chore(deps): unpin holidays dependency version (@ecederstrand) + +### 2.0.0 (Tue Jun 28 08:53:02 2022 -0400) + +**Database Migrations** + +- [#20385](https://github.com/apache/superset/pull/20385) fix(migration): Ensure key_value LargeBinary is encoded as a MEDIUMBLOB as opposed to BLOB for MySQL (@john-bodley) +- [#20284](https://github.com/apache/superset/pull/20284) chore(migrations): Renaming migration files so that they're easier to keep track of (@craig-rueda) +- [#20108](https://github.com/apache/superset/pull/20108) fix: None dataset and schema permissions (@dpgaspar) +- [#18794](https://github.com/apache/superset/pull/18794) feat(business-types): initial implementation of SIP-78 (@cccs-RyanS) +- [#20073](https://github.com/apache/superset/pull/20073) fix(dataset): handle missing sqla uri in migration (@villebro) +- [#19941](https://github.com/apache/superset/pull/19941) fix(reports): Clear last value when state is WORKING (@john-bodley) +- [#19675](https://github.com/apache/superset/pull/19675) chore(docs): Spelling (@jsoref) +- [#19793](https://github.com/apache/superset/pull/19793) fix(SIP-68): handle empty table name during migration (@ktmud) +- [#19786](https://github.com/apache/superset/pull/19786) fix(migrations): coalesce is_temporal when inserting into sl_columns (@cemremengu) +- [#19421](https://github.com/apache/superset/pull/19421) perf: refactor SIP-68 db migrations with INSERT SELECT FROM (@ktmud) +- [#19767](https://github.com/apache/superset/pull/19767) fix: Fix migration for removing time_range_endpoints 3 (@hughhhh) +- [#19728](https://github.com/apache/superset/pull/19728) fix: Removetime_range_endpoints from query context object pt 2 (@hughhhh) +- [#19630](https://github.com/apache/superset/pull/19630) chore: clean up unused imports in db migration scripts (@ktmud) +- [#19577](https://github.com/apache/superset/pull/19577) fix: merge multiple db heads (@eschutho) +- [#19243](https://github.com/apache/superset/pull/19243) fix: cannot delete a database if team member has SQL editor tab that uses that db (@diegomedina248) +- [#19537](https://github.com/apache/superset/pull/19537) chore: block unsafe functions (@betodealmeida) +- [#19513](https://github.com/apache/superset/pull/19513) chore: postpone timerange endpoint removal (@villebro) +- [#19495](https://github.com/apache/superset/pull/19495) perf: speed up db migration for deprecating time_range_endpoints (@ktmud) +- [#19474](https://github.com/apache/superset/pull/19474) fix: handle null params in #18936 migration (@serenajiang) +- [#19423](https://github.com/apache/superset/pull/19423) fix: Remove`time_range_endpoints` from query context object (@hughhhh) +- [#18936](https://github.com/apache/superset/pull/18936) chore: Remove legacy SIP-15 interim logic/flags (@john-bodley) + +**Features** + +- [#20377](https://github.com/apache/superset/pull/20377) feat(standardized form data): keep all columns and metrics (@zhaoyongjie) +- [#20114](https://github.com/apache/superset/pull/20114) feat(chart): Enable caching per user when user impersonation is enabled (@Samira-El) +- [#20408](https://github.com/apache/superset/pull/20408) feat(plugin-chart-echarts): Support stacking negative and positive values (@kgabryje) +- [#20278](https://github.com/apache/superset/pull/20278) feat: Prevent dataset edit modal closing on click-away in edit mode (@reesercollins) +- [#20392](https://github.com/apache/superset/pull/20392) feat: setting limit value when Pie chart switches (@zhaoyongjie) +- [#20373](https://github.com/apache/superset/pull/20373) feat: adding truncate metric control on timeseries charts (@zhaoyongjie) +- [#20248](https://github.com/apache/superset/pull/20248) feat(explore): Implement viz switcher redesign (@kgabryje) +- [#20113](https://github.com/apache/superset/pull/20113) feat(api): Added "kind" to dataset/<pk> endpoint (@reesercollins) +- [#20299](https://github.com/apache/superset/pull/20299) feat(explore): Dataset Panel Options when Source = Query II (@lyndsiWilliams) +- [#20320](https://github.com/apache/superset/pull/20320) feat: Databricks native driver (@betodealmeida) +- [#20313](https://github.com/apache/superset/pull/20313) feat(explore): Denormalize form data in echarts, world map and nvd3 bar and line charts (@kgabryje) +- [#20277](https://github.com/apache/superset/pull/20277) feat: multiple results pane on explore and dashboard (@zhaoyongjie) +- [#19898](https://github.com/apache/superset/pull/19898) feat: When editing the label/title in the Metrics popover, hitting Enter should save what you've typed (@diegomedina248) +- [#16493](https://github.com/apache/superset/pull/16493) feat(plugin-chart-echarts): [feature-parity] support extra control for the area chart V2 (@stephenLYZ) +- [#19855](https://github.com/apache/superset/pull/19855) feat(explore): Frontend implementation of dataset creation from infobox (@lyndsiWilliams) +- [#20165](https://github.com/apache/superset/pull/20165) feat: add modfied col and timezone info to schedule col (@pkdotson) +- [#20144](https://github.com/apache/superset/pull/20144) feat: showing results pane in dashboard (@zhaoyongjie) +- [#20242](https://github.com/apache/superset/pull/20242) feat: derived metrics use different line style (@zhaoyongjie) +- [#20010](https://github.com/apache/superset/pull/20010) feat: standardized form_data (@zhaoyongjie) +- [#19987](https://github.com/apache/superset/pull/19987) feat(superset-ui-core): add feature flag for the analogous colors (@stephenLYZ) +- [#19881](https://github.com/apache/superset/pull/19881) feat(world-map): support color by metric or country column (@stephenLYZ) +- [#19981](https://github.com/apache/superset/pull/19981) feat!: pass datasource_type and datasource_id to form_data (@eschutho) +- [#15241](https://github.com/apache/superset/pull/15241) feat: query datasets from SQL Lab (@betodealmeida) +- [#20129](https://github.com/apache/superset/pull/20129) feat(explore): Fill dashboard name when adding new chart from dashboard view (@kgabryje) +- [#20160](https://github.com/apache/superset/pull/20160) feat(explore): Add empty state to annotations (@kgabryje) +- [#20134](https://github.com/apache/superset/pull/20134) feat: add Query.columns for bootstrap_data (@hughhhh) +- [#20158](https://github.com/apache/superset/pull/20158) feat: add statsd metrics for notifications (@dpgaspar) +- [#20052](https://github.com/apache/superset/pull/20052) feat(Helm Chart): Support resource limits and requests for each component (@rathberm) +- [#20170](https://github.com/apache/superset/pull/20170) feat: add samples endpoint (@zhaoyongjie) +- [#19381](https://github.com/apache/superset/pull/19381) feat: add drag and drop column rearrangement for table viz (@stevetracvc) +- [#20136](https://github.com/apache/superset/pull/20136) feat: Add Certified filter to Datasets (@hughhhh) +- [#20111](https://github.com/apache/superset/pull/20111) feat(dashboard): Chart title click redirects to Explore in new tab (@kgabryje) +- [#20097](https://github.com/apache/superset/pull/20097) feat(plugin-chart-echarts): add support for generic axis to mixed chart (@villebro) +- [#20126](https://github.com/apache/superset/pull/20126) feat(dashboard): Add create chart button in dashboard edit mode (@kgabryje) +- [#20059](https://github.com/apache/superset/pull/20059) feat: Save column data into json_metadata for all Query executions (@hughhhh) +- [#19918](https://github.com/apache/superset/pull/19918) feat(plugin-chart-echarts): support horizontal bar chart (@stephenLYZ) +- [#19902](https://github.com/apache/superset/pull/19902) feat: Explore popovers should close on escape (@diegomedina248) +- [#20049](https://github.com/apache/superset/pull/20049) feat(dashboard): Rearrange items in chart header controls dropdown (@kgabryje) +- [#20030](https://github.com/apache/superset/pull/20030) feat(sip-68): Add DatasourceDAO class to manage querying different datasources easier (@hughhhh) +- [#19581](https://github.com/apache/superset/pull/19581) feat(viz-gallery): add search weight for viz-name (@stephenLYZ) +- [#19999](https://github.com/apache/superset/pull/19999) feat: RLS for SQL Lab (@betodealmeida) +- [#19993](https://github.com/apache/superset/pull/19993) feat(explore): Show confirmation modal if user exits Explore without saving changes (@kgabryje) +- [#19873](https://github.com/apache/superset/pull/19873) feat(css): adds `chartId`-based class to dashboard chart holder (@rusackas) +- [#20002](https://github.com/apache/superset/pull/20002) feat: deprecate /superset/testconn and migrate to api v1 (@zephyring) +- [#19935](https://github.com/apache/superset/pull/19935) feat: deprecate /superset/validate_sql_json migrate to api v1 (@dpgaspar) +- [#20015](https://github.com/apache/superset/pull/20015) feat: add new enums for datasource types (@hughhhh) +- [#19956](https://github.com/apache/superset/pull/19956) feat: Applitools Cypress workflow (@geido) +- [#19852](https://github.com/apache/superset/pull/19852) feat: Run Applitools on public Storybook (@geido) +- [#19963](https://github.com/apache/superset/pull/19963) feat: Add cypress test for downloading chart as image (@codemaster08240328) +- [#19957](https://github.com/apache/superset/pull/19957) feat: switch from `sqlalchemy-trino` to `trino-python-client` (@dungdm93) +- [#19921](https://github.com/apache/superset/pull/19921) feat: deprecate /superset/extra_table_metadata migrate to api v1 (@dpgaspar) +- [#19745](https://github.com/apache/superset/pull/19745) feat: simplify SQLite time grain (@betodealmeida) +- [#19927](https://github.com/apache/superset/pull/19927) feat(chart & legend): make to enable show legend by default (@prosdev0107) +- [#19754](https://github.com/apache/superset/pull/19754) feat: deprecate old API on core superset fave_dashboards (@dpgaspar) +- [#19905](https://github.com/apache/superset/pull/19905) feat: simplify `memoized_func` (@betodealmeida) +- [#19871](https://github.com/apache/superset/pull/19871) feat(filter): make to hide sort filter when time range (@prosdev0107) +- [#19851](https://github.com/apache/superset/pull/19851) feat: add Advanced Analytics into mixed time series chart (@zhaoyongjie) +- [#19692](https://github.com/apache/superset/pull/19692) feat: Update ShortKey for stop query running in SqlLab editor (@codemaster08240328) +- [#17903](https://github.com/apache/superset/pull/17903) feat: Adds plugin-chart-handlebars (@jdbranham) +- [#19748](https://github.com/apache/superset/pull/19748) feat(explore): improve UI in the control panel (@stephenLYZ) +- [#19724](https://github.com/apache/superset/pull/19724) feat: 10/15/30 min grain to Pinot (@hughhhh) +- [#19696](https://github.com/apache/superset/pull/19696) feat(explore): Replace overlay with alert banner when chart controls change (@kgabryje) +- [#19751](https://github.com/apache/superset/pull/19751) feat(explore): Implement data panel redesign (@kgabryje) +- [#19598](https://github.com/apache/superset/pull/19598) feat: add empty states to sqlab editor and select (@pkdotson) +- [#19450](https://github.com/apache/superset/pull/19450) feat: Remove legacy sql alchemy db connection link from G Sheet connection (@codemaster08240328) +- [#19710](https://github.com/apache/superset/pull/19710) feat: Enabling source maps full time (@rusackas) +- [#19671](https://github.com/apache/superset/pull/19671) feat: UI override registry (@suddjian) +- [#19691](https://github.com/apache/superset/pull/19691) feat(explore): More explicit labels of adhoc filter operators (@kgabryje) +- [#19558](https://github.com/apache/superset/pull/19558) feat(explore): Redesign of Run/Save buttons (@kgabryje) +- [#19650](https://github.com/apache/superset/pull/19650) feat(embedded): API get embedded dashboard config by uuid (@lilykuang) +- [#19310](https://github.com/apache/superset/pull/19310) feat(CRUD): add new empty state (@stephenLYZ) +- [#19622](https://github.com/apache/superset/pull/19622) feat(plugin-chart-echarts): add aggregate total for the Pie/Donuct chart (@stephenLYZ) +- [#19314](https://github.com/apache/superset/pull/19314) feat: Move Database Import option into DB Connection modal (@lyndsiWilliams) +- [#19434](https://github.com/apache/superset/pull/19434) feat: deprecate old API and create new API for dashes created by me (@dpgaspar) +- [#19482](https://github.com/apache/superset/pull/19482) feat: add success toast to alerts and reports (@pkdotson) +- [#19574](https://github.com/apache/superset/pull/19574) feat: add a `where_in` filter for Jinja2 (@betodealmeida) +- [#19458](https://github.com/apache/superset/pull/19458) feat(explore): Move timer, row counter and cached pills to chart container (@kgabryje) +- [#19529](https://github.com/apache/superset/pull/19529) feat(explore): Move chart header to top of the page (@kgabryje) +- [#19489](https://github.com/apache/superset/pull/19489) feat(CI): clean up Python tests output (@ktmud) +- [#19308](https://github.com/apache/superset/pull/19308) feat(explore): SQL popover in datasource panel (@kgabryje) +- [#19325](https://github.com/apache/superset/pull/19325) feat(color): support analogous colors to prevent color conflict (@stephenLYZ) +- [#19408](https://github.com/apache/superset/pull/19408) feat(dashboard): Implement empty states for empty tabs (@kgabryje) +- [#19446](https://github.com/apache/superset/pull/19446) feat(explore): Move chart actions into dropdown (@kgabryje) +- [#19394](https://github.com/apache/superset/pull/19394) feat(explore): UI changes in dataset panel on Explore page (@kgabryje) + +**Fixes** + +- [#20382](https://github.com/apache/superset/pull/20382) fix: Allow dataset owners to explore their datasets (@reesercollins) +- [#20419](https://github.com/apache/superset/pull/20419) fix(embedded): Retry when executing alert queries to avoid sending transient errors to users as alert failure notifications (@zhaorui2022) +- [#20555](https://github.com/apache/superset/pull/20555) fix: Respecting max/min opacities, and adding tests. (@rusackas) +- [#20571](https://github.com/apache/superset/pull/20571) fix: Revert #20408 (stacking negative values in echarts bar chart) (@rusackas) +- [#20487](https://github.com/apache/superset/pull/20487) fix(database-modal): form in database model effects results of the database list (@stephenLYZ) +- [#20488](https://github.com/apache/superset/pull/20488) fix(big-number): big number gets cut off on a Dashboard (@stephenLYZ) +- [#16326](https://github.com/apache/superset/pull/16326) fix: SQL Lab cancel query in Redshift database connection does not wo… (@yourssvk) +- [#20362](https://github.com/apache/superset/pull/20362) fix: Unable to download the Dashboard as image in case there's an image added through Markdown (@diegomedina248) +- [#20543](https://github.com/apache/superset/pull/20543) fix: Removes psycopg2 as a required dependency +- [#20442](https://github.com/apache/superset/pull/20442) fix(db): Show the only db install guide when the db is already installed and error is existed while importing file. (@prosdev0107) +- [#20483](https://github.com/apache/superset/pull/20483) fix: bump FAB to 4.1.2 (@dpgaspar) +- [#20493](https://github.com/apache/superset/pull/20493) fix: correction from mmsql to mssql in setup.py (@mdeshmu) +- [#20460](https://github.com/apache/superset/pull/20460) fix: new column UUID conflicts in dual write (@eschutho) +- [#20485](https://github.com/apache/superset/pull/20485) fix: Re-add filter-box time granularity/column (@john-bodley) +- [#20480](https://github.com/apache/superset/pull/20480) fix(docs): prevent some symbols from being copied in docs (@stephenLYZ) +- [#19920](https://github.com/apache/superset/pull/19920) fix(table viz): correctly sort by multiple columns in a table (@stevetracvc) +- [#20402](https://github.com/apache/superset/pull/20402) fix: alert & reports active toggle optimistic update (@diegomedina248) +- [#20472](https://github.com/apache/superset/pull/20472) fix: Changes the return type of get_permissions to be JSON friendly (@michael-s-molina) +- [#20468](https://github.com/apache/superset/pull/20468) fix: async queries limit bug (@AAfghahi) +- [#20257](https://github.com/apache/superset/pull/20257) fix(home): Show home page tabs as pills instead of links (@prosdev0107) +- [#20340](https://github.com/apache/superset/pull/20340) fix: ensure column name in description is string (@betodealmeida) +- [#20350](https://github.com/apache/superset/pull/20350) fix(viz): BigQuery time grain 'minute'/'second' throws an error (@diegomedina248) +- [#20384](https://github.com/apache/superset/pull/20384) fix(chart & table): Prevent the dates from wrapping in table chart (@prosdev0107) +- [#20404](https://github.com/apache/superset/pull/20404) fix: suppress translation warning in jest (@zhaoyongjie) +- [#20451](https://github.com/apache/superset/pull/20451) fix: should raise exception when apply a categorical axis (@zhaoyongjie) +- [#20447](https://github.com/apache/superset/pull/20447) fix: table viz sort icon bottom aligned (@diegomedina248) +- [#20326](https://github.com/apache/superset/pull/20326) fix(fbprophet): Fix weekly frequencies (@john-bodley) +- [#20434](https://github.com/apache/superset/pull/20434) fix(20428): Address-Presto/Trino-Poll-Issue-Refactor (@Thelin90) +- [#20411](https://github.com/apache/superset/pull/20411) fix(dashboard): new created chart did not have high lighted effect when using the permalink of chart share in dashboard (@diegomedina248) +- [#20261](https://github.com/apache/superset/pull/20261) fix(embedded): CSV download for chart (@lilykuang) +- [#20276](https://github.com/apache/superset/pull/20276) fix(cosmetic): cannot find m-r-10 class in superset.less (@Renderz) +- [#20420](https://github.com/apache/superset/pull/20420) fix: rm eslint-plugin-translation-vars engines requirement (@stephenLYZ) +- [#20409](https://github.com/apache/superset/pull/20409) fix(bar-chart-v2): remove marker control from bar chart V2 (@stephenLYZ) +- [#20333](https://github.com/apache/superset/pull/20333) fix(presto): use milliseconds timespec for presto (@mohittt8) +- [#20414](https://github.com/apache/superset/pull/20414) fix: key error on permalink fetch for old permalinks (@eschutho) +- [#20410](https://github.com/apache/superset/pull/20410) fix: Adding extra metrics issue after chart configuration (@codemaster08240328) +- [#20405](https://github.com/apache/superset/pull/20405) fix: Incorrect translations in Chinese in messages.po (@chuancyzhang) +- [#20396](https://github.com/apache/superset/pull/20396) fix(plugin-chart-pivot-table): color weight of Conditional formatting metrics not work (@stephenLYZ) +- [#20361](https://github.com/apache/superset/pull/20361) fix(fonts): Show the all the A's in our workspace correctly, not funky (@prosdev0107) +- [#20383](https://github.com/apache/superset/pull/20383) fix: Unable to export multiple Dashboards with the same name (@diegomedina248) +- [#20363](https://github.com/apache/superset/pull/20363) fix: A newly connected database doesn't appear in the databases list if user connected database using the 'plus' button (@diegomedina248) +- [#20372](https://github.com/apache/superset/pull/20372) fix: update connection modal to use existing catalog (@pkdotson) +- [#20368](https://github.com/apache/superset/pull/20368) fix(VERSIONED_EXPORTS): Ensure dashboards and charts adhere to the VERSIONED_EXPORTS feature flag (@john-bodley) +- [#20351](https://github.com/apache/superset/pull/20351) fix: catch some potential errors on dual write (@eschutho) +- [#20364](https://github.com/apache/superset/pull/20364) fix: query execution time is not fully displayed in bubble icon (@diegomedina248) +- [#20365](https://github.com/apache/superset/pull/20365) fix: Fix typo in Error handling message (@codemaster08240328) +- [#19967](https://github.com/apache/superset/pull/19967) fix: A newly connected database doesn't appear in the databases list if user connected database using the 'plus' button (@diegomedina248) +- [#20348](https://github.com/apache/superset/pull/20348) fix(docker): Make Gunicorn Keepalive Adjustable (@mdeshmu) +- [#19670](https://github.com/apache/superset/pull/19670) fix: Add serviceAccountName to celerybeat pods (@paulinjo) +- [#20315](https://github.com/apache/superset/pull/20315) fix(chart): chart gets cut off on the dashboard (@stephenLYZ) +- [#20324](https://github.com/apache/superset/pull/20324) fix: superset-ui/core coverage (@zhaoyongjie) +- [#20282](https://github.com/apache/superset/pull/20282) fix(explore): Make that see more/see less works correctly with scrolling when error msg is long text. (@prosdev0107) +- [#20296](https://github.com/apache/superset/pull/20296) fix: Alpha are unable to perform a second modification to a Dataset when in Explore (@hughhhh) +- [#20290](https://github.com/apache/superset/pull/20290) fix: Faulty datetime parser regex (@reesercollins) +- [#19761](https://github.com/apache/superset/pull/19761) fix(plugin-chart-echarts): [feature-parity] apply button of annotation layer doesn't work as expected (@stephenLYZ) +- [#20263](https://github.com/apache/superset/pull/20263) fix(embedded): accessing variable response before initialization (@zhaorui2022) +- [#20274](https://github.com/apache/superset/pull/20274) fix(codecov): improve core code coverage (@stephenLYZ) +- [#20187](https://github.com/apache/superset/pull/20187) fix: Database import with cancel_query.. extra field (@codemaster08240328) +- [#20237](https://github.com/apache/superset/pull/20237) fix(cosmetic): Fix Datasource Modal Out Of Box (@Renderz) +- [#20058](https://github.com/apache/superset/pull/20058) fix: Support the Clipboard API in modern browsers (@diegomedina248) +- [#20164](https://github.com/apache/superset/pull/20164) fix(sql lab): View result button is not showing consistently (@diegomedina248) +- [#20171](https://github.com/apache/superset/pull/20171) fix(charts list): do not trigger ListViewError exception for anonymous user (@trepmag) +- [#20178](https://github.com/apache/superset/pull/20178) fix: While exporting CSV , only the entries on first page are getting downloaded even when user is on other pages #17861 (@LahmerIlyas) +- [#20204](https://github.com/apache/superset/pull/20204) fix: Fixes issue where results panel height was incorrect [sc-49045] (@eric-briscoe) +- [#20235](https://github.com/apache/superset/pull/20235) fix: Box Plot Chart throws an error when the average (AVG) / SUM is being calculated on the Metrics (@diegomedina248) +- [#20088](https://github.com/apache/superset/pull/20088) fix: datatype tracking issue on virtual dataset (@codemaster08240328) +- [#20220](https://github.com/apache/superset/pull/20220) fix: dashbaord unable to refresh (@zhaoyongjie) +- [#20228](https://github.com/apache/superset/pull/20228) fix: failed samples should throw exception (@zhaoyongjie) +- [#20203](https://github.com/apache/superset/pull/20203) fix: move columns to datasource object for bootstrap data (@hughhhh) +- [#20151](https://github.com/apache/superset/pull/20151) fix(csv): Ensure df_to_escaped_csv does not coerce integer columns to float (@john-bodley) +- [#20221](https://github.com/apache/superset/pull/20221) fix(legacy-plugin-chart-sunburst): linear color scheme not work when secondary metric is provided (@stephenLYZ) +- [#20223](https://github.com/apache/superset/pull/20223) fix(legacy-plugin-chart-sunburst): chart broken when secondary metric is removed (@stephenLYZ) +- [#20147](https://github.com/apache/superset/pull/20147) fix(cosmetic): Limiting modal height (@rusackas) +- [#20206](https://github.com/apache/superset/pull/20206) fix(sql lab): SQL Lab Compile Query Delay (@diegomedina248) +- [#20201](https://github.com/apache/superset/pull/20201) fix: unable to set destroyOnClose on ModalTrigger (@zhaoyongjie) +- [#20186](https://github.com/apache/superset/pull/20186) fix(db): make to allow to show/hide the password when only creating (@prosdev0107) +- [#20127](https://github.com/apache/superset/pull/20127) fix(database): retrival of tables and views from schema for exasol backend (@Nicoretti) +- [#19899](https://github.com/apache/superset/pull/19899) fix: always create parameter json field (@pkdotson) +- [#20173](https://github.com/apache/superset/pull/20173) fix: avoid while cycle in computeMaxFontSize for big Number run forever when css rule applied (@diegomedina248) +- [#20086](https://github.com/apache/superset/pull/20086) fix(css): transparent linear gradient not working in safari (@stephenLYZ) +- [#19102](https://github.com/apache/superset/pull/19102) fix: string aggregation is incorrect in PivotTableV2 (@diegomedina248) +- [#20011](https://github.com/apache/superset/pull/20011) fix(chart & heatmap): make to fix that y label is rendering out of bounds (@prosdev0107) +- [#20142](https://github.com/apache/superset/pull/20142) fix(explore): handle null control sections (@villebro) +- [#20128](https://github.com/apache/superset/pull/20128) fix: advanced data type API spec and permission name (@dpgaspar) +- [#20107](https://github.com/apache/superset/pull/20107) fix(generic-chart-axes): set x-axis if unset and ff is enabled (@villebro) +- [#20018](https://github.com/apache/superset/pull/20018) fix(modal): add primary button loading state to modals (@kgopal492) +- [#20099](https://github.com/apache/superset/pull/20099) fix: Add cypress test for report page direct link issue (@codemaster08240328) +- [#20068](https://github.com/apache/superset/pull/20068) fix: dbmodal test connection error timeout (@pkdotson) +- [#20092](https://github.com/apache/superset/pull/20092) fix: Revert "feat(explore): Show confirmation modal if user exits Explore without saving changes (#19993) (@kgabryje) +- [#19939](https://github.com/apache/superset/pull/19939) fix(chart & alert): make to show metrics properly (@prosdev0107) +- [#20085](https://github.com/apache/superset/pull/20085) fix: typo in `importexport/api.py` OpenAPI (@betodealmeida) +- [#20051](https://github.com/apache/superset/pull/20051) fix(CRUD): make to fix the dancing when crud view is on hover (@prosdev0107) +- [#20064](https://github.com/apache/superset/pull/20064) fix(chart & gallery): make to add mixed time-series into recommended charts (@prosdev0107) +- [#20013](https://github.com/apache/superset/pull/20013) fix: The dynamic form to connect to Snowflake DB is not returning any errors (@diegomedina248) +- [#20029](https://github.com/apache/superset/pull/20029) fix(plugin-chart-echarts): tooltip of big number truncated at then bottom (@stephenLYZ) +- [#19914](https://github.com/apache/superset/pull/19914) fix: Refactor SQL engine username logic (@john-bodley) +- [#20050](https://github.com/apache/superset/pull/20050) fix: Fixes Tabs style (@michael-s-molina) +- [#20048](https://github.com/apache/superset/pull/20048) fix(homepage): make to show indicator when tab is chosen (@prosdev0107) +- [#20026](https://github.com/apache/superset/pull/20026) fix(chart & filters): make to padding between textarea and buttons (@prosdev0107) +- [#20019](https://github.com/apache/superset/pull/20019) fix(embedded): third party cookies (@lilykuang) +- [#20033](https://github.com/apache/superset/pull/20033) fix: Direct Linking issue on report list: 404 status code. (@codemaster08240328) +- [#19977](https://github.com/apache/superset/pull/19977) fix(word-cloud): fix randomness of each word's rotation (@ebaratte) +- [#20021](https://github.com/apache/superset/pull/20021) fix: native filter truncation rerendering loop on hover (@diegomedina248) +- [#20004](https://github.com/apache/superset/pull/20004) fix: URI form is blank when trying to connect from sql lab (@diegomedina248) +- [#19841](https://github.com/apache/superset/pull/19841) fix: Table chart column config issue (@codemaster08240328) +- [#19877](https://github.com/apache/superset/pull/19877) fix: Making chart update more truthful (@Gwitchr) +- [#19996](https://github.com/apache/superset/pull/19996) fix: Use pull_request_target in Cypress Applitools workflow (@geido) +- [#19972](https://github.com/apache/superset/pull/19972) fix: revert chore(deps): bump d3-svg-legend in /superset-frontend (#19846) (@villebro) +- [#19889](https://github.com/apache/superset/pull/19889) fix: Fix auto-reversion of label/title in the Metrics popover (@diegomedina248) +- [#19903](https://github.com/apache/superset/pull/19903) fix(explore): Explore data table tooltip (@Gwitchr) +- [#19938](https://github.com/apache/superset/pull/19938) fix(chart & table): make to allow highlight in case of numeric column (@prosdev0107) +- [#19839](https://github.com/apache/superset/pull/19839) fix(dashboard): allow users to resize the markdown widget easier (@cccs-Dustin) +- [#19887](https://github.com/apache/superset/pull/19887) fix(hive): Workaround for Python 3.9 s3 transfer issue (@john-bodley) +- [#19936](https://github.com/apache/superset/pull/19936) fix: OpenAPI docs small fixes (@dpgaspar) +- [#19932](https://github.com/apache/superset/pull/19932) fix: can not correctly set force in store (@zhaoyongjie) +- [#19930](https://github.com/apache/superset/pull/19930) fix: memoize primitives (@betodealmeida) +- [#19926](https://github.com/apache/superset/pull/19926) fix(dataset): DAO update (@betodealmeida) +- [#19826](https://github.com/apache/superset/pull/19826) fix: Missing `f` prefix on f-strings (@code-review-doctor) +- [#18988](https://github.com/apache/superset/pull/18988) fix(column-header-tooltip): make that hide the tooltip when the cloum… (@prosdev0107) +- [#19782](https://github.com/apache/superset/pull/19782) fix: chart import error with virtual dataset (@codemaster08240328) +- [#19485](https://github.com/apache/superset/pull/19485) fix: Set fixed maxWidth of the cron schedule modal (@codemaster08240328) +- [#19885](https://github.com/apache/superset/pull/19885) fix: Chart download as image issue (@codemaster08240328) +- [#19883](https://github.com/apache/superset/pull/19883) fix(allow-db-explore): make to check the allow virtual table explore option by default (@prosdev0107) +- [#19835](https://github.com/apache/superset/pull/19835) fix(helm): fix postgresql values (@benjamin-texier) +- [#19758](https://github.com/apache/superset/pull/19758) fix(plugin-chart-echarts): [feature parity] annotation line chart color does not work (@stephenLYZ) +- [#19879](https://github.com/apache/superset/pull/19879) fix(plugin-chart-handlebars): fix overflow, debounce and control reset (@villebro) +- [#19668](https://github.com/apache/superset/pull/19668) fix: Dates alignment in Table viz (@geido) +- [#19876](https://github.com/apache/superset/pull/19876) fix: Cannot re-order metrics by drag and drop (@diegomedina248) +- [#19840](https://github.com/apache/superset/pull/19840) fix(dashboard-css): make to load saved css template (@prosdev0107) +- [#19859](https://github.com/apache/superset/pull/19859) fix: Dashboard report creation error handling (@etr2460) +- [#19857](https://github.com/apache/superset/pull/19857) fix: Update eslint error message to reflect location of antd components (@etr2460) +- [#19605](https://github.com/apache/superset/pull/19605) fix: Query execution time is displayed as invalid date (@diegomedina248) +- [#19694](https://github.com/apache/superset/pull/19694) fix(db & connection): make to show/hide the password when only creating db connection (@prosdev0107) +- [#19778](https://github.com/apache/superset/pull/19778) fix: deck.gl GeoJsonLayer Autozoom & fill/stroke options (@diegomedina248) +- [#19850](https://github.com/apache/superset/pull/19850) fix: Regression on Data and Alerts & Reports Headers (@diegomedina248) +- [#19842](https://github.com/apache/superset/pull/19842) fix: count(distinct column_name) in metrics (@zhaoyongjie) +- [#19843](https://github.com/apache/superset/pull/19843) fix(explore): ignore temporary controls in altered pill (@villebro) +- [#19800](https://github.com/apache/superset/pull/19800) fix: Cypress tests reliability improvements (@diegomedina248) +- [#19575](https://github.com/apache/superset/pull/19575) fix: Show full long number in text email report for table chart. (@codemaster08240328) +- [#19429](https://github.com/apache/superset/pull/19429) fix(dashboard): make to filter the correct certified or non-certified… (@prosdev0107) +- [#13082](https://github.com/apache/superset/pull/13082) fix(sql_lab): Add custom timestamp type for literal casting for presto timestamps (@kekwan) +- [#19797](https://github.com/apache/superset/pull/19797) fix: add missing init files (@suddjian) +- [#19672](https://github.com/apache/superset/pull/19672) fix: trap SQLAlchemy common exceptions & throw 422 error instead (@diegomedina248) +- [#19288](https://github.com/apache/superset/pull/19288) fix: AlertReportCronScheduler tests (@diegomedina248) +- [#19781](https://github.com/apache/superset/pull/19781) fix(world-map): remove categorical color control (@serenajiang) +- [#19792](https://github.com/apache/superset/pull/19792) fix(plugin-chart-table): Resetting controls when switching query mode (@kgabryje) +- [#19755](https://github.com/apache/superset/pull/19755) fix: small cleanup for created by me dashboards API (@dpgaspar) +- [#19784](https://github.com/apache/superset/pull/19784) fix(readme): Remove broken link to legacy gallery (@drluckyspin) +- [#19722](https://github.com/apache/superset/pull/19722) fix: dashboard top level tabs edit (@diegomedina248) +- [#19777](https://github.com/apache/superset/pull/19777) fix(explore): Double divider if no permissions for adding reports (@kgabryje) +- [#19673](https://github.com/apache/superset/pull/19673) fix(import): Add the error alert on failed database import (@prosdev0107) +- [#19518](https://github.com/apache/superset/pull/19518) fix: alert/report created by filter inconsistency with table display (@diegomedina248) +- [#19700](https://github.com/apache/superset/pull/19700) fix: remove expose (@AAfghahi) +- [#19626](https://github.com/apache/superset/pull/19626) fix: deactivate embedding on a dashboard (@suddjian) +- [#19472](https://github.com/apache/superset/pull/19472) fix: Dashboard Edit View Tab Headers Hidden when Dashboard Name is Long (@diegomedina248) +- [#19311](https://github.com/apache/superset/pull/19311) fix(sql lab): add quotes when autocompleting table names with spaces in the editor (@diegomedina248) +- [#19290](https://github.com/apache/superset/pull/19290) fix(sql lab): select edit on query from history doesn't upload editor properly (@diegomedina248) +- [#19420](https://github.com/apache/superset/pull/19420) fix: sql lab ctrl t behaved differently from clicking (@Gwitchr) +- [#19357](https://github.com/apache/superset/pull/19357) fix: Redirect to full url on 401 (@geido) +- [#19001](https://github.com/apache/superset/pull/19001) fix: Line Chart Annotation Info Update (@codemaster08240328) +- [#19714](https://github.com/apache/superset/pull/19714) fix: create virtual table with exotic type (@villebro) +- [#19708](https://github.com/apache/superset/pull/19708) fix(nav): infinite redirect and upload dataset nav permissions (@ktmud) +- [#19430](https://github.com/apache/superset/pull/19430) fix(data-upload): make to change err message (@prosdev0107) +- [#19419](https://github.com/apache/superset/pull/19419) fix(alert & report): make to fix the issue when recreate report (@prosdev0107) +- [#19371](https://github.com/apache/superset/pull/19371) fix: Reset sorting bar issue in Barchart (@codemaster08240328) +- [#19362](https://github.com/apache/superset/pull/19362) fix(sql lab): display the 'View Results' button consistently in the history tab on sync mode (@diegomedina248) +- [#19294](https://github.com/apache/superset/pull/19294) fix: improve alerts & reports modal on small devices (@diegomedina248) +- [#19257](https://github.com/apache/superset/pull/19257) fix(sql lab): table selector should display all the selected tables (@diegomedina248) +- [#19686](https://github.com/apache/superset/pull/19686) fix(plugin-chart-echarts): xAxis scale is not correct when time grain is quarter (@stephenLYZ) +- [#19646](https://github.com/apache/superset/pull/19646) fix(explore): Change copy of cross filters checkbox (@kgabryje) +- [#19586](https://github.com/apache/superset/pull/19586) fix: Navbar styles and Welcome page text (@geido) +- [#19662](https://github.com/apache/superset/pull/19662) fix(database-api): allow search for all columns (@villebro) +- [#19656](https://github.com/apache/superset/pull/19656) fix: allow_browser_login in import/export API (@betodealmeida) +- [#19628](https://github.com/apache/superset/pull/19628) fix: Table Autosizing Has Unnecessary Horizontal Scroll Bars (@diegomedina248) +- [#19573](https://github.com/apache/superset/pull/19573) fix(chart & polygon): make to fix the issue the polygon chart (@prosdev0107) +- [#19051](https://github.com/apache/superset/pull/19051) fix: update Permissions for right nav (@AAfghahi) +- [#19625](https://github.com/apache/superset/pull/19625) fix(test): make test_clean_requests_after_schema_grant more idempotent (@ktmud) +- [#19571](https://github.com/apache/superset/pull/19571) fix: Catch literal colors when theme top level (@geido) +- [#19594](https://github.com/apache/superset/pull/19594) fix: spelling of following (@lzm0) +- [#19569](https://github.com/apache/superset/pull/19569) fix: check type of url before performing string actions (@eschutho) +- [#19570](https://github.com/apache/superset/pull/19570) fix: sqloxide optional (@betodealmeida) +- [#19397](https://github.com/apache/superset/pull/19397) fix: weight tooltip issue (@codemaster08240328) +- [#19313](https://github.com/apache/superset/pull/19313) fix(sql lab): increase the size of the action icons in the history tab (@diegomedina248) +- [#19039](https://github.com/apache/superset/pull/19039) fix(explore): clean data when hidding control (@stephenLYZ) +- [#19444](https://github.com/apache/superset/pull/19444) fix: Error Message is cut off in alerts & reports log page (@codemaster08240328) +- [#19312](https://github.com/apache/superset/pull/19312) fix: adaptive formatting typo in explore dropdowns (@diegomedina248) +- [#19534](https://github.com/apache/superset/pull/19534) fix(explore): Chart header icon paddings (@kgabryje) +- [#19399](https://github.com/apache/superset/pull/19399) fix: native filter dropdown not attached to parent node (@diegomedina248) +- [#19112](https://github.com/apache/superset/pull/19112) fix: Dashboard import holding issue (@codemaster08240328) +- [#19342](https://github.com/apache/superset/pull/19342) fix: Clean up custom css when dashboard unmounted (@codemaster08240328) +- [#19491](https://github.com/apache/superset/pull/19491) fix: Dynamic form to connect to Snowflake DB is not displaying authentication errors (@diegomedina248) +- [#19528](https://github.com/apache/superset/pull/19528) fix: Correct Ukraine map (@wacken89) +- [#19522](https://github.com/apache/superset/pull/19522) fix: add back view for report reload error (@pkdotson) +- [#19519](https://github.com/apache/superset/pull/19519) fix: GSheets rendering from global nav (@hughhhh) +- [#19358](https://github.com/apache/superset/pull/19358) fix(sqllab): make to hide the delete button of most recent query history (@prosdev0107) +- [#19307](https://github.com/apache/superset/pull/19307) fix: Logo resizing on page load (@geido) +- [#19166](https://github.com/apache/superset/pull/19166) fix: time filter should be [start, end) (@zhaoyongjie) + +**Others** + +- [#20620](https://github.com/apache/superset/pull/20620) docs: fix link for Apache Superset source code (@dpgaspar) +- [#20621](https://github.com/apache/superset/pull/20621) chore: bump FAB to 4.1.3 (@dpgaspar) +- [#20486](https://github.com/apache/superset/pull/20486) chore: Updated copy in chart drop down to "View as table" (@lauderbaugh) +- [#20116](https://github.com/apache/superset/pull/20116) style(typo): occured -> occurred (@sfirke) +- [#20401](https://github.com/apache/superset/pull/20401) chore: add action to welcome new users (@eschutho) +- [#20269](https://github.com/apache/superset/pull/20269) chore(docs): Remove cache warming documentation (@ajwhite) +- [#20194](https://github.com/apache/superset/pull/20194) chore: Removes unused vars (@michael-s-molina) +- [#20321](https://github.com/apache/superset/pull/20321) chore: add breaking change information about form_data datasource_type (@eschutho) +- [#20298](https://github.com/apache/superset/pull/20298) chore: Removes no-use-before-define warnings (@michael-s-molina) +- [#20337](https://github.com/apache/superset/pull/20337) chore(dashboard): update Edit Dashboard side panel tabs (@codyml) +- [#20318](https://github.com/apache/superset/pull/20318) chore: Updates the final steps of the release README (@michael-s-molina) +- [#20307](https://github.com/apache/superset/pull/20307) docs: Updates CHANGELOG.md with 1.5.1 fixes (@michael-s-molina) +- [#20308](https://github.com/apache/superset/pull/20308) docs(jinja): Detail how to use Jinja parameters (@EBoisseauSierra) +- [#20304](https://github.com/apache/superset/pull/20304) chore: superset-ui/core code coverage (@zhaoyongjie) +- [#20297](https://github.com/apache/superset/pull/20297) chore(deps): pinning pyjwt to 2.4.0 (@sadpandajoe) +- [#20287](https://github.com/apache/superset/pull/20287) chore(deps): bump numpy 1.22.1 and PyJWT to 2.4.0 (@sadpandajoe) +- [#20272](https://github.com/apache/superset/pull/20272) chore: remove unused codes for samples (@zhaoyongjie) +- [#20289](https://github.com/apache/superset/pull/20289) chore: Adjusts release emails (@michael-s-molina) +- [#20180](https://github.com/apache/superset/pull/20180) docs: facelift the docs (@mistercrunch) +- [#20249](https://github.com/apache/superset/pull/20249) chore: add event logger to reports/alerts CRUD (@AAfghahi) +- [#20273](https://github.com/apache/superset/pull/20273) chore: adjust the psycopg2 version of k8s installation guide (@ensky) +- [#20152](https://github.com/apache/superset/pull/20152) refactor(trino): Handful of updates for the Trino engine (@john-bodley) +- [#20252](https://github.com/apache/superset/pull/20252) chore: use exc_info to pass errors to log warnings (@eschutho) +- [#20154](https://github.com/apache/superset/pull/20154) chore(requirements): Cleanup of Python requirements (@john-bodley) +- [#20226](https://github.com/apache/superset/pull/20226) refactor: decouple DataTableControl (@zhaoyongjie) +- [#20243](https://github.com/apache/superset/pull/20243) docs: Add beans to users list (@kakoni) +- [#20231](https://github.com/apache/superset/pull/20231) docs: Updates release scripts and docs (@michael-s-molina) +- [#20196](https://github.com/apache/superset/pull/20196) chore: bumping min version of shillelagh (@AAfghahi) +- [#20192](https://github.com/apache/superset/pull/20192) chore: Moves date utils to utils folder (@michael-s-molina) +- [#20210](https://github.com/apache/superset/pull/20210) docs: update release instructions (@villebro) +- [#20205](https://github.com/apache/superset/pull/20205) chore(deps): bump swagger-ui-react from 4.1.2 to 4.1.3 in /docs (@dependabot[bot]) +- [#20195](https://github.com/apache/superset/pull/20195) docs: correct case of ClickHouse (@DanRoscigno) +- [#20109](https://github.com/apache/superset/pull/20109) refactor: decouple DataTablesPane (@zhaoyongjie) +- [#20193](https://github.com/apache/superset/pull/20193) refactor: Removes embedded/index.tsx warnings (@michael-s-molina) +- [#20185](https://github.com/apache/superset/pull/20185) docs(security): a typo: Gamma should be in quotes (@jimmytheneutrino) +- [#20146](https://github.com/apache/superset/pull/20146) chore: Implement global header in Dashboard (@geido) +- [#20174](https://github.com/apache/superset/pull/20174) chore: Disable flaky assert in reports cypress test (@kgabryje) +- [#20163](https://github.com/apache/superset/pull/20163) chore: change button name in Sql Lab (@AAfghahi) +- [#20157](https://github.com/apache/superset/pull/20157) chore: filter undefined operators (@zhaoyongjie) +- [#20140](https://github.com/apache/superset/pull/20140) chore(data-table): make formatted dttm the default (@villebro) +- [#20104](https://github.com/apache/superset/pull/20104) chore: fix INTHEWILD sort order and indentation (@villebro) +- [#20093](https://github.com/apache/superset/pull/20093) chore: Add the tnum font property to Table components (@geido) +- [#20103](https://github.com/apache/superset/pull/20103) docs: Update INTHEWILD.md (@fccoelho) +- [#20102](https://github.com/apache/superset/pull/20102) chore: Update aiohttp to 3.8.1 (@diegomedina248) +- [#20066](https://github.com/apache/superset/pull/20066) chore: Set limit for a query in execute_sql_statement (@AAfghahi) +- [#20032](https://github.com/apache/superset/pull/20032) chore: Change copy to Edit chart in Dashboard dropdown (@geido) +- [#20071](https://github.com/apache/superset/pull/20071) chore: Fix and enhance Applitools workflows (@geido) +- [#19966](https://github.com/apache/superset/pull/19966) test: make tabbed dashboard a little more complex (@ktmud) +- [#19976](https://github.com/apache/superset/pull/19976) perf(plugin-chart-table): Add memoization to avoid rerenders (@kgabryje) +- [#20044](https://github.com/apache/superset/pull/20044) chore: Create a generic header component for Explore and Dashboard (@kgabryje) +- [#20046](https://github.com/apache/superset/pull/20046) docs: add changelog and updating entries for 1.5.0 (@villebro) +- [#19962](https://github.com/apache/superset/pull/19962) chore: add doc link for db migration conflict warning (@ktmud) +- [#20034](https://github.com/apache/superset/pull/20034) chore: Changes the no-literal-colors lint rule to throw errors instead of warnings (@michael-s-molina) +- [#20031](https://github.com/apache/superset/pull/20031) chore: Run Applitools + Cypress nightly (@geido) +- [#20006](https://github.com/apache/superset/pull/20006) chore: Removes hard-coded colors from the plugins - iteration 2 (@michael-s-molina) +- [#19130](https://github.com/apache/superset/pull/19130) refactor: Refactor reports for Charts and Dashboards (@AAfghahi) +- [#20016](https://github.com/apache/superset/pull/20016) chore: Removes hard-coded colors - iteration 3 (@michael-s-molina) +- [#19870](https://github.com/apache/superset/pull/19870) docs: Detail front-end development instructions (@EBoisseauSierra) +- [#19971](https://github.com/apache/superset/pull/19971) docs: Add config for running on a WSGI HTTP server (@thinhnd2104) +- [#20008](https://github.com/apache/superset/pull/20008) chore: Upgrades Storybook from 6.4.19 to 6.4.22 (@michael-s-molina) +- [#20009](https://github.com/apache/superset/pull/20009) docs: typo in chart-params markdown file (@JakobMiksch) +- [#19923](https://github.com/apache/superset/pull/19923) chore: Removes hard-coded colors from the plugins - iteration 1 (@michael-s-molina) +- [#19954](https://github.com/apache/superset/pull/19954) chore: convert URLShortLinkButton to typescript (@ktmud) +- [#19929](https://github.com/apache/superset/pull/19929) chore: change subject name from no_name to named for PNGs in (@AAfghahi) +- [#19942](https://github.com/apache/superset/pull/19942) refactor(ReportModal): simplify state reducer and improve error handling (@ktmud) +- [#19770](https://github.com/apache/superset/pull/19770) chore: remove druid datasource from the config (@eschutho) +- [#19911](https://github.com/apache/superset/pull/19911) chore: Fix broken link for DouroECI (@mavimo) +- [#19951](https://github.com/apache/superset/pull/19951) chore: Adds the theme object to chart properties (@michael-s-molina) +- [#19813](https://github.com/apache/superset/pull/19813) chore: get embedded user with roles and permissions (@suddjian) +- [#19897](https://github.com/apache/superset/pull/19897) chore: Adds a storybook to FilterableTable (@michael-s-molina) +- [#19924](https://github.com/apache/superset/pull/19924) chore(reports): Improving logging around failed scheduled reports (@craig-rueda) +- [#19906](https://github.com/apache/superset/pull/19906) revert: "fix(sql lab): display the 'View Results' button consistently in the history tab on sync mode" (@Gwitchr) +- [#19916](https://github.com/apache/superset/pull/19916) chore(deps): bump react-virtualized-auto-sizer from 1.0.2 to 1.0.6 in /superset-frontend (@dependabot[bot]) +- [#19888](https://github.com/apache/superset/pull/19888) chore(deps): bump cross-fetch from 3.1.4 to 3.1.5 in /docs (@dependabot[bot]) +- [#19894](https://github.com/apache/superset/pull/19894) chore(deps-dev): bump eslint-plugin-prettier from 3.3.1 to 4.0.0 in /superset-frontend (@dependabot[bot]) +- [#19602](https://github.com/apache/superset/pull/19602) docs: Added gtag to docusaurus (@AAfghahi) +- [#19878](https://github.com/apache/superset/pull/19878) chore(deps-dev): bump @storybook/client-api from 6.4.19 to 6.4.22 in /superset-frontend (@dependabot[bot]) +- [#19821](https://github.com/apache/superset/pull/19821) test(native filter): refactor and add new test (@jinghua-qa) +- [#19613](https://github.com/apache/superset/pull/19613) chore: Update line-height in SliceHeaderControl (@geido) +- [#19616](https://github.com/apache/superset/pull/19616) chore: Update font-sizes in DatabaseModal (@geido) +- [#19866](https://github.com/apache/superset/pull/19866) chore: fix explore pills (@villebro) +- [#19872](https://github.com/apache/superset/pull/19872) chore: Update aiohttp>=3.7.4 in requirements (@hughhhh) +- [#19874](https://github.com/apache/superset/pull/19874) chore: bump rockset>=0.8.10, <0.9 (@hughhhh) +- [#19864](https://github.com/apache/superset/pull/19864) chore(deps): bump react-syntax-highlighter from 15.4.5 to 15.5.0 in /superset-frontend (@dependabot[bot]) +- [#19828](https://github.com/apache/superset/pull/19828) chore: add custom eslint plugin to prevent translation variables (@stephenLYZ) +- [#19845](https://github.com/apache/superset/pull/19845) chore(deps): bump react-split from 2.0.9 to 2.0.14 in /superset-frontend (@dependabot[bot]) +- [#19846](https://github.com/apache/superset/pull/19846) chore(deps): bump d3-svg-legend from 1.13.0 to 2.25.6 in /superset-frontend (@dependabot[bot]) +- [#19847](https://github.com/apache/superset/pull/19847) chore(deps-dev): bump eslint-plugin-jsx-a11y from 6.4.1 to 6.5.1 in /superset-frontend (@dependabot[bot]) +- [#19853](https://github.com/apache/superset/pull/19853) chore(frontend-tests): Spelling (@jsoref) +- [#19823](https://github.com/apache/superset/pull/19823) docs: updated links for country map scripts (@ktmud) +- [#19829](https://github.com/apache/superset/pull/19829) chore(deps-dev): bump babel-loader from 8.2.4 to 8.2.5 in /superset-frontend (@dependabot[bot]) +- [#19830](https://github.com/apache/superset/pull/19830) chore(deps): bump react-hot-loader from 4.12.20 to 4.13.0 in /superset-frontend (@dependabot[bot]) +- [#19403](https://github.com/apache/superset/pull/19403) chore(deps-dev): bump babel-loader from 8.2.2 to 8.2.4 in /superset-frontend (@dependabot[bot]) +- [#19637](https://github.com/apache/superset/pull/19637) chore(deps): bump moment from 2.29.1 to 2.29.2 in /superset-frontend (@dependabot[bot]) +- [#19681](https://github.com/apache/superset/pull/19681) chore(deps): bump async from 3.2.0 to 3.2.3 in /superset-frontend/cypress-base (@dependabot[bot]) +- [#19680](https://github.com/apache/superset/pull/19680) chore(deps): bump async from 3.2.0 to 3.2.3 in /superset-websocket (@dependabot[bot]) +- [#19020](https://github.com/apache/superset/pull/19020) chore(deps): bump url-parse from 1.5.7 to 1.5.10 in /superset-frontend (@dependabot[bot]) +- [#17978](https://github.com/apache/superset/pull/17978) chore(deps): bump @types/d3-time from 1.1.1 to 3.0.0 in /superset-frontend (@dependabot[bot]) +- [#19727](https://github.com/apache/superset/pull/19727) chore(deps): bump async from 2.6.3 to 2.6.4 in /docs (@dependabot[bot]) +- [#19551](https://github.com/apache/superset/pull/19551) chore(deps): bump minimist from 1.2.5 to 1.2.6 in /superset-websocket (@dependabot[bot]) +- [#19165](https://github.com/apache/superset/pull/19165) chore: simplify error messaging in database modal (@pkdotson) +- [#19790](https://github.com/apache/superset/pull/19790) chore: bump postgres from 10 to 14 (@dpgaspar) +- [#19480](https://github.com/apache/superset/pull/19480) chore: Update UPDATING.md (@john-bodley) +- [#19740](https://github.com/apache/superset/pull/19740) chore: fix grammar error (@zhaoyongjie) +- [#19703](https://github.com/apache/superset/pull/19703) chore(build): upgrade less-loader (@ktmud) +- [#19736](https://github.com/apache/superset/pull/19736) chore: Updates the Select code owners (@michael-s-molina) +- [#19715](https://github.com/apache/superset/pull/19715) docs(install): ubuntu default-libmysqlclient-dev (@cemremengu) +- [#19726](https://github.com/apache/superset/pull/19726) chore: bumping shillelagh (@AAfghahi) +- [#19699](https://github.com/apache/superset/pull/19699) chore: fix typo (@betodealmeida) +- [#19674](https://github.com/apache/superset/pull/19674) chore: upgrade Pillow (@betodealmeida) +- [#19647](https://github.com/apache/superset/pull/19647) chore(explore): Change labels "Group by"/"Series" to "Dimensions" (@kgabryje) +- [#19679](https://github.com/apache/superset/pull/19679) chore(deps): bump urijs from 1.19.8 to 1.19.11 in /superset-frontend (@dependabot[bot]) +- [#19638](https://github.com/apache/superset/pull/19638) chore(deps): bump moment from 2.29.1 to 2.29.2 in /docs (@dependabot[bot]) +- [#19617](https://github.com/apache/superset/pull/19617) chore: updated two github issue templates (@srinify) +- [#19666](https://github.com/apache/superset/pull/19666) chore: Remove TwoTone icons (@geido) +- [#19614](https://github.com/apache/superset/pull/19614) chore: Remove wrong usage of font-size in ExploreViewContainer (@geido) +- [#19593](https://github.com/apache/superset/pull/19593) chore: Update font-sizes in ReportModal (@geido) +- [#19611](https://github.com/apache/superset/pull/19611) chore: Update font-sizes in ImportModal (@geido) +- [#19615](https://github.com/apache/superset/pull/19615) chore: Update font-sizes in AlertReportModal (@geido) +- [#19620](https://github.com/apache/superset/pull/19620) chore: Update font-sizes in QueryPreviewModal (@geido) +- [#19641](https://github.com/apache/superset/pull/19641) chore: clean up dynamic translation strings (@villebro) +- [#19635](https://github.com/apache/superset/pull/19635) refactor: consistent migration tests organization (@ktmud) +- [#19634](https://github.com/apache/superset/pull/19634) test: freeze time for dashboard export test (@ktmud) +- [#19606](https://github.com/apache/superset/pull/19606) test(jinja): refactor to functional tests (@villebro) +- [#19587](https://github.com/apache/superset/pull/19587) chore: cleanup as unknown conversion (@zhaoyongjie) +- [#19562](https://github.com/apache/superset/pull/19562) refactor: Removes the CSS files from the Horizon plugin (@michael-s-molina) +- [#19563](https://github.com/apache/superset/pull/19563) refactor: Removes the CSS files from the Paired T-Test plugin (@michael-s-molina) +- [#19539](https://github.com/apache/superset/pull/19539) refactor: Removes the CSS files from the Parallel Coordinates plugin (@michael-s-molina) +- [#19521](https://github.com/apache/superset/pull/19521) refactor: Removes the CSS files from the Partition plugin (@michael-s-molina) +- [#19493](https://github.com/apache/superset/pull/19493) chore: Removes hard-coded colors from legacy-plugin-chart-sankey (@michael-s-molina) +- [#19462](https://github.com/apache/superset/pull/19462) chore: Remove FilterBox.less (@geido) +- [#19438](https://github.com/apache/superset/pull/19438) chore: Remove crud.less from Datasource (@geido) +- [#19517](https://github.com/apache/superset/pull/19517) chore: Enhance ReactChord style with theme vars (@geido) +- [#19463](https://github.com/apache/superset/pull/19463) chore: Remove TimeTable.less (@geido) +- [#19550](https://github.com/apache/superset/pull/19550) chore(deps): bump minimist from 1.2.5 to 1.2.6 in /superset-embedded-sdk (@dependabot[bot]) +- [#19566](https://github.com/apache/superset/pull/19566) chore(deps): bump node-forge from 1.2.1 to 1.3.1 in /docs (@dependabot[bot]) +- [#19552](https://github.com/apache/superset/pull/19552) chore(deps): bump minimist from 1.2.5 to 1.2.6 in /docs (@dependabot[bot]) +- [#19549](https://github.com/apache/superset/pull/19549) chore(deps): bump minimist from 1.2.5 to 1.2.6 in /superset-frontend/cypress-base (@dependabot[bot]) +- [#19559](https://github.com/apache/superset/pull/19559) docs: update the typo in the documentation (@fatosmorina) +- [#19538](https://github.com/apache/superset/pull/19538) refactor: Removes the CSS files from the Country Map plugin (@michael-s-molina) +- [#19536](https://github.com/apache/superset/pull/19536) chore: Removes hard-coded opacity and spacing from the BigNumber plugin (@michael-s-molina) +- [#19494](https://github.com/apache/superset/pull/19494) refactor: Removes the CSS files from the Sankey Loop plugin (@michael-s-molina) +- [#19492](https://github.com/apache/superset/pull/19492) chore: Remove Legacy Force Directed viz plugin (@geido) +- [#19524](https://github.com/apache/superset/pull/19524) chore: Deprecating /my_queries endpoint (@AAfghahi) +- [#19467](https://github.com/apache/superset/pull/19467) chore(Explore): Change text when saving a chart in a new dashboard (@geido) +- [#19526](https://github.com/apache/superset/pull/19526) chore(database): Creating helper make_url_safe to wrap potential errors (@craig-rueda) +- [#19415](https://github.com/apache/superset/pull/19415) chore: Remove Control.less in Explore (@geido) +- [#19413](https://github.com/apache/superset/pull/19413) chore: Remove unused less file from profile (@geido) +- [#19460](https://github.com/apache/superset/pull/19460) chore: Switch to gender neutral terms (@inclusive-coding-bot) +- [#19486](https://github.com/apache/superset/pull/19486) refactor: Removes the CSS files from the Treemap plugin (@michael-s-molina) +- [#19488](https://github.com/apache/superset/pull/19488) refactor: Removes the CSS files from the Sunburst plugin (@michael-s-molina) +- [#19490](https://github.com/apache/superset/pull/19490) chore: Add theme color to ParallelCoordinates (@geido) +- [#19442](https://github.com/apache/superset/pull/19442) chore: Remove FilterbaleTableStyles.less (@geido) +- [#19441](https://github.com/apache/superset/pull/19441) chore: Remove StyledQueryButton.less (@geido) +- [#19473](https://github.com/apache/superset/pull/19473) refactor: Removes the CSS files from the Rose plugin (@michael-s-molina) +- [#19466](https://github.com/apache/superset/pull/19466) chore: Removes hard-coded colors from legacy-plugin-chart-world-map (@michael-s-molina) +- [#19465](https://github.com/apache/superset/pull/19465) refactor: Removes the CSS files from the DeckGL plugin (@michael-s-molina) +- [#19440](https://github.com/apache/superset/pull/19440) chore: Remove index.less from showSavedQuery (@geido) +- [#19230](https://github.com/apache/superset/pull/19230) chore!: remove `ROW_LEVEL_SECURITY` feature flag (permanently enable) (@suddjian) +- [#19361](https://github.com/apache/superset/pull/19361) chore: remove deprecated config keys and endpoints code 2.0 (@pkdotson) +- [#19261](https://github.com/apache/superset/pull/19261) chore: remove old alerts and configs keys (@pkdotson) +- [#19168](https://github.com/apache/superset/pull/19168) chore: bump celery and Flask (@dpgaspar) +- [#19049](https://github.com/apache/superset/pull/19049) chore: Remove logo forced width (@geido) +- [#19274](https://github.com/apache/superset/pull/19274) chore: remove PUBLIC_ROLE_LIKE_GAMMA deprecated config key (@dpgaspar) +- [#19273](https://github.com/apache/superset/pull/19273) chore: remove deprecated celery cli (@dpgaspar) +- [#19262](https://github.com/apache/superset/pull/19262) chore: update updating with druid no sql deprecation (@eschutho) +- [#19083](https://github.com/apache/superset/pull/19083) chore!: update mutator to take kwargs (@eschutho) +- [#19231](https://github.com/apache/superset/pull/19231) chore!: remove `ENABLE_REACT_CRUD_VIEWS` feature flag (permanently enable) (@suddjian) +- [#19241](https://github.com/apache/superset/pull/19241) chore(superset 2.0): remove front-end deprecated code (@graceguo-supercat) +- [#19107](https://github.com/apache/superset/pull/19107) chore: turn on SQLLAB_BACKEND_PERSISTENCE by default (@ktmud) +- [#19142](https://github.com/apache/superset/pull/19142) chore!: turn on Versioned Export in config.py (@AAfghahi) +- [#19108](https://github.com/apache/superset/pull/19108) chore: Update UPDATING.md with info about flipping dnd feature flag (@kgabryje) +- [#19146](https://github.com/apache/superset/pull/19146) chore!: Remove remove SQLALCHEMY_DOCS_URL and SQLALCHEMY_DISPLAY_TEXT from the config from the config (@hughhhh) +- [#19017](https://github.com/apache/superset/pull/19017) chore: Deprecate Python 3.7 (@john-bodley) +- [#19113](https://github.com/apache/superset/pull/19113) chore(config): Migrating `ENABLE_JAVASCRIPT_CONTROLS` from app config to a feature flag (@rusackas) +- [#19046](https://github.com/apache/superset/pull/19046) chore(explore): Set Drag&Drop feature flags to True by default (@kgabryje) +- [#19016](https://github.com/apache/superset/pull/19016) chore: Adding PR to Updating.md (@AAfghahi) +- [#18970](https://github.com/apache/superset/pull/18970) chore: Change Dataset legacy editor flag to true (@AAfghahi) + +### 1.5.3 (Thu Jan 5 15:05:44 2023 -0500) + +**Database Migrations** + +**Features** + +**Fixes** + +- [#21895](https://github.com/apache/superset/pull/21895) fix: Improves SafeMarkdown HTML sanitization (@michael-s-molina) +- [#21874](https://github.com/apache/superset/pull/21874) fix: Adds a Content Security Policy (CSP) check for production environments (@michael-s-molina) +- [#21853](https://github.com/apache/superset/pull/21853) fix: Disables HTML rendering in Toast by default (@michael-s-molina) +- [#22591](https://github.com/apache/superset/pull/22591) fix: Talisman configuration (@michael-s-molina) +- [#22196](https://github.com/apache/superset/pull/22196) fix(reports): force data generation in csv reports (@mayurnewase) +- [#22038](https://github.com/apache/superset/pull/22038) fix: datasource save, improve data validation (@dpgaspar) +- [#22022](https://github.com/apache/superset/pull/22022) fix: deprecate approve and request_access endpoint (@dpgaspar) +- [#21964](https://github.com/apache/superset/pull/21964) fix: dashboard api cache decorator (@dpgaspar) +- [#21875](https://github.com/apache/superset/pull/21875) fix: check that imports are ZIPs (@betodealmeida) +- [#21761](https://github.com/apache/superset/pull/21761) fix: flash message on database data upload forms (@dpgaspar) +- [#21759](https://github.com/apache/superset/pull/21759) fix: database schema selector on import data (@dpgaspar) +- [#21729](https://github.com/apache/superset/pull/21729) fix: allow adhoc columns in non-aggregate query (@mayurnewase) +- [#21216](https://github.com/apache/superset/pull/21216) fix(database-list): hide upload file button if no permission (@stephenLYZ) + +**Others** + +- [#21811](https://github.com/apache/superset/pull/21811) chore(sqla): refactor query utils (@villebro) + +### 1.5.2 (Wed Sep 14 17:11:51 2022 +0530) + +**Fixes** + +- [#21461](https://github.com/apache/superset/pull/21461) fix: dashboard filter value is cleared when 2 similar dashboards opened in succession (@mayurnewase) +- [#21419](https://github.com/apache/superset/pull/21419) fix: cached common bootstrap Revert (#21018) (@dpgaspar) +- [#21302](https://github.com/apache/superset/pull/21302) fix: disallow users from viewing other user's profile on config (@dpgaspar) +- [#21272](https://github.com/apache/superset/pull/21272) fix: adds TLS certificate validation option for SMTP (@dpgaspar) +- [#21076](https://github.com/apache/superset/pull/21076) fix(celery cache warmup): add auth and use warm_up_cache endpoint (@nytai) +- [#20178](https://github.com/apache/superset/pull/20178) fix: While exporting CSV , only the entries on first page are getting downloaded even when user is on other pages #17861 (@LahmerIlyas) +- [#20058](https://github.com/apache/superset/pull/20058) fix: Support the Clipboard API in modern browsers (@diegomedina248) +- [#20434](https://github.com/apache/superset/pull/20434) fix(20428): Address-Presto/Trino-Poll-Issue-Refactor (@Thelin90) +- [#20348](https://github.com/apache/superset/pull/20348) fix(docker): Make Gunicorn Keepalive Adjustable (@mdeshmu) +- [#20315](https://github.com/apache/superset/pull/20315) fix(chart): chart gets cut off on the dashboard (@stephenLYZ) +- [#20235](https://github.com/apache/superset/pull/20235) fix: Box Plot Chart throws an error when the average (AVG) / SUM is being calculated on the Metrics (@diegomedina248) +- [#20151](https://github.com/apache/superset/pull/20151) fix(csv): Ensure df_to_escaped_csv does not coerce integer columns to float (@john-bodley) +- [#20173](https://github.com/apache/superset/pull/20173) fix: avoid while cycle in computeMaxFontSize for big Number run forever when css rule applied (@diegomedina248) +- [#19570](https://github.com/apache/superset/pull/19570) fix: sqloxide optional (@betodealmeida) + +**Others** + +- [#21439](https://github.com/apache/superset/pull/21439) perf: Memoize the common_bootstrap_payload and include user param (#21018) (@bkyryliuk) +- [#19703](https://github.com/apache/superset/pull/19703) chore(build): upgrade less-loader (@ktmud) +- [#20550](https://github.com/apache/superset/pull/20550) chore: updating python docker image to 3.8.13 (@nisheldo) +- [#21018](https://github.com/apache/superset/pull/21018) perf: Memoize the common_bootstrap_payload (@bkyryliuk) +- [#20974](https://github.com/apache/superset/pull/20974) perf: Implement model specific lookups by id to improve performance (@bkyryliuk) +- [#20273](https://github.com/apache/superset/pull/20273) chore: adjust the psycopg2 version of k8s installation guide (@ensky) + ### 1.5.1 (Thu May 26 14:45:20 2022 +0300) **Fixes** diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index bee3a24a1e78..a328cf44d770 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -106,7 +106,7 @@ This statement thanks the following, on which it draws for content and inspirati # Slack Community Guidelines -If you decide to join the [Community Slack](https://join.slack.com/t/apache-superset/shared_invite/zt-16jvzmoi8-sI7jKWp~xc2zYRe~NqiY9Q), please adhere to the following rules: +If you decide to join the [Community Slack](http://bit.ly/join-superset-slack), please adhere to the following rules: **1. Treat everyone in the community with respect.** diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 653cfe41a5f0..c8f72d2b22b6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -52,7 +52,9 @@ little bit helps, and credit will always be given. - [Revert Guidelines](#revert-guidelines) - [Setup Local Environment for Development](#setup-local-environment-for-development) - [Documentation](#documentation) - - [Images](#images) + - [Local Development](#local-development) + - [Build](#build) + - [Deployment](#deployment) - [Flask server](#flask-server) - [OS Dependencies](#os-dependencies) - [Dependencies](#dependencies) @@ -124,7 +126,7 @@ Here's a list of repositories that contain Superset-related packages: ## Types of Contributions -### Report Bug +### Report a Bug The best way to report a bug is to file an issue on GitHub. Please include: @@ -136,15 +138,17 @@ The best way to report a bug is to file an issue on GitHub. Please include: When posting Python stack traces, please quote them using [Markdown blocks](https://help.github.com/articles/creating-and-highlighting-code-blocks/). +_Please note that feature requests opened as Github Issues will be moved to Discussions._ + ### Submit Ideas or Feature Requests -The best way is to file an issue on GitHub: +The best way is to start an ["Ideas" Discussion thread](https://github.com/apache/superset/discussions/categories/ideas) on GitHub: - Explain in detail how it would work. - Keep the scope as narrow as possible, to make it easier to implement. -- Remember that this is a volunteer-driven project, and that contributions are welcome :) +- Remember that this is a volunteer-driven project, and that your contributions are as welcome as anyone's :) -For large features or major changes to codebase, please create **Superset Improvement Proposal (SIP)**. See template from [SIP-0](https://github.com/apache/superset/issues/5602) +To propose large features or major changes to codebase, and help usher in those changes, please create a **Superset Improvement Proposal (SIP)**. See template from [SIP-0](https://github.com/apache/superset/issues/5602) ### Fix Bugs @@ -160,7 +164,7 @@ Look through the GitHub issues. Issues tagged with Superset could always use better documentation, whether as part of the official Superset docs, -in docstrings, `docs/*.rst` or even on the web as blog posts or +in docstrings, or even on the web as blog posts or articles. See [Documentation](#documentation) for more details. ### Add Translations @@ -388,23 +392,30 @@ cd superset The latest documentation and tutorial are available at https://superset.apache.org/. -The site is written using the Gatsby framework and docz for the -documentation subsection. Find out more about it in `docs/README.md` +The documentation site is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator, the source for which resides in `./docs`. + +#### Local Development -#### Images +To set up a local development environment with hot reloading for the documentation site: -If you're adding new images to the documentation, you'll notice that the images -referenced in the rst, e.g. +```shell +cd docs +yarn install # Installs NPM dependencies +yarn start # Starts development server at http://localhost:3000 +``` - .. image:: _static/images/tutorial/tutorial_01_sources_database.png +#### Build -aren't actually stored in that directory. Instead, you should add and commit -images (and any other static assets) to the `superset-frontend/src/assets/images` directory. -When the docs are deployed to https://superset.apache.org/, images -are copied from there to the `_static/images` directory, just like they're referenced -in the docs. +To create and serve a production build of the documentation site: -For example, the image referenced above actually lives in `superset-frontend/src/assets/images/tutorial`. Since the image is moved during the documentation build process, the docs reference the image in `_static/images/tutorial` instead. +```shell +yarn build +yarn serve +``` + +#### Deployment + +Commits to `master` trigger a rebuild and redeploy of the documentation site. Submit pull requests that modify the documentation with the `docs:` prefix. ### Flask server @@ -413,7 +424,7 @@ For example, the image referenced above actually lives in `superset-frontend/src Make sure your machine meets the [OS dependencies](https://superset.apache.org/docs/installation/installing-superset-from-scratch#os-dependencies) before following these steps. You also need to install MySQL or [MariaDB](https://mariadb.com/downloads). -Ensure that you are using Python version 3.7 or 3.8, then proceed with: +Ensure that you are using Python version 3.8, 3.9, 3.10 or 3.11, then proceed with: ```bash # Create a virtual environment and activate it (recommended) @@ -1021,7 +1032,7 @@ When contributing new React components to Superset, please try to add a Story al ## Translating -We use [Babel](http://babel.pocoo.org/en/latest/) to translate Superset. +We use [Flask-Babel](https://python-babel.github.io/flask-babel/) to translate Superset. In Python files, we import the magic `_` function using: ```python @@ -1064,6 +1075,7 @@ LANGUAGES = { ``` This script will + 1. update the template file `superset/translations/messages.pot` with current application strings. 2. update language files with the new extracted strings. @@ -1285,7 +1297,7 @@ To do this, you'll need to: - Start up a celery worker ```shell script - celery --app=superset.tasks.celery_app:app worker -Ofair + celery --app=superset.tasks.celery_app:app worker -O fair ``` Note that: @@ -1315,6 +1327,7 @@ The following configuration settings are available for async queries (see config - `GLOBAL_ASYNC_QUERIES_REDIS_STREAM_LIMIT_FIREHOSE` - the maximum number of events for all users (FIFO eviction) - `GLOBAL_ASYNC_QUERIES_JWT_COOKIE_NAME` - the async query feature uses a [JWT](https://tools.ietf.org/html/rfc7519) cookie for authentication, this setting is the cookie's name - `GLOBAL_ASYNC_QUERIES_JWT_COOKIE_SECURE` - JWT cookie secure option +- `GLOBAL_ASYNC_QUERIES_JWT_COOKIE_SAMESITE` - JWT cookie same site option - `GLOBAL_ASYNC_QUERIES_JWT_COOKIE_DOMAIN` - JWT cookie domain option ([see docs for set_cookie](https://tedboy.github.io/flask/interface_api.response_object.html#flask.Response.set_cookie)) - `GLOBAL_ASYNC_QUERIES_JWT_SECRET` - JWT's use a secret key to sign and validate the contents. This value should be at least 32 bytes and have sufficient randomness for proper security - `GLOBAL_ASYNC_QUERIES_TRANSPORT` - available options: "polling" (HTTP, default), "ws" (WebSocket, requires running superset-websocket server) diff --git a/Dockerfile b/Dockerfile index ae390f596cb9..48612a14e960 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,65 +16,35 @@ # limitations under the License. # -###################################################################### -# PY stage that simply does a pip install on our requirements -###################################################################### - - -ARG PY_VER=3.8.12 -FROM python:${PY_VER} AS superset-py - -RUN mkdir /app \ - && apt-get update -y \ - && apt-get install -y --no-install-recommends \ - build-essential \ - default-libmysqlclient-dev \ - libpq-dev \ - libsasl2-dev \ - libecpg-dev \ - && rm -rf /var/lib/apt/lists/* - -# First, we just wanna install requirements, which will allow us to utilize the cache -# in order to only build if and only if requirements change -COPY ./requirements/*.txt /app/requirements/ -COPY setup.py MANIFEST.in README.md /app/ -COPY superset-frontend/package.json /app/superset-frontend/ -RUN cd /app \ - && mkdir -p superset/static \ - && touch superset/static/version_info.json \ - && pip install --no-cache -r requirements/local.txt - - ###################################################################### # Node stage to deal with static asset construction ###################################################################### -FROM node:16 AS superset-node - -ARG NPM_VER=7 -RUN npm install -g npm@${NPM_VER} +ARG PY_VER=3.8.16-slim +FROM node:16-slim AS superset-node ARG NPM_BUILD_CMD="build" ENV BUILD_CMD=${NPM_BUILD_CMD} +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true # NPM ci first, as to NOT invalidate previous steps except for when package.json changes RUN mkdir -p /app/superset-frontend -RUN mkdir -p /app/superset/assets + COPY ./docker/frontend-mem-nag.sh / -COPY ./superset-frontend /app/superset-frontend -RUN /frontend-mem-nag.sh \ - && cd /app/superset-frontend \ - && npm ci --legacy-peer-deps +RUN /frontend-mem-nag.sh -# This seems to be the most expensive step -RUN cd /app/superset-frontend \ - && npm run ${BUILD_CMD} \ - && rm -rf node_modules +WORKDIR /app/superset-frontend/ + +COPY superset-frontend/package*.json ./ +RUN npm ci --legacy-peer-deps +COPY ./superset-frontend . + +# This seems to be the most expensive step +RUN npm run ${BUILD_CMD} ###################################################################### # Final lean image... ###################################################################### -ARG PY_VER=3.8.12 FROM python:${PY_VER} AS lean ENV LANG=C.UTF-8 \ @@ -90,17 +60,26 @@ RUN mkdir -p ${PYTHONPATH} \ && apt-get update -y \ && apt-get install -y --no-install-recommends \ build-essential \ + curl \ default-libmysqlclient-dev \ + libsasl2-dev \ libsasl2-modules-gssapi-mit \ libpq-dev \ libecpg-dev \ && rm -rf /var/lib/apt/lists/* -COPY --from=superset-py /usr/local/lib/python3.8/site-packages/ /usr/local/lib/python3.8/site-packages/ -# Copying site-packages doesn't move the CLIs, so let's copy them one by one -COPY --from=superset-py /usr/local/bin/gunicorn /usr/local/bin/celery /usr/local/bin/flask /usr/bin/ +COPY ./requirements/*.txt /app/requirements/ +COPY setup.py MANIFEST.in README.md /app/ + +# setup.py uses the version information in package.json +COPY superset-frontend/package.json /app/superset-frontend/ + +RUN cd /app \ + && mkdir -p superset/static \ + && touch superset/static/version_info.json \ + && pip install --no-cache -r requirements/local.txt + COPY --from=superset-node /app/superset/static/assets /app/superset/static/assets -COPY --from=superset-node /app/superset-frontend /app/superset-frontend ## Lastly, let's install superset itself COPY superset /app/superset @@ -128,15 +107,15 @@ CMD /usr/bin/run-server.sh # Dev image... ###################################################################### FROM lean AS dev -ARG GECKODRIVER_VERSION=v0.28.0 -ARG FIREFOX_VERSION=88.0 +ARG GECKODRIVER_VERSION=v0.32.0 +ARG FIREFOX_VERSION=106.0.3 COPY ./requirements/*.txt ./docker/requirements-*.txt/ /app/requirements/ USER root RUN apt-get update -y \ - && apt-get install -y --no-install-recommends libnss3 libdbus-glib-1-2 libgtk-3-0 libx11-xcb1 + && apt-get install -y --no-install-recommends libnss3 libdbus-glib-1-2 libgtk-3-0 libx11-xcb1 wget # Install GeckoDriver WebDriver RUN wget https://github.com/mozilla/geckodriver/releases/download/${GECKODRIVER_VERSION}/geckodriver-${GECKODRIVER_VERSION}-linux64.tar.gz -O /tmp/geckodriver.tar.gz && \ diff --git a/Makefile b/Makefile index 8dc7ffa8f569..fbe0fc8bfcb1 100644 --- a/Makefile +++ b/Makefile @@ -15,8 +15,8 @@ # limitations under the License. # -# Python version installed; we need 3.8-3.9 -PYTHON=`command -v python3.9 || command -v python3.8` +# Python version installed; we need 3.8-3.11 +PYTHON=`command -v python3.11 || command -v python3.10 || command -v python3.9 || command -v python3.8` .PHONY: install superset venv pre-commit @@ -47,7 +47,7 @@ superset: superset load-examples # Install node packages - cd superset-frontend; npm install + cd superset-frontend; npm ci update: update-py update-js @@ -70,7 +70,7 @@ update-js: venv: # Create a virtual environment and activate it (recommended) - if ! [ -x "${PYTHON}" ]; then echo "You need Python 3.8 or 3.9 installed"; exit 1; fi + if ! [ -x "${PYTHON}" ]; then echo "You need Python 3.8, 3.9, 3.10 or 3.11 installed"; exit 1; fi test -d venv || ${PYTHON} -m venv venv # setup a python3 virtualenv . venv/bin/activate @@ -101,11 +101,17 @@ node-app: build-cypress: cd superset-frontend; npm run build-instrumented - cd superset-frontend/cypress-base; npm install + cd superset-frontend/cypress-base; npm ci open-cypress: if ! [ $(port) ]; then cd superset-frontend/cypress-base; CYPRESS_BASE_URL=http://localhost:9000 npm run cypress open; fi cd superset-frontend/cypress-base; CYPRESS_BASE_URL=http://localhost:$(port) npm run cypress open +report-celery-worker: + celery --app=superset.tasks.celery_app:app worker + +report-celery-beat: + celery --app=superset.tasks.celery_app:app beat --pidfile /tmp/celerybeat.pid --schedule /tmp/celerybeat-schedulecd + admin-user: superset fab create-admin diff --git a/README.md b/README.md index 5bea6eed78ba..ce805862878c 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ under the License. [![PyPI version](https://badge.fury.io/py/apache-superset.svg)](https://badge.fury.io/py/apache-superset) [![Coverage Status](https://codecov.io/github/apache/superset/coverage.svg?branch=master)](https://codecov.io/github/apache/superset) [![PyPI](https://img.shields.io/pypi/pyversions/apache-superset.svg?maxAge=2592000)](https://pypi.python.org/pypi/apache-superset) -[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://join.slack.com/t/apache-superset/shared_invite/zt-16jvzmoi8-sI7jKWp~xc2zYRe~NqiY9Q) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](http://bit.ly/join-superset-slack) [![Documentation](https://img.shields.io/badge/docs-apache.org-blue.svg)](https://superset.apache.org) <img @@ -86,39 +86,39 @@ Superset can query data from any SQL-speaking datastore or data engine (Presto, Here are some of the major database solutions that are supported: <p align="center"> - <img src="superset-frontend/src/assets/images/redshift.png" alt="redshift" border="0" width="106" height="41"/> - <img src="superset-frontend/src/assets/images/google-biquery.png" alt="google-biquery" border="0" width="114" height="43"/> - <img src="superset-frontend/src/assets/images/snowflake.png" alt="snowflake" border="0" width="152" height="46"/> - <img src="superset-frontend/src/assets/images/trino.png" alt="trino" border="0" width="46" height="46"/> - <img src="superset-frontend/src/assets/images/presto.png" alt="presto" border="0" width="152" height="46"/> - <img src="superset-frontend/src/assets/images/druid.png" alt="druid" border="0" width="135" height="37" /> - <img src="superset-frontend/src/assets/images/firebolt.png" alt="firebolt" border="0" width="133" height="21.5" /> - <img src="superset-frontend/src/assets/images/timescale.png" alt="timescale" border="0" width="102" height="26.8" /> - <img src="superset-frontend/src/assets/images/rockset.png" alt="rockset" border="0" width="125" height="51" /> - <img src="superset-frontend/src/assets/images/postgresql.png" alt="postgresql" border="0" width="132" height="81" /> - <img src="superset-frontend/src/assets/images/mysql.png" alt="mysql" border="0" width="119" height="62" /> - <img src="superset-frontend/src/assets/images/mssql-server.png" alt="mssql-server" border="0" width="93" height="74" /> - <img src="superset-frontend/src/assets/images/db2.png" alt="db2" border="0" width="62" height="62" /> - <img src="superset-frontend/src/assets/images/sqlite.png" alt="sqlite" border="0" width="102" height="45" /> - <img src="superset-frontend/src/assets/images/sybase.png" alt="sybase" border="0" width="128" height="47" /> - <img src="superset-frontend/src/assets/images/mariadb.png" alt="mariadb" border="0" width="83" height="63" /> - <img src="superset-frontend/src/assets/images/vertica.png" alt="vertica" border="0" width="128" height="40" /> - <img src="superset-frontend/src/assets/images/oracle.png" alt="oracle" border="0" width="121" height="66" /> - <img src="superset-frontend/src/assets/images/firebird.png" alt="firebird" border="0" width="86" height="56" /> - <img src="superset-frontend/src/assets/images/greenplum.png" alt="greenplum" border="0" width="140" height="45" /> - <img src="superset-frontend/src/assets/images/clickhouse.png" alt="clickhouse" border="0" width="133" height="34" /> - <img src="superset-frontend/src/assets/images/exasol.png" alt="exasol" border="0" width="106" height="59" /> - <img src="superset-frontend/src/assets/images/monet-db.png" alt="monet-db" border="0" width="106" height="46" /> - <img src="superset-frontend/src/assets/images/apache-kylin.png" alt="apache-kylin" border="0" width="56" height="64"/> - <img src="superset-frontend/src/assets/images/hologres.png" alt="hologres" border="0" width="71" height="64"/> - <img src="superset-frontend/src/assets/images/netezza.png" alt="netezza" border="0" width="64" height="64"/> - <img src="superset-frontend/src/assets/images/pinot.png" alt="pinot" border="0" width="165" height="64"/> - <img src="superset-frontend/src/assets/images/teradata.png" alt="teradata" border="0" width="165" height="64"/> - <img src="superset-frontend/src/assets/images/yugabyte.png" alt="yugabyte" border="0" width="180" height="31"/> + <img src="superset-frontend/src/assets/images/redshift.png" alt="redshift" border="0" width="200" height="80"/> + <img src="superset-frontend/src/assets/images/google-biquery.png" alt="google-biquery" border="0" width="200" height="80"/> + <img src="superset-frontend/src/assets/images/snowflake.png" alt="snowflake" border="0" width="200" height="80"/> + <img src="superset-frontend/src/assets/images/trino.png" alt="trino" border="0" width="200" height="80"/> + <img src="superset-frontend/src/assets/images/presto.png" alt="presto" border="0" width="200" height="80"/> + <img src="superset-frontend/src/assets/images/databricks.png" alt="databricks" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/druid.png" alt="druid" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/firebolt.png" alt="firebolt" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/timescale.png" alt="timescale" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/rockset.png" alt="rockset" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/postgresql.png" alt="postgresql" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/mysql.png" alt="mysql" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/mssql-server.png" alt="mssql-server" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/db2.png" alt="db2" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/sqlite.png" alt="sqlite" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/sybase.png" alt="sybase" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/mariadb.png" alt="mariadb" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/vertica.png" alt="vertica" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/oracle.png" alt="oracle" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/firebird.png" alt="firebird" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/greenplum.png" alt="greenplum" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/clickhouse.png" alt="clickhouse" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/exasol.png" alt="exasol" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/monet-db.png" alt="monet-db" border="0" width="200" height="80" /> + <img src="superset-frontend/src/assets/images/apache-kylin.png" alt="apache-kylin" border="0" width="200" height="80"/> + <img src="superset-frontend/src/assets/images/hologres.png" alt="hologres" border="0" width="200" height="80"/> + <img src="superset-frontend/src/assets/images/netezza.png" alt="netezza" border="0" width="200" height="80"/> + <img src="superset-frontend/src/assets/images/pinot.png" alt="pinot" border="0" width="200" height="80"/> + <img src="superset-frontend/src/assets/images/teradata.png" alt="teradata" border="0" width="200" height="80"/> + <img src="superset-frontend/src/assets/images/yugabyte.png" alt="yugabyte" border="0" width="200" height="80"/> </p> -**A more comprehensive list of supported databases** along with the configuration instructions can be found -[here](https://superset.apache.org/docs/databases/installing-database-drivers). +**A more comprehensive list of supported databases** along with the configuration instructions can be found [here](https://superset.apache.org/docs/databases/installing-database-drivers). Want to add support for your datastore or data engine? Read more [here](https://superset.apache.org/docs/frequently-asked-questions#does-superset-work-with-insert-database-engine-here) about the technical requirements. @@ -129,7 +129,7 @@ Want to add support for your datastore or data engine? Read more [here](https:// ## Get Involved - Ask and answer questions on [StackOverflow](https://stackoverflow.com/questions/tagged/apache-superset) using the **apache-superset** tag -- [Join our community's Slack](https://join.slack.com/t/apache-superset/shared_invite/zt-16jvzmoi8-sI7jKWp~xc2zYRe~NqiY9Q) +- [Join our community's Slack](http://bit.ly/join-superset-slack) and please read our [Slack Community Guidelines](https://github.com/apache/superset/blob/master/CODE_OF_CONDUCT.md#slack-community-guidelines) - [Join our dev@superset.apache.org Mailing list](https://lists.apache.org/list.html?dev@superset.apache.org) @@ -142,26 +142,37 @@ how to set up a development environment. ## Resources +Superset 2.0! +- [Superset 2.0 Meetup](https://preset.io/events/superset-2-0-meetup/) +- [Superset 2.0 Release Notes](https://github.com/apache/superset/tree/master/RELEASING/release-notes-2-0) + +Understanding the Superset Points of View +- [The Case for Dataset-Centric Visualization](https://preset.io/blog/dataset-centric-visualization/) +- [Understanding the Superset Semantic Layer](https://preset.io/blog/understanding-superset-semantic-layer/) + + - Getting Started with Superset - [Superset in 2 Minutes using Docker Compose](https://superset.apache.org/docs/installation/installing-superset-using-docker-compose#installing-superset-locally-using-docker-compose) - [Installing Database Drivers](https://superset.apache.org/docs/databases/docker-add-drivers/) - [Building New Database Connectors](https://preset.io/blog/building-database-connector/) - [Create Your First Dashboard](https://superset.apache.org/docs/creating-charts-dashboards/first-dashboard) - [Comprehensive Tutorial for Contributing Code to Apache Superset -](https://preset.io/blog/tutorial-contributing-code-to-apache-superset/) -- [Documentation for Superset End-Users (by Preset)](https://docs.preset.io/docs/terminology) + ](https://preset.io/blog/tutorial-contributing-code-to-apache-superset/) +- [Resources to master Superset by Preset](https://preset.io/resources/) + - Deploying Superset - [Official Docker image](https://hub.docker.com/r/apache/superset) - [Helm Chart](https://github.com/apache/superset/tree/master/helm/superset) + - Recordings of Past [Superset Community Events](https://preset.io/events) - - [Live Demo: Interactive Time-series Analysis with Druid and Superset](https://preset.io/events/2021-03-02-interactive-time-series-analysis-with-druid-and-superset/) + - [Mixed Time Series Charts](https://preset.io/events/mixed-time-series-visualization-in-superset-workshop/) + - [How the Bing Team Customized Superset for the Internal Self-Serve Data & Analytics Platform](https://preset.io/events/how-the-bing-team-heavily-customized-superset-for-their-internal-data/) - [Live Demo: Visualizing MongoDB and Pinot Data using Trino](https://preset.io/events/2021-04-13-visualizing-mongodb-and-pinot-data-using-trino/) - - [Superset Contributor Bootcamp](https://preset.io/events/superset-contributor-bootcamp-dec-21/) - [Introduction to the Superset API](https://preset.io/events/introduction-to-the-superset-api/) - - [Apache Superset 1.3 Meetup](https://preset.io/events/apache-superset-1-3/) - [Building a Database Connector for Superset](https://preset.io/events/2021-02-16-building-a-database-connector-for-superset/) + - Visualizations - - [Building Custom Viz Plugins](https://superset.apache.org/docs/installation/building-custom-viz-plugins) + - [Creating Viz Plugins](https://superset.apache.org/docs/contributing/creating-viz-plugins/) - [Managing and Deploying Custom Viz Plugins](https://medium.com/nmc-techblog/apache-superset-manage-custom-viz-plugins-in-production-9fde1a708e55) - [Why Apache Superset is Betting on Apache ECharts](https://preset.io/blog/2021-4-1-why-echarts/) diff --git a/RELEASING/Dockerfile.from_local_tarball b/RELEASING/Dockerfile.from_local_tarball index 3cd030609b60..4860db64287c 100644 --- a/RELEASING/Dockerfile.from_local_tarball +++ b/RELEASING/Dockerfile.from_local_tarball @@ -24,13 +24,13 @@ ENV LANG=C.UTF-8 \ RUN apt-get update -y -# Install dependencies to fix `curl https support error` and `elaying package configuration warning` +# Install dependencies to fix `curl https support error` and `delaying package configuration warning` RUN apt-get install -y apt-transport-https apt-utils # Install superset dependencies # https://superset.apache.org/docs/installation/installing-superset-from-scratch RUN apt-get install -y build-essential libssl-dev \ - libffi-dev python3-dev libsasl2-dev libldap2-dev libxi-dev + libffi-dev python3-dev libsasl2-dev libldap2-dev libxi-dev chromium # Install nodejs for custom build # https://nodejs.org/en/download/package-manager/ diff --git a/RELEASING/Dockerfile.from_svn_tarball b/RELEASING/Dockerfile.from_svn_tarball index 482ab474a58e..3deea5b8d354 100644 --- a/RELEASING/Dockerfile.from_svn_tarball +++ b/RELEASING/Dockerfile.from_svn_tarball @@ -24,13 +24,13 @@ ENV LANG=C.UTF-8 \ RUN apt-get update -y -# Install dependencies to fix `curl https support error` and `elaying package configuration warning` +# Install dependencies to fix `curl https support error` and `delaying package configuration warning` RUN apt-get install -y apt-transport-https apt-utils # Install superset dependencies # https://superset.apache.org/docs/installation/installing-superset-from-scratch RUN apt-get install -y build-essential libssl-dev \ - libffi-dev python3-dev libsasl2-dev libldap2-dev libxi-dev + libffi-dev python3-dev libsasl2-dev libldap2-dev libxi-dev chromium # Install nodejs for custom build # https://nodejs.org/en/download/package-manager/ diff --git a/RELEASING/README.md b/RELEASING/README.md index 1d3285e0ffc3..901d21aefb3d 100644 --- a/RELEASING/README.md +++ b/RELEASING/README.md @@ -30,6 +30,7 @@ partaking in the process should join the channel. ## Release notes for recent releases +- [2.0](release-notes-2-0/README.md) - [1.5](release-notes-1-5/README.md) - [1.4](release-notes-1-4/README.md) - [1.3](release-notes-1-3/README.md) @@ -289,10 +290,6 @@ git tag ${SUPERSET_VERSION_RC} git push origin ${SUPERSET_VERSION_RC} ``` -### Create a release on Github - -After submitting the tag, follow the steps [here](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository) to create the release. Use the vote email text as the content for the release description. Make sure to check the "This is a pre-release" checkbox for release canditates. You can check previous releases if you need an example. - ## Preparing the release candidate The first step of preparing an Apache Release is packaging a release candidate @@ -346,7 +343,11 @@ To build and run the recently created tarball **from SVN**: # login using admin/admin ``` -### Voting +## Create a release on Github + +After submitting the tag and testing the release candidate, follow the steps [here](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository) to create the release on GitHub. Use the vote email text as the content for the release description. Make sure to check the "This is a pre-release" checkbox for release candidates. You can check previous releases if you need an example. + +## Voting Now you're ready to start the [VOTE] thread. Here's an example of a previous release vote thread: @@ -384,7 +385,7 @@ A List of people with -1 vote (ex: John): The script will generate the email text that should be sent to dev@superset.apache.org using an email client. The release version and release candidate number are fetched from the previously set environment variables. -### Validating a release +## Validating a release https://www.apache.org/info/verification.html @@ -458,11 +459,14 @@ while requesting access to push packages. ```bash twine upload dist/apache-superset-${SUPERSET_VERSION}.tar.gz - -# Set your username to token -# Set your password to the token value, including the pypi- prefix ``` +Set your username to `__token__` + +Set your password to the token value, including the `pypi-` prefix + +More information on https://pypi.org/help/#apitoken + ### Announcing Once it's all done, an [ANNOUNCE] thread announcing the release to the dev@ mailing list is the final step. diff --git a/RELEASING/release-notes-2-0/README.md b/RELEASING/release-notes-2-0/README.md new file mode 100644 index 000000000000..193a1e7424b7 --- /dev/null +++ b/RELEASING/release-notes-2-0/README.md @@ -0,0 +1,152 @@ +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +# Release Notes for Superset 2.0 + +Superset 2.0 is a big step forward. This release cleans up many legacy code paths and feature flags, and deprecates lots of legacy behaviors in Superset. + +- [**Developer Experience**](#developer-experience) +- [**Features**](#features) +- [**Config and Feature flags**](#config-and-feature-flags) +- [**Breaking Changes**](#breaking-changes) + +## Developer Experience + +- Addition of a statsd guage metric for Slack and email notifications for increased visibility into errors around alerts / reports ([#20158](https://github.com/apache/superset/pull/20158)) + +- Helm chart now supports resource limits and requests for each component ([#20052](https://github.com/apache/superset/pull/20052)) + +- New Github workflow to test Storybook Netlify instance nightly ([#19852](https://github.com/apache/superset/pull/19852)) + +- Minimum requirement for Superset is now Python 3.8 ([#19017](https://github.com/apache/superset/pull/19017) + +## Features + +**Charting and Dashboard Experience** + +Support for horizontal bar chart added ([#19918](https://github.com/apache/superset/pull/19918)) + +![horizontal](https://user-images.githubusercontent.com/11830681/166248149-4946388a-5051-4d13-a516-50a81e9b5be3.png) + +Time Series Charts now support stacking of both negative and positive values ([#20408](https://github.com/apache/superset/pull/20408)) + +![negative](https://user-images.githubusercontent.com/15073128/174057996-52255bfe-60c3-4727-be99-e328c124e439.png) + +- Pie charts now defaults to a row limit of 100 to prevent crashes when a high-cardinality column is chosen as the dimension ([#20392](https://github.com/apache/superset/pull/20392)) + +- World map chart now supports coloring either by metric or by the country column ([#19881](https://github.com/apache/superset/pull/19881)) + +- Table visualization now supports drag and drop for columns ([#19381](https://github.com/apache/superset/pull/19381)) + +- Mixed chart now supports Advanced Analytics ([#19851](https://github.com/apache/superset/pull/19851)) + +- Add support for generic x-axis (non-time-series) in the Mixed Chart ([#20097](https://github.com/apache/superset/pull/20097)) + +![Image](https://user-images.githubusercontent.com/33317356/168807749-b021c04c-8902-4b4f-a7a4-f21544fb678e.png) + +- Charts can now be created in Edit Dashboard mode ([#20126](https://github.com/apache/superset/pull/20126)) + +![Image](https://user-images.githubusercontent.com/15073128/169251205-2c0f36bb-17e0-4549-aa84-66a58a377603.png) + +- Add aggregate total for Pie charts ([#19622](https://github.com/apache/superset/pull/19622)) + +- Legend is now enabled by default for relevant charts ([#19927](https://github.com/apache/superset/pull/19927)) + +**View Results Experience** + +- Explore and Dashboard views now support displaying of multiple results ([#20277](https://github.com/apache/superset/pull/20277)) + +- Results pane in Dashboard view now more closely mirrors rich functionality from Results pane in Explore ([#20144](https://github.com/apache/superset/pull/20144)) + + +**Quality of Life** + +- Edit Dataset modal now doesn't close when you click away ([#20278](https://github.com/apache/superset/pull/20278)) + +- When editing the label in the Metrics popover, pressing Enter now saves what you typed ([#19898](https://github.com/apache/superset/pull/19898)) + +- When adding new chart from the dashboard view, the dashboard name will now pre-fill ([#20129](https://github.com/apache/superset/pull/20129)) + +- Annotations now have an improved empty state ([#20160](https://github.com/apache/superset/pull/20160)) + +- Confirmational modal is now shown if user exits Explore without saving changes ([#19993](https://github.com/apache/superset/pull/19993)) + +- Explore popovers now close when the Escape key is pressed ([#19902](https://github.com/apache/superset/pull/19902)) + +- Run and Save buttons are redesigned for improved usability ([#19558](https://github.com/apache/superset/pull/19558)) + +**Databases** + +- Native database driver for Databricks ([#20320](https://github.com/apache/superset/pull/20320)) + +- Time grains for SQLite are now simplified ([#19745](https://github.com/apache/superset/pull/19745)) + +- Multiple upgrades to the Trino database engine ([#20152](https://github.com/apache/superset/pull/20152)) + +- Switch from sqlalchemy-trino to trino-python-client ([#19957](https://github.com/apache/superset/pull/19957)) + +- Apache Pinot now supports more time grains in Superset ([#19724](https://github.com/apache/superset/pull/19724)) + +**Jinja** + +- New Jinja macro enables querying / referencing both physical and virtual datasets in SQL Lab ([#15241](https://github.com/apache/superset/pull/15241)) + +- New Jinja macro added to improve experience of including multiple items ([#19574](https://github.com/apache/superset/pull/19574)) + +**Other** + +- Datasets can now be filtered by their certification status ([#20136](https://github.com/apache/superset/pull/20136)) + + +## Config and Feature Flags + +- Initial implementation of advanced types ([#18794](https://github.com/apache/superset/pull/18794)) + - Flag: `ENABLE_ADVANCED_DATA_TYPES` + +- Caching can now be enabled in database setups when user impersonation is enabled ([#20114](https://github.com/apache/superset/pull/20114)) + - Flag: `CACHE_IMPERSONATION` + +- Control behavior for how color palettes are chosen ([#19987](https://github.com/apache/superset/pull/19987)) + - Flag: `USE_ANALAGOUS_COLORS` + +- Enabling non-time-series x-axis in some charts ([#20097](https://github.com/apache/superset/pull/20097)) + - Flag: `GENERIC_CHART_AXES` + +- As part of the 2.0 cleanup efforts, the following feature flags were removed (which means the behavior is now permanently enabled): + - `ROW_LEVEL_SECURITY` + - `ENABLE_REACT_CRUD_VIEWS` + - `PUBLIC_ROLE_LIKE_GAMMA` + +- The following feature flags are now True by default, but can be turned back to False: + - `ENABLE_EXPLORE_DRAG_AND_DROP` + - `ENABLE_DND_WITH_CLICK_UX` + - `DISABLE_LEGACY_DATASOURCE_EDITOR` + - `SQLLAB_BACKEND_PERSISTENCE` + - `VERSIONED_EXPORT` + +- The following config flags were removed: + - `APP_ICON_WIDTH` + +- A number of legacy interim flags were removed around SIP-15 ([#18936](https://github.com/apache/superset/pull/18936)) + +- The `ENABLE_JAVASCRIPT_CONTROLS` flag was moved from an app config to a feature flag + +## Breaking Changes + +To learn more about the breaking changes in 2.0, please read [UPDATING.MD](https://github.com/apache/superset/blob/master/UPDATING.md) diff --git a/RELEASING/release-notes-2-0/changelog.md b/RELEASING/release-notes-2-0/changelog.md new file mode 100644 index 000000000000..4b3b5ddfaef2 --- /dev/null +++ b/RELEASING/release-notes-2-0/changelog.md @@ -0,0 +1,491 @@ +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +### 2.0 (Thu Jun 23 05:39:46 2022 -0600) + +**Database Migrations** + +- [#20385](https://github.com/apache/superset/pull/20385) fix(migration): Ensure key_value LargeBinary is encoded as a MEDIUMBLOB as opposed to BLOB for MySQL (@john-bodley) +- [#20449](https://github.com/apache/superset/pull/20449) fix: RLS new db migration downgrade fails on SQLite (@dpgaspar) +- [#20284](https://github.com/apache/superset/pull/20284) chore(migrations): Renaming migration files so that they're easier to keep track of (@craig-rueda) +- [#20108](https://github.com/apache/superset/pull/20108) fix: None dataset and schema permissions (@dpgaspar) +- [#18794](https://github.com/apache/superset/pull/18794) feat(business-types): initial implementation of SIP-78 (@cccs-RyanS) +- [#20073](https://github.com/apache/superset/pull/20073) fix(dataset): handle missing sqla uri in migration (@villebro) +- [#19941](https://github.com/apache/superset/pull/19941) fix(reports): Clear last value when state is WORKING (@john-bodley) +- [#19675](https://github.com/apache/superset/pull/19675) chore(docs): Spelling (@jsoref) +- [#19793](https://github.com/apache/superset/pull/19793) fix(SIP-68): handle empty table name during migration (@ktmud) +- [#19786](https://github.com/apache/superset/pull/19786) fix(migrations): coalesce is_temporal when inserting into sl_columns (@cemremengu) +- [#19421](https://github.com/apache/superset/pull/19421) perf: refactor SIP-68 db migrations with INSERT SELECT FROM (@ktmud) +- [#19767](https://github.com/apache/superset/pull/19767) fix: Fix migration for removing time_range_endpoints 3 (@hughhhh) +- [#19728](https://github.com/apache/superset/pull/19728) fix: Removetime_range_endpoints from query context object pt 2 (@hughhhh) +- [#19630](https://github.com/apache/superset/pull/19630) chore: clean up unused imports in db migration scripts (@ktmud) +- [#19577](https://github.com/apache/superset/pull/19577) fix: merge multiple db heads (@eschutho) +- [#19243](https://github.com/apache/superset/pull/19243) fix: cannot delete a database if team member has SQL editor tab that uses that db (@diegomedina248) +- [#19537](https://github.com/apache/superset/pull/19537) chore: block unsafe functions (@betodealmeida) +- [#19513](https://github.com/apache/superset/pull/19513) chore: postpone timerange endpoint removal (@villebro) +- [#19495](https://github.com/apache/superset/pull/19495) perf: speed up db migration for deprecating time_range_endpoints (@ktmud) +- [#19474](https://github.com/apache/superset/pull/19474) fix: handle null params in #18936 migration (@serenajiang) +- [#19423](https://github.com/apache/superset/pull/19423) fix: Remove`time_range_endpoints` from query context object (@hughhhh) +- [#18936](https://github.com/apache/superset/pull/18936) chore: Remove legacy SIP-15 interim logic/flags (@john-bodley) + +**Features** +- [#20114](https://github.com/apache/superset/pull/20114) feat(chart): Enable caching per user when user impersonation is enabled (@Samira-El) +- [#20408](https://github.com/apache/superset/pull/20408) feat(plugin-chart-echarts): Support stacking negative and positive values (@kgabryje) +- [#20278](https://github.com/apache/superset/pull/20278) feat: Prevent dataset edit modal closing on click-away in edit mode (@reesercollins) +- [#20392](https://github.com/apache/superset/pull/20392) feat: setting limit value when Pie chart switches (@zhaoyongjie) +- [#20373](https://github.com/apache/superset/pull/20373) feat: adding truncate metric control on timeseries charts (@zhaoyongjie) +- [#20248](https://github.com/apache/superset/pull/20248) feat(explore): Implement viz switcher redesign (@kgabryje) +- [#20113](https://github.com/apache/superset/pull/20113) feat(api): Added "kind" to dataset/<pk> endpoint (@reesercollins) +- [#20299](https://github.com/apache/superset/pull/20299) feat(explore): Dataset Panel Options when Source = Query II (@lyndsiWilliams) +- [#20320](https://github.com/apache/superset/pull/20320) feat: Databricks native driver (@betodealmeida) +- [#20313](https://github.com/apache/superset/pull/20313) feat(explore): Denormalize form data in echarts, world map and nvd3 bar and line charts (@kgabryje) +- [#20277](https://github.com/apache/superset/pull/20277) feat: multiple results pane on explore and dashboard (@zhaoyongjie) +- [#19898](https://github.com/apache/superset/pull/19898) feat: When editing the label/title in the Metrics popover, hitting Enter should save what you've typed (@diegomedina248) +- [#16493](https://github.com/apache/superset/pull/16493) feat(plugin-chart-echarts): [feature-parity] support extra control for the area chart V2 (@stephenLYZ) +- [#19855](https://github.com/apache/superset/pull/19855) feat(explore): Frontend implementation of dataset creation from infobox (@lyndsiWilliams) +- [#20165](https://github.com/apache/superset/pull/20165) feat: add modfied col and timezone info to schedule col (@pkdotson) +- [#20144](https://github.com/apache/superset/pull/20144) feat: showing results pane in dashboard (@zhaoyongjie) +- [#20242](https://github.com/apache/superset/pull/20242) feat: derived metrics use different line style (@zhaoyongjie) +- [#20010](https://github.com/apache/superset/pull/20010) feat: standardized form_data (@zhaoyongjie) +- [#19987](https://github.com/apache/superset/pull/19987) feat(superset-ui-core): add feature flag for the analogous colors (@stephenLYZ) +- [#19881](https://github.com/apache/superset/pull/19881) feat(world-map): support color by metric or country column (@stephenLYZ) +- [#19981](https://github.com/apache/superset/pull/19981) feat!: pass datasource_type and datasource_id to form_data (@eschutho) +- [#15241](https://github.com/apache/superset/pull/15241) feat: query datasets from SQL Lab (@betodealmeida) +- [#20129](https://github.com/apache/superset/pull/20129) feat(explore): Fill dashboard name when adding new chart from dashboard view (@kgabryje) +- [#20160](https://github.com/apache/superset/pull/20160) feat(explore): Add empty state to annotations (@kgabryje) +- [#20134](https://github.com/apache/superset/pull/20134) feat: add Query.columns for bootstrap_data (@hughhhh) +- [#20158](https://github.com/apache/superset/pull/20158) feat: add statsd metrics for notifications (@dpgaspar) +- [#20052](https://github.com/apache/superset/pull/20052) feat(Helm Chart): Support resource limits and requests for each component (@rathberm) +- [#20170](https://github.com/apache/superset/pull/20170) feat: add samples endpoint (@zhaoyongjie) +- [#19381](https://github.com/apache/superset/pull/19381) feat: add drag and drop column rearrangement for table viz (@stevetracvc) +- [#20136](https://github.com/apache/superset/pull/20136) feat: Add Certified filter to Datasets (@hughhhh) +- [#20111](https://github.com/apache/superset/pull/20111) feat(dashboard): Chart title click redirects to Explore in new tab (@kgabryje) +- [#20097](https://github.com/apache/superset/pull/20097) feat(plugin-chart-echarts): add support for generic axis to mixed chart (@villebro) +- [#20126](https://github.com/apache/superset/pull/20126) feat(dashboard): Add create chart button in dashboard edit mode (@kgabryje) +- [#20059](https://github.com/apache/superset/pull/20059) feat: Save column data into json_metadata for all Query executions (@hughhhh) +- [#19918](https://github.com/apache/superset/pull/19918) feat(plugin-chart-echarts): support horizontal bar chart (@stephenLYZ) +- [#19902](https://github.com/apache/superset/pull/19902) feat: Explore popovers should close on escape (@diegomedina248) +- [#20049](https://github.com/apache/superset/pull/20049) feat(dashboard): Rearrange items in chart header controls dropdown (@kgabryje) +- [#20030](https://github.com/apache/superset/pull/20030) feat(sip-68): Add DatasourceDAO class to manage querying different datasources easier (@hughhhh) +- [#19581](https://github.com/apache/superset/pull/19581) feat(viz-gallery): add search weight for viz-name (@stephenLYZ) +- [#19999](https://github.com/apache/superset/pull/19999) feat: RLS for SQL Lab (@betodealmeida) +- [#19993](https://github.com/apache/superset/pull/19993) feat(explore): Show confirmation modal if user exits Explore without saving changes (@kgabryje) +- [#19873](https://github.com/apache/superset/pull/19873) feat(css): adds `chartId`-based class to dashboard chart holder (@rusackas) +- [#20002](https://github.com/apache/superset/pull/20002) feat: deprecate /superset/testconn and migrate to api v1 (@zephyring) +- [#19935](https://github.com/apache/superset/pull/19935) feat: deprecate /superset/validate_sql_json migrate to api v1 (@dpgaspar) +- [#20015](https://github.com/apache/superset/pull/20015) feat: add new enums for datasource types (@hughhhh) +- [#19956](https://github.com/apache/superset/pull/19956) feat: Applitools Cypress workflow (@geido) +- [#19852](https://github.com/apache/superset/pull/19852) feat: Run Applitools on public Storybook (@geido) +- [#19963](https://github.com/apache/superset/pull/19963) feat: Add cypress test for downloading chart as image (@codemaster08240328) +- [#19957](https://github.com/apache/superset/pull/19957) feat: switch from `sqlalchemy-trino` to `trino-python-client` (@dungdm93) +- [#19921](https://github.com/apache/superset/pull/19921) feat: deprecate /superset/extra_table_metadata migrate to api v1 (@dpgaspar) +- [#19745](https://github.com/apache/superset/pull/19745) feat: simplify SQLite time grain (@betodealmeida) +- [#19927](https://github.com/apache/superset/pull/19927) feat(chart & legend): make to enable show legend by default (@prosdev0107) +- [#19754](https://github.com/apache/superset/pull/19754) feat: deprecate old API on core superset fave_dashboards (@dpgaspar) +- [#19905](https://github.com/apache/superset/pull/19905) feat: simplify `memoized_func` (@betodealmeida) +- [#19871](https://github.com/apache/superset/pull/19871) feat(filter): make to hide sort filter when time range (@prosdev0107) +- [#19851](https://github.com/apache/superset/pull/19851) feat: add Advanced Analytics into mixed time series chart (@zhaoyongjie) +- [#19692](https://github.com/apache/superset/pull/19692) feat: Update ShortKey for stop query running in SqlLab editor (@codemaster08240328) +- [#17903](https://github.com/apache/superset/pull/17903) feat: Adds plugin-chart-handlebars (@jdbranham) +- [#19748](https://github.com/apache/superset/pull/19748) feat(explore): improve UI in the control panel (@stephenLYZ) +- [#19724](https://github.com/apache/superset/pull/19724) feat: 10/15/30 min grain to Pinot (@hughhhh) +- [#19696](https://github.com/apache/superset/pull/19696) feat(explore): Replace overlay with alert banner when chart controls change (@kgabryje) +- [#19751](https://github.com/apache/superset/pull/19751) feat(explore): Implement data panel redesign (@kgabryje) +- [#19598](https://github.com/apache/superset/pull/19598) feat: add empty states to sqlab editor and select (@pkdotson) +- [#19450](https://github.com/apache/superset/pull/19450) feat: Remove legacy sql alchemy db connection link from G Sheet connection (@codemaster08240328) +- [#19710](https://github.com/apache/superset/pull/19710) feat: Enabling source maps full time (@rusackas) +- [#19671](https://github.com/apache/superset/pull/19671) feat: UI override registry (@suddjian) +- [#19691](https://github.com/apache/superset/pull/19691) feat(explore): More explicit labels of adhoc filter operators (@kgabryje) +- [#19558](https://github.com/apache/superset/pull/19558) feat(explore): Redesign of Run/Save buttons (@kgabryje) +- [#19650](https://github.com/apache/superset/pull/19650) feat(embedded): API get embedded dashboard config by uuid (@lilykuang) +- [#19310](https://github.com/apache/superset/pull/19310) feat(CRUD): add new empty state (@stephenLYZ) +- [#19622](https://github.com/apache/superset/pull/19622) feat(plugin-chart-echarts): add aggregate total for the Pie/Donuct chart (@stephenLYZ) +- [#19314](https://github.com/apache/superset/pull/19314) feat: Move Database Import option into DB Connection modal (@lyndsiWilliams) +- [#19434](https://github.com/apache/superset/pull/19434) feat: deprecate old API and create new API for dashes created by me (@dpgaspar) +- [#19482](https://github.com/apache/superset/pull/19482) feat: add success toast to alerts and reports (@pkdotson) +- [#19574](https://github.com/apache/superset/pull/19574) feat: add a `where_in` filter for Jinja2 (@betodealmeida) +- [#19458](https://github.com/apache/superset/pull/19458) feat(explore): Move timer, row counter and cached pills to chart container (@kgabryje) +- [#19529](https://github.com/apache/superset/pull/19529) feat(explore): Move chart header to top of the page (@kgabryje) +- [#19489](https://github.com/apache/superset/pull/19489) feat(CI): clean up Python tests output (@ktmud) +- [#19308](https://github.com/apache/superset/pull/19308) feat(explore): SQL popover in datasource panel (@kgabryje) +- [#19325](https://github.com/apache/superset/pull/19325) feat(color): support analogous colors to prevent color conflict (@stephenLYZ) +- [#19408](https://github.com/apache/superset/pull/19408) feat(dashboard): Implement empty states for empty tabs (@kgabryje) +- [#19446](https://github.com/apache/superset/pull/19446) feat(explore): Move chart actions into dropdown (@kgabryje) +- [#19394](https://github.com/apache/superset/pull/19394) feat(explore): UI changes in dataset panel on Explore page (@kgabryje) + +**Fixes** +- [#19920](https://github.com/apache/superset/pull/19920) fix(table viz): correctly sort by multiple columns in a table (@stevetracvc) +- [#20402](https://github.com/apache/superset/pull/20402) fix: alert & reports active toggle optimistic update (@diegomedina248) +- [#20472](https://github.com/apache/superset/pull/20472) fix: Changes the return type of get_permissions to be JSON friendly (@michael-s-molina) +- [#20468](https://github.com/apache/superset/pull/20468) fix: async queries limit bug (@AAfghahi) +- [#20257](https://github.com/apache/superset/pull/20257) fix(home): Show home page tabs as pills instead of links (@prosdev0107) +- [#20340](https://github.com/apache/superset/pull/20340) fix: ensure column name in description is string (@betodealmeida) +- [#20350](https://github.com/apache/superset/pull/20350) fix(viz): BigQuery time grain 'minute'/'second' throws an error (@diegomedina248) +- [#20384](https://github.com/apache/superset/pull/20384) fix(chart & table): Prevent the dates from wrapping in table chart (@prosdev0107) +- [#20404](https://github.com/apache/superset/pull/20404) fix: suppress translation warning in jest (@zhaoyongjie) +- [#20451](https://github.com/apache/superset/pull/20451) fix: should raise exception when apply a categorical axis (@zhaoyongjie) +- [#20447](https://github.com/apache/superset/pull/20447) fix: table viz sort icon bottom aligned (@diegomedina248) +- [#20326](https://github.com/apache/superset/pull/20326) fix(fbprophet): Fix weekly frequencies (@john-bodley) +- [#20434](https://github.com/apache/superset/pull/20434) fix(20428): Address-Presto/Trino-Poll-Issue-Refactor (@Thelin90) +- [#20411](https://github.com/apache/superset/pull/20411) fix(dashboard): new created chart did not have high lighted effect when using the permalink of chart share in dashboard (@diegomedina248) +- [#20261](https://github.com/apache/superset/pull/20261) fix(embedded): CSV download for chart (@lilykuang) +- [#20276](https://github.com/apache/superset/pull/20276) fix(cosmetic): cannot find m-r-10 class in superset.less (@Renderz) +- [#20420](https://github.com/apache/superset/pull/20420) fix: rm eslint-plugin-translation-vars engines requirement (@stephenLYZ) +- [#20409](https://github.com/apache/superset/pull/20409) fix(bar-chart-v2): remove marker control from bar chart V2 (@stephenLYZ) +- [#20333](https://github.com/apache/superset/pull/20333) fix(presto): use milliseconds timespec for presto (@mohittt8) +- [#20414](https://github.com/apache/superset/pull/20414) fix: key error on permalink fetch for old permalinks (@eschutho) +- [#20410](https://github.com/apache/superset/pull/20410) fix: Adding extra metrics issue after chart configuration (@codemaster08240328) +- [#20405](https://github.com/apache/superset/pull/20405) fix: Incorrect translations in Chinese in messages.po (@chuancyzhang) +- [#20396](https://github.com/apache/superset/pull/20396) fix(plugin-chart-pivot-table): color weight of Conditional formatting metrics not work (@stephenLYZ) +- [#20361](https://github.com/apache/superset/pull/20361) fix(fonts): Show the all the A's in our workspace correctly, not funky (@prosdev0107) +- [#20383](https://github.com/apache/superset/pull/20383) fix: Unable to export multiple Dashboards with the same name (@diegomedina248) +- [#20363](https://github.com/apache/superset/pull/20363) fix: A newly connected database doesn't appear in the databases list if user connected database using the 'plus' button (@diegomedina248) +- [#20372](https://github.com/apache/superset/pull/20372) fix: update connection modal to use existing catalog (@pkdotson) +- [#20368](https://github.com/apache/superset/pull/20368) fix(VERSIONED_EXPORTS): Ensure dashboards and charts adhere to the VERSIONED_EXPORTS feature flag (@john-bodley) +- [#20351](https://github.com/apache/superset/pull/20351) fix: catch some potential errors on dual write (@eschutho) +- [#20364](https://github.com/apache/superset/pull/20364) fix: query execution time is not fully displayed in bubble icon (@diegomedina248) +- [#20365](https://github.com/apache/superset/pull/20365) fix: Fix typo in Error handling message (@codemaster08240328) +- [#19967](https://github.com/apache/superset/pull/19967) fix: A newly connected database doesn't appear in the databases list if user connected database using the 'plus' button (@diegomedina248) +- [#20348](https://github.com/apache/superset/pull/20348) fix(docker): Make Gunicorn Keepalive Adjustable (@mdeshmu) +- [#19670](https://github.com/apache/superset/pull/19670) fix: Add serviceAccountName to celerybeat pods (@paulinjo) +- [#20315](https://github.com/apache/superset/pull/20315) fix(chart): chart gets cut off on the dashboard (@stephenLYZ) +- [#20324](https://github.com/apache/superset/pull/20324) fix: superset-ui/core coverage (@zhaoyongjie) +- [#20282](https://github.com/apache/superset/pull/20282) fix(explore): Make that see more/see less works correctly with scrolling when error msg is long text. (@prosdev0107) +- [#20296](https://github.com/apache/superset/pull/20296) fix: Alpha are unable to perform a second modification to a Dataset when in Explore (@hughhhh) +- [#20290](https://github.com/apache/superset/pull/20290) fix: Faulty datetime parser regex (@reesercollins) +- [#19761](https://github.com/apache/superset/pull/19761) fix(plugin-chart-echarts): [feature-parity] apply button of annotation layer doesn't work as expected (@stephenLYZ) +- [#20263](https://github.com/apache/superset/pull/20263) fix(embedded): accessing variable response before initialization (@zhaorui2022) +- [#20274](https://github.com/apache/superset/pull/20274) fix(codecov): improve core code coverage (@stephenLYZ) +- [#20187](https://github.com/apache/superset/pull/20187) fix: Database import with cancel_query.. extra field (@codemaster08240328) +- [#20237](https://github.com/apache/superset/pull/20237) fix(cosmetic): Fix Datasource Modal Out Of Box (@Renderz) +- [#20058](https://github.com/apache/superset/pull/20058) fix: Support the Clipboard API in modern browsers (@diegomedina248) +- [#20164](https://github.com/apache/superset/pull/20164) fix(sql lab): View result button is not showing consistently (@diegomedina248) +- [#20171](https://github.com/apache/superset/pull/20171) fix(charts list): do not trigger ListViewError exception for anonymous user (@trepmag) +- [#20178](https://github.com/apache/superset/pull/20178) fix: While exporting CSV , only the entries on first page are getting downloaded even when user is on other pages #17861 (@LahmerIlyas) +- [#20204](https://github.com/apache/superset/pull/20204) fix: Fixes issue where results panel height was incorrect [sc-49045] (@eric-briscoe) +- [#20235](https://github.com/apache/superset/pull/20235) fix: Box Plot Chart throws an error when the average (AVG) / SUM is being calculated on the Metrics (@diegomedina248) +- [#20088](https://github.com/apache/superset/pull/20088) fix: datatype tracking issue on virtual dataset (@codemaster08240328) +- [#20220](https://github.com/apache/superset/pull/20220) fix: dashbaord unable to refresh (@zhaoyongjie) +- [#20228](https://github.com/apache/superset/pull/20228) fix: failed samples should throw exception (@zhaoyongjie) +- [#20203](https://github.com/apache/superset/pull/20203) fix: move columns to datasource object for bootstrap data (@hughhhh) +- [#20151](https://github.com/apache/superset/pull/20151) fix(csv): Ensure df_to_escaped_csv does not coerce integer columns to float (@john-bodley) +- [#20221](https://github.com/apache/superset/pull/20221) fix(legacy-plugin-chart-sunburst): linear color scheme not work when secondary metric is provided (@stephenLYZ) +- [#20223](https://github.com/apache/superset/pull/20223) fix(legacy-plugin-chart-sunburst): chart broken when secondary metric is removed (@stephenLYZ) +- [#20147](https://github.com/apache/superset/pull/20147) fix(cosmetic): Limiting modal height (@rusackas) +- [#20206](https://github.com/apache/superset/pull/20206) fix(sql lab): SQL Lab Compile Query Delay (@diegomedina248) +- [#20201](https://github.com/apache/superset/pull/20201) fix: unable to set destroyOnClose on ModalTrigger (@zhaoyongjie) +- [#20186](https://github.com/apache/superset/pull/20186) fix(db): make to allow to show/hide the password when only creating (@prosdev0107) +- [#20127](https://github.com/apache/superset/pull/20127) fix(database): retrival of tables and views from schema for exasol backend (@Nicoretti) +- [#19899](https://github.com/apache/superset/pull/19899) fix: always create parameter json field (@pkdotson) +- [#20173](https://github.com/apache/superset/pull/20173) fix: avoid while cycle in computeMaxFontSize for big Number run forever when css rule applied (@diegomedina248) +- [#20086](https://github.com/apache/superset/pull/20086) fix(css): transparent linear gradient not working in safari (@stephenLYZ) +- [#19102](https://github.com/apache/superset/pull/19102) fix: string aggregation is incorrect in PivotTableV2 (@diegomedina248) +- [#20011](https://github.com/apache/superset/pull/20011) fix(chart & heatmap): make to fix that y label is rendering out of bounds (@prosdev0107) +- [#20142](https://github.com/apache/superset/pull/20142) fix(explore): handle null control sections (@villebro) +- [#20128](https://github.com/apache/superset/pull/20128) fix: advanced data type API spec and permission name (@dpgaspar) +- [#20107](https://github.com/apache/superset/pull/20107) fix(generic-chart-axes): set x-axis if unset and ff is enabled (@villebro) +- [#20018](https://github.com/apache/superset/pull/20018) fix(modal): add primary button loading state to modals (@kgopal492) +- [#20099](https://github.com/apache/superset/pull/20099) fix: Add cypress test for report page direct link issue (@codemaster08240328) +- [#20068](https://github.com/apache/superset/pull/20068) fix: dbmodal test connection error timeout (@pkdotson) +- [#20092](https://github.com/apache/superset/pull/20092) fix: Revert "feat(explore): Show confirmation modal if user exits Explore without saving changes (#19993) (@kgabryje) +- [#19939](https://github.com/apache/superset/pull/19939) fix(chart & alert): make to show metrics properly (@prosdev0107) +- [#20085](https://github.com/apache/superset/pull/20085) fix: typo in `importexport/api.py` OpenAPI (@betodealmeida) +- [#20051](https://github.com/apache/superset/pull/20051) fix(CRUD): make to fix the dancing when crud view is on hover (@prosdev0107) +- [#20064](https://github.com/apache/superset/pull/20064) fix(chart & gallery): make to add mixed time-series into recommended charts (@prosdev0107) +- [#20013](https://github.com/apache/superset/pull/20013) fix: The dynamic form to connect to Snowflake DB is not returning any errors (@diegomedina248) +- [#20029](https://github.com/apache/superset/pull/20029) fix(plugin-chart-echarts): tooltip of big number truncated at then bottom (@stephenLYZ) +- [#19914](https://github.com/apache/superset/pull/19914) fix: Refactor SQL engine username logic (@john-bodley) +- [#20050](https://github.com/apache/superset/pull/20050) fix: Fixes Tabs style (@michael-s-molina) +- [#20048](https://github.com/apache/superset/pull/20048) fix(homepage): make to show indicator when tab is chosen (@prosdev0107) +- [#20026](https://github.com/apache/superset/pull/20026) fix(chart & filters): make to padding between textarea and buttons (@prosdev0107) +- [#20019](https://github.com/apache/superset/pull/20019) fix(embedded): third party cookies (@lilykuang) +- [#20033](https://github.com/apache/superset/pull/20033) fix: Direct Linking issue on report list: 404 status code. (@codemaster08240328) +- [#19977](https://github.com/apache/superset/pull/19977) fix(word-cloud): fix randomness of each word's rotation (@ebaratte) +- [#20021](https://github.com/apache/superset/pull/20021) fix: native filter truncation rerendering loop on hover (@diegomedina248) +- [#20004](https://github.com/apache/superset/pull/20004) fix: URI form is blank when trying to connect from sql lab (@diegomedina248) +- [#19841](https://github.com/apache/superset/pull/19841) fix: Table chart column config issue (@codemaster08240328) +- [#19877](https://github.com/apache/superset/pull/19877) fix: Making chart update more truthful (@Gwitchr) +- [#19996](https://github.com/apache/superset/pull/19996) fix: Use pull_request_target in Cypress Applitools workflow (@geido) +- [#19972](https://github.com/apache/superset/pull/19972) fix: revert chore(deps): bump d3-svg-legend in /superset-frontend (#19846) (@villebro) +- [#19889](https://github.com/apache/superset/pull/19889) fix: Fix auto-reversion of label/title in the Metrics popover (@diegomedina248) +- [#19903](https://github.com/apache/superset/pull/19903) fix(explore): Explore data table tooltip (@Gwitchr) +- [#19938](https://github.com/apache/superset/pull/19938) fix(chart & table): make to allow highlight in case of numeric column (@prosdev0107) +- [#19839](https://github.com/apache/superset/pull/19839) fix(dashboard): allow users to resize the markdown widget easier (@cccs-Dustin) +- [#19887](https://github.com/apache/superset/pull/19887) fix(hive): Workaround for Python 3.9 s3 transfer issue (@john-bodley) +- [#19936](https://github.com/apache/superset/pull/19936) fix: OpenAPI docs small fixes (@dpgaspar) +- [#19932](https://github.com/apache/superset/pull/19932) fix: can not correctly set force in store (@zhaoyongjie) +- [#19930](https://github.com/apache/superset/pull/19930) fix: memoize primitives (@betodealmeida) +- [#19926](https://github.com/apache/superset/pull/19926) fix(dataset): DAO update (@betodealmeida) +- [#19826](https://github.com/apache/superset/pull/19826) fix: Missing `f` prefix on f-strings (@code-review-doctor) +- [#18988](https://github.com/apache/superset/pull/18988) fix(column-header-tooltip): make that hide the tooltip when the cloum… (@prosdev0107) +- [#19782](https://github.com/apache/superset/pull/19782) fix: chart import error with virtual dataset (@codemaster08240328) +- [#19485](https://github.com/apache/superset/pull/19485) fix: Set fixed maxWidth of the cron schedule modal (@codemaster08240328) +- [#19885](https://github.com/apache/superset/pull/19885) fix: Chart download as image issue (@codemaster08240328) +- [#19883](https://github.com/apache/superset/pull/19883) fix(allow-db-explore): make to check the allow virtual table explore option by default (@prosdev0107) +- [#19835](https://github.com/apache/superset/pull/19835) fix(helm): fix postgresql values (@benjamin-texier) +- [#19758](https://github.com/apache/superset/pull/19758) fix(plugin-chart-echarts): [feature parity] annotation line chart color does not work (@stephenLYZ) +- [#19879](https://github.com/apache/superset/pull/19879) fix(plugin-chart-handlebars): fix overflow, debounce and control reset (@villebro) +- [#19668](https://github.com/apache/superset/pull/19668) fix: Dates alignment in Table viz (@geido) +- [#19876](https://github.com/apache/superset/pull/19876) fix: Cannot re-order metrics by drag and drop (@diegomedina248) +- [#19840](https://github.com/apache/superset/pull/19840) fix(dashboard-css): make to load saved css template (@prosdev0107) +- [#19859](https://github.com/apache/superset/pull/19859) fix: Dashboard report creation error handling (@etr2460) +- [#19857](https://github.com/apache/superset/pull/19857) fix: Update eslint error message to reflect location of antd components (@etr2460) +- [#19605](https://github.com/apache/superset/pull/19605) fix: Query execution time is displayed as invalid date (@diegomedina248) +- [#19694](https://github.com/apache/superset/pull/19694) fix(db & connection): make to show/hide the password when only creating db connection (@prosdev0107) +- [#19778](https://github.com/apache/superset/pull/19778) fix: deck.gl GeoJsonLayer Autozoom & fill/stroke options (@diegomedina248) +- [#19850](https://github.com/apache/superset/pull/19850) fix: Regression on Data and Alerts & Reports Headers (@diegomedina248) +- [#19842](https://github.com/apache/superset/pull/19842) fix: count(distinct column_name) in metrics (@zhaoyongjie) +- [#19843](https://github.com/apache/superset/pull/19843) fix(explore): ignore temporary controls in altered pill (@villebro) +- [#19800](https://github.com/apache/superset/pull/19800) fix: Cypress tests reliability improvements (@diegomedina248) +- [#19575](https://github.com/apache/superset/pull/19575) fix: Show full long number in text email report for table chart. (@codemaster08240328) +- [#19429](https://github.com/apache/superset/pull/19429) fix(dashboard): make to filter the correct certified or non-certified… (@prosdev0107) +- [#13082](https://github.com/apache/superset/pull/13082) fix(sql_lab): Add custom timestamp type for literal casting for presto timestamps (@kekwan) +- [#19797](https://github.com/apache/superset/pull/19797) fix: add missing init files (@suddjian) +- [#19672](https://github.com/apache/superset/pull/19672) fix: trap SQLAlchemy common exceptions & throw 422 error instead (@diegomedina248) +- [#19288](https://github.com/apache/superset/pull/19288) fix: AlertReportCronScheduler tests (@diegomedina248) +- [#19781](https://github.com/apache/superset/pull/19781) fix(world-map): remove categorical color control (@serenajiang) +- [#19792](https://github.com/apache/superset/pull/19792) fix(plugin-chart-table): Resetting controls when switching query mode (@kgabryje) +- [#19755](https://github.com/apache/superset/pull/19755) fix: small cleanup for created by me dashboards API (@dpgaspar) +- [#19784](https://github.com/apache/superset/pull/19784) fix(readme): Remove broken link to legacy gallery (@drluckyspin) +- [#19722](https://github.com/apache/superset/pull/19722) fix: dashboard top level tabs edit (@diegomedina248) +- [#19777](https://github.com/apache/superset/pull/19777) fix(explore): Double divider if no permissions for adding reports (@kgabryje) +- [#19673](https://github.com/apache/superset/pull/19673) fix(import): Add the error alert on failed database import (@prosdev0107) +- [#19518](https://github.com/apache/superset/pull/19518) fix: alert/report created by filter inconsistency with table display (@diegomedina248) +- [#19700](https://github.com/apache/superset/pull/19700) fix: remove expose (@AAfghahi) +- [#19626](https://github.com/apache/superset/pull/19626) fix: deactivate embedding on a dashboard (@suddjian) +- [#19472](https://github.com/apache/superset/pull/19472) fix: Dashboard Edit View Tab Headers Hidden when Dashboard Name is Long (@diegomedina248) +- [#19311](https://github.com/apache/superset/pull/19311) fix(sql lab): add quotes when autocompleting table names with spaces in the editor (@diegomedina248) +- [#19290](https://github.com/apache/superset/pull/19290) fix(sql lab): select edit on query from history doesn't upload editor properly (@diegomedina248) +- [#19420](https://github.com/apache/superset/pull/19420) fix: sql lab ctrl t behaved differently from clicking (@Gwitchr) +- [#19357](https://github.com/apache/superset/pull/19357) fix: Redirect to full url on 401 (@geido) +- [#19001](https://github.com/apache/superset/pull/19001) fix: Line Chart Annotation Info Update (@codemaster08240328) +- [#19714](https://github.com/apache/superset/pull/19714) fix: create virtual table with exotic type (@villebro) +- [#19708](https://github.com/apache/superset/pull/19708) fix(nav): infinite redirect and upload dataset nav permissions (@ktmud) +- [#19430](https://github.com/apache/superset/pull/19430) fix(data-upload): make to change err message (@prosdev0107) +- [#19419](https://github.com/apache/superset/pull/19419) fix(alert & report): make to fix the issue when recreate report (@prosdev0107) +- [#19371](https://github.com/apache/superset/pull/19371) fix: Reset sorting bar issue in Barchart (@codemaster08240328) +- [#19362](https://github.com/apache/superset/pull/19362) fix(sql lab): display the 'View Results' button consistently in the history tab on sync mode (@diegomedina248) +- [#19294](https://github.com/apache/superset/pull/19294) fix: improve alerts & reports modal on small devices (@diegomedina248) +- [#19257](https://github.com/apache/superset/pull/19257) fix(sql lab): table selector should display all the selected tables (@diegomedina248) +- [#19686](https://github.com/apache/superset/pull/19686) fix(plugin-chart-echarts): xAxis scale is not correct when time grain is quarter (@stephenLYZ) +- [#19646](https://github.com/apache/superset/pull/19646) fix(explore): Change copy of cross filters checkbox (@kgabryje) +- [#19586](https://github.com/apache/superset/pull/19586) fix: Navbar styles and Welcome page text (@geido) +- [#19662](https://github.com/apache/superset/pull/19662) fix(database-api): allow search for all columns (@villebro) +- [#19656](https://github.com/apache/superset/pull/19656) fix: allow_browser_login in import/export API (@betodealmeida) +- [#19628](https://github.com/apache/superset/pull/19628) fix: Table Autosizing Has Unnecessary Horizontal Scroll Bars (@diegomedina248) +- [#19573](https://github.com/apache/superset/pull/19573) fix(chart & polygon): make to fix the issue the polygon chart (@prosdev0107) +- [#19051](https://github.com/apache/superset/pull/19051) fix: update Permissions for right nav (@AAfghahi) +- [#19625](https://github.com/apache/superset/pull/19625) fix(test): make test_clean_requests_after_schema_grant more idempotent (@ktmud) +- [#19571](https://github.com/apache/superset/pull/19571) fix: Catch literal colors when theme top level (@geido) +- [#19594](https://github.com/apache/superset/pull/19594) fix: spelling of following (@lzm0) +- [#19569](https://github.com/apache/superset/pull/19569) fix: check type of url before performing string actions (@eschutho) +- [#19570](https://github.com/apache/superset/pull/19570) fix: sqloxide optional (@betodealmeida) +- [#19397](https://github.com/apache/superset/pull/19397) fix: weight tooltip issue (@codemaster08240328) +- [#19313](https://github.com/apache/superset/pull/19313) fix(sql lab): increase the size of the action icons in the history tab (@diegomedina248) +- [#19039](https://github.com/apache/superset/pull/19039) fix(explore): clean data when hidding control (@stephenLYZ) +- [#19444](https://github.com/apache/superset/pull/19444) fix: Error Message is cut off in alerts & reports log page (@codemaster08240328) +- [#19312](https://github.com/apache/superset/pull/19312) fix: adaptive formatting typo in explore dropdowns (@diegomedina248) +- [#19534](https://github.com/apache/superset/pull/19534) fix(explore): Chart header icon paddings (@kgabryje) +- [#19399](https://github.com/apache/superset/pull/19399) fix: native filter dropdown not attached to parent node (@diegomedina248) +- [#19112](https://github.com/apache/superset/pull/19112) fix: Dashboard import holding issue (@codemaster08240328) +- [#19342](https://github.com/apache/superset/pull/19342) fix: Clean up custom css when dashboard unmounted (@codemaster08240328) +- [#19491](https://github.com/apache/superset/pull/19491) fix: Dynamic form to connect to Snowflake DB is not displaying authentication errors (@diegomedina248) +- [#19528](https://github.com/apache/superset/pull/19528) fix: Correct Ukraine map (@wacken89) +- [#19522](https://github.com/apache/superset/pull/19522) fix: add back view for report reload error (@pkdotson) +- [#19519](https://github.com/apache/superset/pull/19519) fix: GSheets rendering from global nav (@hughhhh) +- [#19358](https://github.com/apache/superset/pull/19358) fix(sqllab): make to hide the delete button of most recent query history (@prosdev0107) +- [#19307](https://github.com/apache/superset/pull/19307) fix: Logo resizing on page load (@geido) +- [#19166](https://github.com/apache/superset/pull/19166) fix: time filter should be [start, end) (@zhaoyongjie) + +**Others** +- [#20116](https://github.com/apache/superset/pull/20116) style(typo): occured -> occurred (@sfirke) +- [#20401](https://github.com/apache/superset/pull/20401) chore: add action to welcome new users (@eschutho) +- [#20269](https://github.com/apache/superset/pull/20269) chore(docs): Remove cache warming documentation (@ajwhite) +- [#20194](https://github.com/apache/superset/pull/20194) chore: Removes unused vars (@michael-s-molina) +- [#20321](https://github.com/apache/superset/pull/20321) chore: add breaking change information about form_data datasource_type (@eschutho) +- [#20298](https://github.com/apache/superset/pull/20298) chore: Removes no-use-before-define warnings (@michael-s-molina) +- [#20337](https://github.com/apache/superset/pull/20337) chore(dashboard): update Edit Dashboard side panel tabs (@codyml) +- [#20318](https://github.com/apache/superset/pull/20318) chore: Updates the final steps of the release README (@michael-s-molina) +- [#20307](https://github.com/apache/superset/pull/20307) docs: Updates CHANGELOG.md with 1.5.1 fixes (@michael-s-molina) +- [#20308](https://github.com/apache/superset/pull/20308) docs(jinja): Detail how to use Jinja parameters (@EBoisseauSierra) +- [#20304](https://github.com/apache/superset/pull/20304) chore: superset-ui/core code coverage (@zhaoyongjie) +- [#20297](https://github.com/apache/superset/pull/20297) chore(deps): pinning pyjwt to 2.4.0 (@sadpandajoe) +- [#20287](https://github.com/apache/superset/pull/20287) chore(deps): bump numpy 1.22.1 and PyJWT to 2.4.0 (@sadpandajoe) +- [#20272](https://github.com/apache/superset/pull/20272) chore: remove unused codes for samples (@zhaoyongjie) +- [#20289](https://github.com/apache/superset/pull/20289) chore: Adjusts release emails (@michael-s-molina) +- [#20180](https://github.com/apache/superset/pull/20180) docs: facelift the docs (@mistercrunch) +- [#20249](https://github.com/apache/superset/pull/20249) chore: add event logger to reports/alerts CRUD (@AAfghahi) +- [#20273](https://github.com/apache/superset/pull/20273) chore: adjust the psycopg2 version of k8s installation guide (@ensky) +- [#20152](https://github.com/apache/superset/pull/20152) refactor(trino): Handful of updates for the Trino engine (@john-bodley) +- [#20252](https://github.com/apache/superset/pull/20252) chore: use exc_info to pass errors to log warnings (@eschutho) +- [#20154](https://github.com/apache/superset/pull/20154) chore(requirements): Cleanup of Python requirements (@john-bodley) +- [#20226](https://github.com/apache/superset/pull/20226) refactor: decouple DataTableControl (@zhaoyongjie) +- [#20243](https://github.com/apache/superset/pull/20243) docs: Add beans to users list (@kakoni) +- [#20231](https://github.com/apache/superset/pull/20231) docs: Updates release scripts and docs (@michael-s-molina) +- [#20196](https://github.com/apache/superset/pull/20196) chore: bumping min version of shillelagh (@AAfghahi) +- [#20192](https://github.com/apache/superset/pull/20192) chore: Moves date utils to utils folder (@michael-s-molina) +- [#20210](https://github.com/apache/superset/pull/20210) docs: update release instructions (@villebro) +- [#20205](https://github.com/apache/superset/pull/20205) chore(deps): bump swagger-ui-react from 4.1.2 to 4.1.3 in /docs (@dependabot[bot]) +- [#20195](https://github.com/apache/superset/pull/20195) docs: correct case of ClickHouse (@DanRoscigno) +- [#20109](https://github.com/apache/superset/pull/20109) refactor: decouple DataTablesPane (@zhaoyongjie) +- [#20193](https://github.com/apache/superset/pull/20193) refactor: Removes embedded/index.tsx warnings (@michael-s-molina) +- [#20185](https://github.com/apache/superset/pull/20185) docs(security): a typo: Gamma should be in quotes (@jimmytheneutrino) +- [#20146](https://github.com/apache/superset/pull/20146) chore: Implement global header in Dashboard (@geido) +- [#20174](https://github.com/apache/superset/pull/20174) chore: Disable flaky assert in reports cypress test (@kgabryje) +- [#20163](https://github.com/apache/superset/pull/20163) chore: change button name in Sql Lab (@AAfghahi) +- [#20157](https://github.com/apache/superset/pull/20157) chore: filter undefined operators (@zhaoyongjie) +- [#20140](https://github.com/apache/superset/pull/20140) chore(data-table): make formatted dttm the default (@villebro) +- [#20104](https://github.com/apache/superset/pull/20104) chore: fix INTHEWILD sort order and indentation (@villebro) +- [#20093](https://github.com/apache/superset/pull/20093) chore: Add the tnum font property to Table components (@geido) +- [#20103](https://github.com/apache/superset/pull/20103) docs: Update INTHEWILD.md (@fccoelho) +- [#20102](https://github.com/apache/superset/pull/20102) chore: Update aiohttp to 3.8.1 (@diegomedina248) +- [#20066](https://github.com/apache/superset/pull/20066) chore: Set limit for a query in execute_sql_statement (@AAfghahi) +- [#20032](https://github.com/apache/superset/pull/20032) chore: Change copy to Edit chart in Dashboard dropdown (@geido) +- [#20071](https://github.com/apache/superset/pull/20071) chore: Fix and enhance Applitools workflows (@geido) +- [#19966](https://github.com/apache/superset/pull/19966) test: make tabbed dashboard a little more complex (@ktmud) +- [#19976](https://github.com/apache/superset/pull/19976) perf(plugin-chart-table): Add memoization to avoid rerenders (@kgabryje) +- [#20044](https://github.com/apache/superset/pull/20044) chore: Create a generic header component for Explore and Dashboard (@kgabryje) +- [#20046](https://github.com/apache/superset/pull/20046) docs: add changelog and updating entries for 1.5.0 (@villebro) +- [#19962](https://github.com/apache/superset/pull/19962) chore: add doc link for db migration conflict warning (@ktmud) +- [#20034](https://github.com/apache/superset/pull/20034) chore: Changes the no-literal-colors lint rule to throw errors instead of warnings (@michael-s-molina) +- [#20031](https://github.com/apache/superset/pull/20031) chore: Run Applitools + Cypress nightly (@geido) +- [#20006](https://github.com/apache/superset/pull/20006) chore: Removes hard-coded colors from the plugins - iteration 2 (@michael-s-molina) +- [#19130](https://github.com/apache/superset/pull/19130) refactor: Refactor reports for Charts and Dashboards (@AAfghahi) +- [#20016](https://github.com/apache/superset/pull/20016) chore: Removes hard-coded colors - iteration 3 (@michael-s-molina) +- [#19870](https://github.com/apache/superset/pull/19870) docs: Detail front-end development instructions (@EBoisseauSierra) +- [#19971](https://github.com/apache/superset/pull/19971) docs: Add config for running on a WSGI HTTP server (@thinhnd2104) +- [#20008](https://github.com/apache/superset/pull/20008) chore: Upgrades Storybook from 6.4.19 to 6.4.22 (@michael-s-molina) +- [#20009](https://github.com/apache/superset/pull/20009) docs: typo in chart-params markdown file (@JakobMiksch) +- [#19923](https://github.com/apache/superset/pull/19923) chore: Removes hard-coded colors from the plugins - iteration 1 (@michael-s-molina) +- [#19954](https://github.com/apache/superset/pull/19954) chore: convert URLShortLinkButton to typescript (@ktmud) +- [#19929](https://github.com/apache/superset/pull/19929) chore: change subject name from no_name to named for PNGs in (@AAfghahi) +- [#19942](https://github.com/apache/superset/pull/19942) refactor(ReportModal): simplify state reducer and improve error handling (@ktmud) +- [#19770](https://github.com/apache/superset/pull/19770) chore: remove druid datasource from the config (@eschutho) +- [#19911](https://github.com/apache/superset/pull/19911) chore: Fix broken link for DouroECI (@mavimo) +- [#19951](https://github.com/apache/superset/pull/19951) chore: Adds the theme object to chart properties (@michael-s-molina) +- [#19813](https://github.com/apache/superset/pull/19813) chore: get embedded user with roles and permissions (@suddjian) +- [#19897](https://github.com/apache/superset/pull/19897) chore: Adds a storybook to FilterableTable (@michael-s-molina) +- [#19924](https://github.com/apache/superset/pull/19924) chore(reports): Improving logging around failed scheduled reports (@craig-rueda) +- [#19906](https://github.com/apache/superset/pull/19906) revert: "fix(sql lab): display the 'View Results' button consistently in the history tab on sync mode" (@Gwitchr) +- [#19916](https://github.com/apache/superset/pull/19916) chore(deps): bump react-virtualized-auto-sizer from 1.0.2 to 1.0.6 in /superset-frontend (@dependabot[bot]) +- [#19888](https://github.com/apache/superset/pull/19888) chore(deps): bump cross-fetch from 3.1.4 to 3.1.5 in /docs (@dependabot[bot]) +- [#19894](https://github.com/apache/superset/pull/19894) chore(deps-dev): bump eslint-plugin-prettier from 3.3.1 to 4.0.0 in /superset-frontend (@dependabot[bot]) +- [#19602](https://github.com/apache/superset/pull/19602) docs: Added gtag to docusaurus (@AAfghahi) +- [#19878](https://github.com/apache/superset/pull/19878) chore(deps-dev): bump @storybook/client-api from 6.4.19 to 6.4.22 in /superset-frontend (@dependabot[bot]) +- [#19821](https://github.com/apache/superset/pull/19821) test(native filter): refactor and add new test (@jinghua-qa) +- [#19613](https://github.com/apache/superset/pull/19613) chore: Update line-height in SliceHeaderControl (@geido) +- [#19616](https://github.com/apache/superset/pull/19616) chore: Update font-sizes in DatabaseModal (@geido) +- [#19866](https://github.com/apache/superset/pull/19866) chore: fix explore pills (@villebro) +- [#19872](https://github.com/apache/superset/pull/19872) chore: Update aiohttp>=3.7.4 in requirements (@hughhhh) +- [#19874](https://github.com/apache/superset/pull/19874) chore: bump rockset>=0.8.10, <0.9 (@hughhhh) +- [#19864](https://github.com/apache/superset/pull/19864) chore(deps): bump react-syntax-highlighter from 15.4.5 to 15.5.0 in /superset-frontend (@dependabot[bot]) +- [#19828](https://github.com/apache/superset/pull/19828) chore: add custom eslint plugin to prevent translation variables (@stephenLYZ) +- [#19845](https://github.com/apache/superset/pull/19845) chore(deps): bump react-split from 2.0.9 to 2.0.14 in /superset-frontend (@dependabot[bot]) +- [#19846](https://github.com/apache/superset/pull/19846) chore(deps): bump d3-svg-legend from 1.13.0 to 2.25.6 in /superset-frontend (@dependabot[bot]) +- [#19847](https://github.com/apache/superset/pull/19847) chore(deps-dev): bump eslint-plugin-jsx-a11y from 6.4.1 to 6.5.1 in /superset-frontend (@dependabot[bot]) +- [#19853](https://github.com/apache/superset/pull/19853) chore(frontend-tests): Spelling (@jsoref) +- [#19823](https://github.com/apache/superset/pull/19823) docs: updated links for country map scripts (@ktmud) +- [#19829](https://github.com/apache/superset/pull/19829) chore(deps-dev): bump babel-loader from 8.2.4 to 8.2.5 in /superset-frontend (@dependabot[bot]) +- [#19830](https://github.com/apache/superset/pull/19830) chore(deps): bump react-hot-loader from 4.12.20 to 4.13.0 in /superset-frontend (@dependabot[bot]) +- [#19403](https://github.com/apache/superset/pull/19403) chore(deps-dev): bump babel-loader from 8.2.2 to 8.2.4 in /superset-frontend (@dependabot[bot]) +- [#19637](https://github.com/apache/superset/pull/19637) chore(deps): bump moment from 2.29.1 to 2.29.2 in /superset-frontend (@dependabot[bot]) +- [#19681](https://github.com/apache/superset/pull/19681) chore(deps): bump async from 3.2.0 to 3.2.3 in /superset-frontend/cypress-base (@dependabot[bot]) +- [#19680](https://github.com/apache/superset/pull/19680) chore(deps): bump async from 3.2.0 to 3.2.3 in /superset-websocket (@dependabot[bot]) +- [#19020](https://github.com/apache/superset/pull/19020) chore(deps): bump url-parse from 1.5.7 to 1.5.10 in /superset-frontend (@dependabot[bot]) +- [#17978](https://github.com/apache/superset/pull/17978) chore(deps): bump @types/d3-time from 1.1.1 to 3.0.0 in /superset-frontend (@dependabot[bot]) +- [#19727](https://github.com/apache/superset/pull/19727) chore(deps): bump async from 2.6.3 to 2.6.4 in /docs (@dependabot[bot]) +- [#19551](https://github.com/apache/superset/pull/19551) chore(deps): bump minimist from 1.2.5 to 1.2.6 in /superset-websocket (@dependabot[bot]) +- [#19165](https://github.com/apache/superset/pull/19165) chore: simplify error messaging in database modal (@pkdotson) +- [#19790](https://github.com/apache/superset/pull/19790) chore: bump postgres from 10 to 14 (@dpgaspar) +- [#19480](https://github.com/apache/superset/pull/19480) chore: Update UPDATING.md (@john-bodley) +- [#19740](https://github.com/apache/superset/pull/19740) chore: fix grammar error (@zhaoyongjie) +- [#19703](https://github.com/apache/superset/pull/19703) chore(build): upgrade less-loader (@ktmud) +- [#19736](https://github.com/apache/superset/pull/19736) chore: Updates the Select code owners (@michael-s-molina) +- [#19715](https://github.com/apache/superset/pull/19715) docs(install): ubuntu default-libmysqlclient-dev (@cemremengu) +- [#19726](https://github.com/apache/superset/pull/19726) chore: bumping shillelagh (@AAfghahi) +- [#19699](https://github.com/apache/superset/pull/19699) chore: fix typo (@betodealmeida) +- [#19674](https://github.com/apache/superset/pull/19674) chore: upgrade Pillow (@betodealmeida) +- [#19647](https://github.com/apache/superset/pull/19647) chore(explore): Change labels "Group by"/"Series" to "Dimensions" (@kgabryje) +- [#19679](https://github.com/apache/superset/pull/19679) chore(deps): bump urijs from 1.19.8 to 1.19.11 in /superset-frontend (@dependabot[bot]) +- [#19638](https://github.com/apache/superset/pull/19638) chore(deps): bump moment from 2.29.1 to 2.29.2 in /docs (@dependabot[bot]) +- [#19617](https://github.com/apache/superset/pull/19617) chore: updated two github issue templates (@srinify) +- [#19666](https://github.com/apache/superset/pull/19666) chore: Remove TwoTone icons (@geido) +- [#19614](https://github.com/apache/superset/pull/19614) chore: Remove wrong usage of font-size in ExploreViewContainer (@geido) +- [#19593](https://github.com/apache/superset/pull/19593) chore: Update font-sizes in ReportModal (@geido) +- [#19611](https://github.com/apache/superset/pull/19611) chore: Update font-sizes in ImportModal (@geido) +- [#19615](https://github.com/apache/superset/pull/19615) chore: Update font-sizes in AlertReportModal (@geido) +- [#19620](https://github.com/apache/superset/pull/19620) chore: Update font-sizes in QueryPreviewModal (@geido) +- [#19641](https://github.com/apache/superset/pull/19641) chore: clean up dynamic translation strings (@villebro) +- [#19635](https://github.com/apache/superset/pull/19635) refactor: consistent migration tests organization (@ktmud) +- [#19634](https://github.com/apache/superset/pull/19634) test: freeze time for dashboard export test (@ktmud) +- [#19606](https://github.com/apache/superset/pull/19606) test(jinja): refactor to functional tests (@villebro) +- [#19587](https://github.com/apache/superset/pull/19587) chore: cleanup as unknown conversion (@zhaoyongjie) +- [#19562](https://github.com/apache/superset/pull/19562) refactor: Removes the CSS files from the Horizon plugin (@michael-s-molina) +- [#19563](https://github.com/apache/superset/pull/19563) refactor: Removes the CSS files from the Paired T-Test plugin (@michael-s-molina) +- [#19539](https://github.com/apache/superset/pull/19539) refactor: Removes the CSS files from the Parallel Coordinates plugin (@michael-s-molina) +- [#19521](https://github.com/apache/superset/pull/19521) refactor: Removes the CSS files from the Partition plugin (@michael-s-molina) +- [#19493](https://github.com/apache/superset/pull/19493) chore: Removes hard-coded colors from legacy-plugin-chart-sankey (@michael-s-molina) +- [#19462](https://github.com/apache/superset/pull/19462) chore: Remove FilterBox.less (@geido) +- [#19438](https://github.com/apache/superset/pull/19438) chore: Remove crud.less from Datasource (@geido) +- [#19517](https://github.com/apache/superset/pull/19517) chore: Enhance ReactChord style with theme vars (@geido) +- [#19463](https://github.com/apache/superset/pull/19463) chore: Remove TimeTable.less (@geido) +- [#19550](https://github.com/apache/superset/pull/19550) chore(deps): bump minimist from 1.2.5 to 1.2.6 in /superset-embedded-sdk (@dependabot[bot]) +- [#19566](https://github.com/apache/superset/pull/19566) chore(deps): bump node-forge from 1.2.1 to 1.3.1 in /docs (@dependabot[bot]) +- [#19552](https://github.com/apache/superset/pull/19552) chore(deps): bump minimist from 1.2.5 to 1.2.6 in /docs (@dependabot[bot]) +- [#19549](https://github.com/apache/superset/pull/19549) chore(deps): bump minimist from 1.2.5 to 1.2.6 in /superset-frontend/cypress-base (@dependabot[bot]) +- [#19559](https://github.com/apache/superset/pull/19559) docs: update the typo in the documentation (@fatosmorina) +- [#19538](https://github.com/apache/superset/pull/19538) refactor: Removes the CSS files from the Country Map plugin (@michael-s-molina) +- [#19536](https://github.com/apache/superset/pull/19536) chore: Removes hard-coded opacity and spacing from the BigNumber plugin (@michael-s-molina) +- [#19494](https://github.com/apache/superset/pull/19494) refactor: Removes the CSS files from the Sankey Loop plugin (@michael-s-molina) +- [#19492](https://github.com/apache/superset/pull/19492) chore: Remove Legacy Force Directed viz plugin (@geido) +- [#19524](https://github.com/apache/superset/pull/19524) chore: Deprecating /my_queries endpoint (@AAfghahi) +- [#19467](https://github.com/apache/superset/pull/19467) chore(Explore): Change text when saving a chart in a new dashboard (@geido) +- [#19526](https://github.com/apache/superset/pull/19526) chore(database): Creating helper make_url_safe to wrap potential errors (@craig-rueda) +- [#19415](https://github.com/apache/superset/pull/19415) chore: Remove Control.less in Explore (@geido) +- [#19413](https://github.com/apache/superset/pull/19413) chore: Remove unused less file from profile (@geido) +- [#19460](https://github.com/apache/superset/pull/19460) chore: Switch to gender neutral terms (@inclusive-coding-bot) +- [#19486](https://github.com/apache/superset/pull/19486) refactor: Removes the CSS files from the Treemap plugin (@michael-s-molina) +- [#19488](https://github.com/apache/superset/pull/19488) refactor: Removes the CSS files from the Sunburst plugin (@michael-s-molina) +- [#19490](https://github.com/apache/superset/pull/19490) chore: Add theme color to ParallelCoordinates (@geido) +- [#19442](https://github.com/apache/superset/pull/19442) chore: Remove FilterbaleTableStyles.less (@geido) +- [#19441](https://github.com/apache/superset/pull/19441) chore: Remove StyledQueryButton.less (@geido) +- [#19473](https://github.com/apache/superset/pull/19473) refactor: Removes the CSS files from the Rose plugin (@michael-s-molina) +- [#19466](https://github.com/apache/superset/pull/19466) chore: Removes hard-coded colors from legacy-plugin-chart-world-map (@michael-s-molina) +- [#19465](https://github.com/apache/superset/pull/19465) refactor: Removes the CSS files from the DeckGL plugin (@michael-s-molina) +- [#19440](https://github.com/apache/superset/pull/19440) chore: Remove index.less from showSavedQuery (@geido) +- [#19230](https://github.com/apache/superset/pull/19230) chore!: remove `ROW_LEVEL_SECURITY` feature flag (permanently enable) (@suddjian) +- [#19361](https://github.com/apache/superset/pull/19361) chore: remove deprecated config keys and endpoints code 2.0 (@pkdotson) +- [#19261](https://github.com/apache/superset/pull/19261) chore: remove old alerts and configs keys (@pkdotson) +- [#19168](https://github.com/apache/superset/pull/19168) chore: bump celery and Flask (@dpgaspar) +- [#19049](https://github.com/apache/superset/pull/19049) chore: Remove logo forced width (@geido) +- [#19274](https://github.com/apache/superset/pull/19274) chore: remove PUBLIC_ROLE_LIKE_GAMMA deprecated config key (@dpgaspar) +- [#19273](https://github.com/apache/superset/pull/19273) chore: remove deprecated celery cli (@dpgaspar) +- [#19262](https://github.com/apache/superset/pull/19262) chore: update updating with druid no sql deprecation (@eschutho) +- [#19083](https://github.com/apache/superset/pull/19083) chore!: update mutator to take kwargs (@eschutho) +- [#19231](https://github.com/apache/superset/pull/19231) chore!: remove `ENABLE_REACT_CRUD_VIEWS` feature flag (permanently enable) (@suddjian) +- [#19241](https://github.com/apache/superset/pull/19241) chore(superset 2.0): remove front-end deprecated code (@graceguo-supercat) +- [#19107](https://github.com/apache/superset/pull/19107) chore: turn on SQLLAB_BACKEND_PERSISTENCE by default (@ktmud) +- [#19142](https://github.com/apache/superset/pull/19142) chore!: turn on Versioned Export in config.py (@AAfghahi) +- [#19108](https://github.com/apache/superset/pull/19108) chore: Update UPDATING.md with info about flipping dnd feature flag (@kgabryje) +- [#19146](https://github.com/apache/superset/pull/19146) chore!: Remove remove SQLALCHEMY_DOCS_URL and SQLALCHEMY_DISPLAY_TEXT from the config from the config (@hughhhh) +- [#19017](https://github.com/apache/superset/pull/19017) chore: Deprecate Python 3.7 (@john-bodley) +- [#19113](https://github.com/apache/superset/pull/19113) chore(config): Migrating `ENABLE_JAVASCRIPT_CONTROLS` from app config to a feature flag (@rusackas) +- [#19046](https://github.com/apache/superset/pull/19046) chore(explore): Set Drag&Drop feature flags to True by default (@kgabryje) +- [#19016](https://github.com/apache/superset/pull/19016) chore: Adding PR to Updating.md (@AAfghahi) +- [#18970](https://github.com/apache/superset/pull/18970) chore: Change Dataset legacy editor flag to true (@AAfghahi) diff --git a/RELEASING/test_run_tarball.sh b/RELEASING/test_run_tarball.sh index 112adc8cffac..d4c8a9c706a0 100755 --- a/RELEASING/test_run_tarball.sh +++ b/RELEASING/test_run_tarball.sh @@ -26,7 +26,7 @@ if [ -z "${SUPERSET_SVN_DEV_PATH}" ]; then SUPERSET_SVN_DEV_PATH="$HOME/svn/superset_dev" fi -if [ ${1} == "local" ]; then +if [[ -n ${1} ]] && [[ ${1} == "local" ]]; then SUPERSET_RELEASE_RC=apache-superset-"${SUPERSET_VERSION_RC}" SUPERSET_RELEASE_RC_TARBALL="${SUPERSET_RELEASE_RC}"-source.tar.gz SUPERSET_TARBALL_PATH="${SUPERSET_SVN_DEV_PATH}"/${SUPERSET_VERSION_RC}/${SUPERSET_RELEASE_RC_TARBALL} diff --git a/RESOURCES/FEATURE_FLAGS.md b/RESOURCES/FEATURE_FLAGS.md index 26ac6bfde943..aa4d6c635565 100644 --- a/RESOURCES/FEATURE_FLAGS.md +++ b/RESOURCES/FEATURE_FLAGS.md @@ -16,49 +16,86 @@ KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> + # Superset Feature Flags + This is a list of the current Superset optional features. See config.py for default values. These features can be turned on/off by setting your preferred values in superset_config.py to True/False respectively ## In Development + These features are considered **unfinished** and should only be used on development environments. +[//]: # "PLEASE KEEP THE LIST SORTED ALPHABETICALLY" + - CLIENT_CACHE - DASHBOARD_CACHE - DASHBOARD_NATIVE_FILTERS_SET - DISABLE_DATASET_SOURCE_EDIT +- DRILL_TO_DETAIL +- ENABLE_ADVANCED_DATA_TYPES - ENABLE_EXPLORE_JSON_CSRF_PROTECTION +- ENABLE_TEMPLATE_REMOVE_FILTERS +- HORIZONTAL_FILTER_BAR - KV_STORE - PRESTO_EXPAND_DATA - REMOVE_SLICE_LEVEL_LABEL_COLORS - SHARE_QUERIES_VIA_KV_STORE - TAGGING_SYSTEM -- ENABLE_TEMPLATE_REMOVE_FILTERS ## In Testing + These features are **finished** but currently being tested. They are usable, but may still contain some bugs. +[//]: # "PLEASE KEEP THE LIST SORTED ALPHABETICALLY" + - ALERT_REPORTS: [(docs)](https://superset.apache.org/docs/installation/alerts-reports) -- DYNAMIC_PLUGINS: [(docs)](https://superset.apache.org/docs/installation/running-on-kubernetes) +- ALLOW_FULL_CSV_EXPORT +- CACHE_IMPERSONATION +- CONFIRM_DASHBOARD_DIFF +- DASHBOARD_EDIT_CHART_IN_NEW_TAB +- DASHBOARD_FILTERS_EXPERIMENTAL - DASHBOARD_NATIVE_FILTERS +- DYNAMIC_PLUGINS: [(docs)](https://superset.apache.org/docs/installation/running-on-kubernetes) +- ENABLE_FILTER_BOX_MIGRATION +- ENABLE_JAVASCRIPT_CONTROLS +- GENERIC_CHART_AXES - GLOBAL_ASYNC_QUERIES [(docs)](https://github.com/apache/superset/blob/master/CONTRIBUTING.md#async-chart-queries) +- RLS_IN_SQLLAB +- USE_ANALAGOUS_COLORS +- UX_BETA - VERSIONED_EXPORT -- ENABLE_JAVASCRIPT_CONTROLS ## Stable + These features flags are **safe for production** and have been tested. +[//]: # "PLEASE KEEP THE LIST SORTED ALPHABETICALLY" + +- ALERTS_ATTACH_REPORTS +- ALLOW_ADHOC_SUBQUERY - DASHBOARD_CROSS_FILTERS - DASHBOARD_RBAC [(docs)](https://superset.apache.org/docs/creating-charts-dashboards/first-dashboard#manage-access-to-dashboards) -- ESCAPE_MARKDOWN_HTML +- DISABLE_LEGACY_DATASOURCE_EDITOR +- DRUID_JOINS +- EMBEDDABLE_CHARTS +- EMBEDDED_SUPERSET +- ENABLE_DND_WITH_CLICK_UX +- ENABLE_EXPLORE_DRAG_AND_DROP - ENABLE_TEMPLATE_PROCESSING +- ENFORCE_DB_ENCRYPTION_UI +- ESCAPE_MARKDOWN_HTML - LISTVIEWS_DEFAULT_CARD_VIEW - SCHEDULED_QUERIES [(docs)](https://superset.apache.org/docs/installation/alerts-reports) -- SQL_VALIDATORS_BY_ENGINE [(docs)](https://superset.apache.org/docs/installation/sql-templating) - SQLLAB_BACKEND_PERSISTENCE +- SQL_VALIDATORS_BY_ENGINE [(docs)](https://superset.apache.org/docs/installation/sql-templating) - THUMBNAILS [(docs)](https://superset.apache.org/docs/installation/cache) ## Deprecated Flags + These features flags currently default to True and **will be removed in a future major release**. For this current release you can turn them off by setting your config to False, but it is advised to remove or set these flags in your local configuration to **True** so that you do not experience any unexpected changes in a future release. +[//]: # "PLEASE KEEP THE LIST SORTED ALPHABETICALLY" + - ALLOW_DASHBOARD_DOMAIN_SHARDING - DISPLAY_MARKDOWN_HTML +- FORCE_DATABASE_CONNECTIONS_SSL diff --git a/RESOURCES/INTHEWILD.md b/RESOURCES/INTHEWILD.md index 61c000bf36f7..0f1cf65c5574 100644 --- a/RESOURCES/INTHEWILD.md +++ b/RESOURCES/INTHEWILD.md @@ -40,6 +40,8 @@ Join our growing community! - [Cape Crypto](https://capecrypto.com) - [Capital Service S.A.](http://capitalservice.pl) [@pkonarzewski] - [Clark.de](http://clark.de/) +- [KarrotPay](https://www.daangnpay.com/) +- [Wise](https://wise.com) [@koszti] - [Xendit](http://xendit.co/) [@LieAlbertTriAdrian] ### Gaming @@ -48,6 +50,7 @@ Join our growing community! ### E-Commerce - [AiHello](https://www.aihello.com) [@ganeshkrishnan1] +- [Bazaar Technologies](https://www.bazaartech.com) [@umair-abro] - [Dragonpass](https://www.dragonpass.com.cn/) [@zhxjdwh] - [Fanatics](https://www.fanatics.com) [@coderfender] - [Fordeal](http://www.fordeal.com) [@Renkai] @@ -70,6 +73,8 @@ Join our growing community! - [Apollo GraphQL](https://www.apollographql.com/) [@evans] - [Astronomer](https://www.astronomer.io) [@ryw] - [Avesta Technologies](https://avestatechnologies.com/) [@TheRum] +- [Caizin](https://caizin.com/) [@tejaskatariya] +- [Careem](https://www.careem.com/) [@SamraHanifCareem] - [Cloudsmith](https://cloudsmith.io) [@alancarson] - [CnOvit](http://www.cnovit.com/) [@xieshaohu] - [Deepomatic](https://deepomatic.com/) [@Zanoellia] @@ -84,10 +89,13 @@ Join our growing community! - [Intercom](https://www.intercom.com/) [@kate-gallo] - [jampp](https://jampp.com/) - [Konfío](http://konfio.mx) [@uis-rodriguez] +- [Mainstrat](https://mainstrat.com/) - [mishmash io](https://mishmash.io/)[@mishmash-io] - [Myra Labs](http://www.myralabs.com/) [@viksit] - [Nielsen](http://www.nielsen.com/) [@amitNielsen] - [Ona](https://ona.io) [@pld] +- [Orange](https://www.orange.com) [@icsu] +- [Oslandia](https://oslandia.com) - [Peak AI](https://www.peak.ai/) [@azhar22k] - [PeopleDoc](https://www.people-doc.com) [@rodo] - [Preset, Inc.](https://preset.io) @@ -120,10 +128,12 @@ Join our growing community! ### Education - [Brilliant.org](https://brilliant.org/) +- [Platzi.com](https://platzi.com/) - [Sunbird](https://www.sunbird.org/) [@eksteporg] - [The GRAPH Network](https://thegraphnetwork.org/)[@fccoelho] - [Udemy](https://www.udemy.com/) [@sungjuly] - [VIPKID](https://www.vipkid.com.cn/) [@illpanda] +- [WikiMedia Foundation](https://wikimediafoundation.org) [@vg] ### Energy - [Airboxlab](https://foobot.io) [@antoine-galataud] @@ -138,13 +148,25 @@ Join our growing community! - [Living Goods](https://www.livinggoods.org) [@chelule] - [Maieutical Labs](https://maieuticallabs.it) [@xrmx] - [QPID Health](http://www.qpidhealth.com/) +- [REDCap Cloud](https://www.redcapcloud.com/) - [TrustMedis](https://trustmedis.com) [@famasya] - [WeSure](https://www.wesure.cn/) ### HR / Staffing +- [Swile](https://www.swile.co/) [@PaoloTerzi] - [Symmetrics](https://www.symmetrics.fyi) +### News +- [Prensa Iberica](https://www.prensaiberica.es/) [@zamar-roura] + +### Government +- [City of Ann Arbor, MI](https://www.a2gov.org/) [@sfirke] + +### Travel +- [Skyscanner](https://www.skyscanner.net/) [@cleslie, @stanhoucke] + ### Others +- [AI inside](https://inside.ai/en/) - [Dropbox](https://www.dropbox.com/) [@bkyryliuk] - [Grassroot](https://www.grassrootinstitute.org/) - [komoot](https://www.komoot.com/) [@christophlingg] diff --git a/UPDATING.md b/UPDATING.md index abfe9a915e6f..c57098cb0b74 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -34,6 +34,38 @@ assists people when migrating to a new version. ## 2.0.0 +- [22022](https://github.com/apache/superset/pull/22022): HTTP API endpoints `/superset/approve` and `/superset/request_access` have been deprecated and their HTTP methods were changed from GET to POST +- [20606](https://github.com/apache/superset/pull/20606): When user clicks on chart title or "Edit chart" button in Dashboard page, Explore opens in the same tab. Clicking while holding cmd/ctrl opens Explore in a new tab. To bring back the old behaviour (always opening Explore in a new tab), flip feature flag `DASHBOARD_EDIT_CHART_IN_NEW_TAB` to `True`. +- [20799](https://github.com/apache/superset/pull/20799): Presto and Trino engine will now display tracking URL for running queries in SQL Lab. If for some reason you don't want to show the tracking URL (for example, when your data warehouse hasn't enabled access for to Presto or Trino UI), update `TRACKING_URL_TRANSFORMER` in `config.py` to return `None`. +- [21002](https://github.com/apache/superset/pull/21002): Support Python 3.10 and bump pandas 1.4 and pyarrow 6. +- [21163](https://github.com/apache/superset/pull/21163): The time grain will be decoupled from the time filter column and the time grain control will move below the X-Axis control when `GENERIC_CHART_AXES` feature flags set to `True`. The time grain will be applied on the time column in the column-like controls(x axis, dimensions) instead of the time column in the time section. +- [21284](https://github.com/apache/superset/pull/21284): The non-functional `MAX_TABLE_NAMES` config key has been removed. +- [21794](https://github.com/apache/superset/pull/21794): Deprecates the undocumented `PRESTO_SPLIT_VIEWS_FROM_TABLES` feature flag. Now for Presto, like other engines, only physical tables are treated as tables. + +### Breaking Changes + +- [22798](https://github.com/apache/superset/pull/22798): To make the welcome page more relevant in production environments, the last tab on the welcome page has been changed from to feature all charts/dashboards the user has access to (previously only examples were shown). To keep current behavior unchanged, add the following to your `superset_config.py`: `WELCOME_PAGE_LAST_TAB = "examples"` +- [22328](https://github.com/apache/superset/pull/22328): For deployments that have enabled the "THUMBNAILS" feature flag, the function that calculates dashboard digests has been updated to consider additional properties to more accurately identify changes in the dashboard metadata. This change will invalidate all currently cached dashboard thumbnails. +- [21765](https://github.com/apache/superset/pull/21765): For deployments that have enabled the "ALERT_REPORTS" feature flag, Gamma users will no longer have read and write access to Alerts & Reports by default. To give Gamma users the ability to schedule reports from the Dashboard and Explore view like before, create an additional role with "can read on ReportSchedule" and "can write on ReportSchedule" permissions. To further give Gamma users access to the "Alerts & Reports" menu and CRUD view, add "menu access on Manage" and "menu access on Alerts & Report" permissions to the role. + +### Potential Downtime + +- [21284](https://github.com/apache/superset/pull/21284): A change which drops the unused `dbs.allow_multi_schema_metadata_fetch` column via a (potentially locking) DDL operation. + +### Other + +## 2.0.1 + +- [21895](https://github.com/apache/superset/pull/21895): Markdown components had their security increased by adhering to the same sanitization process enforced by Github. This means that some HTML elements found in markdowns are not allowed anymore due to the security risks they impose. If you're deploying Superset in a trusted environment and wish to use some of the blocked elements, then you can use the HTML_SANITIZATION_SCHEMA_EXTENSIONS configuration to extend the default sanitization schema. There's also the option to disable HTML sanitization using the HTML_SANITIZATION configuration but we do not recommend this approach because of the security risks. Given the provided configurations, we don't view the improved sanitization as a breaking change but as a security patch. + +## Breaking Changes + +## Potential Downtime + +## Other + +## 2.0.0 + - [19046](https://github.com/apache/superset/pull/19046): Enables the drag and drop interface in Explore control panel by default. Flips `ENABLE_EXPLORE_DRAG_AND_DROP` and `ENABLE_DND_WITH_CLICK_UX` feature flags to `True`. - [18936](https://github.com/apache/superset/pull/18936): Removes legacy SIP-15 interim logic/flags—specifically the `SIP_15_ENABLED`, `SIP_15_GRACE_PERIOD_END`, `SIP_15_DEFAULT_TIME_RANGE_ENDPOINTS`, and `SIP_15_TOAST_MESSAGE` flags. Time range endpoints are no longer configurable and strictly adhere to the `[start, end)` paradigm, i.e., inclusive of the start and exclusive of the end. Additionally this change removes the now obsolete `time_range_endpoints` from the form-data and resulting in the cache being busted. - [19570](https://github.com/apache/superset/pull/19570): makes [sqloxide](https://pypi.org/project/sqloxide/) optional so the SIP-68 migration can be run on aarch64. If the migration is taking too long installing sqloxide manually should improve the performance. @@ -56,6 +88,19 @@ assists people when migrating to a new version. - [19017](https://github.com/apache/superset/pull/19017): Removes Python 3.7 support. - [18970](https://github.com/apache/superset/pull/18970): The `DISABLE_LEGACY_DATASOURCE_EDITOR` feature flag is now `True` by default which disables the legacy datasource editor from being shown in the client. +## 1.5.3 + +### Other + +- [22022](https://github.com/apache/superset/pull/22022): HTTP API endpoints `/superset/approve` and `/superset/request_access` have been deprecated and their HTTP methods were changed from GET to POST +- [21895](https://github.com/apache/superset/pull/21895): Markdown components had their security increased by adhering to the same sanitization process enforced by Github. This means that some HTML elements found in markdowns are not allowed anymore due to the security risks they impose. If you're deploying Superset in a trusted environment and wish to use some of the blocked elements, then you can use the HTML_SANITIZATION_SCHEMA_EXTENSIONS configuration to extend the default sanitization schema. There's also the option to disable HTML sanitization using the HTML_SANITIZATION configuration but we do not recommend this approach because of the security risks. Given the provided configurations, we don't view the improved sanitization as a breaking change but as a security patch. + +## 1.5.2 + +### Other + +- [19570](https://github.com/apache/superset/pull/19570): makes [sqloxide](https://pypi.org/project/sqloxide/) optional so the SIP-68 migration can be run on aarch64. If the migration is taking too long installing sqloxide manually should improve the performance. + ## 1.5.0 ### Breaking Changes diff --git a/cccs-build/superset/Dockerfile b/cccs-build/superset/Dockerfile index ff5572bbaded..129d127688c4 100644 --- a/cccs-build/superset/Dockerfile +++ b/cccs-build/superset/Dockerfile @@ -1,7 +1,7 @@ # Vault CA container import -ARG VAULT_CA_CONTAINER=uchimera.azurecr.io/cccs/hogwarts/vault-ca:master_2921_22315d60 +ARG VAULT_CA_CONTAINER=uchimera.azurecr.io/cccs/hogwarts/vault-ca:master_11376_a25c34e1 FROM $VAULT_CA_CONTAINER AS vault_ca -FROM uchimera.azurecr.io/cccs/superset-base:feature_CLDN-1932-update-cccs-main-to-2.0.1-add-cccs-2.0_20230214125009_b6247 +FROM uchimera.azurecr.io/cccs/superset-base:feature_update-cccs-main-to-2.1.0-add-cccs-2.0_20230425191536_b6649 USER root diff --git a/cccs-build/superset/requirements.txt b/cccs-build/superset/requirements.txt index 16c4b3b74ebc..c00ba75cd333 100644 --- a/cccs-build/superset/requirements.txt +++ b/cccs-build/superset/requirements.txt @@ -9,4 +9,4 @@ trino==0.318.0 mysql-connector-python==8.0.26 elasticsearch-dbapi==0.2.4 cachetools~=5.0.0 -typing-extensions<4,>=3.10 +typing-extensions>=4, <5 diff --git a/docker-compose-non-dev.yml b/docker-compose-non-dev.yml index 934349667709..e72222655184 100644 --- a/docker-compose-non-dev.yml +++ b/docker-compose-non-dev.yml @@ -26,7 +26,7 @@ x-superset-volumes: &superset-volumes version: "3.7" services: redis: - image: redis:latest + image: redis:7 container_name: superset_cache restart: unless-stopped volumes: @@ -34,7 +34,7 @@ services: db: env_file: docker/.env-non-dev - image: postgres:10 + image: postgres:14 container_name: superset_db restart: unless-stopped volumes: @@ -60,6 +60,8 @@ services: depends_on: *superset-depends-on user: "root" volumes: *superset-volumes + healthcheck: + disable: true superset-worker: image: *superset-image @@ -70,6 +72,8 @@ services: depends_on: *superset-depends-on user: "root" volumes: *superset-volumes + healthcheck: + test: ["CMD-SHELL", "celery inspect ping -A superset.tasks.celery_app:app -d celery@$$HOSTNAME"] superset-worker-beat: image: *superset-image @@ -80,6 +84,8 @@ services: depends_on: *superset-depends-on user: "root" volumes: *superset-volumes + healthcheck: + disable: true volumes: superset_home: diff --git a/docker-compose.yml b/docker-compose.yml index 2c814363e784..89aecfd9e0e4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,7 +30,7 @@ x-superset-volumes: &superset-volumes version: "3.7" services: redis: - image: redis:latest + image: redis:7 container_name: superset_cache restart: unless-stopped ports: @@ -100,6 +100,8 @@ services: volumes: *superset-volumes environment: CYPRESS_CONFIG: "${CYPRESS_CONFIG}" + healthcheck: + disable: true superset-node: image: node:16 @@ -118,6 +120,8 @@ services: depends_on: *superset-depends-on user: *superset-user volumes: *superset-volumes + healthcheck: + test: ["CMD-SHELL", "celery inspect ping -A superset.tasks.celery_app:app -d celery@$$HOSTNAME"] # Bump memory limit if processing selenium / thumbnails on superset-worker # mem_limit: 2038m # mem_reservation: 128M @@ -131,6 +135,8 @@ services: depends_on: *superset-depends-on user: *superset-user volumes: *superset-volumes + healthcheck: + disable: true superset-tests-worker: image: *superset-image @@ -147,6 +153,8 @@ services: depends_on: *superset-depends-on user: *superset-user volumes: *superset-volumes + healthcheck: + test: ["CMD-SHELL", "celery inspect ping -A superset.tasks.celery_app:app -d celery@$$HOSTNAME"] volumes: superset_home: diff --git a/docker/.env b/docker/.env index b31d631f2f70..8fa6f4533355 100644 --- a/docker/.env +++ b/docker/.env @@ -23,7 +23,7 @@ DATABASE_PASSWORD=superset DATABASE_USER=superset # database engine specific environment variables -# change the below if you prefers another database engine +# change the below if you prefer another database engine DATABASE_PORT=5432 DATABASE_DIALECT=postgresql POSTGRES_DB=superset @@ -47,3 +47,4 @@ SUPERSET_ENV=development SUPERSET_LOAD_EXAMPLES=yes CYPRESS_CONFIG=false SUPERSET_PORT=8088 +MAPBOX_API_KEY='' diff --git a/docker/.env-non-dev b/docker/.env-non-dev index 1cb5d30bdbbb..0ae4c1c7932b 100644 --- a/docker/.env-non-dev +++ b/docker/.env-non-dev @@ -23,7 +23,7 @@ DATABASE_PASSWORD=superset DATABASE_USER=superset # database engine specific environment variables -# change the below if you prefers another database engine +# change the below if you prefer another database engine DATABASE_PORT=5432 DATABASE_DIALECT=postgresql POSTGRES_DB=superset @@ -44,3 +44,4 @@ SUPERSET_ENV=production SUPERSET_LOAD_EXAMPLES=yes CYPRESS_CONFIG=false SUPERSET_PORT=8088 +MAPBOX_API_KEY='' diff --git a/docker/README.md b/docker/README.md index c867121daece..380b96a5074b 100644 --- a/docker/README.md +++ b/docker/README.md @@ -23,8 +23,8 @@ Docker is an easy way to get started with Superset. ## Prerequisites -1. Docker! [link](https://www.docker.com/get-started) -2. Docker-compose [link](https://docs.docker.com/compose/install/) +1. [Docker](https://www.docker.com/get-started) +2. [Docker Compose](https://docs.docker.com/compose/install/) ## Configuration diff --git a/docker/docker-bootstrap.sh b/docker/docker-bootstrap.sh index 150f351e4b0d..0784a0fdf2e5 100755 --- a/docker/docker-bootstrap.sh +++ b/docker/docker-bootstrap.sh @@ -37,7 +37,7 @@ fi if [[ "${1}" == "worker" ]]; then echo "Starting Celery worker..." - celery --app=superset.tasks.celery_app:app worker -Ofair -l INFO + celery --app=superset.tasks.celery_app:app worker -O fair -l INFO elif [[ "${1}" == "beat" ]]; then echo "Starting Celery beat..." celery --app=superset.tasks.celery_app:app beat --pidfile /tmp/celerybeat.pid -l INFO -s "${SUPERSET_HOME}"/celerybeat-schedule diff --git a/docker/docker-frontend.sh b/docker/docker-frontend.sh index 4c0d01e07935..a1ad94470ce5 100755 --- a/docker/docker-frontend.sh +++ b/docker/docker-frontend.sh @@ -17,8 +17,11 @@ # set -e +# Packages needed for puppeteer: +apt update +apt install -y chromium + cd /app/superset-frontend -npm install -g npm@7 npm install -f --no-optional --global webpack webpack-cli npm install -f --no-optional diff --git a/docker/pythonpath_dev/superset_config.py b/docker/pythonpath_dev/superset_config.py index 84c1dc58ab50..7bfe2012c27e 100644 --- a/docker/pythonpath_dev/superset_config.py +++ b/docker/pythonpath_dev/superset_config.py @@ -81,13 +81,12 @@ def get_env_variable(var_name: str, default: Optional[str] = None) -> str: class CeleryConfig(object): - BROKER_URL = f"redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_CELERY_DB}" - CELERY_IMPORTS = ("superset.sql_lab",) - CELERY_RESULT_BACKEND = f"redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_RESULTS_DB}" - CELERYD_LOG_LEVEL = "DEBUG" - CELERYD_PREFETCH_MULTIPLIER = 1 - CELERY_ACKS_LATE = False - CELERYBEAT_SCHEDULE = { + broker_url = f"redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_CELERY_DB}" + imports = ("superset.sql_lab",) + result_backend = f"redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_RESULTS_DB}" + worker_prefetch_multiplier = 1 + task_acks_late = False + beat_schedule = { "reports.scheduler": { "task": "reports.scheduler", "schedule": crontab(minute="*", hour="*"), diff --git a/docs/README.md b/docs/README.md index f4a122ba2f5b..1427f21640a2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,36 +17,4 @@ specific language governing permissions and limitations under the License. --> -# Website - -This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. - -### Installation - -``` -$ yarn install -``` - -### Local Development - -``` -$ yarn start -``` - -This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. - -### Build - -``` -$ yarn build -``` - -This command generates static content into the `build` directory and can be served using any static contents hosting service. - -### Deployment - -``` -$ GIT_USER=<Your GitHub username> USE_SSH=true yarn deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. +This is the public documentation site for Superset, built using [Docusaurus 2](https://docusaurus.io/). See [CONTRIBUTING.md](../CONTRIBUTING.md#documentation) for documentation on contributing to documentation. diff --git a/docs/docs/contributing/contributing-page.mdx b/docs/docs/contributing/contributing-page.mdx index 6e205bf0bbf8..1619d7fed7e6 100644 --- a/docs/docs/contributing/contributing-page.mdx +++ b/docs/docs/contributing/contributing-page.mdx @@ -12,7 +12,7 @@ The core contributors (or committers) to Superset communicate primarily in the f which can be joined by anyone): - [Mailing list](https://lists.apache.org/list.html?dev@superset.apache.org) -- [Apache Superset Slack community](https://join.slack.com/t/apache-superset/shared_invite/zt-16jvzmoi8-sI7jKWp~xc2zYRe~NqiY9Q) +- [Apache Superset Slack community](http://bit.ly/join-superset-slack) - [GitHub issues and PR's](https://github.com/apache/superset/issues) More references: diff --git a/docs/docs/contributing/testing-locally.mdx b/docs/docs/contributing/testing-locally.mdx index 22a628b66150..ae08b1878a13 100644 --- a/docs/docs/contributing/testing-locally.mdx +++ b/docs/docs/contributing/testing-locally.mdx @@ -54,6 +54,20 @@ You can run unit tests found in './tests/unit_tests' for example with pytest. It pytest ./link_to_test.py ``` +#### Testing with local Presto connections + +If you happen to change db engine spec for Presto/Trino, you can run a local Presto cluster with Docker: + +```bash +docker run -p 15433:15433 starburstdata/presto:350-e.6 +``` + +Then update `SUPERSET__SQLALCHEMY_EXAMPLES_URI` to point to local Presto cluster: + +```bash +export SUPERSET__SQLALCHEMY_EXAMPLES_URI=presto://localhost:15433/memory/default +``` + ### Frontend Testing We use [Jest](https://jestjs.io/) and [Enzyme](https://airbnb.io/enzyme/) to test TypeScript/JavaScript. Tests can be run with: diff --git a/docs/docs/contributing/translations.mdx b/docs/docs/contributing/translations.mdx index 52200aedff04..13572f801e2d 100644 --- a/docs/docs/contributing/translations.mdx +++ b/docs/docs/contributing/translations.mdx @@ -7,10 +7,10 @@ version: 1 ## Translating -We use [Flask-Babel](https://flask-babel.tkte.ch/) to translate Superset. +We use [Flask-Babel](https://python-babel.github.io/flask-babel/) to translate Superset. In Python files, we use the following -[translation functions](https://flask-babel.tkte.ch/#using-translations) from -`Flask-Babel`: +[translation functions](https://python-babel.github.io/flask-babel/#using-translations) +from `Flask-Babel`: - `gettext` and `lazy_gettext` (usually aliased to `_`): for translating singular strings. - `ngettext`: for translating strings that might become plural. diff --git a/docs/docs/contributing/types-of-contributions.mdx b/docs/docs/contributing/types-of-contributions.mdx index a9fa907f553d..cb6a5a5d863d 100644 --- a/docs/docs/contributing/types-of-contributions.mdx +++ b/docs/docs/contributing/types-of-contributions.mdx @@ -19,15 +19,17 @@ The best way to report a bug is to file an issue on GitHub. Please include: When posting Python stack traces, please quote them using [Markdown blocks](https://help.github.com/articles/creating-and-highlighting-code-blocks/). +_Please note that feature requests opened as Github Issues will be moved to Discussions._ + ### Submit Ideas or Feature Requests -The best way is to file an issue on GitHub: +The best way is to start an ["Ideas" Discussion thread](https://github.com/apache/superset/discussions/categories/ideas) on GitHub: - Explain in detail how it would work. - Keep the scope as narrow as possible, to make it easier to implement. -- Remember that this is a volunteer-driven project, and that contributions are welcome :) +- Remember that this is a volunteer-driven project, and that your contributions are as welcome as anyone's :) -For large features or major changes to codebase, please create **Superset Improvement Proposal (SIP)**. See template from [SIP-0](https://github.com/apache/superset/issues/5602) +To propose large features or major changes to codebase, and help usher in those changes, please create a **Superset Improvement Proposal (SIP)**. See template from [SIP-0](https://github.com/apache/superset/issues/5602) ### Fix Bugs diff --git a/docs/docs/creating-charts-dashboards/creating-your-first-dashboard.mdx b/docs/docs/creating-charts-dashboards/creating-your-first-dashboard.mdx index ecabf896f8e4..48792e319979 100644 --- a/docs/docs/creating-charts-dashboards/creating-your-first-dashboard.mdx +++ b/docs/docs/creating-charts-dashboards/creating-your-first-dashboard.mdx @@ -183,7 +183,7 @@ Access to dashboards is managed via owners (users that have edit permissions to Non-owner users access can be managed two different ways: 1. Dataset permissions - if you add to the relevant role permissions to datasets it automatically grants implicit access to all dashboards that uses those permitted datasets -2. Dashboard roles - if you enable **DASHBOARD_RBAC** feature flag then you be able to manage which roles can access the dashboard +2. Dashboard roles - if you enable **DASHBOARD_RBAC** [feature flag](https://superset.apache.org/docs/installation/configuring-superset#feature-flags) then you be able to manage which roles can access the dashboard - Having dashboard access implicitly grants read access to the associated datasets, therefore all charts will load their data even if feature flag is turned on and no roles assigned to roles the access will fallback to **Dataset permissions** diff --git a/docs/docs/databases/athena.mdx b/docs/docs/databases/athena.mdx index feabad302d73..55282d68adb9 100644 --- a/docs/docs/databases/athena.mdx +++ b/docs/docs/databases/athena.mdx @@ -32,3 +32,11 @@ following connection string: ``` awsathena+rest://{aws_access_key_id}:{aws_secret_access_key}@athena.{region_name}.amazonaws.com/{schema_name}?s3_staging_dir={s3_staging_dir}&... ``` + +The PyAthena library also allows to assume a specific IAM role, by [importing the datasource from YAML](https://superset.apache.org/docs/miscellaneous/importing-exporting-datasources/#importing-datasources-from-yaml) and passing extra parameters: +``` +databases: + - database_name: awsathena + sqlalchemy_uri: awsathena+rest://athena.{region_name}.amazonaws.com/{schema_name}?s3_staging_dir={s3_staging_dir}&... + extra: "{\"engine_params\": {\"connect_args\": {\"role_arn\": \"{{ ROLE_ARN }}\" }}}" +``` diff --git a/docs/docs/databases/bigquery.mdx b/docs/docs/databases/bigquery.mdx index 6d3ba0750e65..7ea993ae5d4e 100644 --- a/docs/docs/databases/bigquery.mdx +++ b/docs/docs/databases/bigquery.mdx @@ -8,7 +8,7 @@ version: 1 ## Google BigQuery The recommended connector library for BigQuery is -[pybigquery](https://github.com/mxmzdlv/pybigquery). +[sqlalchemy-bigquery](https://github.com/googleapis/python-bigquery-sqlalchemy). ### Install BigQuery Driver @@ -16,7 +16,7 @@ Follow the steps [here](/docs/databases/docker-add-drivers) about how to install new database drivers when setting up Superset locally via docker-compose. ``` -echo "pybigquery" >> ./docker/requirements-local.txt +echo "sqlalchemy-bigquery" >> ./docker/requirements-local.txt ``` ### Connecting to BigQuery diff --git a/docs/docs/databases/clickhouse.mdx b/docs/docs/databases/clickhouse.mdx index e717b60bf0b2..424e50da9352 100644 --- a/docs/docs/databases/clickhouse.mdx +++ b/docs/docs/databases/clickhouse.mdx @@ -7,38 +7,36 @@ version: 1 ## ClickHouse -To use ClickHouse with Superset, you will need to add the following Python libraries: +To use ClickHouse with Superset, you will need to add the following Python library: ``` -clickhouse-driver==0.2.0 -clickhouse-sqlalchemy==0.1.6 +clickhouse-connect>=0.4.1 ``` If running Superset using Docker Compose, add the following to your `./docker/requirements-local.txt` file: ``` -clickhouse-driver>=0.2.0 -clickhouse-sqlalchemy>=0.1.6 +clickhouse-connect>=0.4.1 ``` The recommended connector library for ClickHouse is -[sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse). +[clickhouse-connect](https://github.com/ClickHouse/clickhouse-connect). The expected connection string is formatted as follows: ``` -clickhouse+native://<user>:<password>@<host>:<port>/<database>[?options…]clickhouse://{username}:{password}@{hostname}:{port}/{database} +clickhousedb://<user>:<password>@<host>:<port>/<database>[?options…]clickhouse://{username}:{password}@{hostname}:{port}/{database} ``` Here's a concrete example of a real connection string: ``` -clickhouse+native://demo:demo@github.demo.trial.altinity.cloud/default?secure=true +clickhousedb://demo:demo@github.demo.trial.altinity.cloud/default?secure=true ``` -If you're using Clickhouse locally on your computer, you can get away with using a native protocol URL that +If you're using Clickhouse locally on your computer, you can get away with using a http protocol URL that uses the default user without a password (and doesn't encrypt the connection): ``` -clickhouse+native://localhost/default +clickhousedb://localhost/default ``` diff --git a/docs/docs/databases/databricks.mdx b/docs/docs/databases/databricks.mdx index 4070960ce2af..e9bbd4b68521 100644 --- a/docs/docs/databases/databricks.mdx +++ b/docs/docs/databases/databricks.mdx @@ -33,13 +33,10 @@ You also need to add the following configuration to "Other" -> "Engine Parameter ```json { - "connect_args": {"http_path": "sql/protocolv1/o/****"}, - "http_headers": [["User-Agent", "Apache Superset"]] + "connect_args": {"http_path": "sql/protocolv1/o/****"} } ``` -The `User-Agent` header is optional, but helps Databricks identify traffic from Superset. If you need to use a different header please reach out to Databricks and let them know. - ## Older driver Originally Superset used `databricks-dbapi` to connect to Databricks. You might want to try it if you're having problems with the official Databricks connector: diff --git a/docs/docs/databases/docker-add-drivers.mdx b/docs/docs/databases/docker-add-drivers.mdx index 725a6e671c5b..cfb504b5e474 100644 --- a/docs/docs/databases/docker-add-drivers.mdx +++ b/docs/docs/databases/docker-add-drivers.mdx @@ -53,7 +53,7 @@ Rebuild your local image with the new driver baked in: docker-compose build --force-rm ``` -After the rebuild of the Docker images is complete (which make take a few minutes) you can relaunch using the following command: +After the rebuild of the Docker images is complete (which may take a few minutes) you can relaunch using the following command: ``` docker-compose up diff --git a/docs/docs/databases/druid.mdx b/docs/docs/databases/druid.mdx index 6641898aa497..95e9bbc15a8a 100644 --- a/docs/docs/databases/druid.mdx +++ b/docs/docs/databases/druid.mdx @@ -18,6 +18,12 @@ The connection string looks like: ``` druid://<User>:<password>@<Host>:<Port-default-9088>/druid/v2/sql ``` +Here's a breakdown of the key components of this connection string: + +User: username portion of the credentials needed to connect to your database +Password: password portion of the credentials needed to connect to your database +Host: IP address (or URL) of the host machine that's running your database +Port: specific port that's exposed on your host machine where your database is running ### Customizing Druid Connection diff --git a/docs/docs/databases/dynamodb.mdx b/docs/docs/databases/dynamodb.mdx new file mode 100644 index 000000000000..4cb9e1e4f807 --- /dev/null +++ b/docs/docs/databases/dynamodb.mdx @@ -0,0 +1,20 @@ +--- +title: Amazon DynamoDB +hide_title: true +sidebar_position: 4 +version: 1 +--- + +## AWS DynamoDB + +### PyDynamoDB + +[PyDynamoDB](https://pypi.org/project/PyDynamoDB/) is a Python DB API 2.0 (PEP 249) client for Amazon DynamoDB. + +The connection string for Amazon DynamoDB is as follows: + +``` +dynamodb://{aws_access_key_id}:{aws_secret_access_key}@dynamodb.{region_name}.amazonaws.com:443?connector=superset +``` + +To get more documentation, please visit: [PyDynamoDB WIKI](https://github.com/passren/PyDynamoDB/wiki/5.-Superset). diff --git a/docs/docs/databases/elasticsearch.mdx b/docs/docs/databases/elasticsearch.mdx index 70b7f8f685e2..6fb922815ca0 100644 --- a/docs/docs/databases/elasticsearch.mdx +++ b/docs/docs/databases/elasticsearch.mdx @@ -66,3 +66,11 @@ you need to use the `CAST` function,but this function does not support our `time After elasticsearch7.8, you can use the `DATETIME_PARSE` function to solve this problem. The DATETIME_PARSE function is to support our `time_zone` setting, and here you need to fill in your elasticsearch version number in the Other > VERSION setting. the superset will use the `DATETIME_PARSE` function for conversion. + +**Disable SSL Verification** + +To disable SSL verification, add the following to the **SQLALCHEMY URI** field: + +``` +elasticsearch+https://{user}:{password}@{host}:9200/?verify_certs=False +``` diff --git a/docs/docs/databases/installing-database-drivers.mdx b/docs/docs/databases/installing-database-drivers.mdx index cb404fb480a4..ee1b385336db 100644 --- a/docs/docs/databases/installing-database-drivers.mdx +++ b/docs/docs/databases/installing-database-drivers.mdx @@ -23,6 +23,7 @@ A list of some of the recommended packages. | Database | PyPI package | Connection String | | --------------------------------------------------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | | [Amazon Athena](/docs/databases/athena) | `pip install "PyAthenaJDBC>1.0.9` , `pip install "PyAthena>1.2.0` | `awsathena+rest://{aws_access_key_id}:{aws_secret_access_key}@athena.{region_name}.amazonaws.com/{ ` | +| [Amazon DynamoDB](/docs/databases/dynamodb) | `pip install "PyDynamoDB>=0.4.2` | `dynamodb://{access_key_id}:{secret_access_key}@dynamodb.{region_name}.amazonaws.com?connector=superset` | | [Amazon Redshift](/docs/databases/redshift) | `pip install sqlalchemy-redshift` | ` redshift+psycopg2://<userName>:<DBPassword>@<AWS End Point>:5439/<Database Name>` | | [Apache Drill](/docs/databases/drill) | `pip install sqlalchemy-drill` | `drill+sadrill:// For JDBC drill+jdbc://` | | [Apache Druid](/docs/databases/druid) | `pip install pydruid` | `druid://<User>:<password>@<Host>:<Port-default-9088>/druid/v2/sql` | @@ -34,8 +35,8 @@ A list of some of the recommended packages. | [Apache Spark SQL](/docs/databases/spark-sql) | `pip install pyhive` | `hive://hive@{hostname}:{port}/{database}` | | [Ascend.io](/docs/databases/ascend) | `pip install impyla` | `ascend://{username}:{password}@{hostname}:{port}/{database}?auth_mechanism=PLAIN;use_ssl=true` | | [Azure MS SQL](/docs/databases/sql-server) | `pip install pymssql` | `mssql+pymssql://UserName@presetSQL:TestPassword@presetSQL.database.windows.net:1433/TestSchema` | -| [Big Query](/docs/databases/bigquery) | `pip install pybigquery` | `bigquery://{project_id}` | -| [ClickHouse](/docs/databases/clickhouse) | `pip install clickhouse-driver==0.2.0 && pip install clickhouse-sqlalchemy==0.1.6` | `clickhouse+native://{username}:{password}@{hostname}:{port}/{database}` | +| [Big Query](/docs/databases/bigquery) | `pip install sqlalchemy-bigquery` | `bigquery://{project_id}` | +| [ClickHouse](/docs/databases/clickhouse) | `pip install clickhouse-connect` | `clickhousedb://{username}:{password}@{hostname}:{port}/{database}` | | [CockroachDB](/docs/databases/cockroachdb) | `pip install cockroachdb` | `cockroachdb://root@{hostname}:{port}/{database}?sslmode=disable` | | [Dremio](/docs/databases/dremio) | `pip install sqlalchemy_dremio` | `dremio://user:pwd@host:31010/` | | [Elasticsearch](/docs/databases/elasticsearch) | `pip install elasticsearch-dbapi` | `elasticsearch+http://{user}:{password}@{host}:9200/` | @@ -48,16 +49,16 @@ A list of some of the recommended packages. | [MySQL](/docs/databases/mysql) | `pip install mysqlclient` | `mysql://<UserName>:<DBPassword>@<Database Host>/<Database Name>` | | [Oracle](/docs/databases/oracle) | `pip install cx_Oracle` | `oracle://` | | [PostgreSQL](/docs/databases/postgres) | `pip install psycopg2` | `postgresql://<UserName>:<DBPassword>@<Database Host>/<Database Name>` | -| [Trino](/docs/databases/trino) | `pip install sqlalchemy-trino` | `trino://{username}:{password}@{hostname}:{port}/{catalog}` | +| [Trino](/docs/databases/trino) | `pip install trino` | `trino://{username}:{password}@{hostname}:{port}/{catalog}` | | [Presto](/docs/databases/presto) | `pip install pyhive` | `presto://` | | [SAP Hana](/docs/databases/hana) | `pip install hdbcli sqlalchemy-hana or pip install apache-superset[hana]` | `hana://{username}:{password}@{host}:{port}` | | [Snowflake](/docs/databases/snowflake) | `pip install snowflake-sqlalchemy` | `snowflake://{user}:{password}@{account}.{region}/{database}?role={role}&warehouse={warehouse}` | | SQLite | No additional library needed | `sqlite://` | -| [SQL Server](/docs/databases/sql-server) | `pip install pymssql` | `mssql://` | -| [Teradata](/docs/databases/teradata) | `pip install teradatasqlalchemy ` | `teradata://{user}:{password}@{host}` | +| [SQL Server](/docs/databases/sql-server) | `pip install pymssql` | `mssql+pymssql://` | +| [Teradata](/docs/databases/teradata) | `pip install teradatasqlalchemy` | `teradatasql://{user}:{password}@{host}` | +| [TimescaleDB](/docs/databases/timescaledb) | `pip install psycopg2` | `postgresql://<UserName>:<DBPassword>@<Database Host>:<Port>/<Database Name>` | | [Vertica](/docs/databases/vertica) | `pip install sqlalchemy-vertica-python` | `vertica+vertica_python://<UserName>:<DBPassword>@<Database Host>/<Database Name>` | -| [YugabyteDB](/docs/databases/yugabytedb) | `pip install psycopg2` | `postgresql://<UserName>:<DBPassword>@<Database Host>/<Database Name>` | - +| [YugabyteDB](/docs/databases/yugabytedb) | `pip install psycopg2` | `postgresql://<UserName>:<DBPassword>@<Database Host>/<Database Name>` | --- Note that many other databases are supported, the main criteria being the existence of a functional diff --git a/docs/docs/databases/kusto.mdx b/docs/docs/databases/kusto.mdx new file mode 100644 index 000000000000..3efe4ac8f5be --- /dev/null +++ b/docs/docs/databases/kusto.mdx @@ -0,0 +1,26 @@ +--- +name: Kusto +hide_title: true +sidebar_position: 41 +version: 2 +--- + +## Kusto + +The recommended connector library for Kusto is +[sqlalchemy-kusto](https://pypi.org/project/sqlalchemy-kusto/2.0.0/)>=2.0.0. + +The connection string for Kusto (sql dialect) looks like this: + +``` +kustosql+https://{cluster_url}/{database}?azure_ad_client_id={azure_ad_client_id}&azure_ad_client_secret={azure_ad_client_secret}&azure_ad_tenant_id={azure_ad_tenant_id}&msi=False +``` + +The connection string for Kusto (kql dialect) looks like this: + +``` +kustokql+https://{cluster_url}/{database}?azure_ad_client_id={azure_ad_client_id}&azure_ad_client_secret={azure_ad_client_secret}&azure_ad_tenant_id={azure_ad_tenant_id}&msi=False +``` + +Make sure the user has privileges to access and use all required +databases/tables/views. diff --git a/docs/docs/databases/risingwave.mdx b/docs/docs/databases/risingwave.mdx new file mode 100644 index 000000000000..ddd22d739845 --- /dev/null +++ b/docs/docs/databases/risingwave.mdx @@ -0,0 +1,17 @@ +--- +title: RisingWave +hide_title: true +sidebar_position: 16 +version: 1 +--- + +## RisingWave + +The recommended connector library for RisingWave is +[sqlalchemy-risingwave](https://github.com/risingwavelabs/sqlalchemy-risingwave). + +The expected connection string is formatted as follows: + +``` +risingwave://root@{hostname}:{port}/{database}?sslmode=disable +``` diff --git a/docs/docs/databases/snowflake.mdx b/docs/docs/databases/snowflake.mdx index f0fc1a4a58e5..d128e4301688 100644 --- a/docs/docs/databases/snowflake.mdx +++ b/docs/docs/databases/snowflake.mdx @@ -8,7 +8,7 @@ version: 1 ## Snowflake The recommended connector library for Snowflake is -[snowflake-sqlalchemy](https://pypi.org/project/snowflake-sqlalchemy/1.2.4/)<=1.2.4. (This version is required until Superset migrates to sqlalchemy>=1.4.0) +[snowflake-sqlalchemy](https://pypi.org/project/snowflake-sqlalchemy/). The connection string for Snowflake looks like this: @@ -29,3 +29,31 @@ user/role rights during engine creation by default. However, when pressing the button in the Create or Edit Database dialog, user/role credentials are validated by passing “validate_default_parameters”: True to the connect() method during engine creation. If the user/role is not authorized to access the database, an error is recorded in the Superset logs. + +And if you want connect Snowflake with [Key Pair Authentication](https://docs.snowflake.com/en/user-guide/key-pair-auth.html#step-6-configure-the-snowflake-client-to-use-key-pair-authentication). +Plase make sure you have the key pair and the public key is registered in Snowflake. +To connect Snowflake with Key Pair Authentication, you need to add the following parameters to "SECURE EXTRA" field. + +***Please note that you need to merge multi-line private key content to one line and insert `\n` between each line*** + +``` +{ + "auth_method": "keypair", + "auth_params": { + "privatekey_body": "-----BEGIN ENCRYPTED PRIVATE KEY-----\n...\n...\n-----END ENCRYPTED PRIVATE KEY-----", + "privatekey_pass":"Your Private Key Password" + } + } +``` + +If your private key is stored on server, you can replace "privatekey_body" with “privatekey_path” in parameter. + +``` +{ + "auth_method": "keypair", + "auth_params": { + "privatekey_path":"Your Private Key Path", + "privatekey_pass":"Your Private Key Password" + } +} +``` diff --git a/docs/docs/databases/sql-server.mdx b/docs/docs/databases/sql-server.mdx index f9ceb4c751c7..8b7c833c8d6b 100644 --- a/docs/docs/databases/sql-server.mdx +++ b/docs/docs/databases/sql-server.mdx @@ -14,3 +14,10 @@ The connection string for SQL Server looks like this: ``` mssql+pymssql://<Username>:<Password>@<Host>:<Port-default:1433>/<Database Name>/?Encrypt=yes ``` + +It is also possible to connect using [pyodbc](https://pypi.org/project/pyodbc) with the parameter [odbc_connect](https://docs.sqlalchemy.org/en/14/dialects/mssql.html#pass-through-exact-pyodbc-string) + +The connection string for SQL Server looks like this: +``` +mssql+pyodbc:///?odbc_connect=Driver%3D%7BODBC+Driver+17+for+SQL+Server%7D%3BServer%3Dtcp%3A%3Cmy_server%3E%2C1433%3BDatabase%3Dmy_datasbase%3BUid%3Dmy_user_name%3BPwd%3Dmy_password%3BEncrypt%3Dyes%3BConnection+Timeout%3D30 +``` diff --git a/docs/docs/databases/teradata.mdx b/docs/docs/databases/teradata.mdx index 2f765a2146cf..8b7a91c9146e 100644 --- a/docs/docs/databases/teradata.mdx +++ b/docs/docs/databases/teradata.mdx @@ -13,7 +13,7 @@ The recommended connector library is The connection string for Teradata looks like this: ``` -teradata://{user}:{password}@{host} +teradatasql://{user}:{password}@{host} ``` ## ODBC Driver diff --git a/docs/docs/databases/timescaledb.mdx b/docs/docs/databases/timescaledb.mdx new file mode 100644 index 000000000000..2ab93e68b43f --- /dev/null +++ b/docs/docs/databases/timescaledb.mdx @@ -0,0 +1,38 @@ +--- +title: TimescaleDB +hide_title: true +sidebar_position: 31 +version: 1 +--- + +## TimescaleDB +[TimescaleDB](https://www.timescale.com) is the open-source relational database for time-series and analytics to build powerful data-intensive applications. +TimescaleDB is a PostgreSQL extension, and you can use the standard PostgreSQL connector library, [psycopg2](https://www.psycopg.org/docs/), to connect to the database. + +If you're using docker-compose, psycopg2 comes out of the box with Superset. + +TimescaleDB sample connection parameters: + +- **User Name**: User +- **Password**: Password +- **Database Host**: + - For Localhost: localhost or 127.0.0.1 + - For On Prem: IP address or Host name + - For [Timescale Cloud](https://console.cloud.timescale.com) service: Host name + - For [Managed Service for TimescaleDB](https://portal.managed.timescale.com) service: Host name +- **Database Name**: Database Name +- **Port**: default 5432 or Port number of the service + +The connection string looks like: + +``` +postgresql://{username}:{password}@{host}:{port}/{database name} +``` + +You can require SSL by adding `?sslmode=require` at the end (e.g. in case you use [Timescale Cloud](https://www.timescale.com/cloud)): + +``` +postgresql://{username}:{password}@{host}:{port}/{database name}?sslmode=require +``` + +[Learn more about TimescaleDB!](https://docs.timescale.com/) diff --git a/docs/docs/databases/trino.mdx b/docs/docs/databases/trino.mdx index 50ccf1f27123..4d6bfcf34320 100644 --- a/docs/docs/databases/trino.mdx +++ b/docs/docs/databases/trino.mdx @@ -56,7 +56,21 @@ In `Secure Extra` field, config as following example: All fields in `auth_params` are passed directly to the [`KerberosAuthentication`](https://github.com/trinodb/trino-python-client/blob/0.306.0/trino/auth.py#L40) class. -#### 3. JWT Authentication +#### 3. Certificate Authentication +In `Secure Extra` field, config as following example: +```json +{ + "auth_method": "certificate", + "auth_params": { + "cert": "/path/to/cert.pem", + "key": "/path/to/key.pem" + } +} +``` + +All fields in `auth_params` are passed directly to the [`CertificateAuthentication`](https://github.com/trinodb/trino-python-client/blob/0.315.0/trino/auth.py#L416) class. + +#### 4. JWT Authentication Config `auth_method` and provide token in `Secure Extra` field ```json { @@ -67,7 +81,7 @@ Config `auth_method` and provide token in `Secure Extra` field } ``` -#### 4. Custom Authentication +#### 5. Custom Authentication To use custom authentication, first you need to add it into `ALLOWED_EXTRA_AUTHENTICATIONS` allow list in Superset config file: ```python diff --git a/docs/docs/frequently-asked-questions.mdx b/docs/docs/frequently-asked-questions.mdx index 04b30b272b44..779f6c8c8dc7 100644 --- a/docs/docs/frequently-asked-questions.mdx +++ b/docs/docs/frequently-asked-questions.mdx @@ -57,14 +57,6 @@ timeout in configuration. For example: SQLLAB_ASYNC_TIME_LIMIT_SEC = 60 * 60 * 6 ``` -Superset is running on gunicorn web server, which may time out web requests. If you want to increase -the default (50), you can specify the timeout when starting the web server with the -t flag, which -is expressed in seconds. - -``` -superset runserver -t 300 -``` - If you are seeing timeouts (504 Gateway Time-out) when loading dashboard or explore slice, you are probably behind gateway or proxy server (such as Nginx). If it did not receive a timely response from Superset server (which is processing long queries), these web servers will send 504 status code @@ -80,7 +72,7 @@ SUPERSET_WEBSERVER_TIMEOUT = 60 ### Why is the map not visible in the geospatial visualization? You need to register a free account at [Mapbox.com](https://www.mapbox.com), obtain an API key, and add it -to **superset_config.py** at the key MAPBOX_API_KEY: +to **.env** and **.env-non-dev** at the key MAPBOX_API_KEY: ``` MAPBOX_API_KEY = "longstringofalphanumer1c" diff --git a/docs/docs/installation/alerts-reports.mdx b/docs/docs/installation/alerts-reports.mdx index a86f14893ec4..a193f6ff2659 100644 --- a/docs/docs/installation/alerts-reports.mdx +++ b/docs/docs/installation/alerts-reports.mdx @@ -7,7 +7,7 @@ version: 2 ## Alerts and Reports -(version 1.0.1 and above) +*This covers versions 1.0.1 to current.* Users can configure automated alerts and reports to send dashboards or charts to an email recipient or Slack channel. @@ -20,21 +20,30 @@ Alerts and reports are disabled by default. To turn them on, you need to do some #### Commons -##### In your `superset_config.py` +##### In your `superset_config.py` or `superset_config_docker.py` -- `"ALERT_REPORTS"` feature flag must be turned to True. -- `CELERYBEAT_SCHEDULE` in CeleryConfig must contain schedule for `reports.scheduler`. +- `"ALERT_REPORTS"` [feature flag](https://superset.apache.org/docs/installation/configuring-superset#feature-flags) must be turned to True. +- `beat_schedule` in CeleryConfig must contain schedule for `reports.scheduler`. - At least one of those must be configured, depending on what you want to use: - emails: `SMTP_*` settings - Slack messages: `SLACK_API_TOKEN` +###### Disable dry-run mode + +Screenshots will be taken but no messages actually sent as long as `ALERT_REPORTS_NOTIFICATION_DRY_RUN = True`, its default value in `config.py`. To disable dry-run mode and start receiving email/Slack notifications, set `ALERT_REPORTS_NOTIFICATION_DRY_RUN` to `False` in [superset config](https://github.com/apache/superset/blob/master/docker/pythonpath_dev/superset_config.py). + ##### In your `Dockerfile` - You must install a headless browser, for taking screenshots of the charts and dashboards. Only Firefox and Chrome are currently supported. > If you choose Chrome, you must also change the value of `WEBDRIVER_TYPE` to `"chrome"` in your `superset_config.py`. -Note : All the components required (headless browser, redis, postgres db, celery worker and celery beat) are present in the docker image if you are following [Installing Superset Locally](https://superset.apache.org/docs/installation/installing-superset-using-docker-compose/). -All you need to do is add the required config (See `Detailed Config`). Set `ALERT_REPORTS_NOTIFICATION_DRY_RUN` to `False` in [superset config](https://github.com/apache/superset/blob/master/docker/pythonpath_dev/superset_config.py) to disable dry-run mode and start receiving email/slack notifications. +Note: All the components required (Firefox headless browser, Redis, Postgres db, celery worker and celery beat) are present in the *dev* docker image if you are following [Installing Superset Locally](https://superset.apache.org/docs/installation/installing-superset-using-docker-compose/). +All you need to do is add the required config variables described in this guide (See `Detailed Config`). + +If you are running a non-dev docker image, e.g., a stable release like `apache/superset:2.0.1`, that image does not include a headless browser. Only the `superset_worker` container needs this headless browser to browse to the target chart or dashboard. +You can either install and configure the headless browser - see "Custom Dockerfile" section below - or when deploying via `docker-compose`, modify your `docker-compose.yml` file to use a dev image for the worker container and a stable release image for the `superset_app` container. + +*Note*: In this context, a "dev image" is the same application software as its corresponding non-dev image, just bundled with additional tools. So an image like `2.0.1-dev` is identical to `2.0.1` when it comes to stability, functionality, and running in production. The actual "in-development" versions of Superset - cutting-edge and unstable - are not tagged with version numbers on Docker Hub and will display version `0.0.0-dev` within the Superset UI. #### Slack integration @@ -52,21 +61,23 @@ To send alerts and reports to Slack channels, you need to create a new Slack App 6. The app should now be installed in your workspace, and a "Bot User OAuth Access Token" should have been created. Copy that token in the `SLACK_API_TOKEN` variable of your `superset_config.py`. 7. Restart the service (or run `superset init`) to pull in the new configuration. -Note: when you configure an alert or a report, the Slack channel list take channel names without the leading '#' e.g. use `alerts` instead of `#alerts`. +Note: when you configure an alert or a report, the Slack channel list takes channel names without the leading '#' e.g. use `alerts` instead of `#alerts`. -#### Kubernetes specific +#### Kubernetes-specific - You must have a `celery beat` pod running. If you're using the chart included in the GitHub repository under [helm/superset](https://github.com/apache/superset/tree/master/helm/superset), you need to put `supersetCeleryBeat.enabled = true` in your values override. - You can see the dedicated docs about [Kubernetes installation](/docs/installation/running-on-kubernetes) for more generic details. #### Docker-compose specific -##### You must have in your`docker-compose.yaml` +##### You must have in your `docker-compose.yml` -- a redis message broker +- A Redis message broker - PostgreSQL DB instead of SQLlite -- one or more `celery worker` -- a single `celery beat` +- One or more `celery worker` +- A single `celery beat` + +This process also works in a Docker swarm environment, you would just need to add `Deploy:` to the Superset, Redis and Postgres services along with your specific configs for your swarm. ### Detailed config @@ -76,7 +87,11 @@ You can find documentation about each field in the default `config.py` in the Gi You need to replace default values with your custom Redis, Slack and/or SMTP config. -In the `CeleryConfig`, only the `CELERYBEAT_SCHEDULE` is relative to this feature, the rest of the `CeleryConfig` can be changed for your needs. +Superset uses Celery beat and Celery worker(s) to send alerts and reports. +- The beat is the scheduler that tells the worker when to perform its tasks. This schedule is defined when you create the alert or report. +- The worker will process the tasks that need to be performed when an alert or report is fired. + +In the `CeleryConfig`, only the `beat_schedule` is relevant to this feature, the rest of the `CeleryConfig` can be changed for your needs. ```python from celery.schedules import crontab @@ -124,14 +139,15 @@ SCREENSHOT_LOAD_WAIT = 600 SLACK_API_TOKEN = "xoxb-" # Email configuration -SMTP_HOST = "smtp.sendgrid.net" #change to your host +SMTP_HOST = "smtp.sendgrid.net" # change to your host +SMTP_PORT = 2525 # your port, e.g. 587 SMTP_STARTTLS = True SMTP_SSL_SERVER_AUTH = True # If your using an SMTP server with a valid certificate SMTP_SSL = False -SMTP_USER = "your_user" -SMTP_PORT = 2525 # your port eg. 587 -SMTP_PASSWORD = "your_password" +SMTP_USER = "your_user" # use the empty string "" if using an unauthenticated SMTP server +SMTP_PASSWORD = "your_password" # use the empty string "" if using an unauthenticated SMTP server SMTP_MAIL_FROM = "noreply@youremail.com" +EMAIL_REPORTS_SUBJECT_PREFIX = "[Superset] " # optional - overwrites default value in config.py of "[Report] " # WebDriver configuration # If you use Firefox, you can stick with default values @@ -149,19 +165,70 @@ WEBDRIVER_OPTION_ARGS = [ ] # This is for internal use, you can keep http -WEBDRIVER_BASEURL="http://superset:8088" -# This is the link sent to the recipient, change to your domain eg. https://superset.mydomain.com -WEBDRIVER_BASEURL_USER_FRIENDLY="http://localhost:8088" +WEBDRIVER_BASEURL = "http://superset:8088" +# This is the link sent to the recipient. Change to your domain, e.g. https://superset.mydomain.com +WEBDRIVER_BASEURL_USER_FRIENDLY = "http://localhost:8088" +``` + +You also need +to specify on behalf of which username to render the dashboards. In general dashboards and charts +are not accessible to unauthorized requests, that is why the worker needs to take over credentials +of an existing user to take a snapshot. + +By default, Alerts and Reports are executed as the user that the `THUMBNAIL_SELENIUM_USER` config +parameter is set to. To change this user, just change the config as follows: + +```python +THUMBNAIL_SELENIUM_USER = 'username_with_permission_to_access_dashboards' ``` +In addition, it's also possible to execute the reports as the report owners/creators. This is typically +needed if there isn't a central service account that has access to all objects or databases (e.g. +when using user impersonation on database connections). For this there's the config flag +`ALERTS_REPORTS_EXECUTE_AS` which makes it possible to customize how alerts and reports are executed. +To first try to execute as the creator in the owners list (if present), then fall +back to the creator, then the last modifier in the owners list (if present), then the +last modifier, then an owner (giving priority to the last modifier and then the +creator if either is contained within the list of owners, otherwise the first owner +will be used) and finally `THUMBNAIL_SELENIUM_USER`, set as follows: + +```python +from superset.reports.types import ReportScheduleExecutor + +ALERT_REPORTS_EXECUTE_AS = [ + ReportScheduleExecutor.CREATOR_OWNER, + ReportScheduleExecutor.CREATOR, + ReportScheduleExecutor.MODIFIER_OWNER, + ReportScheduleExecutor.MODIFIER, + ReportScheduleExecutor.OWNER, + ReportScheduleExecutor.SELENIUM, +] +``` + + +**Important notes** + +- Be mindful of the concurrency setting for celery (using `-c 4`). Selenium/webdriver instances can + consume a lot of CPU / memory on your servers. +- In some cases, if you notice a lot of leaked geckodriver processes, try running your celery + processes with `celery worker --pool=prefork --max-tasks-per-child=128 ...` +- It is recommended to run separate workers for the `sql_lab` and `email_reports` tasks. This can be + done using the `queue` field in `task_annotations`. +- Adjust `WEBDRIVER_BASEURL` in your configuration file if celery workers can’t access Superset via + its default value of `http://0.0.0.0:8080/`. + + ### Custom Dockerfile -A webdriver (and headless browser) is needed to capture screenshots of the charts and dashboards which are then sent to the recipient. As the base superset image does not have a webdriver installed, we need to extend it and install the webdriver. +If you're running the dev version of a released Superset image, like `apache/superset:2.0.1-dev`, you should be set with the above. + +But if you're building your own image, or starting with a non-dev version, a webdriver (and headless browser) is needed to capture screenshots of the charts and dashboards which are then sent to the recipient. +Here's how you can modify your Dockerfile to take the screenshots either with Firefox or Chrome. #### Using Firefox ```docker -FROM apache/superset:1.0.1 +FROM apache/superset:2.0.1 USER root @@ -182,7 +249,7 @@ USER superset #### Using Chrome ```docker -FROM apache/superset:1.0.1 +FROM apache/superset:2.0.1 USER root @@ -191,7 +258,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends ./google-chrome-stable_current_amd64.deb && \ rm -f google-chrome-stable_current_amd64.deb -RUN export CHROMEDRIVER_VERSION=$(curl --silent https://chromedriver.storage.googleapis.com/LATEST_RELEASE_88) && \ +RUN export CHROMEDRIVER_VERSION=$(curl --silent https://chromedriver.storage.googleapis.com/LATEST_RELEASE_102) && \ wget -q https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip && \ unzip chromedriver_linux64.zip -d /usr/bin && \ chmod 755 /usr/bin/chromedriver && \ @@ -202,189 +269,7 @@ RUN pip install --no-cache gevent psycopg2 redis USER superset ``` -> Don't forget to set `WEBDRIVER_TYPE` and `WEBDRIVER_OPTION_ARGS` in your config if you use Chrome. - -### Summary of steps to turn on alerts and reporting: - -Using the templates below, - -1. Create a new directory and create the Dockerfile -2. Build the extended image using the Dockerfile -3. Create the `docker-compose.yaml` file in the same directory -4. Create a new subdirectory called `config` -5. Create the `superset_config.py` file in the `config` subdirectory -6. Run the image using `docker-compose up` in the same directory as the `docker-compose.py` file -7. In a new terminal window, upgrade the DB by running `docker exec -it superset-1.0.1-extended superset db upgrade` -8. Then run `docker exec -it superset-1.0.1-extended superset init` -9. Then setup your admin user if need be, `docker exec -it superset-1.0.1-extended superset fab create-admin` -10. Finally, restart the running instance - `CTRL-C`, then `docker-compose up` - -(note: v 1.0.1 is current at time of writing, you can change the version number to the latest version if a newer version is available) - -### Docker compose - -The docker compose file lists the services that will be used when running the image. The specific services needed for alerts and reporting are outlined below. - -#### Redis message broker - -To ferry requests between the celery worker and the Superset instance, we use a message broker. This template uses Redis. - -#### Replacing SQLite with Postgres - -While it might be possible to use SQLite for alerts and reporting, it is highly recommended using a more production ready DB for Superset in general. Our template uses Postgres. - -#### Celery worker - -The worker will process the tasks that need to be performed when an alert or report is fired. - -#### Celery beat - -The beat is the scheduler that tells the worker when to perform its tasks. This schedule is defined when you create the alert or report. - -#### Full `docker-compose.yaml` configuration - -The Redis, Postgres, Celery worker and Celery beat services are defined in the template: - -Config for `docker-compose.yaml`: - -```docker -version: '3.6' -services: - redis: - image: redis:6.0.9-buster - restart: on-failure - volumes: - - redis:/data - postgres: - image: postgres - restart: on-failure - environment: - POSTGRES_DB: superset - POSTGRES_PASSWORD: superset - POSTGRES_USER: superset - volumes: - - db:/var/lib/postgresql/data - worker: - image: superset-1.0.1-extended - restart: on-failure - healthcheck: - disable: true - depends_on: - - superset - - postgres - - redis - command: "celery --app=superset.tasks.celery_app:app worker --pool=gevent --concurrency=500" - volumes: - - ./config/:/app/pythonpath/ - beat: - image: superset-1.0.1-extended - restart: on-failure - healthcheck: - disable: true - depends_on: - - superset - - postgres - - redis - command: "celery --app=superset.tasks.celery_app:app beat --pidfile /tmp/celerybeat.pid --schedule /tmp/celerybeat-schedule" - volumes: - - ./config/:/app/pythonpath/ - superset: - image: superset-1.0.1-extended - restart: on-failure - environment: - - SUPERSET_PORT=8088 - ports: - - "8088:8088" - depends_on: - - postgres - - redis - command: gunicorn --bind 0.0.0.0:8088 --access-logfile - --error-logfile - --workers 5 --worker-class gthread --threads 4 --timeout 200 --limit-request-line 4094 --limit-request-field_size 8190 superset.app:create_app() - volumes: - - ./config/:/app/pythonpath/ -volumes: - db: - external: true - redis: - external: false -``` - -### Summary - -With the extended image created by using the `Dockerfile`, and then running that image using `docker-compose.yaml`, plus the required configurations in the `superset_config.py` you should now have alerts and reporting working correctly. - -- The above templates also work in a Docker swarm environment, you would just need to add `Deploy:` to the Superset, Redis and Postgres services along with your specific configs for your swarm - -# Old Reports feature - -## Scheduling and Emailing Reports - -(version 0.38 and below) - -### Email Reports - -Email reports allow users to schedule email reports for: - -- chart and dashboard visualization (attachment or inline) -- chart data (CSV attachment on inline table) - -Enable email reports in your `superset_config.py` file: - -```python -ENABLE_SCHEDULED_EMAIL_REPORTS = True -``` - -This flag enables some permissions that are stored in your database, so you'll want to run `superset init` again if you are running this in a dev environment. -Now you will find two new items in the navigation bar that allow you to schedule email reports: - -- **Manage > Dashboard Emails** -- **Manage > Chart Email Schedules** - -Schedules are defined in [crontab format](https://crontab.guru/) and each schedule can have a list -of recipients (all of them can receive a single mail, or separate mails). For audit purposes, all -outgoing mails can have a mandatory BCC. - -In order get picked up you need to configure a celery worker and a celery beat (see section above -“Celery Tasks”). Your celery configuration also needs an entry `email_reports.schedule_hourly` for -`CELERYBEAT_SCHEDULE`. - -To send emails you need to configure SMTP settings in your `superset_config.py` configuration file. - -```python -EMAIL_NOTIFICATIONS = True - -SMTP_HOST = "email-smtp.eu-west-1.amazonaws.com" -SMTP_STARTTLS = True -SMTP_SSL = False -SMTP_USER = "smtp_username" -SMTP_PORT = 25 -SMTP_PASSWORD = os.environ.get("SMTP_PASSWORD") -SMTP_MAIL_FROM = "insights@komoot.com" -``` - -To render dashboards you need to install a local browser on your Superset instance: - -- [geckodriver](https://github.com/mozilla/geckodriver) for Firefox -- [chromedriver](http://chromedriver.chromium.org/) for Chrome - -You'll need to adjust the `WEBDRIVER_TYPE` accordingly in your configuration. You also need -to specify on behalf of which username to render the dashboards. In general dashboards and charts -are not accessible to unauthorized requests, that is why the worker needs to take over credentials -of an existing user to take a snapshot. - -```python -THUMBNAIL_SELENIUM_USER = 'username_with_permission_to_access_dashboards' -``` - -**Important notes** - -- Be mindful of the concurrency setting for celery (using `-c 4`). Selenium/webdriver instances can - consume a lot of CPU / memory on your servers. -- In some cases, if you notice a lot of leaked geckodriver processes, try running your celery - processes with `celery worker --pool=prefork --max-tasks-per-child=128 ...` -- It is recommended to run separate workers for the `sql_lab` and `email_reports` tasks. This can be - done using the `queue` field in `CELERY_ANNOTATIONS`. -- Adjust `WEBDRIVER_BASEURL` in your configuration file if celery workers can’t access Superset via - its default value of `http://0.0.0.0:8080/`. +Don't forget to set `WEBDRIVER_TYPE` and `WEBDRIVER_OPTION_ARGS` in your config if you use Chrome. ### Schedule Reports @@ -392,94 +277,91 @@ You can optionally allow your users to schedule queries directly in SQL Lab. Thi extra metadata to saved queries, which are then picked up by an external scheduled (like [Apache Airflow](https://airflow.apache.org/)). -To allow scheduled queries, add the following to your configuration file: +To allow scheduled queries, add the following to `SCHEDULED_QUERIES` in your configuration file: ```python -FEATURE_FLAGS = { - # Configuration for scheduling queries from SQL Lab. This information is - # collected when the user clicks "Schedule query", and saved into the `extra` - # field of saved queries. +SCHEDULED_QUERIES = { + # This information is collected when the user clicks "Schedule query", + # and saved into the `extra` field of saved queries. # See: https://github.com/mozilla-services/react-jsonschema-form - 'SCHEDULED_QUERIES': { - 'JSONSCHEMA': { - 'title': 'Schedule', - 'description': ( - 'In order to schedule a query, you need to specify when it ' - 'should start running, when it should stop running, and how ' - 'often it should run. You can also optionally specify ' - 'dependencies that should be met before the query is ' - 'executed. Please read the documentation for best practices ' - 'and more information on how to specify dependencies.' - ), - 'type': 'object', - 'properties': { - 'output_table': { - 'type': 'string', - 'title': 'Output table name', - }, - 'start_date': { - 'type': 'string', - 'title': 'Start date', - # date-time is parsed using the chrono library, see - # https://www.npmjs.com/package/chrono-node#usage - 'format': 'date-time', - 'default': 'tomorrow at 9am', - }, - 'end_date': { - 'type': 'string', - 'title': 'End date', - # date-time is parsed using the chrono library, see - # https://www.npmjs.com/package/chrono-node#usage - 'format': 'date-time', - 'default': '9am in 30 days', - }, - 'schedule_interval': { - 'type': 'string', - 'title': 'Schedule interval', - }, - 'dependencies': { - 'type': 'array', - 'title': 'Dependencies', - 'items': { - 'type': 'string', - }, - }, + 'JSONSCHEMA': { + 'title': 'Schedule', + 'description': ( + 'In order to schedule a query, you need to specify when it ' + 'should start running, when it should stop running, and how ' + 'often it should run. You can also optionally specify ' + 'dependencies that should be met before the query is ' + 'executed. Please read the documentation for best practices ' + 'and more information on how to specify dependencies.' + ), + 'type': 'object', + 'properties': { + 'output_table': { + 'type': 'string', + 'title': 'Output table name', + }, + 'start_date': { + 'type': 'string', + 'title': 'Start date', + # date-time is parsed using the chrono library, see + # https://www.npmjs.com/package/chrono-node#usage + 'format': 'date-time', + 'default': 'tomorrow at 9am', + }, + 'end_date': { + 'type': 'string', + 'title': 'End date', + # date-time is parsed using the chrono library, see + # https://www.npmjs.com/package/chrono-node#usage + 'format': 'date-time', + 'default': '9am in 30 days', }, - }, - 'UISCHEMA': { 'schedule_interval': { - 'ui:placeholder': '@daily, @weekly, etc.', + 'type': 'string', + 'title': 'Schedule interval', }, 'dependencies': { - 'ui:help': ( - 'Check the documentation for the correct format when ' - 'defining dependencies.' - ), + 'type': 'array', + 'title': 'Dependencies', + 'items': { + 'type': 'string', + }, }, }, - 'VALIDATION': [ - # ensure that start_date <= end_date - { - 'name': 'less_equal', - 'arguments': ['start_date', 'end_date'], - 'message': 'End date cannot be before start date', - # this is where the error message is shown - 'container': 'end_date', - }, - ], - # link to the scheduler; this example links to an Airflow pipeline - # that uses the query id and the output table as its name - 'linkback': ( - 'https://airflow.example.com/admin/airflow/tree?' - 'dag_id=query_${id}_${extra_json.schedule_info.output_table}' - ), }, + 'UISCHEMA': { + 'schedule_interval': { + 'ui:placeholder': '@daily, @weekly, etc.', + }, + 'dependencies': { + 'ui:help': ( + 'Check the documentation for the correct format when ' + 'defining dependencies.' + ), + }, + }, + 'VALIDATION': [ + # ensure that start_date <= end_date + { + 'name': 'less_equal', + 'arguments': ['start_date', 'end_date'], + 'message': 'End date cannot be before start date', + # this is where the error message is shown + 'container': 'end_date', + }, + ], + # link to the scheduler; this example links to an Airflow pipeline + # that uses the query id and the output table as its name + 'linkback': ( + 'https://airflow.example.com/admin/airflow/tree?' + 'dag_id=query_${id}_${extra_json.schedule_info.output_table}' + ), } ``` -This feature flag is based on +This configuration is based on [react-jsonschema-form](https://github.com/mozilla-services/react-jsonschema-form) and will add a -button called “Schedule Query” to SQL Lab. When the button is clicked, a modal will show up where +menu item called “Schedule” to SQL Lab. When the menu item is clicked, a modal will show up where the user can add the metadata required for scheduling the query. This information can then be retrieved from the endpoint `/savedqueryviewapi/api/read` and used to diff --git a/docs/docs/installation/cache.mdx b/docs/docs/installation/cache.mdx index aaa8327451b8..58b4bcb2b0b7 100644 --- a/docs/docs/installation/cache.mdx +++ b/docs/docs/installation/cache.mdx @@ -7,19 +7,49 @@ version: 1 ## Caching -Superset uses [Flask-Caching](https://flask-caching.readthedocs.io/) for caching purposes. Configuring caching is as easy as providing a custom cache config in your -`superset_config.py` that complies with [the Flask-Caching specifications](https://flask-caching.readthedocs.io/en/latest/#configuring-flask-caching). -Flask-Caching supports various caching backends, including Redis, Memcached, SimpleCache (in-memory), or the -local filesystem. Custom cache backends are also supported. See [here](https://flask-caching.readthedocs.io/en/latest/#custom-cache-backends) for specifics. -The following cache configurations can be customized: -- Metadata cache (optional): `CACHE_CONFIG` -- Charting data queried from datasets (optional): `DATA_CACHE_CONFIG` -- SQL Lab query results (optional): `RESULTS_BACKEND`. See [Async Queries via Celery](/docs/installation/async-queries-celery) for details +Superset uses [Flask-Caching](https://flask-caching.readthedocs.io/) for caching purposes. +Flask-Caching supports various caching backends, including Redis (recommended), Memcached, +SimpleCache (in-memory), or the local filesystem. +[Custom cache backends](https://flask-caching.readthedocs.io/en/latest/#custom-cache-backends) +are also supported. + +Caching can be configured by providing a dictionaries in +`superset_config.py` that comply with[the Flask-Caching config specifications](https://flask-caching.readthedocs.io/en/latest/#configuring-flask-caching). + +The following cache configurations can be customized in this way: - Dashboard filter state (required): `FILTER_STATE_CACHE_CONFIG`. - Explore chart form data (required): `EXPLORE_FORM_DATA_CACHE_CONFIG` +- Metadata cache (optional): `CACHE_CONFIG` +- Charting data queried from datasets (optional): `DATA_CACHE_CONFIG` + +For example, to configure the filter state cache using redis: + +```python +FILTER_STATE_CACHE_CONFIG = { + 'CACHE_TYPE': 'RedisCache', + 'CACHE_DEFAULT_TIMEOUT': 86400, + 'CACHE_KEY_PREFIX': 'superset_filter_cache', + 'CACHE_REDIS_URL': 'redis://localhost:6379/0' +} +``` + +### Dependencies + +In order to use dedicated cache stores, additional python libraries must be installed + +- For Redis: we recommend the [redis](https://pypi.python.org/pypi/redis) Python package +- Memcached: we recommend using [pylibmc](https://pypi.org/project/pylibmc/) client library as + `python-memcached` does not handle storing binary data correctly. + +These libraries can be installed using pip. + +### Fallback Metastore Cache + +Note, that some form of Filter State and Explore caching are required. If either of these caches +are undefined, Superset falls back to using a built-in cache that stores data in the metadata +database. While it is recommended to use a dedicated cache, the built-in cache can also be used +to cache other data. -Please note, that Dashboard and Explore caching is required. If these caches are undefined, Superset falls back to using a built-in cache that stores data -in the metadata database. While it is recommended to use a dedicated cache, the built-in cache can also be used to cache other data. For example, to use the built-in cache to store chart data, use the following config: ```python @@ -30,21 +60,25 @@ DATA_CACHE_CONFIG = { } ``` -- Redis (recommended): we recommend the [redis](https://pypi.python.org/pypi/redis) Python package -- Memcached: we recommend using [pylibmc](https://pypi.org/project/pylibmc/) client library as - `python-memcached` does not handle storing binary data correctly. +### Chart Cache Timeout -Both of these libraries can be installed using pip. +The cache timeout for charts may be overridden by the settings for an individual chart, dataset, or +database. Each of these configurations will be checked in order before falling back to the default +value defined in `DATA_CACHE_CONFIG. -For chart data, Superset goes up a “timeout search path”, from a slice's configuration -to the datasource’s, the database’s, then ultimately falls back to the global default -defined in `DATA_CACHE_CONFIG`. +### SQL Lab Query Results -## Celery beat +Caching for SQL Lab query results is used when async queries are enabled and is configured using +`RESULTS_BACKEND`. + +Note that this configuration does not use a flask-caching dictionary for its configuration, but +instead requires a cachelib object. + +See [Async Queries via Celery](/docs/installation/async-queries-celery) for details. ### Caching Thumbnails -This is an optional feature that can be turned on by activating it’s feature flag on config: +This is an optional feature that can be turned on by activating it’s [feature flag](https://superset.apache.org/docs/installation/configuring-superset#feature-flags) on config: ``` FEATURE_FLAGS = { @@ -53,6 +87,13 @@ FEATURE_FLAGS = { } ``` +By default thumbnails are rendered using the `THUMBNAIL_SELENIUM_USER` user account. To render thumbnails as the +logged in user (e.g. in environments that are using user impersonation), use the following configuration: + +```python +THUMBNAIL_EXECUTE_AS = [ExecutorType.CURRENT_USER] +``` + For this feature you will need a cache system and celery workers. All thumbnails are stored on cache and are processed asynchronously by the workers. diff --git a/docs/docs/installation/configuring-superset.mdx b/docs/docs/installation/configuring-superset.mdx index 05f845c114ec..aefc12d60306 100644 --- a/docs/docs/installation/configuring-superset.mdx +++ b/docs/docs/installation/configuring-superset.mdx @@ -149,7 +149,11 @@ Make sure the pip package [`Authlib`](https://authlib.org/) is installed on the First, configure authorization in Superset `superset_config.py`. ```python +from flask_appbuilder.security.manager import AUTH_OAUTH + +# Set the authentication type to OAuth AUTH_TYPE = AUTH_OAUTH + OAUTH_PROVIDERS = [ { 'name':'egaSSO', 'token_key':'access_token', # Name of the token in the response of access_token_url diff --git a/docs/docs/installation/event-logging.mdx b/docs/docs/installation/event-logging.mdx index 7b9bba1de4e6..2cb35d5047dc 100644 --- a/docs/docs/installation/event-logging.mdx +++ b/docs/docs/installation/event-logging.mdx @@ -9,9 +9,11 @@ version: 1 ### Event Logging -Superset by default logs special action events in its internal database. These logs can be accessed +Superset by default logs special action events in its internal database (DBEventLogger). These logs can be accessed on the UI by navigating to **Security > Action Log**. You can freely customize these logs by implementing your own event log class. +**When custom log class is enabled DBEventLogger is disabled and logs stop being populated in UI logs view.** +To achieve both, custom log class should extend built-in DBEventLogger log class. Here's an example of a simple JSON-to-stdout class: diff --git a/docs/docs/installation/installing-superset-from-scratch.mdx b/docs/docs/installation/installing-superset-from-scratch.mdx index 3a12c9db3ac1..b15ccb315748 100644 --- a/docs/docs/installation/installing-superset-from-scratch.mdx +++ b/docs/docs/installation/installing-superset-from-scratch.mdx @@ -64,7 +64,7 @@ We don't recommend using the system installed Python. Instead, first install the brew install readline pkg-config libffi openssl mysql postgres ``` -You should install a recent version of Python (the official docker image uses 3.8.12). We'd recommend using a Python version manager like [pyenv](https://github.com/pyenv/pyenv) (and also [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv)). +You should install a recent version of Python (the official docker image uses 3.8.16). We'd recommend using a Python version manager like [pyenv](https://github.com/pyenv/pyenv) (and also [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv)). Let's also make sure we have the latest version of `pip` and `setuptools`: diff --git a/docs/docs/installation/installing-superset-using-docker-compose.mdx b/docs/docs/installation/installing-superset-using-docker-compose.mdx index 89ed9f1d63e5..ae53085947a7 100644 --- a/docs/docs/installation/installing-superset-using-docker-compose.mdx +++ b/docs/docs/installation/installing-superset-using-docker-compose.mdx @@ -84,9 +84,11 @@ and wait for the `superset_node` container to finish building the assets. #### Configuring Docker Compose -The following is for users who want to configure how Superset starts up in Docker Compose; otherwise, you can skip to the next section. +The following is for users who want to configure how Superset runs in Docker Compose; otherwise, you can skip to the next section. -You can configure the Docker Compose settings for dev and non-dev mode with `docker/.env` and `docker/.env-non-dev` respectively. These environment files set the environment for most containers in the Docker Compose setup, and some variables affect multiple containers and others only single ones. +You can install additional python packages and apply config overrides by following the steps mentioned in [docker/README.md](https://github.com/apache/superset/tree/master/docker#configuration) + +You can configure the Docker Compose environment varirables for dev and non-dev mode with `docker/.env` and `docker/.env-non-dev` respectively. These environment files set the environment for most containers in the Docker Compose setup, and some variables affect multiple containers and others only single ones. One important variable is `SUPERSET_LOAD_EXAMPLES` which determines whether the `superset_init` container will load example data and visualizations into the database and Superset. These examples are quite helpful for most people, but probably unnecessary for experienced users. The loading process can sometimes take a few minutes and a good amount of CPU, so you may want to disable it on a resource-constrained device. @@ -116,4 +118,4 @@ When running Superset using `docker` or `docker-compose` it runs in its own dock Here the instructions are for connecting to postgresql (which is running on your host machine) from Superset (which is running in its docker container). Other databases may have slightly different configurations but gist would be same and boils down to 2 steps - 1. **(Mac users may skip this step)** Configuring the local postgresql/database instance to accept public incoming connections. By default postgresql only allows incoming connections from `localhost` only, but re-iterating once again, `localhosts` are different for host machine and docker container. For postgresql this involves make one-line changes to the files `postgresql.conf` and `pg_hba.conf`, you can find helpful links tailored to your OS / PG version on the web easily for this task. For docker it suffices to only whitelist IPs `172.0.0.0/8` instead of `*`, but in any case you are _warned_ that doing this in a production database _may_ have disastrous consequences as you are opening your database to the public internet. -2. Instead of `localhost`, try using `host.docker.internal` (Mac users) or `172.18.0.1` (Linux users) as the host name when attempting to connect to the database. This is docker internal detail, what is happening is that in Mac systems docker creates a dns entry for the host name `host.docker.internal` which resolves to the correct address for the host machine, whereas in linux this is not the case (at least by default). If neither of these 2 hostnames work then you may want to find the exact host name you want to use, for that you can do `ifconfig` or `ip addr show` and look at the IP address of `docker0` interface that must have been created by docker for you. Alternately if you don't even see the `docker0` interface try (if needed with sudo) `docker network inspect bridge` and see if there is an entry for `"Gateway"` and note the IP address. +2. Instead of `localhost`, try using `host.docker.internal` (Mac users, Ubuntu) or `172.18.0.1` (Linux users) as the host name when attempting to connect to the database. This is docker internal detail, what is happening is that in Mac systems docker creates a dns entry for the host name `host.docker.internal` which resolves to the correct address for the host machine, whereas in linux this is not the case (at least by default). If neither of these 2 hostnames work then you may want to find the exact host name you want to use, for that you can do `ifconfig` or `ip addr show` and look at the IP address of `docker0` interface that must have been created by docker for you. Alternately if you don't even see the `docker0` interface try (if needed with sudo) `docker network inspect bridge` and see if there is an entry for `"Gateway"` and note the IP address. diff --git a/docs/docs/installation/running-on-kubernetes.mdx b/docs/docs/installation/running-on-kubernetes.mdx index af7618751708..61fa84721bf1 100644 --- a/docs/docs/installation/running-on-kubernetes.mdx +++ b/docs/docs/installation/running-on-kubernetes.mdx @@ -63,7 +63,7 @@ superset-worker-75b48bbcc-qrq49 1/1 Running 0 4m12s The exact list will depend on some of your specific configuration overrides but you should generally expect: -- N `superset-xxxx-yyyy` and `superset-worker-xxxx-yyyy` pods (depending on your `replicaCount` value) +- N `superset-xxxx-yyyy` and `superset-worker-xxxx-yyyy` pods (depending on your `supersetNode.replicaCount` and `supersetWorker.replicaCount` values) - 1 `superset-postgresql-0` depending on your postgres settings - 1 `superset-redis-master-0` depending on your redis settings - 1 `superset-celerybeat-xxxx-yyyy` pod if you have `supersetCeleryBeat.enabled = true` in your values overrides @@ -123,16 +123,27 @@ init: #### Dependencies -Install additional packages and do any other bootstrap configuration in this script. For production clusters it's -recommended to build own image with this step done in CI. The following example installs the Big Query and Elasticsearch -database drivers so that you can connect to those datasources in your Superset installation. +Install additional packages and do any other bootstrap configuration in the bootstrap script. +For production clusters it's recommended to build own image with this step done in CI. + +:::note + +Superset requires a Python DB-API database driver and a SQLAlchemy +dialect to be installed for each datastore you want to connect to. + +See [Install Database Drivers](/docs/databases/installing-database-drivers) for more information + +::: + +The following example installs the Big Query and Elasticsearch database drivers so that you can +connect to those datasources in your Superset installation: ```yaml bootstrapScript: | #!/bin/bash pip install psycopg2==2.9.1 \ redis==3.2.1 \ - pybigquery==2.26.0 \ + sqlalchemy-bigquery==1.5.0 \ elasticsearch-dbapi==0.2.5 &&\ if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi ``` @@ -226,6 +237,14 @@ Those will also be mounted as secrets and can include sensitive parameters. #### Setting up OAuth +:::note + +OAuth setup requires that the [authlib](https://authlib.org/) Python library is installed. This can +be done using `pip` by updating the `bootstrapScript`. See the [Dependencies](#dependencies) section +for more information. + +::: + ```yaml extraEnv: AUTH_DOMAIN: example.com @@ -239,7 +258,7 @@ configOverrides: # This will make sure the redirect_uri is properly computed, even with SSL offloading ENABLE_PROXY_FIX = True - from flask_appbuilder.security.manager import (AUTH_OAUTH, AUTH_DB) + from flask_appbuilder.security.manager import AUTH_OAUTH AUTH_TYPE = AUTH_OAUTH OAUTH_PROVIDERS = [ { diff --git a/docs/docs/installation/sql-templating.mdx b/docs/docs/installation/sql-templating.mdx index 09373d8999d0..72c2c0a9adb7 100644 --- a/docs/docs/installation/sql-templating.mdx +++ b/docs/docs/installation/sql-templating.mdx @@ -10,7 +10,7 @@ version: 1 ### Jinja Templates SQL Lab and Explore supports [Jinja templating](https://jinja.palletsprojects.com/en/2.11.x/) in queries. -To enable templating, the `ENABLE_TEMPLATE_PROCESSING` feature flag needs to be enabled in +To enable templating, the `ENABLE_TEMPLATE_PROCESSING` [feature flag](https://superset.apache.org/docs/installation/configuring-superset#feature-flags) needs to be enabled in `superset_config.py`. When templating is enabled, python code can be embedded in virtual datasets and in Custom SQL in the filter and metric controls in Explore. By default, the following variables are made available in the Jinja context: @@ -298,7 +298,7 @@ Here's a concrete example: It's possible to query physical and virtual datasets using the `dataset` macro. This is useful if you've defined computed columns and metrics on your datasets, and want to reuse the definition in adhoc SQL Lab queries. -To use the macro, first you need to find the ID of the dataset. This can be done by going to the view showing all the datasets, hovering over the dataset you're interested in, and looking at its URL. For example, if the URL for a dataset is https://superset.example.org/superset/explore/table/42/ its ID is 42. +To use the macro, first you need to find the ID of the dataset. This can be done by going to the view showing all the datasets, hovering over the dataset you're interested in, and looking at its URL. For example, if the URL for a dataset is https://superset.example.org/explore/?dataset_type=table&dataset_id=42 its ID is 42. Once you have the ID you can query it as if it were a table: diff --git a/docs/docs/intro.mdx b/docs/docs/intro.mdx index 77ff12df83e7..2d2de074aec3 100644 --- a/docs/docs/intro.mdx +++ b/docs/docs/intro.mdx @@ -30,7 +30,7 @@ Superset provides: - A lightweight semantic layer which empowers data analysts to quickly define custom dimensions and metrics - Out-of-the-box support for most SQL-speaking databases - Seamless, in-memory asynchronous caching and queries -- An extensible security model that allows configuration of very intricate rules on on who can access which product features and datasets. +- An extensible security model that allows configuration of very intricate rules on who can access which product features and datasets. - Integration with major authentication backends (database, OpenID, LDAP, OAuth, REMOTE_USER, etc) - The ability to add custom visualization plugins - An API for programmatic customization diff --git a/docs/docs/miscellaneous/country-map-tools.mdx b/docs/docs/miscellaneous/country-map-tools.mdx index 5e490b2057f4..20d1dbe22c4f 100644 --- a/docs/docs/miscellaneous/country-map-tools.mdx +++ b/docs/docs/miscellaneous/country-map-tools.mdx @@ -43,6 +43,7 @@ The Country Maps visualization already ships with the maps for the following cou - Syria - Thailand - Timorleste +- Turkey - UK - Ukraine - Uruguay diff --git a/docs/docs/security.mdx b/docs/docs/security.mdx index 283e48d9b058..e868de6a99af 100644 --- a/docs/docs/security.mdx +++ b/docs/docs/security.mdx @@ -153,6 +153,43 @@ of a policy and if it's not able to find one, it will issue a warning with the s where CSP policies are defined outside of Superset using other software, administrators can disable the warning using the `CONTENT_SECURITY_POLICY_WARNING` key in `config.py`. +#### CSP Requirements + +* Superset needs both the `'unsafe-eval'` and `'unsafe-inline'` CSP keywords in order to operate. + + ``` + default-src 'self' 'unsafe-eval' 'unsafe-inline' + ``` + +* Some dashbaords load images using data URIs and require `data:` in their `img-src` + + ``` + img-src 'self' data: + ``` + +* MapBox charts use workers and need to connect to MapBox servers in addition to the Superset origin + + ``` + worker-src 'self' blob: + connect-src 'self' https://api.mapbox.com https://events.mapbox.com + ``` + +This is a basic example `TALISMAN_CONFIG` that implements the above requirements, uses `'self'` to +limit content to the same origin as the Superset server, and disallows outdated HTML elements by +setting `object-src` to `'none'`. + +```python +TALISMAN_CONFIG = { + "content_security_policy": { + "default-src": ["'self'", "'unsafe-inline'", "'unsafe-eval'"], + "img-src": ["'self'", "data:"], + "worker-src": ["'self'", "blob:"], + "connect-src": ["'self'", "https://api.mapbox.com", "https://events.mapbox.com"], + "object-src": "'none'", + } +} +``` + ### Reporting Security Vulnerabilities Apache Software Foundation takes a rigorous standpoint in annihilating the security issues in its diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 7c86ff067cd0..e6121cca9348 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -37,11 +37,14 @@ const config = { projectName: 'superset', // Usually your repo name. themes: ['@saucelabs/theme-github-codeblock'], plugins: [ - ["docusaurus-plugin-less", { - lessOptions: { - javascriptEnabled: true, - } - }], + [ + 'docusaurus-plugin-less', + { + lessOptions: { + javascriptEnabled: true, + }, + }, + ], [ '@docusaurus/plugin-client-redirects', { @@ -185,10 +188,6 @@ const config = { label: 'Getting Started', to: '/docs/intro', }, - { - label: 'Tutorial', - to: '/docs/intro', - }, { label: 'FAQ', to: '/docs/frequently-asked-questions', @@ -208,7 +207,7 @@ const config = { }, { label: 'Slack', - href: 'https://join.slack.com/t/apache-superset/shared_invite/zt-16jvzmoi8-sI7jKWp~xc2zYRe~NqiY9Q', + href: 'http://bit.ly/join-superset-slack', }, { label: 'Mailing List', @@ -229,8 +228,7 @@ const config = { }, footer: { style: 'dark', - links: [ - ], + links: [], copyright: `Copyright © ${new Date().getFullYear()}, The <a href="https://www.apache.org/" target="_blank" rel="noreferrer">Apache Software Foundation</a>, Licensed under the Apache <a href="https://apache.org/licenses/LICENSE-2.0" target="_blank" rel="noreferrer">License</a>. <br/> @@ -249,6 +247,7 @@ const config = { darkTheme: darkCodeTheme, }, }), + scripts: ['/script/matomo.js'], }; module.exports = config; diff --git a/docs/src/pages/community.tsx b/docs/src/pages/community.tsx index 1cd9830dbf26..52d8bb33064a 100644 --- a/docs/src/pages/community.tsx +++ b/docs/src/pages/community.tsx @@ -23,7 +23,7 @@ import Layout from '@theme/Layout'; const links = [ [ - 'https://join.slack.com/t/apache-superset/shared_invite/zt-16jvzmoi8-sI7jKWp~xc2zYRe~NqiY9Q', + 'http://bit.ly/join-superset-slack', 'Slack', 'interact with other Superset users and community members', ], @@ -37,6 +37,11 @@ const links = [ 'dev@ Mailing List', 'participate in conversations with committers and contributors', ], + [ + 'https://calendar.google.com/calendar/u/2?cid=c3VwZXJzZXQuY29tbWl0dGVyc0BnbWFpbC5jb20', + 'Superset Community Calendar', + 'join us for working group sessions and other community gatherings', + ], [ 'https://stackoverflow.com/questions/tagged/superset+apache-superset', 'Stack Overflow', diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx index d57225a0d797..f3781a4039cc 100644 --- a/docs/src/pages/index.tsx +++ b/docs/src/pages/index.tsx @@ -249,6 +249,15 @@ const CarouselSection = styled('div')` } `; +const StyledCredits = styled.div` + width: 100%; + height: 60px; + padding: 18px; + background-color: #282E4A; + text-align: center; + color: #FFFFFF; +`; + const StyledDatabaseImg = styled.img` width: ${(props) => props.width}; height: ${(props) => props.height}; @@ -427,13 +436,13 @@ export default function Home(): JSX.Element { </div> <Carousel ref={slider} effect="scrollx" afterChange={onChange}> <div className="imageContainer"> - <img src="img/explorer5.jpg" alt="" /> + <img src="img/explore.jpg" alt="Explore (chart buider) UI" /> </div> <div className="imageContainer"> - <img src="img/dashboard3.png" alt="" /> + <img src="img/dashboard.jpg" alt="Superset Dashboard" /> </div> <div className="imageContainer"> - <img src="img/sqllab5.jpg" alt="" /> + <img src="img/sql_lab.jpg" alt="SQL Lab" /> </div> </Carousel> </div> @@ -461,8 +470,13 @@ export default function Home(): JSX.Element { </span> </StyledIntegrations> </CarouselSection> - </StyledMain> + <StyledCredits> + We use{' '} + <a href="https://applitools.com/" target="_blank" rel="nofollow"> + <img src="img/applitools.png" title="Applitools" /> + </a> + </StyledCredits> </Layout> ); } diff --git a/docs/src/resources/data.js b/docs/src/resources/data.js index 08d0781f8696..49bc554a4dfe 100644 --- a/docs/src/resources/data.js +++ b/docs/src/resources/data.js @@ -48,6 +48,11 @@ export const Databases = [ href: 'https://dremio.com/', imgName: 'dremio.png', }, + { + title: 'Databricks', + href: 'https://www.databricks.com', + imgName: 'databricks.png', + }, { title: 'Exasol', href: 'https://www.exasol.com/en/', @@ -138,6 +143,11 @@ export const Databases = [ href: "www.teradata.com", imgName: 'teradata.png' }, + { + title: 'TimescaleDB', + href: "www.timescale.com", + imgName: 'timescale.png' + }, { title: 'YugabyteDB', href: "www.yugabyte.com", diff --git a/docs/static/img/applitools.png b/docs/static/img/applitools.png new file mode 100644 index 0000000000000000000000000000000000000000..66b7b1eb4f375844752a77016c81a62aa12d6125 GIT binary patch literal 3658 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/dashboard.jpg b/docs/static/img/dashboard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c1e539f76e3c90db2c1c79c92548fc394dfbbce8 GIT binary patch literal 128565 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 Z59}2N{@N@25tb;M5ct6!gnfVTzX42-2<QL+ literal 0 HcmV?d00001 diff --git a/docs/static/img/dashboard3.png b/docs/static/img/dashboard3.png deleted file mode 100644 index e7d9092dede13665a32d837a2c285f6667f28d81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 728491 zcmeFZXH-*B*ELEL6h#z7q=P_Edhb<1YCw7i=^dnZLa`wV(mMfZ(xrC-7JBa?KoF!8 zLJuT_-1yx0x#Rx2pTqn2WsKw;GEN!UXYaM<nsctiKG#;IAg3oMARwSnS5wv_Ah@|t zKtR@UofQ8`CO^+T{D#n1PxT2w^(f;u{+}QR6Lm)*kboP%f1QAYke=Y$pF{93c|wN& zXa5=DBLd?8d`?6_@YaQZ<bRIQ#&7@peZs%~ob!KgiSr5n=V<(A`9%Lc`sRK<@qhQp zI{uu-+jETtzq#>J&D58G;6CS{7ooZy#{mI>B7wTHl0gvR-qN)kgBjZH!>5IloUE47 zk!p`DqaU&rzw*;$Ut)d7%EtP5lJz0y<PsHm^gE5fz~*jTUi+|cyG*@IeNXizXl_he z1i2Il4}}LGJD!J)N=YQWlNADqlH5@wApDoN>%>w0HiCes4<iYPuCxBbTem(T5vujx zKi~f;{`Bv6(hKhX;}>|h177Jau)Cr?r2nS@_;Xv?d;KYFAHjJBi>U8CH~(cA|6JvX zF>4ate(doloxJnl?T+`G|1_R|9>bkiibZPl<+w^+Z(QcJv40+0fBe`!%}pWv*Rc%( zD6U+I+{|P9hk5az@3BKfvj0~4G4a37t^=*eZmiRN*{A<DxfNNbuU%iH^w%R*{>KZf zWD-PS#(0C?{Nw6S{BrY73(HQ?t#|);fo>7}GX$F+-1^7K9rc`+^`*kJI^CUry?_(` z87kDT(EVF@ARsE>S6qqsk}S;nuNN32xxNT;>=F6rb!my8M9;Y#6#w-Cc{lE~;D)1} z{&hXSYQs;W0`0-bf4zV#HS5d&4Fvxi2>v$^{QnFDtgc@Y`u|_cFoNWv%KP7&r&tUM zvHL*Cc3#zLt$_B4TJ>8lojkSS3?am6(U{9$E!%_D>x}YYCZjo0>=ItfDSZhn5J|4y z%u6`Aay+A{ZC^a!Kr&bQ$@UaRn%Amh9(4iwrQYhZ-XX0;gz8-VEb<T0(MI4U=F9`y z>RW07iICe1>}9?a6i<{D`FXDK%0*9Of3bCaJ>5DYUiFTA`{Yqggock^fk@c$^|SZ? zlZ*tayJN^GtrnBlh9BlAo@`C9FA8}p{?*rA>Fh26X1l-eU2O5@)GyIWdZha>mWuN| zin#U~(Os>Ti9%JM!&Mcjpo4s*m{rS58*e<gYD&T$%ggB`i0E-p%z$RU{A*Nw)!zN< z``d8htef|FA0@J@-bUH265P4YM+j6@&k`-;(9SVwa);X1_;+qtpY)cVtAO50Dg00L zzaAKcf6(u)ChlD4A<Pwv+vTnFqoe(c<QTOn@N#3Au3f*XL1+Bx80C~Orm9GMF5)=s z92ju62i>fndbxNr3iIpTSoJ>ut^<LWYrPchYCK6(cY+eHG0wHDWq}gM#CGDsd~z86 zJ3H>&CE15VSnl4Au?vd2hM&9~7ES^O48vuA0nskuH)Mm4e&mVFoZ*nmXk0t>Y&m9u zSs~)`8#we8#UjLav$_)6qH9!X%B32g`zelAU|=Z}#o_&#<j6J2xcGTjbFoDkiW9hF zAaI%e<3`sx5$+08!)scraW#LOo+Ii1Ogm4WZ?4)hodclHZ#wxSN!;JH%%rKIBk|&t zmL*0+nKg%Gf4P%~y$^VYBEn;)q4vjzyX;!=zfnt|!7P6U4$G|RBk!L_Hg%MwDtN^9 z&Fn?<#YmFeE`!!j+S&0B34aNq4!&JiZs`smxr6pz4x<yc{jk^;KJ<huT&%1}J@v_F z<&S_qotzZQ_CS~d#aCYa9l7n9vd$j~w8+=N`jUw_7DC|j%+skcVTaxXpZ#yaaOwnV znfM=Z4941d(wt<JEJ+`;n+K;^B2p?%>(qt-6zfY5Ux#6iNTR;pGig7h&6Ia*GN>@n zm49^MX|m6~*w+<`?9$4S|IVyxMp0gKV3WZ(HLeREjL(%Rei?O%OOL|9ftdhUAeN2E zOgw!~#PK@y+B-?-52dlJ2FeNVkfU+lT4)Ao$Ki}Kdqz5xjlW~XY*l(1Q@i@oj$x7c z+a{YvhTcB|_E(j{%4@23&!aGu%(5wt2<ZU<^X5TKflgi~SVM|1GBxG*KoVLB5`0|Z zzE}r*6VJ?}2~0h*Zbp7`fybxa+Mc@D?z>4MOOqi7ic-IN$AhF1*w_ZJ?FSxBySR+6 zis;+mij-ri3<uNsIcK<y8|G?B5i$!iZgcJ{S9@Su=nJ@`hm2a4t6|ZxQx#{(iF3TC z?87?%q8JFBgQJ|3V{%C}`6A8<9&zD@low&wSSCOr1f^O88BZ{#zTY@r;<^jIpZPMr zdAol)K6V`5?sriaCg<}(uJ;w-*M5b3XNSC%xFSK+0nK<(<S)CvIN4xch2dNQ3fH+$ zMKxXYU1UF(|9W+vQ(jk&f7JIyNs%e!tVsz&{{^>J<URRCn=icwTx-{tR#!54brf7* z6kLe*xfnEbnJ>?^XbF1!Ip=oYAq({u)GP8srr<>@QzPl1k=ytWQbfA2;qV-94o?i` zG*PzIXF&rqO7^*4-QbbAnd1i*_U~j7F43oU??`DRoS|mS@?l$xshihdwJD}*taAqB zNCMt<hJCWDS!z)~sc%586tH5Ro!kyZu?UK^@7*~4K0W5C?1mo{%@o0cEjfXLU|wv* zz`JL6OZo~^&&rxuN`Bx_F{<zH4OrRPgy-^E*Bjktl6UW9kq={C1L$BN&18Q&hX@FD zNFHjfbdeHPnRFU052pb)fZ&IjA`Z8X&I?uI03KQ4+^K`9iN2d-1NpxSqZi-YzW%DY zJJGJM*eH3!2WpV#Y0=yic07}w#9Ib8<y>U4+fL%N|Mta(O2)_?dWGR<;6PLh4Bfp> z5k=bQ+8^)F<B??G`~hYCfZeQN>rAk8?Di6CXfB^)&m_(2103YV-TQr#wl6@?I-l5k zd?u{CZ=AG9?p%LL2y9>yS>~D$@?-=<qc-?WcsB(sZhh|*7X5EX{Xf>W0&f&w-B@Ii za4A<S>Ys!dOQ_#b$TMyWZwpK`c&tA-X;|_5$AG?-ho%!rUTGw0$LXa{{$f|SxxCx5 zfpmi>n;F|&cA7*W|AozJGd_@V2!jswGMiu4N@P#r^G@`gey~JBk$Ua|M{-rNCZGq< zkQHHsTx#bLD>t}Z#YVTOz;TED*{ul$dLkRne2CCDw6uAnXAGm{Z;^_@mS0afbiXMd zt@MP`Dfow&<lbNV>stFylzi8Xb(^ahTE>!b%w<D4?a+Q!YrXH7Ej8}(aU?LyC7otB z2X)FZupV@fZ19<I$OP=CFhc8xN>6u5LYp&%i_&YKl0og$@7nbZVaX_?<?b^)jEuC7 zQlnCLHNvW0VNnH_l3rc#)Sj?n!bXveOZy6hafO9YM&Z{#_2iuhqNatbSL$a3?`a=% zNcq~QKl688n5zewvC;}yl0#zb#{LS7{CR|zWF!xjSGo!{BG3&k(Lf_XYpZrdRLt8L zxo0L`=Lf%@N`?LYvL~WW9*A6~I9*z52f+=L<ajZ+8B<_^`>)XFSr5F?!=@L<H4xy; zRw#1<=y(GN#iA5^_Ai5jFVAcHVAp02dp~9$%_)SgZym0EZo1o92F>?+2J2oTbaagE zPkefIIF!X%Z@_PCHfkv;Krcv}Q-a(c&@XjJ2nJPKwcpQSBU*YEbIEVf!GX^riRO-J zggUU)in%=}&IW3#6W_q|Eg>o2vmDu@1GBJ$l>$bYh;J4UT3NZv>r*;ox(b1+@k|m* zTexQ#YiI#RwROs&!65;NJrRob)%&GhKG^UFL9XKAP-GVQ%#9~nE0@rjF->Jxbn9Fu z`N<VymdJg{QQewd{nD}ieK`;mSv1~(+uc-2km22biy8@R_#aHv!^K-uFUBANRW_Hq zO8dyLFm?WWO(RKADJ)s>iy;a^S)p%d@pq{PA5N^UM}4{bi<hxyky6WlZKa7Q7@o*i zk*0CtJh6DYpeG0@zss6Bn3fjrVb+G&bp6@yO>JLN)*-uE5s}1YtZi)hJKY1KQEC-l z>=M(aR~ljnm*<(SOup-gDeQ}fni4YdSZU@BpJ9pyRX^90l9aj#o)5PkJM``a`y36^ zC31}st@&Tlvl!p6+Gmsra8Gy>_+Umb%7ialv<~LJ)b+FkCuu(GwO|_$=Q>A~B1_+q z#<#oOOyf=Vhq$LfQ2XiB0Kr9Xi;2%F=}#`;iH;xX)#59?T40NaqhnhB!B=Hd4iiU) zfUig8UJ$j!LN#$;*;7}8<Vj@er$@S<&#Qe;?GKMqCqY{h5k?3Jb(U+(0=rJ8ttd^6 z=Gz`v-kbYz6nHRk$}m^#T1=iKZ@I8?d(El64Q!AMzR#CP<2I*(*fG4U^hG^U@Zy=P zPQNkb*sp*&!*rD{C}{6V>Xj>d%P=So-m7V4c-Vc^WZ5=UBZK=Sc5~xTQnx2Q<pP4) zG>xkhLs4MPU=HmRlbr}XLsvu0{FyJaTC!PhHY(sE>l9G?lj~3!-Z%YNUn4R4qSzy@ zgi7SutxceXJPJhN){V{q(+;9GM0~am>VM>Y(JfTJ3OrJ)DEUZi5l3GMd9f{=dGwuE z%07O`8`~RCty*V4$m${Qv3DlFg3B+-92;#;F42JR=N8*fJiIa{L$^i5&3>L+FLAiJ zWHl9kNCuiPC(pv<lLBj?Ung>q78f3U{BV@9La2*=X;N6QkNU17kRzbdBx)a4>oajg zBm83Px(mE6Gt8hX$F3G>_mkfL_qXDqv(sD|`5WrFBjJK(eh}0uxI`zds0MJjqz(2% zVv1XJ+!MV>Pm-H`+q-Je&~A9#%!X_zNJ?!mO&C0N2EH(7s7tT43RdAx<6~DC&U8`` za2W1n<v?Ie>k%7`<-uoC{*40RUdB~0*0oZtWY8H)g9wo%dfTZvEK_fT*~C)zV(-oG zaNoUpXBTiNv}ocx;vw*5rnGMwuSMH8j-AE2A?aohJ_^^Fm+rPK_}F7BzqxDQdoHw* zrG;?HZKn;{ub9jB1@HL6L(UJNyzD}DT^yY6Y0}y@7CW(46JzKiq*Fh#9oGOiP6vLA zD*PG3nPwn5p!;!mR(Ni|BL1hWyec8~Beh(}t>mry+fw_fmaWteuuIDA<<14sNr;cU zXTkWgwpa;~C48Q(E9|yBc7}TTjf71{+b8fAuj=3C{}l-D9X2AAh(kXs)#JJ{pLT)y zG+nLJqkN**qLIciN74Epuj0#I)WGl%rpvXFl)#lmRV=(J5?=R|7TVxY!J(dGvMgYw zHCdw0Njc(;UzvIlu+|}x9}#xZq)z`yYeT!49nv7+y{-Ae1dG-XmDRpDfns2{|Bk`q zpZ6?M?YMLX&fvIDJ?zi2^MAP<`Qy6urb!gYX2L#t!fR;;$S7DI>pKpMDt*`G)EQ+= zI%@oV^!|qPM;3v+p@N1ZZ*a|<48`qh06~lc^~+oxdBMJ7nv%vNG$FNQ=O_n3CG0#- zw9Hs_q1kochtc?EpH8MHH7j#Qd9{nySEs}$7o3eZ_#wf&X^b-7dQI*yendMeNr)OS z(ER<4T6xN23ktjRpK-Lt%P)^+QCpnUVH+J<G62o2X~cu&YLmu*n5Eyu$tHKq`0AzJ z+N&oIj4GVXzdxgQXEd4Oo*7y27Zwp=6drgeq_u*ECGq=f=q9WIdTfzh#AlrtmkC=2 z_X=c!(E&xdB_tSTg#k1frBzw6=Z2o8KGJ2^G@_nI_3qNCsLp#i#*8b+v$3lVC8bu_ zqXX^2V*11`^3CB__`yKWz4|mvH>ElKMHg{e*SAP}LVxK1^Ah(4d?_N^bTg@;z~1r{ z8Q?0@FHV}|)STaal5BCtBI&G<o!xZBO&k(PTlKXXf&R!anXkfN?l0r9BiaS75OEsI z@|CoW{uQW^Yspt^`W+2uEw=e2AEGdh`4)p2Bl?JlmpzA{?n)q<qWn*pa6QDK$nEL& zno3cn2{S?|B&?M~AAQnf+Yxbg#w^J}zg43&72f8b78rMr+}*i-|Ed#n_F&PFd@O^l z^CFC^Av_@)Ga8#5$nn!{fM_wHuvM*`+kzD`Z27expiaW|5_I+1q2x1$Gx=7EK>zV| z?YCxz3QbWM5yz3#PbB-hmBI|om)y{L$5e@WhsL>#=Dx!ETv0Fh!04CH>JP3RZ97Rc z{`g1@8_lZ4AUlt+l~TfXqdJr5sb`ZNx>&`)yGf`Kp@a1bW6odxU;<0v!Pasqq^hk7 z?m!3h(IcYn$mX<rrWy$EGvDwn1IP9y<Z)(QRQnzNxL6eXwUH|;g=pOstA_iN-DXbW z1kkw^tE0E4s*;CDsA<0s{?ttW;6f`BH*B3GI#8h}2$wmN`9tb7rCtVNFVe+w9UMh3 z99PoyK0DhOe-G;5?Vb9;9th@4AR}Lk4+%4mfZ6agbE&7O`E;I^%!N)D31&B-{D#y3 z2lCc=iyI*y*A7jjskN{h9(yS4q6@X`^5|4N8hcRD3f>KTMt=-@>{}8!S6*uO`WeK$ z*>k7{g7XA9l^ZWxwC)AgOW3(Z$B|CDO>MHdq}Ny^7H%}pcpsOlOQD&nkrhq%H`>Qq zXGCv&q1Mv-2rv-$T(UaKaC-(y*s-Qh4ojCcoxC$9{JTRTkNy9M!SOIK5=BH$TydDY zZ&qni8x}XTEGXnRT1!Tsu<|b4ySdY|PzXdHT8P*f$zFZ5gYabd2>d{;CL4>hn>`eZ zn3)Q|Q)TAvGGD_bdnb?O0{3%1W~#faGFi|h%&twCPzSDUKiFB>J6&<H0NW{`zdWm6 z-Oj;C=2>?HP4t>=%Ug^6RJCMEFRWQRM4#>kg!P5~GT9IE^Vb?hLJGlaLXvYacIM2) z<bMz~o^w+d&R~UnS53&wFV0Pp2&|4&MYEWHmdLp+7cvxY+3w+wTPPud;L6eTq9r|B zW)~d+Q)$8;duqY#$GgnA+eb5QBj;ckrOjM`M-f^zH7ur)k$6#p<s5vUKdnYJKJ`xx z9jGtWRdPf5v?1Ih`bz9YTSsO=zHfF~S5NDH)7-JkLP^Zt`5NWL4+FH<sf!(h>>dQy z^If$Fn9h8ZTSm{sGs{yV?PiIyyzH3GhIapAx35!wsdiyTzP;E~oWg4)s@UB?n(6ZM zY(T_upwFLvaQ;^eXW;EQ!nd!F)@iW54RgMmB7{pd1FsUlGsZnR)rB0)dZ1NSe|~g| zp?&ImaH_cxD!NEW?KhYI(+Oa5`q`k&q=z&YQxjQDTqPmGd5c-7*UU<=r;#|sAGPIJ z1KXD%Y(TW1)<sPdV@_^;TJawEFgIF>^Y24WmiSUmXe^mwA#Pv+MCby<c#a?{mtGBC zg(NWT^vrG8n>V~acA+Gy+m}3h97iZ_`ob9}pk;W5B61fV3zJ9RzBCI7n}Cy^Y=()n zPrJ<y4qJH}J-bE!!inVolE~~OF$J0qq}Eb&(YQE>(YtDY1>425E19oybH&+83d$n) zaGGW@mv28X+Bva|hkg@Hmc2WPL9BFjhL0Ho{Q{`4d!b49o-cCT{t-`OZj=$ZYn3aL zHMkH_ae}$Mw;Fr(71k0Q$04dtO#hPUJ}_DNs57?@5V0roQgA-1Q$%YfBDb-?XeJ@r zKLfpF0tt4L0{x24RVgl0rw<lWUnQ{Hb}~+`>Y|g;j%SqPCx&dTpVd?0!wxR~ba}QQ z)C+?Z`>G=_kiyo9<L`+G?+>${mWUOl9j1H^tah1bDNw(q&itaI3gVd_VNIFt8IFz} zU7jfLk5eRmeHt<U#n7DEIn1&x(4A|B$Ji$ryWJW-TU>gv%eJO^o8lA`7)c#VaC6pu zkwe<;jX02evBf>gShW}q{b<%)k308Se(v;h98Q`i4kT&wqB@PwfWH6sc?1uNj!iE{ zZ&wWf>Pufm_(V$d$%S4K(TQ)E!+~uXQ0|V4k&Sj6!MweN&OQ!W53yK5c_lQLcHUX8 z*mvB^te5K`$D6q>r8Wq9aUmqKGjs&CZ>5mEU3ud%@JTxRCu{1AKm1xG+&e;i_1a$* z^RLRgTfEoocW0|S`}SbXHTI)9&}y%_>RbxNK)-nR)l<FfhlQqf_KD5#2=lruqLQm@ z&*NSOuXpmUyNj*$7Q(N^h~4O4DFh$cH(OdT)sxojdT$Bcd#v}v<1&hLzS(s~Lo^74 z&!$Q9_uv6DqO*Y;!<luiGu#v1VIK4bV3|NqmxYEhuZPk6b88nv_ip4$dVlV^HC}Dm z4gg1>%M2=vfb!^mE+hBc*w7QW^%`1KiWPKqsaK{~Ot7{UZP^|$fEN(fr_1!acGvn6 z1Za4SQYMQvG5p84-~EZ~_+46t-wL)ruBXda$E%M?0kcGthVEroTC~=I5z)SK=L*#a zLE(${+O)4+sbU?e<QK*Genf0sUQ<Ur1dJ?+vsvz6IX{uEONXHZ2`x{vnv?$26CK;h zPa7v&)8A5YFG0X^#^RTChFv15C&!!Nu=R{u;2XX6v=QZ)r!twWtpLDQ`1&PuBjze; z=qmm-=(1H+e%Cen^IC7J7le+AHF9u5hx(eR8b8Whs>r({;OOUy%~9KpFT=?^rG;^@ zJ_Q_FH2?v%Yep^=7lJ7Z+CP?D9TZY5)R>h;hb=cIw|gcDg-g>NsdzD1D6GP6=ymy( zDZ-JlQ(etU7_%xfC%`!OP<7U5%XqN|L-5pz{@5(wUGU)^l9(i+eL=i39eXim#Xw?Q zW|2wIGi}r9#e~C`^c%-B3yxN&d(&2~h83#;%|FR$QkqA^CciqEn|=){;}EUq@e?O} zmDex^p|`KF1WgoH4DFj`hQC*TUS?F2=)T+pY|7F&m*!DE9i(x;7G%ue@_J+9DQU)- zYUpw10`D;`Ut$7J*j9N3*a4rCJsoW&Id3{?*Y`w67|Dkp>R$LHu|~+cpiRl>E)YRw z&dXr-KJEEkz`9#a>w@w!s5#?8PxGPSuIMMP-Ve=&mtx5R9WZ>AyN*%_80tWB!NxKw z)+Sao!f|3sN=~I)r|XKQ=W8bf>MGSu6mbqA36m?p+ycAr8zV<~nW;afnrug;C!i98 zspY@LC6}gZiFS?KLueRUaM;S$$(qvLUFoj~JOkxK^(8H1mp7_xfkiNw<Ew{%E<kz4 zV_|T#@-vvH6Vm2}hR)a*JC+FJKCcgPS}sg087&7&q?HbxE>CV&)Qo5mLG361FnR&* zIuaChV1U!K$LzvrdA<_d-_0Pf{bR(~Xtun%tAr<jx^zsCu4|$gSg*5mhO<4G6TfTw z5+Z*l({I_g`ue8&TceR;@HX73`-Q13)!P%6hdnMmRSocRePinDodVtbh1p{|Nk7zw z6NY~1p|MGNKS&Hhg`a9fMqTnf(rtKmfjDaPL(VCTo4&d9*udx|*nE3e;4^u75Pou= zm^rb+l4%n`eJxc9A=5p@RpT`LB3blA;;Bi4j@Gxr(eom8x(&GXujTSgq*AVmsuRH^ zRD?O3<hob(0@<eY?tFbhFhsj`F?aMqvAV07lmcEL2{?OX%;bizvacd$$g!$AIbY!r zY4hGfRop^oBY<@q?BSSJbqcK~MZ?Bs<W2t0UcyE_eqNi#XWqv6TMTsQlPT<wL{1ZC zn<|=bN!%Z}H_tW%w9tb!d2o6yJH1Y}r1(O(X9iuGh&ca6hH10v42f4^{;4O;Qh)!s zyzj<`Ju#JQstL?|eOgNWZT^<D@ymE2aZ$L|ctPBAaf?9>*?wHA^M--}0Kr|g-xIJ} zB&~95yi~wlPUSh_H6Dkp@d9S1Qk*vyQf&?C;?PLx=bwG`1_5gxN>I3RPN)q)EJU>J zUQo~pD<^TN+Y)2M3RYjm_KmMiE0cY+<~A%(0edhCh`Z0f0Ou)ytj>^dWcG(&CdkXJ zFfG?&Os-sLlXEHvX!g>Rt&=&YFNArlIr~YPo47}+LCL&*Dy3%ot>w9VtW;duK<t!L zvGT9Wqk#Cmv9)oI%R(SHuY`2TMX;8XC;VKUY1@{&17uNq>8o@dk?U-@TPEV9i5x{N z;gtzw{gX^eW#Zgt3E)R~4m`Dq@6zgEG@L~)ghLMawW>+i8niC%3=d|gijW;8IR_cE zNBQk68Q&ktVyltOjsMXKKK8B3sxgET-|P<DuNm9qH?j46uIu3d!tGu{W;3tJS6Qp} zYGv3vF^<2mH3r6XJ&TY~r{dD!r3OC#Lh4O6Gnhf}tZMS=B2uY$hlft=ydq!x#_=gF zzeNK^E%TedV2}w*H=bpL=3{4p3}o~TNXgrs^3#|?Gm7CxS<S(0Hv=9jvYF9b$fK#g z)+^gU_X=xzgqdi4taO!hhT>L#qB~KXU1xjW8DPL+EzLuC8<WX=ZQt#+pPY5o0fWg@ z_o9WA&-}{XAFc~ezh(_~M?rMVJkGIHKOKs1Fk3f9#850#y0eVg<pRXEHv5xV=X_W? z1T>ARlNuSs2mFq&#LIV4akyZ{8atK{+*CLA^^j2zO-l{7ar?{$if4A+qcxKU9@ay& zH$oq4Ga`wmXn8I9B|MkEio^wp6h^M)yvd@Y@=Ln~JR;|HhEG@%Z}x#i3<eD=T)OlD z>a|a<$>t6G6nZ0(K)+Xkdh^&$mE@vxb);p%*y(MH-$fFZk?ej0@_~fohX=v|^DoK{ z)Gaeb!%GY*EOe8yZkgi{DK{SBJo>Z;T;x$%lJ^a!B7fs)wJa!az(Bb_gT?5NyVDQY zOu^!Y+^qrFk{hq&*|JizN9~(-6x2jn(M1<z6V*%YBb&jEzXhYlsa0=N`k2+_$E#4g zo=8A>YJLb~I++au(|1p0mW5)Tr}XQ(uXHu5Uked17e}e4uf6SkGBVGv#|p;2H7rtF zCL4I$D<qjv(5JtWD|^Obhc=f?x<Cdu=53%{hi+TCM|Ni9qxr#&Nta%m;vy48w}dmN zy+4Ei(O@=3kvSc_zDjnRsW#SjuG+eO2`1{HJl;hdulhG^Y+hmH{Vy}`FY+2lN<P)$ zx(q9fQq_|Iu|_^~<@?b3c1pid8(ZHT*k_eEca>0_oixh(ba6?j#<c!f7iM23mWC&7 zC_jwig-#l8W|cdV|0Ql`rs4?Z1%a}jlTy&1?^{(|^od+c5L1h2jvblcK4J5KYS|c6 z)ghhD#6T<EQFS4wu4Sh6C0;@kQ-E39@qDGvvG=5JMgypvhcZP<Qv|G+7j{EGjo;H9 zP3B6llf-;E{Fx0Tv;;mG|8Y(1<?!c~(zPkts|5AtDJa3TQN_O7YGmQ-laQAmj%Ar^ zGS6)&7UoKnF6eWR3PErwXKRcL?nB9QPgzRaltz%6*}-7%8~cPP_X?%bC7GsV3~FB! zC4kn%Gl%vYi(swdBUqF>&7lzx;~ighWYrobl|WhTy=2yubZJkW5{6gznqeauB4Z?q zOi83-6|liUPZ_j%qLltKmxcUlXV%NbYjKxV6z9UO)6OMk-fNLOi@dFYxUL*AI_Wl+ zzK`F4#_*qf^b((xti$+2_V>+j1?<0<JKIYp{b>`T&zRN>BvSq01Ie03Rh9zu-Av1f z)%BsXJAOuyn@bIP$Bf5$rQ$tc;Lglp5Q@G7-Wbk6&4^Y*-@05VM2L3JBzHSfkk1Ij zXE%Fl&>Tx0a<DzE5O5NX%IS*-3mWFc@Fy^eJkxS9>BBazhdo&zIwwIci=whf8{H&p zd@zf54?@rTb(_QUHs7DPOp#pAy5){T0FPcZ!2@x0Ce4D@>0EQ>;(`(1OZb}FI=EzH zy{K#=U>9$<q?|^Qpvl1KC9e1CqGh_pNsH~Ev9S32A#(9XJ98`|coFL?1Qw2=?58}A zXqwsURIeT<Sh(s8?T6sxQ-s#ILOZR!B%EizMtmVdAjLMX)^u)i;E5!wrDi{)gz{AR z24p&EeY>mbu$;2FHucuN`c&kxQh3PFRt=d3p)Zo$GtP$U=E)eWM4e%(?_*NnP1=U+ zv+ZTmh#XPv4XxZqyZ6V^FGNbR#+2?uJ2$=PM8k@jze7G@#e#KWdYKT1c4NfH;0z5^ zGgv!xV}3cguRRbM97cI;-?4HsVMjUYZ`AN2f=<LQe+yM28|+TSw~>iFl4K@Bw96P_ z-}?F-Q?9h$q|M~G1I`ZzYI`hyiE0O$#Q&91;jRg*S%dTBSDUA?EDBx2xiS(K2@QDd zT<^<swopd1Sa|DFN3cFVk8-}gN!tW+8p}(KAtUZhWEQS%q4!F}mlK;Kh+|6mb45~0 zX5Q_oQp&IV4fma+Bkz;Xkr1g)DPHvf<n^f8FZ)(q8TF4hMm&hRzr7~3gI)<<Yxl}% z$+Z3XUOkHF+MkMO72aFR5}4px4y-sOn|U~Sx)N4NA7(9ytVd1X?WpNNFI<u#c7+i* z+2}KW>%>#g-Ljc7E5i*fI)R^Y_k;;|-g?ZOL?hFa@s@(Yy^EX5#NzBB?H<vf?CA<b zHsRX9p=*Az(Y-F*N>`;sYW-5<MO>O%gY!gjEgc+Ygi3Y|fL+r}BWvBxF8Lg^S~}%J z0)_gGuNYyc$h-5zDYhnEq1D_EcOTFPHG8fB%tu;H*uar0I(@SY2HzLNJW%+PgWF6q zPTRvS-ZRPQetu=sL>Wlz_S1{vhZ}5F|M*JPcWz|ehhhUixvRFq@MeYd@Elsl(UhJG zhx{@9Vl|sNCp9qtc*H1=ekQMQXYXj9+-Ar8x^GoO4NZ%jOPL;;QBznySLO@!5#yRv z`4L!frk(xC)L5kiP1RHhkbR=C?-QQzdAs{-SIAf}mO2D!?n31u>mqI5o!pnOr*$Xq zgwh4f?Rb{{px1RH=i*E?v2+bF-#P>^>ojlp3d2~uu)}stFSZZkYyIkzs~zA_woJNx zD0^HbyyNGxW+!wuyDL#k>@;u$<?q}KKJD@t?X(;!v4S^qr#$A{o+=iZ@@?&MQi<CT zfqnvT1}`LWX>xPM(WK4;o=SXfytO?!xFQe&{cZ*c&PM)nxdZx{bz0<8g|6!jOP5}t zIerT9tWOKbtwv6kg6&daeIL!61|w_UYUY+y6*=@(3-7ewz)PXmnz1qMPpE1ASwbx0 zAyLc#_AQ}VuUWIBd*M3dsoYL1nji~H`Q1fJ@-%KY&{NU?3)+!;_J}rA5)m>zHH=gK z6N<;EQ6!3_Y2<YrZLu3%U>&P5^P8z27=;?_Z)b_%Si+o1)T^9x?6txo5WUt#W5zMX z&k7wUf7hQKjm#r|@3rPbV2dAVC)ZyeZzg-QcZt_ab-0)R2G{ki51=AmU^)Yld10=j z9%};T?#<dINuVjxQzF<a|G$!w@AO;~-LE$&)ARY=f0yBeIq$7`le?*T#`(E7MCc`c zzgC4s?7C&eI>i0`1Gm#)9H0Nrbkn1XQPO;G$S81a!7m)|h|8sYyL0TnI}2TXZ#J?# zA)3jW8yoIpwP8}4Ku=sggThPe^sH&XG2NToZmHpND4CL=^>`+k90|&!R?kA9U6!27 z-R+Q<^2^b96wq@%=E(7q1PK@VDb+{>=?V}<lw!fg$NW?WQcQ*$b0U8<hyJYB$3>>! zL-2*9g=xD@^2wfr;`@}V=dR-J+;QnOC(_ivrI@;$S?v;uE;^QT*(H}OSFRpYvtEvM zVfE^Q?wU`)VNA}PC$`sa_QOL_gNM{y#7nX&M@3Q9D2SdHsf%9mSEcTPREydW>@$WU z%PJogT>J4>BWVHWJFw!Sq2-zLr{_DrGgR0T2Sh{jfb~5_l~zu|HC9QhuVZK}%r`od z&OW7ASyBHkC>60b$ZPsNVAW_jRiwSX4M@7&_75Jk@4hxO87#E#rXF665-kfSI**|@ zpM#{yW+DR6TIbiyq*<JLZ!J5Vxv&PA+4&7>RUNNH!9P6R^al4G9|59NVXF>2vI|QO z5wwr%QUnn7xvC7W^Yz0-5V}x3P7lFdQtInSmnm1w!k;348xVo6GO5>2;?U;(nP+5% zs-KLZ-9aDxB2J)wDEmNIF`XlpDul^|<;5M^n|Mc@7xBBe``jzG9xHJtd3AoHl#}gl zT<J_AawE}8ZP>sBN90Q>HNpGK5+YMu)+VArj`yDB#nvrBJsdr<U)#qAcPaN3KE=GH z9I^%>PnW8UK7-B=5(naf+>;sn9O(mr$qZeL!dhkxNM3~ux=(nT55OSqmFk^bs$QIR zy5}Vn2qSe0#*;i+M3dB^?jd1sM-&e5t~=vTPhBQ;;%-~6&krQ)73`5sR``;Y8CSGn z`w9Sji*5cxfS5Lht-aQp8(}*`;=aHR7b+_%fSR-8U1=wx14xP(gLvDb7N{_##;R|* z89y4V{^iDrXfXvLnvLX)NZk67P2)nHe`q)8+*u44FBhVjJ-W1aOYM(;0gjtzr!EN> zV3~8_$Zp2&_<-_wr$K^meoGIfb2V!{5Yw^>UZ+V`emP5mlt?YSy0Y0F@OH-2VEY<{ zvmOq+H82D~x-gBsU~)=m>+N5q%mSYLT2>JD)HqVXcxH<j=6m#ez~jTWGW}Ab-TNE6 zCz1_J;)g<`K;n74FY}Q)&?3LL39kqkGxl7LV)13@LkfD)PsC)m)$l3L;oGYlM;Ii8 zjDBrx^tmMp0o#=A0B@R6So5sx!Y?n5i|zX2#Y>7kU`<`uLjBz-`scc_-DV37E(oDK z(OTj7l322kJ^HUTLL4DiHCa!3tEuiY!p=d{K~s%xa|@r>r5Pei`951vUL`cIz*>n& zkO{fsQ!3*T{J88l+iu{xdYiVm70SHfFlW3~X!^?K6x#?mcl~%HWx<C31$I|Kw7{V1 zykNT8YJ|j84j#GHJ<1(dCS4tsx7?%!I4~Mpn?uN0dhT3*z?XqyO5c?;J$F2lu%AJn z`kc>uPrU!VpGE2s43if(EF-(kz-AeON)>ua7M$a~=BdCY2gkb;`WZ5<)2)X;Y7?)^ zRu%2<2R*5~Tu--M7(r&a=War8Gf8o8^5>*e{d^x}5x$H&bm_)z5|d`W81Zlf#7bWo zV}h9k@;0FkSuVwh)C_s?2vVQphv+FfV%Zy_l%usBdp2nq%z1Wa(PTO?_DhUMzUDd8 zm+uameo7$IBcSjuUzh<Lb(Ob{xLQ2b0gHdMA4yVa+Mj=Hb}Ic9Dj%N_nhp?L7s~u( zb`2XWM$v^E7!JbgZ^6u*J<dc^gLuDa%nho!7badXHtONf-eF$dF2Bb$6$qKLQzLOO zi_Y7Tgx0UFHs01VijEZY5fEi>ktwB<=L&w<JU+*g9y5qba+ru?PUgp=GGqe$IUMRs z|C}1bya;hppuSx%K9bchgSY6p?vK7L7+_V<df-MIK6#)I4P5zj?5Z&4zwp)cn06uZ zgw*kVc98elJaQ`dChd>}T>BHV^{r3Sj=f2Hj=c%v&S;p+&b)5dQwM?P!yOVzn;BP< zNGF-6-@jgkuUARbV?5yv5tiFtj^r7TpfbrWg)n1jxz>oawtK_rI;5wF$KJMmO>}cp zj-zQdc3r85`c7)GpH*@~;%@9HcqOSr>QJKsA%3av9W*hf3Y(j+Cj(dR9EW}Z596sd zD$cMpnko@CUI}$6yg4srtldwvp1jku8M_Mx6(REr&g2VkYN4aSLg2YLS+Dg^1BH;p zH+--x<xg>X_1?b6c^^_fSPjSf4qZO|s#_5d(8LU^Lw9JBUHo1f9NWD&Px)8Gd&}K% z*PU?88O2v|hryJi(>ZH0lYLL6j?%;0&Cy)yCGie3E$YxOKlx5284<&oBA*R+cjs!5 zCLFJUm7k27=eh$ZRs%heov1v^v*R%Zm^_bhwP>y11Va2z5qp01UaVcjk9lh57>|L; zOe`u*gcMRwYb;uA-yg_-y+KAOEyFh+8RikPEX@-s4%7-dKPZs%Z129*i8(**z_VBT zJ{ttNF04(lsS_npxUBAi2r;+W6YeVs{Ng=RzQpRppc*~UGo=Kj^io+m#n?@Th8j%# zcog2i5k8$CfOT8Q&#StU^6Igre%GkgtDW=kW*UEbY++ZTpNnkG8A3L|SpiiN-E!O| zHpJ;sJ}v%ON#M5Xi?4-aP~T0&)Q9a!>HERh^YR<>Qzbnn1xq`#U-*ZNs#5tN9_dHm z>BQSrSuldRt%<^GZpKc)aaS#UCCQ&|@}{~ybQ~^8$^jyB@CGY`7|PKuA{ZdCOrr|% zZG9-p|K_Q`Q=XMbCh*MQrTL_Ba>k31AfHhKmJ$^U!cNd-y7_D2;yrg(O{2=BkP_F% zc1Ju?Po)7GA~vCQjsv_>bx!HlT4L_GwH#l6aLHA(Y+~)5Zj~9H7QSHG*e(Sx-LfJX zLc=F2)Wh~sn*vrx5bh_CfW>BE(nKlxq~xuo*3KK;S5pS@VD8XiUQxW`D#-${BEzeo zicTQ$D6sU$Z5>iiekVzE<2m*8#yrTvRiM-jUFPaCk)N_Eb@5iOSf*W?Z9JL1Epp(N zDdX`Oi9QJOIi3Z|z!GtAAUdI5eo0#Me)5mf)RUz~yea8|6ye4K<gGZ<RiV3BQkL@B zGl?8|_92_K*%O}h(D6PyP6@Nn`d;0B8vdjLcr?0r?Iyy@*s^PAm^uH3qS*u}=|+44 z6Hgj{69Sm*EHYuxUV|r-TEjSlAT*-8remhr@|2!KiE`Om*npyGujOa_*>Jwb?1oQZ zP{u=b@KvF}7w=sOH%`zMHX&RGeY*9K#rRzC3((~6jO$}ciZ`WENVr0G-esQ!$<~Tj zR4=vj&9VIOB?xJ@8?W~Jdyh|wJ<M#Z>>`C72JP3F{R&9i+#=Dv9~p@8P6o83_o`a1 zw11INm6>=@IKJSka~z?E);lGf?9S;hMr|+5<rY-8d#}AY*@NnXNu7yFZym^K%Q;dc zfn|g1_Le(gU0gS)0V((z6dHLkRjNZazZ@JzI_Ksq?<FT8rz0odhxsFj^>+jx|HiA_ ziFFP`(v&vfU0wn+R`YDL<@P|Gwg3dTl<!8vkSrE#2l^E**CJzu>%lD4sCCKev5p;6 zF3g4FoQP1TFPMPDUu7CRZHN%`gYUfhhEiA@)lbnt`^5vcBoWmB)#jI>T6aFUV&Y@` z4R#=5>*Y5-9hob^?w-gE8(fcPW)CuaSCir0Xn8$GaTMPLGIWA`rm3JW6fin=v&g@+ z8t{m(=^pnd<D-pH&S2n-i&qj4zm<5Ot7ksA39+(rh(6q!pblW5u%MXh4)@ic34q!w z%Z-)H3^j5_WJ%sx4CfM^iPp(}KPpP{O(TDi3^|0?$njpk)F{$@0jsV-d(qxclp0+O zMsHUG78hm|(w3G`{U4yd#dtryC&pzp)#&jY23(PE)yyDW)pByuhnP&Q01D4}mWt&m zgkSb^y+nQcxpIv#w5xO+L1%`l>W<fNax)S1Ef1S*Om~N#Wn-rtRLFm)2kxN^`Sm%M zHoKVSC4bdck43U=kOgSz(_GbV`P)*9<jFRPR5+(%$34wl;D!|j)s<l)0nvLBxOXky z$0bz;$a46x$sZO&#J5|?Wud9CBUh%BLkRb7BLAEtmU_U=QKNwy@N!XTC=Rb8DKl0z zAQwfI*xb^z>O#lhXDmVSKW-w9Q3@E3IZ?-^D5TSf|MD;@IHgqN+TMi|7+D7&u6(#q zo&o)w6LZGIw3-DXiLj{6`H(F-Q~PL<S<KYsC1k8veYeTyG;7RDRflq8u+go_t#Co? z`U2|S$B4hF%Vf!-`T@NncyX3(c`BBg%RMq^vPk`@tdSb&_}X|H+f!1^m)Ex?JQnP4 zGP@GA;hKCmwOd_QEf@_qur<cuIcw0;70qKk<u?Ca$BF~va)W_pw-;~XqvN`AbMu^O zK&qFq@*AVMFw*5eDsGeK68HLGYW)qeZLQj=Le&Im54wYGe4~+jB*=%Fwh(~_hjk!` zj;v<A;~2T0bklTxgmDxm%YNm0(;W0V>1{@5YVr<>#e_$5F>7I#a;^tmv(J`WJVK*G z=l}a#0IDsdh}~K&7cq+IOGsiMx-vE8k(tSks0Zh%*6T5F7npbZ>GQ;8p#U{zEEy<R z#3)Bne#W>av+VID*}hElKJF6Z<x8k?=4hf2E>^e^d*kS4-2JJ==jhWt?#A+P-ai)B zpCut@!qh?KpoOH2_c(`TfyaNGw!<|}<R^Fb8dz{wJP;(g)p)txOF1}bMDiCDUm3gz z1Z__qQ{;Ds%y0$qTXnRsNrwX;Nx6HT1@14V;urm6WxHA-qH2;85j|F<Or6V+k(49% zyY{Ts-(!%gH0n}qjmOjtNbaqfnU;dqy%;LwU}OQi*3Z4-$tD&3<|#rx^UhgEz8zi; zfzEp!V{vN{puKZ-DZ1z)x=vgsJQ-JZAHNpzwWTvJ-hQW~hNM=N2&1EaYC4?0`RG{k z>f%hNdBi?qd{^rZOWKtpV?8a2nB$Axr}dK&9I^KMKLv(hWqR}6Tg4+z5A~mcL6IZ@ zx0b7?+<)N_TFVlz$Bsdh^krgU-)}w<JEfq;jgR#GBj(KrC*PTcQ^MO%lLb$j)s=h` zyk|bEoDMLaK}HV~I5*e-SmCL;bQV;mB61KNgX_oV+7V<Us4q?3Ne`YT*?)nq76j)m z;j1m?8US0cnTNGRe};T+jxee!Tc^1>=HS20XaC>7aS+7zpYEukbO97a8s%6r8lPm{ z1v?6l{-|#3=~}gG33z*e(PE&y_(xSH3C|p7F)W__>#jz_eyqASo_~9N6P6#md6jkR zj)bR$l>bi3@#^#NYMLW|7JNG*ib*0IeKL#MgVysW^G;h+-x2M$wo_@4a-?&{6IhW! zVpZi3cc`$G%c>=#61q#qH{^3H$sap}O5FW{P-G|9;aXpy+3uB#avSp^OYs<e)mO08 zQ|TM(-e>t|zXs4azm={v65q`*O}xjI)A}|u_gblTdJX!-r;<Fq4{x$3357K0c`^)< zn4`UFt%ITbX3|b2&fPZ3o_K6}54*eA)W|4K7>++O2|f&;wGQl0p%Xz^UrZJk=`{0u z68G5s41q2y&+=YAeh4mC?K^9``055b>;p5OQdVi#+Fn?wHft%`sV(3|$l;Vnx+9po zA{^hp@)1Rm8$7~9Q7l@wxW8`jT#!_>wydrSqXV;O6H322B+8{KH!CI=cKpV10p$RM zA9*{Zhc?i(0DTNcxLH~)kONQpoSJo-we@N(=yb$`ZP1dVaz!XU9Yw#Aj3*aI3ktvk zbSP5(0uhMqT6hfcgg=f^{qP5@CkOClYs8p|g@N`$gab@Yx0f1YI#T&6jK8~mZLK&v z_g+yCoAX+{_1t4QIOis<z<hcv@HOVZJ!@dG(UQSsrYLbw#!rnu%QV0<bGzLW-o*~n zO2v%8n$+L!gNM+?3Yxc)I~kKorea*4d|&5D2i9$+C{i=v6&!x=HQ9>aEOWy|`G`S7 z6wRK1MaP4r?>A>WD4FHm`=%7byvzW{l>Pn;phV)gVN^67(6p|<3B;^-ysvpKwy@!Y z;{A^*WqADE!t`YygztYm+603%@R$SWUZ^wijN--IlaDmq26v2SkhB6;?lFr@Q5eh_ zBH6Uw5xR20DCKi5#R4R1@g#rggty_09gT+-#1gk9h`LOk->&E@sVBYlKv1#k@<>ym zo_H&ml0kg<N3TVSjskYtv#|b_vr4$!DA6_Y^Z2!(&vtH~UoViH=FL=^>W7?cvH5Nc zCjx+3l5bvO9_Ut+HIr@Gss!QLYqriiQJ9d2c#~67)c0qDuGEk2EhAi62~Cxlve`3u zbf1995u;e9C~tg=(1(L4%xGV(ya)XRWQWDDPGS#e-aIhJ-uIsL7qeuT@`iRc2mPI0 z$o2)ZRKPcF^VR-aNAOL^kr~g7<5-qqK=%7zo5Kwp%LdgHJB(s?SEFy}xi7awo$H*d z<;-(s98IqCC{a*vq2to4)ok@^&mmXxBq2$aw*sS3?`axiWu^7s;<~Y_fbO8}K|_F= zc-}pp2M1)m$I?L*vn&$9Sz!vHc|+ad6qn1LP6_w;KUwRQYS8U{*T{KPuyhtiLcU6I zHW1WWu(l{5ze%U@`PoNqJe;owecYXCih^qnH%j_VHw!zTt4Rg#H2g8vq&po~wikwk zIvXj2#M^eA1mu9{n6(-Zk>9xT>oqQ-vFi~>=ZU<Qjb_}bJPa=|kSiz;mo_+6vUaWC zZQ!Z=YqLnEpxXRCS}dnm-lAi`E4`#mJ_zpJBwgg7LD^%cvE0<B8xpFsyll8WgWeOD za7TK{01J)ONBf6~jzRPUkdUQkWj0iym!MMDhd+Hp>{MT7Up*Z@OwbNzo-Bb(G&qE0 zg>A{^Eho?6O@??(NArR-<%14}MVjio!DDpoknyj&AHP|x;5&!^c(T%ELXJlyRCu~& z7J{iax3)s@?LOwgR>bRKXT^A>B}v-fRdr4<+)sWZ6tzE)DdJ?0T<$!pjliPy8k}|8 zL2}jBAgm#tep+Kt_=W2xr{TsoTj+r0`D!}Pvhcy@iBXLe-_tj@5-AlfpId>j{tRnv zAY8-*E6#o(NqxB^7)wcAIfwVu(g5#`mw3zI3*mY~lq=o}5djyX&TN6=U11vdTNXck zdpk+QNt+=BwEE+Qxr;T=VYBCw*>cbtMf=D2;9uXaWmm4qyqlt~$^rA4i)Y_@Uige+ zf+%y}tVApGcW&TvBA$%WfYv!wB^G)qw=y&K9a~3)*$|=dD;Pkp))<H*Yz^Kuie&x# zsY_kw$1%Ydyn&l6G_Z6mN6c`<Iv{xMCCNTmID9!oB=jrlZXScHqds1e=fuf)X~v!9 zdiW#o9Vu${Z%&CA)AI2Cbh7oN%=bUM_X(x3Z|`^DJawUV!bN{tit&~o%2f6_fgein z4{65997)>XMsmTD?}%5K8yqdbiu=}`0fx)hzYo{0FvH@ymXf)mjK4=rj9L?G!$X@} zcuhJC0&v)b-~BtsYfr{}@mAzaMQDZIcal-JNdKTl4gg(A$_1~0Wn-_w(Us*<<_nw6 zGrU>*%mLp&lS3Pdl^vKO-$3Uc;AW|~wB2<s>>p^0tjCrCo)}hGOhh;tmcgDoj$%v) zTd&_j*;gLyBnt=owC^gQE;(sOL|?=sU-cz``&Yc44IpHi5$@bkOz@Svb{sa*uk?x( z<>8+Ae%h4LPR#p^Py>8Na9H}=xn!U@NQ4l%tA%e@_01W(Vk^Wu%UPF#rL%Rvkq{<7 zjPV_AtT0aXfCct<|0?`FQfW%Wp}(W>K*D{Q`<PZBG0<mS7=AIc=cxfP*6Y>Ev2}!B zJbm+lksU1Nwwm1%gg4I9iMqeKtoH)Fy!}|KNh+wH>tMNcwF^M9h0O5kjc`ihNywzT zwyKegZY(xx<ffXkuXG!7F0q{oSlggTuEdkmJb>Do3zokkabDF#l6EDqC@illHF&^g zbylwMJ^tYseC;_$nqXXMGC`W;HjX)V9qp@pEh5%p!87D0*v1}YnXrzxQzqk8)%T>E z?QZei;Z@IZ16*LWj-bOL;~FbryWU%w5?*<H!d0-|_cTKQ0_T|vW35}d&JC@;o9Nqx zn~B_p+>cGZ<{MO*8Ls|_U2E3{JEvamFSQThsUnX%op=MfW~Oj)gUeK}jzhQ{?Z+Yi z+gHuGxmTr|ashiLP&@KTG}yGeEIYiMUnXGhD<D@|j>m@{pBZp{80#>mh=~N9Mo|Li z{b&^`xe&jy=NmD1=(=o)mK$Au>KTt561F*(>>f1X-Iq&iK+zQgF9LzilcYYFa~~cO z4rJDE7De804V*dp9X7<j?94rzj#&vew!9J<vduuXTPIW>?Y~X^y~#ObLAt*=koleT z%nRRGEzfPeui)#sf4d>&hT7Ev$<B!7*Ll(wsS+peIe79qy)0^L0^-T@36l7@P~A3` zkKsc>1V7PGnolzX=xCm6yPj(yKL>7);0@$E7#xyE74P=6A~RfGUct?Zg^N8_uBb%V z-}<g}jgA*oJ%LXC(*8_XPTx|agdUB;7}r=PbMhEzmfw3^{PN04X|zXbWq5<EB*JO? z7AMYY1l83TtoapbUf^=(n)G9`45;Y>?@Z?vg&SY-w1u|StQakTos(c^Owt@?zpP+e zNI(`y^hcvY%V}tF(64AuN;aElJQe*mY@^*TyTiIH>s~*msYpHZ8%OS5%6HWSDEx6C za*4Leq(+?_3atBZbvyF}OX;Xlr5Rw6>rt$N(FRBfcV?<Qd`<CVxgD2}-G8iG`7RgO zcR?U}5cVcBakU3RiCD!W%_O?h_K0+K)|U;ubRrrt3u24{9-s3fO7^q!1L2NT#G+A! zb~W-{akg1-N_>k{n!$!_4h&0%@_4cmioBm}0U(w&9Gv@&Zz-<}!2<q6x(bQ-OOkzZ zJL*XQ(5)5R$e4RIBtUvQ@r}Q$`jNdl5XT@qD9IunHoX5i5ErF)_`R+R90;_1USq0& z<z+Fd;B(MSy;oHNf^oEYz)#=)U+leSSW|1aHM~W@f`}D1AVpD-uF{ki*r<qrC`hl; zd+04dq^n5p9jVegp@o2;H0hlH0qFz?Ed&yhd<*w^_BrQ0@AV${{{B9ffAj)Zvevrq zdCxiK7-Jq+tgv}HkkbL>a5QF9vN?pY|2Dk~n4ILYP7G2?c?7Vi^ugb&CZPM9qDZ}Z zrzZwt0$#SE-=$QbilPOY9qxq8bW1AooPh<YV+^{VF3h+-WzZklD!op$oLF_-g>~t; z3)hU^jw}FukES<Y&fvM;qbR-?Ax{j;MzB;{BdQurBv^k*@IH5R-qNU<<T=EtlsKm# z2J-Qr$^#p!-5%;$?!6Dt(X{pj%kxGzfwOTlKU8CMy!(Jo>B4)B((z0$`T18Mmfq0J z<LU-Dc}Fph=MH|wZkUp)q@k>Wok=aLl^FiJ<w}J#abIl^(W0~SgY#SG@gp6h4uDw+ zA{}OD7x`RRhhvA67-Y`}LI71cqcYhsoK|({w`a7GH1-nKg&#WJvvj;B@2B|u_+7B3 zOLS1?mOOjBNj+CY{`dVW>9rwrY!lDFf2C>cpLP_9=a8w=x;&1AW6ebuVjhp#AAfxj zcR5`>U!Mg5>k*FRHT!T)^e(0~AcWJCBRS*d^8~&(6z$D5ar%aVEyR%m)#nA#nC=gw zHfBTnY&nkbDc`<vBm?d{t><Fh`-9|CvqEx%H6RF$`SFBi(r9=FLW)m))Ra;1W)x5B zwo3QCVz`On8JObt8W!;%YV{M%+jCHHmcAnzX}>B~7wDUYMIQ;+?fciq6N>dX(vUS# zcg?L?;bWR*y5Q44IKJ3&)GJ?6H;=hi<<`b|wcUG`GPl{9xN_X|QrM&JX<T>f^Jquk zt61N|(xaR8mPby^<!OMdudm2(b;S$i1$!o|UG7p(yWf|#pj_6c8Bp4YWno`a&5u1O zNru#vH1+||U1iZlwnxjQii!M&@Hg4uf#$8pyl|V)D|ZUp#U{V|0qj5o&?$&b=iK)0 zsYRJ)D+Eti#xHrHm6L>A{V%Xd^zk8iLY2RCrA$^%wGd4>-*2yc?b)a)R*1VQPn&Qv z`&(xNEuyovEyVSi+8gPlb9c+`06^$Kvl|IG2~0EJ^OL1%r`?N(8Kd_52LVrw1wf>Q zI9EB|4<~PyCQ;@snM=xtUX}_@OKN-M00K@+QA_EtB!9b^Z@rb>l<gA92jfZNIw|W1 zeRdc>IZj81dP%S2PK{v0a+e@LxiUh%Wq414hNc%S;f|S5j!(8G;aRp)KM!Y{NO($U zzKDqw)9}@)ZuhiQFpXyEe$4~Esw!l*f6mL@WdNg^_9}ZN;q+pA!SDfV7FsohZ(Y_W zxcg?z%blgjH)GGQo?;p;u-oE_x{(5c$rJm$jBTrDggagpDF~g|7NCeWLr>duL`;J! z(jU1u18xwngj?Ta9r+CBS(y+BTN67A2g#1<C9UqirT?Pc;^k*D3#O`x9%Jvugrj6) zXe<T8W$Mms@tVo1ozf@@wV$pW)mXo9v5fkvezUjsZc4?p2yLJ@zo*k9w;zGDlwno^ zmMT+#kj!+24I;U=j<o3h$fkTR4gH%p>ctC{YM!-`B+i(Q*A_nG%5%+}k79kx0+o{P z4^u0QmKuDuqU=wf71Ng0*_5tE_J<~X=%d_L$E2U4*bbN)&+brJtSBf%Bdj9z;sG9l zp!u{9=Y(LD=a%wt%gQs(Rn5~-DXR!pDoJXU+Pyp#m8+{TPc)cw&ey+5v*|NndeEKH z>qA&qx_&yumjh@u!u(>^hVypxSI7#JI7MJ>MWK{q6|zGJhAgW#C7n&)qdE#ZI!??3 zjFuJ}4cDF}h=%Dm_rLypkXK@W7}TgfFi&|mq-o)I)_z#~rnIoohZENo>bnfz3E{Mn zC;m3EWlKKGZyX{xK5tg9Hv<Um+tFJ7<m5S2$8KBd(G{U(#bqHzaiPFiUj*QYLw4JJ z{gaV<k-NnUjKSUXL{V%=2GTrFA;eQ}Md0oIl~|>|6b;5Fv13NjV+yCQzTQAc36D;9 zsHE9bRAQcoXz(AGUEIaW?dh{j=Yg_nJasSoEVnzh&g9O#xccTBEwi!zFnG!uUv@{u z+}!xR*?1W1gL^F#RI^<i5~9VsRmVlMQr|busMuzuX%O5K*bA7|c{ImJM~p224B}{2 z2MYrxG4FRX0o2=|dzc-C7;lHs+YYzyy{FZY1p#(3r@}L{lHhV=y_%0}!(C-I35_~S z7TN_@zCIzlXyj#cKGP?kO5j^7if%DgIWs2gXxx>Wl!Xu!@w*8)@wm}b&2UC2P=6-9 z%54#KZ+rn|e%Pm;5t3t->n(3HRvWNTkS3ey(_=0=D92!ZOD#YrV}kL#u-|;3Le}Uc z_l?a=h0e@h@Fn_>ZSXeYt;OZuH^u5XGQN!=U7QmD7ng6Z)@p!IUV)nIT^~QbJ<wYP zkJ7Hb)l7ZbYYLD<%@+MORT#(9SvmtT1=s{qGeLmp^I3RGp#QGfbA{(Zqk)YFR>X!Y zg7%V((&nkOhfd@Dqq}BB<IhOZxl4ebj9$sb!AgMm9CN2fvztkcabnmFJ0&t`UECGJ zdD&gzS{kxe^dLg1W=@vVa-gvVPXgpq?mg=9D0kxJ#hbZ8>Vp6y_s&gP7aD8%_sVfI zK#ZMy{tf6aSRQzae^#a_9uEu*m%?|_IYXm!6bx!)+fIo;;=il$Idf5@N*mCP^frM~ zQpYHX)#P#1gbhM1MI-AyhcJf9g+8kN{gs|@5b0i*0#cG`?jTKKcQc2Z6&v;}ZQnUZ zx#(F)PMp}OrYZWQ7CS<ncaYBo`<G=i4`a#sT~rml8v<1;g2KbMrG(X+#kwY)EtKaR zx!<!$xP9JGj;WjNOB>dpLmBbpLWcKeRm)#LTAL_RiA)I^BhW8~H?3yA2V)X>a5{H< za|>2C0Y2#Yv?Ceh8O}o#bl95Iql|S)!#)nkld_ZOb#D+Y`9U_cbNudFAoS#+{{dWz zt^{9t&ee}<6Cz=5i5-9ILmZ}`Y3cwNYH>h|`I2&~6J;eb?#(_(*}T)r9AGZpagLNF z^o3+1&I!LWghg2PLR)+einYzU6Qdqrk*}I%3E?JV+VTLh&8evT;19+aqe6wx;cj!~ z?p3`HYZos6Qsoa=Bl$7Bn$tE_ewd!7(N(5e(R4%F>2Y!m#x#IkO6msf5PGPw>|Ech zS-|lPh2OSn!Q)v4=dMIp`5%~fXF!RYr78NQem~&N$Iq8jtaq7YR;`BDYcpOK@B!XH z_v2m%Tr?ss^h;%(8Um_=N|y^+6b}A}J2{GtV@~J;eyiz*G`(i0ui0(lmOS|f>tX|x zZ$R+?c<5CfCYDy1Xi8;g!u8^E$;V9vG??d`4dHVWVSVHX)yEMB;<K48LgehN7*4SJ zs(dpjH%<DUC^b%f*SrV+G&1GdcU-vCR%YpY_A|Sg0UARk8ueMqI-hl56&tgA31@VV zTn686JuN{_@l1QcKQc>CQ1WtKa3VC%h^IVnxu4@))+}p)3vb2KvRa!<Oz?bF-Y(a; zmPcinS#<Q>8a+eit+y|fIWq=ee%#pP+E`uK*0aKE<P!Gz<2+RuwXOY;tGrSE?~CHJ z0)4SJ1B!KEulfw@?lOykV*sNV#lqOj7Cg6TsY`X{<?5ZVANX`@bj-ge+w?2)?u2Lz zn<n|rG*0!Ga-u!F$_8v!s|2JL^XkXWuk<r4&IkUv8aFa=C6<F(isSu+F2MO<-xBS6 zI;7K(yb*`%mEsLafgnh;1A+IH-|pqiH2CN~P1IJc_IXW`QxSEXl;_=q=-Q!{WcVJp zguR^=`U5R4;ZACrQN+8fnT|x3nQm3T_v^FHO>?FH^v2MK8`Ph8>&bci?WJ|8)L+x& z{KQP9DK6h~Fr>?MPY93ZmA`nB2NbBn{ED@z1UlDObVf<pI#|>B%IkRz*5ZsprbdzK ztu@I$08C(aeJ43ArN><@?>#k{07wxH#bo<@Ovh9}idDg`cXXG(lNu@UI=IUq1IYqp zac)619BGFdMT<Sl7Tw(B`;7>3jR9JC^_ys|R|R^ERxgW!H)fzRg<^-VYwg|HZWmo& z%<oGzOI_~?OA*VF@2C|m@4l~LDP`UrX&`-6SGfW5c&X#EVe7A5R?nhip}uP4&&!ZJ zhd=Q(n^7sO-z?$<WT6(k-)zV#AhZ$1tV-QxnZjwQ=HJ=VzC##*<8l|9kfHc-b#Ugu zz4&e{iYw`pGsai+<wS)fA1jA^IG<0W`~C4Z9L)Q=*{_6Byer9bH(`y#HZDZLl-#Fs zd%h`2H?DBL6GSCv5`n&yQ)AfPdD=YYiTwO&xVs8d_2G9)QkjE9K<g5(=H`wP*|FC2 z{sI(GE9||LqzjgrRK+N~5vuAuDZ*{zlI<;|A6lDdejd%K-<WJP#ADa3d0-vqzs-ID zUxlxj_3Sn%A0`5&=1uWSC3<D&o&!5K9!mDH<edz$Y`Hg~b+!7|lki(|Ps5{5m=}OQ zS5jcW{-*{m;>JZ%7L2$tW;OMEIoWzw939+P+j~R4-de<N+Y9JVJSO{Fe>!TWsu2W_ z<twM@0JNPuIHeXycD$YKm9!#^4U3wE!`ciqGwuEDeqC@E!!j$n)JN}A>IuI$ZOy#% z-Jl;Q4J*h|HMw?^J>()=?YUs_(-gFR<THMN<4ou3rvTHPV$2f!$JZutGvekw-}ZY+ zQg+e%n3>)pyS0zM#GM0{YD*~JC6TODJ%D&^x<7t;spwOi+5E2hP=lIgSEMw2QAE~> z$u{G`6Q}pK6t`=>G*R1^O>T$Ykn;V`>dScb8nVg+a&?gjnLTXvvN4#}|HcUrZAT%H z-<xVe5i9hJvkC!KzCH^?vaV%2#FP=9K8*PTiIz!vD7%6s&A8*kovTkT#;GugMkRAj zG-%C#$r~a{M2jl(FuQmzPB?0t6e?f<$vWU8S$JV>T)w->aHzsFG6Fb-PXNRCvfzly z(R!3{To3>VCOUd4Uulm3n+rbVA#WfBCCJA;eWsBQUl|__-KM_gqjO56lZ7%{uB?w` zu|dH@tHC<#nxO9B>uy1g$ttrrz~yf0_Qzqs3h9*E5p>r7t0+6nUqNPIt~-+gZ35r@ zpmak-PdwS^*o;@R=L{Q}6JS!u!<>)wnC}}uPJl1#k!KrKYB6{<0fUCS>-Re;8?EQ^ zxk|J?`5*YOO8I8R7V7m<Ha3Gx5iU-I0~WOk@iN-oebXCYd^Ns0s^Bxwq+{MoqkT4- z#B$=E_8?EuWVYiPkg43Lci4%x97XnWYLSnFXxt7dFirdc1fQ)}xjrikgJ{Lmt-7uo zoGcBvcnqgXLS^oAootVtAKhIs`KB1ZfCu3DEA<duIPD)Kw~0)0g*)5!tC6*Zj*P%7 zI#;~TtN)?7c2+g#>{*I~;XSBVKB-AUMM?^({i45dZ=@=9X@jbNmf#mOD=U5%?tb>x zCGoRIpni9u6lLvam6NujM;FTORS8w0k~}frH{8uLFhW}eRDMhM^n_2*G?R*`=_AIT zDvYDNLK?*4#`uS-Zz^;2enDt%YIXs)lB-iwxSMJ&wl$mUJV<|S-d*Zw;B={DCx;42 zUT82Pp~}l;+*wr__c#<~;A-YKZhsirx_ek9*j@Z+FUR=n^B{2$y~oX)eU>O?AFqSR z_iA}{(WOlr(U%mzlQ#p->?eqO86Zft5=(+~lDGStj+6Bs+LjC3O=~gb<aEZ{A*YYP z6{3fU*-2}>Xxti$7;2TtW698Xw&E+ceu@84^?kS5!cVAtG2#*Hc;;&E_-yQ6^{Wo< zsmxFIn^Tp(3r}(I-GX%3!4{Htg_h+O-3-9`T`#-l(h4-eMlmZ~H8)3Gce|N^-EHWz z;J=$9Vt0!h?^6RtN#m+hsY2<|xXIu7xxR_86R?7Uv^wUpob6w~)=zde7+&IE=Kk<j zWUM;hPs^h1lgrpy?vdbUt?6EuyS;V{ens5%)A%t<J9C6`i#dzRT^iqlT7+p5b<#by zsFLoPHS{>8usOul@jO`F@O4@XTCp*5#T}cU6EFQE=)BXgD<V#oi0^D;(gU=!xeq+2 zF5oP{l^42+{p;N0$LmhC1_EAgGmAO+2fJ<VOF^1s-ZBKi4^%gdFuq^$;Bmke@R%#N z<=c8PT-+h9)G)(9%CtQN)6mlPBs78Yg<BgIJsK0*&&)}`nvob8Y2oD<UaqvOB6+OB zDCzLF>D~{7z+Q#-u~qt$oZI=GC1M6#h=%Gp*;4wzqu6+#$tMh*Mc^h5lW!_6P`@DL z%2>`Tx%wZK=xOQKvg7&p(l)P-{r)59GPsV5-vd*_MXBYs?BKFu6S-F28eqC8mTlIq zi|Ni{^L2pMC#csurS_!SA=$d6tvb3B`$4gqC~x^$@}jfnZassuV7Ex(QJV<DkzoFY zcJJD^vxv85BGBc*kR^1*!s6G<Wj*UPXku7|Eho(c%;bl)RB6en7u9ZI*x!%munE`# z2D;AT`n_X9Rhm20vnz<o{;YAwk0gEZdZhz6#Kl?V9(Ne0rk-1c1dMB3WvF<>=S%H} z_%)x61hyUtHeWt4oLrHfZ_r;=e8{vjRE1=8!j*_A(AasrPAsjHhJE3y%G}dgh^R31 z&Oy0iIw4-OUihGd-6oMo+}g~B`W%{uj-KgOM`7g)JHs$Cx-a0s<*ZG0oZ)z_D{nn| zET!i1oBU%=p^LwoF#r5LKMI=m)zn9-PQl5as#+8UT0R1*;W%a8+Rk9*6tlK(y-vr6 z_Y=&Td}kV%p3Ug++1NX})b^&pY~#WjioKFsVY1fGqq<o^o`uKr@yMlbD1F{|WvTL> zfsa#wkz15&vK4u?AEY?^H0*ZCB)2NUV5VjAgQRWik_}dY(!9obT%h86tDSC5w0Mop z_4@BGQI;xC?+q&_TcK(vD>=l5`MOGUYcAAS_DUn<#;o#|!W!VU8P)cKf9TWzkbZ`o zfF8|6A!9KEzrlJpI#Y%A?&|Q3KlBei$%U9^dzGN76*3GW=MN%Aa&E&^ytG~9^n-CE z9|EqCOQ;xG{>sh5w2n(xtL+TZ-Pm|zM26voUj{a@++-|#oVu&anAYb->>bHe^p(=e zh#QZ1P=W@05^kiN$$92_lj?hfc(YAd=6XJ>=gZ&=4<+=97+sf=(aEmpeZ306Q4E~0 zh{xvIq2q_{iPUI?&%6Y|9Q?OH4l;lQFyGZbY<D37q>v_FgC$gdN-b5<=KkJ%y)OKK zrBbJ-8vkv%1UY?`X5G3zzs8E6+sl?-(;d(U{NVZEbm?J%3_xE}5vLRSC5TC8jsEvX zPC2@*Z`y+6wyv9PUb;(t3Jk@4;MpX=Va;5+0H|u0EAD`5i-;$^2Resl%vvfyRLT@S zs})dK)!+E+!GnXY>igNZ!`VlMwkygn-aHFTJ)mF(^H&4T_d%Qsw7)_vh!ywqr>0J5 zxNZ@2>8}4<7y<&8(w1owGt9xy;?r%VoX>1^Jhcwe7WlJW)q3JcxtbpMz(WS)e-Lo< zzH}kwj~_qUNvoI6CcG8#Fb2^i2rT`I8|KSh3WF95z;03Wo#(skcjekcw~a(y9b4N; zIvYWPu9m;V#n3-aoYC&G`oTc>_UkUBdbtnzGS6jy)h-SAy{u>KH*dC<YyvW$EXxvY zb;|RCbDImZ(uRjuvQ}6qx8(aRz9yf1+oeB@u*o&M*u<ToJaxsjsd|(833JiP4Vn{s z@r{U!eh%lfcp(Q>4r{9a@g)A=5BH8>WODL4eS`7W^Ec7HU4*Lk=*#7{1b{;ALZhgl zz?~HI)PWoL{7V^6e)=#iUYmf<y`9DlWJh}*C+fNPsz2h|J^wdC#$7H7D=Vw$#KgOh zgN-Pw;k>ScP2^Yq)U``@X((z1!N^+WJe7>C14rbzU4|f9|7&HlpY6{cq|Dm&-z6NQ zP0h`p$2<))o$OZMozlg00$hp3rcZLF+iyv^?q9WqD9>|WVqi#EU@<uG0ZW$osBpBj z!7{FyLCc-3;&{}jea+ik{@>5!KYn_NNCD7gqdoVQ>syuqo~%5Xx`OKLB8QPIAx*-) z@4gwZp&l6|#4%8ACB&&jZ=TS%vXojV6xlo$&jEy)8N~AaitCFE45@-RlxrjO#_3=B z*gxH_WIV5ZHh?$mZ_VhQPz3;KSrq(4c(u^c!$F1A`$lPOVsb}X+CWuJt>;Oe4`v~B z(C-HKqppFq!E4P3<56o*T((M%N*U`=nS0q6h8Bqvgv05!5lU>2o-cNCkKqIs%lYJc z${jPMt&=0dD}UaW=a)LY{~0u5pZF#IPBYrSb#}VH*68ftSOou->E;(n<pk{AV7*&Z z|9R=Z`8S!Dz#No-p?jzP>30}7nFKQvdF7WZvi~pp`YaDH#^fav=imI^e^q9eehvX) zR;Boxui&rGlRdeC=WUd~oDTjUclyW4AQ%_9=l}K1{GEr%{uzknvQ~+|;??%oUH_L~ zmRUU+24w&2+~3$E|Lr=I*MS?jOMCVIxUXOS=h>4vFaxyQ|9A;y0yl6b_su_kgP%@j z0X5vb^Vci=n@{4>Yv2Ylg_ZvC8*~Bokepb~KVCxq=YboD4gSY(Fz{p)&}wk(e_0j( z?G68L59Z%N;NL;u-$CHtLEzt+z`rwre`f;!&IE=6-M>^UbSw>glAG5*oBK;P!v8bj zc&wLc+&<23L>0~|#pArp9|<_0bo!k>bNkLC?Wv40jp&$YiscWa)=|JWc2sPd4}#l_ zgU&)CE=XAz?So%)BmJ)zY4n^7^HJXuF3`<?@xFM5A-g%AvC6z>Q*7qtqM0-)W97Dx z&~V)4t5?--q3viU)0^c0kO%T*Nxe)*UA$U?7`S(Byj>3PhX6FGcM9zFt<uMe>ptY( z_y^hkty?d7C~y%r2S*8pP_<bPoZOMsxXL4TV`JWD8R=4s%@X!e!L+K*N}*#6sPK$T zzo9jIEa=GTnjhiovFsFSADLnwV~2!wksB9p)sweC49F|BwlkcKxQ(dg-ed&;T5^gd zv^xvdo4KtI7zn_(k8cd0-!)zU>?HyCyIy;fsLUkh)CP!_s<h+++XE@BB9m1kv(8KP z1Ei|OGCC4E5Mwi%736)?3?{yKXmVd^x?(}Tei@&#_+u})OAd$9y>LgB@*fmRQCHu2 z%#i@0-cp0^R-~1X#d1+30AeVmK6tV$pm$eL`Y6$5Fmu%s6HF&9-^?U6OZAqF-!*(p zSdMMLW{7~BX)<BgnMJ%(r=1D>ss*Zj?1Ze+edn@|kr9Z)jE|%Z4yX}ab1VP~*In*2 zWS65(-wfk<jd&G6y*n-ePFUy=a*ictOFx?XVn}=%445)SfDU1Q#A#0?g<NF4ZIL!9 zg@WDT<Xn_UkNTUr|Id`!!PxKJnJp0MyYnOe17x)|w+{pxnf(6!Zd>%y?r7qDr;UmG zlPOU*VbiW<J%{>5=Dk<J>f9MqpWmEjJeo%`W%}p=pn~Gj)Kk>D&;4Cq*w9LbgjVz6 zIy2BCNWQR+65C)NDuRerAYL{Y>U$~N1=AhD^I=vT3>PHC7M<??U&`YDy%wpYy2Vt7 zc(cIixd5jl+BkO|wJl+A)7;m2&CAB_FkDPPp}ZS!h`YQTa^Hw#Foei$HDk>yl!#!T zNaAd(1ulWQfSXha_~9>wxuX(Hm~MdeQRz}ASTSi0Qhl?<-Fdkyi;Z4!;VErymH94s ztonU>d;8%^g<n}mcnrTTtlp96g*!oyyApS<nyr0^+eM=ExB-<zR9d53{Tj;)33YMz zjk#brnF58X^i19#vt6b^kY$(ov{ucnvU*qtU=d=CXk8idZd_6IMtyXJdzs7nzzgwO z34QC=Wm_5Gz4(&d-nyMF*SNZe=Pn$Q-gK!R*>6dTmAoj?c|=iRv5FVauANr4iHhg6 zz;=Qf8=$hUL>*QKZmt;9%Gkqq=yt!3XD{u&GE5V8AOkZ0Euo}GHsLnHLt7)F>$9^6 zP_Z`5fcZD2xTT`8hfxvDhpNS=6p-=!OW*DFfmu+)c|C<9HcOSE0uC8*xJNGNX@wUy zNY04GF*{`So9>5Jr35p!8Bhs?9Mi9760RsHiGtT|kWxg!Zf!+lrBRo`@P%L~HZ;_X z?034s&QQ_B?(BndLqjp?Z4eTN^1_@h&?rgvSfYACXXa7OdYai4PQB(-a`U+n%wgwB zQnree<#=t0%jWc;a^+?vafFE~acLw8)fLVHdX5uncs3r+lIyheMe6cR4wEva3=v&s z9ABIovO1m>&v=`2(dX7%T#}yWWG?<%@a6;G-D~c)GlUgnPD6vojDb{No{t!kC54;2 ztMpWG8l987AM!qQ9{0c#?}7^q)U~e@z!f(={rfAkMKF@(CWcMj=`_6yUs7`meyYa0 z2kt(d%wdTd%Yh{HIepD#=qUm>Z)$8n0mTXk<(*BlPehHQx&b_L`mha%)!1=^h2Twu z8Iu-y`>G1TprgIJ{&c@v8~rtCKZ?wq5r+SUuth1|(g#3B&2$osT3i$RwChZUuYizn z=6J&t6D4^)1=CqLS~O$Rvuc0pxD2tE4w-@5FnBI}wU{X<TKEm)qz>Ofbl$>!_x%vs zDyPF&I@S6StHA`^S{jD~8A9tt+Ej*hmCiJO`^}z{SO)Y-ciZL2k<NWvD^Jx6RG+Z= z;2)7iCk`82*Xyjn(CsMi_&8VTQm0hl_{w};xJdKS*RdU4TH)90kwGn3R1Q(mJ_7Ft zDmcxx$TCVV-cWe)JX&BX(s*cualIZ%HMIguqo4NKOT%@y2ApwHVx54M9i!QB_3Ylr z3|60YM)JO<0kntK(6{ResfGBe0jv`YMUEFo1tlRN`2BTmL9}mNBVoHraPbJ}Ba-n1 zLt>192iCPftH2*L;2XFFwizpN9=0>Y9pGq!FFMj*c)IH7xVU11kNuEN>Yw1XJxHzJ z`u%rlk8*@0Sm!gby`A!CfyKQG(26c$SE}@jWqa-1$?D8i8?mq0@ZmJN@phUeI`37p zpSsqo=d(#WO_Y2A#6xT0u<>+ago`cI%TEKn#$XW7P<={edB=owWMa(QS))k;)f4lW zj~8rP2ueUJNnjkcYe9AbBi5cm=SWZk?<dTZ@U8TXd3gOFK_8rY;}Uu{q2IOBVJwV< zgRX!Gsd;l1iQIxqb(pTfUmmOS*D~%@VHZV2-4U@LlQh)u(48G{rhYbBIC*N%54{~q z)3=A12F!YkM?cPt(K1VRf_%Tku94m_Cq5J*xF#HI0-4LCGIVYbO7NemV!DuH?Y0T% z)9S38U3^O6YZ?rPn@<<<nCr9;4gkKMLYwg2S@iOE!_~@6NEw5rIT4;biE7|+R2P;Z z^MO^HiK8~-T{Y0AQMPI@ra%*xo`PG+i0I~bM{%LTQ|1hGm&v01DTJP+Mx!XGN8j<r z8=A=43#((=a{f<383-%rN#X^vgEr%#_u{y*>~ve-&L;B;E#qx-v32DABl|3>Me<rH zqRw`+OmZ*wd&UD<X)lvNz0XPW9ZIQpaZ=ln5Y(g7_?|CoG1DH*I|#a2$Fh<Nh4McC zul#%D>Lg$u(RO4b^U<c(%t}$$Bce~(eJ2&zxM346{^Y<Gv+B$|WuH{b>S{giMkuk% z-!xG(_fA;Z<fy7W@}HO6RibeXlzP$<u4pp?NPr(h9S<JA1=vzuC1QGlZnjizDf?a5 z-Dk)u^(2^P&te&wOAW!oO+M_=SFQNtPCdXk_?mvpv9j;MEQq{r<7A%jV)utyM9*~B z!r~HHl3S`V?PgiiPJGjm?}6GwiXQx)57c=jQOp3MDB18YF95GT{>D5}$@0E*%k61i zj+_MPa|>yj1`f@J&E#5_VJ<4Ig$pU^jk*ZO?56#xl-<T6Utm6wH?YxeHdegY^7IV* zpIPnyhNZnd_gL5g<kRtjoImhcwh;OdClfGoZP3z|ylN-mR`-TMI75U)xTC1A;R?=E z7&i9^c%T#jD`5uuxJ`sXF8hZCzCNDh8cowLo&9FVWa*e$sXmv5mA(u?4g||)urt}h z4||$`bM^a@fgt3i4&_v&`daH+O@EF`8Kr3Fe}+VJo)KnUg=(lkgTY|0Ez%}#RuD)r z-LlK@qf1N^$DpKrEW_@`0@(=(-I(a#?Jwp-iK>-t%^W}ZuDePzhDvX4qk2K$T5Z{= z-<#=KV#=|fTrE*lcrl0t{|N5shOSBYj^s0bj~5bmjm*I}Q`5;&r<NqG^7gD81O|CG zNMOhzH>A9j0%|i(s3-1|C}f&jp`;5LKJ-anA}Mnc?@p>#<Z1tAy%72k$`Mi59XEsi za9!ni;JnRmMue|oCLJqUc)A9J{lIVAeni5e#}~Qqr2QvAdVE`;w31o>er=X+UP;Kf ze&&*H0whDq>vh5--z@Qw1Xc?dtU1UEir<(t*52MDR1rbtguPy9tT;aQ45aewJcqm~ z^1!86j~r~?2Npy$?Eh%do+%f(S9csuv(#Wy>Xe}ZZ*V<1@FStqko@CnG?(W_(#mcV zmqWWsqgxM%)pJ_ptjE)c_r7pQJs0!-nrEKm-m2VC-5U<iRg_97%jx<?UV+BftR$q* z);ZQ%u$Bo6<a`^EPHH{9dM7o0JXcMA#fDbEV1(<o@QCveV*mZQj&L)J1DMn1?_T)9 zGfTA~13~_wWCfy^tFvJE_&>;I7cX^&2lwA^Ff{;XF^nTJfjpKpKYbc#;6*cy79PoC zW?=oaTwHe)RxWPNH~@heIP#UmY$tmeh}!|or7u5aT^O@n8|zI&v|u+8yn=)v>fbZA z47j*P6VN0KkC-i)e?;l%$W>WnfH>Jfx<h~0HfdyGVPVGBPaDUjlClLw0~10&ol-fo z-GAv`Il1MOc7t&ob4+67U6>vjqS;LKk#1vL)5~RZBQMt`I|!(V8s`m8G48DZZRc;j z=O(`KsC%p2+fKKgqrxFS!W$SQ6Oq?%P?3F(uwur9R!_OUoie*W{%A@at!nfxQ(@AI z!RAndvyuc2Yffr|RsU-E&RB#xj*djA<VzGcs6vjPPksG){!KvtAp6b-&j%!k-vNUK z)ht8dz}qBbt^J+e;UUxGoB}5xb0lBuX#x8IntO=}yHMyC1?u98E<}c>GztL}qbnY; z$yo@2UqFrYP7D<<pMF494|pQa$R>C$2@3YU3Wk?|yKa>)9LGj4*dxU65Gcj}#eWqF z#e(%(eCMjIM+>{zO5xo;BpRsJjfY*dz;od0uX}>OectA^W02^Ba%UwY3tFLI^nIIP zW-+^qskcS0+B{Dv-g^;#uIYcT2>wUMhW%a3`{AH7o@$O^rTRtTJ?8dHc8V%=I>l64 z7$k;f43@M$R=All?qABU*z8Jw7wp%qCj1uF6FsALdc<b5cr8y*E0!gai~<S-7--)N z<$m=vDFv}gc&j-XP+NT5@P=uQa9mVYuMocm5)x8#JFZiU7ciXvcBh@oQWVE}1Rn)$ zL1;y5Go1k|BSLDZ?^=fWX+k9v@5HwEO!&>yF*#}>7n5%`eYhd+{Vbl(uz=Y1z#_dr z%Ra5aX{&{_yG&r~J`MssjPN{#9L+{DYP?Qbmu5Q(GyfbB17u<eCXK;1?Bu%lF-v<< zhQP@}Y6WeE<o2Wj^TYU$7d}8*{7IWu7i+;=hdc5Wfan404b-5wx$g8Z>U+~Z_(OXu zNbXFJ3E8tx>eY{F+0%Nj41FZVu!1+Ft6x4bB%pcQ)2~DtCZwjuT2%96s$Lm((QwR0 z0&}r@dZCADG++9Kvcuo0JUg45)|@LUedx9Eu&Z-|cZ{7Ku|@c*II}vId>Mr3V<y9? z7wLc^u!B#e&_e8ZhjYSvY;yQ_Kzh6wc7PiPPpk%O+5|-8;azCUie7PmwP%I#|77EH zT^ej5#>V0+ooWPojtfU^c6C8w_GYC@D4;jj9<NOHlg}7v+0QUr-^VNhf~hNsz?7Ot z0mn=BQw_bKCcxT<?6Bo0g7!JpSl==J*+2?+7dKTIq)Y8fGXnc~*rQP#`<3b1mTLeW zH~4lpl@SiNG5|TuT(tRZzjkvHz23Wk1(?<t>XPpQY2w`@j6!<L+Zd?UEkH8iH0)&= z5M&_L(AYu*Mx%GqDaLm<Q8iPa1N!_q^03M{N7Tkl^R=tIQfFxQKI?&m(4z^45%Hk4 zm<xO<&91st2O*TScj+wLTgzJ?ICft<vi|<?sCOx$o(p6<9?TQ}XjV7jWjx5c)5!C9 zlHsdAmOpZq$@gQLu=Z5ilt!|Mo$BW-^jJYQ<8jLMbtxhQcco_ptWU1;I^zTOmTujf z{a#~@Pp^9u#_UhE1)f=!;Iw7gLpSZ{!l=NM*AAQcwKEVbW!HJ}2k%?fM5oJT3vUc8 zg#10i*UzS~-%CoMY=_oTA9<ZZ7=|&H$&QXI1dPN=BKNveF!+v|XEs~@R`AR5%7~RD zi#n$R(~T%98ip=Y+BsNX<sjYact?u*3%lVVwo7DKBe^(fl0e805;xMu!7mW5iU2cN zDmPk)^WvMPGgc+KM;2BinV-D3@w`{AUR_{gc=)o!`Z~GCV5Z-}k05G1z1UUh6jpZX zF>v}XUZ7nsdtFco9NmvexL(W22D>7Np{||jOQAuAyPJY{yU$1u+v3MuF+<#_7R(7~ z2XOWl8|(KLznAJyHyPv+`E`8+>`i|sNf3&w^lFcyP#+!r2td}d5bq=#`TZbBKPU%} z&FNs&2lStem6{pfjez+b-<TNE5~@zgz3JiaJU)TK@(n$ntXtkA&cX?cq!6|k+|#B+ za6sTbi^Ni$XmM9rg}+%%#Blx{O7q%&`0-c+N(W|648F1Q8@O3Sn^s2$)(zr7h-Hj} z<KpVc^&M>S!&9|8Plx}0tss**LA9$Qq`wi`g=ld;b1{->)TZt|i0u8^zK-}}vd*&# zn54Apvwp;2w$ZLYazxZQ)Ileh&wei?FVYACrDNlC4v;52$6AjzP3E+%<sXFrq5=LI zo6&u;_BWCs0<XjQB8^i~vv|8-bHMM-%7tr#wwN&=3Hv4`vVARcscwF$%jVD|ZN@5s zp6Rh(O(9qxnC@^Jw0`vz#W?t&>8NxXAm{@#XBkOZUTKrPpySz&j8Icncl4l|&^l0@ zsf*WuW|YZu!-B_q+T~E~b$}$r$$>c1_+iuD!%Oy5P50cNmxMy=7c^j9hNe`9$WZ!Z z?O7&wrBrba!;6sTt(w^#&!2vql^l*paXuvhdGO_4Zy;hdgv~UKIt?o1_D59ZJX?<> zy~}%s3(U9V_Z4UX>7q*#j@RbW@qlcDN^m`7^?m-#jvFciJj!)ekDG>`KN<!)eu&DQ zx-V_hH!V2~3_fI66h`|fN>TH?{v2u1AeIG}mThU!cHWDBvjF&;fTgUU>jkCIO7fIh zub2hN-`hgU<<Oydf${y{&(3AuoS<eIk(U5skxvLTjo*YA87i2d=u3n;ZL)!*3<5%W zXgCaTRM}{~v?*8uuK*zk>I*h9LP-n!hBSb*Hi}BxKI>D$0SKXsHr#G1uuE-m3~{WU z*LU1UB|#>sxC3<GKyMt1HL^@TqDuSx=$-#awIH?<C$m_BLoSNz^0cR?PA)S}z+liM zu~|phM-Ma$Z6L`Y9by(Z?XqIH2&Mz^z)%o`DK%x7?zShq0Xt2&$RfUqFVW3W(C>X~ zpT;l&mYp#e&;CfYrIK`C%?-$@GcpG>`JPE5N*m25VNb6C7&IVxU~#I_iaeYo_Boxx zvO!5^;V?U7x_~Bep7UsBLFIXkwK{QFQnP2)FmcQOlic(MPI9}P#s%SUI6#4rx_?ua zN2B<*jR>z#xqYOx_Ls3ecm&8f2}ej96+&^*Q9_`vzV#1$;~u+|<sJb{Eqz<H<gQ74 znk;P3ry`B>x1DU@N8QR8**HE!hd)pQ2cKc})H^UYeTFiy@XFrZgjtPtOGPapzzD&y z&$r5To1NmCj`6zDdLV_W71+hpYc6%l==kX9)LZ?{c+?Hr;0;;{C|;qjeomFqdr;8K zaIE4+HTyr|4mn)$`@ogNdeF5(`$*pH_%QpJkhJpkK|U~`=5e!O)5CrzeoJyv2Wz+3 z*;$Hsf=%YGrb*@LEq(%CTgq$kZob)`u;=m)w2KxtvlcJ3o-$|*_0tCmz4{&ZamsL> z?d|Q>(`H-VhGSriavSxEt>j!-e;Iks5EIA3bkFwGAhW1_tbB$SXTPl&X-kJz^hMwO zW_etxz}qS2$tqp9r$mF9#z(r~WHT&gx;YJ3sk9I0!?(E@o*&b0d-rMOLZsNNk6{3g ztNUo>qFa@;2WCcqopeIbAI4fy>r1#flp$C^3MZU;oIW&#y4Qk@6Anq|7HmFfn8x+X zo34Mv=(W8&HRZ5qsvqK(-<au!1Oc;yiqWduwuc9cfhWb?8qjC~8Z)<hlZB%o_5`)? zjeYgP*HI_fu?ktNyQKR`kmc`}>b4AhiD7)&wR{e-(221HHfVhhyw-OA1Yond=S<dz zH9C%2{=m4;+|<-3%Zu5ySE=ApHmAp0+S9Wf*VGZN8Bc;H0GqHMrrL)@oWLQOZan?4 zu4>oNXPNtGX%rD-Xy~4unwt^iW8lmn5Urq=XOo@Uy;~?SJXXc74?x47n~w}V+XNd` zftHD+)$GPK?JE1Uk7@Uw)aHT{P<p;e(${mmWIvd&{)48E|M^tO>)rz}dQ>2}aaVJf zWFy#ff<?;q`rQ#zQH+6L>Xc`_jvhhjk6PAdw+HlOk*$?wxIrV-N`}X4JZ_C2Na4M} z<4T*3Om&dvCb1u86&puS)~M-L%UVY!WoN^fgk#<E({$#t`0gEj<zkH~@^!7Rwi;D6 z7A~Jef1lquLlzh}gw%+2qv$S-z@nu3H<mNZmqtp}k>m!O`~&M$sD>9=>6LJ~J4%{S z%&PGAXqn)QxV!j#vM$GEbo1}nFsL-muJ2j_wCC#zZA|?heM3G|)6VP}reZc;70G>> zbS_Dk!F(P`50q4CR2PH|%9G*!XvlD^i(24@TWLxz7{h9;y-zbdX@Oe!So*+ZOwW@L z5MlbYaMW|w*H`1nb>E5x-oKG<;U)VNSO$8{$9SYSxtUdH*08-w5MHRgF4pBrc8?Rb z9%uo2EcW_lhjXn!?<Cl}bn@_YW8K3UM25E#t|NJOaZj*kp<j{<Ai299s7N2nG>17+ zpulat$)baEM6Mjjc;5rFDW#(jb2Kd90szKk4e<Slujw+c68pL#PXdS#>(dD;u09yT zO51K<NXB#P=h4%+738A59lPwW8KM8Tyj$io#eE$abEBI{NskPuU+_e|>1jYn`Gnkf z=pYjv6Z0i`bE?*L2I%<}7~knN&WPm*@O*E(p+IjeyQW)fA9Ky_S!CoTXmov&-VF+y z@v`wu{9^_^->h9*R0Xlxy!UahIGcNxcBt!=uav;X#Ai*IeYz8afWfT<5}v6Z|Dk88 zRM);wNGh5Gf8miKk47Q;Li6!R$+uZJ<c?2A#Lz};-j%B+`JcYHyOnA++QWtIh8}jP zT|RFZjbS+u{*AXkz2S|@y-c~k(9d5kAu~Ty)SH+p>d*PU68ng|`Er&DNO^$ymMx}? zM<m^$rpTm~HoF7~2hem+w)a2SRkye!B^(gOw>5*!INr)wQa~O&SVZ4nFkM;~dEoYi z5|~V1O|=<P8`Q-7cbJra-lyN{2_X{?lB><UL8Fu?slEkWy<7mm8vARbYWDT>bW2(R z%Ks!AbUEL?YHbEcZq3cZ6Z~R+fBKuBDrfm#zJ8@K*4heLn0uS^c5G!$k3m{em3e6U zx92#4v?}=rf&U;&VZ8qCeZ@=SMtBR+mL~Xr)b+pkLeFZmyU+RBcHU9_`(NQ-|Ks1} z(0`Ld|IHBpH$(jYCqq2bc=gG(lE7+Q^B#Q1BM;5iFDY={W%cucU2eFA*Fr@7j&{{r zpo#XLMZ-=<IAL}r#Sj%!BssV?HtE8PT8?<{$YEO@-k)yYL!2~B2RGf=gZHNhs(CL6 zxq26iLJp4-!AD8j=#-?ICM`1FqPJ|pj%0Emt^dM&%*nYd1C~0CjB50TAmW^rU}B<A z6QXJwI)r?r@7IrY%z}{^y9~|Qa81^cieJ;W{7;_s{FU+v%vsm_SBe}DlIR}`(tERV z&^sBtGOjcpo1r9or0{A4j7BtmhOmrv8Qg1NSY%rW#WK+7lw~eyZFuEDeGQLlZ=gJQ z2WO4YQEOm6qb1hio%{Ap0v-OFHFHWSbK+@Pvb!4LUssV%-k)}LqT@{#N+e3*8C4pc z%-}r&ppNdT>6*n)B5mtyrE7hgjlEkB3?kui3%H>pJ`I#c&lJzZZgCZMhkxvboiB=# zW(qbwdvLT2TN?azE17>C3O{>bfokmjfH!xefk`)f&Q*}3*{)ddaE9UaRv2vVaN&N1 zK<Di84pouGnFZaKjpN$o4K&UDJShM9k{f8>+RWp(JM>N9uv1N$Zn|s?`<QQNr(;>X z!4Z8shQ=Re<N-mHVQ9YKx+}0niCB7FHt-R>Et?5%CZ>wr+b|N|+^tg@2J31b#o8Ip z9@R*u^%J&@(?Ux^smPGl<L0N7>7ik`l92v!$gQ{Ve}dDU<Q?qZ6b2jahw+!H7dO7+ z44!%kI>QA!XZ(>7jqJY6n4aG=gch2qG8(_*rf?5>8WTMjlrr?2soHc`dWtioW_ujK zNo1cTEeFW#M}olbhH9gPF+tvi=I%*?PZ*`%4(TI-z8ajg39VHg=tD}26)*6u&N5xq z8fXUl_#jtGBFgRu^ln0&-oo^F#qKRM3)Z2SE+>YThQ@C=@A9L@kj@o5vtAxythVR= z@v^;MKHwC33+G;>S$04t-zGC!sGj{sMA4gtfnR4a{=_Twiv9t>*<0*jgT~^qXuyL` z{YAsZ{=Um30*Vl}9(e}f10F+1Nq>ny?t&@qsFz82Y#V7=6~IE`624r1_uMZIFymZQ zw=rvXr!iZYZ+kKojCYJPo#PI>%`I*4!Y1;zGI}K1I*wOY&6B@>+)`TJP`BU0n!`PB zA;tu;eZX))7f#nlm&yj;lil)_UI`gVKKBH_bsnocf|R?yNc@?#n<*HPf_ryK8&tbn zA8MY=7Ly9FxpD!f1#E_LFBFyIy{6p9X^y<fD|O*U;^TCBpvPaar?CgOGFUx1{^Z2H zxvEv}7`h?lqQzON#UBd8#9HAYuRf=ZqKDVV;)PN~;`3^3o?{<|>RvcZdxw|6y02q$ z8%XKNTA~;jWTm#cS{OWl-Fy7JV^x7CxxrEw6<vwdYw}g#hk0SwjiFSV(b3W8#d-Js z+Hy;(Ek*sFM2DM?AxHC0pY#ANq_kfN<iTRVB#oH@{sm*r8<ReNnnTH!u~D06=!Tk{ zkXaAqA)^nqOt0rLO<FGCz!{W7!THK9XH)n=1|~6_ju67ie}ioc7{J$>M)wf3EXn%9 z&HE7Egh{)y9s;SK7eE9iYF#+FVHrkxtz20tOuzPBL2raGgqOxaISGJ(Qw#khOZJm@ zW4&sYsu!;nBt&9U^3+dHV`Vj>M(7II)=6_^431>>LJZp>sAEIu>H7;oKQH_^QtRx` z3)f#RM}=^f>G8%7SS{|>RPJ<sN<|vH#e4UOz1vq&h<|}+e&tg#>^@AXGRo6o*8ign zwbF!IA(L`^8Ah=ZC7-KEW=FV^4UYQ9!N)5>SG08w{y34!-BpvDy|{$!8TnRm|6i4w z%%dyY>&^xsy%g5XrI4N=r^_;#s}vBCP?9z6P)3z+%y%7x_EY<bYcI9NdWYWLuRnvf z5+%C1u0Nw;c>PL#>W<BF+hf|ofsentsr8xlxr?oMm(3h%HEJ{5lbRD59=+4jc0|?m z?F`!iT_0O2hz3WzyoGn(!aTva)+I1+?ZP)R{~SZo(nZ;1(|sN3);V$A#?<6#FyD0A z<?Y%SL(Qr0FjqUld>fg5t7LUl5oU4A*(XOOZvlUAg>-qYm2`QAAfK}in>Vnp>!Eu% z`QY8pKr8c!iZ7dFPCJ%SgrE!4$#Xs8sLyE7D{p9m&54RwKV$G&ue{?T4wwDF=~{@f zF-^ikE@2_Qs5xBND%poa6^nevFQx(%0JfKt?|E8uo!!s2^HKcJiTt$9&FvT;@ULhd zD4&_L?mAy87TkEey{ZOi8LvHU@#o<z(c--tUly(0i0fY5PmK`8_E~W84BIy!0Br#J zmxG(J-^7bZ4~xnB@g^GiWhTbh8Y;~xA`PbIVgsRR)+TSEjnuj`f3gN0e5=bYfuVPs zF(J=J!ENwqhXim2HOrry4$vFhPw>UWmqlTOTexr{x$u1U@i>coPKCV&*PMKPUF(+S zMqiifx5}iAsI;wS(LajV4ofw;*$fZLhFrX#6#6o6Ed@7vBSY8zER^oPYtgXNYjgz% zE9up0#OpjI-cU&OzH=>y6~o`-%O$Re-sMhKAn#Kb3{}4<DOS*djzdQ<^}h4CvdSZZ zCh#JnbnMexhyb<6W2N=;syq@Of30xk2UgL#p6|?G1!<-SRTDmSTyS=%3NUQmt%3#K z1a>d?sYXVLS5>S6sC0qhal82XWa2$}&3Em;jaOR>Ft|vnCy$ntynn^#@#TS>rImmz zW!a7qbk1YWyXEL5g8um=POc8!|EO8*v_as>mI4{6{r>o*+`HRB!7H3;(UT6Z{G*Hu z$0~VCu^RD;`Rz(wDPOyY867-c5~l3TIM7f(@-B42D;jOJ#pM9{3MF1Dz}x*?r#(BG z*HV5CP<6O+ieP8i2bey(;#e6=Cil4(pZ~ZW^tl6>RV;vFZ*CB6vg7GpA9X`qbp+|X z`P_emcHW>{GJ(E(O%zq_x#NIpKGkisQbYNEBwU?ZVe<CB5CHaDC$XQ#9e#g$Nq({I z&8M@m9Dcy@+x1~T?SaM2)1(Uf7`}-HInf)BV&&M!{5NR^(()o6*yV~DN{A}CioF@$ z&$GpLJ2DkxLQ5Q;Xnnb4&<Kh0`1~8;bjRtH(|u=Vaf;mHY>)r-$}!nFKeygXU&?r} zV#1P_RK0PL2!8hV)#2d)dvDn?-jd%MYc~?c9(xJf+}dQyduh1)TJe=nSIHH08&)r{ zY~_|Zf)?l0rr+%T{L`P8lBQ}x1;*R3_$G-~&SZw!?h*7mUCyh8z>Z2-p#~}RPCD7w zdJ8kyvDUBio3G8|uOK>h2ss9|M-68U5GRYVVCkvPobT5Uo}#VDux?kB9v@8{m6vC$ z!4gwo*k8Cq*2}rWodsit^YK=Xrm?dQhLM2~V)pieS={BjSPC~2x8q%r2ap-+BjYt| zZRkUbOy4(^c{%Os@#*+y!!N>Amr`rvPgQ)NRyPHWjY!Q3^Ts%(@638Dxueb;E>3|b zK*BrW(yWOK0Sj{I&{VeP2gkrd;Kv@Q8U`6t0lu|<PJ%{$_;_V#(g8@TTx;2iv+suf zO(BOV$Yye-&rHKmp|9Qh@nDoxvRGWTm+NP;$GBWQL66PBrv>XrK9+$?bucC}{27B6 zd5v5T&5+PoM@7vpbdTn;L<F;TV8gKy(eATzo2i1r$AnXMy7(;%HE8de3^5HjIC142 zZIlufK?Gk&`O@-xuZWQkl)9}kVG*@hsmX(D<NLr2>>hv!xzyr!8c@7z>3vnb_-D8{ zIk(Q82dFLmR9ircYZTj7zv?hv)TZzI(C#j?-|p@5C#QM73F`8rR(mH^gpEM*3|CVY zmfjm&7-g;~iLq7;^>V#a(oC`n_7VSc-F8RI{44khDiVG}`kw?w_6HV3&ZHW*fDI`R zt-RH%Q{SvwRMJZ?jYrQykX$2?qFz#yny2?;uKdV_n=j;?U~C_5{k7LZje8+KgHe{8 z(Q&1EY1F1UQOc573V)!2-nJ2mib3%HL7ah<X-2?qzu>R_WT!(EPwp(J6ibo@KKs&Z z_MgE!0Z^qj{^6qXxk#H!6g<nfhOg^N7O{zT1vP+PjIsVlB<lY3)(i=2NR^W6T6ddo zHhOok+cPilg_Gl@Ek%m^W|Rfzi<kl%vF_p)rFRv0+dc|6xJc%Y3$!_wnGqr^-qwl* z26tWvy$v<*9OzIS>hL4JU3k0q+lt=<57x8p#77gF4nM<3fE~laPru{mu($eReM9U- zet;1bT_R!HM2#-%Bfb_z2L7QZPi<eJug1CRYHDM*FSTDSI#g_Lx2|GVPHHEf+KPGn zL;BUfo;97MywFdBtxIVXj7%RvkQq+xTGz&+HbkZElWkgVW2t62?<N;;DvyN-=t=a| ztDifZ*;3IDOBX&IL$v-CrG02Fe8>}+8iVE7s;R1);<jc4(4_7--meB+mcLOM+`*nJ z|4ZwUX-Pp}o)Hyw6POMVC+8*iH9g1Fwcf#fzLX0%`Wy%^r76tR=aSA1FUIevRf+Zc z%1SAWzpTpMw;PesvF7w4pbHo;`J}-$G0&+tPckj}fi^j|k3FPT;Ll~HOcz$Rs6tfm z&$vC2|J~zcdHD_9G&+UXJuvMYDp`Br+)F*_x?1jCZSO<k)qIQYm<CHKp59j(El%NP z8X10d+FMn)$~T(in*`%cLy;%ZU3f?07p&sJP9)^B3(J3A9+%&3^XKLHjb!mXu+7M% zsTQ}jco)VZqDVdS6#XaCmR-&00yEdQMpU3}>gbY$uo9Nj2I1mEK2xkU#*UT;_90|; z;R~~xcz6VGDs$9KOZpM+-%QPcM^xS>4AwT^v5JY0=d=O5WPrh*b-oG$DQ17=t!D!T zUY6*HSdA4Y)hfY4bGO~*4W0tYOWDO-j+dfT(kVFjw5V@#djoSJ*X%a~rcCI(RY{K8 z0(Ep=gjkJ<xSHD1*HwfPaRpiu@zQl633!-iI?k+|>5DKsCfo#8zk{II^ioFMx7OD` zZ!`K@VvT*a=?%%-Ch?`Qu8l&A!y@QC{r``>_l|1n>()jUK|}-;ELbQiMWxvgX$clo zq^Tf9sv;mY6s0EtQ4tkUs?;D-qy}lBg`hO)N{0kO5dwrH(h?vfxjQQOo^#&sJHIpT zANP-YoMY%7F>7b7x#pbDGv``+?SKpU`xl@eUOT7pVLDviN<kBp-o75(RCOo1d2?U5 zX<xKC*n{zP>1bd0-745C0KIT6eBLXc+ljA!1>$4s91uOk(GM|s5#?s3Eq;8sj-fpz zqF_Tfx5|f`*=bUB+VRYD-AA%q+wstk7z21FQ;(s(V~NJrSE;$W1L1*QAp~EIBh1}m z3_gyV(vvNK(!ExI_Y0X*p}Z;oQhGmz=J2|E16Xa%vZySTkd%z>e{sjA!_BK3Tbrdl zux+>HNY@JZYtqri<{8|6V~!UpR>3D$iQ~E*>gW=~@Ru!m@5Ur8Qz(@m9&h3I%6ZBN z1SAC~!rc^aD=R3nM7{R0NC(iA_$pV7>yUg=uWMBOAU@^7>Ry~@D)DowvpYB6?Edbt z-JyNNMm^mFj^`LY?)cd5$Yu-mP~uVb$Nd!THkdvdea!yh@GoX~V~|T!SkZ`#I3@j~ zXErBp@!+&j!5yidx9wpEuXDGh>8oEcEys7jG@#XW;lYJ>AT+&hMaS-+TP^UaZOd25 zcnltVh;Iw$Ce7N+I+ef2#YA~+<_Nq_m#$kqeB<HfmeexC;L~=w1L9y2kgOP2Q)<7- znZuSazk?3x`wdqg6lf~)l@>HyuHLcg7p@1nHFrRO%I*J!^A{Zm2@tEhcI#sML6Rmb zLmsD^h1%EtvYZWW^T!H&`$SDE<SguF6i1GbxGT5rsGn48`!b+=(7%!R=zgXY^?qrE zxq=6ym9eEot$FEQRwX<tE$sP`?>8agPgGjiq^mhUkfs{0SXYv1YkCQ%xN?60{I(`q zE`FK<ek4(SJuxx8_IM~yH~u5$COn;K={Q5NU4m75Tjm4Dk0?#8a*_!nBU~G(1)M-* z5GW?tOdzxy#p(u8dR^b>PeLiK!+Xza)IO$SswO?O+IKy9M~~TzgdV?A#n>vKCOh$> z?-RHH5TC1;yiSNhbOzKw+cwREtbT70OTSRl@{yHq$@{w3I(ckHRs(<9En_Cq?$%<* z0bk=j4aEFB6hSgMM?B+<kgg$^#UKeEQT}vg=r5;wu<Pr$z_m{RXlGbd+IB}oYi8r= z2L>}LMgpuvs$aN*XbMHN%`@;>fkOi6B%fnBOI{tyz>0z<gyYu@HmES0pgsp}=KUsI z^e|m^AVOY2&f;bo-!in1U;Y7DHMlU=G`U)#R*nC>$>e3~7Ph<&o?Xy*TkYm6^jkso z;wO9aS&J%ek#@a^G(MEQ1GqaM0rJgzYlkb|k(d`j)OrNvFq7sR%w%3=gs)n8F~Y|W ztAvN#=m@V8`_+>mH(rx-jJVab`#E@cYS8M_wloNlX5En=ap%lUm2-OEtr?eR=Hw$m zOXp{h-%a6iNQ7BgM@f3#8m=wmK8wjncM;Jq0|6xv)zODie=Qa`-m!`6YZ=_*=;W`X zncgrvT~y68qS>J8*H$KY{mm78T7}1)gUgT3e3EwU<R|{$yy$Y624nfaE>q(f(yqJq z@7c_yj&t^a8)fw9{2WeGlYguUJx@~fgwcU*Q8`;DQQw@tM8(eyzEM3)bN==0P4kmY zOVrbIrwVtm8^`S|*u;1h9I_VX_VPd);@~)0o;0Dq#g8D`#s&lNY|ds!^bmdL*D{LM zw+*KGXZ1*YJLm8_(A6srSL(yhj$i+nq%K<WcI*AK-)dgHC*9F@yqJ2Zukk~}^&QYd z{Q~Ft&kMMTj;P&uzM%0D-}FbpoAs@W?0Ruk(zUkz#X1SRsEn2eeEkZq+j%=7>6=%f zW*J(ZZ67<9#QHEe?h(*6UloDfjpb3N|D<KFG_1EW#{4cCjm*m(Hh2s=oKwjhw$X2z z0bYAWdsL2Wd1QH*O!QDUR6&Mtba+nOExYI2f35UCA444UK<MlFhu4_Oj)`jLDD)$F z6<iM%UAu3{YJ4ydYDqKEzjqp)dRp?#6|paw;k+ecPLDM1;hdV5;-{Aj;BEnKu#vR~ z_<aH3A8VkW@b`XJxr@JF<FM_7b&zVWOXntr?rQg0VvMs^EP`Jwh7Ak{&{Uara-Up$ zlP_uTnl?cHQ~RD$HC_AQr~DYw<}77_8Sie&M|=!o73!XBb)5INXXw{B1vv3R@`|J- zLO!_SO|~p{bge>TGx#JlBTtunv@#ycG0cE<P|W<|8Y$k&ls=$+9>uS87Rm%_npKND zI0Xg7S?qt>=Co6h1L0V}6gg0A)xU|qrI>AaX}3Mpr~8lfaE;r~w5e8xMpi<UmN*(0 zfM^*qJN{%m=$Cw^5AW~-J&(W6CG&#Kac>;q*qexO|M^DtyUxnqVw)j9pkR{zd3AJl zHp?+g@jO`Z)P;((4#JBnC;MpwP1Tfl<eYuujZ2&RxNinPceY2K1Xgc>8$~$;;rQJ0 z4wEZ}_TSATU?FPi#jhb@ZmLcNFpq$M*Le4j2m>(6?|7fIIU=f_7<roUG@_$n`mHmm zsi=}cr`cnkKYkDFj@JBqr|`vZ-}zNyj&cP`kNi&_as4hNw!EwHc2c@VGsde=8<}QA z>-h<x@|a65ag(B<ew|9Ew)}~;yI*P~9q4(Pp7>?&MKrqLUMoAZ+l>sg?LAZp#HZd( zjHhN@w#8KK?4rzUK9_-3u4$S>Ppd6XHp{k%%@)P)aD7BwB}zB?vBx*Mr$Aa%0b5$j zGRy_M&-Q!i!<Az)!7!g#vdqxqMQ)&)1e7B?O%d_V`<K`?h@klsH;jm+VS*{zuN^N0 zxMS0Qb;mCpdpYNg+lmoZ_Db#@-#0PZV_YP&lDnVhBtkOwD2#7sB<@%GS#$K{79RQ* zKrVST=)4X|6%km08vj0NFvWShY|qHrsROxS$EIdMo^G(!8G_RFkB9jjrLI?5(n@sl zDfz5B(~rdQSWWtH1E10iYXZfzI){ntKk*9y9&hi5$ZIQ#<C9<64n@dKpN3<p1>pTH zW?+i9NKW`221xVZ_&i;2B`?;^;>#nRKFQDFa7vY_<?8+aVwyEPoL_Oi9EYS1-?+#T zGip0h#A>5Go8vl=%j%Y_Wy2-JWl;)wg=CN1|GVb#lk>co8)zh8M1+t0>HFwvb*_c_ zY5m9P!^w=fU#sT3V*|M+De3{2V_XO1{TC}*AN#^o0!$`nh>EK!=1E*rX5Mxm45zz` z-yU=|#pLt$3iQ!p&9*IR&b;j2H}t+{E`?)aB;ZDZw5=_LvV+ZCCp2oD9;!YfH5Bv_ zwkWGgNnNvPOT=5iTRt_Qs8K(5LrE1LKcOv4yqLa~aBix1zS2t{w5btL+-=;tpQg_9 zU$$jO9SLH+N{E4cV@}D)$H@B?^$ig_mwMhn(cF&vc>-uKpD^w}#fuOxg+xkl1Os$T z^Y%6)E_R4WdBcHdXI%(hK(!oct6KRUzw|VK)?|-LNs?NP&BAx=EsIRyD=_Ou67HGa z0bU}5ZodidI-<WEPsAjGd`3Pqc6x)}Gp!0%Sxp^-twC&`-kHa-Hw_Hr6zB$&O|R=V zr&=@5`2+am?4?y$UT4~~UXt0gTlJD}5`sc}47DQs{7{YXgn!u*?%}}@%EN1FT0or0 zHuzmkR{#*1qYs2X8p)lG3rqd{?9s0})bA}MDJdNH$+91JFC4y61r#fMr%OfVJBtTS zs}OJI1!*sjPrLk})N*fqeNXszB;>pvq#<{j9Q#;5=r;Qfk9qrr+G1RFV{KQJY}%d` z-2X;F80yPfOW!`@aOWgU8%jDoNj&+hK&UajGiBIP1;pLU0o-ewW({4$c5!S^zNOgf z22?4`2m?ucBM#7mRby1pxvwRyD@i36<bStZ{)LA^N5`wBFZ`wme|p3A(UaRvQof$% zYsMElg)>PpfMZ)+xoUR*f~zdPt0WkA>SMTF#Mjp50)2d}sVMg$*;){NGg}%j-0#?O zH}~R=v+QW2v6;)m%5wnAMhiE)!QzG<hM7_<P@j=}@3?0sy}PB{(tE$gQ8R@PmakZ$ z`Qg0F(O;Z@MY!~9H8U$VvH1~ks}FPaV{&DCWmm(-$I@&()PdKeZ9VV?ks7p;ch(wn z#oTu0Q8%%ydVKZuf(B>Dmh>s7kC%;}zM@NhX}$Od-PsK6*boQcmO}^uCu0?^b50t} zN%j5Y$xnIjxt^~*TrQYZ_Bn>1U3ogNz0y~0sUb%abS>iw&8J6b_t%HewG*HVT>apF z@OjW<QPJu~V{Sz2!;-tKIg+?y&TaM2$%55dK&oP|-2}i!1($5g<Z$iPx<Y69!5DdB ziTk1~T8h`$8y5NOmI1P5P^u^TfS*P0iE`LC*@SLnme>vOc9?`mfLp-j)#Z<xX!YgI z&AZw5zk8d>8)k0FLEF$?TBakM97C!X{D{A~WghFGQQbpORdR_MZ!+oD|A@F;0sAr^ zj0iXnYN5>i@<@Nxf9sLEHELSM-o4+vGTb&kwyj;D^a1bA@~dY^X5XrZsyvml*7ox+ zmb`x6!_#Z80-6=`JLDE{-<D%+t!CvdB_v`Ewu7qP{yTF|<?#txp}Mx@I#`qy5omoH zqLpNoBCRdcooR3DoKj%ge6vj!nC=;=J}Yy$2P3ahq7PvXp9Fzp?lUSs(h>BFqrcuy z8}xj;59ZVErRh2@Q(x_84@;S)op*=}&?O#IIieHV5^vH?5r6^DUQ1KOUW>JhN%}Jk z-grVy;~P~Qmr)KIewcUXY_1gX_u2s4)dMxM_KJJjXEA+D$_01+EF>uOILp6OENWrH zaL33y|04PBgl3HL2cUovJsG~;T`6SYO6W;-V!kq{I>D|y^*MXOamW*g#14t=HLP8^ z0JoeY2Xg!DZk)SmbY_z~M%|k)40r@>XLjJeHx#aMGv64kF5;IYWxUyI3y4VHK6^*- z70kA0D2Pl}{8NJuz*F3@^>d6G8l=?TC~9}LYh&}hZT<M4-?yBu2_6q8#=0eeg__DJ z&^?`Oc6wdMy0;?i-i1|aac)Uv2@+Gj+t_|-^;zg#XNuipCm-yf|7oLlWY!ZRy@_mm zll7ii%bXC|=J)KUW|Jqw<TX;Pg-v&v|IWWtT6ulq%$+ZxHQxS#Y!pe%*49Jz__mg* zcOUnQpbxf$-p+n-rO~g`6mkx0ai>x%cDm9mCnqW^ZfT3<84*McBZv_^e$)*<0@%i3 z_CGg{5JDodReu$f#N#=0FD!b?U$aN?wku2%<%+hq7RTL@`OZbaDjEkwHy=1yyA;jx zi(Earbaf^i2S2VvL!?e8L_N|3hMuZlb701`_wuzfea>!}%GRDA*PQr8PL%RZe++Z! z=(&HDv4o87B|6pJrYbVK=vKh;MD^%uLqyE-WBdyA6tG^v^a;g@DUipJ{nh7F)5MYJ zIQSz#wVBrJNbqN$Uy#R9jRuCt!p+z?KE54aQDO6s=VSlS+G||TAL`{3USaLHrZOM& z?rRx)5VYd8nfyrJ{R!<Ny{gy$rOz@~zgWN6dC|3yErhG-*6?FV^h+0eP7KHxJ-*b9 z)!vz)c{os`nj=QNOU3`rfGFSBPdf3`y26O6twkdNmDIx7mFkqW^Jp?qD~z9W9r~zm z08e55;OBbHy@$QtA^z6SpUM+-80fD!=Vpr5ogjTVd9pYZnT*#ZuEgBLShbvW2|U<H zD~GvuLyEjDXS~^&sO<ufiPErW{g<!k$(;Ww5e>Q}J;D{#|H3y&JZS%XA7xOk=<G>} zh$QcYWkbGpN@wv~-d2e1X1ZlYA;)5o7(5FVTX<SzYc*mT6kDTnczKF671(+lfL3PB zN+d-9AL)3+3-s!~?UP?j_wMeWr|smwx5ioCfJq>0<-1cvc)y|Yi!9;wPT!bKz{A$b zV}2*@Ep5rCES-MJ2xlOpERZ2{s*$PeqD0{l>(B_hyrE-Wd^?x@b=<ipx&3_grCk$+ zk(i>hz2XczK}cBM{0j8xD%Vm@4dXFjfI*D+Q9Y<F?byR2h#)J$32T$^`+X<dFj@C; zG=r1>vJXY0d>0T4%2z&Ww>^7pQPIhoGBnGIXl*yy$;r$Asr~VS(Af{#+I+40A8%>i zT9on#jt})aoU|ltv>HFHDFzPR!avJ>h&z${yg*dZLSPT?MjZrTnVee*CV|Yfl7rWa z-xlxtXj3u#$e55pO)C`6df#WAw{+(faYw#t`S1_F1a{&0M#q+JY>S=xv%HI&f>L=* z#v~N(M)X}%!eQF_A#z4|NRqkLtwkQwyvP|RDCRWnd-DLa_y(rK7u?5XzAuVFe9W#U zRe$od$4R^4BY&^U{2r=?@?P;x9}mHoB@3qa?wlW}61(3J&&Q^%f_z(fN_{QgTpO?B zq<y`e&{0S*yH^I(s-|Qp9?At2Nwq$mtvbfRIR52jLEcHPIm_|jaLHHm)DRq$Dga3M z169!MP14&bfcalcvONNvVar0G>4CB7vJ`Hnr5`$F(K5|E{?lf!+y}Y+LNYNXHlafg z;^nS{U4NxW6+TPFh}@I?#JQ{PaiI04^lN*{p1WNb0b|Om{0Xx|o)l$5a$zNbKHO1W zsS5mANE#ZjANHM$lbA|$qas@z_F3M7q3+dJC7y@U?W~B;rFOvylU^(-Eqj(oshp~k z^abQ#_)gYycpdn|Ue+?RmvJ78yg3L9#a;!!{=~_-O~+#7@#GU6Z~mQO!!}HQUNRUl z2cMiD*4><zmmqUrq@3k4m~)?mmzahONK7kX5=j?dby6C$%Ni+|CBj02LIDNI=qn$F z52da!OrD?XV~`%jNsx_sP@LO#ifaUJ+RVYZZIN@*FXVnv+c_dSR`uo85zoxTJHs@F zSoC;8OHR8nHcu<H(!c<1OAJ#w&P^_M@h_<}^w6qruqd@0G;FmROo)z7(vhh=gw5~E zpyah>p>20`AQz{SDry=DN3C|_!;NaFpQ-QBt4<3JKj}9G2D|fWvm3{m^uwDU^r(1; zZweaSc`c%SdY?t7)KshSQftKztxgQI2oJm?uN|DLeAo|fUhdo#R^Ks3Slv}lqTHKW zKMO#zsg_AAYrGoM!TfxZEEbCOPq^p3ZKtq%(C%w0<Eh&IS}QF`i<_|CI+lZ{g(7_C z(9QBYMn$7=jmR{NRguETa!WI_(=nZ8!urItp~I=+87TPKe0P6_#hWrKNu1!ij&_QF z6M9pI|KMgX!qw@!_Es#>kU8E6M)WkVmfUJ-(}fU*ZtcR94`H;n4tN0Pt+$URBxvW# zyT~Z#H*bAVacR)<6zWj?2X3^b2ZEa|cy8=wY|y{}zw;;e6Af)}AyfyZ+*{&gE(iWR zBlnyZ%b$>_lo_g0erKT54wFL;Nq@|2M-65V2~^rdrcu0Yy<o=YJ$7fl>~i6rv{My# z73;m$5U@-9WSoZ51=f?v6AfDJtff81?K5*RO~aM^$VMC2k|wE%z{wxDy5nZ&7~*tF zaWG?3W6~jrdzBVAkW`cC%-x{qip1mz(sG`d0fw<|A$}Z!fquKmxxqEly0(lDtZ~n- z84W#dHx;-y-mxX)NQ;pzL25I+Z<3l}2P$>U{z1V$+^*ojR16^xzRb#p`4<sZmIIby z{h+gm&DcgJo(CfU0~5}{g!{B<6}OCvF7#~M5vp-wN?MtfJ^5p*OTH>?&9(l8vTncc z{m3Wq8%3;WMj-<`vw|%#mUp`4pz8h%Z;U~D(&^2ylo`6BVmpd4$9OkDvoRM6tRr0# zEQsUdIJ5g&F8uTD7Hwc@Vesib+6e*zhXYrJvIsfpj?Cn?(DJ4J)+B0w2^up)>!%>` z_&5eL9~Zv3G6#rhiFzJgajBQ~fki*XHVEC=|ARq1<H+Jzcqb5$dI&E;L1sOQyuj}y zc!}yHNQ1bZ5R!F}F+7WO=FRnOJu1ct%zMag*H7vNzvNImKDbTkmOEVc6oRmA=eu|f z-F{P;OJpK`R$C6^rMc2MZLdeXKb3{<%Kj9Q=t&GqXpU>E?q{mHSW)rSTD_1HQ*^Y$ ztJ&}u7!rI6@g1z_h2b8f-aZxR&$&(Zl}26)d`+R<S!fXqr6LI~SG=5F93A=;N_SdA ze9>A_Ek=77ojEvWHHTa_UXx*pR4#iP(!JR>0ABq!HbC>=O>Wh&cG05iW8nx7ye-Os zNp+ApR|@$qVcS<N9)57MC`bVHLy8Vs2K9?BLx0lC=1rOkAOej`8jqWkNYWi}&R)}z zI?oQLh@Zw%;{x&hw032PUJikv?%DZp@Pewdag1V<idMTmS6k@-tAKTv^`Xu7C-ecQ zvw*WeLx6w5N`qdR#mYDZ&cQi(N!+-#nWsD}jn##>EbP5_m8hama~WI9b1hGG&%cjb z%Z<H68_bh+AkX5}P@0it_;VN<jMBJ9vxLt)Sj-$0RpcmbjC2ieEWto01l*4^Lg@#) zrT^9Gfe0BCw=H0qF3mR^$V{lE+<0BV_-qSAZ<p<;A0E$vgA|PYC1=K|rPH@_!qqW_ zeHnf~O-<d=et^9Pq!}Y&q5<Flu!rX3Ro?<=0rXu5saEHn6!Nf!wHntgMKF&F%byBq zKEBUFEwg8yn<wMN<cIjkbZ@PRR<xIbDx^fy6HW}pgeNgh%|$M2tx3RkgNcai;Gug1 z@B@oj2Vo$7_iCmXeFHPTylgR!X9O0P=cZakE_hxf-_^avjL}`gIERoD($>PH4tdA@ zq{}lYB!L0eCzcJXk=gNtWJB<IOsXw#5$m1k^If#`ZxJ2H-jA7#cQR5J4)Q;-DXixD z>6aUk;F3bh81ox4^?lOkhqv%dIf|UU5^9Lrdz5@D*%Mjm#a*ud8&Y-(9}H?cH|TaD zMiW;pK06$xp`VhF7I~S0&oeodsilHeawT_fU-d=<o*1KR+s5!7tUh!nXUhAk7vdKt z?R>yhM*?l*+}3(oT$*6%)-zw~!CWymH`S~B88L4~ShFh`7e5n6y^k!XyvD|=m)^O< z?|foHx?R5tldILMpIUw8S5F!&tj))%6~l%&q@XL$dO%}GHtQrV5N#ZR>@{Vif|Wn2 z(T2U{lu%FM3D^1Ck}?7>`1|%I7&MK<G$uoIR7A@I<irpH`0!{fFP0mS#@pCS7=hXq zdRhC0DB!*)7deLRCkeGPA1TwCCnkPmWZSW{T8hx(St+b;tcYQZYn8jfO;4Ifqtq!d z-C*qK+}q`A0fw}F^&z$U#qNM>2Utp2OjpL$z?v!EL?-rS3jl|M5)(+BuZWHuyP@~x z*L&4z{du!~Iq9}6shjW|DP>Fp9foIAtAdJ845L_1tUe|sn^Jpk1uD$gX5*&~Ox0r5 zE8Ra60t{G|%aDAirAI}9cj=wLAu~{yVSJWLhg8##5QWv3X4y45xCwJ)xf)TojqAFx zVuzB&cXfUcNUT~cr&>T4^>AUxWT~H43y4h*?K92he5pW!>&G#e!gKeK8etv@Q&uhb zd{zKzpi#M6Ybq`$=1Gz|YB>84&ag|(xnrog)35^~=v|7t|6$nd1;BX5#OCxN!Pcyg z?@g8f=O~6Iwo`B7svWh*M1$(3zM=2*-fr6yjPVBE!Ru9$YeINo8cK^j*Qn#=aF12T zP*tRF&KY!DgmkaW(PwCnR4~X@X(+s&K-IUS12`~Fok<&mMZ0NljGui$lz5XC<Jt+6 zqCU5!7i-aTP8{xju}L@6-r$JMx1Z5_n$$WP3G4w<Q(gDX<WWL?$<-mzMZA1B^={JR zV+v9l*2g&Y)M!;6KxmZ(S58HE!9YWXJyv}&Pu3chdgf!#viMyDJ!444(1Cm7VZCKy z-586U@O_T-NrrKQ#acaLOn=UPNR)~n1ik8|-nD>Z(aD>FzVE!|j9D8bHaoO6p$JNi za<Emb_T=JaTz168E8Y+EYKA@x2=q(BQG*rAhrO{LHLq219uuQYaD7I#&YJohUFCZ% z!6r4Nqw%r;B0N+SBqpSOWoh9i+-zS9Y3obd3v$wIvbW&^t@$+qs?k(plmOO~cJ8=j zEXj$y8+9mvKS02l`?oZBsNM(`1E}H-G=Ti`?L9L25Fwv-%vke$bXR+Pv_x`zTG4F- zIo8)n&Plpxfxc<QT*Jg<#!t&qe+CLBzz}^sL3z)BF+^A4i*P==m-W=qJ!h^3*646n zNRK85jMh)gW~4IBQHI|zW(%=i8u>9L(+v~f)V<8)$VmF;G58#28M9Kj!#~lQIor{X z*q=;spz~JxFeA$_KD{N9l7AR1dr&pG+t(<8FQUS$7@u=aG@Xq-rT?_TPGfa)@MS#G z4`&!Zr^fbR0l;~$0`x;HVd}obc(7?$w$7_fK?6HYh9!uJ?%&g0(%S$p)-}_DpNsS% zV<iaALx$Y}09}Opcz&6Osk#{VI-MZ)UAI%RWo4|`15p&gu%feMJi#+m4OR$KjA4^A z##q6FTCcpidjLS;L=C+!=n)_$EO)ib63(HF6>l$vL!PzSX<vk$n50xJ8Rh6we*)2- zPARZ39h8{HcdN-T_u+GKcp-c!1=w4?AHT8|Hcfz(SdGq!ep^c|ZG7gZ?c1i<w@42E zlGJt%>%7~pOYJXJ6?O~)uZ;?Ls=&vn$`cj^q2S3ajWHb$v&rD>=@Ae$E8J-^lk8Z5 zo^ZQw(<xf&-SU}MOa1Is1BkUw>6U{o1t%5V>qu?J*UY*(vU20RE_w>i%{v(vH?3e? zv!@U~^|y;=A{<x49|$f|ylbi@_bdqvdG^_@QX#W_{m2FN0ui<dmyiO>phlM@gpQuH z=U9@!EhLnIKEWau?H43)D&zVVr4VJGMpAQOQmF#XiA=Xxs66M0ahfz%bFH+kRLsW) zxrbq$b`-8mCiGR3NM8<FygSJ&x?#Y-CcSK1+Lw!Y=cm1F>$mV93Q%y~_s4W0swd?? zB}|B)e8rKK?Ys1Xh&5GZW28cSqi1wkq*D1M0}D^2nagc2yraWFUilE<sx6F!Cyb<o z(Ng?4im^8~v?TxuMY?eB?enr0wh>vlZ2gJX{F?;93P7U>3C2P~q#HXrO>}L^Cs)er z(IELT(VPs!R(we)QNYR7g|)AbieD|Qu4jzFutDDk`Ey$+%wyH1$<MkIy!Wu#)Zej~ zoaH#-EgyedJ%`tC*$jW?ec{AQi1!WOuA^dSb0~N3{c+r&ySw|{7)$%^m)4PZzmRq9 zwNj*}x|`A?CjaD`nsG0)SC*h#hcY@REdcU!sG305Eomcd4Fjt7zuf=iR*o_1DU;B> zchfj4jK4O&>hob`J0WEnm85^Pd*w)vf(k+@0uQpMD4mI~Dz!aN=l@31ZLeZ#${I+I z<Ual<9t^mi3QuCcVcm48MFRhvCD+SNLyrec-vDh*UVsl)3zTv%y^tv7W{b@y^{EC8 zvXFSeb?cQ!ebGV*FXA#4wUmD)X<pwYNs&bs7d(4Z^<WCO&&9e{X!(v5LYsqBN#B^v zv@ts~_cqEWybY$&X3l?>j$5qkPaXgy&)xr=Z`#Oy4o<rxZ+uv<Udp>z#pl>q^r-1+ z_pC)GG}`0m%S6t%uzHr6Z$wI+#@FbQrf>qOo~HDYyYABKMrF}ypWN~9AK+?!F}2U$ zBNAWGFJWG^if;tWpz?h;%00<pjdLO~Rjax}dx<WzYBOKh0;+JxJpO}Sy0X`lyG%_j z;WO<swT9}J9!Ppm8uf7&P%?p|SJRXG%-rc!9{xp}IZ7Ov^BMQ-A{M$L(jrUWG_81J z0ng!&iLwB&GOwV##mFqi!WCV@*hRM?*%vXy`@u`lpMX5znhlpNWxVAxKTeFHR3GFp z5IT<zo%1~6s{0iwJ>E{+Q|K7M9HKhsNAx5H$W+tlCH*jrEX8M0EFU+&%3M{WtLaZH zkCahSecN>E87D?#elx8<DXyJGO54*1^b}X+B23=Nq(e-#YROpq0?Ma*yKq1NC;;p% z<}Aj5oh^R|6T3P?bMFm4CL~c1$f39&)Bc6Wp5=G3WNk&SGi%{H8ht794W=(ICI+mY zl9gRP&aeBlEv&gv#LL8Y7KK854?_~YN`?o)4l<E6YD*m(4>Om$s5jRv=pQODh;bVI zTbMLXx}cw{!X18(S-hSPaw+qm^24J)F^wiJv_%*4_xpx;Oo>(w2@<?f`b*w9!!IcH zw4sj1Wd_U?(@V)7w*%p+_<fB`|1jRYEiRrajoAzP3%~W5d$wJZquV98oV&H)WcQa9 z?)VVcoK#z8^bDT7DnrJo@1ao)WXJ-nwS-H5kh4aItJg}uo)I_bJM?9{EQVY$AJzrG z9r1A?$rEOvS2dRXH0k~1kXVo5H=Rm<1Kpz1TAHP@Y<MiG%)+#yNowi%df_GLIPY_8 zrjBjhuD#cy*K&-_t=b{?=nKfQLW_v_HwbQND<5~|$^ikB=cNRxgR!dQ;!E^i6sc}W zaTuIiBv7z(fuR1o=RoyDxUUR7ll@=)@)eiI$rOx8K^GMo?ct=k10^G4<2Ldwk8@&S z1dxJkk0?qorFIG`wmL2z&a>k~O(-F`uiZ${C*mVJsk-%AY-eM~L{;BRoWCo&cy`dR z4P20wQf?brRg|`ZT438M1pUafeivp7jQa|J1%zJOFY&TITe`(_KjGcEpcTQ7(epxG z-a_+WDBzAO@!^VS{V=*1&it^Gsb`|~bjCp?<F6i78dc(!I~87Csj^l#)i3Si#h@(> z5>LJE$SMQBcIr93YoiqNE+g;-y^HgV-^yKsq=j~|^InhZSRlsSL;>10E5g@v!H|01 zY2jT+$0f$O+$!o}0nytv)bD_#zz$w<q?ZjxkYAXUZ1aTb<3N31c$FA;Bt2a`-TVyX z7P8H<ZKV#ga5Awd1=Fb$@!pQv4>C?L4+F68Ro-JX!EB+rL_AWtJ<k|kK@(liK}7=q zF>)b8#R34CT%;Ea`&o?KhA8&Y>PVh)YRoQH!?b;LSA3)^#$(WQ0XFY~agCU#x!zl= z9O|SYeBh`&l)Ra1#Z6`F#^|2Km-sUn`=PeHj$lA)vvsq8`2l7qs#;)t5O2B9^56Nb zI8?wz%+NEFs_Bbc)SCP0`=I(@wOFY@X-H`ZOrSv;^lnMKnKQ)F+BZ@b-k=$)r-B%I zvg*30^@4)QR|)!sg);*M@hOo6NaZ+H_nzK~iCB+iOaEd8(_Wyg*dsyIe@;)Z-wN6* zp#O06^M{rEesBTYnpMLDR#K|V?()OLuqpL$&S#gcU8IQ_sW82EhI3>toGK?xY+uTy z44CuDNRJL@1DIGPSq)C{4e*If1E0)?*gY8esl3e8^AYPpOtlAJU9fNlZIuyWD-;m1 z25bLsvR_gi9~~Svn{vu8&+vxtCOel7*nK#eF!^>Pbk*G8ePzRy(xmdal1K3p`qrwQ z>q?1CbBBCI8e|Fwu9_JnW|)5`RK==Q=H-`XSGpChn7J4iLoRn9XI)7))9OEJr9<+h zoIql1iG-@Ifd)XWlhnhp`j*eny>_Q_>E3JRGS16A05<#NhZ2N(t3xZao_sgr!9g-f zEtmNFQTq$hv|0zyw7O2+_~tm>!uD)C`l$qL`0e~9QLE}P)T)aKqxW~>v_#Pq8Ka+y zri7HCVV1p&(t{}P%yVX^0=(mi9_*4IN?t*1dGMz4Tq%4~Y$$Y&0@E&8^AjZJn<=2v z6)>#ZzRvX1(WDmf^61*-IU&q4Oh?L^&X$wYC>tF*mN@^P<G{&Mj&R0^^oz8_6)SZ4 zWmo=ZLjenIuFA`YmPPydf6J>SFKgz}yt#lzd-$5?1T+(&oXo5AL_7L21FIOlK&hgU zCz#x1<5FB%RtkmIOo_(J;I{x3Otu7_8s^_|_u9FLA_-Tq<Q^lLANH@Q4<abul|8+- z4hD*>nk4TBu#W2oiA02Vz!zBZxMAs*-}0eUL^%0@6KwK+Ntcfy4k6}4xww(AS-<0K z$nvlUURb=^OWPqtNqrZKId6@bXG()SZp!97mH5N{WupL^`Tj=;4NB=VY`|A&b!%aZ zv~U9@TDUBi99<>y?RJV$H?pI0BVBlRaI-rdS0>+(HS9plYevUAu3Qx@hAS5+^C;DO zo?TCqf(CZIBbK4t(_heUf05fD1MG{|_?j+?SEgw~49`YjdWETp(Y>`&R?2p*7M~p5 zbH}+Adnk0X?E4vaCI<)eb?09{Nh&$+o4jtl*5^1IlwA>gi1K$=B9_FwMye;id!JA9 zK0-FH3U}CG^s=vNw(>5N4o9!IW2?yX=o`+MzTqXk2?*S+6Ib>5jh<rCihujflB6cV zmlxmuI1&wews`4o>3Yg{Nw%O^%Mw8>V|@1~fi76<x|5#l>icPplA27Gb+EimSFG`U zvHlCz5?qr<T@l*v$a}Kw#-Xm*#K41*aixkR{qq;RGqNqO{+T6Vxgg25*<oDL1lvXF zZc`Kp;G&nn;dXD<ZxvWmz}vbcS+n<us}*eM(ZnK9tZQG4fb_<F`<ss1X<47DBaKl^ zR}0?lSl4vTV;<ROWl)te!OqMNw&oktvLeWy7Wu}>1c)W26eUQLcJuk030k{vZ(ZVV zx+p<bXjgQ|+JN^4Qw<!b-Knqe?}WVs49C1TZDIpjgzbaMUt@DD;A2d`rT?%<@|UV_ zeEHvA)Xef;!y%vs2J6=OPa6X2Qr{d(SKkh-U;NuUZ|L*CUi|Nm{<Wn4v-bX1z5lJ2 z07H5eFviqX8ahiqk#X&BDBi`>dR0eVjPmKZQJm&R95s2uv9QaaqtRdX%WeC&8=kiJ zZB0O3_rjd$%Lmb>h8u3Hd92{gsim*dWW3LK*vp?sZT_~{)|&jMNs;uu>wmlXOy3%G zZ)U|Od^A$=>fev;);}H)IwiS&|IHk=((6CqR?BC5xFbNgIy_SO$VO;5`6#HaGc=1( z5sD?;>0jLF?>~$TD=)CpXAZ5@F=YE+?2(b6=$Ag@lm2`2Pz|pug4!L%z)D_hG41gB ze+WwhSaUv4w`Bv^PUZs{xVuGB%*%C8woc@nRCN`*k4oF`<4Fts9ZJ*4kh0Ndwv44d z1!A7kUc%8=QRui0)eDOR%|8E8Xti+D0siJi8T8GIyMOf~wf#9(+Rx|m-}w^;%IQF6 z(+V6i`R8jvp&Y#XQIP7DNg+GCTp)(Z#&Q3>!~fZf{^NJ7H*>BE(V{b~0;5OdHWd1g zThDE~hO<&54n}NX-9L?eH5}}wn;t^6HU{}mFJ4~N7-No^_Qgc4>;Ip&<lL(PH04O~ z*Iw7+hC2Vd3llXCLE65Kiqf?IsK9^l(*>K@O*ajh{m+#&w(HG*t(5+wQ3rAD1e$J| z8jko!U;o$P?+p*EW7HSr%N_sMPydlk$OZyUxin}o|8phzZ~}mz{K!S?e{O}F*-bZ9 zp#H~@9aMi*+#Nob>!f}CAI#%=MEH&Fyy8I9&EL?H|8pgY0zBcRy@lDW|G5=z0-Ev$ zlK<CL|1T8l|0`GRw@%#qsFqJjmWaf_Od;w(#P9Mek=<~GA{n<XU8U%Qkg88O0N{#L zN0002;y{|mK5Q^rSw{eDQY{&K|E3t1IqOJA3sYOA*6pk&b+5@(8Tuu7Zzx?mM)o-S zeoq+W_(y+MUIES2NN^~BSA;81KdOJRX9A$v$@g0aL}XnN7WxK9*UeZM0{oT_(n@<h z7Z5)w3IN-jNqEfT^_XE@#kKc@t5}-K-t=inlE9skXB%DJX;P%&rStz1FqP(kC41Mh z_t)vcy}ADafEnU%k|OH5J%`vu80Xau6^_dS8)XP3P6Hd!s6i9R3gn$SJvM;nRZ&eq zJt=bkYk&x?5|QA6!u@)Gy}M>N=j73h<Z#-%FR2Hfu8%XY=Ii#~1nE?vOwB8y4eNUM z_z$l!FfshF@e@0RO@p4k%DM`22it=lZ1fIDE6xA#oj6{fzkwlWbl<!1cYdH@o8|Pj z!|U@1>`dVO^P8TVk$+>?$u$7j4O;xfm>nU?e?MNIwvDd+`-`Amd*76SzsPjt{vE`> z|K>(N)-P&)0;!J}^U;0&|9J?0!X-ft|Ji(o_%F)%tFHfB2Y}%U(n8=OaqBhOjXC*m zFNE&`(eP;1e5=a(5dPaH>pj_l0f1`M>gwd*H20sjy<!4zh;2x<qJOcff7rHG0l<vq zzPJB7t^YUM_}^*$C+773FK?~cS_^*pFV0#sCU~ByikHbub~md0#;t%w9rCRk+P5z- zeIvsXKgj{W*)9_;yNznI^><*=W*_6~rVRzxY}+QAQDy-+bbxr<k@YZAGq&q%``2(d z><%P|2yLRP3;s({N4BiS9nW-Cp6KrKUpVYaxmk7z*iiyo8yAZOGv~r5zFiWK18{l& z3*UHWsr;(>W{)pC(owbis=2t;UR1L4+1lUXHE92~=UDr|(ruQ&hEt{JrCu}0F4-*2 z^@#uKS<StdSV^+}f@j<&rZHyq_R6$A{0?mHrBzhAc5DokI*^H**7H80N~v0i%J7<u zvybW0Q_V|+txiu=5c6d!XA8B<TP(=8_?3UW2|{9iL})j=H;O3zEN@f7S2<%CR9o7R zH-xqIb#Y7(Yfg-Hv(P;F&LpW6g?1V6!n$y)TfmqLh*-qh59uuk?1K+sgSIVIq*AQw z!k{vfj%QV`&BtP987}ChUfY2}TM}N>fA+4l^T>fSe}by;)}T8M7*&P+QtlX;LMmPB z+cjL$J5@NqSlpGTQi7X<xJ69_1@t7{ZQhMh6-h$580IPo)byEK%pBMiQ51B3j2a}n zbv<pelXaU>fR_w9ozcNnA82vh(z`pswXjLb1y_xS(WCj!2?s3S(`5jsEf(ow_o4eN z{iEed`|p*|lG`>jPOT<U0tkhaYI^&m*}L8yT+9h8W_rM^jhK@aW9llnqG~=GnK&9X z$+XoPgil=(yOWQm4i=6+I~b!7Fv@EiBI5Oqu0-Ykg>Tkx*;7}Y+9>IY<k)BN@TOLx z&wP_K%2x$dIYeqUNS=@K2vNnof8AMW@#&uCN~=AnYx27qu&D#G@Yqj3e^k%gN|G+& zjiLWE*Ih~UY(I`?kiA=;?z1$>ub9a$9P+}J(Di6&3N%Tr;@P8_<G&LHYZ&KVGaRUl z;1A2aO11#j_)_<wKbpJO@5yQNkLX6sy|Ryz2Cp<lir%;u!6aJJDuT3@DR34YEAm*W zdM+$SvWZ1SVdNSQdA2%I2EgK>)8W3YHrKrlWpovKdW?rD<<Ci~l8OyfNwQWbwpLD1 zV6@80;H|^@kGor}nDY_$Q_EegSgU<4MBr~Pd#7*y6A~}stC{c<X28iNDVcnK>7{$n zLc1!m>W8GlaeD-mS|eHB0VNw)(g*uuB)Iq-YlTtzwg~Y(k6k?zuu=P}e?FDex-=x^ zN^vY(--IY$@P@-6RJRMCd{GI`qQR{?m4;jlraRh+;h@#2bGxLa=h`)i;om(|0WdFr zlgvB|e2ImkrHZYMaHHwG?u0%J^HG9uG_4(E#yS;Ypr@R!JJ_+Hgmb&pL>oUW;CoHf z@eg4M;@Tq|Tc-Y8*>oQ0r|U`^1lDzi!K7iV1Ye?onQ-A{E+#)9R}n2JCmKcloy%Da zidFJrn)D;YopA=ax_OJ(a?Sf|xQ^49Q9j56eG}oc3lM)S_WI<Kt%CnR+S8z|==PKA z2_HcH%BWqtNqQ>NY4eE$HG6AdPn$bXDnjwhDgZ9dtv3f4hlTHq0Yc@Z1EyL$7C7g- z3t@RH%U+7~>P-6s{T)8j+E#b+%O~UGbnbQb{Sd$Gb$WOqnWm%C9-sVm&(^{<Jbjqf zdv;Jo-Fu-;DHhHoz~zy?ZB9~v1`gi0nB;ttcr$mM%|Fu}8L`bVesJilbN{5j$t0mp zNZ;88-4sDRgTSv%Dq$mC4Q^*(!aQ)vIS-N^^_l|KdnT;1p2R?G3twl8!Cd^Nr5%p? zhpJdJwMGY<0*~{gVbr5fA^`i3;gv75zK)!J9o3g<qPMyzT{-CN9YAZ;9^ujVx#*wj zr8n|UFSW<~*cuVTbn+eSO73M!n&x7LNUq*a$lZyf{uH!#Q|RP@-y!;>KM>jniVmGk zzZr@RS0$HOcEVOW*gcIk8=5hi5P&aVT3K!cgYJHh(4P<04@i|OQ*JeOjX&8HsrHp8 zFEpeGqG;OE^ucPiGj?#!u8^WQ@NlCTsB_i&Q$6XR4!8ZM*9n(b_f?H>xp=^K+}bnI z0c>My9t{z*^ia<0fKiJkTF-Pi``$uN9K<hQDF>WbDTo*>wq~7h*?^n;sZrFWCrVN~ zCJGraA%m8f=lr4t($`#W8cg;ln|ck{#!{!X70|^)pRe8iHdxIdL1HoVN{kEyN;D&; z9LJNZ7TPBOCpK1vdEJUwj+Ei+j+yv+KJxYwc>e2AtjN1xaMNv|FQ*)rA}XwP4|-x0 z4p>b5e0tpsU2lSFhF>+R+;Y27H#0!q$*WOy_|uQNU@_*;5OlDbJM&uzs5^P;Mx*!o z7E2&p9}PG0o$fa1IG>Z0Bth!CTYC~-t0tg)?ahlsV=L$*)dY5Go3QBC;XhoI_i>>I z2`gda4aqaqpv#oi-w5*hawP0JF1clSGTX?Z{D_IXSpai|fC?XfGjqON79t4Vs_0G^ z-&4DuzZvX1KmXkS>`{f|W7Mn!-E($fx?SOk)yopivR2hqBI=Ba4!_=_=6#su`ckWE z_<<qjY>RwlE@=xnIfY(?VC1gRF)V*GUks~6G#sgMqL*#;uE?`h52ridTYfv#c&*R` zL}VDp3eW6U^86jV*%@^aD)ox8D+@r>!HW|5gt>5dfIo}vBh9gxwTW}c^b_eCcCSxK zpe7*9Nl3F1u+a>0pd4Eli}dTsk=o6`ITy7xZ{|MqZE|f5&th1uOenwy8d^=u%#WXt zJ`u27D<*%?x#06xIplt+-<jJLGqzEs<{b~PWZ_wKI695-D%pDJZFs<aN_4rJQFfE` z8{L-lG_rfRf0Q53utXmmKwnB2hEA@G6$lvFLfT)ofBE@UwbZ;~IJulqI=%)3J8!M@ zmiXsg{IhGcf)MrGyd!tGZ8Hxyu^@0d)<4!<cOKUM0?J0Ss|lSXOMg<2(bVkgM7?qE zs&NtYg@K?rS$7uT9%D~d+9exr?a4AyYx^9Th<l^$vV=-(@}H~U7u%wMsVW%&n1i-T zUglsmwFIdvtVld=R5DT1F)m6g8`csmUmOTi8a9derufkoZ3{as5Et8|vU~=ws4Uyn zB>9$3P;D|a)pr0g{ksDmEpk}8vT~|_XMG-E>0ZA8YCgw`k*!-i1IM>|>IsJ$c*$l~ z6uqM%TcU)(GyWxzDexZz{Ky&cQNa|xnj?`!8Okx1G(DO`ESZ=K7F|s7AeHo$2H%RV zPACIkclX!3^7VF_V@oJ-f^|nzu0!Ze{qv(ww1jB&q}qchdyC1G>w@hbW19RKfAaSl zH=yWlZ;#&bLRW}r=`;G2bTCcfEHs@?Lg5`D{dhzYXoSrKCc+>AHW1t*1w3(Fe_EY9 zti^hif#^#Y@F`u@DYA+Hjbm|>=Y~*D6vAcfBCEG_IwK)wZ3(q_JTrY+{{_zyO^6nb zhb9V%6`K1ZMZEgoJEMlYhBEzWUH0a9=`BM3Y)(U3IBpb08v=mSZ@f=+T1g-8wVHWG zZ|$Bb_I^tgL5N^Clz~t~c92qHY_B;d#xSXim6^853%>op-T>@n+VUcb?6d$Y5kSL1 zbgMpS;&h*l+R$h@INJ6a2L7s$-?62Na024+Xmx4%;;>8ypGx%&D{$A+9lT6e(^{Q^ zG*4P{?(dC*dxL>hR<GXqV~wOxd}ryfA5rv57*fclCuZzj=!ZywD4C;eMlIDBwo@cZ z$>DH<BWpwqpp(+G-f2^|&s>1#($MwSEjwi_=U$Y8Rkj!`PuYmkP5etfs@zg4B~Mn= z9d9)BIHCbhg;Tu?tETb!<!4N}n;vPkEcall!`Gi<s=4=qO@>Dol8bblv_m}Moqin6 z5?=`snGVxY`kB<jA%{9a%*9Nw`g_lFTFfE-?+*_UZe_vgC^+^tg2j%m`qu&}>ZeBZ zR5Bu;M5QQki+8Rh#57a8ba7%QSLQ!nRnM-XKq*AY^Nb(TU<bU-jSwFev1mL}NXTPP z&|v3roC_h*Q_qaSTpkanaLxFFc$So%==(c-u3&@k(6$u1vdIlI{=I4=n*}}!V6i*= zmvXEuJnmg~nchYLKX^N%JFq`X`qq7%Eb)Da=%D4D^87xPFmp@USc4onV{PCGY>Js! zDXRS9B|%abIe?%_1If7SN_H2|7D)KcDk6P#6WpTt={WGr#}9)9&o^TLJ%sp=Wclxu z&{~c|wE|~4sw<yg`W_A|_Fh5hoRofpV^UEHK&W1@BLy0&eqgS1Guby9V-@T;hxWz* zoUE%7p{neA+TB3!vaa@_L6;AQP?;a-9jvtu|4_PVejTaA?}oQB_s~8R($Ms4nfe?H zxMgxgKU(x!Gw3^$PO&0;#8wtZ+ZE|=R5BYZ#6LN#R^nMq8g1`Vl!4y<cV+m4qcN(X zvA0?!86OodsPG(>G0L5iyen-g(ZtBAvqIjvomoW8uZ)papVo3gP<8Gh&3R;?73E`2 zgFw=Om0DZtv0~g-m{V&Ma6~{FR=U89uAclI3GN=9?k>l7M}1Lua#D^{Zb{DB+da<d ztNU8y5OndoP)6LSa+WgmXNfv%r9+`5MotFeQ+sgm$1331)jyhTOVY(}uFg5VPhPx= znbK4^0T8btX&u%2fcZX`xb~}{`M1MP3+7`(t!4rIs<Q>;sR=eg^w-4iXjNm@g4Ztj zb|nmVlRJ7M`63=J_Q4r_6VH#nez#Z>2YVfzW()Oxd0N-!CO&xgR=>p$V(NFN9>$DD zBG&Fx&TAxH>#Nj*pJ?3I`v^TLL76p>xJhgTGu`RXuWIQ&-2kxQQN)z?4;xNk$aUqo zYX?sWdw)1qNVrQNfphW4Vw$9-j`nN47dBF?Bd5sD#k)&&+~11<{GIee5R3<MM8^d^ z>X0|ytKWQ9Od<>9Zs!t8jO;LsoFe|L3kI?Q9W9KHo`<eB>!C-yBj|>bJO-e-gYq5P zmh%y%!VV4kySjjsM9#ZK3A57XG5e{p)OcII=GjPvDD#-v@I>!nUy=_SQLu;7s6niC zY=3zJD3t9s^2<)`jtTU-@sw(qH(kn^sQ6hm_FcA|>L!NPkgt5Ki|!lq9Auh`9mmLY zF=tN}6Y+YXIFXN@fM3hd{g&MRaJ8|mX}f8RkiOa{=m{+et&1HOLb8gP*%vK3`qdcI z`UtlSNRl1LisAPT{(5fk^5+sMO6EnK_HBACdi5co#rNl?G5!tn0FkVWz%&iAK|Tgm zH6fRyo)mn@lxd)^UZVc<)IiTpBmdE}+-YYp`53Zxk(%<z0ubpxsFtA-!5S+qg@op9 zE3drFGUCqE(#=2zS6V)&9cqosbG*f%jGy|$N})mHm<6=Q%zpb41vQ_6>THVsTel8% zn(RtKZhCXee*47l{wh4jhtAEo(-CV;2%Y}SDe&FW%G_Y`ODuQR4$*U1cmFV2rSyJ6 zQjvbtc`$sSF@Qm|!W*3xQ8Rw_ClOwd6L&?Z&Plj?3(+b+tqu+=N|#8vr%92ed#@uN z<|QZpn2;a~IBLzdFZg1}TAza(NMbQQa*P6Ht&~!U8HqVbV?#fJDt<uJ>}%6zZjpyK zR_YaC-(SbrY>sOrhjNrVx}f+f9=p(1aQa}16_6-XxBq;I&`*VK=T6_g7BARW)DgwG zA|bGZ+Wme71%z0h;PLpJgFm2s-M_MGxtK1n-q=u4yGo9neB{`b4&Qdq)vMF$dY=<b zyv$x3NH`p0j4AtC%VV8oYjq|e=X#y=gxUGbptfGl!du2G30o+&2$3{Dm%MuC_l8^R zD1fwiqDrqwx`Nk!)?%N`vlrRbmCrmq7fF8`WBWDqeW;UAq_k*quJzbM3D3tGFOGT9 zYz4uY1vg$B{7CEl;niBt{0ulJT=)E2C9MU97X6W_$JiGj@5WdrU-!_zXRweo<5R9X ztV4|zyh=sQ_WgMBy>7W=f@u$0h@)=*{OH|=8{X%5dEC`FA5y4)!QMwnT(=Rbf~A|C z=znM?nChgR8Q`MjCARyAv~soC3Ys3jI+%r<oHrWk9pahdN3=5@_GaF(cgebUrYDV2 zCADX^GEX%;s}3>U7ZbcyIq=O1){@5c>=thsYM(nDLh<eJ*AtGq&oUf>FC^e`<h6%* z`!CN?YRf?JMeXosb>h*5NJr2k%fh44*_TREzoksKJ~Z*d&D=gX4_lf?$60#8Dzxaz zEvkEBJqj<nC?8d8VhqJ>*RZHGj0<yVf0EDrxKNgz%V>MuQvAcRM!5>l%#R}wM){C? zz?*1c&m6k;eckg?547?lA}v<JBW*Q6S3^rDL2tp8*f8=z7?tU$ufFSiOAq|sMQ>9! zQV85Kh4!1*k(7^h>kjHyA++@=C_D_k|0_>**0ZcXX=m+WHyjEh<BF)gJ;$KH;a|El zg|HbA(4J-|?IYLG9ImV7m0EOP@>7L?yJnjU&2lC83_9I|CbbW`dfN8P2B)!9jV*@m zN9y`1Xx)70>K^TS1Qzk6LRy%hIaJ3uq&h{RlXaJ4RJCC6&%Bo3v<LNB9;+o?KvLPF zU%!fkGl&cYin`vT){2g(iwY&j+S%o?!wz6*i?VCP{S}~il#2E+gdBl--x^gnF3Xdf z)aul)G7Art*nG_RRZ^}1*f_h*Py1$iT{9yO%RS68r@2Q&duZldfS05`Xh0fQXCsrE zPXDNzS{(I$39_x&AA>R9<?Z593K;z3rn%tU93}@yS^muz(C@rf*qFVqF@FF^YAIf* z$`WbWD<7mX2(WpnWT3WFY@FB}iV3~hXSnS&GR{$(i}iz;RtU@A*%MYP=$V-fUybjw z^Jk6VJUd)6%~;yeEX5Kgfo^4Gl~7h@`Tcykv?A>|-5TjrFC!&Eq5$dXuk7-m0D%+7 zt58*-*RZ}v(poX7elIGg3^RDudTI0Y1AW2&hqw0*YHID;#-%7lr7DP2mEJqjL9ifA zK%{pN0qN39L{va&f;4HO6p^O%-iy>Aoj?dJ^iZS(2npYvbM&0&{pL5{Jnuih8JTgI z?6CK~*S^<U*SfB2`x+0BYFhirR3{0V!7_9{P%Plsll&v{>T?;Ndx!4GjXV1Z%91(s zCJDLb!BPC1(Xx}+bdVQX^+L5olZ9K2S+d*YNSJELlxm)i+6r`QrMfoyt-s&AukquL z7r>j-{6vK2P3W(YkBY;^_9FKF(#h|7VYx_;&ee%%CqmpaZnOcj<6Y3|%#tWpH`E)U zhZ@}bloL;K^c0dV4fxies`@#aMYSEIEn`E;_M4R{3P<?Z7T*xzTV8{@KzI8`kDp0x zr8B2)3@!rUai*P?b&#OYBa@Rj-$WusKh3yfMRX0cLVLMck793xNQa?BP|rNcu8`|m z_ON2Nlb^!YyHFvguayrGh~IZgxQei1C>U)fy7A-2Ql-Bo8rzA)jT%^(W$YK)YZ|7t zC*}+8R(Hv}+`6uL=PI&VK0%DO$|totNPPalb3oeu)-OX|^T&wKn<dXm$P<Io*`<qC zduZU$=a|1?spe_2wBufjBFUW#v{faYq9_7-i$M3I9)m{FIWM@iFq}(Q?F0{U$#O?X zu6Cg^s8YBn<o5<=)O8!`r*uh?craIXWsVZ!Yf{cZS&E1~x@UKiU%7|O6;}W1my0Af ztbsihNRG3+fBCfCZ}l_?GliHrIDI_LzBW!v5_fXi#)=aTol0cS#B1Y`hqn(Pj_O{A zwTiK-+3ai`T)WADjitOVQPV$4DC(*m{42f}-xa4e;r8Fr-j5H=NVFj|8u+k{03B+Q z^*tW|NW+5H*-t=?wdI1rh~1C-q)VnC(90Z_<~E4XeZaMQGEd)Bt?7F_2@M|0aMMYW z?y@NjbdtfvIc!!hL>Hi>?0mHh4?(+~Qs>-znfUm;jHVBR$A#+<fU@<%pt_uCjYs34 zOXWk@lAl7y{G%*r+E{jzyUMvZvcq+Xm-J1l-1L~2{ua+f;u)lyV~bxpP&|vC06VA> zIEcR@zvEGCol0vGZ`%Y_z?7e*v{&b^xxLz3<i{CdruX1`XS(!vQEA3W%48Ha6d*Xy zTCLeB%=OmkBKv%?B_$>OxLaCZ2Rs(D!#1Ya5sM3~r@pRDTnj8-BRWU`nRsCWJ)&sd zKDN;OQ;=(Lew�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�(cK=uf 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�oLSSwrz1WWhB$UAEgVoYz^- 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%0D>^!X(WR}0mN5IB`yR$v=dOikW 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≠cm_(W_;19M5q?O zi(k}Sqj*H)0#5LHd>F#~BpV$7rSyI4rX}HSH|4jieT+<9@P$T9&}|_ZkT2k?TIm3H zjRJ{6Kyk^z_gN3E+Ddxci%Nxp%SfA+mh?Uq+L(`su)VXT)qsS%m#5mVwceLkh#}HU z+jR^6^L^e`+Spt!+7m3w?QU1>nyvDou)2HRW^2Cb0-GfK$||{kF|Hqx@~xy5Fhebe zV&zpXMWUf3A3b4EpMP!%41No^c9pXE-!U6~R(Y*%npI1!hi3O*d`IMgV3IN6sInM( zV;hi;`}9#3d8xJ%@^=|4(-65s@BiQ>`pZt80DeR(k8PJU;aRv5a~%)pdz5mmvK;HH z=`j{emfN4wNmy5N00eClDnhbKs{yQD`@V|%_*Q}Sjgq06%i9QiuwRIN{P}(RoGTsd zsPE+uJdF~R&F0P@+>!;IJPRb9*o6Hj5#aWO(S-|2nf8NbO5rbv1l5&8b;lJtHA|rr z4P@X?chtq3C8pcm_Z-CFPen_0$vi*nQK*Z6POGj<0SHQE-k9vMAh}QUdzEfurru=m zpTDpjBH+`UhHC;*K;Nd&E59%TPr?3drbg^cUb7-#wh}J%Cv(4#vl?YZKS#R@f+T50 zyVJL3LbU=$%cys3w-Ey0NL|E@TVtbdxUvBVNfn(Us;q(d{<~S?>lSJ~H5ectAR9VA za@gnBR`X7dNjtg=Dn|sX=HRz%{2Zi^W^i|t5!US^z7tp^l9&RuQ%4{&NJt<pTSz^U zjG`mHn;=wUn;zhQ%P-p^W<3r$?u^8ak0mj7TWj!e-FKeM7`xc%9Q2b-C(MSftdwK+ zyi(A<J|7D$$l}{p`q0^ApHCN7bQuPz{`}b$huyaK)M;$c()+E~_XK00f4yM7Bl43R zc>b*sRD3b6B>^1#Y-cw+2SptGE&CyHzCA|ysqp-3cdygkp!~~QZ67WZaZC;v*NP^z znLe+qf~#j@-Yrmp3^BG7cS)o@)Ei%)6BR4;bI_OA12@YUgstyO?9+vWalTqnm17DG z``xl-G(&C7PM64m(@tgX7_lv8E66Q%&}XlVS@r}yrW2D#-yiydGPVYoP&{ylC;KoB zmb@$)t!BySTHLGN5-M-^2#QUHKW^~j5Yd$ae19CspWZBlx)9zaBlVy-(QI2W?1ofK zcKxR>hb~@a`EIKo#WfB40hzoI{*n#H7nWk%2At@CVe_qaJbTX_j{ELs*4$rUHg@J; zdI7dp*prW4cvH=}z{+;F!Jk!gcz>~(K0Li;y<zNa(~AN__<q;7j)DN15hW+vsErr= zHJp9JbKnVqSVs*41oKK&h`Gr*VWd>vKFr!RoSl^qD9jp}W#RZvITM9}Mz)eA=RMg| zJTtFo06H@PqkCdpmNOL28RLrI(Rq520n)I!zd&nPkkUe(vseuPp18u1i9f8VC@9IK zIzZW#qMHkdxo^!_i=WyU#av@uy}4AeG*0SfS)-iU>z`<q$?-Z8u3~efsyWG4fg{ea z_kt2YlWSbfX+shvfLHLJi6k+P3r=vI!59&F*c5|>#(epOUyHnYup_A$5)!^4=p^Hi z6<1$KXUGdh2o#w2TI9y;K_7eiZGO>rC*gITUe@DT6%#sf^an^sv&CNw^7jM`%;oNr zg+J4qvfNB@OI@{p(IjgkP4r+@AQtD%D<fh*&b^sDc3PA@ZNl6bv0(an3<RW4oB|ID zy4Fopw#5dyrqM^_^Bi?^O}hM*ADBNKeUH{Zp^?iB*^cy%5G2`Qer;N)LK1aZc=gG2 zHlpmdo%;=~X=ize-$2aY;GZ2Yg${2<mec=LCk&aAv?p#Jy;jM|BWz$~VB{^-gin3S z9#1X4C&OvgZ?AUaC`MRM)7xNm(Dx#cO&6QM0xQB$SLh&NCk9u=Ex^Uqi<pCOeYc%X zNuJ9~OLg2DB?+s2LO|EllYge*B__&)7vVXd2S(3d8bg%7l^HYq7QIBS>64uHD}ehE zuo!?VrYP65Z~`<Z;*Z>!Aod$<cUG!b$#~6nY&aJxAk;H@yCfyv?T><o9x|V4{=R{G zhRQ0(_*+yn>dNFm<qSbdn_dY=PU#qCaK04vNYpv2HS}+RlOz-(70rk91f*U<;M;>Y z5-x*z#cB*V8;!#!(#q;^hVxbzag&JSwqFc-GZqt=`Q+u#;&XJ91EGyekqAc110^EF z;}l+eZ4#I=xp)IM@TbsXqAQ%<rGm1^CBFt#fbSVeA|}_B_<050+4EV$o~xxez`+E9 zith!924&xICe^7rp63q!h>8c64l(*kU7_fTpt)sRfUN7dB|`>K_H$g`OU27^Ch`b& znQ4hTfAL!@Bm_1WqvGl|a6?M4BYV@haW!+?cSegK-|^}%YP5?8j-*u)`1w|XoF^Gj zY@!!H?neCHUqgk02LQrnadESueFDm+`cCZ}xiuZPJirgHk(cO*UtkK0<HpzVzB&PS zOZS|W)(o1zaO$e*`Q4hu_h9thj2vk=n3U89(Ih@S09Y+n*3hDHvr0WRbv;EaMk-}N z9E8C<grS1F;bCD*89!~uKE<|BeSB%&+GGLR?JpBfZFfw)AAmv)?!CGW_}+o?8!I0e zf7bMmstx}m?5x4{D;8t+DEDqZ!th*g99(M%?w?AXyiZ_eb)5sQEsiKPk6nmU+E6<+ zENePL<wRJPwaPLcK*E7F+Xjp8LsG&ZkGg|`<5tb5tCEZ0d@DxsBvc~rDJeV~>a&&h zmMfJ1<Bs?cDQB1LL$(MT(4f5zPkvT4Zwh4Sy1%T-HKfU=>hmHF+e-3oToxrCxYegw zsjSw|*H=+vTCJZWqW~4{`Ov_g$=KVotS^Rsqgf7zNzFFL>6Bqvv4uszwRGW!U3jug zX%c`3ULAsVN;cnf$i4`RgRZt%^HykSPpCaQO~HO2|GicoxM<Yi>g72)yxw%RIKez# z*LgC$o>&h{v7d3+)1sa?n|1v6EWd6$82VIgAly<@-lR)ok~BA71xm9TbsbTMsx9x; zH=J#4JB5UYgmyq2?t>d4zVN(bT0f~V0<%>TyRAE#=BVn96UFMlzL%kWlipNVSy*MS z3O_=J)ReTJAUh$b5NsQ^2XW#|7bspTLC{B~J!!yvtJO`K<|0^nG5|lS?La#ZUMLB= zs?#UFtDa4X6dXmU-sI?H<G`3)`FRNvOQ?gZL#*i^oD*k-8Zs2rR*N*ou1fvGWZRDg zap9!>KOMOF|LTAi3|2?7KLQh2BPC}351=ngyoIrp+L-(RgCvM&KxSNKZ7kN&T3gi} z_i$BW-q8nOyvPRHIbKW#+#E*9KUvuIR|)Alreh&ft2p8kR17aSdicdS7$wr5?I~oW z-M&}#^~u#_@>b4(v9v%>*1M)g5H~(NOs*Si#&KpUgdaKigl2ty__}U8z-M+FSq`0P z3bNL%;=alraK&+GOaYW*d?af5Ea6!zWuOm|-!58xgGDOrroIK?b@%rV+o!Qy6}Q)Q z7fvu6U(tgj`^`q=0|LK^5nonPV(yJ#keZjV1Z#4q1{E|Sqm&O6XIh!s^En#Muf}zt zzQE2v?+Td}YXE=Rv*P%4ej|<rDEsEWb*$Yai1iiG<%t-1iK6;E+#=}dZCLg<XOe#6 zySnqa{$=_$9t;ycuP<}=w42;{9}FV_YrHldOFxNLW3@qs$Ipt+0g_~iM_7vvZe6$T z9T?v#VS2@Wd^3_cI4!LX(1J!D0?(E9s1uRAQkQ@LI4y^JKK{;R=@-L&e>ka<K=~CG zJOs^B;J!mO`9%{5G~w$wK@Q+$5?ylXw%d7g5xTEREVphtpssGr?e`o5DV|Tk>E>2{ zZ*^&ApLUWKT_B$2!zbw+)9MN|(_BNUX~wj+67U&4cT1L)v*t%qp$8MAhwz<;cAZBw z&8o1)48a~6{c`<;ISkg8^epPs_OtdtBpWS*b4vb91!x0srrMihghNPTPZt9VaJD$Q z0{Ha(!EJH>81hj@4=PG6GsgifDcQ{4syxJ|+CX4MGnu03N}})xH&<{6I#v%2gV|^# zvcgL62K~CV5%ZFIJM&X)M<?50RXkG0>oz-Yn)RvY)fdr`-fzx9K*86pX#H%qF;<~F zI*;c(Zlb2bhO%+RVTCOQ9U960T)Kh1CYQa8o6(Cgm@>|rS*6EiEpE;PteZV5=*s*? zYs>yww$YW+jA1LGsJ^BhtcAPm6(8Z5ZzQBU(cNaSr%?yc8z1|XH8=)K@n%I!U}Qy5 zfX^nGf-COfm-0{cdqG4*r#Y?yjqTu}%Fgl%j9j#y1(t<Hw!J(_xVn$jo5L#-Zhea? zl%x&Dv|qc0723)~=pbs8Ju2S68qC)wOZ?jM0nPGfk5(n#4%aG%W67_3A&Q3RP}{#R z>yc-_(`LUdM)l6*{#Dq_CX0vdL01^;m^9}6_v(wGM5$m?q(XTJV&_*-v!J+%S86$4 zKXACp9@zzTG_WO69iWUyb>8`co(&W-&O&Nk##<l6h5u0^QpG16r9`#qx=h~tkXH4s z@V#jWxZUkYijdIN%>ACC0J0HFJ%^&YblW9!+YRbP()56p6g8TX`|ioJw2yZ%p)tAN z7u}0aC%_fdoko90=Tu7>lBI~yPYsU~lRPC-yDp<vNs&@64B>CwKVE}xnvu9z5C1d_ z^gT(T|6j{7??R#^BXZD)C;1=8Ff1=HgnW_hJvo9Ysex+Eh1!k2tOMD#ccP<!@$e+l z^-+V{#ybB1AfTsDW;iF*VGv+Ov&B*~I-%!%#9Dg^^+slj^+3+HFM-TwkOa`?1M^kR zlxkkCpCkJ`Zh^#pfrIFMP4_;`0}}6aI_&zguIFs^TdNDxG8)XzEzS*V&u7F2da{V* z%pE5|-W!p16?3)oxWYdN-(xu$4qffYhZD=|8;SEZl2(+p;y=}US{{=t;U8|He4=L+ zkZcY#H*yfxYZUywFD^fB^cv|gL8?&3&)2!am=TTY1Ku(-fwDCqbYmPUkqt``BmG7b zvq|XX3gB;h0ycOrE9NaFo995^UxX!9h=7v(z}2SfyKpH7Z4J&$+gB~J&rb_8*sYAL zqY&3oi`q?AKZ8mlWJH$(3^78iqWRnLb-2&ZTNecaj@c2e2j1()9X(A8jC4APVO28h zhpzki9i;G`ozEzy2&~j4;%YU#e_GosjA;r*{Zlt>fR!FWTg1Kwb|c^P98AV8-pJfj zSm0)%c*vmD1n%Kc8*xJ|$KjmiLhY77l;R(MP^2f%yrb;0sy~pGD?ZuOQz=tF=tmm& z^mOWo27ap$Wl8+Kho>+>9@ydU2#5t6zY4ufJ6(0O#>jQZ+OYrx*~72!fVU%g99tTw zNf;;~X82062mJwp%|jrh;Hjf;Jm2@Hl33NbkC73OyoVgvw5@z!0?g};`C@hj`9wG$ z`!xP=;EkaenQl1g+qg?w#(G7~i!xBzLW~Q1D6;MgtA@0T#jyk1$=2Dvo2Cnz?~y!g zxFOP~`5S8ycV(*|CRUdmgGIGG#sKn$tFm%2CW>{8<mJH}x&*`Rj5Xe(sSQg_|2#Ip zqH|;0g$GY@Jncl%G#1;J@q2RHCV`LqXILHf6%YqN5La`uGf}!GdcrZv0p5kXIol%b z7al2zT4v{jVa?`>E;rd~$U)qa9#)kRh9+l6g{Ve=$RNkC7A2W4(P9_hh2h2A4K<E& zMgoVs8`gSwKuSGMw8zg9oC6i%RSl2B?K15klovw=WC>^i$!o~R^aO|1kj|`oQ9IUA z>Fq`fOxJ6;mnEcLRIw$gY6tH4WwrIiNN67rXoIfWtDv4Q8(jP>QZi!bgm7<Uzr`Rx z)bMKTqnCm-K5G<}eMdz7d4_C#oSoN*r-fixn%s7D^+)~#gw~4*-S7s_Ud(|Ja<b~* zL^7rPr{-nuT(2{m#rrh>-NTFQ+_DBK3x_(t*SJl*jWwBQ>TU1EVx?M-$k_dlE;I%g zFME=t);_e5Fq>WFmJ|#An3s5VW2JOUfCC?*1jqBF1VdKfsPLOuJM*S7;gIIJYw0cx zT7Utw5~_p#PuyQx*H1Godyw{qvm-i1XaP@(O}c|S$MB|gA4f8DTWxu(fkaex16(@U zi6GDZqnuKSie562DUZ5nPJ@<zPc(Q81V4#xBXyJR{QPYlm0v<w)9WK$`c+*POQw(L zd}sLdDLXv%zFB0AElw*_*Po*Cd^7k!WjLCW4W<94HUIrdRO8674gROALApi254)g4 z-E%+H(JZE9(rxa2I_RD6kMXAy#=^*(U&6L;aQ|Y#!7#b&It|zZlY@7*lIzX@F@YC4 z>N>6#Ik@x=<hIMZj9;uF$K#g+92ose_EQ(ZQI+I7+=G41pogeSR*fDcCHF9*`tYX} zE9qpUHbo#v6B0`_;bi`gRvX&>2a`gTAv~jA1vzy(EG`tyY61`avRPs2=|<5BeOy}V zRw9>b)hgw0_tpgWqzYzRt{yXP*VW;KsnBT*_V$?nkkbJQ#_ISgcPfxT=M;JrbYYe? zGpXUx;*+V0%e`|Ew5o#ZJgo<E2`})OXAZL!Q!K23TZH!Y*xYxV7!cTz>dM)+Gq9zf zQ9w64ds?3Ai6whh1#$UB4*I?p%+Cmh)oT2Fe`lUZ{B-e3<5p=VBrCDq!rFBMRmW7j zJ>q;G9sR+raU3DLFPgngTtGnMKfv>;co|L;EGkY<5^=QCo%3j-W!G-~AX%u19J*7S z77l|GQ-q+*bZwLNK@hy*v1GCJIEP8}h3uv3+$9*U#%S=h7zo0zegayH39sE7yQl=_ z@2HoC_(O0RT*@1aNZ><%xZtPCt+78akYeTO48w|5e<<{%|K$rzf<9A#R~)>iBKv92 z=nOQA3doaugU}?tJ8cuP{oCm~7J``c3p!gNX?-4-LY3V~$y#-!TVVcuv2^8!hhTku z<VXb#v6EoRZyqK8)`_?ph7_pL$utF?BX1YScZDws3-kk~YI<#CgI}UkXd4MA_@6wi z-l<e;d);L7hNICx^WDd4Spv7t1;qlCO{3!uj@vR?(~SC_=gJr!y&2XtjsyxRJlRVr zx3sqCgzxD}ihml_K^kr43`u$Wwo3W4xMoO_5blAPH6DOJwv^EQv1Ru<hpFmA8MhVJ zDXsc97d>0iCsa+;%Z8(eGP^Vj5DSCYTx$zsS+J2FWTv}e%tC71VF`K`h~2=LlaTv- z)J|Dm5&(}az8~1Fgm?ss(Ab(GW2i8SBL1gZ-)VPbDvFjQ0i8AuMlFWbs8qt(b{B|q zs#YWw2<9rI8lFM_&r)dX8O%vOacdn?9-cA|rD#qvlX*$CW7pZS4z@o7b`*!J<<{`A zgN=YL!v6L=uFFBIzx%e3VCFZ>M%?`=`=|GH0?{BM4SHU^4$!I&j#|r@5yp{v<D(R= zZ6o<Z*<x+6dv6=?7TR8{=}l+%;L9Go93^TMoDE%aFMkTJn0I!?=&)yres<g64kS%! zRD-51MTE+8^t`f+dsPqxWN=?SY{%o;h9&QW>*=>iE$tS`81Oojc{H*b#b6^lf9kCA zT(S0BwwC&_Hu=8=WmtnB0G8}HUasBxJnuu?6HQgY*A?kben0d*cRY088*b{0?6T!O z&Xm%IxLfIk@U-(;&x@oGOzm*`EG#5xG%GVj5H3rd!?!Zrur}6>3J~rs0;oC0qIO4s zA5rsA!@v(XOpQU?@5c~=DTl#)20a9)L7Pd!zqxPZnxN1!k#oxpeU>}4806dr^hHm5 zk6BlzGwc~F<Y&3R+&Af^oTE=^(kJH__x4NOzB$GJb%0tfq7ePs4upJne&?7au;4>v zq-SXlCezfPlE*61=2lR?lsx{emUnPMr_`c()0XQ2f*Q+t@*+I+sHCn*YTXQSKDB`4 zp{M>yA)eD^55p*1c`WV-D=m#i0lDdp)~S!}LdLrEw{m(`EO6FBG7BUJ;x}hvpTD|x z5c<vwWnU9SQdo@~F<Rw1wdl8~Du2jlTL5MQt4*7MKQCcZ&jQY8Pz_R&Y`{A8$@|CI zcSz$^q?M?n<ktJ;y*g)h_whKmDr6HX_s7tzfZ|~bePG0zV8)LRZlos=-%anXRF@b% z<4@pb_=2@_eKwT9=fg#Kz6J;3^rEc#oxNW6K!YqK|K87<`U0MHu^LDsifB)>_#p}4 z(=ox$T2d(1BgA%hpGAO35plyW1Zzl;*z{KhcfdwoaE{HW0<Kj`N2`XNUP}Mg#egu$ zo}o9qpq~kZB(9=5dI(pOKZ5-(-0y#UuCVX3s6wfhSu5ux^=N%ZB@G)tkT(HDM0(GR zVd^>g6wkiGUvDoT+t_J#6$AD`Al8s8RVqU|zy8eZDTXW!$3O;kekTjmJ{drqIC#sw zx)p|9KI1Hgvp!<{&aUluC5)v~Egp%5u+Ic5C+F6d%`Om2|2V$iJvO@{lpQ7t>l68| ze=OX>FnYtjr!ix%+<)zDlaJqzXs9cdGMjH8mz1}gm(24+_kuRQn&<ChcP68dwZ6t3 z#u;&zQV+jAZb?!Z(zKix!4QjN0lrrlsNiXTBq!t}*~H8*I!8bl=_}5nC<4D$`E@)y z<^QfEe@c9zc_r%zo4(y*zaD!|$rPraNzdC10k7;7hr!{yc!|Ls)F<7K%YY<4o+N9) z!&06o_ZGgHl5!tZ5005oHc&i9k0x#@W(kfR6IqOKIg<NR9}A7*!)n16cIEn^0OdPE zt6v3MhhaV9VvrJ-b!KIj9NL{u-vlQ`K2-zvKZ1kXb=jnP;HJEVdqMINDYBL+vZ1O; z2s-VGHlAr#$b{d~tWjY}2UfdPg%_rIHryilOHQjtoY3scN1$Fg?G`IZvAbL4dt8*B zUAAy2R~Y=rCX1u^4Fx(AJ!!4|HT_F>k7(HPS2);yaAVb8#u-LdFOlNQF3|F`mP_Pj z-?6WKO98*sAYia5hq)K8@bA~I0qdY$GtL0RkF1w63Iy~<rWz94iagTr-Z#;|P#nLi z8NzqT|3o-2k{1jA)uzt)$+!VY8cD7sM82#~4kH$ZjVKmWn^BaFj45f76d3)kpaGcV zHsbD8E&sk{>dGmexEYVM)n5AVY2()Aelk^Uy+SZJb=YOoX&$VV2`zUq3wV|w*jOH9 zp%!AG{%olFY(UNv$=D4mzb?DiziYkW30c(>8ea~{lt}h<rR!^2Qf&D4Zm~xHX9&_j zXl+e?B{CB4o9swfCB0LAzkAxENdDJ?sdjx&eH@%t5z9bv@@C@~lv9;J-JT#byPgpp z$=<hL>$s`@3{a*{^KlDX9OW3)*zXmOfd6}B{me}WWl5^)!r%5ozC#W8fSF4mji`sA z^d&Jb1Nk%#x$ys64B<^fPNhfMpcx6BNZ@H2ll{W$emwU|;9-a9rU8>_%jxqt;cgIc zxqC%IEP{{*amhT|jt<z>JTD3Vm5oPu&&ZRHcK(`!>vEdjt!j8u4NAWvL4(T|aU{WV zB<_$BhJqtvZ(ZmJ*@F(TCDBwFO}lPLyJxbjt0!eZgZDEzLAOWu`(30Yz;!M`u(1;x zM!;Nk$qq*Y9Z$e@#$pTKhvRH|qC8=rk~;nuxBl7+&5E_9{8?93bYcrL1uxUIzQ~M% zk?3c6pq(k+>tPhQ?WiSHBAiZef7<Hm4Rkp}@o^FopWn{11)_4bE}Bq|b`KZTVWPq1 zY7wojjMPQd^FXF#K81A$4A*O`MUo^I;OX76{_^U4t?_JRT3(XWaRP@LF+yuB1AUN| zmi4s;Du_cDq*8KlLkD3zxj|krc-h$axWS}Db0S8?=1Uu&M=x8eXCV@^6F?QwygARN zblxoq*u+BGVPeXtMOmet+Rg)SCL!}XY5LM^dp4O4yGX@|&_62W&MrSX8~h4Wb!9R? z_?rJz+zwao9(rEZ>eQ)q^Qz+pe2<3&+DD`G9(ug_z*{FeW7N;tC!^}H9zxuOy1VHK zv{$YWnet@QGky8(cVMQ|3sDE{0w3p`N_j9@QEq$i|55@=J$$**37)$mKRbaR`b1ho zA`2$Go|gVALXW2%1_(827Xri#ngNthUsgW;ugoueZc~DlXU#cNmC=Y!1|&a)ySBf} zX7=cB6OQl7N8ILV{NyyXhQ0IQKt>GN#<EKb5Y8{svw^ghs(qD%qGc2TlExiEZ3z3O zDqudf-FhxlmCsS%z3YfNvb$Uyhn*}5!y%YejPsqD%SI>?GWtIui|ay_ru4gP(pwZs zhOKpOVK;vT&3W!)i-6X+J01d^e@n;KHPN`y+DZGT-vPVGYbR3I|M<{p!DI25svXrs z8LPljyTUDeyNJEE-k+2)M6jR7f7)w*l-V!>*5Ae7WmcmUEPt||Yk)6LQB+U^n2nZW zs{1g1Phb`u^K=x0Q%=rBdYTgTSdQhd6g&;1j?M{F*cNx<k4A44H1`!>$a(qFUroLa z{5T^@>WRMRP7t8Hm_-yWsr32Yph=)mrF}i?6Qjq+#{0^_SRQuOf=nO_{I>yXLZICR za`##>g73@LVsxOr7`4fk5>biIx!ucDRXEidXP;=Zp`NJ6wuv5N!F)DrY(*9*{WSS% zdCwa86rJF_A>`N}!+55!7q2y1v&-d8>47stdyOY%vZ^>N_vTqKfIgpODI~#~%=KMz zsi2K|YMR_Rd_J4D)#jRvaPw_Z2Y#Hva`q_v1@UVshwlmbLkH^x@qD(2AInueK*@#N zRncm!RXK2il?=sAWRqSXs2|4L?JNM;-5vdY5~)$0#C|ho<p)aiw7|F7GtE)_ay^)2 zWp18}uz6rCl9J`H49%}n8YJki9Ni*02j9pRy*NobTNmfE?Za&ly@1z&N6cdH$P@E0 z<$$+l@~s@OOLB6)J3GtAfz?ujZLAmAy%3`vZfGf@WwGs#8z7GYqxz0f`QP61R>G~A z?Nk*Am-q!Qvn>=s_uJ_|^AOP+g8nGMXM_m!)dk-5o|Ig=Tn|R=fOqK|0-4fV@s?a5 zJ|@<HYbe!9|9-RA1azo+c!)@JX@<?K#QKOjX~w3kaR%MdShpI~Wm;7|-f5Uy3SzKz z$oyLiu%HN}9vy;<u?4*0X7q=F9W@1)p&{~sm!Tdbf0>pHpJj1@e~CBDR-`RSpJ1as z2=b%*Vi(MJ<EPuj5^gTjq{^<I*@|UPW$1|lXWahYaYlntVMhwS?5QX;=2AU7EUDVD zGU=C)mRNJ8RR)Z7_>5Q_b-@y#U(iHAtP3k%NFffjW!71|O$1xrKMX-oMM$R2>hmGk z5Q5>Lc=qoNWa&a}ccf6x@M1IwJYeF1|IfH@hgA=Hm>#ta73@ABJ>4}eMNjR{RW@!0 ze&uUq^h)_j`x@ZA6_i?rD5qe8cWfq6d7GzCG{ncp&;2jEB;WYv$c}a~PAJ{(C}@B2 zsays%vBlqNI@b8K;($T|<P|~W?aYNuw?_COpJ|^oz`wc_M)4VWFFL7=#jLpFv86Gz zEzhI)_+vpbq5@&r08fAV7**}xel2>!4B=(~%P?nZ&!e7<9+pwzb3@tU*)IY&c>3^; zq`hfuQ0!l3sK$c3Et~lqS;8)61Z-^g`)b7ev#7m%^l9Aim_3xSUV{$|kVdlZWo)=R zZ+38AlhCHkDMmcAL}c<dQ9?rlvt|3dAHuBW=;r&JNw0LtlHW`mFc_u2CC<8fw!`9M zr_QU}a-xQ92j6R!9j@HOmqQDmqF-+PaM|%wjge=DFC_Z^b^+*~uoJi7oVawPDW|TD zTrM5L#O@<WlKy2uHf#W!_ABlO0}`4L`G@A+S%HM6TOO`4l~h^4E?+GoI^Ab%M-?_^ zOPD&XCkDjr?LQ2&KA^1pg6MhPDz_^+l4aAtUeMu*y^N<bMW~ZBj=<|9b_h=-=l-RT znLzwjNe*eTReiau83x`-312WV8CE^JCvJsL+zA!&s58=lNfx+-f%B-yAU<Z+RIO_3 zOUXdU)9H)|lu>jiOVYk04_xT``<aLc%i5I2CP}NoC{Y2G1V9Zb^o_R<!h>(Ty2WKa z$~SDL`-Ay4>2BKAUTOY5{xnwSMqq~rBP`F{qAG$tGagELVwl(YfUbOKxa<(Ya4~3Q zeK0Q;0CMZkKk+Gt#9DB1;$lVmT>1bPR#=mS;%wdJ>D_rT#6{}h-+^@M^bL#83LXp6 zzxASkwwyQU8?tJJy2|I3hXUJW7|r#V5Z8}EQoK&OR(*0QTRscd-Pka|F5#t&z^(yu zAie^{460d1C<yNr_^lXtv^m?X2X7-_i|2+U{1dPXyU||{v?bX0kKq%?zGk#Ey<_e< zzy@CeY?4xYgNfMB7m8&pjZ+FewHL1;UWW(a3!JS{%yN5Y$P0KOxy>I31&>-w8=4#_ z<Yb`40Q{B4-maY#NAchyMd5F+=fv)_H@JayC32=bss$h>&fKniP!OO*htHBrb8|cz ztco3^evw87d~UvP7Y1GYV~J8q#bC+)k=y)aEYK%$ezop}EvByW`(&Q=c5g2FdDUa@ zQA&o!I&LIDpRb$flY`33%S)!sbZX!?1<dChlTDzgcB6?L3AjHQG~(7n_B{kK<w17O z1_2gqmkHzbysRSflk0BR8}#VtC%craBJYyp$vwjPDukdXyEx_TYhcD0T6f5Bp$PJ) z+vuOWOl{Ls2Teo4Qy{?OLr8?6!cco=#$i+e#s5tgB%LujH0tP#lL<8Klb!A*CAIH4 z*O*A`j27{7O2+uzhv|14k(Dk(?oLi3T=N4!kFXE&N?pJNGjBXN_Z(rj>d^UMLt^@~ z@qt*!WWg@PpcqtD9|-G9Efg>1!SH;)Q1@>sf_+*TTjAYp%hM~Q+;DB9IR5WyjH?*( zAxFEdMm=%|?2i`6?CCK0;5D|Z*Umd`J*Ns*#e?;wSp&HW66EaETD1C2%a^rT<Gy+| zt(FG@P*!n;Dq}-OffAi`s;`4<+(()cloGBU3Rb%6(&#k0yHBmF=&SgYO%BQA&!CI) z#TS`$Jss2jdQX%wT36Q0O$!*Lse}Dbt4?@-{w4Uh{*5G(3bZaaWVvD-YK&P>u7C5! z-HmwpSBZ+8FFt#gdD@m?OGgq)AQ%tq#|-H7^D<xw>bTi>#=riyo)j9^|Au1u4)Z{I zaVPg}P78;pN>=q?MDYB(>A|y>3(D`xx8<EEGM`;5^lB96|7*n)5lbubmhOf6Pl&Wq zDs7}+zf(Wi)4uGj$S)kCv{iTEcZ&PAvgs(Mq6D#j#2^9~xup_z{y*p%Ctw>`)=3P# zO!1Ho>(zpDQ8P~2*w*-WPu?!Xa74x=XZr)>)x~(^F}quR)IKI=6kP#bPbUIMl@JaP zby{C39Fp(iL$pDj5`wOBzkRL3yVKQtImBi+2~H)YJ{GatSwgQxx=(%3ix*AZ_{m17 zVz6RP+R%-bw%7+FeijIlQ2cLgi%Go-&YqBDq^Ky&W@k+tYb#CuF$K(o92pImJEml_ z#(+&S=O<@W{NbP)>kxAfao!P5*1K07G$e!l6J*(X&62%AchHOI>pBr9DQ8!YXuO=; zujYW|Z{eM3^m+vFBcKi$o*~?!&J>}dKf=djcZ~VDc$86FZ0kGShS%U_@*Q-0ApJkf z)A?<Al)f!b6(~;Y*7QPySStt)<tK7l50k^s)-@6$2Yrx3uB4c!4u+Y@_j`!zHJT~> z5&}382)n(YXYUN`P5`Q_5v?$Y6gV`?F{VNA%$T8OH9M8CP?}fpMpdg*Z*Qb=&x00V zx}{Bg`g4yDBElJLYr_#*y)qaE!wbf3{r4KWQN4cCevp4zBWUfnpjCZ7Ia&P(;u&05 z?^o9uF*<$D8A0eqLLcO)&@o8Bo=HeA>(u8$jCgc#$RTE{4?2SLMr>soZJj;@`m5W{ z7;D4UepV$x&)5z7{ct)dTs(RNvk<C6=M!-8DXoCyibW_=+)x7eJDcG%)fE3YdYh0O z_mbu6wuX>+$QXGR-%}c3#I?57-!4ldd~DHj_;NtzwJrWf()4F9Uv%g0e#z~jNV=61 z+(XeFBipxaD>ro3V&59dZRX-k!N-eq4dw`FTiD9xgySyfv(x_U*99(^4Xzh-37+x8 z=G5l8d<3$JlcaRkXq+vyZ!9jsvXl8IkI19M!1d5@um9LXqw|F-yFS*Tv*#tUv}|{i z1NQ9lwNTs#WtCKN>$_+=!u=Wqdfv5&7=pkn%<75PW;OY~p0xW81+$U8tksZV5F=|2 z9R8rj4|s2=HOIYX^p+OMn+99+<@zy;3OELlw>Oy8n!NxEZJyb1=wp@%lyM=+jED4_ zld_&Ogut(<V+5Oj)bXU^%c)sm3iK5mrW8z_FfNk5wNM&)Q9tzhANr!UaJMwnU(*vN z?(1h;YT(Z}b>-7v2r_?F%2xv0n$y#DCqF=a!E#TtMd24wXO>wEFGUQn09-twyCdUQ z)1Y6tYYU>?rLq2c`MqI|C@SsQgQZ;w%=o<lktE__I{>YfG}9~!wH=7Qs{l2~@JMH^ zL3zO>A0*5d#IT~o!qgM9=5(!Mx{@Y$c9ghu3z+#pz7)J#3ibL;wt{4qM^7UkJ>x8I zj2soxEMH_=*k2C}sDH1*DRJ{0)6%xW-mex*N8#Mp2(GV<ox(n1A&#yOrulJEDr-39 zp|y^2R3LUHIPNw`1M&@V@v1}9U}Wglr7Uukxx)U1FQenYx8;+2*oO_4DSIWOJsd}S zqbNGW#!hu64$*!_y=tKJGitW02>aI!-ITBfzT_F8B4Mbin`w_=)oF7<R5?8zwcL)V zOn73tHp%TW=-W^&w`RE5|MQl$WK%vfW(s(m<3*dQ@(3F<y!;XHQBgtJ*@+TXGnses zL^umH+|0m3Jvcq&E_Hr<J0ZQz#1LMd3yvjPkNVs3=!@{gbeh+`@+%do27bweuV!5H zX4J_!&L6Iff9vf40=CEQ<W8ih()VqJG45GmJ7WibxkTm~k4gBoP8=Jx+CC$NfrHD) z+i^8YLLWiItN2<<I_!7<m|cZJY|;iTLQ`Gb)Rk{xC|!j*KaW~xHZ9NT^GCD!^beex zQkYnf^|&OLz7fG~lQF+6D^wG-74jn7=Iq=|Z;aqEq4LrgM9-w}#OknB;CJGrTkk&! z;!R}@kNWW)sr#wWvGZT>7Oy+18osqZe|rnH@ru^G=k;}C;c6f3(%re<u1?_=gEk=m zsu3gMLLunMzW}!94K#?8@kO6W^*yYW5~>TVwI+(r@p(vRdW&Ar!3w4a9tM?y_;feh zHiC8xBo^am&Fpu8>1}Opt&yNF;{%0r6vD_xu_VK|iz#qo>?oS@8v;d_|NK)c4}Rgt z)~@kA(U+|&2|1UPOYgkyzhy$PmlYLUC;Ok!i`Mo(L!|3ZJ&4Qb@7wcFD1O3=NiG&# z$Jc9A$UUMcUv{A-=4m&`8fI>E9l9e@(v&+}ZFiJGjpH4O`h_N}7mvGuE+-P2Kf$)& zMKpqnhGf$pdfyXYlq$$*w)1&Wq?x5Ai)4>GKUTFjOzti;nh^?nhTF-Mu$5A=C1Jc6 zH*`66@sn-MpC01Q4%TGTz2d^5*ixUiz}T^=65wVoKepI9>4&H)qh}F66-cGNzQguV zHHLA+@R-crpVYNC!#JoN67A+p;s)iu{0Ka*DqY~`!BBoQ#<95zKLmmgv3)(}#1ibZ zA93cdFL<smZ+hx+O+Q1hd<RRY56K@-n~TJcnP3)Fd@Yfg36l6xx*%f{gWfmh4Z7E< zlvb&qk`|FScmhY<PT%`-F{tJ~<;Fl+<L!K@8qjP5f`h@fu}2XHv9407I-#!>FWr2c z0&EqNy!5PT+?19AF@5ns^^1g{Uv67w&ZON9LWL*R4^W@7WB=?h6>Hy8{F?OyU&(nJ zT>i6)2%|R4Sg{w>7)oz5rZGZ(MuR{v3;z%x5cIUhL?J-v5!3f~noEI*1l=OfOye1N zh#=B1F=RwA{bZ1Fk<k3pQw%x1osXa9y8Bx0rfUNH`BKIZ8PyZLVplXgVbkw<!-nNG zZ>dV8$d1w1yg8kAo_MQ$h@Ci~_0s@(9gmaW;2Z2b%s-(0uwrveAv7$4Ts=6-i#hNs zfxF5>wIgZ56p4idt%3}u6Oz<4?9m#tJ)W&JRJQJYArAm_J6A2iGhFS@2Yg53$_OCr z(XXYIl+1>g6d<0pLE1Eu5T=Tr4p`?>pFq(Om9Jt>4Sqm%A>5g$>sE;nRWG)yB}#Dr zy*6fHPvJW8v6WaSMu32FeM=f7_C){g;lQqP#OL$ztIgNu(?nC%O^2?=^#7(x+LF!t zaQZ$j|M&U50H=m=!M&PJ#SUGd(f8T{Ld*4WzgHf8D=abRr#Q;C7V7-*&~1yohzAd! z-K|lmKj{@G*}cOVBIv5W;b_!c#RQ;OzqA~_OJ55{-QOdmpZM^Qw3$X#&+%d?Nj=M5 zUA<=ag>R*3u#^lWw%lz>jU^pk_bKe*c@}TwW7g-!zvKcFK|<lEL+9Q{Am9!5vBS5R z<naS(m;d*JK8u^mWN(N-0kQq9PEYWjeh}>xc9n%89?iGivH!QaoG1ZxX@4SGF7OR+ zQ_S3{Hoj%VU5cG24Qk=L6l6agwL-Z_2eWrpTFKVMP!@&U0{#R!_vr*4^vDKpVG6BY zdtLMY0Ng+$zvPkgUTE=l#%PuhOGI(W_ZpdNb_bADjb6l{R{-}#u!b}kd2F(p<m!HJ z!l=c?`+B(8RNnz<si6H#g@sK0aJHYsy3Sk|PXU@J-Rq4{A?nW$bdrJlnKdTwm!bjD zX7maj4lDYwstaN@E{z-KQe=_i)L#SbN*jh3DF?x0nPIO2_hULOe$UnqR|X?WFIm$6 z6`A+-DpjTmB-wvq(TOiyXzuTNF2#txON+^fPafNc19oe!D0}kU|9JHxE^ll?M`mg@ zfv&ztefv7qC|OMg<W7?T^Sj_N;AUG4M|%i>CSX1t=GM))Kyvm;cYXWnR*L~01o21O z1bcjHLf^<Sk=R1?gf%_82D>(aUpy8jxViX*f4Y3l^4m&7uJ(<2{Lc7jmdFQg8o(++ zznMWpu&XYX0KGqRK_dZ0jD`#m9*{{cp;K{F!>6I%uIcHf;5u$vKZCKwM+xN3Vf0|) z%HG%~05bS*4`t8SjsO3E>&2{Oet7U#@SJG?k=N(3?kdb;dcqpTEiHbGXk4%<3VRL6 z%0z;LAPo&ZzdVLBo27rF%*2#`dhjZZPD%&H#%Yu>W!+EXi~<N?3CdS)l1jGGL%s!Q zA}J42nfHrtQH(&h=c32)u=!l(rK<Mh^it&4wqaRI?-HuoKljBL-~V#;I8J*?um3`Y z-FKh|!7ej=Map62v#j++5OoKz=G=taUEZSmC;B}&p}hjpt`^Pvu&S<&{DsO^&b948 z0|Q@O`#hJSj5h~3GNNw9qN%rJ#^7!mSay0YURTli=m<VLonm~xesY(0%vvS7&2bF0 ztwOC6gOSD#+uKZIODjt!wFY8Q3pO_UaCudShwWb6Z<^R)D3`0vh<BpLFbK`&6ijQc zLV)wHcH9rQ)(Vfth;<&X(u2{GCbyx}t-d+D`_f;+uk65t=?>ha9Y<7UzytyO7i9py z)YV>A`eweT?PS+i(<pK~SU)qNT<s+DI;mvYvtge)zDXwjMMPx}nc3<oaCC&!R3pI+ z0>4vZ^hL6)mg_00K=P7YQnRk-!;>^>&t}CIndNIM2Bi_*y5T(yh80ZbQI=2`Hbk3X zZBLTMQ9+{l+DrvWm3@m{(?#zhb{dnglYIk*Qv`0m(SX41;TA0(-k&`eGUS><>&mmq zT1o@=^?C#15i?f4e-8rFHSo-QhXvlBA^SQ1?d3qniFj_xf^*L17*keL7scK$Vpi!r z2kGU(vh#aZO}_QGm(_|F2--hWA!t8SX0d*7yi<ciT|sD7HF&l%6E9<5EQ@{fya}uR z;xc@~Hh~kdr^-luXVl#W?k8x__)iBvg;S=!ox+rGW`M*qKYjI!F#D!Uh~2<ZWZ-^d zR*nqZm%d(P;J)-amNJL37XqaeMozmaG#~@_cdwcR!=a5}_i{p*6Py1;!2YXrK3ngQ z3EXc6(0-=Agx-bb*Kz>(?<08sZA}5*PvENmEWAzPT2l;q)4+XE7Xx#&PJe@cnlTX9 zaOL4)f_Ccr9QJHF(XsG@iZv((dSQJxLdFh+wKi^Kh*0YZL{gL8P7K{^58y}(tBfn4 zTJs>ZMBgD~%iA7g;Qn@v$j8MrAh(%f8oCj#$I;uOfl(F2xZ40*!i14U0;&Y)@><xd zz<p7?Sw|=SP+>|JHTk>0)q-C;zCQ`R&bm;;gS`sc7b?o^yZo~wBe=7(t%jOw%%sja zH}L1DuOx*N#vi)@c;5|82rm>Ny8GRfzzE?`n+~`2)1aCjURE}ATzGFmmpOs{Rxgw) z(Vqf*VJ#+{I<oLbX$Z0PPTGyKZ_lH>%>sL`4FQ`zIUbsR>T)v5+q)7N=&x_zcDt;# zJU-%G#FOh?_{Q><VTG3LP_3=(|Ar#TEy&+egSfY)#RR=s2Lp{Y)H)?b!^_z3IgL^G zbJ@wzbumVN0k9m%I$!d9U0@zqc$A?1m$L3Z+xL_Bhpsze8DGcr^iFnjn<kEXY+)QR zdC;R=*#W-GN~{hC39bNNij5MqC74>31gwzn|JoMeSRulFvC(FN*MNswop30YN|rRP z)M3)P51UP5j3SIi4ifaJie?)(7h60oSs|SJ2<kfFCxFsLK%^94{q3@h1vX&b<{=^- z$A?z@_BLah^tDQVhetXP@1r4tIyKK`55=L}48ia6!MWl=InQ{e4Dad;;ePXM(r6^2 zwPW1aTaXPt^WNRu&(&7!G-4fa*UsRhSb5?q6I^6{3v;eP7bh2fJOXtrL}RE>lHE-i z-$_6so>dnOkY+XIlW24jyx*Mx-d{^};4^c5SPx4#mr+aysp|>cKkSCVG*epiI>pM> zX6hu0oNb*nkYv~Q_hD|`hKY>?4g8|`VEZhg!MTYLvfE4?!t=<wN{haQXP^$Qz{9@I z=SM$6pnkStWU=Dizd4DAFaH%igbv{~?QM9-nDYJ=<~wClt4jj-bET1pYY~aGB19lw zAZUOmsKFYEb%ochn+B$#(c~^iuC(NHxiz5WJGx!lN1_aU$>7B7c9J{Y^jQI3R<OP{ zBI{U>l-|!v-@n&>Eo9R-66kJ9sOcA4!7TwD`-mE%(e&{!bkQwv>WcLM7St)Pqm8Zy zQO^+)k<AAuS)wh_bFQ{x(>UnOp`+yX*63v~CSQUY5ylMy{3|?Cc<C+48`~&$+YNg? zSDTSa8A=){wQD-*olX#WC~jE5zR>T~suhn;?d-=(rTcQzebbO0`y45TeQ~dv<B*}X z%P_CMdYy4!0QW_R$8>N$@c?|6DkmvX?jtG2uhSDd|Lyf~BQWi!>#&sfi=H6$4;+ib zsM)!uold72eqWun;N_*-8)F>r(Bo)V2u5A)(=MjhvkO){H(&fc^^>hDcx(JS#gZ#} zT>$sBCL8D3I^ff_!J}`-I>|AX40g=vY#0ly;w@MHKPYmMycA7+djtiZ-uH1l+Olu^ zg|d#7^pf@Q`NuG{^h8<rHB@97xZhCKaa|Z0xPM(0lI_UAeaTe2D+!mp5V$MS$eA>Q z24vv=?$pwAbnX6KZWa#sM>#PwNS={?Ze85+1t%x9{vQ5@VYN>K_lNYxhLI_s?(&`Q zAzWo4W3n(E??Hn1-_qdV{khNtoMfeGmLLYbnZSJ&Cv1Bb6KH#_`M~>AZyLgevA&Zs zJwAf==PC#7m(p&+bWxuM^+&mgE*M9}z>d>f$-$=B7lTe^oVpN$PadndE!q#lt0pC8 zi9r*iAx(s<5dI({UN=H(s{~b~Tv+OL<t_G=n57(T4{AVeGkdU7%P5l7XvCoED)h0H z<Xx+_`!TZ|ASBF)(fKX#{$2*|i-Lc(XBbaJvw=#twA=8DH;t8{&C;X3ytIbDIX_YQ z4NVqvd*9_PhX?V_E(dfH8n)G2MgRHKSuFSh=r-!H$nSDyFp#O;KsIB8mL9CQP@(6i zUdMAJAy58l2vR4}ECj>NOA9eL1N8-{XUZ=2H3Wn>4EkjGwqL8{*kRD%{vl$q^&w2I z8S(toCOqNT_5QBV(amHW8gqnT(rzv2EN+m6pRcN`C9v=t2tL(wGgHr->?>`AYTN%b zoAmJdQuX}tgIwISY{^-PP8#{14jOLQ35x#BtA`{P)4^xtL#A^$5<8WV7vIf2@8b40 zo=d%_3(wc_K@wnFv6!-XF(aMS?xO7k{(SU9aF8AA(&=nq=uh?daFbyrFX(PZVtepJ zvw`;0RiNh!bpPfAl(8))_)->+)Aw)xjj3DU)3zoVkDaR0$7kEqspfbj=!4atyRYy@ zWDNgnW~VobYVs5J3IiqQTDAd1C2795Gl+Z5GX%}0((=%Q#)K~0NV1Z2rMf3yTj`Gk z(YBc~%9ASZ2p6cGdPhmDzosPkFis$1l%7iBSm0bklpb;_4IKpU_hf+g2@}9;!G2u! z>v4Kh4S#Jvon?u6*8tnUb-b*5b~AFmHnW>D$a&RA0|KzW=^etkr50=iW9T6=_+ve* z7*x&{6e!(h;<ho&=vv|MF2TP1baFoMQqMc^#qRqG-e2hATQ@G^{;Pk>cfw&j9Y28& z+AnaGBxO_?rV->6-xV7XJq=>%dncsDdO(d0c3p){Y?yP*LB3leGz9csd*%fg_O1bX zP_s(={wq|bX1ylbheO*9v#K=-N+h(ttfHjbN#;60DG8{AA*Uir7XBspnuMsRlyVh{ za~Ef=S|WaeOv6yo*savCYT1u@&6YuOsrS`8o&cyXg=enU@AkIRqaTGvp{ci+b<bbP zXF<WfQIzk%Ajbup(RBpkTjPVe3s^@1wzrvDi=v~q2f?gwQ0ckUMKcox$K^M8aQO}R z$8(J}zn7~@K5|3_t1-2vn7(d^M$tNd8Wzs27)iE}4hcSEYtOtHo2Sb!m&&1o?{^#s z>C3-2oqx0Zo|>kYg_Z2N;bxJ&5;;qKzjPQic=tj7b+VR9@~Y=Or{}GBVL{q@JxY?B z<NX|&?~;MThR=YnoG<=N-fQvTrxjnTNc}O6M`qgZz_OtWi+UR_#*Oe<>;=<$z%x-3 z@czq#AI3KvCkp0O&cz35H2o&B@2hfnLn<eoy2O=%`*l%!(M)CFeo+-w9YF@}SFOUj zCQx`Gu&$!XnK!5gWZ=H^6(gAT{|CI}P}mu?Ng#g;#6Q64>0WLcp1a6NnlF=SKf+1p zMhOD^W+#T%M_^Aghi*<rFSAZql&tU;!m=LZ)`-CsUBz_ZawCeCS0*v&%{5`Ki>c5z z5rpOPa^8Cz>B7=o16UFbzmB0=rhVx}S74>*tyr?O?|80C%{%Jh>RUJhBiDu^8*YR> zf@!94-hZW*Lyot58jykeyQk|$%1KQlp?*^k?UA!P#G3DUH<qUsVNDn?wn(rVL7RIW zxF6N&@Vl*ja0@@S8R7o!c6{W}aK@SHci&ib;d5uNVp~?#C)_|O<m$WJbf5?C>g`JQ z(HltAnuwD2o?ud|lI+%@Yu+l_4J!QPA+i>$%45q3g^jqnuEfg=QH03&+bE%v;C(my z7{Ls09OcL+!1Q<ZY0;vK<Dyf6%j;pXgeQ_78bmtV`@3RkaI{s6!yO59wD_*WUV;%V zW?ecE-%rDbIJ9CD#t*7E)Z8?xok&9`7a}H{nxu>B2p5rS6$CT;&)yt^e~&LpAM;G% zRbLN2KSu`qT?j`^aeP4gBXq{5w{o)_W`p>7T1l9YbG}XhcAPH&%TEBI+~Xr37l}T5 z_@6_=NAl`(SGUsU-p}><aJz0N&_65E9zTeaO@6{M3U8Az?QgFRGoS4d&m|g1r@&jK zE*_`TiK#8vU>k9&bqG`ehEAtfi{F880CsP7TTQ3CmT(YgsV3-Bfb~>l8cpqo=!qdn z1MlFq-%aj6>)IV4*ZaHtxYsnx*`O4wt!Pto<{`35*T?uFt*c_ch1$ygfD6XJT(Km| zz8;{l|FYhWjXFPX4ubc4Gr;?q1qr~6&A8?NviBZPu4UJC;6`}BLr#UNLglKTQ|HLg z%_iAQEm9;!iZ;iREGsQ9k473<l9z2c$rEhLGfUEVmSl}YWtkM&q!_!KYKCsIb2s~U z{~RjkjGV*lTlG<eLLoc=4^^o8xV2sZc;SZg?z`{abN1N>b7>34Vlr-oB}~S*fjfog zHskxfJt=e$fZU3yQlDwX`nK!TxC8_sI~*Cr)dlC4lkGq54dY&UYzrh`sg%_WpCv}^ z)X7F1S$ZAD;7z0?2flIir}2iRx6-AGj(u$PZ9FjkHyD-f!!wCf_=WE4ka9agcuF#g zkt*rWmX6>;NQa{?Ek=A-$?D!*fRd7WwfZ>@y&F!6_m_Wy{kz_z#@Hh25X&-RPI8X( zgu~}t+@~?)PDcCE7dUGwmG_#Jjxz?6($ib+JmFN6qvPI8e3X$gHo@p-lLbSj6I@rf zj^3cv1eXW%lSOH>Y7`Zx$<XBW0^FY!vfVhEJG2fkYK$+%_g0L3cD;vABZh{?zT$ij z!|!B9!WZAxBSM{et0xcHMLvFpQNFZ0>ni$;fop|hi3Kw7zr|-JuiMmM{q@J-r}{-{ z(z1-izwja2v0GoKG>?ODo)|}7z0E-T;=a@}zMSch@y_AxC=UnWzKS|tUa;eb(|a=~ zmPr2d$bbPyIvOWcs3hMkbwyvgL<iq0WH+bf82+j8D<mJxj{%i(-98pK`EarG5j@jz zCv|MwdIUjkYLcttqZ$S8U+et{{?hlzc7;^>)|(3Br$+x8*6_GWIqp$5ZQ%YM3A)B& z+Q9u91y;xDZQy<#LTjN*N*V%NsDACLw4Mao!2RamlRrTO<25Kh1+aX+Zuo0++9OnG zHnMQ8aE_{EV%nTqsF$l-7%r&RO5Rd!<#YZJO||c8G4Osg6T;2Ng#*X-AQrvFK&HH$ z#iuo?N8g2Y$P0nO-7WQf{ai052Z$u!$JF|u{cYhy9Vao~bstiBh4S{Hs^5y0BzkJ1 zb5rw(udh_ScE3(ASRK&2oCG#9RCkb(1J*W~zxS&?w_CYw;QsA)$H}H@H8NV!B{Gw3 zf~txokR?mkWdA3zesi4QeR%`Cp9n`bPBSV{sukyVP<~H&yYQbhyV+o$81mtXkv>(L zAwc{8{X%H~o+<^jNG9dxE+a>}@Qy)lEjC9KV!KQ?-{(1_{V?k`NH#mADV@#Y-@f!V zmE0+G(kXZ87Tf-DmxM=0k_5UaXaCz>rVjpyjEjpJTwZMr(1nT42{wbY)y~~@F1<$> zW^6_ct}G`B{@-m36jxQ6?>dZn+|#YckUI)VU%#O*o6%q<V8L}xi^dc%_m^(X_TKk& zYH@sUZwxovrSAQ={!{|a&;<V7^jWMW_ij%A0cQXo%sm5BZu1=kg9|wNOPKR-KBGN7 zJ@i!N8ffu3<d(nBC|8y5#pmw&H&`UtXYu7RBnu2vpYlcVUUO@LL-*=#XUU8>W;=Rd zLHl_*xiUHQ2d^;NSw^w(SVS3EwG6f_`)UuLzs}J0d=u;XOtRmfkN4rri#7xsc`cPG zT|}#R&^!Y}ZhLMSGx{)Q_Ha$RcVkAG>Q&ucyoN5m;7n)+Qfj?;cg?@ES_xqS_U8<C z>>>WWYCStLY4in@je!|P*$m|DSR$Z*CQdMa#JB<Qty)N(C!D48USH=WY8+b&kXWtH z)Y;tjWi2X!SY&`;9Y)8v6&35_j4JYoZ4z?9m{+dqDalR1z7O-MB%ILzj{9F><V;4J zvYo)69Q`a-b?On{e0uR!+&TSayrq8xPeq6Ezx0kWjz)dJs2AcV@Yl0eSQ!@V{(&VJ z<hgQ9ylwXzv@$vky)bBG)c~t%jx7R)tfgaLDCNgmYN6%E(ONr>krZ7IWK3`;S8Kg= z<9t7(|4g)S^q*Q9rK7%LGH`?aE`=kG(;LwpYPr6BZgmOdxR#iT->81#KAd6E*<sPy z7`4$va)WIkWTmQzdDL8R3ejw^qTZ!a9{FRE#)vLsKaBiL*I=v9Uw^xNK6S-{>2MPk zUQH6<9bOp^4egvW6uy%TB=G3-Pr$bJBLet0^^=iF+Al+uoT0SHNM<DUCdAHg9XeRQ zF0V<=Rz2I>jcGqGz{0+g-&g7Lu^}19ygU0_rStdu*yyqy-<hbaZ)`>#haCpIYa{`a zzByyb8;s)k1|x4*N<Jxt-?V%k#;kJuNzi@@uXMi~&)G*xW~~&sFD|YZygyBcf&V`6 zk&@-Bu~S4q{F%A$VtD>L%<h(Bpc)xBGmkcKznRjlKkqhhzkb;%y|NA5S1PI2Jg*Jh zZ_WGC%C%|(_nUin-XM_XD`d_;$Vo&1uyLEc#fWhjfcxTpSlA}fHh+;J?PHMf0F8RB zkOafbweVY1Cbb6WsTP@tMQ<e_Q$8;bLz(xywFF(DwZeafk9cwOq<V&^e0yv8?1`+P zbLN>^F4^~Uvt)dn9DD)+0_18*<&-4GP!{2v%8c=~lvnGydf5zvn=U_QD{?Z~SoAq$ zG`o%P621L(aYporM{Y$9XdEa}Yh7=b^V`7vgLkJptTK%>QHIDiA(Y4=K@fnFBufSi znpR;?k5)Zhj6q}lA4BlQO<1xL2FJ3{kR|9a1NVhczTY!|zfJE3ZU4jLgLrpeXH~gX zI^oiaAOG*$t!enHRPTC@RhqjD_Icnv)`d@LOt337GS*XvTCOQxXWY%1?c)USE2-bJ zlk@oU=nQ(TX3T~+=V15w47i8v-D)asvsnWc0!F+#mmz3=|BYQ8CL@6$Ldu(_Vhum@ z*i2zM&heP=KNMl=HGI!ch03qv%FSIw?xoUQopdPjr0E2mYRGsIPti$f&4i0fX{^TU zlj%P?sfF2AzHO!Ie-QUEkO9sFuj6{E2fshz-qR-7^csBJK8c6Z!WgodR;?dEMjk+C z_5!f>N`806&##~Q6}&;<T<)zoEU#^|Rz1;~z!SEM6|X()2eSm8joA-AXg`0Syo^-R z8@QwZxSvJPOy*UBxY8|-E$_;t;0s*MH?i)|3|V-`vi<n_l8dAU%78wV3j1tN7!R1H zsr4z)L1^??w2fe%kqZt=s`eg|IR+jN-Gnw%*{EHvy&0Vaelr34bdcdPw<XgCc%Km~ zP$y$=7;da)Em%mIF-kE1TOkRd`d+QO<a5kT*6*J4yY}zrj%t0Tux{B5wWitx=R+z9 zq%iaL_ohl97VE>!1uy0zn@*?i^Ca*g=M44WBC=)Wl+~HBZ0YA%xTzQKoW1}z=Pa^p z!sXtN;%|KKteioeM}KzqSsa;v7SHQHh-X4Q_>F-{Fh)RKxh>~>_`Mn5hSTOfzBD>L zR}Vb+yDmW#UF4Fy5L=qSUa<yJGu1M-)KadVK=0Am{>*oeGkVL(WCAOa3D+4JZ6#YU zXHeLPArdT{rF}$~RkrRD&tHa)nHf6FrL_hm2pXN1sx!MPtWHauCi;q&{m;NC9_`c| z35e(w>**z|r<R*jK!sd|mPG*c%{nWL1nBG7m$g)~h=>c>I*6V`Q5$_GtAWm>WmJKA zM&_vPS@cNVu+bSU+k~;Nf+!B;q1UJF_|by0@v4;?_{0$-dfnT)l2Y#^LpFn+z!dDO zZ|+zd<v8Z1%w0$tI}j(~LRhvTz;QoUz_Q&+ZEZ$f1k?WcrGt0h)sRK0zEUmUpExDK zW4%SvQSIb?JU+2z!?#CkW13g9x-!GfzGp~}0rxgZf*ScRhb;KY)yfV5Rw{%4t>al( z)3a5J6c+x)j)(ER?swv{+)?rTT7df^qemI3?0wh&Sg{pp#dSA+_sC}|)<La<4~D1k z!LcvEP^V+5TJ@-u&#LP#yg)~ak6BJtI<4Vj(P(Y+ih2vQSauSxiPhK+*NI4^^#_*1 z#<zj{h0<uw_cn09Ida{rT-(6?y^{3dDW?tGZ{EEO5)l5oWZN%hb#GpY>gOz=w+<@P z);N6-lTwim3vgewMF98R+!l+#`zNRv7VQ?mCo?~-+yv0yB9u@36uc14PJ&V5dh`Nf z8Fd#n&8~Mof3fIQ0^AqpYpHzeT+^caJQq?0ERy-W_VP0)OYk4_Vy2&Ag6mW$s!`vA z#I(P=y&A0aydQJ6&Y~x4_nG-Um6Rj`44<ByK{Bv+Ab7d63pz6DYfLiI0;I3q4bsoo zz0#*pPV3V&Ns!Sv8wnvgH&f~K_OTiy&<5_;AgmTR)lNq5<C@n9h}{Gah$^MDPDJ!R zgfcd=sc8_27b_F9@YxOM&Az?Gild|{2~!`&dftQhwVOaViBpR*WSyks(t~@BR*OIC z9>n<)2)>^`dj$7%)(2R<x)#9ipKpvU_aF(i+T5k9lLpAsKKwWhkjFWT+|TrVB=9UZ zTRI16o@_r}E7s&qr#S)Me<!!yt{j^+j-=8XZ2NkG)8k~HN-@;><0CSLJ$0}K31b$) zv&d9eawgMeyga4B)z!)h_WhJ=EoE1lyC})WVbH@ZYsm;oCuvy&vy@|0fE;8)8nTpz zM1V-Ov>rC$=9+|y%ZZKqSnYgq+{Ui^kMB$&v5)gyCG}M6oRLHX_Q)81XZ{|HN1MNf zE3WsDDThzXuVXlKk)VT3@T>s8DM@b({v^KQy$8;*b&O4HM|OIzCy7rv3I1<^lr(f; zU3SBqj>D2z-eCl9X7#cJ6yLB9Gi>$V-_vHc%a=~VvGmqP5vA7BF|wXdncN4e-J8H_ zIsoRXk7-I|yO8zayM8ZzxUT#?e6J&oQ<emJjS=){SNI0s31k=jc-+!`pyVoKrQ|*2 zqC?0a9YShJDanNuQx_KX%4J+j{%W7=W*hrLqtq*@12{<tuJ5cJlPMdXUbbQ`QNP#1 zkVA*#y_X1pSLU#+wrq;?Q_^R&bYfXqJBsu3o6e5MJsEU47oaoL2cj;nL;H90BoL4H zZUFXY!<+i6dpP!e(lZCQraE|2MAq<|2Qg*XoTE6B5%e#-hV=SPGR`{iopZm0H!Qu) zt2}f5XXAed-|8#)y7r@Z%J0Fy7+!(T5F`XOwW&wodqkU6wvI@Vl;=xpC-8%HJ^HOW zoah^cPG84br>QM&e&*tN?lSbjtfjMG6B(wJj4k!HRxh0QVpsOe`9jF-omn&7@tq9$ zamj{hI`>`GL<j(`Jf|@;8sz<H8P4R|u4X5VUW6qF^<g^N40TA*t31K^>_Le1v#T+6 z>}W<`NoRGKUN<4lD0K#14mvImBrWwM)aPrd&nI>eI$Z{OI_B#(e(!)u)zONBafz@= z%p^u3h{4oMCasw|R?7x3U#~Gx-h4`hUWnyonlR23_Zi`s5X;7}nwmv2TdYUkY^h-N z-;69mN0=tmNlkgSN?uc|ocE5EmS?Nfv0ObQj-#KsBS)RuW?wJvGlkdb8GY0jT0lxN zA}Co9J!H;Ng>6;x{dNZJ3;9&)E9K;8(QEO^bD4$+S<2<D*8UlS_P@1{p#8#j9CsS= z@NgVP71;MvB(3_}ixMKKZTn(jS>n5vGsgemc^;nBSn;79zcVEN8tr@+p6Yx6%XE}f zl4=F+i#*>G9K-u={K*cRXsNP9RI~qj{AcLoR=@6{RKAt=nX+m8Ph{U8TKFDMYmK>4 zj#0N3-S^?|dmqI$!=^p+e<M<>nW+ujuT#2h;C`KgtKqUXaK8p&wcx33;C>6<loqd2 z8@S)R8}v71@48I2=zb@eAalXZAxzrqHB7#QiO#`k?#eCb?O_D&=kHAq6+Uw{Dsfzt zjgwLppFP~VnTL;?Q6*6SMEn~3se@}66N}zbV1vBOOMU98XziIz!F_?DjQ4V#z=tDr zyc?@MGJ+<-08$@FyHuNM-KV3Hv!8}B=km+7UfOc!$H{;>*7XpQRF+pu)s!Sc*=z`= z5E{EyEvveZo4WZVJ6&W#WjM?x^#MbQMw#o^kxr@uDyX}$hv33CaR1=kM3d2ollr%y z&sFaC8HOtk>-!MSIq9^fN3V7Qrp#hp4Gp{R!j$_?_|Lxu6T$3vhdgu)Q)c9^tH2hx zC?(7I56&K}m3W2y%H1b$!d07+>*jh0|M#0$_pN0Q(a5?&$G)2-+S9B`DVe*tT~?Ux z?7=-`WqO=5>~i4vX4O&T`%MB4Um}3TmCR!HwF$)8w<S7n^tl;!yvvTb#{@ki-+Y9# z(o-cI48DA03eQe2La@)T#1i<4lLmNf${a<tIV}xb76i$lHmA4XiU93%?%S73;Y?~B zwj`bGDjJ40xVC7+b5oVagJ#N4t-PzvT^cRNY1HA)E(t@PSXBc@hR@1ez>MoFT8#QD z8(SarO1N{V^+{ZkX$b}u3_C`SA*Tphoz3|0zmIn}dRywg{$YC@kH^2x_2cpeYi&NG zxMW9y%x-bX$<2nC*z{(EjSf8HIF63BIIf?c%%6@2oN4@w=OUlF@`kFdlbiL0;Ea&$ z!y@Y#rjfibxie{WBtnpri;BT@h1V<jp3z%z!#a%k-r2L1R7<sU-0Q38jE(JBOD7E; z%$d94=U9IblK_wRhpsE{6YOJY-e-NPJUeulPt!}`9(-kSr;+uHEsJC31cppebm>CW zY3&5w70YkkdIXaObMfv2@muM8s3(;`C*@x)#f_a<l08_{?Z@n<TJ5SI?@CjbM4+WH zSskQYJ-6*MW-~o_F3?evv&i<<fX|}E9Rrj<BaiKOs@7*>(E+?Q>qa24djj5T)nd>S zg3UU`sh{$7m0;gZ#yb&+x-cI!B1vH7Dc>5*=IwXep2&p}1QynZF;0iaV;yn09aGTi zT7N!NO*W|{=MV`uX4e`0GPrr)j#;w!jCT<|I_g#xq_AlK(|o539~DzNjsCT(Ft5MO zD|4Lh58_Xc{zJs9P6atNdP)wzGWrE{_%GmpWIv7{hBnu)!wv)b?OJqMx&E<kI$nwS zodD+ObKGdRuxFBRg-3T);BtBd|83F*BayuK4+LPbOzb-6FzyhH*Bu7xIH^mmm*u(^ zxl|ilYRRkAxqAiPcT*?zAaS3DbosS$mUEOfJ})=5X)NY;kL$-s|8yb|CCmQKHJNaZ zS+NXbj$qN-IjPxKk_7NwUpC{7`2-S~>b8fx+?_@}-q9!YC*|*R{@jE9DFF46ObCmK z>6)6Nr}K%3&|#w9M@tZ$&;yCkgqb=c9Mx2K(aGiejBwJ>v3=nUCjK;aQXa_%hmN)# zjaV!1T&EUg+x}S~fk4cJFI?O^{leYm2wb`(B;F?-`;{b|YWQ8^`&`f8;=7)GP0#oI z`9v39jaUn6Tl%ZdV!%WFIe2Z6y1>|_b3NR9Z+FnXxVz=Ym&*5E^tUHYML0exfA>_* zQN5!JK`Xv?ZPSTGy<8j1NwDufHb`e$Ph;=h=SOY0y0&wERa~>*^t_3oRQafP>y9(H z;<*Rka-S)_wCeAAfcqlTYT*5-c>uq6@)r@&?vEbkuIM~II{JAS6ZP3)s|rrR30d0N zX1(vgHyQb0M%p>%w}JZ#1h^lkw1NB0mwFqx-+UQ2vxGKqznRkAo4h9p^nQ-)iAqyH zfx;)aq!Ga5dQuy>UyszPUvq(AnlBWvc!~QH<3dvenk{B`ubx}^GdxsNi>aJ2--<A& zIsOS(0nvj5(|?>>aS}jt0kIKRq<B2Q1#z*-MbwjO88Yo}8*2_Ta9>EH>sEV<Wg(8$ zk_4E)m-kzM_{DwiV7_i{l~RUGEkf~?<=qou8$%gC<`YwuE@}B=V$oYGa6jKDBNeaq zNDd|fwasfW$V+5JN~)|pqV6s{LWam*EBqF6Zzuql=j+$3PcxOwLo?rlAwJ)%BKACA z0j!xCd;$S|<wd7bCCLW+{`fSKq4FRO#f_w5#oW!eD8c$EBbCp4q-fD)X<i(kK_a+! z5d;*=<N%%62JRn>n<WwWbILRZV|F*wShHKO+WiPdb)CpuABB_587FDb)5IHn%Qw5$ zjpe`Qa^trM{wz*LDoB6r?vn&O><r16KW{yr#0n!GEJx#5;kF!0;^La0#?S3}VE)`@ ze|8WA`m6CZxc%E>WRCqPX<(>$Zc!Z#bBv%6CPST{3e7dnvHqR_AT^TGxr@yz!+lRb z%zU@~1G2JutIYG%s9QddzoldF+ng_YVp&YSK89ow%Zx>0)F=bZT{aoEUMB(hGCoX3 zw0s@c2-N?rm)=I7%}mgK3_p2RM|St!fP;K_0_>5#1=OGCJN+_&`Z>;ZE2TTq5e%jM z1n&CFIzz68Y<Tjj@-=Uz^7iYP(z%No^*c(y(g`on?TC;iaQFJIu#5x&?-Q#gTv$$H zEw<Z<{8J|+xb3YAR1<*xSEgiKSxw-i+lYJn6R;Q>GddlQ`C*Pt<BwPF#E$}%=cI+Q zbV*sbxG;7y%(8>dM0P0y3nL*|_}i={m#da6TU<$#{}nF<-T2OGWgt$5j+@79fUB<? zDXSH6i-`<x8jfqFpD8zilQ&<uu~nsWwhVr;^D<YMjmcvx!y3P2$hf;McVb>IbL~|9 z;!c8SUCAI!i3MW+)Onw5g7$|9+Al4$>a}Y9GsM_37zx0qSwe<vmW!4?Ea`=Y=3plq z*Sf=@8wBrfkNpC~mL}6#itnie`&CrD-wD9U-(L$O!uS$FSYzdNBZ5_VJkt%2HUg){ z&*wwgTu=1p2}?ghWuCu-AnjV-Lr3BP*rKK7C?Yw`F>*%ekUUr9Vt_9hhBYzIC?M)N z3P$J#@}sB^f45|zlW}c5#Kovc_Y95Fv2uSIzsvQRRLX_%g&~Xwsy9pkppSX7=p+lj zWGL+<k;zyQj&xxqWW_X_TnbPr9087ZFTo(s)h5gu&(5+gi)+Jpi#P<KH{VV<obCX6 z-17$}nt+BQTq4ndNX&`Vh>W=q5M%VMeCi>Z{j)u57|~AVcUAn18@n-M>ezC^8}v_+ zMC6r?Xm=tK$))c1;IHgwH}cr4=(}3Z7k=%=U&0n1!yhF+jtjA!j#YwHcZgB>d=Acw zZ7DcS+t0X<^Nz0I)m?24Q7ixd%@5*cRLgswLtp1jM#0z_d1co{EwJM#Z2aRpk*hCZ zQ;O1ICd_wSv;y0^mtcJh-)}iOH0)(6H@2u*2f?yE7Q3WomOJt~#WDV9e4PO0>f>Pk z!Z_zJvt(<&rU}#Lr^SP5!=@v9{)AhfF{2NYeAW)D(`iw2EB;iYuS8P@T$-2h=HmAA zU$M|K2Rlp>9_rPg$JH2+uuS$XwOcs9%qB_tkSVPP5RoQadN0Qh8*R-}OR>}|=`%ua zrJ<8Tn_a*5ZYLP5pS&a?sJ893L{%8y9KY(hj3cSnOB^k|ORz8hK=(d;eyz9k2}OIw zJfVkCEQj1#jCAQ3d1JRutmu-mKZR~B8mId};q<ZW*>rxSzR1*|?y5resvdf6%HHr8 zs%nMyDKjPGOS!7u;g#{w(EhINitDx<vfwLMmFYu@uicB^C#d6ncrZqimfD}oX+{xv zs!9}rpZAR6p44+iP0=7^JBsVByYRf{3|4iU=%}KT6#c9hxGyp<2i_NvnEv3@KO^gZ z{q<5*`6?%g`R`B9KaV5x&sL2NP$jFH4htRc&8|oAjn0R#t}CtgYy<ae66xNZ+y?G9 zU)F8le)DDA%o5tb{bowH`FX!Z1MC;6j;klxseHbJi|P|xS`TkPxs~P82JS19Q!Qsj zs7(Dms#2r;6iKkL&lLdRh057UWyvxZs`X5v#l7AH)o1GLEgRL^@z1i6r!WC*g8xM? zTra4zIQg&x_eC2WY`=gMgl^qCu`i#zoVa$7LDa_ZQPyk{GFco9{4I<M)sk4-+t?3s z%wq$fPbGVn*QNP)Sd&=v)(hM(B@+SWw<I+%g)#*5M<FkVp$pYMUdH>~SR1fm%}ys5 zhDU9c)E!+%=gc!T83<aX?n>&h;(I^l>|I5p%J!ADC`km%iy@FeX#Dzi21>sPu)eQ< zgIPai$n6R9RH>>7g|cqRkLcV?sl)Ak3M9}5?kf<|KA)l`E9^<j5-geh>*v?Jk0W4k zK$@P1oXX(@m3-Pr?eC6#7G+JvU+C_|A7pofM+Kn!r%w)%K{K@h(qEz+775m$kF*YG z;XVRme`;+G66;k<N|{XfhO@h20DmoW7n4lD$bCcb8#H)~X8L!K-QL7`WV2F&b5jw` zYn1DU4mvhoCuqM?a<hIqjfPGb35*PN;%tWlkJ=sh(xow6^K%YG;PJ;!lGRFA`gusv z0c2e7#toerG3HZGG7~UzZ#oEXn(h@PSPK(rne_o8j2v(fQ!R5Bwc00)kY~L{40}@O zuvC9`{Sgz!RwZ0m*<>M<8PfS@?@qO>LHowC9Y35(AVsilVY;VV#yMa0$ODDf6n?id zzoY((@YALG`~GeM60+R5rsH#9A^_jSHJQv$Nt5Q&Oy)OkbQdbjLecjm9eFM%d+;>d zF%{qa+*Il_E~f<+It7`n9KTHl<j4d$dwz<B;>~&p_T2y3cLh?F=rxKeTH{FqY_u#p z>t^BR&<<}V0Y`!kJ&C0nOW!_SgtES26`=j?eTVT|zMl*-a>}A!#6dhfNj!@#_65Nt z7A*kiS8Jin*F+DUK<u$uI)OB<LkW@5Y*Z%d^MI#(Us0-eITN0Tlw8?tHNj0`xfioW zM!Gu0&y--{cO_Oi_LK&g*V6?AALwYN7vEfV;YLKc@XV4H4-L-{?0)MW)Khqa*X-&u zIT`aSNAdQe@^%zfK|~W6B6Fh6I)_A(&L0scX6PWd6jeUA8*yrIq;nQpmF1F2+p(}V zh>IJqo!#%`!gdUi&3(YT3X`ceM&iOen(;lCl@U)8s2{asDQv)0FvHcx?zV_I!s8u5 zoY9Zp(rQ<(O-k>?yv4WmUiZdB=$?N8noJb)WT1SN+Z&cmfZTrA0`wf`fBo9$V2(^< zN`DStiyX(*xT$2Lgd>Rn@}KU`!fTD7gO2BY!E3wT72>)5ZumH(v@l{C=hLUX8FaZt z)P>dpT!}^w3&!?T8pbp|Gs>il&IAD(j}qh)))`5bBGaZLAd$*J=Vh|4Yxl0PrLJ76 zUnKOw<MGSYPpsh#J?A6uU_=h_uE?h>L0u6>p^1_J!jTB@9YQD63MtDxglmwtXpWMl z)B7Ulu7_<tS3wk24>i(PLU9=v=M7xjmeyfZExgPLon{FS_G{p?A8r7@utlW!Hyana zBt{XJJakBRat%yJTK<)KzmyT#p6+g>&+KVM4`^Y3f89#Q&DwPzwKn&tDT!Z_pQVj} zo|JW@N$C#!*VViEma9HzE$lOcoFfdo#PgkkO)funi18&DBRLGSs7$~B06+jqL_t&+ zMoT1=n+vDt9I1Rhn{Sd}79X%n=(K9!C0U$sFqHJl-_62VARITq&wBV{8iZ-f=(K`c z1}<}~ZiaW^@U#>%U_PM5SRjQ+5eZDb{)h2XxFWep%3&cEz)YQ=nV*YkBPNrEx*7NL za(e%;j1kVkTOqB5&G_myVvdURsjX1A!a7)}mwtro`#wh;dJ>~3N%53~FI=Dla|ME_ zM{PlTM)TxWc7nxzoDsR7_nf1XrEP0}BVQT;?u&AZ!TTx6fj=i`f5K2(l<Y>@Q0>~& zv1NQ>?DH@Q-CGk=icv)`b-f4Q^xjQ<RAqvlHgLa*H=>cO+ra%sq^IoKHgI2=oLcp) zHgLaH?@aZ2Jxd7o_v<hYm&#e@GW#4&%>u-Kgqy_Q<x(5CUrsXh@Bb1(HRo>uvIXn< zd>N&w0LlBftrLhN!2XqzFxLvEOaad*2Gm!&PR(Qcp{!T4{z~&Q@SY44UOY^LriCmN z8iMpuzzU}{pWFRBp&(IeK(1F-g1OwBRvv96q01qua4}eKooc;KqSAC|=}lPtM6Mn3 z6m_1$Xy?5pne7V|YD&dmNHgU6*d$VsZRLpGAVVwDU}fT)P$J)vp5P~fRjCC)jx5b- zD$4dEOtjKA7=vkqM`=_%z{%+GlA(^?@RYBHi);<S+TuH@ZZ^K>#BUl#bKEp!@eYq( zRi(9U;JzwiY-%P)sep5()VbgFRy0PC`i-HVfY$0j`uZ4Bu?SA3dtqHV+y=R?_=Xz> zvDYi}dawIwhDm;CzA-0{CASBkBLHoxhA`=c^{sX8Vvuwgx^Dz4CK1g_gGUJYeTbWw zORAZ|Tqpbm*B5hKQ+OE?_S*T09oc_q#E7+c4zmRF%!YRwgnVWbA_T1klW91O68wB7 z&U$1#JQU*?UD}1%Pmu1jWZ6_R^<-HtS@<2v<qb#HeBRlt0e^o(k4e4{4_c~c?xJQJ zU9ui$yn2jy7@bNgeJ}In3EReEz)Its7RNfb=S}(J`~A5VHR1Vj8c3s++L6P<y(XOM ziYhkl6t?SRWVtHnrtthmzb|EdcroO`w^z0usp{=Bf<gB;`fkuYsIhlfoB*U7rY`D- zatu8Wj#c6_%}snV6n&OvaQ@cO*<8nGHcsZFIRhgDRJV;Q7MGDm#O`zq_V^-nB^-Ln zWt5iexM3MYLdCk2D{H^^*V|9_yWV?IzUZqxsW_Z8B5E_$otFyhBpg4I+?I_lf>jSk zN2;~2FvuK^hNciRxG`(6@Oe^qzEUXfR{JiTKe|&9jy((PJLMw{)mrb>Tqj-#cH-%R zvA$9sGC{`Yx)X3YCO8i(4<4$NM<d4y`%ExI!2T@f26cdv8mU9MYfo|N+21h<jXqHB z6h-@UX(wh^`*CTx_WtcQF{-gQ1iNjL`ix3*5=B+1|D=o=^J_=wP*J)K_d3!zYmH&h z5Ms2EHNMxCIX!3Tkh@~;!<@7^H?gD=7+ASLCtV#bd+x)xT_=#<03dHyeZOo0cFse7 z`N|&<G$JB0Xs{w3!}pS>@x731yK+U}K7EFa(dH<e*(?TvH+MvM$)7rv?ZcnUc4C>t zFe07yGD3%Y26}1lBLwE_l>hA0m~kehA>qJggi#TdCP`pzN^3xx43u$3oJ*1wTR2tc zBh%!s-S5xBv8CB{(b4g2EUFH8-=i_%K{}C3VoplgM&)j-7)bWRh<}Bto_9#p)QfSM z5ng$}+G$$?_4JkHu!(?u9d7uW3oh=n7#Qs>hb~)WyTXU?n{e{UaqZVi_K`|ruBXpb z%CCKFTLN#**zwAI^XH=<b*|zAxu>aTXzUpdNxk@gLXTl4S=qV0T%Qp-wBv3ay6stl z<Fy3oYp@#4U@FwyIiG{1482wzx(Md?SW<8h%%8~U5g|Z7K!E-_Ngvke^tu>LGb%=9 zXMsMOgkGB#owgi2=6G4=@+3*{mO~;s6W^KZX#}VfKFsO;_H{gBxB_D?Oubf;qa3$f zf_km;{d+>X3xBaZf{CQDAsj<~{<)v>T@G6Dm1~VXU;9yit3ihzi=Iv{bSC3u%Vti) zX54+x{{9*rjDqFc=hCO}@2y`&PBLTCb2nb{+=1&xx9Ux56u2)c^jL5V@4fNI$ZC!F zn=`+RYt+rOTGCSQ_SuCOadPfyIzy{7KIS-ok5H#OXFrKc&SQAP>|?W)&5_%{{Z{KC zx9Zad?l=F&w1NB0mvJ*oXao0~Dc$Deousk!i-coexdrrYMk!|q-akt<t^o0yi(Z6n z;J&&NzfRVIzu17+Q}Iin{d`$|>7C_v@mw+OEC%Iwa=%DR3iH`Gxk>-_OIhEf<|xXx zmy^<wbOfGEkV;(g@GD@~SCsK>aFS4vG#j{o(8cITr!hGBEwa#-XHh!nZ7i;T)Nvf6 zT@UO6@0U}k6<=TcTd>9GGh~$_Q-atIVlone6uou@+04OFpy`b=Og#h0*o;V#t+tkA zV0$B1-sYlT*}}YB-fiH1Imxuf{yv8ezSJB0UYU42hK$aF>C>O(Oq-E!W)~1&S%Od3 zfxdb6-Ske7^S)PDr3&Qeu=Ia<1~Jy+EGwe9B<jSkk;TrpzN${^={R)W>%$*sBpM=X z8)xdByBt5=hhV1}Ndn+R6st!GhrOR$CFg0SjTLKyKO<;=m7ku4Fm7Dl$$0Y9cj*b* zE(D-ykjW6(k<=r|@pd_y!(x~bW+;!vSRD6~x%_N*kj_-4$L<-^5MCy*u~|s~_}>wq z1PTC`8aiUWF>Ar=3(7!8&8l0i`PMskskIy>=RZ0i<3v~M0rIQWT^JMJoH66A<=uvv za@U&3&h${PVT0AG7VNE?2GD`P-aE=B2?)Bn!NTvr)%DFjUdtNE%?MHds{bbSIE~%k z6pcaG$ex?7ZCEUK8&uiv=G@nt2*MQKIj$9FE|`ID+WL`bp}H5>QO)12G`6VOF17RO zC4k=@or8{K3&lw=<tEv0;(9Z}bmaEaxww`3esO*4{oU>>wM$McT~CK6=s2XV4(3Ao zDE?qlc@zf`LFc45jc)fO8NVBI%Bn>QqR%9von%%$g2hNHu7h$o*O`N_V~mash4b6$ ztxTs~m|5w=wUx$S7J>=#gf|J7eV%~s_3DMIbViO2t;_xqTwI`@<<>gRMo+u@?P(k% zoBV)22&ZO^tBu<3odAIQ&4ZXSY_itt32g6(2e3kyz~?+?F|W6jZNYxp0z`z{`#8=Y z4~(HFGzxoo3{jm2ujcN=lk44-!cHeF!E*bFGmLmkz>kRVG7=gq>8O+Ab)(q<Jh|Y; zBtd&39dT+g>|KD)SeaS9te_e=(5tcFG%+#eTY!C$RgzBBV+6FQ={(s$6{}vl*Y6_@ z!9NoXg7;4|?(&gD2njNNu9N9>Nnw;DFP-8&8!Y_uCFPRUnlNV@!b%bNzvRic;m%t6 zN`TShUYOKjCQ=@(*9;L3*a+b7BWVI1q}pkJB(NeP2d+rCv7Um@kR(|_7DHW?iSPEO zrU$pw*>x+vd9(S?)^BuNAVJ>iI|LQB3{fXZ5-0`99Gl-UZ%=D2_(J+acp+S#p}LlF zMnM%?`V`@e&~MYz;V284q;>NI>Q4l+Sc$0vwr%OgvvMDDtl%;Io3N$oBLa#g5}44Q z!Bcn;H)G2BWU)*vB=!09Sw`<9czi$70zvy<JAk15O0p7>GCD|-<T8`=l+Ly<%~sYK z|2xl%Fv&UmmlOY_Qnn2rQv<j!D)GL+HTW3?;0<$6!*yzA21gU?_!Qaqt&z#Pib+c@ ztT;~My5ksLwjV{1j>z?-HgLZlsqMivZQy?Mh1>@2H($ohETIkDZ>DtB&pSW>#$OSL zp%mP$Mh%Y8*YpfwB!Z3KK}BU7xUYs(H}go)3FCLkf=75a1Q36*4zRt8*U8LIsEq^6 zry3K#dbO{f(|#)JtJiLC&N!2eqK_;rHeuvbk)>;IYOg{mWS`kEg3}u~t}!6UPZ3Dd zOSy>X1lj`DM4=$51(c#f?G8{DIfibYL&yC04^W-et7<9m{_UhtD<w%OL+7oV<48yM z&S+n%9@X~AT|VgD9Y~R`u@Pn-NkmJyF^Y7&He-BY{o26<R+tcdyNaq0CDyQ7Hl3 z7fI_pf@=fs-EbN*CfWa{r=btUaU$%3K2U!@Y>7sesYKLj!>^l3A=tv{6paeM5F`tB zME$WZVYc9_&Q5&42Bcmia~GpQkD=o}_`PPb>Jc!)`O#wp!#qF$f4ymuaFow+tti$5 z&PhMUMt6pk{s(6y*v-2Ei{;A8WQ+`mQU)APcFjxXAzaa#%U!P8elwX{K9JxunA*vx zI=g1WH%H6VPqot3%SiMWv!ub#+-pLH&Igyt?E3or{upXRtB$*jc-L^OE;jl`q;h`7 zhD$5y4P#+9eLg%J;lRmkrL7Dq8(XpChf~R_jAG^L<}m8Wz^})EM>+WNOlSsDYVQDe z#dV*GSaCDqB#79F>4YBF!j&V3(f*2mGdK<_8e@SK!1rqezSl4u7FWIE@A;sG&j4VT zGq4!My{`>avB9FAj>8cXEc`p~XG(J7y0!1NVk^Df*F_aOTZw~R1kkw>en!?aZGiLx z1gPE)kr{+2+I^)&hfuI<1JE0|!U!Xk-%|>*+B!u5fq!T2E==440dF0s`X$HcIgAG2 zA>+5cx$mcJ#)>QBUAXDjwY;uQI5ynrOTr?Dkj-h4&FcA{(eYEeG3QEceAmzin_E^x z)=~|ogQcBPtKNbtC%9xC`pIzbwE77MA*j0vO#E8T!`J*rabdxPXlk<^pXiF=A?qC1 z6r1epRjOI?aF+RoO#_%RTDRr^5se#5njGG+^p(7(cxNlw0z{Oc2g9?B95M!XXb#gc z7rquA!a{O;K4l|#>Jw)&bZkySCV2m7WQuE!^3IQff&c3(UR)y3O{6}u*p76r!ep8* z7KQ4+yEhp2wXhb=P1mePx120gFSJP+?#KH`5V?%UuhiTkJ)euaw7rn%)VD+cQN8nH z!NT8_j&lAgBDrj?$;I<FAv4;eFzmHcNeL+JD`Ktq?099MUdaMf+&Szppx>_Ldxko2 zE^ow^;X6kJcog5a_vc9V1)S&vdK~KOwp46VOJ@~N88E(V#D$d%BSmhL8|C|q$7;r@ z4hh4qG+cE$RRm%(RwEKDbc*xXsXM8nvjEyaCBJBCfi+OMP+Z2BF6FkI1RKbz?4`#| z3H+k`9hfuQdd#?~8{ZxLBwn-*l)bL_fGd;0XJ(&8-_j3xh!2|hPv@;y^pD{$R!irT z?=x-N^oF<&<-d<Omhm3lo3N%UlR#8!eBN$kG+7vt>I|L?pT^aA?RxQktAr1qQm&t` zRxhQ;XQ)U2)&bI^D{WUT=Y85WPXeXy<B!h%CT7UE-^`>IaKD*#Y)0PpOp=jP!|<fS za3;fCyKqYfVdi%eb-0F9h`ROwNi|{!TSqW$KaRIZ;CR{8p-Oeyz<pK3sD37G;J*4Y zEzYqG+%J~M!TQ|>?jM}{HA^7IU)%y>>{qS(2;%SYhwz}&OQ89-l5@Z6bI{BE2ATF> zBjdiC2AkzNK>MxU{#H`fw}PykH1eI{WYtN~x{)E*3PJ0wP``%iKz8C7Lny~J(grwx zm5S^II{ZYdFxMKWJUNn$p(h=KHnapM!M!;ZjiC*-sYNapiv6Ma7a)fxTBJt%Q;lNq zep{gihHj*xaBd0l<!y!L{@k6NrRrrf+4TwbBI8iH3`6tIE0p~b?afWjBH^zOjMfJ3 zE0gnHpJg|b^%*bkb+Kj3%PU}I*@TGm48}U|-ir8PB(NqqHHm?U4X*jUSFV<=w2B9& zz1{df2?%J#^f7%FA6%S<CZir`s#H7Y>1_0;k{vUf_MK9vZ0!^8qDBonCRswi0PuTE z8wPtP0sQYJfd3wa0Dj>JES!LsxmJ7<ainPhHr`yp^z_b%1fMuzgx9_k;JVe2TEEZ{ z^Ci<TW(juO%k;tIGHi*Rtd`*f*|RRBHjLqWS(kds($RqU=~G$Q8DS)!a#;yWL78ko z87wi(^<F0@LvVlSXpRmY&1VM`Z28~2DPuBJnx(DNEWyWc;9iorx-CgK84g?|!JPR0 zNgbJfOJ7&3%)Bh;v7s!Smg;Tx5#ZYuyjp7!s-0hIzMCYMemG}=KWD;fO2$G$!c1Ij zI{f;;6kHq)8c7+wmB9BA0+|&If^`)1){Gsm%<lx%2-dewvkq>P1`aNM9HtDcMusX^ z0E`fk5jv87nB((E=^eO6(EjZPek#>Z>bN!SOKt-RwEIf^H@P>JfH!o#{tQZ7xsdI_ zZ;$&*98tFGs7r$(!T4=ZS09ke=?MxyhSz5GNW^Q8{GzP(x64^M4B2()B-qblT7|*5 z(on-Sv>!wWJijpSAV_g@P4q-(43F7n8jiFRHuYo1$jBp`cyufV7=<qDz{G&3raHH> zEx?jZ<8CtY2dGjyKa)WqzB#w_a6R_1Qwd1=G>FZ_@yIL;$;x`C<y;TGvD%5(0-N)C zuUU)Zok6mv?wsRP5}t^JAflS-xR%RlGSFzK0H%FN!|&jC@u{KXhnMT~b7>uHMRgL6 zmXn<Kgz30)(9(Xrj|iv6RIK_~Zl;~XrT0RjtwSR~*mPb|Gj%YEl(^e#ZI=D2VpY;t zUY)e#{F3r#uWF%tc*1~9!UKIdxUGkSAS9HKH=>v{ON7D^V%BfLRW5lag4_Cm2P|Q{ zN4|-^%nghsy6|dp7%yk~#E8046`}Vy)uF?nJ4NU5(tRbIFd`6@uoBf^fl(+Y3-Zsm zN3c2%I5qIuQ(O9q{ISFM8KrZ?^qPz}7E%Z&o2QHYxN8~j%RU1gquGm;p@a41o)6=T zo%h!q88v?&?ustrBNI=;9G%MV!YqN-|7rDJzJ0fKa^j$pab_!%_Ll=A0a_CAQRgxq z(Y`^j@J?NFy^Sce8*S#HA%Oohz8XD;3o%no*`9P8G3d;}OiYAHO2f=(AzGE^8-*2` zTD9TnvD(RR`VA@kua<8zD?0e<TnOYGjPmQiY|4V!qzTvP*i#(Us<7Nv`aUct@oUB} z;??1w#5dh%n_jis6}aDY!B#1t4cxCHp#3`B2JSas@@?RL^JU!3657E1W=dDRye|;k z{RM)&TOs8q8XZ&?pCt?bNrH0)pue4JlfVRd$N!v;7&gjrZ9`R8+w}+G>{eFRw~G9R zsf_Su;&2hXZl-sso~-;iG6Ef#L<ROuLpRP>2$QU|E%~u!gfi(R1C5*PGiHJ?Qo>+y z8zzzpGn8%^J(FL(4O?Hj$%WwkwnA-FMuIU)zaB$ma<sJ2_HeJMy9YYA2MMDvKQ*3A z%*H^&YCuo=*jq`oSGVLxbguSrmTlmEUW%>rX)+pdQvVi><E4!z`%%+k1#H69i;2ER z5xZp!*OI|eiliaWtYC;FEt*@#{%Up2*klBUJIJmsAtq(ev6h4P!U8lc7>f3J-ylAp zX|1{aKj%8=$WrOh^3`Nt&+(jAhu1rO_|t4<_IvRzY81Giub;(aM9+zCth(imT_UR1 zdkNmR(9jsBu|aHtNuNBT8$f+OzpodqAtZq(xHON&rJXF1A38$gqFWs%w=6*n-!%=w zPv*h>NDt5nb|5y%qPO2QA~L|&u4=Fx-QKq!b*ogS)u6>kha-?^@F>-1#QQCpHsSiR z7O&1G3tCqxSM`oPK4QSIN1Z-Ws#fb!6P~((nvK0(7K3Vl{o;CkgwI8vg6Bd^YfQW& z27-2sxg?}a3Q{)7bz7Y5Ky=3DI<8r1ujjj2t&AIvqli^;zOJXe>5LxFjma4GZv!l< z<>O#vlG9!t&h=DxIubxTk#0B8zG(Aa_Y+ZOI~`03wEIe9_w7WKtlIIp#xg0o`U~rK z;<>f$^={E&MLz|*??~qg=NGlFk&6q6MTYS9oNEgd-tIHS5^C(XS<+&_o`IJP%SL?& z8XZYYbjlpUWAQ#*o$H{Z=jMF(108WZ?wI9Tp?-#a(VCdtgIU?V1^)KaVe-`(9U~_? zur}hZxxoj;79c0G2);gnaAFfA*vC2N2TpFYDW8lkL5^2<it)pP=L21MdZjk7Rw=={ zq%2NaGZ-YOsM{EaM;n1n6XuF=_gph*9>$n#EtSoI*tef!ONw@fx%f^Us+JLhJ^D_V z^>$i2b+p>up0<cq>^znFN+K=c*&7DThW9Uuomw&z(eUo=Pc;?vp0BGI=Wnh_Am0vk z08u&|HExTXT(#nj`5acL<Fx2?7;%!I!j(anjZRUz#`9keTQIt!!`sVZJiG<QXT5*S zK99R_5#|C=ZeFjeH+NuKe-ban2k^tNGv9m&NB+|U@w@0Sz8uwJDV)W0C|z@8Ka-yG zFDG?vjx4(DaaH8FRmpw)lH_wWy-vNrDjl6d&3(2cj<vt$xq!jco3~m_5Ol}G_+sDV zSk^cGUKN>sV(AUsHTx~<ZZ_vzVSNw&F!~tA;@kS(O5@Bv-imh7w<K`nL=R+-7AM!I z(G{RECLY03&PL$46%z>)=2JUKWdvaV<E}-#QzHQTORCB-KfVaUr=3ZIMd=j28oLAM zssF4uiE%|Z8aa#_*o|O>N^Vs4J4kL~A+W#RG`eiZcP47Lzjf20;5ThgLrzyF2ubLi zh-%$jl{m4GbK%8^52GX*X{99k#sA^?4w4oZe)s5S_oQlh%*&n>)-GgA0&U>_mMB{5 zOB=Y~{QJ=c?l)h?%`Bk}+;66I)yez&NZ?s+t&$p@X!r<1IY|}RiQ5?PFH{x(jqn?x z0xSmHw90)}qaFuES+7Q0)y%_9;C>$&IXlV9Z%+rd!l$ZPM#FiLX?51ng_k5p!&&7s zC^fc-P~`6qj%|c0wlJJloZ(~Rk`-~CaU-04>%z10ty2D}BVfx)#vMy+6?U@g%fXwx zSY1XR<+W+uGxOm6NMh4)RSNvpy0r&7;~{uf-o$Fh-B>l+x0t*et+Py8v=o{5<16Ya zqe|6Fve+Tn>2@Yt03+jOFtm7Dmr;#@%8^bJ)O;DX^$Q!t`@Iii#&v{1tnKGP4x|wp zyH=`tW%sp#`(;J5F9#$ti=8r!F#=6xCcC|^Tqy-?meFJu20n}>*|t?3Em@vq8g>S* zhaoSO1{B77oCx;W;3vCw)Uex7CC2>@zZTw0%g_f}i(Ttad?R?H1#H#*beQ<%$O^2X zz?SUy@=M%e#dqx;_(tXy^<+`u!nmXMd&p`rqK^#xt2Er!atn+E6{p^s!^-+j@bx48 zbdc#T-A9X>Q}t(x^S-ai{hXcbFRSBGf~W6_jB}c_ZM4v2b%-QoZW{RG8mvZhm<wlU zIIcyCRYg$O2@azUpE{F8ieX?ys@7)&3;%LRu<)k|THm|+pX-qE;6R7~vhDY6T@5a} zXl%uXXUAJdpHW!7cl63Q+q2WrrSQ1Y@0M&97CwXB;Tr_<t7qKaO9OJ2>$@?ACk~e$ z?v#q6<auE-FFti$i}m>KcVWp3igw=TV-%7;b;hxxtPjP{z3eB4LSVOXBienXv70X( zgieLVp`#O_S}8_4mw!HbT$Stu<M)6w0f%`Vl3W|BWGdyt==>nrWp`@X+I>cqTT?X? z3jzI`z#KXY>N5oO(_v6bL9b6iM>3P~6*s1D-JAE4E%<}38TOpU*3n5r2j<M(@ZWM! z7fi!%&KPiIErBCki>&wAtJb^J2?xm*V2!1*{Q4wfsm=Mxu)~1&9t|_%&t}Vx$JSwv zDRYR4!j2ch{a8sVb8gmiIn^sC&}E3jP3H|OU9%+x_P;C%bY`r>WNL51gss#KZPLE| z9$PX5@B7oMaOyi?&@x&m?GKuLUgI`N)Vs1xGYZ;jScV|a_PMs5Rd$`&B0I|Um9?;$ zj^SBE(%bJXlce8zo?E2)HCN*fuZ%l-N$|yYfSM_u(qnSXj0?+Yta0osOrp#aohi6# zjKU|_@5jmD{Q6u9!3u2bBC0??^`bpCmSNrPh*VgYSkizX!JfgG4&*6fU9*^vq>$oT zJD(o52JtA__50IT7!hMzCzL;4O0SzFsB}zw5<iFy;LRxQ8BIvNRtZB+9fmydh5)ur zs9M!5(<E=14Vp2!oWsq)ZkblippFwx$T9qa={qE|+XMuMtw-?9!H?sD$y-Nml`ru! z+WTjwpGNoUD;p=KH8P&eewYmDR&?qKh)((8(k9SrV{{vmEm|}&ST#}FEa+&N<@=eN zNEr?7V084#5#y5G_|zk6^kUuU!-Cv}X+tL?lhR3q(IV5_V$lTrkr<K%<J3k*?SG0S zU@=JOyrUNZfnYC4!_=)lymAo({tK{1CU`H5h>{6Dq}^nLAIe^boM~*HTu|JOucgM9 z9VhU|cl95^m)5$9cQ^c7F!Z16N>?36iwnB8XvcF?wS)FuB%b=$)~ET5)@N^y={hi@ z9mJ(%FJ6ec5Gi9@DXwp`e*cnt6sPefe*fIBW1aYty-1}nFMCn$?OaBGCWv3s^)*!l z(dgdTaV?ge^A%x@+nx>aM<k+*0idbUs3G$<aK8p&)p=?gxL>E>TI8}eaKA-vM2Tvo zIQ)Kvj2dr~<Dr$3niCDdAbE};{-fNEaFcEm1=)8H$9dk@!wlLNefA(J>s#p=E3Qiq z!5^my;CH6hNiJIZ0;@Q`Mt*CkkXSZ$;W^305lUUqR<*IkLj}v@1Uw&IeGPJKlXW*? z>O;)ZjilUxHIrv6q;n%}+^cJaiN%`Ez>-)eAaM%j;5BG++sfv>s>eYrM}YS)I?rve z(N+V$wMzTM{T^5!hjZ!0ttw@yAXxW4h!tBu*}S)QH}pkEHgJ7{VVnbg#1|Kkr87vq z$zXLrPk_FT0R5a%LY9_ALBgHg2;W_AuBERN7(sU;f{vxvVJu-7%@Qm+)AxR?88(@y zMJ`4HGs9Odmd>!m-ZpT*gi!WrmsU$BPRkN38D&QBy{u*>1#HND7bZK->|pcNWeL1r z&Y=5Ef@3lngpYU;=r$u@%OR;#KBjvjdURh}g|yrnz{Hen#D8@5VWq%0wiox|P7Veq zI7c2zC(#k3p(NZmpjM4~$ITY}z|n!P6h$HsM&xF_hwN4vz7sxV=^Uk@kw<J<&Kt5R zZpk!3;Atci86?OODYp16w#dTv-q&rweSHyC9IHZ{|2;z^RI4N>!4>a~PeEH1Jg4QO zsV6Xj2DOBi46+(5g|fJ?qOKvloLmHG|I-BRYjugbSh167Guh4<0b-sJXn4PyojS=r z_xLfg<Tb$LR9MGXC+#@Dw7=_@!upi@euBoYcMpYCaagc&%p3{bq~o<ZZ7v5?Db<dK z_Hm6j<~V^M-_L5N<$wiGjb>_QFf6Xeecc4__qWD7vbb*h{d>>)$$mGqLizJS3&BV_ zoa#!!VX6!Ws*ug0Kh*9kjo)HB9koXMmm1HgAct2IC-G-9JB_jhhwJ)k)M>~7n?r{! z3afd6@3_*=2Dz+^xs{{1xKw)lZ}*wH#NU*Q-swu=3HK~{ELZEwKc#mdA=wd;ELhj- zsXyJ+=?cc`w`NUS^R**q`mo+re}6n^wg6i&iMcl?k;-hY-A{Xrc-P4Gd}AaYhCMo7 zm(10^NJK{%rSAJML>Fq0Eo%3U^7#p;oV5taDCnI#8_JMjeCIm&Ec^Vi&Mdsv*2Mml z>MJ+M9Q?f^=3uYQ4C#)Z4MFI}S1~<DJK6zG572S>Om_@Y18n#LSiiuv*frv!m4LB* z^dP&d8|ZOvJ1~_JVT#TlR~F4UznH9fjVI<ON61p&=gdK7z@Y#QA{zjGMw6K#(79Z4 zQw~qq=Wti<ZJ2HWy~~|jNv|ueiRrz#o;!)BBLkSEqd+s#kllbYRG;;_O3%M)DKnMU zA;x#LRZ6I$v&fe%`o|K%`Zrd!xJswJy-dRS;<Ng1LPuM7%HYOpeNW(9?lVoV!UK^R zd|=|qE!%Rwz-oOar_mxIcOop);gJCSB~vG+>0oe!5sTu~rBq8Yb$K!!P_*phNrL$k z{1kxx1ogY^R9XU^4hyvBdXQxF(n_f>6~sGNFJp)xep`67?5R0A>7^J|Cuy)FuD2o1 zPl0dfU3rn@8_Mmc)%r@l0^id97{1|G-w8$JKge(?_w+K7v#t7j`@)=^q%gJXC+)Op z{g&fd;ujd<K!ucJ)Ly@S5Tm&P{3zbZs08(|HR`F(y_N|6iT+FY_OYMG59}lLWKq{O z)i5u0W!k=|j0CcHAWWja=w*DY^JmMPqt5O&aKBDDwt@R~3a*CB+Q9u9gw=wlwt@RC zcvD!VD@ftHWZ9VCfF-t89h*7PIK9EdzsbgLRT&iADpH&ycjjNwYdg5pFRoRpr)oV8 znzCNi#y2UmqhygdlJ>(+us0!rO)8~Cwp32|3D$a1>OfSZE?_@jS}kMC9kE3`NDzPD z>gzk$&Z3T!SaqL<Uow#aA)j;Wd<r!~2N~BLj3QuJR}MICoffoCO_mKq828-^gS-vo zZk^igtO=tTVtC<II%nM2d7$7|#CZxUR8R&aqiSz{tpM@UqNfQ(kyu(lDpp2WOeTAi zs|#A24I06q&v1;?2{#3xU(n=@uM!!@z0qZKEWAYUWp#kA08USJoJHyu`@SJf#p(4M zNGGZ*pagJVXE4Fq;YB(aKqj?^V`y>1Z}Z<r9SOKnS6WgE)fBL4qYG1gA4HI$p9_<b zfbO(5+i(;OXN&;;8$rm^&0&TqtaG*R>rNN`wZT>Gw7QQE^QCx}jzGhVGUVg)X%B_S zmetxui-gIHmz`dG;TC{j7?GO=+^<`(w=O*Ck?_cf052+cASqR*mgDrCsUJU7G0IY@ za_ZZc!;d8vASYL9zC4|gadA<?tFz5BP&x(E{@Dz)+RgV(DbRt^ii`V@NE<O1)Z?}J z44LPe_pHcd@O*qk4<8No^(FxVd-jF_v*De<kb3iL_H_cJ@WJEigts^Gkvke1+X}_r zNZlLhGm6XQI&aE;g3PVe4bF=5ymex|%wFZnX@mDmOJ+~{N$H~Zb?<W6go!l?S5|g{ zhThS~NE*KC>xzA?{5}<ayY>~e#oeEZ!xJjMwy(9k3~6kBd-^Pvla+xfwdPxReka-Z zefAWb)&R^VI`}ivXE1aO=VvVhgO#5vw);$>6!+)*BLwU}?wW^3L*%96#7IvDFTsg+ z1gT^4Yo%Ra?-ZR{uPktFGq<TrkvRYBKi3bxyD=TxL9_)p*WwsEKe;8{ySrrEKd}8C z>0(sKuJ9OvUCmoJY!zPOOP2R<kxaykda1<GgSo3&W6SKiRTZFYt4LL_k3T<Vz!DkK ztp+kdOBz_XnTa(v^HU}pu2IS|Qb&%FI?|8{v|EcAuo9LqNB@)QU}^^=eWiBUng3a@ z9>X08)ttC1m8bMrVPDD8*z?MijZXMGb-=?tWLZABlVrfc^|EGi6;lToz%S9k>cL(E z+3=%`1fqQXzZNlJbXCH|<-`uAdZjWq>9x4C(}1I$JDLBZDG65>WW2u6+_BKX$TKGl zQ4AVG@M#0+(5#^&d0lDsNtm$d#4F3Dir0wfsuy(+;1Ac-iF{P5Frix!vOMNZz-&}5 zH*pW=gA%6v8B7=GR4gR+=rrlzkhR=M3TDW{DyKOnq#@~cf{#<wTgIuEi82yQl#wZ; zoM(ne_7qCy7zr;+Qj4AEm#Tj=_C4WT!4tWs$y`r%|E~ApZ+-73p_Tf&h;nt;=5qM- z;;T3_|I`-Yg76thQ2(uQ^dVw&A|yG<qEA;zg1hGpB$JYCw3DfCY<4b3v2<er;rPMO zo0XHP+WUw4JP01|s5#qS61zOSD(p?{=LQ?+z!t1ZRxIeP2<l2Z>GY+-_~i66=v;e! z<GN~vDji>hv&YwRAHy@j=Gj#Q@yfm38uWWg>u%qicHp&z&GE2Wy9$p>#4!DK$MbL` zCkl6~`aP|+Vpe|w&&7xEa=5-IUrH+^+Vh`X-@uCJ4E}K738j~*a$YT%7gY+pO*0wF z1mN?(j5OKyMf&m1pKGcl+Q9uf#oGq%*D1IfE^7n#YY<k8otog}WsGdBg5}lZ?Le5n zBizC??h8<{fTLI$@<{-w#U|L%ZTu}ho&0Pk^(AnXfc@{ZC}2O|+P#`+^sxu_bMvvU zb@5YdYA@f!GZ5kyWuF)QKmQDbZv8&V67PUPwQ?`<{yxq7d)S%w3;T-rZaM(K+I*c4 z(&w3M3_}bHXC@PWjz+g;BmokN7(4J14L)o1if(4AcWilY;2Q2;egiK5+gsJka528_ zy$`F_Ue%b)w=%Eui#r*IZ~h06;`N1=tFzccdzny@gzTrVF!Zj5fwIjMk|mSF@YK`L zCzXM4(?$<gJMYJesbdSAu2%gdg50%aR?0@nDl3~gI2)0saVI0_?)NyEX>afbC*WLu znUN-x8y`e9#q&Ma_c&IKYy*>EJkO3zBN_5<{FY1>=xo-FNC6rHm2wQLndR^mNyd=X zlF{eZJ4wgzj1q^=Tr`e!IDq)-B7dl_gx#oA``?xXe0Dwh(n1;9nn{@gR)dwE_hZH; zm{Xe5XDl>``6kGad1Dc2hZ!k?O4GE?rc89Kk#$H(T7oe&{L~PHkwcosT3bYm9<ufu zmbMuJ8<p~^%Z+cD9C%43TEBbwEPgOa;~Sq>UGm@>CQ>F7UUYcy=VS%Tk137HTFvVR z`J8>|7*{$KjJsmw*U*rFjdeXgH;hp1&$m9a8^<)bZs?*hv$DZc&AQi<*Si_k+Q(=u z*;`Iswd9e>7;$kyk5?GpUCq=%W9r9GZ-e$l-i4rpM#~b82XlT2KUz#<DN@^eRB73Q z<?pV(+Q*Z%uo+L?q;Bbev4;sT%#R%d?B?1HTg5V!1$aL)2|d}r8cAyQnR4}*wV%dv zkuzGkbCvEFpqdvZthmwy=Dz#MynlC_d4I>P*o%I$qriRq;U|b?d`*wbtLchkj4)!q z?`Q@#<4$1LK32UYioTutO0xxiGP(pg&h?{8X)-&2|2*CtR>tBg=BWR6k>=JPuRech z_nBhpHUGDj#*atb3EW}vqer_$n?z;8fvlFqC3>zGwK5q*O$g~Ete0`dTaTKs7G)&W zFz5Jd+fGj=Ne}Pc0|;9i2ZkR+;J&!4u7wCjFVAe<;CJ`RIMuT~k27*^Hym4rOsC;y zr;N@*R#*!o_*oF={aj<T&iElS#WrJX`O&m(15hmH^!Ij481Y0KVk>X<eXf?j+77VQ z$}2qH&#~Z4C-qCtDD=AO?~1}})&8FEE6~~T)OBfB#DF8meOT`+5Bjr2srVgV!SrH4 z?W*m0euAxDPkoJsfPV2Qf~AR1?gmwa(DHjAnI$M&Jv-rXmjTB;z}UKm^Y6;Q^PlsK z<L=B$v}c%*)LM|xSP{;dxtWMJF=3rL3_tZR%PAQPWDL?#e{)ifVn_<1ivWF(W)-%~ z3Je6`HIkI+b+=1M=v;U<`%Zi_(A;^LV97q)sX_NfM1!5S7{RE&6p%5+rr%so*5z;^ zoCG?}1ncvW4U*wKek+p9c1!pF+fR9B@Nnu`>acBi^7t>{0$J<#Bi%n9#7WIO4B05c zMmrW#Svor!2;6rd#81Cok2$F{&|B^LW*N1yV`3dQCu(ufRJ#_fli$%(y;$>E_q;-a zDDWc_e+O%1ykgn4j4y&^{`1)%#}7h|ig`AA&`A=u2Yh-AbcFaG*c@A4o3i80#oBct zI%1>#z2}GUq(&R9mg4J!B<TBI@*JHUYIoL9Qpj(1yp0~s6#mQEUuA@h=3-om>r*f0 zr8uAV@6r;Gh%2}|e3_wiu2aLYO-9fL?w6L=zVB@V_nUtU+Q9wh%UF#Pq8zf`q@wRS z((v>9>a78+5oMZ8po)D1#IHfm2Ebak@#$)V`fI*r7YOM7J^|f}1uvGGGufjH_H&}q z$-dRiO@R74H#RN%;BL*OpK=sVC=q_<0r>);FMf+p@eC*h&x=0(D2yPlbKL;`xA^RR zkK4)txW8(4qejLTHS2LZ<Rw7-u1pe^Tmmu~fFy1@ZkgQnWL1$Iv}F6<U}7@RC}6<b zdKVV<i1DD&vE{z#96mVlWtgJdh8EH0sQnn$+-I?Fu<Q%KTL8EF7GH*m%$x0`o&@qr zl1%r#80)-8(Y+-`oeDV-1d(7@Dz%$PXt&W&;jA$*{$$;a4tO8NymRDG80gG=4osOi zOmR9JMW<m7C}+wkC%}m79HzW?(h!g%^BD~l1l?z8<SsYv<&8a+K(-QD=d{T*a<M4V zfdCSIWeykR>R7m6tEB@X9VWD96VhZBPm^K%c1sS63CD9Uv)MZh6s;tO{Mb^BnMu?+ zZX3aP_rpl+o{H{kliU$9WnWx@v{IUJrJl-#ZFan9b>r{o@KR5Dg3NF4j;zDZXcvbm z1<BNOp=SVpooO88qLy5|WK{k5DYDCHO9Rmpk{jQUd-xPK$LU0^cGQ}Wm<yjGcpnV4 zT~Eqn47j>%zzfrr!BI-`7Wd%CPZG4R+j$R^yoZ$JUwn=L@h=7>0#(vjR2jtYCHU26 zA)6Z=h0H`OnT;Z(eHtb*y6H<ehTL4T;k%QS4f@6PZ>`^q;&9xE9!KNjr^NB$cz6~P zoviCk&FVAx`Ye)Zf1ZYEHIs<8@SW>M%m~`LCZ+qkO$6^BuJ=hJqH0z@5de~ffN{g0 z%T6{&voS?x*PY{9BlT8#Z74wy%bEd~SJE{Dksj%nak6_Gc&W6^!+Kt``pRLISEY7| zG5!=IDQYv(N~hIy>`zzj#A^XAXj>??`wVc#mc^w|eQO}4w{n2tdfw%V;*`8j;Notw zkF3tjsEB3)xn-od31-?DfhQq?^vb1BT*f*<`fE`Q=0n*XjJ<`|IAjCtcl9G;R;TYB zWLtn|I*1!L=C{Q2_=t>Q&(3#<FP(&UgMGj8_hCkF+W_aM=p-!wgJIs+kU-+z21)I) zWpdSqXU2A~LGJ06ak{fMrtAF{e~{1a_r~;G*EMf0T}vC!dW`6IW#P7@_JxUG^p%Bx z2|t)K?uZa$F-q{>(T5<x&`OepL^ipx70fK{e5RFL+dikV1kMtC|5N54z?Pn?eBvG* zEvMH_8c9rM9l@-12-j=_WZ*X9J<D%mWc5`T63bYZhVefl58`6Hxx^I$V1LeQgwH_| z2F@?W{8=oqe;)SqEAGoUk$wd+lMjD+{O2%5CiJ~beRMo|;D?N0WDFzI7o#n4+rg#W zJ1Iw74)jJ6=WspB=&LU{+)b;pnNCKTYfG44ubn)jX_eZ;jIFW+_Z|JJIFU9|?GN~` z;i2hoY>Ww|@+mjIlsZ@J%W4extMte4a>Q2d6xH@yNXT)wPeOnu$KuE|N(#}^Qt)p* zFQPNmxZPGsdBx|%^j&x<cNf0A?jw>)9h=4b9qagH?yLCn>0iN*%-zLBHvM;_n3twk z@BkNZEWM77fMD6*t-o&r_gnPFwt@T2zcFp#e)DDANC~3^>c2t2@Z0<>m71YU6M+6< zf~tGD34pZ#^_x|C$(CxvLEa|-`+{NrAOX5tZK5IiRu{qh0;n${MZ~!^BiUHadkEma zharq5h5cDL%Y2_(-chC*^=jojn=!t$a(i2`ZXPo6cjuC@XHu{c)Ndk~U&Ci4$pvGa z;UL2V=Z9z*SmE#GJ@z&(mX}&%%g2|0gu7>-f-b#N$&sNU#P7Wy>l-ZmIz>S5;yTvy z+ei>`@7i_PS6;2<vi7+OB~Yj&i8xPVoZx*OjptG}3nTlvAsr{nX&8oN5K>|t2D0I4 z2^=p@X~~YX(M{HB8#3HBjG+>N)eN7Q=JOHJ)z?>gLW}5}d$zc^ntzM1tt-CwGAy>Y z>3z25%9Xf4&wg*tFg$ZQ3R7&2+bj&>8EA9OQ9x&Dw4U$#AeQCo%HDEH*b>dyu}d)e zlc=AO0k{cYDB=7;)|#APu3=lV9A9&(&Gu;p!#@qKS~9cbs4UBo1u4giGrU-^{TC*Q z0B9}4)8?X4r05`!3~ojYC_LvdeU~YlQ_|be=XO7bt<=uKu|-L}L?4_T_z1)2HrKGD zq%MW$h=@6^Fe6u8ScZN*Qh2DL?`cM?IPdh}%bXL_wp1}$sbl@5Hi^6aD=@}d`@UCf zNQHw58j+2ZN!n<{i|$T*exCvS4x<jAKD(3Uy|DU0V>iCdC`yMn<?t>toOcT*OwNDn zN!hFcH<pcfZfZC1LrH#}7BcOhpzfszv@fo$_dTSf-26GIlo{jeI=nn1SX6huck<_` z^(hR_4n_cR8nk4!7Ljex6oz%R>RU@bj}FK<(bYJpLpY5dkC4eNxl&8<Tjw^j&#c;x zV_M>ktB|sMmyE91V9;jCSek>8n?y$}!MrK<6*F)OCf{$-#<v&I79Q})j0n;AJ*v?B z19M2Nej=u}Yf%g41C;?JUK5S#vKB5AqqEYP$Hov7X2Uj^D?^9cT#ga3*nfnRm>7z( zB0`qXM6e98Uu+3R^GPx~Lz15f4x4d)#?v`|C+P;a7?}@)$;Me;d&wI6=t!D%t#4dE zFdacbMb+vn3W~ZdPI0kw4+bu(*48lG_|4H_)$&s#quaU9xERswpY|@HPdB?EN`I~c zGZ_bNF!IOibZS~}P{nbNJ&gyP5e!Q!jBveE7a#~#;>Ipard{~_I2npl;vKAok@^J# z=U)t%K$c}PER$y0z)hmAAs;+vA)LcZD5Z$4*JCxocvlbN26aIDLQn_Y7T_LR+rfJK zW5*4<96Dv{goa{_x{=uJWKr$8OGz&HWiJ*91mtV)woPh|Eh5_2m#&nyedh&y!ezwS z?kqgk#&siN4iiZj5l!gGYOO_x(~AJr9m}x{5}Zt(^GbC1NW)>Oovh>1yd5vhw65;N zBIzKa`*qti@LH2>qq=oXlT0NPlPFgmqrzx7FU?_MHH;AFgoPw5T@FTCJtxMl+8tf2 z;S@4stC(GBI|1jPk9t1^GxIOH$8a|DV$IQX>n&5sbwaP3V+6^Z`#6@Z!<e)U;k<PK zON>raE<F&L!TkjBcdehtxb`$Y7d*xH{N6G%m#f=B-%raL{-x&)^rSA)(dGpH@Yp{> zkn^0qNY+Fa55LB_+z)4A<a#yrKHB^AyVrzD-$^;zd{$jPyz2HcYGHHQ;987e;pQUW zGs-8LPLgZ9-?oHv+6kC)A^cA0eT;0O-rTO)_o~}PQ2W_#Bt__u7D!quEk3>Y8cxrD z8@kNSc|)ysBhj1;u@|39eFASr%a1|(-E0Bc|5u*Z`JAe^wyn2KA_~fR%{};{zaLTR zmg-GDhFbrZmakx<`(606p7+$7O+(kIg?VYH5{K+!vtZc|T|hE^qioCC!2PnK+1~?g z;C}Pv-v;hCU&ghTAOOq)F#HNZ;ni5h_ez=Oq=9DO7Lea}3(Qa6rdpeJXwLr;@6U4w z6wrOUPc$s-x9=wV{{7s__2E}}Z=a__hG6!;ozq^8FSoOd4^!LK99x`>KJe+e?_yx- zc`6P|Aqxo(F!dl|=|$AkftbODC__mL7WPJy04{fj7T{iZu4!Q9M(cPOuCGT)Qct^u zqBrU|g^+C!L8FWPq;f8T^?hjh0&MGVRX(xCqba!)GgL4Hr2n72_kfb@D$hl~3a4`F zs?K?Gk~A9Sku+k2gb*koMDhbJ*w|pOjnlHtTi4HTt%vWmF}~bq^RB_Vju?yy0%1@9 zA%Ox4D2-+`IrMbS-Ia5C-|n8CuI{dIs_ImARd?-KXU?f}_SyU2|K7d#K6`)v_g7|7 zut;%MM7Jf9aQa7J_ML?kSs%BaA;%s}y7t4jv|GJG!o?qQ7h$u!T9sQG0-Ut$gjAsj zVtx;zvw1dwX$YXDfeHVkk$?s&wu@9Gig>U#0c>ir#_chW)2O5JZsp6ZtWx_HU-R_{ zm^+Z9F`PIOG=@vC{}3ZkrM-I;DszihgSKPS(E5tsIL?_ijhZgFTJVU*jDc0);9des z-b;7GJLhI-<dS~_J!krL@?Z(Lza;LI(}geV>~LqBdMrh%(Ahxr&WEpJx1d?O2_>?e zH1y#YG*;UTLC3$mLoqj;u_=N_O9OqT3E)3JO8`IF<K<Rok41yK3EI!)?V!5j5J4ni zBTi1MaCEvfBZke;R`QkcsulyT@AV-UnXO=!k8m?I!cJZQjzv4!;#$k}Bl6fCoFTZY z_%W~&ZAO3r-R6FR_6_-pzwqq&0UJ)u<p<=Lxw&fOT*M-&FzBmpTWfpt(Gb|Tp9 zC+V?c)SJdRPj&0BU;|V*!tH$q>}V}KR}K-3Hy4mF6I5f^PY@oB2zI%&=yJpfQd4j) zrEvM=Bv(#bk(2&rjMEnj(OC9^VnzR1XfGa~s2zjg&Dv(}aK&)HgX<ey+mCDQkP>SF zo<aHmo=Q1!fd)^<{5qajf{k{XQ)t&G(WZ;RNl!&~bre>01SS<d5vu5^VbvT}u&)Po zPBQ+Q;O6?|u`wH79?w4pm(%bB@D=+zS-zEWmy@P=cO&ct*iTR6;`p-1q-@}QQP$3Q z1g(Lg!Un@CEdum-HpTBme}Oeck?v*)O7$&~xDMYvu3o{!o=<;mW(n7{snC;U&YnnW z5Tl`CJi)WL=K5TW6Z}|0O(3}d=ch1BaK2ol!d7}N+t;E-pEC>{L6!M}mj*#kUsN-F z`9RHl=~eGp8r$u9wA<92BXMom6ydj1k_0C-+$7Ojnrq|>2AdR!JUiSeCDfZ|+P)x> zqSufJ0s7%I=6Otol39&^SGSe^ZWnwzo69bu0PyQ(0tk3Qm~?0VhATUh4V=Jr<^X<0 z|13<2JZslgE`N#yOc&d3!<(889I^EQrotpYt3}k31nn;O8El_BiL*f`zBS*)?|cO| z3|D8gNq!4J`RDA<z#bpLgzE-;wg0_jAg{1KN$hpwX)m_FFb3nRlTbHlp}OCWh&}gr z-0FVja`ljyDM4d(pEeA0Qct2V4b+h&jnR`#uLY-?+HuTWd^@|GevS)?>+I%>^B5S; zO#tB{DEUsyB=%_r;ffEeFrEo%+wtH1ch!aQ$=2Rxc(%K8XkvYDyOL47cl;UjEno~5 z*Op7&H%h2YcqnooPDE-Gy#F~G*Yw4Yt*^pY<(^QRaY}s+9`^T_WQg+l=I3D2M(~9_ zzs-I}+3%fIqUQXmB<3Y&CY$KN&iE9Z-dB;N*X4Yn0o>20oppTH0Pa^_`NaVD&tGDF z7XWTuW3sDw<(#8_Un5}nL=JZSY#FZSVp<bF-g|fmW`4oS-_FChf!jrtOB2UvOz|A+ zsE|QLwz{g7dyR?4VoeCo5(2<~0}s(|#qygl$asc}`hxkt5jMtReWM<$r-4fJEqfw! zxNrDJu=!5QDoBcewjh}}qQ+K)^fpB4GBe4=B*B7Im<cJ3mPh~{W6waHC=3XYB~T+$ zP7Rd0NRl%_nGX_V$MQGrh2Pu`pJ3(}H0+lG$tJON<Y#2}Uv{m%^h~L<-+2I|uDu|s z)4B!&*$$ipp*iPXhc=pf5wY4rM$CPfYrY!udU{aEs2d?i&PCX23t2>dI&Kh(z`ZUm zFo`pn`&X4KGdX>Xn_zAaLgT}kx7Yo8yFH4g_^EZ5LyiDS_AP>qKdN)_aKLM9BePyR zrp+yg(j9PjUgfL@002M$Nkl<Zgf65@WCWK}j%;ySJZf~jN$(@U?7;49@5s3)!0JyM zIA${P-BFH%1nh5?uo}28${jc8@hxX3UMf6sP)tqNwd;txNkF5?2JRtqvaug;XbH~Q zWWh?~&70$7F{Rsc_M#=1UbVm!E%=8nfe+Xrr)X>?*r^HA7tU7*JW!+A63GeL7nv75 z4w029O%Fh-6agIcCRA!j(G$dMz(DX<9Fu|4^-ya5_55D1RYIqgMw|rhgoxbnlJPb` z2JmnqyB@D>HsIiv?B4-9!)}<uqeZEs=r)rlbphD-ntCxtK%kuN>6IZH-ki?Xr{u|G z9Uk4#p(peHN>6L+AjZ08DYu<0u$V^K4hWK(52|q9orFhF-EX4MYt`YlZ84anWg`VI zjhto))SvLDG2~5<?LW7{mqg>l?M*uL+tcW9(8HUiIQ<2ve}7odeuSR4$dIiUha@~% zB<a<Ho-GJ=(`j?(Uv5>&Z7b#Glk0ua1}FV`jM1pn#Bz7j7@~<Fzj_aQ1C#WuqRjj^ zp)%l42lv5WT+^zU3fH^MRIFe*61I?>^tXCv(61UsSl@vOqm!(#i{Io<PWWtzD7^~? zppUy3=Vuw|#94Qdv<U|K1QvjQIU&w(ML)k4=e0(9L|p{31!z$9)Oii2LzMyWn)MRe zyIHOtI}Oek^OPg2+&JsG*C<y;Iq^)#CNY}9$eqg@)51DnD0?3e7ls)6W{el`a3n{b zjTT3VzD0QW`Ozse|5ldAbh&yG%<)b19uyLue#qt?%rUo@n_i)KI~{uLXilT6X(d2h z0Nmf2u;P~!^*<IC(m|=uGuz6Jz1^5=SAJb1MN0w)tur+9A^6=POnX-{ESD;Kt-dFA zGWy#cXyN|VoIiq#QF@P+83cR!Z@bQ7SK^f%WLYv3QaIX-^ICkb=N^pmTUV)ZsEgzM zp$kvohoPG>+A!`Yy2kowxcIx~Ct*y^;zaj-_>cCRi%z4M7g~LB-2ChqT+fUEbBmx( z-G|x`?u~FQFZ=q<Qu>+w45|4MH6$@Bx#3l1U)!;#ZD>l^p(mL`I<3c~tqm{IJ8k&V zoN+1La?fVY1!FWOoboJ=9qm#acUY&eOEV0!CP=R%F77qBFwgT0=d5G&DsD_A@S#&* zL0IL$U-;e*Poj31_pS8cxJ4U6E89kh@=mvPW4^gCkiF9#L+4BgukCb{tJ0F*-xBlU z-m$0AHunnGbr;)~!BD)Rb(}!-zl**HXSp6wOW_Y)C$T;L%UTj?g)G7&{h)L;E+m>U z6tm(?)Px}CPx-<}oTE6H`Z>P2=MQk&xPFEqmB75@EB8iyCUJk~I{y(QA_KCD*Z}U! zQd9LKHGun-*STEaz5ug6m9c0g!23I)ML*91xGizRvk{8dz&JmY&T_k0FnpH+7FOyb zrg+J-zmW;%7eIc&&Tp#owlT~)5*`p<C1`&mgvLZ;Wi1LLq-)ui9pm4j@OIG%%NnS) z{$*LR##Jq9ppt#dou1RUdH7Lorj`dVPST}jl5ATkof&bm3@`j9Ff&OviT1hU(1*ur zQMDUVrg9cZlvGH>wjDm(HUe?Y=p256?i2G{dn=K*U?!RAz8h2Y7LiirUwBj^zoj&U zHwi~90H^yTOy09gw`=k&{x;n$H(}P&fygBzhZT#kH7T`nLTLyf)pFA*LI8gvy1pBL z9X1`hxuH`pq13*`Z{3NrP5a>{fPGqWU|eT|hsIyIf`toCZ;y!${<&OHDso?V1!*RL z-!bfiadeqQup*glf<&_c_m_(OR(lt|n#$b<mg1FjzOI9S{dNNO$sm(8klpbu(^i~O zS5}U!dDqZQ7g^H|5>RI-a~@c3k#dehte*tulVP<1K9wHx1nZCS99YE&B+Aj8j>E={ zI4chWjem4Jv?+pB#KGr<LOgE3kVl7~4d!Swg%W5yFQ|cCO?n*K7Jxd7q20EK57y97 z!8Dd4<ZLrb5oDZGY+oKz55@=zOkSE36?*OXgbgo_)=wMR?9BVC+ewU@^8z6532Wiy zr-_>^rV}|>ObfMzjrlx{>)Q>)bEGlg72w*^_api_&+TtgqmxFe7X30%S9mh;N3`&T z$(|cZlR-CC6bRQqS04tlU|V>!Sk$<pGfdAG<*zBPZY$NOUw6oeae8$a@h0iPU~L)f zdM$Q2HRy9B&{T#;1JUk-5gk`%3C*E#od83UaC3pxS9~!G2T`d7!#i<L1)DL64x2K- zJUsz_yZjfRR%k8YOtK$;JGg!TgUoiZ9&IKw|7u>}=8WS(=Kzu<@ffGKMSm`rJC}sA z3ZN&MI8E^&f&3oUKUwrMLW=Y7H0O6>98Qo0I6=@!l16kfg1Tb#(B@h2(w6Z8FVD}| zDmF)Jwwhq?A&|TRpx4Y&Y?QqK0p!)cIer-|C(3wjn-SOcuJyhko^_FZ-xUyG5)FdJ z4zlZ8FB@Zs=hX<K^A?V6DjG#4;WDpmkJZS(m^_r|Tb{i@@YekD*jr5g>lIgw?^m=) z*y@UNTvFp{I&9f&MwG?sUbGbx=L+37?nJ;+9WS&RP8uv88s(FXUjX@Me6{`eBv+@c z^t9sWaKPQhJuS`R{P*h61g@Vx3duK*p;QZwM_f1>GG%3%KWGWy1JctlB<JO3S@C#b zder`D|ATnN+<iH(N{mBIvtjs$<~F=h$7Lm!d2yvNjNi~d25mZo=eK<fPdav$nPTqO z51jX6@6SeH{N*H_87=OUNr##czfsM(7uU%O1Qqw$0$gYF>mmq}l|Pz+V=M6L<;RA! z0ZnNai4t0HntM@GYGqmYo2P;hhL>AXXE0%K;0)Jy@`b(OS$yd9-yx)K!hiR?13tM6 zLHQDu`Rp1~5Pdp7TGS!fRDp%Vl=2cm6NQ)isOKHK@w|Npd|daG69j1gU4OxSB?9+j z2ioz<2e#u(XJN3voV1IL(;fHW@cEyhZ~m7sa$G7UL^TflzoC0DEYo1>pv8*=x=EPn zx$B=idoi!DA;xbx&*O^3^Q9DJ9p6zQLOll5EtrK96Dd1}3Fto+F)y_BU4{rgtACgV zL-*s`ZP%}(oQve9Mnhq5r|T+Yjc0CQ|9qAE1$xAiPn6IA?$>CgHh}w;ub4u>eZeyR zFv2*+rPF+28y7XUT>|p=^4tiyH6T0}2zGtJ-tI3GC|rq;nB0<=_Qb(WlpeMZVc;Ra z{Nk{bv9VH`6ve$2X1yF`{Ro4K=>pcg#ihLdu`3C#UH{TGBv4WV_0Yd4S>8rk<!PYO zeT$ZEs6RCMB6dwY1$7y$rR9~f@wQSLC>30*RQ|P)PR!7O(XO}AU1#NdZ3}#tH9-)C zZwR*8H=wREL%0%p_BUOLxu!jsOfIrl8tP!NM1ZU9@h};m2BArW$YR9rC?0A8HC61( z)MQ^)(JiZ*K+QDoYmyPNe79n*<p#_e9hW^psJRg+Mbd~*jw9-+{>F;UWWY{UZLu&F zYEz~3EiruyzP$Id1nSFMbk3CFIx;wIiHt1NW9I#8Tx)6IVGj_*KN*6R8&LEIUyW=x zR37<&`=X$JyB%L8v&*2uHdZ%v>9MaZo`Yfkl8OludWoR@F@lB~VNnBp9K)`TPC+8L zYCXadKt*G1$CSp7IU4tjl2t#fkgISL4T83$qh!vDz><z|Lp?+<P~oheS_FXqKTiSk zQH2}ldMLIA^W0+B;qBYQ(2zZQb?A$Q&=k0^`gYdeOKql<xl4+MARbdUMzwl^24y1l zDa8eX2A{4&!;a0&yf4~GETO@XN#_DEI+sU?tc|R3Q!x!VjavF;Q4yrS7M!j`CZdh+ zYY&l`e{H`aH~n(@6uEf_0R5QPz(a)#o*1G6F)uR+2IM_1E&7^La9MJL>H|?dydfH= z&_a7Akj7XbUJ_ffMW?}4Em~}Ajg)N|;UrL~*Ly-{N%Kb&8vEPH12`L$-*@LvvGk|a zXfvftr_7szW&bz3=Fn-0W6aQ0GT7Qcptq6MA~DYEf<-dfN6Faw{D7XuM1=un#g@9e z#SU$+13r6oKqDJzFF+y-d*Y2z%mtPSI(Cpb{m`}$v{~kOq76iftovf?Ggthx(>6Ra zv}|;#Cn$G^Lx)~R8tsm7R(W%!RgL@Q_AST9X=FOKTwWow(`<lsPX|J0rZD5*7(nZ4 z)I}}lA?j3T)gs*EfX1pk)4trY>*$riLeOY%+J}kx`ttN;F-U0XXhN*rhOjaB{y}ft zk9SPHjJ}x{xjvbKN85wZR0mGQTzD($#3yXWur2;NRVII4Cs)6v#7k-|c(e1}c%=0J zUtej2Tgh?AF;8&!;M@wMu2SUR$nPAodhtQ^W3*$F@WY*-!0V<?#fxi<CvoWIX>|W| z2r3fOECuO$2a-4H5ToHhp^!G~=oKe`NzHWe-Z2X#uGNx#-?#;*4Lyjg)0*u5&=ej# z^Y@&SHsjAdZzn@}<-RK%+63;ijblGfz?7K0teu$fI^?(#rwG=6$<o8M$>L;acSmv0 z7hk6#Y!s;;Ei^AJ)@$Up9{l`)Z5VeJzYlX+xDqc!|I)&B*7y6~#FnXFa8EAxH*2me zBAO=rRp1^>#n&36_0Su^A<GQ5tH+qn1!z*sbDcO1LjE)L4*bklzUKj#l)$gs-a>!; z&0J#E<^34f+C_+%JMhJwzq)X}p8r)E^Rk|0t47{U-1FY;c@BwWcEjmhGBkkuxiquR z_Zz_d%2z->;Qln3#{Zq5{kbB6%VMY!jQoOWT`=(remKEut>+=OoyA%F7V*S&?#~TI zs6r4jv{g`w5I=?lSpPJE;KBex$t{3Ne#BH#^;YU!v=IU37p(kt{x)-q#LV-0hC$ZP z8>}I5Y}C-0Xl&G)RlZ#H+P^5TiAIWYG*GR+MF9A(3QwaqIEmKq1e!u)Fq0`?&5wXa zs2>fK0<Nu}(iJDEulah6ICmnhz!XSJptmU*hk>kdrpO#D-ZRiftIG&pT<PV<_NA<t zZn*{#SI=c&yZpDS6VpP#hs!@oBZ=2a_TG>p2-MqhJ!Wlv2wq}P64FZvLW$^FH8@HZ zI2s02I_M=G_UcZMU8nd3%u36aFa2WsmK50&zqR-GaFVWROAU5ziXD!Qts9tF$SsUK ztWkpaXA-bqoP*k5c$1^l@@}N}3IX>;S<{jhKW^^Ej}+J>xw%`9J*_bU_6slzYD{>_ z*bk3ty;n+Vv$pr7!q^ucA?0oXJt{1|0H{oAJMmgmm%=IMPL6!T*hY350p_=*!yMxY z+##Sp&G~RTrNxWGMx2<bt{!qryRn{hkrDE)9Z`a8*OHjDB;si1JWEec5cxtWpr#c6 z{@tc7j7Y@;^v2v4Ja%4r&|tnYuGg~<?9-yjv@t+kvt%-V{EU{MfVCUH>!sgDzLn8{ zL_nyR3+!n2L#-(uI3@a&F^>^55equ3KzCDs21doFv$}MNlm<g{CLEth0OUX$zhNq< z%zC(y-UfEN2s*VV5sYg<!rKMU1w+2d^icxfx~moRo)B1FJlVgy;!(JQ!!)ige{E?# z-HQKfphtGzm5Nx(I8-TFDv|C@jyUe>2qR#kr=xWOT#K>y>5B<OF0sTaQBH}h-d&wd zNcJ=#XsGV@z((5(FvL;_ygp11D$DcbHnW7gcgCPsz!QoR^?hv2hL^|l_dCL<bc^s1 z;~;yvRGEIXn6i}9x8$0y_T97<e$(Py$T{M}$iNhh#~Mb;#nekJ#I+f9Xlb((Xl_N2 z^;v6uik1dFHiGy=(|(N4Edz#YL3c|sXlb<F)oO#L(*X~Sjfx2t62;s-a|C;*pMx%1 zp6BXf@|7DmP2lfn>mhu*^NyV4Db;8*c6#lKaP73-3_0ZLxzu>qnFIKQ=DUdL+wgC@ zK7m2qB8axs^j5#u%eAW;$*ymIjs!TDzB$y*dT8HfL#&_1c4`^p8`o&(Y$3AZPhU<x z-<Tv&X(_ROMx2{!!Ax7c#(fnUYKrx?Wy2BiRD?8<am$9*I>Q#s7<+J5YFl_(&Ht_m zP2z#mU!@nR4t(Bo7-4!OQ!)rP_`~`O=uVy@!PKJe1LiFlaa@5TO}n^P(p++OOHBJ| zeH<5li+!#(gci3G?f<ET>SPouNe%xU{rKs9{g^jbkFX}Qe=(9^>;CE2uzTuR?&%cg z)i|VW#b5g0iMhBIci7yxLOX$;^hK`OF1O2E${W%hz*ju`;ZGD_pK7+x4?9P2L+T}Z zZ`~N{VXO6&q{p*=xZ+PRDy@%ahD>=xducH4XKF<Lbx+cVPWQ9)nwb9^CtHdQ;C?o( z)WE$4aKG}EkPEnfg23hfAZUNH1OXV|%L&|09{oIwV&Yat80W-JfWS}k7|fXDm62rD zS2HIWStHcpO&fJ@;}lt(1v9_67DgZf>@Vuc#NXmt7+jPae4MNYIMESx^$OekY>`GP z<>tR0?>8nI>!J1f%yT35FZEdy^&$0o_buCE9&8Oxpffy)=HNIi1oKO=>N8Z=M{TXY zl*NK;*I(kwOAsfEMVt#_F&!D#B`acFoQRUmH@@JG9R#bdl)=FLD}!+D9`nNxo`Eqi z1ZjhS^jDU2@z?4$lhhcwwo3Q))K6NiAsa2v1i7Z@vVP${p9xTQTIf(~q+5Ff5?US4 z+65Q)3C2xwGeqcBEZrtmrGZ}bDHWWNSv1WYgDx_jP4trQMQl4T<GKoSI<Zl+*Z?$S zS=Vr(c2Qi)ys(eSGuZ(b?(wXqcLFKwgB0=*B$GrWCS&1yg_J4mv(1xbWpu^edib%r zofMM!`R%`kpD5(=_lATYy=32~Z{I@ME<fj{Rb1;Jd$$b+dS7rQJy4OwzuaIZ>x<o; zgk?GaHJSLeF?xI8S;I4;YeA^x=2x%p%K`2$m2J4C4gZ5*qKOjN)o<<5V>bc&YP!ZP z6p~sSo-p=;j@=7I-PF%b?Cahhn}i`&rOjxLDX*nkaY|>diADQ6VsmgsCKlSjklTzW zE)?6(Z|deFyYMXpo7}T223-zdmyyh@9kC!R(MgWIYu8WnZ6L1}BCfT=V{F5iB*y&W z!%V=8M@}gNxGg^S>c3$oDEPsBDHzFUR?op3HsU*Ph9Ow?@7rsGp1@N!D^BmyNN|oR zu9N(ak0FT97tdq_rp50R=XmqsBIX?Rtf&npyOqrJH}z<+#U*dfHy1QvU`~r8qrL@j z@RAn~Gd;Im-7aBAONjkc@$<VdS;Egw8Sv&*am@O)Tpfb-|Eg9ATbm;=m)JjaBw`ES zcM`|ia>AqjEAaSqX?=P*`DVUb%s7<!UOikt(5FHl>p8qmfc->Li&uwDcx$$JFhVZ< zS`9k1c01wkv~umDI9AhKX%>5bBkl#5BOEVZ8$vL)JWmoHJMP_;hRslX{YBzB%=mQZ zk=cjmtAk$-*>H5aI2nZD!QN&KcC@Y^=(yCrMa+A?eSGcQWyg*V%=Oq-sLBwfm&!9U z7@aMSrE^6hjUQFffJrBzwT-*^ZB}?~E62TB?o%|JT-#=Xh;ZFZv@@kwVDvP?a@x%> z*$l)8%S@dN``%VFk{LuUrB>oQ+^2BO^oy|i&#g%!A=x<2n315-c#P*5*VrQqAW4#3 zdQZa`R(5?`2;j5r#*cdM!>IzqDb;K<Hh&DUfw`JB;#gC06~6J;O^+jGwBVr~AJ1u6 zQHlr$kI!T0Pe-6VI(7MV-9fVJ?<c#yEy67ge&`kmD(>L~X}CP38|9bsN~5mKF-iQb zsnZ%7evy<mF^d4fqs0WH#*7|)KT%yPzpXTCBT|NbjGFo}PUiG#h3i7&xc~Iu!>j4W z|2=nza+Nnfbn=_=Ui&Ear%%9`SOl4iJ+_JF8}J;7q{;#7FX^P+8^=BW?UxXs{qvs* zA}lShl?n5RwkaoCA7-C86oZOh?`H4WhM(Tmi=a+sKe?1q3Fln>%l&h2V*mKl&`0x= zb7W>2)i@xff^2Wg^UKWV`L3g6?SCY37|;3Tv+v(#_250)U%;4@FJnF#YVBEEYJ%U~ zhgaKf#PilIH6fm8FAd;+@l~-SK8GeU?F&!yrGy4>zZ9)i;hhF>zw%1X2HgKCw~3!c zeQ$o0t2x02FF^d;d35tSSBP?oIKipXB#&`U7N>cP^150f*CeA_`LB0AO`PO8_(?5* z{8nBIV7~zSi$i#I@Uwn`tP=sw_bptDbL#T-ddt5a`8OsS>!J1f%yYB%FZEe#>nC+B z_ATuMKi=TIh^?NJaQaSX1=Osc#x{4(#e!=$x3(5bpC$-BN<deNAap}uknMSM&DAU2 zW>RExh#6ZE*STmsVMScBaPxxq)WUdz;A$@XrY?c|HDtVZ#6xhp&%o?CQSs&}HdN+Y zZo-_o710b<O*Q4vadF#70}f-v$AbnOWQknuWx*ru#8k{lmN|JF!dvZexZ;&BS0xlz zOgp*Qeh2=k`yGmk;UsAPZILl(61g{*Rcup10yKwdpmTx?|1`N+Awvt(*heD(XTk$D z&y@%oGW0`bAPCTaNJ@tgfhRj>X3>4}B0zxuW(mar_k~WPCNsY7XvG_=EU7FyHSBtR zgOV}G%#8+<q=JDqM1nM^)kY>EIjm7kKcZ{Kqxz1`qJBlnd0iriEs^1p7lUO9!OiSv z=>cIly0{rrD~tAf$y&2FG(=;e7{W0VzJD@BR^yc$n6k>(h?G|YcD)w&?oJd0fVL(R z1bWWF5M5^2%G^L+ok>z_<p!o5e#s1vnB$eP|GEf*5*s2b$CK50ZnWP{Zt^~`CkCyi zw9TOP*2j#W#ulezh(w}zd!GhZ^cDsztd?1L+)1Rh1oW#BC98QjM&>$xBDf=I%!g8# z<Pi~Q|3;`u4K#7GaC0|VRmq&cI(R|`47nw;;3wF(FV4;K^(p&X4cOZjgH;9y)g3V6 z^o*8(<H81otL3Vv--4lfAIULGW#PAy>A557g(*t#8a-?k8)7v0{QV1iihWJd`1#t5 zq8U{ou@1BF;GjagErn)tgx)5q_stSZXleVbMJ%B~h||F^``gzh;s_}8-DJ{f(caer z&nn<@71X*Wi;cP$U=AfP`}!d3F0<XF@!s8J2e%gXGMJ<>-8j7~oSG#8*d@;)F81NK z6IbN46wi2?A{oPT7cDsJF1;VVt;c}f?Zp8S*Hn0kH%jSSq6r-yKCZburY&XN;j|)p zb?4I0HD~*D2-D{#5xn#*wkAU3#=2-gfYRGr9Z-{5-`kYiQ&_$9DFVcAoeM+d4I#{q zK1eSe-cWIWpJu&;CIa>K4wA?4@X>=?ErdNJo6&F{<Kw#bJogj=B)%yW#Gcws?sMq( zo#md|DeghYTTfn{Zi?%lA$pU0t>ZR4W#7H}an|4K(PnIcI1*&wADzj)mYY@B4RrIP zt`S_NzlbmF{-k21+C3h^O<y|&&6!1GSPj2d)NkXSOCQ<wRr2?>k`^5Xjbn)NU$!8= zr&Gep-I&5`bP92<k!6PFv>nz&?tUsW?yNR|xF&^O!&V}_vad5pS{K5`Z8&1=%Y3zB z*Ea@7aL<{CFt6Ey|7Y%I%2oX0(QOtFZq=Vdcj64cYZliw{g!Pw$^E7$oO@Xxxp8pC z6ik5j-~EMG0eYG}Pp17anf7yq?x9vVze63*aBk)>VElpYc;fK#e83q@ppEk+=UkND zt!b3)7W034%h(b@u-QkiRBos=G@{Uu0FC=BLGGV<c|Fb}S18oK+%<m^w+wx^WKY_; z^38SsoOA;oa_>cm^UPdft3HMgTaKVJelk~-y1SpEu}FX*{b_SAhAmw<ZtlUfcKsRl zS1VGqms;5aSS?$v{=SN&W_sVtWr^1S?w6&$%DvnG?pIE?ODSgp_vvsO-$n=*st7z^ zlB1T-0sy|7;C%t&7l3d9&=-vQ;_y&s>lq47GS*YJM&7llfyP9mHtVGprE2sqwOA{) zD^or6E!PD{vCn%B9o{pr1P5zZnVUeeV!*YVKpl-D%FsY9w3)cxMXv}gG@Q7|O^fV{ z#WIRgRuo_Jb!2EK<8ycdM*rYtSEh0j4QtvlneM}EAh+yoRy}%?zm$_)O~#SiPJGrK z_#)l@Rtn^JFz!Wnbc|r)MPNXRj6Gg1B3~p}e?X;^tvg`|u#X#NEeSWY@xW!{5xEJd z$mpM@w}~hX1VY>}bMu(uF(y1yWC3`-hn{P;4bQ-NY>W%}a&xKQc*O$uMM>RPcH%-8 zeZZ-NuMQsS>>D}7YQ;yu{*wgmH$w3mSTvX!rNNByz?BG%xgKNP2m_m1{5Ep1kGP$S z;u;$Hq-lin^aTk6p5ob_ir4z)dP6Wc-@k`o4t-(3f`RPl?KJMQMJ5poE_(kG?AS?; z15tWa5<q=7f%*}J7=lAlJsvqp_PInR5N-3+PrprvyLPPwJ=eMh2Inn!@{*^Fep4K` zZ6i>~+69Rq18to2BOGIt3W=lvQ(lRz>IsYmHfK9gN|%*Nr<;J}>wA+hN-2!Y>2Pu` zg}KPuzFZDaatr?^u4+%C&At|hI!4gxvB@+>2u|8e;pT1wuIMOzj-ch7xHA!fos5^7 z<XXMv)8*0lc04p}&ljbl&*Ze3iV9Fh;;r<0(`Qqo!=8qVKz*sgMq0vi&9tAOVq(2Q zG=vmJP=12El>+ByQ-uJ&_7Je|?XfGuuAD88V(-=Be7D##<ccqtmB-!~LYzi9nc<Fp zJ+`%EH<%Y5PtMI~aBN1*0keauu532o+8+6yPlUIIr_LELEE-vv;oaMG=yq0r9#m}K zk|OEEk58E~D*nJSf>F|<>BcQIV9yUi)Y1siLRRd7(aLz%HPC}id%FV~lMcfd2>M*r zMlwX+w3ni;oDMS#b|Vr^M)<Ar*0t)rPchQFl|CGYibpz34@H+i{r*S{4x=7c2iJyp zMCoZDY)}UHT5F9=O~ROKLSx)hJI_6})7(=VqKGRO3<YC%*w_J|p&fIER!o{&agkny zhjlAGX~-$tdbSx$Fpk*SX-vAS->=HiO{L;==@R%8%Mb8x`##Hc>*DKdwOs9<81DGq zc^IBw^yIt1u75Sj3M|Xa>#N_%_FJXbVZ!3ZyxP6yv08XiPI11*_3{z_;KFl*!MG;g z?r1mO{bP<X^iC`%gqtLM>+l?cnmGE5+vx!>_ji+|b>fuc7OwBeGYXKCf37&U`iJn& zv;P~j+N}id-y&9{b46Xa?;x}OA@dyeYA4W@x&ZAZ&jTr~1tZPZ<2fE@49>i16#MWp zXg?jn`QN2i!91Y-rL?7#7Cq;hVg5GR_r+R8iwS9ZMN-p{Djiu|Z%<yOL-2Yv=6l2N z8RdP`Y3bQm#eJAK&mp$yQK=bT){~t6<(kk09yt9~s8cKFEK4#geU6ZQ|2y$J@p53L zCkKfb#NTjT#Fg>qmCmxN>BV(UMCfUL-qe8!QxDErJ8_2h>LG~s(g5zuuc_;TXQ2un zmH$GHm<`~54#lkZ?FMka@-?so-2eBVKZS1+w7=d!^vaibW91-clCiN$+$c@C8fZ*3 z%GKcJdB4%WY@WJSqNMfKw>Sv8y@?Bs+r4MeOy&@6T;4~&61r-nK~~|&;zC`v1+|8L z8XCx^fkvCjrj^p}#npC#w|8JVnC80m^1`)+n@+pcuR(PQY+hRG>-(0Rb|MxG|JT0X z#T?nDDj8gK2f3S|`x9hU_9(zyV<$t_6$IzDaIsx%ktI}Q*k!s28kk3U9p!bH-XS8q z_K|%jz#~N9ezD<hvJ<(&bLgbYTKlPqVqdST_{9MC6E-7;ZfJvFuMALsNm0Uc#+b1e zFDS4%wv^^(Js*mD(7s?Wvl5I`iatcWOc;CcJQ>lKLM?wA-4UCED>6Z_FK}kcf@g<w z8)z++r*SS$0|tWY?%zd^J7)Qt&1RpMK<p&qRtJLYpOp^LgoH;<u+LYB@wbqCW_lIb z>C~XpD!huQ$aa?E0Z8-)q$W;f(V!{KQ7MHqy%ed)hMY=C`0-f{M*Yk4jY9bp`~0dF z18(ZCpKrOh#;tg1Z1Hc@Y1H7|TYN}LM*PIJ$jq(cD8GvyHQEy)I8q@<oJ*AIVtTbM zlSw^+sX82)OjNW^R_ELJt&9eW0ZIxc=mQ-ZbUVTrnm6M0iA2@<3S~;GY$`W(8gNxt z`Tayof}Y8u^DDfo<danNh!<1ccq?GV3vN9E%1$HmWxepMm^M=|u?j~JUR3&QT8=R( zGN4DGBjBjg!4u^CUU;^cCA;zpCiY6_3~cXhMzF65QI4&(6l!_CtAw7KJW*VDV{lDU zH+1N6b@w88KNQ#D;;aEjr{#N9&}&q<rALqLE&2NyF?W0Xj1Duxb%R3TeS0LhEX5fW zm78_3eanjjRvaf|?&`2@e=ppwwLr_&@s@sD>FvOOY7+B7`SbCmce9<lnr$$&+2C$7 zUw$lryYoj!5g;&oGY7j#PoTaD8m@yx3Dgg=k1i!_^gg8&oz(j~OM7Zo8mo_)S_sg0 zVS*$jN`+czGfh)LOr4)XV3T<I_*2(wnC#q(M_LY)RgLCY8t;5;5Y8tC=om5y%}z7Y z?=sP|abW_46&Y)}#$kyOY)!9MSpuCRV=guecYKk_Ki6Ksb-sSw_EhoXZPYH|+qcgn zppB!)xRv1j+;dVj$$91-x8j`S$|9+<w+{OTaL2iSA~X4R{Q2C$HQ@al&3+uvPoZBm z2wQw)Mdm*1P8@H!5sy3ft+=n$k0sE)ilF@qpAD1!J~z{TwmkJD8|XdafbkK|6}Y~X zxQSj%u1a98Gk~zB{4rk`dZ_6|;Z0TFg6EM!VC-81!?^qOSF(v(v3qB<H{vVvyAbF1 z;{%Rq99F#mUD8vr{FF#o5R}C94n!m;0{SKdxQ6cL?^(Sale$H3(@NyCUTKK&s8Cy3 zFWG7<-!yLWy@_Pxydq*XfcuK5QTap~!2M;N`u%=<;R|2D4}bVWjE;_?ySp3r-+w>; z^iTg3tM&BV?|v8Jc<#C9aOIU(;xnK53?6*&!R5p<t^{yjbKQR2^w*!yxZAj_7Y)?H zM@+rwsv+m11{xEMMoW;Zfkyu#S5u96LIazrZ`nyeV-FXHIzrQMhNod6P|6UQu9_A8 zMrd)l7SuLE*&1a~Rs&)IC}bp4eA0?JV;jP*PFz3!vr7y=%I3A%QcH4ic}}w%(-AUe zkwNJSJ&l-B*_r0*MK^`|76Iq|?!G_5TgK*kDbl*gc_%@@j_5c{1Qv9i3&1=uvo3N} zI#ap8efRz@jCQJ#<mQ2*frb@ljazU`Q+w`U6)k5K6YC-y*1_;F*|dt=B+3*~1s&d^ z%ihzgShH&V+h{j|zE_0Een-Y`Ptc6-o+2xt!c8_)PxWx!YSy6NrXh>9ibom-f~q7k zTI;yctJM%rNf+n>Y)-B=dM8O^#%IRU7vluCW;gzj$dZ5WE-hMQf}@HBH5H>%!Pfet z(|SdLUzz!f&G0=g9eQmlG?`K`>*G+XO9L>eQfeHXG~?w<VD-#=l)ApP$AG=<`N48Z z<yB5PuMFAn=JX<PK|nP>evJyrxF1hhb|Ye3292%GqnmwOe<DmEe-H)&`N6;Uazjdh z_yal|pGsoDn;VQ!Za$6omD4~a`xND*tlgAu>@Z+|w=(@iPdoyb|6GxURl}WjVj$jx z*S#hj^JxjVscfj_He=Uo(QntHO91t4QRoSdsz&ff4H%k}aAGzIZ?yV-UoTm`Q`=e) z($^MXe@XYXKHpuEvz)VQCX91$@q1xa*x}GY*g_7K!Gte7MI7!=Wi|8^UXp%zTCKPd zm6)Ht{|c2X&rqw1T=Gx3eTzF_#QAv%N2b=!Tefw(;NDr<x{PDcgZU{h0%Sl>ka4+~ z;IbIuXtyKOVWHtnc7}9`4F8(rlNg_`?)q4>)r3$qhES~feUn)yp{3OZbrWT97!Xs) zsAx0vDaEwEM%=<0sFgO8q9;Aqpd050X9{qe7cNsR$GFYv!8`3|@THv}D@)9~o}WO^ z!)L+C6*R2|sP3~O;#}MJ=gUOJMTn?Xi;MaZuF&M}2ZQv0H5pxG^B3u@-3w6R&WUZf z>Lr<gZ?X|YJDr$za=j?6M*FcT#B5~VfBQUq+9-Mr+h|&!pNJr3Ie^zq+w&Dqk!QCH z@IIOM$E3aZSKl?b*)oG&nlZE`2B4wQ|56b9X>Qvt3^;b;W&2Ko{VTWbEI|AB{MD=U z0vf?U384KYnZ?<VFp?!dhNLRLzBAt`=6YfNBK2dc^%_i5NBP2?-g7uiLy2mJh^Cp| zIjwNSFIF?#lJYv!buYf&acfEM*6K@FM#f+czR9&u8x4+HF`T4FHd}YCidz$M=}9zp zt@mZbWAxswP-p=66;h<q$*cyXE1iD5q$ijV4<9~^mtJ}acinXt?!NnO{NyJ;SvU?J zJcwtXeU_cb;$qK#{KtRb!yo=IKK}8K<K~-h#t(k*gN1ni@-P2_k9}<I#7hA8gMaaV z;x4As2=%9dTKR~nKh14kiA9@fSO{+3`Y)#BjsB$=Z8hRH`W9eY%!A&@4B9UN`t9Kf zm_lnegBq<R+k#p{E1O*d39?OxjGge%rLJ(RJ5JV~3x<}<3yZ7Ar1wp~hW%rYLY*vb z5qPufIam4PY6qlLZL@gfl0EbO+Qs_Jr@+fwK8i<OSFF6*_?1-yhvHteMHa^}Ym5N? z6K)vB>%Wa;7Pb&@KjAWC@R}9`=r&sEprU7lBj#;5PXn4pP+9|N+(iRRM`Vf&^u;09 zh1=+#8G5sN$yhxODJ``U=~=m8erIF^ngkiV3Cexqj2h#?%4~QkA#WwpAT}R|diCgc z#>v)O{2W1*(qPzQ#E%DJISn5UcInA7Us(EJkZkFU*U@Z%iNJTWt~B8L>YP$Z6`nk2 z#&8+HvdlD%WY6ziU^!N!*^+{do<%g8wXCR_@04;q<Fn$CGs>sCB+EV9b?9m$sJ#Y5 zlI`l53npA3)9+IF&|V$v<^WEoTJS1a$%<L0GY~q^nu-(1ABUBoeluABbv)}*Q5usI z{8}WiKb0a=U_g)YKpLaIWL4Psw-B(~VrH8&s$kKlX<U=S>*H!1pHb%TWJ%8(=`0s0 zxsl4ObXl$=tM)aQShdSddv|b3HuHYAyb>w{#*@uB9kMU5@z2CKfGHg0wwW%Agxj_z z5shkbVn&5C^UHmeQX*LikQG4v4mvYxu|yRc6XnPkic1)w=ZRAU>rX4lbS@|Fr8u1~ z0%Er}BV?AAZq?+u9_G7BD9$wzz`0Y(0ZdlQbak5nS9b<E7hRl(d%{K<T&58wAiNU6 zrqklVePZrg9RrwLeT$dnobpQ;^QJK9iz80pYqsDt8<4ubmzaj~`#nQ634MeHrew+o z&(Tm6k#GXuPz3ShqP|VkPivbUDRw{s_IGlFb6|b}v@17$vGF8=McbTK7@IBdwU`js zE`DI>*-muqtF-<o(&0G5fhhbePk`l9GU%CqC-tHtVBh1cj7Q4N(x)g{FPl9rCEH9- z(hFB?o<Q&}c-5t?z3JJ<XwS`JWO`$*hl+M4Jmvjm%hUMhJ-^QV7x~^#GTZ3&XT7-c zYbT)^^FwXcLVLdx!LASl2w!%Pv<R8_4XT?YTt9z5m!z@QVC3A2q%-#d$g7U~&Tqrk zW6L1+6_GQ3B%1B;aJ(Khg%HnR)xUDa0>jYE0(k#BZ}-Bj4WQq+i_H7^Ws~&1c*Axb zJ>h0I3d_j4tjoIyC_i-mU+6J8b55b+_|}gJ+io1UZ^!HAPUcZW9h4|hD?$7Be&JQh zQX12KiP@I?TIT#kLk9kfmR<BpZONJ5ee)-9<G|N*KHsbl#+wh~EB)`;FvV}?{_;-$ z>ja;#^ztFvi_vI-R%%65*M?bLGlsN|4O8xN3t~&faE0d=h$j}kpOl;4()$hI{*oqY z?A!qEFILERzVjV?=tCdE=Rf~>{Mn!V+2vaL+~+=rFMjch`2P35kN3X!y_lVy#hyKT z@a}iN8(;g{*B0WXIEi`JyWWN4$B$!ZXb4)m7|IL{;C`ky>hD^~kC^%^eM90>G$7hc zF&l!V<k5I%V`!k!zif<ptX3%+eM@#tyZF&}z(0tsWJ72rBb$L>{zhm3_Zw|sr3TJ) zy_*aTx2?Rn>Q}ZgsXZRRuM9tmX7`(`VmE$nRt;n>*00vVNZZ@+P|v$o-){WQqk)?e ze)N*TdkOsP2$2=@tyxI3wF!*OQ<SWa@&Wf}ukFEjn~G)6+z82<Oz}6#<o*lO7EBVn z-w2h{!0uESd!p0asv@iU0`)wBBMTc_;w(TUqHdS3L%J3`u5ZsNP_}U>XXJH$a5&~h zE180lX$>AfL-0&s<AeA2x9G5^Jq?>du&QPJ-O{rK#Kx&gB5N19^%o8;5<DlMUD#BO z@;b&1-i}lNRvIk{&~rK^;ry%tKOZU`yqLKuxYQ&ZWEgHSYG5Ze#;ONF@+pG)lVr4y zawAwxfD?~|nvAbJ$I1MbQX$6Qf)qHyBbrEKHk>LNcxcya&}GrUWhR3@^ET^JFzV>O zUX_4Kt-Nv4Qh8UOV+jKuJ^=)Bcr{oZzu4a&*r%n3fWn*f#im<M{8&PZr_K@(5L^bN z-`=Okj#fY7k^|pD%R=%>uhTgRK4|5!Cpt-Eo?;ne+5VC`_`@2w!!!W$r*LX6KTsi4 zN20ws^aSMV)NJdb&7~K>`6jk^?LwQ&ot7tP!DD9=2v!K(m?>wyU1#f4>a7g5An!Hp z23*%uKJ&hoQ;0oW=h2Y$Q;86O6CoPWgdrhJW1ld`p&-YCAU&-3;u?4pDtP#No?VHD z<Aa<~sLdD&5`9~r7QN1ubNdK^?&oHVcylUNGSFC}CEZq=4m}PPTCB0EvVkw@X2x&E zk#Q9P#LNBf(z9xvo5}8N-PH=O82IZT$eHin_1pw3?kK+hp8h&0QEm}kBR-rvSK1n_ z)xa?_lD}PvzpvYRC73wpdh{Hjh)MDNQMu4&*5RJrVQAHrpZ72IEiu?J?bj2ipT-b@ z`jJaO`9h`ayJ;)@^iELepyPZ~&q=i3S{h(i$k#Lz!U&B#VhYVmMB8ySTcK*Pz$+%@ zMFb7okePsfHG%x95c}sq3;_cAee^saH;7i)+e+e&HY+?d7N~TP)2CEghDQ4JrGZl0 zOh?iWXTl3Jf%@8no8QvYmkX{@n=#sS8%8y`0lJqX=eV$wN#1*U3iCmkEbckdsioV$ z={yhjmK}JCjO@jR-q|Q_|Hf%(-<(=_RrjuDME9k*-je$}Z*?AN6OG4>egdcEd3jaQ z)Zl#R<mzNDGw$0BcD(PcUbLUfQ%5u$^L5%V=13r%=6Fe>nuJG<2<N=Mi+;2nbV1u3 z#DTNS#veqSUL3!BX8?1OpWywST(il)cB0kVan61SvzpQjA;eztoTl*D@NUm(+%Wt@ z%vyKhynP2=Bv{|4DSfOHO6{GA;?N`KxE_{9+(yqUc0EFN9RfUi>49L5*OT;4v=o*= z`ygn)T&De{G%I~xn!gwf%R1KR`!H<TgK>>DYxW<QdIkGOzMu8kX1qCX-;4jb<G--z zl{XBjhJLRNorfm)7Pkr3{%wo)lG#>-JZi2jYb1JwCnNu?z8NDLTBUEoV4=RQbpITQ zgz`ph4d8x_HmC-0f3ae|^rbK1%U}L7o_XdOY}vBqa%~+wdK6b*ef4EP|3eQwgin9^ z(|GQ==WyuIq08~U_r34o{qKK2e)OXs;of`iy?kF>G=Tdn)KPaoO8tnbyMi_ZR!jq; z%_zMgsF-k#glb9yjsB&ks-xzGY4k1fs;D&)!gaoj==WVfGlBfNsJw+Kd8yY=tbE|w z`YA<2QYADn>ADgBYs-5JCY5hYy4`mUw+%i5iHq}%u(>smt8ejJw&1UKeTpFLjj^a$ z&04-D8N&A9#T5W{V_XYUgqz0RBuoVHFEH^}7Kc!gB4-2c$GCw$cs1EDE5Ne9Pzbu> z{i(4ZUI8X<gu2o|zHz7)3$laEH~YhbAQBwkIiZDzOmQ16bda_7hE6qFZ3M5VR{~a2 z{98L==)xH_(eXuw?dce{62NbZdypbf{`jPXm&aD7FDJ=tn}TxQQ!38RCJDE0NkUT5 zdw@E_n4!!Jgl7t20Fma#d6Ioul12}yOXt{vL4<0-Fe1*4JOekwyQ2ifQKw5GO<?LX z7YGXV$lugodbiNoOpx4z1PmAz@@`Nlze3Ob5d)q$tLER|@+ROer-Zj{6D))pJZavA z$>^ePD!EQ~I5vmo=y)M<3qDU0%pW1RAw<xyq#+wDZDO=UFRSUwUQ2_SG|wsp+L|z& zIWnflYm>|Erl4?}Ai{e0DH}<}2gt5@eQ){TeH#h0wt7!pG7PMahLRlLj+=JijN6Q3 zlL^dc^e?L=$kk@VEc9v`FzoN7XBf?L|Frsjfx#W~SU3)1h4InqcuT)q3B=vjL<VPj za>0m70W$5Sq>DPw290=qR6`)~`t~6$Ruk0MbR#a@0o6&!H{U(<`Yd*SkASZ6MPsn^ z7CWB(^nP66-&4H?=S4TpUt9)v<|~IuC!w8;?eR_rf;7T(oSDJESZ%FA?QrOE`;KCb z_41W^?K5Ez^VTq#b?Koetz8E2t&N%e&bFN$aCh6XKdjNaW-|B(j*h`ikbEhj#b$!t zWkG^#4Zb26|K;YDBFNGfqDk^4K!23RqW)lnUI&&9kcHO|Bf<K<7BiAn?342KDRRr# zh_|^kAh*rzCNSR`or9E^M>0NBkPTgcE$1A!;=I&cmO`6GeHgzugK#|e{Hd%As`T<! zLku787{FJy6wjL7O)Jv7|NNIoyJ>EE9mmDn2!5CAu}`BxoHj$_hFJvpPj1lCTj{yr z34U>|UDptM0oIfmzk0ME)`{hQ?{eB2e!n{HnAA&{ipLQeWB+*GhlpowpKfY4qU%@K zXQvF<d6c9MoD3&9=70Mxg7?Y1zs0zN>mT{+UQJouj)OQ$mToy=XM76I@F>#JQMTh4 zqPClG%+Mp}RYl^MV`;qWkqfXtF(5BJn;vO``PDQeOG|NF_-q(KskX=yaup=kw~>f1 z>3c9@*-Iey+BwRvjz5F#<3G-oY{C0Ut+fO)g@VaeJwm{;6@Rnq6C^;Xe<C8`k)_A` zDv49vIrS*o%WB|$w#X9y)>GOh_;pUq(|BhhhY?7&ckA(<L{g;dJ<qQ&kW;c84dA|# z+Eg&D25>*WGXLgp{sw>W2Y-OCfBozD=tn<_Pk!=~_{V?zM}$Hly6#xE<{KOwTmbwF z1AssL!#`Y+Xal&vLLGJYL+(dR-4(1MaK$tr+Ds)k1S=+ZBjKuRpwYinUFCJ1VWV#; zt@^s-J{<54;L4eoU<wYEmPj4Gl?z;3hec_KT!scbwmtYCJ3lTfg+gPJIhDYN$DTsp z)U!;l4iUt%w9trDNCVmWmbhfcSNHuM-TqddO{|c7_4<4-*{Ao0F60CysnY~!k_prt zO2I-Prg1h1-BkHtsB-k>-_-_pr%AvFAw_w_d2qvBqN{nWIJl{uoOVOM#Ii#?&Ghv> znB*Sbl81qE^3V2eoQt<VG4^8Z)=;+CjeE7GfkNX@t;s9oX(t2Dq2L)Z;7It^G1Z1) zuoi6P{Y`O5(%Qc!6+K!E>O1f%!R1PXEp&&zjUaw)D2$`S37nXf4+6}$DX4^O`O-Mh zrY9&>Y=p1f*v|LfnrCE+ix4F0RhuxWHR2or55+QT>DUk79-DzZGM&-Cs&Hb`f)_@z zY^<*lqPQE)MhW-ti9(wPj9OfZ#m9CBj5t0mk)?iR8+DM0{)78yut3=^7`Nhx){JWP zEy9@R>hKV~NvxEq_|jGH4S(27_WdM$74pzfy^<)C(|YzP%9NnCQrX{Pz`;I$M!!^= zd_D09TqI?vMo4jtJ7?PgI>J~8Dtcv^^qX*UT1{i9wf$+fHq${??%Qb8WjE$wBh6A6 z55e%KXC$1Qiy}dgs0e~ld@GqZdu=JSJEAlKP~IRbizqp7xkCoLF(%<c7G30gsX`B$ zOa>UP?M76hg;O1cY-7@OXT7-c+h?G@u*j&WCRj_?ZbjtGEL61M8vF2GJaM?Aj!L;w zRNL8E435sNyqWQ<(`ki?VEy^lwd)B@V}4vXQ@&xGnMMJvdlq#V9-hafd!-kQ3~>rx zUejvCb$tXIDj0+@%<!Cq6LX7RII{IEa<UWP@yP!AY%3Dk?xmAc7@aAsTk-eb)Wr7E zWJah-PeSMQ>jx~sIAZjGv|ch~>r>>kl}4P+s{uJ}Mtsvq{#Qy;Qq+1Qj&WVCoS-8) zg6_gBhR1UQKFdkJ8t?wswxjsw?gxryX>akyasOYu0<D3ot@l_FHOrh&>UHoLqZpOO ziY}g(YY+qBGvuVmKF_oUba?->O=yZ{0Ta_u;JIN9Mn~kcLht%yKT>)>wuEhHKC$Rg zK!EqZ`;HK%BsaF3_8`G^qCz2Uz6!6=P=9q0D=OP!6KINzBNZLVYILG9?ZzvXD_6g& z`0qPknnK@q&H(NRB6l0$xtbmsIn9@XT1Wvkw7xX7v{6*M>B)44M*8C!Mhop)g7zZ> z?aMd7P`m&|CMakAk~Z&Wz3p6+@~4L%L-+LaYwqX1!S6KZwfJfG+hI;b@!-k7%^kH4 zo<xl8_`BVofm@@m18H-MD9A;w4xB)eeM+Gq+KU|E{_1oVS^1lhprM$TUN$GS&INC; zR<6Za(oq;wQRtIl=(t9w=2^}ADjMx1>B%q6zGa?<Kj&l`{;bZs8ozJxyogw=_`Y1O zYz^SPTuoIuUIVzFTj9ZA5Z7FD4ZL12PM$mor_+fC9(Vvh{pn93o@EA~&j-8Rjz9k6 zKgJio_{Gde4aWTy+Ni%Daz0|}uT%|*E2#m|W*Wf#N@{rHq}}LWHcnkuqa=;KrF<>F zXXXg59(#;TA*FB7lrM!cDI^K<5pMHZ=3md6U^Z}V)`*Rp8&(5hQ#by0_ooq1XIWIu zQfj$l($(Q9+%xbU7{irYJjfzm<5rDmV0GV;CY$Xedp?UdOzkxyVf~6B7^n{fFJyHc znypkC0*S0q4Z4n#0c*Oltba@SN4f~8*y6yPm5fL-7=OhAtVL&nlq6fUI*q8Na*X6* zT?-!5H`?J+UDe}R?l@FyWjh?7M{{Hhv4ja<do#hm;aZbWo;)st28VjJXtRdM9-rlJ zmHqv!t^?2N9E6EihS|1@8^z}NB!)-lA($--g#bxal4NM(R?Nb=P<*AHAMQ0^cWVh? zRC*_fFM#w7m=Pd-wUM$br^`N$BiFJmsx!WI=KNNC?{rkDqF+v@-=@P|yQ=?9H65^! zDIPglo`3a#8agdE#dXbilm;duRI_g}u>*K}Y!Zgp>}6f8+Xeq-Q~YL(vYiE0dU(`2 zxVT|yPx{$LmgfyB!M;Cfz$;_Lw-YA;7DPgjk-SU;mUUCo%8caz4OYI<_*F;)S2h#8 zzomR*(_Nui7$XyfvMcL(ihnbM_T6wp!dv4e>}d}}uU!Vugkw6KozdgyR2&gOmCumb zX7prOzO`3}ZOzMnU!@2XPiQgfHNasMtoky+TBT%E#5>-I9!Ex4{u%)63$ZN*3AStd z5z*J5hpo&pY1eoNH$HqG(i?QSa4D$!ZD{??8#0*V)BpfL07*naRG@3NV(i~uM)G9> z+6Z7w9B9WAzqSX{HUUSgzhFHvjiIS!0H&F&yzLzh#5(N=at@j=*u7Cq9vdy0eYv~E zj>PU(0;`wXi_ITHVsKs-NIaWtxAkx?*j`@W=B3x5A%gW!%_ZSo<=G>%Z^@Q_wtGfN z3&&0Ub!W`7x-5=C4+aJnft*XvtOgw%O%~{yj0p3H&``4x7B!IBr!;iZ(108b6lybD z$*}L5e_Bpb3vo2`3$~geU1i!wQ1o8eY2=F7G#AFisd0p2%k!~Zack-RJ@y%>cJ<;# zOK}Daj&KqW{^e`X5_FpQ6(hax6(~1B^9hp%GkOo)s?t2v2rqS$kx>Ma*~hg0cq`ud zBLdAMN$8e{Su&J;Dq_WvH&^!A8IQAGwjOAK{g%bK^i>lk=*Jd~`%;__e2?J$ah)66 zjJwygt89r$x-Pt7zkzYp*iL5srtmNlv2j^z>pHG)9kJhpPzBh{_YDPb!#7St75BsY zP7S8|y<8KQXW*|(O3)|7+ED@#u5Hv)kUM|T8n)vl+krJj``v+u(K`Ryn){hI()30- z<-8t0?mUe1`lic|etYnT=$L)+^6z@ONJuvP^WNXZu%rw@%6gT3Hw|VSz9V#`u@Xm{ zOCHf)N&)WYO0Ssv)%Lt0SGI$`H;{;s+^d420o<>ka?44&0o>27J<(AJkp7cTK8f#t z|N9HqBIccU-igzvPh)g+bj^!uwHhD$*vIg%|N5^ho;4WvSE!@zeiZtMsk;I-1g^LS zM4M><_baaE4Us{kf7uY#ShYel`W9tWZ6hG)gX2G6U=3H%`n%pjOy7c&t+(N^mIGvg z)8YfuuVer4ch?kSHMn+7gvN~xt%11Ig#W$ocQ8SgQMsX*F-c8O(g&wr!d|+tRFk=& z5jKwoR`)Hh_k9SDus>=9Wi%i_s|P~^WZswmcO}^PTRdvCzcCI~q%b2<v67}N2F&kj z!CbQzVQq2gS8D;*t?$IsI#;npYs9ZH4HPpD)tKmbkbk#oGWUdICVc&9fz8z#6Mlz7 z!gbw%-4M#kiY)q=Am^XY(KyD>4YFDanQcbL&3q#_x;4U`csPa_j|jbgctcSdRVX*- zzjwP1olSWF>vY?mB12Y;ApJ0}eLQ<KI*btr8d50-($7~9H__u*Pju|^W_2QA#P?4E zo~Uwq5cvx>?Hl{EZ}8`nuh?gz4UTxsc%6j1lcC(><NNpM;j|DiOT9mC-a&mYw%5#d zQf%I(#=oA%6Md1PoSt+_O*h+nDgq6JQFnw);eH-&wzqNWU_K83!N|G%9`;%7$pB0V z)*-<mp@<2OolBDpFn2rI#{QzeNsU%>3T7QmX2|}XPN{K}fQwhgbJtBaxoh#BT%bWM z%C3}54kQ1L2&PRr46>3GcAWEPCgBO^HvHH}@cyCx5{#WPB+$~9YmaXL8n)ZY1QkXJ z+MicTc=DVX1Kt=UwF-xNblBMvSTR1PXplPOG2s|7N<(vtec+8f4jkwX(Qv4~<^Y9s z8Hkc$e^kQh`P}teC=I2bn{-;ZuI)q6D372(>HN!0PmD?3GZEbVlQ9@xpe5QRJ4Ka7 zjmRz|`hNWu7|EKx5cur$H=l?82w7}rSqBy!PJikuyl|DXTrt+=edDo7&P~!VblKr) zCR=(D!9WAC=+RNk1>_sE=&9509qsfIXU&<DIh25U$c>?i;sKBE+NMK~GtZnbORhm0 z0FBHWaB?<@S<X{)g;K_&ZToxSb{TUeSy%V%1nVXz{g4DmUx4-N^zXeIN?(t8ZZ*o) z$fI%^$k%3?_)V~L{z)3qX9o+bpdmaOh;i*QkRl*C;ihdFJp%FDqubC24Go3U^hzj# zr0>D2wi^&Ha}7ZkCnWpiG{!H@xfT+y;s4B<G(NF)7XRLJYf(~~W87=`D}wgtgGl|F z6$wrDZz~nCXbF=R9x~QXsb`AHV|8RTzZd6X)0mHEPv?qo5AOO2>zjlLBCH1P&k;2J zlV>@XDIx6soo<5d!(1iN;ObNSpa?GJk)l!NBkzo1Oq#=1<1Sg?eT~{oZ&ksPC=s+8 z8wMP=U`nG5V7k>8$DKdm`k-M3GuK2gZ(BB6EJ00m_ewGI7fEWz8)QC@WUO0=J;y&d z|4lS`-&#|4K^`^fx)F~Puzyi^X|9|Rt0@`9?;raDzZd1t6*FF6x672qfN$;j9h@{Y zubT|zWGtoW8IFcOJ;Bq6)5AqEp<4S!xnxS4ucY^f-MJoD{r-)C<4A>0RXpDYaKGXz zE-ixwaDT1d=I7_}p7*>5FTVI9zWUX#;!~gc)a6JY{NM){828=ol>==!9EQ-Pi2Kk( z4_%HgE(CDj_uu{mhp)YM#r?*Qh6WlMXlS6JfrbVe8fa*sp@H?$!1f5|dxMX_892K> z0u-66m*A7vT5rM6Tzl5M`N8oQv48wO*W7R1*qj<jl2!AYdw&O~tF+kDoCu>S5rQoq zf|(0rrg((zDT6TbzHmus5NG~&gf2pps;`B!&DnzFm-?4IAH)ya8sE6`H6|~nE0w_R zm=|{by%>0C(%Co6R;Q*(s?aeKN6U$2#>Ulg<o+f`67HR?nC~P@uPFsOXqNkGRpY6- zEi<U=#xM1bs^;6stf7I`8t6#IaBE1+DakzTH{jvZi|k>m<JHpd>)W*0)0TiipM67E z$QsdD@tVF16Po&DcU{uA*zDH_W3Z0T;>6_QhVas}V$L7ftwxhIvrncM0&O#a(ll@) zSbvIu>1avY#l=V=FRq1~XNSU*up}?B*Cn+$HL1f3nXcF6C6zbUl`aV_^ul6f6ESI0 z(Cd=0=#z?!8_ARg12YD^KAD0qmK#hi1U%R&;mWQ>K<`QY7M##2v+<s{@C6>WCgZpz zJOpjJGV|Xk|2|LYT5(QW9QZMt*xl^Iw#NLh(%|62coHv-ErJQJaB0!QJ#iO-`bGo& zL#T51ZEp5`kDjB4gG)^0+45=Jt6dFrHCv$RY=XZ?Fs&$&o=nl9H%8#2!BnoWi$))B z+fg3q-jYmWyO&l-6$s<z?U>dZ@r(0joOG`Q(>4<@`nJ9#T-LSV^=ZF;0l?Or<yoef z-k=_*rnMmc6kD4kkhJ;xw9I#_aUG{ILXt)}Nn-8dX*J>r70yuJ)w-yLEcx=#5s2M( zpces~K3}w&eb($x;PxM$hvR3XNN4nwX^R#U?Qv}X_$`pkYmH_GpFE1xkr}vVX{^Ba z{I_-Cv5)RXK)1PA$0e3sdwi1MO&aMH2rjD;`hA@U6Wk~#h<;2*2L6djFX9<>Q|R6I z?xGRBZEfEWjceeK5Lg*j!xvFuj?>TSND4uEPpCxbrNNbdPg^CDZlu}JKtltYL<17P z;I5nf8Hbrg{F8=&>I6M&#Yxx`Nr&K1dJsvi{g$@F0WWA^#-Jqtw@vDXLBsD8em7{; zO?b<B8@&PR%GRP|#Dmd+nWFmWvNJ6qfseF|<H;*-LxLb<xk1Bm=Ocgp2K2*TBtL0K zO1E+@%8xK4$VTtc1u-kpJE2O6d87*dm=Dv5?7;hum<u0yG`BHWh~8Cy@B(EiV$96c zNB28AVcfmAw&Ebsz^<cS8j~-MkqMm&-@h}05#v0z=yyRS!{cja+QnY0R1!VQ-iY&t zj$&WE9ACx1mD}GO;rh!(%y+vHqk(%P6xM)7ZO19cA$aJKaw!-|w)fdn{{TDp5=BU} zUm14ZfG4_c$4C~y{?dEm{GO>-al^>NnYU{CT6hn5bjPRhvaPSC<rKmhxL?&q(g!mS z6Fo^tN%1%9zr?OzoBKwxlq&V%m8R<%wK_yAxnw%vJ44SV$8tSZ^!|r>e_PS?Rwov^ zWbC#2zS6(V=9Q#{q6SyA#9*+z1t_HjE|gvaxW7_Ef=T}!?|26W2M6(uZ+rvqd*Az3 zMEL#R|9yP<%U?z!K}&pEH7<p*u`zUacjI%P`y9UTg)c1KUN|=x_gAQ+?tbL6KCZjM zGz6}S21J`_Fz#1H)pegqqkpOUDy(V&8huM;)P1|}91aaV3SD%nG8vSSs$dbAc3z8T z+i$@!WBv`8k54>@9b=DQ&TTa-_T>kSiw&&-(Pp05^=Z0d?J2sPl^&CB2#(_3Gk;Hp z{*A>#ShS++`~}gs#I$xib=7a-4O4ram!>|%CtnqI5WwF;BN#hbuOz`VN=B<(!4%h` z_mmHYks?_G^;!h_oN%`r;UPdTsa~<vl`Ffv_e)|<;i7etOh-vB%qMun*slqOt|;Aa zM|mCLI!usfA2$&_JU7C|(Lklgp-OA&?J+l;(M9i^(_Slna5nefX{BY!mA*kk_TWCj zm`wn#Iyb-)WbZy@=*9`Mch_<#zRjd@FzAMV+=u5z<kycutHKAbP{SZC1F++g1JBZ^ z!NdNkmcv$haJf1>y5JE)$f+V2el{rB(UTbQRc=mZAh^;(K%tGB?q*4~0PNQj+^-?% zK&?vi0N2&i{C(+K$VOGFxhb#ZdD180$V41L8Qv0v*NEG92oOmcA$o>*T)%RDQhYlR zno=sHaaU{>wrKfAbwVQHeITTF;i%M%5i)~UDm2q`h0DOX05eFkj$#DzCb^LrXT6Ct zcSRte2r<^@Zq7~ig@&nq_9;mTzZlk&NjOjcQYoPoNVgb<Kn1c}_avH32D0nh5h5FP zR4Q*yWr(E^IWmIzV5V`?$|81{b=dAuq1l#z(-b3^t9Z~+Pdo~j|Ln?y%lzfGY{L-2 zM@L4icy%)O*s#CVfNQ!!1l=$9orT)WnA?KmTxuHful$=h&}P7{));Jt-1;iBSZiKC zKV!p%dDc^sf76$aD8W_&lvfWy671;&?R)DDv`^;Hn@)MK?S*j|U!6qQw}>Aw7#8PP zu`UTS);MnZ!v~<HH-TJX^ySky@wI2M)7U{b7i>>$X1w;9{W#jc{)TF~WUkbG=b#(s z2c~l-zkO>P=KD)C?A9hyu#WjLF*1t~y*U*MV!m_dHhQLusR+_nVV>ap$zTFurc+KR z)VE}&?WD1X=K5ZKzppRgC{w1!b@eo`zVqDbm9vqPavI3hW)AvZLn3l<AtNn$(9efY zA-T$1wOM6>E9IcEuL<U`26{i|a-2)}TeNu7c>1!CYJMxU8M<K8*pa3Ox{FPR$PQor zcqKgS#ZOLP+FP4gyel}rbzR+ww+yb!x+r+TdBT7B|K5WB%_*pUrx`K*^4u_O(jiDM zXXDZozrU0Pf+q=*AB>#KDc;*=x8vI97S}&w#Jq^G#JHc9boj~1DCX%MrPQF|TEX^D zxo9r3_&u;KXoK_A^8RdEr^dg%+lx8158F-q_@!TXOfFTHrT5a719;7}ed(vHa}&RX z`=S$Y%nh)vid=`6l|y|+DrWw&R5CUDi1DVw7@_xrrC_61kKa1`&zLj!;qmrc>48Ch z|M6c>eHEtQ&{9%0d{*IwZ6CuEO?zrm#@%iYY}yfM3D8dwte>P;3#Ef-FH7G<N~c{+ zdXlaauiI~0*mo-CJ*DDa6&Z!z_mWb{<xNM;y|nvUel>5LavwH;`z30y0o-3!+=UAl zaOa(OLKt8C;0Hgz%{Sk?{P5D%m%j8R{Lvr%5zd}Hiyb?5Tz>w{GtVqA>kF{|M?UhA z%lE~F0PZJ#?>F$a2ku*Ozwx6!G?42fraq)^NVy&w5N)Ob++PpP*I%BE{-yrvY&|7z z^evUszM71b|HstJ*fsGaK`qORV*sB(V84~iF@MTQjTslouK(k<8!)MrzbNtRBR|HL zsb>}vZvgl6>v*F+eR=E0@ThZdNyV$im~_~G5qF&Z2dMZr*9i5gfhkQV{&~ko5wtk# zvj7`JY6t&@`svZ4BNc!-njN&@3~JH!`Xn^|+~Zo(YJhKx3!WAo{DL7l50h>wsw-vz zRz;BhJeh-El9~{zaUg6dx@f#pSOe7<hYCwkPK-3(9~$7s^&$)1AOUhu4(9&*D<`L7 z-|aMOaAUU?t(G7+&hwAKL47Np(B(H6EjIs3#V@tZ?4dE#&fo;jOsMhVXl{_EklU`; z;C=fDCf8hw$Np(d-_5?tUa4YLB;8x%UUWpqkxnmfc*m0l49rS+b~wKdDk6|ViCVa! z|0`D{p%#pG-0=M#y_BU_F=dt7P81SxAsNx;E`!@kNto>}sB6Y6k_&SjFKaEBI4`-A z#tFLk+=6kzl;48?JQF1lqrO5ZK!f@!;i9yC?GC8A?C{x@HO>;=P2z8iVJ;{S#3O+G zy*4$PX)r1nt93G&DR%{DVI)9Ci4ZXM;Jnd+lan_5Vq|&DZnc}Ug2Dty_m*A>J6r+I zo72eFW@0p8IX7*@n^QDCqE7OKKC2G<T7llC;6i%&;+Fa>9Mj>s0o@wofl||3ulKg? z?}giCT(9hl&Uf2P1P7iQhvS7Yr019aCYIWak!@_;8iK0Fii5v*zpV6UP7LGOFFuT& z9euD)E*f0Szi%ggbax*TG?Lp)p=maR;S*ykn3wG)J?vL>Az&%ruuUTHKK$x1J&CN( z9BHYY<O4HV4Z8oIz4w5Q>^QH4Z|B@-<ebA`B4;?mIOH&AQW8Z<6eTKHR<!B3zr*n! z`|SFx*1PK<OSXa~A6Zs1l^8^kVjhY^4%6fukOnz-18AUg_kRnR2D*XH2@T*CPUEGD zU)8Hu;ePi+SxpgUsC?xWT91<3kP?VB&Ml%6Nqg5cDmtfO>YjqC(+Yp79=4rjIKQ(5 zr|T2nbJ&o=U8jYP)Mj?ibwF-EI$vT1Ni%w#U7R-tP!uRcfzLpYz6v@!XIU{6nx-lh zIH5YfLTY8|N))KdFjjayx|B%(+E>K1bR(Vu*OJfNo;|o(hTm4UC6(wWzIPVd1AS0@ zp$snb!gxWZR-@NEh8fvRQgJ2jS%J>EGcmn?@>nxUyB5aAVZePVZXcS^6DKzoGkhWs zTOVztX}9S`uR8~IPz^4D-^UxZ_`$AD8XS<LS+_YS;C+>*0SC=jl2stOQgf?kl%yS_ zkh=#-^h?%p$t_ACk@3r-=a3UIs<m78;ampRBDXun@yO|aWQ_T(oP470Vf?IYPlyy& z|8(AR#Nlxmb(b(y%Jpr&@7Z*sy(}N=lIml==BB(>OnZg$Kp~7&{8G+aZVB*N?D=)7 z`Bm}zbjorArZZq6CYe06c}7rReIuD5DfyL=0Lx7xupw6;{-FMUr4&b^fh6F5qLNzX zPXg{Q2t+iXty{OwFSh;mw`4A8i#)LE?d?T#b2I+>um2i<^EZF9D9tZ^@r!uki6`a( z{pIE18(adoF9unUzxXtcWLP6|F$2;`)+7*V5|g#Wq=?sr1Vo#WfcxvBDzjb)sej43 zh}TsDQs0vO>a6hE@lgM(Fgb>x<RnJ!b3rlx%e*%E^3u$aJz&h(h;CB@-ZHnqAx{mE z@wvVi(J-=~W7>s<KCO1`Y-}!<iFBQu1kP9Aiyv0*OD<4|?_7P8?wvf1>$`r$l=FM> zEJQTY>17FAD!&>3T5=OXC1lRM%n&FEXZ0meMiAz81TU#P3#O?<bEF_MZ#i-OWrz9} zZ#%0kn65U#W>H{HwFKZ?^pL@mNDHtlq9>#G2m$*C)))wOMLDD!X-gni-=VZK8Y6;w zGEQGZCSU>P6YkWIDK0QPMs#UC68kHAYcyyn@j<OzP$q~Kp<wbJ)Yail)e_59EdTlN zES)xEB+&Ra*8t=kGoKn(;oZS-He^x0YNG=8w2@o<GMLm)<=TVVIt-^cPG4=AnONo< z-D5Di#unS?LY@?uoYCRXPyjtsnPu|JW|@U0ghzJ(s>@0hrwuJQD_=SHNvEA;Hva)M z@ta*HEa(KBFi-(cK}DZXWr`K)5u|UU6@hnE1m>*)rM9a%pRRKX_I)3GJ`G;#P-NAz z!wPw&c_USzL7K@X6<jE*=(tp1AV^cgcfcM{(L#}8-kODsY|C<X{_{<R=d$_p;5``v zWb>Y_Fv62XfTxCFSI?1tjN6xh%83@xLhDa;W}##jK&{0Q#%v!NhmxPz&C^|cf6`m0 zaZpk1yrCSICQNv-YYCj&(o%uRx&o*U_hTdqqiZ>p4sLGrLL*xke+$6D_^b{W##A^( zz;?3Epps)}xf-pd4t}#U*AHJ9HRJV5$>%58{Ab&L%hno9l3_mIotaF)d*2;F#hV;o zbXX&1SM)R9LM6KSJ+8fJ3wC|#wut_s-JI?n$E*MAC(tW2Xw_6gX5;w9!uixajd=Ce zDmc=#o)InGe7tX<b(pE+{RG#$QBMH-R7(jh_hb%WWN>&fey9hII0`t~kWH-bkx(o$ z))v85rq4#wQk;1rfgRm5w0b0ii%P_HtsHY&C8l*NfuzB4ZV?q&xAss`m*FhkHmExZ zCLN122c$C8>=k9`xv~uJwHLsj#qmL&h*io4B@k>g!FAnMD&AVGug%Lwj2$NkNY;21 zXzi!v5`y=WaTC>YoKake7^Fy53VFfJ7|^$3mX<Wrb!J*KvYsBq)ZEe-F5NiO34dd$ z52v>a=Iq43Lmz$OB1|uIL-m<*I7%1ZSGSqg4m92AWF=-;xlE1D+0#_8_DA)nrp1NF zpDbH^9tzy=l@;R6w+9xViIXcH*~j^Z4CChpFnXaM?id!hLIawr4XAi<Ns(AZVCl}& zT&H#{ja}ckU4=vD9zuELXf<qsH;}n;a%f&c&sEAIoF#zQ%6?V2O5Y4BXsuo6rsV^I z_G8Z9LnGRN=ds2wiHO5%+Kr>SrbN8P^z)_O=TI|xAf}(yeArWQEB?La&X`#+(~495 z&@5)CkUFJT!fHqjFAy`4%MZmI=9c{fuv{9%z<tx0(&k1XMYNX%;J%zaryO>l4P)-% z71mxt%b?@BY=P1Oo!kT!*Fi`_#mCY6v(T{d&K0x(-Cekk7GiQU?`)uQLdoPSQNJ2; znTo_1NXz1ih-1!Y$1nl=K`T0c+VKD4i6X7%5^z67@kzk_1;PE*U;P#S?(hB%cieFY z_Uu`y-L!Y_Ufg%zee<3ld+ag%;upWb*T4RC+<f!Rc<QOAAi{s+8{fc}zVxLPH6eie z!tLL`ABW+_Q&<{stnj>nZ>ZTVZKWo!fyYbiX4!q@g*28=V)7zWQYP|R0;0_XC%t){ zQ7Ln)E&-{3S@kMdQyGx@mesGWLbCCjd~WCn%F_8fFcQ>X;+#aWYXSw%2`=7@LE{{U zoS^?$&d)_3J3;y*{B@e@aoA9kGEhHKI$z|%L}~9!^N%Fpek2L4zk9>Q*Wh0pA55!Y zx%?(QG<q1jdVii)ex<;<lYpO06Yn&94A0Y=LoVA%?n<~mQrhO9L%Va3Y~L$^QW~EE zW;<Xb5Xz&-%wlFDQd?Spjo@3MLmyeU-d#f=;RvOWZe>sc>!p9WU2J@dcactj;ot8w z;PA*wP<RGK7Zz1LL63W?6l5?aAXuK@x*9h-&gvU+Is)i9Eb=_N$V8jDkxcXzu6}sD zY8)F>;>hqqU2Q5-VPB(*8_)#qvmPh4m3T!htj#385uaz`TFg#8H@kN`2`coiWbpHn zg}-wRu<#R8f=}<16X3eA#%|Y?;{_^#MRJ*FCz0aK)V*SY`D;0^EcQELCNsZc{yQF+ zS85aANH;ey*OC+Exyjkb_Qin*^WHsS#LJi28uPsz=>iSXEuXOPaYdN|wFLoa)IRn$ ze!^GCDo157*?fP_U0a17GfLC^X7YKSJH*S7XKo(6e{=xjGjRZeG4d@y{P(qcVNgf@ zewus%G*6!)pe(g<t(*P%Sz{FjZ6-W>aVd@F`chb%7c7fu2-clFBpA1so-faGyUC9t zy$>BTdW;f8oC&wJM2mKUzlv!kCsjA&)Z+CnC5C3B=RMW9a~-aAQxzttbeykFFjHQ0 z+J@%0`k^~Kf`BJ_n-rk7VY2C->AHyPfA=1=fAHFriZwSmgV(?EQ`q{(u)V1brZJ%} z#s0yl#@GWbc=eWQT4~9@z9FT;#t9_)8{M=UwxT8AUz{LGJubAl(0QaMsW6%F9O-*h zTV{cxz7W&2)FHX`DFF+Cb2lCsLfQUaU`ULkRyvuQBLjl?!7+n4&idKUyL~W@rS}bz zF+TT>at!Y*#i5<Wn9L$TaAm0g0Z`OAy;LyvLBpTQ8^H0V{O$WAm0_*i3!NL4a2>IE z;$`@`*CpI6l_F<dR$M#S2&XqSEYna8$3^n!!1F?x1&zwBFv)8%t1=PDZ^T)hj*8{U z&v_L5_L(}y(KWEd(!Lt?V4$Iw+N)|Ys!d#>>O;?6Lh;YfL-o-zIO-jcDU}#0uwz_4 zp2Z@_X-%O69)IlqqTN-4d!OUD;<5_@_dP`wc;>Z*wXWc^>YdHF>90N-yqrJUdPnC$ z{9|YPFh(H1eJnZ%xc!Uu@Tr#iyHcMK4aX>h%St1Dtpfjk&p7O|InFHQXwh#WdMtMS z!!ncNg+i>2X=-U@f~@)kz2>tMRx*V15#GDnF4FiV**qzAoA9=Y3=L^G3)ffv<mBH& zF~25}MnqW%I###~Uu%9OX3S+I)Og^ZjsTa!-yIp1$NeT10^&$OzgPV9DtI^tu$AjE zQmIE*l`dgL-iA>pu6el^=7R&UJ*q%Y>u}at_CpKqpyHKG%e60(s(87Ml&TY~`~?bv z`MExl?t367c4L^<A1+ZjAe*j=3PH7#uPuImm!~D(>rThHd9b}su17JgQE1sO37Z3n zC@Ltaq&4N8Bw%0k*-QPoNJj$h3n}EGlYsjRmD1SQh@PIFs5SJ*fBeVz>Q}!y|6FK^ zeE##F$4`IyQ?keSP+wn<kAM8*_{vwlGS6hPJd#l0zIaAGA^aE)&?wn*uN&^Vn1ifs z?08!FYq&hH2o=HrWhH(B#4mp1t01$`Nla+oHsU!A>B7P~GxJ!$qlU*x*2xrqlkD`R zHoed)M4OR-`y25MNxsZd|B}4SHgX85Z&^FFU*WN%o{OC21oRgZ&~N5Z#>J)q0`)Hv zsDDgfp7p|f`pi!_@q3pV>s(}#+`5*)w7DJs(E90l7W8xqn(J@UCx;GT)4+4-WLXNE z0|~g*#rS30XK`A)V9q$#?IZ_9Tz5&_<hG*JJtWW@Su2}NFq)9zWR~E2CDTz61ghkQ zv5db!NV<`L`#yrry2-S4Oqm<@lB@|qia6sESU>$s01wY~an~#eSfsi1PCd>~W^Z#* z;5Kh0yMA-A2P##P8|<`taZuNQK{<Du*O<#xo2g+RcCCW|8P=JH!1aEc5{<<IFv-mg z%ICPg9v8XkvEJNO+{A3)CQcxN((&Ys5x+Q>pMXyR>3D3X0$SB&MKykleyML}ZAAtt zW~!a6xBAa^d2Z%-q>M^TewiOGw;s=42w;+cw0w4%02(AyKGBx9m#Wc3oOq#uW2wv5 zBf{cf`?f1g80EO@0ym=VDS(>7;>*#6ieOs*u>p)t2fu~MCu~qEaDRIM1-i)JwQ7$O zr85_kj@YLxz*!Tmr_AZ_<e8;5Szk%Z7Mn}M;uDPCBZn@*?OpO0>LHtLMp#v7D^{bS z$cJ(&;{~nxgr>jzTpp0)<ggKM^+%T3a{u{$-P&A%iTZ-P&E~D|jiK==w!tU>+t7^5 z2!idFPon$MC0y}4w_x{!H-|n>`rJdH%Nzgq=NKU<PH)hot*Qa~F+TzX@Cs1R_}vY7 z?e^M;4Bbg5w!s4w58H9^OgOu6wnY-`Tg*m1YAXxjs4Id~lRT(3+xe8@&x`~%56ofb zi@h+sGcf-SClhP1tt>FsCKEEYU;n0JShtm+YkM(HG#F!hj`LK2@~=2OiRzQ%&<)Q* z#&4^P;Cv#(A>%I~&LcSYRaJQUb6YSYwfzXvN&QxEZe-D@u-m$y3hb9H#86rNlH(%o z9^Q^AcX~kOo>~X`WU>2A!LQsZYeT)S78-{iKCKzE1o2ySM)Ye9=tyEut6<uN*^6Ts zjbbS&b!jCQvTaK>#%a|mQFqVlL#X=xNvQ8B!Q3_%d<5Ng>iP-0&d&T>Nyg<-t`l2H zGLeY8tG@+X-&-Pu5x{-7T8o!Xdf^OFXjL0DxbLf9fX))T>@J%fW9RxYdae&WZ=Hd2 zYH5B@d36PhSBI~awau7OaDHSlt6e+vc)BGx=9kTb_XBwVQeVvADxQeC?Q)!_vNtW4 zX`6_oOC9{2iDG2xo1{|L;Bdj!aB=@3Rri636S%tjC#eQcDqMfrjkJ_l2p2)$9)%hX zrE31%K{BlQAMe?DZsoeGH;x6*))5Ex{l7zi#|>Yz67p%TOHTSBvnElurFwX4Oqi`Q zVyeo3(Mkild7P#NAK|V#KZW)eFF}2TsMQ@R^nBDorQg(*#*-12XseEZ17oxvZJV3S zIDSFJwc8SsdKeU(L&|*IrwRwHCz4kgEniL-T#s`E%V)zClOVFy`U-p`?uh1WUK@&L zXmLs5#(;9E?-qdkVp`=i$j!92C|0e*@y0^FR?j%bJWGA(@-!si{&I=r$+ZOBPrV`p zfWN=LA8l=IF(X+H+!vl5e2t#u|Ff(70gajQEIn-C@L>x(jTZjOc%F=NQEr1Ab_Buv z7kN%-Kr&Gz?Ke1yS<gUhEhk8Y{0UILiAMp-H}c3XfBxEd`8pBdP4fdW!#WXQesONQ zd@kzBndQ1lB!9W^BihV*ZZElz;YLYgBlIsDr7m+(PN{Fng_PG%8lt`YUdPYT>^!}G z3MG|fg#;YBYJ6?;m$~qhzNy63_$Gb6?*-J4yuPAb(vAF(z_e)-zSHt?*c1z<VMVT1 zqn+f3G}cxw3dlZsgL`z|5=^=|7XToyQpbft18ijW=;wJqHwL0P6Voo?I){Z8YGn3l zl+v85<}#bpSxxD>1iwa;g>*kT39P67MKGFQWk0tlfPi0)L;X4&9SPr%T=bCQ$<`7T zww7@%#~>E_BLf~{MeU~|%}d(4H3I})UY1O@85!5B?sAR7$i6e^=C~R18#1{^1B3_t zt>vRA_igS86w>T_U>S3DzJm83+pdCMyRfM!tRWmRwV@-1Vnrs~$y%=K)yR82**mXt z^vx^9$ovY}$O1lMCkwyThfC8*Y&_>E^O*t~#L8|tDLJ>7$x%h7cCAMA-QgRpLRn~z zee)Q{T^9+|x1|AAh?S3AJX4Vc)lcUAvFX%702+lH_qHie8ijp+(=0)N-1JY>`4w7R zFtrlAq{UNb0GDq;{?#RBICfM<jHYP9iH_r!B0kGSn-K|XDTj7~_!|X?-{_cEh*_Q? zn?sBJoeGROGCS5-o=&c=Tk1+M*|MNKo~twyP3PJ(R&4z_0c72_gn|TEcgH8X2#)li z{ZluhWLq7os;UwS8_(0huRepGx7nEKbb1{&)iy#uav8u+2F}Sl8nFNFIsze++lP&p z?nZlF)NMsa_tF?Ko8?#Veb-Rw&0KDVucd+t^N|%3vzZ4e?(9oI&hO97hbK_~YA@vH zmjGGGrks=SkXZxQ_7V&e$bW2GF~&`C)}RU5*m22@rjwjwoEnGXB5D6<og^hk@Zr0E zv<s(dB;tpZ<QE}OaBg(F>p0x5-gzGa=y+lF6z&??3cD+P<v#%=?5vx`5TXMIL$g*O zGh=ID3yNH%jl8TZ8Bpu-eoZUc_!DQbFPtE0YR4!hXVWi3X#S#|tEpsKx1|b`C5h+p z)_1A&_wA!l-B<|cbtJ?raA8nMmg_7y1u<Ao60Gz)yI3R3<{UB7`~2HYFbyqP6nD8? zc(q#wn=O3)w)gP|P`__mjF?tF>i+FXy#0+|hdpS2yoRe;;Q-cMJ!&Y&m)ORix!;FQ zbx=++wCT4p%=#Gfh6y8y3!mSI9$HW+2pEXyl3`ZvM5C^KRppY&Z<3P0YqzEWBf1Lo zE6hnqX36Vcp8Xb#vyta<OTJP+3vjOfcH<}JtyHHT%TmZIJEw8wKORPa7Lzaifd^BX z>7|D}Q~6a;`c$+^qlDT`h_?7SWl+w^p&jITrw8&2F%*D`$k<M6J+i?W$aHepKBLB^ z#>D#Ru#BX5A?JQl_uRQfc73PQk#XRDXx4;+SRq0D1&Tr_<O;IehxcKjej}aB*w5Hi z1thLAU_@brlYstooSCF4!qQFo)cdsLvDCjUk2An^PUp-RKK8s06c*eClv}G39c2!5 zYKOV&wzU3VL~^VGS{zU?Z$d$9I;f1dJkpSB3Ai63jC?wkfcx36jYz=#V5)Dxg_rnC z$En%rh;4JR^rGOoI4)ev2)7QN^JEpB0ETa7u9^wf*YiA+uAiM#2fL^X{Pl)(RGCU6 zIEh)yK<rw!3Sr$qfbv6u`6k{I;QaJHGl@(390$=y_&dY8TF*|jnYG+r)^pwDTiMn_ z|B`PqUC;TE`j+)vyO}Rruz&gUq32OP@m}T=kYZeQ30MoZ<A;q8VpN&<;&7}?2ir`p z$1sm~KaGlscVcBtdX{qu$k17NJN~2kR;C<2cU!G?l5-KPlLVUxnA_<bfILytuw;e_ zkp0C)(AX3~`lDodJ<ofoI%({Zs^m6ixb@b*-0mKSWf_=IfQ&udXmNN|nC8aH@GLj9 zt=z07(_k!D$c>d|iyRe35-jL_&?&u8$vp|N??#K)p)SF5nhHJ+@8_fW&&T`OXfr#= zy5B|?`U~nxoY+8?K}u;Y<$BjJRG!JOs-CnP@QbtgvmyTIHWf^|B@nPxQ;k>Eq$`i% zve8arBqu#uCIO)wa;JL?CRg}|u#A1-oQJH?vvPD<{kTZ0B#FaGmL-y*%S-|df>|oi zkie)!ff@^$<F#JM<;(VgIL>kss6Q?zP@nU<i8MEZgX!kWQGoYl#|JS?rp<KR{Vi%# z6|Rg!NgQC2kJbvPcqFVq$+<VApoMI4E~65i!cUp=D7$P~q}#j+!(I)ZKBK^_XJNy; ztiXW4u4?!MWnC0k*guWV3o8`_ve9OuWMT2Ph9KVdVhtJ!d?+=|fkO+N95mv+5P;R9 z=QVhuRVz`|Pzqa3Y5<*V7I{nmEUx<Tc_`10CzcHBX0}R!6Bo}xUueXQ|KCG!UB;ef z3b-#aGI+QHCx3AO6P*iyHnFDDR^J4}C;|LrvX*fiIdwZ3`0uI11eyOOmzo5Or-#uy z5*=idY^(zCX*OtSF+mNLUIRamPX1h4g+!Q;tT5M*|B5LOuHQd^!q*9ywxtg)UXAZi zprHWM+e>kYApZ9^Em%b<nepO^Qxm8pP+vo4eUJe?6(=_l-ExHrQ%#ewoGXIw{W-{J zfoABVoAKNo)u}`&g;^#6F*mw$`V7e%JLjJW#_n!M2X@*jQDoC&HciY@FgbGQ<6^xX zqk*yDtptt)WXoF6Ko)*AaohroJYH6h=Sq`Pb}OPKoM9?k*`3*&#}*rP&~C4WBSFQu zQobWMKi>oMZ@QqovH;ExkSSd^Kp<%P{Xita3bfdOs|SunOOTO#t-NP|4qtpSe13gs zf@7JJV+7c07X#E@*@_$g^5MnnWKN#`;=f?dx-_nDyuTjGhNWu}moA{fwv%M$cQ34! zIj98r-J5zt0IRgvpxewfu_XX&GI?0beg*n(nrz$xq$@!CkG@$(!W|iYcpVXQRQzkE zT(V`oA)ef_^-WSxp&e?DW3`pIs49t<jm78N9OHQ8%s+8nnE90kANNe2qm}CS47H2t zrE{|H=p@>{c?AAy1v<YlM`ivc%M{7Ps|YAyau{H+YM>jUGH7Q2igSFAW|!U--!)ov zeQ=tV0m2n#l1V37zf>!jw+`VA0ncX}xG(Z3-Vp;Ws~UV{s`nUSkr(1(NowPHIoEC! zWV-h&jqno4@8HovP`_Bqad91|z(32M3p(#C)MV3FvHz9%W~sb5OQ8NtLLyTTPdhZ% zjmP$vLT8Qe4O1)7+onNRr3)8L6C_h!S|3d)0eX^v`-w^_$NnVXe)a_(3%D;*@8;+8 z32GAZwT+vZHV(9!*s(S6S2GXMj~iq|c@UNidMHl;;uqlXL}VIIKx=J-r;hESn!id8 z+^Tr2$isFb>g5yx{D){SVQAI2W#YAf<e!T+lWWjh^0|~k<bwp(TK|#{GTX>`kouO5 zT>HtFJ=nh(G#dP2=YOHZb|U#mq!4*20S~qO->!cUFIn0%n!jM1S&cEwA9sj0dOV}$ zks?b?0zNJ{z0vp)yjrj+Vg#$%P9kPVx|xs!uJ+EL+GB->pnNykV8mkL95?6YXsu(0 z^F=GKXJkU{KeJ96yJS|L>piyh*uOkH$Ib8rHcA72B?0|vOgZHkv&+Z=1e6olRX~uw zN>1w)^4P%sWZTBLrV6jC^OMCknX;_MHj_;Gv*C9$H<z|j;S0W{4ZM6|-v8(p6|GAw zZAytT@iVj-5zk5OB%XwF^L#7Y))q%UH!Y)qQ{?b?w6M-8$j0x-(cuW2lv&PdCV&Qd zf+n_=s!&H9TY;XyaYZ<AO$LH8RYpv5qqmCygh7tY*1J;>ystPx@O}tDCzUea-l#=W zNjU3ZvhlddPWa4O^`gRDu|Wsr?izRq3XJD0=f}`B5U$*mOq(&NRhV^Wwq2{JY@jFj zcj_{zDP9@!`MFL-z<zxRrfW=8qKID~xhzY=s1r9l)d9^rgGgWtcRp(}D(&>?X3#e{ zfYMFX*!O1-Lu2MUKgc-fG6~$DkC6X{j&|YHlW$_|Jip^~8m$IxH4QLZ<?uT=mMqrc z=U>^2X>ESVcRsUg<e&0zKSrmP#v;jNTYx+ZD*16RP+^PKSDb7k(VR4Pi6)t~egBak zorm$2OBpRhGT)($CVV+E85K?Z6-LN<QUk#S^Q5TP!o9->TiIBc6)>}{1lkwbhs_d( zx~l@ueqk$Y2?C{qaZAT=3DjA;P%!h>JP2EWy9M~y;!xqnt{U{}(i>-mr^G8-5IJ2t zfk}VzRwZf`b=c+FN(D4Ge0nqXlYM_crCyOltQ$prQyAzOhr^TE^^~T{LfAH!#Y%ed zS;LqM*FDz_!&{sOdHj%X(qrl|Dobd37yV@NM9%fyNs>rRc*2#Y6HVg^dmV0jX$jyv zt}eu{UgEkIT@bjh)@gA6zkCr|b840_&j0#79R9(pi&;|9Qft#^3s+bLXttYCbZ)5} zC$H7w<*J3e1Oqn_q%I>^eWN(RSU&9R!wlKFgP?u=*aE})NQ)Lv?C7S(iwrHgEkw!1 zU|vr{V19z&1-o}B35bko3O4gxe3OI>6zXcs2oS%zA}$O17isakHp3Rb-I@~o*QU=h z{ct6hRK<Gl{y|j!;1mK|G&uj54Q@r|>rU_1!!)gh+^4`$c`^!Bsg`OfoT#&&xeM@+ zU@FvQ3b=0xn6PKK90o2m>1G4a+xeUEK~06JNN(WTavW+&Z9E?-zRcYVV3PZH_a3#N z{6b=i8{-W+bk+MXWO6`BE0=0o{8h1z)jqB~@u%|enqp9K8A2_Ntb(fhzL2>rM~G=| zF0s5v2%6L_gCYDIM4kEYsru|}K2~z{GD^Vx=(5SwlX$>=k<K)SBR?Z}zh@a^d;<r~ zE%QKqGPCd~@gXEvD}$7$P>eXs-*VX|8dE+mk_eE#_z94HIgj}W(vK(SVb;-cg7^>f zM~;|y-q*x)(PmZy^p?-UDPbEOUx!K>>B>Bx`<HafCWX(u1oEkG5!PGog?9eCbAT)y z!kUWY@=F5C`<G7)y$Pdd8XE5$Cur38CWuVQqeA>bfI0b93Mn_sCD31XBYskIC#JIi z@L1kvmZzQV>pwsLJ(y=MWILHviQi3d<S*KO2Ybg3p>FI=GCoFLG+LF+g(Ny$d>#I) z?ruydG$D7xPglF0gy%-O%6AFm)7T~7WhLbg>ylZrg_{yr^4sQ@<;hwH6?87>8gW9f zRjmUjeUq|NiGm^hK}S!RwU&t)BYt@<e3LCZsYj0W!<#fHF^4cz33fAGGaTF?j_0Iy z5>G<8doJ46ZSDyaIY-zp#sgT$;PUD)GA+mX@c_EXP@8R+3eZ4H_VX<S>em<047-8M z?}~861Q|gMZYsu3Dop4lqy8mXa)6_3mpNDQE2xpCJv+v4J^K-!`vL*@c?=NvA&y>N zi~AlPeZJ^zV{eTXTPsromHD`V{p>kfl$u-U%Zyqz%zNtLR3{E%)*c(g;N((YlxUl2 zA|QRHp@<d$0x%3tV{FihX~*jIsky56MAFfz6sW2bfc*ma_&#OJ-T!hwDxU6uuUrpz zl?nDL119(zsx+XpjPu_J-;*--JGVa51tXcU1FXA*U7;GMr+YCyGlNZc@4@cR-mw@o zo51~GA|oeyaOxLtV&q)k{4KRgh1S{z6ig}Mys{iW`ux_QSLv9f1k?mw&K<gx)cb4D zs8H2ZhKWjJ!l_APmxM*NCOp<mxN+yd9)+wsJ#c%Z!Y2A1iWGLW@5%W6m2cI;zKMLX z`slJzlPS0G?GpF|h>Z$J@BiU0oTyLyeOm2u=2QCRemlwse$DZhXC8!Y_t^=wox(?t zHQ-!v_!u@*`3|V$I9WA<sX+8Pj+R!Vt{v?zQkl+pXdP6J{)%S2R+u>3wuo0)e==RN zqNjHPUVrp4X0$vkzu(+m1uMr9@!ZzFS?qeD2b#AQl<5NXO1So@F}Qmgc4g+Vg!5x+ zj-&fr-5h5x0q^7GbNTZRb+w}D*aGO%r7_^C-;QC9m>1!K!2P{{_yN@4kos7{%lW|5 zU;YN%vrBER?Xd;~EK6f-k)E98*?pelbo*rxD936~e87Q0MYtkJ6WfWBYh8X0BLiua zU8I@ME|jr+IcPta@2)HKc)Ix_5jiq6>9=t9o!TChPym@BtG|m%_g>1>%Ra-)^-YgI z`kdTI#dH<H;X1B2>h(INo&Nh4ELW_fN>z>#(>8P}BZKJ8%=4d|_`d`%hg)@s6=$qx zc0(h++xD55`)9GjFMsxtpLWb!;_zOh!G#Z7;gv;~@$#^1;aW)s`7Y=Ah;1hmz<mvg z5kC2L4a`YepX<D>8mB6g|1M=y<^h`0tLgP%&w-`BF)Qi)=^te!+F+y-a6c%CB##ns zKS_b5;5`xGelXfs;pB%5Xe30xmOyMZKdh3=j07e*KzN_pg~<ZM^JS5wk?moDNnZf; z7l8Vikxc%?a*+ebBdnv7DGns_r6i)wNWlGt+Gu9Gy#+Mi%RX&{N*b>d;JeoAH<Rrw zU;39!mPv{$dlJZ(zGW{*C%5vw)`W~vrudCL$o~7SENSs)Ppa!T=4AVqVy_bx0{G41 zC(d0{Fmf?N{B&*s__ssDqtZJ?t^6!c9OG1rhfD^Siud4P$xd7|c?z2be!~z+Y@)`A zKOY}Eb(Q!{!^1disLopUl5I1Y&WM3v_CGlP?=a5xWIF0qjn7AOi9g)(I65?i^ZBUu z*zv&7Z&5vVkY+klUr5hnq1>8syx90K-Zj?7jdr!$N!$!d9`Z^8`7(CNE1^i4i7J8h z+P~cC9)sC69JSmzdq9)E@8}!RPo|^w;?`@M$%pze5lnmcTnB-QOKjoe(<VH5e(5?_ z`MkeHgQ~)iO?+<3AJlImQ+Z<aHc~suRZS(HP6gTcuA^lKg*OQRwogT?Bx>|d$#87M z1BW;B^S@-kZ#pvT-`S`}xkUhPLO=;@pI)U2Hn|D?Dg!z;C{RD~))3jJWzvbhlYQ_+ z0P*js(BaD3#5URG0XatOI&@FUac;r`=jHeWyL-v*dIAL#>qmmQRC)byAL^xLh=sl| zUYjYm7@=-2V>&Cpy_RtYoc-1?MSx&B8{w!T3vayu?AI3Xok?7IB3ap#kZJM0@1BD4 z#AwW*fjTqX)kXsPsc2JeLg~N^3ZLynz@6Nj-BqE)k*>4zX<h&L18CT{EiBz!0QZ9l zj-Bnp$)6p-@aaqQx6CFJwkfL6`GuX>zb851V=zwXNWy$tFBm`6Lk8#AZ9_?rX+uK^ zrf7mCSt}CK*k%2+v};dUvF)435SYs>5KnF)<8Y%6b7sb?q4kvs6@l%u@JC^n%_oV< zsodndLIzvIINy!L<x<j91=#_i00@jc(vD~EtjVWh<$Ye7yb~z39mL$6Z9cDRT50Zc zbmFliEf^@4k+nKCfNvrN5708hvGM`f1IYqsW!R+OhGM@3#Wo$S!ujAf72}2KCRi28 zjp4LzKUCcl7#y}m9ACyOhgqkFWqS?m#+75b(6CpZv10S{Jy1>%^t@XIdz%lF#WQfI zmMq$Z`p?9<jQEQ|S1;y#A#>&wBYynV2B?L?G{?%%pYp(F<#;s&xL>oo75o0;;S^(E z3U=zJZ{Wl)-&(v;&|pT{{VQc#>o%bxWDIAmQsY0a?OqHQ?L;fr(R!r@D$d1JTsKhi zsNkQtCZkfcU>UzJtXfc2nV@Ai?EV?pxwmRo7Q(EsFfU4?p%Uo>sn|@VlOAWseEv)U zJwEYfIf6|4%QJoS1}*lNb<W>z)orChL*nnYXiJlxG5%tYo0q2<ycR%g;dD9!ij<`+ zYXOvUHTAO-DQ7U2<c|uu0Y{7PriJ0ibBg;XPT|__A0;30vJm5iJMs0Vk5H!3ttKrC z67^EfdFi9yJq_(ULvY=$#rZq9ZcOEr_2iUXf9`g4z#YZvV!FV6p`h}ylg+5Om|FjO z`rc}E6eYH<knMUARtfyJ34HL`$Za^I=}W-<jEXa3kx9V)jEOR8M9Bd6qedb<$fyL) zav=0Be;o+`#B;q!qT)xUhQNHmq`$zTFGm^AH<BCU%zHnTSWYBRKlvyZ(PlO}aDNL2 z_X6Bo&*O48MgadC1os|IXhO0)^!mEab^o%yq_^=(v)X-&umbb}vh2tDCJD<a@A3V9 zlfMO3#En-^`BLI+_Ag?rQs=Uw*gJz3vWV48Um#QZ`K%V*&jq&8!reGlvI}pT8p6`L zZR$L3>ih}hA;6+A4{QA5Z1w&4apetJFGV)nOrn`D^tteR=e`4-V<6EWdGGI6n|~kg z8CC+~8>k3#-{5{!j=#OCWw=;%7yh&AmW1<=5A7u3%t{_tT>`5;c3E`+NEt{<0_(MZ z5e(BGp6%e?;OZzo`pNV>q%6i^m60R#9Bcq2RqN?_UaxH?J*i|abPYFGubaIX##)za z@cvy*8q^c$5b8R0O*pCyH;EkjeEGT5PL@j~f3EjXIlR#|7^WbSXzn~7EynCB93Apv zU^X^*GSN6gK`GI~h`sdN8Z>Aw;_8Ro$Gvp|^~o+c&0jzJ+w%k_aK}AbaOr*$5-`uW zF><Vr;MkR5llCGF_BPs~kgrtW5KMJr(*|@|X{}+>1s9oCL!AJOSMP4XbR6JSXqeD* zlf#G6L*4VB-DqvbpjM%>wH%Y>@%t(P0+#pLFf?q1n~DMJ-6<&l+Ug=W>kHu~3vV{v zRp+O$<6Fl8TMouxEX!Ci_Zz#qU??_W-=BR1g-zuvikC~^elT%s=P*wE`~U`ybfCGR z0p&9~JpXq$VvxXJ$)zR%v(1H`BRx?A*Hl>GZz-llkCl64Q3HiMkj5?{!dR=PWQu<1 zscu-FCD1bbGn7<`<fR%Y>a+mCswh^#XY|9T^}u%-h`Ibbr0}btoKr$E$z+E-@OL@j z>(4<Sm_VtNEjl>2xM3?9OTc$zFUGk77+%rCH|~OGM;U(grR}ikHx_;(vSec4-A(ut z7$5)uKmbWZK~#lox&7$8r};MHmtz1uc<5paLA6E<s>0`6v11E=st6EJ&qnT(#cpSQ zDlr}|?S?ZD+h2I>fLg9aJuR)N0tz(E)<8z($pAt7XR9~ieUo{)_k^y6f~arY4(r5B zLKajiip>aYEr%zXq9Nb+edi`nG29Cet;AW&?U+?xW{FQIN6C8<fLI3!xW?Q=aQHKm zR)wz!AAd&FCopR$#51oh?9T-InSv4v?*FIHLqo;Xbe(H@4!``|*TSON{H1y-bFNhG z*xjXqd~!+Q``|5Vyi*t-ydM^M$c2T>?B$y3c?S8A+i9Q5=GWWg1lhYWOY0UkFUR(A z)&T`OeUYjZS_03-+Tn7RdKo95HjfSC?gcUs0os4`t#TMgV_WWe^-cwj8++%=)SzwQ zoGErcDcJl+*_Lcxemv4}LEyetyU>n;Q3*wgVs#k|RBre2FHG@0=qb&kOurTH8Mj1@ z<uA^C7bg3HLPJzfF&=bP+=lPf+!4b^;*ZRnPd@bZ<B*>nhw~vlE?hH|c;GeSQz*+^ zB52>~j}EF&7r1}_r53aujvjv^qB`=SD)bqb`j<q)WZn;zd#LpC!58IF<w5~d0`6zN z3NsO-1l-Sr6l2FB0rz9eXEmQ%2@n?y?}rE=o{2Jh&gLSCc^;&%K;>ly{ZbxFHyB7i zR{ali@b)Sh+Rv^r0KaH68x^>}nS=YA$-^zIL&S6AeE;5H{T|uC0RC+DFY)9rJzskg zSgpQAEE(L*_j(tVaT0YjUP<LE50$W7utoX4CK{LIFEt6|x_{A;E&ckLF0@Q_pnU2q z)UMPQ;X_M2V`{~j;w!PgXdCSE=$ne0ofG)Th3`S_4mXt<8rNDopEhm6FB>03r`nQ} ztmnGTL@QK<cMe}T`>l+%p=jyk;{Jh_-@%KPO)-;dp%To!1FxZM@(}%{v6~k&m6Z?e z#zs6{|1i$!idR02aVKBeNsKH?kMc+Yt2K7XBN0ehNkRhaxqsP2<-+Z=7m|=hdR}E@ z?wVB<;RLM|ttW>4<x*MCZDx5{SL=EQ!2s>Eon#bS8l&V2ynkzh7A>XW8)!C7C0<b{ z#}X{HlhtZHiKQz53U|22VR4RxwX?)R3&KPNUhgJD-DLVKenC)*R!e|f1b0KN2Aj)V zkjXCtB@{ZmrfbAx1{n7uBq!aX1PpUtSdaC>?p#^Fjb>VdY;i!L@WJmRv;K^J9;|<X zV118&sn1$2$flk3uoXqF<K=#%T^CF_(S7(*7z1h0Z$nKn98E>h!CgU*%Z>^%X_|*; zVIvFwggrd~!m_CI=CYxdK;{Mk*pI(&kWQurgXKd{cEkKU!8y^JLOMx=hc&Bk(K~|i zaf0@?*5ii%_8`>8aKKV9z-j>ZgJ};P>BRp3^D|u4xDE0m6aM4RuaxwRg2GARSUhaU z#WM?_#$fP@LR#5qD~H{X8el&dk2H1(N@8sug{6=CzjXqNGvi4WKv}PYoZ$9AHQDnm zK6upJVTr>G9dGO+G9aV%8I_w1{WdZ`zdZx*#ms<w6D^!#hXFHNr!l9?46Chz0Pf<W zRq!99)uTc!4nMvV$C^_Ea3@-Zwdzk#D_6Uw-iO=WzgPsf!-H<;1>9<H!?qqXPL{3& zN-uhjbE2@DaPIp(92)~IA8P=LVk-c6j7qX%cf%D(&Wc-+stkpy!ui}Zxa**wT2OSf z7gpi<iaI#tsVmJI?H(w{XE8lt$M}@6q!sR3sDwA!5P5H=*6l_e!On8W1u7&gSTYC? zo!P5-_I6svoAi#s>dE{b*mbrhT=&{S-3)0<u>bW1;CHZ}x$Q4MhWhI_XRJ_%zxOiE zzaaKQ7F^ZdN*H#n1f-Yv4QM>F)Sm{_a{R}AR@h{zw_TB9owk{ZA!-g4Q&*f7b>blr z)tGmf77tdopUXu{_#oPPfl{#XtJwbo1J0hsc;`X;2P<G4N$mak)%|{Ss22d?qO8L5 zz;Y+@KjI$13@rg<!bJn_hsLd@C4_1X>1#z9=Ry3TPt!Z^DY*w@R7Q&A+TD}*#L0i) zH!->T4zPoJzu{5*s(5>(Xp_EIWp(53zdsDw;0$Iyt4DYH`UC9?MUXxx72V?~6{Q2* z-)n8cHTx5L7vfdYyAM}kSR20f7%xmlpL3kH_n;dk-N`AorJM%|xSz7<vKmkV?q^lJ z^N~xy{p`y)6Dgb{!0<4C%R%CqS|lkaC|`h?D|oEpQLyRjBnF;@s&0S-x0eb2OvFM$ zLJ?-!lV~%m3EVebRtTwLTNBLKLLo#P?HmHrSRw=?wop{D^L*hL!1U$wY2HtTC3^=4 zVfzT|tzbIII-x-G7VGz&4G7@RRR5B!%q9P8Qv$2ew_FPqZX?TnI^V04e7A)XmQdD_ zT<#>W+Wkwb+lrmm4%Cs2zhLG<Qf&Ahg3NkKuErasSE5^$_`-WJ7s)=?@e`P`%>JM4 zTJ({r@lfskc(!<Fwv!5rf3@38XlAO(zWKXn|7}f!_fOY+0RL5SeQ2>_o^Rsf;oW_& zpwxOKroVI_`Uo&OTJr#&=KGb3%cpjdO8%uVxs||bj9qeDLMgRON?^VBFT1?6sHb^) zr6)5RVv%I;SDMhTD#m*}ZUnd9+f2UH;f-vw<<5mo`(U234c-?3=`9uEzz?sg08eY{ zf>}uTD7BM>MYXCPtEdQmt!n^sZz>z6G92nN;K=Ywphq%=3W8FW1NX12P-9n>hXC=V zjbUNU<YjF=W&~16a#@vt*5!lqSU)CbS8imN8&oLL%5ipLscvFrre#|#Cd>4(yd?ar zXvmIJM;BNdMVl!#8=z|^U^hi3|ImaB$L7#^vM==3nm=!CuE0cnLDtLBFy_Q9-#!6( zXZ8VfqA=bH4UYGnhuh=9)(>8bD?V{c%rdSfa9?EX-ETgJzPHa|kFg1(A8f;~?yilQ zU+H0N2^4i((a}AM0=)($E#<J5L{`{{9m~q6(%5CCOxDVso!v9o{WUV1$FcMwFD8?I zJKIa08vY`{qjz)X#Fun2qm5l+MWmV5L-rB@{N33D@XKh0M7CXn>CIL+HQ7nWGFk@p ztAyM-eVE%<j~74MjL9^WW@5>0tv##tO{3cO7JR-XaI;_p@3LJ$#jF7zd%qmVHp$_U zCExCZEIi#h^gOqu5FqZA?<T<hI$DMxVP-Vv<2dPXaaYpd{ZQa>k-rd?(-s8y?G324 zc)w;7&g#-1->E%57&!)W2p~U|C`-3g!Di8f6{Xng!EW0m3P>JhRrFy>mde~EEXtS{ zf`eU7{Ds{&MRtACT?SICub7Eke)zGoEvP!Xpgej8g*f)k661cw&PLq(x1UKQnuPt# zj!og2-~VQq|Mtf#BetI%!v<*jm%#gjn{{|%GcB5=>GTQ%YBUW@bESo^SW(MKmSN{R zHsTy$-<|z^??jpQL-Xv{D)3)-&0s`foxfe7sfK}8;)Ij2O^p(;Kkbb?UT$=kV-FR3 zv~zyQee5~B0Vt>#Eso-+q(w7@Cjc3ba<?D$3ciOsJa|_{(g!LGEoa=HPjuNoC1qI2 z^&O2&%T}J5cCA*G<E_Gd%Tijp{9OObXc&HV=|-G0Ka~t#Zv6}nm>T2wq~6l37iKD* zn|L(vr>9boW|qG>57azY&AOrBeRUV94mn1!{*e}a)gy7^U27i1yV386584;yN)@=j z#aV;9pU<3jc0jAdn;$I3q$+*on`G-t$gAa|2b<r?VcHUKKiO)^jeiNapM5z?!2RsY zIMXRiaga63VS@Nwni$6%vB+wRWggrt?g{o_0d!VyXd_tjE&LfcbT;xRK-1z}+~@Rn z@qVWBxDn&K#DTK_@b_eB0GBNpiiNdY0r$(;)`T*MPzn(WA;MyVXou-KTgW>g0R9W0 ze*ySk0Q(Do{{+u>UIy$7#ej63Nb}7N2H=+#Vbg6j8!LP+`xeoke2{?sM672dS_}We zo`f8FiF%j(r73}Y>tFWF_VddDnoU)}%O961;8E~Lpo5!}Q#bFq_;W;Hen>_Xa+)Un zeE$om9r<lC!ScqhTV0IrZ~iiRRgsw?vYF9*YcqA88T`)KZ;%x#@&aNuWsz>&{Uv+x z?S=<Zie`&r9QXG=3v(6}P{xX`!cXh&!LTy*&5V3&Cn*V83Y0Sm<Z|qivqDJ;WlaJb zrGF{nM(YmGG)jaCYG3*w2EndB&GExYn)@D1a~zem%FR;58>P);Nqk8~d!K6rI`?Q; zm}uaAi-u$+204m!G8B;1nz&l%RDP)VOVp_p;Q(EkT#M)Q&6rC8BrUa*M5Ue|{;u-Q zpx!x1mh9+&pGY~Clalbvh!Jn}B?jP*6vuM#TWgUDd+U8rE5qBPkIGRm5VY@*rN90f zDIe0kl@ic+31>V$h|vg4s4IQ1ykjwFQQT4nYjI{kwZRlr$9pj}GKJP{4X{>aR%xzi zbPgS-)(3dMsk#WZO{GDxW$k$9TO+9Z;b{b%$$_s@$&di0jup9avAY`zl@fdZ-~rTJ z+a5Qn)dudnX6EqhAATDprXn;r%y{d6T#vKWsjm;jE${~LAQWw^rJ0rCdL6q6P}_P2 zR^R_}Kgxf6CTgo!UuS`DhYDV!4?g)yOEOUd#(1!N>=MIk_#-aTYi(rre{lxBzRX#9 zkrOD2-CEdM$KaNSkDtObkeMsBM~|Wdh4A(`AmgN?_tDLG>4u8TM81Y&+3C0h)y#Wg zB~WlLW`aZl4(lX7`C=i)uB;|Ab-1E*Sb!)Of+c(6buY$FE`g{+y{cIc4Ii#VpddO3 zF;(#XCc}1kgL4Fq{Wm!qp|CH^8Ai&R@Ipy>XjU?IZua?b<%|_owlSz_DR|U4L)m4< z+H|x`%Eexp&q;9g5S;$Zy`$06lW|Y&PkvR;HL3*w^#Pk6ediYH*e?&@hX45p8a6dY z3!d`*x4-@?bia9eF?`d9$i!Z=vhA1x8nhp!k_0VO1>KAH$Z%R0t~?Tamh7=YQwJkK z?ePHQV*PE#V<k&H=c_q#setx_S#uSr@Z;Mih-+JT*GtqDaB>||C>=y{wcZlkc-oAL z&eZ1AR;>?*uJGeRwT)<>#OCuduJKf9YN1z{2>MU|+vqf3kCWQ!NX3KE@54jGZ$i#= z6kMBC@LE9v0XfeXe&U?U3cM%Gc0FHvAI|7vTYNOr!s=G*>riq2VVKiEJFS9xQU>)P zt=$azAUnTOmZN{6!f<iqJ~U#+*T_xLZw)vvEn10)m+e%5`&HgzJn|bNFg;6sLA-Pl zdG4h(zc=o)U`CPtI(;JPE%*t*Yz^R+=W>}QQ<i}HiC0lBeM-Rn>`Pk$?q^@d*-T-z z7t^v?wzV2}=VbtYf1U#P#ll*)fcqwwAG^-lP;1hmk>+K!>XoLg)@r>5^DQhZe4lm! zHiBEPi?AD^?pC9W+3Z_F%ku#O_OFII^j1dBh4qwgQ6)}txskv|?_WMJaST^?KasSs zXH0FF(UhXXdYEhy+23FY&7fOTj_<X9j!e0k-S7`hBi4C7wwXpUyngBo!TSU_t`%o3 z*ouE_eT>;n56JVt#0l)_`xO+lK9H^xZEJtSgJcJ3NH;3vV>?N^P*Mb0lR&P<E?Fyp z6md=^uo3&07H;sgcx*6vCJ`VjRYHycX179*SsusaI-E#D87ram^4QZxY%{A_9UmqD zWH}qU-DTkBDuF*rACz)}^A%pQ0A_Xr4cy3m-_VLnvef3NQaf4AR+C!VGH#M@@jFq& zaj;1+@F$_<)H`X!3!RC91eWJ62!3lTHDX@_33;?D*DpLO3!c%|E)ObQ=Rg92<xzEV z7=sgu&kg5Uup3KZEjMH(hoXNG?5qk?cH%D_m_g_H+yR5KA*AY(0yuVL7er~~e#wWv ze+HVjb0e#OMU8VLr?5>;!Bkd&oBsTxFxSNf^#o;`4{W_-bfj$*E!eT`j&0kn*y%W_ z*tTsO-LccLZM$RJwl(?gy>r*h-1%9nR=w-_@$7T<sdw*vyka)0b9&Z{H@ov)Se-%e zyS|#2da9Ev!obg{2xHG2&g+W&Fqb~2o0;8===HqKeV7Yy*Fn6Wx8y~9+_^08ls2@W zhcCg8yp)VIUx>I|HErq5i>9gE2Dp5cp}yb>S@CpW7@|=v2W_}}^FDQ9HE;oC$?-3a zRg(5AF}uCeREW>pC63|MGl9*5%?L-Fxyp%=+jHe+vHch4@JaEB`fqv?Sj^LU-uFc$ z&j=95mAXI7!#tv$@~(01PmcEN6%DAf%RAceAk@cONU?Fk|G>Hf2Ve9Hs_5yaEbTDp zRHVV7j~}t=+-r*=(4;M6OHSA_=PolcL=bvkS2JKnRB4u@8Q`g$SQpdpqx(-YB<s;5 zps?W2kUn2oHiKJ|C>2_EI;^>k?<nmG*+VE)fBhmSFbEVV@dRA2=lI#pG&czatt!~- z&;whm>pW)Rjh0YFTZan=+%B=Dv5C6UC6m!obV7J+;Bu;Trjg+v)ULQF)@4p4A}9)) z_W~agJmH(t^&8#{E~6`CS#-;Kk*d$)s7ow?Ft#oF!Ve}<aAlZ%ldTE%w<M(UdSwG% zCP8B0WPjaBM9YdnF-;t_e)vKxNyTAofl&(Yuef^B{Lm5p*Torm5UBsERgL+|P4CP~ z!!=<m`@7C8f<4`|Dh{@b^rK2I@DWWNS_ZQPh|IK|RGliqkN?u1Xq&M??s?v=0$0M< z_)us($LY@2@_>W8-+-5_LJ9KZL~|L8_HF)wiJ~$2?^T@1%z=21w}$LEobbK@g}hhh zvrA71&chhUyQQf*U4;p13()34|0sbuIWt4ZA_V7<SDP5C!Q^Zi=I{gSS^LVCpP{en ziAQ_#)}+l&QxDUC`Vg%FBS|Xt<G_M%Sn7363G*!VEv0HM$$!54N8rI%K-8Diw$uF} zXtzj|)E%a?M$<Ne3~n(7oIep5R^1hWVC-XU&_8a>iNIoY(ppho7mVj8IiO?|48JSv zP0pd!9}5S~n~3_YU>X4b5N%diMY;+b1kjL|VA@J+`Uw8v`RAF#Hzy3~HOzsFdlZQK zmVl~^rKy_?-Hf&0$eu7fvkpN2uD&262ayV>V+gR0)2-9{K^>4Ot#9<i2y%WimA`5g zG9>peING!XM(q(f_iDFzj?K>qufTamw*C+16InA+K+J}z;}+~aIO9661Tr+pLaQ@> z8vsxFr;5C?B_(wfgB_?Aw8-j&Kwb2o9!t=dJ!+m9xj)yc;HK^F5G?kUyO^kQYAG-| zVs-RR48KsaWBN9mC(4~O$YH=oAT9Y=0|n~VhaF9`ewrW@rI#`ZrRI4k7T!C~bpMY5 z2H*CEOj+;tMlV7N>E&CyMCxD7lCm`k4hH;cED!=E>XR)zDOKFjSju=Qjr>hxKMv#v zjp24^dhlMc@_w-M4X&;CX({%kJzrAYD~W3|72#9H!$}lkcuj>jVb3$CLu6V1oLq~# zDx1h1`WIB`{<%m4UbiermfXt5e{r1Mn|+lTY)!>;68gG{I$<+8rDwL<^AUf0257wI z=S28&fA1J8XH!&ljBATmbHS)jFC~DDuyB!2@nw&cPww?o^&c~-+0u){BCzaDb~T#F zk?}@ski!p_(0GJ%2+ZwR^B^$!6j^twfL`_GjJ19gEuRT_j`X9c$8p$^NZa*-zsVyG zs@30m!X@n{Ec1Vwl!hCFzQi!<%Vq8H56y7YT6ZALRh&(npy;q;fg+@IVN=oPj72JN zcl^OZn4)OTylQ(p$Kwc8zA4<(1e`(RJHZ*nIPXePoYRv|E<Y^x@olN-gy#r0*AS}t z$?^Uq>@*elYyIO%e4zVdOR&GEmfR#sF2~k?tHDuF0Rf|mtM_TGvk=eul7?S%hLJ*L zzQq^r*C3UO`fOX!4=7qDfa}KzSI>D%Lh&{+g?Y|}V_O+C7B%J9!PRjrF+LmE&Xph2 zN&+T*_VV|>+cf*4U|1lE?J*r-gL=lU_$si+r}2>`G(xRx>Rfqe<F}GVLd$JqX^`?S zlk`M+me!;*&OP0|CgVV|3-x~X$c;s?b0<<-Su%VBJ&5?}r&`x7bQkk|og6hs`N~{& z&>7y*qiK`(DTax9le_YHuuI<wPowFXG%RME?XFPcq#W;d$iuv6qvV4VGADj@t0B9m z(VbNK2iDPGh572pkCm8eF8!ZV7q6$@{|O)S7m~I8zN^UF?KibpNps*(8A%&#u>Q~U z!Ov{o4>#}4tDPVy<XT&kifNy7H+jL&YR=DrI6i|yW&X2yJJmG($|h*NP;-1CMRn5; zu=s&yyak-L?WFIkI%*pWt1H@Q9-sn`k=``|zi^Ua4XwT>Y;Ae@n68;)+M4atdaada z7EAmtEOe4ZtE@o^Ztu{qD@7qDac$5+A-wiebrJCUF$n`$u2(<b$aPp>1;!|lLN=!7 zLsZm5{MPP0qN$U#nWj}=d);qaC#_xOw~dav@Ks<)HDV8jdlS!Yl2+RdNVjhePY}<~ zJYX%|4sop3Pf@+C#;?qZ2&&C+J38Nv6x)Z=uo!n6fmLGaFO|<82Ld!G#)~{E0?kR` zeet$cf5GdxT{Ra1r6SD4L6yJih!#Nu3!=D?F69$+`Djy;N)n`PD4sA>gvXINr}VZd z^lY*7Orgizm2`ir2^YC0ras@YTvKS#mK7;iX9)Rvpr5JMBa-?${@%_4PbGl2<i504 z?XAG0^k?#ytZ1zN&GHV=%}%>r4$r7_md`z#9cxWcDhGJ@z)+M&YeJkunPiuL4!YZ- zcLpu$*IDhF8|q?L{|%B!!6|w)5Bc109(DYX_wFf`E$}awM2uNb&<EabF=fQkC9YcB zBhvj?p=nw)+5+;ylaFUakEeAGoqRgHzbbS`?e3CT-=^*k<miSxt->Z!NA7b*p^p68 zN*p8!7XK)#CI~xymR#m{Kq=+e*)M6{{$O8z3})%$7i@?AIO|Ms{=gjn>zNB4`*<EO z@hz6b%D@!jqwmf6#Io^^)#qbjAD3Q$*4PK1h1{Nd-Bxj&cJ+m${&D6$ZK!#7Fu<e^ z-H*Ep0S9V)b@`#etJlTwiCyK{7ZVD?EA7QS)WH^11{wHdTNWypvvH+CvA=jpAksVU zWn6}60+ZT*`DZBF3Y7C<LH~|85Ugy%Jzp+{I)#;byX&k2vy-tz-dfc~7ecljEEv9e z{p#uWJeTr3h`Pq6kxUU_?FWJsLTbCIIzQVS+}86+z9ru;&E|EPd8?@DFkH$|B`)Ef zt}TfIJ4db<mV5JH{F{`Q*q=(PNc+c5uKig?CNBzvw!$|>5T^HKw~l;IvYc!H`pd5) zM#H|TPk#pOo{!qOPWKnTPj@B9kV(wsb+ngGt8DhXW9t@?Ge&`J@oL8dPE+PSbOmQv zFubl5%w^?h21};C3#Dz=+@6A<l|k+@QJA?3_!J+#V+zr&lMt$oB24GSG0AHb#OIVb zo|P#XOR9Vg%Ck0+xRO6u$#~N5nCt(3MN;HJCkQu#wh*GaEy?q5TBHxu@ZI>dg3?UE z{qQ3SakI~TwuPsuGh2E0T>EofbET^w-*emP%LzG>c_o#vApZ+80`#ej#y>908ZbB* zB0#fnkBY$AFL2ywRo0Tk4*DbUDO0K7b%bW}iu}8f$PqXH4<+>hJ;+l%<DPYKJY$r_ z3f-Po+?tOA-c_8|&7aO2%B@zaat)1d*LSsmndrue6n0w)*NTjOb2yIbKX`^>op>kV zWk(5GS+^!3TODqgNpVdzRs^K5-K{*7$~=>wJ>?lCvL&6Hm<Fu$IkJOp80_kQ%!{oA zE4iYpb{^4Jn~kM8NV0Lu%Dk~0OWvIm>0AZnmihE3WZG(X6JOJcUe!?b@7sMC`xuso z>Hj!Lr=`Q(6=7pe{e^*T^|?p>Inq~sOE!gE%a{Gn3QG8Gi^AN`Fh%%{MB!!Av<bQ6 z3p(Qo1BM};$0fx*Z^r<SMKvrEk4H=8`FY#Q9NPn*C6JVL$6IIQV<&ZZCXaeT%o$}* z5tZm^c^lW9z&GS27LqOApurp|yP^~BgT`pUeYP{>>Vj<JR%(ZpHo!VYm*tNPb(43( zcR}2jk*mn^mb5W-Ikl|c3b=Tj@)$>6nFvs@7*c6_ZAgk=m0Bg4ID<ZI&GSwP%H^($ zW^nuV5G!Qf_8&y?9WGJrw=@bz@I(dq`w->_Y+3)7?hql@9X&_`k9;ec@h~u0Sk6_O z1beIm4;XVC+03l}4AF*dOA^J#o}S<lYqC<7sPP@mhMaJ;BVD_60{S9=NZ<+SMnIZb zcc%Z=iwD~L!WeTAS5&Zn>cwyMgPv^e)`>zR#kZfJzh`||vK`tK{7@`S3!c8SsJ_`p z>mD4XL^70d!ljd^&wd|!NY?@Tu@D^68OncHVK*8OeM!08{61V_RJ`9>1zF9%9{su7 zSPSKOgezM5vEtFwg{p|7rMMs=y<-jyr4}kMJ>bz$D?_mxiyo%WtsXz)J+_LJ!|D1$ z8Zv#*x!d(U&bV99MdQs~kh|Z_U9@Pl>Jyv5RW_<VtST+rg?-MV&+|91F}2rySEZFj zyT60HZu5C1boFm$B1*aIr~V-ldt}TIXiooR+j8-8g1iHb<}{JSUJH2uLR7sD>##-e zpCTCRlhRzLCh4?y22<yO{e*}Fzw8;E!_S8=_Ci`dZ3NL(*+BNNH&i3<>ULf%C4(J+ zy*~Xj>Y3?$X#y>ZRx|lKq!`y0YAj`5vNU+~r?RjeTNP^}iU(s4H_Co6(j_evmnIul z(Oim4p#(1XT}AN~uWutYcEtLGhB^L1a&bx#dKW+3lGK|bteXvxp6ETZvR33N=zKx& zzHXCboU*!RVe#CX;5a{<kqRDv%Z&^!9~6Ck=6vrXYDur21XhKqqpT?R|1vA%W@`uM zazih>VZacLP4~p?KRO#_@WTH~@ttxsZqV?e|NCC#P-`WY^blAwXdi{+gR+^I>nA4^ zae=SOm!XxYaGk;Ry;U9x-(~c7TvaA-*sII~AEvz^_ED7ExV_dEVTbIoxf<pyENJCD zvUX1zTOJe5FC0Y7&E)tkV}4!12SmQAF5@8b1K|B0ftF8v(utn^DwNHzB1DECOj8E9 z3c9}!<<d(i^zxJVhMO!?9a#rC?0WZ?GTbVnS;-_|{BnRJ7T49(41S5vqOa+wzk6-w zHX-Hho7B)6%JC|H|D)Rky$2uydD@Gls^;G}6#BgcszI9J^rSIU|3#Ah;*ML)*1IEf z$qF2na^2JBFTHXQ@iC<%hr|legBZ`MWZGPizV4!V3K=OtFM+Q6gzSBD!V9gEXwJqo zxU2MS`4wi>TGJ5Lt%&)um$}>tPibvcBNy?AstP-n+(8(CxK_3tZ}kM$wS>jO*E->X zbIZ^Fo#my6FxndKmG*#Fh3x|e2uxLWaeDpjQTzcTem}UUx+hP*{=L;)`#;moIw$mI zT&*Ih%8vH}{<Fg%0(i1GA)2jQ^lrdqj<8_by2y^>3S^7>qwL#Nr6RJ%C8Nqx-)j$) zmv3*=5<X_p#=r0*T!CP;w%eMwj4lnh3$i(r)Lj`}&=u_V!fae><1QJYQ{Zi9=q;n4 z@*mAkp4M3DiiIhemGK`q=)n1AeTpFshM9qHCR19tSS8q(VIOA&?)fCm`k<GCDacD+ z<Fd28{^xYwoYn<p|2vrwONZ=wExZX4N);8(MG^4gN{81ZdiZGYcL<y?L&@pFaihC5 z4pD#kC(c0fS>3R7bwch3wbSDgcNMSAU~0FYpqd(!HuZ3XJg9X+OL3bgI<1@{8rOlD zw$^1ajX$d{7M5M}Mk}tDfZNfoOC9A)!_x7c`wgGwlNrFerPu)1`(g08_sUMDNiy+^ zPLgQJM+P&JiSQtnfVb+E5DG1J^EFTH{csbKYd#|27B!Yjlz<ayVrTV>59}pmw1t^Q zP!rNjJi2kbg?Zp9H<j8Tr@?ScZu~+VL$S<dz?Jd*?%5mEK2wvM2AyVN8FJgztXbzq zCc6cxQ9Y<n<=`4$^Vt>hCw;sNV@(((!FZs;^rduWdne|VO%oZ${5GQgn>ekd<gHno zd60KB{3iI}uu~lg245v?%bBr#+AFjAalpp5zX}enWa+kEj-4fFGaiZ86EaF0c>eT4 zT7LO}6b(I6W>rYT9>~*y9>1p_4<b|w9Lve7z=FR&H>x{O>e^SmZ`+4_Y44BAx1yty zEfwid1^-{}iV^}&3Nxr91SIXx8)*ZJ>znu5<epF5p)mbAM0%!kr_B=%8t7$0GW{G! zZHSWn?4iLGRx$D5Y3;hK6#C?ajc!fpgWxiBQC-{h2e+Jz?u@8fnJ+J_>mk8+M`kp3 z&R@dK{EqzdEpnxNC{t~Wpq>*nnag=S33Ucq-bY@k67o{|_a9ku<~#&AiiE7?-eDIp zMaNXXjjVv&YPtlA$cjee7G2F#>$KTqpzByU#b#Fzd-)U|+jUYF!rUP5eV$=8$Y|58 z6HB|nO&r<Hh1oz(A8b7{b!7wP8@@}N{$$EWchQo6qU3WzgAc4(nKWE1^e&zI*5vs} z5nFN42mTgY=m1@?`z$X!HIi>x_acQ(y`Up7K2j$MhIK(LINKHfRnFC&lq!-OE$zCz z*ibHOGQ4uSsF^U!x{dbz`>hZL$!HYrf78;!cRBf=Bqs{Qg5$0`VfPV!QvX^Iapyvz zaZfddm{NSnVYV}B^^l!%*np1}1ZU-T5TNj{qR!Wf`+jXK?=Vm(pTcGSAtc@+g?sc% zOR_Kw?Anjg*^j^Np$__wf{TiL=bjJv8L$_~M(LiuxwkuhW-O~ABTby&X$;!}l;q|I z{PX3;f>-O8bNu<NF!D7yv=A>>Je&M2nU-R4<y(U$+v0RY#z+byD#7U$%ldKQ=QM|< zuOfC;jv7O&^0_GeXN8+H5Gm)4;-J&9*K}w;63F4r1#|fJg8;_^NgFCV4jbsbGG?Fq z!0KMBui{;e^LVp;Y;cbE%r2*j>rnIP+hI5=N3bZ(J6h9HbgY~#L@~@jZ7K}g6iP<) zz-U!kcS~0OT~9V5TmBGP6j%k+G8@W67ysZy?gU3}HL?6m&J1}yYF5WEK10_(dm)@2 zT+FxM)uI|Dm{ZG(GGN&$bWMbzu8QHRx}VC=fF%zwp>y!ffmFyzG0L<qSW+#k?F^i7 ziA-^dIOzHC)dkxm&Q*6z1kaZuTKb3@lkgoR^})`OLKHKb|3@NhbK}iiEK$PDk=5z) zm}=9QPN%KU7E94AyWw{ab(H6Kp*(PG42j{HtOk!r4hcJ3x=>nPC9EWbG{_a;YrJ-G zA7kKbEk%4BDe-7<ChA36oOV3vy=H~S?*dc(exabx^wS~aFJx!VYG~T+z+abq7Tvf{ z$BkxV(NIiZC&Je&sDRP^S6a<lL|sCgVXLL&{Pn}o3`}-eS0raAf#ZP$y8XW|IbNTo znRk8i2bEP><Xp4A@x|LgO9<TrS77F7`N{TU!K_JR6<=@yA7v70-B?_5w?|sTWhd3D zF+MIKt}V%so2K*wv}}S!igvL7$X?(XLA~Dy=ZxRwEB@8bAqW|-<*4YQo9=GmSc%H@ z69wD49=idOebrt<oWlO|QwP&Cz<r=qr$M0U^gTb%6yC^?LeKmYoZlbW!*Zt3#}nVJ z1_BI0?Na9EBL``j6lj5O_)+B6U*_10map@ZR<PF$WU9V_fP8h@ea7B#hxdw}UPwI) zRHd%yF&)|-C}7j~LU<2eF!fyfQ0v)K=V-^IdFWHn7Y-{&Zx){b^4BF>3)|Z8lR9Wl zClIUrH+1H`(be*gi6ogluxcf_o=>LCy7QPgRFwQltNvgwGL&kZ2PXv}97nfbYm6d_ zYxfp-P!qiR*JkJ4$-d?J?U~>wVlfmY=J?_#7d@Mp;si2*>qDtUmZ9a0-LaGqxx_FB z!e;fKff^EyYi>53rYU+5QUdSpOiTeo+6^)3Ep=;v8CYdza7TZ_JAJqMF=y@p7rn`I z;?-T+aLR;>NRJPI>h$=eedAcIXmL|65;WQ3@5|*d<TWj{si2ZK(&50WD&%@2E2a7I zl{cheB!0*r*|*15W>xN$u(MJjah5UTEJa5qS~%##r8$i#jR<YS(=?~b$y1!cXPSG? zyn}G4^{w5C-i_&D9JdfadZkkgD5-YTjC%EefA$AriUq36Z-3ZE4ltT_JgVJv|EOOP zkdxVh-&}`(r5LULJMl!qGa}^M?;kNr4fHv%6#89#0JM6!RhTk3zCy}<TIAt#lW<Y1 z>kgTKounL6a`puMdxr+?o=OpN>PX7xqLqBL0e+EM2chDsIXXBLdCw18;g{0a!?sn_ zK=4g_#E1Tr;dt}+zQ*uToSNICLcwfrb;D91p-mc<3eM=UfUMh*YJ3?Szob3yldutH z@c0GQ`B|ha)3W>u^^TP|1v+Z;V&=fP#o~*<Eo&>br*gQG9`xCo_i(NWM4j+~UPO6U z6>-#i*&-A2Jza>Kz<}rps=k5nX?Kt&j_hrg-%V_j@^_2u%#XJCX0^dCyZpjl_*Kxa z6ZZtq?$B>ME}G$nSTMHkPZDUNA#*{NZg$e*i8?aBZ1NyYRFo+LBl#i2P}C_fo47i0 zy0q5`ei=nC#JK`u*80LJYX6D8!Zqy9-#m6Vnd|&*7E2x&;=+XLXc=8WYURuvW!+Zq zJtKuGqj@cMqq6UoSqdf{TaWLvj{dEgQ=}8~Dc<h`J)EbvjCa!;Moz&m>mr^`gJd@j z32OO^logw>$-tArmoH*b&&dg*;$a133NY4x^*IVc1d3MEtP_+Jgl~+2=(jbA5t2?o z5l$UDhkJkB_HC|8)$p!<+2uFyvN6kyzac!@)7$Iy^M&Mxn$E55BEVqf>A3H<69X!l zCLis}h~1({{ikyh8<XI95_nkHQ^fy{f=#n*V+pjwZy)>TCXR!6MKxp%nf_+yV}>51 zkO^kJ^C30B=U6WO@Z!h?TL<=;;$*EWi(F@Gk9stoX+PQlQ(ppgSFW0vp>E`#sPEgG z%Xq{%qJ>A4yFv(hj^+Q+x&p&>e)Be||Ni1j=d31DrfN8~KiDuMQS6eMz4peE1Mj%2 zeZaSS+qwgu>&^)1)NV*`sU(1U`juz79uQi;=#kqMiHQS>Lf672kUKnpAwO}lTYpGN zD?zUL_=f?a=7ngu8~hZKjsl+Tn5ht+5Gl(2n*;IlL*Bo)ajwvjU3`6+UGZ=4@l-k8 z*m*&@Dq(h_{18Sy?~Kf+Q_d&PplKjemukWwZ$dj-@x3Bf!+Y!8=l**BxJ_J+HKMdl zBp<KK->lfAibSWC1O*S@^jaBwd=&&kHVM$R?!7d0V?G)l?`(0qoXEJE%Hnl9<ULaL zZ9*T>C<V6cf9Q~0{SEISlw{jvL&s%3$>!R@kRi68<k53v?dvl1m#iJX%F-1&Tb)d8 z6IuvAxe42(53zK%oY)(c>>tOH)9|r}`fIz!t!dja#87!Pzq{Yv&7!h&YgB}M$Y4!M z*GtCyv3@PPD#Y7aj==@A5H6_TR7^}KV07ExO>H*O2bc<r(*#IRhiS{lB8{{jfv?25 zjlM4ln(HMKO_vGph-;NZlPYnk?h4Fpkz(wY{i!@gf$EM6I4ws<A=XlxaD+<+Hx$PZ zm=$X><>H*fKLof>-W!J3)^z0#dgDB0l?ef`I)lQ=1XL+Rq3DI1ED(;hK=qXK@K_wH zn0IdN?os#t(vJurI{;z0tIik(R$1?}PGP+5u#B<8!1Rj1JK4VF{>b`5J6|u!UL!=_ zs?1W0OUeUT?gBx?!aWgh#J%WGVwo+3UL)KNf{)n4b;0fkl17?gDXGn7eW4&ER|@fN zX-8chn1I1qI%*fTjLw@|s@qW!J%`wi2pm(&h7dM)HC3}D^$)(0r6ZvV^?=5V_xJY{ zNUw>rH+Ua`95{X5PK}+Pzdd=taej{6Hf1-7C90+e>)P_U%@oetwsmKSVTG&8if#MF z!HWt+=K6?hnUXElKGv!3em)ql+mrg-lSRJ6d2A5s?HBMU-OB>_-M{L*-7frVakQc2 ziTmv{lCK+cIm^^hEWSXnt3w#{1n99+Gp%h*!&>2*IX)>NzheiDXHeiHFuvn84iozK z5SBM?=*Z;3_}C&$lrZ%(n?O7W+U8qZa{sAl4E#eF=%W*$PNdZ4m4a1N(HJ$4)>XzP z&};O7zWy{JAbOw9g}&xMLnq1hN8Y|LHsJ_T-~z;3oCQg2zwtL=|1{<GIG~(%rax)L zj!9JS8XVg@N+b+8I0eqTB84h6_luA<ypWJMO6WB~q5_r`k|qT^x9t!-sxY5$nYr`_ zf^AYKnurYI!3H64n0}c+Nnv!(o$<&nzwqB4@=Jh|fB@>(&CRVcoY3R{?k|5dYAe-L zqK1CU`n;VXE{4wxe!|8yd=sE6k)3bTvj^Z+f~1Olby&{*bJ`CwZ6m@4gB>~H=>zCz zrd{}Je@PtV`()brxv$2U&7GSFA6KUZDY^qMEgZ+pl4PHE+I9b`;ij>R^0y*=;`9Pa z1)N3lj`Q%A=M05bDQAnONJP|Zpa5|5=1S9^T}XhwSa7~FRrZsjElWLLg@uG;!ZCJD zTMS2dl4T5n=zU41iaSFw+ahk@)`L+cI|4T$EwPu!qLB~Pi$VzsRWQ>AvFMd2SOv+K z2UB3q7<s@fao`w9@Hb<dm4tM?KSP1rE_VA9#=&?utDp+S`Qdre5|%2;Z=KWBch?^u zgK8H*at>cTn<saWBRg^rJ8ufk_L#**F19rsC8qkPYB_TYA88XjPa~MM+tcWlpXEsP z-$vwgvPgWZqIwA+`VObE#!D18O_geC7ItDcdr*CC<X~-Jz9j<X(Q7}52?o>i1L?1G zH0u3oyS~eC?iX}^^;CH;*mUt^VI8K)-bx9N{dM&fVDs>HbngbQo$u*ioB__CHpVeJ z2-r)6^BVJhf7rUJf3M~$Rd`2>tq#nUVe8NIc!JYEkO#9mjSiMyVykcBICbT&V7O84 zLhL1}P=g1+qDI6CcBE)c#nDZu>x)Ut89K~7scC{m*Ub)Ek`4KM=dc0b^;eCOV~p`> zBJx%q0fmBh6wVQ*YaY4I0kL*<O~Nb=6#q_2@v&yxjQ$j%gz?Cj73fclZ-^@m^3al* zkJlFb;*W&c)gUXMpuCJa;cxJ1z~)tGBPO%e%a2NefA-`&{+DqSAh$1eQv=#siCL&p zm=%mEzpgN`)*ta!+s*i2^@ujo6ybv^tgRT99$&L^$o~qv>Iaa0&iU2iV9Ctqi3*_+ z<7!hX${T;&%ZMU3MZanEk47~rB1`4i%#P7Pi**GX$gd;epV}+eQ6~Wt54_alk*-hp z$QztUQQF*QIpk{Fr3sBEoW7p<NDl7VZ$9N7rIy|I21j1V_vr=vrZ{};3i9Ac<GbZ9 z_6!4Y++~+y8q*{r-p)N*pkOPAMZ?4r5&K>RN3lrLj!Apo(vFRO+Qyn7lG<YPh3w{` zA-7iUlN+)7Dti!4^cCTthn7o}o+Q;y8n;&vqddCYf40O7fyE`F=rc(<@y4IA?EIx8 z)tJTb5Wra*jqFf@Q9db()<rFZ)rsLE`F=WAU>1q^4M!3QC(F>n_66C{4@&#TUj)31 z+PvWlY-j!^0c|7@LjyeXQnNFrIV4u%JXdu@cD_UhC>m3r;^Nu7P*V-PJHNk!Ng~+P z)2oB(72)dn>bS$49o6=UQNRA>qF|OVdN|bn$;iooTnpv9g>KdOdz{^V*UE96ZS{Ln zl~%l<5v#zcODrOjU3~d&axL#4gAVRb+jHUJu!mzZlJ13?e`{4@)a1LXog;r~(&^12 zydv5bm+x1(Grw1P#!Hhe7gq+i3xR28LoU+c$l}0avzlPfjLsw`aZTx`y3?Y*-X5H5 zr@~GQxuP}sY%P_B9#E@B?7Sp7ONI_y6L9t|5P19AmbFcEZfgHV+~Z+k$ZrJJE<hyo zgXP8eo@_7@1vdCUu0Zml3@%p_#+^9b{pn_W{Y&8b>;5d+7K`-FkP_S#N=vPriRM;U z0!FMayPEK8O%N1Ti<b6xJZWdt$Q~xGEIPYsgGR)TEQseXQ^zhralGXAeX7zW;Rli! zY6RkV7*=tnO$K3w1FFnE>cpC{0-=>33HK4njGR2V*!7|uE!P`+z&Rp`hys0`ln}MZ z$8GpJ-^=RB@R1euuW{4p<`9W&lfsWkQEiHp`dI9no$fCG-q0$dvDfS>vRi@o_@~MY z<xHi8Hwwh-w9F1ktda5K^WA|XJOvK%h=R9Fp<o|1a!&C!^JaFaQeA5#JJ!_gHqLM7 zX1|Gt`$q&O-bb@w5REpkraRv-0|H}aU+eH@cA4`6SkW~&lh}-Vk%m)t_68H5BkrBC zySE!sB{Kc350{FkF|YEex~&b3_(_q+hl>N|X+8aXb+D}lK?Y=(`mdO>gvC1dVEZjv zk}q1FT>;wBzbV^pP+<ldyH1)#T1e_Yj0nrf;0R9<0jjkRO$4X)Sg}?lW7Y{#RF`nC zc>GkH<_>#S#2sc;2kdG@5@r#|A17+?BhlEHp-XX$`N|XD%Vsa_YA}tiEF4pL@!HK; z4>6=uLAe|RnXk|(FNZ(7?00?7nPW|0Zt&uV>Ii6=?HJ|S;6IN=HBLjf_5NU>f?Idc zoih2Oe3gicEiOruoX}c;YIVsY<(b~VNXxJ102p4o0k7AeZr|(!oOtu97^whk|Ci2% z*`Pn@?hcnva;LcK!Z`gX9}KS5xkh2IA;~e;jGBE+DdU}!piv%_mD!{im0eL~07aX% z@TxYQ^K}}f6=MP&k$S?(n9V((c^Yy`PmaJ052giMjCo4V-<Ru8a)--`<+HxY0`==y zTbsVbM;xuPb<@ir)RcLwCZ+CA8C$xB!Z6a5wb4ZX9jrHTqS@N0t%>K}WC{N#MryyP z0zKhP(|kk=Y15H4De29{c-kVez|ELPJ;|(kJtK(ym}#P!{D>xw-U=waO*N6w6v~d! z9>-=JKm%d-Y?v&`Iqn_1eS}XI9Q^@6DvKaeOoG5KqGL?5(wO)MW5SDW!{%<G5#sBb zG{IL23w5wI+zv@x_f0aR-xa!$6_>2_3#yK#UGO-&j3WwaghPMHQ^9NO2C^c0;NZa7 zjp4O2?`p)rmdjrh#B%&dXADH&Cq471hbY~jkFCMFR)y@fOI>%k(GB;+oSaZ5L*gBY z#pBz=j4f60+~*n6^A}U%x?J-0eE^#S-I{eDnZj_ZQQlKsB(zo=XW{_ecXEE~jQZgs zSMC7>0xmtmh=!Kn7J13+UI!o~UgSy}{V!&a%7C&gL*s=fWwB%wt~*x6G_$9(m=!`8 zud;*cfinm;Jv#eh;`S|&8zSyo(i<A`<IT*FVnZy7Dvxn2kHL|%3I9h7#$X%Y#k43g zY;M?lj2NZ)k}@~tCb^I?Orp1UA?LglnVo#M6!Mr3#*!6%j0wk|n6&1;e^5MB&HcQ8 zaQsvWCUuf}V_lkQFMMgN=X!ePHSpMC>@ElI;{#UDM3>K~T8riA+f%#^x=J5lAd{EY z7Y^QIqNU}nctY4-onxEU-p>fQNjQ;@F-)OOXiMKZyq<8ZzqNlctEhhCmm%`={ygUs zTYh~0E~QZbtqqLzFWqt(flN>vd54)*X82Ux)j3IOc#fI7Fw73VJ_>wn)<kHr-P9c! zs)4&4$0~ZBxF>A&z&~ZX<AM=l{#w5+fXKQTJCljb&GV<P;g{Ga!$Kr$JT(H|$9Q%V z9M*w&9*8Ub!cPf7wmrgN7rDX+`u*q0@8yVh)#gNGdwr6Fq!`N11k|B*;MmfXqIN|v zV1}aWByzz8oTQi4s93v-m53Sm30rUWWBV2`ApbRV)9-=c|7_@!YiE!8$CQM<-d&8w z(BNz{bd1yfj=GnH>ON8#v3x^x0=>MPPT#nV0^C2fM@W9K{_J{7vLrdcrwDX(g$6e{ z)cqjOH)aidbd;)-?;8STgprd}Llf@)?a`XMB}S4_&oR6@`fHUZ$h{&Qf@993?hzHy z0VtlnDLviq*~gYJC=!bDC9<==%$Rme{9p4nXjOKUUf`(D9)f&AcJR~U^6>i^G2*Mz zm?ahp*-e8Dx)ZA#crZL&!U5XhCw1|L8?}1Ffd;3l!l<w*uY8paP%hYzCv_&ET_v+< zAyIvv3~a{euDK41BI;S2AlV+cR^2HD<Mg@P7)7OnFr4Smy`h%N%8Kpu^WbHnz4M6; zdzE+^g*;X}5Gl&JWy3vn$t#rEZv==ABkO%$b*EPV41@(7jd@0f)~{KR_JxhlRlbwf zr+x`5-^}Ha#8>!?`+VuZIb4W<78zUdRB%31=D~D`jD(FUt-_#Xs()0!ghXn0%t_f! z1REuVbx<<e_$ZMf3!7kxSk#CxoBOwzxzm7l#E-cBS}|9Gc+BR_3C6dBSFY`FX7sQl zL=jyO1>_j_3>iDyP-vC!A1h6w+C3EDjQC1`&QLqPH3DLHv^S2&DGce1GLwjfPJ%HH z8YxPvaWd#(Xk%bqD?!zYkSSWRAZzhckt1I3#<SK;#SYon-rH<^6LbBpo@WhI*E`tt zd024-z3-FK`fj_rPZ1*<^|oa;)5d?f%lIXz-3C?T)*Y4VD9M#K=ixAcs|rj}Qs@BS zc|?w?#nkyhK6m2=kyX%3EV#9Ehp!=cZC}IQN|1;*jnZTkI>Kb8r#!iUca0>cW@a&P zrsxIuFqLoCZN>%W)H@qbwT9fj&Gc>iAJSd~0xuj7FvbHMq_Et-%Tut?7#OKFB>{i` z@E9Y<OgtK}@&Fttm3IYH4ETVdl&<vjKSf&WemmX@ZXzog$Bt)6Q0+qEtkaWZh~-Y- zW9Q|)faRU^kx&=7M-GYTE}E|U<zt`vT23>^N9f>$ItH85)a1!;;s>Gjjk9c&4?T`s zEdN92`C{lmbwBlo{_c80=BW?h-z|{9SAIQ?f2fv@coS?^W6^~C$i}X4G!|LlQbSf< z%7G_1awMYan>N3ty2e_I<`B<*G$`VMugiiTEZiqxR?W|Z@sVCb-R%<EcI6c+EJ`ga zo?=S>X7k+Sm@RRE*l50mzSN~M5#x<Xc||#l$UzZgoH0c#14hJRR&)kSuWyOB5agSY z=qbUbYW3gU%L?)zW$0P@zQ4{tW=~z&StCmhx}oAuesD&1Cvi;YR)@S^0iCAbP}mDq zttnAJdKqD10_?wC@+Ko_MQr~e=wuByY3v(8Xc{UED&GjYOdYBa>8KolUrnA&Z_YSq zZIswN75=n4`!?^ZMH`wMF9w;fWdF4GJO17yRCl1nAXygCwdlUnY?t>r7-weL`&=?8 zE<Tc2EX*NK=8Ne=?C&l!chf6+Hj~VG#zibNYr@^}G)pz$iezc!jIAD?Djuc?CpXk} z&?M+8{N)8C{iz1b(*d7eYCumRZ80;75QTIoz`A@wxSk+R4E@H=Y{Yo-^?GrjC`Y>h zj{J(UR<n{OzhbN=(G`BkKf(lMapP$k_5^+`PSbRmK12zqYz{6^R1)RXbk%<@Njt$F zr+U0~$>v)XqUD>QZ|u7rV`agbEaEh&i4vc;AQ)p)u|h1Erf)<@uLNyZ@~z<V8PKk+ zKL8nUdm`VPrM|@Gw;MIm4cjIqLr1W8TB|}}0`Xt~t2tgCdos-j<DUO_769Sid4b&| zf5Wlw$&8_7r1x3}H7-}Rx!!%-Ns^}p0o$%P$&f6iY&;O9G6L8r8)KF#S_G<&dFf#= z<t|k@@Fq`Pm<@madbeh(8u_$5Xv(&iQT=XS{Jz^C5?_fZ>&;kSOk8f8H?u4Y3E~<m zQ~3O`cv<RBBFLl>P&w@5;%t`K>t2?YZ!qx_0Io>R5N0wjXwxFyCi{GfGufB+-F!UZ z(-MRS59PI5;ii#|+7Oi^E7U7WiPosU(xWg^o+axoSXwu2L?CTwmcR>*g-GpjwjFUn z^>}pw4St&QF@SNCi8x=B@3^T$w_8sbdE<s@e)MJ^oWkWb^<X(d-W{et#3@NP6lu>S z@%aNE*EoSUAz5idDBIBX;9Q`={uMM)d+{RB)_DONKQt%x3VYuS@+s_!yGc`i{zPZp zeQrm`z5sg_iwaSFNT1QjjTB#$N;6~jm;;Ksvyw*XtSWFQ#n*yZv0AsMB!7W@qh!|1 zI3JqTkXt(V1GSGcBbdM6?8L(sI1~;!8jQ7+LfV4@jSxUOPdG(+QBRvuyZo^q^2M3i zLHIMC4@1KL`|JOCGCYvjAOGv4ShWA*?obQM%b_r7l|4M;L@N_lN;@DhFMxWsD;PR% zt=k*B2x@V-W`BO#bAuo1pF=*#VFESMmY!qa%FIRx;@>t!GBIIWg8N(N5qLfKBb0K8 z3rM`@H8c&cH%q>+(fk?`jbYRkeDxuvJ8RZp^-(VlDRS{OSM_72CIPt0GZu$h)vWI& zTc}|ghn=k(!I^?=&n|XkJOI5D(R;S@<kg)*35^<gh%#|Nwrv?mEQ*202#7*8*yYr6 z0)l9-gd`+kK5xDLq#4--lhlfHi0^#R{rJVc&G7V3G7pm`vr_%V@R6E<AQTi*#`>6X zN8)X=I`4W@&{E9Yk*ct+CB%~&kn*jXf2$P#y7{r>$~&-A((@e0l@^ErJ1fM{=X;;O zQp0z~{vk61WdVes%Oh*ia=RgN$H7YG-L43v<p6-j1Ms-708}f9Jrfiji<Ia>&>f8i z(MB`f!k_e4^QF*ds$=H!O%%2T%;m4Hj~DsmP3irQ*_9?B+g|`{Wu-#!H6PRTgO-Eo ztoz1QV}0}4tyD$=4!3MG|Ei37k1}sS#YM_^33>{hf=XWEs^%Q-5yiu?M>kT+z>NbG zkx?^sG<NO?1Nk0oX}h`3G4ut_*s1+CfdNYP@;U~ylFre>c2eWYh{c1CV1~NMUS#aL zIP5WhDv=>2SYWX<1kLoz>2IP_xxWburv1zoFuuS!yaX-8IDC#~2$np*srd2L;EgGR z79Asj7e=gpQK5^1;l<dCy&|giW5K_{arsKGMoaDTrEY554}l~0v8o8BEzcon5Ry?! zssWM@yGuoopreD4(g+hC^jx6->*oCc47CSHzRg@yP2ILc+^)$64Y?hQHl{^`0ziZ3 zU?F{a!@&-00LINYxy3M6QfFKpYFIRaz@Ri+I%ro9>FhLxU0PB0o$}%j)x`FQ=M#!u zGhNX5C#0D<d;ccmlmf+V;0`V#tL9nX!{Ij;O;M;yAV5sd*(5s;MzI+MCQ@P1m0Ni+ zna_;?UYQ+&Sj=71|0gv5!*H$8c9X;zaVH;We*j5lM;`J<#wf2J7M!=pB<sduK#Q$= zB9XO`H>+dKZ_VtmZ+?Y-il<w;a_tO)j4U&_e6v02e)RR$ABaxS45iD@e=IV+-x}ym zazopw2#*%A#e5L4b#_m5RtCB5*W@?*<|`9xC@gTpQ`71Kiks5`tF)KwFzno_7w48Z zkRv7bIZ+aTZ%J*9TlcS<0T*l0%uu7>f^beF<hH!Nt@c3TsMkL0TaRq1;nYtF?HR#j zqdwy@fux3LW2G^5-epeYDnnEkLEHdMluLz-?cC3L8f+Hal&1+w(@yf6ggZCLsQm|` zu<=0Kx-TVLBRwmP$Ly~fs}!cc5MuL`yN`v$LdG7`#$#@Vp+afapt>ePt`3;Dke%@l z(L_(qf;Prs2_>QVcJ2l%Bq*7h7EBi8NkiEEh5!K4*0zzsPy!*!4ByK(p&Ygyix5F^ z+TO(zA#7BGU}X`7AR6aK|3|6cBRB)!&F1}%fA<9=ibqa#H(7acb{O+*c&Ak%x}EVN zM2G2Rge^(`(U_wJh8EY8ecwepKS6q_?Kt&dXBYO$ydgG^tYkN<7x%(%I<JeFEY<-Z zPVqN~I7POcXzBtHzcEd4M3OOHqD3hs>qX-Fs2X;NE0y}SbFodvp(NZjix59cx;@6P zm*L>~KG)b3!>2Ik7^A87u<SRGp9;>>@Xk`Z4#Y#F@lyqJLR<iV6b#KvjM_SJ`M@2< z<iM;ZR}*xxYjY(+%HN;vpxB-hlowFrjHyR4@?f*)EazT=pT%Hj@|t<;8WC7yr2X99 zI^ZpP(l7~+{e)PdK+JAKa+03zZM9w9BbWbf?KfHif`y2F7Jjs1%%F{45s(-vL?sBo zjZplinBvR*q1jLiL;_g&Mf(=r_qMbdfqLAdq;FaTcQ}E9)}w*m3X#VD19VeKhAGmB zOc}Xo)T@PszOTHOj7uE=0jpoA2EP@Si~oB6K0PA2_1$Ahcp8V+26#?OUyqjRKMDT1 z7nDp2yBeUn6|cE{@%U~SM4r$U#l8_ZR+U9^>}H9|64Ni`PJFFm)dL~i8}g7Iy}=1j zgt-FmOY3*OOr_8N{pA0r<%ItT(0wq9&(6GM`}64tXX{yn5j)9k{wl^SU$sC%QcW4C zHFT6%i6vnQ-6wkJkbM4kXwz<!Ag51VlG<Y*-(zD&x8?nPRNQKPZcPIHQ{ebvr4-pj zj)&oQmylR&G@@@>#}#3DUsTvgf)XD8)MEV8lg)IKkdBNRK5_WczW=!xqx3T1q_gM* zd+m3SnH?>{&S^@P*v|Ft<Chx&wytC!Dl~-shAgDCSaEc5i<o?i>b_h?!YfX*^DHwP zsRYYan{s%EA@sUPI3CHZxBOs|B`B-MMGny`A<D;w56A7MV3@I#Iz7cMDg>Xzcg_(e z_fA{xFeJIhs@tKNK9Ni?a|8m%t+#B&>|o^K5h`*3abz%4vcx1~T8CGhRNm=N(%H|( zH_2e#L!~X*fgNTH?ohP!ZIn7!G>^3i3UI^bpBH}EJ?==P=wXy=m+dGiIqR64;&;l` zokmEo9BF$Wex8tMU?BOZI_<?DDGbS5zd#K((VJkCz+X-@k1^hu<I~k+2jysAH#^+B zTn{af-xW|QB^uUn11X~oV3{j7_M2Xt<dVKaQszSL^DD4Z@w66cIx)r9)C$ff7DnM9 z1+W2AN?&^OM~BBGn}Bjl&`RU$l&gQFC2=F~qEXGwnV7e?3^e^JXIc?$3Rh7?i3c;g zO{^LJT;6t}ia_P8(6O;XzoH?iS^k#9a7&w`rMFDejCV{EVyJG%{NiU4*Jt9~#SWHF zMESLzpM|q>*|U$`??V`$mq6P<g)*~f@T(HSjd$!u)&;7T#jv~|;iFv9-ekv}dDUh2 zrBVl+%fatp(@W3ke_cOG2k_Z&{gKQkba0X^R(X94`WjUTD8us`xaGGbxZ_u#mwqu* zIIS?Y<{hnA_yl4wFw(yVGUy4_;ggxfw<*{lrF;HV24<^3Om;(ZU|BT*Of?72_(w0i zQOkc29Ssp;m*c4}_$*EIO>r7|b+W2W%MXlKKzawM%_>|`h;nHq?(!Ow0$zIfUFz<> z{XeMJ|3LWvWMaq&;Hvup9fxUYKJ~Yr#QaNfKUWtMOEy1oBOSc`1fm^*(<NP4H{IBv zFIdGR%b;b*8=ajkHww1fJp(@i5OR3KZ~Ol^oP5LYA;{yxP0u4JNVKMCMX`V$a>z_- zbpo#Y)9t~1drzR_!3_5w&K?!o0zam;UmFgpXH_ampeq=Q`P*zONXO^HBsxARmy$j8 z0r^=YOB&P@vITIN?X(#-(P*V6+>rO_s9K+sbYRXfCW?NU=}Qw1)ZyR9y)@C|2vJ=m zk+J;0;gNzXq8WaivYhbrBqf{?l(gemS&gU>qk4S;?m1xZXRHzsxNH!RUkle12(MFo z47NGo)N`)j<Vyz)YRV#6Hf=AIpH%SgZ=m?@5HyZ)3q{s~EN&>-zexh+y|E;GVatOr zHqwjgE|d1JBm)9D#>w8vuje1~@8fXCtxUK9eLxO+1vmXk^{8!3EhYc}`K=xH#uz6m z7j+%XEv*ux9KGD4h{GA_^wT+fp;l=LdVTX?p>ke0Re=FWhp<`3z9JT(-|%`^`Q18< zmcVbb$n9l{qq#*|IXh=z?i0ncn-s(H4N&&^@4F1GEd&$&79x#y9p9IJHuYTzB6Kp> zxV6A*3pxsI-}^AO-1F#AJ0>Wpy>EH>{;faG(@Vi0u#|GACRKh3ddO(0BPXPUeI4yJ zJ$~|?=LXN>irU=zygG1H*ORp>m22``_c6ghHyU3vy^WCl;&y_`USE`h$J%nmr_Z#k z2w8R};qZ`<k;qoKCG9a&PW&Rc{rSJI6wx8H`IR0L_2dM;PX+Oz3AqS}7Kx33Se1fu zR)b(nWAN#l$8Q7%gaj%cAKk+4IRHwT*s7UE4fg|MJc^h{rhPQJpD+G*{bmXgLf~(F z`p5dFo4@B5`zo|Z2|;q9VAK>a>z$#@yjP$h`SZXl9v-|8<<KK1;i>h1AL0K~`-!xm zy>Bzr^vRfrMTN3G?+7S&hd4KT%?K=negU@|W@f21?@-)3;&TWyRkt#z160Ywd~KBK z)F^iz)J&{u&!+AAZ3I1`P2Maq7naO3dsY%C+#S=?NP#FEaXZ&Q!r=tBl6?8+Y~5F2 z3YePr&K9H5^cEhF#lo+OBaj2k_VY4q*~P>9(x6KLy2kA0(ytv{35;}x0o|btHFX#K za-0e@SZ3c}*CvELtcjgNqndQ=f!~m;yD0SO503qp2Tw%>A_^c189JECIwPIzLR+TJ zftrzB>Wu{RL|+UnKpZSVTO0*REj2GnWgGBkHXI}(L-K80W<c+mEYN(2Bz+oHm<>eo zZSGYn*%9w~YGc`cY4b!B#P1E5^`K*m%2m4|Nq3GsaNuIlhtD(08BAA@Dkfxw+#g$n zlP)frF^ke@$DzzT!NKTE?zy!${;WO~s$8g4m}v36$^9pkJR#hHn~rgR5gzL)N4Wt5 zf=+j!CtNJMnqqTz{Ab45RL@6=n!(x|2g$`-V(;WZD;JOtUy2+(CY3WLqi?3gB03Ge zuSU;nERwOiv_GK=*1Yp~{K6##7=f_JExed{J-gACBsI2$0E*a>#o$rg5%C6ZH84ET z@ui9m&zF_stVc;P&MZL$n#mUh>;KjHqezJ2!{hHBHtc=B<aD};aj$GAb=Z7Za^`1} zkx5M~Pu$31NU!`7PCsz#WG<t3#PH=pl*zy_SX9t~{64aRLJwBOCsXR9eO^TVVL>VL zP42qfpb^1Bh!6a{<_4i2OJ)GE1W6n@WkKi4?!q5U3C1Ybzt^Z7CCC6EbNfDvVNN^$ zlT7_rYKd-8M)DqJAB<f06Wr9L(ophkNx@AiJ*J&S%_;5vG{9Kft{$g#1aj~<P#1Og zqkY9XAaMUTwe*aM<Q9)dH>gLn5C*zm*ivns3<#_?UC|C00X1>^e$mp7#sa`P)I7VB zqT42^*0oyeerOc0S~{}UyfF%d{N{byo=qam-Anc>5kqVTD_LbQuv*cQgvu0HWx0BL z>23|Kepe@je}i*))hAwkfRp+Zz@onm>pL0hV(lLh+yry@u%|*y#~P)-rmh~0`0d9N z6SzimeUEQ~lGFm079VUj67_!M>xnaar!vEcIqzQ#!!I$)42c4k^lP1D>k-$MADm5H zYn}^MQ(G`Wj8!QoB^`X%{*0ZoGyE{v#>SAXbDjU`dZLR(0)m`>&oQ!rcp-vV8PzB8 zMJ55o09~fvtr)qho(hzt8dX;zu5W$1Pdb>AB?c5X_CoX^!DdGn8*u9Kok6VYK_LIW z55YzM3A3{IJ;L3ii>m5}Dwz+zGSHt|?h|{2T-Li8Hr9o%uFba)!!H=7CMSe@onJ7I z3uZ<~wRtZY>F^-nkusRWjiC8~N-gYEa((>aq+mbgT?u1fyFJMUJo?tg-$?kRq80tt zF$Na9VRud+$_QuSxWSCwOq`l(r96tzA@8+yDc@pFK`+8dEs~zy{-Ytx$&u^(;?JfR zJyh%~=Pn>3y;jd@%73-ysj{8wl^6`dM!`0ldRwdYx~TE8iH9Zol$ZEO*H5fweh?gA zmw_Y#wKS^0hbb-dI2L3SU&VI&znJ>Q;7H=H-3>OjwZX);&5doF8*^gY-k2NPwl=n% zjcrYG^Wy&Rt?H`z+Ed-<*XO}`4r2aHH90BDCrEz*6P{W0ArB(gixS?iH77bMc-Cqj z&l7p`g`tX=7rlfC2^A@a4i<H15Jc8#rEB(|@}PqT-wR|j-RuH;7N@UHy%2@ZtdwRR zD~L;CM8##L7nl0i_a!AqZT)=sB$p$4820a+9(_et{Gjcl3QVy4B(T;k7~5F3Vlj_K ze-2_7^vxkfVTHsI_G6|0`>TMSQ#yyniHZp8cL?ggu)=$94V4}xIUWg`%55W`XVNcL zh&uS4=fCfz))-}!t>e0kXmRf=vQJnq!Fp(c7nO#l#BmHYvO0-Vo(v}d=7s&`n=_<L zl<}n!ye`DSjl(E{MGx#03A%0&1s9Yo)#sQN72%4%M$Ncfu(iXF|Hb;mA*hCgW$y3q z#$xQrKdy#j*tI;I-3@E<P|dOquv2n!jd5Uu!Cjsn4M+4^D1b4EGN8tOx^vLdk5Vh5 z!Q$<nxN2uPUs{LeD#A0G^1KsL_;FwsSIro+)x<3<i{*`~S;5^aptFS^p25*_%C9-; zX807@EC0C_S)XMBK}}4I_;E|_2Dgh4MuB^mkM(Sb+mcWf`T~B^BhQL}(bp9sl$|ym zOGMNAQbXhGS#fy=-dl3eDeEX|s;~#dhkJ^<ipIMk_Gy;=G<g-1R#OwZ`_n8>ouPlM z-KdZCN@$WPIJTM}_N6)Gg+u4yROY_WIv4*y$78qjXyiYzE>Zc+>1zMBsunU@wA~o^ z%#}^Mq8^dy=ODQCwmZ-C_!_q}`}&J=$-4>0F8@0}4R7@oO&_gz49Q~E^lZ?tvK(_{ zfHNP4GD#E}+U#0b=Br%hGI)?P&L7AK@VvY>480b6L0c6WBP&*to{Z=PG|9hqEB<#1 zo$zTse|JW<$U|GHSoS_#n%2yq(mBlw8goX+Vna+K_QtUYFx7Wt%fNmLC=2s9#@8Yz zz-*qe&QiuA^#Qe8JV1|Bbfc!IX74zRgEC>^fAg;@7A>kYeHakwGw+{kT_6VndlM4c zD{V`a7kmH3WcQ_~F9CRe(bods8_@+*WJ#w6=&zKCWD<l67!HImMDSGLPtrCGUd?aA zR~Ua3_VC}gtVn34zw<IA#qr*(F3;cG$C#RuJ#JHmm9zdn-(5N3lZ@&1kt<!kb0G+D zK-KIsu-p|Hns@#$Q2akFbDn@I*!YnC#{InZ`?=29=-*VRNooKvsmST}Pn|3}Nd$Od z^y&2ILytdq`PSY;<JJvvg6<+M!uG@cu8!zBF4r{{>ht8Ch7a1mVP}3WaO%)+a#u4A zlob8l82|3^*I2AQh?z*qB(^^3QU9gkl?Bf}*pt}5$)re^pJgXcvtrx?!T$%}zLUfY z7l8^tJ+K1hA>2N5lN3K%Y`OGOE*Yr>vCJTwXWaYb?sLo~Lb~qm{@B|n{jqlX^3DAu ze0uxX)jRk+1zZv|?fqUKKP=ht`_F$QwuaewHAfEKOhD(5A?k{*%mCrYM{O|iTc=3H zM=zATQL;N)NbR0eAYW#xlZTtr${^a75x#w%ekCfuD!mPM9CxiWfAb%ojG>}s5Z)?9 z&<AL}pd0PONL$f*$p%Jrg|rIkKjYtpPw*;4N?fdb_!6-QoQJwwMp_;SjsUUs-&8zR zC@S$c*fPCi6kSo`FQ-F~v*4$mA{?**R&pL@I6r&5z)O0*98%+KAMi3ag}J~+uv_GJ zFHH+IY|Ot#RkC!*^*5d5fQ)^*>L0<a_Be%$+?Go8mxy0;fAmdsB$FvTUZ$3QRcW1t zj4{8su5XB;1pYh%FiG4?2v2EVosu#m1{I<VbW?-<<Ja=q^aC$j)*%i_F<=w)6JzRa zZ73pMR~N<O%dsE3z*xg?VdZ=&V&C^6xW1N1L$kr0eN7Jof11_8WS0`o5(_fIcNs@E zqlr=I?$5~FQK@;aVcnG~oNM0R+V-_NW1v?vMGpopkY|)=Xr*iTY;%@LorL6@5iD{J zk64l}yoUc%PS$H7l(Wyu>@0e^@J-%I>pu7}mi!g!lZ~eqb3etxNXDF|*O+$>zz=!@ zmQWv9ma7}<;=FJPF1(J=d|7x+^7wv`brsgp0GeOsR;u1RQ#i=AIn8&wZo!=1kFK)M zhH6b<v?DkuUYSgqv1}l4q3FCBS?urNY7m@SAmQS0oJw%uN?_EgFdEDOY>9r7(hZNT z60wd6f<ai1Sq-+$$jOR=P5Cjp_OZ_c@F?@VAD4nOH~mJi+C?hc`XndJjI&jf6{A9y zyAAA&xSvU+DC}QgS<qVXHu^tRRm*}h>S;-N?g!!#crc*%xSYqNRyq;EJ7;Aaio}$l zL3X*rK{BA=8DlK`;>-Zv_AIS=e`*V8m2iwapcBG=w_L?p)*t8ru1BUMe96DYj3-dj z#r+>R*H5%ea?bW=OBz_Z#X$e&#kP7HgRh&yMs;Kx3le_if0+AIGz#2va`VDtZtwpu z`GpzozjQi$@#zsN`KA&@pr474@8^M6USm7lp@U|Vz?x#GfRum|i)Pf5jx`KGyFJKw zs{$Q^I$H9*s$p}PS8fKeEB<sUiYJrwg#SnT_&^;cau)hDi1|<m^;ocR-Ay%E+)wD) zz}dqr%dTwC<l~H!OVEu5;NLE#h>-0|AdUl<UH`SUe%N1%Z>o$ay)8h)t6H6%`?GUG zSDf>BTwH!XDna&`lrJ@~9}rl3R5j1L6C#;H`RzVZCX7LF6%alOigrGbVb1F2xvq&v z;DdCxF;b!@`^i0cP-+C7kko7@q)q96SEb~U-B9$$zb$sXcK=Et|9Oku<3!P@*R;%I zZ$*V(v3tJFa<S9Bc-BWd{HXxDcvK2i9E?_A9pYw&OTyY|wp>!S->%gG-YRy5KTqgv zoL`3Ge426n!lCd8B63S;Gfa$H;xdPz^luqogr5TFuI9+^4M2SRm-#va)?`v;*2;TY z9@KQFU>9m^J9R+x@`BOCAROE^{aaXbbDpT+aqJ1(((F7#NWCRCI%vXjyms$e{D*Ht z2rvlg!~D3usX$B#ERM+dA}|oZMT`+{<i5^yi5D`9xpL<YsWoz*SWj~JJlayjG0zqi zv^7H4E?*$ED5ql){`Lq9m{U+3l$o59x|7KNfxR4F+bjcrV`!Ok$FI#^tr~8LIgZ^U zHb95rBf&~Gs<neinoNsMJ6Wy`KZm&LVH)KJcnx>{#v?`XfE6%OfVwzJJE&%}c~Jbb zohE+$EF}6c%FLWo%+1e4THQC<RgrqORw5EMKya@6Q=3~VY)zSQ3AQPICVeOuhJcX3 zM=E%nm)3zNHyQxB%WwZCp>BkU+vBhcGl&j0OuE<q|H}l#rjWtbxc7eT=vp<6M$V#6 z-V==K+}boGbL5m4(<9;HgoXz`{0XwDfPc%^DNwm#+S1HYj`Z|xJKqwVdk_&HQS02S zMk&No+7bx@T8VpK%g%lg@>x14c=lQhK6u1Gme7t+dAQGenPTI@ivgl1TB2S<E&oo6 zA(?_0{~ySbCC$qpO5^n#<-2%efB|k2CVxKDA@vZoaTc7gJl8OS|9bbM?b`2=a2x?p zTo{Zi=Oq(A`RPN~$umpwz3#;^3QOcX|3BPLoB>1d>dIf2n<_tnVt~^dLkU$-ragD4 z=4!OmV7F{22-jQ^N}5&FMdFN6^Kvi1q?|2yaz!N66{cyFF>~k{ELTYNwM~=2>sk(D zzNXYDvhj-XYA9C9e$@ZX7xUa#^3A!%8TLnQWy`=FB7Kp&nP?u89r52`5O>`2K0I5j zD!2NuDd>XHl^FCdwQYueC5><_P&DIRZ1_7S{H}laA(D)OyF%h4^l}N5RW8u(388HE z<CrTW_cWZx%1@wjBFYb2yxi&;NZC%vIk1>dhWPw<+B*vzL|<<+^EyhL@Cbn)jbU3O z@)DB?VU~b0Vsp6`g-_Uxt-RRJ{jqe!Lvl++El?d*z+PlDE~X^O!^`Kk!Z%AE&%(HF z7l-fjsL%HMY{tq)3U5vTqN>p<M}{pQCDewn4LzYXS3N5v>vZq;8^6bf;Hn3OFb=O< z06uo)d95-=q~YGgQbBXSOp%YE{&SFCmjBTk#=Wj0WUOlZgd09b2KW=~W-~{*xy#ZE z<h`Afr|yB(=U*}xe7T`g0o#!35vYHqtlz8zU#YxY@N@wKNe*9Rf_5t;p)Or>pME^E z&*;@vyNWvBwJy)4b-7TT$`$A2dk|)<?zsn}i)i4>^3U6rDk}IGokkqJBnWK&5?yr) z@Uq#=stK<Vo5}zCUI&<o3aJ-{8T)}Xzkfw;)5#c2XjMn5&X5g(#N;i4;TYgi(<!bj z#JOf$1Fn7iuTvbneR|bU38PitzM=a3_gj=el2?3mO#HBAP$F>17>>}gxhI_A^@8<d zRp&sR1^byS;f~Gd5$HbSI{U$7@#>xWnlAZvHF^ox6G>X@glc%@_SlIzFZQa9_xUS- z7MXR9SJtP$<T%?8ng8f%p7q6I!2(47pyemWKlGFkN+UfULW+V6iNk!f@<~4DtK%;& z;u(Sk`s%5?Q|VzGBcQ<P)|NO=fEL5RS<mUHMz{meGz1FGV0_luh{eYhuqfdM@IS?b z0t*g=*ahZB6(RV_IgvPkPK?4CktF0!=C+qe-1*pHL}b9k-9IwGL_-n&z@p!_s56lB z`r0O=uDt#mpz5*f+SVOGl*l5o57D4}@Dj*?4&i|vG?)x9qkTcgY!#VWqj%`9k37!v zleQtqC0|Bag_kP4V@=Ar7~tQ2gHhw3B@dorv}pV6{#T`M3Kc=ze_g*cK^n-=vgb%+ zAhJzcT+%^I!2C6XiNs?X5HatlY&AB-G=0%Etu=dV3VlBO+~fDlgrl)*C1lHj9tHTa zHf_wQDt0kFTO>5#*F0bZ_l_W)tbFcqeQm5oKGC)jW5#tmz$kn)a_4m=1C@b|Qb0c$ z++{JyCWF&iV~%-N-#jn7KX-_<`aqb$f#Za*Q(la8(QK}{G4}K${-0FP!ttB0ss2Hi zd4j<Nda;q}kKgPl1U9&oq)4s{s&{jMnSZ~~B`Tc3B}^O9m|L4y<jqOTSlthbs4yPi zha%RMAh?lmF9fLz2>W{SOD9dp>wVZp4@6{J5tD{_Dy2{K*{eT^ky0`>f@x`gV2^jz zhA=N>r+w!G2V*$YG9n*H7auwkA0wxY?V{>~u%NBoQWoo~^%IESDjce^ANK9MDy-3s z{6he(2^oXM?&F-i;%HR?1u@uH-|!S}YUR_Tp!FUXEaAU>65P$N%l#ivPR0P9xK2ZC zg)>C|sTH>EYa+TwgD2GRz^3JhjavF_NcBx<8Hp8uN1E<BW8uRaLSj?Aor)q-aFG`` zp)h-op4JPKtaR29x3)uiaOD4A7y*R<%v`qdYlpGx{dqE(<yBYMpOqC3Y4rTf1r4{^ zC3%p!fq%s8rfP0K6>uUwE-(7}mG6OBFz7emD_ySAfOpsPHbH=?*p4S)_sr5dP5jOf z->ZA2=6%h+$kjOb!(g7v{{d5XFG^@P{0FDtI|(1hG8ydJI3K%|B|7|WvF)65lGr!5 z4O-0I!Y_1h;_JlFNo$Gte(A>pZRC7yY1Mv|dHtK2H^(E7W~acw`%3jTWjNX+R{5%T z__Yqju^JD!y%D!X)D5k)4-*U8G3mU%sKSxI>lwv{|KXAIg~x<$N%J^6;y*bRL_rs% zmgRr~=rqi@ujWmH8@Lzy$D@jY;6wZeA;`_xYb?e*`{*b|@G>}FQd@Qc4!fS_E`MTX zLSgt*-yG7-7o^TriR6-Pr<)fsX*V#I!;_4GLHx6vbov0vgMT*LB;isj%qI>7N%+8d zQ2$oQnz~lVAs68`F2$j{=Xu3o#-jhDhd;ozrLzAnmnJ022ckHh;KLH7t*48iQ6f;G zWPnx^xb=u@)$_dX27_pR|Ld=K4cB+cH$u!cA|n4u6vRN2nLiDdff0nPcpsC|i@CI< z14P^5?os-!;PRdkUlgdk=y=p7iMZ&>ZHR)9#KE~KDke}?;5xhG=JfL!^PFNmdQBqI zJAGB$@i}sW=}<Ytj^smgh0j^wIu=`W%GXpf5JmOKtatR4p$6K7A<}%O2!@H8*bF_o z^up%ANG7RYSSfuTu77|s#{uI~8=_bqaXj6sUemb?{?>JNF;Cnq7-+%~c`5;0ptTQm zIFyMRh^{2YwtRV<AVh^Flx&i}*l>*iAIcg`bu2xY5mJ-1a6A~Wh1QvK)uUjj|3s^1 zbMpJq_A@_~3?rQR{5W?W8^&RMNH@Il=Evs>Jc}duh^+gXAW&f8Rkoy~lCw}d9oE(B zT0nl;Xeb}aFt-{5n-kVSei?%H&oKN%{OQzF6UrK3z+F4n!4I0IvC;0#Mr;THj|UUI z5lo~D$Fl_qmrYCsQTfv-;tB-UBEaW!08_N2p?Sb{P5a->>i?+3Fz8@l37W}IHDTws z#If;DiKeI$wXgR@M=J7b$VWNMiRWOi9!7-sJwNr0dt^-&Ggvb3>39WmLHB)=Qg3%k zH=pk0yRTY+3&;Ord%;P2`BqpJ7Ps@ezk-5$&{G-(TcB{o*4Blh3}v@#5^m-Pig;NU zjFiBoYfvAwy6lSX>M$e-JJX(+>w?pdy1-Gmgr@1e)LZ7Rv^}eFaXE8y_N@S)%EX3B zx!saJK{+{U431*{9vopG`z)Pb%8AVPXjLe5;6CY<2M(YfK0y<5Q{q-$fp9kboS~d( zcq>=ee+5@BP@d14&IRc3)RPky53`jYdHWT(wmXtW{Kuv(I7}#iEJo0k*7(b4w<Mwc zJ0h#*0<aJF`V-Q>(9a!iXkc7H@%K{Pr_&b)5)s#XsDWolUY~QD`w7GD1?{AD14Hm4 ziq0e;!xV)@oH#DZ<=rW$y-KbpfX|39eavTwBiwg*`@82w-k7BJvu8VEBO}pY+V%c^ zXTN#8b?0JOjPT`5m2uNjxs?3%KIp*AuZEJ2@eM4c2wgt_dnubivO683*|#CxW0TO* zz;f6J*)RAaW=vrtr~2%{B2?-A4u0Mb>OEyM5wXMiUqYU_<QoM%52txCq?LiCl<0s0 zFM8nDL+I1<=|nt)SI)RWo#gK{ehNXiz85ePolm+TNqBT#!pMI|&rC#OBnKvMJ;khJ zA8$T-Qv!7;A<&D#Y|c7I9m5Wpvrw<Tvte^<KrWQ8)KS~N13bD!ZvS2Y6kgS%JBBIw z&swx=CP+@Fx;)(sr0=rE0OSzxu1z%JwGXQa`su%C7EAd$%_MrN-Mx;x=_|)&17X}> zhtONwsbg@u8@I^N^4(2bzEqts^Lmg(>DGi9pybPiii_tv7q(=<JNvE*&Exm;;9uP} zg3IfWX*{u1cDL&$HEsRqS%;vJ1meIHiC;+|Av!$Sah>by{r8SxnSA?*tLG8j3_1PV zF(J`W^Swe!je0s9N{AFiapuF`Dfjc|c?~BA75DG;2>~6}@c9HWj8@wznE~=`j8<PN z9F95&4gIu1ma7ZPax)7SUwmdK(G#XN=lspN;^BG#c^bsJ`$V32+_QkzJ?E%?o$!<J zH{H$0+f|(NSZAvxF%vWM;;s!_hNbDqohBGeEyuw6I9%(jQYpZO7MvYOv}hspeqff~ z^3PBV{fJ4~XsIxig5{EQkNbrk=1w}tn*kh<fo5#VE}?5e*4))tRRD6~=}z@UekCcm z?KWcw?0#EilS`6XSxnNn^!Q7{(utFY{PFA?8>%jvW&;NwkuF$~Pm;P;W|!C89`X8n zh-`MG6U}p&wQSqe=O0!%e8s$HMxNSiohCdhz)+x|#wl)V$4918N5}f#^x8OH-7gjq z6*`;Y*D&@4PTfD8EG3)6XeX<k_C5{xS~2@n&w^ojl}n--a?F29dEM|YuG>LLci+*G zR9E;)*LVDwnNZ)bze<X1#{e&@$~)W(z@on*bdbGt(N>%EM9a{JI<vz6{Hp}w<aOq7 zJC(;R;lP@BcGReC<)?mH7M0*4@*5O?XzLMZhm$r!nap@QQS7>kN^QW3_N7rX`|g<< zCkFjGKJ4Uu$>^RiPm)$w9Ru8Xed2Hl7DG@OyWzDY3DtDFTO|FUOtcynv$AWtS%k|l zRESz)KoPom^Cv~0)B(4L9e)~++wV+`f=ld+a*@v=H_aO0&_hYd{K??X3QYTi=mD$> zSc*JEK6N9vo>4pGo-1Csdm?R^k9F%~_^#sMA?-}Dn@A^p3_zfDw+S-h+T0Cr<bk}T ztXiM5$fH@DFs(Luq4U0r9c8k(Y5uF#xc6{AXywrjxjwf8uMuag%Ttp^gj4<0GoJ{& z1g9PWAO@GT+^Z#WhB8FtE@a78Xre~}HKanA7X*$K1j+EU;7p3e7<0D&L$&av?h(fl zC!3CvN3PZ#Hm}Nj_6M3HIR(#yE**B=&zN1#i(}6UBKcE$krV~*tA_Y;i)?-Jc`wOq z8QM~CFsM@=pK_ZkXHgaU5Y4K-Qw9?2JFK`^7N5E?elSYlx;fbg$!!+@DZw9G7}Ca= zx=D6~AR7dV7BKY|;A_3OUyDMrkxC7chU-Bwe}K3sEmem^q@voHzu{KareOk_UI_x# zRs-Q$!TI+l$z+Zs{qzu8#;lB41)W6k_sC;>g>|bKAe#<clzvD6)#H_M8XltHRqwSG z1f87zXc6A%Trx&+^27eek&*?C3~$n~3=})mHe3Et6^X3ND_W}Ffuh-cB3QKm^IT-p zwRE7#e({kE<&p>sp|)3UMO=^1Qxm(@EK9Z25%;_U^Ri!VZ;lN<?ja1MX|<@Sce9+7 z;rkFcwRV+Ut(Q3|5A(ji&Q{T4IMvU%+pv>+<^gMdJeN9r`)KKlcyn_FU~w)3+h|Si zzmV>ckQfci7&p2`$M+37Ew6~ys(2&0fv?TefyDcFZQtj*)g-rx*}6HE$kf^SgZ5zY zMwBr!G08i|BIFQ4e2#`heXoOvo-qb~GYL3c3;u`v`*IIsgFWQK0pRbAw-u~sUwR&U zc|cVtb`s383aSJf@}{?^IGS}MiWfy=+7i#|D7(?Nx&To_QdHoo>fjv)4n1Lgz$Io> zUM~V;PO-m3j3WnL_|G3e+_Io=r0pdIMI!-U-h*`p&n>Sp#Uovjj8j>gF~2V{H^e{V zkpC)&%`2iyzf$lSjb01{Jy9E6yMyW#qudfaCyeiuYajYyF9@cTK~R9$7C)aVuVzk2 znSHTe%ZWHJ++0EGAUA<#wP4?9GL6MAuln}npDbBg_dR`@wdSP>0<~hO^PcFf&#LqO zf*$9<^m@p#=wq*1qa#nS-S@^tNuc6mkfwE*4#%qujA^Cr=t@E4qpFHaqfeXde~{r0 zQ2^*b??qYRYC`I+SpL@=2sf+EeSLztyTJ*?&?I!SrxjxzZhfQm1l!f)U_H}BM?Uah zwUY-)8BqqorcM($6+d24TIeMzOJ8{dU;%Z!nCtnP-veY%7*fZ{l~9+|dF@^REuDf^ zaT^(Ljx}JD4#<p%JU~fB-DOh%N9I;@qt<gk*@a@`4C4Czi<gWe{8B~aHI`tip^yJ` zT=01K#}V}G&2Q_@HqN>=8m}Dnhl~W#%;sfCa!{n#Slz<6gxP*#`Z_Ae{u<N146ODN ztvK=MkGrlUd@q#S7A$~;JHucS$L5&mUM}FmT|VJ)*@BMNDtEWl1+~{rE4133H#J8s z+L<ZA=zTF)N72`vIeu40GsbatJmX6~E{wtMJmx3-;9qmO0xNZP8883J*sE!?AqvI! zno(KjNm>+Zft^D7!4oC7vPM4)rGm;(-eEokz2@lg%TTAWXf7uVWMA)|h^|GhjQ~GV znBux{OYL@ASIqju%vDU?ZE|XIlHO3)5W=gw@g-lJG2P3S?+JIT>z4xJn*4$s*81Hg zG2E3=b!ve^d($j`Q$)c}0ZiaOOP?$P30-u2aoP({=TjYJGEC7PcJvHsyt^XaoyS+S z%OSQJyW+#`J3AurRhUcF!4-C}{Thn+Itqwa2<ukzsHEF47yaZ$1)J3Oo>wgVB@L|I z#5uoQLvrx$MFE+93-+b(`Fsips1PA3Q(sg*aBRe=&cQX5{8{e=<p~}W)R~+0sd#*0 zi~H9^!&2m>gFI2;SyW@Xi+V?{(ce;i<dL!{!>vri)-RL3F0K?4fukefUj%4c{e_}g zNxq9FoEfFK#~s<U#{wf2?K`ov{WYi!$06>`d3NUw0qoLIux(wqKr@koGm=)uYstKI z1eD@BO<Hxa@gXh@VSh)IsW@xWKV<tV*$_SEsuN!M34G<6D2c;h7!Uh)r4wjkAY`j5 zF_y8vgZT!3FFSe?q$j;D;VChyfs(POXy<_ON0~0n{g0yS{>ffcFN1Y1I|+{7qz~ng z#=rq}3~mj3QbH^V6ng(yAo!I|;y-!v&>Z*Zb)^EhNoO}UHuX8)-{SvDi;t2Onj|2U z1c5VypdX*!V8Gl}NUfKCaelCnJWMkx;)>B=YYWslL9OrXpuaLMwd`moe@}!T$!~Ew zN(=)=R>aN>y07oX<8v;aAVfUEAjP0+cv!>ptGJmGOEeiiP+Rwl-6~hLrQuV4u@Pm6 z*_;CmD#ALpVSaMb2P-9qbjpxgw&vq7%%1P*TH@WPMuZC$JkUpkqb^&)1t_jdoAqD< zYnDtLg0b9>!tbP!S=5hA$T)4Ml)5vcVUm$o43l7w`D<H8&QCa;&ztnA6ebfLjnyo6 z^S-ZsrNShany88O|LZvFr(zMv0B|6p+)&xb;NEi7NOSRvs!?g1q$!T;RJ#DmAjLbD z@{UwV3Cusm`d-@QJa>u68Q=eqc-)$z=+^|eXM$fU<K>)$k5Z7Mr5FOcZ#CPhS#D!> z;*q8?4eFQQJ!L;G97MhBzTx8!GwY{BII4MUf1CG_VJj@XEW;l{^z#D$ZtpJQ<@W8i z!o(1@AM($2c!Wp{PGA_zj$-IfP5f6&gwRJV<W_VaiF?0|sM)(hMa4$1-?80bVzZP6 zuU&$ug!kkZtO{>YNhG9n6qVztdyct4dk$|hp{t)VpNEJtC*)+0iTNAH#g3y9rqt8u zbLZ!`_pmahBBN<=R(9j7BtP#=_z$#ry&1>bjrkwF_m2Z_6EFG2au2?*)66_5L3AmY zzh&1|NSNABgU=P0cK;e^Q^T@Gys<%UyOiB{z-u$<IP4OTD;F1)a4>25&PfIZUDW7X z=U9O9)4HMVUo>?4S4RMatQap5vPFj*D#&5{7R31`mn>;3@jG95e7z~jvz^Miz}E)} zn2KzhwcFzKRcAT>y0K+z5nedmOpp|1F&@l|mV}-Hw#Lo1-POxUF#Z}ouS6h4s<UpH z28SK044|IXVh)%(P>~dBm<0d~8_^nO0s@s@4;@2}+BR|-B6b{ePt=&``d(O^M|}bZ zOv1*@(xcm%_Xx70hx@|cy4<iX2Hf?pcNEG0mQF`R!Gs*^)cj22dn^K-yvl|XTqpKv ztPwXY<0L(iKD1tqNs4ym+~0Mv&#S?lElXv^k`zPix6zaySjC4P2W%%*2hwXq&5E#l zN*5hZla2s!wZqNe!Y|mG{~Ylck&E+RI`8@RH@6NdMWa8VAL)w~NC6NfNoR8n(ET7a zGj|6;&-*#i<Wm<0kWM#b`9rS<X1}V*S;i&!Wh4KQ|5fSL@=hHc^NN6z6Yfbw-AkVP z{Y0O?Ic1yyb2HOu>xCe74;@k6<3@<u9{yKPREIXjM(&%kJslQMqyvIat$@S<8Y8c) zJJ0&-Q1~v_8Hlbr+u-*bsHc^WbKPwgvh@s84x(nU8t2s9`_N040O^s?3mNRpG6Py| z`WV|l|Ku^u6uDOM{{~TZr-~FM2up8`4B~N59GIcHajHM0D|Jv#Q^p0K7+4zZIg72O zWk&<R;;=B_tL${w5-(INK1MLW-=^aX^;!_ieaMZ3(I)GnjAg(GCJP;qP{BqHMG}O< zX&1*XvYF_ZRJa`b@9Cw2ZxUL(5;#x4-J~*?OZCRbGxxJBG&_xx#<Z?^eE$&fAD?pX zZF5Jg{F@S_6KywAZ#Ld}w0*NoWDH`ZU-7p7W|KLhBw+Y6G`j#!N?gFXsd6&;QK$Ar z@N87nz#FDyjdtL8TO%0u<#q~p<P7S<tLev{JfI?;S#Q$;pTp<Sv(yPq&`E{ZyMWsb zR#l>aAT9m~6j+6M%%y~kO<EgFf)0fqdI~-3UXR^%^<?~BkE$OP-kB#&k|;@>T<;o5 zJe?JmgNlvnWh>HJ3d=3Q7hhUtk0l{r<Y=WA|7$^H#xQIdm5+!d;gDwQOoAC`-=&=c z#fZxt2FUM@6B&ytUX?2XW%zM(T8aHQW&fCqfH!sUV@8~EkV>>eJtgWoXOywVXNcCt z6}f`O*q<Zzr%{2(PjrAor0D?;@9pT$`5uK<2H!LiQ9I_g3E+8$NM=7o2(uwQ<;c1G zHax=+>IluD74`thw3-d^bj`^4WN3f|s6kx?BUFRIR@w@EX71y3<Gg^lpEcY?g`GL? z$Z@wt0TDRdHZn8!!@%5Au2(C}+EB^%edW<nE6ENTr%rDcq}#Biis3H%Gvek6v}|1N zZr3JA^L#%iw|KfjC!YDtP#=&u*KIyr1>R;nzMk-1)7d;T6-M7Iqu3(qXTktl*(BA; zk6Gt-*rgll0qXoPg7OqdTx3Xbl4jUp!6N(9VXc8C!(y$79YJmT-q9Dw^b=l_GUGqT zJOd>$iZrhAXVm2hxvqCE5m<9|)Us*H`UNOYLl|YU`I90Q6t@C>hg#2cM;$B<$1%mk z7{g6ys5~5|1qx_w8ZS)JcT&~>6C}z9#FJ=zqC=c5%0gm4G3gEaYKpl|CXY|7B9Gj8 z`96#QKROMhlt7qw2^N?P4qcRp9SRdL6<@s2NY!I1jC|Vp7~vEMsE8nA|F#{#85KlK z9Q1<x{YgkIdYM7`pFb(4sKFfDRCog48Aphyr8khLWj(q5kIepyDf(ZxOgsk6sP+BK z53QIwjhemGtDN3{HMad_r~kB~4GA-lQFkM~p~$|w=}N`+>O$HTHIECd$CADhiCNvt zp6A}53APND`Cz5&*(mOk7u@IU2ls`1yCHS_nU}R@ie#%>5ayrp`VGr*--79`gwM0~ zHcJ^HV3I9%Ls-I2rJH%*pbd_ts3R;oHHS=vhhbJUFN04AbKY3xmGkLma@lFSGS!xS zP!kZ+7_P%>{cO|Y#=%GoIJ8$#35)$ma3#9*riT*$G-esKH$Zr>trnqAPw6~0<o4i? zX_IT||L8}Q;l*|NMyDP8!RS_ab+sMPHU4dLyozeez<=u3?Z;RMX{`tf)sM#A(A*`F z8N2k#8|&9kp0&;pu{m1RzO0I2&2Bu<cN$%4MFt^p87S#hDCjw>1QlBc5%x>}z(;Zy zSstU2F_RR_d*{u-Xtd|A5bf^;)u@^iA5s|dNr)96Cu-3j1A4H!@YQR^Fa&(O;OT!3 z6IVQhrZ`v*$BUxMt<a0ccIc#n+B8MsAB~eysMEwT;3xnrhYm?3+sZ>SV#xzN<pcKJ zZB}Jk<R1@%1Ik$^xkVNo4``BlEVq@~iO-(Sh!!Y{Nh4GEJ#XBdA6-91A3Ft|Z?b-j zhvQ~nHGy4C5>Av(gf@%7bBn*#s}ym*wIaqc(@u~!B0f`cN0?zG+;%_2zpf!qo8$H8 z=$VBaE6kDjEFxL>T-!q-1GlH&Yb5xD5=f`~%Ak(E(&!Y7avql@0vZ|1zII&&zcLFy zJ74@cq+Z6(yyW*!I23TnZac*e{DAK=%v7Zpol5nlsy~STGd{K>0-2x;6A;YveU?sX z$)19liz~NLkob1H+gQ<Mh7R{+-C+veiaTMzMgNxXBA9ZN9}Spt{0?HGyRW1ZKRA*8 z)oMfJ#F4W5mz8q%{W2N*y!Zfjs_D=d9naTV<V9~N{y<4J7BZ(8GcgD@KosmK{M!^W z_PHss4Q{<*AOYT>NV)wcm>$rMu3o>Huc;VAc;~ETcThn;YqoENJz(My0pSR~_T&I^ zYV%L1FiNLE&KPmvk4VOd4#5cu<)i-Y>zzf}_ii4i0td)bS$$=*>5)Gim~f}7Pf{M! zO);+;Pr=Y@ft8X`ac`~@y*q_|e!%*TzBLllOU8mG!_RGVM-4mufJce%P}A<yyzP8` zZap%n{S4HK*S|xyZ$KyVs&sMM%(SipQnU;Ni^iH<gefeVWKlW_EZy?n0KWU0$>BUp zYkdkD%+}Pg)}OFdOwV^LWGq2}@It~+!de{MjTDRr1NT#KOvq?*U!vH!X4yz9liNNM zEiS~81=rZMTnJwS0XhqEC<Q59oq(TF&y|7(<7{~-Y>yGgL5ZC5ACXu+upgW9FHBv9 zbh{7pA74H}EWlT620Zib&;J}3y{O?RU>E%O#8c`f&k^vNPXqH*tzBr--sNm|`VuZ| z5iZe^)8t|vUw#Nlb4a@!vMVn~mcL2ObOt8?DEjk_Y%#3LB8y`n;Cej}=r3&?KV}cV zl@}3N#}!H<XWW`9{;;{A-6lo^W{%Le_PK8)ANtb(J%{wmo{cgyubBv3H?Y%EKtDD2 zgl0A2VUYRh56s<sdZRD}tunkaL~PV@p3$z)g0h!;MK+H37X8azdDspsQmYM%xKW-= zmQ$EjySEWnPrzzX7VFT|kGg7Hcgnn!ZMo^323^E%yDmSoMVIPa4N;F%bs$-ooqD>6 zy8NCvvIejSyc-GQylw8BDu%|7U<SVjh>pA|-D>g!DfExqWM^!HlWmJ4Vw=?(FY+fd zf9mr^4AS8=iCESKC7@#``Bd#+zb_)O{iDW`Nu4=r<_BUzObuaw($j-hZqCr3pTR=W z(o9A3p1Z2W)gBX>;aG)aOXSQuIHr=JiQY~xb)ko}`9pnyc+IKB3GHIo(2jRrKF|9B z<h60wRc6Ln8%w7C%RGyeF`jf(EBzyi5snu9^MEQYc<3Hy#;w=w9{BaU4`cEe4#WW4 zU6{LfgEyih#nuWOASYUxTH|##wzRL^t(Y~4ERSw7a6e^Nkpaw;qW0xVq2SaIRv+Z@ zeRv<mircyf)TOQI)^W_rgw_dZ>D7db7nxl5I92vkVEYT4-rk_73hPgPND*7uSZr@f zBj5kc0$^ZyMk34TWGfvzE6WN8Maq)1Rs2H<r<yBWhKLK}bC|bp3{H5A61WVWksKyH zuo6s=e5;I=a1z?`Ge+4zqN*HZPf%_o+q9-n4rvU{C+}}vlY_!mA!AMu4N4tp-)$6g zVl06(oMl_`wWeI!XhsLHgc{ZFSLBL4WOq2cAdk$tb=uJwWqsHK+nwu+0ztqT)g;FV zHV)Hghw^=L#x68Y+ztfrPzu1+Y&wa4!Ib<+s8{-l?Wxp>>lxF+ifGQ$^rUL_#Sjuz zxBj;-u~7WXyK5J-`H42mtFL_n-ml&y3#RAi3b!?yin{qfOM>mZWySrCEjX5tit_6N z0DU;WjVv7i)q*J$rur+|*)v#&Z@k&@Bax5QLv7pL-+6ImS(({U@;&6h%Xu<Fr#QiT z##2R2%xlS=PIptE@miznBvGva_n82jpW{ktd1iCoSCeThH!H(KJ)1#?&h&kh?b64q zamc%CvZ2y?i6Q%iimnf7QzxkVi}KVGlN{bg^tfV)VK0iosH+_qzX}&t*+BcVA{J>R zlafmOIIx?iUrV{kuWIKN@olBzrg^udI}_Cx=VC6keq@_!uh6sR>nQlmq+ZUF%+rKq z6cmhxTD@ZpltLMqWDR07J%w!NR(uX13-Ucp2XCh-YH~BwiSPWk)UfkkQiH89-%~nq zyd+7Uv9fTE)dH%atwiCh7{5V|(J2W^sb50sN#0r(@>#L3<n*J7Nd;;)euGiU9Hc3N znP1p<ciQ=QYHi;+F@%cWjaqlz<nKBy8IoSns#`?l#z1DdB|jE1769p^UEXcSNnvy< z-hhU0goYSz<*m0X5{j(}G7!foJu9N#aqzwVc{_nbsIMb}51)scVuqKxeop1H{Fn7x zbmzi3Wv3<0vcQs$42?+(+UaogGGWmuD~<Mqas7r#nuw>o)hgiy?KyXhxDM~5H?O)+ zK_o(SnnXQzd2v$Jz?u;JvY06&#hmwm>vx9;$Z(6##4pD_XZLIj=%9|{?ZGX)-Kx%r z2hxu2TW4xX<$U;(XmM>6DW`9EzUR$k#&!48&nApOP4J6Nd;kqEmI=1G5V1i@K*ZBJ z2|=TfUV*p;A-$oKls4qvY6}^u<b=#eiJyL0bei@z4G%F+Fd#WLlYP~J_{JI1Zszi( z#Mp1JXxqu5R+^i`?7${W3BZ(J6=IqfYz6V2<z-km6~1W5#6o~fJ+Y#^SfyH=0j$>M z3C9<2zm-F-&0YU#3LSjFt?jIbYq~1Ek|`00*FpD3QhNX<)D640RJZed=vMOH*=w6@ z;O`-GZ7CPxFrn&?O;~z<jWN19oDMPw!oRYJ_i7<bkII9Ivn#+c1Wb677O;V%ummOH zhL!~1t$5}Jm8;NSF-SRg`AOkqwosLzT4bx=G%k?gBCMM&l7aX1QH$=Jz_pr)z!IO6 z>_&>FS*aq>XtzOD5V#A`RTi12g$6e0^V|p4TUW#NgY!)Q&x)<kCyji)o_;*Fld*1p z&@qcELR3Tq4Q&Yn&IRlv`L?jJSWbqTo}PY&KR|>;i1_Pr<e<Fi*4b*jTDQcXELi<K zish@9$iSWKmb`kuXS>>TPjjB`xY~NV1Wj@4r-rcH=G3)gG(l(P=_nmsz*D~UtNP~= z;M8uj84f~H3&-f<1s0DW7zN;(H-OEj!mikwzb=?YLh<oDqrkw}jZ?<sT>xP%%LkTV z`blbvLGxWGvKez|jf}NrGq3a2xWA{YXc;>255eFms_~gU1J+)tNr&aN`!eGTj@%n% z&_dJF4R5u8d9b{KemLI|)pp=P{GHOtEXlvB#aEZq4!{NiC3CE5Zvn8mryP9_=4j0f zV99NGFj74WNrO$q0Wx6A;gBk6S;s&}jL`WcoE{!nnMD5_0j-Po{Q*TxE1xuYUsfLi znl;Us4`<uj*iCRk8=6MN#HSQKZ3Dd0RHHz;A0xS=ni?{ga5Z62WrwSnt%^*9pL^6J z-Wo_8h}cG-R_v#YD51^MumSY-S1m8m56Ljho_2Uc_!`10!-~c5)SGJvxfo67D(W?8 z(ECf0&k=N8NZxYZLe22xC_osM#P*wCM}ff|f}h00JWy5y@SCw%WYH%6s`>s@(@n%b zi-R%tMhBGW4xFZ_LSPT0rRol_ZM44wxtLQejKo}I+UPU*DlT4DZVp9$izh7`TW#Qx zGhl1&MmTL@Qu&c;t$tEdzaYqF7&*^vs3pXJTe;ZINcewBB_Iw+L%%-o-TsyIXg#M} z85QZ$s_9kD0Z;nwaxgxoQwUD_9W5F|no07fK|*}>iC6ksM))CYWtZ5TI**1$pV;4q z-|`&F!9TFqnTnhYg{H$oFqHF^M5&U63`>0J0wh8@>(|@K^8qegiSyWkcN46>4?AC` z$Gsf}a4CO?OXx)D!{FleU^Zv67H@7d+fay0#_b~_sY%fXM)2m}4ISW9!lYS8VYR2v z#JcR<IDb>cl*Ke1S0ygqw(&&fPmN*5{u2K@p$4nAkGO2BB)jJ8;%6EJ>-@wSjhvQa zGUnQd?;>JDX-w<G=1pu>obZSmp-`yhQAa_!Wf}{#T`ethBcNhQFH*+uj>DiW)j-aS zP&83q`AydlUQD)4<4M$h0%{I!yGc6%NSkgap49I?Llcsl<tK83<as9aXd-f{@ycHJ znUFQBr#);-V0Hd{#q`9*scAUMG0;&;H6?t@O|LHu>=w@$^E4`W!xjJ=YSGW>wH34) zD*tRl0I~*%PK;^E=GgK={#qO#Y}HR<$8XeCAoT1;yiJ0jdOnxG#+(JhNH1)N$CHLN zm>@iopf^^bw>o*j>O$fjP_dH7A9s_p7PAbv`n+L0`dnZ@+D3q-K_(*xJkgE~MC3CI zUVIygYDxiZcSEvjkrEK%BWgCi1Oz%4eQRvPqgdQqS~)8DSFJ)C;KS(d8L+pTdTGNN z1@_d0Tou&HV?m*VCofivS888DW^;?Q!c*7?esZ5zKOTI?%Q_-r-Rkr(wEnt*Sz{cp zLn)k=Po(2}Wd|d+TjThAD^;>BHmNsP7Tf2cbljlm`sSI;wuly<fowuVU4!C5rFH;d zWEL%ff*GX`sLz^t>%8vWxO;K^`vYa!dPjf=Y$c|1{XlW`%#wgmOA4;=uJY>bHPtfU zO$Vm2heBdTAP%D<glKL+8{<dqIAzHcwik?{P2b}*L0~*x(=?@-FNbtXRevNer%-uf z9~&1^#}J30_UPHkjg=<v#>_$)?D65f_J%w6h5ommN$cR0-gosoF1kbJQ+K(UxVCuK zQ?aEY2<5bR^-I{9uSxTeUQkY^jhDcTfFD3k_>GUG-H!#T!twBhjsuAqO#5e{Uup{P zvf(oJRv1gY3w@`Rnc#|OLg~LPi@#eBCyosoMwFTxV!^x<Zqa%qAt6Z=lFu}f$LmP_ zgWgYf9^kSDNqJA=5TS8$hFO2jq|wU&k6G%8oWY8X7{mDm4=KkUZ!EfxnK`7o-X7}h z@to%(`AVViL+FkM#oL^UF>9<*I_s$lT+GU4gX!0)#=@mXbu0W;KV$yX0XBdF&@mPs zqgN#GZ%Zq^uMK9AA;*77!<cGj(r<b>Mx7+r$-fnwWGZ3CKTR3r=KOQp8zvL8!!#XQ zz}ow`w}^s06WdA1zwl~=<5!R>&*3vty|Bpx&cM0!xMRkiEPRWP(NmeRRi=+m3i`!= zgd`>?&$L^F?~r?=`U_=O_dE5ycpD>eA^%d?_RL@<*?@;u@*qH0k2)Y5yTm;U?!2k& zCg{#2J%{z^@(*w|gO7XgedTCZAB6|(WrWO4Hv9tew8cc)Ff0NIKH$9MMZP=^UcMZC z0JZhlJ@{}6sS9cjmUqxdeNjXoh9~9bL<8FgX)IdE24bEw;62Ei^7Rg~_9#h8plOa* z@ShfGCVJQq5A+7IjI31Lpw@;$=P37%@19xKDB7H(NXF=^6L5q9Y{{H!$M@Vx7m1s0 zspmS_n~EbvD2qPmL6#^o_7R{!B5q^$&d2ksn<oIm9^s4pS=@;LRhiO-S;R}Z9=xU= z=U@e`R8m}jC`RvqDE=0X*%<J$2xz`wHi9V%eS4A#-$JxCEv7(ftpT)tgpH-v55lkK z?nVZr)x<CQI7ea+0a9j_V;KvM?ohxiL!5KwjUV)W$!gPqoVsfA-Mz-;zGpv@(H<9x z9M;(pmjqf=PaH@ZB6mS&TDqjmoUphXNqheyWJ3D~0B!Klw>aO1M!ju+tvadBXjRMB z61dl9^Q#!hENS&YyDk6KXk)<_C;_hsJD4}I+kZ%lzT#PgoeBG1%scm8Sg@g*h|0~W z|G-Cu%RP^eJEYi(+DjpZ_%lo+pT7~VK1N*0`S)mBRFN3O{+VsCgJVIuP~b95{E(8l zw0~v?q=#M6sLSWLp61OJc30lYH)b?^G5?`*)&ZO~)!J{B=_`SvM}*~7zk1l9Hfwkt zHW#4Z2;hy+h*o3z#`VBhALF5evJM5Jue2^6=+K$au+urvQ0DH|ZuLAV4+DOQFdy5n z=6_3?So6Ic$%H}qs~%>DszByn+5HVpIl9qZu9qE^TQL;aSxT9wOb_Pp7rG?Bg^MJg zdn%pfuB)<!c*kT_h7AcFw_yVXv!W~SN(XIXqCsp*k3}4y90MMLUp~6_N>K{iXq(yC z%aXxE`#yXL8=XxQ<|a<~e0wZ_mgVI6R6ch55dzcucHjFfYQE697zC)p;au^ZmOCr& z?k3N;0(|v5HR$OHotfe?-k4PszOvAno{sU>r7RojBx`=FdumIiom~Q|s*I%uE%k#o zAqEOP-rCb_$O>pMOni#JgT6jxHChQB6wr3Q4)M)NOOV5`h8%#pM0XqPWECV!9t1^$ zlaN2QINY{SrV41KJ<bU45!CnbfiH?#-&#q&qwG$eoT1?`#7)xlgyDq&Ce|1|9YxvQ zd>@(0ugK=b8X0k6>)f-!KvBm&EqH&J*ptP?XEUQSJSTDZc_U8b*DNN-0>kxL6|$B> zAPK3V^jS=TJKbBQelskRkqo76`rXbHL}JPq5ulBck5<tMy{)Hpe&w-Lj;>~f{0cz( zt4~T0!hM`3QHF!NBW#yWGjiC{53O+e$BfGWL&wX&h_;s>`>yVSizr0Tlw=*_(?`5S zJ_xlbJXtq-<$0m|yFQzDf#e9sz-wV$v#=~;^vg<c+qSGeBc$T;=rKRC{du|^K?yoo zmEhC+grv00$K9*<Ela~o5_DH__<=G;;&LJb_|-H`?qJ!wL&NOS@wc*`y>AUg`i7(? zw#?r`=22T2v)n|p3dv{OU9Jv5oHX(C`-~M1{|Kx)w_JImZ}v;xU42D@wsl!O_)#X0 zhNMGZ$`|{NWbXDy-qu8%o4V<s>+A1edKIo@s2E#Ws58d(^mqI^UnED~>G;0(0vaps zi!@6@p!(1brF<PKx<j}v6JNg@Vz_LiNUcPwY`Bi3KPZcENm|V&$ZS{%9Q<%O{b9-p z?LGkv)1gkHsFm2zBz`s670~pS1|?xZbh%<O-fQum$0Jpxl<=f&R|ZF}yacxTy6p#& z{%1M`X{-$%J+WAF5|(}DT#-XsP=V%4k3*>bc}LC_q!k<FF1p12UVPy<PLyC|Ize<I zL-k|mkv%0ajS8`ppn_Uj^%fP!@=Sxn4RKYp6^W`8Fg4PAhmj)5TU~j_aVfci9MdU2 z@4@YAg;z-yB_EmB1t!-lCPsSR<4rSZPMwpM(6!{8SDo)64GAVZDU$o*gUX^Ny%22j zQzb4L9SezkHHqLqN=!LEsYAMbce;#JugGUU_-eI|Rim~s<BjVr`r&d@v@XOU+MECN z(dFA#<LJ>Wf9XjVUBbV->VBNTR_4CR6Oq|ATFHDnZzQhgsG_X!vo*U>8J3Uo3>h0N zCuCg$4OoRcS;@b^)<fZlu1g<mgw&+=@*4+MS)kP~IU-z8$<z8frtcjVBtW*dMftH( z5j5=ke7b<au^=SOm3@C0qn$!BF?0r#ox5iOpq5u{+|*$2q~6Rh%Q|&PMe2Ul&ZThc zsP^7yjDSJycFnw{_*giuPbTeqe_PajQm-xL&phrWB2<%Z4s<xCGN1Iy3ysajW+Gzu z00}5et!?bG;@YOzeo^VL1QfqPaOO$p<TQzRnfJ7wr5MB>%YjgLXhlCO3|gI-Qk+J> z^nr+bH(g?-3ZDDXYyj?+<e>P-J<8vwYEnbjLoaN}gAMXxWV*=y7jS|4@jJz)7DBU3 zjoB?oA{EmRLEStz3~?yAy+&?kk9s0NH$kNGYjsTjYqyHj()u{NgI**;Co=du%`wQf zl?e_%;PdCgUg;5o{)~XuTHN<WM%`lnGgNW{fZvRf;%-PQ^X(QF1@B1R&DeTA4a^qu z)U?R&65*Rac$L0}v`!UK#AFpShp6B;Z<RLF3J!N`X6^$Ho@njud>*5xXU2ncy)5u` z5Zr{Cw~Hv$V?4Y*6*m-eJF7pA%a)B4lYN);LgdNUa;|RF8M7QMnYkg`YpCaqj)(;O z7sFZtz^+Y5v|{1@bu1D4*?yOWtY^oMt~13}(}o7F;rH-Fl-amh{%wN)R*_)-m$PE# zqX(iW9_7so&1$u8kF|zv4O6_&ZaS1P#Zgii6f8uQu9i1hz0{v`5uA#F3m*n-)wL~b zT3A{3x3&#wy-Q(|6WLC#pEwS#3lzHPKVI_;;YWS~Nq;l%5=<~1o9?Ib30*Da)dE_| z%oNNuO-iP)xDePr?t6LmL(L=JTC1cXD!`C4^oTjOU!z>FT(`pyPf7I<{7&r45%j_U ztkRosPOwV#WjMKXd6AQEh4Hyr8>IOD`aev4V{l}Fwr-M%?T&5RwkDonV%xTD+qN}v zGO?YBZL8zFoOkQIcmH<vkFH&{SFiQalhN1^;~?~8q}v(%swom9zAO@#)}#JzK)ui4 zbU8zI)}Bt_?S-ya(O6p;^U&m0$=Jo?*}X<Dc44y(UF#^#hUsUKw!$i@uQ5wTo&wzp zVjEf#ET<d<tT~?Y4Sm4KV!#r2Ix=_<K=#EVFO^7t5Ee=`5>INF<h=*_7x(uxlHsZ7 z903KQF?u1k=ec83HU>NA#8Wg*Yi~73`?p|!e<KS%P4-Oc6#$8+cv<T|A;i!f3oN*L zU~)IHgf}N`a_%?otegoH-R6p#M<7=mn)5tz^sud{q+DtH%kaVuUdfJJ?n)(c^XUsV zs*bk9s5XxZ(iGSilV&l;)OaZHl{lt^BOn4Y_Dhuzvd|8(9{N<PJr3iYqwPR6-m@Dp ziEy7&6^;birh$n09d;^zygdm1PX304(ttIVj;=I3LB*2v0tu$w<klSYn)#QZu1umn z;zUbXCFy}WB?iH5j%#ph9b>VM6{I&B5px<{WOa2Y*`alzzwcOlaou#z2NZuendHjU zxST>Dm+Uc6Xx!$M&CTG>a2)w~uhAt<;F2;SyPB}x&`qF4?6794#66X=VyXXKjdH^k zOcGhDrq~A$&<c=%-%!^Ys}um$Y5i)2%IfvQC}C_9b@&JJ$)s5v(LaA+=#qk7sq~Q2 zU7t-3ST){dMpXu8+F!*ggF%QV(%kPK$#Xl5uu_78$)kIF(t^MC)vgZKSQH*JB+g%8 zSG^TK=yF&N4*fik%q@ye>Qm0`WU3=^$)PZZ2CpNLbtD1%@_>Fmfj2xbIPOrg{&-v1 zL6GRhCR~9O@;Q!#gM45=9L$E?`Ovos@qiigt$_<NM5Bml1L10MvlZG}b3CY}5eIgv z8*oBx$+f!SDkj$q>zmkW4~>{$>cMP0eOT#ZUXT*&Wx+sh04xt@eVUo+$k`plIaE8x zcbV7q&!3>)#Re9vwLN=RwWT(gPjdhkaX?X-{2g5%Q-5F^|2Ehb7Jr;I^KVJdhSPnw z08OeXXPJi$a+O2Uu|%($8J7H3o;<ozG$Ab+0~RoN*+rJR61xUDxzyqzWaRKH1>MLD z0Am|%>e5okydly3tt{GT%|epd-YC5}@8VxK<^W(8Db&ghw6(^oDPv^~L9;5&s6Lut z;WY`N`8Ha>O8g5d@@87pDZTMrG9gsQpE2HZAcJVdgvh?+(+nfch1D-%jz}DJ{YM|I ze!5$@F|<^ZN$4{AXW+`o3(SG)JZmx|;uesZWy;Agxf%(0K58GR8x-Nq9V(t6D5>Wg z@p`zxqcj7TWS?$&*1O7ujz9=o1MBv=1XaKgd)*a6&8K!%A?cbyU{v$LW+x+{F)JR4 zT?C-)ZyPV5GgIpz)$4F^9+h$^#J$4WYBA51EoT#dOey#CRw$=x0;bM$6>I$pynQ0Z zk|q}GBmE(Pfq0N$7!@8ZHu~##b7fGFni&M@9@%!u(C&8PwuSn^e!v#l@Jr(8&o^`~ zr<<Ls=D~PyM#TLgSh-oVg1%Cbf75^R6Qx!-ipc8tb-*{;P(VBwxW_uP)FZ4~1n9_X zJ1mU2^Lprpkaszb7Geee5Uy1QzVyc*Qg!eDe#-&?He{Va?v)Gd<_AQLwzV7QHYB$R zeYUe}`+U?!v=uNjAHS2y8C^~sb`VgWrQHD;z^Dn2+lES8Vml_rW)K|%_a>ZDpr4H` z-jTNxt`hjMd>Wca0W=3rRECR(k}D#*L}uqy#`Zc~i}_sfwl`g%<uG2#ltKx2M|=|$ zCerW1zK>NDzFTC5G$=|?d9ZA7E*N{%9kTiZ@;)@U__qhsQMKd#n-3@R=X11GAvJ3J z=3AB)65J1VwvM{-K<Pa@1TQtF;#;3>JJ0+t6WTk028el=m!`IMG<mQIaWEvbY)z0V zKs!J_r^!Otn-`R3UmOD*$2kAZ%phXilcmXeruvK4j--1THQy;5WWbK(eJb4iY+mTl znnc5tYVD_^p$z!PUnI$jq&^x;qmD&eZkZf#Ecf2jtqk=OdNU$}SS}dwL=cq&L;ZLA zZlhT>l<|`fhODHFkXCHHB3D<Ikjv;8=}B543S``cZwWHW%pBIFk~vKI1;NGs1kvoU zsScwmwRZ;e8s)Ol2`^>W+~27puIDU<u1_JGa$^liqNVp-YV$v3`6n!ae*4R&)(7hq z#8I%GDjf~T9faH9xnkk(Uv0QQ{9bsnOQAX1MtQCnz-D{81FAnvXy)1up+3)HjgKXF z#!~vFcf_<}!I$x{OQkxzm1%_qb&xF0Kc)I;1Z=uC?iG$f9I<QHRN-%Bbk<h1^OH!e z?8qr}Z9<+OKw5R_`x|~`HXmmh*}q8b?Aqyt-fSrL!QLB-xEHfRL8D(2M<u_fHn1ta z+?%Cw>JN1Lx#2K=N~6J7vTaxv_0;Z_arPbjTjDj^TviXd+qCK~n?$`?R@jW%_IdH@ z(Sq~6{PG1q->_}As|uCIe(m%WHe?{$MJ>n9h5ULo-<TNVZiXfDcWD2sE}j2jkCvP@ z!Su{{-H&f(C(JJCX>a{gzWt(@j^G}C;FVSavvD9@RPEnkhbHxY7%f)^s{T&DBFKQy z29wpr0-7n0Tzal?uc^lA29LZ|odhf{XFrQ==)^9PB3yEs%VZ$yHdoB>40}LXxVO)O zvV{K}luP}WHJRcQ@gQHZbG2s)eq7HIqHGQ1yCXiu{Q(wbNESh+U7Rt*Q+3D78u;1h zyl->9k3dZCJ7se{&8nNDch6;+?WDJp`erMGaSmz6Sn}cO+`|KCwDzU&_1O7|=QR!g zdWcZzGNDVsd#-Z$I4P7@3^b_%nl!&*gw=KOARm^;dSvmWPM#k$>XJxYWWoUojqPpe z@4IrvsPkUFh$ul`*f8=2FPs2(=6Fe*LGt{&0A=XN0k18vIIO|Cbtc!xRA7ma2PLnZ z&^X;ijz(?sB`a`mNWlk+6d;+u`OCk+n>iAixBE32!wilc>nI60L?yMawC7`2-nGS9 zD24dwk6`t4s6GGT%NIIDy;bs%K1reP-gvfn6f_I8xVT6`!U2Zb2!dKU?`12&-$T!@ z6%GTKFrY5Ix8lz)D)Z2@)Z!nv)``<SZU$$&0k1z!+2*rL-1X9u2OgDJZ?DCeXS|=+ z9rBc(V;rKxg(uLrDH!(9P17R~vvww;o%Zm?ENxjxRc|J2mP%|V0&-aol_^j<IdvqO zF!SSs1?e~tU8OE%2#QbeLUnhDR;50ECEwosukla{HNIL^;W_0XHEAN3&Vhrzdkp&0 zpl1A&;<4DimaKu}>!8%LocM<8DVg=72NfBkPQD9yET#+*f;t+2Wh~@Bv#3wnKMCYN z!%0>WEHdXXzIrrd*KfMd(+7OO^he`A;a}B7gDSZYPCq$9EgkJ^GOImNGz!z{z^~rg zWRZbrvxjh<#0+K)+<Rp8eB?LzE2+%(9Ps)3-45WFZ^b%t`crYJv$wr4T%$s1yYoC? z)&fFZQAaj~7o=~KgT{kjGU#fC1JqgyLXxI7f_R?c&u^4;8%!{i^Z-f$)YY!=Kyh!G zT}MqhF!<5Q*UZO<;m<(-rTvFk$G_74(*D#U%zeHBF%S)?_jmT;YyTw1uK~r$9Pxi$ zhxx$j8v;B)M#+8)8=c~_wf4$9X>-9c1a$u7GrwExC;fXG>+J-Ce(gHo?EvZi`)2>V zd{aC6Jmi34Wp7~oyR2iAqTDMw9$6}H1(&d`zoEXa+mC(G`B|!59ogNF@-@!`?FyPh zqsn(Fb*}G&vS%IsHX;LoF?S3RrQ?U0A_+OZfRt~Lf)qI0os<RSx@;sSxbM`bQ1`X` z+Lz^tCT?7!8MJ3>Ri4dogjwsrPfW${Cm62`gPi_;>xY22X4d6_wUdTO_&yEHQtk=D z*y0Qk_49)5eO{o5rk=OzyqtEk@Wx>oR293=;cma$zz9(UY%2GR*U%4)cj7u+u9O8W zp-z8!|0r>$T238ksDQ=SqG8G)hr<#4#d+n?0$?~h_HAlo`b9_9y%D<dXJ411sg<$p zaot=>WVt7*ry1}=&kuK6+K;wy?%-IKlut1D4h5IT<(5@`cY;^9_pn&Z;cdn4TiBFj zM75=aUw6^romvi#ZoHI(A2nyZ0u9ON>K@kvcS&5N_kJZ_{T1Y?>>Y*2WL%LQdJ&Hp zn^yQk<6dg+mxDL5awFc1tNr+?{=H?X*wHkp)w?mmR;5axRK71K^=PV~8@J_bk9iDi zZ0Fzl`#osuhnv|K8CnOqzLW0TA6H(iT`zF~`2Xf^4g|ElZn>sEcVar)x{q@h-HOc3 zK#k9>b&(L@NQ^c7`)Y(HCUjs9J<lnTNIF@#b%!mlH-jVjtsG8ABpp85%us*V>1VWk zb>W_&V!&RHm3AoDgY@<lh#kj4N;6Y+FDInC1?S}P%8lDZ=yk$S4625~nV^322KkSV zaP|r^O!>JY35n<ma+n(qno)$+QF!scZ5aD>?4pP{LZN&SD1vIrLfXA?^YVM6u3@P7 z9r^BD8N^him5qrRZ6tn6wj$n?=RMTyfLBSshN@rHjD!$&Lr{90!HD5AKIQAn5-i3L zc*4Sf8N_`vlS$JMLsl}*8ee~NA$IS7z;db?@lpr$zA^S@`_UGx1YN@yJu3|bvJ5{M zo=Cr#P|xQY9dujB!aPX8IF5LXUb+c!TzSnL_jo1L<UTB($D8blZc5+xa4+u-CKw!7 z(s`m8Z7cNJ&hMmHCCu<{TjGkEbfYV8ZM=pJdKm6$jKTda;iJ53;R)B~8&D|rB_v{I zkKtPpNI;48q#tL913mCbBK3o*#~&BW!+j`W^s%@yS<8zO3t(?v$i0O(yy-a3y?1<D zR8cTNUcsvpfGMtmqayU%uzUT_Etevb;v4ONSCRv6c&hhoTp%lrE0h`362A}{OQitQ z6OIWQ-Rv%AJN?(@0QKPj#8UV4?>8_}zt^UNyueqxqW~0AZT1E@&ex)d^&zjci4j#Z z71olN&!N+=JcMa*RS`4oZ83qK8=#*8Lbfy-M}OJ|!B~HnFfjkXCLpsf)yMSQO~bdO zs<TQ?dnqOHpZQfQg@t<~EO+RWY)#GTJ4g(vW{UikDn=h1GAI`9ppnD+*px=Ci5K2D zHOxXWM0H1=!xxq-oz&KQONODELsc+bWhag9H#X^p#=p{e;-e+mTUCK%>f_0dpR%aJ zdQBxKO&j-peKTg10NI_d4bDbzp^XV`^Kfi^7Lx_<BL}(~oRyF;-8)G(HZbGd05Q_n zln`voJ)%l~rgg?oHQ^JpB}67cMV728wv8eKy-eVJbMO+E&X^u0c=1{@rV_`a_E&|r z8LIr2!9F@a6ty{oq%fa6CUtCKBNTF{?*v*f#`#m=+L4W=iL0gqPQ{Qkdtel(lRzE8 ztDNQ(mQPtDg5^00zK)}i^RVIbY~TXI{<+a8T@6|h*F+&<kzqRljviw@;OZL@n3{f+ zpf-m7YT{y|^WL>*MxzfP=X5JzIBNLnfjxEblXZwlH7dM6Mv*c(JX8W}0_bNhw<-(Y zufuu)-Tcn^m@Wqp&Ot6(we)M)fp+4EnipBJufIx8eA}>H?`zzhuHUBdzoS%g&Vygm zjul-i2t6>NJm{7BNfbT=@PAx>+dg3z)g=u!w1pzkD~`t~+r&O(%=b1P>;M+`UJi;& z-UQw@5?K11<iI)4zlLnz=$p_#RqzRJ<*5=5RL1%HXLDUI*;6vzmtj)EqhA&y+u7h0 zwluWylK-qi8LZv!5Jwx6I5}e^zw4e7qB~^k8$0ZUDwX`Hf2Umk4q94_JGYW0Dq>0- zl1P2|2smfxgd65SbHs(79fh;=6;vOd)}|!0#Mr2rw6rotZ?-G&;IbQl6t06&zT-)C zafQa=*@?^+98P%l#jnoF2LFt^rYScH4%>3`RBSYWsJzPlbr>TDjq-O|M>D#yriy8e z1LQni@YyCZx$i~o4pl>5H=O1D&F@6rbd}=0HzKGt1^VDP>bKLe#3KIIQK#H^oe-VK zZYWK%U0smNBDm2P9{pIcJ;<tgPX9L;2J3=I)=~V<Q<u{Ym2Cdv3&?JL?xAc@tFyO( zc=CQhDZeAVFK$vDDX4X;6Cz6x(!L0lD-E604|SZ3xP@hhAGq<)GyJ{XUDSrkyJat| zALXsf^_3A>&A<igG|Pxk!$(xazAPz^Da?-kificm*`VF&w0JV(YVd4>W{G4SnB5~D zsKnETedI7;nLc3db@NEA!g!e;8<k&~I{${h4P5<KA+|n)Nu$c#WBYYiWH6)0ZsIAm z1pAO@1^0xtM{q?(?&lLkKoIcNZivzmFDOMQWlTq;?8t5AN(K(v6GJjZi*hTj##yPw zM|I*#V)Ykv&iUfHBPjVrt7#G|<sVZ5V~|YscZbf_hMlzufhYOyqe8)f!)7u*hI!uM zX(79Hn_>)$$=xfVo=!FcW$-}XIRZrwzC?lF`a_A<bgyY*)UP^;X{<++TB^6E8ZA^B zkuXwUD?kC3&ryciyRB27kD!A+Ab_k76!=4$+-YFmLnM=1Sz9-|kz)`Pn6|<i*V=k} zqUUZ5A)8+1pA5nnS!1G0)az)(Og5y6JPV2IRCU3jK}25f+Yhh{BBK1L_7JD-Jxq-~ z*V_B~t3Gd-9f4`|c0@n=D&rXlaz2^qP$(trKf<%O%cA*-^aL|5z(GKoZ$=8rBAO8Y zY`pW~lnl@!xTW71f!!!OBnQivfc!MO)ryE3%aQ>vc$RPTf;WF7<9}p*5Hr+kmG-^7 zDh}BasT5^Hk7K6JbW9V)DYaLTy?%A^WGrR5=}v!(-dk#$oMKIy&M=&jKZ_$Q@HM38 zSAiTgOFe#k*ut3Ye~ni@`$2oEPvpxnU0oU!@TQqg7GMOMMB3y#Q+>^9#}HB9(;IMh z3%=w7@ewL|%I9WabVTk+S;qRF1Aojdh8jkV!yiBUZ$`w{odpG41T-4(+Qr!|K~Gw* z-ODuc9L7}D5#r~FOUB-uL>RovnNiFZ)%VsdY)A(`&D>$1Q0->|I|jY@yvjK(?9S~- zD_<R}oTxAzhP!Wi%cAK7_=bu~x2(g$K(r%U9UiXfLZxvwy=hf)AC>o<DyDP@KDO9L zx6UHoNcR#P6Im4kg&Sb_bD2+|yTHM+$dcTRhn$yE9GY$E{dLmYuW$5SGPl*Pe7gx{ z?&$VNI-KEOC%n(i5QT}JzT}S<G*VSk!=Bn0AZQJR+k^ZmYT<Mg-_Q8Qr_s!F(StX@ z6**`{{Jt1RsSrV-wk{<5fmvpbB*^CfT41!denE2zzRZvyF2V3dt#9K7zy1|ky*-wA zXvui#^Wm_Y^<{gyjb)@9+NdF~XGcmn{CM`KCOhapdHsat0zZA!Zc9Au3+<(peQS=r zB=zcvUrs5VyZNiDr#SpYVRe;w8z>_J@!VWiNHZ!S>_e`0u^m3XzD!&d-*W{4rXdky zpLCb%GY&Ztj+VJp+>AX$yFck9OhS3%>*Wr@pw|-gNZ<3;@Ok%3<VG+v>eO2~F``g6 zDrH+5Gq%PE^SZN&B7-7`%#yp(P7g^yGl9VJ>W+4v#X7_&KCb%r9T=wBY^k0wOqcy5 zEwj6I0nCAW3kE)QGt<On1xbWVXyav7yt;a9#5A!6WuR8C0(#u=6Lq?6`{=$9BA+2| z&BGj)^SAMa^t6nw^Q!-HRcs3-IPqrr=xE%UI#%><gO08DhCuGa^n{~=S$u|ZTZor; zF%A$H;n0(vaSe+g!eD>2vuor*)q^6aASrkCVg#051+V-4j2sBLwL-IVpHq2(8BjcJ z2PO%DwNRpxl>Z?e#;EeY+@?0zPPa_4PP(tHX)j85Sej#h4$ezlyXj!^b*&1QczfEa zltG+$_?Y55)po7El*V03_P>Tm2p)}OdDYY~faG<Zz_Yu}AjqF|h}HU2ZGUBL|Fn~3 zSVWc==WsKKF6Ffsyc#GzUTPHq!_|y1JJ{)9uC5<cEf>R702PMD<~hOds=Qani3t@f zll0HiV;ww=_2u-6M@O)H(2Pf+;>$pXZO@YvV5zCLI2)AXp?0LSK)r5%yu@?mPo=UK zWIqxdNaX<}{Lex7KWLSP8frcg1PUlga+^9a@N|mmWq6b7<L$>N<*a~SN>6Qk+7jy? zO_mxemssCJ4Jb%BFZ6S|tZZ`x1>~!DCOY`)wYTB&`9FThcla<3f;bhQJ#jB7$lX-_ z-pR1N(UJEqG>;E~y)1qp6id7xN(%sz?1+k=yl>0CG&o7hB>$oMWqv1;pVQRj^WJ#D zmr(PcS?c9N%Ic~^`r6t^dCQO$UQx}DcY+v6Iz7`(KWb!^!e^qf@W&jyDXAR-%XQ!! ztNaj}8a~ml$h{rR9_5$lgQ`cW*9jlw(A^ff)*j?Plml%v)B>F07(oqoi)5k#u$@qG z?;qSZb>emq%s^3a!$~0!Dg_d;=^rk-%wD7Odp(5P-#u#`EL<>j@qMB*ZNi@tK<j7s zT&Sr)Vfe!}W*xC@(9F@kEk5P%P`5ul*0fu=y`d^KX|qcUL1PWlc<0^lUcz_1^zQg* z?%OLfL?h@!kO$SqhJq+Oqo~^xHe1mW8xp<nvYa)+8Yrt;k+rqx>`K1@t<CU#PrZ@} zZxv<^D=XUr{F1NvdC~Y9dn4ZQaHYkH&le`Wom~W^SAGS9jMmh;=-sDv$tZC=mV_Gk zZMU&?i6nVlW#i|gXKr}mF-C3pG4e{ph(l15hF^2S)fBS=D)Cvep{La7oN6-&d(+%7 zWO87zI+&FeUt2FPgIo_Y3Nv7alC_9NCpEX_6D=I8#D7S+cOLE2(Q8x&A061OBS%3! zb`P#wVVRd%_F7o97u!j)$sA%-B>j(q{D20=fHzug+|IJuw<hY><)5D$6w9!%e2&e% zJ9W{>R=G|KvP}o8xBnIco{sMd^>hL|PhM<3KD<n~`#XSWJ_0`p^lAmyA@-RCJaah> zP98)|BE;^IY5W@G0=xA*!L7D>X;qs|+!Un7n}-lMkKrh|Gg=(`wX-i%f~*%~>5WW? zO&X1w!Qy(vQXA3qZ*@hSUZ(c@C;WCK$Q^mn76`*Cn}1FJn4t~`q`QQx&@o{db6RRY zx62jj&%BFYs*nEdaJkNJ@5<t2IfrYgzdt%^B@d5B8OI4)?yN#zDV0EnQ|YyhSl!jh zoLQ_?a>~1=kf>4K%v>6yE1<-jSP)TN!XtNwNfV7Fef#Vk0D+ItVSmO3XH}M5)baPL z)6AgwMub7Wk_jKd-AngLk|(L@im6WHibVzn>xDyGSA1BjX~Bt+eB5#<nGWMklbLyv z{OJEfH`(B+Y2e_-9|-{nTzlUi6V-zwqDsYpKKhW6BX8S+nNviuHLLywd41(p>=5Dk z@_~(7^z`JWZ^k3p(WzDym*r?1iAPc)X=e<5`0i$qbun44+ZTtgKl#zYa=way{jGJ3 zd5$UL+ap(J$kRd{Ed=fvoY`@W<H4Ah#~JvXeFa4h!@%%&KR<Fuq>5laCiqFwK)Q`E z<xWw7N?GtJdv?Q+WgZ(J*A=<leZUY@CF+!!j~k7{DI}l{rgA$KnBPUP$6S0=jqVwF zb{l2-{F?Q%rF=%w5Kz0S0snCkBAex#!-Xu-&PRu-Agb0z__;=XQ^$z72A~>3KBgtE z84qX_AUwM)ncYxA_>jaQCYgB5kcs>bg`21Cx{!^1ENWOH9L=hD+<TtJgW33U1T6OE zf+pUJc|RP>@BfyhjXrp6>h6R){$0DH;m11N@uyqJTQ&iN0KcL_X`|zB5*)J*m6%&9 z%yo>;AhyiP<_a(8_{B>`D=pR-Dac0`pD8KXN$@sLEY#;aR%K`+lHu*I)17P29pW3z zBz4IZdJ`DeUPE9sNgU(V`}Skpbx0rxS%V_5VuI;wk00-Kp4UAwx%A3Ata^ZQ^he;z z{3q~T_)TC-Gi%-3Wx%cDz*qfAt8Yz<FG6!Y%?1u}HnNm1S2es#a1F*pMTu<;P(1d9 zPi^du30_9Fb2G!M_^t;4Bu~B8=3Wt?+f-}X$HDE8#hb%O!GJgI26>r9o%&YcmsZVb z5x3N~iFQ$%arCO@gkQ~sxCs8sKBh#>HsP|kQL`J`dR6^}rg`YWb%R9sqe(^}P3{K; zmaa+a;>WRs(|+;(%V<?;aAV8cy|J%kk(@bpf~jtU7d_%U>!KQlSSB08ZP;{lA4|4( z)mK5f*>d~!=dfggo*oL#T4T5Rs>Wf>+u~!!by%+T*|BXcBYV%We<Zs8kxHv%2<42L z!GhKt@cRB9-g(n~Lz=d!?TNt0;p)6xV(f4c%P~E%eTU_CbRoJoF)6N1?hRwCWcA)G zuF!OQFO-c(_eug7_Y--Q6silBkLBUr7}jWI7%Vc}=ZEd<-%Zf#5Zw0N3SPwyr=RU} zMzO~@de62Ga2DOP!GO?oI2~B*_~TO7-$^jykOA1o<JKoNE1O^%NoM(}YuFG)iWY+% zW^Pfpt`qiLN`ROJK?9L0a{t8sLh26aibVeux@*1aLJuFJ!+2HZlmSO>bZyv>8H}m_ zf~@~#fWF^R0@U^>e=m3%S9DiADNwE?O}kGj(8s)xe^x$U!hvBDa06Rn)LPaA*(qXB zzD7bzVK99FT6Ppd^|9fx7_LrYijgHQshRRn|1*61y<X%uFf(pynn@_SEm@nwEO$b3 zV0?y93@D~QYrys4un~Jeg<aW`7kKNT+GBJjV-r(vRPKWEjbTH~SwraSgwrCSg0i0} zNpkF*S9^DFKf$E@nTl;u^CZiMGR2XmDbnMk-RyHOUPR2x<h{QDq?O8TB5rSZ-&SX2 z02=A-ILn!L`Y-p7Fiw%4BECw#MPN;+(?;YNCk$2_^w`#^_~$MSyo5QmSAzAvtCp4P zUQb;PXq}g%aBgHMm@y$q)j;tokzzco6gVs*9E<Ed2!YM`Aztm^teb)-w+>Knit8;c zYq#`9j`)%7@oj!`ms8~+6JFq&dmiahq0TF6Z!Fjx1B+<`zr8NI^<S6J`xSTe;qfuC zWWjK-3GBy@pg#CgTlwgnvKoB+^vR{d->FboXiyJYeF6QE{C*C2nSxv4tV<06JAi|3 zDIpHf1D9UQ`@PJmf5Eo7q>SGyXJP5AkYRypbWL76RGrUbSX46l>(lHk69u_MHGZwg zm|txE1Gm68$bRxKI}YvKNgrd#7AE2Qzf5Z_Z)Pd;T3hIR`>L;;@9FO7IOps<RQ<Sz z`gT{si_3TU>4OXPuHfxJ4Z6n-GRclkp!Y_W_seiJx@O9VtChk<$S`+3Nb>6q*7*8i z>Ui4gaxt<m53?Y@fMv&rAwEf{kX+Gc1k#zHJ8;*Ef2*)ozz_S}&yG~=;F1ETk&TBa z?P%aLi#te$4O=`RRDr<NUBSZO7r6%UG`-kL)}=0D)swiH4OiqD#Lt21L;(Bp&Zb>A zw9yy*sN=&cmRP2Dc_xcd&5Dtt!Gna^EYGlK(JAR$K@D{@dsc9<nJ&}Q*OUqu@B&5q z<8hKxLj-o*UrwFCd>|C*asotNWyFx#<C*J)uvh%6L3okvj9L8rDs})b{8ggAt+S!6 z37Ju?d75RF>6Z*aIP|(8K8`zY7Eve~sE?L4HbcMGD>k`x>e5!frD~3>eI8!mF-#A} zGz@m5%$?}p@h+_x!d|#DLwb3^x8G7nHKdr@Z$NqUD=PoYP+D~?s{xTPuy0Pm--qUz z^Y%%wU9jA&H6DJdv*U09NYbf|)V6@oqbLMbkv-S8J<0t6Ya8lu4P$=@7-6!naMESi z)xn94BL(_@x#eapi<O;zB)ASip%V~LW?)RH7KDYg+2^n+(nE?-z^j6mEO=gD!fdJL zo1=u~ke0v^F#5`v+BM7PTh}0y5MbNwP?3`L@l9saI~7o9Ayo`PBxIng{$y+Y+Ycuy z0j-ai^ewH6WolRX{}l26qh&H^0zSYOr-|#2hS5RuPg!vZiEn)Qgc7|b!MVypvZT_~ z(p?TEVfsdV_l1E8U;}MZ*akd^M;qzlJ3bHAtx3V&styZ-eX^<|&42HF^gw7&<QxJu zCBG1F^RAjx5Bj?B?31xkS4C~o@tTHpD#%$a^FFm%?1<%V&8ZVIU&HisjVBicvtVZJ z3bre<j+ekqfgVJfGLFz{fFpy_JY)Nut%*Z1IScw+BVRsaN^V6M^(yS?xz&`r!b8bo zQbs9-Bpl-wjy1ZjQ^(v5kd<VFQq~XR`&(pt8%j;r&#}Sgs3g;5L4%P^JzfL?&9ZET z$-??8qpVS!7W2;<axeOAW!TfYI-|^FEcb7v@AGd$-;Q3g%kv4hj@wnYOk%veVYs~Q zaB0M@yr&s!h9EZrT!}3p;|#b-g#Ew8{gy^S&S}Hr?|wC`zq5vOUBF)+II2k{15SeO zMjW5v2FV}?D&>sj0rp%T<7EU<KM?$!P&3QU9gLG~Q}e`fs;zRwE+as{6Y?=6X|jA! z-D2RMG1NPpYPMbK;Xc+_s@r||f5&DcVUkzhSgf<jyKoq}n6NiOZX)Lq2w~ta83$~x zrH8fBhj8^!@Yqqf_0Giw9^1CoC~jccv>yv*-fj?9!(q_wUsYTXP{lqD8I<g)Ee(0d zjP6_8e5qYIOW3d+kHsKc8e@IDVDxGw=q`4xC9&)XBz^4K<%HcR>qC&Kr8&ewh$Ac| zs6|E1NE6kfuD*Lg-Ao9+1OM^O_yOT@1XskyD{KGNOUct&S;rq9_P=x+)Z6(RBljwT z0pEVv!=fP}=U8S?7qu6_ve-DLTm_D?bkYz4z3(lwpSM@$-sfTLn)}g$;*Ha0fx2fs z+(EazoZ34Hduwq#$B;vhU1zN>8V!D;+V^r|rU(j~h##5CcyB9u1Ge&8d~7H#5o`(t zV!`wZ+cER_Rir=vT<ozbQ2+MamRyG<W}@9m#+|D>F1jf7CHgT2NI5XnHXqpJlu^ty zmIWe|;d8mPB`@oi%^A~;yaG|TDWR;ubLq&l`2f|Tt|vH#T0mGe37SExE8D<7Q~=4Z zTL><?f|%xqURIDn2$b<FQV5Ev0T)I+{$~{$ZJ*i&H|(3X&)uBS8hTiF#>~DoFV3)> zXpe*E%{(7MG@btA<$e}iyDT9B8R*Y*L5kLsQt5!~C&}sp6D+!Ia(o8N!k_z$b@pfL z^f5^Kc_}6Z+yl3<qj_#r0`#s>(=jFnNgRA3!HOOw`}|2-p+^qP97pNI+J@sWoQsRC zre#|sqocgx^FOx+FTF?2Eo7}-M8!S|`~zOos2onh$zSz5EFJzgCHtRkfld&n7^fN= zX}0IOV$;Yu1meha*)_xDFb+-oD@w6|Dpt*{37T%4Ze>IU7h3F9lj=k0t%oloEa0cJ z;O{?SLW`M1`EC?&M*+l}7CmkL&c|u{Nbd3I#;Wih{Yt;3^?4sDD+r(x>5)szhpKDR zlE9Gfnd(DcyAHwEfMZ$I_VknxR2;Pe;`_c`=#Sox(J$(B{-677jR3K$MxN!yUs{n$ zHzVIG=i?9Npr`JxcrDjW%2pxWv^FX$O*?1esOo|;G>o`4hnqTiaPUjkwELI5wLjJ0 zztJq|W0rol_A>;x{2acg<6JgrTrXoVhO)<_AMOd`L2j?VmmdN_^L?L+m8>4P2rcvZ z5tydwR*Pje{F@Z=Qc`AoaE<}prx$w#aHSb^Y4*0Sv%jF2z3!~mO^h<68aEEr6v zbF)@?<a^eXXe8y~wm{fm?@4s=YW;pKR`Y*0<(mY?uBe}j$0p2h7ig?9ySClvXlS2V z%ZI$@1Jj+~yE5@i#EiRZNjJtN&E8=tJpY2c)R?lz=62qI<mZhI--9=<W$55`uu1CE zAlT)0b<NENkw#{T81EKtuo;iN-^p~8EdtTo=P&SDg?CPZ`-`G4`y#+7;Uz1IE}qDX z)E#Jihl)Jk!{k_ezRy#}2J5OqYU8)(qj@Gx7C;D74%<>rS#{}jy6482h%s?u!}Hq( z^F}~iZzFSb<Zp*}uoHu&;@}Gws78pi`wBmw^QY->rVBZBZ3*s@U=N^E0JuY^rBnCd zui2zvhQs@ZOGCN#m%$}kXF?kdi-{qmz3uzzr*mx&p`Ez#&yTA*KlBb-lI-x;!$eI$ zWgy;#-;p$8Ghx3G?HUuSUAkq?>3t{!MZ1$}LUjANGp4}%Z{2y}w`y4LOeb4Hs$m`{ z7}p+&ZE<R{PEXT1+scs(i1xDhlwgb;J-q<l-dAC&F{hDlrR_=EyB%P7duQ&f-CEdL zJr8vS0D5^`LnFTV=1M1(RSi-g7r5T@>^s_&qJ&{_{rmZY<!7!JuX^Hp;*AX&#sak* zn^FZiAwq>uoB{%+DS=1zAV`r`uE^<d?}>C8d>s<it)5v-@r8chL=H(ipDgZ?4f#+o zN&xm|BegcA;#UbD>$F-t7`BJ1M&;l4(D#>(ai3FJy-cr+r(+T&L*29HI(JlT@2igE zt`h#oMHOkf6j~Zx)bz~EIbW5E`8QGl-N(bb2pzEMDf>%uS8j$dy!KBMZob3krG#%B zo^s+a9?gpJ0?j&z2KU$;#o*JmIo1Cx3#Qr4U+B?oPU&X@_NV|#vVyEGW}~s(Q!(aE zgNDaY@{<D?7puKMlRsg!Wd%cxF|`Mah?hr;s-4=GqN<F8C-wCl^gUvV8Q(R=tW&2^ z0#C3C0VhQWY02}D!DU8E4J)<oK~%GZ{Bg9nV}kuD{av!M-#zprC*F_(SjM+dbW6Rm z0wKG^jiq~M;ns_Q>07Gw-z<Qh>?^WEc#bD>(?wtk>Pwv+-gxb3kf$CyI<3piYPLN* zDie<|B(=CFdE<3$$R}D>{;K>LtuZxct=LrwMvQoR51*LrsHi&>32?=;18YT{uBQS^ z{WH*5jh!vV2fT7nLm%1vD#(gx9S@s}OiGCv;%!ZiWkpW|w?PLx_ZD{dF8_Ioz}meC z;Ic`9o;X5_<Uxd`UOa*|Mu#K#j&w})9e`>KI(wZVHqAv?#SmR+<pf$?=zI=gXo)C{ zW_Gq=a$Mq2{k*Js_Qh9!D$cd(0>QBIUiT+|DfT2Z{56lBP|&{xT>c<wg+l_KF1hy) z{N_kq|IZx{!kFlo{t66Y$$X-ny&C&%pIm<=Bx>yR#*LGrx~3{pofAUB;pYQzIzuRD zu-|%RZj{Q2I=DlYV5OXOGa+HG%NphOld=4EPX=$my25ue`gk3}ACrjBYmqlcd~O=H z#65PPz@|v2hO4<v1Hcquj*}xmfOp#hk@shLxM>qMDFdnVi|0*6Zw5Kot?ch%B?%cQ zga_Z_1$xmQum#~Q2gp7~@25NKJ9~vi_0ju*Qm|;+v|-=9+AmAUxGoqvq88{8uPlR= zn}nib2X5&0yppVS)ASafOBLKCNL!RN3nJRFzzmP40$&oG|I2Mw#ZXwNT2zKsbKP*3 znG3<zJRFh0?dlAEtiDGCA;*hPl!#TNchZr+loT?&E|r{k0%@#OSnmzfHbW}ZzKP6H zG<e28ZZqV?E-8@M!9{GQu?*j`mP@U|nx+#5`f4q6+i@)}HOVZqa_3kB0?+NsP&U~s zA2-pVpG*8M37Dk;4sy;j8s+$%e4v||eC}dVKMs<{So3-oHwR@Nx_a6Nv<I)ZAvXW8 zEE2B8j&E8K6W^4YEMm>Gbc>M>Uiy7<k&TCdEEzAe&NqrV!c<C8{}o@(leB#h&*U@O z1Ju+F&@^IgiA7@EfxFjgjPJ)wQAnIy9UBzbL0&>~)027-B~lmQ<=&Rkksk^N&~y73 z=0ld@Iu@KsIPXj3zZW8~VpK9QI2i7Xa&hoAq#gY(IDX1lGcDGHO}?%S+Vy07jAGTO zQ)Fq1*3jp&2riX^>dEx6^3d-VbDCH86eSN*r60*<6cn+c=Na0L&yciFO3|yYMa_|9 z9K6iFufdWaQ2YI3vJ$`;Zn3*wpm;1~neGvWDV7e{`O{%XCUw^{XB<Od2xfSnxQj1D zF|=ezd5K?qrISmh|3SM#c_c09n<i0)-jW$|zwn&Gl$5k^7_5l(=PROQ5+-qB{ll<p znI&SkLd)tdNewre0Hbm#qRxo!osz~z3A;v<EFLfRVDvG=Ecdnw0%`+@2IYn#1%_uY z7_Z7gNvA?toI$!<GD2;|I<~>3>xrr@z`pmIc6eXCucY#AU=Bl1Qy}R1B-bmE00l*1 zL`F_%1&$>)LPNn+kN9t;fa9o9!nCT39$r!86E)p*298e^IcB8jwX(C|>n8+hlJv&8 zcZF4Jmk%5`U>y2nfIJ1<!95(5s17HA&m)XX2xA;hp%W$Ek70+e?-;yQKwe;v$n<aw zP8k@c7(bt8G{Of(Y=>)<kiWC+;V-lWbS?V7RnNRoJ<1fI2k+5;&s@FIDIN3&`T3`4 zH#*JAnPX-gb=-=QGSVr+Fz}886nzyK)lS;3e0s<oH?(*`wLO%0rIrflj<{OMX{a;e ziZKX<L@q@v1u3W8QbP@SV80C_B5VRses?3_PNNFo<Y@{6tnK9!uyXM94UJ^?Jn*J! zh<d-DfOqBZodS;nT-!TTK&sfaZjUb?1;*#*y}mPz>s<~E7ky|fS%v0mqpV{X%8eQ2 zm2J|{b+I1x@7}D)iwf!MdL=*uwCV<pSq3vmMV`2jTFekmEXKpc8z1`LGPvCSdAopB z^?E=Ow1v@a+}k&N{B}nYh}4*LJiYXLqIv+I&r^W)!Ms~ZMsxq7*@)H3`l_bK)|beY zhsq5ZfH|?AI5N^O?vEKGaE?JRboWMwH@_-sF%Gb=52;=^jmXc8wRKWkWes^fPdc%l zgoBj<rf`07`fY^fP=+?#f7#|AeY+{mIs7?Kk=CACFd#RM$Aa6rX3x@oZWhpgZ_!V1 zS{H%TLg`@?%v<bT8jJN;ozTH^g3RzP6__lz-MxzvN2qbhe^mjJia;5_^26`^;@g@u zKB#9patXLKV5%@Izyut*y}pXc^f01>uWZj-X9PV`*Ah<S!G9bUcROTk4(35VMo2Ro zp(E-DM&3`e>95ne+!fk6G0hzKB&$-ufC&4d7cJ3rQ607=u6z(ViHRh0j84rPtv=vy zDLk6|NAsfk#^WI{aGKHE<E9u)8|OOMRUEYPdSeGpm!-ENvy%=Rw6vV0V=2U(-_f_# zxpNG%GoUNG)-=`JEQplHz~2)n14;(Qy|LNWCq|dl;Ug=Sp=?Y*-4>BM8PpPZ7oFH9 zHDP?qt9KUgEw4>+<0P@O@nF*=Bmb$ZL%p`$1zl!i8she_0seq1ZIGS!2SX3EhWox0 z!~Ow=*>^2;OE1o_+QUIecR%SZ|64_pf~z%wL0ddqM=eSp(3A0K_H8iF#lgB)=`&6M zCjK)0nIS-ZCoe|)@|ZHKhM~XX&8z*ix&npTZ$#$t-4>H<rxoLZblHcgtWmYvgvh;k z{G4n-I!2q_F6)7pXi_!ndhnfK{Zq6}7b&hUmim(omU5Mk;n9X%+EX=(BPfA{yP6Ml zlAfX3!+xajmbGIFnw&)SvL?*rZ}{zWf%y42Nwi*8a8aIugjg^ZAI2-LyiR)1dhZ=5 z)j<6Pq1rC9M4~17Xbp|n$a(^`1+T?VSv`eF>wyrfR3k&&yKEU{JYZfGxFI`vpO5Eo znv66G`8q<G?vD^jFk!4N$UVVqCea#9qrxE*6nWjbVUH>W_#kQrzGy9Ls(H%<ayf16 z>Z=H_t2h-eejcJbu&1E0h>&#%oMdW1>x+5bgyCuFCP_M<qm;)OEi1BuEJk}?drpp! z^1;CW2=D(Ns`6hP7C8Xi5}N9Zo2mc?4TMm58AZ~BuRbUM=wnQ|^9cf)1~n$%kNh!i zZe{@pm>UFLe7n={b(8^umwY1r1G<4LLZ;)U<**L<+hYKdlYyeiz@}t39uyT{jjU3T zN#{frp8Lj--=2V$H`!w60i`pt8>~m73!lC4Bq4m8OuxioYRD-=QjCA+x0Mpi=Cu9K zCpcSHpgB!%f<a4FtKwxAKjpYXsH>P6xiTccV&FBy&f{IoF#@)|4EW|DttQO>E+GTT z^S6G1eur1zK+EOG?WuThBUKN~_9mqK(-#Ao|B!^bUC(*xHzXr}-|?G;)I+`o5lI1G zi?fq~B|O!JZgQ+%Q;n`j>IVJy5dE8&e=W+<wI0g@RzuC|_K82`WPzgR@-RK8Jx}PZ z%a&A|hk3f0ZRU=9RuEdD2P&oc%R9W9p!Z>j0!y{+=&%W;BPm&WXWD3x>f<_U>n_X@ z-`ws}4vWzRXe0b#<Rx-cS3~_5U(W+xvgg&We(E1y>+fo=Ef?&y3+rgaSg0vcmBPU% zh3%;7JHEyXnxRuOy`aWFkY}Iy(jr?sdW1tkdi(*~zO5+T#9L+BML(?SeiB`uQ5`tn zK-y8G1k>#t{gg$_nZ&h}ajQn8JPqW+6=+8K0IV_bWB1yP(b~|@9v>CTd_%tg+jq}V z*}xN3LA6Fw*}#e#@%p3^?{6fTamUUVM1kanCI<YWeAei15To-BC6fA-LaNe=)tHKm z&^U^beis1vaZbs+BpA7@K2wy!M*;l;wuqrFvZ2s79rEl0Hcd;ckU)vkBLjPA!`53c zC<+^x+VrvYlK8^%!k4{IPpa<&Q{41+>D$#+N40b54!QNRpw`!1Uo*{Uq{xrJ`s0hE zHr+3(^N1{-<=fH&a0fkI@%8acg&IsDrrJ^y>gDwe!T(Oc_}$h{OuIOE%lC5{?18Zf zBGh4ECEjoYioITDk8>+niB2EIu-are(uW+BY$4;Xu}ROVsN3ENryui#=?D^}(ycIm z%_PJV2L~>*JSA8hylv5ULa}^wlE{YYb{C8!)?qT+a{iG%+Uwg7g>o$aJbc`5e~k}i zZPDc;9G3N!$Uc-^SZp$YB?p#Mb^rT#1iyaYXJnaw704n4u&Wlv=N8$TIFt&;Ht+SC z@545Cd14-MP!?B7jie-JP{^u|{z=dPvHT5VfMQC4&9zP<uBLQF!kjjJIhDsJMR3^Y z@cFd`TcxbhO;JyZetNpO`S`U3#Zg;~c349@qE>m`VE6Ui%o(j-T3`;HePCIEYgHzN zy^-mAozTIQm7aTB&P2y%)DC{YP7GB->MiAI;T<#2swpHr>nTyTh;^gZ2qvjRqm4@z z7XVXAS|h>NECUNcEocIZ4PEb7xE-{-yK}DMbnaMd2Je`F7{eV!D?9xYaI$fUf=s0c z&d9ahKZ5SkByo3RNLEB6hhn(+_b6RXdNI&tQNZm8+ae}lJqn&|!hEnj<<gvdq-6hp zv$g*nMnu%8Qc$zL^^q)aD<<H6ba0r&f%g2MsD$J~pFqri))hr}%cxwesFkH`yf9>b zi|3R?iOCUBogvS=0#ay{+s239g47`oNlWueYt4sLFR1SRuhDz(;H;E-$`fUO2cXvm zyBB>u&7-#Chp!oNFIg~}uUF1S9lO0{D}eS-ILt3+2<gyVQ)!VzlZhhv#8om6w5ki- zyll!hnp`>eFwLWB;v83RDfnS<|BjTQ^C-84_WMDJhkA)=uXw+&jlvc$(+Ev>=5TT5 zJ?XEADP50YVLa@-kfR%%^wB7=rtlsrgbd=c{k{lL?N{d?^3{<9J1rWT@YRzbFI}K( z#?zSl-d`~g(vVPLeWbKk7@^oVpNze;;V6xPJ;@gPDa_^Mj(Byl*%wABgxjaXqJr(9 zhq#*{n%TC1IHP*n=3jjzVDw{+2UvfWMKOO3u4fy2k2j*PenJ5~Ky`L+YAQxYdV1aQ zBtP%M;QEe>zWIKgw?2+)A7`L73cE4r)2rQde#avu&V=+YTXzTKYwNuZ$`6W*uP7s~ zM@d}!29d+=L3Fh<=yx@D8+cgHEj}Dd!vcmNLFC%->dtW|)A2|)JyTG(`vtfCn%*~y zVrkJ~LJlnb8!Sa#-B9fw*Z~yf2&6^I1jF>R6mDISz=N|n873O0qM9NI7h21L2SC3y z&12nqy+;j4fzLl{0~oG3jWLZr=Cj@(2b+g@Lu*iNqEr~9osA$r6#)8!DsQuoR~U6I zHU;A$u%H3i!yoIm9Mo8^T{z&Q92UZI%t{SS8(!u$h#E5};a_rulK^Rp36y6o*6Stt z9apd`O8YA%Uj2agm|F3}9UA1KoMdGz47*xQHUU6Dk`N2I;@64I3Ae`&)4`hCk|;hV z>d0kbCH(dA?3P8?vFn7Ab+gl|#Mg3jDa9iHdtDf9Y7h;CyiCwsKrK0WAs=MEtR2n2 zR#<X7&Z6TBIX@#(i1w|#pZO=k<UUKh1BST@R*+XP*b)kIiSq;CF}PsRVqiC8ow)by z!+=?03Q`c~X}+FY&Gc}Pzu>`5Kc_}%s{_HrloKS2Yw~(1`*K2rMVM>auB-0}mX%12 ze?JaLVdD&(IgaT0AgB4gb1-~fY&O@0h*XJO>cmiOi8ximyDQA=<_lxdZE0LWTp{J* z2%plFaH=6uLzqHD^j-v7#9EPC&Da)UX%-7LW}CD7WF5`EfBtpzgSbC|pXFV9Rlg`7 zT%N&;<nS0+__fiBSh_2%{d&r4khb)7MP!M4_aioFfsMm;_D$7+<3ng8v^qr31<jk5 zLaH~%1DOsNO=M0uO3xubK!*KW{k0}vZH;&7I-Du4aY|Xk@qVm{+h~lcnkcz}%1#J@ z%Az~~{6a*eZ335U^!WR%lZJd5x?`o%ui@V20}k7OSd}~%0Mr3r738k$8<Xc~gS-A{ zU*!xPvtUO|<t5r9KlXsE`cj6CyR@>VmJY0f``>oM|F!if(*@vw9c)X>%Jl}(6H!i9 zJ`sb-NQ$<h2{pyg6#>hT^D}-v<<go5l}E?2qtFnFshBbR+#~PnlJ)jqJ7|OM%7ac+ z{!~aPx!iw{&pxJmdy8m~*eZz0UV#<Num>c3TXOQ4;}E`rXH(NjCfIu#2&WWf-wKL} z=+s2t3M8&kXmoit_Y=r-E`G3Mz3hhUSfgOM9KSH*+31(%CdnR>9>BhYss8}O#-`*3 zRtFom2z1DmI9LpLlP`8oFuzDhu4;SIAy&V1CQ<P;gE4OC5xB*h&6VT3ec*ez5RrrC zYKO}X+pglX?vS=NR98_CjD3CPr0JP@5QYdrU`z5pOiI6>DP%H934N7_yzFzZX=8<4 zu~dlXUImz~!DNUaz5zIQtzBM0Q|~A)+TZjT{I_LrV>Au58y@rxZ!nqcKb<Q6t?aZk zRx->_Z#5=C)a}ypGa-ljJ$o|3(+4Q6z+dzp0+B=t6K6^hj)OsYub$7)xb9L2`&bA( zCsmHkjMmMrel#ia<t+>LKuPxAg2}sa7+H<sG+GiqXW97vfmo5i&4ljiwba8#w?W%+ zkz)u){RtB1?{*{tI;{0^U$xrJk$GXdfS&MZf3%zbGPK`haLeU@w)&^L3JyM%v5Z4k zNh7%00*23McPxbwZ6F)rAsWH3`S?hJ^U$N?kf#+L1uJLGl<4<;4xG7%DerJ{MjQX1 z93koep^Ga%7>XFt_84@zqeLMRuqL9Z*oZ5GX2K3=r81~WVX%RPtu7`#P;L(cX--4f zs7RX!-`NB!rvcAa#`<GI9M)FOxZO?mh%7H_pR2RI)W783+81W@*t1KR!UeK=;#JOG z%Xorg2_WZi9DeU0x_(C^z7V=E{o-uC259c{tNxrEB@hD&vyt0z(8$XK1UDli;pS!> zrDKl0Vg4@Clx@g5cC8*!H9bZ?^HFiFeWhhUqaD^9`!!QzQ<4((!79UpEn)w6WUC&q zG`v(b&eu4^e(8HzLhdphXZ)P`5XLxrKezYWAY{~d2Ib!}`5zrFdiS3?R3&yf3tul< zb?N~f!1-OiDz23(bd5j!JTpH}6~pBAgnLsbMV0()itHc)NC_DdA|`pcnRF_HnzICa z)3~|W<TCnU*Ter0TVE9wXSZb=oI--TOYq<l2=1;S1a}J>+})iJ+$BJ8cXtU=xVu~7 zg%x!<f1keH_jW&iW7N|gYu8#+*4%I_Cj%3Z8O^_scX%y_nJT+8Dsekw3iJgg&SZ>_ zb$;~g*6017jp;7^-co4#Earuzzuq~+PJKZ0;o@$59O+WFkvkT@t%^qus#Z$#<kbVN zP|_g0s28H0*gtJ_@?Xg4Ah^d7ckavu-6N5GcZnS;ej%{#Bnp7)VUY3RoLG_l5oeaD z{Tc29dmSx{#V~)nkryKR4D_aYSZ~CVT|82yibd-X*;Cz4#z&=NNfb$9RWJ7O(+QJc z{;hgNoe3_{**MnmJE&CrT~5p2^`8^Uzjp)wFI++boCU!Lo54Jqyi2%#My8zTc?M!W zKbXE7@uv&0*!oam<%FISrqZ0Yf9ND2-x-cM#^8xzfZ|S1Mw=ir1!iXq>%c5F4|DXy zR~^7m&osy1-<0Xr+~e5!0DJj4NSv#Gg8yc>*8SAzm%L!Qp?4MH)vtg!+%odtO}GBh z9^R3b>Dvdc7<bG(Sq>?VgUOd3Q9{Xt5Kk`cnGS^OG()Sq@k;o$O>U7-`HQf1(;eVd zf~{I4#7x<8r#!!acUh#5a-z=uWW^ijVV@(`UZ|g0M+m>&M}K^nj{VW`@W+)<W5CiT zf6l0%%-{ECg=mrtQr*dNkg=lDge?>2yS-u+(pw#v(17qH=#?%TA6m!MIMSH4|0yLL z2zp!`g8*V4`RM{_l>4Q}De9U2j;IKJx9~VKk12jU79Hw=A8fcD_L_C8roJ@I85!o! zkCCA1V%Y^x;8m5_H`pgEo>D0}kxf!#0!55SMomu8{`Qt$0_r`vC=eX7zcoz@cnLf8 zB|InWS?OP`-4QKR;l_fNT{}A-8j3_Nc3pR~$3DQVYFh}BW0b$=^{hNYl?+^U8$Hlr zV{i}g5D-}jL-gbqObNY1PvzgY(chLvCyu8-=+DQ?_x>9YxJ?!D@%3CnGKDdE#|YB? zS}TN!HGT0CzkxEQz{1C3f$GU+b!CxQGMmq?fVA9#l=Eo%-WR3a^)0o=LEO^tvtA+U zvmeHwwL4lNwph<Bd{`TJlXbgwig%#TNq**l46tUg5)1bY{F+VWIrHnJc3a}P<A*YI zwmPpdsU%pyZVj(ioD*wMDMu3dae=cmBb@#2z2{w;%zX7dEn3SIE;hm<J`xuiLuFbq zM~r8w5xLl#(=j0qd&JN%GV0v*$fJ2VzO#JFVDO~G<_{ZXXb#~BV@)6!hW~*L2N_yM z<n!@Q<hYf&s&dNOZ?o3yU*m%6CwX$fP#L6pu`Mdp(y!Sc!qiO_1eOK44u6*IGuW0z zeypc0PO&JjNfa#0dU&&lqzHKVqER=Je}BR?-OY<nbM>8Sfu*4zlB=yACdm4^SzK~K z8P9Geokk-9U^idrG<<y5HYzc>3?kG1GCIfhBZ&1{E7jx<qTBm~9`}<T<{tfLcQI+F zrH;|LlZ2j-hFknXBpzys=%^`+l6+m+l6xH9fdSWC^L{ZvYt%fLai`MXhi%NgqW8+7 zJEnFrzlP8#=S$OcoBSiIy6_a{%57x3aWUvVzkHkLHPO^`nhfnCwpNoT@-CDg^G*ii zXI#k<%RqEE!P-_}H4C#gPj?Ov!nO`a8C`w8Jz&RrE|s#!L4{ExO<^d`F`&-@v2&d$ z$I0)K)TEn>(;Vir)g4d)VQ->VP-ZBFsy9XY-2PgB@482s{KGNE?0bUjcB6Jrv(euk zr7MV3M9q;%=n0(tgI$B&JOs?AA9Q4VS`4CLfjj4;Vqfp$;~5;AJ~ug`TQI+Z3NSIM z)Wk@{Vaz!;TA#VFkvm{V<--5F1^vG*DQCf}(*^d!tMeux-1xy>K3l<QFB)Lc1SD#A zbms;nh(vPrtPGpt*&%CU$D>*4izC$^`~_Yoyz8x*mOH<*B_)8NpkwFIc)C=BOBQPi zzZCp91D^Ec^8u%hvuSL2#+dbgJYq?u&w21#06x?u{~C-Nyn@6gpH>dc;)fk<G1$@e z-~jSkO%a9+sK@KYB2-ceMXu*!G;b-@EP_27xSY0~l|E@^@{r(9j6%AP-c{4om{SFc z$8>CN!X9u0ysboD))z564hPrh6Af`|Th&ch`%(&`>b;aB3SREN!H(m*mT&pjQ=j_E z@!;^!o>nysw)m(@fYrsZ4LRxPw3<1H?cJBtXjZw`Z*35cs!gaq1^kROszVG1n%%YB zf^7P}Eu`=#>R!eq>_-&Zu&`SFeP8-lnc*lQlQdzvallpvpHU2%4eOf-+O_ISdza^X zkyj_2zqXbfgD#hi!niM&QK`|9uv_x0`v|1wsmHZHdoKU3`_c}GGPkv<gRtb<26x7s z=Zk2s#Yi7-DEgNCZ3=%jHdf{egy^Z`YRB*jdm<S;&RQBbegjgINH<1^(iHh5Dw;q_ zl6syHOR%!_ivlD-J-4??3YIrDDCVnQfuC`6wRcbYS39Bz=%F{sAz$6C%;3+q66;j0 z<p9?M+L+3%M#b9&-VGGH*{FDI2V4U)1oKCf$LMIPMxgb;#pkQc&b=-giPA(|a}P63 zPvKUSftpnhtWL{Ve@9GcZYMav;k4u8)qg3PaLro<J&Jg4qb}^DcATB|kF%x7U0Syt z+DY55ncU@`tFO;fs|`xCF>R4tYjct3OZFY%X1YJ^Ml*_9!0*8C=-<JDTJz*ElimRm zC_N_+;dV9-g>Sr(*e)PKhYgL5ty*}%)3#22gV5(0W-?4_5chOQoN7iIog&`Lg67s) zrJqe5EP7*7lCqoc_Se$g19!vSN_1sY*nH}mtJh$wcD?AUd@$5fb+Dg|&ZT=kzD2*y zlh2g?NBSeCrn4+u<P0RsMR+sIT_V4<hfZuBCkf2a`W!_SL7e(?f1`#x*5Oz0w+mcu z;?46AYToRDE}8^ID|VmtsDnkCU7g(8-^h<L3aQvT2%z$<d0}%?R#p)=;^e7Z!^`_n z#90N@nu7tifj!pj=RzqMydmk?roGQ0&t!*f2{|P{8s^xDf_Zx1S(kth$&JsHB{hW# zvR)?UwfNro5-SPo_gaj|=S75q3$K^m-}2o{N@!|4B&bV97rl>K<@-)t95QKml^(h~ zz^Cq8zq|c#eLt?(-`98hVanaRC`S0GAhW2{<`v~$s7T`*N^TTlTo45%Q=cHi`ay=Q z_IMOU*FLw)>IPU)At7d~Pi-dD!=f996?4F?Ai;WH;PqKpR+jl1r9I(!;9gDk8h0!b z#DA>4>Bd({2zU)Gn?6saufE%s81x!=SYEWVAj>J_4Ij#y>az&lqwi<nUwb$o6kd}i zhjInoK7dMA@LCzURnETB3XpT-7{MwA0N7#Zdf?OE{p*8L5I%(BJ2-(ITtd6Sm+1b3 z4B#4{xFwAHRa|_87+c5?Em2eh6U%`r@HgceJ{@9Br5^0?G2!{|@Q9!Q|1LKgsT|CK zfeU<z;iVFWivb1h$30xnEyGB<i2FOAs>%U<iUkge{N1v|$<1_}p}v*8+%c`$2HZG? zZKP>x`x){viB0F^nsCt~ra8516_EJTpwg#y0Wamk6;;ci?R1@7a~$$D*dH+~hxf@{ zVv0B<UovM&DU2}`(c+9dDsT$%ZW%#AzsILgD>l?@AA46vT5Rxggg&(|Et8ziSJEt9 z^*0;SW3?N>jk<AnfdF4FbvmF9!h74<LZBg~xDJpYC%@PL)doGVg>pmWCD{FPjIZgh zc1QXGS6rGHS3@wq)ktthhA_(0$T1C7uWue5wU$0Langt+m{B6XQwxg+eQUt~*EVnp z4{0Sk;V|jvY3*ldJ?U6IEj$gVHFgZ9VWFwLfhNKaMJ_A3hIjUZ5cbzEVGN{CuR<Po z-tqa>wK(N*_F`A--c-p*_hl?}Y(&eSM@+BMIbGCB-R)BFBeQeB75U`l>@e2U%5etR z)ZC4{CLI?LQ=1e|xn*w&?}|OLjd$9=upJ;b8u{b}GQL5>TSF-pZ6cnV5{?O=r*Y!% zHFB8}2G5;PUOC?i(o?QNM@IKo6V3R^aH{;vFVQlUeLvLJSEGK$Z*JAvwSE}6*`-vO z>9cjoG?T^=Z0eee2x~_b7cet+!fs>4j-kN$Q`EAezB{7k<iz(=z7Dc?prmMY1z>3S zem&=hZ25XllsY-rtq$j_#%T7VH*!ReN!x^30&nu>GkAI?x`%pe<7t{h@OjYi6E&XF zwu4U>QHCV;xqFE8FCI;hPgf}5=c=%?i?C)zTAe!fl6@N#^BTjx=X1ADT!D(`D+mKA z2KIaP<-x>safL01%cmtoUCXgzL7BwbR}NWvY-8Weq}oKf@5KlptItaZGy?wJYl;`X zU*eEuP@a^A5d|EYDNVhxHXx6vR;`~rRRofv!|19&(1Yyh--8p12At!4JU`fk2)wp! zprOEb@C&=#sY)k@SRv_I3v&d=3BHl9GC$q#q`0E8ra5HT_ThFo^hRLnaBwiS6o7Dl zUvo8iidbKtS7y=kaZ1@%guT1B>+keO=7wk5`44^f-k8HKt>{1?C57XI^@w=VB=nmF z^;H+5K<()sUbIpapTL(EVp!1YM%yK==gVd;MYQWv4_%T+x#{l`gnMqM-x@ntT>o`_ z|9zM7(*oi`TEPj2zG5BzLFDpGvXm4|?dk9f-^;4Q$iKQKs5-MYMTI1b;|6FN49q+K zi63Y2h2<0|78WabvOMmcZ}n6}Tb3T4V-?teEK>=D)gKf3=piR6B<X&Q0wmFJTCLeC zQqIAL6u#j%!y7gi>2!jtEcs%nue++q5_M9*xAFjccYH*HN>n){gsayKC=`~~a4CW> z+BB$4!?ekCSA`YE4FrWl;~o`lja#d&M^F?kD17ceCyI+#wJNZI-%Y07>E4L!Z9YOT z&0IbnRHgQ$={oen$ni4z7>4_5h+M|-_qL4~N4**>u0kPaM{(9P3b9m9&hPM=IsG&J zccVH-@=F02Kt{d;al7tdivTNmtz8B?r^(K@-OW9hZB6LDB~x=mQWw)<cuWy#|EWVg z|8(^Q_toXJ4^=XB6g?bzhb<X2d}GC5h0beIv-pU;kU$i#pWDr|6ABaLc(vs&67%{r z$?ti`)@oTT(ZWVb<cf|yjb9PeHV8$%c_fuufaf1;BVnJ}vgC|SMQi|g4OF9aT1xds zck6u^KKA$OlVUmgjT)W7ZO_|J$P+c7*1G723=Nj|za{tTZYNXv@#^pGQE3E&V`_Ds zaH5zwOqRhfC+)7xRAdLJwDN@s$N!@71mQpOI;)dOFV&cs-blnq66BszG+|Vi-_e*S z?^q|Xk0u`aHbpqYyJs>ns(+E`nGKMn4XhBd0XjYruT;&o-&UV#Y1O<&pTfvJyymuY zx1=%e*+HLn7fFR=b&`&6a-2EZ31wG_uX{RQt2$dQkC<7P!#@YL8#*$Qh9&D8c8~=< z{QT$$+ZOYQ^kt*7RKyhz1bijqn^2)V+Ng_zfAV^gw4|p5ZFw;i!aYOw3^1z0a{|;$ z#C*h<+RAh|7Itu{n#UEV@n}W08e!+3X`Sq8Eivd40oV$-1+%*n7=D1o(x`dkDL&<b zeLaMY4@gLbkR&LaiFM!OMs;q8qvA(%jbW=FTMid}(VJelDICx^td-3?S-kYu;nk1i zK{?d*gI`=&h*N+?R!heoIq~y0itPC1iJMd<49*)g*fGC{^9>tX!0<dYh_`5=%6Y;R z7Wquidi$96<H<nXwpQ(GrD$hv7|J<1j~=MTBcX7EG$7fEv+Zkt8abOLy3v4QlHh@{ zPCDraQ~4N1Mz4zjN`!2edEAb#>u?&<EN*l)9{#Lpk9Huv(jP?sx6l4()9r!9l>Hz= zjgf>Y5ZEPQ-A5acx#8cyu3TN1IV#~r6ZwFka(s7tWv;{294mO5nozSMiVed{w-wtn zK}(Jmw_GyH>{mnQv4TH_Wa9Y?Y%ICWhz&9<*>!KtWLL9b&h~%1r+V-qr%(DWuMpy@ z9PPgO9PdtX_*8Feo%F1(W$M&`S1T$+1DfqF_fDT_GJ=6kDJU3LGzT1v1=@VdJQa<1 zhY98!4><a~h_Ft;x+O1)T^%MMjC!K4Jx%sE{K{~uM?U9%UFk<}1csj_vV)JGP+5{5 z4XJGbf#h+rFZ-`V)$YDK^PM>=ZY;Lp(3863@9sh`FxVs|O4Z)Fm;=weUTQ9{T5O+r zo0THLGPeo8+M9MOU;Z}y@%yV7eQOQ}kOx~F|M>3fh+}ZTRrL`M@(o-~K$b-MH_}P3 zf;rf3XkX{Dt{bwwo4}Mh)ET8%nU!Q^XjB?EYdY~!SMC0G^?gxld6lWcy^gHF&|&bB z&GNPxN7bCb6h?Kr53R*H<9)69>*y%$7h%y248!Mb3L~=Im<$f6j)b9vzA4R)Qxp}4 z7gXPbf_IlviPC#VR~K0Q{@me0HO}H~!(<jGyZ8i8PO`<`cHo|Eoin-Ntb5+Oj`AtD z9P@%q&(;UlTcvq|A2voozrpDto(K0&FBGKk&zwAuNjGBa?XiCb=l->$iyL6;cS$Gs z9Gcs%*i|=uS9A4;&MZe(J0lpSU{NA@@>yG~q2rg*Wz(9+y+B*}Y7qHQ2F5gwL6no` zU7t7M1t5O<`#2;VD?5qMWwWJ+7KX}6{kyer)yswJmrfrJE0(?@9SM2CTkG1m$j0}* z!oO>!cmwBRJ>PHp9e!Sy9d(hHV0NXe7>x>UqiWe~PZZLDcGe&Bl#V6$(dOXt>mo_I z2o688HHbGC+cAspwAt#tLKtK2Gir8knnlHv$WwxkkJ}ov3;t%k0+am0X(Y=MV(5*< zw+(R(NqCU$)X~g_9wXBsZbMT;_7YY(;;~UIEkDh~oNQrd%B=s=Og@uDNLtBWLcNDn z2qfx8<>LgD=R*%)scFfwOh3RC?s`;e$LZc2Hc=Rs0wB(XfAZ1dVs|5%0QRFA+m&t{ zOtCl5{`rYxH5-b+?oIoWqxU$|Y7*h2e^gX{z_QL3B>(}39By5IkbDch*3!hVOeO8R z7fS?2HVptZj+@N*%4YxHARGXYL=04ozF(L55b=Nj({PzyhmQ^7OT=uu@}=_UjjUNr zvP$bbRl(W;EhF1f9oxZ12KcKKJSD!H&$f2S%0^Rd5Sj0yyoIm>e5Z^^{qv`s8gWe+ zJytDEVYlfLRG_H$vyacjkL!lAIMi-yDu;ELc3~gu0J1yW5ll*h)9sa1r=?r2`k0_- zk#?*SzM)ASP!+SUYM0o>VMp3GDzQGx<|G>d;gpW8bmyNepNXwEMMA2epTf7xa|~W3 z&n1?g&+A7Zm){w}KC*wg75};n_c@XgLhNbRJ@=I-+nmgkWpb&}%WHj8ycakT2cSLl z7n0~u5yP+B<4_n2?&{`vT1|n12!N1EI|c<XNNv)PEYMb0#&`mC(p?<N0?_^=YFI#q zcSlQ`OSNL?ZbHAX(Mq3ilA@F|-wcwRu+b_O$}_O7l(e=LX2&GPYJW2;T2>J8G~PK| zq|}S}^!es%1o1&7HaiKbU)N1%Ne|YR+3{IGRl@?FOlKA#w)oJ~#Y(6TR=l4bjqOk5 zmrb!m^BqImOG@saw4usa;USIb<f|z*LEk<EyV)=yPH}sqaa{dI+zR`WYLg^W{0<vs zRVLrB66m0us2;>z$rC5o-tE&a@o>`o&cO^8OIj4CdiV(=vE+WUV`rv*(nfk9c|anm zSun(pH8@kJHd^h*<+rI)z9yBar4cw=W02;`d$lBfdzlSFy;b$0a#Hk|K2A|aR>$?! zt)WXd^yF|;Vs*ZC)4j!=(s`9hQEJR-bLcb>2a`_gm#|~uE|=Jb%lQJ}E&20$6_G@W zr(V}Cj(c?g-nK#MkCuc2`Q35~-P?U^ZMoenp_H6TSTbR!auZl&h$nlqp0n)P2`M-` zirudKH0x>PM(xaZ63*oYe@jRh8*XBY;cN`50)_k98O$8_4Zsue1JWi=UwazWB<(VM zOU<n<DkzGq*lAE-gyra@!smz@9q)4{b0i{0fQ|AoK^yQ^#3M<cA%3KjQSNX4*iM%R zr!VhG*tvN{wmlxa__{NgKO?H;ri9tzNfn~?RiPaL`3Vi^){C(Ov0wB=Qq@Xn)hlvU zX%6(ADA_NbphNb=GH4L;O}12{8d`wX7Ynou`l-T|Di}fGs@_UZ>e2yJAN$rABkM}Z zEsfIO2npWf|HhvG*%RO4e6xp#hq-&tFmh8zycx1^HBkWBZ%XYK$zj2M=bu3>O^Zl5 zz?1NFN-nSge|4d!_{l&-!Ok35+n%Ku;Y1a4eBoK6tt{xlf-13vm_hrqz2|Udo!grJ zN8qX+Va9kp9;CJ)0YecJMDVie{pm6e>ewp>vA~6#)lJ>+f>z;;onUm201@2Wj39+} zEN^B&R>w<wQxf?19JDQ}1^Or8R{pS}z&BARiWv@_U6(F&lD~by<a~5p%(Y`{$>Nva z?UqYAZz0y9z&OV*>Oe{#gGsu}jr&5>2tIxxy-<@5j{dJ}j!kgjmjW~j{|8)N|HBxG z2DY<mf%A8f_w<8h;=1bBTg~8d_li%zE_OFD+}evc{l0?!H>P?lEQ3m&pI$=64)tCa z6JhbslbQyf`<0%!ngI7zm{I0?f$l9S@FkehKsko@s18-r$jT8JQoAAbtl^vR<!+}+ zrb?w!dJen+9>FQ{4k2pm(&U~uh6p`VmsO(ziOzFKK@$lrc886^pw%GR_1DvD?Lw5s z?_nImya$&r)+5D4rnZVk0Bi=qE`-|FQF0+RD4A3vVKx-X86QPMYh3D;CF!38&Or$0 zm6WYMSVSlD%w+{^k?WXG8!aA+1i)=RUN%_ym+j9@AS{6^F}5E>L?VLvGf8(w{@6J` zF3=Iz+~pTKGme?RU?wDNX_Tpp=4(n2RsQxC5(3<s=8Z=<OY%lcsQgf@Favf`L?{>~ z2{U75eCn;{;QvGyKgu<s+}+Ps64R4`8T9PKuYcN@_;_YkLkW{QGbGml^1=|A5q|G0 zAQPMBsaR38zvn9Khx9jKT6v0-wqTi_QfI_iTOTXi(qz%uR$9|on^Yk(%#l2NrDAWp zLvSG^109$aF<&UW;62c)+I(8x1@K~fu+Z<Wo*1Wwct)`bm|&~{7xI)s7t8vYS900D zwSEh-!xp;N=canni-sPy1tIx4oz$PY5WJ6>`E2xi1?Y3Q#qQ^8jtjawHEv|9c5l4d zKP`XhGYIv$3z|*;hm-lQd+{G^O`y39WrpN4#?L&ziI|A@7r|eCK7stkaQ2lDj&hc# zys#tvM8xiV;(gpiBsZHAA3V5}5RlDw0&>6iH_0jQ;ypD*E!md%ZOA5JT+m)!)5{e> z%?qevc5S$SNE0Se1&m@CpE785Py>7t;v}dF2E~^?x>TX$ye_A_hw=Q%Jy$MHk)wwR zvV`6i7+$?9iL^^^%w>}=TBs+{+vIQLaBxMYN+<>N*`3O^<X-QuCrFMS>a~B+4m@4p zMZ-Y<e1a)Cv`Q{4T=KLw_{`hpqF?!^hewyBLT*pYj$e0^(4J0Z8|Au=Ukk^eF!}4< zZk)*c_A96>c2)R>sm{tNX6Iv68ONt%s_~S(p8Z5=7Z(?0J{&3Wd>WAl26cte@fVcF zmrVJ5rMPr*NZx1&lQ$CGf%Dq28AG9Sztve<l{+gc|8vx#x~;M~{Ewx??&k>9XnsxH zA@Tjj`FBzemzMGZ2M)eXK*JQN<&+!sV3~G_A}x8nTq$ZH6=0>zfq4ogTU0p9M*9d0 zXusGq)(t#JF3Y4Rgwm#E^&4s!J25dL(tx%6ywK`!;7V6hgly|O-Coo7=8nnesYClf z%hhqt?D`!!=O8t@GQU(4NV^3#m*TT4_8vmAjAf^c=s|FpXol_>+dl4L5po{VC9FgC zaT0!7n(@A&hXZNK%7z}bnrA_!ty_~tPT3jzi0ir!HAR377u~NFVh$&3r^pq*DV;}Y zt!OYNlLe9%gNo^J8m!NLY%*uzC8X6c(&wqgEh62MmdXf*jNJ*u{GNrXcr7$yF4#HR z$<U&lL%!yw!Ot#RL<I`*%l)7l+N+E$ho})2GH{G9|Ha)t*hgH196NMW%WM>e9bb%D z!H!$}fkCQ{qdfTNB+G%lc2(H17N=BA^21RyQt|CvBPU3B);;#3@D>#j6<LNi@n&xi zx_cZ352g}q{(t)M-=*$@i3xuqejBDiIIM8{quE=of*eQOxb3oqD^&8O&ytC=jL1!o z7rjt}sjo&oitf5>M#VbXJje*@Ogs5DUnR<mVxFTKT>8UU%3e6$y3+40iBmNFmJ#(g zrIM}+@72K6&v;`c@*}Z38iardf3FC1Deq@3ZYM%nA3Z<#z~kEBBtAhTj$W>aVtC*W zw!d9c3zIU7yL#hDf2T)y7RP8D1uosp<J_E7P;L;My;K|KRLNkfb=$Os{n|4#i;~q- z0urYbM%p|(4zrD4wyPkp&MBXe3?pKf4kd#{)fS|3Tsyl}vt_^Jg^Fi3^CTR3hP_P` zJyq3f?>&Egmp&QOTk`<HWIYXwC}VWBHxu;H3#<fWwcs)c&>J<w^VXVB8w4s0F{KS3 z`d3)kV)&Z<Iu`TNRvkPc%>f%iUQLf|T$C>_fAZMMWqhlYP+Zpp1}!KwlAq6|eNJGD z3uKr3n>zSfi~XEbc)3zMf(c*wohWQcU$zRfu&(xfxX2BMVgI-L<0rV*qt|}C_#g7s zE|ldqr06cJ2sS$a5)?m~jeAJirT>|{O=G{pqXl+D9Y^4A<(`D(fcZVo?w53Ty)aHI zQc-XwBw|(Q_-fgF7u$fSil_hj6@II+8T8Gq@47OVKkTsk$|h9^*Dx*WZHEcAH`tw> zF27XXlUq#g!A0LedIFVzLwahCRz2$bheT1u&Az(JkJS0+dvznV<XUNn+e;><u!=?( z@H4#o`PYv(gtolEn{yYhsPiXV<x6~n9Ol6ll<Rvz(k#pK-ZjZDM2I7&&B*%Sv4oQ1 zF=rXn^h>3?J$h`yX>ZS_m33xh<8JpGce4mNVMj@v;L6H#=uGMDl!E-~vrTwC{1-Sh zfq5RJS~$a03)YGAR8qEV*(yyve%&hbSeJZKtw#xH>i2TB&1oALciFHm-oG)IAz-d8 zUTVr+2G4vE4Uj*l3%m;#t$rzpXrQshqhkIko>i60MASDPid;{1JWa~Pm`s%5n4YtZ z_Cz5;sX1QlZi0@$$?`W+Og{{T$CR!^eL2(_h2PDBM75MCB&|T=@1V3@FLWqZ;d8WF zSm<-KSoZ4w1Tk;aeoY_p*@yV+AR`C{Ax$ntQc!xkEMZpbyPT%bQMf<&?Yl|Xm2L_C zNEU)hzS?Lwf-&_RfwJ_JS($u5&*!XE0AK#m^LH7D4{J!!zR6s^UMgB|e`o7D?$g1s zq2$mM+irw8nZZ)hUa3g8DQ;xE)<c%lhk54wl^mj{F2`75fNX)L>}w|E=ovJA<iD&z z`&oaQQYO~~P1AM0rj;M<izH($G}Apy^4*0}2it9aWha@Pm5iDjs|li6O}vt#yB#CT zQiD2onbJs|y6l}Xh|M|qaODSTC%pHQY}+E0+%dToSLl^;_eyYSxjtqiy3(O@Dtq(* z^*8MOQVJ`X=G4^6P`(tCSx9*Cc=as;)sE;+nTtz8sa^5i-Q6y%FSi=;UWtYHx)iKm zJ&52}A)~rpSu1aS)Umm%3+`KO6&4l{!F{Y(NgG=cgBok1Le(|IHli{7z~pnCUPMX` zT6yI^3wT)qK2(lMzQ$%IbTv)`GhAIr*<S7n$t&90+7fjzF*KvWH&$ikt<WD>zJ{AY z3a!y>-_{>YX1_EScO#jcjjXjGw#|*C>9McZBIr$@P2MuC5!hq932TIhJ!>JXXPUCj zUabh7H0zaz(PgJgEkX8IAqTs$ibjlB-@FeExU<U#R8z}U>t5%HkF@N9SSBIL#*DG{ z(uU{Mb1&)CfCOutTZT^p{KwAHaUZ$~lQKDluq5&|jr+sFG>4+29m9AkVE(@FSO9xq zC{4n*pXfwVl{GQx#^-qePJ@Gun5c?UhA(*$l0OO2w;p+wMyw6Y1Jq7%-=h|oO9Gv* zsTLz)Q2Ay?Q!0KS>P=<jmE8JW4APlRqvimYzp}vKNu@{RM_P5F*UOY}b=eIVbs`?q z7Z@i!@K<e=@Kf^^3NFVivB1@}?W^(uK^K^)55qsvY9h0hS<YyPT@0)P(sKv~4h3?7 zEO%rtI`#1Q8MvM5XY*zDMH+jEodeIVE`O_f6g2HIBxv5nVVap#hf*)*-1r=@Z(hiq zda0=*?Hvr~Q!B*{0jWB^0YmF=v%V8#n?BNR5da&A{dtww1SXicF;=Fhxq_<lsm_)U zs|RM*hx#DD+d(ad|F1yy?+%rM8%RBJ`IavS4I>|L_`T0_tIdMb;e%>0NO1#Jr$ozM z6*V=87)3EY63}Xe1)R}t`xS1D+TdeI_2vPAp3Sk7BHR5<A%JN(zy2#~m)Do|OSB+v zaqD=!UZvZDvsPcmrJE#Xzs|3x7>5#=r1c-!Vg3*T!L|X^Z20=|dI1w>xPz<MxK@1N z{6FWu4(A4LQ#o&M@sti6CAjKff>2Es`21fi)7AwszRoR*|Ndg4Dg7SzV{fSMdu^oP zijk_fd;|7D0CAdVZXLyG(siIRs37KHxXM&U9(NK~<@&D!g&1(&U_kFQ>=wmyDr3UT zB!*s2&CWLL&sR)mkCg=^2k{H^Qz5>J%U`h+oiJ0r5G@17x9M(I-IafD&zMEz16-S* z*9X1}L6s13UpcogbI4I7DjFyAE!*uBVZ4k(wLn2`l-@$0#XC9|t>*lsl=Y9^4qHHi zwed-J{o=2Amj@r?rev!Dm9&U<ekIsL*VA2SDL*e6EWtY11}WmH2TWU7bRW;2hmfvb z7NMxSbXtkhp1wT1gZK%2{F{sKsKmvO<2NKg?oEZ(?{iiU#~sUjvPMz%trr1Q)Y+sw zc08Z%lT{SWbrUyt7!Vp(XN&|6Jzr4&UQ}O5?0)q0F!weh&qY{>RMC9SB4rS5DoWVO zD<<aii8dJ>{P<cFhu6C6Ic-cu`2kd|E9^;Q0NJJxJYjpD*Q|h2LpD<%axeGP*kN&` zPb%0kl%xY#T5SyB@7cNavFS{Z3F_x@)dFZ}Lc<sr`{41TMdjt*6I*lIPDw=tI28`q z@F~*rR<Wv6b;nfAT5K+!M0&t6aoQ4Mc}4|?V>d?VNN&HfOC2%9XRcF)*vX>#>Kx^e zc_55MVyRFjcU&M*uMr?}&hW>K<-VtZPO?z?-J2>ha4AmOjO`5N7hBnDccNIGz<H!l z<D&I=6@-2QDxZ40U;CW-S78-AUt<yAdG6R-I>70ceVDqQ&rUqn7Oug9&mFgK-cA3` zb-{!yu``(Y^5-j~evW=F48o@Tk-}NsNuDt1(OclxN4c{0+Awke0q)SQ0Drj^5!sOQ zV*4e&5Z{Ut?5kko?0EMet5m9#lDKbPAhjVOQs_<pqsTa=p~oR^zS(v)>!0q}j<<iI z{~>ApBTwhkCcFcXQ;&8;4YWtw^$i5ZtBLq2P=))ByNfR>5H-4nbe@O5XIN~Ygue(Q z=Am6<E3Dt+^v#5fW%#%=rcU~bRdj#HqCb1MAah7Zg_(Gt5q4X``EB$@sfA@<Yw@y{ z%T6?@oM1ZrJaQk~3T!#0xU-Kym$#7;`0KBg3*?y}8}8dQ=K}hy6+sd0S7jFY@DNF3 zY@HNF^F2V8@SYI6wH>}END<XjC28SstJuGT!r}D@a63n=e?mb<((kRg9}yiX7AK7G zGfoaBRiPMJ8|zIxRW9%qd+59?3|G6~Bg(RCiBf7Ur*Z)ME!I8J6C}3M;GKZ2)*ykg zN<|4q3=45(3v@A>ZBbbzs>nN6LWZqyKSKX#$h`;!i@GRtI^E+IUfj+T{i%vR_`x-H zVna#Cp)aP)S|EdmsdgJ)%z&eFazuPMxJUfqeS)lqd;^;qmZV2es{b~ZdG`K9sjxSK zZ{L-$nb>t$)*q$lr^+}Wb#BOApXC~NP)aj1(4`6XT#MvjjZG->78S!ma-qv)*mXcl zD#JtQ-tUgq;ANqZRr@bKvrZA5Y@s)azr`DEz7@~973p9n)xFZLI%fE&YP;$hCD_xh zo%$WO_4nITRdtSf?Vnf69Sue4zEg-VOtEh7s>tLYACPu*2w}O2Bt5?u(nftQb*RmB z6zW>g3%+wdmooX0vTCrcNmp|VKn5!>e_qIYRZJf@VsZIs>(fS*-u$7xh^-Z`op9bi z2OQ_A|DRa^q`J2D*qm-v22K*l4gGzRF?STLRMTf!@o#+(nJ%G?f0JqrRDN87++@9{ z-v8{-=r>A8yf8p{Dv!aw&G??|uZn2$Bs_}X&b*fkucYTX_Uph#0sPzyC|~sNii5;0 zO57(r<ig|xdQVgGs+sykqlzaCbXg{)5Mz>TY8ZiHBCJHD*Kb^qiy4}BEr1e@=N8z> z4`B`C32OW6Q=z`>G1zKR^N{v@<1iL;lQ^7EMlvSACbl%DaE}Tyh<wY^jhWyz(%aWA z^kWJC@ae40Jc~|=h{l1s-@cuE#XWo2u!U%psr_v!n?WZ#;u;=nMOyl@dtW~SSgM+q zCuX`yxblRM*mVkR)l0^gqoF?1QN(P-9-azoFNxL=K?M_pe{LT8A8gzkNHZG5j(`Wg z;=bs~Udd(1UNU2Y;{U282x>0cZidS?kmAAM;9H#1J6OVAz+WE;VhImhN$>z3s%OIY zR&M+HyGM^bHWkGo6E0`NY7OX3`!YR_3>527U;YX>oT=*_nPxr`>PEo|->tDXu~1=w zdjC0`l<3A{ihO}I$O=3HeI%TOUVDD&^Z*uCUThd3Q?!1G`n88E$;_?#KJjO7Jb`_@ zd|$fg2B=&roA8K2^s3Xl_FzD{$bM}2kG}^g!T0f6I(iC$MSeis#?o+wYWE7E>Qqtf z_mSg$S6><CBA3^_O2!`%efv6io~g59mszZfO!<`gpS*3e$*f29y<bqkCEsg+#&nYY zm@M*zy{hAvb9AW=L`wFp+qx7%RHkn6+ko;}V;<QAC7z<9qLw)vMrM>s;#MTSPr~Bd zF$*{IR&)+83&0+_GzJ&qJ&KKhH~tz1LoUs#Znu8;$H8XK560QGnW&<*#)PJ42VG46 z&HE{WtJP||5UIKvFgtc8SuI<8_P78Maja6yzHW0%jOFhthNIuzECz52sbJ@k-q3sF zA-1ZmU6sVcuH9A-SIdIoF5H5oQbT9cbHqk12WcM*#IKu8{dTC;oPqliM!Ulp1$R!B zG6MyZ%;yohBp6DsGs(YVc&GQAXZLvg``3|Drj&OR|Ainb07bS=uVqbc3RF=yLTjv% zfV#$7*-r63>Fd`s_9r1=i+sHD%E6St2Z<3{wOWyQ$m`gYYi4r6J9wrQf)zrJI2z|l z3S{SV<WyaC_>fJHK6rO9a&$d<pGOxQT<mwV4XkiLWbP)0Jznh3=ZtGY?8{-RntK7I zTe6(Y-Ji8@((OPHyXVXh@lkIN8V-@tQHx1{S1_!6B6RZ)SCrJ;PWi-6#M|{yP1vwM zl1>rEm#Z5^PWgIG3H3=XPw>xw+NsVan-+V%?~A;*yq7ZA2)x_xDch0Mi^j_jo-C=q zQ?B(33L@29GK)BG5_MXaWzD10o~$tCXJuPA)E@ug@Fp}{PG<FP_lN&DnPaqFX&5a$ z7^d(i?K`|Zo@HQV9V!ulSg-j#pOZg+3jE*NSC13DsIdFhn>s5Z4x{$mPrE@NIlfxs zBO$;FHVql(lN0qwVDR`$AiV2R^(DariW2!ye!R*HryjKHk!mWmk2COWJDw^!*JXSA z6G<VHLZ#7|tTRFoM9PY6gQNF2^Fj3~k_5{zA<S9C`#sK{_3HZHugt_5nbViAVM|Md zw9>=WW5odtizw}$O~-N<JYh!q)Z)Pw@AU12WH%d8{(O!mO(w3xcHE=5=+A`S(vC5e zC8p=ZeM!oA`gC(bBKoXDWJbHB(h*!WecSgLD+lx*wluW91q)L!ue#IjbCr<if?YId zKHnG=1k<Z~(dDoK=uLt;af?|cb~Z0v0l*J+_Z5RiHqFC+jHjg%k%HOq@~=}A#yd+$ z6s>WazD`Ol?I-Hc4R=|Wd69#k7QZlz=dV5rCR#+HtQ(-<fW2Nl?3e}*n>%gb--hHt z8K_?Hf+_9RW>UzH<2|#O?CvVcz|5%vQSQhMFA~R_W{TUSNWM2#LPa#qsPSq8?h}~8 z|B6uY5maq-!`Gy`L@?#e82>jhMU=JJCb!DvmZ^~z2{0I_@-Dg|-_ieV+W4joAL4C6 z<)tqp#pSheF0-bD-TiLGjCRA2EIy=8`5Vs2xN}&x55ecqzE_m^4>A(Vvf$jeCsP35 zIbj_X6{pUTz9Z(h$A>-#YUp<HYw+zAyiU~RA$^kX1~B=pgmffnV}5wbo!&8cWDt6` zA6cY4ommTc7D7C%|G^=|<?wm`I8w~3m`H2asg~dL7y!1BDO8(XK8~{+tQ65T?(4MK zS5+Mdb6zJ#i`OU$L#`t;fkU&*!0(iaDkqDhPb@r50#>C`8ZRlUeSD%iIY|TZ9rAP0 z{Lp4)t;mcpk7U0_)HF1V$Dvm?N+W++DY5u6d30bJFBFF1cNwf&KL4-*?m|je3`?R{ z*#XK>WG6-w{I6_u1t~1Y?er}SHi&-K{nHtoYS^Cx$J>-sGuV0@)db4!kdQ~Py2oa< zShVgD;il{<Maf+_V-vjG__qd;&qE(_C5nFaIZht~?DLU|*0WILI=u2T_wQ3M0~N6^ zHY7K|jkMBf6JB0kY6cpy?k82-iv9>0h2b1O#Whk~Pziwf6YN3vyfi!48Z`$wLah2< ze=c4HZ?+>L?6r2(wi0Q+(WBg)se-~<R%md`>I}kd#MTt+2bky2f5%A<Bt<WWD)S-` zZW@LBU6FR8XAX4HQ~h&$+S>1_e4X=A;}i3-T%<DfXM8FdHop&&`B&UD^0ORkv+=Yo zkd%w+8WNy5&~3A<a>E#38?jq}h@{2}7agYzJ0o}5n)2qvIcrd$CQ;J581ljmi&&ww zX-%KlaK1&sJH7w)NwQ$$Y2!&fvw1H<g~X=Lq``kC>F@~y6#ek(g!Ioza{&}R*Fojy z;f++^59q4LW0`O=6n1_jhI9v&T#8nzbl1R+ZUlWwgS};9%|FV`o{H}mGz-Mkj*kTt zB{=#Ef4%X5L)^eF4u*eV*@q0Z74;L2DWP>)XOx=!n!F^npD|k7gS>Eem=Aahg>9{V z8^A7f`(RLUraeH;qBsk58mvG^kI%gFDo4v+V9>L=g?@Hk7!%Jjj^^f+eC7)O-8L7O zrSUOBU{k)p7Zmr=;=r(KeA|<xQ_ouJp#?tiRmJ~F<JYfWd9%Z|#TOU$f-jf-4<j<d zL57eMEsw20q|3AVshzFf;D;f;E*NG{qJOb@|3=sU;YI!DqXrvrB&!1jV1q1yg{!J7 z0$!sDN))_wHF^Lm*#S1>JBRS7_`ChKBuI>c_a_SK<sCtbh0Q&tq1#!djfNn=5$BHM ztjJn?%*S3bwvUx|Eqcymma*nmvE;pyuz&}~F^O+6C+87-NtE3P@}0!(U1y&K?2qC2 zOm2qb^V-{yK<M+m<h$M`fg^dMS_OD^L^$8>2K!|hComMit?Hs>zf4z4;>7=CKARPE z8g{<Dd(j)2m<~CEZ}NY|A24f;V);G-^VR$1ljQX>)c-iQvbPiJhDTg4vUpYxrb!?@ zwLzjPJ9i#kq2kPcxX+F={cGNjVu&Tfh^d)DEEw9wLHp80`XSe6!$I5TCv2e;2|NcE z3C=f0cwP~Yq{aNEY=^*!hJhUGgl0&Fh}P$!q<Zg<xAst^j`zQC{;47?NlMqGSvhe? zeJp0YmF0Q18h%<TBpuInWHj2N#qV&^HX?=I<gRr7FD6I3U2ZEAopIw8o9R(GQ9z*I zY&{1|py(SE@C-icSPBi>yc3(Fka7ryCAic&K{A@P3Ht6Y_<@+W_J&^_%r7$RKgB+v zS!hM5E0FZXz#hBb7Tv#L%oRll4JP6+c!gh>)24_Mm!WaVdU0De99PCV*RI<vNS^b# z(=oJ`!oTgnlH%ElD{C~<+-sn78F!Md<-!v)4H7vg$aGkMs;~umy#QTKOJEpJ<p@1I zcSF6aW1+_?{sl-+>kk9;!W^CYEOgaDv|A1~HvKnK&;F`B`Vj>Gt(N}N<QxECk$?>% zxO$fD=oXL^_udAAV)r7m{(+rubrsQwa^z;t`f&MW@3&HlP&>gL0*H{0FcBVJ?e2}D zkDG~KV=sB-X>8ib4&(f#@RoX>EMA0mPTQR`0GQ+96?kfT9;eTXyJ8y~5vjupf4%R& zg(dVTX+=ws)Vk_okPe)LXJ$oPpxizpK6@FnQ~fKUDok(1T%&q&0PC|=lG|JC?GV5; zLh#g1{`yYc(?sf99PuB$C?P`;fM!E^$xPS~-LKVEF_Zx9)#O}<;p|O+62{JrPMS#_ zu>hiluCpg`{UR#1!a@kcrzZX$;;&zM&vPynU9jkAzq;_4+|b+WX^VO`Fy{oY^5CB; zUtEvnU;Gi6aTN%)G~kj_-La}iFZ89A{-EogYJ*#dd_w0Q`mcdzD=C2W<NFo(l7Qxm zS_|2ccGuF0Aiy_l{GM?>2*#gLv@>YL7W(?bU*xA#MAH8Gk{U;mxo6)$3-s~oR9$Z= zu<q-Kf(v|cWt+SO*PAg%en3Q<%&<u|DAp}JjGrB=rvb)}Un$=T<9PDY{L!B?*VD+; zvIB7vrjrT6w98F`MfK?VuR^w>`ipz~#FOM_6pNJSU%1?|F8UIAIhtf$Ba*`}bQtC| zE2fQerJ_kl&X%4nFs=<8LSN7EWluIY4TDXWIPsT+0fUl=or-a|zllA$1C6rvWK4M} z751M5X)q5+_PhqVfuyouC+lV5Epp%2$&&3_1k)!ZCx=2Io6tdEp$yr^ZRfn>>x-w1 zleP7q@dKqyUjBvhvNF9H&wozoze?;sD2yI?8cIQyN6a~oC|J~Pr16e0e>mA``7Yh1 zf9i5PJ>Ww2&3;#n)CY?3ATHb<3OY77FoF%lW@zz5HM!QfI*88+ShonD$qQV;lrp&B zQ5}>PdlST^PJ?>1#BxBP=cbVUmdg<Zt8Qtkc_gGC>B1%g3(n4USe73gY=m|Lc|kn6 zj8ZXW8FKM8x)&lb4+Y%Sk83!)i)R1u6D82?_)mt0VU4W_)9H9t1n7BPe~7I~t{rbP zb6sMFJ6Wp3;{zn=q_(d<#;M$)g0@$191<O;yAQ|ha)qN}^vnAf8LO5#h~8+bi=ODs zr;l_jlOwZlnbaQb-Do6E3!)p_hQHXplMg6u3J0Sau0<%cwk2pN5!Q%a@hZ`#8N;;! zaL-+QbNNhfq71*_(~A*T1~ocx7qNuxNJS`&i0W;>NQqIM6KV~?;|KJtB((!C7hKVr z?phiav=-5wW$4TRtfN?M)Z*)0$#Gqk#n91{PbHT;;-CMnoBXStczj5Z#tE*5g4*Nk zQh<O4A+Cr$-7htXOTxc+37I8qWf*L3D{Lr5$b(Ii4iTGi0aCZN-d@PTN|PN=F8CMi z#yY@q##85M&3R%@MBiixrm*~P?2G}10f)H2pMHo-dxbTtcC6>O(K0|?!uYf(<y4ny zW^6!=xMVcguEFj5DAfI8(4d2bV+-yPTUIJxXc5v(`mm4);5Vqc7XeURuJ|0Ti6~DU zvNkDMCUD=;C_ku132DZ6v5=h<S-8Yay?U#%rcmZcJ^|eT4W<EJ(`Zttp2K_y2ULd6 z`FO|A8mdClp%O*{QIx8J#Q}e9Lw(F(v2lcSi{h<Dp1Gur|JuxP#w5^?6dD8}o+3-r zXHD_0wKoJ7;L^^9AT^E9_4GkTHs0(47dhS+={){gS_E_7y&m(NvH@>lp}Pz=+{BiZ z!Ce0<ANTD79{vyHTvbek{J}8TA1j^>A4t2jDc$G$FQq!|4e?MaMTyT9<DzA|cPRo6 z)64<H417f)^?)jGA{@++wC2|{XP9`^%cCafs(b#O4-f0hq5>gxya}%p?l*ly3^DuM zUuhAyr5+<~A8T~=3{NH(My%@K7r!%+E<3qZOKrp^y?3)<=4;e{^K#`=tVP#DuhFWq zb6v)0v>0n3`KBWq&Gt+r{%qJVRGdMVfBer;svyToX#zr>z~l{gO#WvD{6FE$<;zD| zW@j&JKmKK1WQ8M`JVfPw{7p$uaMj7V^w)0yOTyyU>m?cOW;^lJIqEqyf4zEI!8Jpb z+dOCy{1k^z`q|NzDYAPVFx@o^ni8ABF~86~=wMZsQ(fK&$n4sQ(Gxx#YoWyXRsi25 z?19S$Id>5BGQ9IZSP=XonPZW?$P}-LmB7AX(k}~U5AiPGp?8xOjc-By*EAH^iY3eJ ziUJNLhUf5}lS1bvd0DHT%x5h0BCU01Ah5zBQHrZxK-u}$=6PcpWYxW|LWkCf(Yl9C z-B-gA$Oy~0SG08v?ciu6o&jygQK5-^_Iw$gQ>V3!lKGMY%Ny%VEl2k8bO$ZL4g759 zEyz#&747qN1eMq+<D%S(Fe*4MFHa+0Yfhe2E|Ues1){d|_$?Ks>X8CogmmI-0lT~n z)K1@-gkad!(4Uf0ztRoDKe6n}QU-SUi7UeTe&(i~CU8fWSi?yZ-R#UxKeZ{7QT@np zBw@6=dX_NP0I!+kI{-WX+s#aaaohA`gp5`JY^({F*Kjrt%0jJ`2t!qLditBRDd&&1 zLQYI9?$Th1Y@Mxqi0rVqOw?0RBXz{bH~PQwRUF7`?>;zD4N{Cg`}rqS6*=VBy=<9t z+!Hsy{l3QpbDH9#4*Paj;7Z26FUW*)i#L@&aBjv2Ik!%vGqjHW&D3mA3(w`|@=2K3 zDGi4L2bHIj@|VKz1ntq!8KLhruVbtzu5N?O<q~(*CyJK1>6o!HMO<gIkmZw|&R$Od zdfqSSE-8GbB!HxOjurm-!O%VlN^htDa&DN0mRt`MA2HT9E=>MnEjXw!vwxOh@g!Mv zrHLAOjSafpFnnLurgJ+yNTq_0@mzDr|5>v~*jQq$x@y}VTNwhDK^fgWeo>OvBs6fp z3**b7%#RdXPDnHgp5TL-$f-y`0mtt7)gFaS_>kSjW;Iv5gS{%BN$~IY`qJ$*YTgh; z=-1GTqS-X?L8##C*_%4(IkWnjvFd)w!(HI^-aYKC=8OQyY71t!-cy_hE=;rcDOjGz z+L(j<p#!}Or#b#1Sqn=h3>LPam(a=!SJczHWt1h$D^gafL%xZ43~@~5_RK&(wl@)( z5f<1ghpVj`tQHkVs9ZnooVCCwYpdc6k8&{)q%Yz*39Ll?&KXz$(?(JEkRv%uvK!N9 zOQG5?K-@yEA-7|jNQJ)W0{m8<>EnkvS&OLQK3@aly2mY$)ihNQnjyG`^u6F-Yyde| z6!kAhZp&|qQyf!OF%8ZGQ{CT)*ynr`B`7l5)|v!AN5f?}EBUE0i>!^4qZ1v!zq(Gf zJL`#w!aqQMh^D2e(Dl~8Ue+9nR0Gwh2BOJOLfusY-r`H`>`-?(Y#yiMDiSYWqbnd- z$DP}|A7;R+W_R)NsUs^CiEAXnU#UGok`|i}X_0>+*rT00rgT5S%6qqVtizF6ZT>&W zM{*Wq9p#i!VZK#`c6g?R^>i1(1>ogtA2?M=9;vqIqDmSKQg9V9e|d3~F>0vfjd|Tc z`Rj~a&Qeg*6TEz@jX1@m^}>O(1jPQ)TF`81dXpjf1u~_5-Dk+P-pzrMx;}gQ`Ads3 z2|}Yh9FI_NYQ*o-F1LBLujIcadu7}T3df%n)<olz(z07Ig(0SNx6Pr-0~|u425EdS zo_;L6eh~bIZv9Z8Jx+)z<1~asb~nF*IpIF#J9(hDt*4OACZ35!i;ji@YRt8Ag~Hfx z2I5!4q3Boj$RtfNj{{T^AP&#}sqCubqU^S{B1#!ZE8R#6h)8#LcS}f0HwcP!cOxm? z9YYT(B^@K(3_aAqees;{-gEEud`IW6`OVBb@7`;#^{i*DwfA~Klf{j))dm9$WJ0c5 ztU-^Vk2aZ?I5j_2Tf=JF>#h64eb3EdP00x_#YcvxeR;Ur`#l#3bvjYcI4cA8aqBia zKNiZv*RVq#h16AfoYz9Xtn_b_VqD@BpumKKjmZa9k86(kv5N)1Uwk*VPt~GNTeOZZ zeX&T@bhV`y2o7Q78(D5SnJJ}}KjVLHi8^U<>~UJBKq;z?R|4_Wur;eZjj%9-G-J++ zSKaW5hB(xRiQSgHsh=3MvV{1&mP<{BK2OzBU1DA)fFJ4v^@WK+G&oBH&93+KO0G@s zqw=OcOm>+YS;FIRRm>J8t!}@xL2nfHec;Yiv>c7(HAyG5uLi0$plBZXq=a8RjP)*} z=s0C~saU#h>~oPMx2poWAJS=<B_n*AC-?K2A_ET8depmAiP0g`sgj5a&2=l`V-D^2 z;U;bDi-Ykn0iD^!4TbEA<a;H?dT+htqT+bcR@qx)Vz3@Ql&8^4eq>l~@1zF3WWs84 zUB;#9S+zqpo{l5($;Ve%@RqWHFsO$68GR0q@5%&K&8%+skIv`?&ug{R(4P{iYwjMM z7{A*s72jYWW{oVvB?CSA@<w(q$6zm`_MtD#GnyEB=?krIj8%APmI`VlPe+Hnr@GtX zoG9@z-jp0YXuIFiioSo>JK6UeaeCXnijjOraI-O+L*hGu*ubg*j{)HsqC_F@4F%WJ z+M{8e>7b*Va|AbhD!s7t!d}brcFSiO$h^_H%Cc@Fyl0_}k!5jn)%DMasjd0rM$G%H zzIaZygC+No#QJLY1O}y`i-$&eFL_taH7_+yc_!Ad1x>3utSc|AGmIZP!_$LZj{5Nx z5;G4{ZQ>a2=W&s^-6WB`t)`^?f=Aqz)QoTXf}?h@e>dS750!8EMR9#w0<FkQw59}~ zljqhO5OJa*%d&etAuH?W?qDxu<n@kZzUxYh$Ed7^B{hP2nRYUH)h`5QzVn2MeSS|J zfi^dTOGi=#+BIS)<6-5QW3YqUQ?yRTaQJGqb*UaQ8_ml_3zxoj-+_NK^^bI|y^FcR zz^9HGZnn8F_8FyI=^<a#*AGo>osns;%&T&yUr-gV--P7zN||Xb6T2C(P7_Q*^N**R z-tJuY1#*Z9X!e2!usT++tY$%Xb#U<oSvvWldY^|R(3>Hy^v-lt5pl7IiMCrW!YjF! z-`Pgcetz-1@*zg!gF!19MsO`_UOHtGdA-dWR3>)KgOO^tp02j^Z7=imvE2BX@mG)e zD&Mau7gk1ejCtL6ok>5KovLSJiTku{9IoN7ru=Q&G=oP;B6~`k<AE(=IMZ<X`<7w! zAM8C}7VF-cOUTJNyG)c87dvj+JDy~lMlLNG#yjX5{3>zNikO0Ew`sfG5zsE`wz1WJ zs$`~j?<_Kyi8tljt;>Fo9uf5P#*c8=5*^{<feBe6o&x&{VqBs<v(J4JbhU&a@|%5T zOV1yoG>%&tT5~Q#cPX&kgHAt|1fT(I6#bP?lMue`l^(C3ZwG#lebsvNWp$F|cd<wO z*-2eUnnN^B-Y^0uy_94ycrf<6XrV>S!>k<Q`$&^WJh`!&{3=n1@2Zr9S#ck)Q9Roj zvCFoiOOmo>>_Cj8^a)8VjI849FtQw%Q{#V|x;nF=KzoJKJ?YLo%JWc1@?phk#Tw~V zXZ?ME<>L4Pep_%u0&&MWt2t}KLu3D%ux{NVP$o1DXt3pxeb=P+Wx3~)g1pNcn8{l8 zf_w%Q?weQ3{r(a=lCQ2?kg}}PPVG;zmWN?`sg-6BG5eIJ5M+vy{?iM5#uT9)#_i9| zO53BtBDDG2*lEzfi_BCIlRw>yAp#kohM^saYU6~=`~`QC*8lkHHW9KEHKL~bAXd&H zLf~oqhZl^s<XWq4^oXOosrT#x8g<Bn5f#IZ==Fdmj$Ma@<l&YNe1P<>AZ_eYIhZIp z5*6Gao7d6y5lQFY1hc@RQD$V~lGR4DXSi=<*}8LJ$oRr_DCU4Ymp{qsG)e%4A%%w* zb*ALKBi`cKSd{YDokTxOpj7Mn2wo@w!elE%bNmQDkjmGkY7IK(FK=lHMRD&ZD%JH$ z%Zbx*ng-*-q1`5+g5tA}86lQ`Thy=}<MSFQd{aF?<#QOQ8u04+e!=Mh3f9#b!k$|d z#=*U~49=D<WA-NnoE*=!k|L|aMe^=`%-$~Z(sOE^o@WgL9=gH)TA!5=%@P=69mdq@ z^m0U>PN|O|1;%pne91FhSF8O#yd=3vF1PYcawO8Z^m69g?FVu9?v^Y25~ep#Z_B&U zxf$dqdm_{$+J)#SWiCOIN8Fny6(;qo^IRO>w85ZirG)#@Z&I+s83S#?zds(i_J#>2 ze0Vul<8g>wGveZB3uMyt5Z}J)r6@OB%(9)}Ubs^}c&=?H{Z_;xvaLG#)r%$_W>>F3 zQUQDswdC-e=2@SMFj71Qg`@oLtes^x)T<W3p!MW&mqxAd0t23zLCuGQco5|;2FVCR zYM-DBHsLC0gYMRqfw|AahoPB=Kd6{vXkM7Nvl)E~``lQqj;QTz%%I9tH-DczA~Mp4 z3)+OqceVH=GA8De=jG{QFLin+llQsQ)e1GAfT7`%?};D&&-nTO27YBRC|Hq`@S$j= zYd#|^;}t&fG9!wab$<pa*HSwOka1Lhh+zA~3h5e7@cG;2L6Ptb{yfnCXM+gf-3VkP zN_3uX=0s+D?e8b=NEbK1bUbdid=8%Q4||}@WD4An<O=cOGn6;`sZX+i)1Hi17uXMB z4`tbBAbbIKJY|~EsF(XIJU7Rpwf9d7L(f{Z7&f?~LgT|t4EQ%8-kOr>&nk{~8LJ<f z4fISm<FscZ)U=|Qotk8==i9Xsxg_SN+$(p=HpXp_h<zE`2?5lhNsgZ|uOs*J@zQQO zAGAGtQ<)H>#ya;ag*}XHTXB(FwOg~t{W#j;I-0VikN>cH&h>k@$j`iLq!<Y&^)pIp z=jFp?8yAO?MJ5@V1}02Q1tFr@&K3Rcxgz0{^m(cvMcFoYmjNHdsoiheF6p|$vgU&N z=GX;GRDS&}<`%Aoce1eR&HKKODBNx+4(NR}P~M@;ajjbqbb(oES6`?qyR%XI`GDzT z03TIy8pRY9zM!QEcTA{GSW5`C*jRFA?=oZ}ukBO4y{;!#sJgtR+G0+Uf=6AzH}gm+ z4UW%ihkD3|n(N+cr$-z^9f_-1o6poNV+fdOpJ^g}+8|mi_r%$aI;i4{{t!T=WI5E| zIvseO*sB}A97~&>YL(nCr&4-iyL3qU<0f$A@ELXZ+Xp`BH&^R#Y?ly;+%`zDaB!A@ z%IAxg)9TX2HYDPde^(}Y=`)S|wRibiM}ADq&oF8S&Cu&-lHd*|a@YrPdcirN*^Jr9 zy~+#|PnK+nFDHzvmCOsRh=S7m=|tf%p{~Gjldi>icQ7vBoxu3_Tcp-;g#hM|h$Fn4 z4SLTiGDOp26d&xrc@5N|lJ5^)RzkMX7GRI$CV#A`$u6G-GsvrZqR~0EhznviD!pTL z@hW|1o<T#j{c(rGG#-!Uxu%5TJ_${`fTI>>5MLGbS%tPQN)bAO;M*_XqX@!BUPr1s zlv^3f`xb_4C+&52hZCjfuHC{vkmMjM+d3r-=snyEsJ?(PL`0NLz9S2`$QnLwB>nFG zbXRT_Am3>nepRwB0&k3uU=9#%bdh#r2(0zg`fzK0FU1TU*#De-4GOO`^EL<XJM$w( zy>?khMpS;EmiXYgbQxQ{tZjY(`9Y(}p~qIRZJH1vX^=dYXFX=F0vaQ1h>un@T_#ki zy3&0JivLVVW}Rf=-Hw0-=*T0Lx@B|8P;<s2OfxDIo-feZH0z7!x9#X)KKs2khU{gG zYPf)lY-=~-918OK-B}h2;0Y11kxE`JNhv8F(LB|{gGLDa@yCxJzZMk<3kiMfxX0%o za>U<-atrnUZ+{j7S=ndAOXsK$>HpllwI<4s4h4JJ70Mm7EQ+_y(XJ`}b)hc_Nu-3r zRoi^sc{(va0Q+N<z;=8`3;iX}FA<(SA)g@e%W0(`zYZHmer}-*Cd<i$-C@ukts7w= zu25`-&=oBNbNW+-<pK(xwZ<cf&l8uT#QDXecZ;~{F;NL`;*NX*q7y%SY^@n0^dH^j z-fWt<Ymu&$QZxK@$4IdW<_$?ryQAVzg*C#lAX1Dr&u$HD{{bk4If7vz9v4wdmqj(^ z8cG!}oA~t!C3?8U$a%;!6_8b@S-P{_j8beu<BO`rhso&E%xU@wkr-D?>TU!f?TB}X zslJ$QgbuyQV!&BY4-$ghAVY%Be{}V>0MYc=tMVh<ic9M@SX_f?5^3stPTcYUs$qF? zkPrn19(MG?DJACfhp&@7)G!8cF03@@L)$lJ7$44<$d01qVzio9F4vm}3&}m#?j2rV zpdAr7($(6a(`|jeYl1I1n~HhR%+}oT{Jz5WhgzAGZp4k7*Rw&CB*<rIsAqnYK|FU{ ze*7i+UsOX#qL7EVjQm}^opYs1V}M=q!Am-$E`MdS`QM;?T|P$7G}^g7+#MS{K6!*l zx!{boLnLy+#JJpI0}4%5bIaSFIWpne$(q=7L|yS~C~;aLp7|lYoRfjvV{aI7&`ciT zWyvOe-%dRm3;l&ha1gbbJID(0KD!M{0pYg+L{+l826p|YLj*89w|UHQb*%LdswjP4 zPL2(H%p4L^E|4#qjzCfzm;=2SLPOOX%Ldqo$uEhTNF&DyD6t^3R{rITN$$PC+$0H~ zgMs6_A05`r-}j^5FTe!D<DM1AwXs;*u1rf{K7BnuG-(ZLb;;5LOuM72BA42YAlf*0 z28!|IOU@e{9BDUI;u7Ry|C8+PXb`2|yJIG-^sVq(XfS+agT*xsws82Fl|dy(;8=@c z(bBMOD^AtXpnCKYF$zI4+|ATA#J=rAN!e%hI#9dQn<w$Vu#$ffKYBSL;=wgM`3oeS zXI=!Z;Ka-F=;J@DRr&%b*)|NFpBqnQYB{J6cw=$co@8!_tsj&VHw8PMP-QpC^XcT3 zy^PFg)%WJBIK^qqK9bx=9EFv1H`pv7OpjQ`yl5OI;0YPQdLhht?qE!IsHrtS={p)u zm?pb?3tU&2;tLTUfpd4-ERU*=jf%R~qHs=u{c<Xx{5G?jZ0dJF!D(KvfnjIR?%u8L z_=uCpyLixH1dTR18CQWp{+=+wRJ8`0UX|BVUy>TX*1E<%HcDV-9xoOsmkI2~O(M*{ zZ1KWKY@DcD{h>mIPT+&pz^*}$zlYb}<CrLQv^y&C<kC=l<f?(S;*(TveTl;(BW#qm zWH;%rgpYVxM44Q@_>`zqj)E;%f+Xb?nVafTk!`o9<K4eR)XBPy_Py=lf;?M_t7}*l zZ9U=Jx5Fn4_y2o&1B4C-@D5-PhiIWDrceceYD&*{C+UBkKJ5=`Etst#ch6H&rwD-c zGccgP)AoDr^H5WJ%zqHVgXT~dggrCp*)y&5uwL|;I9m$PElb0FVreRzn18L8;VbcW z`!l0w=E}`4DT7}|==*bWJ(i&S7U+9dxmP2hHHf<Gnj9%ZCd_tG9!UK18(!RJZbS~1 ztJ2TNw`r&cYAFw71oshYHc?%E?j9=ZM7F${vqg@MTeDiJ)8hQ%lrM_DptbA^%6*JQ z(MCgPm*4N111*}4q!5<Ske1urgD;)rNRimiFD>-5gGNyg>L%{}5Pp)XX73yVRe&f9 znslsmCaD!(8k8e>JxVB(+P74BkLjK}^Y8>_qJ=d~q^=wxUrShWvExZTWjJ1^44M~z zQtMAu>dJ@@V8H-M89yk)q^c+QZ-C^VZo!0<BmfrOQie&!+`OazS5dz#;2$ONH7Yq+ z2FM$IvbY#M{~oTiG_I50aR12MOwioN?fKe$H)Q0ud+L5hd>0f>-UqJ}RLHaoiv^!~ zzFu$^LN;HgO=#^SBS99q?I95_5dJ8nU72k!3a2DCOsRRJ$t0zO7s`(UZ17CeUH^xF zmL$mtWY_O#{!$-a?%>XA^DIOO(QhOQFO+uv1B3+wgWXv-<@mID?H+KRVl`BnL>{5t zQ=*S77>0j6{1`=>+QB(x55)mlU=@@7m`p3DD`48UGPU4Cf7<p)hRs|0A6JWg2?gI< zfrn>riPp`i7r9m2u#-!0a6B~+{(k43Bh1jzZ&pVT5x|5`PB_l7f3KruQOG?kzOdt( zsIz_bpEOfie-U}-e1=e7B-+0fCbQq<?U`w{umtBF$2-n14`7l^E=U4(@RNADM+&uq zpcd2$ZV&;pXzk|D{$C_YqEP6iZj-Py_4eWYQ?xhlu}=f{CFLG4hJV>qhC4Ji#Nb&r z-RvK8GW~Susu(_3<oJ==DQr;E<Si;5m!YDsT7;kCH)z=UMj2Rx-RXmc4Xe1hUKoy3 ziU`$F8{M{ci>M%FS5_I!PdjL{JqB&l(^3s>=T7Xq#tgA(5{Bwn?umqVjm?58siUPt z`|MjtxiL}ZW)Eu_qs8SF7x`%YL5ETXv!AKZMwOp;woF%HHS~Li+(B4`pJ3g+x5D`U ziN?P`=>I9Ut_krQ2eh}8rhO7#JFei<J7^JqAt0kfe)z;HL2k0n5*^^wt6zR>tdU5* zR|PO|4yA~r9213=3V(W+e=<=QW=X0=Y*C)Im4CQ-@o9TMtu*Dsk9YC^*cPCOVhJA@ zjL2U-dhX?%xL)nfFP&B|5y4j&*!7iBzTFoEq+zA={9&~ms#CD_!WKId&}5(uLwupC z4(N0M>aGn%e<B;S;onc~chVL{K74h!O(^aGsl2qW&hiS@*u~)1W7}aL611A*6u|ru zn(Jq7tuXU+{3K(=5|?{9fnL(NZiJHmgWsi;KDF(ycVhigRO;FYzImIwPYCTdJ7Zjk zITNMaNa#9j$)+|3y-r&kecrBf|AhAd(lWR`m{f`LepYDd#22XDMwbC5977vE6wJ81 zaCOiDbi=C8K0v+g5vQN?R32<rer|LW%+11V;@6pbz|S7@vXL74jSXc3_Y(K96p6?f zYjM~`EGOIH<D<7KPo`2{G9d_JF<2QMH*Fz{EH?1f4A*Ci_HWk6E3emvsZa$PxepD~ zlsw+>T;mzbZ)@GC14?bxq&nF5=j+#Qg)v(`#ugijf+z{dz$a?S<3HojUy4#>hVYC_ z&1lzZRtFDx30^zf&m4gmpnTWu15Tj4g{8p6smcn2%Az81=}!rgrGB7VxFf*NH)ftz zAPlW14cNHAL1o3?tvh3aHYmqd8?gcVx9a{|78pG<S|P`w=XW3Jl_+NX`0;??>U6$m zUWr@BBonN}Ih9o_V*{&s85R3Mv<skTjPJ6>?GpSM!m3ojHFcKD*i`7W2=9^+xR3<L z(`w!5$yL8!sWsNhkjg3Pnfa-{=5Re6-?Dx<8$)DOmE>4AHMbnuf`?*J%48#V8Qc~# zt4)N+eRIheZhJuU*Mxtm2tVo5|9nGAUA9-^NksMne^a@CyTG<hId~BZMfgxcE}-Rk zEma@$D>K18(o^oO;HP;&e=+oFM8r0;Zs6RF>_m&a->I703#+{);MfA+d)J5Y-cC=Q z8Y|tbe2KJp9iv%&;{P#{J6c4Xs3I|W@74IpBPAm1t+0V30*~howwb;h``|~Gy~ga_ zw$JT-H16&;2#u3R#IA?+eyzbHECD}~iHB8_loyViwP(j$kqSyJM25Ch*l}Ve;QFjQ z`nK$<i#=Fb=IF54RE(>oGS=+bJbmJv*TvYSNBbbJ)?G_pyeS>BaQKbdDqaUEGSctz z$e_nKp6M>m9uvf~pZqVM^ndW<7xE){2zaeUoDD@oZgV2`WZRrvg!rPtmwA2SjaxcR zGc2R`t?V8yp(^og{XqN~4l0tCt&WL(2@A8^v_8T=F>|f?INGFlqs`J-I@M+7H4{*f z*QZkxkb?o_dI=+<&Z7SrEu|o0akABTUQ9Xos*{Osb#w1{oZ-wJ^x&2qN!5~7e;+4z zZEqOZyh>H$Znm4%2difqa1I^&3i@nMe<<^Oz0J$Ul1h2A{~+uoo6JXCK^YPQnFpUP zKgGTsi4Tnkqy}q`jfY<_!;km%tW@+nxu0zsa@uwa#?hi86%0mz^t`%rBN%h@Ukx{p zJs;()XQ3)fK`wjm&9N&(gm!E4zl!+&zqkyjNdm-RHz)oX!<@~8-z**8n&IIV^ed2V ze_)eX%+#yKUom5M%Gl`1O%!oSymf_TE66=;l9o3Ew&7m2dS(J0#9DVSmXIuQUeJ1J zgr35<MRf6@(@%s{1zS~YMSn_Ik}RU3{!UlzZYyvIt$i2dg69tUNi_L0GbFNgrSr!~ zsOUz@jSUA-+qha9Pej~xLHKH$FUbxWkkbl;SV}}-Z0nysv?td}TP@j8q1z$&n(^gO zP_LYb+WDP6MU$kM*<@@{<UuafSwi1e!@JBIo5xkeGB4toMNwEsf8FM|l;gf|Uew=d zSj0dscgZS5J(wrR*pC=TdUxoiqW^saH^uEhf7!a>|Aoy7{4^+LOD9v8<I(7mFWcfz zPM-XjZ?O2Pa?(a5hu~FVeU41Qf>LpceM#HB`4g!rg-C35a4Mb@oov{sX&@DND~XjP zn!<c7SS8+Xg5&kg@%O({TL}@NhFPDAum99aAa9F7(_+D7XQTcEXc8uo^DQM>O2T0` zjm4sL-Lc{0o|>s>*mD|b;XDVkf`B0#E)++twB59YH0KONTA?$<_OV9??Lkx#6}HAG zFu&AP^*!#P&)~r~<0b9Eu`ME(5|V5a=}@0ks%>PPOD8%*EFT>vg8RN_m5zdF%rcK} zIbbWh&&}jQ>VrwgH2=F^OpK?oQ{s2D?;y;TKV52pR?r8(dZ7?gJ!NajCc_{W2rG6p zl$-hXO2#DVHS0SrnaZk@aA}q?s&@pY6>LB(9jnkpQ%=cM^HwrbLIO)fF}t%ECb&e& zf2Z@l%Ux}4Zqv^n?ORUZY4&%Rj?$nZ@Efwwd9g=#5fG8lN%%k9`Q@9nCjPNLzw(0- zF0kX9^HHgT$ssSgv{G-LmdlS&F>oB4g5tR<*-c$48}JwWX=p{<H4M+=YeNGL$DyF8 z8IhaK0J<*ntrFano4wVuS-lHQZO)sulgxpkg6^5A!!dH_<DpmY1#j;jjbXOi7`fqb zjf5*2V*8?`bM^e_K|d42*YG?GUHlP~@4oRC%X7i(7*1-$3*6?ceu#E2hHI={8U2$F z%gxs&=T8YHb-j2R`fWmvig9JZT~aobs}OD%ds=~;FlybvH{Q#^&(un_L%FP1t|4>A zqm#jO1zD#yUT-$9IWZFG5HMiteW^9Fe=83=#^Gvj5+{$H1v5w$ZIBdLR#rytYVK(0 z$v23jKFPW*UIZ`|))z1Lzc>reXXZX7P4PUC<~}Ku6VYzigf3SLr(6ZI9>8wk_~aMb zOjD<<{z^<7v3j86=-UObqZqDoQ!vR^YjNbX=RIDL7J4V_Xv|%GCRza<zDOPl&U}*w zZ?3&=v~IBO?N(738+~ujI*Dk<C_gQad4$8h?lG5-S60-(eR{nkw0sTiwp`OaoUdGd zZ9&fvegYA1cCoi!L5s@CFC}-3UEK@Dqs(U-If28^m_zZa9w4rL_|OUGcpuFW`D<<X zhobo8W2!g3Gq${(imZczyxzVH1lfzpVa3OWa2jxyvo$M$J_48fQOIj6Ja^}Hr>EU2 z5T)NfiT?(k^giFV-3?vQa?B?@yE%~J3o*U9awnhBWtzG<_rEG`3R|SUl>&VP{fn@g zmYk1SEw-nF;<|+d%pLhb!3W1d72?pA^g-K$#L@4QO4bzT&Jc@QxaC|`Z)j_ub4mXo zzY@13_%!XSc^YoBSS{pKI&isER83?sVflMZO!t~idU)q%q~3Vl!n;-HZ=$xei@dnt z-2QRfT`>%py}`SXcHEvp8=XZi4boql!+%?f^@|8uUrFi%o9q0KwmY@FM2)<zuQ-)@ zpXFd1CwkHC)TEaKTFq~OqWpTiYhj4z<yNqiO`1D-%QX~4gd46GYy<bV>Fys&A#gm{ zWQxy@K3#`Zg=?1HY7e3v`S1)R@!3XSA-g9wrHXyc#^4(z2j;OgRqD;o8`GN&|3oT= z`CSFbbW**Opnk#qQ9XfKSUpVGb+;#8KG$t8Fa%Ox=v;Qb)uEMHljB9EBW5*wvJ@I` z{Q31)M#jM1A?*+g>Y*nLM6O;-mU9Z+PKP%=kF(;7Xi7t8N{NV@6<^#%AV;Lw3nx+d zcfjyZRhY$9uk&)X^t#d~fQN>6rwwtV_n#h%fM<K3*YY(y1%4Ibjo?U#W(XF860(&^ ztwTa=uH&hf+Y7UxS4pxn5csB1)T!9GlK6)^K69v5#|th3TPN!ab;WIZmlvxB@X73` zC_=<sEq#HT(Yi}qUUW27hP1u>%A``>lhx{rk~rzv6JigsHIEAFE(q^4nVi**1~rOc zqjeaQ*ivV`!K#tYz|BnHS4qkXxl^;!uVJg+CrfV|x5e~jQN`!dqig3gQT{#rA)_bA z`b_wIn>rg>z^064cY>sUJ0BDQ#=40ie$zaAF~x(K#0c-gkhsJo8%qEdua+{xYos8v z#Qc3oJm|bH8!Ra*(zNd__x57Q!X_+E8KL@Pt2A=V<YebUy89b9==}3QVM8iGJo|6o zzDvysg&#wEmmbmi<H&3^!FEEKOkyab%jr%Wvs|vFCyaEO-@kaB#x&RfAO4KiN0+s3 zBimKYUiy&1N%lkQ8vww-cNJy+4U+%2>fWwNGylal8IQ(ZT?()SN6)x+O-l<Y|Dk!K zv&?UXyVRIO4>h~8AMo51D@W~De+Siur*&wRre8?tiy~r(1a5c^mE78FW>bxws9~M! z=&=-HmZz%~9O+c7g2L7Q2t`NDYgzbvT%3r6g2Ij)^HY(bv^4n}hvgt@y$}&>o93Qq zt993Wj!B+#b8UCHVvSA}IsXr<yMdQP_x~1w|EYK>sK-22T%0u}^{WX{r#8J=QGoE3 zXoor9nqC!}Ql)XHG^rASZ<hR|L)ebC4G$*96D_C_O%yZg-6iJW!QtJ$D#4~KA#L@u z4;nHpW8#r%pIc<DFId%LL#pZ2vTh7Dc3kr*f^KXN^@cWF*95od?oazEs%T?qwb+v` z4Rq~rnu&a9eF==W<Bj&;DbQc8bwyDBNRBY%eqnqFXG}I+K?4hegkOIKQS$*Ot9|oz zM<6r_e!&{}-Q<$pX;#m3C|7yOCN2?_n3#&5!0B_?P%w4r=br_=-etY8blTg*w~s7* zY!z0JJHxzPng8{C>ww1VLix1}*iy;iYJ7vP7{Bt`O+=&OjT5&!8wMYzb90Xz0wNU+ ziLJM<eiG(iqxzeXhcL;<&<CZab3S(rP7-~!0N=bc@{+p@u)BXt7+&%qtX8Wqmo~e; zuZRb^x(P<(=+FhOU!S?;%DI}eAA~i-Zv}oRLIP)z7=m*d-mDV`1u2u=n2B-PdU=_f zUgyj<WUcqaP3^Zicc#e^2Ol={jU>qdWtChq92-pzlk~R|EU&pQ!kD-7Dh(H-^T<*Y z_$Cyhq`UW`duc8fJFj&^*wPN$(Z%_e@%i4HDzk^*EQuKuot>&NpW00ChFc;2jvjH) z%PVT&+`6gj4OY-o+;1twF;lQ1;*k5zg!bxPqX0NW5F->fOD&I^%60jvF$y1Q3TaDd z573ser!j=ql}~#Wd8}X1FvbQYV5f<)k`2!_Q|w*mh%F;|Uk`pY`x<Dk1`&rB1?9}s zb%*3ZTXqk|^)CAoPNtRV=NDM5D{Hvoy4tIC4z3`cHgh#fGe4?>%MTQlu8c=4$a5t? zcgioNT`AICZG}^P>*<E$E`}lo!-=JvR}`@c8{L;JKo_fL*Lpl`&H@$M^@Om>Pop8X zF63XW{TC3fzl0Dg<5&)}e<J)&#dQb1bFVz3)M)ABhQKX)aNwHlLI*-zPb?+Yu2iW- z6bSgvKCZLK1ocZAc5zJ_m!zWisQFYR^{KnQSE8S;p;~if2&lN&()!%6Q{t#lnQ<Lw z)m^wV$K$o+<rZ=hzQC~{Kc=V$A75q$6&ZGFH!`Y-_13Pbj$W(lnc?}cilObfxXA5X z<3gWF&&Xk7#m9HYrE_3u5jRpxDz1l>-v>OARo3U<m=_7st+QF02OWMf({Lx3c!kvQ z-1qi6YoQF+@l0uGFqp~sn~kI0=J}yP<8Eo4J&7c(lJR4N`!p~2_xB`9&2`=F2ef9Q zRBj5+k20YxRvOi*eWHQif81lzCVbtsmf7&tW9i($*w3rn(#D(Md?*}T^Mp90A}NxI z1?%F%rn=?0pB{QO$wySU(Cqr%gs{<VITf_;W42>XSgmXDsnb*L?tfmM53Mn1G0Jf= z=LA%@hU&9(KPrFzP^)1Ui7N$YFl5VxBf^q)c^Hbgkh%1>h_}gj&g(gPLNP+{>rzQd z64Q7O@1y69PABu)4*lE5P{q|ZdUxwq?{E}I^V-v@#!o&Ddo8bt`^fvGgCI2Jrh{Ue zfneayo##yw!UD<|f$FdY&+-FmDAB_jPg6O9tJU<7E-lqn@BJ}!gUN3Tb(avYms{ZT z)UUFXFygawSXYuzGMQp-*dpM6{N3xwexYu^c1iYv8PztMKRB6E+<0Q+yti?S7}LK7 z^y4y`YRB#BB+rC4u-NZ@;wMEda=%H%)K%rY+e99F%o9ltCmXzYBI{8SI1p(y8<r<4 zCa0lO1@!5TuF^|61Q^Ao(P~?0M}lNwU)Ckqsmq6{iQQZi|MU1@Y;e@!=+r?ZdHH4s zO!$IhaE(S1r)x&+wA*Kh4-5OKpkkB7bOxXWthF<Oe@hGg6+c@a`NY*?!p0~kzr`+m zt=pt;p1nROP3eirjb@o7kloGQA(8)qAVY`So#|tYskxfz*q>G8w8T_RKU2q|>CQ#< zYEt=?Yzil_)V1Lr#jYCLc(=~YA$){$n2pNxXiMavM9<^Z#ojE=W@+d^Y*u+8+n#K( zdxajM*`6-Tl(&KRx;81kb86Re&G4@U{Yx~UdE*1HCmK0QJUx%yle+z@RT?dh3yjhx z<!3fcPAp2(^;zt+$y+RwvdCB!{5Rx{%V*J$LAStEcehGwcl(axl1mVb^=5O;a8ik4 zxXI99=WN9@AM|k<ikdDv1$EUorJr6P)Psk6<57cjrkL1|38pbTpX{|*ogc?*IC<{* zxLiDG!I8TT=L?St8l@>_l=CdlA?u^1doUzrp*X2BIi$2Yj$O-R)AE?amQN2FQuiM~ z?SCfUiiK9?;N1D-8Ug`&%Db>>s>X#T6w?GP)t6q;D5Z&07@jmIv)<0Efq#B!O}!?M zspZlXg6Eu{qp~{U2JUp)Am%ia(K2!%p23oXmx7*Y?s%Xg&ajt;F@zJR>_5J!M#DF{ z!6gcW!Z#sZ(Kow8OM^$ac_a;qgcY!j(+!>)@;reem&woKH_6-no$&f=M0LL3u=}47 zH=yA&Q7wgp2^%8f!?jYtR$D%N8ElbPxZF;c$6~yzr79*PCA2n!;!{r&vG9&3xf5QZ z<Eaos-@p)+cIn*7>V0_PD~$|dNFZ?9lcUUW&WjqO_M{+dI4utK!;b^QuFs%LeO>I! zeX)hMCx_#8PUn)^67WX17bno&qitjAG&iSFC0RA_#pyYR+)R4OlxYVy2F$cW2ZQ`~ zr+}V-;1kyphM$#I8t|1fxt=jdn1Hxq)~g}&vZXlDjT&(+h~HR9#sTDR&wavoa}g({ z+t3J$1DqmNzhq{$^E>X#$(slndn+oE+fZ<qn1cXqk|~|Pv^+U(QZ?tA${N41O@<9} z-dx%Zxt>U$Q%>TG-;9^7;dPR`MpXU~Ik#ZJb067I;+Lxbug3eAQ_(L$R(>@hI^W*i zwyNuK(6?`#UL1Cmr#lqGpjpekg~M(Nc)bKE1dA}s(9wcJ=6G$;Td#rb1U?hEFzw9V zMvC~6uf^=t_;YMW6%H-6cOn|EO11Hz06wnKzw>5kE9S0a2J|OQdh*@oSn>s`fDYLA zU7|&atRWa)@3vl?{MSJKM~nZ>C)tRaijD5+uGgzBC$pv9SH?NdqSrx(ifi1SqwY6h z29u1)1C%~deH9zc&KBn2V?IL1X&v_qQHFGBgIU6Usxd27*o)HQ5aSmetIoy2$7mv( z%YFFqOFO}N%X5KhOFQAZGH`A}Q^>XRb?o;^ffAkmB97Dzy)jMV@uTgmTw~oWJt5`V z>=LE*obmk9z?I%|;33msx}h{YZMC#dukb{LXbrqi78%a56a~7;Y(XS8g(6RXCG%fR z)n^A$bCNL>>Tw?U=ICSPh@F*}wv2XQ<`J9iURONpy{Z$2&<j~EW>fx@0STX2B=)Y_ z8yKeT_3ET(5y(hwD4?PjCnhIqYK-eF-D_{<t$zX=d=zE5aG{!%)9EBEfI~x-<qZ2{ zdCS}V8GEL#*#7v;++yaSew!wTSB4qfwBq3UOC=bX*z0g|=`cC|h^m5t&+%nYl!z;) z+?NM}b@I?6$KRg}JtB@nEkt~(NuFbBxr?tkvMQZ%gSUb$IPw*#{22oL$=>two-TaV zH4in|F&dkn8--NVNPQ*y-h~=8yzzPvNmOQL$Yi%#DoK$EtNL3~HhkMc5@c3((t%W} z_w8)x8p%l%0I+A_MvRC6vuB($wxIZJ|7(Pt?ObiGTMqOT35{0E+Ax%9I^CI;-aaqH z5wV9w4OC+y*lT2Xia8Hh5T~uo)tjzZAJkfWpMW?v3a#keY^^omxx9BKxE_B3UV8$; zeAKUb#Mr%wYBsW_QofcJI>t7iaFh*lDO=NJG6_YASw;=K<aoeF@cS5Ig}~rR_>naI z+@IC<kVy|8#|su|)ls5@p3sjFC``8J@>cJ2MpFq3PKjPx{kQSntA$e<*=A)W8gLN& zp6!MjFIHi=Wne{8ZOe`VjYaYf=R}K*9=$qGC6kDi=aqbR`aAG3GT`lrOe_B;4*K6; z`7~jhZEA7i&2B<d1IHk)l$h&HU4wwHP6SdhANYl(Zbr>Et%<YM8?sFM#BrK<z%eo} zL+_PxzdCB{ms_^0Of#Pqdm`4=R8Ta#USV*tjZ__+WXF+R-u*P9j_+}V`G4f@e_4(E z21026OlDPqM<<JW_%5D8F2EE6PWZgmNrWa_s+GFS-&+|py^8kg{gRtw(3fIz)Vk`Z zQhu~7mPNzS{9^tQkd+x<9IQ;VR_*3(c6L?8KuP*Hkn_JqaJzt5b^K)2!7k3=GLea@ z*PTnDbpEmRB>X=Zd}b(RY{BI2SxyGaF_BeRJ(G+Lj~_}WDv&;$tIK5AbAc|r(~?xM zWvSuyqQMCKPV5D)x=qBWT1WrBSzTe7>C7_Im$hWglCL;EX0;X2|Jqt0l>AwD?W)O5 zz*CuRV$EZ2lc4NpEP049?6O9;w}8HztQI~=PkjP^vJ)~RBE#{lp9B*VkUBF{@o$qo zegV{~M-IjlD)ZX7QZ=Q$+FYdk`X-1t#d^G~nCoT}B|LyDjwwlbw7v#jz;;whk%v?@ zG2~wOMO#jAs?DCsBosO?H2n7MTG4%izJFV&W;ppsIS;cA6>fLB6mm(yNO%fxgj7}* zn-Z$s8PIDrA?&L+y%kYYC;3?lin^SX77Vnq-4oy^=d-+&4bzWkZTYyUi+`Ix@wcH> z9XpDu7|A&7Mq6s_v(F-!`nCF|ooYN?HxsBibr6=3>M&F3>qh^oD^IM&>+wEhW|oc! zK!a?s^FRuaL{6+^XZ>wM@1eUT3+kTlm2|r(@Bq*uX-0GByzBLvsDG!1FMqbiY&mGd z3$`Y4LRdJK=~JTaI@DcW5GxlA+~}R}>;F)~_?KDtIQty$Eu>x|9r8#YJWWtSD27X! z&b#$n&=~;<qDsa+50tu_MV@l~lc<zWN@FwVT6}hI$ReW`AKKvq(T&YLIkn$6PjLjw zSYrikO>J?h3LJz=-3&*o$s#SG$-M;)T>F;$P0N@tK*EDoekzK(&l~w1Uj-@g5wbD? zFun%$LH?If|Ay-fp_QLpAXs&b&6-%XSUhZ;Shp~%q$(NR3Yt0(yv(HG=yiY!lht^y zh<~qQ`<BFp>y{DS6z%uT(DSzm(ofhq6w)7QJ-kAu2&U0==gh3ge;pi`6hbWznSQ?Q zZF%D|C|ay{+4{|laD$*)c5&bqT%S2t0*S7_K<hW&0FM-O+#M~NSry7MMtX2a8sZyh zFs-wlX)iYPX`<4lqfgx)I)QRB;<5$g1>~B`pZ%Grq%|`rQ|r>jr5kP>9O(=51N`vS zq$eHhP0}9mxjKJmFz+*OKAK53>X#$#D<~EnqXQPit$9%N4`u-5^#p;%Uma=6v=a0* z$vmiNh6A9GmSS-U<g|dZR%S6V@e6hv$HAEHyq@$yQo%OUva18gXM+iUE-lTBYNqOK zFJ9t&CIotKaDzwKdsVP%a|Uk>{J0UUEtL6{#>s2R3?R2*)1qAiw^*y;UHLl+!2dyg zJhfZpt+O(z5U`MQSAH$=JiX5ysJ&?%6HRk&VQnwevL~rAJg=5D@B)^6DEyKH^|$Th zr$!i|zGAcpzU9^1rVWPYK0b+$4P*x(M`@`eqw~C$#e`auok5N459#b9y#Yf!f~Exo z{I;*Uok#0?A7NoF@Adr(?s{5a(Q6*j9a1E<KPHb9?>r4B3@qqQYV&*TP}7+U-g~hl zg4?r2v4`6eTJ`Wx=Hb(hV@8;uz2qeX_I=@}(NfD76g3)^hvnMyBWE1@r{}F`;dJsk zGy`a!ka_A_;Ri^BM>Ffv@8?Wz&Gn^lMvnJpMB$EX;}feOxSj{aXycOH_=w|rtMVhO zIcCJIM$M%(Z<t(G#bR+P3~ZMBCLAc{td9($qy9D~-<qsXIU?<vikRo+Re6C}Oz9LK zIy`(Qbm?$(gSX06*pm@;#w}h{<)}&fp>YTbYBsdc==9d&d0>*+e*`P`+8I_>rm6_H zt9;>Yr<S{W*f@Dhkp>(~Wa9|clMBCu2xVjd=8k*3Tm9ybmP8P!DiibBdLMj_Enhtl zdK!pNCl`k$Hsm>LgSGPGHrYJ$x~Qj3{4)u_$1z}NH$+<hq4f8^;fCJ_`BkwlL6<S5 zQAuvG^E=DSjYV;+N4+!NjVBfN?kS9`bD2N_Rp}wMuK{I<q~6Mf&tdH+v#>)ORsP5b z2Lyc_GCic^z+WSo)SD@sJT5j8dXG2XUSA_Qht4>+`vnTqHy(wdIFI?XYGVVeMh)8J z_-A*JyyX<+OV&H)q4ViHIK5FzPaTEOW}F?wfUx+BNHnLO{m|#HmVNVk@Mu&)YJ^I0 z{-taB1`R=A58fYGW7+$TLj&Z^Y`7=ir94Hy<mcFMr%3VL7|<RZNwl!9p(v-3=Yn`T z+0p$G3VJ|99rVQ?`45tp!HBf@=9#(GUN4s#L}bcgdfa$jt2r8_fZ4oz#bDEaTRsDl zeTJ9dFyV{)caZKPOrrs?wIC_=C#rQ9!IgA)0)owkw$^nG)bb>0`>6=VTFEb|=BQJP zK({=*s==_`(~;!mB%r!OC)BMMzs>t@#c7hte_6v;4n+$W*05U5Hnh=grok!MO_GQB z_``&kgL-$r^L+_?MJ4~?R&n=pH8K9gy7>*zUKMNO#Xe%It?sGL7rwF#_k*XFZw=>K zCR>PoXqCAoJP5WDf3mXt`i#imtJ%Ro1rw}e?r5)L3GZnHTjc>MZzDj$#Iv~>7G9UN z-dtgXTsRC247NX7ea_|~@OfX|(yrg8|F^RY!P@XPo9t;Pr4;GSoI2^f%*w9t5YJZv zN?f#n!_G9kKYT5vcQL9z>Sb(f>~RpR7ZMc}Rd;iJxy<f;#Ez!#823jy8&S-^+up6- z(Cj|2w(WiOO&mG^1;U+E09PStkfLq)s1#GzayTCm)E#oUH0ceWT&DI~qF#b|-@uG+ zuHgrXLmpI&dM(`B6BPP?qGdk4XvfW_rW8S<x!AQfx`h3E1PNEIZWtsHPw~$2<MQnk z0}wz*Tp-NN6}T9&=c~%5%<sfA4hT1BOik!|*N5?}tFr$avHpXlqUvRsUpE0MQJX12 z3(ak#BO~Z@)ivKcz(4?OZ<;UKIq$@jd)VFV1-~#jDAlU9-oMz)OD9s@`&nrD-Fs#1 z-*13Ih(vm86@!C;y3!<dm?+E1n7{{q>sw#dZ95TSxAi?AC<lfF1qB%}v%h-vP&fUJ zt)Y57+8@cU9rvr{*FbFNmg=X+6X3l-An@}8nbA?a3`OV~dlR33$p2%m-d;gZkB=;B zW@bj50>k!jrT3}hrms{yV^=>Dh}%51eVX*g^<da#43mPJ?%}HJK-e2@rpjgBRiT)) zSdTiiN+4%Fu+yM-j$Uj^MZ70?4gSH=d*dF%^wdrD_UCDDxLGULbyuab(-J-EG0zG8 z*C{|yIbM-<jo!RQW-h~nfdSy(<rLgZ4mYh=Z0OUXubSD<aS}}_A$#K2;N`^If3tZC ze7zgCV#A#lI|7xNZ5g+{KCxFQZ_-%Um=y*-OOMT`x3aWM>030l+z~ckvtWJQ82Cq! z^K<q1ebBJ5&o1c0|AVIdVyOqd0wLM6Rd$X)L870x!D;}m6a;lli2V`Z-2RxAcK_z? XSqYfe82#nc9pEJ)A}d@XsPFq<kviHu diff --git a/docs/static/img/databases/databricks.png b/docs/static/img/databases/databricks.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4a5010116975aac2e7664ed57291837be10596 GIT binary patch literal 20293 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 VuDV}+{WG`mZw}7(6(^DLe*<^MTATm? literal 0 HcmV?d00001 diff --git a/docs/static/img/databases/timescale.png b/docs/static/img/databases/timescale.png new file mode 100644 index 0000000000000000000000000000000000000000..86706ec445db437746c075fba4d49ad02ca482e6 GIT binary patch literal 16120 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 QM0J3Qf~I_}tYz^30P0B!<^TWy literal 0 HcmV?d00001 diff --git a/docs/static/img/explore.jpg b/docs/static/img/explore.jpg new file mode 100644 index 0000000000000000000000000000000000000000..110b551492f86d808e52b4a5ef7f1240a7bac3fd GIT binary patch literal 150805 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�X&lN`XqF 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 =n&_%# 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°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 P9{<P^{xN&zU(^2u4qLb! literal 0 HcmV?d00001 diff --git a/docs/static/img/explorer5.jpg b/docs/static/img/explorer5.jpg deleted file mode 100644 index 37c5e1b9c7fa5bc2daf587e72d9a349d5e39cf89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314853 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 E1LYH;lmGw# diff --git a/docs/static/img/sql_lab.jpg b/docs/static/img/sql_lab.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8278ee61381e4c0b9a0bb843f9dad20aab7f1602 GIT binary patch literal 117310 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/sqllab5.jpg b/docs/static/img/sqllab5.jpg deleted file mode 100644 index 7afb1ddc2ae1c29532d297b5c16da21de5570254..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345510 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ξ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ⅅt{!RMG%!3eiht~kQ}(t+S-vGjQ!+kYKv*Z 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 diff --git a/docs/static/resources/openapi.json b/docs/static/resources/openapi.json index 330c629063ad..18ea7a47f8f1 100644 --- a/docs/static/resources/openapi.json +++ b/docs/static/resources/openapi.json @@ -61,6 +61,94 @@ }, "description": "Not found" }, + "410": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "items": { + "properties": { + "error_type": { + "enum": [ + "FRONTEND_CSRF_ERROR", + "FRONTEND_NETWORK_ERROR", + "FRONTEND_TIMEOUT_ERROR", + "GENERIC_DB_ENGINE_ERROR", + "COLUMN_DOES_NOT_EXIST_ERROR", + "TABLE_DOES_NOT_EXIST_ERROR", + "SCHEMA_DOES_NOT_EXIST_ERROR", + "CONNECTION_INVALID_USERNAME_ERROR", + "CONNECTION_INVALID_PASSWORD_ERROR", + "CONNECTION_INVALID_HOSTNAME_ERROR", + "CONNECTION_PORT_CLOSED_ERROR", + "CONNECTION_INVALID_PORT_ERROR", + "CONNECTION_HOST_DOWN_ERROR", + "CONNECTION_ACCESS_DENIED_ERROR", + "CONNECTION_UNKNOWN_DATABASE_ERROR", + "CONNECTION_DATABASE_PERMISSIONS_ERROR", + "CONNECTION_MISSING_PARAMETERS_ERROR", + "OBJECT_DOES_NOT_EXIST_ERROR", + "SYNTAX_ERROR", + "CONNECTION_DATABASE_TIMEOUT", + "VIZ_GET_DF_ERROR", + "UNKNOWN_DATASOURCE_TYPE_ERROR", + "FAILED_FETCHING_DATASOURCE_INFO_ERROR", + "TABLE_SECURITY_ACCESS_ERROR", + "DATASOURCE_SECURITY_ACCESS_ERROR", + "DATABASE_SECURITY_ACCESS_ERROR", + "QUERY_SECURITY_ACCESS_ERROR", + "MISSING_OWNERSHIP_ERROR", + "USER_ACTIVITY_SECURITY_ACCESS_ERROR", + "BACKEND_TIMEOUT_ERROR", + "DATABASE_NOT_FOUND_ERROR", + "MISSING_TEMPLATE_PARAMS_ERROR", + "INVALID_TEMPLATE_PARAMS_ERROR", + "RESULTS_BACKEND_NOT_CONFIGURED_ERROR", + "DML_NOT_ALLOWED_ERROR", + "INVALID_CTAS_QUERY_ERROR", + "INVALID_CVAS_QUERY_ERROR", + "SQLLAB_TIMEOUT_ERROR", + "RESULTS_BACKEND_ERROR", + "ASYNC_WORKERS_ERROR", + "ADHOC_SUBQUERY_NOT_ALLOWED_ERROR", + "GENERIC_COMMAND_ERROR", + "GENERIC_BACKEND_ERROR", + "INVALID_PAYLOAD_FORMAT_ERROR", + "INVALID_PAYLOAD_SCHEMA_ERROR", + "REPORT_NOTIFICATION_ERROR" + ], + "type": "string" + }, + "extra": { + "type": "object" + }, + "level": { + "enum": [ + "info", + "warning", + "error" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "message": { + "type": "string" + } + }, + "type": "object" + } + } + }, + "description": "Gone" + }, "422": { "content": { "application/json": { @@ -93,6 +181,31 @@ } }, "schemas": { + "AdvancedDataTypeSchema": { + "properties": { + "display_value": { + "description": "The string representation of the parsed values", + "type": "string" + }, + "error_message": { + "type": "string" + }, + "valid_filter_operators": { + "items": { + "type": "string" + }, + "type": "array" + }, + "values": { + "items": { + "description": "parsed value (can be any value)", + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, "AnnotationLayer": { "properties": { "annotationType": { @@ -522,6 +635,17 @@ }, "type": "object" }, + "AvailableDomainsSchema": { + "properties": { + "domains": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, "CacheInvalidationRequestSchema": { "properties": { "datasource_uids": { @@ -780,8 +904,12 @@ "type": { "description": "Datasource type", "enum": [ - "druid", - "table" + "sl_table", + "table", + "dataset", + "query", + "saved_query", + "view" ], "type": "string" } @@ -793,17 +921,12 @@ }, "ChartDataExtras": { "properties": { - "druid_time_origin": { - "description": "Starting point for time grain counting on legacy Druid datasources. Used to change e.g. Monday/Sunday first-day-of-week.", - "nullable": true, - "type": "string" - }, "having": { "description": "HAVING clause to be added to aggregate queries using AND operator.", "type": "string" }, "having_druid": { - "description": "HAVING filters to be added to legacy Druid datasource queries.", + "description": "HAVING filters to be added to legacy Druid datasource queries. This field is deprecated", "items": { "$ref": "#/components/schemas/ChartDataFilter" }, @@ -891,18 +1014,20 @@ "NOT IN", "REGEX", "IS TRUE", - "IS FALSE" + "IS FALSE", + "TEMPORAL_RANGE" ], "example": "IN", "type": "string" }, "val": { - "description": "The value or values to compare against. Can be a string, integer, decimal or list, depending on the operator.", + "description": "The value or values to compare against. Can be a string, integer, decimal, None or list, depending on the operator.", "example": [ "China", "France", "Japan" - ] + ], + "nullable": true } }, "required": [ @@ -1033,20 +1158,23 @@ "enum": [ "aggregate", "boxplot", + "compare", "contribution", "cum", + "diff", + "escape_separator", + "flatten", "geodetic_parse", "geohash_decode", "geohash_encode", "pivot", "prophet", + "rename", + "resample", "rolling", "select", "sort", - "diff", - "compare", - "resample", - "flatten" + "unescape_separator" ], "example": "aggregate", "type": "string" @@ -1095,6 +1223,7 @@ "example": false }, "periods": { + "description": "Time periods (in units of `time_grain`) to predict into the future", "example": 7, "format": "int32", "type": "integer" @@ -1143,11 +1272,18 @@ }, "ChartDataQueryContextSchema": { "properties": { + "custom_cache_timeout": { + "description": "Override the default cache timeout", + "format": "int32", + "nullable": true, + "type": "integer" + }, "datasource": { "$ref": "#/components/schemas/ChartDataDatasource" }, "force": { "description": "Should the queries be forced to load from the source. Default: `false`", + "nullable": true, "type": "boolean" }, "form_data": { @@ -1405,7 +1541,7 @@ "type": "string" }, "cache_timeout": { - "description": "Cache timeout in following order: custom timeout, datasource timeout, default config timeout.", + "description": "Cache timeout in following order: custom timeout, datasource timeout, cache default timeout, config default cache timeout.", "format": "int32", "nullable": true, "type": "integer" @@ -1443,6 +1579,7 @@ "type": "string" }, "from_dttm": { + "description": "Start timestamp of time range", "format": "int32", "nullable": true, "type": "integer" @@ -1468,6 +1605,7 @@ "type": "integer" }, "stacktrace": { + "description": "Stacktrace if there was an error", "nullable": true, "type": "string" }, @@ -1485,6 +1623,7 @@ "type": "string" }, "to_dttm": { + "description": "End timestamp of time range", "format": "int32", "nullable": true, "type": "integer" @@ -1526,6 +1665,9 @@ "nullable": true, "type": "string" }, + "changed_on_delta_humanized": { + "readOnly": true + }, "dashboards": { "$ref": "#/components/schemas/ChartDataRestApi.get.Dashboard" }, @@ -1533,6 +1675,13 @@ "nullable": true, "type": "string" }, + "id": { + "format": "int32", + "type": "integer" + }, + "is_managed_externally": { + "type": "boolean" + }, "owners": { "$ref": "#/components/schemas/ChartDataRestApi.get.User" }, @@ -1549,6 +1698,12 @@ "nullable": true, "type": "string" }, + "thumbnail_url": { + "readOnly": true + }, + "url": { + "readOnly": true + }, "viz_type": { "maxLength": 250, "nullable": true, @@ -1617,7 +1772,7 @@ "type": "string" }, "changed_by": { - "$ref": "#/components/schemas/ChartDataRestApi.get_list.User1" + "$ref": "#/components/schemas/ChartDataRestApi.get_list.User" }, "changed_by_name": { "readOnly": true @@ -1634,6 +1789,12 @@ "created_by": { "$ref": "#/components/schemas/ChartDataRestApi.get_list.User2" }, + "created_on_delta_humanized": { + "readOnly": true + }, + "dashboards": { + "$ref": "#/components/schemas/ChartDataRestApi.get_list.Dashboard" + }, "datasource_id": { "format": "int32", "nullable": true, @@ -1664,16 +1825,19 @@ "format": "int32", "type": "integer" }, + "is_managed_externally": { + "type": "boolean" + }, "last_saved_at": { "format": "date-time", "nullable": true, "type": "string" }, "last_saved_by": { - "$ref": "#/components/schemas/ChartDataRestApi.get_list.User" + "$ref": "#/components/schemas/ChartDataRestApi.get_list.User3" }, "owners": { - "$ref": "#/components/schemas/ChartDataRestApi.get_list.User3" + "$ref": "#/components/schemas/ChartDataRestApi.get_list.User1" }, "params": { "nullable": true, @@ -1701,6 +1865,20 @@ }, "type": "object" }, + "ChartDataRestApi.get_list.Dashboard": { + "properties": { + "dashboard_title": { + "maxLength": 500, + "nullable": true, + "type": "string" + }, + "id": { + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, "ChartDataRestApi.get_list.SqlaTable": { "properties": { "default_endpoint": { @@ -1723,10 +1901,6 @@ "maxLength": 64, "type": "string" }, - "id": { - "format": "int32", - "type": "integer" - }, "last_name": { "maxLength": 64, "type": "string" @@ -1744,14 +1918,23 @@ "maxLength": 64, "type": "string" }, + "id": { + "format": "int32", + "type": "integer" + }, "last_name": { "maxLength": 64, "type": "string" + }, + "username": { + "maxLength": 64, + "type": "string" } }, "required": [ "first_name", - "last_name" + "last_name", + "username" ], "type": "object" }, @@ -1789,16 +1972,11 @@ "last_name": { "maxLength": 64, "type": "string" - }, - "username": { - "maxLength": 64, - "type": "string" } }, "required": [ "first_name", - "last_name", - "username" + "last_name" ], "type": "object" }, @@ -1841,8 +2019,11 @@ "datasource_type": { "description": "The type of dataset/datasource identified on `datasource_id`.", "enum": [ - "druid", + "sl_table", "table", + "dataset", + "query", + "saved_query", "view" ], "type": "string" @@ -1944,8 +2125,11 @@ "datasource_type": { "description": "The type of dataset/datasource identified on `datasource_id`.", "enum": [ - "druid", + "sl_table", "table", + "dataset", + "query", + "saved_query", "view" ], "nullable": true, @@ -2052,6 +2236,7 @@ "type": "string" }, "rolling_type_options": { + "description": "Optional options to pass to rolling method. Needed for e.g. quantile operation.", "example": {}, "type": "object" }, @@ -2188,10 +2373,8 @@ "description": "Form data from the Explore controls used to form the chart's data query.", "type": "object" }, - "modified": { - "type": "string" - }, - "slice_id": { + "id": { + "description": "The id of the chart.", "format": "int32", "type": "integer" }, @@ -2275,6 +2458,9 @@ "nullable": true, "type": "string" }, + "changed_on_delta_humanized": { + "readOnly": true + }, "dashboards": { "$ref": "#/components/schemas/ChartRestApi.get.Dashboard" }, @@ -2282,6 +2468,13 @@ "nullable": true, "type": "string" }, + "id": { + "format": "int32", + "type": "integer" + }, + "is_managed_externally": { + "type": "boolean" + }, "owners": { "$ref": "#/components/schemas/ChartRestApi.get.User" }, @@ -2298,6 +2491,12 @@ "nullable": true, "type": "string" }, + "thumbnail_url": { + "readOnly": true + }, + "url": { + "readOnly": true + }, "viz_type": { "maxLength": 250, "nullable": true, @@ -2366,7 +2565,7 @@ "type": "string" }, "changed_by": { - "$ref": "#/components/schemas/ChartRestApi.get_list.User1" + "$ref": "#/components/schemas/ChartRestApi.get_list.User" }, "changed_by_name": { "readOnly": true @@ -2383,6 +2582,12 @@ "created_by": { "$ref": "#/components/schemas/ChartRestApi.get_list.User2" }, + "created_on_delta_humanized": { + "readOnly": true + }, + "dashboards": { + "$ref": "#/components/schemas/ChartRestApi.get_list.Dashboard" + }, "datasource_id": { "format": "int32", "nullable": true, @@ -2413,16 +2618,19 @@ "format": "int32", "type": "integer" }, + "is_managed_externally": { + "type": "boolean" + }, "last_saved_at": { "format": "date-time", "nullable": true, "type": "string" }, "last_saved_by": { - "$ref": "#/components/schemas/ChartRestApi.get_list.User" + "$ref": "#/components/schemas/ChartRestApi.get_list.User3" }, "owners": { - "$ref": "#/components/schemas/ChartRestApi.get_list.User3" + "$ref": "#/components/schemas/ChartRestApi.get_list.User1" }, "params": { "nullable": true, @@ -2450,6 +2658,20 @@ }, "type": "object" }, + "ChartRestApi.get_list.Dashboard": { + "properties": { + "dashboard_title": { + "maxLength": 500, + "nullable": true, + "type": "string" + }, + "id": { + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, "ChartRestApi.get_list.SqlaTable": { "properties": { "default_endpoint": { @@ -2472,10 +2694,6 @@ "maxLength": 64, "type": "string" }, - "id": { - "format": "int32", - "type": "integer" - }, "last_name": { "maxLength": 64, "type": "string" @@ -2493,14 +2711,23 @@ "maxLength": 64, "type": "string" }, + "id": { + "format": "int32", + "type": "integer" + }, "last_name": { "maxLength": 64, "type": "string" + }, + "username": { + "maxLength": 64, + "type": "string" } }, "required": [ "first_name", - "last_name" + "last_name", + "username" ], "type": "object" }, @@ -2538,16 +2765,11 @@ "last_name": { "maxLength": 64, "type": "string" - }, - "username": { - "maxLength": 64, - "type": "string" } }, "required": [ "first_name", - "last_name", - "username" + "last_name" ], "type": "object" }, @@ -2590,8 +2812,11 @@ "datasource_type": { "description": "The type of dataset/datasource identified on `datasource_id`.", "enum": [ - "druid", + "sl_table", "table", + "dataset", + "query", + "saved_query", "view" ], "type": "string" @@ -2693,8 +2918,11 @@ "datasource_type": { "description": "The type of dataset/datasource identified on `datasource_id`.", "enum": [ - "druid", + "sl_table", "table", + "dataset", + "query", + "saved_query", "view" ], "nullable": true, @@ -2992,8 +3220,7 @@ }, "owners": { "items": { - "format": "int32", - "type": "integer" + "type": "object" }, "type": "array" }, @@ -3087,6 +3314,10 @@ "format": "int32", "type": "integer" }, + "is_managed_externally": { + "nullable": true, + "type": "boolean" + }, "json_metadata": { "description": "This JSON object is generated dynamically when clicking the save or overwrite button in the dashboard view. It is exposed here for reference and for power users who may want to alter specific parameters.", "type": "string" @@ -3124,15 +3355,24 @@ }, "DashboardPermalinkPostSchema": { "properties": { - "filterState": { - "description": "Native filter state", - "type": "object" + "activeTabs": { + "description": "Current active dashboard tabs", + "items": { + "type": "string" + }, + "nullable": true, + "type": "array" }, - "hash": { - "description": "Optional anchor link", + "anchor": { + "description": "Optional anchor link added to url hash", "nullable": true, "type": "string" }, + "dataMask": { + "description": "Data mask used for native filter state", + "nullable": true, + "type": "object" + }, "urlParams": { "description": "URL Parameters", "items": { @@ -3143,9 +3383,6 @@ "type": "array" } }, - "required": [ - "filterState" - ], "type": "object" }, "DashboardRestApi.get": { @@ -3183,7 +3420,10 @@ "readOnly": true }, "created_by": { - "$ref": "#/components/schemas/DashboardRestApi.get_list.User1" + "$ref": "#/components/schemas/DashboardRestApi.get_list.User2" + }, + "created_on_delta_humanized": { + "readOnly": true }, "css": { "nullable": true, @@ -3198,18 +3438,15 @@ "format": "int32", "type": "integer" }, + "is_managed_externally": { + "type": "boolean" + }, "json_metadata": { "nullable": true, "type": "string" }, "owners": { - "$ref": "#/components/schemas/DashboardRestApi.get_list.User2" - }, - "advanced_data_type": { - "maxLength": 255, - "minLength": 1, - "nullable": true, - "type": "string" + "$ref": "#/components/schemas/DashboardRestApi.get_list.User1" }, "position_json": { "nullable": true, @@ -3283,6 +3520,10 @@ }, "DashboardRestApi.get_list.User1": { "properties": { + "email": { + "maxLength": 64, + "type": "string" + }, "first_name": { "maxLength": 64, "type": "string" @@ -3294,20 +3535,22 @@ "last_name": { "maxLength": 64, "type": "string" + }, + "username": { + "maxLength": 64, + "type": "string" } }, "required": [ + "email", "first_name", - "last_name" + "last_name", + "username" ], "type": "object" }, "DashboardRestApi.get_list.User2": { "properties": { - "email": { - "maxLength": 64, - "type": "string" - }, "first_name": { "maxLength": 64, "type": "string" @@ -3319,17 +3562,11 @@ "last_name": { "maxLength": 64, "type": "string" - }, - "username": { - "maxLength": 64, - "type": "string" } }, "required": [ - "email", "first_name", - "last_name", - "username" + "last_name" ], "type": "object" }, @@ -3478,9 +3715,6 @@ }, "Database": { "properties": { - "allow_multi_schema_metadata_fetch": { - "type": "boolean" - }, "allows_cost_estimate": { "type": "boolean" }, @@ -3510,6 +3744,14 @@ }, "type": "object" }, + "Database1": { + "properties": { + "database_name": { + "type": "string" + } + }, + "type": "object" + }, "DatabaseFunctionNamesResponse": { "properties": { "function_names": { @@ -3617,10 +3859,6 @@ "nullable": true, "type": "boolean" }, - "allow_multi_schema_metadata_fetch": { - "nullable": true, - "type": "boolean" - }, "allow_run_async": { "nullable": true, "type": "boolean" @@ -3642,9 +3880,11 @@ "maxLength": 250, "type": "string" }, - "encrypted_extra": { - "nullable": true, - "type": "string" + "driver": { + "readOnly": true + }, + "engine_information": { + "readOnly": true }, "expose_in_sqllab": { "nullable": true, @@ -3667,6 +3907,12 @@ "nullable": true, "type": "boolean" }, + "is_managed_externally": { + "type": "boolean" + }, + "masked_encrypted_extra": { + "readOnly": true + }, "parameters": { "readOnly": true }, @@ -3680,6 +3926,11 @@ "sqlalchemy_uri": { "maxLength": 1024, "type": "string" + }, + "uuid": { + "format": "uuid", + "nullable": true, + "type": "string" } }, "required": [ @@ -3706,10 +3957,6 @@ "nullable": true, "type": "boolean" }, - "allow_multi_schema_metadata_fetch": { - "nullable": true, - "type": "boolean" - }, "allow_run_async": { "nullable": true, "type": "boolean" @@ -3744,6 +3991,9 @@ "disable_data_preview": { "readOnly": true }, + "engine_information": { + "readOnly": true + }, "explore_database_id": { "readOnly": true }, @@ -3763,6 +4013,11 @@ "id": { "format": "int32", "type": "integer" + }, + "uuid": { + "format": "uuid", + "nullable": true, + "type": "string" } }, "required": [ @@ -3805,12 +4060,8 @@ "description": "Allow to upload CSV file data into this databaseIf selected, please set the schemas allowed for csv upload in Extra.", "type": "boolean" }, - "allow_multi_schema_metadata_fetch": { - "description": "Allow SQL Lab to fetch a list of all tables and all views across all database schemas. For large data warehouse with thousands of tables, this can be expensive and put strain on the system.", - "type": "boolean" - }, "allow_run_async": { - "description": "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.", + "description": "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.", "type": "boolean" }, "cache_timeout": { @@ -3829,8 +4080,8 @@ "minLength": 1, "type": "string" }, - "encrypted_extra": { - "description": "<p>JSON string containing additional connection configuration.<br>This is used to provide connection information for systems like Hive, Presto, and BigQuery, which do not conform to the username:password syntax normally used by SQLAlchemy.</p>", + "driver": { + "description": "SQLAlchemy driver to use", "nullable": true, "type": "string" }, @@ -3866,6 +4117,11 @@ "nullable": true, "type": "boolean" }, + "masked_encrypted_extra": { + "description": "<p>JSON string containing additional connection configuration.<br>This is used to provide connection information for systems like Hive, Presto, and BigQuery, which do not conform to the username:password syntax normally used by SQLAlchemy.</p>", + "nullable": true, + "type": "string" + }, "parameters": { "additionalProperties": {}, "description": "DB-specific parameters for configuration", @@ -3881,6 +4137,17 @@ "maxLength": 1024, "minLength": 1, "type": "string" + }, + "ssh_tunnel": { + "allOf": [ + { + "$ref": "#/components/schemas/DatabaseSSHTunnel" + } + ], + "nullable": true + }, + "uuid": { + "type": "string" } }, "required": [ @@ -3906,12 +4173,8 @@ "description": "Allow to upload CSV file data into this databaseIf selected, please set the schemas allowed for csv upload in Extra.", "type": "boolean" }, - "allow_multi_schema_metadata_fetch": { - "description": "Allow SQL Lab to fetch a list of all tables and all views across all database schemas. For large data warehouse with thousands of tables, this can be expensive and put strain on the system.", - "type": "boolean" - }, "allow_run_async": { - "description": "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.", + "description": "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.", "type": "boolean" }, "cache_timeout": { @@ -3931,8 +4194,8 @@ "nullable": true, "type": "string" }, - "encrypted_extra": { - "description": "<p>JSON string containing additional connection configuration.<br>This is used to provide connection information for systems like Hive, Presto, and BigQuery, which do not conform to the username:password syntax normally used by SQLAlchemy.</p>", + "driver": { + "description": "SQLAlchemy driver to use", "nullable": true, "type": "string" }, @@ -3968,6 +4231,11 @@ "nullable": true, "type": "boolean" }, + "masked_encrypted_extra": { + "description": "<p>JSON string containing additional connection configuration.<br>This is used to provide connection information for systems like Hive, Presto, and BigQuery, which do not conform to the username:password syntax normally used by SQLAlchemy.</p>", + "nullable": true, + "type": "string" + }, "parameters": { "additionalProperties": {}, "description": "DB-specific parameters for configuration", @@ -3983,6 +4251,61 @@ "maxLength": 1024, "minLength": 0, "type": "string" + }, + "ssh_tunnel": { + "allOf": [ + { + "$ref": "#/components/schemas/DatabaseSSHTunnel" + } + ], + "nullable": true + } + }, + "type": "object" + }, + "DatabaseSSHTunnel": { + "properties": { + "id": { + "description": "SSH Tunnel ID (for updates)", + "format": "int32", + "nullable": true, + "type": "integer" + }, + "password": { + "type": "string" + }, + "private_key": { + "type": "string" + }, + "private_key_password": { + "type": "string" + }, + "server_address": { + "type": "string" + }, + "server_port": { + "format": "int32", + "type": "integer" + }, + "username": { + "type": "string" + } + }, + "type": "object" + }, + "DatabaseTablesResponse": { + "properties": { + "extra": { + "description": "Extra data used to specify column metadata", + "type": "object" + }, + "type": { + "description": "table or view", + "type": "string" + }, + "value": { + "description": "The table or view name", + "type": "string" } }, "type": "object" @@ -4000,8 +4323,8 @@ "nullable": true, "type": "string" }, - "encrypted_extra": { - "description": "<p>JSON string containing additional connection configuration.<br>This is used to provide connection information for systems like Hive, Presto, and BigQuery, which do not conform to the username:password syntax normally used by SQLAlchemy.</p>", + "driver": { + "description": "SQLAlchemy driver to use", "nullable": true, "type": "string" }, @@ -4018,6 +4341,11 @@ "description": "If Presto, all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them.<br/>If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.", "type": "boolean" }, + "masked_encrypted_extra": { + "description": "<p>JSON string containing additional connection configuration.<br>This is used to provide connection information for systems like Hive, Presto, and BigQuery, which do not conform to the username:password syntax normally used by SQLAlchemy.</p>", + "nullable": true, + "type": "string" + }, "parameters": { "additionalProperties": {}, "description": "DB-specific parameters for configuration", @@ -4033,12 +4361,27 @@ "maxLength": 1024, "minLength": 1, "type": "string" + }, + "ssh_tunnel": { + "allOf": [ + { + "$ref": "#/components/schemas/DatabaseSSHTunnel" + } + ], + "nullable": true } }, "type": "object" }, "DatabaseValidateParametersSchema": { "properties": { + "catalog": { + "additionalProperties": { + "nullable": true + }, + "description": "Gsheets specific column for managing label to sheet urls", + "type": "object" + }, "configuration_method": { "description": "Configuration_method is used on the frontend to inform the backend whether to explode parameters or to provide only a sqlalchemy_uri." }, @@ -4049,8 +4392,8 @@ "nullable": true, "type": "string" }, - "encrypted_extra": { - "description": "<p>JSON string containing additional connection configuration.<br>This is used to provide connection information for systems like Hive, Presto, and BigQuery, which do not conform to the username:password syntax normally used by SQLAlchemy.</p>", + "driver": { + "description": "SQLAlchemy driver to use", "nullable": true, "type": "string" }, @@ -4062,10 +4405,21 @@ "description": "<p>JSON string containing extra configuration elements.<br>1. The <code>engine_params</code> object gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine\">sqlalchemy.create_engine</a> call, while the <code>metadata_params</code> gets unpacked into the <a href=\"https://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData\">sqlalchemy.MetaData</a> call.<br>2. The <code>metadata_cache_timeout</code> is a cache timeout setting in seconds for metadata fetch of this database. Specify it as <strong>\"metadata_cache_timeout\": {\"schema_cache_timeout\": 600, \"table_cache_timeout\": 600}</strong>. If unset, cache will not be enabled for the functionality. A timeout of 0 indicates that the cache never expires.<br>3. The <code>schemas_allowed_for_file_upload</code> is a comma separated list of schemas that CSVs are allowed to upload to. Specify it as <strong>\"schemas_allowed_for_file_upload\": [\"public\", \"csv_upload\"]</strong>. If database flavor does not support schema or any schema is allowed to be accessed, just leave the list empty<br>4. The <code>version</code> field is a string specifying the this db's version. This should be used with Presto DBs so that the syntax is correct<br>5. The <code>allows_virtual_table_explore</code> field is a boolean specifying whether or not the Explore button in SQL Lab results is shown.<br>6. The <code>disable_data_preview</code> field is a boolean specifying whether or not data preview queries will be run when fetching table metadata in SQL Lab.</p>", "type": "string" }, + "id": { + "description": "Database ID (for updates)", + "format": "int32", + "nullable": true, + "type": "integer" + }, "impersonate_user": { "description": "If Presto, all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them.<br/>If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.", "type": "boolean" }, + "masked_encrypted_extra": { + "description": "<p>JSON string containing additional connection configuration.<br>This is used to provide connection information for systems like Hive, Presto, and BigQuery, which do not conform to the username:password syntax normally used by SQLAlchemy.</p>", + "nullable": true, + "type": "string" + }, "parameters": { "additionalProperties": { "nullable": true @@ -4085,77 +4439,251 @@ ], "type": "object" }, - "DatasetColumnsPut": { + "Dataset": { "properties": { - "column_name": { - "maxLength": 255, - "minLength": 1, + "cache_timeout": { + "description": "Duration (in seconds) of the caching timeout for this dataset.", + "format": "int32", + "type": "integer" + }, + "column_formats": { + "description": "Column formats.", + "type": "object" + }, + "columns": { + "description": "Columns metadata.", + "items": { + "type": "object" + }, + "type": "array" + }, + "database": { + "description": "Database associated with the dataset.", + "type": "object" + }, + "datasource_name": { + "description": "Dataset name.", + "type": "string" + }, + "default_endpoint": { + "description": "Default endpoint for the dataset.", "type": "string" }, "description": { - "nullable": true, + "description": "Dataset description.", "type": "string" }, - "expression": { - "nullable": true, + "edit_url": { + "description": "The URL for editing the dataset.", "type": "string" }, "extra": { - "nullable": true, + "description": "JSON string containing extra configuration elements.", + "type": "object" + }, + "fetch_values_predicate": { + "description": "Predicate used when fetching values from the dataset.", "type": "string" }, - "filterable": { + "filter_select": { + "description": "SELECT filter applied to the dataset.", "type": "boolean" }, - "groupby": { + "filter_select_enabled": { + "description": "If the SELECT filter is enabled.", "type": "boolean" }, + "granularity_sqla": { + "description": "Name of temporal column used for time filtering for SQL datasources. This field is deprecated, use `granularity` instead.", + "items": { + "items": { + "type": "object" + }, + "type": "array" + }, + "type": "array" + }, + "health_check_message": { + "description": "Health check message.", + "type": "string" + }, "id": { + "description": "Dataset ID.", "format": "int32", "type": "integer" }, - "is_active": { + "is_sqllab_view": { + "description": "If the dataset is a SQL Lab view.", "type": "boolean" }, - "is_dttm": { - "type": "boolean" + "main_dttm_col": { + "description": "The main temporal column.", + "type": "string" }, - "python_date_format": { - "maxLength": 255, - "minLength": 1, - "nullable": true, + "metrics": { + "description": "Dataset metrics.", + "items": { + "type": "object" + }, + "type": "array" + }, + "name": { + "description": "Dataset name.", "type": "string" }, - "type": { - "nullable": true, + "offset": { + "description": "Dataset offset.", + "format": "int32", + "type": "integer" + }, + "order_by_choices": { + "description": "List of order by columns.", + "items": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "array" + }, + "owners": { + "description": "List of owners identifiers", + "items": { + "format": "int32", + "type": "integer" + }, + "type": "array" + }, + "params": { + "description": "Extra params for the dataset.", + "type": "object" + }, + "perm": { + "description": "Permission expression.", "type": "string" }, - "uuid": { - "format": "uuid", - "nullable": true, + "schema": { + "description": "Dataset schema.", "type": "string" }, - "verbose_name": { - "nullable": true, + "select_star": { + "description": "Select all clause.", "type": "string" - } - }, - "required": [ - "column_name" - ], - "type": "object" - }, - "DatasetColumnsRestApi.get": { - "properties": { - "id": { - "format": "int32", - "type": "integer" - } - }, - "type": "object" - }, - "DatasetColumnsRestApi.get_list": { - "properties": { + }, + "sql": { + "description": "A SQL statement that defines the dataset.", + "type": "string" + }, + "table_name": { + "description": "The name of the table associated with the dataset.", + "type": "string" + }, + "template_params": { + "description": "Table template params.", + "type": "object" + }, + "time_grain_sqla": { + "description": "List of temporal granularities supported by the dataset.", + "items": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "array" + }, + "type": { + "description": "Dataset type.", + "type": "string" + }, + "uid": { + "description": "Dataset unique identifier.", + "type": "string" + }, + "verbose_map": { + "description": "Mapping from raw name to verbose name.", + "type": "object" + } + }, + "type": "object" + }, + "DatasetColumnsPut": { + "properties": { + "advanced_data_type": { + "maxLength": 255, + "minLength": 1, + "nullable": true, + "type": "string" + }, + "column_name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "description": { + "nullable": true, + "type": "string" + }, + "expression": { + "nullable": true, + "type": "string" + }, + "extra": { + "nullable": true, + "type": "string" + }, + "filterable": { + "type": "boolean" + }, + "groupby": { + "type": "boolean" + }, + "id": { + "format": "int32", + "type": "integer" + }, + "is_active": { + "type": "boolean" + }, + "is_dttm": { + "type": "boolean" + }, + "python_date_format": { + "maxLength": 255, + "minLength": 1, + "nullable": true, + "type": "string" + }, + "type": { + "nullable": true, + "type": "string" + }, + "uuid": { + "format": "uuid", + "nullable": true, + "type": "string" + }, + "verbose_name": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "column_name" + ], + "type": "object" + }, + "DatasetColumnsRestApi.get": { + "properties": { + "id": { + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "DatasetColumnsRestApi.get_list": { + "properties": { "id": { "format": "int32", "type": "integer" @@ -4181,6 +4709,24 @@ }, "type": "object" }, + "DatasetDuplicateSchema": { + "properties": { + "base_model_id": { + "format": "int32", + "type": "integer" + }, + "table_name": { + "maxLength": 250, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "base_model_id", + "table_name" + ], + "type": "object" + }, "DatasetMetricRestApi.get": { "properties": { "id": { @@ -4251,12 +4797,6 @@ "nullable": true, "type": "string" }, - "advanced_data_type": { - "maxLength": 255, - "minLength": 1, - "nullable": true, - "type": "string" - }, "uuid": { "format": "uuid", "nullable": true, @@ -4362,9 +4902,31 @@ "nullable": true, "type": "integer" }, + "changed_by": { + "$ref": "#/components/schemas/DatasetRestApi.get.User" + }, + "changed_on": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "changed_on_humanized": { + "readOnly": true + }, "columns": { "$ref": "#/components/schemas/DatasetRestApi.get.TableColumn" }, + "created_by": { + "$ref": "#/components/schemas/DatasetRestApi.get.User2" + }, + "created_on": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "created_on_humanized": { + "readOnly": true + }, "database": { "$ref": "#/components/schemas/DatasetRestApi.get.Database" }, @@ -4395,6 +4957,9 @@ "format": "int32", "type": "integer" }, + "is_managed_externally": { + "type": "boolean" + }, "is_sqllab_view": { "nullable": true, "type": "boolean" @@ -4416,13 +4981,16 @@ "type": "integer" }, "owners": { - "$ref": "#/components/schemas/DatasetRestApi.get.User" + "$ref": "#/components/schemas/DatasetRestApi.get.User1" }, "schema": { "maxLength": 255, "nullable": true, "type": "string" }, + "select_star": { + "readOnly": true + }, "sql": { "nullable": true, "type": "string" @@ -4507,11 +5075,6 @@ "nullable": true, "type": "string" }, - "uuid": { - "format": "uuid", - "nullable": true, - "type": "string" - }, "verbose_name": { "maxLength": 1024, "nullable": true, @@ -4530,6 +5093,11 @@ }, "DatasetRestApi.get.TableColumn": { "properties": { + "advanced_data_type": { + "maxLength": 255, + "nullable": true, + "type": "string" + }, "changed_on": { "format": "date-time", "nullable": true, @@ -4605,6 +5173,23 @@ "type": "object" }, "DatasetRestApi.get.User": { + "properties": { + "first_name": { + "maxLength": 64, + "type": "string" + }, + "last_name": { + "maxLength": 64, + "type": "string" + } + }, + "required": [ + "first_name", + "last_name" + ], + "type": "object" + }, + "DatasetRestApi.get.User1": { "properties": { "first_name": { "maxLength": 64, @@ -4630,6 +5215,23 @@ ], "type": "object" }, + "DatasetRestApi.get.User2": { + "properties": { + "first_name": { + "maxLength": 64, + "type": "string" + }, + "last_name": { + "maxLength": 64, + "type": "string" + } + }, + "required": [ + "first_name", + "last_name" + ], + "type": "object" + }, "DatasetRestApi.get_list": { "properties": { "changed_by": { @@ -4783,6 +5385,10 @@ "minLength": 0, "type": "string" }, + "sql": { + "nullable": true, + "type": "string" + }, "table_name": { "maxLength": 250, "minLength": 1, @@ -4904,8 +5510,11 @@ "datasource_type": { "description": "The type of dataset/datasource identified on `datasource_id`.", "enum": [ - "druid", + "sl_table", "table", + "dataset", + "query", + "saved_query", "view" ], "type": "string" @@ -4945,71 +5554,229 @@ }, "type": "object" }, - "ExplorePermalinkPostSchema": { + "EmbeddedDashboardConfig": { "properties": { - "formData": { - "description": "Chart form data", - "type": "object" - }, - "urlParams": { - "description": "URL Parameters", + "allowed_domains": { "items": { - "description": "URL Parameter key-value pair", - "nullable": true + "type": "string" }, - "nullable": true, "type": "array" } }, "required": [ - "formData" + "allowed_domains" ], "type": "object" }, - "FilterSetRestApi.get": { + "EmbeddedDashboardResponseSchema": { "properties": { - "dashboard_id": { - "format": "int32", - "nullable": true, - "type": "integer" - }, - "description": { - "nullable": true, - "type": "string" + "allowed_domains": { + "items": { + "type": "string" + }, + "type": "array" }, - "id": { - "format": "int32", - "type": "integer" + "changed_by": { + "$ref": "#/components/schemas/User" }, - "name": { - "maxLength": 500, + "changed_on": { + "format": "date-time", "type": "string" }, - "owner_id": { - "format": "int32", - "type": "integer" - }, - "owner_type": { - "maxLength": 255, + "dashboard_id": { "type": "string" }, - "params": { - "readOnly": true + "uuid": { + "type": "string" } }, - "required": [ - "name", - "owner_id", - "owner_type" - ], "type": "object" }, - "FilterSetRestApi.get_list": { + "EmbeddedDashboardRestApi.get": { "properties": { - "changed_by_fk": { - "format": "int32", - "nullable": true, - "type": "integer" + "uuid": { + "format": "uuid", + "type": "string" + } + }, + "type": "object" + }, + "EmbeddedDashboardRestApi.get_list": { + "properties": { + "uuid": { + "format": "uuid", + "type": "string" + } + }, + "type": "object" + }, + "EmbeddedDashboardRestApi.post": { + "properties": { + "uuid": { + "format": "uuid", + "type": "string" + } + }, + "type": "object" + }, + "EmbeddedDashboardRestApi.put": { + "properties": { + "uuid": { + "format": "uuid", + "type": "string" + } + }, + "type": "object" + }, + "ExecutePayloadSchema": { + "properties": { + "client_id": { + "nullable": true, + "type": "string" + }, + "ctas_method": { + "nullable": true, + "type": "string" + }, + "database_id": { + "format": "int32", + "type": "integer" + }, + "expand_data": { + "nullable": true, + "type": "boolean" + }, + "json": { + "nullable": true, + "type": "boolean" + }, + "queryLimit": { + "format": "int32", + "nullable": true, + "type": "integer" + }, + "runAsync": { + "nullable": true, + "type": "boolean" + }, + "schema": { + "nullable": true, + "type": "string" + }, + "select_as_cta": { + "nullable": true, + "type": "boolean" + }, + "sql": { + "type": "string" + }, + "sql_editor_id": { + "nullable": true, + "type": "string" + }, + "tab": { + "nullable": true, + "type": "string" + }, + "templateParams": { + "nullable": true, + "type": "string" + }, + "tmp_table_name": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "database_id", + "sql" + ], + "type": "object" + }, + "ExploreContextSchema": { + "properties": { + "dataset": { + "$ref": "#/components/schemas/Dataset" + }, + "form_data": { + "description": "Form data from the Explore controls used to form the chart's data query.", + "type": "object" + }, + "message": { + "description": "Any message related to the processed request.", + "type": "string" + }, + "slice": { + "$ref": "#/components/schemas/Slice" + } + }, + "type": "object" + }, + "ExplorePermalinkPostSchema": { + "properties": { + "formData": { + "description": "Chart form data", + "type": "object" + }, + "urlParams": { + "description": "URL Parameters", + "items": { + "description": "URL Parameter key-value pair", + "nullable": true + }, + "nullable": true, + "type": "array" + } + }, + "required": [ + "formData" + ], + "type": "object" + }, + "FilterSetRestApi.get": { + "properties": { + "dashboard_id": { + "format": "int32", + "nullable": true, + "type": "integer" + }, + "description": { + "nullable": true, + "type": "string" + }, + "id": { + "format": "int32", + "type": "integer" + }, + "name": { + "maxLength": 500, + "type": "string" + }, + "owner_id": { + "format": "int32", + "type": "integer" + }, + "owner_type": { + "maxLength": 255, + "type": "string" + }, + "params": { + "readOnly": true + } + }, + "required": [ + "name", + "owner_id", + "owner_type" + ], + "type": "object" + }, + "FilterSetRestApi.get_list": { + "properties": { + "changed_by_fk": { + "format": "int32", + "nullable": true, + "type": "integer" }, "changed_on": { "format": "date-time", @@ -5128,18 +5895,31 @@ "format": "int32", "type": "integer" }, - "dataset_id": { - "description": "The dataset ID", + "datasource_id": { + "description": "The datasource ID", "format": "int32", "type": "integer" }, + "datasource_type": { + "description": "The datasource type", + "enum": [ + "sl_table", + "table", + "dataset", + "query", + "saved_query", + "view" + ], + "type": "string" + }, "form_data": { "description": "Any type of JSON supported text.", "type": "string" } }, "required": [ - "dataset_id", + "datasource_id", + "datasource_type", "form_data" ], "type": "object" @@ -5151,18 +5931,31 @@ "format": "int32", "type": "integer" }, - "dataset_id": { - "description": "The dataset ID", + "datasource_id": { + "description": "The datasource ID", "format": "int32", "type": "integer" }, + "datasource_type": { + "description": "The datasource type", + "enum": [ + "sl_table", + "table", + "dataset", + "query", + "saved_query", + "view" + ], + "type": "string" + }, "form_data": { "description": "Any type of JSON supported text.", "type": "string" } }, "required": [ - "dataset_id", + "datasource_id", + "datasource_type", "form_data" ], "type": "object" @@ -5352,6 +6145,45 @@ }, "type": "object" }, + "QueryExecutionResponseSchema": { + "properties": { + "columns": { + "items": { + "type": "object" + }, + "type": "array" + }, + "data": { + "items": { + "type": "object" + }, + "type": "array" + }, + "expanded_columns": { + "items": { + "type": "object" + }, + "type": "array" + }, + "query": { + "$ref": "#/components/schemas/QueryResult" + }, + "query_id": { + "format": "int32", + "type": "integer" + }, + "selected_columns": { + "items": { + "type": "object" + }, + "type": "array" + }, + "status": { + "type": "string" + } + }, + "type": "object" + }, "QueryRestApi.get": { "properties": { "changed_on": { @@ -5461,8 +6293,7 @@ "type": "string" }, "tracking_url": { - "nullable": true, - "type": "string" + "readOnly": true } }, "required": [ @@ -5484,18 +6315,16 @@ "properties": { "changed_on": { "format": "date-time", - "nullable": true, "type": "string" }, "database": { - "$ref": "#/components/schemas/QueryRestApi.get_list.Database" + "$ref": "#/components/schemas/Database1" }, "end_time": { - "nullable": true, + "format": "float", "type": "number" }, "executed_sql": { - "nullable": true, "type": "string" }, "id": { @@ -5504,105 +6333,228 @@ }, "rows": { "format": "int32", - "nullable": true, "type": "integer" }, "schema": { - "maxLength": 256, - "nullable": true, "type": "string" }, "sql": { - "nullable": true, "type": "string" }, "sql_tables": { "readOnly": true }, "start_time": { - "nullable": true, + "format": "float", "type": "number" }, "status": { - "maxLength": 16, - "nullable": true, "type": "string" }, "tab_name": { - "maxLength": 256, - "nullable": true, "type": "string" }, "tmp_table_name": { - "maxLength": 256, - "nullable": true, "type": "string" }, "tracking_url": { - "nullable": true, "type": "string" }, "user": { - "$ref": "#/components/schemas/QueryRestApi.get_list.User" + "$ref": "#/components/schemas/User" } }, - "required": [ - "database" - ], "type": "object" }, - "QueryRestApi.get_list.Database": { + "QueryRestApi.post": { "properties": { - "database_name": { - "maxLength": 250, - "type": "string" + "id": { + "format": "int32", + "type": "integer" } }, - "required": [ - "database_name" - ], "type": "object" }, - "QueryRestApi.get_list.User": { + "QueryRestApi.put": { "properties": { - "first_name": { - "maxLength": 64, + "id": { + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "QueryResult": { + "properties": { + "changedOn": { + "format": "date-time", + "type": "string" + }, + "changed_on": { + "type": "string" + }, + "ctas": { + "type": "boolean" + }, + "db": { + "type": "string" + }, + "dbId": { + "format": "int32", + "type": "integer" + }, + "endDttm": { + "format": "float", + "type": "number" + }, + "errorMessage": { + "nullable": true, + "type": "string" + }, + "executedSql": { "type": "string" }, + "extra": { + "type": "object" + }, "id": { + "type": "string" + }, + "limit": { "format": "int32", "type": "integer" }, - "last_name": { - "maxLength": 64, + "limitingFactor": { "type": "string" }, - "username": { - "maxLength": 64, + "progress": { + "format": "int32", + "type": "integer" + }, + "queryId": { + "format": "int32", + "type": "integer" + }, + "resultsKey": { + "type": "string" + }, + "rows": { + "format": "int32", + "type": "integer" + }, + "schema": { + "type": "string" + }, + "serverId": { + "format": "int32", + "type": "integer" + }, + "sql": { + "type": "string" + }, + "sqlEditorId": { + "type": "string" + }, + "startDttm": { + "format": "float", + "type": "number" + }, + "state": { + "type": "string" + }, + "tab": { + "type": "string" + }, + "tempSchema": { + "nullable": true, + "type": "string" + }, + "tempTable": { + "nullable": true, + "type": "string" + }, + "trackingUrl": { + "nullable": true, + "type": "string" + }, + "user": { "type": "string" + }, + "userId": { + "format": "int32", + "type": "integer" } }, - "required": [ - "first_name", - "last_name", - "username" - ], "type": "object" }, - "QueryRestApi.post": { + "RecentActivity": { "properties": { - "id": { - "format": "int32", - "type": "integer" + "action": { + "description": "Action taken describing type of activity", + "type": "string" + }, + "item_title": { + "description": "Title of item", + "type": "string" + }, + "item_type": { + "description": "Type of item, e.g. slice or dashboard", + "type": "string" + }, + "item_url": { + "description": "URL to item", + "type": "string" + }, + "time": { + "description": "Time of activity, in epoch milliseconds", + "format": "float", + "type": "number" + }, + "time_delta_humanized": { + "description": "Human-readable description of how long ago activity took place", + "type": "string" } }, "type": "object" }, - "QueryRestApi.put": { + "RecentActivityResponseSchema": { "properties": { - "id": { - "format": "int32", - "type": "integer" + "result": { + "description": "A list of recent activity objects", + "items": { + "$ref": "#/components/schemas/RecentActivity" + }, + "type": "array" + } + }, + "type": "object" + }, + "RecentActivitySchema": { + "properties": { + "action": { + "description": "Action taken describing type of activity", + "type": "string" + }, + "item_title": { + "description": "Title of item", + "type": "string" + }, + "item_type": { + "description": "Type of item, e.g. slice or dashboard", + "type": "string" + }, + "item_url": { + "description": "URL to item", + "type": "string" + }, + "time": { + "description": "Time of activity, in epoch milliseconds", + "format": "float", + "type": "number" + }, + "time_delta_humanized": { + "description": "Human-readable description of how long ago activity took place", + "type": "string" } }, "type": "object" @@ -5625,6 +6577,10 @@ }, "RelatedResultResponse": { "properties": { + "extra": { + "description": "The extra metadata for related item", + "type": "object" + }, "text": { "description": "The related item string representation", "type": "string" @@ -5812,6 +6768,9 @@ "nullable": true, "type": "string" }, + "extra": { + "readOnly": true + }, "force_screenshot": { "nullable": true, "type": "boolean" @@ -6006,8 +6965,13 @@ "changed_on_delta_humanized": { "readOnly": true }, + "chart_id": { + "format": "int32", + "nullable": true, + "type": "integer" + }, "created_by": { - "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User1" + "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User2" }, "created_on": { "format": "date-time", @@ -6026,10 +6990,18 @@ "crontab_humanized": { "readOnly": true }, + "dashboard_id": { + "format": "int32", + "nullable": true, + "type": "integer" + }, "description": { "nullable": true, "type": "string" }, + "extra": { + "readOnly": true + }, "id": { "format": "int32", "type": "integer" @@ -6049,7 +7021,7 @@ "type": "string" }, "owners": { - "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User2" + "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.User1" }, "recipients": { "$ref": "#/components/schemas/ReportScheduleRestApi.get_list.ReportRecipients" @@ -6110,6 +7082,10 @@ "maxLength": 64, "type": "string" }, + "id": { + "format": "int32", + "type": "integer" + }, "last_name": { "maxLength": 64, "type": "string" @@ -6127,10 +7103,6 @@ "maxLength": 64, "type": "string" }, - "id": { - "format": "int32", - "type": "integer" - }, "last_name": { "maxLength": 64, "type": "string" @@ -6790,6 +7762,7 @@ "Pacific/Guam", "Pacific/Honolulu", "Pacific/Johnston", + "Pacific/Kanton", "Pacific/Kiritimati", "Pacific/Kosrae", "Pacific/Kwajalein", @@ -6917,6 +7890,9 @@ "nullable": true, "type": "string" }, + "extra": { + "type": "object" + }, "force_screenshot": { "type": "boolean" }, @@ -7514,6 +8490,7 @@ "Pacific/Guam", "Pacific/Honolulu", "Pacific/Johnston", + "Pacific/Kanton", "Pacific/Kiritimati", "Pacific/Kosrae", "Pacific/Kwajalein", @@ -7640,6 +8617,9 @@ }, "SavedQueryRestApi.get": { "properties": { + "changed_on_delta_humanized": { + "readOnly": true + }, "created_by": { "$ref": "#/components/schemas/SavedQueryRestApi.get.User" }, @@ -7670,6 +8650,10 @@ }, "sql_tables": { "readOnly": true + }, + "template_parameters": { + "nullable": true, + "type": "string" } }, "type": "object" @@ -7832,6 +8816,10 @@ "sql": { "nullable": true, "type": "string" + }, + "template_parameters": { + "nullable": true, + "type": "string" } }, "type": "object" @@ -7860,6 +8848,10 @@ "sql": { "nullable": true, "type": "string" + }, + "template_parameters": { + "nullable": true, + "type": "string" } }, "type": "object" @@ -7885,6 +8877,107 @@ }, "type": "object" }, + "Slice": { + "properties": { + "cache_timeout": { + "description": "Duration (in seconds) of the caching timeout for this chart.", + "format": "int32", + "type": "integer" + }, + "certification_details": { + "description": "Details of the certification.", + "type": "string" + }, + "certified_by": { + "description": "Person or group that has certified this dashboard.", + "type": "string" + }, + "changed_on": { + "description": "Timestamp of the last modification.", + "type": "string" + }, + "changed_on_humanized": { + "description": "Timestamp of the last modification in human readable form.", + "type": "string" + }, + "datasource": { + "description": "Datasource identifier.", + "type": "string" + }, + "description": { + "description": "Slice description.", + "type": "string" + }, + "description_markeddown": { + "description": "Sanitized HTML version of the chart description.", + "type": "string" + }, + "edit_url": { + "description": "The URL for editing the slice.", + "type": "string" + }, + "form_data": { + "description": "Form data associated with the slice.", + "type": "object" + }, + "is_managed_externally": { + "description": "If the chart is managed outside externally.", + "type": "boolean" + }, + "modified": { + "description": "Last modification in human readable form.", + "type": "string" + }, + "owners": { + "description": "Owners identifiers.", + "items": { + "format": "int32", + "type": "integer" + }, + "type": "array" + }, + "query_context": { + "description": "The context associated with the query.", + "type": "object" + }, + "slice_id": { + "description": "The slice ID.", + "format": "int32", + "type": "integer" + }, + "slice_name": { + "description": "The slice name.", + "type": "string" + }, + "slice_url": { + "description": "The slice URL.", + "type": "string" + } + }, + "type": "object" + }, + "StopQuerySchema": { + "properties": { + "client_id": { + "type": "string" + } + }, + "type": "object" + }, + "TableExtraMetadataResponseSchema": { + "properties": { + "clustering": { + "type": "object" + }, + "metadata": { + "type": "object" + }, + "partitions": { + "type": "object" + } + }, + "type": "object" + }, "TableMetadataColumnsResponse": { "properties": { "duplicates_constraint": { @@ -8110,6 +9203,46 @@ }, "type": "object" }, + "ValidateSQLRequest": { + "properties": { + "schema": { + "nullable": true, + "type": "string" + }, + "sql": { + "description": "SQL statement to validate", + "type": "string" + }, + "template_params": { + "nullable": true, + "type": "object" + } + }, + "required": [ + "sql" + ], + "type": "object" + }, + "ValidateSQLResponse": { + "properties": { + "end_column": { + "format": "int32", + "type": "integer" + }, + "line_number": { + "format": "int32", + "type": "integer" + }, + "message": { + "type": "string" + }, + "start_column": { + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, "ValidatorConfigJSON": { "properties": { "op": { @@ -8131,6 +9264,26 @@ }, "type": "object" }, + "advanced_data_type_convert_schema": { + "properties": { + "type": { + "default": "port", + "type": "string" + }, + "values": { + "items": { + "default": "http" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "type", + "values" + ], + "type": "object" + }, "database_schemas_query_schema": { "properties": { "force": { @@ -8139,6 +9292,20 @@ }, "type": "object" }, + "database_tables_query_schema": { + "properties": { + "force": { + "type": "boolean" + }, + "schema_name": { + "type": "string" + } + }, + "required": [ + "schema_name" + ], + "type": "object" + }, "get_delete_ids_schema": { "items": { "type": "integer" @@ -8305,6 +9472,26 @@ }, "type": "object" }, + "get_recent_activity_schema": { + "properties": { + "actions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "distinct": { + "type": "boolean" + }, + "page": { + "type": "number" + }, + "page_size": { + "type": "number" + } + }, + "type": "object" + }, "get_related_schema": { "properties": { "filter": { @@ -8325,6 +9512,17 @@ }, "type": "object" }, + "queries_get_updated_since_schema": { + "properties": { + "last_updated_ms": { + "type": "number" + } + }, + "required": [ + "last_updated_ms" + ], + "type": "object" + }, "screenshot_query_schema": { "properties": { "force": { @@ -8345,6 +9543,17 @@ }, "type": "object" }, + "sql_lab_get_results_schema": { + "properties": { + "key": { + "type": "string" + } + }, + "required": [ + "key" + ], + "type": "object" + }, "thumbnail_query_schema": { "properties": { "force": { @@ -8374,6 +9583,98 @@ }, "openapi": "3.0.2", "paths": { + "/api/v1/advanced_data_type/convert": { + "get": { + "parameters": [ + { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/advanced_data_type_convert_schema" + } + } + }, + "in": "query", + "name": "q" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdvancedDataTypeSchema" + } + } + }, + "description": "AdvancedDataTypeResponse object has been returned." + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "summary": "Returns a AdvancedDataTypeResponse object populated with the passed in args.", + "tags": [ + "Advanced Data Type" + ] + } + }, + "/api/v1/advanced_data_type/types": { + "get": { + "description": "Returns a list of available advanced data types.", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "result": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + } + }, + "description": "a successful return of the available advanced data types has taken place." + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Advanced Data Type" + ] + } + }, "/api/v1/annotation_layer/": { "delete": { "description": "Deletes multiple annotation layers in a bulk operation.", @@ -9380,9 +10681,6 @@ }, "description": "ZIP file" }, - "400": { - "$ref": "#/components/responses/400" - }, "401": { "$ref": "#/components/responses/401" }, @@ -9440,7 +10738,7 @@ } } }, - "description": "Dashboard import result" + "description": "Assets import result" }, "400": { "$ref": "#/components/responses/400" @@ -9540,6 +10838,42 @@ ] } }, + "/api/v1/available_domains/": { + "get": { + "description": "Get all available domains", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "result": { + "$ref": "#/components/schemas/AvailableDomainsSchema" + } + }, + "type": "object" + } + } + }, + "description": "a list of available domains" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "403": { + "$ref": "#/components/responses/403" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Available Domains" + ] + } + }, "/api/v1/cachekey/invalidate": { "post": { "description": "Takes a list of datasources, finds the associated cache records and invalidates them and removes the database records", @@ -10460,7 +11794,7 @@ } ], "responses": { - "200": { + "202": { "content": { "application/json": { "schema": { @@ -10470,9 +11804,6 @@ }, "description": "Chart async result" }, - "302": { - "description": "Redirects to the current digest" - }, "400": { "$ref": "#/components/responses/400" }, @@ -10524,6 +11855,14 @@ "schema": { "type": "string" } + }, + { + "description": "Should the queries be forced to load from the source", + "in": "query", + "name": "force", + "schema": { + "type": "boolean" + } } ], "responses": { @@ -10600,9 +11939,6 @@ }, "description": "Chart thumbnail image" }, - "302": { - "description": "Redirects to the current digest" - }, "400": { "$ref": "#/components/responses/400" }, @@ -11453,9 +12789,6 @@ }, "description": "Dashboard added" }, - "302": { - "description": "Redirects to the current digest" - }, "400": { "$ref": "#/components/responses/400" }, @@ -12163,9 +13496,6 @@ }, "description": "Dashboard" }, - "302": { - "description": "Redirects to the current digest" - }, "400": { "$ref": "#/components/responses/400" }, @@ -12221,9 +13551,6 @@ }, "description": "Dashboard chart definitions" }, - "302": { - "description": "Redirects to the current digest" - }, "400": { "$ref": "#/components/responses/400" }, @@ -12280,9 +13607,6 @@ }, "description": "Dashboard dataset definitions" }, - "302": { - "description": "Redirects to the current digest" - }, "400": { "$ref": "#/components/responses/400" }, @@ -12306,16 +13630,17 @@ ] } }, - "/api/v1/dashboard/{pk}": { + "/api/v1/dashboard/{id_or_slug}/embedded": { "delete": { - "description": "Deletes a Dashboard.", + "description": "Removes a dashboard's embedded configuration.", "parameters": [ { + "description": "The dashboard id or slug", "in": "path", - "name": "pk", + "name": "id_or_slug", "required": true, "schema": { - "type": "integer" + "type": "string" } } ], @@ -12333,20 +13658,11 @@ } } }, - "description": "Dashboard deleted" + "description": "Successfully removed the configuration" }, "401": { "$ref": "#/components/responses/401" }, - "403": { - "$ref": "#/components/responses/403" - }, - "404": { - "$ref": "#/components/responses/404" - }, - "422": { - "$ref": "#/components/responses/422" - }, "500": { "$ref": "#/components/responses/500" } @@ -12360,19 +13676,231 @@ "Dashboards" ] }, - "put": { - "description": "Changes a Dashboard.", + "get": { + "description": "Returns the dashboard's embedded configuration", "parameters": [ { + "description": "The dashboard id or slug", "in": "path", - "name": "pk", + "name": "id_or_slug", "required": true, "schema": { - "type": "integer" + "type": "string" } } ], - "requestBody": { + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "result": { + "$ref": "#/components/schemas/EmbeddedDashboardResponseSchema" + } + }, + "type": "object" + } + } + }, + "description": "Result contains the embedded dashboard config" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Dashboards" + ] + }, + "post": { + "description": "Sets a dashboard's embedded configuration.", + "parameters": [ + { + "description": "The dashboard id or slug", + "in": "path", + "name": "id_or_slug", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmbeddedDashboardConfig" + } + } + }, + "description": "The embedded configuration to set", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "result": { + "$ref": "#/components/schemas/EmbeddedDashboardResponseSchema" + } + }, + "type": "object" + } + } + }, + "description": "Successfully set the configuration" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Dashboards" + ] + }, + "put": { + "description": "Sets a dashboard's embedded configuration.", + "parameters": [ + { + "description": "The dashboard id or slug", + "in": "path", + "name": "id_or_slug", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmbeddedDashboardConfig" + } + } + }, + "description": "The embedded configuration to set", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "result": { + "$ref": "#/components/schemas/EmbeddedDashboardResponseSchema" + } + }, + "type": "object" + } + } + }, + "description": "Successfully set the configuration" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Dashboards" + ] + } + }, + "/api/v1/dashboard/{pk}": { + "delete": { + "description": "Deletes a Dashboard.", + "parameters": [ + { + "in": "path", + "name": "pk", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" + } + } + }, + "description": "Dashboard deleted" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "403": { + "$ref": "#/components/responses/403" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "422": { + "$ref": "#/components/responses/422" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Dashboards" + ] + }, + "put": { + "description": "Changes a Dashboard.", + "parameters": [ + { + "in": "path", + "name": "pk", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { "content": { "application/json": { "schema": { @@ -12837,6 +14365,9 @@ }, "description": "Thumbnail does not exist on cache, fired async to compute" }, + "302": { + "description": "Redirects to the current digest" + }, "401": { "$ref": "#/components/responses/401" }, @@ -13000,9 +14531,6 @@ }, "description": "Database added" }, - "302": { - "description": "Redirects to the current digest" - }, "400": { "$ref": "#/components/responses/400" }, @@ -13137,6 +14665,20 @@ "description": "Name of the SQLAlchemy engine", "type": "string" }, + "engine_information": { + "description": "Dict with public properties form the DB Engine", + "properties": { + "disable_ssh_tunneling": { + "description": "Whether the engine supports SSH Tunnels", + "type": "boolean" + }, + "supports_file_upload": { + "description": "Whether the engine supports file uploads", + "type": "boolean" + } + }, + "type": "object" + }, "name": { "description": "Name of the database", "type": "string" @@ -13293,7 +14835,7 @@ ] } }, - "/api/v1/database/test_connection": { + "/api/v1/database/test_connection/": { "post": { "description": "Tests a database connection", "requestBody": { @@ -13343,7 +14885,7 @@ ] } }, - "/api/v1/database/validate_parameters": { + "/api/v1/database/validate_parameters/": { "post": { "description": "Validates parameters used to connect to a database", "requestBody": { @@ -13448,99 +14990,45 @@ ] }, "get": { - "description": "Get an item model", + "description": "Get a database", "parameters": [ { + "description": "The database id", "in": "path", "name": "pk", "required": true, "schema": { "type": "integer" } - }, - { + } + ], + "responses": { + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/get_item_schema" + "type": "object" } } }, - "in": "query", - "name": "q" - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "properties": { - "description_columns": { - "properties": { - "column_name": { - "description": "The description for the column name. Will be translated by babel", - "example": "A Nice description for the column", - "type": "string" - } - }, - "type": "object" - }, - "id": { - "description": "The item id", - "type": "string" - }, - "label_columns": { - "properties": { - "column_name": { - "description": "The label for the column name. Will be translated by babel", - "example": "A Nice label for the column", - "type": "string" - } - }, - "type": "object" - }, - "result": { - "$ref": "#/components/schemas/DatabaseRestApi.get" - }, - "show_columns": { - "description": "A list of columns", - "items": { - "type": "string" - }, - "type": "array" - }, - "show_title": { - "description": "A title to render. Will be translated by babel", - "example": "Show Item Details", - "type": "string" - } - }, - "type": "object" - } - } - }, - "description": "Item from Model" - }, - "400": { - "$ref": "#/components/responses/400" - }, - "401": { - "$ref": "#/components/responses/401" - }, - "404": { - "$ref": "#/components/responses/404" - }, - "422": { - "$ref": "#/components/responses/422" - }, - "500": { - "$ref": "#/components/responses/500" - } - }, - "security": [ - { - "jwt": [] + "description": "Database" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "422": { + "$ref": "#/components/responses/422" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] } ], "tags": [ @@ -13903,6 +15391,61 @@ ] } }, + "/api/v1/database/{pk}/ssh_tunnel/": { + "delete": { + "description": "Deletes a SSH Tunnel.", + "parameters": [ + { + "in": "path", + "name": "pk", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" + } + } + }, + "description": "SSH Tunnel deleted" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "403": { + "$ref": "#/components/responses/403" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "422": { + "$ref": "#/components/responses/422" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Database" + ] + } + }, "/api/v1/database/{pk}/table/{table_name}/{schema_name}/": { "get": { "description": "Get database table metadata", @@ -13972,20 +15515,36 @@ ] } }, - "/api/v1/dataset/": { - "delete": { - "description": "Deletes multiple Datasets in a bulk operation.", + "/api/v1/database/{pk}/table_extra/{table_name}/{schema_name}/": { + "get": { + "description": "Response depends on each DB engine spec normally focused on partitions", "parameters": [ { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/get_delete_ids_schema" - } - } - }, - "in": "query", - "name": "q" + "description": "The database id", + "in": "path", + "name": "pk", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Table name", + "in": "path", + "name": "table_name", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Table schema", + "in": "path", + "name": "schema_name", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -13993,16 +15552,11 @@ "content": { "application/json": { "schema": { - "properties": { - "message": { - "type": "string" - } - }, - "type": "object" + "$ref": "#/components/schemas/TableExtraMetadataResponseSchema" } } }, - "description": "Dataset bulk delete" + "description": "Table extra metadata information" }, "400": { "$ref": "#/components/responses/400" @@ -14010,9 +15564,6 @@ "401": { "$ref": "#/components/responses/401" }, - "403": { - "$ref": "#/components/responses/403" - }, "404": { "$ref": "#/components/responses/404" }, @@ -14028,18 +15579,29 @@ "jwt": [] } ], + "summary": "Get table extra metadata", "tags": [ - "Datasets" + "Database" ] - }, + } + }, + "/api/v1/database/{pk}/tables/": { "get": { - "description": "Get a list of models", "parameters": [ + { + "description": "The database id", + "in": "path", + "name": "pk", + "required": true, + "schema": { + "type": "integer" + } + }, { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/get_list_schema" + "$ref": "#/components/schemas/database_tables_query_schema" } } }, @@ -14054,59 +15616,12 @@ "schema": { "properties": { "count": { - "description": "The total record count on the backend", - "type": "number" - }, - "description_columns": { - "properties": { - "column_name": { - "description": "The description for the column name. Will be translated by babel", - "example": "A Nice description for the column", - "type": "string" - } - }, - "type": "object" - }, - "ids": { - "description": "A list of item ids, useful when you don't know the column id", - "items": { - "type": "string" - }, - "type": "array" - }, - "label_columns": { - "properties": { - "column_name": { - "description": "The label for the column name. Will be translated by babel", - "example": "A Nice label for the column", - "type": "string" - } - }, - "type": "object" - }, - "list_columns": { - "description": "A list of columns", - "items": { - "type": "string" - }, - "type": "array" - }, - "list_title": { - "description": "A title to render. Will be translated by babel", - "example": "List Items", - "type": "string" - }, - "order_columns": { - "description": "A list of allowed columns to sort", - "items": { - "type": "string" - }, - "type": "array" + "type": "integer" }, "result": { - "description": "The result from the get list query", + "description": "A List of tables for given database", "items": { - "$ref": "#/components/schemas/DatasetRestApi.get_list" + "$ref": "#/components/schemas/DatabaseTablesResponse" }, "type": "array" } @@ -14115,7 +15630,7 @@ } } }, - "description": "Items from Model" + "description": "Tables list" }, "400": { "$ref": "#/components/responses/400" @@ -14123,6 +15638,9 @@ "401": { "$ref": "#/components/responses/401" }, + "404": { + "$ref": "#/components/responses/404" + }, "422": { "$ref": "#/components/responses/422" }, @@ -14135,41 +15653,55 @@ "jwt": [] } ], + "summary": "Get a list of tables for given database", "tags": [ - "Datasets" + "Database" ] - }, + } + }, + "/api/v1/database/{pk}/validate_sql/": { "post": { - "description": "Create a new Dataset", + "description": "Validates arbitrary SQL.", + "parameters": [ + { + "in": "path", + "name": "pk", + "required": true, + "schema": { + "type": "integer" + } + } + ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DatasetRestApi.post" + "$ref": "#/components/schemas/ValidateSQLRequest" } } }, - "description": "Dataset schema", + "description": "Validate SQL request", "required": true }, "responses": { - "201": { + "200": { "content": { "application/json": { "schema": { "properties": { - "id": { - "type": "number" - }, "result": { - "$ref": "#/components/schemas/DatasetRestApi.post" + "description": "A List of SQL errors found on the statement", + "items": { + "$ref": "#/components/schemas/ValidateSQLResponse" + }, + "type": "array" } }, "type": "object" } } }, - "description": "Dataset added" + "description": "Validation result" }, "400": { "$ref": "#/components/responses/400" @@ -14177,9 +15709,232 @@ "401": { "$ref": "#/components/responses/401" }, - "422": { - "$ref": "#/components/responses/422" - }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "summary": "Validates that arbitrary sql is acceptable for the given database", + "tags": [ + "Database" + ] + } + }, + "/api/v1/dataset/": { + "delete": { + "description": "Deletes multiple Datasets in a bulk operation.", + "parameters": [ + { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/get_delete_ids_schema" + } + } + }, + "in": "query", + "name": "q" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" + } + } + }, + "description": "Dataset bulk delete" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "403": { + "$ref": "#/components/responses/403" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "422": { + "$ref": "#/components/responses/422" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Datasets" + ] + }, + "get": { + "description": "Get a list of models", + "parameters": [ + { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/get_list_schema" + } + } + }, + "in": "query", + "name": "q" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "count": { + "description": "The total record count on the backend", + "type": "number" + }, + "description_columns": { + "properties": { + "column_name": { + "description": "The description for the column name. Will be translated by babel", + "example": "A Nice description for the column", + "type": "string" + } + }, + "type": "object" + }, + "ids": { + "description": "A list of item ids, useful when you don't know the column id", + "items": { + "type": "string" + }, + "type": "array" + }, + "label_columns": { + "properties": { + "column_name": { + "description": "The label for the column name. Will be translated by babel", + "example": "A Nice label for the column", + "type": "string" + } + }, + "type": "object" + }, + "list_columns": { + "description": "A list of columns", + "items": { + "type": "string" + }, + "type": "array" + }, + "list_title": { + "description": "A title to render. Will be translated by babel", + "example": "List Items", + "type": "string" + }, + "order_columns": { + "description": "A list of allowed columns to sort", + "items": { + "type": "string" + }, + "type": "array" + }, + "result": { + "description": "The result from the get list query", + "items": { + "$ref": "#/components/schemas/DatasetRestApi.get_list" + }, + "type": "array" + } + }, + "type": "object" + } + } + }, + "description": "Items from Model" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "422": { + "$ref": "#/components/responses/422" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Datasets" + ] + }, + "post": { + "description": "Create a new Dataset", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatasetRestApi.post" + } + } + }, + "description": "Dataset schema", + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "number" + }, + "result": { + "$ref": "#/components/schemas/DatasetRestApi.post" + } + }, + "type": "object" + } + } + }, + "description": "Dataset added" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "422": { + "$ref": "#/components/responses/422" + }, "500": { "$ref": "#/components/responses/500" } @@ -14337,6 +16092,68 @@ ] } }, + "/api/v1/dataset/duplicate": { + "post": { + "description": "Duplicates a Dataset", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatasetDuplicateSchema" + } + } + }, + "description": "Dataset schema", + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "number" + }, + "result": { + "$ref": "#/components/schemas/DatasetDuplicateSchema" + } + }, + "type": "object" + } + } + }, + "description": "Dataset duplicated" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "403": { + "$ref": "#/components/responses/403" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "422": { + "$ref": "#/components/responses/422" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Datasets" + ] + } + }, "/api/v1/dataset/export/": { "get": { "description": "Exports multiple datasets and downloads them as YAML files", @@ -14406,6 +16223,14 @@ "passwords": { "description": "JSON map of passwords for each featured database in the ZIP file. If the ZIP includes a database config in the path `databases/MyDatabase.yaml`, the password should be provided in the following format: `{\"databases/MyDatabase.yaml\": \"my_password\"}`.", "type": "string" + }, + "sync_columns": { + "description": "sync columns?", + "type": "boolean" + }, + "sync_metrics": { + "description": "sync metrics?", + "type": "boolean" } }, "type": "object" @@ -14637,14 +16462,221 @@ } } }, - "description": "Item from Model" - }, - "400": { - "$ref": "#/components/responses/400" + "description": "Item from Model" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "422": { + "$ref": "#/components/responses/422" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Datasets" + ] + }, + "put": { + "description": "Changes a Dataset", + "parameters": [ + { + "in": "path", + "name": "pk", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "override_columns", + "schema": { + "type": "boolean" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatasetRestApi.put" + } + } + }, + "description": "Dataset schema", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "number" + }, + "result": { + "$ref": "#/components/schemas/DatasetRestApi.put" + } + }, + "type": "object" + } + } + }, + "description": "Dataset changed" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "403": { + "$ref": "#/components/responses/403" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "422": { + "$ref": "#/components/responses/422" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Datasets" + ] + } + }, + "/api/v1/dataset/{pk}/column/{column_id}": { + "delete": { + "description": "Delete a Dataset column", + "parameters": [ + { + "description": "The dataset pk for this column", + "in": "path", + "name": "pk", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "The column id for this dataset", + "in": "path", + "name": "column_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" + } + } + }, + "description": "Column deleted" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "403": { + "$ref": "#/components/responses/403" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "422": { + "$ref": "#/components/responses/422" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "Datasets" + ] + } + }, + "/api/v1/dataset/{pk}/metric/{metric_id}": { + "delete": { + "description": "Delete a Dataset metric", + "parameters": [ + { + "description": "The dataset pk for this column", + "in": "path", + "name": "pk", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "The metric id for this dataset", + "in": "path", + "name": "metric_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" + } + } + }, + "description": "Metric deleted" }, "401": { "$ref": "#/components/responses/401" }, + "403": { + "$ref": "#/components/responses/403" + }, "404": { "$ref": "#/components/responses/404" }, @@ -14663,9 +16695,11 @@ "tags": [ "Datasets" ] - }, + } + }, + "/api/v1/dataset/{pk}/refresh": { "put": { - "description": "Changes a Dataset", + "description": "Refreshes and updates columns of a dataset", "parameters": [ { "in": "path", @@ -14674,47 +16708,23 @@ "schema": { "type": "integer" } - }, - { - "in": "query", - "name": "override_columns", - "schema": { - "type": "boolean" - } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DatasetRestApi.put" - } - } - }, - "description": "Dataset schema", - "required": true - }, "responses": { "200": { "content": { "application/json": { "schema": { "properties": { - "id": { - "type": "number" - }, - "result": { - "$ref": "#/components/schemas/DatasetRestApi.put" + "message": { + "type": "string" } }, "type": "object" } } }, - "description": "Dataset changed" - }, - "400": { - "$ref": "#/components/responses/400" + "description": "Dataset delete" }, "401": { "$ref": "#/components/responses/401" @@ -14742,27 +16752,17 @@ ] } }, - "/api/v1/dataset/{pk}/column/{column_id}": { - "delete": { - "description": "Delete a Dataset column", + "/api/v1/dataset/{pk}/related_objects": { + "get": { + "description": "Get charts and dashboards count associated to a dataset", "parameters": [ { - "description": "The dataset pk for this column", "in": "path", "name": "pk", "required": true, "schema": { "type": "integer" } - }, - { - "description": "The column id for this dataset", - "in": "path", - "name": "column_id", - "required": true, - "schema": { - "type": "integer" - } } ], "responses": { @@ -14770,29 +16770,18 @@ "content": { "application/json": { "schema": { - "properties": { - "message": { - "type": "string" - } - }, - "type": "object" + "$ref": "#/components/schemas/DatasetRelatedObjectsResponse" } } }, - "description": "Column deleted" + "description": "Query result" }, "401": { "$ref": "#/components/responses/401" }, - "403": { - "$ref": "#/components/responses/403" - }, "404": { "$ref": "#/components/responses/404" }, - "422": { - "$ref": "#/components/responses/422" - }, "500": { "$ref": "#/components/responses/500" } @@ -14807,27 +16796,35 @@ ] } }, - "/api/v1/dataset/{pk}/metric/{metric_id}": { - "delete": { - "description": "Delete a Dataset metric", + "/api/v1/datasource/{datasource_type}/{datasource_id}/column/{column_name}/values/": { + "get": { "parameters": [ { - "description": "The dataset pk for this column", + "description": "The type of datasource", "in": "path", - "name": "pk", + "name": "datasource_type", "required": true, "schema": { - "type": "integer" + "type": "string" } }, { - "description": "The metric id for this dataset", + "description": "The id of the datasource", "in": "path", - "name": "metric_id", + "name": "datasource_id", "required": true, "schema": { "type": "integer" } + }, + { + "description": "The name of the column to get values for", + "in": "path", + "name": "column_name", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -14836,15 +16833,37 @@ "application/json": { "schema": { "properties": { - "message": { - "type": "string" + "result": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + } + ] + }, + "type": "array" } }, "type": "object" } } }, - "description": "Metric deleted" + "description": "A List of distinct values for the column" + }, + "400": { + "$ref": "#/components/responses/400" }, "401": { "$ref": "#/components/responses/401" @@ -14855,9 +16874,6 @@ "404": { "$ref": "#/components/responses/404" }, - "422": { - "$ref": "#/components/responses/422" - }, "500": { "$ref": "#/components/responses/500" } @@ -14867,21 +16883,23 @@ "jwt": [] } ], + "summary": "Get possible values for a datasource column", "tags": [ - "Datasets" + "Datasources" ] } }, - "/api/v1/dataset/{pk}/refresh": { - "put": { - "description": "Refreshes and updates columns of a dataset", + "/api/v1/embedded_dashboard/{uuid}": { + "get": { + "description": "Get a report schedule log", "parameters": [ { + "description": "The embedded configuration uuid", "in": "path", - "name": "pk", + "name": "uuid", "required": true, "schema": { - "type": "integer" + "type": "string" } } ], @@ -14891,28 +16909,22 @@ "application/json": { "schema": { "properties": { - "message": { - "type": "string" + "result": { + "$ref": "#/components/schemas/EmbeddedDashboardResponseSchema" } }, "type": "object" } } }, - "description": "Dataset delete" + "description": "Result contains the embedded dashboard configuration" }, "401": { "$ref": "#/components/responses/401" }, - "403": { - "$ref": "#/components/responses/403" - }, "404": { "$ref": "#/components/responses/404" }, - "422": { - "$ref": "#/components/responses/422" - }, "500": { "$ref": "#/components/responses/500" } @@ -14923,21 +16935,48 @@ } ], "tags": [ - "Datasets" + "Embedded Dashboard" ] } }, - "/api/v1/dataset/{pk}/related_objects": { + "/api/v1/explore/": { "get": { - "description": "Get charts and dashboards count associated to a dataset", + "description": "Assembles Explore related information (form_data, slice, dataset)\\n in a single endpoint.<br/><br/>\\nThe information can be assembled from:<br/> - The cache using a form_data_key<br/> - The metadata database using a permalink_key<br/> - Build from scratch using dataset or slice identifiers.", "parameters": [ { - "in": "path", - "name": "pk", - "required": true, + "in": "query", + "name": "form_data_key", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "permalink_key", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "slice_id", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "datasource_id", "schema": { "type": "integer" } + }, + { + "in": "query", + "name": "datasource_type", + "schema": { + "type": "string" + } } ], "responses": { @@ -14945,11 +16984,14 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DatasetRelatedObjectsResponse" + "$ref": "#/components/schemas/ExploreContextSchema" } } }, - "description": "Query result" + "description": "Returns the initial context." + }, + "400": { + "$ref": "#/components/responses/400" }, "401": { "$ref": "#/components/responses/401" @@ -14957,6 +16999,9 @@ "404": { "$ref": "#/components/responses/404" }, + "422": { + "$ref": "#/components/responses/422" + }, "500": { "$ref": "#/components/responses/500" } @@ -14966,8 +17011,9 @@ "jwt": [] } ], + "summary": "Assembles Explore related information (form_data, slice, dataset)\\n in a single endpoint.", "tags": [ - "Datasets" + "Explore" ] } }, @@ -15490,6 +17536,65 @@ ] } }, + "/api/v1/log/recent_activity/{user_id}/": { + "get": { + "parameters": [ + { + "description": "The id of the user", + "in": "path", + "name": "user_id", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/get_recent_activity_schema" + } + } + }, + "in": "query", + "name": "q" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecentActivityResponseSchema" + } + } + }, + "description": "A List of recent activity objects" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "403": { + "$ref": "#/components/responses/403" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "summary": "Get recent activity data for a user", + "tags": [ + "LogRestApi" + ] + } + }, "/api/v1/log/{pk}": { "get": { "description": "Get an item model", @@ -15592,9 +17697,37 @@ ] } }, - "/api/v1/me/": { + "/api/v1/me/": { + "get": { + "description": "Returns the user object corresponding to the agent making the request, or returns a 401 error if the user is unauthenticated.", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "result": { + "$ref": "#/components/schemas/UserResponseSchema" + } + }, + "type": "object" + } + } + }, + "description": "The current user" + }, + "401": { + "$ref": "#/components/responses/401" + } + }, + "tags": [ + "Current User" + ] + } + }, + "/api/v1/me/roles/": { "get": { - "description": "Returns the user object corresponding to the agent making the request, or returns a 401 error if the user is unauthenticated.", + "description": "Returns the user roles corresponding to the agent making the request, or returns a 401 error if the user is unauthenticated.", "responses": { "200": { "content": { @@ -15904,6 +18037,118 @@ ] } }, + "/api/v1/query/stop": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StopQuerySchema" + } + } + }, + "description": "Stop query schema", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "result": { + "type": "string" + } + }, + "type": "object" + } + } + }, + "description": "Query stopped" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "summary": "Manually stop a query with client_id", + "tags": [ + "Queries" + ] + } + }, + "/api/v1/query/updated_since": { + "get": { + "parameters": [ + { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/queries_get_updated_since_schema" + } + } + }, + "in": "query", + "name": "q" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "result": { + "description": "A List of queries that changed after last_updated_ms", + "items": { + "$ref": "#/components/schemas/QueryRestApi.get" + }, + "type": "array" + } + }, + "type": "object" + } + } + }, + "description": "Queries list" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "summary": "Get a list of queries that changed after last_updated_ms", + "tags": [ + "Queries" + ] + } + }, "/api/v1/query/{pk}": { "get": { "description": "Get query detail information.", @@ -16211,6 +18456,9 @@ "404": { "$ref": "#/components/responses/404" }, + "422": { + "$ref": "#/components/responses/422" + }, "500": { "$ref": "#/components/responses/500" } @@ -16575,6 +18823,9 @@ "404": { "$ref": "#/components/responses/404" }, + "422": { + "$ref": "#/components/responses/422" + }, "500": { "$ref": "#/components/responses/500" } @@ -17560,6 +19811,9 @@ }, "description": "Result contains the guest token" }, + "400": { + "$ref": "#/components/responses/400" + }, "401": { "$ref": "#/components/responses/401" }, @@ -17687,6 +19941,174 @@ ] } }, + "/api/v1/sqllab/execute/": { + "post": { + "description": "Starts the execution of a SQL query", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExecutePayloadSchema" + } + } + }, + "description": "SQL query and params", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryExecutionResponseSchema" + } + } + }, + "description": "Query execution result" + }, + "202": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryExecutionResponseSchema" + } + } + }, + "description": "Query execution result, query still running" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "403": { + "$ref": "#/components/responses/403" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "tags": [ + "SQL Lab" + ] + } + }, + "/api/v1/sqllab/export/{client_id}/": { + "get": { + "parameters": [ + { + "description": "The SQL query result identifier", + "in": "path", + "name": "client_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "text/csv": { + "schema": { + "type": "string" + } + } + }, + "description": "SQL query results" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "403": { + "$ref": "#/components/responses/403" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "summary": "Exports the SQL query results to a CSV", + "tags": [ + "SQL Lab" + ] + } + }, + "/api/v1/sqllab/results/": { + "get": { + "parameters": [ + { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sql_lab_get_results_schema" + } + } + }, + "in": "query", + "name": "q" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryExecutionResponseSchema" + } + } + }, + "description": "SQL query execution result" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + }, + "403": { + "$ref": "#/components/responses/403" + }, + "404": { + "$ref": "#/components/responses/404" + }, + "410": { + "$ref": "#/components/responses/410" + }, + "500": { + "$ref": "#/components/responses/500" + } + }, + "security": [ + { + "jwt": [] + } + ], + "summary": "Gets the result of a SQL query execution", + "tags": [ + "SQL Lab" + ] + } + }, "/api/{version}/_openapi": { "get": { "description": "Get the OpenAPI spec for a specific API version", diff --git a/docs/static/script/matomo.js b/docs/static/script/matomo.js new file mode 100644 index 000000000000..4af7a4e85dac --- /dev/null +++ b/docs/static/script/matomo.js @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var _paq = (window._paq = window._paq || []); +/* tracker methods like "setCustomDimension" should be called before "trackPageView" */ +/* We explicitly disable cookie tracking to avoid privacy issues */ +_paq.push(['disableCookies']); +_paq.push(['trackPageView']); +_paq.push(['enableLinkTracking']); +(function () { + var u = 'https://analytics.apache.org/'; + _paq.push(['setTrackerUrl', u + 'matomo.php']); + _paq.push(['setSiteId', '22']); + var d = document, + g = d.createElement('script'), + s = d.getElementsByTagName('script')[0]; + g.async = true; + g.src = u + 'matomo.js'; + s.parentNode.insertBefore(g, s); +})(); diff --git a/docs/yarn.lock b/docs/yarn.lock index 5f0aa7a39e7f..e7af9847d636 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -3014,15 +3014,37 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/resolve-uri@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" - integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.11" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" - integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@^0.3.0": version "0.3.4" @@ -3032,6 +3054,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@mdx-js/mdx@^1.6.22": version "1.6.22" resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" @@ -3822,13 +3852,13 @@ resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" + mime-types "~2.1.34" + negotiator "0.6.3" acorn-import-assertions@^1.7.6: version "1.8.0" @@ -3840,15 +3870,10 @@ acorn-walk@^8.0.0: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.0.4, acorn@^8.4.1: - version "8.5.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz" - integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== - -acorn@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== +acorn@^8.0.4, acorn@^8.4.1, acorn@^8.5.0: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== address@^1.0.1, address@^1.1.2: version "1.1.2" @@ -4071,8 +4096,8 @@ argparse@^2.0.1: array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-flatten@^2.1.0: version "2.1.2" @@ -4298,7 +4323,7 @@ batch@0.6.1: big.js@^5.2.2: version "5.2.2" - resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: @@ -4311,21 +4336,23 @@ bluebird@^3.7.1: resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: - bytes "3.1.0" + bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" bonjour@^3.5.0: version "3.5.0" @@ -4438,7 +4465,7 @@ btoa@^1.2.1: buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-indexof@^1.0.0: @@ -4459,10 +4486,10 @@ bytes@3.0.0: resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cacheable-request@^6.0.0: version "6.1.0" @@ -4479,7 +4506,7 @@ cacheable-request@^6.0.0: call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -4790,7 +4817,7 @@ comma-separated-tokens@^1.0.0: commander@^2.20.0: version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^5.1.0: @@ -4870,16 +4897,16 @@ content-disposition@0.5.2: resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: - safe-buffer "5.1.2" + safe-buffer "5.2.1" content-type@~1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@^1.5.0, convert-source-map@^1.7.0: @@ -4891,13 +4918,13 @@ convert-source-map@^1.5.0, convert-source-map@^1.7.0: cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== cookie@~0.4.1: version "0.4.1" @@ -5419,15 +5446,20 @@ del@^6.0.0: rimraf "^3.0.2" slash "^3.0.0" +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detab@2.0.4: version "2.0.4" @@ -5612,8 +5644,8 @@ eastasianwidth@^0.2.0: ee-first@1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.3.886: version "1.3.894" @@ -5652,7 +5684,7 @@ emoji-regex@^9.2.2: emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== emoticon@^3.2.0: @@ -5671,8 +5703,8 @@ emotion-theming@^10.0.27: encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== end-of-stream@^1.1.0: version "1.4.4" @@ -5869,8 +5901,8 @@ eta@^1.12.3: etag@~1.8.1: version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eval@0.1.6: version "0.1.6" @@ -5921,37 +5953,38 @@ execa@^5.0.0: strip-final-newline "^2.0.0" express@^4.17.1: - version "4.17.1" - resolved "https://registry.npmjs.org/express/-/express-4.17.1.tgz" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: - accepts "~1.3.7" + accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" + body-parser "1.20.1" + content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.0" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" + proxy-addr "~2.0.7" + qs "6.11.0" range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -6003,9 +6036,9 @@ fast-glob@^3.2.7, fast-glob@^3.2.9: micromatch "^4.0.4" fast-json-patch@^3.0.0-1: - version "3.1.0" - resolved "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.0.tgz" - integrity sha512-IhpytlsVTRndz0hU5t0/MGzS/etxLlfrpG5V5M9mVbuj9TrJLWaMfsox9REM5rkuGX0T+5qjpe8XA1o0gZ42nA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.1.tgz#85064ea1b1ebf97a3f7ad01e23f9337e72c66947" + integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -6092,17 +6125,17 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" find-cache-dir@^3.3.1: @@ -6199,7 +6232,7 @@ formdata-node@^4.0.0: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fraction.js@^4.1.1: @@ -6214,8 +6247,8 @@ fraction.js@^4.2.0: fresh@0.5.2: version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-extra@^10.0.1: version "10.0.1" @@ -6261,7 +6294,16 @@ gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: +get-intrinsic@^1.0.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -6476,6 +6518,11 @@ has-symbols@^1.0.1, has-symbols@^1.0.2: resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" @@ -6698,25 +6745,25 @@ htmlparser2@^6.1.0: entities "^2.0.0" http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" http-errors@~1.6.2: version "1.6.3" @@ -6728,17 +6775,6 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-parser-js@>=0.5.1: version "0.5.3" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz" @@ -6769,13 +6805,20 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" @@ -6806,7 +6849,7 @@ image-size@^1.0.1: image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== immer@^9.0.7: version "9.0.12" @@ -6907,7 +6950,7 @@ ip@^1.1.0: ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== ipaddr.js@^2.0.1: @@ -7335,17 +7378,10 @@ json2mq@^0.2.0: dependencies: string-convert "^0.2.0" -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.1.2, json5@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" + integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== jsonfile@^6.0.1: version "6.1.0" @@ -7386,16 +7422,16 @@ latest-version@^5.1.0: package-json "^6.3.0" less-loader@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-11.0.0.tgz#a31b2bc5cdfb62f1c7de9b2d01cd944c22b1a024" - integrity sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw== + version "11.1.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-11.1.0.tgz#a452384259bdf8e4f6d5fdcc39543609e6313f82" + integrity sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug== dependencies: klona "^2.0.4" less@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/less/-/less-4.1.2.tgz#6099ee584999750c2624b65f80145f8674e4b4b0" - integrity sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA== + version "4.1.3" + resolved "https://registry.yarnpkg.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" + integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== dependencies: copy-anything "^2.0.1" parse-node-version "^1.0.1" @@ -7406,7 +7442,7 @@ less@^4.1.2: image-size "~0.5.0" make-dir "^2.1.0" mime "^1.4.1" - needle "^2.5.2" + needle "^3.1.0" source-map "~0.6.0" leven@^3.1.0: @@ -7430,9 +7466,9 @@ loader-runner@^4.2.0: integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" @@ -7671,8 +7707,8 @@ mdurl@^1.0.0: media-typer@0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^3.1.2: version "3.3.0" @@ -7709,8 +7745,8 @@ memoizee@^0.4.15: merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-stream@^2.0.0: version "2.0.0" @@ -7724,8 +7760,8 @@ merge2@^1.3.0, merge2@^1.4.1: methods@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.4" @@ -7748,6 +7784,11 @@ mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + mime-db@~1.33.0: version "1.33.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" @@ -7760,16 +7801,23 @@ mime-types@2.1.18: dependencies: mime-db "~1.33.0" -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24: +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17: version "2.1.34" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz" integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: mime-db "1.51.0" +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mime@1.6.0, mime@^1.4.1: version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.3.1: @@ -7834,28 +7882,23 @@ mkdirp@^0.5.5, mkdirp@~0.5.1: minimist "^1.2.5" moment@^2.24.0, moment@^2.25.3: - version "2.29.2" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4" - integrity sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg== + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== ms@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: +ms@2.1.3, ms@^2.1.1: version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multicast-dns-service-types@^1.1.0: @@ -7876,19 +7919,19 @@ nanoid@^3.1.30, nanoid@^3.3.1: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== -needle@^2.5.2: - version "2.9.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" - integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== +needle@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.2.0.tgz#07d240ebcabfd65c76c03afae7f6defe6469df44" + integrity sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ== dependencies: debug "^3.2.6" - iconv-lite "^0.4.4" + iconv-lite "^0.6.3" sax "^1.2.4" -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== neo-async@^2.6.2: version "2.6.2" @@ -7998,11 +8041,16 @@ object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-inspect@^1.11.0, object-inspect@^1.9.0: +object-inspect@^1.11.0: version "1.11.0" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== +object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + object-is@^1.0.1: version "1.1.5" resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" @@ -8049,10 +8097,10 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" @@ -8225,7 +8273,7 @@ parse5@^6.0.0, parse5@^6.0.1: parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascal-case@^3.1.2: @@ -8268,8 +8316,8 @@ path-parse@^1.0.6, path-parse@^1.0.7: path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-to-regexp@2.2.1: version "2.2.1" @@ -8932,9 +8980,9 @@ property-information@^5.0.0, property-information@^5.3.0: dependencies: xtend "^4.0.0" -proxy-addr@~2.0.5: +proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -8943,7 +8991,7 @@ proxy-addr@~2.0.5: prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== pump@^3.0.0: version "3.0.0" @@ -8985,15 +9033,10 @@ q@^1.1.2: resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.7.0: - version "6.7.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -qs@^6.9.4: - version "6.10.2" - resolved "https://registry.npmjs.org/qs/-/qs-6.10.2.tgz" - integrity sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw== +qs@6.11.0, qs@^6.9.4: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" @@ -9038,16 +9081,16 @@ range-parser@1.2.0: range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: - bytes "3.1.0" - http-errors "1.7.2" + bytes "3.1.2" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" @@ -10024,14 +10067,14 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@^1.2.4, sax@~1.2.4: @@ -10140,24 +10183,24 @@ semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: dependencies: lru-cache "^6.0.0" -send@0.17.1: - version "0.17.1" - resolved "https://registry.npmjs.org/send/-/send-0.17.1.tgz" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "~1.7.2" + http-errors "2.0.0" mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" + ms "2.1.3" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" serialize-error@^8.1.0: version "8.1.0" @@ -10200,15 +10243,15 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.1" + send "0.18.0" setimmediate@^1.0.5: version "1.0.5" @@ -10220,10 +10263,10 @@ setprototypeof@1.1.0: resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.11: version "2.4.11" @@ -10273,7 +10316,7 @@ shelljs@^0.8.5: side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -10349,9 +10392,9 @@ source-map-js@^1.0.2: integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== source-map-support@~0.5.20: - version "0.5.20" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz" - integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -10366,11 +10409,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - space-separated-tokens@^1.0.0: version "1.1.5" resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" @@ -10414,7 +10452,12 @@ state-toggle@^1.0.0: resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -10703,23 +10746,14 @@ terser-webpack-plugin@^5.3.1: source-map "^0.6.1" terser "^5.7.2" -terser@^5.10.0: - version "5.12.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.1.tgz#4cf2ebed1f5bceef5c83b9f60104ac4a78b49e9c" - integrity sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ== +terser@^5.10.0, terser@^5.7.2: + version "5.14.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" + integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== dependencies: + "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.20" - -terser@^5.7.2: - version "5.9.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz" - integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" source-map-support "~0.5.20" text-table@^0.2.0: @@ -10777,10 +10811,10 @@ toggle-selection@^1.0.6: resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== totalist@^1.0.0: version "1.1.0" @@ -10828,9 +10862,9 @@ tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.1: integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tslib@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== type-fest@^0.20.2: version "0.20.2" @@ -10842,9 +10876,9 @@ type-fest@^2.5.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.12.1.tgz#d2be8f50bf5f8f0a5fd916d29bf3e98c17e960be" integrity sha512-AiknQSEqKVGDDjtZqeKrUoTlcj7FKhupmnVUgz6KoOKtvMwRGE6hUNJ/nVear+h7fnUPO1q/htSkYKb1pyntkQ== -type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.18: version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -10873,9 +10907,9 @@ typescript@^4.3.5: integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== ua-parser-js@^0.7.30: - version "0.7.31" - resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + version "0.7.33" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" + integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== unbox-primitive@^1.0.1: version "1.0.1" @@ -11018,8 +11052,8 @@ universalify@^2.0.0: unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unquote@~1.1.1: version "1.1.1" @@ -11131,8 +11165,8 @@ utility-types@^3.10.0: utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^3.4.0: version "3.4.0" @@ -11146,8 +11180,8 @@ value-equal@^1.0.1: vary@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vendors@^1.0.3: version "1.0.4" diff --git a/helm/superset/Chart.lock b/helm/superset/Chart.lock new file mode 100644 index 000000000000..d1bdc5115b95 --- /dev/null +++ b/helm/superset/Chart.lock @@ -0,0 +1,9 @@ +dependencies: +- name: postgresql + repository: https://charts.bitnami.com/bitnami + version: 12.1.6 +- name: redis + repository: https://charts.bitnami.com/bitnami + version: 17.3.17 +digest: sha256:3bfff146fa89077705c0bedea59bbe2c9f15715220f9ea84f493335f0413af6e +generated: "2023-01-04T12:50:49.567524-08:00" diff --git a/helm/superset/Chart.yaml b/helm/superset/Chart.yaml index 16c59869dfb4..7a3f2b1f83e8 100644 --- a/helm/superset/Chart.yaml +++ b/helm/superset/Chart.yaml @@ -15,20 +15,27 @@ # limitations under the License. # apiVersion: v2 -appVersion: "1.0" +appVersion: "2.0.1" description: Apache Superset is a modern, enterprise-ready business intelligence web application name: superset +icon: https://artifacthub.io/image/68c1d717-0e97-491f-b046-754e46f46922@2x +home: https://superset.apache.org/ +keywords: + - business intelligence + - data science +sources: + - https://github.com/apache/superset maintainers: - name: craig-rueda email: craig@craigrueda.com url: https://github.com/craig-rueda -version: 0.6.3 +version: 0.8.6 dependencies: -- name: postgresql - version: 11.1.22 - repository: https://charts.bitnami.com/bitnami - condition: postgresql.enabled -- name: redis - version: 16.3.1 - repository: https://charts.bitnami.com/bitnami - condition: redis.enabled + - name: postgresql + version: 12.1.6 + repository: https://charts.bitnami.com/bitnami + condition: postgresql.enabled + - name: redis + version: 17.3.17 + repository: https://charts.bitnami.com/bitnami + condition: redis.enabled diff --git a/helm/superset/README.md b/helm/superset/README.md new file mode 100644 index 000000000000..5d56ead1be13 --- /dev/null +++ b/helm/superset/README.md @@ -0,0 +1,267 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<!-- +NOTE: This file is generated by helm-docs: https://github.com/norwoodj/helm-docs#installation +--> + +# superset + +![Version: 0.8.6](https://img.shields.io/badge/Version-0.8.6-informational?style=flat-square) + +Apache Superset is a modern, enterprise-ready business intelligence web application + +**Homepage:** <https://superset.apache.org/> + +## Source Code + +* <https://github.com/apache/superset> + +## TL;DR + +```console +helm repo add superset http://apache.github.io/superset/ +helm install my-superset superset/superset +``` + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.bitnami.com/bitnami | postgresql | 12.1.6 | +| https://charts.bitnami.com/bitnami | redis | 17.3.17 | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| bootstrapScript | string | see `values.yaml` | Install additional packages and do any other bootstrap configuration in this script For production clusters it's recommended to build own image with this step done in CI | +| configFromSecret | string | `"{{ template \"superset.fullname\" . }}-config"` | The name of the secret which we will use to generate a superset_config.py file Note: this secret must have the key superset_config.py in it and can include other files as well | +| configMountPath | string | `"/app/pythonpath"` | | +| configOverrides | object | `{}` | A dictionary of overrides to append at the end of superset_config.py - the name does not matter WARNING: the order is not guaranteed Files can be passed as helm --set-file configOverrides.my-override=my-file.py | +| configOverridesFiles | object | `{}` | Same as above but the values are files | +| envFromSecret | string | `"{{ template \"superset.fullname\" . }}-env"` | The name of the secret which we will use to populate env vars in deployed pods This can be useful for secret keys, etc. | +| envFromSecrets | list | `[]` | This can be a list of templated strings | +| extraConfigMountPath | string | `"/app/configs"` | | +| extraConfigs | object | `{}` | Extra files to mount on `/app/pythonpath` | +| extraEnv | object | `{}` | Extra environment variables that will be passed into pods | +| extraEnvRaw | list | `[]` | Extra environment variables in RAW format that will be passed into pods | +| extraSecretEnv | object | `{}` | Extra environment variables to pass as secrets | +| extraSecrets | object | `{}` | Extra files to mount on `/app/pythonpath` as secrets | +| extraVolumeMounts | list | `[]` | | +| extraVolumes | list | `[]` | | +| hostAliases | list | `[]` | Custom hostAliases for all superset pods # https://kubernetes.io/docs/tasks/network/customize-hosts-file-for-pods/ | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"apache/superset"` | | +| image.tag | string | `""` | | +| imagePullSecrets | list | `[]` | | +| ingress.annotations | object | `{}` | | +| ingress.enabled | bool | `false` | | +| ingress.hosts[0] | string | `"chart-example.local"` | | +| ingress.path | string | `"/"` | | +| ingress.pathType | string | `"ImplementationSpecific"` | | +| ingress.tls | list | `[]` | | +| init.adminUser.email | string | `"admin@superset.com"` | | +| init.adminUser.firstname | string | `"Superset"` | | +| init.adminUser.lastname | string | `"Admin"` | | +| init.adminUser.password | string | `"admin"` | | +| init.adminUser.username | string | `"admin"` | | +| init.command | list | a `superset_init.sh` command | Command | +| init.containerSecurityContext | object | `{}` | | +| init.createAdmin | bool | `true` | | +| init.enabled | bool | `true` | | +| init.initContainers | list | a container waiting for postgres | List of initContainers | +| init.initscript | string | a script to create admin user and initailize roles | A Superset init script | +| init.loadExamples | bool | `false` | | +| init.podAnnotations | object | `{}` | | +| init.podSecurityContext | object | `{}` | | +| init.resources | object | `{}` | | +| initImage.pullPolicy | string | `"IfNotPresent"` | | +| initImage.repository | string | `"jwilder/dockerize"` | | +| initImage.tag | string | `"latest"` | | +| nodeSelector | object | `{}` | | +| postgresql | object | see `values.yaml` | Configuration values for the postgresql dependency. ref: https://github.com/kubernetes/charts/blob/master/stable/postgresql/README.md | +| redis | object | see `values.yaml` | Configuration values for the Redis dependency. ref: https://github.com/bitnami/charts/blob/master/bitnami/redis More documentation can be found here: https://artifacthub.io/packages/helm/bitnami/redis | +| resources | object | `{}` | | +| runAsUser | int | `0` | User ID directive. This user must have enough permissions to run the bootstrap script Running containers as root is not recommended in production. Change this to another UID - e.g. 1000 to be more secure | +| service.annotations | object | `{}` | | +| service.loadBalancerIP | string | `nil` | | +| service.nodePort.http | int | `"nil"` | | +| service.port | int | `8088` | | +| service.type | string | `"ClusterIP"` | | +| serviceAccount.annotations | object | `{}` | | +| serviceAccount.create | bool | `false` | Create custom service account for Superset. If create: true and name is not provided, `superset.fullname` will be used. | +| supersetCeleryBeat.affinity | object | `{}` | Affinity to be added to supersetCeleryBeat deployment | +| supersetCeleryBeat.command | list | a `celery beat` command | Command | +| supersetCeleryBeat.containerSecurityContext | object | `{}` | | +| supersetCeleryBeat.deploymentAnnotations | object | `{}` | Annotations to be added to supersetCeleryBeat deployment | +| supersetCeleryBeat.enabled | bool | `false` | This is only required if you intend to use alerts and reports | +| supersetCeleryBeat.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade | +| supersetCeleryBeat.initContainers | list | a container waiting for postgres | List of init containers | +| supersetCeleryBeat.podAnnotations | object | `{}` | Annotations to be added to supersetCeleryBeat pods | +| supersetCeleryBeat.podLabels | object | `{}` | Labels to be added to supersetCeleryBeat pods | +| supersetCeleryBeat.podSecurityContext | object | `{}` | | +| supersetCeleryBeat.resources | object | `{}` | Resource settings for the CeleryBeat pods - these settings overwrite might existing values from the global resources object defined above. | +| supersetCeleryBeat.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetCeleryBeat deployments | +| supersetCeleryFlower.affinity | object | `{}` | Affinity to be added to supersetCeleryFlower deployment | +| supersetCeleryFlower.command | list | a `celery flower` command | Command | +| supersetCeleryFlower.containerSecurityContext | object | `{}` | | +| supersetCeleryFlower.deploymentAnnotations | object | `{}` | Annotations to be added to supersetCeleryFlower deployment | +| supersetCeleryFlower.enabled | bool | `false` | Enables a Celery flower deployment (management UI to monitor celery jobs) WARNING: on superset 1.x, this requires a Superset image that has `flower<1.0.0` installed (which is NOT the case of the default images) flower>=1.0.0 requires Celery 5+ which Superset 1.5 does not support | +| supersetCeleryFlower.initContainers | list | a container waiting for postgres and redis | List of init containers | +| supersetCeleryFlower.livenessProbe.failureThreshold | int | `3` | | +| supersetCeleryFlower.livenessProbe.httpGet.path | string | `"/api/workers"` | | +| supersetCeleryFlower.livenessProbe.httpGet.port | string | `"flower"` | | +| supersetCeleryFlower.livenessProbe.initialDelaySeconds | int | `5` | | +| supersetCeleryFlower.livenessProbe.periodSeconds | int | `5` | | +| supersetCeleryFlower.livenessProbe.successThreshold | int | `1` | | +| supersetCeleryFlower.livenessProbe.timeoutSeconds | int | `1` | | +| supersetCeleryFlower.podAnnotations | object | `{}` | Annotations to be added to supersetCeleryFlower pods | +| supersetCeleryFlower.podLabels | object | `{}` | Labels to be added to supersetCeleryFlower pods | +| supersetCeleryFlower.podSecurityContext | object | `{}` | | +| supersetCeleryFlower.readinessProbe.failureThreshold | int | `3` | | +| supersetCeleryFlower.readinessProbe.httpGet.path | string | `"/api/workers"` | | +| supersetCeleryFlower.readinessProbe.httpGet.port | string | `"flower"` | | +| supersetCeleryFlower.readinessProbe.initialDelaySeconds | int | `5` | | +| supersetCeleryFlower.readinessProbe.periodSeconds | int | `5` | | +| supersetCeleryFlower.readinessProbe.successThreshold | int | `1` | | +| supersetCeleryFlower.readinessProbe.timeoutSeconds | int | `1` | | +| supersetCeleryFlower.replicaCount | int | `1` | | +| supersetCeleryFlower.resources | object | `{}` | Resource settings for the CeleryBeat pods - these settings overwrite might existing values from the global resources object defined above. | +| supersetCeleryFlower.service.annotations | object | `{}` | | +| supersetCeleryFlower.service.nodePort.http | int | `"nil"` | | +| supersetCeleryFlower.service.port | int | `5555` | | +| supersetCeleryFlower.service.type | string | `"ClusterIP"` | | +| supersetCeleryFlower.startupProbe.failureThreshold | int | `60` | | +| supersetCeleryFlower.startupProbe.httpGet.path | string | `"/api/workers"` | | +| supersetCeleryFlower.startupProbe.httpGet.port | string | `"flower"` | | +| supersetCeleryFlower.startupProbe.initialDelaySeconds | int | `5` | | +| supersetCeleryFlower.startupProbe.periodSeconds | int | `5` | | +| supersetCeleryFlower.startupProbe.successThreshold | int | `1` | | +| supersetCeleryFlower.startupProbe.timeoutSeconds | int | `1` | | +| supersetCeleryFlower.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetCeleryFlower deployments | +| supersetNode.affinity | object | `{}` | Affinity to be added to supersetNode deployment | +| supersetNode.command | list | See `values.yaml` | Startup command | +| supersetNode.connections.db_host | string | `"{{ template \"superset.fullname\" . }}-postgresql"` | | +| supersetNode.connections.db_name | string | `"superset"` | | +| supersetNode.connections.db_pass | string | `"superset"` | | +| supersetNode.connections.db_port | string | `"5432"` | | +| supersetNode.connections.db_user | string | `"superset"` | | +| supersetNode.connections.redis_host | string | `"{{ template \"superset.fullname\" . }}-redis-headless"` | Change in case of bringing your own redis and then also set redis.enabled:false | +| supersetNode.connections.redis_port | string | `"6379"` | | +| supersetNode.containerSecurityContext | object | `{}` | | +| supersetNode.deploymentAnnotations | object | `{}` | Annotations to be added to supersetNode deployment | +| supersetNode.deploymentLabels | object | `{}` | Labels to be added to supersetNode deployment | +| supersetNode.env | object | `{}` | | +| supersetNode.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade | +| supersetNode.initContainers | list | a container waiting for postgres | Init containers | +| supersetNode.livenessProbe.failureThreshold | int | `3` | | +| supersetNode.livenessProbe.httpGet.path | string | `"/health"` | | +| supersetNode.livenessProbe.httpGet.port | string | `"http"` | | +| supersetNode.livenessProbe.initialDelaySeconds | int | `15` | | +| supersetNode.livenessProbe.periodSeconds | int | `15` | | +| supersetNode.livenessProbe.successThreshold | int | `1` | | +| supersetNode.livenessProbe.timeoutSeconds | int | `1` | | +| supersetNode.podAnnotations | object | `{}` | Annotations to be added to supersetNode pods | +| supersetNode.podLabels | object | `{}` | Labels to be added to supersetNode pods | +| supersetNode.podSecurityContext | object | `{}` | | +| supersetNode.readinessProbe.failureThreshold | int | `3` | | +| supersetNode.readinessProbe.httpGet.path | string | `"/health"` | | +| supersetNode.readinessProbe.httpGet.port | string | `"http"` | | +| supersetNode.readinessProbe.initialDelaySeconds | int | `15` | | +| supersetNode.readinessProbe.periodSeconds | int | `15` | | +| supersetNode.readinessProbe.successThreshold | int | `1` | | +| supersetNode.readinessProbe.timeoutSeconds | int | `1` | | +| supersetNode.replicaCount | int | `1` | | +| supersetNode.resources | object | `{}` | Resource settings for the supersetNode pods - these settings overwrite might existing values from the global resources object defined above. | +| supersetNode.startupProbe.failureThreshold | int | `60` | | +| supersetNode.startupProbe.httpGet.path | string | `"/health"` | | +| supersetNode.startupProbe.httpGet.port | string | `"http"` | | +| supersetNode.startupProbe.initialDelaySeconds | int | `15` | | +| supersetNode.startupProbe.periodSeconds | int | `5` | | +| supersetNode.startupProbe.successThreshold | int | `1` | | +| supersetNode.startupProbe.timeoutSeconds | int | `1` | | +| supersetNode.strategy | object | `{}` | | +| supersetNode.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetNode deployments | +| supersetWebsockets.affinity | object | `{}` | Affinity to be added to supersetWebsockets deployment | +| supersetWebsockets.command | list | `[]` | | +| supersetWebsockets.config | object | see `values.yaml` | The config.json to pass to the server, see https://github.com/apache/superset/tree/master/superset-websocket Note that the configuration can also read from environment variables (which will have priority), see https://github.com/apache/superset/blob/master/superset-websocket/src/config.ts for a list of supported variables | +| supersetWebsockets.containerSecurityContext | object | `{}` | | +| supersetWebsockets.deploymentAnnotations | object | `{}` | | +| supersetWebsockets.enabled | bool | `false` | This is only required if you intend to use `GLOBAL_ASYNC_QUERIES` in `ws` mode see https://github.com/apache/superset/blob/master/CONTRIBUTING.md#async-chart-queries | +| supersetWebsockets.image.pullPolicy | string | `"IfNotPresent"` | | +| supersetWebsockets.image.repository | string | `"oneacrefund/superset-websocket"` | There is no official image (yet), this one is community-supported | +| supersetWebsockets.image.tag | string | `"latest"` | | +| supersetWebsockets.ingress.path | string | `"/ws"` | | +| supersetWebsockets.ingress.pathType | string | `"Prefix"` | | +| supersetWebsockets.livenessProbe.failureThreshold | int | `3` | | +| supersetWebsockets.livenessProbe.httpGet.path | string | `"/health"` | | +| supersetWebsockets.livenessProbe.httpGet.port | string | `"ws"` | | +| supersetWebsockets.livenessProbe.initialDelaySeconds | int | `5` | | +| supersetWebsockets.livenessProbe.periodSeconds | int | `5` | | +| supersetWebsockets.livenessProbe.successThreshold | int | `1` | | +| supersetWebsockets.livenessProbe.timeoutSeconds | int | `1` | | +| supersetWebsockets.podAnnotations | object | `{}` | | +| supersetWebsockets.podLabels | object | `{}` | | +| supersetWebsockets.podSecurityContext | object | `{}` | | +| supersetWebsockets.readinessProbe.failureThreshold | int | `3` | | +| supersetWebsockets.readinessProbe.httpGet.path | string | `"/health"` | | +| supersetWebsockets.readinessProbe.httpGet.port | string | `"ws"` | | +| supersetWebsockets.readinessProbe.initialDelaySeconds | int | `5` | | +| supersetWebsockets.readinessProbe.periodSeconds | int | `5` | | +| supersetWebsockets.readinessProbe.successThreshold | int | `1` | | +| supersetWebsockets.readinessProbe.timeoutSeconds | int | `1` | | +| supersetWebsockets.replicaCount | int | `1` | | +| supersetWebsockets.resources | object | `{}` | | +| supersetWebsockets.service.annotations | object | `{}` | | +| supersetWebsockets.service.nodePort.http | int | `"nil"` | | +| supersetWebsockets.service.port | int | `8080` | | +| supersetWebsockets.service.type | string | `"ClusterIP"` | | +| supersetWebsockets.startupProbe.failureThreshold | int | `60` | | +| supersetWebsockets.startupProbe.httpGet.path | string | `"/health"` | | +| supersetWebsockets.startupProbe.httpGet.port | string | `"ws"` | | +| supersetWebsockets.startupProbe.initialDelaySeconds | int | `5` | | +| supersetWebsockets.startupProbe.periodSeconds | int | `5` | | +| supersetWebsockets.startupProbe.successThreshold | int | `1` | | +| supersetWebsockets.startupProbe.timeoutSeconds | int | `1` | | +| supersetWebsockets.strategy | object | `{}` | | +| supersetWebsockets.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetWebsockets deployments | +| supersetWorker.command | list | a `celery worker` command | Worker startup command | +| supersetWorker.containerSecurityContext | object | `{}` | | +| supersetWorker.deploymentAnnotations | object | `{}` | Annotations to be added to supersetWorker deployment | +| supersetWorker.deploymentLabels | object | `{}` | Labels to be added to supersetWorker deployment | +| supersetWorker.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade | +| supersetWorker.initContainers | list | a container waiting for postgres and redis | Init container | +| supersetWorker.livenessProbe.exec.command | list | a `celery inspect ping` command | Liveness probe command | +| supersetWorker.livenessProbe.failureThreshold | int | `3` | | +| supersetWorker.livenessProbe.initialDelaySeconds | int | `120` | | +| supersetWorker.livenessProbe.periodSeconds | int | `60` | | +| supersetWorker.livenessProbe.successThreshold | int | `1` | | +| supersetWorker.livenessProbe.timeoutSeconds | int | `60` | | +| supersetWorker.podAnnotations | object | `{}` | Annotations to be added to supersetWorker pods | +| supersetWorker.podLabels | object | `{}` | Labels to be added to supersetWorker pods | +| supersetWorker.podSecurityContext | object | `{}` | | +| supersetWorker.readinessProbe | object | `{}` | No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) | +| supersetWorker.replicaCount | int | `1` | | +| supersetWorker.resources | object | `{}` | Resource settings for the supersetWorker pods - these settings overwrite might existing values from the global resources object defined above. | +| supersetWorker.startupProbe | object | `{}` | No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) | +| supersetWorker.strategy | object | `{}` | | +| tolerations | list | `[]` | | +| topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to all deployments | diff --git a/helm/superset/README.md.gotmpl b/helm/superset/README.md.gotmpl new file mode 100644 index 000000000000..c17a7e31a737 --- /dev/null +++ b/helm/superset/README.md.gotmpl @@ -0,0 +1,44 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<!-- +NOTE: This file is generated by helm-docs: https://github.com/norwoodj/helm-docs#installation +--> + +{{ template "chart.header" . }} +{{ template "chart.deprecationWarning" . }} + +{{ template "chart.versionBadge" . }} + +{{ template "chart.description" . }} + +{{ template "chart.homepageLine" . }} + +{{ template "chart.sourcesSection" . }} + +## TL;DR + +```console +helm repo add superset http://apache.github.io/superset/ +helm install my-superset superset/superset +``` + +{{ template "chart.requirementsSection" . }} + +{{ template "chart.valuesSection" . }} diff --git a/helm/superset/templates/_helpers.tpl b/helm/superset/templates/_helpers.tpl index 593fd0319885..d551fcf6e82c 100644 --- a/helm/superset/templates/_helpers.tpl +++ b/helm/superset/templates/_helpers.tpl @@ -83,12 +83,6 @@ SQLALCHEMY_DATABASE_URI = f"postgresql+psycopg2://{env('DB_USER')}:{env('DB_PASS SQLALCHEMY_TRACK_MODIFICATIONS = True SECRET_KEY = env('SECRET_KEY', 'thisISaSECRET_1234') -# Flask-WTF flag for CSRF -WTF_CSRF_ENABLED = True -# Add endpoints that need to be exempt from CSRF protection -WTF_CSRF_EXEMPT_LIST = [] -# A CSRF token that expires in 1 year -WTF_CSRF_TIME_LIMIT = 60 * 60 * 24 * 365 class CeleryConfig(object): CELERY_IMPORTS = ('superset.sql_lab', ) CELERY_ANNOTATIONS = {'tasks.add': {'rate_limit': '10/s'}} diff --git a/helm/superset/templates/configmap-superset.yaml b/helm/superset/templates/configmap-superset.yaml index a7d7b09339a0..eb8564619b18 100644 --- a/helm/superset/templates/configmap-superset.yaml +++ b/helm/superset/templates/configmap-superset.yaml @@ -24,6 +24,7 @@ metadata: chart: {{ template "superset.chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} + namespace: {{ .Release.Namespace }} data: {{- range $path, $config := .Values.extraConfigs }} {{ $path }}: | diff --git a/helm/superset/templates/deployment-beat.yaml b/helm/superset/templates/deployment-beat.yaml index 5587dcf343eb..72de7ab20478 100644 --- a/helm/superset/templates/deployment-beat.yaml +++ b/helm/superset/templates/deployment-beat.yaml @@ -26,8 +26,9 @@ metadata: heritage: {{ .Release.Service }} {{- if .Values.supersetCeleryBeat.deploymentAnnotations }} annotations: - {{ toYaml .Values.supersetCeleryBeat.deploymentAnnotations | nindent 4 }} + {{- toYaml .Values.supersetCeleryBeat.deploymentAnnotations | nindent 4 }} {{- end }} + namespace: {{ .Release.Namespace }} spec: # This must be a singleton replicas: 1 @@ -50,13 +51,13 @@ spec: force-reload: {{ randAlphaNum 5 | quote }} {{ end }} {{- if .Values.supersetCeleryBeat.podAnnotations }} - {{ toYaml .Values.supersetCeleryBeat.podAnnotations | nindent 8 }} + {{- toYaml .Values.supersetCeleryBeat.podAnnotations | nindent 8 }} {{- end }} labels: - app: {{ template "superset.name" . }}-celerybeat + app: "{{ template "superset.name" . }}-celerybeat" release: {{ .Release.Name }} {{- if .Values.supersetCeleryBeat.podLabels }} - {{ toYaml .Values.supersetCeleryBeat.podLabels | nindent 8 }} + {{- toYaml .Values.supersetCeleryBeat.podLabels | nindent 8 }} {{- end }} spec: {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} @@ -64,17 +65,23 @@ spec: {{- end }} securityContext: runAsUser: {{ .Values.runAsUser }} + {{- if .Values.supersetCeleryBeat.podSecurityContext }} + {{- toYaml .Values.supersetCeleryBeat.podSecurityContext | nindent 8 }} + {{- end }} {{- if .Values.supersetCeleryBeat.initContainers }} initContainers: {{- tpl (toYaml .Values.supersetCeleryBeat.initContainers) . | nindent 6 }} {{- end }} {{- with .Values.hostAliases }} - hostAliases: {{ toYaml . | nindent 6 }} + hostAliases: {{- toYaml . | nindent 6 }} {{- end }} containers: - - name: {{ .Chart.Name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + - name: "{{ .Chart.Name }}-celerybeat" + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.supersetCeleryBeat.containerSecurityContext }} + securityContext: {{- toYaml .Values.supersetCeleryBeat.containerSecurityContext | nindent 12 }} + {{- end }} command: {{ tpl (toJson .Values.supersetCeleryBeat.command) . }} env: - name: "SUPERSET_PORT" @@ -97,35 +104,59 @@ spec: - name: superset-config mountPath: {{ .Values.configMountPath | quote }} readOnly: true + {{- if .Values.extraConfigs }} + - name: superset-extra-config + mountPath: {{ .Values.extraConfigMountPath | quote }} + readOnly: true + {{- end }} {{- with .Values.extraVolumeMounts }} {{- tpl (toYaml .) $ | nindent 12 -}} {{- end }} resources: {{- if .Values.supersetCeleryBeat.resources }} -{{ toYaml .Values.supersetCeleryBeat.resources | indent 12 }} + {{- toYaml .Values.supersetCeleryBeat.resources | nindent 12 }} {{- else }} -{{ toYaml .Values.resources | indent 12 }} + {{- toYaml .Values.resources | nindent 12 }} {{- end }} - {{- with .Values.nodeSelector }} + {{- with .Values.nodeSelector }} nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if or .Values.affinity .Values.supersetCeleryBeat.affinity }} affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.tolerations }} + {{- with .Values.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.supersetCeleryBeat.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- if or .Values.topologySpreadConstraints .Values.supersetCeleryBeat.topologySpreadConstraints }} + topologySpreadConstraints: + {{- with .Values.topologySpreadConstraints }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.supersetCeleryBeat.topologySpreadConstraints }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- with .Values.tolerations }} tolerations: -{{ toYaml . | indent 8 }} - {{- end }} -{{- if .Values.imagePullSecrets }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.imagePullSecrets }} imagePullSecrets: -{{ toYaml .Values.imagePullSecrets | indent 8 }} + {{- toYaml .Values.imagePullSecrets | nindent 8 }} {{- end }} volumes: - name: superset-config secret: secretName: {{ tpl .Values.configFromSecret . }} + {{- if .Values.extraConfigs }} + - name: superset-extra-config + configMap: + name: {{ template "superset.fullname" . }}-extra-config + {{- end }} {{- with .Values.extraVolumes }} {{- tpl (toYaml .) $ | nindent 8 -}} {{- end }} diff --git a/helm/superset/templates/deployment-flower.yaml b/helm/superset/templates/deployment-flower.yaml new file mode 100644 index 000000000000..aefdf0f7dec6 --- /dev/null +++ b/helm/superset/templates/deployment-flower.yaml @@ -0,0 +1,157 @@ +{{- if .Values.supersetCeleryFlower.enabled -}} +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "superset.fullname" . }}-flower + labels: + app: {{ template "superset.name" . }}-flower + chart: {{ template "superset.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} + {{- if .Values.supersetCeleryFlower.deploymentAnnotations }} + annotations: + {{- toYaml .Values.supersetCeleryFlower.deploymentAnnotations | nindent 4 }} + {{- end }} + namespace: {{ .Release.Namespace }} +spec: + replicas: {{ .Values.supersetCeleryFlower.replicaCount }} + selector: + matchLabels: + app: {{ template "superset.name" . }}-flower + release: {{ .Release.Name }} + template: + metadata: + annotations: + checksum/config: {{ include "superset-config" . | sha256sum }} + checksum/secrets: {{ tpl (toJson .Values.extraSecretEnv) . | sha256sum }} + {{- if .Values.supersetCeleryFlower.podAnnotations }} + {{- toYaml .Values.supersetCeleryFlower.podAnnotations | nindent 8 }} + {{- end }} + labels: + app: "{{ template "superset.name" . }}-flower" + release: {{ .Release.Name }} + {{- if .Values.supersetCeleryFlower.podLabels }} + {{- toYaml .Values.supersetCeleryFlower.podLabels | nindent 8 }} + {{- end }} + spec: + {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} + serviceAccountName: {{ template "superset.serviceAccountName" . }} + {{- end }} + securityContext: + runAsUser: {{ .Values.runAsUser }} + {{- if .Values.supersetCeleryFlower.podSecurityContext }} + {{- toYaml .Values.supersetCeleryFlower.podSecurityContext | nindent 8 }} + {{- end }} + {{- if .Values.supersetCeleryFlower.initContainers }} + initContainers: + {{- tpl (toYaml .Values.supersetCeleryFlower.initContainers) . | nindent 6 }} + {{- end }} + {{- with .Values.hostAliases }} + hostAliases: {{- toYaml . | nindent 6 }} + {{- end }} + containers: + - name: "{{ .Chart.Name }}-flower" + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.supersetCeleryFlower.containerSecurityContext }} + securityContext: {{- toYaml .Values.supersetCeleryFlower.containerSecurityContext | nindent 12 }} + {{- end }} + command: {{ tpl (toJson .Values.supersetCeleryFlower.command) . }} + env: + {{- range $key, $value := .Values.extraEnv }} + - name: {{ $key | quote}} + value: {{ $value | quote }} + {{- end }} + {{- if .Values.extraEnvRaw }} + {{- toYaml .Values.extraEnvRaw | nindent 12 }} + {{- end }} + envFrom: + - secretRef: + name: {{ tpl .Values.envFromSecret . | quote }} + {{- range .Values.envFromSecrets }} + - secretRef: + name: {{ tpl . $ | quote }} + {{- end }} + ports: + - name: flower + containerPort: 5555 + protocol: TCP + volumeMounts: + - name: superset-config + mountPath: {{ .Values.configMountPath | quote }} + readOnly: true + {{- with .Values.extraVolumeMounts }} + {{- tpl (toYaml .) $ | nindent 12 -}} + {{- end }} + {{- if .Values.supersetCeleryFlower.startupProbe }} + startupProbe: + {{- .Values.supersetCeleryFlower.startupProbe | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.supersetCeleryFlower.readinessProbe }} + readinessProbe: + {{- .Values.supersetCeleryFlower.readinessProbe | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.supersetCeleryFlower.livenessProbe }} + livenessProbe: + {{- .Values.supersetCeleryFlower.livenessProbe | toYaml | nindent 12 }} + {{- end }} + resources: + {{- if .Values.supersetCeleryFlower.resources }} + {{- toYaml .Values.supersetCeleryFlower.resources | nindent 12 }} + {{- else }} + {{- toYaml .Values.resources | nindent 12 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if or .Values.affinity .Values.supersetCeleryFlower.affinity }} + affinity: + {{- with .Values.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.supersetCeleryFlower.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- if or .Values.topologySpreadConstraints .Values.supersetCeleryFlower.topologySpreadConstraints }} + topologySpreadConstraints: + {{- with .Values.topologySpreadConstraints }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.supersetCeleryFlower.topologySpreadConstraints }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml .Values.imagePullSecrets | nindent 8 }} + {{- end }} + volumes: + - name: superset-config + secret: + secretName: {{ tpl .Values.configFromSecret . }} + {{- with .Values.extraVolumes }} + {{- tpl (toYaml .) $ | nindent 8 -}} + {{- end }} +{{- end -}} diff --git a/helm/superset/templates/deployment-worker.yaml b/helm/superset/templates/deployment-worker.yaml index 54eb5d87517e..2098064b00ba 100644 --- a/helm/superset/templates/deployment-worker.yaml +++ b/helm/superset/templates/deployment-worker.yaml @@ -23,16 +23,24 @@ metadata: chart: {{ template "superset.chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} +{{- if .Values.supersetWorker.deploymentLabels }} + {{- toYaml .Values.supersetWorker.deploymentLabels | nindent 4 }} +{{- end }} {{- if .Values.supersetWorker.deploymentAnnotations }} annotations: - {{ toYaml .Values.supersetWorker.deploymentAnnotations | nindent 4 }} + {{- toYaml .Values.supersetWorker.deploymentAnnotations | nindent 4 }} {{- end }} + namespace: {{ .Release.Namespace }} spec: - replicas: {{ .Values.replicaCount }} + replicas: {{ .Values.supersetWorker.replicaCount }} selector: matchLabels: app: {{ template "superset.name" . }}-worker release: {{ .Release.Name }} + {{- if .Values.supersetWorker.strategy }} + strategy: + {{- toYaml .Values.supersetWorker.strategy | nindent 4 }} + {{- end }} template: metadata: annotations: @@ -48,13 +56,13 @@ spec: force-reload: {{ randAlphaNum 5 | quote }} {{ end }} {{- if .Values.supersetWorker.podAnnotations }} - {{ toYaml .Values.supersetWorker.podAnnotations | nindent 8 }} + {{- toYaml .Values.supersetWorker.podAnnotations | nindent 8 }} {{- end }} labels: app: {{ template "superset.name" . }}-worker release: {{ .Release.Name }} {{- if .Values.supersetWorker.podLabels }} - {{ toYaml .Values.supersetWorker.podLabels | nindent 8 }} + {{- toYaml .Values.supersetWorker.podLabels | nindent 8 }} {{- end }} spec: {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} @@ -62,17 +70,23 @@ spec: {{- end }} securityContext: runAsUser: {{ .Values.runAsUser }} + {{- if .Values.supersetWorker.podSecurityContext }} + {{- toYaml .Values.supersetWorker.podSecurityContext | nindent 8 }} + {{- end }} {{- if .Values.supersetWorker.initContainers }} initContainers: {{- tpl (toYaml .Values.supersetWorker.initContainers) . | nindent 6 }} {{- end }} {{- with .Values.hostAliases }} - hostAliases: {{ toYaml . | nindent 6 }} + hostAliases: {{- toYaml . | nindent 6 }} {{- end }} containers: - name: {{ .Chart.Name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.supersetWorker.containerSecurityContext }} + securityContext: {{- toYaml .Values.supersetWorker.containerSecurityContext | nindent 12 }} + {{- end }} command: {{ tpl (toJson .Values.supersetWorker.command) . }} env: - name: "SUPERSET_PORT" @@ -95,35 +109,71 @@ spec: - name: superset-config mountPath: {{ .Values.configMountPath | quote }} readOnly: true + {{- if .Values.extraConfigs }} + - name: superset-extra-config + mountPath: {{ .Values.extraConfigMountPath | quote }} + readOnly: true + {{- end }} {{- with .Values.extraVolumeMounts }} {{- tpl (toYaml .) $ | nindent 12 -}} {{- end }} + {{- if .Values.supersetWorker.startupProbe }} + startupProbe: + {{- .Values.supersetWorker.startupProbe | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.supersetWorker.readinessProbe }} + readinessProbe: + {{- .Values.supersetWorker.readinessProbe | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.supersetWorker.livenessProbe }} + livenessProbe: + {{- .Values.supersetWorker.livenessProbe | toYaml | nindent 12 }} + {{- end }} resources: {{- if .Values.supersetWorker.resources }} -{{ toYaml .Values.supersetWorker.resources | indent 12 }} + {{- toYaml .Values.supersetWorker.resources | nindent 12 }} {{- else }} -{{ toYaml .Values.resources | indent 12 }} + {{- toYaml .Values.resources | nindent 12 }} {{- end }} - {{- with .Values.nodeSelector }} + {{- with .Values.nodeSelector }} nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if or .Values.affinity .Values.supersetWorker.affinity }} affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.tolerations }} + {{- with .Values.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.supersetWorker.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- if or .Values.topologySpreadConstraints .Values.supersetWorker.topologySpreadConstraints }} + topologySpreadConstraints: + {{- with .Values.topologySpreadConstraints }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.supersetWorker.topologySpreadConstraints }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- with .Values.tolerations }} tolerations: -{{ toYaml . | indent 8 }} - {{- end }} -{{- if .Values.imagePullSecrets }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.imagePullSecrets }} imagePullSecrets: -{{ toYaml .Values.imagePullSecrets | indent 8 }} + {{- toYaml .Values.imagePullSecrets | nindent 8 }} {{- end }} volumes: - name: superset-config secret: secretName: {{ tpl .Values.configFromSecret . }} - {{- with .Values.extraVolumes }} - {{- tpl (toYaml .) $ | nindent 8 -}} - {{- end }} + {{- if .Values.extraConfigs }} + - name: superset-extra-config + configMap: + name: {{ template "superset.fullname" . }}-extra-config + {{- end }} + {{- with .Values.extraVolumes }} + {{- tpl (toYaml .) $ | nindent 8 -}} + {{- end }} diff --git a/helm/superset/templates/deployment-ws.yaml b/helm/superset/templates/deployment-ws.yaml new file mode 100644 index 000000000000..0bbc822ef915 --- /dev/null +++ b/helm/superset/templates/deployment-ws.yaml @@ -0,0 +1,153 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +{{- if .Values.supersetWebsockets.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "{{ template "superset.fullname" . }}-ws" + labels: + app: "{{ template "superset.name" . }}-ws" + chart: {{ template "superset.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +{{- if .Values.supersetWebsockets.deploymentAnnotations }} + annotations: + {{- toYaml .Values.supersetWebsockets.deploymentAnnotations | nindent 4 }} +{{- end }} + namespace: {{ .Release.Namespace }} +spec: + replicas: {{ .Values.supersetWebsockets.replicaCount }} + selector: + matchLabels: + app: "{{ template "superset.name" . }}-ws" + release: {{ .Release.Name }} + {{- if .Values.supersetWebsockets.strategy }} + strategy: + {{- toYaml .Values.supersetWebsockets.strategy | nindent 4 }} + {{- end }} + template: + metadata: + annotations: + checksum/wsconfig: {{ tpl (toJson .Values.supersetWebsockets.config) . | sha256sum }} + checksum/secrets: {{ tpl (toJson .Values.extraSecretEnv) . | sha256sum }} + {{- if .Values.supersetWebsockets.podAnnotations }} + {{- toYaml .Values.supersetWebsockets.podAnnotations | nindent 8 }} + {{- end }} + labels: + app: "{{ template "superset.name" . }}-ws" + release: {{ .Release.Name }} + {{- if .Values.supersetWebsockets.podLabels }} + {{- toYaml .Values.supersetWebsockets.podLabels | nindent 8 }} + {{- end }} + spec: + {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} + serviceAccountName: {{ template "superset.serviceAccountName" . }} + {{- end }} + securityContext: + runAsUser: {{ .Values.runAsUser }} + {{- if .Values.supersetWebsockets.podSecurityContext }} + {{- toYaml .Values.supersetWebsockets.podSecurityContext | nindent 8 }} + {{- end }} + {{- with .Values.hostAliases }} + hostAliases: {{- toYaml . | nindent 6 }} + {{- end }} + containers: + - name: "{{ .Chart.Name }}-ws" + image: "{{ .Values.supersetWebsockets.image.repository }}:{{ .Values.supersetWebsockets.image.tag }}" + imagePullPolicy: {{ .Values.supersetWebsockets.image.pullPolicy }} + {{- if .Values.supersetWebsockets.containerSecurityContext }} + securityContext: {{- toYaml .Values.supersetWebsockets.containerSecurityContext | nindent 12 }} + {{- end }} + command: {{ tpl (toJson .Values.supersetWebsockets.command) . }} + # Passing all the envs is a bit blunt... we only need a few (see https://github.com/apache/superset/blob/master/superset-websocket/src/config.ts)... + env: + {{- range $key, $value := .Values.extraEnv }} + - name: {{ $key | quote}} + value: {{ $value | quote }} + {{- end }} + {{- if .Values.extraEnvRaw }} + {{- toYaml .Values.extraEnvRaw | nindent 12 }} + {{- end }} + envFrom: + - secretRef: + name: {{ tpl .Values.envFromSecret . | quote }} + {{- range .Values.envFromSecrets }} + - secretRef: + name: {{ tpl . $ | quote }} + {{- end }} + ports: + - name: ws + containerPort: {{ .Values.supersetWebsockets.config.port }} + protocol: TCP + volumeMounts: + - name: superset-ws-config + mountPath: /home/superset-websocket/config.json + subPath: config.json + readOnly: true + resources: + {{- if .Values.supersetWebsockets.resources }} + {{- toYaml .Values.supersetWebsockets.resources | nindent 12 }} + {{- else }} + {{- toYaml .Values.resources | nindent 12 }} + {{- end }} + {{- if .Values.supersetWebsockets.startupProbe }} + startupProbe: + {{- .Values.supersetWebsockets.startupProbe | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.supersetWebsockets.readinessProbe }} + readinessProbe: + {{- .Values.supersetWebsockets.readinessProbe | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.supersetWebsockets.livenessProbe }} + livenessProbe: + {{- .Values.supersetWebsockets.livenessProbe | toYaml | nindent 12 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if or .Values.affinity .Values.supersetWebsockets.affinity }} + affinity: + {{- with .Values.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.supersetWebsockets.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- if or .Values.topologySpreadConstraints .Values.supersetWebsockets.topologySpreadConstraints }} + topologySpreadConstraints: + {{- with .Values.topologySpreadConstraints }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.supersetWebsockets.topologySpreadConstraints }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml .Values.imagePullSecrets | nindent 8 }} + {{- end }} + volumes: + - name: superset-ws-config + secret: + secretName: "{{ template "superset.fullname" . }}-ws-config" +{{- end }} diff --git a/helm/superset/templates/deployment.yaml b/helm/superset/templates/deployment.yaml index 4d3a42e8e20a..6b2a3933ea35 100644 --- a/helm/superset/templates/deployment.yaml +++ b/helm/superset/templates/deployment.yaml @@ -23,12 +23,20 @@ metadata: chart: {{ template "superset.chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} +{{- if .Values.supersetNode.deploymentLabels }} + {{- toYaml .Values.supersetNode.deploymentLabels | nindent 4 }} +{{- end }} {{- if .Values.supersetNode.deploymentAnnotations }} annotations: - {{ toYaml .Values.supersetNode.deploymentAnnotations | nindent 4 }} + {{- toYaml .Values.supersetNode.deploymentAnnotations | nindent 4 }} {{- end }} + namespace: {{ .Release.Namespace }} spec: - replicas: {{ .Values.replicaCount }} + replicas: {{ .Values.supersetNode.replicaCount }} + {{- if .Values.supersetNode.strategy }} + strategy: + {{- toYaml .Values.supersetNode.strategy | nindent 4 }} + {{- end }} selector: matchLabels: app: {{ template "superset.name" . }} @@ -51,13 +59,13 @@ spec: force-reload: {{ randAlphaNum 5 | quote }} {{- end }} {{- if .Values.supersetNode.podAnnotations }} - {{ toYaml .Values.supersetNode.podAnnotations | nindent 8 }} + {{- toYaml .Values.supersetNode.podAnnotations | nindent 8 }} {{- end }} labels: app: {{ template "superset.name" . }} release: {{ .Release.Name }} {{- if .Values.supersetNode.podLabels }} - {{ toYaml .Values.supersetNode.podLabels | nindent 8 }} + {{- toYaml .Values.supersetNode.podLabels | nindent 8 }} {{- end }} spec: {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} @@ -65,17 +73,23 @@ spec: {{- end }} securityContext: runAsUser: {{ .Values.runAsUser }} + {{- if .Values.supersetNode.podSecurityContext }} + {{- toYaml .Values.supersetNode.podSecurityContext | nindent 8 }} + {{- end }} {{- if .Values.supersetNode.initContainers }} initContainers: {{- tpl (toYaml .Values.supersetNode.initContainers) . | nindent 6 }} {{- end }} {{- with .Values.hostAliases }} - hostAliases: {{ toYaml . | nindent 6 }} + hostAliases: {{- toYaml . | nindent 6 }} {{- end }} containers: - name: {{ .Chart.Name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.supersetNode.containerSecurityContext }} + securityContext: {{- toYaml .Values.supersetNode.containerSecurityContext | nindent 12 }} + {{- end }} command: {{ tpl (toJson .Values.supersetNode.command) . }} env: - name: "SUPERSET_PORT" @@ -114,27 +128,53 @@ spec: - name: http containerPort: {{ .Values.service.port }} protocol: TCP + {{- if .Values.supersetNode.startupProbe }} + startupProbe: + {{- .Values.supersetNode.startupProbe | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.supersetNode.readinessProbe }} + readinessProbe: + {{- .Values.supersetNode.readinessProbe | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.supersetNode.livenessProbe }} + livenessProbe: + {{- .Values.supersetNode.livenessProbe | toYaml | nindent 12 }} + {{- end }} resources: {{- if .Values.supersetNode.resources }} -{{ toYaml .Values.supersetNode.resources | indent 12 }} + {{- toYaml .Values.supersetNode.resources | nindent 12 }} {{- else }} -{{ toYaml .Values.resources | indent 12 }} + {{- toYaml .Values.resources | nindent 12 }} {{- end }} - {{- with .Values.nodeSelector }} + {{- with .Values.nodeSelector }} nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if or .Values.affinity .Values.supersetNode.affinity }} affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.tolerations }} + {{- with .Values.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.supersetNode.affinity }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- if or .Values.topologySpreadConstraints .Values.supersetNode.topologySpreadConstraints }} + topologySpreadConstraints: + {{- with .Values.topologySpreadConstraints }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.supersetNode.topologySpreadConstraints }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- with .Values.tolerations }} tolerations: -{{ toYaml . | indent 8 }} - {{- end }} -{{- if .Values.imagePullSecrets }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.imagePullSecrets }} imagePullSecrets: -{{ toYaml .Values.imagePullSecrets | indent 8 }} + {{- toYaml .Values.imagePullSecrets | nindent 8 }} {{- end }} volumes: diff --git a/helm/superset/templates/ingress.yaml b/helm/superset/templates/ingress.yaml index 2a151ccc2e3e..d166149c00ba 100644 --- a/helm/superset/templates/ingress.yaml +++ b/helm/superset/templates/ingress.yaml @@ -25,10 +25,11 @@ metadata: chart: {{ template "superset.chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} -{{- with .Values.ingress.annotations }} + {{- with .Values.ingress.annotations }} annotations: -{{ toYaml . | indent 4 }} -{{- end }} + {{- toYaml . | nindent 4 }} + {{- end }} + namespace: {{ .Release.Namespace }} spec: {{- if .Values.ingress.ingressClassName }} ingressClassName: {{ .Values.ingress.ingressClassName }} @@ -55,5 +56,14 @@ spec: name: {{ $fullName }} port: name: http + {{- if $.Values.supersetWebsockets.enabled }} + - path: {{ $.Values.supersetWebsockets.ingress.path }} + pathType: {{ $.Values.supersetWebsockets.ingress.pathType }} + backend: + service: + name: "{{ template "superset.fullname" $ }}-ws" + port: + name: ws + {{- end }} {{- end }} {{- end }} diff --git a/helm/superset/templates/init-job.yaml b/helm/superset/templates/init-job.yaml index 483ced8d3702..8555253881ab 100644 --- a/helm/superset/templates/init-job.yaml +++ b/helm/superset/templates/init-job.yaml @@ -22,13 +22,14 @@ metadata: annotations: "helm.sh/hook": post-install,post-upgrade "helm.sh/hook-delete-policy": "before-hook-creation" + namespace: {{ .Release.Namespace }} spec: template: metadata: name: {{ template "superset.name" . }}-init-db {{- if .Values.init.podAnnotations }} annotations: - {{ toYaml .Values.init.podAnnotations | nindent 8 }} + {{- toYaml .Values.init.podAnnotations | nindent 8 }} {{- end }} spec: {{- if or (.Values.serviceAccount.create) (.Values.serviceAccountName) }} @@ -36,13 +37,16 @@ spec: {{- end }} securityContext: runAsUser: {{ .Values.runAsUser }} + {{- if .Values.init.podSecurityContext }} + {{- toYaml .Values.init.podSecurityContext | nindent 8 }} + {{- end }} {{- if .Values.init.initContainers }} initContainers: {{- tpl (toYaml .Values.init.initContainers) . | nindent 6 }} {{- end }} containers: - name: {{ template "superset.name" . }}-init-db - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" {{- if or .Values.extraEnv .Values.extraEnvRaw }} env: {{- range $key, $value := .Values.extraEnv }} @@ -61,6 +65,9 @@ spec: name: {{ tpl . $ }} {{- end }} imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.init.containerSecurityContext }} + securityContext: {{- toYaml .Values.init.containerSecurityContext | nindent 12 }} + {{- end }} volumeMounts: - name: superset-config mountPath: {{ .Values.configMountPath | quote }} @@ -75,10 +82,10 @@ spec: {{- end }} command: {{ tpl (toJson .Values.init.command) . }} resources: -{{ toYaml .Values.init.resources | indent 10 }} -{{- if .Values.imagePullSecrets }} + {{- toYaml .Values.init.resources | nindent 10 }} + {{- if .Values.imagePullSecrets }} imagePullSecrets: -{{ toYaml .Values.imagePullSecrets | indent 8 }} + {{- toYaml .Values.imagePullSecrets | nindent 8 }} {{- end }} volumes: - name: superset-config diff --git a/helm/superset/templates/secret-env.yaml b/helm/superset/templates/secret-env.yaml index 412650732443..0164d96a8c12 100644 --- a/helm/superset/templates/secret-env.yaml +++ b/helm/superset/templates/secret-env.yaml @@ -23,6 +23,7 @@ metadata: chart: {{ template "superset.chart" . }} release: "{{ .Release.Name }}" heritage: "{{ .Release.Service }}" + namespace: {{ .Release.Namespace }} type: Opaque stringData: REDIS_HOST: {{ tpl .Values.supersetNode.connections.redis_host . | quote }} diff --git a/helm/superset/templates/secret-superset-config.yaml b/helm/superset/templates/secret-superset-config.yaml index ddf0befcd2f2..c1f4102858d9 100644 --- a/helm/superset/templates/secret-superset-config.yaml +++ b/helm/superset/templates/secret-superset-config.yaml @@ -23,6 +23,7 @@ metadata: chart: {{ template "superset.chart" . }} release: "{{ .Release.Name }}" heritage: "{{ .Release.Service }}" + namespace: {{ .Release.Namespace }} type: Opaque stringData: superset_config.py: | diff --git a/helm/superset/templates/secret-ws.yaml b/helm/superset/templates/secret-ws.yaml new file mode 100644 index 000000000000..c3ac55d96cb0 --- /dev/null +++ b/helm/superset/templates/secret-ws.yaml @@ -0,0 +1,32 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +{{- if .Values.supersetWebsockets.enabled }} +apiVersion: v1 +kind: Secret +metadata: + name: "{{ template "superset.fullname" . }}-ws-config" + labels: + app: {{ template "superset.fullname" . }} + chart: {{ template "superset.chart" . }} + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + namespace: {{ .Release.Namespace }} +type: Opaque +stringData: + config.json: | + {{- tpl (toJson .Values.supersetWebsockets.config) . | nindent 6 }} +{{- end }} diff --git a/helm/superset/templates/service-account.yaml b/helm/superset/templates/service-account.yaml index 680b13737019..994ad8333afd 100755 --- a/helm/superset/templates/service-account.yaml +++ b/helm/superset/templates/service-account.yaml @@ -28,4 +28,8 @@ metadata: kubernetes.io/cluster-service: "true" {{- end }} addonmanager.kubernetes.io/mode: Reconcile + {{- if .Values.serviceAccount.annotations }} + annotations: {{- toYaml .Values.serviceAccount.annotations | nindent 4 }} + {{- end }} + namespace: {{ .Release.Namespace }} {{- end -}} diff --git a/helm/superset/templates/service.yaml b/helm/superset/templates/service.yaml index 0124ad2a9d04..97db594a2395 100644 --- a/helm/superset/templates/service.yaml +++ b/helm/superset/templates/service.yaml @@ -27,6 +27,7 @@ metadata: annotations: {{- toYaml . | nindent 4 }} {{- end }} + namespace: {{ .Release.Namespace }} spec: type: {{ .Values.service.type }} ports: @@ -34,9 +35,78 @@ spec: targetPort: http protocol: TCP name: http + {{- if and (or (eq .Values.service.type "NodePort") (eq .Values.service.type "LoadBalancer")) (not (empty .Values.service.nodePort.http)) }} + nodePort: {{ .Values.service.nodePort.http }} + {{- end }} selector: app: {{ template "superset.name" . }} release: {{ .Release.Name }} {{- if .Values.service.loadBalancerIP }} loadBalancerIP: {{ .Values.service.loadBalancerIP }} {{- end }} +--- +{{- if .Values.supersetCeleryFlower.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: "{{ template "superset.fullname" . }}-flower" + labels: + app: {{ template "superset.name" . }} + chart: {{ template "superset.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} + {{- with .Values.supersetCeleryFlower.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + namespace: {{ .Release.Namespace }} +spec: + type: {{ .Values.supersetCeleryFlower.service.type }} + ports: + - port: {{ .Values.supersetCeleryFlower.service.port }} + targetPort: flower + protocol: TCP + name: flower + {{- if and (or (eq .Values.supersetCeleryFlower.service.type "NodePort") (eq .Values.supersetCeleryFlower.service.type "LoadBalancer")) (not (empty .Values.supersetCeleryFlower.service.nodePort.http)) }} + nodePort: {{ .Values.supersetCeleryFlower.service.nodePort.http }} + {{- end }} + selector: + app: {{ template "superset.name" . }}-flower + release: {{ .Release.Name }} + {{- if .Values.supersetCeleryFlower.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.supersetCeleryFlower.service.loadBalancerIP }} + {{- end }} +{{- end }} +--- +{{- if .Values.supersetWebsockets.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: "{{ template "superset.fullname" . }}-ws" + labels: + app: {{ template "superset.name" . }} + chart: {{ template "superset.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} + {{- with .Values.supersetWebsockets.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + namespace: {{ .Release.Namespace }} +spec: + type: {{ .Values.supersetWebsockets.service.type }} + ports: + - port: {{ .Values.supersetWebsockets.service.port }} + targetPort: ws + protocol: TCP + name: ws + {{- if and (or (eq .Values.supersetWebsockets.service.type "NodePort") (eq .Values.supersetWebsockets.service.type "LoadBalancer")) (not (empty .Values.supersetWebsockets.service.nodePort.http)) }} + nodePort: {{ .Values.supersetWebsockets.service.nodePort.http }} + {{- end }} + selector: + app: "{{ template "superset.name" . }}-ws" + release: {{ .Release.Name }} + {{- if .Values.supersetWebsockets.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.supersetWebsockets.service.loadBalancerIP }} + {{- end }} +{{- end }} diff --git a/helm/superset/values.schema.json b/helm/superset/values.schema.json deleted file mode 100644 index 6c4359a0ff94..000000000000 --- a/helm/superset/values.schema.json +++ /dev/null @@ -1,607 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "type": "object", - "additionalProperties": true, - "properties": { - "replicaCount": { - "type": "integer" - }, - "runAsUser": { - "type": "integer" - }, - "serviceAccount": { - "type": "object", - "additionalProperties": false, - "properties": { - "create": { - "type": "boolean" - } - }, - "required": [ - "create" - ] - }, - "bootstrapScript": { - "type": "string" - }, - "configFromSecret": { - "type": "string" - }, - "envFromSecret": { - "type": "string" - }, - "envFromSecrets": { - "type": "array" - }, - "extraEnv": { - "type": "object" - }, - "extraEnvRaw": { - "type": "array" - }, - "extraSecretEnv": { - "type": "object" - }, - "extraConfigs": { - "type": "object" - }, - "extraSecrets": { - "type": "object" - }, - "extraVolumes": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.apps.v1.PodSpec/properties/volumes" - }, - "extraVolumeMounts": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.apps.v1.PodSpec/properties/volumeMounts" - }, - "configOverrides": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "properties": { - "extend_timeout": { - "type": "string" - }, - "enable_oauth": { - "type": "string" - } - } - }, - "configOverridesFiles": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "properties": { - "extend_timeout": { - "type": "string" - }, - "enable_oauth": { - "type": "string" - } - } - }, - "configMountPath": { - "type": "string" - }, - "extraConfigMountPath": { - "type": "string" - }, - "image": { - "type": "object", - "additionalProperties": false, - "properties": { - "repository": { - "type": "string" - }, - "tag": { - "type": "string" - }, - "pullPolicy": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.Container/properties/imagePullPolicy" - } - }, - "required": [ - "repository", - "tag", - "pullPolicy" - ] - }, - "imagePullSecrets": { - "type": "array" - }, - "initImage": { - "type": "object", - "additionalProperties": false, - "properties": { - "repository": { - "type": "string" - }, - "tag": { - "type": "string" - }, - "pullPolicy": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.Container/properties/imagePullPolicy" - } - }, - "required": [ - "repository", - "tag", - "pullPolicy" - ] - }, - "service": { - "type": "object", - "additionalProperties": false, - "properties": { - "type": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.ServiceSpec/properties/type" - }, - "port": { - "type": "integer" - }, - "annotations": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta/properties/annotations" - }, - "loadBalancerIP": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.ServiceSpec/properties/loadBalancerIP" - } - }, - "required": [ - "type", - "port" - ] - }, - "ingress": { - "type": "object", - "additionalProperties": false, - "properties": { - "enabled": { - "type": "boolean" - }, - "annotations": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta/properties/annotations" - }, - "path": { - "type": "string" - }, - "pathType": { - "type": "string" - }, - "ingressClassName": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.networking.v1.IngressSpec/properties/ingressClassName" - }, - "hosts": { - "type": "array", - "items": { - "type": "string" - } - }, - "tls": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": false, - "properties": { - "secretName": { - "type": "string" - }, - "hosts": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "enabled", - "annotations", - "path", - "pathType", - "hosts", - "tls" - ] - }, - "resources": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.Container/properties/resources" - }, - "hostAliases": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.PodSpec/properties/hostAliases" - }, - "supersetNode": { - "type": "object", - "additionalProperties": false, - "properties": { - "command": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.Container/properties/command" - }, - "connections": { - "type": "object", - "additionalProperties": false, - "properties": { - "redis_host": { - "type": "string" - }, - "redis_password": { - "type": "string" - }, - "redis_port": { - "type": "string" - }, - "db_host": { - "type": "string" - }, - "db_port": { - "type": "string" - }, - "db_user": { - "type": "string" - }, - "db_pass": { - "type": "string" - }, - "db_name": { - "type": "string" - } - }, - "required": [ - "redis_host", - "redis_port", - "db_host", - "db_port", - "db_user", - "db_pass", - "db_name" - ] - }, - "env": { - "type": "object" - }, - "forceReload": { - "type": "boolean" - }, - "initContainers": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.PodSpec/properties/initContainers" - }, - "deploymentAnnotations": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta/properties/annotations" - }, - "podAnnotations": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta/properties/annotations" - }, - "podLabels": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta/properties/labels" - }, - "resources": { - "type": "object" - } - }, - "required": [ - "command", - "connections", - "env", - "forceReload" - ] - }, - "supersetWorker": { - "type": "object", - "additionalProperties": false, - "properties": { - "command": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.Container/properties/command" - }, - "forceReload": { - "type": "boolean" - }, - "initContainers": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.PodSpec/properties/initContainers" - }, - "deploymentAnnotations": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta/properties/annotations" - }, - "podAnnotations": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta/properties/annotations" - }, - "podLabels": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta/properties/labels" - }, - "resources": { - "type": "object" - } - }, - "required": [ - "command", - "forceReload" - ] - }, - "supersetCeleryBeat": { - "type": "object", - "additionalProperties": false, - "properties": { - "enabled": { - "type": "boolean" - }, - "command": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.Container/properties/command" - }, - "forceReload": { - "type": "boolean" - }, - "initContainers": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.PodSpec/properties/initContainers" - }, - "deploymentAnnotations": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta/properties/annotations" - }, - "podAnnotations": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta/properties/annotations" - }, - "podLabels": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta/properties/labels" - }, - "resources": { - "type": "object" - } - }, - "required": [ - "enabled", - "command", - "forceReload" - ] - }, - "init": { - "type": "object", - "additionalProperties": false, - "properties": { - "resources": { - "type": "object" - }, - "command": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.Container/properties/command" - }, - "enabled": { - "type": "boolean" - }, - "loadExamples": { - "type": "boolean" - }, - "createAdmin": { - "type": "boolean" - }, - "adminUser": { - "type": "object", - "additionalProperties": false, - "properties": { - "username": { - "type": "string" - }, - "firstname": { - "type": "string" - }, - "lastname": { - "type": "string" - }, - "email": { - "type": "string" - }, - "password": { - "type": "string" - } - }, - "required": [ - "username", - "firstname", - "lastname", - "email", - "password" - ] - }, - "initContainers": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.core.v1.PodSpec/properties/initContainers" - }, - "initscript": { - "type": "string" - }, - "podAnnotations": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta/properties/annotations" - } - }, - "required": [ - "resources", - "command", - "enabled", - "loadExamples", - "createAdmin", - "adminUser", - "initscript" - ] - }, - "postgresql": { - "type": "object", - "properties": { - "auth": { - "type": "object", - "properties": { - "database": { - "type": "string" - }, - "existingSecret": { - "type": [ - "string", - "null" - ] - }, - "password": { - "type": "string" - }, - "username": { - "type": "string" - } - } - }, - "enabled": { - "type": "boolean" - }, - "primary": { - "type": "object", - "properties": { - "persistence": { - "type": "object", - "properties": { - "accessModes": { - "type": "array", - "items": { - "type": "string" - } - }, - "enabled": { - "type": "boolean" - } - } - }, - "service": { - "type": "object", - "properties": { - "ports": { - "type": "object", - "properties": { - "postgresql": { - "type": "string" - } - } - } - } - } - } - } - } - }, - "redis": { - "type": "object", - "additionalProperties": true, - "properties": { - "enabled": { - "type": "boolean" - }, - "architecture": { - "type": "string" - }, - "auth": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean" - }, - "existingSecret": { - "type": "string" - }, - "existingSecretKey": { - "type": "string" - }, - "password": { - "type": "string" - } - }, - "required": [ - "enabled" - ] - }, - "master": { - "type": "object", - "additionalProperties": true, - "properties": { - "persistence": { - "type": "object", - "additionalProperties": true, - "properties": { - "enabled": { - "type": "boolean" - }, - "accessModes": { - "type": "array", - "items": [ - { - "type": "string" - } - ] - } - }, - "required": [ - "enabled", - "accessModes" - ] - } - }, - "required": [ - "persistence" - ] - }, - "cluster": { - "type": "object", - "additionalProperties": true, - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": [ - "enabled" - ] - } - }, - "required": [ - "enabled", - "architecture", - "master" - ] - }, - "nodeSelector": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.apps.v1.PodSpec/properties/nodeSelector" - }, - "tolerations": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json##/definitions/io.k8s.api.apps.v1.PodSpec/properties/tolerations" - }, - "affinity": { - "$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.23.0/_definitions.json#/definitions/io.k8s.api.core.v1.Affinity" - } - }, - "required": [ - "replicaCount", - "runAsUser", - "serviceAccount", - "bootstrapScript", - "configFromSecret", - "envFromSecret", - "envFromSecrets", - "extraEnv", - "extraEnvRaw", - "extraSecretEnv", - "extraConfigs", - "extraSecrets", - "extraVolumes", - "extraVolumeMounts", - "configOverrides", - "configOverridesFiles", - "configMountPath", - "extraConfigMountPath", - "image", - "imagePullSecrets", - "service", - "ingress", - "resources", - "hostAliases", - "supersetNode", - "supersetWorker", - "supersetCeleryBeat", - "init", - "postgresql", - "redis", - "nodeSelector", - "tolerations", - "affinity" - ] -} diff --git a/helm/superset/values.yaml b/helm/superset/values.yaml index 197ec4b3c6e7..a212754e3916 100644 --- a/helm/superset/values.yaml +++ b/helm/superset/values.yaml @@ -19,19 +19,22 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. -replicaCount: 1 +# A README is automatically generated from this file to document it, using helm-docs (see https://github.com/norwoodj/helm-docs) +# To update it, install helm-docs and run helm-docs from the root of this chart -# User ID directive. This user must have enough permissions to run the bootstrap script -# Runn containers as root is not recommended in production. Change this to another UID - e.g. 1000 to be more secure +# -- User ID directive. This user must have enough permissions to run the bootstrap script +# Running containers as root is not recommended in production. Change this to another UID - e.g. 1000 to be more secure runAsUser: 0 -# Create custom service account for Superset. If create: true and name is not provided, superset.fullname will be used. # serviceAccountName: superset serviceAccount: + # -- Create custom service account for Superset. If create: true and name is not provided, `superset.fullname` will be used. create: false + annotations: {} -# Install additional packages and do any other bootstrap configuration in this script +# -- Install additional packages and do any other bootstrap configuration in this script # For production clusters it's recommended to build own image with this step done in CI +# @default -- see `values.yaml` bootstrapScript: | #!/bin/bash rm -rf /var/lib/apt/lists/* && \ @@ -40,33 +43,43 @@ bootstrapScript: | redis==3.5.3 && \ if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi -## The name of the secret which we will use to generate a superset_config.py file -## Note: this secret must have the key superset_config.py in it and can include other files as well -## +# -- The name of the secret which we will use to generate a superset_config.py file +# Note: this secret must have the key superset_config.py in it and can include other files as well configFromSecret: '{{ template "superset.fullname" . }}-config' -## The name of the secret which we will use to populate env vars in deployed pods -## This can be useful for secret keys, etc. -## +# -- The name of the secret which we will use to populate env vars in deployed pods +# This can be useful for secret keys, etc. envFromSecret: '{{ template "superset.fullname" . }}-env' -## This can be a list of template strings +# -- This can be a list of templated strings envFromSecrets: [] -## Extra environment variables that will be passed into pods -## -extraEnv: {} +# -- Extra environment variables that will be passed into pods +extraEnv: + {} + # Different gunicorn settings, refer to the gunicorn documentation + # https://docs.gunicorn.org/en/stable/settings.html# + # These variables are used as Flags at the gunicorn startup + # https://github.com/apache/superset/blob/master/docker/run-server.sh#L22 # Extend timeout to allow long running queries. # GUNICORN_TIMEOUT: 300 - + # Increase the gunicorn worker amount, can improve performance drastically + # See: https://docs.gunicorn.org/en/stable/design.html#how-many-workers + # SERVER_WORKER_AMOUNT: 4 + # WORKER_MAX_REQUESTS: 0 + # WORKER_MAX_REQUESTS_JITTER: 0 + # SERVER_THREADS_AMOUNT: 20 + # GUNICORN_KEEPALIVE: 2 + # SERVER_LIMIT_REQUEST_LINE: 0 + # SERVER_LIMIT_REQUEST_FIELD_SIZE: 0 # OAUTH_HOME_DOMAIN: .. # # If a whitelist is not set, any address that can use your OAuth2 endpoint will be able to login. # # this includes any random Gmail address if your OAuth2 Web App is set to External. # OAUTH_WHITELIST_REGEX: ... -## Extra environment variables in RAW format that will be passed into pods -## -extraEnvRaw: [] +# -- Extra environment variables in RAW format that will be passed into pods +extraEnvRaw: + [] # Load DB password from other secret (e.g. for zalando operator) # - name: DB_PASS # valueFrom: @@ -74,15 +87,17 @@ extraEnvRaw: [] # name: superset.superset-postgres.credentials.postgresql.acid.zalan.do # key: password -## Extra environment variables to pass as secrets -## -extraSecretEnv: {} +# -- Extra environment variables to pass as secrets +extraSecretEnv: + {} # MAPBOX_API_KEY: ... # # Google API Keys: https://console.cloud.google.com/apis/credentials # GOOGLE_KEY: ... # GOOGLE_SECRET: ... -extraConfigs: {} +# -- Extra files to mount on `/app/pythonpath` +extraConfigs: + {} # import_datasources.yaml: | # databases: # - allow_file_upload: true @@ -95,34 +110,38 @@ extraConfigs: {} # sqlalchemy_uri: example://example-db.local # tables: [] +# -- Extra files to mount on `/app/pythonpath` as secrets extraSecrets: {} -extraVolumes: [] - # - name: customConfig - # configMap: - # name: '{{ template "superset.fullname" . }}-custom-config' - # - name: additionalSecret - # secret: - # secretName: my-secret - # defaultMode: 0600 - -extraVolumeMounts: [] - # - name: customConfig - # mountPath: /mnt/config - # readOnly: true - # - name: additionalSecret: - # mountPath: /mnt/secret - -# A dictionary of overrides to append at the end of superset_config.py - the name does not matter +extraVolumes: + [] + # - name: customConfig + # configMap: + # name: '{{ template "superset.fullname" . }}-custom-config' + # - name: additionalSecret + # secret: + # secretName: my-secret + # defaultMode: 0600 + +extraVolumeMounts: + [] + # - name: customConfig + # mountPath: /mnt/config + # readOnly: true + # - name: additionalSecret: + # mountPath: /mnt/secret + +# -- A dictionary of overrides to append at the end of superset_config.py - the name does not matter # WARNING: the order is not guaranteed -configOverrides: {} - # extend_timeout: | +# Files can be passed as helm --set-file configOverrides.my-override=my-file.py +configOverrides: + {} + # extend_timeout: | # # Extend timeout to allow long running queries. # SUPERSET_WEBSERVER_TIMEOUT = ... # enable_oauth: | # from flask_appbuilder.security.manager import (AUTH_DB, AUTH_OAUTH) # AUTH_TYPE = AUTH_OAUTH - # OAUTH_PROVIDERS = [ # { # "name": "google", @@ -151,39 +170,45 @@ configOverrides: {} # secret: | # # Generate your own secret key for encryption. Use openssl rand -base64 42 to generate a good key # SECRET_KEY = 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY' -# Same as above but the values are files -configOverridesFiles: {} + +# -- Same as above but the values are files +configOverridesFiles: + {} # extend_timeout: extend_timeout.py # enable_oauth: enable_oauth.py - configMountPath: "/app/pythonpath" extraConfigMountPath: "/app/configs" image: repository: apache/superset - tag: latest + tag: "" pullPolicy: IfNotPresent imagePullSecrets: [] initImage: - repository: busybox + repository: jwilder/dockerize tag: latest pullPolicy: IfNotPresent service: type: ClusterIP port: 8088 - annotations: {} + annotations: + {} # cloud.google.com/load-balancer-type: "Internal" loadBalancerIP: null + nodePort: + # -- (int) + http: nil ingress: enabled: false # ingressClassName: nginx - annotations: {} + annotations: + {} # kubernetes.io/tls-acme: "true" ## Extend timeout to allow long running queries. # nginx.ingress.kubernetes.io/proxy-connect-timeout: "300" @@ -198,7 +223,8 @@ ingress: # hosts: # - chart-example.local -resources: {} +resources: + {} # We usually recommend not to specify default resources and to leave this as a conscious # choice for the user. This also increases chances charts run on environments with little # resources, such as Minikube. If you do want to specify resources, uncomment the following @@ -212,24 +238,24 @@ resources: {} # cpu: 100m # memory: 128Mi -## -## Custom hostAliases for all superset pods +# -- Custom hostAliases for all superset pods ## https://kubernetes.io/docs/tasks/network/customize-hosts-file-for-pods/ hostAliases: [] # - hostnames: # - nodns.my.lan # ip: 18.27.36.45 - -## -## Superset node configuration +# Superset node configuration supersetNode: + replicaCount: 1 + # -- Startup command + # @default -- See `values.yaml` command: - "/bin/sh" - "-c" - ". {{ .Values.configMountPath }}/superset_bootstrap.sh; /usr/bin/run-server.sh" connections: - # Change in case of bringing your own redis and then also set redis.enabled:false + # -- Change in case of bringing your own redis and then also set redis.enabled:false redis_host: '{{ template "superset.fullname" . }}-redis-headless' # redis_password: superset redis_port: "6379" @@ -240,106 +266,372 @@ supersetNode: db_pass: superset db_name: superset env: {} - forceReload: false # If true, forces deployment to reload on each upgrade + # -- If true, forces deployment to reload on each upgrade + forceReload: false + # -- Init containers + # @default -- a container waiting for postgres initContainers: - name: wait-for-postgres image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}" imagePullPolicy: "{{ .Values.initImage.pullPolicy }}" envFrom: - secretRef: - name: '{{ tpl .Values.envFromSecret . }}' - command: [ "/bin/sh", "-c", "until nc -zv $DB_HOST $DB_PORT -w1; do echo 'waiting for db'; sleep 1; done" ] - ## Annotations to be added to supersetNode deployment + name: "{{ tpl .Values.envFromSecret . }}" + command: + - /bin/sh + - -c + - dockerize -wait "tcp://$DB_HOST:$DB_PORT" -timeout 120s + + # -- Annotations to be added to supersetNode deployment deploymentAnnotations: {} - ## Annotations to be added to supersetNode pods + # -- Labels to be added to supersetNode deployment + deploymentLabels: {} + # -- Affinity to be added to supersetNode deployment + affinity: {} + # -- TopologySpreadConstrains to be added to supersetNode deployments + topologySpreadConstraints: [] + # -- Annotations to be added to supersetNode pods podAnnotations: {} - ## Labels to be added to supersetNode pods + # -- Labels to be added to supersetNode pods podLabels: {} - # Resource settings for the supersetNode pods - these settings overwrite might existing values from the global resources object defined above. - resources: {} + startupProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 15 + timeoutSeconds: 1 + failureThreshold: 60 + periodSeconds: 5 + successThreshold: 1 + livenessProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 15 + timeoutSeconds: 1 + failureThreshold: 3 + periodSeconds: 15 + successThreshold: 1 + readinessProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 15 + timeoutSeconds: 1 + failureThreshold: 3 + periodSeconds: 15 + successThreshold: 1 + # -- Resource settings for the supersetNode pods - these settings overwrite might existing values from the global resources object defined above. + resources: + {} # limits: # cpu: 100m # memory: 128Mi # requests: # cpu: 100m # memory: 128Mi -## -## Superset worker configuration + podSecurityContext: {} + containerSecurityContext: {} + strategy: + {} + # type: RollingUpdate + # rollingUpdate: + # maxSurge: 25% + # maxUnavailable: 25% + +# Superset Celery worker configuration supersetWorker: + replicaCount: 1 + # -- Worker startup command + # @default -- a `celery worker` command command: - "/bin/sh" - "-c" - ". {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app worker" - forceReload: false # If true, forces deployment to reload on each upgrade + # -- If true, forces deployment to reload on each upgrade + forceReload: false + # -- Init container + # @default -- a container waiting for postgres and redis initContainers: - - name: wait-for-postgres + - name: wait-for-postgres-redis image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}" imagePullPolicy: "{{ .Values.initImage.pullPolicy }}" envFrom: - secretRef: - name: '{{ tpl .Values.envFromSecret . }}' - command: [ "/bin/sh", "-c", "until nc -zv $DB_HOST $DB_PORT -w1; do echo 'waiting for db'; sleep 1; done" ] - ## Annotations to be added to supersetWorker deployment + name: "{{ tpl .Values.envFromSecret . }}" + command: + - /bin/sh + - -c + - dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s + # -- Annotations to be added to supersetWorker deployment deploymentAnnotations: {} - ## Annotations to be added to supersetWorker pods + # -- Labels to be added to supersetWorker deployment + deploymentLabels: {} + # -- Annotations to be added to supersetWorker pods podAnnotations: {} - ## Labels to be added to supersetWorker pods + # -- Labels to be added to supersetWorker pods podLabels: {} - # Resource settings for the supersetWorker pods - these settings overwrite might existing values from the global resources object defined above. - resources: {} + # -- Resource settings for the supersetWorker pods - these settings overwrite might existing values from the global resources object defined above. + resources: + {} # limits: # cpu: 100m # memory: 128Mi # requests: # cpu: 100m # memory: 128Mi -## -## Superset beat configuration (to trigger scheduled jobs like reports) + podSecurityContext: {} + containerSecurityContext: {} + strategy: + {} + # type: RollingUpdate + # rollingUpdate: + # maxSurge: 25% + # maxUnavailable: 25% + livenessProbe: + exec: + # -- Liveness probe command + # @default -- a `celery inspect ping` command + command: + - sh + - -c + - celery -A superset.tasks.celery_app:app inspect ping -d celery@$HOSTNAME + initialDelaySeconds: 120 + timeoutSeconds: 60 + failureThreshold: 3 + periodSeconds: 60 + successThreshold: 1 + # -- No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) + startupProbe: {} + # -- No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) + readinessProbe: {} + +# Superset beat configuration (to trigger scheduled jobs like reports) supersetCeleryBeat: - # This is only required if you intend to use alerts and reports + # -- This is only required if you intend to use alerts and reports enabled: false + # -- Command + # @default -- a `celery beat` command command: - "/bin/sh" - "-c" - ". {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app beat --pidfile /tmp/celerybeat.pid --schedule /tmp/celerybeat-schedule" - forceReload: false # If true, forces deployment to reload on each upgrade + # -- If true, forces deployment to reload on each upgrade + forceReload: false + # -- List of init containers + # @default -- a container waiting for postgres initContainers: - - name: wait-for-postgres + - name: wait-for-postgres-redis image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}" imagePullPolicy: "{{ .Values.initImage.pullPolicy }}" envFrom: - secretRef: - name: '{{ tpl .Values.envFromSecret . }}' - command: [ "/bin/sh", "-c", "until nc -zv $DB_HOST $DB_PORT -w1; do echo 'waiting for db'; sleep 1; done" ] - ## Annotations to be added to supersetCeleryBeat deployment + name: "{{ tpl .Values.envFromSecret . }}" + command: + - /bin/sh + - -c + - dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s + # -- Annotations to be added to supersetCeleryBeat deployment deploymentAnnotations: {} - ## Annotations to be added to supersetCeleryBeat pods + # -- Affinity to be added to supersetCeleryBeat deployment + affinity: {} + # -- TopologySpreadConstrains to be added to supersetCeleryBeat deployments + topologySpreadConstraints: [] + # -- Annotations to be added to supersetCeleryBeat pods podAnnotations: {} - ## Labels to be added to supersetCeleryBeat pods + # -- Labels to be added to supersetCeleryBeat pods podLabels: {} - # Resource settings for the CeleryBeat pods - these settings overwrite might existing values from the global resources object defined above. - resources: {} + # -- Resource settings for the CeleryBeat pods - these settings overwrite might existing values from the global resources object defined above. + resources: + {} # limits: # cpu: 100m # memory: 128Mi # requests: # cpu: 100m # memory: 128Mi -## -## Init job configuration + podSecurityContext: {} + containerSecurityContext: {} + +supersetCeleryFlower: + # -- Enables a Celery flower deployment (management UI to monitor celery jobs) + # WARNING: on superset 1.x, this requires a Superset image that has `flower<1.0.0` installed (which is NOT the case of the default images) + # flower>=1.0.0 requires Celery 5+ which Superset 1.5 does not support + enabled: false + replicaCount: 1 + # -- Command + # @default -- a `celery flower` command + command: + - "/bin/sh" + - "-c" + - "celery --app=superset.tasks.celery_app:app flower" + service: + type: ClusterIP + annotations: {} + port: 5555 + nodePort: + # -- (int) + http: nil + startupProbe: + httpGet: + path: /api/workers + port: flower + initialDelaySeconds: 5 + timeoutSeconds: 1 + failureThreshold: 60 + periodSeconds: 5 + successThreshold: 1 + livenessProbe: + httpGet: + path: /api/workers + port: flower + initialDelaySeconds: 5 + timeoutSeconds: 1 + failureThreshold: 3 + periodSeconds: 5 + successThreshold: 1 + readinessProbe: + httpGet: + path: /api/workers + port: flower + initialDelaySeconds: 5 + timeoutSeconds: 1 + failureThreshold: 3 + periodSeconds: 5 + successThreshold: 1 + # -- List of init containers + # @default -- a container waiting for postgres and redis + initContainers: + - name: wait-for-postgres-redis + image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}" + imagePullPolicy: "{{ .Values.initImage.pullPolicy }}" + envFrom: + - secretRef: + name: "{{ tpl .Values.envFromSecret . }}" + command: + - /bin/sh + - -c + - dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s + # -- Annotations to be added to supersetCeleryFlower deployment + deploymentAnnotations: {} + # -- Affinity to be added to supersetCeleryFlower deployment + affinity: {} + # -- TopologySpreadConstrains to be added to supersetCeleryFlower deployments + topologySpreadConstraints: [] + # -- Annotations to be added to supersetCeleryFlower pods + podAnnotations: {} + # -- Labels to be added to supersetCeleryFlower pods + podLabels: {} + # -- Resource settings for the CeleryBeat pods - these settings overwrite might existing values from the global resources object defined above. + resources: + {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + podSecurityContext: {} + containerSecurityContext: {} + +supersetWebsockets: + # -- This is only required if you intend to use `GLOBAL_ASYNC_QUERIES` in `ws` mode + # see https://github.com/apache/superset/blob/master/CONTRIBUTING.md#async-chart-queries + enabled: false + replicaCount: 1 + ingress: + path: /ws + pathType: Prefix + image: + # -- There is no official image (yet), this one is community-supported + repository: oneacrefund/superset-websocket + tag: latest + pullPolicy: IfNotPresent + # -- The config.json to pass to the server, see https://github.com/apache/superset/tree/master/superset-websocket + # Note that the configuration can also read from environment variables (which will have priority), see https://github.com/apache/superset/blob/master/superset-websocket/src/config.ts for a list of supported variables + # @default -- see `values.yaml` + config: + { + "port": 8080, + "logLevel": "debug", + "logToFile": false, + "logFilename": "app.log", + "statsd": { "host": "127.0.0.1", "port": 8125, "globalTags": [] }, + "redis": + { + "port": 6379, + "host": "127.0.0.1", + "password": "", + "db": 0, + "ssl": false, + }, + "redisStreamPrefix": "async-events-", + "jwtSecret": "CHANGE-ME", + "jwtCookieName": "async-token", + } + service: + type: ClusterIP + annotations: {} + port: 8080 + nodePort: + # -- (int) + http: nil + command: [] + resources: {} + deploymentAnnotations: {} + # -- Affinity to be added to supersetWebsockets deployment + affinity: {} + # -- TopologySpreadConstrains to be added to supersetWebsockets deployments + topologySpreadConstraints: [] + podAnnotations: {} + podLabels: {} + strategy: {} + podSecurityContext: {} + containerSecurityContext: {} + startupProbe: + httpGet: + path: /health + port: ws + initialDelaySeconds: 5 + timeoutSeconds: 1 + failureThreshold: 60 + periodSeconds: 5 + successThreshold: 1 + livenessProbe: + httpGet: + path: /health + port: ws + initialDelaySeconds: 5 + timeoutSeconds: 1 + failureThreshold: 3 + periodSeconds: 5 + successThreshold: 1 + readinessProbe: + httpGet: + path: /health + port: ws + initialDelaySeconds: 5 + timeoutSeconds: 1 + failureThreshold: 3 + periodSeconds: 5 + successThreshold: 1 + init: # Configure resources # Warning: fab command consumes a lot of ram and can # cause the process to be killed due to OOM if it exceeds limit # Make sure you are giving a strong password for the admin user creation( else make sure you are changing after setup) # Also change the admin email to your own custom email. - resources: {} + resources: + {} # limits: # cpu: # memory: # requests: # cpu: # memory: + # -- Command + # @default -- a `superset_init.sh` command command: - "/bin/sh" - "-c" @@ -353,14 +645,21 @@ init: lastname: Admin email: admin@superset.com password: admin + # -- List of initContainers + # @default -- a container waiting for postgres initContainers: - name: wait-for-postgres image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}" imagePullPolicy: "{{ .Values.initImage.pullPolicy }}" envFrom: - secretRef: - name: '{{ tpl .Values.envFromSecret . }}' - command: [ "/bin/sh", "-c", "until nc -zv $DB_HOST $DB_PORT -w1; do echo 'waiting for db'; sleep 1; done" ] + name: "{{ tpl .Values.envFromSecret . }}" + command: + - /bin/sh + - -c + - dockerize -wait "tcp://$DB_HOST:$DB_PORT" -timeout 120s + # -- A Superset init script + # @default -- a script to create admin user and initailize roles initscript: |- #!/bin/sh set -eu @@ -388,9 +687,12 @@ init: fi ## Annotations to be added to init job pods podAnnotations: {} -## -## Configuration values for the postgresql dependency. -## ref: https://github.com/kubernetes/charts/blob/master/stable/postgresql/README.md + podSecurityContext: {} + containerSecurityContext: {} + +# -- Configuration values for the postgresql dependency. +# ref: https://github.com/kubernetes/charts/blob/master/stable/postgresql/README.md +# @default -- see `values.yaml` postgresql: ## ## Use the PostgreSQL chart dependency. @@ -408,6 +710,8 @@ postgresql: ## PostgreSQL name for a custom database to create database: superset + image: + tag: "14.6.0-debian-11-r13" ## PostgreSQL Primary parameters primary: @@ -430,9 +734,10 @@ postgresql: ports: postgresql: "5432" -## Configuration values for the Redis dependency. -## ref: https://github.com/bitnami/charts/blob/master/bitnami/redis -## More documentation can be found here: https://artifacthub.io/packages/helm/bitnami/redis +# -- Configuration values for the Redis dependency. +# ref: https://github.com/bitnami/charts/blob/master/bitnami/redis +# More documentation can be found here: https://artifacthub.io/packages/helm/bitnami/redis +# @default -- see `values.yaml` redis: ## ## Use the redis chart dependency. @@ -463,9 +768,9 @@ redis: ## ## Image configuration # image: - ## - ## docker registry secret names (list) - # pullSecrets: nil + ## + ## docker registry secret names (list) + # pullSecrets: nil ## ## Configure persistance persistence: @@ -478,10 +783,13 @@ redis: ## ## Access mode: accessModes: - - ReadWriteOnce + - ReadWriteOnce nodeSelector: {} tolerations: [] affinity: {} + +# -- TopologySpreadConstrains to be added to all deployments +topologySpreadConstraints: [] diff --git a/lintconf.yaml b/lintconf.yaml index 7a62003d9507..5a7c114c6d18 100644 --- a/lintconf.yaml +++ b/lintconf.yaml @@ -18,7 +18,7 @@ rules: braces: min-spaces-inside: 0 - max-spaces-inside: 0 + max-spaces-inside: 1 min-spaces-inside-empty: -1 max-spaces-inside-empty: -1 brackets: @@ -37,7 +37,7 @@ rules: require-starting-space: false min-spaces-from-content: -1 document-end: disable - document-start: disable # No --- to start a file + document-start: disable # No --- to start a file empty-lines: max: 2 max-start: 0 @@ -46,10 +46,10 @@ rules: max-spaces-after: 1 indentation: spaces: consistent - indent-sequences: whatever # - list indentation will handle both indentation and without + indent-sequences: whatever # - list indentation will handle both indentation and without check-multi-line-strings: false key-duplicates: enable - line-length: disable # Lines can be any length + line-length: disable # Lines can be any length new-line-at-end-of-file: enable new-lines: type: unix diff --git a/requirements/base.txt b/requirements/base.txt index a2f72d85bc04..d27bef99f682 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -7,26 +7,20 @@ # -e file:. # via -r requirements/base.in -aiohttp==3.8.1 - # via slackclient -aiosignal==1.2.0 - # via aiohttp alembic==1.6.5 # via flask-migrate amqp==5.1.0 # via kombu apispec[yaml]==3.3.2 # via flask-appbuilder -async-timeout==4.0.2 - # via aiohttp attrs==21.2.0 - # via - # aiohttp - # jsonschema + # via jsonschema babel==2.9.1 # via flask-babel backoff==1.11.1 # via apache-superset +bcrypt==4.0.1 + # via paramiko billiard==3.6.4.0 # via celery bleach==3.3.1 @@ -37,10 +31,10 @@ cachelib==0.4.1 # via apache-superset celery==5.2.2 # via apache-superset -cffi==1.14.6 - # via cryptography -charset-normalizer==2.0.4 - # via aiohttp +cffi==1.15.1 + # via + # cryptography + # pynacl click==8.0.4 # via # apache-superset @@ -66,15 +60,17 @@ cron-descriptor==1.2.24 # via apache-superset croniter==1.0.15 # via apache-superset -cryptography==3.4.7 - # via apache-superset +cryptography==39.0.0 + # via + # apache-superset + # paramiko deprecation==2.1.0 # via apache-superset dnspython==2.1.0 # via email-validator email-validator==1.1.3 # via flask-appbuilder -flask==2.0.3 +flask==2.1.3 # via # apache-superset # flask-appbuilder @@ -86,34 +82,32 @@ flask==2.0.3 # flask-migrate # flask-sqlalchemy # flask-wtf -flask-appbuilder==4.1.3 +flask-appbuilder==4.2.0 # via apache-superset flask-babel==1.0.0 # via flask-appbuilder flask-caching==1.10.1 # via apache-superset -flask-compress==1.10.1 +flask-compress==1.13 # via apache-superset flask-jwt-extended==4.3.1 # via flask-appbuilder -flask-login==0.4.1 - # via flask-appbuilder +flask-login==0.6.0 + # via + # apache-superset + # flask-appbuilder flask-migrate==3.1.0 # via apache-superset flask-sqlalchemy==2.5.1 # via # flask-appbuilder # flask-migrate -flask-talisman==0.8.1 +flask-talisman==1.0.0 # via apache-superset -flask-wtf==0.14.3 +flask-wtf==1.0.1 # via # apache-superset # flask-appbuilder -frozenlist==1.3.0 - # via - # aiohttp - # aiosignal func-timeout==4.3.5 # via apache-superset geographiclib==1.52 @@ -126,14 +120,14 @@ gunicorn==20.1.0 # via apache-superset hashids==1.3.1 # via apache-superset -holidays==0.14.2 +hijri-converter==2.2.4 + # via holidays +holidays==0.17.2 # via apache-superset humanize==3.11.0 # via apache-superset idna==3.2 - # via - # email-validator - # yarl + # via email-validator isodate==0.6.0 # via apache-superset itsdangerous==2.1.1 @@ -154,7 +148,7 @@ mako==1.1.4 # via alembic markdown==3.3.4 # via apache-superset -markupsafe==2.0.1 +markupsafe==2.1.1 # via # jinja2 # mako @@ -170,11 +164,7 @@ marshmallow-sqlalchemy==0.23.1 # via flask-appbuilder msgpack==1.0.2 # via apache-superset -multidict==5.1.0 - # via - # aiohttp - # yarl -numpy==1.22.1 +numpy==1.23.5 # via # apache-superset # pandas @@ -183,8 +173,10 @@ packaging==21.3 # via # bleach # deprecation -pandas==1.3.4 +pandas==1.5.3 # via apache-superset +paramiko==2.11.0 + # via sshtunnel parsedatetime==2.6 # via apache-superset pgsanity==0.2.9 @@ -195,7 +187,7 @@ prison==0.2.1 # via flask-appbuilder prompt-toolkit==3.0.28 # via click-repl -pyarrow==5.0.0 +pyarrow==10.0.1 # via apache-superset pycparser==2.20 # via cffi @@ -206,6 +198,8 @@ pyjwt==2.4.0 # flask-jwt-extended pymeeus==0.5.11 # via convertdate +pynacl==1.5.0 + # via paramiko pyparsing==3.0.6 # via # apache-superset @@ -230,7 +224,6 @@ pytz==2021.3 # via # babel # celery - # convertdate # flask-babel # pandas pyyaml==5.4.1 @@ -247,19 +240,17 @@ six==1.16.0 # via # bleach # click-repl - # flask-talisman - # holidays # isodate # jsonschema + # paramiko # polyline # prison # pyrsistent # python-dateutil - # sqlalchemy-utils # wtforms-json -slackclient==2.5.0 +slack-sdk==3.18.3 # via apache-superset -sqlalchemy==1.3.24 +sqlalchemy==1.4.36 # via # alembic # apache-superset @@ -267,15 +258,17 @@ sqlalchemy==1.3.24 # flask-sqlalchemy # marshmallow-sqlalchemy # sqlalchemy-utils -sqlalchemy-utils==0.37.8 +sqlalchemy-utils==0.38.3 # via # apache-superset # flask-appbuilder -sqlparse==0.3.0 +sqlparse==0.4.3 + # via apache-superset +sshtunnel==0.4.0 # via apache-superset tabulate==0.8.9 # via apache-superset -typing-extensions==3.10.0.0 +typing-extensions==4.4.0 # via apache-superset urllib3==1.26.6 # via selenium @@ -288,19 +281,21 @@ wcwidth==0.2.5 # via prompt-toolkit webencodings==0.5.1 # via bleach -werkzeug==2.0.3 +werkzeug==2.1.2 # via # flask # flask-jwt-extended + # flask-login wtforms==2.3.3 # via + # apache-superset # flask-appbuilder # flask-wtf # wtforms-json wtforms-json==0.3.3 # via apache-superset -yarl==1.6.3 - # via aiohttp +xlsxwriter==3.0.7 + # via apache-superset # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/development.txt b/requirements/development.txt index 75af963cf867..47fe7a17372d 100644 --- a/requirements/development.txt +++ b/requirements/development.txt @@ -28,6 +28,8 @@ certifi==2021.10.8 # via requests chardet==4.0.0 # via tabulator +charset-normalizer==2.0.12 + # via requests decorator==5.1.1 # via ipython et-xmlfile==1.1.0 @@ -64,11 +66,11 @@ pexpect==4.8.0 # via ipython pickleshare==0.7.5 # via ipython -pillow==9.1.0 +pillow==9.3.0 # via apache-superset progress==1.6 # via -r requirements/development.in -psycopg2-binary==2.9.1 +psycopg2-binary==2.9.5 # via apache-superset ptyprocess==0.7.0 # via pexpect @@ -76,7 +78,7 @@ pure-eval==0.2.2 # via stack-data pure-sasl==0.6.2 # via thrift-sasl -pydruid==0.6.2 +pydruid==0.6.5 # via apache-superset pygments==2.12.0 # via ipython @@ -95,7 +97,7 @@ s3transfer==0.5.0 # via boto3 sasl==0.3.1 # via pyhive -sqloxide==0.1.17 +sqloxide==0.1.30 # via -r requirements/development.in stack-data==0.2.0 # via ipython @@ -103,7 +105,7 @@ tableschema==1.20.2 # via apache-superset tabulator==1.53.5 # via tableschema -thrift==0.13.0 +thrift==0.14.1 # via # apache-superset # pyhive diff --git a/requirements/docker.txt b/requirements/docker.txt index f9ea766f4e69..0338f43fd8f8 100644 --- a/requirements/docker.txt +++ b/requirements/docker.txt @@ -12,9 +12,9 @@ # -r requirements/docker.in gevent==21.8.0 # via -r requirements/docker.in -greenlet==1.1.1 +greenlet==1.1.3.post0 # via gevent -psycopg2-binary==2.9.1 +psycopg2-binary==2.9.5 # via apache-superset zope-event==4.5.0 # via gevent diff --git a/requirements/integration.txt b/requirements/integration.txt index fb1d37cd53f9..a0243d6d0dd0 100644 --- a/requirements/integration.txt +++ b/requirements/integration.txt @@ -5,17 +5,17 @@ # # pip-compile-multi # -backports-entry-points-selectable==1.1.0 - # via virtualenv +build==0.8.0 + # via pip-tools cfgv==3.3.0 # via pre-commit click==8.0.4 # via # pip-compile-multi # pip-tools -distlib==0.3.2 +distlib==0.3.6 # via virtualenv -filelock==3.0.12 +filelock==3.9.0 # via # tox # virtualenv @@ -24,19 +24,21 @@ identify==2.2.13 nodeenv==1.6.0 # via pre-commit packaging==21.3 - # via tox + # via + # build + # tox pep517==0.11.0 - # via pip-tools -pip-compile-multi==2.4.1 - # via -r requirements/integration.in -pip-tools==6.2.0 + # via build +pip-compile-multi==2.6.1 + # via -r integration.in +pip-tools==6.8.0 # via pip-compile-multi -platformdirs==2.2.0 +platformdirs==2.6.2 # via virtualenv pluggy==0.13.1 # via tox -pre-commit==2.14.0 - # via -r requirements/integration.in +pre-commit==3.0.4 + # via -r integration.in py==1.10.0 # via tox pyparsing==3.0.6 @@ -44,24 +46,20 @@ pyparsing==3.0.6 pyyaml==5.4.1 # via pre-commit six==1.16.0 - # via - # tox - # virtualenv + # via tox toml==0.10.2 - # via - # pre-commit - # tox + # via tox tomli==1.2.1 # via pep517 toposort==1.6 # via pip-compile-multi -tox==3.24.1 - # via -r requirements/integration.in -virtualenv==20.7.2 +tox==3.25.1 + # via -r integration.in +virtualenv==20.17.1 # via # pre-commit # tox -wheel==0.37.0 +wheel==0.38.1 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/testing.txt b/requirements/testing.txt index 5c1c2f7fce34..5312ea4f235b 100644 --- a/requirements/testing.txt +++ b/requirements/testing.txt @@ -14,88 +14,91 @@ # -r requirements/testing.in astroid==2.6.6 # via pylint -cachetools==4.2.4 +cachetools==5.2.0 # via google-auth coverage==5.5 # via pytest-cov +db-dtypes==1.0.5 + # via pandas-gbq docker==5.0.0 # via -r requirements/testing.in flask-testing==0.8.1 # via -r requirements/testing.in freezegun==1.1.0 # via -r requirements/testing.in -google-api-core[grpc]==2.2.1 +google-api-core[grpc]==2.11.0 # via # google-cloud-bigquery # google-cloud-bigquery-storage # google-cloud-core - # pybigquery -google-auth==2.2.1 + # pandas-gbq + # sqlalchemy-bigquery +google-auth==2.14.1 # via # google-api-core # google-auth-oauthlib # google-cloud-core # pandas-gbq - # pybigquery # pydata-google-auth -google-auth-oauthlib==0.4.6 + # sqlalchemy-bigquery +google-auth-oauthlib==0.7.1 # via # pandas-gbq # pydata-google-auth -google-cloud-bigquery[bqstorage,pandas]==2.29.0 +google-cloud-bigquery[bqstorage,pandas]==3.4.0 # via # apache-superset # pandas-gbq - # pybigquery -google-cloud-bigquery-storage==2.9.1 - # via google-cloud-bigquery -google-cloud-core==2.1.0 + # sqlalchemy-bigquery +google-cloud-bigquery-storage==2.16.2 + # via + # google-cloud-bigquery + # pandas-gbq + # sqlalchemy-bigquery +google-cloud-core==2.3.2 # via google-cloud-bigquery -google-crc32c==1.3.0 +google-crc32c==1.5.0 # via google-resumable-media -google-resumable-media==2.1.0 +google-resumable-media==2.4.0 # via google-cloud-bigquery -googleapis-common-protos==1.53.0 +googleapis-common-protos==1.57.0 # via # google-api-core # grpcio-status -grpcio==1.41.1 +grpcio==1.51.1 # via # google-api-core # google-cloud-bigquery # grpcio-status -grpcio-status==1.41.1 +grpcio-status==1.51.1 # via google-api-core iniconfig==1.1.1 # via pytest -isort==5.9.3 +isort==5.12.0 # via pylint lazy-object-proxy==1.6.0 # via astroid -libcst==0.3.21 - # via google-cloud-bigquery-storage mccabe==0.6.1 # via pylint -mypy-extensions==0.4.3 - # via typing-inspect -oauthlib==3.1.1 +oauthlib==3.2.2 # via requests-oauthlib openapi-schema-validator==0.1.5 # via openapi-spec-validator openapi-spec-validator==0.3.1 # via -r requirements/testing.in -pandas-gbq==0.15.0 +pandas-gbq==0.18.1 # via apache-superset parameterized==0.8.1 # via -r requirements/testing.in -proto-plus==1.19.7 +proto-plus==1.22.1 # via # google-cloud-bigquery # google-cloud-bigquery-storage -protobuf==3.19.1 +protobuf==4.21.10 # via # google-api-core # google-cloud-bigquery + # google-cloud-bigquery-storage # googleapis-common-protos # grpcio-status # proto-plus @@ -105,12 +108,12 @@ pyasn1==0.4.8 # rsa pyasn1-modules==0.2.8 # via google-auth -pybigquery==0.10.2 - # via apache-superset -pydata-google-auth==1.2.0 +pydata-google-auth==1.4.0 # via pandas-gbq pyfakefs==4.5.6 # via -r requirements/testing.in +pyhive[presto]==0.6.5 + # via apache-superset pylint==2.9.6 # via -r requirements/testing.in pytest==6.2.4 @@ -122,16 +125,16 @@ pytest-cov==2.12.1 # via -r requirements/testing.in pytest-mock==3.6.1 # via -r requirements/testing.in -requests-oauthlib==1.3.0 +requests-oauthlib==1.3.1 # via google-auth-oauthlib -rsa==4.7.2 +rsa==4.9 # via google-auth +sqlalchemy-bigquery==1.5.0 + # via apache-superset statsd==3.3.0 # via -r requirements/testing.in -trino==0.313.0 +trino==0.319.0 # via apache-superset -typing-inspect==0.7.1 - # via libcst websocket-client==1.2.0 # via docker wrapt==1.12.1 diff --git a/scripts/babel_update.sh b/scripts/babel_update.sh index 2b971397a46d..e281599bf7a4 100755 --- a/scripts/babel_update.sh +++ b/scripts/babel_update.sh @@ -45,7 +45,7 @@ pybabel extract \ --sort-output \ --copyright-holder=Superset \ --project=Superset \ - -k _ -k __ -k t -k tn -k tct . + -k _ -k __ -k t -k tn:1,2 -k tct . cat $LICENSE_TMP superset/translations/messages.pot > messages.pot.tmp \ && mv messages.pot.tmp superset/translations/messages.pot diff --git a/scripts/cancel_github_workflows.py b/scripts/cancel_github_workflows.py index 720dc05cbef2..4d30d34adf40 100755 --- a/scripts/cancel_github_workflows.py +++ b/scripts/cancel_github_workflows.py @@ -143,7 +143,7 @@ def print_commit(commit: Dict[str, Any], branch: str) -> None: "--include-last/--skip-last", default=False, show_default=True, - help="Whether to also cancel the lastest run.", + help="Whether to also cancel the latest run.", ) @click.option( "--include-running/--skip-running", diff --git a/scripts/generate_frontend_ts_tasklist.js b/scripts/generate_frontend_ts_tasklist.js index b9c5c47fc9da..7f23ad124aef 100644 --- a/scripts/generate_frontend_ts_tasklist.js +++ b/scripts/generate_frontend_ts_tasklist.js @@ -48,10 +48,10 @@ while (directories.length) { // directory. const hasTypescriptFiles = getFilesByExtensions("./", [".ts", ".tsx"]).length > 0; - const hasJavascriptFiles = + const hasJavaScriptFiles = getFilesByExtensions("./", [".js", ".jsx"]).length > 0; - if (hasJavascriptFiles) { + if (hasJavaScriptFiles) { console.log( `${" ".repeat( curDirectory.split("/").length - 1 diff --git a/scripts/permissions_cleanup.py b/scripts/permissions_cleanup.py index 99d192919c6c..5ca75e394ccc 100644 --- a/scripts/permissions_cleanup.py +++ b/scripts/permissions_cleanup.py @@ -24,7 +24,7 @@ def cleanup_permissions() -> None: pvms = security_manager.get_session.query( security_manager.permissionview_model ).all() - print("# of permission view menues is: {}".format(len(pvms))) + print("# of permission view menus is: {}".format(len(pvms))) pvms_dict = defaultdict(list) for pvm in pvms: pvms_dict[(pvm.permission, pvm.view_menu)].append(pvm) @@ -43,9 +43,9 @@ def cleanup_permissions() -> None: pvms = security_manager.get_session.query( security_manager.permissionview_model ).all() - print("Stage 1: # of permission view menues is: {}".format(len(pvms))) + print("Stage 1: # of permission view menus is: {}".format(len(pvms))) - # 2. Clean up None permissions or view menues + # 2. Clean up None permissions or view menus pvms = security_manager.get_session.query( security_manager.permissionview_model ).all() @@ -57,15 +57,15 @@ def cleanup_permissions() -> None: pvms = security_manager.get_session.query( security_manager.permissionview_model ).all() - print("Stage 2: # of permission view menues is: {}".format(len(pvms))) + print("Stage 2: # of permission view menus is: {}".format(len(pvms))) - # 3. Delete empty permission view menues from roles + # 3. Delete empty permission view menus from roles roles = security_manager.get_session.query(security_manager.role_model).all() for role in roles: role.permissions = [p for p in role.permissions if p] security_manager.get_session.commit() - # 4. Delete empty roles from permission view menues + # 4. Delete empty roles from permission view menus pvms = security_manager.get_session.query( security_manager.permissionview_model ).all() diff --git a/scripts/python_tests.sh b/scripts/python_tests.sh index 6491a3f6f9d4..c3f27d17f78c 100755 --- a/scripts/python_tests.sh +++ b/scripts/python_tests.sh @@ -19,7 +19,7 @@ set -e # Temporary fix, probably related with https://bugs.launchpad.net/ubuntu/+source/opencv/+bug/1890170 -# MySQL was failling with: +# MySQL was failing with: # from . import _mysql # ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: cannot allocate memory in static TLS block export LD_PRELOAD=/lib/x86_64-linux-gnu/libstdc++.so.6 diff --git a/scripts/tests/run.sh b/scripts/tests/run.sh index 24233010107d..2c3b5bf35973 100755 --- a/scripts/tests/run.sh +++ b/scripts/tests/run.sh @@ -24,7 +24,7 @@ set -e # function reset_db() { echo -------------------- - echo Reseting test DB + echo Resetting test DB echo -------------------- docker-compose stop superset-tests-worker superset || true RESET_DB_CMD="psql \"postgresql://${DB_USER}:${DB_PASSWORD}@127.0.0.1:5432\" <<-EOF diff --git a/setup.cfg b/setup.cfg index 6f667677ec81..a9470d51bd8b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -17,9 +17,9 @@ [metadata] name = Superset summary = a data exploration platform -description-file = README.md +description_file = README.md author = Apache Superset Dev -author-email = dev@superset.apache.org +author_email = dev@superset.apache.org license = Apache License, Version 2.0 [files] @@ -30,7 +30,7 @@ combine_as_imports = true include_trailing_comma = true line_length = 88 known_first_party = superset -known_third_party =alembic,apispec,backoff,bleach,cachelib,celery,click,colorama,cron_descriptor,croniter,cryptography,dateutil,deprecation,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_jwt_extended,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_testing,flask_wtf,freezegun,geohash,geopy,graphlib,holidays,humanize,isodate,jinja2,jwt,markdown,markupsafe,marshmallow,marshmallow_enum,msgpack,numpy,pandas,parameterized,parsedatetime,pgsanity,pkg_resources,polyline,prison,progress,pyarrow,pybigquery,pyhive,pyparsing,pytest,pytest_mock,pytz,redis,requests,selenium,setuptools,simplejson,slack,sqlalchemy,sqlalchemy_utils,sqlparse,typing_extensions,urllib3,werkzeug,wtforms,wtforms_json,yaml +known_third_party =alembic,apispec,backoff,bleach,cachelib,celery,click,colorama,cron_descriptor,croniter,cryptography,dateutil,deprecation,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_jwt_extended,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_testing,flask_wtf,freezegun,geohash,geopy,graphlib,holidays,humanize,isodate,jinja2,jwt,markdown,markupsafe,marshmallow,marshmallow_enum,msgpack,numpy,pandas,parameterized,parsedatetime,pgsanity,pkg_resources,polyline,prison,progress,pyarrow,sqlalchemy_bigquery,pyhive,pyparsing,pytest,pytest_mock,pytz,redis,requests,selenium,setuptools,simplejson,slack,sqlalchemy,sqlalchemy_utils,sqlparse,typing_extensions,urllib3,werkzeug,wtforms,wtforms_json,yaml multi_line_output = 3 order_by_type = false @@ -41,7 +41,7 @@ disallow_untyped_calls = true disallow_untyped_defs = true ignore_missing_imports = true no_implicit_optional = true -warn_unused_ignores = false +warn_unused_ignores = true [mypy-superset.migrations.versions.*] ignore_errors = true diff --git a/setup.py b/setup.py index 4ffd66d8de2b..f9b4a7d67f2b 100644 --- a/setup.py +++ b/setup.py @@ -64,6 +64,12 @@ def get_git_sha() -> str: zip_safe=False, entry_points={ "console_scripts": ["superset=superset.cli.main:superset"], + # the `postgres` and `postgres+psycopg2://` schemes were removed in SQLAlchemy 1.4 + # add an alias here to prevent breaking existing databases + "sqlalchemy.dialects": [ + "postgres.psycopg2 = sqlalchemy.dialects.postgresql:dialect", + "postgres = sqlalchemy.dialects.postgresql:dialect", + ], }, install_requires=[ "backoff>=1.8.0", @@ -74,27 +80,28 @@ def get_git_sha() -> str: "colorama", "croniter>=0.3.28", "cron-descriptor", - "cryptography>=3.3.2", + "cryptography>=39.0.0,<40", "deprecation>=2.1.0, <2.2.0", - "flask>=2.0.0, <3.0.0", - "flask-appbuilder>=4.1.3, <5.0.0", - "flask-caching>=1.10.0", - "flask-compress", - "flask-talisman", - "flask-migrate", - "flask-wtf", + "flask>=2.1.3, <2.2", + "flask-appbuilder>=4.2.0, <5.0.0", + "flask-caching>=1.10.1, <1.11", + "flask-compress>=1.13, <2.0", + "flask-talisman>=1.0.0, <2.0", + "flask-login==0.6.0", + "flask-migrate>=3.1.0, <4.0", + "flask-wtf>=1.0.1, <1.1", "func_timeout", "geopy", "graphlib-backport", - "gunicorn>=20.1.0", + "gunicorn>=20.1.0; sys_platform != 'win32'", "hashids>=1.3.1, <2", - "holidays==0.14.2", + "holidays>=0.17.2, <0.18", "humanize", "isodate", "markdown>=3.0", "msgpack>=1.0.0, <1.1", - "numpy==1.22.1", - "pandas>=1.3.0, <1.4", + "numpy==1.23.5", + "pandas>=1.5.3, <1.6", "parsedatetime", "pgsanity", "polyline", @@ -102,31 +109,33 @@ def get_git_sha() -> str: "python-dateutil", "python-dotenv", "python-geohash", - "pyarrow>=5.0.0, <6.0", + "pyarrow>=10.0.1, <11", "pyyaml>=5.4", "PyJWT>=2.4.0, <3.0", "redis", "selenium>=3.141.0", + "sshtunnel>=0.4.0, <0.5", "simplejson>=3.15.0", - "slackclient==2.5.0", # PINNED! slack changes file upload api in the future versions - "sqlalchemy>=1.3.16, <1.4, !=1.3.21", - "sqlalchemy-utils>=0.37.8, <0.38", - "sqloxide>=0.1.15", - "sqlparse==0.3.0", # PINNED! see https://github.com/andialbrecht/sqlparse/issues/562 - "tabulate==0.8.9", - # needed to support Literal (3.8) and TypeGuard (3.10) - "typing-extensions>=3.10, <4", + "slack_sdk>=3.1.1, <4", + "sqlalchemy>=1.4, <2", + "sqlalchemy-utils>=0.38.3, <0.39", + "sqlparse>=0.4.3, <0.5", + "tabulate>=0.8.9, <0.9", + "typing-extensions>=4, <5", + "waitress; sys_platform == 'win32'", + "wtforms>=2.3.3, <2.4", "wtforms-json", + "xlsxwriter>=3.0.7, <3.1", ], extras_require={ - "athena": ["pyathena>=1.10.8, <1.11"], + "athena": ["pyathena[pandas]>=2, <3"], "aurora-data-api": ["preset-sqlalchemy-aurora-data-api>=0.2.8,<0.3"], "bigquery": [ - "pandas_gbq>=0.10.0", - "pybigquery>=0.4.10", - "google-cloud-bigquery>=2.4.0", + "pandas-gbq>=0.18.1", + "sqlalchemy-bigquery>=1.5.0", + "google-cloud-bigquery>=3.4.0", ], - "clickhouse": ["clickhouse-sqlalchemy>=0.1.4, <0.2"], + "clickhouse": ["clickhouse-connect>=0.4.6, <0.5"], "cockroachdb": ["cockroachdb>=0.3.5, <0.4"], "cors": ["flask-cors>=2.0.0"], "crate": ["crate[sqlalchemy]>=0.26.0, <0.27"], @@ -137,37 +146,37 @@ def get_git_sha() -> str: "db2": ["ibm-db-sa>=0.3.5, <0.4"], "dremio": ["sqlalchemy-dremio>=1.1.5, <1.3"], "drill": ["sqlalchemy-drill==0.1.dev"], - "druid": ["pydruid>=0.6.1,<0.7"], + "druid": ["pydruid>=0.6.5,<0.7"], + "dynamodb": ["pydynamodb>=0.4.2"], "solr": ["sqlalchemy-solr >= 0.2.0"], - "elasticsearch": ["elasticsearch-dbapi>=0.2.0, <0.3.0"], + "elasticsearch": ["elasticsearch-dbapi>=0.2.9, <0.3.0"], "exasol": ["sqlalchemy-exasol >= 2.4.0, <3.0"], "excel": ["xlrd>=1.2.0, <1.3"], "firebird": ["sqlalchemy-firebird>=0.7.0, <0.8"], "firebolt": ["firebolt-sqlalchemy>=0.0.1"], "gsheets": ["shillelagh[gsheetsapi]>=1.0.14, <2"], "hana": ["hdbcli==2.4.162", "sqlalchemy_hana==0.4.0"], - "hive": ["pyhive[hive]>=0.6.5", "tableschema", "thrift>=0.11.0, <1.0.0"], + "hive": ["pyhive[hive]>=0.6.5", "tableschema", "thrift>=0.14.1, <1.0.0"], "impala": ["impyla>0.16.2, <0.17"], - "kusto": ["sqlalchemy-kusto>=1.0.1, <2"], + "kusto": ["sqlalchemy-kusto>=2.0.0, <3"], "kylin": ["kylinpy>=2.8.1, <2.9"], "mssql": ["pymssql>=2.1.4, <2.2"], "mysql": ["mysqlclient>=2.1.0, <3"], "oracle": ["cx-Oracle>8.0.0, <8.1"], "pinot": ["pinotdb>=0.3.3, <0.4"], - "postgres": ["psycopg2-binary==2.9.1"], + "postgres": ["psycopg2-binary==2.9.5"], "presto": ["pyhive[presto]>=0.6.5"], - "trino": ["trino>=0.313.0"], + "trino": ["trino>=0.319.0"], "prophet": ["prophet>=1.0.1, <1.1", "pystan<3.0"], "redshift": ["sqlalchemy-redshift>=0.8.1, < 0.9"], "rockset": ["rockset>=0.8.10, <0.9"], "shillelagh": [ - "shillelagh[datasetteapi,gsheetsapi,socrata,weatherapi]>=1.0.3, <2" + "shillelagh[datasetteapi,gsheetsapi,socrata,weatherapi]>=1.1.1, <2" ], - "snowflake": [ - "snowflake-sqlalchemy==1.2.4" - ], # PINNED! 1.2.5 introduced breaking changes requiring sqlalchemy>=1.4.0 + "snowflake": ["snowflake-sqlalchemy>=1.2.4, <2"], + "spark": ["pyhive[hive]>=0.6.5", "tableschema", "thrift>=0.14.1, <1.0.0"], "teradata": ["teradatasql>=16.20.0.23"], - "thumbnails": ["Pillow>=9.0.1, <10.0.0"], + "thumbnails": ["Pillow>=9.3.0, <10.0.0"], "vertica": ["sqlalchemy-vertica-python>=0.5.9, < 0.6"], "netezza": ["nzalchemy>=11.0.2"], }, @@ -179,5 +188,7 @@ def get_git_sha() -> str: classifiers=[ "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", ], ) diff --git a/superset-embedded-sdk/README.md b/superset-embedded-sdk/README.md index 93b0aa4c09e6..7e05d94a6ce1 100644 --- a/superset-embedded-sdk/README.md +++ b/superset-embedded-sdk/README.md @@ -40,7 +40,12 @@ embedDashboard({ supersetDomain: "https://superset.example.com", mountPoint: document.getElementById("my-superset-container"), // any html element that can contain an iframe fetchGuestToken: () => fetchGuestTokenFromBackend(), - dashboardUiConfig: { hideTitle: true }, // dashboard UI config: hideTitle, hideTab, hideChartControls (optional) + dashboardUiConfig: { // dashboard UI config: hideTitle, hideTab, hideChartControls, filters.visible, filters.expanded (optional) + hideTitle: true, + filters: { + expanded: true, + } + }, }); ``` diff --git a/superset-embedded-sdk/package-lock.json b/superset-embedded-sdk/package-lock.json index 55c2474f25c0..826fb282c9e2 100644 --- a/superset-embedded-sdk/package-lock.json +++ b/superset-embedded-sdk/package-lock.json @@ -1,15 +1,16 @@ { "name": "@superset-ui/embedded-sdk", - "version": "0.1.0-alpha.7", + "version": "0.1.0-alpha.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@superset-ui/embedded-sdk", - "version": "0.1.0-alpha.7", + "version": "0.1.0-alpha.8", "license": "Apache-2.0", "dependencies": { - "@superset-ui/switchboard": "^0.18.26-0" + "@superset-ui/switchboard": "^0.18.26-0", + "jwt-decode": "^3.1.2" }, "devDependencies": { "@babel/cli": "^7.16.8", @@ -2376,6 +2377,64 @@ "node": ">=8" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", @@ -6423,13 +6482,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -6437,6 +6493,11 @@ "node": ">=6" } }, + "node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -6493,9 +6554,9 @@ } }, "node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "dependencies": { "big.js": "^5.2.2", @@ -6507,9 +6568,9 @@ } }, "node_modules/loader-utils/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -6635,9 +6696,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -7497,13 +7558,14 @@ } }, "node_modules/terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "bin": { @@ -7511,14 +7573,6 @@ }, "engines": { "node": ">=10" - }, - "peerDependencies": { - "acorn": "^8.5.0" - }, - "peerDependenciesMeta": { - "acorn": { - "optional": true - } } }, "node_modules/terser-webpack-plugin": { @@ -7570,15 +7624,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -9833,6 +9878,55 @@ } } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", @@ -12943,13 +13037,15 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" }, "kind-of": { "version": "6.0.3", @@ -12992,9 +13088,9 @@ "dev": true }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "requires": { "big.js": "^5.2.2", @@ -13003,9 +13099,9 @@ }, "dependencies": { "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -13108,9 +13204,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -13766,13 +13862,14 @@ } }, "terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "dependencies": { @@ -13781,12 +13878,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true } } }, diff --git a/superset-embedded-sdk/package.json b/superset-embedded-sdk/package.json index 49debb4ad321..055f44191a7e 100644 --- a/superset-embedded-sdk/package.json +++ b/superset-embedded-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@superset-ui/embedded-sdk", - "version": "0.1.0-alpha.7", + "version": "0.1.0-alpha.8", "description": "SDK for embedding resources from Superset into your own application", "access": "public", "keywords": [ @@ -33,7 +33,8 @@ "last 3 edge versions" ], "dependencies": { - "@superset-ui/switchboard": "^0.18.26-0" + "@superset-ui/switchboard": "^0.18.26-0", + "jwt-decode": "^3.1.2" }, "devDependencies": { "@babel/cli": "^7.16.8", diff --git a/superset-embedded-sdk/src/const.ts b/superset-embedded-sdk/src/const.ts index e88797452035..72eba8525d75 100644 --- a/superset-embedded-sdk/src/const.ts +++ b/superset-embedded-sdk/src/const.ts @@ -18,3 +18,7 @@ */ export const IFRAME_COMMS_MESSAGE_TYPE = "__embedded_comms__"; +export const DASHBOARD_UI_FILTER_CONFIG_URL_PARAM_KEY: { [index: string]: any } = { + visible: "show_filters", + expanded: "expand_filters", +} diff --git a/superset-embedded-sdk/src/guestTokenRefresh.ts b/superset-embedded-sdk/src/guestTokenRefresh.ts index 214e91a1c33e..101c4d9e9393 100644 --- a/superset-embedded-sdk/src/guestTokenRefresh.ts +++ b/superset-embedded-sdk/src/guestTokenRefresh.ts @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ +import jwt_decode from "jwt-decode"; export const REFRESH_TIMING_BUFFER_MS = 5000 // refresh guest token early to avoid failed superset requests export const MIN_REFRESH_WAIT_MS = 10000 // avoid blasting requests as fast as the cpu can handle @@ -23,7 +24,7 @@ export const DEFAULT_TOKEN_EXP_MS = 300000 // (5 min) used only when parsing gue // when do we refresh the guest token? export function getGuestTokenRefreshTiming(currentGuestToken: string) { - const parsedJwt = JSON.parse(Buffer.from(currentGuestToken.split('.')[1], 'base64').toString()); + const parsedJwt = jwt_decode<Record<string, any>>(currentGuestToken); // if exp is int, it is in seconds, but Date() takes milliseconds const exp = new Date(/[^0-9\.]/g.test(parsedJwt.exp) ? parsedJwt.exp : parseFloat(parsedJwt.exp) * 1000); const isValidDate = exp.toString() !== 'Invalid Date'; diff --git a/superset-embedded-sdk/src/index.ts b/superset-embedded-sdk/src/index.ts index 32b02641e00d..56a07e5544c1 100644 --- a/superset-embedded-sdk/src/index.ts +++ b/superset-embedded-sdk/src/index.ts @@ -17,7 +17,10 @@ * under the License. */ -import { IFRAME_COMMS_MESSAGE_TYPE } from './const'; +import { + DASHBOARD_UI_FILTER_CONFIG_URL_PARAM_KEY, + IFRAME_COMMS_MESSAGE_TYPE +} from './const'; // We can swap this out for the actual switchboard package once it gets published import { Switchboard } from '@superset-ui/switchboard'; @@ -34,6 +37,11 @@ export type UiConfigType = { hideTitle?: boolean hideTab?: boolean hideChartControls?: boolean + filters?: { + [key: string]: boolean | undefined + visible?: boolean + expanded?: boolean + } } export type EmbedDashboardParams = { @@ -45,7 +53,7 @@ export type EmbedDashboardParams = { mountPoint: HTMLElement /** A function to fetch a guest token from the Host App's backend server */ fetchGuestToken: GuestTokenFetchFn - /** The dashboard UI config: hideTitle, hideTab, hideChartControls **/ + /** The dashboard UI config: hideTitle, hideTab, hideChartControls, filters.visible, filters.expanded **/ dashboardUiConfig?: UiConfigType /** Are we in debug mode? */ debug?: boolean @@ -58,6 +66,8 @@ export type Size = { export type EmbeddedDashboard = { getScrollSize: () => Promise<Size> unmount: () => void + getDashboardPermalink: (anchor: string) => Promise<string> + getActiveTabs: () => Promise<string[]> } /** @@ -99,15 +109,23 @@ export async function embedDashboard({ return new Promise(resolve => { const iframe = document.createElement('iframe'); const dashboardConfig = dashboardUiConfig ? `?uiConfig=${calculateConfig()}` : "" - - // setup the iframe's sandbox configuration + const filterConfig = dashboardUiConfig?.filters || {} + const filterConfigKeys = Object.keys(filterConfig) + const filterConfigUrlParams = filterConfigKeys.length > 0 + ? "&" + + filterConfigKeys + .map(key => DASHBOARD_UI_FILTER_CONFIG_URL_PARAM_KEY[key] + '=' + filterConfig[key]).join('&') + : "" + + // set up the iframe's sandbox configuration iframe.sandbox.add("allow-same-origin"); // needed for postMessage to work iframe.sandbox.add("allow-scripts"); // obviously the iframe needs scripts iframe.sandbox.add("allow-presentation"); // for fullscreen charts iframe.sandbox.add("allow-downloads"); // for downloading charts as image - // add these ones if it turns out we need them: + iframe.sandbox.add("allow-forms"); // for forms to submit + iframe.sandbox.add("allow-popups"); // for exporting charts as csv + // add these if it turns out we need them: // iframe.sandbox.add("allow-top-navigation"); - // iframe.sandbox.add("allow-forms"); // add the event listener before setting src, to be 100% sure that we capture the load event iframe.addEventListener('load', () => { @@ -131,13 +149,13 @@ export async function embedDashboard({ resolve(new Switchboard({ port: ourPort, name: 'superset-embedded-sdk', debug })); }); - iframe.src = `${supersetDomain}/embedded/${id}${dashboardConfig}`; + iframe.src = `${supersetDomain}/embedded/${id}${dashboardConfig}${filterConfigUrlParams}`; mountPoint.replaceChildren(iframe); log('placed the iframe') }); } - const [guestToken, ourPort] = await Promise.all([ + const [guestToken, ourPort]: [string, Switchboard] = await Promise.all([ fetchGuestToken(), mountIframe(), ]); @@ -159,9 +177,14 @@ export async function embedDashboard({ } const getScrollSize = () => ourPort.get<Size>('getScrollSize'); + const getDashboardPermalink = (anchor: string) => + ourPort.get<string>('getDashboardPermalink', { anchor }); + const getActiveTabs = () => ourPort.get<string[]>('getActiveTabs') return { getScrollSize, unmount, + getDashboardPermalink, + getActiveTabs, }; } diff --git a/superset-frontend/.eslintrc.js b/superset-frontend/.eslintrc.js index 01ef839966b1..6eebb0d2dfe2 100644 --- a/superset-frontend/.eslintrc.js +++ b/superset-frontend/.eslintrc.js @@ -96,6 +96,7 @@ module.exports = { '@typescript-eslint/no-non-null-assertion': 0, // disabled temporarily '@typescript-eslint/explicit-function-return-type': 0, '@typescript-eslint/explicit-module-boundary-types': 0, // re-enable up for discussion + '@typescript-eslint/prefer-optional-chain': 2, camelcase: 0, 'class-methods-use-this': 0, 'func-names': 0, @@ -115,6 +116,7 @@ module.exports = { 'jsx-a11y/anchor-is-valid': 1, 'jsx-a11y/click-events-have-key-events': 0, // re-enable up for discussion 'jsx-a11y/mouse-events-have-key-events': 0, // re-enable up for discussion + 'max-classes-per-file': 0, 'new-cap': 0, 'no-bitwise': 0, 'no-continue': 0, diff --git a/superset-frontend/.storybook/main.js b/superset-frontend/.storybook/main.js index caa68983579a..35783dd85d28 100644 --- a/superset-frontend/.storybook/main.js +++ b/superset-frontend/.storybook/main.js @@ -24,7 +24,8 @@ module.exports = { builder: 'webpack5', }, stories: [ - '../src/@(components|common|filters|explore)/**/*.stories.@(t|j)sx', + '../src/@(components|common|filters|explore|views|dashboard)/**/*.stories.@(tsx|jsx)', + '../src/@(components|common|filters|explore|views|dashboard)/**/*.*.@(mdx)', ], addons: [ '@storybook/addon-essentials', @@ -47,6 +48,6 @@ module.exports = { plugins: [...config.plugins, ...customConfig.plugins], }), typescript: { - reactDocgen: 'none', + reactDocgen: 'react-docgen-typescript', }, }; diff --git a/superset-frontend/.storybook/preview.jsx b/superset-frontend/.storybook/preview.jsx index 7deb1e608c68..967e96a40ddc 100644 --- a/superset-frontend/.storybook/preview.jsx +++ b/superset-frontend/.storybook/preview.jsx @@ -26,6 +26,7 @@ import { combineReducers, createStore, applyMiddleware, compose } from 'redux'; import thunk from 'redux-thunk'; import { Provider } from 'react-redux'; import reducerIndex from 'spec/helpers/reducerIndex'; +import { GlobalStyles } from '../src/GlobalStyles'; import 'src/theme.ts'; import './storybook.css'; @@ -37,7 +38,12 @@ const store = createStore( ); const themeDecorator = Story => ( - <ThemeProvider theme={supersetTheme}>{<Story />}</ThemeProvider> + <ThemeProvider theme={supersetTheme}> + <> + <GlobalStyles /> + <Story /> + </> + </ThemeProvider> ); const providerDecorator = Story => ( @@ -63,7 +69,23 @@ addParameters({ }, options: { storySort: { - method: 'alphabetical', + order: [ + 'Superset Frontend', + ['Controls', 'Display', 'Feedback', 'Input', '*'], + ['Overview', 'Examples', '*'], + 'Design System', + [ + 'Introduction', + 'Foundations', + 'Components', + ['Overview', 'Examples', '*'], + 'Patterns', + '*', + ], + ['Overview', 'Examples', '*'], + '*', + ], }, }, + controls: { expanded: true, sort: 'alpha' }, }); diff --git a/superset-frontend/babel.config.js b/superset-frontend/babel.config.js index 11bed49eee23..774e75e84b60 100644 --- a/superset-frontend/babel.config.js +++ b/superset-frontend/babel.config.js @@ -90,17 +90,16 @@ module.exports = { ], }, production: { - plugins: [ - [ - 'babel-plugin-jsx-remove-data-test-id', - { - attributes: 'data-test', - }, - ], - ], + plugins: [], }, testableProduction: { plugins: [], }, }, + overrides: [ + { + test: './plugins/plugin-chart-handlebars/node_modules/just-handlebars-helpers/*', + sourceType: 'unambiguous', + }, + ], }; diff --git a/superset-frontend/cypress-base/applitools.config.js b/superset-frontend/cypress-base/applitools.config.js index fc963a1c81fa..507bcea03578 100644 --- a/superset-frontend/cypress-base/applitools.config.js +++ b/superset-frontend/cypress-base/applitools.config.js @@ -20,9 +20,10 @@ module.exports = { apiKey: process.env.APPLITOOLS_API_KEY, batchId: process.env.APPLITOOLS_BATCH_ID, batchName: process.env.APPLITOOLS_BATCH_NAME, - browser: [{ width: 1000, height: 660, name: 'chrome' }], + browser: [{ width: 1920, height: 1080, name: 'chrome' }], failCypressOnDiff: false, isDisabled: false, showLogs: false, testConcurrency: 10, + ignoreCaret: true, }; diff --git a/superset-frontend/cypress-base/cypress.json b/superset-frontend/cypress-base/cypress.json index f9729be1c3c9..6894714ba66c 100644 --- a/superset-frontend/cypress-base/cypress.json +++ b/superset-frontend/cypress-base/cypress.json @@ -5,7 +5,7 @@ "numTestsKeptInMemory": 0, "experimentalFetchPolyfill": true, "requestTimeout": 10000, - "ignoreTestFiles": ["**/!(*.test.js|*.test.ts)"], + "ignoreTestFiles": ["**/!(*.test.js|*.test.ts)", "*.applitools.test.ts"], "video": false, "videoUploadOnPasses": false, "viewportWidth": 1280, diff --git a/superset-frontend/cypress-base/cypress/fixtures/charts.json b/superset-frontend/cypress-base/cypress/fixtures/charts.json new file mode 100644 index 000000000000..5781fce81e72 --- /dev/null +++ b/superset-frontend/cypress-base/cypress/fixtures/charts.json @@ -0,0 +1,42 @@ +[ + { + "slice_name": "1 - Sample chart", + "description": "chart description", + "owners": [1], + "viz_type": "line", + "cache_timeout": 1000, + "datasource_id": 2, + "datasource_type": "table", + "params": "{\"viz_type\":\"line\",\"metrics\":[\"count\"]}" + }, + { + "slice_name": "2 - Sample chart", + "description": "chart description", + "owners": [1], + "viz_type": "line", + "cache_timeout": 1000, + "datasource_id": 2, + "datasource_type": "table", + "params": "{\"viz_type\":\"line\",\"metrics\":[\"count\"]}" + }, + { + "slice_name": "3 - Sample chart", + "description": "chart description", + "owners": [1], + "viz_type": "line", + "cache_timeout": 1000, + "datasource_id": 2, + "datasource_type": "table", + "params": "{\"viz_type\":\"line\",\"metrics\":[\"count\"]}" + }, + { + "slice_name": "4 - Sample chart", + "description": "chart description", + "owners": [1], + "viz_type": "line", + "cache_timeout": 1000, + "datasource_id": 2, + "datasource_type": "table", + "params": "{\"viz_type\":\"line\",\"metrics\":[\"count\"]}" + } +] diff --git a/superset-frontend/cypress-base/cypress/fixtures/dashboards.json b/superset-frontend/cypress-base/cypress/fixtures/dashboards.json new file mode 100644 index 000000000000..e4bd57971aee --- /dev/null +++ b/superset-frontend/cypress-base/cypress/fixtures/dashboards.json @@ -0,0 +1,46 @@ +[ + { + "dashboard_title": "1 - Sample dashboard", + "slug": "1-sample-dashboard" + }, + { + "dashboard_title": "2 - Sample dashboard", + "slug": "2-sample-dashboard" + }, + { + "dashboard_title": "3 - Sample dashboard", + "slug": "3-sample-dashboard" + }, + { + "dashboard_title": "4 - Sample dashboard", + "slug": "4-sample-dashboard" + }, + { + "dashboard_title": "5 - Sample dashboard", + "slug": "5-sample-dashboard" + }, + { + "dashboard_title": "6 - Sample dashboard", + "slug": "6-sample-dashboard" + }, + { + "dashboard_title": "7 - Sample dashboard", + "slug": "7-sample-dashboard" + }, + { + "dashboard_title": "8 - Sample dashboard", + "slug": "8-sample-dashboard" + }, + { + "dashboard_title": "9 - Sample dashboard", + "slug": "9-sample-dashboard" + }, + { + "dashboard_title": "10 - Sample dashboard", + "slug": "10-sample-dashboard" + }, + { + "dashboard_title": "11 - Sample dashboard", + "slug": "11-sample-dashboard" + } +] diff --git a/superset-frontend/cypress-base/cypress/fixtures/example.json b/superset-frontend/cypress-base/cypress/fixtures/example.json deleted file mode 100644 index 02e4254378e9..000000000000 --- a/superset-frontend/cypress-base/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} diff --git a/superset-frontend/cypress-base/cypress/integration/alerts_and_reports/alerts.test.ts b/superset-frontend/cypress-base/cypress/integration/alerts_and_reports/alerts.test.ts index 97bf2cc9be85..a695541ceecd 100644 --- a/superset-frontend/cypress-base/cypress/integration/alerts_and_reports/alerts.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/alerts_and_reports/alerts.test.ts @@ -16,31 +16,24 @@ * specific language governing permissions and limitations * under the License. */ -import { ALERT_LIST } from './alert_report.helper'; +import { ALERT_LIST } from 'cypress/utils/urls'; -describe('alert list view', () => { - beforeEach(() => { - cy.login(); - }); - - afterEach(() => { - cy.eyesClose(); +describe('Alert list view', () => { + before(() => { + cy.visit(ALERT_LIST); }); it('should load alert lists', () => { - cy.visit(ALERT_LIST); - - cy.get('[data-test="listview-table"]').should('be.visible'); - // check alert list view header - cy.get('[data-test="sort-header"]').eq(1).contains('Last run'); - cy.get('[data-test="sort-header"]').eq(2).contains('Name'); - cy.get('[data-test="sort-header"]').eq(3).contains('Schedule'); - cy.get('[data-test="sort-header"]').eq(4).contains('Notification method'); - cy.get('[data-test="sort-header"]').eq(5).contains('Created by'); - cy.get('[data-test="sort-header"]').eq(6).contains('Owners'); - cy.get('[data-test="sort-header"]').eq(7).contains('Modified'); - // TODO: this assert is flaky, we need to find a way to make it work consistenly - // cy.get('[data-test="sort-header"]').eq(7).contains('Active'); - // cy.get('[data-test="sort-header"]').eq(8).contains('Actions'); + cy.getBySel('listview-table').should('be.visible'); + cy.getBySel('sort-header').eq(1).contains('Last run'); + cy.getBySel('sort-header').eq(2).contains('Name'); + cy.getBySel('sort-header').eq(3).contains('Schedule'); + cy.getBySel('sort-header').eq(4).contains('Notification method'); + cy.getBySel('sort-header').eq(5).contains('Created by'); + cy.getBySel('sort-header').eq(6).contains('Owners'); + cy.getBySel('sort-header').eq(7).contains('Modified'); + cy.getBySel('sort-header').eq(8).contains('Active'); + // TODO Cypress won't recognize the Actions column + // cy.getBySel('sort-header').eq(9).contains('Actions'); }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/alerts_and_reports/reports.test.ts b/superset-frontend/cypress-base/cypress/integration/alerts_and_reports/reports.test.ts index ea117c507a6d..e267d76f6f7e 100644 --- a/superset-frontend/cypress-base/cypress/integration/alerts_and_reports/reports.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/alerts_and_reports/reports.test.ts @@ -16,31 +16,24 @@ * specific language governing permissions and limitations * under the License. */ -import { REPORT_LIST } from './alert_report.helper'; +import { REPORT_LIST } from 'cypress/utils/urls'; -describe('report list view', () => { - beforeEach(() => { - cy.login(); - }); - - afterEach(() => { - cy.eyesClose(); +describe('Report list view', () => { + before(() => { + cy.visit(REPORT_LIST); }); it('should load report lists', () => { - cy.visit(REPORT_LIST); - - cy.get('[data-test="listview-table"]').should('be.visible'); - // check report list view header - cy.get('[data-test="sort-header"]').eq(1).contains('Last run'); - cy.get('[data-test="sort-header"]').eq(2).contains('Name'); - cy.get('[data-test="sort-header"]').eq(3).contains('Schedule'); - cy.get('[data-test="sort-header"]').eq(4).contains('Notification method'); - cy.get('[data-test="sort-header"]').eq(5).contains('Created by'); - cy.get('[data-test="sort-header"]').eq(6).contains('Owners'); - cy.get('[data-test="sort-header"]').eq(7).contains('Modified'); - // TODO: this assert is flaky, we need to find a way to make it work consistenly - // cy.get('[data-test="sort-header"]').eq(7).contains('Active'); - // cy.get('[data-test="sort-header"]').eq(8).contains('Actions'); + cy.getBySel('listview-table').should('be.visible'); + cy.getBySel('sort-header').eq(1).contains('Last run'); + cy.getBySel('sort-header').eq(2).contains('Name'); + cy.getBySel('sort-header').eq(3).contains('Schedule'); + cy.getBySel('sort-header').eq(4).contains('Notification method'); + cy.getBySel('sort-header').eq(5).contains('Created by'); + cy.getBySel('sort-header').eq(6).contains('Owners'); + cy.getBySel('sort-header').eq(7).contains('Modified'); + cy.getBySel('sort-header').eq(8).contains('Active'); + // TODO Cypress won't recognize the Actions column + // cy.getBySel('sort-header').eq(9).contains('Actions'); }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/chart_list/card_view.test.ts b/superset-frontend/cypress-base/cypress/integration/chart_list/card_view.test.ts deleted file mode 100644 index 1335fcb42220..000000000000 --- a/superset-frontend/cypress-base/cypress/integration/chart_list/card_view.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { CHART_LIST } from './chart_list.helper'; - -describe('chart card view', () => { - beforeEach(() => { - cy.login(); - cy.visit(CHART_LIST); - cy.get('[aria-label="card-view"]').click(); - }); - - it('should load cards', () => { - cy.get('[data-test="chart-list-view"]'); - cy.get('[data-test="styled-card"]').should('be.visible'); - cy.get('[data-test="styled-card"]').should('have.length', 25); - }); - - it('should allow to favorite/unfavorite chart card', () => { - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-selected']") - .should('not.exist'); - cy.get("[data-test='card-actions']") - .find("[aria-label='favorite-unselected']") - .first() - .click(); - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-selected']") - .should('be.visible'); - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-unselected']") - .should('not.exist'); - - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-unselected']") - .should('not.exist'); - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-selected']") - .click(); - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-unselected']") - .should('be.visible'); - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-selected']") - .should('not.exist'); - }); - - xit('should sort correctly', () => { - // sort Alphabetical - cy.get('.Select__control').last().should('be.visible'); - cy.get('.Select__control').last().click(); - cy.get('.Select__menu').contains('Alphabetical').click(); - cy.get('[data-test="chart-list-view"]').should('be.visible'); - cy.get('[data-test="styled-card"]').first().contains('% Rural'); - - // sort Recently Modified - cy.get('.Select__control').last().should('be.visible'); - cy.get('.Select__control').last().click(); - cy.get('.Select__menu').contains('Recently Modified').click(); - cy.get('[data-test="chart-list-view"]').should('be.visible'); - // TODO - next line is/was flaky - cy.get('[data-test="styled-card"]').first().contains('Unicode Cloud'); - cy.get('[data-test="styled-card"]') - .last() - .contains('Life Expectancy VS Rural %'); - }); - - // flaky - xit('should delete correctly', () => { - // show delete modal - cy.get('[data-test="more-horiz"]').last().trigger('mouseover'); - cy.get('[data-test="chart-list-delete-option"]') - .last() - .should('be.visible'); - cy.get('[data-test="chart-list-delete-option"]') - .last() - .contains('Delete') - .click(); - cy.get('[data-test="Please Confirm-modal"]').should('be.visible'); - cy.get('[data-test="modal-confirm-button"]').should( - 'have.attr', - 'disabled', - ); - cy.get('[data-test="Please Confirm-modal"]').should('be.visible'); - cy.get("[data-test='delete-modal-input']").type('DELETE'); - cy.get('[data-test="modal-confirm-button"]').should( - 'not.have.attr', - 'disabled', - ); - cy.get('[data-test="modal-cancel-button"]').click(); - }); - - // flaky - xit('should edit correctly', () => { - // show edit modal - cy.get('[data-test="more-horiz"]').last().trigger('mouseover'); - cy.get('[data-test="chart-list-edit-option"]').last().should('be.visible'); - cy.get('[data-test="chart-list-edit-option"]').last().click(); - cy.get('[data-test="properties-edit-modal"]').should('be.visible'); - cy.get('[data-test="properties-modal-name-input"]').should( - 'not.have.value', - ); - cy.get('[data-test="properties-modal-cancel-button"]') - .contains('Cancel') - .click(); - }); -}); diff --git a/superset-frontend/cypress-base/cypress/integration/chart_list/chartlist.applitools.test.ts b/superset-frontend/cypress-base/cypress/integration/chart_list/chartlist.applitools.test.ts index f858f03f5f4b..92ad94bb7da6 100644 --- a/superset-frontend/cypress-base/cypress/integration/chart_list/chartlist.applitools.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/chart_list/chartlist.applitools.test.ts @@ -16,11 +16,10 @@ * specific language governing permissions and limitations * under the License. */ -import { CHART_LIST } from './chart_list.helper'; +import { CHART_LIST } from 'cypress/utils/urls'; describe('charts list view', () => { beforeEach(() => { - cy.login(); cy.visit(CHART_LIST); }); @@ -33,7 +32,7 @@ describe('charts list view', () => { cy.eyesOpen({ testName: 'Charts list-view', }); - cy.eyesCheckWindow('Charts loaded'); + cy.eyesCheckWindow('Charts list-view loaded'); }); it('should load the Charts card list', () => { @@ -41,6 +40,6 @@ describe('charts list view', () => { cy.eyesOpen({ testName: 'Charts card-view', }); - cy.eyesCheckWindow('Charts loaded'); + cy.eyesCheckWindow('Charts card-view loaded'); }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/chart_list/filter.test.ts b/superset-frontend/cypress-base/cypress/integration/chart_list/filter.test.ts index 4466cc2ad589..acd11669bea1 100644 --- a/superset-frontend/cypress-base/cypress/integration/chart_list/filter.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/chart_list/filter.test.ts @@ -16,119 +16,42 @@ * specific language governing permissions and limitations * under the License. */ -import { CHART_LIST } from './chart_list.helper'; +import { CHART_LIST } from 'cypress/utils/urls'; +import { setGridMode, clearAllInputs } from 'cypress/utils'; +import { setFilter } from '../explore/utils'; -describe('chart card view filters', () => { - beforeEach(() => { - cy.login(); +describe('Charts filters', () => { + before(() => { cy.visit(CHART_LIST); - cy.get('[aria-label="card-view"]').click(); - }); - - it('should filter by owners correctly', () => { - // filter by owners - cy.get('[data-test="filters-select"]').first().click(); - cy.get('.rc-virtual-list').contains('alpha user').click(); - cy.get('[data-test="styled-card"]').should('not.exist'); - cy.get('[data-test="filters-select"]').first().click(); - cy.get('.rc-virtual-list').contains('gamma user').click(); - cy.get('[data-test="styled-card"]').should('not.exist'); + setGridMode('card'); }); - it('should filter by created by correctly', () => { - // filter by created by - cy.get('[data-test="filters-select"]').eq(1).click(); - cy.get('.rc-virtual-list').contains('alpha user').click(); - cy.get('.ant-card').should('not.exist'); - cy.get('[data-test="filters-select"]').eq(1).click(); - cy.get('.rc-virtual-list').contains('gamma user').click(); - cy.get('[data-test="styled-card"]').should('not.exist'); - }); - - xit('should filter by viz type correctly', () => { - // filter by viz type - cy.get('[data-test="filters-select"]').eq(2).click(); - cy.get('.rc-virtual-list').contains('area').click({ timeout: 5000 }); - cy.get('[data-test="styled-card"]').its('length').should('be.gt', 0); - cy.get('[data-test="styled-card"]') - .contains("World's Pop Growth") - .should('be.visible'); - cy.get('[data-test="filters-select"]').eq(2).click(); - cy.get('[data-test="filters-select"]').eq(2).type('world_map{enter}'); - cy.get('[data-test="styled-card"]').should('have.length', 1); - cy.get('[data-test="styled-card"]') - .contains('% Rural') - .should('be.visible'); - }); - - it('should filter by datasource correctly', () => { - // filter by datasource - cy.get('[data-test="filters-select"]').eq(3).click(); - cy.get('.rc-virtual-list').contains('unicode_test').click(); - cy.get('[data-test="styled-card"]').should('have.length', 1); - cy.get('[data-test="styled-card"]') - .contains('Unicode Cloud') - .should('be.visible'); - cy.get('[data-test="filters-select"]').eq(2).click(); - cy.get('[data-test="filters-select"]') - .eq(2) - .type('energy_usage{enter}{enter}'); - cy.get('[data-test="styled-card"]').its('length').should('be.gt', 0); + beforeEach(() => { + clearAllInputs(); }); -}); -describe('chart list view filters', () => { - beforeEach(() => { - cy.login(); - cy.visit(CHART_LIST); - cy.get('[aria-label="list-view"]').click(); + it('should allow filtering by "Owner"', () => { + setFilter('Owner', 'alpha user'); + setFilter('Owner', 'admin user'); }); - it('should filter by owners correctly', () => { - // filter by owners - cy.get('[data-test="filters-select"]').first().click(); - cy.get('.rc-virtual-list').contains('alpha user').click(); - cy.get('[data-test="table-row"]').should('not.exist'); - cy.get('[data-test="filters-select"]').first().click(); - cy.get('.rc-virtual-list').contains('gamma user').click(); - cy.get('[data-test="table-row"]').should('not.exist'); + it('should allow filtering by "Created by" correctly', () => { + setFilter('Created by', 'alpha user'); + setFilter('Created by', 'admin user'); }); - it('should filter by created by correctly', () => { - // filter by created by - cy.get('[data-test="filters-select"]').eq(1).click(); - cy.get('.rc-virtual-list').contains('alpha user').click(); - cy.get('[data-test="table-row"]').should('not.exist'); - cy.get('[data-test="filters-select"]').eq(1).click(); - cy.get('.rc-virtual-list').contains('gamma user').click(); - cy.get('[data-test="table-row"]').should('not.exist'); + it('should allow filtering by "Chart type" correctly', () => { + setFilter('Chart type', 'Area Chart (legacy)'); + setFilter('Chart type', 'Bubble Chart'); }); - // this is flaky, but seems to fail along with the card view test of the same name - xit('should filter by viz type correctly', () => { - // filter by viz type - cy.get('[data-test="filters-select"]').eq(2).click(); - cy.get('.rc-virtual-list').contains('area').click({ timeout: 5000 }); - cy.get('[data-test="table-row"]').its('length').should('be.gt', 0); - cy.get('[data-test="table-row"]') - .contains("World's Pop Growth") - .should('exist'); - cy.get('[data-test="filters-select"]').eq(2).click(); - cy.get('[data-test="filters-select"]').eq(2).type('world_map{enter}'); - cy.get('[data-test="table-row"]').should('have.length', 1); - cy.get('[data-test="table-row"]').contains('% Rural').should('exist'); + it('should allow filtering by "Dataset" correctly', () => { + setFilter('Dataset', 'energy_usage'); + setFilter('Dataset', 'unicode_test'); }); - it('should filter by datasource correctly', () => { - // filter by datasource - cy.get('[data-test="filters-select"]').eq(3).click(); - cy.get('.rc-virtual-list').contains('unicode_test').click(); - cy.get('[data-test="table-row"]').should('have.length', 1); - cy.get('[data-test="table-row"]').contains('Unicode Cloud').should('exist'); - cy.get('[data-test="filters-select"]').eq(3).click(); - cy.get('[data-test="filters-select"]') - .eq(3) - .type('energy_usage{enter}{enter}'); - cy.get('[data-test="table-row"]').its('length').should('be.gt', 0); + it('should allow filtering by "Dashboards" correctly', () => { + setFilter('Dashboards', 'Unicode Test'); + setFilter('Dashboards', 'Tabbed Dashboard'); }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/chart_list/list.test.ts b/superset-frontend/cypress-base/cypress/integration/chart_list/list.test.ts new file mode 100644 index 000000000000..460b2cc02b46 --- /dev/null +++ b/superset-frontend/cypress-base/cypress/integration/chart_list/list.test.ts @@ -0,0 +1,294 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { CHART_LIST } from 'cypress/utils/urls'; +import { setGridMode, toggleBulkSelect } from 'cypress/utils'; +import { + setFilter, + interceptBulkDelete, + interceptUpdate, + interceptDelete, + visitSampleChartFromList, + saveChartToDashboard, + interceptFiltering, +} from '../explore/utils'; +import { interceptGet as interceptDashboardGet } from '../dashboard/utils'; + +function orderAlphabetical() { + setFilter('Sort', 'Alphabetical'); +} + +function openProperties() { + cy.get('[aria-label="more-vert"]').eq(1).click(); + cy.getBySel('chart-list-edit-option').click(); +} + +function openMenu() { + cy.get('[aria-label="more-vert"]').eq(1).click(); +} + +function confirmDelete() { + cy.getBySel('delete-modal-input').type('DELETE'); + cy.getBySel('modal-confirm-button').click(); +} + +function visitChartList() { + interceptFiltering(); + cy.visit(CHART_LIST); + cy.wait('@filtering'); +} + +describe('Charts list', () => { + describe.skip('Cross-referenced dashboards', () => { + beforeEach(() => { + cy.createSampleDashboards([0, 1, 2, 3]); + cy.createSampleCharts([0]); + visitChartList(); + }); + + it('should show the cross-referenced dashboards in the table cell', () => { + interceptDashboardGet(); + cy.getBySel('table-row') + .first() + .find('[data-test="table-row-cell"]') + .find('[data-test="crosslinks"]') + .should('be.empty'); + cy.getBySel('table-row') + .eq(10) + .find('[data-test="table-row-cell"]') + .find('[data-test="crosslinks"]') + .contains('Supported Charts Dashboard') + .invoke('removeAttr', 'target') + .click(); + cy.wait('@get'); + }); + + it('should show the newly added dashboards in a tooltip', () => { + interceptDashboardGet(); + visitSampleChartFromList('1 - Sample chart'); + saveChartToDashboard('1 - Sample dashboard'); + saveChartToDashboard('2 - Sample dashboard'); + saveChartToDashboard('3 - Sample dashboard'); + visitChartList(); + cy.getBySel('count-crosslinks').should('be.visible'); + cy.getBySel('crosslinks') + .first() + .trigger('mouseover') + .then(() => { + cy.get('.ant-tooltip') + .contains('3 - Sample dashboard') + .invoke('removeAttr', 'target') + .click(); + cy.wait('@get'); + }); + }); + }); + + describe('list mode', () => { + before(() => { + cy.createSampleDashboards([0, 1, 2, 3]); + cy.createSampleCharts([0]); + visitChartList(); + setGridMode('list'); + }); + + it('should load rows in list mode', () => { + cy.getBySel('listview-table').should('be.visible'); + cy.getBySel('sort-header').eq(1).contains('Chart'); + cy.getBySel('sort-header').eq(2).contains('Visualization type'); + cy.getBySel('sort-header').eq(3).contains('Dataset'); + // cy.getBySel('sort-header').eq(4).contains('Dashboards added to'); + cy.getBySel('sort-header').eq(4).contains('Modified by'); + cy.getBySel('sort-header').eq(5).contains('Last modified'); + cy.getBySel('sort-header').eq(6).contains('Created by'); + cy.getBySel('sort-header').eq(7).contains('Actions'); + }); + + it('should sort correctly in list mode', () => { + cy.getBySel('sort-header').eq(1).click(); + cy.getBySel('table-row').first().contains('% Rural'); + cy.getBySel('sort-header').eq(1).click(); + cy.getBySel('table-row').first().contains("World's Population"); + cy.getBySel('sort-header').eq(1).click(); + }); + + it('should bulk select in list mode', () => { + toggleBulkSelect(); + cy.get('#header-toggle-all').click(); + cy.get('[aria-label="checkbox-on"]').should('have.length', 26); + cy.getBySel('bulk-select-copy').contains('25 Selected'); + cy.getBySel('bulk-select-action') + .should('have.length', 2) + .then($btns => { + expect($btns).to.contain('Delete'); + expect($btns).to.contain('Export'); + }); + cy.getBySel('bulk-select-deselect-all').click(); + cy.get('[aria-label="checkbox-on"]').should('have.length', 0); + cy.getBySel('bulk-select-copy').contains('0 Selected'); + cy.getBySel('bulk-select-action').should('not.exist'); + }); + }); + + describe('card mode', () => { + before(() => { + visitChartList(); + setGridMode('card'); + }); + + it('should load rows in card mode', () => { + cy.getBySel('listview-table').should('not.exist'); + cy.getBySel('styled-card').should('have.length', 25); + }); + + it('should bulk select in card mode', () => { + toggleBulkSelect(); + cy.getBySel('styled-card').click({ multiple: true }); + cy.getBySel('bulk-select-copy').contains('25 Selected'); + cy.getBySel('bulk-select-action') + .should('have.length', 2) + .then($btns => { + expect($btns).to.contain('Delete'); + expect($btns).to.contain('Export'); + }); + cy.getBySel('bulk-select-deselect-all').click(); + cy.getBySel('bulk-select-copy').contains('0 Selected'); + cy.getBySel('bulk-select-action').should('not.exist'); + }); + + it('should sort in card mode', () => { + orderAlphabetical(); + cy.getBySel('styled-card').first().contains('% Rural'); + }); + }); + + describe('common actions', () => { + beforeEach(() => { + cy.createSampleCharts([0, 1, 2, 3]); + visitChartList(); + }); + + it('should allow to favorite/unfavorite', () => { + cy.intercept(`/superset/favstar/slice/*/select/`).as('select'); + cy.intercept(`/superset/favstar/slice/*/unselect/`).as('unselect'); + + setGridMode('card'); + orderAlphabetical(); + + cy.getBySel('styled-card').first().contains('% Rural'); + cy.getBySel('styled-card') + .first() + .find("[aria-label='favorite-unselected']") + .click(); + cy.wait('@select'); + cy.getBySel('styled-card') + .first() + .find("[aria-label='favorite-selected']") + .click(); + cy.wait('@unselect'); + cy.getBySel('styled-card') + .first() + .find("[aria-label='favorite-selected']") + .should('not.exist'); + }); + + it('should bulk delete correctly', () => { + interceptBulkDelete(); + toggleBulkSelect(); + + // bulk deletes in card-view + setGridMode('card'); + orderAlphabetical(); + + cy.getBySel('styled-card').eq(1).contains('1 - Sample chart').click(); + cy.getBySel('styled-card').eq(2).contains('2 - Sample chart').click(); + cy.getBySel('bulk-select-action').eq(0).contains('Delete').click(); + confirmDelete(); + cy.wait('@bulkDelete'); + cy.getBySel('styled-card') + .eq(1) + .should('not.contain', '1 - Sample chart'); + cy.getBySel('styled-card') + .eq(2) + .should('not.contain', '2 - Sample chart'); + + // bulk deletes in list-view + setGridMode('list'); + cy.getBySel('table-row').eq(1).contains('3 - Sample chart'); + cy.getBySel('table-row').eq(2).contains('4 - Sample chart'); + cy.get('[data-test="table-row"] input[type="checkbox"]').eq(1).click(); + cy.get('[data-test="table-row"] input[type="checkbox"]').eq(2).click(); + cy.getBySel('bulk-select-action').eq(0).contains('Delete').click(); + confirmDelete(); + cy.wait('@bulkDelete'); + cy.getBySel('table-row').eq(1).should('not.contain', '3 - Sample chart'); + cy.getBySel('table-row').eq(2).should('not.contain', '4 - Sample chart'); + }); + + it('should delete correctly', () => { + interceptDelete(); + + // deletes in card-view + setGridMode('card'); + orderAlphabetical(); + + cy.getBySel('styled-card').eq(1).contains('1 - Sample chart'); + openMenu(); + cy.getBySel('chart-list-delete-option').click(); + confirmDelete(); + cy.wait('@delete'); + cy.getBySel('styled-card') + .eq(1) + .should('not.contain', '1 - Sample chart'); + + // deletes in list-view + setGridMode('list'); + cy.getBySel('table-row').eq(1).contains('2 - Sample chart'); + cy.getBySel('trash').eq(1).click(); + confirmDelete(); + cy.wait('@delete'); + cy.getBySel('table-row').eq(1).should('not.contain', '2 - Sample chart'); + }); + + it('should edit correctly', () => { + interceptUpdate(); + + // edits in card-view + setGridMode('card'); + orderAlphabetical(); + cy.getBySel('styled-card').eq(1).contains('1 - Sample chart'); + + // change title + openProperties(); + cy.getBySel('properties-modal-name-input').type(' | EDITED'); + cy.get('button:contains("Save")').click(); + cy.wait('@update'); + cy.getBySel('styled-card').eq(1).contains('1 - Sample chart | EDITED'); + + // edits in list-view + setGridMode('list'); + cy.getBySel('edit-alt').eq(1).click(); + cy.getBySel('properties-modal-name-input') + .clear() + .type('1 - Sample chart'); + cy.get('button:contains("Save")').click(); + cy.wait('@update'); + cy.getBySel('table-row').eq(1).contains('1 - Sample chart'); + }); + }); +}); diff --git a/superset-frontend/cypress-base/cypress/integration/chart_list/list_view.test.ts b/superset-frontend/cypress-base/cypress/integration/chart_list/list_view.test.ts deleted file mode 100644 index 42313d78495f..000000000000 --- a/superset-frontend/cypress-base/cypress/integration/chart_list/list_view.test.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { CHART_LIST } from './chart_list.helper'; - -describe('chart list view', () => { - beforeEach(() => { - cy.login(); - }); - - it('should load rows', () => { - cy.visit(CHART_LIST); - cy.get('[aria-label="list-view"]').click(); - - cy.get('[data-test="listview-table"]').should('be.visible'); - // check chart list view header - cy.get('[data-test="sort-header"]').eq(1).contains('Chart'); - cy.get('[data-test="sort-header"]').eq(2).contains('Visualization type'); - cy.get('[data-test="sort-header"]').eq(3).contains('Dataset'); - cy.get('[data-test="sort-header"]').eq(4).contains('Modified by'); - cy.get('[data-test="sort-header"]').eq(5).contains('Last modified'); - cy.get('[data-test="sort-header"]').eq(6).contains('Created by'); - cy.get('[data-test="sort-header"]').eq(7).contains('Actions'); - cy.get('[data-test="table-row"]').should('have.length', 25); - }); - - xit('should sort correctly', () => { - cy.get('[data-test="sort-header"]').eq(2).click(); - cy.get('[data-test="sort-header"]').eq(2).click(); - cy.get('[data-test="table-row"]') - .first() - .find('[data-test="table-row-cell"]') - .find('[data-test="cell-text"]') - .contains('Location of Current Developers'); - }); - - it('should bulk delete correctly', () => { - // Load the chart list order by name asc. - // This will ensure the tests stay consistent, and the - // same charts get deleted every time - cy.visit(CHART_LIST, { - qs: { - sortColumn: 'slice_name', - sortOrder: 'asc', - }, - }); - cy.get('[aria-label="list-view"]').click(); - - cy.get('[data-test="listview-table"]').should('be.visible'); - cy.get('[data-test="bulk-select"]').eq(0).click(); - cy.get('[aria-label="checkbox-off"]').eq(1).siblings('input').click(); - cy.get('[aria-label="checkbox-off"]').eq(2).siblings('input').click(); - cy.get('[data-test="bulk-select-action"]').eq(0).click(); - cy.get('[data-test="delete-modal-input"]').eq(0).type('DELETE'); - cy.get('[data-test="modal-confirm-button"]').eq(0).click(); - cy.get('[aria-label="checkbox-on"]').should('not.exist'); - }); -}); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/controls.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/_skip.controls.test.ts similarity index 92% rename from superset-frontend/cypress-base/cypress/integration/dashboard/controls.test.ts rename to superset-frontend/cypress-base/cypress/integration/dashboard/_skip.controls.test.ts index 961e71bfd639..4a65d68cf588 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/controls.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/dashboard/_skip.controls.test.ts @@ -17,22 +17,21 @@ * under the License. */ import { - WORLD_HEALTH_CHARTS, - WORLD_HEALTH_DASHBOARD, waitForChartLoad, ChartSpec, getChartAliasesBySpec, -} from './dashboard.helper'; +} from 'cypress/utils'; +import { WORLD_HEALTH_DASHBOARD } from 'cypress/utils/urls'; +import { WORLD_HEALTH_CHARTS } from './utils'; import { isLegacyResponse } from '../../utils/vizPlugins'; -describe('Dashboard top-level controls', () => { +describe.skip('Dashboard top-level controls', () => { beforeEach(() => { - cy.login(); cy.visit(WORLD_HEALTH_DASHBOARD); }); // flaky test - xit('should allow chart level refresh', () => { + it('should allow chart level refresh', () => { const mapSpec = WORLD_HEALTH_CHARTS.find( ({ viz }) => viz === 'world_map', ) as ChartSpec; @@ -58,7 +57,7 @@ describe('Dashboard top-level controls', () => { }); }); - xit('should allow dashboard level force refresh', () => { + it('should allow dashboard level force refresh', () => { // when charts are not start loading, for example, under a secondary tab, // should allow force refresh WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/filter.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/_skip.filter.test.ts similarity index 91% rename from superset-frontend/cypress-base/cypress/integration/dashboard/filter.test.ts rename to superset-frontend/cypress-base/cypress/integration/dashboard/_skip.filter.test.ts index e1dd45cf3c30..6ae5d1e5d6fe 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/filter.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/dashboard/_skip.filter.test.ts @@ -16,21 +16,21 @@ * specific language governing permissions and limitations * under the License. */ -import { isLegacyResponse, parsePostForm } from 'cypress/utils'; import { - WORLD_HEALTH_CHARTS, - WORLD_HEALTH_DASHBOARD, + isLegacyResponse, + parsePostForm, getChartAliasesBySpec, waitForChartLoad, -} from './dashboard.helper'; +} from 'cypress/utils'; +import { WORLD_HEALTH_DASHBOARD } from 'cypress/utils/urls'; +import { WORLD_HEALTH_CHARTS } from './utils'; -describe('Dashboard filter', () => { +describe.skip('Dashboard filter', () => { before(() => { - cy.login(); cy.visit(WORLD_HEALTH_DASHBOARD); }); - xit('should apply filter', () => { + it('should apply filter', () => { WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); getChartAliasesBySpec( WORLD_HEALTH_CHARTS.filter(({ viz }) => viz !== 'filter_box'), diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/key_value.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/_skip.key_value.test.ts similarity index 90% rename from superset-frontend/cypress-base/cypress/integration/dashboard/key_value.test.ts rename to superset-frontend/cypress-base/cypress/integration/dashboard/_skip.key_value.test.ts index 1738ea5bd3d0..2fc640e86165 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/key_value.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/dashboard/_skip.key_value.test.ts @@ -17,21 +17,16 @@ * under the License. */ import qs from 'querystringify'; -import { - WORLD_HEALTH_DASHBOARD, - WORLD_HEALTH_CHARTS, - waitForChartLoad, -} from './dashboard.helper'; +import { waitForChartLoad } from 'cypress/utils'; +import { WORLD_HEALTH_DASHBOARD } from 'cypress/utils/urls'; +import { WORLD_HEALTH_CHARTS } from './utils'; interface QueryString { native_filters_key: string; } -xdescribe('nativefilter url param key', () => { +describe.skip('nativefilter url param key', () => { // const urlParams = { param1: '123', param2: 'abc' }; - before(() => { - cy.login(); - }); let initialFilterKey: string; it('should have cachekey in nativefilter param', () => { diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/url_params.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/_skip.url_params.test.ts similarity index 83% rename from superset-frontend/cypress-base/cypress/integration/dashboard/url_params.test.ts rename to superset-frontend/cypress-base/cypress/integration/dashboard/_skip.url_params.test.ts index 5f9ad7382e15..686c9e7536c9 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/url_params.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/dashboard/_skip.url_params.test.ts @@ -16,22 +16,17 @@ * specific language governing permissions and limitations * under the License. */ -import { parsePostForm, JsonObject } from 'cypress/utils'; -import { - WORLD_HEALTH_DASHBOARD, - WORLD_HEALTH_CHARTS, - waitForChartLoad, -} from './dashboard.helper'; +import { parsePostForm, JsonObject, waitForChartLoad } from 'cypress/utils'; +import { WORLD_HEALTH_DASHBOARD } from 'cypress/utils/urls'; +import { WORLD_HEALTH_CHARTS } from './utils'; -describe('Dashboard form data', () => { +describe.skip('Dashboard form data', () => { const urlParams = { param1: '123', param2: 'abc' }; before(() => { - cy.login(); - cy.visit(WORLD_HEALTH_DASHBOARD, { qs: urlParams }); }); - xit('should apply url params to slice requests', () => { + it('should apply url params to slice requests', () => { cy.intercept('/api/v1/chart/data?*', request => { // TODO: export url params to chart data API request.body.queries.forEach((query: { url_params: JsonObject }) => { diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/actions.test.js b/superset-frontend/cypress-base/cypress/integration/dashboard/actions.test.js new file mode 100644 index 000000000000..8d520d972989 --- /dev/null +++ b/superset-frontend/cypress-base/cypress/integration/dashboard/actions.test.js @@ -0,0 +1,44 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { SAMPLE_DASHBOARD_1 } from 'cypress/utils/urls'; +import { interceptFav, interceptUnfav } from './utils'; + +describe('Dashboard actions', () => { + beforeEach(() => { + cy.createSampleDashboards([0]); + cy.visit(SAMPLE_DASHBOARD_1); + }); + + it('should allow to favorite/unfavorite dashboard', () => { + interceptFav(); + interceptUnfav(); + + cy.getBySel('dashboard-header-container') + .find("[aria-label='favorite-unselected']") + .click(); + cy.wait('@select'); + cy.getBySel('dashboard-header-container') + .find("[aria-label='favorite-selected']") + .click(); + cy.wait('@unselect'); + cy.getBySel('dashboard-header-container') + .find("[aria-label='favorite-selected']") + .should('not.exist'); + }); +}); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/dashboard.applitools.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/dashboard.applitools.test.ts index d492175a5e3a..297702bce250 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/dashboard.applitools.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/dashboard/dashboard.applitools.test.ts @@ -16,15 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -import { - waitForChartLoad, - WORLD_HEALTH_CHARTS, - WORLD_HEALTH_DASHBOARD, -} from './dashboard.helper'; +import { WORLD_HEALTH_DASHBOARD } from 'cypress/utils/urls'; +import { waitForChartLoad } from 'cypress/utils'; +import { WORLD_HEALTH_CHARTS } from './utils'; describe('Dashboard load', () => { beforeEach(() => { - cy.login(); cy.visit(WORLD_HEALTH_DASHBOARD); WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); }); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/dashboard.helper.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/dashboard.helper.ts deleted file mode 100644 index 24eab4284f49..000000000000 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/dashboard.helper.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { getChartAlias, Slice } from 'cypress/utils/vizPlugins'; -import { dashboardView } from 'cypress/support/directories'; - -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -export const WORLD_HEALTH_DASHBOARD = '/superset/dashboard/world_health/'; -export const testDashboard = '/superset/dashboard/538/'; -export const TABBED_DASHBOARD = '/superset/dashboard/tabbed_dash/'; - -export const testItems = { - dashboard: 'Cypress test Dashboard', - dataset: 'Vehicle Sales', - datasetForNativeFilter: 'wb_health_population', - chart: 'Cypress chart', - newChart: 'New Cypress Chart', - createdDashboard: 'New Dashboard', - defaultNameDashboard: '[ untitled dashboard ]', - newDashboardTitle: `Test dashboard [NEW TEST]`, - bulkFirstNameDashboard: 'First Dash', - bulkSecondNameDashboard: 'Second Dash', - worldBanksDataCopy: `World Bank's Data [copy]`, - filterType: { - value: 'Value', - numerical: 'Numerical range', - timeColumn: 'Time column', - timeGrain: 'Time grain', - timeRange: 'Time range', - }, - topTenChart: { - name: 'Most Populated Countries', - filterColumn: 'country_name', - filterColumnYear: 'year', - filterColumnRegion: 'region', - filterColumnCountryCode: 'country_code', - }, - filterDefaultValue: 'United States', - filterOtherCountry: 'China', - filterTimeGrain: 'Month', - filterTimeColumn: 'created', - filterNumericalColumn: 'SP_RUR_TOTL_ZS', -}; - -export const CHECK_DASHBOARD_FAVORITE_ENDPOINT = - '/superset/favstar/Dashboard/*/count'; - -export const WORLD_HEALTH_CHARTS = [ - { name: '% Rural', viz: 'world_map' }, - { name: 'Most Populated Countries', viz: 'table' }, - { name: 'Region Filter', viz: 'filter_box' }, - { name: "World's Population", viz: 'big_number' }, - { name: 'Growth Rate', viz: 'line' }, - { name: 'Rural Breakdown', viz: 'sunburst' }, - { name: "World's Pop Growth", viz: 'area' }, - { name: 'Life Expectancy VS Rural %', viz: 'bubble' }, - { name: 'Treemap', viz: 'treemap' }, - { name: 'Box plot', viz: 'box_plot' }, -] as const; - -/** Used to specify charts expected by the test suite */ -export interface ChartSpec { - name: string; - viz: string; -} - -export function getChartGridComponent({ name, viz }: ChartSpec) { - return cy - .get(`[data-test="chart-grid-component"][data-test-chart-name="${name}"]`) - .should('have.attr', 'data-test-viz-type', viz); -} - -export function waitForChartLoad(chart: ChartSpec) { - return getChartGridComponent(chart).then(gridComponent => { - const chartId = gridComponent.attr('data-test-chart-id'); - // the chart should load in under half a minute - return ( - cy - // this id only becomes visible when the chart is loaded - .get(`[data-test="chart-grid-component"] #chart-id-${chartId}`, { - timeout: 30000, - }) - .should('be.visible') - // return the chart grid component - .then(() => gridComponent) - ); - }); -} - -const toSlicelike = ($chart: JQuery<HTMLElement>): Slice => ({ - slice_id: parseInt($chart.attr('data-test-chart-id')!, 10), - form_data: { - viz_type: $chart.attr('data-test-viz-type')!, - }, -}); - -export function getChartAliasBySpec(chart: ChartSpec) { - return getChartGridComponent(chart).then($chart => - cy.wrap(getChartAlias(toSlicelike($chart))), - ); -} - -export function getChartAliasesBySpec(charts: readonly ChartSpec[]) { - const aliases: string[] = []; - charts.forEach(chart => - getChartAliasBySpec(chart).then(alias => { - aliases.push(alias); - }), - ); - // Wrapping the aliases is key. - // That way callers can chain off this function - // and actually get the list of aliases. - return cy.wrap(aliases); -} - -/** - * Drag an element and drop it to another element. - * Usage: - * drag(source).to(target); - */ -export function drag(selector: string, content: string | number | RegExp) { - const dataTransfer = { data: {} }; - return { - to(target: string | Cypress.Chainable) { - cy.get('.dragdroppable') - .contains(selector, content) - .trigger('mousedown', { which: 1 }) - .trigger('dragstart', { dataTransfer }) - .trigger('drag', {}); - - (typeof target === 'string' ? cy.get(target) : target) - .trigger('dragover', { dataTransfer }) - .trigger('drop', { dataTransfer }) - .trigger('dragend', { dataTransfer }) - .trigger('mouseup', { which: 1 }); - }, - }; -} - -export function resize(selector: string) { - return { - to(cordX: number, cordY: number) { - cy.get(selector) - .trigger('mousedown', { which: 1, force: true }) - .trigger('mousemove', { which: 1, cordX, cordY, force: true }) - .trigger('mouseup', { which: 1, force: true }); - }, - }; -} - -export function cleanUp() { - cy.deleteDashboardByName(testItems.dashboard); - cy.deleteDashboardByName(testItems.defaultNameDashboard); - cy.deleteDashboardByName(''); - cy.deleteDashboardByName(testItems.newDashboardTitle); - cy.deleteDashboardByName(testItems.bulkFirstNameDashboard); - cy.deleteDashboardByName(testItems.bulkSecondNameDashboard); - cy.deleteDashboardByName(testItems.createdDashboard); - cy.deleteDashboardByName(testItems.worldBanksDataCopy); - cy.deleteChartByName(testItems.chart); - cy.deleteChartByName(testItems.newChart); -} - -/** ************************************************************************ - * Copy dashboard for testing purpose - * @returns {None} - * @summary helper for copy dashboard for testing purpose - ************************************************************************* */ -export function copyTestDashboard(dashboard: string) { - cy.intercept('POST', '**/copy_dash/**').as('copy'); - cy.intercept('GET', '**/api/v1/dataset/**').as('datasetLoad'); - cy.intercept('**/api/v1/dashboard/?q=**').as('dashboardsList'); - cy.intercept('**/api/v1/dashboard/**').as('dashboard'); - cy.visit('dashboard/list/'); - cy.contains('Actions'); - cy.wait('@dashboardsList').then(xhr => { - const dashboards = xhr.response?.body.result; - /* eslint-disable no-unused-expressions */ - expect(dashboards).not.to.be.undefined; - const testDashboard = dashboards.find( - (d: { dashboard_title: string }) => d.dashboard_title === `${dashboard}`, - ); - cy.visit(testDashboard.url); - }); - cy.get(dashboardView.threeDotsMenuIcon).should('be.visible').click(); - cy.get(dashboardView.saveAsMenuOption).click(); - cy.get(dashboardView.saveModal.dashboardNameInput) - .should('be.visible') - .clear() - .type(testItems.dashboard); - cy.get(dashboardView.saveModal.saveButton).click(); - cy.wait('@copy', { timeout: 45000 }) - .its('response.statusCode') - .should('eq', 200); -} diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/drilltodetail.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/drilltodetail.test.ts new file mode 100644 index 000000000000..2ab4966d57d0 --- /dev/null +++ b/superset-frontend/cypress-base/cypress/integration/dashboard/drilltodetail.test.ts @@ -0,0 +1,612 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { waitForChartLoad } from 'cypress/utils'; +import { SUPPORTED_CHARTS_DASHBOARD } from 'cypress/utils/urls'; +import { SUPPORTED_TIER1_CHARTS, SUPPORTED_TIER2_CHARTS } from './utils'; + +function interceptSamples() { + cy.intercept(`/datasource/samples*`).as('samples'); +} + +function openModalFromMenu(chartType: string) { + interceptSamples(); + + cy.get( + `[data-test-viz-type='${chartType}'] [aria-label='More Options']`, + ).click(); + cy.get('.ant-dropdown') + .not('.ant-dropdown-hidden') + .find("[role='menu'] [role='menuitem']") + .eq(5) + .should('contain', 'Drill to detail') + .click(); + cy.wait('@samples'); +} + +function openModalFromChartContext(targetMenuItem: string) { + interceptSamples(); + + cy.wait(500); + if (targetMenuItem.startsWith('Drill to detail by')) { + cy.get('.ant-dropdown') + .not('.ant-dropdown-hidden') + .first() + .find("[role='menu'] [role='menuitem'] [title='Drill to detail by']") + .trigger('mouseover'); + cy.wait(500); + cy.get('[data-test="drill-to-detail-by-submenu"]') + .not('.ant-dropdown-menu-hidden [data-test="drill-to-detail-by-submenu"]') + .find('[role="menuitem"]') + .contains(new RegExp(`^${targetMenuItem}$`)) + .first() + .click(); + } else { + cy.get('.ant-dropdown') + .not('.ant-dropdown-hidden') + .first() + .find("[role='menu'] [role='menuitem']") + .contains(new RegExp(`^${targetMenuItem}$`)) + .first() + .click(); + } + cy.getBySel('metadata-bar').should('be.visible'); + cy.wait('@samples'); +} + +function closeModal() { + cy.get('body').then($body => { + if ($body.find('[data-test="close-drilltodetail-modal"]').length) { + cy.getBySel('close-drilltodetail-modal').click({ force: true }); + } + }); +} + +function setTopLevelTab(tabName: string) { + cy.get("div#TABS-TOP div[role='tab']").contains(tabName).click(); +} + +function testTimeChart(vizType: string) { + interceptSamples(); + + cy.get(`[data-test-viz-type='${vizType}'] canvas`).then($canvas => { + cy.wrap($canvas) + .scrollIntoView() + .trigger('mousemove', 70, 93) + .rightclick(70, 93); + + openModalFromChartContext('Drill to detail by 1965'); + cy.getBySel('filter-val').should('contain', '1965'); + closeModal(); + + cy.wrap($canvas) + .scrollIntoView() + .trigger('mousemove', 70, 93) + .rightclick(70, 93); + + openModalFromChartContext('Drill to detail by boy'); + cy.getBySel('filter-val').should('contain', 'boy'); + closeModal(); + + cy.wrap($canvas) + .scrollIntoView() + .trigger('mousemove', 70, 93) + .rightclick(70, 93); + + openModalFromChartContext('Drill to detail by all'); + cy.getBySel('filter-val').first().should('contain', '1965'); + cy.getBySel('filter-val').eq(1).should('contain', 'boy'); + closeModal(); + + cy.wrap($canvas) + .scrollIntoView() + .trigger('mousemove', 70, 145) + .rightclick(70, 145); + openModalFromChartContext('Drill to detail by girl'); + cy.getBySel('filter-val').should('contain', 'girl'); + closeModal(); + + cy.wrap($canvas) + .scrollIntoView() + .trigger('mousemove', 70, 145) + .rightclick(70, 145); + openModalFromChartContext('Drill to detail by all'); + cy.getBySel('filter-val').first().should('contain', '1965'); + cy.getBySel('filter-val').eq(1).should('contain', 'girl'); + }); +} + +describe('Drill to detail modal', () => { + beforeEach(() => { + closeModal(); + }); + + describe('Tier 1 charts', () => { + before(() => { + cy.visit(SUPPORTED_CHARTS_DASHBOARD); + setTopLevelTab('Tier 1'); + SUPPORTED_TIER1_CHARTS.forEach(waitForChartLoad); + }); + + describe('Modal actions', () => { + it('opens the modal from the context menu', () => { + openModalFromMenu('big_number_total'); + + cy.get("[role='dialog'] .draggable-trigger").should( + 'contain', + 'Drill to detail: Big Number', + ); + }); + + it('refreshes the data', () => { + openModalFromMenu('big_number_total'); + // move to the last page + cy.get('.ant-pagination-item').eq(5).click(); + // skips error on pagination + cy.on('uncaught:exception', () => false); + cy.wait('@samples'); + // reload + cy.get("[aria-label='reload']").click(); + cy.wait('@samples'); + // make sure it started back from first page + cy.get('.ant-pagination-item-active').should('contain', '1'); + }); + + it('paginates', () => { + openModalFromMenu('big_number_total'); + // checking the data + cy.getBySel('row-count-label').should('contain', '75.7k rows'); + cy.get('.virtual-table-cell').should($rows => { + expect($rows).to.contain('Amy'); + }); + // checking the paginated data + cy.get('.ant-pagination-item') + .should('have.length', 6) + .should($pages => { + expect($pages).to.contain('1'); + expect($pages).to.contain('1514'); + }); + cy.get('.ant-pagination-item').eq(4).click(); + // skips error on pagination + cy.on('uncaught:exception', () => false); + cy.wait('@samples'); + cy.get('.virtual-table-cell').should($rows => { + expect($rows).to.contain('Kelly'); + }); + + // verify scroll top on pagination + cy.getBySelLike('Number-modal').find('.virtual-grid').scrollTo(0, 200); + + cy.get('.virtual-grid').contains('Juan').should('not.be.visible'); + + cy.get('.ant-pagination-item').eq(0).click(); + + cy.get('.virtual-grid').contains('Aaron').should('be.visible'); + }); + }); + + describe('Big number total', () => { + it('opens the modal with no filters', () => { + interceptSamples(); + + // opens the modal by clicking on the number on the chart + cy.get("[data-test-viz-type='big_number_total'] .header-line") + .scrollIntoView() + .rightclick(); + + openModalFromChartContext('Drill to detail'); + + cy.getBySel('filter-val').should('not.exist'); + }); + }); + + describe('Big number with trendline', () => { + it('opens the modal with the correct data', () => { + interceptSamples(); + + // opens the modal by clicking on the number + cy.get("[data-test-viz-type='big_number'] .header-line") + .scrollIntoView() + .rightclick(); + + openModalFromChartContext('Drill to detail'); + + cy.getBySel('filter-val').should('not.exist'); + + closeModal(); + + // opens the modal by clicking on the trendline + cy.get("[data-test-viz-type='big_number'] canvas").then($canvas => { + cy.wrap($canvas) + .scrollIntoView() + .trigger('mousemove', 1, 14) + .rightclick(1, 14); + + openModalFromChartContext('Drill to detail by 1965'); + + // checking the filter + cy.getBySel('filter-val').should('contain', '1965'); + }); + }); + }); + + describe('Table', () => { + it('opens the modal with the correct filters', () => { + interceptSamples(); + + cy.get("[data-test-viz-type='table']") + .scrollIntoView() + .contains('boy') + .rightclick(); + + openModalFromChartContext('Drill to detail by boy'); + + cy.getBySel('filter-val').should('contain', 'boy'); + + closeModal(); + + cy.get("[data-test-viz-type='table']") + .scrollIntoView() + .contains('girl') + .rightclick(); + + openModalFromChartContext('Drill to detail by girl'); + + cy.getBySel('filter-val').should('contain', 'girl'); + }); + }); + + describe('Pivot Table V2', () => { + it('opens the modal with the correct filters', () => { + interceptSamples(); + + cy.get("[data-test-viz-type='pivot_table_v2']") + .scrollIntoView() + .find('[role="gridcell"]') + .first() + .rightclick(); + + openModalFromChartContext('Drill to detail by boy'); + + cy.getBySel('filter-val').should('contain', 'boy'); + closeModal(); + + cy.get("[data-test-viz-type='pivot_table_v2']") + .scrollIntoView() + .find('[role="gridcell"]') + .first() + .rightclick(); + + openModalFromChartContext('Drill to detail by CA'); + + cy.getBySel('filter-val').should('contain', 'CA'); + closeModal(); + + cy.get("[data-test-viz-type='pivot_table_v2']") + .scrollIntoView() + .find('[role="gridcell"]') + .eq(3) + .rightclick(); + + openModalFromChartContext('Drill to detail by girl'); + + cy.getBySel('filter-val').should('contain', 'girl'); + closeModal(); + + cy.get("[data-test-viz-type='pivot_table_v2']") + .scrollIntoView() + .find('[role="gridcell"]') + .eq(3) + .rightclick(); + + openModalFromChartContext('Drill to detail by FL'); + + cy.getBySel('filter-val').should('contain', 'FL'); + closeModal(); + + cy.get("[data-test-viz-type='pivot_table_v2']") + .scrollIntoView() + .find('[role="gridcell"]') + .eq(3) + .rightclick(); + + openModalFromChartContext('Drill to detail by all'); + + cy.getBySel('filter-val').first().should('contain', 'girl'); + cy.getBySel('filter-val').eq(1).should('contain', 'FL'); + }); + }); + + describe('Time-Series Line Chart', () => { + it('opens the modal with the correct filters', () => { + testTimeChart('echarts_timeseries_line'); + }); + }); + + describe('Time-series Bar Chart', () => { + it('opens the modal with the correct filters', () => { + interceptSamples(); + + cy.get("[data-test-viz-type='echarts_timeseries_bar'] canvas").then( + $canvas => { + cy.wrap($canvas).scrollIntoView().rightclick(70, 100); + + openModalFromChartContext('Drill to detail by 1965'); + cy.getBySel('filter-val').should('contain', '1965'); + closeModal(); + + cy.wrap($canvas).scrollIntoView().rightclick(70, 100); + + openModalFromChartContext('Drill to detail by boy'); + cy.getBySel('filter-val').should('contain', 'boy'); + closeModal(); + + cy.wrap($canvas).scrollIntoView().rightclick(70, 100); + + openModalFromChartContext('Drill to detail by all'); + cy.getBySel('filter-val').first().should('contain', '1965'); + cy.getBySel('filter-val').eq(1).should('contain', 'boy'); + closeModal(); + + cy.wrap($canvas).scrollIntoView().rightclick(72, 200); + + openModalFromChartContext('Drill to detail by girl'); + cy.getBySel('filter-val').should('contain', 'girl'); + }, + ); + }); + }); + + describe('Time-Series Area Chart', () => { + it('opens the modal with the correct filters', () => { + testTimeChart('echarts_area'); + }); + }); + + describe('Time-Series Scatter Chart', () => { + it('opens the modal with the correct filters', () => { + testTimeChart('echarts_timeseries_scatter'); + }); + }); + + describe('Pie', () => { + it('opens the modal with the correct filters', () => { + interceptSamples(); + + // opens the modal by clicking on the slice of the Pie chart + cy.get("[data-test-viz-type='pie'] canvas").then($canvas => { + cy.wrap($canvas).scrollIntoView().rightclick(130, 150); + + openModalFromChartContext('Drill to detail by girl'); + cy.getBySel('filter-val').should('contain', 'girl'); + closeModal(); + + cy.wrap($canvas).scrollIntoView().rightclick(230, 190); + + openModalFromChartContext('Drill to detail by boy'); + cy.getBySel('filter-val').should('contain', 'boy'); + }); + }); + }); + + describe('World Map', () => { + it('opens the modal with the correct filters', () => { + interceptSamples(); + + cy.get("[data-test-viz-type='world_map'] svg").then($canvas => { + cy.wrap($canvas).scrollIntoView().rightclick(70, 150); + openModalFromChartContext('Drill to detail by USA'); + cy.getBySel('filter-val').should('contain', 'USA'); + closeModal(); + }); + cy.get("[data-test-viz-type='world_map'] svg").then($canvas => { + cy.wrap($canvas).scrollIntoView().rightclick(200, 140); + openModalFromChartContext('Drill to detail by SVK'); + cy.getBySel('filter-val').should('contain', 'SVK'); + }); + }); + }); + + describe('Bar Chart', () => { + it('opens the modal for unsupported chart without filters', () => { + interceptSamples(); + + cy.get("[data-test-viz-type='dist_bar'] svg").then($canvas => { + cy.wrap($canvas).scrollIntoView().rightclick(70, 150); + openModalFromChartContext('Drill to detail'); + cy.getBySel('filter-val').should('not.exist'); + }); + }); + }); + }); + + describe('Tier 2 charts', () => { + before(() => { + cy.visit(SUPPORTED_CHARTS_DASHBOARD); + setTopLevelTab('Tier 2'); + SUPPORTED_TIER2_CHARTS.forEach(waitForChartLoad); + }); + + describe('Modal actions', () => { + it('clears filters', () => { + interceptSamples(); + + // opens the modal by clicking on the box on the chart + cy.get("[data-test-viz-type='box_plot'] canvas").then($canvas => { + const canvasWidth = $canvas.width() || 0; + const canvasHeight = $canvas.height() || 0; + const canvasCenterX = canvasWidth / 3; + const canvasCenterY = (canvasHeight * 5) / 6; + + cy.wrap($canvas) + .scrollIntoView() + .rightclick(canvasCenterX, canvasCenterY, { force: true }); + + openModalFromChartContext('Drill to detail by boy'); + + // checking the filter + cy.getBySel('filter-val').should('contain', 'boy'); + cy.getBySel('row-count-label').should('contain', '39.2k rows'); + cy.get('.ant-pagination-item') + .should('have.length', 6) + .then($pages => { + expect($pages).to.contain('1'); + expect($pages).to.contain('785'); + }); + + // close the filter and test that data was reloaded + cy.getBySel('filter-col').find("[aria-label='close']").click(); + cy.wait('@samples'); + cy.getBySel('row-count-label').should('contain', '75.7k rows'); + cy.get('.ant-pagination-item-active').should('contain', '1'); + cy.get('.ant-pagination-item') + .should('have.length', 6) + .then($pages => { + expect($pages).to.contain('1'); + expect($pages).to.contain('1514'); + }); + }); + }); + }); + + describe('Box plot', () => { + it('opens the modal with the correct filters', () => { + interceptSamples(); + + cy.get("[data-test-viz-type='box_plot'] canvas").then($canvas => { + cy.wrap($canvas) + .scrollIntoView() + .trigger('mousemove', 135, 275) + .rightclick(135, 275); + + openModalFromChartContext('Drill to detail by boy'); + cy.getBySel('filter-val').should('contain', 'boy'); + closeModal(); + + cy.wrap($canvas) + .scrollIntoView() + .trigger('mousemove', 270, 280) + .rightclick(270, 280); + + openModalFromChartContext('Drill to detail by girl'); + cy.getBySel('filter-val').should('contain', 'girl'); + }); + }); + }); + + describe('Time-Series Generic Chart', () => { + it('opens the modal with the correct filters', () => { + testTimeChart('echarts_timeseries'); + }); + }); + + describe('Time-Series Smooth Chart', () => { + it('opens the modal with the correct filters', () => { + testTimeChart('echarts_timeseries_smooth'); + }); + }); + + describe('Time-Series Step Line Chart', () => { + it('opens the modal with the correct filters', () => { + testTimeChart('echarts_timeseries_step'); + }); + }); + + describe('Funnel Chart', () => { + it('opens the modal with the correct filters', () => { + interceptSamples(); + + cy.get("[data-test-viz-type='funnel'] canvas").then($canvas => { + cy.wrap($canvas).scrollIntoView().rightclick(170, 90); + + openModalFromChartContext('Drill to detail by boy'); + cy.getBySel('filter-val').should('contain', 'boy'); + closeModal(); + + cy.wrap($canvas).scrollIntoView().rightclick(190, 250); + + openModalFromChartContext('Drill to detail by girl'); + cy.getBySel('filter-val').should('contain', 'girl'); + }); + }); + }); + + describe('Gauge Chart', () => { + it('opens the modal with the correct filters', () => { + interceptSamples(); + + cy.get("[data-test-viz-type='gauge_chart'] canvas").then($canvas => { + cy.wrap($canvas).scrollIntoView().rightclick(135, 95); + + openModalFromChartContext('Drill to detail by boy'); + cy.getBySel('filter-val').should('contain', 'boy'); + closeModal(); + + cy.wrap($canvas).scrollIntoView().rightclick(95, 135); + + openModalFromChartContext('Drill to detail by girl'); + cy.getBySel('filter-val').should('contain', 'girl'); + }); + }); + }); + + describe('Mixed Chart', () => { + it('opens the modal with the correct filters', () => { + testTimeChart('mixed_timeseries'); + }); + }); + + describe('Radar Chart', () => { + it('opens the modal with the correct filters', () => { + interceptSamples(); + + cy.get("[data-test-viz-type='radar'] canvas").then($canvas => { + cy.wrap($canvas).scrollIntoView().rightclick(180, 45); + + openModalFromChartContext('Drill to detail by boy'); + cy.getBySel('filter-val').should('contain', 'boy'); + closeModal(); + + cy.wrap($canvas).scrollIntoView().rightclick(180, 85); + + openModalFromChartContext('Drill to detail by girl'); + cy.getBySel('filter-val').should('contain', 'girl'); + }); + }); + }); + + describe('Treemap', () => { + it('opens the modal with the correct filters', () => { + interceptSamples(); + + cy.get("[data-test-viz-type='treemap_v2'] canvas").then($canvas => { + cy.wrap($canvas).scrollIntoView().rightclick(100, 30); + + openModalFromChartContext('Drill to detail by boy'); + cy.getBySel('filter-val').should('contain', 'boy'); + closeModal(); + + cy.wrap($canvas).scrollIntoView().rightclick(150, 250); + + openModalFromChartContext('Drill to detail by girl'); + cy.getBySel('filter-val').should('contain', 'girl'); + }); + }); + }); + }); +}); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/edit_mode.test.js b/superset-frontend/cypress-base/cypress/integration/dashboard/edit_mode.test.js deleted file mode 100644 index 10b8a4a40de1..000000000000 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/edit_mode.test.js +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { WORLD_HEALTH_DASHBOARD, drag } from './dashboard.helper'; - -describe('Dashboard edit mode', () => { - beforeEach(() => { - cy.login(); - cy.visit(WORLD_HEALTH_DASHBOARD); - cy.get('.header-with-actions') - .find('[aria-label="Edit dashboard"]') - .click(); - }); - - it('remove, and add chart flow', () => { - // wait for box plot to appear - cy.get('[data-test="grid-container"]').find('.box_plot', { - timeout: 10000, - }); - const elementsCount = 10; - - cy.get('[data-test="dashboard-component-chart-holder"]') - .find('[data-test="dashboard-delete-component-button"]') - .last() - .then($el => { - cy.wrap($el).invoke('show').click(); - // box plot should be gone - cy.get('[data-test="grid-container"]') - .find('.box_plot') - .should('not.exist'); - }); - - // find box plot is available from list - cy.get('[data-test="dashboard-charts-filter-search-input"]').type( - 'Box plot', - ); - cy.get('[data-test="card-title"]').should('have.length', 1); - - drag('[data-test="card-title"]', 'Box plot').to( - '.grid-row.background--transparent:last', - ); - - // add back to dashboard - cy.get('[data-test="grid-container"]') - .find('.box_plot') - .should('be.visible'); - - // should show Save changes button - cy.get('[data-test="header-save-button"]').should('be.visible'); - - // undo first step and expect deleted item - cy.get('[data-test="undo-action"]').click(); - cy.get('[data-test="grid-container"]') - .find('[data-test="chart-container"]') - .should('have.length', elementsCount - 1); - - // Box plot chart should be gone - cy.get('[data-test="grid-container"]') - .find('.box_plot') - .should('not.exist'); - - // undo second step and expect initial items count - cy.get('[data-test="undo-action"]').click(); - cy.get('[data-test="grid-container"]') - .find('[data-test="chart-container"]') - .should('have.length', elementsCount); - cy.get('[data-test="card-title"]').contains('Box plot', { timeout: 5000 }); - - // save changes button should be disabled - cy.get('[data-test="header-save-button"]').should('be.disabled'); - - // no changes, can switch to view mode - cy.get('[data-test="dashboard-edit-actions"]') - .find('[data-test="discard-changes-button"]') - .should('be.visible') - .click(); - cy.get('.header-with-actions').within(() => { - cy.get('[data-test="dashboard-edit-actions"]').should('not.be.visible'); - cy.get('[aria-label="Edit dashboard"]').should('be.visible'); - }); - }); -}); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/edit_properties.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/edit_properties.test.ts deleted file mode 100644 index b3061cdb7d40..000000000000 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/edit_properties.test.ts +++ /dev/null @@ -1,204 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -// eslint-disable-next-line import/no-extraneous-dependencies -import * as ace from 'brace'; -import * as shortid from 'shortid'; -import { WORLD_HEALTH_DASHBOARD } from './dashboard.helper'; - -function selectColorScheme(color: string) { - // open color scheme dropdown - cy.get('.ant-modal-body') - .contains('Color scheme') - .parents('.ControlHeader') - .next('.ant-select') - .click() - .then($colorSelect => { - // select a new color scheme - cy.wrap($colorSelect).find(`[data-test="${color}"]`).click(); - }); -} - -function assertMetadata(text: string) { - const regex = new RegExp(text); - cy.get('.ant-modal-body') - .find('#json_metadata') - .should('be.visible') - .then(() => { - const metadata = cy.$$('#json_metadata')[0]; - - // cypress can read this locally, but not in ci - // so we have to use the ace module directly to fetch the value - expect(ace.edit(metadata).getValue()).to.match(regex); - }); -} - -function typeMetadata(text: string) { - cy.get('.ant-modal-body') - .find('#json_metadata') - .should('be.visible') - .type(text); -} - -function openAdvancedProperties() { - return cy - .get('.ant-modal-body') - .contains('Advanced') - .should('be.visible') - .click(); -} - -function openDashboardEditProperties() { - // open dashboard properties edit modal - cy.get( - '.header-with-actions .right-button-panel .ant-dropdown-trigger', - ).trigger('click', { - force: true, - }); - cy.get('[data-test=header-actions-menu]') - .contains('Edit properties') - .click({ force: true }); -} - -describe('Dashboard edit action', () => { - beforeEach(() => { - cy.login(); - cy.visit(WORLD_HEALTH_DASHBOARD); - cy.intercept(`/api/v1/dashboard/1`).as('dashboardGet'); - cy.get('.dashboard-grid', { timeout: 50000 }) - .should('be.visible') // wait for 50 secs to load dashboard - .then(() => { - cy.get('.header-with-actions [aria-label="Edit dashboard"]') - .should('be.visible') - .click(); - openDashboardEditProperties(); - }); - }); - - it('should update the title', () => { - const dashboardTitle = `Test dashboard [${shortid.generate()}]`; - - // update title - cy.get('.ant-modal-body') - .should('be.visible') - .contains('Title') - .get('[data-test="dashboard-title-input"]') - .type(`{selectall}{backspace}${dashboardTitle}`); - - // save edit changes - cy.get('.ant-modal-footer') - .contains('Apply') - .click() - .then(() => { - // assert that modal edit window has closed - cy.get('.ant-modal-body').should('not.exist'); - - // assert title has been updated - cy.get('[data-test="editable-title-input"]').should( - 'have.value', - dashboardTitle, - ); - }); - }); - describe('the color picker is changed', () => { - describe('the metadata has a color scheme', () => { - describe('the advanced tab is open', () => { - // TODO test passes locally but not on ci - xit('should overwrite the color scheme', () => { - openAdvancedProperties(); - cy.wait('@dashboardGet').then(() => { - selectColorScheme('d3Category20b'); - assertMetadata('d3Category20b'); - }); - }); - }); - describe('the advanced tab is not open', () => { - // TODO test passes locally but not on ci - xit('should overwrite the color scheme', () => { - selectColorScheme('bnbColors'); - openAdvancedProperties(); - cy.wait('@dashboardGet').then(() => { - assertMetadata('bnbColors'); - }); - }); - }); - }); - }); - describe('a valid colorScheme is entered', () => { - // TODO test passes locally but not on ci - xit('should save json metadata color change to dropdown', () => { - // edit json metadata - openAdvancedProperties().then(() => { - typeMetadata( - '{selectall}{backspace}{{}"color_scheme":"d3Category20"{}}', - ); - }); - - // save edit changes - cy.get('.modal-footer') - .contains('Save') - .click() - .then(() => { - // assert that modal edit window has closed - cy.get('.ant-modal-body').should('not.exist'); - - // assert color has been updated - openDashboardEditProperties(); - openAdvancedProperties().then(() => { - assertMetadata('d3Category20'); - }); - cy.get('.color-scheme-container').should( - 'have.attr', - 'data-test', - 'd3Category20', - ); - }); - }); - }); - describe('an invalid colorScheme is entered', () => { - // TODO test passes locally but not on ci - xit('should throw an error', () => { - // edit json metadata - openAdvancedProperties().then(() => { - typeMetadata( - '{selectall}{backspace}{{}"color_scheme":"THIS_DOES_NOT_WORK"{}}', - ); - }); - - // save edit changes - cy.get('.modal-footer') - .contains('Save') - .click() - .then(() => { - // assert that modal edit window has closed - cy.get('.ant-modal-body') - .contains('A valid color scheme is required') - .should('be.visible'); - }); - - cy.on('uncaught:exception', err => { - expect(err.message).to.include('something about the error'); - - // return false to prevent the error from - // failing this test - return false; - }); - }); - }); -}); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/editmode.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/editmode.test.ts new file mode 100644 index 000000000000..4251b6a7ae50 --- /dev/null +++ b/superset-frontend/cypress-base/cypress/integration/dashboard/editmode.test.ts @@ -0,0 +1,803 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { SAMPLE_DASHBOARD_1, TABBED_DASHBOARD } from 'cypress/utils/urls'; +import { drag, resize, waitForChartLoad } from 'cypress/utils'; +import * as ace from 'brace'; +import { interceptGet, interceptUpdate, openTab } from './utils'; +import { + interceptExploreJson, + interceptFiltering as interceptCharts, +} from '../explore/utils'; + +function editDashboard() { + cy.getBySel('edit-dashboard-button').click(); +} + +function closeModal() { + cy.getBySel('properties-modal-cancel-button').click({ force: true }); +} + +function openProperties() { + cy.get('body').then($body => { + if ($body.find('[data-test="properties-modal-cancel-button"]').length) { + closeModal(); + } + cy.getBySel('actions-trigger').click({ force: true }); + cy.getBySel('header-actions-menu') + .contains('Edit properties') + .click({ force: true }); + cy.wait(500); + }); +} + +function openAdvancedProperties() { + cy.get('.ant-modal-body') + .contains('Advanced') + .should('be.visible') + .click({ force: true }); +} + +function dragComponent( + component = 'Unicode Cloud', + target = 'card-title', + withFiltering = true, +) { + if (withFiltering) { + cy.getBySel('dashboard-charts-filter-search-input').type(component); + cy.wait('@filtering'); + } + cy.wait(500); + drag(`[data-test="${target}"]`, component).to( + '[data-test="grid-content"] [data-test="dragdroppable-object"]', + ); +} + +function discardChanges() { + cy.getBySel('undo-action').click({ force: true }); +} + +function visitEdit(sampleDashboard = SAMPLE_DASHBOARD_1) { + interceptCharts(); + interceptGet(); + + if (sampleDashboard === SAMPLE_DASHBOARD_1) { + cy.createSampleDashboards([0]); + } + + cy.visit(sampleDashboard); + cy.wait('@get'); + editDashboard(); + cy.wait('@filtering'); + cy.wait(500); +} + +function resetTabbedDashboard(go = false) { + cy.getDashboard('tabbed_dash').then((r: Record<string, any>) => { + const jsonMetadata = r?.json_metadata || '{}'; + const metadata = JSON.parse(jsonMetadata); + const resetMetadata = JSON.stringify({ + ...metadata, + color_scheme: '', + label_colors: {}, + shared_label_colors: {}, + }); + cy.updateDashboard(r.id, { + certification_details: r.certification_details, + certified_by: r.certified_by, + css: r.css, + dashboard_title: r.dashboard_title, + json_metadata: resetMetadata, + owners: r.owners, + slug: r.slug, + }).then(() => { + if (go) { + visitEdit(TABBED_DASHBOARD); + } + }); + }); +} + +function visitResetTabbedDashboard() { + resetTabbedDashboard(true); +} + +function selectColorScheme(color: string) { + cy.get( + '[data-test="dashboard-edit-properties-form"] [aria-label="Select color scheme"]', + ) + .first() + .click(); + cy.getBySel(color).click(); +} + +function applyChanges() { + cy.getBySel('properties-modal-apply-button').click(); +} + +function saveChanges() { + interceptUpdate(); + cy.getBySel('header-save-button').click({ force: true }); + cy.wait('@update'); +} + +function assertMetadata(text: string) { + const regex = new RegExp(text); + cy.get('#json_metadata') + .should('be.visible') + .then(() => { + const metadata = cy.$$('#json_metadata')[0]; + + // cypress can read this locally, but not in ci + // so we have to use the ace module directly to fetch the value + expect(ace.edit(metadata).getValue()).to.match(regex); + }); +} +function clearMetadata() { + cy.get('#json_metadata').then($jsonmetadata => { + cy.wrap($jsonmetadata).find('.ace_content').click(); + cy.wrap($jsonmetadata) + .find('.ace_text-input') + .type('{selectall} {backspace}'); + }); +} + +function writeMetadata(metadata: string) { + cy.get('#json_metadata').then($jsonmetadata => + cy + .wrap($jsonmetadata) + .find('.ace_text-input') + .type(metadata, { parseSpecialCharSequences: false }), + ); +} + +function openExplore(chartName: string) { + interceptExploreJson(); + + cy.get( + `[data-test-chart-name='${chartName}'] [aria-label='More Options']`, + ).click(); + cy.get('.ant-dropdown') + .not('.ant-dropdown-hidden') + .find("[role='menu'] [role='menuitem']") + .eq(2) + .should('contain', 'Edit chart') + .click(); + cy.wait('@getJson'); +} + +describe('Dashboard edit', () => { + describe('Color consistency', () => { + beforeEach(() => { + visitResetTabbedDashboard(); + }); + + after(() => { + resetTabbedDashboard(); + }); + + it('should respect chart color scheme when none is set for the dashboard', () => { + openProperties(); + cy.get('[aria-label="Select color scheme"]').should('have.value', ''); + applyChanges(); + saveChanges(); + + // open nested tab + openTab(1, 1); + waitForChartLoad({ + name: 'Top 10 California Names Timeseries', + viz: 'line', + }); + + // label Anthony + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(31, 168, 201)'); + }); + + it('should apply same color to same labels with color scheme set', () => { + openProperties(); + selectColorScheme('lyftColors'); + applyChanges(); + saveChanges(); + + // open nested tab + openTab(1, 1); + waitForChartLoad({ + name: 'Top 10 California Names Timeseries', + viz: 'line', + }); + + // label Anthony + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(234, 11, 140)'); + + // open 2nd main tab + openTab(0, 1); + waitForChartLoad({ name: 'Trends', viz: 'line' }); + + // label Anthony + cy.get('[data-test-chart-name="Trends"] .line .nv-legend-symbol') + .eq(2) + .should('have.css', 'fill', 'rgb(234, 11, 140)'); + }); + + it('should apply same color to same labels with no color scheme set', () => { + openProperties(); + cy.get('[aria-label="Select color scheme"]').should('have.value', ''); + applyChanges(); + saveChanges(); + + // open nested tab + openTab(1, 1); + waitForChartLoad({ + name: 'Top 10 California Names Timeseries', + viz: 'line', + }); + + // label Anthony + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(31, 168, 201)'); + + // open 2nd main tab + openTab(0, 1); + waitForChartLoad({ name: 'Trends', viz: 'line' }); + + // label Anthony + cy.get('[data-test-chart-name="Trends"] .line .nv-legend-symbol') + .eq(2) + .should('have.css', 'fill', 'rgb(31, 168, 201)'); + }); + + it('custom label colors should take the precedence in nested tabs', () => { + openProperties(); + openAdvancedProperties(); + clearMetadata(); + writeMetadata( + '{"color_scheme":"lyftColors","label_colors":{"Anthony":"red","Bangladesh":"red"}}', + ); + applyChanges(); + saveChanges(); + + // open nested tab + openTab(1, 1); + waitForChartLoad({ + name: 'Top 10 California Names Timeseries', + viz: 'line', + }); + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(255, 0, 0)'); + + // open another nested tab + openTab(2, 1); + waitForChartLoad({ name: 'Growth Rate', viz: 'line' }); + cy.get('[data-test-chart-name="Growth Rate"] .line .nv-legend-symbol') + .first() + .should('have.css', 'fill', 'rgb(255, 0, 0)'); + }); + + it('label colors should take the precedence for rendered charts in nested tabs', () => { + // open the tab first time and let chart load + openTab(1, 1); + waitForChartLoad({ + name: 'Top 10 California Names Timeseries', + viz: 'line', + }); + + // go to previous tab + openTab(1, 0); + openProperties(); + openAdvancedProperties(); + clearMetadata(); + writeMetadata( + '{"color_scheme":"lyftColors","label_colors":{"Anthony":"red"}}', + ); + applyChanges(); + saveChanges(); + + // re-open the tab + openTab(1, 1); + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(255, 0, 0)'); + }); + + it('should re-apply original color after removing custom label color with color scheme set', () => { + openProperties(); + openAdvancedProperties(); + clearMetadata(); + writeMetadata( + '{"color_scheme":"lyftColors","label_colors":{"Anthony":"red"}}', + ); + applyChanges(); + saveChanges(); + + openTab(1, 1); + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(255, 0, 0)'); + + editDashboard(); + openProperties(); + openAdvancedProperties(); + clearMetadata(); + writeMetadata('{"color_scheme":"lyftColors","label_colors":{}}'); + applyChanges(); + saveChanges(); + + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(234, 11, 140)'); + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .eq(1) + .should('have.css', 'fill', 'rgb(108, 131, 142)'); + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .eq(2) + .should('have.css', 'fill', 'rgb(41, 171, 226)'); + }); + + it('should re-apply original color after removing custom label color with no color scheme set', () => { + // open nested tab + openTab(1, 1); + waitForChartLoad({ + name: 'Top 10 California Names Timeseries', + viz: 'line', + }); + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(31, 168, 201)'); + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .eq(1) + .should('have.css', 'fill', 'rgb(69, 78, 124)'); + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .eq(2) + .should('have.css', 'fill', 'rgb(90, 193, 137)'); + + openProperties(); + cy.get('[aria-label="Select color scheme"]').should('have.value', ''); + openAdvancedProperties(); + clearMetadata(); + writeMetadata('{"color_scheme":"","label_colors":{"Anthony":"red"}}'); + applyChanges(); + saveChanges(); + + openTab(1, 1); + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(255, 0, 0)'); + + editDashboard(); + openProperties(); + openAdvancedProperties(); + clearMetadata(); + writeMetadata('{"color_scheme":"","label_colors":{}}'); + applyChanges(); + saveChanges(); + + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(31, 168, 201)'); + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .eq(1) + .should('have.css', 'fill', 'rgb(69, 78, 124)'); + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .eq(2) + .should('have.css', 'fill', 'rgb(90, 193, 137)'); + }); + + it('should show the same colors in Explore', () => { + openProperties(); + openAdvancedProperties(); + clearMetadata(); + writeMetadata( + '{"color_scheme":"lyftColors","label_colors":{"Anthony":"red"}}', + ); + applyChanges(); + saveChanges(); + + // open nested tab + openTab(1, 1); + waitForChartLoad({ + name: 'Top 10 California Names Timeseries', + viz: 'line', + }); + + // label Anthony + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(255, 0, 0)'); + // label Christopher + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .eq(1) + .should('have.css', 'fill', 'rgb(108, 131, 142)'); + + openExplore('Top 10 California Names Timeseries'); + + // label Anthony + cy.get('[data-test="chart-container"] .line .nv-legend-symbol') + .first() + .should('have.css', 'fill', 'rgb(255, 0, 0)'); + // label Christopher + cy.get('[data-test="chart-container"] .line .nv-legend-symbol') + .eq(1) + .should('have.css', 'fill', 'rgb(108, 131, 142)'); + }); + + it('should change color scheme multiple times', () => { + openProperties(); + selectColorScheme('lyftColors'); + applyChanges(); + saveChanges(); + + // open nested tab + openTab(1, 1); + waitForChartLoad({ + name: 'Top 10 California Names Timeseries', + viz: 'line', + }); + + // label Anthony + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(234, 11, 140)'); + + // open 2nd main tab + openTab(0, 1); + waitForChartLoad({ name: 'Trends', viz: 'line' }); + + // label Anthony + cy.get('[data-test-chart-name="Trends"] .line .nv-legend-symbol') + .eq(2) + .should('have.css', 'fill', 'rgb(234, 11, 140)'); + + editDashboard(); + openProperties(); + selectColorScheme('bnbColors'); + applyChanges(); + saveChanges(); + + // label Anthony + cy.get('[data-test-chart-name="Trends"] .line .nv-legend-symbol') + .eq(2) + .should('have.css', 'fill', 'rgb(0, 122, 135)'); + + // open main tab and nested tab + openTab(0, 0); + openTab(1, 1); + + // label Anthony + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(0, 122, 135)'); + }); + + it('should apply the color scheme across main tabs', () => { + openProperties(); + selectColorScheme('lyftColors'); + applyChanges(); + saveChanges(); + + cy.get('.treemap #rect-sum__SP_POP_TOTL').should( + 'have.css', + 'fill', + 'rgb(234, 11, 140)', + ); + + // go to second tab + openTab(0, 1); + waitForChartLoad({ name: 'Trends', viz: 'line' }); + + cy.get('[data-test-chart-name="Trends"] .line .nv-legend-symbol') + .first() + .should('have.css', 'fill', 'rgb(234, 11, 140)'); + }); + + it('should apply the color scheme across main tabs for rendered charts', () => { + waitForChartLoad({ name: 'Treemap', viz: 'treemap' }); + openProperties(); + selectColorScheme('bnbColors'); + applyChanges(); + saveChanges(); + + cy.get('.treemap #rect-sum__SP_POP_TOTL').should( + 'have.css', + 'fill', + 'rgb(255, 90, 95)', + ); + + // go to second tab + openTab(0, 1); + waitForChartLoad({ name: 'Trends', viz: 'line' }); + + cy.get('[data-test-chart-name="Trends"] .line .nv-legend-symbol') + .first() + .should('have.css', 'fill', 'rgb(255, 90, 95)'); + + // go back to first tab + openTab(0, 0); + + // change scheme now that charts are rendered across the main tabs + editDashboard(); + openProperties(); + selectColorScheme('lyftColors'); + applyChanges(); + saveChanges(); + + cy.get('.treemap #rect-sum__SP_POP_TOTL').should( + 'have.css', + 'fill', + 'rgb(234, 11, 140)', + ); + + // go to second tab again + openTab(0, 1); + + cy.get('[data-test-chart-name="Trends"] .line .nv-legend-symbol') + .first() + .should('have.css', 'fill', 'rgb(234, 11, 140)'); + }); + + it('should apply the color scheme in nested tabs', () => { + openProperties(); + selectColorScheme('lyftColors'); + applyChanges(); + saveChanges(); + cy.get('.treemap #rect-sum__SP_POP_TOTL').should( + 'have.css', + 'fill', + 'rgb(234, 11, 140)', + ); + + // open nested tab + openTab(1, 1); + waitForChartLoad({ + name: 'Top 10 California Names Timeseries', + viz: 'line', + }); + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(234, 11, 140)'); + + // open another nested tab + openTab(2, 1); + waitForChartLoad({ name: 'Growth Rate', viz: 'line' }); + cy.get('[data-test-chart-name="Growth Rate"] .line .nv-legend-symbol') + .first() + .should('have.css', 'fill', 'rgb(234, 11, 140)'); + }); + + it('should apply a valid color scheme for rendered charts in nested tabs', () => { + // open the tab first time and let chart load + openTab(1, 1); + waitForChartLoad({ + name: 'Top 10 California Names Timeseries', + viz: 'line', + }); + + // go to previous tab + openTab(1, 0); + openProperties(); + selectColorScheme('lyftColors'); + applyChanges(); + saveChanges(); + + // re-open the tab + openTab(1, 1); + + cy.get( + '[data-test-chart-name="Top 10 California Names Timeseries"] .line .nv-legend-symbol', + ) + .first() + .should('have.css', 'fill', 'rgb(234, 11, 140)'); + }); + }); + + describe('Edit properties', () => { + before(() => { + visitEdit(); + }); + + beforeEach(() => { + cy.createSampleDashboards([0]); + openProperties(); + }); + + it('should accept a valid color scheme', () => { + openAdvancedProperties(); + clearMetadata(); + writeMetadata('{"color_scheme":"lyftColors"}'); + applyChanges(); + openProperties(); + openAdvancedProperties(); + assertMetadata('lyftColors'); + applyChanges(); + }); + + it('should overwrite the color scheme when advanced is closed', () => { + selectColorScheme('d3Category20b'); + openAdvancedProperties(); + assertMetadata('d3Category20b'); + applyChanges(); + }); + + it('should overwrite the color scheme when advanced is open', () => { + openAdvancedProperties(); + selectColorScheme('googleCategory10c'); + assertMetadata('googleCategory10c'); + applyChanges(); + }); + + it('should not accept an invalid color scheme', () => { + openAdvancedProperties(); + clearMetadata(); + writeMetadata('{"color_scheme":"wrongcolorscheme"}'); + applyChanges(); + cy.get('.ant-modal-body') + .contains('A valid color scheme is required') + .should('be.visible'); + }); + + it('should edit the title', () => { + cy.getBySel('dashboard-title-input').clear().type('Edited title'); + applyChanges(); + cy.getBySel('editable-title-input').should('have.value', 'Edited title'); + }); + }); + + describe('Edit mode', () => { + before(() => { + visitEdit(); + }); + + beforeEach(() => { + cy.createSampleDashboards([0]); + discardChanges(); + }); + + it('should enable edit mode', () => { + cy.getBySel('dashboard-builder-sidepane').should('be.visible'); + }); + + it('should edit the title inline', () => { + cy.getBySel('editable-title-input').clear().type('Edited title{enter}'); + cy.getBySel('header-save-button').should('be.enabled'); + }); + + it('should filter charts', () => { + interceptCharts(); + cy.getBySel('dashboard-charts-filter-search-input').type('Unicode'); + cy.wait('@filtering'); + cy.getBySel('chart-card') + .should('have.length', 1) + .contains('Unicode Cloud'); + cy.getBySel('dashboard-charts-filter-search-input').clear(); + }); + + it('should disable the Save button when undoing', () => { + dragComponent('Unicode Cloud', 'card-title', false); + cy.getBySel('header-save-button').should('be.enabled'); + discardChanges(); + cy.getBySel('header-save-button').should('be.disabled'); + }); + }); + + describe('Components', () => { + beforeEach(() => { + visitEdit(); + }); + + it('should add charts', () => { + dragComponent(); + cy.getBySel('dashboard-component-chart-holder').should('have.length', 1); + }); + + it('should remove added charts', () => { + dragComponent('Pivot Table'); + cy.getBySel('dashboard-component-chart-holder').should('have.length', 1); + cy.getBySel('dashboard-delete-component-button').click(); + cy.getBySel('dashboard-component-chart-holder').should('have.length', 0); + }); + + it('should add markdown component to dashboard', () => { + cy.getBySel('dashboard-builder-component-pane-tabs-navigation') + .find('#tabs-tab-2') + .click(); + + // add new markdown component + dragComponent('Text', 'new-component', false); + + cy.getBySel('dashboard-markdown-editor') + .should( + 'have.text', + '✨Header 1\n✨Header 2\n✨Header 3\n\nClick here to learn more about markdown formatting', + ) + .click(10, 10); + + cy.getBySel('dashboard-component-chart-holder').contains( + 'Click here to learn more about [markdown formatting](https://bit.ly/1dQOfRK)', + ); + + cy.getBySel('dashboard-markdown-editor').click().type('Test resize'); + + resize( + '[data-test="dashboard-markdown-editor"] .resizable-container span div:last-child', + ).to(500, 600); + + cy.getBySel('dashboard-markdown-editor').contains('Test resize'); + }); + }); + + describe('Save', () => { + beforeEach(() => { + visitEdit(); + }); + + it('should save', () => { + dragComponent(); + cy.getBySel('header-save-button').should('be.enabled'); + saveChanges(); + cy.getBySel('dashboard-component-chart-holder').should('have.length', 1); + cy.getBySel('edit-dashboard-button').should('be.visible'); + }); + }); +}); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/fav_star.test.js b/superset-frontend/cypress-base/cypress/integration/dashboard/fav_star.test.js deleted file mode 100644 index a20b1eb3f597..000000000000 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/fav_star.test.js +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { - WORLD_HEALTH_DASHBOARD, - CHECK_DASHBOARD_FAVORITE_ENDPOINT, -} from './dashboard.helper'; - -describe('Dashboard add to favorite', () => { - let isFavoriteDashboard = false; - - beforeEach(() => { - cy.login(); - - cy.intercept(CHECK_DASHBOARD_FAVORITE_ENDPOINT).as('countFavStar'); - cy.visit(WORLD_HEALTH_DASHBOARD); - - cy.wait('@countFavStar').then(xhr => { - isFavoriteDashboard = xhr.response.body.count === 1; - }); - }); - - it('should allow favor/unfavor', () => { - if (!isFavoriteDashboard) { - cy.get('[data-test="fave-unfave-icon"]') - .find('span') - .should('have.attr', 'aria-label', 'favorite-unselected'); - cy.get('[data-test="fave-unfave-icon"]').trigger('click'); - cy.get('[data-test="fave-unfave-icon"]') - .find('span') - .should('have.attr', 'aria-label', 'favorite-selected') - .and('not.have.attr', 'aria-label', 'favorite-unselected'); - } else { - cy.get('[data-test="fave-unfave-icon"]') - .find('span') - .should('have.attr', 'aria-label', 'favorite-unselected') - .and('not.have.attr', 'aria-label', 'favorite-selected'); - cy.get('[data-test="fave-unfave-icon"]').trigger('click'); - cy.get('[data-test="fave-unfave-icon"]') - .find('span') - .should('have.attr', 'aria-label', 'favorite-unselected') - .and('not.have.attr', 'aria-label', 'favorite-selected'); - } - - // reset to original fav state - cy.get('[data-test="fave-unfave-icon"]').trigger('click'); - }); -}); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/load.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/load.test.ts index 9fb84f70c93d..bf60c2bec1a7 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/load.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/dashboard/load.test.ts @@ -16,17 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -import { - waitForChartLoad, - WORLD_HEALTH_CHARTS, - WORLD_HEALTH_DASHBOARD, -} from './dashboard.helper'; +import { WORLD_HEALTH_DASHBOARD } from 'cypress/utils/urls'; +import { waitForChartLoad } from 'cypress/utils'; +import { WORLD_HEALTH_CHARTS, interceptLog } from './utils'; describe('Dashboard load', () => { - beforeEach(() => { - cy.login(); - }); - it('should load dashboard', () => { cy.visit(WORLD_HEALTH_DASHBOARD); WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); @@ -34,7 +28,7 @@ describe('Dashboard load', () => { it('should load in edit mode', () => { cy.visit(`${WORLD_HEALTH_DASHBOARD}?edit=true&standalone=true`); - cy.get('[data-test="discard-changes-button"]').should('be.visible'); + cy.getBySel('discard-changes-button').should('be.visible'); }); it('should load in standalone mode', () => { @@ -44,12 +38,13 @@ describe('Dashboard load', () => { it('should load in edit/standalone mode', () => { cy.visit(`${WORLD_HEALTH_DASHBOARD}?edit=true&standalone=true`); - cy.get('[data-test="discard-changes-button"]').should('be.visible'); + cy.getBySel('discard-changes-button').should('be.visible'); cy.get('#app-menu').should('not.exist'); }); it('should send log data', () => { + interceptLog(); cy.visit(WORLD_HEALTH_DASHBOARD); - cy.intercept('/superset/log/?explode=events&dashboard_id=*'); + cy.wait('@logs', { timeout: 15000 }); }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/markdown.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/markdown.test.ts deleted file mode 100644 index 3a4b69c471f3..000000000000 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/markdown.test.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { TABBED_DASHBOARD, drag, resize } from './dashboard.helper'; - -describe('Dashboard edit markdown', () => { - beforeEach(() => { - cy.login(); - cy.visit(TABBED_DASHBOARD); - }); - - it('should add markdown component to dashboard', () => { - cy.get('.header-with-actions') - .find('[aria-label="Edit dashboard"]') - .click(); - - cy.get('[data-test="dashboard-builder-component-pane-tabs-navigation"]') - .find('.ant-tabs-tab') - .last() - .click(); - - // lazy load - need to open dropdown for the scripts to load - cy.get('.header-with-actions').find('[aria-label="more-horiz"]').click(); - cy.get('[data-test="grid-row-background--transparent"]') - .first() - .as('component-background-first'); - // add new markdown component - drag('[data-test="new-component"]', 'Markdown').to( - '@component-background-first', - ); - cy.get('[data-test="dashboard-markdown-editor"]') - .should( - 'have.text', - '✨Markdown\n✨Markdown\n✨Markdown\n\nClick here to edit markdown', - ) - .click(); - - cy.get('[data-test="dashboard-component-chart-holder"]') - .find('.ace_content') - .contains('Click here to edit [markdown](https://bit.ly/1dQOfRK)'); - - cy.get('[data-test="dashboard-markdown-editor"]') - .click() - .type('Test resize'); - - resize( - '[data-test="dashboard-markdown-editor"] .resizable-container span div:last-child', - ).to(500, 600); - - cy.get('[data-test="dashboard-markdown-editor"]').contains('Test resize'); - - cy.get('[data-test="nav-list"]:first').click('right', { force: true }); - cy.get('[data-test="dashboard-component-chart-holder"]') - .find('.ace_content') - .should('not.exist'); - }); -}); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/nativeFilters.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/nativeFilters.test.ts index b409aa06d0a2..e934a47bfb68 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/nativeFilters.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/dashboard/nativeFilters.test.ts @@ -23,25 +23,16 @@ import { exploreView, dataTestChartName, } from 'cypress/support/directories'; +import { SAMPLE_DASHBOARD_1 } from 'cypress/utils/urls'; + import { - cleanUp, - copyTestDashboard, - testItems, - waitForChartLoad, - WORLD_HEALTH_DASHBOARD, - WORLD_HEALTH_CHARTS, -} from './dashboard.helper'; -import { - addCountryCodeFilter, addCountryNameFilter, addParentFilterWithValue, - addRegionFilter, applyAdvancedTimeRangeFilterOnDashboard, applyNativeFilterValueWithIndex, cancelNativeFilterSettings, checkNativeFilterTooltip, clickOnAddFilterInModal, - closeDashboardToastMessage, collapseFilterOnLeftPanel, deleteNativeFilter, enterNativeFilterEditModal, @@ -55,734 +46,819 @@ import { validateFilterContentOnDashboard, valueNativeFilterOptions, validateFilterNameOnDashboard, -} from './nativeFilter.helper'; -import { DASHBOARD_LIST } from '../dashboard_list/dashboard_list.helper'; -import { CHART_LIST } from '../chart_list/chart_list.helper'; - -// TODO: fix flaky init logic and re-enable -const milliseconds = new Date().getTime(); -const dashboard = `Test Dashboard${milliseconds}`; - -describe('Nativefilters tests initial state required', () => { - beforeEach(() => { - cy.login(); - cleanUp(); - copyTestDashboard("World Bank's Data"); - WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); - closeDashboardToastMessage(); - }); - afterEach(() => { - cleanUp(); - }); - - it('Verify that default value is respected after revisit', () => { - expandFilterOnLeftPanel(); - enterNativeFilterEditModal(); - addCountryNameFilter(); - inputNativeFilterDefaultValue(testItems.filterDefaultValue); - saveNativeFilterSettings(); - WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); - cy.get(nativeFilters.filterItem) - .contains(testItems.filterDefaultValue) - .should('be.visible'); - cy.get(dataTestChartName(testItems.topTenChart.name)).within(() => { - cy.contains(testItems.filterDefaultValue).should('be.visible'); - cy.contains(testItems.filterOtherCountry).should('not.exist'); - }); - cy.request( - 'api/v1/dashboard/?q=(order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:100)', - ).then(xhr => { - const dashboards = xhr.body.result; - const testDashboard = dashboards.find( - (d: { dashboard_title: string }) => - d.dashboard_title === testItems.dashboard, - ); - cy.visit(testDashboard.url); - }); - WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); - cy.get(dataTestChartName(testItems.topTenChart.name)).within(() => { - cy.contains(testItems.filterDefaultValue).should('be.visible'); - cy.contains(testItems.filterOtherCountry).should('not.exist'); + testItems, + WORLD_HEALTH_CHARTS, + interceptGet, + interceptCharts, + interceptDatasets, + interceptFilterState, +} from './utils'; + +const SAMPLE_CHART = { name: 'Most Populated Countries', viz: 'table' }; + +function visitDashboard(createSample = true) { + interceptCharts(); + interceptGet(); + interceptDatasets(); + + if (createSample) { + cy.createSampleDashboards([0]); + } + + cy.visit(SAMPLE_DASHBOARD_1); + cy.wait('@get'); + cy.wait('@getCharts'); + cy.wait('@getDatasets'); + cy.url().should('contain', 'native_filters_key'); +} + +function prepareDashboardFilters( + filters: { name: string; column: string; datasetId: number }[], +) { + cy.createSampleDashboards([0]); + cy.request({ + method: 'GET', + url: `api/v1/dashboard/1-sample-dashboard`, + }).then(res => { + const { body } = res; + const dashboardId = body.result.id; + const allFilters: Record<string, unknown>[] = []; + filters.forEach((f, i) => { + allFilters.push({ + id: `NATIVE_FILTER-fLH0pxFQ${i}`, + controlValues: { + enableEmptyFilter: false, + defaultToFirstItem: false, + multiSelect: true, + searchAllOptions: false, + inverseSelection: false, + }, + name: f.name, + filterType: 'filter_select', + targets: [ + { + datasetId: f.datasetId, + column: { name: f.column }, + }, + ], + defaultDataMask: { + extraFormData: {}, + filterState: {}, + ownState: {}, + }, + cascadeParentIds: [], + scope: { + rootPath: ['ROOT_ID'], + excluded: [], + }, + type: 'NATIVE_FILTER', + description: '', + chartsInScope: [6], + tabsInScope: [], + }); }); - validateFilterContentOnDashboard(testItems.filterDefaultValue); + if (dashboardId) { + const jsonMetadata = { + show_native_filters: true, + native_filter_configuration: allFilters, + timed_refresh_immune_slices: [], + expanded_slices: {}, + refresh_frequency: 0, + color_scheme: '', + label_colors: {}, + shared_label_colors: {}, + color_scheme_domain: [], + cross_filters_enabled: false, + positions: { + DASHBOARD_VERSION_KEY: 'v2', + ROOT_ID: { type: 'ROOT', id: 'ROOT_ID', children: ['GRID_ID'] }, + GRID_ID: { + type: 'GRID', + id: 'GRID_ID', + children: ['ROW-0rHnUz4nMA'], + parents: ['ROOT_ID'], + }, + HEADER_ID: { + id: 'HEADER_ID', + type: 'HEADER', + meta: { text: '1 - Sample dashboard' }, + }, + 'CHART-DF6EfI55F-': { + type: 'CHART', + id: 'CHART-DF6EfI55F-', + children: [], + parents: ['ROOT_ID', 'GRID_ID', 'ROW-0rHnUz4nMA'], + meta: { + width: 4, + height: 50, + chartId: 6, + sliceName: 'Most Populated Countries', + }, + }, + 'ROW-0rHnUz4nMA': { + type: 'ROW', + id: 'ROW-0rHnUz4nMA', + children: ['CHART-DF6EfI55F-'], + parents: ['ROOT_ID', 'GRID_ID'], + meta: { background: 'BACKGROUND_TRANSPARENT' }, + }, + }, + default_filters: '{}', + filter_scopes: {}, + chart_configuration: {}, + }; + + return cy + .request({ + method: 'PUT', + url: `api/v1/dashboard/${dashboardId}`, + body: { + json_metadata: JSON.stringify(jsonMetadata), + }, + }) + .then(() => visitDashboard(false)); + } + return cy; + }); +} + +function selectFilter(index: number) { + cy.get("[data-test='filter-title-container'] [draggable='true']") + .eq(index) + .click(); +} + +function closeFilterModal() { + cy.get('body').then($body => { + if ($body.find('[data-test="native-filter-modal-cancel-button"]').length) { + cy.getBySel('native-filter-modal-cancel-button').click(); + } + }); +} + +function openVerticalFilterBar() { + cy.getBySel('dashboard-filters-panel').should('exist'); + cy.getBySel('filter-bar__expand-button').click(); +} + +function setFilterBarOrientation(orientation: 'vertical' | 'horizontal') { + cy.getBySel('filterbar-orientation-icon').click(); + cy.wait(250); + cy.getBySel('dropdown-selectable-icon-submenu') + .contains('Orientation of filter bar') + .should('exist') + .trigger('mouseover'); + + if (orientation === 'vertical') { + cy.get('.ant-dropdown-menu-item-selected') + .contains('Horizontal (Top)') + .should('exist'); + cy.get('.ant-dropdown-menu-item').contains('Vertical (Left)').click(); + cy.getBySel('dashboard-filters-panel').should('exist'); + } else { + cy.get('.ant-dropdown-menu-item-selected') + .contains('Vertical (Left)') + .should('exist'); + cy.get('.ant-dropdown-menu-item').contains('Horizontal (Top)').click(); + cy.getBySel('loading-indicator').should('exist'); + cy.getBySel('filter-bar').should('exist'); + cy.getBySel('dashboard-filters-panel').should('not.exist'); + } +} + +function openMoreFilters(intercetFilterState = true) { + interceptFilterState(); + cy.getBySel('dropdown-container-btn').click(); + + if (intercetFilterState) { + cy.wait('@postFilterState'); + } +} + +describe('Horizontal FilterBar', () => { + it('should go from vertical to horizontal and the opposite', () => { + visitDashboard(); + openVerticalFilterBar(); + setFilterBarOrientation('horizontal'); + setFilterBarOrientation('vertical'); + }); + + it('should show all default actions in horizontal mode', () => { + visitDashboard(); + openVerticalFilterBar(); + setFilterBarOrientation('horizontal'); + cy.getBySel('horizontal-filterbar-empty') + .contains('No filters are currently added to this dashboard.') + .should('exist'); + cy.getBySel('filter-bar__create-filter').should('exist'); + cy.getBySel('filterbar-action-buttons').should('exist'); + }); + + it('should stay in horizontal mode when reloading', () => { + visitDashboard(); + openVerticalFilterBar(); + setFilterBarOrientation('horizontal'); + cy.reload(); + cy.getBySel('dashboard-filters-panel').should('not.exist'); + }); + + it('should show all filters in available space on load', () => { + prepareDashboardFilters([ + { name: 'test_1', column: 'country_name', datasetId: 2 }, + { name: 'test_2', column: 'country_code', datasetId: 2 }, + { name: 'test_3', column: 'region', datasetId: 2 }, + ]); + setFilterBarOrientation('horizontal'); + cy.get('.filter-item-wrapper').should('have.length', 3); + }); + + it('should show "more filters" on window resizing up and down', () => { + prepareDashboardFilters([ + { name: 'test_1', column: 'country_name', datasetId: 2 }, + { name: 'test_2', column: 'country_code', datasetId: 2 }, + { name: 'test_3', column: 'region', datasetId: 2 }, + ]); + setFilterBarOrientation('horizontal'); + + cy.getBySel('form-item-value').should('have.length', 3); + cy.viewport(768, 1024); + cy.getBySel('form-item-value').should('have.length', 0); + openMoreFilters(false); + cy.getBySel('form-item-value').should('have.length', 3); + + cy.getBySel('filter-bar').click(); + cy.viewport(1000, 1024); + openMoreFilters(false); + cy.getBySel('form-item-value').should('have.length', 3); + + cy.getBySel('filter-bar').click(); + cy.viewport(1300, 1024); + cy.getBySel('form-item-value').should('have.length', 3); + cy.getBySel('dropdown-container-btn').should('not.exist'); + }); + + it('should show "more filters" and scroll', () => { + prepareDashboardFilters([ + { name: 'test_1', column: 'country_name', datasetId: 2 }, + { name: 'test_2', column: 'country_code', datasetId: 2 }, + { name: 'test_3', column: 'region', datasetId: 2 }, + { name: 'test_4', column: 'year', datasetId: 2 }, + { name: 'test_5', column: 'country_name', datasetId: 2 }, + { name: 'test_6', column: 'country_code', datasetId: 2 }, + { name: 'test_7', column: 'region', datasetId: 2 }, + { name: 'test_8', column: 'year', datasetId: 2 }, + { name: 'test_9', column: 'country_name', datasetId: 2 }, + { name: 'test_10', column: 'country_code', datasetId: 2 }, + { name: 'test_11', column: 'region', datasetId: 2 }, + { name: 'test_12', column: 'year', datasetId: 2 }, + ]); + setFilterBarOrientation('horizontal'); + cy.get('.filter-item-wrapper').should('have.length', 3); + openMoreFilters(); + cy.getBySel('form-item-value').should('have.length', 12); + cy.getBySel('filter-control-name').contains('test_10').should('be.visible'); + cy.getBySel('filter-control-name') + .contains('test_12') + .should('not.be.visible'); + cy.get('.ant-popover-inner-content').scrollTo('bottom'); + cy.getBySel('filter-control-name').contains('test_12').should('be.visible'); + }); + + it('should display newly added filter', () => { + visitDashboard(); + openVerticalFilterBar(); + setFilterBarOrientation('horizontal'); + + enterNativeFilterEditModal(false); + addCountryNameFilter(); + saveNativeFilterSettings([]); + validateFilterNameOnDashboard(testItems.topTenChart.filterColumn); }); - it('User can create parent filters using "Values are dependent on other filters"', () => { - enterNativeFilterEditModal(); - // Create parent filter 'region'. - addRegionFilter(); - // Create filter 'country_name' depend on region filter. - clickOnAddFilterInModal(); - addCountryNameFilter(); - cy.get(nativeFilters.filterConfigurationSections.displayedSection).within( - () => { - cy.contains('Values are dependent on other filters') - .should('be.visible') - .click(); - }, + it('should spot changes in "more filters" and apply their values', () => { + cy.intercept(`/api/v1/chart/data?form_data=**`).as('chart'); + prepareDashboardFilters([ + { name: 'test_1', column: 'country_name', datasetId: 2 }, + { name: 'test_2', column: 'country_code', datasetId: 2 }, + { name: 'test_3', column: 'region', datasetId: 2 }, + { name: 'test_4', column: 'year', datasetId: 2 }, + { name: 'test_5', column: 'country_name', datasetId: 2 }, + { name: 'test_6', column: 'country_code', datasetId: 2 }, + { name: 'test_7', column: 'region', datasetId: 2 }, + { name: 'test_8', column: 'year', datasetId: 2 }, + { name: 'test_9', column: 'country_name', datasetId: 2 }, + { name: 'test_10', column: 'country_code', datasetId: 2 }, + { name: 'test_11', column: 'region', datasetId: 2 }, + { name: 'test_12', column: 'year', datasetId: 2 }, + ]); + setFilterBarOrientation('horizontal'); + openMoreFilters(); + applyNativeFilterValueWithIndex(8, testItems.filterDefaultValue); + cy.get(nativeFilters.applyFilter).click({ force: true }); + cy.wait('@chart'); + cy.get('.ant-scroll-number.ant-badge-count').should( + 'have.attr', + 'title', + '1', ); - addParentFilterWithValue(0, testItems.topTenChart.filterColumnRegion); - cy.wait(1000); - saveNativeFilterSettings(); - // Validate both filter in dashboard view. - WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); - [ - testItems.topTenChart.filterColumnRegion, - testItems.topTenChart.filterColumn, - ].forEach(it => { - cy.get(nativeFilters.filterFromDashboardView.filterName) - .contains(it) - .should('be.visible'); - }); - getNativeFilterPlaceholderWithIndex(1) - .invoke('text') - .should('equal', '214 options', { timeout: 20000 }); - // apply first filter value and validate 2nd filter is depden on 1st filter. - applyNativeFilterValueWithIndex(0, 'North America'); - getNativeFilterPlaceholderWithIndex(0).should('have.text', '3 options', { - timeout: 20000, - }); }); - it('user can delete dependent filter', () => { - enterNativeFilterEditModal(); - addRegionFilter(); - clickOnAddFilterInModal(); - addCountryNameFilter(); - cy.get(nativeFilters.filterConfigurationSections.displayedSection).within( - () => { - cy.contains('Values are dependent on other filters') - .should('be.visible') - .click(); - }, - ); - addParentFilterWithValue(0, testItems.topTenChart.filterColumnRegion); - // remove year native filter to cause it disappears from parent filter input in global sales - cy.get(nativeFilters.modal.tabsList.removeTab) - .should('be.visible') - .first() - .click(); - // make sure you are seeing global sales filter which had parent filter - cy.get(nativeFilters.modal.tabsList.filterItemsContainer) - .children() - .last() - .click(); - // - cy.wait(1000); - cy.get(nativeFilters.filterConfigurationSections.displayedSection).within( - () => { - cy.contains('Values are dependent on other filters').should( - 'not.exist', - ); - }, - ); + it('should focus filter and open "more filters" programmatically', () => { + prepareDashboardFilters([ + { name: 'test_1', column: 'country_name', datasetId: 2 }, + { name: 'test_2', column: 'country_code', datasetId: 2 }, + { name: 'test_3', column: 'region', datasetId: 2 }, + { name: 'test_4', column: 'year', datasetId: 2 }, + { name: 'test_5', column: 'country_name', datasetId: 2 }, + { name: 'test_6', column: 'country_code', datasetId: 2 }, + { name: 'test_7', column: 'region', datasetId: 2 }, + { name: 'test_8', column: 'year', datasetId: 2 }, + { name: 'test_9', column: 'country_name', datasetId: 2 }, + { name: 'test_10', column: 'country_code', datasetId: 2 }, + { name: 'test_11', column: 'region', datasetId: 2 }, + { name: 'test_12', column: 'year', datasetId: 2 }, + ]); + setFilterBarOrientation('horizontal'); + cy.getBySel('slice-header').within(() => { + cy.get('.filter-counts').click(); + }); + cy.get('.filterStatusPopover').contains('test_8').click(); + cy.getBySel('dropdown-content').should('be.visible'); + cy.get('.ant-select-focused').should('be.visible'); }); - it('User can create filter depend on 2 other filters', () => { + it('should show tag count and one plain tag on focus and only count on blur in select ', () => { + prepareDashboardFilters([ + { name: 'test_1', column: 'country_name', datasetId: 2 }, + ]); + setFilterBarOrientation('horizontal'); enterNativeFilterEditModal(); - // add first filter - addRegionFilter(); - // add second filter - clickOnAddFilterInModal(); - addCountryNameFilter(); - // add third filter - clickOnAddFilterInModal(); - addCountryCodeFilter(); - cy.wait(1000); - cy.get(nativeFilters.filterConfigurationSections.displayedSection).within( - () => { - cy.contains('Values are dependent on other filters') - .should('be.visible') - .click(); - cy.get(exploreView.controlPanel.addFieldValue).click(); - }, - ); - // add value to the first input - addParentFilterWithValue(0, testItems.topTenChart.filterColumnRegion); - // add value to the second input - addParentFilterWithValue(1, testItems.topTenChart.filterColumn); - saveNativeFilterSettings(); - // wait for charts load - WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); - // filters should be displayed in the left panel - [ - testItems.topTenChart.filterColumnRegion, - testItems.topTenChart.filterColumn, - testItems.topTenChart.filterColumnCountryCode, - ].forEach(it => { - validateFilterNameOnDashboard(it); + inputNativeFilterDefaultValue('Albania'); + inputNativeFilterDefaultValue('Algeria', true); + saveNativeFilterSettings([SAMPLE_CHART]); + cy.getBySel('filter-bar').within(() => { + cy.get(nativeFilters.filterItem).contains('Albania').should('be.visible'); + cy.get(nativeFilters.filterItem).contains('+ 1 ...').should('be.visible'); + cy.get('.ant-select-selection-search-input').click(); + cy.get(nativeFilters.filterItem).contains('+ 2 ...').should('be.visible'); }); + }); +}); - // initially first filter shows 39 options - getNativeFilterPlaceholderWithIndex(0).should('have.text', '7 options'); - // initially second filter shows 409 options - getNativeFilterPlaceholderWithIndex(1).should('have.text', '214 options'); - // verify third filter shows 409 options - getNativeFilterPlaceholderWithIndex(2).should('have.text', '214 options'); - - // apply first filter value - applyNativeFilterValueWithIndex(0, 'North America'); - - // verify second filter shows 409 options available still - getNativeFilterPlaceholderWithIndex(0).should('have.text', '214 options'); - - // verify second filter shows 69 options available still - getNativeFilterPlaceholderWithIndex(1).should('have.text', '3 options'); - - // apply second filter value - applyNativeFilterValueWithIndex(1, 'United States'); +describe('Native filters', () => { + describe('Nativefilters tests initial state required', () => { + beforeEach(() => { + cy.createSampleDashboards([0]); + }); - // verify number of available options for third filter - should be decreased to only one - getNativeFilterPlaceholderWithIndex(0).should('have.text', '1 option'); - }); + it('Verify that default value is respected after revisit', () => { + prepareDashboardFilters([ + { name: 'country_name', column: 'country_name', datasetId: 2 }, + ]); + enterNativeFilterEditModal(); + inputNativeFilterDefaultValue(testItems.filterDefaultValue); + saveNativeFilterSettings([SAMPLE_CHART]); + cy.get(nativeFilters.filterItem) + .contains(testItems.filterDefaultValue) + .should('be.visible'); + cy.get(dataTestChartName(testItems.topTenChart.name)).within(() => { + cy.contains(testItems.filterDefaultValue).should('be.visible'); + cy.contains(testItems.filterOtherCountry).should('not.exist'); + }); - it('User can remove parent filters', () => { - enterNativeFilterEditModal(); - addRegionFilter(); - clickOnAddFilterInModal(); - addCountryNameFilter(); - cy.wait(1000); - // Select dependdent option and auto use platform for genre - cy.get(nativeFilters.filterConfigurationSections.displayedSection).within( - () => { - cy.contains('Values are dependent on other filters') - .should('be.visible') - .click(); - }, - ); - saveNativeFilterSettings(); - enterNativeFilterEditModal(); - cy.get(nativeFilters.modal.tabsList.removeTab) - .should('be.visible') - .first() - .click({ - force: true, + // reload dashboard + cy.reload(); + cy.get(dataTestChartName(testItems.topTenChart.name)).within(() => { + cy.contains(testItems.filterDefaultValue).should('be.visible'); + cy.contains(testItems.filterOtherCountry).should('not.exist'); }); - saveNativeFilterSettings(); - WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); - cy.get(dataTestChartName(testItems.topTenChart.name)).within(() => { - cy.contains(testItems.filterDefaultValue).should('be.visible'); - cy.contains(testItems.filterOtherCountry).should('be.visible'); + validateFilterContentOnDashboard(testItems.filterDefaultValue); }); - }); -}); -describe('Nativefilters initial state not required', () => { - beforeEach(() => { - cy.login(); - cy.visit(WORLD_HEALTH_DASHBOARD); - }); + it('User can create parent filters using "Values are dependent on other filters"', () => { + prepareDashboardFilters([ + { name: 'region', column: 'region', datasetId: 2 }, + { name: 'country_name', column: 'country_name', datasetId: 2 }, + ]); + enterNativeFilterEditModal(); + selectFilter(1); + cy.get(nativeFilters.filterConfigurationSections.displayedSection).within( + () => { + cy.contains('Values are dependent on other filters') + .should('be.visible') + .click(); + }, + ); + addParentFilterWithValue(0, testItems.topTenChart.filterColumnRegion); + saveNativeFilterSettings([SAMPLE_CHART]); + [ + testItems.topTenChart.filterColumnRegion, + testItems.topTenChart.filterColumn, + ].forEach(it => { + cy.get(nativeFilters.filterFromDashboardView.filterName) + .contains(it) + .should('be.visible'); + }); + getNativeFilterPlaceholderWithIndex(1) + .invoke('text') + .should('equal', '214 options', { timeout: 20000 }); + // apply first filter value and validate 2nd filter is depden on 1st filter. + applyNativeFilterValueWithIndex(0, 'North America'); + getNativeFilterPlaceholderWithIndex(0).should('have.text', '3 options', { + timeout: 20000, + }); + }); - after(() => { - enterNativeFilterEditModal(); - deleteNativeFilter(); - }); + it('user can delete dependent filter', () => { + prepareDashboardFilters([ + { name: 'region', column: 'region', datasetId: 2 }, + { name: 'country_name', column: 'country_name', datasetId: 2 }, + ]); + enterNativeFilterEditModal(); + selectFilter(1); + cy.get(nativeFilters.filterConfigurationSections.displayedSection).within( + () => { + cy.contains('Values are dependent on other filters') + .should('be.visible') + .click(); + }, + ); + addParentFilterWithValue(0, testItems.topTenChart.filterColumnRegion); + // remove year native filter to cause it disappears from parent filter input in global sales + cy.get(nativeFilters.modal.tabsList.removeTab) + .should('be.visible') + .first() + .click(); + // make sure you are seeing global sales filter which had parent filter + cy.get(nativeFilters.modal.tabsList.filterItemsContainer) + .children() + .last() + .click(); + // + cy.wait(1000); + cy.get(nativeFilters.filterConfigurationSections.displayedSection).within( + () => { + cy.contains('Values are dependent on other filters').should( + 'not.exist', + ); + }, + ); + }); - it('User can expand / retract native filter sidebar on a dashboard', () => { - cy.get(nativeFilters.addFilterButton.button).should('not.exist'); - expandFilterOnLeftPanel(); - cy.get(nativeFilters.filterFromDashboardView.createFilterButton).should( - 'be.visible', - ); - cy.get(nativeFilters.filterFromDashboardView.expand).should( - 'not.be.visible', - ); - collapseFilterOnLeftPanel(); - }); + it('User can create filter depend on 2 other filters', () => { + prepareDashboardFilters([ + { name: 'region', column: 'region', datasetId: 2 }, + { name: 'country_name', column: 'country_name', datasetId: 2 }, + { name: 'country_code', column: 'country_code', datasetId: 2 }, + ]); + enterNativeFilterEditModal(); + selectFilter(2); + cy.get(nativeFilters.filterConfigurationSections.displayedSection).within( + () => { + cy.contains('Values are dependent on other filters') + .should('be.visible') + .click(); + cy.get(exploreView.controlPanel.addFieldValue).click(); + }, + ); + // add value to the first input + addParentFilterWithValue(0, testItems.topTenChart.filterColumnRegion); + // add value to the second input + addParentFilterWithValue(1, testItems.topTenChart.filterColumn); + saveNativeFilterSettings([SAMPLE_CHART]); + // filters should be displayed in the left panel + [ + testItems.topTenChart.filterColumnRegion, + testItems.topTenChart.filterColumn, + testItems.topTenChart.filterColumnCountryCode, + ].forEach(it => { + validateFilterNameOnDashboard(it); + }); - it('User can enter filter edit pop-up by clicking on native filter edit icon', () => { - enterNativeFilterEditModal(); - }); + // initially first filter shows 39 options + getNativeFilterPlaceholderWithIndex(0).should('have.text', '7 options'); + // initially second filter shows 409 options + getNativeFilterPlaceholderWithIndex(1).should('have.text', '214 options'); + // verify third filter shows 409 options + getNativeFilterPlaceholderWithIndex(2).should('have.text', '214 options'); - it('User can delete a native filter', () => { - enterNativeFilterEditModal(); - cy.get(nativeFilters.filtersList.removeIcon).first().click(); - cy.contains('Restore Filter').should('not.exist', { timeout: 10000 }); - saveNativeFilterSettings(); - }); + // apply first filter value + applyNativeFilterValueWithIndex(0, 'North America'); - it('User can cancel creating a new filter', () => { - enterNativeFilterEditModal(); - cancelNativeFilterSettings(); - }); + // verify second filter shows 409 options available still + getNativeFilterPlaceholderWithIndex(0).should('have.text', '214 options'); - it('Verify setting options and tooltips for value filter', () => { - enterNativeFilterEditModal(); - cy.contains('Filter value is required').should('be.visible').click(); - checkNativeFilterTooltip(0, nativeFilterTooltips.defaultValue); - cy.get(nativeFilters.modal.container).should('be.visible'); - valueNativeFilterOptions.forEach(el => { - cy.contains(el); - }); - cy.contains('Values are dependent on other filters').should('not.exist'); - cy.get(nativeFilters.filterConfigurationSections.checkedCheckbox).contains( - 'Can select multiple values', - ); - checkNativeFilterTooltip(1, nativeFilterTooltips.required); - checkNativeFilterTooltip(2, nativeFilterTooltips.defaultToFirstItem); - checkNativeFilterTooltip(3, nativeFilterTooltips.searchAllFilterOptions); - checkNativeFilterTooltip(4, nativeFilterTooltips.inverseSelection); - clickOnAddFilterInModal(); - cy.contains('Values are dependent on other filters').should('exist'); - }); + // verify second filter shows 69 options available still + getNativeFilterPlaceholderWithIndex(1).should('have.text', '3 options'); - it("User can check 'Filter has default value'", () => { - enterNativeFilterEditModal(); - addCountryNameFilter(); - inputNativeFilterDefaultValue(testItems.filterDefaultValue); - }); + // apply second filter value + applyNativeFilterValueWithIndex(1, 'United States'); - it('User can add a new native filter', () => { - let filterKey: string; - const removeFirstChar = (search: string) => - search.split('').slice(1, search.length).join(''); - cy.wait(3000); - cy.location().then(loc => { - const queryParams = qs.parse(removeFirstChar(loc.search)); - filterKey = queryParams.native_filters_key as string; - expect(typeof filterKey).eq('string'); - }); - enterNativeFilterEditModal(); - addCountryNameFilter(); - saveNativeFilterSettings(); - cy.wait(3000); - cy.location().then(loc => { - const queryParams = qs.parse(removeFirstChar(loc.search)); - const newfilterKey = queryParams.native_filters_key; - expect(newfilterKey).eq(filterKey); + // verify number of available options for third filter - should be decreased to only one + getNativeFilterPlaceholderWithIndex(0).should('have.text', '1 option'); }); - cy.wait(3000); - cy.get(nativeFilters.modal.container).should('not.exist'); - }); - it('User can undo deleting a native filter', () => { - enterNativeFilterEditModal(); - addCountryCodeFilter(); - saveNativeFilterSettings(); - WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); - validateFilterNameOnDashboard( - testItems.topTenChart.filterColumnCountryCode, - ); - enterNativeFilterEditModal(); - cy.get(nativeFilters.filtersList.removeIcon).first().click(); - cy.get('[data-test="restore-filter-button"]').should('be.visible').click(); - cy.get(nativeFilters.modal.container) - .find(nativeFilters.filtersPanel.filterName) - .should( - 'have.attr', - 'value', - testItems.topTenChart.filterColumnCountryCode, + it('User can remove parent filters', () => { + prepareDashboardFilters([ + { name: 'region', column: 'region', datasetId: 2 }, + { name: 'country_name', column: 'country_name', datasetId: 2 }, + ]); + enterNativeFilterEditModal(); + selectFilter(1); + // Select dependdent option and auto use platform for genre + cy.get(nativeFilters.filterConfigurationSections.displayedSection).within( + () => { + cy.contains('Values are dependent on other filters') + .should('be.visible') + .click(); + }, ); - }); - - it('User can create a time grain filter', () => { - enterNativeFilterEditModal(); - fillNativeFilterForm( - testItems.filterType.timeGrain, - testItems.filterType.timeGrain, - testItems.datasetForNativeFilter, - ); - saveNativeFilterSettings(); - applyNativeFilterValueWithIndex(0, testItems.filterTimeGrain); - cy.get(nativeFilters.applyFilter).click(); - cy.url().then(u => { - const ur = new URL(u); - expect(ur.search).to.include('native_filters'); + saveNativeFilterSettings([SAMPLE_CHART]); + enterNativeFilterEditModal(); + cy.get(nativeFilters.modal.tabsList.removeTab) + .should('be.visible') + .first() + .click({ + force: true, + }); + saveNativeFilterSettings([SAMPLE_CHART]); + cy.get(dataTestChartName(testItems.topTenChart.name)).within(() => { + cy.contains(testItems.filterDefaultValue).should('be.visible'); + cy.contains(testItems.filterOtherCountry).should('be.visible'); + }); }); - validateFilterNameOnDashboard(testItems.filterType.timeGrain); - validateFilterContentOnDashboard(testItems.filterTimeGrain); }); - it('User can create a time range filter', () => { - enterNativeFilterEditModal(); - fillNativeFilterForm( - testItems.filterType.timeRange, - testItems.filterType.timeRange, - ); - saveNativeFilterSettings(); - cy.get(dashboardView.salesDashboardSpecific.vehicleSalesFilterTimeRange) - .should('be.visible') - .click(); - applyAdvancedTimeRangeFilterOnDashboard('2005-12-17', '2006-12-17'); - cy.url().then(u => { - const ur = new URL(u); - expect(ur.search).to.include('native_filters'); + describe('Nativefilters basic interactions', () => { + before(() => { + visitDashboard(); }); - validateFilterNameOnDashboard(testItems.filterType.timeRange); - cy.get(nativeFilters.filterFromDashboardView.timeRangeFilterContent) - .contains('2005-12-17') - .should('be.visible'); - }); - it('User can create a time column filter', () => { - enterNativeFilterEditModal(); - fillNativeFilterForm( - testItems.filterType.timeColumn, - testItems.filterType.timeColumn, - testItems.datasetForNativeFilter, - ); - saveNativeFilterSettings(); - cy.intercept(`/api/v1/chart/data?form_data=**`).as('chart'); - cy.get(nativeFilters.modal.container).should('not.exist'); - // assert that native filter is created - validateFilterNameOnDashboard(testItems.filterType.timeColumn); - applyNativeFilterValueWithIndex(0, testItems.topTenChart.filterColumnYear); - cy.get(nativeFilters.applyFilter).click({ force: true }); - cy.wait('@chart'); - validateFilterContentOnDashboard(testItems.topTenChart.filterColumnYear); - }); + beforeEach(() => { + cy.createSampleDashboards([0]); + closeFilterModal(); + }); - it('User can create a numerical range filter', () => { - enterNativeFilterEditModal(); - fillNativeFilterForm( - testItems.filterType.numerical, - testItems.filterNumericalColumn, - testItems.datasetForNativeFilter, - testItems.filterNumericalColumn, - ); - saveNativeFilterSettings(); - // assertions - cy.get(nativeFilters.slider.slider).should('be.visible').click('center'); - // cy.get(sqlLabView.tooltip).should('be.visible'); - cy.intercept(`/superset/explore_json/*`).as('slices'); - cy.get(nativeFilters.applyFilter).click(); - cy.wait('@slices'); - // assert that the url contains 'native_filters' in the url - cy.url().then(u => { - const ur = new URL(u); - expect(ur.search).to.include('native_filters'); - // assert that the start handle has a value - cy.get(nativeFilters.slider.startHandle) - .invoke('attr', 'aria-valuenow') - .should('exist'); - // assert that the end handle has a value - cy.get(nativeFilters.slider.endHandle) - .invoke('attr', 'aria-valuenow') - .should('exist'); - // assert slider text matches what we should have - cy.get(nativeFilters.slider.sliderText).should('have.text', '49'); + it('User can expand / retract native filter sidebar on a dashboard', () => { + cy.get(nativeFilters.addFilterButton.button).should('not.exist'); + expandFilterOnLeftPanel(); + cy.get(nativeFilters.filterFromDashboardView.createFilterButton).should( + 'be.visible', + ); + cy.get(nativeFilters.filterFromDashboardView.expand).should( + 'not.be.visible', + ); + collapseFilterOnLeftPanel(); }); - }); - it('User can undo deleting a native filter', () => { - enterNativeFilterEditModal(); - addCountryNameFilter(); - saveNativeFilterSettings(); - WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); - validateFilterNameOnDashboard(testItems.topTenChart.filterColumn); - enterNativeFilterEditModal(); - undoDeleteNativeFilter(); - }); + it('User can enter filter edit pop-up by clicking on native filter edit icon', () => { + enterNativeFilterEditModal(false); + }); - it('User can cancel changes in native filter', () => { - enterNativeFilterEditModal(); - fillNativeFilterForm( - testItems.filterType.value, - 'suffix', - testItems.datasetForNativeFilter, - ); - cancelNativeFilterSettings(); - enterNativeFilterEditModal(); - cy.get(nativeFilters.filtersList.removeIcon).first().click(); - cy.contains('You have removed this filter.').should('be.visible'); - saveNativeFilterSettings(); - }); + it('User can delete a native filter', () => { + enterNativeFilterEditModal(false); + cy.get(nativeFilters.filtersList.removeIcon).first().click(); + cy.contains('Restore Filter').should('not.exist', { timeout: 10000 }); + }); - it('User can create a value filter', () => { - enterNativeFilterEditModal(); - addCountryNameFilter(); - cy.get(nativeFilters.filtersPanel.filterTypeInput) - .find(nativeFilters.filtersPanel.filterTypeItem) - .should('have.text', testItems.filterType.value); - saveNativeFilterSettings(); - validateFilterNameOnDashboard(testItems.topTenChart.filterColumn); - }); + it('User can cancel creating a new filter', () => { + enterNativeFilterEditModal(false); + cancelNativeFilterSettings(); + }); - it('User can apply value filter with selected values', () => { - enterNativeFilterEditModal(); - addCountryNameFilter(); - saveNativeFilterSettings(); - WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); - applyNativeFilterValueWithIndex(0, testItems.filterDefaultValue); - cy.get(nativeFilters.applyFilter).click(); - cy.get(dataTestChartName(testItems.topTenChart.name)).within(() => { - cy.contains(testItems.filterDefaultValue).should('be.visible'); - cy.contains(testItems.filterOtherCountry).should('not.exist'); + it('Verify setting options and tooltips for value filter', () => { + enterNativeFilterEditModal(false); + cy.contains('Filter value is required').should('be.visible').click(); + checkNativeFilterTooltip(0, nativeFilterTooltips.defaultValue); + cy.get(nativeFilters.modal.container).should('be.visible'); + valueNativeFilterOptions.forEach(el => { + cy.contains(el); + }); + cy.contains('Values are dependent on other filters').should('not.exist'); + cy.get( + nativeFilters.filterConfigurationSections.checkedCheckbox, + ).contains('Can select multiple values'); + checkNativeFilterTooltip(1, nativeFilterTooltips.required); + checkNativeFilterTooltip(2, nativeFilterTooltips.defaultToFirstItem); + checkNativeFilterTooltip(3, nativeFilterTooltips.searchAllFilterOptions); + checkNativeFilterTooltip(4, nativeFilterTooltips.inverseSelection); + clickOnAddFilterInModal(); + cy.contains('Values are dependent on other filters').should('exist'); }); }); - it('User can stop filtering when filter is removed', () => { - enterNativeFilterEditModal(); - addCountryNameFilter(); - inputNativeFilterDefaultValue(testItems.filterDefaultValue); - saveNativeFilterSettings(); - WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); - cy.get(dataTestChartName(testItems.topTenChart.name)).within(() => { - cy.contains(testItems.filterDefaultValue).should('be.visible'); - cy.contains(testItems.filterOtherCountry).should('not.exist'); - }); - cy.get(nativeFilters.filterItem) - .contains(testItems.filterDefaultValue) - .should('be.visible'); - validateFilterNameOnDashboard(testItems.topTenChart.filterColumn); - enterNativeFilterEditModal(); - deleteNativeFilter(); - saveNativeFilterSettings(); - WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); - cy.get(dataTestChartName(testItems.topTenChart.name)).within(() => { - cy.contains(testItems.filterDefaultValue).should('be.visible'); - cy.contains(testItems.filterOtherCountry).should('be.visible'); + describe('Nativefilters initial state not required', () => { + it("User can check 'Filter has default value'", () => { + prepareDashboardFilters([ + { name: 'country_name', column: 'country_name', datasetId: 2 }, + ]); + enterNativeFilterEditModal(); + inputNativeFilterDefaultValue(testItems.filterDefaultValue); }); - }); -}); -xdescribe('Nativefilters', () => { - before(() => { - cy.login(); - cy.visit(DASHBOARD_LIST); - cy.get('[data-test="new-dropdown"]').click(); - cy.get('[data-test="menu-item-Dashboard"]').click({ force: true }); - cy.get('[data-test="editable-title-input"]') - .click() - .clear() - .type(`${dashboard}{enter}`); - cy.get('[data-test="header-save-button"]').click(); - cy.visit(CHART_LIST); - cy.get('[data-test="search-input"]').type('Treemap{enter}'); - cy.get('[data-test="Treemap-list-chart-title"]') - .should('be.visible', { timeout: 5000 }) - .click(); - cy.get('[data-test="query-save-button"]').click(); - cy.get('[data-test="save-chart-modal-select-dashboard-form"]') - .find('input[aria-label="Select a dashboard"]') - .type(`${dashboard}`, { force: true }); - cy.get('[data-test="btn-modal-save"]').click(); - }); - beforeEach(() => { - cy.login(); - cy.visit(DASHBOARD_LIST); - cy.get('[data-test="search-input"]').click().type(`${dashboard}{enter}`); - cy.contains('[data-test="cell-text"]', `${dashboard}`).click(); - }); + it('User can add a new native filter', () => { + prepareDashboardFilters([]); - it('should show filter bar and allow user to create filters ', () => { - cy.get('[data-test="filter-bar"]').should('be.visible'); - cy.get('[data-test="filter-bar__expand-button"]').click(); - cy.get('[data-test="filter-bar__create-filter"]').click(); - cy.get('.ant-modal').should('be.visible'); - - cy.get('.ant-modal') - .find('[data-test="filters-config-modal__name-input"]') - .click() - .type('Country name'); - - cy.get('.ant-modal') - .find('[data-test="filters-config-modal__datasource-input"]') - .click() - .type('wb_health_population'); - - cy.get( - '.ant-modal [data-test="filters-config-modal__datasource-input"] .Select__menu', - ) - .contains('wb_health_population') - .click(); - - // hack for unclickable country_name - cy.get('.ant-modal').find('[data-test="field-input"]').type('country_name'); - cy.get('.ant-modal') - .find('[data-test="field-input"]') - .type('{downarrow}{downarrow}{enter}'); - cy.get('[data-test="apply-changes-instantly-checkbox"]').check(); - cy.get('.ant-modal-footer') - .find('[data-test="native-filter-modal-save-button"]') - .should('be.visible') - .click(); - }); + let filterKey: string; + const removeFirstChar = (search: string) => + search.split('').slice(1, search.length).join(''); - it('should show newly added filter in filter bar menu', () => { - cy.get('[data-test="filter-bar"]').should('be.visible'); - cy.get('[data-test="filter-control-name"]').should('be.visible'); - cy.get('[data-test="form-item-value"]').should('be.visible'); - }); - it('should filter dashboard with selected filter value', () => { - cy.get('[data-test="form-item-value"]').should('be.visible').click(); - cy.get('.ant-select-selection-search').type('Hong Kong{enter}'); - cy.get('[data-test="filter-bar__apply-button"]').click(); - cy.get('.treemap').within(() => { - cy.contains('HKG').should('be.visible'); - cy.contains('USA').should('not.exist'); - }); - }); - xit('default value is respected after revisit', () => { - cy.get('[data-test="filter-bar__create-filter"]').click(); - cy.get('.ant-modal').should('be.visible'); - // TODO: replace with proper wait for filter to finish loading - cy.wait(1000); - cy.get('[data-test="default-input"]').click(); - cy.get('.ant-modal') - .find('[data-test="default-input"]') - .type('Sweden{enter}'); - cy.get('[data-test="native-filter-modal-save-button"]') - .should('be.visible') - .click(); - cy.visit(DASHBOARD_LIST); - cy.get('[data-test="search-input"]').click().type(`${dashboard}{enter}`); - cy.contains('[data-test="cell-text"]', `${dashboard}`).click(); - cy.get('.treemap').within(() => { - cy.contains('SWE').should('be.visible'); - cy.contains('USA').should('not.exist'); - }); - cy.contains('Sweden'); - }); - it('should allow for deleted filter restore', () => { - cy.get('[data-test="filter-bar__create-filter"]').click(); - cy.get('.ant-modal').should('be.visible'); - cy.get('.ant-tabs-nav-list').within(() => { - cy.get('.ant-tabs-tab-remove').click(); + cy.location().then(loc => { + cy.url().should('contain', 'native_filters_key'); + const queryParams = qs.parse(removeFirstChar(loc.search)); + filterKey = queryParams.native_filters_key as string; + expect(typeof filterKey).eq('string'); + }); + enterNativeFilterEditModal(); + addCountryNameFilter(); + saveNativeFilterSettings([SAMPLE_CHART]); + cy.location().then(loc => { + cy.url().should('contain', 'native_filters_key'); + const queryParams = qs.parse(removeFirstChar(loc.search)); + const newfilterKey = queryParams.native_filters_key; + expect(newfilterKey).eq(filterKey); + }); + cy.get(nativeFilters.modal.container).should('not.exist'); }); - cy.get('[data-test="undo-button"]').should('be.visible').click(); - cy.get('.ant-tabs-nav-list').within(() => { - cy.get('.ant-tabs-tab-remove').click(); + it('User can restore a deleted native filter', () => { + prepareDashboardFilters([ + { name: 'country_code', column: 'country_code', datasetId: 2 }, + ]); + enterNativeFilterEditModal(); + cy.get(nativeFilters.filtersList.removeIcon).first().click(); + cy.get('[data-test="restore-filter-button"]') + .should('be.visible') + .click(); + cy.get(nativeFilters.modal.container) + .find(nativeFilters.filtersPanel.filterName) + .should( + 'have.attr', + 'value', + testItems.topTenChart.filterColumnCountryCode, + ); }); - cy.get('[data-test="restore-filter-button"]').should('be.visible').click(); - }); - it('should stop filtering when filter is removed', () => { - cy.get('[data-test="filter-bar__create-filter"]').click(); - cy.get('.ant-modal').should('be.visible'); - cy.get('.ant-tabs-nav-list').within(() => { - cy.get('.ant-tabs-tab-remove').click(); - }); - cy.get('.ant-modal-footer') - .find('[data-test="native-filter-modal-save-button"]') - .should('be.visible') - .click(); - cy.get('.treemap').within(() => { - cy.contains('HKG').should('be.visible'); - cy.contains('USA').should('be.visible'); + it('User can create a time grain filter', () => { + prepareDashboardFilters([]); + enterNativeFilterEditModal(); + fillNativeFilterForm( + testItems.filterType.timeGrain, + testItems.filterType.timeGrain, + testItems.datasetForNativeFilter, + ); + saveNativeFilterSettings([SAMPLE_CHART]); + applyNativeFilterValueWithIndex(0, testItems.filterTimeGrain); + cy.get(nativeFilters.applyFilter).click(); + cy.url().then(u => { + const ur = new URL(u); + expect(ur.search).to.include('native_filters'); + }); + validateFilterNameOnDashboard(testItems.filterType.timeGrain); + validateFilterContentOnDashboard(testItems.filterTimeGrain); }); - }); - describe('Parent Filters', () => { - it('should allow for creating parent filters ', () => { - cy.get('[data-test="filter-bar"]').should('be.visible'); - cy.get('[data-test="filter-bar__expand-button"]').click(); - cy.get('[data-test="filter-bar__create-filter"]').click(); - cy.get('.ant-modal').should('be.visible'); - - cy.get('.ant-modal') - .find('[data-test="filters-config-modal__name-input"]') - .click() - .type('Country name'); - - cy.get('.ant-modal') - .find('[data-test="filters-config-modal__datasource-input"]') - .click() - .type('wb_health_population'); - - cy.get( - '.ant-modal [data-test="filters-config-modal__datasource-input"] .Select__menu', - ) - .contains('wb_health_population') - .click(); - // hack for unclickable country_name - cy.get('.ant-modal') - .find('[data-test="field-input"]') - .type('country_name'); - cy.get('.ant-modal') - .find('[data-test="field-input"]') - .type('{downarrow}{downarrow}{enter}'); - cy.get('[data-test="apply-changes-instantly-checkbox"]').check(); - cy.get('.ant-modal-footer') - .find('[data-test="native-filter-modal-save-button"]') + it.skip('User can create a time range filter', () => { + enterNativeFilterEditModal(); + fillNativeFilterForm( + testItems.filterType.timeRange, + testItems.filterType.timeRange, + ); + saveNativeFilterSettings(WORLD_HEALTH_CHARTS); + cy.get(dashboardView.salesDashboardSpecific.vehicleSalesFilterTimeRange) .should('be.visible') .click(); + applyAdvancedTimeRangeFilterOnDashboard('2005-12-17', '2006-12-17'); + cy.url().then(u => { + const ur = new URL(u); + expect(ur.search).to.include('native_filters'); + }); + validateFilterNameOnDashboard(testItems.filterType.timeRange); + cy.get(nativeFilters.filterFromDashboardView.timeRangeFilterContent) + .contains('2005-12-17') + .should('be.visible'); + }); - cy.get('[data-test="filter-bar__create-filter"]').click(); - cy.get('.ant-modal').first().should('be.visible'); - cy.get('[data-test=add-filter-button]').first().click(); - - cy.get('.ant-modal') - .find('[data-test="filters-config-modal__name-input"]') - .last() - .click() - .type('Region Name'); - - cy.get('.ant-modal') - .find('[data-test="filters-config-modal__datasource-input"]') - .last() - .click() - .type('wb_health_population'); + it.skip('User can create a time column filter', () => { + enterNativeFilterEditModal(); + fillNativeFilterForm( + testItems.filterType.timeColumn, + testItems.filterType.timeColumn, + testItems.datasetForNativeFilter, + ); + saveNativeFilterSettings(WORLD_HEALTH_CHARTS); + cy.intercept(`/api/v1/chart/data?form_data=**`).as('chart'); + cy.get(nativeFilters.modal.container).should('not.exist'); + // assert that native filter is created + validateFilterNameOnDashboard(testItems.filterType.timeColumn); + applyNativeFilterValueWithIndex( + 0, + testItems.topTenChart.filterColumnYear, + ); + cy.get(nativeFilters.applyFilter).click({ force: true }); + cy.wait('@chart'); + validateFilterContentOnDashboard(testItems.topTenChart.filterColumnYear); + }); - cy.get( - '.ant-modal [data-test="filters-config-modal__datasource-input"] .Select__menu', - ) - .last() - .contains('wb_health_population') - .click(); + it('User can create a numerical range filter', () => { + visitDashboard(); + enterNativeFilterEditModal(false); + fillNativeFilterForm( + testItems.filterType.numerical, + testItems.filterNumericalColumn, + testItems.datasetForNativeFilter, + testItems.filterNumericalColumn, + ); + saveNativeFilterSettings([]); + // assertions + cy.get(nativeFilters.slider.slider).should('be.visible').click('center'); + cy.get(nativeFilters.applyFilter).click(); + // assert that the url contains 'native_filters' in the url + cy.url().then(u => { + const ur = new URL(u); + expect(ur.search).to.include('native_filters'); + // assert that the start handle has a value + cy.get(nativeFilters.slider.startHandle) + .invoke('attr', 'aria-valuenow') + .should('exist'); + // assert that the end handle has a value + cy.get(nativeFilters.slider.endHandle) + .invoke('attr', 'aria-valuenow') + .should('exist'); + // assert slider text matches what we should have + cy.get(nativeFilters.slider.sliderText).should('have.text', '49'); + }); + }); - // hack for unclickable country_name - cy.get('.ant-modal') - .find('[data-test="field-input"]') - .last() - .type('region'); - cy.get('.ant-modal') - .find('[data-test="field-input"]') - .last() - .type('{downarrow}{downarrow}{downarrow}{downarrow}{enter}'); + it('User can undo deleting a native filter', () => { + prepareDashboardFilters([ + { name: 'country_name', column: 'country_name', datasetId: 2 }, + ]); + enterNativeFilterEditModal(); + undoDeleteNativeFilter(); + cy.get(nativeFilters.modal.container) + .find(nativeFilters.filtersPanel.filterName) + .should('have.attr', 'value', testItems.topTenChart.filterColumn); + }); - cy.get('[data-test="apply-changes-instantly-checkbox"]').last().check(); - cy.get('.ant-modal') - .find('[data-test="parent-filter-input"]') - .last() - .type('{downarrow}{enter}'); + it('User can cancel changes in native filter', () => { + prepareDashboardFilters([ + { name: 'country_name', column: 'country_name', datasetId: 2 }, + ]); + enterNativeFilterEditModal(); + cy.getBySel('filters-config-modal__name-input').type('|EDITED', { + force: true, + }); + cancelNativeFilterSettings(); + enterNativeFilterEditModal(); + cy.get(nativeFilters.filtersList.removeIcon).first().click(); + cy.contains('You have removed this filter.').should('be.visible'); + }); - cy.get('.ant-modal-footer') - .find('[data-test="native-filter-modal-save-button"]') - .first() - .should('be.visible') - .click(); - cy.get('[data-test="filter-icon"]').should('be.visible'); + it('User can create a value filter', () => { + visitDashboard(); + enterNativeFilterEditModal(false); + addCountryNameFilter(); + cy.get(nativeFilters.filtersPanel.filterTypeInput) + .find(nativeFilters.filtersPanel.filterTypeItem) + .should('have.text', testItems.filterType.value); + saveNativeFilterSettings([]); + validateFilterNameOnDashboard(testItems.topTenChart.filterColumn); }); - xit('should parent filter be working', () => { - cy.get('.treemap').within(() => { - cy.contains('SMR').should('be.visible'); - cy.contains('Europe & Central Asia').should('be.visible'); - cy.contains('South Asia').should('be.visible'); - }); - cy.get('[data-test="form-item-value"]').should('be.visible').click(); - cy.get('.ant-popover-inner-content').within(() => { - cy.get('[data-test="form-item-value"]') - .should('be.visible') - .first() - .type('San Marino{enter}'); - cy.get('[data-test="form-item-value"]') - .should('be.visible') - .last() - .type('Europe & Central Asia{enter}'); - }); - cy.get('.treemap').within(() => { - cy.contains('SMR').should('be.visible'); - cy.contains('Europe & Central Asia').should('be.visible'); - cy.contains('South Asia').should('not.exist'); + it('User can apply value filter with selected values', () => { + prepareDashboardFilters([ + { name: 'country_name', column: 'country_name', datasetId: 2 }, + ]); + applyNativeFilterValueWithIndex(0, testItems.filterDefaultValue); + cy.get(nativeFilters.applyFilter).click(); + cy.get(dataTestChartName(testItems.topTenChart.name)).within(() => { + cy.contains(testItems.filterDefaultValue).should('be.visible'); + cy.contains(testItems.filterOtherCountry).should('not.exist'); }); }); - it('should stop filtering when parent filter is removed', () => { - cy.get('[data-test="filter-bar__create-filter"]').click(); - cy.get('.ant-modal').should('be.visible'); - cy.get('.ant-tabs-nav-list').within(() => { - cy.get('.ant-tabs-tab-remove').click({ multiple: true }); + it('User can stop filtering when filter is removed', () => { + prepareDashboardFilters([ + { name: 'country_name', column: 'country_name', datasetId: 2 }, + ]); + enterNativeFilterEditModal(); + inputNativeFilterDefaultValue(testItems.filterDefaultValue); + saveNativeFilterSettings([SAMPLE_CHART]); + cy.get(dataTestChartName(testItems.topTenChart.name)).within(() => { + cy.contains(testItems.filterDefaultValue).should('be.visible'); + cy.contains(testItems.filterOtherCountry).should('not.exist'); }); - cy.get('.ant-modal-footer') - .find('[data-test="native-filter-modal-save-button"]') - .should('be.visible') - .click(); - cy.get('.treemap').within(() => { - cy.contains('HKG').should('be.visible'); - cy.contains('USA').should('be.visible'); + cy.get(nativeFilters.filterItem) + .contains(testItems.filterDefaultValue) + .should('be.visible'); + validateFilterNameOnDashboard(testItems.topTenChart.filterColumn); + enterNativeFilterEditModal(); + deleteNativeFilter(); + saveNativeFilterSettings([SAMPLE_CHART]); + cy.get(dataTestChartName(testItems.topTenChart.name)).within(() => { + cy.contains(testItems.filterDefaultValue).should('be.visible'); + cy.contains(testItems.filterOtherCountry).should('be.visible'); }); }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/save.test.js b/superset-frontend/cypress-base/cypress/integration/dashboard/save.test.js deleted file mode 100644 index 3c815a222ce1..000000000000 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/save.test.js +++ /dev/null @@ -1,160 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import shortid from 'shortid'; -import { - waitForChartLoad, - WORLD_HEALTH_CHARTS, - WORLD_HEALTH_DASHBOARD, -} from './dashboard.helper'; - -function openDashboardEditProperties() { - cy.get('.header-with-actions [aria-label="Edit dashboard"]').click(); - cy.get( - '.header-with-actions .right-button-panel .ant-dropdown-trigger', - ).trigger('click', { force: true }); - cy.get('.dropdown-menu').contains('Edit properties').click(); -} - -describe('Dashboard save action', () => { - beforeEach(() => { - cy.login(); - cy.visit(WORLD_HEALTH_DASHBOARD); - cy.get('#app').then(() => { - cy.get('.dashboard-header-container').then(headerContainerElement => { - const dashboardId = headerContainerElement.attr('data-test-id'); - - cy.intercept('POST', `/superset/copy_dash/${dashboardId}/`).as( - 'copyRequest', - ); - - cy.get('[aria-label="more-horiz"]').trigger('click', { force: true }); - cy.get('[data-test="save-as-menu-item"]').trigger('click', { - force: true, - }); - cy.get('[data-test="modal-save-dashboard-button"]').trigger('click', { - force: true, - }); - }); - }); - }); - - // change to what the title should be - it('should save as new dashboard', () => { - cy.wait('@copyRequest').then(() => { - cy.get('[data-test="editable-title"]').then(element => { - const dashboardTitle = element.attr('title'); - expect(dashboardTitle).to.not.equal(`World Bank's Data`); - }); - }); - }); - - it('should save/overwrite dashboard', () => { - // should load chart - WORLD_HEALTH_CHARTS.forEach(waitForChartLoad); - - // remove box_plot chart from dashboard - cy.get('[aria-label="Edit dashboard"]').click({ timeout: 5000 }); - cy.get('[data-test="dashboard-delete-component-button"]') - .last() - .trigger('mouseenter') - .click(); - - cy.get('[data-test="grid-container"]') - .find('.box_plot') - .should('not.exist'); - - cy.intercept('PUT', '/api/v1/dashboard/**').as('putDashboardRequest'); - cy.get('.header-with-actions') - .find('[data-test="header-save-button"]') - .contains('Save') - .click(); - - // go back to view mode - cy.wait('@putDashboardRequest'); - cy.get('.header-with-actions') - .find('[aria-label="Edit dashboard"]') - .click(); - - // deleted boxplot should still not exist - cy.get('[data-test="grid-container"]') - .find('.box_plot', { timeout: 20000 }) - .should('not.exist'); - }); - - // TODO: Fix broken test - xit('should save after edit', () => { - cy.get('.dashboard-grid', { timeout: 50000 }) // wait for 50 secs to load dashboard - .then(() => { - const dashboardTitle = `Test dashboard [${shortid.generate()}]`; - - openDashboardEditProperties(); - - // open color scheme dropdown - cy.get('.ant-modal-body') - .contains('Color scheme') - .parents('.ControlHeader') - .next('.Select') - .click() - .then($colorSelect => { - // select a new color scheme - cy.wrap($colorSelect) - .find('.Select__option') - .first() - .next() - .click(); - }); - - // remove json metadata - cy.get('.ant-modal-body') - .contains('Advanced') - .click() - .then(() => { - cy.get('#json_metadata').type('{selectall}{backspace}'); - }); - - // update title - cy.get('.ant-modal-body') - .contains('Title') - .siblings('input') - .type(`{selectall}{backspace}${dashboardTitle}`); - - // save edit changes - cy.get('.ant-modal-footer') - .contains('Save') - .click() - .then(() => { - // assert that modal edit window has closed - cy.get('.ant-modal-body').should('not.exist'); - - // save dashboard changes - cy.get('.header-with-actions').contains('Save').click(); - - // assert success flash - cy.contains('saved successfully').should('be.visible'); - - // assert title has been updated - cy.get('.editable-title [data-test="editable-title-input"]').should( - 'have.value', - dashboardTitle, - ); - }); - }); - }); -}); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/tabs.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/tabs.test.ts index 4dbb8c712bcc..ac076a2200f2 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/tabs.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/dashboard/tabs.test.ts @@ -16,42 +16,48 @@ * specific language governing permissions and limitations * under the License. */ -import { parsePostForm } from 'cypress/utils'; import { - TABBED_DASHBOARD, + parsePostForm, waitForChartLoad, getChartAliasBySpec, -} from './dashboard.helper'; +} from 'cypress/utils'; +import { TABBED_DASHBOARD } from 'cypress/utils/urls'; +import { expandFilterOnLeftPanel } from './utils'; const TREEMAP = { name: 'Treemap', viz: 'treemap' }; const FILTER_BOX = { name: 'Region Filter', viz: 'filter_box' }; const LINE_CHART = { name: 'Growth Rate', viz: 'line' }; const BOX_PLOT = { name: 'Box plot', viz: 'box_plot' }; +const BIG_NUMBER = { name: 'Number of Girls', viz: 'big_number_total' }; +const TABLE = { name: 'Names Sorted by Num in California', viz: 'table' }; + +function topLevelTabs() { + cy.getBySel('dashboard-component-tabs') + .first() + .find('[data-test="nav-list"] .ant-tabs-nav-list > .ant-tabs-tab') + .as('top-level-tabs'); +} + +function resetTabs() { + topLevelTabs(); + cy.get('@top-level-tabs').first().click(); + waitForChartLoad(FILTER_BOX); + waitForChartLoad(TREEMAP); + waitForChartLoad(BIG_NUMBER); + waitForChartLoad(TABLE); +} describe('Dashboard tabs', () => { - // cypress can not handle window.scrollTo - // https://github.com/cypress-io/cypress/issues/2761 - // add this exception handler to pass test - const handleException = () => { - // return false to prevent the error from - // failing this test - cy.on('uncaught:exception', () => false); - }; - - beforeEach(() => { - cy.login(); - + before(() => { cy.visit(TABBED_DASHBOARD); }); - it('should switch active tab on click', () => { - waitForChartLoad(FILTER_BOX); - waitForChartLoad(TREEMAP); + beforeEach(() => { + resetTabs(); + }); - cy.get('[data-test="dashboard-component-tabs"]') - .first() - .find('[data-test="nav-list"] .ant-tabs-nav-list > .ant-tabs-tab') - .as('top-level-tabs'); + it('should switch tabs', () => { + topLevelTabs(); cy.get('@top-level-tabs') .first() @@ -61,6 +67,9 @@ describe('Dashboard tabs', () => { .last() .should('not.have.class', 'ant-tabs-tab-active'); + cy.getBySel('grid-container').find('.box_plot').should('not.exist'); + cy.getBySel('grid-container').find('.line').should('not.exist'); + cy.get('@top-level-tabs') .last() .click() @@ -68,42 +77,24 @@ describe('Dashboard tabs', () => { cy.get('@top-level-tabs') .first() .should('not.have.class', 'ant-tabs-tab-active'); - }); + waitForChartLoad(BOX_PLOT); + cy.getBySel('grid-container').find('.box_plot').should('be.visible'); - it('should load charts when tab is visible', () => { - // landing in first tab, should see 2 charts - waitForChartLoad(FILTER_BOX); - waitForChartLoad(TREEMAP); - cy.get('[data-test="grid-container"]') - .find('.box_plot') - .should('not.exist'); - cy.get('[data-test="grid-container"]').find('.line').should('not.exist'); + resetTabs(); // click row level tab, see 1 more chart - cy.get('[data-test="dashboard-component-tabs"]') - .last() + cy.getBySel('dashboard-component-tabs') + .eq(2) .find('[data-test="nav-list"] .ant-tabs-nav-list > .ant-tabs-tab') .as('row-level-tabs'); cy.get('@row-level-tabs').last().click(); - waitForChartLoad(LINE_CHART); - cy.get('[data-test="grid-container"]').find('.line').should('be.visible'); - - // click top level tab, see 1 more chart - handleException(); - cy.get('[data-test="dashboard-component-tabs"]') - .first() - .find('[data-test="nav-list"] .ant-tabs-nav-list > .ant-tabs-tab') - .as('top-level-tabs'); - - cy.get('@top-level-tabs').last().click(); - - // should exist a visible box_plot element - cy.get('[data-test="grid-container"]').find('.box_plot'); + cy.getBySel('grid-container').find('.line').should('be.visible'); + cy.get('@row-level-tabs').first().click(); }); - xit('should send new queries when tab becomes visible', () => { + it.skip('should send new queries when tab becomes visible', () => { // landing in first tab waitForChartLoad(FILTER_BOX); waitForChartLoad(TREEMAP); @@ -176,4 +167,30 @@ describe('Dashboard tabs', () => { }); }); }); + + it('should update size when switch tab', () => { + cy.get('@top-level-tabs') + .last() + .click() + .should('have.class', 'ant-tabs-tab-active'); + + expandFilterOnLeftPanel(); + + cy.wait(1000); + + cy.get('@top-level-tabs') + .first() + .click() + .should('have.class', 'ant-tabs-tab-active'); + + cy.wait(1000); + + cy.get("[data-test-viz-type='treemap'] .chart-container").then( + $chartContainer => { + expect($chartContainer.get(0).scrollWidth).eq( + $chartContainer.get(0).offsetWidth, + ); + }, + ); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard/nativeFilter.helper.ts b/superset-frontend/cypress-base/cypress/integration/dashboard/utils.ts similarity index 71% rename from superset-frontend/cypress-base/cypress/integration/dashboard/nativeFilter.helper.ts rename to superset-frontend/cypress-base/cypress/integration/dashboard/utils.ts index 5f43b330ceea..29f1e1c2645b 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard/nativeFilter.helper.ts +++ b/superset-frontend/cypress-base/cypress/integration/dashboard/utils.ts @@ -16,8 +16,65 @@ * specific language governing permissions and limitations * under the License. */ + import { dashboardView, nativeFilters } from 'cypress/support/directories'; -import { testItems } from './dashboard.helper'; +import { ChartSpec, waitForChartLoad } from 'cypress/utils'; + +export const WORLD_HEALTH_CHARTS = [ + { name: '% Rural', viz: 'world_map' }, + { name: 'Most Populated Countries', viz: 'table' }, + { name: 'Region Filter', viz: 'filter_box' }, + { name: "World's Population", viz: 'big_number' }, + { name: 'Growth Rate', viz: 'line' }, + { name: 'Rural Breakdown', viz: 'sunburst' }, + { name: "World's Pop Growth", viz: 'area' }, + { name: 'Life Expectancy VS Rural %', viz: 'bubble' }, + { name: 'Treemap', viz: 'treemap' }, + { name: 'Box plot', viz: 'box_plot' }, +] as ChartSpec[]; + +export const SUPPORTED_TIER1_CHARTS = [ + { name: 'Big Number', viz: 'big_number_total' }, + { name: 'Big Number with Trendline', viz: 'big_number' }, + { name: 'Pie Chart', viz: 'pie' }, +] as ChartSpec[]; + +export const SUPPORTED_TIER2_CHARTS = [ + { name: 'Box Plot Chart', viz: 'box_plot' }, +] as ChartSpec[]; + +export const testItems = { + dashboard: 'Cypress test Dashboard', + dataset: 'Vehicle Sales', + datasetForNativeFilter: 'wb_health_population', + chart: 'Cypress chart', + newChart: 'New Cypress Chart', + createdDashboard: 'New Dashboard', + defaultNameDashboard: '[ untitled dashboard ]', + newDashboardTitle: `Test dashboard [NEW TEST]`, + bulkFirstNameDashboard: 'First Dash', + bulkSecondNameDashboard: 'Second Dash', + worldBanksDataCopy: `World Bank's Data [copy]`, + filterType: { + value: 'Value', + numerical: 'Numerical range', + timeColumn: 'Time column', + timeGrain: 'Time grain', + timeRange: 'Time range', + }, + topTenChart: { + name: 'Most Populated Countries', + filterColumn: 'country_name', + filterColumnYear: 'year', + filterColumnRegion: 'region', + filterColumnCountryCode: 'country_code', + }, + filterDefaultValue: 'United States', + filterOtherCountry: 'China', + filterTimeGrain: 'Month', + filterTimeColumn: 'created', + filterNumericalColumn: 'SP_RUR_TOTL_ZS', +}; export const nativeFilterTooltips = { searchAllFilterOptions: @@ -53,6 +110,73 @@ export const valueNativeFilterOptions = [ 'Filter value is required', ]; +export function interceptGet() { + cy.intercept('/api/v1/dashboard/*').as('get'); +} + +export function interceptFiltering() { + cy.intercept('GET', `/api/v1/dashboard/?q=*`).as('filtering'); +} + +export function interceptBulkDelete() { + cy.intercept('DELETE', `/api/v1/dashboard/?q=*`).as('bulkDelete'); +} + +export function interceptDelete() { + cy.intercept('DELETE', `/api/v1/dashboard/*`).as('delete'); +} + +export function interceptUpdate() { + cy.intercept('PUT', `/api/v1/dashboard/*`).as('update'); +} + +export function interceptPost() { + cy.intercept('POST', `/api/v1/dashboard/`).as('post'); +} + +export function interceptLog() { + cy.intercept('/superset/log/?explode=events&dashboard_id=*').as('logs'); +} + +export function interceptFav() { + cy.intercept(`/superset/favstar/Dashboard/*/select/`).as('select'); +} + +export function interceptUnfav() { + cy.intercept(`/superset/favstar/Dashboard/*/unselect/`).as('unselect'); +} + +export function interceptDataset() { + cy.intercept('GET', `/api/v1/dataset/*`).as('getDataset'); +} + +export function interceptCharts() { + cy.intercept('GET', `/api/v1/dashboard/*/charts`).as('getCharts'); +} + +export function interceptDatasets() { + cy.intercept('GET', `/api/v1/dashboard/*/datasets`).as('getDatasets'); +} + +export function interceptDashboardasync() { + cy.intercept('GET', `/dashboardasync/api/read*`).as('getDashboardasync'); +} + +export function interceptFilterState() { + cy.intercept('POST', `/api/v1/dashboard/*/filter_state*`).as( + 'postFilterState', + ); +} + +export function setFilter(filter: string, option: string) { + interceptFiltering(); + + cy.get(`[aria-label="${filter}"]`).first().click(); + cy.get(`[aria-label="${filter}"] [title="${option}"]`).click(); + + cy.wait('@filtering'); +} + /** ************************************************************************ * Expend Native filter from the left panel on dashboard * @returns {None} @@ -84,11 +208,15 @@ export function collapseFilterOnLeftPanel() { * @returns {None} * @summary helper for enter native filter edit modal ************************************************************************* */ -export function enterNativeFilterEditModal() { +export function enterNativeFilterEditModal(waitForDataset = true) { + interceptDataset(); cy.get(nativeFilters.filterFromDashboardView.createFilterButton).click({ force: true, }); cy.get(nativeFilters.modal.container).should('be.visible'); + if (waitForDataset) { + cy.wait('@getDataset'); + } } /** ************************************************************************ @@ -178,11 +306,12 @@ export function getNativeFilterPlaceholderWithIndex(index: number) { export function applyNativeFilterValueWithIndex(index: number, value: string) { cy.get(nativeFilters.filterFromDashboardView.filterValueInput) .eq(index) - .parent() - .should('be.visible', { timeout: 10000 }) + .should('exist', { timeout: 10000 }) .type(`${value}{enter}`); // click the title to dismiss shown options - cy.get(nativeFilters.filterFromDashboardView.filterName).eq(index).click(); + cy.get(nativeFilters.filterFromDashboardView.filterName) + .eq(index) + .click({ force: true }); } /** ************************************************************************ @@ -208,16 +337,17 @@ export function addParentFilterWithValue(index: number, value: string) { * @returns {None} * @summary helper for save native filters settings ************************************************************************* */ -export function saveNativeFilterSettings() { +export function saveNativeFilterSettings(charts: ChartSpec[]) { cy.get(nativeFilters.modal.footer) .contains('Save') .should('be.visible') .click(); cy.get(nativeFilters.modal.container).should('not.exist'); + charts.forEach(waitForChartLoad); } /** ************************************************************************ - * Cancel Native fitler settings + * Cancel Native filter settings * @returns {None} * @summary helper for cancel native filters settings ************************************************************************* */ @@ -227,39 +357,15 @@ export function cancelNativeFilterSettings() { .should('be.visible') .click(); cy.get(nativeFilters.modal.alertXUnsavedFilters) - .should('have.text', 'There are unsaved changes.') - .should('be.visible'); + .should('be.visible') + .should('have.text', 'There are unsaved changes.'); cy.get(nativeFilters.modal.footer) .find(nativeFilters.modal.yesCancelButton) .contains('cancel') - .should('be.visible') - .click(); + .click({ force: true }); cy.get(nativeFilters.modal.container).should('not.exist'); } -/** ************************************************************************ - * Close dashboard toast message - * @returns {None} - * @summary helper for close dashboard toast message in order to make test stable - ************************************************************************* */ -export function closeDashboardToastMessage() { - cy.get('body').then($body => { - if ($body.find(dashboardView.dashboardAlert.modal).length > 0) { - // evaluates as true if button exists at all - cy.get(dashboardView.dashboardAlert.modal).then($header => { - if ($header.is(':visible')) { - cy.get(dashboardView.dashboardAlert.closeButton).click({ - force: true, - }); - cy.get(dashboardView.dashboardAlert.closeButton).should('not.exist', { - timeout: 10000, - }); - } - }); - } - }); -} - /** ************************************************************************ * Validate filter name on dashboard * @param name: filter name to validate @@ -356,18 +462,34 @@ export function applyAdvancedTimeRangeFilterOnDashboard( * @return {null} * @summary helper for input default valule in Native filter in filter settings ************************************************************************* */ -export function inputNativeFilterDefaultValue(defaultValue: string) { - cy.contains('Filter has default value').click(); - cy.contains('Default value is required').should('be.visible'); - cy.get(nativeFilters.modal.container).within(() => { - cy.get(nativeFilters.filterConfigurationSections.filterPlaceholder) - .contains('options') - .should('be.visible'); - cy.get(nativeFilters.filterConfigurationSections.collapsedSectionContainer) - .first() - .get(nativeFilters.filtersPanel.columnEmptyInput) - .type(`${defaultValue}{enter}`); - }); +export function inputNativeFilterDefaultValue( + defaultValue: string, + multiple = false, +) { + if (!multiple) { + cy.contains('Filter has default value').click(); + cy.contains('Default value is required').should('be.visible'); + cy.get(nativeFilters.modal.container).within(() => { + cy.get( + nativeFilters.filterConfigurationSections.filterPlaceholder, + ).contains('options'); + cy.get( + nativeFilters.filterConfigurationSections.collapsedSectionContainer, + ) + .eq(1) + .within(() => { + cy.get('.ant-select-selection-search-input').type( + `${defaultValue}{enter}`, + { force: true }, + ); + }); + }); + } else { + cy.getBySel('default-input').within(() => { + cy.get('.ant-select-selection-search-input').click(); + cy.get('.ant-select-item-option-content').contains(defaultValue).click(); + }); + } } /** ************************************************************************ @@ -384,30 +506,11 @@ export function addCountryNameFilter() { ); } -/** ************************************************************************ - * add filter for test column 'Region' - * @return {null} - * @summary helper for add filter for test column 'Region' - ************************************************************************* */ -export function addRegionFilter() { - fillNativeFilterForm( - testItems.filterType.value, - testItems.topTenChart.filterColumnRegion, - testItems.datasetForNativeFilter, - testItems.topTenChart.filterColumnRegion, - ); -} - -/** ************************************************************************ - * add filter for test column 'Country Code' - * @return {null} - * @summary helper for add filter for test column 'Country Code' - ************************************************************************* */ -export function addCountryCodeFilter() { - fillNativeFilterForm( - testItems.filterType.value, - testItems.topTenChart.filterColumnCountryCode, - testItems.datasetForNativeFilter, - testItems.topTenChart.filterColumnCountryCode, - ); +export function openTab(tabComponentIndex: number, tabIndex: number) { + return cy + .getBySel('dashboard-component-tabs') + .eq(tabComponentIndex) + .find('[role="tab"]') + .eq(tabIndex) + .click(); } diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard_list/card_view.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard_list/card_view.test.ts deleted file mode 100644 index 8bfc35d71c84..000000000000 --- a/superset-frontend/cypress-base/cypress/integration/dashboard_list/card_view.test.ts +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { DASHBOARD_LIST } from './dashboard_list.helper'; - -describe('Dashboard card view', () => { - beforeEach(() => { - cy.login(); - cy.visit(DASHBOARD_LIST); - cy.get('[aria-label="card-view"]').click(); - }); - - xit('should load cards', () => { - cy.get('[data-test="dashboard-list-view"]'); - cy.get('[data-test="styled-card"]').should('be.visible'); - cy.get('[data-test="styled-card"]').should('have.length', 4); // failed, xit-ed - }); - - it('should allow to favorite/unfavorite dashboard card', () => { - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-selected']") - .should('not.exist'); - cy.get("[data-test='card-actions']") - .find("[aria-label='favorite-unselected']") - .first() - .click(); - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-selected']") - .should('be.visible'); - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-unselected']") - .should('not.exist'); - - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-unselected']") - .should('not.exist'); - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-selected']") - .click(); - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-unselected']") - .should('be.visible'); - cy.get("[data-test='card-actions']") - .first() - .find("[aria-label='favorite-selected']") - .should('not.exist'); - }); - - xit('should sort correctly', () => { - // sort alphabetical - cy.get('.Select__control').last().should('be.visible'); - cy.get('.Select__control').last().click({ force: true }); - cy.get('.Select__menu').contains('Alphabetical').click(); - cy.get('[data-test="dashboard-list-view"]').should('be.visible'); - // TODO this line was flaky - cy.get('[data-test="styled-card"]').first().contains('Tabbed Dashboard'); - cy.get('[data-test="styled-card"]').last().contains("World Bank's Data"); - - // sort recently modified - cy.get('.Select__control').last().should('be.visible'); - cy.get('.Select__control').last().click({ force: true }); - cy.get('.Select__menu').contains('Recently Modified').click(); - cy.get('[data-test="dashboard-list-view"]').should('be.visible'); - cy.get('[data-test="styled-card"]').first().contains('Tabbed Dashboard'); - cy.get('[data-test="styled-card"]').last().contains("World Bank's Data"); - }); - - // real flaky - xit('should delete correctly', () => { - // show delete modal - cy.get('[data-test="more-horiz"]').last().trigger('mouseover'); - cy.get('[data-test="dashboard-card-option-delete-button"]') - .last() - .should('be.visible') - .click(); - cy.get('[data-test="modal-confirm-button"]').should( - 'have.attr', - 'disabled', - ); - cy.get('[data-test="Please Confirm-modal"]').should('be.visible'); - cy.get("[data-test='delete-modal-input']").type('DELETE'); - cy.get('[data-test="modal-confirm-button"]').should( - 'not.have.attr', - 'disabled', - ); - cy.get('[data-test="modal-cancel-button"]').click(); - }); - - // real flaky - xit('should edit correctly', () => { - // show edit modal - cy.get('[data-test="more-horiz"]').last().trigger('mouseover'); - cy.get('[data-test="dashboard-card-option-edit-button"]') - .last() - .should('be.visible') - .click(); - cy.get('[data-test="dashboard-edit-properties-form"]').should('be.visible'); - cy.get('[data-test="dashboard-title-input"]').should('not.have.value'); - cy.get('[data-test="properties-modal-cancel-button"]') - .contains('Cancel') - .click(); - }); -}); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard_list/dashboardlist.applitools.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard_list/dashboardlist.applitools.test.ts index dd95eefdb2ff..4e9c84d6ea02 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard_list/dashboardlist.applitools.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/dashboard_list/dashboardlist.applitools.test.ts @@ -16,11 +16,10 @@ * specific language governing permissions and limitations * under the License. */ -import { DASHBOARD_LIST } from './dashboard_list.helper'; +import { DASHBOARD_LIST } from 'cypress/utils/urls'; describe('dashboard list view', () => { beforeEach(() => { - cy.login(); cy.visit(DASHBOARD_LIST); }); @@ -33,7 +32,7 @@ describe('dashboard list view', () => { cy.eyesOpen({ testName: 'Dashboards list-view', }); - cy.eyesCheckWindow('Dashboards loaded'); + cy.eyesCheckWindow('Dashboards list-view loaded'); }); it('should load the Dashboards card list', () => { @@ -41,6 +40,6 @@ describe('dashboard list view', () => { cy.eyesOpen({ testName: 'Dashboards card-view', }); - cy.eyesCheckWindow('Dashboards loaded'); + cy.eyesCheckWindow('Dashboards card-view loaded'); }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard_list/filter.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard_list/filter.test.ts index bf852fc62558..4654b3b5c263 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard_list/filter.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/dashboard_list/filter.test.ts @@ -16,86 +16,32 @@ * specific language governing permissions and limitations * under the License. */ -import { DASHBOARD_LIST } from './dashboard_list.helper'; +import { DASHBOARD_LIST } from 'cypress/utils/urls'; +import { setGridMode, clearAllInputs } from 'cypress/utils'; +import { setFilter } from '../dashboard/utils'; -describe('dashboard filters card view', () => { - beforeEach(() => { - cy.login(); +describe('Dashboards filters', () => { + before(() => { cy.visit(DASHBOARD_LIST); - cy.get('[aria-label="card-view"]').click(); - }); - - it('should filter by owners correctly', () => { - // filter by owners - cy.get('[data-test="filters-select"]').first().click(); - cy.get('.rc-virtual-list').contains('alpha user').click(); - cy.get('[data-test="styled-card"]').should('not.exist'); - cy.get('[data-test="filters-select"]').first().click(); - cy.get('.rc-virtual-list').contains('gamma user').click(); - cy.get('[data-test="styled-card"]').should('not.exist'); - }); - - it('should filter by created by correctly', () => { - // filter by created by - cy.get('[data-test="filters-select"]').eq(1).click(); - cy.get('.rc-virtual-list').contains('alpha user').click(); - cy.get('.ant-card').should('not.exist'); - cy.get('[data-test="filters-select"]').eq(1).click(); - cy.get('.rc-virtual-list').contains('gamma user').click(); - cy.get('.ant-card').should('not.exist'); + setGridMode('card'); }); - it('should filter by published correctly', () => { - // filter by published - cy.get('[data-test="filters-select"]').eq(2).click(); - cy.get('.rc-virtual-list').contains('Published').click({ timeout: 5000 }); - cy.get('[data-test="styled-card"]').should('have.length', 3); - cy.get('[data-test="styled-card"]') - .contains('USA Births Names') - .should('be.visible'); - cy.get('[data-test="filters-select"]').eq(1).click(); - cy.get('[data-test="filters-select"]').eq(1).type('unpub{enter}'); - cy.get('[data-test="styled-card"]').should('have.length', 3); - }); -}); - -describe('dashboard filters list view', () => { beforeEach(() => { - cy.login(); - cy.visit(DASHBOARD_LIST); - cy.get('[aria-label="list-view"]').click(); + clearAllInputs(); }); - it('should filter by owners correctly', () => { - // filter by owners - cy.get('[data-test="filters-select"]').first().click(); - cy.get('.rc-virtual-list').contains('alpha user').click(); - cy.get('[data-test="table-row"]').should('not.exist'); - cy.get('[data-test="filters-select"]').first().click(); - cy.get('.rc-virtual-list').contains('gamma user').click(); - cy.get('[data-test="table-row"]').should('not.exist'); + it('should allow filtering by "Owner" correctly', () => { + setFilter('Owner', 'alpha user'); + setFilter('Owner', 'admin user'); }); - it('should filter by created by correctly', () => { - // filter by created by - cy.get('[data-test="filters-select"]').eq(1).click(); - cy.get('.rc-virtual-list').contains('alpha user').click(); - cy.get('[data-test="table-row"]').should('not.exist'); - cy.get('[data-test="filters-select"]').eq(1).click(); - cy.get('.rc-virtual-list').contains('gamma user').click(); - cy.get('[data-test="table-row"]').should('not.exist'); + it('should allow filtering by "Created by" correctly', () => { + setFilter('Created by', 'alpha user'); + setFilter('Created by', 'admin user'); }); - it('should filter by published correctly', () => { - // filter by published - cy.get('[data-test="filters-select"]').eq(2).click(); - cy.get('.rc-virtual-list').contains('Published').click(); - cy.get('[data-test="table-row"]').should('have.length', 3); - cy.get('[data-test="table-row"]') - .contains('USA Births Names') - .should('be.visible'); - cy.get('[data-test="filters-select"]').eq(2).click(); - cy.get('[data-test="filters-select"]').eq(2).type('unpub{enter}'); - cy.get('[data-test="table-row"]').should('have.length', 3); + it('should allow filtering by "Status" correctly', () => { + setFilter('Status', 'Published'); + setFilter('Status', 'Draft'); }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard_list/list.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard_list/list.test.ts new file mode 100644 index 000000000000..9bc6eed22457 --- /dev/null +++ b/superset-frontend/cypress-base/cypress/integration/dashboard_list/list.test.ts @@ -0,0 +1,244 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { DASHBOARD_LIST } from 'cypress/utils/urls'; +import { setGridMode, toggleBulkSelect } from 'cypress/utils'; +import { + setFilter, + interceptBulkDelete, + interceptUpdate, + interceptDelete, + interceptFav, + interceptUnfav, +} from '../dashboard/utils'; + +function orderAlphabetical() { + setFilter('Sort', 'Alphabetical'); +} + +function openProperties() { + cy.get('[aria-label="more-vert"]').first().click(); + cy.getBySel('dashboard-card-option-edit-button').click(); +} + +function openMenu() { + cy.get('[aria-label="more-vert"]').first().click(); +} + +function confirmDelete() { + cy.getBySel('delete-modal-input').type('DELETE'); + cy.getBySel('modal-confirm-button').click(); +} + +describe('Dashboards list', () => { + describe('list mode', () => { + before(() => { + cy.visit(DASHBOARD_LIST); + setGridMode('list'); + }); + + it('should load rows in list mode', () => { + cy.getBySel('listview-table').should('be.visible'); + cy.getBySel('sort-header').eq(1).contains('Title'); + cy.getBySel('sort-header').eq(2).contains('Modified by'); + cy.getBySel('sort-header').eq(3).contains('Status'); + cy.getBySel('sort-header').eq(4).contains('Modified'); + cy.getBySel('sort-header').eq(5).contains('Created by'); + cy.getBySel('sort-header').eq(6).contains('Owners'); + cy.getBySel('sort-header').eq(7).contains('Actions'); + }); + + it('should sort correctly in list mode', () => { + cy.getBySel('sort-header').eq(1).click(); + cy.getBySel('table-row').first().contains('Supported Charts Dashboard'); + cy.getBySel('sort-header').eq(1).click(); + cy.getBySel('table-row').first().contains("World Bank's Data"); + cy.getBySel('sort-header').eq(1).click(); + }); + + it('should bulk select in list mode', () => { + toggleBulkSelect(); + cy.get('#header-toggle-all').click(); + cy.get('[aria-label="checkbox-on"]').should('have.length', 6); + cy.getBySel('bulk-select-copy').contains('5 Selected'); + cy.getBySel('bulk-select-action') + .should('have.length', 2) + .then($btns => { + expect($btns).to.contain('Delete'); + expect($btns).to.contain('Export'); + }); + cy.getBySel('bulk-select-deselect-all').click(); + cy.get('[aria-label="checkbox-on"]').should('have.length', 0); + cy.getBySel('bulk-select-copy').contains('0 Selected'); + cy.getBySel('bulk-select-action').should('not.exist'); + }); + }); + + describe('card mode', () => { + before(() => { + cy.visit(DASHBOARD_LIST); + setGridMode('card'); + }); + + it('should load rows in card mode', () => { + cy.getBySel('listview-table').should('not.exist'); + cy.getBySel('styled-card').should('have.length', 5); + }); + + it('should bulk select in card mode', () => { + toggleBulkSelect(); + cy.getBySel('styled-card').click({ multiple: true }); + cy.getBySel('bulk-select-copy').contains('5 Selected'); + cy.getBySel('bulk-select-action') + .should('have.length', 2) + .then($btns => { + expect($btns).to.contain('Delete'); + expect($btns).to.contain('Export'); + }); + cy.getBySel('bulk-select-deselect-all').click(); + cy.getBySel('bulk-select-copy').contains('0 Selected'); + cy.getBySel('bulk-select-action').should('not.exist'); + }); + + it('should sort in card mode', () => { + orderAlphabetical(); + cy.getBySel('styled-card').first().contains('Supported Charts Dashboard'); + }); + }); + + describe('common actions', () => { + beforeEach(() => { + cy.createSampleDashboards([0, 1, 2, 3]); + cy.visit(DASHBOARD_LIST); + }); + + it('should allow to favorite/unfavorite dashboard', () => { + interceptFav(); + interceptUnfav(); + + setGridMode('card'); + orderAlphabetical(); + + cy.getBySel('styled-card').first().contains('1 - Sample dashboard'); + cy.getBySel('styled-card') + .first() + .find("[aria-label='favorite-unselected']") + .click(); + cy.wait('@select'); + cy.getBySel('styled-card') + .first() + .find("[aria-label='favorite-selected']") + .click(); + cy.wait('@unselect'); + cy.getBySel('styled-card') + .first() + .find("[aria-label='favorite-selected']") + .should('not.exist'); + }); + + it('should bulk delete correctly', () => { + interceptBulkDelete(); + toggleBulkSelect(); + + // bulk deletes in card-view + setGridMode('card'); + orderAlphabetical(); + + cy.getBySel('styled-card').eq(0).contains('1 - Sample dashboard').click(); + cy.getBySel('styled-card').eq(1).contains('2 - Sample dashboard').click(); + cy.getBySel('bulk-select-action').eq(0).contains('Delete').click(); + confirmDelete(); + cy.wait('@bulkDelete'); + cy.getBySel('styled-card') + .eq(0) + .should('not.contain', '1 - Sample dashboard'); + cy.getBySel('styled-card') + .eq(1) + .should('not.contain', '2 - Sample dashboard'); + + // bulk deletes in list-view + setGridMode('list'); + cy.getBySel('table-row').eq(0).contains('3 - Sample dashboard'); + cy.getBySel('table-row').eq(1).contains('4 - Sample dashboard'); + cy.get('[data-test="table-row"] input[type="checkbox"]').eq(0).click(); + cy.get('[data-test="table-row"] input[type="checkbox"]').eq(1).click(); + cy.getBySel('bulk-select-action').eq(0).contains('Delete').click(); + confirmDelete(); + cy.wait('@bulkDelete'); + cy.getBySel('table-row') + .eq(0) + .should('not.contain', '3 - Sample dashboard'); + cy.getBySel('table-row') + .eq(1) + .should('not.contain', '4 - Sample dashboard'); + }); + + it('should delete correctly', () => { + interceptDelete(); + + // deletes in card-view + setGridMode('card'); + orderAlphabetical(); + + cy.getBySel('styled-card').eq(0).contains('1 - Sample dashboard'); + openMenu(); + cy.getBySel('dashboard-card-option-delete-button').click(); + confirmDelete(); + cy.wait('@delete'); + cy.getBySel('styled-card') + .eq(0) + .should('not.contain', '1 - Sample dashboard'); + + // deletes in list-view + setGridMode('list'); + cy.getBySel('table-row').eq(0).contains('2 - Sample dashboard'); + cy.getBySel('dashboard-list-trash-icon').eq(0).click(); + confirmDelete(); + cy.wait('@delete'); + cy.getBySel('table-row') + .eq(0) + .should('not.contain', '2 - Sample dashboard'); + }); + + it('should edit correctly', () => { + interceptUpdate(); + + // edits in card-view + setGridMode('card'); + orderAlphabetical(); + cy.getBySel('styled-card').eq(0).contains('1 - Sample dashboard'); + + // change title + openProperties(); + cy.getBySel('dashboard-title-input').type(' | EDITED'); + cy.get('button:contains("Save")').click(); + cy.wait('@update'); + cy.getBySel('styled-card') + .eq(0) + .contains('1 - Sample dashboard | EDITED'); + + // edits in list-view + setGridMode('list'); + cy.getBySel('edit-alt').eq(0).click(); + cy.getBySel('dashboard-title-input').clear().type('1 - Sample dashboard'); + cy.get('button:contains("Save")').click(); + cy.wait('@update'); + cy.getBySel('table-row').eq(0).contains('1 - Sample dashboard'); + }); + }); +}); diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard_list/list_view.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard_list/list_view.test.ts deleted file mode 100644 index a758552481f9..000000000000 --- a/superset-frontend/cypress-base/cypress/integration/dashboard_list/list_view.test.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { DASHBOARD_LIST } from './dashboard_list.helper'; - -describe('dashboard list view', () => { - beforeEach(() => { - cy.login(); - cy.visit(DASHBOARD_LIST); - cy.get('[aria-label="list-view"]').click(); - }); - - xit('should load rows', () => { - cy.get('[data-test="listview-table"]').should('be.visible'); - // check dashboard list view header - cy.get('[data-test="sort-header"]').eq(1).contains('Title'); - cy.get('[data-test="sort-header"]').eq(2).contains('Modified by'); - cy.get('[data-test="sort-header"]').eq(3).contains('Status'); - cy.get('[data-test="sort-header"]').eq(4).contains('Modified'); - cy.get('[data-test="sort-header"]').eq(5).contains('Created by'); - cy.get('[data-test="sort-header"]').eq(6).contains('Owners'); - cy.get('[data-test="sort-header"]').eq(7).contains('Actions'); - cy.get('[data-test="table-row"]').should('have.length', 4); // failed, xit-ed - }); - - xit('should sort correctly', () => { - cy.get('[data-test="sort-header"]').eq(1).click(); - cy.get('[data-test="sort-header"]').eq(1).click(); - cy.get('[data-test="table-row"]') - .first() - .find('[data-test="table-row-cell"]') - .find('[data-test="cell-text"]') - .contains("World Bank's Data"); - }); - - it('should bulk delete correctly', () => { - cy.get('[data-test="listview-table"]').should('be.visible'); - cy.get('[data-test="bulk-select"]').eq(0).click(); - cy.get('[aria-label="checkbox-off"]').eq(1).siblings('input').click(); - cy.get('[aria-label="checkbox-off"]').eq(2).siblings('input').click(); - cy.get('[data-test="bulk-select-action"]').eq(0).click(); - cy.get('[data-test="delete-modal-input"]').eq(0).type('DELETE'); - cy.get('[data-test="modal-confirm-button"]').eq(0).click(); - cy.get('[aria-label="checkbox-on"]').should('not.exist'); - }); -}); diff --git a/superset-frontend/cypress-base/cypress/integration/database/modal.test.ts b/superset-frontend/cypress-base/cypress/integration/database/modal.test.ts index 225502167656..a3260250aa47 100644 --- a/superset-frontend/cypress-base/cypress/integration/database/modal.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/database/modal.test.ts @@ -16,14 +16,24 @@ * specific language governing permissions and limitations * under the License. */ -import { DATABASE_LIST } from './helper'; +import { DATABASE_LIST } from 'cypress/utils/urls'; + +function closeModal() { + cy.get('body').then($body => { + if ($body.find('[data-test="database-modal"]').length) { + cy.get('[aria-label="Close"]').eq(1).click(); + } + }); +} describe('Add database', () => { - beforeEach(() => { - cy.login(); + before(() => { cy.visit(DATABASE_LIST); - cy.wait(3000); - cy.get('[data-test="btn-create-database"]').click(); + }); + + beforeEach(() => { + closeModal(); + cy.getBySel('btn-create-database').click(); }); it('should open dynamic form', () => { @@ -42,11 +52,11 @@ describe('Add database', () => { // click postgres dynamic form cy.get('.preferred > :nth-child(1)').click(); - cy.get('[data-test="sqla-connect-btn"]').click(); + cy.getBySel('sqla-connect-btn').click(); // check if the sqlalchemy form is showing up - cy.get('[data-test=database-name-input]').should('be.visible'); - cy.get('[data-test="sqlalchemy-uri-input"]').should('be.visible'); + cy.getBySel('database-name-input').should('be.visible'); + cy.getBySel('sqlalchemy-uri-input').should('be.visible'); }); it('show error alerts on dynamic form for bad host', () => { diff --git a/superset-frontend/cypress-base/cypress/integration/dataset/dataset_list.test.ts b/superset-frontend/cypress-base/cypress/integration/dataset/dataset_list.test.ts new file mode 100644 index 000000000000..e78c328ec510 --- /dev/null +++ b/superset-frontend/cypress-base/cypress/integration/dataset/dataset_list.test.ts @@ -0,0 +1,42 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { DATASET_LIST_PATH } from 'cypress/utils/urls'; + +describe('Dataset list', () => { + before(() => { + cy.visit(DATASET_LIST_PATH); + }); + + it('should open Explore on dataset name click', () => { + cy.intercept('**/api/v1/explore/**').as('explore'); + cy.get('[data-test="listview-table"] [data-test="internal-link"]') + .contains('birth_names') + .click(); + cy.wait('@explore'); + cy.get('[data-test="datasource-control"] .title-select').contains( + 'birth_names', + ); + cy.get('.metric-option-label').first().contains('COUNT(*)'); + cy.get('.column-option-label').first().contains('ds'); + cy.get('[data-test="fast-viz-switcher"] > div:not([role="button"]') + .contains('Table') + .should('be.visible'); + }); +}); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/AdhocMetrics.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/AdhocMetrics.test.ts index deb829a092dc..e97ac74c3f2a 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/AdhocMetrics.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/explore/AdhocMetrics.test.ts @@ -18,7 +18,6 @@ */ describe('AdhocMetrics', () => { beforeEach(() => { - cy.login(); cy.intercept('POST', '/superset/explore_json/**').as('postJson'); cy.intercept('GET', '/superset/explore_json/**').as('getJson'); cy.visitChartByName('Num Births Trend'); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/AdhocFilters.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/_skip.AdhocFilters.test.ts similarity index 92% rename from superset-frontend/cypress-base/cypress/integration/explore/AdhocFilters.test.ts rename to superset-frontend/cypress-base/cypress/integration/explore/_skip.AdhocFilters.test.ts index 6ae5aead2b0c..a4e9c8fe4688 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/AdhocFilters.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/explore/_skip.AdhocFilters.test.ts @@ -16,10 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -describe('AdhocFilters', () => { +describe.skip('AdhocFilters', () => { beforeEach(() => { - cy.login(); - cy.intercept('GET', '/superset/filter/table/*/name').as('filterValues'); + cy.intercept('GET', '/api/v1/datasource/table/*/column/name/values').as( + 'filterValues', + ); cy.intercept('POST', '/superset/explore_json/**').as('postJson'); cy.intercept('GET', '/superset/explore_json/**').as('getJson'); cy.visitChartByName('Boys'); // a table chart @@ -28,7 +29,7 @@ describe('AdhocFilters', () => { let numScripts = 0; - xit('Should load AceEditor scripts when needed', () => { + it('Should load AceEditor scripts when needed', () => { cy.get('script').then(nodes => { numScripts = nodes.length; }); @@ -51,7 +52,7 @@ describe('AdhocFilters', () => { }); }); - xit('Set simple adhoc filter', () => { + it('Set simple adhoc filter', () => { cy.get('[aria-label="Comparator option"] .Select__control').click(); cy.get('[data-test=adhoc-filter-simple-value] input[type=text]') .focus() @@ -70,7 +71,7 @@ describe('AdhocFilters', () => { }); }); - xit('Set custom adhoc filter', () => { + it('Set custom adhoc filter', () => { const filterType = 'name'; const filterContent = "'Amy' OR name = 'Donald'"; diff --git a/superset-frontend/cypress-base/cypress/integration/explore/advanced_analytics.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/advanced_analytics.test.ts index 51fd2ce46bb3..fd207a64e312 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/advanced_analytics.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/explore/advanced_analytics.test.ts @@ -18,18 +18,19 @@ */ describe('Advanced analytics', () => { beforeEach(() => { - cy.login(); cy.intercept('POST', '/superset/explore_json/**').as('postJson'); cy.intercept('GET', '/superset/explore_json/**').as('getJson'); cy.intercept('PUT', '/api/v1/explore/**').as('putExplore'); - cy.intercept('GET', '/superset/explore/**').as('getExplore'); + cy.intercept('GET', '/explore/**').as('getExplore'); }); it('Create custom time compare', () => { cy.visitChartByName('Num Births Trend'); cy.verifySliceSuccess({ waitAlias: '@postJson' }); - cy.get('.ant-collapse-header').contains('Advanced Analytics').click(); + cy.get('.ant-collapse-header') + .contains('Advanced Analytics') + .click({ force: true }); cy.get('[data-test=time_compare]').find('.ant-select').click(); cy.get('[data-test=time_compare]') @@ -43,13 +44,16 @@ describe('Advanced analytics', () => { cy.get('button[data-test="run-query-button"]').click(); cy.wait('@postJson'); cy.wait('@putExplore'); + cy.reload(); cy.verifySliceSuccess({ waitAlias: '@postJson', chartSelector: 'svg', }); cy.wait('@getExplore'); - cy.get('.ant-collapse-header').contains('Advanced Analytics').click(); + cy.get('.ant-collapse-header') + .contains('Advanced Analytics') + .click({ force: true }); cy.get('[data-test=time_compare]') .find('.ant-select-selector') .contains('28 days'); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/annotations.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/annotations.test.ts index 448a676f6730..a10295af964f 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/annotations.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/explore/annotations.test.ts @@ -18,7 +18,6 @@ */ describe('Annotations', () => { beforeEach(() => { - cy.login(); cy.intercept('POST', '/superset/explore_json/**').as('postJson'); cy.intercept('GET', '/superset/explore_json/**').as('getJson'); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/chart.test.js b/superset-frontend/cypress-base/cypress/integration/explore/chart.test.js index c9f4a1c9f58b..cade5fab24ad 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/chart.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/chart.test.js @@ -16,11 +16,114 @@ * specific language governing permissions and limitations * under the License. */ +import { CHART_LIST } from 'cypress/utils/urls'; +import { interceptGet as interceptDashboardGet } from 'cypress/integration/dashboard/utils'; import { FORM_DATA_DEFAULTS, NUM_METRIC } from './visualizations/shared.helper'; +import { + interceptFiltering, + saveChartToDashboard, + visitSampleChartFromList, +} from './utils'; + +// SEARCH_THRESHOLD is 10. We need to add at least 11 dashboards to show search +const SAMPLE_DASHBOARDS_INDEXES = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + +function openDashboardsAddedTo() { + cy.getBySel('actions-trigger').click(); + cy.get('.ant-dropdown-menu-submenu-title') + .contains('Dashboards added to') + .trigger('mouseover'); +} + +function closeDashboardsAddedTo() { + cy.get('.ant-dropdown-menu-submenu-title') + .contains('Dashboards added to') + .trigger('mouseout'); + cy.getBySel('actions-trigger').click(); +} + +function verifyDashboardsSubmenuItem(dashboardName) { + cy.get('.ant-dropdown-menu-submenu-popup').contains(dashboardName); + closeDashboardsAddedTo(); +} + +function verifyDashboardSearch() { + openDashboardsAddedTo(); + cy.get('.ant-dropdown-menu-submenu-popup').trigger('mouseover'); + cy.get('.ant-dropdown-menu-submenu-popup') + .find('input[placeholder="Search"]') + .type('1'); + cy.get('.ant-dropdown-menu-submenu-popup').contains('1 - Sample dashboard'); + cy.get('.ant-dropdown-menu-submenu-popup') + .find('input[placeholder="Search"]') + .type('Blahblah'); + cy.get('.ant-dropdown-menu-submenu-popup').contains('No results found'); + cy.get('.ant-dropdown-menu-submenu-popup') + .find('[aria-label="close-circle"]') + .click(); + closeDashboardsAddedTo(); +} + +function verifyDashboardLink() { + interceptDashboardGet(); + openDashboardsAddedTo(); + cy.get('.ant-dropdown-menu-submenu-popup').trigger('mouseover'); + cy.get('.ant-dropdown-menu-submenu-popup a') + .first() + .invoke('removeAttr', 'target') + .click(); + cy.wait('@get'); +} + +function verifyMetabar(text) { + cy.getBySel('metadata-bar').contains(text); +} + +function saveAndVerifyDashboard(number) { + saveChartToDashboard(`${number} - Sample dashboard`); + verifyMetabar( + number > 1 ? `Added to ${number} dashboards` : 'Added to 1 dashboard', + ); + openDashboardsAddedTo(); + verifyDashboardsSubmenuItem(`${number} - Sample dashboard`); +} + +describe('Cross-referenced dashboards', () => { + beforeEach(() => { + interceptFiltering(); + + cy.createSampleDashboards(SAMPLE_DASHBOARDS_INDEXES); + cy.createSampleCharts([0]); + cy.visit(CHART_LIST); + cy.wait('@filtering'); + }); + + it('should show the cross-referenced dashboards', () => { + visitSampleChartFromList('1 - Sample chart'); + + cy.getBySel('metadata-bar').contains('Not added to any dashboard'); + openDashboardsAddedTo(); + verifyDashboardsSubmenuItem('None'); + + saveAndVerifyDashboard('1'); + saveAndVerifyDashboard('2'); + saveAndVerifyDashboard('3'); + saveAndVerifyDashboard('4'); + saveAndVerifyDashboard('5'); + saveAndVerifyDashboard('6'); + saveAndVerifyDashboard('7'); + saveAndVerifyDashboard('8'); + saveAndVerifyDashboard('9'); + saveAndVerifyDashboard('10'); + saveAndVerifyDashboard('11'); + + verifyDashboardSearch(); + verifyDashboardLink(); + }); +}); describe('No Results', () => { beforeEach(() => { - cy.login(); cy.intercept('POST', '/superset/explore_json/**').as('getJson'); }); @@ -41,7 +144,7 @@ describe('No Results', () => { ], }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.wait('@getJson').its('response.statusCode').should('eq', 200); cy.get('div.chart-container').contains( 'No results were returned for this query', diff --git a/superset-frontend/cypress-base/cypress/integration/explore/control.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/control.test.ts index cd15af566f2d..9fa966d9bb67 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/control.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/explore/control.test.ts @@ -25,49 +25,46 @@ import { FORM_DATA_DEFAULTS, NUM_METRIC } from './visualizations/shared.helper'; describe('Datasource control', () => { const newMetricName = `abc${Date.now()}`; - // TODO: uncomment when adding metrics from dataset is fixed - xit('should allow edit dataset', () => { - let numScripts = 0; - - cy.login(); - interceptChart({ legacy: false }).as('chartData'); + it('should allow edit dataset', () => { + interceptChart({ legacy: true }).as('chartData'); cy.visitChartByName('Num Births Trend'); cy.verifySliceSuccess({ waitAlias: '@chartData' }); - cy.get('[data-test="open-datasource-tab').click({ force: true }); cy.get('[data-test="datasource-menu-trigger"]').click(); - cy.get('script').then(nodes => { - numScripts = nodes.length; - }); - cy.get('[data-test="edit-dataset"]').click(); - // should load additional scripts for the modal - cy.get('script').then(nodes => { - expect(nodes.length).to.greaterThan(numScripts); - }); cy.get('[data-test="edit-dataset-tabs"]').within(() => { cy.contains('Metrics').click(); }); // create new metric cy.get('[data-test="crud-add-table-item"]', { timeout: 10000 }).click(); - cy.get('[data-test="table-content-rows"]') - .find('input[value="<new metric>"]') + cy.wait(1000); + cy.get( + '[data-test="table-content-rows"] [data-test="editable-title-input"]', + ) + .first() .click(); - cy.get('[data-test="table-content-rows"]') - .find('input[value="<new metric>"]') + + cy.get( + '[data-test="table-content-rows"] [data-test="editable-title-input"]', + ) + .first() .focus() .clear() .type(`${newMetricName}{enter}`); + cy.get('[data-test="datasource-modal-save"]').click(); cy.get('.ant-modal-confirm-btns button').contains('OK').click(); // select new metric cy.get('[data-test=metrics]') - .find('.Select__control input') - .focus() - .type(newMetricName, { force: true }); + .contains('Drop columns/metrics here or click') + .click(); + + cy.get('input[aria-label="Select saved metrics"]').type( + `${newMetricName}{enter}`, + ); // delete metric cy.get('[data-test="datasource-menu-trigger"]').click(); cy.get('[data-test="edit-dataset"]').click(); @@ -78,19 +75,46 @@ describe('Datasource control', () => { }); cy.get(`input[value="${newMetricName}"]`) .closest('tr') - .find('.fa-trash') + .find('[data-test="crud-delete-icon"]') .click(); cy.get('[data-test="datasource-modal-save"]').click(); cy.get('.ant-modal-confirm-btns button').contains('OK').click(); - cy.get('.Select__multi-value__label') - .contains(newMetricName) - .should('not.exist'); + cy.get('[data-test="metrics"]').contains(newMetricName).should('not.exist'); }); }); +describe('Color scheme control', () => { + beforeEach(() => { + interceptChart({ legacy: true }).as('chartData'); + + cy.visitChartByName('Num Births Trend'); + cy.verifySliceSuccess({ waitAlias: '@chartData' }); + }); + + it('should show color options with and without tooltips', () => { + cy.get('#controlSections-tab-display').click(); + cy.get('.ant-select-selection-item .color-scheme-label').contains( + 'Superset Colors', + ); + cy.get('.ant-select-selection-item .color-scheme-label').trigger( + 'mouseover', + ); + cy.get('.color-scheme-tooltip').contains('Superset Colors'); + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('lyftColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="lyftColors"]', + ).should('exist'); + cy.get('.ant-select-selection-item .color-scheme-label').trigger( + 'mouseover', + ); + cy.get('.color-scheme-tooltip').should('not.exist'); + }); +}); describe('VizType control', () => { beforeEach(() => { - cy.login(); interceptChart({ legacy: false }).as('tableChartData'); interceptChart({ legacy: true }).as('lineChartData'); }); @@ -117,7 +141,6 @@ describe('VizType control', () => { describe('Test datatable', () => { beforeEach(() => { - cy.login(); interceptChart({ legacy: false }).as('tableChartData'); interceptChart({ legacy: true }).as('lineChartData'); cy.visitChartByName('Daily Totals'); @@ -128,15 +151,22 @@ describe('Test datatable', () => { cy.get('.ant-empty-description').should('not.exist'); }); it('Datapane loads view samples', () => { - cy.contains('Samples').click(); - cy.get('[data-test="row-count-label"]').contains('1k rows'); - cy.get('.ant-empty-description').should('not.exist'); + cy.intercept( + 'datasource/samples?force=false&datasource_type=table&datasource_id=*', + ).as('Samples'); + cy.contains('Samples') + .click() + .then(() => { + cy.wait('@Samples'); + cy.get('.ant-tabs-tab-active').contains('Samples'); + cy.get('[data-test="row-count-label"]').contains('1k rows'); + cy.get('.ant-empty-description').should('not.exist'); + }); }); }); describe('Time range filter', () => { beforeEach(() => { - cy.login(); interceptChart({ legacy: true }).as('chartData'); }); @@ -148,7 +178,7 @@ describe('Time range filter', () => { metrics: [NUM_METRIC], }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@chartData' }); cy.get('[data-test=time-range-trigger]') @@ -160,7 +190,8 @@ describe('Time range filter', () => { cy.get('input[value="now"]'); }); cy.get('[data-test=cancel-button]').click(); - cy.get('.ant-popover').should('not.be.visible'); + cy.wait(500); + cy.get('.ant-popover').should('not.exist'); }); }); @@ -172,7 +203,7 @@ describe('Time range filter', () => { time_range: 'Last year', }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@chartData' }); cy.get('[data-test=time-range-trigger]') @@ -192,7 +223,7 @@ describe('Time range filter', () => { time_range: 'previous calendar month', }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@chartData' }); cy.get('[data-test=time-range-trigger]') @@ -212,7 +243,7 @@ describe('Time range filter', () => { time_range: 'DATEADD(DATETIME("today"), -7, day) : today', }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@chartData' }); cy.get('[data-test=time-range-trigger]') @@ -235,7 +266,7 @@ describe('Time range filter', () => { time_range: 'No filter', }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@chartData' }); cy.get('[data-test=time-range-trigger]') @@ -249,7 +280,6 @@ describe('Time range filter', () => { describe('Groupby control', () => { it('Set groupby', () => { - cy.login(); interceptChart({ legacy: true }).as('chartData'); cy.visitChartByName('Num Births Trend'); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/explore.applitools.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/explore.applitools.test.ts index 96b0d6684768..4e951c2560e1 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/explore.applitools.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/explore/explore.applitools.test.ts @@ -20,7 +20,6 @@ import { FORM_DATA_DEFAULTS, NUM_METRIC } from './visualizations/shared.helper'; describe('explore view', () => { beforeEach(() => { - cy.login(); cy.intercept('POST', '/superset/explore_json/**').as('getJson'); }); @@ -31,7 +30,7 @@ describe('explore view', () => { it('should load Explore', () => { const LINE_CHART_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'line' }; const formData = { ...LINE_CHART_DEFAULTS, metrics: [NUM_METRIC] }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); cy.eyesOpen({ testName: 'Explore page', diff --git a/superset-frontend/cypress-base/cypress/integration/explore/filter_box.test.js b/superset-frontend/cypress-base/cypress/integration/explore/filter_box.test.js index 921377c45fa4..a4ca5ddcf2ef 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/filter_box.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/filter_box.test.js @@ -22,12 +22,11 @@ describe('Edit FilterBox Chart', () => { const VIZ_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'filter_box' }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson' }); } beforeEach(() => { - cy.login(); cy.intercept('POST', '/superset/explore_json/**').as('getJson'); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/link.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/link.test.ts index 9f07e9c10b85..1e13c7d7ed3f 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/link.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/explore/link.test.ts @@ -30,7 +30,6 @@ const apiURL = (endpoint: string, queryObject: Record<string, unknown>) => describe('Test explore links', () => { beforeEach(() => { - cy.login(); interceptChart({ legacy: true }).as('chartData'); }); @@ -74,7 +73,7 @@ describe('Test explore links', () => { }; const newChartName = `Test chart [${shortid.generate()}]`; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@tableChartData' }); cy.url().then(() => { cy.get('[data-test="query-save-button"]').click(); @@ -101,8 +100,8 @@ describe('Test explore links', () => { cy.request(apiURL('/api/v1/chart/', query)).then(response => { expect(response.body.count).equals(1); - cy.request('DELETE', `/api/v1/chart/${response.body.ids[0]}`); }); + cy.deleteChartByName(newChartName, true); }); }); @@ -183,5 +182,6 @@ describe('Test explore links', () => { cy.request(apiURL('/api/v1/dashboard/', query)).then(response => { expect(response.body.count).equals(1); }); + cy.deleteDashboardByName(dashboardTitle, true); }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/utils.ts b/superset-frontend/cypress-base/cypress/integration/explore/utils.ts new file mode 100644 index 000000000000..15e7dcba1b6f --- /dev/null +++ b/superset-frontend/cypress-base/cypress/integration/explore/utils.ts @@ -0,0 +1,91 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + interceptGet as interceptDashboardGet, + interceptDashboardasync, +} from '../dashboard/utils'; + +export function interceptFiltering() { + cy.intercept('GET', `/api/v1/chart/?q=*`).as('filtering'); +} + +export function interceptBulkDelete() { + cy.intercept('DELETE', `/api/v1/chart/?q=*`).as('bulkDelete'); +} + +export function interceptDelete() { + cy.intercept('DELETE', `/api/v1/chart/*`).as('delete'); +} + +export function interceptUpdate() { + cy.intercept('PUT', `/api/v1/chart/*`).as('update'); +} + +export function interceptPost() { + cy.intercept('POST', `/api/v1/chart/`).as('post'); +} + +export function interceptExploreJson() { + cy.intercept('POST', `/superset/explore_json/**`).as('getJson'); +} + +export function interceptExploreGet() { + cy.intercept('GET', `/api/v1/explore/?slice_id=**`).as('getExplore'); +} + +export function setFilter(filter: string, option: string) { + interceptFiltering(); + + cy.get(`[aria-label="${filter}"]`).first().click(); + cy.get(`[aria-label="${filter}"] [title="${option}"]`).click(); + + cy.wait('@filtering'); +} + +export function saveChartToDashboard(dashboardName: string) { + interceptDashboardGet(); + interceptDashboardasync(); + interceptUpdate(); + interceptExploreGet(); + + cy.getBySel('query-save-button').click(); + cy.wait('@getDashboardasync'); + cy.getBySelLike('chart-modal').should('be.visible'); + cy.get( + '[data-test="save-chart-modal-select-dashboard-form"] [aria-label="Select a dashboard"]', + ) + .first() + .click(); + cy.get( + '.ant-select-selection-search-input[aria-label="Select a dashboard"]', + ).type(dashboardName.slice(0, 3)); + cy.get(`.ant-select-item-option[title="${dashboardName}"]`).click(); + cy.getBySel('btn-modal-save').click(); + + cy.wait('@update'); + cy.wait('@get'); + cy.wait('@getExplore'); + cy.contains(`was added to dashboard [${dashboardName}]`); +} + +export function visitSampleChartFromList(chartName: string) { + cy.getBySel('table-row').contains(chartName).click(); + cy.intercept('POST', '/superset/explore_json/**').as('getJson'); +} diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/area.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/area.test.js index 86b5a789c247..c95127dd1ebd 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/area.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/area.test.js @@ -17,6 +17,10 @@ * under the License. */ describe('Visualization > Area', () => { + beforeEach(() => { + cy.intercept('POST', '/superset/explore_json/**').as('getJson'); + }); + const AREA_FORM_DATA = { datasource: '2__table', viz_type: 'area', @@ -51,15 +55,10 @@ describe('Visualization > Area', () => { }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/superset/explore_json/**').as('getJson'); - }); - it('should work without groupby', () => { verify(AREA_FORM_DATA); cy.get('.nv-area').should('have.length', 1); @@ -75,23 +74,21 @@ describe('Visualization > Area', () => { }); it('should work with groupby and filter', () => { - cy.visitChartByParams( - JSON.stringify({ - ...AREA_FORM_DATA, - groupby: ['region'], - adhoc_filters: [ - { - expressionType: 'SIMPLE', - subject: 'region', - operator: 'IN', - comparator: ['South Asia', 'North America'], - clause: 'WHERE', - sqlExpression: null, - filterOptionName: 'filter_txje2ikiv6_wxmn0qwd1xo', - }, - ], - }), - ); + cy.visitChartByParams({ + ...AREA_FORM_DATA, + groupby: ['region'], + adhoc_filters: [ + { + expressionType: 'SIMPLE', + subject: 'region', + operator: 'IN', + comparator: ['South Asia', 'North America'], + clause: 'WHERE', + sqlExpression: null, + filterOptionName: 'filter_txje2ikiv6_wxmn0qwd1xo', + }, + ], + }); cy.wait('@getJson').then(async ({ response }) => { const responseBody = response?.body; @@ -105,4 +102,20 @@ describe('Visualization > Area', () => { }); cy.get('.nv-area').should('have.length', 2); }); + + it('should allow type to search color schemes and apply the scheme', () => { + verify(AREA_FORM_DATA); + + cy.get('#controlSections-tab-display').click(); + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('supersetColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]', + ).should('exist'); + cy.get('.area .nv-legend .nv-legend-symbol') + .first() + .should('have.css', 'fill', 'rgb(31, 168, 201)'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/big_number.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/big_number.test.js index 30e7716b730c..2882f6ab4af2 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/big_number.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/big_number.test.js @@ -19,17 +19,21 @@ import { interceptChart } from 'cypress/utils'; describe('Visualization > Big Number with Trendline', () => { + beforeEach(() => { + interceptChart({ legacy: false }).as('chartData'); + }); + const BIG_NUMBER_FORM_DATA = { datasource: '2__table', viz_type: 'big_number', slice_id: 42, granularity_sqla: 'year', time_grain_sqla: 'P1D', - time_range: '2000+:+2014-01-02', + time_range: '2000 : 2014-01-02', metric: 'sum__SP_POP_TOTL', adhoc_filters: [], compare_lag: '10', - compare_suffix: 'over+10Y', + compare_suffix: 'over 10Y', y_axis_format: '.3s', show_trend_line: true, start_y_axis_at_zero: true, @@ -42,18 +46,13 @@ describe('Visualization > Big Number with Trendline', () => { }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@chartData', chartSelector: '.superset-legacy-chart-big-number', }); } - beforeEach(() => { - cy.login(); - interceptChart({ legacy: false }).as('chartData'); - }); - it('should work', () => { verify(BIG_NUMBER_FORM_DATA); cy.get('.chart-container .header-line'); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/big_number_total.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/big_number_total.test.js index e2fcc5a1a1e3..d53436acd031 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/big_number_total.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/big_number_total.test.js @@ -20,16 +20,15 @@ import { interceptChart } from 'cypress/utils'; import { FORM_DATA_DEFAULTS, NUM_METRIC } from './shared.helper'; describe('Visualization > Big Number Total', () => { + beforeEach(() => { + interceptChart({ legacy: false }).as('chartData'); + }); + const BIG_NUMBER_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'big_number_total', }; - beforeEach(() => { - cy.login(); - interceptChart({ legacy: false }).as('chartData'); - }); - it('Test big number chart with adhoc metric', () => { const formData = { ...BIG_NUMBER_DEFAULTS, metric: NUM_METRIC }; diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/box_plot.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/box_plot.test.js index 432815b8692c..323dc5c24e41 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/box_plot.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/box_plot.test.js @@ -17,6 +17,10 @@ * under the License. */ describe('Visualization > Box Plot', () => { + beforeEach(() => { + cy.intercept('POST', '/api/v1/chart/data*').as('getJson'); + }); + const BOX_PLOT_FORM_DATA = { datasource: '2__table', viz_type: 'box_plot', @@ -33,17 +37,25 @@ describe('Visualization > Box Plot', () => { }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/api/v1/chart/data*').as('getJson'); - }); - it('should work', () => { verify(BOX_PLOT_FORM_DATA); cy.get('.chart-container .box_plot canvas').should('have.length', 1); }); + + it('should allow type to search color schemes', () => { + verify(BOX_PLOT_FORM_DATA); + + cy.get('#controlSections-tab-display').click(); + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('supersetColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]', + ).should('exist'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/bubble.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/bubble.test.js index 9bd91f37c5ee..f3a0dcd2d4ee 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/bubble.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/bubble.test.js @@ -17,13 +17,17 @@ * under the License. */ describe('Visualization > Bubble', () => { + beforeEach(() => { + cy.intercept('POST', '/superset/explore_json/**').as('getJson'); + }); + const BUBBLE_FORM_DATA = { datasource: '2__table', viz_type: 'bubble', slice_id: 46, granularity_sqla: 'year', time_grain_sqla: 'P1D', - time_range: '2011-01-01+:+2011-01-02', + time_range: '2011-01-01 : 2011-01-02', series: 'region', entity: 'country_name', x: 'sum__SP_RUR_TOTL_ZS', @@ -47,37 +51,10 @@ describe('Visualization > Bubble', () => { }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/superset/explore_json/**').as('getJson'); - }); - - // Number of circles are pretty unstable when there are a lot of circles - // Since main functionality is already covered in filter test below, - // skip this test until we find a solution. - it.skip('should work', () => { - cy.visitChartByParams(JSON.stringify(BUBBLE_FORM_DATA)).then(() => { - cy.wait('@getJson').then(xhr => { - let expectedBubblesNumber = 0; - xhr.responseBody.data.forEach(element => { - expectedBubblesNumber += element.values.length; - }); - cy.get('[data-test="chart-container"]') - .should('be.visible', { timeout: 15000 }) - .within(() => { - cy.get('svg') - .should('exist') - .find('.nv-point-clips circle') - .should('have.length', expectedBubblesNumber); - }); - }); - }); - }); - it('should work with filter', () => { verify({ ...BUBBLE_FORM_DATA, @@ -86,7 +63,7 @@ describe('Visualization > Bubble', () => { expressionType: 'SIMPLE', subject: 'region', operator: '==', - comparator: 'South+Asia', + comparator: 'South Asia', clause: 'WHERE', sqlExpression: null, filterOptionName: 'filter_b2tfg1rs8y_8kmrcyxvsqd', @@ -107,4 +84,22 @@ describe('Visualization > Bubble', () => { ); }); }); + + it('should allow type to search color schemes and apply the scheme', () => { + cy.visitChartByParams(BUBBLE_FORM_DATA); + + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('supersetColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]', + ).should('exist'); + cy.get('[data-test=run-query-button]').click(); + cy.get('.bubble .nv-legend .nv-legend-symbol').should( + 'have.css', + 'fill', + 'rgb(31, 168, 201)', + ); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/compare.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/compare.test.js index 83b37f889f77..136e48d5adec 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/compare.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/compare.test.js @@ -17,6 +17,10 @@ * under the License. */ describe('Visualization > Compare', () => { + beforeEach(() => { + cy.intercept('POST', '/superset/explore_json/**').as('getJson'); + }); + const COMPARE_FORM_DATA = { datasource: '3__table', viz_type: 'compare', @@ -47,15 +51,10 @@ describe('Visualization > Compare', () => { }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/superset/explore_json/**').as('getJson'); - }); - it('should work without groupby', () => { verify(COMPARE_FORM_DATA); cy.get('.chart-container .nvd3 path.nv-line').should('have.length', 1); @@ -86,4 +85,20 @@ describe('Visualization > Compare', () => { }); cy.get('.chart-container .nvd3 path.nv-line').should('have.length', 1); }); + + it('should allow type to search color schemes and apply the scheme', () => { + verify(COMPARE_FORM_DATA); + + cy.get('#controlSections-tab-display').click(); + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('supersetColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]', + ).should('exist'); + cy.get('.compare .nv-legend .nv-legend-symbol') + .first() + .should('have.css', 'fill', 'rgb(31, 168, 201)'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/dist_bar.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/dist_bar.test.js index bec718367ef9..770e1e1c04d3 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/dist_bar.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/dist_bar.test.js @@ -19,21 +19,19 @@ import { FORM_DATA_DEFAULTS, NUM_METRIC } from './shared.helper'; describe('Visualization > Distribution bar chart', () => { - const VIZ_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'dist_bar' }; - beforeEach(() => { - cy.login(); cy.intercept('POST', '/superset/explore_json/**').as('getJson'); }); - it('should work with adhoc metric', () => { - const formData = { - ...VIZ_DEFAULTS, - metrics: NUM_METRIC, - groupby: ['state'], - }; + const VIZ_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'dist_bar' }; + const DISTBAR_FORM_DATA = { + ...VIZ_DEFAULTS, + metrics: NUM_METRIC, + groupby: ['state'], + }; - cy.visitChartByParams(JSON.stringify(formData)); + it('should work with adhoc metric', () => { + cy.visitChartByParams(DISTBAR_FORM_DATA); cy.verifySliceSuccess({ waitAlias: '@getJson', querySubstring: NUM_METRIC.label, @@ -49,7 +47,7 @@ describe('Visualization > Distribution bar chart', () => { columns: ['gender'], }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); }); @@ -61,7 +59,7 @@ describe('Visualization > Distribution bar chart', () => { row_limit: 10, }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); }); @@ -74,7 +72,23 @@ describe('Visualization > Distribution bar chart', () => { contribution: true, }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); }); + + it('should allow type to search color schemes and apply the scheme', () => { + cy.visitChartByParams(DISTBAR_FORM_DATA); + + cy.get('#controlSections-tab-display').click(); + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('bnbColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="bnbColors"]', + ).should('exist'); + cy.get('.dist_bar .nv-legend .nv-legend-symbol') + .first() + .should('have.css', 'fill', 'rgb(255, 90, 95)'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/download_chart.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/download_chart.test.js index ce4a871f8e2d..668e9c789f61 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/download_chart.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/download_chart.test.js @@ -22,7 +22,6 @@ describe('Download Chart > Distribution bar chart', () => { const VIZ_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'dist_bar' }; beforeEach(() => { - cy.login(); cy.intercept('POST', '/superset/explore_json/**').as('getJson'); }); @@ -33,9 +32,9 @@ describe('Download Chart > Distribution bar chart', () => { groupby: ['state'], }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.get('.header-with-actions .ant-dropdown-trigger').click(); - cy.get(':nth-child(1) > .ant-dropdown-menu-submenu-title').click(); + cy.get(':nth-child(3) > .ant-dropdown-menu-submenu-title').click(); cy.get( '.ant-dropdown-menu-submenu > .ant-dropdown-menu li:nth-child(3)', ).click(); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/dual_line.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/dual_line.test.js index 641b2925d77e..d31196b9564b 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/dual_line.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/dual_line.test.js @@ -17,13 +17,17 @@ * under the License. */ describe('Visualization > Dual Line', () => { + beforeEach(() => { + cy.intercept('POST', '/superset/explore_json/**').as('getJson'); + }); + const DUAL_LINE_FORM_DATA = { datasource: '3__table', viz_type: 'dual_line', slice_id: 58, granularity_sqla: 'ds', time_grain_sqla: 'P1D', - time_range: '100+years+ago+:+now', + time_range: '100 years ago : now', color_scheme: 'bnbColors', x_axis_format: 'smart_date', metric: 'sum__num', @@ -35,15 +39,10 @@ describe('Visualization > Dual Line', () => { }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/superset/explore_json/**').as('getJson'); - }); - it('should work', () => { verify(DUAL_LINE_FORM_DATA); cy.get('.chart-container svg path.nv-line').should('have.length', 2); @@ -66,4 +65,20 @@ describe('Visualization > Dual Line', () => { }); cy.get('.chart-container svg path.nv-line').should('have.length', 2); }); + + it('should allow type to search color schemes and apply the scheme', () => { + verify(DUAL_LINE_FORM_DATA); + + cy.get('#controlSections-tab-display').click(); + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('supersetColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]', + ).should('exist'); + cy.get('.dual_line .nv-legend .nv-legend-symbol') + .first() + .should('have.css', 'fill', 'rgb(31, 168, 201)'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/gauge.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/gauge.test.js index 8b5b2ffd0b72..e704705c6a57 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/gauge.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/gauge.test.js @@ -16,26 +16,26 @@ * specific language governing permissions and limitations * under the License. */ + describe('Visualization > Gauge', () => { + beforeEach(() => { + cy.intercept('POST', '/api/v1/chart/data*').as('getJson'); + }); + const GAUGE_FORM_DATA = { - datasource: '2__table', + datasource: '3__table', viz_type: 'gauge_chart', metric: 'count', adhoc_filters: [], - slice_id: 49, + slice_id: 54, row_limit: 10, }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/api/v1/chart/data*').as('getJson'); - }); - it('should work', () => { verify(GAUGE_FORM_DATA); cy.get('.chart-container .gauge_chart canvas').should('have.length', 1); @@ -60,4 +60,17 @@ describe('Visualization > Gauge', () => { }); cy.get('.chart-container .gauge_chart canvas').should('have.length', 1); }); + + it('should allow type to search color schemes', () => { + verify(GAUGE_FORM_DATA); + + cy.get('#controlSections-tab-display').click(); + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('bnbColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="bnbColors"]', + ).should('exist'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/graph.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/graph.test.ts index 47adb075bdd9..ff8eaa629ff4 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/graph.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/graph.test.ts @@ -27,6 +27,10 @@ type adhocFilter = { }; describe('Visualization > Graph', () => { + beforeEach(() => { + cy.intercept('POST', '/api/v1/chart/data*').as('getJson'); + }); + const GRAPH_FORM_DATA = { datasource: '1__table', viz_type: 'graph_chart', @@ -46,15 +50,10 @@ describe('Visualization > Graph', () => { function verify(formData: { [name: string]: string | boolean | number | Array<adhocFilter>; }): void { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/api/v1/chart/data*').as('getJson'); - }); - it('should work with ad-hoc metric', () => { verify(GRAPH_FORM_DATA); cy.get('.chart-container .graph_chart canvas').should('have.length', 1); @@ -77,4 +76,17 @@ describe('Visualization > Graph', () => { }); cy.get('.chart-container .graph_chart canvas').should('have.length', 1); }); + + it('should allow type to search color schemes', () => { + verify(GRAPH_FORM_DATA); + + cy.get('#controlSections-tab-display').click(); + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('bnbColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="bnbColors"]', + ).should('exist'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/histogram.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/histogram.test.ts index 67cbba3f9699..ba197cf4cd54 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/histogram.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/histogram.test.ts @@ -19,6 +19,10 @@ import { QueryFormData } from '@superset-ui/core'; describe('Visualization > Histogram', () => { + beforeEach(() => { + cy.intercept('POST', '/superset/explore_json/**').as('getJson'); + }); + const HISTOGRAM_FORM_DATA: QueryFormData = { datasource: '3__table', viz_type: 'histogram', @@ -39,15 +43,10 @@ describe('Visualization > Histogram', () => { }; function verify(formData: QueryFormData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/superset/explore_json/**').as('getJson'); - }); - it('should work without groupby', () => { verify(HISTOGRAM_FORM_DATA); cy.get('.chart-container svg .vx-bar').should( @@ -84,4 +83,21 @@ describe('Visualization > Histogram', () => { }); cy.get('.chart-container svg .vx-bar').should('have.length', numBins); }); + + it('should allow type to search color schemes and apply the scheme', () => { + verify(HISTOGRAM_FORM_DATA); + + cy.get('#controlSections-tab-display').click(); + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('supersetColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]', + ).should('exist'); + cy.get('.histogram .vx-legend .vx-legend-shape div') + .first() + .should('have.css', 'background') + .and('contains', 'rgb(31, 168, 201)'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/line.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/line.test.ts index e8998b4bef86..5cc398c7f3ef 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/line.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/line.test.ts @@ -19,16 +19,15 @@ import { FORM_DATA_DEFAULTS, NUM_METRIC, SIMPLE_FILTER } from './shared.helper'; describe('Visualization > Line', () => { - const LINE_CHART_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'line' }; - beforeEach(() => { - cy.login(); cy.intercept('POST', '/superset/explore_json/**').as('getJson'); }); + const LINE_CHART_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'line' }; + it('should show validator error when no metric', () => { const formData = { ...LINE_CHART_DEFAULTS, metrics: [] }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.get('.panel-body').contains( `Add required control values to preview chart`, ); @@ -36,11 +35,14 @@ describe('Visualization > Line', () => { it('should not show validator error when metric added', () => { const formData = { ...LINE_CHART_DEFAULTS, metrics: [] }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.get('.panel-body').contains( `Add required control values to preview chart`, ); - cy.get('.text-danger').contains('Metrics'); + cy.get('[data-test="metrics-header"]').contains('Metrics'); + cy.get('[data-test="metrics-header"] [data-test="error-tooltip"]').should( + 'exist', + ); cy.get('[data-test=metrics]') .contains('Drop columns/metrics here or click') @@ -55,33 +57,40 @@ describe('Visualization > Line', () => { .type('sum{enter}'); cy.get('[data-test="AdhocMetricEdit#save"]').contains('Save').click(); - cy.get('.text-danger').should('not.exist'); + cy.get('[data-test="metrics-header"]').contains('Metrics'); + cy.get('[data-test="metrics-header"] [data-test="error-tooltip"]').should( + 'not.exist', + ); + cy.get('.ant-alert-warning').should('not.exist'); }); it('should allow negative values in Y bounds', () => { const formData = { ...LINE_CHART_DEFAULTS, metrics: [NUM_METRIC] }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.get('#controlSections-tab-display').click(); cy.get('span').contains('Y Axis Bounds').scrollIntoView(); cy.get('input[placeholder="Min"]').type('-0.1', { delay: 100 }); cy.get('.ant-alert-warning').should('not.exist'); }); - it('should allow type to search color schemes', () => { + it('should allow type to search color schemes and apply the scheme', () => { cy.get('#controlSections-tab-display').click(); cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); cy.get('.Control[data-test="color_scheme"] input[type="search"]') .focus() .type('bnbColors{enter}'); cy.get( - '.Control[data-test="color_scheme"] .ant-select-selection-item ul[data-test="bnbColors"]', + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="bnbColors"]', ).should('exist'); + cy.get('.line .nv-legend .nv-legend-symbol') + .first() + .should('have.css', 'fill', 'rgb(255, 90, 95)'); }); it('should work with adhoc metric', () => { const formData = { ...LINE_CHART_DEFAULTS, metrics: [NUM_METRIC] }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); }); @@ -89,7 +98,7 @@ describe('Visualization > Line', () => { const metrics = ['count']; const groupby = ['gender']; const formData = { ...LINE_CHART_DEFAULTS, metrics, groupby }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); }); @@ -101,7 +110,7 @@ describe('Visualization > Line', () => { metrics, adhoc_filters: filters, }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); }); @@ -113,7 +122,7 @@ describe('Visualization > Line', () => { groupby: ['name'], timeseries_limit_metric: NUM_METRIC, }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); }); @@ -126,7 +135,7 @@ describe('Visualization > Line', () => { timeseries_limit_metric: NUM_METRIC, order_desc: true, }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); }); @@ -138,7 +147,7 @@ describe('Visualization > Line', () => { rolling_type: 'mean', rolling_periods: 10, }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); }); @@ -147,12 +156,12 @@ describe('Visualization > Line', () => { const formData = { ...LINE_CHART_DEFAULTS, metrics, - time_compare: ['1+year'], + time_compare: ['1 year'], comparison_type: 'values', groupby: ['gender'], }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); // Offset color should match original line color @@ -190,10 +199,10 @@ describe('Visualization > Line', () => { const formData = { ...LINE_CHART_DEFAULTS, metrics, - time_compare: ['1+year'], + time_compare: ['1 year'], comparison_type: 'ratio', }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); }); @@ -202,10 +211,10 @@ describe('Visualization > Line', () => { const formData = { ...LINE_CHART_DEFAULTS, metrics, - time_compare: ['1+year'], + time_compare: ['1 year'], comparison_type: 'percentage', }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); }); @@ -214,7 +223,7 @@ describe('Visualization > Line', () => { ...LINE_CHART_DEFAULTS, metrics: ['count'], }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); cy.get('text.nv-legend-text').contains('COUNT(*)'); }); @@ -225,7 +234,7 @@ describe('Visualization > Line', () => { metrics: ['count'], annotation_layers: [ { - name: 'Goal+line', + name: 'Goal line', annotationType: 'FORMULA', sourceType: '', value: 'y=140000', @@ -245,7 +254,7 @@ describe('Visualization > Line', () => { }, ], }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); cy.get('.slice_container').within(() => { // Goal line annotation doesn't show up in legend @@ -281,7 +290,7 @@ describe('Visualization > Line', () => { }, ], }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); }, ); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/pie.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/pie.test.js index fb083de615e9..f853cf12848a 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/pie.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/pie.test.js @@ -17,6 +17,10 @@ * under the License. */ describe('Visualization > Pie', () => { + beforeEach(() => { + cy.intercept('POST', '/api/v1/chart/data*').as('getJson'); + }); + const PIE_FORM_DATA = { datasource: '3__table', viz_type: 'pie', @@ -37,15 +41,10 @@ describe('Visualization > Pie', () => { }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/api/v1/chart/data*').as('getJson'); - }); - it('should work with ad-hoc metric', () => { verify(PIE_FORM_DATA); cy.get('.chart-container .pie canvas').should('have.length', 1); @@ -68,4 +67,17 @@ describe('Visualization > Pie', () => { }); cy.get('.chart-container .pie canvas').should('have.length', 1); }); + + it('should allow type to search color schemes', () => { + verify(PIE_FORM_DATA); + + cy.get('#controlSections-tab-display').click(); + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('supersetColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]', + ).should('exist'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/pivot_table.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/pivot_table.test.js index 14de08da7936..dfef462fc9e6 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/pivot_table.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/pivot_table.test.js @@ -17,13 +17,17 @@ * under the License. */ describe('Visualization > Pivot Table', () => { + beforeEach(() => { + cy.intercept('POST', '/superset/explore_json/**').as('getJson'); + }); + const PIVOT_TABLE_FORM_DATA = { datasource: '3__table', viz_type: 'pivot_table', slice_id: 61, granularity_sqla: 'ds', time_grain_sqla: 'P1D', - time_range: '100+years+ago+:+now', + time_range: '100 years ago : now', metrics: ['sum__num'], adhoc_filters: [], groupby: ['name'], @@ -54,15 +58,10 @@ describe('Visualization > Pivot Table', () => { }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'table' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/superset/explore_json/**').as('getJson'); - }); - it('should work with single groupby', () => { verify(PIVOT_TABLE_FORM_DATA); cy.get('.chart-container tr:eq(0) th:eq(1)').contains('sum__num'); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/sankey.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/sankey.test.js index 257ec00c1f05..e5139bee1c01 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/sankey.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/sankey.test.js @@ -17,6 +17,10 @@ * under the License. */ describe('Visualization > Sankey', () => { + beforeEach(() => { + cy.intercept('POST', '/superset/explore_json/**').as('getJson'); + }); + const SANKEY_FORM_DATA = { datasource: '1__table', viz_type: 'sankey', @@ -24,7 +28,7 @@ describe('Visualization > Sankey', () => { url_params: {}, granularity_sqla: null, time_grain_sqla: 'P1D', - time_range: 'Last+week', + time_range: 'Last week', groupby: ['source', 'target'], metric: 'sum__value', adhoc_filters: [], @@ -33,15 +37,10 @@ describe('Visualization > Sankey', () => { }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/superset/explore_json/**').as('getJson'); - }); - it('should work', () => { verify(SANKEY_FORM_DATA); cy.get('.chart-container svg g.node rect').should('have.length', 41); @@ -53,7 +52,7 @@ describe('Visualization > Sankey', () => { adhoc_filters: [ { expressionType: 'SQL', - sqlExpression: 'SUM(value)+>+0', + sqlExpression: 'SUM(value) > 0', clause: 'HAVING', subject: null, operator: null, @@ -73,4 +72,17 @@ describe('Visualization > Sankey', () => { }); cy.get('.chart-container svg g.node rect').should('have.length', 6); }); + + it('should allow type to search color schemes', () => { + verify(SANKEY_FORM_DATA); + + cy.get('#controlSections-tab-display').click(); + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('bnbColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="bnbColors"]', + ).should('exist'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/shared.helper.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/shared.helper.js index 78a659fc91f3..bfd50e66d3df 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/shared.helper.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/shared.helper.js @@ -24,7 +24,7 @@ export const FORM_DATA_DEFAULTS = { datasource: '3__table', granularity_sqla: 'ds', time_grain_sqla: null, - time_range: '100+years+ago+:+now', + time_range: '100 years ago : now', adhoc_filters: [], groupby: [], limit: null, @@ -37,7 +37,7 @@ export const HEALTH_POP_FORM_DATA_DEFAULTS = { datasource: '2__table', granularity_sqla: 'ds', time_grain_sqla: 'P1D', - time_range: '1960-01-01+:+2014-01-02', + time_range: '1960-01-01 : 2014-01-02', }; export const NUM_METRIC = { diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/sunburst.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/sunburst.test.js index 99cbb1e407e4..03090db9c4ed 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/sunburst.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/sunburst.test.js @@ -17,6 +17,10 @@ * under the License. */ describe('Visualization > Sunburst', () => { + beforeEach(() => { + cy.intercept('POST', '/superset/explore_json/**').as('getJson'); + }); + const SUNBURST_FORM_DATA = { datasource: '2__table', viz_type: 'sunburst', @@ -32,15 +36,10 @@ describe('Visualization > Sunburst', () => { }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/superset/explore_json/**').as('getJson'); - }); - it('should work without secondary metric', () => { verify(SUNBURST_FORM_DATA); // There should be 7 visible arcs + 1 hidden @@ -80,4 +79,17 @@ describe('Visualization > Sunburst', () => { }); cy.get('.chart-container svg g#arcs path').should('have.length', 3); }); + + it('should allow type to search color schemes', () => { + verify(SUNBURST_FORM_DATA); + + cy.get('#controlSections-tab-display').click(); + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('supersetColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]', + ).should('exist'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/table.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/table.test.ts index 6361d93d1809..46030bfb3594 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/table.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/table.test.ts @@ -27,6 +27,10 @@ import { // Table describe('Visualization > Table', () => { + beforeEach(() => { + interceptChart({ legacy: false }).as('chartData'); + }); + const VIZ_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'table', @@ -43,11 +47,6 @@ describe('Visualization > Table', () => { optionName: 'metric_6qwzgc8bh2v_zox7hil1mzs', }; - beforeEach(() => { - cy.login(); - interceptChart({ legacy: false }).as('chartData'); - }); - it('Use default time column', () => { cy.visitChartByParams({ ...VIZ_DEFAULTS, @@ -174,7 +173,7 @@ describe('Visualization > Table', () => { groupby: ['name'], row_limit: limit, }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.wait('@chartData').then(({ response }) => { cy.verifySliceContainer('table'); expect(response?.body.result[0].data.length).to.eq(limit); @@ -219,7 +218,7 @@ describe('Visualization > Table', () => { order_by_cols: ['["num", false]'], }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.wait('@chartData').then(({ response }) => { cy.verifySliceContainer('table'); const records = response?.body.result[0].data; @@ -233,7 +232,7 @@ describe('Visualization > Table', () => { const formData = { ...VIZ_DEFAULTS, metrics, adhoc_filters: filters }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@chartData', chartSelector: 'table' }); }); @@ -244,7 +243,7 @@ describe('Visualization > Table', () => { groupby: ['state'], }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@chartData', querySubstring: /group by.*state/i, diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/time_table.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/time_table.js index 7da90027856f..5c8672192a8e 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/time_table.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/time_table.js @@ -19,13 +19,12 @@ import { FORM_DATA_DEFAULTS, NUM_METRIC } from './shared.helper'; describe('Visualization > Time TableViz', () => { - const VIZ_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'time_table' }; - beforeEach(() => { - cy.login(); cy.intercept('POST', '/superset/explore_json/**').as('getJson'); }); + const VIZ_DEFAULTS = { ...FORM_DATA_DEFAULTS, viz_type: 'time_table' }; + it('Test time series table multiple metrics last year total', () => { const formData = { ...VIZ_DEFAULTS, @@ -33,7 +32,7 @@ describe('Visualization > Time TableViz', () => { column_collection: [ { key: '9g4K-B-YL', - label: 'Last+Year', + label: 'Last Year', colType: 'time', timeLag: '1', comparisonType: 'value', @@ -42,7 +41,7 @@ describe('Visualization > Time TableViz', () => { url: '', }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', querySubstring: NUM_METRIC.label, @@ -61,7 +60,7 @@ describe('Visualization > Time TableViz', () => { column_collection: [ { key: '9g4K-B-YL', - label: 'Last+Year', + label: 'Last Year', colType: 'time', timeLag: '1', comparisonType: 'value', @@ -70,7 +69,7 @@ describe('Visualization > Time TableViz', () => { url: '', }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', querySubstring: NUM_METRIC.label, @@ -107,7 +106,7 @@ describe('Visualization > Time TableViz', () => { url: '', }; - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', querySubstring: NUM_METRIC.label, diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/treemap.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/treemap.test.js index 6ebe06274fbd..158aa7b39b15 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/treemap.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/treemap.test.js @@ -17,6 +17,10 @@ * under the License. */ describe('Visualization > Treemap', () => { + beforeEach(() => { + cy.intercept('POST', '/superset/explore_json/**').as('getJson'); + }); + const TREEMAP_FORM_DATA = { datasource: '2__table', viz_type: 'treemap', @@ -38,15 +42,10 @@ describe('Visualization > Treemap', () => { const level2 = '.chart-container rect[style="fill: rgb(0, 122, 135);"]'; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/superset/explore_json/**').as('getJson'); - }); - it('should work', () => { verify(TREEMAP_FORM_DATA); cy.get(level0).should('have.length', 1); @@ -80,4 +79,18 @@ describe('Visualization > Treemap', () => { }); cy.get(level1).should('have.length', 8); }); + + it('should allow type to search color schemes and apply the scheme', () => { + verify(TREEMAP_FORM_DATA); + + cy.get('.Control[data-test="color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="color_scheme"] input[type="search"]') + .focus() + .type('supersetColors{enter}'); + cy.get( + '.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]', + ).should('exist'); + cy.get('[data-test=run-query-button]').click(); + cy.get('#rect-IND').should('have.css', 'fill', 'rgb(69, 78, 124)'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/world_map.test.js b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/world_map.test.js index ed9d3e421498..f92fbf58efcc 100644 --- a/superset-frontend/cypress-base/cypress/integration/explore/visualizations/world_map.test.js +++ b/superset-frontend/cypress-base/cypress/integration/explore/visualizations/world_map.test.js @@ -17,6 +17,10 @@ * under the License. */ describe('Visualization > World Map', () => { + beforeEach(() => { + cy.intercept('POST', '/superset/explore_json/**').as('getJson'); + }); + const WORLD_MAP_FORM_DATA = { datasource: '2__table', viz_type: 'world_map', @@ -35,15 +39,10 @@ describe('Visualization > World Map', () => { }; function verify(formData) { - cy.visitChartByParams(JSON.stringify(formData)); + cy.visitChartByParams(formData); cy.verifySliceSuccess({ waitAlias: '@getJson', chartSelector: 'svg' }); } - beforeEach(() => { - cy.login(); - cy.intercept('POST', '/superset/explore_json/**').as('getJson'); - }); - it('should work with ad-hoc metric', () => { verify(WORLD_MAP_FORM_DATA); cy.get('.bubbles circle.datamaps-bubble').should('have.length', 206); @@ -80,4 +79,16 @@ describe('Visualization > World Map', () => { ).to.equal(0); }); }); + + it('should allow type to search color schemes', () => { + verify(WORLD_MAP_FORM_DATA); + + cy.get('.Control[data-test="linear_color_scheme"]').scrollIntoView(); + cy.get('.Control[data-test="linear_color_scheme"] input[type="search"]') + .focus() + .type('greens{enter}'); + cy.get( + '.Control[data-test="linear_color_scheme"] .ant-select-selection-item [data-test="greens"]', + ).should('exist'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/sqllab/sourcePanel.index.test.js b/superset-frontend/cypress-base/cypress/integration/sqllab/_skip.sourcePanel.index.test.js similarity index 94% rename from superset-frontend/cypress-base/cypress/integration/sqllab/sourcePanel.index.test.js rename to superset-frontend/cypress-base/cypress/integration/sqllab/_skip.sourcePanel.index.test.js index ec0db332afd9..be455a4a99b7 100644 --- a/superset-frontend/cypress-base/cypress/integration/sqllab/sourcePanel.index.test.js +++ b/superset-frontend/cypress-base/cypress/integration/sqllab/_skip.sourcePanel.index.test.js @@ -18,15 +18,14 @@ */ import { selectResultsTab } from './sqllab.helper'; -describe('SqlLab datasource panel', () => { +describe.skip('SqlLab datasource panel', () => { beforeEach(() => { - cy.login(); cy.visit('/superset/sqllab'); }); // TODO the test bellow is flaky, and has been disabled for the time being // (notice the `it.skip`) - it.skip('creates a table preview when a database, schema, and table are selected', () => { + it('creates a table preview when a database, schema, and table are selected', () => { cy.intercept('/superset/table/**').as('tableMetadata'); // it should have dropdowns to select database, schema, and table diff --git a/superset-frontend/cypress-base/cypress/integration/sqllab/query.test.ts b/superset-frontend/cypress-base/cypress/integration/sqllab/query.test.ts index 33b7caf55144..0d36692b2ad0 100644 --- a/superset-frontend/cypress-base/cypress/integration/sqllab/query.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/sqllab/query.test.ts @@ -25,7 +25,6 @@ function parseClockStr(node: JQuery) { describe('SqlLab query panel', () => { beforeEach(() => { - cy.login(); cy.visit('/superset/sqllab'); }); @@ -34,19 +33,9 @@ describe('SqlLab query panel', () => { // are fetched below (because React _Virtualized_ does not render all rows) let clockTime = 0; - const sampleResponse = { - status: 'success', - data: [{ '?column?': 1 }], - columns: [{ name: '?column?', type: 'INT', is_dttm: false }], - selected_columns: [{ name: '?column?', type: 'INT', is_dttm: false }], - expanded_columns: [], - }; - cy.intercept({ method: 'POST', - url: '/superset/sql_json/', - delay: 1000, - response: () => sampleResponse, + url: '/api/v1/sqllab/execute/', }).as('mockSQLResponse'); cy.get('.TableSelector .Select:eq(0)').click(); @@ -92,7 +81,7 @@ describe('SqlLab query panel', () => { }); it.skip('successfully saves a query', () => { - cy.intercept('superset/tables/**').as('getTables'); + cy.intercept('api/v1/database/**/tables/**').as('getTables'); cy.intercept('savedqueryviewapi/**').as('getSavedQuery'); const query = @@ -157,4 +146,52 @@ describe('SqlLab query panel', () => { assertSQLLabResultsAreEqual(initialResultsTable, savedQueryResultsTable); }); }); + + it('Create a chart from a query', () => { + cy.intercept('/api/v1/sqllab/execute/').as('queryFinished'); + cy.intercept('**/api/v1/explore/**').as('explore'); + cy.intercept('**/api/v1/chart/**').as('chart'); + + // cypress doesn't handle opening a new tab, override window.open to open in the same tab + cy.window().then(win => { + cy.stub(win, 'open', url => { + // eslint-disable-next-line no-param-reassign + win.location.href = url; + }); + }); + + const query = 'SELECT gender, name FROM birth_names'; + + cy.get('.ace_text-input') + .focus() + .clear({ force: true }) + .type(`{selectall}{backspace}${query}`, { force: true }); + cy.get('.sql-toolbar button').contains('Run').click(); + cy.wait('@queryFinished'); + + cy.get( + '.SouthPane .ant-tabs-content > .ant-tabs-tabpane-active > div button:first', + { timeout: 10000 }, + ).click(); + + cy.wait('@explore'); + cy.get('[data-test="datasource-control"] .title-select').contains(query); + cy.get('.column-option-label').first().contains('gender'); + cy.get('.column-option-label').last().contains('name'); + + cy.get( + '[data-test="all_columns"] [data-test="dnd-labels-container"] > div:first-child', + ).contains('gender'); + cy.get( + '[data-test="all_columns"] [data-test="dnd-labels-container"] > div:nth-child(2)', + ).contains('name'); + + cy.wait('@chart'); + cy.get('[data-test="slice-container"] table > thead th') + .first() + .contains('gender'); + cy.get('[data-test="slice-container"] table > thead th') + .last() + .contains('name'); + }); }); diff --git a/superset-frontend/cypress-base/cypress/integration/sqllab/sqllab.applitools.test.ts b/superset-frontend/cypress-base/cypress/integration/sqllab/sqllab.applitools.test.ts index 31b4472516f3..fdbaefb158f1 100644 --- a/superset-frontend/cypress-base/cypress/integration/sqllab/sqllab.applitools.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/sqllab/sqllab.applitools.test.ts @@ -19,7 +19,6 @@ describe('SqlLab view', () => { beforeEach(() => { - cy.login(); cy.visit('/superset/sqllab'); }); diff --git a/superset-frontend/cypress-base/cypress/integration/sqllab/tabs.test.ts b/superset-frontend/cypress-base/cypress/integration/sqllab/tabs.test.ts index 0e85664cb785..b2c7a180ad83 100644 --- a/superset-frontend/cypress-base/cypress/integration/sqllab/tabs.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/sqllab/tabs.test.ts @@ -18,30 +18,32 @@ */ describe('SqlLab query tabs', () => { beforeEach(() => { - cy.login(); cy.visit('/superset/sqllab'); }); + const tablistSelector = '[data-test="sql-editor-tabs"] > [role="tablist"]'; + const tabSelector = `${tablistSelector} [role="tab"]`; + it('allows you to create and close a tab', () => { - const tablistSelector = '[data-test="sql-editor-tabs"] > [role="tablist"]'; - const tabSelector = `${tablistSelector} [role="tab"]`; cy.get(tabSelector).then(tabs => { const initialTabCount = tabs.length; const initialUntitledCount = Math.max( 0, ...tabs - .map((i, tabItem) => - Number(tabItem.textContent?.match(/Untitled Query (\d+)/)?.[1]), + .map( + (i, tabItem) => + Number(tabItem.textContent?.match(/Untitled Query (\d+)/)?.[1]) || + 0, ) .toArray(), ); // add two new tabs - cy.get('[data-test="add-tab-icon"]:visible:last').click(); + cy.get('[data-test="add-tab-icon"]:visible:last').click({ force: true }); cy.contains('[role="tab"]', `Untitled Query ${initialUntitledCount + 1}`); cy.get(tabSelector).should('have.length', initialTabCount + 1); - cy.get('[data-test="add-tab-icon"]:visible:last').click(); + cy.get('[data-test="add-tab-icon"]:visible:last').click({ force: true }); cy.contains('[role="tab"]', `Untitled Query ${initialUntitledCount + 2}`); cy.get(tabSelector).should('have.length', initialTabCount + 2); @@ -57,4 +59,55 @@ describe('SqlLab query tabs', () => { cy.get(tabSelector).should('have.length', initialTabCount); }); }); + + it('opens a new tab by a button and a shortcut', () => { + const editorContent = '#ace-editor .ace_content'; + const editorInput = '#ace-editor textarea'; + const queryLimitSelector = '#js-sql-toolbar .limitDropdown'; + cy.get(tabSelector).then(tabs => { + const initialTabCount = tabs.length; + const initialUntitledCount = Math.max( + 0, + ...tabs + .map( + (i, tabItem) => + Number(tabItem.textContent?.match(/Untitled Query (\d+)/)?.[1]) || + 0, + ) + .toArray(), + ); + + // configure some editor settings + cy.get(editorInput).type('some random query string', { force: true }); + cy.get(queryLimitSelector).parent().click({ force: true }); + cy.get('.ant-dropdown-menu') + .last() + .find('.ant-dropdown-menu-item') + .first() + .click({ force: true }); + + // open a new tab by a button + cy.get('[data-test="add-tab-icon"]:visible:last').click({ force: true }); + cy.contains('[role="tab"]', `Untitled Query ${initialUntitledCount + 1}`); + cy.get(tabSelector).should('have.length', initialTabCount + 1); + cy.get(editorContent).contains('SELECT ...'); + cy.get(queryLimitSelector).contains('10'); + + // close the tab + cy.get(`${tabSelector}:last [data-test="dropdown-trigger"]`).click({ + force: true, + }); + cy.get(`${tablistSelector} [aria-label="remove"]:last`).click({ + force: true, + }); + cy.get(tabSelector).should('have.length', initialTabCount); + + // open a new tab by a shortcut + cy.get('body').type('{ctrl}t'); + cy.get(tabSelector).should('have.length', initialTabCount + 1); + cy.contains('[role="tab"]', `Untitled Query ${initialUntitledCount + 1}`); + cy.get(editorContent).contains('SELECT ...'); + cy.get(queryLimitSelector).contains('10'); + }); + }); }); diff --git a/superset-frontend/cypress-base/cypress/support/directories.ts b/superset-frontend/cypress-base/cypress/support/directories.ts index fde9ee0cdeac..b0eb024d2f48 100644 --- a/superset-frontend/cypress-base/cypress/support/directories.ts +++ b/superset-frontend/cypress-base/cypress/support/directories.ts @@ -84,11 +84,11 @@ export const databasesPage = { step: '.helper-top', selectDbStepTitle: '.select-db > h4', preferredBlockBigQuery: '.preferred > :nth-child(1)', - prefferedBlockPostgreSQL: '.preferred > :nth-child(2)', - prefferedBlockSnowflake: '.preferred > :nth-child(3)', - prefferedBlockMySQL: '.preferred > :nth-child(4)', - prefferedBlockAthena: '.preferred > :nth-child(5)', - prefferedBlockSheets: '.preferred > :nth-child(6)', + preferredBlockPostgreSQL: '.preferred > :nth-child(2)', + preferredBlockSnowflake: '.preferred > :nth-child(3)', + preferredBlockMySQL: '.preferred > :nth-child(4)', + preferredBlockAthena: '.preferred > :nth-child(5)', + preferredBlockSheets: '.preferred > :nth-child(6)', supportedDatabasesText: '.control-label', orChoose: '.available-label', dbDropdown: '[class="ant-select-selection-search-input"]', @@ -127,10 +127,11 @@ export const databasesPage = { export const sqlLabView = { sqlEditorLeftBar: { - sqlEditorLeftBar: '[class="SqlEditorLeftBar"]', - databaseSchemaTableSection: '[class="SqlEditorLeftBar"] > :nth-child(1)', + sqlEditorLeftBar: '[data-test="sql-editor-left-bar"]', + databaseSchemaTableSection: + '[data-test="sql-editor-left-bar"] > :nth-child(1)', tableSchemaSection: - '[class="SqlEditorLeftBar"] > :nth-child(1) > :nth-child(3) > :nth-child(1)', + '[data-test="sql-editor-left-bar"] > :nth-child(1) > :nth-child(3) > :nth-child(1)', tableSchemaInputEmpty: '[aria-label="Select table or type table name"]', }, databaseInput: '[data-test=DatabaseSelector] > :nth-child(1)', @@ -589,7 +590,7 @@ export const exploreView = { okButton: '.ant-modal-confirm-btns .ant-btn-primary', }, }, - vizualizationTypeModal: { + visualizationTypeModal: { vizTypeButton: dataTestLocator('viztype-selector-container'), }, }; diff --git a/superset-frontend/cypress-base/cypress/support/index.d.ts b/superset-frontend/cypress-base/cypress/support/index.d.ts index eca68a7ced7f..124d72bddd00 100644 --- a/superset-frontend/cypress-base/cypress/support/index.d.ts +++ b/superset-frontend/cypress-base/cypress/support/index.d.ts @@ -30,6 +30,18 @@ declare namespace Cypress { */ login(): void; + /** + * + * Utils + */ + + getBySel(selector: string): cy; + getBySelLike(selector: string): cy; + cleanCharts(): cy; + cleanDashboards(): cy; + loadChartFixtures(): cy; + loadDashboardFixtures(): cy; + visitChartByParams(params: string | Record<string, unknown>): cy; visitChartByName(name: string): cy; visitChartById(id: number): cy; @@ -52,15 +64,27 @@ declare namespace Cypress { * Get */ getDashboards(): cy; + getDashboard(dashboardId: string | number): Record<string, any>; getCharts(): cy; + /** + * Create + */ + createSampleDashboards(indexes?: number[]): void; + createSampleCharts(indexes?: number[]): void; + /** * Delete */ - deleteDashboard(id: number): cy; - deleteDashboardByName(name: string): cy; - deleteChartByName(name: string): cy; - deleteChart(id: number): cy; + deleteDashboard(id: number, failOnStatusCode: boolean): cy; + deleteDashboardByName(dashboardName: string, failOnStatusCode: boolean): cy; + deleteChartByName(name: string, failOnStatusCode: boolean): cy; + deleteChart(id: number, failOnStatusCode: boolean): cy; + + /** + * Update + */ + updateDashboard(dashboardId: number, body: Record<string, any>): cy; } } diff --git a/superset-frontend/cypress-base/cypress/support/index.ts b/superset-frontend/cypress-base/cypress/support/index.ts index 0affa97e7c9f..456ca7ebc5c7 100644 --- a/superset-frontend/cypress-base/cypress/support/index.ts +++ b/superset-frontend/cypress-base/cypress/support/index.ts @@ -19,13 +19,103 @@ import '@cypress/code-coverage/support'; import '@applitools/eyes-cypress/commands'; -const BASE_EXPLORE_URL = '/superset/explore/?form_data='; -const TokenName = Cypress.env('TOKEN_NAME'); -<<<<<<< HEAD -======= - require('cy-verify-downloads').addCustomCommand(); ->>>>>>> 16654034849505109b638fd2a784dfb377238a0e + +const BASE_EXPLORE_URL = '/explore/?form_data='; +let DASHBOARD_FIXTURES: Record<string, any>[] = []; +let CHART_FIXTURES: Record<string, any>[] = []; + +Cypress.Commands.add('loadChartFixtures', () => + cy.fixture('charts.json').then(charts => { + CHART_FIXTURES = charts; + }), +); + +Cypress.Commands.add('loadDashboardFixtures', () => + cy.fixture('dashboards.json').then(dashboards => { + DASHBOARD_FIXTURES = dashboards; + }), +); + +before(() => { + cy.login(); + Cypress.Cookies.defaults({ preserve: 'session' }); + cy.loadChartFixtures(); + cy.loadDashboardFixtures(); +}); + +beforeEach(() => { + cy.cleanDashboards(); + cy.cleanCharts(); +}); + +Cypress.Commands.add('cleanDashboards', () => { + cy.getDashboards().then((sampleDashboards?: Record<string, any>[]) => { + const deletableDashboards = []; + for (let i = 0; i < DASHBOARD_FIXTURES.length; i += 1) { + const fixture = DASHBOARD_FIXTURES[i]; + const isInDb = sampleDashboards?.find( + d => d.dashboard_title === fixture.dashboard_title, + ); + if (isInDb) { + deletableDashboards.push(isInDb.id); + } + } + if (deletableDashboards.length) { + cy.request({ + failOnStatusCode: false, + method: 'DELETE', + url: `api/v1/dashboard/?q=!(${deletableDashboards.join(',')})`, + headers: { + Cookie: `csrf_access_token=${window.localStorage.getItem( + 'access_token', + )}`, + 'Content-Type': 'application/json', + 'X-CSRFToken': `${window.localStorage.getItem('access_token')}`, + Referer: `${Cypress.config().baseUrl}/`, + }, + }).then(resp => resp); + } + }); +}); + +Cypress.Commands.add('cleanCharts', () => { + cy.getCharts().then((sampleCharts?: Record<string, any>[]) => { + const deletableCharts = []; + for (let i = 0; i < CHART_FIXTURES.length; i += 1) { + const fixture = CHART_FIXTURES[i]; + const isInDb = sampleCharts?.find( + c => c.slice_name === fixture.slice_name, + ); + if (isInDb) { + deletableCharts.push(isInDb.id); + } + } + if (deletableCharts.length) { + cy.request({ + failOnStatusCode: false, + method: 'DELETE', + url: `api/v1/chart/?q=!(${deletableCharts.join(',')})`, + headers: { + Cookie: `csrf_access_token=${window.localStorage.getItem( + 'access_token', + )}`, + 'Content-Type': 'application/json', + 'X-CSRFToken': `${window.localStorage.getItem('access_token')}`, + Referer: `${Cypress.config().baseUrl}/`, + }, + }).then(resp => resp); + } + }); +}); + +Cypress.Commands.add('getBySel', (selector, ...args) => + cy.get(`[data-test=${selector}]`, ...args), +); + +Cypress.Commands.add('getBySelLike', (selector, ...args) => + cy.get(`[data-test*=${selector}]`, ...args), +); /* eslint-disable consistent-return */ Cypress.on('uncaught:exception', err => { @@ -35,6 +125,8 @@ Cypress.on('uncaught:exception', err => { // returning false here prevents Cypress from failing the test return false; } + + return false; // TODO:@geido remove }); /* eslint-enable consistent-return */ @@ -58,12 +150,45 @@ Cypress.Commands.add('visitChartById', chartId => cy.visit(`${BASE_EXPLORE_URL}{"slice_id": ${chartId}}`), ); -Cypress.Commands.add('visitChartByParams', params => { - const queryString = - typeof params === 'string' ? params : JSON.stringify(params); - const url = `${BASE_EXPLORE_URL}${queryString}`; - return cy.visit(url); -}); +Cypress.Commands.add( + 'visitChartByParams', + (formData: { + datasource?: string; + datasource_id?: number; + datasource_type?: string; + [key: string]: unknown; + }) => { + let datasource_id; + let datasource_type; + if (formData.datasource_id && formData.datasource_type) { + ({ datasource_id, datasource_type } = formData); + } else { + [datasource_id, datasource_type] = formData.datasource?.split('__') || []; + } + const accessToken = window.localStorage.getItem('access_token'); + cy.request({ + method: 'POST', + url: 'api/v1/explore/form_data', + body: { + datasource_id, + datasource_type, + form_data: JSON.stringify(formData), + }, + headers: { + ...(accessToken && { + Cookie: `csrf_access_token=${accessToken}`, + 'X-CSRFToken': accessToken, + }), + 'Content-Type': 'application/json', + Referer: `${Cypress.config().baseUrl}/`, + }, + }).then(response => { + const formDataKey = response.body.key; + const url = `/explore/?form_data_key=${formDataKey}`; + cy.visit(url); + }); + }, +); Cypress.Commands.add('verifySliceContainer', chartSelector => { // After a wait response check for valid slice container @@ -110,51 +235,126 @@ Cypress.Commands.add( }, ); -Cypress.Commands.add('deleteDashboardByName', (name: string) => - cy.getDashboards().then((dashboards: any) => { - dashboards?.forEach((element: any) => { - if (element.dashboard_title === name) { - const elementId = element.id; - cy.deleteDashboard(elementId); +Cypress.Commands.add('createSampleDashboards', (indexes?: number[]) => + cy.cleanDashboards().then(() => { + for (let i = 0; i < DASHBOARD_FIXTURES.length; i += 1) { + if (indexes?.includes(i) || !indexes) { + cy.request({ + method: 'POST', + url: `/api/v1/dashboard/`, + body: DASHBOARD_FIXTURES[i], + failOnStatusCode: false, + headers: { + Cookie: `csrf_access_token=${window.localStorage.getItem( + 'access_token', + )}`, + 'Content-Type': 'application/json', + 'X-CSRFToken': `${window.localStorage.getItem('access_token')}`, + Referer: `${Cypress.config().baseUrl}/`, + }, + }); } - }); + } }), ); -Cypress.Commands.add('deleteDashboard', (id: number) => - cy - .request({ - method: 'DELETE', - url: `api/v1/dashboard/${id}`, - headers: { - Cookie: `csrf_access_token=${window.localStorage.getItem( - 'access_token', - )}`, - 'Content-Type': 'application/json', - Authorization: `Bearer ${TokenName}`, - 'X-CSRFToken': `${window.localStorage.getItem('access_token')}`, - Referer: `${Cypress.config().baseUrl}/`, - }, - }) - .then(resp => resp), +Cypress.Commands.add('createSampleCharts', (indexes?: number[]) => + cy.cleanCharts().then(() => { + for (let i = 0; i < CHART_FIXTURES.length; i += 1) { + if (indexes?.includes(i) || !indexes) { + cy.request({ + method: 'POST', + url: `/api/v1/chart/`, + body: CHART_FIXTURES[i], + failOnStatusCode: false, + headers: { + Cookie: `csrf_access_token=${window.localStorage.getItem( + 'access_token', + )}`, + 'Content-Type': 'application/json', + 'X-CSRFToken': `${window.localStorage.getItem('access_token')}`, + Referer: `${Cypress.config().baseUrl}/`, + }, + }); + } + } + }), +); + +Cypress.Commands.add( + 'deleteDashboardByName', + (dashboardName: string, failOnStatusCode = false) => + cy.getDashboards().then((sampleDashboards?: Record<string, any>[]) => { + const dashboard = sampleDashboards?.find( + d => d.dashboard_title === dashboardName, + ); + if (dashboard) { + cy.deleteDashboard(dashboard.id, failOnStatusCode); + } + }), ); -Cypress.Commands.add('getDashboards', () => +Cypress.Commands.add( + 'deleteDashboard', + (id: number, failOnStatusCode = false) => + cy + .request({ + failOnStatusCode, + method: 'DELETE', + url: `api/v1/dashboard/${id}`, + headers: { + Cookie: `csrf_access_token=${window.localStorage.getItem( + 'access_token', + )}`, + 'Content-Type': 'application/json', + 'X-CSRFToken': `${window.localStorage.getItem('access_token')}`, + Referer: `${Cypress.config().baseUrl}/`, + }, + }) + .then(resp => resp), +); + +Cypress.Commands.add('getDashboards', () => { + cy.request({ + method: 'GET', + url: `api/v1/dashboard/`, + headers: { + 'Content-Type': 'application/json', + }, + }).then(resp => resp.body.result); +}); + +Cypress.Commands.add('getDashboard', (dashboardId: string | number) => cy .request({ method: 'GET', - url: `api/v1/dashboard/`, + url: `api/v1/dashboard/${dashboardId}`, headers: { 'Content-Type': 'application/json', - Authorization: `Bearer ${TokenName}`, }, }) .then(resp => resp.body.result), ); -Cypress.Commands.add('deleteChart', (id: number) => +Cypress.Commands.add( + 'updateDashboard', + (dashboardId: number, body: Record<string, any>) => + cy + .request({ + method: 'PUT', + url: `api/v1/dashboard/${dashboardId}`, + body, + headers: { + 'Content-Type': 'application/json', + }, + }) + .then(resp => resp.body.result), +); + +Cypress.Commands.add('deleteChart', (id: number, failOnStatusCode = false) => cy .request({ + failOnStatusCode, method: 'DELETE', url: `api/v1/chart/${id}`, headers: { @@ -162,11 +362,9 @@ Cypress.Commands.add('deleteChart', (id: number) => 'access_token', )}`, 'Content-Type': 'application/json', - Authorization: `Bearer ${TokenName}`, 'X-CSRFToken': `${window.localStorage.getItem('access_token')}`, Referer: `${Cypress.config().baseUrl}/`, }, - failOnStatusCode: false, }) .then(resp => resp), ); @@ -178,19 +376,18 @@ Cypress.Commands.add('getCharts', () => url: `api/v1/chart/`, headers: { 'Content-Type': 'application/json', - Authorization: `Bearer ${TokenName}`, }, }) .then(resp => resp.body.result), ); -Cypress.Commands.add('deleteChartByName', (name: string) => - cy.getCharts().then((slices: any) => { - slices?.forEach((element: any) => { - if (element.slice_name === name) { - const elementId = element.id; - cy.deleteChart(elementId); +Cypress.Commands.add( + 'deleteChartByName', + (sliceName: string, failOnStatusCode = false) => + cy.getCharts().then((sampleCharts?: Record<string, any>[]) => { + const chart = sampleCharts?.find(c => c.slice_name === sliceName); + if (chart) { + cy.deleteChart(chart.id, failOnStatusCode); } - }); - }), + }), ); diff --git a/superset-frontend/cypress-base/cypress/utils/index.ts b/superset-frontend/cypress-base/cypress/utils/index.ts index ea0bbdcf437b..2f06efc22c25 100644 --- a/superset-frontend/cypress-base/cypress/utils/index.ts +++ b/superset-frontend/cypress-base/cypress/utils/index.ts @@ -16,5 +16,111 @@ * specific language governing permissions and limitations * under the License. */ +import { getChartAlias, Slice } from 'cypress/utils/vizPlugins'; + export * from './vizPlugins'; export { default as parsePostForm } from './parsePostForm'; +export interface ChartSpec { + name: string; + viz: string; +} + +export function setGridMode(type: 'card' | 'list') { + cy.get(`[aria-label="${type}-view"]`).click(); +} + +export function toggleBulkSelect() { + cy.getBySel('bulk-select').click(); +} + +export function clearAllInputs() { + cy.get('body').then($body => { + if ($body.find('.ant-select-clear').length) { + cy.get('.ant-select-clear').click({ multiple: true, force: true }); + } + }); +} + +const toSlicelike = ($chart: JQuery<HTMLElement>): Slice => ({ + slice_id: parseInt($chart.attr('data-test-chart-id')!, 10), + form_data: { + viz_type: $chart.attr('data-test-viz-type')!, + }, +}); + +export function getChartAliasBySpec(chart: ChartSpec) { + return getChartGridComponent(chart).then($chart => + cy.wrap(getChartAlias(toSlicelike($chart))), + ); +} + +export function getChartAliasesBySpec(charts: readonly ChartSpec[]) { + const aliases: string[] = []; + charts.forEach(chart => + getChartAliasBySpec(chart).then(alias => { + aliases.push(alias); + }), + ); + // Wrapping the aliases is key. + // That way callers can chain off this function + // and actually get the list of aliases. + return cy.wrap(aliases); +} + +export function getChartGridComponent({ name, viz }: ChartSpec) { + return cy + .get(`[data-test-chart-name="${name}"]`) + .should('have.attr', 'data-test-viz-type', viz); +} + +export function waitForChartLoad(chart: ChartSpec) { + return getChartGridComponent(chart).then(gridComponent => { + const chartId = gridComponent.attr('data-test-chart-id'); + // the chart should load in under half a minute + return ( + cy + // this id only becomes visible when the chart is loaded + .get(`#chart-id-${chartId}`, { + timeout: 30000, + }) + .should('be.visible') + // return the chart grid component + .then(() => gridComponent) + ); + }); +} + +/** + * Drag an element and drop it to another element. + * Usage: + * drag(source).to(target); + */ +export function drag(selector: string, content: string | number | RegExp) { + const dataTransfer = { data: {} }; + return { + to(target: string | Cypress.Chainable) { + cy.get('.dragdroppable') + .contains(selector, content) + .trigger('mousedown', { which: 1, force: true }) + .trigger('dragstart', { dataTransfer, force: true }) + .trigger('drag', { force: true }); + + (typeof target === 'string' ? cy.get(target) : target) + .trigger('dragover', { dataTransfer, force: true }) + .trigger('drop', { dataTransfer, force: true }) + .trigger('dragend', { dataTransfer, force: true }) + .trigger('mouseup', { which: 1, force: true }); + }, + }; +} + +export function resize(selector: string) { + return { + to(cordX: number, cordY: number) { + cy.get(selector) + .trigger('mousedown', { which: 1, force: true }) + .trigger('mousemove', { which: 1, cordX, cordY, force: true }) + .trigger('mouseup', { which: 1, force: true }); + }, + }; +} diff --git a/superset-frontend/cypress-base/cypress/utils/urls.ts b/superset-frontend/cypress-base/cypress/utils/urls.ts new file mode 100644 index 000000000000..ee35c3088c0f --- /dev/null +++ b/superset-frontend/cypress-base/cypress/utils/urls.ts @@ -0,0 +1,30 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export const DASHBOARD_LIST = '/dashboard/list/'; +export const CHART_LIST = '/chart/list/'; +export const WORLD_HEALTH_DASHBOARD = '/superset/dashboard/world_health/'; +export const SAMPLE_DASHBOARD_1 = '/superset/dashboard/1-sample-dashboard/'; +export const SUPPORTED_CHARTS_DASHBOARD = + '/superset/dashboard/supported_charts_dash/'; +export const TABBED_DASHBOARD = '/superset/dashboard/tabbed_dash/'; +export const DATABASE_LIST = '/databaseview/list'; +export const DATASET_LIST_PATH = 'tablemodelview/list'; +export const ALERT_LIST = '/alert/list/'; +export const REPORT_LIST = '/report/list/'; diff --git a/superset-frontend/cypress-base/package-lock.json b/superset-frontend/cypress-base/package-lock.json index 1936f68ea7fe..d312898441d3 100644 --- a/superset-frontend/cypress-base/package-lock.json +++ b/superset-frontend/cypress-base/package-lock.json @@ -12,6 +12,7 @@ "@applitools/eyes-cypress": "^3.25.3", "@cypress/code-coverage": "^3.9.11", "@superset-ui/core": "^0.18.8", + "brace": "^0.11.1", "cy-verify-downloads": "^0.1.6", "querystringify": "^2.2.0", "react-dom": "^16.13.0", @@ -3577,6 +3578,11 @@ "node": ">=0.6" } }, + "node_modules/brace": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/brace/-/brace-0.11.1.tgz", + "integrity": "sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -6203,9 +6209,9 @@ } }, "node_modules/got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -6441,9 +6447,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-errors": { "version": "1.7.2", @@ -7279,12 +7285,9 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "node_modules/json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dependencies": { - "minimist": "^1.2.5" - }, + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -7786,9 +7789,9 @@ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8535,9 +8538,9 @@ } }, "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "engines": { "node": ">=0.6" } @@ -13216,6 +13219,11 @@ } } }, + "brace": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/brace/-/brace-0.11.1.tgz", + "integrity": "sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -15284,9 +15292,9 @@ } }, "got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "requires": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -15456,9 +15464,9 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-errors": { "version": "1.7.2", @@ -16064,12 +16072,9 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "6.1.0", @@ -16454,9 +16459,9 @@ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -17033,9 +17038,9 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" }, "querystring": { "version": "0.2.0", diff --git a/superset-frontend/cypress-base/package.json b/superset-frontend/cypress-base/package.json index 02c126406cb2..b28c684544a5 100644 --- a/superset-frontend/cypress-base/package.json +++ b/superset-frontend/cypress-base/package.json @@ -13,6 +13,7 @@ "@applitools/eyes-cypress": "^3.25.3", "@cypress/code-coverage": "^3.9.11", "@superset-ui/core": "^0.18.8", + "brace": "^0.11.1", "cy-verify-downloads": "^0.1.6", "querystringify": "^2.2.0", "react-dom": "^16.13.0", diff --git a/superset-frontend/jest.config.js b/superset-frontend/jest.config.js index 0d66ade8b366..d537b2993b21 100644 --- a/superset-frontend/jest.config.js +++ b/superset-frontend/jest.config.js @@ -26,7 +26,7 @@ module.exports = { '\\.svg$': '<rootDir>/spec/__mocks__/svgrMock.tsx', '^src/(.*)$': '<rootDir>/src/$1', '^spec/(.*)$': '<rootDir>/spec/$1', - // mapping plugins of superset-ui to souce code + // mapping plugins of superset-ui to source code '@superset-ui/(.*)$': '<rootDir>/node_modules/@superset-ui/$1/src', }, testEnvironment: 'jsdom', diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 55e37e16cf1e..83c5c8d6ed90 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "superset", - "version": "2.0.1", + "version": "0.0.0-dev", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "superset", - "version": "2.0.1", + "version": "0.0.0-dev", "license": "Apache-2.0", "workspaces": [ "packages/*", @@ -15,7 +15,7 @@ "dependencies": { "@ag-grid-community/react": "^26.0.0", "@ag-grid-enterprise/all-modules": "^26.0.0", - "@ant-design/icons": "^4.2.2", + "@ant-design/icons": "^4.8.0", "@babel/runtime-corejs3": "^7.12.5", "@data-ui/sparkline": "^0.0.84", "@emotion/babel-preset-css-prop": "^11.2.0", @@ -52,10 +52,10 @@ "@superset-ui/plugin-chart-word-cloud": "file:./plugins/plugin-chart-word-cloud", "@superset-ui/preset-chart-xy": "file:./plugins/preset-chart-xy", "@superset-ui/switchboard": "file:./packages/superset-ui-switchboard", - "@vx/responsive": "^0.0.195", + "@visx/responsive": "^3.0.0", "abortcontroller-polyfill": "^1.1.9", "ace-builds": "^1.4.14", - "antd": "^4.9.4", + "antd": "4.10.3", "array-move": "^2.2.1", "babel-plugin-typescript-to-proptypes": "^2.0.0", "bootstrap": "^3.4.1", @@ -65,6 +65,7 @@ "chrono-node": "^2.2.6", "classnames": "^2.2.5", "core-js": "^3.6.5", + "currencyformatter.js": "^2.2.0", "d3-array": "^1.2.4", "d3-color": "^1.2.0", "d3-scale": "^2.1.2", @@ -78,7 +79,7 @@ "global-box": "^1.2.0", "html-webpack-plugin": "^5.3.2", "immer": "^9.0.6", - "interweave": "^11.2.0", + "interweave": "^13.0.0", "jquery": "^3.5.1", "js-levenshtein": "^1.1.6", "js-yaml-loader": "^1.2.2", @@ -86,11 +87,11 @@ "json-stringify-pretty-compact": "^2.0.0", "lodash": "^4.17.21", "lodash-es": "^4.17.21", - "mapbox-gl": "^2.8.2", + "mapbox-gl": "^2.10.0", "match-sorter": "^6.1.0", "memoize-one": "^5.1.1", "moment": "^2.26.0", - "moment-timezone": "^0.5.33", + "moment-timezone": "^0.5.37", "mousetrap": "^1.6.1", "mustache": "^2.2.1", "polished": "^3.7.2", @@ -98,39 +99,39 @@ "query-string": "^6.13.7", "re-resizable": "^6.6.1", "react": "^16.13.1", - "react-ace": "^9.4.4", - "react-checkbox-tree": "^1.5.1", + "react-ace": "^10.1.0", + "react-checkbox-tree": "^1.8.0", "react-color": "^2.13.8", - "react-datetime": "^3.0.4", + "react-datetime": "^3.2.0", + "react-diff-viewer-continued": "^3.2.5", "react-dnd": "^11.1.3", "react-dnd-html5-backend": "^11.1.3", "react-dom": "^16.13.0", "react-draggable": "^4.4.3", "react-gravatar": "^2.6.1", - "react-hot-loader": "^4.12.20", - "react-icons": "^4.2.0", + "react-hot-loader": "^4.13.1", + "react-intersection-observer": "^9.4.1", "react-js-cron": "^1.2.0", - "react-json-tree": "^0.11.2", - "react-jsonschema-form": "^1.2.0", + "react-json-tree": "^0.17.0", + "react-jsonschema-form": "^1.8.1", "react-lines-ellipsis": "^0.15.0", "react-loadable": "^5.5.0", - "react-redux": "^7.2.0", - "react-resize-detector": "^6.7.6", - "react-reverse-portal": "^2.0.1", - "react-router-dom": "^5.1.2", + "react-query": "^3.39.2", + "react-redux": "^7.2.8", + "react-resize-detector": "^7.1.2", + "react-reverse-portal": "^2.1.1", + "react-router-dom": "^5.3.4", "react-search-input": "^0.11.3", - "react-select": "^3.1.0", - "react-sortable-hoc": "^1.11.0", + "react-select": "^3.2.0", + "react-sortable-hoc": "^2.0.0", "react-split": "^2.0.9", - "react-sticky": "^6.0.3", "react-syntax-highlighter": "^15.4.5", - "react-table": "^7.6.3", + "react-table": "^7.8.0", "react-transition-group": "^2.5.3", - "react-ultimate-pagination": "^1.2.0", + "react-ultimate-pagination": "^1.3.0", "react-virtualized": "9.19.1", - "react-virtualized-auto-sizer": "^1.0.2", - "react-virtualized-select": "^3.1.3", - "react-window": "^1.8.5", + "react-virtualized-auto-sizer": "^1.0.7", + "react-window": "^1.8.8", "redux": "^4.0.5", "redux-localstorage": "^0.4.1", "redux-thunk": "^2.1.0", @@ -142,30 +143,31 @@ "shortid": "^2.2.6", "tinycolor2": "^1.4.2", "urijs": "^1.19.8", - "use-immer": "^0.6.0", + "use-immer": "^0.8.1", "use-query-params": "^1.1.9", "yargs": "^15.4.1" }, "devDependencies": { "@ag-grid-community/react": "^26.0.0", "@ag-grid-enterprise/all-modules": "^26.0.0", - "@applitools/eyes-storybook": "^3.27.6", - "@babel/cli": "^7.16.0", - "@babel/compat-data": "^7.15.0", - "@babel/core": "^7.15.5", - "@babel/eslint-parser": "^7.15.7", - "@babel/node": "^7.15.4", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@applitools/eyes-storybook": "^3.30.1", + "@babel/cli": "^7.18.10", + "@babel/compat-data": "^7.18.8", + "@babel/core": "^7.18.10", + "@babel/eslint-parser": "^7.18.9", + "@babel/node": "^7.18.10", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.15.0", - "@babel/preset-env": "^7.15.6", - "@babel/preset-react": "^7.14.5", - "@babel/register": "^7.15.3", + "@babel/plugin-transform-runtime": "^7.18.10", + "@babel/preset-env": "^7.18.10", + "@babel/preset-react": "^7.18.6", + "@babel/register": "^7.18.9", "@emotion/jest": "^11.3.0", "@hot-loader/react-dom": "^16.13.0", "@istanbuljs/nyc-config-typescript": "^1.0.1", "@storybook/addon-actions": "^6.4.22", + "@storybook/addon-docs": "^6.5.10", "@storybook/addon-essentials": "^6.4.22", "@storybook/addon-knobs": "^6.3.1", "@storybook/addon-links": "^6.4.22", @@ -187,7 +189,7 @@ "@types/jest": "^26.0.3", "@types/jquery": "^3.5.8", "@types/js-levenshtein": "^1.1.0", - "@types/json-bigint": "^1.0.0", + "@types/json-bigint": "^1.0.1", "@types/react": "^16.9.43", "@types/react-dom": "^16.9.8", "@types/react-gravatar": "^2.6.8", @@ -195,13 +197,12 @@ "@types/react-jsonschema-form": "^1.7.4", "@types/react-loadable": "^5.5.6", "@types/react-redux": "^7.1.10", - "@types/react-router-dom": "^5.1.5", + "@types/react-router-dom": "^5.3.3", "@types/react-select": "^3.0.19", - "@types/react-sticky": "^6.0.3", "@types/react-table": "^7.0.19", "@types/react-ultimate-pagination": "^1.2.0", "@types/react-virtualized": "^9.21.10", - "@types/react-window": "^1.8.2", + "@types/react-window": "^1.8.5", "@types/redux-localstorage": "^1.0.8", "@types/redux-mock-store": "^1.0.2", "@types/rison": "0.0.6", @@ -216,12 +217,13 @@ "babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-jsx-remove-data-test-id": "^2.1.3", "babel-plugin-lodash": "^3.3.4", + "chromatic": "^6.7.4", "copy-webpack-plugin": "^9.0.1", "cross-env": "^5.2.0", "css-loader": "^6.2.0", "css-minimizer-webpack-plugin": "^3.0.2", - "enzyme": "^3.10.0", - "enzyme-adapter-react-16": "^1.14.0", + "enzyme": "^3.11.0", + "enzyme-adapter-react-16": "^1.15.7", "eslint": "^7.32.0", "eslint-config-airbnb": "^18.2.1", "eslint-config-prettier": "^7.1.0", @@ -242,14 +244,15 @@ "exports-loader": "^0.7.0", "fetch-mock": "^7.7.3", "fork-ts-checker-webpack-plugin": "^6.3.3", + "history": "^4.10.1", "ignore-styles": "^5.0.1", "imports-loader": "^3.0.0", "jest": "^26.6.3", "jest-environment-enzyme": "^7.1.2", "jest-enzyme": "^7.1.2", "jest-websocket-mock": "^2.2.0", - "jsdom": "^16.4.0", - "lerna": "^4.0.0", + "jsdom": "^20.0.0", + "lerna": "^6.1.0", "less": "^3.12.2", "less-loader": "^10.2.0", "mini-css-extract-plugin": "^2.3.0", @@ -275,7 +278,7 @@ "webpack": "^5.52.1", "webpack-bundle-analyzer": "^4.4.2", "webpack-cli": "^4.8.0", - "webpack-dev-server": "^4.2.0", + "webpack-dev-server": "^4.10.1", "webpack-manifest-plugin": "^4.0.2", "webpack-sources": "^3.2.0" }, @@ -285,35 +288,43 @@ } }, "node_modules/@actions/core": { - "version": "1.6.0", - "integrity": "sha512-NB1UAZomZlCV/LmJqkLhNTqtKfFXJZAUPcfl/zqG7EfsQdeUJtaWO98SGbuQ3pydJ3fHl2CvI/51OKYlCYYcaw==", + "version": "1.9.1", + "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", "dev": true, "dependencies": { - "@actions/http-client": "^1.0.11" + "@actions/http-client": "^2.0.1", + "uuid": "^8.3.2" + } + }, + "node_modules/@actions/core/node_modules/uuid": { + "version": "8.3.2", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/@actions/github": { - "version": "5.0.0", - "integrity": "sha512-QvE9eAAfEsS+yOOk0cylLBIO/d6WyWIOvsxxzdrPFaud39G6BOkUwScXZn1iBzQzHyu9SBkkLSWlohDWdsasAQ==", + "version": "5.0.3", + "integrity": "sha512-myjA/pdLQfhUGLtRZC/J4L1RXOG4o6aYdiEq+zr5wVVKljzbFld+xv10k1FX6IkIJtNxbAq44BdwSNpQ015P0A==", "dev": true, "dependencies": { - "@actions/http-client": "^1.0.11", - "@octokit/core": "^3.4.0", - "@octokit/plugin-paginate-rest": "^2.13.3", - "@octokit/plugin-rest-endpoint-methods": "^5.1.1" + "@actions/http-client": "^2.0.1", + "@octokit/core": "^3.6.0", + "@octokit/plugin-paginate-rest": "^2.17.0", + "@octokit/plugin-rest-endpoint-methods": "^5.13.0" } }, "node_modules/@actions/http-client": { - "version": "1.0.11", - "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==", + "version": "2.0.1", + "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", "dev": true, "dependencies": { - "tunnel": "0.0.6" + "tunnel": "^0.0.6" } }, "node_modules/@ag-grid-community/all-modules": { "version": "26.2.1", - "resolved": "https://registry.npmjs.org/@ag-grid-community/all-modules/-/all-modules-26.2.1.tgz", "integrity": "sha512-zO8PFBSiChQEmJLmWe/gaKhDOPvOR+4yWlTmfIBTWZ/j/zhJSeCNHor6WQGakgfONrNOq0P6yQjVu0d7JFi7mA==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, @@ -326,7 +337,6 @@ }, "node_modules/@ag-grid-community/client-side-row-model": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-community/client-side-row-model/-/client-side-row-model-26.2.0.tgz", "integrity": "sha512-kW5lMsK5WEXaqZMfHbLRj+EvxLhPW6qtDv61PyDcv+/91lwm2p5dT/iUBppavSwJDiNul+wntpyIlTulZgokwA==", "dev": true, "dependencies": { @@ -335,13 +345,11 @@ }, "node_modules/@ag-grid-community/core": { "version": "26.2.1", - "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-26.2.1.tgz", "integrity": "sha512-E2e3rZoZ90QtgO320kmlrm7kFbzFkCyrvCWYUQshJJU/UzCqr6DffVAXTaeehPNLzHBybANxWbSbFab9LQLIwQ==", "dev": true }, "node_modules/@ag-grid-community/csv-export": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-community/csv-export/-/csv-export-26.2.0.tgz", "integrity": "sha512-2QqzmYIqqXpPwvIiIpWXV9VWKVK5mLdZI3RVnZdgWGCyTD0OAqWPgqY5LapVpyxGfE/oUm7s9O7ux7EFiTdEcA==", "dev": true, "dependencies": { @@ -350,7 +358,6 @@ }, "node_modules/@ag-grid-community/infinite-row-model": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-community/infinite-row-model/-/infinite-row-model-26.2.0.tgz", "integrity": "sha512-wA4qSYD/XdvrjVQ6gdENaX++QlQufndWJonl7oVCPzxw7fO3H1i8DFpfr2fe/BXwrcDM1LeJ5HM6jzIuKIrddg==", "dev": true, "dependencies": { @@ -359,7 +366,6 @@ }, "node_modules/@ag-grid-community/react": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-community/react/-/react-26.2.0.tgz", "integrity": "sha512-IWNSuyoiRkIbRpoz+Nvagyz8MsoQbTVQ25ixj75VNAyShK/xWus92FMQQFFQBR11Pb3paZeEttrmF0D8WEFLTQ==", "dev": true, "dependencies": { @@ -373,7 +379,6 @@ }, "node_modules/@ag-grid-enterprise/all-modules": { "version": "26.2.1", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/all-modules/-/all-modules-26.2.1.tgz", "integrity": "sha512-UhpdeQwgYQqYtCv7Mm5qncsnbwqDohZGjTtCBcbq5tQ5NkURgmoiJbVAQzF0myK5K2BxxOejVytONj18uCSSrg==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, @@ -401,7 +406,6 @@ }, "node_modules/@ag-grid-enterprise/charts": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/charts/-/charts-26.2.0.tgz", "integrity": "sha512-Y3G2PzyjypR5o1c+1A1VEhTxEvhIvyYWMMTn2KexGtTOBhDqZPB1LyAS8+L7RBhRdtvydXnj3IQBPdQFmhK4Fw==", "dev": true, "dependencies": { @@ -413,7 +417,6 @@ }, "node_modules/@ag-grid-enterprise/clipboard": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/clipboard/-/clipboard-26.2.0.tgz", "integrity": "sha512-24y+IgJrNz6f3WIWxBHzyP32rW932YMagiX0MbJqRfepu32N71DGlXqjuGawXDRLYTbgpQ1196X2otqTQkJK5Q==", "dev": true, "dependencies": { @@ -424,7 +427,6 @@ }, "node_modules/@ag-grid-enterprise/column-tool-panel": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/column-tool-panel/-/column-tool-panel-26.2.0.tgz", "integrity": "sha512-jdYT5cpgkoah0P0Bz3uiiqgakcj9EKS074r5pdMNZc944enFzD+vcYI0qnH/3Ugm1cBgYVB41UeIxBdubfGUYw==", "dev": true, "dependencies": { @@ -436,7 +438,6 @@ }, "node_modules/@ag-grid-enterprise/core": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/core/-/core-26.2.0.tgz", "integrity": "sha512-meYGtrgkEG/OvR02Z5ndSXV85ZbD2hxoUQ84rZx6/lr/U1QOmEIhzWJS3c1iqkzQrWWlDxk8JA7aHv1F+w4ysQ==", "dev": true, "dependencies": { @@ -445,7 +446,6 @@ }, "node_modules/@ag-grid-enterprise/excel-export": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/excel-export/-/excel-export-26.2.0.tgz", "integrity": "sha512-UVIau2DSh0H3gp3yzQUIdsIOrx2peDUXx9/Av69WH5H5qOb6C0c3oUAqQ80HUUy6rdWrW1nwVXGkKF4meJFupg==", "dev": true, "dependencies": { @@ -456,7 +456,6 @@ }, "node_modules/@ag-grid-enterprise/filter-tool-panel": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/filter-tool-panel/-/filter-tool-panel-26.2.0.tgz", "integrity": "sha512-1xONvJdoXeA1Hgmkt/evvHiAdjrvRNswLW3cLIdUifGSZOQ/vpQRleUsa0BEsYemrP0VU5ouIDrdypz42w2egA==", "dev": true, "dependencies": { @@ -467,7 +466,6 @@ }, "node_modules/@ag-grid-enterprise/master-detail": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/master-detail/-/master-detail-26.2.0.tgz", "integrity": "sha512-nTOJ92IGXY/hK693JHO2wvFUjLxkg8fjcH6augp99LaVI5tyA9i/WSjfuiPdiCRY3nYnwiRm1i9vtHbFDs3aRw==", "dev": true, "dependencies": { @@ -477,7 +475,6 @@ }, "node_modules/@ag-grid-enterprise/menu": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/menu/-/menu-26.2.0.tgz", "integrity": "sha512-EVBzLtRQe/kfW7l6DyRmFVbo10/yxf72X0h+afGVVp5VMjM5sTdSyvGvScRlzEGQXvptknnqjVNk6WfY9KbSNg==", "dev": true, "dependencies": { @@ -488,7 +485,6 @@ }, "node_modules/@ag-grid-enterprise/multi-filter": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/multi-filter/-/multi-filter-26.2.0.tgz", "integrity": "sha512-CH5bS0MktZhFifbGgOVicXXWOELeZ6cRDLFpZj9smznB7Ct24Ni8/ormTyBbQP7xhmlVOPe/mE9h3YC1HH18pw==", "dev": true, "dependencies": { @@ -499,7 +495,6 @@ }, "node_modules/@ag-grid-enterprise/range-selection": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/range-selection/-/range-selection-26.2.0.tgz", "integrity": "sha512-AUQsWsPH9F2PEbcUMbAldcCZQf4k2L8AU45bPKANph9dCH1/JFb7qlQAHxroOzkpvjTqyT6PjaD8vYm8Cfdvvg==", "dev": true, "dependencies": { @@ -509,7 +504,6 @@ }, "node_modules/@ag-grid-enterprise/rich-select": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/rich-select/-/rich-select-26.2.0.tgz", "integrity": "sha512-qVOHIzElUJowehZylUBO2zyNFd+3DN5m3o29WFgEM6hDsflJqdnAR/BkUYinYIi5kLXt+t00O9N2HB5XkMd+bQ==", "dev": true, "dependencies": { @@ -519,7 +513,6 @@ }, "node_modules/@ag-grid-enterprise/row-grouping": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/row-grouping/-/row-grouping-26.2.0.tgz", "integrity": "sha512-uZF65ZzXGWEfNUjQYD0SPUW1aIS6etKN7SD5wmoM6PFIVFEZNiUpQCC9nO3Jz+rSyQ+VQ89SFJCiXvoeH9F3MA==", "dev": true, "dependencies": { @@ -529,7 +522,6 @@ }, "node_modules/@ag-grid-enterprise/server-side-row-model": { "version": "26.2.1", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/server-side-row-model/-/server-side-row-model-26.2.1.tgz", "integrity": "sha512-0WielbIJ8mm4tcTbDWqvVnc+E+s4IHLEy7dzgC7xhCDJR4LUJenT6xoBKThID5arXmitsgB7C574wXP0/IEdpQ==", "dev": true, "dependencies": { @@ -539,7 +531,6 @@ }, "node_modules/@ag-grid-enterprise/set-filter": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/set-filter/-/set-filter-26.2.0.tgz", "integrity": "sha512-YbqwhnnaI3J72NrJOS9dzrMDnc6O2NAEUeoybU/abbjqjYGrSXkE3SuYPP7tfMic7p6Y4/yCYqFLxo98UmiLfQ==", "dev": true, "dependencies": { @@ -549,7 +540,6 @@ }, "node_modules/@ag-grid-enterprise/side-bar": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/side-bar/-/side-bar-26.2.0.tgz", "integrity": "sha512-OzxBDazfyXqMSlttwsi5PfSas4YCIfB5xqrtzT7nKn/231mZJTIDuywIPddrWzY3ml6F0fntLl4CQtBlIIkEMA==", "dev": true, "dependencies": { @@ -559,7 +549,6 @@ }, "node_modules/@ag-grid-enterprise/sparklines": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/sparklines/-/sparklines-26.2.0.tgz", "integrity": "sha512-nbgxvpFDk2cldFikozmfw+ThRxTzH1jN6Tem2uxRRRz2QVvF8zmYAxT/reQHOUq5r8K3MAnjV6Lrf84mcWTwSg==", "dev": true, "dependencies": { @@ -569,7 +558,6 @@ }, "node_modules/@ag-grid-enterprise/status-bar": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/status-bar/-/status-bar-26.2.0.tgz", "integrity": "sha512-UTpZaDMdb+uVZSxKOvRQk9TWXwbMNWX5brTpDkdqrJiVtQToN9SLbenee9CEvXHm9I8OAo0Zb9ulbfBaBAUbNQ==", "dev": true, "dependencies": { @@ -579,7 +567,6 @@ }, "node_modules/@ag-grid-enterprise/viewport-row-model": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/viewport-row-model/-/viewport-row-model-26.2.0.tgz", "integrity": "sha512-9uyZc7Cc9a+4bW7Jzkbcv4QIGHD2m6BPReaTkL6MJS3TyXLewsQGKSnbpi3jL3Ca8XCJo2rZe14lRN981KaaZg==", "dev": true, "dependencies": { @@ -587,53 +574,107 @@ "@ag-grid-enterprise/core": "~26.2.0" } }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@ant-design/colors": { - "version": "3.2.2", - "integrity": "sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ==", + "version": "6.0.0", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", "dependencies": { - "tinycolor2": "^1.4.1" + "@ctrl/tinycolor": "^3.4.0" } }, "node_modules/@ant-design/icons": { - "version": "4.2.2", - "integrity": "sha512-DrVV+wcupnHS7PehJ6KiTcJtAR5c25UMgjGECCc6pUT9rsvw0AuYG+a4HDjfxEQuDqKTHwW+oX/nIvCymyLE8Q==", + "version": "4.8.0", + "integrity": "sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==", "dependencies": { - "@ant-design/colors": "^3.1.0", - "@ant-design/icons-svg": "^4.0.0", - "@babel/runtime": "^7.10.4", + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1", + "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", - "insert-css": "^2.0.0", - "rc-util": "^5.0.1" + "rc-util": "^5.9.4" }, "engines": { "node": ">=8" }, "peerDependencies": { - "react": "16.x" + "react": ">=16.0.0", + "react-dom": ">=16.0.0" } }, "node_modules/@ant-design/icons-svg": { - "version": "4.1.0", - "integrity": "sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ==" + "version": "4.2.1", + "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" }, - "node_modules/@ant-design/react-slick": { - "version": "0.27.14", - "integrity": "sha512-s6JVexqFmU5rs5Pm828ojtm5rCp8jDXyrc5OxEtCE2z58SIyQlkpnU9BJh98LEeBZyj02WFkGN8CWpSaD+G4PA==", + "node_modules/@applitools/core": { + "version": "1.3.7", + "integrity": "sha512-ZMJlZXw0pKFdRgXT+2OiPUQIrq8gjdqF1Z8AQGwuMrUftejIZjtweCnfXB54WCx3moA3vSJR7hlCgBV4MQ2bcg==", + "dev": true, + "dependencies": { + "@applitools/core-base": "1.1.24", + "@applitools/dom-capture": "11.2.0", + "@applitools/dom-snapshot": "4.7.3", + "@applitools/driver": "1.11.21", + "@applitools/logger": "1.1.36", + "@applitools/nml-client": "1.3.22", + "@applitools/req": "1.1.23", + "@applitools/screenshoter": "3.7.20", + "@applitools/snippets": "2.4.12", + "@applitools/ufg-client": "1.1.12", + "@applitools/utils": "1.3.22", + "abort-controller": "3.0.0", + "chalk": "4.1.2", + "node-fetch": "2.6.7", + "throat": "6.0.1" + }, + "bin": { + "eyes-check-network": "dist/troubleshoot/check-network.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@applitools/core-base": { + "version": "1.1.24", + "integrity": "sha512-LvJLP9EpxidadtcXJivH0AIgWJqLNqsxrPyEv+Jb8nLRl+8YOjoo+06wk3leD0lATS2awlEDa267uz4GNEbrRQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.10.4", - "classnames": "^2.2.5", - "json2mq": "^0.2.0", - "lodash": "^4.17.15", - "resize-observer-polyfill": "^1.5.0" + "@applitools/image": "1.0.17", + "@applitools/logger": "1.1.36", + "@applitools/req": "1.1.23", + "@applitools/utils": "1.3.22" }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0", - "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0" + "engines": { + "node": ">=12.13.0" } }, + "node_modules/@applitools/core/node_modules/throat": { + "version": "6.0.1", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, "node_modules/@applitools/dom-capture": { - "version": "11.1.0", - "integrity": "sha512-99NdLnHuoTT0EBDMixp19QLAZV704ztQjJfcvJZNmi5FnFzsnVpgTwRhgH5SA1JobQ09yMS9wvy0ekrpdX8lIw==", + "version": "11.2.0", + "integrity": "sha512-zFfYgvdXq5oTpLuYvOJdkh7jsbAxajOpD67pVoKc27lKwE0CGaM9I0Uf+qGh7GYtY93qyzMWBzqC7C8JlSK1gA==", "dev": true, "dependencies": { "@applitools/dom-shared": "1.0.5", @@ -652,13 +693,13 @@ } }, "node_modules/@applitools/dom-snapshot": { - "version": "4.5.12", - "integrity": "sha512-YeuAOQ0+AB7HCMPAHqpnOq5xCOXfIyC/2/h3XurOuzE+qFekK9SPMBRaJn4jDYyAFK/Eeu4v7CGW+LPAUGiZfA==", + "version": "4.7.3", + "integrity": "sha512-bovKLsjR6peaTurR35d2Ik6N+NOVeMW4FTjI6I6ZSLjzJ9XtzNGXCQ7vkTKaSe6406vDMXdcAfIu7+s6C640xg==", "dev": true, "dependencies": { - "@applitools/dom-shared": "1.0.8", + "@applitools/dom-shared": "1.0.9", "@applitools/functional-commons": "1.6.0", - "css-tree": "1.0.0-alpha.39", + "css-tree": "2.3.1", "pako": "1.0.11" }, "engines": { @@ -666,185 +707,97 @@ } }, "node_modules/@applitools/dom-snapshot/node_modules/@applitools/dom-shared": { - "version": "1.0.8", - "integrity": "sha512-HQtYfFvtlPuE9ZShBamtW1LGW2Qq4HxjQx5nF7KiNvrRTlf5/e+AWpZhXCTVEhVkAcSNs/7xR2WvumOUd+usxg==", + "version": "1.0.9", + "integrity": "sha512-u6nRHBklRAaODILm0HRluE0IAwrnjs8AMNRBFxHThKGt4qpbkhnwazGMr4zDu3WCBjr/sA31kekUqNl0Jx3YeQ==", "dev": true, "engines": { "node": ">=8.9.0" } }, "node_modules/@applitools/dom-snapshot/node_modules/css-tree": { - "version": "1.0.0-alpha.39", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "version": "2.3.1", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, "dependencies": { - "mdn-data": "2.0.6", - "source-map": "^0.6.1" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=8.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, "node_modules/@applitools/dom-snapshot/node_modules/mdn-data": { - "version": "2.0.6", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "version": "2.0.30", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true }, - "node_modules/@applitools/dom-snapshot/node_modules/source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@applitools/dom-snapshot/node_modules/source-map-js": { + "version": "1.0.2", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/@applitools/driver": { - "version": "1.6.0", - "integrity": "sha512-oKssjHF01lpI71CJd98mhBbphcOoFE9YVxZGOuPdcnfPbM83txj3MrVmH/yVRF3cDiBBVHJL8cuskjygMPhbHw==", - "dev": true, - "dependencies": { - "@applitools/snippets": "2.2.2", - "@applitools/types": "1.3.0", - "@applitools/utils": "1.2.13" - }, - "engines": { - "node": ">= 8.9.0" - } - }, - "node_modules/@applitools/eyes-sdk-core": { - "version": "13.2.5", - "integrity": "sha512-TTPg0IaByB5gMRJIcC9yQsCNqXe3EK5yORLUnSzxwk4KQTFEj2C5/2DJFtcHx+rxEuvu40BZ6dHT0avmHboqnw==", - "dev": true, - "dependencies": { - "@applitools/dom-capture": "11.1.0", - "@applitools/dom-snapshot": "4.5.12", - "@applitools/driver": "1.6.0", - "@applitools/isomorphic-fetch": "3.0.0", - "@applitools/logger": "1.0.11", - "@applitools/screenshoter": "3.3.14", - "@applitools/snippets": "2.2.2", - "@applitools/types": "1.3.0", - "@applitools/utils": "1.2.13", - "axios": "0.26.0", - "chalk": "3.0.0", - "cosmiconfig": "6.0.0", - "dateformat": "3.0.3", - "debug": "4.3.3", - "deepmerge": "4.2.2", - "stack-trace": "0.0.10", - "tunnel": "0.0.6" - }, - "bin": { - "eyes-check-network": "bin/runCheckNetwork.js" - }, - "engines": { - "node": ">= 8.9.0" - } - }, - "node_modules/@applitools/eyes-sdk-core/node_modules/axios": { - "version": "0.26.0", - "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.8" - } - }, - "node_modules/@applitools/eyes-sdk-core/node_modules/chalk": { - "version": "3.0.0", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "1.11.21", + "integrity": "sha512-TsIVCThE3kn+/IBi2dDQ0/siXGecmXnkOND6dPW07W5WOR/e0T0EBgyD+O0QLiFQfv2ZijqlX/olS5EdXwin6g==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@applitools/logger": "1.1.36", + "@applitools/snippets": "2.4.12", + "@applitools/utils": "1.3.22", + "semver": "7.3.7" }, "engines": { - "node": ">=8" + "node": ">=12.13.0" } }, - "node_modules/@applitools/eyes-sdk-core/node_modules/cosmiconfig": { + "node_modules/@applitools/driver/node_modules/lru-cache": { "version": "6.0.0", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/@applitools/eyes-sdk-core/node_modules/debug": { - "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "node_modules/@applitools/driver/node_modules/semver": { + "version": "7.3.7", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" + "lru-cache": "^6.0.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@applitools/eyes-sdk-core/node_modules/deepmerge": { - "version": "4.2.2", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@applitools/eyes-sdk-core/node_modules/ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@applitools/eyes-sdk-core/node_modules/parse-json": { - "version": "5.2.0", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/@applitools/eyes-sdk-core/node_modules/path-type": { + "node_modules/@applitools/driver/node_modules/yallist": { "version": "4.0.0", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@applitools/eyes-storybook": { - "version": "3.27.6", - "integrity": "sha512-4vOMGqiF5HxbQhLPKLDwE7S+qr5W22J/C8GJ3fD0NLPXj8Nk5VMdmSp9vXz7AfB9iphGMvYfGjTNE37qz29bag==", + "version": "3.30.1", + "integrity": "sha512-lehBp+0qLI4PTshNg1LVueq82/Cx7+r8DPThbnP+pPrrfu0ERw/B8w5YRmwAHlBAsQB9IqRb3qqHu8nC2ktdpQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "@applitools/driver": "1.6.0", - "@applitools/eyes-sdk-core": "13.2.5", + "@applitools/core": "1.3.7", + "@applitools/driver": "1.11.21", "@applitools/functional-commons": "1.6.0", - "@applitools/logger": "1.0.11", + "@applitools/logger": "1.1.36", "@applitools/monitoring-commons": "1.0.19", - "@applitools/spec-driver-puppeteer": "1.1.1", - "@applitools/test-server": "1.0.8", - "@applitools/utils": "1.2.13", - "@applitools/visual-grid-client": "15.11.2", + "@applitools/spec-driver-puppeteer": "1.1.31", + "@applitools/test-server": "1.1.16", + "@applitools/ufg-client": "1.1.12", + "@applitools/utils": "1.3.22", "boxen": "4.2.0", "chalk": "3.0.0", "detect-port": "1.3.0", @@ -853,13 +806,14 @@ "ora": "3.4.0", "puppeteer": "10.2.0", "strip-ansi": "6.0.0", + "throat": "6.0.1", "yargs": "15.4.1" }, "bin": { "eyes-storybook": "bin/eyes-storybook.js" }, "engines": { - "node": ">=8.6.0" + "node": ">=12.13.0" } }, "node_modules/@applitools/eyes-storybook/node_modules/ansi-regex": { @@ -1104,6 +1058,11 @@ "node": ">=8" } }, + "node_modules/@applitools/eyes-storybook/node_modules/throat": { + "version": "6.0.1", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, "node_modules/@applitools/functional-commons": { "version": "1.6.0", "integrity": "sha512-fwiF0CbeYHDEOTD/NKaFgaI8LvRcGYG2GaJJiRwcedKko16sQ8F3TK5wXfj2Ytjf+8gjwHwsEEX550z3yvDWxA==", @@ -1112,50 +1071,18 @@ "node": ">=8.0.0" } }, - "node_modules/@applitools/http-commons": { - "version": "2.4.5", - "integrity": "sha512-w1lP9aljD6FLp/wgifj/oyj/bTCiAH2PuwDJci5QKJAeymqPoRGrKvykoKOegpa5OjdmZSPD/kW40ZTHSsST5Q==", - "dev": true, - "dependencies": { - "@applitools/functional-commons": "^1.5.5", - "@applitools/monitoring-commons": "^1.0.19", - "agentkeepalive": "^4.1.0", - "debug": "^4.1.1", - "lodash.merge": "^4.6.2", - "node-fetch": "^2.6.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@applitools/http-commons/node_modules/debug": { - "version": "4.3.4", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@applitools/image": { + "version": "1.0.17", + "integrity": "sha512-ftkyDvpO2X8WVosXtt/EUAuow3SqAs+G1TMe1EQ3NEb/zpGlYFsq/5gzyJRTzNAll7bfJGqWgNBKlTioeTcT+g==", "dev": true, "dependencies": { - "ms": "2.1.2" + "@applitools/utils": "1.3.22", + "bmpimagejs": "1.0.4", + "jpeg-js": "0.4.4", + "png-async": "0.9.4" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@applitools/http-commons/node_modules/ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@applitools/isomorphic-fetch": { - "version": "3.0.0", - "integrity": "sha512-7rutaN/2M5wYjOIOTKS/Zuc1Na90fJNEAqvo/jCxt7nSD1kYscHV3aCk9t7RD59gmzLMvUTIxFbjl4RUMV8qfg==", - "dev": true, - "dependencies": { - "node-fetch": "^2.3.0", - "whatwg-fetch": ">=0.10.0" + "node": ">=12.13.0" } }, "node_modules/@applitools/jsdom": { @@ -1203,36 +1130,6 @@ "node": ">= 10" } }, - "node_modules/@applitools/jsdom/node_modules/cssom": { - "version": "0.5.0", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "node_modules/@applitools/jsdom/node_modules/data-urls": { - "version": "3.0.2", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@applitools/jsdom/node_modules/data-urls/node_modules/whatwg-url": { - "version": "11.0.0", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@applitools/jsdom/node_modules/debug": { "version": "4.3.4", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", @@ -1249,17 +1146,6 @@ } } }, - "node_modules/@applitools/jsdom/node_modules/domexception": { - "version": "4.0.0", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@applitools/jsdom/node_modules/escodegen": { "version": "2.0.0", "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", @@ -1314,17 +1200,6 @@ "node": ">= 6" } }, - "node_modules/@applitools/jsdom/node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@applitools/jsdom/node_modules/http-proxy-agent": { "version": "5.0.0", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", @@ -1369,13 +1244,14 @@ } }, "node_modules/@applitools/jsdom/node_modules/tough-cookie": { - "version": "4.0.0", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.2", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", "dev": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { "node": ">=6" @@ -1393,24 +1269,13 @@ } }, "node_modules/@applitools/jsdom/node_modules/universalify": { - "version": "0.1.2", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "0.2.0", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, "engines": { "node": ">= 4.0.0" } }, - "node_modules/@applitools/jsdom/node_modules/w3c-xmlserializer": { - "version": "3.0.0", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@applitools/jsdom/node_modules/webidl-conversions": { "version": "7.0.0", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", @@ -1451,15 +1316,15 @@ } }, "node_modules/@applitools/jsdom/node_modules/ws": { - "version": "8.5.0", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.12.0", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -1479,27 +1344,15 @@ } }, "node_modules/@applitools/logger": { - "version": "1.0.11", - "integrity": "sha512-AcTTpLfUggo4/TISBk5+X4PdSZuMDEK0+gzsf+b9BCFzPDc7p4yrAHeftHdjOV/AE3yLQEWnupUmlsttdMayXQ==", - "dev": true, - "dependencies": { - "@applitools/utils": "1.2.13", - "chalk": "3.0.0" - }, - "engines": { - "node": ">= 8.9.0" - } - }, - "node_modules/@applitools/logger/node_modules/chalk": { - "version": "3.0.0", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "1.1.36", + "integrity": "sha512-Ul2b96Cz5XBZa5mZkszRs4WXtfsrXwM4HD0q7BLbBJ91B9gGzZrbn9bI837BlpcHAw0O4h8i+D9migeTmFrxaA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@applitools/utils": "1.3.22", + "chalk": "4.1.2" }, "engines": { - "node": ">=8" + "node": ">=12.13.0" } }, "node_modules/@applitools/monitoring-commons": { @@ -1534,68 +1387,99 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/@applitools/nml-client": { + "version": "1.3.22", + "integrity": "sha512-QTGejQtd8fCkE2PxGbhGg+/bbTdPKWsLGO/KT8LxybvUO+SehW5YQbPiTcuo95/z9tAywWPXwtdTIzxiImeiGA==", + "dev": true, + "dependencies": { + "@applitools/logger": "1.1.36", + "@applitools/req": "1.1.23", + "@applitools/utils": "1.3.22" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@applitools/req": { + "version": "1.1.23", + "integrity": "sha512-iy2XEtUXNM5YQJbS3pXijiBC+tKpIJjU8nQNHBlGaVbd4r/cxYCEmKPC0lLKVYRbxk7Qi4Lfbh2cmAEQ6Ncf3A==", + "dev": true, + "dependencies": { + "@applitools/utils": "1.3.22", + "@types/node-fetch": "2.6.2", + "abort-controller": "3.0.0", + "node-fetch": "2.6.7", + "proxy-agent": "5.0.0" + }, + "engines": { + "node": ">=12.13.0" + } + }, "node_modules/@applitools/screenshoter": { - "version": "3.3.14", - "integrity": "sha512-DwZFJiBIgEkyzEaESnl3A87KeSVnUmHKad9vg+iwgtAFQf492ZI7t+PKhjGVM9ekZ8q5Sz4xnO+Bsmk8qEu0+A==", + "version": "3.7.20", + "integrity": "sha512-GFJFjytmXm3TXo/h6gXAF8BIZ5A9oxSFjJmNWv2WiJn64xXFd/3hlW6U4ejrnWiFEo3TV8JNUIZmGRF/DvG1Yw==", "dev": true, "dependencies": { - "@applitools/snippets": "2.2.2", - "@applitools/utils": "1.2.13", + "@applitools/image": "1.0.17", + "@applitools/logger": "1.1.36", + "@applitools/snippets": "2.4.12", + "@applitools/utils": "1.3.22", + "jpeg-js": "0.4.4", "png-async": "0.9.4" }, "engines": { - "node": ">= 10.0.0" + "node": ">=12.13.0" } }, "node_modules/@applitools/snippets": { - "version": "2.2.2", - "integrity": "sha512-XOxdrsWgcEu6h6QTVL/S8/dJHoPGir1GKQLyWORbRfbjll15/mUj3Mzzi9MqL6lSN3KWp07ncLvMuhSETpi7Mg==", + "version": "2.4.12", + "integrity": "sha512-+B1jseyCYrwhweX27j92GQkgU30G+V1TrmUVzkA/Wl6HIqVFUAgX9QHh4dmTcgsKCcgQ8el+LX2VBhz7nJmCGw==", "dev": true, "engines": { - "node": ">=8.9.0" + "node": ">=12.13.0" } }, "node_modules/@applitools/spec-driver-puppeteer": { - "version": "1.1.1", - "integrity": "sha512-64TvcOc8vHYz1IXftOJzNqy0lLTMMnnjvKhcqMwIct5PJY8QYdVZagBRwGF9L9wYhs8ULtpmSa/SmpPaIbMNUQ==", + "version": "1.1.31", + "integrity": "sha512-GYXbAh8tgZa/eqqkwYaRa/TKKK+VNqXy8UbewpBgWY+qh+1uCe+qpm1hscKDqPZDVIzBFAHgqvwpWRMUrd+DGw==", "dev": true, "dependencies": { - "@applitools/types": "1.3.0", - "@applitools/utils": "1.2.13" + "@applitools/driver": "1.11.21", + "@applitools/utils": "1.3.22" + }, + "engines": { + "node": ">=12.13.0" }, "peerDependencies": { "puppeteer": ">=5.3.0" } }, "node_modules/@applitools/test-server": { - "version": "1.0.8", - "integrity": "sha512-KP1A8aySLoU532zCG6mwk2Mair56gQ5xp75ZnV4/CvefCzeD2f/nqUBYmoiTN940QOrQVWAXeXvuwMj1BUJD0Q==", + "version": "1.1.16", + "integrity": "sha512-o76pc9LG45PGDWFZDbo9uc/ojSeYMEVPvQZbw3jWX5DuiJ+Md2HE8H5+lf1krIKW8/91hqucYU0X+EZ0akzB/A==", "dev": true, "dependencies": { - "@applitools/utils": "1.2.4", + "@applitools/logger": "1.1.36", + "@applitools/utils": "1.3.22", + "body-parser": "1.20.0", "chalk": "3.0.0", "cookie-parser": "1.4.5", "cors": "2.8.5", - "express": "4.17.1", + "express": "4.17.3", "handlebars": "4.7.7", + "http-proxy": "1.18.1", "morgan": "1.10.0", + "node-forge": "1.3.1", "yargs": "17.0.1" }, "bin": { - "test-server": "cli/test-server.js" + "proxy-server": "dist/cli/proxy-server.js", + "test-server": "dist/cli/test-server.js" }, "engines": { "node": ">=12.0.0" } }, - "node_modules/@applitools/test-server/node_modules/@applitools/utils": { - "version": "1.2.4", - "integrity": "sha512-w7ma6FFGyqhdP6LEcuHFWOcH7EzBjnoAX3UfbFWcTHA3QXnXPX37Y2ENYRodfwkorP1cUKyUHwNXJB/BMIj/hg==", - "dev": true, - "engines": { - "node": ">= 8.9.0" - } - }, "node_modules/@applitools/test-server/node_modules/ansi-regex": { "version": "5.0.1", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", @@ -1604,6 +1488,37 @@ "node": ">=8" } }, + "node_modules/@applitools/test-server/node_modules/body-parser": { + "version": "1.20.0", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/@applitools/test-server/node_modules/bytes": { + "version": "3.1.2", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/@applitools/test-server/node_modules/chalk": { "version": "3.0.0", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", @@ -1626,6 +1541,43 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/@applitools/test-server/node_modules/depd": { + "version": "2.0.0", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@applitools/test-server/node_modules/destroy": { + "version": "1.2.0", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/@applitools/test-server/node_modules/http-errors": { + "version": "2.0.0", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@applitools/test-server/node_modules/inherits": { + "version": "2.0.4", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, "node_modules/@applitools/test-server/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", @@ -1634,6 +1586,58 @@ "node": ">=8" } }, + "node_modules/@applitools/test-server/node_modules/on-finished": { + "version": "2.4.1", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@applitools/test-server/node_modules/qs": { + "version": "6.10.3", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@applitools/test-server/node_modules/raw-body": { + "version": "2.5.1", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@applitools/test-server/node_modules/setprototypeof": { + "version": "1.2.0", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/@applitools/test-server/node_modules/statuses": { + "version": "2.0.1", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/@applitools/test-server/node_modules/string-width": { "version": "4.2.3", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", @@ -1707,66 +1711,48 @@ "node": ">=10" } }, - "node_modules/@applitools/types": { - "version": "1.3.0", - "integrity": "sha512-aLLm5FVtg/iDnrNvIDFKZrHQ2Nh64dSuy5VairQroMoCwK90Pft75Dy6CQC5g4IUEN04Wub9sx2kmthjQiwkZA==", - "dev": true, - "engines": { - "node": ">= 8.9.0" - } - }, - "node_modules/@applitools/utils": { - "version": "1.2.13", - "integrity": "sha512-yZ333Y/bAH/A05UMBllEdqBAwkFQknih2arIRSfN+QBpiFrfuLtQEdCwXAdnvU/MbAzZ/Tje7iv93FMzs5gFZA==", - "dev": true, - "engines": { - "node": ">= 8.9.0" - } - }, - "node_modules/@applitools/visual-grid-client": { - "version": "15.11.2", - "integrity": "sha512-PVnyVBlVjocnFjtXAbjH1UmAHz01/6GmaBV9fTFAjnpzCHDEbZ4Uz+pNi7hhMKy/hzRoe8LuRLZVBbagkhx9Aw==", + "node_modules/@applitools/ufg-client": { + "version": "1.1.12", + "integrity": "sha512-JHTKxCiqjzjpAsMdwqe9SW5ZokJzaLA6llRw78ohPdDu8NwrNE1x/0D0OGpBB+RPnoeTMPjvgJ81bfyjKcTf8A==", "dev": true, "dependencies": { - "@applitools/eyes-sdk-core": "13.2.5", - "@applitools/functional-commons": "1.6.0", - "@applitools/http-commons": "2.4.5", - "@applitools/isomorphic-fetch": "3.0.0", "@applitools/jsdom": "1.0.4", - "@applitools/logger": "1.0.11", + "@applitools/logger": "1.1.36", + "@applitools/req": "1.1.23", + "@applitools/utils": "1.3.22", "abort-controller": "3.0.0", - "chalk": "3.0.0", - "postcss-value-parser": "4.1.0", - "throat": "5.0.0" + "postcss-value-parser": "4.2.0", + "throat": "6.0.1" }, "engines": { - "node": ">=8.9.0" + "node": ">=12.13.0" } }, - "node_modules/@applitools/visual-grid-client/node_modules/chalk": { - "version": "3.0.0", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "node_modules/@applitools/ufg-client/node_modules/throat": { + "version": "6.0.1", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "node_modules/@applitools/utils": { + "version": "1.3.22", + "integrity": "sha512-2hRcD8YMsiHiN82YWoWHv6Vt0kp0GRaf4+aI+UlUgAfNO5qgJFerXntT499MkulOSUmtd8VnujYk4jqKUEt00g==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=8" + "node": ">=12.13.0" } }, "node_modules/@babel/cli": { - "version": "7.16.0", - "integrity": "sha512-WLrM42vKX/4atIoQB+eb0ovUof53UUvecb4qGjU2PDDWRiZr50ZpiV8NpcLo7iSxeGYrRG0Mqembsa+UrTAV6Q==", + "version": "7.18.10", + "integrity": "sha512-dLvWH+ZDFAkd2jPBSghrsFBuXrREvFwjpDycXbmUoeochqKYe4zNSLEJYErpLg8dvxvZYe79/MkN461XCwpnGw==", "dev": true, "dependencies": { + "@jridgewell/trace-mapping": "^0.3.8", "commander": "^4.0.1", "convert-source-map": "^1.1.0", "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", + "glob": "^7.2.0", "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" + "slash": "^2.0.0" }, "bin": { "babel": "bin/babel.js", @@ -1792,41 +1778,41 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.14.5", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.18.6", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dependencies": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.15.0", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "version": "7.18.8", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.15.5", - "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.5", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", + "version": "7.18.10", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.1", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -1852,11 +1838,8 @@ } }, "node_modules/@babel/core/node_modules/json5": { - "version": "2.1.3", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dependencies": { - "minimist": "^1.2.5" - }, + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -1876,8 +1859,8 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.15.7", - "integrity": "sha512-yJkHyomClm6A2Xzb8pdAo4HzYMSXFn1O5zrCYvbFP0yQFvHueLedV8WiEno8yJOKStjUXzBZzJFeWQ7b3YMsqQ==", + "version": "7.18.9", + "integrity": "sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==", "dev": true, "dependencies": { "eslint-scope": "^5.1.1", @@ -1889,7 +1872,7 @@ }, "peerDependencies": { "@babel/core": ">=7.11.0", - "eslint": ">=7.5.0" + "eslint": "^7.5.0 || ^8.0.0" } }, "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { @@ -1909,45 +1892,45 @@ } }, "node_modules/@babel/generator": { - "version": "7.15.4", - "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "version": "7.18.12", + "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", "dependencies": { - "@babel/types": "^7.15.4", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.15.4", - "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "version": "7.18.6", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.15.4", - "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", + "version": "7.18.9", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.15.4", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "version": "7.18.9", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "dependencies": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "engines": { @@ -1965,15 +1948,16 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.15.4", - "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "version": "7.18.9", + "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1983,11 +1967,11 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "version": "7.18.6", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" }, "engines": { "node": ">=6.9.0" @@ -2039,201 +2023,209 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.15.4", - "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", - "dependencies": { - "@babel/types": "^7.15.4" - }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.15.4", - "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dependencies": { - "@babel/helper-get-function-arity": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.15.4", - "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "node_modules/@babel/helper-function-name": { + "version": "7.18.9", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dependencies": { - "@babel/types": "^7.15.4" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.15.4", - "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "version": "7.18.6", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.15.4", - "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "version": "7.18.9", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.15.4", - "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "version": "7.18.6", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.15.7", - "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", + "version": "7.18.9", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dependencies": { - "@babel/helper-module-imports": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-simple-access": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.15.4", - "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "version": "7.18.6", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.18.9", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.15.4", - "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "version": "7.18.9", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-wrap-function": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.15.4", - "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "version": "7.18.9", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.15.4", - "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "version": "7.18.6", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.15.4", - "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "version": "7.18.9", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.15.4", - "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "version": "7.18.6", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.18.10", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "version": "7.18.6", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "version": "7.18.6", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.15.4", - "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "version": "7.18.11", + "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", "dependencies": { - "@babel/helper-function-name": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.11", + "@babel/types": "^7.18.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.15.4", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "version": "7.18.9", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dependencies": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.14.5", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.18.6", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -2274,13 +2266,13 @@ } }, "node_modules/@babel/node": { - "version": "7.15.4", - "integrity": "sha512-UZue+j8p5aKTaVjvy5psYmqLHqmz+9cIboAFoa97S1xeZyUr0gT6KzXB8ZkfBIsP/u79biOdjGHVXBXnW3rVfw==", + "version": "7.18.10", + "integrity": "sha512-VbqzK6QXfQVi4Bpk6J7XqHXKFNbG2j3rdIdx68+/14GDU7jXDOSyUU/cwqCM1fDwCdxp37pNV/ToSCXsNChcyA==", "dev": true, "dependencies": { - "@babel/register": "^7.15.3", + "@babel/register": "^7.18.9", "commander": "^4.0.1", - "core-js": "^3.16.0", + "core-js": "^3.22.1", "node-environment-flags": "^1.0.5", "regenerator-runtime": "^0.13.4", "v8flags": "^3.1.1" @@ -2304,8 +2296,8 @@ } }, "node_modules/@babel/parser": { - "version": "7.15.7", - "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", + "version": "7.18.11", + "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -2313,13 +2305,26 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.15.4", - "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "version": "7.18.9", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", - "@babel/plugin-proposal-optional-chaining": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2329,11 +2334,12 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.15.4", - "integrity": "sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==", + "version": "7.18.10", + "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -2344,11 +2350,11 @@ } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.14.5", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "version": "7.18.6", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2358,11 +2364,11 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.15.4", - "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "version": "7.18.6", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -2388,10 +2394,10 @@ } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "version": "7.18.6", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -2416,10 +2422,10 @@ } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.5", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "version": "7.18.9", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -2430,10 +2436,10 @@ } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.14.5", - "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "version": "7.18.6", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -2444,10 +2450,10 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "version": "7.18.9", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -2458,10 +2464,10 @@ } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "version": "7.18.6", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -2472,10 +2478,10 @@ } }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "version": "7.18.6", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -2498,10 +2504,10 @@ } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.5", - "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "version": "7.18.6", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -2512,11 +2518,11 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "version": "7.18.9", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -2527,11 +2533,11 @@ } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "version": "7.18.6", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2541,12 +2547,12 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.15.4", - "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "version": "7.18.6", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-create-class-features-plugin": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -2557,11 +2563,11 @@ } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.14.5", - "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "version": "7.18.6", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=4" @@ -2673,6 +2679,19 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.1", "integrity": "sha512-ypC4jwfIVF72og0dgvEcFRdOM2V9Qm1tu7RGmdZOlhsccyK0wisXmMObGuWEOd5jQ+K9wcIgSNftCpk2vkjUfQ==", @@ -2695,10 +2714,10 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.14.5", - "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "version": "7.18.6", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2807,10 +2826,10 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.14.5", - "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "version": "7.18.6", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2820,12 +2839,12 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "version": "7.18.6", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2835,10 +2854,10 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.14.5", - "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "version": "7.18.6", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2848,10 +2867,10 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.15.3", - "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", + "version": "7.18.9", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2861,15 +2880,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.15.4", - "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", + "version": "7.18.9", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "engines": { @@ -2880,10 +2900,10 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.14.5", - "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "version": "7.18.9", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2893,10 +2913,10 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.14.7", - "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "version": "7.18.9", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2906,11 +2926,11 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.14.5", - "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "version": "7.18.6", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2920,10 +2940,10 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.14.5", - "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "version": "7.18.9", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2933,11 +2953,11 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.14.5", - "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "version": "7.18.6", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2961,10 +2981,10 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.15.4", - "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "version": "7.18.8", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2974,11 +2994,12 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.14.5", - "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "version": "7.18.9", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dependencies": { - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2988,10 +3009,10 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.14.5", - "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "version": "7.18.9", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -3001,10 +3022,10 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.14.5", - "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "version": "7.18.6", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3014,11 +3035,11 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.14.5", - "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "version": "7.18.6", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", "dependencies": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -3029,12 +3050,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.15.4", - "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "version": "7.18.6", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", "dependencies": { - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -3045,13 +3066,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.15.4", - "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "version": "7.18.9", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", "dependencies": { - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -3062,11 +3083,11 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.14.5", - "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "version": "7.18.6", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3076,10 +3097,11 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.14.9", - "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "version": "7.18.6", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3089,10 +3111,10 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.14.5", - "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "version": "7.18.6", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3102,11 +3124,11 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.14.5", - "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "version": "7.18.6", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3116,10 +3138,10 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.15.4", - "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "version": "7.18.8", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3129,10 +3151,10 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.14.5", - "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "version": "7.18.6", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3156,10 +3178,10 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.15.1", - "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", + "version": "7.18.6", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3169,14 +3191,14 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.14.9", - "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", + "version": "7.18.10", + "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.14.5", - "@babel/types": "^7.14.9" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.18.10" }, "engines": { "node": ">=6.9.0" @@ -3186,10 +3208,10 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.14.5", - "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "version": "7.18.6", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.14.5" + "@babel/plugin-transform-react-jsx": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3199,11 +3221,11 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.14.5", - "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "version": "7.18.6", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3213,10 +3235,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.14.5", - "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "version": "7.18.6", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", "dependencies": { - "regenerator-transform": "^0.14.2" + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" }, "engines": { "node": ">=6.9.0" @@ -3226,10 +3249,10 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.14.5", - "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "version": "7.18.6", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3239,15 +3262,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.15.0", - "integrity": "sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==", + "version": "7.18.10", + "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", "semver": "^6.3.0" }, "engines": { @@ -3258,14 +3281,12 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "version": "0.3.2", + "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -3276,20 +3297,20 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.2.5", - "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "version": "0.5.3", + "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.16.2" + "@babel/helper-define-polyfill-provider": "^0.3.2", + "core-js-compat": "^3.21.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-runtime/node_modules/debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -3317,10 +3338,10 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.14.5", - "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "version": "7.18.6", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3330,11 +3351,11 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.14.6", - "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "version": "7.18.9", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -3344,10 +3365,10 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.14.5", - "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "version": "7.18.6", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3357,10 +3378,10 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.14.5", - "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "version": "7.18.9", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -3370,10 +3391,10 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.14.5", - "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "version": "7.18.9", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -3398,10 +3419,10 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.14.5", - "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "version": "7.18.10", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -3411,11 +3432,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.14.5", - "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "version": "7.18.6", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3440,34 +3461,36 @@ "hasInstallScript": true }, "node_modules/@babel/preset-env": { - "version": "7.15.6", - "integrity": "sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==", - "dependencies": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", - "@babel/plugin-proposal-async-generator-functions": "^7.15.4", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.15.4", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.15.6", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.15.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "version": "7.18.10", + "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.18.10", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -3477,44 +3500,44 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.15.3", - "@babel/plugin-transform-classes": "^7.15.4", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.15.4", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.15.4", - "@babel/plugin-transform-modules-systemjs": "^7.15.4", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.15.4", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.15.6", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.16.0", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.18.10", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", + "core-js-compat": "^3.22.1", "semver": "^6.3.0" }, "engines": { @@ -3525,13 +3548,11 @@ } }, "node_modules/@babel/preset-env/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "version": "0.3.2", + "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -3542,14 +3563,14 @@ } }, "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.15.6", - "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "version": "7.18.9", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", "dependencies": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.15.4" + "@babel/plugin-transform-parameters": "^7.18.8" }, "engines": { "node": ">=6.9.0" @@ -3559,19 +3580,19 @@ } }, "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.2.5", - "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "version": "0.5.3", + "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.16.2" + "@babel/helper-define-polyfill-provider": "^0.3.2", + "core-js-compat": "^3.21.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env/node_modules/debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -3611,8 +3632,8 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.4", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "version": "0.1.5", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -3625,15 +3646,15 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.14.5", - "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "version": "7.18.6", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/plugin-transform-react-jsx-development": "^7.14.5", - "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -3658,13 +3679,13 @@ } }, "node_modules/@babel/register": { - "version": "7.15.3", - "integrity": "sha512-mj4IY1ZJkorClxKTImccn4T81+UKTo4Ux0+OFSV9hME1ooqS9UV+pJ6BjD0qXPK4T3XW/KNa79XByjeEMZz+fw==", + "version": "7.18.9", + "integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==", "dependencies": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", "make-dir": "^2.1.0", - "pirates": "^4.0.0", + "pirates": "^4.0.5", "source-map-support": "^0.5.16" }, "engines": { @@ -3675,10 +3696,10 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.9", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.20.1", + "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.10" }, "engines": { "node": ">=6.9.0" @@ -3710,28 +3731,29 @@ } }, "node_modules/@babel/template": { - "version": "7.15.4", - "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "version": "7.18.10", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.15.4", - "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4", + "version": "7.18.11", + "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -3752,10 +3774,11 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/types": { - "version": "7.15.6", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "version": "7.18.10", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.9", + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -3923,8 +3946,8 @@ } }, "node_modules/@ctrl/tinycolor": { - "version": "3.3.1", - "integrity": "sha512-jUJrjU62MUgHDSu5JfONfgRM2V7GfN5KknsygfIbxwRZXGeayIzxk4O9GiYgEAr9DG5HJThTF5+a5x3wtrOKzQ==", + "version": "3.4.1", + "integrity": "sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==", "engines": { "node": ">=10" } @@ -4852,8 +4875,8 @@ } }, "node_modules/@discoveryjs/json-ext": { - "version": "0.5.3", - "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", + "version": "0.5.7", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "engines": { "node": ">=10.0.0" } @@ -5350,8 +5373,8 @@ "integrity": "sha512-zc9DDGEz0cgftT6VbHPrdBBVaBQrK4P6UDuuNrib1KNnbDCY1zHTMwYiN2XH6SFDufRKnsjUR5cEeWDANDDaYw==" }, "node_modules/@gar/promisify": { - "version": "1.1.2", - "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==" + "version": "1.1.3", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" }, "node_modules/@hot-loader/react-dom": { "version": "16.13.0", @@ -5423,6 +5446,11 @@ "node": ">=6.9.0" } }, + "node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "dev": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", @@ -6177,227 +6205,253 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.14", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, "node_modules/@lerna/add": { - "version": "4.0.0", - "integrity": "sha512-cpmAH1iS3k8JBxNvnMqrGTTjbY/ZAiKa1ChJzFevMYY3eeqbvhsBKnBcxjRXtdrJ6bd3dCQM+ZtK+0i682Fhng==", + "version": "6.1.0", + "integrity": "sha512-f2cAeS1mE/p7QvSRn5TCgdUXw6QVbu8PeRxaTOxTThhTdJIWdXZfY00QjAsU6jw1PdYXK1qGUSwWOPkdR16mBg==", "dev": true, "dependencies": { - "@lerna/bootstrap": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/npm-conf": "4.0.0", - "@lerna/validation-error": "4.0.0", + "@lerna/bootstrap": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/filter-options": "6.1.0", + "@lerna/npm-conf": "6.1.0", + "@lerna/validation-error": "6.1.0", "dedent": "^0.7.0", - "npm-package-arg": "^8.1.0", + "npm-package-arg": "8.1.1", "p-map": "^4.0.0", - "pacote": "^11.2.6", + "pacote": "^13.6.1", "semver": "^7.3.4" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/add/node_modules/@npmcli/run-script": { - "version": "1.8.6", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", + "node_modules/@lerna/add/node_modules/@npmcli/fs": { + "version": "2.1.2", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/add/node_modules/cacache": { - "version": "15.3.0", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "node_modules/@lerna/add/node_modules/@npmcli/git": { + "version": "3.0.2", + "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", "dev": true, "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" }, "engines": { - "node": ">= 10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/add/node_modules/chownr": { - "version": "2.0.0", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/@lerna/add/node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/@lerna/add/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@lerna/add/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/add/node_modules/mkdirp": { - "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/@lerna/add/node_modules/@npmcli/node-gyp": { + "version": "2.0.0", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/add/node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "dev": true, + "dependencies": { + "infer-owner": "^1.0.4" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/add/node_modules/node-gyp": { - "version": "7.1.2", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "node_modules/@lerna/add/node_modules/@npmcli/run-script": { + "version": "4.2.1", + "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", "dev": true, "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", "which": "^2.0.2" }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, "engines": { - "node": ">= 10.12.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/add/node_modules/pacote": { - "version": "11.3.5", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", + "node_modules/@lerna/add/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", + "balanced-match": "^1.0.0" + } + }, + "node_modules/@lerna/add/node_modules/builtins": { + "version": "5.0.1", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/@lerna/add/node_modules/cacache": { + "version": "16.1.3", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", + "glob": "^8.0.1", "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - }, - "bin": { - "pacote": "lib/bin.js" + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/add/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@lerna/add/node_modules/cacache/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/@lerna/add/node_modules/ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "node_modules/@lerna/add/node_modules/chownr": { + "version": "2.0.0", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/@lerna/add/node_modules/which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/@lerna/add/node_modules/glob": { + "version": "8.0.3", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">= 8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@lerna/add/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@lerna/bootstrap": { - "version": "4.0.0", - "integrity": "sha512-RkS7UbeM2vu+kJnHzxNRCLvoOP9yGNgkzRdy4UV2hNalD7EP41bLvRVOwRYQ7fhc2QcbhnKNdOBihYRL0LcKtw==", - "dev": true, - "dependencies": { - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/has-npm-version": "4.0.0", - "@lerna/npm-install": "4.0.0", - "@lerna/package-graph": "4.0.0", - "@lerna/pulse-till-done": "4.0.0", - "@lerna/rimraf-dir": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/symlink-binary": "4.0.0", - "@lerna/symlink-dependencies": "4.0.0", - "@lerna/validation-error": "4.0.0", - "dedent": "^0.7.0", - "get-port": "^5.1.1", - "multimatch": "^5.0.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", - "p-map": "^4.0.0", - "p-map-series": "^2.1.0", - "p-waterfall": "^2.1.1", - "read-package-tree": "^5.3.1", - "semver": "^7.3.4" + "node_modules/@lerna/add/node_modules/hosted-git-info": { + "version": "3.0.8", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": ">=10" } }, - "node_modules/@lerna/bootstrap/node_modules/lru-cache": { + "node_modules/@lerna/add/node_modules/lru-cache": { "version": "6.0.0", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, @@ -6408,668 +6462,626 @@ "node": ">=10" } }, - "node_modules/@lerna/bootstrap/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@lerna/add/node_modules/minimatch": { + "version": "5.1.2", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, - "node_modules/@lerna/bootstrap/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@lerna/changed": { - "version": "4.0.0", - "integrity": "sha512-cD+KuPRp6qiPOD+BO6S6SN5cARspIaWSOqGBpGnYzLb4uWT8Vk4JzKyYtc8ym1DIwyoFXHosXt8+GDAgR8QrgQ==", + "node_modules/@lerna/add/node_modules/minipass-fetch": { + "version": "2.1.2", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "dependencies": { - "@lerna/collect-updates": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/listable": "4.0.0", - "@lerna/output": "4.0.0" + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/@lerna/check-working-tree": { - "version": "4.0.0", - "integrity": "sha512-/++bxM43jYJCshBiKP5cRlCTwSJdRSxVmcDAXM+1oUewlZJVSVlnks5eO0uLxokVFvLhHlC5kHMc7gbVFPHv6Q==", + "node_modules/@lerna/add/node_modules/mkdirp": { + "version": "1.0.4", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "dependencies": { - "@lerna/collect-uncommitted": "4.0.0", - "@lerna/describe-ref": "4.0.0", - "@lerna/validation-error": "4.0.0" + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">= 10.18.0" + "node": ">=10" } }, - "node_modules/@lerna/child-process": { - "version": "4.0.0", - "integrity": "sha512-XtCnmCT9eyVsUUHx6y/CTBYdV9g2Cr/VxyseTWBgfIur92/YKClfEtJTbOh94jRT62hlKLqSvux/UhxXVh613Q==", + "node_modules/@lerna/add/node_modules/npm-install-checks": { + "version": "5.0.0", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "execa": "^5.0.0", - "strong-log-transformer": "^2.1.0" + "semver": "^7.1.1" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/child-process/node_modules/cross-spawn": { - "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@lerna/add/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/child-process/node_modules/execa": { - "version": "5.1.1", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/@lerna/add/node_modules/npm-package-arg": { + "version": "8.1.1", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@lerna/child-process/node_modules/get-stream": { - "version": "6.0.1", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/@lerna/add/node_modules/npm-pick-manifest": { + "version": "7.0.2", + "integrity": "sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/child-process/node_modules/human-signals": { - "version": "2.1.0", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/@lerna/add/node_modules/npm-pick-manifest/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, "engines": { - "node": ">=10.17.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/child-process/node_modules/is-stream": { - "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/@lerna/add/node_modules/npm-pick-manifest/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@lerna/child-process/node_modules/npm-run-path": { - "version": "4.0.1", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/@lerna/add/node_modules/npm-pick-manifest/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/child-process/node_modules/path-key": { - "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/@lerna/add/node_modules/npm-pick-manifest/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/child-process/node_modules/shebang-command": { - "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/@lerna/add/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/child-process/node_modules/shebang-regex": { - "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/@lerna/add/node_modules/npm-registry-fetch/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/child-process/node_modules/which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/@lerna/add/node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@lerna/clean": { - "version": "4.0.0", - "integrity": "sha512-uugG2iN9k45ITx2jtd8nEOoAtca8hNlDCUM0N3lFgU/b1mEQYAPRkqr1qs4FLRl/Y50ZJ41wUz1eazS+d/0osA==", + "node_modules/@lerna/add/node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/prompt": "4.0.0", - "@lerna/pulse-till-done": "4.0.0", - "@lerna/rimraf-dir": "4.0.0", - "p-map": "^4.0.0", - "p-map-series": "^2.1.0", - "p-waterfall": "^2.1.1" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/cli": { + "node_modules/@lerna/add/node_modules/npm-registry-fetch/node_modules/validate-npm-package-name": { "version": "4.0.0", - "integrity": "sha512-Neaw3GzFrwZiRZv2g7g6NwFjs3er1vhraIniEs0jjVLPMNC4eata0na3GfE5yibkM/9d3gZdmihhZdZ3EBdvYA==", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "dependencies": { - "@lerna/global-options": "4.0.0", - "dedent": "^0.7.0", - "npmlog": "^4.1.2", - "yargs": "^16.2.0" + "builtins": "^5.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/cli/node_modules/ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@lerna/add/node_modules/pacote": { + "version": "13.6.2", + "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", "dev": true, + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/cli/node_modules/cliui": { - "version": "7.0.4", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@lerna/add/node_modules/pacote/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/cli/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/@lerna/add/node_modules/pacote/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@lerna/cli/node_modules/string-width": { - "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@lerna/add/node_modules/pacote/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/cli/node_modules/strip-ansi": { - "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/@lerna/add/node_modules/pacote/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "builtins": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/@lerna/add/node_modules/proc-log": { + "version": "2.0.1", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/cli/node_modules/y18n": { - "version": "5.0.8", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/@lerna/add/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { "node": ">=10" } }, - "node_modules/@lerna/cli/node_modules/yargs": { - "version": "16.2.0", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/@lerna/add/node_modules/ssri": { + "version": "9.0.1", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "minipass": "^3.1.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/cli/node_modules/yargs-parser": { - "version": "20.2.9", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/@lerna/add/node_modules/unique-filename": { + "version": "2.0.1", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/collect-uncommitted": { - "version": "4.0.0", - "integrity": "sha512-ufSTfHZzbx69YNj7KXQ3o66V4RC76ffOjwLX0q/ab//61bObJ41n03SiQEhSlmpP+gmFbTJ3/7pTe04AHX9m/g==", + "node_modules/@lerna/add/node_modules/unique-slug": { + "version": "3.0.0", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "dependencies": { - "@lerna/child-process": "4.0.0", - "chalk": "^4.1.0", - "npmlog": "^4.1.2" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/collect-updates": { - "version": "4.0.0", - "integrity": "sha512-bnNGpaj4zuxsEkyaCZLka9s7nMs58uZoxrRIPJ+nrmrZYp1V5rrd+7/NYTuunOhY2ug1sTBvTAxj3NZQ+JKnOw==", - "dev": true, + "node_modules/@lerna/add/node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/describe-ref": "4.0.0", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "slash": "^3.0.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">= 10.18.0" - } - }, - "node_modules/@lerna/collect-updates/node_modules/slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/@lerna/command": { + "node_modules/@lerna/add/node_modules/yallist": { "version": "4.0.0", - "integrity": "sha512-LM9g3rt5FsPNFqIHUeRwWXLNHJ5NKzOwmVKZ8anSp4e1SPrv2HNc1V02/9QyDDZK/w+5POXH5lxZUI1CHaOK/A==", - "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/package-graph": "4.0.0", - "@lerna/project": "4.0.0", - "@lerna/validation-error": "4.0.0", - "@lerna/write-log-file": "4.0.0", - "clone-deep": "^4.0.1", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@lerna/bootstrap": { + "version": "6.1.0", + "integrity": "sha512-aDxKqgxexVj/Z0B1aPu7P1iPbPqhk1FPkl/iayCmPlkAh90pYEH0uVytGzi1hFB5iXEfG7Pa6azGQywUodx/1g==", + "dev": true, + "dependencies": { + "@lerna/command": "6.1.0", + "@lerna/filter-options": "6.1.0", + "@lerna/has-npm-version": "6.1.0", + "@lerna/npm-install": "6.1.0", + "@lerna/package-graph": "6.1.0", + "@lerna/pulse-till-done": "6.1.0", + "@lerna/rimraf-dir": "6.1.0", + "@lerna/run-lifecycle": "6.1.0", + "@lerna/run-topologically": "6.1.0", + "@lerna/symlink-binary": "6.1.0", + "@lerna/symlink-dependencies": "6.1.0", + "@lerna/validation-error": "6.1.0", + "@npmcli/arborist": "5.3.0", "dedent": "^0.7.0", - "execa": "^5.0.0", - "is-ci": "^2.0.0", - "npmlog": "^4.1.2" + "get-port": "^5.1.1", + "multimatch": "^5.0.0", + "npm-package-arg": "8.1.1", + "npmlog": "^6.0.2", + "p-map": "^4.0.0", + "p-map-series": "^2.1.0", + "p-waterfall": "^2.1.1", + "semver": "^7.3.4" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/command/node_modules/cross-spawn": { - "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "node_modules/@lerna/bootstrap/node_modules/@npmcli/arborist": { + "version": "5.3.0", + "integrity": "sha512-+rZ9zgL1lnbl8Xbb1NQdMjveOMwj4lIYfcDtyJHHi5x4X8jtR6m8SXooJMZy5vmFVZ8w7A2Bnd/oX9eTuU8w5A==", + "dev": true, + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^4.1.3", + "bin-links": "^3.0.0", + "cacache": "^16.0.6", + "common-ancestor-path": "^1.0.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^5.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", + "walk-up-path": "^1.0.0" + }, + "bin": { + "arborist": "bin/index.js" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/command/node_modules/execa": { - "version": "5.1.1", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/@lerna/bootstrap/node_modules/@npmcli/arborist/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/command/node_modules/get-stream": { - "version": "6.0.1", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/@lerna/bootstrap/node_modules/@npmcli/arborist/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@lerna/command/node_modules/human-signals": { - "version": "2.1.0", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@lerna/command/node_modules/is-stream": { - "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/command/node_modules/npm-run-path": { - "version": "4.0.1", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/@lerna/bootstrap/node_modules/@npmcli/arborist/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "builtins": "^5.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@lerna/command/node_modules/path-key": { - "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/command/node_modules/shebang-command": { - "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/@lerna/bootstrap/node_modules/@npmcli/fs": { + "version": "2.1.2", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@lerna/command/node_modules/shebang-regex": { - "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/command/node_modules/which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/@lerna/bootstrap/node_modules/@npmcli/git": { + "version": "3.0.2", + "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", "dev": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/conventional-commits": { - "version": "4.0.0", - "integrity": "sha512-CSUQRjJHFrH8eBn7+wegZLV3OrNc0Y1FehYfYGhjLE2SIfpCL4bmfu/ViYuHh9YjwHaA+4SX6d3hR+xkeseKmw==", + "node_modules/@lerna/bootstrap/node_modules/@npmcli/metavuln-calculator": { + "version": "3.1.1", + "integrity": "sha512-n69ygIaqAedecLeVH3KnO39M6ZHiJ2dEv5A7DGvcqCB8q17BGUgW8QaanIkbWUo2aYGZqJaOORTLAlIvKjNDKA==", "dev": true, "dependencies": { - "@lerna/validation-error": "4.0.0", - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-core": "^4.2.2", - "conventional-recommended-bump": "^6.1.0", - "fs-extra": "^9.1.0", - "get-stream": "^6.0.0", - "lodash.template": "^4.5.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", - "pify": "^5.0.0", - "semver": "^7.3.4" + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/conventional-commits/node_modules/fs-extra": { - "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@lerna/bootstrap/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/conventional-commits/node_modules/get-stream": { - "version": "6.0.1", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/@lerna/bootstrap/node_modules/@npmcli/node-gyp": { + "version": "2.0.0", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/conventional-commits/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@lerna/bootstrap/node_modules/@npmcli/package-json": { + "version": "2.0.0", + "integrity": "sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "json-parse-even-better-errors": "^2.3.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@lerna/conventional-commits/node_modules/pify": { - "version": "5.0.0", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/conventional-commits/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@lerna/bootstrap/node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "infer-owner": "^1.0.4" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/conventional-commits/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@lerna/create": { - "version": "4.0.0", - "integrity": "sha512-mVOB1niKByEUfxlbKTM1UNECWAjwUdiioIbRQZEeEabtjCL69r9rscIsjlGyhGWCfsdAG5wfq4t47nlDXdLLag==", + "node_modules/@lerna/bootstrap/node_modules/@npmcli/run-script": { + "version": "4.2.1", + "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", "dev": true, "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/npm-conf": "4.0.0", - "@lerna/validation-error": "4.0.0", - "dedent": "^0.7.0", - "fs-extra": "^9.1.0", - "globby": "^11.0.2", - "init-package-json": "^2.0.2", - "npm-package-arg": "^8.1.0", - "p-reduce": "^2.1.0", - "pacote": "^11.2.6", - "pify": "^5.0.0", - "semver": "^7.3.4", - "slash": "^3.0.0", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0", - "whatwg-url": "^8.4.0", - "yargs-parser": "20.2.4" + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/create-symlink": { - "version": "4.0.0", - "integrity": "sha512-I0phtKJJdafUiDwm7BBlEUOtogmu8+taxq6PtIrxZbllV9hWg59qkpuIsiFp+no7nfRVuaasNYHwNUhDAVQBig==", + "node_modules/@lerna/bootstrap/node_modules/bin-links": { + "version": "3.0.3", + "integrity": "sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==", "dev": true, "dependencies": { - "cmd-shim": "^4.1.0", - "fs-extra": "^9.1.0", - "npmlog": "^4.1.2" + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0", + "read-cmd-shim": "^3.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^4.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/create-symlink/node_modules/fs-extra": { - "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@lerna/bootstrap/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" + "balanced-match": "^1.0.0" } }, - "node_modules/@lerna/create/node_modules/@npmcli/run-script": { - "version": "1.8.6", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", + "node_modules/@lerna/bootstrap/node_modules/builtins": { + "version": "5.0.1", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" + "semver": "^7.0.0" } }, - "node_modules/@lerna/create/node_modules/cacache": { - "version": "15.3.0", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "node_modules/@lerna/bootstrap/node_modules/cacache": { + "version": "16.1.3", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" }, "engines": { - "node": ">= 10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/create/node_modules/chownr": { + "node_modules/@lerna/bootstrap/node_modules/chownr": { "version": "2.0.0", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, @@ -7077,846 +7089,846 @@ "node": ">=10" } }, - "node_modules/@lerna/create/node_modules/fs-extra": { - "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@lerna/bootstrap/node_modules/cmd-shim": { + "version": "5.0.0", + "integrity": "sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "mkdirp-infer-owner": "^2.0.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/create/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@lerna/bootstrap/node_modules/glob": { + "version": "8.0.3", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@lerna/create/node_modules/mkdirp": { - "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "node": ">=12" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@lerna/create/node_modules/node-gyp": { - "version": "7.1.2", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "node_modules/@lerna/bootstrap/node_modules/hosted-git-info": { + "version": "3.0.8", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "dev": true, "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "lru-cache": "^6.0.0" }, "engines": { - "node": ">= 10.12.0" + "node": ">=10" } }, - "node_modules/@lerna/create/node_modules/pacote": { - "version": "11.3.5", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", + "node_modules/@lerna/bootstrap/node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - }, - "bin": { - "pacote": "lib/bin.js" + "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/@lerna/create/node_modules/pify": { - "version": "5.0.0", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "node_modules/@lerna/bootstrap/node_modules/just-diff": { + "version": "5.2.0", + "integrity": "sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==", + "dev": true + }, + "node_modules/@lerna/bootstrap/node_modules/just-diff-apply": { + "version": "5.5.0", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "dev": true + }, + "node_modules/@lerna/bootstrap/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@lerna/create/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@lerna/bootstrap/node_modules/minimatch": { + "version": "5.1.2", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, - "node_modules/@lerna/create/node_modules/slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/@lerna/bootstrap/node_modules/minipass-fetch": { + "version": "2.1.2", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/@lerna/create/node_modules/ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "node_modules/@lerna/bootstrap/node_modules/mkdirp": { + "version": "1.0.4", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "dependencies": { - "minipass": "^3.1.1" + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/@lerna/create/node_modules/tr46": { - "version": "2.1.0", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "node_modules/@lerna/bootstrap/node_modules/npm-install-checks": { + "version": "5.0.0", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", "dev": true, "dependencies": { - "punycode": "^2.1.1" + "semver": "^7.1.1" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/create/node_modules/webidl-conversions": { - "version": "6.1.0", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "node_modules/@lerna/bootstrap/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, "engines": { - "node": ">=10.4" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/create/node_modules/whatwg-url": { - "version": "8.7.0", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "node_modules/@lerna/bootstrap/node_modules/npm-package-arg": { + "version": "8.1.1", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", "dev": true, "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/@lerna/create/node_modules/which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/@lerna/bootstrap/node_modules/npm-pick-manifest": { + "version": "7.0.2", + "integrity": "sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw==", "dev": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/create/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@lerna/create/node_modules/yargs-parser": { - "version": "20.2.4", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "node_modules/@lerna/bootstrap/node_modules/npm-pick-manifest/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/describe-ref": { - "version": "4.0.0", - "integrity": "sha512-eTU5+xC4C5Gcgz+Ey4Qiw9nV2B4JJbMulsYJMW8QjGcGh8zudib7Sduj6urgZXUYNyhYpRs+teci9M2J8u+UvQ==", + "node_modules/@lerna/bootstrap/node_modules/npm-pick-manifest/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { - "@lerna/child-process": "4.0.0", - "npmlog": "^4.1.2" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/diff": { + "node_modules/@lerna/bootstrap/node_modules/npm-pick-manifest/node_modules/validate-npm-package-name": { "version": "4.0.0", - "integrity": "sha512-jYPKprQVg41+MUMxx6cwtqsNm0Yxx9GDEwdiPLwcUTFx+/qKCEwifKNJ1oGIPBxyEHX2PFCOjkK39lHoj2qiag==", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/validation-error": "4.0.0", - "npmlog": "^4.1.2" + "builtins": "^5.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/exec": { - "version": "4.0.0", - "integrity": "sha512-VGXtL/b/JfY84NB98VWZpIExfhLOzy0ozm/0XaS4a2SmkAJc5CeUfrhvHxxkxiTBLkU+iVQUyYEoAT0ulQ8PCw==", + "node_modules/@lerna/bootstrap/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", "dev": true, "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/profiler": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/validation-error": "4.0.0", - "p-map": "^4.0.0" + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/filter-options": { - "version": "4.0.0", - "integrity": "sha512-vV2ANOeZhOqM0rzXnYcFFCJ/kBWy/3OA58irXih9AMTAlQLymWAK0akWybl++sUJ4HB9Hx12TOqaXbYS2NM5uw==", + "node_modules/@lerna/bootstrap/node_modules/npm-registry-fetch/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "dependencies": { - "@lerna/collect-updates": "4.0.0", - "@lerna/filter-packages": "4.0.0", - "dedent": "^0.7.0", - "npmlog": "^4.1.2" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/filter-packages": { - "version": "4.0.0", - "integrity": "sha512-+4AJIkK7iIiOaqCiVTYJxh/I9qikk4XjNQLhE3kixaqgMuHl1NQ99qXRR0OZqAWB9mh8Z1HA9bM5K1HZLBTOqA==", + "node_modules/@lerna/bootstrap/node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { - "@lerna/validation-error": "4.0.0", - "multimatch": "^5.0.0", - "npmlog": "^4.1.2" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/get-npm-exec-opts": { + "node_modules/@lerna/bootstrap/node_modules/npm-registry-fetch/node_modules/validate-npm-package-name": { "version": "4.0.0", - "integrity": "sha512-yvmkerU31CTWS2c7DvmAWmZVeclPBqI7gPVr5VATUKNWJ/zmVcU4PqbYoLu92I9Qc4gY1TuUplMNdNuZTSL7IQ==", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "dependencies": { - "npmlog": "^4.1.2" + "builtins": "^5.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/get-packed": { - "version": "4.0.0", - "integrity": "sha512-rfWONRsEIGyPJTxFzC8ECb3ZbsDXJbfqWYyeeQQDrJRPnEJErlltRLPLgC2QWbxFgFPsoDLeQmFHJnf0iDfd8w==", + "node_modules/@lerna/bootstrap/node_modules/pacote": { + "version": "13.6.2", + "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", "dev": true, "dependencies": { - "fs-extra": "^9.1.0", - "ssri": "^8.0.1", - "tar": "^6.1.0" + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/get-packed/node_modules/fs-extra": { - "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@lerna/bootstrap/node_modules/pacote/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/get-packed/node_modules/ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "node_modules/@lerna/bootstrap/node_modules/pacote/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { - "minipass": "^3.1.1" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/github-client": { + "node_modules/@lerna/bootstrap/node_modules/pacote/node_modules/validate-npm-package-name": { "version": "4.0.0", - "integrity": "sha512-2jhsldZtTKXYUBnOm23Lb0Fx8G4qfSXF9y7UpyUgWUj+YZYd+cFxSuorwQIgk5P4XXrtVhsUesIsli+BYSThiw==", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "dependencies": { - "@lerna/child-process": "4.0.0", - "@octokit/plugin-enterprise-rest": "^6.0.1", - "@octokit/rest": "^18.1.0", - "git-url-parse": "^11.4.4", - "npmlog": "^4.1.2" + "builtins": "^5.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/gitlab-client": { - "version": "4.0.0", - "integrity": "sha512-OMUpGSkeDWFf7BxGHlkbb35T7YHqVFCwBPSIR6wRsszY8PAzCYahtH3IaJzEJyUg6vmZsNl0FSr3pdA2skhxqA==", + "node_modules/@lerna/bootstrap/node_modules/parse-conflict-json": { + "version": "2.0.2", + "integrity": "sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==", "dev": true, "dependencies": { - "node-fetch": "^2.6.1", - "npmlog": "^4.1.2", - "whatwg-url": "^8.4.0" + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/gitlab-client/node_modules/tr46": { - "version": "2.1.0", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "node_modules/@lerna/bootstrap/node_modules/proc-log": { + "version": "2.0.1", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/bootstrap/node_modules/read-cmd-shim": { + "version": "3.0.1", + "integrity": "sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/bootstrap/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { - "punycode": "^2.1.1" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/@lerna/gitlab-client/node_modules/webidl-conversions": { - "version": "6.1.0", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "node_modules/@lerna/bootstrap/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=10.4" + "node": ">=10" } }, - "node_modules/@lerna/gitlab-client/node_modules/whatwg-url": { - "version": "8.7.0", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "node_modules/@lerna/bootstrap/node_modules/ssri": { + "version": "9.0.1", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "minipass": "^3.1.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/global-options": { - "version": "4.0.0", - "integrity": "sha512-TRMR8afAHxuYBHK7F++Ogop2a82xQjoGna1dvPOY6ltj/pEx59pdgcJfYcynYqMkFIk8bhLJJN9/ndIfX29FTQ==", + "node_modules/@lerna/bootstrap/node_modules/treeverse": { + "version": "2.0.0", + "integrity": "sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A==", "dev": true, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/has-npm-version": { - "version": "4.0.0", - "integrity": "sha512-LQ3U6XFH8ZmLCsvsgq1zNDqka0Xzjq5ibVN+igAI5ccRWNaUsE/OcmsyMr50xAtNQMYMzmpw5GVLAivT2/YzCg==", + "node_modules/@lerna/bootstrap/node_modules/unique-filename": { + "version": "2.0.1", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, "dependencies": { - "@lerna/child-process": "4.0.0", - "semver": "^7.3.4" + "unique-slug": "^3.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/has-npm-version/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@lerna/bootstrap/node_modules/unique-slug": { + "version": "3.0.0", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/has-npm-version/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@lerna/bootstrap/node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "isexe": "^2.0.0" }, "bin": { - "semver": "bin/semver.js" + "node-which": "bin/node-which" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/@lerna/has-npm-version/node_modules/yallist": { + "node_modules/@lerna/bootstrap/node_modules/write-file-atomic": { + "version": "4.0.2", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/bootstrap/node_modules/yallist": { "version": "4.0.0", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/@lerna/import": { - "version": "4.0.0", - "integrity": "sha512-FaIhd+4aiBousKNqC7TX1Uhe97eNKf5/SC7c5WZANVWtC7aBWdmswwDt3usrzCNpj6/Wwr9EtEbYROzxKH8ffg==", + "node_modules/@lerna/changed": { + "version": "6.1.0", + "integrity": "sha512-p7C2tf1scmvoUC1Osck/XIKVKXAQ8m8neL8/rfgKSYsvUVjsOB1LbF5HH1VUZntE6S4OxkRxUQGkAHVf5xrGqw==", "dev": true, "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/prompt": "4.0.0", - "@lerna/pulse-till-done": "4.0.0", - "@lerna/validation-error": "4.0.0", - "dedent": "^0.7.0", - "fs-extra": "^9.1.0", - "p-map-series": "^2.1.0" + "@lerna/collect-updates": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/listable": "6.1.0", + "@lerna/output": "6.1.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/import/node_modules/fs-extra": { - "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@lerna/check-working-tree": { + "version": "6.1.0", + "integrity": "sha512-hSciDmRqsNPevMhAD+SYbnhjatdb7UUu9W8vTyGtUXkrq2xtRZU0vAOgqovV8meirRkbC41pZePYKqyQtF0y3w==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@lerna/collect-uncommitted": "6.1.0", + "@lerna/describe-ref": "6.1.0", + "@lerna/validation-error": "6.1.0" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/info": { - "version": "4.0.0", - "integrity": "sha512-8Uboa12kaCSZEn4XRfPz5KU9XXoexSPS4oeYGj76s2UQb1O1GdnEyfjyNWoUl1KlJ2i/8nxUskpXIftoFYH0/Q==", + "node_modules/@lerna/child-process": { + "version": "6.1.0", + "integrity": "sha512-jhr3sCFeps6Y15SCrWEPvqE64i+QLOTSh+OzxlziCBf7ZEUu7sF0yA4n5bAqw8j43yCKhhjkf/ZLYxZe+pnl3Q==", "dev": true, "dependencies": { - "@lerna/command": "4.0.0", - "@lerna/output": "4.0.0", - "envinfo": "^7.7.4" + "chalk": "^4.1.0", + "execa": "^5.0.0", + "strong-log-transformer": "^2.1.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/init": { - "version": "4.0.0", - "integrity": "sha512-wY6kygop0BCXupzWj5eLvTUqdR7vIAm0OgyV9WHpMYQGfs1V22jhztt8mtjCloD/O0nEe4tJhdG62XU5aYmPNQ==", + "node_modules/@lerna/child-process/node_modules/cross-spawn": { + "version": "7.0.3", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "fs-extra": "^9.1.0", - "p-map": "^4.0.0", - "write-json-file": "^4.3.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">= 10.18.0" + "node": ">= 8" } }, - "node_modules/@lerna/init/node_modules/fs-extra": { - "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@lerna/child-process/node_modules/execa": { + "version": "5.1.1", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@lerna/link": { - "version": "4.0.0", - "integrity": "sha512-KlvPi7XTAcVOByfaLlOeYOfkkDcd+bejpHMCd1KcArcFTwijOwXOVi24DYomIeHvy6HsX/IUquJ4PPUJIeB4+w==", + "node_modules/@lerna/child-process/node_modules/get-stream": { + "version": "6.0.1", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "@lerna/command": "4.0.0", - "@lerna/package-graph": "4.0.0", - "@lerna/symlink-dependencies": "4.0.0", - "p-map": "^4.0.0", - "slash": "^3.0.0" - }, "engines": { - "node": ">= 10.18.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/link/node_modules/slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/@lerna/child-process/node_modules/human-signals": { + "version": "2.1.0", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10.17.0" } }, - "node_modules/@lerna/list": { - "version": "4.0.0", - "integrity": "sha512-L2B5m3P+U4Bif5PultR4TI+KtW+SArwq1i75QZ78mRYxPc0U/piau1DbLOmwrdqr99wzM49t0Dlvl6twd7GHFg==", + "node_modules/@lerna/child-process/node_modules/is-stream": { + "version": "2.0.1", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "dependencies": { - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/listable": "4.0.0", - "@lerna/output": "4.0.0" - }, "engines": { - "node": ">= 10.18.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/listable": { - "version": "4.0.0", - "integrity": "sha512-/rPOSDKsOHs5/PBLINZOkRIX1joOXUXEtyUs5DHLM8q6/RP668x/1lFhw6Dx7/U+L0+tbkpGtZ1Yt0LewCLgeQ==", + "node_modules/@lerna/child-process/node_modules/npm-run-path": { + "version": "4.0.1", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "@lerna/query-graph": "4.0.0", - "chalk": "^4.1.0", - "columnify": "^1.5.4" + "path-key": "^3.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": ">=8" } }, - "node_modules/@lerna/log-packed": { - "version": "4.0.0", - "integrity": "sha512-+dpCiWbdzgMAtpajLToy9PO713IHoE6GV/aizXycAyA07QlqnkpaBNZ8DW84gHdM1j79TWockGJo9PybVhrrZQ==", + "node_modules/@lerna/child-process/node_modules/path-key": { + "version": "3.1.1", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "dependencies": { - "byte-size": "^7.0.0", - "columnify": "^1.5.4", - "has-unicode": "^2.0.1", - "npmlog": "^4.1.2" - }, "engines": { - "node": ">= 10.18.0" + "node": ">=8" } }, - "node_modules/@lerna/npm-conf": { - "version": "4.0.0", - "integrity": "sha512-uS7H02yQNq3oejgjxAxqq/jhwGEE0W0ntr8vM3EfpCW1F/wZruwQw+7bleJQ9vUBjmdXST//tk8mXzr5+JXCfw==", + "node_modules/@lerna/child-process/node_modules/shebang-command": { + "version": "2.0.0", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "config-chain": "^1.1.12", - "pify": "^5.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": ">=8" } }, - "node_modules/@lerna/npm-conf/node_modules/pify": { - "version": "5.0.0", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "node_modules/@lerna/child-process/node_modules/shebang-regex": { + "version": "3.0.0", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/@lerna/npm-dist-tag": { - "version": "4.0.0", - "integrity": "sha512-F20sg28FMYTgXqEQihgoqSfwmq+Id3zT23CnOwD+XQMPSy9IzyLf1fFVH319vXIw6NF6Pgs4JZN2Qty6/CQXGw==", + "node_modules/@lerna/child-process/node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "@lerna/otplease": "4.0.0", - "npm-package-arg": "^8.1.0", - "npm-registry-fetch": "^9.0.0", - "npmlog": "^4.1.2" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">= 10.18.0" + "node": ">= 8" } }, - "node_modules/@lerna/npm-dist-tag/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@lerna/clean": { + "version": "6.1.0", + "integrity": "sha512-LRK2hiNUiBhPe5tmJiefOVpkaX2Yob0rp15IFNIbuteRWUJg0oERFQo62WvnxwElfzKSOhr8OGuEq/vN4bMrRA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@lerna/command": "6.1.0", + "@lerna/filter-options": "6.1.0", + "@lerna/prompt": "6.1.0", + "@lerna/pulse-till-done": "6.1.0", + "@lerna/rimraf-dir": "6.1.0", + "p-map": "^4.0.0", + "p-map-series": "^2.1.0", + "p-waterfall": "^2.1.1" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/npm-dist-tag/node_modules/npm-registry-fetch": { - "version": "9.0.0", - "integrity": "sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA==", + "node_modules/@lerna/cli": { + "version": "6.1.0", + "integrity": "sha512-p4G/OSPIrHiNkEl8bXrQdFOh4ORAZp2+ljvbXmAxpdf2qmopaUdr+bZYtIAxd+Z42SxRnDNz9IEyR0kOsARRQQ==", "dev": true, "dependencies": { - "@npmcli/ci-detect": "^1.0.0", - "lru-cache": "^6.0.0", - "make-fetch-happen": "^8.0.9", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "@lerna/global-options": "6.1.0", + "dedent": "^0.7.0", + "npmlog": "^6.0.2", + "yargs": "^16.2.0" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/npm-dist-tag/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/@lerna/cli/node_modules/ansi-regex": { + "version": "5.0.1", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/@lerna/npm-install": { - "version": "4.0.0", - "integrity": "sha512-aKNxq2j3bCH3eXl3Fmu4D54s/YLL9WSwV8W7X2O25r98wzrO38AUN6AB9EtmAx+LV/SP15et7Yueg9vSaanRWg==", + "node_modules/@lerna/cli/node_modules/cliui": { + "version": "7.0.4", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/get-npm-exec-opts": "4.0.0", - "fs-extra": "^9.1.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", - "signal-exit": "^3.0.3", - "write-pkg": "^4.0.0" - }, + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/@lerna/cli/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { - "node": ">= 10.18.0" + "node": ">=8" } }, - "node_modules/@lerna/npm-install/node_modules/fs-extra": { - "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@lerna/cli/node_modules/string-width": { + "version": "4.2.3", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@lerna/npm-publish": { - "version": "4.0.0", - "integrity": "sha512-vQb7yAPRo5G5r77DRjHITc9piR9gvEKWrmfCH7wkfBnGWEqu7n8/4bFQ7lhnkujvc8RXOsYpvbMQkNfkYibD/w==", + "node_modules/@lerna/cli/node_modules/strip-ansi": { + "version": "6.0.1", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "@lerna/otplease": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "fs-extra": "^9.1.0", - "libnpmpublish": "^4.0.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", - "pify": "^5.0.0", - "read-package-json": "^3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 10.18.0" + "node": ">=8" } }, - "node_modules/@lerna/npm-publish/node_modules/fs-extra": { - "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@lerna/cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@lerna/npm-publish/node_modules/pify": { - "version": "5.0.0", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "node_modules/@lerna/cli/node_modules/y18n": { + "version": "5.0.8", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/npm-run-script": { - "version": "4.0.0", - "integrity": "sha512-Jmyh9/IwXJjOXqKfIgtxi0bxi1pUeKe5bD3S81tkcy+kyng/GNj9WSqD5ZggoNP2NP//s4CLDAtUYLdP7CU9rA==", + "node_modules/@lerna/cli/node_modules/yargs": { + "version": "16.2.0", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { - "@lerna/child-process": "4.0.0", - "@lerna/get-npm-exec-opts": "4.0.0", - "npmlog": "^4.1.2" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">= 10.18.0" + "node": ">=10" } }, - "node_modules/@lerna/otplease": { - "version": "4.0.0", - "integrity": "sha512-Sgzbqdk1GH4psNiT6hk+BhjOfIr/5KhGBk86CEfHNJTk9BK4aZYyJD4lpDbDdMjIV4g03G7pYoqHzH765T4fxw==", + "node_modules/@lerna/cli/node_modules/yargs-parser": { + "version": "20.2.9", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "dependencies": { - "@lerna/prompt": "4.0.0" - }, "engines": { - "node": ">= 10.18.0" + "node": ">=10" } }, - "node_modules/@lerna/output": { - "version": "4.0.0", - "integrity": "sha512-Un1sHtO1AD7buDQrpnaYTi2EG6sLF+KOPEAMxeUYG5qG3khTs2Zgzq5WE3dt2N/bKh7naESt20JjIW6tBELP0w==", + "node_modules/@lerna/collect-uncommitted": { + "version": "6.1.0", + "integrity": "sha512-VvWvqDZG+OiF4PwV4Ro695r3+8ty4w+11Bnq8tbsbu5gq8qZiam8Fkc/TQLuNNqP0SPi4qmMPaIzWvSze3SmDg==", "dev": true, "dependencies": { - "npmlog": "^4.1.2" + "@lerna/child-process": "6.1.0", + "chalk": "^4.1.0", + "npmlog": "^6.0.2" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/pack-directory": { - "version": "4.0.0", - "integrity": "sha512-NJrmZNmBHS+5aM+T8N6FVbaKFScVqKlQFJNY2k7nsJ/uklNKsLLl6VhTQBPwMTbf6Tf7l6bcKzpy7aePuq9UiQ==", + "node_modules/@lerna/collect-updates": { + "version": "6.1.0", + "integrity": "sha512-dgH7kgstwCXFctylQ4cxuCmhwSIE6VJZfHdh2bOaLuncs6ATMErKWN/mVuFHuUWEqPDRyy5Ky40Cu9S40nUq5w==", "dev": true, "dependencies": { - "@lerna/get-packed": "4.0.0", - "@lerna/package": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "npm-packlist": "^2.1.4", - "npmlog": "^4.1.2", - "tar": "^6.1.0", - "temp-write": "^4.0.0" + "@lerna/child-process": "6.1.0", + "@lerna/describe-ref": "6.1.0", + "minimatch": "^3.0.4", + "npmlog": "^6.0.2", + "slash": "^3.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/package": { - "version": "4.0.0", - "integrity": "sha512-l0M/izok6FlyyitxiQKr+gZLVFnvxRQdNhzmQ6nRnN9dvBJWn+IxxpM+cLqGACatTnyo9LDzNTOj2Db3+s0s8Q==", + "node_modules/@lerna/collect-updates/node_modules/slash": { + "version": "3.0.0", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "dependencies": { - "load-json-file": "^6.2.0", - "npm-package-arg": "^8.1.0", - "write-pkg": "^4.0.0" - }, "engines": { - "node": ">= 10.18.0" + "node": ">=8" } }, - "node_modules/@lerna/package-graph": { - "version": "4.0.0", - "integrity": "sha512-QED2ZCTkfXMKFoTGoccwUzjHtZMSf3UKX14A4/kYyBms9xfFsesCZ6SLI5YeySEgcul8iuIWfQFZqRw+Qrjraw==", + "node_modules/@lerna/command": { + "version": "6.1.0", + "integrity": "sha512-OnMqBDaEBY0C8v9CXIWFbGGKgsiUtZrnKVvQRbupMSZDKMpVGWIUd3X98Is9j9MAmk1ynhBMWE9Fwai5ML/mcA==", "dev": true, "dependencies": { - "@lerna/prerelease-id-from-version": "4.0.0", - "@lerna/validation-error": "4.0.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", - "semver": "^7.3.4" + "@lerna/child-process": "6.1.0", + "@lerna/package-graph": "6.1.0", + "@lerna/project": "6.1.0", + "@lerna/validation-error": "6.1.0", + "@lerna/write-log-file": "6.1.0", + "clone-deep": "^4.0.1", + "dedent": "^0.7.0", + "execa": "^5.0.0", + "is-ci": "^2.0.0", + "npmlog": "^6.0.2" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/package-graph/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@lerna/command/node_modules/cross-spawn": { + "version": "7.0.3", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/@lerna/package-graph/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@lerna/command/node_modules/execa": { + "version": "5.1.1", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@lerna/package-graph/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@lerna/package/node_modules/load-json-file": { - "version": "6.2.0", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", + "node_modules/@lerna/command/node_modules/get-stream": { + "version": "6.0.1", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^5.0.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.6.0" + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@lerna/command/node_modules/human-signals": { + "version": "2.1.0", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=10.17.0" } }, - "node_modules/@lerna/package/node_modules/parse-json": { - "version": "5.2.0", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/@lerna/command/node_modules/is-stream": { + "version": "2.0.1", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, "engines": { "node": ">=8" }, @@ -7924,77 +7936,79 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/package/node_modules/strip-bom": { - "version": "4.0.0", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/@lerna/command/node_modules/npm-run-path": { + "version": "4.0.1", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/@lerna/package/node_modules/type-fest": { - "version": "0.6.0", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "node_modules/@lerna/command/node_modules/path-key": { + "version": "3.1.1", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/@lerna/prerelease-id-from-version": { - "version": "4.0.0", - "integrity": "sha512-GQqguzETdsYRxOSmdFZ6zDBXDErIETWOqomLERRY54f4p+tk4aJjoVdd9xKwehC9TBfIFvlRbL1V9uQGHh1opg==", + "node_modules/@lerna/command/node_modules/shebang-command": { + "version": "2.0.0", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "semver": "^7.3.4" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": ">=8" } }, - "node_modules/@lerna/prerelease-id-from-version/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@lerna/command/node_modules/shebang-regex": { + "version": "3.0.0", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@lerna/prerelease-id-from-version/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@lerna/command/node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "isexe": "^2.0.0" }, "bin": { - "semver": "bin/semver.js" + "node-which": "bin/node-which" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/@lerna/prerelease-id-from-version/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@lerna/profiler": { - "version": "4.0.0", - "integrity": "sha512-/BaEbqnVh1LgW/+qz8wCuI+obzi5/vRE8nlhjPzdEzdmWmZXuCKyWSEzAyHOJWw1ntwMiww5dZHhFQABuoFz9Q==", + "node_modules/@lerna/conventional-commits": { + "version": "6.1.0", + "integrity": "sha512-Tipo3cVr8mNVca4btzrCIzct59ZJWERT8/ZCZ/TQWuI4huUJZs6LRofLtB0xsGJAVZ7Vz2WRXAeH4XYgeUxutQ==", "dev": true, "dependencies": { + "@lerna/validation-error": "6.1.0", + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-core": "^4.2.4", + "conventional-recommended-bump": "^6.1.0", "fs-extra": "^9.1.0", - "npmlog": "^4.1.2", - "upath": "^2.0.1" + "get-stream": "^6.0.0", + "npm-package-arg": "8.1.1", + "npmlog": "^6.0.2", + "pify": "^5.0.0", + "semver": "^7.3.4" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/profiler/node_modules/fs-extra": { + "node_modules/@lerna/conventional-commits/node_modules/fs-extra": { "version": "9.1.0", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, @@ -8008,206 +8022,285 @@ "node": ">=10" } }, - "node_modules/@lerna/profiler/node_modules/upath": { - "version": "2.0.1", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "node_modules/@lerna/conventional-commits/node_modules/get-stream": { + "version": "6.0.1", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { - "node": ">=4", - "yarn": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/project": { - "version": "4.0.0", - "integrity": "sha512-o0MlVbDkD5qRPkFKlBZsXZjoNTWPyuL58564nSfZJ6JYNmgAptnWPB2dQlAc7HWRZkmnC2fCkEdoU+jioPavbg==", + "node_modules/@lerna/conventional-commits/node_modules/hosted-git-info": { + "version": "3.0.8", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "dev": true, "dependencies": { - "@lerna/package": "4.0.0", - "@lerna/validation-error": "4.0.0", - "cosmiconfig": "^7.0.0", - "dedent": "^0.7.0", - "dot-prop": "^6.0.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.2", - "load-json-file": "^6.2.0", - "npmlog": "^4.1.2", - "p-map": "^4.0.0", - "resolve-from": "^5.0.0", - "write-json-file": "^4.3.0" + "lru-cache": "^6.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": ">=10" } }, - "node_modules/@lerna/project/node_modules/load-json-file": { - "version": "6.2.0", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", + "node_modules/@lerna/conventional-commits/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^5.0.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.6.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/@lerna/project/node_modules/parse-json": { - "version": "5.2.0", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/@lerna/conventional-commits/node_modules/npm-package-arg": { + "version": "8.1.1", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/@lerna/project/node_modules/resolve-from": { + "node_modules/@lerna/conventional-commits/node_modules/pify": { "version": "5.0.0", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/project/node_modules/strip-bom": { - "version": "4.0.0", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/@lerna/conventional-commits/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/@lerna/project/node_modules/type-fest": { - "version": "0.6.0", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "node_modules/@lerna/conventional-commits/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@lerna/create": { + "version": "6.1.0", + "integrity": "sha512-ZqlknXu0L29cV5mcfNgBLl+1RbKTWmNk8mj545zgXc7qQDgmrY+EVvrs8Cirey8C7bBpVkzP7Brzze0MSoB4rQ==", "dev": true, + "dependencies": { + "@lerna/child-process": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/npm-conf": "6.1.0", + "@lerna/validation-error": "6.1.0", + "dedent": "^0.7.0", + "fs-extra": "^9.1.0", + "init-package-json": "^3.0.2", + "npm-package-arg": "8.1.1", + "p-reduce": "^2.1.0", + "pacote": "^13.6.1", + "pify": "^5.0.0", + "semver": "^7.3.4", + "slash": "^3.0.0", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^4.0.0", + "yargs-parser": "20.2.4" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/prompt": { - "version": "4.0.0", - "integrity": "sha512-4Ig46oCH1TH5M7YyTt53fT6TuaKMgqUUaqdgxvp6HP6jtdak6+amcsqB8YGz2eQnw/sdxunx84DfI9XpoLj4bQ==", + "node_modules/@lerna/create-symlink": { + "version": "6.1.0", + "integrity": "sha512-ulMa5OUJEwEWBHSgCUNGxrcsJllq1YMYWqhufvIigmMPJ0Zv3TV1Hha5i2MsqLJAakxtW0pNuwdutkUTtUdgxQ==", "dev": true, "dependencies": { - "inquirer": "^7.3.3", - "npmlog": "^4.1.2" + "cmd-shim": "^5.0.0", + "fs-extra": "^9.1.0", + "npmlog": "^6.0.2" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/publish": { - "version": "4.0.0", - "integrity": "sha512-K8jpqjHrChH22qtkytA5GRKIVFEtqBF6JWj1I8dWZtHs4Jywn8yB1jQ3BAMLhqmDJjWJtRck0KXhQQKzDK2UPg==", - "dev": true, - "dependencies": { - "@lerna/check-working-tree": "4.0.0", - "@lerna/child-process": "4.0.0", - "@lerna/collect-updates": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/describe-ref": "4.0.0", - "@lerna/log-packed": "4.0.0", - "@lerna/npm-conf": "4.0.0", - "@lerna/npm-dist-tag": "4.0.0", - "@lerna/npm-publish": "4.0.0", - "@lerna/otplease": "4.0.0", - "@lerna/output": "4.0.0", - "@lerna/pack-directory": "4.0.0", - "@lerna/prerelease-id-from-version": "4.0.0", - "@lerna/prompt": "4.0.0", - "@lerna/pulse-till-done": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/validation-error": "4.0.0", - "@lerna/version": "4.0.0", - "fs-extra": "^9.1.0", - "libnpmaccess": "^4.0.1", - "npm-package-arg": "^8.1.0", - "npm-registry-fetch": "^9.0.0", - "npmlog": "^4.1.2", - "p-map": "^4.0.0", - "p-pipe": "^3.1.0", - "pacote": "^11.2.6", - "semver": "^7.3.4" + "node_modules/@lerna/create-symlink/node_modules/cmd-shim": { + "version": "5.0.0", + "integrity": "sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==", + "dev": true, + "dependencies": { + "mkdirp-infer-owner": "^2.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/publish/node_modules/@npmcli/run-script": { - "version": "1.8.6", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", + "node_modules/@lerna/create-symlink/node_modules/fs-extra": { + "version": "9.1.0", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@lerna/publish/node_modules/cacache": { - "version": "15.3.0", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "node_modules/@lerna/create/node_modules/@npmcli/fs": { + "version": "2.1.2", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/create/node_modules/@npmcli/git": { + "version": "3.0.2", + "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/create/node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@lerna/create/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/create/node_modules/@npmcli/node-gyp": { + "version": "2.0.0", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/create/node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "dev": true, + "dependencies": { + "infer-owner": "^1.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/create/node_modules/@npmcli/run-script": { + "version": "4.2.1", + "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/create/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@lerna/create/node_modules/cacache": { + "version": "16.1.3", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" }, "engines": { - "node": ">= 10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/publish/node_modules/chownr": { - "version": "2.0.0", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/@lerna/create/node_modules/cacache/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/@lerna/publish/node_modules/debug": { - "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "node_modules/@lerna/create/node_modules/chownr": { + "version": "2.0.0", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=10" } }, - "node_modules/@lerna/publish/node_modules/fs-extra": { + "node_modules/@lerna/create/node_modules/fs-extra": { "version": "9.1.0", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, @@ -8221,7 +8314,36 @@ "node": ">=10" } }, - "node_modules/@lerna/publish/node_modules/lru-cache": { + "node_modules/@lerna/create/node_modules/glob": { + "version": "8.0.3", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@lerna/create/node_modules/hosted-git-info": { + "version": "3.0.8", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/create/node_modules/lru-cache": { "version": "6.0.0", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, @@ -8232,7 +8354,34 @@ "node": ">=10" } }, - "node_modules/@lerna/publish/node_modules/mkdirp": { + "node_modules/@lerna/create/node_modules/minimatch": { + "version": "5.1.2", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/create/node_modules/minipass-fetch": { + "version": "2.1.2", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/@lerna/create/node_modules/mkdirp": { "version": "1.0.4", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, @@ -8243,137 +8392,232 @@ "node": ">=10" } }, - "node_modules/@lerna/publish/node_modules/ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "node_modules/@lerna/create/node_modules/npm-install-checks": { + "version": "5.0.0", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, - "node_modules/@lerna/publish/node_modules/negotiator": { - "version": "0.6.2", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "node_modules/@lerna/create/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, "engines": { - "node": ">= 0.6" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/publish/node_modules/node-gyp": { - "version": "7.1.2", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "node_modules/@lerna/create/node_modules/npm-package-arg": { + "version": "8.1.1", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", "dev": true, "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/create/node_modules/npm-package-arg/node_modules/validate-npm-package-name": { + "version": "3.0.0", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "dev": true, + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/@lerna/create/node_modules/npm-pick-manifest": { + "version": "7.0.2", + "integrity": "sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw==", + "dev": true, + "dependencies": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" }, "engines": { - "node": ">= 10.12.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/publish/node_modules/npm-registry-fetch": { - "version": "9.0.0", - "integrity": "sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA==", + "node_modules/@lerna/create/node_modules/npm-pick-manifest/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "dependencies": { - "@npmcli/ci-detect": "^1.0.0", - "lru-cache": "^6.0.0", - "make-fetch-happen": "^8.0.9", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/create/node_modules/npm-pick-manifest/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@lerna/create/node_modules/npm-pick-manifest/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/create/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/publish/node_modules/pacote": { - "version": "11.3.5", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", + "node_modules/@lerna/create/node_modules/npm-registry-fetch/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/create/node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@lerna/create/node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/create/node_modules/pacote": { + "version": "13.6.2", + "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", + "dev": true, + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" + "ssri": "^9.0.0", + "tar": "^6.1.11" }, "bin": { "pacote": "lib/bin.js" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/publish/node_modules/pacote/node_modules/make-fetch-happen": { - "version": "9.1.0", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "node_modules/@lerna/create/node_modules/pacote/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">= 10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/publish/node_modules/pacote/node_modules/npm-registry-fetch": { - "version": "11.0.0", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "node_modules/@lerna/create/node_modules/pacote/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@lerna/create/node_modules/pacote/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/create/node_modules/pify": { + "version": "5.0.0", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/publish/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@lerna/create/node_modules/proc-log": { + "version": "2.0.1", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/create/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -8385,209 +8629,188 @@ "node": ">=10" } }, - "node_modules/@lerna/publish/node_modules/socks-proxy-agent": { - "version": "6.1.1", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "node_modules/@lerna/create/node_modules/slash": { + "version": "3.0.0", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/@lerna/publish/node_modules/ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "node_modules/@lerna/create/node_modules/ssri": { + "version": "9.0.1", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "dependencies": { "minipass": "^3.1.1" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/publish/node_modules/which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/@lerna/create/node_modules/unique-filename": { + "version": "2.0.1", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "unique-slug": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/publish/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@lerna/pulse-till-done": { - "version": "4.0.0", - "integrity": "sha512-Frb4F7QGckaybRhbF7aosLsJ5e9WuH7h0KUkjlzSByVycxY91UZgaEIVjS2oN9wQLrheLMHl6SiFY0/Pvo0Cxg==", + "node_modules/@lerna/create/node_modules/unique-slug": { + "version": "3.0.0", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "dependencies": { - "npmlog": "^4.1.2" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/query-graph": { + "node_modules/@lerna/create/node_modules/validate-npm-package-name": { "version": "4.0.0", - "integrity": "sha512-YlP6yI3tM4WbBmL9GCmNDoeQyzcyg1e4W96y/PKMZa5GbyUvkS2+Jc2kwPD+5KcXou3wQZxSPzR3Te5OenaDdg==", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "dependencies": { - "@lerna/package-graph": "4.0.0" + "builtins": "^5.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/resolve-symlink": { - "version": "4.0.0", - "integrity": "sha512-RtX8VEUzqT+uLSCohx8zgmjc6zjyRlh6i/helxtZTMmc4+6O4FS9q5LJas2uGO2wKvBlhcD6siibGt7dIC3xZA==", + "node_modules/@lerna/create/node_modules/validate-npm-package-name/node_modules/builtins": { + "version": "5.0.1", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "dependencies": { - "fs-extra": "^9.1.0", - "npmlog": "^4.1.2", - "read-cmd-shim": "^2.0.0" - }, - "engines": { - "node": ">= 10.18.0" + "semver": "^7.0.0" } }, - "node_modules/@lerna/resolve-symlink/node_modules/fs-extra": { - "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@lerna/create/node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/@lerna/rimraf-dir": { + "node_modules/@lerna/create/node_modules/yallist": { "version": "4.0.0", - "integrity": "sha512-QNH9ABWk9mcMJh2/muD9iYWBk1oQd40y6oH+f3wwmVGKYU5YJD//+zMiBI13jxZRtwBx0vmBZzkBkK1dR11cBg==", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@lerna/create/node_modules/yargs-parser": { + "version": "20.2.4", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "dev": true, - "dependencies": { - "@lerna/child-process": "4.0.0", - "npmlog": "^4.1.2", - "path-exists": "^4.0.0", - "rimraf": "^3.0.2" - }, "engines": { - "node": ">= 10.18.0" + "node": ">=10" } }, - "node_modules/@lerna/rimraf-dir/node_modules/path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/@lerna/describe-ref": { + "version": "6.1.0", + "integrity": "sha512-0RQAYnxBaMz1SrEb/rhfR+8VeZx5tvCNYKRee5oXIDZdQ2c6/EPyrKCp3WcqiuOWY50SfGOVfxJEcxpK8Y3FNA==", "dev": true, + "dependencies": { + "@lerna/child-process": "6.1.0", + "npmlog": "^6.0.2" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/run": { - "version": "4.0.0", - "integrity": "sha512-9giulCOzlMPzcZS/6Eov6pxE9gNTyaXk0Man+iCIdGJNMrCnW7Dme0Z229WWP/UoxDKg71F2tMsVVGDiRd8fFQ==", + "node_modules/@lerna/diff": { + "version": "6.1.0", + "integrity": "sha512-GhP+jPDbcp9QcAMSAjFn4lzM8MKpLR1yt5jll+zUD831U1sL0I5t8HUosFroe5MoRNffEL/jHuI3SbC3jjqWjQ==", "dev": true, "dependencies": { - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/npm-run-script": "4.0.0", - "@lerna/output": "4.0.0", - "@lerna/profiler": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/timer": "4.0.0", - "@lerna/validation-error": "4.0.0", - "p-map": "^4.0.0" + "@lerna/child-process": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/validation-error": "6.1.0", + "npmlog": "^6.0.2" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/run-lifecycle": { - "version": "4.0.0", - "integrity": "sha512-IwxxsajjCQQEJAeAaxF8QdEixfI7eLKNm4GHhXHrgBu185JcwScFZrj9Bs+PFKxwb+gNLR4iI5rpUdY8Y0UdGQ==", + "node_modules/@lerna/exec": { + "version": "6.1.0", + "integrity": "sha512-Ej6WlPHXLF6hZHsfD+J/dxeuTrnc0HIfIXR1DU//msHW5RNCdi9+I7StwreCAQH/dLEsdBjPg5chNmuj2JLQRg==", "dev": true, "dependencies": { - "@lerna/npm-conf": "4.0.0", - "npm-lifecycle": "^3.1.5", - "npmlog": "^4.1.2" + "@lerna/child-process": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/filter-options": "6.1.0", + "@lerna/profiler": "6.1.0", + "@lerna/run-topologically": "6.1.0", + "@lerna/validation-error": "6.1.0", + "p-map": "^4.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/run-topologically": { - "version": "4.0.0", - "integrity": "sha512-EVZw9hGwo+5yp+VL94+NXRYisqgAlj0jWKWtAIynDCpghRxCE5GMO3xrQLmQgqkpUl9ZxQFpICgYv5DW4DksQA==", + "node_modules/@lerna/filter-options": { + "version": "6.1.0", + "integrity": "sha512-kPf92Z7uLsR6MUiXnyXWebaUWArLa15wLfpfTwIp5H3MNk1lTbuG7QnrxE7OxQj+ozFmBvXeV9fuwfLsYTfmOw==", "dev": true, "dependencies": { - "@lerna/query-graph": "4.0.0", - "p-queue": "^6.6.2" + "@lerna/collect-updates": "6.1.0", + "@lerna/filter-packages": "6.1.0", + "dedent": "^0.7.0", + "npmlog": "^6.0.2" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/symlink-binary": { - "version": "4.0.0", - "integrity": "sha512-zualodWC4q1QQc1pkz969hcFeWXOsVYZC5AWVtAPTDfLl+TwM7eG/O6oP+Rr3fFowspxo6b1TQ6sYfDV6HXNWA==", + "node_modules/@lerna/filter-packages": { + "version": "6.1.0", + "integrity": "sha512-zW2avsZHs/ITE/37AEMhegGVHjiD0rgNk9bguNDfz6zaPa90UaW6PWDH6Tf4ThPRlbkl2Go48N3bFYHYSJKbcw==", "dev": true, "dependencies": { - "@lerna/create-symlink": "4.0.0", - "@lerna/package": "4.0.0", - "fs-extra": "^9.1.0", - "p-map": "^4.0.0" + "@lerna/validation-error": "6.1.0", + "multimatch": "^5.0.0", + "npmlog": "^6.0.2" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/symlink-binary/node_modules/fs-extra": { - "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@lerna/get-npm-exec-opts": { + "version": "6.1.0", + "integrity": "sha512-10Pdf+W0z7RT34o0SWlf+WVzz2/WbnTIJ1tQqXvXx6soj2L/xGLhOPvhJiKNtl4WlvUiO/zQ91yb83ESP4TZaA==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "npmlog": "^6.0.2" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/symlink-dependencies": { - "version": "4.0.0", - "integrity": "sha512-BABo0MjeUHNAe2FNGty1eantWp8u83BHSeIMPDxNq0MuW2K3CiQRaeWT3EGPAzXpGt0+hVzBrA6+OT0GPn7Yuw==", + "node_modules/@lerna/get-packed": { + "version": "6.1.0", + "integrity": "sha512-lg0wPpV0wPekcD0mebJp619hMxsOgbZDOH5AkL/bCR217391eha0iPhQ0dU/G0Smd2vv6Cg443+J5QdI4LGRTg==", "dev": true, "dependencies": { - "@lerna/create-symlink": "4.0.0", - "@lerna/resolve-symlink": "4.0.0", - "@lerna/symlink-binary": "4.0.0", "fs-extra": "^9.1.0", - "p-map": "^4.0.0", - "p-map-series": "^2.1.0" + "ssri": "^9.0.1", + "tar": "^6.1.0" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/symlink-dependencies/node_modules/fs-extra": { + "node_modules/@lerna/get-packed/node_modules/fs-extra": { "version": "9.1.0", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, @@ -8601,909 +8824,829 @@ "node": ">=10" } }, - "node_modules/@lerna/timer": { - "version": "4.0.0", - "integrity": "sha512-WFsnlaE7SdOvjuyd05oKt8Leg3ENHICnvX3uYKKdByA+S3g+TCz38JsNs7OUZVt+ba63nC2nbXDlUnuT2Xbsfg==", + "node_modules/@lerna/get-packed/node_modules/ssri": { + "version": "9.0.1", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, "engines": { - "node": ">= 10.18.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/validation-error": { - "version": "4.0.0", - "integrity": "sha512-1rBOM5/koiVWlRi3V6dB863E1YzJS8v41UtsHgMr6gB2ncJ2LsQtMKlJpi3voqcgh41H8UsPXR58RrrpPpufyw==", + "node_modules/@lerna/github-client": { + "version": "6.1.0", + "integrity": "sha512-+/4PtDgsjt0VRRZtOCN2Piyu0asU/16gSZZy/opVb8dlT44lTrH/ZghrJLE4tSL8Nuv688kx0kSgbUG8BY54jQ==", "dev": true, "dependencies": { - "npmlog": "^4.1.2" + "@lerna/child-process": "6.1.0", + "@octokit/plugin-enterprise-rest": "^6.0.1", + "@octokit/rest": "^19.0.3", + "git-url-parse": "^13.1.0", + "npmlog": "^6.0.2" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@lerna/version": { - "version": "4.0.0", - "integrity": "sha512-otUgiqs5W9zGWJZSCCMRV/2Zm2A9q9JwSDS7s/tlKq4mWCYriWo7+wsHEA/nPTMDyYyBO5oyZDj+3X50KDUzeA==", - "dev": true, - "dependencies": { - "@lerna/check-working-tree": "4.0.0", - "@lerna/child-process": "4.0.0", - "@lerna/collect-updates": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/conventional-commits": "4.0.0", - "@lerna/github-client": "4.0.0", - "@lerna/gitlab-client": "4.0.0", - "@lerna/output": "4.0.0", - "@lerna/prerelease-id-from-version": "4.0.0", - "@lerna/prompt": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/validation-error": "4.0.0", - "chalk": "^4.1.0", - "dedent": "^0.7.0", - "load-json-file": "^6.2.0", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "p-map": "^4.0.0", - "p-pipe": "^3.1.0", - "p-reduce": "^2.1.0", - "p-waterfall": "^2.1.1", - "semver": "^7.3.4", - "slash": "^3.0.0", - "temp-write": "^4.0.0", - "write-json-file": "^4.3.0" + "node_modules/@lerna/github-client/node_modules/@octokit/auth-token": { + "version": "3.0.2", + "integrity": "sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==", + "dev": true, + "dependencies": { + "@octokit/types": "^8.0.0" }, "engines": { - "node": ">= 10.18.0" + "node": ">= 14" } }, - "node_modules/@lerna/version/node_modules/load-json-file": { - "version": "6.2.0", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", + "node_modules/@lerna/github-client/node_modules/@octokit/core": { + "version": "4.1.0", + "integrity": "sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^5.0.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.6.0" + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^8.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/@lerna/version/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@lerna/github-client/node_modules/@octokit/endpoint": { + "version": "7.0.3", + "integrity": "sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@octokit/types": "^8.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">=10" + "node": ">= 14" } }, - "node_modules/@lerna/version/node_modules/parse-json": { - "version": "5.2.0", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/@lerna/github-client/node_modules/@octokit/graphql": { + "version": "5.0.4", + "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "@octokit/request": "^6.0.0", + "@octokit/types": "^8.0.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14" } }, - "node_modules/@lerna/version/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@lerna/github-client/node_modules/@octokit/openapi-types": { + "version": "14.0.0", + "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==", + "dev": true + }, + "node_modules/@lerna/github-client/node_modules/@octokit/plugin-paginate-rest": { + "version": "5.0.1", + "integrity": "sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@octokit/types": "^8.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@lerna/version/node_modules/slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" } }, - "node_modules/@lerna/version/node_modules/strip-bom": { - "version": "4.0.0", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/@lerna/github-client/node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "6.7.0", + "integrity": "sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw==", "dev": true, + "dependencies": { + "@octokit/types": "^8.0.0", + "deprecation": "^2.3.1" + }, "engines": { - "node": ">=8" + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" } }, - "node_modules/@lerna/version/node_modules/type-fest": { - "version": "0.6.0", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "node_modules/@lerna/github-client/node_modules/@octokit/request": { + "version": "6.2.2", + "integrity": "sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==", "dev": true, + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^8.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/@lerna/version/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@lerna/write-log-file": { - "version": "4.0.0", - "integrity": "sha512-XRG5BloiArpXRakcnPHmEHJp+4AtnhRtpDIHSghmXD5EichI1uD73J7FgPp30mm2pDRq3FdqB0NbwSEsJ9xFQg==", + "node_modules/@lerna/github-client/node_modules/@octokit/rest": { + "version": "19.0.5", + "integrity": "sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==", "dev": true, "dependencies": { - "npmlog": "^4.1.2", - "write-file-atomic": "^3.0.3" + "@octokit/core": "^4.1.0", + "@octokit/plugin-paginate-rest": "^5.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^6.7.0" }, "engines": { - "node": ">= 10.18.0" + "node": ">= 14" } }, - "node_modules/@loaders.gl/3d-tiles": { - "version": "3.0.8", - "integrity": "sha512-jZeOyDPGD2wEkTLW4Do9A4UUQ+OGjhhNXztB0AsttZ69OpkmsxJXb76xxwevf+eThrsTgSTjZ06eC5DHX0kyXA==", + "node_modules/@lerna/github-client/node_modules/@octokit/types": { + "version": "8.0.0", + "integrity": "sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==", + "dev": true, "dependencies": { - "@loaders.gl/core": "3.0.8", - "@loaders.gl/draco": "3.0.8", - "@loaders.gl/gltf": "3.0.8", - "@loaders.gl/loader-utils": "3.0.8", - "@loaders.gl/math": "3.0.8", - "@loaders.gl/tiles": "3.0.8", - "@math.gl/core": "^3.5.1", - "@math.gl/geospatial": "^3.5.1" + "@octokit/openapi-types": "^14.0.0" } }, - "node_modules/@loaders.gl/core": { - "version": "3.0.8", - "integrity": "sha512-FIfbhMkoRX2JonEHXHgClC7jwOSsEwvvmjlaTMRAY+gFKvJPGmegkp4VgUZquLFf6GedJt/1TuMMvAX6gdq1pg==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/loader-utils": "3.0.8", - "@loaders.gl/worker-utils": "3.0.8", - "probe.gl": "^3.4.0" + "node_modules/@lerna/github-client/node_modules/is-plain-object": { + "version": "5.0.0", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@loaders.gl/draco": { - "version": "3.0.8", - "integrity": "sha512-ZCXzXNHWQ7H0qk/kC+rWzjMWjLzZGzQcDbdpIuy8xJdp4rTpmMkLUseFPby8vhkmIaqxWPwPB6mx/vM7L6JENg==", + "node_modules/@lerna/gitlab-client": { + "version": "6.1.0", + "integrity": "sha512-fUI/ppXzxJafN9ceSl+FDgsYvu3iTsO6UW0WTD63pS32CfM+PiCryLQHzuc4RkyVW8WQH3aCR/GbaKCqbu52bw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/loader-utils": "3.0.8", - "@loaders.gl/schema": "3.0.8", - "@loaders.gl/worker-utils": "3.0.8", - "draco3d": "1.4.1" + "node-fetch": "^2.6.1", + "npmlog": "^6.0.2" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@loaders.gl/gis": { - "version": "3.0.8", - "integrity": "sha512-7NL+lIb7NezlMupYskVil6M3RZunXJl+TyaVAW82GLbzPSOq+m/G7h3+z0GBa8iv/U/I+cB5BhSN+GZmvFwqEA==", - "dependencies": { - "@loaders.gl/loader-utils": "3.0.8", - "@loaders.gl/schema": "3.0.8", - "@mapbox/vector-tile": "^1.3.1", - "pbf": "^3.2.1" + "node_modules/@lerna/global-options": { + "version": "6.1.0", + "integrity": "sha512-1OyJ/N1XJh3ZAy8S20c6th9C4yBm/k3bRIdC+z0XxpDaHwfNt8mT9kUIDt6AIFCUvVKjSwnIsMHwhzXqBnwYSA==", + "dev": true, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@loaders.gl/gltf": { - "version": "3.0.8", - "integrity": "sha512-4PXWTlqyvlbZE2Vp4iQ+Y87ZO1WuRvSlbImDhygd0hoINfmJ9ObxrFS3yJcpJTu007nWxXorNVEOKyuoo+4Iyw==", + "node_modules/@lerna/has-npm-version": { + "version": "6.1.0", + "integrity": "sha512-up5PVuP6BmKQ5/UgH/t2c5B1q4HhjwW3/bqbNayX6V0qNz8OijnMYvEUbxFk8fOdeN41qVnhAk0Tb5kbdtYh2A==", + "dev": true, "dependencies": { - "@loaders.gl/core": "3.0.8", - "@loaders.gl/draco": "3.0.8", - "@loaders.gl/images": "3.0.8", - "@loaders.gl/loader-utils": "3.0.8" + "@lerna/child-process": "6.1.0", + "semver": "^7.3.4" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@loaders.gl/images": { - "version": "3.0.8", - "integrity": "sha512-rO2cIYJYlMs/uO9YSoF4/BEA4p/9xQ3gHZ1sIJkPYVnDqzpbu8nvUjWTQqIdL/MkQBTW8tz3twCdM+B6G9Fa2w==", + "node_modules/@lerna/has-npm-version/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { - "@loaders.gl/loader-utils": "3.0.8" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@loaders.gl/loader-utils": { - "version": "3.0.8", - "integrity": "sha512-PW1WyyQ+LXkqoGHBZHsmfNQkKiLAYf1gok+kHnHvY9fCzhJeA1iTNEUKPXGXKgS00m/k5cBTkOWAaOG9KRvBCQ==", + "node_modules/@lerna/has-npm-version/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/worker-utils": "3.0.8", - "@probe.gl/stats": "^3.4.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@loaders.gl/math": { - "version": "3.0.8", - "integrity": "sha512-jfFpxxr4Bq5JfOPqLVJc4JJGoGGvVTOCWiJhnTtSAKhaNSwldmNWaZ0w8E2nlgPKPMAHiTRKOQnd9sSY5m66Cw==", - "dependencies": { - "@loaders.gl/images": "3.0.8", - "@loaders.gl/loader-utils": "3.0.8", - "@math.gl/core": "^3.5.1" - } + "node_modules/@lerna/has-npm-version/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, - "node_modules/@loaders.gl/mvt": { - "version": "3.0.8", - "integrity": "sha512-Jk1QTHgpxMsUT01w5IJJ2en9qq0yOZcL2wGXVc7CFp2h6inB22rC3drUwq1mUNGe6iy3EWIo7EeJVd9B+5JyTQ==", + "node_modules/@lerna/import": { + "version": "6.1.0", + "integrity": "sha512-xsBhiKLUavATR32dAFL+WFY0yuab0hsM1eztKtRKk4wy7lSyxRfA5EIUcNCsLXx2xaDOKoMncCTXgNcpeYuqcQ==", + "dev": true, "dependencies": { - "@loaders.gl/gis": "3.0.8", - "@loaders.gl/loader-utils": "3.0.8", - "@math.gl/polygon": "^3.5.1", - "pbf": "^3.2.1" + "@lerna/child-process": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/prompt": "6.1.0", + "@lerna/pulse-till-done": "6.1.0", + "@lerna/validation-error": "6.1.0", + "dedent": "^0.7.0", + "fs-extra": "^9.1.0", + "p-map-series": "^2.1.0" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@loaders.gl/schema": { - "version": "3.0.8", - "integrity": "sha512-yne5WE7fZZWFl2zF8fzDlYhPVJua6h6mTCSmlQ5pryaMXTZS9mfzXXIFWRL3kswqnQTu/QNFdyFj1mP0haF24w==", + "node_modules/@lerna/import/node_modules/fs-extra": { + "version": "9.1.0", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "dependencies": { - "@types/geojson": "^7946.0.7", - "apache-arrow": "^4.0.0", - "d3-dsv": "^1.2.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@loaders.gl/terrain": { - "version": "3.0.8", - "integrity": "sha512-MtOAYEB/xJB4CN4B0YNPkO4v1ZY332joxiOHQI1x37x4sWVAqOrKLr9jB42sZCB8aINi2WMWGiErtf9wh9L5Pg==", + "node_modules/@lerna/info": { + "version": "6.1.0", + "integrity": "sha512-CsrWdW/Wyb4kcvHSnrsm7KYWFvjUNItu+ryeyWBZJtWYQOv45jNmWix6j2L4/w1+mMlWMjsfLmBscg82UBrF5w==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/loader-utils": "3.0.8", - "@loaders.gl/schema": "3.0.8", - "@mapbox/martini": "^0.2.0" + "@lerna/command": "6.1.0", + "@lerna/output": "6.1.0", + "envinfo": "^7.7.4" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@loaders.gl/tiles": { - "version": "3.0.8", - "integrity": "sha512-Rc+yHFdQg2sYmcYkwvszukFWdm9EW354F9HUR7y/oauos6tsdo4YTj31zgytaYR63/EqWQ7kwI29/eePEcutzg==", + "node_modules/@lerna/init": { + "version": "6.1.0", + "integrity": "sha512-z8oUeVjn+FQYAtepAw6G47cGodLyBAyNoEjO3IsJjQLWE1yH3r83L2sjyD/EckgR3o2VTEzrKo4ArhxLp2mNmg==", + "dev": true, "dependencies": { - "@loaders.gl/core": "3.0.8", - "@loaders.gl/loader-utils": "3.0.8", - "@loaders.gl/math": "3.0.8", - "@math.gl/core": "^3.5.1", - "@math.gl/culling": "^3.5.1", - "@math.gl/geospatial": "^3.5.1", - "@math.gl/web-mercator": "^3.5.1", - "@probe.gl/stats": "^3.4.0" + "@lerna/child-process": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/project": "6.1.0", + "fs-extra": "^9.1.0", + "p-map": "^4.0.0", + "write-json-file": "^4.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@loaders.gl/worker-utils": { - "version": "3.0.8", - "integrity": "sha512-Pg72HuXPcL725TrOlOr83xloVUHj6OMWmno1dI8ccuqfOBsgoRjxNZrcSvwBzfK8tFCzuN2X30I+mHl3BkuYLw==", + "node_modules/@lerna/init/node_modules/fs-extra": { + "version": "9.1.0", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.3.1" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@luma.gl/constants": { - "version": "8.5.4", - "integrity": "sha512-lrA4ja92om/gDHYOvM9itL5S7FVzjKulyknDz6S+Y7gmgHgXk2ln1Xar5zUCsLnhAYx4glHITXGH5Y5rdWgT1Q==" - }, - "node_modules/@luma.gl/core": { - "version": "8.5.4", - "integrity": "sha512-+saDz1D3mcPd53vgbG60ryg1w5CF9Z2wdakKHzR810VoJLw97t4aNdg/eNgyWOvbOHxaKJBPm8K0sGjej67+jw==", + "node_modules/@lerna/link": { + "version": "6.1.0", + "integrity": "sha512-7OD2lYNQHl6Kl1KYmplt8KoWjVHdiaqpYqwD38AwcB09YN58nGmo4aJgC12Fdx8DSNjkumgM0ROg/JOjMCTIzQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.4", - "@luma.gl/engine": "8.5.4", - "@luma.gl/gltools": "8.5.4", - "@luma.gl/shadertools": "8.5.4", - "@luma.gl/webgl": "8.5.4" + "@lerna/command": "6.1.0", + "@lerna/package-graph": "6.1.0", + "@lerna/symlink-dependencies": "6.1.0", + "@lerna/validation-error": "6.1.0", + "p-map": "^4.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@luma.gl/engine": { - "version": "8.5.4", - "integrity": "sha512-Sfv972IzvR9s9kKWugs67XQUh9jC0e/PpBrzvyGVnPU4XvFq42RZVF73pzEklVU6AlpR8Zg5CPtxGdhyOHtT7w==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.4", - "@luma.gl/gltools": "8.5.4", - "@luma.gl/shadertools": "8.5.4", - "@luma.gl/webgl": "8.5.4", - "@math.gl/core": "^3.5.0", - "probe.gl": "^3.4.0" + "node_modules/@lerna/link/node_modules/slash": { + "version": "3.0.0", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/@luma.gl/experimental": { - "version": "8.5.4", - "integrity": "sha512-09waqRhgIrw+Sq0/in4tw4jPag5YsFfV1nEHJaLAg5RFv92S53IEubSJgkuG02HoOBkPxQ7KYvs9VNmriisnYg==", + "node_modules/@lerna/list": { + "version": "6.1.0", + "integrity": "sha512-7/g2hjizkvVnBGpVm+qC7lUFGhZ/0GIMUbGQwnE6yXDGm8yP9aEcNVkU4JGrDWW+uIklf9oodnMHaLXd/FJe6Q==", + "dev": true, "dependencies": { - "@luma.gl/constants": "8.5.4", - "@math.gl/core": "^3.5.0", - "earcut": "^2.0.6" + "@lerna/command": "6.1.0", + "@lerna/filter-options": "6.1.0", + "@lerna/listable": "6.1.0", + "@lerna/output": "6.1.0" }, - "peerDependencies": { - "@loaders.gl/gltf": "^3.0.0", - "@loaders.gl/images": "^3.0.0", - "@luma.gl/engine": "^8.4.0", - "@luma.gl/gltools": "^8.4.0", - "@luma.gl/shadertools": "^8.4.0", - "@luma.gl/webgl": "^8.4.0" + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@luma.gl/gltools": { - "version": "8.5.4", - "integrity": "sha512-JotiPuymQz2Xc41AYlS2moJC/EHxU+OX/OMKi0+/MeOlEFLsdochgTA0I64j8yofLTXdeiGCneGtD1Ao8fk+bw==", + "node_modules/@lerna/listable": { + "version": "6.1.0", + "integrity": "sha512-3KZ9lQ9AtNfGNH/mYJYaMKCiF2EQvLLBGYkWHeIzIs6foegcZNXe0Cyv3LNXuo5WslMNr5RT4wIgy3BOoAxdtg==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.4", - "probe.gl": "^3.4.0" + "@lerna/query-graph": "6.1.0", + "chalk": "^4.1.0", + "columnify": "^1.6.0" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@luma.gl/shadertools": { - "version": "8.5.4", - "integrity": "sha512-rwLBLrACi75aWnuJm8rVKCQnJR2sMTCxHuexfjHJ7Uecl0vVcVJZT7c9EnCFaz5LUTNbdupvuhq0SKNckKiKmw==", + "node_modules/@lerna/log-packed": { + "version": "6.1.0", + "integrity": "sha512-Sq2HZJAcPuoNeEHeIutcPYQCyWBxLyVGvEhgsP3xTe6XkBGQCG8piCp9wX+sc2zT+idPdpI6qLqdh85yYIMMhA==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.0.0", - "@math.gl/core": "^3.5.0" + "byte-size": "^7.0.0", + "columnify": "^1.6.0", + "has-unicode": "^2.0.1", + "npmlog": "^6.0.2" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@luma.gl/webgl": { - "version": "8.5.4", - "integrity": "sha512-dWy4dhTbtvDO9zQBdx1Yb+DxNx/1JWV9rhhJxJUtTKbGZSX0RjkASTT6GBWMl5jrH1JYJefS1wswHmmPVXjK0Q==", + "node_modules/@lerna/npm-conf": { + "version": "6.1.0", + "integrity": "sha512-+RD3mmJe9XSQj7Diibs0+UafAHPcrFCd29ODpDI+tzYl4MmYZblfrlL6mbSCiVYCZQneQ8Uku3P0r+DlbYBaFw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.4", - "@luma.gl/gltools": "8.5.4", - "probe.gl": "^3.4.0" + "config-chain": "^1.1.12", + "pify": "^5.0.0" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@mapbox/extent": { - "version": "0.4.0", - "integrity": "sha512-MSoKw3qPceGuupn04sdaJrFeLKvcSETVLZCGS8JA9x6zXQL3FWiKaIXYIZEDXd5jpXpWlRxinCZIN49yRy0C9A==" + "node_modules/@lerna/npm-conf/node_modules/pify": { + "version": "5.0.0", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@mapbox/geojson-area": { - "version": "0.2.2", - "integrity": "sha512-bBqqFn1kIbLBfn7Yq1PzzwVkPYQr9lVUeT8Dhd0NL5n76PBuXzOcuLV7GOSbEB1ia8qWxH4COCvFpziEu/yReA==", + "node_modules/@lerna/npm-dist-tag": { + "version": "6.1.0", + "integrity": "sha512-1zo+Yww/lvWJWZnEXpke9dZSb5poDzhUM/pQNqAQYSlbZ96o18SuCR6TEi5isMPiw63Aq1MMzbUqttQfJ11EOA==", + "dev": true, "dependencies": { - "wgs84": "0.0.0" + "@lerna/otplease": "6.1.0", + "npm-package-arg": "8.1.1", + "npm-registry-fetch": "^13.3.0", + "npmlog": "^6.0.2" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@mapbox/geojson-coords": { - "version": "0.0.2", - "integrity": "sha512-YuVzpseee/P1T5BWyeVVPppyfmuXYHFwZHmybkqaMfu4BWlOf2cmMGKj2Rr92MwfSTOCSUA0PAsVGRG8akY0rg==", + "node_modules/@lerna/npm-dist-tag/node_modules/builtins": { + "version": "5.0.1", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, "dependencies": { - "@mapbox/geojson-normalize": "0.0.1", - "geojson-flatten": "^1.0.4" + "semver": "^7.0.0" } }, - "node_modules/@mapbox/geojson-extent": { - "version": "1.0.1", - "integrity": "sha512-hh8LEO3djT4fqfr8sSC6wKt+p0TMiu+KOLMBUiFOyj+zGq7+IXwQGl0ppCVDkyzCewyd9LoGe9zAvDxXrLfhLw==", + "node_modules/@lerna/npm-dist-tag/node_modules/hosted-git-info": { + "version": "3.0.8", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dev": true, "dependencies": { - "@mapbox/extent": "0.4.0", - "@mapbox/geojson-coords": "0.0.2", - "rw": "~0.1.4", - "traverse": "~0.6.6" + "lru-cache": "^6.0.0" }, - "bin": { - "geojson-extent": "bin/geojson-extent" - } - }, - "node_modules/@mapbox/geojson-extent/node_modules/rw": { - "version": "0.1.4", - "integrity": "sha512-vSj3D96kMcjNyqPcp65wBRIDImGSrUuMxngNNxvw8MQaO+aQ6llzRPH7XcJy5zrpb3wU++045+Uz/IDIM684iw==" - }, - "node_modules/@mapbox/geojson-normalize": { - "version": "0.0.1", - "integrity": "sha512-82V7YHcle8lhgIGqEWwtXYN5cy0QM/OHq3ypGhQTbvHR57DF0vMHMjjVSQKFfVXBe/yWCBZTyOuzvK7DFFnx5Q==", - "bin": { - "geojson-normalize": "geojson-normalize" + "engines": { + "node": ">=10" } }, - "node_modules/@mapbox/geojson-rewind": { - "version": "0.4.1", - "integrity": "sha512-mxo2MEr7izA1uOXcDsw99Kgg6xW3P4H2j4n1lmldsgviIelpssvP+jQDivFKOHrOVJDpTTi5oZJvRcHtU9Uufw==", + "node_modules/@lerna/npm-dist-tag/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { - "@mapbox/geojson-area": "0.2.2", - "concat-stream": "~1.6.0", - "minimist": "^1.2.5", - "sharkdown": "^0.1.0" + "yallist": "^4.0.0" }, - "bin": { - "geojson-rewind": "geojson-rewind" - } - }, - "node_modules/@mapbox/geojson-types": { - "version": "1.0.2", - "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" - }, - "node_modules/@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mapbox/mapbox-gl-supported": { - "version": "1.5.0", - "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", - "peerDependencies": { - "mapbox-gl": ">=0.32.1 <2.0.0" + "node": ">=10" } }, - "node_modules/@mapbox/martini": { - "version": "0.2.0", - "integrity": "sha512-7hFhtkb0KTLEls+TRw/rWayq5EeHtTaErgm/NskVoXmtgAQu/9D299aeyj6mzAR/6XUnYRp2lU+4IcrYRFjVsQ==" - }, - "node_modules/@mapbox/point-geometry": { - "version": "0.1.0", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" - }, - "node_modules/@mapbox/tiny-sdf": { - "version": "1.2.5", - "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" - }, - "node_modules/@mapbox/unitbezier": { - "version": "0.0.0", - "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" - }, - "node_modules/@mapbox/vector-tile": { - "version": "1.3.1", - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "node_modules/@lerna/npm-dist-tag/node_modules/minipass-fetch": { + "version": "2.1.2", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, "dependencies": { - "@mapbox/point-geometry": "~0.1.0" - } - }, - "node_modules/@mapbox/whoots-js": { - "version": "3.1.0", - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, "engines": { - "node": ">=6.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/@math.gl/core": { - "version": "3.5.3", - "integrity": "sha512-TaSnvG0qFh1VxeNW5L58jSx0nJUMWMpUl6zo6Z3ScQzFySG5cicGOBzk/D40RkIZWPazCKCZ+ZThg5npSK9y3g==", + "node_modules/@lerna/npm-dist-tag/node_modules/npm-package-arg": { + "version": "8.1.1", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.12.0", - "gl-matrix": "^3.0.0" + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@math.gl/culling": { - "version": "3.5.3", - "integrity": "sha512-ABpAcrvoIOLSm1EUkwgDem4RfO28HWPBs/+taZ/ZSpJG6KiVPklpKU1NCK+05HuJStkpFZ+XlWtehWU6FAMCyA==", + "node_modules/@lerna/npm-dist-tag/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.12.0", - "@math.gl/core": "3.5.3", - "gl-matrix": "^3.0.0" + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@math.gl/geospatial": { - "version": "3.5.3", - "integrity": "sha512-cnc8VMQrt30JmlG200VDJmmvSjaGW57gY9KEZ+raapxyyFyfDNuAuIrIxe+zbK66FbvFWTbJlDaNmKqVG+ohyw==", + "node_modules/@lerna/npm-dist-tag/node_modules/npm-registry-fetch/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.12.0", - "@math.gl/core": "3.5.3", - "gl-matrix": "^3.0.0" + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@math.gl/polygon": { - "version": "3.5.3", - "integrity": "sha512-VktscmyQg/Rd56nJk0Nj/UyvnPDbsnZNMWCdl3G5AYenYzLWy6h4FEWhLx8pD+Xw7VuFot8LR4WAK2TPzXzrWw==", - "dependencies": { - "@math.gl/core": "3.5.3" + "node_modules/@lerna/npm-dist-tag/node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" } }, - "node_modules/@math.gl/web-mercator": { - "version": "3.5.6", - "integrity": "sha512-siWHLJGp9o8fDEM1t0Rby+JXftl6il0z3927liWGzkHqFftXPHY858ShPy45ThDU8q5lyCftg8aVgrv4nfD+Zw==", + "node_modules/@lerna/npm-dist-tag/node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.12.0", - "gl-matrix": "~3.3.0" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@mdx-js/loader": { - "version": "1.6.22", - "integrity": "sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q==", + "node_modules/@lerna/npm-dist-tag/node_modules/npm-registry-fetch/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "dependencies": { - "@mdx-js/mdx": "1.6.22", - "@mdx-js/react": "1.6.22", - "loader-utils": "2.0.0" + "builtins": "^5.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@mdx-js/loader/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "node_modules/@lerna/npm-dist-tag/node_modules/proc-log": { + "version": "2.0.1", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", "dev": true, - "bin": { - "json5": "lib/cli.js" - }, "engines": { - "node": ">=6" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@mdx-js/loader/node_modules/loader-utils": { - "version": "2.0.0", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "node_modules/@lerna/npm-dist-tag/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=10" } }, - "node_modules/@mdx-js/mdx": { - "version": "1.6.22", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "node_modules/@lerna/npm-dist-tag/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, - "node_modules/@mdx-js/mdx/node_modules/@babel/core": { - "version": "7.12.9", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "node_modules/@lerna/npm-install": { + "version": "6.1.0", + "integrity": "sha512-1SHmOHZA1YJuUctLQBRjA2+yMp+UNYdOBsFb3xUVT7MjWnd1Zl0toT3jxGu96RNErD9JKkk/cGo/Aq+DU3s9pg==", + "dev": true, "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "@lerna/child-process": "6.1.0", + "@lerna/get-npm-exec-opts": "6.1.0", + "fs-extra": "^9.1.0", + "npm-package-arg": "8.1.1", + "npmlog": "^6.0.2", + "signal-exit": "^3.0.3", + "write-pkg": "^4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "node_modules/@lerna/npm-install/node_modules/fs-extra": { + "version": "9.1.0", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=10" } }, - "node_modules/@mdx-js/mdx/node_modules/debug": { - "version": "4.3.4", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@lerna/npm-install/node_modules/hosted-git-info": { + "version": "3.0.8", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "lru-cache": "^6.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=10" } }, - "node_modules/@mdx-js/mdx/node_modules/is-buffer": { - "version": "2.0.5", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/@lerna/npm-install/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/@mdx-js/mdx/node_modules/is-plain-obj": { - "version": "2.1.0", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/@lerna/npm-install/node_modules/npm-package-arg": { + "version": "8.1.1", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/@mdx-js/mdx/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "node_modules/@lerna/npm-install/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { - "json5": "lib/cli.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/@mdx-js/mdx/node_modules/ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/@lerna/npm-install/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, - "node_modules/@mdx-js/mdx/node_modules/parse-entities": { - "version": "2.0.0", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "node_modules/@lerna/npm-publish": { + "version": "6.1.0", + "integrity": "sha512-N0LdR1ImZQw1r4cYaKtVbBhBPtj4Zu9NbvygzizEP5HuTfxZmE1Ans3w93Kks9VTXZXob8twNbXnzBwzTyEpEA==", + "dev": true, "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" + "@lerna/otplease": "6.1.0", + "@lerna/run-lifecycle": "6.1.0", + "fs-extra": "^9.1.0", + "libnpmpublish": "^6.0.4", + "npm-package-arg": "8.1.1", + "npmlog": "^6.0.2", + "pify": "^5.0.0", + "read-package-json": "^5.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@mdx-js/mdx/node_modules/remark-parse": { - "version": "8.0.3", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "node_modules/@lerna/npm-publish/node_modules/fs-extra": { + "version": "9.1.0", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "dependencies": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=10" } }, - "node_modules/@mdx-js/mdx/node_modules/unified": { - "version": "9.2.0", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "node_modules/@lerna/npm-publish/node_modules/hosted-git-info": { + "version": "3.0.8", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dev": true, "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" + "lru-cache": "^6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/unist-util-is": { - "version": "4.1.0", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=10" } }, - "node_modules/@mdx-js/mdx/node_modules/unist-util-remove-position": { - "version": "2.0.1", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "node_modules/@lerna/npm-publish/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { - "unist-util-visit": "^2.0.0" + "yallist": "^4.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=10" } }, - "node_modules/@mdx-js/mdx/node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "node_modules/@lerna/npm-publish/node_modules/npm-package-arg": { + "version": "8.1.1", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", + "dev": true, "dependencies": { - "@types/unist": "^2.0.2" + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=10" } }, - "node_modules/@mdx-js/mdx/node_modules/unist-util-visit": { - "version": "2.0.3", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" + "node_modules/@lerna/npm-publish/node_modules/pify": { + "version": "5.0.0", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@mdx-js/mdx/node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "node_modules/@lerna/npm-publish/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" + "lru-cache": "^6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/vfile": { - "version": "4.2.1", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=10" } }, - "node_modules/@mdx-js/mdx/node_modules/vfile-location": { - "version": "3.2.0", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "node_modules/@lerna/npm-publish/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, - "node_modules/@mdx-js/mdx/node_modules/vfile-message": { - "version": "2.0.4", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "node_modules/@lerna/npm-run-script": { + "version": "6.1.0", + "integrity": "sha512-7p13mvdxdY5+VqWvvtMsMDeyCRs0PrrTmSHRO+FKuLQuGhBvUo05vevcMEOQNDvEvl/tXPrOVbeGCiGubYTCLg==", + "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "@lerna/child-process": "6.1.0", + "@lerna/get-npm-exec-opts": "6.1.0", + "npmlog": "^6.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@mdx-js/react": { - "version": "1.6.22", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "node_modules/@lerna/otplease": { + "version": "6.1.0", + "integrity": "sha512-gqSE6IbaD4IeNJePkaDLaFLoGp0Ceu35sn7z0AHAOoHiQGGorOmvM+h1Md3xZZRSXQmY9LyJVhG5eRa38SoG4g==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" - } - }, - "node_modules/@mdx-js/util": { - "version": "1.6.22", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dependencies": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" + "@lerna/prompt": "6.1.0" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@mrmlnc/readdir-enhanced/node_modules/glob-to-regexp": { - "version": "0.3.0", - "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==" - }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "node_modules/@lerna/output": { + "version": "6.1.0", + "integrity": "sha512-mgCIzLKIuroytXuxjTB689ERtpfgyNXW0rMv9WHOa6ufQc+QJPjh3L4jVsOA0l+/OxZyi97PUXotduNj+0cbnA==", "dev": true, - "optional": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.3", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "dependencies": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" + "npmlog": "^6.0.2" }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@nodelib/fs.scandir/node_modules/@nodelib/fs.stat": { - "version": "2.0.3", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "node_modules/@lerna/pack-directory": { + "version": "6.1.0", + "integrity": "sha512-Xsixqm2nkGXs9hvq08ClbGpRlCYnlBV4TwSrLttIDL712RlyXoPe2maJzTUqo9OXBbOumFSahUEInCMT2OS05g==", + "dev": true, + "dependencies": { + "@lerna/get-packed": "6.1.0", + "@lerna/package": "6.1.0", + "@lerna/run-lifecycle": "6.1.0", + "@lerna/temp-write": "6.1.0", + "npm-packlist": "^5.1.1", + "npmlog": "^6.0.2", + "tar": "^6.1.0" + }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@lerna/package": { + "version": "6.1.0", + "integrity": "sha512-PyNFtdH2IcLasp/nyMDshmeXotriOSlhbeFIxhdl1XuGj5v1so3utMSOrJMO5kzZJQg5zyx8qQoxL+WH/hkrVQ==", + "dev": true, + "dependencies": { + "load-json-file": "^6.2.0", + "npm-package-arg": "8.1.1", + "write-pkg": "^4.0.0" + }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.4", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "node_modules/@lerna/package-graph": { + "version": "6.1.0", + "integrity": "sha512-yGyxd/eHTDjkpnBbDhTV0hwKF+i01qZc+6/ko65wOsh8xtgqpQeE6mtdgbvsLKcuMcIQ7PDy1ntyIv9phg14gQ==", + "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" + "@lerna/prerelease-id-from-version": "6.1.0", + "@lerna/validation-error": "6.1.0", + "npm-package-arg": "8.1.1", + "npmlog": "^6.0.2", + "semver": "^7.3.4" }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@npmcli/ci-detect": { - "version": "1.4.0", - "integrity": "sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q==", - "dev": true - }, - "node_modules/@npmcli/fs": { - "version": "1.0.0", - "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "node_modules/@lerna/package-graph/node_modules/hosted-git-info": { + "version": "3.0.8", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dev": true, "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@npmcli/fs/node_modules/lru-cache": { + "node_modules/@lerna/package-graph/node_modules/lru-cache": { "version": "6.0.0", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -9511,9 +9654,23 @@ "node": ">=10" } }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@lerna/package-graph/node_modules/npm-package-arg": { + "version": "8.1.1", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/package-graph/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -9524,26 +9681,37 @@ "node": ">=10" } }, - "node_modules/@npmcli/fs/node_modules/yallist": { + "node_modules/@lerna/package-graph/node_modules/yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, - "node_modules/@npmcli/git": { - "version": "2.1.0", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "node_modules/@lerna/package/node_modules/hosted-git-info": { + "version": "3.0.8", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "dev": true, "dependencies": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/package/node_modules/load-json-file": { + "version": "6.2.0", + "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^5.0.0", + "strip-bom": "^4.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@npmcli/git/node_modules/lru-cache": { + "node_modules/@lerna/package/node_modules/lru-cache": { "version": "6.0.0", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, @@ -9554,20 +9722,39 @@ "node": ">=10" } }, - "node_modules/@npmcli/git/node_modules/mkdirp": { - "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/@lerna/package/node_modules/npm-package-arg": { + "version": "8.1.1", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "dependencies": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@lerna/package/node_modules/parse-json": { + "version": "5.2.0", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@lerna/package/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -9579,1430 +9766,4363 @@ "node": ">=10" } }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/@lerna/package/node_modules/strip-bom": { + "version": "4.0.0", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, "engines": { - "node": ">= 8" + "node": ">=8" + } + }, + "node_modules/@lerna/package/node_modules/type-fest": { + "version": "0.6.0", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/@npmcli/git/node_modules/yallist": { + "node_modules/@lerna/package/node_modules/yallist": { "version": "4.0.0", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "node_modules/@lerna/prerelease-id-from-version": { + "version": "6.1.0", + "integrity": "sha512-ngC4I6evvZztB6aOaSDEnhUgRTlqX3TyBXwWwLGTOXCPaCQBTPaLNokhmRdJ+ZVdZ4iHFbzEDSL07ubZrYUcmQ==", "dev": true, "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" + "semver": "^7.3.4" }, "engines": { - "node": ">= 10" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", + "node_modules/@lerna/prerelease-id-from-version/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, + "node_modules/@lerna/prerelease-id-from-version/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { "node": ">=10" } }, - "node_modules/@npmcli/node-gyp": { - "version": "1.0.3", - "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", + "node_modules/@lerna/prerelease-id-from-version/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/@npmcli/promise-spawn": { - "version": "1.3.2", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "node_modules/@lerna/profiler": { + "version": "6.1.0", + "integrity": "sha512-WFDQNpuqPqMJLg8llvrBHF8Ib5Asgp23lMeNUe89T62NUX6gkjVBTYdjsduxM0tZH6Pa0GAGaQcha97P6fxfdQ==", "dev": true, "dependencies": { - "infer-owner": "^1.0.4" + "fs-extra": "^9.1.0", + "npmlog": "^6.0.2", + "upath": "^2.0.1" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@octokit/auth-token": { - "version": "2.5.0", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "node_modules/@lerna/profiler/node_modules/fs-extra": { + "version": "9.1.0", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "@octokit/types": "^6.0.3" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@octokit/core": { - "version": "3.5.1", - "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", + "node_modules/@lerna/profiler/node_modules/upath": { + "version": "2.0.1", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", "dev": true, - "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.0", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "engines": { + "node": ">=4", + "yarn": "*" } }, - "node_modules/@octokit/core/node_modules/@octokit/request-error": { - "version": "2.1.0", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "node_modules/@lerna/project": { + "version": "6.1.0", + "integrity": "sha512-EOkfjjrTM16c3GUxGqcfYD2stV35p9mBEmkF41NPmyjfbzjol/irDF1r6Q7BsQSRsdClMJRCeZ168xdSxC2X0A==", "dev": true, "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "@lerna/package": "6.1.0", + "@lerna/validation-error": "6.1.0", + "cosmiconfig": "^7.0.0", + "dedent": "^0.7.0", + "dot-prop": "^6.0.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.2", + "js-yaml": "^4.1.0", + "load-json-file": "^6.2.0", + "npmlog": "^6.0.2", + "p-map": "^4.0.0", + "resolve-from": "^5.0.0", + "write-json-file": "^4.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@octokit/core/node_modules/universal-user-agent": { - "version": "6.0.0", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "node_modules/@lerna/project/node_modules/argparse": { + "version": "2.0.1", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "node_modules/@lerna/project/node_modules/js-yaml": { + "version": "4.1.0", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@octokit/endpoint/node_modules/is-plain-object": { - "version": "5.0.0", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/@lerna/project/node_modules/load-json-file": { + "version": "6.2.0", + "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^5.0.0", + "strip-bom": "^4.0.0", + "type-fest": "^0.6.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/@octokit/endpoint/node_modules/universal-user-agent": { - "version": "6.0.0", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "node_modules/@octokit/graphql": { - "version": "4.8.0", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "node_modules/@lerna/project/node_modules/parse-json": { + "version": "5.2.0", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/graphql/node_modules/universal-user-agent": { - "version": "6.0.0", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true + "node_modules/@lerna/project/node_modules/resolve-from": { + "version": "5.0.0", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/@octokit/openapi-types": { - "version": "11.2.0", - "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==", - "dev": true + "node_modules/@lerna/project/node_modules/strip-bom": { + "version": "4.0.0", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/@octokit/plugin-enterprise-rest": { - "version": "6.0.1", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", - "dev": true + "node_modules/@lerna/project/node_modules/type-fest": { + "version": "0.6.0", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.17.0", - "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", + "node_modules/@lerna/prompt": { + "version": "6.1.0", + "integrity": "sha512-981J/C53TZ2l2mFVlWJN7zynSzf5GEHKvKQa12Td9iknhASZOuwTAWb6eq46246Ant6W5tWwb0NSPu3I5qtcrA==", "dev": true, "dependencies": { - "@octokit/types": "^6.34.0" + "inquirer": "^8.2.4", + "npmlog": "^6.0.2" }, - "peerDependencies": { - "@octokit/core": ">=2" + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" + "node_modules/@lerna/publish": { + "version": "6.1.0", + "integrity": "sha512-XtvuydtU0IptbAapLRgoN1AZj/WJR+e3UKnx9BQ1Dwc+Fpg2oqPxR/vi+6hxAsr95pdQ5CnWBdgS+dg2wEUJ7Q==", + "dev": true, + "dependencies": { + "@lerna/check-working-tree": "6.1.0", + "@lerna/child-process": "6.1.0", + "@lerna/collect-updates": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/describe-ref": "6.1.0", + "@lerna/log-packed": "6.1.0", + "@lerna/npm-conf": "6.1.0", + "@lerna/npm-dist-tag": "6.1.0", + "@lerna/npm-publish": "6.1.0", + "@lerna/otplease": "6.1.0", + "@lerna/output": "6.1.0", + "@lerna/pack-directory": "6.1.0", + "@lerna/prerelease-id-from-version": "6.1.0", + "@lerna/prompt": "6.1.0", + "@lerna/pulse-till-done": "6.1.0", + "@lerna/run-lifecycle": "6.1.0", + "@lerna/run-topologically": "6.1.0", + "@lerna/validation-error": "6.1.0", + "@lerna/version": "6.1.0", + "fs-extra": "^9.1.0", + "libnpmaccess": "^6.0.3", + "npm-package-arg": "8.1.1", + "npm-registry-fetch": "^13.3.0", + "npmlog": "^6.0.2", + "p-map": "^4.0.0", + "p-pipe": "^3.1.0", + "pacote": "^13.6.1", + "semver": "^7.3.4" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.13.0", - "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", + "node_modules/@lerna/publish/node_modules/@npmcli/fs": { + "version": "2.1.2", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "dependencies": { - "@octokit/types": "^6.34.0", - "deprecation": "^2.3.1" + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" }, - "peerDependencies": { - "@octokit/core": ">=3" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@octokit/request": { - "version": "5.6.2", - "integrity": "sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA==", + "node_modules/@lerna/publish/node_modules/@npmcli/git": { + "version": "3.0.2", + "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", "dev": true, "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "universal-user-agent": "^6.0.0" + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@octokit/request/node_modules/@octokit/request-error": { - "version": "2.1.0", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "node_modules/@lerna/publish/node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "engines": { + "node": ">=12" } }, - "node_modules/@octokit/request/node_modules/is-plain-object": { - "version": "5.0.0", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/@lerna/publish/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@octokit/request/node_modules/universal-user-agent": { - "version": "6.0.0", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true + "node_modules/@lerna/publish/node_modules/@npmcli/node-gyp": { + "version": "2.0.0", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, - "node_modules/@octokit/rest": { - "version": "18.12.0", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "node_modules/@lerna/publish/node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", "dev": true, "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + "infer-owner": "^1.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@octokit/types": { - "version": "6.34.0", - "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", + "node_modules/@lerna/publish/node_modules/@npmcli/run-script": { + "version": "4.2.1", + "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^11.2.0" + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.20", - "integrity": "sha512-88p7+M0QGxKpmnkfXjS4V26AnoC/eiqZutE8GLdaI5X12NY75bXSdTY9NkmYb2Xyk1O+MmkuO6Frmsj84V6I8Q==", - "dev": true - }, - "node_modules/@popperjs/core": { - "version": "2.10.1", - "integrity": "sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "node_modules/@lerna/publish/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/@probe.gl/stats": { - "version": "3.4.0", - "integrity": "sha512-Gl37r9qGuiKadIvTZdSZvzCNOttJYw6RcY1oT0oDuB8r2uhuZAdSMQRQTy9FTinp6MY6O9wngGnV6EpQ8wSBAw==", + "node_modules/@lerna/publish/node_modules/builtins": { + "version": "5.0.1", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.0.0" + "semver": "^7.0.0" } }, - "node_modules/@react-dnd/asap": { - "version": "4.0.0", - "integrity": "sha512-0XhqJSc6pPoNnf8DhdsPHtUhRzZALVzYMTzRwV4VI6DJNJ/5xxfL9OQUwb8IH5/2x7lSf7nAZrnzUD+16VyOVQ==" + "node_modules/@lerna/publish/node_modules/cacache": { + "version": "16.1.3", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, - "node_modules/@react-dnd/invariant": { - "version": "2.0.0", - "integrity": "sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==" + "node_modules/@lerna/publish/node_modules/cacache/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } }, - "node_modules/@react-dnd/shallowequal": { + "node_modules/@lerna/publish/node_modules/chownr": { "version": "2.0.0", - "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==" + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } }, - "node_modules/@react-icons/all-files": { - "version": "4.1.0", - "integrity": "sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ==", - "peerDependencies": { - "react": "*" + "node_modules/@lerna/publish/node_modules/fs-extra": { + "version": "9.1.0", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@samverschueren/stream-to-observable": { - "version": "0.3.1", - "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "node_modules/@lerna/publish/node_modules/glob": { + "version": "8.0.3", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, "dependencies": { - "any-observable": "^0.3.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">=6" + "node": ">=12" }, - "peerDependenciesMeta": { - "rxjs": { - "optional": true - }, - "zen-observable": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "node_modules/@lerna/publish/node_modules/hosted-git-info": { + "version": "3.0.8", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "dev": true, "dependencies": { - "type-detect": "4.0.8" + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "node_modules/@lerna/publish/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@sinonjs/formatio": { - "version": "5.0.1", - "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", + "node_modules/@lerna/publish/node_modules/minimatch": { + "version": "5.1.2", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^5.0.2" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@sinonjs/samsam": { - "version": "5.3.1", - "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", + "node_modules/@lerna/publish/node_modules/minipass-fetch": { + "version": "2.1.2", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true + "node_modules/@lerna/publish/node_modules/mkdirp": { + "version": "1.0.4", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/@storybook/addon-actions": { - "version": "6.4.22", - "integrity": "sha512-t2w3iLXFul+R/1ekYxIEzUOZZmvEa7EzUAVAuCHP4i6x0jBnTTZ7sAIUVRaxVREPguH5IqI/2OklYhKanty2Yw==", + "node_modules/@lerna/publish/node_modules/npm-install-checks": { + "version": "5.0.0", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "dev": true, "dependencies": { - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.22", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "polished": "^4.0.5", - "prop-types": "^15.7.2", - "react-inspector": "^5.1.0", - "regenerator-runtime": "^0.13.7", - "telejson": "^5.3.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2", - "uuid-browser": "^3.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "semver": "^7.1.1" }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-actions/node_modules/polished": { - "version": "4.2.2", - "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", + "node_modules/@lerna/publish/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/publish/node_modules/npm-package-arg": { + "version": "8.1.1", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.17.8" + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/@storybook/addon-backgrounds": { - "version": "6.4.22", - "integrity": "sha512-xQIV1SsjjRXP7P5tUoGKv+pul1EY8lsV7iBXQb5eGbp4AffBj3qoYBSZbX4uiazl21o0MQiQoeIhhaPVaFIIGg==", + "node_modules/@lerna/publish/node_modules/npm-pick-manifest": { + "version": "7.0.2", + "integrity": "sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.22", - "core-js": "^3.8.2", - "global": "^4.4.0", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-controls": { - "version": "6.4.22", - "integrity": "sha512-f/M/W+7UTEUnr/L6scBMvksq+ZA8GTfh3bomE5FtWyOyaFppq9k8daKAvdYNlzXAOrUUsoZVJDgpb20Z2VBiSQ==", + "node_modules/@lerna/publish/node_modules/npm-pick-manifest/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-common": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/node-logger": "6.4.22", - "@storybook/store": "6.4.22", - "@storybook/theming": "6.4.22", - "core-js": "^3.8.2", - "lodash": "^4.17.21", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "lru-cache": "^7.5.1" }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-essentials": { - "version": "6.4.22", - "integrity": "sha512-GTv291fqvWq2wzm7MruBvCGuWaCUiuf7Ca3kzbQ/WqWtve7Y/1PDsqRNQLGZrQxkXU0clXCqY1XtkTrtA3WGFQ==", + "node_modules/@lerna/publish/node_modules/npm-pick-manifest/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true, - "dependencies": { - "@storybook/addon-actions": "6.4.22", - "@storybook/addon-backgrounds": "6.4.22", - "@storybook/addon-controls": "6.4.22", - "@storybook/addon-docs": "6.4.22", - "@storybook/addon-measure": "6.4.22", - "@storybook/addon-outline": "6.4.22", - "@storybook/addon-toolbars": "6.4.22", - "@storybook/addon-viewport": "6.4.22", - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/node-logger": "6.4.22", - "core-js": "^3.8.2", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@babel/core": "^7.9.6", - "@storybook/vue": "6.4.22", - "@storybook/web-components": "6.4.22", - "babel-loader": "^8.0.0", - "lit-html": "^1.4.1 || ^2.0.0-rc.3", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0", - "webpack": "*" - }, - "peerDependenciesMeta": { - "@storybook/vue": { - "optional": true - }, - "@storybook/web-components": { - "optional": true - }, - "lit-html": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "webpack": { - "optional": true - } + "engines": { + "node": ">=12" } }, - "node_modules/@storybook/addon-essentials/node_modules/@storybook/addon-docs": { - "version": "6.4.22", - "integrity": "sha512-9j+i+W+BGHJuRe4jUrqk6ubCzP4fc1xgFS2o8pakRiZgPn5kUQPdkticmsyh1XeEJifwhqjKJvkEDrcsleytDA==", + "node_modules/@lerna/publish/node_modules/npm-pick-manifest/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { - "@babel/core": "^7.12.10", - "@babel/generator": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/plugin-transform-react-jsx": "^7.12.12", - "@babel/preset-env": "^7.12.11", - "@jest/transform": "^26.6.2", - "@mdx-js/loader": "^1.6.22", - "@mdx-js/mdx": "^1.6.22", - "@mdx-js/react": "^1.6.22", - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/builder-webpack4": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/csf-tools": "6.4.22", - "@storybook/node-logger": "6.4.22", - "@storybook/postinstall": "6.4.22", - "@storybook/preview-web": "6.4.22", - "@storybook/source-loader": "6.4.22", - "@storybook/store": "6.4.22", - "@storybook/theming": "6.4.22", - "acorn": "^7.4.1", - "acorn-jsx": "^5.3.1", - "acorn-walk": "^7.2.0", - "core-js": "^3.8.2", - "doctrine": "^3.0.0", - "escodegen": "^2.0.0", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "html-tags": "^3.1.0", - "js-string-escape": "^1.0.1", - "loader-utils": "^2.0.0", - "lodash": "^4.17.21", - "nanoid": "^3.1.23", - "p-limit": "^3.1.0", - "prettier": ">=2.2.1 <=2.3.0", - "prop-types": "^15.7.2", - "react-element-to-jsx-string": "^14.3.4", - "regenerator-runtime": "^0.13.7", - "remark-external-links": "^8.0.0", - "remark-slug": "^6.0.0", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@storybook/angular": "6.4.22", - "@storybook/html": "6.4.22", - "@storybook/react": "6.4.22", - "@storybook/vue": "6.4.22", - "@storybook/vue3": "6.4.22", - "@storybook/web-components": "6.4.22", - "lit": "^2.0.0", - "lit-html": "^1.4.1 || ^2.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0", - "svelte": "^3.31.2", - "sveltedoc-parser": "^4.1.0", - "vue": "^2.6.10 || ^3.0.0", - "webpack": "*" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, - "peerDependenciesMeta": { - "@storybook/angular": { - "optional": true - }, - "@storybook/html": { - "optional": true - }, - "@storybook/react": { - "optional": true - }, - "@storybook/vue": { - "optional": true - }, - "@storybook/vue3": { - "optional": true - }, - "@storybook/web-components": { - "optional": true - }, - "lit": { - "optional": true - }, - "lit-html": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "svelte": { - "optional": true - }, - "sveltedoc-parser": { - "optional": true - }, - "vue": { - "optional": true - }, - "webpack": { - "optional": true - } + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/acorn": { - "version": "7.4.1", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "node_modules/@lerna/publish/node_modules/npm-pick-manifest/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "builtins": "^5.0.0" }, "engines": { - "node": ">=0.4.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/escodegen": { - "version": "2.0.0", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "node_modules/@lerna/publish/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", "dev": true, "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" }, "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/esprima": { - "version": "4.0.1", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/@lerna/publish/node_modules/npm-registry-fetch/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "dependencies": { + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=4" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/estraverse": { - "version": "5.3.0", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/@lerna/publish/node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">=12" } }, - "node_modules/@storybook/addon-essentials/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "node_modules/@lerna/publish/node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, "engines": { - "node": ">=6" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "node_modules/@lerna/publish/node_modules/npm-registry-fetch/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "builtins": "^5.0.0" }, "engines": { - "node": ">=8.9.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/nanoid": { - "version": "3.3.4", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "node_modules/@lerna/publish/node_modules/pacote": { + "version": "13.6.2", + "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", "dev": true, + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, "bin": { - "nanoid": "bin/nanoid.cjs" + "pacote": "lib/bin.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/p-limit": { - "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/@lerna/publish/node_modules/pacote/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/publish/node_modules/pacote/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@lerna/publish/node_modules/pacote/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/prettier": { - "version": "2.3.0", - "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", + "node_modules/@lerna/publish/node_modules/pacote/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" + "dependencies": { + "builtins": "^5.0.0" }, "engines": { - "node": ">=10.13.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@lerna/publish/node_modules/proc-log": { + "version": "2.0.1", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", "dev": true, - "optional": true, "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-knobs": { - "version": "6.3.1", - "integrity": "sha512-2GGGnQSPXXUhHHYv4IW6pkyQlCPYXKYiyGzfhV7Zhs95M2Ban08OA6KLmliMptWCt7U9tqTO8dB5u0C2cWmCTw==", - "deprecated": "deprecating @storybook/addon-knobs in favor of @storybook/addon-controls", + "node_modules/@lerna/publish/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, "dependencies": { - "copy-to-clipboard": "^3.3.1", - "core-js": "^3.8.2", - "escape-html": "^1.0.3", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.20", - "prop-types": "^15.7.2", - "qs": "^6.10.0", - "react-colorful": "^5.1.2", - "react-lifecycles-compat": "^3.0.4", - "react-select": "^3.2.0" + "lru-cache": "^6.0.0" }, - "peerDependencies": { - "@storybook/addons": "^6.3.0", - "@storybook/api": "^6.3.0", - "@storybook/components": "^6.3.0", - "@storybook/core-events": "^6.3.0", - "@storybook/theming": "^6.3.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "bin": { + "semver": "bin/semver.js" }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/@storybook/addon-knobs/node_modules/@emotion/cache": { - "version": "10.0.29", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", + "node_modules/@lerna/publish/node_modules/ssri": { + "version": "9.0.1", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, "dependencies": { - "@emotion/sheet": "0.9.4", - "@emotion/stylis": "0.8.5", - "@emotion/utils": "0.11.3", - "@emotion/weak-memoize": "0.2.5" + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-knobs/node_modules/csstype": { - "version": "3.0.9", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" - }, - "node_modules/@storybook/addon-knobs/node_modules/dom-helpers": { - "version": "5.2.1", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "node_modules/@lerna/publish/node_modules/unique-filename": { + "version": "2.0.1", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-knobs/node_modules/qs": { - "version": "6.10.1", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "node_modules/@lerna/publish/node_modules/unique-slug": { + "version": "3.0.0", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-knobs/node_modules/react-input-autosize": { - "version": "3.0.0", - "integrity": "sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==", + "node_modules/@lerna/publish/node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { - "prop-types": "^15.5.8" + "isexe": "^2.0.0" }, - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0" + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@storybook/addon-knobs/node_modules/react-select": { - "version": "3.2.0", - "integrity": "sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ==", + "node_modules/@lerna/publish/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@lerna/pulse-till-done": { + "version": "6.1.0", + "integrity": "sha512-a2RVT82E4R9nVXtehzp2TQL6iXp0QfEM3bu8tBAR/SfI1A9ggZWQhuuUqtRyhhVCajdQDOo7rS0UG7R5JzK58w==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/cache": "^10.0.9", - "@emotion/core": "^10.0.9", - "@emotion/css": "^10.0.9", - "memoize-one": "^5.0.0", - "prop-types": "^15.6.0", - "react-input-autosize": "^3.0.0", - "react-transition-group": "^4.3.0" + "npmlog": "^6.0.2" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-knobs/node_modules/react-transition-group": { - "version": "4.4.2", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "node_modules/@lerna/query-graph": { + "version": "6.1.0", + "integrity": "sha512-YkyCc+6aR7GlCOcZXEKPcl5o5L2v+0YUNs59JrfAS0mctFosZ/2tP7pkdu2SI4qXIi5D0PMNsh/0fRni56znsQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" + "@lerna/package-graph": "6.1.0" }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-links": { - "version": "6.4.22", - "integrity": "sha512-OSOyDnTXnmcplJHlXTYUTMkrfpLqxtHp2R69IXfAyI1e8WNDb79mXflrEXDA/RSNEliLkqYwCyYby7gDMGds5Q==", + "node_modules/@lerna/resolve-symlink": { + "version": "6.1.0", + "integrity": "sha512-8ILO+h5fsE0q8MSLfdL+MT1GEsNhAB1fDyMkSsYgLRCsssN/cViZbffpclZyT/EfAhpyKfBCHZ0CmT1ZGofU1A==", + "dev": true, "dependencies": { - "@storybook/addons": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.22", - "@types/qs": "^6.9.5", - "core-js": "^3.8.2", - "global": "^4.4.0", - "prop-types": "^15.7.2", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "fs-extra": "^9.1.0", + "npmlog": "^6.0.2", + "read-cmd-shim": "^3.0.0" }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-links/node_modules/qs": { - "version": "6.10.3", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "node_modules/@lerna/resolve-symlink/node_modules/fs-extra": { + "version": "9.1.0", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/@storybook/addon-measure": { - "version": "6.4.22", - "integrity": "sha512-CjDXoCNIXxNfXfgyJXPc0McjCcwN1scVNtHa9Ckr+zMjiQ8pPHY7wDZCQsG69KTqcWHiVfxKilI82456bcHYhQ==", + "node_modules/@lerna/resolve-symlink/node_modules/read-cmd-shim": { + "version": "3.0.1", + "integrity": "sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/rimraf-dir": { + "version": "6.1.0", + "integrity": "sha512-J9YeGHkCCeAIzsnKURYeGECBexiIii6HA+Bbd+rAgoKPsNCOj6ql4+qJE8Jbd7fQEFNDPQeBCYvM7JcdMc0WSA==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "core-js": "^3.8.2", - "global": "^4.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@lerna/child-process": "6.1.0", + "npmlog": "^6.0.2", + "path-exists": "^4.0.0", + "rimraf": "^3.0.2" }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-outline": { - "version": "6.4.22", - "integrity": "sha512-VIMEzvBBRbNnupGU7NV0ahpFFb6nKVRGYWGREjtABdFn2fdKr1YicOHFe/3U7hRGjb5gd+VazSvyUvhaKX9T7Q==", + "node_modules/@lerna/rimraf-dir/node_modules/path-exists": { + "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lerna/run": { + "version": "6.1.0", + "integrity": "sha512-vlEEKPcTloiob6EK7gxrjEdB6fQQ/LNfWhSJCGxJlvNVbrMpoWIu0Kpp20b0nE+lzX7rRJ4seWr7Wdo/Fjub4Q==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "core-js": "^3.8.2", - "global": "^4.4.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@lerna/command": "6.1.0", + "@lerna/filter-options": "6.1.0", + "@lerna/npm-run-script": "6.1.0", + "@lerna/output": "6.1.0", + "@lerna/profiler": "6.1.0", + "@lerna/run-topologically": "6.1.0", + "@lerna/timer": "6.1.0", + "@lerna/validation-error": "6.1.0", + "fs-extra": "^9.1.0", + "p-map": "^4.0.0" }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-toolbars": { - "version": "6.4.22", - "integrity": "sha512-FFyj6XDYpBBjcUu6Eyng7R805LUbVclEfydZjNiByAoDVyCde9Hb4sngFxn/T4fKAfBz/32HKVXd5iq4AHYtLg==", + "node_modules/@lerna/run-lifecycle": { + "version": "6.1.0", + "integrity": "sha512-GbTdKxL+hWHEPgyBEKtqY9Nf+jFlt6YLtP5VjEVc5SdLkm+FeRquar9/YcZVUbzr3c+NJwWNgVjHuePfowdpUA==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/theming": "6.4.22", - "core-js": "^3.8.2", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@lerna/npm-conf": "6.1.0", + "@npmcli/run-script": "^4.1.7", + "npmlog": "^6.0.2", + "p-queue": "^6.6.2" }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "engines": { + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addon-viewport": { - "version": "6.4.22", - "integrity": "sha512-6jk0z49LemeTblez5u2bYXYr6U+xIdLbywe3G283+PZCBbEDE6eNYy2d2HDL+LbCLbezJBLYPHPalElphjJIcw==", + "node_modules/@lerna/run-lifecycle/node_modules/@npmcli/node-gyp": { + "version": "2.0.0", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", "dev": true, - "dependencies": { - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/theming": "6.4.22", - "core-js": "^3.8.2", - "global": "^4.4.0", - "memoizerific": "^1.11.3", - "prop-types": "^15.7.2", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/addons": { - "version": "6.4.22", - "integrity": "sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==", + "node_modules/@lerna/run-lifecycle/node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "dev": true, "dependencies": { - "@storybook/api": "6.4.22", - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.22", - "@storybook/theming": "6.4.22", - "@types/webpack-env": "^1.16.0", - "core-js": "^3.8.2", - "global": "^4.4.0", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "infer-owner": "^1.0.4" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/api": { - "version": "6.4.22", - "integrity": "sha512-lAVI3o2hKupYHXFTt+1nqFct942up5dHH6YD7SZZJGyW21dwKC3HK1IzCsTawq3fZAKkgWFgmOO649hKk60yKg==", + "node_modules/@lerna/run-lifecycle/node_modules/@npmcli/run-script": { + "version": "4.2.1", + "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", + "dev": true, "dependencies": { - "@storybook/channels": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.22", - "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.4.22", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "store2": "^2.12.0", - "telejson": "^5.3.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/builder-webpack4": { - "version": "6.4.22", - "integrity": "sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==", + "node_modules/@lerna/run-lifecycle/node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { - "@babel/core": "^7.12.10", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-decorators": "^7.12.12", - "@babel/plugin-proposal-export-default-from": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.12", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/preset-env": "^7.12.11", - "@babel/preset-react": "^7.12.10", - "@babel/preset-typescript": "^7.12.7", - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/channel-postmessage": "6.4.22", - "@storybook/channels": "6.4.22", - "@storybook/client-api": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-common": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/node-logger": "6.4.22", - "@storybook/preview-web": "6.4.22", - "@storybook/router": "6.4.22", - "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.22", - "@storybook/theming": "6.4.22", - "@storybook/ui": "6.4.22", - "@types/node": "^14.0.10", - "@types/webpack": "^4.41.26", - "autoprefixer": "^9.8.6", - "babel-loader": "^8.0.0", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-polyfill-corejs3": "^0.1.0", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "core-js": "^3.8.2", - "css-loader": "^3.6.0", - "file-loader": "^6.2.0", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^4.1.6", - "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "global": "^4.4.0", - "html-webpack-plugin": "^4.0.0", - "pnp-webpack-plugin": "1.6.4", - "postcss": "^7.0.36", - "postcss-flexbugs-fixes": "^4.2.1", - "postcss-loader": "^4.2.0", - "raw-loader": "^4.0.2", - "stable": "^0.1.8", - "style-loader": "^1.3.0", - "terser-webpack-plugin": "^4.2.3", - "ts-dedent": "^2.0.0", - "url-loader": "^4.1.1", - "util-deprecate": "^1.0.2", - "webpack": "4", - "webpack-dev-middleware": "^3.7.3", - "webpack-filter-warnings-plugin": "^1.2.1", - "webpack-hot-middleware": "^2.25.1", - "webpack-virtual-modules": "^0.2.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "isexe": "^2.0.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/@types/node": { - "version": "14.18.16", - "integrity": "sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==" - }, - "node_modules/@storybook/builder-webpack4/node_modules/acorn": { - "version": "6.4.2", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "bin": { - "acorn": "bin/acorn" + "node-which": "bin/node-which" }, "engines": { - "node": ">=0.4.0" + "node": ">= 8" } }, - "node_modules/@storybook/builder-webpack4/node_modules/ansi-styles": { - "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@lerna/run-topologically": { + "version": "6.1.0", + "integrity": "sha512-kpTaSBKdKjtf61be8Z1e7TIaMt/aksfxswQtpFxEuKDsPsdHfR8htSkADO4d/3SZFtmcAHIHNCQj9CaNj4O4Xw==", + "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@lerna/query-graph": "6.1.0", + "p-queue": "^6.6.2" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/builder-webpack4/node_modules/chalk": { - "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@lerna/run/node_modules/fs-extra": { + "version": "9.1.0", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/@storybook/builder-webpack4/node_modules/css-loader": { - "version": "3.6.0", - "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "node_modules/@lerna/symlink-binary": { + "version": "6.1.0", + "integrity": "sha512-DaiRNZk/dvomNxgEaTW145PyL7vIGP7rvnfXV2FO+rjX8UUSNUOjmVmHlYfs64gV9Eqx/dLfQClIbKcwYMD83A==", + "dev": true, "dependencies": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.0", - "semver": "^6.3.0" + "@lerna/create-symlink": "6.1.0", + "@lerna/package": "6.1.0", + "fs-extra": "^9.1.0", + "p-map": "^4.0.0" }, "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/builder-webpack4/node_modules/css-loader/node_modules/semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node_modules/@lerna/symlink-binary/node_modules/fs-extra": { + "version": "9.1.0", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@storybook/builder-webpack4/node_modules/eslint-scope": { - "version": "4.0.3", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "node_modules/@lerna/symlink-dependencies": { + "version": "6.1.0", + "integrity": "sha512-hrTvtY1Ek+fLA4JjXsKsvwPjuJD0rwB/+K4WY57t00owj//BpCsJ37w3kkkS7f/PcW/5uRjCuHcY67LOEwsRxw==", + "dev": true, "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "@lerna/create-symlink": "6.1.0", + "@lerna/resolve-symlink": "6.1.0", + "@lerna/symlink-binary": "6.1.0", + "fs-extra": "^9.1.0", + "p-map": "^4.0.0", + "p-map-series": "^2.1.0" }, "engines": { - "node": ">=4.0.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/builder-webpack4/node_modules/find-up": { - "version": "5.0.0", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/@lerna/symlink-dependencies/node_modules/fs-extra": { + "version": "9.1.0", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { "node": ">=10" + } + }, + "node_modules/@lerna/temp-write": { + "version": "6.1.0", + "integrity": "sha512-ZcQl88H9HbQ/TeWUOVt+vDYwptm7kwprGvj9KkZXr9S5Bn6SiKRQOeydCCfCrQT+9Q3dm7QZXV6rWzLsACcAlQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "is-stream": "^2.0.0", + "make-dir": "^3.0.0", + "temp-dir": "^1.0.0", + "uuid": "^8.3.2" + } + }, + "node_modules/@lerna/temp-write/node_modules/is-stream": { + "version": "2.0.1", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/builder-webpack4/node_modules/fork-ts-checker-webpack-plugin": { - "version": "4.1.6", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "node_modules/@lerna/temp-write/node_modules/make-dir": { + "version": "3.1.0", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "dependencies": { - "@babel/code-frame": "^7.5.5", - "chalk": "^2.4.1", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" + "semver": "^6.0.0" }, "engines": { - "node": ">=6.11.5", - "yarn": ">=1.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/builder-webpack4/node_modules/html-webpack-plugin": { - "version": "4.5.2", - "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", - "dependencies": { - "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, + "node_modules/@lerna/temp-write/node_modules/semver": { + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@lerna/temp-write/node_modules/uuid": { + "version": "8.3.2", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@lerna/timer": { + "version": "6.1.0", + "integrity": "sha512-du+NQ9q7uO4d2nVU4AD2DSPuAZqUapA/bZKuVpFVxvY9Qhzb8dQKLsFISe4A9TjyoNAk8ZeWK0aBc/6N+Qer9A==", + "dev": true, "engines": { - "node": ">=6.9" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/builder-webpack4/node_modules/icss-utils": { - "version": "4.1.1", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "node_modules/@lerna/validation-error": { + "version": "6.1.0", + "integrity": "sha512-q0c3XCi5OpyTr8AcfbisS6e3svZaJF/riCvBDqRMaQUT4A8QOPzB4fVF3/+J2u54nidBuTlIk0JZu9aOdWTUkQ==", + "dev": true, "dependencies": { - "postcss": "^7.0.14" + "npmlog": "^6.0.2" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/builder-webpack4/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "bin": { - "json5": "lib/cli.js" + "node_modules/@lerna/version": { + "version": "6.1.0", + "integrity": "sha512-RUxVFdzHt0739lRNMrAbo6HWcFrcyG7atM1pn+Eo61fUoA5R/9N4bCk4m9xUGkJ/mOcROjuwAGe+wT1uOs58Bg==", + "dev": true, + "dependencies": { + "@lerna/check-working-tree": "6.1.0", + "@lerna/child-process": "6.1.0", + "@lerna/collect-updates": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/conventional-commits": "6.1.0", + "@lerna/github-client": "6.1.0", + "@lerna/gitlab-client": "6.1.0", + "@lerna/output": "6.1.0", + "@lerna/prerelease-id-from-version": "6.1.0", + "@lerna/prompt": "6.1.0", + "@lerna/run-lifecycle": "6.1.0", + "@lerna/run-topologically": "6.1.0", + "@lerna/temp-write": "6.1.0", + "@lerna/validation-error": "6.1.0", + "@nrwl/devkit": ">=14.8.6 < 16", + "chalk": "^4.1.0", + "dedent": "^0.7.0", + "load-json-file": "^6.2.0", + "minimatch": "^3.0.4", + "npmlog": "^6.0.2", + "p-map": "^4.0.0", + "p-pipe": "^3.1.0", + "p-reduce": "^2.1.0", + "p-waterfall": "^2.1.1", + "semver": "^7.3.4", + "slash": "^3.0.0", + "write-json-file": "^4.3.0" }, "engines": { - "node": ">=6" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/builder-webpack4/node_modules/loader-runner": { - "version": "2.4.0", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "node_modules/@lerna/version/node_modules/load-json-file": { + "version": "6.2.0", + "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^5.0.0", + "strip-bom": "^4.0.0", + "type-fest": "^0.6.0" + }, "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=8" } }, - "node_modules/@storybook/builder-webpack4/node_modules/locate-path": { + "node_modules/@lerna/version/node_modules/lru-cache": { "version": "6.0.0", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { - "p-locate": "^5.0.0" + "yallist": "^4.0.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/builder-webpack4/node_modules/normalize-path": { - "version": "3.0.0", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" } }, - "node_modules/@storybook/builder-webpack4/node_modules/p-limit": { - "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/@lerna/version/node_modules/parse-json": { + "version": "5.2.0", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/builder-webpack4/node_modules/p-locate": { - "version": "5.0.0", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/@lerna/version/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, "dependencies": { - "p-limit": "^3.0.2" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/builder-webpack4/node_modules/path-exists": { + "node_modules/@lerna/version/node_modules/slash": { + "version": "3.0.0", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lerna/version/node_modules/strip-bom": { "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/@storybook/builder-webpack4/node_modules/postcss": { - "version": "7.0.39", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "node_modules/@lerna/version/node_modules/type-fest": { + "version": "0.6.0", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lerna/version/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@lerna/write-log-file": { + "version": "6.1.0", + "integrity": "sha512-09omu2w4NCt8mJH/X9ZMuToQQ3xu/KpC7EU4yDl2Qy8nxKf8HiG8Oe+YYNprngmkdsq60F5eUZvoiFDZ5JeGIg==", + "dev": true, "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "npmlog": "^6.0.2", + "write-file-atomic": "^4.0.1" }, "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/builder-webpack4/node_modules/postcss-modules-extract-imports": { - "version": "2.0.0", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "node_modules/@lerna/write-log-file/node_modules/write-file-atomic": { + "version": "4.0.2", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, "dependencies": { - "postcss": "^7.0.5" + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" }, "engines": { - "node": ">= 6" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/builder-webpack4/node_modules/postcss-modules-local-by-default": { - "version": "3.0.3", + "node_modules/@loaders.gl/3d-tiles": { + "version": "3.0.8", + "integrity": "sha512-jZeOyDPGD2wEkTLW4Do9A4UUQ+OGjhhNXztB0AsttZ69OpkmsxJXb76xxwevf+eThrsTgSTjZ06eC5DHX0kyXA==", + "dependencies": { + "@loaders.gl/core": "3.0.8", + "@loaders.gl/draco": "3.0.8", + "@loaders.gl/gltf": "3.0.8", + "@loaders.gl/loader-utils": "3.0.8", + "@loaders.gl/math": "3.0.8", + "@loaders.gl/tiles": "3.0.8", + "@math.gl/core": "^3.5.1", + "@math.gl/geospatial": "^3.5.1" + } + }, + "node_modules/@loaders.gl/core": { + "version": "3.0.8", + "integrity": "sha512-FIfbhMkoRX2JonEHXHgClC7jwOSsEwvvmjlaTMRAY+gFKvJPGmegkp4VgUZquLFf6GedJt/1TuMMvAX6gdq1pg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "@loaders.gl/loader-utils": "3.0.8", + "@loaders.gl/worker-utils": "3.0.8", + "probe.gl": "^3.4.0" + } + }, + "node_modules/@loaders.gl/draco": { + "version": "3.0.8", + "integrity": "sha512-ZCXzXNHWQ7H0qk/kC+rWzjMWjLzZGzQcDbdpIuy8xJdp4rTpmMkLUseFPby8vhkmIaqxWPwPB6mx/vM7L6JENg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "@loaders.gl/loader-utils": "3.0.8", + "@loaders.gl/schema": "3.0.8", + "@loaders.gl/worker-utils": "3.0.8", + "draco3d": "1.4.1" + } + }, + "node_modules/@loaders.gl/gis": { + "version": "3.0.8", + "integrity": "sha512-7NL+lIb7NezlMupYskVil6M3RZunXJl+TyaVAW82GLbzPSOq+m/G7h3+z0GBa8iv/U/I+cB5BhSN+GZmvFwqEA==", + "dependencies": { + "@loaders.gl/loader-utils": "3.0.8", + "@loaders.gl/schema": "3.0.8", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "node_modules/@loaders.gl/gltf": { + "version": "3.0.8", + "integrity": "sha512-4PXWTlqyvlbZE2Vp4iQ+Y87ZO1WuRvSlbImDhygd0hoINfmJ9ObxrFS3yJcpJTu007nWxXorNVEOKyuoo+4Iyw==", + "dependencies": { + "@loaders.gl/core": "3.0.8", + "@loaders.gl/draco": "3.0.8", + "@loaders.gl/images": "3.0.8", + "@loaders.gl/loader-utils": "3.0.8" + } + }, + "node_modules/@loaders.gl/images": { + "version": "3.0.8", + "integrity": "sha512-rO2cIYJYlMs/uO9YSoF4/BEA4p/9xQ3gHZ1sIJkPYVnDqzpbu8nvUjWTQqIdL/MkQBTW8tz3twCdM+B6G9Fa2w==", + "dependencies": { + "@loaders.gl/loader-utils": "3.0.8" + } + }, + "node_modules/@loaders.gl/loader-utils": { + "version": "3.0.8", + "integrity": "sha512-PW1WyyQ+LXkqoGHBZHsmfNQkKiLAYf1gok+kHnHvY9fCzhJeA1iTNEUKPXGXKgS00m/k5cBTkOWAaOG9KRvBCQ==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "@loaders.gl/worker-utils": "3.0.8", + "@probe.gl/stats": "^3.4.0" + } + }, + "node_modules/@loaders.gl/math": { + "version": "3.0.8", + "integrity": "sha512-jfFpxxr4Bq5JfOPqLVJc4JJGoGGvVTOCWiJhnTtSAKhaNSwldmNWaZ0w8E2nlgPKPMAHiTRKOQnd9sSY5m66Cw==", + "dependencies": { + "@loaders.gl/images": "3.0.8", + "@loaders.gl/loader-utils": "3.0.8", + "@math.gl/core": "^3.5.1" + } + }, + "node_modules/@loaders.gl/mvt": { + "version": "3.0.8", + "integrity": "sha512-Jk1QTHgpxMsUT01w5IJJ2en9qq0yOZcL2wGXVc7CFp2h6inB22rC3drUwq1mUNGe6iy3EWIo7EeJVd9B+5JyTQ==", + "dependencies": { + "@loaders.gl/gis": "3.0.8", + "@loaders.gl/loader-utils": "3.0.8", + "@math.gl/polygon": "^3.5.1", + "pbf": "^3.2.1" + } + }, + "node_modules/@loaders.gl/schema": { + "version": "3.0.8", + "integrity": "sha512-yne5WE7fZZWFl2zF8fzDlYhPVJua6h6mTCSmlQ5pryaMXTZS9mfzXXIFWRL3kswqnQTu/QNFdyFj1mP0haF24w==", + "dependencies": { + "@types/geojson": "^7946.0.7", + "apache-arrow": "^4.0.0", + "d3-dsv": "^1.2.0" + } + }, + "node_modules/@loaders.gl/terrain": { + "version": "3.0.8", + "integrity": "sha512-MtOAYEB/xJB4CN4B0YNPkO4v1ZY332joxiOHQI1x37x4sWVAqOrKLr9jB42sZCB8aINi2WMWGiErtf9wh9L5Pg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "@loaders.gl/loader-utils": "3.0.8", + "@loaders.gl/schema": "3.0.8", + "@mapbox/martini": "^0.2.0" + } + }, + "node_modules/@loaders.gl/tiles": { + "version": "3.0.8", + "integrity": "sha512-Rc+yHFdQg2sYmcYkwvszukFWdm9EW354F9HUR7y/oauos6tsdo4YTj31zgytaYR63/EqWQ7kwI29/eePEcutzg==", + "dependencies": { + "@loaders.gl/core": "3.0.8", + "@loaders.gl/loader-utils": "3.0.8", + "@loaders.gl/math": "3.0.8", + "@math.gl/core": "^3.5.1", + "@math.gl/culling": "^3.5.1", + "@math.gl/geospatial": "^3.5.1", + "@math.gl/web-mercator": "^3.5.1", + "@probe.gl/stats": "^3.4.0" + } + }, + "node_modules/@loaders.gl/worker-utils": { + "version": "3.0.8", + "integrity": "sha512-Pg72HuXPcL725TrOlOr83xloVUHj6OMWmno1dI8ccuqfOBsgoRjxNZrcSvwBzfK8tFCzuN2X30I+mHl3BkuYLw==", + "dependencies": { + "@babel/runtime": "^7.3.1" + } + }, + "node_modules/@luma.gl/constants": { + "version": "8.5.4", + "integrity": "sha512-lrA4ja92om/gDHYOvM9itL5S7FVzjKulyknDz6S+Y7gmgHgXk2ln1Xar5zUCsLnhAYx4glHITXGH5Y5rdWgT1Q==" + }, + "node_modules/@luma.gl/core": { + "version": "8.5.4", + "integrity": "sha512-+saDz1D3mcPd53vgbG60ryg1w5CF9Z2wdakKHzR810VoJLw97t4aNdg/eNgyWOvbOHxaKJBPm8K0sGjej67+jw==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@luma.gl/constants": "8.5.4", + "@luma.gl/engine": "8.5.4", + "@luma.gl/gltools": "8.5.4", + "@luma.gl/shadertools": "8.5.4", + "@luma.gl/webgl": "8.5.4" + } + }, + "node_modules/@luma.gl/engine": { + "version": "8.5.4", + "integrity": "sha512-Sfv972IzvR9s9kKWugs67XQUh9jC0e/PpBrzvyGVnPU4XvFq42RZVF73pzEklVU6AlpR8Zg5CPtxGdhyOHtT7w==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@luma.gl/constants": "8.5.4", + "@luma.gl/gltools": "8.5.4", + "@luma.gl/shadertools": "8.5.4", + "@luma.gl/webgl": "8.5.4", + "@math.gl/core": "^3.5.0", + "probe.gl": "^3.4.0" + } + }, + "node_modules/@luma.gl/experimental": { + "version": "8.5.4", + "integrity": "sha512-09waqRhgIrw+Sq0/in4tw4jPag5YsFfV1nEHJaLAg5RFv92S53IEubSJgkuG02HoOBkPxQ7KYvs9VNmriisnYg==", + "dependencies": { + "@luma.gl/constants": "8.5.4", + "@math.gl/core": "^3.5.0", + "earcut": "^2.0.6" + }, + "peerDependencies": { + "@loaders.gl/gltf": "^3.0.0", + "@loaders.gl/images": "^3.0.0", + "@luma.gl/engine": "^8.4.0", + "@luma.gl/gltools": "^8.4.0", + "@luma.gl/shadertools": "^8.4.0", + "@luma.gl/webgl": "^8.4.0" + } + }, + "node_modules/@luma.gl/gltools": { + "version": "8.5.4", + "integrity": "sha512-JotiPuymQz2Xc41AYlS2moJC/EHxU+OX/OMKi0+/MeOlEFLsdochgTA0I64j8yofLTXdeiGCneGtD1Ao8fk+bw==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@luma.gl/constants": "8.5.4", + "probe.gl": "^3.4.0" + } + }, + "node_modules/@luma.gl/shadertools": { + "version": "8.5.4", + "integrity": "sha512-rwLBLrACi75aWnuJm8rVKCQnJR2sMTCxHuexfjHJ7Uecl0vVcVJZT7c9EnCFaz5LUTNbdupvuhq0SKNckKiKmw==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@math.gl/core": "^3.5.0" + } + }, + "node_modules/@luma.gl/webgl": { + "version": "8.5.4", + "integrity": "sha512-dWy4dhTbtvDO9zQBdx1Yb+DxNx/1JWV9rhhJxJUtTKbGZSX0RjkASTT6GBWMl5jrH1JYJefS1wswHmmPVXjK0Q==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@luma.gl/constants": "8.5.4", + "@luma.gl/gltools": "8.5.4", + "probe.gl": "^3.4.0" + } + }, + "node_modules/@mapbox/extent": { + "version": "0.4.0", + "integrity": "sha512-MSoKw3qPceGuupn04sdaJrFeLKvcSETVLZCGS8JA9x6zXQL3FWiKaIXYIZEDXd5jpXpWlRxinCZIN49yRy0C9A==" + }, + "node_modules/@mapbox/geojson-coords": { + "version": "0.0.2", + "integrity": "sha512-YuVzpseee/P1T5BWyeVVPppyfmuXYHFwZHmybkqaMfu4BWlOf2cmMGKj2Rr92MwfSTOCSUA0PAsVGRG8akY0rg==", + "dependencies": { + "@mapbox/geojson-normalize": "0.0.1", + "geojson-flatten": "^1.0.4" + } + }, + "node_modules/@mapbox/geojson-extent": { + "version": "1.0.1", + "integrity": "sha512-hh8LEO3djT4fqfr8sSC6wKt+p0TMiu+KOLMBUiFOyj+zGq7+IXwQGl0ppCVDkyzCewyd9LoGe9zAvDxXrLfhLw==", + "dependencies": { + "@mapbox/extent": "0.4.0", + "@mapbox/geojson-coords": "0.0.2", + "rw": "~0.1.4", + "traverse": "~0.6.6" + }, + "bin": { + "geojson-extent": "bin/geojson-extent" + } + }, + "node_modules/@mapbox/geojson-extent/node_modules/rw": { + "version": "0.1.4", + "integrity": "sha512-vSj3D96kMcjNyqPcp65wBRIDImGSrUuMxngNNxvw8MQaO+aQ6llzRPH7XcJy5zrpb3wU++045+Uz/IDIM684iw==" + }, + "node_modules/@mapbox/geojson-normalize": { + "version": "0.0.1", + "integrity": "sha512-82V7YHcle8lhgIGqEWwtXYN5cy0QM/OHq3ypGhQTbvHR57DF0vMHMjjVSQKFfVXBe/yWCBZTyOuzvK7DFFnx5Q==", + "bin": { + "geojson-normalize": "geojson-normalize" + } + }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.2", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "dependencies": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + }, + "bin": { + "geojson-rewind": "geojson-rewind" + } + }, + "node_modules/@mapbox/geojson-rewind/node_modules/get-stream": { + "version": "6.0.1", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mapbox/geojson-types": { + "version": "1.0.2", + "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-supported": { + "version": "2.0.1", + "integrity": "sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ==" + }, + "node_modules/@mapbox/martini": { + "version": "0.2.0", + "integrity": "sha512-7hFhtkb0KTLEls+TRw/rWayq5EeHtTaErgm/NskVoXmtgAQu/9D299aeyj6mzAR/6XUnYRp2lU+4IcrYRFjVsQ==" + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "1.2.5", + "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.0", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" + }, + "node_modules/@mapbox/vector-tile": { + "version": "1.3.1", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/@mapbox/whoots-js": { + "version": "3.1.0", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@math.gl/core": { + "version": "3.5.3", + "integrity": "sha512-TaSnvG0qFh1VxeNW5L58jSx0nJUMWMpUl6zo6Z3ScQzFySG5cicGOBzk/D40RkIZWPazCKCZ+ZThg5npSK9y3g==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "gl-matrix": "^3.0.0" + } + }, + "node_modules/@math.gl/culling": { + "version": "3.5.3", + "integrity": "sha512-ABpAcrvoIOLSm1EUkwgDem4RfO28HWPBs/+taZ/ZSpJG6KiVPklpKU1NCK+05HuJStkpFZ+XlWtehWU6FAMCyA==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@math.gl/core": "3.5.3", + "gl-matrix": "^3.0.0" + } + }, + "node_modules/@math.gl/geospatial": { + "version": "3.5.3", + "integrity": "sha512-cnc8VMQrt30JmlG200VDJmmvSjaGW57gY9KEZ+raapxyyFyfDNuAuIrIxe+zbK66FbvFWTbJlDaNmKqVG+ohyw==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@math.gl/core": "3.5.3", + "gl-matrix": "^3.0.0" + } + }, + "node_modules/@math.gl/polygon": { + "version": "3.5.3", + "integrity": "sha512-VktscmyQg/Rd56nJk0Nj/UyvnPDbsnZNMWCdl3G5AYenYzLWy6h4FEWhLx8pD+Xw7VuFot8LR4WAK2TPzXzrWw==", + "dependencies": { + "@math.gl/core": "3.5.3" + } + }, + "node_modules/@math.gl/web-mercator": { + "version": "3.5.6", + "integrity": "sha512-siWHLJGp9o8fDEM1t0Rby+JXftl6il0z3927liWGzkHqFftXPHY858ShPy45ThDU8q5lyCftg8aVgrv4nfD+Zw==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "gl-matrix": "~3.3.0" + } + }, + "node_modules/@mdx-js/loader": { + "version": "1.6.22", + "integrity": "sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q==", + "dev": true, + "dependencies": { + "@mdx-js/mdx": "1.6.22", + "@mdx-js/react": "1.6.22", + "loader-utils": "2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/loader/node_modules/json5": { + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@mdx-js/loader/node_modules/loader-utils": { + "version": "2.0.0", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "1.6.22", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/core": { + "version": "7.12.9", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/debug": { + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@mdx-js/mdx/node_modules/is-buffer": { + "version": "2.0.5", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/@mdx-js/mdx/node_modules/is-plain-obj": { + "version": "2.1.0", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@mdx-js/mdx/node_modules/json5": { + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@mdx-js/mdx/node_modules/ms": { + "version": "2.1.2", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@mdx-js/mdx/node_modules/parse-entities": { + "version": "2.0.0", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@mdx-js/mdx/node_modules/remark-parse": { + "version": "8.0.3", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unified": { + "version": "9.2.0", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unist-util-is": { + "version": "4.1.0", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unist-util-remove-position": { + "version": "2.0.1", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unist-util-visit": { + "version": "2.0.3", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile": { + "version": "4.2.1", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile-location": { + "version": "3.2.0", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile-message": { + "version": "2.0.4", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "1.6.22", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + } + }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@mrmlnc/readdir-enhanced/node_modules/glob-to-regexp": { + "version": "0.3.0", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==" + }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.3", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dependencies": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.scandir/node_modules/@nodelib/fs.stat": { + "version": "2.0.3", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.4", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.0.0", + "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.3.5", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@npmcli/map-workspaces": { + "version": "2.0.4", + "integrity": "sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==", + "dev": true, + "dependencies": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/glob": { + "version": "8.0.3", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { + "version": "5.1.2", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/name-from-folder": { + "version": "1.0.1", + "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", + "dev": true + }, + "node_modules/@nrwl/cli": { + "version": "15.3.3", + "integrity": "sha512-ZWTmVP9H3ukppWWGaS/s3Nym2nOYgnt6eHtuUFNsroz8LesG5oFAJviOz9jDEM/b+pLIrvYfU5aAGZqrtM3Z2A==", + "dev": true, + "dependencies": { + "nx": "15.3.3" + } + }, + "node_modules/@nrwl/devkit": { + "version": "15.3.3", + "integrity": "sha512-48R9HAp6r6umWNXTlVTMsH94YYjU/XUPLDTtXBgKESMVbdq8Fk+HDHuN0thXG5dL6DFkXgD0MICLm3jSQU6xMw==", + "dev": true, + "dependencies": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 14 <= 16" + } + }, + "node_modules/@nrwl/devkit/node_modules/ignore": { + "version": "5.2.4", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@nrwl/devkit/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nrwl/devkit/node_modules/semver": { + "version": "7.3.4", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nrwl/devkit/node_modules/tslib": { + "version": "2.4.1", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/@nrwl/devkit/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@nrwl/tao": { + "version": "15.3.3", + "integrity": "sha512-f9+VwhlJ/7TWpjHSgoUOAA067uP9DmzABMY9HC5OREEDaCx+rzYEvbLAPv6cXzWw+6IYM6cyKw0zWSQrdEVrWg==", + "dev": true, + "dependencies": { + "nx": "15.3.3" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@octokit/auth-token": { + "version": "2.5.0", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "dependencies": { + "@octokit/types": "^6.0.3" + } + }, + "node_modules/@octokit/core": { + "version": "3.6.0", + "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "dependencies": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.3", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/core/node_modules/@octokit/request-error": { + "version": "2.1.0", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "node_modules/@octokit/endpoint": { + "version": "6.0.12", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dependencies": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/endpoint/node_modules/is-plain-object": { + "version": "5.0.0", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/graphql": { + "version": "4.8.0", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "dependencies": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "11.2.0", + "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==" + }, + "node_modules/@octokit/plugin-enterprise-rest": { + "version": "6.0.1", + "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "2.17.0", + "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", + "dependencies": { + "@octokit/types": "^6.34.0" + }, + "peerDependencies": { + "@octokit/core": ">=2" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "5.13.0", + "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", + "dependencies": { + "@octokit/types": "^6.34.0", + "deprecation": "^2.3.1" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/request": { + "version": "5.6.3", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "dependencies": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/request-error": { + "version": "3.0.2", + "integrity": "sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==", + "dev": true, + "dependencies": { + "@octokit/types": "^8.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { + "version": "14.0.0", + "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==", + "dev": true + }, + "node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "8.0.0", + "integrity": "sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^14.0.0" + } + }, + "node_modules/@octokit/request/node_modules/@octokit/request-error": { + "version": "2.1.0", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "node_modules/@octokit/request/node_modules/is-plain-object": { + "version": "5.0.0", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/rest": { + "version": "18.12.0", + "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "dependencies": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.8", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + } + }, + "node_modules/@octokit/types": { + "version": "6.34.0", + "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", + "dependencies": { + "@octokit/openapi-types": "^11.2.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.0.4", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@phenomnomnominal/tsquery": { + "version": "4.1.1", + "integrity": "sha512-jjMmK1tnZbm1Jq5a7fBliM4gQwjxMU7TFoRNwIyzwlO+eHPRCFv/Nv+H/Gi1jc3WR7QURG8D5d0Tn12YGrUqBQ==", + "dev": true, + "dependencies": { + "esquery": "^1.0.1" + }, + "peerDependencies": { + "typescript": "^3 || ^4" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.20", + "integrity": "sha512-88p7+M0QGxKpmnkfXjS4V26AnoC/eiqZutE8GLdaI5X12NY75bXSdTY9NkmYb2Xyk1O+MmkuO6Frmsj84V6I8Q==", + "dev": true + }, + "node_modules/@popperjs/core": { + "version": "2.10.1", + "integrity": "sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@probe.gl/stats": { + "version": "3.4.0", + "integrity": "sha512-Gl37r9qGuiKadIvTZdSZvzCNOttJYw6RcY1oT0oDuB8r2uhuZAdSMQRQTy9FTinp6MY6O9wngGnV6EpQ8wSBAw==", + "dependencies": { + "@babel/runtime": "^7.0.0" + } + }, + "node_modules/@react-dnd/asap": { + "version": "4.0.0", + "integrity": "sha512-0XhqJSc6pPoNnf8DhdsPHtUhRzZALVzYMTzRwV4VI6DJNJ/5xxfL9OQUwb8IH5/2x7lSf7nAZrnzUD+16VyOVQ==" + }, + "node_modules/@react-dnd/invariant": { + "version": "2.0.0", + "integrity": "sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==" + }, + "node_modules/@react-dnd/shallowequal": { + "version": "2.0.0", + "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==" + }, + "node_modules/@react-icons/all-files": { + "version": "4.1.0", + "integrity": "sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@samverschueren/stream-to-observable": { + "version": "0.3.1", + "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "dev": true, + "dependencies": { + "any-observable": "^0.3.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "rxjs": { + "optional": true + }, + "zen-observable": { + "optional": true + } + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/formatio": { + "version": "5.0.1", + "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^5.0.2" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "5.3.1", + "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "node_modules/@storybook/addon-actions": { + "version": "6.4.22", + "integrity": "sha512-t2w3iLXFul+R/1ekYxIEzUOZZmvEa7EzUAVAuCHP4i6x0jBnTTZ7sAIUVRaxVREPguH5IqI/2OklYhKanty2Yw==", + "dependencies": { + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/theming": "6.4.22", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "polished": "^4.0.5", + "prop-types": "^15.7.2", + "react-inspector": "^5.1.0", + "regenerator-runtime": "^0.13.7", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "uuid-browser": "^3.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-actions/node_modules/polished": { + "version": "4.2.2", + "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/addon-backgrounds": { + "version": "6.4.22", + "integrity": "sha512-xQIV1SsjjRXP7P5tUoGKv+pul1EY8lsV7iBXQb5eGbp4AffBj3qoYBSZbX4uiazl21o0MQiQoeIhhaPVaFIIGg==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/theming": "6.4.22", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-controls": { + "version": "6.4.22", + "integrity": "sha512-f/M/W+7UTEUnr/L6scBMvksq+ZA8GTfh3bomE5FtWyOyaFppq9k8daKAvdYNlzXAOrUUsoZVJDgpb20Z2VBiSQ==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/node-logger": "6.4.22", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", + "core-js": "^3.8.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-docs": { + "version": "6.5.10", + "integrity": "sha512-1kgjo3f0vL6GN8fTwLL05M/q/kDdzvuqwhxPY/v5hubFb3aQZGr2yk9pRBaLAbs4bez0yG0ASXcwhYnrEZUppg==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@jest/transform": "^26.6.2", + "@mdx-js/react": "^1.6.22", + "@storybook/addons": "6.5.10", + "@storybook/api": "6.5.10", + "@storybook/components": "6.5.10", + "@storybook/core-common": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/docs-tools": "6.5.10", + "@storybook/mdx1-csf": "^0.0.1", + "@storybook/node-logger": "6.5.10", + "@storybook/postinstall": "6.5.10", + "@storybook/preview-web": "6.5.10", + "@storybook/source-loader": "6.5.10", + "@storybook/store": "6.5.10", + "@storybook/theming": "6.5.10", + "babel-loader": "^8.0.0", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "regenerator-runtime": "^0.13.7", + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@storybook/mdx2-csf": "^0.0.3", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@storybook/mdx2-csf": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/addons": { + "version": "6.5.10", + "integrity": "sha512-VD4tBCQ23PkSeDoxuHcKy0RfhIs3oMYjBacOZx7d0bvOzK9WjPyvE2ysDAh7r/ceqnwmWHAScIpE+I1RU7gl+g==", + "dev": true, + "dependencies": { + "@storybook/api": "6.5.10", + "@storybook/channels": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.10", + "@storybook/theming": "6.5.10", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/api": { + "version": "6.5.10", + "integrity": "sha512-AkmgSPNEGdKp4oZA4KQ+RJsacw7GwfvjsVDnCkcXqS9zmSr/RNL0fhpcd60KKkmx/hGKPTDFpK3ZayxDrJ/h4A==", + "dev": true, + "dependencies": { + "@storybook/channels": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.10", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.10", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/channel-postmessage": { + "version": "6.5.10", + "integrity": "sha512-t9PTA0UzFvYa3IlOfpBOolfrRMPTjUMIeCQ6FNyM0aj5GqLKSvoQzP8NeoRpIrvyf6ljFKKdaMaZ3fiCvh45ag==", + "dev": true, + "dependencies": { + "@storybook/channels": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "core-js": "^3.8.2", + "global": "^4.4.0", + "qs": "^6.10.0", + "telejson": "^6.0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/channels": { + "version": "6.5.10", + "integrity": "sha512-lo26YZ6kWpHXLhuHJF4P/bICY7jD/rXEZqReKtGOSk1Lv99/xvG6pqmcy3hWLf3v3Dy/8otjRPSR7izFVIIZgQ==", + "dev": true, + "dependencies": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/client-logger": { + "version": "6.5.10", + "integrity": "sha512-/xA0MHOevXev68hyLMQw8Qo8KczSIdXOxliAgrycMTkDmw5eKeA8TP7B8zP3wGuq/e3MrdD9/8MWhb/IQBNC3w==", + "dev": true, + "dependencies": { + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/components": { + "version": "6.5.10", + "integrity": "sha512-9OhgB8YQfGwOKjo/N96N5mrtJ6qDVVoEM1zuhea32tJUd2eYf0aSWpryA9VnOM0V1q/8DAoCg5rPBMYWMBU5uw==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.10", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/core-common": { + "version": "6.5.10", + "integrity": "sha512-Bx+VKkfWdrAmD8T51Sjq/mMhRaiapBHcpG4cU5bc3DMbg+LF2/yrgqv/cjVu+m5gHAzYCac5D7gqzBgvG7Myww==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.10", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-decorators": "^7.12.12", + "@babel/plugin-proposal-export-default-from": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-private-property-in-object": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.12", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/preset-env": "^7.12.11", + "@babel/preset-react": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@babel/register": "^7.12.1", + "@storybook/node-logger": "6.5.10", + "@storybook/semver": "^7.3.2", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/pretty-hrtime": "^1.0.0", + "babel-loader": "^8.0.0", + "babel-plugin-macros": "^3.0.1", + "babel-plugin-polyfill-corejs3": "^0.1.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "express": "^4.17.1", + "file-system-cache": "^1.0.5", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.0.4", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "handlebars": "^4.7.7", + "interpret": "^2.2.0", + "json5": "^2.1.3", + "lazy-universal-dotenv": "^3.0.1", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "webpack": "4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/core-events": { + "version": "6.5.10", + "integrity": "sha512-EVb1gO1172klVIAABLOoigFMx0V88uctY0K/qVCO8n6v+wd2+0Ccn63kl+gTxsAC3WZ8XhXh9q2w5ImHklVECw==", + "dev": true, + "dependencies": { + "core-js": "^3.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/csf": { + "version": "0.0.2--canary.4566f4d.1", + "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/node-logger": { + "version": "6.5.10", + "integrity": "sha512-bYswXIKV7Stru8vYfkjUMNN8UhF7Qg7NRsUvG5Djt5lLIae1XmUIgnH40mU/nW4X4BSfcR9MKxsSsngvn2WmQg==", + "dev": true, + "dependencies": { + "@types/npmlog": "^4.1.2", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "npmlog": "^5.0.1", + "pretty-hrtime": "^1.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/postinstall": { + "version": "6.5.10", + "integrity": "sha512-xqUdpnFHYkn8MgtV+QztvIsRWa6jQUk7QT1Mu17Y0S7PbslNGsuskRPHenHhACXBJF+TM86R+4BaAhnVYTmElw==", + "dev": true, + "dependencies": { + "core-js": "^3.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/preview-web": { + "version": "6.5.10", + "integrity": "sha512-sTC/o5gkvALOtcNgtApGKGN9EavvSxRHBeBh+5BQjV2qQ8ap+26RsfUizNBECAa2Jrn4osaDYn9HRhJLFL69WA==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.10", + "@storybook/channel-postmessage": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.10", + "ansi-to-html": "^0.6.11", + "core-js": "^3.8.2", + "global": "^4.4.0", + "lodash": "^4.17.21", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "unfetch": "^4.2.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/router": { + "version": "6.5.10", + "integrity": "sha512-O+vNW/eEpYFF8eCg5jZjNQ6q2DKQVxqDRPCy9pJdEbvavMDZn6AFYgVK+VJe5F4211WW2yncOu922xObCxXJYg==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "6.5.10", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/source-loader": { + "version": "6.5.10", + "integrity": "sha512-1RxxRumpjs8VUUwES9LId+cuNQnixhZAcwCxd6jaKkTZbjiQCtAhXX6DBTjJGV1u/JnCsqEp5b1wB8j/EioNHw==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "estraverse": "^5.2.0", + "global": "^4.4.0", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/source-loader/node_modules/loader-utils": { + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/store": { + "version": "6.5.10", + "integrity": "sha512-RswrSYh2IiKkytFPxP9AvP+hekjrvHK2ILvyDk2ZgduCN4n5ivsekOb+N3M2t+dq1eLuW9or5n2T4OWwAwjxxQ==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "slash": "^3.0.0", + "stable": "^0.1.8", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/theming": { + "version": "6.5.10", + "integrity": "sha512-BvTQBBcSEwKKcsVmF+Ol6v0RIQUr+bxP7gb10wtfBd23mZTEFA0C1N5FnZr/dDeiBKG1pvf1UKvoYA731y0BsA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "6.5.10", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@types/node": { + "version": "16.11.48", + "integrity": "sha512-Z9r9UWlNeNkYnxybm+1fc0jxUNjZqRekTAr1pG0qdXe9apT9yCiqk1c4VvKQJsFpnchU4+fLl25MabSLA2wxIw==", + "dev": true + }, + "node_modules/@storybook/addon-docs/node_modules/acorn": { + "version": "6.4.2", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/ansi-regex": { + "version": "5.0.1", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/addon-docs/node_modules/are-we-there-yet": { + "version": "2.0.0", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/addon-docs/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@storybook/addon-docs/node_modules/eslint-scope": { + "version": "4.0.3", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/estraverse": { + "version": "5.3.0", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/find-up": { + "version": "5.0.0", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/addon-docs/node_modules/fs-extra": { + "version": "9.1.0", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/addon-docs/node_modules/gauge": { + "version": "3.0.2", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/addon-docs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/addon-docs/node_modules/isobject": { + "version": "4.0.0", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/json5": { + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/addon-docs/node_modules/loader-runner": { + "version": "2.4.0", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@storybook/addon-docs/node_modules/locate-path": { + "version": "6.0.0", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/addon-docs/node_modules/npmlog": { + "version": "5.0.1", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/p-limit": { + "version": "3.1.0", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/addon-docs/node_modules/p-locate": { + "version": "5.0.0", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/addon-docs/node_modules/path-exists": { + "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/addon-docs/node_modules/pkg-dir": { + "version": "5.0.0", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/addon-docs/node_modules/prettier": { + "version": "2.3.0", + "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/qs": { + "version": "6.11.0", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/addon-docs/node_modules/readable-stream": { + "version": "3.6.0", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@storybook/addon-docs/node_modules/resolve-from": { + "version": "5.0.0", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/addon-docs/node_modules/schema-utils": { + "version": "1.0.0", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@storybook/addon-docs/node_modules/slash": { + "version": "3.0.0", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/addon-docs/node_modules/source-map": { + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/string-width": { + "version": "4.2.3", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/addon-docs/node_modules/strip-ansi": { + "version": "6.0.1", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/addon-docs/node_modules/telejson": { + "version": "6.0.8", + "integrity": "sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==", + "dev": true, + "dependencies": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.2", + "is-regex": "^1.1.2", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3" + } + }, + "node_modules/@storybook/addon-docs/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/webpack": { + "version": "4.46.0", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-docs/node_modules/webpack-sources": { + "version": "1.4.3", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/@storybook/addon-essentials": { + "version": "6.4.22", + "integrity": "sha512-GTv291fqvWq2wzm7MruBvCGuWaCUiuf7Ca3kzbQ/WqWtve7Y/1PDsqRNQLGZrQxkXU0clXCqY1XtkTrtA3WGFQ==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "6.4.22", + "@storybook/addon-backgrounds": "6.4.22", + "@storybook/addon-controls": "6.4.22", + "@storybook/addon-docs": "6.4.22", + "@storybook/addon-measure": "6.4.22", + "@storybook/addon-outline": "6.4.22", + "@storybook/addon-toolbars": "6.4.22", + "@storybook/addon-viewport": "6.4.22", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/node-logger": "6.4.22", + "core-js": "^3.8.2", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@babel/core": "^7.9.6", + "@storybook/vue": "6.4.22", + "@storybook/web-components": "6.4.22", + "babel-loader": "^8.0.0", + "lit-html": "^1.4.1 || ^2.0.0-rc.3", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0", + "webpack": "*" + }, + "peerDependenciesMeta": { + "@storybook/vue": { + "optional": true + }, + "@storybook/web-components": { + "optional": true + }, + "lit-html": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-essentials/node_modules/@storybook/addon-docs": { + "version": "6.4.22", + "integrity": "sha512-9j+i+W+BGHJuRe4jUrqk6ubCzP4fc1xgFS2o8pakRiZgPn5kUQPdkticmsyh1XeEJifwhqjKJvkEDrcsleytDA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.10", + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@jest/transform": "^26.6.2", + "@mdx-js/loader": "^1.6.22", + "@mdx-js/mdx": "^1.6.22", + "@mdx-js/react": "^1.6.22", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/builder-webpack4": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/csf-tools": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/postinstall": "6.4.22", + "@storybook/preview-web": "6.4.22", + "@storybook/source-loader": "6.4.22", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "core-js": "^3.8.2", + "doctrine": "^3.0.0", + "escodegen": "^2.0.0", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "html-tags": "^3.1.0", + "js-string-escape": "^1.0.1", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "nanoid": "^3.1.23", + "p-limit": "^3.1.0", + "prettier": ">=2.2.1 <=2.3.0", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^14.3.4", + "regenerator-runtime": "^0.13.7", + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@storybook/angular": "6.4.22", + "@storybook/html": "6.4.22", + "@storybook/react": "6.4.22", + "@storybook/vue": "6.4.22", + "@storybook/vue3": "6.4.22", + "@storybook/web-components": "6.4.22", + "lit": "^2.0.0", + "lit-html": "^1.4.1 || ^2.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0", + "svelte": "^3.31.2", + "sveltedoc-parser": "^4.1.0", + "vue": "^2.6.10 || ^3.0.0", + "webpack": "*" + }, + "peerDependenciesMeta": { + "@storybook/angular": { + "optional": true + }, + "@storybook/html": { + "optional": true + }, + "@storybook/react": { + "optional": true + }, + "@storybook/vue": { + "optional": true + }, + "@storybook/vue3": { + "optional": true + }, + "@storybook/web-components": { + "optional": true + }, + "lit": { + "optional": true + }, + "lit-html": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "svelte": { + "optional": true + }, + "sveltedoc-parser": { + "optional": true + }, + "vue": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-essentials/node_modules/acorn": { + "version": "7.4.1", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/escodegen": { + "version": "2.0.0", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/esprima": { + "version": "4.0.1", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/estraverse": { + "version": "5.3.0", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/json5": { + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/loader-utils": { + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/nanoid": { + "version": "3.3.4", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/p-limit": { + "version": "3.1.0", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/prettier": { + "version": "2.3.0", + "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/source-map": { + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@storybook/addon-knobs": { + "version": "6.3.1", + "integrity": "sha512-2GGGnQSPXXUhHHYv4IW6pkyQlCPYXKYiyGzfhV7Zhs95M2Ban08OA6KLmliMptWCt7U9tqTO8dB5u0C2cWmCTw==", + "deprecated": "deprecating @storybook/addon-knobs in favor of @storybook/addon-controls", + "dependencies": { + "copy-to-clipboard": "^3.3.1", + "core-js": "^3.8.2", + "escape-html": "^1.0.3", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.20", + "prop-types": "^15.7.2", + "qs": "^6.10.0", + "react-colorful": "^5.1.2", + "react-lifecycles-compat": "^3.0.4", + "react-select": "^3.2.0" + }, + "peerDependencies": { + "@storybook/addons": "^6.3.0", + "@storybook/api": "^6.3.0", + "@storybook/components": "^6.3.0", + "@storybook/core-events": "^6.3.0", + "@storybook/theming": "^6.3.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-knobs/node_modules/qs": { + "version": "6.11.0", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/addon-links": { + "version": "6.4.22", + "integrity": "sha512-OSOyDnTXnmcplJHlXTYUTMkrfpLqxtHp2R69IXfAyI1e8WNDb79mXflrEXDA/RSNEliLkqYwCyYby7gDMGds5Q==", + "dependencies": { + "@storybook/addons": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.22", + "@types/qs": "^6.9.5", + "core-js": "^3.8.2", + "global": "^4.4.0", + "prop-types": "^15.7.2", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-links/node_modules/qs": { + "version": "6.11.0", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/addon-measure": { + "version": "6.4.22", + "integrity": "sha512-CjDXoCNIXxNfXfgyJXPc0McjCcwN1scVNtHa9Ckr+zMjiQ8pPHY7wDZCQsG69KTqcWHiVfxKilI82456bcHYhQ==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-outline": { + "version": "6.4.22", + "integrity": "sha512-VIMEzvBBRbNnupGU7NV0ahpFFb6nKVRGYWGREjtABdFn2fdKr1YicOHFe/3U7hRGjb5gd+VazSvyUvhaKX9T7Q==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-toolbars": { + "version": "6.4.22", + "integrity": "sha512-FFyj6XDYpBBjcUu6Eyng7R805LUbVclEfydZjNiByAoDVyCde9Hb4sngFxn/T4fKAfBz/32HKVXd5iq4AHYtLg==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/theming": "6.4.22", + "core-js": "^3.8.2", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-viewport": { + "version": "6.4.22", + "integrity": "sha512-6jk0z49LemeTblez5u2bYXYr6U+xIdLbywe3G283+PZCBbEDE6eNYy2d2HDL+LbCLbezJBLYPHPalElphjJIcw==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/theming": "6.4.22", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "prop-types": "^15.7.2", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addons": { + "version": "6.4.22", + "integrity": "sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==", + "dependencies": { + "@storybook/api": "6.4.22", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.22", + "@storybook/theming": "6.4.22", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@storybook/api": { + "version": "6.4.22", + "integrity": "sha512-lAVI3o2hKupYHXFTt+1nqFct942up5dHH6YD7SZZJGyW21dwKC3HK1IzCsTawq3fZAKkgWFgmOO649hKk60yKg==", + "dependencies": { + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.22", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.22", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@storybook/builder-webpack4": { + "version": "6.4.22", + "integrity": "sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==", + "dependencies": { + "@babel/core": "^7.12.10", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-decorators": "^7.12.12", + "@babel/plugin-proposal-export-default-from": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.12", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/preset-env": "^7.12.11", + "@babel/preset-react": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/channel-postmessage": "6.4.22", + "@storybook/channels": "6.4.22", + "@storybook/client-api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/preview-web": "6.4.22", + "@storybook/router": "6.4.22", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", + "@storybook/ui": "6.4.22", + "@types/node": "^14.0.10", + "@types/webpack": "^4.41.26", + "autoprefixer": "^9.8.6", + "babel-loader": "^8.0.0", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-polyfill-corejs3": "^0.1.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "core-js": "^3.8.2", + "css-loader": "^3.6.0", + "file-loader": "^6.2.0", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^4.1.6", + "glob": "^7.1.6", + "glob-promise": "^3.4.0", + "global": "^4.4.0", + "html-webpack-plugin": "^4.0.0", + "pnp-webpack-plugin": "1.6.4", + "postcss": "^7.0.36", + "postcss-flexbugs-fixes": "^4.2.1", + "postcss-loader": "^4.2.0", + "raw-loader": "^4.0.2", + "stable": "^0.1.8", + "style-loader": "^1.3.0", + "terser-webpack-plugin": "^4.2.3", + "ts-dedent": "^2.0.0", + "url-loader": "^4.1.1", + "util-deprecate": "^1.0.2", + "webpack": "4", + "webpack-dev-middleware": "^3.7.3", + "webpack-filter-warnings-plugin": "^1.2.1", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.2.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/@types/node": { + "version": "14.18.16", + "integrity": "sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==" + }, + "node_modules/@storybook/builder-webpack4/node_modules/acorn": { + "version": "6.4.2", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/ansi-styles": { + "version": "3.2.1", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/chalk": { + "version": "2.4.2", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/css-loader": { + "version": "3.6.0", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dependencies": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/css-loader/node_modules/semver": { + "version": "6.3.0", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/eslint-scope": { + "version": "4.0.3", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/find-up": { + "version": "5.0.0", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "dependencies": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "engines": { + "node": ">=6.11.5", + "yarn": ">=1.0.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/html-webpack-plugin": { + "version": "4.5.2", + "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/icss-utils": { + "version": "4.1.1", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/json5": { + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/loader-runner": { + "version": "2.4.0", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/locate-path": { + "version": "6.0.0", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/normalize-path": { + "version": "3.0.0", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/p-limit": { + "version": "3.1.0", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/p-locate": { + "version": "5.0.0", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/path-exists": { + "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/postcss": { + "version": "7.0.39", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@storybook/builder-webpack4/node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "dependencies": { "icss-utils": "^4.1.1", @@ -11083,8 +14203,8 @@ } }, "node_modules/@storybook/builder-webpack4/node_modules/style-loader/node_modules/loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -11361,12 +14481,9 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/json5": { - "version": "2.2.0", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -11375,8 +14492,8 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/loader-utils": { - "version": "2.0.0", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "dependencies": { "big.js": "^5.2.2", @@ -11462,12 +14579,13 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/terser": { - "version": "5.9.0", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "version": "5.14.2", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "bin": { @@ -11511,14 +14629,6 @@ } } }, - "node_modules/@storybook/builder-webpack5/node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/@storybook/builder-webpack5/node_modules/webpack-dev-middleware": { "version": "4.3.0", "integrity": "sha512-PjwyVY95/bhBh6VUqt6z4THplYcsvQ8YNNBTBM873xLVmw8FLeALn0qurHbs9EmcfhzQis/eoqypSnZeuUz26w==", @@ -11570,8 +14680,8 @@ } }, "node_modules/@storybook/channel-postmessage/node_modules/qs": { - "version": "6.10.3", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -11645,8 +14755,8 @@ } }, "node_modules/@storybook/client-api/node_modules/qs": { - "version": "6.10.1", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.11.0", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -11812,8 +14922,8 @@ } }, "node_modules/@storybook/core-client/node_modules/qs": { - "version": "6.10.3", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -11958,8 +15068,8 @@ } }, "node_modules/@storybook/core-common/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -12472,6 +15582,243 @@ "node": ">=10.13.0" } }, + "node_modules/@storybook/docs-tools": { + "version": "6.5.10", + "integrity": "sha512-/bvYgOO+CxMEcHifkjJg0A60OTGOhcjGxnsB1h0gJuxMrqA/7Qwc108bFmPiX0eiD1BovFkZLJV4O6OY7zP5Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.10", + "core-js": "^3.8.2", + "doctrine": "^3.0.0", + "lodash": "^4.17.21", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/docs-tools/node_modules/@storybook/addons": { + "version": "6.5.10", + "integrity": "sha512-VD4tBCQ23PkSeDoxuHcKy0RfhIs3oMYjBacOZx7d0bvOzK9WjPyvE2ysDAh7r/ceqnwmWHAScIpE+I1RU7gl+g==", + "dev": true, + "dependencies": { + "@storybook/api": "6.5.10", + "@storybook/channels": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.10", + "@storybook/theming": "6.5.10", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/docs-tools/node_modules/@storybook/api": { + "version": "6.5.10", + "integrity": "sha512-AkmgSPNEGdKp4oZA4KQ+RJsacw7GwfvjsVDnCkcXqS9zmSr/RNL0fhpcd60KKkmx/hGKPTDFpK3ZayxDrJ/h4A==", + "dev": true, + "dependencies": { + "@storybook/channels": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.10", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.10", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/docs-tools/node_modules/@storybook/channels": { + "version": "6.5.10", + "integrity": "sha512-lo26YZ6kWpHXLhuHJF4P/bICY7jD/rXEZqReKtGOSk1Lv99/xvG6pqmcy3hWLf3v3Dy/8otjRPSR7izFVIIZgQ==", + "dev": true, + "dependencies": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/docs-tools/node_modules/@storybook/client-logger": { + "version": "6.5.10", + "integrity": "sha512-/xA0MHOevXev68hyLMQw8Qo8KczSIdXOxliAgrycMTkDmw5eKeA8TP7B8zP3wGuq/e3MrdD9/8MWhb/IQBNC3w==", + "dev": true, + "dependencies": { + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/docs-tools/node_modules/@storybook/core-events": { + "version": "6.5.10", + "integrity": "sha512-EVb1gO1172klVIAABLOoigFMx0V88uctY0K/qVCO8n6v+wd2+0Ccn63kl+gTxsAC3WZ8XhXh9q2w5ImHklVECw==", + "dev": true, + "dependencies": { + "core-js": "^3.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/docs-tools/node_modules/@storybook/csf": { + "version": "0.0.2--canary.4566f4d.1", + "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/@storybook/docs-tools/node_modules/@storybook/router": { + "version": "6.5.10", + "integrity": "sha512-O+vNW/eEpYFF8eCg5jZjNQ6q2DKQVxqDRPCy9pJdEbvavMDZn6AFYgVK+VJe5F4211WW2yncOu922xObCxXJYg==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "6.5.10", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/docs-tools/node_modules/@storybook/store": { + "version": "6.5.10", + "integrity": "sha512-RswrSYh2IiKkytFPxP9AvP+hekjrvHK2ILvyDk2ZgduCN4n5ivsekOb+N3M2t+dq1eLuW9or5n2T4OWwAwjxxQ==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "slash": "^3.0.0", + "stable": "^0.1.8", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/docs-tools/node_modules/@storybook/theming": { + "version": "6.5.10", + "integrity": "sha512-BvTQBBcSEwKKcsVmF+Ol6v0RIQUr+bxP7gb10wtfBd23mZTEFA0C1N5FnZr/dDeiBKG1pvf1UKvoYA731y0BsA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "6.5.10", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/docs-tools/node_modules/isobject": { + "version": "4.0.0", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@storybook/docs-tools/node_modules/qs": { + "version": "6.11.0", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/docs-tools/node_modules/slash": { + "version": "3.0.0", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/docs-tools/node_modules/telejson": { + "version": "6.0.8", + "integrity": "sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==", + "dev": true, + "dependencies": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.2", + "is-regex": "^1.1.2", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3" + } + }, "node_modules/@storybook/manager-webpack4": { "version": "6.4.22", "integrity": "sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==", @@ -12640,8 +15987,8 @@ } }, "node_modules/@storybook/manager-webpack4/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -12830,8 +16177,8 @@ } }, "node_modules/@storybook/manager-webpack4/node_modules/style-loader/node_modules/loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -13065,12 +16412,9 @@ } }, "node_modules/@storybook/manager-webpack5/node_modules/json5": { - "version": "2.2.0", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -13079,8 +16423,8 @@ } }, "node_modules/@storybook/manager-webpack5/node_modules/loader-utils": { - "version": "2.0.0", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "dependencies": { "big.js": "^5.2.2", @@ -13224,12 +16568,13 @@ } }, "node_modules/@storybook/manager-webpack5/node_modules/terser": { - "version": "5.9.0", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "version": "5.14.2", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "bin": { @@ -13273,14 +16618,6 @@ } } }, - "node_modules/@storybook/manager-webpack5/node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/@storybook/manager-webpack5/node_modules/webpack-dev-middleware": { "version": "4.3.0", "integrity": "sha512-PjwyVY95/bhBh6VUqt6z4THplYcsvQ8YNNBTBM873xLVmw8FLeALn0qurHbs9EmcfhzQis/eoqypSnZeuUz26w==", @@ -13314,6 +16651,59 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/@storybook/mdx1-csf": { + "version": "0.0.1", + "integrity": "sha512-4biZIWWzoWlCarMZmTpqcJNgo/RBesYZwGFbQeXiGYsswuvfWARZnW9RE9aUEMZ4XPn7B1N3EKkWcdcWe/K2tg==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/preset-env": "^7.12.11", + "@babel/types": "^7.12.11", + "@mdx-js/mdx": "^1.6.22", + "@types/lodash": "^4.14.167", + "js-string-escape": "^1.0.1", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "ts-dedent": "^2.0.0" + } + }, + "node_modules/@storybook/mdx1-csf/node_modules/json5": { + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/mdx1-csf/node_modules/loader-utils": { + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@storybook/mdx1-csf/node_modules/prettier": { + "version": "2.3.0", + "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/@storybook/node-logger": { "version": "6.4.22", "integrity": "sha512-sUXYFqPxiqM7gGH7gBXvO89YEO42nA4gBicJKZjj9e+W4QQLrftjF9l+mAw2K0mVE10Bn7r4pfs5oEZ0aruyyA==", @@ -13459,8 +16849,8 @@ } }, "node_modules/@storybook/preview-web/node_modules/qs": { - "version": "6.10.3", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -13766,8 +17156,8 @@ } }, "node_modules/@storybook/react/node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -13813,11 +17203,8 @@ } }, "node_modules/@storybook/react/node_modules/json5": { - "version": "2.2.0", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dependencies": { - "minimist": "^1.2.5" - }, + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -14032,8 +17419,8 @@ } }, "node_modules/@storybook/router/node_modules/qs": { - "version": "6.10.3", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -14186,8 +17573,8 @@ } }, "node_modules/@storybook/source-loader/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -14197,8 +17584,8 @@ } }, "node_modules/@storybook/source-loader/node_modules/loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "dependencies": { "big.js": "^5.2.2", @@ -14371,8 +17758,8 @@ } }, "node_modules/@storybook/ui/node_modules/qs": { - "version": "6.10.3", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -14741,12 +18128,9 @@ } }, "node_modules/@svgr/webpack/node_modules/json5": { - "version": "2.1.3", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -14755,8 +18139,8 @@ } }, "node_modules/@svgr/webpack/node_modules/loader-utils": { - "version": "2.0.0", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "dependencies": { "big.js": "^5.2.2", @@ -14947,6 +18331,27 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/base16": { + "version": "1.0.2", + "integrity": "sha512-oYO/U4VD1DavwrKuCSQWdLG+5K22SLPem2OQaHmFcQuwHoVeGC+JGVRji2MUqZUAIQZHEonOeVfAX09hYiLsdg==" + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/cheerio": { "version": "0.22.21", "integrity": "sha512-aGI3DfswwqgKPiEOTaiHV2ZPC9KEhprpgEbJnv0fZl3SGX0cGgEva1126dGrMC6AJM6v/aihlUgJn9M5DbDZ/Q==", @@ -14969,6 +18374,23 @@ "version": "1.1.1", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, + "node_modules/@types/connect": { + "version": "3.4.35", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "node_modules/@types/d3": { "version": "3.5.38", "integrity": "sha512-O/gRkjWULp3xVX8K85V0H3tsSGole0WYt77KVpGZO2xTGLuVFuvE6JIsIli3fvFHCYBhGFn/8OHEEyMYF+QehA==" @@ -15075,6 +18497,27 @@ "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, + "node_modules/@types/express": { + "version": "4.17.13", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.30", + "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "node_modules/@types/fetch-mock": { "version": "7.3.5", "integrity": "sha512-sLecm9ohBdGIpYUP9rWk5/XIKY2xHMYTBJIcJuBBM8IJWnYoQ1DAj8F4OVjnfD0API1drlkWEV0LPNk+ACuhsg==" @@ -15111,8 +18554,8 @@ } }, "node_modules/@types/history": { - "version": "4.7.6", - "integrity": "sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w==", + "version": "4.7.11", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", "dev": true }, "node_modules/@types/hoist-non-react-statics": { @@ -15128,8 +18571,8 @@ "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" }, "node_modules/@types/http-proxy": { - "version": "1.17.7", - "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "version": "1.17.9", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dev": true, "dependencies": { "@types/node": "*" @@ -15183,9 +18626,8 @@ "dev": true }, "node_modules/@types/json-bigint": { - "version": "1.0.0", - "integrity": "sha512-WW+0cfH3ovFN6ROV+p/Xfw36dT6s16hbXBYIG49PYw6+j6e+AkpqYccctgxwyicBmC8CZDBnPhOH94shFhXgHQ==", - "dev": true + "version": "1.0.1", + "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==" }, "node_modules/@types/json-schema": { "version": "7.0.9", @@ -15197,8 +18639,8 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.149", - "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==" + "version": "4.14.182", + "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==" }, "node_modules/@types/lodash.get": { "version": "4.4.6", @@ -15207,6 +18649,13 @@ "@types/lodash": "*" } }, + "node_modules/@types/mapbox-gl": { + "version": "2.7.6", + "integrity": "sha512-EPIfNO7WApXaFM7DuJBj+kpXmqffqJHMJ3Q9gbV/nNL23XHR0PC5CCDYbAFa4tKErm0xJd9C5kPLF6KvA/cRcA==", + "dependencies": { + "@types/geojson": "*" + } + }, "node_modules/@types/math-expression-evaluator": { "version": "1.2.1", "integrity": "sha512-H6IG9R0jU16nR3N24UpL7X40aDcUl5eTncBSd/itwz6rWI4nNzMcNYreHj0MnKlHSga1Iq1AqjSuY67EhiN+Zw==" @@ -15218,6 +18667,11 @@ "@types/unist": "*" } }, + "node_modules/@types/mime": { + "version": "3.0.1", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, "node_modules/@types/minimatch": { "version": "3.0.5", "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" @@ -15236,8 +18690,8 @@ "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==" }, "node_modules/@types/node-fetch": { - "version": "2.6.1", - "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", + "version": "2.6.2", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", "dependencies": { "@types/node": "*", "form-data": "^3.0.0" @@ -15285,8 +18739,8 @@ "integrity": "sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==" }, "node_modules/@types/prop-types": { - "version": "15.7.4", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" + "version": "15.7.5", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/q": { "version": "1.5.2", @@ -15297,6 +18751,11 @@ "version": "6.9.7", "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, "node_modules/@types/react": { "version": "16.9.43", "integrity": "sha512-PxshAFcnJqIWYpJbLPriClH53Z2WlJcVZE+NP2etUtWQs2s7yIMj3/LDKZT/5CHJ/F62iyjVCDu2H3jHEXIxSg==", @@ -15347,9 +18806,8 @@ } }, "node_modules/@types/react-redux": { - "version": "7.1.10", - "integrity": "sha512-lmt2BPf0fFuYrXg1JM4udUd4sCmqnTlNUIxC7B6RIBTzmMuv/MxOfumGNUx1UyzVZieEZ2ttCQvFfh/3eUHvrQ==", - "dev": true, + "version": "7.1.25", + "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -15367,11 +18825,11 @@ } }, "node_modules/@types/react-router-dom": { - "version": "5.1.5", - "integrity": "sha512-ArBM4B1g3BWLGbaGvwBGO75GNFbLDUthrDojV2vHLih/Tq8M+tgvY1DSwkuNrPSwdp/GUL93WSEpTZs8nVyJLw==", + "version": "5.3.3", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "dev": true, "dependencies": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } @@ -15386,14 +18844,6 @@ "@types/react-transition-group": "*" } }, - "node_modules/@types/react-sticky": { - "version": "6.0.3", - "integrity": "sha512-tW0Y1hTr2Tao4yX58iKl0i7BaqrdObGXAzsyzd8VGVrWVEgbQuV6P6QKVd/kFC7FroXyelftiVNJ09pnfkcjww==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-syntax-highlighter": { "version": "11.0.5", "integrity": "sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==", @@ -15442,8 +18892,8 @@ } }, "node_modules/@types/react-window": { - "version": "1.8.2", - "integrity": "sha512-gP1xam68Wc4ZTAee++zx6pTdDAH08rAkQrWm4B4F/y6hhmlT9Mgx2q8lTCXnrPHXsr15XjRN9+K2DLKcz44qEQ==", + "version": "1.8.5", + "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", "dev": true, "dependencies": { "@types/react": "*" @@ -15476,10 +18926,6 @@ "redux": "^4.0.5" } }, - "node_modules/@types/resize-observer-browser": { - "version": "0.1.6", - "integrity": "sha512-61IfTac0s9jvNtBCpyo86QeaN8qqpMGHdK0uGKCCIy2dt5/Yk84VduHIdWAcmkC5QvdkPL0p5eWYgUZtHKKUVg==" - }, "node_modules/@types/retry": { "version": "0.12.1", "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", @@ -15493,6 +18939,23 @@ "version": "2.4.30", "integrity": "sha512-AnxLHewubLVzoF/A4qdxBGHCKifw8cY32iro3DQX9TPcetE95zBeVt3jnsvtvAUf1vwzMfwzp4t/L2yqPlnjkQ==" }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, "node_modules/@types/shortid": { "version": "0.0.29", "integrity": "sha512-9BCYD9btg2CY4kPcpMQ+vCR8U6V8f/KvixYD5ZbxoWlkhddNF5IeZMVL3p+QFUkg+Hb+kPAG9Jgk4bnnF1v/Fw==", @@ -15516,6 +18979,14 @@ "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", "dev": true }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/source-list-map": { "version": "0.1.2", "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" @@ -15577,8 +19048,8 @@ } }, "node_modules/@types/webpack-env": { - "version": "1.16.2", - "integrity": "sha512-vKx7WNQNZDyJveYcHAm9ZxhqSGLYwoyLhrHjLBOkw3a7cT76sTdjgtwyijhk1MaHyRIuSztcVwrUOO/NEu68Dw==" + "version": "1.18.0", + "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==" }, "node_modules/@types/webpack-sources": { "version": "0.1.5", @@ -15621,6 +19092,14 @@ "node": ">=0.10.0" } }, + "node_modules/@types/ws": { + "version": "8.5.3", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yargs": { "version": "15.0.13", "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", @@ -16143,6 +19622,19 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@visx/responsive": { + "version": "3.0.0", + "integrity": "sha512-immnxQwOWlrxbnlCIqJWuDpPfrM6tglgMTN1WsyXyGluLMJqhuuxqxllfXaRPkQFS4fcvs66KCEELdazh96U2w==", + "dependencies": { + "@types/lodash": "^4.14.172", + "@types/react": "*", + "lodash": "^4.17.21", + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, "node_modules/@vx/axis": { "version": "0.0.140", "integrity": "sha512-lxMgWySkSh7ew8XS25Kpn95HH4d8dpL2vLv1UvASJY2VxdczQayTUUvQLecesJI4bbJV2R7Fasm64EBlJAezTw==", @@ -16271,8 +19763,8 @@ "integrity": "sha512-x5y5eQJ0koZCGS0AK2juiJ2hLsZhgAOzQ2MuMushikEfQ1azLtrDIh4l2WesLQrp//o9+u2sWJ3mPgEGdBIvfA==" }, "node_modules/@vx/responsive": { - "version": "0.0.195", - "integrity": "sha512-3zjkjqg8V3Kr1moSI7EAzlW7MLR87p2CXc+qh0zZg/zLrc3C89JnxyMYFfS7jM4PlHr26n634YddQDVydwARBA==", + "version": "0.0.199", + "integrity": "sha512-ONrmLUAG+8wzD3cn/EmsuZh6JHeyejqup3ZsV25t04VaVJAVQAJukAfNdH8YiwSJu0zSo+txkBTfrnOmFyQLOw==", "dependencies": { "@types/lodash": "^4.14.146", "@types/react": "*", @@ -16655,6 +20147,44 @@ "version": "4.2.2", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.33", + "integrity": "sha512-az35wEPH00kW6eZDqHC0BumzAB4XD+YJb1b5tHEfsy73viCN7uGy8kvutwig5bgVwt1Hx7GuU09G50Sc5osBlA==", + "dev": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/tslib": { + "version": "2.4.1", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.6", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/abab": { "version": "2.0.6", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", @@ -16680,11 +20210,11 @@ "integrity": "sha512-9jN7+BijYKWO8fxfcG7QZh7js6V+g3OjkxMRHfKWNjjs85048VY4cd27Uoe6yk55P66L/z7Dflu5+YEApgMzkA==" }, "node_modules/accepts": { - "version": "1.3.5", - "integrity": "sha512-pt4oTticGUEOZCvli0I7ekmpXopaX+Xvb/TQRaTKnvZNIH9Srs0VWi2NGBfsRscAgwtIEtxW5JOB9sI0oN3cjw==", + "version": "1.3.8", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -16695,8 +20225,8 @@ "integrity": "sha512-NBOQlm9+7RBqRqZwimpgquaLeTJFayqb9UEPtTkpC3TkkwDnlsT/TwsCC0svjt9kEZ6G9mH5AEOHSz6Q/HrzQQ==" }, "node_modules/acorn": { - "version": "8.7.0", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.7.1", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "bin": { "acorn": "bin/acorn" }, @@ -16762,7 +20292,6 @@ }, "node_modules/ag-charts-community": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ag-charts-community/-/ag-charts-community-4.2.0.tgz", "integrity": "sha512-9vZSwlcpGwkb6KwEzTgxw5BuzdZgRhrbbiQS5wIfSa74cNsyYt76MTBPudqfHnc+SoWDGGxof3rteU6kXSc07w==", "dev": true }, @@ -16799,8 +20328,8 @@ "dev": true }, "node_modules/agentkeepalive": { - "version": "4.2.0", - "integrity": "sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==", + "version": "4.2.1", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", "dev": true, "dependencies": { "debug": "^4.1.0", @@ -16867,30 +20396,27 @@ } }, "node_modules/airbnb-prop-types": { - "version": "2.15.0", - "integrity": "sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==", + "version": "2.16.0", + "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==", "dev": true, "dependencies": { - "array.prototype.find": "^2.1.0", - "function.prototype.name": "^1.1.1", - "has": "^1.0.3", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", + "array.prototype.find": "^2.1.1", + "function.prototype.name": "^1.1.2", + "is-regex": "^1.1.0", + "object-is": "^1.1.2", "object.assign": "^4.1.0", - "object.entries": "^1.1.0", + "object.entries": "^1.1.2", "prop-types": "^15.7.2", "prop-types-exact": "^1.2.0", - "react-is": "^16.9.0" + "react-is": "^16.13.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" }, "peerDependencies": { "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha" } }, - "node_modules/airbnb-prop-types/node_modules/react-is": { - "version": "16.9.0", - "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", - "dev": true - }, "node_modules/ajv": { "version": "6.12.6", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", @@ -17013,7 +20539,7 @@ "node_modules/ansi-escapes": { "version": "4.3.1", "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "devOptional": true, + "dev": true, "dependencies": { "type-fest": "^0.11.0" }, @@ -17027,7 +20553,7 @@ "node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.11.0", "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" }, @@ -17099,54 +20625,49 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/ansicolors": { - "version": "0.2.1", - "integrity": "sha512-tOIuy1/SK/dr94ZA0ckDohKXNeBNqZ4us6PjMVLs5h1w2GBB6uPtOknp2+VF4F/zcy9LI70W+Z+pE2Soajky1w==" - }, "node_modules/antd": { - "version": "4.9.4", - "integrity": "sha512-kieGi1Isb/ddnn9E/AJVFCUgSZIqDv6HtFg7r5WWI0s6zf+nfCOtpes0oX8TdHO6mE/dL39pJG52aHNe8MwkJg==", + "version": "4.10.3", + "integrity": "sha512-J/IZvW15MwTmUxK/AWFkSU51T1Hyn4e0GchJWlIe7+FrPpLoTgLf9/Cx3mgxiooHfE9OfvnYvvRli1VxHH6H0Q==", "dependencies": { "@ant-design/colors": "^5.0.0", "@ant-design/icons": "^4.3.0", - "@ant-design/react-slick": "~0.27.0", + "@ant-design/react-slick": "~0.28.1", "@babel/runtime": "^7.11.2", "array-tree-filter": "^2.1.0", "classnames": "^2.2.6", "copy-to-clipboard": "^3.2.0", "lodash": "^4.17.20", "moment": "^2.25.3", - "omit.js": "^2.0.2", "rc-cascader": "~1.4.0", "rc-checkbox": "~2.3.0", "rc-collapse": "~3.1.0", - "rc-dialog": "~8.4.0", - "rc-drawer": "~4.1.0", + "rc-dialog": "~8.5.1", + "rc-drawer": "~4.2.0", "rc-dropdown": "~3.2.0", - "rc-field-form": "~1.17.0", - "rc-image": "~4.2.0", + "rc-field-form": "~1.17.3", + "rc-image": "~5.0.2", "rc-input-number": "~6.1.0", "rc-mentions": "~1.5.0", "rc-menu": "~8.10.0", "rc-motion": "^2.4.0", "rc-notification": "~4.5.2", "rc-pagination": "~3.1.2", - "rc-picker": "~2.4.1", + "rc-picker": "~2.5.1", "rc-progress": "~3.1.0", "rc-rate": "~2.9.0", - "rc-resize-observer": "^0.2.3", - "rc-select": "~11.5.3", - "rc-slider": "~9.6.1", + "rc-resize-observer": "^1.0.0", + "rc-select": "~12.1.0", + "rc-slider": "~9.7.1", "rc-steps": "~4.1.0", "rc-switch": "~3.2.0", - "rc-table": "~7.11.0", + "rc-table": "~7.12.0", "rc-tabs": "~11.7.0", "rc-textarea": "~0.3.0", "rc-tooltip": "~5.0.0", - "rc-tree": "~4.0.0", - "rc-tree-select": "~4.2.0", - "rc-upload": "~3.3.1", - "rc-util": "^5.1.0", + "rc-tree": "~4.1.0", + "rc-tree-select": "~4.3.0", + "rc-upload": "~3.3.4", + "rc-util": "^5.7.0", "scroll-into-view-if-needed": "^2.2.25", "warning": "^4.0.3" }, @@ -17166,39 +20687,244 @@ "@ctrl/tinycolor": "^3.3.1" } }, - "node_modules/antd/node_modules/@ant-design/icons": { - "version": "4.3.0", - "integrity": "sha512-UoIbw4oz/L/msbkgqs2nls2KP7XNKScOxVR54wRrWwnXOzJaGNwwSdYjHQz+5ETf8C53YPpzMOnRX99LFCdeIQ==", + "node_modules/antd/node_modules/@ant-design/react-slick": { + "version": "0.28.4", + "integrity": "sha512-j9eAHTn7GxbXUFNknJoHS2ceAsqrQi2j8XykjZE1IXCD8kJF+t28EvhBLniDpbOsBk/3kjalnhriTfZcjBHNqg==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "lodash": "^4.17.21", + "resize-observer-polyfill": "^1.5.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/antd/node_modules/rc-dialog": { + "version": "8.5.3", + "integrity": "sha512-zoamT8L6+rBwnwjPlrZRxiHCHQXrTcWZD3a6ruoqEdUKP1KgO0eSjMDH9WlF3WEPYMVnb2G5SrjHrhnwgPDu5w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.6.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/antd/node_modules/rc-drawer": { + "version": "4.2.2", + "integrity": "sha512-zw48FATkAmJrEnfeRWiMqvKAzqGzUDLN1UXlluB7q7GgbR6mJFvc+QsmNrgxsFuMz86Lh9mKSIi7rXlPINmuzw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.7.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/antd/node_modules/rc-image": { + "version": "5.0.2", + "integrity": "sha512-bNCOGxo9ICe2S+MuVQtxVjk2esL0QJX4YcUB10S98z8CWO1sswySH6inH69YU778aCXs8/nKhtZMUmiU1To0bQ==", "dependencies": { - "@ant-design/colors": "^5.0.0", - "@ant-design/icons-svg": "^4.0.0", "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", - "insert-css": "^2.0.0", - "rc-util": "^5.0.1" + "rc-dialog": "~8.5.1", + "rc-util": "^5.0.6" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/antd/node_modules/rc-picker": { + "version": "2.5.19", + "integrity": "sha512-u6myoCu/qiQ0vLbNzSzNrzTQhs7mldArCpPHrEI6OUiifs+IPXmbesqSm0zilJjfzrZJLgYeyyOMSznSlh0GKA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "date-fns": "2.x", + "dayjs": "1.x", + "moment": "^2.24.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.4.0", + "shallowequal": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=8.x" }, "peerDependencies": { - "react": ">=16.0.0" + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/antd/node_modules/rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", + "node_modules/antd/node_modules/rc-resize-observer": { + "version": "1.2.0", + "integrity": "sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==", "dependencies": { - "react-is": "^16.12.0", + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.15.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/antd/node_modules/rc-select": { + "version": "12.1.13", + "integrity": "sha512-cPI+aesP6dgCAaey4t4upDbEukJe+XN0DK6oO/6flcCX5o28o7KNZD7JAiVtC/6fCwqwI/kSs7S/43dvHmBl+A==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.9.8", + "rc-virtual-list": "^3.2.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/antd/node_modules/rc-select/node_modules/rc-overflow": { + "version": "1.2.8", + "integrity": "sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.19.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/antd/node_modules/rc-select/node_modules/rc-virtual-list": { + "version": "3.4.11", + "integrity": "sha512-BvUUH60kkeTBPigN5F89HtGaA5jSP4y2aM6cJ4dk9Y42I9yY+h6i08wF6UKeDcxdfOU8j3I5HxkSS/xA77J3wA==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.15.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/antd/node_modules/rc-slider": { + "version": "9.7.5", + "integrity": "sha512-LV/MWcXFjco1epPbdw1JlLXlTgmWpB9/Y/P2yinf8Pg3wElHxA9uajN21lJiWtZjf5SCUekfSP6QMJfDo4t1hg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-tooltip": "^5.0.1", + "rc-util": "^5.16.1", "shallowequal": "^1.1.0" }, + "engines": { + "node": ">=8.x" + }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, - "node_modules/antd/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "node_modules/antd/node_modules/rc-table": { + "version": "7.12.5", + "integrity": "sha512-XV4m5h0W+NjGkNzvp5ahOhYHyNG8oPNV9pTLre2EsfmyStXUJBICyfkNID7WZulMdCehv/Wa3MdqXwZ4EsJchw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.4.0", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/antd/node_modules/rc-tooltip": { + "version": "5.0.2", + "integrity": "sha512-A4FejSG56PzYtSNUU4H1pVzfhtkV/+qMT2clK0CsSj+9mbc4USEtpWeX6A/jjVL+goBOMKj8qlH7BCZmZWh/Nw==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "rc-trigger": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/antd/node_modules/rc-tree": { + "version": "4.1.5", + "integrity": "sha512-q2vjcmnBDylGZ9/ZW4F9oZMKMJdbFWC7um+DAQhZG1nqyg1iwoowbBggUDUaUOEryJP+08bpliEAYnzJXbI5xQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.0.0", + "rc-virtual-list": "^3.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/antd/node_modules/rc-tree-select": { + "version": "4.3.3", + "integrity": "sha512-0tilOHLJA6p+TNg4kD559XnDX3PTEYuoSF7m7ryzFLAYvdEEPtjn0QZc5z6L0sMKBiBlj8a2kf0auw8XyHU3lA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "^12.0.0", + "rc-tree": "^4.0.0", + "rc-util": "^5.0.5" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/antd/node_modules/rc-tree/node_modules/rc-virtual-list": { + "version": "3.4.11", + "integrity": "sha512-BvUUH60kkeTBPigN5F89HtGaA5jSP4y2aM6cJ4dk9Y42I9yY+h6i08wF6UKeDcxdfOU8j3I5HxkSS/xA77J3wA==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.15.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } }, "node_modules/any-observable": { "version": "0.3.0", @@ -17262,12 +20988,28 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "node_modules/are-we-there-yet": { - "version": "1.1.7", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "version": "3.0.1", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "dev": true, "dependencies": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.0", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/argparse": { @@ -17320,6 +21062,7 @@ "node_modules/array-differ": { "version": "3.0.0", "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, "engines": { "node": ">=8" } @@ -17329,11 +21072,6 @@ "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", "dev": true }, - "node_modules/array-filter": { - "version": "1.0.0", - "integrity": "sha512-Ene1hbrinPZ1qPoZp7NSx4jQnh4nr7MtY78pHNb+yr8yHbxmTS7ChGW0a55JKA7TkRDeoQxK4GcJaCvBYplSKA==", - "dev": true - }, "node_modules/array-flatten": { "version": "2.1.2", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" @@ -17395,25 +21133,52 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.filter": { + "version": "1.0.2", + "integrity": "sha512-us+UrmGOilqttSOgoWZTpOvHu68vZT2YCjc/H4vhu56vzZpaDFBhB+Se2UwqWzMKbDv7Myq5M5pcZLAtUvTQdQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.find": { - "version": "2.1.0", - "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", + "version": "2.2.1", + "integrity": "sha512-I2ri5Z9uMpMvnsNrHre9l3PaX+z9D0/z6F7Yt2u15q7wt0I62g5kX6xUKR1SJiefgG+u2/gJUmM8B47XRvQR6w==", "dev": true, "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.13.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flat": { - "version": "1.2.1", - "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", + "version": "1.3.1", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dependencies": { - "define-properties": "^1.1.2", - "es-abstract": "^1.10.0", - "function-bind": "^1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flatmap": { @@ -17543,6 +21308,11 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "3.2.4", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, "node_modules/async-each": { "version": "1.0.3", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", @@ -17628,6 +21398,16 @@ "node": ">=0.10.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aws-sign2": { "version": "0.7.0", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", @@ -17652,7 +21432,7 @@ "node_modules/axios": { "version": "0.21.4", "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "devOptional": true, + "dev": true, "dependencies": { "follow-redirects": "^1.14.0" } @@ -17735,8 +21515,8 @@ } }, "node_modules/babel-loader/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -17745,8 +21525,8 @@ } }, "node_modules/babel-loader/node_modules/loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -18009,11 +21789,11 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.2.2", - "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "version": "0.3.2", + "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.2", + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.2", "semver": "^6.1.1" }, "peerDependencies": { @@ -18021,13 +21801,11 @@ } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "version": "0.3.2", + "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -18038,8 +21816,8 @@ } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -18075,23 +21853,21 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.2.2", - "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "version": "0.4.0", + "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.2" + "@babel/helper-define-polyfill-provider": "^0.3.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "version": "0.3.2", + "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -18102,8 +21878,8 @@ } }, "node_modules/babel-plugin-polyfill-regenerator/node_modules/debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -18362,8 +22138,7 @@ }, "node_modules/before-after-hook": { "version": "2.2.2", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", - "dev": true + "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==" }, "node_modules/better-opn": { "version": "2.1.1", @@ -18470,79 +22245,82 @@ "version": "3.7.2", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, + "node_modules/bmpimagejs": { + "version": "1.0.4", + "integrity": "sha512-21oKU7kbRt2OgOOj7rdiNr/yznDNUQ585plxR00rsmECcZr+6O1oCwB8OIoSHk/bDhbG8mFXIdeQuCPHgZ6QBw==", + "dev": true + }, "node_modules/bn.js": { "version": "5.2.0", "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" }, "node_modules/body-parser": { - "version": "1.19.0", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.2", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "dependencies": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" }, "engines": { "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.0", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/http-errors": { - "version": "1.7.2", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" } }, + "node_modules/body-parser/node_modules/inherits": { + "version": "2.0.4", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, "node_modules/body-parser/node_modules/qs": { - "version": "6.7.0", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.7", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/body-parser/node_modules/setprototypeof": { - "version": "1.1.1", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "node_modules/body-parser/node_modules/statuses": { - "version": "1.5.0", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } + "version": "1.2.0", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/bonjour": { - "version": "3.5.0", - "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "node_modules/bonjour-service": { + "version": "1.0.14", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "dev": true, "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, "node_modules/boolbase": { @@ -18818,24 +22596,29 @@ } }, "node_modules/browserslist": { - "version": "4.17.0", - "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", + "version": "4.21.3", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001254", - "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.830", - "escalade": "^3.1.1", - "node-releases": "^1.1.75" + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/bser": { @@ -18874,11 +22657,6 @@ "version": "1.1.1", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, "node_modules/buffer-xor": { "version": "1.0.3", "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" @@ -18892,14 +22670,6 @@ "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", "dev": true }, - "node_modules/byline": { - "version": "5.0.0", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/byte-size": { "version": "7.0.1", "integrity": "sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A==", @@ -19233,12 +23003,18 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001312", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "version": "1.0.30001378", + "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/capture-exit": { "version": "2.0.0", @@ -19251,24 +23027,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/capture-stack-trace": { - "version": "1.0.1", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cardinal": { - "version": "0.4.4", - "integrity": "sha512-3MxV0o9wOpQcobrcSrRpaSxlYkohCcZu0ytOjJUww/Yo/223q4Ecloo7odT+M0SI5kPgb1JhvSaF4EEuVXOLAQ==", - "dependencies": { - "ansicolors": "~0.2.1", - "redeyed": "~0.4.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, "node_modules/cartocolor": { "version": "4.0.2", "integrity": "sha512-+Gh9mb6lFxsDOLQlBLPxAHCnWXlg2W8q3AcVwqRcy95TdBbcOU89Wrb6h2Hd/6Ww1Kc1pzXmUdpnWD+xeCG0dg==", @@ -19337,7 +23095,7 @@ "node_modules/chardet": { "version": "0.7.0", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "devOptional": true + "dev": true }, "node_modules/charenc": { "version": "0.0.2", @@ -19372,8 +23130,14 @@ } }, "node_modules/chokidar": { - "version": "3.5.2", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -19477,367 +23241,19 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/chromatic": { - "version": "5.10.2", - "integrity": "sha512-JHFtZ16VanQX0X9qjacIJOrH9rVUJACilPs8dBwwQgJTZzgCZAdwgmE+WwLcxe/LuK7vM56BDTHbxC+XcnTsjw==", - "dev": true, - "dependencies": { - "@actions/core": "^1.5.0", - "@actions/github": "^5.0.0", - "@babel/preset-typescript": "^7.15.0", - "@babel/runtime": "^7.15.3", - "@chromaui/localtunnel": "^2.0.3", - "async-retry": "^1.3.3", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "dotenv": "^8.2.0", - "env-ci": "^5.0.2", - "esm": "^3.2.25", - "execa": "^5.0.0", - "fake-tag": "^2.0.0", - "fs-extra": "^10.0.0", - "https-proxy-agent": "^5.0.0", - "jsonfile": "^6.0.1", - "junit-report-builder": "2.1.0", - "listr": "0.14.3", - "meow": "^8.0.0", - "no-proxy": "^1.0.3", - "node-ask": "^1.0.1", - "node-fetch": "2.6.0", - "node-loggly-bulk": "^2.2.4", - "p-limit": "3.1.0", - "picomatch": "2.2.2", - "pkg-up": "^3.1.0", - "pluralize": "^8.0.0", - "progress-stream": "^2.0.0", - "semver": "^7.3.5", - "slash": "^3.0.0", - "string-argv": "^0.3.1", - "strip-ansi": "6.0.0", - "tmp-promise": "3.0.2", - "tree-kill": "^1.2.2", - "ts-dedent": "^1.0.0", - "util-deprecate": "^1.0.2", - "uuid": "^8.3.2", - "yarn-or-npm": "^3.0.1" - }, - "bin": { - "chroma": "bin/register.js", - "chromatic": "bin/register.js", - "chromatic-cli": "bin/register.js" - } - }, - "node_modules/chromatic/node_modules/ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/chromatic/node_modules/cross-spawn": { - "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/chromatic/node_modules/debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/chromatic/node_modules/execa": { - "version": "5.1.1", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/chromatic/node_modules/find-up": { - "version": "3.0.0", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/chromatic/node_modules/get-stream": { - "version": "6.0.1", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chromatic/node_modules/human-signals": { - "version": "2.1.0", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/chromatic/node_modules/is-stream": { - "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chromatic/node_modules/locate-path": { - "version": "3.0.0", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/chromatic/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/chromatic/node_modules/ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/chromatic/node_modules/node-fetch": { - "version": "2.6.0", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/chromatic/node_modules/npm-run-path": { - "version": "4.0.1", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chromatic/node_modules/p-limit": { - "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chromatic/node_modules/p-locate": { - "version": "3.0.0", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/chromatic/node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chromatic/node_modules/p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chromatic/node_modules/path-key": { - "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/chromatic/node_modules/picomatch": { - "version": "2.2.2", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/chromatic/node_modules/pkg-up": { - "version": "3.1.0", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "version": "6.7.4", + "integrity": "sha512-QW4i8RQsON0JVnFnRf+8y70aIJptvC0Oi/26YJ669Dl03WmJRpobNO5qWFPTiv3KFKMc1Qf6/qFsRVZCtn+bfA==", "dev": true, "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chromatic/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" + "@discoveryjs/json-ext": "^0.5.7", + "@types/webpack-env": "^1.17.0" }, "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/chromatic/node_modules/shebang-command": { - "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chromatic/node_modules/shebang-regex": { - "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" + "chroma": "bin/main.cjs", + "chromatic": "bin/main.cjs", + "chromatic-cli": "bin/main.cjs" } }, - "node_modules/chromatic/node_modules/slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/chromatic/node_modules/strip-ansi": { - "version": "6.0.0", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chromatic/node_modules/ts-dedent": { - "version": "1.2.0", - "integrity": "sha512-6zSJp23uQI+Txyz5LlXMXAHpUhY4Hi0oluXny0OgIR7g/Cromq4vDBnhtbBdyIV34g0pgwxUvnvg+jLJe4c1NA==", - "dev": true, - "engines": { - "node": ">=6.10" - } - }, - "node_modules/chromatic/node_modules/uuid": { - "version": "8.3.2", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/chromatic/node_modules/which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/chromatic/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/chrome-trace-event": { "version": "1.0.2", "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", @@ -19902,8 +23318,8 @@ } }, "node_modules/classnames": { - "version": "2.2.6", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + "version": "2.3.2", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "node_modules/clean-css": { "version": "4.2.3", @@ -19942,7 +23358,7 @@ "node_modules/cli-cursor": { "version": "3.1.0", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "devOptional": true, + "dev": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -19961,38 +23377,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-table": { - "version": "0.3.9", - "integrity": "sha512-7eA6hFtAZwVx3dWAGoaBqTrzWko5jRUFKpHT64ZHkJpaA3y5wf5NlLjguqTRmqycatJZiwftODYYyGNLbQ7MuA==", - "dependencies": { - "colors": "1.0.3", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/cli-table/node_modules/ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table/node_modules/colors": { - "version": "1.0.3", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/cli-table/node_modules/strip-ansi": { - "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cli-table3": { "version": "0.6.1", "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", @@ -20045,7 +23429,7 @@ "node_modules/cli-width": { "version": "3.0.0", "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "devOptional": true, + "dev": true, "engines": { "node": ">= 10" } @@ -20095,20 +23479,6 @@ "node": ">=8" } }, - "node_modules/clone": { - "version": "2.1.2", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-buffer": { - "version": "1.0.0", - "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/clone-deep": { "version": "4.0.1", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", @@ -20128,33 +23498,10 @@ "node": ">=0.10.0" } }, - "node_modules/clone-stats": { - "version": "1.0.0", - "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==" - }, - "node_modules/cloneable-readable": { - "version": "1.1.3", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dependencies": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "node_modules/cmd-shim": { - "version": "4.1.0", - "integrity": "sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw==", - "dev": true, - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/co": { "version": "4.6.0", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -20239,6 +23586,14 @@ "node": ">=0.10.0" } }, + "node_modules/color": { + "version": "3.2.1", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, "node_modules/color-convert": { "version": "1.9.3", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", @@ -20250,6 +23605,14 @@ "version": "1.1.3", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "node_modules/color-string": { + "version": "1.9.1", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/color-support": { "version": "1.1.3", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", @@ -20268,7 +23631,8 @@ }, "node_modules/colorette": { "version": "1.4.0", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true }, "node_modules/colors": { "version": "1.4.0", @@ -20279,12 +23643,34 @@ } }, "node_modules/columnify": { - "version": "1.5.4", - "integrity": "sha512-rFl+iXVT1nhLQPfGDw+3WcS8rmm7XsLKUmhsGE3ihzzpIikeGrTaZPIRKYWeLsLBypsHzjXIvYEltVUZS84XxQ==", + "version": "1.6.0", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", "dev": true, "dependencies": { - "strip-ansi": "^3.0.0", + "strip-ansi": "^6.0.1", "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/columnify/node_modules/ansi-regex": { + "version": "5.0.1", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/columnify/node_modules/strip-ansi": { + "version": "6.0.1", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/combined-stream": { @@ -20380,6 +23766,11 @@ "version": "2.20.3", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true + }, "node_modules/common-path-prefix": { "version": "3.0.0", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" @@ -20473,8 +23864,8 @@ "dev": true }, "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "version": "2.0.0", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, "engines": { "node": ">=0.8" @@ -20493,15 +23884,33 @@ "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" }, "node_modules/content-disposition": { - "version": "0.5.3", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/content-type": { "version": "1.0.4", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", @@ -20644,8 +24053,8 @@ } }, "node_modules/conventional-changelog-core/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -20721,17 +24130,6 @@ "semver": "bin/semver.js" } }, - "node_modules/conventional-changelog-writer/node_modules/split": { - "version": "1.0.1", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, "node_modules/conventional-changelog-writer/node_modules/through2": { "version": "4.0.2", "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", @@ -20850,6 +24248,7 @@ "node_modules/cookie": { "version": "0.4.0", "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -20972,9 +24371,8 @@ } }, "node_modules/core-js": { - "version": "3.18.1", - "integrity": "sha512-vJlUi/7YdlCZeL6fXvWNaLUPh/id12WXj3MbkMw5uOyF0PfWPBNOCNbs53YqgrvtujLNlt9JQpruyIKkUZ+PKA==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "version": "3.24.1", + "integrity": "sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -20982,10 +24380,10 @@ } }, "node_modules/core-js-compat": { - "version": "3.18.1", - "integrity": "sha512-XJMYx58zo4W0kLPmIingVZA10+7TuKrMLPt83+EzDmxFJQUMcTVVmQ+n5JP4r6Z14qSzhQBRi3NSWoeVyKKXUg==", + "version": "3.24.1", + "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", "dependencies": { - "browserslist": "^4.17.1", + "browserslist": "^4.21.3", "semver": "7.0.0" }, "funding": { @@ -20993,35 +24391,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/browserslist": { - "version": "4.17.1", - "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", - "dependencies": { - "caniuse-lite": "^1.0.30001259", - "electron-to-chromium": "^1.3.846", - "escalade": "^3.1.1", - "nanocolors": "^0.1.5", - "node-releases": "^1.1.76" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/core-js-compat/node_modules/electron-to-chromium": { - "version": "1.3.853", - "integrity": "sha512-W4U8n+U8I5/SUaFcqZgbKRmYZwcyEIQVBDf+j5QQK6xChjXnQD+wj248eGR9X4u+dDmDR//8vIfbu4PrdBBIoQ==" - }, - "node_modules/core-js-compat/node_modules/node-releases": { - "version": "1.1.76", - "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==" - }, "node_modules/core-js-compat/node_modules/semver": { "version": "7.0.0", "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", @@ -21259,14 +24628,24 @@ "version": "4.12.0", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/create-error-class": { - "version": "3.0.2", - "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "node_modules/create-emotion": { + "version": "10.0.27", + "integrity": "sha512-fIK73w82HPPn/RsAij7+Zt8eCE8SptcJ3WoRMfxMtjteYxud8GDTKKld7MYwAX2TVhrw29uR1N/bVGxeStHILg==", "dependencies": { - "capture-stack-trace": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@emotion/cache": "^10.0.27", + "@emotion/serialize": "^0.11.15", + "@emotion/sheet": "0.9.4", + "@emotion/utils": "0.11.3" + } + }, + "node_modules/create-emotion/node_modules/@emotion/cache": { + "version": "10.0.29", + "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", + "dependencies": { + "@emotion/sheet": "0.9.4", + "@emotion/stylis": "0.8.5", + "@emotion/utils": "0.11.3", + "@emotion/weak-memoize": "0.2.5" } }, "node_modules/create-hash": { @@ -21311,6 +24690,7 @@ "node_modules/cross-spawn": { "version": "6.0.5", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -21512,8 +24892,8 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/css-what": { - "version": "5.0.1", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "version": "5.1.0", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "dev": true, "engines": { "node": ">= 6" @@ -22186,8 +25566,8 @@ } }, "node_modules/css-what": { - "version": "2.1.2", - "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", + "version": "2.1.3", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", "dev": true, "engines": { "node": "*" @@ -22282,8 +25662,8 @@ } }, "node_modules/cssom": { - "version": "0.4.4", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "version": "0.5.0", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", "dev": true }, "node_modules/cssstyle": { @@ -22306,6 +25686,10 @@ "version": "2.6.9", "integrity": "sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q==" }, + "node_modules/currencyformatter.js": { + "version": "2.2.0", + "integrity": "sha512-kfMfQBOsK9vnzqUT7pQY+I6ZTM7VWkICwiFUOLPLpOzR5Ir+AUoa1kO7I1clsiHXYe1FPyX91BRWBgHOUEH/NQ==" + }, "node_modules/cyclist": { "version": "1.0.1", "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==" @@ -22525,7 +25909,6 @@ "node_modules/dargs": { "version": "7.0.0", "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, "engines": { "node": ">=8" } @@ -22541,49 +25924,64 @@ "node": ">=0.10" } }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/data-urls": { - "version": "2.0.0", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "version": "3.0.2", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", "dev": true, "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/data-urls/node_modules/tr46": { - "version": "2.0.2", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "3.0.0", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, "dependencies": { "punycode": "^2.1.1" }, "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "6.1.0", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "version": "7.0.0", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "engines": { - "node": ">=10.4" + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" } }, "node_modules/data-urls/node_modules/whatwg-url": { - "version": "8.4.0", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "11.0.0", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/datamaps": { @@ -22611,8 +26009,8 @@ } }, "node_modules/date-fns": { - "version": "2.16.1", - "integrity": "sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==", + "version": "2.29.3", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", "engines": { "node": ">=0.11" }, @@ -22630,6 +26028,7 @@ "node_modules/dateformat": { "version": "3.0.3", "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, "engines": { "node": "*" } @@ -22722,8 +26121,8 @@ } }, "node_modules/decode-uri-component": { - "version": "0.2.0", - "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "version": "0.2.2", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "engines": { "node": ">=0.10" } @@ -22732,22 +26131,6 @@ "version": "0.7.0", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, - "node_modules/deep-equal": { - "version": "1.1.1", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-equal-ident": { "version": "1.1.1", "integrity": "sha512-aWv7VhTl/Lju1zenOD3E1w8PpUVrTDbwXCHtbSNr+p/uadr49Y1P1ld0W3Pl6gbvIbiRjoCVsqw70UupCNGh6g==", @@ -22940,13 +26323,17 @@ } }, "node_modules/define-properties": { - "version": "1.1.3", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dependencies": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-property": { @@ -22999,6 +26386,48 @@ "node": ">=0.10.0" } }, + "node_modules/degenerator": { + "version": "3.0.2", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/degenerator/node_modules/ast-types": { + "version": "0.13.4", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/degenerator/node_modules/esprima": { + "version": "4.0.1", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/degenerator/node_modules/tslib": { + "version": "2.4.1", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, "node_modules/delayed-stream": { "version": "1.0.0", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", @@ -23019,8 +26448,7 @@ }, "node_modules/deprecation": { "version": "2.3.1", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" }, "node_modules/dequal": { "version": "2.0.3", @@ -23104,6 +26532,7 @@ "node_modules/diff": { "version": "4.0.2", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, "engines": { "node": ">=0.3.1" } @@ -23177,20 +26606,14 @@ "dev": true }, "node_modules/dns-packet": { - "version": "1.3.4", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "version": "5.4.0", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", "dev": true, "dependencies": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" } }, "node_modules/doctrine": { @@ -23262,22 +26685,22 @@ "dev": true }, "node_modules/domexception": { - "version": "2.0.1", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "version": "4.0.0", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", "dev": true, "dependencies": { - "webidl-conversions": "^5.0.0" + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "version": "7.0.0", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/domhandler": { @@ -23338,19 +26761,6 @@ "version": "5.1.0", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, - "node_modules/download-stats": { - "version": "0.3.4", - "integrity": "sha512-ic2BigbyUWx7/CBbsfGjf71zUNZB4edBGC3oRliSzsoNmvyVx3Ycfp1w3vp2Y78Ee0eIIkjIEO5KzW0zThDGaA==", - "optional": true, - "dependencies": { - "JSONStream": "^1.2.1", - "lazy-cache": "^2.0.1", - "moment": "^2.15.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/downshift": { "version": "6.1.7", "integrity": "sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg==", @@ -23389,10 +26799,6 @@ "readable-stream": "^2.0.2" } }, - "node_modules/duplexer3": { - "version": "0.1.4", - "integrity": "sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==" - }, "node_modules/duplexify": { "version": "3.7.1", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", @@ -23405,7 +26811,6 @@ }, "node_modules/earcut": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" }, "node_modules/ecc-jsbn": { @@ -23418,38 +26823,17 @@ } }, "node_modules/echarts": { - "version": "5.3.2", - "integrity": "sha512-LWCt7ohOKdJqyiBJ0OGBmE9szLdfA9sGcsMEi+GGoc6+Xo75C+BkcT/6NNGRHAWtnQl2fNow05AQjznpap28TQ==", + "version": "5.4.1", + "integrity": "sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==", "dependencies": { "tslib": "2.3.0", - "zrender": "5.3.1" + "zrender": "5.4.1" } }, "node_modules/echarts/node_modules/tslib": { "version": "2.3.0", "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, - "node_modules/editions": { - "version": "2.3.1", - "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", - "dependencies": { - "errlop": "^2.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/editions/node_modules/semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/editorconfig": { "version": "0.15.3", "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", @@ -23480,10 +26864,11 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { - "version": "3.1.6", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.8", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "dev": true, "dependencies": { - "jake": "^10.6.1" + "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" @@ -23493,8 +26878,8 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.3.836", - "integrity": "sha512-Ney3pHOJBWkG/AqYjrW0hr2AUCsao+2uvq9HUlRP8OlpSdk/zOHOUJP7eu0icDvePC9DlgffuelP4TnOJmMRUg==" + "version": "1.4.224", + "integrity": "sha512-dOujC5Yzj0nOVE23iD5HKqrRSDj2SD7RazpZS/b/WX85MtO6/LzKDF4TlYZTBteB+7fvSg5JpWh0sN7fImNF8w==" }, "node_modules/elegant-spinner": { "version": "1.0.1", @@ -23558,6 +26943,14 @@ "node": ">= 4" } }, + "node_modules/emotion": { + "version": "10.0.27", + "integrity": "sha512-2xdDzdWWzue8R8lu4G76uWX5WhyQuzATon9LmNeCy/2BHVC6dsEpfhN1a0qhELgtDVdjyEA6J8Y/VlI5ZnaH0g==", + "dependencies": { + "babel-plugin-emotion": "^10.0.27", + "create-emotion": "^10.0.27" + } + }, "node_modules/emotion-rgba": { "version": "0.0.9", "integrity": "sha512-fSt51Lh4a1fppXY3nQrMUC00p1jIYMSaRRkUhPiOJ3s9oumae1tY41AJytRK9d4YmJDP9njJBndgdDn9j7CbsA==" @@ -23637,10 +27030,20 @@ } }, "node_modules/encoding": { - "version": "0.1.12", - "integrity": "sha512-bl1LAgiQc4ZWr++pNYUdRe/alecaHFeHxIJ/pNciqGdKXghaTCOwKkbKp6ye7pKZGu/GcaSXFk8PBVhgs+dJdA==", + "version": "0.1.13", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dependencies": { - "iconv-lite": "~0.4.13" + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/end-of-stream": { @@ -23707,8 +27110,8 @@ "dev": true }, "node_modules/env-ci": { - "version": "5.4.1", - "integrity": "sha512-xyuCtyFZLpnW5aH0JstETKTSMwHHQX4m42juzEZzvbUCJX7RiPVlhASKM0f/cJ4vvI/+txMkZ7F5To6dCdPYhg==", + "version": "5.5.0", + "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", "dev": true, "dependencies": { "execa": "^5.0.0", @@ -23856,77 +27259,76 @@ } }, "node_modules/enzyme": { - "version": "3.10.0", - "integrity": "sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg==", + "version": "3.11.0", + "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", "dev": true, "dependencies": { - "array.prototype.flat": "^1.2.1", - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.1.0", + "array.prototype.flat": "^1.2.3", + "cheerio": "^1.0.0-rc.3", + "enzyme-shallow-equal": "^1.0.1", + "function.prototype.name": "^1.1.2", "has": "^1.0.3", - "html-element-map": "^1.0.0", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.4", - "is-number-object": "^1.0.3", - "is-regex": "^1.0.4", - "is-string": "^1.0.4", + "html-element-map": "^1.2.0", + "is-boolean-object": "^1.0.1", + "is-callable": "^1.1.5", + "is-number-object": "^1.0.4", + "is-regex": "^1.0.5", + "is-string": "^1.0.5", "is-subset": "^0.1.1", "lodash.escape": "^4.0.1", "lodash.isequal": "^4.5.0", - "object-inspect": "^1.6.0", - "object-is": "^1.0.1", + "object-inspect": "^1.7.0", + "object-is": "^1.0.2", "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", + "object.entries": "^1.1.1", + "object.values": "^1.1.1", + "raf": "^3.4.1", "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.1.2" + "string.prototype.trim": "^1.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/enzyme-adapter-react-16": { - "version": "1.14.0", - "integrity": "sha512-7PcOF7pb4hJUvjY7oAuPGpq3BmlCig3kxXGi2kFx0YzJHppqX1K8IIV9skT1IirxXlu8W7bneKi+oQ10QRnhcA==", + "version": "1.15.7", + "integrity": "sha512-LtjKgvlTc/H7adyQcj+aq0P0H07LDL480WQl1gU512IUyaDo/sbOaNDdZsJXYW2XaoPqrLLE9KbZS+X2z6BASw==", "dev": true, "dependencies": { - "enzyme-adapter-utils": "^1.12.0", + "enzyme-adapter-utils": "^1.14.1", + "enzyme-shallow-equal": "^1.0.5", "has": "^1.0.3", - "object.assign": "^4.1.0", - "object.values": "^1.1.0", - "prop-types": "^15.7.2", - "react-is": "^16.8.6", + "object.assign": "^4.1.4", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "react-is": "^16.13.1", "react-test-renderer": "^16.0.0-0", "semver": "^5.7.0" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, "peerDependencies": { "enzyme": "^3.0.0", "react": "^16.0.0-0", "react-dom": "^16.0.0-0" } }, - "node_modules/enzyme-adapter-react-16/node_modules/react-is": { - "version": "16.9.0", - "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", - "dev": true - }, - "node_modules/enzyme-adapter-react-16/node_modules/semver": { - "version": "5.7.1", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/enzyme-adapter-utils": { - "version": "1.12.0", - "integrity": "sha512-wkZvE0VxcFx/8ZsBw0iAbk3gR1d9hK447ebnSYBf95+r32ezBq+XDSAvRErkc4LZosgH8J7et7H7/7CtUuQfBA==", + "version": "1.14.1", + "integrity": "sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==", "dev": true, "dependencies": { - "airbnb-prop-types": "^2.13.2", - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "object.fromentries": "^2.0.0", - "prop-types": "^15.7.2", - "semver": "^5.6.0" + "airbnb-prop-types": "^2.16.0", + "function.prototype.name": "^1.1.5", + "has": "^1.0.3", + "object.assign": "^4.1.4", + "object.fromentries": "^2.0.5", + "prop-types": "^15.8.1", + "semver": "^5.7.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" }, "peerDependencies": { "react": "0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0" @@ -23944,6 +27346,18 @@ "enzyme": ">=3.4.0" } }, + "node_modules/enzyme-shallow-equal": { + "version": "1.0.5", + "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==", + "dev": true, + "dependencies": { + "has": "^1.0.3", + "object-is": "^1.1.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/enzyme-to-json": { "version": "3.5.0", "integrity": "sha512-clusXRsiaQhG7+wtyc4t7MU8N3zCOgf4eY9+CeSenYzKlFST4lxerfOvnWd4SNaToKhkuba+w6m242YpQOS7eA==", @@ -23959,31 +27373,19 @@ "enzyme": "^3.4.0" } }, - "node_modules/enzyme-to-json/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, "node_modules/enzyme/node_modules/object-inspect": { - "version": "1.6.0", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true + "version": "1.12.3", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/err-code": { "version": "2.0.3", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, - "node_modules/errlop": { - "version": "2.2.0", - "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==", - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, "node_modules/errno": { "version": "0.1.7", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", @@ -24009,29 +27411,42 @@ } }, "node_modules/es-abstract": { - "version": "1.19.1", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.21.1", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dependencies": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -24041,8 +27456,8 @@ } }, "node_modules/es-abstract/node_modules/object-inspect": { - "version": "1.11.0", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.12.3", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -24077,6 +27492,25 @@ "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", "dev": true }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dependencies": { + "has": "^1.0.3" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", @@ -24246,34 +27680,6 @@ "eslint-plugin-import": "^2.22.1" } }, - "node_modules/eslint-config-airbnb-base/node_modules/object.entries": { - "version": "1.1.3", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eslint-config-airbnb/node_modules/object.entries": { - "version": "1.1.3", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/eslint-config-prettier": { "version": "7.1.0", "integrity": "sha512-9sm5/PxaFG7qNJvJzTROMM1Bk1ozXVTKI0buKOyb0Bsr1hrwi0H/TzxF/COtf1uxikIK8SwhX7K6zg78jAzbeA==", @@ -24434,22 +27840,6 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" } }, - "node_modules/eslint-plugin-import/node_modules/array.prototype.flat": { - "version": "1.2.4", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", @@ -24622,37 +28012,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-react/node_modules/object.entries": { - "version": "1.1.3", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eslint-plugin-react/node_modules/object.fromentries": { - "version": "2.0.3", - "integrity": "sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-plugin-testing-library": { "version": "3.10.1", "integrity": "sha512-nQIFe2muIFv2oR2zIuXE4vTbcFNx8hZKRzgHZqJg8rfopIWwoTwtlbCCNELT/jXzVe1uZF68ALGYoDXjLczKiQ==", @@ -25297,15 +28656,15 @@ } }, "node_modules/express": { - "version": "4.17.1", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.3", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -25319,13 +28678,13 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", @@ -25335,56 +28694,52 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/accepts": { - "version": "1.3.7", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "node_modules/express/node_modules/negotiator": { - "version": "0.6.2", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "node_modules/express/node_modules/cookie": { + "version": "0.4.2", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "engines": { "node": ">= 0.6" } }, - "node_modules/express/node_modules/parseurl": { - "version": "1.3.3", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/express/node_modules/qs": { - "version": "6.7.0", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.7", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/setprototypeof": { - "version": "1.1.1", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/express/node_modules/statuses": { - "version": "1.5.0", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } + "node_modules/express/node_modules/setprototypeof": { + "version": "1.2.0", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/expression-eval": { "version": "2.1.0", @@ -25410,7 +28765,7 @@ "node_modules/external-editor": { "version": "3.1.0", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "devOptional": true, + "dev": true, "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -25423,7 +28778,7 @@ "node_modules/external-editor/node_modules/tmp": { "version": "0.0.33", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "devOptional": true, + "dev": true, "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -25795,7 +29150,7 @@ "node_modules/figures": { "version": "3.2.0", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "devOptional": true, + "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -25836,8 +29191,8 @@ } }, "node_modules/file-loader/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -25846,8 +29201,8 @@ } }, "node_modules/file-loader/node_modules/loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -25899,10 +29254,30 @@ } }, "node_modules/filelist": { - "version": "1.0.2", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "version": "1.0.4", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, "dependencies": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.0", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/filename-reserved-regex": { @@ -25971,20 +29346,6 @@ "node": ">= 0.8" } }, - "node_modules/finalhandler/node_modules/parseurl": { - "version": "1.3.3", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/statuses": { - "version": "1.5.0", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/find-cache-dir": { "version": "2.1.0", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", @@ -26022,15 +29383,12 @@ "node": ">=4" } }, - "node_modules/first-chunk-stream": { - "version": "2.0.0", - "integrity": "sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==", - "optional": true, - "dependencies": { - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" + "node_modules/flat": { + "version": "5.0.2", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" } }, "node_modules/flat-cache": { @@ -26061,9 +29419,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.14.8", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", - "devOptional": true, + "version": "1.15.2", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, "funding": [ { "type": "individual", @@ -26084,6 +29442,13 @@ "integrity": "sha512-qKVeWWNvkPP22FUkea2qVgZHiPBIRk9HFGIFmEUbqEV7Wcu/Dxrva4t7d1XPa2+0cnJgD0kHAiDZ514KjHYQKA==", "deprecated": "Package relocated. Please install and migrate to @fontsource/fira-code." }, + "node_modules/for-each": { + "version": "0.3.3", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/for-in": { "version": "1.0.2", "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", @@ -26356,8 +29721,8 @@ "dev": true }, "node_modules/fs-extra": { - "version": "10.0.0", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "10.1.0", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -26400,21 +29765,57 @@ "version": "1.0.0", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "node_modules/ftp": { + "version": "0.3.10", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dev": true, + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, "node_modules/function-bind": { "version": "1.1.1", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { - "version": "1.1.1", - "integrity": "sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q==", + "version": "1.1.5", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dependencies": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "function-bind": "^1.1.1", - "functions-have-names": "^1.1.1", - "is-callable": "^1.1.4" + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functional-red-black-tree": { @@ -26423,8 +29824,11 @@ "dev": true }, "node_modules/functions-have-names": { - "version": "1.1.1", - "integrity": "sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw==" + "version": "1.2.3", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/fuse.js": { "version": "6.4.6", @@ -26434,42 +29838,61 @@ } }, "node_modules/gauge": { - "version": "2.7.4", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "version": "4.0.4", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "number-is-nan": "^1.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/gensync": { @@ -26513,12 +29936,12 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.0", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -26718,6 +30141,80 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-uri": { + "version": "3.0.2", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/debug": { + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/get-uri/node_modules/file-uri-to-path": { + "version": "2.0.0", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/fs-extra": { + "version": "8.1.0", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-uri/node_modules/jsonfile": { + "version": "4.0.0", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/get-uri/node_modules/ms": { + "version": "2.1.2", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/get-uri/node_modules/universalify": { + "version": "0.1.2", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/get-value": { "version": "2.0.6", "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", @@ -26733,17 +30230,6 @@ "assert-plus": "^1.0.0" } }, - "node_modules/gh-got": { - "version": "5.0.0", - "integrity": "sha512-B9bWm0vDR7CSbFPxt528dbMTWd9CUc4h9U3Ji7e781Jy9Xm0p6QWKVndA4ETEzDCd3/GqVCjVfqqpl2kR1j3nA==", - "dependencies": { - "got": "^6.2.0", - "is-plain-obj": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/gh-pages": { "version": "3.2.3", "integrity": "sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg==", @@ -26775,8 +30261,8 @@ } }, "node_modules/gh-pages/node_modules/async": { - "version": "2.6.3", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dependencies": { "lodash": "^4.17.14" } @@ -27022,20 +30508,20 @@ } }, "node_modules/git-up": { - "version": "4.0.5", - "integrity": "sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA==", + "version": "7.0.0", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, "dependencies": { - "is-ssh": "^1.3.0", - "parse-url": "^6.0.0" + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" } }, "node_modules/git-url-parse": { - "version": "11.6.0", - "integrity": "sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==", + "version": "13.1.0", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", "dev": true, "dependencies": { - "git-up": "^4.0.0" + "git-up": "^7.0.0" } }, "node_modules/gitconfiglocal": { @@ -27052,13 +30538,16 @@ "dev": true }, "node_modules/github-username": { - "version": "3.0.0", - "integrity": "sha512-pbA1zobA7urImyNixOkCb/eO2fRadF7+RZgdjzT3/k/KukA8CY7QZ7BNCdCetH1kB0YqeBmY+Hn76XaC3rmmzQ==", + "version": "6.0.0", + "integrity": "sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==", "dependencies": { - "gh-got": "^5.0.0" + "@octokit/rest": "^18.0.6" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gl-matrix": { @@ -27066,13 +30555,13 @@ "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" }, "node_modules/glob": { - "version": "7.1.7", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.3", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -27185,31 +30674,14 @@ "node": ">=8" } }, - "node_modules/got": { - "version": "6.7.1", - "integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==", + "node_modules/gopd": { + "version": "1.0.1", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dependencies": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" + "get-intrinsic": "^1.1.3" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "3.0.0", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { @@ -27233,10 +30705,6 @@ "dev": true, "optional": true }, - "node_modules/gud": { - "version": "1.0.0", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" - }, "node_modules/h3-js": { "version": "3.7.2", "integrity": "sha512-LPjlHSwB9zQZrMqKloCZmmmt3yZzIK7nqPcXqwU93zT3TtYG6jP4tZBzAPouxut7lLjdFbMQ75wRBiKfpsnY7w==", @@ -27334,8 +30802,8 @@ } }, "node_modules/has-bigints": { - "version": "1.0.1", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -27367,9 +30835,29 @@ "node": ">=0.10.0" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { - "version": "1.0.2", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -27765,10 +31253,6 @@ "react-is": "^16.7.0" } }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/homedir-polyfill": { "version": "1.0.3", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", @@ -27796,22 +31280,48 @@ } }, "node_modules/html-element-map": { - "version": "1.1.0", - "integrity": "sha512-iqiG3dTZmy+uUaTmHarTL+3/A2VW9ox/9uasKEZC+R/wAtUrTcRlXPSaPqsnWPfIu8wqn09jQNwMRqzL54jSYA==", + "version": "1.3.1", + "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", "dev": true, "dependencies": { - "array-filter": "^1.0.0" + "array.prototype.filter": "^1.0.0", + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "version": "3.0.0", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, "dependencies": { - "whatwg-encoding": "^1.0.5" + "whatwg-encoding": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" + } + }, + "node_modules/html-encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/html-encoding-sniffer/node_modules/whatwg-encoding": { + "version": "2.0.0", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" } }, "node_modules/html-entities": { @@ -27922,8 +31432,8 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "node_modules/http-deceiver": { @@ -27946,8 +31456,8 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.3", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "version": "0.5.8", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true }, "node_modules/http-proxy": { @@ -27998,11 +31508,11 @@ "dev": true }, "node_modules/http-proxy-middleware": { - "version": "2.0.1", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "version": "2.0.6", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "dependencies": { - "@types/http-proxy": "^1.17.5", + "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", @@ -28010,6 +31520,14 @@ }, "engines": { "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, "node_modules/http-proxy-middleware/node_modules/braces": { @@ -28054,12 +31572,12 @@ } }, "node_modules/http-proxy-middleware/node_modules/micromatch": { - "version": "4.0.4", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -28130,7 +31648,7 @@ "node_modules/human-signals": { "version": "1.1.1", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8.12.0" } @@ -28203,11 +31721,33 @@ "dev": true }, "node_modules/ignore-walk": { - "version": "3.0.4", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "version": "5.0.1", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", "dev": true, "dependencies": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "5.1.2", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/image-size": { @@ -28403,75 +31943,74 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/init-package-json": { - "version": "2.0.5", - "integrity": "sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA==", + "version": "3.0.2", + "integrity": "sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A==", "dev": true, "dependencies": { - "npm-package-arg": "^8.1.5", + "npm-package-arg": "^9.0.1", "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "^4.1.1", + "read": "^1.0.7", + "read-package-json": "^5.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0" + "validate-npm-package-name": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/init-package-json/node_modules/builtins": { + "version": "5.0.1", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" } }, "node_modules/init-package-json/node_modules/hosted-git-info": { - "version": "4.1.0", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/init-package-json/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/init-package-json/node_modules/normalize-package-data": { - "version": "3.0.3", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "node_modules/init-package-json/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/init-package-json/node_modules/read-package-json": { - "version": "4.1.1", - "integrity": "sha512-P82sbZJ3ldDrWCOSKxJT0r/CXMWR0OR3KRh55SgKo3p91GSIEEC32v3lSHAvO/UcH3/IoL7uqhOFBduAnwdldw==", + "node_modules/init-package-json/node_modules/proc-log": { + "version": "2.0.1", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", "dev": true, - "dependencies": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" - }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/init-package-json/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -28483,6 +32022,28 @@ "node": ">=10" } }, + "node_modules/init-package-json/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/init-package-json/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/init-package-json/node_modules/yallist": { "version": "4.0.0", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", @@ -28501,32 +32062,34 @@ } }, "node_modules/inquirer": { - "version": "7.3.3", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "devOptional": true, + "version": "8.2.5", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "mute-stream": "0.0.8", + "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^6.6.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" } }, "node_modules/inquirer/node_modules/ansi-regex": { "version": "5.0.1", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -28534,15 +32097,23 @@ "node_modules/inquirer/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } }, + "node_modules/inquirer/node_modules/rxjs": { + "version": "7.8.0", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/inquirer/node_modules/string-width": { "version": "4.2.3", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "devOptional": true, + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -28555,7 +32126,7 @@ "node_modules/inquirer/node_modules/strip-ansi": { "version": "6.0.1", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -28563,40 +32134,32 @@ "node": ">=8" } }, - "node_modules/insert-css": { - "version": "2.0.0", - "integrity": "sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA==" + "node_modules/inquirer/node_modules/tslib": { + "version": "2.4.1", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true }, - "node_modules/internal-ip": { - "version": "6.2.0", - "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "7.0.0", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "default-gateway": "^6.0.0", - "ipaddr.js": "^1.9.1", - "is-ip": "^3.1.0", - "p-event": "^4.2.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sindresorhus/internal-ip?sponsor=1" - } - }, - "node_modules/internal-ip/node_modules/ipaddr.js": { - "version": "1.9.1", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/internal-slot": { - "version": "1.0.3", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -28616,15 +32179,17 @@ } }, "node_modules/interweave": { - "version": "11.2.0", - "integrity": "sha512-33h9LOXbT52tMin3IyLBPcd5RbiwroP/Sxr0OamnJJU7A/jh0XtZKGvdcSNKYRC7sLZuDk+ZJ2XVrmkcMU5i6w==", + "version": "13.0.0", + "integrity": "sha512-Mckwj+ix/VtrZu1bRBIIohwrsXj12ZTvJCoYUMZlJmgtvIaQCj0i77eSZ63ckbA1TsPrz2VOvLW9/kTgm5d+mw==", "dependencies": { - "@types/react": "*", - "escape-html": "^1.0.3", - "prop-types": "^15.7.2" + "escape-html": "^1.0.3" + }, + "funding": { + "type": "ko-fi", + "url": "https://ko-fi.com/milesjohnson" }, "peerDependencies": { - "react": "^16.3.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/invariant": { @@ -28638,14 +32203,6 @@ "version": "1.1.5", "integrity": "sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==" }, - "node_modules/ip-regex": { - "version": "2.1.0", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/ipaddr.js": { "version": "2.0.1", "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", @@ -28712,6 +32269,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.1", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" @@ -28756,8 +32325,8 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "node_modules/is-callable": { - "version": "1.2.4", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "engines": { "node": ">= 0.4" }, @@ -28777,8 +32346,8 @@ } }, "node_modules/is-core-module": { - "version": "2.8.0", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.11.0", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dependencies": { "has": "^1.0.3" }, @@ -28905,25 +32474,6 @@ "node": ">=8" } }, - "node_modules/is-ip": { - "version": "3.1.0", - "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", - "dev": true, - "dependencies": { - "ip-regex": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ip/node_modules/ip-regex": { - "version": "4.3.0", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-lambda": { "version": "1.0.1", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", @@ -28937,8 +32487,8 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.1", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "engines": { "node": ">= 0.4" }, @@ -29005,25 +32555,10 @@ "node": ">=4" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "1.1.0", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -29048,13 +32583,6 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true }, - "node_modules/is-redirect": { - "version": "1.0.0", - "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.1.4", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", @@ -29078,13 +32606,6 @@ "version": "1.0.3", "integrity": "sha512-/tCmbIETZwCd8uHWO+GvbRa7jxwHFHdfetHfiwoP0aN9UDf3prUJMtKn7iBFYipYhqY1bSTjur8hC/Dakt8eyw==" }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-set": { "version": "2.0.2", "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", @@ -29093,18 +32614,21 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "version": "1.0.2", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-ssh": { - "version": "1.3.3", - "integrity": "sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ==", + "version": "1.4.0", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", "dev": true, "dependencies": { - "protocols": "^1.1.0" + "protocols": "^2.0.1" } }, "node_modules/is-stream": { @@ -29156,6 +32680,23 @@ "node": ">=0.10.0" } }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", @@ -29172,16 +32713,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-utf8": { - "version": "0.2.1", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "optional": true - }, "node_modules/is-weakref": { - "version": "1.0.1", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -29228,6 +32764,7 @@ "node_modules/isbinaryfile": { "version": "4.0.8", "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true, "engines": { "node": ">= 8.0.0" }, @@ -29381,41 +32918,6 @@ "node": ">=8" } }, - "node_modules/istextorbinary": { - "version": "2.6.0", - "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==", - "dependencies": { - "binaryextensions": "^2.1.2", - "editions": "^2.2.0", - "textextensions": "^2.5.0" - }, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/istextorbinary/node_modules/binaryextensions": { - "version": "2.3.0", - "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/istextorbinary/node_modules/textextensions": { - "version": "2.6.0", - "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==", - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, "node_modules/iterate-iterator": { "version": "1.0.2", "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", @@ -29435,11 +32937,12 @@ } }, "node_modules/jake": { - "version": "10.8.2", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "version": "10.8.5", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dev": true, "dependencies": { - "async": "0.9.x", - "chalk": "^2.4.2", + "async": "^3.2.3", + "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" }, @@ -29447,43 +32950,7 @@ "jake": "bin/cli.js" }, "engines": { - "node": "*" - } - }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jake/node_modules/async": { - "version": "0.9.2", - "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==" - }, - "node_modules/jake/node_modules/chalk": { - "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "node": ">=10" } }, "node_modules/java-properties": { @@ -30479,6 +33946,84 @@ "node": ">=8" } }, + "node_modules/jest-environment-jsdom/node_modules/cssom": { + "version": "0.4.4", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/data-urls": { + "version": "2.0.0", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/domexception": { + "version": "2.0.1", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/escodegen": { + "version": "2.0.0", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/esprima": { + "version": "4.0.1", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-environment-jsdom/node_modules/estraverse": { + "version": "5.3.0", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/jest-environment-jsdom/node_modules/fill-range": { "version": "7.0.1", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", @@ -30490,6 +34035,30 @@ "node": ">=8" } }, + "node_modules/jest-environment-jsdom/node_modules/form-data": { + "version": "3.0.1", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-environment-jsdom/node_modules/is-number": { "version": "7.0.0", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", @@ -30514,6 +34083,51 @@ "node": ">= 10.14.2" } }, + "node_modules/jest-environment-jsdom/node_modules/jsdom": { + "version": "16.7.0", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "node_modules/jest-environment-jsdom/node_modules/micromatch": { "version": "4.0.2", "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", @@ -30526,6 +34140,20 @@ "node": ">=8" } }, + "node_modules/jest-environment-jsdom/node_modules/parse5": { + "version": "6.0.1", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/source-map": { + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jest-environment-jsdom/node_modules/to-regex-range": { "version": "5.0.1", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", @@ -30537,6 +34165,70 @@ "node": ">=8.0" } }, + "node_modules/jest-environment-jsdom/node_modules/tough-cookie": { + "version": "4.0.0", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/tr46": { + "version": "2.1.0", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/universalify": { + "version": "0.1.2", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-environment-jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-environment-node": { "version": "26.6.2", "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", @@ -31612,6 +35304,11 @@ "node": ">=8.0" } }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "dev": true + }, "node_modules/jquery": { "version": "3.6.0", "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" @@ -31641,6 +35338,10 @@ "node": ">=0.10.0" } }, + "node_modules/js-sha3": { + "version": "0.8.0", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, "node_modules/js-string-escape": { "version": "1.0.1", "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", @@ -31689,39 +35390,40 @@ "dev": true }, "node_modules/jsdom": { - "version": "16.4.0", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "version": "20.0.0", + "integrity": "sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA==", "dev": true, "dependencies": { - "abab": "^2.0.3", - "acorn": "^7.1.1", + "abab": "^2.0.6", + "acorn": "^8.7.1", "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", + "parse5": "^7.0.0", + "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", + "tough-cookie": "^4.0.0", "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.8.0", + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "peerDependencies": { "canvas": "^2.5.0" @@ -31732,24 +35434,48 @@ } } }, - "node_modules/jsdom/node_modules/acorn": { - "version": "7.4.1", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "node_modules/jsdom/node_modules/@tootallnate/once": { + "version": "2.0.0", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "engines": { + "node": ">= 10" + } + }, + "node_modules/jsdom/node_modules/debug": { + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/entities": { + "version": "4.3.1", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/jsdom/node_modules/escodegen": { - "version": "1.14.3", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.0.0", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "dependencies": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1" }, @@ -31758,7 +35484,7 @@ "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=4.0" + "node": ">=6.0" }, "optionalDependencies": { "source-map": "~0.6.1" @@ -31776,11 +35502,90 @@ "node": ">=4" } }, - "node_modules/jsdom/node_modules/parse5": { - "version": "5.1.1", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "node_modules/jsdom/node_modules/estraverse": { + "version": "5.3.0", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "4.0.0", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "5.0.0", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "5.0.1", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/iconv-lite": { + "version": "0.6.3", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsdom/node_modules/ms": { + "version": "2.1.2", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/jsdom/node_modules/parse5": { + "version": "7.0.0", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "dev": true, + "dependencies": { + "entities": "^4.3.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/saxes": { + "version": "6.0.0", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/jsdom/node_modules/source-map": { "version": "0.6.1", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", @@ -31791,48 +35596,102 @@ } }, "node_modules/jsdom/node_modules/tough-cookie": { - "version": "3.0.1", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "version": "4.0.0", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" }, "engines": { "node": ">=6" } }, "node_modules/jsdom/node_modules/tr46": { - "version": "2.0.2", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "3.0.0", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, "dependencies": { "punycode": "^2.1.1" }, "engines": { - "node": ">=8" + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/universalify": { + "version": "0.1.2", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" } }, "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "6.1.0", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "version": "7.0.0", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "engines": { - "node": ">=10.4" + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-encoding": { + "version": "2.0.0", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" } }, "node_modules/jsdom/node_modules/whatwg-url": { - "version": "8.4.0", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "11.0.0", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "8.8.0", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/xml-name-validator": { + "version": "4.0.0", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" } }, "node_modules/jsep": { @@ -31875,8 +35734,8 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { - "version": "0.2.3", - "integrity": "sha512-a3xHnILGMtk+hDOqNwHzF6e2fNbiMrXZvxKQiEv2MlgQP+pjIOzqAmKYD2mDpXYE/44M7g+n9p2bKkYWDUcXCQ==", + "version": "0.4.0", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "node_modules/json-schema-traverse": { @@ -31888,6 +35747,14 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-nice": { + "version": "1.1.4", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/json-stringify-pretty-compact": { "version": "2.0.0", "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" @@ -31905,8 +35772,8 @@ } }, "node_modules/json5": { - "version": "1.0.1", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dependencies": { "minimist": "^1.2.0" }, @@ -31914,6 +35781,11 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/jsonfile": { "version": "6.1.0", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", @@ -31927,7 +35799,7 @@ "node_modules/jsonparse": { "version": "1.3.1", "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "devOptional": true, + "dev": true, "engines": [ "node >= 0.2.0" ] @@ -31935,7 +35807,7 @@ "node_modules/JSONStream": { "version": "1.3.5", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "devOptional": true, + "dev": true, "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -31948,17 +35820,17 @@ } }, "node_modules/jsprim": { - "version": "1.4.1", - "integrity": "sha512-4Dj8Rf+fQ+/Pn7C5qeEX02op1WfOss3PKTE9Nsop3Dx+6UPxlm1dr/og7o2cRa5hNN07CACr4NFzRLtj/rjWog==", + "version": "1.4.2", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, - "engines": [ - "node >=0.6.0" - ], "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/jsx-ast-utils": { @@ -32055,17 +35927,6 @@ "language-subtag-registry": "~0.3.2" } }, - "node_modules/lazy-cache": { - "version": "2.0.2", - "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==", - "optional": true, - "dependencies": { - "set-getter": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lazy-universal-dotenv": { "version": "3.0.1", "integrity": "sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==", @@ -32089,34 +35950,39 @@ "dev": true }, "node_modules/lerna": { - "version": "4.0.0", - "integrity": "sha512-DD/i1znurfOmNJb0OBw66NmNqiM8kF6uIrzrJ0wGE3VNdzeOhz9ziWLYiRaZDGGwgbcjOo6eIfcx9O5Qynz+kg==", - "dev": true, - "dependencies": { - "@lerna/add": "4.0.0", - "@lerna/bootstrap": "4.0.0", - "@lerna/changed": "4.0.0", - "@lerna/clean": "4.0.0", - "@lerna/cli": "4.0.0", - "@lerna/create": "4.0.0", - "@lerna/diff": "4.0.0", - "@lerna/exec": "4.0.0", - "@lerna/import": "4.0.0", - "@lerna/info": "4.0.0", - "@lerna/init": "4.0.0", - "@lerna/link": "4.0.0", - "@lerna/list": "4.0.0", - "@lerna/publish": "4.0.0", - "@lerna/run": "4.0.0", - "@lerna/version": "4.0.0", + "version": "6.1.0", + "integrity": "sha512-3qAjIj8dgBwHtCAiLbq4VU/C1V9D1tvTLm2owZubdGAN72aB5TxuCu2mcw+yeEorOcXuR9YWx7EXIkAf+G0N2w==", + "dev": true, + "dependencies": { + "@lerna/add": "6.1.0", + "@lerna/bootstrap": "6.1.0", + "@lerna/changed": "6.1.0", + "@lerna/clean": "6.1.0", + "@lerna/cli": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/create": "6.1.0", + "@lerna/diff": "6.1.0", + "@lerna/exec": "6.1.0", + "@lerna/import": "6.1.0", + "@lerna/info": "6.1.0", + "@lerna/init": "6.1.0", + "@lerna/link": "6.1.0", + "@lerna/list": "6.1.0", + "@lerna/publish": "6.1.0", + "@lerna/run": "6.1.0", + "@lerna/version": "6.1.0", + "@nrwl/devkit": ">=14.8.6 < 16", "import-local": "^3.0.2", - "npmlog": "^4.1.2" + "inquirer": "^8.2.4", + "npmlog": "^6.0.2", + "nx": ">=14.8.6 < 16", + "typescript": "^3 || ^4" }, "bin": { "lerna": "cli.js" }, "engines": { - "node": ">= 10.18.0" + "node": "^14.15.0 || >=16.0.0" } }, "node_modules/less": { @@ -32190,17 +36056,17 @@ } }, "node_modules/libnpmaccess": { - "version": "4.0.3", - "integrity": "sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ==", + "version": "6.0.4", + "integrity": "sha512-qZ3wcfIyUoW0+qSFkMBovcTrSGJ3ZeyvpR7d5N9pEYv/kXs8sHP2wiqEIXBKLFrZlmM0kR0RJD7mtfLngtlLag==", "dev": true, "dependencies": { "aproba": "^2.0.0", "minipass": "^3.1.1", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0" + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/libnpmaccess/node_modules/aproba": { @@ -32208,33 +36074,103 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, - "node_modules/libnpmpublish": { - "version": "4.0.2", - "integrity": "sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw==", + "node_modules/libnpmaccess/node_modules/builtins": { + "version": "5.0.1", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "dependencies": { - "normalize-package-data": "^3.0.2", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0", - "semver": "^7.1.3", - "ssri": "^8.0.1" + "semver": "^7.0.0" + } + }, + "node_modules/libnpmaccess/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/libnpmpublish/node_modules/hosted-git-info": { - "version": "4.1.0", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "node_modules/libnpmaccess/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/libnpmaccess/node_modules/minipass-fetch": { + "version": "2.1.2", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/libnpmaccess/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/libnpmaccess/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/libnpmaccess/node_modules/proc-log": { + "version": "2.0.1", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/libnpmaccess/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { "node": ">=10" } }, - "node_modules/libnpmpublish/node_modules/lru-cache": { + "node_modules/libnpmaccess/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, @@ -32245,23 +36181,136 @@ "node": ">=10" } }, + "node_modules/libnpmaccess/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/libnpmaccess/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/libnpmpublish": { + "version": "6.0.5", + "integrity": "sha512-LUR08JKSviZiqrYTDfywvtnsnxr+tOvBU0BF8H+9frt7HMvc6Qn6F8Ubm72g5hDTHbq8qupKfDvDAln2TVPvFg==", + "dev": true, + "dependencies": { + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0", + "semver": "^7.3.7", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/libnpmpublish/node_modules/builtins": { + "version": "5.0.1", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/libnpmpublish/node_modules/hosted-git-info": { + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/libnpmpublish/node_modules/lru-cache": { + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/libnpmpublish/node_modules/minipass-fetch": { + "version": "2.1.2", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, "node_modules/libnpmpublish/node_modules/normalize-package-data": { - "version": "3.0.3", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "version": "4.0.1", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "dev": true, "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/libnpmpublish/node_modules/npm-package-arg": { + "version": "9.1.2", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/libnpmpublish/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/libnpmpublish/node_modules/proc-log": { + "version": "2.0.1", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/libnpmpublish/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -32273,15 +36322,37 @@ "node": ">=10" } }, + "node_modules/libnpmpublish/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/libnpmpublish/node_modules/ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "version": "9.0.1", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "dependencies": { "minipass": "^3.1.1" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/libnpmpublish/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/libnpmpublish/node_modules/yallist": { @@ -32358,8 +36429,8 @@ } }, "node_modules/listr-update-renderer/node_modules/ansi-regex": { - "version": "3.0.0", - "integrity": "sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==", + "version": "3.0.1", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, "engines": { "node": ">=4" @@ -32707,8 +36778,8 @@ } }, "node_modules/loader-utils": { - "version": "1.4.0", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "1.4.2", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -32758,11 +36829,6 @@ "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", "dev": true }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", - "dev": true - }, "node_modules/lodash.camelcase": { "version": "4.3.0", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" @@ -32790,10 +36856,6 @@ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, - "node_modules/lodash.flow": { - "version": "3.5.0", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" - }, "node_modules/lodash.get": { "version": "4.4.2", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" @@ -32854,32 +36916,8 @@ }, "node_modules/lodash.sortby": { "version": "4.7.0", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "node_modules/lodash.topath": { - "version": "4.5.2", - "integrity": "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==" + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true }, "node_modules/lodash.truncate": { "version": "4.4.2", @@ -32933,13 +36971,6 @@ "version": "2.1.0", "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lowlight": { "version": "1.20.0", "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", @@ -32993,56 +37024,98 @@ } }, "node_modules/make-fetch-happen": { - "version": "8.0.14", - "integrity": "sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==", + "version": "10.2.1", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.0.5", + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", + "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", + "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^5.0.0", - "ssri": "^8.0.0" + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "2.1.2", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "2.0.0", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, "engines": { "node": ">= 10" } }, + "node_modules/make-fetch-happen/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "15.3.0", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "version": "16.1.3", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" }, "engines": { - "node": ">= 10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/make-fetch-happen/node_modules/chownr": { @@ -33053,17 +37126,88 @@ "node": ">=10" } }, + "node_modules/make-fetch-happen/node_modules/debug": { + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/make-fetch-happen/node_modules/glob": { + "version": "8.0.3", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minimatch": { + "version": "5.1.2", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, + "node_modules/make-fetch-happen/node_modules/minipass-fetch": { + "version": "2.1.2", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, "node_modules/make-fetch-happen/node_modules/mkdirp": { "version": "1.0.4", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", @@ -33075,15 +37219,67 @@ "node": ">=10" } }, + "node_modules/make-fetch-happen/node_modules/ms": { + "version": "2.1.2", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/make-fetch-happen/node_modules/semver": { + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/make-fetch-happen/node_modules/ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "version": "9.0.1", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "dependencies": { "minipass": "^3.1.1" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-filename": { + "version": "2.0.1", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-slug": { + "version": "3.0.0", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/make-fetch-happen/node_modules/yallist": { @@ -33143,16 +37339,16 @@ } }, "node_modules/mapbox-gl": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-2.12.1.tgz", - "integrity": "sha512-45LVQauimFGX/fkCJzK3O2KpQQrIB0fGlg8sERu4NH0xWiBw9JsLOLYD2xAgD5SPramQvsjzM7vYWIkGxpGYNQ==", + "version": "2.10.0", + "integrity": "sha512-ZAlCe55LXlbg60l15okSBs70NQAPLw3yRO3SSJMTB1uU7uj2QQbLCQPy1Ds+3B4wlaa5W3ewv8FNOZPQOoSSPA==", "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/geojson-rewind": "^0.5.1", + "@mapbox/geojson-types": "^1.0.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/mapbox-gl-supported": "^2.0.1", "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^2.0.6", - "@mapbox/unitbezier": "^0.0.1", + "@mapbox/tiny-sdf": "^2.0.5", + "@mapbox/unitbezier": "^0.0.0", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", "csscolorparser": "~1.0.3", @@ -33162,65 +37358,24 @@ "grid-index": "^1.1.0", "murmurhash-js": "^1.0.0", "pbf": "^3.2.1", - "potpack": "^2.0.0", + "potpack": "^1.0.2", "quickselect": "^2.0.0", "rw": "^1.3.3", - "supercluster": "^7.1.5", + "supercluster": "^7.1.4", "tinyqueue": "^2.0.3", "vt-pbf": "^3.1.3" } }, - "node_modules/mapbox-gl/node_modules/@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "dependencies": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" - }, - "bin": { - "geojson-rewind": "geojson-rewind" - } - }, - "node_modules/mapbox-gl/node_modules/@mapbox/mapbox-gl-supported": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-2.0.1.tgz", - "integrity": "sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ==" - }, "node_modules/mapbox-gl/node_modules/@mapbox/tiny-sdf": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", - "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==" - }, - "node_modules/mapbox-gl/node_modules/@mapbox/unitbezier": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" - }, - "node_modules/mapbox-gl/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "version": "2.0.5", + "integrity": "sha512-OhXt2lS//WpLdkqrzo/KwB7SRD8AiNTFFzuo9n14IBupzIMa67yGItcK7I2W9D8Ghpa4T04Sw9FWsKCJG50Bxw==" }, "node_modules/mapbox-gl/node_modules/gl-matrix": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" }, - "node_modules/mapbox-gl/node_modules/potpack": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", - "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" - }, "node_modules/mapbox-gl/node_modules/supercluster": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", "dependencies": { "kdbush": "^3.0.0" @@ -33511,10 +37666,10 @@ } }, "node_modules/memfs": { - "version": "3.2.4", - "integrity": "sha512-2mDCPhuduRPOxlfgsXF9V+uqC6Jgz8zt/bNe4d4W7d5f6pCzHrWkxLNr17jKGXd4+j2kQNsAG2HARPnt74sqVQ==", + "version": "3.4.7", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "dependencies": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" }, "engines": { "node": ">= 4.0.0" @@ -34170,17 +38325,17 @@ } }, "node_modules/mime-db": { - "version": "1.49.0", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "version": "1.52.0", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.32", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "version": "2.1.35", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.49.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -34189,7 +38344,6 @@ "node_modules/mimic-fn": { "version": "2.1.0", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "devOptional": true, "engines": { "node": ">=6" } @@ -34208,20 +38362,6 @@ "node": ">=4" } }, - "node_modules/mini-create-react-context": { - "version": "0.3.2", - "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dependencies": { - "@babel/runtime": "^7.4.0", - "gud": "^1.0.0", - "tiny-warning": "^1.0.2" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^0.14.0 || ^15.0.0 || ^16.0.0" - } - }, "node_modules/mini-css-extract-plugin": { "version": "2.4.5", "integrity": "sha512-oEIhRucyn1JbT/1tU2BhnwO6ft1jjH1iCX9Gc59WFMg0n5773rQU0oyQ0zzeYFFuBfONaRbQJyGoPtuNseMxjA==", @@ -34310,8 +38450,8 @@ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { - "version": "3.0.4", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -34320,12 +38460,8 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.2.6", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/minimist-options": { "version": "4.1.0", @@ -34368,22 +38504,6 @@ "node": ">= 8" } }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, "node_modules/minipass-flush": { "version": "1.0.5", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", @@ -34557,15 +38677,15 @@ } }, "node_modules/moment": { - "version": "2.29.2", - "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==", + "version": "2.29.4", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { "node": "*" } }, "node_modules/moment-timezone": { - "version": "0.5.33", - "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", + "version": "0.5.37", + "integrity": "sha512-uEDzDNFhfaywRl+vwXxffjjq1q0Vzr+fcQpQ1bU0kbzorfS7zVtZnCnGc8mhWmF39d4g4YriF6kwA75mJKE/Zg==", "dependencies": { "moment": ">= 2.9.0" }, @@ -34639,22 +38759,17 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/multicast-dns": { - "version": "6.2.3", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.5", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "dependencies": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" }, "bin": { "multicast-dns": "cli.js" } }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", - "dev": true - }, "node_modules/multimatch": { "version": "5.0.0", "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", @@ -34698,7 +38813,7 @@ "node_modules/mute-stream": { "version": "0.0.8", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "devOptional": true + "dev": true }, "node_modules/nano-time": { "version": "1.0.0", @@ -34707,10 +38822,6 @@ "big-integer": "^1.6.16" } }, - "node_modules/nanocolors": { - "version": "0.1.12", - "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==" - }, "node_modules/nanoid": { "version": "2.0.0", "integrity": "sha512-SG2qscLE3iM4C0CNzGrsAojJHSVHMS1J8NnvJ31P1lH8P0hGHOiafmniNJz6w6q7vuoDlV7RdySlJgtqkFEVtQ==" @@ -34793,8 +38904,8 @@ } }, "node_modules/negotiator": { - "version": "0.6.1", - "integrity": "sha512-qTxkr1RoLw5Pz+1+PTJ/66hWuyi2LEOeOuIDJDlx6JF8x75bmD5C7qXTg2UlX5W9rLfkqKP+r8q6Vy6NWdWrbw==", + "version": "0.6.3", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } @@ -34807,9 +38918,18 @@ "version": "2.1.1", "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==" }, + "node_modules/netmask": { + "version": "2.0.2", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/nice-try": { "version": "1.0.5", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true }, "node_modules/nise": { "version": "4.1.0", @@ -34864,6 +38984,11 @@ "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==", "dev": true }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, "node_modules/node-ask": { "version": "1.0.1", "integrity": "sha512-+0eqgEdgPiixrNysGDTPo3T2qyEHGVgs4ONlc5tTfcluvC/Rgq1x2ELdANUMwhR2CYLwaQnMS32O/h7adasnFQ==", @@ -34888,14 +39013,6 @@ "semver": "^5.7.0" } }, - "node_modules/node-environment-flags/node_modules/semver": { - "version": "5.7.1", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/node-fetch": { "version": "2.6.7", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", @@ -34931,129 +39048,104 @@ } }, "node_modules/node-forge": { - "version": "0.10.0", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "version": "1.3.1", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, "engines": { - "node": ">= 6.0.0" + "node": ">= 6.13.0" } }, "node_modules/node-gyp": { - "version": "5.1.1", - "integrity": "sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw==", + "version": "9.3.1", + "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", "dev": true, "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.1.2", - "request": "^2.88.0", - "rimraf": "^2.6.3", - "semver": "^5.7.1", - "tar": "^4.4.12", - "which": "^1.3.1" + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">= 6.0.0" + "node": "^12.13 || ^14.13 || >=16" } }, - "node_modules/node-gyp/node_modules/fs-minipass": { - "version": "1.2.7", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/node-gyp/node_modules/minipass": { - "version": "2.9.0", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "node_modules/node-gyp-build": { + "version": "4.5.0", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", "dev": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/minizlib": { - "version": "1.3.3", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "node_modules/node-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "minipass": "^2.9.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/node-gyp/node_modules/nopt": { - "version": "4.0.3", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "version": "6.0.0", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "^1.0.0" }, "bin": { "nopt": "bin/nopt.js" - } - }, - "node_modules/node-gyp/node_modules/rimraf": { - "version": "2.7.1", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/node-gyp/node_modules/safe-buffer": { - "version": "5.2.1", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/node-gyp/node_modules/semver": { - "version": "5.7.1", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/node-gyp/node_modules/tar": { - "version": "4.4.19", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=4.5" + "node": ">= 8" } }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/node-int64": { "version": "0.4.0", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", @@ -35109,13 +39201,6 @@ "node": ">= 0.8.0" } }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "integrity": "sha512-JMaRS9L4wSRIR+6PTVEikTrq/lMGEZR43a48ETeilY0Q0iMwVnccMFrUM1k+tNzmYuIU0Vh710bCUqHX+/+ctQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/node-notifier": { "version": "8.0.0", "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", @@ -35163,245 +39248,446 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/node-notifier/node_modules/which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/node-notifier/node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-releases": { + "version": "2.0.6", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + }, + "node_modules/nopt": { + "version": "5.0.0", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "devOptional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "node_modules/npm-packlist": { + "version": "5.1.3", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "dev": true, + "dependencies": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-packlist/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm-packlist/node_modules/glob": { + "version": "8.0.3", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-packlist/node_modules/minimatch": { + "version": "5.1.2", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-packlist/node_modules/npm-bundled": { + "version": "2.0.1", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "1.0.2", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==" + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nvd3-fork": { + "version": "2.0.5", + "integrity": "sha512-Sq3q2rvR/9FJ35LVmqdQJAnfmD15BaIHSBg5wZZL/WLcq/nthff8ukabwFdbW0zeE1c/yPq+DKl6MxnUTR45DA==", + "peerDependencies": { + "d3": "^3.4.4" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/nx": { + "version": "15.3.3", + "integrity": "sha512-yR102AlVW5Sb7X1e9cyR+0h44RD6c3eLJbAZ0yVFKPCKw+zQTdGvAqITtB6ZeFnPkg6Qq6f1oWu6G0n6f2cTpw==", "dev": true, - "optional": true, + "hasInstallScript": true, "dependencies": { - "isexe": "^2.0.0" + "@nrwl/cli": "15.3.3", + "@nrwl/tao": "15.3.3", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" }, "bin": { - "node-which": "bin/node-which" + "nx": "bin/nx.js" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } } }, - "node_modules/node-releases": { - "version": "1.1.75", - "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==" - }, - "node_modules/nopt": { - "version": "5.0.0", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, + "node_modules/nx/node_modules/ansi-regex": { + "version": "5.0.1", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/nx/node_modules/argparse": { + "version": "2.0.1", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/nx/node_modules/axios": { + "version": "1.2.1", + "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", + "dev": true, "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/normalize-path": { - "version": "2.1.1", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "devOptional": true, + "node_modules/nx/node_modules/braces": { + "version": "3.0.2", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "dependencies": { - "remove-trailing-separator": "^1.0.1" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "node_modules/nx/node_modules/chalk": { + "version": "4.1.0", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-api": { - "version": "1.0.1", - "integrity": "sha512-4sITrrzEbPcr0aNV28QyOmgn6C9yKiF8k92jn4buYAK8wmA5xo1qL3II5/gT1r7wxbXBflSduZ2K3FbtOrtGkA==", - "optional": true, - "dependencies": { - "clone-deep": "^4.0.1", - "download-stats": "^0.3.4", - "JSONStream": "^1.3.5", - "moment": "^2.24.0", - "node-fetch": "^2.6.0", - "paged-request": "^2.0.1" - }, - "engines": { - "node": ">=10.0" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/npm-bundled": { - "version": "1.1.2", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "node_modules/nx/node_modules/cliui": { + "version": "7.0.4", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "dependencies": { - "npm-normalize-package-bin": "^1.0.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/npm-install-checks": { - "version": "4.0.0", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "node_modules/nx/node_modules/dotenv": { + "version": "10.0.0", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, "engines": { "node": ">=10" } }, - "node_modules/npm-install-checks/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/nx/node_modules/fast-glob": { + "version": "3.2.7", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/nx/node_modules/fill-range": { + "version": "7.0.1", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/npm-install-checks/node_modules/yallist": { + "node_modules/nx/node_modules/form-data": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/npm-lifecycle": { - "version": "3.1.5", - "integrity": "sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.15", - "node-gyp": "^5.0.2", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", - "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "node_modules/npm-package-arg": { - "version": "8.1.5", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "node_modules/nx/node_modules/glob": { + "version": "7.1.4", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "4.1.0", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "node_modules/nx/node_modules/ignore": { + "version": "5.2.4", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "engines": { - "node": ">=10" + "node": ">= 4" } }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/nx/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/nx/node_modules/is-number": { + "version": "7.0.0", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" + "node": ">=0.12.0" } }, - "node_modules/npm-package-arg/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/npm-packlist": { - "version": "2.2.2", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", + "node_modules/nx/node_modules/is-wsl": { + "version": "2.2.0", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" + "is-docker": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/npm-pick-manifest": { - "version": "6.1.1", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "node_modules/nx/node_modules/js-yaml": { + "version": "4.1.0", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/npm-pick-manifest/node_modules/lru-cache": { + "node_modules/nx/node_modules/lru-cache": { "version": "6.0.0", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, @@ -35412,236 +39698,190 @@ "node": ">=10" } }, - "node_modules/npm-pick-manifest/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/nx/node_modules/micromatch": { + "version": "4.0.5", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=10" + "node": ">=8.6" } }, - "node_modules/npm-pick-manifest/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/npm-registry-fetch": { - "version": "11.0.0", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "node_modules/nx/node_modules/minimatch": { + "version": "3.0.5", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, "dependencies": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/npm-registry-fetch/node_modules/cacache": { - "version": "15.3.0", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "node_modules/nx/node_modules/npm-run-path": { + "version": "4.0.1", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "path-key": "^3.0.0" }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/npm-registry-fetch/node_modules/chownr": { - "version": "2.0.0", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/nx/node_modules/open": { + "version": "8.4.0", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-registry-fetch/node_modules/debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "node_modules/nx/node_modules/path-key": { + "version": "3.1.1", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/npm-registry-fetch/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/nx/node_modules/proxy-from-env": { + "version": "1.1.0", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/nx/node_modules/semver": { + "version": "7.3.4", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "9.1.0", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "node_modules/nx/node_modules/string-width": { + "version": "4.2.3", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/npm-registry-fetch/node_modules/mkdirp": { - "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/nx/node_modules/strip-ansi": { + "version": "6.0.1", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "dependencies": { + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/npm-registry-fetch/node_modules/ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/npm-registry-fetch/node_modules/negotiator": { - "version": "0.6.2", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "node_modules/nx/node_modules/to-regex-range": { + "version": "5.0.1", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=8.0" } }, - "node_modules/npm-registry-fetch/node_modules/socks-proxy-agent": { - "version": "6.1.1", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "node_modules/nx/node_modules/tslib": { + "version": "2.4.1", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/nx/node_modules/wrap-ansi": { + "version": "7.0.0", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/npm-registry-fetch/node_modules/ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "node_modules/nx/node_modules/y18n": { + "version": "5.0.8", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/npm-registry-fetch/node_modules/yallist": { + "node_modules/nx/node_modules/yallist": { "version": "4.0.0", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "node_modules/nx/node_modules/yargs": { + "version": "17.6.2", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "dependencies": { - "path-key": "^2.0.0" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/npmlog": { - "version": "4.1.2", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "node_modules/nx/node_modules/yargs-parser": { + "version": "21.1.1", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "engines": { + "node": ">=12" } }, - "node_modules/nth-check": { - "version": "1.0.2", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "node_modules/nx/node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/num2fraction": { - "version": "1.2.2", - "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==" - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nvd3-fork": { - "version": "2.0.5", - "integrity": "sha512-Sq3q2rvR/9FJ35LVmqdQJAnfmD15BaIHSBg5wZZL/WLcq/nthff8ukabwFdbW0zeE1c/yPq+DKl6MxnUTR45DA==", - "peerDependencies": { - "d3": "^3.4.4" + "node": ">=12" } }, - "node_modules/nwsapi": { - "version": "2.2.0", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, "node_modules/oauth-sign": { "version": "0.9.0", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", @@ -35694,11 +39934,18 @@ "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==" }, "node_modules/object-is": { - "version": "1.0.1", - "integrity": "sha512-WY2d4Y9s39AGFRtDlJDyNHFHOTQ5MbFzYWt9dHNYn4P9zCR+wpCo1IqWd+xJVEX5aNhCFXzTptJ8H2kRIHWF3Q==", + "version": "1.1.5", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { @@ -35719,12 +39966,12 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -35735,29 +39982,30 @@ } }, "node_modules/object.entries": { - "version": "1.1.0", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "version": "1.1.6", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.0", - "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", + "version": "2.0.6", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dependencies": { - "define-properties": "^1.1.2", - "es-abstract": "^1.11.0", - "function-bind": "^1.1.1", - "has": "^1.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.getownpropertydescriptors": { @@ -35786,12 +40034,12 @@ } }, "node_modules/object.values": { - "version": "1.1.4", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "version": "1.1.6", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -35844,7 +40092,6 @@ "node_modules/onetime": { "version": "5.1.2", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "devOptional": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -35966,31 +40213,14 @@ "version": "0.3.0", "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, - "node_modules/os-homedir": { - "version": "1.0.2", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/osenv": { - "version": "0.1.5", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "node_modules/overlayscrollbars": { "version": "1.13.1", "integrity": "sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==" @@ -36188,6 +40418,72 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pac-proxy-agent": { + "version": "5.0.0", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { + "version": "5.0.1", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pac-resolver": { + "version": "5.0.1", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "dev": true, + "dependencies": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/pad-component": { "version": "0.0.1", "integrity": "sha512-8EKVBxCRSvLnsX1p2LlSFSH3c2/wuhY9/BXXWu8boL78FbVKqn2L5SpURt1x5iw6Gq8PTqJ7MdPoe5nCtX3I+g==" @@ -36202,17 +40498,6 @@ "node": ">=0.10.0" } }, - "node_modules/paged-request": { - "version": "2.0.2", - "integrity": "sha512-NWrGqneZImDdcMU/7vMcAOo1bIi5h/pmpJqe7/jdsy85BA/s5MSaU/KlpxwW/IVPmIwBcq2uKPrBWWhEWhtxag==", - "optional": true, - "dependencies": { - "axios": "^0.21.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/pako": { "version": "1.0.11", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" @@ -36287,39 +40572,19 @@ } }, "node_modules/parse-path": { - "version": "4.0.3", - "integrity": "sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==", + "version": "7.0.0", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dev": true, "dependencies": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0", - "qs": "^6.9.4", - "query-string": "^6.13.8" - } - }, - "node_modules/parse-path/node_modules/qs": { - "version": "6.10.2", - "integrity": "sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "protocols": "^2.0.0" } }, "node_modules/parse-url": { - "version": "6.0.0", - "integrity": "sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw==", + "version": "8.1.0", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dev": true, "dependencies": { - "is-ssh": "^1.3.0", - "normalize-url": "^6.1.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" + "parse-path": "^7.0.0" } }, "node_modules/parse5": { @@ -36331,8 +40596,8 @@ } }, "node_modules/parseurl": { - "version": "1.3.2", - "integrity": "sha512-DjIMrEiCuzD/Xsr69WhcPCTeb6iZP5JgL/DZ3cYz0zMnyiXiscoqC6LLV2dYwQHfy9O+twCDVVPiFWb7xZhaOw==", + "version": "1.3.3", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "engines": { "node": ">= 0.8" } @@ -36382,6 +40647,7 @@ "node_modules/path-key": { "version": "2.0.1", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, "engines": { "node": ">=4" } @@ -36437,15 +40703,16 @@ }, "node_modules/performance-now": { "version": "2.1.0", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true }, "node_modules/picocolors": { "version": "0.2.1", "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" }, "node_modules/picomatch": { - "version": "2.3.0", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -36478,11 +40745,8 @@ } }, "node_modules/pirates": { - "version": "4.0.1", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, + "version": "4.0.5", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "engines": { "node": ">= 6" } @@ -36597,41 +40861,6 @@ "node": ">=10" } }, - "node_modules/portfinder": { - "version": "1.0.28", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/async": { - "version": "2.6.3", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.6", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/portfinder/node_modules/ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/posix-character-classes": { "version": "0.1.1", "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", @@ -36708,8 +40937,8 @@ } }, "node_modules/postcss-loader/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -36718,8 +40947,8 @@ } }, "node_modules/postcss-loader/node_modules/loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -36823,8 +41052,8 @@ } }, "node_modules/postcss-value-parser": { - "version": "4.1.0", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + "version": "4.2.0", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/postcss/node_modules/nanoid": { "version": "3.1.25", @@ -36838,8 +41067,8 @@ } }, "node_modules/potpack": { - "version": "1.0.1", - "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" + "version": "1.0.2", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" }, "node_modules/prelude-ls": { "version": "1.1.2", @@ -36848,13 +41077,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prepend-http": { - "version": "1.0.4", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prettier": { "version": "2.4.1", "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", @@ -36888,16 +41110,6 @@ "prettier": ">= 1.16.0" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pretty-error": { "version": "3.0.4", "integrity": "sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ==", @@ -37003,6 +41215,22 @@ "asap": "~2.0.3" } }, + "node_modules/promise-all-reject-late": { + "version": "1.0.1", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-call-limit": { + "version": "1.0.1", + "integrity": "sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/promise-inflight": { "version": "1.0.1", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" @@ -37080,12 +41308,12 @@ } }, "node_modules/prop-types": { - "version": "15.7.2", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" } }, "node_modules/prop-types-exact": { @@ -37098,10 +41326,6 @@ "reflect.ownkeys": "^0.2.0" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/property-information": { "version": "5.6.0", "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", @@ -37122,8 +41346,8 @@ "integrity": "sha512-G/2kcamPF2S49W5yaMGdIpkG6+5wZF0fzBteLKgEHjbNzqjZQ85aAs1iJGto31EJaSTkNvHs5IXuHSaTLWBAiA==" }, "node_modules/protocols": { - "version": "1.4.8", - "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", + "version": "2.0.1", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "dev": true }, "node_modules/proxy-addr": { @@ -37151,6 +41375,63 @@ "node": ">= 0.10" } }, + "node_modules/proxy-agent": { + "version": "5.0.0", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/ms": { + "version": "2.1.2", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/proxy-agent/node_modules/socks-proxy-agent": { + "version": "5.0.1", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, "node_modules/prr": { "version": "1.0.1", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" @@ -37215,7 +41496,7 @@ "node_modules/puppeteer": { "version": "10.2.0", "integrity": "sha512-OR2CCHRashF+f30+LBOtAjK6sNtz2HEyTr5FqAvhf8lR/qB3uBRoIZOwQKgwoyZnMBsxX7ZdazlyBgGjpnkiMw==", - "deprecated": "< 18.1.0 is no longer supported", + "deprecated": "< 19.4.0 is no longer supported", "dev": true, "hasInstallScript": true, "dependencies": { @@ -37373,10 +41654,6 @@ } } }, - "node_modules/pure-color": { - "version": "1.3.0", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" - }, "node_modules/q": { "version": "1.5.1", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", @@ -37387,8 +41664,8 @@ } }, "node_modules/qs": { - "version": "6.5.2", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, "engines": { "node": ">=0.6" @@ -37457,6 +41734,7 @@ "node_modules/raf": { "version": "3.4.1", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, "dependencies": { "performance-now": "^2.1.0" } @@ -37501,11 +41779,11 @@ } }, "node_modules/raw-body": { - "version": "2.4.0", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.3", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -37514,36 +41792,33 @@ } }, "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.0", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, "node_modules/raw-body/node_modules/http-errors": { - "version": "1.7.2", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" } }, - "node_modules/raw-body/node_modules/setprototypeof": { - "version": "1.1.1", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "node_modules/raw-body/node_modules/inherits": { + "version": "2.0.4", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/raw-body/node_modules/statuses": { - "version": "1.5.0", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } + "node_modules/raw-body/node_modules/setprototypeof": { + "version": "1.2.0", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/raw-loader": { "version": "4.0.2", @@ -37564,8 +41839,8 @@ } }, "node_modules/raw-loader/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -37574,8 +41849,8 @@ } }, "node_modules/raw-loader/node_modules/loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -37600,22 +41875,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-align/node_modules/rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "dependencies": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-align/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/rc-cascader": { "version": "1.4.0", "integrity": "sha512-6kgQljDQEKjVAVRkZtvvoi+2qv4u42M6oLuvt4ZDBa16r3X9ZN8TAq3atVyC840ivbGKlHT50OcdVx/iwiHc1w==", @@ -37653,48 +41912,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-collapse/node_modules/rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "dependencies": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-collapse/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/rc-dialog": { - "version": "8.4.5", - "integrity": "sha512-0a1Uuy1BRBTdIkfR1VE91kis6dBui7tAIPaQQLj28vBdGg9IqVkiLguCdaDW+4E4vZediePz49PKFbLkx2PL5Q==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-motion": "^2.3.0", - "rc-util": "^5.0.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-drawer": { - "version": "4.1.0", - "integrity": "sha512-kjeQFngPjdzAFahNIV0EvEBoIKMOnvUsAxpkSPELoD/1DuR4nLafom5ryma+TIxGwkFJ92W6yjsMi1U9aiOTeQ==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-util": "^5.0.1" - }, - "peerDependencies": { - "react": "*" - } - }, "node_modules/rc-dropdown": { "version": "3.2.0", "integrity": "sha512-j1HSw+/QqlhxyTEF6BArVZnTmezw2LnSmRk6I9W7BCqNCKaRwleRmMMs1PHbuaG8dKHVqP6e21RQ7vPBLVnnNw==", @@ -37723,21 +41940,6 @@ "react": ">= 16.9.0" } }, - "node_modules/rc-image": { - "version": "4.2.0", - "integrity": "sha512-yGqq6wPrIn86hMfC1Hl7M3NNS6zqnl9dvFWJg/StuI86jZBU0rm9rePTfKs+4uiwU3HXxpfsXlaG2p8GWRDLiw==", - "dependencies": { - "@ant-design/icons": "^4.2.2", - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "rc-dialog": "~8.4.0", - "rc-util": "^5.0.6" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, "node_modules/rc-input-number": { "version": "6.1.2", "integrity": "sha512-UvP0tpOUeGetx6caS8RzBs3Du+NwPUn9ijQ3LeR1jOmzjXNuXvv58U6hvIXSHx/4ulPleQ5BAQP/aLTsFB4yGw==", @@ -37785,22 +41987,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-menu/node_modules/rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "dependencies": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-menu/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/rc-motion": { "version": "2.4.1", "integrity": "sha512-TWLvymfMu8SngPx5MDH8dQ0D2RYbluNTfam4hY/dNNx9RQ3WtGuZ/GXHi2ymLMzH+UNd6EEFYkOuR5JTTtm8Xg==", @@ -37814,22 +42000,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-motion/node_modules/rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "dependencies": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-motion/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/rc-notification": { "version": "4.5.4", "integrity": "sha512-VsN0ouF4uglE5g3C9oDsXLNYX0Sz++ZNUFYCswkxhpImYJ9u6nJOpyA71uOYDVCu6bAF54Y5Hi/b+EcnMzkepg==", @@ -37859,43 +42029,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-picker": { - "version": "2.4.3", - "integrity": "sha512-tOIHslTQKpoGNmbpp6YOBwS39dQSvtAuhOm3bWCkkc4jCqUqeR/velCwqefZX1BX4+t1gUMc1dIia9XvOKrEkg==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "date-fns": "^2.15.0", - "dayjs": "^1.8.30", - "moment": "^2.24.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.4.0", - "shallowequal": "^1.1.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-picker/node_modules/rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "dependencies": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-picker/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/rc-progress": { "version": "3.1.1", "integrity": "sha512-1ns3pW7ll9bHfdXtlVLF+vngdvlxiCDtiqwXnZFEdurst11JTiPxVdeqnCNbhWx5hP4kCKkAPqG1N0FVfTSUGA==", @@ -37938,44 +42071,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-select": { - "version": "11.5.3", - "integrity": "sha512-ASSO4J/ayfbQQ+KOEounIMGhySDHpQtrIuH1WEABOBy8HgKec8kOLmyLH+YIXSUDnTf/gtxmflgFtl7sQ9pkSw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-trigger": "^5.0.4", - "rc-util": "^5.0.1", - "rc-virtual-list": "^3.2.0", - "warning": "^4.0.3" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-slider": { - "version": "9.6.5", - "integrity": "sha512-XRUJDK668hy8MwGnHzZlXCQXXIOUnEs4m2vwk1jgDILVBxI0GwGOlC6T499pYY+NEWg8YgdCOAucFs/+X5WHpg==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-tooltip": "^5.0.1", - "rc-util": "^5.0.0", - "shallowequal": "^1.1.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, "node_modules/rc-steps": { "version": "4.1.3", "integrity": "sha512-GXrMfWQOhN3sVze3JnzNboHpQdNHcdFubOETUHyDpa/U3HEKBZC3xJ8XK4paBgF4OJ3bdUVLC+uBPc6dCxvDYA==", @@ -38005,40 +42100,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-table": { - "version": "7.11.3", - "integrity": "sha512-YyZry1CdqUrcH7MmWtLQZVvVZWbmTEbI5m650AZ+zYw4D5VF701samkMYl5z/H9yQFr+ugvDtXcya+e3vwRkMQ==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-resize-observer": "^0.2.0", - "rc-util": "^5.4.0", - "shallowequal": "^1.1.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-table/node_modules/rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "dependencies": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-table/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/rc-tabs": { "version": "11.7.2", "integrity": "sha512-2M/XE4TdecnjsDylJSs49OmjJuDuix3VmSiNaPd50PMqFc+dc4fEof3J8/ad12enicVOcsH4BEQEms//Kn4DBw==", @@ -38058,22 +42119,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-tabs/node_modules/rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "dependencies": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tabs/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/rc-textarea": { "version": "0.3.2", "integrity": "sha512-569hiqCtkZFCcxBpKLM+IdnjZDQCFoy7RlQ4bkked0wp9uh+ofgk5zuQNJPiPyMYzpKYRlYeZgJ1bnK/8Po0Sg==", @@ -38088,47 +42133,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-tooltip": { - "version": "5.0.1", - "integrity": "sha512-3AnxhUS0j74xAV3khrKw8o6rg+Ima3nw09DJBezMPnX3ImQUAnayWsPSlN1mEnihjA43rcFkGM1emiKE+CXyMQ==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "rc-trigger": "^5.0.0" - } - }, - "node_modules/rc-tree": { - "version": "4.0.0", - "integrity": "sha512-C2xlkA+/IypkHBPzbpAJGVWJh2HjeRbYCusA/m5k09WT6hQT0nC7LtLVmnb7QZecdBQPhoOgQh8gPwBR+xEMjQ==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-util": "^5.0.0", - "rc-virtual-list": "^3.0.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-tree-select": { - "version": "4.2.0", - "integrity": "sha512-VrrvBiOov6WR44RTGMqSw1Dmodg6Y++EH6a6R0ew43qsV4Ob0FGYRgoX811kImtt2Z+oAPJ6zZXN4WKtsQd3Gw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-select": "^11.1.1", - "rc-tree": "^4.0.0", - "rc-util": "^5.0.5" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, "node_modules/rc-trigger": { "version": "5.2.0", "integrity": "sha512-fpC1ZkM/IgIIDfF6XHx3Hb2zXy9wvdI5eMh+6DdLygk6Z3HGmkri6ZCXg9a0wfF9AFuzlYTeBLS1uRASZRsnMQ==", @@ -38143,22 +42147,6 @@ "node": ">=8.x" } }, - "node_modules/rc-trigger/node_modules/rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "dependencies": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-trigger/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/rc-upload": { "version": "3.3.4", "integrity": "sha512-v2sirR4JL31UTHD/f0LGUdd+tpFaOVUTPeIEjAXRP9kRN8TFhqOgcXl5ixtyqj90FmtRUmKmafCv0EmhBQUHqQ==", @@ -38172,54 +42160,11 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-upload/node_modules/rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "dependencies": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-upload/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/rc-util": { - "version": "5.0.6", - "integrity": "sha512-uLGxF9WjbpJSjd6iDnIjl8ZeMUglpcuh1DwO26aaXh++yAmlB6eIAJMUwwJCuqJvo4quCvsDPg1VkqHILc4U0A==", - "dependencies": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - } - }, - "node_modules/rc-util/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/rc-virtual-list": { - "version": "3.2.3", - "integrity": "sha512-uEeYDQWwQhxR97SekPeGRbzPtHSbSpw/mYb6QpZZ9bA43kf7s1socV3fD3ySYhQVzo0I+/IUD9jFGit6FbM0WA==", - "dependencies": { - "classnames": "^2.2.6", - "rc-resize-observer": "^0.2.3", - "rc-util": "^5.0.7" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-virtual-list/node_modules/rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", + "version": "5.24.4", + "integrity": "sha512-2a4RQnycV9eV7lVZPEJ7QwJRPlZNc06J7CwcwZo4vIHr3PfUqtYgl1EkUV9ETAc6VRRi8XZOMFhYG63whlIC9Q==", "dependencies": { + "@babel/runtime": "^7.18.3", "react-is": "^16.12.0", "shallowequal": "^1.1.0" }, @@ -38228,10 +42173,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-virtual-list/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/re-resizable": { "version": "6.6.1", "integrity": "sha512-ttWVasZ9X7c0ir0+4YK47tkmm9EAFssW07YLkeLzG5HCOuFgFAlSVzMlzAH0h3i6hDShQCHHJecVx5rk+snoFA==", @@ -38252,33 +42193,41 @@ } }, "node_modules/react-ace": { - "version": "9.5.0", - "integrity": "sha512-4l5FgwGh6K7A0yWVMQlPIXDItM4Q9zzXRqOae8KkCl6MkOob7sC1CzHxZdOGvV+QioKWbX2p5HcdOVUv6cAdSg==", + "version": "10.1.0", + "integrity": "sha512-VkvUjZNhdYTuKOKQpMIZi7uzZZVgzCjM7cLYu6F64V0mejY8a2XTyPUIMszC6A4trbeMIHbK5fYFcT/wkP/8VA==", "dependencies": { - "ace-builds": "^1.4.13", + "ace-builds": "^1.4.14", "diff-match-patch": "^1.0.5", "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", "prop-types": "^15.7.2" }, "peerDependencies": { - "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0", - "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0" + "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-base16-styling": { - "version": "0.5.3", - "integrity": "sha512-EPuchwVvYPSFFIjGpH0k6wM0HQsmJ0vCk7BSl5ryxMVFIWW4hX4Kksu4PNtxfgOxDebTLkJQ8iC7zwAql0eusg==", + "version": "0.9.1", + "integrity": "sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw==", "dependencies": { + "@babel/runtime": "^7.16.7", + "@types/base16": "^1.0.2", + "@types/lodash": "^4.14.178", "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" + "color": "^3.2.1", + "csstype": "^3.0.10", + "lodash.curry": "^4.1.1" } }, + "node_modules/react-base16-styling/node_modules/csstype": { + "version": "3.1.1", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, "node_modules/react-bootstrap-slider": { "version": "2.1.5", "integrity": "sha512-7rO3JlCVIpr+XtwiSfg8r+MPqyl9KdLI61pNuSMBYYQZ42IWBC+kk/UDyYevp76aGAMtd9SCW8erxOvq+VpekQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dependencies": { "bootstrap-slider": "9.9.0", "es6bindall": "^0.0.9" @@ -38295,16 +42244,26 @@ "integrity": "sha512-3U8owtxLBekUu6qn+evqlI9S2Q4bTrY5cJqDhg4CzyQJzKSwdUhztE40Hvg+1azpylQgMDUK38uvKGpgcK27fA==" }, "node_modules/react-checkbox-tree": { - "version": "1.5.1", - "integrity": "sha512-fBLMVpd7/YXavzIBz+3OMS5eo2oZLW9PlTY4M1zrJ3TdZRzgILicSzRj6V5VKKm80y8uQXn60skn98pwn3i3Ig==", + "version": "1.8.0", + "integrity": "sha512-ufC4aorihOvjLpvY1beab2hjVLGZbDTFRzw62foG0+th+KX7e/sdmWu/nD1ZS/U5Yr0rWGwedGH5GOtR0IkUXw==", "dependencies": { "classnames": "^2.2.5", "lodash": "^4.17.10", - "nanoid": "^2.0.0", + "nanoid": "^3.0.0", "prop-types": "^15.5.8" }, "peerDependencies": { - "react": "^15.3.0 || ^16.0.0" + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-checkbox-tree/node_modules/nanoid": { + "version": "3.3.4", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/react-color": { @@ -38327,16 +42286,45 @@ } }, "node_modules/react-datetime": { - "version": "3.0.4", - "integrity": "sha512-v6MVwCve+DRaLN2f22LTO5TlrPpkUXumPkp1zfrbhaFtSYGl2grZ2JtwJfLxRj/T4ACyePAV4srCR6cMSiQ/Iw==", + "version": "3.2.0", + "integrity": "sha512-w5XdeNIGzBht9CadaZIJhKUhEcDTgH0XokKxGPCxeeJRYL7B3HIKA8CM6Q0xej2JFJt0n5d+zi3maMwaY3262A==", "dependencies": { "prop-types": "^15.5.7" }, "peerDependencies": { "moment": "^2.16.0", - "react": "^16.5.0" + "react": "^16.5.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-diff-viewer-continued": { + "version": "3.2.5", + "integrity": "sha512-oqRzPl37ixHQNhARUCX782DT1Ae1Di4oNN2csq4WyFZLWGRR+sw7A5jcuhDEh6IyIEIRtWyd5BBfubSjur98tQ==", + "dependencies": { + "classnames": "^2.3.1", + "diff": "^5.1.0", + "emotion": "^10.0.27", + "memoize-one": "^6.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 8" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-diff-viewer-continued/node_modules/diff": { + "version": "5.1.0", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/react-diff-viewer-continued/node_modules/memoize-one": { + "version": "6.0.0", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, "node_modules/react-dnd": { "version": "11.1.3", "integrity": "sha512-8rtzzT8iwHgdSC89VktwhqdKKtfXaAyC4wiqp0SywpHG12TTLvfOoL6xNEIUWXwIEWu+CFfDn4GZJyynCEuHIQ==", @@ -38497,13 +42485,13 @@ } }, "node_modules/react-hot-loader": { - "version": "4.13.0", - "integrity": "sha512-JrLlvUPqh6wIkrK2hZDfOyq/Uh/WeVEr8nc7hkn2/3Ul0sx1Kr5y4kOGNacNRoj7RhwLNcQ3Udf1KJXrqc0ZtA==", + "version": "4.13.1", + "integrity": "sha512-ZlqCfVRqDJmMXTulUGic4lN7Ic1SXgHAFw7y/Jb7t25GBgTR0fYAJ8uY4mrpxjRyWGWmqw77qJQGnYbzCvBU7g==", "dependencies": { "fast-levenshtein": "^2.0.6", "global": "^4.3.0", "hoist-non-react-statics": "^3.3.0", - "loader-utils": "^1.1.0", + "loader-utils": "^2.0.3", "prop-types": "^15.6.1", "react-lifecycles-compat": "^3.0.4", "shallowequal": "^1.1.0", @@ -38513,9 +42501,9 @@ "node": ">= 6" }, "peerDependencies": { - "@types/react": "^15.0.0 || ^16.0.0 || ^17.0.0 ", - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 ", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 " + "@types/react": "^15.0.0 || ^16.0.0 || ^17.0.0", + "react": "^15.0.0 || ^16.0.0 || ^17.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -38523,6 +42511,28 @@ } } }, + "node_modules/react-hot-loader/node_modules/json5": { + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-hot-loader/node_modules/loader-utils": { + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, "node_modules/react-hot-loader/node_modules/source-map": { "version": "0.7.3", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", @@ -38530,14 +42540,6 @@ "node": ">= 8" } }, - "node_modules/react-icons": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.7.1.tgz", - "integrity": "sha512-yHd3oKGMgm7zxo3EA7H2n7vxSoiGmHk5t6Ou4bXsfcgWyhfDKMpyKfhHR6Bjnn63c+YXBLBPUql9H4wPJM6sXw==", - "peerDependencies": { - "react": "*" - } - }, "node_modules/react-input-autosize": { "version": "2.2.2", "integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==", @@ -38560,9 +42562,16 @@ "react": "^16.8.4 || ^17.0.0" } }, + "node_modules/react-intersection-observer": { + "version": "9.4.1", + "integrity": "sha512-IXpIsPe6BleFOEHKzKh5UjwRUaz/JYS0lT/HPsupWEQou2hDqjhLMStc5zyE3eQVT4Fk3FufM8Fw33qW1uyeiw==", + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-is": { - "version": "16.6.3", - "integrity": "sha512-u7FDWtthB4rWibG/+mFbVd5FvdI20yde86qKGx4lVUTWmPlSWQ4QxbBIrrs+HnXGbxOUlUzTAP/VDmvCwaP2yA==" + "version": "16.13.1", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-js-cron": { "version": "1.2.0", @@ -38574,27 +42583,33 @@ } }, "node_modules/react-json-tree": { - "version": "0.11.2", - "integrity": "sha512-aYhUPj1y5jR3ZQ+G3N7aL8FbTyO03iLwnVvvEikLcNFqNTyabdljo9xDftZndUBFyyyL0aK3qGO9+8EilILHUw==", + "version": "0.17.0", + "integrity": "sha512-hcWjibI/fAvsKnfYk+lka5OrE1Lvb1jH5pSnFhIU5T8cCCxB85r6h/NOzDPggSSgErjmx4rl3+2EkeclIKBOhg==", "dependencies": { - "babel-runtime": "^6.6.1", - "prop-types": "^15.5.8", - "react-base16-styling": "^0.5.1" + "@babel/runtime": "^7.18.3", + "@types/lodash": "^4.14.182", + "@types/prop-types": "^15.7.5", + "prop-types": "^15.8.1", + "react-base16-styling": "^0.9.1" }, "peerDependencies": { - "react": "^15.0.0 || ^16.0.0", - "react-dom": "^15.0.0 || ^16.0.0" + "@types/react": "^16.3.0 || ^17.0.0 || ^18.0.0", + "react": "^16.3.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-jsonschema-form": { - "version": "1.2.0", - "integrity": "sha512-rR77qoFiQ5TxDYwsJz8UWmDner4jQ4xMnDqeV6Nvg7GtoEyOUoTVkI/SBMEzfXuF/piWZXYjquP96Hy/2L7C+Q==", + "version": "1.8.1", + "integrity": "sha512-aaDloxNAcGXOOOcdKOxxqEEn5oDlPUZgWcs8unXXB9vjBRgCF8rCm/wVSv1u2G5ih0j/BX6Ewd/WjI2g00lPdg==", + "deprecated": "react-jsonschema-form has been moved to @rjsf/core", "dependencies": { - "ajv": "^5.2.3", - "babel-runtime": "^6.26.0", + "@babel/runtime-corejs2": "^7.4.5", + "ajv": "^6.7.0", "core-js": "^2.5.7", - "lodash.topath": "^4.5.2", - "prop-types": "^15.5.8" + "lodash": "^4.17.15", + "prop-types": "^15.5.8", + "react-is": "^16.8.4", + "react-lifecycles-compat": "^3.0.4", + "shortid": "^2.2.14" }, "engines": { "node": ">=6", @@ -38604,30 +42619,12 @@ "react": ">=15" } }, - "node_modules/react-jsonschema-form/node_modules/ajv": { - "version": "5.5.2", - "integrity": "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==", - "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, "node_modules/react-jsonschema-form/node_modules/core-js": { "version": "2.6.9", "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", "hasInstallScript": true }, - "node_modules/react-jsonschema-form/node_modules/fast-deep-equal": { - "version": "1.1.0", - "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==" - }, - "node_modules/react-jsonschema-form/node_modules/json-schema-traverse": { - "version": "0.3.1", - "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==" - }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" @@ -38651,15 +42648,17 @@ } }, "node_modules/react-map-gl": { - "version": "4.1.16", - "integrity": "sha512-EtiHCeqM69wKR9RDyLvtk6pTPS5+OFeAPIsYw6afnlGTauFAq3iD40SHuAOElgoJmm7J+cjPfHqu7m7tB4/FfA==", + "version": "6.1.19", + "integrity": "sha512-rrDoRyEIGzVLUB5QfgsZ5xCw7jeUtmmYzHUv86xDx8oGp90VTV2KTQJ4RPQiSAmpfIFh6/pPqI28Pguf1u/mOg==", "dependencies": { "@babel/runtime": "^7.0.0", - "mapbox-gl": "~0.54.0", - "mjolnir.js": "^2.2.0", + "@types/geojson": "^7946.0.7", + "@types/mapbox-gl": "^2.0.3", + "mapbox-gl": "^2.3.0", + "mjolnir.js": "^2.5.0", "prop-types": "^15.7.2", - "react-virtualized-auto-sizer": "^1.0.2", - "viewport-mercator-project": "^6.2.1" + "resize-observer-polyfill": "^1.5.1", + "viewport-mercator-project": "^7.0.4" }, "engines": { "node": ">= 4", @@ -38669,60 +42668,16 @@ "react": ">=16.3.0" } }, - "node_modules/react-map-gl/node_modules/esm": { - "version": "3.0.84", - "integrity": "sha512-SzSGoZc17S7P+12R9cg21Bdb7eybX25RnIeRZ80xZs+VZ3kdQKzqTp2k4hZJjR7p9l0186TTXSgrxzlMDBktlw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/react-map-gl/node_modules/mapbox-gl": { - "version": "0.54.1", - "integrity": "sha512-HtY+HobYTHTsFOJ3buTHtNvZv/Tjfp0vararhEWCjI7wQq8XxK16sEpsXucokrAhuu94js4KJylo13bKJx6l0Q==", - "dependencies": { - "@mapbox/geojson-rewind": "^0.4.0", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.4.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.0", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.2", - "earcut": "^2.1.5", - "esm": "~3.0.84", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.0.0", - "grid-index": "^1.1.0", - "minimist": "0.0.8", - "murmurhash-js": "^1.0.0", - "pbf": "^3.0.5", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^6.0.1", - "tinyqueue": "^2.0.0", - "vt-pbf": "^3.1.1" - }, - "engines": { - "node": ">=6.4.0" - } - }, - "node_modules/react-map-gl/node_modules/minimist": { - "version": "0.0.8", - "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==" - }, - "node_modules/react-map-gl/node_modules/supercluster": { - "version": "6.0.2", - "integrity": "sha512-aa0v2HURjBTOpbcknilcfxGDuArM8khklKSmZ/T8ZXL0BuRwb5aRw95lz+2bmWpFvCXDX/+FzqHxmg0TIaJErw==", + "node_modules/react-map-gl/node_modules/viewport-mercator-project": { + "version": "7.0.4", + "integrity": "sha512-0jzpL6pIMocCKWg1C3mqi/N4UPgZC3FzwghEm1H+XsUo8hNZAyJc3QR7YqC816ibOR8aWT5pCsV+gCu8/BMJgg==", "dependencies": { - "kdbush": "^3.0.0" + "@math.gl/web-mercator": "^3.5.5" } }, "node_modules/react-markdown": { - "version": "8.0.4", - "integrity": "sha512-2oxHa6oDxc1apg/Gnc1Goh06t3B617xeywqI/92wmDV9FELI6ayRkwge7w7DoEqM0gRpZGTNU6xQG+YpJISnVg==", + "version": "8.0.3", + "integrity": "sha512-We36SfqaKoVNpN1QqsZwWSv/OZt5J15LNgTLWynwAN5b265hrQrsjMtlRNwUvS+YyR3yDM8HpTNc4pK9H/Gc0A==", "dependencies": { "@types/hast": "^2.0.0", "@types/prop-types": "^15.0.0", @@ -38750,16 +42705,16 @@ } }, "node_modules/react-markdown/node_modules/comma-separated-tokens": { - "version": "2.0.3", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "version": "2.0.2", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/react-markdown/node_modules/property-information": { - "version": "6.2.0", - "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", + "version": "6.1.1", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -38770,8 +42725,8 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/react-markdown/node_modules/space-separated-tokens": { - "version": "2.0.2", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "version": "2.0.1", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -38816,19 +42771,65 @@ "react-dom": "^16.6.0 || ^17.0.0" } }, - "node_modules/react-redux": { - "version": "7.2.0", - "integrity": "sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA==", + "node_modules/react-query": { + "version": "3.39.2", + "integrity": "sha512-F6hYDKyNgDQfQOuR1Rsp3VRzJnWHx6aRnnIZHMNGGgbL3SBgpZTDg8MQwmxOgpCAoqZJA+JSNCydF1xGJqKOCA==", "dependencies": { "@babel/runtime": "^7.5.5", - "hoist-non-react-statics": "^3.3.0", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-query/node_modules/broadcast-channel": { + "version": "3.7.0", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, + "node_modules/react-query/node_modules/unload": { + "version": "2.2.0", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, + "node_modules/react-redux": { + "version": "7.2.8", + "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", "loose-envify": "^1.4.0", "prop-types": "^15.7.2", - "react-is": "^16.9.0" + "react-is": "^17.0.2" }, "peerDependencies": { - "react": "^16.8.3", - "redux": "^2.0.0 || ^3.0.0 || ^4.0.0-0" + "react": "^16.8.3 || ^17 || ^18" }, "peerDependenciesMeta": { "react-dom": { @@ -38840,8 +42841,8 @@ } }, "node_modules/react-redux/node_modules/react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "version": "17.0.2", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/react-refresh": { "version": "0.11.0", @@ -38862,36 +42863,32 @@ } }, "node_modules/react-resize-detector": { - "version": "6.7.6", - "integrity": "sha512-/6RZlul1yePSoYJxWxmmgjO320moeLC/khrwpEVIL+D2EjLKhqOwzFv+H8laMbImVj7Zu4FlMa0oA7au3/ChjQ==", + "version": "7.1.2", + "integrity": "sha512-zXnPJ2m8+6oq9Nn8zsep/orts9vQv3elrpA+R8XTcW7DVVUJ9vwDwMXaBtykAYjMnkCIaOoK9vObyR7ZgFNlOw==", "dependencies": { - "@types/resize-observer-browser": "^0.1.6", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "resize-observer-polyfill": "^1.5.1" + "lodash": "^4.17.21" }, "peerDependencies": { - "react": "^16.0.0 || ^17.0.0", - "react-dom": "^16.0.0 || ^17.0.0" + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-reverse-portal": { - "version": "2.0.1", - "integrity": "sha512-sj/D9nSHspqV8i8hWkTSZ5Ohnrqk2A5fkDKw4Xe/zV4OfF1UYwmbzrxLdmNRdKkWgQwnXIxaa2E3FC7QYdZAeA==", + "version": "2.1.1", + "integrity": "sha512-FzuVLYEigKPB0NuMNLWymCgVp+P1h1MY57fQxhmY22idzz6El1rsXK5+bQ+wXvEa0smUtqTDcpM77epnXDV9wg==", "peerDependencies": { - "react": "^16.0.0", - "react-dom": "^16.0.0" + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-router": { - "version": "5.1.2", - "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", + "version": "5.3.4", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "dependencies": { - "@babel/runtime": "^7.1.2", + "@babel/runtime": "^7.12.13", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.3.0", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", @@ -38903,14 +42900,14 @@ } }, "node_modules/react-router-dom": { - "version": "5.1.2", - "integrity": "sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==", + "version": "5.3.4", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", "dependencies": { - "@babel/runtime": "^7.1.2", + "@babel/runtime": "^7.12.13", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.1.2", + "react-router": "5.3.4", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" }, @@ -38945,8 +42942,8 @@ } }, "node_modules/react-select": { - "version": "3.1.0", - "integrity": "sha512-wBFVblBH1iuCBprtpyGtd1dGMadsG36W5/t2Aj8OE6WbByDg5jIFyT7X5gT+l0qmT5TqWhxX+VsKJvCEl2uL9g==", + "version": "3.2.0", + "integrity": "sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ==", "dependencies": { "@babel/runtime": "^7.4.4", "@emotion/cache": "^10.0.9", @@ -38954,12 +42951,12 @@ "@emotion/css": "^10.0.9", "memoize-one": "^5.0.0", "prop-types": "^15.6.0", - "react-input-autosize": "^2.2.2", + "react-input-autosize": "^3.0.0", "react-transition-group": "^4.3.0" }, "peerDependencies": { - "react": "^16.8.0", - "react-dom": "^16.8.0" + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" } }, "node_modules/react-select/node_modules/@emotion/cache": { @@ -38980,6 +42977,16 @@ "csstype": "^2.6.7" } }, + "node_modules/react-select/node_modules/react-input-autosize": { + "version": "3.0.0", + "integrity": "sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0" + } + }, "node_modules/react-select/node_modules/react-transition-group": { "version": "4.4.1", "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", @@ -39005,8 +43012,8 @@ } }, "node_modules/react-sortable-hoc": { - "version": "1.11.0", - "integrity": "sha512-v1CDCvdfoR3zLGNp6qsBa4J1BWMEVH25+UKxF/RvQRh+mrB+emqtVHMgZ+WreUiKJoEaiwYoScaueIKhMVBHUg==", + "version": "2.0.0", + "integrity": "sha512-JZUw7hBsAHXK7PTyErJyI7SopSBFRcFHDjWW5SWjcugY0i6iH7f+eJkY8cJmGMlZ1C9xz1J3Vjz0plFpavVeRg==", "dependencies": { "@babel/runtime": "^7.2.0", "invariant": "^2.2.4", @@ -39014,8 +43021,8 @@ }, "peerDependencies": { "prop-types": "^15.5.7", - "react": "^0.14.0 || ^15.0.0 || ^16.0.0", - "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0" + "react": "^16.3.0 || ^17.0.0", + "react-dom": "^16.3.0 || ^17.0.0" } }, "node_modules/react-split": { @@ -39046,18 +43053,6 @@ "version": "1.6.2", "integrity": "sha512-72C7zcQePzlmWqPOKkB2Ro0sUmnWSx+qEWXjLJKk6Qp4jAkFRz1hJgJb+ay6ZQyz/Aw9r8N/PZiCEKbPVpFoDQ==" }, - "node_modules/react-sticky": { - "version": "6.0.3", - "integrity": "sha512-LNH4UJlRatOqo29/VHxDZOf6fwbgfgcHO4mkEFvrie5FuaZCSTGtug5R8NGqJ0kSnX8gHw8qZN37FcvnFBJpTQ==", - "dependencies": { - "prop-types": "^15.5.8", - "raf": "^3.3.0" - }, - "peerDependencies": { - "react": ">=15", - "react-dom": ">=15" - } - }, "node_modules/react-style-proptype": { "version": "3.2.2", "integrity": "sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==", @@ -39087,14 +43082,14 @@ } }, "node_modules/react-table": { - "version": "7.6.3", - "integrity": "sha512-hfPF13zDLxPMpLKzIKCE8RZud9T/XrRTsaCIf8zXpWZIZ2juCl7qrGpo3AQw9eAetXV5DP7s2GDm+hht7qq5Dw==", + "version": "7.8.0", + "integrity": "sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "react": "^16.8.3 || ^17.0.0-0" + "react": "^16.8.3 || ^17.0.0-0 || ^18.0.0" } }, "node_modules/react-test-renderer": { @@ -39111,11 +43106,6 @@ "react": "^16.0.0" } }, - "node_modules/react-test-renderer/node_modules/react-is": { - "version": "16.9.0", - "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", - "dev": true - }, "node_modules/react-textarea-autosize": { "version": "8.3.3", "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", @@ -39146,15 +43136,15 @@ } }, "node_modules/react-ultimate-pagination": { - "version": "1.2.0", - "integrity": "sha512-tBLzzskuBqsziQDUI98hA7FTBy2/Q5olRsvu3GdLYykfGUgDvYQOI7hLi9o5pD5zJeuAsVn3OoAUw0CaJi0WoQ==", + "version": "1.3.0", + "integrity": "sha512-Nvf+PjncTqBW/wHgO4FM3EX7VzrUf13CnpElREUgZloG2BiEQkGseDS2r5p3h/TIvLfLb602IeaihQFJbUSt0A==", "dependencies": { "prop-types": "^15.0.0", "ultimate-pagination": "1.0.0" }, "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16.0.0", - "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0" + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", + "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/react-virtualized": { @@ -39174,46 +43164,19 @@ } }, "node_modules/react-virtualized-auto-sizer": { - "version": "1.0.6", - "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==", + "version": "1.0.7", + "integrity": "sha512-Mxi6lwOmjwIjC1X4gABXMJcKHsOo0xWl3E3ugOgufB8GJU+MqrtY35aBuvCYv/razQ1Vbp7h1gWJjGjoNN5pmA==", "engines": { "node": ">8.0.0" }, "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0" - } - }, - "node_modules/react-virtualized-select": { - "version": "3.1.3", - "integrity": "sha512-u6j/EfynCB9s4Lz5GGZhNUCZHvFQdtLZws7W/Tcd/v03l19OjpQs3eYjK82iYS0FgD2+lDIBpqS8LpD/hjqDRQ==", - "dependencies": { - "babel-runtime": "^6.11.6", - "prop-types": "^15.5.8", - "react-select": "^1.0.0-rc.2", - "react-virtualized": "^9.0.0" - }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha", - "react-dom": "^15.3.0 || ^16.0.0-alpha" - } - }, - "node_modules/react-virtualized-select/node_modules/react-select": { - "version": "1.3.0", - "integrity": "sha512-g/QAU1HZrzSfxkwMAo/wzi6/ezdWye302RGZevsATec07hI/iSxcpB1hejFIp7V63DJ8mwuign6KmB3VjdlinQ==", - "dependencies": { - "classnames": "^2.2.4", - "prop-types": "^15.5.8", - "react-input-autosize": "^2.1.2" - }, - "peerDependencies": { - "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0", - "react-dom": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0" + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc" } }, "node_modules/react-window": { - "version": "1.8.5", - "integrity": "sha512-HeTwlNa37AFa8MDZFZOKcNEkuF2YflA0hpGPiTT9vR7OawEt+GZbfM6wqkBahD3D3pUjIabQYzsnY/BSJbgq6Q==", + "version": "1.8.8", + "integrity": "sha512-D4IiBeRtGXziZ1n0XklnFGu7h9gU684zepqyKzgPNzrsrk7xOCxni+TCckjg2Nr/DiaEEGVVmnhYSlT2rB47dQ==", "dependencies": { "@babel/runtime": "^7.0.0", "memoize-one": ">=3.1.1 <6" @@ -39222,8 +43185,8 @@ "node": ">8.0.0" }, "peerDependencies": { - "react": "^15.0.0 || ^16.0.0", - "react-dom": "^15.0.0 || ^16.0.0" + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-with-styles": { @@ -39279,41 +43242,18 @@ "node": ">=0.8" } }, - "node_modules/read-chunk": { - "version": "3.2.0", - "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", - "dependencies": { - "pify": "^4.0.1", - "with-open-file": "^0.1.6" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-chunk/node_modules/pify": { - "version": "4.0.1", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/read-cmd-shim": { - "version": "2.0.0", - "integrity": "sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw==", - "dev": true - }, "node_modules/read-package-json": { - "version": "3.0.1", - "integrity": "sha512-aLcPqxovhJTVJcsnROuuzQvv6oziQx4zd3JvG0vGCL5MjTONUc4uJ90zCBC6R7W7oUKBNoR/F8pkyfVwlbxqng==", + "version": "5.0.2", + "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", "dev": true, "dependencies": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^2.0.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/read-package-json-fast": { @@ -39328,45 +43268,87 @@ "node": ">=10" } }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "8.0.3", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/read-package-json/node_modules/hosted-git-info": { - "version": "4.1.0", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "version": "5.2.1", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/read-package-json/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "7.14.1", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "5.1.2", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, "node_modules/read-package-json/node_modules/normalize-package-data": { - "version": "3.0.3", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "version": "4.0.1", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "dev": true, "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/read-package-json/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -39378,32 +43360,21 @@ "node": ">=10" } }, - "node_modules/read-package-json/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/read-package-tree": { - "version": "5.3.1", - "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", - "deprecated": "The functionality that this package provided is now in @npmcli/arborist", + "node_modules/read-package-json/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/read-package-tree/node_modules/read-package-json": { - "version": "2.1.2", - "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", - "dev": true, - "dependencies": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } + "node_modules/read-package-json/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/read-pkg": { "version": "5.2.0", @@ -39602,24 +43573,6 @@ "node": ">=8" } }, - "node_modules/redeyed": { - "version": "0.4.4", - "integrity": "sha512-pnk1vsaNLu1UAAClKsImKz9HjBvg9i8cbRqTRzJbiCjGF0fZSMqpdcA5W3juO3c4etFvTrabECkq9wjC45ZyxA==", - "dependencies": { - "esprima": "~1.0.4" - } - }, - "node_modules/redeyed/node_modules/esprima": { - "version": "1.0.4", - "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/reduce-css-calc": { "version": "1.3.0", "integrity": "sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==", @@ -39714,8 +43667,8 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { - "version": "9.0.0", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "version": "10.0.1", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "dependencies": { "regenerate": "^1.4.2" }, @@ -39724,12 +43677,12 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.7", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.13.10", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" }, "node_modules/regenerator-transform": { - "version": "0.14.5", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dependencies": { "@babel/runtime": "^7.8.4" } @@ -39767,11 +43720,12 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.3.0", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "version": "1.4.3", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dependencies": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -39792,13 +43746,13 @@ } }, "node_modules/regexpu-core": { - "version": "4.8.0", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "version": "5.1.0", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" }, @@ -39807,12 +43761,12 @@ } }, "node_modules/regjsgen": { - "version": "0.5.2", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + "version": "0.6.0", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" }, "node_modules/regjsparser": { - "version": "0.7.0", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "version": "0.8.4", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "dependencies": { "jsesc": "~0.5.0" }, @@ -40190,8 +44144,8 @@ } }, "node_modules/remark-mdx/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -40506,7 +44460,8 @@ }, "node_modules/remove-trailing-separator": { "version": "1.1.0", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "devOptional": true }, "node_modules/renderkid": { "version": "2.0.7", @@ -40534,8 +44489,8 @@ } }, "node_modules/renderkid/node_modules/css-what": { - "version": "5.0.1", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "version": "5.1.0", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "engines": { "node": ">= 6" }, @@ -40638,13 +44593,6 @@ "node": ">=0.10" } }, - "node_modules/replace-ext": { - "version": "1.0.0", - "integrity": "sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/request": { "version": "2.88.2", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", @@ -40807,7 +44755,7 @@ "node_modules/restore-cursor": { "version": "3.1.0", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "devOptional": true, + "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -40906,7 +44854,7 @@ "node_modules/rxjs": { "version": "6.6.7", "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "devOptional": true, + "dev": true, "dependencies": { "tslib": "^1.9.0" }, @@ -40935,6 +44883,18 @@ "ret": "~0.1.10" } }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" @@ -41020,23 +44980,26 @@ "dev": true }, "node_modules/selfsigned": { - "version": "1.10.11", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "version": "2.0.1", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "dependencies": { - "node-forge": "^0.10.0" + "node-forge": "^1" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver": { - "version": "5.6.0", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.1", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "bin": { "semver": "bin/semver" } }, "node_modules/send": { - "version": "0.17.1", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "dependencies": { "debug": "2.6.9", "depd": "~1.1.2", @@ -41045,9 +45008,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -41057,14 +45020,14 @@ } }, "node_modules/send/node_modules/http-errors": { - "version": "1.7.3", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "1.8.1", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", - "setprototypeof": "1.1.1", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" @@ -41075,19 +45038,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/send/node_modules/setprototypeof": { - "version": "1.1.1", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "node_modules/send/node_modules/statuses": { - "version": "1.5.0", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } + "version": "1.2.0", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/serialize-javascript": { "version": "4.0.0", @@ -41143,40 +45099,22 @@ } }, "node_modules/serve-static": { - "version": "1.14.1", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/serve-static/node_modules/parseurl": { - "version": "1.3.3", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, - "node_modules/set-getter": { - "version": "0.1.1", - "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", - "optional": true, - "dependencies": { - "to-object-path": "^0.3.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/set-value": { "version": "2.0.1", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", @@ -41260,25 +45198,10 @@ "node": ">=0.4.0" } }, - "node_modules/sharkdown": { - "version": "0.1.1", - "integrity": "sha512-exwooSpmo5s45lrexgz6Q0rFQM574wYIX3iDZ7RLLqOb7IAoQZu9nxlZODU972g19sR69OIpKP2cpHTzU+PHIg==", - "dependencies": { - "cardinal": "~0.4.2", - "minimist": "0.0.5", - "split": "~0.2.10" - }, - "bin": { - "sharkdown": "sharkdown" - } - }, - "node_modules/sharkdown/node_modules/minimist": { - "version": "0.0.5", - "integrity": "sha512-rSJ0cdmCj3qmKdObcnMcWgPVOyaOWlazLhZAJW0s6G6lx1ZEuFkraWmEH5LTvX90btkfHPclQBjvjU7A/kYRFg==" - }, "node_modules/shebang-command": { "version": "1.2.0", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, "dependencies": { "shebang-regex": "^1.0.0" }, @@ -41289,6 +45212,7 @@ "node_modules/shebang-regex": { "version": "1.0.0", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -41352,8 +45276,19 @@ "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" }, "node_modules/signal-exit": { - "version": "3.0.3", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.7", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sinon": { "version": "9.0.2", @@ -41432,14 +45367,6 @@ "node": ">=8" } }, - "node_modules/slide": { - "version": "1.1.6", - "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", @@ -41558,22 +45485,30 @@ } }, "node_modules/sockjs": { - "version": "0.3.21", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "dependencies": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/socks": { - "version": "2.6.1", - "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", + "version": "2.7.1", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" }, "engines": { "node": ">= 10.13.0", @@ -41581,21 +45516,21 @@ } }, "node_modules/socks-proxy-agent": { - "version": "5.0.1", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "version": "7.0.0", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "dependencies": { "agent-base": "^6.0.2", - "debug": "4", - "socks": "^2.3.3" + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { - "node": ">= 6" + "node": ">= 10" } }, "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -41614,10 +45549,14 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, "node_modules/sort-keys": { "version": "4.2.0", "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", - "dev": true, "dependencies": { "is-plain-obj": "^2.0.0" }, @@ -41631,7 +45570,6 @@ "node_modules/sort-keys/node_modules/is-plain-obj": { "version": "2.1.0", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, "engines": { "node": ">=8" } @@ -41878,8 +45816,9 @@ "dev": true }, "node_modules/split": { - "version": "0.2.10", - "integrity": "sha512-e0pKq+UUH2Xq/sXbYpZBZc3BawsfDZ7dgv+JtRTUPNcvF5CMR4Y9cvJqkMY0MoxWzTHvZuz1beg6pNEKlszPiQ==", + "version": "1.0.1", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, "dependencies": { "through": "2" }, @@ -41986,14 +45925,6 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" }, - "node_modules/stack-trace": { - "version": "0.0.10", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/stack-utils": { "version": "2.0.3", "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", @@ -42113,9 +46044,8 @@ } }, "node_modules/statuses": { - "version": "1.4.0", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true, + "version": "1.5.0", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "engines": { "node": ">= 0.6" } @@ -42275,10 +46205,6 @@ "node": ">=8" } }, - "node_modules/string-template": { - "version": "0.2.1", - "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==" - }, "node_modules/string-width": { "version": "2.1.1", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", @@ -42353,35 +46279,40 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.0", - "integrity": "sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==", + "version": "1.2.7", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.13.0", - "function-bind": "^1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.6", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.6", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -42405,40 +46336,6 @@ "node": ">=4" } }, - "node_modules/strip-bom-buf": { - "version": "1.0.0", - "integrity": "sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==", - "optional": true, - "dependencies": { - "is-utf8": "^0.2.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-bom-stream": { - "version": "2.0.0", - "integrity": "sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==", - "optional": true, - "dependencies": { - "first-chunk-stream": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-bom-stream/node_modules/strip-bom": { - "version": "2.0.0", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "optional": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-comments": { "version": "2.0.1", "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", @@ -42458,7 +46355,6 @@ "node_modules/strip-final-newline": { "version": "2.0.0", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "devOptional": true, "engines": { "node": ">=6" } @@ -42652,11 +46548,14 @@ } }, "node_modules/svgo/node_modules/css-what": { - "version": "3.2.1", - "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", + "version": "3.4.2", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true, "engines": { "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/svgo/node_modules/domutils": { @@ -42932,54 +46831,6 @@ "node": ">=4" } }, - "node_modules/temp-write": { - "version": "4.0.0", - "integrity": "sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "is-stream": "^2.0.0", - "make-dir": "^3.0.0", - "temp-dir": "^1.0.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/temp-write/node_modules/is-stream": { - "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/temp-write/node_modules/make-dir": { - "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/temp-write/node_modules/semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/term-size": { "version": "2.2.1", "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", @@ -43007,8 +46858,8 @@ } }, "node_modules/terser": { - "version": "4.6.3", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "version": "4.8.1", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", "dependencies": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -43241,12 +47092,12 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.13.1", - "integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==", + "version": "5.14.2", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dependencies": { + "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "bin": { @@ -43256,16 +47107,6 @@ "node": ">=10" } }, - "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { - "version": "0.8.0-beta.0", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/terser-webpack-plugin/node_modules/webpack-sources": { "version": "1.4.3", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", @@ -43274,15 +47115,6 @@ "source-map": "~0.6.1" } }, - "node_modules/terser-webpack-plugin/node_modules/whatwg-url": { - "version": "7.1.0", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, "node_modules/terser-webpack-plugin/node_modules/yallist": { "version": "4.0.0", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" @@ -43356,12 +47188,9 @@ } }, "node_modules/thread-loader/node_modules/json5": { - "version": "2.2.0", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -43370,8 +47199,8 @@ } }, "node_modules/thread-loader/node_modules/loader-utils": { - "version": "2.0.0", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "dependencies": { "big.js": "^5.2.2", @@ -43396,7 +47225,8 @@ }, "node_modules/through": { "version": "2.3.8", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true }, "node_modules/through2": { "version": "2.0.5", @@ -43411,13 +47241,6 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "node_modules/timed-out": { - "version": "4.0.1", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/timers-browserify": { "version": "2.0.12", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", @@ -43557,8 +47380,8 @@ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, "node_modules/toidentifier": { - "version": "1.0.0", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } @@ -43606,6 +47429,7 @@ "node_modules/tr46": { "version": "1.0.1", "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -43632,7 +47456,8 @@ }, "node_modules/trim": { "version": "0.0.1", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", + "deprecated": "Use String.prototype.trim() instead" }, "node_modules/trim-lines": { "version": "3.0.1", @@ -43913,6 +47738,18 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray": { "version": "0.0.6", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" @@ -43972,34 +47809,21 @@ "node": ">=0.8.0" } }, - "node_modules/uid-number": { - "version": "0.0.6", - "integrity": "sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/ultimate-pagination": { "version": "1.0.0", "integrity": "sha512-bJNroO5GM11McB9RJ1rHZGiXV/jU89Qwc6U5wR8jZuk0uFVajIvUDGPiROVvNMApvh7Ij3cPoeG5V3UlF4GvOA==" }, - "node_modules/umask": { - "version": "1.1.0", - "integrity": "sha512-lE/rxOhmiScJu9L6RTNVgB/zZbF+vGC0/p6D3xnkAePI2o0sMyFG966iR5Ki50OI/0mNi2yaRnxfLsPmEZF/JA==", - "dev": true - }, "node_modules/un-eval": { "version": "1.2.0", "integrity": "sha512-Wlj/pum6dQtGTPD/lclDtoVPkSfpjPfy1dwnnKw/sZP5DpBH9fLhBgQfsqNhe5/gS1D+vkZUuB771NRMUPA5CA==" }, "node_modules/unbox-primitive": { - "version": "1.0.1", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { @@ -44039,8 +47863,8 @@ } }, "node_modules/underscore": { - "version": "1.12.0", - "integrity": "sha512-21rQzss/XPMjolTiIezSu3JAjgagXKROtNrYFEOWK109qY1Uv2tVjPTZ1ci2HgvQDA16gHYSthQIJfB+XId/rQ==" + "version": "1.13.6", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/unfetch": { "version": "4.2.0", @@ -44273,6 +48097,10 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/universal-user-agent": { + "version": "6.0.0", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + }, "node_modules/universalify": { "version": "2.0.0", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", @@ -44340,13 +48168,6 @@ "node": ">=0.10.0" } }, - "node_modules/unzip-response": { - "version": "2.0.1", - "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==", - "engines": { - "node": ">=4" - } - }, "node_modules/upath": { "version": "1.2.0", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", @@ -44356,6 +48177,34 @@ "yarn": "*" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.5", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-browserslist-db/node_modules/picocolors": { + "version": "1.0.0", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "node_modules/uri-js": { "version": "4.2.2", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", @@ -44406,8 +48255,8 @@ } }, "node_modules/url-loader/node_modules/json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -44416,8 +48265,8 @@ } }, "node_modules/url-loader/node_modules/loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -44436,16 +48285,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/url-parse-lax": { - "version": "1.0.0", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/url/node_modules/punycode": { "version": "1.3.2", "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" @@ -44468,11 +48307,11 @@ } }, "node_modules/use-immer": { - "version": "0.6.0", - "integrity": "sha512-dFGRfvWCqPDTOt/S431ETYTg6+uxbpb7A1pptufwXVzGJY3RlXr38+3wyLNpc6SbbmAKjWl6+EP6uW74fkEsXQ==", + "version": "0.8.1", + "integrity": "sha512-OfTFf1pL+ICjjcLPn9+ZnaJO/Yg4MBzYZtACEe2mZ/W2A5col28PNUnwowOAaBuOogACOK/37TU17KgsIhUpOw==", "peerDependencies": { "immer": ">=2.0.0", - "react": "^16.8.0 || ^17.0.1" + "react": "^16.8.0 || ^17.0.1 || ^18.0.0" } }, "node_modules/use-isomorphic-layout-effect": { @@ -44524,14 +48363,6 @@ "version": "1.0.2", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/util-promisify": { - "version": "2.1.0", - "integrity": "sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA==", - "dev": true, - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, "node_modules/util.promisify": { "version": "1.0.0", "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", @@ -44680,8 +48511,8 @@ } }, "node_modules/vfile": { - "version": "5.3.6", - "integrity": "sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==", + "version": "5.3.5", + "integrity": "sha512-U1ho2ga33eZ8y8pkbQLH54uKqGhFJ6GYIHnnG5AhRpAh3OWjkrRHKa/KogbmQn8We+c0KVV3rTOgR9V/WowbXQ==", "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", @@ -44706,8 +48537,8 @@ } }, "node_modules/vfile-message": { - "version": "3.1.3", - "integrity": "sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==", + "version": "3.1.2", + "integrity": "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^3.0.0" @@ -44746,52 +48577,37 @@ "gl-matrix": "^3.0.0" } }, - "node_modules/vinyl": { - "version": "2.2.1", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } + "node_modules/vlq": { + "version": "0.2.3", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" }, - "node_modules/vinyl-file": { - "version": "3.0.0", - "integrity": "sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==", - "optional": true, + "node_modules/vm-browserify": { + "version": "1.1.2", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "node_modules/vm2": { + "version": "3.9.13", + "integrity": "sha512-0rvxpB8P8Shm4wX2EKOiMp7H2zq+HUE/UwodY0pCZXs9IffIKZq6vUti5OgkVCTakKo9e/fgO4X1fkwfjWxE3Q==", + "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.3.0", - "strip-bom-buf": "^1.0.0", - "strip-bom-stream": "^2.0.0", - "vinyl": "^2.0.1" + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" }, "engines": { - "node": ">=4" + "node": ">=6.0" } }, - "node_modules/vinyl-file/node_modules/pify": { - "version": "2.3.0", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "optional": true, + "node_modules/vm2/node_modules/acorn-walk": { + "version": "8.2.0", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/vlq": { - "version": "0.2.3", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, "node_modules/vt-pbf": { "version": "3.1.3", "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", @@ -44811,16 +48627,29 @@ } }, "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "version": "3.0.0", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", "dev": true, "dependencies": { - "xml-name-validator": "^3.0.0" + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" + } + }, + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { + "version": "4.0.0", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" } }, + "node_modules/walk-up-path": { + "version": "1.0.0", + "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", + "dev": true + }, "node_modules/walker": { "version": "1.0.7", "integrity": "sha512-cF4je9Fgt6sj1PKfuFt9jpQPeHosM+Ryma/hfY9U7uXGKM7pJCsF0v2r55o+Il54+i77SyYWetB4tD1dEygRkw==", @@ -44932,7 +48761,8 @@ }, "node_modules/webidl-conversions": { "version": "4.0.2", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "node_modules/webpack": { "version": "5.52.1", @@ -45239,35 +49069,39 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.2.0", - "integrity": "sha512-iBaDkHBLfW3cEITeJWNkjZBrm+b5A3YLg8XVdNOdjUNABdXJwcsJv4dzKSnVf1q4Ch489+6epWVW6OcOyVfG7w==", + "version": "4.10.1", + "integrity": "sha512-FIzMq3jbBarz3ld9l7rbM7m6Rj1lOsgq/DyLGMX/fPEB1UBUPtf5iL/4eNfhx8YYJTRlzfv107UfWSWcBK5Odw==", "dev": true, "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^3.5.1", - "colorette": "^1.2.2", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "del": "^6.0.0", - "express": "^4.17.1", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", - "internal-ip": "^6.2.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", - "schema-utils": "^3.1.0", - "selfsigned": "^1.10.11", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^5.1.0", - "ws": "^8.1.0" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -45275,6 +49109,10 @@ "engines": { "node": ">= 12.13.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, "peerDependencies": { "webpack": "^4.37.0 || ^5.0.0" }, @@ -45284,38 +49122,176 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "6.0.1", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.11.0", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/webpack-dev-server/node_modules/del": { - "version": "6.0.0", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/array-flatten": { + "version": "1.1.1", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/body-parser": { + "version": "1.20.0", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/webpack-dev-server/node_modules/bytes": { + "version": "3.1.2", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/colorette": { + "version": "2.0.19", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/cookie": { + "version": "0.5.0", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server/node_modules/depd": { + "version": "2.0.0", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/destroy": { + "version": "1.2.0", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/webpack-dev-server/node_modules/express": { + "version": "4.18.1", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/finalhandler": { + "version": "1.2.0", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/http-errors": { + "version": "2.0.0", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" } }, + "node_modules/webpack-dev-server/node_modules/inherits": { + "version": "2.0.4", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, "node_modules/webpack-dev-server/node_modules/is-wsl": { "version": "2.2.0", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", @@ -45327,6 +49303,27 @@ "node": ">=8" } }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/ms": { + "version": "2.1.3", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/on-finished": { + "version": "2.4.1", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/webpack-dev-server/node_modules/open": { "version": "8.2.1", "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", @@ -45343,38 +49340,136 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-dev-server/node_modules/slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/webpack-dev-server/node_modules/path-to-regexp": { + "version": "0.1.7", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/qs": { + "version": "6.10.3", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { - "node": ">=8" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "7.0.1", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/webpack-dev-server/node_modules/raw-body": { + "version": "2.5.1", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/safe-buffer": { + "version": "5.2.1", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/send": { + "version": "0.18.0", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/webpack-dev-server/node_modules/serve-static": { + "version": "1.15.0", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/webpack-dev-server/node_modules/setprototypeof": { + "version": "1.2.0", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/statuses": { + "version": "2.0.1", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.1.0", - "integrity": "sha512-oT660AR1gOnU/NTdUQi3EiGR0iXG7CFxmKsj3ylWCBA2khJ8LFHK+sKv3BZEsC11gl1eChsltRhzUq7nWj7XIQ==", + "version": "5.3.3", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, "dependencies": { - "colorette": "^1.2.2", - "memfs": "^3.2.2", + "colorette": "^2.0.10", + "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "schema-utils": "^3.1.0" + "schema-utils": "^4.0.0" }, "engines": { "node": ">= 12.13.0" @@ -45728,12 +49823,13 @@ } }, "node_modules/webpack/node_modules/terser": { - "version": "5.8.0", - "integrity": "sha512-f0JH+6yMpneYcRJN314lZrSwu9eKkUFEHLN/kNy8ceh8gaRiLgFPJqrB9HsXjhEGdv4e/ekjTOFxIlL6xlma8A==", + "version": "5.14.2", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "bin": { @@ -45777,14 +49873,6 @@ } } }, - "node_modules/webpack/node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/webpack/node_modules/watchpack": { "version": "2.2.0", "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", @@ -45818,10 +49906,6 @@ "node": ">=0.8.0" } }, - "node_modules/wgs84": { - "version": "0.0.0", - "integrity": "sha512-ANHlY4Rb5kHw40D0NJ6moaVfOCMrp9Gpd1R/AIQYg2ko4/jzcJ+TVXYYF6kXJqQwITvEZP4yEthjM7U6rYlljQ==" - }, "node_modules/whatwg-encoding": { "version": "1.0.5", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", @@ -45852,6 +49936,7 @@ "node_modules/which": { "version": "1.3.1", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -45877,6 +49962,24 @@ "version": "2.0.0", "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wide-align": { "version": "1.1.5", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", @@ -45935,32 +50038,6 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, - "node_modules/with-open-file": { - "version": "0.1.7", - "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", - "dependencies": { - "p-finally": "^1.0.0", - "p-try": "^2.1.0", - "pify": "^4.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/with-open-file/node_modules/p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/with-open-file/node_modules/pify": { - "version": "4.0.1", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "engines": { - "node": ">=6" - } - }, "node_modules/word-wrap": { "version": "1.2.3", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", @@ -46229,6 +50306,14 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/xregexp": { + "version": "2.0.0", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/xss": { "version": "1.0.10", "integrity": "sha512-qmoqrRksmzqSKvgqzN0055UFWY7OKx1/9JWeRswwEVX9fCG5jcYRxa/A2DHcmZX6VJvjzHRQ2STeeVcQkrmLSw==", @@ -46403,519 +50488,36 @@ "yon": "bin/index.js" }, "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/yarn-or-npm/node_modules/find-up": { - "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yarn-or-npm/node_modules/locate-path": { - "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yarn-or-npm/node_modules/p-limit": { - "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yarn-or-npm/node_modules/p-locate": { - "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yarn-or-npm/node_modules/p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yarn-or-npm/node_modules/path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yarn-or-npm/node_modules/pkg-dir": { - "version": "4.2.0", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yeoman-assert": { - "version": "3.1.1", - "integrity": "sha512-bCuLb/j/WzpvrJZCTdJJLFzm7KK8IYQJ3+dF9dYtNs2CUYyezFJDuULiZ2neM4eqjf45GN1KH/MzCTT3i90wUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yeoman-generator": { - "version": "4.13.0", - "integrity": "sha512-f2/5N5IR3M2Ozm+QocvZQudlQITv2DwI6Mcxfy7R7gTTzaKgvUpgo/pQMJ+WQKm0KN0YMWCFOZpj0xFGxevc1w==", - "dependencies": { - "async": "^2.6.2", - "chalk": "^2.4.2", - "cli-table": "^0.3.1", - "cross-spawn": "^6.0.5", - "dargs": "^6.1.0", - "dateformat": "^3.0.3", - "debug": "^4.1.1", - "diff": "^4.0.1", - "error": "^7.0.2", - "find-up": "^3.0.0", - "github-username": "^3.0.0", - "istextorbinary": "^2.5.1", - "lodash": "^4.17.11", - "make-dir": "^3.0.0", - "mem-fs-editor": "^7.0.1", - "minimist": "^1.2.5", - "pretty-bytes": "^5.2.0", - "read-chunk": "^3.2.0", - "read-pkg-up": "^5.0.0", - "rimraf": "^2.6.3", - "run-async": "^2.0.0", - "semver": "^7.2.1", - "shelljs": "^0.8.4", - "text-table": "^0.2.0", - "through2": "^3.0.1" - }, - "engines": { - "node": ">=10" - }, - "optionalDependencies": { - "grouped-queue": "^1.1.0", - "yeoman-environment": "^2.9.5" - } - }, - "node_modules/yeoman-generator/node_modules/@nodelib/fs.stat": { - "version": "1.1.3", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yeoman-generator/node_modules/ansi-regex": { - "version": "3.0.0", - "integrity": "sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yeoman-generator/node_modules/ansi-styles": { - "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yeoman-generator/node_modules/arrify": { - "version": "2.0.1", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yeoman-generator/node_modules/async": { - "version": "2.6.3", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/yeoman-generator/node_modules/chalk": { - "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yeoman-generator/node_modules/dargs": { - "version": "6.1.0", - "integrity": "sha512-5dVBvpBLBnPwSsYXqfybFyehMmC/EenKEcf23AhCTgTf48JFBbmJKqoZBsERDnjL0FyiVTYWdFsRfTLHxLyKdQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yeoman-generator/node_modules/debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/yeoman-generator/node_modules/dir-glob": { - "version": "2.2.2", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dependencies": { - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yeoman-generator/node_modules/error": { - "version": "7.2.1", - "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", - "dependencies": { - "string-template": "~0.2.1" - } - }, - "node_modules/yeoman-generator/node_modules/execa": { - "version": "4.1.0", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/yeoman-generator/node_modules/execa/node_modules/cross-spawn": { - "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "optional": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/yeoman-generator/node_modules/fast-glob": { - "version": "2.2.7", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dependencies": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/yeoman-generator/node_modules/find-up": { - "version": "3.0.0", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yeoman-generator/node_modules/get-stream": { - "version": "5.2.0", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "optional": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yeoman-generator/node_modules/glob-parent": { - "version": "3.1.0", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/yeoman-generator/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yeoman-generator/node_modules/globby": { - "version": "9.2.0", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yeoman-generator/node_modules/globby/node_modules/array-union": { - "version": "1.0.2", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yeoman-generator/node_modules/grouped-queue": { - "version": "1.1.0", - "integrity": "sha512-rZOFKfCqLhsu5VqjBjEWiwrYqJR07KxIkH4mLZlNlGDfntbb4FbMyGFP14TlvRPrU9S3Hnn/sgxbC5ZeN0no3Q==", - "optional": true, - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/yeoman-generator/node_modules/inherits": { - "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/yeoman-generator/node_modules/is-scoped": { - "version": "1.0.0", - "integrity": "sha512-iT1y0qJcdqXnHe6SCtN9cOBPRiarw8Cy1EZkawW50dxO/7oHC6AYvs1tH4QbBbi7UC/vYY3BnRmbE0bFLwvUog==", - "optional": true, - "dependencies": { - "scoped-regex": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yeoman-generator/node_modules/is-stream": { - "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "optional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yeoman-generator/node_modules/locate-path": { - "version": "3.0.0", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yeoman-generator/node_modules/log-symbols": { - "version": "2.2.0", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "optional": true, - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yeoman-generator/node_modules/lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yeoman-generator/node_modules/make-dir": { - "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yeoman-generator/node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/yeoman-generator/node_modules/mem-fs": { - "version": "1.2.0", - "integrity": "sha512-b8g0jWKdl8pM0LqAPdK9i8ERL7nYrzmJfRhxMiWH2uYdfYnb7uXnmwVb0ZGe7xyEl4lj+nLIU3yf4zPUT+XsVQ==", - "optional": true, - "dependencies": { - "through2": "^3.0.0", - "vinyl": "^2.0.1", - "vinyl-file": "^3.0.0" - } - }, - "node_modules/yeoman-generator/node_modules/mem-fs-editor": { - "version": "7.1.0", - "integrity": "sha512-BH6QEqCXSqGeX48V7zu+e3cMwHU7x640NB8Zk8VNvVZniz+p4FK60pMx/3yfkzo6miI6G3a8pH6z7FeuIzqrzA==", - "dependencies": { - "commondir": "^1.0.1", - "deep-extend": "^0.6.0", - "ejs": "^3.1.5", - "glob": "^7.1.4", - "globby": "^9.2.0", - "isbinaryfile": "^4.0.0", - "mkdirp": "^1.0.0", - "multimatch": "^4.0.0", - "rimraf": "^3.0.0", - "through2": "^3.0.2", - "vinyl": "^2.2.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/yeoman-generator/node_modules/mem-fs-editor/node_modules/rimraf": { - "version": "3.0.2", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/yeoman-generator/node_modules/mkdirp": { - "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" + "node": ">=8.6.0" } }, - "node_modules/yeoman-generator/node_modules/ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/yeoman-generator/node_modules/multimatch": { - "version": "4.0.0", - "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "node_modules/yarn-or-npm/node_modules/find-up": { + "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/yeoman-generator/node_modules/npm-run-path": { - "version": "4.0.1", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "optional": true, + "node_modules/yarn-or-npm/node_modules/locate-path": { + "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { - "path-key": "^3.0.0" + "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, - "node_modules/yeoman-generator/node_modules/p-limit": { + "node_modules/yarn-or-npm/node_modules/p-limit": { "version": "2.3.0", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -46926,355 +50528,243 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yeoman-generator/node_modules/p-locate": { - "version": "3.0.0", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/yarn-or-npm/node_modules/p-locate": { + "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/yeoman-generator/node_modules/p-try": { + "node_modules/yarn-or-npm/node_modules/p-try": { "version": "2.2.0", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { "node": ">=6" } }, - "node_modules/yeoman-generator/node_modules/path-key": { - "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "optional": true, + "node_modules/yarn-or-npm/node_modules/path-exists": { + "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/yeoman-generator/node_modules/pify": { - "version": "4.0.1", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yeoman-generator/node_modules/read-pkg-up": { - "version": "5.0.0", - "integrity": "sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg==", + "node_modules/yarn-or-npm/node_modules/pkg-dir": { + "version": "4.2.0", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "dependencies": { - "find-up": "^3.0.0", - "read-pkg": "^5.0.0" + "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/yeoman-generator/node_modules/rimraf": { - "version": "2.7.1", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/yauzl": { + "version": "2.10.0", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } }, - "node_modules/yeoman-generator/node_modules/scoped-regex": { - "version": "1.0.0", - "integrity": "sha512-90/gFvaP4jXL0rXPD8FS7tWgmkQDlxCjs9cs3r3G5hAnrODt94kIh4SDbH/gm3HosGTik0omdSPOh0KQyGqjlg==", - "optional": true, + "node_modules/yeoman-assert": { + "version": "3.1.1", + "integrity": "sha512-bCuLb/j/WzpvrJZCTdJJLFzm7KK8IYQJ3+dF9dYtNs2CUYyezFJDuULiZ2neM4eqjf45GN1KH/MzCTT3i90wUQ==", + "dev": true, "engines": { "node": ">=4" } }, - "node_modules/yeoman-generator/node_modules/semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/yeoman-generator": { + "version": "5.7.0", + "integrity": "sha512-z9ZwgKoDOd+llPDCwn8Ax2l4In5FMhlslxdeByW4AMxhT+HbTExXKEAahsClHSbwZz1i5OzRwLwRIUdOJBr5Bw==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "chalk": "^4.1.0", + "dargs": "^7.0.0", + "debug": "^4.1.1", + "execa": "^5.1.1", + "github-username": "^6.0.0", + "lodash": "^4.17.11", + "minimist": "^1.2.5", + "read-pkg-up": "^7.0.1", + "run-async": "^2.0.0", + "semver": "^7.2.1", + "shelljs": "^0.8.5", + "sort-keys": "^4.2.0", + "text-table": "^0.2.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/yeoman-generator/node_modules/shebang-command": { - "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "optional": true, - "dependencies": { - "shebang-regex": "^3.0.0" + "node": ">=12.10.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yeoman-generator/node_modules/shebang-regex": { - "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yeoman-generator/node_modules/strip-ansi": { - "version": "4.0.0", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "optional": true, - "dependencies": { - "ansi-regex": "^3.0.0" + "peerDependencies": { + "yeoman-environment": "^3.2.0" }, - "engines": { - "node": ">=4" + "peerDependenciesMeta": { + "yeoman-environment": { + "optional": true + } } }, - "node_modules/yeoman-generator/node_modules/supports-color": { - "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/yeoman-generator/node_modules/cross-spawn": { + "version": "7.0.3", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { - "has-flag": "^3.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/yeoman-generator/node_modules/through2": { - "version": "3.0.2", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - }, - "node_modules/yeoman-generator/node_modules/untildify": { - "version": "3.0.3", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", - "optional": true, - "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/yeoman-generator/node_modules/which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "optional": true, + "node_modules/yeoman-generator/node_modules/debug": { + "version": "4.3.2", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "ms": "2.1.2" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/yeoman-generator/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yeoman-generator/node_modules/yeoman-environment": { - "version": "2.10.3", - "integrity": "sha512-pLIhhU9z/G+kjOXmJ2bPFm3nejfbH+f1fjYRSOteEXDBrv1EoJE/e+kuHixSXfCYfTkxjYsvRaDX+1QykLCnpQ==", - "optional": true, - "dependencies": { - "chalk": "^2.4.1", - "debug": "^3.1.0", - "diff": "^3.5.0", - "escape-string-regexp": "^1.0.2", - "execa": "^4.0.0", - "globby": "^8.0.1", - "grouped-queue": "^1.1.0", - "inquirer": "^7.1.0", - "is-scoped": "^1.0.0", - "lodash": "^4.17.10", - "log-symbols": "^2.2.0", - "mem-fs": "^1.1.0", - "mem-fs-editor": "^6.0.0", - "npm-api": "^1.0.0", - "semver": "^7.1.3", - "strip-ansi": "^4.0.0", - "text-table": "^0.2.0", - "untildify": "^3.0.3", - "yeoman-generator": "^4.8.2" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/array-union": { - "version": "1.0.2", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "optional": true, + "node_modules/yeoman-generator/node_modules/execa": { + "version": "5.1.1", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dependencies": { - "array-uniq": "^1.0.1" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/arrify": { - "version": "1.0.1", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "optional": true, + "node_modules/yeoman-generator/node_modules/get-stream": { + "version": "6.0.1", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/debug": { - "version": "3.2.7", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "optional": true, - "dependencies": { - "ms": "^2.1.1" + "node_modules/yeoman-generator/node_modules/human-signals": { + "version": "2.1.0", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" } }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/diff": { - "version": "3.5.0", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "optional": true, + "node_modules/yeoman-generator/node_modules/is-stream": { + "version": "2.0.1", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { - "node": ">=0.3.1" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/dir-glob": { - "version": "2.0.0", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "optional": true, + "node_modules/yeoman-generator/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/ejs": { - "version": "2.7.4", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "hasInstallScript": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/yeoman-generator/node_modules/ms": { + "version": "2.1.2", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/globby": { - "version": "8.0.2", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "optional": true, + "node_modules/yeoman-generator/node_modules/npm-run-path": { + "version": "4.0.1", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dependencies": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/ignore": { - "version": "3.3.10", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "optional": true - }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/mem-fs-editor": { - "version": "6.0.0", - "integrity": "sha512-e0WfJAMm8Gv1mP5fEq/Blzy6Lt1VbLg7gNnZmZak7nhrBTibs+c6nQ4SKs/ZyJYHS1mFgDJeopsLAv7Ow0FMFg==", - "optional": true, - "dependencies": { - "commondir": "^1.0.1", - "deep-extend": "^0.6.0", - "ejs": "^2.6.1", - "glob": "^7.1.4", - "globby": "^9.2.0", - "isbinaryfile": "^4.0.0", - "mkdirp": "^0.5.0", - "multimatch": "^4.0.0", - "rimraf": "^2.6.3", - "through2": "^3.0.1", - "vinyl": "^2.2.0" + "node_modules/yeoman-generator/node_modules/path-key": { + "version": "3.1.1", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" } }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/mem-fs-editor/node_modules/dir-glob": { - "version": "2.2.2", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "optional": true, + "node_modules/yeoman-generator/node_modules/semver": { + "version": "7.3.7", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { - "path-type": "^3.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/mem-fs-editor/node_modules/globby": { - "version": "9.2.0", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "optional": true, + "node_modules/yeoman-generator/node_modules/shebang-command": { + "version": "2.0.0", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/mem-fs-editor/node_modules/ignore": { - "version": "4.0.6", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/mem-fs-editor/node_modules/pify": { - "version": "4.0.1", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "optional": true, - "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/mem-fs-editor/node_modules/slash": { - "version": "2.0.0", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "optional": true, + "node_modules/yeoman-generator/node_modules/shebang-regex": { + "version": "3.0.0", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/mkdirp": { - "version": "0.5.5", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "optional": true, + "node_modules/yeoman-generator/node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { - "minimist": "^1.2.5" + "isexe": "^2.0.0" }, "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/pify": { - "version": "3.0.0", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "optional": true, + "node-which": "bin/node-which" + }, "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/yeoman-generator/node_modules/yeoman-environment/node_modules/slash": { - "version": "1.0.0", - "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/yeoman-generator/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yeoman-test": { "version": "6.2.0", @@ -47296,54 +50786,6 @@ "yeoman-generator": "*" } }, - "node_modules/yeoman-test/node_modules/ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yeoman-test/node_modules/inquirer": { - "version": "8.2.0", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.2.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/yeoman-test/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yeoman-test/node_modules/rxjs": { - "version": "7.4.0", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", - "dev": true, - "dependencies": { - "tslib": "~2.1.0" - } - }, "node_modules/yeoman-test/node_modules/sinon": { "version": "10.0.0", "integrity": "sha512-XAn5DxtGVJBlBWYrcYKEhWCz7FLwZGdyvANRyK06419hyEpdT0dMc5A8Vcxg5SCGHc40CsqoKsc1bt1CbJPfNw==", @@ -47361,30 +50803,6 @@ "url": "https://opencollective.com/sinon" } }, - "node_modules/yeoman-test/node_modules/string-width": { - "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yeoman-test/node_modules/strip-ansi": { - "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yeoman-test/node_modules/temp-dir": { "version": "2.0.0", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", @@ -47393,11 +50811,6 @@ "node": ">=8" } }, - "node_modules/yeoman-test/node_modules/tslib": { - "version": "2.1.0", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, "node_modules/yocto-queue": { "version": "0.1.0", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", @@ -47508,8 +50921,8 @@ } }, "node_modules/zrender": { - "version": "5.3.1", - "integrity": "sha512-7olqIjy0gWfznKr6vgfnGBk7y4UtdMvdwFmK92vVQsQeDPyzkHW1OlrLEKg6GHz1W5ePf0FeN1q2vkl/HFqhXw==", + "version": "5.4.1", + "integrity": "sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==", "dependencies": { "tslib": "2.3.0" } @@ -47533,7 +50946,7 @@ "dependencies": { "chalk": "^4.0.0", "lodash": "^4.17.11", - "yeoman-generator": "^4.0.0", + "yeoman-generator": "^5.7.0", "yosay": "^2.0.2" }, "devDependencies": { @@ -47566,11 +50979,11 @@ "@testing-library/react-hooks": "^5.0.3", "@testing-library/user-event": "^12.7.0", "ace-builds": "^1.4.14", - "antd": "^4.9.4", + "antd": "4.10.3", "brace": "^0.11.1", "memoize-one": "^5.1.1", "react": "^16.13.1", - "react-ace": "^9.4.4", + "react-ace": "^10.1.0", "react-dom": "^16.13.1" } }, @@ -47587,6 +51000,7 @@ "@types/d3-time-format": "^2.1.0", "@types/enzyme": "^3.10.5", "@types/fetch-mock": "^7.3.3", + "@types/json-bigint": "^1.0.1", "@types/lodash": "^4.14.149", "@types/math-expression-evaluator": "^1.2.1", "@types/node": "^18.0.0", @@ -47636,20 +51050,6 @@ "version": "3.0.0", "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" }, - "packages/superset-ui-core/node_modules/@vx/responsive": { - "version": "0.0.199", - "integrity": "sha512-ONrmLUAG+8wzD3cn/EmsuZh6JHeyejqup3ZsV25t04VaVJAVQAJukAfNdH8YiwSJu0zSo+txkBTfrnOmFyQLOw==", - "dependencies": { - "@types/lodash": "^4.14.146", - "@types/react": "*", - "lodash": "^4.17.10", - "prop-types": "^15.6.1", - "resize-observer-polyfill": "1.5.1" - }, - "peerDependencies": { - "react": "^15.0.0-0 || ^16.0.0-0" - } - }, "packages/superset-ui-core/node_modules/d3-array": { "version": "2.12.1", "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", @@ -47713,7 +51113,7 @@ "@storybook/addons": "^6.3.12", "@storybook/react": "^6.3.12", "@types/react-loadable": "^5.5.3", - "antd": "^4.9.4", + "antd": "4.10.3", "bootstrap": "^3.4.1", "core-js": "3.8.3", "gh-pages": "^3.0.0", @@ -47764,6 +51164,14 @@ "@superset-ui/preset-chart-xy": "*" } }, + "packages/superset-ui-demo/node_modules/ansi-regex": { + "version": "5.0.1", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "packages/superset-ui-demo/node_modules/ansi-styles": { "version": "3.2.1", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", @@ -47786,6 +51194,81 @@ "node": ">=8" } }, + "packages/superset-ui-demo/node_modules/chromatic": { + "version": "5.10.2", + "integrity": "sha512-JHFtZ16VanQX0X9qjacIJOrH9rVUJACilPs8dBwwQgJTZzgCZAdwgmE+WwLcxe/LuK7vM56BDTHbxC+XcnTsjw==", + "dev": true, + "dependencies": { + "@actions/core": "^1.5.0", + "@actions/github": "^5.0.0", + "@babel/preset-typescript": "^7.15.0", + "@babel/runtime": "^7.15.3", + "@chromaui/localtunnel": "^2.0.3", + "async-retry": "^1.3.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "dotenv": "^8.2.0", + "env-ci": "^5.0.2", + "esm": "^3.2.25", + "execa": "^5.0.0", + "fake-tag": "^2.0.0", + "fs-extra": "^10.0.0", + "https-proxy-agent": "^5.0.0", + "jsonfile": "^6.0.1", + "junit-report-builder": "2.1.0", + "listr": "0.14.3", + "meow": "^8.0.0", + "no-proxy": "^1.0.3", + "node-ask": "^1.0.1", + "node-fetch": "2.6.0", + "node-loggly-bulk": "^2.2.4", + "p-limit": "3.1.0", + "picomatch": "2.2.2", + "pkg-up": "^3.1.0", + "pluralize": "^8.0.0", + "progress-stream": "^2.0.0", + "semver": "^7.3.5", + "slash": "^3.0.0", + "string-argv": "^0.3.1", + "strip-ansi": "6.0.0", + "tmp-promise": "3.0.2", + "tree-kill": "^1.2.2", + "ts-dedent": "^1.0.0", + "util-deprecate": "^1.0.2", + "uuid": "^8.3.2", + "yarn-or-npm": "^3.0.1" + }, + "bin": { + "chroma": "bin/register.js", + "chromatic": "bin/register.js", + "chromatic-cli": "bin/register.js" + } + }, + "packages/superset-ui-demo/node_modules/chromatic/node_modules/fs-extra": { + "version": "10.1.0", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/superset-ui-demo/node_modules/chromatic/node_modules/picomatch": { + "version": "2.2.2", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "packages/superset-ui-demo/node_modules/core-js": { "version": "3.8.3", "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==", @@ -47811,6 +51294,35 @@ "node": ">=8" } }, + "packages/superset-ui-demo/node_modules/cross-spawn": { + "version": "7.0.3", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/superset-ui-demo/node_modules/debug": { + "version": "4.3.4", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "packages/superset-ui-demo/node_modules/deepmerge": { "version": "4.2.2", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", @@ -47819,6 +51331,28 @@ "node": ">=0.10.0" } }, + "packages/superset-ui-demo/node_modules/execa": { + "version": "5.1.1", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "packages/superset-ui-demo/node_modules/fill-range": { "version": "7.0.1", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", @@ -47830,6 +51364,17 @@ "node": ">=8" } }, + "packages/superset-ui-demo/node_modules/find-up": { + "version": "3.0.0", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "packages/superset-ui-demo/node_modules/fork-ts-checker-webpack-plugin": { "version": "5.2.1", "integrity": "sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw==", @@ -47866,6 +51411,25 @@ "node": ">=10" } }, + "packages/superset-ui-demo/node_modules/get-stream": { + "version": "6.0.1", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/superset-ui-demo/node_modules/human-signals": { + "version": "2.1.0", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "packages/superset-ui-demo/node_modules/is-number": { "version": "7.0.0", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", @@ -47874,6 +51438,29 @@ "node": ">=0.12.0" } }, + "packages/superset-ui-demo/node_modules/is-stream": { + "version": "2.0.1", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/superset-ui-demo/node_modules/locate-path": { + "version": "3.0.0", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "packages/superset-ui-demo/node_modules/lru-cache": { "version": "6.0.0", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", @@ -47897,6 +51484,77 @@ "node": ">=8.6" } }, + "packages/superset-ui-demo/node_modules/ms": { + "version": "2.1.2", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "packages/superset-ui-demo/node_modules/node-fetch": { + "version": "2.6.0", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "dev": true, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "packages/superset-ui-demo/node_modules/npm-run-path": { + "version": "4.0.1", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/superset-ui-demo/node_modules/p-limit": { + "version": "3.1.0", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/superset-ui-demo/node_modules/p-locate": { + "version": "3.0.0", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "packages/superset-ui-demo/node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/superset-ui-demo/node_modules/p-try": { + "version": "2.2.0", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "packages/superset-ui-demo/node_modules/parse-json": { "version": "5.2.0", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", @@ -47914,6 +51572,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/superset-ui-demo/node_modules/path-key": { + "version": "3.1.1", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "packages/superset-ui-demo/node_modules/path-type": { "version": "4.0.0", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", @@ -47922,6 +51588,17 @@ "node": ">=8" } }, + "packages/superset-ui-demo/node_modules/pkg-up": { + "version": "3.1.0", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "packages/superset-ui-demo/node_modules/schema-utils": { "version": "2.7.0", "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", @@ -47953,6 +51630,44 @@ "node": ">=10" } }, + "packages/superset-ui-demo/node_modules/shebang-command": { + "version": "2.0.0", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/superset-ui-demo/node_modules/shebang-regex": { + "version": "3.0.0", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "packages/superset-ui-demo/node_modules/slash": { + "version": "3.0.0", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "packages/superset-ui-demo/node_modules/strip-ansi": { + "version": "6.0.0", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, "packages/superset-ui-demo/node_modules/supports-color": { "version": "5.5.0", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", @@ -47975,6 +51690,14 @@ "node": ">=8.0" } }, + "packages/superset-ui-demo/node_modules/ts-dedent": { + "version": "1.2.0", + "integrity": "sha512-6zSJp23uQI+Txyz5LlXMXAHpUhY4Hi0oluXny0OgIR7g/Cromq4vDBnhtbBdyIV34g0pgwxUvnvg+jLJe4c1NA==", + "dev": true, + "engines": { + "node": ">=6.10" + } + }, "packages/superset-ui-demo/node_modules/ts-loader": { "version": "7.0.5", "integrity": "sha512-zXypEIT6k3oTc+OZNx/cqElrsbBtYqDknf48OZos0NQ3RTt045fBIU8RRSu+suObBzYB355aIPGOe/3kj9h7Ig==", @@ -48014,6 +51737,28 @@ "semver": "bin/semver.js" } }, + "packages/superset-ui-demo/node_modules/uuid": { + "version": "8.3.2", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "packages/superset-ui-demo/node_modules/which": { + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "packages/superset-ui-demo/node_modules/yallist": { "version": "4.0.0", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", @@ -48021,7 +51766,7 @@ }, "packages/superset-ui-switchboard": { "name": "@superset-ui/switchboard", - "version": "0.18.26-0", + "version": "0.18.26-1", "license": "Apache-2.0" }, "plugins/legacy-plugin-chart-calendar": { @@ -48161,20 +51906,6 @@ "react": "^16.3.0-0" } }, - "plugins/legacy-plugin-chart-histogram/node_modules/@vx/responsive": { - "version": "0.0.199", - "integrity": "sha512-ONrmLUAG+8wzD3cn/EmsuZh6JHeyejqup3ZsV25t04VaVJAVQAJukAfNdH8YiwSJu0zSo+txkBTfrnOmFyQLOw==", - "dependencies": { - "@types/lodash": "^4.14.146", - "@types/react": "*", - "lodash": "^4.17.10", - "prop-types": "^15.6.1", - "resize-observer-polyfill": "1.5.1" - }, - "peerDependencies": { - "react": "^15.0.0-0 || ^16.0.0-0" - } - }, "plugins/legacy-plugin-chart-histogram/node_modules/@vx/scale": { "version": "0.0.197", "integrity": "sha512-FF0POm9rh66I3Om5DsuxynwWU+Q645aTF47vgP2dVDeOOq3Oet7CZzmXLDh3W6nVcxvzq1UdPwu94dto2PUfhg==", @@ -48229,7 +51960,7 @@ "license": "Apache-2.0", "dependencies": { "prop-types": "^15.6.2", - "react-map-gl": "^4.0.10", + "react-map-gl": "^6.1.19", "supercluster": "^4.1.1", "viewport-mercator-project": "^6.1.1" }, @@ -48417,7 +52148,7 @@ "mousetrap": "^1.6.1", "prop-types": "^15.6.0", "react-bootstrap-slider": "2.1.5", - "underscore": "^1.8.3", + "underscore": "^1.12.1", "urijs": "^1.19.8", "xss": "^1.0.10" }, @@ -48427,7 +52158,7 @@ "mapbox-gl": "*", "react": "^16.13.1", "react-dom": "^16.13.1", - "react-map-gl": "^4.0.10" + "react-map-gl": "^6.1.19" } }, "plugins/legacy-preset-chart-deckgl/node_modules/d3-scale": { @@ -48490,7 +52221,7 @@ "license": "Apache-2.0", "dependencies": { "d3-array": "^1.2.0", - "echarts": "^5.3.2", + "echarts": "^5.4.1", "lodash": "^4.17.15", "moment": "^2.26.0" }, @@ -48502,10 +52233,11 @@ }, "plugins/plugin-chart-handlebars": { "name": "@superset-ui/plugin-chart-handlebars", - "version": "0.0.0", + "version": "0.18.25", "license": "Apache-2.0", "dependencies": { - "handlebars": "^4.7.7" + "handlebars": "^4.7.7", + "just-handlebars-helpers": "^1.0.19" }, "devDependencies": { "@types/jest": "^26.0.0", @@ -48519,10 +52251,20 @@ "lodash": "^4.17.11", "moment": "^2.26.0", "react": "^16.13.1", - "react-ace": "^9.4.4", + "react-ace": "^10.1.0", "react-dom": "^16.13.1" } }, + "plugins/plugin-chart-handlebars/node_modules/just-handlebars-helpers": { + "version": "1.0.19", + "integrity": "sha512-E+0eUn5xKfBAoU6mF3QbGZ939PZDw7RYI6AMTpRQtesRH2lZXjXaOqHzJ2nbHnDVmxNQM453sXFnMpd/uaLkKg==", + "peerDependencies": { + "currencyformatter.js": ">= 1.0.4 < 2", + "handlebars": ">= 3.*", + "moment": ">= 2.22.0 < 3", + "sprintf-js": ">= 1.1.1 < 2" + } + }, "plugins/plugin-chart-pivot-table": { "name": "@superset-ui/plugin-chart-pivot-table", "version": "0.18.25", @@ -48536,6 +52278,7 @@ "@ant-design/icons": "^4.2.2", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", + "lodash": "^4.17.11", "prop-types": "*", "react": "^16.13.1", "react-dom": "^16.13.1" @@ -48550,6 +52293,7 @@ "@types/d3-array": "^2.9.0", "@types/enzyme": "^3.10.5", "@types/react-table": "^7.0.29", + "classnames": "^2.3.2", "d3-array": "^2.4.0", "match-sorter": "^6.3.0", "memoize-one": "^5.1.1", @@ -48557,9 +52301,13 @@ "regenerator-runtime": "^0.13.7", "xss": "^1.0.10" }, + "devDependencies": { + "@testing-library/react": "^11.2.0" + }, "peerDependencies": { "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", + "@types/classnames": "*", "@types/react": "*", "react": "^16.13.1", "react-dom": "^16.13.1" @@ -48586,6 +52334,7 @@ "peerDependencies": { "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", + "@types/lodash": "*", "@types/react": "*", "react": "^16.13.1" } @@ -48752,36 +52501,38 @@ }, "dependencies": { "@actions/core": { - "version": "1.6.0", - "integrity": "sha512-NB1UAZomZlCV/LmJqkLhNTqtKfFXJZAUPcfl/zqG7EfsQdeUJtaWO98SGbuQ3pydJ3fHl2CvI/51OKYlCYYcaw==", + "version": "1.9.1", "dev": true, "requires": { - "@actions/http-client": "^1.0.11" + "@actions/http-client": "^2.0.1", + "uuid": "^8.3.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "dev": true + } } }, "@actions/github": { - "version": "5.0.0", - "integrity": "sha512-QvE9eAAfEsS+yOOk0cylLBIO/d6WyWIOvsxxzdrPFaud39G6BOkUwScXZn1iBzQzHyu9SBkkLSWlohDWdsasAQ==", + "version": "5.0.3", "dev": true, "requires": { - "@actions/http-client": "^1.0.11", - "@octokit/core": "^3.4.0", - "@octokit/plugin-paginate-rest": "^2.13.3", - "@octokit/plugin-rest-endpoint-methods": "^5.1.1" + "@actions/http-client": "^2.0.1", + "@octokit/core": "^3.6.0", + "@octokit/plugin-paginate-rest": "^2.17.0", + "@octokit/plugin-rest-endpoint-methods": "^5.13.0" } }, "@actions/http-client": { - "version": "1.0.11", - "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==", + "version": "2.0.1", "dev": true, "requires": { - "tunnel": "0.0.6" + "tunnel": "^0.0.6" } }, "@ag-grid-community/all-modules": { "version": "26.2.1", - "resolved": "https://registry.npmjs.org/@ag-grid-community/all-modules/-/all-modules-26.2.1.tgz", - "integrity": "sha512-zO8PFBSiChQEmJLmWe/gaKhDOPvOR+4yWlTmfIBTWZ/j/zhJSeCNHor6WQGakgfONrNOq0P6yQjVu0d7JFi7mA==", "dev": true, "requires": { "@ag-grid-community/client-side-row-model": "~26.2.0", @@ -48792,8 +52543,6 @@ }, "@ag-grid-community/client-side-row-model": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-community/client-side-row-model/-/client-side-row-model-26.2.0.tgz", - "integrity": "sha512-kW5lMsK5WEXaqZMfHbLRj+EvxLhPW6qtDv61PyDcv+/91lwm2p5dT/iUBppavSwJDiNul+wntpyIlTulZgokwA==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0" @@ -48801,14 +52550,10 @@ }, "@ag-grid-community/core": { "version": "26.2.1", - "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-26.2.1.tgz", - "integrity": "sha512-E2e3rZoZ90QtgO320kmlrm7kFbzFkCyrvCWYUQshJJU/UzCqr6DffVAXTaeehPNLzHBybANxWbSbFab9LQLIwQ==", "dev": true }, "@ag-grid-community/csv-export": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-community/csv-export/-/csv-export-26.2.0.tgz", - "integrity": "sha512-2QqzmYIqqXpPwvIiIpWXV9VWKVK5mLdZI3RVnZdgWGCyTD0OAqWPgqY5LapVpyxGfE/oUm7s9O7ux7EFiTdEcA==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0" @@ -48816,8 +52561,6 @@ }, "@ag-grid-community/infinite-row-model": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-community/infinite-row-model/-/infinite-row-model-26.2.0.tgz", - "integrity": "sha512-wA4qSYD/XdvrjVQ6gdENaX++QlQufndWJonl7oVCPzxw7fO3H1i8DFpfr2fe/BXwrcDM1LeJ5HM6jzIuKIrddg==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0" @@ -48825,8 +52568,6 @@ }, "@ag-grid-community/react": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-community/react/-/react-26.2.0.tgz", - "integrity": "sha512-IWNSuyoiRkIbRpoz+Nvagyz8MsoQbTVQ25ixj75VNAyShK/xWus92FMQQFFQBR11Pb3paZeEttrmF0D8WEFLTQ==", "dev": true, "requires": { "prop-types": "^15.6.2" @@ -48834,8 +52575,6 @@ }, "@ag-grid-enterprise/all-modules": { "version": "26.2.1", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/all-modules/-/all-modules-26.2.1.tgz", - "integrity": "sha512-UhpdeQwgYQqYtCv7Mm5qncsnbwqDohZGjTtCBcbq5tQ5NkURgmoiJbVAQzF0myK5K2BxxOejVytONj18uCSSrg==", "dev": true, "requires": { "@ag-grid-community/all-modules": "~26.2.0", @@ -48861,8 +52600,6 @@ }, "@ag-grid-enterprise/charts": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/charts/-/charts-26.2.0.tgz", - "integrity": "sha512-Y3G2PzyjypR5o1c+1A1VEhTxEvhIvyYWMMTn2KexGtTOBhDqZPB1LyAS8+L7RBhRdtvydXnj3IQBPdQFmhK4Fw==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -48873,8 +52610,6 @@ }, "@ag-grid-enterprise/clipboard": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/clipboard/-/clipboard-26.2.0.tgz", - "integrity": "sha512-24y+IgJrNz6f3WIWxBHzyP32rW932YMagiX0MbJqRfepu32N71DGlXqjuGawXDRLYTbgpQ1196X2otqTQkJK5Q==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -48884,8 +52619,6 @@ }, "@ag-grid-enterprise/column-tool-panel": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/column-tool-panel/-/column-tool-panel-26.2.0.tgz", - "integrity": "sha512-jdYT5cpgkoah0P0Bz3uiiqgakcj9EKS074r5pdMNZc944enFzD+vcYI0qnH/3Ugm1cBgYVB41UeIxBdubfGUYw==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -48896,8 +52629,6 @@ }, "@ag-grid-enterprise/core": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/core/-/core-26.2.0.tgz", - "integrity": "sha512-meYGtrgkEG/OvR02Z5ndSXV85ZbD2hxoUQ84rZx6/lr/U1QOmEIhzWJS3c1iqkzQrWWlDxk8JA7aHv1F+w4ysQ==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0" @@ -48905,8 +52636,6 @@ }, "@ag-grid-enterprise/excel-export": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/excel-export/-/excel-export-26.2.0.tgz", - "integrity": "sha512-UVIau2DSh0H3gp3yzQUIdsIOrx2peDUXx9/Av69WH5H5qOb6C0c3oUAqQ80HUUy6rdWrW1nwVXGkKF4meJFupg==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -48916,8 +52645,6 @@ }, "@ag-grid-enterprise/filter-tool-panel": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/filter-tool-panel/-/filter-tool-panel-26.2.0.tgz", - "integrity": "sha512-1xONvJdoXeA1Hgmkt/evvHiAdjrvRNswLW3cLIdUifGSZOQ/vpQRleUsa0BEsYemrP0VU5ouIDrdypz42w2egA==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -48927,8 +52654,6 @@ }, "@ag-grid-enterprise/master-detail": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/master-detail/-/master-detail-26.2.0.tgz", - "integrity": "sha512-nTOJ92IGXY/hK693JHO2wvFUjLxkg8fjcH6augp99LaVI5tyA9i/WSjfuiPdiCRY3nYnwiRm1i9vtHbFDs3aRw==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -48937,8 +52662,6 @@ }, "@ag-grid-enterprise/menu": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/menu/-/menu-26.2.0.tgz", - "integrity": "sha512-EVBzLtRQe/kfW7l6DyRmFVbo10/yxf72X0h+afGVVp5VMjM5sTdSyvGvScRlzEGQXvptknnqjVNk6WfY9KbSNg==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -48948,8 +52671,6 @@ }, "@ag-grid-enterprise/multi-filter": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/multi-filter/-/multi-filter-26.2.0.tgz", - "integrity": "sha512-CH5bS0MktZhFifbGgOVicXXWOELeZ6cRDLFpZj9smznB7Ct24Ni8/ormTyBbQP7xhmlVOPe/mE9h3YC1HH18pw==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -48959,8 +52680,6 @@ }, "@ag-grid-enterprise/range-selection": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/range-selection/-/range-selection-26.2.0.tgz", - "integrity": "sha512-AUQsWsPH9F2PEbcUMbAldcCZQf4k2L8AU45bPKANph9dCH1/JFb7qlQAHxroOzkpvjTqyT6PjaD8vYm8Cfdvvg==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -48969,8 +52688,6 @@ }, "@ag-grid-enterprise/rich-select": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/rich-select/-/rich-select-26.2.0.tgz", - "integrity": "sha512-qVOHIzElUJowehZylUBO2zyNFd+3DN5m3o29WFgEM6hDsflJqdnAR/BkUYinYIi5kLXt+t00O9N2HB5XkMd+bQ==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -48979,8 +52696,6 @@ }, "@ag-grid-enterprise/row-grouping": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/row-grouping/-/row-grouping-26.2.0.tgz", - "integrity": "sha512-uZF65ZzXGWEfNUjQYD0SPUW1aIS6etKN7SD5wmoM6PFIVFEZNiUpQCC9nO3Jz+rSyQ+VQ89SFJCiXvoeH9F3MA==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -48989,8 +52704,6 @@ }, "@ag-grid-enterprise/server-side-row-model": { "version": "26.2.1", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/server-side-row-model/-/server-side-row-model-26.2.1.tgz", - "integrity": "sha512-0WielbIJ8mm4tcTbDWqvVnc+E+s4IHLEy7dzgC7xhCDJR4LUJenT6xoBKThID5arXmitsgB7C574wXP0/IEdpQ==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -48999,8 +52712,6 @@ }, "@ag-grid-enterprise/set-filter": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/set-filter/-/set-filter-26.2.0.tgz", - "integrity": "sha512-YbqwhnnaI3J72NrJOS9dzrMDnc6O2NAEUeoybU/abbjqjYGrSXkE3SuYPP7tfMic7p6Y4/yCYqFLxo98UmiLfQ==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -49009,8 +52720,6 @@ }, "@ag-grid-enterprise/side-bar": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/side-bar/-/side-bar-26.2.0.tgz", - "integrity": "sha512-OzxBDazfyXqMSlttwsi5PfSas4YCIfB5xqrtzT7nKn/231mZJTIDuywIPddrWzY3ml6F0fntLl4CQtBlIIkEMA==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -49019,8 +52728,6 @@ }, "@ag-grid-enterprise/sparklines": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/sparklines/-/sparklines-26.2.0.tgz", - "integrity": "sha512-nbgxvpFDk2cldFikozmfw+ThRxTzH1jN6Tem2uxRRRz2QVvF8zmYAxT/reQHOUq5r8K3MAnjV6Lrf84mcWTwSg==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -49029,8 +52736,6 @@ }, "@ag-grid-enterprise/status-bar": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/status-bar/-/status-bar-26.2.0.tgz", - "integrity": "sha512-UTpZaDMdb+uVZSxKOvRQk9TWXwbMNWX5brTpDkdqrJiVtQToN9SLbenee9CEvXHm9I8OAo0Zb9ulbfBaBAUbNQ==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", @@ -49039,51 +52744,86 @@ }, "@ag-grid-enterprise/viewport-row-model": { "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@ag-grid-enterprise/viewport-row-model/-/viewport-row-model-26.2.0.tgz", - "integrity": "sha512-9uyZc7Cc9a+4bW7Jzkbcv4QIGHD2m6BPReaTkL6MJS3TyXLewsQGKSnbpi3jL3Ca8XCJo2rZe14lRN981KaaZg==", "dev": true, "requires": { "@ag-grid-community/core": "~26.2.0", "@ag-grid-enterprise/core": "~26.2.0" } }, + "@ampproject/remapping": { + "version": "2.2.0", + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@ant-design/colors": { - "version": "3.2.2", - "integrity": "sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ==", + "version": "6.0.0", "requires": { - "tinycolor2": "^1.4.1" + "@ctrl/tinycolor": "^3.4.0" } }, "@ant-design/icons": { - "version": "4.2.2", - "integrity": "sha512-DrVV+wcupnHS7PehJ6KiTcJtAR5c25UMgjGECCc6pUT9rsvw0AuYG+a4HDjfxEQuDqKTHwW+oX/nIvCymyLE8Q==", + "version": "4.8.0", "requires": { - "@ant-design/colors": "^3.1.0", - "@ant-design/icons-svg": "^4.0.0", - "@babel/runtime": "^7.10.4", + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1", + "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", - "insert-css": "^2.0.0", - "rc-util": "^5.0.1" + "rc-util": "^5.9.4" } }, "@ant-design/icons-svg": { - "version": "4.1.0", - "integrity": "sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ==" + "version": "4.2.1" }, - "@ant-design/react-slick": { - "version": "0.27.14", - "integrity": "sha512-s6JVexqFmU5rs5Pm828ojtm5rCp8jDXyrc5OxEtCE2z58SIyQlkpnU9BJh98LEeBZyj02WFkGN8CWpSaD+G4PA==", + "@applitools/core": { + "version": "1.3.7", + "dev": true, "requires": { - "@babel/runtime": "^7.10.4", - "classnames": "^2.2.5", - "json2mq": "^0.2.0", - "lodash": "^4.17.15", - "resize-observer-polyfill": "^1.5.0" + "@applitools/core-base": "1.1.24", + "@applitools/dom-capture": "11.2.0", + "@applitools/dom-snapshot": "4.7.3", + "@applitools/driver": "1.11.21", + "@applitools/logger": "1.1.36", + "@applitools/nml-client": "1.3.22", + "@applitools/req": "1.1.23", + "@applitools/screenshoter": "3.7.20", + "@applitools/snippets": "2.4.12", + "@applitools/ufg-client": "1.1.12", + "@applitools/utils": "1.3.22", + "abort-controller": "3.0.0", + "chalk": "4.1.2", + "node-fetch": "2.6.7", + "throat": "6.0.1" + }, + "dependencies": { + "throat": { + "version": "6.0.1", + "dev": true + } + } + }, + "@applitools/core-base": { + "version": "1.1.24", + "dev": true, + "requires": { + "@applitools/image": "1.0.17", + "@applitools/logger": "1.1.36", + "@applitools/req": "1.1.23", + "@applitools/utils": "1.3.22" } }, "@applitools/dom-capture": { - "version": "11.1.0", - "integrity": "sha512-99NdLnHuoTT0EBDMixp19QLAZV704ztQjJfcvJZNmi5FnFzsnVpgTwRhgH5SA1JobQ09yMS9wvy0ekrpdX8lIw==", + "version": "11.2.0", "dev": true, "requires": { "@applitools/dom-shared": "1.0.5", @@ -49092,159 +52832,83 @@ }, "@applitools/dom-shared": { "version": "1.0.5", - "integrity": "sha512-O2zgnnqVi3/Atq7EQjURLa73XNaDFJCj8wHht6WQtxIv1EWYnPutNTmnJSKwK7FnbJAg65OVjZylcz4EezyYZA==", "dev": true }, "@applitools/dom-snapshot": { - "version": "4.5.12", - "integrity": "sha512-YeuAOQ0+AB7HCMPAHqpnOq5xCOXfIyC/2/h3XurOuzE+qFekK9SPMBRaJn4jDYyAFK/Eeu4v7CGW+LPAUGiZfA==", + "version": "4.7.3", "dev": true, "requires": { - "@applitools/dom-shared": "1.0.8", + "@applitools/dom-shared": "1.0.9", "@applitools/functional-commons": "1.6.0", - "css-tree": "1.0.0-alpha.39", + "css-tree": "2.3.1", "pako": "1.0.11" }, "dependencies": { "@applitools/dom-shared": { - "version": "1.0.8", - "integrity": "sha512-HQtYfFvtlPuE9ZShBamtW1LGW2Qq4HxjQx5nF7KiNvrRTlf5/e+AWpZhXCTVEhVkAcSNs/7xR2WvumOUd+usxg==", + "version": "1.0.9", "dev": true }, "css-tree": { - "version": "1.0.0-alpha.39", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "version": "2.3.1", "dev": true, "requires": { - "mdn-data": "2.0.6", - "source-map": "^0.6.1" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" } }, "mdn-data": { - "version": "2.0.6", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "version": "2.0.30", "dev": true }, - "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "source-map-js": { + "version": "1.0.2", "dev": true } } }, "@applitools/driver": { - "version": "1.6.0", - "integrity": "sha512-oKssjHF01lpI71CJd98mhBbphcOoFE9YVxZGOuPdcnfPbM83txj3MrVmH/yVRF3cDiBBVHJL8cuskjygMPhbHw==", - "dev": true, - "requires": { - "@applitools/snippets": "2.2.2", - "@applitools/types": "1.3.0", - "@applitools/utils": "1.2.13" - } - }, - "@applitools/eyes-sdk-core": { - "version": "13.2.5", - "integrity": "sha512-TTPg0IaByB5gMRJIcC9yQsCNqXe3EK5yORLUnSzxwk4KQTFEj2C5/2DJFtcHx+rxEuvu40BZ6dHT0avmHboqnw==", + "version": "1.11.21", "dev": true, "requires": { - "@applitools/dom-capture": "11.1.0", - "@applitools/dom-snapshot": "4.5.12", - "@applitools/driver": "1.6.0", - "@applitools/isomorphic-fetch": "3.0.0", - "@applitools/logger": "1.0.11", - "@applitools/screenshoter": "3.3.14", - "@applitools/snippets": "2.2.2", - "@applitools/types": "1.3.0", - "@applitools/utils": "1.2.13", - "axios": "0.26.0", - "chalk": "3.0.0", - "cosmiconfig": "6.0.0", - "dateformat": "3.0.3", - "debug": "4.3.3", - "deepmerge": "4.2.2", - "stack-trace": "0.0.10", - "tunnel": "0.0.6" + "@applitools/logger": "1.1.36", + "@applitools/snippets": "2.4.12", + "@applitools/utils": "1.3.22", + "semver": "7.3.7" }, "dependencies": { - "axios": { - "version": "0.26.0", - "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.8" - } - }, - "chalk": { - "version": "3.0.0", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cosmiconfig": { + "lru-cache": { "version": "6.0.0", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "debug": { - "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" + "yallist": "^4.0.0" } }, - "deepmerge": { - "version": "4.2.2", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "semver": { + "version": "7.3.7", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "lru-cache": "^6.0.0" } }, - "path-type": { + "yallist": { "version": "4.0.0", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true } } }, "@applitools/eyes-storybook": { - "version": "3.27.6", - "integrity": "sha512-4vOMGqiF5HxbQhLPKLDwE7S+qr5W22J/C8GJ3fD0NLPXj8Nk5VMdmSp9vXz7AfB9iphGMvYfGjTNE37qz29bag==", + "version": "3.30.1", "dev": true, "requires": { - "@applitools/driver": "1.6.0", - "@applitools/eyes-sdk-core": "13.2.5", + "@applitools/core": "1.3.7", + "@applitools/driver": "1.11.21", "@applitools/functional-commons": "1.6.0", - "@applitools/logger": "1.0.11", + "@applitools/logger": "1.1.36", "@applitools/monitoring-commons": "1.0.19", - "@applitools/spec-driver-puppeteer": "1.1.1", - "@applitools/test-server": "1.0.8", - "@applitools/utils": "1.2.13", - "@applitools/visual-grid-client": "15.11.2", + "@applitools/spec-driver-puppeteer": "1.1.31", + "@applitools/test-server": "1.1.16", + "@applitools/ufg-client": "1.1.12", + "@applitools/utils": "1.3.22", "boxen": "4.2.0", "chalk": "3.0.0", "detect-port": "1.3.0", @@ -49253,17 +52917,16 @@ "ora": "3.4.0", "puppeteer": "10.2.0", "strip-ansi": "6.0.0", + "throat": "6.0.1", "yargs": "15.4.1" }, "dependencies": { "ansi-regex": { "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "boxen": { "version": "4.2.0", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", "dev": true, "requires": { "ansi-align": "^3.0.0", @@ -49278,7 +52941,6 @@ }, "chalk": { "version": "3.0.0", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -49287,7 +52949,6 @@ }, "cli-cursor": { "version": "2.1.0", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "requires": { "restore-cursor": "^2.0.0" @@ -49295,12 +52956,10 @@ }, "is-fullwidth-code-point": { "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "log-symbols": { "version": "2.2.0", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { "chalk": "^2.0.1" @@ -49308,7 +52967,6 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -49316,7 +52974,6 @@ }, "chalk": { "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -49326,7 +52983,6 @@ }, "supports-color": { "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -49336,12 +52992,10 @@ }, "mimic-fn": { "version": "1.2.0", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "onetime": { "version": "2.0.1", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "requires": { "mimic-fn": "^1.0.0" @@ -49349,7 +53003,6 @@ }, "ora": { "version": "3.4.0", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -49362,12 +53015,10 @@ "dependencies": { "ansi-regex": { "version": "4.1.1", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "ansi-styles": { "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -49375,7 +53026,6 @@ }, "chalk": { "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -49385,7 +53035,6 @@ }, "strip-ansi": { "version": "5.2.0", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -49393,7 +53042,6 @@ }, "supports-color": { "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -49403,7 +53051,6 @@ }, "restore-cursor": { "version": "2.0.0", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "requires": { "onetime": "^2.0.0", @@ -49412,7 +53059,6 @@ }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -49422,7 +53068,6 @@ "dependencies": { "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -49432,59 +53077,33 @@ }, "strip-ansi": { "version": "6.0.0", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { "ansi-regex": "^5.0.0" } + }, + "throat": { + "version": "6.0.1", + "dev": true } } }, "@applitools/functional-commons": { "version": "1.6.0", - "integrity": "sha512-fwiF0CbeYHDEOTD/NKaFgaI8LvRcGYG2GaJJiRwcedKko16sQ8F3TK5wXfj2Ytjf+8gjwHwsEEX550z3yvDWxA==", "dev": true }, - "@applitools/http-commons": { - "version": "2.4.5", - "integrity": "sha512-w1lP9aljD6FLp/wgifj/oyj/bTCiAH2PuwDJci5QKJAeymqPoRGrKvykoKOegpa5OjdmZSPD/kW40ZTHSsST5Q==", - "dev": true, - "requires": { - "@applitools/functional-commons": "^1.5.5", - "@applitools/monitoring-commons": "^1.0.19", - "agentkeepalive": "^4.1.0", - "debug": "^4.1.1", - "lodash.merge": "^4.6.2", - "node-fetch": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@applitools/isomorphic-fetch": { - "version": "3.0.0", - "integrity": "sha512-7rutaN/2M5wYjOIOTKS/Zuc1Na90fJNEAqvo/jCxt7nSD1kYscHV3aCk9t7RD59gmzLMvUTIxFbjl4RUMV8qfg==", + "@applitools/image": { + "version": "1.0.17", "dev": true, "requires": { - "node-fetch": "^2.3.0", - "whatwg-fetch": ">=0.10.0" + "@applitools/utils": "1.3.22", + "bmpimagejs": "1.0.4", + "jpeg-js": "0.4.4", + "png-async": "0.9.4" } }, "@applitools/jsdom": { "version": "1.0.4", - "integrity": "sha512-JtjNfTJtphJYHEkicW4xlwtYuRP3TRvjoszfkrcpxTNMCbGkbop8ed9MuUfR83dAZj5NY9begbmEqJohLJco6w==", "dev": true, "requires": { "abab": "^2.0.5", @@ -49518,54 +53137,17 @@ "dependencies": { "@tootallnate/once": { "version": "2.0.0", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "cssom": { - "version": "0.5.0", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", "dev": true }, - "data-urls": { - "version": "3.0.2", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "11.0.0", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - } - } - }, "debug": { "version": "4.3.4", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, - "domexception": { - "version": "4.0.0", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "requires": { - "webidl-conversions": "^7.0.0" - } - }, "escodegen": { "version": "2.0.0", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "requires": { "esprima": "^4.0.1", @@ -49577,17 +53159,14 @@ }, "esprima": { "version": "4.0.1", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "estraverse": { "version": "5.3.0", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "form-data": { "version": "4.0.0", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -49595,17 +53174,8 @@ "mime-types": "^2.1.12" } }, - "html-encoding-sniffer": { - "version": "3.0.0", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, "http-proxy-agent": { "version": "5.0.0", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "requires": { "@tootallnate/once": "2", @@ -49615,7 +53185,6 @@ }, "iconv-lite": { "version": "0.6.3", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -49623,59 +53192,44 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "parse5": { "version": "6.0.1", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true }, "tough-cookie": { - "version": "4.0.0", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.2", "dev": true, "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" } }, "tr46": { "version": "3.0.0", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, "requires": { "punycode": "^2.1.1" } }, "universalify": { - "version": "0.1.2", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "0.2.0", "dev": true }, - "w3c-xmlserializer": { - "version": "3.0.0", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "dev": true, - "requires": { - "xml-name-validator": "^4.0.0" - } - }, "webidl-conversions": { "version": "7.0.0", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true }, "whatwg-encoding": { "version": "2.0.0", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, "requires": { "iconv-lite": "0.6.3" @@ -49683,12 +53237,10 @@ }, "whatwg-mimetype": { "version": "3.0.0", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true }, "whatwg-url": { "version": "10.0.0", - "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", "dev": true, "requires": { "tr46": "^3.0.0", @@ -49696,40 +53248,25 @@ } }, "ws": { - "version": "8.5.0", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.12.0", "dev": true }, "xml-name-validator": { "version": "4.0.0", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true } } }, "@applitools/logger": { - "version": "1.0.11", - "integrity": "sha512-AcTTpLfUggo4/TISBk5+X4PdSZuMDEK0+gzsf+b9BCFzPDc7p4yrAHeftHdjOV/AE3yLQEWnupUmlsttdMayXQ==", + "version": "1.1.36", "dev": true, "requires": { - "@applitools/utils": "1.2.13", - "chalk": "3.0.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } + "@applitools/utils": "1.3.22", + "chalk": "4.1.2" } }, "@applitools/monitoring-commons": { "version": "1.0.19", - "integrity": "sha512-rzEOvGoiEF4KnK0PJ9I0btdwnaNlIPLYhjF1vTEG15PoucbbKpix9fYusxWlDG7kMiZya8ZycVPc0woVlNaHRQ==", "dev": true, "requires": { "debug": "^4.1.0" @@ -49737,7 +53274,6 @@ "dependencies": { "debug": { "version": "4.3.4", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -49745,63 +53281,100 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, + "@applitools/nml-client": { + "version": "1.3.22", + "dev": true, + "requires": { + "@applitools/logger": "1.1.36", + "@applitools/req": "1.1.23", + "@applitools/utils": "1.3.22" + } + }, + "@applitools/req": { + "version": "1.1.23", + "dev": true, + "requires": { + "@applitools/utils": "1.3.22", + "@types/node-fetch": "2.6.2", + "abort-controller": "3.0.0", + "node-fetch": "2.6.7", + "proxy-agent": "5.0.0" + } + }, "@applitools/screenshoter": { - "version": "3.3.14", - "integrity": "sha512-DwZFJiBIgEkyzEaESnl3A87KeSVnUmHKad9vg+iwgtAFQf492ZI7t+PKhjGVM9ekZ8q5Sz4xnO+Bsmk8qEu0+A==", + "version": "3.7.20", "dev": true, "requires": { - "@applitools/snippets": "2.2.2", - "@applitools/utils": "1.2.13", + "@applitools/image": "1.0.17", + "@applitools/logger": "1.1.36", + "@applitools/snippets": "2.4.12", + "@applitools/utils": "1.3.22", + "jpeg-js": "0.4.4", "png-async": "0.9.4" } }, "@applitools/snippets": { - "version": "2.2.2", - "integrity": "sha512-XOxdrsWgcEu6h6QTVL/S8/dJHoPGir1GKQLyWORbRfbjll15/mUj3Mzzi9MqL6lSN3KWp07ncLvMuhSETpi7Mg==", + "version": "2.4.12", "dev": true }, "@applitools/spec-driver-puppeteer": { - "version": "1.1.1", - "integrity": "sha512-64TvcOc8vHYz1IXftOJzNqy0lLTMMnnjvKhcqMwIct5PJY8QYdVZagBRwGF9L9wYhs8ULtpmSa/SmpPaIbMNUQ==", + "version": "1.1.31", "dev": true, "requires": { - "@applitools/types": "1.3.0", - "@applitools/utils": "1.2.13" + "@applitools/driver": "1.11.21", + "@applitools/utils": "1.3.22" } }, "@applitools/test-server": { - "version": "1.0.8", - "integrity": "sha512-KP1A8aySLoU532zCG6mwk2Mair56gQ5xp75ZnV4/CvefCzeD2f/nqUBYmoiTN940QOrQVWAXeXvuwMj1BUJD0Q==", + "version": "1.1.16", "dev": true, "requires": { - "@applitools/utils": "1.2.4", + "@applitools/logger": "1.1.36", + "@applitools/utils": "1.3.22", + "body-parser": "1.20.0", "chalk": "3.0.0", "cookie-parser": "1.4.5", "cors": "2.8.5", - "express": "4.17.1", + "express": "4.17.3", "handlebars": "4.7.7", + "http-proxy": "1.18.1", "morgan": "1.10.0", + "node-forge": "1.3.1", "yargs": "17.0.1" }, "dependencies": { - "@applitools/utils": { - "version": "1.2.4", - "integrity": "sha512-w7ma6FFGyqhdP6LEcuHFWOcH7EzBjnoAX3UfbFWcTHA3QXnXPX37Y2ENYRodfwkorP1cUKyUHwNXJB/BMIj/hg==", - "dev": true - }, "ansi-regex": { "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "body-parser": { + "version": "1.20.0", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "bytes": { + "version": "3.1.2", "dev": true }, "chalk": { "version": "3.0.0", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -49810,7 +53383,6 @@ }, "cliui": { "version": "7.0.4", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", @@ -49818,14 +53390,67 @@ "wrap-ansi": "^7.0.0" } }, + "depd": { + "version": "2.0.0", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "inherits": { + "version": "2.0.4", + "dev": true + }, "is-fullwidth-code-point": { "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "qs": { + "version": "6.10.3", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "raw-body": { + "version": "2.5.1", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "dev": true + }, + "statuses": { + "version": "2.0.1", "dev": true }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -49835,7 +53460,6 @@ }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -49843,7 +53467,6 @@ }, "wrap-ansi": { "version": "7.0.0", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -49853,12 +53476,10 @@ }, "y18n": { "version": "5.0.8", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yargs": { "version": "17.0.1", - "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -49872,131 +53493,102 @@ }, "yargs-parser": { "version": "20.2.9", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true } } }, - "@applitools/types": { - "version": "1.3.0", - "integrity": "sha512-aLLm5FVtg/iDnrNvIDFKZrHQ2Nh64dSuy5VairQroMoCwK90Pft75Dy6CQC5g4IUEN04Wub9sx2kmthjQiwkZA==", - "dev": true - }, - "@applitools/utils": { - "version": "1.2.13", - "integrity": "sha512-yZ333Y/bAH/A05UMBllEdqBAwkFQknih2arIRSfN+QBpiFrfuLtQEdCwXAdnvU/MbAzZ/Tje7iv93FMzs5gFZA==", - "dev": true - }, - "@applitools/visual-grid-client": { - "version": "15.11.2", - "integrity": "sha512-PVnyVBlVjocnFjtXAbjH1UmAHz01/6GmaBV9fTFAjnpzCHDEbZ4Uz+pNi7hhMKy/hzRoe8LuRLZVBbagkhx9Aw==", + "@applitools/ufg-client": { + "version": "1.1.12", "dev": true, "requires": { - "@applitools/eyes-sdk-core": "13.2.5", - "@applitools/functional-commons": "1.6.0", - "@applitools/http-commons": "2.4.5", - "@applitools/isomorphic-fetch": "3.0.0", "@applitools/jsdom": "1.0.4", - "@applitools/logger": "1.0.11", + "@applitools/logger": "1.1.36", + "@applitools/req": "1.1.23", + "@applitools/utils": "1.3.22", "abort-controller": "3.0.0", - "chalk": "3.0.0", - "postcss-value-parser": "4.1.0", - "throat": "5.0.0" + "postcss-value-parser": "4.2.0", + "throat": "6.0.1" }, "dependencies": { - "chalk": { - "version": "3.0.0", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "throat": { + "version": "6.0.1", + "dev": true } } }, + "@applitools/utils": { + "version": "1.3.22", + "dev": true + }, "@babel/cli": { - "version": "7.16.0", - "integrity": "sha512-WLrM42vKX/4atIoQB+eb0ovUof53UUvecb4qGjU2PDDWRiZr50ZpiV8NpcLo7iSxeGYrRG0Mqembsa+UrTAV6Q==", + "version": "7.18.10", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.8", "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", "chokidar": "^3.4.0", "commander": "^4.0.1", "convert-source-map": "^1.1.0", "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", + "glob": "^7.2.0", "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" + "slash": "^2.0.0" }, "dependencies": { "commander": { "version": "4.1.1", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true } } }, "@babel/code-frame": { - "version": "7.14.5", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.18.6", "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.15.0", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + "version": "7.18.8" }, "@babel/core": { - "version": "7.15.5", - "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.5", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", + "version": "7.18.10", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.1", + "semver": "^6.3.0" }, "dependencies": { "debug": { "version": "4.3.1", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { "ms": "2.1.2" } }, "json5": { - "version": "2.1.3", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3" }, "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.2" }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" } } }, "@babel/eslint-parser": { - "version": "7.15.7", - "integrity": "sha512-yJkHyomClm6A2Xzb8pdAo4HzYMSXFn1O5zrCYvbFP0yQFvHueLedV8WiEno8yJOKStjUXzBZzJFeWQ7b3YMsqQ==", + "version": "7.18.9", "dev": true, "requires": { "eslint-scope": "^5.1.1", @@ -50006,79 +53598,70 @@ "dependencies": { "eslint-visitor-keys": { "version": "2.1.0", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "semver": { "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/generator": { - "version": "7.15.4", - "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "version": "7.18.12", "requires": { - "@babel/types": "^7.15.4", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" } }, "@babel/helper-annotate-as-pure": { - "version": "7.15.4", - "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "version": "7.18.6", "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.15.4", - "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", + "version": "7.18.9", "requires": { - "@babel/helper-explode-assignable-expression": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-compilation-targets": { - "version": "7.15.4", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "version": "7.18.9", "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "dependencies": { "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.15.4", - "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "version": "7.18.9", "requires": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "version": "7.18.6", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" } }, "@babel/helper-define-polyfill-provider": { "version": "0.1.5", - "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -50092,176 +53675,153 @@ "dependencies": { "debug": { "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { "ms": "2.1.2" } }, "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.2" }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" } } }, + "@babel/helper-environment-visitor": { + "version": "7.18.9" + }, "@babel/helper-explode-assignable-expression": { - "version": "7.15.4", - "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", + "version": "7.18.6", "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" } }, "@babel/helper-function-name": { - "version": "7.15.4", - "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "version": "7.18.9", "requires": { - "@babel/helper-get-function-arity": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.15.4", - "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", - "requires": { - "@babel/types": "^7.15.4" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-hoist-variables": { - "version": "7.15.4", - "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "version": "7.18.6", "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.15.4", - "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "version": "7.18.9", "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.9" } }, "@babel/helper-module-imports": { - "version": "7.15.4", - "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "version": "7.18.6", "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { - "version": "7.15.7", - "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", + "version": "7.18.9", "requires": { - "@babel/helper-module-imports": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-simple-access": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-optimise-call-expression": { - "version": "7.15.4", - "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "version": "7.18.6", "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.18.9" }, "@babel/helper-remap-async-to-generator": { - "version": "7.15.4", - "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "version": "7.18.9", "requires": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-wrap-function": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-replace-supers": { - "version": "7.15.4", - "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "version": "7.18.9", "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-simple-access": { - "version": "7.15.4", - "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "version": "7.18.6", "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.15.4", - "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "version": "7.18.9", "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.9" } }, "@babel/helper-split-export-declaration": { - "version": "7.15.4", - "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "version": "7.18.6", "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.18.10" + }, "@babel/helper-validator-identifier": { - "version": "7.15.7", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + "version": "7.18.6" }, "@babel/helper-validator-option": { - "version": "7.14.5", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + "version": "7.18.6" }, "@babel/helper-wrap-function": { - "version": "7.15.4", - "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "version": "7.18.11", "requires": { - "@babel/helper-function-name": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.11", + "@babel/types": "^7.18.10" } }, "@babel/helpers": { - "version": "7.15.4", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "version": "7.18.9", "requires": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/highlight": { - "version": "7.14.5", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.18.6", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -50270,7 +53830,6 @@ }, "supports-color": { "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -50278,13 +53837,12 @@ } }, "@babel/node": { - "version": "7.15.4", - "integrity": "sha512-UZue+j8p5aKTaVjvy5psYmqLHqmz+9cIboAFoa97S1xeZyUr0gT6KzXB8ZkfBIsP/u79biOdjGHVXBXnW3rVfw==", + "version": "7.18.10", "dev": true, "requires": { - "@babel/register": "^7.15.3", + "@babel/register": "^7.18.9", "commander": "^4.0.1", - "core-js": "^3.16.0", + "core-js": "^3.22.1", "node-environment-flags": "^1.0.5", "regenerator-runtime": "^0.13.4", "v8flags": "^3.1.1" @@ -50292,53 +53850,53 @@ "dependencies": { "commander": { "version": "4.1.1", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true } } }, "@babel/parser": { - "version": "7.15.7", - "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==" + "version": "7.18.11" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.15.4", - "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "version": "7.18.9", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", - "@babel/plugin-proposal-optional-chaining": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.15.4", - "integrity": "sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==", + "version": "7.18.10", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.14.5", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "version": "7.18.6", "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.15.4", - "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "version": "7.18.6", "requires": { - "@babel/helper-create-class-features-plugin": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-decorators": { "version": "7.15.4", - "integrity": "sha512-WNER+YLs7avvRukEddhu5PSfSaMMimX2xBFgLQS7Bw16yrUxJGWidO9nQp+yLy9MVybg5Ba3BlhAw+BkdhpDmg==", "requires": { "@babel/helper-create-class-features-plugin": "^7.15.4", "@babel/helper-plugin-utils": "^7.14.5", @@ -50346,64 +53904,56 @@ } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-default-from": { "version": "7.14.5", - "integrity": "sha512-T8KZ5abXvKMjF6JcoXjgac3ElmXf0AWzJwi2O/42Jk+HmCky3D9+i1B7NPP1FblyceqTevKeV/9szeikFoaMDg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-export-default-from": "^7.14.5" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.5", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "version": "7.18.9", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.14.5", - "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "version": "7.18.9", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.12.1", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", @@ -50411,58 +53961,51 @@ } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.5", - "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "version": "7.18.9", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "version": "7.18.6", "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.15.4", - "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "version": "7.18.6", "requires": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-create-class-features-plugin": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.14.5", - "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "version": "7.18.6", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-bigint": { "version": "7.8.3", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" @@ -50470,56 +54013,54 @@ }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-decorators": { "version": "7.14.5", - "integrity": "sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-export-default-from": { "version": "7.14.5", - "integrity": "sha512-snWDxjuaPEobRBnhpqEfZ8RMxDbHt8+87fiEioGuE+Uc0xAKgSD8QiuL3lF93hPVQfZFAcYwrrf+H5qUhike3Q==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-flow": { "version": "7.14.5", - "integrity": "sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, "@babel/plugin-syntax-import-meta": { "version": "7.10.1", - "integrity": "sha512-ypC4jwfIVF72og0dgvEcFRdOM2V9Qm1tu7RGmdZOlhsccyK0wisXmMObGuWEOd5jQ+K9wcIgSNftCpk2vkjUfQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.1" @@ -50527,349 +54068,307 @@ }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { - "version": "7.14.5", - "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { "version": "7.14.5", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.14.5", - "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "version": "7.18.6", "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.14.5", - "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.15.3", - "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", + "version": "7.18.9", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-classes": { - "version": "7.15.4", - "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", + "version": "7.18.9", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.14.5", - "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "version": "7.18.9", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-destructuring": { - "version": "7.14.7", - "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "version": "7.18.9", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.14.5", - "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "version": "7.18.6", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.14.5", - "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "version": "7.18.9", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.14.5", - "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "version": "7.18.6", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-flow-strip-types": { "version": "7.14.5", - "integrity": "sha512-KhcolBKfXbvjwI3TV7r7TkYm8oNXHNBqGOy6JDVwtecFaRoKYsUUqJdS10q0YDKW1c6aZQgO+Ys3LfGkox8pXA==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-flow": "^7.14.5" } }, "@babel/plugin-transform-for-of": { - "version": "7.15.4", - "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "version": "7.18.8", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-function-name": { - "version": "7.14.5", - "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "version": "7.18.9", "requires": { - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-literals": { - "version": "7.14.5", - "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "version": "7.18.9", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.14.5", - "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.14.5", - "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "version": "7.18.6", "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.15.4", - "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "version": "7.18.6", "requires": { - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.15.4", - "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "version": "7.18.9", "requires": { - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.14.5", - "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "version": "7.18.6", "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.14.9", - "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "version": "7.18.6", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-new-target": { - "version": "7.14.5", - "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-object-super": { - "version": "7.14.5", - "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" } }, "@babel/plugin-transform-parameters": { - "version": "7.15.4", - "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "version": "7.18.8", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-property-literals": { - "version": "7.14.5", - "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-react-constant-elements": { "version": "7.14.5", - "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.15.1", - "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.14.9", - "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", + "version": "7.18.10", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.14.5", - "@babel/types": "^7.14.9" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.18.10" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.14.5", - "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "version": "7.18.6", "requires": { - "@babel/plugin-transform-react-jsx": "^7.14.5" + "@babel/plugin-transform-react-jsx": "^7.18.6" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.14.5", - "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "version": "7.18.6", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-regenerator": { - "version": "7.14.5", - "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "version": "7.18.6", "requires": { - "regenerator-transform": "^0.14.2" + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.14.5", - "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-runtime": { - "version": "7.15.0", - "integrity": "sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==", + "version": "7.18.10", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", "semver": "^6.3.0" }, "dependencies": { "@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "version": "0.3.2", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -50877,17 +54376,15 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.2.5", - "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "version": "0.5.3", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.16.2" + "@babel/helper-define-polyfill-provider": "^0.3.2", + "core-js-compat": "^3.21.0" } }, "debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", "dev": true, "requires": { "ms": "2.1.2" @@ -50895,55 +54392,47 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "semver": { "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.14.5", - "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-spread": { - "version": "7.14.6", - "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "version": "7.18.9", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.14.5", - "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-template-literals": { - "version": "7.14.5", - "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "version": "7.18.9", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.14.5", - "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "version": "7.18.9", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typescript": { "version": "7.15.4", - "integrity": "sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA==", "requires": { "@babel/helper-create-class-features-plugin": "^7.15.4", "@babel/helper-plugin-utils": "^7.14.5", @@ -50951,63 +54440,60 @@ } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.14.5", - "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "version": "7.18.10", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.14.5", - "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "version": "7.18.6", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/polyfill": { "version": "7.12.1", - "integrity": "sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==", "requires": { "core-js": "^2.6.5", "regenerator-runtime": "^0.13.4" }, "dependencies": { "core-js": { - "version": "2.6.12", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + "version": "2.6.12" } } }, "@babel/preset-env": { - "version": "7.15.6", - "integrity": "sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==", - "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", - "@babel/plugin-proposal-async-generator-functions": "^7.15.4", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.15.4", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.15.6", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.15.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "version": "7.18.10", + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.18.10", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -51017,55 +54503,52 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.15.3", - "@babel/plugin-transform-classes": "^7.15.4", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.15.4", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.15.4", - "@babel/plugin-transform-modules-systemjs": "^7.15.4", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.15.4", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.15.6", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.16.0", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.18.10", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", + "core-js-compat": "^3.22.1", "semver": "^6.3.0" }, "dependencies": { "@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "version": "0.3.2", "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -51073,44 +54556,38 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.15.6", - "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "version": "7.18.9", "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.15.4" + "@babel/plugin-transform-parameters": "^7.18.8" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.2.5", - "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "version": "0.5.3", "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.16.2" + "@babel/helper-define-polyfill-provider": "^0.3.2", + "core-js-compat": "^3.21.0" } }, "debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", "requires": { "ms": "2.1.2" } }, "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.2" }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" } } }, "@babel/preset-flow": { "version": "7.14.5", - "integrity": "sha512-pP5QEb4qRUSVGzzKx9xqRuHUrM/jEzMqdrZpdMA+oUCRgd5zM1qGr5y5+ZgAL/1tVv1H0dyk5t4SKJntqyiVtg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-validator-option": "^7.14.5", @@ -51118,8 +54595,7 @@ } }, "@babel/preset-modules": { - "version": "0.1.4", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "version": "0.1.5", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -51129,20 +54605,18 @@ } }, "@babel/preset-react": { - "version": "7.14.5", - "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "version": "7.18.6", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/plugin-transform-react-jsx-development": "^7.14.5", - "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" } }, "@babel/preset-typescript": { "version": "7.15.0", - "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-validator-option": "^7.14.5", @@ -51150,101 +54624,90 @@ } }, "@babel/register": { - "version": "7.15.3", - "integrity": "sha512-mj4IY1ZJkorClxKTImccn4T81+UKTo4Ux0+OFSV9hME1ooqS9UV+pJ6BjD0qXPK4T3XW/KNa79XByjeEMZz+fw==", + "version": "7.18.9", "requires": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", "make-dir": "^2.1.0", - "pirates": "^4.0.0", + "pirates": "^4.0.5", "source-map-support": "^0.5.16" } }, "@babel/runtime": { - "version": "7.17.9", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.20.1", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.10" } }, "@babel/runtime-corejs2": { "version": "7.15.4", - "integrity": "sha512-TmuTI+n5HsMesW6Ah2WjvBwix9fBMXwbMxQV3c0ETLAzlmwN4OeRVbYMYwp9P4LEOlAxwGKdd9e8pMiLMAg/Mg==", "requires": { "core-js": "^2.6.5", "regenerator-runtime": "^0.13.4" }, "dependencies": { "core-js": { - "version": "2.6.12", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + "version": "2.6.12" } } }, "@babel/runtime-corejs3": { "version": "7.12.5", - "integrity": "sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ==", "requires": { "core-js-pure": "^3.0.0", "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.15.4", - "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "version": "7.18.10", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" } }, "@babel/traverse": { - "version": "7.15.4", - "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4", + "version": "7.18.11", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "debug": { "version": "4.1.1", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } }, "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.2" } } }, "@babel/types": { - "version": "7.15.6", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "version": "7.18.10", "requires": { - "@babel/helper-validator-identifier": "^7.14.9", + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, "@base2/pretty-print-object": { - "version": "1.0.1", - "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==" + "version": "1.0.1" }, "@bcoe/v8-coverage": { - "version": "0.2.3", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + "version": "0.2.3" }, "@chromaui/localtunnel": { "version": "2.0.4", - "integrity": "sha512-92AI1cIzI8XmKnsuKhIOysdZ+ecc8iCqRnoUnZ4/6Nr9PEd/CStJtK6OBAanw1QYPiojzegfeAW3uBSVFxLm4g==", "dev": true, "requires": { "axios": "0.21.4", @@ -51255,12 +54718,10 @@ "dependencies": { "ansi-regex": { "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "cliui": { "version": "7.0.4", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", @@ -51270,7 +54731,6 @@ }, "debug": { "version": "4.3.1", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -51278,17 +54738,14 @@ }, "is-fullwidth-code-point": { "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -51298,7 +54755,6 @@ }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -51306,7 +54762,6 @@ }, "wrap-ansi": { "version": "7.0.0", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -51316,12 +54771,10 @@ }, "y18n": { "version": "5.0.8", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yargs": { "version": "16.2.0", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -51335,14 +54788,12 @@ }, "yargs-parser": { "version": "20.2.9", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true } } }, "@cnakazawa/watch": { "version": "1.0.4", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, "requires": { "exec-sh": "^0.3.2", @@ -51350,12 +54801,10 @@ } }, "@ctrl/tinycolor": { - "version": "3.3.1", - "integrity": "sha512-jUJrjU62MUgHDSu5JfONfgRM2V7GfN5KknsygfIbxwRZXGeayIzxk4O9GiYgEAr9DG5HJThTF5+a5x3wtrOKzQ==" + "version": "3.4.1" }, "@data-ui/event-flow": { "version": "0.0.84", - "integrity": "sha512-XOOYvpRMAT1r66dnGsrnQ+VEZVtY56np/wxzHcW7iqvvvxefvbkjGMUe0rAbMeSg17hjUfDQTBIBvf3uiVIQTA==", "requires": { "@babel/polyfill": "^7.0.0", "@babel/runtime-corejs2": "^7.1.5", @@ -51391,7 +54840,6 @@ "dependencies": { "@vx/responsive": { "version": "0.0.140", - "integrity": "sha512-qKp2urp7TB3p03xNpzAIoyOGCMoYckLqw9ZV3chVLGbg5yrvsRuot0ghcgSgT3fd1dvqFw1ur2aHeUw7p9q5zQ==", "requires": { "lodash": "^4.0.8" } @@ -51400,7 +54848,6 @@ }, "@data-ui/forms": { "version": "0.0.84", - "integrity": "sha512-c6AEV4XDsIGT0+gwe8MNfRldtZfZaCs+ge2R1p9fkRwQd/nu8dJFVspuu0/EyHBtjm1F9y+6Drs3yyLFK3M+ug==", "requires": { "prop-types": "^15.5.10", "react-select": "^1.2.1" @@ -51408,7 +54855,6 @@ "dependencies": { "react-select": { "version": "1.3.0", - "integrity": "sha512-g/QAU1HZrzSfxkwMAo/wzi6/ezdWye302RGZevsATec07hI/iSxcpB1hejFIp7V63DJ8mwuign6KmB3VjdlinQ==", "requires": { "classnames": "^2.2.4", "prop-types": "^15.5.8", @@ -51419,7 +54865,6 @@ }, "@data-ui/histogram": { "version": "0.0.84", - "integrity": "sha512-JuAUd3cgbDvXd1PKddB3L3SvZj5VFXTLG9za0RlqgbEsddR2dgUfJJQ5GacJ7a3o/SpmJ0zRGJVXb5VZozjj2Q==", "requires": { "@data-ui/shared": "^0.0.84", "@data-ui/theme": "^0.0.84", @@ -51442,7 +54887,6 @@ "dependencies": { "@vx/axis": { "version": "0.0.179", - "integrity": "sha512-FtUcdJxejYn5jgixSgSk9AdA96VwP9sCRATVfGvugEL0gtTKWYDbJEgSgqXfKqpeUdsDdf/JT7NVbLMc1hzrZg==", "requires": { "@vx/group": "0.0.170", "@vx/point": "0.0.165", @@ -51454,21 +54898,18 @@ }, "@vx/bounds": { "version": "0.0.165", - "integrity": "sha512-ZvRb72/4QNs1ZrytZTZxd0hfAb/KKfhsdkcYtIQkmdF6dTsjigMQZ+h2bLvLnbZb/RxyCCoxdiZSGXd+T1c//Q==", "requires": { "prop-types": "^15.5.10" } }, "@vx/event": { "version": "0.0.179", - "integrity": "sha512-wEwqKsxrzoRV/A9Va/f/CHPmV9asrTH/kW/f88jCydsVXd5W/nrJZiVpozN2Zr1Ernv0i1gW5896FWo/LHRg0A==", "requires": { "@vx/point": "0.0.165" } }, "@vx/glyph": { "version": "0.0.179", - "integrity": "sha512-RO7adwyG+9gGzjFdfmplrojgWCT+gsOnIFcRgJNJjx41+P6hWdI9X4OpsLx8VVqNhp7g+hxBDZWte8AxTvLQGw==", "requires": { "@vx/group": "0.0.170", "classnames": "^2.2.5", @@ -51478,7 +54919,6 @@ }, "@vx/gradient": { "version": "0.0.165", - "integrity": "sha512-FjRXMTmcy7k0TWsfDzWWXw6T9WXKP+6LS/GRgnguq271pab/P+AdOJThsVxtBgUc8ZOAPbub3/2Gggz9d8tocg==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.5.7" @@ -51486,26 +54926,22 @@ }, "@vx/group": { "version": "0.0.170", - "integrity": "sha512-RnDdRoy0YI5hokk+YWXc8t39Kp51i4BdCpiwkDJU4YypGycTYnDFjicam6jigUmZ/6wyMirDf/aQboWviFLt2Q==", "requires": { "classnames": "^2.2.5" } }, "@vx/pattern": { "version": "0.0.179", - "integrity": "sha512-qvJsK07oUnSbuzj9jo7b/1Up13DknIeTlj9FDIhg0UNmz90ikVN2CZIWtdJyc2I1AFDEg0odOqYXzUx9aEBRfg==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.5.10" } }, "@vx/point": { - "version": "0.0.165", - "integrity": "sha512-spoHilhjcWNgccrSzBUPw+PXV81tYxeyEWBkgr35aGVU4m7YT86Ywvfemwp7AVVGPn+XJHrhB0ujAhDoyqFPoA==" + "version": "0.0.165" }, "@vx/responsive": { "version": "0.0.192", - "integrity": "sha512-HaXVwhSJXUfRbzRV+glxsX0ki2Hi1mdpz42iuGArVQgDPJEmBHjkXyoiXU8U6v66M7FAH+OyKgtc5j2bfhyYzA==", "requires": { "lodash": "^4.17.10", "prop-types": "^15.6.1", @@ -51514,14 +54950,12 @@ }, "@vx/scale": { "version": "0.0.179", - "integrity": "sha512-j40WiGu4VcHZdaSQAl12ig2w5c4Q9EVn7qqYf9PX7uoS5PbxRYNnHeKZ7e5Bf8O6b57iv5jFTfUV7HkpNF4vvg==", "requires": { "d3-scale": "^2.0.0" }, "dependencies": { "d3-scale": { "version": "2.2.2", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", "requires": { "d3-array": "^1.2.0", "d3-collection": "1", @@ -51535,7 +54969,6 @@ }, "@vx/shape": { "version": "0.0.179", - "integrity": "sha512-YHVNx4xGpbjolkW3Lb5pEgJB0+u349vfnLI976DJlinY0hRNa4TZbWXOB4ywLIrYzQEXXPMUR8WtdubNxg6g0w==", "requires": { "@vx/curve": "0.0.165", "@vx/group": "0.0.170", @@ -51548,7 +54981,6 @@ }, "@vx/tooltip": { "version": "0.0.179", - "integrity": "sha512-BjMURtNpc1g3Li00iHt4bA9lbhk1FnsxCemYI1OF5tSSKHHal2ZAdxRS7o1sR9+jIa3RyD9flfIa1ibtrJh2Ew==", "requires": { "@vx/bounds": "0.0.165", "classnames": "^2.2.5", @@ -51557,7 +54989,6 @@ }, "d3-scale": { "version": "1.0.7", - "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", "requires": { "d3-array": "^1.2.0", "d3-collection": "1", @@ -51569,14 +55000,12 @@ } }, "resize-observer-polyfill": { - "version": "1.5.0", - "integrity": "sha512-M2AelyJDVR/oLnToJLtuDJRBBWUGUvvGigj1411hXhAdyFWqMaqHp7TixW3FpiLuVaikIcR1QL+zqoJoZlOgpg==" + "version": "1.5.0" } } }, "@data-ui/radial-chart": { "version": "0.0.84", - "integrity": "sha512-YKvcrtXD+RnZIngB398exuGICIwbQeVbV3Sbqg6txd4dVN9ixsvOFHCaNO5ugqMcyVeFGpMZAtGeau5kUZa73Q==", "requires": { "@data-ui/shared": "^0.0.84", "@data-ui/theme": "^0.0.84", @@ -51590,7 +55019,6 @@ }, "@data-ui/shared": { "version": "0.0.84", - "integrity": "sha512-MsDLsFzBHFEREr/eF2/RX1o/cXioEg+VQTsM8gViW5ywGQ7Xo5+EqUOaBSrwqKAkvp3e8PaEZVkchPC54IBhrA==", "requires": { "@data-ui/theme": "^0.0.84", "@vx/event": "^0.0.165", @@ -51603,32 +55031,27 @@ "dependencies": { "@vx/bounds": { "version": "0.0.165", - "integrity": "sha512-ZvRb72/4QNs1ZrytZTZxd0hfAb/KKfhsdkcYtIQkmdF6dTsjigMQZ+h2bLvLnbZb/RxyCCoxdiZSGXd+T1c//Q==", "requires": { "prop-types": "^15.5.10" } }, "@vx/event": { "version": "0.0.165", - "integrity": "sha512-FsQiw0f3s5DQB6aBQmBcoWk9e4q65LcDobHIyV8qrmpW2QgV2NvQFM1w0Q300ohpRMgJDzGk68HHHQgFOJvApw==", "requires": { "@vx/point": "0.0.165" } }, "@vx/group": { "version": "0.0.165", - "integrity": "sha512-gi1DSg8AAaVRseyWiq8y4bzyvKiQIXT6vDUYBVRmv2LBcpHocBGaxNiNK0X602RgLG0XmNyRv6qSCWLOaBs3Mg==", "requires": { "classnames": "^2.2.5" } }, "@vx/point": { - "version": "0.0.165", - "integrity": "sha512-spoHilhjcWNgccrSzBUPw+PXV81tYxeyEWBkgr35aGVU4m7YT86Ywvfemwp7AVVGPn+XJHrhB0ujAhDoyqFPoA==" + "version": "0.0.165" }, "@vx/shape": { "version": "0.0.168", - "integrity": "sha512-urKZkwSafMpPQ0wI/L5FJmufRiAR4UsgYUCKxROjfE1Cf4jWNlK6mlVIIASxCdHlh9CGBbIrRMdl5Yv5lzqhjA==", "requires": { "@vx/curve": "0.0.165", "@vx/group": "0.0.165", @@ -51641,7 +55064,6 @@ }, "@vx/tooltip": { "version": "0.0.165", - "integrity": "sha512-/x1NZc67QGQ4e/WNT7Ks5LYRyeLSqp8lG04gX5J6leUS0zscAVzo3aE5u65Qqbc0cnMyMPRZ2Qtb4klWTLg+eQ==", "requires": { "@vx/bounds": "0.0.165", "classnames": "^2.2.5", @@ -51652,7 +55074,6 @@ }, "@data-ui/sparkline": { "version": "0.0.84", - "integrity": "sha512-Ja7T2JjioZtnoy0PEXF72qv/J8xIotu+oS1Z+ygVGZni6aN/DUY35eGpg/DDeemEFDMoifcx+kYa5LU7hQCnJg==", "requires": { "@data-ui/shared": "^0.0.84", "@data-ui/theme": "^0.0.8", @@ -51672,12 +55093,10 @@ }, "dependencies": { "@data-ui/theme": { - "version": "0.0.8", - "integrity": "sha512-mK80ALqWVQkefstoBY9dsKd6GvQmyMsoxFC+ma/IX6aPphWYuVmtSEA6mcn9Snh/dK9QU0qR0oiEklImyfzwBg==" + "version": "0.0.8" }, "@vx/axis": { "version": "0.0.179", - "integrity": "sha512-FtUcdJxejYn5jgixSgSk9AdA96VwP9sCRATVfGvugEL0gtTKWYDbJEgSgqXfKqpeUdsDdf/JT7NVbLMc1hzrZg==", "requires": { "@vx/group": "0.0.170", "@vx/point": "0.0.165", @@ -51689,14 +55108,12 @@ }, "@vx/event": { "version": "0.0.179", - "integrity": "sha512-wEwqKsxrzoRV/A9Va/f/CHPmV9asrTH/kW/f88jCydsVXd5W/nrJZiVpozN2Zr1Ernv0i1gW5896FWo/LHRg0A==", "requires": { "@vx/point": "0.0.165" } }, "@vx/glyph": { "version": "0.0.179", - "integrity": "sha512-RO7adwyG+9gGzjFdfmplrojgWCT+gsOnIFcRgJNJjx41+P6hWdI9X4OpsLx8VVqNhp7g+hxBDZWte8AxTvLQGw==", "requires": { "@vx/group": "0.0.170", "classnames": "^2.2.5", @@ -51706,7 +55123,6 @@ }, "@vx/gradient": { "version": "0.0.165", - "integrity": "sha512-FjRXMTmcy7k0TWsfDzWWXw6T9WXKP+6LS/GRgnguq271pab/P+AdOJThsVxtBgUc8ZOAPbub3/2Gggz9d8tocg==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.5.7" @@ -51714,26 +55130,22 @@ }, "@vx/group": { "version": "0.0.170", - "integrity": "sha512-RnDdRoy0YI5hokk+YWXc8t39Kp51i4BdCpiwkDJU4YypGycTYnDFjicam6jigUmZ/6wyMirDf/aQboWviFLt2Q==", "requires": { "classnames": "^2.2.5" } }, "@vx/pattern": { "version": "0.0.179", - "integrity": "sha512-qvJsK07oUnSbuzj9jo7b/1Up13DknIeTlj9FDIhg0UNmz90ikVN2CZIWtdJyc2I1AFDEg0odOqYXzUx9aEBRfg==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.5.10" } }, "@vx/point": { - "version": "0.0.165", - "integrity": "sha512-spoHilhjcWNgccrSzBUPw+PXV81tYxeyEWBkgr35aGVU4m7YT86Ywvfemwp7AVVGPn+XJHrhB0ujAhDoyqFPoA==" + "version": "0.0.165" }, "@vx/responsive": { "version": "0.0.192", - "integrity": "sha512-HaXVwhSJXUfRbzRV+glxsX0ki2Hi1mdpz42iuGArVQgDPJEmBHjkXyoiXU8U6v66M7FAH+OyKgtc5j2bfhyYzA==", "requires": { "lodash": "^4.17.10", "prop-types": "^15.6.1", @@ -51742,14 +55154,12 @@ }, "@vx/scale": { "version": "0.0.179", - "integrity": "sha512-j40WiGu4VcHZdaSQAl12ig2w5c4Q9EVn7qqYf9PX7uoS5PbxRYNnHeKZ7e5Bf8O6b57iv5jFTfUV7HkpNF4vvg==", "requires": { "d3-scale": "^2.0.0" } }, "@vx/shape": { "version": "0.0.179", - "integrity": "sha512-YHVNx4xGpbjolkW3Lb5pEgJB0+u349vfnLI976DJlinY0hRNa4TZbWXOB4ywLIrYzQEXXPMUR8WtdubNxg6g0w==", "requires": { "@vx/curve": "0.0.165", "@vx/group": "0.0.170", @@ -51761,18 +55171,15 @@ } }, "resize-observer-polyfill": { - "version": "1.5.0", - "integrity": "sha512-M2AelyJDVR/oLnToJLtuDJRBBWUGUvvGigj1411hXhAdyFWqMaqHp7TixW3FpiLuVaikIcR1QL+zqoJoZlOgpg==" + "version": "1.5.0" } } }, "@data-ui/theme": { - "version": "0.0.84", - "integrity": "sha512-jIoHftC/5c/LVJYF4VSBjjVjrjc0yj4mLkGe8p0eVO7qUYKVvlWx7PrpM7ucyefvuAaKIwlr+Nh2xPGPdADjaA==" + "version": "0.0.84" }, "@data-ui/xy-chart": { "version": "0.0.84", - "integrity": "sha512-4mRWEGfeQJ2kFXmQ81k1gDPx2zdkty6lt0+srui4zleSyhnBv1dmm9J03dq+qwr7+bpzjfq77nINV5HXWb31Bg==", "requires": { "@data-ui/shared": "^0.0.84", "@data-ui/theme": "^0.0.84", @@ -51799,7 +55206,6 @@ "dependencies": { "@vx/axis": { "version": "0.0.175", - "integrity": "sha512-qVRIHurnbPnRF4p0KQITArOUSF564tWW1pc48giLz+DJGlcJ4H9RfOSTpV6rnnP15xto6pQdQehBgBAvFRmoig==", "requires": { "@vx/group": "0.0.170", "@vx/point": "0.0.165", @@ -51811,14 +55217,12 @@ "dependencies": { "@vx/group": { "version": "0.0.170", - "integrity": "sha512-RnDdRoy0YI5hokk+YWXc8t39Kp51i4BdCpiwkDJU4YypGycTYnDFjicam6jigUmZ/6wyMirDf/aQboWviFLt2Q==", "requires": { "classnames": "^2.2.5" } }, "@vx/shape": { "version": "0.0.175", - "integrity": "sha512-bjAJoIIpKjUEPDV2xmTYGUvSvwRztv+6rd1c6NPZG/nIuqsMHFnFig/2xTcQJEQhRg6aKzvxIUo43zPSSq3fWA==", "requires": { "@vx/curve": "0.0.165", "@vx/group": "0.0.170", @@ -51831,7 +55235,6 @@ }, "@vx/text": { "version": "0.0.175", - "integrity": "sha512-SOBhctXXAGhhpCOiTjxOM/8NDaDqGRk3OGfsJ714Mt1UJX6VQaKxFocZJwn6IMw3mNG6/p7O4Eao/gGDcoM6+A==", "requires": { "babel-plugin-lodash": "^3.3.2", "classnames": "^2.2.5", @@ -51843,21 +55246,18 @@ }, "@vx/bounds": { "version": "0.0.165", - "integrity": "sha512-ZvRb72/4QNs1ZrytZTZxd0hfAb/KKfhsdkcYtIQkmdF6dTsjigMQZ+h2bLvLnbZb/RxyCCoxdiZSGXd+T1c//Q==", "requires": { "prop-types": "^15.5.10" } }, "@vx/event": { "version": "0.0.165", - "integrity": "sha512-FsQiw0f3s5DQB6aBQmBcoWk9e4q65LcDobHIyV8qrmpW2QgV2NvQFM1w0Q300ohpRMgJDzGk68HHHQgFOJvApw==", "requires": { "@vx/point": "0.0.165" } }, "@vx/glyph": { "version": "0.0.165", - "integrity": "sha512-kccUm40e/VCtayxqvcwc2K2M6oNXO7IafwIfw1RRv6Fj4Iutto9ZpI+PGOf/zPnYVueoLnWBXT/HE7IRS+C2gw==", "requires": { "@vx/group": "0.0.165", "classnames": "^2.2.5", @@ -51866,7 +55266,6 @@ }, "@vx/gradient": { "version": "0.0.165", - "integrity": "sha512-FjRXMTmcy7k0TWsfDzWWXw6T9WXKP+6LS/GRgnguq271pab/P+AdOJThsVxtBgUc8ZOAPbub3/2Gggz9d8tocg==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.5.7" @@ -51874,7 +55273,6 @@ }, "@vx/grid": { "version": "0.0.180", - "integrity": "sha512-+ugS0c6GbwHr6pFU0znnOG3/zTwRRadvWwj3E4ZOHmKUSz6ZEN6JNo+rD3WSZckYwLis6UivmYfJ5cV6AM4ufg==", "requires": { "@vx/group": "0.0.170", "@vx/point": "0.0.165", @@ -51885,14 +55283,12 @@ "dependencies": { "@vx/group": { "version": "0.0.170", - "integrity": "sha512-RnDdRoy0YI5hokk+YWXc8t39Kp51i4BdCpiwkDJU4YypGycTYnDFjicam6jigUmZ/6wyMirDf/aQboWviFLt2Q==", "requires": { "classnames": "^2.2.5" } }, "@vx/shape": { "version": "0.0.179", - "integrity": "sha512-YHVNx4xGpbjolkW3Lb5pEgJB0+u349vfnLI976DJlinY0hRNa4TZbWXOB4ywLIrYzQEXXPMUR8WtdubNxg6g0w==", "requires": { "@vx/curve": "0.0.165", "@vx/group": "0.0.170", @@ -51907,26 +55303,22 @@ }, "@vx/group": { "version": "0.0.165", - "integrity": "sha512-gi1DSg8AAaVRseyWiq8y4bzyvKiQIXT6vDUYBVRmv2LBcpHocBGaxNiNK0X602RgLG0XmNyRv6qSCWLOaBs3Mg==", "requires": { "classnames": "^2.2.5" } }, "@vx/pattern": { "version": "0.0.165", - "integrity": "sha512-h5nmfcYlQYYzNhlhqaYUvVnkmGnC0yWv5yU1snjHweGmIHTovV3RAbKgVFAP7kB3i2rbEtC3O8WkJN++cZdLzA==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.5.10" } }, "@vx/point": { - "version": "0.0.165", - "integrity": "sha512-spoHilhjcWNgccrSzBUPw+PXV81tYxeyEWBkgr35aGVU4m7YT86Ywvfemwp7AVVGPn+XJHrhB0ujAhDoyqFPoA==" + "version": "0.0.165" }, "@vx/responsive": { "version": "0.0.192", - "integrity": "sha512-HaXVwhSJXUfRbzRV+glxsX0ki2Hi1mdpz42iuGArVQgDPJEmBHjkXyoiXU8U6v66M7FAH+OyKgtc5j2bfhyYzA==", "requires": { "lodash": "^4.17.10", "prop-types": "^15.6.1", @@ -51935,14 +55327,12 @@ }, "@vx/scale": { "version": "0.0.165", - "integrity": "sha512-5jSgXJDU6J/KWIyCbpjHqysPCddp7tG3LbTV7UmtB1Qleb4m4slShTVSE7+EKU+zgiQPDGm0+E2ht4cet+7F7A==", "requires": { "d3-scale": "^2.0.0" } }, "@vx/shape": { "version": "0.0.165", - "integrity": "sha512-D9naH/glDtw8J8IcdumpRz1ihaoCAYMwFNh2KTv73HiTKrLQSXvIjwYFv9C0b8BCPNOXkDZS8s+AlgMSqGlZNQ==", "requires": { "@vx/curve": "0.0.165", "@vx/group": "0.0.165", @@ -51955,7 +55345,6 @@ }, "@vx/text": { "version": "0.0.192", - "integrity": "sha512-lyy7eXfmQ8SJF7Qx+bCRcaEgvVSa18Lp6eRMo3GMANumUh9kSe7LwgqRFSdBJ85WkPqX+UOkJVyCH7AOlt0IWA==", "requires": { "classnames": "^2.2.5", "lodash": "^4.17.15", @@ -51965,7 +55354,6 @@ }, "@vx/tooltip": { "version": "0.0.165", - "integrity": "sha512-/x1NZc67QGQ4e/WNT7Ks5LYRyeLSqp8lG04gX5J6leUS0zscAVzo3aE5u65Qqbc0cnMyMPRZ2Qtb4klWTLg+eQ==", "requires": { "@vx/bounds": "0.0.165", "classnames": "^2.2.5", @@ -51973,14 +55361,12 @@ } }, "resize-observer-polyfill": { - "version": "1.5.0", - "integrity": "sha512-M2AelyJDVR/oLnToJLtuDJRBBWUGUvvGigj1411hXhAdyFWqMaqHp7TixW3FpiLuVaikIcR1QL+zqoJoZlOgpg==" + "version": "1.5.0" } } }, "@deck.gl/aggregation-layers": { "version": "8.5.2", - "integrity": "sha512-oiqXPmyn2v0lX9tWCvgmWs29stHSLS3tje71Ff2FVXDNmvP5FoZItFa8y7O7KSTkej2/rSwZeSte/a9pri6Njg==", "requires": { "@luma.gl/shadertools": "^8.5.4", "@math.gl/web-mercator": "^3.5.3", @@ -51989,7 +55375,6 @@ }, "@deck.gl/carto": { "version": "8.5.2", - "integrity": "sha512-Kw/3NUM+2NcHjxH6b7IOUYXEwmJ4SNQujFzAVFW5amG4Lut8074NGSF5XHi+4M/zgk7vXDFsGRxLqspsA/dg8w==", "requires": { "@loaders.gl/loader-utils": "^3.0.6", "@loaders.gl/mvt": "^3.0.6", @@ -52001,14 +55386,12 @@ "dependencies": { "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } }, "d3-scale": { "version": "3.3.0", - "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", "requires": { "d3-array": "^2.3.0", "d3-format": "1 - 2", @@ -52019,7 +55402,6 @@ }, "d3-time": { "version": "2.1.1", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", "requires": { "d3-array": "2" } @@ -52028,7 +55410,6 @@ }, "@deck.gl/core": { "version": "8.5.2", - "integrity": "sha512-SAFv7fKx6k1Rj8R4qTMQO2wEhEfixROzbcoSS6RivxrfES00KYYj6jJ7iNEnq3dFn6qc37LPpxqtYYHO4BcvYA==", "requires": { "@loaders.gl/core": "^3.0.6", "@loaders.gl/images": "^3.0.6", @@ -52042,14 +55423,12 @@ }, "@deck.gl/extensions": { "version": "8.5.2", - "integrity": "sha512-VhbQsMNPM7RCR/ERwb1u1x0rEWAxgXfcCWttW+gYvbiagW/LrAJ22jhOghlRW/wilEmupHYbXQlWkW2V/mYfsg==", "requires": { "@luma.gl/shadertools": "^8.5.4" } }, "@deck.gl/geo-layers": { "version": "8.5.2", - "integrity": "sha512-t6+TgAdbKWDw8g9UX1y6D+5twcdJuKaXw4qSib/0yVurWi/Mil5Plihybt1l9uBZuwkr+UcpxPR73zzo+qd9MA==", "requires": { "@loaders.gl/3d-tiles": "^3.0.6", "@loaders.gl/gis": "^3.0.6", @@ -52066,12 +55445,10 @@ } }, "@deck.gl/google-maps": { - "version": "8.5.2", - "integrity": "sha512-Dk3ozenBWgt9nFSYOT4N82urNW/JhiMszfFq6zLt3jUp0N7EJ9d2XO81hclM59BhjIdGWb6drTe96NvtbabVLQ==" + "version": "8.5.2" }, "@deck.gl/json": { "version": "8.5.2", - "integrity": "sha512-lVS16bvPfLUSidgBURZvGbWEjgK8GjLWlp1iGuLvua2W6TnWIyiKa6a3XoebgeXd8kqwSbQxhNnuSVPX+Di6Rg==", "requires": { "d3-dsv": "^1.0.8", "expression-eval": "^2.0.0" @@ -52079,7 +55456,6 @@ }, "@deck.gl/layers": { "version": "8.5.2", - "integrity": "sha512-HmpE3qf9CI7sU/xa2DMCNg31pzpzK5XuUHyC70dsLq8AV7Sm3vZQz17KMU/CWSZpVr7yQ8uxTeSQARiv/zeOFQ==", "requires": { "@loaders.gl/images": "^3.0.6", "@mapbox/tiny-sdf": "^1.1.0", @@ -52088,12 +55464,10 @@ } }, "@deck.gl/mapbox": { - "version": "8.5.2", - "integrity": "sha512-nMpzfdPFBVthT+EMgIcKo4YO6bZCqADQtqnxIFtfofZIiKS6R5OSuJ3sXPSNZ9ReCJGzdmndEz7/Qtm9Sia/bA==" + "version": "8.5.2" }, "@deck.gl/mesh-layers": { "version": "8.5.2", - "integrity": "sha512-dUfQyGjm5CYQg9AQdRsGtEEXGSGHxifPlws0zWWoj1r757wjqM0aZ663TUJEsJQDTLNOvbBLGTiuFeCBUoKO4Q==", "requires": { "@loaders.gl/gltf": "^3.0.6", "@luma.gl/experimental": "^8.5.4", @@ -52102,18 +55476,15 @@ }, "@deck.gl/react": { "version": "8.5.2", - "integrity": "sha512-h7AJ9nPY1PTjrAVP7T1fvWDChWZrVOsEfYIoEP4W6ILSjvDqEQfVL0+9RhjUwQV2nKrg0QmpqCmbfOrgKQQbYw==", "requires": { "prop-types": "^15.6.0" } }, "@discoveryjs/json-ext": { - "version": "0.5.3", - "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==" + "version": "0.5.7" }, "@emotion/babel-plugin": { "version": "11.3.0", - "integrity": "sha512-UZKwBV2rADuhRp+ZOGgNWg2eYgbzKzQXfQPtJbu/PLy8onurxlNCLvxMQEvlr1/GudguPI5IU9qIY1+2z1M5bA==", "requires": { "@babel/helper-module-imports": "^7.12.13", "@babel/plugin-syntax-jsx": "^7.12.13", @@ -52130,12 +55501,10 @@ }, "dependencies": { "@emotion/memoize": { - "version": "0.7.5", - "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" + "version": "0.7.5" }, "@emotion/serialize": { "version": "1.0.2", - "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", "requires": { "@emotion/hash": "^0.8.0", "@emotion/memoize": "^0.7.4", @@ -52145,29 +55514,24 @@ } }, "@emotion/utils": { - "version": "1.0.0", - "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" + "version": "1.0.0" }, "csstype": { - "version": "3.0.8", - "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + "version": "3.0.8" }, "escape-string-regexp": { - "version": "4.0.0", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "version": "4.0.0" } } }, "@emotion/babel-plugin-jsx-pragmatic": { "version": "0.1.5", - "integrity": "sha512-y+3AJ0SItMDaAgGPVkQBC/S/BaqaPACkQ6MyCI2CUlrjTxKttTVfD3TMtcs7vLEcLxqzZ1xiG0vzwCXjhopawQ==", "requires": { "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@emotion/babel-preset-css-prop": { "version": "11.2.0", - "integrity": "sha512-9XLQm2eLPYTho+Cx1LQTDA1rATjoAaB4O+ds55XDvoAa+Z16Hhg8y5Vihj3C8E6+ilDM8SV5A9Z6z+yj0YIRBg==", "requires": { "@babel/plugin-transform-react-jsx": "^7.12.1", "@babel/runtime": "^7.7.2", @@ -52177,7 +55541,6 @@ }, "@emotion/cache": { "version": "11.4.0", - "integrity": "sha512-Zx70bjE7LErRO9OaZrhf22Qye1y4F7iDl+ITjet0J+i+B88PrAOBkKvaAWhxsZf72tDLajwCgfCjJ2dvH77C3g==", "requires": { "@emotion/memoize": "^0.7.4", "@emotion/sheet": "^1.0.0", @@ -52187,18 +55550,15 @@ }, "dependencies": { "@emotion/sheet": { - "version": "1.0.2", - "integrity": "sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw==" + "version": "1.0.2" }, "@emotion/utils": { - "version": "1.0.0", - "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" + "version": "1.0.0" } } }, "@emotion/core": { "version": "10.1.1", - "integrity": "sha512-ZMLG6qpXR8x031NXD8HJqugy/AZSkAuMxxqB46pmAR7ze47MhNJ56cdoX243QPZdGctrdfo+s08yZTiwaUcRKA==", "requires": { "@babel/runtime": "^7.5.5", "@emotion/cache": "^10.0.27", @@ -52210,7 +55570,6 @@ "dependencies": { "@emotion/cache": { "version": "10.0.29", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", "requires": { "@emotion/sheet": "0.9.4", "@emotion/stylis": "0.8.5", @@ -52222,7 +55581,6 @@ }, "@emotion/css": { "version": "10.0.27", - "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", "requires": { "@emotion/serialize": "^0.11.15", "@emotion/utils": "0.11.3", @@ -52231,7 +55589,6 @@ }, "@emotion/css-prettifier": { "version": "1.0.0", - "integrity": "sha512-efxSrRTiTqHTQVKW15Gz5H4pNAw8OqcG8NaiwkJIkqIdNXTD4Qr1zC1Ou6r2acd1oJJ2s56nb1ClnXMiWoj6gQ==", "dev": true, "requires": { "@emotion/memoize": "^0.7.4", @@ -52239,19 +55596,16 @@ } }, "@emotion/hash": { - "version": "0.8.0", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + "version": "0.8.0" }, "@emotion/is-prop-valid": { "version": "0.8.8", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", "requires": { "@emotion/memoize": "0.7.4" } }, "@emotion/jest": { "version": "11.3.0", - "integrity": "sha512-LZqYc3yerhic1IvAcEwBLRs1DsUt3oY7Oz6n+e+HU32iYOK/vpfzlhgmQURE94BHfv6eCOj6DV38f3jSnIkBkQ==", "dev": true, "requires": { "@babel/runtime": "^7.13.10", @@ -52262,12 +55616,10 @@ } }, "@emotion/memoize": { - "version": "0.7.4", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + "version": "0.7.4" }, "@emotion/react": { "version": "11.4.1", - "integrity": "sha512-pRegcsuGYj4FCdZN6j5vqCALkNytdrKw3TZMekTzNXixRg4wkLsU5QEaBG5LC6l01Vppxlp7FE3aTHpIG5phLg==", "requires": { "@babel/runtime": "^7.13.10", "@emotion/cache": "^11.4.0", @@ -52280,7 +55632,6 @@ "dependencies": { "@emotion/serialize": { "version": "1.0.2", - "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", "requires": { "@emotion/hash": "^0.8.0", "@emotion/memoize": "^0.7.4", @@ -52290,22 +55641,18 @@ } }, "@emotion/sheet": { - "version": "1.0.2", - "integrity": "sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw==" + "version": "1.0.2" }, "@emotion/utils": { - "version": "1.0.0", - "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" + "version": "1.0.0" }, "csstype": { - "version": "3.0.8", - "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + "version": "3.0.8" } } }, "@emotion/serialize": { "version": "0.11.16", - "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", "requires": { "@emotion/hash": "0.8.0", "@emotion/memoize": "0.7.4", @@ -52315,12 +55662,10 @@ } }, "@emotion/sheet": { - "version": "0.9.4", - "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" + "version": "0.9.4" }, "@emotion/styled": { "version": "11.3.0", - "integrity": "sha512-fUoLcN3BfMiLlRhJ8CuPUMEyKkLEoM+n+UyAbnqGEsCd5IzKQ7VQFLtzpJOaCD2/VR2+1hXQTnSZXVJeiTNltA==", "requires": { "@babel/runtime": "^7.13.10", "@emotion/babel-plugin": "^11.3.0", @@ -52331,14 +55676,12 @@ "dependencies": { "@emotion/is-prop-valid": { "version": "1.1.0", - "integrity": "sha512-9RkilvXAufQHsSsjQ3PIzSns+pxuX4EW8EbGeSPjZMHuMx6z/MOzb9LpqNieQX4F3mre3NWS2+X3JNRHTQztUQ==", "requires": { "@emotion/memoize": "^0.7.4" } }, "@emotion/serialize": { "version": "1.0.2", - "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", "requires": { "@emotion/hash": "^0.8.0", "@emotion/memoize": "^0.7.4", @@ -52348,18 +55691,15 @@ } }, "@emotion/utils": { - "version": "1.0.0", - "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" + "version": "1.0.0" }, "csstype": { - "version": "3.0.8", - "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" + "version": "3.0.8" } } }, "@emotion/styled-base": { "version": "10.3.0", - "integrity": "sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==", "requires": { "@babel/runtime": "^7.5.5", "@emotion/is-prop-valid": "0.8.8", @@ -52368,24 +55708,19 @@ } }, "@emotion/stylis": { - "version": "0.8.5", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + "version": "0.8.5" }, "@emotion/unitless": { - "version": "0.7.5", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + "version": "0.7.5" }, "@emotion/utils": { - "version": "0.11.3", - "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + "version": "0.11.3" }, - "@emotion/weak-memoize": { - "version": "0.2.5", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + "@emotion/weak-memoize": { + "version": "0.2.5" }, "@encodable/color": { "version": "1.1.1", - "integrity": "sha512-3QlHqsaD+D4W4T6E4Wq4mp7MBpt5yCkCmgTh6AfsoUfJeAEogA92d8r3Y67Zuppcs/eepHW0ip8zfehS2jZNkQ==", "requires": { "@encodable/registry": "^1.0.3", "@types/d3-interpolate": "^1.3.1", @@ -52398,32 +55733,27 @@ "dependencies": { "@types/d3-scale": { "version": "3.3.2", - "integrity": "sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ==", "requires": { "@types/d3-time": "^2" } }, "@types/d3-time": { - "version": "2.1.1", - "integrity": "sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg==" + "version": "2.1.1" }, "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } }, "d3-interpolate": { "version": "2.0.1", - "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", "requires": { "d3-color": "1 - 2" } }, "d3-scale": { "version": "3.3.0", - "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", "requires": { "d3-array": "^2.3.0", "d3-format": "1 - 2", @@ -52434,7 +55764,6 @@ }, "d3-time": { "version": "2.1.1", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", "requires": { "d3-array": "2" } @@ -52443,7 +55772,6 @@ }, "@encodable/format": { "version": "1.0.6", - "integrity": "sha512-gtzLMQyw4AJ7m3TIANm2z2QfzZJLGLdhVmKbizRRu9MRMlYIVXhk+46zPm10RNxGv4ybpsfcCfkCd4nL3RlZRg==", "requires": { "@encodable/registry": "^1.0.3", "@types/d3-format": "^1.3.1", @@ -52456,25 +55784,21 @@ "dependencies": { "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } }, "d3-format": { - "version": "2.0.0", - "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" + "version": "2.0.0" }, "d3-time": { "version": "2.1.1", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", "requires": { "d3-array": "2" } }, "d3-time-format": { "version": "3.0.0", - "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", "requires": { "d3-time": "1 - 2" } @@ -52482,12 +55806,10 @@ } }, "@encodable/registry": { - "version": "1.0.3", - "integrity": "sha512-YH2nSBZJKgbH/9MkQXzAEE9UwTaVcWiKgVFyEU/gvrfmNWqecYaHMTyObo+ADSTGF4kk0cZZkr7VqZgIQbvrUw==" + "version": "1.0.3" }, "@eslint/eslintrc": { "version": "0.4.3", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -52503,7 +55825,6 @@ "dependencies": { "debug": { "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -52511,7 +55832,6 @@ }, "globals": { "version": "13.12.0", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -52519,27 +55839,22 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "type-fest": { "version": "0.20.2", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true } } }, "@fontsource/inter": { - "version": "4.0.0", - "integrity": "sha512-zc9DDGEz0cgftT6VbHPrdBBVaBQrK4P6UDuuNrib1KNnbDCY1zHTMwYiN2XH6SFDufRKnsjUR5cEeWDANDDaYw==" + "version": "4.0.0" }, "@gar/promisify": { - "version": "1.1.2", - "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==" + "version": "1.1.3" }, "@hot-loader/react-dom": { "version": "16.13.0", - "integrity": "sha512-lJZrmkucz2MrQJTQtJobx5MICXcfQvKihszqv655p557HPi0hMOWxrNpiHv3DWD8ugNWjtWcVWqRnFvwsHq1mQ==", "dev": true, "requires": { "loose-envify": "^1.1.0", @@ -52550,7 +55865,6 @@ "dependencies": { "scheduler": { "version": "0.19.0", - "integrity": "sha512-xowbVaTPe9r7y7RUejcK73/j8tt2jfiyTednOvHbA8JoClvMYCp+r8QegLwK/n8zWQAtZb1fFnER4XLBZXrCxA==", "dev": true, "requires": { "loose-envify": "^1.1.0", @@ -52561,7 +55875,6 @@ }, "@humanwhocodes/config-array": { "version": "0.5.0", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.0", @@ -52571,7 +55884,6 @@ "dependencies": { "debug": { "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -52579,24 +55891,24 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "@humanwhocodes/object-schema": { "version": "1.2.1", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "@hutson/parse-repository-url": { "version": "3.0.2", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true + }, + "@isaacs/string-locale-compare": { + "version": "1.1.0", "dev": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { "camelcase": "^5.3.1", @@ -52608,7 +55920,6 @@ "dependencies": { "find-up": { "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -52617,7 +55928,6 @@ }, "locate-path": { "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -52625,7 +55935,6 @@ }, "p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -52633,7 +55942,6 @@ }, "p-locate": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -52641,36 +55949,30 @@ }, "p-try": { "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "path-exists": { "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "resolve-from": { "version": "5.0.0", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, "@istanbuljs/nyc-config-typescript": { "version": "1.0.1", - "integrity": "sha512-/gz6LgVpky205LuoOfwEZmnUtaSmdk0QIMcNFj9OvxhiMhPpKftMgZmGN7jNj7jR+lr8IB1Yks3QSSSNSxfoaQ==", "dev": true, "requires": { "@istanbuljs/schema": "^0.1.2" } }, "@istanbuljs/schema": { - "version": "0.1.2", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" + "version": "0.1.2" }, "@jest/console": { "version": "26.6.2", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -52683,7 +55985,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -52691,7 +55992,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -52699,12 +55999,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -52717,7 +56015,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -52726,12 +56023,10 @@ }, "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -52741,7 +56036,6 @@ }, "@jest/core": { "version": "26.6.3", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "requires": { "@jest/console": "^26.6.2", @@ -52776,12 +56070,10 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -52789,7 +56081,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -52797,12 +56088,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -52815,7 +56104,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -52824,12 +56112,10 @@ }, "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "strip-ansi": { "version": "6.0.0", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { "ansi-regex": "^5.0.0" @@ -52837,7 +56123,6 @@ }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -52847,7 +56132,6 @@ }, "@jest/environment": { "version": "26.6.2", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { "@jest/fake-timers": "^26.6.2", @@ -52858,7 +56142,6 @@ }, "@jest/fake-timers": { "version": "26.6.2", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -52871,7 +56154,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -52879,7 +56161,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -52887,12 +56168,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -52905,7 +56184,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -52914,7 +56192,6 @@ }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -52924,7 +56201,6 @@ }, "@jest/globals": { "version": "26.6.2", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "dev": true, "requires": { "@jest/environment": "^26.6.2", @@ -52934,7 +56210,6 @@ }, "@jest/reporters": { "version": "26.6.2", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", @@ -52966,7 +56241,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -52974,7 +56248,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -52982,12 +56255,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -53000,7 +56271,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -53009,17 +56279,14 @@ }, "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -53029,7 +56296,6 @@ }, "@jest/source-map": { "version": "26.6.2", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -53039,14 +56305,12 @@ "dependencies": { "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "@jest/test-result": { "version": "26.6.2", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { "@jest/console": "^26.6.2", @@ -53057,7 +56321,6 @@ }, "@jest/test-sequencer": { "version": "26.6.3", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "dev": true, "requires": { "@jest/test-result": "^26.6.2", @@ -53069,7 +56332,6 @@ }, "@jest/transform": { "version": "26.6.2", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "dev": true, "requires": { "@babel/core": "^7.1.0", @@ -53091,7 +56353,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -53099,7 +56360,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -53107,12 +56367,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -53125,7 +56383,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -53134,17 +56391,14 @@ }, "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -53154,7 +56408,6 @@ }, "@jest/types": { "version": "26.6.2", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -53166,7 +56419,6 @@ "dependencies": { "@types/istanbul-reports": { "version": "3.0.0", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" @@ -53174,139 +56426,404 @@ } } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0" + }, + "@jridgewell/set-array": { + "version": "1.1.2" + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true + }, "@lerna/add": { - "version": "4.0.0", - "integrity": "sha512-cpmAH1iS3k8JBxNvnMqrGTTjbY/ZAiKa1ChJzFevMYY3eeqbvhsBKnBcxjRXtdrJ6bd3dCQM+ZtK+0i682Fhng==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/bootstrap": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/npm-conf": "4.0.0", - "@lerna/validation-error": "4.0.0", + "@lerna/bootstrap": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/filter-options": "6.1.0", + "@lerna/npm-conf": "6.1.0", + "@lerna/validation-error": "6.1.0", "dedent": "^0.7.0", - "npm-package-arg": "^8.1.0", + "npm-package-arg": "8.1.1", "p-map": "^4.0.0", - "pacote": "^11.2.6", + "pacote": "^13.6.1", "semver": "^7.3.4" }, "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "3.0.2", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "7.14.1", + "dev": true + } + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/node-gyp": { + "version": "2.0.0", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "3.0.0", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, "@npmcli/run-script": { - "version": "1.8.6", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", + "version": "4.2.1", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + } + }, + "brace-expansion": { + "version": "2.0.1", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "builtins": { + "version": "5.0.1", "dev": true, "requires": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" + "semver": "^7.0.0" } }, "cacache": { - "version": "15.3.0", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "version": "16.1.3", "dev": true, "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "7.14.1", + "dev": true + } } }, "chownr": { "version": "2.0.0", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, + "glob": { + "version": "8.0.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "hosted-git-info": { + "version": "3.0.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, + "minimatch": { + "version": "5.1.2", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, "mkdirp": { "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, - "node-gyp": { - "version": "7.1.2", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "npm-install-checks": { + "version": "5.0.0", "dev": true, "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.1", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "7.0.2", + "dev": true, + "requires": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } + } + }, + "npm-registry-fetch": { + "version": "13.3.1", + "dev": true, + "requires": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } } }, "pacote": { - "version": "11.3.5", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", + "version": "13.6.2", "dev": true, "requires": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } } }, + "proc-log": { + "version": "2.0.1", + "dev": true + }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "version": "9.0.1", "dev": true, "requires": { "minipass": "^3.1.1" } }, + "unique-filename": { + "version": "2.0.1", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -53314,87 +56831,543 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/bootstrap": { - "version": "4.0.0", - "integrity": "sha512-RkS7UbeM2vu+kJnHzxNRCLvoOP9yGNgkzRdy4UV2hNalD7EP41bLvRVOwRYQ7fhc2QcbhnKNdOBihYRL0LcKtw==", - "dev": true, - "requires": { - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/has-npm-version": "4.0.0", - "@lerna/npm-install": "4.0.0", - "@lerna/package-graph": "4.0.0", - "@lerna/pulse-till-done": "4.0.0", - "@lerna/rimraf-dir": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/symlink-binary": "4.0.0", - "@lerna/symlink-dependencies": "4.0.0", - "@lerna/validation-error": "4.0.0", + "version": "6.1.0", + "dev": true, + "requires": { + "@lerna/command": "6.1.0", + "@lerna/filter-options": "6.1.0", + "@lerna/has-npm-version": "6.1.0", + "@lerna/npm-install": "6.1.0", + "@lerna/package-graph": "6.1.0", + "@lerna/pulse-till-done": "6.1.0", + "@lerna/rimraf-dir": "6.1.0", + "@lerna/run-lifecycle": "6.1.0", + "@lerna/run-topologically": "6.1.0", + "@lerna/symlink-binary": "6.1.0", + "@lerna/symlink-dependencies": "6.1.0", + "@lerna/validation-error": "6.1.0", + "@npmcli/arborist": "5.3.0", "dedent": "^0.7.0", "get-port": "^5.1.1", "multimatch": "^5.0.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", + "npm-package-arg": "8.1.1", + "npmlog": "^6.0.2", "p-map": "^4.0.0", "p-map-series": "^2.1.0", "p-waterfall": "^2.1.1", - "read-package-tree": "^5.3.1", "semver": "^7.3.4" }, "dependencies": { + "@npmcli/arborist": { + "version": "5.3.0", + "dev": true, + "requires": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^4.1.3", + "bin-links": "^3.0.0", + "cacache": "^16.0.6", + "common-ancestor-path": "^1.0.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^5.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", + "walk-up-path": "^1.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } + } + }, + "@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "3.0.2", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + } + }, + "@npmcli/metavuln-calculator": { + "version": "3.1.1", + "dev": true, + "requires": { + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/node-gyp": { + "version": "2.0.0", + "dev": true + }, + "@npmcli/package-json": { + "version": "2.0.0", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.1" + } + }, + "@npmcli/promise-spawn": { + "version": "3.0.0", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "4.2.1", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + } + }, + "bin-links": { + "version": "3.0.3", + "dev": true, + "requires": { + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0", + "read-cmd-shim": "^3.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^4.0.0" + } + }, + "brace-expansion": { + "version": "2.0.1", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "builtins": { + "version": "5.0.1", + "dev": true, + "requires": { + "semver": "^7.0.0" + } + }, + "cacache": { + "version": "16.1.3", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + } + }, + "chownr": { + "version": "2.0.0", + "dev": true + }, + "cmd-shim": { + "version": "5.0.0", + "dev": true, + "requires": { + "mkdirp-infer-owner": "^2.0.0" + } + }, + "glob": { + "version": "8.0.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "hosted-git-info": { + "version": "3.0.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "just-diff": { + "version": "5.2.0", + "dev": true + }, + "just-diff-apply": { + "version": "5.5.0", + "dev": true + }, "lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "7.14.1", + "dev": true + }, + "minimatch": { + "version": "5.1.2", "dev": true, "requires": { - "yallist": "^4.0.0" + "brace-expansion": "^2.0.1" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "mkdirp": { + "version": "1.0.4", + "dev": true + }, + "npm-install-checks": { + "version": "5.0.0", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.1", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "7.0.2", + "dev": true, + "requires": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } + } + }, + "npm-registry-fetch": { + "version": "13.3.1", + "dev": true, + "requires": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } + } + }, + "pacote": { + "version": "13.6.2", + "dev": true, + "requires": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } + } + }, + "parse-conflict-json": { + "version": "2.0.2", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" + } + }, + "proc-log": { + "version": "2.0.1", + "dev": true + }, + "read-cmd-shim": { + "version": "3.0.1", + "dev": true + }, + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "ssri": { + "version": "9.0.1", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "treeverse": { + "version": "2.0.0", + "dev": true + }, + "unique-filename": { + "version": "2.0.1", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "which": { + "version": "2.0.2", + "dev": true, + "requires": { + "isexe": "^2.0.0" } }, - "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "write-file-atomic": { + "version": "4.0.2", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" } }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/changed": { - "version": "4.0.0", - "integrity": "sha512-cD+KuPRp6qiPOD+BO6S6SN5cARspIaWSOqGBpGnYzLb4uWT8Vk4JzKyYtc8ym1DIwyoFXHosXt8+GDAgR8QrgQ==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/collect-updates": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/listable": "4.0.0", - "@lerna/output": "4.0.0" + "@lerna/collect-updates": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/listable": "6.1.0", + "@lerna/output": "6.1.0" } }, "@lerna/check-working-tree": { - "version": "4.0.0", - "integrity": "sha512-/++bxM43jYJCshBiKP5cRlCTwSJdRSxVmcDAXM+1oUewlZJVSVlnks5eO0uLxokVFvLhHlC5kHMc7gbVFPHv6Q==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/collect-uncommitted": "4.0.0", - "@lerna/describe-ref": "4.0.0", - "@lerna/validation-error": "4.0.0" + "@lerna/collect-uncommitted": "6.1.0", + "@lerna/describe-ref": "6.1.0", + "@lerna/validation-error": "6.1.0" } }, "@lerna/child-process": { - "version": "4.0.0", - "integrity": "sha512-XtCnmCT9eyVsUUHx6y/CTBYdV9g2Cr/VxyseTWBgfIur92/YKClfEtJTbOh94jRT62hlKLqSvux/UhxXVh613Q==", + "version": "6.1.0", "dev": true, "requires": { "chalk": "^4.1.0", @@ -53404,7 +57377,6 @@ "dependencies": { "cross-spawn": { "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -53414,7 +57386,6 @@ }, "execa": { "version": "5.1.1", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -53430,22 +57401,18 @@ }, "get-stream": { "version": "6.0.1", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "human-signals": { "version": "2.1.0", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "is-stream": { "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "npm-run-path": { "version": "4.0.1", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" @@ -53453,12 +57420,10 @@ }, "path-key": { "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "shebang-command": { "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" @@ -53466,12 +57431,10 @@ }, "shebang-regex": { "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -53480,39 +57443,35 @@ } }, "@lerna/clean": { - "version": "4.0.0", - "integrity": "sha512-uugG2iN9k45ITx2jtd8nEOoAtca8hNlDCUM0N3lFgU/b1mEQYAPRkqr1qs4FLRl/Y50ZJ41wUz1eazS+d/0osA==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/prompt": "4.0.0", - "@lerna/pulse-till-done": "4.0.0", - "@lerna/rimraf-dir": "4.0.0", + "@lerna/command": "6.1.0", + "@lerna/filter-options": "6.1.0", + "@lerna/prompt": "6.1.0", + "@lerna/pulse-till-done": "6.1.0", + "@lerna/rimraf-dir": "6.1.0", "p-map": "^4.0.0", "p-map-series": "^2.1.0", "p-waterfall": "^2.1.1" } }, "@lerna/cli": { - "version": "4.0.0", - "integrity": "sha512-Neaw3GzFrwZiRZv2g7g6NwFjs3er1vhraIniEs0jjVLPMNC4eata0na3GfE5yibkM/9d3gZdmihhZdZ3EBdvYA==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/global-options": "4.0.0", + "@lerna/global-options": "6.1.0", "dedent": "^0.7.0", - "npmlog": "^4.1.2", + "npmlog": "^6.0.2", "yargs": "^16.2.0" }, "dependencies": { "ansi-regex": { "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "cliui": { "version": "7.0.4", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", @@ -53522,12 +57481,10 @@ }, "is-fullwidth-code-point": { "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -53537,7 +57494,6 @@ }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -53545,7 +57501,6 @@ }, "wrap-ansi": { "version": "7.0.0", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -53555,12 +57510,10 @@ }, "y18n": { "version": "5.0.8", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yargs": { "version": "16.2.0", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -53574,60 +57527,54 @@ }, "yargs-parser": { "version": "20.2.9", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true } } }, "@lerna/collect-uncommitted": { - "version": "4.0.0", - "integrity": "sha512-ufSTfHZzbx69YNj7KXQ3o66V4RC76ffOjwLX0q/ab//61bObJ41n03SiQEhSlmpP+gmFbTJ3/7pTe04AHX9m/g==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", + "@lerna/child-process": "6.1.0", "chalk": "^4.1.0", - "npmlog": "^4.1.2" + "npmlog": "^6.0.2" } }, "@lerna/collect-updates": { - "version": "4.0.0", - "integrity": "sha512-bnNGpaj4zuxsEkyaCZLka9s7nMs58uZoxrRIPJ+nrmrZYp1V5rrd+7/NYTuunOhY2ug1sTBvTAxj3NZQ+JKnOw==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", - "@lerna/describe-ref": "4.0.0", + "@lerna/child-process": "6.1.0", + "@lerna/describe-ref": "6.1.0", "minimatch": "^3.0.4", - "npmlog": "^4.1.2", + "npmlog": "^6.0.2", "slash": "^3.0.0" }, "dependencies": { "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true } } }, "@lerna/command": { - "version": "4.0.0", - "integrity": "sha512-LM9g3rt5FsPNFqIHUeRwWXLNHJ5NKzOwmVKZ8anSp4e1SPrv2HNc1V02/9QyDDZK/w+5POXH5lxZUI1CHaOK/A==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", - "@lerna/package-graph": "4.0.0", - "@lerna/project": "4.0.0", - "@lerna/validation-error": "4.0.0", - "@lerna/write-log-file": "4.0.0", + "@lerna/child-process": "6.1.0", + "@lerna/package-graph": "6.1.0", + "@lerna/project": "6.1.0", + "@lerna/validation-error": "6.1.0", + "@lerna/write-log-file": "6.1.0", "clone-deep": "^4.0.1", "dedent": "^0.7.0", "execa": "^5.0.0", "is-ci": "^2.0.0", - "npmlog": "^4.1.2" + "npmlog": "^6.0.2" }, "dependencies": { "cross-spawn": { "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -53637,7 +57584,6 @@ }, "execa": { "version": "5.1.1", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -53653,22 +57599,18 @@ }, "get-stream": { "version": "6.0.1", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "human-signals": { "version": "2.1.0", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "is-stream": { "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "npm-run-path": { "version": "4.0.1", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" @@ -53676,12 +57618,10 @@ }, "path-key": { "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "shebang-command": { "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" @@ -53689,12 +57629,10 @@ }, "shebang-regex": { "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -53703,26 +57641,23 @@ } }, "@lerna/conventional-commits": { - "version": "4.0.0", - "integrity": "sha512-CSUQRjJHFrH8eBn7+wegZLV3OrNc0Y1FehYfYGhjLE2SIfpCL4bmfu/ViYuHh9YjwHaA+4SX6d3hR+xkeseKmw==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/validation-error": "4.0.0", + "@lerna/validation-error": "6.1.0", "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-core": "^4.2.2", + "conventional-changelog-core": "^4.2.4", "conventional-recommended-bump": "^6.1.0", "fs-extra": "^9.1.0", "get-stream": "^6.0.0", - "lodash.template": "^4.5.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", + "npm-package-arg": "8.1.1", + "npmlog": "^6.0.2", "pify": "^5.0.0", "semver": "^7.3.4" }, "dependencies": { "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -53733,25 +57668,37 @@ }, "get-stream": { "version": "6.0.1", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, + "hosted-git-info": { + "version": "3.0.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, + "npm-package-arg": { + "version": "8.1.1", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, "pify": { "version": "5.0.0", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "dev": true }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -53759,80 +57706,134 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/create": { - "version": "4.0.0", - "integrity": "sha512-mVOB1niKByEUfxlbKTM1UNECWAjwUdiioIbRQZEeEabtjCL69r9rscIsjlGyhGWCfsdAG5wfq4t47nlDXdLLag==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/npm-conf": "4.0.0", - "@lerna/validation-error": "4.0.0", + "@lerna/child-process": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/npm-conf": "6.1.0", + "@lerna/validation-error": "6.1.0", "dedent": "^0.7.0", "fs-extra": "^9.1.0", - "globby": "^11.0.2", - "init-package-json": "^2.0.2", - "npm-package-arg": "^8.1.0", + "init-package-json": "^3.0.2", + "npm-package-arg": "8.1.1", "p-reduce": "^2.1.0", - "pacote": "^11.2.6", + "pacote": "^13.6.1", "pify": "^5.0.0", "semver": "^7.3.4", "slash": "^3.0.0", "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0", - "whatwg-url": "^8.4.0", + "validate-npm-package-name": "^4.0.0", "yargs-parser": "20.2.4" }, "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "3.0.2", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "7.14.1", + "dev": true + } + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/node-gyp": { + "version": "2.0.0", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "3.0.0", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, "@npmcli/run-script": { - "version": "1.8.6", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", + "version": "4.2.1", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + } + }, + "brace-expansion": { + "version": "2.0.1", "dev": true, "requires": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" + "balanced-match": "^1.0.0" } }, "cacache": { - "version": "15.3.0", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "version": "16.1.3", "dev": true, "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "7.14.1", + "dev": true + } } }, "chownr": { "version": "2.0.0", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -53841,70 +57842,210 @@ "universalify": "^2.0.0" } }, + "glob": { + "version": "8.0.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "hosted-git-info": { + "version": "3.0.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, + "minimatch": { + "version": "5.1.2", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, "mkdirp": { "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, - "node-gyp": { - "version": "7.1.2", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "npm-install-checks": { + "version": "5.0.0", "dev": true, "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.1", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "validate-npm-package-name": { + "version": "3.0.0", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + } + } + }, + "npm-pick-manifest": { + "version": "7.0.2", + "dev": true, + "requires": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + } + } + }, + "npm-registry-fetch": { + "version": "13.3.1", + "dev": true, + "requires": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + } } }, "pacote": { - "version": "11.3.5", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", + "version": "13.6.2", "dev": true, "requires": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + } } }, "pify": { "version": "5.0.0", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true + }, + "proc-log": { + "version": "2.0.1", "dev": true }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -53912,43 +58053,47 @@ }, "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "version": "9.0.1", "dev": true, "requires": { "minipass": "^3.1.1" } }, - "tr46": { - "version": "2.1.0", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "unique-filename": { + "version": "2.0.1", "dev": true, "requires": { - "punycode": "^2.1.1" + "unique-slug": "^3.0.0" } }, - "webidl-conversions": { - "version": "6.1.0", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true + "unique-slug": { + "version": "3.0.0", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } }, - "whatwg-url": { - "version": "8.7.0", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "validate-npm-package-name": { + "version": "4.0.0", "dev": true, "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "builtins": "^5.0.0" + }, + "dependencies": { + "builtins": { + "version": "5.0.1", + "dev": true, + "requires": { + "semver": "^7.0.0" + } + } } }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -53956,29 +58101,32 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs-parser": { "version": "20.2.4", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "dev": true } } }, "@lerna/create-symlink": { - "version": "4.0.0", - "integrity": "sha512-I0phtKJJdafUiDwm7BBlEUOtogmu8+taxq6PtIrxZbllV9hWg59qkpuIsiFp+no7nfRVuaasNYHwNUhDAVQBig==", + "version": "6.1.0", "dev": true, "requires": { - "cmd-shim": "^4.1.0", + "cmd-shim": "^5.0.0", "fs-extra": "^9.1.0", - "npmlog": "^4.1.2" + "npmlog": "^6.0.2" }, "dependencies": { + "cmd-shim": { + "version": "5.0.0", + "dev": true, + "requires": { + "mkdirp-infer-owner": "^2.0.0" + } + }, "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -53990,81 +58138,73 @@ } }, "@lerna/describe-ref": { - "version": "4.0.0", - "integrity": "sha512-eTU5+xC4C5Gcgz+Ey4Qiw9nV2B4JJbMulsYJMW8QjGcGh8zudib7Sduj6urgZXUYNyhYpRs+teci9M2J8u+UvQ==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", - "npmlog": "^4.1.2" + "@lerna/child-process": "6.1.0", + "npmlog": "^6.0.2" } }, "@lerna/diff": { - "version": "4.0.0", - "integrity": "sha512-jYPKprQVg41+MUMxx6cwtqsNm0Yxx9GDEwdiPLwcUTFx+/qKCEwifKNJ1oGIPBxyEHX2PFCOjkK39lHoj2qiag==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/validation-error": "4.0.0", - "npmlog": "^4.1.2" + "@lerna/child-process": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/validation-error": "6.1.0", + "npmlog": "^6.0.2" } }, "@lerna/exec": { - "version": "4.0.0", - "integrity": "sha512-VGXtL/b/JfY84NB98VWZpIExfhLOzy0ozm/0XaS4a2SmkAJc5CeUfrhvHxxkxiTBLkU+iVQUyYEoAT0ulQ8PCw==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/profiler": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/validation-error": "4.0.0", + "@lerna/child-process": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/filter-options": "6.1.0", + "@lerna/profiler": "6.1.0", + "@lerna/run-topologically": "6.1.0", + "@lerna/validation-error": "6.1.0", "p-map": "^4.0.0" } }, "@lerna/filter-options": { - "version": "4.0.0", - "integrity": "sha512-vV2ANOeZhOqM0rzXnYcFFCJ/kBWy/3OA58irXih9AMTAlQLymWAK0akWybl++sUJ4HB9Hx12TOqaXbYS2NM5uw==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/collect-updates": "4.0.0", - "@lerna/filter-packages": "4.0.0", + "@lerna/collect-updates": "6.1.0", + "@lerna/filter-packages": "6.1.0", "dedent": "^0.7.0", - "npmlog": "^4.1.2" + "npmlog": "^6.0.2" } }, "@lerna/filter-packages": { - "version": "4.0.0", - "integrity": "sha512-+4AJIkK7iIiOaqCiVTYJxh/I9qikk4XjNQLhE3kixaqgMuHl1NQ99qXRR0OZqAWB9mh8Z1HA9bM5K1HZLBTOqA==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/validation-error": "4.0.0", + "@lerna/validation-error": "6.1.0", "multimatch": "^5.0.0", - "npmlog": "^4.1.2" + "npmlog": "^6.0.2" } }, "@lerna/get-npm-exec-opts": { - "version": "4.0.0", - "integrity": "sha512-yvmkerU31CTWS2c7DvmAWmZVeclPBqI7gPVr5VATUKNWJ/zmVcU4PqbYoLu92I9Qc4gY1TuUplMNdNuZTSL7IQ==", + "version": "6.1.0", "dev": true, "requires": { - "npmlog": "^4.1.2" + "npmlog": "^6.0.2" } }, "@lerna/get-packed": { - "version": "4.0.0", - "integrity": "sha512-rfWONRsEIGyPJTxFzC8ECb3ZbsDXJbfqWYyeeQQDrJRPnEJErlltRLPLgC2QWbxFgFPsoDLeQmFHJnf0iDfd8w==", + "version": "6.1.0", "dev": true, "requires": { "fs-extra": "^9.1.0", - "ssri": "^8.0.1", + "ssri": "^9.0.1", "tar": "^6.1.0" }, "dependencies": { "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -54074,8 +58214,7 @@ } }, "ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "version": "9.0.1", "dev": true, "requires": { "minipass": "^3.1.1" @@ -54084,77 +58223,137 @@ } }, "@lerna/github-client": { - "version": "4.0.0", - "integrity": "sha512-2jhsldZtTKXYUBnOm23Lb0Fx8G4qfSXF9y7UpyUgWUj+YZYd+cFxSuorwQIgk5P4XXrtVhsUesIsli+BYSThiw==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", + "@lerna/child-process": "6.1.0", "@octokit/plugin-enterprise-rest": "^6.0.1", - "@octokit/rest": "^18.1.0", - "git-url-parse": "^11.4.4", - "npmlog": "^4.1.2" - } - }, - "@lerna/gitlab-client": { - "version": "4.0.0", - "integrity": "sha512-OMUpGSkeDWFf7BxGHlkbb35T7YHqVFCwBPSIR6wRsszY8PAzCYahtH3IaJzEJyUg6vmZsNl0FSr3pdA2skhxqA==", - "dev": true, - "requires": { - "node-fetch": "^2.6.1", - "npmlog": "^4.1.2", - "whatwg-url": "^8.4.0" + "@octokit/rest": "^19.0.3", + "git-url-parse": "^13.1.0", + "npmlog": "^6.0.2" }, "dependencies": { - "tr46": { - "version": "2.1.0", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "@octokit/auth-token": { + "version": "3.0.2", "dev": true, "requires": { - "punycode": "^2.1.1" + "@octokit/types": "^8.0.0" } }, - "webidl-conversions": { - "version": "6.1.0", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "@octokit/core": { + "version": "4.1.0", + "dev": true, + "requires": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^8.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "7.0.3", + "dev": true, + "requires": { + "@octokit/types": "^8.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "5.0.4", + "dev": true, + "requires": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^8.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "14.0.0", "dev": true }, - "whatwg-url": { - "version": "8.7.0", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "@octokit/plugin-paginate-rest": { + "version": "5.0.1", "dev": true, "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "@octokit/types": "^8.0.0" + } + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "6.7.0", + "dev": true, + "requires": { + "@octokit/types": "^8.0.0", + "deprecation": "^2.3.1" + } + }, + "@octokit/request": { + "version": "6.2.2", + "dev": true, + "requires": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^8.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/rest": { + "version": "19.0.5", + "dev": true, + "requires": { + "@octokit/core": "^4.1.0", + "@octokit/plugin-paginate-rest": "^5.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^6.7.0" + } + }, + "@octokit/types": { + "version": "8.0.0", + "dev": true, + "requires": { + "@octokit/openapi-types": "^14.0.0" } + }, + "is-plain-object": { + "version": "5.0.0", + "dev": true } } }, + "@lerna/gitlab-client": { + "version": "6.1.0", + "dev": true, + "requires": { + "node-fetch": "^2.6.1", + "npmlog": "^6.0.2" + } + }, "@lerna/global-options": { - "version": "4.0.0", - "integrity": "sha512-TRMR8afAHxuYBHK7F++Ogop2a82xQjoGna1dvPOY6ltj/pEx59pdgcJfYcynYqMkFIk8bhLJJN9/ndIfX29FTQ==", + "version": "6.1.0", "dev": true }, "@lerna/has-npm-version": { - "version": "4.0.0", - "integrity": "sha512-LQ3U6XFH8ZmLCsvsgq1zNDqka0Xzjq5ibVN+igAI5ccRWNaUsE/OcmsyMr50xAtNQMYMzmpw5GVLAivT2/YzCg==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", + "@lerna/child-process": "6.1.0", "semver": "^7.3.4" }, "dependencies": { "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -54162,21 +58361,19 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/import": { - "version": "4.0.0", - "integrity": "sha512-FaIhd+4aiBousKNqC7TX1Uhe97eNKf5/SC7c5WZANVWtC7aBWdmswwDt3usrzCNpj6/Wwr9EtEbYROzxKH8ffg==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/prompt": "4.0.0", - "@lerna/pulse-till-done": "4.0.0", - "@lerna/validation-error": "4.0.0", + "@lerna/child-process": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/prompt": "6.1.0", + "@lerna/pulse-till-done": "6.1.0", + "@lerna/validation-error": "6.1.0", "dedent": "^0.7.0", "fs-extra": "^9.1.0", "p-map-series": "^2.1.0" @@ -54184,7 +58381,6 @@ "dependencies": { "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -54196,22 +58392,21 @@ } }, "@lerna/info": { - "version": "4.0.0", - "integrity": "sha512-8Uboa12kaCSZEn4XRfPz5KU9XXoexSPS4oeYGj76s2UQb1O1GdnEyfjyNWoUl1KlJ2i/8nxUskpXIftoFYH0/Q==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/command": "4.0.0", - "@lerna/output": "4.0.0", + "@lerna/command": "6.1.0", + "@lerna/output": "6.1.0", "envinfo": "^7.7.4" } }, "@lerna/init": { - "version": "4.0.0", - "integrity": "sha512-wY6kygop0BCXupzWj5eLvTUqdR7vIAm0OgyV9WHpMYQGfs1V22jhztt8mtjCloD/O0nEe4tJhdG62XU5aYmPNQ==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", - "@lerna/command": "4.0.0", + "@lerna/child-process": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/project": "6.1.0", "fs-extra": "^9.1.0", "p-map": "^4.0.0", "write-json-file": "^4.3.0" @@ -54219,7 +58414,6 @@ "dependencies": { "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -54231,59 +58425,54 @@ } }, "@lerna/link": { - "version": "4.0.0", - "integrity": "sha512-KlvPi7XTAcVOByfaLlOeYOfkkDcd+bejpHMCd1KcArcFTwijOwXOVi24DYomIeHvy6HsX/IUquJ4PPUJIeB4+w==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/command": "4.0.0", - "@lerna/package-graph": "4.0.0", - "@lerna/symlink-dependencies": "4.0.0", + "@lerna/command": "6.1.0", + "@lerna/package-graph": "6.1.0", + "@lerna/symlink-dependencies": "6.1.0", + "@lerna/validation-error": "6.1.0", "p-map": "^4.0.0", "slash": "^3.0.0" }, "dependencies": { "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true } } }, "@lerna/list": { - "version": "4.0.0", - "integrity": "sha512-L2B5m3P+U4Bif5PultR4TI+KtW+SArwq1i75QZ78mRYxPc0U/piau1DbLOmwrdqr99wzM49t0Dlvl6twd7GHFg==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/listable": "4.0.0", - "@lerna/output": "4.0.0" + "@lerna/command": "6.1.0", + "@lerna/filter-options": "6.1.0", + "@lerna/listable": "6.1.0", + "@lerna/output": "6.1.0" } }, "@lerna/listable": { - "version": "4.0.0", - "integrity": "sha512-/rPOSDKsOHs5/PBLINZOkRIX1joOXUXEtyUs5DHLM8q6/RP668x/1lFhw6Dx7/U+L0+tbkpGtZ1Yt0LewCLgeQ==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/query-graph": "4.0.0", + "@lerna/query-graph": "6.1.0", "chalk": "^4.1.0", - "columnify": "^1.5.4" + "columnify": "^1.6.0" } }, "@lerna/log-packed": { - "version": "4.0.0", - "integrity": "sha512-+dpCiWbdzgMAtpajLToy9PO713IHoE6GV/aizXycAyA07QlqnkpaBNZ8DW84gHdM1j79TWockGJo9PybVhrrZQ==", + "version": "6.1.0", "dev": true, "requires": { "byte-size": "^7.0.0", - "columnify": "^1.5.4", + "columnify": "^1.6.0", "has-unicode": "^2.0.1", - "npmlog": "^4.1.2" + "npmlog": "^6.0.2" } }, "@lerna/npm-conf": { - "version": "4.0.0", - "integrity": "sha512-uS7H02yQNq3oejgjxAxqq/jhwGEE0W0ntr8vM3EfpCW1F/wZruwQw+7bleJQ9vUBjmdXST//tk8mXzr5+JXCfw==", + "version": "6.1.0", "dev": true, "requires": { "config-chain": "^1.1.12", @@ -54292,69 +58481,135 @@ "dependencies": { "pify": { "version": "5.0.0", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "dev": true } } }, "@lerna/npm-dist-tag": { - "version": "4.0.0", - "integrity": "sha512-F20sg28FMYTgXqEQihgoqSfwmq+Id3zT23CnOwD+XQMPSy9IzyLf1fFVH319vXIw6NF6Pgs4JZN2Qty6/CQXGw==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/otplease": "4.0.0", - "npm-package-arg": "^8.1.0", - "npm-registry-fetch": "^9.0.0", - "npmlog": "^4.1.2" + "@lerna/otplease": "6.1.0", + "npm-package-arg": "8.1.1", + "npm-registry-fetch": "^13.3.0", + "npmlog": "^6.0.2" }, "dependencies": { + "builtins": { + "version": "5.0.1", + "dev": true, + "requires": { + "semver": "^7.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, + "minipass-fetch": { + "version": "2.1.2", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "npm-package-arg": { + "version": "8.1.1", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, "npm-registry-fetch": { - "version": "9.0.0", - "integrity": "sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA==", + "version": "13.3.1", "dev": true, "requires": { - "@npmcli/ci-detect": "^1.0.0", - "lru-cache": "^6.0.0", - "make-fetch-happen": "^8.0.9", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } + } + }, + "proc-log": { + "version": "2.0.1", + "dev": true + }, + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/npm-install": { - "version": "4.0.0", - "integrity": "sha512-aKNxq2j3bCH3eXl3Fmu4D54s/YLL9WSwV8W7X2O25r98wzrO38AUN6AB9EtmAx+LV/SP15et7Yueg9vSaanRWg==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", - "@lerna/get-npm-exec-opts": "4.0.0", + "@lerna/child-process": "6.1.0", + "@lerna/get-npm-exec-opts": "6.1.0", "fs-extra": "^9.1.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", + "npm-package-arg": "8.1.1", + "npmlog": "^6.0.2", "signal-exit": "^3.0.3", "write-pkg": "^4.0.0" }, "dependencies": { "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -54362,27 +58617,59 @@ "jsonfile": "^6.0.1", "universalify": "^2.0.0" } + }, + "hosted-git-info": { + "version": "3.0.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "npm-package-arg": { + "version": "8.1.1", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "dev": true } } }, "@lerna/npm-publish": { - "version": "4.0.0", - "integrity": "sha512-vQb7yAPRo5G5r77DRjHITc9piR9gvEKWrmfCH7wkfBnGWEqu7n8/4bFQ7lhnkujvc8RXOsYpvbMQkNfkYibD/w==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/otplease": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", + "@lerna/otplease": "6.1.0", + "@lerna/run-lifecycle": "6.1.0", "fs-extra": "^9.1.0", - "libnpmpublish": "^4.0.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", + "libnpmpublish": "^6.0.4", + "npm-package-arg": "8.1.1", + "npmlog": "^6.0.2", "pify": "^5.0.0", - "read-package-json": "^3.0.0" + "read-package-json": "^5.0.1" }, "dependencies": { "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -54391,66 +58678,100 @@ "universalify": "^2.0.0" } }, + "hosted-git-info": { + "version": "3.0.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "npm-package-arg": { + "version": "8.1.1", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, "pify": { "version": "5.0.0", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true + }, + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", "dev": true } } }, "@lerna/npm-run-script": { - "version": "4.0.0", - "integrity": "sha512-Jmyh9/IwXJjOXqKfIgtxi0bxi1pUeKe5bD3S81tkcy+kyng/GNj9WSqD5ZggoNP2NP//s4CLDAtUYLdP7CU9rA==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", - "@lerna/get-npm-exec-opts": "4.0.0", - "npmlog": "^4.1.2" + "@lerna/child-process": "6.1.0", + "@lerna/get-npm-exec-opts": "6.1.0", + "npmlog": "^6.0.2" } }, "@lerna/otplease": { - "version": "4.0.0", - "integrity": "sha512-Sgzbqdk1GH4psNiT6hk+BhjOfIr/5KhGBk86CEfHNJTk9BK4aZYyJD4lpDbDdMjIV4g03G7pYoqHzH765T4fxw==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/prompt": "4.0.0" + "@lerna/prompt": "6.1.0" } }, "@lerna/output": { - "version": "4.0.0", - "integrity": "sha512-Un1sHtO1AD7buDQrpnaYTi2EG6sLF+KOPEAMxeUYG5qG3khTs2Zgzq5WE3dt2N/bKh7naESt20JjIW6tBELP0w==", + "version": "6.1.0", "dev": true, "requires": { - "npmlog": "^4.1.2" + "npmlog": "^6.0.2" } }, "@lerna/pack-directory": { - "version": "4.0.0", - "integrity": "sha512-NJrmZNmBHS+5aM+T8N6FVbaKFScVqKlQFJNY2k7nsJ/uklNKsLLl6VhTQBPwMTbf6Tf7l6bcKzpy7aePuq9UiQ==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/get-packed": "4.0.0", - "@lerna/package": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "npm-packlist": "^2.1.4", - "npmlog": "^4.1.2", - "tar": "^6.1.0", - "temp-write": "^4.0.0" + "@lerna/get-packed": "6.1.0", + "@lerna/package": "6.1.0", + "@lerna/run-lifecycle": "6.1.0", + "@lerna/temp-write": "6.1.0", + "npm-packlist": "^5.1.1", + "npmlog": "^6.0.2", + "tar": "^6.1.0" } }, "@lerna/package": { - "version": "4.0.0", - "integrity": "sha512-l0M/izok6FlyyitxiQKr+gZLVFnvxRQdNhzmQ6nRnN9dvBJWn+IxxpM+cLqGACatTnyo9LDzNTOj2Db3+s0s8Q==", + "version": "6.1.0", "dev": true, "requires": { "load-json-file": "^6.2.0", - "npm-package-arg": "^8.1.0", + "npm-package-arg": "8.1.1", "write-pkg": "^4.0.0" }, "dependencies": { + "hosted-git-info": { + "version": "3.0.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "load-json-file": { "version": "6.2.0", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", "dev": true, "requires": { "graceful-fs": "^4.1.15", @@ -54459,9 +58780,24 @@ "type-fest": "^0.6.0" } }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "npm-package-arg": { + "version": "8.1.1", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, "parse-json": { "version": "5.2.0", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -54470,41 +58806,63 @@ "lines-and-columns": "^1.1.6" } }, + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "strip-bom": { "version": "4.0.0", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "type-fest": { "version": "0.6.0", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + }, + "yallist": { + "version": "4.0.0", "dev": true } } }, "@lerna/package-graph": { - "version": "4.0.0", - "integrity": "sha512-QED2ZCTkfXMKFoTGoccwUzjHtZMSf3UKX14A4/kYyBms9xfFsesCZ6SLI5YeySEgcul8iuIWfQFZqRw+Qrjraw==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/prerelease-id-from-version": "4.0.0", - "@lerna/validation-error": "4.0.0", - "npm-package-arg": "^8.1.0", - "npmlog": "^4.1.2", + "@lerna/prerelease-id-from-version": "6.1.0", + "@lerna/validation-error": "6.1.0", + "npm-package-arg": "8.1.1", + "npmlog": "^6.0.2", "semver": "^7.3.4" }, "dependencies": { + "hosted-git-info": { + "version": "3.0.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, + "npm-package-arg": { + "version": "8.1.1", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -54512,14 +58870,12 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/prerelease-id-from-version": { - "version": "4.0.0", - "integrity": "sha512-GQqguzETdsYRxOSmdFZ6zDBXDErIETWOqomLERRY54f4p+tk4aJjoVdd9xKwehC9TBfIFvlRbL1V9uQGHh1opg==", + "version": "6.1.0", "dev": true, "requires": { "semver": "^7.3.4" @@ -54527,15 +58883,13 @@ "dependencies": { "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -54543,24 +58897,21 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/profiler": { - "version": "4.0.0", - "integrity": "sha512-/BaEbqnVh1LgW/+qz8wCuI+obzi5/vRE8nlhjPzdEzdmWmZXuCKyWSEzAyHOJWw1ntwMiww5dZHhFQABuoFz9Q==", + "version": "6.1.0", "dev": true, "requires": { "fs-extra": "^9.1.0", - "npmlog": "^4.1.2", + "npmlog": "^6.0.2", "upath": "^2.0.1" }, "dependencies": { "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -54571,33 +58922,42 @@ }, "upath": { "version": "2.0.1", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", "dev": true } } }, "@lerna/project": { - "version": "4.0.0", - "integrity": "sha512-o0MlVbDkD5qRPkFKlBZsXZjoNTWPyuL58564nSfZJ6JYNmgAptnWPB2dQlAc7HWRZkmnC2fCkEdoU+jioPavbg==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/package": "4.0.0", - "@lerna/validation-error": "4.0.0", + "@lerna/package": "6.1.0", + "@lerna/validation-error": "6.1.0", "cosmiconfig": "^7.0.0", "dedent": "^0.7.0", "dot-prop": "^6.0.1", "glob-parent": "^5.1.1", "globby": "^11.0.2", + "js-yaml": "^4.1.0", "load-json-file": "^6.2.0", - "npmlog": "^4.1.2", + "npmlog": "^6.0.2", "p-map": "^4.0.0", "resolve-from": "^5.0.0", "write-json-file": "^4.3.0" }, "dependencies": { + "argparse": { + "version": "2.0.1", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "load-json-file": { "version": "6.2.0", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", "dev": true, "requires": { "graceful-fs": "^4.1.15", @@ -54608,7 +58968,6 @@ }, "parse-json": { "version": "5.2.0", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -54619,117 +58978,169 @@ }, "resolve-from": { "version": "5.0.0", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "strip-bom": { "version": "4.0.0", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "type-fest": { "version": "0.6.0", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true } } }, "@lerna/prompt": { - "version": "4.0.0", - "integrity": "sha512-4Ig46oCH1TH5M7YyTt53fT6TuaKMgqUUaqdgxvp6HP6jtdak6+amcsqB8YGz2eQnw/sdxunx84DfI9XpoLj4bQ==", + "version": "6.1.0", "dev": true, "requires": { - "inquirer": "^7.3.3", - "npmlog": "^4.1.2" + "inquirer": "^8.2.4", + "npmlog": "^6.0.2" } }, "@lerna/publish": { - "version": "4.0.0", - "integrity": "sha512-K8jpqjHrChH22qtkytA5GRKIVFEtqBF6JWj1I8dWZtHs4Jywn8yB1jQ3BAMLhqmDJjWJtRck0KXhQQKzDK2UPg==", - "dev": true, - "requires": { - "@lerna/check-working-tree": "4.0.0", - "@lerna/child-process": "4.0.0", - "@lerna/collect-updates": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/describe-ref": "4.0.0", - "@lerna/log-packed": "4.0.0", - "@lerna/npm-conf": "4.0.0", - "@lerna/npm-dist-tag": "4.0.0", - "@lerna/npm-publish": "4.0.0", - "@lerna/otplease": "4.0.0", - "@lerna/output": "4.0.0", - "@lerna/pack-directory": "4.0.0", - "@lerna/prerelease-id-from-version": "4.0.0", - "@lerna/prompt": "4.0.0", - "@lerna/pulse-till-done": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/validation-error": "4.0.0", - "@lerna/version": "4.0.0", + "version": "6.1.0", + "dev": true, + "requires": { + "@lerna/check-working-tree": "6.1.0", + "@lerna/child-process": "6.1.0", + "@lerna/collect-updates": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/describe-ref": "6.1.0", + "@lerna/log-packed": "6.1.0", + "@lerna/npm-conf": "6.1.0", + "@lerna/npm-dist-tag": "6.1.0", + "@lerna/npm-publish": "6.1.0", + "@lerna/otplease": "6.1.0", + "@lerna/output": "6.1.0", + "@lerna/pack-directory": "6.1.0", + "@lerna/prerelease-id-from-version": "6.1.0", + "@lerna/prompt": "6.1.0", + "@lerna/pulse-till-done": "6.1.0", + "@lerna/run-lifecycle": "6.1.0", + "@lerna/run-topologically": "6.1.0", + "@lerna/validation-error": "6.1.0", + "@lerna/version": "6.1.0", "fs-extra": "^9.1.0", - "libnpmaccess": "^4.0.1", - "npm-package-arg": "^8.1.0", - "npm-registry-fetch": "^9.0.0", - "npmlog": "^4.1.2", + "libnpmaccess": "^6.0.3", + "npm-package-arg": "8.1.1", + "npm-registry-fetch": "^13.3.0", + "npmlog": "^6.0.2", "p-map": "^4.0.0", "p-pipe": "^3.1.0", - "pacote": "^11.2.6", + "pacote": "^13.6.1", "semver": "^7.3.4" }, "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "3.0.2", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "7.14.1", + "dev": true + } + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/node-gyp": { + "version": "2.0.0", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "3.0.0", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, "@npmcli/run-script": { - "version": "1.8.6", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", + "version": "4.2.1", "dev": true, "requires": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + } + }, + "brace-expansion": { + "version": "2.0.1", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "builtins": { + "version": "5.0.1", + "dev": true, + "requires": { + "semver": "^7.0.0" } }, "cacache": { - "version": "15.3.0", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "version": "16.1.3", "dev": true, "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "7.14.1", + "dev": true + } } }, "chownr": { "version": "2.0.0", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, - "debug": { - "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -54738,154 +59149,246 @@ "universalify": "^2.0.0" } }, + "glob": { + "version": "8.0.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "hosted-git-info": { + "version": "3.0.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, + "minimatch": { + "version": "5.1.2", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, "mkdirp": { "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, - "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "npm-install-checks": { + "version": "5.0.0", + "dev": true, + "requires": { + "semver": "^7.1.1" + } }, - "negotiator": { - "version": "0.6.2", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "npm-normalize-package-bin": { + "version": "2.0.0", "dev": true }, - "node-gyp": { - "version": "7.1.2", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "npm-package-arg": { + "version": "8.1.1", "dev": true, "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "7.0.2", + "dev": true, + "requires": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } } }, "npm-registry-fetch": { - "version": "9.0.0", - "integrity": "sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA==", + "version": "13.3.1", "dev": true, "requires": { - "@npmcli/ci-detect": "^1.0.0", - "lru-cache": "^6.0.0", - "make-fetch-happen": "^8.0.9", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } } }, "pacote": { - "version": "11.3.5", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", + "version": "13.6.2", "dev": true, "requires": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" + "ssri": "^9.0.0", + "tar": "^6.1.11" }, "dependencies": { - "make-fetch-happen": { - "version": "9.1.0", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", "dev": true, "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" } }, - "npm-registry-fetch": { - "version": "11.0.0", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "validate-npm-package-name": { + "version": "4.0.0", "dev": true, "requires": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "builtins": "^5.0.0" } } } }, + "proc-log": { + "version": "2.0.1", + "dev": true + }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, - "socks-proxy-agent": { - "version": "6.1.1", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "ssri": { + "version": "9.0.1", "dev": true, "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "minipass": "^3.1.1" } }, - "ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "unique-filename": { + "version": "2.0.1", "dev": true, "requires": { - "minipass": "^3.1.1" + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" } }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -54893,40 +59396,35 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/pulse-till-done": { - "version": "4.0.0", - "integrity": "sha512-Frb4F7QGckaybRhbF7aosLsJ5e9WuH7h0KUkjlzSByVycxY91UZgaEIVjS2oN9wQLrheLMHl6SiFY0/Pvo0Cxg==", + "version": "6.1.0", "dev": true, "requires": { - "npmlog": "^4.1.2" + "npmlog": "^6.0.2" } }, "@lerna/query-graph": { - "version": "4.0.0", - "integrity": "sha512-YlP6yI3tM4WbBmL9GCmNDoeQyzcyg1e4W96y/PKMZa5GbyUvkS2+Jc2kwPD+5KcXou3wQZxSPzR3Te5OenaDdg==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/package-graph": "4.0.0" + "@lerna/package-graph": "6.1.0" } }, "@lerna/resolve-symlink": { - "version": "4.0.0", - "integrity": "sha512-RtX8VEUzqT+uLSCohx8zgmjc6zjyRlh6i/helxtZTMmc4+6O4FS9q5LJas2uGO2wKvBlhcD6siibGt7dIC3xZA==", + "version": "6.1.0", "dev": true, "requires": { "fs-extra": "^9.1.0", - "npmlog": "^4.1.2", - "read-cmd-shim": "^2.0.0" + "npmlog": "^6.0.2", + "read-cmd-shim": "^3.0.0" }, "dependencies": { "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -54934,76 +59432,118 @@ "jsonfile": "^6.0.1", "universalify": "^2.0.0" } + }, + "read-cmd-shim": { + "version": "3.0.1", + "dev": true } } }, "@lerna/rimraf-dir": { - "version": "4.0.0", - "integrity": "sha512-QNH9ABWk9mcMJh2/muD9iYWBk1oQd40y6oH+f3wwmVGKYU5YJD//+zMiBI13jxZRtwBx0vmBZzkBkK1dR11cBg==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/child-process": "4.0.0", - "npmlog": "^4.1.2", + "@lerna/child-process": "6.1.0", + "npmlog": "^6.0.2", "path-exists": "^4.0.0", "rimraf": "^3.0.2" }, "dependencies": { "path-exists": { "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true } } }, "@lerna/run": { - "version": "4.0.0", - "integrity": "sha512-9giulCOzlMPzcZS/6Eov6pxE9gNTyaXk0Man+iCIdGJNMrCnW7Dme0Z229WWP/UoxDKg71F2tMsVVGDiRd8fFQ==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/command": "4.0.0", - "@lerna/filter-options": "4.0.0", - "@lerna/npm-run-script": "4.0.0", - "@lerna/output": "4.0.0", - "@lerna/profiler": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/timer": "4.0.0", - "@lerna/validation-error": "4.0.0", + "@lerna/command": "6.1.0", + "@lerna/filter-options": "6.1.0", + "@lerna/npm-run-script": "6.1.0", + "@lerna/output": "6.1.0", + "@lerna/profiler": "6.1.0", + "@lerna/run-topologically": "6.1.0", + "@lerna/timer": "6.1.0", + "@lerna/validation-error": "6.1.0", + "fs-extra": "^9.1.0", "p-map": "^4.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } } }, "@lerna/run-lifecycle": { - "version": "4.0.0", - "integrity": "sha512-IwxxsajjCQQEJAeAaxF8QdEixfI7eLKNm4GHhXHrgBu185JcwScFZrj9Bs+PFKxwb+gNLR4iI5rpUdY8Y0UdGQ==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/npm-conf": "4.0.0", - "npm-lifecycle": "^3.1.5", - "npmlog": "^4.1.2" + "@lerna/npm-conf": "6.1.0", + "@npmcli/run-script": "^4.1.7", + "npmlog": "^6.0.2", + "p-queue": "^6.6.2" + }, + "dependencies": { + "@npmcli/node-gyp": { + "version": "2.0.0", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "3.0.0", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "4.2.1", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + } + }, + "which": { + "version": "2.0.2", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "@lerna/run-topologically": { - "version": "4.0.0", - "integrity": "sha512-EVZw9hGwo+5yp+VL94+NXRYisqgAlj0jWKWtAIynDCpghRxCE5GMO3xrQLmQgqkpUl9ZxQFpICgYv5DW4DksQA==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/query-graph": "4.0.0", + "@lerna/query-graph": "6.1.0", "p-queue": "^6.6.2" } }, "@lerna/symlink-binary": { - "version": "4.0.0", - "integrity": "sha512-zualodWC4q1QQc1pkz969hcFeWXOsVYZC5AWVtAPTDfLl+TwM7eG/O6oP+Rr3fFowspxo6b1TQ6sYfDV6HXNWA==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/create-symlink": "4.0.0", - "@lerna/package": "4.0.0", + "@lerna/create-symlink": "6.1.0", + "@lerna/package": "6.1.0", "fs-extra": "^9.1.0", "p-map": "^4.0.0" }, "dependencies": { "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -55015,13 +59555,12 @@ } }, "@lerna/symlink-dependencies": { - "version": "4.0.0", - "integrity": "sha512-BABo0MjeUHNAe2FNGty1eantWp8u83BHSeIMPDxNq0MuW2K3CiQRaeWT3EGPAzXpGt0+hVzBrA6+OT0GPn7Yuw==", + "version": "6.1.0", "dev": true, "requires": { - "@lerna/create-symlink": "4.0.0", - "@lerna/resolve-symlink": "4.0.0", - "@lerna/symlink-binary": "4.0.0", + "@lerna/create-symlink": "6.1.0", + "@lerna/resolve-symlink": "6.1.0", + "@lerna/symlink-binary": "6.1.0", "fs-extra": "^9.1.0", "p-map": "^4.0.0", "p-map-series": "^2.1.0" @@ -55029,7 +59568,6 @@ "dependencies": { "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -55040,55 +59578,84 @@ } } }, + "@lerna/temp-write": { + "version": "6.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "is-stream": "^2.0.0", + "make-dir": "^3.0.0", + "temp-dir": "^1.0.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "is-stream": { + "version": "2.0.1", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "dev": true + } + } + }, "@lerna/timer": { - "version": "4.0.0", - "integrity": "sha512-WFsnlaE7SdOvjuyd05oKt8Leg3ENHICnvX3uYKKdByA+S3g+TCz38JsNs7OUZVt+ba63nC2nbXDlUnuT2Xbsfg==", + "version": "6.1.0", "dev": true }, "@lerna/validation-error": { - "version": "4.0.0", - "integrity": "sha512-1rBOM5/koiVWlRi3V6dB863E1YzJS8v41UtsHgMr6gB2ncJ2LsQtMKlJpi3voqcgh41H8UsPXR58RrrpPpufyw==", + "version": "6.1.0", "dev": true, "requires": { - "npmlog": "^4.1.2" + "npmlog": "^6.0.2" } }, "@lerna/version": { - "version": "4.0.0", - "integrity": "sha512-otUgiqs5W9zGWJZSCCMRV/2Zm2A9q9JwSDS7s/tlKq4mWCYriWo7+wsHEA/nPTMDyYyBO5oyZDj+3X50KDUzeA==", - "dev": true, - "requires": { - "@lerna/check-working-tree": "4.0.0", - "@lerna/child-process": "4.0.0", - "@lerna/collect-updates": "4.0.0", - "@lerna/command": "4.0.0", - "@lerna/conventional-commits": "4.0.0", - "@lerna/github-client": "4.0.0", - "@lerna/gitlab-client": "4.0.0", - "@lerna/output": "4.0.0", - "@lerna/prerelease-id-from-version": "4.0.0", - "@lerna/prompt": "4.0.0", - "@lerna/run-lifecycle": "4.0.0", - "@lerna/run-topologically": "4.0.0", - "@lerna/validation-error": "4.0.0", + "version": "6.1.0", + "dev": true, + "requires": { + "@lerna/check-working-tree": "6.1.0", + "@lerna/child-process": "6.1.0", + "@lerna/collect-updates": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/conventional-commits": "6.1.0", + "@lerna/github-client": "6.1.0", + "@lerna/gitlab-client": "6.1.0", + "@lerna/output": "6.1.0", + "@lerna/prerelease-id-from-version": "6.1.0", + "@lerna/prompt": "6.1.0", + "@lerna/run-lifecycle": "6.1.0", + "@lerna/run-topologically": "6.1.0", + "@lerna/temp-write": "6.1.0", + "@lerna/validation-error": "6.1.0", + "@nrwl/devkit": ">=14.8.6 < 16", "chalk": "^4.1.0", "dedent": "^0.7.0", "load-json-file": "^6.2.0", "minimatch": "^3.0.4", - "npmlog": "^4.1.2", + "npmlog": "^6.0.2", "p-map": "^4.0.0", "p-pipe": "^3.1.0", "p-reduce": "^2.1.0", "p-waterfall": "^2.1.1", "semver": "^7.3.4", "slash": "^3.0.0", - "temp-write": "^4.0.0", "write-json-file": "^4.3.0" }, "dependencies": { "load-json-file": { "version": "6.2.0", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", "dev": true, "requires": { "graceful-fs": "^4.1.15", @@ -55099,7 +59666,6 @@ }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -55107,7 +59673,6 @@ }, "parse-json": { "version": "5.2.0", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -55117,8 +59682,7 @@ } }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -55126,38 +59690,42 @@ }, "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "strip-bom": { "version": "4.0.0", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "type-fest": { "version": "0.6.0", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/write-log-file": { - "version": "4.0.0", - "integrity": "sha512-XRG5BloiArpXRakcnPHmEHJp+4AtnhRtpDIHSghmXD5EichI1uD73J7FgPp30mm2pDRq3FdqB0NbwSEsJ9xFQg==", + "version": "6.1.0", "dev": true, "requires": { - "npmlog": "^4.1.2", - "write-file-atomic": "^3.0.3" + "npmlog": "^6.0.2", + "write-file-atomic": "^4.0.1" + }, + "dependencies": { + "write-file-atomic": { + "version": "4.0.2", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + } } }, "@loaders.gl/3d-tiles": { "version": "3.0.8", - "integrity": "sha512-jZeOyDPGD2wEkTLW4Do9A4UUQ+OGjhhNXztB0AsttZ69OpkmsxJXb76xxwevf+eThrsTgSTjZ06eC5DHX0kyXA==", "requires": { "@loaders.gl/core": "3.0.8", "@loaders.gl/draco": "3.0.8", @@ -55171,7 +59739,6 @@ }, "@loaders.gl/core": { "version": "3.0.8", - "integrity": "sha512-FIfbhMkoRX2JonEHXHgClC7jwOSsEwvvmjlaTMRAY+gFKvJPGmegkp4VgUZquLFf6GedJt/1TuMMvAX6gdq1pg==", "requires": { "@babel/runtime": "^7.3.1", "@loaders.gl/loader-utils": "3.0.8", @@ -55181,7 +59748,6 @@ }, "@loaders.gl/draco": { "version": "3.0.8", - "integrity": "sha512-ZCXzXNHWQ7H0qk/kC+rWzjMWjLzZGzQcDbdpIuy8xJdp4rTpmMkLUseFPby8vhkmIaqxWPwPB6mx/vM7L6JENg==", "requires": { "@babel/runtime": "^7.3.1", "@loaders.gl/loader-utils": "3.0.8", @@ -55192,7 +59758,6 @@ }, "@loaders.gl/gis": { "version": "3.0.8", - "integrity": "sha512-7NL+lIb7NezlMupYskVil6M3RZunXJl+TyaVAW82GLbzPSOq+m/G7h3+z0GBa8iv/U/I+cB5BhSN+GZmvFwqEA==", "requires": { "@loaders.gl/loader-utils": "3.0.8", "@loaders.gl/schema": "3.0.8", @@ -55202,7 +59767,6 @@ }, "@loaders.gl/gltf": { "version": "3.0.8", - "integrity": "sha512-4PXWTlqyvlbZE2Vp4iQ+Y87ZO1WuRvSlbImDhygd0hoINfmJ9ObxrFS3yJcpJTu007nWxXorNVEOKyuoo+4Iyw==", "requires": { "@loaders.gl/core": "3.0.8", "@loaders.gl/draco": "3.0.8", @@ -55212,14 +59776,12 @@ }, "@loaders.gl/images": { "version": "3.0.8", - "integrity": "sha512-rO2cIYJYlMs/uO9YSoF4/BEA4p/9xQ3gHZ1sIJkPYVnDqzpbu8nvUjWTQqIdL/MkQBTW8tz3twCdM+B6G9Fa2w==", "requires": { "@loaders.gl/loader-utils": "3.0.8" } }, "@loaders.gl/loader-utils": { "version": "3.0.8", - "integrity": "sha512-PW1WyyQ+LXkqoGHBZHsmfNQkKiLAYf1gok+kHnHvY9fCzhJeA1iTNEUKPXGXKgS00m/k5cBTkOWAaOG9KRvBCQ==", "requires": { "@babel/runtime": "^7.3.1", "@loaders.gl/worker-utils": "3.0.8", @@ -55228,7 +59790,6 @@ }, "@loaders.gl/math": { "version": "3.0.8", - "integrity": "sha512-jfFpxxr4Bq5JfOPqLVJc4JJGoGGvVTOCWiJhnTtSAKhaNSwldmNWaZ0w8E2nlgPKPMAHiTRKOQnd9sSY5m66Cw==", "requires": { "@loaders.gl/images": "3.0.8", "@loaders.gl/loader-utils": "3.0.8", @@ -55237,7 +59798,6 @@ }, "@loaders.gl/mvt": { "version": "3.0.8", - "integrity": "sha512-Jk1QTHgpxMsUT01w5IJJ2en9qq0yOZcL2wGXVc7CFp2h6inB22rC3drUwq1mUNGe6iy3EWIo7EeJVd9B+5JyTQ==", "requires": { "@loaders.gl/gis": "3.0.8", "@loaders.gl/loader-utils": "3.0.8", @@ -55247,7 +59807,6 @@ }, "@loaders.gl/schema": { "version": "3.0.8", - "integrity": "sha512-yne5WE7fZZWFl2zF8fzDlYhPVJua6h6mTCSmlQ5pryaMXTZS9mfzXXIFWRL3kswqnQTu/QNFdyFj1mP0haF24w==", "requires": { "@types/geojson": "^7946.0.7", "apache-arrow": "^4.0.0", @@ -55256,7 +59815,6 @@ }, "@loaders.gl/terrain": { "version": "3.0.8", - "integrity": "sha512-MtOAYEB/xJB4CN4B0YNPkO4v1ZY332joxiOHQI1x37x4sWVAqOrKLr9jB42sZCB8aINi2WMWGiErtf9wh9L5Pg==", "requires": { "@babel/runtime": "^7.3.1", "@loaders.gl/loader-utils": "3.0.8", @@ -55266,7 +59824,6 @@ }, "@loaders.gl/tiles": { "version": "3.0.8", - "integrity": "sha512-Rc+yHFdQg2sYmcYkwvszukFWdm9EW354F9HUR7y/oauos6tsdo4YTj31zgytaYR63/EqWQ7kwI29/eePEcutzg==", "requires": { "@loaders.gl/core": "3.0.8", "@loaders.gl/loader-utils": "3.0.8", @@ -55280,18 +59837,15 @@ }, "@loaders.gl/worker-utils": { "version": "3.0.8", - "integrity": "sha512-Pg72HuXPcL725TrOlOr83xloVUHj6OMWmno1dI8ccuqfOBsgoRjxNZrcSvwBzfK8tFCzuN2X30I+mHl3BkuYLw==", "requires": { "@babel/runtime": "^7.3.1" } }, "@luma.gl/constants": { - "version": "8.5.4", - "integrity": "sha512-lrA4ja92om/gDHYOvM9itL5S7FVzjKulyknDz6S+Y7gmgHgXk2ln1Xar5zUCsLnhAYx4glHITXGH5Y5rdWgT1Q==" + "version": "8.5.4" }, "@luma.gl/core": { "version": "8.5.4", - "integrity": "sha512-+saDz1D3mcPd53vgbG60ryg1w5CF9Z2wdakKHzR810VoJLw97t4aNdg/eNgyWOvbOHxaKJBPm8K0sGjej67+jw==", "requires": { "@babel/runtime": "^7.0.0", "@luma.gl/constants": "8.5.4", @@ -55303,7 +59857,6 @@ }, "@luma.gl/engine": { "version": "8.5.4", - "integrity": "sha512-Sfv972IzvR9s9kKWugs67XQUh9jC0e/PpBrzvyGVnPU4XvFq42RZVF73pzEklVU6AlpR8Zg5CPtxGdhyOHtT7w==", "requires": { "@babel/runtime": "^7.0.0", "@luma.gl/constants": "8.5.4", @@ -55316,7 +59869,6 @@ }, "@luma.gl/experimental": { "version": "8.5.4", - "integrity": "sha512-09waqRhgIrw+Sq0/in4tw4jPag5YsFfV1nEHJaLAg5RFv92S53IEubSJgkuG02HoOBkPxQ7KYvs9VNmriisnYg==", "requires": { "@luma.gl/constants": "8.5.4", "@math.gl/core": "^3.5.0", @@ -55325,7 +59877,6 @@ }, "@luma.gl/gltools": { "version": "8.5.4", - "integrity": "sha512-JotiPuymQz2Xc41AYlS2moJC/EHxU+OX/OMKi0+/MeOlEFLsdochgTA0I64j8yofLTXdeiGCneGtD1Ao8fk+bw==", "requires": { "@babel/runtime": "^7.0.0", "@luma.gl/constants": "8.5.4", @@ -55334,7 +59885,6 @@ }, "@luma.gl/shadertools": { "version": "8.5.4", - "integrity": "sha512-rwLBLrACi75aWnuJm8rVKCQnJR2sMTCxHuexfjHJ7Uecl0vVcVJZT7c9EnCFaz5LUTNbdupvuhq0SKNckKiKmw==", "requires": { "@babel/runtime": "^7.0.0", "@math.gl/core": "^3.5.0" @@ -55342,7 +59892,6 @@ }, "@luma.gl/webgl": { "version": "8.5.4", - "integrity": "sha512-dWy4dhTbtvDO9zQBdx1Yb+DxNx/1JWV9rhhJxJUtTKbGZSX0RjkASTT6GBWMl5jrH1JYJefS1wswHmmPVXjK0Q==", "requires": { "@babel/runtime": "^7.0.0", "@luma.gl/constants": "8.5.4", @@ -55351,19 +59900,10 @@ } }, "@mapbox/extent": { - "version": "0.4.0", - "integrity": "sha512-MSoKw3qPceGuupn04sdaJrFeLKvcSETVLZCGS8JA9x6zXQL3FWiKaIXYIZEDXd5jpXpWlRxinCZIN49yRy0C9A==" - }, - "@mapbox/geojson-area": { - "version": "0.2.2", - "integrity": "sha512-bBqqFn1kIbLBfn7Yq1PzzwVkPYQr9lVUeT8Dhd0NL5n76PBuXzOcuLV7GOSbEB1ia8qWxH4COCvFpziEu/yReA==", - "requires": { - "wgs84": "0.0.0" - } + "version": "0.4.0" }, "@mapbox/geojson-coords": { "version": "0.0.2", - "integrity": "sha512-YuVzpseee/P1T5BWyeVVPppyfmuXYHFwZHmybkqaMfu4BWlOf2cmMGKj2Rr92MwfSTOCSUA0PAsVGRG8akY0rg==", "requires": { "@mapbox/geojson-normalize": "0.0.1", "geojson-flatten": "^1.0.4" @@ -55371,7 +59911,6 @@ }, "@mapbox/geojson-extent": { "version": "1.0.1", - "integrity": "sha512-hh8LEO3djT4fqfr8sSC6wKt+p0TMiu+KOLMBUiFOyj+zGq7+IXwQGl0ppCVDkyzCewyd9LoGe9zAvDxXrLfhLw==", "requires": { "@mapbox/extent": "0.4.0", "@mapbox/geojson-coords": "0.0.2", @@ -55380,67 +59919,57 @@ }, "dependencies": { "rw": { - "version": "0.1.4", - "integrity": "sha512-vSj3D96kMcjNyqPcp65wBRIDImGSrUuMxngNNxvw8MQaO+aQ6llzRPH7XcJy5zrpb3wU++045+Uz/IDIM684iw==" + "version": "0.1.4" } } }, "@mapbox/geojson-normalize": { - "version": "0.0.1", - "integrity": "sha512-82V7YHcle8lhgIGqEWwtXYN5cy0QM/OHq3ypGhQTbvHR57DF0vMHMjjVSQKFfVXBe/yWCBZTyOuzvK7DFFnx5Q==" + "version": "0.0.1" }, "@mapbox/geojson-rewind": { - "version": "0.4.1", - "integrity": "sha512-mxo2MEr7izA1uOXcDsw99Kgg6xW3P4H2j4n1lmldsgviIelpssvP+jQDivFKOHrOVJDpTTi5oZJvRcHtU9Uufw==", + "version": "0.5.2", "requires": { - "@mapbox/geojson-area": "0.2.2", - "concat-stream": "~1.6.0", - "minimist": "^1.2.5", - "sharkdown": "^0.1.0" + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1" + } } }, "@mapbox/geojson-types": { - "version": "1.0.2", - "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" + "version": "1.0.2" }, "@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" + "version": "2.0.2" }, "@mapbox/mapbox-gl-supported": { - "version": "1.5.0", - "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==" + "version": "2.0.1" }, "@mapbox/martini": { - "version": "0.2.0", - "integrity": "sha512-7hFhtkb0KTLEls+TRw/rWayq5EeHtTaErgm/NskVoXmtgAQu/9D299aeyj6mzAR/6XUnYRp2lU+4IcrYRFjVsQ==" + "version": "0.2.0" }, "@mapbox/point-geometry": { - "version": "0.1.0", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + "version": "0.1.0" }, "@mapbox/tiny-sdf": { - "version": "1.2.5", - "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" + "version": "1.2.5" }, "@mapbox/unitbezier": { - "version": "0.0.0", - "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" + "version": "0.0.0" }, "@mapbox/vector-tile": { "version": "1.3.1", - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", "requires": { "@mapbox/point-geometry": "~0.1.0" } }, "@mapbox/whoots-js": { - "version": "3.1.0", - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" + "version": "3.1.0" }, "@math.gl/core": { "version": "3.5.3", - "integrity": "sha512-TaSnvG0qFh1VxeNW5L58jSx0nJUMWMpUl6zo6Z3ScQzFySG5cicGOBzk/D40RkIZWPazCKCZ+ZThg5npSK9y3g==", "requires": { "@babel/runtime": "^7.12.0", "gl-matrix": "^3.0.0" @@ -55448,7 +59977,6 @@ }, "@math.gl/culling": { "version": "3.5.3", - "integrity": "sha512-ABpAcrvoIOLSm1EUkwgDem4RfO28HWPBs/+taZ/ZSpJG6KiVPklpKU1NCK+05HuJStkpFZ+XlWtehWU6FAMCyA==", "requires": { "@babel/runtime": "^7.12.0", "@math.gl/core": "3.5.3", @@ -55457,7 +59985,6 @@ }, "@math.gl/geospatial": { "version": "3.5.3", - "integrity": "sha512-cnc8VMQrt30JmlG200VDJmmvSjaGW57gY9KEZ+raapxyyFyfDNuAuIrIxe+zbK66FbvFWTbJlDaNmKqVG+ohyw==", "requires": { "@babel/runtime": "^7.12.0", "@math.gl/core": "3.5.3", @@ -55466,14 +59993,12 @@ }, "@math.gl/polygon": { "version": "3.5.3", - "integrity": "sha512-VktscmyQg/Rd56nJk0Nj/UyvnPDbsnZNMWCdl3G5AYenYzLWy6h4FEWhLx8pD+Xw7VuFot8LR4WAK2TPzXzrWw==", "requires": { "@math.gl/core": "3.5.3" } }, "@math.gl/web-mercator": { "version": "3.5.6", - "integrity": "sha512-siWHLJGp9o8fDEM1t0Rby+JXftl6il0z3927liWGzkHqFftXPHY858ShPy45ThDU8q5lyCftg8aVgrv4nfD+Zw==", "requires": { "@babel/runtime": "^7.12.0", "gl-matrix": "~3.3.0" @@ -55481,7 +60006,6 @@ }, "@mdx-js/loader": { "version": "1.6.22", - "integrity": "sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q==", "dev": true, "requires": { "@mdx-js/mdx": "1.6.22", @@ -55490,13 +60014,11 @@ }, "dependencies": { "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", "dev": true }, "loader-utils": { "version": "2.0.0", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { "big.js": "^5.2.2", @@ -55508,7 +60030,6 @@ }, "@mdx-js/mdx": { "version": "1.6.22", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", "requires": { "@babel/core": "7.12.9", "@babel/plugin-syntax-jsx": "7.12.1", @@ -55533,7 +60054,6 @@ "dependencies": { "@babel/core": { "version": "7.12.9", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", "requires": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.12.5", @@ -55555,37 +60075,30 @@ }, "@babel/plugin-syntax-jsx": { "version": "7.12.1", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "debug": { "version": "4.3.4", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "is-buffer": { - "version": "2.0.5", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + "version": "2.0.5" }, "is-plain-obj": { - "version": "2.1.0", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + "version": "2.1.0" }, "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3" }, "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.2" }, "parse-entities": { "version": "2.0.0", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "requires": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", @@ -55597,7 +60110,6 @@ }, "remark-parse": { "version": "8.0.3", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", "requires": { "ccount": "^1.0.0", "collapse-white-space": "^1.0.2", @@ -55619,7 +60131,6 @@ }, "unified": { "version": "9.2.0", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", "requires": { "bail": "^1.0.0", "extend": "^3.0.0", @@ -55630,26 +60141,22 @@ } }, "unist-util-is": { - "version": "4.1.0", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + "version": "4.1.0" }, "unist-util-remove-position": { "version": "2.0.1", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", "requires": { "unist-util-visit": "^2.0.0" } }, "unist-util-stringify-position": { "version": "2.0.3", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "requires": { "@types/unist": "^2.0.2" } }, "unist-util-visit": { "version": "2.0.3", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", @@ -55658,7 +60165,6 @@ }, "unist-util-visit-parents": { "version": "3.1.1", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" @@ -55666,7 +60172,6 @@ }, "vfile": { "version": "4.2.1", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", @@ -55675,12 +60180,10 @@ } }, "vfile-location": { - "version": "3.2.0", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + "version": "3.2.0" }, "vfile-message": { "version": "2.0.4", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", "requires": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^2.0.0" @@ -55690,67 +60193,52 @@ }, "@mdx-js/react": { "version": "1.6.22", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", "dev": true }, "@mdx-js/util": { - "version": "1.6.22", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" + "version": "1.6.22" }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "requires": { "call-me-maybe": "^1.0.1", "glob-to-regexp": "^0.3.0" }, "dependencies": { "glob-to-regexp": { - "version": "0.3.0", - "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==" + "version": "0.3.0" } } }, "@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", "dev": true, "optional": true }, "@nodelib/fs.scandir": { "version": "2.1.3", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "requires": { "@nodelib/fs.stat": "2.0.3", "run-parallel": "^1.1.9" }, "dependencies": { "@nodelib/fs.stat": { - "version": "2.0.3", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + "version": "2.0.3" } } }, "@nodelib/fs.stat": { - "version": "2.0.5", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + "version": "2.0.5" }, "@nodelib/fs.walk": { "version": "1.2.4", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "requires": { "@nodelib/fs.scandir": "2.1.3", "fastq": "^1.6.0" } }, - "@npmcli/ci-detect": { - "version": "1.4.0", - "integrity": "sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q==", - "dev": true - }, "@npmcli/fs": { "version": "1.0.0", - "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", "requires": { "@gar/promisify": "^1.0.1", "semver": "^7.3.5" @@ -55758,127 +60246,147 @@ "dependencies": { "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "4.0.0" } } }, - "@npmcli/git": { - "version": "2.1.0", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "@npmcli/installed-package-contents": { + "version": "1.0.7", "dev": true, "requires": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/map-workspaces": { + "version": "2.0.4", + "dev": true, + "requires": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.0.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.2", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "requires": { "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4" + } + } + }, + "@npmcli/name-from-folder": { + "version": "1.0.1", + "dev": true + }, + "@nrwl/cli": { + "version": "15.3.3", + "dev": true, + "requires": { + "nx": "15.3.3" + } + }, + "@nrwl/devkit": { + "version": "15.3.3", + "dev": true, + "requires": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" }, "dependencies": { + "ignore": { + "version": "5.2.4", + "dev": true + }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, - "mkdirp": { - "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.4", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, - "which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } + "tslib": { + "version": "2.4.1", + "dev": true }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "@npmcli/node-gyp": { - "version": "1.0.3", - "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", - "dev": true - }, - "@npmcli/promise-spawn": { - "version": "1.3.2", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "@nrwl/tao": { + "version": "15.3.3", "dev": true, "requires": { - "infer-owner": "^1.0.4" + "nx": "15.3.3" } }, "@octokit/auth-token": { "version": "2.5.0", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dev": true, "requires": { "@octokit/types": "^6.0.3" } }, "@octokit/core": { - "version": "3.5.1", - "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", - "dev": true, + "version": "3.6.0", "requires": { "@octokit/auth-token": "^2.4.4", "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.0", + "@octokit/request": "^5.6.3", "@octokit/request-error": "^2.0.5", "@octokit/types": "^6.0.3", "before-after-hook": "^2.2.0", @@ -55887,25 +60395,16 @@ "dependencies": { "@octokit/request-error": { "version": "2.1.0", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, "requires": { "@octokit/types": "^6.0.3", "deprecation": "^2.0.0", "once": "^1.4.0" } - }, - "universal-user-agent": { - "version": "6.0.0", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true } } }, "@octokit/endpoint": { "version": "6.0.12", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dev": true, "requires": { "@octokit/types": "^6.0.3", "is-plain-object": "^5.0.0", @@ -55913,275 +60412,814 @@ }, "dependencies": { "is-plain-object": { - "version": "5.0.0", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "universal-user-agent": { - "version": "6.0.0", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true + "version": "5.0.0" } } }, "@octokit/graphql": { "version": "4.8.0", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dev": true, "requires": { "@octokit/request": "^5.6.0", "@octokit/types": "^6.0.3", "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "universal-user-agent": { - "version": "6.0.0", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - } } }, "@octokit/openapi-types": { - "version": "11.2.0", - "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==", - "dev": true + "version": "11.2.0" }, "@octokit/plugin-enterprise-rest": { "version": "6.0.1", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", "dev": true }, "@octokit/plugin-paginate-rest": { "version": "2.17.0", - "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", - "dev": true, "requires": { "@octokit/types": "^6.34.0" } }, "@octokit/plugin-request-log": { - "version": "1.0.4", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true + "version": "1.0.4" }, "@octokit/plugin-rest-endpoint-methods": { "version": "5.13.0", - "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", - "dev": true, "requires": { "@octokit/types": "^6.34.0", "deprecation": "^2.3.1" } }, "@octokit/request": { - "version": "5.6.2", - "integrity": "sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA==", - "dev": true, + "version": "5.6.3", "requires": { "@octokit/endpoint": "^6.0.1", "@octokit/request-error": "^2.1.0", "@octokit/types": "^6.16.1", "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" }, "dependencies": { "@octokit/request-error": { "version": "2.1.0", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "requires": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "is-plain-object": { + "version": "5.0.0" + } + } + }, + "@octokit/request-error": { + "version": "3.0.2", + "dev": true, + "requires": { + "@octokit/types": "^8.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "14.0.0", + "dev": true + }, + "@octokit/types": { + "version": "8.0.0", + "dev": true, + "requires": { + "@octokit/openapi-types": "^14.0.0" + } + } + } + }, + "@octokit/rest": { + "version": "18.12.0", + "requires": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.8", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + } + }, + "@octokit/types": { + "version": "6.34.0", + "requires": { + "@octokit/openapi-types": "^11.2.0" + } + }, + "@parcel/watcher": { + "version": "2.0.4", + "dev": true, + "requires": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + } + }, + "@phenomnomnominal/tsquery": { + "version": "4.1.1", + "dev": true, + "requires": { + "esquery": "^1.0.1" + } + }, + "@polka/url": { + "version": "1.0.0-next.20", + "dev": true + }, + "@popperjs/core": { + "version": "2.10.1" + }, + "@probe.gl/stats": { + "version": "3.4.0", + "requires": { + "@babel/runtime": "^7.0.0" + } + }, + "@react-dnd/asap": { + "version": "4.0.0" + }, + "@react-dnd/invariant": { + "version": "2.0.0" + }, + "@react-dnd/shallowequal": { + "version": "2.0.0" + }, + "@react-icons/all-files": { + "version": "4.1.0" + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.1", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/formatio": { + "version": "5.0.1", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^5.0.2" + } + }, + "@sinonjs/samsam": { + "version": "5.3.1", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "dev": true + }, + "@storybook/addon-actions": { + "version": "6.4.22", + "requires": { + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/theming": "6.4.22", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "polished": "^4.0.5", + "prop-types": "^15.7.2", + "react-inspector": "^5.1.0", + "regenerator-runtime": "^0.13.7", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "uuid-browser": "^3.1.0" + }, + "dependencies": { + "polished": { + "version": "4.2.2", + "requires": { + "@babel/runtime": "^7.17.8" + } + } + } + }, + "@storybook/addon-backgrounds": { + "version": "6.4.22", + "dev": true, + "requires": { + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/theming": "6.4.22", + "core-js": "^3.8.2", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/addon-controls": { + "version": "6.4.22", + "dev": true, + "requires": { + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/node-logger": "6.4.22", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", + "core-js": "^3.8.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/addon-docs": { + "version": "6.5.10", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@jest/transform": "^26.6.2", + "@mdx-js/react": "^1.6.22", + "@storybook/addons": "6.5.10", + "@storybook/api": "6.5.10", + "@storybook/components": "6.5.10", + "@storybook/core-common": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/docs-tools": "6.5.10", + "@storybook/mdx1-csf": "^0.0.1", + "@storybook/node-logger": "6.5.10", + "@storybook/postinstall": "6.5.10", + "@storybook/preview-web": "6.5.10", + "@storybook/source-loader": "6.5.10", + "@storybook/store": "6.5.10", + "@storybook/theming": "6.5.10", + "babel-loader": "^8.0.0", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "regenerator-runtime": "^0.13.7", + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "@storybook/addons": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/api": "6.5.10", + "@storybook/channels": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.10", + "@storybook/theming": "6.5.10", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/channels": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.10", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.10", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channel-postmessage": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/channels": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "core-js": "^3.8.2", + "global": "^4.4.0", + "qs": "^6.10.0", + "telejson": "^6.0.8" + } + }, + "@storybook/channels": { + "version": "6.5.10", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.5.10", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/components": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/client-logger": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/theming": "6.5.10", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/core-common": { + "version": "6.5.10", + "dev": true, + "requires": { + "@babel/core": "^7.12.10", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-decorators": "^7.12.12", + "@babel/plugin-proposal-export-default-from": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-private-property-in-object": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.12", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/preset-env": "^7.12.11", + "@babel/preset-react": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@babel/register": "^7.12.1", + "@storybook/node-logger": "6.5.10", + "@storybook/semver": "^7.3.2", + "@types/node": "^14.0.10 || ^16.0.0", + "@types/pretty-hrtime": "^1.0.0", + "babel-loader": "^8.0.0", + "babel-plugin-macros": "^3.0.1", + "babel-plugin-polyfill-corejs3": "^0.1.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "express": "^4.17.1", + "file-system-cache": "^1.0.5", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.0.4", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "handlebars": "^4.7.7", + "interpret": "^2.2.0", + "json5": "^2.1.3", + "lazy-universal-dotenv": "^3.0.1", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "webpack": "4" + } + }, + "@storybook/core-events": { + "version": "6.5.10", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/csf": { + "version": "0.0.2--canary.4566f4d.1", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "@storybook/node-logger": { + "version": "6.5.10", + "dev": true, + "requires": { + "@types/npmlog": "^4.1.2", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "npmlog": "^5.0.1", + "pretty-hrtime": "^1.0.3" + } + }, + "@storybook/postinstall": { + "version": "6.5.10", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/preview-web": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/addons": "6.5.10", + "@storybook/channel-postmessage": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.10", + "ansi-to-html": "^0.6.11", + "core-js": "^3.8.2", + "global": "^4.4.0", + "lodash": "^4.17.21", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "unfetch": "^4.2.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/router": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/client-logger": "6.5.10", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/source-loader": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/addons": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "estraverse": "^5.2.0", + "global": "^4.4.0", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.4", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "@storybook/store": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/addons": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "slash": "^3.0.0", + "stable": "^0.1.8", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/theming": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/client-logger": "6.5.10", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7" + } + }, + "@types/node": { + "version": "16.11.48", + "dev": true + }, + "acorn": { + "version": "6.4.2", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "dev": true + }, + "are-we-there-yet": { + "version": "2.0.0", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "eslint-scope": { + "version": "4.0.3", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "dev": true + } + } + }, + "estraverse": { + "version": "5.3.0", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-extra": { + "version": "9.1.0", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "gauge": { + "version": "3.0.2", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "isobject": { + "version": "4.0.0", + "dev": true + }, + "json5": { + "version": "2.2.3", + "dev": true + }, + "loader-runner": { + "version": "2.4.0", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "npmlog": { + "version": "5.0.1", + "dev": true, + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "p-limit": { + "version": "3.1.0", "dev": true, "requires": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "yocto-queue": "^0.1.0" } }, - "is-plain-object": { + "p-locate": { "version": "5.0.0", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", "dev": true }, - "universal-user-agent": { - "version": "6.0.0", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "pkg-dir": { + "version": "5.0.0", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + }, + "prettier": { + "version": "2.3.0", "dev": true - } - } - }, - "@octokit/rest": { - "version": "18.12.0", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", - "dev": true, - "requires": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" - } - }, - "@octokit/types": { - "version": "6.34.0", - "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^11.2.0" - } - }, - "@polka/url": { - "version": "1.0.0-next.20", - "integrity": "sha512-88p7+M0QGxKpmnkfXjS4V26AnoC/eiqZutE8GLdaI5X12NY75bXSdTY9NkmYb2Xyk1O+MmkuO6Frmsj84V6I8Q==", - "dev": true - }, - "@popperjs/core": { - "version": "2.10.1", - "integrity": "sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw==" - }, - "@probe.gl/stats": { - "version": "3.4.0", - "integrity": "sha512-Gl37r9qGuiKadIvTZdSZvzCNOttJYw6RcY1oT0oDuB8r2uhuZAdSMQRQTy9FTinp6MY6O9wngGnV6EpQ8wSBAw==", - "requires": { - "@babel/runtime": "^7.0.0" - } - }, - "@react-dnd/asap": { - "version": "4.0.0", - "integrity": "sha512-0XhqJSc6pPoNnf8DhdsPHtUhRzZALVzYMTzRwV4VI6DJNJ/5xxfL9OQUwb8IH5/2x7lSf7nAZrnzUD+16VyOVQ==" - }, - "@react-dnd/invariant": { - "version": "2.0.0", - "integrity": "sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==" - }, - "@react-dnd/shallowequal": { - "version": "2.0.0", - "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==" - }, - "@react-icons/all-files": { - "version": "4.1.0", - "integrity": "sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ==" - }, - "@samverschueren/stream-to-observable": { - "version": "0.3.1", - "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", - "dev": true, - "requires": { - "any-observable": "^0.3.0" - } - }, - "@sinonjs/commons": { - "version": "1.8.3", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sinonjs/formatio": { - "version": "5.0.1", - "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^5.0.2" - } - }, - "@sinonjs/samsam": { - "version": "5.3.1", - "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "@storybook/addon-actions": { - "version": "6.4.22", - "integrity": "sha512-t2w3iLXFul+R/1ekYxIEzUOZZmvEa7EzUAVAuCHP4i6x0jBnTTZ7sAIUVRaxVREPguH5IqI/2OklYhKanty2Yw==", - "requires": { - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.22", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "polished": "^4.0.5", - "prop-types": "^15.7.2", - "react-inspector": "^5.1.0", - "regenerator-runtime": "^0.13.7", - "telejson": "^5.3.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2", - "uuid-browser": "^3.1.0" - }, - "dependencies": { - "polished": { - "version": "4.2.2", - "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", + }, + "qs": { + "version": "6.11.0", + "dev": true, "requires": { - "@babel/runtime": "^7.17.8" + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "resolve-from": { + "version": "5.0.0", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "telejson": { + "version": "6.0.8", + "dev": true, + "requires": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.2", + "is-regex": "^1.1.2", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "webpack": { + "version": "4.46.0", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + } + }, + "webpack-sources": { + "version": "1.4.3", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } } } }, - "@storybook/addon-backgrounds": { - "version": "6.4.22", - "integrity": "sha512-xQIV1SsjjRXP7P5tUoGKv+pul1EY8lsV7iBXQb5eGbp4AffBj3qoYBSZbX4uiazl21o0MQiQoeIhhaPVaFIIGg==", - "dev": true, - "requires": { - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-events": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.22", - "core-js": "^3.8.2", - "global": "^4.4.0", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/addon-controls": { - "version": "6.4.22", - "integrity": "sha512-f/M/W+7UTEUnr/L6scBMvksq+ZA8GTfh3bomE5FtWyOyaFppq9k8daKAvdYNlzXAOrUUsoZVJDgpb20Z2VBiSQ==", - "dev": true, - "requires": { - "@storybook/addons": "6.4.22", - "@storybook/api": "6.4.22", - "@storybook/client-logger": "6.4.22", - "@storybook/components": "6.4.22", - "@storybook/core-common": "6.4.22", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/node-logger": "6.4.22", - "@storybook/store": "6.4.22", - "@storybook/theming": "6.4.22", - "core-js": "^3.8.2", - "lodash": "^4.17.21", - "ts-dedent": "^2.0.0" - } - }, "@storybook/addon-essentials": { "version": "6.4.22", - "integrity": "sha512-GTv291fqvWq2wzm7MruBvCGuWaCUiuf7Ca3kzbQ/WqWtve7Y/1PDsqRNQLGZrQxkXU0clXCqY1XtkTrtA3WGFQ==", "dev": true, "requires": { "@storybook/addon-actions": "6.4.22", @@ -56202,7 +61240,6 @@ "dependencies": { "@storybook/addon-docs": { "version": "6.4.22", - "integrity": "sha512-9j+i+W+BGHJuRe4jUrqk6ubCzP4fc1xgFS2o8pakRiZgPn5kUQPdkticmsyh1XeEJifwhqjKJvkEDrcsleytDA==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -56255,12 +61292,10 @@ }, "acorn": { "version": "7.4.1", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "escodegen": { "version": "2.0.0", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "requires": { "esprima": "^4.0.1", @@ -56272,22 +61307,18 @@ }, "esprima": { "version": "4.0.1", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "estraverse": { "version": "5.3.0", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", "dev": true }, "loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", "dev": true, "requires": { "big.js": "^5.2.2", @@ -56297,12 +61328,10 @@ }, "nanoid": { "version": "3.3.4", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "dev": true }, "p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { "yocto-queue": "^0.1.0" @@ -56310,12 +61339,10 @@ }, "prettier": { "version": "2.3.0", - "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", "dev": true }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true } @@ -56323,7 +61350,6 @@ }, "@storybook/addon-knobs": { "version": "6.3.1", - "integrity": "sha512-2GGGnQSPXXUhHHYv4IW6pkyQlCPYXKYiyGzfhV7Zhs95M2Ban08OA6KLmliMptWCt7U9tqTO8dB5u0C2cWmCTw==", "requires": { "copy-to-clipboard": "^3.3.1", "core-js": "^3.8.2", @@ -56338,71 +61364,16 @@ "react-select": "^3.2.0" }, "dependencies": { - "@emotion/cache": { - "version": "10.0.29", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", - "requires": { - "@emotion/sheet": "0.9.4", - "@emotion/stylis": "0.8.5", - "@emotion/utils": "0.11.3", - "@emotion/weak-memoize": "0.2.5" - } - }, - "csstype": { - "version": "3.0.9", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" - }, - "dom-helpers": { - "version": "5.2.1", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, "qs": { - "version": "6.10.1", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.11.0", "requires": { "side-channel": "^1.0.4" } - }, - "react-input-autosize": { - "version": "3.0.0", - "integrity": "sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==", - "requires": { - "prop-types": "^15.5.8" - } - }, - "react-select": { - "version": "3.2.0", - "integrity": "sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ==", - "requires": { - "@babel/runtime": "^7.4.4", - "@emotion/cache": "^10.0.9", - "@emotion/core": "^10.0.9", - "@emotion/css": "^10.0.9", - "memoize-one": "^5.0.0", - "prop-types": "^15.6.0", - "react-input-autosize": "^3.0.0", - "react-transition-group": "^4.3.0" - } - }, - "react-transition-group": { - "version": "4.4.2", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } } } }, "@storybook/addon-links": { "version": "6.4.22", - "integrity": "sha512-OSOyDnTXnmcplJHlXTYUTMkrfpLqxtHp2R69IXfAyI1e8WNDb79mXflrEXDA/RSNEliLkqYwCyYby7gDMGds5Q==", "requires": { "@storybook/addons": "6.4.22", "@storybook/client-logger": "6.4.22", @@ -56419,8 +61390,7 @@ }, "dependencies": { "qs": { - "version": "6.10.3", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", "requires": { "side-channel": "^1.0.4" } @@ -56429,7 +61399,6 @@ }, "@storybook/addon-measure": { "version": "6.4.22", - "integrity": "sha512-CjDXoCNIXxNfXfgyJXPc0McjCcwN1scVNtHa9Ckr+zMjiQ8pPHY7wDZCQsG69KTqcWHiVfxKilI82456bcHYhQ==", "dev": true, "requires": { "@storybook/addons": "6.4.22", @@ -56444,7 +61413,6 @@ }, "@storybook/addon-outline": { "version": "6.4.22", - "integrity": "sha512-VIMEzvBBRbNnupGU7NV0ahpFFb6nKVRGYWGREjtABdFn2fdKr1YicOHFe/3U7hRGjb5gd+VazSvyUvhaKX9T7Q==", "dev": true, "requires": { "@storybook/addons": "6.4.22", @@ -56461,7 +61429,6 @@ }, "@storybook/addon-toolbars": { "version": "6.4.22", - "integrity": "sha512-FFyj6XDYpBBjcUu6Eyng7R805LUbVclEfydZjNiByAoDVyCde9Hb4sngFxn/T4fKAfBz/32HKVXd5iq4AHYtLg==", "dev": true, "requires": { "@storybook/addons": "6.4.22", @@ -56474,7 +61441,6 @@ }, "@storybook/addon-viewport": { "version": "6.4.22", - "integrity": "sha512-6jk0z49LemeTblez5u2bYXYr6U+xIdLbywe3G283+PZCBbEDE6eNYy2d2HDL+LbCLbezJBLYPHPalElphjJIcw==", "dev": true, "requires": { "@storybook/addons": "6.4.22", @@ -56492,7 +61458,6 @@ }, "@storybook/addons": { "version": "6.4.22", - "integrity": "sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==", "requires": { "@storybook/api": "6.4.22", "@storybook/channels": "6.4.22", @@ -56509,7 +61474,6 @@ }, "@storybook/api": { "version": "6.4.22", - "integrity": "sha512-lAVI3o2hKupYHXFTt+1nqFct942up5dHH6YD7SZZJGyW21dwKC3HK1IzCsTawq3fZAKkgWFgmOO649hKk60yKg==", "requires": { "@storybook/channels": "6.4.22", "@storybook/client-logger": "6.4.22", @@ -56532,7 +61496,6 @@ }, "@storybook/builder-webpack4": { "version": "6.4.22", - "integrity": "sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==", "requires": { "@babel/core": "^7.12.10", "@babel/plugin-proposal-class-properties": "^7.12.1", @@ -56606,23 +61569,19 @@ }, "dependencies": { "@types/node": { - "version": "14.18.16", - "integrity": "sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==" + "version": "14.18.16" }, "acorn": { - "version": "6.4.2", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + "version": "6.4.2" }, "ansi-styles": { "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -56631,7 +61590,6 @@ }, "css-loader": { "version": "3.6.0", - "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", "requires": { "camelcase": "^5.3.1", "cssesc": "^3.0.0", @@ -56649,14 +61607,12 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" } } }, "eslint-scope": { "version": "4.0.3", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -56664,7 +61620,6 @@ }, "find-up": { "version": "5.0.0", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -56672,7 +61627,6 @@ }, "fork-ts-checker-webpack-plugin": { "version": "4.1.6", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", "requires": { "@babel/code-frame": "^7.5.5", "chalk": "^2.4.1", @@ -56685,7 +61639,6 @@ }, "html-webpack-plugin": { "version": "4.5.2", - "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", "requires": { "@types/html-minifier-terser": "^5.0.0", "@types/tapable": "^1.0.5", @@ -56700,51 +61653,42 @@ }, "icss-utils": { "version": "4.1.1", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "requires": { "postcss": "^7.0.14" } }, "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3" }, "loader-runner": { - "version": "2.4.0", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + "version": "2.4.0" }, "locate-path": { "version": "6.0.0", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { "p-locate": "^5.0.0" } }, "normalize-path": { - "version": "3.0.0", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "version": "3.0.0" }, "p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { "yocto-queue": "^0.1.0" } }, "p-locate": { "version": "5.0.0", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { "p-limit": "^3.0.2" } }, "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" }, "postcss": { "version": "7.0.39", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "requires": { "picocolors": "^0.2.1", "source-map": "^0.6.1" @@ -56752,14 +61696,12 @@ }, "postcss-modules-extract-imports": { "version": "2.0.0", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "requires": { "postcss": "^7.0.5" } }, "postcss-modules-local-by-default": { "version": "3.0.3", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "requires": { "icss-utils": "^4.1.1", "postcss": "^7.0.32", @@ -56769,7 +61711,6 @@ }, "postcss-modules-scope": { "version": "2.2.0", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "requires": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" @@ -56777,7 +61718,6 @@ }, "postcss-modules-values": { "version": "3.0.0", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "requires": { "icss-utils": "^4.0.0", "postcss": "^7.0.6" @@ -56785,7 +61725,6 @@ }, "pretty-error": { "version": "2.1.2", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "requires": { "lodash": "^4.17.20", "renderkid": "^2.0.4" @@ -56793,7 +61732,6 @@ }, "schema-utils": { "version": "2.7.1", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -56801,20 +61739,17 @@ } }, "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" }, "style-loader": { "version": "1.3.0", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", "requires": { "loader-utils": "^2.0.0", "schema-utils": "^2.7.0" }, "dependencies": { "loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -56825,14 +61760,12 @@ }, "supports-color": { "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } }, "webpack": { "version": "4.46.0", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -56861,7 +61794,6 @@ "dependencies": { "schema-utils": { "version": "1.0.0", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -56870,7 +61802,6 @@ }, "terser-webpack-plugin": { "version": "1.4.5", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -56886,12 +61817,10 @@ } }, "webpack-filter-warnings-plugin": { - "version": "1.2.1", - "integrity": "sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==" + "version": "1.2.1" }, "webpack-sources": { "version": "1.4.3", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -56901,7 +61830,6 @@ }, "@storybook/builder-webpack5": { "version": "6.4.22", - "integrity": "sha512-vvQ0HgkIIVz+cmaCXIRor0UFZbGZqh4aV0ISSof60BjdW5ld+R+XCr/bdTU6Zg8b2fL9CXh7/LE6fImnIMpRIA==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -56965,12 +61893,10 @@ "dependencies": { "@types/node": { "version": "14.17.19", - "integrity": "sha512-jjYI6NkyfXykucU6ELEoT64QyKOdvaA6enOqKtP4xUsGY0X0ZUZz29fUmrTRo+7v7c6TgDu82q3GHHaCEkqZwA==", "dev": true }, "babel-plugin-macros": { "version": "3.1.0", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "dev": true, "requires": { "@babel/runtime": "^7.12.5", @@ -56980,7 +61906,6 @@ }, "css-loader": { "version": "5.2.7", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", "dev": true, "requires": { "icss-utils": "^5.1.0", @@ -56997,7 +61922,6 @@ "dependencies": { "semver": { "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -57007,12 +61931,10 @@ }, "has-flag": { "version": "4.0.0", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-worker": { "version": "27.2.3", - "integrity": "sha512-ZwOvv4GCIPviL+Ie4pVguz4N5w/6IGbTaHBYOl3ZcsZZktaL7d8JOU0rmovoED7AJZKA8fvmLbBg8yg80u/tGA==", "dev": true, "requires": { "@types/node": "*", @@ -57021,16 +61943,11 @@ } }, "json5": { - "version": "2.2.0", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "dev": true }, "loader-utils": { - "version": "2.0.0", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.4", "dev": true, "requires": { "big.js": "^5.2.2", @@ -57040,7 +61957,6 @@ }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -57048,7 +61964,6 @@ }, "p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { "yocto-queue": "^0.1.0" @@ -57056,7 +61971,6 @@ }, "serialize-javascript": { "version": "6.0.0", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -57064,12 +61978,10 @@ }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "style-loader": { "version": "2.0.0", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", "dev": true, "requires": { "loader-utils": "^2.0.0", @@ -57078,32 +61990,23 @@ }, "supports-color": { "version": "8.1.1", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, "terser": { - "version": "5.9.0", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "version": "5.14.2", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } } }, "terser-webpack-plugin": { "version": "5.2.4", - "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", "dev": true, "requires": { "jest-worker": "^27.0.6", @@ -57116,7 +62019,6 @@ }, "webpack-dev-middleware": { "version": "4.3.0", - "integrity": "sha512-PjwyVY95/bhBh6VUqt6z4THplYcsvQ8YNNBTBM873xLVmw8FLeALn0qurHbs9EmcfhzQis/eoqypSnZeuUz26w==", "dev": true, "requires": { "colorette": "^1.2.2", @@ -57129,19 +62031,16 @@ }, "webpack-virtual-modules": { "version": "0.4.3", - "integrity": "sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw==", "dev": true }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@storybook/channel-postmessage": { "version": "6.4.22", - "integrity": "sha512-gt+0VZLszt2XZyQMh8E94TqjHZ8ZFXZ+Lv/Mmzl0Yogsc2H+6VzTTQO4sv0IIx6xLbpgG72g5cr8VHsxW5kuDQ==", "requires": { "@storybook/channels": "6.4.22", "@storybook/client-logger": "6.4.22", @@ -57153,8 +62052,7 @@ }, "dependencies": { "qs": { - "version": "6.10.3", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", "requires": { "side-channel": "^1.0.4" } @@ -57163,7 +62061,6 @@ }, "@storybook/channel-websocket": { "version": "6.4.22", - "integrity": "sha512-Bm/FcZ4Su4SAK5DmhyKKfHkr7HiHBui6PNutmFkASJInrL9wBduBfN8YQYaV7ztr8ezoHqnYRx8sj28jpwa6NA==", "requires": { "@storybook/channels": "6.4.22", "@storybook/client-logger": "6.4.22", @@ -57174,7 +62071,6 @@ }, "@storybook/channels": { "version": "6.4.22", - "integrity": "sha512-cfR74tu7MLah1A8Rru5sak71I+kH2e/sY6gkpVmlvBj4hEmdZp4Puj9PTeaKcMXh9DgIDPNA5mb8yvQH6VcyxQ==", "requires": { "core-js": "^3.8.2", "ts-dedent": "^2.0.0", @@ -57183,7 +62079,6 @@ }, "@storybook/client-api": { "version": "6.4.22", - "integrity": "sha512-sO6HJNtrrdit7dNXQcZMdlmmZG1k6TswH3gAyP/DoYajycrTwSJ6ovkarzkO+0QcJ+etgra4TEdTIXiGHBMe/A==", "requires": { "@storybook/addons": "6.4.22", "@storybook/channel-postmessage": "6.4.22", @@ -57208,8 +62103,7 @@ }, "dependencies": { "qs": { - "version": "6.10.1", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.11.0", "requires": { "side-channel": "^1.0.4" } @@ -57218,7 +62112,6 @@ }, "@storybook/client-logger": { "version": "6.4.22", - "integrity": "sha512-LXhxh/lcDsdGnK8kimqfhu3C0+D2ylCSPPQNbU0IsLRmTfbpQYMdyl0XBjPdHiRVwlL7Gkw5OMjYemQgJ02zlw==", "requires": { "core-js": "^3.8.2", "global": "^4.4.0" @@ -57226,7 +62119,6 @@ }, "@storybook/components": { "version": "6.4.22", - "integrity": "sha512-dCbXIJF9orMvH72VtAfCQsYbe57OP7fAADtR6YTwfCw9Sm1jFuZr8JbblQ1HcrXEoJG21nOyad3Hm5EYVb/sBw==", "requires": { "@popperjs/core": "^2.6.0", "@storybook/client-logger": "6.4.22", @@ -57256,25 +62148,21 @@ "dependencies": { "color-convert": { "version": "2.0.1", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "polished": { "version": "4.1.3", - "integrity": "sha512-ocPAcVBUOryJEKe0z2KLd1l9EBa1r5mSwlKpExmrLzsnIzJo4axsoU9O2BjOTkDGDT4mZ0WFE5XKTlR3nLnZOA==", "requires": { "@babel/runtime": "^7.14.0" } }, "react-syntax-highlighter": { "version": "13.5.3", - "integrity": "sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==", "requires": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.1.1", @@ -57287,7 +62175,6 @@ }, "@storybook/core": { "version": "6.4.22", - "integrity": "sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==", "requires": { "@storybook/core-client": "6.4.22", "@storybook/core-server": "6.4.22" @@ -57295,7 +62182,6 @@ }, "@storybook/core-client": { "version": "6.4.22", - "integrity": "sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==", "requires": { "@storybook/addons": "6.4.22", "@storybook/channel-postmessage": "6.4.22", @@ -57320,8 +62206,7 @@ }, "dependencies": { "qs": { - "version": "6.10.3", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", "requires": { "side-channel": "^1.0.4" } @@ -57330,7 +62215,6 @@ }, "@storybook/core-common": { "version": "6.4.22", - "integrity": "sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==", "requires": { "@babel/core": "^7.12.10", "@babel/plugin-proposal-class-properties": "^7.12.1", @@ -57384,16 +62268,13 @@ }, "dependencies": { "@types/node": { - "version": "14.18.16", - "integrity": "sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==" + "version": "14.18.16" }, "acorn": { - "version": "6.4.2", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + "version": "6.4.2" }, "babel-plugin-macros": { "version": "3.1.0", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "requires": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -57402,7 +62283,6 @@ }, "eslint-scope": { "version": "4.0.3", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -57410,7 +62290,6 @@ }, "find-up": { "version": "5.0.0", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -57418,7 +62297,6 @@ }, "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -57427,52 +62305,43 @@ } }, "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3" }, "loader-runner": { - "version": "2.4.0", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + "version": "2.4.0" }, "locate-path": { "version": "6.0.0", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { "p-locate": "^5.0.0" } }, "p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { "yocto-queue": "^0.1.0" } }, "p-locate": { "version": "5.0.0", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { "p-limit": "^3.0.2" } }, "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" }, "pkg-dir": { "version": "5.0.0", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "requires": { "find-up": "^5.0.0" } }, "resolve-from": { - "version": "5.0.0", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + "version": "5.0.0" }, "schema-utils": { "version": "1.0.0", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -57480,16 +62349,13 @@ } }, "slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "version": "3.0.0" }, "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" }, "terser-webpack-plugin": { "version": "1.4.5", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -57504,7 +62370,6 @@ }, "webpack": { "version": "4.46.0", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -57533,7 +62398,6 @@ }, "webpack-sources": { "version": "1.4.3", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -57543,14 +62407,12 @@ }, "@storybook/core-events": { "version": "6.4.22", - "integrity": "sha512-5GYY5+1gd58Gxjqex27RVaX6qbfIQmJxcbzbNpXGNSqwqAuIIepcV1rdCVm6I4C3Yb7/AQ3cN5dVbf33QxRIwA==", "requires": { "core-js": "^3.8.2" } }, "@storybook/core-server": { "version": "6.4.22", - "integrity": "sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==", "requires": { "@discoveryjs/json-ext": "^0.5.3", "@storybook/builder-webpack4": "6.4.22", @@ -57597,20 +62459,16 @@ }, "dependencies": { "@types/node": { - "version": "14.18.16", - "integrity": "sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==" + "version": "14.18.16" }, "acorn": { - "version": "6.4.2", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + "version": "6.4.2" }, "commander": { - "version": "6.2.1", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" + "version": "6.2.1" }, "eslint-scope": { "version": "4.0.3", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -57618,7 +62476,6 @@ }, "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -57627,12 +62484,10 @@ } }, "loader-runner": { - "version": "2.4.0", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + "version": "2.4.0" }, "schema-utils": { "version": "1.0.0", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -57640,16 +62495,13 @@ } }, "slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "version": "3.0.0" }, "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" }, "terser-webpack-plugin": { "version": "1.4.5", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -57664,7 +62516,6 @@ }, "watchpack": { "version": "2.3.1", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -57672,7 +62523,6 @@ }, "webpack": { "version": "4.46.0", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -57701,7 +62551,6 @@ "dependencies": { "watchpack": { "version": "1.7.5", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "requires": { "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", @@ -57713,28 +62562,24 @@ }, "webpack-sources": { "version": "1.4.3", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" } }, "ws": { - "version": "8.6.0", - "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==" + "version": "8.6.0" } } }, "@storybook/csf": { "version": "0.0.2--canary.87bc651.0", - "integrity": "sha512-ajk1Uxa+rBpFQHKrCcTmJyQBXZ5slfwHVEaKlkuFaW77it8RgbPJp/ccna3sgoi8oZ7FkkOyvv1Ve4SmwFqRqw==", "requires": { "lodash": "^4.17.15" } }, "@storybook/csf-tools": { "version": "6.4.22", - "integrity": "sha512-LMu8MZAiQspJAtMBLU2zitsIkqQv7jOwX7ih5JrXlyaDticH7l2j6Q+1mCZNWUOiMTizj0ivulmUsSaYbpToSw==", "requires": { "@babel/core": "^7.12.10", "@babel/generator": "^7.12.11", @@ -57757,7 +62602,6 @@ "dependencies": { "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -57766,14 +62610,169 @@ } }, "prettier": { - "version": "2.3.0", - "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==" + "version": "2.3.0" + } + } + }, + "@storybook/docs-tools": { + "version": "6.5.10", + "dev": true, + "requires": { + "@babel/core": "^7.12.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/store": "6.5.10", + "core-js": "^3.8.2", + "doctrine": "^3.0.0", + "lodash": "^4.17.21", + "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "@storybook/addons": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/api": "6.5.10", + "@storybook/channels": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.10", + "@storybook/theming": "6.5.10", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/channels": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.10", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.10", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.5.10", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.5.10", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.5.10", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/csf": { + "version": "0.0.2--canary.4566f4d.1", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "@storybook/router": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/client-logger": "6.5.10", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/store": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/addons": "6.5.10", + "@storybook/client-logger": "6.5.10", + "@storybook/core-events": "6.5.10", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "slash": "^3.0.0", + "stable": "^0.1.8", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/theming": { + "version": "6.5.10", + "dev": true, + "requires": { + "@storybook/client-logger": "6.5.10", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7" + } + }, + "isobject": { + "version": "4.0.0", + "dev": true + }, + "qs": { + "version": "6.11.0", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "telejson": { + "version": "6.0.8", + "dev": true, + "requires": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.2", + "is-regex": "^1.1.2", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3" + } } } }, "@storybook/manager-webpack4": { "version": "6.4.22", - "integrity": "sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==", "requires": { "@babel/core": "^7.12.10", "@babel/plugin-transform-template-literals": "^7.12.1", @@ -57814,16 +62813,13 @@ }, "dependencies": { "@types/node": { - "version": "14.18.16", - "integrity": "sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==" + "version": "14.18.16" }, "acorn": { - "version": "6.4.2", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + "version": "6.4.2" }, "css-loader": { "version": "3.6.0", - "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", "requires": { "camelcase": "^5.3.1", "cssesc": "^3.0.0", @@ -57842,7 +62838,6 @@ }, "eslint-scope": { "version": "4.0.3", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -57850,7 +62845,6 @@ }, "find-up": { "version": "5.0.0", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -57858,7 +62852,6 @@ }, "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -57868,7 +62861,6 @@ }, "html-webpack-plugin": { "version": "4.5.2", - "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", "requires": { "@types/html-minifier-terser": "^5.0.0", "@types/tapable": "^1.0.5", @@ -57883,51 +62875,42 @@ }, "icss-utils": { "version": "4.1.1", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "requires": { "postcss": "^7.0.14" } }, "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3" }, "loader-runner": { - "version": "2.4.0", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + "version": "2.4.0" }, "locate-path": { "version": "6.0.0", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { "p-locate": "^5.0.0" } }, "normalize-path": { - "version": "3.0.0", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "version": "3.0.0" }, "p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { "yocto-queue": "^0.1.0" } }, "p-locate": { "version": "5.0.0", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { "p-limit": "^3.0.2" } }, "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" }, "postcss": { "version": "7.0.39", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "requires": { "picocolors": "^0.2.1", "source-map": "^0.6.1" @@ -57935,14 +62918,12 @@ }, "postcss-modules-extract-imports": { "version": "2.0.0", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "requires": { "postcss": "^7.0.5" } }, "postcss-modules-local-by-default": { "version": "3.0.3", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "requires": { "icss-utils": "^4.1.1", "postcss": "^7.0.32", @@ -57952,7 +62933,6 @@ }, "postcss-modules-scope": { "version": "2.2.0", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "requires": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" @@ -57960,7 +62940,6 @@ }, "postcss-modules-values": { "version": "3.0.0", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "requires": { "icss-utils": "^4.0.0", "postcss": "^7.0.6" @@ -57968,19 +62947,16 @@ }, "pretty-error": { "version": "2.1.2", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "requires": { "lodash": "^4.17.20", "renderkid": "^2.0.4" } }, "resolve-from": { - "version": "5.0.0", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + "version": "5.0.0" }, "schema-utils": { "version": "2.7.1", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -57988,24 +62964,20 @@ } }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" }, "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" }, "style-loader": { "version": "1.3.0", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", "requires": { "loader-utils": "^2.0.0", "schema-utils": "^2.7.0" }, "dependencies": { "loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -58016,7 +62988,6 @@ }, "webpack": { "version": "4.46.0", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -58045,7 +63016,6 @@ "dependencies": { "schema-utils": { "version": "1.0.0", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -58054,7 +63024,6 @@ }, "terser-webpack-plugin": { "version": "1.4.5", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -58071,7 +63040,6 @@ }, "webpack-sources": { "version": "1.4.3", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -58081,7 +63049,6 @@ }, "@storybook/manager-webpack5": { "version": "6.4.22", - "integrity": "sha512-BMkOMselT4jOn7EQGt748FurM5ewtDfZtOQPCVK8MZX+HYE2AgjNOzm562TYODIxk12Fkhgj3EIz7GGMe1U3RA==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -58121,12 +63088,10 @@ "dependencies": { "@types/node": { "version": "14.17.19", - "integrity": "sha512-jjYI6NkyfXykucU6ELEoT64QyKOdvaA6enOqKtP4xUsGY0X0ZUZz29fUmrTRo+7v7c6TgDu82q3GHHaCEkqZwA==", "dev": true }, "css-loader": { "version": "5.2.7", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", "dev": true, "requires": { "icss-utils": "^5.1.0", @@ -58143,7 +63108,6 @@ }, "find-up": { "version": "5.0.0", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { "locate-path": "^6.0.0", @@ -58152,7 +63116,6 @@ }, "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -58163,12 +63126,10 @@ }, "has-flag": { "version": "4.0.0", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-worker": { "version": "27.2.3", - "integrity": "sha512-ZwOvv4GCIPviL+Ie4pVguz4N5w/6IGbTaHBYOl3ZcsZZktaL7d8JOU0rmovoED7AJZKA8fvmLbBg8yg80u/tGA==", "dev": true, "requires": { "@types/node": "*", @@ -58177,16 +63138,11 @@ } }, "json5": { - "version": "2.2.0", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "dev": true }, "loader-utils": { - "version": "2.0.0", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.4", "dev": true, "requires": { "big.js": "^5.2.2", @@ -58196,7 +63152,6 @@ }, "locate-path": { "version": "6.0.0", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { "p-locate": "^5.0.0" @@ -58204,7 +63159,6 @@ }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -58212,7 +63166,6 @@ }, "p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { "yocto-queue": "^0.1.0" @@ -58220,7 +63173,6 @@ }, "p-locate": { "version": "5.0.0", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { "p-limit": "^3.0.2" @@ -58228,17 +63180,14 @@ }, "path-exists": { "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "resolve-from": { "version": "5.0.0", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "semver": { "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -58246,7 +63195,6 @@ }, "serialize-javascript": { "version": "6.0.0", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -58254,12 +63202,10 @@ }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "style-loader": { "version": "2.0.0", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", "dev": true, "requires": { "loader-utils": "^2.0.0", @@ -58268,32 +63214,23 @@ }, "supports-color": { "version": "8.1.1", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, "terser": { - "version": "5.9.0", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "version": "5.14.2", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } } }, "terser-webpack-plugin": { "version": "5.2.4", - "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", "dev": true, "requires": { "jest-worker": "^27.0.6", @@ -58306,7 +63243,6 @@ }, "webpack-dev-middleware": { "version": "4.3.0", - "integrity": "sha512-PjwyVY95/bhBh6VUqt6z4THplYcsvQ8YNNBTBM873xLVmw8FLeALn0qurHbs9EmcfhzQis/eoqypSnZeuUz26w==", "dev": true, "requires": { "colorette": "^1.2.2", @@ -58319,19 +63255,52 @@ }, "webpack-virtual-modules": { "version": "0.4.3", - "integrity": "sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw==", "dev": true }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@storybook/mdx1-csf": { + "version": "0.0.1", + "dev": true, + "requires": { + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/preset-env": "^7.12.11", + "@babel/types": "^7.12.11", + "@mdx-js/mdx": "^1.6.22", + "@types/lodash": "^4.14.167", + "js-string-escape": "^1.0.1", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "json5": { + "version": "2.2.3", + "dev": true + }, + "loader-utils": { + "version": "2.0.4", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "prettier": { + "version": "2.3.0", "dev": true } } }, "@storybook/node-logger": { "version": "6.4.22", - "integrity": "sha512-sUXYFqPxiqM7gGH7gBXvO89YEO42nA4gBicJKZjj9e+W4QQLrftjF9l+mAw2K0mVE10Bn7r4pfs5oEZ0aruyyA==", "requires": { "@types/npmlog": "^4.1.2", "chalk": "^4.1.0", @@ -58341,12 +63310,10 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "version": "5.0.1" }, "are-we-there-yet": { "version": "2.0.0", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -58354,7 +63321,6 @@ }, "gauge": { "version": "3.0.2", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "requires": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -58368,12 +63334,10 @@ } }, "is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "version": "3.0.0" }, "npmlog": { "version": "5.0.1", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "requires": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -58383,7 +63347,6 @@ }, "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -58392,7 +63355,6 @@ }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -58401,7 +63363,6 @@ }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } @@ -58410,7 +63371,6 @@ }, "@storybook/postinstall": { "version": "6.4.22", - "integrity": "sha512-LdIvA+l70Mp5FSkawOC16uKocefc+MZLYRHqjTjgr7anubdi6y7W4n9A7/Yw4IstZHoknfL88qDj/uK5N+Ahzw==", "dev": true, "requires": { "core-js": "^3.8.2" @@ -58418,7 +63378,6 @@ }, "@storybook/preview-web": { "version": "6.4.22", - "integrity": "sha512-sWS+sgvwSvcNY83hDtWUUL75O2l2LY/GTAS0Zp2dh3WkObhtuJ/UehftzPZlZmmv7PCwhb4Q3+tZDKzMlFxnKQ==", "requires": { "@storybook/addons": "6.4.22", "@storybook/channel-postmessage": "6.4.22", @@ -58439,8 +63398,7 @@ }, "dependencies": { "qs": { - "version": "6.10.3", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", "requires": { "side-channel": "^1.0.4" } @@ -58449,7 +63407,6 @@ }, "@storybook/react": { "version": "6.4.22", - "integrity": "sha512-5BFxtiguOcePS5Ty/UoH7C6odmvBYIZutfiy4R3Ua6FYmtxac5vP9r5KjCz1IzZKT8mCf4X+PuK1YvDrPPROgQ==", "requires": { "@babel/preset-flow": "^7.12.1", "@babel/preset-react": "^7.12.10", @@ -58479,7 +63436,6 @@ "dependencies": { "@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.4", - "integrity": "sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw==", "requires": { "ansi-html-community": "^0.0.8", "common-path-prefix": "^3.0.0", @@ -58493,8 +63449,7 @@ }, "dependencies": { "loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -58504,12 +63459,10 @@ } }, "acorn": { - "version": "6.4.2", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + "version": "6.4.2" }, "eslint-scope": { "version": "4.0.3", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -58517,55 +63470,43 @@ }, "find-up": { "version": "5.0.0", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "json5": { - "version": "2.2.0", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3" }, "loader-runner": { - "version": "2.4.0", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + "version": "2.4.0" }, "locate-path": { "version": "6.0.0", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { "p-locate": "^5.0.0" } }, "p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { "yocto-queue": "^0.1.0" } }, "p-locate": { "version": "5.0.0", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { "p-limit": "^3.0.2" } }, "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" }, "source-map": { - "version": "0.7.3", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.7.3" }, "terser-webpack-plugin": { "version": "1.4.5", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -58580,7 +63521,6 @@ "dependencies": { "schema-utils": { "version": "1.0.0", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -58588,14 +63528,12 @@ } }, "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "webpack": { "version": "4.46.0", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -58624,7 +63562,6 @@ "dependencies": { "schema-utils": { "version": "1.0.0", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -58635,15 +63572,13 @@ }, "webpack-sources": { "version": "1.4.3", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" }, "dependencies": { "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } } @@ -58651,7 +63586,6 @@ }, "@storybook/react-docgen-typescript-plugin": { "version": "1.0.2-canary.253f8c1.0", - "integrity": "sha512-mmoRG/rNzAiTbh+vGP8d57dfcR2aP+5/Ll03KKFyfy5FqWFm/Gh7u27ikx1I3LmVMI8n6jh5SdWMkMKon7/tDw==", "requires": { "debug": "^4.1.1", "endent": "^2.0.1", @@ -58664,28 +63598,24 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "debug": { "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { "ms": "2.1.2" } }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "find-cache-dir": { "version": "3.3.2", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -58694,91 +63624,76 @@ }, "find-up": { "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "is-number": { - "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "version": "7.0.0" }, "locate-path": { "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "make-dir": { "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { "semver": "^6.0.0" } }, "micromatch": { "version": "4.0.4", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" } }, "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.2" }, "p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" } }, "p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "2.2.0" }, "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" }, "pkg-dir": { "version": "4.2.0", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { "find-up": "^4.0.0" } }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { "is-number": "^7.0.0" } }, "tslib": { - "version": "2.3.1", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.3.1" } } }, "@storybook/router": { "version": "6.4.22", - "integrity": "sha512-zeuE8ZgFhNerQX8sICQYNYL65QEi3okyzw7ynF58Ud6nRw4fMxSOHcj2T+nZCIU5ufozRL4QWD/Rg9P2s/HtLw==", "requires": { "@storybook/client-logger": "6.4.22", "core-js": "^3.8.2", @@ -58795,28 +63710,24 @@ "dependencies": { "history": { "version": "5.0.0", - "integrity": "sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg==", "requires": { "@babel/runtime": "^7.7.6" } }, "qs": { - "version": "6.10.3", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", "requires": { "side-channel": "^1.0.4" } }, "react-router": { "version": "6.3.0", - "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", "requires": { "history": "^5.2.0" }, "dependencies": { "history": { "version": "5.3.0", - "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", "requires": { "@babel/runtime": "^7.7.6" } @@ -58825,7 +63736,6 @@ }, "react-router-dom": { "version": "6.3.0", - "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", "requires": { "history": "^5.2.0", "react-router": "6.3.0" @@ -58833,7 +63743,6 @@ "dependencies": { "history": { "version": "5.3.0", - "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", "requires": { "@babel/runtime": "^7.7.6" } @@ -58844,7 +63753,6 @@ }, "@storybook/semver": { "version": "7.3.2", - "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", "requires": { "core-js": "^3.6.5", "find-up": "^4.1.0" @@ -58852,7 +63760,6 @@ "dependencies": { "find-up": { "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -58860,38 +63767,32 @@ }, "locate-path": { "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" } }, "p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "2.2.0" }, "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" } } }, "@storybook/source-loader": { "version": "6.4.22", - "integrity": "sha512-O4RxqPgRyOgAhssS6q1Rtc8LiOvPBpC1EqhCYWRV3K+D2EjFarfQMpjgPj18hC+QzpUSfzoBZYqsMECewEuLNw==", "dev": true, "requires": { "@storybook/addons": "6.4.22", @@ -58908,17 +63809,14 @@ "dependencies": { "estraverse": { "version": "5.3.0", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", "dev": true }, "loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", "dev": true, "requires": { "big.js": "^5.2.2", @@ -58928,14 +63826,12 @@ }, "prettier": { "version": "2.3.0", - "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", "dev": true } } }, "@storybook/store": { "version": "6.4.22", - "integrity": "sha512-lrmcZtYJLc2emO+1l6AG4Txm9445K6Pyv9cGAuhOJ9Kks0aYe0YtvMkZVVry0RNNAIv6Ypz72zyKc/QK+tZLAQ==", "requires": { "@storybook/addons": "6.4.22", "@storybook/client-logger": "6.4.22", @@ -58955,14 +63851,12 @@ }, "dependencies": { "slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "version": "3.0.0" } } }, "@storybook/theming": { "version": "6.4.22", - "integrity": "sha512-NVMKH/jxSPtnMTO4VCN1k47uztq+u9fWv4GSnzq/eezxdGg9ceGL4/lCrNGoNajht9xbrsZ4QvsJ/V2sVGM8wA==", "requires": { "@emotion/core": "^10.1.1", "@emotion/is-prop-valid": "^0.8.6", @@ -58980,7 +63874,6 @@ "dependencies": { "@emotion/styled": { "version": "10.0.27", - "integrity": "sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q==", "requires": { "@emotion/styled-base": "^10.0.27", "babel-plugin-emotion": "^10.0.27" @@ -58988,20 +63881,17 @@ }, "polished": { "version": "4.1.3", - "integrity": "sha512-ocPAcVBUOryJEKe0z2KLd1l9EBa1r5mSwlKpExmrLzsnIzJo4axsoU9O2BjOTkDGDT4mZ0WFE5XKTlR3nLnZOA==", "requires": { "@babel/runtime": "^7.14.0" } }, "resolve-from": { - "version": "5.0.0", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + "version": "5.0.0" } } }, "@storybook/ui": { "version": "6.4.22", - "integrity": "sha512-UVjMoyVsqPr+mkS1L7m30O/xrdIEgZ5SCWsvqhmyMUok3F3tRB+6M+OA5Yy+cIVfvObpA7MhxirUT1elCGXsWQ==", "requires": { "@emotion/core": "^10.1.1", "@storybook/addons": "6.4.22", @@ -59034,26 +63924,22 @@ }, "dependencies": { "fuse.js": { - "version": "3.6.1", - "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==" + "version": "3.6.1" }, "polished": { "version": "4.2.2", - "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", "requires": { "@babel/runtime": "^7.17.8" } }, "qs": { - "version": "6.10.3", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", "requires": { "side-channel": "^1.0.4" } }, "resolve-from": { - "version": "5.0.0", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + "version": "5.0.0" } } }, @@ -59079,6 +63965,7 @@ "@types/d3-time-format": "^2.1.0", "@types/enzyme": "^3.10.5", "@types/fetch-mock": "^7.3.3", + "@types/json-bigint": "^1.0.1", "@types/lodash": "^4.14.149", "@types/math-expression-evaluator": "^1.2.1", "@types/node": "^18.0.0", @@ -59111,30 +63998,16 @@ }, "dependencies": { "@types/d3-time": { - "version": "3.0.0", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" - }, - "@vx/responsive": { - "version": "0.0.199", - "integrity": "sha512-ONrmLUAG+8wzD3cn/EmsuZh6JHeyejqup3ZsV25t04VaVJAVQAJukAfNdH8YiwSJu0zSo+txkBTfrnOmFyQLOw==", - "requires": { - "@types/lodash": "^4.14.146", - "@types/react": "*", - "lodash": "^4.17.10", - "prop-types": "^15.6.1", - "resize-observer-polyfill": "1.5.1" - } + "version": "3.0.0" }, "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } }, "d3-scale": { "version": "3.3.0", - "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", "requires": { "d3-array": "^2.3.0", "d3-format": "1 - 2", @@ -59145,7 +64018,6 @@ "dependencies": { "d3-time": { "version": "2.1.1", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", "requires": { "d3-array": "2" } @@ -59154,7 +64026,6 @@ }, "fetch-mock": { "version": "6.5.2", - "integrity": "sha512-EIvbpCLBTYyDLu4HJiqD7wC8psDwTUaPaWXNKZbhNO/peUYKiNp5PkZGKRJtnTxaPQu71ivqafvjpM7aL+MofQ==", "dev": true, "requires": { "babel-polyfill": "^6.26.0", @@ -59164,7 +64035,6 @@ }, "jest-mock-console": { "version": "1.2.3", - "integrity": "sha512-q4jfuHW3V3tYzwtKTF6nxjRNriUC2/D2SVfxW88lNeG1qO1mVarBUqgOAvZjTEmxuTsjzGlHQsDIgvlOZaLccg==", "dev": true } } @@ -59184,7 +64054,7 @@ "@storybook/addons": "^6.3.12", "@storybook/react": "^6.3.12", "@types/react-loadable": "^5.5.3", - "antd": "^4.9.4", + "antd": "4.10.3", "babel-loader": "^8.1.0", "bootstrap": "^3.4.1", "chromatic": "^5.4.0", @@ -59203,9 +64073,12 @@ "typescript": "^4.5.4" }, "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "dev": true + }, "ansi-styles": { "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -59213,19 +64086,76 @@ }, "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" } }, + "chromatic": { + "version": "5.10.2", + "dev": true, + "requires": { + "@actions/core": "^1.5.0", + "@actions/github": "^5.0.0", + "@babel/preset-typescript": "^7.15.0", + "@babel/runtime": "^7.15.3", + "@chromaui/localtunnel": "^2.0.3", + "async-retry": "^1.3.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "dotenv": "^8.2.0", + "env-ci": "^5.0.2", + "esm": "^3.2.25", + "execa": "^5.0.0", + "fake-tag": "^2.0.0", + "fs-extra": "^10.0.0", + "https-proxy-agent": "^5.0.0", + "jsonfile": "^6.0.1", + "junit-report-builder": "2.1.0", + "listr": "0.14.3", + "meow": "^8.0.0", + "no-proxy": "^1.0.3", + "node-ask": "^1.0.1", + "node-fetch": "2.6.0", + "node-loggly-bulk": "^2.2.4", + "p-limit": "3.1.0", + "picomatch": "2.2.2", + "pkg-up": "^3.1.0", + "pluralize": "^8.0.0", + "progress-stream": "^2.0.0", + "semver": "^7.3.5", + "slash": "^3.0.0", + "string-argv": "^0.3.1", + "strip-ansi": "6.0.0", + "tmp-promise": "3.0.2", + "tree-kill": "^1.2.2", + "ts-dedent": "^1.0.0", + "util-deprecate": "^1.0.2", + "uuid": "^8.3.2", + "yarn-or-npm": "^3.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "picomatch": { + "version": "2.2.2", + "dev": true + } + } + }, "core-js": { - "version": "3.8.3", - "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==" + "version": "3.8.3" }, "cosmiconfig": { "version": "6.0.0", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", @@ -59235,22 +64165,57 @@ "yaml": "^1.7.2" } }, + "cross-spawn": { + "version": "7.0.3", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "deepmerge": { "version": "4.2.2", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, + "execa": { + "version": "5.1.1", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "3.0.0", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "fork-ts-checker-webpack-plugin": { "version": "5.2.1", - "integrity": "sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", @@ -59268,7 +64233,6 @@ }, "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -59277,14 +64241,32 @@ "universalify": "^2.0.0" } }, + "get-stream": { + "version": "6.0.1", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "dev": true + }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-stream": { + "version": "2.0.1", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -59292,16 +64274,56 @@ }, "micromatch": { "version": "4.0.4", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" } }, + "ms": { + "version": "2.1.2", + "dev": true + }, + "node-fetch": { + "version": "2.6.0", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "3.0.0", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "p-try": { + "version": "2.2.0", + "dev": true + }, "parse-json": { "version": "5.2.0", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -59310,14 +64332,23 @@ "lines-and-columns": "^1.1.6" } }, + "path-key": { + "version": "3.1.1", + "dev": true + }, "path-type": { "version": "4.0.0", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pkg-up": { + "version": "3.1.0", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "schema-utils": { "version": "2.7.0", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dev": true, "requires": { "@types/json-schema": "^7.0.4", @@ -59327,15 +64358,35 @@ }, "semver": { "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, + "shebang-command": { + "version": "2.0.0", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, "supports-color": { "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -59343,15 +64394,17 @@ }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" } }, + "ts-dedent": { + "version": "1.2.0", + "dev": true + }, "ts-loader": { "version": "7.0.5", - "integrity": "sha512-zXypEIT6k3oTc+OZNx/cqElrsbBtYqDknf48OZos0NQ3RTt045fBIU8RRSu+suObBzYB355aIPGOe/3kj9h7Ig==", "dev": true, "requires": { "chalk": "^2.3.0", @@ -59363,7 +64416,6 @@ "dependencies": { "chalk": { "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -59373,14 +64425,23 @@ }, "semver": { "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, + "uuid": { + "version": "8.3.2", + "dev": true + }, + "which": { + "version": "2.0.2", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } @@ -59392,7 +64453,7 @@ "fs-extra": "^10.0.0", "lodash": "^4.17.11", "yeoman-assert": "^3.1.0", - "yeoman-generator": "^4.0.0", + "yeoman-generator": "^5.7.0", "yeoman-test": "^6.2.0", "yosay": "^2.0.2" } @@ -59408,7 +64469,6 @@ "dependencies": { "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } @@ -59433,7 +64493,6 @@ "dependencies": { "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } @@ -59469,7 +64528,6 @@ "dependencies": { "@vx/group": { "version": "0.0.198", - "integrity": "sha512-0PivE+fWZlPkSzFO/is5m4VSSv3pg+sS1yxYAZHbNffUvn472WDWptriHvoUIPQe0lOXhTSrc73UQzew9GtW/g==", "requires": { "@types/classnames": "^2.2.9", "@types/react": "*", @@ -59479,7 +64537,6 @@ }, "@vx/legend": { "version": "0.0.198", - "integrity": "sha512-3S2/yP6IvkkhUlTj6In5M1OrzY1OaT1D06hRxuiOLAbaXTerhbUGwIjGSNoovQM6JebFlbWnnA5xH1SKgw5GGA==", "requires": { "@types/classnames": "^2.2.9", "@types/d3-scale": "^2.1.1", @@ -59489,20 +64546,8 @@ "prop-types": "^15.5.10" } }, - "@vx/responsive": { - "version": "0.0.199", - "integrity": "sha512-ONrmLUAG+8wzD3cn/EmsuZh6JHeyejqup3ZsV25t04VaVJAVQAJukAfNdH8YiwSJu0zSo+txkBTfrnOmFyQLOw==", - "requires": { - "@types/lodash": "^4.14.146", - "@types/react": "*", - "lodash": "^4.17.10", - "prop-types": "^15.6.1", - "resize-observer-polyfill": "1.5.1" - } - }, "@vx/scale": { "version": "0.0.197", - "integrity": "sha512-FF0POm9rh66I3Om5DsuxynwWU+Q645aTF47vgP2dVDeOOq3Oet7CZzmXLDh3W6nVcxvzq1UdPwu94dto2PUfhg==", "requires": { "@types/d3-scale": "^2.1.1", "d3-scale": "^2.2.2" @@ -59520,14 +64565,12 @@ "dependencies": { "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } }, "d3-scale": { "version": "3.3.0", - "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", "requires": { "d3-array": "^2.3.0", "d3-format": "1 - 2", @@ -59538,7 +64581,6 @@ }, "d3-time": { "version": "2.1.1", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", "requires": { "d3-array": "2" } @@ -59549,7 +64591,7 @@ "version": "file:plugins/legacy-plugin-chart-map-box", "requires": { "prop-types": "^15.6.2", - "react-map-gl": "^4.0.10", + "react-map-gl": "^6.1.19", "supercluster": "^4.1.1", "viewport-mercator-project": "^6.1.1" } @@ -59636,7 +64678,6 @@ "dependencies": { "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } @@ -59660,14 +64701,13 @@ "mousetrap": "^1.6.1", "prop-types": "^15.6.0", "react-bootstrap-slider": "2.1.5", - "underscore": "^1.8.3", + "underscore": "^1.12.1", "urijs": "^1.19.8", "xss": "^1.0.10" }, "dependencies": { "d3-scale": { "version": "3.3.0", - "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", "requires": { "d3-array": "^2.3.0", "d3-format": "1 - 2", @@ -59678,7 +64718,6 @@ "dependencies": { "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } @@ -59687,14 +64726,12 @@ }, "d3-time": { "version": "2.1.1", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", "requires": { "d3-array": "2" }, "dependencies": { "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } @@ -59722,7 +64759,7 @@ "version": "file:plugins/plugin-chart-echarts", "requires": { "d3-array": "^1.2.0", - "echarts": "^5.3.2", + "echarts": "^5.4.1", "lodash": "^4.17.15", "moment": "^2.26.0" } @@ -59733,7 +64770,13 @@ "@types/jest": "^26.0.0", "@types/lodash": "^4.14.149", "handlebars": "^4.7.7", - "jest": "^26.0.1" + "jest": "^26.0.1", + "just-handlebars-helpers": "^1.0.19" + }, + "dependencies": { + "just-handlebars-helpers": { + "version": "1.0.19" + } } }, "@superset-ui/plugin-chart-pivot-table": { @@ -59748,9 +64791,11 @@ "version": "file:plugins/plugin-chart-table", "requires": { "@react-icons/all-files": "^4.1.0", + "@testing-library/react": "^11.2.0", "@types/d3-array": "^2.9.0", "@types/enzyme": "^3.10.5", "@types/react-table": "^7.0.29", + "classnames": "^2.3.2", "d3-array": "^2.4.0", "match-sorter": "^6.3.0", "memoize-one": "^5.1.1", @@ -59761,7 +64806,6 @@ "dependencies": { "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } @@ -59780,14 +64824,12 @@ "dependencies": { "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } }, "d3-scale": { "version": "3.3.0", - "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", "requires": { "d3-array": "^2.3.0", "d3-format": "1 - 2", @@ -59798,7 +64840,6 @@ }, "d3-time": { "version": "2.1.1", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", "requires": { "d3-array": "2" } @@ -59821,7 +64862,6 @@ "dependencies": { "@vx/axis": { "version": "0.0.198", - "integrity": "sha512-XqHzGOBgkJD8gR1g9F7uOhT4Sjlwpl/H3xLehtDooRmKf3J0hy8C7L5rCgh7n8ARi+vYg+3A1zUo0JBIO5k4PQ==", "requires": { "@types/classnames": "^2.2.9", "@types/react": "*", @@ -59835,7 +64875,6 @@ }, "@vx/curve": { "version": "0.0.198", - "integrity": "sha512-ZINtD0t5eLu3bEeaOWZxGXrHK5WCbGoxDdou7yPWD6xg8kpTD4/Vq0adRFNCxS1TZUlUjCJ2KqY2PmewO+Hdcw==", "requires": { "@types/d3-shape": "^1.3.1", "d3-shape": "^1.0.6" @@ -59843,7 +64882,6 @@ }, "@vx/group": { "version": "0.0.198", - "integrity": "sha512-0PivE+fWZlPkSzFO/is5m4VSSv3pg+sS1yxYAZHbNffUvn472WDWptriHvoUIPQe0lOXhTSrc73UQzew9GtW/g==", "requires": { "@types/classnames": "^2.2.9", "@types/react": "*", @@ -59853,7 +64891,6 @@ }, "@vx/legend": { "version": "0.0.198", - "integrity": "sha512-3S2/yP6IvkkhUlTj6In5M1OrzY1OaT1D06hRxuiOLAbaXTerhbUGwIjGSNoovQM6JebFlbWnnA5xH1SKgw5GGA==", "requires": { "@types/classnames": "^2.2.9", "@types/d3-scale": "^2.1.1", @@ -59864,12 +64901,10 @@ } }, "@vx/point": { - "version": "0.0.198", - "integrity": "sha512-oFlw8uBLf4JDX7OJc+7eQXcnlLszdQgEs531u0t6HNpARQY/jTeeMLVUlp8sNF0XBOC+iVHU8Qe8TJdz/ONBAA==" + "version": "0.0.198" }, "@vx/scale": { "version": "0.0.197", - "integrity": "sha512-FF0POm9rh66I3Om5DsuxynwWU+Q645aTF47vgP2dVDeOOq3Oet7CZzmXLDh3W6nVcxvzq1UdPwu94dto2PUfhg==", "requires": { "@types/d3-scale": "^2.1.1", "d3-scale": "^2.2.2" @@ -59877,7 +64912,6 @@ }, "@vx/shape": { "version": "0.0.198", - "integrity": "sha512-3Ky2PlSXYmh/Wt+tT4OBmsLpTe8Vu5pZ1EwbMQ0H/NNl6d4BsNqBUzr++0WC/kLsuNs5NENDvG77N9u2ztMrYA==", "requires": { "@types/classnames": "^2.2.9", "@types/d3-path": "^1.0.8", @@ -59893,7 +64927,6 @@ }, "@vx/text": { "version": "0.0.198", - "integrity": "sha512-MZhLeIhjbPlAeq+heUFXzrAztkjpfhAjeg+RXDg1dTJTtkbBD0w1bwadSPHuC7Rzj6yNQChzVDYl51dO/k4ExQ==", "requires": { "@types/classnames": "^2.2.9", "@types/lodash": "^4.14.146", @@ -59911,47 +64944,38 @@ }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "5.4.0", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", "dev": true }, "@svgr/babel-plugin-remove-jsx-attribute": { "version": "5.4.0", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", "dev": true }, "@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "5.0.1", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", "dev": true }, "@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "5.0.1", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", "dev": true }, "@svgr/babel-plugin-svg-dynamic-title": { "version": "5.4.0", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", "dev": true }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "5.4.0", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", "dev": true }, "@svgr/babel-plugin-transform-react-native-svg": { "version": "5.4.0", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", "dev": true }, "@svgr/babel-plugin-transform-svg-component": { "version": "5.5.0", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", "dev": true }, "@svgr/babel-preset": { "version": "5.5.0", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", "dev": true, "requires": { "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", @@ -59966,7 +64990,6 @@ }, "@svgr/core": { "version": "5.5.0", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", "dev": true, "requires": { "@svgr/plugin-jsx": "^5.5.0", @@ -59976,14 +64999,12 @@ "dependencies": { "camelcase": { "version": "6.2.0", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true } } }, "@svgr/hast-util-to-babel-ast": { "version": "5.5.0", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", "dev": true, "requires": { "@babel/types": "^7.12.6" @@ -59991,7 +65012,6 @@ }, "@svgr/plugin-jsx": { "version": "5.5.0", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", "dev": true, "requires": { "@babel/core": "^7.12.3", @@ -60002,7 +65022,6 @@ }, "@svgr/plugin-svgo": { "version": "5.5.0", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", "dev": true, "requires": { "cosmiconfig": "^7.0.0", @@ -60012,14 +65031,12 @@ "dependencies": { "deepmerge": { "version": "4.2.2", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true } } }, "@svgr/webpack": { "version": "5.5.0", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", "dev": true, "requires": { "@babel/core": "^7.12.3", @@ -60033,16 +65050,11 @@ }, "dependencies": { "json5": { - "version": "2.1.3", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "dev": true }, "loader-utils": { - "version": "2.0.0", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.4", "dev": true, "requires": { "big.js": "^5.2.2", @@ -60054,7 +65066,6 @@ }, "@testing-library/dom": { "version": "7.29.4", - "integrity": "sha512-CtrJRiSYEfbtNGtEsd78mk1n1v2TUbeABlNIcOCJdDfkN5/JTOwQEbbQpoSRxGqzcWPgStMvJ4mNolSuBRv1NA==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", @@ -60069,7 +65080,6 @@ }, "@testing-library/jest-dom": { "version": "5.11.6", - "integrity": "sha512-cVZyUNRWwUKI0++yepYpYX7uhrP398I+tGz4zOlLVlUYnZS+Svuxv4fwLeCIy7TnBYKXUaOlQr3vopxL8ZfEnA==", "dev": true, "requires": { "@babel/runtime": "^7.9.2", @@ -60084,7 +65094,6 @@ "dependencies": { "chalk": { "version": "3.0.0", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -60095,7 +65104,6 @@ }, "@testing-library/react": { "version": "11.2.0", - "integrity": "sha512-90xKYJzskZ7q/AoSuWraQL4EGZlr75uZvDt3nrO4M+rugN02zjO45tmOBq/JBOgDiMIL1tkhHioKXjJsVaSINA==", "dev": true, "requires": { "@babel/runtime": "^7.12.5", @@ -60104,7 +65112,6 @@ }, "@testing-library/react-hooks": { "version": "5.0.3", - "integrity": "sha512-UrnnRc5II7LMH14xsYNm/WRch/67cBafmrSQcyFh0v+UUmSf1uzfB7zn5jQXSettGwOSxJwdQUN7PgkT0w22Lg==", "dev": true, "requires": { "@babel/runtime": "^7.12.5", @@ -60117,7 +65124,6 @@ "dependencies": { "react-error-boundary": { "version": "3.1.0", - "integrity": "sha512-lmPrdi5SLRJR+AeJkqdkGlW/CRkAUvZnETahK58J4xb5wpbfDngasEGu+w0T1iXEhVrYBJZeW+c4V1hILCnMWQ==", "dev": true, "requires": { "@babel/runtime": "^7.12.5" @@ -60127,7 +65133,6 @@ }, "@testing-library/user-event": { "version": "12.7.0", - "integrity": "sha512-KzRM1KNDoW8pJ2HTenrUhTjV6wJMHvWAagDs8DDrYSWz6y4PN+K2jSvlm2bMHWNRk5LTJPo9jqIjNjJ3FlqXNw==", "dev": true, "requires": { "@babel/runtime": "^7.12.5" @@ -60135,22 +65140,18 @@ }, "@tootallnate/once": { "version": "1.1.2", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, "@trysound/sax": { "version": "0.1.1", - "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==", "dev": true }, "@types/aria-query": { "version": "4.2.0", - "integrity": "sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A==", "dev": true }, "@types/babel__core": { "version": "7.1.9", - "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -60162,7 +65163,6 @@ }, "@types/babel__generator": { "version": "7.6.1", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", "dev": true, "requires": { "@babel/types": "^7.0.0" @@ -60170,7 +65170,6 @@ }, "@types/babel__template": { "version": "7.0.2", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -60179,104 +65178,118 @@ }, "@types/babel__traverse": { "version": "7.0.12", - "integrity": "sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, + "@types/base16": { + "version": "1.0.2" + }, + "@types/body-parser": { + "version": "1.19.2", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/cheerio": { "version": "0.22.21", - "integrity": "sha512-aGI3DfswwqgKPiEOTaiHV2ZPC9KEhprpgEbJnv0fZl3SGX0cGgEva1126dGrMC6AJM6v/aihlUgJn9M5DbDZ/Q==", "requires": { "@types/node": "*" } }, "@types/classnames": { - "version": "2.2.10", - "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==" + "version": "2.2.10" }, "@types/color-convert": { "version": "2.0.0", - "integrity": "sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==", "requires": { "@types/color-name": "*" } }, "@types/color-name": { - "version": "1.1.1", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + "version": "1.1.1" + }, + "@types/connect": { + "version": "3.4.35", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } }, "@types/d3": { - "version": "3.5.38", - "integrity": "sha512-O/gRkjWULp3xVX8K85V0H3tsSGole0WYt77KVpGZO2xTGLuVFuvE6JIsIli3fvFHCYBhGFn/8OHEEyMYF+QehA==" + "version": "3.5.38" }, "@types/d3-array": { - "version": "2.9.0", - "integrity": "sha512-sdBMGfNvLUkBypPMEhOcKcblTQfgHbqbYrUqRE31jOwdDHBJBxz4co2MDAq93S4Cp++phk4UiwoEg/1hK3xXAQ==" + "version": "2.9.0" }, "@types/d3-cloud": { "version": "1.2.5", - "integrity": "sha512-vEIER9DsEBUOdpRiwCh3n1qE+cV6h4e1LhxhY2sLt+m8LPNAIkOOhTlqk0JDiBwD+ZPM8ynFAOU3AuPuVYBFBA==", "requires": { "@types/d3": "^3" } }, "@types/d3-color": { - "version": "1.4.2", - "integrity": "sha512-fYtiVLBYy7VQX+Kx7wU/uOIkGQn8aAEY8oWMoyja3N4dLd8Yf6XgSIR/4yWvMuveNOH5VShnqCgRqqh/UNanBA==" + "version": "1.4.2" }, "@types/d3-format": { - "version": "1.4.2", - "integrity": "sha512-WeGCHAs7PHdZYq6lwl/+jsl+Nfc1J2W1kNcMeIMYzQsT6mtBDBgtJ/rcdjZ0k0rVIvqEZqhhuD5TK/v3P2gFHQ==" + "version": "1.4.2" }, "@types/d3-interpolate": { "version": "1.4.2", - "integrity": "sha512-ylycts6llFf8yAEs1tXzx2loxxzDZHseuhPokrqKprTQSTcD3JbJI1omZP1rphsELZO3Q+of3ff0ZS7+O6yVzg==", "requires": { "@types/d3-color": "^1" } }, "@types/d3-path": { - "version": "1.0.9", - "integrity": "sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==" + "version": "1.0.9" }, "@types/d3-scale": { "version": "2.2.6", - "integrity": "sha512-CHu34T5bGrJOeuhGxyiz9Xvaa9PlsIaQoOqjDg7zqeGj2x0rwPhGquiy03unigvcMxmvY0hEaAouT0LOFTLpIw==", "requires": { "@types/d3-time": "^1" } }, "@types/d3-scale-chromatic": { - "version": "1.5.1", - "integrity": "sha512-7FtJYrmXTEWLykShjYhoGuDNR/Bda0+tstZMkFj4RRxUEryv16AGh3be21tqg84B6KfEwiZyEpBcTyPyU+GWjg==" + "version": "1.5.1" }, "@types/d3-shape": { "version": "1.3.8", - "integrity": "sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==", "requires": { "@types/d3-path": "^1" } }, "@types/d3-time": { - "version": "1.1.1", - "integrity": "sha512-ULX7LoqXTCYtM+tLYOaeAJK7IwCT+4Gxlm2MaH0ErKLi07R5lh8NHCAyWcDkCCmx1AfRcBEV6H9QE9R25uP7jw==" + "version": "1.1.1" }, "@types/d3-time-format": { - "version": "2.3.1", - "integrity": "sha512-fck0Z9RGfIQn3GJIEKVrp15h9m6Vlg0d5XXeiE/6+CQiBmMDZxfR21XtjEPuDeg7gC3bBM0SdieA5XF3GW1wKA==" + "version": "2.3.1" }, "@types/debug": { "version": "4.1.7", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", "requires": { "@types/ms": "*" } }, "@types/enzyme": { "version": "3.10.10", - "integrity": "sha512-/D4wFhiEjUDfPu+j5FVK0g/jf7rqeEIpNfAI+kyxzLpw5CKO0drnW3W5NC38alIjsWgnyQ8pbuPF5+UD+vhVyg==", "requires": { "@types/cheerio": "*", "@types/react": "*" @@ -60284,7 +65297,6 @@ }, "@types/enzyme-adapter-react-16": { "version": "1.0.6", - "integrity": "sha512-VonDkZ15jzqDWL8mPFIQnnLtjwebuL9YnDkqeCDYnB4IVgwUm0mwKkqhrxLL6mb05xm7qqa3IE95m8CZE9imCg==", "dev": true, "requires": { "@types/enzyme": "*" @@ -60292,7 +65304,6 @@ }, "@types/eslint": { "version": "7.28.0", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", "dev": true, "requires": { "@types/estree": "*", @@ -60301,7 +65312,6 @@ }, "@types/eslint-scope": { "version": "3.7.1", - "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", "dev": true, "requires": { "@types/eslint": "*", @@ -60310,24 +65320,38 @@ }, "@types/estree": { "version": "0.0.50", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, + "@types/express": { + "version": "4.17.13", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.30", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "@types/fetch-mock": { - "version": "7.3.5", - "integrity": "sha512-sLecm9ohBdGIpYUP9rWk5/XIKY2xHMYTBJIcJuBBM8IJWnYoQ1DAj8F4OVjnfD0API1drlkWEV0LPNk+ACuhsg==" + "version": "7.3.5" }, "@types/flatbuffers": { - "version": "1.10.0", - "integrity": "sha512-7btbphLrKvo5yl/5CC2OCxUSMx1wV1wvGT1qDXkSt7yi00/YW7E8k6qzXqJHsp+WU0eoG7r6MTQQXI9lIvd0qA==" + "version": "1.10.0" }, "@types/geojson": { - "version": "7946.0.8", - "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==" + "version": "7946.0.8" }, "@types/glob": { "version": "7.1.4", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", "requires": { "@types/minimatch": "*", "@types/node": "*" @@ -60335,7 +65359,6 @@ }, "@types/graceful-fs": { "version": "4.1.3", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", "dev": true, "requires": { "@types/node": "*" @@ -60343,47 +65366,39 @@ }, "@types/hast": { "version": "2.3.1", - "integrity": "sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q==", "requires": { "@types/unist": "*" } }, "@types/history": { - "version": "4.7.6", - "integrity": "sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w==", + "version": "4.7.11", "dev": true }, "@types/hoist-non-react-statics": { "version": "3.3.1", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", "requires": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" } }, "@types/html-minifier-terser": { - "version": "5.1.1", - "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" + "version": "5.1.1" }, "@types/http-proxy": { - "version": "1.17.7", - "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "version": "1.17.9", "dev": true, "requires": { "@types/node": "*" } }, "@types/is-function": { - "version": "1.0.1", - "integrity": "sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==" + "version": "1.0.1" }, "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + "version": "2.0.3" }, "@types/istanbul-lib-report": { "version": "3.0.0", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "*" @@ -60391,7 +65406,6 @@ }, "@types/istanbul-reports": { "version": "1.1.2", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "*", @@ -60400,7 +65414,6 @@ }, "@types/jest": { "version": "26.0.23", - "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", "dev": true, "requires": { "jest-diff": "^26.0.0", @@ -60409,7 +65422,6 @@ }, "@types/jquery": { "version": "3.5.9", - "integrity": "sha512-B8pDk+sH/tSv/HKdx6EQER6BfUOb2GtKs0LOmozziS4h7cbe8u/eYySfUAeTwD+J09SqV3man7AMWIA5mgzCBA==", "dev": true, "requires": { "@types/sizzle": "*" @@ -60417,65 +65429,61 @@ }, "@types/js-levenshtein": { "version": "1.1.0", - "integrity": "sha512-14t0v1ICYRtRVcHASzes0v/O+TIeASb8aD55cWF1PidtInhFWSXcmhzhHqGjUWf9SUq1w70cvd1cWKUULubAfQ==", "dev": true }, "@types/json-bigint": { - "version": "1.0.0", - "integrity": "sha512-WW+0cfH3ovFN6ROV+p/Xfw36dT6s16hbXBYIG49PYw6+j6e+AkpqYccctgxwyicBmC8CZDBnPhOH94shFhXgHQ==", - "dev": true + "version": "1.0.1" }, "@types/json-schema": { - "version": "7.0.9", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + "version": "7.0.9" }, "@types/json5": { "version": "0.0.29", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/lodash": { - "version": "4.14.149", - "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==" + "version": "4.14.182" }, "@types/lodash.get": { "version": "4.4.6", - "integrity": "sha512-E6zzjR3GtNig8UJG/yodBeJeIOtgPkMgsLjDU3CbgCAPC++vJ0eCMnJhVpRZb/ENqEFlov1+3K9TKtY4UdWKtQ==", "requires": { "@types/lodash": "*" } }, + "@types/mapbox-gl": { + "version": "2.7.6", + "requires": { + "@types/geojson": "*" + } + }, "@types/math-expression-evaluator": { - "version": "1.2.1", - "integrity": "sha512-H6IG9R0jU16nR3N24UpL7X40aDcUl5eTncBSd/itwz6rWI4nNzMcNYreHj0MnKlHSga1Iq1AqjSuY67EhiN+Zw==" + "version": "1.2.1" }, "@types/mdast": { "version": "3.0.10", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", "requires": { "@types/unist": "*" } }, + "@types/mime": { + "version": "3.0.1", + "dev": true + }, "@types/minimatch": { - "version": "3.0.5", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + "version": "3.0.5" }, "@types/minimist": { "version": "1.2.2", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, "@types/ms": { - "version": "0.7.31", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + "version": "0.7.31" }, "@types/node": { - "version": "18.0.0", - "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==" + "version": "18.0.0" }, "@types/node-fetch": { - "version": "2.6.1", - "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", + "version": "2.6.2", "requires": { "@types/node": "*", "form-data": "^3.0.0" @@ -60483,7 +65491,6 @@ "dependencies": { "form-data": { "version": "3.0.1", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -60493,50 +65500,43 @@ } }, "@types/normalize-package-data": { - "version": "2.4.0", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + "version": "2.4.0" }, "@types/npmlog": { - "version": "4.1.4", - "integrity": "sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==" + "version": "4.1.4" }, "@types/overlayscrollbars": { - "version": "1.12.1", - "integrity": "sha512-V25YHbSoKQN35UasHf0EKD9U2vcmexRSp78qa8UglxFH8H3D+adEa9zGZwrqpH4TdvqeMrgMqVqsLB4woAryrQ==" + "version": "1.12.1" }, "@types/parse-json": { - "version": "4.0.0", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "version": "4.0.0" }, "@types/parse5": { - "version": "5.0.3", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + "version": "5.0.3" }, "@types/prettier": { "version": "2.1.5", - "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", "dev": true }, "@types/pretty-hrtime": { - "version": "1.0.1", - "integrity": "sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==" + "version": "1.0.1" }, "@types/prop-types": { - "version": "15.7.4", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" + "version": "15.7.5" }, "@types/q": { "version": "1.5.2", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "dev": true }, "@types/qs": { - "version": "6.9.7", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + "version": "6.9.7" + }, + "@types/range-parser": { + "version": "1.2.4", + "dev": true }, "@types/react": { "version": "16.9.43", - "integrity": "sha512-PxshAFcnJqIWYpJbLPriClH53Z2WlJcVZE+NP2etUtWQs2s7yIMj3/LDKZT/5CHJ/F62iyjVCDu2H3jHEXIxSg==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" @@ -60544,7 +65544,6 @@ }, "@types/react-dom": { "version": "16.9.8", - "integrity": "sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==", "dev": true, "requires": { "@types/react": "*" @@ -60552,7 +65551,6 @@ }, "@types/react-gravatar": { "version": "2.6.8", - "integrity": "sha512-VMk0bF0w72l+opBm+EqLs0JqUG+hPowMBWCVGrbTwUWm/oDncvwNrf7P/ImwYwkTCKiLnU8Rc+/lyhehaIE/Rw==", "dev": true, "requires": { "@types/react": "*" @@ -60560,7 +65558,6 @@ }, "@types/react-json-tree": { "version": "0.6.11", - "integrity": "sha512-HP0Sf0ZHjCi1FHLJxh/pLaxaevEW6ILlV2C5Dn3EZFTkLjWkv+EVf/l/zvtmoU9ZwuO/3TKVeWK/700UDxunTw==", "dev": true, "requires": { "@types/react": "*" @@ -60568,7 +65565,6 @@ }, "@types/react-jsonschema-form": { "version": "1.7.4", - "integrity": "sha512-TSsntIuB8bfheC/ZpjUmgB6+m5cLR4Gbh8rnqpSYB6T4e2TwzNICuKC5AykZI0XTxqLJmShyVsJxuo4aih64Gw==", "dev": true, "requires": { "@types/json-schema": "*", @@ -60577,16 +65573,13 @@ }, "@types/react-loadable": { "version": "5.5.6", - "integrity": "sha512-2M7xH/wawZxNybbs/a76JkpUsMk4z6AxBh92cUtIBy2vK7EYYuitQbC4laY0hGz0e05R+mQ44YeHMtH2U+gMsw==", "requires": { "@types/react": "*", "@types/webpack": "^4" } }, "@types/react-redux": { - "version": "7.1.10", - "integrity": "sha512-lmt2BPf0fFuYrXg1JM4udUd4sCmqnTlNUIxC7B6RIBTzmMuv/MxOfumGNUx1UyzVZieEZ2ttCQvFfh/3eUHvrQ==", - "dev": true, + "version": "7.1.25", "requires": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -60596,7 +65589,6 @@ }, "@types/react-router": { "version": "5.1.8", - "integrity": "sha512-HzOyJb+wFmyEhyfp4D4NYrumi+LQgQL/68HvJO+q6XtuHSDvw6Aqov7sCAhjbNq3bUPgPqbdvjXC5HeB2oEAPg==", "dev": true, "requires": { "@types/history": "*", @@ -60604,18 +65596,16 @@ } }, "@types/react-router-dom": { - "version": "5.1.5", - "integrity": "sha512-ArBM4B1g3BWLGbaGvwBGO75GNFbLDUthrDojV2vHLih/Tq8M+tgvY1DSwkuNrPSwdp/GUL93WSEpTZs8nVyJLw==", + "version": "5.3.3", "dev": true, "requires": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } }, "@types/react-select": { "version": "3.0.19", - "integrity": "sha512-d+6qtfFXZeIOAABlVL1e50RZn8ctOABE4tFDxM6KW4lKuXgTTgLVrSik5AX9XjBjV7N80FtS6GTN/WeoXL9Jww==", "dev": true, "requires": { "@types/react": "*", @@ -60623,31 +65613,20 @@ "@types/react-transition-group": "*" } }, - "@types/react-sticky": { - "version": "6.0.3", - "integrity": "sha512-tW0Y1hTr2Tao4yX58iKl0i7BaqrdObGXAzsyzd8VGVrWVEgbQuV6P6QKVd/kFC7FroXyelftiVNJ09pnfkcjww==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, "@types/react-syntax-highlighter": { "version": "11.0.5", - "integrity": "sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==", "requires": { "@types/react": "*" } }, "@types/react-table": { "version": "7.0.29", - "integrity": "sha512-RCGVKGlTDv3jbj37WJ5HhN3sPb0W/2rqlvyGUtvawnnyrxgI2BGgASvU93rq2jwanVp5J9l1NYAeiGlNhdaBGw==", "requires": { "@types/react": "*" } }, "@types/react-test-renderer": { "version": "17.0.1", - "integrity": "sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==", "dev": true, "requires": { "@types/react": "*" @@ -60655,7 +65634,6 @@ }, "@types/react-transition-group": { "version": "4.4.0", - "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==", "dev": true, "requires": { "@types/react": "*" @@ -60663,7 +65641,6 @@ }, "@types/react-ultimate-pagination": { "version": "1.2.0", - "integrity": "sha512-xFyJn6Jl26Q0bi+QTnLo4W5tCDKOGNU5Gn9iCg+Y6J+VqtuKuJ1wcP1Ax+nXAu5HF9qTgApI/hRn7ceCDC6TAA==", "dev": true, "requires": { "@types/react": "*" @@ -60671,7 +65648,6 @@ }, "@types/react-virtualized": { "version": "9.21.10", - "integrity": "sha512-f5Ti3A7gGdLkPPFNHTrvKblpsPNBiQoSorOEOD+JPx72g/Ng2lOt4MYfhvQFQNgyIrAro+Z643jbcKafsMW2ag==", "dev": true, "requires": { "@types/prop-types": "*", @@ -60679,8 +65655,7 @@ } }, "@types/react-window": { - "version": "1.8.2", - "integrity": "sha512-gP1xam68Wc4ZTAee++zx6pTdDAH08rAkQrWm4B4F/y6hhmlT9Mgx2q8lTCXnrPHXsr15XjRN9+K2DLKcz44qEQ==", + "version": "1.8.5", "dev": true, "requires": { "@types/react": "*" @@ -60688,7 +65663,6 @@ }, "@types/redux-localstorage": { "version": "1.0.8", - "integrity": "sha512-pt+w3Y2K4Xwx79exTFZO356buBCgCM6NnyMv/EmASWb03a81g/EMEhNgH6w9dOnhTs1Clnmf2ykaia0FWXjsbQ==", "dev": true, "requires": { "redux": "^3.6.0" @@ -60696,7 +65670,6 @@ "dependencies": { "redux": { "version": "3.7.2", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", "dev": true, "requires": { "lodash": "^4.2.1", @@ -60709,37 +65682,42 @@ }, "@types/redux-mock-store": { "version": "1.0.2", - "integrity": "sha512-6LBtAQBN34i7SI5X+Qs4zpTEZO1tTDZ6sZ9fzFjYwTl3nLQXaBtwYdoV44CzNnyKu438xJ1lSIYyw0YMvunESw==", "dev": true, "requires": { "redux": "^4.0.5" } }, - "@types/resize-observer-browser": { - "version": "0.1.6", - "integrity": "sha512-61IfTac0s9jvNtBCpyo86QeaN8qqpMGHdK0uGKCCIy2dt5/Yk84VduHIdWAcmkC5QvdkPL0p5eWYgUZtHKKUVg==" - }, "@types/retry": { "version": "0.12.1", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, "@types/rison": { - "version": "0.0.6", - "integrity": "sha512-mE3eRK0fpTN/GnNBOIg2tGq2cFhchQXF6fCbrLxus75TgnoOECbdHikr948FGO/UAml7/ZhLMa5FbGkF5PKvmw==" + "version": "0.0.6" }, "@types/seedrandom": { - "version": "2.4.30", - "integrity": "sha512-AnxLHewubLVzoF/A4qdxBGHCKifw8cY32iro3DQX9TPcetE95zBeVt3jnsvtvAUf1vwzMfwzp4t/L2yqPlnjkQ==" + "version": "2.4.30" + }, + "@types/serve-index": { + "version": "1.9.1", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.0", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } }, "@types/shortid": { "version": "0.0.29", - "integrity": "sha512-9BCYD9btg2CY4kPcpMQ+vCR8U6V8f/KvixYD5ZbxoWlkhddNF5IeZMVL3p+QFUkg+Hb+kPAG9Jgk4bnnF1v/Fw==", "dev": true }, "@types/sinon": { "version": "9.0.5", - "integrity": "sha512-4CnkGdM/5/FXDGqL32JQ1ttVrGvhOoesLLF7VnTh4KdjK5N5VQOtxaylFqqTjnHx55MnD9O02Nbk5c1ELC8wlQ==", "dev": true, "requires": { "@types/sinonjs__fake-timers": "*" @@ -60747,64 +65725,59 @@ }, "@types/sinonjs__fake-timers": { "version": "6.0.4", - "integrity": "sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A==", "dev": true }, "@types/sizzle": { "version": "2.3.2", - "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", "dev": true }, + "@types/sockjs": { + "version": "0.3.33", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/source-list-map": { - "version": "0.1.2", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + "version": "0.1.2" }, "@types/stack-utils": { "version": "1.0.1", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", "dev": true }, "@types/tapable": { - "version": "1.0.8", - "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" + "version": "1.0.8" }, "@types/testing-library__jest-dom": { "version": "5.9.5", - "integrity": "sha512-ggn3ws+yRbOHog9GxnXiEZ/35Mow6YtPZpd7Z5mKDeZS/o7zx3yAle0ov/wjhVB5QT4N2Dt+GNoGCdqkBGCajQ==", "dev": true, "requires": { "@types/jest": "*" } }, "@types/text-encoding-utf-8": { - "version": "1.0.2", - "integrity": "sha512-AQ6zewa0ucLJvtUi5HsErbOFKAcQfRLt9zFLlUOvcXBy2G36a+ZDpCHSGdzJVUD8aNURtIjh9aSjCStNMRCcRQ==" + "version": "1.0.2" }, "@types/tinycolor2": { "version": "1.4.3", - "integrity": "sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==", "dev": true }, "@types/uglify-js": { "version": "3.0.4", - "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", "requires": { "source-map": "^0.6.1" }, "dependencies": { "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "@types/unist": { - "version": "2.0.3", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + "version": "2.0.3" }, "@types/webpack": { "version": "4.41.31", - "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", "requires": { "@types/node": "*", "@types/tapable": "^1", @@ -60816,29 +65789,24 @@ "dependencies": { "anymatch": { "version": "3.1.2", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "normalize-path": { - "version": "3.0.0", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "version": "3.0.0" }, "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "@types/webpack-env": { - "version": "1.16.2", - "integrity": "sha512-vKx7WNQNZDyJveYcHAm9ZxhqSGLYwoyLhrHjLBOkw3a7cT76sTdjgtwyijhk1MaHyRIuSztcVwrUOO/NEu68Dw==" + "version": "1.18.0" }, "@types/webpack-sources": { "version": "0.1.5", - "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", "requires": { "@types/node": "*", "@types/source-list-map": "*", @@ -60846,14 +65814,19 @@ }, "dependencies": { "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, + "@types/ws": { + "version": "8.5.3", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/yargs": { "version": "15.0.13", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -60861,12 +65834,10 @@ }, "@types/yargs-parser": { "version": "15.0.0", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, "@types/yauzl": { "version": "2.9.2", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", "dev": true, "optional": true, "requires": { @@ -60875,7 +65846,6 @@ }, "@typescript-eslint/eslint-plugin": { "version": "5.3.1", - "integrity": "sha512-cFImaoIr5Ojj358xI/SDhjog57OK2NqlpxwdcgyxDA3bJlZcJq5CPzUXtpD7CxI2Hm6ATU7w5fQnnkVnmwpHqw==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "5.3.1", @@ -60890,7 +65860,6 @@ "dependencies": { "@typescript-eslint/experimental-utils": { "version": "5.3.1", - "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", @@ -60903,7 +65872,6 @@ "dependencies": { "eslint-utils": { "version": "3.0.0", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { "eslint-visitor-keys": "^2.0.0" @@ -60913,7 +65881,6 @@ }, "@typescript-eslint/typescript-estree": { "version": "5.3.1", - "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", "dev": true, "requires": { "@typescript-eslint/types": "5.3.1", @@ -60927,7 +65894,6 @@ }, "debug": { "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -60935,17 +65901,14 @@ }, "eslint-visitor-keys": { "version": "2.1.0", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "ignore": { "version": "5.1.9", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", "dev": true }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -60953,12 +65916,10 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "semver": { "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -60966,14 +65927,12 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@typescript-eslint/experimental-utils": { "version": "4.12.0", - "integrity": "sha512-MpXZXUAvHt99c9ScXijx7i061o5HEjXltO+sbYfZAAHxv3XankQkPaNi5myy0Yh0Tyea3Hdq1pi7Vsh0GJb0fA==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", @@ -60986,7 +65945,6 @@ "dependencies": { "@typescript-eslint/scope-manager": { "version": "4.12.0", - "integrity": "sha512-QVf9oCSVLte/8jvOsxmgBdOaoe2J0wtEmBr13Yz0rkBNkl5D8bfnf6G4Vhox9qqMIoG7QQoVwd2eG9DM/ge4Qg==", "dev": true, "requires": { "@typescript-eslint/types": "4.12.0", @@ -60995,12 +65953,10 @@ }, "@typescript-eslint/types": { "version": "4.12.0", - "integrity": "sha512-N2RhGeheVLGtyy+CxRmxdsniB7sMSCfsnbh8K/+RUIXYYq3Ub5+sukRCjVE80QerrUBvuEvs4fDhz5AW/pcL6g==", "dev": true }, "@typescript-eslint/visitor-keys": { "version": "4.12.0", - "integrity": "sha512-hVpsLARbDh4B9TKYz5cLbcdMIOAoBYgFPCSP9FFS/liSF+b33gVNq8JHY3QGhHNVz85hObvL7BEYLlgx553WCw==", "dev": true, "requires": { "@typescript-eslint/types": "4.12.0", @@ -61009,14 +65965,12 @@ }, "eslint-visitor-keys": { "version": "2.0.0", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", "dev": true } } }, "@typescript-eslint/parser": { "version": "5.3.1", - "integrity": "sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==", "dev": true, "requires": { "@typescript-eslint/scope-manager": "5.3.1", @@ -61027,7 +65981,6 @@ "dependencies": { "@typescript-eslint/typescript-estree": { "version": "5.3.1", - "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", "dev": true, "requires": { "@typescript-eslint/types": "5.3.1", @@ -61041,7 +65994,6 @@ }, "debug": { "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -61049,7 +66001,6 @@ }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -61057,12 +66008,10 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "semver": { "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -61070,14 +66019,12 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@typescript-eslint/scope-manager": { "version": "5.3.1", - "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", "dev": true, "requires": { "@typescript-eslint/types": "5.3.1", @@ -61086,12 +66033,10 @@ }, "@typescript-eslint/types": { "version": "5.3.1", - "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", "dev": true }, "@typescript-eslint/typescript-estree": { "version": "4.12.0", - "integrity": "sha512-gZkFcmmp/CnzqD2RKMich2/FjBTsYopjiwJCroxqHZIY11IIoN0l5lKqcgoAPKHt33H2mAkSfvzj8i44Jm7F4w==", "dev": true, "requires": { "@typescript-eslint/types": "4.12.0", @@ -61106,12 +66051,10 @@ "dependencies": { "@typescript-eslint/types": { "version": "4.12.0", - "integrity": "sha512-N2RhGeheVLGtyy+CxRmxdsniB7sMSCfsnbh8K/+RUIXYYq3Ub5+sukRCjVE80QerrUBvuEvs4fDhz5AW/pcL6g==", "dev": true }, "@typescript-eslint/visitor-keys": { "version": "4.12.0", - "integrity": "sha512-hVpsLARbDh4B9TKYz5cLbcdMIOAoBYgFPCSP9FFS/liSF+b33gVNq8JHY3QGhHNVz85hObvL7BEYLlgx553WCw==", "dev": true, "requires": { "@typescript-eslint/types": "4.12.0", @@ -61120,7 +66063,6 @@ }, "debug": { "version": "4.3.1", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -61128,12 +66070,10 @@ }, "eslint-visitor-keys": { "version": "2.0.0", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", "dev": true }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -61141,12 +66081,10 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "semver": { "version": "7.3.4", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -61154,23 +66092,29 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@typescript-eslint/visitor-keys": { "version": "5.3.1", - "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", "dev": true, "requires": { "@typescript-eslint/types": "5.3.1", "eslint-visitor-keys": "^3.0.0" } }, + "@visx/responsive": { + "version": "3.0.0", + "requires": { + "@types/lodash": "^4.14.172", + "@types/react": "*", + "lodash": "^4.17.21", + "prop-types": "^15.6.1" + } + }, "@vx/axis": { "version": "0.0.140", - "integrity": "sha512-lxMgWySkSh7ew8XS25Kpn95HH4d8dpL2vLv1UvASJY2VxdczQayTUUvQLecesJI4bbJV2R7Fasm64EBlJAezTw==", "requires": { "@vx/group": "0.0.140", "@vx/point": "0.0.136", @@ -61181,7 +66125,6 @@ "dependencies": { "prop-types": { "version": "15.5.10", - "integrity": "sha512-vCFzoUFaZkVNeFkhK1KbSq4cn97GDrpfBt9K2qLkGnPAEFhEv3M61Lk5t+B7c0QfMLWo0fPkowk/4SuXerh26Q==", "requires": { "fbjs": "^0.8.9", "loose-envify": "^1.3.1" @@ -61191,32 +66134,27 @@ }, "@vx/bounds": { "version": "0.0.140", - "integrity": "sha512-6TLF2KsSW3aqeBhTnouFhSLGT//zgrDz2uThYfrmL2oVkkXRtjNBKXW/BR+E3ugI+gSH6VfoL85s2bSAkAJo7w==", "requires": { "prop-types": "^15.5.10" } }, "@vx/clip-path": { - "version": "0.0.140", - "integrity": "sha512-Un/9v5Pvu6rEHmQzkN5nPnPsmiSRVl4xhcdelK01xxWAnkFJoXvQiTGdOvF0JOtntVOPDwKUimx+iUiCxBZjoA==" + "version": "0.0.140" }, "@vx/curve": { "version": "0.0.165", - "integrity": "sha512-fiQAGrKNGjJbL+eixUckJqIZDWXH/1NtIyyDbSz3J7ksk0QpYr5BgWcNJN76HLNt7wfcLwNzCHeNs4iVYyFGTg==", "requires": { "d3-shape": "^1.0.6" } }, "@vx/event": { "version": "0.0.140", - "integrity": "sha512-m51d8rz4Uu8Vyvu50dulKcrBt6/y4+ZDvgBjs5QNfhNHIa8T+Uqcs6m3jWNw2mpsnC8MtEavi5S3SUDuWlwl7A==", "requires": { "@vx/point": "0.0.136" } }, "@vx/glyph": { "version": "0.0.140", - "integrity": "sha512-ev/DCvE3a8YyDC8bQhoZ5WILzeQMqI2mKeAVARsJpX1mmwvi5Hn8S35TZcV9yaIZ36LC8cbhtQY5wjsQU6FGcA==", "requires": { "@vx/group": "0.0.140", "classnames": "^2.2.5", @@ -61225,7 +66163,6 @@ }, "@vx/gradient": { "version": "0.0.140", - "integrity": "sha512-VHaZ6YIjRj3l26LGWg3Bz82vAyp0Te890W3tMABGZC+pwU3lpZJzN89UBJ8vT+42Jcc1o3B7vS67mBjITFTHVQ==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.5.7" @@ -61233,7 +66170,6 @@ }, "@vx/grid": { "version": "0.0.140", - "integrity": "sha512-QtAEzdR4gtQtuqkiP3BAXlyU7Fsuwom0HHY1lEdO/wyIijYhpHf3fG1GgPVJsr7YXY1ieUQ6k1A9EEmdEIlBxw==", "requires": { "@vx/group": "0.0.140", "@vx/point": "0.0.136", @@ -61243,14 +66179,12 @@ }, "@vx/group": { "version": "0.0.140", - "integrity": "sha512-es87IDOWhXSW++gajslK7bl9FTdp1kkVMH8AKAhSoDjh0DSZan5yYpS3OvMgJHh1Tlgl3KZzh/RJ1Qfh/FKLCg==", "requires": { "classnames": "^2.2.5" } }, "@vx/legend": { "version": "0.0.140", - "integrity": "sha512-fpt2XUDQcKKfZc5DedRWfMWm+BUIKePkv+M6y0zpWaw/k63LIZUr9oCnGdTk9yCBfSxLBvwfcxY7jhUCJIT84Q==", "requires": { "@vx/group": "0.0.140", "classnames": "^2.2.5", @@ -61259,19 +66193,16 @@ }, "@vx/pattern": { "version": "0.0.140", - "integrity": "sha512-TRP/i2C4TW1rwp3AzcrxTP0Zk0XalgSKOzUuTFasceEUkyVFTZ+MrwWIEG2YYs6S7d5M/VqvIQdI3KGRRyKysA==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.5.10" } }, "@vx/point": { - "version": "0.0.136", - "integrity": "sha512-x5y5eQJ0koZCGS0AK2juiJ2hLsZhgAOzQ2MuMushikEfQ1azLtrDIh4l2WesLQrp//o9+u2sWJ3mPgEGdBIvfA==" + "version": "0.0.136" }, "@vx/responsive": { - "version": "0.0.195", - "integrity": "sha512-3zjkjqg8V3Kr1moSI7EAzlW7MLR87p2CXc+qh0zZg/zLrc3C89JnxyMYFfS7jM4PlHr26n634YddQDVydwARBA==", + "version": "0.0.199", "requires": { "@types/lodash": "^4.14.146", "@types/react": "*", @@ -61282,14 +66213,12 @@ }, "@vx/scale": { "version": "0.0.140", - "integrity": "sha512-JlxEKtBsJyfltcImPA2BPWvHjzvNTGZmRYywzR63W9usWGPUjVC9AGXOsRQn7lea764xlZI83mPGQI7lNkz4Tw==", "requires": { "d3-scale": "^1.0.5" }, "dependencies": { "d3-scale": { "version": "1.0.7", - "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", "requires": { "d3-array": "^1.2.0", "d3-collection": "1", @@ -61304,7 +66233,6 @@ }, "@vx/shape": { "version": "0.0.140", - "integrity": "sha512-njU9Fby0+Fykr3cOla95Brn7Yh/oRMX2DXh65yn2Rx8hUWLrLwsQW46mWBaxO+Dq85UQ6BKTJxa+l1vrc2u8nw==", "requires": { "@vx/curve": "0.0.140", "@vx/group": "0.0.140", @@ -61316,7 +66244,6 @@ "dependencies": { "@vx/curve": { "version": "0.0.140", - "integrity": "sha512-rVjxj6Vi9taGLxjzzilfNdoh3kUfYnc8G8rZ/l+0caNPBIY3OQW3HDGhITc2bh72daCfFsylQXwpc/YxLfbSWA==", "requires": { "d3-shape": "^1.0.6" } @@ -61325,7 +66252,6 @@ }, "@vx/stats": { "version": "0.0.165", - "integrity": "sha512-FRW5N+7pXLZrQxT8JA8OH28PGKq7YfiycmnSG7jzXOnvw+sPm9MRKCoyRDTpFrCiggcOhHhvqhE8RiO2qF7d3Q==", "requires": { "@vx/group": "0.0.165", "@vx/scale": "0.0.165", @@ -61335,14 +66261,12 @@ "dependencies": { "@vx/group": { "version": "0.0.165", - "integrity": "sha512-gi1DSg8AAaVRseyWiq8y4bzyvKiQIXT6vDUYBVRmv2LBcpHocBGaxNiNK0X602RgLG0XmNyRv6qSCWLOaBs3Mg==", "requires": { "classnames": "^2.2.5" } }, "@vx/scale": { "version": "0.0.165", - "integrity": "sha512-5jSgXJDU6J/KWIyCbpjHqysPCddp7tG3LbTV7UmtB1Qleb4m4slShTVSE7+EKU+zgiQPDGm0+E2ht4cet+7F7A==", "requires": { "d3-scale": "^2.0.0" } @@ -61351,7 +66275,6 @@ }, "@vx/text": { "version": "0.0.179", - "integrity": "sha512-UD3/8o15+AQfjDI8LQ1Zj3EdQCwA3cfuQMR/M2F/Le4+JXQNMheeWz4xGyF4ZDs6r7c5cUI9Cd1RaPmGhYsX9g==", "requires": { "babel-plugin-lodash": "^3.3.2", "classnames": "^2.2.5", @@ -61362,7 +66285,6 @@ }, "@vx/threshold": { "version": "0.0.170", - "integrity": "sha512-A3yWJrFqckbleXg3Q3iSsU6mdtHbMxEnE4jGZd8og4m9r2RDVTvFVP6ZRo4vunlfWj5YuMnNsKhx4ZSWKVMtXg==", "requires": { "@vx/clip-path": "0.0.165", "@vx/shape": "0.0.170", @@ -61371,23 +66293,19 @@ }, "dependencies": { "@vx/clip-path": { - "version": "0.0.165", - "integrity": "sha512-mBCbgguLMVyGvar5FbxqyyY4NQFlnXoSLF0TrhgWYkF/FCXdE1CzBC+Y4iXIJOY0ZTtluqL9XrNdIDpx49AmuA==" + "version": "0.0.165" }, "@vx/group": { "version": "0.0.170", - "integrity": "sha512-RnDdRoy0YI5hokk+YWXc8t39Kp51i4BdCpiwkDJU4YypGycTYnDFjicam6jigUmZ/6wyMirDf/aQboWviFLt2Q==", "requires": { "classnames": "^2.2.5" } }, "@vx/point": { - "version": "0.0.165", - "integrity": "sha512-spoHilhjcWNgccrSzBUPw+PXV81tYxeyEWBkgr35aGVU4m7YT86Ywvfemwp7AVVGPn+XJHrhB0ujAhDoyqFPoA==" + "version": "0.0.165" }, "@vx/shape": { "version": "0.0.170", - "integrity": "sha512-rm8oVRP0ejgwGhQTVhqP5awqphWX60FgbnRt9X+YBUqgv7Qyedfgs/CHd/5QFZX3aPp8d4F+b4+lghbIYiMgmQ==", "requires": { "@vx/curve": "0.0.165", "@vx/group": "0.0.170", @@ -61402,7 +66320,6 @@ }, "@vx/tooltip": { "version": "0.0.140", - "integrity": "sha512-D6D6b6Pm5ZR39CWi250OV2Ub1P9Zk/199a6smUygBAXVVXhBHMe+wz9WuGllJQkMcRvIi+DMhgMHDNihDwjTVA==", "requires": { "@vx/bounds": "0.0.140", "classnames": "^2.2.5", @@ -61411,7 +66328,6 @@ }, "@vx/voronoi": { "version": "0.0.165", - "integrity": "sha512-oZT9KBAjDLCEcOrrqW01TPz8pLtrNNAFPa7mB9ignXvgntqEd3yVXCBkxXScfZLS+O8UQc+7/pawu0PPkE2eMw==", "requires": { "@vx/group": "0.0.165", "classnames": "^2.2.5", @@ -61421,7 +66337,6 @@ "dependencies": { "@vx/group": { "version": "0.0.165", - "integrity": "sha512-gi1DSg8AAaVRseyWiq8y4bzyvKiQIXT6vDUYBVRmv2LBcpHocBGaxNiNK0X602RgLG0XmNyRv6qSCWLOaBs3Mg==", "requires": { "classnames": "^2.2.5" } @@ -61430,7 +66345,6 @@ }, "@webassemblyjs/ast": { "version": "1.9.0", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "requires": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -61438,38 +66352,31 @@ } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + "version": "1.9.0" }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + "version": "1.9.0" }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + "version": "1.9.0" }, "@webassemblyjs/helper-code-frame": { "version": "1.9.0", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "requires": { "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + "version": "1.9.0" }, "@webassemblyjs/helper-module-context": { "version": "1.9.0", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "requires": { "@webassemblyjs/ast": "1.9.0" } }, "@webassemblyjs/helper-numbers": { "version": "1.11.1", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "requires": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", @@ -61479,23 +66386,19 @@ "dependencies": { "@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { "version": "1.11.1", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true } } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + "version": "1.9.0" }, "@webassemblyjs/helper-wasm-section": { "version": "1.9.0", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -61505,25 +66408,21 @@ }, "@webassemblyjs/ieee754": { "version": "1.9.0", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { "version": "1.9.0", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + "version": "1.9.0" }, "@webassemblyjs/wasm-edit": { "version": "1.9.0", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -61537,7 +66436,6 @@ }, "@webassemblyjs/wasm-gen": { "version": "1.9.0", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -61548,7 +66446,6 @@ }, "@webassemblyjs/wasm-opt": { "version": "1.9.0", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -61558,7 +66455,6 @@ }, "@webassemblyjs/wasm-parser": { "version": "1.9.0", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-api-error": "1.9.0", @@ -61570,7 +66466,6 @@ }, "@webassemblyjs/wast-parser": { "version": "1.9.0", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/floating-point-hex-parser": "1.9.0", @@ -61582,7 +66477,6 @@ }, "@webassemblyjs/wast-printer": { "version": "1.9.0", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0", @@ -61591,12 +66485,10 @@ }, "@webpack-cli/configtest": { "version": "1.0.4", - "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==", "dev": true }, "@webpack-cli/info": { "version": "1.3.0", - "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==", "dev": true, "requires": { "envinfo": "^7.7.3" @@ -61604,57 +66496,77 @@ }, "@webpack-cli/serve": { "version": "1.5.2", - "integrity": "sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==", "dev": true }, "@xtuc/ieee754": { - "version": "1.2.0", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "version": "1.2.0" }, "@xtuc/long": { - "version": "4.2.2", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "version": "4.2.2" + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true + }, + "@yarnpkg/parsers": { + "version": "3.0.0-rc.33", + "dev": true, + "requires": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "dev": true + } + } + }, + "@zkochan/js-yaml": { + "version": "0.0.6", + "dev": true, + "requires": { + "argparse": "^2.0.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "dev": true + } + } }, "abab": { "version": "2.0.6", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "abbrev": { - "version": "1.1.1", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "version": "1.1.1" }, "abort-controller": { "version": "3.0.0", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, "requires": { "event-target-shim": "^5.0.0" } }, "abortcontroller-polyfill": { - "version": "1.2.1", - "integrity": "sha512-9jN7+BijYKWO8fxfcG7QZh7js6V+g3OjkxMRHfKWNjjs85048VY4cd27Uoe6yk55P66L/z7Dflu5+YEApgMzkA==" + "version": "1.2.1" }, "accepts": { - "version": "1.3.5", - "integrity": "sha512-pt4oTticGUEOZCvli0I7ekmpXopaX+Xvb/TQRaTKnvZNIH9Srs0VWi2NGBfsRscAgwtIEtxW5JOB9sI0oN3cjw==", + "version": "1.3.8", "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "ace-builds": { - "version": "1.4.14", - "integrity": "sha512-NBOQlm9+7RBqRqZwimpgquaLeTJFayqb9UEPtTkpC3TkkwDnlsT/TwsCC0svjt9kEZ6G9mH5AEOHSz6Q/HrzQQ==" + "version": "1.4.14" }, "acorn": { - "version": "8.7.0", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + "version": "8.7.1" }, "acorn-globals": { "version": "6.0.0", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, "requires": { "acorn": "^7.1.1", @@ -61663,44 +66575,35 @@ "dependencies": { "acorn": { "version": "7.4.1", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true } } }, "acorn-import-assertions": { "version": "1.7.6", - "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", "dev": true }, "acorn-jsx": { "version": "5.3.1", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, "acorn-walk": { "version": "7.2.0", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, "add-stream": { "version": "1.0.0", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", "dev": true }, "address": { - "version": "1.1.2", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + "version": "1.1.2" }, "ag-charts-community": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ag-charts-community/-/ag-charts-community-4.2.0.tgz", - "integrity": "sha512-9vZSwlcpGwkb6KwEzTgxw5BuzdZgRhrbbiQS5wIfSa74cNsyYt76MTBPudqfHnc+SoWDGGxof3rteU6kXSc07w==", "dev": true }, "agent-base": { "version": "6.0.2", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { "debug": "4" @@ -61708,7 +66611,6 @@ "dependencies": { "debug": { "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -61716,14 +66618,12 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "agentkeepalive": { - "version": "4.2.0", - "integrity": "sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==", + "version": "4.2.1", "dev": true, "requires": { "debug": "^4.1.0", @@ -61733,7 +66633,6 @@ "dependencies": { "debug": { "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -61741,14 +66640,12 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "aggregate-error": { "version": "3.0.1", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -61756,7 +66653,6 @@ }, "airbnb-js-shims": { "version": "2.2.1", - "integrity": "sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==", "requires": { "array-includes": "^3.0.3", "array.prototype.flat": "^1.2.1", @@ -61778,32 +66674,22 @@ } }, "airbnb-prop-types": { - "version": "2.15.0", - "integrity": "sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==", + "version": "2.16.0", "dev": true, "requires": { - "array.prototype.find": "^2.1.0", - "function.prototype.name": "^1.1.1", - "has": "^1.0.3", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", + "array.prototype.find": "^2.1.1", + "function.prototype.name": "^1.1.2", + "is-regex": "^1.1.0", + "object-is": "^1.1.2", "object.assign": "^4.1.0", - "object.entries": "^1.1.0", + "object.entries": "^1.1.2", "prop-types": "^15.7.2", "prop-types-exact": "^1.2.0", - "react-is": "^16.9.0" - }, - "dependencies": { - "react-is": { - "version": "16.9.0", - "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", - "dev": true - } + "react-is": "^16.13.1" } }, "ajv": { "version": "6.12.6", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -61812,12 +66698,10 @@ } }, "ajv-errors": { - "version": "1.0.1", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + "version": "1.0.1" }, "ajv-formats": { "version": "2.1.1", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "requires": { "ajv": "^8.0.0" @@ -61825,7 +66709,6 @@ "dependencies": { "ajv": { "version": "8.8.2", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -61836,38 +66719,31 @@ }, "json-schema-traverse": { "version": "1.0.0", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true } } }, "ajv-keywords": { - "version": "3.5.2", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "version": "3.5.2" }, "alphanum-sort": { "version": "1.0.2", - "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==", "dev": true }, "ansi-align": { "version": "3.0.1", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "requires": { "string-width": "^4.1.0" }, "dependencies": { "ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "version": "5.0.1" }, "is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "version": "3.0.0" }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -61876,7 +66752,6 @@ }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } @@ -61884,158 +66759,263 @@ } }, "ansi-colors": { - "version": "3.2.4", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + "version": "3.2.4" }, "ansi-escapes": { "version": "4.3.1", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "devOptional": true, + "dev": true, "requires": { "type-fest": "^0.11.0" }, "dependencies": { "type-fest": { "version": "0.11.0", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "devOptional": true + "dev": true } } }, "ansi-html-community": { - "version": "0.0.8", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" + "version": "0.0.8" }, "ansi-regex": { - "version": "2.1.1", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + "version": "2.1.1" }, "ansi-styles": { "version": "4.3.0", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" }, "dependencies": { "color-convert": { "version": "2.0.1", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" } } }, "ansi-to-html": { "version": "0.6.15", - "integrity": "sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==", "requires": { "entities": "^2.0.0" }, "dependencies": { "entities": { - "version": "2.2.0", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "version": "2.2.0" } } }, - "ansicolors": { - "version": "0.2.1", - "integrity": "sha512-tOIuy1/SK/dr94ZA0ckDohKXNeBNqZ4us6PjMVLs5h1w2GBB6uPtOknp2+VF4F/zcy9LI70W+Z+pE2Soajky1w==" - }, "antd": { - "version": "4.9.4", - "integrity": "sha512-kieGi1Isb/ddnn9E/AJVFCUgSZIqDv6HtFg7r5WWI0s6zf+nfCOtpes0oX8TdHO6mE/dL39pJG52aHNe8MwkJg==", + "version": "4.10.3", "requires": { "@ant-design/colors": "^5.0.0", "@ant-design/icons": "^4.3.0", - "@ant-design/react-slick": "~0.27.0", + "@ant-design/react-slick": "~0.28.1", "@babel/runtime": "^7.11.2", "array-tree-filter": "^2.1.0", "classnames": "^2.2.6", "copy-to-clipboard": "^3.2.0", "lodash": "^4.17.20", "moment": "^2.25.3", - "omit.js": "^2.0.2", "rc-cascader": "~1.4.0", "rc-checkbox": "~2.3.0", "rc-collapse": "~3.1.0", - "rc-dialog": "~8.4.0", - "rc-drawer": "~4.1.0", + "rc-dialog": "~8.5.1", + "rc-drawer": "~4.2.0", "rc-dropdown": "~3.2.0", - "rc-field-form": "~1.17.0", - "rc-image": "~4.2.0", + "rc-field-form": "~1.17.3", + "rc-image": "~5.0.2", "rc-input-number": "~6.1.0", "rc-mentions": "~1.5.0", "rc-menu": "~8.10.0", "rc-motion": "^2.4.0", "rc-notification": "~4.5.2", "rc-pagination": "~3.1.2", - "rc-picker": "~2.4.1", + "rc-picker": "~2.5.1", "rc-progress": "~3.1.0", "rc-rate": "~2.9.0", - "rc-resize-observer": "^0.2.3", - "rc-select": "~11.5.3", - "rc-slider": "~9.6.1", + "rc-resize-observer": "^1.0.0", + "rc-select": "~12.1.0", + "rc-slider": "~9.7.1", "rc-steps": "~4.1.0", "rc-switch": "~3.2.0", - "rc-table": "~7.11.0", + "rc-table": "~7.12.0", "rc-tabs": "~11.7.0", "rc-textarea": "~0.3.0", "rc-tooltip": "~5.0.0", - "rc-tree": "~4.0.0", - "rc-tree-select": "~4.2.0", - "rc-upload": "~3.3.1", - "rc-util": "^5.1.0", + "rc-tree": "~4.1.0", + "rc-tree-select": "~4.3.0", + "rc-upload": "~3.3.4", + "rc-util": "^5.7.0", "scroll-into-view-if-needed": "^2.2.25", "warning": "^4.0.3" }, "dependencies": { "@ant-design/colors": { "version": "5.0.1", - "integrity": "sha512-x1TUaRILaqy3zgFNo+kIqOa3eTYPt81H1/3E4dCjDP4Qvk/xaPEizLDFdRUcIx0cWwyu2LklwfyLHWpbYK8v6A==", "requires": { "@ctrl/tinycolor": "^3.3.1" } }, - "@ant-design/icons": { - "version": "4.3.0", - "integrity": "sha512-UoIbw4oz/L/msbkgqs2nls2KP7XNKScOxVR54wRrWwnXOzJaGNwwSdYjHQz+5ETf8C53YPpzMOnRX99LFCdeIQ==", + "@ant-design/react-slick": { + "version": "0.28.4", + "requires": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "lodash": "^4.17.21", + "resize-observer-polyfill": "^1.5.0" + } + }, + "rc-dialog": { + "version": "8.5.3", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.6.1" + } + }, + "rc-drawer": { + "version": "4.2.2", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.7.0" + } + }, + "rc-image": { + "version": "5.0.2", "requires": { - "@ant-design/colors": "^5.0.0", - "@ant-design/icons-svg": "^4.0.0", "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", - "insert-css": "^2.0.0", - "rc-util": "^5.0.1" + "rc-dialog": "~8.5.1", + "rc-util": "^5.0.6" } }, - "rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", + "rc-picker": { + "version": "2.5.19", "requires": { - "react-is": "^16.12.0", + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "date-fns": "2.x", + "dayjs": "1.x", + "moment": "^2.24.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.4.0", "shallowequal": "^1.1.0" } }, - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "rc-resize-observer": { + "version": "1.2.0", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.15.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-select": { + "version": "12.1.13", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.9.8", + "rc-virtual-list": "^3.2.0" + }, + "dependencies": { + "rc-overflow": { + "version": "1.2.8", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.19.2" + } + }, + "rc-virtual-list": { + "version": "3.4.11", + "requires": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.15.0" + } + } + } + }, + "rc-slider": { + "version": "9.7.5", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-tooltip": "^5.0.1", + "rc-util": "^5.16.1", + "shallowequal": "^1.1.0" + } + }, + "rc-table": { + "version": "7.12.5", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.4.0", + "shallowequal": "^1.1.0" + } + }, + "rc-tooltip": { + "version": "5.0.2", + "requires": { + "@babel/runtime": "^7.11.2", + "rc-trigger": "^5.0.0" + } + }, + "rc-tree": { + "version": "4.1.5", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.0.0", + "rc-virtual-list": "^3.0.1" + }, + "dependencies": { + "rc-virtual-list": { + "version": "3.4.11", + "requires": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.15.0" + } + } + } + }, + "rc-tree-select": { + "version": "4.3.3", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "^12.0.0", + "rc-tree": "^4.0.0", + "rc-util": "^5.0.5" + } } } }, "any-observable": { "version": "0.3.0", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", "dev": true }, "anymatch": { "version": "2.0.0", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "devOptional": true, "requires": { "micromatch": "^3.1.4", @@ -62044,7 +67024,6 @@ }, "apache-arrow": { "version": "4.0.1", - "integrity": "sha512-DyF7GXCbSjsw4P5C8b+qW7OnJKa6w9mJI0mhV0+EfZbVZCmhfiF6ffqcnrI/kzBrRqn9hH/Ft9n5+m4DTbBJpg==", "requires": { "@types/flatbuffers": "^1.10.0", "@types/node": "^14.14.37", @@ -62059,18 +67038,15 @@ }, "dependencies": { "@types/node": { - "version": "14.17.9", - "integrity": "sha512-CMjgRNsks27IDwI785YMY0KLt3co/c0cQ5foxHYv/shC2w8oOnVwz5Ubq1QG5KzrcW+AXk6gzdnxIkDnTvzu3g==" + "version": "14.17.9" }, "tslib": { - "version": "2.3.0", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + "version": "2.3.0" } } }, "aphrodite": { "version": "1.2.5", - "integrity": "sha512-vbhTGgXORXnHNnQF7ReckeB3LAow8l4svWwf4R6zBdbBQEswi6+HVIWQX914jWYOJoD/h+AjWDvbIAvyhWnBmQ==", "requires": { "asap": "^2.0.3", "inline-style-prefixer": "^3.0.1", @@ -62078,32 +67054,38 @@ } }, "app-root-dir": { - "version": "1.0.2", - "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==" + "version": "1.0.2" }, "aproba": { - "version": "1.2.0", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "version": "1.2.0" }, "are-we-there-yet": { - "version": "1.1.7", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "version": "3.0.1", "dev": true, "requires": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "argparse": { "version": "1.0.10", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { "sprintf-js": "~1.0.2" } }, "aria-query": { "version": "4.2.2", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", "dev": true, "requires": { "@babel/runtime": "^7.10.2", @@ -62111,47 +67093,34 @@ } }, "arr-diff": { - "version": "4.0.0", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==" + "version": "4.0.0" }, "arr-flatten": { - "version": "1.1.0", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "version": "1.1.0" }, "arr-union": { - "version": "3.1.0", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==" + "version": "3.1.0" }, "array-back": { - "version": "3.1.0", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==" + "version": "3.1.0" }, "array-differ": { "version": "3.0.0", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==" - }, - "array-equal": { - "version": "1.0.0", - "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", "dev": true }, - "array-filter": { + "array-equal": { "version": "1.0.0", - "integrity": "sha512-Ene1hbrinPZ1qPoZp7NSx4jQnh4nr7MtY78pHNb+yr8yHbxmTS7ChGW0a55JKA7TkRDeoQxK4GcJaCvBYplSKA==", "dev": true }, "array-flatten": { - "version": "2.1.2", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + "version": "2.1.2" }, "array-ify": { "version": "1.0.0", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, "array-includes": { "version": "3.1.4", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -62161,46 +67130,52 @@ } }, "array-move": { - "version": "2.2.1", - "integrity": "sha512-qQpEHBnVT6HAFgEVUwRdHVd8TYJThrZIT5wSXpEUTPwBaYhPLclw12mEpyUvRWVdl1VwPOqnIy6LqTFN3cSeUQ==" + "version": "2.2.1" }, "array-tree-filter": { - "version": "2.1.0", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + "version": "2.1.0" }, "array-union": { - "version": "2.1.0", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "version": "2.1.0" }, "array-uniq": { - "version": "1.0.3", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==" + "version": "1.0.3" }, "array-unique": { - "version": "0.3.2", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==" + "version": "0.3.2" + }, + "array.prototype.filter": { + "version": "1.0.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } }, "array.prototype.find": { - "version": "2.1.0", - "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", + "version": "2.2.1", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.13.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flat": { - "version": "1.2.1", - "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", + "version": "1.3.1", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.10.0", - "function-bind": "^1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { "version": "1.2.3", - "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1", @@ -62209,7 +67184,6 @@ }, "array.prototype.map": { "version": "1.0.4", - "integrity": "sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -62220,16 +67194,13 @@ }, "arrify": { "version": "1.0.1", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true }, "asap": { - "version": "2.0.6", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "version": "2.0.6" }, "asn1": { "version": "0.2.4", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { "safer-buffer": "~2.1.0" @@ -62237,7 +67208,6 @@ }, "asn1.js": { "version": "5.4.1", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -62246,26 +67216,22 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.0" } } }, "assert": { "version": "1.5.0", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "requires": { "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { "inherits": { - "version": "2.0.1", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + "version": "2.0.1" }, "util": { "version": "0.10.3", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", "requires": { "inherits": "2.0.1" } @@ -62274,73 +67240,63 @@ }, "assert-plus": { "version": "1.0.0", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true }, "assign-symbols": { - "version": "1.0.0", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" + "version": "1.0.0" }, "ast-types": { "version": "0.14.2", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", "requires": { "tslib": "^2.0.1" }, "dependencies": { "tslib": { - "version": "2.3.1", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.3.1" } } }, "ast-types-flow": { "version": "0.0.7", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, "astral-regex": { "version": "2.0.0", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "3.2.4", "dev": true }, "async-each": { "version": "1.0.3", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "optional": true }, "async-limiter": { "version": "1.0.0", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", "dev": true }, "async-retry": { "version": "1.3.3", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", "dev": true, "requires": { "retry": "0.13.1" } }, "async-validator": { - "version": "3.5.1", - "integrity": "sha512-DDmKA7sdSAJtTVeNZHrnr2yojfFaoeW8MfQN8CeuXg8DDQHTqKk9Fdv38dSvnesHoO8MUwMI2HphOeSyIF+wmQ==" + "version": "3.5.1" }, "asynckit": { - "version": "0.4.0", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "version": "0.4.0" }, "at-least-node": { - "version": "1.0.0", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + "version": "1.0.0" }, "atob": { - "version": "2.1.2", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "version": "2.1.2" }, "autoprefixer": { "version": "9.8.8", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", "requires": { "browserslist": "^4.12.0", "caniuse-lite": "^1.0.30001109", @@ -62353,49 +67309,44 @@ "dependencies": { "postcss": { "version": "7.0.39", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "requires": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, + "available-typed-arrays": { + "version": "1.0.5" + }, "aws-sign2": { "version": "0.7.0", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true }, "aws4": { "version": "1.8.0", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "axe-core": { "version": "4.4.1", - "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", "dev": true }, "axios": { "version": "0.21.4", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "devOptional": true, + "dev": true, "requires": { "follow-redirects": "^1.14.0" } }, "axobject-query": { "version": "2.2.0", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", "dev": true }, "babel-jest": { "version": "26.6.3", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "dev": true, "requires": { "@jest/transform": "^26.6.2", @@ -62410,14 +67361,12 @@ "dependencies": { "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true } } }, "babel-loader": { "version": "8.2.5", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "requires": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", @@ -62427,7 +67376,6 @@ "dependencies": { "find-cache-dir": { "version": "3.3.1", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -62436,19 +67384,16 @@ }, "find-up": { "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3" }, "loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -62457,50 +67402,42 @@ }, "locate-path": { "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "make-dir": { "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { "semver": "^6.0.0" } }, "p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" } }, "p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "2.2.0" }, "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" }, "pkg-dir": { "version": "4.2.0", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { "find-up": "^4.0.0" } }, "schema-utils": { "version": "2.7.1", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -62508,39 +67445,33 @@ } }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" } } }, "babel-plugin-add-react-displayname": { - "version": "0.0.5", - "integrity": "sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==" + "version": "0.0.5" }, "babel-plugin-apply-mdx-type-prop": { "version": "1.6.22", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", "requires": { "@babel/helper-plugin-utils": "7.10.4", "@mdx-js/util": "1.6.22" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.4", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "version": "7.10.4" } } }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "requires": { "object.assign": "^4.1.0" } }, "babel-plugin-emotion": { "version": "10.0.33", - "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==", "requires": { "@babel/helper-module-imports": "^7.0.0", "@emotion/hash": "0.8.0", @@ -62556,20 +67487,17 @@ }, "babel-plugin-extract-import-names": { "version": "1.6.22", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", "requires": { "@babel/helper-plugin-utils": "7.10.4" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.4", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "version": "7.10.4" } } }, "babel-plugin-istanbul": { "version": "6.0.0", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -62581,7 +67509,6 @@ }, "babel-plugin-jest-hoist": { "version": "26.6.2", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -62592,12 +67519,10 @@ }, "babel-plugin-jsx-remove-data-test-id": { "version": "2.1.3", - "integrity": "sha512-FTpcmzr3avLVStllCT4BceTTZNEb+1mJVtLpsicvXDqjojEkyrga1GGOxWj768Ra3tev6KWgNOhZ/Lrucb+MuQ==", "dev": true }, "babel-plugin-lodash": { "version": "3.3.4", - "integrity": "sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg==", "requires": { "@babel/helper-module-imports": "^7.0.0-beta.49", "@babel/types": "^7.0.0-beta.49", @@ -62608,7 +67533,6 @@ }, "babel-plugin-macros": { "version": "2.8.0", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "requires": { "@babel/runtime": "^7.7.2", "cosmiconfig": "^6.0.0", @@ -62617,7 +67541,6 @@ "dependencies": { "cosmiconfig": { "version": "6.0.0", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -62628,7 +67551,6 @@ }, "parse-json": { "version": "5.0.0", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -62637,32 +67559,26 @@ } }, "path-type": { - "version": "4.0.0", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "version": "4.0.0" } } }, "babel-plugin-named-asset-import": { - "version": "0.3.7", - "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" + "version": "0.3.7" }, "babel-plugin-polyfill-corejs2": { - "version": "0.2.2", - "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "version": "0.3.2", "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.2", + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.2", "semver": "^6.1.1" }, "dependencies": { "@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "version": "0.3.2", "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -62670,45 +67586,37 @@ } }, "debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", "requires": { "ms": "2.1.2" } }, "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.2" }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" } } }, "babel-plugin-polyfill-corejs3": { "version": "0.1.7", - "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", "requires": { "@babel/helper-define-polyfill-provider": "^0.1.5", "core-js-compat": "^3.8.1" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.2.2", - "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "version": "0.4.0", "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2" + "@babel/helper-define-polyfill-provider": "^0.3.2" }, "dependencies": { "@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "version": "0.3.2", "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -62716,25 +67624,21 @@ } }, "debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", "requires": { "ms": "2.1.2" } }, "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.2" }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" } } }, "babel-plugin-react-docgen": { "version": "4.2.1", - "integrity": "sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==", "requires": { "ast-types": "^0.14.2", "lodash": "^4.17.15", @@ -62742,12 +67646,10 @@ } }, "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + "version": "6.18.0" }, "babel-plugin-typescript-to-proptypes": { "version": "2.0.0", - "integrity": "sha512-LmXrkeqg4bzq0CiCOV/zN3hrvAvJOvoP9sEw0YgtkU6lIbqA5/RAY0bA6C6+i5/e5Wp/taJ68XKp2i8pkU+Qmw==", "requires": { "@babel/helper-module-imports": "^7.12.5", "@babel/plugin-syntax-typescript": "^7.12.1", @@ -62756,7 +67658,6 @@ }, "babel-polyfill": { "version": "6.26.0", - "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -62766,19 +67667,16 @@ "dependencies": { "core-js": { "version": "2.6.11", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", "dev": true }, "regenerator-runtime": { "version": "0.10.5", - "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", "dev": true } } }, "babel-preset-current-node-syntax": { "version": "1.0.1", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -62797,7 +67695,6 @@ }, "babel-preset-jest": { "version": "26.6.2", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "dev": true, "requires": { "babel-plugin-jest-hoist": "^26.6.2", @@ -62806,33 +67703,27 @@ }, "babel-runtime": { "version": "6.26.0", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" }, "dependencies": { "core-js": { - "version": "2.6.0", - "integrity": "sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw==" + "version": "2.6.0" }, "regenerator-runtime": { - "version": "0.11.1", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "version": "0.11.1" } } }, "bail": { - "version": "1.0.5", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + "version": "1.0.5" }, "balanced-match": { - "version": "1.0.0", - "integrity": "sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==" + "version": "1.0.0" }, "base": { "version": "0.11.2", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -62845,28 +67736,24 @@ "dependencies": { "define-property": { "version": "1.0.0", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "requires": { "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -62874,22 +67761,18 @@ } }, "kind-of": { - "version": "6.0.2", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.2" } } }, "base16": { - "version": "1.0.0", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + "version": "1.0.0" }, "base64-js": { - "version": "1.5.1", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "version": "1.5.1" }, "basic-auth": { "version": "2.0.1", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, "requires": { "safe-buffer": "5.1.2" @@ -62897,58 +67780,46 @@ }, "batch": { "version": "0.6.1", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, "batch-processor": { - "version": "1.0.0", - "integrity": "sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==" + "version": "1.0.0" }, "bcrypt-pbkdf": { "version": "1.0.2", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "requires": { "tweetnacl": "^0.14.3" } }, "before-after-hook": { - "version": "2.2.2", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", - "dev": true + "version": "2.2.2" }, "better-opn": { "version": "2.1.1", - "integrity": "sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==", "requires": { "open": "^7.0.3" } }, "big-integer": { - "version": "1.6.51", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + "version": "1.6.51" }, "big.js": { - "version": "5.2.2", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + "version": "5.2.2" }, "bignumber.js": { - "version": "9.0.0", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + "version": "9.0.0" }, "binary-extensions": { "version": "1.13.1", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "optional": true }, "binaryextensions": { "version": "4.18.0", - "integrity": "sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==", "dev": true }, "bl": { "version": "4.1.0", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, "requires": { "buffer": "^5.5.0", @@ -62958,7 +67829,6 @@ "dependencies": { "buffer": { "version": "5.7.1", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { "base64-js": "^1.3.1", @@ -62967,12 +67837,10 @@ }, "inherits": { "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -62983,90 +67851,78 @@ } }, "bluebird": { - "version": "3.7.2", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "version": "3.7.2" + }, + "bmpimagejs": { + "version": "1.0.4", + "dev": true }, "bn.js": { - "version": "5.2.0", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + "version": "5.2.0" }, "body-parser": { - "version": "1.19.0", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.2", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" }, "dependencies": { "bytes": { - "version": "3.1.0", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2" }, "http-errors": { - "version": "1.7.2", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" } }, + "inherits": { + "version": "2.0.4" + }, "qs": { - "version": "6.7.0", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.9.7" }, "setprototypeof": { - "version": "1.1.1", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "statuses": { - "version": "1.5.0", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + "version": "1.2.0" } } }, - "bonjour": { - "version": "3.5.0", - "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "bonjour-service": { + "version": "1.0.14", "dev": true, "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, "boolbase": { - "version": "1.0.0", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "version": "1.0.0" }, "bootstrap": { - "version": "3.4.1", - "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==" + "version": "3.4.1" }, "bootstrap-slider": { - "version": "10.4.0", - "integrity": "sha512-ONP9SGV17pr2l3RJHhoX+3qAUDF3ltByQD5rP7Dw2QytOYAL6JjRVOvyFKv/CR+Xq2T7hJtq3NZyDzfX9CZPFw==" + "version": "10.4.0" }, "bowser": { - "version": "1.9.4", - "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" + "version": "1.9.4" }, "boxen": { "version": "5.1.2", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "requires": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", @@ -63079,20 +67935,16 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "version": "5.0.1" }, "camelcase": { - "version": "6.3.0", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + "version": "6.3.0" }, "is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "version": "3.0.0" }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -63101,18 +67953,15 @@ }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } }, "type-fest": { - "version": "0.20.2", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "version": "0.20.2" }, "wrap-ansi": { "version": "7.0.0", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -63122,12 +67971,10 @@ } }, "brace": { - "version": "0.11.1", - "integrity": "sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q==" + "version": "0.11.1" }, "brace-expansion": { "version": "1.1.11", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -63135,7 +67982,6 @@ }, "braces": { "version": "2.3.2", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -63151,7 +67997,6 @@ }, "brfs": { "version": "1.6.1", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", "requires": { "quote-stream": "^1.0.1", "resolve": "^1.1.5", @@ -63161,7 +68006,6 @@ }, "broadcast-channel": { "version": "4.10.0", - "integrity": "sha512-hOUh312XyHk6JTVyX9cyXaH1UYs+2gHVtnW16oQAu9FL7ALcXGXc/YoJWqlkV8vUn14URQPMmRi4A9q4UrwVEQ==", "requires": { "@babel/runtime": "^7.16.0", "detect-node": "^2.1.0", @@ -63174,17 +68018,14 @@ } }, "brorand": { - "version": "1.1.0", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "version": "1.1.0" }, "browser-process-hrtime": { "version": "1.0.0", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, "browserify-aes": { "version": "1.2.0", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -63196,7 +68037,6 @@ }, "browserify-cipher": { "version": "1.0.1", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -63205,7 +68045,6 @@ }, "browserify-des": { "version": "1.0.2", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -63215,7 +68054,6 @@ }, "browserify-rsa": { "version": "4.1.0", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "requires": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -63223,7 +68061,6 @@ }, "browserify-sign": { "version": "4.2.1", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -63237,12 +68074,10 @@ }, "dependencies": { "inherits": { - "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "version": "2.0.4" }, "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -63250,32 +68085,27 @@ } }, "safe-buffer": { - "version": "5.2.1", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "version": "5.2.1" } } }, "browserify-zlib": { "version": "0.2.0", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { "pako": "~1.0.5" } }, "browserslist": { - "version": "4.17.0", - "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", + "version": "4.21.3", "requires": { - "caniuse-lite": "^1.0.30001254", - "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.830", - "escalade": "^3.1.1", - "node-releases": "^1.1.75" + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" } }, "bser": { "version": "2.1.1", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { "node-int64": "^0.4.0" @@ -63283,7 +68113,6 @@ }, "buffer": { "version": "4.9.2", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -63292,52 +68121,33 @@ }, "buffer-crc32": { "version": "0.2.13", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true }, "buffer-equal": { - "version": "0.0.1", - "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==" + "version": "0.0.1" }, "buffer-from": { - "version": "1.1.1", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true + "version": "1.1.1" }, "buffer-xor": { - "version": "1.0.3", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + "version": "1.0.3" }, "builtin-status-codes": { - "version": "3.0.0", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + "version": "3.0.0" }, "builtins": { "version": "1.0.3", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "dev": true - }, - "byline": { - "version": "5.0.0", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", "dev": true }, "byte-size": { "version": "7.0.1", - "integrity": "sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A==", "dev": true }, "bytes": { - "version": "3.0.0", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + "version": "3.0.0" }, "c8": { "version": "7.9.0", - "integrity": "sha512-aQ7dC8gASnKdBwHUuYuzsdKCEDrKnWr7ZuZUnf4CNAL81oyKloKrs7H7zYvcrmCtIrMToudBSUhq2q+LLBMvgg==", "requires": { "@bcoe/v8-coverage": "^0.2.3", "@istanbuljs/schema": "^0.1.2", @@ -63354,12 +68164,10 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "version": "5.0.1" }, "cliui": { "version": "7.0.4", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -63368,48 +68176,40 @@ }, "find-up": { "version": "5.0.0", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "version": "3.0.0" }, "locate-path": { "version": "6.0.0", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { "p-locate": "^5.0.0" } }, "p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { "yocto-queue": "^0.1.0" } }, "p-locate": { "version": "5.0.0", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { "p-limit": "^3.0.2" } }, "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" }, "source-map": { - "version": "0.7.3", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.7.3" }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -63418,14 +68218,12 @@ }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } }, "v8-to-istanbul": { "version": "8.1.0", - "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", "requires": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", @@ -63434,7 +68232,6 @@ }, "wrap-ansi": { "version": "7.0.0", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -63442,12 +68239,10 @@ } }, "y18n": { - "version": "5.0.8", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + "version": "5.0.8" }, "yargs": { "version": "16.2.0", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -63459,14 +68254,12 @@ } }, "yargs-parser": { - "version": "20.2.9", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + "version": "20.2.9" } } }, "cacache": { "version": "12.0.4", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "requires": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -63487,7 +68280,6 @@ "dependencies": { "rimraf": { "version": "2.7.1", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } @@ -63496,7 +68288,6 @@ }, "cache-base": { "version": "1.0.1", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -63511,45 +68302,37 @@ }, "call-bind": { "version": "1.0.2", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, "call-me-maybe": { - "version": "1.0.1", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==" + "version": "1.0.1" }, "callsites": { - "version": "3.1.0", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "version": "3.1.0" }, "camel-case": { "version": "4.1.2", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "requires": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "2.1.0", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + "version": "2.1.0" } } }, "camelcase": { - "version": "5.3.1", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "version": "5.3.1" }, "camelcase-css": { - "version": "2.0.1", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + "version": "2.0.1" }, "camelcase-keys": { "version": "6.2.2", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "requires": { "camelcase": "^5.3.1", @@ -63559,7 +68342,6 @@ }, "caniuse-api": { "version": "3.0.0", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -63569,90 +68351,63 @@ } }, "caniuse-lite": { - "version": "1.0.30001312", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==" + "version": "1.0.30001378" }, "capture-exit": { "version": "2.0.0", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "requires": { "rsvp": "^4.8.4" } }, - "capture-stack-trace": { - "version": "1.0.1", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" - }, - "cardinal": { - "version": "0.4.4", - "integrity": "sha512-3MxV0o9wOpQcobrcSrRpaSxlYkohCcZu0ytOjJUww/Yo/223q4Ecloo7odT+M0SI5kPgb1JhvSaF4EEuVXOLAQ==", - "requires": { - "ansicolors": "~0.2.1", - "redeyed": "~0.4.0" - } - }, "cartocolor": { "version": "4.0.2", - "integrity": "sha512-+Gh9mb6lFxsDOLQlBLPxAHCnWXlg2W8q3AcVwqRcy95TdBbcOU89Wrb6h2Hd/6Ww1Kc1pzXmUdpnWD+xeCG0dg==", "requires": { "colorbrewer": "1.0.0" } }, "case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==" + "version": "2.4.0" }, "caseless": { "version": "0.12.0", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "ccount": { - "version": "1.1.0", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" + "version": "1.1.0" }, "chalk": { "version": "4.1.2", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "change-emitter": { - "version": "0.1.6", - "integrity": "sha512-YXzt1cQ4a2jqazhcuSWEOc1K2q8g9H6eWNsyZgi640LDzRWVQ2eDe+Y/kVdftH+vYdPF2rgDb3dLdpxE1jvAxw==" + "version": "0.1.6" }, "char-regex": { "version": "1.0.2", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, "character-entities": { - "version": "1.2.2", - "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==" + "version": "1.2.2" }, "character-entities-legacy": { - "version": "1.1.2", - "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==" + "version": "1.1.2" }, "character-reference-invalid": { - "version": "1.1.2", - "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==" + "version": "1.1.2" }, "chardet": { "version": "0.7.0", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "devOptional": true + "dev": true }, "charenc": { - "version": "0.0.2", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==" + "version": "0.0.2" }, "cheerio": { "version": "1.0.0-rc.3", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", "dev": true, "requires": { "css-select": "~1.2.0", @@ -63665,7 +68420,6 @@ "dependencies": { "dom-serializer": { "version": "0.1.1", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", "dev": true, "requires": { "domelementtype": "^1.3.0", @@ -63675,8 +68429,7 @@ } }, "chokidar": { - "version": "3.5.2", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -63690,55 +68443,46 @@ "dependencies": { "anymatch": { "version": "3.1.2", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "binary-extensions": { - "version": "2.2.0", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "version": "2.2.0" }, "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "is-binary-path": { "version": "2.1.0", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "requires": { "binary-extensions": "^2.0.0" } }, "is-number": { - "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "version": "7.0.0" }, "normalize-path": { - "version": "3.0.0", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "version": "3.0.0" }, "readdirp": { "version": "3.6.0", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { "is-number": "^7.0.0" } @@ -63746,282 +68490,34 @@ } }, "chownr": { - "version": "1.1.4", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "version": "1.1.4" }, "chromatic": { - "version": "5.10.2", - "integrity": "sha512-JHFtZ16VanQX0X9qjacIJOrH9rVUJACilPs8dBwwQgJTZzgCZAdwgmE+WwLcxe/LuK7vM56BDTHbxC+XcnTsjw==", + "version": "6.7.4", "dev": true, "requires": { - "@actions/core": "^1.5.0", - "@actions/github": "^5.0.0", - "@babel/preset-typescript": "^7.15.0", - "@babel/runtime": "^7.15.3", - "@chromaui/localtunnel": "^2.0.3", - "async-retry": "^1.3.3", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "dotenv": "^8.2.0", - "env-ci": "^5.0.2", - "esm": "^3.2.25", - "execa": "^5.0.0", - "fake-tag": "^2.0.0", - "fs-extra": "^10.0.0", - "https-proxy-agent": "^5.0.0", - "jsonfile": "^6.0.1", - "junit-report-builder": "2.1.0", - "listr": "0.14.3", - "meow": "^8.0.0", - "no-proxy": "^1.0.3", - "node-ask": "^1.0.1", - "node-fetch": "2.6.0", - "node-loggly-bulk": "^2.2.4", - "p-limit": "3.1.0", - "picomatch": "2.2.2", - "pkg-up": "^3.1.0", - "pluralize": "^8.0.0", - "progress-stream": "^2.0.0", - "semver": "^7.3.5", - "slash": "^3.0.0", - "string-argv": "^0.3.1", - "strip-ansi": "6.0.0", - "tmp-promise": "3.0.2", - "tree-kill": "^1.2.2", - "ts-dedent": "^1.0.0", - "util-deprecate": "^1.0.2", - "uuid": "^8.3.2", - "yarn-or-npm": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "execa": { - "version": "5.1.1", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "human-signals": { - "version": "2.1.0", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node-fetch": { - "version": "2.6.0", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "3.0.0", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pkg-up": { - "version": "3.1.0", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "ts-dedent": { - "version": "1.2.0", - "integrity": "sha512-6zSJp23uQI+Txyz5LlXMXAHpUhY4Hi0oluXny0OgIR7g/Cromq4vDBnhtbBdyIV34g0pgwxUvnvg+jLJe4c1NA==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "which": { - "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "@discoveryjs/json-ext": "^0.5.7", + "@types/webpack-env": "^1.17.0" } }, "chrome-trace-event": { "version": "1.0.2", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "requires": { "tslib": "^1.9.0" } }, "chrono-node": { "version": "2.2.6", - "integrity": "sha512-ahgxpY4ihg3frV5t7pZYrS0Iap5MErTQ7whVNBxbiLjplc2HhGwj3zgr0dEnJos/FAuZVjrHoky8J9YiNc5ZKQ==", "requires": { "dayjs": "^1.10.0" } }, "ci-info": { "version": "2.0.0", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "cipher-base": { "version": "1.0.4", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -64029,17 +68525,14 @@ }, "circular-json-es6": { "version": "2.0.2", - "integrity": "sha512-ODYONMMNb3p658Zv+Pp+/XPa5s6q7afhz3Tzyvo+VRh9WIrJ64J76ZC4GQxnlye/NesTn09jvOiuE8+xxfpwhQ==", "dev": true }, "cjs-module-lexer": { "version": "0.6.0", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", "dev": true }, "class-utils": { "version": "0.3.6", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -64049,7 +68542,6 @@ "dependencies": { "define-property": { "version": "0.2.5", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "requires": { "is-descriptor": "^0.1.0" } @@ -64057,87 +68549,51 @@ } }, "classnames": { - "version": "2.2.6", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + "version": "2.3.2" }, "clean-css": { "version": "4.2.3", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "requires": { "source-map": "~0.6.0" }, "dependencies": { "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "clean-stack": { - "version": "2.2.0", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + "version": "2.2.0" }, "cli-boxes": { - "version": "2.2.1", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + "version": "2.2.1" }, "cli-cursor": { "version": "3.1.0", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "devOptional": true, + "dev": true, "requires": { "restore-cursor": "^3.1.0" } }, "cli-spinners": { "version": "2.6.1", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true }, - "cli-table": { - "version": "0.3.9", - "integrity": "sha512-7eA6hFtAZwVx3dWAGoaBqTrzWko5jRUFKpHT64ZHkJpaA3y5wf5NlLjguqTRmqycatJZiwftODYYyGNLbQ7MuA==", - "requires": { - "colors": "1.0.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "colors": { - "version": "1.0.3", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==" - }, - "strip-ansi": { - "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "cli-table3": { "version": "0.6.1", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", "requires": { "colors": "1.4.0", "string-width": "^4.2.0" }, "dependencies": { "ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "version": "5.0.1" }, "is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "version": "3.0.0" }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -64146,7 +68602,6 @@ }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } @@ -64155,12 +68610,10 @@ }, "cli-width": { "version": "3.0.0", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "devOptional": true + "dev": true }, "cliui": { "version": "6.0.0", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -64168,16 +68621,13 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.0" }, "is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "version": "3.0.0" }, "string-width": { "version": "4.2.0", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -64186,24 +68636,14 @@ }, "strip-ansi": { "version": "6.0.0", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { "ansi-regex": "^5.0.0" } } } }, - "clone": { - "version": "2.1.2", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" - }, - "clone-buffer": { - "version": "1.0.0", - "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==" - }, "clone-deep": { "version": "4.0.1", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "requires": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -64211,39 +68651,16 @@ }, "dependencies": { "kind-of": { - "version": "6.0.3", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "version": "6.0.3" } } }, - "clone-stats": { - "version": "1.0.0", - "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==" - }, - "cloneable-readable": { - "version": "1.1.3", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "cmd-shim": { - "version": "4.1.0", - "integrity": "sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw==", - "dev": true, - "requires": { - "mkdirp-infer-owner": "^2.0.0" - } - }, "co": { "version": "4.6.0", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" + "dev": true }, "coa": { "version": "2.0.2", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dev": true, "requires": { "@types/q": "^1.5.1", @@ -64253,7 +68670,6 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -64261,7 +68677,6 @@ }, "chalk": { "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -64271,7 +68686,6 @@ }, "supports-color": { "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -64280,85 +68694,98 @@ } }, "code-point-at": { - "version": "1.1.0", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" + "version": "1.1.0" }, "collapse-white-space": { - "version": "1.0.6", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + "version": "1.0.6" }, "collect-v8-coverage": { "version": "1.0.1", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, "collection-visit": { "version": "1.0.0", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" } }, + "color": { + "version": "3.2.1", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, "color-convert": { "version": "1.9.3", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.3", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "version": "1.1.3" + }, + "color-string": { + "version": "1.9.1", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "color-support": { - "version": "1.1.3", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + "version": "1.1.3" }, "colorbrewer": { - "version": "1.0.0", - "integrity": "sha512-NZuIOVdErK/C6jDH3jWT/roxWJbJAinMiqEpbuWniKvQAoWdg6lGra3pPrSHvaIf8PlX8wLs/RAC6nULFJbgmg==" + "version": "1.0.0" }, "colord": { "version": "2.7.0", - "integrity": "sha512-pZJBqsHz+pYyw3zpX6ZRXWoCHM1/cvFikY9TV8G3zcejCaKE0lhankoj8iScyrrePA8C7yJ5FStfA9zbcOnw7Q==", "dev": true }, "colorette": { "version": "1.4.0", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + "dev": true }, "colors": { "version": "1.4.0", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "optional": true }, "columnify": { - "version": "1.5.4", - "integrity": "sha512-rFl+iXVT1nhLQPfGDw+3WcS8rmm7XsLKUmhsGE3ihzzpIikeGrTaZPIRKYWeLsLBypsHzjXIvYEltVUZS84XxQ==", + "version": "1.6.0", "dev": true, "requires": { - "strip-ansi": "^3.0.0", + "strip-ansi": "^6.0.1", "wcwidth": "^1.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, "combined-stream": { "version": "1.0.8", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "delayed-stream": "~1.0.0" } }, "comma-separated-tokens": { "version": "1.0.5", - "integrity": "sha512-Cg90/fcK93n0ecgYTAz1jaA3zvnQ0ExlmKY1rdbyHqAx6BHxwoJc+J7HDu0iuQ7ixEs1qaa+WyQ6oeuBpYP1iA==", "requires": { "trim": "0.0.1" } }, "command-line-args": { "version": "5.1.1", - "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==", "requires": { "array-back": "^3.0.1", "find-replace": "^3.0.0", @@ -64368,7 +68795,6 @@ }, "command-line-usage": { "version": "6.1.1", - "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==", "requires": { "array-back": "^4.0.1", "chalk": "^2.4.2", @@ -64378,18 +68804,15 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "array-back": { - "version": "4.0.2", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" + "version": "4.0.2" }, "chalk": { "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -64398,32 +68821,30 @@ }, "supports-color": { "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } }, "typical": { - "version": "5.2.0", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" + "version": "5.2.0" } } }, "commander": { - "version": "2.20.3", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "2.20.3" + }, + "common-ancestor-path": { + "version": "1.0.1", + "dev": true }, "common-path-prefix": { - "version": "3.0.0", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + "version": "3.0.0" }, "commondir": { - "version": "1.0.1", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + "version": "1.0.1" }, "compare-func": { "version": "2.0.0", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, "requires": { "array-ify": "^1.0.0", @@ -64432,7 +68853,6 @@ "dependencies": { "dot-prop": { "version": "5.3.0", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { "is-obj": "^2.0.0" @@ -64441,19 +68861,16 @@ } }, "component-emitter": { - "version": "1.2.1", - "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==" + "version": "1.2.1" }, "compressible": { "version": "2.0.18", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { "mime-db": ">= 1.43.0 < 2" } }, "compression": { "version": "1.7.4", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "requires": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -64465,16 +68882,13 @@ } }, "compute-scroll-into-view": { - "version": "1.0.17", - "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==" + "version": "1.0.17" }, "concat-map": { - "version": "0.0.1", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "version": "0.0.1" }, "concat-stream": { "version": "1.6.2", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -64484,7 +68898,6 @@ }, "config-chain": { "version": "1.1.13", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "requires": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -64492,40 +68905,37 @@ }, "confusing-browser-globals": { "version": "1.0.10", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", "dev": true }, "connect-history-api-fallback": { - "version": "1.6.0", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "version": "2.0.0", "dev": true }, "console-browserify": { - "version": "1.2.0", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + "version": "1.2.0" }, "console-control-strings": { - "version": "1.1.0", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "version": "1.1.0" }, "constants-browserify": { - "version": "1.0.0", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + "version": "1.0.0" }, "content-disposition": { - "version": "0.5.3", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1" + } } }, "content-type": { - "version": "1.0.4", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "version": "1.0.4" }, "conventional-changelog-angular": { "version": "5.0.13", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", "dev": true, "requires": { "compare-func": "^2.0.0", @@ -64534,7 +68944,6 @@ }, "conventional-changelog-core": { "version": "4.2.4", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", "dev": true, "requires": { "add-stream": "^1.0.0", @@ -64555,7 +68964,6 @@ "dependencies": { "hosted-git-info": { "version": "4.1.0", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -64563,7 +68971,6 @@ }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -64571,7 +68978,6 @@ }, "normalize-package-data": { "version": "3.0.3", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "requires": { "hosted-git-info": "^4.0.1", @@ -64582,7 +68988,6 @@ }, "read-pkg": { "version": "3.0.0", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "requires": { "load-json-file": "^4.0.0", @@ -64592,12 +68997,10 @@ "dependencies": { "hosted-git-info": { "version": "2.8.9", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "normalize-package-data": { "version": "2.5.0", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", @@ -64608,14 +69011,12 @@ }, "semver": { "version": "5.7.1", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "read-pkg-up": { "version": "3.0.0", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", "dev": true, "requires": { "find-up": "^2.0.0", @@ -64624,7 +69025,6 @@ }, "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -64633,8 +69033,7 @@ } }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -64642,7 +69041,6 @@ }, "through2": { "version": "4.0.2", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { "readable-stream": "3" @@ -64650,19 +69048,16 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "conventional-changelog-preset-loader": { "version": "2.3.4", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", "dev": true }, "conventional-changelog-writer": { "version": "5.0.1", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", "dev": true, "requires": { "conventional-commits-filter": "^2.0.7", @@ -64678,7 +69073,6 @@ "dependencies": { "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -64688,20 +69082,10 @@ }, "semver": { "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "split": { - "version": "1.0.1", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, "through2": { "version": "4.0.2", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { "readable-stream": "3" @@ -64711,7 +69095,6 @@ }, "conventional-commits-filter": { "version": "2.0.7", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", "dev": true, "requires": { "lodash.ismatch": "^4.4.0", @@ -64720,7 +69103,6 @@ }, "conventional-commits-parser": { "version": "3.2.4", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", "dev": true, "requires": { "is-text-path": "^1.0.1", @@ -64733,7 +69115,6 @@ "dependencies": { "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -64743,7 +69124,6 @@ }, "through2": { "version": "4.0.2", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { "readable-stream": "3" @@ -64753,7 +69133,6 @@ }, "conventional-recommended-bump": { "version": "6.1.0", - "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", "dev": true, "requires": { "concat-stream": "^2.0.0", @@ -64768,7 +69147,6 @@ "dependencies": { "concat-stream": { "version": "2.0.0", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -64779,7 +69157,6 @@ }, "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -64791,18 +69168,16 @@ }, "convert-source-map": { "version": "1.8.0", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "requires": { "safe-buffer": "~5.1.1" } }, "cookie": { "version": "0.4.0", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "dev": true }, "cookie-parser": { "version": "1.4.5", - "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", "dev": true, "requires": { "cookie": "0.4.0", @@ -64810,12 +69185,10 @@ } }, "cookie-signature": { - "version": "1.0.6", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "version": "1.0.6" }, "copy-concurrently": { "version": "1.0.5", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -64827,7 +69200,6 @@ "dependencies": { "rimraf": { "version": "2.7.1", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } @@ -64835,19 +69207,16 @@ } }, "copy-descriptor": { - "version": "0.1.1", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==" + "version": "0.1.1" }, "copy-to-clipboard": { "version": "3.3.1", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", "requires": { "toggle-selection": "^1.0.6" } }, "copy-webpack-plugin": { "version": "9.0.1", - "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", "dev": true, "requires": { "fast-glob": "^3.2.5", @@ -64861,7 +69230,6 @@ "dependencies": { "glob-parent": { "version": "6.0.1", - "integrity": "sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -64869,12 +69237,10 @@ }, "normalize-path": { "version": "3.0.0", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { "yocto-queue": "^0.1.0" @@ -64882,7 +69248,6 @@ }, "serialize-javascript": { "version": "6.0.0", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -64891,53 +69256,28 @@ } }, "core-js": { - "version": "3.18.1", - "integrity": "sha512-vJlUi/7YdlCZeL6fXvWNaLUPh/id12WXj3MbkMw5uOyF0PfWPBNOCNbs53YqgrvtujLNlt9JQpruyIKkUZ+PKA==" + "version": "3.24.1" }, "core-js-compat": { - "version": "3.18.1", - "integrity": "sha512-XJMYx58zo4W0kLPmIingVZA10+7TuKrMLPt83+EzDmxFJQUMcTVVmQ+n5JP4r6Z14qSzhQBRi3NSWoeVyKKXUg==", + "version": "3.24.1", "requires": { - "browserslist": "^4.17.1", + "browserslist": "^4.21.3", "semver": "7.0.0" }, "dependencies": { - "browserslist": { - "version": "4.17.1", - "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", - "requires": { - "caniuse-lite": "^1.0.30001259", - "electron-to-chromium": "^1.3.846", - "escalade": "^3.1.1", - "nanocolors": "^0.1.5", - "node-releases": "^1.1.76" - } - }, - "electron-to-chromium": { - "version": "1.3.853", - "integrity": "sha512-W4U8n+U8I5/SUaFcqZgbKRmYZwcyEIQVBDf+j5QQK6xChjXnQD+wj248eGR9X4u+dDmDR//8vIfbu4PrdBBIoQ==" - }, - "node-releases": { - "version": "1.1.76", - "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==" - }, "semver": { - "version": "7.0.0", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + "version": "7.0.0" } } }, "core-js-pure": { - "version": "3.19.1", - "integrity": "sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==" + "version": "3.19.1" }, "core-util-is": { - "version": "1.0.2", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "version": "1.0.2" }, "cors": { "version": "2.8.5", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "requires": { "object-assign": "^4", @@ -64946,7 +69286,6 @@ }, "cosmiconfig": { "version": "7.0.1", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -64957,7 +69296,6 @@ "dependencies": { "parse-json": { "version": "5.2.0", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -64966,14 +69304,12 @@ } }, "path-type": { - "version": "4.0.0", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "version": "4.0.0" } } }, "cp-file": { "version": "7.0.0", - "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==", "requires": { "graceful-fs": "^4.1.2", "make-dir": "^3.0.0", @@ -64983,20 +69319,17 @@ "dependencies": { "make-dir": { "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { "semver": "^6.0.0" } }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" } } }, "cpy": { "version": "8.1.2", - "integrity": "sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==", "requires": { "arrify": "^2.0.1", "cp-file": "^7.0.0", @@ -65010,30 +69343,25 @@ }, "dependencies": { "@nodelib/fs.stat": { - "version": "1.1.3", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + "version": "1.1.3" }, "array-union": { "version": "1.0.2", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "requires": { "array-uniq": "^1.0.1" } }, "arrify": { - "version": "2.0.1", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + "version": "2.0.1" }, "dir-glob": { "version": "2.2.2", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "requires": { "path-type": "^3.0.0" } }, "fast-glob": { "version": "2.2.7", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", "requires": { "@mrmlnc/readdir-enhanced": "^2.2.1", "@nodelib/fs.stat": "^1.1.2", @@ -65045,7 +69373,6 @@ }, "glob-parent": { "version": "3.1.0", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -65053,7 +69380,6 @@ "dependencies": { "is-glob": { "version": "3.1.0", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", "requires": { "is-extglob": "^2.1.0" } @@ -65062,7 +69388,6 @@ }, "globby": { "version": "9.2.0", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", "requires": { "@types/glob": "^7.1.1", "array-union": "^1.0.2", @@ -65076,41 +69401,49 @@ }, "p-map": { "version": "3.0.0", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "requires": { "aggregate-error": "^3.0.0" } }, "pify": { - "version": "4.0.1", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "version": "4.0.1" } } }, "create-ecdh": { "version": "4.0.4", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "requires": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" }, "dependencies": { "bn.js": { - "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.0" } } }, - "create-error-class": { - "version": "3.0.2", - "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "create-emotion": { + "version": "10.0.27", "requires": { - "capture-stack-trace": "^1.0.0" + "@emotion/cache": "^10.0.27", + "@emotion/serialize": "^0.11.15", + "@emotion/sheet": "0.9.4", + "@emotion/utils": "0.11.3" + }, + "dependencies": { + "@emotion/cache": { + "version": "10.0.29", + "requires": { + "@emotion/sheet": "0.9.4", + "@emotion/stylis": "0.8.5", + "@emotion/utils": "0.11.3", + "@emotion/weak-memoize": "0.2.5" + } + } } }, "create-hash": { "version": "1.2.0", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -65121,7 +69454,6 @@ }, "create-hmac": { "version": "1.1.7", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -65133,7 +69465,6 @@ }, "cross-env": { "version": "5.2.0", - "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", "dev": true, "requires": { "cross-spawn": "^6.0.5", @@ -65142,7 +69473,7 @@ }, "cross-spawn": { "version": "6.0.5", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -65152,12 +69483,10 @@ } }, "crypt": { - "version": "0.0.2", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==" + "version": "0.0.2" }, "crypto-browserify": { "version": "3.12.0", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -65174,7 +69503,6 @@ }, "css": { "version": "3.0.0", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", "dev": true, "requires": { "inherits": "^2.0.4", @@ -65184,17 +69512,14 @@ "dependencies": { "inherits": { "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-resolve": { "version": "0.6.0", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", "dev": true, "requires": { "atob": "^2.1.2", @@ -65205,7 +69530,6 @@ }, "css-in-js-utils": { "version": "2.0.1", - "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", "requires": { "hyphenate-style-name": "^1.0.2", "isobject": "^3.0.1" @@ -65213,7 +69537,6 @@ }, "css-loader": { "version": "6.5.1", - "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", "dev": true, "requires": { "icss-utils": "^5.1.0", @@ -65228,7 +69551,6 @@ "dependencies": { "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -65236,7 +69558,6 @@ }, "semver": { "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -65244,14 +69565,12 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "css-minimizer-webpack-plugin": { "version": "3.0.2", - "integrity": "sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ==", "dev": true, "requires": { "cssnano": "^5.0.6", @@ -65265,17 +69584,14 @@ "dependencies": { "commander": { "version": "7.2.0", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true }, "css-color-names": { "version": "1.0.1", - "integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==", "dev": true }, "css-declaration-sorter": { "version": "6.1.3", - "integrity": "sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==", "dev": true, "requires": { "timsort": "^0.3.0" @@ -65283,7 +69599,6 @@ }, "css-select": { "version": "4.1.3", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "dev": true, "requires": { "boolbase": "^1.0.0", @@ -65295,7 +69610,6 @@ }, "css-tree": { "version": "1.1.3", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, "requires": { "mdn-data": "2.0.14", @@ -65303,13 +69617,11 @@ } }, "css-what": { - "version": "5.0.1", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "version": "5.1.0", "dev": true }, "cssnano": { "version": "5.0.8", - "integrity": "sha512-Lda7geZU0Yu+RZi2SGpjYuQz4HI4/1Y+BhdD0jL7NXAQ5larCzVn+PUGuZbDMYz904AXXCOgO5L1teSvgu7aFg==", "dev": true, "requires": { "cssnano-preset-default": "^5.1.4", @@ -65320,7 +69632,6 @@ }, "cssnano-preset-default": { "version": "5.1.4", - "integrity": "sha512-sPpQNDQBI3R/QsYxQvfB4mXeEcWuw0wGtKtmS5eg8wudyStYMgKOQT39G07EbW1LB56AOYrinRS9f0ig4Y3MhQ==", "dev": true, "requires": { "css-declaration-sorter": "^6.0.3", @@ -65356,7 +69667,6 @@ }, "dom-serializer": { "version": "1.3.2", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, "requires": { "domelementtype": "^2.0.1", @@ -65366,12 +69676,10 @@ }, "domelementtype": { "version": "2.2.0", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", "dev": true }, "domhandler": { "version": "4.2.2", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", "dev": true, "requires": { "domelementtype": "^2.2.0" @@ -65379,7 +69687,6 @@ }, "domutils": { "version": "2.8.0", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { "dom-serializer": "^1.0.1", @@ -65389,17 +69696,14 @@ }, "entities": { "version": "2.2.0", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true }, "has-flag": { "version": "4.0.0", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-worker": { "version": "27.2.0", - "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", "dev": true, "requires": { "@types/node": "*", @@ -65409,7 +69713,6 @@ }, "nth-check": { "version": "2.0.0", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", "dev": true, "requires": { "boolbase": "^1.0.0" @@ -65417,7 +69720,6 @@ }, "p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { "yocto-queue": "^0.1.0" @@ -65425,7 +69727,6 @@ }, "postcss-calc": { "version": "8.0.0", - "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.2", @@ -65434,7 +69735,6 @@ }, "postcss-colormin": { "version": "5.2.0", - "integrity": "sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==", "dev": true, "requires": { "browserslist": "^4.16.6", @@ -65445,7 +69745,6 @@ }, "postcss-convert-values": { "version": "5.0.1", - "integrity": "sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==", "dev": true, "requires": { "postcss-value-parser": "^4.1.0" @@ -65453,27 +69752,22 @@ }, "postcss-discard-comments": { "version": "5.0.1", - "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", "dev": true }, "postcss-discard-duplicates": { "version": "5.0.1", - "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", "dev": true }, "postcss-discard-empty": { "version": "5.0.1", - "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", "dev": true }, "postcss-discard-overridden": { "version": "5.0.1", - "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==", "dev": true }, "postcss-merge-longhand": { "version": "5.0.2", - "integrity": "sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==", "dev": true, "requires": { "css-color-names": "^1.0.1", @@ -65483,7 +69777,6 @@ }, "postcss-merge-rules": { "version": "5.0.2", - "integrity": "sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==", "dev": true, "requires": { "browserslist": "^4.16.6", @@ -65495,7 +69788,6 @@ }, "postcss-minify-font-values": { "version": "5.0.1", - "integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==", "dev": true, "requires": { "postcss-value-parser": "^4.1.0" @@ -65503,7 +69795,6 @@ }, "postcss-minify-gradients": { "version": "5.0.2", - "integrity": "sha512-7Do9JP+wqSD6Prittitt2zDLrfzP9pqKs2EcLX7HJYxsxCOwrrcLt4x/ctQTsiOw+/8HYotAoqNkrzItL19SdQ==", "dev": true, "requires": { "colord": "^2.6", @@ -65513,7 +69804,6 @@ }, "postcss-minify-params": { "version": "5.0.1", - "integrity": "sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==", "dev": true, "requires": { "alphanum-sort": "^1.0.2", @@ -65525,7 +69815,6 @@ }, "postcss-minify-selectors": { "version": "5.1.0", - "integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==", "dev": true, "requires": { "alphanum-sort": "^1.0.2", @@ -65534,12 +69823,10 @@ }, "postcss-normalize-charset": { "version": "5.0.1", - "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", "dev": true }, "postcss-normalize-display-values": { "version": "5.0.1", - "integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==", "dev": true, "requires": { "cssnano-utils": "^2.0.1", @@ -65548,7 +69835,6 @@ }, "postcss-normalize-positions": { "version": "5.0.1", - "integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==", "dev": true, "requires": { "postcss-value-parser": "^4.1.0" @@ -65556,7 +69842,6 @@ }, "postcss-normalize-repeat-style": { "version": "5.0.1", - "integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==", "dev": true, "requires": { "cssnano-utils": "^2.0.1", @@ -65565,7 +69850,6 @@ }, "postcss-normalize-string": { "version": "5.0.1", - "integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==", "dev": true, "requires": { "postcss-value-parser": "^4.1.0" @@ -65573,7 +69857,6 @@ }, "postcss-normalize-timing-functions": { "version": "5.0.1", - "integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==", "dev": true, "requires": { "cssnano-utils": "^2.0.1", @@ -65582,7 +69865,6 @@ }, "postcss-normalize-unicode": { "version": "5.0.1", - "integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==", "dev": true, "requires": { "browserslist": "^4.16.0", @@ -65591,7 +69873,6 @@ }, "postcss-normalize-url": { "version": "5.0.2", - "integrity": "sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==", "dev": true, "requires": { "is-absolute-url": "^3.0.3", @@ -65601,7 +69882,6 @@ }, "postcss-normalize-whitespace": { "version": "5.0.1", - "integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==", "dev": true, "requires": { "postcss-value-parser": "^4.1.0" @@ -65609,7 +69889,6 @@ }, "postcss-ordered-values": { "version": "5.0.2", - "integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==", "dev": true, "requires": { "cssnano-utils": "^2.0.1", @@ -65618,7 +69897,6 @@ }, "postcss-reduce-initial": { "version": "5.0.1", - "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", "dev": true, "requires": { "browserslist": "^4.16.0", @@ -65627,7 +69905,6 @@ }, "postcss-reduce-transforms": { "version": "5.0.1", - "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", "dev": true, "requires": { "cssnano-utils": "^2.0.1", @@ -65636,7 +69913,6 @@ }, "postcss-svgo": { "version": "5.0.2", - "integrity": "sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==", "dev": true, "requires": { "postcss-value-parser": "^4.1.0", @@ -65645,7 +69921,6 @@ }, "postcss-unique-selectors": { "version": "5.0.1", - "integrity": "sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==", "dev": true, "requires": { "alphanum-sort": "^1.0.2", @@ -65655,7 +69930,6 @@ }, "serialize-javascript": { "version": "6.0.0", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -65663,12 +69937,10 @@ }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "stylehacks": { "version": "5.0.1", - "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", "dev": true, "requires": { "browserslist": "^4.16.0", @@ -65677,7 +69949,6 @@ }, "supports-color": { "version": "8.1.1", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -65685,7 +69956,6 @@ }, "svgo": { "version": "2.5.0", - "integrity": "sha512-FSdBOOo271VyF/qZnOn1PgwCdt1v4Dx0Sey+U1jgqm1vqRYjPGdip0RGrFW6ItwtkBB8rHgHk26dlVr0uCs82Q==", "dev": true, "requires": { "@trysound/sax": "0.1.1", @@ -65701,7 +69971,6 @@ }, "css-select": { "version": "1.2.0", - "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", "dev": true, "requires": { "boolbase": "~1.0.0", @@ -65712,12 +69981,10 @@ }, "css-select-base-adapter": { "version": "0.1.1", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, "css-tree": { "version": "1.0.0-alpha.37", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, "requires": { "mdn-data": "2.0.4", @@ -65726,46 +69993,37 @@ "dependencies": { "mdn-data": { "version": "2.0.4", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "css-what": { - "version": "2.1.2", - "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", + "version": "2.1.3", "dev": true }, "css.escape": { "version": "1.5.1", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", "dev": true }, "csscolorparser": { - "version": "1.0.3", - "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" + "version": "1.0.3" }, "cssesc": { - "version": "3.0.0", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + "version": "3.0.0" }, "cssfilter": { - "version": "0.0.10", - "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + "version": "0.0.10" }, "cssnano-utils": { "version": "2.0.1", - "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==", "dev": true }, "csso": { "version": "4.2.0", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, "requires": { "css-tree": "^1.1.2" @@ -65773,7 +70031,6 @@ "dependencies": { "css-tree": { "version": "1.1.3", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, "requires": { "mdn-data": "2.0.14", @@ -65782,19 +70039,16 @@ }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "cssom": { - "version": "0.4.4", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "version": "0.5.0", "dev": true }, "cssstyle": { "version": "2.3.0", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "requires": { "cssom": "~0.3.6" @@ -65802,49 +70056,42 @@ "dependencies": { "cssom": { "version": "0.3.8", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true } } }, "csstype": { - "version": "2.6.9", - "integrity": "sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q==" + "version": "2.6.9" + }, + "currencyformatter.js": { + "version": "2.2.0" }, "cyclist": { - "version": "1.0.1", - "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==" + "version": "1.0.1" }, "d3": { - "version": "3.5.17", - "integrity": "sha512-yFk/2idb8OHPKkbAL8QaOaqENNoMhIaSHZerk3oQsECwkObkCpJyjYwCe+OHiq6UEdhe1m8ZGARRRO3ljFjlKg==" + "version": "3.5.17" }, "d3-array": { - "version": "1.2.4", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + "version": "1.2.4" }, "d3-cloud": { "version": "1.2.5", - "integrity": "sha512-4s2hXZgvs0CoUIw31oBAGrHt9Kt/7P9Ik5HIVzISFiWkD0Ga2VLAuO/emO/z1tYIpE7KG2smB4PhMPfFMJpahw==", "requires": { "d3-dispatch": "^1.0.3" } }, "d3-collection": { - "version": "1.0.7", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + "version": "1.0.7" }, "d3-color": { - "version": "1.4.1", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + "version": "1.4.1" }, "d3-dispatch": { - "version": "1.0.6", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + "version": "1.0.6" }, "d3-drag": { "version": "1.2.5", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", "requires": { "d3-dispatch": "1", "d3-selection": "1" @@ -65852,7 +70099,6 @@ }, "d3-dsv": { "version": "1.2.0", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", "requires": { "commander": "2", "iconv-lite": "0.4", @@ -65860,46 +70106,37 @@ } }, "d3-ease": { - "version": "1.0.7", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + "version": "1.0.7" }, "d3-format": { - "version": "1.3.2", - "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" + "version": "1.3.2" }, "d3-geo-projection": { "version": "0.2.16", - "integrity": "sha512-NB4/NRMnfJnpodvRbNY/nOzuoU17P229ASYf2l1GwjZyfD7l5aIuMylDMbIBF4y42BGZZvGdUwFW8iFM/5UBzg==", "requires": { "brfs": "^1.3.0" } }, "d3-hexbin": { - "version": "0.2.2", - "integrity": "sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==" + "version": "0.2.2" }, "d3-hierarchy": { - "version": "1.1.9", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + "version": "1.1.9" }, "d3-interpolate": { "version": "1.4.0", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", "requires": { "d3-color": "1" } }, "d3-path": { - "version": "1.0.7", - "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" + "version": "1.0.7" }, "d3-queue": { - "version": "2.0.3", - "integrity": "sha512-ejbdHqZYEmk9ns/ljSbEcD6VRiuNwAkZMdFf6rsUb3vHROK5iMFd8xewDQnUVr6m/ba2BG63KmR/LySfsluxbg==" + "version": "2.0.3" }, "d3-sankey": { "version": "0.4.2", - "integrity": "sha512-+EQUnk4yFS7kvLmNce7DbjVQqsK7oAd7Cwe2MkNnPssZbELXQvTFRMCKa0Vq9rw6Csrg0ASVJRBBTFaZz2fq8A==", "requires": { "d3-array": "1", "d3-collection": "1", @@ -65908,7 +70145,6 @@ }, "d3-sankey-diagram": { "version": "0.7.3", - "integrity": "sha512-k9DOe7MaLWhWV6J/aqY/CGw88Briu8drTQ+uGGyQg55MIR2WXjKUXryLs0ONFmRQkOSH1F+TSz5XiMc4KwKtuA==", "requires": { "d3-array": "^1.0.2", "d3-collection": "^1.0.2", @@ -65922,7 +70158,6 @@ }, "d3-scale": { "version": "2.2.2", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", "requires": { "d3-array": "^1.2.0", "d3-collection": "1", @@ -65934,45 +70169,37 @@ }, "d3-scale-chromatic": { "version": "2.0.0", - "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", "requires": { "d3-color": "1 - 2", "d3-interpolate": "1 - 2" } }, "d3-selection": { - "version": "1.4.2", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + "version": "1.4.2" }, "d3-shape": { "version": "1.2.2", - "integrity": "sha512-hUGEozlKecFZ2bOSNt7ENex+4Tk9uc/m0TtTEHBvitCBxUNjhzm5hS2GrrVRD/ae4IylSmxGeqX5tWC2rASMlQ==", "requires": { "d3-path": "1" } }, "d3-svg-legend": { - "version": "1.13.0", - "integrity": "sha512-0tMqbamHBfps/GwUO8v1ZXlPKneu0vJLj9R94I1h5/uhDKaYXfbEcqV/1c8NxVHgHEp/UoRLvrGBl9j0s7Hk9Q==" + "version": "1.13.0" }, "d3-time": { - "version": "1.0.10", - "integrity": "sha512-hF+NTLCaJHF/JqHN5hE8HVGAXPStEq6/omumPE/SxyHVrR7/qQxusFDo0t0c/44+sCGHthC7yNGFZIEgju0P8g==" + "version": "1.0.10" }, "d3-time-format": { "version": "2.3.0", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", "requires": { "d3-time": "1" } }, "d3-timer": { - "version": "1.0.10", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + "version": "1.0.10" }, "d3-tip": { "version": "0.9.1", - "integrity": "sha512-EVBfG9d+HnjIoyVXfhpytWxlF59JaobwizqMX9EBXtsFmJytjwHeYiUs74ldHQjE7S9vzfKTx2LCtvUrIbuFYg==", "requires": { "d3-collection": "^1.0.4", "d3-selection": "^1.3.0" @@ -65980,7 +70207,6 @@ }, "d3-transition": { "version": "1.3.2", - "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", "requires": { "d3-color": "1", "d3-dispatch": "1", @@ -65991,12 +70217,10 @@ } }, "d3-voronoi": { - "version": "1.1.4", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + "version": "1.1.4" }, "d3-zoom": { "version": "1.8.3", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", "requires": { "d3-dispatch": "1", "d3-drag": "1", @@ -66007,60 +70231,58 @@ }, "damerau-levenshtein": { "version": "1.0.8", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, "dargs": { - "version": "7.0.0", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true + "version": "7.0.0" }, "dashdash": { "version": "1.14.1", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, + "data-uri-to-buffer": { + "version": "3.0.1", + "dev": true + }, "data-urls": { - "version": "2.0.0", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "version": "3.0.2", "dev": true, "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" }, "dependencies": { "tr46": { - "version": "2.0.2", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "3.0.0", "dev": true, "requires": { "punycode": "^2.1.1" } }, "webidl-conversions": { - "version": "6.1.0", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "version": "7.0.0", + "dev": true + }, + "whatwg-mimetype": { + "version": "3.0.0", "dev": true }, "whatwg-url": { - "version": "8.4.0", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "11.0.0", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" } } } }, "datamaps": { "version": "0.5.9", - "integrity": "sha512-GUXpO713URNzaExVUgBtqA5fr2UuxUG/fVitI04zEFHVL2FHSjd672alHq8E16oQqRNzF0m1bmx8WlTnDrGSqQ==", "requires": { "@types/d3": "3.5.38", "d3": "^3.5.6", @@ -66069,55 +70291,46 @@ }, "datatables.net": { "version": "1.11.3", - "integrity": "sha512-VMj5qEaTebpNurySkM6jy6sGpl+s6onPK8xJhYr296R/vUBnz1+id16NVqNf9z5aR076OGcpGHCuiTuy4E05oQ==", "requires": { "jquery": ">=1.7" } }, "datatables.net-bs": { "version": "1.11.3", - "integrity": "sha512-Db1YwAhO0QAWQbZTsKriUrOInT66+xaA+fV616KTKpQt5Zt+p6OsEKK+xv8LxLgG8qu5dPwMBlkhqSiS/hV2sg==", "requires": { "datatables.net": ">=1.10.25", "jquery": ">=1.7" } }, "date-fns": { - "version": "2.16.1", - "integrity": "sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==" + "version": "2.29.3" }, "date-format": { "version": "0.0.2", - "integrity": "sha512-M4obuJx8jU5T91lcbwi0+QPNVaWOY1DQYz5xUuKYWO93osVzB2ZPqyDUc5T+mDjbA1X8VOb4JDZ+8r2MrSOp7Q==", "dev": true }, "dateformat": { "version": "3.0.3", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" + "dev": true }, "dayjs": { - "version": "1.10.7", - "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" + "version": "1.10.7" }, "debug": { "version": "2.6.9", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "debuglog": { "version": "1.0.1", - "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", "dev": true }, "decamelize": { - "version": "1.2.0", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + "version": "1.2.0" }, "decamelize-keys": { "version": "1.1.0", - "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", "dev": true, "requires": { "decamelize": "^1.1.0", @@ -66126,19 +70339,16 @@ "dependencies": { "map-obj": { "version": "1.0.1", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true } } }, "decimal.js": { "version": "10.3.1", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", "dev": true }, "deck.gl": { "version": "8.5.2", - "integrity": "sha512-tsEyv62Zzc+GT3By0Y1R2gqEJ8K3tGBDaLprAoeAsg7fvIa5ikFBdWEBFHa1UDbgE2UEmYbcBK/yK4GAL8Ia4A==", "requires": { "@deck.gl/aggregation-layers": "8.5.2", "@deck.gl/carto": "8.5.2", @@ -66155,41 +70365,23 @@ }, "decode-named-character-reference": { "version": "1.0.2", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", "requires": { "character-entities": "^2.0.0" }, "dependencies": { "character-entities": { - "version": "2.0.2", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" + "version": "2.0.2" } } }, "decode-uri-component": { - "version": "0.2.0", - "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==" + "version": "0.2.2" }, "dedent": { - "version": "0.7.0", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" - }, - "deep-equal": { - "version": "1.1.1", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } + "version": "0.7.0" }, "deep-equal-ident": { "version": "1.1.1", - "integrity": "sha512-aWv7VhTl/Lju1zenOD3E1w8PpUVrTDbwXCHtbSNr+p/uadr49Y1P1ld0W3Pl6gbvIbiRjoCVsqw70UupCNGh6g==", "dev": true, "requires": { "lodash.isequal": "^3.0" @@ -66197,7 +70389,6 @@ "dependencies": { "lodash.isequal": { "version": "3.0.4", - "integrity": "sha512-Bsu5fP9Omd+HBk2Dz8qp4BHbC+83DBykZ87Lz1JmPKTVNy4Q0XQVtUrbfXVAK/udQrWNcGStcKSA9yj/Zkm3TQ==", "dev": true, "requires": { "lodash._baseisequal": "^3.0.0", @@ -66207,24 +70398,19 @@ } }, "deep-extend": { - "version": "0.6.0", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "version": "0.6.0" }, "deep-is": { - "version": "0.1.3", - "integrity": "sha512-GtxAN4HvBachZzm4OnWqc45ESpUCMwkYcsjnsPs23FwJbsO+k4t0k9bQCgOmzIlpHO28+WPK/KRbRk0DDHuuDw==" + "version": "0.1.3" }, "deep-object-diff": { - "version": "1.1.0", - "integrity": "sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==" + "version": "1.1.0" }, "deepmerge": { - "version": "1.5.2", - "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==" + "version": "1.5.2" }, "default-gateway": { "version": "6.0.3", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "requires": { "execa": "^5.0.0" @@ -66232,7 +70418,6 @@ "dependencies": { "cross-spawn": { "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -66242,7 +70427,6 @@ }, "execa": { "version": "5.1.1", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -66258,22 +70442,18 @@ }, "get-stream": { "version": "6.0.1", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "human-signals": { "version": "2.1.0", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "is-stream": { "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "npm-run-path": { "version": "4.0.1", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" @@ -66281,12 +70461,10 @@ }, "path-key": { "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "shebang-command": { "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" @@ -66294,12 +70472,10 @@ }, "shebang-regex": { "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -66309,7 +70485,6 @@ }, "defaults": { "version": "1.0.3", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", "dev": true, "requires": { "clone": "^1.0.2" @@ -66317,26 +70492,23 @@ "dependencies": { "clone": { "version": "1.0.4", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true } } }, "define-lazy-prop": { "version": "2.0.0", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true }, "define-properties": { - "version": "1.1.3", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "define-property": { "version": "2.0.2", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -66344,21 +70516,18 @@ "dependencies": { "is-accessor-descriptor": { "version": "1.0.0", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -66366,68 +70535,81 @@ } }, "kind-of": { - "version": "6.0.3", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "version": "6.0.3" + } + } + }, + "degenerator": { + "version": "3.0.2", + "dev": true, + "requires": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + }, + "dependencies": { + "ast-types": { + "version": "0.13.4", + "dev": true, + "requires": { + "tslib": "^2.0.1" + } + }, + "esprima": { + "version": "4.0.1", + "dev": true + }, + "tslib": { + "version": "2.4.1", + "dev": true } } }, "delayed-stream": { - "version": "1.0.0", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + "version": "1.0.0" }, "delegates": { - "version": "1.0.0", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "version": "1.0.0" }, "depd": { - "version": "1.1.2", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + "version": "1.1.2" }, "deprecation": { - "version": "2.3.1", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true + "version": "2.3.1" }, "dequal": { - "version": "2.0.3", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + "version": "2.0.3" }, "des.js": { "version": "1.0.1", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "destroy": { - "version": "1.0.4", - "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + "version": "1.0.4" }, "detab": { "version": "2.0.4", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", "requires": { "repeat-string": "^1.5.4" } }, "detect-indent": { "version": "6.1.0", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true }, "detect-newline": { "version": "3.1.0", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, "detect-node": { - "version": "2.1.0", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "version": "2.1.0" }, "detect-port": { "version": "1.3.0", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", "requires": { "address": "^1.0.1", "debug": "^2.6.0" @@ -66435,12 +70617,10 @@ }, "devtools-protocol": { "version": "0.0.901419", - "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", "dev": true }, "dezalgo": { "version": "1.0.3", - "integrity": "sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==", "dev": true, "requires": { "asap": "^2.0.0", @@ -66449,20 +70629,17 @@ }, "diff": { "version": "4.0.2", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + "dev": true }, "diff-match-patch": { - "version": "1.0.5", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==" + "version": "1.0.5" }, "diff-sequences": { "version": "26.6.2", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", "dev": true }, "diffie-hellman": { "version": "5.0.3", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -66470,39 +70647,33 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.0" } } }, "dir-glob": { "version": "3.0.1", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "requires": { "path-type": "^4.0.0" }, "dependencies": { "path-type": { - "version": "4.0.0", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "version": "4.0.0" } } }, "discontinuous-range": { "version": "1.0.0", - "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", "dev": true }, "distributions": { "version": "1.1.0", - "integrity": "sha512-mufW9T1kRlzLVAaekUhgdfcMgX2r/zYQmJx3sGdUAwe0/JSQWey0XgqiDtfUUqYcr/QWHCnBd2M/v45tS/+YAQ==", "requires": { "mathfn": "^1.0.0" } }, "dnd-core": { "version": "11.1.3", - "integrity": "sha512-QugF55dNW+h+vzxVJ/LSJeTeUw9MCJ2cllhmVThVPEtF16ooBkxj0WBE5RB+AceFxMFo1rO6bJKXtqKl+JNnyA==", "requires": { "@react-dnd/asap": "^4.0.0", "@react-dnd/invariant": "^2.0.0", @@ -66511,59 +70682,42 @@ }, "dns-equal": { "version": "1.0.0", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", "dev": true }, "dns-packet": { - "version": "1.3.4", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "version": "5.4.0", "dev": true, "requires": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" } }, "doctrine": { "version": "3.0.0", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "requires": { "esutils": "^2.0.2" } }, "dom-accessibility-api": { "version": "0.5.4", - "integrity": "sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ==", "dev": true }, "dom-align": { - "version": "1.12.0", - "integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA==" + "version": "1.12.0" }, "dom-converter": { "version": "0.2.0", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "requires": { "utila": "~0.4" } }, "dom-helpers": { "version": "3.4.0", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", "requires": { "@babel/runtime": "^7.1.2" } }, "dom-serializer": { "version": "0.1.0", - "integrity": "sha512-Fql7PX6CmQNVmoLfp7DlmvFMIL5cwLbm302SycA2iAMr95t1ITX4ilIsUG75rYtMiVLb4EMC5b2o7ApEpIXROg==", "dev": true, "requires": { "domelementtype": "~1.1.1", @@ -66572,58 +70726,48 @@ "dependencies": { "domelementtype": { "version": "1.1.3", - "integrity": "sha512-zEvAAsFY0DeHkrqWBRkSsmgaE7yADgpez40JUFjISb+uzSinl2F6QbG4lMEBE4P06gCGF6VnsykmbNgu7ZIHzA==", "dev": true } } }, "dom-to-image-more": { - "version": "2.10.1", - "integrity": "sha512-gMG28V47WGj5/xvrsbSPJAWSaV7CBh4teLErn1iGD1sa29HsFsHxvnoLj8VxVvfqnjPgsiUGs2IV2VAxLJGb+A==" + "version": "2.10.1" }, "dom-walk": { - "version": "0.1.1", - "integrity": "sha512-8CGZnLAdYN/o0SHjlP3nLvliHpi2f/prVU63/Hc4DTDpBgsNVAJekegjFtxfZ7NTUEDzHUByjX1gT3eYakIKqg==" + "version": "0.1.1" }, "domain-browser": { - "version": "1.2.0", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + "version": "1.2.0" }, "domelementtype": { "version": "1.3.1", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domexception": { - "version": "2.0.1", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "version": "4.0.0", "dev": true, "requires": { - "webidl-conversions": "^5.0.0" + "webidl-conversions": "^7.0.0" }, "dependencies": { "webidl-conversions": { - "version": "5.0.0", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "version": "7.0.0", "dev": true } } }, "domhandler": { "version": "2.4.2", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { "domelementtype": "1" } }, "dompurify": { - "version": "2.3.3", - "integrity": "sha512-dqnqRkPMAjOZE0FogZ+ceJNM2dZ3V/yNOuFB7+39qpO93hHhfRpHw3heYQC7DPK9FqbQTfBKUJhiSfz4MvXYwg==" + "version": "2.3.3" }, "domutils": { "version": "1.5.1", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", "dev": true, "requires": { "dom-serializer": "0", @@ -66632,47 +70776,31 @@ }, "dot-case": { "version": "3.0.4", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "2.1.0", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + "version": "2.1.0" } } }, "dot-prop": { "version": "6.0.1", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "dev": true, "requires": { "is-obj": "^2.0.0" } }, "dotenv": { - "version": "8.6.0", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" + "version": "8.6.0" }, "dotenv-expand": { - "version": "5.1.0", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "download-stats": { - "version": "0.3.4", - "integrity": "sha512-ic2BigbyUWx7/CBbsfGjf71zUNZB4edBGC3oRliSzsoNmvyVx3Ycfp1w3vp2Y78Ee0eIIkjIEO5KzW0zThDGaA==", - "optional": true, - "requires": { - "JSONStream": "^1.2.1", - "lazy-cache": "^2.0.1", - "moment": "^2.15.1" - } + "version": "5.1.0" }, "downshift": { "version": "6.1.7", - "integrity": "sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg==", "requires": { "@babel/runtime": "^7.14.8", "compute-scroll-into-view": "^1.0.17", @@ -66682,38 +70810,28 @@ }, "dependencies": { "react-is": { - "version": "17.0.2", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "version": "17.0.2" }, "tslib": { - "version": "2.4.0", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.4.0" } } }, "draco3d": { - "version": "1.4.1", - "integrity": "sha512-9Rxonc70xiovBC+Bq1h57SNZIHzWTibU1VfIGp5z3Xx8dPtv4yT5uGhiH7P5uvJRR2jkrvHafRxR7bTANkvfpg==" + "version": "1.4.1" }, "duplexer": { "version": "0.1.2", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, "duplexer2": { "version": "0.1.4", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "requires": { "readable-stream": "^2.0.2" } }, - "duplexer3": { - "version": "0.1.4", - "integrity": "sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==" - }, "duplexify": { "version": "3.7.1", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -66722,13 +70840,10 @@ } }, "earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" + "version": "2.2.4" }, "ecc-jsbn": { "version": "0.1.2", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "requires": { "jsbn": "~0.1.0", @@ -66736,36 +70851,19 @@ } }, "echarts": { - "version": "5.3.2", - "integrity": "sha512-LWCt7ohOKdJqyiBJ0OGBmE9szLdfA9sGcsMEi+GGoc6+Xo75C+BkcT/6NNGRHAWtnQl2fNow05AQjznpap28TQ==", + "version": "5.4.1", "requires": { "tslib": "2.3.0", - "zrender": "5.3.1" + "zrender": "5.4.1" }, "dependencies": { "tslib": { - "version": "2.3.0", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - } - } - }, - "editions": { - "version": "2.3.1", - "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", - "requires": { - "errlop": "^2.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "2.3.0" } } }, "editorconfig": { "version": "0.15.3", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", "requires": { "commander": "^2.19.0", "lru-cache": "^4.1.5", @@ -66775,48 +70873,41 @@ "dependencies": { "lru-cache": { "version": "4.1.5", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "yallist": { - "version": "2.1.2", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + "version": "2.1.2" } } }, "ee-first": { - "version": "1.1.1", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "version": "1.1.1" }, "ejs": { - "version": "3.1.6", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.8", + "dev": true, "requires": { - "jake": "^10.6.1" + "jake": "^10.8.5" } }, "electron-to-chromium": { - "version": "1.3.836", - "integrity": "sha512-Ney3pHOJBWkG/AqYjrW0hr2AUCsao+2uvq9HUlRP8OlpSdk/zOHOUJP7eu0icDvePC9DlgffuelP4TnOJmMRUg==" + "version": "1.4.224" }, "elegant-spinner": { "version": "1.0.1", - "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", "dev": true }, "element-resize-detector": { "version": "1.2.4", - "integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==", "requires": { "batch-processor": "1.0.0" } }, "elliptic": { "version": "6.5.4", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -66828,39 +70919,38 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.0" }, "inherits": { - "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "version": "2.0.4" } } }, "email-addresses": { - "version": "3.1.0", - "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==" + "version": "3.1.0" }, "emittery": { "version": "0.7.2", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", "dev": true }, "emoji-regex": { - "version": "8.0.0", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "version": "8.0.0" }, "emojis-list": { - "version": "3.0.0", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + "version": "3.0.0" + }, + "emotion": { + "version": "10.0.27", + "requires": { + "babel-plugin-emotion": "^10.0.27", + "create-emotion": "^10.0.27" + } }, "emotion-rgba": { - "version": "0.0.9", - "integrity": "sha512-fSt51Lh4a1fppXY3nQrMUC00p1jIYMSaRRkUhPiOJ3s9oumae1tY41AJytRK9d4YmJDP9njJBndgdDn9j7CbsA==" + "version": "0.0.9" }, "emotion-theming": { "version": "10.0.27", - "integrity": "sha512-MlF1yu/gYh8u+sLUqA0YuA9JX0P4Hb69WlKc/9OLo+WCXuX6sy/KoIa+qJimgmr2dWqnypYKYPX37esjDBbhdw==", "requires": { "@babel/runtime": "^7.5.5", "@emotion/weak-memoize": "0.2.5", @@ -66869,7 +70959,6 @@ }, "encodable": { "version": "0.7.8", - "integrity": "sha512-rh5isin1c3ZJuultMyJZGBRbGIh8IrVHQuwlEG3lPMGZQ5yQUb2STIbXGGEbSifxT4POnojKjTxhm3ITTSdriw==", "requires": { "@encodable/color": "^1.1.0", "@encodable/format": "^1.0.5", @@ -66888,21 +70977,18 @@ "dependencies": { "d3-array": { "version": "2.12.1", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } }, "d3-interpolate": { "version": "2.0.1", - "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", "requires": { "d3-color": "1 - 2" } }, "d3-scale": { "version": "3.3.0", - "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", "requires": { "d3-array": "^2.3.0", "d3-format": "1 - 2", @@ -66913,7 +70999,6 @@ }, "d3-time": { "version": "2.1.1", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", "requires": { "d3-array": "2" } @@ -66921,26 +71006,30 @@ } }, "encodeurl": { - "version": "1.0.2", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + "version": "1.0.2" }, "encoding": { - "version": "0.1.12", - "integrity": "sha512-bl1LAgiQc4ZWr++pNYUdRe/alecaHFeHxIJ/pNciqGdKXghaTCOwKkbKp6ye7pKZGu/GcaSXFk8PBVhgs+dJdA==", + "version": "0.1.13", "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } } }, "end-of-stream": { "version": "1.4.1", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "requires": { "once": "^1.4.0" } }, "endent": { "version": "2.1.0", - "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", "requires": { "dedent": "^0.7.0", "fast-json-parse": "^1.0.3", @@ -66949,7 +71038,6 @@ }, "enhanced-resolve": { "version": "4.5.0", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -66958,7 +71046,6 @@ "dependencies": { "memory-fs": { "version": "0.5.0", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -66968,7 +71055,6 @@ }, "enquirer": { "version": "2.3.6", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "requires": { "ansi-colors": "^4.1.1" @@ -66976,19 +71062,16 @@ "dependencies": { "ansi-colors": { "version": "4.1.1", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true } } }, "entities": { "version": "1.1.2", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, "env-ci": { - "version": "5.4.1", - "integrity": "sha512-xyuCtyFZLpnW5aH0JstETKTSMwHHQX4m42juzEZzvbUCJX7RiPVlhASKM0f/cJ4vvI/+txMkZ7F5To6dCdPYhg==", + "version": "5.5.0", "dev": true, "requires": { "execa": "^5.0.0", @@ -66998,7 +71081,6 @@ "dependencies": { "cross-spawn": { "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -67008,7 +71090,6 @@ }, "execa": { "version": "5.1.1", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -67024,22 +71105,18 @@ }, "get-stream": { "version": "6.0.1", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "human-signals": { "version": "2.1.0", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "is-stream": { "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "npm-run-path": { "version": "4.0.1", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" @@ -67047,12 +71124,10 @@ }, "path-key": { "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "shebang-command": { "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" @@ -67060,12 +71135,10 @@ }, "shebang-regex": { "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -67075,183 +71148,168 @@ }, "env-paths": { "version": "2.2.1", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, "envinfo": { "version": "7.8.1", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true }, "enzyme": { - "version": "3.10.0", - "integrity": "sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg==", + "version": "3.11.0", "dev": true, "requires": { - "array.prototype.flat": "^1.2.1", - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.1.0", + "array.prototype.flat": "^1.2.3", + "cheerio": "^1.0.0-rc.3", + "enzyme-shallow-equal": "^1.0.1", + "function.prototype.name": "^1.1.2", "has": "^1.0.3", - "html-element-map": "^1.0.0", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.4", - "is-number-object": "^1.0.3", - "is-regex": "^1.0.4", - "is-string": "^1.0.4", + "html-element-map": "^1.2.0", + "is-boolean-object": "^1.0.1", + "is-callable": "^1.1.5", + "is-number-object": "^1.0.4", + "is-regex": "^1.0.5", + "is-string": "^1.0.5", "is-subset": "^0.1.1", "lodash.escape": "^4.0.1", "lodash.isequal": "^4.5.0", - "object-inspect": "^1.6.0", - "object-is": "^1.0.1", + "object-inspect": "^1.7.0", + "object-is": "^1.0.2", "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", + "object.entries": "^1.1.1", + "object.values": "^1.1.1", + "raf": "^3.4.1", "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.1.2" + "string.prototype.trim": "^1.2.1" }, "dependencies": { "object-inspect": { - "version": "1.6.0", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "version": "1.12.3", "dev": true } } }, "enzyme-adapter-react-16": { - "version": "1.14.0", - "integrity": "sha512-7PcOF7pb4hJUvjY7oAuPGpq3BmlCig3kxXGi2kFx0YzJHppqX1K8IIV9skT1IirxXlu8W7bneKi+oQ10QRnhcA==", + "version": "1.15.7", "dev": true, "requires": { - "enzyme-adapter-utils": "^1.12.0", + "enzyme-adapter-utils": "^1.14.1", + "enzyme-shallow-equal": "^1.0.5", "has": "^1.0.3", - "object.assign": "^4.1.0", - "object.values": "^1.1.0", - "prop-types": "^15.7.2", - "react-is": "^16.8.6", + "object.assign": "^4.1.4", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "react-is": "^16.13.1", "react-test-renderer": "^16.0.0-0", "semver": "^5.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.9.0", - "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } } }, "enzyme-adapter-utils": { - "version": "1.12.0", - "integrity": "sha512-wkZvE0VxcFx/8ZsBw0iAbk3gR1d9hK447ebnSYBf95+r32ezBq+XDSAvRErkc4LZosgH8J7et7H7/7CtUuQfBA==", + "version": "1.14.1", "dev": true, "requires": { - "airbnb-prop-types": "^2.13.2", - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "object.fromentries": "^2.0.0", - "prop-types": "^15.7.2", - "semver": "^5.6.0" + "airbnb-prop-types": "^2.16.0", + "function.prototype.name": "^1.1.5", + "has": "^1.0.3", + "object.assign": "^4.1.4", + "object.fromentries": "^2.0.5", + "prop-types": "^15.8.1", + "semver": "^5.7.1" } }, "enzyme-matchers": { "version": "7.1.2", - "integrity": "sha512-03WqAg2XDl7id9rARIO97HQ1JIw9F2heJ3R4meGu/13hx0ULTDEgl0E67MGl2Uq1jq1DyRnJfto1/VSzskdV5A==", "dev": true, "requires": { "circular-json-es6": "^2.0.1", "deep-equal-ident": "^1.1.1" } }, + "enzyme-shallow-equal": { + "version": "1.0.5", + "dev": true, + "requires": { + "has": "^1.0.3", + "object-is": "^1.1.5" + } + }, "enzyme-to-json": { "version": "3.5.0", - "integrity": "sha512-clusXRsiaQhG7+wtyc4t7MU8N3zCOgf4eY9+CeSenYzKlFST4lxerfOvnWd4SNaToKhkuba+w6m242YpQOS7eA==", "dev": true, "requires": { "lodash": "^4.17.15", "react-is": "^16.12.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } } }, "err-code": { "version": "2.0.3", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, - "errlop": { - "version": "2.2.0", - "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==" - }, "errno": { "version": "0.1.7", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { "prr": "~1.0.1" } }, "error-ex": { "version": "1.3.2", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { "is-arrayish": "^0.2.1" } }, "error-stack-parser": { "version": "2.0.7", - "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", "requires": { "stackframe": "^1.1.1" } }, "es-abstract": { - "version": "1.19.1", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.21.1", "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "dependencies": { "object-inspect": { - "version": "1.11.0", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + "version": "1.12.3" } } }, "es-array-method-boxes-properly": { - "version": "1.0.0", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + "version": "1.0.0" }, "es-get-iterator": { "version": "1.1.2", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.0", @@ -67264,19 +71322,30 @@ }, "dependencies": { "isarray": { - "version": "2.0.5", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "version": "2.0.5" } } }, "es-module-lexer": { "version": "0.7.1", - "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", "dev": true }, + "es-set-tostringtag": { + "version": "2.0.1", + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "requires": { + "has": "^1.0.3" + } + }, "es-to-primitive": { "version": "1.2.1", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -67284,32 +71353,25 @@ } }, "es5-shim": { - "version": "4.6.7", - "integrity": "sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==" + "version": "4.6.7" }, "es6-shim": { - "version": "0.35.6", - "integrity": "sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==" + "version": "0.35.6" }, "es6bindall": { - "version": "0.0.9", - "integrity": "sha512-n3nKINzEmlCjzXhxwaJh5hGT/X9LuvvSlWwJevgwUu3PAiUqhlvk1M+zPAzrlRhTPkvoywOeJGgnT5dv+ugCYw==" + "version": "0.0.9" }, "escalade": { - "version": "3.1.1", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "version": "3.1.1" }, "escape-html": { - "version": "1.0.3", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "version": "1.0.3" }, "escape-string-regexp": { - "version": "1.0.5", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "version": "1.0.5" }, "escodegen": { "version": "1.9.1", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "requires": { "esprima": "^3.1.3", "estraverse": "^4.2.0", @@ -67320,14 +71382,12 @@ "dependencies": { "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "optional": true } } }, "eslint": { "version": "7.32.0", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { "@babel/code-frame": "7.12.11", @@ -67374,7 +71434,6 @@ "dependencies": { "@babel/code-frame": { "version": "7.12.11", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" @@ -67382,12 +71441,10 @@ }, "ansi-regex": { "version": "5.0.0", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "cross-spawn": { "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -67397,7 +71454,6 @@ }, "debug": { "version": "4.3.1", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -67405,17 +71461,14 @@ }, "escape-string-regexp": { "version": "4.0.0", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "eslint-visitor-keys": { "version": "2.0.0", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", "dev": true }, "globals": { "version": "13.12.0", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -67423,7 +71476,6 @@ }, "levn": { "version": "0.4.1", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { "prelude-ls": "^1.2.1", @@ -67432,7 +71484,6 @@ }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -67440,12 +71491,10 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "optionator": { "version": "0.9.1", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { "deep-is": "^0.1.3", @@ -67458,17 +71507,14 @@ }, "path-key": { "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "prelude-ls": { "version": "1.2.1", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "semver": { "version": "7.3.4", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -67476,7 +71522,6 @@ }, "shebang-command": { "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" @@ -67484,12 +71529,10 @@ }, "shebang-regex": { "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "strip-ansi": { "version": "6.0.0", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { "ansi-regex": "^5.0.0" @@ -67497,7 +71540,6 @@ }, "type-check": { "version": "0.4.0", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { "prelude-ls": "^1.2.1" @@ -67505,12 +71547,10 @@ }, "type-fest": { "version": "0.20.2", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -67518,65 +71558,34 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "eslint-config-airbnb": { "version": "18.2.1", - "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==", "dev": true, "requires": { "eslint-config-airbnb-base": "^14.2.1", "object.assign": "^4.1.2", "object.entries": "^1.1.2" - }, - "dependencies": { - "object.entries": { - "version": "1.1.3", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - } - } } }, "eslint-config-airbnb-base": { "version": "14.2.1", - "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", "dev": true, "requires": { "confusing-browser-globals": "^1.0.10", "object.assign": "^4.1.2", "object.entries": "^1.1.2" - }, - "dependencies": { - "object.entries": { - "version": "1.1.3", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - } - } } }, "eslint-config-prettier": { "version": "7.1.0", - "integrity": "sha512-9sm5/PxaFG7qNJvJzTROMM1Bk1ozXVTKI0buKOyb0Bsr1hrwi0H/TzxF/COtf1uxikIK8SwhX7K6zg78jAzbeA==", "dev": true }, "eslint-import-resolver-node": { "version": "0.3.6", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, "requires": { "debug": "^3.2.7", @@ -67585,7 +71594,6 @@ "dependencies": { "debug": { "version": "3.2.7", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -67593,14 +71601,12 @@ }, "ms": { "version": "2.1.3", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } }, "eslint-import-resolver-typescript": { "version": "2.5.0", - "integrity": "sha512-qZ6e5CFr+I7K4VVhQu3M/9xGv9/YmwsEXrsm3nimw8vWaVHRDrQRp26BgCypTxBp3vUp4o5aVEJRiy0F2DFddQ==", "dev": true, "requires": { "debug": "^4.3.1", @@ -67612,7 +71618,6 @@ "dependencies": { "debug": { "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -67620,14 +71625,12 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "eslint-module-utils": { "version": "2.6.2", - "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", "dev": true, "requires": { "debug": "^3.2.7", @@ -67636,7 +71639,6 @@ "dependencies": { "debug": { "version": "3.2.7", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -67644,12 +71646,10 @@ }, "ms": { "version": "2.1.3", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "pkg-dir": { "version": "2.0.0", - "integrity": "sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==", "dev": true, "requires": { "find-up": "^2.1.0" @@ -67659,7 +71659,6 @@ }, "eslint-plugin-cypress": { "version": "2.11.2", - "integrity": "sha512-1SergF1sGbVhsf7MYfOLiBhdOg6wqyeV9pXUAIDIffYTGMN3dTBQS9nFAzhLsHhO+Bn0GaVM1Ecm71XUidQ7VA==", "dev": true, "requires": { "globals": "^11.12.0" @@ -67667,7 +71666,6 @@ }, "eslint-plugin-file-progress": { "version": "1.2.0", - "integrity": "sha512-A2qwYqFI+w0XVHm0DUZ7gH+2/0SBbfoLWHtN+85jcl7tXalyi8qDGouuQ4PZ3H4VsD/4rER18J0sZMuoP0yPSQ==", "dev": true, "requires": { "chalk": "^4.1.2", @@ -67676,7 +71674,6 @@ }, "eslint-plugin-import": { "version": "2.24.2", - "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", "dev": true, "requires": { "array-includes": "^3.1.3", @@ -67696,19 +71693,8 @@ "tsconfig-paths": "^3.11.0" }, "dependencies": { - "array.prototype.flat": { - "version": "1.2.4", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, "doctrine": { "version": "2.1.0", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "^2.0.2" @@ -67716,7 +71702,6 @@ }, "read-pkg": { "version": "3.0.0", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "requires": { "load-json-file": "^4.0.0", @@ -67726,7 +71711,6 @@ }, "read-pkg-up": { "version": "3.0.0", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", "dev": true, "requires": { "find-up": "^2.0.0", @@ -67737,7 +71721,6 @@ }, "eslint-plugin-jest": { "version": "24.1.3", - "integrity": "sha512-dNGGjzuEzCE3d5EPZQ/QGtmlMotqnYWD/QpCZ1UuZlrMAdhG5rldh0N0haCvhGnUkSeuORS5VNROwF9Hrgn3Lg==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^4.0.1" @@ -67745,7 +71728,6 @@ }, "eslint-plugin-jest-dom": { "version": "3.6.5", - "integrity": "sha512-iaJ5aSQghp9u2ciLAseWIVu7X5tW+WwNJwMBDToK4GBfwGXXQJDLt5IBNtm6fHvC3FRzCGwvyNMIG1g5gF+icQ==", "dev": true, "requires": { "@babel/runtime": "^7.9.6", @@ -67755,7 +71737,6 @@ }, "eslint-plugin-jsx-a11y": { "version": "6.5.1", - "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", "dev": true, "requires": { "@babel/runtime": "^7.16.3", @@ -67774,19 +71755,16 @@ "dependencies": { "emoji-regex": { "version": "9.2.2", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true } } }, "eslint-plugin-no-only-tests": { "version": "2.4.0", - "integrity": "sha512-azP9PwQYfGtXJjW273nIxQH9Ygr+5/UyeW2wEjYoDtVYPI+WPKwbj0+qcAKYUXFZLRumq4HKkFaoDBAwBoXImQ==", "dev": true }, "eslint-plugin-prettier": { "version": "4.0.0", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" @@ -67794,7 +71772,6 @@ }, "eslint-plugin-react": { "version": "7.22.0", - "integrity": "sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA==", "dev": true, "requires": { "array-includes": "^3.1.1", @@ -67812,44 +71789,19 @@ "dependencies": { "doctrine": { "version": "2.1.0", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "^2.0.2" } - }, - "object.entries": { - "version": "1.1.3", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.3", - "integrity": "sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - } } } }, "eslint-plugin-react-hooks": { "version": "4.2.0", - "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", "dev": true }, "eslint-plugin-testing-library": { "version": "3.10.1", - "integrity": "sha512-nQIFe2muIFv2oR2zIuXE4vTbcFNx8hZKRzgHZqJg8rfopIWwoTwtlbCCNELT/jXzVe1uZF68ALGYoDXjLczKiQ==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^3.10.1" @@ -67857,7 +71809,6 @@ "dependencies": { "@typescript-eslint/experimental-utils": { "version": "3.10.1", - "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", @@ -67869,12 +71820,10 @@ }, "@typescript-eslint/types": { "version": "3.10.1", - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", "dev": true }, "@typescript-eslint/typescript-estree": { "version": "3.10.1", - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", "dev": true, "requires": { "@typescript-eslint/types": "3.10.1", @@ -67889,7 +71838,6 @@ }, "@typescript-eslint/visitor-keys": { "version": "3.10.1", - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" @@ -67897,7 +71845,6 @@ }, "debug": { "version": "4.3.1", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -67905,17 +71852,14 @@ }, "eslint-visitor-keys": { "version": "1.3.0", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "semver": { "version": "7.3.2", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } @@ -67928,7 +71872,6 @@ }, "eslint-scope": { "version": "5.1.1", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -67937,7 +71880,6 @@ }, "eslint-utils": { "version": "2.1.0", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" @@ -67945,24 +71887,20 @@ "dependencies": { "eslint-visitor-keys": { "version": "1.3.0", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } }, "eslint-visitor-keys": { "version": "3.1.0", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", "dev": true }, "esm": { "version": "3.2.25", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", "dev": true }, "espree": { "version": "7.3.1", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { "acorn": "^7.4.0", @@ -67972,23 +71910,19 @@ "dependencies": { "acorn": { "version": "7.4.1", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "eslint-visitor-keys": { "version": "1.3.0", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } }, "esprima": { - "version": "3.1.3", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==" + "version": "3.1.3" }, "esquery": { "version": "1.4.0", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -67996,31 +71930,26 @@ "dependencies": { "estraverse": { "version": "5.3.0", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "esrecurse": { "version": "4.3.0", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { "estraverse": "^5.2.0" }, "dependencies": { "estraverse": { - "version": "5.2.0", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + "version": "5.2.0" } } }, "estraverse": { - "version": "4.2.0", - "integrity": "sha512-VHvyaGnJy+FuGfcfaM7W7OZw4mQiKW73jPHwQXx2VnMSUBajYmytOT5sKEfsBvNPtGX6YDwcrGDz2eocoHg0JA==" + "version": "4.2.0" }, "estree-to-babel": { "version": "3.2.1", - "integrity": "sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==", "requires": { "@babel/traverse": "^7.1.6", "@babel/types": "^7.2.0", @@ -68028,29 +71957,23 @@ } }, "esutils": { - "version": "2.0.2", - "integrity": "sha512-UUPPULqkyAV+M3Shodis7l8D+IyX6V8SbaBnTb449jf3fMTd8+UOZI1Q70NbZVOQkcR91yYgdHsJiMMMVmYshg==" + "version": "2.0.2" }, "etag": { - "version": "1.8.1", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + "version": "1.8.1" }, "event-target-shim": { "version": "5.0.1", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true }, "eventemitter3": { - "version": "4.0.7", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "version": "4.0.7" }, "events": { - "version": "3.2.0", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" + "version": "3.2.0" }, "evp_bytestokey": { "version": "1.0.3", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -68058,12 +71981,10 @@ }, "exec-sh": { "version": "0.3.4", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", "dev": true }, "execa": { "version": "1.0.0", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "^6.0.0", @@ -68077,12 +71998,10 @@ }, "exit": { "version": "0.1.2", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, "expand-brackets": { "version": "2.1.4", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -68095,7 +72014,6 @@ "dependencies": { "define-property": { "version": "0.2.5", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "requires": { "is-descriptor": "^0.1.0" } @@ -68104,7 +72022,6 @@ }, "expect": { "version": "26.6.2", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -68117,7 +72034,6 @@ }, "exports-loader": { "version": "0.7.0", - "integrity": "sha512-RKwCrO4A6IiKm0pG3c9V46JxIHcDplwwGJn6+JJ1RcVnh/WSGJa0xkmk5cRVtgOPzCAtTMGj2F7nluh9L0vpSA==", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -68126,21 +72042,19 @@ "dependencies": { "source-map": { "version": "0.5.0", - "integrity": "sha512-gjGnxNN0K+/Pr4Mi4fs/pOtda10dKB6Wn9QvjOrH6v5TWsI7ghHuJUHoIgyM6DkUL5kr2GtPFGererzKpMBWfA==", "dev": true } } }, "express": { - "version": "4.17.1", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.3", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -68154,79 +72068,57 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { - "accepts": { - "version": "1.3.7", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, "array-flatten": { - "version": "1.1.1", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "negotiator": { - "version": "0.6.2", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "1.1.1" }, - "parseurl": { - "version": "1.3.3", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "cookie": { + "version": "0.4.2" }, "path-to-regexp": { - "version": "0.1.7", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.7" }, "qs": { - "version": "6.7.0", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.9.7" }, - "setprototypeof": { - "version": "1.1.1", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "safe-buffer": { + "version": "5.2.1" }, - "statuses": { - "version": "1.5.0", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + "setprototypeof": { + "version": "1.2.0" } } }, "expression-eval": { "version": "2.1.0", - "integrity": "sha512-FUJO/Akvl/JOWkvlqZaqbkhsEWlCJWDeZG4tzX96UH68D9FeRgYgtb55C2qtqbORC0Q6x5419EDjWu4IT9kQfg==", "requires": { "jsep": "^0.3.0" } }, "extend": { - "version": "3.0.2", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "version": "3.0.2" }, "extend-shallow": { "version": "2.0.1", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "requires": { "is-extendable": "^0.1.0" } }, "external-editor": { "version": "3.1.0", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "devOptional": true, + "dev": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -68235,8 +72127,7 @@ "dependencies": { "tmp": { "version": "0.0.33", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "devOptional": true, + "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -68245,7 +72136,6 @@ }, "extglob": { "version": "2.0.4", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -68259,28 +72149,24 @@ "dependencies": { "define-property": { "version": "1.0.0", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "requires": { "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -68288,14 +72174,12 @@ } }, "kind-of": { - "version": "6.0.2", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.2" } } }, "extract-zip": { "version": "2.0.1", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, "requires": { "@types/yauzl": "^2.9.1", @@ -68306,7 +72190,6 @@ "dependencies": { "debug": { "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -68314,7 +72197,6 @@ }, "get-stream": { "version": "5.2.0", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -68322,24 +72204,20 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "extsprintf": { "version": "1.3.0", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, "fake-tag": { "version": "2.0.0", - "integrity": "sha512-QDz+8qiNQ9AfBZ31EXlID5JIbUkU3e1nXDWk4tidFzd2gy8XJaEUW1HCuDY6DUy6t2Y0nvhD6PsUc+2WYy5w0w==", "dev": true }, "falafel": { "version": "2.2.4", - "integrity": "sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==", "requires": { "acorn": "^7.1.1", "foreach": "^2.0.5", @@ -68348,27 +72226,22 @@ }, "dependencies": { "acorn": { - "version": "7.4.1", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + "version": "7.4.1" }, "isarray": { - "version": "2.0.5", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "version": "2.0.5" } } }, "fast-deep-equal": { - "version": "3.1.3", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "version": "3.1.3" }, "fast-diff": { "version": "1.2.0", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", "dev": true }, "fast-glob": { "version": "3.2.10", - "integrity": "sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -68379,25 +72252,21 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "is-number": { - "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "version": "7.0.0" }, "micromatch": { "version": "4.0.4", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -68405,7 +72274,6 @@ }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { "is-number": "^7.0.0" } @@ -68413,47 +72281,38 @@ } }, "fast-json-parse": { - "version": "1.0.3", - "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==" + "version": "1.0.3" }, "fast-json-stable-stringify": { - "version": "2.0.0", - "integrity": "sha512-eIgZvM9C3P05kg0qxfqaVU6Tma4QedCPIByQOcemV0vju8ot3cS2DpHi4m2G2JvbSMI152rjfLX0p1pkSdyPlQ==" + "version": "2.0.0" }, "fast-levenshtein": { - "version": "2.0.6", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "version": "2.0.6" }, "fast-memoize": { - "version": "2.5.2", - "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" + "version": "2.5.2" }, "fast-safe-stringify": { - "version": "2.1.1", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "version": "2.1.1" }, "fastest-levenshtein": { "version": "1.0.12", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, "fastq": { "version": "1.8.0", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", "requires": { "reusify": "^1.0.4" } }, "fault": { "version": "1.0.2", - "integrity": "sha512-o2eo/X2syzzERAtN5LcGbiVQ0WwZSlN3qLtadwAz3X8Bu+XWD16dja/KMsjZLiQr+BLGPDnHGkc4yUJf1Xpkpw==", "requires": { "format": "^0.2.2" } }, "faye-websocket": { "version": "0.11.4", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" @@ -68461,7 +72320,6 @@ }, "fb-watchman": { "version": "2.0.1", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "dev": true, "requires": { "bser": "2.1.1" @@ -68469,7 +72327,6 @@ }, "fbjs": { "version": "0.8.17", - "integrity": "sha512-Q1MvLM+cllhk7lv9Pci7dIdpC5W8MS6W0slOWizKG66+te0m9/YqjfIt41rKmH+Nqz+mMiGgdEVonDadPyKnug==", "requires": { "core-js": "^1.0.0", "isomorphic-fetch": "^2.1.1", @@ -68481,14 +72338,12 @@ }, "dependencies": { "core-js": { - "version": "1.2.7", - "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==" + "version": "1.2.7" } } }, "fd-slicer": { "version": "1.1.0", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, "requires": { "pend": "~1.2.0" @@ -68496,7 +72351,6 @@ }, "fetch-mock": { "version": "7.7.3", - "integrity": "sha512-I4OkK90JFQnjH8/n3HDtWxH/I6D1wrxoAM2ri+nb444jpuH3RTcgvXx2el+G20KO873W727/66T7QhOvFxNHPg==", "dev": true, "requires": { "babel-polyfill": "^6.26.0", @@ -68509,30 +72363,25 @@ "dependencies": { "core-js": { "version": "2.6.11", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", "dev": true } } }, "fetch-retry": { - "version": "4.1.1", - "integrity": "sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==" + "version": "4.1.1" }, "figgy-pudding": { - "version": "3.5.2", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + "version": "3.5.2" }, "figures": { "version": "3.2.0", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "devOptional": true, + "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { "version": "6.0.1", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { "flat-cache": "^3.0.4" @@ -68540,19 +72389,16 @@ }, "file-loader": { "version": "6.2.0", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "dependencies": { "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3" }, "loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -68563,7 +72409,6 @@ }, "file-system-cache": { "version": "1.0.5", - "integrity": "sha512-w9jqeQdOeVaXBCgl4c90XJ6zI8MguJgSiC5LsLdhUu6eSCzcRHPPXUF3lkKMagpzHi+6GnDkjv9BtxMmXdvptA==", "requires": { "bluebird": "^3.3.5", "fs-extra": "^0.30.0", @@ -68572,7 +72417,6 @@ "dependencies": { "fs-extra": { "version": "0.30.0", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -68583,18 +72427,15 @@ }, "jsonfile": { "version": "2.4.0", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", "requires": { "graceful-fs": "^4.1.6" } }, "ramda": { - "version": "0.21.0", - "integrity": "sha512-HGd5aczYKQXGILB+abY290V7Xz62eFajpa6AtMdwEmQSakJmgSO7ks4eI3HdR34j+X2Vz4Thp9VAJbrCAMbO2w==" + "version": "0.21.0" }, "rimraf": { "version": "2.7.1", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } @@ -68602,19 +72443,33 @@ } }, "filelist": { - "version": "1.0.2", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "version": "1.0.4", + "dev": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "filename-reserved-regex": { - "version": "2.0.0", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==" + "version": "2.0.0" }, "filenamify": { "version": "4.3.0", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", "requires": { "filename-reserved-regex": "^2.0.0", "strip-outer": "^1.0.1", @@ -68623,7 +72478,6 @@ }, "fill-range": { "version": "4.0.0", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -68633,16 +72487,13 @@ }, "filter-console": { "version": "0.1.1", - "integrity": "sha512-zrXoV1Uaz52DqPs+qEwNJWJFAWZpYJ47UNmpN9q4j+/EYsz85uV0DC9k8tRND5kYmoVzL0W+Y75q4Rg8sRJCdg==", "dev": true }, "filter-obj": { - "version": "1.1.0", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==" + "version": "1.1.0" }, "finalhandler": { "version": "1.1.2", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -68651,21 +72502,10 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" - }, - "dependencies": { - "parseurl": { - "version": "1.3.3", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "statuses": { - "version": "1.5.0", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" - } } }, "find-cache-dir": { "version": "2.1.0", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "requires": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -68674,75 +72514,65 @@ }, "find-replace": { "version": "3.0.0", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "requires": { "array-back": "^3.0.1" } }, "find-root": { - "version": "1.1.0", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + "version": "1.1.0" }, "find-up": { "version": "2.1.0", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, "requires": { "locate-path": "^2.0.0" } }, - "first-chunk-stream": { - "version": "2.0.0", - "integrity": "sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==", - "optional": true, - "requires": { - "readable-stream": "^2.0.2" - } + "flat": { + "version": "5.0.2", + "dev": true }, "flat-cache": { "version": "3.0.4", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" } }, "flatbuffers": { - "version": "1.12.0", - "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==" + "version": "1.12.0" }, "flatted": { - "version": "3.1.0", - "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==" + "version": "3.1.0" }, "flush-write-stream": { "version": "1.1.1", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" } }, "follow-redirects": { - "version": "1.14.8", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", - "devOptional": true + "version": "1.15.2", + "dev": true }, "fontsource-fira-code": { - "version": "4.0.0", - "integrity": "sha512-qKVeWWNvkPP22FUkea2qVgZHiPBIRk9HFGIFmEUbqEV7Wcu/Dxrva4t7d1XPa2+0cnJgD0kHAiDZ514KjHYQKA==" + "version": "4.0.0" + }, + "for-each": { + "version": "0.3.3", + "requires": { + "is-callable": "^1.1.3" + } }, "for-in": { - "version": "1.0.2", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==" + "version": "1.0.2" }, "foreach": { - "version": "2.0.5", - "integrity": "sha512-ZBbtRiapkZYLsqoPyZOR+uPfto0GRMNQN1GwzZtZt7iZvPPbDDQV0JF5Hx4o/QFQ5c0vyuoZ98T8RSBbopzWtA==" + "version": "2.0.5" }, "foreground-child": { "version": "2.0.0", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "requires": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" @@ -68750,7 +72580,6 @@ "dependencies": { "cross-spawn": { "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -68758,23 +72587,19 @@ } }, "path-key": { - "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "version": "3.1.1" }, "shebang-command": { "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "version": "3.0.0" }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" } @@ -68783,12 +72608,10 @@ }, "forever-agent": { "version": "0.6.1", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true }, "fork-ts-checker-webpack-plugin": { "version": "6.3.3", - "integrity": "sha512-S3uMSg8IsIvs0H6VAfojtbf6RcnEXxEpDMT2Q41M2l0m20JO8eA1t4cCJybvrasC8SvvPEtK4B8ztxxfLljhNg==", "requires": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -68807,7 +72630,6 @@ "dependencies": { "cosmiconfig": { "version": "6.0.0", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -68817,12 +72639,10 @@ } }, "deepmerge": { - "version": "4.2.2", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + "version": "4.2.2" }, "fs-extra": { "version": "9.1.0", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -68832,14 +72652,12 @@ }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "parse-json": { "version": "5.2.0", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -68848,12 +72666,10 @@ } }, "path-type": { - "version": "4.0.0", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "version": "4.0.0" }, "schema-utils": { "version": "2.7.0", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "requires": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", @@ -68862,20 +72678,17 @@ }, "semver": { "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "4.0.0" } } }, "form-data": { "version": "2.3.3", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -68884,23 +72697,19 @@ } }, "format": { - "version": "0.2.2", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" + "version": "0.2.2" }, "fragment-cache": { "version": "0.2.1", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", "requires": { "map-cache": "^0.2.2" } }, "fresh": { - "version": "0.5.2", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + "version": "0.5.2" }, "from2": { "version": "2.3.0", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -68908,17 +72717,14 @@ }, "fromentries": { "version": "1.3.2", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true }, "fs-constants": { "version": "1.0.0", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, "fs-extra": { - "version": "10.0.0", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "10.1.0", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -68927,23 +72733,19 @@ }, "fs-minipass": { "version": "2.1.0", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "requires": { "minipass": "^3.0.0" } }, "fs-monkey": { - "version": "1.0.3", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + "version": "1.0.3" }, "fs-readdir-recursive": { "version": "1.1.0", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, "fs-write-stream-atomic": { "version": "1.0.10", - "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", "requires": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -68952,118 +72754,136 @@ } }, "fs.realpath": { - "version": "1.0.0", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "version": "1.0.0" + }, + "ftp": { + "version": "0.3.10", + "dev": true, + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "dev": true + } + } }, "function-bind": { - "version": "1.1.1", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.1" }, "function.prototype.name": { - "version": "1.1.1", - "integrity": "sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q==", + "version": "1.1.5", "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "function-bind": "^1.1.1", - "functions-have-names": "^1.1.1", - "is-callable": "^1.1.4" + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" } }, "functional-red-black-tree": { "version": "1.0.1", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, "functions-have-names": { - "version": "1.1.1", - "integrity": "sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw==" + "version": "1.2.3" }, "fuse.js": { - "version": "6.4.6", - "integrity": "sha512-/gYxR/0VpXmWSfZOIPS3rWwU8SHgsRTwWuXhyb2O6s7aRuVtHtxCkR33bNYu3wyLyNx/Wpv0vU7FZy8Vj53VNw==" + "version": "6.4.6" }, "gauge": { - "version": "2.7.4", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "version": "4.0.4", "dev": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" }, "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "dev": true + }, "is-fullwidth-code-point": { - "version": "1.0.0", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "version": "3.0.0", + "dev": true + }, + "string-width": { + "version": "4.2.3", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, - "string-width": { - "version": "1.0.2", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "strip-ansi": { + "version": "6.0.1", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ansi-regex": "^5.0.1" } } } }, "gensync": { - "version": "1.0.0-beta.2", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + "version": "1.0.0-beta.2" }, "geojson-flatten": { "version": "1.0.4", - "integrity": "sha512-PpscUXxO6dvvhZxtwuqiI5v+1C/IQYPJRMWoQeaF2oohJgfGYSHKVAe8L+yUqF34PH/hmq9JlwmO+juPw+95/Q==", "requires": { "get-stdin": "^7.0.0", "minimist": "^1.2.5" }, "dependencies": { "get-stdin": { - "version": "7.0.0", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==" + "version": "7.0.0" } } }, "geojson-vt": { - "version": "3.2.1", - "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" + "version": "3.2.1" }, "geolib": { - "version": "2.0.24", - "integrity": "sha512-NR0AyYyEnGrFS9JvSFmmotQDxVCORJgDHdvBwSatxl5aHarOLMh3KuGI83bCvCfObjfoEiDe8Ung8GGLGAtthw==" + "version": "2.0.24" }, "get-caller-file": { - "version": "2.0.5", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "version": "2.0.5" }, "get-intrinsic": { - "version": "1.1.1", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.0", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" } }, "get-package-type": { "version": "0.1.0", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, "get-pkg-repo": { "version": "4.2.1", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", "dev": true, "requires": { "@hutson/parse-repository-url": "^3.0.0", @@ -69074,12 +72894,10 @@ "dependencies": { "ansi-regex": { "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "cliui": { "version": "7.0.4", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", @@ -69089,7 +72907,6 @@ }, "hosted-git-info": { "version": "4.1.0", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -69097,12 +72914,10 @@ }, "is-fullwidth-code-point": { "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -69110,7 +72925,6 @@ }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -69120,7 +72934,6 @@ }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -69128,7 +72941,6 @@ }, "wrap-ansi": { "version": "7.0.0", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -69138,17 +72950,14 @@ }, "y18n": { "version": "5.0.8", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs": { "version": "16.2.0", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -69162,23 +72971,19 @@ }, "yargs-parser": { "version": "20.2.9", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true } } }, "get-port": { "version": "5.1.1", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true }, "get-stdin": { - "version": "4.0.1", - "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==" + "version": "4.0.1" }, "get-stream": { "version": "4.1.0", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" @@ -69186,35 +72991,72 @@ }, "get-symbol-description": { "version": "1.0.0", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" } }, + "get-uri": { + "version": "3.0.2", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "file-uri-to-path": { + "version": "2.0.0", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "ms": { + "version": "2.1.2", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "dev": true + } + } + }, "get-value": { - "version": "2.0.6", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==" + "version": "2.0.6" }, "getpass": { "version": "0.1.7", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, - "gh-got": { - "version": "5.0.0", - "integrity": "sha512-B9bWm0vDR7CSbFPxt528dbMTWd9CUc4h9U3Ji7e781Jy9Xm0p6QWKVndA4ETEzDCd3/GqVCjVfqqpl2kR1j3nA==", - "requires": { - "got": "^6.2.0", - "is-plain-obj": "^1.1.0" - } - }, "gh-pages": { "version": "3.2.3", - "integrity": "sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg==", "requires": { "async": "^2.6.1", "commander": "^2.18.0", @@ -69227,21 +73069,18 @@ "dependencies": { "array-union": { "version": "1.0.2", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "requires": { "array-uniq": "^1.0.1" } }, "async": { - "version": "2.6.3", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", "requires": { "lodash": "^4.17.14" } }, "find-cache-dir": { "version": "3.3.2", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -69250,7 +73089,6 @@ }, "find-up": { "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -69258,7 +73096,6 @@ }, "fs-extra": { "version": "8.1.0", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -69267,7 +73104,6 @@ }, "globby": { "version": "6.1.0", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", "requires": { "array-union": "^1.0.1", "glob": "^7.0.3", @@ -69278,76 +73114,63 @@ }, "jsonfile": { "version": "4.0.0", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "requires": { "graceful-fs": "^4.1.6" } }, "locate-path": { "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "make-dir": { "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { "semver": "^6.0.0" } }, "p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" } }, "p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "2.2.0" }, "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" }, "pify": { - "version": "2.3.0", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + "version": "2.3.0" }, "pkg-dir": { "version": "4.2.0", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { "find-up": "^4.0.0" } }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" }, "universalify": { - "version": "0.1.2", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "0.1.2" } } }, "git-hooks-list": { "version": "1.0.3", - "integrity": "sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==", "dev": true }, "git-raw-commits": { "version": "2.0.11", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", "dev": true, "requires": { "dargs": "^7.0.0", @@ -69359,7 +73182,6 @@ "dependencies": { "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -69369,7 +73191,6 @@ }, "through2": { "version": "4.0.2", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { "readable-stream": "3" @@ -69379,7 +73200,6 @@ }, "git-remote-origin-url": { "version": "2.0.0", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", "dev": true, "requires": { "gitconfiglocal": "^1.0.0", @@ -69388,14 +73208,12 @@ "dependencies": { "pify": { "version": "2.3.0", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true } } }, "git-semver-tags": { "version": "4.1.1", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", "dev": true, "requires": { "meow": "^8.0.0", @@ -69404,31 +73222,27 @@ "dependencies": { "semver": { "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "git-up": { - "version": "4.0.5", - "integrity": "sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA==", + "version": "7.0.0", "dev": true, "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^6.0.0" + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" } }, "git-url-parse": { - "version": "11.6.0", - "integrity": "sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==", + "version": "13.1.0", "dev": true, "requires": { - "git-up": "^4.0.0" + "git-up": "^7.0.0" } }, "gitconfiglocal": { "version": "1.0.0", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", "dev": true, "requires": { "ini": "^1.3.2" @@ -69436,84 +73250,71 @@ }, "github-slugger": { "version": "1.4.0", - "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==", "dev": true }, "github-username": { - "version": "3.0.0", - "integrity": "sha512-pbA1zobA7urImyNixOkCb/eO2fRadF7+RZgdjzT3/k/KukA8CY7QZ7BNCdCetH1kB0YqeBmY+Hn76XaC3rmmzQ==", + "version": "6.0.0", "requires": { - "gh-got": "^5.0.0" + "@octokit/rest": "^18.0.6" } }, "gl-matrix": { - "version": "3.3.0", - "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" + "version": "3.3.0" }, "glob": { - "version": "7.1.7", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.3", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { "version": "5.1.2", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } }, "glob-promise": { "version": "3.4.0", - "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", "requires": { "@types/glob": "*" } }, "glob-to-regexp": { - "version": "0.4.1", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "version": "0.4.1" }, "global": { "version": "4.4.0", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "requires": { "min-document": "^2.19.0", "process": "^0.11.10" } }, "global-box": { - "version": "1.2.0", - "integrity": "sha512-IgpqqAYWNG3eluK1tsCkI8Uxff16+OYWLEhDS/QrfkfmbRQ/tVlBXZfURn5tSoPPT6wtmeJp7VKhXrcc5jl/1A==" + "version": "1.2.0" }, "global-cache": { "version": "1.2.1", - "integrity": "sha512-EOeUaup5DgWKlCMhA9YFqNRIlZwoxt731jCh47WBV9fQqHgXhr3Fa55hfgIUqilIcPsfdNKN7LHjrNY+Km40KA==", "requires": { "define-properties": "^1.1.2", "is-symbol": "^1.0.1" } }, "globals": { - "version": "11.12.0", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "version": "11.12.0" }, "globalthis": { "version": "1.0.3", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "requires": { "define-properties": "^1.1.3" } }, "globby": { "version": "11.1.0", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -69524,79 +73325,48 @@ }, "dependencies": { "ignore": { - "version": "5.2.0", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + "version": "5.2.0" }, "slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "version": "3.0.0" } } }, - "got": { - "version": "6.7.1", - "integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==", + "gopd": { + "version": "1.0.1", "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==" - } + "get-intrinsic": "^1.1.3" } }, "graceful-fs": { - "version": "4.2.8", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + "version": "4.2.8" }, "graphlib": { "version": "2.1.8", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", "requires": { "lodash": "^4.17.15" } }, "grid-index": { - "version": "1.1.0", - "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" + "version": "1.1.0" }, "growly": { "version": "1.3.0", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", "dev": true, "optional": true }, - "gud": { - "version": "1.0.0", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" - }, "h3-js": { - "version": "3.7.2", - "integrity": "sha512-LPjlHSwB9zQZrMqKloCZmmmt3yZzIK7nqPcXqwU93zT3TtYG6jP4tZBzAPouxut7lLjdFbMQ75wRBiKfpsnY7w==" + "version": "3.7.2" }, "hammerjs": { - "version": "2.0.8", - "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==" + "version": "2.0.8" }, "handle-thing": { "version": "2.0.1", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, "handlebars": { "version": "4.7.7", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "requires": { "minimist": "^1.2.5", "neo-async": "^2.6.0", @@ -69606,19 +73376,16 @@ }, "dependencies": { "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "har-schema": { "version": "2.0.0", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true }, "har-validator": { "version": "5.1.3", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { "ajv": "^6.5.5", @@ -69627,65 +73394,63 @@ }, "hard-rejection": { "version": "2.1.0", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true }, "has": { "version": "1.0.3", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { "function-bind": "^1.1.1" } }, "has-ansi": { "version": "2.0.0", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "requires": { "ansi-regex": "^2.0.0" } }, "has-bigints": { - "version": "1.0.1", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + "version": "1.0.2" }, "has-flag": { - "version": "3.0.0", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "version": "3.0.0" }, "has-glob": { "version": "1.0.0", - "integrity": "sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g==", "requires": { "is-glob": "^3.0.0" }, "dependencies": { "is-glob": { "version": "3.1.0", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", "requires": { "is-extglob": "^2.1.0" } } } }, + "has-property-descriptors": { + "version": "1.0.0", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1" + }, "has-symbols": { - "version": "1.0.2", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "version": "1.0.3" }, "has-tostringtag": { "version": "1.0.0", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "requires": { "has-symbols": "^1.0.2" } }, "has-unicode": { - "version": "2.0.1", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "version": "2.0.1" }, "has-value": { "version": "1.0.0", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -69694,7 +73459,6 @@ }, "has-values": { "version": "1.0.0", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -69702,7 +73466,6 @@ "dependencies": { "kind-of": { "version": "4.0.0", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", "requires": { "is-buffer": "^1.1.5" } @@ -69711,7 +73474,6 @@ }, "hash-base": { "version": "3.1.0", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -69719,12 +73481,10 @@ }, "dependencies": { "inherits": { - "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "version": "2.0.4" }, "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -69732,14 +73492,12 @@ } }, "safe-buffer": { - "version": "5.2.1", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "version": "5.2.1" } } }, "hash.js": { "version": "1.1.7", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -69747,7 +73505,6 @@ }, "hast-to-hyperscript": { "version": "9.0.1", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", "requires": { "@types/unist": "^2.0.3", "comma-separated-tokens": "^1.0.0", @@ -69759,14 +73516,12 @@ }, "dependencies": { "unist-util-is": { - "version": "4.1.0", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + "version": "4.1.0" } } }, "hast-util-from-parse5": { "version": "6.0.1", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", "requires": { "@types/parse5": "^5.0.0", "hastscript": "^6.0.0", @@ -69777,19 +73532,16 @@ }, "dependencies": { "is-buffer": { - "version": "2.0.5", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + "version": "2.0.5" }, "unist-util-stringify-position": { "version": "2.0.3", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "requires": { "@types/unist": "^2.0.2" } }, "vfile": { "version": "4.2.1", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", @@ -69798,12 +73550,10 @@ } }, "vfile-location": { - "version": "3.2.0", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + "version": "3.2.0" }, "vfile-message": { "version": "2.0.4", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", "requires": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^2.0.0" @@ -69812,12 +73562,10 @@ } }, "hast-util-parse-selector": { - "version": "2.2.1", - "integrity": "sha512-Xyh0v+nHmQvrOqop2Jqd8gOdyQtE8sIP9IQf7mlVDqp924W4w/8Liuguk2L2qei9hARnQSG2m+wAOCxM7npJVw==" + "version": "2.2.1" }, "hast-util-raw": { "version": "6.0.1", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", "requires": { "@types/hast": "^2.0.0", "hast-util-from-parse5": "^6.0.0", @@ -69832,23 +73580,19 @@ }, "dependencies": { "is-buffer": { - "version": "2.0.5", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + "version": "2.0.5" }, "parse5": { - "version": "6.0.1", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "version": "6.0.1" }, "unist-util-stringify-position": { "version": "2.0.3", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "requires": { "@types/unist": "^2.0.2" } }, "vfile": { "version": "4.2.1", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", @@ -69858,7 +73602,6 @@ }, "vfile-message": { "version": "2.0.4", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", "requires": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^2.0.0" @@ -69868,14 +73611,12 @@ }, "hast-util-sanitize": { "version": "4.0.0", - "integrity": "sha512-pw56+69jq+QSr/coADNvWTmBPDy+XsmwaF5KnUys4/wM1jt/fZdl7GPxhXXXYdXnz3Gj3qMkbUCH2uKjvX0MgQ==", "requires": { "@types/hast": "^2.0.0" } }, "hast-util-to-parse5": { "version": "6.0.0", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", "requires": { "hast-to-hyperscript": "^9.0.0", "property-information": "^5.0.0", @@ -69885,12 +73626,10 @@ } }, "hast-util-whitespace": { - "version": "2.0.0", - "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==" + "version": "2.0.0" }, "hastscript": { "version": "6.0.0", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", "requires": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", @@ -69900,16 +73639,13 @@ } }, "he": { - "version": "1.2.0", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + "version": "1.2.0" }, "highlight.js": { - "version": "10.7.3", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + "version": "10.7.3" }, "history": { "version": "4.10.1", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "requires": { "@babel/runtime": "^7.1.2", "loose-envify": "^1.2.0", @@ -69921,7 +73657,6 @@ }, "hmac-drbg": { "version": "1.0.1", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -69930,32 +73665,22 @@ }, "hoist-non-react-statics": { "version": "3.3.2", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "requires": { "react-is": "^16.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, "homedir-polyfill": { "version": "1.0.3", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { "parse-passwd": "^1.0.0" } }, "hosted-git-info": { - "version": "2.8.9", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "version": "2.8.9" }, "hpack.js": { "version": "2.1.6", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -69965,32 +73690,44 @@ } }, "html-element-map": { - "version": "1.1.0", - "integrity": "sha512-iqiG3dTZmy+uUaTmHarTL+3/A2VW9ox/9uasKEZC+R/wAtUrTcRlXPSaPqsnWPfIu8wqn09jQNwMRqzL54jSYA==", + "version": "1.3.1", "dev": true, "requires": { - "array-filter": "^1.0.0" + "array.prototype.filter": "^1.0.0", + "call-bind": "^1.0.2" } }, "html-encoding-sniffer": { - "version": "2.0.1", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "version": "3.0.0", "dev": true, "requires": { - "whatwg-encoding": "^1.0.5" + "whatwg-encoding": "^2.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "whatwg-encoding": { + "version": "2.0.0", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + } } }, "html-entities": { - "version": "2.3.2", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==" + "version": "2.3.2" }, "html-escaper": { - "version": "2.0.2", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "version": "2.0.2" }, "html-minifier-terser": { "version": "5.1.1", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", "requires": { "camel-case": "^4.1.1", "clean-css": "^4.2.3", @@ -70002,23 +73739,19 @@ }, "dependencies": { "commander": { - "version": "4.1.1", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + "version": "4.1.1" } } }, "html-tags": { "version": "3.2.0", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", "dev": true }, "html-void-elements": { - "version": "1.0.5", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" + "version": "1.0.5" }, "html-webpack-plugin": { "version": "5.3.2", - "integrity": "sha512-HvB33boVNCz2lTyBsSiMffsJ+m0YLIQ+pskblXgN9fnjS1BgEcuAfdInfXfGrkdXV406k9FiDi86eVCDBgJOyQ==", "requires": { "@types/html-minifier-terser": "^5.0.0", "html-minifier-terser": "^5.0.1", @@ -70028,14 +73761,12 @@ }, "dependencies": { "tapable": { - "version": "2.2.1", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + "version": "2.2.1" } } }, "htmlparser2": { "version": "3.10.1", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "requires": { "domelementtype": "^1.3.1", @@ -70048,7 +73779,6 @@ "dependencies": { "readable-stream": { "version": "3.4.0", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -70059,18 +73789,15 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", "dev": true }, "http-deceiver": { "version": "1.2.7", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true }, "http-errors": { "version": "1.6.3", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "requires": { "depd": "~1.1.2", @@ -70080,13 +73807,11 @@ } }, "http-parser-js": { - "version": "0.5.3", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "version": "0.5.8", "dev": true }, "http-proxy": { "version": "1.18.1", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { "eventemitter3": "^4.0.0", @@ -70096,7 +73821,6 @@ }, "http-proxy-agent": { "version": "4.0.1", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { "@tootallnate/once": "1", @@ -70106,7 +73830,6 @@ "dependencies": { "debug": { "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -70114,17 +73837,15 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "http-proxy-middleware": { - "version": "2.0.1", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "version": "2.0.6", "dev": true, "requires": { - "@types/http-proxy": "^1.17.5", + "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", @@ -70133,7 +73854,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -70141,7 +73861,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -70149,26 +73868,22 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "is-plain-obj": { "version": "3.0.0", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true }, "micromatch": { - "version": "4.0.4", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -70178,7 +73893,6 @@ }, "http-signature": { "version": "1.2.0", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -70187,12 +73901,10 @@ } }, "https-browserify": { - "version": "1.0.0", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + "version": "1.0.0" }, "https-proxy-agent": { "version": "5.0.0", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, "requires": { "agent-base": "6", @@ -70201,7 +73913,6 @@ "dependencies": { "debug": { "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -70209,82 +73920,83 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "human-signals": { "version": "1.1.1", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "devOptional": true + "dev": true }, "humanize-ms": { "version": "1.2.1", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "requires": { "ms": "^2.0.0" } }, "hyphenate-style-name": { - "version": "1.0.4", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + "version": "1.0.4" }, "iconv-lite": { "version": "0.4.24", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "icss-utils": { "version": "5.1.0", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true }, "ieee754": { - "version": "1.2.1", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "version": "1.2.1" }, "iferr": { - "version": "0.1.5", - "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" + "version": "0.1.5" }, "ignore": { - "version": "4.0.6", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "version": "4.0.6" }, "ignore-styles": { "version": "5.0.1", - "integrity": "sha512-gQQmIznCETPLEzfg1UH4Cs2oRq+HBPl8quroEUNXT8oybEG7/0lqI3dGgDSRry6B9HcCXw3PVkFFS0FF3CMddg==", "dev": true }, "ignore-walk": { - "version": "3.0.4", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "version": "5.0.1", "dev": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.2", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "image-size": { "version": "0.5.5", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, "optional": true }, "immer": { - "version": "9.0.6", - "integrity": "sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ==" + "version": "9.0.6" }, "immutable": { - "version": "3.8.2", - "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==" + "version": "3.8.2" }, "import-fresh": { "version": "3.3.0", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -70292,7 +74004,6 @@ }, "import-local": { "version": "3.0.2", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dev": true, "requires": { "pkg-dir": "^4.2.0", @@ -70301,7 +74012,6 @@ "dependencies": { "find-up": { "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -70310,7 +74020,6 @@ }, "locate-path": { "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -70318,7 +74027,6 @@ }, "p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -70326,7 +74034,6 @@ }, "p-locate": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -70334,17 +74041,14 @@ }, "p-try": { "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "path-exists": { "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "pkg-dir": { "version": "4.2.0", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { "find-up": "^4.0.0" @@ -70354,7 +74058,6 @@ }, "imports-loader": { "version": "3.0.0", - "integrity": "sha512-PhDB+rxpc95/1cM8ehxWAcuDIDi3eXhqHhax09iyUeAYBJ2bT6QbBp7aDj8IfU9Ns+2l1K226GhoWVAU823CTA==", "dev": true, "requires": { "source-map": "^0.6.1", @@ -70363,152 +74066,155 @@ "dependencies": { "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "imurmurhash": { - "version": "0.1.4", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + "version": "0.1.4" }, "indent-string": { - "version": "4.0.0", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "version": "4.0.0" }, "infer-owner": { - "version": "1.0.4", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + "version": "1.0.4" }, "inflight": { "version": "1.0.6", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { - "version": "2.0.3", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "version": "2.0.3" }, "ini": { - "version": "1.3.8", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "version": "1.3.8" }, "init-package-json": { - "version": "2.0.5", - "integrity": "sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA==", + "version": "3.0.2", "dev": true, "requires": { - "npm-package-arg": "^8.1.5", + "npm-package-arg": "^9.0.1", "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "^4.1.1", + "read": "^1.0.7", + "read-package-json": "^5.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0" + "validate-npm-package-name": "^4.0.0" }, "dependencies": { - "hosted-git-info": { - "version": "4.1.0", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "builtins": { + "version": "5.0.1", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "semver": "^7.0.0" } }, - "lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "hosted-git-info": { + "version": "5.2.1", "dev": true, "requires": { - "yallist": "^4.0.0" + "lru-cache": "^7.5.1" } }, - "normalize-package-data": { - "version": "3.0.3", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", "dev": true, "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" } }, - "read-package-json": { - "version": "4.1.1", - "integrity": "sha512-P82sbZJ3ldDrWCOSKxJT0r/CXMWR0OR3KRh55SgKo3p91GSIEEC32v3lSHAvO/UcH3/IoL7uqhOFBduAnwdldw==", + "proc-log": { + "version": "2.0.1", + "dev": true + }, + "semver": { + "version": "7.3.8", "dev": true, "requires": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, - "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "validate-npm-package-name": { + "version": "4.0.0", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "builtins": "^5.0.0" } }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "inline-style-parser": { - "version": "0.1.1", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + "version": "0.1.1" }, "inline-style-prefixer": { "version": "3.0.8", - "integrity": "sha512-ne8XIyyqkRaNJ1JfL1NYzNdCNxq+MCBQhC8NgOQlzNm2vv3XxlP0VSLQUbSRCF6KPEoveCVEpayHoHzcMyZsMQ==", "requires": { "bowser": "^1.7.3", "css-in-js-utils": "^2.0.0" } }, "inquirer": { - "version": "7.3.3", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "devOptional": true, + "version": "8.2.5", + "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "mute-stream": "0.0.8", + "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^6.6.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-regex": { "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "devOptional": true + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "devOptional": true + "dev": true + }, + "rxjs": { + "version": "7.8.0", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "devOptional": true, + "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -70517,98 +74223,71 @@ }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "devOptional": true, + "dev": true, "requires": { "ansi-regex": "^5.0.1" } - } - } - }, - "insert-css": { - "version": "2.0.0", - "integrity": "sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA==" - }, - "internal-ip": { - "version": "6.2.0", - "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", - "dev": true, - "requires": { - "default-gateway": "^6.0.0", - "ipaddr.js": "^1.9.1", - "is-ip": "^3.1.0", - "p-event": "^4.2.0" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + }, + "tslib": { + "version": "2.4.1", "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } } } }, "internal-slot": { - "version": "1.0.3", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" } }, "internmap": { - "version": "1.0.1", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + "version": "1.0.1" }, "interpret": { - "version": "2.2.0", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" + "version": "2.2.0" }, "interweave": { - "version": "11.2.0", - "integrity": "sha512-33h9LOXbT52tMin3IyLBPcd5RbiwroP/Sxr0OamnJJU7A/jh0XtZKGvdcSNKYRC7sLZuDk+ZJ2XVrmkcMU5i6w==", + "version": "13.0.0", "requires": { - "@types/react": "*", - "escape-html": "^1.0.3", - "prop-types": "^15.7.2" + "escape-html": "^1.0.3" } }, "invariant": { "version": "2.2.4", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { "loose-envify": "^1.0.0" } }, "ip": { - "version": "1.1.5", - "integrity": "sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==" - }, - "ip-regex": { - "version": "2.1.0", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "dev": true + "version": "1.1.5" }, "ipaddr.js": { "version": "2.0.1", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true }, "is-absolute-url": { "version": "3.0.3", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "dev": true }, "is-accessor-descriptor": { "version": "0.1.6", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "requires": { "is-buffer": "^1.1.5" } @@ -70616,12 +74295,10 @@ } }, "is-alphabetical": { - "version": "1.0.4", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + "version": "1.0.4" }, "is-alphanumerical": { "version": "1.0.2", - "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", "requires": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" @@ -70629,26 +74306,30 @@ }, "is-arguments": { "version": "1.1.1", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, + "is-array-buffer": { + "version": "3.0.1", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { - "version": "0.2.1", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "version": "0.2.1" }, "is-bigint": { "version": "1.0.4", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "requires": { "has-bigints": "^1.0.1" } }, "is-binary-path": { "version": "1.0.1", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "optional": true, "requires": { "binary-extensions": "^1.0.0" @@ -70656,45 +74337,38 @@ }, "is-boolean-object": { "version": "1.1.2", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-buffer": { - "version": "1.1.6", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "version": "1.1.6" }, "is-callable": { - "version": "1.2.4", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + "version": "1.2.7" }, "is-ci": { "version": "2.0.0", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { "ci-info": "^2.0.0" } }, "is-core-module": { - "version": "2.8.0", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.11.0", "requires": { "has": "^1.0.3" } }, "is-data-descriptor": { "version": "0.1.4", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "requires": { "is-buffer": "^1.1.5" } @@ -70702,16 +74376,13 @@ } }, "is-date-object": { - "version": "1.0.1", - "integrity": "sha512-P5rExV1phPi42ppoMWy7V63N3i173RY921l4JJ7zonMSxK+OWGPj76GD+cUKUb68l4vQXcJp2SsG+r/A4ABVzg==" + "version": "1.0.1" }, "is-decimal": { - "version": "1.0.2", - "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==" + "version": "1.0.2" }, "is-descriptor": { "version": "0.1.6", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -70719,92 +74390,62 @@ } }, "is-docker": { - "version": "2.2.1", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + "version": "2.2.1" }, "is-dom": { "version": "1.1.0", - "integrity": "sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ==", "requires": { "is-object": "^1.0.1", "is-window": "^1.0.2" } }, "is-extendable": { - "version": "0.1.1", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + "version": "0.1.1" }, "is-extglob": { - "version": "2.1.1", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + "version": "2.1.1" }, "is-fullwidth-code-point": { - "version": "2.0.0", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" + "version": "2.0.0" }, "is-function": { - "version": "1.0.2", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + "version": "1.0.2" }, "is-generator-fn": { "version": "2.1.0", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, "is-glob": { "version": "4.0.3", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, "is-hexadecimal": { - "version": "1.0.2", - "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==" + "version": "1.0.2" }, "is-interactive": { "version": "1.0.0", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, - "is-ip": { - "version": "3.1.0", - "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", - "dev": true, - "requires": { - "ip-regex": "^4.0.0" - }, - "dependencies": { - "ip-regex": { - "version": "4.3.0", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true - } - } - }, "is-lambda": { "version": "1.0.1", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, "is-map": { - "version": "2.0.2", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" + "version": "2.0.2" }, "is-negative-zero": { - "version": "2.0.1", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + "version": "2.0.2" }, "is-number": { "version": "3.0.0", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "requires": { "is-buffer": "^1.1.5" } @@ -70813,66 +74454,44 @@ }, "is-number-object": { "version": "1.0.6", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", "requires": { "has-tostringtag": "^1.0.0" } }, "is-obj": { "version": "2.0.0", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, "is-object": { - "version": "1.0.2", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==" + "version": "1.0.2" }, "is-observable": { "version": "1.1.0", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", "dev": true, "requires": { "symbol-observable": "^1.1.0" } }, - "is-path-cwd": { - "version": "2.2.0", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, "is-plain-obj": { "version": "1.1.0", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==" + "dev": true }, "is-plain-object": { "version": "2.0.4", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { "isobject": "^3.0.1" } }, "is-potential-custom-element-name": { "version": "1.0.1", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, "is-promise": { "version": "2.2.2", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true }, - "is-redirect": { - "version": "1.0.0", - "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==" - }, "is-regex": { "version": "1.1.4", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -70880,125 +74499,107 @@ }, "is-resolvable": { "version": "1.1.0", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, "is-retina": { - "version": "1.0.3", - "integrity": "sha512-/tCmbIETZwCd8uHWO+GvbRa7jxwHFHdfetHfiwoP0aN9UDf3prUJMtKn7iBFYipYhqY1bSTjur8hC/Dakt8eyw==" - }, - "is-retry-allowed": { - "version": "1.2.0", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + "version": "1.0.3" }, "is-set": { - "version": "2.0.2", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" + "version": "2.0.2" }, "is-shared-array-buffer": { - "version": "1.0.1", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + "version": "1.0.2", + "requires": { + "call-bind": "^1.0.2" + } }, "is-ssh": { - "version": "1.3.3", - "integrity": "sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ==", + "version": "1.4.0", "dev": true, "requires": { - "protocols": "^1.1.0" + "protocols": "^2.0.1" } }, "is-stream": { - "version": "1.1.0", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + "version": "1.1.0" }, "is-string": { "version": "1.0.7", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "requires": { "has-tostringtag": "^1.0.0" } }, "is-subset": { "version": "0.1.1", - "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", "dev": true }, "is-symbol": { "version": "1.0.4", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "requires": { "has-symbols": "^1.0.2" } }, "is-text-path": { "version": "1.0.1", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, "requires": { "text-extensions": "^1.0.0" } }, + "is-typed-array": { + "version": "1.1.10", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "is-unicode-supported": { "version": "0.1.0", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, - "is-utf8": { - "version": "0.2.1", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "optional": true - }, "is-weakref": { - "version": "1.0.1", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" } }, "is-whitespace-character": { - "version": "1.0.4", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" + "version": "1.0.4" }, "is-window": { - "version": "1.0.2", - "integrity": "sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg==" + "version": "1.0.2" }, "is-windows": { - "version": "1.0.2", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + "version": "1.0.2" }, "is-word-character": { - "version": "1.0.4", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" + "version": "1.0.4" }, "is-wsl": { - "version": "1.1.0", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==" + "version": "1.1.0" }, "isarray": { - "version": "1.0.0", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "version": "1.0.0" }, "isbinaryfile": { "version": "4.0.8", - "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==" + "dev": true }, "isexe": { - "version": "2.0.0", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "version": "2.0.0" }, "isobject": { - "version": "3.0.1", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + "version": "3.0.1" }, "isomorphic-fetch": { "version": "2.2.1", - "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==", "requires": { "node-fetch": "^1.0.1", "whatwg-fetch": ">=0.10.0" @@ -71006,7 +74607,6 @@ "dependencies": { "node-fetch": { "version": "1.7.3", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" @@ -71016,16 +74616,13 @@ }, "isstream": { "version": "0.1.2", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "istanbul-lib-coverage": { - "version": "3.0.0", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + "version": "3.0.0" }, "istanbul-lib-instrument": { "version": "4.0.3", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { "@babel/core": "^7.7.5", @@ -71036,14 +74633,12 @@ "dependencies": { "semver": { "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "istanbul-lib-report": { "version": "3.0.0", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "requires": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", @@ -71052,20 +74647,17 @@ "dependencies": { "make-dir": { "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { "semver": "^6.0.0" } }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" } } }, "istanbul-lib-source-maps": { "version": "4.0.0", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { "debug": "^4.1.1", @@ -71075,7 +74667,6 @@ "dependencies": { "debug": { "version": "4.3.1", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -71083,106 +74674,50 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "istanbul-reports": { "version": "3.0.2", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, - "istextorbinary": { - "version": "2.6.0", - "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==", - "requires": { - "binaryextensions": "^2.1.2", - "editions": "^2.2.0", - "textextensions": "^2.5.0" - }, - "dependencies": { - "binaryextensions": { - "version": "2.3.0", - "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==" - }, - "textextensions": { - "version": "2.6.0", - "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==" - } - } - }, "iterate-iterator": { - "version": "1.0.2", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==" + "version": "1.0.2" }, "iterate-value": { "version": "1.0.2", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", "requires": { "es-get-iterator": "^1.0.2", "iterate-iterator": "^1.0.1" } }, "jake": { - "version": "10.8.2", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "version": "10.8.5", + "dev": true, "requires": { - "async": "0.9.x", - "chalk": "^2.4.2", + "async": "^3.2.3", + "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "async": { - "version": "0.9.2", - "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==" - }, - "chalk": { - "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } } }, "java-properties": { "version": "1.0.2", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "dev": true }, "jed": { - "version": "1.1.1", - "integrity": "sha512-z35ZSEcXHxLW4yumw0dF6L464NT36vmx3wxJw8MDpraBcWuNVgUPZgPJKcu1HekNgwlMFNqol7i/IpSbjhqwqA==" + "version": "1.1.1" }, "jest": { "version": "26.6.3", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", "dev": true, "requires": { "@jest/core": "^26.6.3", @@ -71192,7 +74727,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -71200,7 +74734,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -71208,12 +74741,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-cli": { "version": "26.6.3", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", "dev": true, "requires": { "@jest/core": "^26.6.3", @@ -71233,7 +74764,6 @@ }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -71246,7 +74776,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -71255,7 +74784,6 @@ }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -71265,7 +74793,6 @@ }, "jest-changed-files": { "version": "26.6.2", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -71275,7 +74802,6 @@ "dependencies": { "cross-spawn": { "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -71285,7 +74811,6 @@ }, "execa": { "version": "4.1.0", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -71301,7 +74826,6 @@ }, "get-stream": { "version": "5.2.0", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -71309,12 +74833,10 @@ }, "is-stream": { "version": "2.0.0", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, "npm-run-path": { "version": "4.0.1", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" @@ -71322,12 +74844,10 @@ }, "path-key": { "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "shebang-command": { "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" @@ -71335,12 +74855,10 @@ }, "shebang-regex": { "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -71350,7 +74868,6 @@ }, "jest-config": { "version": "26.6.3", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", "dev": true, "requires": { "@babel/core": "^7.1.0", @@ -71375,7 +74892,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -71383,12 +74899,10 @@ }, "deepmerge": { "version": "4.2.2", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -71396,12 +74910,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -71414,7 +74926,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -71423,7 +74934,6 @@ }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -71433,7 +74943,6 @@ }, "jest-diff": { "version": "26.6.2", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -71444,7 +74953,6 @@ }, "jest-docblock": { "version": "26.0.0", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "dev": true, "requires": { "detect-newline": "^3.0.0" @@ -71452,7 +74960,6 @@ }, "jest-each": { "version": "26.6.2", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -71464,7 +74971,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -71472,7 +74978,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -71480,12 +74985,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -71498,7 +75001,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -71507,7 +75009,6 @@ }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -71517,7 +75018,6 @@ }, "jest-environment-enzyme": { "version": "7.1.2", - "integrity": "sha512-3tfaYAzO7qZSRrv+srQnfK16Vu5XwH/pHi8FpoqSHjKKngbHzXf7aBCBuWh8y3w0OtknHRfDMFrC60Khj+g1hA==", "dev": true, "requires": { "jest-environment-jsdom": "^24.0.0" @@ -71525,7 +75025,6 @@ "dependencies": { "@jest/console": { "version": "24.9.0", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "dev": true, "requires": { "@jest/source-map": "^24.9.0", @@ -71535,7 +75034,6 @@ }, "@jest/environment": { "version": "24.9.0", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", "dev": true, "requires": { "@jest/fake-timers": "^24.9.0", @@ -71546,7 +75044,6 @@ }, "@jest/fake-timers": { "version": "24.9.0", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", "dev": true, "requires": { "@jest/types": "^24.9.0", @@ -71556,7 +75053,6 @@ }, "@jest/source-map": { "version": "24.9.0", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -71566,7 +75062,6 @@ }, "@jest/test-result": { "version": "24.9.0", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "dev": true, "requires": { "@jest/console": "^24.9.0", @@ -71576,7 +75071,6 @@ }, "@jest/transform": { "version": "24.9.0", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", @@ -71599,7 +75093,6 @@ }, "@jest/types": { "version": "24.9.0", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -71609,7 +75102,6 @@ }, "@types/yargs": { "version": "13.0.9", - "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -71617,12 +75109,10 @@ }, "acorn": { "version": "5.7.4", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true }, "acorn-globals": { "version": "4.3.4", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -71631,19 +75121,16 @@ "dependencies": { "acorn": { "version": "6.4.1", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true } } }, "acorn-walk": { "version": "6.2.0", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, "ansi-styles": { "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -71651,7 +75138,6 @@ }, "babel-plugin-istanbul": { "version": "5.2.0", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -71662,7 +75148,6 @@ }, "chalk": { "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -71672,12 +75157,10 @@ }, "cssom": { "version": "0.3.8", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, "cssstyle": { "version": "1.4.0", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { "cssom": "0.3.x" @@ -71685,7 +75168,6 @@ }, "data-urls": { "version": "1.1.0", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, "requires": { "abab": "^2.0.0", @@ -71695,7 +75177,6 @@ "dependencies": { "whatwg-url": { "version": "7.1.0", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -71707,7 +75188,6 @@ }, "domexception": { "version": "1.0.1", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, "requires": { "webidl-conversions": "^4.0.2" @@ -71715,7 +75195,6 @@ }, "find-up": { "version": "3.0.0", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" @@ -71723,7 +75202,6 @@ }, "html-encoding-sniffer": { "version": "1.0.2", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { "whatwg-encoding": "^1.0.1" @@ -71731,12 +75209,10 @@ }, "istanbul-lib-coverage": { "version": "2.0.5", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true }, "istanbul-lib-instrument": { "version": "3.3.0", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "requires": { "@babel/generator": "^7.4.0", @@ -71750,7 +75226,6 @@ }, "jest-environment-jsdom": { "version": "24.9.0", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "dev": true, "requires": { "@jest/environment": "^24.9.0", @@ -71763,7 +75238,6 @@ }, "jest-haste-map": { "version": "24.9.0", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { "@jest/types": "^24.9.0", @@ -71782,7 +75256,6 @@ }, "jest-message-util": { "version": "24.9.0", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -71797,7 +75270,6 @@ }, "jest-mock": { "version": "24.9.0", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "dev": true, "requires": { "@jest/types": "^24.9.0" @@ -71805,17 +75277,14 @@ }, "jest-regex-util": { "version": "24.9.0", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", "dev": true }, "jest-serializer": { "version": "24.9.0", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, "jest-util": { "version": "24.9.0", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { "@jest/console": "^24.9.0", @@ -71834,7 +75303,6 @@ }, "jest-worker": { "version": "24.9.0", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", "dev": true, "requires": { "merge-stream": "^2.0.0", @@ -71843,7 +75311,6 @@ "dependencies": { "supports-color": { "version": "6.1.0", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -71853,7 +75320,6 @@ }, "jsdom": { "version": "11.12.0", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", "dev": true, "requires": { "abab": "^2.0.0", @@ -71886,7 +75352,6 @@ }, "locate-path": { "version": "3.0.0", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -71895,7 +75360,6 @@ }, "p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -71903,7 +75367,6 @@ }, "p-locate": { "version": "3.0.0", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" @@ -71911,17 +75374,14 @@ }, "p-try": { "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "parse5": { "version": "4.0.0", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true }, "read-pkg": { "version": "3.0.0", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "requires": { "load-json-file": "^4.0.0", @@ -71931,7 +75391,6 @@ }, "read-pkg-up": { "version": "4.0.0", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "requires": { "find-up": "^3.0.0", @@ -71940,22 +75399,18 @@ }, "semver": { "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "stack-utils": { "version": "1.0.2", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", "dev": true }, "supports-color": { "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -71963,7 +75418,6 @@ }, "test-exclude": { "version": "5.2.3", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", "dev": true, "requires": { "glob": "^7.1.3", @@ -71974,7 +75428,6 @@ }, "write-file-atomic": { "version": "2.4.1", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -71984,7 +75437,6 @@ }, "ws": { "version": "5.2.3", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", "dev": true, "requires": { "async-limiter": "~1.0.0" @@ -71994,7 +75446,6 @@ }, "jest-environment-jsdom": { "version": "26.6.2", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "dev": true, "requires": { "@jest/environment": "^26.6.2", @@ -72008,28 +75459,85 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" } }, + "cssom": { + "version": "0.4.4", + "dev": true + }, + "data-urls": { + "version": "2.0.0", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "domexception": { + "version": "2.0.1", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "dev": true + } + } + }, + "escodegen": { + "version": "2.0.0", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "dev": true + }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, + "form-data": { + "version": "3.0.1", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72040,28 +75548,107 @@ "micromatch": "^4.0.2" } }, + "jsdom": { + "version": "16.7.0", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + } + }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.0.5" } }, + "parse5": { + "version": "6.0.1", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "dev": true, + "optional": true + }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" } + }, + "tough-cookie": { + "version": "4.0.0", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, + "tr46": { + "version": "2.1.0", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "universalify": { + "version": "0.1.2", + "dev": true + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } } } }, "jest-environment-node": { "version": "26.6.2", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "dev": true, "requires": { "@jest/environment": "^26.6.2", @@ -72074,7 +75661,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -72082,7 +75668,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -72090,12 +75675,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72108,7 +75691,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -72117,7 +75699,6 @@ }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -72127,7 +75708,6 @@ }, "jest-enzyme": { "version": "7.1.2", - "integrity": "sha512-j+jkph3t5hGBS12eOldpfsnERYRCHi4c/0KWPMnqRPoJJXvCpLIc5th1MHl0xDznQDXVU0AHUXg3rqMrf8vGpA==", "dev": true, "requires": { "enzyme-matchers": "^7.1.2", @@ -72137,12 +75717,10 @@ }, "jest-get-type": { "version": "26.3.0", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "jest-haste-map": { "version": "26.6.2", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72163,7 +75741,6 @@ "dependencies": { "anymatch": { "version": "3.1.1", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -72172,7 +75749,6 @@ }, "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -72180,7 +75756,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -72188,12 +75763,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72206,7 +75779,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -72215,12 +75787,10 @@ }, "normalize-path": { "version": "3.0.0", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -72230,7 +75800,6 @@ }, "jest-jasmine2": { "version": "26.6.3", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", @@ -72255,7 +75824,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -72263,7 +75831,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -72271,12 +75838,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72289,7 +75854,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -72298,7 +75862,6 @@ }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -72308,7 +75871,6 @@ }, "jest-leak-detector": { "version": "26.6.2", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", "dev": true, "requires": { "jest-get-type": "^26.3.0", @@ -72317,7 +75879,6 @@ }, "jest-matcher-utils": { "version": "26.6.2", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -72328,7 +75889,6 @@ }, "jest-message-util": { "version": "26.6.2", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -72344,12 +75904,10 @@ "dependencies": { "@types/stack-utils": { "version": "2.0.0", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -72357,7 +75915,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -72365,12 +75922,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -72379,12 +75934,10 @@ }, "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -72394,7 +75947,6 @@ }, "jest-mock": { "version": "26.6.2", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72403,17 +75955,14 @@ }, "jest-pnp-resolver": { "version": "1.2.2", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "dev": true }, "jest-regex-util": { "version": "26.0.0", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", "dev": true }, "jest-resolve": { "version": "26.6.2", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72428,7 +75977,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -72436,7 +75984,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -72444,12 +75991,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72462,7 +76007,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -72471,12 +76015,10 @@ }, "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -72486,7 +76028,6 @@ }, "jest-resolve-dependencies": { "version": "26.6.3", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72496,7 +76037,6 @@ }, "jest-runner": { "version": "26.6.3", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", "dev": true, "requires": { "@jest/console": "^26.6.2", @@ -72523,7 +76063,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -72531,7 +76070,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -72539,12 +76077,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72557,7 +76093,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -72566,7 +76101,6 @@ }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -72576,7 +76110,6 @@ }, "jest-runtime": { "version": "26.6.3", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", "dev": true, "requires": { "@jest/console": "^26.6.2", @@ -72610,7 +76143,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -72618,7 +76150,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -72626,12 +76157,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72644,7 +76173,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -72653,17 +76181,14 @@ }, "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "strip-bom": { "version": "4.0.0", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -72673,7 +76198,6 @@ }, "jest-serializer": { "version": "26.6.2", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { "@types/node": "*", @@ -72682,7 +76206,6 @@ }, "jest-snapshot": { "version": "26.6.2", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", "dev": true, "requires": { "@babel/types": "^7.0.0", @@ -72705,14 +76228,12 @@ "dependencies": { "semver": { "version": "7.3.2", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } }, "jest-validate": { "version": "26.6.2", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72725,14 +76246,12 @@ "dependencies": { "camelcase": { "version": "6.2.0", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true } } }, "jest-watcher": { "version": "26.6.2", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", "dev": true, "requires": { "@jest/test-result": "^26.6.2", @@ -72746,7 +76265,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -72754,7 +76272,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -72762,12 +76279,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "jest-util": { "version": "26.6.2", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -72780,7 +76295,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -72789,7 +76303,6 @@ }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -72799,25 +76312,25 @@ }, "jest-websocket-mock": { "version": "2.2.0", - "integrity": "sha512-lc3wwXOEyNa4ZpcgJtUG3mmKMAq5FAsKYiZph0p/+PAJrAPuX4JCIfJMdJ/urRsLBG51fwm/wlVPNbR6s2nzNw==", "dev": true }, "jest-worker": { "version": "26.6.2", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" } }, + "jpeg-js": { + "version": "0.4.4", + "dev": true + }, "jquery": { - "version": "3.6.0", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + "version": "3.6.0" }, "js-beautify": { "version": "1.14.0", - "integrity": "sha512-yuck9KirNSCAwyNJbqW+BxJqJ0NLJ4PwBUzQQACl5O3qHMBXVkXb/rD0ilh/Lat/tn88zSZ+CAHOlk0DsY7GuQ==", "requires": { "config-chain": "^1.1.12", "editorconfig": "^0.15.3", @@ -72826,34 +76339,31 @@ } }, "js-levenshtein": { - "version": "1.1.6", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" + "version": "1.1.6" + }, + "js-sha3": { + "version": "0.8.0" }, "js-string-escape": { - "version": "1.0.1", - "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==" + "version": "1.0.1" }, "js-tokens": { - "version": "4.0.0", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "version": "4.0.0" }, "js-yaml": { "version": "3.13.1", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "dependencies": { "esprima": { - "version": "4.0.1", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "version": "4.0.1" } } }, "js-yaml-loader": { "version": "1.2.2", - "integrity": "sha512-H+NeuNrG6uOs/WMjna2SjkaCw13rMWiT/D7l9+9x5n8aq88BDsh2sRmdfxckWPIHtViYHWRG6XiCKYvS1dfyLg==", "requires": { "js-yaml": "^3.13.1", "loader-utils": "^1.2.3", @@ -72862,54 +76372,62 @@ }, "jsbn": { "version": "0.1.1", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, "jsdom": { - "version": "16.4.0", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "version": "20.0.0", "dev": true, "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", + "abab": "^2.0.6", + "acorn": "^8.7.1", "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", + "parse5": "^7.0.0", + "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", + "tough-cookie": "^4.0.0", "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.8.0", + "xml-name-validator": "^4.0.0" }, "dependencies": { - "acorn": { - "version": "7.4.1", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "@tootallnate/once": { + "version": "2.0.0", + "dev": true + }, + "debug": { + "version": "4.3.4", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "entities": { + "version": "4.3.1", "dev": true }, "escodegen": { - "version": "1.14.3", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.0.0", "dev": true, "requires": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" @@ -72917,122 +76435,182 @@ }, "esprima": { "version": "4.0.1", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "parse5": { - "version": "5.1.1", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "estraverse": { + "version": "5.3.0", + "dev": true + }, + "form-data": { + "version": "4.0.0", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.6.3", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ms": { + "version": "2.1.2", "dev": true }, + "parse5": { + "version": "7.0.0", + "dev": true, + "requires": { + "entities": "^4.3.0" + } + }, + "saxes": { + "version": "6.0.0", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true }, "tough-cookie": { - "version": "3.0.1", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "version": "4.0.0", "dev": true, "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" } }, "tr46": { - "version": "2.0.2", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "3.0.0", "dev": true, "requires": { "punycode": "^2.1.1" } }, + "universalify": { + "version": "0.1.2", + "dev": true + }, "webidl-conversions": { - "version": "6.1.0", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "version": "7.0.0", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "3.0.0", "dev": true }, "whatwg-url": { - "version": "8.4.0", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "11.0.0", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" } + }, + "ws": { + "version": "8.8.0", + "dev": true + }, + "xml-name-validator": { + "version": "4.0.0", + "dev": true } } }, "jsep": { - "version": "0.3.5", - "integrity": "sha512-AoRLBDc6JNnKjNcmonituEABS5bcfqDhQAWWXNTFrqu6nVXBpBAGfcoTGZMFlIrh9FjmE1CQyX9CTNwZrXMMDA==" + "version": "0.3.5" }, "jsesc": { - "version": "2.5.2", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "version": "2.5.2" }, "json-bigint": { "version": "1.0.0", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", "requires": { "bignumber.js": "^9.0.0" } }, "json-bignum": { - "version": "0.0.3", - "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==" + "version": "0.0.3" }, "json-parse-better-errors": { - "version": "1.0.2", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "version": "1.0.2" }, "json-parse-even-better-errors": { - "version": "2.3.1", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "version": "2.3.1" }, "json-schema": { - "version": "0.2.3", - "integrity": "sha512-a3xHnILGMtk+hDOqNwHzF6e2fNbiMrXZvxKQiEv2MlgQP+pjIOzqAmKYD2mDpXYE/44M7g+n9p2bKkYWDUcXCQ==", + "version": "0.4.0", "dev": true }, "json-schema-traverse": { - "version": "0.4.1", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "version": "0.4.1" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json-stringify-nice": { + "version": "1.1.4", "dev": true }, "json-stringify-pretty-compact": { - "version": "2.0.0", - "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" + "version": "2.0.0" }, "json-stringify-safe": { "version": "5.0.1", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "json2mq": { "version": "0.2.0", - "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", "requires": { "string-convert": "^0.2.0" } }, "json5": { - "version": "1.0.1", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", "requires": { "minimist": "^1.2.0" } }, + "jsonc-parser": { + "version": "3.2.0", + "dev": true + }, "jsonfile": { "version": "6.1.0", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -73040,32 +76618,28 @@ }, "jsonparse": { "version": "1.3.1", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "devOptional": true + "dev": true }, "JSONStream": { "version": "1.3.5", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "devOptional": true, + "dev": true, "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" } }, "jsprim": { - "version": "1.4.1", - "integrity": "sha512-4Dj8Rf+fQ+/Pn7C5qeEX02op1WfOss3PKTE9Nsop3Dx+6UPxlm1dr/og7o2cRa5hNN07CACr4NFzRLtj/rjWog==", + "version": "1.4.2", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, "jsx-ast-utils": { "version": "3.2.2", - "integrity": "sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -73074,7 +76648,6 @@ }, "junit-report-builder": { "version": "2.1.0", - "integrity": "sha512-Ioj5I4w18ZcHFaaisqCKdh1z+ipzN7sA2JB+h+WOlGcOMWm0FFN1dfxkgc2I4EXfhSP/mOfM3W43uFzEdz4sTw==", "dev": true, "requires": { "date-format": "0.0.2", @@ -73085,7 +76658,6 @@ "dependencies": { "make-dir": { "version": "1.3.0", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { "pify": "^3.0.0" @@ -73094,61 +76666,43 @@ } }, "junk": { - "version": "3.1.0", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==" + "version": "3.1.0" }, "just-extend": { "version": "4.1.0", - "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", "dev": true }, "kdbush": { - "version": "3.0.0", - "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + "version": "3.0.0" }, "kind-of": { - "version": "5.1.0", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "version": "5.1.0" }, "klaw": { "version": "1.3.1", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", "requires": { "graceful-fs": "^4.1.9" } }, "kleur": { - "version": "3.0.3", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + "version": "3.0.3" }, "klona": { - "version": "2.0.5", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" + "version": "2.0.5" }, "language-subtag-registry": { "version": "0.3.21", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", "dev": true }, "language-tags": { "version": "1.0.5", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", "dev": true, "requires": { "language-subtag-registry": "~0.3.2" } }, - "lazy-cache": { - "version": "2.0.2", - "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==", - "optional": true, - "requires": { - "set-getter": "^0.1.0" - } - }, "lazy-universal-dotenv": { "version": "3.0.1", - "integrity": "sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==", "requires": { "@babel/runtime": "^7.5.0", "app-root-dir": "^1.0.2", @@ -73159,37 +76713,39 @@ }, "left-pad": { "version": "1.3.0", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", "dev": true }, "lerna": { - "version": "4.0.0", - "integrity": "sha512-DD/i1znurfOmNJb0OBw66NmNqiM8kF6uIrzrJ0wGE3VNdzeOhz9ziWLYiRaZDGGwgbcjOo6eIfcx9O5Qynz+kg==", - "dev": true, - "requires": { - "@lerna/add": "4.0.0", - "@lerna/bootstrap": "4.0.0", - "@lerna/changed": "4.0.0", - "@lerna/clean": "4.0.0", - "@lerna/cli": "4.0.0", - "@lerna/create": "4.0.0", - "@lerna/diff": "4.0.0", - "@lerna/exec": "4.0.0", - "@lerna/import": "4.0.0", - "@lerna/info": "4.0.0", - "@lerna/init": "4.0.0", - "@lerna/link": "4.0.0", - "@lerna/list": "4.0.0", - "@lerna/publish": "4.0.0", - "@lerna/run": "4.0.0", - "@lerna/version": "4.0.0", + "version": "6.1.0", + "dev": true, + "requires": { + "@lerna/add": "6.1.0", + "@lerna/bootstrap": "6.1.0", + "@lerna/changed": "6.1.0", + "@lerna/clean": "6.1.0", + "@lerna/cli": "6.1.0", + "@lerna/command": "6.1.0", + "@lerna/create": "6.1.0", + "@lerna/diff": "6.1.0", + "@lerna/exec": "6.1.0", + "@lerna/import": "6.1.0", + "@lerna/info": "6.1.0", + "@lerna/init": "6.1.0", + "@lerna/link": "6.1.0", + "@lerna/list": "6.1.0", + "@lerna/publish": "6.1.0", + "@lerna/run": "6.1.0", + "@lerna/version": "6.1.0", + "@nrwl/devkit": ">=14.8.6 < 16", "import-local": "^3.0.2", - "npmlog": "^4.1.2" + "inquirer": "^8.2.4", + "npmlog": "^6.0.2", + "nx": ">=14.8.6 < 16", + "typescript": "^3 || ^4" } }, "less": { "version": "3.12.2", - "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", "dev": true, "requires": { "errno": "^0.1.1", @@ -73204,7 +76760,6 @@ "dependencies": { "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true } @@ -73212,7 +76767,6 @@ }, "less-loader": { "version": "10.2.0", - "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", "dev": true, "requires": { "klona": "^2.0.4" @@ -73220,109 +76774,234 @@ }, "leven": { "version": "3.1.0", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, "levn": { "version": "0.3.0", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" } }, "libnpmaccess": { - "version": "4.0.3", - "integrity": "sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ==", + "version": "6.0.4", "dev": true, "requires": { "aproba": "^2.0.0", "minipass": "^3.1.1", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0" + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0" }, "dependencies": { "aproba": { "version": "2.0.0", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "builtins": { + "version": "5.0.1", + "dev": true, + "requires": { + "semver": "^7.0.0" + } + }, + "hosted-git-info": { + "version": "5.2.1", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "minipass-fetch": { + "version": "2.1.2", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "npm-registry-fetch": { + "version": "13.3.1", + "dev": true, + "requires": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + } + }, + "proc-log": { + "version": "2.0.1", + "dev": true + }, + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + }, + "yallist": { + "version": "4.0.0", "dev": true } } }, "libnpmpublish": { - "version": "4.0.2", - "integrity": "sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw==", + "version": "6.0.5", "dev": true, "requires": { - "normalize-package-data": "^3.0.2", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0", - "semver": "^7.1.3", - "ssri": "^8.0.1" + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0", + "semver": "^7.3.7", + "ssri": "^9.0.0" }, "dependencies": { + "builtins": { + "version": "5.0.1", + "dev": true, + "requires": { + "semver": "^7.0.0" + } + }, "hosted-git-info": { - "version": "4.1.0", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "version": "5.2.1", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.5.1" } }, "lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "7.14.1", + "dev": true + }, + "minipass-fetch": { + "version": "2.1.2", "dev": true, "requires": { - "yallist": "^4.0.0" + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" } }, "normalize-package-data": { - "version": "3.0.3", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "version": "4.0.1", "dev": true, "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" } }, + "npm-package-arg": { + "version": "9.1.2", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "npm-registry-fetch": { + "version": "13.3.1", + "dev": true, + "requires": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + } + }, + "proc-log": { + "version": "2.0.1", + "dev": true + }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", "dev": true, "requires": { "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "version": "9.0.1", "dev": true, "requires": { "minipass": "^3.1.1" } }, + "validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "lilconfig": { "version": "2.0.3", - "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", "dev": true }, "lines-and-columns": { - "version": "1.1.6", - "integrity": "sha512-8ZmlJFVK9iCmtLz19HpSsR8HaAMWBT284VMNednLwlIMDP2hJDCIhUp0IZ2xUcZ+Ob6BM0VvCSJwzASDM45NLQ==" + "version": "1.1.6" }, "listr": { "version": "0.14.3", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", "dev": true, "requires": { "@samverschueren/stream-to-observable": "^0.3.0", @@ -73338,19 +77017,16 @@ "dependencies": { "p-map": { "version": "2.1.0", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true } } }, "listr-silent-renderer": { "version": "1.1.1", - "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", "dev": true }, "listr-update-renderer": { "version": "0.5.0", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -73365,22 +77041,18 @@ "dependencies": { "ansi-escapes": { "version": "3.2.0", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { - "version": "3.0.0", - "integrity": "sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==", + "version": "3.0.1", "dev": true }, "ansi-styles": { "version": "2.2.1", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true }, "chalk": { "version": "1.1.3", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "requires": { "ansi-styles": "^2.2.1", @@ -73392,7 +77064,6 @@ }, "cli-cursor": { "version": "2.1.0", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "requires": { "restore-cursor": "^2.0.0" @@ -73400,7 +77071,6 @@ }, "cli-truncate": { "version": "0.2.1", - "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", "dev": true, "requires": { "slice-ansi": "0.0.4", @@ -73409,7 +77079,6 @@ }, "figures": { "version": "1.7.0", - "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5", @@ -73418,12 +77087,10 @@ }, "indent-string": { "version": "3.2.0", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -73431,7 +77098,6 @@ }, "log-symbols": { "version": "1.0.2", - "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", "dev": true, "requires": { "chalk": "^1.0.0" @@ -73439,7 +77105,6 @@ }, "log-update": { "version": "2.3.0", - "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", "dev": true, "requires": { "ansi-escapes": "^3.0.0", @@ -73449,12 +77114,10 @@ }, "mimic-fn": { "version": "1.2.0", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "onetime": { "version": "2.0.1", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "requires": { "mimic-fn": "^1.0.0" @@ -73462,7 +77125,6 @@ }, "restore-cursor": { "version": "2.0.0", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "requires": { "onetime": "^2.0.0", @@ -73471,12 +77133,10 @@ }, "slice-ansi": { "version": "0.0.4", - "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", "dev": true }, "string-width": { "version": "1.0.2", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -73486,12 +77146,10 @@ }, "supports-color": { "version": "2.0.0", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true }, "wrap-ansi": { "version": "3.0.1", - "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", "dev": true, "requires": { "string-width": "^2.1.1", @@ -73500,12 +77158,10 @@ "dependencies": { "is-fullwidth-code-point": { "version": "2.0.0", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true }, "string-width": { "version": "2.1.1", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -73514,7 +77170,6 @@ }, "strip-ansi": { "version": "4.0.0", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -73526,7 +77181,6 @@ }, "listr-verbose-renderer": { "version": "0.5.0", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -73537,7 +77191,6 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -73545,7 +77198,6 @@ }, "chalk": { "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -73555,7 +77207,6 @@ }, "cli-cursor": { "version": "2.1.0", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "requires": { "restore-cursor": "^2.0.0" @@ -73563,12 +77214,10 @@ }, "date-fns": { "version": "1.30.1", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", "dev": true }, "figures": { "version": "2.0.0", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -73576,12 +77225,10 @@ }, "mimic-fn": { "version": "1.2.0", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "onetime": { "version": "2.0.1", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "requires": { "mimic-fn": "^1.0.0" @@ -73589,7 +77236,6 @@ }, "restore-cursor": { "version": "2.0.0", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "requires": { "onetime": "^2.0.0", @@ -73598,7 +77244,6 @@ }, "supports-color": { "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -73608,7 +77253,6 @@ }, "load-json-file": { "version": "4.0.0", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -73619,12 +77263,10 @@ }, "loader-runner": { "version": "4.2.0", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", "dev": true }, "loader-utils": { - "version": "1.4.0", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "1.4.2", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -73633,7 +77275,6 @@ }, "locate-path": { "version": "2.0.0", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, "requires": { "p-locate": "^2.0.0", @@ -73641,16 +77282,13 @@ } }, "lodash": { - "version": "4.17.21", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.21" }, "lodash-es": { - "version": "4.17.21", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "version": "4.17.21" }, "lodash._baseisequal": { "version": "3.0.7", - "integrity": "sha512-U+3GsNEZj9ebI03ncLC2pLmYVjgtYZEwdkAPO7UGgtGvAz36JVFPAQUufpSaVL93Cz5arc6JGRKZRhaOhyVJYA==", "dev": true, "requires": { "lodash.isarray": "^3.0.0", @@ -73660,86 +77298,61 @@ }, "lodash._bindcallback": { "version": "3.0.1", - "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", "dev": true }, "lodash._getnative": { "version": "3.9.1", - "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", "dev": true }, "lodash.camelcase": { - "version": "4.3.0", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + "version": "4.3.0" }, "lodash.curry": { - "version": "4.1.1", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + "version": "4.1.1" }, "lodash.debounce": { - "version": "4.0.8", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "version": "4.0.8" }, "lodash.escape": { "version": "4.0.1", - "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", "dev": true }, "lodash.flatten": { "version": "4.4.0", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, "lodash.flattendeep": { "version": "4.4.0", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, - "lodash.flow": { - "version": "3.5.0", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" - }, "lodash.get": { - "version": "4.4.2", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + "version": "4.4.2" }, "lodash.isarguments": { "version": "3.1.0", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", "dev": true }, "lodash.isarray": { "version": "3.0.4", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", "dev": true }, "lodash.isequal": { - "version": "4.5.0", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + "version": "4.5.0" }, "lodash.ismatch": { "version": "4.4.0", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true }, "lodash.isplainobject": { "version": "4.0.6", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, "lodash.istypedarray": { "version": "3.0.6", - "integrity": "sha512-lGWJ6N8AA3KSv+ZZxlTdn4f6A7kMfpJboeyvbFdE7IU9YAgweODqmOgdUHOA+c6lVWeVLysdaxciFXi+foVsWw==", "dev": true }, "lodash.keys": { "version": "3.1.2", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", "dev": true, "requires": { "lodash._getnative": "^3.0.0", @@ -73749,60 +77362,29 @@ }, "lodash.memoize": { "version": "4.1.2", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, "lodash.merge": { "version": "4.6.2", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "lodash.pick": { "version": "4.4.0", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", "dev": true }, "lodash.sortby": { "version": "4.7.0", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" - }, - "lodash.template": { - "version": "4.5.0", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.throttle": { - "version": "4.1.1", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "lodash.topath": { - "version": "4.5.2", - "integrity": "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==" + "dev": true }, "lodash.truncate": { "version": "4.4.2", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, "lodash.uniq": { - "version": "4.5.0", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + "version": "4.5.0" }, "log-symbols": { "version": "4.1.0", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -73810,36 +77392,27 @@ } }, "long": { - "version": "3.2.0", - "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==" + "version": "3.2.0" }, "loose-envify": { "version": "1.4.0", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } }, "lower-case": { "version": "2.0.2", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "requires": { "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "2.1.0", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + "version": "2.1.0" } } }, - "lowercase-keys": { - "version": "1.0.1", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, "lowlight": { "version": "1.20.0", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", "requires": { "fault": "^1.0.0", "highlight.js": "~10.7.0" @@ -73847,120 +77420,210 @@ }, "lru-cache": { "version": "5.1.1", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { "yallist": "^3.0.2" } }, "lz-string": { "version": "1.4.4", - "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", "dev": true }, "magic-string": { "version": "0.22.5", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "requires": { "vlq": "^0.2.2" } }, "make-dir": { "version": "2.1.0", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "requires": { "pify": "^4.0.1", "semver": "^5.6.0" }, "dependencies": { "pify": { - "version": "4.0.1", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "version": "4.0.1" } } }, "make-fetch-happen": { - "version": "8.0.14", - "integrity": "sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==", + "version": "10.2.1", "dev": true, "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.0.5", + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", + "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", + "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^5.0.0", - "ssri": "^8.0.0" + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" }, "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, "cacache": { - "version": "15.3.0", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "version": "16.1.3", "dev": true, "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" } }, "chownr": { "version": "2.0.0", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, + "debug": { + "version": "4.3.4", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "glob": { + "version": "8.0.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "7.14.1", + "dev": true + }, + "minimatch": { + "version": "5.1.2", "dev": true, "requires": { - "yallist": "^4.0.0" + "brace-expansion": "^2.0.1" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" } }, "mkdirp": { "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, + "ms": { + "version": "2.1.2", + "dev": true + }, + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, "ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "version": "9.0.1", "dev": true, "requires": { "minipass": "^3.1.1" } }, + "unique-filename": { + "version": "2.0.1", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "makeerror": { "version": "1.0.11", - "integrity": "sha512-M/XvMZ6oK4edXjvg/ZYyzByg8kjpVrF/m0x3wbhOlzJfsQgFkqP1rJnLnJExOcslmLSSeLiN6NmF+cBoKJHGTg==", "dev": true, "requires": { "tmpl": "1.0.x" @@ -73968,43 +77631,37 @@ }, "map-age-cleaner": { "version": "0.1.3", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { "p-defer": "^1.0.0" } }, "map-cache": { - "version": "0.2.2", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" + "version": "0.2.2" }, "map-obj": { "version": "4.3.0", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, "map-or-similar": { - "version": "1.5.0", - "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==" + "version": "1.5.0" }, "map-visit": { "version": "1.0.0", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", "requires": { "object-visit": "^1.0.0" } }, "mapbox-gl": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-2.12.1.tgz", - "integrity": "sha512-45LVQauimFGX/fkCJzK3O2KpQQrIB0fGlg8sERu4NH0xWiBw9JsLOLYD2xAgD5SPramQvsjzM7vYWIkGxpGYNQ==", + "version": "2.10.0", "requires": { - "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/geojson-rewind": "^0.5.1", + "@mapbox/geojson-types": "^1.0.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/mapbox-gl-supported": "^2.0.1", "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^2.0.6", - "@mapbox/unitbezier": "^0.0.1", + "@mapbox/tiny-sdf": "^2.0.5", + "@mapbox/unitbezier": "^0.0.0", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", "csscolorparser": "~1.0.3", @@ -74014,57 +77671,22 @@ "grid-index": "^1.1.0", "murmurhash-js": "^1.0.0", "pbf": "^3.2.1", - "potpack": "^2.0.0", + "potpack": "^1.0.2", "quickselect": "^2.0.0", "rw": "^1.3.3", - "supercluster": "^7.1.5", + "supercluster": "^7.1.4", "tinyqueue": "^2.0.3", "vt-pbf": "^3.1.3" }, "dependencies": { - "@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "requires": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" - } - }, - "@mapbox/mapbox-gl-supported": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-2.0.1.tgz", - "integrity": "sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ==" - }, "@mapbox/tiny-sdf": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", - "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==" - }, - "@mapbox/unitbezier": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "version": "2.0.5" }, "gl-matrix": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", - "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" - }, - "potpack": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", - "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" + "version": "3.4.3" }, "supercluster": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", - "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", "requires": { "kdbush": "^3.0.0" } @@ -74072,43 +77694,35 @@ } }, "markdown-escapes": { - "version": "1.0.4", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" + "version": "1.0.4" }, "markdown-to-jsx": { - "version": "7.1.3", - "integrity": "sha512-jtQ6VyT7rMT5tPV0g2EJakEnXLiPksnvlYtwQsVVZ611JsWGN8bQ1tVSDX4s6JllfEH6wmsYxNjTUAMrPmNA8w==" + "version": "7.1.3" }, "match-sorter": { "version": "6.3.0", - "integrity": "sha512-efYOf/wUpNb8FgNY+cOD2EIJI1S5I7YPKsw0LBp7wqPh5pmMS6i/wr3ZWwfwrAw1NvqTA2KUReVRWDX84lUcOQ==", "requires": { "@babel/runtime": "^7.12.5", "remove-accents": "0.4.2" } }, "material-colors": { - "version": "1.2.6", - "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + "version": "1.2.6" }, "math-expression-evaluator": { - "version": "1.3.8", - "integrity": "sha512-9FbRY3i6U+CbHgrdNbAUaisjWTozkm1ZfupYQJiZ87NtYHk2Zh9DvxMgp/fifxVhqTLpd5fCCLossUbpZxGeKw==" + "version": "1.3.8" }, "math.gl": { "version": "3.5.3", - "integrity": "sha512-cRQRZlc+XvNHd3bIfu3kdPPPAW0vwDelZJmkjn2TDvCyPcmyDtAiZ2Poo1aFoINP7HzN6oHYxapc/0wV3q6Opg==", "requires": { "@math.gl/core": "3.5.3" } }, "mathfn": { - "version": "1.2.0", - "integrity": "sha512-QBcepxkFxuGk12q4G0KuNbuU3UCXhDROxWZllaNZSpBivkHl2z8qNvi7UGE/WLJt+c7GTC4jigYtur+JDL+40A==" + "version": "1.2.0" }, "md5": { "version": "2.2.1", - "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", "requires": { "charenc": "~0.0.1", "crypt": "~0.0.1", @@ -74117,7 +77731,6 @@ }, "md5.js": { "version": "1.3.5", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -74126,25 +77739,21 @@ }, "mdast-squeeze-paragraphs": { "version": "4.0.0", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", "requires": { "unist-util-remove": "^2.0.0" } }, "mdast-util-definitions": { "version": "4.0.0", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", "requires": { "unist-util-visit": "^2.0.0" }, "dependencies": { "unist-util-is": { - "version": "4.1.0", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + "version": "4.1.0" }, "unist-util-visit": { "version": "2.0.3", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", @@ -74153,7 +77762,6 @@ }, "unist-util-visit-parents": { "version": "3.1.1", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" @@ -74163,7 +77771,6 @@ }, "mdast-util-from-markdown": { "version": "1.2.0", - "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", "requires": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", @@ -74180,14 +77787,12 @@ }, "dependencies": { "mdast-util-to-string": { - "version": "3.1.0", - "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==" + "version": "3.1.0" } } }, "mdast-util-to-hast": { "version": "10.0.1", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", "requires": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", @@ -74200,12 +77805,10 @@ }, "dependencies": { "unist-util-is": { - "version": "4.1.0", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + "version": "4.1.0" }, "unist-util-visit": { "version": "2.0.3", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", @@ -74214,7 +77817,6 @@ }, "unist-util-visit-parents": { "version": "3.1.1", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" @@ -74224,25 +77826,20 @@ }, "mdast-util-to-string": { "version": "1.1.0", - "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", "dev": true }, "mdn-data": { "version": "2.0.14", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, "mdurl": { - "version": "1.0.1", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + "version": "1.0.1" }, "media-typer": { - "version": "0.3.0", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + "version": "0.3.0" }, "mem": { "version": "8.1.1", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", "dev": true, "requires": { "map-age-cleaner": "^0.1.3", @@ -74251,14 +77848,12 @@ "dependencies": { "mimic-fn": { "version": "3.1.0", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", "dev": true } } }, "mem-fs-editor": { "version": "9.3.0", - "integrity": "sha512-QKFbPwGCh1ypmc2H8BUYpbapwT/x2AOCYZQogzSui4rUNes7WVMagQXsirPIfp18EarX0SSY9Fpg426nSjew4Q==", "dev": true, "requires": { "binaryextensions": "^4.16.0", @@ -74275,32 +77870,27 @@ "dependencies": { "normalize-path": { "version": "3.0.0", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true } } }, "memfs": { - "version": "3.2.4", - "integrity": "sha512-2mDCPhuduRPOxlfgsXF9V+uqC6Jgz8zt/bNe4d4W7d5f6pCzHrWkxLNr17jKGXd4+j2kQNsAG2HARPnt74sqVQ==", + "version": "3.4.7", "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" } }, "memoize-one": { - "version": "5.1.1", - "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==" + "version": "5.1.1" }, "memoizerific": { "version": "1.11.3", - "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", "requires": { "map-or-similar": "^1.5.0" } }, "memory-fs": { "version": "0.4.1", - "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -74308,7 +77898,6 @@ }, "meow": { "version": "8.1.2", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, "requires": { "@types/minimist": "^1.2.0", @@ -74326,7 +77915,6 @@ "dependencies": { "hosted-git-info": { "version": "4.1.0", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -74334,7 +77922,6 @@ }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -74342,7 +77929,6 @@ }, "normalize-package-data": { "version": "3.0.3", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "requires": { "hosted-git-info": "^4.0.1", @@ -74353,7 +77939,6 @@ }, "semver": { "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -74361,51 +77946,41 @@ }, "type-fest": { "version": "0.18.1", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs-parser": { "version": "20.2.9", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true } } }, "merge-descriptors": { - "version": "1.0.1", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.1" }, "merge-source-map": { "version": "1.0.4", - "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", "requires": { "source-map": "^0.5.6" } }, "merge-stream": { - "version": "2.0.0", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "version": "2.0.0" }, "merge2": { - "version": "1.4.1", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "version": "1.4.1" }, "methods": { - "version": "1.1.2", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + "version": "1.1.2" }, "microevent.ts": { - "version": "0.1.1", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + "version": "0.1.1" }, "micromark": { "version": "3.1.0", - "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", "requires": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -74428,20 +78003,17 @@ "dependencies": { "debug": { "version": "4.3.4", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.2" } } }, "micromark-core-commonmark": { "version": "1.0.6", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", "requires": { "decode-named-character-reference": "^1.0.0", "micromark-factory-destination": "^1.0.0", @@ -74463,7 +78035,6 @@ }, "micromark-factory-destination": { "version": "1.0.0", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", "requires": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -74472,7 +78043,6 @@ }, "micromark-factory-label": { "version": "1.0.2", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", "requires": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -74482,7 +78052,6 @@ }, "micromark-factory-space": { "version": "1.0.0", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", "requires": { "micromark-util-character": "^1.0.0", "micromark-util-types": "^1.0.0" @@ -74490,7 +78059,6 @@ }, "micromark-factory-title": { "version": "1.0.2", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", "requires": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -74501,7 +78069,6 @@ }, "micromark-factory-whitespace": { "version": "1.0.0", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", "requires": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -74511,7 +78078,6 @@ }, "micromark-util-character": { "version": "1.1.0", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", "requires": { "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" @@ -74519,14 +78085,12 @@ }, "micromark-util-chunked": { "version": "1.0.0", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", "requires": { "micromark-util-symbol": "^1.0.0" } }, "micromark-util-classify-character": { "version": "1.0.0", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", "requires": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -74535,7 +78099,6 @@ }, "micromark-util-combine-extensions": { "version": "1.0.0", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", "requires": { "micromark-util-chunked": "^1.0.0", "micromark-util-types": "^1.0.0" @@ -74543,14 +78106,12 @@ }, "micromark-util-decode-numeric-character-reference": { "version": "1.0.0", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", "requires": { "micromark-util-symbol": "^1.0.0" } }, "micromark-util-decode-string": { "version": "1.0.2", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", "requires": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -74559,30 +78120,25 @@ } }, "micromark-util-encode": { - "version": "1.0.1", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==" + "version": "1.0.1" }, "micromark-util-html-tag-name": { - "version": "1.1.0", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==" + "version": "1.1.0" }, "micromark-util-normalize-identifier": { "version": "1.0.0", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", "requires": { "micromark-util-symbol": "^1.0.0" } }, "micromark-util-resolve-all": { "version": "1.0.0", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", "requires": { "micromark-util-types": "^1.0.0" } }, "micromark-util-sanitize-uri": { "version": "1.1.0", - "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", "requires": { "micromark-util-character": "^1.0.0", "micromark-util-encode": "^1.0.0", @@ -74591,7 +78147,6 @@ }, "micromark-util-subtokenize": { "version": "1.0.2", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", "requires": { "micromark-util-chunked": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -74600,16 +78155,13 @@ } }, "micromark-util-symbol": { - "version": "1.0.1", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==" + "version": "1.0.1" }, "micromark-util-types": { - "version": "1.0.2", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==" + "version": "1.0.2" }, "micromatch": { "version": "3.1.10", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -74628,7 +78180,6 @@ "dependencies": { "extend-shallow": { "version": "3.0.2", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -74636,78 +78187,56 @@ }, "is-extendable": { "version": "1.0.1", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } }, "kind-of": { - "version": "6.0.3", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "version": "6.0.3" } } }, "microseconds": { - "version": "0.2.0", - "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + "version": "0.2.0" }, "miller-rabin": { "version": "4.0.1", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" }, "dependencies": { "bn.js": { - "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.0" } } }, "mime": { - "version": "1.6.0", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "version": "1.6.0" }, "mime-db": { - "version": "1.49.0", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + "version": "1.52.0" }, "mime-types": { - "version": "2.1.32", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "version": "2.1.35", "requires": { - "mime-db": "1.49.0" + "mime-db": "1.52.0" } }, "mimic-fn": { - "version": "2.1.0", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "devOptional": true + "version": "2.1.0" }, "min-document": { "version": "2.19.0", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "requires": { "dom-walk": "^0.1.0" } }, "min-indent": { - "version": "1.0.1", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - }, - "mini-create-react-context": { - "version": "0.3.2", - "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", - "requires": { - "@babel/runtime": "^7.4.0", - "gud": "^1.0.0", - "tiny-warning": "^1.0.2" - } + "version": "1.0.1" }, "mini-css-extract-plugin": { "version": "2.4.5", - "integrity": "sha512-oEIhRucyn1JbT/1tU2BhnwO6ft1jjH1iCX9Gc59WFMg0n5773rQU0oyQ0zzeYFFuBfONaRbQJyGoPtuNseMxjA==", "dev": true, "requires": { "schema-utils": "^4.0.0" @@ -74715,7 +78244,6 @@ "dependencies": { "ajv": { "version": "8.8.2", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -74726,7 +78254,6 @@ }, "ajv-keywords": { "version": "5.1.0", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.3" @@ -74734,12 +78261,10 @@ }, "json-schema-traverse": { "version": "1.0.0", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "schema-utils": { "version": "4.0.0", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", @@ -74752,35 +78277,28 @@ }, "mini-store": { "version": "3.0.6", - "integrity": "sha512-YzffKHbYsMQGUWQRKdsearR79QsMzzJcDDmZKlJBqt5JNkqpyJHYlK6gP61O36X+sLf76sO9G6mhKBe83gIZIQ==", "requires": { "hoist-non-react-statics": "^3.3.2", "shallowequal": "^1.0.2" } }, "minimalistic-assert": { - "version": "1.0.1", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "version": "1.0.1" }, "minimalistic-crypto-utils": { - "version": "1.0.1", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "version": "1.0.1" }, "minimatch": { - "version": "3.0.4", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + "version": "1.2.6" }, "minimist-options": { "version": "4.1.0", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, "requires": { "arrify": "^1.0.1", @@ -74790,52 +78308,35 @@ "dependencies": { "kind-of": { "version": "6.0.3", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true } } }, "minipass": { "version": "3.1.6", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "requires": { "yallist": "^4.0.0" }, "dependencies": { "yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "4.0.0" } } }, "minipass-collect": { "version": "1.0.2", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "requires": { "minipass": "^3.0.0" } }, - "minipass-fetch": { - "version": "1.4.1", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, "minipass-flush": { "version": "1.0.5", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "requires": { "minipass": "^3.0.0" } }, "minipass-json-stream": { "version": "1.0.1", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", "dev": true, "requires": { "jsonparse": "^1.3.1", @@ -74844,14 +78345,12 @@ }, "minipass-pipeline": { "version": "1.2.4", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "requires": { "minipass": "^3.0.0" } }, "minipass-sized": { "version": "1.0.3", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -74859,21 +78358,18 @@ }, "minizlib": { "version": "2.1.2", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" }, "dependencies": { "yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "4.0.0" } } }, "mississippi": { "version": "3.0.0", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -74889,7 +78385,6 @@ }, "mixin-deep": { "version": "1.3.2", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -74897,7 +78392,6 @@ "dependencies": { "is-extendable": { "version": "1.0.1", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } @@ -74906,7 +78400,6 @@ }, "mjolnir.js": { "version": "2.5.0", - "integrity": "sha512-YkVoyKs7qm9xvAgRgjx3Md/7eYqmq7VXOgTKQNnmuzcBJzMebjdIWa7FdTd0RZBrw3UL6V6TTktsxJwBMLXUNA==", "requires": { "@babel/runtime": "^7.0.0", "hammerjs": "^2.0.8" @@ -74914,14 +78407,12 @@ }, "mkdirp": { "version": "0.5.5", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { "minimist": "^1.2.5" } }, "mkdirp-infer-owner": { "version": "2.0.0", - "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -74931,19 +78422,16 @@ "dependencies": { "chownr": { "version": "2.0.0", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, "mkdirp": { "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true } } }, "mock-socket": { "version": "9.0.3", - "integrity": "sha512-SxIiD2yE/By79p3cNAAXyLQWTvEFNEzcAO7PH+DzRqKSFaplAPFjiQLmw8ofmpCsZf+Rhfn2/xCJagpdGmYdTw==", "dev": true, "requires": { "url-parse": "^1.4.4" @@ -74951,28 +78439,23 @@ }, "modify-values": { "version": "1.0.1", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true }, "moment": { - "version": "2.29.2", - "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==" + "version": "2.29.4" }, "moment-timezone": { - "version": "0.5.33", - "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", + "version": "0.5.37", "requires": { "moment": ">= 2.9.0" } }, "moo": { "version": "0.4.3", - "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", "dev": true }, "morgan": { "version": "1.10.0", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", "dev": true, "requires": { "basic-auth": "~2.0.1", @@ -74984,18 +78467,15 @@ "dependencies": { "depd": { "version": "2.0.0", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true } } }, "mousetrap": { - "version": "1.6.2", - "integrity": "sha512-jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA==" + "version": "1.6.2" }, "move-concurrently": { "version": "1.0.1", - "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", "requires": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -75007,7 +78487,6 @@ "dependencies": { "rimraf": { "version": "2.7.1", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } @@ -75015,30 +78494,21 @@ } }, "mri": { - "version": "1.2.0", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" + "version": "1.2.0" }, "ms": { - "version": "2.0.0", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "version": "2.0.0" }, "multicast-dns": { - "version": "6.2.3", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.5", "dev": true, "requires": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", - "dev": true - }, "multimatch": { "version": "5.0.0", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", "dev": true, "requires": { "@types/minimatch": "^3.0.3", @@ -75050,42 +78520,31 @@ "dependencies": { "arrify": { "version": "2.0.1", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true } } }, "murmurhash-js": { - "version": "1.0.0", - "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" + "version": "1.0.0" }, "mustache": { - "version": "2.3.2", - "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==" + "version": "2.3.2" }, "mute-stream": { "version": "0.0.8", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "devOptional": true + "dev": true }, "nano-time": { "version": "1.0.0", - "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", "requires": { "big-integer": "^1.6.16" } }, - "nanocolors": { - "version": "0.1.12", - "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==" - }, "nanoid": { - "version": "2.0.0", - "integrity": "sha512-SG2qscLE3iM4C0CNzGrsAojJHSVHMS1J8NnvJ31P1lH8P0hGHOiafmniNJz6w6q7vuoDlV7RdySlJgtqkFEVtQ==" + "version": "2.0.0" }, "nanomatch": { "version": "1.2.13", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -75102,7 +78561,6 @@ "dependencies": { "extend-shallow": { "version": "3.0.2", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -75110,31 +78568,26 @@ }, "is-extendable": { "version": "1.0.1", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } }, "kind-of": { - "version": "6.0.3", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "version": "6.0.3" } } }, "native-request": { "version": "1.0.8", - "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==", "dev": true, "optional": true }, "natural-compare": { "version": "1.4.0", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "nearley": { "version": "2.18.0", - "integrity": "sha512-/zQOMCeJcioI0xJtd5RpBiWw2WP7wLe6vq8/3Yu0rEwgus/G/+pViX80oA87JdVgjRt2895mZSv2VfZmy4W1uw==", "dev": true, "requires": { "commander": "^2.19.0", @@ -75145,24 +78598,24 @@ } }, "negotiator": { - "version": "0.6.1", - "integrity": "sha512-qTxkr1RoLw5Pz+1+PTJ/66hWuyi2LEOeOuIDJDlx6JF8x75bmD5C7qXTg2UlX5W9rLfkqKP+r8q6Vy6NWdWrbw==" + "version": "0.6.3" }, "neo-async": { - "version": "2.6.2", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "version": "2.6.2" }, "nested-error-stacks": { - "version": "2.1.1", - "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==" + "version": "2.1.1" + }, + "netmask": { + "version": "2.0.2", + "dev": true }, "nice-try": { "version": "1.0.5", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "dev": true }, "nise": { "version": "4.1.0", - "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0", @@ -75174,12 +78627,10 @@ "dependencies": { "isarray": { "version": "0.0.1", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, "path-to-regexp": { "version": "1.8.0", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, "requires": { "isarray": "0.0.1" @@ -75189,21 +78640,18 @@ }, "no-case": { "version": "3.0.4", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "requires": { "lower-case": "^2.0.2", "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "2.1.0", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + "version": "2.1.0" } } }, "no-proxy": { "version": "1.0.3", - "integrity": "sha512-JPr13PIb/cENY5+WjuxzhQH74guHYPpyfk+7f7lR7SIpDE1kH0BL9jO7yztANg3jFT8jf58UEimbCBflW5UiTw==", "dev": true, "requires": { "url-parse": "^1.2.0", @@ -75212,57 +78660,46 @@ "dependencies": { "wildcard": { "version": "1.1.2", - "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==", "dev": true } } }, + "node-addon-api": { + "version": "3.2.1", + "dev": true + }, "node-ask": { "version": "1.0.1", - "integrity": "sha512-+0eqgEdgPiixrNysGDTPo3T2qyEHGVgs4ONlc5tTfcluvC/Rgq1x2ELdANUMwhR2CYLwaQnMS32O/h7adasnFQ==", "dev": true }, "node-dir": { "version": "0.1.17", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", "requires": { "minimatch": "^3.0.2" } }, "node-environment-flags": { "version": "1.0.6", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } } }, "node-fetch": { "version": "2.6.7", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { "whatwg-url": "^5.0.0" }, "dependencies": { "tr46": { - "version": "0.0.3", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "version": "0.0.3" }, "webidl-conversions": { - "version": "3.0.1", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "version": "3.0.1" }, "whatwg-url": { "version": "5.0.0", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -75271,104 +78708,69 @@ } }, "node-forge": { - "version": "0.10.0", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "version": "1.3.1", "dev": true }, "node-gyp": { - "version": "5.1.1", - "integrity": "sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw==", + "version": "9.3.1", "dev": true, "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.1.2", - "request": "^2.88.0", - "rimraf": "^2.6.3", - "semver": "^5.7.1", - "tar": "^4.4.12", - "which": "^1.3.1" + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" }, "dependencies": { - "fs-minipass": { - "version": "1.2.7", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "minipass": { - "version": "2.9.0", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "lru-cache": { + "version": "6.0.0", "dev": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" } }, - "minizlib": { - "version": "1.3.3", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "nopt": { + "version": "6.0.0", "dev": true, "requires": { - "minipass": "^2.9.0" + "abbrev": "^1.0.0" } }, - "nopt": { - "version": "4.0.3", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "semver": { + "version": "7.3.8", "dev": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "lru-cache": "^6.0.0" } }, - "rimraf": { - "version": "2.7.1", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "which": { + "version": "2.0.2", "dev": true, "requires": { - "glob": "^7.1.3" + "isexe": "^2.0.0" } }, - "safe-buffer": { - "version": "5.2.1", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "yallist": { + "version": "4.0.0", "dev": true - }, - "tar": { - "version": "4.4.19", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "dev": true, - "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - } } } }, + "node-gyp-build": { + "version": "4.5.0", + "dev": true + }, "node-int64": { "version": "0.4.0", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node-libs-browser": { "version": "2.2.1", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "requires": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -75396,18 +78798,15 @@ }, "dependencies": { "path-browserify": { - "version": "0.0.1", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + "version": "0.0.1" }, "punycode": { - "version": "1.4.1", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "version": "1.4.1" } } }, "node-loggly-bulk": { "version": "2.2.5", - "integrity": "sha512-N6RjZfjqwhAYwT9nM8PFKXpWfaGFaDHnzwj2JBgsNq04xsEZNGMlI+rds90p5/TTkYAS8Ya6tbJChXFRqTSmiA==", "dev": true, "requires": { "json-stringify-safe": "5.0.x", @@ -75415,13 +78814,8 @@ "request": ">=2.76.0 <3.0.0" } }, - "node-modules-regexp": { - "version": "1.0.0", - "integrity": "sha512-JMaRS9L4wSRIR+6PTVEikTrq/lMGEZR43a48ETeilY0Q0iMwVnccMFrUM1k+tNzmYuIU0Vh710bCUqHX+/+ctQ==" - }, "node-notifier": { "version": "8.0.0", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", "dev": true, "optional": true, "requires": { @@ -75435,7 +78829,6 @@ "dependencies": { "is-wsl": { "version": "2.2.0", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "optional": true, "requires": { @@ -75444,19 +78837,16 @@ }, "semver": { "version": "7.3.2", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true, "optional": true }, "uuid": { "version": "8.3.1", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", "dev": true, "optional": true }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "optional": true, "requires": { @@ -75466,19 +78856,16 @@ } }, "node-releases": { - "version": "1.1.75", - "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==" + "version": "2.0.6" }, "nopt": { "version": "5.0.0", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "requires": { "abbrev": "1" } }, "normalize-package-data": { "version": "2.5.0", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -75488,357 +78875,401 @@ }, "normalize-path": { "version": "2.1.1", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "devOptional": true, "requires": { "remove-trailing-separator": "^1.0.1" } }, "normalize-range": { - "version": "0.1.2", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + "version": "0.1.2" }, "normalize-url": { "version": "6.1.0", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true }, - "npm-api": { - "version": "1.0.1", - "integrity": "sha512-4sITrrzEbPcr0aNV28QyOmgn6C9yKiF8k92jn4buYAK8wmA5xo1qL3II5/gT1r7wxbXBflSduZ2K3FbtOrtGkA==", - "optional": true, - "requires": { - "clone-deep": "^4.0.1", - "download-stats": "^0.3.4", - "JSONStream": "^1.3.5", - "moment": "^2.24.0", - "node-fetch": "^2.6.0", - "paged-request": "^2.0.1" - } - }, "npm-bundled": { "version": "1.1.2", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "dev": true, "requires": { "npm-normalize-package-bin": "^1.0.1" } }, - "npm-install-checks": { - "version": "4.0.0", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "npm-normalize-package-bin": { + "version": "1.0.1", + "dev": true + }, + "npm-packlist": { + "version": "5.1.3", "dev": true, "requires": { - "semver": "^7.1.1" + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "brace-expansion": { + "version": "2.0.1", "dev": true, "requires": { - "yallist": "^4.0.0" + "balanced-match": "^1.0.0" } }, - "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "glob": { + "version": "8.0.3", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" } }, - "yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "minimatch": { + "version": "5.1.2", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "npm-bundled": { + "version": "2.0.1", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^2.0.0" + } + }, + "npm-normalize-package-bin": { + "version": "2.0.0", "dev": true } } }, - "npm-lifecycle": { - "version": "3.1.5", - "integrity": "sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==", + "npm-run-path": { + "version": "2.0.2", "dev": true, "requires": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.15", - "node-gyp": "^5.0.2", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", - "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" + "path-key": "^2.0.0" } }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "npmlog": { + "version": "6.0.2", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2" + }, + "number-is-nan": { + "version": "1.0.1" + }, + "nvd3-fork": { + "version": "2.0.5" + }, + "nwsapi": { + "version": "2.2.0", "dev": true }, - "npm-package-arg": { - "version": "8.1.5", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "nx": { + "version": "15.3.3", "dev": true, "requires": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" + "@nrwl/cli": "15.3.3", + "@nrwl/tao": "15.3.3", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" }, "dependencies": { - "hosted-git-info": { - "version": "4.1.0", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "ansi-regex": { + "version": "5.0.1", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "dev": true + }, + "axios": { + "version": "1.2.1", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "braces": { + "version": "3.0.2", "dev": true, "requires": { - "yallist": "^4.0.0" + "fill-range": "^7.0.1" } }, - "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "chalk": { + "version": "4.1.0", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "cliui": { + "version": "7.0.4", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "dotenv": { + "version": "10.0.0", "dev": true - } - } - }, - "npm-packlist": { - "version": "2.2.2", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", - "dev": true, - "requires": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "6.1.1", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", - "dev": true, - "requires": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + }, + "fast-glob": { + "version": "3.2.7", "dev": true, "requires": { - "yallist": "^4.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" } }, - "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "fill-range": { + "version": "7.0.1", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "to-regex-range": "^5.0.1" } }, - "yallist": { + "form-data": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "npm-registry-fetch": { - "version": "11.0.0", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", - "dev": true, - "requires": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - }, - "dependencies": { - "cacache": { - "version": "15.3.0", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "dev": true, "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" } }, - "chownr": { - "version": "2.0.0", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "glob": { + "version": "7.1.4", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "ignore": { + "version": "5.2.4", "dev": true }, - "debug": { - "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", "dev": true, "requires": { - "ms": "2.1.2" + "is-docker": "^2.0.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "dev": true, + "requires": { + "argparse": "^2.0.1" } }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, - "make-fetch-happen": { - "version": "9.1.0", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "micromatch": { + "version": "4.0.5", "dev": true, "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, - "mkdirp": { - "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true + "minimatch": { + "version": "3.0.5", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } }, - "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "npm-run-path": { + "version": "4.0.1", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "open": { + "version": "8.4.0", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "path-key": { + "version": "3.1.1", "dev": true }, - "negotiator": { - "version": "0.6.2", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "proxy-from-env": { + "version": "1.1.0", "dev": true }, - "socks-proxy-agent": { - "version": "6.1.1", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "semver": { + "version": "7.3.4", "dev": true, "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "lru-cache": "^6.0.0" } }, - "ssri": { - "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "string-width": { + "version": "4.2.3", "dev": true, "requires": { - "minipass": "^3.1.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "2.4.1", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, + "y18n": { + "version": "5.0.8", + "dev": true + }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "17.6.2", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + } + } + }, + "yargs-parser": { + "version": "21.1.1", "dev": true } } }, - "npm-run-path": { - "version": "2.0.2", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==" - }, - "number-is-nan": { - "version": "1.0.1", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" - }, - "nvd3-fork": { - "version": "2.0.5", - "integrity": "sha512-Sq3q2rvR/9FJ35LVmqdQJAnfmD15BaIHSBg5wZZL/WLcq/nthff8ukabwFdbW0zeE1c/yPq+DKl6MxnUTR45DA==" - }, - "nwsapi": { - "version": "2.2.0", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, "oauth-sign": { "version": "0.9.0", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-assign": { - "version": "4.1.1", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "version": "4.1.1" }, "object-copy": { "version": "0.1.0", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -75847,14 +79278,12 @@ "dependencies": { "define-property": { "version": "0.2.5", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "requires": { "is-descriptor": "^0.1.0" } }, "kind-of": { "version": "3.2.2", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "requires": { "is-buffer": "^1.1.5" } @@ -75862,58 +79291,52 @@ } }, "object-inspect": { - "version": "1.4.1", - "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==" + "version": "1.4.1" }, "object-is": { - "version": "1.0.1", - "integrity": "sha512-WY2d4Y9s39AGFRtDlJDyNHFHOTQ5MbFzYWt9dHNYn4P9zCR+wpCo1IqWd+xJVEX5aNhCFXzTptJ8H2kRIHWF3Q==", - "dev": true + "version": "1.1.5", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } }, "object-keys": { - "version": "1.1.1", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "version": "1.1.1" }, "object-visit": { "version": "1.0.1", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "requires": { "isobject": "^3.0.0" } }, "object.assign": { - "version": "4.1.2", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.entries": { - "version": "1.1.0", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "version": "1.1.6", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.fromentries": { - "version": "2.0.0", - "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", + "version": "2.0.6", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.11.0", - "function-bind": "^1.1.1", - "has": "^1.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.getownpropertydescriptors": { "version": "2.1.3", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -75922,66 +79345,54 @@ }, "object.pick": { "version": "1.3.0", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "requires": { "isobject": "^3.0.1" } }, "object.values": { - "version": "1.1.4", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "version": "1.1.6", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "objectorarray": { - "version": "1.0.5", - "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==" + "version": "1.0.5" }, "oblivious-set": { - "version": "1.0.0", - "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + "version": "1.0.0" }, "obuf": { "version": "1.1.2", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, "omit.js": { - "version": "2.0.2", - "integrity": "sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==" + "version": "2.0.2" }, "on-finished": { "version": "2.3.0", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "requires": { "ee-first": "1.1.1" } }, "on-headers": { - "version": "1.0.2", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + "version": "1.0.2" }, "once": { "version": "1.4.0", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } }, "onetime": { "version": "5.1.2", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "devOptional": true, "requires": { "mimic-fn": "^2.1.0" } }, "open": { "version": "7.4.2", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -75989,7 +79400,6 @@ "dependencies": { "is-wsl": { "version": "2.2.0", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "requires": { "is-docker": "^2.0.0" } @@ -75998,30 +79408,25 @@ }, "opener": { "version": "1.5.2", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, "openurl": { "version": "1.1.1", - "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", "dev": true }, "optimist": { "version": "0.3.7", - "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", "requires": { "wordwrap": "~0.0.2" }, "dependencies": { "wordwrap": { - "version": "0.0.3", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==" + "version": "0.0.3" } } }, "optionator": { "version": "0.8.2", - "integrity": "sha512-oCOQ8AIC2ciLy/sE2ehafRBleBgDLvzGhBRRev87sP7ovnbvQfqpc3XFI0DhHey2OfVoNV91W+GPC6B3540/5Q==", "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", @@ -76033,7 +79438,6 @@ }, "ora": { "version": "5.4.1", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "requires": { "bl": "^4.1.0", @@ -76049,12 +79453,10 @@ "dependencies": { "ansi-regex": { "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -76063,82 +79465,56 @@ } }, "os-browserify": { - "version": "0.3.0", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" - }, - "os-homedir": { - "version": "1.0.2", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true + "version": "0.3.0" }, "os-tmpdir": { "version": "1.0.2", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "devOptional": true - }, - "osenv": { - "version": "0.1.5", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } + "dev": true }, "overlayscrollbars": { - "version": "1.13.1", - "integrity": "sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==" + "version": "1.13.1" }, "p-all": { "version": "2.1.0", - "integrity": "sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==", "requires": { "p-map": "^2.0.0" }, "dependencies": { "p-map": { - "version": "2.1.0", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + "version": "2.1.0" } } }, "p-defer": { "version": "1.0.0", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", "dev": true }, "p-each-series": { "version": "2.2.0", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true }, "p-event": { "version": "4.2.0", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", "requires": { "p-timeout": "^3.1.0" } }, "p-filter": { "version": "2.1.0", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", "requires": { "p-map": "^2.0.0" }, "dependencies": { "p-map": { - "version": "2.1.0", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + "version": "2.1.0" } } }, "p-finally": { - "version": "1.0.0", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" + "version": "1.0.0" }, "p-limit": { "version": "1.3.0", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" @@ -76146,7 +79522,6 @@ }, "p-locate": { "version": "2.0.0", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "requires": { "p-limit": "^1.1.0" @@ -76154,24 +79529,20 @@ }, "p-map": { "version": "4.0.0", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "requires": { "aggregate-error": "^3.0.0" } }, "p-map-series": { "version": "2.1.0", - "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==", "dev": true }, "p-pipe": { "version": "3.1.0", - "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", "dev": true }, "p-queue": { "version": "6.6.2", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", "requires": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" @@ -76179,12 +79550,10 @@ }, "p-reduce": { "version": "2.1.0", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", "dev": true }, "p-retry": { "version": "4.6.1", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "dev": true, "requires": { "@types/retry": "^0.12.0", @@ -76193,50 +79562,81 @@ }, "p-timeout": { "version": "3.2.0", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "requires": { "p-finally": "^1.0.0" } }, "p-try": { "version": "1.0.0", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true }, "p-waterfall": { "version": "2.1.1", - "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==", "dev": true, "requires": { "p-reduce": "^2.0.0" } }, + "pac-proxy-agent": { + "version": "5.0.0", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "dev": true + }, + "socks-proxy-agent": { + "version": "5.0.1", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + } + } + } + }, + "pac-resolver": { + "version": "5.0.1", + "dev": true, + "requires": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + } + }, "pad-component": { - "version": "0.0.1", - "integrity": "sha512-8EKVBxCRSvLnsX1p2LlSFSH3c2/wuhY9/BXXWu8boL78FbVKqn2L5SpURt1x5iw6Gq8PTqJ7MdPoe5nCtX3I+g==" + "version": "0.0.1" }, "pad-left": { "version": "2.1.0", - "integrity": "sha512-HJxs9K9AztdIQIAIa/OIazRAUW/L6B9hbQDxO4X07roW3eo9XqZc2ur9bn1StH9CnbbI9EgvejHQX7CBpCF1QA==", "requires": { "repeat-string": "^1.5.4" } }, - "paged-request": { - "version": "2.0.2", - "integrity": "sha512-NWrGqneZImDdcMU/7vMcAOo1bIi5h/pmpJqe7/jdsy85BA/s5MSaU/KlpxwW/IVPmIwBcq2uKPrBWWhEWhtxag==", - "optional": true, - "requires": { - "axios": "^0.21.1" - } - }, "pako": { - "version": "1.0.11", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "version": "1.0.11" }, "parallel-transform": { "version": "1.2.0", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "requires": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -76245,28 +79645,24 @@ }, "param-case": { "version": "3.0.4", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "2.1.0", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + "version": "2.1.0" } } }, "parent-module": { "version": "1.0.1", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "requires": { "callsites": "^3.0.0" } }, "parse-asn1": { "version": "5.1.6", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "requires": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -76277,7 +79673,6 @@ }, "parse-json": { "version": "4.0.0", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "requires": { "error-ex": "^1.3.1", @@ -76285,116 +79680,83 @@ } }, "parse-ms": { - "version": "2.1.0", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==" + "version": "2.1.0" }, "parse-passwd": { "version": "1.0.0", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true }, "parse-path": { - "version": "4.0.3", - "integrity": "sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==", + "version": "7.0.0", "dev": true, "requires": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0", - "qs": "^6.9.4", - "query-string": "^6.13.8" - }, - "dependencies": { - "qs": { - "version": "6.10.2", - "integrity": "sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } + "protocols": "^2.0.0" } }, "parse-url": { - "version": "6.0.0", - "integrity": "sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw==", + "version": "8.1.0", "dev": true, "requires": { - "is-ssh": "^1.3.0", - "normalize-url": "^6.1.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" + "parse-path": "^7.0.0" } }, "parse5": { "version": "3.0.3", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", "dev": true, "requires": { "@types/node": "*" } }, "parseurl": { - "version": "1.3.2", - "integrity": "sha512-DjIMrEiCuzD/Xsr69WhcPCTeb6iZP5JgL/DZ3cYz0zMnyiXiscoqC6LLV2dYwQHfy9O+twCDVVPiFWb7xZhaOw==" + "version": "1.3.3" }, "pascal-case": { "version": "3.1.2", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "2.1.0", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + "version": "2.1.0" } } }, "pascalcase": { - "version": "0.1.1", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==" + "version": "0.1.1" }, "path-browserify": { "version": "1.0.1", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true }, "path-dirname": { - "version": "1.0.2", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" + "version": "1.0.2" }, "path-exists": { - "version": "3.0.0", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + "version": "3.0.0" }, "path-is-absolute": { - "version": "1.0.1", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + "version": "1.0.1" }, "path-key": { "version": "2.0.1", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + "dev": true }, "path-parse": { - "version": "1.0.7", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "version": "1.0.7" }, "path-to-regexp": { "version": "2.4.0", - "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==", "dev": true }, "path-type": { "version": "3.0.0", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { "pify": "^3.0.0" } }, "pbf": { "version": "3.2.1", - "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", "requires": { "ieee754": "^1.1.12", "resolve-protobuf-schema": "^2.1.0" @@ -76402,7 +79764,6 @@ }, "pbkdf2": { "version": "3.1.2", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -76413,60 +79774,47 @@ }, "pend": { "version": "1.2.0", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, "performance-now": { "version": "2.1.0", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "dev": true }, "picocolors": { - "version": "0.2.1", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + "version": "0.2.1" }, "picomatch": { - "version": "2.3.0", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + "version": "2.3.1" }, "pify": { - "version": "3.0.0", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + "version": "3.0.0" }, "pinkie": { - "version": "2.0.4", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" + "version": "2.0.4" }, "pinkie-promise": { "version": "2.0.1", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "requires": { "pinkie": "^2.0.0" } }, "pirates": { - "version": "4.0.1", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } + "version": "4.0.5" }, "pkg-dir": { "version": "3.0.0", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "requires": { "find-up": "^3.0.0" }, "dependencies": { "find-up": { "version": "3.0.0", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { "locate-path": "^3.0.0" } }, "locate-path": { "version": "3.0.0", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -76474,27 +79822,23 @@ }, "p-limit": { "version": "2.2.2", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { "p-limit": "^2.0.0" } }, "p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "2.2.0" } } }, "pkg-up": { "version": "2.0.0", - "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", "dev": true, "requires": { "find-up": "^2.1.0" @@ -76502,73 +79846,33 @@ }, "pluralize": { "version": "8.0.0", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true }, "pn": { "version": "1.1.0", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, "png-async": { "version": "0.9.4", - "integrity": "sha512-B//AXX9TkneKfgtOpT1mdUnnhk2BImGD+a98vImsMU8uo1dBeHyW/kM2erWZ/CsYteTPU/xKG+t6T62heHkC3A==", "dev": true }, "pnp-webpack-plugin": { "version": "1.6.4", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", "requires": { "ts-pnp": "^1.1.6" } }, "polished": { "version": "3.7.2", - "integrity": "sha512-pQKtpZGmsZrW8UUpQMAnR7s3ppHeMQVNyMDKtUyKwuvDmklzcEyM5Kllb3JyE/sE/x7arDmyd35i+4vp99H6sQ==", "requires": { "@babel/runtime": "^7.12.5" } }, - "portfinder": { - "version": "1.0.28", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "debug": { - "version": "3.2.6", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "posix-character-classes": { - "version": "0.1.1", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==" + "version": "0.1.1" }, "postcss": { "version": "8.3.6", - "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", "dev": true, "requires": { "colorette": "^1.2.2", @@ -76578,35 +79882,30 @@ "dependencies": { "nanoid": { "version": "3.1.25", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", "dev": true } } }, "postcss-flexbugs-fixes": { "version": "4.2.1", - "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", "requires": { "postcss": "^7.0.26" }, "dependencies": { "postcss": { "version": "7.0.39", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "requires": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "postcss-loader": { "version": "4.3.0", - "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", "requires": { "cosmiconfig": "^7.0.0", "klona": "^2.0.4", @@ -76616,12 +79915,10 @@ }, "dependencies": { "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3" }, "loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -76630,32 +79927,27 @@ }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.3.7", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "4.0.0" } } }, "postcss-modules-extract-imports": { "version": "3.0.0", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true }, "postcss-modules-local-by-default": { "version": "4.0.0", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, "requires": { "icss-utils": "^5.0.0", @@ -76665,7 +79957,6 @@ }, "postcss-modules-scope": { "version": "3.0.0", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.4" @@ -76673,7 +79964,6 @@ }, "postcss-modules-values": { "version": "4.0.0", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "requires": { "icss-utils": "^5.0.0" @@ -76681,36 +79971,26 @@ }, "postcss-selector-parser": { "version": "6.0.6", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "postcss-value-parser": { - "version": "4.1.0", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + "version": "4.2.0" }, "potpack": { - "version": "1.0.1", - "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" + "version": "1.0.2" }, "prelude-ls": { - "version": "1.1.2", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" - }, - "prepend-http": { - "version": "1.0.4", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==" + "version": "1.1.2" }, "prettier": { "version": "2.4.1", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", "dev": true }, "prettier-linter-helpers": { "version": "1.0.0", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "requires": { "fast-diff": "^1.1.2" @@ -76718,19 +79998,13 @@ }, "prettier-plugin-packagejson": { "version": "2.2.15", - "integrity": "sha512-r3WKxw0ALyD3gr3RlIFK3o7mUejCVkqwVKtUuPQaB3+aNiZYKxmad+GpZ6WFWTm6Zq2jX0wvSdlkGccQ2pEnCg==", "dev": true, "requires": { "sort-package-json": "1.53.1" } }, - "pretty-bytes": { - "version": "5.6.0", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" - }, "pretty-error": { "version": "3.0.4", - "integrity": "sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ==", "requires": { "lodash": "^4.17.20", "renderkid": "^2.0.6" @@ -76738,7 +80012,6 @@ }, "pretty-format": { "version": "26.6.2", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { "@jest/types": "^26.6.2", @@ -76749,55 +80022,45 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "react-is": { "version": "17.0.2", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true } } }, "pretty-hrtime": { - "version": "1.0.3", - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==" + "version": "1.0.3" }, "pretty-ms": { "version": "7.0.1", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", "requires": { "parse-ms": "^2.1.0" } }, "prismjs": { - "version": "1.27.0", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" + "version": "1.27.0" }, "probe.gl": { "version": "3.4.0", - "integrity": "sha512-9CLByZATuhuG/Viq3ckfWU+dAhb7dMmjzsyCy4s7ds9ueTejcVRENxL197/XacOK/AN61YrEERB0QnouB0Qc0Q==", "requires": { "@babel/runtime": "^7.0.0", "@probe.gl/stats": "3.4.0" } }, "process": { - "version": "0.11.10", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + "version": "0.11.10" }, "process-nextick-args": { - "version": "2.0.0", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "version": "2.0.0" }, "progress": { "version": "2.0.3", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "progress-stream": { "version": "2.0.0", - "integrity": "sha512-xJwOWR46jcXUq6EH9yYyqp+I52skPySOeHfkxOZ2IY1AiBi/sFJhbhAKHoV3OTw/omQ45KTio9215dRJ2Yxd3Q==", "dev": true, "requires": { "speedometer": "~1.0.0", @@ -76806,18 +80069,23 @@ }, "promise": { "version": "7.3.1", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "~2.0.3" } }, - "promise-inflight": { + "promise-all-reject-late": { "version": "1.0.1", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + "dev": true + }, + "promise-call-limit": { + "version": "1.0.1", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1" }, "promise-retry": { "version": "2.0.1", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "requires": { "err-code": "^2.0.2", @@ -76826,14 +80094,12 @@ "dependencies": { "retry": { "version": "0.12.0", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true } } }, "promise.allsettled": { "version": "1.0.5", - "integrity": "sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==", "requires": { "array.prototype.map": "^1.0.4", "call-bind": "^1.0.2", @@ -76845,7 +80111,6 @@ }, "promise.prototype.finally": { "version": "3.1.3", - "integrity": "sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -76854,7 +80119,6 @@ }, "prompts": { "version": "2.4.0", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -76862,30 +80126,21 @@ }, "promzard": { "version": "0.3.0", - "integrity": "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==", "dev": true, "requires": { "read": "1" } }, "prop-types": { - "version": "15.7.2", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } + "react-is": "^16.13.1" } }, "prop-types-exact": { "version": "1.2.0", - "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", "dev": true, "requires": { "has": "^1.0.3", @@ -76895,58 +80150,87 @@ }, "property-information": { "version": "5.6.0", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", "requires": { "xtend": "^4.0.0" } }, "proto-list": { - "version": "1.2.4", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + "version": "1.2.4" }, "protocol-buffers-schema": { - "version": "3.4.0", - "integrity": "sha512-G/2kcamPF2S49W5yaMGdIpkG6+5wZF0fzBteLKgEHjbNzqjZQ85aAs1iJGto31EJaSTkNvHs5IXuHSaTLWBAiA==" + "version": "3.4.0" }, "protocols": { - "version": "1.4.8", - "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", + "version": "2.0.1", "dev": true }, "proxy-addr": { "version": "2.0.7", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, "dependencies": { "forwarded": { - "version": "0.2.0", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + "version": "0.2.0" }, "ipaddr.js": { - "version": "1.9.1", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + "version": "1.9.1" + } + } + }, + "proxy-agent": { + "version": "5.0.0", + "dev": true, + "requires": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "dev": true + }, + "socks-proxy-agent": { + "version": "5.0.1", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + } } } }, + "proxy-from-env": { + "version": "1.0.0", + "dev": true + }, "prr": { - "version": "1.0.1", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + "version": "1.0.1" }, "pseudomap": { - "version": "1.0.2", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + "version": "1.0.2" }, "psl": { "version": "1.8.0", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "public-encrypt": { "version": "4.0.3", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -76957,14 +80241,12 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.0" } } }, "pump": { "version": "3.0.0", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -76972,7 +80254,6 @@ }, "pumpify": { "version": "1.5.1", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -76981,7 +80262,6 @@ "dependencies": { "pump": { "version": "2.0.1", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -76990,12 +80270,10 @@ } }, "punycode": { - "version": "2.1.1", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "version": "2.1.1" }, "puppeteer": { "version": "10.2.0", - "integrity": "sha512-OR2CCHRashF+f30+LBOtAjK6sNtz2HEyTr5FqAvhf8lR/qB3uBRoIZOwQKgwoyZnMBsxX7ZdazlyBgGjpnkiMw==", "dev": true, "requires": { "debug": "4.3.1", @@ -77014,7 +80292,6 @@ "dependencies": { "debug": { "version": "4.3.1", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -77022,7 +80299,6 @@ }, "find-up": { "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -77031,7 +80307,6 @@ }, "locate-path": { "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -77039,17 +80314,14 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "node-fetch": { "version": "2.6.1", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", "dev": true }, "p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -77057,7 +80329,6 @@ }, "p-locate": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -77065,17 +80336,14 @@ }, "p-try": { "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "path-exists": { "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "pkg-dir": { "version": "4.2.0", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { "find-up": "^4.0.0" @@ -77083,38 +80351,28 @@ }, "progress": { "version": "2.0.1", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", "dev": true }, "proxy-from-env": { "version": "1.1.0", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, "ws": { "version": "7.4.6", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true } } }, - "pure-color": { - "version": "1.3.0", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" - }, "q": { "version": "1.5.1", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", "dev": true }, "qs": { - "version": "6.5.2", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", "dev": true }, "query-string": { "version": "6.14.1", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", "requires": { "decode-uri-component": "^0.2.0", "filter-obj": "^1.1.0", @@ -77123,30 +80381,24 @@ } }, "querystring": { - "version": "0.2.0", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" + "version": "0.2.0" }, "querystring-es3": { - "version": "0.2.1", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==" + "version": "0.2.1" }, "querystringify": { "version": "2.2.0", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, "quick-lru": { "version": "4.0.1", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, "quickselect": { - "version": "2.0.0", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + "version": "2.0.0" }, "quote-stream": { "version": "1.0.2", - "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", "requires": { "buffer-equal": "0.0.1", "minimist": "^1.1.3", @@ -77155,19 +80407,17 @@ }, "raf": { "version": "3.4.1", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, "requires": { "performance-now": "^2.1.0" } }, "railroad-diagrams": { "version": "1.0.0", - "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", "dev": true }, "randexp": { "version": "0.4.6", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", "dev": true, "requires": { "discontinuous-range": "1.0.0", @@ -77176,73 +80426,62 @@ }, "randombytes": { "version": "2.1.0", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { "safe-buffer": "^5.1.0" } }, "randomfill": { "version": "1.0.4", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, "range-parser": { - "version": "1.2.1", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "version": "1.2.1" }, "raw-body": { - "version": "2.4.0", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.3", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.0", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2" }, "http-errors": { - "version": "1.7.2", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" } }, - "setprototypeof": { - "version": "1.1.1", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "inherits": { + "version": "2.0.4" }, - "statuses": { - "version": "1.5.0", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + "setprototypeof": { + "version": "1.2.0" } } }, "raw-loader": { "version": "4.0.2", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "dependencies": { "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3" }, "loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -77253,32 +80492,16 @@ }, "rc-align": { "version": "4.0.9", - "integrity": "sha512-myAM2R4qoB6LqBul0leaqY8gFaiECDJ3MtQDmzDo9xM9NRT/04TvWOYd2YHU9zvGzqk9QXF6S9/MifzSKDZeMw==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "dom-align": "^1.7.0", "rc-util": "^5.3.0", "resize-observer-polyfill": "^1.5.1" - }, - "dependencies": { - "rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "requires": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, "rc-cascader": { "version": "1.4.0", - "integrity": "sha512-6kgQljDQEKjVAVRkZtvvoi+2qv4u42M6oLuvt4ZDBa16r3X9ZN8TAq3atVyC840ivbGKlHT50OcdVx/iwiHc1w==", "requires": { "array-tree-filter": "^2.1.0", "rc-trigger": "^5.0.4", @@ -77288,7 +80511,6 @@ }, "rc-checkbox": { "version": "2.3.2", - "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1" @@ -77296,51 +80518,16 @@ }, "rc-collapse": { "version": "3.1.0", - "integrity": "sha512-EwpNPJcLe7b+5JfyaxM9ZNnkCgqArt3QQO0Cr5p5plwz/C9h8liAmjYY5I4+hl9lAjBqb7ZwLu94+z+rt5g1WQ==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "rc-motion": "^2.3.4", "rc-util": "^5.2.1", "shallowequal": "^1.1.0" - }, - "dependencies": { - "rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "requires": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "rc-dialog": { - "version": "8.4.5", - "integrity": "sha512-0a1Uuy1BRBTdIkfR1VE91kis6dBui7tAIPaQQLj28vBdGg9IqVkiLguCdaDW+4E4vZediePz49PKFbLkx2PL5Q==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-motion": "^2.3.0", - "rc-util": "^5.0.1" - } - }, - "rc-drawer": { - "version": "4.1.0", - "integrity": "sha512-kjeQFngPjdzAFahNIV0EvEBoIKMOnvUsAxpkSPELoD/1DuR4nLafom5ryma+TIxGwkFJ92W6yjsMi1U9aiOTeQ==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-util": "^5.0.1" } }, "rc-dropdown": { "version": "3.2.0", - "integrity": "sha512-j1HSw+/QqlhxyTEF6BArVZnTmezw2LnSmRk6I9W7BCqNCKaRwleRmMMs1PHbuaG8dKHVqP6e21RQ7vPBLVnnNw==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.6", @@ -77349,27 +80536,14 @@ }, "rc-field-form": { "version": "1.17.3", - "integrity": "sha512-EocLncL7uDkxAGywqbtDXe6r8xbru9Yz94JHY7X6XsIdc8sAIGzafMYFaX0hHuwBGbvo7mv7L74cGCuD7xK5Fw==", "requires": { "@babel/runtime": "^7.8.4", "async-validator": "^3.0.3", "rc-util": "^5.0.0" } }, - "rc-image": { - "version": "4.2.0", - "integrity": "sha512-yGqq6wPrIn86hMfC1Hl7M3NNS6zqnl9dvFWJg/StuI86jZBU0rm9rePTfKs+4uiwU3HXxpfsXlaG2p8GWRDLiw==", - "requires": { - "@ant-design/icons": "^4.2.2", - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "rc-dialog": "~8.4.0", - "rc-util": "^5.0.6" - } - }, "rc-input-number": { "version": "6.1.2", - "integrity": "sha512-UvP0tpOUeGetx6caS8RzBs3Du+NwPUn9ijQ3LeR1jOmzjXNuXvv58U6hvIXSHx/4ulPleQ5BAQP/aLTsFB4yGw==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -77378,7 +80552,6 @@ }, "rc-mentions": { "version": "1.5.2", - "integrity": "sha512-GqV0tOtHY3pLpOsFCxJ2i6Ad8AVfxFmz0NlD/8rb8IG8pMpthJKcdfnXlNZRx3Fa9O4YEgJpdSY1WEbmlx2DWQ==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.6", @@ -77390,7 +80563,6 @@ }, "rc-menu": { "version": "8.10.1", - "integrity": "sha512-HmTOLPkSrz5RcdDopD4+nI95YXR2DzdSq9ek3NX2EVgD1UHknlp1QAEJ5MompYdAqdtOspJUqgM/zNt0iQALOw==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -77401,48 +80573,18 @@ "rc-util": "^5.5.0", "resize-observer-polyfill": "^1.5.0", "shallowequal": "^1.1.0" - }, - "dependencies": { - "rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "requires": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, "rc-motion": { "version": "2.4.1", - "integrity": "sha512-TWLvymfMu8SngPx5MDH8dQ0D2RYbluNTfam4hY/dNNx9RQ3WtGuZ/GXHi2ymLMzH+UNd6EEFYkOuR5JTTtm8Xg==", "requires": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", "rc-util": "^5.2.1" - }, - "dependencies": { - "rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "requires": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, "rc-notification": { "version": "4.5.4", - "integrity": "sha512-VsN0ouF4uglE5g3C9oDsXLNYX0Sz++ZNUFYCswkxhpImYJ9u6nJOpyA71uOYDVCu6bAF54Y5Hi/b+EcnMzkepg==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -77452,43 +80594,13 @@ }, "rc-pagination": { "version": "3.1.2", - "integrity": "sha512-KbJvkTvRiD51vTIAi0oTARPUHNb0iV6njbDBe8yLkc3PWYDJaszASfuss6YJ98EIxEeGzuEk6xsUAEKWRJgz2g==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1" } }, - "rc-picker": { - "version": "2.4.3", - "integrity": "sha512-tOIHslTQKpoGNmbpp6YOBwS39dQSvtAuhOm3bWCkkc4jCqUqeR/velCwqefZX1BX4+t1gUMc1dIia9XvOKrEkg==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "date-fns": "^2.15.0", - "dayjs": "^1.8.30", - "moment": "^2.24.0", - "rc-trigger": "^5.0.4", - "rc-util": "^5.4.0", - "shallowequal": "^1.1.0" - }, - "dependencies": { - "rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "requires": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, "rc-progress": { "version": "3.1.1", - "integrity": "sha512-1ns3pW7ll9bHfdXtlVLF+vngdvlxiCDtiqwXnZFEdurst11JTiPxVdeqnCNbhWx5hP4kCKkAPqG1N0FVfTSUGA==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.6" @@ -77496,7 +80608,6 @@ }, "rc-rate": { "version": "2.9.1", - "integrity": "sha512-MmIU7FT8W4LYRRHJD1sgG366qKtSaKb67D0/vVvJYR0lrCuRrCiVQ5qhfT5ghVO4wuVIORGpZs7ZKaYu+KMUzA==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -77505,7 +80616,6 @@ }, "rc-resize-observer": { "version": "0.2.6", - "integrity": "sha512-YX6nYnd6fk7zbuvT6oSDMKiZjyngjHoy+fz+vL3Tez38d/G5iGdaDJa2yE7345G6sc4Mm1IGRUIwclvltddhmA==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", @@ -77513,33 +80623,8 @@ "resize-observer-polyfill": "^1.5.1" } }, - "rc-select": { - "version": "11.5.3", - "integrity": "sha512-ASSO4J/ayfbQQ+KOEounIMGhySDHpQtrIuH1WEABOBy8HgKec8kOLmyLH+YIXSUDnTf/gtxmflgFtl7sQ9pkSw==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-trigger": "^5.0.4", - "rc-util": "^5.0.1", - "rc-virtual-list": "^3.2.0", - "warning": "^4.0.3" - } - }, - "rc-slider": { - "version": "9.6.5", - "integrity": "sha512-XRUJDK668hy8MwGnHzZlXCQXXIOUnEs4m2vwk1jgDILVBxI0GwGOlC6T499pYY+NEWg8YgdCOAucFs/+X5WHpg==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-tooltip": "^5.0.1", - "rc-util": "^5.0.0", - "shallowequal": "^1.1.0" - } - }, "rc-steps": { "version": "4.1.3", - "integrity": "sha512-GXrMfWQOhN3sVze3JnzNboHpQdNHcdFubOETUHyDpa/U3HEKBZC3xJ8XK4paBgF4OJ3bdUVLC+uBPc6dCxvDYA==", "requires": { "@babel/runtime": "^7.10.2", "classnames": "^2.2.3", @@ -77548,41 +80633,14 @@ }, "rc-switch": { "version": "3.2.2", - "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", "rc-util": "^5.0.1" } }, - "rc-table": { - "version": "7.11.3", - "integrity": "sha512-YyZry1CdqUrcH7MmWtLQZVvVZWbmTEbI5m650AZ+zYw4D5VF701samkMYl5z/H9yQFr+ugvDtXcya+e3vwRkMQ==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-resize-observer": "^0.2.0", - "rc-util": "^5.4.0", - "shallowequal": "^1.1.0" - }, - "dependencies": { - "rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "requires": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, "rc-tabs": { "version": "11.7.2", - "integrity": "sha512-2M/XE4TdecnjsDylJSs49OmjJuDuix3VmSiNaPd50PMqFc+dc4fEof3J8/ad12enicVOcsH4BEQEms//Kn4DBw==", "requires": { "@babel/runtime": "^7.11.2", "classnames": "2.x", @@ -77590,157 +80648,51 @@ "rc-menu": "^8.6.1", "rc-resize-observer": "^0.2.1", "rc-util": "^5.5.0" - }, - "dependencies": { - "rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "requires": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, "rc-textarea": { "version": "0.3.2", - "integrity": "sha512-569hiqCtkZFCcxBpKLM+IdnjZDQCFoy7RlQ4bkked0wp9uh+ofgk5zuQNJPiPyMYzpKYRlYeZgJ1bnK/8Po0Sg==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", "omit.js": "^2.0.0", - "rc-resize-observer": "^0.2.3" - } - }, - "rc-tooltip": { - "version": "5.0.1", - "integrity": "sha512-3AnxhUS0j74xAV3khrKw8o6rg+Ima3nw09DJBezMPnX3ImQUAnayWsPSlN1mEnihjA43rcFkGM1emiKE+CXyMQ==", - "requires": { - "@babel/runtime": "^7.11.2", - "rc-trigger": "^5.0.0" - } - }, - "rc-tree": { - "version": "4.0.0", - "integrity": "sha512-C2xlkA+/IypkHBPzbpAJGVWJh2HjeRbYCusA/m5k09WT6hQT0nC7LtLVmnb7QZecdBQPhoOgQh8gPwBR+xEMjQ==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-util": "^5.0.0", - "rc-virtual-list": "^3.0.1" - } - }, - "rc-tree-select": { - "version": "4.2.0", - "integrity": "sha512-VrrvBiOov6WR44RTGMqSw1Dmodg6Y++EH6a6R0ew43qsV4Ob0FGYRgoX811kImtt2Z+oAPJ6zZXN4WKtsQd3Gw==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-select": "^11.1.1", - "rc-tree": "^4.0.0", - "rc-util": "^5.0.5" + "rc-resize-observer": "^0.2.3" } }, "rc-trigger": { "version": "5.2.0", - "integrity": "sha512-fpC1ZkM/IgIIDfF6XHx3Hb2zXy9wvdI5eMh+6DdLygk6Z3HGmkri6ZCXg9a0wfF9AFuzlYTeBLS1uRASZRsnMQ==", "requires": { "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", "rc-align": "^4.0.0", "rc-motion": "^2.0.0", "rc-util": "^5.5.0" - }, - "dependencies": { - "rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "requires": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, "rc-upload": { "version": "3.3.4", - "integrity": "sha512-v2sirR4JL31UTHD/f0LGUdd+tpFaOVUTPeIEjAXRP9kRN8TFhqOgcXl5ixtyqj90FmtRUmKmafCv0EmhBQUHqQ==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", "rc-util": "^5.2.0" - }, - "dependencies": { - "rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "requires": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, "rc-util": { - "version": "5.0.6", - "integrity": "sha512-uLGxF9WjbpJSjd6iDnIjl8ZeMUglpcuh1DwO26aaXh++yAmlB6eIAJMUwwJCuqJvo4quCvsDPg1VkqHILc4U0A==", + "version": "5.24.4", "requires": { + "@babel/runtime": "^7.18.3", "react-is": "^16.12.0", "shallowequal": "^1.1.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "rc-virtual-list": { - "version": "3.2.3", - "integrity": "sha512-uEeYDQWwQhxR97SekPeGRbzPtHSbSpw/mYb6QpZZ9bA43kf7s1socV3fD3ySYhQVzo0I+/IUD9jFGit6FbM0WA==", - "requires": { - "classnames": "^2.2.6", - "rc-resize-observer": "^0.2.3", - "rc-util": "^5.0.7" - }, - "dependencies": { - "rc-util": { - "version": "5.5.1", - "integrity": "sha512-lnkBptu1RX65GO6jf28scbDMM/9MVl/hYI0uMEVM+cQ0ALLhFChDzgv7ciNpjayCH88wSDHTp6582es4tzJHhA==", - "requires": { - "react-is": "^16.12.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, "re-resizable": { "version": "6.6.1", - "integrity": "sha512-ttWVasZ9X7c0ir0+4YK47tkmm9EAFssW07YLkeLzG5HCOuFgFAlSVzMlzAH0h3i6hDShQCHHJecVx5rk+snoFA==", "requires": { "fast-memoize": "^2.5.1" } }, "react": { "version": "16.14.0", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -77748,10 +80700,9 @@ } }, "react-ace": { - "version": "9.5.0", - "integrity": "sha512-4l5FgwGh6K7A0yWVMQlPIXDItM4Q9zzXRqOae8KkCl6MkOob7sC1CzHxZdOGvV+QioKWbX2p5HcdOVUv6cAdSg==", + "version": "10.1.0", "requires": { - "ace-builds": "^1.4.13", + "ace-builds": "^1.4.14", "diff-match-patch": "^1.0.5", "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", @@ -77759,42 +80710,50 @@ } }, "react-base16-styling": { - "version": "0.5.3", - "integrity": "sha512-EPuchwVvYPSFFIjGpH0k6wM0HQsmJ0vCk7BSl5ryxMVFIWW4hX4Kksu4PNtxfgOxDebTLkJQ8iC7zwAql0eusg==", + "version": "0.9.1", "requires": { + "@babel/runtime": "^7.16.7", + "@types/base16": "^1.0.2", + "@types/lodash": "^4.14.178", "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" + "color": "^3.2.1", + "csstype": "^3.0.10", + "lodash.curry": "^4.1.1" + }, + "dependencies": { + "csstype": { + "version": "3.1.1" + } } }, "react-bootstrap-slider": { "version": "2.1.5", - "integrity": "sha512-7rO3JlCVIpr+XtwiSfg8r+MPqyl9KdLI61pNuSMBYYQZ42IWBC+kk/UDyYevp76aGAMtd9SCW8erxOvq+VpekQ==", "requires": { "bootstrap-slider": "9.9.0", "es6bindall": "^0.0.9" }, "dependencies": { "bootstrap-slider": { - "version": "9.9.0", - "integrity": "sha512-3U8owtxLBekUu6qn+evqlI9S2Q4bTrY5cJqDhg4CzyQJzKSwdUhztE40Hvg+1azpylQgMDUK38uvKGpgcK27fA==" + "version": "9.9.0" } } }, "react-checkbox-tree": { - "version": "1.5.1", - "integrity": "sha512-fBLMVpd7/YXavzIBz+3OMS5eo2oZLW9PlTY4M1zrJ3TdZRzgILicSzRj6V5VKKm80y8uQXn60skn98pwn3i3Ig==", + "version": "1.8.0", "requires": { "classnames": "^2.2.5", "lodash": "^4.17.10", - "nanoid": "^2.0.0", + "nanoid": "^3.0.0", "prop-types": "^15.5.8" + }, + "dependencies": { + "nanoid": { + "version": "3.3.4" + } } }, "react-color": { "version": "2.14.1", - "integrity": "sha512-ssv2ArSZdhTbIs29hyfw8JW+s3G4BCx/ILkwCajWZzrcx/2ZQfRpsaLVt38LAPbxe50LLszlmGtRerA14JzzRw==", "requires": { "lodash": "^4.0.1", "material-colors": "^1.2.1", @@ -77804,19 +80763,34 @@ } }, "react-colorful": { - "version": "5.5.0", - "integrity": "sha512-BuzrlrM0ylg7coPkXOrRqlf2BgHLw5L44sybbr9Lg4xy7w9e5N7fGYbojOO0s8J0nvrM3PERN2rVFkvSa24lnQ==" + "version": "5.5.0" }, "react-datetime": { - "version": "3.0.4", - "integrity": "sha512-v6MVwCve+DRaLN2f22LTO5TlrPpkUXumPkp1zfrbhaFtSYGl2grZ2JtwJfLxRj/T4ACyePAV4srCR6cMSiQ/Iw==", + "version": "3.2.0", "requires": { "prop-types": "^15.5.7" } }, + "react-diff-viewer-continued": { + "version": "3.2.5", + "requires": { + "classnames": "^2.3.1", + "diff": "^5.1.0", + "emotion": "^10.0.27", + "memoize-one": "^6.0.0", + "prop-types": "^15.8.1" + }, + "dependencies": { + "diff": { + "version": "5.1.0" + }, + "memoize-one": { + "version": "6.0.0" + } + } + }, "react-dnd": { "version": "11.1.3", - "integrity": "sha512-8rtzzT8iwHgdSC89VktwhqdKKtfXaAyC4wiqp0SywpHG12TTLvfOoL6xNEIUWXwIEWu+CFfDn4GZJyynCEuHIQ==", "requires": { "@react-dnd/shallowequal": "^2.0.0", "@types/hoist-non-react-statics": "^3.3.1", @@ -77826,14 +80800,12 @@ }, "react-dnd-html5-backend": { "version": "11.1.3", - "integrity": "sha512-/1FjNlJbW/ivkUxlxQd7o3trA5DE33QiRZgxent3zKme8DwF4Nbw3OFVhTRFGaYhHFNL1rZt6Rdj1D78BjnNLw==", "requires": { "dnd-core": "^11.1.3" } }, "react-docgen": { "version": "5.4.0", - "integrity": "sha512-JBjVQ9cahmNlfjMGxWUxJg919xBBKAoy3hgDgKERbR+BcF4ANpDuzWAScC7j27hZfd8sJNmMPOLWo9+vB/XJEQ==", "requires": { "@babel/core": "^7.7.5", "@babel/generator": "^7.12.11", @@ -77848,12 +80820,10 @@ } }, "react-docgen-typescript": { - "version": "2.1.0", - "integrity": "sha512-7kpzLsYzVxff//HUVz1sPWLCdoSNvHD3M8b/iQLdF8fgf7zp26eVysRrAUSxiAT4yQv2zl09zHjJEYSYNxQ8Jw==" + "version": "2.1.0" }, "react-dom": { "version": "16.14.0", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -77863,7 +80833,6 @@ "dependencies": { "scheduler": { "version": "0.19.1", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -77873,7 +80842,6 @@ }, "react-draggable": { "version": "4.4.3", - "integrity": "sha512-jV4TE59MBuWm7gb6Ns3Q1mxX8Azffb7oTtDtBgFkxRvhDp38YAARmRplrj0+XGkhOJB5XziArX+4HUUABtyZ0w==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.6.0" @@ -77881,7 +80849,6 @@ }, "react-element-to-jsx-string": { "version": "14.3.4", - "integrity": "sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg==", "requires": { "@base2/pretty-print-object": "1.0.1", "is-plain-object": "5.0.0", @@ -77889,26 +80856,21 @@ }, "dependencies": { "is-plain-object": { - "version": "5.0.0", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + "version": "5.0.0" }, "react-is": { - "version": "17.0.2", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "version": "17.0.2" } } }, "react-error-boundary": { - "version": "1.2.5", - "integrity": "sha512-5CPSeLJA2igJNppAgFRwnTL9aK3ojenk65enNzhVyoxYNbHpIJXnChUO7+4vPhkncRA9wvQMXq6Azp2XeXd+iQ==" + "version": "1.2.5" }, "react-fast-compare": { - "version": "3.2.0", - "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + "version": "3.2.0" }, "react-gravatar": { "version": "2.6.3", - "integrity": "sha512-yITonigS2LmG7Fw0gWfZfcVwy1mpiBHNVmoFyetitQjXu7JCYoE6jtub0GIfq+ydpnQSYyJT3kwpX6zj1wXR4w==", "requires": { "is-retina": "^1.0.3", "md5": "^2.1.0", @@ -77917,21 +80879,18 @@ "dependencies": { "query-string": { "version": "4.3.4", - "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", "requires": { "object-assign": "^4.1.0", "strict-uri-encode": "^1.0.0" } }, "strict-uri-encode": { - "version": "1.1.0", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==" + "version": "1.1.0" } } }, "react-helmet-async": { "version": "1.3.0", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", "requires": { "@babel/runtime": "^7.12.5", "invariant": "^2.2.4", @@ -77941,175 +80900,120 @@ } }, "react-hot-loader": { - "version": "4.13.0", - "integrity": "sha512-JrLlvUPqh6wIkrK2hZDfOyq/Uh/WeVEr8nc7hkn2/3Ul0sx1Kr5y4kOGNacNRoj7RhwLNcQ3Udf1KJXrqc0ZtA==", + "version": "4.13.1", "requires": { "fast-levenshtein": "^2.0.6", "global": "^4.3.0", "hoist-non-react-statics": "^3.3.0", - "loader-utils": "^1.1.0", + "loader-utils": "^2.0.3", "prop-types": "^15.6.1", "react-lifecycles-compat": "^3.0.4", "shallowequal": "^1.1.0", "source-map": "^0.7.3" }, "dependencies": { + "json5": { + "version": "2.2.3" + }, + "loader-utils": { + "version": "2.0.4", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, "source-map": { - "version": "0.7.3", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.7.3" } } }, - "react-icons": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.7.1.tgz", - "integrity": "sha512-yHd3oKGMgm7zxo3EA7H2n7vxSoiGmHk5t6Ou4bXsfcgWyhfDKMpyKfhHR6Bjnn63c+YXBLBPUql9H4wPJM6sXw==" - }, "react-input-autosize": { "version": "2.2.2", - "integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==", "requires": { "prop-types": "^15.5.8" } }, "react-inspector": { "version": "5.1.1", - "integrity": "sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==", "requires": { "@babel/runtime": "^7.0.0", "is-dom": "^1.0.0", "prop-types": "^15.0.0" } }, + "react-intersection-observer": { + "version": "9.4.1" + }, "react-is": { - "version": "16.6.3", - "integrity": "sha512-u7FDWtthB4rWibG/+mFbVd5FvdI20yde86qKGx4lVUTWmPlSWQ4QxbBIrrs+HnXGbxOUlUzTAP/VDmvCwaP2yA==" + "version": "16.13.1" }, "react-js-cron": { - "version": "1.2.0", - "integrity": "sha512-mWxTmXkqP58ughdziS3qjEUVl1O03XEo8WDvr45/kTQfbd0C6ITniAsG5wZzwmTOgmrOKQheHog7L0TP683WUA==" + "version": "1.2.0" }, "react-json-tree": { - "version": "0.11.2", - "integrity": "sha512-aYhUPj1y5jR3ZQ+G3N7aL8FbTyO03iLwnVvvEikLcNFqNTyabdljo9xDftZndUBFyyyL0aK3qGO9+8EilILHUw==", + "version": "0.17.0", "requires": { - "babel-runtime": "^6.6.1", - "prop-types": "^15.5.8", - "react-base16-styling": "^0.5.1" + "@babel/runtime": "^7.18.3", + "@types/lodash": "^4.14.182", + "@types/prop-types": "^15.7.5", + "prop-types": "^15.8.1", + "react-base16-styling": "^0.9.1" } }, "react-jsonschema-form": { - "version": "1.2.0", - "integrity": "sha512-rR77qoFiQ5TxDYwsJz8UWmDner4jQ4xMnDqeV6Nvg7GtoEyOUoTVkI/SBMEzfXuF/piWZXYjquP96Hy/2L7C+Q==", + "version": "1.8.1", "requires": { - "ajv": "^5.2.3", - "babel-runtime": "^6.26.0", + "@babel/runtime-corejs2": "^7.4.5", + "ajv": "^6.7.0", "core-js": "^2.5.7", - "lodash.topath": "^4.5.2", - "prop-types": "^15.5.8" + "lodash": "^4.17.15", + "prop-types": "^15.5.8", + "react-is": "^16.8.4", + "react-lifecycles-compat": "^3.0.4", + "shortid": "^2.2.14" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "integrity": "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==", - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, "core-js": { - "version": "2.6.9", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" - }, - "fast-deep-equal": { - "version": "1.1.0", - "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==" - }, - "json-schema-traverse": { - "version": "0.3.1", - "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==" + "version": "2.6.9" } } }, "react-lifecycles-compat": { - "version": "3.0.4", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + "version": "3.0.4" }, "react-lines-ellipsis": { - "version": "0.15.0", - "integrity": "sha512-8kWpEmu7ijmB6Gz5t+eSjNux2SpVXZBsmfeFE8LjMS7tU3H8ai475CyNc0dH0RDTwt4Esr7c06Xq4SB7Gpl9yQ==" + "version": "0.15.0" }, "react-loadable": { "version": "5.5.0", - "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==", "requires": { "prop-types": "^15.5.0" } }, "react-map-gl": { - "version": "4.1.16", - "integrity": "sha512-EtiHCeqM69wKR9RDyLvtk6pTPS5+OFeAPIsYw6afnlGTauFAq3iD40SHuAOElgoJmm7J+cjPfHqu7m7tB4/FfA==", + "version": "6.1.19", "requires": { "@babel/runtime": "^7.0.0", - "mapbox-gl": "~0.54.0", - "mjolnir.js": "^2.2.0", + "@types/geojson": "^7946.0.7", + "@types/mapbox-gl": "^2.0.3", + "mapbox-gl": "^2.3.0", + "mjolnir.js": "^2.5.0", "prop-types": "^15.7.2", - "react-virtualized-auto-sizer": "^1.0.2", - "viewport-mercator-project": "^6.2.1" - }, - "dependencies": { - "esm": { - "version": "3.0.84", - "integrity": "sha512-SzSGoZc17S7P+12R9cg21Bdb7eybX25RnIeRZ80xZs+VZ3kdQKzqTp2k4hZJjR7p9l0186TTXSgrxzlMDBktlw==" - }, - "mapbox-gl": { - "version": "0.54.1", - "integrity": "sha512-HtY+HobYTHTsFOJ3buTHtNvZv/Tjfp0vararhEWCjI7wQq8XxK16sEpsXucokrAhuu94js4KJylo13bKJx6l0Q==", - "requires": { - "@mapbox/geojson-rewind": "^0.4.0", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.4.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.0", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.2", - "earcut": "^2.1.5", - "esm": "~3.0.84", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.0.0", - "grid-index": "^1.1.0", - "minimist": "0.0.8", - "murmurhash-js": "^1.0.0", - "pbf": "^3.0.5", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^6.0.1", - "tinyqueue": "^2.0.0", - "vt-pbf": "^3.1.1" - } - }, - "minimist": { - "version": "0.0.8", - "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==" - }, - "supercluster": { - "version": "6.0.2", - "integrity": "sha512-aa0v2HURjBTOpbcknilcfxGDuArM8khklKSmZ/T8ZXL0BuRwb5aRw95lz+2bmWpFvCXDX/+FzqHxmg0TIaJErw==", + "resize-observer-polyfill": "^1.5.1", + "viewport-mercator-project": "^7.0.4" + }, + "dependencies": { + "viewport-mercator-project": { + "version": "7.0.4", "requires": { - "kdbush": "^3.0.0" + "@math.gl/web-mercator": "^3.5.5" } } } }, "react-markdown": { - "version": "8.0.4", - "integrity": "sha512-2oxHa6oDxc1apg/Gnc1Goh06t3B617xeywqI/92wmDV9FELI6ayRkwge7w7DoEqM0gRpZGTNU6xQG+YpJISnVg==", + "version": "8.0.3", "requires": { "@types/hast": "^2.0.0", "@types/prop-types": "^15.0.0", @@ -78129,26 +81033,21 @@ }, "dependencies": { "comma-separated-tokens": { - "version": "2.0.3", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" + "version": "2.0.2" }, "property-information": { - "version": "6.2.0", - "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==" + "version": "6.1.1" }, "react-is": { - "version": "18.2.0", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.2.0" }, "space-separated-tokens": { - "version": "2.0.2", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" + "version": "2.0.1" } } }, "react-move": { "version": "2.9.1", - "integrity": "sha512-5qKYsJrKKpSypEaaYyR2HBbBgX65htRqKDa8o5OGDkq2VfklmTCbLawtYFpdmcJRqbz4jCYpzo2Rrsazq9HA8Q==", "requires": { "@babel/runtime": "^7.2.0", "d3-interpolate": "^1.3.2", @@ -78159,7 +81058,6 @@ }, "react-popper": { "version": "2.2.5", - "integrity": "sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==", "requires": { "react-fast-compare": "^3.0.1", "warning": "^4.0.2" @@ -78167,65 +81065,84 @@ }, "react-popper-tooltip": { "version": "3.1.1", - "integrity": "sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==", "requires": { "@babel/runtime": "^7.12.5", "@popperjs/core": "^2.5.4", "react-popper": "^2.2.4" } }, - "react-redux": { - "version": "7.2.0", - "integrity": "sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA==", + "react-query": { + "version": "3.39.2", "requires": { "@babel/runtime": "^7.5.5", - "hoist-non-react-statics": "^3.3.0", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "dependencies": { + "broadcast-channel": { + "version": "3.7.0", + "requires": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, + "unload": { + "version": "2.2.0", + "requires": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + } + } + }, + "react-redux": { + "version": "7.2.8", + "requires": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", "loose-envify": "^1.4.0", "prop-types": "^15.7.2", - "react-is": "^16.9.0" + "react-is": "^17.0.2" }, "dependencies": { "react-is": { - "version": "16.13.1", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "version": "17.0.2" } } }, "react-refresh": { - "version": "0.11.0", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" + "version": "0.11.0" }, "react-resizable": { "version": "3.0.4", - "integrity": "sha512-StnwmiESiamNzdRHbSSvA65b0ZQJ7eVQpPusrSmcpyGKzC0gojhtO62xxH6YOBmepk9dQTBi9yxidL3W4s3EBA==", "requires": { "prop-types": "15.x", "react-draggable": "^4.0.3" } }, "react-resize-detector": { - "version": "6.7.6", - "integrity": "sha512-/6RZlul1yePSoYJxWxmmgjO320moeLC/khrwpEVIL+D2EjLKhqOwzFv+H8laMbImVj7Zu4FlMa0oA7au3/ChjQ==", + "version": "7.1.2", "requires": { - "@types/resize-observer-browser": "^0.1.6", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "resize-observer-polyfill": "^1.5.1" + "lodash": "^4.17.21" } }, "react-reverse-portal": { - "version": "2.0.1", - "integrity": "sha512-sj/D9nSHspqV8i8hWkTSZ5Ohnrqk2A5fkDKw4Xe/zV4OfF1UYwmbzrxLdmNRdKkWgQwnXIxaa2E3FC7QYdZAeA==" + "version": "2.1.1" }, "react-router": { - "version": "5.1.2", - "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", + "version": "5.3.4", "requires": { - "@babel/runtime": "^7.1.2", + "@babel/runtime": "^7.12.13", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.3.0", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", @@ -78234,12 +81151,10 @@ }, "dependencies": { "isarray": { - "version": "0.0.1", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "version": "0.0.1" }, "path-to-regexp": { "version": "1.8.0", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "requires": { "isarray": "0.0.1" } @@ -78247,35 +81162,31 @@ } }, "react-router-dom": { - "version": "5.1.2", - "integrity": "sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==", + "version": "5.3.4", "requires": { - "@babel/runtime": "^7.1.2", + "@babel/runtime": "^7.12.13", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.1.2", + "react-router": "5.3.4", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" } }, "react-search-input": { "version": "0.11.3", - "integrity": "sha512-Yo05lNR5YLeIY+mTEk0lMkYHX0qkTlElJmxMTw5JlZPu92EP8YWwIY3QSbEFULvX4wiTfyDdUovTUpp2VockpA==", "requires": { "fuse.js": "^3.0.0", "prop-types": "^15.5.8" }, "dependencies": { "fuse.js": { - "version": "3.6.1", - "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==" + "version": "3.6.1" } } }, "react-select": { - "version": "3.1.0", - "integrity": "sha512-wBFVblBH1iuCBprtpyGtd1dGMadsG36W5/t2Aj8OE6WbByDg5jIFyT7X5gT+l0qmT5TqWhxX+VsKJvCEl2uL9g==", + "version": "3.2.0", "requires": { "@babel/runtime": "^7.4.4", "@emotion/cache": "^10.0.9", @@ -78283,13 +81194,12 @@ "@emotion/css": "^10.0.9", "memoize-one": "^5.0.0", "prop-types": "^15.6.0", - "react-input-autosize": "^2.2.2", + "react-input-autosize": "^3.0.0", "react-transition-group": "^4.3.0" }, "dependencies": { "@emotion/cache": { "version": "10.0.29", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", "requires": { "@emotion/sheet": "0.9.4", "@emotion/stylis": "0.8.5", @@ -78299,15 +81209,19 @@ }, "dom-helpers": { "version": "5.1.4", - "integrity": "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==", "requires": { "@babel/runtime": "^7.8.7", "csstype": "^2.6.7" } }, + "react-input-autosize": { + "version": "3.0.0", + "requires": { + "prop-types": "^15.5.8" + } + }, "react-transition-group": { "version": "4.4.1", - "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", "requires": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -78319,7 +81233,6 @@ }, "react-sizeme": { "version": "3.0.2", - "integrity": "sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw==", "requires": { "element-resize-detector": "^1.2.2", "invariant": "^2.2.4", @@ -78328,8 +81241,7 @@ } }, "react-sortable-hoc": { - "version": "1.11.0", - "integrity": "sha512-v1CDCvdfoR3zLGNp6qsBa4J1BWMEVH25+UKxF/RvQRh+mrB+emqtVHMgZ+WreUiKJoEaiwYoScaueIKhMVBHUg==", + "version": "2.0.0", "requires": { "@babel/runtime": "^7.2.0", "invariant": "^2.2.4", @@ -78338,45 +81250,32 @@ }, "react-split": { "version": "2.0.14", - "integrity": "sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA==", "requires": { "prop-types": "^15.5.7", "split.js": "^1.6.0" }, "dependencies": { "split.js": { - "version": "1.6.2", - "integrity": "sha512-72C7zcQePzlmWqPOKkB2Ro0sUmnWSx+qEWXjLJKk6Qp4jAkFRz1hJgJb+ay6ZQyz/Aw9r8N/PZiCEKbPVpFoDQ==" + "version": "1.6.2" } } }, "react-split-pane": { "version": "0.1.92", - "integrity": "sha512-GfXP1xSzLMcLJI5BM36Vh7GgZBpy+U/X0no+VM3fxayv+p1Jly5HpMofZJraeaMl73b3hvlr+N9zJKvLB/uz9w==", "requires": { "prop-types": "^15.7.2", "react-lifecycles-compat": "^3.0.4", "react-style-proptype": "^3.2.2" } }, - "react-sticky": { - "version": "6.0.3", - "integrity": "sha512-LNH4UJlRatOqo29/VHxDZOf6fwbgfgcHO4mkEFvrie5FuaZCSTGtug5R8NGqJ0kSnX8gHw8qZN37FcvnFBJpTQ==", - "requires": { - "prop-types": "^15.5.8", - "raf": "^3.3.0" - } - }, "react-style-proptype": { "version": "3.2.2", - "integrity": "sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==", "requires": { "prop-types": "^15.5.4" } }, "react-syntax-highlighter": { "version": "15.5.0", - "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", "requires": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", @@ -78386,36 +81285,25 @@ }, "dependencies": { "prismjs": { - "version": "1.28.0", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==" + "version": "1.28.0" } } }, "react-table": { - "version": "7.6.3", - "integrity": "sha512-hfPF13zDLxPMpLKzIKCE8RZud9T/XrRTsaCIf8zXpWZIZ2juCl7qrGpo3AQw9eAetXV5DP7s2GDm+hht7qq5Dw==" + "version": "7.8.0" }, "react-test-renderer": { "version": "16.9.0", - "integrity": "sha512-R62stB73qZyhrJo7wmCW9jgl/07ai+YzvouvCXIJLBkRlRqLx4j9RqcLEAfNfU3OxTGucqR2Whmn3/Aad6L3hQ==", "dev": true, "requires": { "object-assign": "^4.1.1", "prop-types": "^15.6.2", "react-is": "^16.9.0", "scheduler": "^0.15.0" - }, - "dependencies": { - "react-is": { - "version": "16.9.0", - "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", - "dev": true - } } }, "react-textarea-autosize": { "version": "8.3.3", - "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", "requires": { "@babel/runtime": "^7.10.2", "use-composed-ref": "^1.0.0", @@ -78424,7 +81312,6 @@ }, "react-transition-group": { "version": "2.5.3", - "integrity": "sha512-2DGFck6h99kLNr8pOFk+z4Soq3iISydwOFeeEVPjTN6+Y01CmvbWmnN02VuTWyFdnRtIDPe+wy2q6Ui8snBPZg==", "requires": { "dom-helpers": "^3.3.1", "loose-envify": "^1.4.0", @@ -78433,8 +81320,7 @@ } }, "react-ultimate-pagination": { - "version": "1.2.0", - "integrity": "sha512-tBLzzskuBqsziQDUI98hA7FTBy2/Q5olRsvu3GdLYykfGUgDvYQOI7hLi9o5pD5zJeuAsVn3OoAUw0CaJi0WoQ==", + "version": "1.3.0", "requires": { "prop-types": "^15.0.0", "ultimate-pagination": "1.0.0" @@ -78442,7 +81328,6 @@ }, "react-virtualized": { "version": "9.19.1", - "integrity": "sha512-2l6uFicZKZ3x4rdnS0W+1TfyLmPO/+hfZKsCtoChoSmH5aEezGLpSuHc7oplekNIOaEwChfCk30zjx+Zw6B8YQ==", "requires": { "babel-runtime": "^6.26.0", "classnames": "^2.2.3", @@ -78453,33 +81338,10 @@ } }, "react-virtualized-auto-sizer": { - "version": "1.0.6", - "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==" - }, - "react-virtualized-select": { - "version": "3.1.3", - "integrity": "sha512-u6j/EfynCB9s4Lz5GGZhNUCZHvFQdtLZws7W/Tcd/v03l19OjpQs3eYjK82iYS0FgD2+lDIBpqS8LpD/hjqDRQ==", - "requires": { - "babel-runtime": "^6.11.6", - "prop-types": "^15.5.8", - "react-select": "^1.0.0-rc.2", - "react-virtualized": "^9.0.0" - }, - "dependencies": { - "react-select": { - "version": "1.3.0", - "integrity": "sha512-g/QAU1HZrzSfxkwMAo/wzi6/ezdWye302RGZevsATec07hI/iSxcpB1hejFIp7V63DJ8mwuign6KmB3VjdlinQ==", - "requires": { - "classnames": "^2.2.4", - "prop-types": "^15.5.8", - "react-input-autosize": "^2.1.2" - } - } - } + "version": "1.0.7" }, "react-window": { - "version": "1.8.5", - "integrity": "sha512-HeTwlNa37AFa8MDZFZOKcNEkuF2YflA0hpGPiTT9vR7OawEt+GZbfM6wqkBahD3D3pUjIabQYzsnY/BSJbgq6Q==", + "version": "1.8.8", "requires": { "@babel/runtime": "^7.0.0", "memoize-one": ">=3.1.1 <6" @@ -78487,7 +81349,6 @@ }, "react-with-styles": { "version": "1.4.0", - "integrity": "sha512-KE+EkYXots4HPbe9V4FRFfkANrpfy/zOBIR2jGaylcOxp4f+17qAaVp0PzCFvhNDoSsH8hSoT7XuK2DQtWn9kQ==", "requires": { "deepmerge": "^1.3.2", "global-cache": "^1.2.0", @@ -78496,145 +81357,125 @@ }, "dependencies": { "hoist-non-react-statics": { - "version": "1.2.0", - "integrity": "sha512-r8huvKK+m+VraiRipdZYc+U4XW43j6OFG/oIafe7GfDbRpCduRoX9JI/DRxqgtBSCeL+et6N6ibZoedHS2NyOQ==" + "version": "1.2.0" } } }, "react-with-styles-interface-aphrodite": { "version": "1.2.0", - "integrity": "sha512-JMo9NaGj77pn1IApVHxkPJC6pQeAC75Yeq3X/HjGp66we9HyzcH9qUpAw9zY1RQNyp6Nwg0mNJA/THU6wDgrkQ==", "requires": { "array-flatten": "^2.1.0", "has": "^1.0.1" } }, "reactable": { - "version": "1.1.0", - "integrity": "sha512-SnvZ3CXyFFxGotw9cqNiVUGb2oW16UlIypGQZRJGgPiJuFqW22jO7A+Y/Tvv8no8F/bZoLdZ+QJP7eZfcc9kCw==" + "version": "1.1.0" }, "reactcss": { "version": "1.2.3", - "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", "requires": { "lodash": "^4.0.1" } }, "read": { "version": "1.0.7", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", "dev": true, "requires": { "mute-stream": "~0.0.4" } }, - "read-chunk": { - "version": "3.2.0", - "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", - "requires": { - "pify": "^4.0.1", - "with-open-file": "^0.1.6" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } - } - }, - "read-cmd-shim": { - "version": "2.0.0", - "integrity": "sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw==", - "dev": true - }, "read-package-json": { - "version": "3.0.1", - "integrity": "sha512-aLcPqxovhJTVJcsnROuuzQvv6oziQx4zd3JvG0vGCL5MjTONUc4uJ90zCBC6R7W7oUKBNoR/F8pkyfVwlbxqng==", + "version": "5.0.2", "dev": true, "requires": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^2.0.0" }, "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.0.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, "hosted-git-info": { - "version": "4.1.0", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "version": "5.2.1", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.5.1" } }, "lru-cache": { - "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "7.14.1", + "dev": true + }, + "minimatch": { + "version": "5.1.2", "dev": true, "requires": { - "yallist": "^4.0.0" + "brace-expansion": "^2.0.1" } }, "normalize-package-data": { - "version": "3.0.3", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "version": "4.0.1", "dev": true, "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" } }, + "npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true + }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", "dev": true, "requires": { "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "read-package-json-fast": { "version": "2.0.3", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", "dev": true, "requires": { "json-parse-even-better-errors": "^2.3.0", "npm-normalize-package-bin": "^1.0.1" } }, - "read-package-tree": { - "version": "5.3.1", - "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", - "dev": true, - "requires": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" - }, - "dependencies": { - "read-package-json": { - "version": "2.1.2", - "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", - "dev": true, - "requires": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - } - } - }, "read-pkg": { "version": "5.2.0", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "requires": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -78644,7 +81485,6 @@ "dependencies": { "parse-json": { "version": "5.1.0", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -78653,14 +81493,12 @@ } }, "type-fest": { - "version": "0.6.0", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + "version": "0.6.0" } } }, "read-pkg-up": { "version": "7.0.1", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "requires": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -78669,7 +81507,6 @@ "dependencies": { "find-up": { "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -78677,38 +81514,32 @@ }, "locate-path": { "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" } }, "p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "2.2.0" }, "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" } } }, "readable-stream": { "version": "2.3.6", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -78721,7 +81552,6 @@ }, "readdir-scoped-modules": { "version": "1.1.0", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", "dev": true, "requires": { "debuglog": "^1.0.1", @@ -78732,7 +81562,6 @@ }, "readdirp": { "version": "2.2.1", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "optional": true, "requires": { "graceful-fs": "^4.1.11", @@ -78742,7 +81571,6 @@ }, "realpath-native": { "version": "1.1.0", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "dev": true, "requires": { "util.promisify": "^1.0.0" @@ -78750,14 +81578,12 @@ }, "rechoir": { "version": "0.6.2", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "requires": { "resolve": "^1.1.6" } }, "recompose": { "version": "0.23.5", - "integrity": "sha512-QFM1/k05FtmoFgZj6m5lw0PUMXKLU5/iOEicv1lEQJ7LFUrrxpaPe2U54P8lIdiPeVcTsSHu5t5eeKSHCRXK+Q==", "requires": { "change-emitter": "^0.1.2", "fbjs": "^0.8.1", @@ -78766,36 +81592,20 @@ }, "dependencies": { "hoist-non-react-statics": { - "version": "1.2.0", - "integrity": "sha512-r8huvKK+m+VraiRipdZYc+U4XW43j6OFG/oIafe7GfDbRpCduRoX9JI/DRxqgtBSCeL+et6N6ibZoedHS2NyOQ==" + "version": "1.2.0" } } }, "redent": { "version": "3.0.0", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "requires": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, - "redeyed": { - "version": "0.4.4", - "integrity": "sha512-pnk1vsaNLu1UAAClKsImKz9HjBvg9i8cbRqTRzJbiCjGF0fZSMqpdcA5W3juO3c4etFvTrabECkq9wjC45ZyxA==", - "requires": { - "esprima": "~1.0.4" - }, - "dependencies": { - "esprima": { - "version": "1.0.4", - "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==" - } - } - }, "reduce-css-calc": { "version": "1.3.0", - "integrity": "sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==", "requires": { "balanced-match": "^0.4.2", "math-expression-evaluator": "^1.2.14", @@ -78803,58 +81613,48 @@ }, "dependencies": { "balanced-match": { - "version": "0.4.2", - "integrity": "sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg==" + "version": "0.4.2" } } }, "reduce-flatten": { - "version": "2.0.0", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==" + "version": "2.0.0" }, "reduce-function-call": { "version": "1.0.3", - "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", "requires": { "balanced-match": "^1.0.0" } }, "redux": { "version": "4.0.5", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", "requires": { "loose-envify": "^1.4.0", "symbol-observable": "^1.2.0" } }, "redux-localstorage": { - "version": "0.4.1", - "integrity": "sha512-dUha0YoH+BSZ2q15pakB+JWeqiuXUf3Ir4rObOpNrZ96HEdciGAjkL10k3KGdLI7qvQw/c096asw/SQ6TPjU/A==" + "version": "0.4.1" }, "redux-mock-store": { "version": "1.5.4", - "integrity": "sha512-xmcA0O/tjCLXhh9Fuiq6pMrJCwFRaouA8436zcikdIpYWWCjU76CRk+i2bHx8EeiSiMGnB85/lZdU3wIJVXHTA==", "dev": true, "requires": { "lodash.isplainobject": "^4.0.6" } }, "redux-thunk": { - "version": "2.3.0", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" + "version": "2.3.0" }, "redux-undo": { - "version": "1.0.0-beta9-9-7", - "integrity": "sha512-TTo1X0rkWJaHB4NOnMWXuuyZ3XOHzqplAPUtKFfuAxsSnrLN+ft+CsQy3vuT5+/n02DKWRpkj5hpxsLgmTPPBQ==" + "version": "1.0.0-beta9-9-7" }, "reflect.ownkeys": { "version": "0.2.0", - "integrity": "sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==", "dev": true }, "refractor": { "version": "3.6.0", - "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", "requires": { "hastscript": "^6.0.0", "parse-entities": "^2.0.0", @@ -78863,7 +81663,6 @@ "dependencies": { "parse-entities": { "version": "2.0.0", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "requires": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", @@ -78876,30 +81675,25 @@ } }, "regenerate": { - "version": "1.4.2", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "version": "1.4.2" }, "regenerate-unicode-properties": { - "version": "9.0.0", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "version": "10.0.1", "requires": { "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.7", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.13.10" }, "regenerator-transform": { - "version": "0.14.5", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", "requires": { "@babel/runtime": "^7.8.4" } }, "regex-not": { "version": "1.0.2", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -78907,7 +81701,6 @@ "dependencies": { "extend-shallow": { "version": "3.0.2", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -78915,7 +81708,6 @@ }, "is-extendable": { "version": "1.0.1", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } @@ -78923,50 +81715,44 @@ } }, "regexp.prototype.flags": { - "version": "1.3.0", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "version": "1.4.3", "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "functions-have-names": "^1.2.2" } }, "regexpp": { "version": "3.2.0", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "regexpu-core": { - "version": "4.8.0", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "version": "5.1.0", "requires": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" } }, "regjsgen": { - "version": "0.5.2", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + "version": "0.6.0" }, "regjsparser": { - "version": "0.7.0", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "version": "0.8.4", "requires": { "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { - "version": "0.5.0", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" + "version": "0.5.0" } } }, "rehype-raw": { "version": "6.1.1", - "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", "requires": { "@types/hast": "^2.0.0", "hast-util-raw": "^7.2.0", @@ -78974,16 +81760,13 @@ }, "dependencies": { "@types/parse5": { - "version": "6.0.3", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" + "version": "6.0.3" }, "comma-separated-tokens": { - "version": "2.0.3", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" + "version": "2.0.3" }, "hast-to-hyperscript": { "version": "10.0.1", - "integrity": "sha512-dhIVGoKCQVewFi+vz3Vt567E4ejMppS1haBRL6TEmeLeJVB1i/FJIIg/e6s1Bwn0g5qtYojHEKvyGA+OZuyifw==", "requires": { "@types/unist": "^2.0.0", "comma-separated-tokens": "^2.0.0", @@ -78996,7 +81779,6 @@ }, "hast-util-from-parse5": { "version": "7.1.0", - "integrity": "sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==", "requires": { "@types/hast": "^2.0.0", "@types/parse5": "^6.0.0", @@ -79010,14 +81792,12 @@ }, "hast-util-parse-selector": { "version": "3.1.0", - "integrity": "sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==", "requires": { "@types/hast": "^2.0.0" } }, "hast-util-raw": { "version": "7.2.2", - "integrity": "sha512-0x3BhhdlBcqRIKyc095lBSDvmQNMY3Eulj2PLsT5XCyKYrxssI5yr3P4Kv/PBo1s/DMkZy2voGkMXECnFCZRLQ==", "requires": { "@types/hast": "^2.0.0", "@types/parse5": "^6.0.0", @@ -79034,7 +81814,6 @@ }, "hast-util-to-parse5": { "version": "7.0.0", - "integrity": "sha512-YHiS6aTaZ3N0Q3nxaY/Tj98D6kM8QX5Q8xqgg8G45zR7PvWnPGPP0vcKCgb/moIydEJ/QWczVrX0JODCVeoV7A==", "requires": { "@types/hast": "^2.0.0", "@types/parse5": "^6.0.0", @@ -79046,7 +81825,6 @@ }, "hastscript": { "version": "7.1.0", - "integrity": "sha512-uBjaTTLN0MkCZxY/R2fWUOcu7FRtUVzKRO5P/RAfgsu3yFiMB1JWCO4AjeVkgHxAira1f2UecHK5WfS9QurlWA==", "requires": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^2.0.0", @@ -79056,41 +81834,33 @@ } }, "html-void-elements": { - "version": "2.0.1", - "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==" + "version": "2.0.1" }, "parse5": { - "version": "6.0.1", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "version": "6.0.1" }, "property-information": { - "version": "6.2.0", - "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==" + "version": "6.2.0" }, "space-separated-tokens": { - "version": "2.0.2", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" + "version": "2.0.2" }, "unist-util-position": { "version": "4.0.3", - "integrity": "sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==", "requires": { "@types/unist": "^2.0.0" } }, "web-namespaces": { - "version": "2.0.1", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" + "version": "2.0.1" }, "zwitch": { - "version": "2.0.4", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" + "version": "2.0.4" } } }, "rehype-sanitize": { "version": "5.0.1", - "integrity": "sha512-da/jIOjq8eYt/1r9GN6GwxIR3gde7OZ+WV8pheu1tL8K0D9KxM2AyMh+UEfke+FfdM3PvGHeYJU0Td5OWa7L5A==", "requires": { "@types/hast": "^2.0.0", "hast-util-sanitize": "^4.0.0", @@ -79098,12 +81868,10 @@ } }, "relateurl": { - "version": "0.2.7", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + "version": "0.2.7" }, "remark-external-links": { "version": "8.0.0", - "integrity": "sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==", "dev": true, "requires": { "extend": "^3.0.0", @@ -79115,12 +81883,10 @@ "dependencies": { "unist-util-is": { "version": "4.1.0", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", "dev": true }, "unist-util-visit": { "version": "2.0.3", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dev": true, "requires": { "@types/unist": "^2.0.0", @@ -79130,7 +81896,6 @@ }, "unist-util-visit-parents": { "version": "3.1.1", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", "dev": true, "requires": { "@types/unist": "^2.0.0", @@ -79140,12 +81905,10 @@ } }, "remark-footnotes": { - "version": "2.0.0", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" + "version": "2.0.0" }, "remark-mdx": { "version": "1.6.22", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", "requires": { "@babel/core": "7.12.9", "@babel/helper-plugin-utils": "7.10.4", @@ -79159,7 +81922,6 @@ "dependencies": { "@babel/core": { "version": "7.12.9", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", "requires": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.12.5", @@ -79180,42 +81942,34 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.10.4", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "version": "7.10.4" }, "@babel/plugin-syntax-jsx": { "version": "7.12.1", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "debug": { "version": "4.3.4", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "is-buffer": { - "version": "2.0.5", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + "version": "2.0.5" }, "is-plain-obj": { - "version": "2.1.0", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + "version": "2.1.0" }, "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3" }, "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.2" }, "parse-entities": { "version": "2.0.0", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "requires": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", @@ -79227,7 +81981,6 @@ }, "remark-parse": { "version": "8.0.3", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", "requires": { "ccount": "^1.0.0", "collapse-white-space": "^1.0.2", @@ -79249,7 +82002,6 @@ }, "unified": { "version": "9.2.0", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", "requires": { "bail": "^1.0.0", "extend": "^3.0.0", @@ -79260,26 +82012,22 @@ } }, "unist-util-is": { - "version": "4.1.0", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + "version": "4.1.0" }, "unist-util-remove-position": { "version": "2.0.1", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", "requires": { "unist-util-visit": "^2.0.0" } }, "unist-util-stringify-position": { "version": "2.0.3", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "requires": { "@types/unist": "^2.0.2" } }, "unist-util-visit": { "version": "2.0.3", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", @@ -79288,7 +82036,6 @@ }, "unist-util-visit-parents": { "version": "3.1.1", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" @@ -79296,7 +82043,6 @@ }, "vfile": { "version": "4.2.1", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", @@ -79305,12 +82051,10 @@ } }, "vfile-location": { - "version": "3.2.0", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + "version": "3.2.0" }, "vfile-message": { "version": "2.0.4", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", "requires": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^2.0.0" @@ -79320,7 +82064,6 @@ }, "remark-parse": { "version": "10.0.1", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", "requires": { "@types/mdast": "^3.0.0", "mdast-util-from-markdown": "^1.0.0", @@ -79329,7 +82072,6 @@ }, "remark-rehype": { "version": "10.1.0", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", "requires": { "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", @@ -79339,7 +82081,6 @@ "dependencies": { "mdast-util-definitions": { "version": "5.1.1", - "integrity": "sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==", "requires": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", @@ -79348,7 +82089,6 @@ }, "mdast-util-to-hast": { "version": "12.2.4", - "integrity": "sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg==", "requires": { "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", @@ -79363,18 +82103,15 @@ }, "unist-builder": { "version": "3.0.0", - "integrity": "sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==", "requires": { "@types/unist": "^2.0.0" } }, "unist-util-generated": { - "version": "2.0.0", - "integrity": "sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==" + "version": "2.0.0" }, "unist-util-position": { "version": "4.0.3", - "integrity": "sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==", "requires": { "@types/unist": "^2.0.0" } @@ -79383,7 +82120,6 @@ }, "remark-slug": { "version": "6.1.0", - "integrity": "sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==", "dev": true, "requires": { "github-slugger": "^1.0.0", @@ -79393,12 +82129,10 @@ "dependencies": { "unist-util-is": { "version": "4.1.0", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", "dev": true }, "unist-util-visit": { "version": "2.0.3", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dev": true, "requires": { "@types/unist": "^2.0.0", @@ -79408,7 +82142,6 @@ }, "unist-util-visit-parents": { "version": "3.1.1", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", "dev": true, "requires": { "@types/unist": "^2.0.0", @@ -79419,22 +82152,19 @@ }, "remark-squeeze-paragraphs": { "version": "4.0.0", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", "requires": { "mdast-squeeze-paragraphs": "^4.0.0" } }, "remove-accents": { - "version": "0.4.2", - "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + "version": "0.4.2" }, "remove-trailing-separator": { "version": "1.1.0", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + "devOptional": true }, "renderkid": { "version": "2.0.7", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "requires": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -79445,7 +82175,6 @@ "dependencies": { "css-select": { "version": "4.1.3", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "requires": { "boolbase": "^1.0.0", "css-what": "^5.0.0", @@ -79455,12 +82184,10 @@ } }, "css-what": { - "version": "5.0.1", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" + "version": "5.1.0" }, "dom-serializer": { "version": "1.3.2", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -79468,19 +82195,16 @@ } }, "domelementtype": { - "version": "2.2.0", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + "version": "2.2.0" }, "domhandler": { "version": "4.2.2", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", "requires": { "domelementtype": "^2.2.0" } }, "domutils": { "version": "2.8.0", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -79488,12 +82212,10 @@ } }, "entities": { - "version": "2.2.0", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "version": "2.2.0" }, "htmlparser2": { "version": "6.1.0", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -79503,7 +82225,6 @@ }, "nth-check": { "version": "2.0.0", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", "requires": { "boolbase": "^1.0.0" } @@ -79511,20 +82232,13 @@ } }, "repeat-element": { - "version": "1.1.3", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "version": "1.1.3" }, "repeat-string": { - "version": "1.6.1", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" - }, - "replace-ext": { - "version": "1.0.0", - "integrity": "sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==" + "version": "1.6.1" }, "request": { "version": "2.88.2", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -79551,7 +82265,6 @@ }, "request-promise-core": { "version": "1.1.3", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "dev": true, "requires": { "lodash": "^4.17.15" @@ -79559,7 +82272,6 @@ }, "request-promise-native": { "version": "1.0.8", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", "dev": true, "requires": { "request-promise-core": "1.1.3", @@ -79568,43 +82280,34 @@ } }, "require-directory": { - "version": "2.1.1", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + "version": "2.1.1" }, "require-from-string": { "version": "2.0.2", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "require-main-filename": { - "version": "2.0.0", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "version": "2.0.0" }, "require-package-name": { - "version": "2.0.1", - "integrity": "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==" + "version": "2.0.1" }, "requireindex": { "version": "1.2.0", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", "dev": true }, "requires-port": { "version": "1.0.0", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "reselect": { - "version": "4.0.0", - "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" + "version": "4.0.0" }, "resize-observer-polyfill": { - "version": "1.5.1", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + "version": "1.5.1" }, "resolve": { "version": "1.20.0", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -79612,7 +82315,6 @@ }, "resolve-cwd": { "version": "3.0.0", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { "resolve-from": "^5.0.0" @@ -79620,74 +82322,61 @@ "dependencies": { "resolve-from": { "version": "5.0.0", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, "resolve-from": { - "version": "4.0.0", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "version": "4.0.0" }, "resolve-pathname": { - "version": "3.0.0", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + "version": "3.0.0" }, "resolve-protobuf-schema": { "version": "2.1.0", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", "requires": { "protocol-buffers-schema": "^3.3.1" } }, "resolve-url": { - "version": "0.2.1", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==" + "version": "0.2.1" }, "restore-cursor": { "version": "3.1.0", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "devOptional": true, + "dev": true, "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "ret": { - "version": "0.1.15", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "version": "0.1.15" }, "retry": { "version": "0.13.1", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true }, "reusify": { - "version": "1.0.4", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "version": "1.0.4" }, "rimraf": { "version": "3.0.2", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { "glob": "^7.1.3" } }, "ripemd160": { "version": "2.0.2", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, "rison": { - "version": "0.1.1", - "integrity": "sha512-8C+/PKKTaAYE2quDtOUwny/eQpNn9YGby7T80wntbVWSGvw0aUT9M0YgLdLkUgIQzQwaB1ZTr80rwLVKyohHig==" + "version": "0.1.1" }, "rst-selector-parser": { "version": "2.2.3", - "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==", "dev": true, "requires": { "lodash.flattendeep": "^4.4.0", @@ -79696,61 +82385,58 @@ }, "rsvp": { "version": "4.8.5", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, "run-async": { - "version": "2.4.1", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + "version": "2.4.1" }, "run-parallel": { - "version": "1.1.9", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + "version": "1.1.9" }, "run-queue": { "version": "1.0.3", - "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", "requires": { "aproba": "^1.1.1" } }, "rw": { - "version": "1.3.3", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "version": "1.3.3" }, "rxjs": { "version": "6.6.7", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "devOptional": true, + "dev": true, "requires": { "tslib": "^1.9.0" } }, "sade": { "version": "1.8.1", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "requires": { "mri": "^1.1.0" } }, "safe-buffer": { - "version": "5.1.2", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.1.2" }, "safe-regex": { "version": "1.1.0", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", "requires": { "ret": "~0.1.10" } }, + "safe-regex-test": { + "version": "1.0.0", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safer-buffer": { - "version": "2.1.2", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "version": "2.1.2" }, "sane": { "version": "4.1.0", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "dev": true, "requires": { "@cnakazawa/watch": "^1.0.3", @@ -79766,12 +82452,10 @@ }, "sax": { "version": "1.2.4", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "saxes": { "version": "5.0.1", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, "requires": { "xmlchars": "^2.2.0" @@ -79779,7 +82463,6 @@ }, "scheduler": { "version": "0.15.0", - "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==", "dev": true, "requires": { "loose-envify": "^1.1.0", @@ -79788,7 +82471,6 @@ }, "schema-utils": { "version": "3.1.1", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -79797,35 +82479,29 @@ }, "scroll-into-view-if-needed": { "version": "2.2.28", - "integrity": "sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w==", "requires": { "compute-scroll-into-view": "^1.0.17" } }, "seedrandom": { - "version": "3.0.5", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + "version": "3.0.5" }, "select-hose": { "version": "2.0.0", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, "selfsigned": { - "version": "1.10.11", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "version": "2.0.1", "dev": true, "requires": { - "node-forge": "^0.10.0" + "node-forge": "^1" } }, "semver": { - "version": "5.6.0", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "version": "5.7.1" }, "send": { - "version": "0.17.1", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -79834,57 +82510,46 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" }, "dependencies": { "http-errors": { - "version": "1.7.3", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "1.8.1", "requires": { "depd": "~1.1.2", "inherits": "2.0.4", - "setprototypeof": "1.1.1", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" } }, "inherits": { - "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "version": "2.0.4" }, "ms": { - "version": "2.1.1", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3" }, "setprototypeof": { - "version": "1.1.1", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "statuses": { - "version": "1.5.0", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + "version": "1.2.0" } } }, "serialize-javascript": { "version": "4.0.0", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "requires": { "randombytes": "^2.1.0" } }, "serialize-query-params": { - "version": "1.2.4", - "integrity": "sha512-m4hGkOY5y+ksPDSEkw12cNxt3HRUJv5G6oF9/4yq+GCw4LznudxC73qnz++VTHqXa0j1x1/iaBIpoiMBxr6w2w==" + "version": "1.2.4" }, "serve-favicon": { "version": "2.5.0", - "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", "requires": { "etag": "~1.8.1", "fresh": "0.5.2", @@ -79894,18 +82559,15 @@ }, "dependencies": { "ms": { - "version": "2.1.1", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.1" }, "safe-buffer": { - "version": "5.1.1", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "version": "5.1.1" } } }, "serve-index": { "version": "1.9.1", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "requires": { "accepts": "~1.3.4", @@ -79918,36 +82580,19 @@ } }, "serve-static": { - "version": "1.14.1", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "dependencies": { - "parseurl": { - "version": "1.3.3", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - } + "send": "0.17.2" } }, "set-blocking": { - "version": "2.0.0", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "set-getter": { - "version": "0.1.1", - "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", - "optional": true, - "requires": { - "to-object-path": "^0.3.0" - } + "version": "2.0.0" }, "set-value": { "version": "2.0.1", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -79956,17 +82601,14 @@ } }, "setimmediate": { - "version": "1.0.5", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "version": "1.0.5" }, "setprototypeof": { "version": "1.1.0", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, "sha.js": { "version": "2.4.11", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -79974,28 +82616,23 @@ }, "shallow-clone": { "version": "3.0.1", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "requires": { "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { - "version": "6.0.3", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "version": "6.0.3" } } }, "shallow-copy": { - "version": "0.0.1", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + "version": "0.0.1" }, "shallowequal": { - "version": "1.1.0", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + "version": "1.1.0" }, "shapefile": { "version": "0.3.1", - "integrity": "sha512-BZoPvnq4ULce0pyKiZUU4D8CdPl0Z1fpE73AeCkwyMbD2hpUeVA0s7jIE/wX8uWNruVeJV6e+rznPHBwuH5J6g==", "requires": { "d3-queue": "1", "iconv-lite": "0.2", @@ -80003,44 +82640,26 @@ }, "dependencies": { "d3-queue": { - "version": "1.2.3", - "integrity": "sha512-m6KtxX4V5pmVf1PqhH4SkQVMshSJfyCLM2vf2oFPi9FWFVT3+rtbCGerk766b/JXymHQDU3oqXHaZoiQ/e8yUQ==" + "version": "1.2.3" }, "iconv-lite": { - "version": "0.2.11", - "integrity": "sha512-KhmFWgaQZY83Cbhi+ADInoUQ8Etn6BG5fikM9syeOjQltvR45h7cRKJ/9uvQEuD61I3Uju77yYce0/LhKVClQw==" - } - } - }, - "sharkdown": { - "version": "0.1.1", - "integrity": "sha512-exwooSpmo5s45lrexgz6Q0rFQM574wYIX3iDZ7RLLqOb7IAoQZu9nxlZODU972g19sR69OIpKP2cpHTzU+PHIg==", - "requires": { - "cardinal": "~0.4.2", - "minimist": "0.0.5", - "split": "~0.2.10" - }, - "dependencies": { - "minimist": { - "version": "0.0.5", - "integrity": "sha512-rSJ0cdmCj3qmKdObcnMcWgPVOyaOWlazLhZAJW0s6G6lx1ZEuFkraWmEH5LTvX90btkfHPclQBjvjU7A/kYRFg==" + "version": "0.2.11" } } }, "shebang-command": { "version": "1.2.0", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + "dev": true }, "shelljs": { "version": "0.8.5", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "requires": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -80048,27 +82667,23 @@ }, "dependencies": { "interpret": { - "version": "1.4.0", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + "version": "1.4.0" } } }, "shellwords": { "version": "0.1.1", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true, "optional": true }, "shortid": { "version": "2.2.14", - "integrity": "sha512-4UnZgr9gDdA1kaKj/38IiudfC3KHKhDc1zi/HSxd9FQDR0VLwH3/y79tZJLsVYPsJgIjeHjqIWaWVRJUj9qZOQ==", "requires": { "nanoid": "^2.0.0" } }, "side-channel": { "version": "1.0.4", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -80076,22 +82691,29 @@ }, "dependencies": { "object-inspect": { - "version": "1.11.0", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + "version": "1.11.0" } } }, "sigmund": { - "version": "1.0.1", - "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" + "version": "1.0.1" }, "signal-exit": { - "version": "3.0.3", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.7" + }, + "simple-swizzle": { + "version": "0.2.2", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2" + } + } }, "sinon": { "version": "9.0.2", - "integrity": "sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.2", @@ -80105,7 +82727,6 @@ }, "sirv": { "version": "1.0.17", - "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", "dev": true, "requires": { "@polka/url": "^1.0.0-next.20", @@ -80115,22 +82736,18 @@ "dependencies": { "mime": { "version": "2.5.2", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true } } }, "sisteransi": { - "version": "1.0.5", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "version": "1.0.5" }, "slash": { - "version": "2.0.0", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + "version": "2.0.0" }, "slice-ansi": { "version": "4.0.0", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -80140,24 +82757,16 @@ "dependencies": { "is-fullwidth-code-point": { "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true } } }, - "slide": { - "version": "1.1.6", - "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", - "dev": true - }, "smart-buffer": { "version": "4.2.0", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true }, "snapdragon": { "version": "0.8.2", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -80171,7 +82780,6 @@ "dependencies": { "define-property": { "version": "0.2.5", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "requires": { "is-descriptor": "^0.1.0" } @@ -80180,7 +82788,6 @@ }, "snapdragon-node": { "version": "2.1.1", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -80189,28 +82796,24 @@ "dependencies": { "define-property": { "version": "1.0.0", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "requires": { "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -80218,21 +82821,18 @@ } }, "kind-of": { - "version": "6.0.2", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.2" } } }, "snapdragon-util": { "version": "3.0.1", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { "version": "3.2.2", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "requires": { "is-buffer": "^1.1.5" } @@ -80240,37 +82840,45 @@ } }, "sockjs": { - "version": "0.3.21", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", "dev": true, "requires": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "dev": true + } } }, "socks": { - "version": "2.6.1", - "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", + "version": "2.7.1", "dev": true, "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "dependencies": { + "ip": { + "version": "2.0.0", + "dev": true + } } }, "socks-proxy-agent": { - "version": "5.0.1", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "version": "7.0.0", "dev": true, "requires": { "agent-base": "^6.0.2", - "debug": "4", - "socks": "^2.3.3" + "debug": "^4.3.3", + "socks": "^2.6.2" }, "dependencies": { "debug": { - "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", "dev": true, "requires": { "ms": "2.1.2" @@ -80278,34 +82886,27 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "sort-keys": { "version": "4.2.0", - "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", - "dev": true, "requires": { "is-plain-obj": "^2.0.0" }, "dependencies": { "is-plain-obj": { - "version": "2.1.0", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true + "version": "2.1.0" } } }, "sort-object-keys": { "version": "1.1.3", - "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", "dev": true }, "sort-package-json": { "version": "1.53.1", - "integrity": "sha512-ltLORrQuuPMpy23YkWCA8fO7zBOxM4P1j9LcGxci4K2Fk8jmSyCA/ATU6CFyy8qR2HQRx4RBYWzoi78FU/Anuw==", "dev": true, "requires": { "detect-indent": "^6.0.0", @@ -80318,7 +82919,6 @@ "dependencies": { "globby": { "version": "10.0.0", - "integrity": "sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==", "dev": true, "requires": { "@types/glob": "^7.1.1", @@ -80333,37 +82933,30 @@ }, "ignore": { "version": "5.1.9", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", "dev": true }, "is-plain-obj": { "version": "2.1.0", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, "slash": { "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true } } }, "source-list-map": { - "version": "2.0.1", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + "version": "2.0.1" }, "source-map": { - "version": "0.5.7", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + "version": "0.5.7" }, "source-map-js": { "version": "0.6.2", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", "dev": true }, "source-map-resolve": { "version": "0.5.2", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", @@ -80374,56 +82967,47 @@ }, "source-map-support": { "version": "0.5.20", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" }, "dependencies": { "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "source-map-url": { - "version": "0.4.0", - "integrity": "sha512-liJwHPI9x9d9w5WSIjM58MqGmmb7XzNqwdUA3kSBQ4lmDngexlKwawGzK3J1mKXi6+sysoMDlpVyZh9sv5vRfw==" + "version": "0.4.0" }, "space-separated-tokens": { "version": "1.1.2", - "integrity": "sha512-G3jprCEw+xFEs0ORweLmblJ3XLymGGr6hxZYTYZjIlvDti9vOBUjRQa1Rzjt012aRrocKstHwdNi+F7HguPsEA==", "requires": { "trim": "0.0.1" } }, "spdx-correct": { "version": "3.1.0", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.2.0", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + "version": "2.2.0" }, "spdx-expression-parse": { "version": "3.0.0", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { - "version": "3.0.2", - "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==" + "version": "3.0.2" }, "spdy": { "version": "4.0.2", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -80435,7 +83019,6 @@ "dependencies": { "debug": { "version": "4.1.1", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -80443,14 +83026,12 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "spdy-transport": { "version": "3.0.0", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "requires": { "debug": "^4.1.0", @@ -80463,7 +83044,6 @@ "dependencies": { "debug": { "version": "4.1.1", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -80471,12 +83051,10 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -80488,12 +83066,10 @@ }, "specificity": { "version": "0.4.1", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", "dev": true }, "speed-measure-webpack-plugin": { "version": "1.5.0", - "integrity": "sha512-Re0wX5CtM6gW7bZA64ONOfEPEhwbiSF/vz6e2GvadjuaPrQcHTQdRGsD8+BE7iUOysXH8tIenkPCQBEcspXsNg==", "dev": true, "requires": { "chalk": "^4.1.0" @@ -80501,30 +83077,26 @@ }, "speedometer": { "version": "1.0.0", - "integrity": "sha512-lgxErLl/7A5+vgIIXsh9MbeukOaCb2axgQ+bKCdIE+ibNT4XNYGNCR1qFEGq6F+YDASXK3Fh/c5FgtZchFolxw==", "dev": true }, "split": { - "version": "0.2.10", - "integrity": "sha512-e0pKq+UUH2Xq/sXbYpZBZc3BawsfDZ7dgv+JtRTUPNcvF5CMR4Y9cvJqkMY0MoxWzTHvZuz1beg6pNEKlszPiQ==", + "version": "1.0.1", + "dev": true, "requires": { "through": "2" } }, "split-on-first": { - "version": "1.1.0", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + "version": "1.1.0" }, "split-string": { "version": "3.1.0", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "requires": { "extend-shallow": "^3.0.0" }, "dependencies": { "extend-shallow": { "version": "3.0.2", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -80532,7 +83104,6 @@ }, "is-extendable": { "version": "1.0.1", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } @@ -80541,7 +83112,6 @@ }, "split2": { "version": "3.2.2", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, "requires": { "readable-stream": "^3.0.0" @@ -80549,7 +83119,6 @@ "dependencies": { "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -80560,12 +83129,10 @@ } }, "sprintf-js": { - "version": "1.0.3", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "version": "1.0.3" }, "sshpk": { "version": "1.15.2", - "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -80581,23 +83148,15 @@ }, "ssri": { "version": "6.0.2", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "requires": { "figgy-pudding": "^3.5.1" } }, "stable": { - "version": "0.1.8", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "stack-trace": { - "version": "0.0.10", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dev": true + "version": "0.1.8" }, "stack-utils": { "version": "2.0.3", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -80605,29 +83164,24 @@ "dependencies": { "escape-string-regexp": { "version": "2.0.0", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true } } }, "stackframe": { - "version": "1.2.1", - "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" + "version": "1.2.1" }, "state-toggle": { - "version": "1.0.3", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" + "version": "1.0.3" }, "static-eval": { "version": "2.1.0", - "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", "requires": { "escodegen": "^1.11.1" }, "dependencies": { "escodegen": { "version": "1.14.3", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "requires": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -80637,19 +83191,16 @@ } }, "esprima": { - "version": "4.0.1", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "version": "4.0.1" }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "optional": true } } }, "static-extend": { "version": "0.1.2", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -80657,7 +83208,6 @@ "dependencies": { "define-property": { "version": "0.2.5", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "requires": { "is-descriptor": "^0.1.0" } @@ -80666,7 +83216,6 @@ }, "static-module": { "version": "2.2.5", - "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", "requires": { "concat-stream": "~1.6.0", "convert-source-map": "^1.5.1", @@ -80685,22 +83234,17 @@ } }, "statuses": { - "version": "1.4.0", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "version": "1.5.0" }, "stealthy-require": { "version": "1.1.1", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", "dev": true }, "store2": { - "version": "2.12.0", - "integrity": "sha512-7t+/wpKLanLzSnQPX8WAcuLCCeuSHoWdQuh9SB3xD0kNOM38DNf+0Oa+wmvxmYueRzkmh6IcdKFtvTa+ecgPDw==" + "version": "2.12.0" }, "storybook-addon-jsx": { "version": "7.3.14", - "integrity": "sha512-ierjcn0nxjjOuNcnLkorXQnfXlYmyQxFXvmWV88T9V8VAnsWd4yclTtSOV/gPtB83FefmyO/8dm1qQBG0f+2pA==", "requires": { "copy-to-clipboard": "^3.0.8", "js-beautify": "^1.8.8", @@ -80710,7 +83254,6 @@ }, "storybook-addon-paddings": { "version": "4.3.0", - "integrity": "sha512-AgIhxVBMbBInjxwBOb4MhbMjE61HOB9aS63lF1Ycd+wA6u1BBkVlMUGrwLeT+yZNf/Fmz1lxJ6gvKdaB5qHw1A==", "dev": true, "requires": { "@storybook/addons": "^6.2.0", @@ -80722,12 +83265,10 @@ } }, "storybook-pretty-props": { - "version": "1.2.1", - "integrity": "sha512-3dUtu0UbBA6idA3Qo0i+CYGGz8GiqlXzhgCJdT065jnuJ3y9intKxZpv05ZbnQXCPnsPVSDos+hgOZ444hf6xA==" + "version": "1.2.1" }, "stream-browserify": { "version": "2.0.2", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" @@ -80735,7 +83276,6 @@ }, "stream-each": { "version": "1.2.3", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "requires": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -80743,7 +83283,6 @@ }, "stream-http": { "version": "2.8.3", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -80753,36 +83292,29 @@ } }, "stream-shift": { - "version": "1.0.1", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + "version": "1.0.1" }, "strict-uri-encode": { - "version": "2.0.0", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==" + "version": "2.0.0" }, "string_decoder": { "version": "1.1.1", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" } }, "string-argv": { "version": "0.3.1", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, "string-convert": { - "version": "0.2.1", - "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + "version": "0.2.1" }, "string-hash": { - "version": "1.1.3", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==" + "version": "1.1.3" }, "string-length": { "version": "4.0.1", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", "dev": true, "requires": { "char-regex": "^1.0.2", @@ -80791,12 +83323,10 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "strip-ansi": { "version": "6.0.0", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { "ansi-regex": "^5.0.0" @@ -80804,25 +83334,18 @@ } } }, - "string-template": { - "version": "0.2.1", - "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==" - }, "string-width": { "version": "2.1.1", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "integrity": "sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==" + "version": "3.0.0" }, "strip-ansi": { "version": "4.0.0", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "requires": { "ansi-regex": "^3.0.0" } @@ -80831,7 +83354,6 @@ }, "string.prototype.matchall": { "version": "4.0.2", - "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0", @@ -80843,7 +83365,6 @@ }, "string.prototype.padend": { "version": "3.1.3", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -80852,7 +83373,6 @@ }, "string.prototype.padstart": { "version": "3.1.3", - "integrity": "sha512-NZydyOMtYxpTjGqp0VN5PYUF/tsU15yDMZnUdj16qRUIUiMJkHHSDElYyQFrMu+/WloTpA7MQSiADhBicDfaoA==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -80860,107 +83380,69 @@ } }, "string.prototype.trim": { - "version": "1.2.0", - "integrity": "sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==", + "version": "1.2.7", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.13.0", - "function-bind": "^1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "string.prototype.trimend": { - "version": "1.0.4", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.6", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.4", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.6", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "strip-ansi": { "version": "3.0.1", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "requires": { "ansi-regex": "^2.0.0" } }, "strip-bom": { "version": "3.0.0", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, - "strip-bom-buf": { - "version": "1.0.0", - "integrity": "sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==", - "optional": true, - "requires": { - "is-utf8": "^0.2.1" - } - }, - "strip-bom-stream": { - "version": "2.0.0", - "integrity": "sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==", - "optional": true, - "requires": { - "first-chunk-stream": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "optional": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, "strip-comments": { "version": "2.0.1", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", "dev": true }, "strip-eof": { "version": "1.0.0", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true }, "strip-final-newline": { - "version": "2.0.0", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "devOptional": true + "version": "2.0.0" }, "strip-indent": { "version": "3.0.0", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "requires": { "min-indent": "^1.0.0" } }, "strip-json-comments": { "version": "3.1.1", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "strip-outer": { "version": "1.0.1", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "requires": { "escape-string-regexp": "^1.0.2" } }, "strong-log-transformer": { "version": "2.1.0", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", "dev": true, "requires": { "duplexer": "^0.1.1", @@ -80970,49 +83452,41 @@ }, "style-loader": { "version": "3.2.1", - "integrity": "sha512-1k9ZosJCRFaRbY6hH49JFlRB0fVSbmnyq1iTPjNxUmGVjBNEmwrrHPenhlp+Lgo51BojHSf6pl2FcqYaN3PfVg==", "dev": true }, "style-to-object": { "version": "0.3.0", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", "requires": { "inline-style-parser": "0.1.1" } }, "stylis": { - "version": "4.0.9", - "integrity": "sha512-ci7pEFNVW3YJiWEzqPOMsAjY6kgraZ3ZgBfQ5HYbNtLJEsQ0G46ejWZpfSSCp/FaSiCSGGhzL9O2lN+2cB6ong==" + "version": "4.0.9" }, "supercluster": { "version": "4.1.1", - "integrity": "sha512-sF0FfUOPFp96DKzwWFLeQOEqqKu2PpcesxAFeFsknA/q7g7igVVn/p3NI2XHEghNSyDAqunKNKqAbqNO8+7NDQ==", "requires": { "kdbush": "^2.0.1" }, "dependencies": { "kdbush": { - "version": "2.0.1", - "integrity": "sha512-9KqSdmWCkBIisFIGclT0FRagKhI7IVbMyUjsxCFG0Ly1Dg6whlxJ7b9lrq8ifk3X/fGeJzok1R75LQfZTfA5zQ==" + "version": "2.0.1" } } }, "supports-color": { "version": "7.2.0", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" }, "dependencies": { "has-flag": { - "version": "4.0.0", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" } } }, "supports-hyperlinks": { "version": "2.1.0", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", "dev": true, "requires": { "has-flag": "^4.0.0", @@ -81021,19 +83495,16 @@ "dependencies": { "has-flag": { "version": "4.0.0", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true } } }, "svg-parser": { "version": "2.0.4", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", "dev": true }, "svgo": { "version": "1.3.2", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -81053,7 +83524,6 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -81061,7 +83531,6 @@ }, "chalk": { "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -81071,7 +83540,6 @@ }, "css-select": { "version": "2.1.0", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "requires": { "boolbase": "^1.0.0", @@ -81081,13 +83549,11 @@ } }, "css-what": { - "version": "3.2.1", - "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", + "version": "3.4.2", "dev": true }, "domutils": { "version": "1.7.0", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { "dom-serializer": "0", @@ -81096,7 +83562,6 @@ }, "supports-color": { "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -81105,17 +83570,14 @@ } }, "symbol-observable": { - "version": "1.2.0", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + "version": "1.2.0" }, "symbol-tree": { "version": "3.2.4", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, "symbol.prototype.description": { "version": "1.0.5", - "integrity": "sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ==", "requires": { "call-bind": "^1.0.2", "get-symbol-description": "^1.0.0", @@ -81124,12 +83586,10 @@ } }, "synchronous-promise": { - "version": "2.0.15", - "integrity": "sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==" + "version": "2.0.15" }, "table": { "version": "6.7.3", - "integrity": "sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==", "dev": true, "requires": { "ajv": "^8.0.1", @@ -81141,7 +83601,6 @@ "dependencies": { "ajv": { "version": "8.8.0", - "integrity": "sha512-L+cJ/+pkdICMueKR6wIx3VP2fjIx3yAhuvadUv/osv9yFD7OVZy442xFF+Oeu3ZvmhBGQzoF6mTSt+LUWBmGQg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -81152,22 +83611,18 @@ }, "ansi-regex": { "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "json-schema-traverse": { "version": "1.0.0", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -81177,7 +83632,6 @@ }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -81187,7 +83641,6 @@ }, "table-layout": { "version": "1.0.2", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "requires": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", @@ -81196,30 +83649,25 @@ }, "dependencies": { "array-back": { - "version": "4.0.2", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" + "version": "4.0.2" }, "typical": { - "version": "5.2.0", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" + "version": "5.2.0" } } }, "taketalk": { "version": "1.0.0", - "integrity": "sha512-kS7E53It6HA8S1FVFBWP7HDwgTiJtkmYk7TsowGlizzVrivR1Mf9mgjXHY1k7rOfozRVMZSfwjB3bevO4QEqpg==", "requires": { "get-stdin": "^4.0.1", "minimist": "^1.1.0" } }, "tapable": { - "version": "1.1.3", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + "version": "1.1.3" }, "tar": { "version": "6.1.11", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -81230,22 +83678,18 @@ }, "dependencies": { "chownr": { - "version": "2.0.0", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + "version": "2.0.0" }, "mkdirp": { - "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "version": "1.0.4" }, "yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "4.0.0" } } }, "tar-fs": { "version": "2.0.0", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", "dev": true, "requires": { "chownr": "^1.1.1", @@ -81256,7 +83700,6 @@ }, "tar-stream": { "version": "2.2.0", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "requires": { "bl": "^4.0.3", @@ -81268,7 +83711,6 @@ "dependencies": { "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -81280,7 +83722,6 @@ }, "telejson": { "version": "5.3.3", - "integrity": "sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA==", "requires": { "@types/is-function": "^1.0.0", "global": "^4.4.0", @@ -81293,56 +83734,20 @@ }, "dependencies": { "isobject": { - "version": "4.0.0", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==" + "version": "4.0.0" } } }, "temp-dir": { "version": "1.0.0", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", "dev": true }, - "temp-write": { - "version": "4.0.0", - "integrity": "sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "is-stream": "^2.0.0", - "make-dir": "^3.0.0", - "temp-dir": "^1.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "is-stream": { - "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, "term-size": { "version": "2.2.1", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "dev": true }, "terminal-link": { "version": "2.1.1", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -81350,8 +83755,7 @@ } }, "terser": { - "version": "4.6.3", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "version": "4.8.1", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -81359,14 +83763,12 @@ }, "dependencies": { "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "terser-webpack-plugin": { "version": "4.2.3", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", "requires": { "cacache": "^15.0.5", "find-cache-dir": "^3.3.1", @@ -81381,7 +83783,6 @@ "dependencies": { "cacache": { "version": "15.3.0", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "requires": { "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", @@ -81404,12 +83805,10 @@ } }, "chownr": { - "version": "2.0.0", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + "version": "2.0.0" }, "find-cache-dir": { "version": "3.3.2", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -81418,7 +83817,6 @@ }, "find-up": { "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -81426,46 +83824,39 @@ }, "locate-path": { "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "make-dir": { "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { "semver": "^6.0.0" } }, "mkdirp": { - "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "version": "1.0.4" }, "p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { "yocto-queue": "^0.1.0" } }, "p-locate": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" }, "dependencies": { "p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } @@ -81473,87 +83864,58 @@ } }, "p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "2.2.0" }, "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" }, "pkg-dir": { "version": "4.2.0", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { "find-up": "^4.0.0" } }, "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.0" }, "serialize-javascript": { "version": "5.0.1", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "requires": { "randombytes": "^2.1.0" } }, "source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" }, "ssri": { "version": "8.0.1", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "requires": { "minipass": "^3.1.1" } }, "terser": { - "version": "5.13.1", - "integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==", + "version": "5.14.2", "requires": { + "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" - }, - "dependencies": { - "source-map": { - "version": "0.8.0-beta.0", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "requires": { - "whatwg-url": "^7.0.0" - } - } } }, "webpack-sources": { "version": "1.4.3", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" } }, - "whatwg-url": { - "version": "7.1.0", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, "yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "4.0.0" } } }, "test-exclude": { "version": "6.0.0", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -81561,26 +83923,21 @@ } }, "text-encoding-utf-8": { - "version": "1.0.2", - "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" + "version": "1.0.2" }, "text-extensions": { "version": "1.9.0", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true }, "text-table": { - "version": "0.2.0", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "version": "0.2.0" }, "textextensions": { "version": "5.14.0", - "integrity": "sha512-4cAYwNFNYlIAHBUo7p6zw8POUvWbZor+/R0Tanv+rIhsauEyV9QSrEXL40pI+GfTQxKX8k6Tyw6CmdSDSmASrg==", "dev": true }, "thread-loader": { "version": "3.0.4", - "integrity": "sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==", "dev": true, "requires": { "json-parse-better-errors": "^1.0.2", @@ -81591,16 +83948,11 @@ }, "dependencies": { "json5": { - "version": "2.2.0", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "dev": true }, "loader-utils": { - "version": "2.0.0", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.4", "dev": true, "requires": { "big.js": "^5.2.2", @@ -81612,20 +83964,17 @@ }, "throat": { "version": "5.0.0", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, "throttle-debounce": { - "version": "3.0.1", - "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==" + "version": "3.0.1" }, "through": { "version": "2.3.8", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "dev": true }, "through2": { "version": "2.0.5", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -81633,44 +83982,32 @@ }, "thunky": { "version": "1.1.0", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "timed-out": { - "version": "4.0.1", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==" - }, "timers-browserify": { "version": "2.0.12", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "requires": { "setimmediate": "^1.0.4" } }, "timsort": { "version": "0.3.0", - "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", "dev": true }, "tiny-invariant": { - "version": "1.1.0", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + "version": "1.1.0" }, "tiny-warning": { - "version": "1.0.3", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + "version": "1.0.3" }, "tinycolor2": { - "version": "1.4.2", - "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" + "version": "1.4.2" }, "tinyqueue": { - "version": "2.0.3", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + "version": "2.0.3" }, "tmp": { "version": "0.2.1", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { "rimraf": "^3.0.0" @@ -81678,7 +84015,6 @@ }, "tmp-promise": { "version": "3.0.2", - "integrity": "sha512-OyCLAKU1HzBjL6Ev3gxUeraJNlbNingmi8IrHHEsYH8LTmEuhvYfqvhn2F/je+mjf4N58UmZ96OMEy1JanSCpA==", "dev": true, "requires": { "tmp": "^0.2.0" @@ -81686,27 +84022,22 @@ }, "tmpl": { "version": "1.0.5", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-arraybuffer": { - "version": "1.0.1", - "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" + "version": "1.0.1" }, "to-fast-properties": { - "version": "2.0.0", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + "version": "2.0.0" }, "to-object-path": { "version": "0.3.0", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "requires": { "is-buffer": "^1.1.5" } @@ -81715,7 +84046,6 @@ }, "to-regex": { "version": "3.0.2", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -81725,7 +84055,6 @@ "dependencies": { "extend-shallow": { "version": "3.0.2", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -81733,7 +84062,6 @@ }, "is-extendable": { "version": "1.0.1", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { "is-plain-object": "^2.0.4" } @@ -81742,23 +84070,19 @@ }, "to-regex-range": { "version": "2.1.1", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } }, "toggle-selection": { - "version": "1.0.6", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + "version": "1.0.6" }, "toidentifier": { - "version": "1.0.0", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1" }, "topojson": { "version": "1.6.27", - "integrity": "sha512-JLFtrhClUH/k/yvsiCXqcWcXaOfO3DgFvHnYb+gS2xlDbjbvkKh6YB1CPilmEV++tH33xw6wCxoYA5g6YLZw/Q==", "requires": { "d3": "3", "d3-geo-projection": "0.2", @@ -81770,12 +84094,10 @@ }, "totalist": { "version": "1.1.0", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", "dev": true }, "tough-cookie": { "version": "2.5.0", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { "psl": "^1.1.28", @@ -81784,67 +84106,55 @@ }, "tr46": { "version": "1.0.1", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, "requires": { "punycode": "^2.1.0" } }, "transform-loader": { "version": "0.2.4", - "integrity": "sha512-zdeb90cBkXoAwGvMRMYqS8lNNdZ9dYnEKxtXCi0ZmQ8OL1XF1b4BvuqjcVcm8ZJRsXSQCrSnGgd5gfaKTlGpcw==", "dev": true, "requires": { "loader-utils": "^1.0.2" } }, "traverse": { - "version": "0.6.6", - "integrity": "sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==" + "version": "0.6.6" }, "tree-kill": { "version": "1.2.2", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, "trim": { - "version": "0.0.1", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + "version": "0.0.1" }, "trim-lines": { - "version": "3.0.1", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" + "version": "3.0.1" }, "trim-newlines": { "version": "3.0.1", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, "trim-repeated": { "version": "1.0.0", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", "requires": { "escape-string-regexp": "^1.0.2" } }, "trim-trailing-lines": { - "version": "1.1.3", - "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==" + "version": "1.1.3" }, "trough": { - "version": "1.0.5", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + "version": "1.0.5" }, "ts-dedent": { - "version": "2.2.0", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==" + "version": "2.2.0" }, "ts-essentials": { - "version": "2.0.12", - "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==" + "version": "2.0.12" }, "ts-loader": { "version": "9.2.5", - "integrity": "sha512-al/ATFEffybdRMUIr5zMEWQdVnCGMUA9d3fXJ8dBVvBlzytPvIszoG9kZoR+94k6/i293RnVOXwMaWbXhNy9pQ==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -81855,7 +84165,6 @@ "dependencies": { "braces": { "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -81863,7 +84172,6 @@ }, "enhanced-resolve": { "version": "5.8.2", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -81872,7 +84180,6 @@ }, "fill-range": { "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -81880,12 +84187,10 @@ }, "is-number": { "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -81893,7 +84198,6 @@ }, "micromatch": { "version": "4.0.2", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -81902,7 +84206,6 @@ }, "semver": { "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -81910,12 +84213,10 @@ }, "tapable": { "version": "2.2.1", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, "to-regex-range": { "version": "5.0.1", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -81923,18 +84224,15 @@ }, "yallist": { "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "ts-pnp": { - "version": "1.2.0", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + "version": "1.2.0" }, "tsconfig-paths": { "version": "3.11.0", - "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", "dev": true, "requires": { "@types/json5": "^0.0.29", @@ -81944,29 +84242,24 @@ } }, "tslib": { - "version": "1.11.1", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + "version": "1.11.1" }, "tsutils": { "version": "3.21.0", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" } }, "tty-browserify": { - "version": "0.0.0", - "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==" + "version": "0.0.0" }, "tunnel": { "version": "0.0.6", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", "dev": true }, "tunnel-agent": { "version": "0.6.0", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -81974,40 +84267,41 @@ }, "tweetnacl": { "version": "0.14.5", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "type-check": { "version": "0.3.2", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "requires": { "prelude-ls": "~1.1.2" } }, "type-detect": { "version": "4.0.8", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "type-fest": { - "version": "0.8.1", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "version": "0.8.1" }, "type-is": { "version": "1.6.18", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, + "typed-array-length": { + "version": "1.0.4", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typedarray": { - "version": "0.0.6", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + "version": "0.0.6" }, "typedarray-to-buffer": { "version": "3.1.5", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { "is-typedarray": "^1.0.0" @@ -82015,53 +84309,35 @@ }, "typescript": { "version": "4.5.4", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "dev": true }, "typical": { - "version": "4.0.0", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==" + "version": "4.0.0" }, "ua-parser-js": { - "version": "0.7.28", - "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" + "version": "0.7.28" }, "uglify-js": { "version": "3.14.5", - "integrity": "sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==", "optional": true }, - "uid-number": { - "version": "0.0.6", - "integrity": "sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w==", - "dev": true - }, "ultimate-pagination": { - "version": "1.0.0", - "integrity": "sha512-bJNroO5GM11McB9RJ1rHZGiXV/jU89Qwc6U5wR8jZuk0uFVajIvUDGPiROVvNMApvh7Ij3cPoeG5V3UlF4GvOA==" - }, - "umask": { - "version": "1.1.0", - "integrity": "sha512-lE/rxOhmiScJu9L6RTNVgB/zZbF+vGC0/p6D3xnkAePI2o0sMyFG966iR5Ki50OI/0mNi2yaRnxfLsPmEZF/JA==", - "dev": true + "version": "1.0.0" }, "un-eval": { - "version": "1.2.0", - "integrity": "sha512-Wlj/pum6dQtGTPD/lclDtoVPkSfpjPfy1dwnnKw/sZP5DpBH9fLhBgQfsqNhe5/gS1D+vkZUuB771NRMUPA5CA==" + "version": "1.2.0" }, "unbox-primitive": { - "version": "1.0.1", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, "unbzip2-stream": { "version": "1.3.3", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", "dev": true, "requires": { "buffer": "^5.2.1", @@ -82070,7 +84346,6 @@ "dependencies": { "buffer": { "version": "5.7.1", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { "base64-js": "^1.3.1", @@ -82080,44 +84355,36 @@ } }, "underscore": { - "version": "1.12.0", - "integrity": "sha512-21rQzss/XPMjolTiIezSu3JAjgagXKROtNrYFEOWK109qY1Uv2tVjPTZ1ci2HgvQDA16gHYSthQIJfB+XId/rQ==" + "version": "1.13.6" }, "unfetch": { - "version": "4.2.0", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + "version": "4.2.0" }, "unherit": { "version": "1.1.3", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", "requires": { "inherits": "^2.0.0", "xtend": "^4.0.0" } }, "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + "version": "2.0.0" }, "unicode-match-property-ecmascript": { "version": "2.0.0", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "requires": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" + "version": "2.0.0" }, "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" + "version": "2.0.0" }, "unified": { "version": "10.1.2", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", "requires": { "@types/unist": "^2.0.0", "bail": "^2.0.0", @@ -82129,26 +84396,21 @@ }, "dependencies": { "bail": { - "version": "2.0.2", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" + "version": "2.0.2" }, "is-buffer": { - "version": "2.0.5", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + "version": "2.0.5" }, "is-plain-obj": { - "version": "4.1.0", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + "version": "4.1.0" }, "trough": { - "version": "2.1.0", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==" + "version": "2.1.0" } } }, "union-value": { "version": "1.0.1", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -82158,62 +84420,51 @@ }, "uniqs": { "version": "2.0.0", - "integrity": "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==", "dev": true }, "unique-filename": { "version": "1.1.1", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "requires": { "unique-slug": "^2.0.0" } }, "unique-slug": { "version": "2.0.2", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "requires": { "imurmurhash": "^0.1.4" } }, "unist-builder": { - "version": "2.0.3", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" + "version": "2.0.3" }, "unist-util-generated": { - "version": "1.1.6", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" + "version": "1.1.6" }, "unist-util-is": { - "version": "5.1.1", - "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==" + "version": "5.1.1" }, "unist-util-position": { - "version": "3.1.0", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + "version": "3.1.0" }, "unist-util-remove": { "version": "2.1.0", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", "requires": { "unist-util-is": "^4.0.0" }, "dependencies": { "unist-util-is": { - "version": "4.1.0", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + "version": "4.1.0" } } }, "unist-util-stringify-position": { "version": "3.0.2", - "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", "requires": { "@types/unist": "^2.0.0" } }, "unist-util-visit": { "version": "4.1.1", - "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", @@ -82222,36 +84473,33 @@ }, "unist-util-visit-parents": { "version": "5.1.1", - "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, + "universal-user-agent": { + "version": "6.0.0" + }, "universalify": { - "version": "2.0.0", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + "version": "2.0.0" }, "unload": { "version": "2.3.1", - "integrity": "sha512-MUZEiDqvAN9AIDRbbBnVYVvfcR6DrjCqeU2YQMmliFZl9uaBUjTkhuDQkBiyAy8ad5bx1TXVbqZ3gg7namsWjA==", "requires": { "@babel/runtime": "^7.6.2", "detect-node": "2.1.0" } }, "unpipe": { - "version": "1.0.0", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + "version": "1.0.0" }, "unquote": { "version": "1.1.1", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", "dev": true }, "unset-value": { "version": "1.0.0", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -82259,7 +84507,6 @@ "dependencies": { "has-value": { "version": "0.3.1", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -82268,7 +84515,6 @@ "dependencies": { "isobject": { "version": "2.1.0", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "requires": { "isarray": "1.0.0" } @@ -82276,52 +84522,52 @@ } }, "has-values": { - "version": "0.1.4", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==" + "version": "0.1.4" } } }, - "unzip-response": { - "version": "2.0.1", - "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==" - }, "upath": { "version": "1.2.0", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "optional": true }, + "update-browserslist-db": { + "version": "1.0.5", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0" + } + } + }, "uri-js": { "version": "4.2.2", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "requires": { "punycode": "^2.1.0" } }, "urijs": { - "version": "1.19.11", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" + "version": "1.19.11" }, "urix": { - "version": "0.1.0", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==" + "version": "0.1.0" }, "url": { "version": "0.11.0", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", "requires": { "punycode": "1.3.2", "querystring": "0.2.0" }, "dependencies": { "punycode": { - "version": "1.3.2", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + "version": "1.3.2" } } }, "url-loader": { "version": "4.1.1", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "requires": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", @@ -82329,12 +84575,10 @@ }, "dependencies": { "json5": { - "version": "2.2.1", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3" }, "loader-utils": { - "version": "2.0.2", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -82345,99 +84589,69 @@ }, "url-parse": { "version": "1.5.10", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, - "url-parse-lax": { - "version": "1.0.0", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "requires": { - "prepend-http": "^1.0.1" - } - }, "use": { - "version": "3.1.1", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + "version": "3.1.1" }, "use-composed-ref": { "version": "1.1.0", - "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", "requires": { "ts-essentials": "^2.0.3" } }, "use-immer": { - "version": "0.6.0", - "integrity": "sha512-dFGRfvWCqPDTOt/S431ETYTg6+uxbpb7A1pptufwXVzGJY3RlXr38+3wyLNpc6SbbmAKjWl6+EP6uW74fkEsXQ==" + "version": "0.8.1" }, "use-isomorphic-layout-effect": { - "version": "1.1.1", - "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==" + "version": "1.1.1" }, "use-latest": { "version": "1.2.0", - "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", "requires": { "use-isomorphic-layout-effect": "^1.0.0" } }, "use-query-params": { "version": "1.1.9", - "integrity": "sha512-WAJ1GrKbFWv1TBn1RQpHqAwC7yyJsLaJjBhIfefrbY/h6mFSngzBQKirJndYwCS1ry77EwhpR/tQi5iovXWvuw==", "requires": { "serialize-query-params": "^1.2.3" } }, "util": { "version": "0.11.1", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { "inherits": "2.0.3" } }, "util-deprecate": { - "version": "1.0.2", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "util-promisify": { - "version": "2.1.0", - "integrity": "sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3" - } + "version": "1.0.2" }, "util.promisify": { "version": "1.0.0", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "requires": { "define-properties": "^1.1.2", "object.getownpropertydescriptors": "^2.0.3" } }, "utila": { - "version": "0.4.0", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + "version": "0.4.0" }, "utils-merge": { - "version": "1.0.1", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + "version": "1.0.1" }, "uuid": { - "version": "3.4.0", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "version": "3.4.0" }, "uuid-browser": { - "version": "3.1.0", - "integrity": "sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==" + "version": "3.1.0" }, "uvu": { "version": "0.5.6", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", "requires": { "dequal": "^2.0.0", "diff": "^5.0.0", @@ -82446,23 +84660,19 @@ }, "dependencies": { "diff": { - "version": "5.1.0", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==" + "version": "5.1.0" }, "kleur": { - "version": "4.1.5", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + "version": "4.1.5" } } }, "v8-compile-cache": { "version": "2.3.0", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "v8-to-istanbul": { "version": "7.0.0", - "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -82472,14 +84682,12 @@ "dependencies": { "source-map": { "version": "0.7.3", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true } } }, "v8flags": { "version": "3.2.0", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "dev": true, "requires": { "homedir-polyfill": "^1.0.1" @@ -82487,7 +84695,6 @@ }, "validate-npm-package-license": { "version": "3.0.4", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -82495,28 +84702,23 @@ }, "validate-npm-package-name": { "version": "3.0.0", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dev": true, "requires": { "builtins": "^1.0.3" } }, "value-equal": { - "version": "1.0.1", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + "version": "1.0.1" }, "vary": { - "version": "1.1.2", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "version": "1.1.2" }, "vendors": { "version": "1.0.4", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", "dev": true }, "verror": { "version": "1.10.0", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -82525,8 +84727,7 @@ } }, "vfile": { - "version": "5.3.6", - "integrity": "sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==", + "version": "5.3.5", "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", @@ -82535,22 +84736,19 @@ }, "dependencies": { "is-buffer": { - "version": "2.0.5", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + "version": "2.0.5" } } }, "vfile-location": { "version": "4.0.1", - "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", "requires": { "@types/unist": "^2.0.0", "vfile": "^5.0.0" } }, "vfile-message": { - "version": "3.1.3", - "integrity": "sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==", + "version": "3.1.2", "requires": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^3.0.0" @@ -82558,54 +84756,33 @@ }, "viewport-mercator-project": { "version": "6.2.3", - "integrity": "sha512-QQb0/qCLlP4DdfbHHSWVYXpghB2wkLIiiZQnoelOB59mXKQSyZVxjreq1S+gaBJFpcGkWEcyVtre0+2y2DTl/Q==", "requires": { "@babel/runtime": "^7.0.0", "gl-matrix": "^3.0.0" } }, - "vinyl": { - "version": "2.2.1", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } + "vlq": { + "version": "0.2.3" }, - "vinyl-file": { - "version": "3.0.0", - "integrity": "sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==", - "optional": true, + "vm-browserify": { + "version": "1.1.2" + }, + "vm2": { + "version": "3.9.13", + "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.3.0", - "strip-bom-buf": "^1.0.0", - "strip-bom-stream": "^2.0.0", - "vinyl": "^2.0.1" + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" }, "dependencies": { - "pify": { - "version": "2.3.0", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "optional": true + "acorn-walk": { + "version": "8.2.0", + "dev": true } } }, - "vlq": { - "version": "0.2.3", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" - }, - "vm-browserify": { - "version": "1.1.2", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, "vt-pbf": { "version": "3.1.3", - "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", "requires": { "@mapbox/point-geometry": "0.1.0", "@mapbox/vector-tile": "^1.3.1", @@ -82614,23 +84791,30 @@ }, "w3c-hr-time": { "version": "1.0.2", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "dev": true, "requires": { "browser-process-hrtime": "^1.0.0" } }, "w3c-xmlserializer": { - "version": "2.0.0", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "version": "3.0.0", "dev": true, "requires": { - "xml-name-validator": "^3.0.0" + "xml-name-validator": "^4.0.0" + }, + "dependencies": { + "xml-name-validator": { + "version": "4.0.0", + "dev": true + } } }, + "walk-up-path": { + "version": "1.0.0", + "dev": true + }, "walker": { "version": "1.0.7", - "integrity": "sha512-cF4je9Fgt6sj1PKfuFt9jpQPeHosM+Ryma/hfY9U7uXGKM7pJCsF0v2r55o+Il54+i77SyYWetB4tD1dEygRkw==", "dev": true, "requires": { "makeerror": "1.0.x" @@ -82638,14 +84822,12 @@ }, "warning": { "version": "4.0.3", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", "requires": { "loose-envify": "^1.0.0" } }, "watchpack": { "version": "1.7.5", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "requires": { "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", @@ -82655,7 +84837,6 @@ }, "watchpack-chokidar2": { "version": "2.0.1", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", "optional": true, "requires": { "chokidar": "^2.1.8" @@ -82663,7 +84844,6 @@ "dependencies": { "chokidar": { "version": "2.1.8", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "optional": true, "requires": { "anymatch": "^2.0.0", @@ -82682,7 +84862,6 @@ }, "glob-parent": { "version": "3.1.0", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "optional": true, "requires": { "is-glob": "^3.1.0", @@ -82691,7 +84870,6 @@ "dependencies": { "is-glob": { "version": "3.1.0", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", "optional": true, "requires": { "is-extglob": "^2.1.0" @@ -82701,14 +84879,12 @@ }, "normalize-path": { "version": "3.0.0", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "optional": true } } }, "wbuf": { "version": "1.7.3", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "requires": { "minimalistic-assert": "^1.0.0" @@ -82716,23 +84892,20 @@ }, "wcwidth": { "version": "1.0.1", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "requires": { "defaults": "^1.0.3" } }, "web-namespaces": { - "version": "1.1.4", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + "version": "1.1.4" }, "webidl-conversions": { "version": "4.0.2", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "dev": true }, "webpack": { "version": "5.52.1", - "integrity": "sha512-wkGb0hLfrS7ML3n2xIKfUIwHbjB6gxwQHyLmVHoAqEQBw+nWo+G6LoHL098FEXqahqximsntjBLuewStrnJk0g==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -82763,7 +84936,6 @@ "dependencies": { "@webassemblyjs/ast": { "version": "1.11.1", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.1", @@ -82772,22 +84944,18 @@ }, "@webassemblyjs/helper-api-error": { "version": "1.11.1", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "@webassemblyjs/helper-buffer": { "version": "1.11.1", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "@webassemblyjs/helper-wasm-section": { "version": "1.11.1", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", @@ -82798,7 +84966,6 @@ }, "@webassemblyjs/ieee754": { "version": "1.11.1", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" @@ -82806,7 +84973,6 @@ }, "@webassemblyjs/leb128": { "version": "1.11.1", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" @@ -82814,12 +84980,10 @@ }, "@webassemblyjs/utf8": { "version": "1.11.1", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "@webassemblyjs/wasm-edit": { "version": "1.11.1", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", @@ -82834,7 +84998,6 @@ }, "@webassemblyjs/wasm-gen": { "version": "1.11.1", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", @@ -82846,7 +85009,6 @@ }, "@webassemblyjs/wasm-opt": { "version": "1.11.1", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", @@ -82857,7 +85019,6 @@ }, "@webassemblyjs/wasm-parser": { "version": "1.11.1", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", @@ -82870,7 +85031,6 @@ }, "@webassemblyjs/wast-printer": { "version": "1.11.1", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", @@ -82879,7 +85039,6 @@ }, "enhanced-resolve": { "version": "5.8.2", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -82888,12 +85047,10 @@ }, "has-flag": { "version": "4.0.0", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-worker": { "version": "27.2.0", - "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", "dev": true, "requires": { "@types/node": "*", @@ -82903,7 +85060,6 @@ }, "p-limit": { "version": "3.1.0", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { "yocto-queue": "^0.1.0" @@ -82911,7 +85067,6 @@ }, "serialize-javascript": { "version": "6.0.0", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -82919,12 +85074,10 @@ }, "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { "version": "8.1.1", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -82932,29 +85085,20 @@ }, "tapable": { "version": "2.2.1", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, "terser": { - "version": "5.8.0", - "integrity": "sha512-f0JH+6yMpneYcRJN314lZrSwu9eKkUFEHLN/kNy8ceh8gaRiLgFPJqrB9HsXjhEGdv4e/ekjTOFxIlL6xlma8A==", + "version": "5.14.2", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } } }, "terser-webpack-plugin": { "version": "5.2.4", - "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", "dev": true, "requires": { "jest-worker": "^27.0.6", @@ -82967,7 +85111,6 @@ }, "watchpack": { "version": "2.2.0", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -82978,7 +85121,6 @@ }, "webpack-bundle-analyzer": { "version": "4.4.2", - "integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==", "dev": true, "requires": { "acorn": "^8.0.4", @@ -82994,17 +85136,14 @@ "dependencies": { "acorn-walk": { "version": "8.2.0", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, "commander": { "version": "6.2.1", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, "gzip-size": { "version": "6.0.0", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, "requires": { "duplexer": "^0.1.2" @@ -83014,7 +85153,6 @@ }, "webpack-cli": { "version": "4.8.0", - "integrity": "sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", @@ -83034,12 +85172,10 @@ "dependencies": { "commander": { "version": "7.2.0", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true }, "cross-spawn": { "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -83049,7 +85185,6 @@ }, "execa": { "version": "5.1.1", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -83065,22 +85200,18 @@ }, "get-stream": { "version": "6.0.1", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "human-signals": { "version": "2.1.0", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "is-stream": { "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "npm-run-path": { "version": "4.0.1", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" @@ -83088,12 +85219,10 @@ }, "path-key": { "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "rechoir": { "version": "0.7.1", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, "requires": { "resolve": "^1.9.0" @@ -83101,7 +85230,6 @@ }, "shebang-command": { "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" @@ -83109,12 +85237,10 @@ }, "shebang-regex": { "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -83124,7 +85250,6 @@ }, "webpack-dev-middleware": { "version": "3.7.3", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", "requires": { "memory-fs": "^0.4.1", "mime": "^2.4.4", @@ -83134,74 +85259,193 @@ }, "dependencies": { "mime": { - "version": "2.6.0", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" + "version": "2.6.0" } } }, "webpack-dev-server": { - "version": "4.2.0", - "integrity": "sha512-iBaDkHBLfW3cEITeJWNkjZBrm+b5A3YLg8XVdNOdjUNABdXJwcsJv4dzKSnVf1q4Ch489+6epWVW6OcOyVfG7w==", + "version": "4.10.1", "dev": true, "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^3.5.1", - "colorette": "^1.2.2", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "del": "^6.0.0", - "express": "^4.17.1", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", - "internal-ip": "^6.2.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", - "schema-utils": "^3.1.0", - "selfsigned": "^1.10.11", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^5.1.0", - "ws": "^8.1.0" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "ajv": { + "version": "8.11.0", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "array-flatten": { + "version": "1.1.1", + "dev": true + }, + "body-parser": { + "version": "1.20.0", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "bytes": { + "version": "3.1.2", + "dev": true + }, + "colorette": { + "version": "2.0.19", "dev": true }, - "del": { - "version": "6.0.0", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "cookie": { + "version": "0.5.0", + "dev": true + }, + "depd": { + "version": "2.0.0", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "dev": true + }, + "express": { + "version": "4.18.1", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.2.0", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "http-errors": { + "version": "2.0.0", "dev": true, "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, + "inherits": { + "version": "2.0.4", + "dev": true + }, "is-wsl": { "version": "2.2.0", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "requires": { "is-docker": "^2.0.0" } }, + "json-schema-traverse": { + "version": "1.0.0", + "dev": true + }, + "ms": { + "version": "2.1.3", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "open": { "version": "8.2.1", - "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", "dev": true, "requires": { "define-lazy-prop": "^2.0.0", @@ -83209,41 +85453,97 @@ "is-wsl": "^2.2.0" } }, - "slash": { - "version": "3.0.0", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "path-to-regexp": { + "version": "0.1.7", "dev": true }, - "strip-ansi": { - "version": "7.0.1", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "qs": { + "version": "6.10.3", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "raw-body": { + "version": "2.5.1", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "send": { + "version": "0.18.0", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + } + }, + "serve-static": { + "version": "1.15.0", "dev": true, "requires": { - "ansi-regex": "^6.0.1" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" } }, + "setprototypeof": { + "version": "1.2.0", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "dev": true + }, "webpack-dev-middleware": { - "version": "5.1.0", - "integrity": "sha512-oT660AR1gOnU/NTdUQi3EiGR0iXG7CFxmKsj3ylWCBA2khJ8LFHK+sKv3BZEsC11gl1eChsltRhzUq7nWj7XIQ==", + "version": "5.3.3", "dev": true, "requires": { - "colorette": "^1.2.2", - "memfs": "^3.2.2", + "colorette": "^2.0.10", + "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "schema-utils": "^3.1.0" + "schema-utils": "^4.0.0" } }, "ws": { "version": "8.5.0", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "dev": true } } }, "webpack-hot-middleware": { "version": "2.25.1", - "integrity": "sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==", "requires": { "ansi-html-community": "0.0.8", "html-entities": "^2.1.0", @@ -83252,12 +85552,10 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "version": "5.0.1" }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } @@ -83266,7 +85564,6 @@ }, "webpack-log": { "version": "2.0.0", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "requires": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" @@ -83274,7 +85571,6 @@ }, "webpack-manifest-plugin": { "version": "4.0.2", - "integrity": "sha512-Ld6j05pRblXAVoX8xdXFDsc/s97cFnR1FOmQawhTSlp6F6aeU1Jia5aqTmDpkueaAz8g9sXpgSOqmEgVAR61Xw==", "dev": true, "requires": { "tapable": "^2.0.0", @@ -83283,17 +85579,14 @@ "dependencies": { "source-map": { "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "tapable": { "version": "2.2.1", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, "webpack-sources": { "version": "2.3.1", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", "dev": true, "requires": { "source-list-map": "^2.0.1", @@ -83304,7 +85597,6 @@ }, "webpack-merge": { "version": "5.8.0", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -83313,32 +85605,27 @@ }, "webpack-sources": { "version": "3.2.0", - "integrity": "sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==", "dev": true }, "webpack-virtual-modules": { "version": "0.2.2", - "integrity": "sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==", "requires": { "debug": "^3.0.0" }, "dependencies": { "debug": { "version": "3.2.7", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } }, "ms": { - "version": "2.1.3", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "version": "2.1.3" } } }, "websocket-driver": { "version": "0.7.4", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "requires": { "http-parser-js": ">=0.5.1", @@ -83348,33 +85635,24 @@ }, "websocket-extensions": { "version": "0.1.4", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, - "wgs84": { - "version": "0.0.0", - "integrity": "sha512-ANHlY4Rb5kHw40D0NJ6moaVfOCMrp9Gpd1R/AIQYg2ko4/jzcJ+TVXYYF6kXJqQwITvEZP4yEthjM7U6rYlljQ==" - }, "whatwg-encoding": { "version": "1.0.5", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, "requires": { "iconv-lite": "0.4.24" } }, "whatwg-fetch": { - "version": "3.6.2", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + "version": "3.6.2" }, "whatwg-mimetype": { "version": "2.3.0", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, "whatwg-url": { "version": "6.5.0", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -83384,14 +85662,13 @@ }, "which": { "version": "1.3.1", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-boxed-primitive": { "version": "1.0.2", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -83401,34 +85678,39 @@ } }, "which-module": { - "version": "2.0.0", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + "version": "2.0.0" + }, + "which-typed-array": { + "version": "1.1.9", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } }, "wide-align": { "version": "1.1.5", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "requires": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "widest-line": { "version": "3.1.0", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "requires": { "string-width": "^4.0.0" }, "dependencies": { "ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "version": "5.0.1" }, "is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "version": "3.0.0" }, "string-width": { "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -83437,7 +85719,6 @@ }, "strip-ansi": { "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } @@ -83446,68 +85727,41 @@ }, "wildcard": { "version": "2.0.0", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, - "with-open-file": { - "version": "0.1.7", - "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", - "requires": { - "p-finally": "^1.0.0", - "p-try": "^2.1.0", - "pify": "^4.0.1" - }, - "dependencies": { - "p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "pify": { - "version": "4.0.1", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } - } - }, "word-wrap": { "version": "1.2.3", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "wordwrap": { - "version": "1.0.0", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + "version": "1.0.0" }, "wordwrapjs": { "version": "4.0.1", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "requires": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" }, "dependencies": { "typical": { - "version": "5.2.0", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" + "version": "5.2.0" } } }, "worker-farm": { "version": "1.7.0", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "requires": { "errno": "~0.1.7" } }, "worker-rpc": { "version": "0.1.1", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", "requires": { "microevent.ts": "~0.1.1" } }, "wrap-ansi": { "version": "6.2.0", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -83515,16 +85769,13 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.0" }, "is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "version": "3.0.0" }, "string-width": { "version": "4.2.0", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -83533,7 +85784,6 @@ }, "strip-ansi": { "version": "6.0.0", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { "ansi-regex": "^5.0.0" } @@ -83541,12 +85791,10 @@ } }, "wrappy": { - "version": "1.0.2", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "version": "1.0.2" }, "write-file-atomic": { "version": "3.0.3", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -83557,7 +85805,6 @@ }, "write-json-file": { "version": "4.3.0", - "integrity": "sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ==", "dev": true, "requires": { "detect-indent": "^6.0.0", @@ -83570,12 +85817,10 @@ "dependencies": { "is-plain-obj": { "version": "2.1.0", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, "make-dir": { "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -83583,14 +85828,12 @@ }, "semver": { "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "write-pkg": { "version": "4.0.0", - "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", "dev": true, "requires": { "sort-keys": "^2.0.0", @@ -83600,17 +85843,14 @@ "dependencies": { "detect-indent": { "version": "5.0.0", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", "dev": true }, "pify": { "version": "4.0.1", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, "sort-keys": { "version": "2.0.0", - "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", "dev": true, "requires": { "is-plain-obj": "^1.0.0" @@ -83618,12 +85858,10 @@ }, "type-fest": { "version": "0.4.1", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", "dev": true }, "write-file-atomic": { "version": "2.4.3", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -83633,7 +85871,6 @@ }, "write-json-file": { "version": "3.2.0", - "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", "dev": true, "requires": { "detect-indent": "^5.0.0", @@ -83648,51 +85885,45 @@ }, "ws": { "version": "7.5.7", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "dev": true }, "xml-name-validator": { "version": "3.0.0", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, "xmlbuilder": { "version": "10.1.1", - "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==", "dev": true }, "xmlchars": { "version": "2.2.0", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xregexp": { + "version": "2.0.0", "dev": true }, "xss": { "version": "1.0.10", - "integrity": "sha512-qmoqrRksmzqSKvgqzN0055UFWY7OKx1/9JWeRswwEVX9fCG5jcYRxa/A2DHcmZX6VJvjzHRQ2STeeVcQkrmLSw==", "requires": { "commander": "^2.20.3", "cssfilter": "0.0.10" } }, "xtend": { - "version": "4.0.1", - "integrity": "sha512-iTwvhNBRetXWe81+VcIw5YeadVSWyze7uA7nVnpP13ulrpnJ3UfQm5ApGnrkmxDJFdrblRdZs0EvaTCIfei5oQ==" + "version": "4.0.1" }, "y18n": { - "version": "4.0.3", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "version": "4.0.3" }, "yallist": { - "version": "3.1.1", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "3.1.1" }, "yaml": { - "version": "1.10.2", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + "version": "1.10.2" }, "yargs": { "version": "15.4.1", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -83708,53 +85939,44 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.0" }, "find-up": { "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "version": "3.0.0" }, "locate-path": { "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" } }, "p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "2.2.0" }, "path-exists": { - "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" }, "string-width": { "version": "4.2.0", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -83763,7 +85985,6 @@ }, "strip-ansi": { "version": "6.0.0", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { "ansi-regex": "^5.0.0" } @@ -83772,7 +85993,6 @@ }, "yargs-parser": { "version": "18.1.3", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -83780,7 +86000,6 @@ }, "yarn-or-npm": { "version": "3.0.1", - "integrity": "sha512-fTiQP6WbDAh5QZAVdbMQkecZoahnbOjClTQhzv74WX5h2Uaidj1isf9FDes11TKtsZ0/ZVfZsqZ+O3x6aLERHQ==", "dev": true, "requires": { "cross-spawn": "^6.0.5", @@ -83789,7 +86008,6 @@ "dependencies": { "find-up": { "version": "4.1.0", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -83798,7 +86016,6 @@ }, "locate-path": { "version": "5.0.0", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -83806,7 +86023,6 @@ }, "p-limit": { "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -83814,7 +86030,6 @@ }, "p-locate": { "version": "4.1.0", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -83822,17 +86037,14 @@ }, "p-try": { "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "path-exists": { "version": "4.0.0", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "pkg-dir": { "version": "4.2.0", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { "find-up": "^4.0.0" @@ -83842,7 +86054,6 @@ }, "yauzl": { "version": "2.10.0", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, "requires": { "buffer-crc32": "~0.2.3", @@ -83851,597 +86062,109 @@ }, "yeoman-assert": { "version": "3.1.1", - "integrity": "sha512-bCuLb/j/WzpvrJZCTdJJLFzm7KK8IYQJ3+dF9dYtNs2CUYyezFJDuULiZ2neM4eqjf45GN1KH/MzCTT3i90wUQ==", "dev": true }, "yeoman-generator": { - "version": "4.13.0", - "integrity": "sha512-f2/5N5IR3M2Ozm+QocvZQudlQITv2DwI6Mcxfy7R7gTTzaKgvUpgo/pQMJ+WQKm0KN0YMWCFOZpj0xFGxevc1w==", + "version": "5.7.0", "requires": { - "async": "^2.6.2", - "chalk": "^2.4.2", - "cli-table": "^0.3.1", - "cross-spawn": "^6.0.5", - "dargs": "^6.1.0", - "dateformat": "^3.0.3", + "chalk": "^4.1.0", + "dargs": "^7.0.0", "debug": "^4.1.1", - "diff": "^4.0.1", - "error": "^7.0.2", - "find-up": "^3.0.0", - "github-username": "^3.0.0", - "grouped-queue": "^1.1.0", - "istextorbinary": "^2.5.1", + "execa": "^5.1.1", + "github-username": "^6.0.0", "lodash": "^4.17.11", - "make-dir": "^3.0.0", - "mem-fs-editor": "^7.0.1", "minimist": "^1.2.5", - "pretty-bytes": "^5.2.0", - "read-chunk": "^3.2.0", - "read-pkg-up": "^5.0.0", - "rimraf": "^2.6.3", + "read-pkg-up": "^7.0.1", "run-async": "^2.0.0", "semver": "^7.2.1", - "shelljs": "^0.8.4", - "text-table": "^0.2.0", - "through2": "^3.0.1", - "yeoman-environment": "^2.9.5" + "shelljs": "^0.8.5", + "sort-keys": "^4.2.0", + "text-table": "^0.2.0" }, "dependencies": { - "@nodelib/fs.stat": { - "version": "1.1.3", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" - }, - "ansi-regex": { - "version": "3.0.0", - "integrity": "sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==", - "optional": true - }, - "ansi-styles": { - "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "arrify": { - "version": "2.0.1", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" - }, - "async": { - "version": "2.6.3", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "chalk": { - "version": "2.4.2", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "cross-spawn": { + "version": "7.0.3", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "dargs": { - "version": "6.1.0", - "integrity": "sha512-5dVBvpBLBnPwSsYXqfybFyehMmC/EenKEcf23AhCTgTf48JFBbmJKqoZBsERDnjL0FyiVTYWdFsRfTLHxLyKdQ==" - }, "debug": { "version": "4.3.2", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { "ms": "2.1.2" } }, - "dir-glob": { - "version": "2.2.2", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "requires": { - "path-type": "^3.0.0" - } - }, - "error": { - "version": "7.2.1", - "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", - "requires": { - "string-template": "~0.2.1" - } - }, "execa": { - "version": "4.1.0", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "optional": true, + "version": "5.1.1", "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "optional": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - } - } - }, - "fast-glob": { - "version": "2.2.7", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "find-up": { - "version": "3.0.0", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" } }, "get-stream": { - "version": "5.2.0", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "optional": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "globby": { - "version": "9.2.0", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "requires": { - "array-uniq": "^1.0.1" - } - } - } - }, - "grouped-queue": { - "version": "1.1.0", - "integrity": "sha512-rZOFKfCqLhsu5VqjBjEWiwrYqJR07KxIkH4mLZlNlGDfntbb4FbMyGFP14TlvRPrU9S3Hnn/sgxbC5ZeN0no3Q==", - "optional": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "inherits": { - "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "version": "6.0.1" }, - "is-scoped": { - "version": "1.0.0", - "integrity": "sha512-iT1y0qJcdqXnHe6SCtN9cOBPRiarw8Cy1EZkawW50dxO/7oHC6AYvs1tH4QbBbi7UC/vYY3BnRmbE0bFLwvUog==", - "optional": true, - "requires": { - "scoped-regex": "^1.0.0" - } + "human-signals": { + "version": "2.1.0" }, "is-stream": { - "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "optional": true - }, - "locate-path": { - "version": "3.0.0", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "log-symbols": { - "version": "2.2.0", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "optional": true, - "requires": { - "chalk": "^2.0.1" - } + "version": "2.0.1" }, "lru-cache": { "version": "6.0.0", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, - "make-dir": { - "version": "3.1.0", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "mem-fs": { - "version": "1.2.0", - "integrity": "sha512-b8g0jWKdl8pM0LqAPdK9i8ERL7nYrzmJfRhxMiWH2uYdfYnb7uXnmwVb0ZGe7xyEl4lj+nLIU3yf4zPUT+XsVQ==", - "optional": true, - "requires": { - "through2": "^3.0.0", - "vinyl": "^2.0.1", - "vinyl-file": "^3.0.0" - } - }, - "mem-fs-editor": { - "version": "7.1.0", - "integrity": "sha512-BH6QEqCXSqGeX48V7zu+e3cMwHU7x640NB8Zk8VNvVZniz+p4FK60pMx/3yfkzo6miI6G3a8pH6z7FeuIzqrzA==", - "requires": { - "commondir": "^1.0.1", - "deep-extend": "^0.6.0", - "ejs": "^3.1.5", - "glob": "^7.1.4", - "globby": "^9.2.0", - "isbinaryfile": "^4.0.0", - "mkdirp": "^1.0.0", - "multimatch": "^4.0.0", - "rimraf": "^3.0.0", - "through2": "^3.0.2", - "vinyl": "^2.2.1" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, "ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multimatch": { - "version": "4.0.0", - "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", - "requires": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - } + "version": "2.1.2" }, "npm-run-path": { "version": "4.0.1", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "optional": true, "requires": { "path-key": "^3.0.0" } }, - "p-limit": { - "version": "2.3.0", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, "path-key": { - "version": "3.1.1", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "optional": true - }, - "pify": { - "version": "4.0.1", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "read-pkg-up": { - "version": "5.0.0", - "integrity": "sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg==", - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^5.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "scoped-regex": { - "version": "1.0.0", - "integrity": "sha512-90/gFvaP4jXL0rXPD8FS7tWgmkQDlxCjs9cs3r3G5hAnrODt94kIh4SDbH/gm3HosGTik0omdSPOh0KQyGqjlg==", - "optional": true + "version": "3.1.1" }, "semver": { - "version": "7.3.5", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", "requires": { "lru-cache": "^6.0.0" } }, "shebang-command": { "version": "2.0.0", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "optional": true, "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "3.0.0", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "optional": true - }, - "strip-ansi": { - "version": "4.0.0", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "optional": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "through2": { - "version": "3.0.2", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - }, - "untildify": { - "version": "3.0.3", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", - "optional": true + "version": "3.0.0" }, "which": { "version": "2.0.2", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "optional": true, "requires": { "isexe": "^2.0.0" } }, "yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yeoman-environment": { - "version": "2.10.3", - "integrity": "sha512-pLIhhU9z/G+kjOXmJ2bPFm3nejfbH+f1fjYRSOteEXDBrv1EoJE/e+kuHixSXfCYfTkxjYsvRaDX+1QykLCnpQ==", - "optional": true, - "requires": { - "chalk": "^2.4.1", - "debug": "^3.1.0", - "diff": "^3.5.0", - "escape-string-regexp": "^1.0.2", - "execa": "^4.0.0", - "globby": "^8.0.1", - "grouped-queue": "^1.1.0", - "inquirer": "^7.1.0", - "is-scoped": "^1.0.0", - "lodash": "^4.17.10", - "log-symbols": "^2.2.0", - "mem-fs": "^1.1.0", - "mem-fs-editor": "^6.0.0", - "npm-api": "^1.0.0", - "semver": "^7.1.3", - "strip-ansi": "^4.0.0", - "text-table": "^0.2.0", - "untildify": "^3.0.3", - "yeoman-generator": "^4.8.2" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "optional": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "arrify": { - "version": "1.0.1", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "optional": true - }, - "debug": { - "version": "3.2.7", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "diff": { - "version": "3.5.0", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "optional": true - }, - "dir-glob": { - "version": "2.0.0", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "optional": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "ejs": { - "version": "2.7.4", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "optional": true - }, - "globby": { - "version": "8.0.2", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "optional": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "ignore": { - "version": "3.3.10", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "optional": true - }, - "mem-fs-editor": { - "version": "6.0.0", - "integrity": "sha512-e0WfJAMm8Gv1mP5fEq/Blzy6Lt1VbLg7gNnZmZak7nhrBTibs+c6nQ4SKs/ZyJYHS1mFgDJeopsLAv7Ow0FMFg==", - "optional": true, - "requires": { - "commondir": "^1.0.1", - "deep-extend": "^0.6.0", - "ejs": "^2.6.1", - "glob": "^7.1.4", - "globby": "^9.2.0", - "isbinaryfile": "^4.0.0", - "mkdirp": "^0.5.0", - "multimatch": "^4.0.0", - "rimraf": "^2.6.3", - "through2": "^3.0.1", - "vinyl": "^2.2.0" - }, - "dependencies": { - "dir-glob": { - "version": "2.2.2", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "optional": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "globby": { - "version": "9.2.0", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "optional": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - } - }, - "ignore": { - "version": "4.0.6", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "optional": true - }, - "pify": { - "version": "4.0.1", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "optional": true - }, - "slash": { - "version": "2.0.0", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "optional": true - } - } - }, - "mkdirp": { - "version": "0.5.5", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "pify": { - "version": "3.0.0", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "optional": true - }, - "slash": { - "version": "1.0.0", - "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", - "optional": true - } - } + "version": "4.0.0" } } }, "yeoman-test": { "version": "6.2.0", - "integrity": "sha512-KsCxwx4vPG2IwP7hG3U67WV04ymjbAmmy+BU06CrCku7U3sFFFq7LRoeGqrMRTsAqk/ff7gQJoc8sD43AgMX6Q==", "dev": true, "requires": { "inquirer": "^8.0.0", @@ -84451,48 +86174,8 @@ "temp-dir": "^2.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "inquirer": { - "version": "8.2.0", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.2.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "rxjs": { - "version": "7.4.0", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", - "dev": true, - "requires": { - "tslib": "~2.1.0" - } - }, "sinon": { "version": "10.0.0", - "integrity": "sha512-XAn5DxtGVJBlBWYrcYKEhWCz7FLwZGdyvANRyK06419hyEpdT0dMc5A8Vcxg5SCGHc40CsqoKsc1bt1CbJPfNw==", "dev": true, "requires": { "@sinonjs/commons": "^1.8.1", @@ -84503,43 +86186,17 @@ "supports-color": "^7.1.0" } }, - "string-width": { - "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, "temp-dir": { "version": "2.0.0", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true - }, - "tslib": { - "version": "2.1.0", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true } } }, "yocto-queue": { - "version": "0.1.0", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "version": "0.1.0" }, "yosay": { "version": "2.0.2", - "integrity": "sha512-avX6nz2esp7IMXGag4gu6OyQBsMh/SEn+ZybGu3yKPlOTE6z9qJrzG/0X5vCq/e0rPFy0CUYCze0G5hL310ibA==", "requires": { "ansi-regex": "^2.0.0", "ansi-styles": "^3.0.0", @@ -84554,14 +86211,12 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "1.1.3", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -84571,29 +86226,24 @@ }, "dependencies": { "ansi-styles": { - "version": "2.2.1", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" + "version": "2.2.1" } } }, "cli-boxes": { - "version": "1.0.0", - "integrity": "sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==" + "version": "1.0.0" }, "is-fullwidth-code-point": { "version": "1.0.0", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "requires": { "number-is-nan": "^1.0.0" } }, "supports-color": { - "version": "2.0.0", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" + "version": "2.0.0" }, "wrap-ansi": { "version": "2.1.0", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -84601,7 +86251,6 @@ "dependencies": { "string-width": { "version": "1.0.2", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -84613,21 +86262,18 @@ } }, "zrender": { - "version": "5.3.1", - "integrity": "sha512-7olqIjy0gWfznKr6vgfnGBk7y4UtdMvdwFmK92vVQsQeDPyzkHW1OlrLEKg6GHz1W5ePf0FeN1q2vkl/HFqhXw==", + "version": "5.4.1", "requires": { "tslib": "2.3.0" }, "dependencies": { "tslib": { - "version": "2.3.0", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + "version": "2.3.0" } } }, "zwitch": { - "version": "1.0.5", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + "version": "1.0.5" } } } diff --git a/superset-frontend/package.json b/superset-frontend/package.json index aae61e904085..b058068dfb60 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -1,6 +1,6 @@ { "name": "superset", - "version": "2.0.1", + "version": "2.1.0", "description": "Superset is a data exploration platform designed to be visual, intuitive, and interactive.", "keywords": [ "big", @@ -23,7 +23,9 @@ "url": "git+https://github.com/apache/superset.git" }, "license": "Apache-2.0", - "author": "Apache", + "author": { + "name": "Apache" + }, "directories": { "doc": "docs", "test": "spec" @@ -40,7 +42,9 @@ "build-instrumented": "cross-env NODE_ENV=production BABEL_ENV=instrumented webpack --mode=production --color", "build-storybook": "build-storybook", "check-translation": "prettier --check ../superset/translations/**/LC_MESSAGES/*.json", + "chromatic": "npx chromatic --skip 'dependabot/**' --only-changed", "clean-translation": "prettier --write ../superset/translations/**/LC_MESSAGES/*.json", + "core:cover": "cross-env NODE_ENV=test jest --coverage --coverageThreshold='{\"global\":{\"statements\":100,\"branches\":100,\"functions\":100,\"lines\":100}}' --collectCoverageFrom='[\"packages/**/src/**/*.{js,ts}\", \"!packages/superset-ui-demo/**/*\"]' packages", "cover": "cross-env NODE_ENV=test jest --coverage", "dev": "webpack --mode=development --color --watch", "dev-server": "cross-env NODE_ENV=development BABEL_ENV=development node --max_old_space_size=4096 ./node_modules/webpack-dev-server/bin/webpack-dev-server.js --mode=development", @@ -75,7 +79,7 @@ "dependencies": { "@ag-grid-community/react": "^26.0.0", "@ag-grid-enterprise/all-modules": "^26.0.0", - "@ant-design/icons": "^4.2.2", + "@ant-design/icons": "^4.8.0", "@babel/runtime-corejs3": "^7.12.5", "@data-ui/sparkline": "^0.0.84", "@emotion/babel-preset-css-prop": "^11.2.0", @@ -112,10 +116,10 @@ "@superset-ui/plugin-chart-word-cloud": "file:./plugins/plugin-chart-word-cloud", "@superset-ui/preset-chart-xy": "file:./plugins/preset-chart-xy", "@superset-ui/switchboard": "file:./packages/superset-ui-switchboard", - "@vx/responsive": "^0.0.195", + "@visx/responsive": "^3.0.0", "abortcontroller-polyfill": "^1.1.9", "ace-builds": "^1.4.14", - "antd": "^4.9.4", + "antd": "4.10.3", "array-move": "^2.2.1", "babel-plugin-typescript-to-proptypes": "^2.0.0", "bootstrap": "^3.4.1", @@ -125,6 +129,7 @@ "chrono-node": "^2.2.6", "classnames": "^2.2.5", "core-js": "^3.6.5", + "currencyformatter.js": "^2.2.0", "d3-array": "^1.2.4", "d3-color": "^1.2.0", "d3-scale": "^2.1.2", @@ -138,7 +143,7 @@ "global-box": "^1.2.0", "html-webpack-plugin": "^5.3.2", "immer": "^9.0.6", - "interweave": "^11.2.0", + "interweave": "^13.0.0", "jquery": "^3.5.1", "js-levenshtein": "^1.1.6", "js-yaml-loader": "^1.2.2", @@ -146,11 +151,11 @@ "json-stringify-pretty-compact": "^2.0.0", "lodash": "^4.17.21", "lodash-es": "^4.17.21", - "mapbox-gl": "^2.8.2", + "mapbox-gl": "^2.10.0", "match-sorter": "^6.1.0", "memoize-one": "^5.1.1", "moment": "^2.26.0", - "moment-timezone": "^0.5.33", + "moment-timezone": "^0.5.37", "mousetrap": "^1.6.1", "mustache": "^2.2.1", "polished": "^3.7.2", @@ -158,39 +163,39 @@ "query-string": "^6.13.7", "re-resizable": "^6.6.1", "react": "^16.13.1", - "react-ace": "^9.4.4", - "react-checkbox-tree": "^1.5.1", + "react-ace": "^10.1.0", + "react-checkbox-tree": "^1.8.0", "react-color": "^2.13.8", - "react-datetime": "^3.0.4", + "react-datetime": "^3.2.0", + "react-diff-viewer-continued": "^3.2.5", "react-dnd": "^11.1.3", "react-dnd-html5-backend": "^11.1.3", "react-dom": "^16.13.0", "react-draggable": "^4.4.3", "react-gravatar": "^2.6.1", - "react-hot-loader": "^4.12.20", - "react-icons": "^4.2.0", + "react-hot-loader": "^4.13.1", + "react-intersection-observer": "^9.4.1", "react-js-cron": "^1.2.0", - "react-json-tree": "^0.11.2", - "react-jsonschema-form": "^1.2.0", + "react-json-tree": "^0.17.0", + "react-jsonschema-form": "^1.8.1", "react-lines-ellipsis": "^0.15.0", "react-loadable": "^5.5.0", - "react-redux": "^7.2.0", - "react-resize-detector": "^6.7.6", - "react-reverse-portal": "^2.0.1", - "react-router-dom": "^5.1.2", + "react-query": "^3.39.2", + "react-redux": "^7.2.8", + "react-resize-detector": "^7.1.2", + "react-reverse-portal": "^2.1.1", + "react-router-dom": "^5.3.4", "react-search-input": "^0.11.3", - "react-select": "^3.1.0", - "react-sortable-hoc": "^1.11.0", + "react-select": "^3.2.0", + "react-sortable-hoc": "^2.0.0", "react-split": "^2.0.9", - "react-sticky": "^6.0.3", "react-syntax-highlighter": "^15.4.5", - "react-table": "^7.6.3", + "react-table": "^7.8.0", "react-transition-group": "^2.5.3", - "react-ultimate-pagination": "^1.2.0", + "react-ultimate-pagination": "^1.3.0", "react-virtualized": "9.19.1", - "react-virtualized-auto-sizer": "^1.0.2", - "react-virtualized-select": "^3.1.3", - "react-window": "^1.8.5", + "react-virtualized-auto-sizer": "^1.0.7", + "react-window": "^1.8.8", "redux": "^4.0.5", "redux-localstorage": "^0.4.1", "redux-thunk": "^2.1.0", @@ -202,30 +207,31 @@ "shortid": "^2.2.6", "tinycolor2": "^1.4.2", "urijs": "^1.19.8", - "use-immer": "^0.6.0", + "use-immer": "^0.8.1", "use-query-params": "^1.1.9", "yargs": "^15.4.1" }, "devDependencies": { - "@applitools/eyes-storybook": "^3.27.6", "@ag-grid-community/react": "^26.0.0", "@ag-grid-enterprise/all-modules": "^26.0.0", - "@babel/cli": "^7.16.0", - "@babel/compat-data": "^7.15.0", - "@babel/core": "^7.15.5", - "@babel/eslint-parser": "^7.15.7", - "@babel/node": "^7.15.4", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@applitools/eyes-storybook": "^3.30.1", + "@babel/cli": "^7.18.10", + "@babel/compat-data": "^7.18.8", + "@babel/core": "^7.18.10", + "@babel/eslint-parser": "^7.18.9", + "@babel/node": "^7.18.10", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.15.0", - "@babel/preset-env": "^7.15.6", - "@babel/preset-react": "^7.14.5", - "@babel/register": "^7.15.3", + "@babel/plugin-transform-runtime": "^7.18.10", + "@babel/preset-env": "^7.18.10", + "@babel/preset-react": "^7.18.6", + "@babel/register": "^7.18.9", "@emotion/jest": "^11.3.0", "@hot-loader/react-dom": "^16.13.0", "@istanbuljs/nyc-config-typescript": "^1.0.1", "@storybook/addon-actions": "^6.4.22", + "@storybook/addon-docs": "^6.5.10", "@storybook/addon-essentials": "^6.4.22", "@storybook/addon-knobs": "^6.3.1", "@storybook/addon-links": "^6.4.22", @@ -247,7 +253,7 @@ "@types/jest": "^26.0.3", "@types/jquery": "^3.5.8", "@types/js-levenshtein": "^1.1.0", - "@types/json-bigint": "^1.0.0", + "@types/json-bigint": "^1.0.1", "@types/react": "^16.9.43", "@types/react-dom": "^16.9.8", "@types/react-gravatar": "^2.6.8", @@ -255,13 +261,12 @@ "@types/react-jsonschema-form": "^1.7.4", "@types/react-loadable": "^5.5.6", "@types/react-redux": "^7.1.10", - "@types/react-router-dom": "^5.1.5", + "@types/react-router-dom": "^5.3.3", "@types/react-select": "^3.0.19", - "@types/react-sticky": "^6.0.3", "@types/react-table": "^7.0.19", "@types/react-ultimate-pagination": "^1.2.0", "@types/react-virtualized": "^9.21.10", - "@types/react-window": "^1.8.2", + "@types/react-window": "^1.8.5", "@types/redux-localstorage": "^1.0.8", "@types/redux-mock-store": "^1.0.2", "@types/rison": "0.0.6", @@ -276,12 +281,13 @@ "babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-jsx-remove-data-test-id": "^2.1.3", "babel-plugin-lodash": "^3.3.4", + "chromatic": "^6.7.4", "copy-webpack-plugin": "^9.0.1", "cross-env": "^5.2.0", "css-loader": "^6.2.0", "css-minimizer-webpack-plugin": "^3.0.2", - "enzyme": "^3.10.0", - "enzyme-adapter-react-16": "^1.14.0", + "enzyme": "^3.11.0", + "enzyme-adapter-react-16": "^1.15.7", "eslint": "^7.32.0", "eslint-config-airbnb": "^18.2.1", "eslint-config-prettier": "^7.1.0", @@ -302,14 +308,15 @@ "exports-loader": "^0.7.0", "fetch-mock": "^7.7.3", "fork-ts-checker-webpack-plugin": "^6.3.3", + "history": "^4.10.1", "ignore-styles": "^5.0.1", "imports-loader": "^3.0.0", "jest": "^26.6.3", "jest-environment-enzyme": "^7.1.2", "jest-enzyme": "^7.1.2", "jest-websocket-mock": "^2.2.0", - "jsdom": "^16.4.0", - "lerna": "^4.0.0", + "jsdom": "^20.0.0", + "lerna": "^6.1.0", "less": "^3.12.2", "less-loader": "^10.2.0", "mini-css-extract-plugin": "^2.3.0", @@ -335,12 +342,14 @@ "webpack": "^5.52.1", "webpack-bundle-analyzer": "^4.4.2", "webpack-cli": "^4.8.0", - "webpack-dev-server": "^4.2.0", + "webpack-dev-server": "^4.10.1", "webpack-manifest-plugin": "^4.0.2", "webpack-sources": "^3.2.0" }, "engines": { "node": "^16.9.1", "npm": "^7.5.4 || ^8.1.2" - } + }, + "readme": "ERROR: No README data found!", + "_id": "superset@0.0.0-dev" } diff --git a/superset-frontend/packages/generator-superset/generators/plugin-chart/templates/src/MyChart.erb b/superset-frontend/packages/generator-superset/generators/plugin-chart/templates/src/MyChart.erb index 63e400b3746f..1b9a2b4a9df3 100644 --- a/superset-frontend/packages/generator-superset/generators/plugin-chart/templates/src/MyChart.erb +++ b/superset-frontend/packages/generator-superset/generators/plugin-chart/templates/src/MyChart.erb @@ -64,7 +64,7 @@ export default function <%= packageLabel %>(props: <%= packageLabel %>Props) { const rootElem = createRef<HTMLDivElement>(); - // Often, you just want to get a hold of the DOM and go nuts. + // Often, you just want to access the DOM and do whatever you want. // Here, you can do that with createRef, and the useEffect hook. useEffect(() => { const root = rootElem.current as HTMLElement; diff --git a/superset-frontend/packages/generator-superset/generators/plugin-chart/templates/src/plugin/controlPanel.erb b/superset-frontend/packages/generator-superset/generators/plugin-chart/templates/src/plugin/controlPanel.erb index 92e644a2ab52..998e68b68589 100644 --- a/superset-frontend/packages/generator-superset/generators/plugin-chart/templates/src/plugin/controlPanel.erb +++ b/superset-frontend/packages/generator-superset/generators/plugin-chart/templates/src/plugin/controlPanel.erb @@ -30,7 +30,7 @@ const config: ControlPanelConfig = { * * There are several predefined controls that can be used. * Some examples: - * - groupby: columns to group by (tranlated to GROUP BY statement) + * - groupby: columns to group by (translated to GROUP BY statement) * - series: same as groupby, but single selection. * - metrics: multiple metrics (translated to aggregate expression) * - metric: sane as metrics, but single selection @@ -91,7 +91,7 @@ const config: ControlPanelConfig = { * by the `@superset-ui/core/lib/validator`: * - validateNonEmpty: must have at least one value * - validateInteger: must be an integer value - * - validateNumber: must be an intger or decimal value + * - validateNumber: must be an integer or decimal value */ // For control input types, see: superset-frontend/src/explore/components/controls/index.js diff --git a/superset-frontend/packages/generator-superset/package.json b/superset-frontend/packages/generator-superset/package.json index 2011a1b22e86..36a622f3f939 100644 --- a/superset-frontend/packages/generator-superset/package.json +++ b/superset-frontend/packages/generator-superset/package.json @@ -2,40 +2,40 @@ "name": "@superset-ui/generator-superset", "version": "0.18.25", "description": "Scaffolder for Superset", + "keywords": [ + "yeoman", + "generator", + "superset", + "yeoman-generator" + ], + "homepage": "https://github.com/apache/superset#readme", "bugs": { - "url": "https://github.com/apache-superset/superset-ui/issues" + "url": "https://github.com/apache/superset/issues" }, - "homepage": "https://github.com/apache-superset/superset-ui#readme", "repository": { "type": "git", - "url": "git+https://github.com/apache-superset/superset-ui.git" + "url": "git+https://github.com/apache/superset.git" }, + "license": "Apache-2.0", "author": "Superset", + "main": "generators/index.js", "files": [ "generators" ], - "main": "generators/index.js", - "keywords": [ - "yeoman", - "generator", - "superset", - "yeoman-generator" - ], + "dependencies": { + "chalk": "^4.0.0", + "lodash": "^4.17.11", + "yeoman-generator": "^5.7.0", + "yosay": "^2.0.2" + }, "devDependencies": { + "fs-extra": "^10.0.0", "yeoman-assert": "^3.1.0", - "yeoman-test": "^6.2.0", - "fs-extra": "^10.0.0" + "yeoman-test": "^6.2.0" }, "engines": { "npm": ">= 4.0.0" }, - "dependencies": { - "chalk": "^4.0.0", - "lodash": "^4.17.11", - "yeoman-generator": "^4.0.0", - "yosay": "^2.0.2" - }, - "license": "Apache-2.0", "publishConfig": { "access": "public" } diff --git a/superset-frontend/packages/superset-ui-chart-controls/package.json b/superset-frontend/packages/superset-ui-chart-controls/package.json index 93019ad457f5..4773f8c078cb 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/package.json +++ b/superset-frontend/packages/superset-ui-chart-controls/package.json @@ -39,11 +39,11 @@ "@testing-library/react-hooks": "^5.0.3", "@testing-library/user-event": "^12.7.0", "ace-builds": "^1.4.14", - "antd": "^4.9.4", + "antd": "4.10.3", "brace": "^0.11.1", "memoize-one": "^5.1.1", "react": "^16.13.1", - "react-ace": "^9.4.4", + "react-ace": "^10.1.0", "react-dom": "^16.13.1" }, "publishConfig": { diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx index c132b0918d69..649aeaf3dc72 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx @@ -54,11 +54,7 @@ const TooltipSection = ({ ); export const isLabelTruncated = (labelRef?: React.RefObject<any>): boolean => - !!( - labelRef && - labelRef.current && - labelRef.current.scrollWidth > labelRef.current.clientWidth - ); + !!(labelRef?.current?.scrollWidth > labelRef?.current?.clientWidth); export const getColumnLabelText = (column: ColumnMeta): string => column.verbose_name || column.column_name; @@ -68,7 +64,7 @@ export const getColumnTooltipNode = ( labelRef?: React.RefObject<any>, ): ReactNode => { if ( - !column.verbose_name && + (!column.column_name || !column.verbose_name) && !column.description && !isLabelTruncated(labelRef) ) { @@ -77,7 +73,9 @@ export const getColumnTooltipNode = ( return ( <> - <TooltipSection label={t('Column name')} text={column.column_name} /> + {column.column_name && ( + <TooltipSection label={t('Column name')} text={column.column_name} /> + )} {column.verbose_name && ( <TooltipSection label={t('Label')} text={column.verbose_name} /> )} diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/constants.ts b/superset-frontend/packages/superset-ui-chart-controls/src/constants.ts index 265874f5e666..f410c4479a35 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/constants.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/constants.ts @@ -31,7 +31,6 @@ export const TIME_FILTER_LABELS = { time_range: t('Time Range'), granularity_sqla: t('Time Column'), time_grain_sqla: t('Time Grain'), - druid_time_origin: t('Origin'), granularity: t('Time Granularity'), }; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/fixtures.ts b/superset-frontend/packages/superset-ui-chart-controls/src/fixtures.ts new file mode 100644 index 000000000000..71c4dd31189b --- /dev/null +++ b/superset-frontend/packages/superset-ui-chart-controls/src/fixtures.ts @@ -0,0 +1,149 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { DatasourceType } from '@superset-ui/core'; +import { Dataset } from './types'; + +export const TestDataset: Dataset = { + column_format: {}, + columns: [ + { + advanced_data_type: undefined, + certification_details: null, + certified_by: null, + column_name: 'num', + description: null, + expression: '', + filterable: true, + groupby: true, + id: 332, + is_certified: false, + is_dttm: false, + python_date_format: null, + type: 'BIGINT', + type_generic: 0, + verbose_name: null, + warning_markdown: null, + }, + { + advanced_data_type: undefined, + certification_details: null, + certified_by: null, + column_name: 'gender', + description: null, + expression: '', + filterable: true, + groupby: true, + id: 330, + is_certified: false, + is_dttm: false, + python_date_format: null, + type: 'VARCHAR(16)', + type_generic: 1, + verbose_name: '', + warning_markdown: null, + }, + { + advanced_data_type: undefined, + certification_details: null, + certified_by: null, + column_name: 'state', + description: null, + expression: '', + filterable: true, + groupby: true, + id: 333, + is_certified: false, + is_dttm: false, + python_date_format: null, + type: 'VARCHAR(10)', + type_generic: 1, + verbose_name: null, + warning_markdown: null, + }, + { + advanced_data_type: undefined, + certification_details: null, + certified_by: null, + column_name: 'ds', + description: null, + expression: '', + filterable: true, + groupby: true, + id: 329, + is_certified: false, + is_dttm: true, + python_date_format: null, + type: 'TIMESTAMP WITHOUT TIME ZONE', + type_generic: 2, + verbose_name: null, + warning_markdown: null, + }, + { + advanced_data_type: undefined, + certification_details: null, + certified_by: null, + column_name: 'name', + description: null, + expression: '', + filterable: true, + groupby: true, + id: 331, + is_certified: false, + is_dttm: false, + python_date_format: null, + type: 'VARCHAR(255)', + type_generic: 1, + verbose_name: null, + warning_markdown: null, + }, + ], + datasource_name: 'birth_names', + description: null, + granularity_sqla: 'ds', + id: 2, + main_dttm_col: 'ds', + metrics: [ + { + certification_details: null, + certified_by: null, + d3format: null, + description: null, + expression: 'COUNT(*)', + id: 7, + is_certified: false, + metric_name: 'count', + verbose_name: 'COUNT(*)', + warning_markdown: '', + warning_text: null, + }, + ], + name: 'public.birth_names', + order_by_choices: [], + owners: [ + { + first_name: 'admin', + id: 1, + last_name: 'user', + username: 'admin', + }, + ], + type: DatasourceType.Dataset, + uid: '2__table', + verbose_map: {}, +}; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/index.ts b/superset-frontend/packages/superset-ui-chart-controls/src/index.ts index 8a151d10e2a4..7c57a3e1709a 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/index.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/index.ts @@ -30,14 +30,6 @@ export * from './components/ColumnOption'; export * from './components/ColumnTypeLabel/ColumnTypeLabel'; export * from './components/MetricOption'; -// React control components -export { - sharedControls, - dndEntity, - dndColumnsControl, -} from './shared-controls'; -export { default as sharedControlComponents } from './shared-controls/components'; -export { legacySortBy } from './shared-controls/legacySortBy'; -export * from './shared-controls/emitFilterControl'; -export * from './shared-controls/components'; +export * from './shared-controls'; export * from './types'; +export * from './fixtures'; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/operators/pivotOperator.ts b/superset-frontend/packages/superset-ui-chart-controls/src/operators/pivotOperator.ts index f8e9f025b0b6..3adec29fecec 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/operators/pivotOperator.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/operators/pivotOperator.ts @@ -17,11 +17,11 @@ * under the License. */ import { - DTTM_ALIAS, ensureIsArray, getColumnLabel, getMetricLabel, PostProcessingPivot, + getXAxisLabel, } from '@superset-ui/core'; import { PostProcessingFactory } from './types'; @@ -30,23 +30,21 @@ export const pivotOperator: PostProcessingFactory<PostProcessingPivot> = ( queryObject, ) => { const metricLabels = ensureIsArray(queryObject.metrics).map(getMetricLabel); - const { x_axis: xAxis } = formData; + const xAxisLabel = getXAxisLabel(formData); + const columns = queryObject.series_columns || queryObject.columns; - if ((xAxis || queryObject.is_timeseries) && metricLabels.length) { - const index = [getColumnLabel(xAxis || DTTM_ALIAS)]; + if (xAxisLabel && metricLabels.length) { return { operation: 'pivot', options: { - index, - columns: ensureIsArray(queryObject.columns).map(getColumnLabel), + index: [xAxisLabel], + columns: ensureIsArray(columns).map(getColumnLabel), // Create 'dummy' mean aggregates to assign cell values in pivot table // use the 'mean' aggregates to avoid drop NaN. PR: https://github.com/apache-superset/superset-ui/pull/1231 aggregates: Object.fromEntries( metricLabels.map(metric => [metric, { operator: 'mean' }]), ), - drop_missing_columns: false, - flatten_columns: false, - reset_index: false, + drop_missing_columns: !formData?.show_empty_columns, }, }; } diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/operators/prophetOperator.ts b/superset-frontend/packages/superset-ui-chart-controls/src/operators/prophetOperator.ts index ff0fa0fb6544..269dc1e80169 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/operators/prophetOperator.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/operators/prophetOperator.ts @@ -16,11 +16,7 @@ * specific language governing permissions and limitationsxw * under the License. */ -import { - DTTM_ALIAS, - getColumnLabel, - PostProcessingProphet, -} from '@superset-ui/core'; +import { PostProcessingProphet, getXAxisLabel } from '@superset-ui/core'; import { PostProcessingFactory } from './types'; /* eslint-disable @typescript-eslint/no-unused-vars */ @@ -28,8 +24,8 @@ export const prophetOperator: PostProcessingFactory<PostProcessingProphet> = ( formData, queryObject, ) => { - const index = getColumnLabel(formData.x_axis || DTTM_ALIAS); - if (formData.forecastEnabled) { + const xAxisLabel = getXAxisLabel(formData); + if (formData.forecastEnabled && xAxisLabel) { return { operation: 'prophet', options: { @@ -39,7 +35,7 @@ export const prophetOperator: PostProcessingFactory<PostProcessingProphet> = ( yearly_seasonality: formData.forecastSeasonalityYearly, weekly_seasonality: formData.forecastSeasonalityWeekly, daily_seasonality: formData.forecastSeasonalityDaily, - index, + index: xAxisLabel, }, }; } diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/operators/renameOperator.ts b/superset-frontend/packages/superset-ui-chart-controls/src/operators/renameOperator.ts index 84cbbce8c5fd..04f3b7ac327f 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/operators/renameOperator.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/operators/renameOperator.ts @@ -21,7 +21,8 @@ import { PostProcessingRename, ensureIsArray, getMetricLabel, - ComparisionType, + ComparisonType, + getXAxisLabel, } from '@superset-ui/core'; import { PostProcessingFactory } from './types'; import { getMetricOffsetsMap, isTimeComparison } from './utils'; @@ -31,26 +32,29 @@ export const renameOperator: PostProcessingFactory<PostProcessingRename> = ( queryObject, ) => { const metrics = ensureIsArray(queryObject.metrics); - const columns = ensureIsArray(queryObject.columns); - const { x_axis: xAxis, truncate_metric } = formData; + const columns = ensureIsArray( + queryObject.series_columns || queryObject.columns, + ); + const { truncate_metric } = formData; + const xAxisLabel = getXAxisLabel(formData); // remove or rename top level of column name(metric name) in the MultiIndex when // 1) only 1 metric - // 2) exist dimentsion - // 3) exist xAxis - // 4) exist time comparison, and comparison type is "actual values" + // 2) dimension exist + // 3) xAxis exist + // 4) time comparison exist, and comparison type is "actual values" // 5) truncate_metric in form_data and truncate_metric is true if ( metrics.length === 1 && columns.length > 0 && - (xAxis || queryObject.is_timeseries) && + xAxisLabel && !( // todo: we should provide an approach to handle derived metrics ( isTimeComparison(formData, queryObject) && [ - ComparisionType.Difference, - ComparisionType.Ratio, - ComparisionType.Percentage, + ComparisonType.Difference, + ComparisonType.Ratio, + ComparisonType.Percentage, ].includes(formData.comparison_type) ) ) && @@ -64,7 +68,7 @@ export const renameOperator: PostProcessingFactory<PostProcessingRename> = ( // we will rename the "metric" from the metricWithOffset label // for example: "count__1 year ago" => "1 year ago" isTimeComparison(formData, queryObject) && - formData.comparison_type === ComparisionType.Values + formData.comparison_type === ComparisonType.Values ) { const metricOffsetMap = getMetricOffsetsMap(formData, queryObject); const timeOffsets = ensureIsArray(formData.time_compare); diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/operators/sortOperator.ts b/superset-frontend/packages/superset-ui-chart-controls/src/operators/sortOperator.ts index 277d2df559ce..0650c8b57785 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/operators/sortOperator.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/operators/sortOperator.ts @@ -1,4 +1,3 @@ -/* eslint-disable camelcase */ /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -17,25 +16,50 @@ * specific language governing permissions and limitationsxw * under the License. */ -import { DTTM_ALIAS, PostProcessingSort, RollingType } from '@superset-ui/core'; +import { isEmpty } from 'lodash'; +import { + ensureIsArray, + getMetricLabel, + getXAxisLabel, + hasGenericChartAxes, + isDefined, + PostProcessingSort, +} from '@superset-ui/core'; import { PostProcessingFactory } from './types'; export const sortOperator: PostProcessingFactory<PostProcessingSort> = ( formData, queryObject, ) => { - const { x_axis: xAxis } = formData; + // the sortOperator only used in the barchart v2 + const sortableLabels = [ + getXAxisLabel(formData), + ...ensureIsArray(formData.metrics).map(metric => getMetricLabel(metric)), + ].filter(Boolean); + if ( - (xAxis || queryObject.is_timeseries) && - Object.values(RollingType).includes(formData.rolling_type) + hasGenericChartAxes && + isDefined(formData?.x_axis_sort) && + isDefined(formData?.x_axis_sort_asc) && + sortableLabels.includes(formData.x_axis_sort) && + // the sort operator doesn't support sort-by multiple series. + isEmpty(formData.groupby) ) { - const index = xAxis || DTTM_ALIAS; + if (formData.x_axis_sort === getXAxisLabel(formData)) { + return { + operation: 'sort', + options: { + is_sort_index: true, + ascending: formData.x_axis_sort_asc, + }, + }; + } + return { operation: 'sort', options: { - columns: { - [index]: true, - }, + by: formData.x_axis_sort, + ascending: formData.x_axis_sort_asc, }, }; } diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/operators/timeCompareOperator.ts b/superset-frontend/packages/superset-ui-chart-controls/src/operators/timeCompareOperator.ts index 3fe253edfdfd..da72c664c9a4 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/operators/timeCompareOperator.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/operators/timeCompareOperator.ts @@ -17,7 +17,7 @@ * specific language governing permissions and limitationsxw * under the License. */ -import { ComparisionType, PostProcessingCompare } from '@superset-ui/core'; +import { ComparisonType, PostProcessingCompare } from '@superset-ui/core'; import { getMetricOffsetsMap, isTimeComparison } from './utils'; import { PostProcessingFactory } from './types'; @@ -28,7 +28,7 @@ export const timeCompareOperator: PostProcessingFactory<PostProcessingCompare> = if ( isTimeComparison(formData, queryObject) && - comparisonType !== ComparisionType.Values + comparisonType !== ComparisonType.Values ) { return { operation: 'compare', diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/operators/timeComparePivotOperator.ts b/superset-frontend/packages/superset-ui-chart-controls/src/operators/timeComparePivotOperator.ts index 3851d62a3635..a6214901aa07 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/operators/timeComparePivotOperator.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/operators/timeComparePivotOperator.ts @@ -18,11 +18,11 @@ * under the License. */ import { - DTTM_ALIAS, ensureIsArray, getColumnLabel, NumpyFunction, PostProcessingPivot, + getXAxisLabel, } from '@superset-ui/core'; import { getMetricOffsetsMap, isTimeComparison } from './utils'; import { PostProcessingFactory } from './types'; @@ -30,8 +30,10 @@ import { PostProcessingFactory } from './types'; export const timeComparePivotOperator: PostProcessingFactory<PostProcessingPivot> = (formData, queryObject) => { const metricOffsetMap = getMetricOffsetsMap(formData, queryObject); + const xAxisLabel = getXAxisLabel(formData); + const columns = queryObject.series_columns || queryObject.columns; - if (isTimeComparison(formData, queryObject)) { + if (isTimeComparison(formData, queryObject) && xAxisLabel) { const aggregates = Object.fromEntries( [...metricOffsetMap.values(), ...metricOffsetMap.keys()].map(metric => [ metric, @@ -39,16 +41,13 @@ export const timeComparePivotOperator: PostProcessingFactory<PostProcessingPivot { operator: 'mean' as NumpyFunction }, ]), ); - const index = [getColumnLabel(formData.x_axis || DTTM_ALIAS)]; return { operation: 'pivot', options: { - index, - columns: ensureIsArray(queryObject.columns).map(getColumnLabel), - drop_missing_columns: false, - flatten_columns: false, - reset_index: false, + index: [xAxisLabel], + columns: ensureIsArray(columns).map(getColumnLabel), + drop_missing_columns: !formData?.show_empty_columns, aggregates, }, }; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/operators/utils/isDerivedSeries.ts b/superset-frontend/packages/superset-ui-chart-controls/src/operators/utils/isDerivedSeries.ts index 24623e5570f3..67815756f842 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/operators/utils/isDerivedSeries.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/operators/utils/isDerivedSeries.ts @@ -21,7 +21,7 @@ import { ensureIsArray, JsonObject, QueryFormData, - ComparisionType, + ComparisonType, } from '@superset-ui/core'; import { isString } from 'lodash'; @@ -30,7 +30,7 @@ export const isDerivedSeries = ( formData: QueryFormData, ): boolean => { const comparisonType = formData.comparison_type; - if (comparisonType !== ComparisionType.Values) { + if (comparisonType !== ComparisonType.Values) { return false; } diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/operators/utils/isTimeComparison.ts b/superset-frontend/packages/superset-ui-chart-controls/src/operators/utils/isTimeComparison.ts index 4430b9541cdb..674e26333e41 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/operators/utils/isTimeComparison.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/operators/utils/isTimeComparison.ts @@ -17,7 +17,7 @@ * specific language governing permissions and limitationsxw * under the License. */ -import { ComparisionType } from '@superset-ui/core'; +import { ComparisonType } from '@superset-ui/core'; import { getMetricOffsetsMap } from './getMetricOffsetsMap'; import { PostProcessingFactory } from '../types'; @@ -29,7 +29,7 @@ export const isTimeComparison: PostProcessingFactory<boolean> = ( const metricOffsetMap = getMetricOffsetsMap(formData, queryObject); return ( - Object.values(ComparisionType).includes(comparisonType) && + Object.values(ComparisonType).includes(comparisonType) && metricOffsetMap.size > 0 ); }; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx index 1ed664b7de62..f17139cf1051 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx @@ -17,7 +17,7 @@ * under the License. */ import React from 'react'; -import { t, RollingType, ComparisionType } from '@superset-ui/core'; +import { t, RollingType, ComparisonType } from '@superset-ui/core'; import { ControlPanelSectionConfig } from '../types'; import { formatSelectOptions } from '../utils'; @@ -108,18 +108,18 @@ export const advancedAnalyticsControls: ControlPanelSectionConfig = { multi: true, freeForm: true, label: t('Time shift'), - choices: formatSelectOptions([ - '1 day ago', - '1 week ago', - '28 days ago', - '30 days ago', - '52 weeks ago', - '1 year ago', - '104 weeks ago', - '2 years ago', - '156 weeks ago', - '3 years ago', - ]), + choices: [ + ['1 day ago', t('1 day ago')], + ['1 week ago', t('1 week ago')], + ['28 days ago', t('28 days ago')], + ['30 days ago', t('30 days ago')], + ['52 weeks ago', t('52 weeks ago')], + ['1 year ago', t('1 year ago')], + ['104 weeks ago', t('104 weeks ago')], + ['2 years ago', t('2 years ago')], + ['156 weeks ago', t('156 weeks ago')], + ['3 years ago', t('3 years ago')], + ], description: t( 'Overlay one or more timeseries from a ' + 'relative time period. Expects relative time deltas ' + @@ -137,10 +137,10 @@ export const advancedAnalyticsControls: ControlPanelSectionConfig = { label: t('Calculation type'), default: 'values', choices: [ - [ComparisionType.Values, 'Actual values'], - [ComparisionType.Difference, 'Difference'], - [ComparisionType.Percentage, 'Percentage change'], - [ComparisionType.Ratio, 'Ratio'], + [ComparisonType.Values, t('Actual values')], + [ComparisonType.Difference, t('Difference')], + [ComparisonType.Percentage, t('Percentage change')], + [ComparisonType.Ratio, t('Ratio')], ], description: t( 'How to display time shifts: as individual lines; as the ' + @@ -160,14 +160,14 @@ export const advancedAnalyticsControls: ControlPanelSectionConfig = { label: t('Rule'), default: null, choices: [ - ['1T', '1 minutely frequency'], - ['1H', '1 hourly frequency'], - ['1D', '1 calendar day frequency'], - ['7D', '7 calendar day frequency'], - ['1MS', '1 month start frequency'], - ['1M', '1 month end frequency'], - ['1AS', '1 year start frequency'], - ['1A', '1 year end frequency'], + ['1T', t('1 minutely frequency')], + ['1H', t('1 hourly frequency')], + ['1D', t('1 calendar day frequency')], + ['7D', t('7 calendar day frequency')], + ['1MS', t('1 month start frequency')], + ['1M', t('1 month end frequency')], + ['1AS', t('1 year start frequency')], + ['1A', t('1 year end frequency')], ], description: t('Pandas resample rule'), }, @@ -178,18 +178,17 @@ export const advancedAnalyticsControls: ControlPanelSectionConfig = { name: 'resample_method', config: { type: 'SelectControl', - freeForm: true, label: t('Fill method'), default: null, choices: [ - ['asfreq', 'Null imputation'], - ['zerofill', 'Zero imputation'], - ['linear', 'Linear interpolation'], - ['ffill', 'Forward values'], - ['bfill', 'Backward values'], - ['median', 'Median values'], - ['mean', 'Mean values'], - ['sum', 'Sum values'], + ['asfreq', t('Null imputation')], + ['zerofill', t('Zero imputation')], + ['linear', t('Linear interpolation')], + ['ffill', t('Forward values')], + ['bfill', t('Backward values')], + ['median', t('Median values')], + ['mean', t('Mean values')], + ['sum', t('Sum values')], ], description: t('Pandas resample method'), }, diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx index eda3ac33152d..5e010c27e2f5 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx @@ -24,7 +24,10 @@ import { formatSelectOptions } from '../utils'; export const TITLE_MARGIN_OPTIONS: number[] = [ 15, 30, 50, 75, 100, 125, 150, 200, ]; -export const TITLE_POSITION_OPTIONS: string[] = ['Left', 'Top']; +export const TITLE_POSITION_OPTIONS: [string, string][] = [ + ['Left', t('Left')], + ['Top', t('Top')], +]; export const titleControls: ControlPanelSectionConfig = { label: t('Chart Title'), tabOverride: 'customize', @@ -95,8 +98,8 @@ export const titleControls: ControlPanelSectionConfig = { clearable: false, label: t('Y AXIS TITLE POSITION'), renderTrigger: true, - default: TITLE_POSITION_OPTIONS[0], - choices: formatSelectOptions(TITLE_POSITION_OPTIONS), + default: TITLE_POSITION_OPTIONS[0][0], + choices: TITLE_POSITION_OPTIONS, description: t('Changing this control takes effect instantly'), }, }, diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/sections/echartsTimeSeriesQuery.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/sections/echartsTimeSeriesQuery.tsx new file mode 100644 index 000000000000..cd58780d892d --- /dev/null +++ b/superset-frontend/packages/superset-ui-chart-controls/src/sections/echartsTimeSeriesQuery.tsx @@ -0,0 +1,60 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { hasGenericChartAxes, t } from '@superset-ui/core'; +import { ControlPanelSectionConfig, ControlSetRow } from '../types'; +import { + contributionModeControl, + xAxisSortControl, + xAxisSortAscControl, +} from '../shared-controls'; + +const controlsWithoutXAxis: ControlSetRow[] = [ + ['metrics'], + ['groupby'], + [contributionModeControl], + ['adhoc_filters'], + ['limit'], + ['timeseries_limit_metric'], + ['order_desc'], + ['row_limit'], + ['truncate_metric'], + ['show_empty_columns'], +]; + +export const echartsTimeSeriesQuery: ControlPanelSectionConfig = { + label: t('Query'), + expanded: true, + controlSetRows: [ + [hasGenericChartAxes ? 'x_axis' : null], + [hasGenericChartAxes ? 'time_grain_sqla' : null], + ...controlsWithoutXAxis, + ], +}; + +export const echartsTimeSeriesQueryWithXAxisSort: ControlPanelSectionConfig = { + label: t('Query'), + expanded: true, + controlSetRows: [ + [hasGenericChartAxes ? 'x_axis' : null], + [hasGenericChartAxes ? 'time_grain_sqla' : null], + [hasGenericChartAxes ? xAxisSortControl : null], + [hasGenericChartAxes ? xAxisSortAscControl : null], + ...controlsWithoutXAxis, + ], +}; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx index 527bd3854005..1dff19b83c41 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx @@ -82,11 +82,11 @@ export const forecastIntervalControls: ControlPanelSectionConfig = { config: { type: 'SelectControl', freeForm: true, - label: 'Yearly seasonality', + label: t('Yearly seasonality'), choices: [ - [null, 'default'], - [true, 'Yes'], - [false, 'No'], + [null, t('default')], + [true, t('Yes')], + [false, t('No')], ], default: FORECAST_DEFAULT_DATA.forecastSeasonalityYearly, description: t( @@ -101,11 +101,11 @@ export const forecastIntervalControls: ControlPanelSectionConfig = { config: { type: 'SelectControl', freeForm: true, - label: 'Weekly seasonality', + label: t('Weekly seasonality'), choices: [ - [null, 'default'], - [true, 'Yes'], - [false, 'No'], + [null, t('default')], + [true, t('Yes')], + [false, t('No')], ], default: FORECAST_DEFAULT_DATA.forecastSeasonalityWeekly, description: t( @@ -120,11 +120,11 @@ export const forecastIntervalControls: ControlPanelSectionConfig = { config: { type: 'SelectControl', freeForm: true, - label: 'Daily seasonality', + label: t('Daily seasonality'), choices: [ - [null, 'default'], - [true, 'Yes'], - [false, 'No'], + [null, t('default')], + [true, t('Yes')], + [false, t('No')], ], default: FORECAST_DEFAULT_DATA.forecastSeasonalityDaily, description: t( diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/sections/index.ts b/superset-frontend/packages/superset-ui-chart-controls/src/sections/index.ts index 2f6496e67ab7..c0113b189fd8 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/sections/index.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/sections/index.ts @@ -22,3 +22,4 @@ export * from './advancedAnalytics'; export * from './annotationsAndLayers'; export * from './forecastInterval'; export * from './chartTitle'; +export * from './echartsTimeSeriesQuery'; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx index 17c9e5042385..4535f1996dd7 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { t } from '@superset-ui/core'; +import { hasGenericChartAxes, t } from '@superset-ui/core'; import { ControlPanelSectionConfig } from '../types'; // A few standard controls sections that are used internally. @@ -32,17 +32,29 @@ export const legacyTimeseriesTime: ControlPanelSectionConfig = { ...baseTimeSection, controlSetRows: [ ['granularity'], - ['druid_time_origin'], ['granularity_sqla'], ['time_grain_sqla'], ['time_range'], ], }; -export const legacyRegularTime: ControlPanelSectionConfig = { - ...baseTimeSection, - controlSetRows: [['granularity_sqla'], ['time_range']], -}; +export const genericTime: ControlPanelSectionConfig = hasGenericChartAxes + ? { controlSetRows: [] } + : { + ...baseTimeSection, + controlSetRows: [ + ['granularity_sqla'], + ['time_grain_sqla'], + ['time_range'], + ], + }; + +export const legacyRegularTime: ControlPanelSectionConfig = hasGenericChartAxes + ? { controlSetRows: [] } + : { + ...baseTimeSection, + controlSetRows: [['granularity_sqla'], ['time_range']], + }; export const datasourceAndVizType: ControlPanelSectionConfig = { label: t('Datasource & Chart Type'), diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx index 55c560cb7935..548dd4ae4d7f 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx @@ -40,7 +40,6 @@ export type ColumnConfigControlProps<T extends ColumnConfig> = queryResponse?: ChartDataResponseResult; configFormLayout?: ColumnConfigFormLayout; appliedColumnNames?: string[]; - emitFilter: boolean; }; /** @@ -57,24 +56,8 @@ export default function ColumnConfigControl<T extends ColumnConfig>({ value, onChange, configFormLayout = DEFAULT_CONFIG_FORM_LAYOUT, - emitFilter, ...props }: ColumnConfigControlProps<T>) { - if (emitFilter) { - Object.values(configFormLayout).forEach(array_of_array => { - if (!array_of_array.some(arr => arr.includes('emitTarget'))) { - array_of_array.push(['emitTarget']); - } - }); - } else { - Object.values(configFormLayout).forEach(array_of_array => { - const index = array_of_array.findIndex(arr => arr.includes('emitTarget')); - if (index > -1) { - array_of_array.splice(index, 1); - } - }); - } - const { colnames: _colnames, coltypes: _coltypes } = queryResponse || {}; let colnames: string[] = []; let coltypes: GenericDataType[] = []; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx index 150f1e91f0bb..7bf6c95c7401 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx @@ -35,24 +35,13 @@ export type SharedColumnConfigProp = | 'colorPositiveNegative' | 'columnWidth' | 'fractionDigits' - | 'emitTarget' | 'd3NumberFormat' | 'd3SmallNumberFormat' | 'd3TimeFormat' | 'horizontalAlign' + | 'truncateLongCells' | 'showCellBars'; -const emitTarget: ControlFormItemSpec<'Input'> = { - controlType: 'Input', - label: t('Emit Target'), - description: t( - 'If you wish to specify a different target column than the original column, it can be entered here', - ), - defaultValue: '', - debounceDelay: 500, - validators: undefined, -}; - const d3NumberFormat: ControlFormItemSpec<'Select'> = { controlType: 'Select', label: t('D3 format'), @@ -92,7 +81,7 @@ const columnWidth: ControlFormItemSpec<'InputNumber'> = { "Default minimal column width in pixels, actual width may still be larger than this if other columns don't need much space", ), width: 120, - placeholder: 'auto', + placeholder: t('auto'), debounceDelay: 400, validators: [validateNumber], }; @@ -142,23 +131,31 @@ const colorPositiveNegative: ControlFormItemSpec<'Checkbox'> = { debounceDelay: 200, }; +const truncateLongCells: ControlFormItemSpec<'Checkbox'> = { + controlType: 'Checkbox', + label: t('Truncate Cells'), + description: t('Truncate long cells to the "min width" set above'), + defaultValue: false, + debounceDelay: 400, +}; + /** * All configurable column formatting properties. */ export const SHARED_COLUMN_CONFIG_PROPS = { d3NumberFormat, - emitTarget, d3SmallNumberFormat: { ...d3NumberFormat, label: t('Small number format'), description: t( 'D3 number format for numbers between -1.0 and 1.0, ' + - 'useful when you want to have different siginificant digits for small and large numbers', + 'useful when you want to have different significant digits for small and large numbers', ), }, d3TimeFormat, fractionDigits, columnWidth, + truncateLongCells, horizontalAlign, showCellBars, alignPositiveNegative, @@ -175,6 +172,7 @@ export const DEFAULT_CONFIG_FORM_LAYOUT: ColumnConfigFormLayout = { 'columnWidth', { name: 'horizontalAlign', override: { defaultValue: 'left' } }, ], + ['truncateLongCells'], ], [GenericDataType.NUMERIC]: [ [ diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx new file mode 100644 index 000000000000..979912e58f1d --- /dev/null +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx @@ -0,0 +1,122 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + ContributionType, + ensureIsArray, + getColumnLabel, + getMetricLabel, + isDefined, + isEqualArray, + QueryFormColumn, + QueryFormMetric, + t, +} from '@superset-ui/core'; +import { ControlPanelState, ControlState, ControlStateMapping } from '../types'; +import { isTemporalColumn } from '../utils'; + +export const contributionModeControl = { + name: 'contributionMode', + config: { + type: 'SelectControl', + label: t('Contribution Mode'), + default: null, + choices: [ + [null, t('None')], + [ContributionType.Row, t('Row')], + [ContributionType.Column, t('Series')], + ], + description: t('Calculate contribution per series or row'), + }, +}; + +const xAxisSortVisibility = ({ controls }: { controls: ControlStateMapping }) => + isDefined(controls?.x_axis?.value) && + !isTemporalColumn( + getColumnLabel(controls?.x_axis?.value as QueryFormColumn), + controls?.datasource?.datasource, + ) && + Array.isArray(controls?.groupby?.value) && + controls.groupby.value.length === 0; + +export const xAxisSortControl = { + name: 'x_axis_sort', + config: { + type: 'XAxisSortControl', + label: t('X-Axis Sort By'), + description: t('Whether to sort descending or ascending on the X-Axis.'), + shouldMapStateToProps: ( + prevState: ControlPanelState, + state: ControlPanelState, + ) => { + const prevOptions = [ + getColumnLabel(prevState?.controls?.x_axis?.value as QueryFormColumn), + ...ensureIsArray(prevState?.controls?.metrics?.value).map(metric => + getMetricLabel(metric as QueryFormMetric), + ), + ]; + const currOptions = [ + getColumnLabel(state?.controls?.x_axis?.value as QueryFormColumn), + ...ensureIsArray(state?.controls?.metrics?.value).map(metric => + getMetricLabel(metric as QueryFormMetric), + ), + ]; + return !isEqualArray(prevOptions, currOptions); + }, + mapStateToProps: ( + { controls }: { controls: ControlStateMapping }, + controlState: ControlState, + ) => { + const choices = [ + getColumnLabel(controls?.x_axis?.value as QueryFormColumn), + ...ensureIsArray(controls?.metrics?.value).map(metric => + getMetricLabel(metric as QueryFormMetric), + ), + ].filter(Boolean); + const shouldReset = !( + typeof controlState.value === 'string' && + choices.includes(controlState.value) && + !isTemporalColumn( + getColumnLabel(controls?.x_axis?.value as QueryFormColumn), + controls?.datasource?.datasource, + ) + ); + + return { + shouldReset, + options: choices.map(entry => ({ + value: entry, + label: entry, + })), + }; + }, + visibility: xAxisSortVisibility, + }, +}; + +export const xAxisSortAscControl = { + name: 'x_axis_sort_asc', + config: { + type: 'CheckboxControl', + label: t('X-Axis Sort Ascending'), + default: true, + description: t('Whether to sort descending or ascending on the X-Axis.'), + visibility: xAxisSortVisibility, + }, +}; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx index ce63590f740b..840c5c3611a8 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx @@ -17,50 +17,92 @@ * specific language governing permissions and limitations * under the License. */ +import React, { useMemo } from 'react'; import { FeatureFlag, isFeatureEnabled, QueryColumn, - QueryResponse, t, validateNonEmpty, } from '@superset-ui/core'; -import { ExtraControlProps, SharedControlConfig, Dataset } from '../types'; +import { + ExtraControlProps, + SharedControlConfig, + Dataset, + Metric, + isDataset, +} from '../types'; import { DATASET_TIME_COLUMN_OPTION, TIME_FILTER_LABELS } from '../constants'; -import { QUERY_TIME_COLUMN_OPTION, defineSavedMetrics } from '..'; +import { + QUERY_TIME_COLUMN_OPTION, + defineSavedMetrics, + ColumnOption, + ColumnMeta, + FilterOption, + temporalColumnMixin, + datePickerInAdhocFilterMixin, + xAxisMixin, +} from '..'; + +type Control = { + savedMetrics?: Metric[] | null; + default?: unknown; +}; + +/* + * Note: Previous to the commit that introduced this comment, the shared controls module + * would check feature flags at module execution time and expose a different control + * configuration (component + props) depending on the status of drag-and-drop feature + * flags. This commit combines those configs, merging the required props for both the + * drag-and-drop and non-drag-and-drop components, and renders a wrapper component that + * checks feature flags at component render time to avoid race conditions between when + * feature flags are set and when they're checked. + */ -export const dndGroupByControl: SharedControlConfig<'DndColumnSelect'> = { +export const dndGroupByControl: SharedControlConfig< + 'DndColumnSelect' | 'SelectControl', + ColumnMeta +> = { type: 'DndColumnSelect', label: t('Dimensions'), + multi: true, + freeForm: true, + clearable: true, default: [], + includeTime: false, description: t( - 'One or many columns to group by. High cardinality groupings should include a series limit ' + - 'to limit the number of fetched and rendered series.', + 'One or many columns to group by. High cardinality groupings should include a sort by metric ' + + 'and series limit to limit the number of fetched and rendered series.', ), - mapStateToProps(state, { includeTime }) { + optionRenderer: (c: ColumnMeta) => <ColumnOption showType column={c} />, + valueRenderer: (c: ColumnMeta) => <ColumnOption column={c} />, + valueKey: 'column_name', + allowAll: true, + filterOption: ({ data: opt }: FilterOption<ColumnMeta>, text: string) => + opt.column_name?.toLowerCase().includes(text.toLowerCase()) || + opt.verbose_name?.toLowerCase().includes(text.toLowerCase()) || + false, + promptTextCreator: (label: unknown) => label, + mapStateToProps(state, controlState) { const newState: ExtraControlProps = {}; const { datasource } = state; if (datasource?.columns[0]?.hasOwnProperty('groupby')) { const options = (datasource as Dataset).columns.filter(c => c.groupby); - if (includeTime) { + if (controlState?.includeTime) { options.unshift(DATASET_TIME_COLUMN_OPTION); } - newState.options = Object.fromEntries( - options.map(option => [option.column_name, option]), - ); + newState.options = options; newState.savedMetrics = (datasource as Dataset).metrics || []; } else { - const options = datasource?.columns; - if (includeTime) { - (options as QueryColumn[])?.unshift(QUERY_TIME_COLUMN_OPTION); + const options = (datasource?.columns as QueryColumn[]) || []; + if (controlState?.includeTime) { + options.unshift(QUERY_TIME_COLUMN_OPTION); } - newState.options = Object.fromEntries( - (options as QueryColumn[])?.map(option => [option.name, option]), - ); - newState.options = datasource?.columns; + newState.options = options; } return newState; }, + commaChoosesOption: false, }; export const dndColumnsControl: typeof dndGroupByControl = { @@ -69,9 +111,9 @@ export const dndColumnsControl: typeof dndGroupByControl = { description: t('One or many columns to pivot as columns'), }; -export const dndSeries: typeof dndGroupByControl = { +export const dndSeriesControl: typeof dndGroupByControl = { ...dndGroupByControl, - label: t('Dimensions'), + label: t('Dimension'), multi: false, default: null, description: t( @@ -81,7 +123,7 @@ export const dndSeries: typeof dndGroupByControl = { ), }; -export const dndEntity: typeof dndGroupByControl = { +export const dndEntityControl: typeof dndGroupByControl = { ...dndGroupByControl, label: t('Entity'), default: null, @@ -90,14 +132,16 @@ export const dndEntity: typeof dndGroupByControl = { description: t('This defines the element to be plotted on the chart'), }; -export const dnd_adhoc_filters: SharedControlConfig<'DndFilterSelect'> = { +export const dndAdhocFilterControl: SharedControlConfig< + 'DndFilterSelect' | 'AdhocFilterControl' +> = { type: 'DndFilterSelect', label: t('Filters'), default: [], description: '', mapStateToProps: ({ datasource, form_data }) => ({ - columns: datasource?.columns[0]?.hasOwnProperty('filterable') - ? (datasource as Dataset)?.columns.filter(c => c.filterable) + columns: isDataset(datasource) + ? datasource.columns.filter(c => c.filterable) : datasource?.columns || [], savedMetrics: defineSavedMetrics(datasource), // current active adhoc metrics @@ -106,9 +150,12 @@ export const dnd_adhoc_filters: SharedControlConfig<'DndFilterSelect'> = { datasource, }), provideFormDataToProps: true, + ...datePickerInAdhocFilterMixin, }; -export const dnd_adhoc_metrics: SharedControlConfig<'DndMetricSelect'> = { +export const dndAdhocMetricsControl: SharedControlConfig< + 'DndMetricSelect' | 'MetricsControl' +> = { type: 'DndMetricSelect', multi: true, label: t('Metrics'), @@ -122,20 +169,23 @@ export const dnd_adhoc_metrics: SharedControlConfig<'DndMetricSelect'> = { description: t('One or many metrics to display'), }; -export const dnd_adhoc_metric: SharedControlConfig<'DndMetricSelect'> = { - ...dnd_adhoc_metrics, +export const dndAdhocMetricControl: typeof dndAdhocMetricsControl = { + ...dndAdhocMetricsControl, multi: false, label: t('Metric'), description: t('Metric'), }; -export const dnd_adhoc_metric_2: SharedControlConfig<'DndMetricSelect'> = { - ...dnd_adhoc_metric, +export const dndAdhocMetricControl2: typeof dndAdhocMetricControl = { + ...dndAdhocMetricControl, label: t('Right Axis Metric'), + clearable: true, description: t('Choose a metric for right axis'), }; -export const dnd_sort_by: SharedControlConfig<'DndMetricSelect'> = { +export const dndSortByControl: SharedControlConfig< + 'DndMetricSelect' | 'MetricsControl' +> = { type: 'DndMetricSelect', label: t('Sort by'), default: null, @@ -151,33 +201,38 @@ export const dnd_sort_by: SharedControlConfig<'DndMetricSelect'> = { }), }; -export const dnd_size: SharedControlConfig<'DndMetricSelect'> = { - ...dnd_adhoc_metric, +export const dndSizeControl: typeof dndAdhocMetricControl = { + ...dndAdhocMetricControl, label: t('Bubble Size'), description: t('Metric used to calculate bubble size'), + default: null, }; -export const dnd_x: SharedControlConfig<'DndMetricSelect'> = { - ...dnd_adhoc_metric, +export const dndXControl: typeof dndAdhocMetricControl = { + ...dndAdhocMetricControl, label: t('X Axis'), description: t('Metric assigned to the [X] axis'), + default: null, }; -export const dnd_y: SharedControlConfig<'DndMetricSelect'> = { - ...dnd_adhoc_metric, +export const dndYControl: typeof dndAdhocMetricControl = { + ...dndAdhocMetricControl, label: t('Y Axis'), description: t('Metric assigned to the [Y] axis'), + default: null, }; -export const dnd_secondary_metric: SharedControlConfig<'DndMetricSelect'> = { - ...dnd_adhoc_metric, +export const dndSecondaryMetricControl: typeof dndAdhocMetricControl = { + ...dndAdhocMetricControl, label: t('Color Metric'), + default: null, validators: [], description: t('A metric to use for color'), }; -export const dnd_granularity_sqla: typeof dndGroupByControl = { - ...dndSeries, +export const dndGranularitySqlaControl: typeof dndSeriesControl = { + ...dndSeriesControl, + ...temporalColumnMixin, label: TIME_FILTER_LABELS.granularity_sqla, description: t( 'The time column for the visualization. Note that you ' + @@ -186,39 +241,35 @@ export const dnd_granularity_sqla: typeof dndGroupByControl = { 'filter below is applied against this column or ' + 'expression', ), + default: (c: Control) => c.default, + clearable: false, canDelete: false, - ghostButtonText: t( - isFeatureEnabled(FeatureFlag.ENABLE_DND_WITH_CLICK_UX) - ? 'Drop a temporal column here or click' - : 'Drop temporal column here', - ), - mapStateToProps: ({ datasource }) => { - if (datasource?.columns[0]?.hasOwnProperty('column_name')) { - const temporalColumns = - (datasource as Dataset)?.columns?.filter(c => c.is_dttm) ?? []; - const options = Object.fromEntries( - temporalColumns.map(option => [option.column_name, option]), - ); - return { - options, - default: - (datasource as Dataset)?.main_dttm_col || - temporalColumns[0]?.column_name || - null, - isTemporal: true, - }; - } + ghostButtonText: t('Drop temporal column here'), + clickEnabledGhostButtonText: t('Drop a temporal column here or click'), + optionRenderer: (c: ColumnMeta) => <ColumnOption showType column={c} />, + valueRenderer: (c: ColumnMeta) => <ColumnOption column={c} />, + valueKey: 'column_name', +}; + +export const dndXAxisControl: typeof dndGroupByControl = { + ...dndGroupByControl, + ...xAxisMixin, +}; - const sortedQueryColumns = (datasource as QueryResponse)?.columns?.sort( - query => (query?.is_dttm ? -1 : 1), +export function withDndFallback( + DndComponent: React.ComponentType<any>, + FallbackComponent: React.ComponentType<any>, +) { + return function DndControl(props: any) { + const enableExploreDnd = useMemo( + () => isFeatureEnabled(FeatureFlag.ENABLE_EXPLORE_DRAG_AND_DROP), + [], ); - const options = Object.fromEntries( - sortedQueryColumns.map(option => [option.name, option]), + + return enableExploreDnd ? ( + <DndComponent {...props} /> + ) : ( + <FallbackComponent {...props} /> ); - return { - options, - default: sortedQueryColumns[0]?.name || null, - isTemporal: true, - }; - }, -}; + }; +} diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.ts b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.ts new file mode 100644 index 000000000000..acf3f3e8fdd5 --- /dev/null +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.ts @@ -0,0 +1,25 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +export { default as sharedControls } from './sharedControls'; +export { withDndFallback } from './dndControls'; +// React control components +export { default as sharedControlComponents } from './components'; +export * from './components'; +export * from './customControls'; +export * from './mixins'; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx deleted file mode 100644 index 5e8c64c6f96e..000000000000 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx +++ /dev/null @@ -1,603 +0,0 @@ -/* eslint-disable camelcase */ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** - * This file exports all controls available for use in chart plugins internal to Superset. - * It is not recommended to use the controls here for any third-party plugins. - * - * While the React components located in `controls/components` represent different - * types of controls (CheckboxControl, SelectControl, TextControl, ...), the controls here - * represent instances of control types, that can be reused across visualization types. - * - * When controls are reused across viz types, their values are carried over as a user - * changes the chart types. - * - * While the keys defined in the control itself get passed to the controlType as props, - * here's a list of the keys that are common to all controls, and as a result define the - * control interface. - */ -import React from 'react'; -import { isEmpty } from 'lodash'; -import { - FeatureFlag, - t, - getCategoricalSchemeRegistry, - getSequentialSchemeRegistry, - isFeatureEnabled, - SequentialScheme, - legacyValidateInteger, - validateNonEmpty, - ComparisionType, - QueryResponse, - QueryColumn, -} from '@superset-ui/core'; - -import { - formatSelectOptions, - D3_FORMAT_OPTIONS, - D3_FORMAT_DOCS, - D3_TIME_FORMAT_OPTIONS, - D3_TIME_FORMAT_DOCS, - DEFAULT_TIME_FORMAT, - DEFAULT_NUMBER_FORMAT, - defineSavedMetrics, -} from '../utils'; -import { TIME_FILTER_LABELS, DATASET_TIME_COLUMN_OPTION } from '../constants'; -import { - Metric, - SharedControlConfig, - ColumnMeta, - ExtraControlProps, - SelectControlConfig, - Dataset, -} from '../types'; -import { ColumnOption } from '../components/ColumnOption'; - -import { - dnd_adhoc_filters, - dnd_adhoc_metric, - dnd_adhoc_metrics, - dnd_granularity_sqla, - dnd_sort_by, - dnd_secondary_metric, - dnd_size, - dnd_x, - dnd_y, - dndColumnsControl, - dndEntity, - dndGroupByControl, - dndSeries, - dnd_adhoc_metric_2, -} from './dndControls'; -import { QUERY_TIME_COLUMN_OPTION } from '..'; - -const categoricalSchemeRegistry = getCategoricalSchemeRegistry(); -const sequentialSchemeRegistry = getSequentialSchemeRegistry(); - -export const PRIMARY_COLOR = { r: 0, g: 122, b: 135, a: 1 }; - -const ROW_LIMIT_OPTIONS = [10, 50, 100, 250, 500, 1000, 5000, 10000, 50000]; -const SERIES_LIMITS = [5, 10, 25, 50, 100, 500]; - -const appContainer = document.getElementById('app'); -const { user } = JSON.parse( - appContainer?.getAttribute('data-bootstrap') || '{}', -); - -type Control = { - savedMetrics?: Metric[] | null; - default?: unknown; -}; - -type SelectDefaultOption = { - label: string; - value: string; -}; - -const groupByControl: SharedControlConfig<'SelectControl', ColumnMeta> = { - type: 'SelectControl', - label: t('Dimensions'), - multi: true, - freeForm: true, - clearable: true, - default: [], - includeTime: false, - description: t( - 'One or many columns to group by. High cardinality groupings should include a sort by metric ' + - 'and series limit to limit the number of fetched and rendered series.', - ), - optionRenderer: c => <ColumnOption showType column={c} />, - valueRenderer: c => <ColumnOption column={c} />, - valueKey: 'column_name', - allowAll: true, - filterOption: ({ data: opt }, text: string) => - (opt.column_name && - opt.column_name.toLowerCase().includes(text.toLowerCase())) || - (opt.verbose_name && - opt.verbose_name.toLowerCase().includes(text.toLowerCase())) || - false, - promptTextCreator: (label: unknown) => label, - mapStateToProps(state, { includeTime }) { - const newState: ExtraControlProps = {}; - const { datasource } = state; - if (datasource?.columns[0]?.hasOwnProperty('groupby')) { - const options = (datasource as Dataset).columns.filter(c => c.groupby); - if (includeTime) options.unshift(DATASET_TIME_COLUMN_OPTION); - newState.options = options; - } else { - const options = (datasource as QueryResponse).columns; - if (includeTime) options.unshift(QUERY_TIME_COLUMN_OPTION); - newState.options = options; - } - return newState; - }, - commaChoosesOption: false, -}; - -const metrics: SharedControlConfig<'MetricsControl'> = { - type: 'MetricsControl', - multi: true, - label: t('Metrics'), - validators: [validateNonEmpty], - mapStateToProps: ({ datasource }) => ({ - columns: datasource?.columns || [], - savedMetrics: defineSavedMetrics(datasource), - datasource, - datasourceType: datasource?.type, - }), - description: t('One or many metrics to display'), -}; - -const metric: SharedControlConfig<'MetricsControl'> = { - ...metrics, - multi: false, - label: t('Metric'), - description: t('Metric'), -}; - -const datasourceControl: SharedControlConfig<'DatasourceControl'> = { - type: 'DatasourceControl', - label: t('Datasource'), - default: null, - description: null, - mapStateToProps: ({ datasource, form_data }) => ({ - datasource, - form_data, - user, - }), -}; - -const viz_type: SharedControlConfig<'VizTypeControl'> = { - type: 'VizTypeControl', - label: t('Visualization Type'), - default: 'table', - description: t('The type of visualization to display'), -}; - -const color_picker: SharedControlConfig<'ColorPickerControl'> = { - type: 'ColorPickerControl', - label: t('Fixed Color'), - description: t('Use this to define a static color for all circles'), - default: PRIMARY_COLOR, - renderTrigger: true, -}; - -const metric_2: SharedControlConfig<'MetricsControl'> = { - ...metric, - label: t('Right Axis Metric'), - clearable: true, - description: t('Choose a metric for right axis'), -}; - -const linear_color_scheme: SharedControlConfig<'ColorSchemeControl'> = { - type: 'ColorSchemeControl', - label: t('Linear Color Scheme'), - choices: () => - (sequentialSchemeRegistry.values() as SequentialScheme[]).map(value => [ - value.id, - value.label, - ]), - default: sequentialSchemeRegistry.getDefaultKey(), - clearable: false, - description: '', - renderTrigger: true, - schemes: () => sequentialSchemeRegistry.getMap(), - isLinear: true, - mapStateToProps: state => ({ - dashboardId: state?.form_data?.dashboardId, - }), -}; - -const secondary_metric: SharedControlConfig<'MetricsControl'> = { - ...metric, - label: t('Color Metric'), - default: null, - validators: [], - description: t('A metric to use for color'), -}; - -const columnsControl: typeof groupByControl = { - ...groupByControl, - label: t('Columns'), - description: t('One or many columns to pivot as columns'), -}; - -const druid_time_origin: SharedControlConfig<'SelectControl'> = { - type: 'SelectControl', - freeForm: true, - label: TIME_FILTER_LABELS.druid_time_origin, - choices: [ - ['', 'default'], - ['now', 'now'], - ], - default: null, - description: t( - 'Defines the origin where time buckets start, ' + - 'accepts natural dates as in `now`, `sunday` or `1970-01-01`', - ), -}; - -const granularity: SharedControlConfig<'SelectControl'> = { - type: 'SelectControl', - freeForm: true, - label: TIME_FILTER_LABELS.granularity, - default: 'one day', - choices: [ - [null, 'all'], - ['PT5S', '5 seconds'], - ['PT30S', '30 seconds'], - ['PT1M', '1 minute'], - ['PT5M', '5 minutes'], - ['PT30M', '30 minutes'], - ['PT1H', '1 hour'], - ['PT6H', '6 hour'], - ['P1D', '1 day'], - ['P7D', '7 days'], - ['P1W', 'week'], - ['week_starting_sunday', 'week starting Sunday'], - ['week_ending_saturday', 'week ending Saturday'], - ['P1M', 'month'], - ['P3M', 'quarter'], - ['P1Y', 'year'], - ], - description: t( - 'The time granularity for the visualization. Note that you ' + - 'can type and use simple natural language as in `10 seconds`, ' + - '`1 day` or `56 weeks`', - ), -}; - -const granularity_sqla: SharedControlConfig<'SelectControl', ColumnMeta> = { - type: 'SelectControl', - label: TIME_FILTER_LABELS.granularity_sqla, - description: t( - 'The time column for the visualization. Note that you ' + - 'can define arbitrary expression that return a DATETIME ' + - 'column in the table. Also note that the ' + - 'filter below is applied against this column or ' + - 'expression', - ), - default: (c: Control) => c.default, - clearable: false, - optionRenderer: c => <ColumnOption showType column={c} />, - valueRenderer: c => <ColumnOption column={c} />, - valueKey: 'column_name', - mapStateToProps: state => { - const props: Partial<SelectControlConfig<ColumnMeta | QueryColumn>> = {}; - const { datasource } = state; - - if (datasource?.hasOwnProperty('main_dttm_col')) { - const dataset = datasource as Dataset; - props.options = dataset.columns.filter((c: ColumnMeta) => c.is_dttm); - props.default = null; - if (dataset.main_dttm_col !== null) { - if (dataset.main_dttm_col) { - props.default = dataset.main_dttm_col; - } else if (props?.options.length > 0) { - props.default = (props.options[0] as ColumnMeta).column_name; - } - } else { - const sortedQueryColumns = (datasource as QueryResponse)?.columns - ?.filter(query => query?.is_dttm === true) - .sort(); - props.options = sortedQueryColumns; - if (props?.options.length > 0) { - props.default = - 'column_name' in props.options[0] - ? props.options[0]?.column_name - : props.options[0]?.name; - } - } - } else { - const sortedQueryColumns = (datasource as QueryResponse)?.columns - ?.filter(query => query?.is_dttm === true) - .sort(); - props.options = sortedQueryColumns; - if (props?.options.length > 0) { - props.default = - 'column_name' in props.options[0] - ? props.options[0]?.column_name - : props.options[0]?.name; - } - } - return props; - }, -}; - -const time_grain_sqla: SharedControlConfig<'SelectControl'> = { - type: 'SelectControl', - label: TIME_FILTER_LABELS.time_grain_sqla, - default: 'P1D', - description: t( - 'The time granularity for the visualization. This ' + - 'applies a date transformation to alter ' + - 'your time column and defines a new time granularity. ' + - 'The options here are defined on a per database ' + - 'engine basis in the Superset source code.', - ), - mapStateToProps: ({ datasource }) => ({ - choices: (datasource as Dataset)?.time_grain_sqla || null, - }), -}; - -const time_range: SharedControlConfig<'DateFilterControl'> = { - type: 'DateFilterControl', - freeForm: true, - label: TIME_FILTER_LABELS.time_range, - default: t('No filter'), // this value is translated, but the backend wouldn't understand a translated value? - description: t( - 'The time range for the visualization. All relative times, e.g. "Last month", ' + - '"Last 7 days", "now", etc. are evaluated on the server using the server\'s ' + - 'local time (sans timezone). All tooltips and placeholder times are expressed ' + - 'in UTC (sans timezone). The timestamps are then evaluated by the database ' + - "using the engine's local timezone. Note one can explicitly set the timezone " + - 'per the ISO 8601 format if specifying either the start and/or end time.', - ), - mapStateToProps: ({ datasource }) => ({ - datasource, - }), -}; - -const row_limit: SharedControlConfig<'SelectControl'> = { - type: 'SelectControl', - freeForm: true, - label: t('Row limit'), - validators: [legacyValidateInteger], - default: 10000, - choices: formatSelectOptions(ROW_LIMIT_OPTIONS), - description: t('Limits the number of rows that get displayed.'), -}; - -const order_desc: SharedControlConfig<'CheckboxControl'> = { - type: 'CheckboxControl', - label: t('Sort Descending'), - default: true, - description: t('Whether to sort descending or ascending'), - visibility: ({ controls }) => - Boolean( - controls?.timeseries_limit_metric.value && - !isEmpty(controls?.timeseries_limit_metric.value), - ), -}; - -const limit: SharedControlConfig<'SelectControl'> = { - type: 'SelectControl', - freeForm: true, - label: t('Series limit'), - validators: [legacyValidateInteger], - choices: formatSelectOptions(SERIES_LIMITS), - clearable: true, - description: t( - 'Limits the number of series that get displayed. A joined subquery (or an extra phase ' + - 'where subqueries are not supported) is applied to limit the number of series that get ' + - 'fetched and rendered. This feature is useful when grouping by high cardinality ' + - 'column(s) though does increase the query complexity and cost.', - ), -}; - -const series_limit: SharedControlConfig<'SelectControl'> = { - type: 'SelectControl', - freeForm: true, - label: t('Series limit'), - validators: [legacyValidateInteger], - choices: formatSelectOptions(SERIES_LIMITS), - description: t( - 'Limits the number of series that get displayed. A joined subquery (or an extra phase ' + - 'where subqueries are not supported) is applied to limit the number of series that get ' + - 'fetched and rendered. This feature is useful when grouping by high cardinality ' + - 'column(s) though does increase the query complexity and cost.', - ), -}; - -const sort_by: SharedControlConfig<'MetricsControl'> = { - type: 'MetricsControl', - label: t('Sort by'), - default: null, - description: t( - 'Metric used to define how the top series are sorted if a series or row limit is present. ' + - 'If undefined reverts to the first metric (where appropriate).', - ), - mapStateToProps: ({ datasource }) => ({ - columns: datasource?.columns || [], - savedMetrics: defineSavedMetrics(datasource), - datasource, - datasourceType: datasource?.type, - }), -}; - -const series: typeof groupByControl = { - ...groupByControl, - label: t('Dimensions'), - multi: false, - default: null, - description: t( - 'Defines the grouping of entities. ' + - 'Each series is shown as a specific color on the chart and ' + - 'has a legend toggle', - ), -}; - -const entity: typeof groupByControl = { - ...groupByControl, - label: t('Entity'), - default: null, - multi: false, - validators: [validateNonEmpty], - description: t('This defines the element to be plotted on the chart'), -}; - -const x: SharedControlConfig<'MetricsControl'> = { - ...metric, - label: t('X Axis'), - description: t('Metric assigned to the [X] axis'), - default: null, -}; - -const y: SharedControlConfig<'MetricsControl'> = { - ...metric, - label: t('Y Axis'), - default: null, - description: t('Metric assigned to the [Y] axis'), -}; - -const size: SharedControlConfig<'MetricsControl'> = { - ...metric, - label: t('Bubble Size'), - description: t('Metric used to calculate bubble size'), - default: null, -}; - -const y_axis_format: SharedControlConfig<'SelectControl', SelectDefaultOption> = - { - type: 'SelectControl', - freeForm: true, - label: t('Y Axis Format'), - renderTrigger: true, - default: DEFAULT_NUMBER_FORMAT, - choices: D3_FORMAT_OPTIONS, - description: D3_FORMAT_DOCS, - tokenSeparators: ['\n', '\t', ';'], - filterOption: ({ data: option }, search) => - option.label.includes(search) || option.value.includes(search), - mapStateToProps: state => { - const isPercentage = - state.controls?.comparison_type?.value === ComparisionType.Percentage; - return { - choices: isPercentage - ? D3_FORMAT_OPTIONS.filter(option => option[0].includes('%')) - : D3_FORMAT_OPTIONS, - }; - }, - }; - -const x_axis_time_format: SharedControlConfig< - 'SelectControl', - SelectDefaultOption -> = { - type: 'SelectControl', - freeForm: true, - label: t('Time format'), - renderTrigger: true, - default: DEFAULT_TIME_FORMAT, - choices: D3_TIME_FORMAT_OPTIONS, - description: D3_TIME_FORMAT_DOCS, - filterOption: ({ data: option }, search) => - option.label.includes(search) || option.value.includes(search), -}; - -const adhoc_filters: SharedControlConfig<'AdhocFilterControl'> = { - type: 'AdhocFilterControl', - label: t('Filters'), - default: [], - description: '', - mapStateToProps: ({ datasource, form_data }) => ({ - columns: datasource?.columns[0]?.hasOwnProperty('filterable') - ? (datasource as Dataset)?.columns.filter(c => c.filterable) - : datasource?.columns || [], - savedMetrics: defineSavedMetrics(datasource), - // current active adhoc metrics - selectedMetrics: - form_data.metrics || (form_data.metric ? [form_data.metric] : []), - datasource, - }), -}; - -const color_scheme: SharedControlConfig<'ColorSchemeControl'> = { - type: 'ColorSchemeControl', - label: t('Color Scheme'), - default: categoricalSchemeRegistry.getDefaultKey(), - renderTrigger: true, - choices: () => categoricalSchemeRegistry.keys().map(s => [s, s]), - description: t('The color scheme for rendering chart'), - schemes: () => categoricalSchemeRegistry.getMap(), - mapStateToProps: state => ({ - dashboardId: state?.form_data?.dashboardId, - }), -}; - -const truncate_metric: SharedControlConfig<'CheckboxControl'> = { - type: 'CheckboxControl', - label: t('Truncate Metric'), - default: true, - description: t('Whether to truncate metrics'), -}; - -const enableExploreDnd = isFeatureEnabled( - FeatureFlag.ENABLE_EXPLORE_DRAG_AND_DROP, -); - -const sharedControls = { - metrics: enableExploreDnd ? dnd_adhoc_metrics : metrics, - metric: enableExploreDnd ? dnd_adhoc_metric : metric, - datasource: datasourceControl, - viz_type, - color_picker, - metric_2: enableExploreDnd ? dnd_adhoc_metric_2 : metric_2, - linear_color_scheme, - secondary_metric: enableExploreDnd ? dnd_secondary_metric : secondary_metric, - groupby: enableExploreDnd ? dndGroupByControl : groupByControl, - columns: enableExploreDnd ? dndColumnsControl : columnsControl, - druid_time_origin, - granularity, - granularity_sqla: enableExploreDnd ? dnd_granularity_sqla : granularity_sqla, - time_grain_sqla, - time_range, - row_limit, - limit, - timeseries_limit_metric: enableExploreDnd ? dnd_sort_by : sort_by, - orderby: enableExploreDnd ? dnd_sort_by : sort_by, - order_desc, - series: enableExploreDnd ? dndSeries : series, - entity: enableExploreDnd ? dndEntity : entity, - x: enableExploreDnd ? dnd_x : x, - y: enableExploreDnd ? dnd_y : y, - size: enableExploreDnd ? dnd_size : size, - y_axis_format, - x_axis_time_format, - adhoc_filters: enableExploreDnd ? dnd_adhoc_filters : adhoc_filters, - color_scheme, - series_columns: enableExploreDnd ? dndColumnsControl : columnsControl, - series_limit, - series_limit_metric: enableExploreDnd ? dnd_sort_by : sort_by, - legacy_order_by: enableExploreDnd ? dnd_sort_by : sort_by, - truncate_metric, -}; - -export { sharedControls, dndEntity, dndColumnsControl }; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/mixins.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/mixins.tsx new file mode 100644 index 000000000000..0b19b96c7f6c --- /dev/null +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/mixins.tsx @@ -0,0 +1,121 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { + ensureIsArray, + hasGenericChartAxes, + NO_TIME_RANGE, + QueryFormData, + t, + validateNonEmpty, +} from '@superset-ui/core'; +import { BaseControlConfig, ControlPanelState, ControlState } from '../types'; +import { getTemporalColumns } from '../utils'; + +const getAxisLabel = ( + formData: QueryFormData, +): Record<'label' | 'description', string> => + formData?.orientation === 'horizontal' + ? { label: t('Y-axis'), description: t('Dimension to use on y-axis.') } + : { label: t('X-axis'), description: t('Dimension to use on x-axis.') }; + +export const xAxisMixin = { + label: (state: ControlPanelState) => getAxisLabel(state?.form_data).label, + multi: false, + description: (state: ControlPanelState) => + getAxisLabel(state?.form_data).description, + validators: [validateNonEmpty], + initialValue: (control: ControlState, state: ControlPanelState | null) => { + if ( + hasGenericChartAxes && + state?.form_data?.granularity_sqla && + !state.form_data?.x_axis && + !control?.value + ) { + return state.form_data.granularity_sqla; + } + return undefined; + }, + default: undefined, +}; + +export const temporalColumnMixin: Pick<BaseControlConfig, 'mapStateToProps'> = { + mapStateToProps: ({ datasource }) => { + const payload = getTemporalColumns(datasource); + + return { + options: payload.temporalColumns, + default: payload.defaultTemporalColumn, + isTemporal: true, + }; + }, +}; + +export const datePickerInAdhocFilterMixin: Pick< + BaseControlConfig, + 'initialValue' +> = { + initialValue: (control: ControlState, state: ControlPanelState | null) => { + // skip initialValue if + // 1) GENERIC_CHART_AXES is disabled + // 2) there was a time filter in adhoc filters + if ( + !hasGenericChartAxes || + ensureIsArray(control.value).findIndex( + (flt: any) => flt?.operator === 'TEMPORAL_RANGE', + ) > -1 + ) { + return undefined; + } + + // should migrate original granularity_sqla and time_range into adhoc filter + // 1) granularity_sqla and time_range are existed + if (state?.form_data?.granularity_sqla && state?.form_data?.time_range) { + return [ + ...ensureIsArray(control.value), + { + clause: 'WHERE', + subject: state.form_data.granularity_sqla, + operator: 'TEMPORAL_RANGE', + comparator: state.form_data.time_range, + expressionType: 'SIMPLE', + }, + ]; + } + + // should apply the default time filter into adhoc filter + // 1) temporal column is existed in current datasource + const temporalColumn = + state?.datasource && + getTemporalColumns(state.datasource).defaultTemporalColumn; + if (hasGenericChartAxes && temporalColumn) { + return [ + ...ensureIsArray(control.value), + { + clause: 'WHERE', + subject: temporalColumn, + operator: 'TEMPORAL_RANGE', + comparator: state?.common?.conf?.DEFAULT_TIME_FILTER || NO_TIME_RANGE, + expressionType: 'SIMPLE', + }, + ]; + } + + return undefined; + }, +}; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx new file mode 100644 index 000000000000..a4af8bcbf23f --- /dev/null +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx @@ -0,0 +1,409 @@ +/* eslint-disable camelcase */ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * This file exports all controls available for use in chart plugins internal to Superset. + * It is not recommended to use the controls here for any third-party plugins. + * + * While the React components located in `controls/components` represent different + * types of controls (CheckboxControl, SelectControl, TextControl, ...), the controls here + * represent instances of control types, that can be reused across visualization types. + * + * When controls are reused across viz types, their values are carried over as a user + * changes the chart types. + * + * While the keys defined in the control itself get passed to the controlType as props, + * here's a list of the keys that are common to all controls, and as a result define the + * control interface. + */ +import { isEmpty } from 'lodash'; +import { + t, + getCategoricalSchemeRegistry, + getSequentialSchemeRegistry, + SequentialScheme, + legacyValidateInteger, + ComparisonType, + isAdhocColumn, + isPhysicalColumn, + ensureIsArray, + isDefined, + hasGenericChartAxes, + NO_TIME_RANGE, +} from '@superset-ui/core'; + +import { + formatSelectOptions, + D3_FORMAT_OPTIONS, + D3_FORMAT_DOCS, + D3_TIME_FORMAT_OPTIONS, + D3_TIME_FORMAT_DOCS, + DEFAULT_TIME_FORMAT, + DEFAULT_NUMBER_FORMAT, +} from '../utils'; +import { TIME_FILTER_LABELS } from '../constants'; +import { + SharedControlConfig, + Dataset, + ColumnMeta, + ControlState, + ControlPanelState, +} from '../types'; + +import { + dndAdhocFilterControl, + dndAdhocMetricControl, + dndAdhocMetricsControl, + dndGranularitySqlaControl, + dndSortByControl, + dndSecondaryMetricControl, + dndSizeControl, + dndXControl, + dndYControl, + dndColumnsControl, + dndEntityControl, + dndGroupByControl, + dndSeriesControl, + dndAdhocMetricControl2, + dndXAxisControl, +} from './dndControls'; + +export { withDndFallback } from './dndControls'; + +const categoricalSchemeRegistry = getCategoricalSchemeRegistry(); +const sequentialSchemeRegistry = getSequentialSchemeRegistry(); + +export const PRIMARY_COLOR = { r: 0, g: 122, b: 135, a: 1 }; + +const ROW_LIMIT_OPTIONS = [10, 50, 100, 250, 500, 1000, 5000, 10000, 50000]; +const SERIES_LIMITS = [5, 10, 25, 50, 100, 500]; + +const appContainer = document.getElementById('app'); +const { user } = JSON.parse( + appContainer?.getAttribute('data-bootstrap') || '{}', +); + +type SelectDefaultOption = { + label: string; + value: string; +}; + +const datasourceControl: SharedControlConfig<'DatasourceControl'> = { + type: 'DatasourceControl', + label: t('Datasource'), + default: null, + description: null, + mapStateToProps: ({ datasource, form_data }) => ({ + datasource, + form_data, + user, + }), +}; + +const viz_type: SharedControlConfig<'VizTypeControl'> = { + type: 'VizTypeControl', + label: t('Visualization Type'), + default: 'table', + description: t('The type of visualization to display'), +}; + +const color_picker: SharedControlConfig<'ColorPickerControl'> = { + type: 'ColorPickerControl', + label: t('Fixed Color'), + description: t('Use this to define a static color for all circles'), + default: PRIMARY_COLOR, + renderTrigger: true, +}; + +const linear_color_scheme: SharedControlConfig<'ColorSchemeControl'> = { + type: 'ColorSchemeControl', + label: t('Linear Color Scheme'), + choices: () => + (sequentialSchemeRegistry.values() as SequentialScheme[]).map(value => [ + value.id, + value.label, + ]), + default: sequentialSchemeRegistry.getDefaultKey(), + clearable: false, + description: '', + renderTrigger: true, + schemes: () => sequentialSchemeRegistry.getMap(), + isLinear: true, + mapStateToProps: state => ({ + dashboardId: state?.form_data?.dashboardId, + }), +}; + +const granularity: SharedControlConfig<'SelectControl'> = { + type: 'SelectControl', + freeForm: true, + label: TIME_FILTER_LABELS.granularity, + default: 'one day', + choices: [ + [null, t('all')], + ['PT5S', t('5 seconds')], + ['PT30S', t('30 seconds')], + ['PT1M', t('1 minute')], + ['PT5M', t('5 minutes')], + ['PT30M', t('30 minutes')], + ['PT1H', t('1 hour')], + ['PT6H', t('6 hour')], + ['P1D', t('1 day')], + ['P7D', t('7 days')], + ['P1W', t('week')], + ['week_starting_sunday', t('week starting Sunday')], + ['week_ending_saturday', t('week ending Saturday')], + ['P1M', t('month')], + ['P3M', t('quarter')], + ['P1Y', t('year')], + ], + description: t( + 'The time granularity for the visualization. Note that you ' + + 'can type and use simple natural language as in `10 seconds`, ' + + '`1 day` or `56 weeks`', + ), +}; + +const time_grain_sqla: SharedControlConfig<'SelectControl'> = { + type: 'SelectControl', + label: TIME_FILTER_LABELS.time_grain_sqla, + placeholder: t('None'), + initialValue: (control: ControlState, state: ControlPanelState) => { + if (!isDefined(state)) { + // If a chart is in a Dashboard, the ControlPanelState is empty. + return control.value; + } + // If a chart is a new one that isn't saved, metadata is null. In this + // case we want to default P1D. If the chart has been saved, we want + // to use whichever value was chosen, either nothing or valid a time grain. + return state?.metadata || 'time_grain_sqla' in (state?.form_data ?? {}) + ? state?.form_data?.time_grain_sqla + : 'P1D'; + }, + description: t( + 'The time granularity for the visualization. This ' + + 'applies a date transformation to alter ' + + 'your time column and defines a new time granularity. ' + + 'The options here are defined on a per database ' + + 'engine basis in the Superset source code.', + ), + mapStateToProps: ({ datasource }) => ({ + choices: (datasource as Dataset)?.time_grain_sqla || [], + }), + visibility: ({ controls }) => { + if (!hasGenericChartAxes) { + return true; + } + + const xAxis = controls?.x_axis; + const xAxisValue = xAxis?.value; + if (isAdhocColumn(xAxisValue)) { + return true; + } + if (isPhysicalColumn(xAxisValue)) { + return !!(xAxis?.options ?? []).find( + (col: ColumnMeta) => col?.column_name === xAxisValue, + )?.is_dttm; + } + return false; + }, +}; + +const time_range: SharedControlConfig<'DateFilterControl'> = { + type: 'DateFilterControl', + freeForm: true, + label: TIME_FILTER_LABELS.time_range, + default: NO_TIME_RANGE, // this value is an empty filter constant so shouldn't translate it. + description: t( + 'The time range for the visualization. All relative times, e.g. "Last month", ' + + '"Last 7 days", "now", etc. are evaluated on the server using the server\'s ' + + 'local time (sans timezone). All tooltips and placeholder times are expressed ' + + 'in UTC (sans timezone). The timestamps are then evaluated by the database ' + + "using the engine's local timezone. Note one can explicitly set the timezone " + + 'per the ISO 8601 format if specifying either the start and/or end time.', + ), +}; + +const row_limit: SharedControlConfig<'SelectControl'> = { + type: 'SelectControl', + freeForm: true, + label: t('Row limit'), + validators: [legacyValidateInteger], + default: 10000, + choices: formatSelectOptions(ROW_LIMIT_OPTIONS), + description: t('Limits the number of rows that get displayed.'), +}; + +const order_desc: SharedControlConfig<'CheckboxControl'> = { + type: 'CheckboxControl', + label: t('Sort Descending'), + default: true, + description: t('Whether to sort descending or ascending'), + visibility: ({ controls }) => + Boolean( + controls?.timeseries_limit_metric.value && + !isEmpty(controls?.timeseries_limit_metric.value), + ), +}; + +const limit: SharedControlConfig<'SelectControl'> = { + type: 'SelectControl', + freeForm: true, + label: t('Series limit'), + placeholder: t('None'), + validators: [legacyValidateInteger], + choices: formatSelectOptions(SERIES_LIMITS), + clearable: true, + description: t( + 'Limits the number of series that get displayed. A joined subquery (or an extra phase ' + + 'where subqueries are not supported) is applied to limit the number of series that get ' + + 'fetched and rendered. This feature is useful when grouping by high cardinality ' + + 'column(s) though does increase the query complexity and cost.', + ), +}; + +const series_limit: SharedControlConfig<'SelectControl'> = { + type: 'SelectControl', + freeForm: true, + label: t('Series limit'), + placeholder: t('None'), + validators: [legacyValidateInteger], + choices: formatSelectOptions(SERIES_LIMITS), + description: t( + 'Limits the number of series that get displayed. A joined subquery (or an extra phase ' + + 'where subqueries are not supported) is applied to limit the number of series that get ' + + 'fetched and rendered. This feature is useful when grouping by high cardinality ' + + 'column(s) though does increase the query complexity and cost.', + ), +}; + +const y_axis_format: SharedControlConfig<'SelectControl', SelectDefaultOption> = + { + type: 'SelectControl', + freeForm: true, + label: t('Y Axis Format'), + renderTrigger: true, + default: DEFAULT_NUMBER_FORMAT, + choices: D3_FORMAT_OPTIONS, + description: D3_FORMAT_DOCS, + tokenSeparators: ['\n', '\t', ';'], + filterOption: ({ data: option }, search) => + option.label.includes(search) || option.value.includes(search), + mapStateToProps: state => { + const isPercentage = + state.controls?.comparison_type?.value === ComparisonType.Percentage; + return { + choices: isPercentage + ? D3_FORMAT_OPTIONS.filter(option => option[0].includes('%')) + : D3_FORMAT_OPTIONS, + }; + }, + }; + +const x_axis_time_format: SharedControlConfig< + 'SelectControl', + SelectDefaultOption +> = { + type: 'SelectControl', + freeForm: true, + label: t('Time format'), + renderTrigger: true, + default: DEFAULT_TIME_FORMAT, + choices: D3_TIME_FORMAT_OPTIONS, + description: D3_TIME_FORMAT_DOCS, + filterOption: ({ data: option }, search) => + option.label.includes(search) || option.value.includes(search), +}; + +const color_scheme: SharedControlConfig<'ColorSchemeControl'> = { + type: 'ColorSchemeControl', + label: t('Color Scheme'), + default: categoricalSchemeRegistry.getDefaultKey(), + renderTrigger: true, + choices: () => categoricalSchemeRegistry.keys().map(s => [s, s]), + description: t('The color scheme for rendering chart'), + schemes: () => categoricalSchemeRegistry.getMap(), + mapStateToProps: state => ({ + dashboardId: state?.form_data?.dashboardId, + }), +}; + +const truncate_metric: SharedControlConfig<'CheckboxControl'> = { + type: 'CheckboxControl', + label: t('Truncate Metric'), + default: true, + description: t('Whether to truncate metrics'), +}; + +const show_empty_columns: SharedControlConfig<'CheckboxControl'> = { + type: 'CheckboxControl', + label: t('Show empty columns'), + default: true, + description: t('Show empty columns'), +}; + +const temporal_columns_lookup: SharedControlConfig<'HiddenControl'> = { + type: 'HiddenControl', + initialValue: (control: ControlState, state: ControlPanelState | null) => + Object.fromEntries( + ensureIsArray<Record<string, any>>(state?.datasource?.columns) + .filter(option => option.is_dttm) + .map(option => [option.column_name ?? option.name, option.is_dttm]), + ), +}; + +export default { + metrics: dndAdhocMetricsControl, + metric: dndAdhocMetricControl, + datasource: datasourceControl, + viz_type, + color_picker, + metric_2: dndAdhocMetricControl2, + linear_color_scheme, + secondary_metric: dndSecondaryMetricControl, + groupby: dndGroupByControl, + columns: dndColumnsControl, + granularity, + granularity_sqla: dndGranularitySqlaControl, + time_grain_sqla, + time_range, + row_limit, + limit, + timeseries_limit_metric: dndSortByControl, + orderby: dndSortByControl, + order_desc, + series: dndSeriesControl, + entity: dndEntityControl, + x: dndXControl, + y: dndYControl, + size: dndSizeControl, + y_axis_format, + x_axis_time_format, + adhoc_filters: dndAdhocFilterControl, + color_scheme, + series_columns: dndColumnsControl, + series_limit, + series_limit_metric: dndSortByControl, + legacy_order_by: dndSortByControl, + truncate_metric, + x_axis: dndXAxisControl, + show_empty_columns, + temporal_columns_lookup, +}; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/types.ts b/superset-frontend/packages/superset-ui-chart-controls/src/types.ts index fac5548851d9..d4e91246ab11 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/types.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/types.ts @@ -22,6 +22,7 @@ import type { AdhocColumn, Column, DatasourceType, + JsonObject, JsonValue, Metric, QueryFormColumn, @@ -29,8 +30,7 @@ import type { QueryFormMetric, QueryResponse, } from '@superset-ui/core'; -import { sharedControls } from './shared-controls'; -import sharedControlComponents from './shared-controls/components'; +import { sharedControls, sharedControlComponents } from './shared-controls'; export type { Metric } from '@superset-ui/core'; export type { ControlFormItemSpec } from './components/ControlForm'; @@ -50,6 +50,14 @@ export type SharedControlComponents = typeof sharedControlComponents; /** ---------------------------------------------- * Input data/props while rendering * ---------------------------------------------*/ +export interface Owner { + first_name: string; + id: number; + last_name: string; + username: string; + email?: string; +} + export type ColumnMeta = Omit<Column, 'id'> & { id?: number; } & AnyDict; @@ -67,17 +75,24 @@ export interface Dataset { time_grain_sqla?: string; granularity_sqla?: string; datasource_name: string | null; + name?: string; description: string | null; + uid?: string; + owners?: Owner[]; + filter_select?: boolean; + filter_select_enabled?: boolean; } export interface ControlPanelState { form_data: QueryFormData; datasource: Dataset | QueryResponse | null; controls: ControlStateMapping; + common: JsonObject; + metadata?: JsonObject | null; } /** - * The action dispather will call Redux `dispatch` internally and return what's + * The action dispatcher will call Redux `dispatch` internally and return what's * returned from `dispatch`, which by default is the original or another action. */ export interface ActionDispatcher< @@ -185,7 +200,7 @@ export type TabOverride = 'data' | 'customize' | boolean; tab, or 'customize' if you want it to show up on that tam. Otherwise sections with ALL `renderTrigger: true` components will show up on the `Customize` tab. * - visibility: a function that uses control panel props to check whether a control should - * be visibile. + * be visible. */ export interface BaseControlConfig< T extends ControlType = ControlType, @@ -193,9 +208,24 @@ export interface BaseControlConfig< V = JsonValue, > extends AnyDict { type: T; - label?: ReactNode; - description?: ReactNode; + label?: + | ReactNode + | (( + state: ControlPanelState, + controlState: ControlState, + // TODO: add strict `chartState` typing (see superset-frontend/src/explore/types) + chartState?: AnyDict, + ) => ReactNode); + description?: + | ReactNode + | (( + state: ControlPanelState, + controlState: ControlState, + // TODO: add strict `chartState` typing (see superset-frontend/src/explore/types) + chartState?: AnyDict, + ) => ReactNode); default?: V; + initialValue?: V; renderTrigger?: boolean; validators?: ControlValueValidator<T, O, V>[]; warning?: ReactNode; @@ -336,37 +366,43 @@ export type ControlSetRow = ControlSetItem[]; // - superset-frontend/src/explore/components/ControlPanelsContainer.jsx // - superset-frontend/src/explore/components/ControlPanelSection.jsx export interface ControlPanelSectionConfig { - label: ReactNode; + label?: ReactNode; description?: ReactNode; expanded?: boolean; tabOverride?: TabOverride; controlSetRows: ControlSetRow[]; } -export interface StandardizedState { +export interface StandardizedControls { metrics: QueryFormMetric[]; columns: QueryFormColumn[]; } export interface StandardizedFormDataInterface { - standardizedState: StandardizedState; + // Controls not used in the current viz + controls: StandardizedControls; + // Transformation history memorizedFormData: Map<string, QueryFormData>; } +export type QueryStandardizedFormData = QueryFormData & { + standardizedFormData: StandardizedFormDataInterface; +}; + +export const isStandardizedFormData = ( + formData: QueryFormData, +): formData is QueryStandardizedFormData => + formData?.standardizedFormData?.controls && + formData?.standardizedFormData?.memorizedFormData && + Array.isArray(formData.standardizedFormData.controls.metrics) && + Array.isArray(formData.standardizedFormData.controls.columns); + export interface ControlPanelConfig { controlPanelSections: (ControlPanelSectionConfig | null)[]; controlOverrides?: ControlOverrides; sectionOverrides?: SectionOverrides; onInit?: (state: ControlStateMapping) => void; - denormalizeFormData?: ( - formData: QueryFormData & { - standardizedFormData: StandardizedFormDataInterface; - }, - ) => QueryFormData; - updateStandardizedState?: ( - prevState: StandardizedState, - currState: StandardizedState, - ) => StandardizedState; + formDataOverrides?: (formData: QueryFormData) => QueryFormData; } export type ControlOverrides = { @@ -416,10 +452,8 @@ export type ColorFormatters = { export default {}; -export function isColumnMeta( - column: AdhocColumn | ColumnMeta, -): column is ColumnMeta { - return 'column_name' in column; +export function isColumnMeta(column: AnyDict): column is ColumnMeta { + return !!column && 'column_name' in column; } export function isSavedExpression( @@ -430,12 +464,6 @@ export function isSavedExpression( ); } -export function isAdhocColumn( - column: AdhocColumn | ColumnMeta, -): column is AdhocColumn { - return 'label' in column && 'sqlExpression' in column; -} - export function isControlPanelSectionConfig( section: ControlPanelSectionConfig | null, ): section is ControlPanelSectionConfig { @@ -451,9 +479,5 @@ export function isDataset( export function isQueryResponse( datasource: Dataset | QueryResponse | null | undefined, ): datasource is QueryResponse { - return ( - !!datasource && - ('results' in datasource || - datasource?.type === ('query' as DatasourceType.Query)) - ); + return !!datasource && 'results' in datasource && 'sql' in datasource; } diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts b/superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts index 0e30f82d7b44..be703f9734fb 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts @@ -23,6 +23,13 @@ export const D3_FORMAT_DOCS = t( 'D3 format syntax: https://github.com/d3/d3-format', ); +export const D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT = t( + 'Only applies when "Label Type" is set to show values.', +); +export const D3_NUMBER_FORMAT_DESCRIPTION_PERCENTAGE_TEXT = t( + 'Only applies when "Label Type" is not set to a percentage.', +); + // input choices & options export const D3_FORMAT_OPTIONS: [string, string][] = [ [NumberFormats.SMART_NUMBER, t('Adaptive formatting')], diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/utils/expandControlConfig.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/utils/expandControlConfig.tsx index d06ad0d5127d..3ff734984145 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/utils/expandControlConfig.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/utils/expandControlConfig.tsx @@ -17,8 +17,7 @@ * under the License. */ import React, { ReactElement } from 'react'; -import { sharedControls } from '../shared-controls'; -import sharedControlComponents from '../shared-controls/components'; +import { sharedControls, sharedControlComponents } from '../shared-controls'; import { ControlType, ControlSetItem, @@ -75,7 +74,7 @@ export function expandControlConfig( // { // name: 'metric', // config: { - // type: 'SelectControl' | SelectComonent + // type: 'SelectControl' | SelectComponent // } // } if ('name' in control && 'config' in control) { diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/utils/getStandardizedControls.ts b/superset-frontend/packages/superset-ui-chart-controls/src/utils/getStandardizedControls.ts new file mode 100644 index 000000000000..42ff874c588d --- /dev/null +++ b/superset-frontend/packages/superset-ui-chart-controls/src/utils/getStandardizedControls.ts @@ -0,0 +1,68 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { makeSingleton, QueryFormData } from '@superset-ui/core'; +import { isStandardizedFormData, StandardizedControls } from '../types'; + +class StandardizedControlsManager { + controls: StandardizedControls; + + constructor() { + this.controls = { + metrics: [], + columns: [], + }; + } + + setStandardizedControls(formData: QueryFormData) { + if (isStandardizedFormData(formData)) { + const { controls } = formData.standardizedFormData; + this.controls = { + metrics: controls.metrics, + columns: controls.columns, + }; + } + } + + shiftMetric() { + return this.controls.metrics.shift(); + } + + shiftColumn() { + return this.controls.columns.shift(); + } + + popAllMetrics() { + return this.controls.metrics.splice(0, this.controls.metrics.length); + } + + popAllColumns() { + return this.controls.columns.splice(0, this.controls.columns.length); + } + + clear() { + this.controls = { + metrics: [], + columns: [], + }; + } +} + +export const getStandardizedControls = makeSingleton( + StandardizedControlsManager, +); diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/utils/getTemporalColumns.ts b/superset-frontend/packages/superset-ui-chart-controls/src/utils/getTemporalColumns.ts new file mode 100644 index 000000000000..718308d241a6 --- /dev/null +++ b/superset-frontend/packages/superset-ui-chart-controls/src/utils/getTemporalColumns.ts @@ -0,0 +1,77 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { + ensureIsArray, + isDefined, + QueryColumn, + ValueOf, +} from '@superset-ui/core'; +import { + ColumnMeta, + ControlPanelState, + isDataset, + isQueryResponse, +} from '@superset-ui/chart-controls'; + +export function getTemporalColumns( + datasource: ValueOf<Pick<ControlPanelState, 'datasource'>>, +) { + const rv: { + temporalColumns: ColumnMeta[] | QueryColumn[]; + defaultTemporalColumn: string | null | undefined; + } = { + temporalColumns: [], + defaultTemporalColumn: undefined, + }; + + if (isDataset(datasource)) { + rv.temporalColumns = ensureIsArray(datasource.columns).filter( + c => c.is_dttm, + ); + } + if (isQueryResponse(datasource)) { + rv.temporalColumns = ensureIsArray(datasource.columns).filter( + c => c.is_dttm, + ); + } + + if (isDataset(datasource)) { + rv.defaultTemporalColumn = datasource.main_dttm_col; + } + if (!isDefined(rv.defaultTemporalColumn)) { + rv.defaultTemporalColumn = + (rv.temporalColumns[0] as ColumnMeta)?.column_name ?? + (rv.temporalColumns[0] as QueryColumn)?.name; + } + + return rv; +} + +export function isTemporalColumn( + columnName: string, + datasource: ValueOf<Pick<ControlPanelState, 'datasource'>>, +): boolean { + const columns = getTemporalColumns(datasource).temporalColumns; + for (let i = 0; i < columns.length; i += 1) { + if (columns[i].column_name === columnName) { + return true; + } + } + return false; +} diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/utils/index.ts b/superset-frontend/packages/superset-ui-chart-controls/src/utils/index.ts index 11c03e4ca1fa..4fa4243c1e85 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/utils/index.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/utils/index.ts @@ -23,3 +23,5 @@ export * from './getColorFormatters'; export { default as mainMetric } from './mainMetric'; export { default as columnChoices } from './columnChoices'; export * from './defineSavedMetrics'; +export * from './getStandardizedControls'; +export * from './getTemporalColumns'; diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/operators/pivotOperator.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/operators/pivotOperator.test.ts index 326b7edd8573..2a527a04fe54 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/operators/pivotOperator.test.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/test/operators/pivotOperator.test.ts @@ -28,6 +28,7 @@ const formData: SqlaFormData = { granularity: 'month', datasource: 'foo', viz_type: 'table', + show_empty_columns: true, }; const queryObject: QueryObject = { metrics: [ @@ -55,21 +56,20 @@ const queryObject: QueryObject = { test('skip pivot', () => { expect(pivotOperator(formData, queryObject)).toEqual(undefined); - expect( - pivotOperator(formData, { ...queryObject, is_timeseries: false }), - ).toEqual(undefined); expect( pivotOperator(formData, { ...queryObject, - is_timeseries: true, metrics: [], }), ).toEqual(undefined); }); -test('pivot by __timestamp without groupby', () => { +test('pivot by __timestamp without columns', () => { expect( - pivotOperator(formData, { ...queryObject, is_timeseries: true }), + pivotOperator( + { ...formData, granularity_sqla: 'time_column' }, + queryObject, + ), ).toEqual({ operation: 'pivot', options: { @@ -80,19 +80,42 @@ test('pivot by __timestamp without groupby', () => { 'sum(val)': { operator: 'mean' }, }, drop_missing_columns: false, - flatten_columns: false, - reset_index: false, }, }); }); -test('pivot by __timestamp with groupby', () => { +test('pivot by __timestamp with columns', () => { expect( - pivotOperator(formData, { - ...queryObject, + pivotOperator( + { ...formData, granularity_sqla: 'time_column' }, + { + ...queryObject, + columns: ['foo', 'bar'], + }, + ), + ).toEqual({ + operation: 'pivot', + options: { + index: ['__timestamp'], columns: ['foo', 'bar'], - is_timeseries: true, - }), + aggregates: { + 'count(*)': { operator: 'mean' }, + 'sum(val)': { operator: 'mean' }, + }, + drop_missing_columns: false, + }, + }); +}); + +test('pivot by __timestamp with series_columns', () => { + expect( + pivotOperator( + { ...formData, granularity_sqla: 'time_column' }, + { + ...queryObject, + series_columns: ['foo', 'bar'], + }, + ), ).toEqual({ operation: 'pivot', options: { @@ -103,8 +126,6 @@ test('pivot by __timestamp with groupby', () => { 'sum(val)': { operator: 'mean' }, }, drop_missing_columns: false, - flatten_columns: false, - reset_index: false, }, }); }); @@ -118,7 +139,7 @@ test('pivot by x_axis with groupby', () => { }, { ...queryObject, - columns: ['foo', 'bar'], + series_columns: ['foo', 'bar'], }, ), ).toEqual({ @@ -131,8 +152,6 @@ test('pivot by x_axis with groupby', () => { 'sum(val)': { operator: 'mean' }, }, drop_missing_columns: false, - flatten_columns: false, - reset_index: false, }, }); }); @@ -145,12 +164,12 @@ test('pivot by adhoc x_axis', () => { x_axis: { label: 'my_case_expr', expressionType: 'SQL', - expression: 'case when a = 1 then 1 else 0 end', + sqlExpression: 'case when a = 1 then 1 else 0 end', }, }, { ...queryObject, - columns: ['foo', 'bar'], + series_columns: ['foo', 'bar'], }, ), ).toEqual({ @@ -163,8 +182,6 @@ test('pivot by adhoc x_axis', () => { 'sum(val)': { operator: 'mean' }, }, drop_missing_columns: false, - flatten_columns: false, - reset_index: false, }, }); }); diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/operators/prophetOperator.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/operators/prophetOperator.test.ts index 824efe5c15cc..9613584f8e7b 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/operators/prophetOperator.test.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/test/operators/prophetOperator.test.ts @@ -47,6 +47,7 @@ test('should do prophetOperator with default index', () => { prophetOperator( { ...formData, + granularity_sqla: 'time_column', forecastEnabled: true, forecastPeriods: '3', forecastInterval: '5', @@ -107,7 +108,7 @@ test('should do prophetOperator over adhoc column', () => { x_axis: { label: 'my_case_expr', expressionType: 'SQL', - expression: 'case when a = 1 then 1 else 0 end', + sqlExpression: 'case when a = 1 then 1 else 0 end', }, forecastEnabled: true, forecastPeriods: '3', diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/operators/renameOperator.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/operators/renameOperator.test.ts index 26bbe9e3695c..af9ebfebb3f0 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/operators/renameOperator.test.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/test/operators/renameOperator.test.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { ComparisionType, QueryObject, SqlaFormData } from '@superset-ui/core'; +import { ComparisonType, QueryObject, SqlaFormData } from '@superset-ui/core'; import { renameOperator } from '@superset-ui/chart-controls'; const formData: SqlaFormData = { @@ -49,7 +49,7 @@ test('should skip renameOperator if exists multiple metrics', () => { ).toEqual(undefined); }); -test('should skip renameOperator if does not exist series', () => { +test('should skip renameOperator if series does not exist', () => { expect( renameOperator(formData, { ...queryObject, @@ -74,9 +74,9 @@ test('should skip renameOperator if does not exist x_axis and is_timeseries', () test('should skip renameOperator if exists derived metrics', () => { [ - ComparisionType.Difference, - ComparisionType.Ratio, - ComparisionType.Percentage, + ComparisonType.Difference, + ComparisonType.Ratio, + ComparisonType.Percentage, ].forEach(type => { expect( renameOperator( @@ -105,12 +105,12 @@ test('should add renameOperator', () => { }); }); -test('should add renameOperator if does not exist x_axis', () => { +test('should add renameOperator if x_axis does not exist', () => { expect( renameOperator( { ...formData, - ...{ x_axis: null }, + ...{ x_axis: null, granularity_sqla: 'time column' }, }, queryObject, ), @@ -120,13 +120,32 @@ test('should add renameOperator if does not exist x_axis', () => { }); }); +test('should add renameOperator if based on series_columns', () => { + expect( + renameOperator( + { + ...formData, + ...{ x_axis: null, granularity_sqla: 'time column' }, + }, + { + ...queryObject, + columns: [], + series_columns: ['gender', 'dttm'], + }, + ), + ).toEqual({ + operation: 'rename', + options: { columns: { 'count(*)': null }, inplace: true, level: 0 }, + }); +}); + test('should add renameOperator if exist "actual value" time comparison', () => { expect( renameOperator( { ...formData, ...{ - comparison_type: ComparisionType.Values, + comparison_type: ComparisonType.Values, time_compare: ['1 year ago', '1 year later'], }, }, diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/operators/rollingWindowOperator.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/operators/rollingWindowOperator.test.ts index 5bd37a4d9c76..374f5c620208 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/operators/rollingWindowOperator.test.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/test/operators/rollingWindowOperator.test.ts @@ -107,8 +107,8 @@ test('rolling_type: sum/mean/std', () => { }); test('should append compared metrics when sets time compare type', () => { - const comparisionTypes = ['values', 'difference', 'percentage', 'ratio']; - comparisionTypes.forEach(cType => { + const comparisonTypes = ['values', 'difference', 'percentage', 'ratio']; + comparisonTypes.forEach(cType => { expect( rollingWindowOperator( { diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/operators/sortOperator.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/operators/sortOperator.test.ts index 6f0267d91305..750d726c902a 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/operators/sortOperator.test.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/test/operators/sortOperator.test.ts @@ -18,6 +18,7 @@ */ import { QueryObject, SqlaFormData } from '@superset-ui/core'; import { sortOperator } from '@superset-ui/chart-controls'; +import * as supersetCoreModule from '@superset-ui/core'; const formData: SqlaFormData = { metrics: [ @@ -52,92 +53,96 @@ const queryObject: QueryObject = { ], }; -test('skip sort', () => { +test('should ignore the sortOperator', () => { + // FF is disabled + Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', { + value: false, + }); expect(sortOperator(formData, queryObject)).toEqual(undefined); - expect( - sortOperator(formData, { ...queryObject, is_timeseries: false }), - ).toEqual(undefined); + + // FF is enabled + Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', { + value: true, + }); expect( sortOperator( - { ...formData, rolling_type: 'xxxx' }, - { ...queryObject, is_timeseries: true }, + { + ...formData, + ...{ + x_axis_sort: undefined, + x_axis_sort_asc: true, + }, + }, + queryObject, ), ).toEqual(undefined); - expect( - sortOperator(formData, { ...queryObject, is_timeseries: true }), - ).toEqual(undefined); -}); -test('sort by __timestamp', () => { - expect( - sortOperator( - { ...formData, rolling_type: 'cumsum' }, - { ...queryObject, is_timeseries: true }, - ), - ).toEqual({ - operation: 'sort', - options: { - columns: { - __timestamp: true, - }, - }, + // sortOperator doesn't support multiple series + Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', { + value: true, }); - expect( sortOperator( - { ...formData, rolling_type: 'sum' }, - { ...queryObject, is_timeseries: true }, - ), - ).toEqual({ - operation: 'sort', - options: { - columns: { - __timestamp: true, + { + ...formData, + ...{ + x_axis_sort: 'metric label', + x_axis_sort_asc: true, + groupby: ['col1'], + x_axis: 'axis column', + }, }, - }, - }); - - expect( - sortOperator( - { ...formData, rolling_type: 'mean' }, - { ...queryObject, is_timeseries: true }, + queryObject, ), - ).toEqual({ - operation: 'sort', - options: { - columns: { - __timestamp: true, - }, - }, - }); + ).toEqual(undefined); +}); +test('should sort by metric', () => { + Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', { + value: true, + }); expect( sortOperator( - { ...formData, rolling_type: 'std' }, - { ...queryObject, is_timeseries: true }, + { + ...formData, + ...{ + metrics: ['a metric label'], + x_axis_sort: 'a metric label', + x_axis_sort_asc: true, + }, + }, + queryObject, ), ).toEqual({ operation: 'sort', options: { - columns: { - __timestamp: true, - }, + by: 'a metric label', + ascending: true, }, }); }); -test('sort by named x-axis', () => { +test('should sort by axis', () => { + Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', { + value: true, + }); expect( sortOperator( - { ...formData, x_axis: 'ds', rolling_type: 'cumsum' }, - { ...queryObject }, + { + ...formData, + ...{ + x_axis_sort: 'Categorical Column', + x_axis_sort_asc: true, + x_axis: 'Categorical Column', + }, + }, + queryObject, ), ).toEqual({ operation: 'sort', options: { - columns: { - ds: true, - }, + is_sort_index: true, + ascending: true, }, }); }); diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/operators/timeCompareOperator.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/operators/timeCompareOperator.test.ts index a2e6b313801d..e775780b3ee7 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/operators/timeCompareOperator.test.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/test/operators/timeCompareOperator.test.ts @@ -51,8 +51,6 @@ const queryObject: QueryObject = { }, }, drop_missing_columns: false, - flatten_columns: false, - reset_index: false, }, }, { @@ -92,8 +90,8 @@ test('should skip CompareOperator', () => { }); test('should generate difference/percentage/ratio CompareOperator', () => { - const comparisionTypes = ['difference', 'percentage', 'ratio']; - comparisionTypes.forEach(cType => { + const comparisonTypes = ['difference', 'percentage', 'ratio']; + comparisonTypes.forEach(cType => { expect( timeCompareOperator( { diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/operators/timeComparePivotOperator.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/operators/timeComparePivotOperator.test.ts index 4ce88cb9c124..c41bcdd208ea 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/operators/timeComparePivotOperator.test.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/test/operators/timeComparePivotOperator.test.ts @@ -31,6 +31,7 @@ const formData: SqlaFormData = { granularity: 'month', datasource: 'foo', viz_type: 'table', + show_empty_columns: true, }; const queryObject: QueryObject = { metrics: [ @@ -71,10 +72,10 @@ test('should pivot on any type of timeCompare', () => { ...formData, comparison_type: cType, time_compare: ['1 year ago', '1 year later'], + granularity_sqla: 'time_column', }, { ...queryObject, - is_timeseries: true, }, ), ).toEqual({ @@ -93,8 +94,6 @@ test('should pivot on any type of timeCompare', () => { }, }, drop_missing_columns: false, - flatten_columns: false, - reset_index: false, columns: ['foo', 'bar'], index: ['__timestamp'], }, @@ -133,8 +132,45 @@ test('should pivot on x-axis', () => { drop_missing_columns: false, columns: ['foo', 'bar'], index: ['ds'], - flatten_columns: false, - reset_index: false, + }, + }); +}); + +test('should pivot on x-axis with series_columns', () => { + expect( + timeComparePivotOperator( + { + ...formData, + comparison_type: 'values', + time_compare: ['1 year ago', '1 year later'], + x_axis: 'ds', + }, + { + ...queryObject, + columns: ['ds', 'foo', 'bar'], + series_columns: ['foo', 'bar'], + }, + ), + ).toEqual({ + operation: 'pivot', + options: { + aggregates: { + 'count(*)': { operator: 'mean' }, + 'count(*)__1 year ago': { operator: 'mean' }, + 'count(*)__1 year later': { operator: 'mean' }, + 'sum(val)': { + operator: 'mean', + }, + 'sum(val)__1 year ago': { + operator: 'mean', + }, + 'sum(val)__1 year later': { + operator: 'mean', + }, + }, + drop_missing_columns: false, + columns: ['foo', 'bar'], + index: ['ds'], }, }); }); @@ -149,7 +185,7 @@ test('should pivot on adhoc x-axis', () => { x_axis: { label: 'my_case_expr', expressionType: 'SQL', - expression: 'case when a = 1 then 1 else 0 end', + sqlExpression: 'case when a = 1 then 1 else 0 end', }, }, queryObject, @@ -174,8 +210,6 @@ test('should pivot on adhoc x-axis', () => { drop_missing_columns: false, columns: ['foo', 'bar'], index: ['my_case_expr'], - flatten_columns: false, - reset_index: false, }, }); }); diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/operators/utils/isDerivedSeries.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/operators/utils/isDerivedSeries.test.ts index 05a1d738abc8..29c8c658672e 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/operators/utils/isDerivedSeries.test.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/test/operators/utils/isDerivedSeries.test.ts @@ -17,7 +17,7 @@ * under the License. */ import { isDerivedSeries } from '@superset-ui/chart-controls'; -import { SqlaFormData, ComparisionType } from '@superset-ui/core'; +import { SqlaFormData, ComparisonType } from '@superset-ui/core'; const formData: SqlaFormData = { datasource: 'foo', @@ -31,15 +31,15 @@ const series = { test('should be false if comparison type is not actual values', () => { expect(isDerivedSeries(series, formData)).toEqual(false); - Object.keys(ComparisionType) - .filter(type => type === ComparisionType.Values) + Object.keys(ComparisonType) + .filter(type => type === ComparisonType.Values) .forEach(type => { - const formDataWithComparisionType = { + const formDataWithComparisonType = { ...formData, comparison_type: type, time_compare: ['1 month ago'], }; - expect(isDerivedSeries(series, formDataWithComparisionType)).toEqual( + expect(isDerivedSeries(series, formDataWithComparisonType)).toEqual( false, ); }); @@ -48,7 +48,7 @@ test('should be false if comparison type is not actual values', () => { test('should be true if comparison type is values', () => { const formDataWithActualTypes = { ...formData, - comparison_type: ComparisionType.Values, + comparison_type: ComparisonType.Values, time_compare: ['1 month ago', '1 month later'], }; expect(isDerivedSeries(series, formDataWithActualTypes)).toEqual(true); @@ -62,7 +62,7 @@ test('should be false if series name does not match time_compare', () => { }; const formDataWithActualTypes = { ...formData, - comparison_type: ComparisionType.Values, + comparison_type: ComparisonType.Values, time_compare: ['1 month ago', '1 month later'], }; expect(isDerivedSeries(arbitrary_series, formDataWithActualTypes)).toEqual( @@ -78,7 +78,7 @@ test('should be false if time compare is not suffix', () => { }; const formDataWithActualTypes = { ...formData, - comparison_type: ComparisionType.Values, + comparison_type: ComparisonType.Values, time_compare: ['1 month ago', '1 month later'], }; expect(isDerivedSeries(series, formDataWithActualTypes)).toEqual(false); @@ -92,7 +92,7 @@ test('should be false if series name invalid', () => { }; const formDataWithActualTypes = { ...formData, - comparison_type: ComparisionType.Values, + comparison_type: ComparisonType.Values, time_compare: ['1 month ago', '1 month later'], }; expect(isDerivedSeries(series, formDataWithActualTypes)).toEqual(false); diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/types.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/types.test.ts index 5c53fbcf10c6..4a298645efc6 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/types.test.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/test/types.test.ts @@ -20,7 +20,6 @@ import { AdhocColumn } from '@superset-ui/core'; import { ColumnMeta, ControlPanelSectionConfig, - isAdhocColumn, isColumnMeta, isControlPanelSectionConfig, isSavedExpression, @@ -53,14 +52,6 @@ test('isColumnMeta returns true for ColumnMeta', () => { expect(isColumnMeta(COLUMN_META)).toEqual(true); }); -test('isAdhocColumn returns true for AdhocColumn', () => { - expect(isAdhocColumn(ADHOC_COLUMN)).toEqual(true); -}); - -test('isAdhocColumn returns false for ColumnMeta', () => { - expect(isAdhocColumn(COLUMN_META)).toEqual(false); -}); - test('isSavedExpression returns false for AdhocColumn', () => { expect(isSavedExpression(ADHOC_COLUMN)).toEqual(false); }); diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/utils/columnChoices.test.tsx b/superset-frontend/packages/superset-ui-chart-controls/test/utils/columnChoices.test.tsx index 3224bbcc26d5..59f4796a44d2 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/utils/columnChoices.test.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/test/utils/columnChoices.test.tsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { DatasourceType, QueryResponse, testQuery } from '@superset-ui/core'; +import { DatasourceType, testQueryResponse } from '@superset-ui/core'; import { columnChoices } from '../../src'; describe('columnChoices()', () => { @@ -58,7 +58,7 @@ describe('columnChoices()', () => { }); it('should convert columns to choices when source is a Query', () => { - expect(columnChoices(testQuery as QueryResponse)).toEqual([ + expect(columnChoices(testQueryResponse)).toEqual([ ['Column 1', 'Column 1'], ['Column 2', 'Column 2'], ['Column 3', 'Column 3'], diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/utils/getStandardizedControls.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/utils/getStandardizedControls.test.ts new file mode 100644 index 000000000000..8aaed01d7dd6 --- /dev/null +++ b/superset-frontend/packages/superset-ui-chart-controls/test/utils/getStandardizedControls.test.ts @@ -0,0 +1,82 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { QueryFormData } from '@superset-ui/core'; +import { getStandardizedControls } from '../../src'; + +const formData: QueryFormData = { + datasource: '30__table', + viz_type: 'table', + standardizedFormData: { + controls: { + metrics: ['count(*)', 'sum(sales)'], + columns: ['gender', 'gender'], + }, + memorizedFormData: [], + }, +}; + +test('without standardizedFormData', () => { + getStandardizedControls().setStandardizedControls({ + datasource: '30__table', + viz_type: 'table', + }); + expect(getStandardizedControls().controls).toEqual({ + metrics: [], + columns: [], + }); +}); + +test('getStandardizedControls', () => { + expect(getStandardizedControls().controls).toEqual({ + metrics: [], + columns: [], + }); + getStandardizedControls().setStandardizedControls(formData); + expect(getStandardizedControls().controls).toEqual({ + metrics: ['count(*)', 'sum(sales)'], + columns: ['gender', 'gender'], + }); + expect(getStandardizedControls().shiftMetric()).toEqual('count(*)'); + expect(getStandardizedControls().controls).toEqual({ + metrics: ['sum(sales)'], + columns: ['gender', 'gender'], + }); + expect(getStandardizedControls().popAllMetrics()).toEqual(['sum(sales)']); + expect(getStandardizedControls().controls).toEqual({ + metrics: [], + columns: ['gender', 'gender'], + }); + expect(getStandardizedControls().shiftColumn()).toEqual('gender'); + expect(getStandardizedControls().controls).toEqual({ + metrics: [], + columns: ['gender'], + }); + expect(getStandardizedControls().popAllColumns()).toEqual(['gender']); + expect(getStandardizedControls().controls).toEqual({ + metrics: [], + columns: [], + }); + + getStandardizedControls().setStandardizedControls(formData); + getStandardizedControls().clear(); + expect(getStandardizedControls().controls).toEqual({ + metrics: [], + columns: [], + }); +}); diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/utils/getTemporalColumns.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/utils/getTemporalColumns.test.ts new file mode 100644 index 000000000000..1921540ea604 --- /dev/null +++ b/superset-frontend/packages/superset-ui-chart-controls/test/utils/getTemporalColumns.test.ts @@ -0,0 +1,104 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { testQueryResponse, testQueryResults } from '@superset-ui/core'; +import { + Dataset, + getTemporalColumns, + isTemporalColumn, + TestDataset, +} from '../../src'; + +test('get temporal columns from a Dataset', () => { + expect(getTemporalColumns(TestDataset)).toEqual({ + temporalColumns: [ + { + advanced_data_type: undefined, + certification_details: null, + certified_by: null, + column_name: 'ds', + description: null, + expression: '', + filterable: true, + groupby: true, + id: 329, + is_certified: false, + is_dttm: true, + python_date_format: null, + type: 'TIMESTAMP WITHOUT TIME ZONE', + type_generic: 2, + verbose_name: null, + warning_markdown: null, + }, + ], + defaultTemporalColumn: 'ds', + }); +}); + +test('get temporal columns from a QueryResponse', () => { + expect(getTemporalColumns(testQueryResponse)).toEqual({ + temporalColumns: [ + { + name: 'Column 2', + type: 'TIMESTAMP', + is_dttm: true, + }, + ], + defaultTemporalColumn: 'Column 2', + }); +}); + +test('get temporal columns from null', () => { + expect(getTemporalColumns(null)).toEqual({ + temporalColumns: [], + defaultTemporalColumn: undefined, + }); +}); + +test('should accept empty Dataset or queryResponse', () => { + expect( + getTemporalColumns({ + ...TestDataset, + ...{ + columns: [], + main_dttm_col: undefined, + }, + } as any as Dataset), + ).toEqual({ + temporalColumns: [], + defaultTemporalColumn: undefined, + }); + + expect( + getTemporalColumns({ + ...testQueryResponse, + ...{ + columns: [], + results: { ...testQueryResults.results, ...{ columns: [] } }, + }, + }), + ).toEqual({ + temporalColumns: [], + defaultTemporalColumn: undefined, + }); +}); + +test('should determine temporal columns in a Dataset', () => { + expect(isTemporalColumn('ds', TestDataset)).toBeTruthy(); + expect(isTemporalColumn('num', TestDataset)).toBeFalsy(); +}); diff --git a/superset-frontend/packages/superset-ui-core/package.json b/superset-frontend/packages/superset-ui-core/package.json index 2d8df251619c..2ccb9877fdf7 100644 --- a/superset-frontend/packages/superset-ui-core/package.json +++ b/superset-frontend/packages/superset-ui-core/package.json @@ -31,6 +31,7 @@ "@types/d3-time-format": "^2.1.0", "@types/enzyme": "^3.10.5", "@types/fetch-mock": "^7.3.3", + "@types/json-bigint": "^1.0.1", "@types/lodash": "^4.14.149", "@types/math-expression-evaluator": "^1.2.1", "@types/node": "^18.0.0", diff --git a/superset-frontend/packages/superset-ui-core/src/api/types/core.ts b/superset-frontend/packages/superset-ui-core/src/api/types/core.ts new file mode 100644 index 000000000000..9aeba85accc9 --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/src/api/types/core.ts @@ -0,0 +1,31 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// /superset/sqllab_viz +interface SqlLabPostRequest { + data: { + schema: string; + sql: string; + dbId: number; + templateParams?: string | undefined; + datasourceName: string; + metrics?: string[]; + columns?: string[]; + }; +} diff --git a/superset-frontend/packages/superset-ui-core/src/chart/components/FallbackComponent.tsx b/superset-frontend/packages/superset-ui-core/src/chart/components/FallbackComponent.tsx index 5c22f920824e..f7dcd8306e64 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/components/FallbackComponent.tsx +++ b/superset-frontend/packages/superset-ui-core/src/chart/components/FallbackComponent.tsx @@ -18,6 +18,7 @@ */ import React from 'react'; +import { t } from '@superset-ui/core'; import { SupersetTheme } from '../../style'; import { FallbackPropsWithDimension } from './SuperChart'; @@ -41,13 +42,13 @@ export default function FallbackComponent({ > <div> <div> - <b>Oops! An error occurred!</b> + <b>{t('Oops! An error occurred!')}</b> </div> <code>{error ? error.toString() : 'Unknown Error'}</code> </div> {componentStack && ( <div> - <b>Stack Trace:</b> + <b>{t('Stack Trace:')}</b> <code> {componentStack.split('\n').map((row: string) => ( <div key={row}>{row}</div> diff --git a/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx b/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx index 9a6240daff71..99d7b6dbec7a 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx +++ b/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx @@ -26,6 +26,7 @@ import { ParentSize } from '@vx/responsive'; import { createSelector } from 'reselect'; import { withTheme } from '@emotion/react'; import { parseLength, Dimension } from '../../dimension'; +import getChartMetadataRegistry from '../registries/ChartMetadataRegistrySingleton'; import SuperChartCore, { Props as SuperChartCoreProps } from './SuperChartCore'; import DefaultFallbackComponent from './FallbackComponent'; import ChartProps, { ChartPropsConfig } from '../models/ChartProps'; @@ -60,7 +61,7 @@ export type Props = Omit<SuperChartCoreProps, 'chartProps'> & FallbackComponent?: React.ComponentType<FallbackPropsWithDimension>; /** Event listener for unexpected errors from chart */ onErrorBoundary?: ErrorBoundaryProps['onError']; - /** Prop for form plugins uisng superchart */ + /** Prop for form plugins using superchart */ showOverflow?: boolean; /** Prop for popovercontainer ref */ parentRef?: RefObject<any>; @@ -140,6 +141,9 @@ class SuperChart extends React.PureComponent<Props, {}> { this.core = core; }; + private getQueryCount = () => + getChartMetadataRegistry().get(this.props.chartType)?.queryObjectCount ?? 1; + renderChart(width: number, height: number) { const { id, @@ -174,9 +178,11 @@ class SuperChart extends React.PureComponent<Props, {}> { const noResultQueries = enableNoResults && (!queriesData || - queriesData.every( - ({ data }) => !data || (Array.isArray(data) && data.length === 0), - )); + queriesData + .slice(0, this.getQueryCount()) + .every( + ({ data }) => !data || (Array.isArray(data) && data.length === 0), + )); if (noResultQueries) { chart = noResults || ( <NoResultsComponent diff --git a/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChartCore.tsx b/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChartCore.tsx index 10e4cd18e682..d818890aa552 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChartCore.tsx +++ b/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChartCore.tsx @@ -19,6 +19,7 @@ /* eslint-disable react/jsx-sort-default-props */ import * as React from 'react'; +import { t } from '@superset-ui/core'; import { createSelector } from 'reselect'; import getChartComponentRegistry from '../registries/ChartComponentRegistrySingleton'; import getChartTransformPropsRegistry from '../registries/ChartTransformPropsRegistrySingleton'; @@ -167,7 +168,7 @@ export default class SuperChartCore extends React.PureComponent<Props, {}> { if (error) { return ( <div className="alert alert-warning" role="alert"> - <strong>ERROR</strong>  + <strong>{t('ERROR')}</strong>  <code>chartType="{chartType}"</code> — {error.toString()} </div> diff --git a/superset-frontend/packages/superset-ui-core/src/chart/models/ChartMetadata.ts b/superset-frontend/packages/superset-ui-core/src/chart/models/ChartMetadata.ts index 7a25fe86208d..1d55d2a9859f 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/models/ChartMetadata.ts +++ b/superset-frontend/packages/superset-ui-core/src/chart/models/ChartMetadata.ts @@ -48,6 +48,7 @@ export interface ChartMetadataConfig { // label: ChartLabel.DEPRECATED which will display a "deprecated" label on the chart. label?: ChartLabel | null; labelExplanation?: string | null; + queryObjectCount?: number; } export default class ChartMetadata { @@ -87,6 +88,8 @@ export default class ChartMetadata { labelExplanation?: string | null; + queryObjectCount: number; + constructor(config: ChartMetadataConfig) { const { name, @@ -106,6 +109,7 @@ export default class ChartMetadata { deprecated = false, label = null, labelExplanation = null, + queryObjectCount = 1, } = config; this.name = name; @@ -134,6 +138,7 @@ export default class ChartMetadata { this.deprecated = deprecated; this.label = label; this.labelExplanation = labelExplanation; + this.queryObjectCount = queryObjectCount; } canBeAnnotationType(type: string): boolean { diff --git a/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts b/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts index e67381711810..e02aeca4f54d 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts +++ b/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts @@ -50,6 +50,8 @@ type Hooks = { * also handles "change" and "remove". */ onAddFilter?: (newFilters: DataRecordFilters, merge?: boolean) => void; + /** handle right click */ + onContextMenu?: HandlerFunction; /** handle errors */ onError?: HandlerFunction; /** use the vis as control to update state */ @@ -88,6 +90,8 @@ export interface ChartPropsConfig { filterState?: FilterState; /** Set of actual behaviors that this instance of chart should use */ behaviors?: Behavior[]; + /** Chart display settings related to current view context */ + displaySettings?: JsonObject; /** Application section of the chart on the screen (in what components/screen it placed) */ appSection?: AppSection; /** is the chart refreshing its contents */ @@ -130,12 +134,18 @@ export default class ChartProps<FormData extends RawFormData = RawFormData> { behaviors: Behavior[]; + displaySettings?: JsonObject; + appSection?: AppSection; isRefreshing?: boolean; inputRef?: RefObject<any>; + inContextMenu?: boolean; + + emitCrossFilters?: boolean; + theme: SupersetTheme; constructor(config: ChartPropsConfig & { formData?: FormData } = {}) { @@ -149,11 +159,14 @@ export default class ChartProps<FormData extends RawFormData = RawFormData> { initialValues = {}, queriesData = [], behaviors = [], + displaySettings = {}, width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT, appSection, isRefreshing, inputRef, + inContextMenu = false, + emitCrossFilters = false, theme, } = config; this.width = width; @@ -169,9 +182,12 @@ export default class ChartProps<FormData extends RawFormData = RawFormData> { this.ownState = ownState; this.filterState = filterState; this.behaviors = behaviors; + this.displaySettings = displaySettings; this.appSection = appSection; this.isRefreshing = isRefreshing; this.inputRef = inputRef; + this.inContextMenu = inContextMenu; + this.emitCrossFilters = emitCrossFilters; this.theme = theme; } } @@ -190,9 +206,12 @@ ChartProps.createSelector = function create(): ChartPropsSelector { input => input.ownState, input => input.filterState, input => input.behaviors, + input => input.displaySettings, input => input.appSection, input => input.isRefreshing, input => input.inputRef, + input => input.inContextMenu, + input => input.emitCrossFilters, input => input.theme, ( annotationData, @@ -206,9 +225,12 @@ ChartProps.createSelector = function create(): ChartPropsSelector { ownState, filterState, behaviors, + displaySettings, appSection, isRefreshing, inputRef, + inContextMenu, + emitCrossFilters, theme, ) => new ChartProps({ @@ -223,9 +245,12 @@ ChartProps.createSelector = function create(): ChartPropsSelector { filterState, width, behaviors, + displaySettings, appSection, isRefreshing, inputRef, + inContextMenu, + emitCrossFilters, theme, }), ); diff --git a/superset-frontend/packages/superset-ui-core/src/chart/types/Base.ts b/superset-frontend/packages/superset-ui-core/src/chart/types/Base.ts index 0bfae7777e7d..f9f1a360b627 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/types/Base.ts +++ b/superset-frontend/packages/superset-ui-core/src/chart/types/Base.ts @@ -25,6 +25,12 @@ export type HandlerFunction = (...args: unknown[]) => void; export enum Behavior { INTERACTIVE_CHART = 'INTERACTIVE_CHART', NATIVE_FILTER = 'NATIVE_FILTER', + + /** + * Include `DRILL_TO_DETAIL` behavior if plugin handles `contextmenu` event + * when dimensions are right-clicked on. + */ + DRILL_TO_DETAIL = 'DRILL_TO_DETAIL', } export enum AppSection { @@ -73,4 +79,11 @@ export const chartLabelWeight: Record<ChartLabel, { weight: number }> = { }, }; +export enum AxisType { + category = 'category', + value = 'value', + time = 'time', + log = 'log', +} + export default {}; diff --git a/superset-frontend/packages/superset-ui-core/src/color/CategoricalColorScale.ts b/superset-frontend/packages/superset-ui-core/src/color/CategoricalColorScale.ts index 2a6a4d63a047..5f29ad477599 100644 --- a/superset-frontend/packages/superset-ui-core/src/color/CategoricalColorScale.ts +++ b/superset-frontend/packages/superset-ui-core/src/color/CategoricalColorScale.ts @@ -51,7 +51,7 @@ class CategoricalColorScale extends ExtensibleFunction { * @param {*} parentForcedColors optional parameter that comes from parent * (usually CategoricalColorNamespace) and supersede this.forcedColors */ - constructor(colors: string[], parentForcedColors?: ColorsLookup) { + constructor(colors: string[], parentForcedColors: ColorsLookup = {}) { super((value: string, sliceId?: number) => this.getColor(value, sliceId)); this.originColors = colors; @@ -67,18 +67,11 @@ class CategoricalColorScale extends ExtensibleFunction { const cleanedValue = stringifyAndTrim(value); const sharedLabelColor = getSharedLabelColor(); - const parentColor = - this.parentForcedColors && this.parentForcedColors[cleanedValue]; - if (parentColor) { - sharedLabelColor.addSlice(cleanedValue, parentColor, sliceId); - return parentColor; - } - - const forcedColor = this.forcedColors[cleanedValue]; - if (forcedColor) { - sharedLabelColor.addSlice(cleanedValue, forcedColor, sliceId); - return forcedColor; - } + // priority: parentForcedColors > forcedColors > labelColors + let color = + this.parentForcedColors?.[cleanedValue] || + this.forcedColors?.[cleanedValue] || + sharedLabelColor.getColorMap().get(cleanedValue); if (isFeatureEnabled(FeatureFlag.USE_ANALAGOUS_COLORS)) { const multiple = Math.floor( @@ -90,8 +83,10 @@ class CategoricalColorScale extends ExtensibleFunction { this.range(this.originColors.concat(newRange)); } } - - const color = this.scale(cleanedValue); + const newColor = this.scale(cleanedValue); + if (!color) { + color = newColor; + } sharedLabelColor.addSlice(cleanedValue, color, sliceId); return color; diff --git a/superset-frontend/packages/superset-ui-core/src/color/ColorSchemeRegistry.ts b/superset-frontend/packages/superset-ui-core/src/color/ColorSchemeRegistry.ts index d36b598bcd0c..e270ff6f0ef9 100644 --- a/superset-frontend/packages/superset-ui-core/src/color/ColorSchemeRegistry.ts +++ b/superset-frontend/packages/superset-ui-core/src/color/ColorSchemeRegistry.ts @@ -28,7 +28,16 @@ export default class ColorSchemeRegistry<T> extends RegistryWithDefaultKey<T> { }); } - get(key?: string) { - return super.get(key) as T | undefined; + get(key?: string, strict = false) { + const target = super.get(key) as T | undefined; + + // fallsback to default scheme if any + if (!strict && !target) { + const defaultKey = super.getDefaultKey(); + if (defaultKey) { + return super.get(defaultKey) as T | undefined; + } + } + return target; } } diff --git a/superset-frontend/packages/superset-ui-core/src/color/SharedLabelColorSingleton.ts b/superset-frontend/packages/superset-ui-core/src/color/SharedLabelColorSingleton.ts index 10a14df07591..bc417e6036a5 100644 --- a/superset-frontend/packages/superset-ui-core/src/color/SharedLabelColorSingleton.ts +++ b/superset-frontend/packages/superset-ui-core/src/color/SharedLabelColorSingleton.ts @@ -18,113 +18,81 @@ */ import { CategoricalColorNamespace } from '.'; -import { FeatureFlag, isFeatureEnabled, makeSingleton } from '../utils'; -import { getAnalogousColors } from './utils'; +import { makeSingleton } from '../utils'; +export enum SharedLabelColorSource { + dashboard, + explore, +} export class SharedLabelColor { - sliceLabelColorMap: Record<number, Record<string, string | undefined>>; + sliceLabelMap: Map<number, string[]>; - constructor() { - // { sliceId1: { label1: color1 }, sliceId2: { label2: color2 } } - this.sliceLabelColorMap = {}; - } + colorMap: Map<string, string>; - getColorMap( - colorNamespace?: string, - colorScheme?: string, - updateColorScheme?: boolean, - ) { - if (colorScheme) { - const categoricalNamespace = - CategoricalColorNamespace.getNamespace(colorNamespace); - const sharedLabels = this.getSharedLabels(); - let generatedColors: string[] = []; - let sharedLabelMap; + source: SharedLabelColorSource; - if (sharedLabels.length) { - const colorScale = categoricalNamespace.getScale(colorScheme); - const colors = colorScale.range(); - if (isFeatureEnabled(FeatureFlag.USE_ANALAGOUS_COLORS)) { - const multiple = Math.ceil(sharedLabels.length / colors.length); - generatedColors = getAnalogousColors(colors, multiple); - sharedLabelMap = sharedLabels.reduce( - (res, label, index) => ({ - ...res, - [label.toString()]: generatedColors[index], - }), - {}, - ); - } else { - // reverse colors to reduce color conflicts - colorScale.range(colors.reverse()); - sharedLabelMap = sharedLabels.reduce( - (res, label) => ({ - ...res, - [label.toString()]: colorScale(label), - }), - {}, - ); - } - } + constructor() { + // { sliceId1: [label1, label2, ...], sliceId2: [label1, label2, ...] } + this.sliceLabelMap = new Map(); + this.colorMap = new Map(); + this.source = SharedLabelColorSource.dashboard; + } - const labelMap = Object.keys(this.sliceLabelColorMap).reduce( - (res, sliceId) => { - // get new color scale instance - const colorScale = categoricalNamespace.getScale(colorScheme); - return { - ...res, - ...Object.keys(this.sliceLabelColorMap[sliceId]).reduce( - (res, label) => ({ - ...res, - [label]: updateColorScheme - ? colorScale(label) - : this.sliceLabelColorMap[sliceId][label], - }), - {}, - ), - }; - }, - {}, - ); + updateColorMap(colorNamespace?: string, colorScheme?: string) { + const categoricalNamespace = + CategoricalColorNamespace.getNamespace(colorNamespace); + const newColorMap = new Map(); + this.colorMap.clear(); + this.sliceLabelMap.forEach(labels => { + const colorScale = categoricalNamespace.getScale(colorScheme); + labels.forEach(label => { + const newColor = colorScale(label); + newColorMap.set(label, newColor); + }); + }); + this.colorMap = newColorMap; + } - return { - ...labelMap, - ...sharedLabelMap, - }; - } - return undefined; + getColorMap() { + return this.colorMap; } addSlice(label: string, color: string, sliceId?: number) { - if (!sliceId) return; - this.sliceLabelColorMap[sliceId] = { - ...this.sliceLabelColorMap[sliceId], - [label]: color, - }; + if ( + this.source !== SharedLabelColorSource.dashboard || + sliceId === undefined + ) + return; + const labels = this.sliceLabelMap.get(sliceId) || []; + if (!labels.includes(label)) { + labels.push(label); + this.sliceLabelMap.set(sliceId, labels); + } + this.colorMap.set(label, color); } removeSlice(sliceId: number) { - delete this.sliceLabelColorMap[sliceId]; + if (this.source !== SharedLabelColorSource.dashboard) return; + this.sliceLabelMap.delete(sliceId); + const newColorMap = new Map(); + this.sliceLabelMap.forEach(labels => { + labels.forEach(label => { + newColorMap.set(label, this.colorMap.get(label)); + }); + }); + this.colorMap = newColorMap; } - clear() { - this.sliceLabelColorMap = {}; + reset() { + const copyColorMap = new Map(this.colorMap); + copyColorMap.forEach((_, label) => { + this.colorMap.set(label, ''); + }); } - getSharedLabels() { - const tempLabels = new Set<string>(); - const result = new Set<string>(); - Object.keys(this.sliceLabelColorMap).forEach(sliceId => { - const colorMap = this.sliceLabelColorMap[sliceId]; - Object.keys(colorMap).forEach(label => { - if (tempLabels.has(label) && !result.has(label)) { - result.add(label); - } else { - tempLabels.add(label); - } - }); - }); - return [...result]; + clear() { + this.sliceLabelMap.clear(); + this.colorMap.clear(); } } diff --git a/superset-frontend/packages/superset-ui-core/src/color/index.ts b/superset-frontend/packages/superset-ui-core/src/color/index.ts index e1cde3ba3e2d..3bbdb5d0dc57 100644 --- a/superset-frontend/packages/superset-ui-core/src/color/index.ts +++ b/superset-frontend/packages/superset-ui-core/src/color/index.ts @@ -35,6 +35,7 @@ export * from './utils'; export { default as getSharedLabelColor, SharedLabelColor, + SharedLabelColorSource, } from './SharedLabelColorSingleton'; export const BRAND_COLOR = '#00A699'; diff --git a/superset-frontend/packages/superset-ui-core/src/connection/SupersetClient.ts b/superset-frontend/packages/superset-ui-core/src/connection/SupersetClient.ts index 530c71080906..f102cd197dab 100644 --- a/superset-frontend/packages/superset-ui-core/src/connection/SupersetClient.ts +++ b/superset-frontend/packages/superset-ui-core/src/connection/SupersetClient.ts @@ -44,6 +44,7 @@ const SupersetClient: SupersetClientInterface = { get: request => getInstance().get(request), init: force => getInstance().init(force), isAuthenticated: () => getInstance().isAuthenticated(), + getGuestToken: () => getInstance().getGuestToken(), post: request => getInstance().post(request), postForm: (...args) => getInstance().postForm(...args), put: request => getInstance().put(request), diff --git a/superset-frontend/packages/superset-ui-core/src/connection/SupersetClientClass.ts b/superset-frontend/packages/superset-ui-core/src/connection/SupersetClientClass.ts index b7281d025903..fd040faed042 100644 --- a/superset-frontend/packages/superset-ui-core/src/connection/SupersetClientClass.ts +++ b/superset-frontend/packages/superset-ui-core/src/connection/SupersetClientClass.ts @@ -158,6 +158,10 @@ export default class SupersetClientClass { return this.csrfToken !== null && this.csrfToken !== undefined; } + getGuestToken() { + return this.guestToken; + } + async get<T extends ParseMethod = 'json'>( requestConfig: RequestConfig & { parseMethod?: T }, ) { diff --git a/superset-frontend/packages/superset-ui-core/src/connection/callApi/callApi.ts b/superset-frontend/packages/superset-ui-core/src/connection/callApi/callApi.ts index 7c3fe21fdb8a..c682e5b7300d 100644 --- a/superset-frontend/packages/superset-ui-core/src/connection/callApi/callApi.ts +++ b/superset-frontend/packages/superset-ui-core/src/connection/callApi/callApi.ts @@ -94,7 +94,7 @@ export default async function callApi({ cache !== 'no-store' && cache !== 'reload' && CACHE_AVAILABLE && - (window.location && window.location.protocol) === 'https:' + window.location?.protocol === 'https:' ) { let supersetCache: Cache | null = null; try { @@ -146,10 +146,23 @@ export default async function callApi({ Object.keys(payload).forEach(key => { const value = (payload as JsonObject)[key] as JsonValue; if (typeof value !== 'undefined') { - formData.append( - key, - stringify ? JSON.stringify(value) : String(value), - ); + let valueString; + try { + // We have seen instances where casting to String() throws error + // This check allows all valid attributes to be appended to the formData + // while logging error to console for any attribute that fails the cast to String + valueString = stringify ? JSON.stringify(value) : String(value); + } catch (e) { + // eslint-disable-next-line no-console + console.error( + `Unable to convert attribute '${key}' to a String(). '${key}' was not added to the formData in request.body for call to ${url}`, + value, + e, + ); + } + if (valueString !== undefined) { + formData.append(key, valueString); + } } }); request.body = formData; diff --git a/superset-frontend/packages/superset-ui-core/src/connection/callApi/parseResponse.ts b/superset-frontend/packages/superset-ui-core/src/connection/callApi/parseResponse.ts index a0b9f149113a..15beca6e150a 100644 --- a/superset-frontend/packages/superset-ui-core/src/connection/callApi/parseResponse.ts +++ b/superset-frontend/packages/superset-ui-core/src/connection/callApi/parseResponse.ts @@ -16,6 +16,8 @@ * specific language governing permissions and limitations * under the License. */ +import JSONbig from 'json-bigint'; +import { cloneDeepWith } from 'lodash'; import { ParseMethod, TextResponse, JsonResponse } from '../types'; @@ -25,7 +27,7 @@ export default async function parseResponse<T extends ParseMethod = 'json'>( ) { type ReturnType = T extends 'raw' | null ? Response - : T extends 'json' | undefined + : T extends 'json' | 'json-bigint' | undefined ? JsonResponse : T extends 'text' ? TextResponse @@ -46,6 +48,19 @@ export default async function parseResponse<T extends ParseMethod = 'json'>( }; return result as ReturnType; } + if (parseMethod === 'json-bigint') { + const rawData = await response.text(); + const json = JSONbig.parse(rawData); + const result: JsonResponse = { + response, + // `json-bigint` could not handle floats well, see sidorares/json-bigint#62 + // TODO: clean up after json-bigint>1.0.1 is released + json: cloneDeepWith(json, (value: any) => + value?.isInteger?.() === false ? Number(value) : undefined, + ), + }; + return result as ReturnType; + } // by default treat this as json if (parseMethod === undefined || parseMethod === 'json') { const json = await response.json(); @@ -56,6 +71,6 @@ export default async function parseResponse<T extends ParseMethod = 'json'>( return result as ReturnType; } throw new Error( - `Expected parseResponse=json|text|raw|null, got '${parseMethod}'.`, + `Expected parseResponse=json|json-bigint|text|raw|null, got '${parseMethod}'.`, ); } diff --git a/superset-frontend/packages/superset-ui-core/src/connection/types.ts b/superset-frontend/packages/superset-ui-core/src/connection/types.ts index 06025956754d..a63ffd8b68a0 100644 --- a/superset-frontend/packages/superset-ui-core/src/connection/types.ts +++ b/superset-frontend/packages/superset-ui-core/src/connection/types.ts @@ -70,7 +70,13 @@ export type Method = RequestInit['method']; export type Mode = RequestInit['mode']; export type Redirect = RequestInit['redirect']; export type ClientTimeout = number | undefined; -export type ParseMethod = 'json' | 'text' | 'raw' | null | undefined; +export type ParseMethod = + | 'json' + | 'json-bigint' + | 'text' + | 'raw' + | null + | undefined; export type Signal = RequestInit['signal']; export type Stringify = boolean; export type Url = string; @@ -152,6 +158,7 @@ export interface SupersetClientInterface | 'init' | 'isAuthenticated' | 'reAuthenticate' + | 'getGuestToken' > { configure: (config?: ClientConfig) => SupersetClientInterface; reset: () => void; diff --git a/superset-frontend/packages/superset-ui-core/src/math-expression/index.ts b/superset-frontend/packages/superset-ui-core/src/math-expression/index.ts index ae3db1f069a9..8ee4d272d8bb 100644 --- a/superset-frontend/packages/superset-ui-core/src/math-expression/index.ts +++ b/superset-frontend/packages/superset-ui-core/src/math-expression/index.ts @@ -106,7 +106,7 @@ export function evalExpression(expression: string, value: number): number { const subExpressions = String(parsedExpression).split('='); parsedExpression = subExpressions[1] ?? subExpressions[0]; // we can ignore the type requirement on `TOKENS`, as value is always `number` - // and doesn't need to consider `number | underfined`. + // and doesn't need to consider `number | undefined`. // @ts-ignore return Number(mexp.eval(parsedExpression, TOKENS, { x: value })); } diff --git a/superset-frontend/packages/superset-ui-core/src/models/Registry.ts b/superset-frontend/packages/superset-ui-core/src/models/Registry.ts index 90a8065e29ac..e876bc2b50f5 100644 --- a/superset-frontend/packages/superset-ui-core/src/models/Registry.ts +++ b/superset-frontend/packages/superset-ui-core/src/models/Registry.ts @@ -169,7 +169,7 @@ export default class Registry< const item = this.items[key]; if (item !== undefined) { if ('loader' in item) { - return item.loader && item.loader(); + return item.loader?.(); } return item.value; diff --git a/superset-frontend/packages/superset-ui-core/src/number-format/NumberFormats.ts b/superset-frontend/packages/superset-ui-core/src/number-format/NumberFormats.ts index 11701586c034..605da5d30e7b 100644 --- a/superset-frontend/packages/superset-ui-core/src/number-format/NumberFormats.ts +++ b/superset-frontend/packages/superset-ui-core/src/number-format/NumberFormats.ts @@ -52,6 +52,7 @@ const SI = SI_3_DIGIT; const SMART_NUMBER = 'SMART_NUMBER'; const SMART_NUMBER_SIGNED = 'SMART_NUMBER_SIGNED'; +const OVER_MAX_HIDDEN = 'OVER_MAX_HIDDEN'; const NumberFormats = { DOLLAR, @@ -82,6 +83,7 @@ const NumberFormats = { SI_3_DIGIT, SMART_NUMBER, SMART_NUMBER_SIGNED, + OVER_MAX_HIDDEN, }; export default NumberFormats; diff --git a/superset-frontend/packages/superset-ui-core/src/query/DatasourceKey.ts b/superset-frontend/packages/superset-ui-core/src/query/DatasourceKey.ts index 2fe4bcf13905..38a38e10b13a 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/DatasourceKey.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/DatasourceKey.ts @@ -27,8 +27,8 @@ export default class DatasourceKey { constructor(key: string) { const [idStr, typeStr] = key.split('__'); this.id = parseInt(idStr, 10); - this.type = - typeStr === 'table' ? DatasourceType.Table : DatasourceType.Druid; + this.type = DatasourceType.Table; // default to SqlaTable model + this.type = typeStr === 'query' ? DatasourceType.Query : this.type; } public toString() { diff --git a/superset-frontend/packages/superset-ui-core/src/query/buildQueryContext.ts b/superset-frontend/packages/superset-ui-core/src/query/buildQueryContext.ts index c805811e5faf..aa1f470ba8f6 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/buildQueryContext.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/buildQueryContext.ts @@ -23,6 +23,8 @@ import { QueryFieldAliases, QueryFormData } from './types/QueryFormData'; import { QueryContext, QueryObject } from './types/Query'; import { SetDataMaskHook } from '../chart'; import { JsonObject } from '../connection'; +import { normalizeTimeColumn } from './normalizeTimeColumn'; +import { isXAxisSet } from './getXAxis'; const WRAP_IN_ARRAY = (baseQueryObject: QueryObject) => [baseQueryObject]; @@ -45,13 +47,19 @@ export default function buildQueryContext( typeof options === 'function' ? { buildQuery: options, queryFields: {} } : options || {}; - const queries = buildQuery(buildQueryObject(formData, queryFields)); + let queries = buildQuery(buildQueryObject(formData, queryFields)); + // --- query mutator begin --- + // todo(Yongjie): move the query mutator into buildQueryObject instead of buildQueryContext queries.forEach(query => { if (Array.isArray(query.post_processing)) { // eslint-disable-next-line no-param-reassign query.post_processing = query.post_processing.filter(Boolean); } }); + if (isXAxisSet(formData)) { + queries = queries.map(query => normalizeTimeColumn(formData, query)); + } + // --- query mutator end --- return { datasource: new DatasourceKey(formData.datasource).toObject(), force: formData.force || false, diff --git a/superset-frontend/packages/superset-ui-core/src/query/buildQueryObject.ts b/superset-frontend/packages/superset-ui-core/src/query/buildQueryObject.ts index 52fa1ffed0c2..cf434f138577 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/buildQueryObject.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/buildQueryObject.ts @@ -20,18 +20,20 @@ /* eslint-disable camelcase */ import { AdhocFilter, - QueryFieldAliases, - QueryFormColumn, - QueryFormData, QueryObject, QueryObjectFilterClause, - isPhysicalColumn, - isAdhocColumn, + isQueryFormMetric, } from './types'; +import { + QueryFieldAliases, + QueryFormMetric, + QueryFormData, +} from './types/QueryFormData'; import processFilters from './processFilters'; import extractExtras from './extractExtras'; import extractQueryFields from './extractQueryFields'; import { overrideExtraFormData } from './processExtraFormData'; +import { isDefined } from '../utils'; /** * Build the common segments of all query objects (e.g. the granularity field derived from @@ -92,16 +94,16 @@ export default function buildQueryObject<T extends QueryFormData>( ...extras, ...filterFormData, }); - const normalizeSeriesLimitMetric = (column: QueryFormColumn | undefined) => { - if (isAdhocColumn(column) || isPhysicalColumn(column)) { - return column; + const normalizeSeriesLimitMetric = (metric: QueryFormMetric | undefined) => { + if (isQueryFormMetric(metric)) { + return metric; } return undefined; }; let queryObject: QueryObject = { // fallback `null` to `undefined` so they won't be sent to the backend - // (JSON.strinify will ignore `undefined`.) + // (JSON.stringify will ignore `undefined`.) time_range: time_range || undefined, since: since || undefined, until: until || undefined, @@ -121,10 +123,11 @@ export default function buildQueryObject<T extends QueryFormData>( ? undefined : numericRowOffset, series_columns, - series_limit, - series_limit_metric: normalizeSeriesLimitMetric(series_limit_metric), - timeseries_limit: limit ? Number(limit) : 0, - timeseries_limit_metric: timeseries_limit_metric || undefined, + series_limit: series_limit ?? (isDefined(limit) ? Number(limit) : 0), + series_limit_metric: + normalizeSeriesLimitMetric(series_limit_metric) ?? + timeseries_limit_metric ?? + undefined, order_desc: typeof order_desc === 'undefined' ? true : order_desc, url_params: url_params || undefined, custom_params, diff --git a/superset-frontend/packages/superset-ui-core/src/query/constants.ts b/superset-frontend/packages/superset-ui-core/src/query/constants.ts index 4a3fe5ff5474..7976e87a4a28 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/constants.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/constants.ts @@ -1,11 +1,3 @@ -import { - ExtraFormDataAppend, - ExtraFormDataOverrideExtras, - ExtraFormDataOverrideRegular, - ExtraFormDataOverride, - QueryObject, -} from './types'; - /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -24,10 +16,19 @@ import { * specific language governing permissions and limitations * under the License. */ +import { + ExtraFormDataAppend, + ExtraFormDataOverrideExtras, + ExtraFormDataOverrideRegular, + ExtraFormDataOverride, + QueryObject, +} from './types'; + export const DTTM_ALIAS = '__timestamp'; +export const NO_TIME_RANGE = 'No filter'; export const EXTRA_FORM_DATA_OVERRIDE_EXTRA_KEYS: (keyof ExtraFormDataOverrideExtras)[] = - ['druid_time_origin', 'relative_start', 'relative_end', 'time_grain_sqla']; + ['relative_start', 'relative_end', 'time_grain_sqla']; export const EXTRA_FORM_DATA_APPEND_KEYS: (keyof ExtraFormDataAppend)[] = [ 'adhoc_filters', diff --git a/superset-frontend/packages/superset-ui-core/src/query/extractExtras.ts b/superset-frontend/packages/superset-ui-core/src/query/extractExtras.ts index aea2881b25dc..39a4b4b2d803 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/extractExtras.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/extractExtras.ts @@ -18,10 +18,9 @@ */ /* eslint-disable camelcase */ +import { TimeGranularity, QueryFormData } from '@superset-ui/core'; import { AppliedTimeExtras, - isDruidFormData, - QueryFormData, QueryObjectExtras, QueryObjectFilterClause, TimeColumnConfigKey, @@ -30,8 +29,7 @@ import { type ExtraFilterQueryField = { time_range?: string; granularity_sqla?: string; - time_grain_sqla?: string; - druid_time_origin?: string; + time_grain_sqla?: TimeGranularity; granularity?: string; }; @@ -58,7 +56,6 @@ export default function extractExtras(formData: QueryFormData): ExtractedExtra { __time_range: 'time_range', __time_col: 'granularity_sqla', __time_grain: 'time_grain_sqla', - __time_origin: 'druid_time_origin', __granularity: 'granularity', }; @@ -66,28 +63,21 @@ export default function extractExtras(formData: QueryFormData): ExtractedExtra { if (filter.col in reservedColumnsToQueryField) { const key = filter.col as TimeColumnConfigKey; const queryField = reservedColumnsToQueryField[key]; - extract[queryField] = filter.val as string; + extract[queryField] = filter.val as TimeGranularity; applied_time_extras[key] = filter.val as string; } else { filters.push(filter); } }); - // map to undeprecated names and remove deprecated fields - if (isDruidFormData(formData) && !extract.druid_time_origin) { - extras.druid_time_origin = formData.druid_time_origin; - delete extract.druid_time_origin; - } else { - // SQL - extras.time_grain_sqla = - extract.time_grain_sqla || formData.time_grain_sqla; - extract.granularity = - extract.granularity_sqla || - formData.granularity || - formData.granularity_sqla; - delete extract.granularity_sqla; - delete extract.time_grain_sqla; - } + // SQL + extras.time_grain_sqla = extract.time_grain_sqla || formData.time_grain_sqla; + extract.granularity = + extract.granularity_sqla || + formData.granularity || + formData.granularity_sqla; + delete extract.granularity_sqla; + delete extract.time_grain_sqla; return extract; } diff --git a/superset-frontend/packages/superset-ui-core/src/query/extractTimegrain.ts b/superset-frontend/packages/superset-ui-core/src/query/extractTimegrain.ts index e98ec5db4ec1..b5b3f9617bd8 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/extractTimegrain.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/extractTimegrain.ts @@ -18,7 +18,7 @@ */ /* eslint-disable no-underscore-dangle */ -import { QueryFormData } from './types'; +import { QueryFormData } from '@superset-ui/core'; import { TimeGranularity } from '../time-format'; export default function extractTimegrain( diff --git a/superset-frontend/packages/superset-ui-core/src/query/getColumnLabel.ts b/superset-frontend/packages/superset-ui-core/src/query/getColumnLabel.ts index f449a44cb270..f1b4e6ffa730 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/getColumnLabel.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/getColumnLabel.ts @@ -23,8 +23,8 @@ export default function getColumnLabel(column: QueryFormColumn): string { if (isPhysicalColumn(column)) { return column; } - if (column.label) { + if (column?.label) { return column.label; } - return column.sqlExpression; + return column?.sqlExpression; } diff --git a/superset-frontend/packages/superset-ui-core/src/query/getMetricLabel.ts b/superset-frontend/packages/superset-ui-core/src/query/getMetricLabel.ts index 3f6f31af7b9f..7ac7930c6a56 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/getMetricLabel.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/getMetricLabel.ts @@ -17,7 +17,7 @@ * under the License. */ -import { isAdhocMetricSimple, isSavedMetric, QueryFormMetric } from './types'; +import { QueryFormMetric, isSavedMetric, isAdhocMetricSimple } from './types'; export default function getMetricLabel(metric: QueryFormMetric): string { if (isSavedMetric(metric)) { diff --git a/superset-frontend/packages/superset-ui-core/src/query/getXAxis.ts b/superset-frontend/packages/superset-ui-core/src/query/getXAxis.ts new file mode 100644 index 000000000000..7c329c2a8bdf --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/src/query/getXAxis.ts @@ -0,0 +1,57 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { + DTTM_ALIAS, + FeatureFlag, + isFeatureEnabled, + getColumnLabel, + isQueryFormColumn, + QueryFormData, + QueryFormColumn, + Optional, +} from '@superset-ui/core'; + +export const isXAxisSet = (formData: QueryFormData) => + isQueryFormColumn(formData.x_axis); + +export const hasGenericChartAxes = isFeatureEnabled( + FeatureFlag.GENERIC_CHART_AXES, +); + +export const getXAxisColumn = ( + formData: QueryFormData, +): Optional<QueryFormColumn> => { + // The formData should be "raw form_data" -- the snake_case version of formData rather than camelCase. + if (!(formData.granularity_sqla || formData.x_axis)) { + return undefined; + } + + if (isXAxisSet(formData)) { + return formData.x_axis; + } + return DTTM_ALIAS; +}; + +export const getXAxisLabel = (formData: QueryFormData): Optional<string> => { + const col = getXAxisColumn(formData); + if (col) { + return getColumnLabel(col); + } + return undefined; +}; diff --git a/superset-frontend/packages/superset-ui-core/src/query/index.ts b/superset-frontend/packages/superset-ui-core/src/query/index.ts index 9bbfbc59fba8..bb83e3d340fd 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/index.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/index.ts @@ -28,6 +28,9 @@ export { default as getColumnLabel } from './getColumnLabel'; export { default as getMetricLabel } from './getMetricLabel'; export { default as DatasourceKey } from './DatasourceKey'; export { default as normalizeOrderBy } from './normalizeOrderBy'; +export { normalizeTimeColumn } from './normalizeTimeColumn'; +export { default as extractQueryFields } from './extractQueryFields'; +export * from './getXAxis'; export * from './types/AnnotationLayer'; export * from './types/QueryFormData'; diff --git a/superset-frontend/packages/superset-ui-core/src/query/normalizeOrderBy.ts b/superset-frontend/packages/superset-ui-core/src/query/normalizeOrderBy.ts index 3df72b58d2ba..e38e682abbdf 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/normalizeOrderBy.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/normalizeOrderBy.ts @@ -39,24 +39,24 @@ export default function normalizeOrderBy( // ensure that remove invalid orderby clause const cloneQueryObject = { ...queryObject }; - delete cloneQueryObject.timeseries_limit_metric; + delete cloneQueryObject.series_limit_metric; delete cloneQueryObject.legacy_order_by; delete cloneQueryObject.order_desc; delete cloneQueryObject.orderby; const isAsc = !queryObject.order_desc; if ( - queryObject.timeseries_limit_metric !== undefined && - queryObject.timeseries_limit_metric !== null && - !isEmpty(queryObject.timeseries_limit_metric) + queryObject.series_limit_metric !== undefined && + queryObject.series_limit_metric !== null && + !isEmpty(queryObject.series_limit_metric) ) { return { ...cloneQueryObject, - orderby: [[queryObject.timeseries_limit_metric, isAsc]], + orderby: [[queryObject.series_limit_metric, isAsc]], }; } - // todo: Removed `legacy_ordery_by` after refactoring + // todo: Removed `legacy_order_by` after refactoring if ( queryObject.legacy_order_by !== undefined && queryObject.legacy_order_by !== null && diff --git a/superset-frontend/packages/superset-ui-core/src/query/normalizeTimeColumn.ts b/superset-frontend/packages/superset-ui-core/src/query/normalizeTimeColumn.ts new file mode 100644 index 000000000000..f7ea0d0e6006 --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/src/query/normalizeTimeColumn.ts @@ -0,0 +1,84 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import omit from 'lodash/omit'; + +import { + AdhocColumn, + isAdhocColumn, + isPhysicalColumn, + QueryFormColumn, + QueryFormData, + QueryObject, +} from './types'; +import { isXAxisSet } from './getXAxis'; + +export function normalizeTimeColumn( + formData: QueryFormData, + queryObject: QueryObject, +): QueryObject { + // The formData should be "raw form_data" -- the snake_case version of formData rather than camelCase. + if (!isXAxisSet(formData)) { + return queryObject; + } + + const { columns: _columns, extras: _extras } = queryObject; + const mutatedColumns: QueryFormColumn[] = [...(_columns || [])]; + const axisIdx = _columns?.findIndex( + col => + (isPhysicalColumn(col) && + isPhysicalColumn(formData.x_axis) && + col === formData.x_axis) || + (isAdhocColumn(col) && + isAdhocColumn(formData.x_axis) && + col.sqlExpression === formData.x_axis.sqlExpression), + ); + if ( + axisIdx !== undefined && + axisIdx > -1 && + formData.x_axis && + Array.isArray(_columns) + ) { + if (isAdhocColumn(_columns[axisIdx])) { + mutatedColumns[axisIdx] = { + timeGrain: _extras?.time_grain_sqla, + columnType: 'BASE_AXIS', + ...(_columns[axisIdx] as AdhocColumn), + }; + } else { + mutatedColumns[axisIdx] = { + timeGrain: _extras?.time_grain_sqla, + columnType: 'BASE_AXIS', + sqlExpression: formData.x_axis, + label: formData.x_axis, + expressionType: 'SQL', + }; + } + + const newQueryObject = omit(queryObject, [ + 'extras.time_grain_sqla', + 'is_timeseries', + ]); + newQueryObject.columns = mutatedColumns; + + return newQueryObject; + } + + // fallback, return original queryObject + return queryObject; +} diff --git a/superset-frontend/packages/superset-ui-core/src/query/processFilters.ts b/superset-frontend/packages/superset-ui-core/src/query/processFilters.ts index 239f1c49afbe..8ad1f8b620db 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/processFilters.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/processFilters.ts @@ -43,7 +43,6 @@ export default function processFilters( const { adhoc_filters, extras = {}, filters = [], where } = formData; const simpleWhere: QueryObjectFilterClause[] = filters; - const simpleHaving: QueryObjectFilterClause[] = []; const freeformWhere: string[] = []; if (where) freeformWhere.push(where); const freeformHaving: string[] = []; @@ -54,8 +53,6 @@ export default function processFilters( const filterClause = convertFilter(filter); if (clause === 'WHERE') { simpleWhere.push(filterClause); - } else { - simpleHaving.push(filterClause); } } else { const { sqlExpression } = filter; @@ -69,7 +66,6 @@ export default function processFilters( // some filter-related fields need to go in `extras` extras.having = freeformHaving.map(sanitizeClause).join(' AND '); - extras.having_druid = simpleHaving; extras.where = freeformWhere.map(sanitizeClause).join(' AND '); return { diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/AdvancedAnalytics.ts b/superset-frontend/packages/superset-ui-core/src/query/types/AdvancedAnalytics.ts index 463b07c1dcc5..ea270e2d12ec 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/AdvancedAnalytics.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/AdvancedAnalytics.ts @@ -29,7 +29,7 @@ export interface RollingWindow { min_periods?: number; } -export enum ComparisionType { +export enum ComparisonType { Values = 'values', Difference = 'difference', Percentage = 'percentage', @@ -37,7 +37,7 @@ export enum ComparisionType { } export interface TimeCompare { time_compare?: string; - comparison_type?: ComparisionType; + comparison_type?: ComparisonType; } export default {}; diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/AnnotationLayer.ts b/superset-frontend/packages/superset-ui-core/src/query/types/AnnotationLayer.ts index 6dfe0cfc78c4..bac743cb25c5 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/AnnotationLayer.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/AnnotationLayer.ts @@ -125,7 +125,8 @@ export type AnnotationLayer = | EventAnnotationLayer | IntervalAnnotationLayer | FormulaAnnotationLayer - | TimeseriesAnnotationLayer; + | TimeseriesAnnotationLayer + | TableAnnotationLayer; export function isFormulaAnnotationLayer( layer: AnnotationLayer, diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/Column.ts b/superset-frontend/packages/superset-ui-core/src/query/types/Column.ts index 4e9a13651e4a..a00951536340 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/Column.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/Column.ts @@ -19,6 +19,7 @@ */ import { GenericDataType } from './QueryResponse'; +import { QueryFormColumn } from './QueryFormData'; export interface AdhocColumn { hasCustomLabel?: boolean; @@ -26,6 +27,9 @@ export interface AdhocColumn { optionName?: string; sqlExpression: string; expressionType: 'SQL'; + columnType?: 'BASE_AXIS' | 'SERIES'; + timeGrain?: string; + datasourceWarning?: boolean; } /** @@ -37,8 +41,7 @@ export type PhysicalColumn = string; * Column information defined in datasource. */ export interface Column { - advanced_data_type?: string; - id: number; + id?: number; type?: string; type_generic?: GenericDataType; column_name: string; @@ -50,16 +53,29 @@ export interface Column { expression?: string | null; database_expression?: string | null; python_date_format?: string | null; -} -export default {}; + // used for advanced_data_type + optionName?: string; + filterBy?: string; + value?: string; + advanced_data_type?: string; +} -export function isPhysicalColumn( - column?: AdhocColumn | PhysicalColumn, -): column is PhysicalColumn { +export function isPhysicalColumn(column?: any): column is PhysicalColumn { return typeof column === 'string'; } -export function isAdhocColumn(column?: AdhocColumn | PhysicalColumn) { - return (column as AdhocColumn)?.sqlExpression !== undefined; +export function isAdhocColumn(column?: any): column is AdhocColumn { + return ( + typeof column !== 'string' && + column?.sqlExpression !== undefined && + column?.label !== undefined && + (column?.expressionType === undefined || column?.expressionType === 'SQL') + ); +} + +export function isQueryFormColumn(column: any): column is QueryFormColumn { + return isPhysicalColumn(column) || isAdhocColumn(column); } + +export default {}; diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/Dashboard.ts b/superset-frontend/packages/superset-ui-core/src/query/types/Dashboard.ts index 4089512de497..b916e27a394e 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/Dashboard.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/Dashboard.ts @@ -82,7 +82,6 @@ export type Filter = { adhoc_filters?: AdhocFilter[]; granularity_sqla?: string; granularity?: string; - druid_time_origin?: string; time_grain_sqla?: string; time_range?: string; requiredFirst?: boolean; @@ -92,6 +91,8 @@ export type Filter = { description: string; }; +export type FilterWithDataMask = Filter & { dataMask: DataMaskWithId }; + export type Divider = Partial<Omit<Filter, 'id' | 'type'>> & { id: string; title: string; @@ -105,6 +106,15 @@ export function isNativeFilter( return filterElement.type === NativeFilterType.NATIVE_FILTER; } +export function isNativeFilterWithDataMask( + filterElement: Filter | Divider, +): filterElement is FilterWithDataMask { + return ( + isNativeFilter(filterElement) && + (filterElement as FilterWithDataMask).dataMask?.filterState?.value + ); +} + export function isFilterDivider( filterElement: Filter | Divider, ): filterElement is Divider { @@ -117,10 +127,15 @@ export type Filters = { [filterId: string]: Filter | Divider; }; +export type PartialFilters = { + [filterId: string]: Partial<Filters[keyof Filters]>; +}; + export type NativeFiltersState = { filters: Filters; filterSets: FilterSets; focusedFilterId?: string; + hoveredFilterId?: string; }; export type DashboardComponentMetadata = { diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/Datasource.ts b/superset-frontend/packages/superset-ui-core/src/query/types/Datasource.ts index 03916dee5ebb..9639a000d015 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/Datasource.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/Datasource.ts @@ -21,7 +21,6 @@ import { Metric } from './Metric'; export enum DatasourceType { Table = 'table', - Druid = 'druid', Query = 'query', Dataset = 'dataset', SlTable = 'sl_table', @@ -47,7 +46,7 @@ export interface Datasource { }; } -export const DEFAULT_METRICS = [ +export const DEFAULT_METRICS: Metric[] = [ { metric_name: 'COUNT(*)', expression: 'COUNT(*)', diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/Filter.ts b/superset-frontend/packages/superset-ui-core/src/query/types/Filter.ts index be420b41a207..e113a843d468 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/Filter.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/Filter.ts @@ -72,6 +72,12 @@ export function isSimpleAdhocFilter( return filter.expressionType === 'SIMPLE'; } +export function isFreeFormAdhocFilter( + filter: AdhocFilter, +): filter is FreeFormAdhocFilter { + return filter.expressionType === 'SQL'; +} + export function isUnaryAdhocFilter( filter: SimpleAdhocFilter, ): filter is UnaryAdhocFilter { diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/Metric.ts b/superset-frontend/packages/superset-ui-core/src/query/types/Metric.ts index 396ccd4c5b5a..c0f770f9041d 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/Metric.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/Metric.ts @@ -17,7 +17,7 @@ * specific language governing permissions and limitations * under the License. */ -import { Maybe } from '../../types'; +import { Maybe, QueryFormMetric } from '../../types'; import { Column } from './Column'; export type Aggregate = @@ -72,10 +72,24 @@ export interface Metric { warning_text?: Maybe<string>; } -export default {}; +export function isSavedMetric(metric: any): metric is SavedMetric { + return typeof metric === 'string'; +} + +export function isAdhocMetricSimple(metric: any): metric is AdhocMetricSimple { + return typeof metric !== 'string' && metric?.expressionType === 'SIMPLE'; +} -export function isAdhocMetricSimple( - metric: AdhocMetric, -): metric is AdhocMetricSimple { - return metric.expressionType === 'SIMPLE'; +export function isAdhocMetricSQL(metric: any): metric is AdhocMetricSQL { + return typeof metric !== 'string' && metric?.expressionType === 'SQL'; } + +export function isQueryFormMetric(metric: any): metric is QueryFormMetric { + return ( + isSavedMetric(metric) || + isAdhocMetricSimple(metric) || + isAdhocMetricSQL(metric) + ); +} + +export default {}; diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/Operator.ts b/superset-frontend/packages/superset-ui-core/src/query/types/Operator.ts index 754766bef262..10385767614e 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/Operator.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/Operator.ts @@ -31,6 +31,7 @@ const BINARY_OPERATORS = [ 'ILIKE', 'LIKE', 'REGEX', + 'TEMPORAL_RANGE', ] as const; /** List of operators that require another operand that is a set */ diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/PostProcessing.ts b/superset-frontend/packages/superset-ui-core/src/query/types/PostProcessing.ts index 315cdb8456cd..e32eda6a90ac 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/PostProcessing.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/PostProcessing.ts @@ -18,7 +18,7 @@ */ import { JsonObject } from '../../connection'; import { TimeGranularity } from '../../time-format'; -import { RollingType, ComparisionType } from './AdvancedAnalytics'; +import { RollingType, ComparisonType } from './AdvancedAnalytics'; export type NumpyFunction = | 'average' @@ -57,7 +57,7 @@ export interface Aggregates { [colname: string]: { operator: NumpyFunction; /** - * the name of the column to generate aggrates from. + * the name of the column to generate aggregates from. */ column?: string; options?: JsonObject; @@ -111,12 +111,10 @@ interface _PostProcessingPivot { columns: string[]; combine_value_with_metric?: boolean; drop_missing_columns?: boolean; - flatten_columns?: boolean; index: string[]; marginal_distribution_name?: string; marginal_distributions?: boolean; metric_fill_value?: any; - reset_index?: boolean; }; } export type PostProcessingPivot = _PostProcessingPivot | DefaultPostProcessing; @@ -124,7 +122,7 @@ export type PostProcessingPivot = _PostProcessingPivot | DefaultPostProcessing; interface _PostProcessingProphet { operation: 'prophet'; options: { - time_grain: TimeGranularity; + time_grain: TimeGranularity | undefined; periods: number; confidence_interval: number; yearly_seasonality?: boolean | number; @@ -173,7 +171,7 @@ export interface _PostProcessingCompare { options: { source_columns: string[]; compare_columns: string[]; - compare_type: Omit<ComparisionType, ComparisionType.Values>; + compare_type: Omit<ComparisonType, ComparisonType.Values>; drop_original_columns: boolean; }; } @@ -184,7 +182,9 @@ export type PostProcessingCompare = interface _PostProcessingSort { operation: 'sort'; options: { - columns: Record<string, boolean>; + is_sort_index?: boolean; + by?: string[] | string; + ascending?: boolean[] | boolean; }; } export type PostProcessingSort = _PostProcessingSort | DefaultPostProcessing; diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/Query.ts b/superset-frontend/packages/superset-ui-core/src/query/types/Query.ts index 9354326b1d29..57377ebb7297 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/Query.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/Query.ts @@ -32,28 +32,36 @@ import { PostProcessingRule } from './PostProcessing'; import { JsonObject } from '../../connection'; import { TimeGranularity } from '../../time-format'; -export type QueryObjectFilterClause = { +export type BaseQueryObjectFilterClause = { col: QueryFormColumn; grain?: TimeGranularity; isExtra?: boolean; -} & ( - | { - op: BinaryOperator; - val: string | number | boolean; - } - | { - op: SetOperator; - val: (string | number | boolean)[]; - } - | { - op: UnaryOperator; - } -); +}; + +export type BinaryQueryObjectFilterClause = BaseQueryObjectFilterClause & { + op: BinaryOperator; + val: string | number | boolean; + formattedVal?: string; +}; + +export type SetQueryObjectFilterClause = BaseQueryObjectFilterClause & { + op: SetOperator; + val: (string | number | boolean)[]; + formattedVal?: string[]; +}; + +export type UnaryQueryObjectFilterClause = BaseQueryObjectFilterClause & { + op: UnaryOperator; + formattedVal?: string; +}; + +export type QueryObjectFilterClause = + | BinaryQueryObjectFilterClause + | SetQueryObjectFilterClause + | UnaryQueryObjectFilterClause; export type QueryObjectExtras = Partial<{ /** HAVING condition for Druid */ - having_druid?: string; - druid_time_origin?: string; /** HAVING condition for SQLAlchemy */ having?: string; relative_start?: string; @@ -128,12 +136,6 @@ export interface QueryObject /** The size of bucket by which to group timeseries data (forthcoming) */ time_grain?: string; - /** Maximum number of timeseries */ - timeseries_limit?: number; - - /** The metric used to sort the returned result. */ - timeseries_limit_metric?: Maybe<QueryFormMetric>; - /** Direction to ordered by */ order_desc?: boolean; @@ -251,19 +253,40 @@ export const CtasEnum = { export type QueryColumn = { name: string; + column_name?: string; type: string | null; is_dttm: boolean; }; -export type QueryState = - | 'stopped' - | 'failed' - | 'pending' - | 'running' - | 'scheduled' - | 'success' - | 'fetching' - | 'timed_out'; +// Possible states of a query object for processing on the server +export enum QueryState { + STARTED = 'started', + STOPPED = 'stopped', + FAILED = 'failed', + PENDING = 'pending', + RUNNING = 'running', + SCHEDULED = 'scheduled', + SUCCESS = 'success', + FETCHING = 'fetching', + TIMED_OUT = 'timed_out', +} + +// Inidcates a Query's state is still processing +export const runningQueryStateList: QueryState[] = [ + QueryState.RUNNING, + QueryState.STARTED, + QueryState.PENDING, + QueryState.FETCHING, + QueryState.SCHEDULED, +]; + +// Indicates a Query's state has completed processing regardless of success / failure +export const concludedQueryStateList: QueryState[] = [ + QueryState.STOPPED, + QueryState.FAILED, + QueryState.SUCCESS, + QueryState.TIMED_OUT, +]; export type Query = { cached: boolean; @@ -274,6 +297,7 @@ export type Query = { errorMessage: string | null; extra: { progress: string | null; + errors?: SupersetError[]; }; id: string; isDataPreview: boolean; @@ -305,7 +329,7 @@ export type Query = { executedSql: string; output: string | Record<string, any>; actions: Record<string, any>; - type: DatasourceType.Query; + type: DatasourceType; columns: QueryColumn[]; }; @@ -317,11 +341,13 @@ export type QueryResults = { expanded_columns: QueryColumn[]; selected_columns: QueryColumn[]; query: { limit: number }; + query_id?: number; }; }; export type QueryResponse = Query & QueryResults; +// todo: move out from typing export const testQuery: Query = { id: 'clientId2353', dbId: 1, @@ -336,7 +362,7 @@ export const testQuery: Query = { isDataPreview: false, progress: 0, resultsKey: null, - state: 'success', + state: QueryState.SUCCESS, tempSchema: null, trackingUrl: null, templateParams: null, @@ -360,20 +386,76 @@ export const testQuery: Query = { columns: [ { name: 'Column 1', - type: DatasourceType.Query, + type: 'STRING', is_dttm: false, }, { name: 'Column 3', - type: DatasourceType.Query, + type: 'STRING', is_dttm: false, }, { name: 'Column 2', - type: DatasourceType.Query, + type: 'TIMESTAMP', is_dttm: true, }, ], }; +export const testQueryResults = { + results: { + displayLimitReached: false, + columns: [ + { + name: 'Column 1', + type: 'STRING', + is_dttm: false, + }, + { + name: 'Column 3', + type: 'STRING', + is_dttm: false, + }, + { + name: 'Column 2', + type: 'TIMESTAMP', + is_dttm: true, + }, + ], + data: [ + { 'Column 1': 'a', 'Column 2': 'b', 'Column 3': '2014-11-11T00:00:00' }, + ], + expanded_columns: [], + selected_columns: [ + { + name: 'Column 1', + type: 'STRING', + is_dttm: false, + }, + { + name: 'Column 3', + type: 'STRING', + is_dttm: false, + }, + { + name: 'Column 2', + type: 'TIMESTAMP', + is_dttm: true, + }, + ], + query: { limit: 6 }, + }, +}; + +export const testQueryResponse = { ...testQuery, ...testQueryResults }; + +export enum ContributionType { + Row = 'row', + Column = 'column', +} + +export type DatasourceSamplesQuery = { + filters?: QueryObjectFilterClause[]; +}; + export default {}; diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/QueryFormData.ts b/superset-frontend/packages/superset-ui-core/src/query/types/QueryFormData.ts index ac57561d5d2b..1806f567ec5a 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/QueryFormData.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/QueryFormData.ts @@ -122,14 +122,14 @@ export type ExtraFormDataAppend = { * filter clauses can't be overridden */ export type ExtraFormDataOverrideExtras = Pick< QueryObjectExtras, - 'druid_time_origin' | 'relative_start' | 'relative_end' | 'time_grain_sqla' + 'relative_start' | 'relative_end' | 'time_grain_sqla' >; /** These parameters override those already present in the form data/query object */ export type ExtraFormDataOverrideRegular = Partial< Pick<SqlaFormData, 'granularity_sqla'> > & - Partial<Pick<DruidFormData, 'granularity'>> & + Partial<Pick<SqlaFormData, 'granularity'>> & Partial<Pick<BaseFormData, 'time_range'>> & Partial<Pick<QueryObject, 'time_column' | 'time_grain'>>; @@ -166,13 +166,15 @@ export interface BaseFormData extends TimeRange, FormDataResidual { extra_form_data?: ExtraFormData; /** order descending */ order_desc?: boolean; - /** limit number of time series */ + /** limit number of time series + * deprecated - use series_limit instead */ limit?: number; /** limit number of row in the results */ row_limit?: string | number | null; /** row offset for server side pagination */ row_offset?: string | number | null; - /** The metric used to order timeseries for limiting */ + /** The metric used to order timeseries for limiting + * deprecated - use series_limit_metric instead */ timeseries_limit_metric?: QueryFormMetric; /** Force refresh */ force?: boolean; @@ -184,7 +186,7 @@ export interface BaseFormData extends TimeRange, FormDataResidual { /** limit number of series */ series_columns?: QueryFormColumn[]; series_limit?: number; - series_limit_metric?: QueryFormColumn; + series_limit_metric?: QueryFormMetric; } /** @@ -194,34 +196,16 @@ export interface SqlaFormData extends BaseFormData { /** * Name of the Time Column. Time column is optional. */ + granularity?: string; granularity_sqla?: string; time_grain_sqla?: TimeGranularity; having?: string; } -/** - * Form data for Druid datasources. - */ -export interface DruidFormData extends BaseFormData { - granularity?: string; - having_druid?: string; - druid_time_origin?: string; -} - -export type QueryFormData = DruidFormData | SqlaFormData; +export type QueryFormData = SqlaFormData; //--------------------------------------------------- // Type guards //--------------------------------------------------- -export function isDruidFormData( - formData: QueryFormData, -): formData is DruidFormData { - return 'granularity' in formData; -} - -export function isSavedMetric(metric: QueryFormMetric): metric is SavedMetric { - return typeof metric === 'string'; -} - export default {}; diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/QueryResponse.ts b/superset-frontend/packages/superset-ui-core/src/query/types/QueryResponse.ts index 74d33f6e944b..e4869805f819 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/QueryResponse.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/QueryResponse.ts @@ -83,6 +83,7 @@ export interface ChartDataResponseResult { export interface TimeseriesChartDataResponseResult extends ChartDataResponseResult { data: TimeseriesDataRecord[]; + label_map: Record<string, string[]>; } /** diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/Time.ts b/superset-frontend/packages/superset-ui-core/src/query/types/Time.ts index 820c3f1a3c81..56156166feb7 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/Time.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/Time.ts @@ -30,7 +30,6 @@ export type TimeColumnConfigKey = | '__time_col' | '__time_grain' | '__time_range' - | '__time_origin' | '__granularity'; export type AppliedTimeExtras = Partial< diff --git a/superset-frontend/packages/superset-ui-core/src/style/index.tsx b/superset-frontend/packages/superset-ui-core/src/style/index.tsx index b20dbc5aa9f5..ee0b6e10ac41 100644 --- a/superset-frontend/packages/superset-ui-core/src/style/index.tsx +++ b/superset-frontend/packages/superset-ui-core/src/style/index.tsx @@ -22,6 +22,7 @@ import createCache from '@emotion/cache'; export { css, + keyframes, jsx, ThemeProvider, CacheProvider as EmotionCacheProvider, @@ -160,6 +161,7 @@ const defaultTheme = { }, transitionTiming: 0.3, gridUnit: 4, + brandIconMaxWidth: 37, }; export type SupersetTheme = typeof defaultTheme; diff --git a/superset-frontend/packages/superset-ui-core/src/translation/index.ts b/superset-frontend/packages/superset-ui-core/src/translation/index.ts index 71cb8acbe0ea..216bf5847595 100644 --- a/superset-frontend/packages/superset-ui-core/src/translation/index.ts +++ b/superset-frontend/packages/superset-ui-core/src/translation/index.ts @@ -22,4 +22,4 @@ export * from './types'; export default {}; -export { default as __hack_reexport_trasnslation } from './types'; +export { default as __hack_reexport_translation } from './types'; diff --git a/superset-frontend/packages/superset-ui-core/src/types/index.ts b/superset-frontend/packages/superset-ui-core/src/types/index.ts index eaab5c0b49dc..a1c527afd6f0 100644 --- a/superset-frontend/packages/superset-ui-core/src/types/index.ts +++ b/superset-frontend/packages/superset-ui-core/src/types/index.ts @@ -19,3 +19,7 @@ export * from '../query/types'; export type Maybe<T> = T | null; + +export type Optional<T> = T | undefined; + +export type ValueOf<T> = T[keyof T]; diff --git a/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts new file mode 100644 index 000000000000..a411c41d08af --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts @@ -0,0 +1,97 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { TypedRegistry } from '../models'; +import { makeSingleton } from '../utils'; + +/** + * A function which returns text (or marked-up text) + * If what you want is a react component, don't use this. Use React.ComponentType instead. + */ +type ReturningDisplayable<P = void> = (props: P) => string | React.ReactElement; + +/** + * This type defines all available extensions of Superset's default UI. + * Namespace the keys here to follow the form of 'some_domain.functonality.item'. + * Take care to name your keys well, as the name describes what this extension point's role is in Superset. + * + * When defining a new option here, take care to keep any parameters to functions (or components) minimal. + * Any removal or alteration to a parameter will be considered a breaking change. + */ + +// from src/views/components/Menu, not imported since this is a separate package +interface MenuObjectChildProps { + label: string; + name?: string; + icon?: string; + index?: number; + url?: string; + isFrontendRoute?: boolean; + perm?: string | boolean; + view?: string; + disable?: boolean; +} + +export interface SwitchProps { + isEditMode: boolean; + dbFetched: any; + disableSSHTunnelingForEngine?: boolean; + useSSHTunneling: boolean; + setUseSSHTunneling: React.Dispatch<React.SetStateAction<boolean>>; + setDB: React.Dispatch<any>; + isSSHTunneling: boolean; +} + +type ConfigDetailsProps = { + embeddedId: string; +}; +type RightMenuItemIconProps = { + menuChild: MenuObjectChildProps; +}; + +export type Extensions = Partial<{ + 'alertsreports.header.icon': React.ComponentType; + 'embedded.documentation.configuration_details': React.ComponentType<ConfigDetailsProps>; + 'embedded.documentation.description': ReturningDisplayable; + 'embedded.documentation.url': string; + 'dashboard.nav.right': React.ComponentType; + 'navbar.right-menu.item.icon': React.ComponentType<RightMenuItemIconProps>; + 'navbar.right': React.ComponentType; + 'report-modal.dropdown.item.icon': React.ComponentType; + 'root.context.provider': React.ComponentType; + 'welcome.message': React.ComponentType; + 'welcome.banner': React.ComponentType; + 'welcome.main.replacement': React.ComponentType; + 'ssh_tunnel.form.switch': React.ComponentType<SwitchProps>; +}>; + +/** + * A registry containing extensions which can alter Superset's UI at specific points defined by Superset. + * See SIP-87: https://github.com/apache/superset/issues/20615 + */ +class ExtensionsRegistry extends TypedRegistry<Extensions> { + name = 'ExtensionsRegistry'; +} + +export const getExtensionsRegistry = makeSingleton(ExtensionsRegistry, {}); + +// Exporting this under the old name for backwards compatibility. +// After downstream folks have migrated to `getExtensionsRegistry`, we should remove this. +export const getUiOverrideRegistry = getExtensionsRegistry; diff --git a/superset-frontend/packages/superset-ui-core/src/ui-overrides/UiOverrideRegistry.ts b/superset-frontend/packages/superset-ui-core/src/ui-overrides/UiOverrideRegistry.ts deleted file mode 100644 index fb74ae1ece49..000000000000 --- a/superset-frontend/packages/superset-ui-core/src/ui-overrides/UiOverrideRegistry.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; -import { TypedRegistry } from '../models'; -import { makeSingleton } from '../utils'; - -/** A function (or component) which returns text (or marked-up text) */ -type UiGeneratorText<P = void> = (props: P) => string | React.ReactElement; - -/** - * This type defines all the UI override options which replace elements of Superset's default UI. - * Idea with the keys here is generally to namespace following the form of 'domain.functonality.item' - * - * When defining a new option here, take care to keep any parameters to functions (or components) minimal. - * Any removal or alteration to a parameter will be considered a breaking change. - */ -export type UiOverrides = Partial<{ - 'embedded.documentation.description': UiGeneratorText; - 'embedded.documentation.url': string; -}>; - -/** - * A registry containing UI customizations to replace elements of Superset's default UI. - */ -class UiOverrideRegistry extends TypedRegistry<UiOverrides> { - name = 'UiOverrideRegistry'; -} - -export const getUiOverrideRegistry = makeSingleton(UiOverrideRegistry, {}); diff --git a/superset-frontend/packages/superset-ui-core/src/ui-overrides/index.tsx b/superset-frontend/packages/superset-ui-core/src/ui-overrides/index.tsx index d59afc216fb8..4796ae0fe322 100644 --- a/superset-frontend/packages/superset-ui-core/src/ui-overrides/index.tsx +++ b/superset-frontend/packages/superset-ui-core/src/ui-overrides/index.tsx @@ -17,4 +17,4 @@ * under the License. */ -export * from './UiOverrideRegistry'; +export * from './ExtensionsRegistry'; diff --git a/superset-frontend/packages/superset-ui-core/src/utils/featureFlags.ts b/superset-frontend/packages/superset-ui-core/src/utils/featureFlags.ts index d6a1f2097f94..524d5a6d1c14 100644 --- a/superset-frontend/packages/superset-ui-core/src/utils/featureFlags.ts +++ b/superset-frontend/packages/superset-ui-core/src/utils/featureFlags.ts @@ -19,42 +19,51 @@ // We can codegen the enum definition based on a list of supported flags that we // check into source control. We're hardcoding the supported flags for now. export enum FeatureFlag { - ALLOW_DASHBOARD_DOMAIN_SHARDING = 'ALLOW_DASHBOARD_DOMAIN_SHARDING', + // PLEASE KEEP THE LIST SORTED ALPHABETICALLY + ALERTS_ATTACH_REPORTS = 'ALERTS_ATTACH_REPORTS', ALERT_REPORTS = 'ALERT_REPORTS', + ALLOW_DASHBOARD_DOMAIN_SHARDING = 'ALLOW_DASHBOARD_DOMAIN_SHARDING', + ALLOW_FULL_CSV_EXPORT = 'ALLOW_FULL_CSV_EXPORT', CLIENT_CACHE = 'CLIENT_CACHE', - DYNAMIC_PLUGINS = 'DYNAMIC_PLUGINS', - ENABLE_ADVANCED_DATA_TYPES = 'ENABLE_ADVANCED_DATA_TYPES', - SCHEDULED_QUERIES = 'SCHEDULED_QUERIES', - SQL_VALIDATORS_BY_ENGINE = 'SQL_VALIDATORS_BY_ENGINE', - ESTIMATE_QUERY_COST = 'ESTIMATE_QUERY_COST', - SHARE_QUERIES_VIA_KV_STORE = 'SHARE_QUERIES_VIA_KV_STORE', - SQLLAB_BACKEND_PERSISTENCE = 'SQLLAB_BACKEND_PERSISTENCE', - THUMBNAILS = 'THUMBNAILS', - LISTVIEWS_DEFAULT_CARD_VIEW = 'LISTVIEWS_DEFAULT_CARD_VIEW', - DISABLE_LEGACY_DATASOURCE_EDITOR = 'DISABLE_LEGACY_DATASOURCE_EDITOR', - DISABLE_DATASET_SOURCE_EDIT = 'DISABLE_DATASET_SOURCE_EDIT', - DISPLAY_MARKDOWN_HTML = 'DISPLAY_MARKDOWN_HTML', - ESCAPE_MARKDOWN_HTML = 'ESCAPE_MARKDOWN_HTML', - DASHBOARD_NATIVE_FILTERS = 'DASHBOARD_NATIVE_FILTERS', DASHBOARD_CROSS_FILTERS = 'DASHBOARD_CROSS_FILTERS', - DASHBOARD_NATIVE_FILTERS_SET = 'DASHBOARD_NATIVE_FILTERS_SET', + DASHBOARD_EDIT_CHART_IN_NEW_TAB = 'DASHBOARD_EDIT_CHART_IN_NEW_TAB', DASHBOARD_FILTERS_EXPERIMENTAL = 'DASHBOARD_FILTERS_EXPERIMENTAL', + CONFIRM_DASHBOARD_DIFF = 'CONFIRM_DASHBOARD_DIFF', + DASHBOARD_NATIVE_FILTERS = 'DASHBOARD_NATIVE_FILTERS', + DASHBOARD_NATIVE_FILTERS_SET = 'DASHBOARD_NATIVE_FILTERS_SET', + DASHBOARD_VIRTUALIZATION = 'DASHBOARD_VIRTUALIZATION', + DASHBOARD_RBAC = 'DASHBOARD_RBAC', + DATAPANEL_CLOSED_BY_DEFAULT = 'DATAPANEL_CLOSED_BY_DEFAULT', + DISABLE_DATASET_SOURCE_EDIT = 'DISABLE_DATASET_SOURCE_EDIT', + DISABLE_LEGACY_DATASOURCE_EDITOR = 'DISABLE_LEGACY_DATASOURCE_EDITOR', + DISPLAY_MARKDOWN_HTML = 'DISPLAY_MARKDOWN_HTML', + DRILL_TO_DETAIL = 'DRILL_TO_DETAIL', + DYNAMIC_PLUGINS = 'DYNAMIC_PLUGINS', + EMBEDDABLE_CHARTS = 'EMBEDDABLE_CHARTS', EMBEDDED_SUPERSET = 'EMBEDDED_SUPERSET', + ENABLE_ADVANCED_DATA_TYPES = 'ENABLE_ADVANCED_DATA_TYPES', + ENABLE_DND_WITH_CLICK_UX = 'ENABLE_DND_WITH_CLICK_UX', + ENABLE_EXPLORE_DRAG_AND_DROP = 'ENABLE_EXPLORE_DRAG_AND_DROP', ENABLE_FILTER_BOX_MIGRATION = 'ENABLE_FILTER_BOX_MIGRATION', - VERSIONED_EXPORT = 'VERSIONED_EXPORT', - GLOBAL_ASYNC_QUERIES = 'GLOBAL_ASYNC_QUERIES', + ENABLE_JAVASCRIPT_CONTROLS = 'ENABLE_JAVASCRIPT_CONTROLS', ENABLE_TEMPLATE_PROCESSING = 'ENABLE_TEMPLATE_PROCESSING', - ENABLE_EXPLORE_DRAG_AND_DROP = 'ENABLE_EXPLORE_DRAG_AND_DROP', - ENABLE_DND_WITH_CLICK_UX = 'ENABLE_DND_WITH_CLICK_UX', - FORCE_DATABASE_CONNECTIONS_SSL = 'FORCE_DATABASE_CONNECTIONS_SSL', ENABLE_TEMPLATE_REMOVE_FILTERS = 'ENABLE_TEMPLATE_REMOVE_FILTERS', - ENABLE_JAVASCRIPT_CONTROLS = 'ENABLE_JAVASCRIPT_CONTROLS', - DASHBOARD_RBAC = 'DASHBOARD_RBAC', - ALERTS_ATTACH_REPORTS = 'ALERTS_ATTACH_REPORTS', - ALLOW_FULL_CSV_EXPORT = 'ALLOW_FULL_CSV_EXPORT', - UX_BETA = 'UX_BETA', + ESCAPE_MARKDOWN_HTML = 'ESCAPE_MARKDOWN_HTML', + ESTIMATE_QUERY_COST = 'ESTIMATE_QUERY_COST', + FORCE_DATABASE_CONNECTIONS_SSL = 'FORCE_DATABASE_CONNECTIONS_SSL', GENERIC_CHART_AXES = 'GENERIC_CHART_AXES', + GLOBAL_ASYNC_QUERIES = 'GLOBAL_ASYNC_QUERIES', + HORIZONTAL_FILTER_BAR = 'HORIZONTAL_FILTER_BAR', + LISTVIEWS_DEFAULT_CARD_VIEW = 'LISTVIEWS_DEFAULT_CARD_VIEW', + SCHEDULED_QUERIES = 'SCHEDULED_QUERIES', + SHARE_QUERIES_VIA_KV_STORE = 'SHARE_QUERIES_VIA_KV_STORE', + SQLLAB_BACKEND_PERSISTENCE = 'SQLLAB_BACKEND_PERSISTENCE', + SQL_VALIDATORS_BY_ENGINE = 'SQL_VALIDATORS_BY_ENGINE', + THUMBNAILS = 'THUMBNAILS', USE_ANALAGOUS_COLORS = 'USE_ANALAGOUS_COLORS', + UX_BETA = 'UX_BETA', + VERSIONED_EXPORT = 'VERSIONED_EXPORT', + SSH_TUNNELING = 'SSH_TUNNELING', } export type ScheduleQueriesProps = { JSONSCHEMA: { @@ -80,6 +89,11 @@ declare global { } } -export function isFeatureEnabled(feature: FeatureFlag) { - return window && window.featureFlags && !!window.featureFlags[feature]; +export function isFeatureEnabled(feature: FeatureFlag): boolean { + try { + return !!window.featureFlags[feature]; + } catch (error) { + console.error(`Failed to query feature flag ${feature}`); + } + return false; } diff --git a/superset-frontend/packages/superset-ui-core/src/utils/index.ts b/superset-frontend/packages/superset-ui-core/src/utils/index.ts index 1c43663e28ef..19c5ed586145 100644 --- a/superset-frontend/packages/superset-ui-core/src/utils/index.ts +++ b/superset-frontend/packages/superset-ui-core/src/utils/index.ts @@ -26,6 +26,7 @@ export { default as makeSingleton } from './makeSingleton'; export { default as promiseTimeout } from './promiseTimeout'; export { default as logging } from './logging'; export { default as removeDuplicates } from './removeDuplicates'; +export { lruCache } from './lruCache'; export * from './featureFlags'; export * from './random'; export * from './typedMemo'; diff --git a/superset-frontend/packages/superset-ui-core/src/utils/isDefined.ts b/superset-frontend/packages/superset-ui-core/src/utils/isDefined.ts index 097115e11c1c..0cdba14eb6fd 100644 --- a/superset-frontend/packages/superset-ui-core/src/utils/isDefined.ts +++ b/superset-frontend/packages/superset-ui-core/src/utils/isDefined.ts @@ -17,6 +17,6 @@ * under the License. */ -export default function isDefined(x: unknown) { +export default function isDefined<T>(x: T): x is NonNullable<T> { return x !== null && x !== undefined; } diff --git a/superset-frontend/packages/superset-ui-core/src/utils/lruCache.ts b/superset-frontend/packages/superset-ui-core/src/utils/lruCache.ts new file mode 100644 index 000000000000..f6785850c22a --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/src/utils/lruCache.ts @@ -0,0 +1,74 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +class LRUCache<T> { + private cache: Map<string, T>; + + readonly capacity: number; + + constructor(capacity: number) { + if (capacity < 1) { + throw new Error('The capacity in LRU must be greater than 0.'); + } + this.capacity = capacity; + this.cache = new Map<string, T>(); + } + + public has(key: string): boolean { + return this.cache.has(key); + } + + public get(key: string): T | undefined { + // Prevent runtime errors + if (typeof key !== 'string') { + throw new TypeError('The LRUCache key must be string.'); + } + + if (this.cache.has(key)) { + const tmp = this.cache.get(key) as T; + this.cache.delete(key); + this.cache.set(key, tmp); + return tmp; + } + return undefined; + } + + public set(key: string, value: T) { + // Prevent runtime errors + if (typeof key !== 'string') { + throw new TypeError('The LRUCache key must be string.'); + } + if (this.cache.size >= this.capacity) { + this.cache.delete(this.cache.keys().next().value); + } + this.cache.set(key, value); + } + + public clear() { + this.cache.clear(); + } + + public get size() { + return this.cache.size; + } +} + +export function lruCache<T>(capacity = 100) { + return new LRUCache<T>(capacity); +} diff --git a/superset-frontend/packages/superset-ui-core/test/__mocks__/resize-observer-polyfill.ts b/superset-frontend/packages/superset-ui-core/test/__mocks__/resize-observer-polyfill.ts index 238e14ab2336..719ad1119f1f 100644 --- a/superset-frontend/packages/superset-ui-core/test/__mocks__/resize-observer-polyfill.ts +++ b/superset-frontend/packages/superset-ui-core/test/__mocks__/resize-observer-polyfill.ts @@ -37,6 +37,11 @@ export default function ResizeObserver(callback: ObserveCallback) { allCallbacks.push(callback); } }, + unobserve() { + if (callback) { + allCallbacks.splice(allCallbacks.indexOf(callback), 1); + } + }, }; } diff --git a/superset-frontend/packages/superset-ui-core/test/chart/fixtures/formData.ts b/superset-frontend/packages/superset-ui-core/test/chart/fixtures/formData.ts index 25d27f5e2d0c..9d926f46131b 100644 --- a/superset-frontend/packages/superset-ui-core/test/chart/fixtures/formData.ts +++ b/superset-frontend/packages/superset-ui-core/test/chart/fixtures/formData.ts @@ -19,13 +19,14 @@ /* eslint sort-keys: 'off' */ /** The form data defined here is based on default visualizations packaged with Apache Superset */ +import { TimeGranularity } from '@superset-ui/core'; export const bigNumberFormData = { datasource: '3__table', viz_type: 'big_number', slice_id: 54, granularity_sqla: 'ds', - time_grain_sqla: 'P1D', + time_grain_sqla: TimeGranularity.DAY, time_range: '100 years ago : now', metric: 'sum__num', adhoc_filters: [], diff --git a/superset-frontend/packages/superset-ui-core/test/color/CategoricalColorScale.test.ts b/superset-frontend/packages/superset-ui-core/test/color/CategoricalColorScale.test.ts index 91a8f4a3185a..9e83aaba9a87 100644 --- a/superset-frontend/packages/superset-ui-core/test/color/CategoricalColorScale.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/color/CategoricalColorScale.test.ts @@ -140,7 +140,7 @@ describe('CategoricalColorScale', () => { expect(scale2.getColorMap()).toEqual({ cow: 'black', pig: 'pink', - horse: 'blue', + horse: 'green', }); }); }); diff --git a/superset-frontend/packages/superset-ui-core/test/color/ColorSchemeRegistry.test.ts b/superset-frontend/packages/superset-ui-core/test/color/ColorSchemeRegistry.test.ts index 462982847490..13aa49922f45 100644 --- a/superset-frontend/packages/superset-ui-core/test/color/ColorSchemeRegistry.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/color/ColorSchemeRegistry.test.ts @@ -18,10 +18,26 @@ */ import ColorSchemeRegistry from '../../src/color/ColorSchemeRegistry'; +import schemes from '../../src/color/colorSchemes/categorical/d3'; +import CategoricalScheme from '../../src/color/CategoricalScheme'; describe('ColorSchemeRegistry', () => { it('exists', () => { expect(ColorSchemeRegistry).toBeDefined(); expect(ColorSchemeRegistry).toBeInstanceOf(Function); }); + it('returns undefined', () => { + const registry = new ColorSchemeRegistry(); + expect(registry.get('something')).toBeUndefined(); + }); + it('returns default', () => { + const registry = new ColorSchemeRegistry(); + registry.registerValue('SUPERSET_DEFAULT', schemes[0]); + expect(registry.get('something')).toBeInstanceOf(CategoricalScheme); + }); + it('returns undefined in strict mode', () => { + const registry = new ColorSchemeRegistry(); + registry.registerValue('SUPERSET_DEFAULT', schemes[0]); + expect(registry.get('something', true)).toBeUndefined(); + }); }); diff --git a/superset-frontend/packages/superset-ui-core/test/color/SharedLabelColorSingleton.test.ts b/superset-frontend/packages/superset-ui-core/test/color/SharedLabelColorSingleton.test.ts index 86d3ba9c409e..88610874dbd7 100644 --- a/superset-frontend/packages/superset-ui-core/test/color/SharedLabelColorSingleton.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/color/SharedLabelColorSingleton.test.ts @@ -23,6 +23,7 @@ import { getCategoricalSchemeRegistry, getSharedLabelColor, SharedLabelColor, + SharedLabelColorSource, } from '@superset-ui/core'; import { getAnalogousColors } from '../../src/color/utils'; @@ -52,6 +53,7 @@ describe('SharedLabelColor', () => { }); beforeEach(() => { + getSharedLabelColor().source = SharedLabelColorSource.dashboard; getSharedLabelColor().clear(); }); @@ -60,18 +62,48 @@ describe('SharedLabelColor', () => { }); describe('.addSlice(value, color, sliceId)', () => { - it('should add to valueSliceMap when first adding label', () => { + it('should add to sliceLabelColorMap when first adding label', () => { const sharedLabelColor = getSharedLabelColor(); sharedLabelColor.addSlice('a', 'red', 1); - expect(sharedLabelColor.sliceLabelColorMap).toHaveProperty('1', { - a: 'red', - }); + expect(sharedLabelColor.sliceLabelMap.has(1)).toEqual(true); + const labels = sharedLabelColor.sliceLabelMap.get(1); + expect(labels?.includes('a')).toEqual(true); + const colorMap = sharedLabelColor.getColorMap(); + expect(Object.fromEntries(colorMap)).toEqual({ a: 'red' }); + }); + + it('should add to sliceLabelColorMap when slice exist', () => { + const sharedLabelColor = getSharedLabelColor(); + sharedLabelColor.addSlice('a', 'red', 1); + sharedLabelColor.addSlice('b', 'blue', 1); + const labels = sharedLabelColor.sliceLabelMap.get(1); + expect(labels?.includes('b')).toEqual(true); + const colorMap = sharedLabelColor.getColorMap(); + expect(Object.fromEntries(colorMap)).toEqual({ a: 'red', b: 'blue' }); + }); + + it('should use last color if adding label repeatedly', () => { + const sharedLabelColor = getSharedLabelColor(); + sharedLabelColor.addSlice('b', 'blue', 1); + sharedLabelColor.addSlice('b', 'green', 1); + const labels = sharedLabelColor.sliceLabelMap.get(1); + expect(labels?.includes('b')).toEqual(true); + expect(labels?.length).toEqual(1); + const colorMap = sharedLabelColor.getColorMap(); + expect(Object.fromEntries(colorMap)).toEqual({ b: 'green' }); + }); + + it('should do nothing when source is not dashboard', () => { + const sharedLabelColor = getSharedLabelColor(); + sharedLabelColor.source = SharedLabelColorSource.explore; + sharedLabelColor.addSlice('a', 'red'); + expect(Object.fromEntries(sharedLabelColor.sliceLabelMap)).toEqual({}); }); it('should do nothing when sliceId is undefined', () => { const sharedLabelColor = getSharedLabelColor(); sharedLabelColor.addSlice('a', 'red'); - expect(sharedLabelColor.sliceLabelColorMap).toEqual({}); + expect(Object.fromEntries(sharedLabelColor.sliceLabelMap)).toEqual({}); }); }); @@ -80,55 +112,92 @@ describe('SharedLabelColor', () => { const sharedLabelColor = getSharedLabelColor(); sharedLabelColor.addSlice('a', 'red', 1); sharedLabelColor.removeSlice(1); - expect(sharedLabelColor.sliceLabelColorMap).toEqual({}); + expect(sharedLabelColor.sliceLabelMap.has(1)).toEqual(false); }); - }); - describe('.getColorMap(namespace, scheme, updateColorScheme)', () => { - it('should be undefined when scheme is undefined', () => { + it('should update colorMap', () => { const sharedLabelColor = getSharedLabelColor(); + sharedLabelColor.addSlice('a', 'red', 1); + sharedLabelColor.addSlice('b', 'blue', 2); + sharedLabelColor.removeSlice(1); const colorMap = sharedLabelColor.getColorMap(); - expect(colorMap).toBeUndefined(); + expect(Object.fromEntries(colorMap)).toEqual({ b: 'blue' }); }); - it('should update color value if passing updateColorScheme', () => { + it('should do nothing when source is not dashboard', () => { const sharedLabelColor = getSharedLabelColor(); sharedLabelColor.addSlice('a', 'red', 1); - sharedLabelColor.addSlice('b', 'blue', 2); - const colorMap = sharedLabelColor.getColorMap('', 'testColors2', true); - expect(colorMap).toEqual({ a: 'yellow', b: 'yellow' }); + sharedLabelColor.source = SharedLabelColorSource.explore; + sharedLabelColor.removeSlice(1); + expect(sharedLabelColor.sliceLabelMap.has(1)).toEqual(true); }); + }); - it('should get origin color value if not pass updateColorScheme', () => { + describe('.updateColorMap(namespace, scheme)', () => { + it('should update color map', () => { const sharedLabelColor = getSharedLabelColor(); sharedLabelColor.addSlice('a', 'red', 1); - sharedLabelColor.addSlice('b', 'blue', 2); - const colorMap = sharedLabelColor.getColorMap('', 'testColors'); - expect(colorMap).toEqual({ a: 'red', b: 'blue' }); + sharedLabelColor.addSlice('b', 'pink', 1); + sharedLabelColor.addSlice('b', 'green', 2); + sharedLabelColor.addSlice('c', 'blue', 2); + sharedLabelColor.updateColorMap('', 'testColors2'); + const colorMap = sharedLabelColor.getColorMap(); + expect(Object.fromEntries(colorMap)).toEqual({ + a: 'yellow', + b: 'yellow', + c: 'green', + }); }); - it('should use recycle colors if shared label exit', () => { + it('should use recycle colors', () => { window.featureFlags = { [FeatureFlag.USE_ANALAGOUS_COLORS]: false, }; const sharedLabelColor = getSharedLabelColor(); sharedLabelColor.addSlice('a', 'red', 1); - sharedLabelColor.addSlice('a', 'blue', 2); - const colorMap = sharedLabelColor.getColorMap('', 'testColors'); - expect(colorMap).not.toEqual({}); + sharedLabelColor.addSlice('b', 'blue', 2); + sharedLabelColor.addSlice('c', 'green', 3); + sharedLabelColor.addSlice('d', 'red', 4); + sharedLabelColor.updateColorMap('', 'testColors'); + const colorMap = sharedLabelColor.getColorMap(); + expect(Object.fromEntries(colorMap)).not.toEqual({}); expect(getAnalogousColors).not.toBeCalled(); }); - it('should use analagous colors if shared label exit', () => { + it('should use analagous colors', () => { window.featureFlags = { [FeatureFlag.USE_ANALAGOUS_COLORS]: true, }; const sharedLabelColor = getSharedLabelColor(); sharedLabelColor.addSlice('a', 'red', 1); - sharedLabelColor.addSlice('a', 'blue', 2); - const colorMap = sharedLabelColor.getColorMap('', 'testColors'); - expect(colorMap).not.toEqual({}); + sharedLabelColor.addSlice('b', 'blue', 1); + sharedLabelColor.addSlice('c', 'green', 1); + sharedLabelColor.addSlice('d', 'red', 1); + sharedLabelColor.updateColorMap('', 'testColors'); + const colorMap = sharedLabelColor.getColorMap(); + expect(Object.fromEntries(colorMap)).not.toEqual({}); expect(getAnalogousColors).toBeCalled(); }); }); + + describe('.getColorMap()', () => { + it('should get color map', () => { + const sharedLabelColor = getSharedLabelColor(); + sharedLabelColor.addSlice('a', 'red', 1); + sharedLabelColor.addSlice('b', 'blue', 2); + const colorMap = sharedLabelColor.getColorMap(); + expect(Object.fromEntries(colorMap)).toEqual({ a: 'red', b: 'blue' }); + }); + }); + + describe('.reset()', () => { + it('should reset color map', () => { + const sharedLabelColor = getSharedLabelColor(); + sharedLabelColor.addSlice('a', 'red', 1); + sharedLabelColor.addSlice('b', 'blue', 2); + sharedLabelColor.reset(); + const colorMap = sharedLabelColor.getColorMap(); + expect(Object.fromEntries(colorMap)).toEqual({ a: '', b: '' }); + }); + }); }); diff --git a/superset-frontend/packages/superset-ui-core/test/connection/SupersetClient.test.ts b/superset-frontend/packages/superset-ui-core/test/connection/SupersetClient.test.ts index 17a07f3c727e..caba59f56372 100644 --- a/superset-frontend/packages/superset-ui-core/test/connection/SupersetClient.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/connection/SupersetClient.test.ts @@ -38,6 +38,7 @@ describe('SupersetClient', () => { expect(typeof SupersetClient.postForm).toBe('function'); expect(typeof SupersetClient.isAuthenticated).toBe('function'); expect(typeof SupersetClient.reAuthenticate).toBe('function'); + expect(typeof SupersetClient.getGuestToken).toBe('function'); expect(typeof SupersetClient.request).toBe('function'); expect(typeof SupersetClient.reset).toBe('function'); }); @@ -55,7 +56,7 @@ describe('SupersetClient', () => { // this also tests that the ^above doesn't throw if configure is called appropriately it('calls appropriate SupersetClient methods when configured', async () => { - expect.assertions(15); + expect.assertions(16); const mockGetUrl = '/mock/get/url'; const mockPostUrl = '/mock/post/url'; const mockRequestUrl = '/mock/request/url'; @@ -82,6 +83,10 @@ describe('SupersetClient', () => { ); const csrfSpy = jest.spyOn(SupersetClientClass.prototype, 'getCSRFToken'); const requestSpy = jest.spyOn(SupersetClientClass.prototype, 'request'); + const getGuestTokenSpy = jest.spyOn( + SupersetClientClass.prototype, + 'getGuestToken', + ); SupersetClient.configure({}); await SupersetClient.init(); @@ -114,6 +119,9 @@ describe('SupersetClient', () => { SupersetClient.isAuthenticated(); await SupersetClient.reAuthenticate(); + SupersetClient.getGuestToken(); + expect(getGuestTokenSpy).toHaveBeenCalledTimes(1); + expect(initSpy).toHaveBeenCalledTimes(2); expect(deleteSpy).toHaveBeenCalledTimes(1); expect(putSpy).toHaveBeenCalledTimes(1); diff --git a/superset-frontend/packages/superset-ui-core/test/connection/SupersetClientClass.test.ts b/superset-frontend/packages/superset-ui-core/test/connection/SupersetClientClass.test.ts index 4db26b05b415..56ab3f1baea0 100644 --- a/superset-frontend/packages/superset-ui-core/test/connection/SupersetClientClass.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/connection/SupersetClientClass.test.ts @@ -329,7 +329,7 @@ describe('SupersetClientClass', () => { }); it('uses a guest token when provided', async () => { - expect.assertions(1); + expect.assertions(2); const client = new SupersetClientClass({ protocol, @@ -337,6 +337,7 @@ describe('SupersetClientClass', () => { guestToken: 'abc123', guestTokenHeaderName: 'guestTokenHeader', }); + expect(client.getGuestToken()).toBe('abc123'); await client.init(); await client.get({ url: mockGetUrl }); diff --git a/superset-frontend/packages/superset-ui-core/test/connection/callApi/callApi.test.ts b/superset-frontend/packages/superset-ui-core/test/connection/callApi/callApi.test.ts index 81467ce2393a..81c8e2d15052 100644 --- a/superset-frontend/packages/superset-ui-core/test/connection/callApi/callApi.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/connection/callApi/callApi.test.ts @@ -23,6 +23,12 @@ import callApi from '../../../src/connection/callApi/callApi'; import { LOGIN_GLOB } from '../fixtures/constants'; +// missing the toString function causing method to error out when casting to String +class BadObject {} +const corruptObject = new BadObject(); +/* @ts-expect-error */ +BadObject.prototype.toString = undefined; + describe('callApi()', () => { beforeAll(() => { fetchMock.get(LOGIN_GLOB, { result: '1234' }); @@ -178,6 +184,44 @@ describe('callApi()', () => { expect(jsonRequestBody[key]).toEqual(value); }); }); + + it('removes corrupt value when building formData with stringify = false', async () => { + /* + There has been a case when 'stringify' is false an object value on one of the + attributes was missing a toString function making the cast to String() fail + and causing entire method call to fail. The new logic skips corrupt values that fail cast to String() + and allows all valid attributes to be added as key / value pairs to the formData + instance. This test case replicates a corrupt object missing the .toString method + representing a real bug report. + */ + const postPayload = { + string: 'value', + number: 1237, + array: [1, 2, 3], + object: { a: 'a', 1: 1 }, + null: null, + emptyString: '', + // corruptObject has no toString method and will fail cast to String() + corrupt: [corruptObject], + }; + jest.spyOn(console, 'error').mockImplementation(); + + await callApi({ + url: mockPostUrl, + method: 'POST', + postPayload, + stringify: false, + }); + + const calls = fetchMock.calls(mockPostUrl); + expect(calls).toHaveLength(1); + const unstringified = (calls[0][1] as RequestInit).body as FormData; + const hasCorruptKey = unstringified.has('corrupt'); + expect(hasCorruptKey).toBeFalsy(); + // When a corrupt attribute is encountred, a console.error call is made with info about the corrupt attribute + // eslint-disable-next-line no-console + expect(console.error).toHaveBeenCalledTimes(1); + }); }); describe('PUT requests', () => { diff --git a/superset-frontend/packages/superset-ui-core/test/connection/callApi/parseResponse.test.ts b/superset-frontend/packages/superset-ui-core/test/connection/callApi/parseResponse.test.ts index d54be27e9c8f..e13964ecf730 100644 --- a/superset-frontend/packages/superset-ui-core/test/connection/callApi/parseResponse.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/connection/callApi/parseResponse.test.ts @@ -137,6 +137,38 @@ describe('parseResponse()', () => { expect(responseRaw.bodyUsed).toBe(false); }); + it('resolves to big number value if `parseMethod=json-bigint`', async () => { + const mockBigIntUrl = '/mock/get/bigInt'; + const mockGetBigIntPayload = + '{ "value": 9223372036854775807, "minus": { "value": -483729382918228373892, "str": "something" }, "number": 1234, "floatValue": { "plus": 0.3452211361231223, "minus": -0.3452211361231223 } }'; + fetchMock.get(mockBigIntUrl, mockGetBigIntPayload); + const responseBigNumber = await parseResponse( + callApi({ url: mockBigIntUrl, method: 'GET' }), + 'json-bigint', + ); + expect(`${responseBigNumber.json.value}`).toEqual('9223372036854775807'); + expect(`${responseBigNumber.json.minus.value}`).toEqual( + '-483729382918228373892', + ); + expect(responseBigNumber.json.number).toEqual(1234); + expect(responseBigNumber.json.floatValue.plus).toEqual(0.3452211361231223); + expect(responseBigNumber.json.floatValue.minus).toEqual( + -0.3452211361231223, + ); + expect( + responseBigNumber.json.floatValue.plus + + responseBigNumber.json.floatValue.minus, + ).toEqual(0); + expect( + responseBigNumber.json.floatValue.plus / + responseBigNumber.json.floatValue.minus, + ).toEqual(-1); + expect(Math.min(responseBigNumber.json.floatValue.plus, 0)).toEqual(0); + expect(Math.abs(responseBigNumber.json.floatValue.minus)).toEqual( + responseBigNumber.json.floatValue.plus, + ); + }); + it('rejects if request.ok=false', async () => { expect.assertions(3); const mockNotOkayUrl = '/mock/notokay/url'; diff --git a/superset-frontend/packages/superset-ui-core/test/models/Registry.test.ts b/superset-frontend/packages/superset-ui-core/test/models/Registry.test.ts index 1c85dc242c90..11c2e65eb51f 100644 --- a/superset-frontend/packages/superset-ui-core/test/models/Registry.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/models/Registry.test.ts @@ -404,7 +404,7 @@ describe('Registry', () => { expect(listener).toBeCalledWith(['foo']); }); - it('calls the listener when a value is overriden', () => { + it('calls the listener when a value is overridden', () => { registry.registerValue('foo', 'bar'); listener.mockClear(); registry.registerValue('foo', 'baz'); diff --git a/superset-frontend/packages/superset-ui-core/test/number-format/factories/createD3NumberFormatter.test.ts b/superset-frontend/packages/superset-ui-core/test/number-format/factories/createD3NumberFormatter.test.ts index c80c72c30868..951ab039c5a9 100644 --- a/superset-frontend/packages/superset-ui-core/test/number-format/factories/createD3NumberFormatter.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/number-format/factories/createD3NumberFormatter.test.ts @@ -62,7 +62,7 @@ describe('createD3NumberFormatter(config)', () => { }); }); describe('config.description', () => { - it('set decription if specified', () => { + it('set description if specified', () => { const formatter = createD3NumberFormatter({ description: 'lorem ipsum', formatString: '.2f', diff --git a/superset-frontend/packages/superset-ui-core/test/query/DatasourceKey.test.ts b/superset-frontend/packages/superset-ui-core/test/query/DatasourceKey.test.ts index 6b1d62e6aa13..4a3c8772c372 100644 --- a/superset-frontend/packages/superset-ui-core/test/query/DatasourceKey.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/query/DatasourceKey.test.ts @@ -19,18 +19,15 @@ import { DatasourceKey } from '@superset-ui/core'; describe('DatasourceKey', () => { - const tableKey = '5__table'; - const druidKey = '5__druid'; - it('should handle table data sources', () => { - const datasourceKey = new DatasourceKey(tableKey); - expect(datasourceKey.toString()).toBe(tableKey); + const datasourceKey = new DatasourceKey('5__table'); + expect(datasourceKey.toString()).toBe('5__table'); expect(datasourceKey.toObject()).toEqual({ id: 5, type: 'table' }); }); - it('should handle druid data sources', () => { - const datasourceKey = new DatasourceKey(druidKey); - expect(datasourceKey.toString()).toBe(druidKey); - expect(datasourceKey.toObject()).toEqual({ id: 5, type: 'druid' }); + it('should handle query data sources', () => { + const datasourceKey = new DatasourceKey('5__query'); + expect(datasourceKey.toString()).toBe('5__query'); + expect(datasourceKey.toObject()).toEqual({ id: 5, type: 'query' }); }); }); diff --git a/superset-frontend/packages/superset-ui-core/test/query/buildQueryContext.test.ts b/superset-frontend/packages/superset-ui-core/test/query/buildQueryContext.test.ts index 366feeff7a2e..9d47361e8fdd 100644 --- a/superset-frontend/packages/superset-ui-core/test/query/buildQueryContext.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/query/buildQueryContext.test.ts @@ -17,6 +17,8 @@ * under the License. */ import { buildQueryContext } from '@superset-ui/core'; +import * as queryModule from '../../src/query/normalizeTimeColumn'; +import * as getXAxisModule from '../../src/query/getXAxis'; describe('buildQueryContext', () => { it('should build datasource for table sources and apply defaults', () => { @@ -31,17 +33,6 @@ describe('buildQueryContext', () => { expect(queryContext.result_format).toBe('json'); expect(queryContext.result_type).toBe('full'); }); - it('should build datasource for druid sources and set force to true', () => { - const queryContext = buildQueryContext({ - datasource: '5__druid', - granularity: 'ds', - viz_type: 'table', - force: true, - }); - expect(queryContext.datasource.id).toBe(5); - expect(queryContext.datasource.type).toBe('druid'); - expect(queryContext.force).toBe(true); - }); it('should build datasource for table sources with columns', () => { const queryContext = buildQueryContext( { @@ -108,6 +99,7 @@ describe('buildQueryContext', () => { ]), ); }); + // todo(Yongjie): move these test case into buildQueryObject.test.ts it('should remove undefined value in post_processing', () => { const queryContext = buildQueryContext( { @@ -133,4 +125,43 @@ describe('buildQueryContext', () => { }, ]); }); + it('should call normalizeTimeColumn if GENERIC_CHART_AXES is enabled and has x_axis', () => { + Object.defineProperty(getXAxisModule, 'hasGenericChartAxes', { + value: true, + }); + const spyNormalizeTimeColumn = jest.spyOn( + queryModule, + 'normalizeTimeColumn', + ); + + buildQueryContext( + { + datasource: '5__table', + viz_type: 'table', + x_axis: 'axis', + }, + () => [{}], + ); + expect(spyNormalizeTimeColumn).toBeCalled(); + spyNormalizeTimeColumn.mockRestore(); + }); + it("shouldn't call normalizeTimeColumn if GENERIC_CHART_AXES is disabled", () => { + Object.defineProperty(getXAxisModule, 'hasGenericChartAxes', { + value: false, + }); + const spyNormalizeTimeColumn = jest.spyOn( + queryModule, + 'normalizeTimeColumn', + ); + + buildQueryContext( + { + datasource: '5__table', + viz_type: 'table', + }, + () => [{}], + ); + expect(spyNormalizeTimeColumn).not.toBeCalled(); + spyNormalizeTimeColumn.mockRestore(); + }); }); diff --git a/superset-frontend/packages/superset-ui-core/test/query/buildQueryObject.test.ts b/superset-frontend/packages/superset-ui-core/test/query/buildQueryObject.test.ts index 321e2a840177..cdabcff57e0b 100644 --- a/superset-frontend/packages/superset-ui-core/test/query/buildQueryObject.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/query/buildQueryObject.test.ts @@ -119,15 +119,26 @@ describe('buildQueryObject', () => { expect(query.metrics).toEqual(['sum__num', 'avg__num']); }); - it('should build limit', () => { - const limit = 2; + it('should build series_limit from legacy control', () => { + const series_limit = 2; query = buildQueryObject({ datasource: '5__table', granularity_sqla: 'ds', viz_type: 'table', - limit, + limit: series_limit, }); - expect(query.timeseries_limit).toEqual(limit); + expect(query.series_limit).toEqual(series_limit); + }); + + it('should build series_limit', () => { + const series_limit = 2; + query = buildQueryObject({ + datasource: '5__table', + granularity_sqla: 'ds', + viz_type: 'table', + series_limit, + }); + expect(query.series_limit).toEqual(series_limit); }); it('should build order_desc', () => { @@ -141,7 +152,7 @@ describe('buildQueryObject', () => { expect(query.order_desc).toEqual(orderDesc); }); - it('should build timeseries_limit_metric', () => { + it('should build series_limit_metric from legacy control', () => { const metric = 'country'; query = buildQueryObject({ datasource: '5__table', @@ -149,7 +160,7 @@ describe('buildQueryObject', () => { viz_type: 'table', timeseries_limit_metric: metric, }); - expect(query.timeseries_limit_metric).toEqual(metric); + expect(query.series_limit_metric).toEqual(metric); }); it('should build series_limit_metric', () => { @@ -291,6 +302,26 @@ describe('buildQueryObject', () => { ).toBeUndefined(); }); + it('should populate granularity', () => { + const granularity = 'ds'; + query = buildQueryObject({ + datasource: '5__table', + granularity, + viz_type: 'table', + }); + expect(query.granularity).toEqual(granularity); + }); + + it('should populate granularity from legacy field', () => { + const granularity = 'ds'; + query = buildQueryObject({ + datasource: '5__table', + granularity_sqla: granularity, + viz_type: 'table', + }); + expect(query.granularity).toEqual(granularity); + }); + it('should populate custom_params', () => { const customParams: JsonObject = { customObject: { id: 137, name: 'C-137' }, diff --git a/superset-frontend/packages/superset-ui-core/test/query/extractExtras.test.ts b/superset-frontend/packages/superset-ui-core/test/query/extractExtras.test.ts index ca6ab730d1af..35174f72bd35 100644 --- a/superset-frontend/packages/superset-ui-core/test/query/extractExtras.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/query/extractExtras.test.ts @@ -16,13 +16,14 @@ * specific language governing permissions and limitations * under the License. */ +import { TimeGranularity } from '@superset-ui/core'; import extractExtras from '../../src/query/extractExtras'; describe('extractExtras', () => { const baseQueryFormData = { datasource: '1__table', granularity_sqla: 'ds', - time_grain_sqla: 'PT1M', + time_grain_sqla: TimeGranularity.MINUTE, viz_type: 'my_viz', }; diff --git a/superset-frontend/packages/superset-ui-core/test/query/getAxis.test.ts b/superset-frontend/packages/superset-ui-core/test/query/getAxis.test.ts new file mode 100644 index 000000000000..010bd9fc6759 --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/test/query/getAxis.test.ts @@ -0,0 +1,26 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { isXAxisSet } from '@superset-ui/core'; + +test('isXAxisSet', () => { + expect(isXAxisSet({ datasource: '123', viz_type: 'table' })).not.toBeTruthy(); + expect( + isXAxisSet({ datasource: '123', viz_type: 'table', x_axis: 'axis' }), + ).toBeTruthy(); +}); diff --git a/superset-frontend/packages/superset-ui-core/test/query/normalizeOrderBy.test.ts b/superset-frontend/packages/superset-ui-core/test/query/normalizeOrderBy.test.ts index 57b186a1297e..564d4aa815bb 100644 --- a/superset-frontend/packages/superset-ui-core/test/query/normalizeOrderBy.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/query/normalizeOrderBy.test.ts @@ -29,13 +29,13 @@ describe('normalizeOrderBy', () => { expect(normalizeOrderBy(query)).toEqual(query); }); - it('has timeseries_limit_metric in queryObject', () => { + it('has series_limit_metric in queryObject', () => { const query: QueryObject = { datasource: '5__table', viz_type: 'table', time_range: '1 year ago : 2013', metrics: ['count(*)'], - timeseries_limit_metric: { + series_limit_metric: { expressionType: 'SIMPLE', column: { id: 1, @@ -46,7 +46,7 @@ describe('normalizeOrderBy', () => { order_desc: true, }; const expectedQueryObject = normalizeOrderBy(query); - expect(expectedQueryObject).not.toHaveProperty('timeseries_limit_metric'); + expect(expectedQueryObject).not.toHaveProperty('series_limit_metric'); expect(expectedQueryObject).not.toHaveProperty('order_desc'); expect(expectedQueryObject).toEqual({ datasource: '5__table', @@ -118,7 +118,7 @@ describe('normalizeOrderBy', () => { order_desc: true, }; const expectedQueryObject = normalizeOrderBy(query); - expect(expectedQueryObject).not.toHaveProperty('timeseries_limit_metric'); + expect(expectedQueryObject).not.toHaveProperty('series_limit_metric'); expect(expectedQueryObject).not.toHaveProperty('order_desc'); expect(expectedQueryObject).toEqual({ datasource: '5__table', diff --git a/superset-frontend/packages/superset-ui-core/test/query/normalizeTimeColumn.test.ts b/superset-frontend/packages/superset-ui-core/test/query/normalizeTimeColumn.test.ts new file mode 100644 index 000000000000..22189b90551c --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/test/query/normalizeTimeColumn.test.ts @@ -0,0 +1,291 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { + normalizeTimeColumn, + QueryObject, + SqlaFormData, +} from '@superset-ui/core'; + +describe('GENERIC_CHART_AXES is disabled', () => { + let windowSpy: any; + + beforeAll(() => { + // @ts-ignore + windowSpy = jest.spyOn(window, 'window', 'get').mockImplementation(() => ({ + featureFlags: { + GENERIC_CHART_AXES: false, + }, + })); + }); + + afterAll(() => { + windowSpy.mockRestore(); + }); + + it('should return original QueryObject if disabled GENERIC_CHART_AXES', () => { + const formData: SqlaFormData = { + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + time_grain_sqla: 'P1Y', + time_range: '1 year ago : 2013', + columns: ['col1'], + metrics: ['count(*)'], + }; + const query: QueryObject = { + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + extras: { + time_grain_sqla: 'P1Y', + }, + time_range: '1 year ago : 2013', + orderby: [['count(*)', true]], + columns: ['col1'], + metrics: ['count(*)'], + is_timeseries: true, + }; + expect(normalizeTimeColumn(formData, query)).toEqual(query); + }); + + it('should return converted QueryObject even though disabled GENERIC_CHART_AXES (x_axis in formData)', () => { + const formData: SqlaFormData = { + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + time_grain_sqla: 'P1Y', + time_range: '1 year ago : 2013', + columns: ['col1'], + metrics: ['count(*)'], + x_axis: 'time_column', + }; + const query: QueryObject = { + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + extras: { + time_grain_sqla: 'P1Y', + }, + time_range: '1 year ago : 2013', + orderby: [['count(*)', true]], + columns: ['time_column', 'col1'], + metrics: ['count(*)'], + is_timeseries: true, + }; + expect(normalizeTimeColumn(formData, query)).toEqual({ + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + extras: {}, + time_range: '1 year ago : 2013', + orderby: [['count(*)', true]], + columns: [ + { + timeGrain: 'P1Y', + columnType: 'BASE_AXIS', + sqlExpression: 'time_column', + label: 'time_column', + expressionType: 'SQL', + }, + 'col1', + ], + metrics: ['count(*)'], + }); + }); +}); + +describe('GENERIC_CHART_AXES is enabled', () => { + let windowSpy: any; + + beforeAll(() => { + // @ts-ignore + windowSpy = jest.spyOn(window, 'window', 'get').mockImplementation(() => ({ + featureFlags: { + GENERIC_CHART_AXES: true, + }, + })); + }); + + afterAll(() => { + windowSpy.mockRestore(); + }); + + it('should return original QueryObject if x_axis is empty', () => { + const formData: SqlaFormData = { + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + time_grain_sqla: 'P1Y', + time_range: '1 year ago : 2013', + columns: ['col1'], + metrics: ['count(*)'], + }; + const query: QueryObject = { + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + extras: { + time_grain_sqla: 'P1Y', + }, + time_range: '1 year ago : 2013', + orderby: [['count(*)', true]], + columns: ['col1'], + metrics: ['count(*)'], + is_timeseries: true, + }; + expect(normalizeTimeColumn(formData, query)).toEqual(query); + }); + + it('should support different columns for x-axis and granularity', () => { + const formData: SqlaFormData = { + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + time_grain_sqla: 'P1Y', + time_range: '1 year ago : 2013', + x_axis: 'time_column_in_x_axis', + columns: ['col1'], + metrics: ['count(*)'], + }; + const query: QueryObject = { + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + extras: { + time_grain_sqla: 'P1Y', + where: '', + having: '', + }, + time_range: '1 year ago : 2013', + orderby: [['count(*)', true]], + columns: ['time_column_in_x_axis', 'col1'], + metrics: ['count(*)'], + is_timeseries: true, + }; + expect(normalizeTimeColumn(formData, query)).toEqual({ + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + extras: { where: '', having: '' }, + time_range: '1 year ago : 2013', + orderby: [['count(*)', true]], + columns: [ + { + timeGrain: 'P1Y', + columnType: 'BASE_AXIS', + sqlExpression: 'time_column_in_x_axis', + label: 'time_column_in_x_axis', + expressionType: 'SQL', + }, + 'col1', + ], + metrics: ['count(*)'], + }); + }); + + it('should support custom SQL in x-axis', () => { + const formData: SqlaFormData = { + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + time_grain_sqla: 'P1Y', + time_range: '1 year ago : 2013', + x_axis: { + expressionType: 'SQL', + label: 'Order Data + 1 year', + sqlExpression: '"Order Date" + interval \'1 year\'', + }, + columns: ['col1'], + metrics: ['count(*)'], + }; + const query: QueryObject = { + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + extras: { + time_grain_sqla: 'P1Y', + where: '', + having: '', + }, + time_range: '1 year ago : 2013', + orderby: [['count(*)', true]], + columns: [ + { + expressionType: 'SQL', + label: 'Order Data + 1 year', + sqlExpression: '"Order Date" + interval \'1 year\'', + }, + 'col1', + ], + metrics: ['count(*)'], + is_timeseries: true, + }; + expect(normalizeTimeColumn(formData, query)).toEqual({ + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + extras: { where: '', having: '' }, + time_range: '1 year ago : 2013', + orderby: [['count(*)', true]], + columns: [ + { + timeGrain: 'P1Y', + columnType: 'BASE_AXIS', + expressionType: 'SQL', + label: 'Order Data + 1 year', + sqlExpression: `"Order Date" + interval '1 year'`, + }, + 'col1', + ], + metrics: ['count(*)'], + }); + }); + + it('fallback and invalid columns value', () => { + const formData: SqlaFormData = { + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + time_grain_sqla: 'P1Y', + time_range: '1 year ago : 2013', + x_axis: { + expressionType: 'SQL', + label: 'Order Data + 1 year', + sqlExpression: '"Order Date" + interval \'1 year\'', + }, + columns: ['col1'], + metrics: ['count(*)'], + }; + const query: QueryObject = { + datasource: '5__table', + viz_type: 'table', + granularity: 'time_column', + extras: { + time_grain_sqla: 'P1Y', + where: '', + having: '', + }, + time_range: '1 year ago : 2013', + orderby: [['count(*)', true]], + metrics: ['count(*)'], + is_timeseries: true, + }; + expect(normalizeTimeColumn(formData, query)).toEqual(query); + }); +}); diff --git a/superset-frontend/packages/superset-ui-core/test/query/processFilters.test.ts b/superset-frontend/packages/superset-ui-core/test/query/processFilters.test.ts index 151c0363f16f..0d4fc4cd9f7c 100644 --- a/superset-frontend/packages/superset-ui-core/test/query/processFilters.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/query/processFilters.test.ts @@ -28,7 +28,7 @@ describe('processFilters', () => { }), ).toEqual( expect.objectContaining({ - extras: { having: '', having_druid: [], where: '' }, + extras: { having: '', where: '' }, filters: [], }), ); @@ -54,12 +54,19 @@ describe('processFilters', () => { subject: 'gender', operator: 'IS NOT NULL', }, + // ignore simple having filter + { + expressionType: 'SIMPLE', + clause: 'HAVING', + subject: 'sum(sales)', + operator: '>', + comparator: '100', + }, ], }), ).toEqual({ extras: { having: '', - having_druid: [], where: '', }, filters: [ @@ -89,7 +96,6 @@ describe('processFilters', () => { filters: [], extras: { having: '', - having_druid: [], where: '(1 = 1)', }, }); @@ -115,20 +121,6 @@ describe('processFilters', () => { operator: '==', comparator: 'almond', }, - { - expressionType: 'SIMPLE', - clause: 'HAVING', - subject: 'sweetness', - operator: '>', - comparator: '0', - }, - { - expressionType: 'SIMPLE', - clause: 'HAVING', - subject: 'sweetness', - operator: '<=', - comparator: '50', - }, { expressionType: 'SQL', clause: 'WHERE', @@ -154,18 +146,6 @@ describe('processFilters', () => { ).toEqual({ extras: { having: '(ice = 25 OR ice = 50) AND (waitTime <= 180 -- comment\n)', - having_druid: [ - { - col: 'sweetness', - op: '>', - val: '0', - }, - { - col: 'sweetness', - op: '<=', - val: '50', - }, - ], where: "(tea = 'jasmine') AND (cup = 'large' -- comment\n)", }, filters: [ diff --git a/superset-frontend/packages/superset-ui-core/test/query/types/Column.test.ts b/superset-frontend/packages/superset-ui-core/test/query/types/Column.test.ts new file mode 100644 index 000000000000..d4391cfd0194 --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/test/query/types/Column.test.ts @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { + isAdhocColumn, + isPhysicalColumn, + isQueryFormColumn, +} from '@superset-ui/core'; + +const adhocColumn = { + expressionType: 'SQL', + label: 'country', + optionName: 'country', + sqlExpression: 'country', +}; + +test('isPhysicalColumn returns true', () => { + expect(isPhysicalColumn('gender')).toEqual(true); +}); + +test('isPhysicalColumn returns false', () => { + expect(isPhysicalColumn(adhocColumn)).toEqual(false); +}); + +test('isAdhocColumn returns true', () => { + expect(isAdhocColumn(adhocColumn)).toEqual(true); +}); + +test('isAdhocColumn returns false', () => { + expect(isAdhocColumn('hello')).toEqual(false); + expect(isAdhocColumn({})).toEqual(false); + expect( + isAdhocColumn({ + expressionType: 'SQL', + label: 'country', + optionName: 'country', + }), + ).toEqual(false); +}); + +test('isQueryFormColumn returns true', () => { + expect(isQueryFormColumn('gender')).toEqual(true); + expect(isQueryFormColumn(adhocColumn)).toEqual(true); +}); + +test('isQueryFormColumn returns false', () => { + expect(isQueryFormColumn({})).toEqual(false); +}); diff --git a/superset-frontend/packages/superset-ui-core/test/query/types/Dashboard.test.ts b/superset-frontend/packages/superset-ui-core/test/query/types/Dashboard.test.ts index ea6236338c76..f72bff490f11 100644 --- a/superset-frontend/packages/superset-ui-core/test/query/types/Dashboard.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/query/types/Dashboard.test.ts @@ -21,27 +21,50 @@ import { isFilterDivider, Filter, NativeFilterType, + FilterWithDataMask, + Divider, + isNativeFilterWithDataMask, } from '@superset-ui/core'; -test('should do native filter type guard', () => { - const dummyFilter: Filter = { - cascadeParentIds: [], - defaultDataMask: {}, - id: 'dummyID', - name: 'dummyName', - scope: { rootPath: [], excluded: [] }, - filterType: 'dummyType', - targets: [{}], - controlValues: {}, - type: NativeFilterType.NATIVE_FILTER, - description: 'dummyDesc', - }; - expect(isNativeFilter(dummyFilter)).toBeTruthy(); - expect( - isFilterDivider({ - ...dummyFilter, - type: NativeFilterType.DIVIDER, - title: 'dummyTitle', - }), - ).toBeTruthy(); +const filter: Filter = { + cascadeParentIds: [], + defaultDataMask: {}, + id: 'filter_id', + name: 'Filter Name', + scope: { rootPath: [], excluded: [] }, + filterType: 'filter_type', + targets: [{}], + controlValues: {}, + type: NativeFilterType.NATIVE_FILTER, + description: 'Filter description.', +}; + +const filterWithDataMask: FilterWithDataMask = { + ...filter, + dataMask: { id: 'data_mask_id', filterState: { value: 'Filter value' } }, +}; + +const filterDivider: Divider = { + id: 'divider_id', + type: NativeFilterType.DIVIDER, + title: 'Divider title', + description: 'Divider description.', +}; + +test('filter type guard', () => { + expect(isNativeFilter(filter)).toBeTruthy(); + expect(isNativeFilter(filterWithDataMask)).toBeTruthy(); + expect(isNativeFilter(filterDivider)).toBeFalsy(); +}); + +test('filter with dataMask type guard', () => { + expect(isNativeFilterWithDataMask(filter)).toBeFalsy(); + expect(isNativeFilterWithDataMask(filterWithDataMask)).toBeTruthy(); + expect(isNativeFilterWithDataMask(filterDivider)).toBeFalsy(); +}); + +test('filter divider type guard', () => { + expect(isFilterDivider(filter)).toBeFalsy(); + expect(isFilterDivider(filterWithDataMask)).toBeFalsy(); + expect(isFilterDivider(filterDivider)).toBeTruthy(); }); diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/legacySortBy.tsx b/superset-frontend/packages/superset-ui-core/test/query/types/Datasource.test.ts similarity index 60% rename from superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/legacySortBy.tsx rename to superset-frontend/packages/superset-ui-core/test/query/types/Datasource.test.ts index 3cb882d29ece..c80f3d695001 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/legacySortBy.tsx +++ b/superset-frontend/packages/superset-ui-core/test/query/types/Datasource.test.ts @@ -16,22 +16,22 @@ * specific language governing permissions and limitations * under the License. */ -import { t } from '@superset-ui/core'; -import { ControlSetRow } from '../types'; +import { DatasourceType, DEFAULT_METRICS } from '@superset-ui/core'; -export const legacySortBy: ControlSetRow[] = [ - ['legacy_order_by'], - [ +test('DEFAULT_METRICS', () => { + expect(DEFAULT_METRICS).toEqual([ { - name: 'order_desc', - config: { - type: 'CheckboxControl', - label: t('Sort descending'), - default: true, - description: t( - 'Whether to sort descending or ascending. Takes effect only when "Sort by" is set', - ), - }, + metric_name: 'COUNT(*)', + expression: 'COUNT(*)', }, - ], -]; + ]); +}); + +test('DatasourceType', () => { + expect(Object.keys(DatasourceType).length).toBe(5); + expect(DatasourceType.Table).toBe('table'); + expect(DatasourceType.Query).toBe('query'); + expect(DatasourceType.Dataset).toBe('dataset'); + expect(DatasourceType.SlTable).toBe('sl_table'); + expect(DatasourceType.SavedQuery).toBe('saved_query'); +}); diff --git a/superset-frontend/packages/superset-ui-core/test/query/types/Filter.test.ts b/superset-frontend/packages/superset-ui-core/test/query/types/Filter.test.ts index 3861bb0085b5..4aa4a474159b 100644 --- a/superset-frontend/packages/superset-ui-core/test/query/types/Filter.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/query/types/Filter.test.ts @@ -21,6 +21,7 @@ import { isUnaryAdhocFilter, isBinaryAdhocFilter, isSetAdhocFilter, + isFreeFormAdhocFilter, } from '@superset-ui/core'; describe('Filter type guards', () => { @@ -95,4 +96,26 @@ describe('Filter type guards', () => { ).toEqual(false); }); }); + describe('isFreeFormAdhocFilter', () => { + it('should return true when it is the correct type', () => { + expect( + isFreeFormAdhocFilter({ + expressionType: 'SQL', + clause: 'WHERE', + sqlExpression: 'gender = "boy"', + }), + ).toEqual(true); + }); + it('should return false otherwise', () => { + expect( + isFreeFormAdhocFilter({ + expressionType: 'SIMPLE', + clause: 'WHERE', + subject: 'tea', + operator: '==', + comparator: 'matcha', + }), + ).toEqual(false); + }); + }); }); diff --git a/superset-frontend/packages/superset-ui-core/test/query/types/Metric.test.ts b/superset-frontend/packages/superset-ui-core/test/query/types/Metric.test.ts new file mode 100644 index 000000000000..041e91340958 --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/test/query/types/Metric.test.ts @@ -0,0 +1,88 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { + isSavedMetric, + isAdhocMetricSimple, + isAdhocMetricSQL, + isQueryFormMetric, +} from '@superset-ui/core'; + +const adhocMetricSimple = { + expressionType: 'SIMPLE', + column: { + id: 1, + column_name: 'sales', + columnName: 'sales', + verbose_name: 'sales', + }, + aggregate: 'SUM', + label: 'count', + optionName: 'count', +}; + +const adhocMetricSQL = { + expressionType: 'SQL', + label: 'count', + optionName: 'count', + sqlExpression: 'count(*)', +}; + +const savedMetric = 'count(*)'; + +test('isSavedMetric returns true', () => { + expect(isSavedMetric(savedMetric)).toEqual(true); +}); + +test('isSavedMetric returns false', () => { + expect(isSavedMetric(adhocMetricSQL)).toEqual(false); + expect(isSavedMetric(null)).toEqual(false); + expect(isSavedMetric(undefined)).toEqual(false); +}); + +test('isAdhocMetricSimple returns true', () => { + expect(isAdhocMetricSimple(adhocMetricSimple)).toEqual(true); +}); + +test('isAdhocMetricSimple returns false', () => { + expect(isAdhocMetricSimple('hello')).toEqual(false); + expect(isAdhocMetricSimple({})).toEqual(false); + expect(isAdhocMetricSimple(adhocMetricSQL)).toEqual(false); +}); + +test('isAdhocMetricSQL returns true', () => { + expect(isAdhocMetricSQL(adhocMetricSQL)).toEqual(true); +}); + +test('isAdhocMetricSQL returns false', () => { + expect(isAdhocMetricSQL('hello')).toEqual(false); + expect(isAdhocMetricSQL({})).toEqual(false); + expect(isAdhocMetricSQL(adhocMetricSimple)).toEqual(false); +}); + +test('isQueryFormMetric returns true', () => { + expect(isQueryFormMetric(adhocMetricSQL)).toEqual(true); + expect(isQueryFormMetric(adhocMetricSimple)).toEqual(true); + expect(isQueryFormMetric(savedMetric)).toEqual(true); +}); + +test('isQueryFormMetric returns false', () => { + expect(isQueryFormMetric({})).toEqual(false); + expect(isQueryFormMetric(undefined)).toEqual(false); + expect(isQueryFormMetric(null)).toEqual(false); +}); diff --git a/superset-frontend/packages/superset-ui-core/test/query/types/PostProcessing.test.ts b/superset-frontend/packages/superset-ui-core/test/query/types/PostProcessing.test.ts index 1d7d9f044e5d..047699fa5741 100644 --- a/superset-frontend/packages/superset-ui-core/test/query/types/PostProcessing.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/query/types/PostProcessing.test.ts @@ -42,7 +42,7 @@ import { PostProcessingRolling, PostProcessingSort, } from '@superset-ui/core'; -import { ComparisionType, RollingType, TimeGranularity } from '../../../src'; +import { ComparisonType, RollingType, TimeGranularity } from '../../../src'; const AGGREGATES_OPTION: Aggregates = { bar: { @@ -74,7 +74,7 @@ const COMPARE_RULE: PostProcessingCompare = { options: { source_columns: ['foo'], compare_columns: ['bar'], - compare_type: ComparisionType.Percentage, + compare_type: ComparisonType.Percentage, drop_original_columns: false, }, }; @@ -110,8 +110,6 @@ const PIVOT_RULE: PostProcessingPivot = { index: ['foo'], columns: ['bar'], aggregates: AGGREGATES_OPTION, - flatten_columns: true, - reset_index: true, }, }; @@ -149,7 +147,7 @@ const ROLLING_RULE: PostProcessingRolling = { const SORT_RULE: PostProcessingSort = { operation: 'sort', options: { - columns: { foo: true }, + by: 'foo', }, }; diff --git a/superset-frontend/packages/superset-ui-core/test/ui-overrides/UiOverrideRegistry.test.ts b/superset-frontend/packages/superset-ui-core/test/ui-overrides/ExtensionsRegistry.test.ts similarity index 81% rename from superset-frontend/packages/superset-ui-core/test/ui-overrides/UiOverrideRegistry.test.ts rename to superset-frontend/packages/superset-ui-core/test/ui-overrides/ExtensionsRegistry.test.ts index 6e440551416d..e80a3baad422 100644 --- a/superset-frontend/packages/superset-ui-core/test/ui-overrides/UiOverrideRegistry.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/ui-overrides/ExtensionsRegistry.test.ts @@ -16,8 +16,8 @@ * specific language governing permissions and limitations * under the License. */ -import { getUiOverrideRegistry } from '@superset-ui/core'; +import { getExtensionsRegistry } from '@superset-ui/core'; -test('should get instance of getUiOverrideRegistry', () => { - expect(getUiOverrideRegistry().name).toBe('UiOverrideRegistry'); +test('should get instance of getExtensionsRegistry', () => { + expect(getExtensionsRegistry().name).toBe('ExtensionsRegistry'); }); diff --git a/superset-frontend/packages/superset-ui-core/test/utils/featureFlag.test.ts b/superset-frontend/packages/superset-ui-core/test/utils/featureFlag.test.ts index 52a57909aa38..66c58e79af56 100644 --- a/superset-frontend/packages/superset-ui-core/test/utils/featureFlag.test.ts +++ b/superset-frontend/packages/superset-ui-core/test/utils/featureFlag.test.ts @@ -16,20 +16,41 @@ * specific language governing permissions and limitations * under the License. */ +import mockConsole from 'jest-mock-console'; +import { isFeatureEnabled, FeatureFlag } from '@superset-ui/core'; -import { FeatureFlag, isFeatureEnabled } from '@superset-ui/core'; +it('returns false and raises console error if feature flags have not been initialized', () => { + mockConsole(); + Object.defineProperty(window, 'featureFlags', { + value: undefined, + }); + + expect(isFeatureEnabled(FeatureFlag.ALLOW_DASHBOARD_DOMAIN_SHARDING)).toEqual( + false, + ); + expect(console.error).toHaveBeenCalled(); + // @ts-expect-error + expect(console.error.mock.calls[0][0]).toEqual( + 'Failed to query feature flag ALLOW_DASHBOARD_DOMAIN_SHARDING', + ); +}); -describe('isFeatureFlagEnabled', () => { - window.featureFlags = { - [FeatureFlag.CLIENT_CACHE]: true, - }; - it('returns false for unset feature flag', () => { - expect( - isFeatureEnabled(FeatureFlag.ALLOW_DASHBOARD_DOMAIN_SHARDING), - ).toEqual(false); +it('returns false for unset feature flag', () => { + Object.defineProperty(window, 'featureFlags', { + value: {}, }); - it('returns true for set feature flag', () => { - expect(isFeatureEnabled(FeatureFlag.CLIENT_CACHE)).toEqual(true); + expect(isFeatureEnabled(FeatureFlag.ALLOW_DASHBOARD_DOMAIN_SHARDING)).toEqual( + false, + ); +}); + +it('returns true for set feature flag', () => { + Object.defineProperty(window, 'featureFlags', { + value: { + CLIENT_CACHE: true, + }, }); + + expect(isFeatureEnabled(FeatureFlag.CLIENT_CACHE)).toEqual(true); }); diff --git a/superset-frontend/packages/superset-ui-core/test/utils/lruCache.test.ts b/superset-frontend/packages/superset-ui-core/test/utils/lruCache.test.ts new file mode 100644 index 000000000000..f8a077eba031 --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/test/utils/lruCache.test.ts @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { lruCache } from '@superset-ui/core'; + +test('initial LRU', () => { + expect(lruCache().capacity).toBe(100); + expect(lruCache(10).capacity).toBe(10); + expect(lruCache(10).size).toBe(0); + expect(() => lruCache(0)).toThrow(Error); +}); + +test('LRU operations', () => { + const cache = lruCache<string>(3); + cache.set('1', 'a'); + cache.set('2', 'b'); + cache.set('3', 'c'); + cache.set('4', 'd'); + expect(cache.size).toBe(3); + expect(cache.has('1')).toBeFalsy(); + expect(cache.get('1')).toBeUndefined(); + cache.get('2'); + cache.set('5', 'e'); + expect(cache.has('2')).toBeTruthy(); + expect(cache.has('3')).toBeFalsy(); + // @ts-expect-error + expect(() => cache.set(0)).toThrow(TypeError); + // @ts-expect-error + expect(() => cache.get(0)).toThrow(TypeError); + expect(cache.size).toBe(3); + cache.clear(); + expect(cache.size).toBe(0); + expect(cache.capacity).toBe(3); +}); + +test('LRU handle null and undefined', () => { + const cache = lruCache(); + cache.set('a', null); + cache.set('b', undefined); + expect(cache.has('a')).toBeTruthy(); + expect(cache.has('b')).toBeTruthy(); + expect(cache.get('a')).toBeNull(); + expect(cache.get('b')).toBeUndefined(); +}); diff --git a/superset-frontend/packages/superset-ui-core/types/external.d.ts b/superset-frontend/packages/superset-ui-core/types/external.d.ts index 31b0250bf445..dcce5fa8823f 100644 --- a/superset-frontend/packages/superset-ui-core/types/external.d.ts +++ b/superset-frontend/packages/superset-ui-core/types/external.d.ts @@ -17,6 +17,6 @@ * under the License. */ /** - * Stub for the untypped jed module. + * Stub for the untyped jed module. */ declare module 'jed'; diff --git a/superset-frontend/packages/superset-ui-demo/package.json b/superset-frontend/packages/superset-ui-demo/package.json index bf3da61c1258..a2ff398662dc 100644 --- a/superset-frontend/packages/superset-ui-demo/package.json +++ b/superset-frontend/packages/superset-ui-demo/package.json @@ -41,7 +41,7 @@ "@storybook/addons": "^6.3.12", "@storybook/react": "^6.3.12", "@types/react-loadable": "^5.5.3", - "antd": "^4.9.4", + "antd": "4.10.3", "bootstrap": "^3.4.1", "core-js": "3.8.3", "gh-pages": "^3.0.0", diff --git a/superset-frontend/packages/superset-ui-demo/storybook/shared/components/VerifyCORS.tsx b/superset-frontend/packages/superset-ui-demo/storybook/shared/components/VerifyCORS.tsx index de0b2ef8aba0..3aa082186981 100644 --- a/superset-frontend/packages/superset-ui-demo/storybook/shared/components/VerifyCORS.tsx +++ b/superset-frontend/packages/superset-ui-demo/storybook/shared/components/VerifyCORS.tsx @@ -23,6 +23,7 @@ import { Method, makeApi, SupersetApiError, + t, } from '@superset-ui/core'; import ErrorMessage from './ErrorMessage'; @@ -121,7 +122,7 @@ export default class VerifyCORS extends React.Component<Props, State> { className="btn btn-primary btn-sm" onClick={this.handleVerify} > - Verify + {t('Verify')} </button> <br /> <br /> diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-preset-chart-nvd3/Area/stories/controlsShown.tsx b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-preset-chart-nvd3/Area/stories/controlsShown.tsx index fac198e826e8..603ef83b0f5b 100644 --- a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-preset-chart-nvd3/Area/stories/controlsShown.tsx +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-preset-chart-nvd3/Area/stories/controlsShown.tsx @@ -31,7 +31,7 @@ export const controlsShown = () => ( queriesData={[{ data }]} formData={{ bottomMargin: 'auto', - colorCcheme: 'd3Category10', + colorScheme: 'd3Category10', contribution: false, groupby: ['region'], lineInterpolation: 'linear', diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-preset-chart-nvd3/Area/stories/expanded.tsx b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-preset-chart-nvd3/Area/stories/expanded.tsx index 8f71fb5289f7..b26e7dfa6dba 100644 --- a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-preset-chart-nvd3/Area/stories/expanded.tsx +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-preset-chart-nvd3/Area/stories/expanded.tsx @@ -31,7 +31,7 @@ export const expanded = () => ( queriesData={[{ data }]} formData={{ bottomMargin: 'auto', - colorCcheme: 'd3Category10', + colorScheme: 'd3Category10', contribution: false, groupby: ['region'], lineInterpolation: 'linear', diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-preset-chart-nvd3/Area/stories/stackedWithBounds.tsx b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-preset-chart-nvd3/Area/stories/stackedWithBounds.tsx index d3dccc63d4f6..6f7a19825a2d 100644 --- a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-preset-chart-nvd3/Area/stories/stackedWithBounds.tsx +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/legacy-preset-chart-nvd3/Area/stories/stackedWithBounds.tsx @@ -31,7 +31,7 @@ export const stackedWithYAxisBounds = () => ( queriesData={[{ data }]} formData={{ bottomMargin: 'auto', - colorCcheme: 'd3Category10', + colorScheme: 'd3Category10', contribution: false, groupby: ['region'], lineInterpolation: 'linear', @@ -66,7 +66,7 @@ export const stackedWithYAxisBoundsMinOnly = () => ( queriesData={[{ data }]} formData={{ bottomMargin: 'auto', - colorCcheme: 'd3Category10', + colorScheme: 'd3Category10', contribution: false, groupby: ['region'], lineInterpolation: 'linear', diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/AreaTimeseries/Stories.tsx b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/AreaTimeseries/Stories.tsx new file mode 100644 index 000000000000..4cffeabd38a9 --- /dev/null +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/AreaTimeseries/Stories.tsx @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { SuperChart, getChartTransformPropsRegistry } from '@superset-ui/core'; +import { boolean, number, select, withKnobs } from '@storybook/addon-knobs'; +import { + EchartsAreaChartPlugin, + TimeseriesTransformProps, +} from '@superset-ui/plugin-chart-echarts'; +import data from './data'; +import { withResizableChartDemo } from '../../../../shared/components/ResizableChartDemo'; + +new EchartsAreaChartPlugin().configure({ key: 'echarts_area' }).register(); + +getChartTransformPropsRegistry().registerValue( + 'echarts_area', + TimeseriesTransformProps, +); + +export default { + title: 'Chart Plugins/plugin-chart-echarts/Timeseries Area', + decorators: [withKnobs, withResizableChartDemo], +}; + +export const Timeseries = ({ width, height }) => { + const forecastEnabled = boolean('Enable forecast', true); + const queryData = data + .map(row => + forecastEnabled + ? row + : { + // eslint-disable-next-line no-underscore-dangle + __timestamp: row.__timestamp, + Boston: row.Boston, + California: row.California, + WestTexNewMexico: row.WestTexNewMexico, + }, + ) + .filter(row => forecastEnabled || !!row.Boston); + return ( + <SuperChart + chartType="echarts_area" + width={width} + height={height} + queriesData={[{ data: queryData }]} + formData={{ + area: true, + contributionMode: undefined, + forecastEnabled, + colorScheme: 'supersetColors', + seriesType: select( + 'Line type', + ['line', 'scatter', 'smooth', 'bar', 'start', 'middle', 'end'], + 'line', + ), + show_extra_controls: boolean('Extra Controls', false), + logAxis: boolean('Log axis', false), + yAxisFormat: 'SMART_NUMBER', + stack: boolean('Stack', false), + showValue: boolean('Show Values', false), + onlyTotal: boolean('Only Total', false), + percentageThreshold: number('Percentage Threshold', 0), + markerEnabled: boolean('Enable markers', false), + markerSize: number('Marker Size', 6), + minorSplitLine: boolean('Minor splitline', false), + opacity: number('Opacity', 0.2), + zoomable: boolean('Zoomable', false), + }} + /> + ); +}; diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/AreaTimeseries/data.ts b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/AreaTimeseries/data.ts new file mode 100644 index 000000000000..ac6b5d0a5463 --- /dev/null +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/AreaTimeseries/data.ts @@ -0,0 +1,771 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export default [ + { + __timestamp: 1419811200000, + Boston__yhat: 1.5348466045278903, + Boston__yhat_lower: 1.4108696830290821, + Boston__yhat_upper: 1.65406759478647, + Boston: 1.425, + California__yhat: 1.1428578093572317, + California__yhat_lower: 0.9954265301846809, + California__yhat_upper: 1.285336837473888, + California: 1.085, + WestTexNewMexico__yhat: 1.2189159706952082, + WestTexNewMexico__yhat_lower: 1.04104376708674, + WestTexNewMexico__yhat_upper: 1.3729774938431487, + WestTexNewMexico: 1.195, + }, + { + __timestamp: 1420416000000, + Boston__yhat: 1.5183086928032201, + Boston__yhat_lower: 1.4051623626305831, + Boston__yhat_upper: 1.6373864508998999, + Boston: 1.52, + California__yhat: 1.1473836815806109, + California__yhat_lower: 0.9896908958316125, + California__yhat_upper: 1.3074486619072236, + California: 1.01, + WestTexNewMexico__yhat: 1.2101876636102695, + WestTexNewMexico__yhat_lower: 1.0531768381015862, + WestTexNewMexico__yhat_upper: 1.3798811980337082, + WestTexNewMexico: 1.305, + }, + { + __timestamp: 1421020800000, + Boston__yhat: 1.5008792239446107, + Boston__yhat_lower: 1.3900408734935294, + Boston__yhat_upper: 1.6209717523914786, + Boston: 1.615, + California__yhat: 1.1257411477192287, + California__yhat_lower: 0.9647179126679808, + California__yhat_upper: 1.2856214776337003, + California: 1.13, + WestTexNewMexico__yhat: 1.211700721257458, + WestTexNewMexico__yhat_lower: 1.0512509758817796, + WestTexNewMexico__yhat_upper: 1.3838299538827643, + WestTexNewMexico: 1.255, + }, + { + __timestamp: 1421625600000, + Boston__yhat: 1.493895763520492, + Boston__yhat_lower: 1.3819463100452443, + Boston__yhat_upper: 1.614560073797367, + Boston: 1.59, + California__yhat: 1.0914497359848156, + California__yhat_lower: 0.9309999613012108, + California__yhat_upper: 1.2413000315404008, + California: 1.18, + WestTexNewMexico__yhat: 1.208627046579019, + WestTexNewMexico__yhat_lower: 1.0443728779662684, + WestTexNewMexico__yhat_upper: 1.3675637830491076, + WestTexNewMexico: 1.215, + }, + { + __timestamp: 1422230400000, + Boston__yhat: 1.5016078116606606, + Boston__yhat_lower: 1.3867245804741557, + Boston__yhat_upper: 1.614234955854214, + Boston: 1.5, + California__yhat: 1.0697859033873383, + California__yhat_lower: 0.9250294445931526, + California__yhat_upper: 1.227180419756037, + California: 0.98, + WestTexNewMexico__yhat: 1.1903524073209464, + WestTexNewMexico__yhat_lower: 1.0158621722285877, + WestTexNewMexico__yhat_upper: 1.3552685059028697, + WestTexNewMexico: 1.24, + }, + { + __timestamp: 1422835200000, + Boston__yhat: 1.5159923617934186, + Boston__yhat_lower: 1.3970137282601371, + Boston__yhat_upper: 1.6308844178549995, + Boston: 1.475, + California__yhat: 1.0746946690720922, + California__yhat_lower: 0.9113788241318873, + California__yhat_upper: 1.2273689220316724, + California: 1.13, + WestTexNewMexico__yhat: 1.162418169193016, + WestTexNewMexico__yhat_lower: 0.984399666972796, + WestTexNewMexico__yhat_upper: 1.3286127921414361, + WestTexNewMexico: 1.19, + }, + { + __timestamp: 1423440000000, + Boston__yhat: 1.525604106275286, + Boston__yhat_lower: 1.4091552054110317, + Boston__yhat_upper: 1.6398544651033324, + Boston: 1.555, + California__yhat: 1.0983484232374483, + California__yhat_lower: 0.9499667479813172, + California__yhat_upper: 1.2604622036877084, + California: 1.24, + WestTexNewMexico__yhat: 1.1407497573494716, + WestTexNewMexico__yhat_lower: 0.9682090338277108, + WestTexNewMexico__yhat_upper: 1.3110751375528853, + WestTexNewMexico: 1.24, + }, + { + __timestamp: 1424044800000, + Boston__yhat: 1.5285159859188788, + Boston__yhat_lower: 1.4151325345500827, + Boston__yhat_upper: 1.63898403722097, + Boston: 1.485, + California__yhat: 1.1215587530856748, + California__yhat_lower: 0.9680608180357422, + California__yhat_upper: 1.282442960930767, + California: 1.185, + WestTexNewMexico__yhat: 1.1360040254613264, + WestTexNewMexico__yhat_lower: 0.963307750313048, + WestTexNewMexico__yhat_upper: 1.2986544671046583, + WestTexNewMexico: 1.28, + }, + { + __timestamp: 1424649600000, + Boston__yhat: 1.5334822003771225, + Boston__yhat_lower: 1.4176345632105387, + Boston__yhat_upper: 1.6496071238192505, + Boston: 1.48, + California__yhat: 1.1336412205342397, + California__yhat_lower: 0.9743289540694136, + California__yhat_upper: 1.2898768461219847, + California: 0.995, + WestTexNewMexico__yhat: 1.1446754348884136, + WestTexNewMexico__yhat_lower: 0.986235125109336, + WestTexNewMexico__yhat_upper: 1.307986287217312, + WestTexNewMexico: 1.24, + }, + { + __timestamp: 1425254400000, + Boston__yhat: 1.547848654545939, + Boston__yhat_lower: 1.4328177356803633, + Boston__yhat_upper: 1.673661661344583, + Boston: 1.54, + California__yhat: 1.1421270972002817, + California__yhat_lower: 0.9880212170643778, + California__yhat_upper: 1.298074311825913, + California: 1.22, + WestTexNewMexico__yhat: 1.1538926041448758, + WestTexNewMexico__yhat_lower: 1.0019767923899103, + WestTexNewMexico__yhat_upper: 1.3221026377048228, + WestTexNewMexico: 1.16, + }, + { + __timestamp: 1425859200000, + Boston__yhat: 1.5675203083502125, + Boston__yhat_lower: 1.4543946077807537, + Boston__yhat_upper: 1.6864674764386627, + Boston: 1.62, + California__yhat: 1.1632572393543539, + California__yhat_lower: 0.9970086508003331, + California__yhat_upper: 1.3209871054747437, + California: 1.29, + WestTexNewMexico__yhat: 1.1530029605889838, + WestTexNewMexico__yhat_lower: 0.9729319698723828, + WestTexNewMexico__yhat_upper: 1.3054475293729533, + WestTexNewMexico: 1.285, + }, + { + __timestamp: 1426464000000, + Boston__yhat: 1.581607931619551, + Boston__yhat_lower: 1.4723154031359578, + Boston__yhat_upper: 1.7069606387126863, + Boston: 1.56, + California__yhat: 1.2030769562029524, + California__yhat_lower: 1.04933598570031, + California__yhat_upper: 1.3591487662881023, + California: 1.18, + WestTexNewMexico__yhat: 1.1414541767825306, + WestTexNewMexico__yhat_lower: 0.9717441065782068, + WestTexNewMexico__yhat_upper: 1.312661843170456, + WestTexNewMexico: 1.345, + }, + { + __timestamp: 1427068800000, + Boston__yhat: 1.5853316979769883, + Boston__yhat_lower: 1.4708451743058149, + Boston__yhat_upper: 1.7117728705026014, + Boston: 1.585, + California__yhat: 1.2479444775684796, + California__yhat_lower: 1.0837411336417548, + California__yhat_upper: 1.3998890149965297, + California: 1.315, + WestTexNewMexico__yhat: 1.1283059431234486, + WestTexNewMexico__yhat_lower: 0.9778619797162577, + WestTexNewMexico__yhat_upper: 1.2954488963192434, + WestTexNewMexico: 1.255, + }, + { + __timestamp: 1427673600000, + Boston__yhat: 1.5841383828593085, + Boston__yhat_lower: 1.4654575751911438, + Boston__yhat_upper: 1.6946343035808373, + Boston: 1.59, + California__yhat: 1.2739437360014318, + California__yhat_lower: 1.1100282969104833, + California__yhat_upper: 1.428117476226516, + California: 1.32, + WestTexNewMexico__yhat: 1.1249371539002126, + WestTexNewMexico__yhat_lower: 0.9695967792994402, + WestTexNewMexico__yhat_upper: 1.287869970682996, + WestTexNewMexico: 1.28, + }, + { + __timestamp: 1428278400000, + Boston__yhat: 1.5839751550296846, + Boston__yhat_lower: 1.4658964846078435, + Boston__yhat_upper: 1.710402200124056, + Boston: 1.56, + California__yhat: 1.2665706718822929, + California__yhat_lower: 1.1158333765771138, + California__yhat_upper: 1.4320483959058965, + California: 1.28, + WestTexNewMexico__yhat: 1.1355965911503207, + WestTexNewMexico__yhat_lower: 0.964066677858961, + WestTexNewMexico__yhat_upper: 1.3022575299852956, + WestTexNewMexico: 1.21, + }, + { + __timestamp: 1428883200000, + Boston__yhat: 1.5816178634356794, + Boston__yhat_lower: 1.4715929905435854, + Boston__yhat_upper: 1.7003122219671367, + Boston: 1.545, + California__yhat: 1.232881524770783, + California__yhat_lower: 1.0767786935430315, + California__yhat_upper: 1.3959964303961667, + California: 1.285, + WestTexNewMexico__yhat: 1.1523828742682716, + WestTexNewMexico__yhat_lower: 0.9811195853500172, + WestTexNewMexico__yhat_upper: 1.3138046554765905, + WestTexNewMexico: 1.15, + }, + { + __timestamp: 1429488000000, + Boston__yhat: 1.5693505553611033, + Boston__yhat_lower: 1.454366551073654, + Boston__yhat_upper: 1.672997430777775, + Boston: 1.57, + California__yhat: 1.1961960021745208, + California__yhat_lower: 1.0574856955397094, + California__yhat_upper: 1.3527191406913728, + California: 1.325, + WestTexNewMexico__yhat: 1.1605683040698191, + WestTexNewMexico__yhat_lower: 1.0031473604785308, + WestTexNewMexico__yhat_upper: 1.3131490159580719, + WestTexNewMexico: 1.33, + }, + { + __timestamp: 1430092800000, + Boston__yhat: 1.548687090028952, + Boston__yhat_lower: 1.4345338808929986, + Boston__yhat_upper: 1.674291034018414, + Boston: 1.495, + California__yhat: 1.17944168965866, + California__yhat_lower: 1.0208437159576145, + California__yhat_upper: 1.3437648164186333, + California: 1.18, + WestTexNewMexico__yhat: 1.152452251304891, + WestTexNewMexico__yhat_lower: 0.9925163021235553, + WestTexNewMexico__yhat_upper: 1.33370469389031, + WestTexNewMexico: 1.125, + }, + { + __timestamp: 1430697600000, + Boston__yhat: 1.5339945463021136, + Boston__yhat_lower: 1.4131803310322042, + Boston__yhat_upper: 1.6534068731295286, + Boston: 1.58, + California__yhat: 1.1914708975476587, + California__yhat_lower: 1.0346943811155895, + California__yhat_upper: 1.346918284211045, + California: 1.165, + WestTexNewMexico__yhat: 1.136951442350726, + WestTexNewMexico__yhat_lower: 0.9785853981941628, + WestTexNewMexico__yhat_upper: 1.305120499270747, + WestTexNewMexico: 1.07, + }, + { + __timestamp: 1431302400000, + Boston__yhat: 1.538494530655746, + Boston__yhat_lower: 1.417157877783077, + Boston__yhat_upper: 1.6657402419552576, + Boston: 1.585, + California__yhat: 1.2250425993396363, + California__yhat_lower: 1.0694624006721893, + California__yhat_upper: 1.3779793141537178, + California: 1.285, + WestTexNewMexico__yhat: 1.131850140196041, + WestTexNewMexico__yhat_lower: 0.9693152036413223, + WestTexNewMexico__yhat_upper: 1.2969371429211514, + WestTexNewMexico: 1.06, + }, + { + __timestamp: 1431907200000, + Boston__yhat: 1.5586586605892516, + Boston__yhat_lower: 1.4437718674345732, + Boston__yhat_upper: 1.678444300307212, + Boston: 1.54, + California__yhat: 1.2640228484312774, + California__yhat_lower: 1.105695580617842, + California__yhat_upper: 1.4262751320209555, + California: 1.3, + WestTexNewMexico__yhat: 1.14279691969869, + WestTexNewMexico__yhat_lower: 0.9744635833347896, + WestTexNewMexico__yhat_upper: 1.309843116203469, + WestTexNewMexico: 1.065, + }, + { + __timestamp: 1432512000000, + Boston__yhat: 1.5775197465059267, + Boston__yhat_lower: 1.4598708798261923, + Boston__yhat_upper: 1.6911276338952719, + Boston: 1.6, + California__yhat: 1.292475578711032, + California__yhat_lower: 1.1228796890918014, + California__yhat_upper: 1.4471391733217347, + California: 1.24, + WestTexNewMexico__yhat: 1.151946670246945, + WestTexNewMexico__yhat_lower: 0.9787075088274869, + WestTexNewMexico__yhat_upper: 1.3257344034341332, + WestTexNewMexico: 1.065, + }, + { + __timestamp: 1433116800000, + Boston__yhat: 1.5847361491556036, + Boston__yhat_lower: 1.469478725883583, + Boston__yhat_upper: 1.698200477547973, + Boston: 1.625, + California__yhat: 1.301640708602741, + California__yhat_lower: 1.1448194258091566, + California__yhat_upper: 1.4657411831360765, + California: 1.325, + WestTexNewMexico__yhat: 1.1344270549760207, + WestTexNewMexico__yhat_lower: 0.9628949633601395, + WestTexNewMexico__yhat_upper: 1.2999364461809975, + WestTexNewMexico: 1.08, + }, + { + __timestamp: 1433721600000, + Boston__yhat: 1.588841301654564, + Boston__yhat_lower: 1.4701868286368829, + Boston__yhat_upper: 1.708276878629705, + Boston: 1.555, + California__yhat: 1.2945568932951903, + California__yhat_lower: 1.1357913193434988, + California__yhat_upper: 1.441658100122194, + California: 1.325, + WestTexNewMexico__yhat: 1.090609476160724, + WestTexNewMexico__yhat_lower: 0.9171628023326979, + WestTexNewMexico__yhat_upper: 1.2519104172461586, + WestTexNewMexico: 1.125, + }, + { + __timestamp: 1434326400000, + Boston__yhat: 1.60467809761448, + Boston__yhat_lower: 1.4872087156545453, + Boston__yhat_upper: 1.7206390174307566, + Boston: 1.65, + California__yhat: 1.2866911289244536, + California__yhat_lower: 1.1223304657283866, + California__yhat_upper: 1.4489712765550424, + California: 1.38, + WestTexNewMexico__yhat: 1.058286202137859, + WestTexNewMexico__yhat_lower: 0.8983319008178635, + WestTexNewMexico__yhat_upper: 1.2230688588329341, + WestTexNewMexico: 1.2, + }, + { + __timestamp: 1434931200000, + Boston__yhat: 1.6296561292532252, + Boston__yhat_lower: 1.5147117985377605, + Boston__yhat_upper: 1.7484553862428687, + Boston: 1.64, + California__yhat: 1.298704180420278, + California__yhat_lower: 1.143996831592798, + California__yhat_upper: 1.4569530963291766, + California: 1.385, + WestTexNewMexico__yhat: 1.0837741118769433, + WestTexNewMexico__yhat_lower: 0.9165400527844431, + WestTexNewMexico__yhat_upper: 1.2633713277285281, + WestTexNewMexico: 1.145, + }, + { + __timestamp: 1435536000000, + Boston__yhat: 1.6387330700540754, + Boston__yhat_lower: 1.5214382052884348, + Boston__yhat_upper: 1.7593446818133576, + Boston: 1.7, + California__yhat: 1.3419159537936654, + California__yhat_lower: 1.1824389777530346, + California__yhat_upper: 1.5077615808876883, + California: 1.395, + WestTexNewMexico__yhat: 1.1753283438356257, + WestTexNewMexico__yhat_lower: 1.0084515427055218, + WestTexNewMexico__yhat_upper: 1.3411968014102083, + WestTexNewMexico: 1.18, + }, + { + __timestamp: 1436140800000, + Boston__yhat: 1.6078378110129543, + Boston__yhat_lower: 1.4858780410049368, + Boston__yhat_upper: 1.7333942938670541, + Boston: 1.665, + California__yhat: 1.4064610022347392, + California__yhat_lower: 1.2518481325894115, + California__yhat_upper: 1.5631376401498112, + California: 1.465, + WestTexNewMexico__yhat: 1.2876812690769497, + WestTexNewMexico__yhat_lower: 1.118277996711148, + WestTexNewMexico__yhat_upper: 1.453601368173299, + WestTexNewMexico: 1.365, + }, + { + __timestamp: 1436745600000, + Boston__yhat: 1.54126454151401, + Boston__yhat_lower: 1.4242640278872807, + Boston__yhat_upper: 1.658820938407199, + Boston: 1.615, + California__yhat: 1.4648637533773619, + California__yhat_lower: 1.3165708549095063, + California__yhat_upper: 1.6123722518242183, + California: 1.535, + WestTexNewMexico__yhat: 1.359084635413718, + WestTexNewMexico__yhat_lower: 1.1923924916510695, + WestTexNewMexico__yhat_upper: 1.5397046826260015, + WestTexNewMexico: 1.25, + }, + { + __timestamp: 1437350400000, + Boston__yhat: 1.4716975989229104, + Boston__yhat_lower: 1.3478802335545248, + Boston__yhat_upper: 1.5897005348114144, + Boston: 1.65, + California__yhat: 1.492196708250474, + California__yhat_lower: 1.3281011466171584, + California__yhat_upper: 1.6482617063876424, + California: 1.53, + WestTexNewMexico__yhat: 1.3665720856468249, + WestTexNewMexico__yhat_lower: 1.1985870084342607, + WestTexNewMexico__yhat_upper: 1.540444302838635, + WestTexNewMexico: 1.325, + }, + { + __timestamp: 1437955200000, + Boston__yhat: 1.4316465654883939, + Boston__yhat_lower: 1.3151590237205186, + Boston__yhat_upper: 1.5502363732881383, + Boston: 1.645, + California__yhat: 1.486878703643501, + California__yhat_lower: 1.3387136764087475, + California__yhat_upper: 1.6406538496379224, + California: 1.575, + WestTexNewMexico__yhat: 1.3430004296140337, + WestTexNewMexico__yhat_lower: 1.1696134333274417, + WestTexNewMexico__yhat_upper: 1.5143254675484394, + WestTexNewMexico: 1.345, + }, + { + __timestamp: 1438560000000, + Boston__yhat: 1.4271527274427822, + Boston__yhat_lower: 1.3009869979033386, + Boston__yhat_upper: 1.5444571765505344, + Boston: 1.545, + California__yhat: 1.4721251850161223, + California__yhat_lower: 1.3130424764080704, + California__yhat_upper: 1.6322300582937983, + California: 1.565, + WestTexNewMexico__yhat: 1.3385023304664054, + WestTexNewMexico__yhat_lower: 1.169557000507694, + WestTexNewMexico__yhat_upper: 1.501423586440048, + WestTexNewMexico: 1.3, + }, + { + __timestamp: 1439164800000, + Boston__yhat: 1.4407299749907534, + Boston__yhat_lower: 1.323436292855159, + Boston__yhat_upper: 1.5636100946562665, + Boston: 1.62, + California__yhat: 1.4747274927843579, + California__yhat_lower: 1.3090246017944651, + California__yhat_upper: 1.6212028571910875, + California: 1.535, + WestTexNewMexico__yhat: 1.369033029466056, + WestTexNewMexico__yhat_lower: 1.2063418855681307, + WestTexNewMexico__yhat_upper: 1.5410908830393701, + WestTexNewMexico: 1.215, + }, + { + __timestamp: 1439769600000, + Boston__yhat: 1.4558141240561584, + Boston__yhat_lower: 1.3384500860436346, + Boston__yhat_upper: 1.5593449899412495, + Boston: 1.535, + California__yhat: 1.5004588541583503, + California__yhat_lower: 1.3525771130800601, + California__yhat_upper: 1.6557709189818204, + California: 1.515, + WestTexNewMexico__yhat: 1.4078705349829708, + WestTexNewMexico__yhat_lower: 1.2465576754469605, + WestTexNewMexico__yhat_upper: 1.5765990094113416, + WestTexNewMexico: 1.205, + }, + { + __timestamp: 1440374400000, + Boston__yhat: 1.4714837581619955, + Boston__yhat_lower: 1.3542849882799493, + Boston__yhat_upper: 1.587250053083524, + Boston: 1.58, + California__yhat: 1.5302322554730527, + California__yhat_lower: 1.3712263333300627, + California__yhat_upper: 1.6766472256899916, + California: 1.53, + WestTexNewMexico__yhat: 1.425931627994101, + WestTexNewMexico__yhat_lower: 1.2620778981321579, + WestTexNewMexico__yhat_upper: 1.5920830784029816, + WestTexNewMexico: 1.255, + }, + { + __timestamp: 1440979200000, + Boston__yhat: 1.491444403016728, + Boston__yhat_lower: 1.3719274262306433, + Boston__yhat_upper: 1.6081603165448515, + Boston: 1.54, + California__yhat: 1.5411777460499874, + California__yhat_lower: 1.3904365117687372, + California__yhat_upper: 1.694546785101698, + California: 1.54, + WestTexNewMexico__yhat: 1.4320134472163049, + WestTexNewMexico__yhat_lower: 1.273365593253299, + WestTexNewMexico__yhat_upper: 1.5931974288222444, + WestTexNewMexico: 1.29, + }, + { + __timestamp: 1441584000000, + Boston__yhat: 1.5051820756139245, + Boston__yhat_lower: 1.3835553327078385, + Boston__yhat_upper: 1.6240589221993718, + Boston: 1.515, + California__yhat: 1.5313765368007273, + California__yhat_lower: 1.3681294180618269, + California__yhat_upper: 1.6892153479755334, + California: 1.55, + WestTexNewMexico__yhat: 1.4638751687570226, + WestTexNewMexico__yhat_lower: 1.2864210645323784, + WestTexNewMexico__yhat_upper: 1.6187694320540935, + WestTexNewMexico: 1.37, + }, + { + __timestamp: 1442188800000, + Boston__yhat: 1.4894325587299742, + Boston__yhat_lower: 1.3727869467332703, + Boston__yhat_upper: 1.6084226338870418, + Boston: 1.58, + California__yhat: 1.522640140138669, + California__yhat_lower: 1.3734557489282102, + California__yhat_upper: 1.6743091049728624, + California: 1.53, + WestTexNewMexico__yhat: 1.5400751405380166, + WestTexNewMexico__yhat_lower: 1.3774375535282375, + WestTexNewMexico__yhat_upper: 1.723050870346822, + WestTexNewMexico: 1.485, + }, + { + __timestamp: 1442793600000, + Boston__yhat: 1.4322083667601824, + Boston__yhat_lower: 1.3101390870258312, + Boston__yhat_upper: 1.5571183048764867, + Boston: 1.535, + California__yhat: 1.5378925480202739, + California__yhat_lower: 1.3886019658089772, + California__yhat_upper: 1.6978496884233474, + California: 1.445, + WestTexNewMexico__yhat: 1.6287478669084643, + WestTexNewMexico__yhat_lower: 1.478287058860101, + WestTexNewMexico__yhat_upper: 1.795633152002224, + WestTexNewMexico: 1.275, + }, + { + __timestamp: 1443398400000, + Boston__yhat: 1.351816621968265, + Boston__yhat_lower: 1.2376540378452352, + Boston__yhat_upper: 1.4729299390946764, + Boston: 1.175, + California__yhat: 1.5759661525657334, + California__yhat_lower: 1.4231456717732236, + California__yhat_upper: 1.733586091013307, + California: 1.51, + WestTexNewMexico__yhat: 1.6721603417638533, + WestTexNewMexico__yhat_lower: 1.508503941330916, + WestTexNewMexico__yhat_upper: 1.8462459308936394, + WestTexNewMexico: 1.43, + }, + { + __timestamp: 1444003200000, + Boston__yhat: 1.286486461072129, + Boston__yhat_lower: 1.1680220690052265, + Boston__yhat_upper: 1.4035977590666622, + Boston: 1.2, + California__yhat: 1.6097139361369517, + California__yhat_lower: 1.4449082988736466, + California__yhat_upper: 1.7603053272180196, + California: 1.575, + WestTexNewMexico__yhat: 1.639290251177639, + WestTexNewMexico__yhat_lower: 1.473164681029519, + WestTexNewMexico__yhat_upper: 1.8064957246654998, + WestTexNewMexico: 1.47, + }, + { + __timestamp: 1444608000000, + Boston__yhat: 1.2630051620190224, + Boston__yhat_lower: 1.1467376145041555, + Boston__yhat_upper: 1.377446221614078, + Boston: 1.1, + California__yhat: 1.6098713751752662, + California__yhat_lower: 1.4600843147210683, + California__yhat_upper: 1.763955521152191, + California: 1.54, + WestTexNewMexico__yhat: 1.5551952931382806, + WestTexNewMexico__yhat_lower: 1.3962129897996904, + WestTexNewMexico__yhat_upper: 1.726357454658797, + WestTexNewMexico: 1.415, + }, + { + __timestamp: 1445212800000, + Boston__yhat: 1.276278781347193, + Boston__yhat_lower: 1.1580450205542776, + Boston__yhat_upper: 1.3920651070329326, + Boston: 1.145, + California__yhat: 1.571148844853862, + California__yhat_lower: 1.4083378535887405, + California__yhat_upper: 1.733966017882931, + California: 1.38, + WestTexNewMexico__yhat: 1.4722932415830279, + WestTexNewMexico__yhat_lower: 1.3050378331324088, + WestTexNewMexico__yhat_upper: 1.6418924805303612, + WestTexNewMexico: 1.41, + }, + { + __timestamp: 1445817600000, + Boston__yhat: 1.2991073481696098, + Boston__yhat_lower: 1.1878452793959065, + Boston__yhat_upper: 1.424293199867907, + Boston: 1.18, + California__yhat: 1.5150187954091354, + California__yhat_lower: 1.3476318997481405, + California__yhat_upper: 1.677657858675358, + California: 1.275, + WestTexNewMexico__yhat: 1.4199561158957161, + WestTexNewMexico__yhat_lower: 1.263080331712721, + WestTexNewMexico__yhat_upper: 1.5718996342613911, + WestTexNewMexico: 1.36, + }, + { + __timestamp: 1446422400000, + Boston__yhat: 1.308880887797368, + Boston__yhat_lower: 1.1862924735231104, + Boston__yhat_upper: 1.4168025454442827, + Boston: 1.13, + California__yhat: 1.467196455991084, + California__yhat_lower: 1.31469058277437, + California__yhat_upper: 1.6266140472626818, + California: 1.32, + WestTexNewMexico__yhat: 1.385809818488925, + WestTexNewMexico__yhat_lower: 1.2178231659097734, + WestTexNewMexico__yhat_upper: 1.5529990050614997, + WestTexNewMexico: 1.37, + }, + { + __timestamp: 1447027200000, + Boston__yhat: 1.3030202507313675, + Boston__yhat_lower: 1.1871331759675903, + Boston__yhat_upper: 1.4220034213332513, + Boston: 1.1, + California__yhat: 1.432710953584346, + California__yhat_lower: 1.2824951329265597, + California__yhat_upper: 1.586661603708675, + California: 1.21, + WestTexNewMexico__yhat: 1.3404954026443072, + WestTexNewMexico__yhat_lower: 1.1821733202392815, + WestTexNewMexico__yhat_upper: 1.5011656305912942, + WestTexNewMexico: 1.315, + }, + { + __timestamp: 1447632000000, + Boston__yhat: 1.2921088188147662, + Boston__yhat_lower: 1.1728345442847379, + Boston__yhat_upper: 1.4033407585022522, + Boston: 1.17, + California__yhat: 1.3931387239731783, + California__yhat_lower: 1.2432214745880616, + California__yhat_upper: 1.5498822030297323, + California: 1.26, + WestTexNewMexico__yhat: 1.276766317307663, + WestTexNewMexico__yhat_lower: 1.0999844956570386, + WestTexNewMexico__yhat_upper: 1.446687228788756, + WestTexNewMexico: 1.375, + }, + { + __timestamp: 1448236800000, + Boston__yhat: 1.2844900175902454, + Boston__yhat_lower: 1.1751725419028316, + Boston__yhat_upper: 1.4071918419152338, + Boston: 1.235, + California__yhat: 1.3280733170736323, + California__yhat_lower: 1.168686173676362, + California__yhat_upper: 1.4828349526176714, + California: 1.33, + WestTexNewMexico__yhat: 1.2150153206911025, + WestTexNewMexico__yhat_lower: 1.0575514264315589, + WestTexNewMexico__yhat_upper: 1.3738174939464802, + WestTexNewMexico: 1.445, + }, + { + __timestamp: 1448841600000, + Boston__yhat: 1.2805251906155837, + Boston__yhat_lower: 1.1707757707707065, + Boston__yhat_upper: 1.3999312395395147, + Boston: 1.155, + California__yhat: 1.2392981370779044, + California__yhat_lower: 1.0733806154601595, + California__yhat_upper: 1.4014509402239486, + California: 1.13, + WestTexNewMexico__yhat: 1.1770436607980383, + WestTexNewMexico__yhat_lower: 0.993583553273554, + WestTexNewMexico__yhat_upper: 1.333422820891247, + WestTexNewMexico: 0.74, + }, + { + __timestamp: 1449446400000, + Boston__yhat: 1.279267142574869, + Boston__yhat_lower: 1.1585705827510129, + Boston__yhat_upper: 1.3983536869495787, + Boston: 1.28, + California__yhat: 1.1539951545645342, + California__yhat_lower: 0.9889501465743559, + California__yhat_upper: 1.3053289212843744, + California: 1.13, + WestTexNewMexico__yhat: 1.162380614252356, + WestTexNewMexico__yhat_lower: 0.9965272411245537, + WestTexNewMexico__yhat_upper: 1.3253180367221955, + WestTexNewMexico: 1.29, + }, +]; diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Sunburst/Stories.tsx b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Sunburst/Stories.tsx new file mode 100644 index 000000000000..7742f1ecfe53 --- /dev/null +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Sunburst/Stories.tsx @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { SuperChart, getChartTransformPropsRegistry } from '@superset-ui/core'; +import { boolean, withKnobs } from '@storybook/addon-knobs'; +import { + EchartsSunburstChartPlugin, + SunburstTransformProps, +} from '@superset-ui/plugin-chart-echarts'; +import { withResizableChartDemo } from '../../../../shared/components/ResizableChartDemo'; +import data from './data'; + +new EchartsSunburstChartPlugin() + .configure({ key: 'echarts-sunburst' }) + .register(); + +getChartTransformPropsRegistry().registerValue( + 'echarts-sunburst', + SunburstTransformProps, +); + +export default { + title: 'Chart Plugins/plugin-chart-echarts/Sunburst', + decorators: [withKnobs, withResizableChartDemo], +}; + +export const Sunburst = ({ width, height }) => ( + <SuperChart + chartType="echarts-sunburst" + width={width} + height={height} + queriesData={[{ data }]} + formData={{ + columns: ['genre', 'platform'], + metric: 'count', + showLabels: boolean('Show labels', true), + showTotal: boolean('Show total', true), + }} + /> +); diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Sunburst/data.ts b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Sunburst/data.ts new file mode 100644 index 000000000000..35675465dfdd --- /dev/null +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Sunburst/data.ts @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +export default [ + { genre: 'Adventure', platform: 'Wii', count: 84 }, + { genre: 'Adventure', platform: 'N64', count: 14 }, + { genre: 'Adventure', platform: 'XOne', count: 12 }, + { genre: 'Adventure', platform: 'PS4', count: 19 }, + { genre: 'Strategy', platform: 'Wii', count: 25 }, + { genre: 'Strategy', platform: 'PS4', count: 15 }, + { genre: 'Strategy', platform: 'N64', count: 29 }, + { genre: 'Strategy', platform: 'XOne', count: 23 }, + { genre: 'Simulation', platform: 'PS4', count: 15 }, + { genre: 'Simulation', platform: 'XOne', count: 36 }, + { genre: 'Simulation', platform: 'N64', count: 20 }, + { genre: 'Simulation', platform: 'Wii', count: 50 }, +]; diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Timeseries/Stories.tsx b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Timeseries/Stories.tsx index b44ba252ea5d..342db6f5bad4 100644 --- a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Timeseries/Stories.tsx +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Timeseries/Stories.tsx @@ -26,6 +26,8 @@ import { } from '@superset-ui/plugin-chart-echarts'; import data from './data'; import negativeNumData from './negativeNumData'; +import confbandData from './confbandData'; +import stackWithNullsData from './stackWithNulls'; import { withResizableChartDemo } from '../../../../shared/components/ResizableChartDemo'; new EchartsTimeseriesChartPlugin() @@ -66,26 +68,26 @@ export const Timeseries = ({ width, height }) => { { data: queryData, colnames: ['__timestamp'], coltypes: [2] }, ]} formData={{ - contributionMode: undefined, forecastEnabled, - colorScheme: 'supersetColors', + color_scheme: 'supersetColors', seriesType: select( 'Line type', ['line', 'scatter', 'smooth', 'bar', 'start', 'middle', 'end'], 'line', ), logAxis: boolean('Log axis', false), - yAxisFormat: 'SMART_NUMBER', + y_axis_format: 'SMART_NUMBER', stack: boolean('Stack', false), - showValue: boolean('Show Values', false), - onlyTotal: boolean('Only Total', false), - percentageThreshold: number('Percentage Threshold', 0), + show_value: boolean('Show Values', false), + only_total: boolean('Only Total', false), + percentage_threshold: number('Percentage Threshold', 0), area: boolean('Area chart', false), markerEnabled: boolean('Enable markers', false), markerSize: number('Marker Size', 6), minorSplitLine: boolean('Minor splitline', false), opacity: number('Opacity', 0.2), zoomable: boolean('Zoomable', false), + x_axis: '__timestamp', }} /> ); @@ -100,23 +102,71 @@ export const WithNegativeNumbers = ({ width, height }) => ( { data: negativeNumData, colnames: ['__timestamp'], coltypes: [2] }, ]} formData={{ - contributionMode: undefined, - colorScheme: 'supersetColors', + color_scheme: 'supersetColors', seriesType: select( 'Line type', ['line', 'scatter', 'smooth', 'bar', 'start', 'middle', 'end'], 'line', ), - yAxisFormat: '$,.2f', + y_axis_format: '$,.2f', stack: boolean('Stack', true), - showValue: true, - showLegend: true, - onlyTotal: boolean('Only Total', true), + show_value: true, + show_legend: true, + only_total: boolean('Only Total', true), orientation: select( 'Orientation', ['vertical', 'horizontal'], 'vertical', ), + x_axis: '__timestamp', + }} + /> +); + +export const ConfidenceBand = ({ width, height }) => ( + <SuperChart + chartType="echarts-timeseries" + width={width} + height={height} + queriesData={[ + { + data: confbandData, + colnames: [ + 'ds', + 'SUM(num)', + 'SUM(num)__yhat_lower', + 'SUM(num)__yhat_upper', + ], + coltypes: [2, 0, 0, 0], + }, + ]} + formData={{ + color_scheme: 'supersetColors', + series_type: 'line', + x_axis_time_format: 'smart_date', + x_axis: 'ds', + }} + /> +); + +export const StackWithNulls = ({ width, height }) => ( + <SuperChart + chartType="echarts-timeseries" + width={width} + height={height} + queriesData={[ + { + data: stackWithNullsData, + colnames: ['ds', '1', '2'], + coltypes: [2, 0, 0], + }, + ]} + formData={{ + color_scheme: 'supersetColors', + series_type: 'bar', + stack: true, + x_axis_time_format: 'smart_date', + x_axis: 'ds', }} /> ); diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Timeseries/confbandData.ts b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Timeseries/confbandData.ts new file mode 100644 index 000000000000..46529e59b1ee --- /dev/null +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Timeseries/confbandData.ts @@ -0,0 +1,329 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export default [ + { + ds: -157766400000, + 'SUM(num)': 173161, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: -126230400000, + 'SUM(num)': 173777, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: -94694400000, + 'SUM(num)': 178221, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: -63158400000, + 'SUM(num)': 176779, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: -31536000000, + 'SUM(num)': 184113, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 0, + 'SUM(num)': 188343, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 31536000000, + 'SUM(num)': 178441, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 63072000000, + 'SUM(num)': 169507, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 94694400000, + 'SUM(num)': 156783, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 126230400000, + 'SUM(num)': 157434, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 157766400000, + 'SUM(num)': 153606, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 189302400000, + 'SUM(num)': 150937, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 220924800000, + 'SUM(num)': 154361, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 252460800000, + 'SUM(num)': 154515, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 283996800000, + 'SUM(num)': 159885, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 315532800000, + 'SUM(num)': 159087, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 347155200000, + 'SUM(num)': 159061, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 378691200000, + 'SUM(num)': 167242, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 410227200000, + 'SUM(num)': 165944, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 441763200000, + 'SUM(num)': 165662, + 'SUM(num)__yhat': null, + 'SUM(num)__yhat_lower': null, + 'SUM(num)__yhat_upper': null, + }, + { + ds: 473385600000, + 'SUM(num)': 162578, + 'SUM(num)__yhat': 162578, + 'SUM(num)__yhat_lower': 162578, + 'SUM(num)__yhat_upper': 162578, + }, + { + ds: 504921600000, + 'SUM(num)': null, + 'SUM(num)__yhat': 157613, + 'SUM(num)__yhat_lower': 147613, + 'SUM(num)__yhat_upper': 167613, + }, + { + ds: 536457600000, + 'SUM(num)': null, + 'SUM(num)__yhat': 154580, + 'SUM(num)__yhat_lower': 134580, + 'SUM(num)__yhat_upper': 174580, + }, + { + ds: 567993600000, + 'SUM(num)': null, + 'SUM(num)__yhat': 152134, + 'SUM(num)__yhat_lower': 122134, + 'SUM(num)__yhat_upper': 182134, + }, + { + ds: 599616000000, + 'SUM(num)': null, + 'SUM(num)__yhat': 153577, + 'SUM(num)__yhat_lower': 113577, + 'SUM(num)__yhat_upper': 193577, + }, + { + ds: 631152000000, + 'SUM(num)': null, + 'SUM(num)__yhat': 151121, + 'SUM(num)__yhat_lower': 101121, + 'SUM(num)__yhat_upper': 201121, + }, + { + ds: 662688000000, + 'SUM(num)': null, + 'SUM(num)__yhat': 138102, + 'SUM(num)__yhat_lower': 78102, + 'SUM(num)__yhat_upper': 208102, + }, + { + ds: 694224000000, + 'SUM(num)': null, + 'SUM(num)__yhat': 125030, + 'SUM(num)__yhat_lower': 45030, + 'SUM(num)__yhat_upper': 205030, + }, + { + ds: 725846400000, + 'SUM(num)': null, + 'SUM(num)__yhat': 114647, + 'SUM(num)__yhat_lower': 24647, + 'SUM(num)__yhat_upper': 204647, + }, + { + ds: 757382400000, + 'SUM(num)': null, + 'SUM(num)__yhat': 103968, + 'SUM(num)__yhat_lower': 13968, + 'SUM(num)__yhat_upper': 193968, + }, + { + ds: 788918400000, + 'SUM(num)': null, + 'SUM(num)__yhat': 97006, + 'SUM(num)__yhat_lower': 7006, + 'SUM(num)__yhat_upper': 187006, + }, + { + ds: 820454400000, + 'SUM(num)': null, + 'SUM(num)__yhat': 92213, + 'SUM(num)__yhat_lower': 2213, + 'SUM(num)__yhat_upper': 182213, + }, + { + ds: 852076800000, + 'SUM(num)': null, + 'SUM(num)__yhat': 88462, + 'SUM(num)__yhat_lower': -1538, + 'SUM(num)__yhat_upper': 178462, + }, + { + ds: 883612800000, + 'SUM(num)': null, + 'SUM(num)__yhat': 84424, + 'SUM(num)__yhat_lower': -5576, + 'SUM(num)__yhat_upper': 174424, + }, + { + ds: 915148800000, + 'SUM(num)': null, + 'SUM(num)__yhat': 79787, + 'SUM(num)__yhat_lower': -10213, + 'SUM(num)__yhat_upper': 169787, + }, + { + ds: 946684800000, + 'SUM(num)': null, + 'SUM(num)__yhat': 76610, + 'SUM(num)__yhat_lower': -13390, + 'SUM(num)__yhat_upper': 166610, + }, + { + ds: 978307200000, + 'SUM(num)': null, + 'SUM(num)__yhat': 72073, + 'SUM(num)__yhat_lower': -17927, + 'SUM(num)__yhat_upper': 162073, + }, + { + ds: 1009843200000, + 'SUM(num)': null, + 'SUM(num)__yhat': 68487, + 'SUM(num)__yhat_lower': -21513, + 'SUM(num)__yhat_upper': 158487, + }, + { + ds: 1041379200000, + 'SUM(num)': null, + 'SUM(num)__yhat': 66381, + 'SUM(num)__yhat_lower': -23619, + 'SUM(num)__yhat_upper': 156381, + }, + { + ds: 1072915200000, + 'SUM(num)': null, + 'SUM(num)__yhat': 63472, + 'SUM(num)__yhat_lower': -26528, + 'SUM(num)__yhat_upper': 153472, + }, + { + ds: 1104537600000, + 'SUM(num)': null, + 'SUM(num)__yhat': 60885, + 'SUM(num)__yhat_lower': -29115, + 'SUM(num)__yhat_upper': 150885, + }, + { + ds: 1136073600000, + 'SUM(num)': null, + 'SUM(num)__yhat': 59682, + 'SUM(num)__yhat_lower': -30318, + 'SUM(num)__yhat_upper': 149682, + }, + { + ds: 1167609600000, + 'SUM(num)': null, + 'SUM(num)__yhat': 59191, + 'SUM(num)__yhat_lower': -30809, + 'SUM(num)__yhat_upper': 149191, + }, + { + ds: 1199145600000, + 'SUM(num)': null, + 'SUM(num)__yhat': 54091, + 'SUM(num)__yhat_lower': -35909, + 'SUM(num)__yhat_upper': 144091, + }, +]; diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Timeseries/stackWithNulls.ts b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Timeseries/stackWithNulls.ts new file mode 100644 index 000000000000..8416fa09def2 --- /dev/null +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-echarts/Timeseries/stackWithNulls.ts @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export default [ + { + ds: 1293840000000, + '1': 2, + '2': 1, + }, + { + ds: 1325376000000, + '1': null, + '2': null, + }, + { + ds: 1356998400000, + '1': null, + '2': 1, + }, +]; diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-pivot-table/PivotTableStories.tsx b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-pivot-table/PivotTableStories.tsx new file mode 100644 index 000000000000..54903c013aa2 --- /dev/null +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-pivot-table/PivotTableStories.tsx @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { withKnobs } from '@storybook/addon-knobs'; +import { SuperChart } from '@superset-ui/core'; +import { PivotTableChartPlugin } from '@superset-ui/plugin-chart-pivot-table'; +import { basicFormData, basicData } from './testData'; +import { withResizableChartDemo } from '../../../shared/components/ResizableChartDemo'; + +export default { + title: 'Chart Plugins/plugin-chart-pivot-table', + decorators: [withKnobs, withResizableChartDemo], +}; + +new PivotTableChartPlugin().configure({ key: 'pivot_table_v2' }).register(); + +export const basic = ({ width, height }) => ( + <SuperChart + chartType="pivot_table_v2" + datasource={{ + columnFormats: {}, + }} + width={width} + height={height} + queriesData={[basicData]} + formData={basicFormData} + /> +); +basic.story = { + parameters: { + initialSize: { + width: 680, + height: 420, + }, + }, +}; + +export const MaximumAggregation = ({ width, height }) => ( + <SuperChart + chartType="pivot_table_v2" + datasource={{ + columnFormats: {}, + }} + width={width} + height={height} + queriesData={[basicData]} + formData={{ ...basicFormData, aggregateFunction: 'Maximum' }} + /> +); +basic.story = { + parameters: { + initialSize: { + width: 680, + height: 420, + }, + }, +}; diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-pivot-table/testData.ts b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-pivot-table/testData.ts new file mode 100644 index 000000000000..0e6457d0c122 --- /dev/null +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-pivot-table/testData.ts @@ -0,0 +1,126 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +export const basicFormData = { + datasource: '1__table', + viz_type: 'pivot_table_v2', + granularity_sqla: 'ts', + groupbyColumns: ['location'], + groupbyRows: ['program_language'], + metrics: [ + { + expressionType: 'SIMPLE', + column: { + id: 1, + column_name: 'count', + description: null, + expression: null, + groupby: true, + is_dttm: false, + python_date_format: null, + type: 'BIGINT', + type_generic: 0, + }, + aggregate: 'SUM', + sqlExpression: null, + isNew: false, + hasCustomLabel: true, + label: 'Count', + }, + { + expressionType: 'SIMPLE', + column: { + id: 2, + column_name: 'ts', + description: null, + expression: "DATE_PARSE(ds || ' ' || hr, '%Y-%m-%d %H')", + groupby: true, + is_dttm: true, + type: 'TIMESTAMP', + type_generic: 2, + python_date_format: null, + }, + aggregate: 'MAX', + sqlExpression: null, + isNew: false, + hasCustomLabel: true, + label: 'Most Recent Data', + }, + ], + metricsLayout: 'COLUMNS', + order_desc: true, + aggregateFunction: 'Sum', + valueFormat: '~g', + date_format: 'smart_date', + rowOrder: 'key_a_to_z', + colOrder: 'key_a_to_z', +}; + +export const basicData = { + cache_key: 'f2cd2a37b6977e3619ce6c07d0027972', + cached_dttm: '2022-07-27T17:42:39', + cache_timeout: 129600, + applied_template_filters: [], + annotation_data: {}, + error: null, + is_cached: true, + query: 'SELECT \nFROM\nWHERE', + status: 'success', + stacktrace: null, + rowcount: 5, + from_dttm: 1658426268000, + to_dttm: 1659031068000, + colnames: ['location', 'program_language', 'Count', 'Most Recent Data'], + indexnames: [0, 1, 2, 3, 4], + coltypes: [1, 1, 0, 1], + data: [ + { + location: 'AMEA', + program_language: 'Javscript', + Count: 134, + 'Most Recent Data': '2022-07-25 13:00:00.000', + }, + { + location: 'ASIA', + program_language: 'python', + Count: 19, + 'Most Recent Data': '2022-07-25 16:00:00.000', + }, + { + location: 'ASIA', + program_language: 'Java', + Count: 7, + 'Most Recent Data': '2022-07-25 15:00:00.000', + }, + { + location: 'ASIA', + program_language: 'C++', + Count: 1, + 'Most Recent Data': '2022-07-25 02:00:00.000', + }, + { + location: 'ASIA', + program_language: 'PHP', + Count: 1, + 'Most Recent Data': '2022-07-24 00:00:00.000', + }, + ], + result_format: 'json', + applied_filters: [], + rejected_filters: [], +}; diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-table/birthNames.json b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-table/birthNames.json index cecb37e02627..c35d3a80665f 100644 --- a/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-table/birthNames.json +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/plugins/plugin-chart-table/birthNames.json @@ -13,7 +13,6 @@ "id": 1, "name": "examples", "backend": "postgresql", - "allow_multi_schema_metadata_fetch": false, "allows_subquery": true, "allows_cost_estimate": null, "allows_virtual_table_explore": true, diff --git a/superset-frontend/packages/superset-ui-demo/storybook/stories/superset-ui-chart/SuperChartStories.tsx b/superset-frontend/packages/superset-ui-demo/storybook/stories/superset-ui-chart/SuperChartStories.tsx index 490f498ec137..d2eb5dae4445 100644 --- a/superset-frontend/packages/superset-ui-demo/storybook/stories/superset-ui-chart/SuperChartStories.tsx +++ b/superset-frontend/packages/superset-ui-demo/storybook/stories/superset-ui-chart/SuperChartStories.tsx @@ -110,7 +110,7 @@ export const fixedHeight100Width = () => { }; fixedHeight100Width.story = { name: 'fixed height, 100% width' }; -export const withErrorBoundar = () => { +export const withErrorBoundary = () => { const width = text('Vis width', '500'); const height = text('Vis height', '300'); diff --git a/superset-frontend/packages/superset-ui-switchboard/package.json b/superset-frontend/packages/superset-ui-switchboard/package.json index f7e6c69a1b50..1e49d7eb9cde 100644 --- a/superset-frontend/packages/superset-ui-switchboard/package.json +++ b/superset-frontend/packages/superset-ui-switchboard/package.json @@ -1,6 +1,6 @@ { "name": "@superset-ui/switchboard", - "version": "0.18.26-0", + "version": "0.18.26-1", "description": "Switchboard is a library to make it easier to communicate across browser windows using the MessageChannel API", "sideEffects": false, "main": "lib/index.js", diff --git a/superset-frontend/packages/superset-ui-switchboard/src/index.ts b/superset-frontend/packages/superset-ui-switchboard/src/index.ts index adbd7450fc03..8e6bef5ff7e4 100644 --- a/superset-frontend/packages/superset-ui-switchboard/src/index.ts +++ b/superset-frontend/packages/superset-ui-switchboard/src/index.ts @@ -17,4 +17,7 @@ * under the License. */ +import Switchboard from './switchboard'; + export * from './switchboard'; +export default Switchboard; diff --git a/superset-frontend/packages/superset-ui-switchboard/src/switchboard.test.ts b/superset-frontend/packages/superset-ui-switchboard/src/switchboard.test.ts index fb77ab90f8a4..9e36f541e1cd 100644 --- a/superset-frontend/packages/superset-ui-switchboard/src/switchboard.test.ts +++ b/superset-frontend/packages/superset-ui-switchboard/src/switchboard.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { Switchboard } from './switchboard'; +import SingletonSwitchboard, { Switchboard } from './switchboard'; type EventHandler = (event: MessageEvent) => void; @@ -105,13 +105,16 @@ describe('comms', () => { let originalConsoleError: any = null; beforeAll(() => { - global.MessageChannel = FakeMessageChannel; // yolo + Object.defineProperty(global, 'MessageChannel', { + value: FakeMessageChannel, + }); originalConsoleDebug = console.debug; originalConsoleError = console.error; }); beforeEach(() => { console.debug = jest.fn(); // silencio bruno + console.error = jest.fn(); }); afterEach(() => { @@ -126,6 +129,30 @@ describe('comms', () => { expect(sb).toHaveProperty('debugMode'); }); + it('singleton', async () => { + SingletonSwitchboard.start(); + expect(console.error).toHaveBeenCalledWith( + '[]', + 'Switchboard not initialised', + ); + SingletonSwitchboard.emit('someEvent', 42); + expect(console.error).toHaveBeenCalledWith( + '[]', + 'Switchboard not initialised', + ); + await expect(SingletonSwitchboard.get('failing')).rejects.toThrow( + 'Switchboard not initialised', + ); + SingletonSwitchboard.init({ port: new MessageChannel().port1 }); + expect(SingletonSwitchboard).toHaveProperty('name'); + expect(SingletonSwitchboard).toHaveProperty('debugMode'); + SingletonSwitchboard.init({ port: new MessageChannel().port1 }); + expect(console.error).toHaveBeenCalledWith( + '[switchboard]', + 'already initialized', + ); + }); + describe('emit', () => { it('triggers the method', async () => { const channel = new MessageChannel(); diff --git a/superset-frontend/packages/superset-ui-switchboard/src/switchboard.ts b/superset-frontend/packages/superset-ui-switchboard/src/switchboard.ts index f12c9b6482c3..ab19d462f1b2 100644 --- a/superset-frontend/packages/superset-ui-switchboard/src/switchboard.ts +++ b/superset-frontend/packages/superset-ui-switchboard/src/switchboard.ts @@ -90,7 +90,7 @@ function isError(message: Message): message is ErrorMessage { export class Switchboard { port: MessagePort; - name: string; + name = ''; methods: Record<string, Method<any, unknown>> = {}; @@ -99,7 +99,23 @@ export class Switchboard { debugMode: boolean; - constructor({ port, name = 'switchboard', debug = false }: Params) { + private isInitialised: boolean; + + constructor(params?: Params) { + if (!params) { + return; + } + this.init(params); + } + + init(params: Params) { + if (this.isInitialised) { + this.logError('already initialized'); + return; + } + + const { port, name = 'switchboard', debug = false } = params; + this.port = port; this.name = name; this.debugMode = debug; @@ -122,6 +138,8 @@ export class Switchboard { } } }); + + this.isInitialised = true; } private async getMethodResult({ @@ -173,11 +191,15 @@ export class Switchboard { * Instead of an arguments list, arguments are supplied as a map. * * @param method the name of the method to call - * @param args arguments that will be supplied. Must be serializable, no functions or other nonense. + * @param args arguments that will be supplied. Must be serializable, no functions or other nonsense. * @returns whatever is returned from the method */ get<T = unknown>(method: string, args: unknown = undefined): Promise<T> { return new Promise((resolve, reject) => { + if (!this.isInitialised) { + reject(new Error('Switchboard not initialised')); + return; + } // In order to "call a method" on the other side of the port, // we will send a message with a unique id const messageId = this.getNewMessageId(); @@ -215,6 +237,10 @@ export class Switchboard { * @param args */ emit(method: string, args: unknown = undefined) { + if (!this.isInitialised) { + this.logError('Switchboard not initialised'); + return; + } const message: EmitMessage = { switchboardAction: Actions.EMIT, method, @@ -224,6 +250,10 @@ export class Switchboard { } start() { + if (!this.isInitialised) { + this.logError('Switchboard not initialised'); + return; + } this.port.start(); } @@ -242,3 +272,5 @@ export class Switchboard { return `m_${this.name}_${this.incrementor++}`; } } + +export default new Switchboard(); diff --git a/superset-frontend/plugins/legacy-plugin-chart-calendar/src/Calendar.js b/superset-frontend/plugins/legacy-plugin-chart-calendar/src/Calendar.js index 0417ea3e8b5a..d97557a77b50 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-calendar/src/Calendar.js +++ b/superset-frontend/plugins/legacy-plugin-chart-calendar/src/Calendar.js @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; import { extent as d3Extent, range as d3Range } from 'd3-array'; import { select as d3Select } from 'd3-selection'; -import { getSequentialSchemeRegistry } from '@superset-ui/core'; +import { getSequentialSchemeRegistry, t } from '@superset-ui/core'; import CalHeatMap from './vendor/cal-heatmap'; const propTypes = { @@ -85,10 +85,12 @@ function Calendar(element, props) { const metricsData = data.data; + const METRIC_TEXT = t('Metric'); + Object.keys(metricsData).forEach(metric => { const calContainer = div.append('div'); if (showMetricName) { - calContainer.text(`Metric: ${verboseMap[metric] || metric}`); + calContainer.text(`${METRIC_TEXT}: ${verboseMap[metric] || metric}`); } const timestamps = metricsData[metric]; const extents = d3Extent(Object.keys(timestamps), key => timestamps[key]); diff --git a/superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts b/superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts index 2787687b0615..9071a278eeba 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts @@ -21,7 +21,7 @@ import { ControlPanelConfig, D3_FORMAT_DOCS, D3_TIME_FORMAT_OPTIONS, - formatSelectOptions, + getStandardizedControls, sections, } from '@superset-ui/chart-controls'; @@ -39,13 +39,13 @@ const config: ControlPanelConfig = { type: 'SelectControl', label: t('Domain'), default: 'month', - choices: formatSelectOptions([ - 'hour', - 'day', - 'week', - 'month', - 'year', - ]), + choices: [ + ['hour', t('hour')], + ['day', t('day')], + ['week', t('week')], + ['month', t('month')], + ['year', t('year')], + ], description: t('The time unit used for the grouping of blocks'), }, }, @@ -55,13 +55,13 @@ const config: ControlPanelConfig = { type: 'SelectControl', label: t('Subdomain'), default: 'day', - choices: formatSelectOptions([ - 'min', - 'hour', - 'day', - 'week', - 'month', - ]), + choices: [ + ['min', t('min')], + ['hour', t('hour')], + ['day', t('day')], + ['week', t('week')], + ['month', t('month')], + ], description: t( 'The time unit for each block. Should be a smaller unit than ' + 'domain_granularity. Should be larger or equal to Time Grain', @@ -191,6 +191,10 @@ const config: ControlPanelConfig = { label: t('Number Format'), }, }, + formDataOverrides: formData => ({ + ...formData, + metrics: getStandardizedControls().popAllMetrics(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-plugin-chart-calendar/src/images/example.jpg b/superset-frontend/plugins/legacy-plugin-chart-calendar/src/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0bbf24ae6ffa8999e51a73da4ff75223f3eb1197 GIT binary patch literal 36394 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 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js b/superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js index 5c0a9425ef12..926d98421d31 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js +++ b/superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js @@ -18,6 +18,7 @@ */ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from './transformProps'; +import example from './images/example.jpg'; import controlPanel from './controlPanel'; import thumbnail from './images/thumbnail.png'; @@ -27,6 +28,7 @@ const metadata = new ChartMetadata({ description: t( "Visualizes how a metric has changed over a time using a color scale and a calendar view. Gray values are used to indicate missing values and the linear color scheme is used to encode the magnitude of each day's value.", ), + exampleGallery: [{ url: example }], name: t('Calendar Heatmap'), tags: [ t('Business'), diff --git a/superset-frontend/plugins/legacy-plugin-chart-calendar/src/vendor/cal-heatmap.js b/superset-frontend/plugins/legacy-plugin-chart-calendar/src/vendor/cal-heatmap.js index 3320693f5cc6..760bf0ce2b0c 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-calendar/src/vendor/cal-heatmap.js +++ b/superset-frontend/plugins/legacy-plugin-chart-calendar/src/vendor/cal-heatmap.js @@ -9,7 +9,7 @@ /* eslint-disable */ import d3tip from 'd3-tip'; -import { getContrastingColor } from '@superset-ui/core'; +import { getContrastingColor, t } from '@superset-ui/core'; var d3 = typeof require === 'function' ? require('d3') : window.d3; @@ -256,9 +256,9 @@ var CalHeatMap = function () { // Formatting of the title displayed when hovering a legend cell legendTitleFormat: { - lower: 'less than {min} {name}', - inner: 'between {down} and {up} {name}', - upper: 'more than {max} {name}', + lower: t('less than {min} {name}'), + inner: t('between {down} and {up} {name}'), + upper: t('more than {max} {name}'), }, // Animation duration, in ms diff --git a/superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts b/superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts index c2559a7b0d57..5a58b567a7a3 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts @@ -16,8 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -import { t, validateNonEmpty } from '@superset-ui/core'; -import { ControlPanelConfig, sections } from '@superset-ui/chart-controls'; +import { ensureIsArray, t, validateNonEmpty } from '@superset-ui/core'; +import { + ControlPanelConfig, + getStandardizedControls, + sections, +} from '@superset-ui/chart-controls'; const config: ControlPanelConfig = { controlPanelSections: [ @@ -69,6 +73,16 @@ const config: ControlPanelConfig = { description: t('Choose a target'), }, }, + formDataOverrides: formData => { + const groupby = getStandardizedControls() + .popAllColumns() + .filter(col => !ensureIsArray(formData.columns).includes(col)); + return { + ...formData, + groupby, + metric: getStandardizedControls().shiftMetric(), + }; + }, }; export default config; diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/scripts/Country Map GeoJSON Generator.ipynb b/superset-frontend/plugins/legacy-plugin-chart-country-map/scripts/Country Map GeoJSON Generator.ipynb index e91d20ed6a3c..4908a5e6d457 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-country-map/scripts/Country Map GeoJSON Generator.ipynb +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/scripts/Country Map GeoJSON Generator.ipynb @@ -34,7 +34,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -93,7 +93,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ @@ -109,7 +109,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -118,12 +118,12 @@ "Index(['featurecla', 'scalerank', 'adm1_code', 'diss_me', 'iso_3166_2',\n", " 'wikipedia', 'iso_a2', 'adm0_sr', 'name', 'name_alt',\n", " ...\n", - " 'FCLASS_TR', 'FCLASS_ID', 'FCLASS_PL', 'FCLASS_GR', 'FCLASS_IT',\n", - " 'FCLASS_NL', 'FCLASS_SE', 'FCLASS_BD', 'FCLASS_UA', 'geometry'],\n", - " dtype='object', length=121)" + " 'FCLASS_ID', 'FCLASS_PL', 'FCLASS_GR', 'FCLASS_IT', 'FCLASS_NL',\n", + " 'FCLASS_SE', 'FCLASS_BD', 'FCLASS_UA', 'FCLASS_TLC', 'geometry'],\n", + " dtype='object', length=122)" ] }, - "execution_count": 3, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -134,21 +134,21 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['featurecla', 'scalerank', 'labelrank', 'sovereignt', 'sov_a3',\n", - " 'adm0_dif', 'level', 'type', 'admin', 'adm0_a3',\n", + " 'adm0_dif', 'level', 'type', 'tlc', 'admin',\n", " ...\n", " 'fclass_tr', 'fclass_id', 'fclass_pl', 'fclass_gr', 'fclass_it',\n", " 'fclass_nl', 'fclass_se', 'fclass_bd', 'fclass_ua', 'geometry'],\n", - " dtype='object', length=162)" + " dtype='object', length=169)" ] }, - "execution_count": 4, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -160,7 +160,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -195,7 +195,6 @@ " <th>name</th>\n", " <th>name_alt</th>\n", " <th>...</th>\n", - " <th>FCLASS_TR</th>\n", " <th>FCLASS_ID</th>\n", " <th>FCLASS_PL</th>\n", " <th>FCLASS_GR</th>\n", @@ -204,6 +203,7 @@ " <th>FCLASS_SE</th>\n", " <th>FCLASS_BD</th>\n", " <th>FCLASS_UA</th>\n", + " <th>FCLASS_TLC</th>\n", " <th>geometry</th>\n", " </tr>\n", " <tr>\n", @@ -450,7 +450,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>9 rows × 120 columns</p>\n", + "<p>9 rows × 121 columns</p>\n", "</div>" ], "text/plain": [ @@ -478,7 +478,7 @@ "South Africa 9 0 9 9 9 \n", "United States of America 51 51 51 51 51 \n", "\n", - " name_alt ... FCLASS_TR FCLASS_ID FCLASS_PL \\\n", + " name_alt ... FCLASS_ID FCLASS_PL FCLASS_GR \\\n", "admin ... \n", "Australia 0 ... 0 0 0 \n", "Brazil 13 ... 0 0 0 \n", @@ -490,7 +490,7 @@ "South Africa 9 ... 0 0 0 \n", "United States of America 51 ... 0 0 0 \n", "\n", - " FCLASS_GR FCLASS_IT FCLASS_NL FCLASS_SE \\\n", + " FCLASS_IT FCLASS_NL FCLASS_SE FCLASS_BD \\\n", "admin \n", "Australia 0 0 0 0 \n", "Brazil 0 0 0 0 \n", @@ -502,22 +502,22 @@ "South Africa 0 0 0 0 \n", "United States of America 0 0 0 0 \n", "\n", - " FCLASS_BD FCLASS_UA geometry \n", - "admin \n", - "Australia 0 0 9 \n", - "Brazil 0 0 27 \n", - "Canada 0 0 13 \n", - "China 0 0 31 \n", - "India 0 0 36 \n", - "Indonesia 0 0 33 \n", - "Russia 0 0 85 \n", - "South Africa 0 0 9 \n", - "United States of America 0 0 51 \n", + " FCLASS_UA FCLASS_TLC geometry \n", + "admin \n", + "Australia 0 0 9 \n", + "Brazil 0 0 27 \n", + "Canada 0 0 13 \n", + "China 0 0 31 \n", + "India 0 0 36 \n", + "Indonesia 0 0 33 \n", + "Russia 0 0 85 \n", + "South Africa 0 0 9 \n", + "United States of America 0 0 51 \n", "\n", - "[9 rows x 120 columns]" + "[9 rows x 121 columns]" ] }, - "execution_count": 5, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -528,7 +528,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -537,20 +537,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 6, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAI/CAYAAABAqYlRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAACnzklEQVR4nOzdd3gc1bkG8Hdme99V79VFLnKV5YINptcAoV4IgZBACCE9uemk3PRCElIhAZIQCL33AMHGGFwk9yI39V52V1ptL3P/WFlYVpe2Su/vSR6s3dmZb2XLnnfPOd8RJEkCERERERERjU6MdwFERERERESJjsGJiIiIiIhoHAxORERERERE42BwIiIiIiIiGgeDExERERER0TgYnIiIiIiIiMYhj+XF0tLSpKKiolhekoiIiIiIaEKqq6u7JUlKH+m5mAanoqIiVFVVxfKSREREREREEyIIQsNoz3GqHhERERER0TgYnIiIiIiIiMbB4ERERERERDQOBiciIiIiIqJxMDgRERERERGNg8GJiIiIiIhoHAxORERERERE42BwIiIiIiIiGgeDExERERER0TgYnIiIiIiIiMbB4ERERERERDQOBiciIiIiIqJxMDgRERERERGNg8GJiIiIiIhoHAxORERERERE42BwIiIiIiIiGgeDExERERER0TgYnIiIiIiIiMbB4ERERERERDQOBiciIiIiIqJxMDgRERERERGNg8GJiIiIiIhoHAxORFMUCknwBULxLoOIiIiIYoDBiWiSet1+/Omd4/jO8/sRCDE4EREREc0G8ngXQJRMth7vxlee3IOOPi8A4O3DnVhRYMGKQjNWFFiwONcEtUIW5yqJiIiIKNIYnIgm6MmdTfj2c/sRCEmDj3U6vHj9YDteP9g++FhlUQqe/Mza8PN9HkgA0vQqyEQh1iUTERERUYQwOBGNY39zL+558wg2Heka8zhBANYUp+KbF5cBADYf7cKnH66CNxBCplGFz58zFzetKYxFyUREREQUYQxONKuEQhJ63X5YdMoxj/MFQvhvTQce29GEzUfHDkwAsDTfjAdvqUCaXoVOhwffeHofnqhqGny+o8+LAy29w14XCIbQYHWhp98HAKjr7sfhNgfyLBqUZRlRmKpFr9uPdIMKmUb1JN8tEREREUWKIEnS+EdFSEVFhVRVVRWz6xGdVN/txJNVTXhh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", + "image/png": "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wKo0X5fheBKLyjLXX2pVtROVThM21BfArNcAAGoLLRk7P1E2UdcrHBERERERKaa20IJffWgTvvHXY/iPl04qXQ7NUJ8/onQJowosevT4Zr/k9PyZRnqNCI0oIHTeboN72z1YUGLF8b5hWeqciCcUw7o6F0RBQCIpIZZIIhRLIBBJwBeKwR+Jy3auUCyBTk8InZ4QDFoBlU4T4pI6djckUhsGV0RERERENEqrEfHP1zbBrNfgW88cU7ocmsbicjsOdfuULmOUOxCFQSsiEp9dCKMVzwVXWxqLsabWhQefOjJ6WywpwZLmmWUtAwG0TLFJgVYEHCY9bEYtLAYtDNqRgE0UBCSkkaArHE1iOBofCbrCkwdd5698jMQldHpCeGp/D+5cWyPnp0SUExhcERERERHROPde3oDf7O6c8o08Kc9i0Chdwjgrqhxobp1dM3Wt5lySc9H8QlzWWDImuAIAw5lZWYIAVDhMWFhqxQtH+1MveIbiydk1sNcIgMOsh92ohcWggV6rwXA4juN9wzDrx78VP9XP7zWiiTC4IiIiIiKicTSigHdsrMWX/nhI6VJoCnLsJii3N08PodJlQudQaMaPOX/G1ZJKB3Sa8c3Yz36q5XYjnrrvEvR4w2OCK71WxPs218Og1cCoE/GLHe04pWDwmpBGZqC5zwu61te5AACxxPgZaZ2eEGKJJHRzaG5PlMv4HUFERERERBO6dXXlhAECqcfQDGf/pNOFjdWTElDlNE14bKFFj49smY+3rqses1OgeObfogA0ltlQ7jDhumVlYx579nO976qFePXEAD772wMosuqxvq4Ad2+swZ8+thn3bV0Il0WHHa1uzC+xyvlpysIbiqHQosep/vG9uhJJCV2emYd9RPmCM66IiIiIiGhCTrMely4oxnNH+pQuhSZxfgNzJayuceIXH9yE04NBvP+nb44uLfWGYqPHbF1Ugg31hVhQasXGeYUw6kaWN957eQNCsQRcZj2cJi38kQQSSQl2ow4A8NVbluGvB3sRT0r41xsW4a8He/HOTbW4enEp9rR78IO3r0ah1TCuprdvqEVDiRW/erMDoqCuWWlHe6duLn96MMjdBYkuMKsZVz/4wQ+wfPly2O122O12bNq0CU899dTo/eFwGPfeey8KCwthtVqxfft29Pb2yl40ERERERFlxltWVihdAk2hzGFU7NyC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ERERTcNm1OGu9TX4vw9fhHnFFvzjVQtx4IvbUFOYWo8iooffvgq3rqqc02NNegZXlPsESZIkpYs4n8/ng8PhgNfrhd2e2npfIiIiIiIiuSWSEiRJglbDeQAkn+O9fvz7X47g2cN9Mzp+dY0Tj75rHVwWzvij7DOb7IevtERERERERLOgEQWGViS7BaU2vG1DzYyP37akjKEV5QW+2hIRERERERGpwEXzi1Axg90qjToRt62pykBFRMpjcEVERERERESkAkadBp+8pnHa465bWo5CqyEDFREpj8EVERERERERkUq8ZUUlSu1Th1K1hZYMVUOkPAZXRERERERERCqhEQXcPM0ugyXTBFtEuYTBFREREREREZGK3La6ChpRmPT+JRVT78JGlEsYXBERERERERGpiCAAX755KeYXj18SuLrGicPdPkiSpEBlRJnH4IqIiIiIiIhIRf64rxsP/vkwKpym0dvsRi22r67C9966ClaDDoIw+YwsolyiVboAIiIiIiIiIjrnqsWl+J832mDQavC5GxZjYDiC926uR5HVgG88fRT3Xt6gdIlEGcPgioiIiIiIiEhFllQ4sOMzW8fdfqDTi6WVdpj0GgWqIlIGlwoSERERERERZYE+fxjXLC1XugyijGJwRURERERERKRy/f4wNjcUK10GUcYxuCIiIiIiIiJSqUAkjmRSQqHFAL2Wb+Ep//CqJyIiIiIiIlKhRFKCNxSDIACiyF0EKT8xuCIiIiIiIiJSUDIpAQB++WY7gJFZVv+7ox19/jAqnCYIAkMryl8MroiIiIiIiIgU9KudHUgmJZQ5jJAkCRaDFnesq0a5w6R0aUSKY3BFREREREREpIADnV7EEklcs6wMoijgkgXFnF1FdAGt0gUQERERERER5aOllQ4AgE7DOSVEk+F3BxERERERERERqRKDKyIiIiIiIiIiUiUGV0REREREREREpEoMroiIiIiIiIiISJUYXBERERERERERkSoxuCIiIiIiIiIiIlVicEVERERERERERKrE4IqIiIiIiIiIiFSJwRUREREREREREakSgysiIiIiIiIiIlIlBldERERERERERKRKDK6IiIiIiIiIiEiVGFwREREREREREZEqMbgiIiIiIiIiIiJVYnBFRERERERERESqxOCKiIiIiIiIiIhUicEVERERERERERGpEoMrIiIiIiIiIiJSJQZXRERERERERESkSgyuiIiIiIiIiIhIlRhcERERERERERGRKjG4IiIiIiIiIiIiVWJwRUREREREREREqsTgioiIiIiIiIiIVInBFRERERERERERqRKDKyIiIiIiIiIiUiUGV0REREREREREpEoMroiIiIiIiIiISJUYXBERERERERERkSpplS6AiNRrcDiC9qEQ9BoRi8ptEARB6ZKIiIiIiIgojzC4IqIJ7Tw9hA89sRP9/ggA4Bcf2IgN8woVroqIiIiIiIjyCZcKEtE48UQS//Dz3aOhFQAMBaMKVkRERERERET5iMEVEQEAOj0hdHlCAIBAJAFfODbm/g31nG1FREREREREmcXgiogQTyTxyV/uHf3YYdbhufsvw4pqJwBgXZ0LTrNOoeqIiIiIiIgoX7HHFRHhD/u6cN2ycpQ7jKO3ldiN+O1HLsKRHj+qXCY2ZiciIiIiIqKMY3BFRFhc7kBDiXVcOCUIAhaV2xWqioiIiIiIiPIdlwoSERrLbNCI8s6o6vSEEEskZR2TiIiIiIiI8guDKyKSXbs7iOu++3f8ameH0qUQERERERFRFmNwRUSy+vSv9uG67/4d3lAM3332OBJJSemSiIiIiIiIKEsxuCIiWVmNWvgjcQBAjy+MNncQksTwioiIiIiIiGaPwRURyeqDl82D3Xhu34erv/0SnjrQo2BFRERERERElK0YXBGRrEpsRrz/knm4ZVUlNjcUIZaQ8PirrUhyySARERERERHNknb6Q4iIZudjVy4AACSSEn7W3IZiqwGCvJsWEhERERERUR5gcEVEaaMRBbxjY+242/+8vxu/3tWJxeU2FFoNWFPrQnWBGQ6TToEqiYiIiIiISK0YXBFRxnlDMQgC8PKJARzo9CGaSOKT2xpx7+UNSpdGREREREREKsLgiogy7q71NbhrfQ0AwBuMoXUwgBXVTuw87caicjvMer40EREREREREZuzE5HCHGYdVlQ7EYzGcfd/NuPf/ngIiaSEIz0+xBNJpcsjIiIiIiIiBTG4IiLF7Ovw4OKvPY+/HeuHRhRgMWjw8+Z2bHzwOVzznb/jrh+/jqFAVOkyiYiIiIiISCEMrohIMcsqHRBF4LFXW2HQavCtO1aisdSGfn8EALCjdQgffGInwysiIiIiIqI8xeCKiBQjCAI+c91ifO6GxQCASxcW4y/3XYJSu2H0mOYWN363p1OpEomIiIiIiEhB7IBMRIq6ZmnZmI8FQUBDiRW9vgg0ooAtC4vx1jON3ImIiIiIiCi/MLgiItX5+JULcdOKAG5YUc4dBomIiIiIiPIY3xESkeqsry/A+voCpcsgIiIiIiIihbHHFRERERERERERqRKDKyIiIiIiIiIiUiUGV0SUFQKROAKRuNJlEBERERERUQbNKrh68MEHsW7dOthsNpSUlODmm2/G0aNHxxwTDodx7733orCwEFarFdu3b0dvb6+sRRNR/vl5cxtuevgVHO/1K10KERERERERZcisgquXXnoJ9957L15//XU888wziMViuPrqqxEIBEaP+cQnPoE//OEP+OUvf4mXXnoJXV1duPXWW2UvnIjyiygIONE3jLd8/xX88KWTiMQTSpdEREREREREaSZIkiTN9cH9/f0oKSnBSy+9hEsvvRRerxfFxcX42c9+httuuw0AcOTIESxatAivvfYaNm7cOG6MSCSCSCQy+rHP50N1dTW8Xi/sdvtcSyOiHNPpCeHirz0/+nFNgRkPXNuEa5aWQRAEBSsjIiIiIiKi2fD5fHA4HDPKflLqceX1egEABQUj29bv3LkTsVgMW7duHT2mqakJNTU1eO211yYc48EHH4TD4Rj9U11dnUpJRJSjbEYtTDrN6Mdt7iA+/D+7cOePXocnGFWwMiIiIiIiIkqXOQdXyWQS9913Hy6++GIsXboUANDT0wO9Xg+n0znm2NLSUvT09Ew4zgMPPACv1zv6p729fa4lEVEO+/HfTiEUG788sLnFjS/8/qACFREREREREVG6zTm4uvfee3HgwAE8+eSTKRVgMBhgt9vH/CEiOt/fj/fjkRdPTnr/b/d0oc8fzmBFRERERERElAlzCq4++tGP4o9//CNeeOEFVFVVjd5eVlaGaDQKj8cz5vje3l6UlZWlVCgR5SdJkvDFPxxCIjl1O75jPcMZqoiIiIiIiIgyZVbBlSRJ+OhHP4rf/OY3eP7551FfXz/m/jVr1kCn0+G5554bve3o0aNoa2vDpk2b5KmYiPKKIAgosuqnPe7uR99Aj5ezroiIiIiIiHLJrIKre++9F0888QR+9rOfwWazoaenBz09PQiFQgAAh8OBe+65B/fffz9eeOEF7Ny5E+95z3uwadOmCXcUJCKaiVtXV01/EICvP31k2plZRERERERElD20szn4Bz/4AQBgy5YtY27/yU9+gne/+90AgG9/+9sQRRHbt29HJBLBtm3b8Mgjj8hSLBHlpyuaSmZ03K93daKmwIz7ti5Mc0VERERERESUCbMKriRp+pkMRqMRDz/8MB5++OE5F0VEdL4iqwGNpTYc7fVPe2xdoSUDFREREREREVEmzHlXQSKiTFpX75r2mAeubcLNqyozUA0RERERERFlwqxmXBERKcWg1Ux636JyO95/Sf2Me2ERERERERFRdmBwRURZIRhNjLvtkgVF+NJNS1FfxOWBREREREREuYjBFRFlhXBsbHC1bUkpvnfXqilnYhEREREREVF2Y3BFRFmh1G4c/feySgcefttqaDVs00dERERERJTL+K6PiLLC/VctxIcumw8AuH1tFUMrIiIiIiKiPMAZV0SUFfRaEf98bRNuXlWB+cVWpcshIiIiIiKiDGBwRURZpanMrnQJRERERERElCFca0NERERERERERKrE4IqIiIiIiIiIiFSJwRUREREREREREakSgysiIiIiIiIiIlIlBldERERERERERKRKDK6IiIiIiIiIiEiVGFwREREREREREZEqMbgiIiIiIiIiIiJVYnBFRERERERERESqxOCKiIiIiIiIiIhUicEVERERERERERGpEoMrIiIiIiIiIiJSJQZXRERERERERESkSgyuiIiIiIiIiIhIlRhcERERERERERGRKjG4IiIiIiIiIiIiVWJwRUREREREREREqsTgioiIiIiIiIiIVInBFRERERERERERqRKDKyIiIiIiIiIiUiUGV0REREREREREpEoMroiIiIiIiIiISJUYXBERERERERERkSoxuCIiIiIiIiIiIlVicEVERERERERERKrE4IqIiIiIiIiIiFSJwRUREREREREREakSgysiIiIiIiIiIlIlBldERERERERERKRKDK6IiIiIiIiIiEiVGFwREREREREREZEqMbgiIiIiIiIiIiJV0ipdwIUkSQIA+Hw+hSshIiIiIiIiIiK5nc18zmZAU1FdcOX3+wEA1dXVCldCRERERERERETp4vf74XA4pjxGkGYSb2VQMplEV1cXbDYbBEFQuhz4fD5UV1ejvb0ddrtd6XKI0orXO+UTXu+UT3i9Uz7h9U75hNc7ZStJkuD3+1FRUQFRnLqLlepmXImiiKqqKqXLGMdut/OFgPIGr3fKJ7zeKZ/weqd8wuud8gmvd8pG0820OovN2YmIiIiIiIiISJUYXBERERERERERkSoxuJqGwWDA5z//eRgMBqVLIUo7Xu+UT3i9Uz7h9U75hNc75RNe75QPVNecnYiIiIiIiIiICOCMKyIiIiIiIiIiUikGV0REREREREREpEoMroiIiIiIiIiISJUYXBERERERERERkSoxuCIiIiIiIiIiIlVicHXGV77yFVx00UUwm81wOp0THrNjxw5ceeWVcDqdcLlc2LZtG/bu3TvmmH379uGSSy6B0WhEdXU1vv71r2egeqLZmcn1DgCPPfYYli9fDqPRiJKSEtx7771j7uf1Ttlgptc7AAwODqKqqgqCIMDj8Yy578UXX8Tq1athMBjQ0NCAxx57LG01E6Viumt+7969uOuuu1BdXQ2TyYRFixbhu9/97rjjeM1TNpjJa3xbWxuuv/56mM1mlJSU4JOf/CTi8fiYY3i9UzY6duwYbrrpJhQVFcFut2Pz5s144YUXxhwzk+ufSO0YXJ0RjUZx++2348Mf/vCE9w8PD+Oaa65BTU0N3njjDbz88suw2WzYtm0bYrEYAMDn8+Hqq69GbW0tdu7ciYceeghf+MIX8KMf/SiTnwrRtKa73gHgW9/6Fj7zmc/gn//5n3Hw4EE8++yz2LZt2+j9vN4pW8zkej/rnnvuwfLly8fd3tLSguuvvx6XX3459uzZg/vuuw/ve9/78PTTT6ejZKKUTHfN79y5EyUlJXjiiSdw8OBBfOYzn8EDDzyA73//+6PH8JqnbDHd9Z5IJHD99dcjGo3i1VdfxeOPP47HHnsMn/vc50aP4fVO2eqGG25APB7H888/j507d2LFihW44YYb0NPTA2Bm1z9RVpBojJ/85CeSw+EYd/uOHTskAFJbW9vobfv27ZMASMePH5ckSZIeeeQRyeVySZFIZPSYT3/601JjY2Pa6yaai8mud7fbLZlMJunZZ5+d9LG83inbTHa9n/XII49Il112mfTcc89JAKShoaHR+z71qU9JS5YsGXP8nXfeKW3bti1N1RKlbrpr/nwf+chHpMsvv3z0Y17zlG0mu97//Oc/S6IoSj09PaO3/eAHP5DsdvvozzC83ikb9ff3SwCkv/3tb6O3LAVeEwAABoBJREFU+Xw+CYD0zDPPSJI0s+ufKBtwxtUMNTY2orCwEI8++iii0ShCoRAeffRRLFq0CHV1dQCA1157DZdeein0ev3o47Zt24ajR49iaGhIocqJZu+ZZ55BMplEZ2cnFi1ahKqqKtxxxx1ob28fPYbXO+WSQ4cO4Utf+hJ++tOfQhTH/9f42muvYevWrWNu27ZtG1577bVMlUiUVl6vFwUFBaMf85qnXPHaa69h2bJlKC0tHb1t27Zt8Pl8OHjw4OgxvN4p2xQWFqKxsRE//elPEQgEEI/H8cMf/hAlJSVYs2YNgJld/0TZgMHVDNlsNrz44ot44oknYDKZYLVa8Ze//AVPPfUUtFotAKCnp2fMiwKA0Y/PTtckyganTp1CMpnEV7/6VXznO9/Br371K7jdblx11VWIRqMAeL1T7ohEIrjrrrvw0EMPoaamZsJjJrvefT4fQqH/394dhDTZB3Ac/01M8+BqssmiQFKoFA8eHeui0SIkrFtEsVKQYAdJURQF6SB0CurgVbwYRh2CkMrQg6ShhzbaygpKdskyGkHoYej/Pfg22utbm/GsPZPvB57DnufZn+eBL/r4357H9b9xmEDOzM3NaWJiQh0dHal1NI/dIpvrFXpHIXI4HHr69KlevHih8vJy7d27Vzdv3tSjR4/kcrkkcb2O3WNXT1z19fXJ4XD8dllaWspqrPX1dbW3t8vv9+v58+d69uyZ6uvr1dLSwi802IKVvW9ubiqZTOr27ds6deqUGhsbdefOHb17927bAx+BfLCy9/7+ftXW1urixYs5Pmrgz1nZ/M+i0ahaW1s1NDSkQCCQgyMHdi5XvQOFINv+jTEKhUKqrKzU7OysFhYWdPbsWZ05c0YfP37M92kAlirO9wHkUnd3ty5fvvzbfaqrq7Maa3x8XMvLy5qfn0/dRjI+Pi6Xy6UHDx7o/Pnz8nq9+vTpU9r7frz2er07PwFgB6zs/cCBA5Kkurq61DqPxyO32614PC5J9I68srL36elpvXz5Uvfu3ZMkGWMkSW63WwMDA7p+/fove3c6nSorK9v5CQA7ZGXzP7x69UonTpxQR0eHBgcH07bRPPLJyt69Xq8WFhbS1v33eoXeYSfZ9j89Pa2HDx8qkUjI6XRKkkZGRjQ1NaWxsTH19fVl1T9QCHb1xJXH45HH47FkrLW1NRUVFcnhcKTW/Xi9ubkpSfL5fBoYGFAymdSePXskbT0r6OjRo6mvawK5YmXvfr9fkvTmzRsdOnRIkvT161d9+fJFVVVVkugd+WVl7/fv30/75uzi4qLa2to0OzurmpoaSVu9T05Opr1vampKPp/PkmMAMrGyeUmKxWJqbm5WMBjU8PDwtu00j3yysnefz6fh4WF9/vxZlZWVkrZadjqdqQ/o6B12km3/a2trkrTt2ZxFRUVpf59m6h8oBLv6VsGdiMfjCofDisfj2tjYUDgcVjgc1vfv3yVJJ0+eVCKRUCgU0uvXrxWLxXTlyhUVFxerqalJknThwgWVlJSovb1dsVhMExMTunXrlrq6uvJ5asA2mXo/cuSIWltb1dnZqbm5OUWjUQWDQR07dozeUXAy9V5TU6P6+vrUcvjwYUlSbW1t6iLv6tWrev/+vXp7e7W0tKSRkRHdvXtX165dy9t5Ab+SqfloNKqmpiYFAgF1dXVpZWVFKysrWl1dTY1B8ygUmXoPBAKqq6vTpUuXFIlE9PjxYw0ODioUCqm0tFQSvaMw+Xw+uVwuBYNBRSIRvX37Vj09Pfrw4YNaWlokZdc/UBDy/W8N7SIYDBpJ25aZmZnUPk+ePDF+v9/s27fPuFwu09zcbObn59PGiUQi5vjx46a0tNQcPHjQ3Lhx4y+fCZBZNr1/+/bNtLW1mf3795uKigpz7tw5E4/H08ahdxSCbHr/2czMjJFkEonEtvUNDQ2mpKTEVFdXm9HR0ZwfO/AnMjU/NDT0v9urqqrSxqF5FIJsfsYvLy+b06dPm7KyMuN2u013d7dJJpNp49A7CtHi4qIJBAKmoqLClJeXm8bGRjM5OZm2Tzb9A3bnMObfh3kAAAAAAAAANsKtggAAAAAAALAlJq4AAAAAAABgS0xcAQAAAAAAwJaYuAIAAAAAAIAtMXEFAAAAAAAAW2LiCgAAAAAAALbExBUAAAAAAABsiYkrAAAAAAAA2BITVwAAAAAAALAlJq4AAAAAAABgS0xcAQAAAAAAwJb+Afhb1m0k4p3dAAAAAElFTkSuQmCC", "text/plain": [ - "<Figure size 1440x720 with 1 Axes>" + "<Figure size 2000x1000 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -567,7 +565,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -578,7 +576,7 @@ " dtype=object)" ] }, - "execution_count": 7, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -589,7 +587,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 42, "metadata": {}, "outputs": [], "source": [ @@ -609,27 +607,39 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "# Country names used in file names\n", "countries = [\n", " 'aland',\n", + " 'argentina',\n", " 'australia',\n", " 'belgium',\n", + " 'bolivia',\n", " 'brazil',\n", " 'bulgaria',\n", " 'burundi',\n", " 'canada',\n", + " 'chile',\n", " 'china',\n", + " 'colombia',\n", + " 'costa rica',\n", + " 'cuba',\n", " 'denmark',\n", + " 'dominican republic',\n", + " 'ecuador',\n", " 'egypt',\n", + " 'el salvador',\n", " 'estonia',\n", " 'ethiopia',\n", " 'france',\n", " 'finland',\n", " 'germany',\n", + " 'guatemala',\n", + " 'haiti',\n", + " 'honduras',\n", " 'iceland',\n", " 'india',\n", " 'indonesia',\n", @@ -638,18 +648,25 @@ " 'japan',\n", " 'kenya',\n", " 'korea',\n", + " 'latvia',\n", " 'liechtenstein',\n", " 'malaysia',\n", " 'mexico',\n", " 'morocco',\n", " 'myanmar',\n", " 'netherlands',\n", + " 'nicaragua',\n", " 'nigeria',\n", " 'norway',\n", + " 'panama',\n", + " 'paraguay',\n", " 'portugal',\n", " 'poland',\n", + " 'puerto rico',\n", " 'russia',\n", " 'rwanda',\n", + " 'saint barthelemy',\n", + " 'saint martin',\n", " 'singapore',\n", " 'slovenia',\n", " 'spain',\n", @@ -664,6 +681,7 @@ " 'ukraine',\n", " 'uruguay',\n", " 'usa',\n", + " 'venezuela',\n", " 'zambia',\n", "]\n", "\n", @@ -691,21 +709,19 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 44, "metadata": { "scrolled": false }, "outputs": [ { "data": { - "image/png": "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xI/dpsUIcaX0d+lwcaUypzFcTInPl18B73PO/XU6YulrzvdcBn5qZgVABHhL4izhp4lfkvA64DDxZMOsZmY/AK4ACi1eR/AjxOsIDrWdvyZef3of0EF89PZZaZjtbiB+2W8R8Csz2+6ce55zbpeZ/Yj4h1EP8ffDjCgGP9sN8zq8n/gl0Pcnesk94px7Y8qCHIdxbs9lwMfMLEK8BtkbU1CfalTj2SbnXKOZfZ74D1AH/No596vURD68CbzvLgOOOudmYpJkrrmYeD3bHRavLQjwr8AbgC8lDg67gKmqoVkG3JVIkHmAHznnfmlmu4G7zewTwONMXVmO4drvIf59/PfE+/NnzrmPTVf7U9DOuNo3s4eB75nZPwNtxOsfT3cMbyB+bBgDGonXZj8rmdlNDHG8xAz7Xhsuzhl+XPf/zGwt8e/QQ0zzpakjcc71mNlbif9g9wLfdM7NiMGIBigB7kl8VvqA7zvn5vSVBlNsuO/lW2bqe3UIqf5un6zh4v+TmRUBRryM56z4vZTwXmbHc58q3wS+aWY7iQ+Qd3uiF3Mqv7+G+376b+BbZraL+HvxW865J6cppmHjmgG/S2fi9/lwMb2V+FWKHzazDyemXeOmcADtvmzwFcMiIiIiIiIiIiIiIiOb82UxRERERERERERERCT5lFwWERERERERERERkXFTcllERERERERERERExk3JZREREREREREREREZNyWXRURERERERERERGTclFwWERERERERERERkXFTcllERERERERERERExk3JZREREREREREREREZNyWXRURERERERERERGTclFwWERERERERERERkXFTcllERERERERERERExk3JZREREREREREREREZNyWXRUTmGDN7tZk9PMLjvzGz26czJhERERERERGZe3ypDkBERKaXc+75qY5BRERERERERGY/9VwWERERERERERERkXFTcvksYWbOzBb3uf9tM/tE4nahmf3SzJrMrMHMHjIzT+Kx95nZfjNrNbPdZnZTqrZBZC4ws5vNrK3PX7eZPWBm15vZ42bWYmZHzeyjfZapSuzDr0k81mhmbzSzDWb2ZGLf/fLgpuzLZtZsZnvM7Mo+DzxgZq9P3F5kZn8ys9NmVm9m3zOz3Gl5MkRERERERERkVlNyWQDeBRwDioAS4F8Bl3hsP3ApkAP8G/BdMytLRZAic4Fz7ofOuUznXCYwDzgA/ABoB14F5ALXA28ysxcNWHwTsAS4Gfgi8AHgKmAl8HIzu3zAvPuBQuAjwM/MLH+IkAz490Qsy4EK4KOT3EwREREREREROQsouSwAEaAMWOCcizjnHnLOOQDn3I+dcyecczHn3A+BvcDGVAYrMhckrg74PvCAc+5rzrkHnHM7Evvak8QTzpcPWOzjzrku59zviSejf+Ccq3XOHQceAs7rM28t8MXEPv1D4GniSet+nHP7nHP3O+e6nXN1wOeHaFdEREREREREZBAllwXgP4B9wO/N7ICZve/MA2b2KjPbnrjsvglYRbwnpIhMzieBLOBtAGa2ycz+bGZ1ZtYMvJHB+9qpPrc7h7if2ef+8TMniRIOE++d3I+ZlZjZ3WZ23MxagO8O0a6IiIiIiIiIyCBKLp89OoBQn/ulZ24451qdc+9yzi0EXgi808yuNLMFwNeBtwIFzrlcYCfxy+hFZILM7BXALcBLnXORxOTvA/cBFc65HOCrTG5fKzezvstXAieGmO9TxMvgrHbOZQP/MMl2RUREREREROQsoeTy2WM78Eoz85rZtfS57N3MbjCzxYlEVDMQBWJABvGkU11ivtcQ77ksIhNkZucB/wW8KFGG4owsoME512VmG4FXTrKpYuBtZuY3s5cRr6f86yHmywLagGYzKwf+ZZLtioiIiIiIiMhZQsnls8fbgRcATcCtwL19HlsC/IF4gunvwP845/7snNsNfC4x7RSwGvjr9IUsMifdCOQBD5tZW+LvN8CbgY+ZWSvwYeBHk2xnM/F9u554CY6XOudODzHfvwHnEz+x9CvgZ5NsV0RERERERETOEta/JKeIiIiIiIiIiIiIyOjUc1lERERERERERERExk3JZREREREREREREREZNyWXRURERERERERERGTclFwWERERERERERERkXFTcllERERERERERERExs2X6gAGKiwsdFVVVakOQ2Tabdu2rd45V5TqOCZK+66crWb7visiIiIiIiIyUTMuuVxVVcXWrVtTHYbItDOzw6mOYTK078rZarbvuyIiIiIiIiITpbIYIiIiIiIiIiIiIjJuSi6LiIiIiIiIiIiIyLjNuLIYIiIys0RjjhNNneyvayPg83DRosJUhyQiIiIiIiIiM4CSyyIiAkBzR4T99W0crGvnQH0bB+raOVDX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o/f9PJKA18ONa+dx9YoSLlhUQHba4DrkIiIiIiIiIiIjsVQlW4azfv16t3Xr1lSHIdOkKxLlvu0nyErz8fzVZQCcbO7i+v98iNPtgwfiO+Ol55fziZtWD7pUv727hweermNBQYiTzV1sqMofVCd6oCeONnHr/26mrTteeuAP77w8JSUAzGybc279tDecJLNh373ycw+wv649JW0vLcnkmVNtU96O12PMz0vnVEsXy8uyOVDXRnNn/8E2r1pewqdevIriLPVGTobZvu+KiIiIiIiITNSs7bns3LM1fWX2SvN7efmGin7TSnPSeM+15/Den/YvmRHwenjblYt4zrISVs7LGXJ9GUEf16+JJ6lXlQ89z0Br5ueQk+6nrbuHY42d/HVfPVcuL5nA1shMl8pTabmhwLS0E405Dp+Ol8h4/EgTAIuLMynICFCUFeSckize+tzF+vwUERERERERkUmbtcllJUbmtps3VPJUTSvf/tuh3mn/cs0SXn/ZoqS/9l2RGHkZ/t5SHH/aU6vk8hyVyk+NmHP4PUZksqNYTsC+2jb2AY+8/0pKc9RbWURERERERESSw5PqAESG855rzyHoi79Fs4I+rj+3fEpOKqQHvGyqLsCXGHTt3sePc7pt9Jq1MvsUZQVT1raH1CSWzwgFvBRmTk/vaRERERERERE5Oyi5LDNWKODjvdcuI93vpbW7h7rWrilr633PO4eNVXkAtIejHKxPTV1emVovWlueknZLc9LYfWLyg/lNRmbQh0dXfIiIiIiIiIhIEim5LDPaay+p5tEPXsVdr91IODp1vT79fi//ev0KynPTCXg9VBdmTFlbkjrXriqlPDd9WttcvyCPlo4wbeHotLY7kAM8HiWXRURERERERCR5Zm3NZTl7ZAZ9XL60aMrbWVWewydetIo9NS0UZKaufIJMndxQoF997am2al422w43pnQgwTNec3FVqkMQERERERERkTlGyWWRhEhPjAsX5nP50sJUhyJT6EPXr+BV39xCd09syttK83tTmliuKgjxsvUVXLy4kHPn56QwEhERERERERGZi5RcFknw+zz4VSlmztu0sIA/v/sKfr2jhk/9+immcoy9rYcbWVWejQE7jrdMXUMDXL+6jNsvqmJDVd6UDIIpIiIiIiIiIgJKLovIWWhebjqvv3QhneEon7v/mSlta+fxFjZW509pG2cUZgb4wPXLuem8+dPSnoiIiIiIiIic3ZRcFpGz1h2XL2Tr4UYefKZuStsJT3EJjmWlWbzpikVcu6qUoM87pW2JiIiIiIiIiJyRtBoAZlZhZn82s91mtsvM3p6Ynm9m95vZ3sT/vGS1OV0a2rv56776VIchIkkW9Hm581Xr+MgLVkxZG0tLMtlX2zpl6185L5t733IxN64tV2JZRERERERERKZVMgvM9gDvcs6tAC4A3mJmK4D3AX90zi0B/pi4P6vkZwS5eHF8kLf7d5+isT1MXWt3iqMSGZqZvSxxgidmZuv7TL/VzLb3+YuZ2dohlv+omR3vM99107oB0yzo8/Kai6u5clnxlKw/5qCtOzol6w74PHzh5rWk+ZVUFhEREREREZHpl7TksnOuxjn3WOJ2K/AUUA7cCNyVmO0u4EXJajMVrl5RQl5GgOaOMH986lSqwxEZyk7gxcBf+k50zn3PObfWObcWuA046JzbPsw6vnBmXufcr6c02hniv155HrddsIDMYPKqBeWk+zlU35a09Q30D5sWsLQka8rWLyIiIiIiIiIykmT2XO5lZlXAecBmoMQ5V5N46CRQMhVtTrfFJVlsqM7ns797ms7w1PRKFJkI59xTzrmnR5ntFuDu6YhntggFfHz8Rav487uvIDstOQnmpSWZTFW55YDXw0vWlU/NykVERERERERExiDpyWUzywR+CrzDOdfS9zHnnAPcEMvcYWZbzWxrXd3UDqyVTKeau/jWXw/y4DO1qQ5FZLxuBn4wwuNvNbMnzeybs7FO+mQUZQX5yj+sozAzOOJ8HoMlxZmsW5DHpUsKyU7zkeb39FuuoT08JTFmBn186zUbWDkvZ0rWLyIiIiIiIiIyFsm7/hswMz/xxPL3nHM/S0w+ZWZlzrkaMysDBmVinXN3AncCrF+/flDyeaaqLszg9++8nPLc9FSHImcZM/sDUDrEQx9wzv18lGU3AR3OuZ3DzPIV4OPETwR9HPgc8Nph1nUHcAdAZWXl2IKfBS5eXMg3X72ePTWtfPDenUSdY0lxJqvKc1g1L5tV5TmsmJdNKPDsR2h3T5TTbWHm5aZzqqWLRw6c5ot/2Jv02LLSfHzv9ZtYMz836esWERERERERERmPpCWXzcyAbwBPOec+3+eh+4DbgU8n/o+Y+JpNfF6PEsuSEs65qyax+CsYodeyc663mLiZfR345QjzzsoTQ2OxZn4ua+bnsq4qj/Lc9FEHzQv6vMxLfB6UZKdx49pyrlxewm3f2MzjR5qSEpMSyyIiIiIiIiIykySzLMbFxAcJe66ZbU/8XUc8qXy1me0FrkrcF5EUMDMP8HJGqLecuMLgjJuIDxB41lpUlDlqYnk4mUEf337NRl59UVW/6QUZgQmt787b1iuxLCIiIiIiIiIzRtJ6LjvnHgZsmIevTFY7IjIyM7sJ+C+gCPiVmW13zj0v8fBlwFHn3IEBy/wv8FXn3Fbg/5nZWuJlMQ4B/zhdsc9FOel+PvrClbzx8kUcaehgfl46pdlp3Lv9OO/72Q7CPTFy0v1cvLiALQcbqG8buk7zhQsLWLfgrCp/LSIiIiIiIiIzXFJrLotI6jnn7gHuGeaxB4ALhpj++j63b5uy4M5ipTlplOak9d5/8fnzaevuIdwT48Xnzyc/0Zt5f10bP9h8hG/97RCFmQFuWDOPK84pYlN1AQFf0sdgFRERERERERGZMCWXRURS5FUXVg2atqgokw/esII7LltIdrp/wiU5RERERERERESmmpLLIiIzUHF22ugziYiIiIiIiIikkK6xFhEREREREREREZFxU3JZRERERERERERERMZNyWURERERERERERERGTdzzqU6hn7MrA44PIFFC4H6JIeTLIptYs622BY454qSvM5pM4l9dyxm8nthJLM1bpi9saci7lm974qIiIiIiIhM1IxLLk+UmW11zq1PdRxDUWwTo9jkjNn6fM/WuGH2xj5b4xYRERERERGZjVQWQ0RERERERERERETGTcllERERERERERERERm3uZRcvjPVAYxAsU2MYpMzZuvzPVvjhtkb+2yNW0RERERERGTWmTM1l0VERERERERERERk+sylnssiIiIiIiIiIiIiMk1mXXLZzF5mZrvMLGZm6/tMv9XMtvf5i5nZ2sRjD5jZ030eK05BfFVm1tknhq/2eWydme0ws31m9p9mZtMY19Vmti3R/jYze26fx1L+vCUee3/iuXnazJ7XZ/q1iWn7zOx9UxXbgFh+2Of5OGRm2xPTh319ZezMrMLM/mxmuxPvh7cnpueb2f1mtjfxPy/VsQ40QuwfNbPjfd4b16U61r7MLM3MtpjZE4m4/y0xvdrMNif2rx+aWSDVsfY1QtzfNrODfZ7vtSkOVURERERERGTO8qU6gAnYCbwY+Frfic657wHfAzCz1cC9zrntfWa51Tm3NVXxJex3zq0dYvpXgDcAm4FfA9cCv5mmuOqBFzjnTpjZKuB3QHmfx1P6vJnZCuAVwEpgHvAHM1uaePi/gauBY8CjZnafc273VAbpnLu5T2yfA5r7PDzc6ytj1wO8yzn3mJllAdvM7H7g1cAfnXOfTpxIeB/w3hTGOZThYgf4gnPusymMbSTdwHOdc21m5gceNrPfAO8kHvfdiZMlryP+WTVTDBc3wL84536SwthEREREREREzgqzrueyc+4p59zTo8x2C3D3dMQz0Bjj62VmZUC2c+4RFy+A/R3gRdMVl3PucefcicTdXUC6mQWT3f5oRnjebgTuds51O+cOAvuAjYm/fc65A865MPHX+8bpijfRu/zlwA+mq82zgXOuxjn3WOJ2K/AU8ZMdNwJ3JWa7iynYRyZrhNhnNBfXlrjrT/w54LnAmQTtjHvOR4hbRERERERERKbJrEsuj9HNDE76fStxifSHpqLsxBhVm9njZvagmV2amFZOvOftGcdIXULqJcBjzrnuPtNS/byVA0f73D/z/Aw3fbpcCpxyzu3tM22o11cmyMyqgPOI9+gvcc7VJB46CZSkKq6xGBA7wFvN7Ekz++YMLenhTZR4qQXuB/YDTc65nsQsqfxcGtbAuJ1zZ57vTyae7y+k4mSZiIiIiIiIyNliRpbFMLM/AKVDPPQB59zPR1l2E9DhnNvZZ/KtzrnjiUvVfwrcRryH8HTGVwNUOudOm9k64F4zWznRGJIY15llVwKfAa7pM3kmPG/Tboxx3kL/ExhDvr7OuZYpDndOMrNM4u+5dzjnWvqe13DOOTObsT1Uh4j9K8DHifeq/TjwOeC1KQxxEOdcFFhrZrnAPcCy1EY0NgPjTpT2eT/xExAB4E7i5VM+lrIgRUREREREROawGZlcds5dNYnFX8GAXsvOueOJ/61m9n3iJRUmnCSdSHyJ3sDdidvbzGw/sBQ4DszvM+v8xLRpiQvAzOYTTyi9yjm3v8/6Uv68EX8uKvrc7/v8DDd9UkaL08x8xOtDr+uzzHCv73TUq55TEvVzfwp8zzn3s8TkU2ZW5pyrSZSSqU1dhMMbKnbn3Kk+j38d+GWKwhuVc67JzP4MXAjkmpkv0Xs5afvXVOgT97V9alt3m9m3gHenMDQRERERERGROW1OlcUwMw/xOrh395nmM7PCxG0/cAPxweOmO7YiM/Mmbi8ElgAHEpf6t5jZBYmyE68Cpq0Xb6LH36+A9znn/tpn+ox43oD7gFeYWdDMqok/b1uAR4ElZlZtZgHiJxXum6aYrgL2OOd6y5kM9/pOUzxzRmIf+AbwlHPu830eug+4PXH7dqZxHxmr4WJPJMPPuInU7EfDSrx3cxO304kPkvkU8GfgpYnZZtxzPkzce84834nX40XMsOdbREREREREZC6ZkT2XR2JmNwH/BRQBvzKz7c655yUevgw46pzrm9QLAr9LJEi9wB+Ar6cgvsuAj5lZBIgBb3TONSQWezPwbSAd+E3ib7rieiuwGPiwmX04Mfs1QDsz4Hlzzu0ysx8Bu4Ee4C2JS+Exs7cCv0vE903n3K6pim+AQb3jGfn1lbG7mHj5lR2JWroA/wp8GviRmb0OOEz8JNJMM1zst5jZWuJlMQ4B/5iK4EZQBtyVODniAX7knPulme0G7jazTwCPE0+czyTDxf0nMysCDNgOvDGFMYqIiIiIiIjMaebcjC1dKiIiIiIiIiIiIiIz1JwqiyEiIiIiIiIiIiIi00PJZREREREREREREREZNyWXRURERERERERERGTclFwWERERERERERERkXFTcllERERERERERERExk3JZREREREREREREREZNyWXRURERERERERERGTclFwWERERERERERERkXH7/6uwjKg+H2K6AAAAAElFTkSuQmCC", + "image/png": "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Cy9www03cP7553PBBRcAMGLECPc9HA4HM2bM4KSTTuKxxx5zt6E1Y9TmHDp0iE8++YRZs2aRkpJCYWEhL730EieffDK7d+8mLi6uVfcTQhy/LrroIpKTk3n44YdZu3YtzzzzDOXl5bzxxhsAPPjgg9x9991cdNFFXHfddRQXF/Pss88ydepUtmzZ0qAEzhEul4uzzz6b9evXc8MNNzBo0CA+/fTTTnuOvvjiixk8eDD/+c9/+PLLL3nggQcICwvjpZde4tRTT+WRRx5hxYoVLFy4kHHjxjF16tROaYcQ4vjVXH963XXX8frrr/O3v/2N2267jXXr1vHwww+zZ88eVq5c2arPuf3223n//ffdC9KPeP/995k+fTqhoaGNXv/0009zzjnncPnll2Oz2Xj33XeZNWsWX3zxBWeeeWbbvrwQQrRTc30owI8//sj777/P/PnziYiIcC/waUm/9ve//53TTz/d4zO/+eYbVqxYQVRUVJd9T9GNKEL4SE1NTYNja9asUQDljTfecB/76aefFED56aefmrz24YcfVlQqlZKZmek+Nnv2bAVQ7rvvPo9zR48erYwZM8b9+pNPPlEA5b///a/7mMPhUKZMmaIAyrJly9ryFYUQQlGUlvd3y5YtUwDlpJNOUhwOh/u41WpVwsPDlXHjxil2u919fPny5QqgnHzyye5jb775pqJWq5XVq1d7fN6LL76oAMrvv//uPgYoer1eSUtLcx/btm2bAijPPvus+9ijjz6qAEp6enqD75GUlKTMnj27wXc4/fTTFZfL5T5+6623KhqNRjGbzU3+XP7+978r/v7+Sl1dXYP3hBDHp5b2oUuWLFG8Pd4c6ZeO9GErV65UAGXDhg2NfmZxcbECKEuWLGnw3pHx5aJFi1rUVm9jVG9tPbY/raurU5xOp8c56enpisFgaDC2FUIIb470Neecc47H8RtvvFEBlG3btikZGRmKRqNRHnzwQY9zduzYoWi1Wo/js2fPVpKSktyvP/roIwVQnnrqKfcxp9OpnHrqqQ2eo4/t99LT0xt91j62/z1y7fXXX+8+5nA4lPj4eEWlUin/+c9/3MfLy8sVPz8/j/5UCCHaqyX96datWxVAue666zzOWbhwoQIoP/74o/vYySef7PEc761PnDhxosfcpaIoyvr16xuMgY/tmxWl4ZjUZrMpw4YNU0499dTW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ZwgheoeW9qGpqakA/Prrr+5jFouF119/3eO88vLyBvc7sir8SBr0I4Gc1vR7HT1G9fa9P/jgA3Jzc9t0PyHE8eu5557zeH3kOfeMM87gggsuQKPRsHTp0gZ9jqIolJaWNnrfGTNmYLfbPcadLperwed5ExwcTEREhEefDchYUAjRrTXVn/71r38F4KmnnvI450h2tjPPPLPVn3fhhRei0Wh45513+OCDDzjrrLPcz+eN0Wg0qFQqj7FyRkYGn3zySas/XwghOlJTfWhTWtqv5efnc9FFF3HSSSfx6KOPdkyjRY8mO8CFz5x11lm8+eabmEwmhgwZwpo1a1i1alWzNRkGDRpEamoqCxcuJDc3l+DgYD766KN21fg6++yzmTx5MosWLSIjI4MhQ4bw8ccfS20cIUSHaGt/d4Rer+fee+/lpptu4tRTT+Wiiy4iIyOD5cuXk5qa6rFT8corr+T999/nH//4Bz/99BOTJ0/G6XSyd+9e3n//fb799lvGjh3bqvaPGTMGgH//+99ccskl6HQ6zj777GYfvJsyadIkQkNDmT17NjfffDMqlYo333xT0lUKIRpoaR86ffp0EhMTufbaa/nXv/6FRqPhtddeIzIykqysLPd5r7/+Os8//zznn38+qampVFVV8corrxAcHOyeuPTz82PIkCG89957DBgwgLCwMIYNG8awYcMabWdHj1HPOuss7rvvPq6++momTZrEjh07WLFiBX379m3T/YQQx6/09HTOOeccZs6cyZo1a3jrrbe47LLLGDlyJAAPPPAAixcvJiMjg/POO4+goCDS09NZuXIl119/PQsXLvR63/POO4/x48dz2223kZaWxqBBg/jss88oKysDms8idN111/Gf//yH6667jrFjx/Lrr7+yf//+jv3yQgjRgZrrT2fPns3LL7/sLvm1fv16Xn/9dc477zyPbG4tFRUVxbRp03jiiSeoqqri4osvbvaaM888kyeeeIKZM2dy2WWXUVRUxHPPPUe/fv3Yvn17q9sghBAdpbk+tDEt7dduvvlmiouLuf3223n33Xc97jFixAiPDJri+CABcOEzTz/9NBqNhhUrVlBXV8fkyZNZtWoVM2bMaPI6nU7H559/zs0338zDDz+M0Wjk/PPPZ/78+c12lo1Rq9V89tln3HLLLbz11luoVCrOOeccHn/8cUaPHt2mewohxBFt7e+ONn/+fBRF4fHHH2fhwoWMHDmSzz77jJtvvhmj0eg+T61W88knn/Dkk0/yxhtvsHLlSvz9/enbty///Oc/W53aEmDcuHHcf//9vPjii3zzzTe4XC7S09PbFQAPDw/niy++4LbbbuOuu+4iNDSUK664gtNOO61VPxchRO/X0j5Up9OxcuVKbrzxRu6++25iYmK45ZZbCA0N5eqrr3afd2Qy8t1336WwsBCTycT48eNZsWKFRzq2//3vf9x0003ceuut2Gw2lixZ0mQAvKPHqHfeeScWi4W3336b9957jxNOOIEvv/ySRYsWtfpeQojj23vvvcc999zDokWL0Gq1zJ8/32NXzKJFixgwYABPPvkkS5cuBSAhIYHp06dzzjnnNHpfjUbDl19+yT//+U9ef/111Go1559/PkuWLGHy5MkeY1Rv7rnnHoqLi/nwww95//33OeOMM/j666+JiorqmC8uhBAdrLn+9H//+x99+/Zl+fLlrFy5kpiYGBYvXsySJUva/JkXX3wxq1atIigoyL1Ysymnnnoqr776Kv/5z3+45ZZbSElJ4ZFHHiEjI0MC4EIIn2quD21MS/u14uJinE4nCxYsaHCPJUuWSAD8OKRSZKuVEEII0SO5XC4iIyO54IILvKY8F0IIIYQQoqt98sknnH/++fz2229MnjzZ180RQgghhBBCHIekBrgQQgjRA9TV1TVID/7GG29QVlbGKaec4ptGCSGEEEKI41ptba3Ha6fTybPPPktwcDAnnHCCj1olhBBCCCGEON5JCnQhhBCiB1i7di233nors2bNIjw8nM2bN/Pqq68ybNgwZs2a5evmCSGEEEKI49BNN91EbW0tEydOxGq18vHHH/PHH3/w0EMP4efn5+vmCSGEEEIIIY5TEgAXQggheoDk5GQSEhJ45plnKCsrIywsjKuuuor//Oc/6PV6XzdPCCGEEEIch0499VQef/xxvvjiC+rq6ujXrx/PPvss8+fP93XThBBCCCGEEMcxqQEuhBBCCCGEEEIIIYQQQgghhBCiV5Aa4EIIIYQQQgghhBBCCCGEEEIIIXoFCYALIYQQQgghhBBCCCGEEEIIIYToFVpdAzw3N5c77riDr7/+mpqaGvr168eyZcsYO3YsAIqisGTJEl555RXMZjOTJ0/mhRdeoH///o3e895772Xp0qUexwYOHMje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GVlZWYiJibFaZmhoKHx8fLBv3z7zg1W1Wo1jx45h4cKFdm1PW7HH52JNdnY2SkpKLB5Id2ZNfS4tIRKJEBUVhX379mHGjBkAakfH79u3D08++WSryycdR6lUQqlUtklZMTExeOutt1BYWGhOCbt3717IZDLzzVtMTAx+++03i/P27t3brN9JW9naturqagCol0mEx+OZR1/b0jZ7srUtUVFREIvFSE5OxqhRowDUBqIyMjIQHBwMoOPbAtjeng8//BBvvvmm+XVubi5iY2PxzTffIDo6GkBte1566SXo9XoIhUIAte2JiIgwpwi0p+b8DuXk5GD8+PHmUfw3fuc6ui2k49hyXRYTEwOVSoVTp06Z13/cv38/TCaT+fehM6gLfl+6dAkHDhyAh4eHxf6u0o6HHnrI6tpvDz30kHl9ta7QFpFIhGHDhiE5Odlie0pKivnvQltdM9ubXq+HXq+v13fy+Xzz3+uu0pbuyB73KN3dhAkTcO7cOYttc+fORe/evbF06VIKfrfAyJEjG+0vCWkNR7o/bYnmPntgjGHbtm14+OGHzfdGdbrifZOj3dO3RGuePyUkJIDH45nb2xW/A6RlHPm55fXaso+0JiEhocNiG476u9+WzwOt6cifmS3sGi9iDqyiooLFx8ez+Ph4BoCtXbuWxcfHs8zMTMYYY99++y07cOAAu3z5Mvvxxx9ZcHAwu/POOy3KeOihh9iyZcvMr1977TX2559/ssuXL7NTp06x++67j0kkEnbhwoV2bVtLLVy4kMnlcnbw4EGWl5dn/q+6utp8zOOPP86CgoLY/v372cmTJ1lMTAyLiYmxKCciIoL98MMP5terV69mbm5u7KeffmJnz55l06dPZ6Ghoaympqbd2tYa9vhcKioq2PPPP8/i4uJYeno6++uvv9iQIUNYeHg402g07dq+lrLlc8nLy2Px8fHs448/ZgDY4cOHWXx8PCspKTEfc/PNN7MNGzaYX3/99ddMLBaz7du3s8TERLZgwQLm5ubG8vPz27V9pONkZmay+Ph49tprrzEXFxdzX11RUcEYY8xgMLD+/fuzSZMmsYSEBPbHH38wpVLJli9fbi4jLS2NSaVS9p///IclJSWxjRs3Mj6fz/7444+OahYrKipiHh4e7M4772QJCQksOTmZPf/880woFLKEhATGmG1t6ywWL17M/P392Z9/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n3/+aVGdfX19MWjQIOzYscMi5c/evXsbXN+HEEJai8fjYcaMGfjll19w8uTJevsZY21+LWjrdWBz+kU+nw+O4yyycGRkZODHH39sUR0JIaS1bOlf25KXlxfGjRuHLVu2IC8vr97+669ZCSGkM2jvfrIh9IySENJebOn3br31Vhw/fhxxcXHm7VVVVdi6dStCQkLQt29fq2Vff/98/aSf8+fPY8+ePbj11lvbvD2fffYZKioqzK+/++475OXlYcqUKQ2eQ/fuXQ/NACd2k56ejmnTpmHy5MmIi4vD559/jlmzZmHgwIEAgEcffRSrV6/Go48+iqFDh+Lw4cNISUlpslxvb28sXrwY77//vrn8M2fO4Pfff4enp6dFiuDbbrsNr7/+OubOnYsRI0bg3Llz+OKLL8wjzFuid+/e6NGjB55//nnk5ORAJpPh+++/b9YaZ4QQ0hB79Z3Xe+SRR7B27VrExsZi3rx5KCwsxObNm9GvXz+o1eoW1XvVqlWYOnUqRo0ahUceeQSlpaXYsGED+vXrh8rKyhaVSQghTXn77bexZ88ejB07FgsWLECfPn2Ql5eHnTt34u+//27za8HmXAfa2i9OnToVa9euxeTJkzFr1iwUFhZi48aN6NmzJ86ePdviz4YQQlqjqf61rW3cuBGjRo3CgAEDMH/+fISFhaGgoABxcXHIzs7GmTNn2vw9CSGkNdq7n7SGnlESQtpTU/3esmXL8NVXX2HKlCl4+umnoVAosGPHDqSnp+P7778Hj9fwfNx3330XU6ZMQUxMDObNm4eamhps2LABcrkcr776apu3RaFQYNSoUZg7dy4KCgqwbt069OzZE/Pnz2/wHLp373poBjixm2+++QZisRjLli3D7t278eSTT1qkn3zllVcwb948fPfdd3jhhRdgNBrx+++/21T2mjVrsGLFCpw4cQLPP/88UlNTsWfPHjDGIJFIzMe9+OKLeO655/Dnn39i8eLFOH36NHbv3o3AwMAWt0soFOKXX37BoEGDsGrVKrz22msIDw/HZ5991uIyCSGkjj37zjp9+vTBZ599hvLycixZsgQ///wz/ve//2HIkCEtrvfkyZOxc+dOGI1GLF++HD/88AO2bduGoUOHtrhMQghpir+/P44dO4a7774bX3zxBZ5++ml89tlnGDduHKRSaZtfCzbnOtDWfvHmm2/GJ598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SL3brV69Gjk5ObZ/NS9SUlNTMXnyZIwZMwaJiYl48skncf/992Pnzp2t3HrnGjqmhIQE+Pr64ocffsDZs2fx4osvYunSpfjkk08ctk1OTrY7bl9f39ZuvlMNHZPFYsHkyZNhNBpx6NAhrF27FmvWrMGyZcts23S096m2YcOG2b3WOTk5uP/++xEREYFBgwbZbbt792677WJiYtqp1a557bXX7Nr72GOP2dZptVqMHz8eYWFhSEhIwMqVK/Hqq6/iq6++ascWk47IHWNbtRshxlVz51hXjWIe6WyOHTtm95ndtWsXAGDWrFm2bR544AG7bTpTxw2dTod+/frh008/dbr+3XffxX//+1988cUXOHr0KGQyGSZMmAC9Xm/b5q677sLZs2exa9cu/P777zhw4AAefPDBtjqERqnveCsqKnDixAm8/PLLOHHiBDZv3ozk5GTcdtttDtvWF8s6kobeXwCYOHGi3bH89NNPdus70/tLSHNNmTIFZrMZe/fuRUJCAvr164cpU6bYOoS6ct5JmmbTpk245557cO+99+LUqVP4999/ceedd9rW3/CvPSNNlp+fzwCwv//+u85tfvnlFyYUCpnJZGrDlrWcuo7x5MmTLCgoiOXk5DAAbMuWLe3TwGZydnyxsbHspZdeasdWtSxnxyiTydj3339vt52npyf7+uuv27p5hLQI+pw3j1qtZt988w0rLS1lAoGAbdiwwbbu/PnzDAA7fPhwO7aw46p+7Zzp7OcApPlWr17NVCqV03UNnT/93//9H+vVq5fdsjlz5rAJEya0YAsbr75jqu3RRx9lY8aMsf29b98+BoCVlJS0TuOaqK5j+uOPPxiXy2W5ubm2ZZ9//jlTKpXMYDAwxjru+1QXo9HIfHx82GuvvWZblpqaygCwkydPtl/DGiksLIytWrWqzvWfffYZU6vVtveJMcaef/55Fh0d3QatI52RO8a2ajdSjKvmLrGuGsU84g6eeOIJFhUVxaxWK2OMsVGjRrEnnniifRvVQmqf11utVubv789WrlxpW1ZaWspEIhH76aefGGOMnTt3jgFgx44ds23z559/Mg6Hw7Kystqs7U3hyn3g+Ph4BoClp6fbljUUyzoqZ8c7f/58Nm3atDof05nfX0Iaq6CggAFgBw4csC3TarUMANu1axdjzLXzTtJ4JpOJBQUF1XlfkjF67TvH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S01NZadPn2ZLlixhHA6H/fXXX4wxxh5++GEWGhrK9u7dy44fP87i4uJYXFxcO7e6Y6jvtXOHcwDSctLT09nJkyfZ8uXLmVwuZydPnmQnT55kZWVljDHGtm3bxr7++mt25swZdunSJfbZZ58xqVTKli1bZtvHlStXmFQqZc899xw7f/48+/TTTxmPx2M7duzokMd05swZ5uPjw+6++267z39+fr5tH6tWrWJbt25lly5dYmfOnGFPPPEE43K5bPfu3R3ymMxmM+vduzcbP348S0xMZDt27GA+Pj5s6dKltn10tPepLrt372YA2Pnz5x3WrVmzhq1bt46dP3+enT9/nr355puMy+Wy7777rh1a2rBDhw6xVatWscTERJaSksJ++OEH5uPjw+bNm2fbprS0lPn5+bF77rmHJSUlsfXr1zOpVMq+/PLLdmw56YjcMbZVu5FiXDV3inXVKOaRzsxisbDQ0FD2/PPP2y2/fPkye+2119jx48dZamoq+/XXX1lkZCQbOXJkO7W08crKymxxFQD74IMP2MmTJ1l6ejpjjLG3336beXh4sF9//ZWdPn2aTZs2jUVERLDKykrbPiZOnMgGDBjAjh49yv755x/WtWtXNnfu3PY6pHrVd7xGo5HddtttLDg4mCUmJtr9XhoMBsaYa7GsI6nveMvKytizzz7LDh8+zFJTU9nu3bvZwIEDWdeuXZler7ftozO9v4Q0R0FBAfPy8mIzZsxgiYmJLDk5mT377LNMIBCwxMRExphr552kaZ544gkWFBTEdu7cyS5cuMAWLlzIfH19WXFxMWOMXntKgDcCAKf/Vq9ezRhjbN++fXVuk5qa2q5td1VDx1jXYzpLAtzV41uxYgULDg5mUqmUxcXFsYMHD7ZPg5vAlWO8ePEimzFjBvP19WVSqZT17duXff/99+3XaEIaiT7nTXffffexsLAwJhQKmY+PD7v55pttyW/GGKusrGSPPvooU6vVTCqVsv/85z8sJyenHVvccdT32rnDOQBpOfPnz3f6Wdi3bx9jjLE///yT9e/fn8nlciaTyVi/fv3YF198wSwWi91+9u3bx/r378+EQiGLjIys93ystTV0TK+88orT9WFhYbZ9vPPOOywqKoqJxWLm6enJRo8ezfbu3ds+B8QaPibGGEtLS2OTJk1iEomEeXt7s2eeeYaZTCa7/XSk96ku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iHd8umXLlnbv87///Q/z589HbGwshEIh0tLS8Mwzz7ToM6dNm4YhQ4a0O4YFgLKyMixYsABSqRSRkZG4//77W/zeJ4SQzti5cydGjx4NkUiEtLQ0vP322632i4GM35r6tYMHD2LKlCmQSCR47LHHvL/F//3vf+P1119HamoqJBIJZs2ahdLSUrAsi2eeeQbx8fEQi8W44ooroNVqfa4dzL7VZDJBKpXi3nvvbfF5lJWVgcvlYs2aNV39aEk3oBTopF3V1dUYP368dzAXERGBzZs345ZbboHBYMB9993Xoes9/fTTWLNmDW699VaMHTsWBoMBBw4cwKFDh3DJJZcAAH755RcUFBTgpptuQnR0NE6cOIF33nkHJ06cwJ49e1p0qE2uvfZa3Hjjjdi/f7934hMAiouLsWfPHrz00kveY2+++SYGDx6Myy+/HDweD99//z3uvvtueDwe/OMf//Ce9+STT+LZZ5/FvHnzMG/ePBw6dAizZs2Cw+Fo8TlNnDgRFosFy5cvR1hYGDZu3IjLL78cX331Fa688kqf85955hkIBAKsWLECdrudUgcTQgAE1ue+++67WL58Of72t795gylZWVnYu3cv/v73v+Oqq67C6dOn8emnn+KVV15BeHg4ACAiIgIAcOutt2Ljxo3429/+hgcffBB79+7FmjVrcOrUKWzatMmnPXl5efjb3/6GW265BUuWLMEHH3yApUuXYtSoURg8eLDf9/Hll1/CYrHgrrvuQlhYGPbt24d169ahrKwMX375Zfd9gISQPq+9fnLRokVYvXo1nnzySdx+++2YPHkyAGDixIneazQ0NGDOnDm46qqrcM011+Crr77CI488gqFDh2Lu3Ll+771t2zbMnTsXqampePrpp2G1WrFu3TpcdNFFOHToEJKTk33Ov+aaa5CcnIw1a9Zgz549eO2119DQ0NBiIVFzBQUF+Pbbb3H11VcjJSUF1dXVePvttzF16lScPHkSsbGxXfsACSEXvDvuuANxcXF47rnnsHz5cowZMwZRUVH4+OOP4XK5MHv2bEyaNAn//ve/IZFIAHRsbOd2uzF79myMGzcO//73v7Ft2zb83//9H9LS0nDXXXd5z7vllluwYcMGzJ07F7feeitcLhd27dqFPXv2eBev/+tf/8ITTzyBa665Brfeeitqa2uxbt06TJkyBYcPH+72Uj+E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r68v0dHRTJkyhczMTKd9tJW6isY5l86D1krOT89r6Dw41V133YVKpeLdd991Wt5S34EEwBuQmZnJuHHj6NSpE+vXr+eXX35h9+7d3HLLLbW2nT9/PllZWY5/V155Zb37vummm9i9ezfLli3jhx9+YPXq1dxxxx3NU5ET3KnP5s2bCQ8P55NPPmH37t089dRTTJ8+nffff7/B/b/44otOx+C+++5rxtq4Vx+bzcbEiRMxm82sWbOGhQsXsmDBAp599tl69+2J7wfg0ksvxWq1smLFCjZv3kzfvn259NJLyc7OBuD66693OsZZWVmMHz+eUaNGER4eXu++W/r7cac+NdrC+XOuGD58eK3f2N///ncSExMZNGiQY7sHHniAjz76iDfffJN9+/axZMkShgwZ4sGStz7uHkuovkibNGkSI0eO9FBpWy93juOaNWvo06cPX3/9NTt27GDatGlMmTKFH374wcOlF6L1a87rKeGe5rpeEu5p6PjL77/x9u3bh91uZ/bs2ezevZt33nmHDz/8kH/+85+1tl2+fLnT73rgwIF17tcT34U7dTmb65CWOq/dqUdJSQkXXXQRCQkJbN68mTfeeIPnn3+eOXPm1LlfT3wnZrOZa6+9lrvvvtvl+rZ0z9xQXWrI/bJoqwoLCxkxYgReXl78/PPP7Nmzh7feeougoCDHNq+//jr//ve/+fDDD1m/fj2+vr6MHz+eqqoqD5a88V577TVmzZrF+++/z969e3nttdd4/fXXmTlzpmObtlzX8vJy+vbty//93/+5XO9O3dpK21RfXSsqKtiyZQvPPPMMW7Zs4ZtvvmH//v1cfvnlTtu1lbqKxjmXzoPWSs5Pz2voPKjx7bffsm7dOqKjo2uta7HvQBH1mj17thIeHq7YbDbHsh07diiAcvDgQccyQPn222/d3u+ePXsUQNm4caNj2c8//6yoVColIyOjScruirv1Od0999yjXHDBBfXuOyEhQXnnnXeaqqhucac+P/30k6JWq5Xs7GzHNrNmzVKMRqNiMplc7tdT38/x48cVQFm9erVjWUlJiQIoy5Ytc/me3NxcxcvLS/n444/r3bcnvh9369NWzp9zldlsVsLCwpQXX3zRsWzPnj2KVqtV9u3b58GStT2ujmWNxx9/XLn55puV+fPnKwEBAS1fuDakvuN4qksuuUSZNm1aC5VKiLar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6CP69etXZ3r0+rTE99PY+pxatpY8f84VjTmvasyfP5+QkJBao3CioqLQarV06dLFsax79+4ApKWlNfo31dY05bFcsWIFS5YscYy+URQFu92OVqtlzpw53HrrrU1a9takKY9jjd9//53LLruMd955hylTpjRVUYVokzx9PXWu8/T10rmuKY+//P5Pauzf7szMTC644AKGDx/OnDlzGtx/cnIyy5Ytq3N9U34XzVGXs70OOZPzuinrERkZ6TieNdy5d26K7+RMrgvd4Yl75uaqy6nlkvtl0VZERUXRo0cPp2Xdu3fn66+/Bk62Ezk5OURFRTm2ycnJoV+/fi1Wzqbw2GOP8eSTT3LDDTcA0Lt3b44ePcqMGTOYOnVqu6rr6dypW3trm2qCa0ePHmXFihVOGf3aW12Fe87F86C1kvPTc/744w9yc3OJj493LLPZbDzyyCO8++67pKamtuh3cM4GwMPCwggLC2vUe2rSV/znP//B29ubCy+8sM5tt23bRlBQUJ03rcOGDaOoqIjNmzc7bsRWrFiB3W4nOTm5UeWCpq/P7t27GTNmDFOnTuXll19udHmg+hjUpBBsrKasz7Bhw3j55ZfJzc11lGXZsmUYjcZaF+E1PPX9VFRUANQabaVWq7Hb7U7LysrK+PLLL5kxY0ajywMt8/00pj6nl60lz59zRWPPK0VRmD9/PlOmTMHLy8tp3YgRI7BarRw+fJiOHTsCOOa5SkhIaLpCt1JNeSzXrl2LzWZzvP7uu+947bXXWLNmDTExMU1W5taoKY8jwKpVq7j00kt57bXXuOOOO5qyqEK0SZ6+njrXefp66VzXlMdffv8nNaZdycjI4IILLmDgwIHMnz/frYwS27Ztc3pgeLqm/C6aui5NcR1yJud1U9Zj2LBhPPXUU1gsFse11rJly+jatWudU3I11XdyJn+zGuKpe+bmqMup5H5ZtCUjRoyolSXuwIEDjucGiYmJREZG8ttvvzkCRCUlJaxfv5677767pYt7VioqKmq1qxqNxnE90Z7qejp36tae2qaa4NrBgwdZuXIlISEhTuvbU12F+86186C1kvPTsyZPnsy4ceOclo0fP57Jkyczbdo0oIW/A0U0aObMmcrmzZuV/fv3K++//77i4+OjvPfee471S5YsUebOnavs3LlTOXjwoPLBBx8oBoNBefbZZx3brF+/Xuna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TwuWSgghWpeG2kohhDhXSfsohBBCCCHamqqqKnQ6HWq1jFsTQjQvnU7n6SK0W1qtFq1Wwq+eJn9JRat1+pwUNXNGLF26lEGDBuHj48Ps2bMBmD9/PmPGjCE8PBy9Xk+PHj2YNWtWrX3W7OPPP/9kyJAheHt7k5SUxMcff9ySVRNCiCZzalvZoUMHdu/eze+//45KpUKlUjnm8ikoKODRRx+ld+/e+Pn5YTQamTBhAtu3b693//Pnz0elUrF169Za61555RU0Gg0ZGRnNUTUhhDgrp19Lfvfdd0ycOJHo6Gj0ej0dO3bkpZdewmazOb1v9OjR9OrVi82bNzN8+HB8fHxITEzkww8/dNrObDbz7LPPMnDgQAICAvD19WXkyJGsXLnSabvU1FRUKhVvvvkmc+bMoWPHjuj1egYPHszGjRub9RgIIcSZOHr0KJ06daJXr17k5ORQVFTEgw8+SFxcHHq9nk6dOvHaa69ht9sd73G3rWvMteUff/zBtddeS3x8PHq9nri4OB566CEZTSOEaJVObzuPHDnCtddeS3BwMAaDgaFDh/Ljjz86vWfVqlWoVCo+//xznn76aWJiYjAYDJSUlACwfv16Lr74YgICAjAYDIwaNYq//vqr1ufec889dO3aFR8fH0JCQrj22mtbzUhKIUTr5WoOcJPJxHPPPUenTp0c11+PP/44JpOp1vs/+eQThgwZgsFgICgoiPPPP9/liPL6YjELFizg2muvBeCCCy5wPM9ctWqVY5uff/6ZkSNH4uvri7+/PxMnTmT37t1On3HLLbfg5+dHRkYGV155JX5+foSFhfHoo4/Wuuf//PPPGThwIP7+/hiNRnr37s17773XpOVxNQe4SqXiH//4B4sXL6ZXr17o9Xp69uzJL7/8UuuYiaYhXRBEm7J//34mTZrEnXfeye23307Xrl0BmDVrFj179uTyyy9Hq9Xy/fffc88992C327n33nud9nHo0CGuueYabrvtNqZOncp//vMfbrnlFgYOHEjPnj09US0hhGgS7777Lvfddx9+fn489dRTAERERABw5MgRFi9ezLXXXktiYiI5OTnMnj2bUaNGsWfPHqKjo13u85prruHee+/l008/pX///k7rPv30U0aPHk1MTEzzVkwIIZrAggUL8PPz4+GHH8bPz48VK1bw7LPPUlJSwhtvvOG0bWFhIZdc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jaZWb8JFixaRkZHh1n779OlDnz59+Oijj/j666+54YYb3OrZKIQQrYGr60Wz2cwHH3zgcnur1crs2bOdtp09ezZhYWEMHDiwzn2uX7+etWvXNnn5hRCiualUKubMmcM111zD1KlTWbJkCQDXXXcda9euZenSpbXeU1RUhNVqPaPPa+ja0lUbqygK77333hl9nhBCNIe62s5LLrmEDRs2OF0XlpeXM2fOHDp06NBg2uCBAwfSsWNH3nzzTcrKymqtP378uOP/Xd3rz5w502naMyGEcMd1111HRkYGc+fOrbWusrKS8vJyAK688krUajUvvvhirUwTZzKSuabj+enPM8ePH4/RaOSVV15xmnKsxqltobvy8/OdXqvVavr06QOAyWRq8fKI5iVPrkWbd9FFFzl67dx5552UlZUxd+5cwsPDycrK8nTxhBCiRQ0cOJBZs2bxr3/9i06dOhEeHs6YMWO49NJLefHFF5k2bRrDhw9n586dfPrppyQlJbm97ylTpvDoo48CSPpzIUSbMnz4cIKCgpg6dSr3338/KpWK//73v3XenEdHR/Paa6+RmppKly5d+OKLL9i2bRtz5szBy8sLgEsvvZRvvvmGv/3tb0ycOJGUlBQ+/PBDevTo4fJBpRBCtHZqtZpPPvmEK6+8kuuuu46ffvqJxx57jCVLlnDppZdyyy23MHDgQMrLy9m5cydfffUVqampbmUTcqW+a8tu3brRsWNHHn30UTIyMjAajXz99dcyP6IQotVx1XY++eST/O9//2PChAncf//9BAcHs3DhQlJSUvj6669Rq+sfk6ZWq/noo4+YMGECPXv2ZNq0acTExJCRkcHKlSsxGo18//33QPU16X//+18CAgLo0aMHa9euZfny5YSEhLRE9YUQ7cjkyZP58ssvueuuu1i5ciUjRozAZrOxb98+vvzyS5YuXcqgQYPo1KkTTz31FC+99BIjR47kqquuQq/Xs3HjRqKjo5kxY0ajPrdfv35oNBpee+01iouL0ev1jBkzhvDwcGbNmsXkyZMZMGAAN9xwA2FhYaSlpfHjjz8yYsQI3n///UZ91t///ncKCgoYM2YMsbGxHD16lJkzZ9KvXz+6d+/e4uURzUsC4KLN69q1K1999RVPP/00jz76KJGRkdx9992EhYVx6623erp4QgjRop599lmOHj3K66+/TmlpKaNG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fdY333yD5cuXY8+ePeByuXj99dfx5Zdf4l//+hfi4+O7bNeOHTtwzTXXIC4uDitXrkRsbCxOnDiBTz/91D94+tVXX2HhwoVIS0vDU089BZvNhr/97W+YNWsWDh482OmGkRBCQtWXvtFms+GSSy5BeXk5HnroIaSmpuLDDz/EXXfdBb1e3ynw8/bbb8Nut+NnP/sZhEIhNBpNyP1afX098vPzodfr8bOf/QxZWVmoq6vDli1bYLVaIRAIYDabMWfOHJw4cQJ33303pk2bhtbWVnzyySeora3F/7N33+FRVekfwL93+mT6pPeEEAIJhBKqSBERbCiKnRVU1oquyrqr7G/tq1jWtorYARUsKCBWFKVJJxBIKIGE9J7MZCbT2/39MWTIJDOTSQ/h/TxPnse599w7Z4I5c+99z3nfsLCwDveZEEKAzo2R1113Hb766iu8/vrr4HK5nnN98cUXYFkW8+fPB+CeWL5x40bceOONSE5ORk1NDd5//31MmzYNx48fb3P9+NJLL4HD4eCxxx6DTqfDK6+8gvnz52Pfvn1e7bRaLa6++mrccsstuPHGG7FixQrccsstWLNmDR555BHcd999uO222/Dqq6/ihhtuQFlZGWQyGYDgnge09MADDyA8PBxPPfUUrawkZAC76aabkJycjGXLluHQoUP46KOPEBERgZdffhkA8MILL+DJJ5/ETTfdhL/+9a+oq6vD22+/jalTp+Lw4cNQKpX4v//7P+h0OpSXl3sW1EilUq/3CWac++OPP3DFFVcgKysLTz/9NDgcjid4vXPnTowfP97rnDfeeCNSU1Px4osvgmVZv59xxYoVyMjIwDXXXAMej4fvv/8eDzzwAFwuFxYvXuzVtqCgADfccAMWLVqEhQsX4pNPPsEdd9yBrKwsZGRkAACqq6txySWXwOFw4IknnoBEIsEHH3wAsVjsda7a2lrMmjUL4eHheOKJJ6BUKlFcXIz169d38F+JEHI+aW9cbS2Ye96OxoR83acHew6Xy4U5c+Zg//79uP/++zF06FB89913WLhwYZd+LxQTOg+whHSDp59+mgXA3nPPPZ5tDoeDjYuLYxmGYV966SXPdq1Wy4rFYnbhwoWedlar1et8Wq2WjYyMZO+66y6v7QDYp59+2vPaZDK16cuePXtYAOynn37q2fb++++zANgTJ054ttlsNjYsLMzT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JyfjzTffbPNgsXksjo6OxqhRo7B69WqvNnl5efj1119x5ZVXdu1DEkJIB1155ZWorq7GV1995dnmcDjw9ttvQyqVYtq0aQGPD3Zc43A4mDt3Lr7//nscPHiwzXmax8l58+bhyJEj2LBhg982Xe0zIYR01O23345ff/0Vb775JkJDQ9tMAPd1771u3TpUVFT0Zje9dOR5ACGEAMD1118PLpeLZ599ts34wbIsGhoaPK8lEkmX0thmZWUhJSUF//3vf2EwGNrsr6ur69R5fT1H1el0XQq6XHnlldi7dy/279/v1b81a9Z4tdNqtW1+b82r2ykNOiGkWTD3vF2JCTUL9hyzZ8+G3W73el7qcrmwfPnyNudMSUnByZMnvcboI0eOYNeuXW3em2JC/R+tACd97uqrr8b69etx3XXX4aqrrkJRURHee+89pKen+7xAbH3sZ599BoVCgfT0dOzZswdbtmxBaGioz/YLFizA//73P2zduhUvv/yy176mpibExcXhhhtuwMiRIyGVSrFlyxYcOHDAa0Z5a1dddRVef/11XH755bjttttQW1uL5cuXY/DgwTh69GjHfyGEENJJt99+O77++mvcd9992Lp1KyZPngyn04mTJ0/i66+/xubNmzF27Fj88ccfePfdd/H0009jzJgxANwzFKdPn44nn3wSr7zyis/zczgcrFixAnPmzMGoUaNw5513Ijo6GidPnsSxY8ewefNmAO4Ub1dccQUmTZqERYsWwWw24+2334ZCocAzzzzTW78OQggBANxzzz14//33cccddyA7OxtJSUn45ptvsGvXLrz55puQyWTtniPYce3FF1/Er7/+imnTpuGee+7BsGHDUFVVhXXr1uHPP/+EUqnEP/7xD3zzzTe48cYbcddddyErKwsajQabNm3Ce++9h5EjR3ZLnwkhpCNuu+02/POf/8SGDRtw//33g8/ne+2/+uqr8dxzz+HOO+/ERRddhNzcXKxZswaDBg3qox53/HkAIYSkpKTgP//5D5YuXYri4mLMnTsXMpkMRUVF2LBhA+655x489thjANwB7K+++gpLlizBuHHjIJVKMWfOnKDfi8Ph4KOPPsIVV1yBjIwM3HnnnYiNjUVFRQW2bt0KuVyO77//vsOfYdasWRAIBJgzZw7uvfdeGAwGfPjhh4iIiEBVVVWHzwcA//znP/HZZ5/h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JiZixYoVqKiowOrVqzF69GgcOXLEpRFps9mQmJiI0aNH4/XXX4dUKq23zO+88w5uuOEGzJo1CxaLBd988w1uueUW/Prrr5g6dWqL3xNCCKmtsbry3nvvxbp163DzzTfjiSeewP79+5GUlIQzZ87UaaClpKRg5syZuP/++3Hfffehd+/eYIzhp59+gl6vh1KpBGMMe/bsAZfLxb///osbbrgBAPDvv/+Cy+XiyiuvBABcvHgRmzdvxi233ILY2FgUFBTgo48+wlVXXYXTp08jLCwMcrkc06dPx7fffos333wTPB7PWZavv/4ajDHnoCNCCGmuW2+9FTExMUhKSsK+ffvw7rvvoqyszBm4Xr16Nfr164cbbrgBfD4fv/zyCx566CE4HA7Mnz/f5Vypqam4+eabcc8992D27Nn4/PPPMWfOHAwbNgz9+vUD4Fn9V1NSUhIkEgmeeeYZpKamYtWqVRAIBOByuSgrK8OyZcuwb98+rF27FrGxsXj++eedP9uUshNCSG3erB/dtSObco7Fixdj5cqVuP7665GYmIhjx44hMTGxRcHntWvXQi6XY+HChZDL5fj777/x/PPPQ6/X47XXXgMA3HnnnXjhhRfw7bff4uGHH3b+rMViwQ8//IAZM2ZALBY3uwyEkM6rsTq0pc/iX3zxBe69916MHDkS8+bNAwB07969yeWcM2cOvvvuO9x555244oorsHPnTrd9lAcPHsR///2H22+/HREREUhPT8fq1asxbtw4nD59usH+UEIIaQlv1qc16fV6fPrpp5g5cybuu+8+GAwGfPbZZ0hMTMSBAwcwePBgl+O/+uorGAwG3H///eBwOFi5ciVuuukmXLx40ZmJ+M8//8SMGTPQt29fJCUloaSkBHPnzkVERESrvT+kjTBC2sDSpUsZAHb33Xe7bJ8+fTrz9/d3vo6OjmazZ892vn7kkUcYh8NhR44ccW4rKSlhGo2GAWBpaWmMMcYMBgNTq9Xsvvvuczl/fn4+U6lULttnz57NALBnnnmmTjlnz57NoqOjXbZVVFS4vLZYLKx///5swoQJntw6IYR4zJO68ujRowwAu/fee12OefLJJxkA9vfffzu3RUdHMwBs69atLscePHiQAWC//fYbY4yx48ePMwDslltuYfHx8c7jbrjhBjZkyBDna5PJxOx2u8u50tLSmEgkYi+88IJz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LIZQKMT111+P+++/H+Xl5fjkk08QFBSEvLy8Zl2vqfVfc11zzTVeLzshpGtp7frR03oqODgYCxYswBtvvOEsz7Fjx/D7778jICDAZcbONddcg6ioKNxzzz146qmnwOPx8Pnnnzuf6auNGjUKfn5+mD17Nh599FFwOBx88cUX9aawFAgEuP322/Hee++Bx+Nh5syZzXxXCSFdRUN1KACvPIsPGzYMf/31F958802EhYUhNjYW8fHxuP3227Fo0SJMnz4djz76KCoqKrB69Wr06tULhw8fdvn5GTNm4O2330ZJSQmuuOIK7Ny5E+fOnQPgOsP8uuuuwxdffAGVSoW+ffti7969+Ouvv+Dv7+/Fd40QQupqrfr0uuuuw8aNGzF9+nRMnToVaWlp+PDDD9G3b1+Ul5c3q6xJSUmYOnUqRo8ejbvvvhulpaVYtWoV+vXr1+xzkvaBZoCTdi0yMhI7duxAnz598Morr+Dtt9/G7NmzcffddwMAxGKx89g77rgD27dvR3h4OF577TUsWLAA33zzDQYPHoy5c+c26/oTJkzAZ599hvz8fDz22GP4+uuvsWLFCkyfPt0r90cIIc3x6aefYvny5Th48CAee+wx/P3331i8eDG++eabJp2nOsA9evRo57aQkBD06NHDZX+1//u//8MTTzyBP/74AwsWLMDhw4exZcsWREZGuj1/cHAwrrnmGgBVs8EJIcRbvv32W4hEIjzzzDPYsmULHn74YWd68t69e+OHH34Ah8PBk08+iQ8//BDz5s3DggULmn29ptZ/zdUaZSeEdC2tXT825RwrVqzAkiVLcPDgQTz55JNITU3Fn3/+CcaYy7O8QCDApk2b0L17dyxZsgTvvvsu7r33Xjz88MMu5/P398evv/6K0NBQPPfcc3j99ddx9dVXY+XKlfWW96677gJQNSM9NDTU4/skhHRNDdWhgHeexd98800MGzYMzz33HGbOnOnMlOHv749NmzZBKpXi6aefxrp165CUlITrr7++zjnWr1+P+fPnY8uWLVi0aBEsFgu+/fZbAK59pe+88w7uuusubNiwAU888QTy8vLw119/QS6XN/ctIoQQj7RWfTpnzhy88sorOHbsGB599FH88ccf+PLLLzF8+PBml3Xy5Mn4/vvvYbfbsXjxYmzcuBFr1qxp0TlJ+8BhtNo76YAee+wxfPTRRygv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DMTLL7/cia1u2s8//4z4+HhIpVJoNBrMmjXL6nl7+7pt27bOaWwzmtuX7tTHhYSE2Bz3devWWZ5PTU21+//m4MGDndhq+5rbF6B7fWdIzzFjxgwEBQVBIpHA19cXd955J7Kzs63W6Y2fzdTUVCxatAihoaGQSqUIDw/HypUrYTAYrNbrjcfGVfdvCOlNmrsndtddd9mcJ0ydOrVzGtsJKEbRPGeO0fjx420+R/fee28ntbhtKADeRX3xxRdYtmwZVq5ciePHj2PQoEGYMmUK8vPzO7tp3VJlZSUGDRqEd955x+7zL7/8Mt5++228++67OHToEORyOaZMmYKampoObmn3tHfvXtx///04ePAgdu7cidraWkyePBmVlZWWdR599FH8+OOP2L59O/bu3Yvs7GzceOONndhq0hMZDAbMmTMH9913n93nTSYTpk+fDoPBgP3792PLli3YvHkzVqxYYVknJSUF06dPx4QJE5CYmIhHHnkEd999N3bs2NFRu+ESPfV3xBX9+e23344zZ85g586d+Omnn/DXX39hyZIlHbULreKKftaZzz8hzrruuutgNBrxxx9/4NixYxg0aBCuu+465ObmAgCOHTsGLy8vfPrppzhz5gyeffZZLF++HP/3f//XyS13jeb2vyd/30aNGoWcnByrv7vvvhuhoaEYNmwYgLrf0pkzZ2LixIlITEzEjh07UFhYSOd+xIozn6WysjJMnjwZwcHBOHbsGF555RWsWrUK77//fie33tbXX3+NO++8EwsWLMCJEyewb98+3HbbbTbrbdq0yWqfGweWu4Lm9qU79nFr1qyxOu4PPvigzTq7du2yWic2NrYTWtq8pvalO31nSM8yYcIEfPnll0hKSsLXX3+NS5cu4aabbrI831s/m+fPn4fZbMZ7772HM2fO4I033sC7776LZ555xrJObz02rrh/Q0hv09w9MQCYOnWq1XnC559/3oEt7FwUo2ieM8cIABYvXmz1Oeq2A7MY6ZLi4uLY/fffb3lsMpmYn58fW7t2bSe2qmcAwL799lvLY7PZzHx8fNgrr7xiWVZaWsrEYjH7/PPPO6GF3V9+fj4DwPbu3csYqzueQqGQbd++3bLOuXPnGAB24MCBzmom6cE2bdrEVCqVzfJffvmF8Xg8lpuba1m2ceNGplQqmV6vZ4wx9uSTT7KYmBir191yyy1s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P/wwampqLOulpqaC4zhs3rzZZhscx2HVqlVWy7KysrBw4UJ4e3tDLBYjJiYGH330kdU6e/bsAcdx2LZtG5577jn4+/tDJpPh7bffxpw5cwAAEyZMAMdx4DgOe/bssbx2w4YNiImJgVgshp+fH+6//36nRmDW7+/Zs2dx2223QaPRYPTo0VbPNfbpp58iLi4OMpkMGo0GY8eOxe+//261TmvbQwghjvql8ePHY/z48Tbr26vBs23bNsTGxkKhUECpVGLAgAF46623LM/X1tZi9erV6NOnDyQSCTw8PDB69Gjs3LnTph0Nbdq0CRMnToSXlxfEYjGio6OxceNGl+4/IYTY46hv5DgOJ0+etKz39ddfg+M43HjjjVav79evH2655RbLY2f7s5CQEFx33XX4559/EBcXB4lEgrCwMHz88cc26545cwYTJ06EVCpFQEAA/vOf/9gdyPn9999j+vTp8PPzg1gsRnh4OF544QWYTKa2HCJCSAcqLy/HI488gpCQEIjFYnh5eeGaa67B8ePHLev8/fffmDNnDoKCgiAWixEYGIhHH33UZqahvXMujuPwwAMP4LvvvkP//v0t19C//fab1eueeOIJAEBoaKjlOtmZrGnHjh3DqFGjIJVKERoainfffdfqeYPBgBUrViA2NhYqlQpyuRxjxozBn3/+abVe/X2BV199FW+++SbCw8MhFouxYcMGDB8+HACwYMECS9sa3z84e/YsJkyYAJlMBn9/f7z88ss2bdXr9Vi5ciUiIiIsx/HJJ5+EXq9vdj9LS0vxyCOPIDAwEGKxGBEREXjppZes+uaG+/DOO+8gLCwMMpkMkydPRkZGBhhjeOGFFxAQEACpVIqZM2eiuLjY8vr58+fD09MTtbW1Nu8/efJkREZGNttOQkjLdNc+ePz48ejfvz9OnjyJcePGQSaTISIiAl999RUAYO/evYiPj4dUKkVkZCR27dpl9fq0tDQsXboUkZGRkEql8PDwwJw5c2zec/PmzeA4Dnv37sXSpUvh5eWFgICAZtvcuAZ4/Xb27duHZcuWQavVQi6X44YbbkBBQYHj/0GEkG6pub618f3HhudQ77//vuU8cPjw4Thy5IjN9rdv347o6GhIJBL0798f3377rd17mq+++ipGjRoFDw8PSKVSxMbGWvrJhur76q1btyIyMhISiQSxsbH466+/bNZN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gfXr12PKlCl9XstFF12EwsJCLFq0CJs3b8Yrr7yCtLQ0PPbYY0P5FRBCSK9j4bx58yCKIlauXIkFCxYAiCQu8jyPFStWRM+xZcsWuFwunHjiidHHkp1D3n///XjkkUdw9tln4+yzz8bmzZtx+umnIxAIxFynx+PBSSedhPr6elx33XXIy8vD6tWrce+996KxsRFPPvlkzPHvvvsunE4nrrvuOnAch7///e84//zzceDAgZj5KyHk2DNU415X559/Pvbt24f//Oc/eOKJJ5CamgoAMJvNuO666zB//vyY47/66iu88847SEtLAxBJIvr5z3+OlStX4re//S3GjRuHHTt24IknnsC+ffvw8ccfx7z++++/xwcffICbbroJqampKCgoSHhdGzZswOrVq3HJJZcgJycHVVVVeP755/Gzn/0Mu3fvhkqlijn+5ptvhtFoxAMPPICqqio8+eSTuOmmm/D+++9Hj0l2HCeEkL70Nj5fccUV+Mtf/oL3338fN910U/Q1gUAAS5cuxa9+9auYyhdlZWW49NJLcd111+Haa6/FmDFjEr7ngQMH8PHHH+PCCy9EYWEhmpub8eKLL+Kkk07C7t27kZWVNeSfmxBy7Oltrvj8889jwoQJ+PnPfw6JRILPPvsMN954I0RRxO9+97uY8yQTj3nrrbfi3v9Pf/oTWlpaoNFoAADffPMNDhw4gKuvvhoZGRnYtWsXXnrpJezatQtr164Fx3Exrx/IOiaNt0c5Rsgg0+v17He/+12Pz1911VUsPz8/+vPHH3/MALBHHnkk5rgLLriAcRzHysvLGWOMlZWVMQDs6aefjjnuxhtvZBqNhnk8HsYYYytWrGAA2DvvvBNz3FdffRX3eH5+PgPAfvrpp+hjLS0tTC6XszvvvDP62PLlyxkAtnz58uhjne/X1aJFixjHcay6urrHz08IIYeirzH2pJNOYgDYP//5z+hjfr+fTZkyhaWlpbFAIMAYYywUCjG/3x/zWqvVytLT09k111wT8zgA9sADD0R/fuCBBxiAuOPOO+88lpKSMtCPRgghSettLAyHw0yn07Hf//73jDHGRFFkKSkp7MILL2SCIDCn08kYY+xf//oX43meWa1Wxljyc8iWlhYmk8nYOeecw0RRjB533333MQDsqquuij728MMPM7Vazfbt2xdzznvuuYcJgsBqamoYY4xV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odPp8N///peyxQkhQyrZMTYrKwuPPfYYqqqqMHr0aLz//vvYunUrXnrpJUilUgDAggUL8OGHH+K8887DOeecg8rKSrzwwgsYP348XC7XcH1EQgjpU7Jj4bx58/Doo49Cr9dj4sSJACILkmPGjEFZWRkWLlwYc95k55Bmsxl33XUXFi1ahAULFuDss8/Gli1b8OWXX8ZlgN9999349NNPsWDBAixcuBClpaVwu93YsWMHli5diqqqKsoaJ4T0aajGvUQ6kyX/+Mc/4pJLLoFUKsW5556LW265Ba2trfj973+P9957L+Y1kyZNwqRJk3DFFVfggw8+wPXXX4/ly5dj7ty5CIfD2Lt3Lz744AMsW7YM06dP7/fnX7BgAd566y3o9XqMHz8ea9aswbfffhvTf7w/+jOOE0JIb5Idn6VSKS655BI888wzEAQBl1566SG974IFC/CXv/wFV199NebMmYMdO3bgnXfeialqQQghQyHRXPHEE0+ETCbDueeei+uuuw4ulwsvv/wy0tLS0NjY2O/3aGtrw4033ojx48dDLpfj7bffjnn+vPPOg06nw4knnoi///3vCAaDyM7Oxtdff43KyspB+ZydaLw9ulEAnAwqlUqFG2+8EV9//TU+/PBDiKKIkpISPPfcc7jhhhsSvobneXz66ae4//778f7772Px4sUoKCjA448/jjvvvDPu+JycHMyZMwerVq3C//3f/0WDOV298MILKC0txYsvvoj77rsPEokEBQUFuPzyyzF37txD/pxSqRSfffYZbrnlFixatAgKhQLnnXcebrrpJkyePPmQz08IIYkkO8YajUa88cYbuPnmm/Hyyy8jPT0dzzzzDK699troMQsXLkRTUxNefPFFLFu2DOPHj8fbb7+NJUuW4IcffhiGT0cIIclJdizsDATNmTMHPM/HPF5WVpawD26yc8hHHnkECoUCL7zwApYvX45Zs2bh66+/xjnnnBN3rT/++CP+9re/YcmSJXjzzTeh0+kwevRoPPTQQ9Dr9UPwDRFCRpqhHPe6mzFjBh5++GG88MIL+OqrryCKIiorK9Ha2opwOIw77rgj7jUPPPAAJk2aBJ7n8fHHH+OJJ57Am2++iY8++ggqlQpFRUW49dZbMXr06AF9/qeeegqCIOCdd96Bz+fD3Llz8e233+KMM84Y0PmA5MdxQgjpTX/WQa+8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4u655x488cQTA+5z4MABFBYWAgDuuusu3HDDDaivr8e6detwzTXX4OOPPx43142hHg8ANDc3Y/ny5bjkkktw4403jnYTh2w4x0QIIWT8ueWWW7B3796wGlaTWUFBASorK2E2m/Hee+9h1apV+O677+LdLDKFBQIBlJeX47HHHgMAzJ49G3v37sVLL71EAfAT8I9//ANvvfUW3n77bRQVFaGyshJ33HEHDAYDnVdCSETR+ggzZszATTfdFNqvuLgYer0eS5YsQU1NDXJzc+PY6vGpsbERt99+O7788kuIxeJ4N2dSiOWc0ud04plqY7GRQOO54aHr8vD1zSBVUlKCiooKZGZm4h//+AckEsmIvQ8FwPuQyWTIy8tDXl4e5s+fj/z8fLz22mtYu3ZtvJs2ov773/+io6MDGRkZoW1+vx933nknnnnmGdTV1cWvcWMkJycHOp0O1dXVkyoArtPpwOfzQ7Npe02fPp3+6BPceeeduPbaawfcJycnJ/R/nU4HnU6HadOmYfr06UhPT8fmzZuxYMECpKSkoL29Pey5vT+npKSMeNsjGerxtLS04LTTTsPChQvxyiuvhO03Ho4HGPoxDSQlJQVbt24N2xaPY4qFTqcDj8eL+DsYb20djt5jaG9vh16vD21vb29HaWlpnFpF4mGyf9ZjNdm/E7feeis+/vhjfP/990hLSwttT0lJgcfjgclkCpvJPBl+/0KhEHl5eQCAsrIybNu2DX/4wx9w2WWXTdpjJuObXq+POCb65z//GacWTQ533XUX7rnnntAE8+LiYtTX12P9+vUUAB8hk/1vJJl6ovURXn755X77VlRUAAhmbaPAYn87duxAR0cH5syZE9rm9/vx/fff4/nnn8fnn39O/a4hGuycut3ufplD6XM6vk3FsdhIoPHc8NB1eeSo1WpMmzYN1dXVOOOMM0bsvFEN8AEEAgG43e54N2PEXX311di9ezcqKytD/wwGA+666y58/vnn8W7emGhqakJ3d3fYgHIyEAqFmDt3LqqqqsK2Hzp0CJmZmXFqFRkvEhMTUVhYOOC/vjWw++rNLtB7TVywYAG+//57eL3e0D5ffvklCgoKxixd+FCOp7m5GaeeeirKysrw+uuvg2XD//yNh+MZ6jENZsGCBdizZw86OjpC27788ksolcp+N4TjTSgUoqysDF9//XVoWyAQwNdf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ESNGoNVqycjI4Fe/+hWNjY3xc7766itkMhnvvvtuu8/56quvIpPJ+P777w/7XQlDSznUDRCOLBdccAF79uzhtdde47HHHiMlJQWA1NRUoDlw/M477/C73/0Ok8nE//3f/3HhhRdSVlZGcnIyAGvXrmXlypVccskl5OTkUFJSwrPPPstJJ53Ejh070Ov1PWrTE088wbnnnssvfvELQqEQr7/+Oj/96U/54IMPOOussxLO7U77tm7dymmnnUZqair3338/kUiE++67j/T09L5+fYIgHEEO1x925IYbbiAjI4OFCxeyatUqXnjhBSwWCytXriQvL4+HH36Yjz76iL/+9a9MnDiRBQsWAM0BlnPPPZevvvqKq666imOOOYZPP/2U2267jcrKSh577LGE+3z55Ze8+eabXH/99aSkpHQ4aAWora1lzpw58QFramoqH3/8MVdddRVut5ubbroJgH/+85/ceOONXHTRRfz+978nEAiwZcsWVq9ezaWXXnrY7+LPf/4z9957LxdffDG//vWvqa+v58knn+SEE05g48aNWCyWPvw/IQjC0e6KK67gzTff5Je//CVz5sxhxYoV7caA0PMx6A033IDVauW+++6jpKSExx9/nOuvv5433ngjfs6f/vQnHnroIc4880zOPPNMNmzYwGmnnUYoFEq41oEDB3jvvff46U9/SmFhIbW1tTz//POceOKJ7Nixg6ysrIH5cgRBEIbAPffcw8MPP8zzzz/P1VdfPdTNEQRB6Bdd9W0PPvggarWaW2+9lWAwiFqtZseOHX0a/0WjUebPn8/s2bP529/+xrJly/j73/9OUVERv/3tb+PnXXvttSxZsoQrr7ySG2+8keLiYp566ik2btzId999N2yy0wmCcGTqaA6yJ+URP/zwQ372s58xadIkFi1ahMPh4KqrriI7O7vXbfr88885cOAAV155JRkZGWzfvp0XXniB7du3s2rVKmQyGSeddBK5ubksXbqU888/P+H9S5cupaioiLlz5/a6DcIgkQShn/31r3+VAKm4uDjhOCCp1Wpp37598WObN2+WAOnJJ5+MH/P5fO2u+f3330uA9PLLL8ePffXVVxIgffXVV/Fjl19+uZSfn5/w3kOvFwqFpIkTJ0qnnHJKr9p33nnnSVqtViotLY0f27Fjh6RQKCTxT0oQhLY66w/z8/Olyy+/PP56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yiuZN28eW7duZenSpQk7xwVBEIab7vTDh5ozZw7vv/8+Z555JhdddBHvvfceKpVqkFsuCILQucHq2wZj/HfiiSdy7bXXsmjRIjZt2sRpp52GSqVi7969vPXWWzzxxBNcdNFF/XY/QRCODr3pJ9sym8389Kc/5cknn0Qmk1FUVMQHH3zQrh43NJeL+MlPfsKxxx7LlVdeicPh4KmnnmLixIkJQfHuXjMpKYkTTjiBv/zlL4TDYbKzs/nss88oLi7utL0LFiyI95UdLSgShi8RABf63cyZM3nwwQd57rnn+OSTT+JpJ7vriSeeQKFQsHTpUgKBAMceeyzLli2L7+DpiVNOOYUXX3yRRx55hJtuuonCwkIeffRRSkpKeh2snjx5Mp9++ik333wzf/rTn8jJyWHhwoVUV1eLALggCAn62h92l1wu57///S9/+tOfeOONN1i8eDEFBQX89a9/5ZZbbun1ddPT01mzZg0PPPAA77zzDs888wzJyclMmDCBRx99NH7etddey9KlS/nHP/6B1+slJyeHG2+8kXvuuSd+TmffhcFg4M4772T06NE89thj8Zrhubm5nHbaaZx77rm9/2IEQTiiJScn8+6773LzzTdz++23U1hYyKJFi9i7d2/CQ/fLL79MRkYGr732Gu+++y6nnnoqb7zxBmPGjEGr1cbP688xaKuHHnoIrVbLc889F19Q9Nlnn3HWWWclnHf33XfT1NTEq6++yhtvvMG0adP48MMPufPOO3t9b0EQhIHW3X74UKeccgpvvvkmF154Ib/85S959dVXkctFgkJBEIaH/uzbujJY47/nnnuO6dOn8/zzz3P33XejVCopKCjgsssu49hjj+3XewmCcHTobT/Z1pNPPkk4HOa5555Do9Fw8cUX89e//pWJEycmnHfOOefw2muvcf/993PnnXcyatQolixZwksvvcT27dt7dc1XX32VG264gaeffhpJkjjttNP4+OOPycrK6rCt55xzDlarlVgsJuYpf2Bk0qF7/QVBEARBEARBEI5gmzZtYurUqbzyyiv84he/GOrmCIIgCIIgCIIgCILQTccccwypqal8/vnnA36vSCRCVlYW55xzDi+++OKA30/oP2KJrSAIgiAIgiAIR6yO6jA+/vjjyOVyTjjhhCFokSAIgiAIgiAIgiAIhxMOh4lEIgnHli9fzubNmznp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CdGvDdWx7lAct8oYVMaSoncc6R6ajN8650j3YPPy8lq9r7dy5co+bPXA0JH72311vSYB8AHm2muvZdmyZbz++uts3ryZ0047jblz51JQUADAI488whNPPMFzzz3HqlWriIqKYt68eTQ0NPRxy9vm8XiYOHEiTz/9dKvPd+ScLr/8crZu3cqyZcv46KOP+Prrr7n++ut76xSO6Ejn6PF4mD17Ng8//HCbx7j11lv517/+xbvvvsvy5cspLCzkggsu6Kkmd0p751lXV8e6deu49957WbduHe+//z47duzg3HPPjdivv/8uRcd0x3ehyZ133klycnJPN/moddc53n///RQVFYX/+8UvftEbze+Q7jjHv//971xxxRVcffXVbNy4kW+//ZbLLrust06hQ7p6nrNmzYr4HRYVFXHttdeSlZXFtGnTevNURD+0fPlybrjhBlauXMmyZcvw+/2cdtppeDyeiP2uu+66iO/QUAzepKam8tBDD7F27Vq+//57TjnlFH70ox+xdetWYGCMhXrDkT4nkO9Ta9asWcPzzz/PhAkTIrbL96p/2759O8FgkOeff56tW7fyxz/+keeee45f/vKX4X3cbjennXYaGRkZrF27lkcffZTf/OY3vPDCC33Y8r7n8/m46KKL+PnPf97q84FAgLPOOgufz8d3333Hq6++yiuvvMKvf/3rXm5p//HOO++waNEilixZwrp165g4cSLz5s2jtLS0r5smRL81VMe6Q3HcOtTHoDKWFL3hSPfQZPzWNR25B/vZZ59F7DN16tQ+aOnA095n26fXa4oYMOrq6hSNRqN89NFHEdunTJmi/OpXv1KCwaCSmJioPProo+HnXC6XYjAYlLfeequ3m9spgPLBBx+EH3fknLZt26YAypo1a8L7/Oc//1FUKpVSUFDQa23vqMPPsbnc3FwFUNavXx+x3eVyKTqdTnn33XfD23744QcFUFasWNGDre289s6zyerVqxVA2bdvn6IoA+93KTqmM9+FJv/+97+VnJwcZevWra3+bfQXnT3HjIwM5Y9//GPPNq6bdOYc/X6/kpKSorz44ou90MLu0ZXvaxOfz6fExcUp999/fw+0UAx0paWlCqAsX748vO3EE09Ubr755r5rVD/mdDqVF198cUCOhXpT0+ekKPJ9ak1NTY0yYsQIZdmyZRGfj3yvBqZHHnlEycrK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9PR0vvvuOxYvXkxRURGPP/54m69ds2YN3333HZdeeimpqank5eXx7LPPctJJJ7Ft2zbMZvNRt0cIMfjFxcW16Mf8fj+33npreJX1u+++S11dHT//+c+JiYlh9erVPPnkkxw4cIB333034rWBQIAzzjiDE044gUceeYQ33niDG2+8kaioKH71q19x+eWXc8EFF/Dcc89x5ZVXMnPmTLKysiKOceONN+JwOPjNb37Djh07ePbZZ9m3b1940lFrZJwqhBBCCCGEEEII0b0kAC4GvGXLluHz+fjPf/5DbGxsq/s4nU7y8vIiUk5ed9115OTk8OSTT/KXv/ylt5orhBgiTCYT55xzDu+99x5PPPEEGo0GgOLiYpYvXx5eVX3zzTeTnp7OmjVrMBgMAPzf//0fs2fP5q677moRAI+JieG///1vOJASDAZ54oknqK6uxm63U1tby0033cS1117LCy+8EH7dVVddxahRo3jwwQd54YUXSEhI4Mc//nH4eUVROPfcczEYDLzyyitHfb6PPfYYe/bsYf369YwYMQKAn/70pyQnJ/Poo49y2223kZaW1uprzzrrLC688MKIbeeccw4zZ87k73//O1dcccVRt0cIMfhFRUVF9GMAN9xwA7W1tSxbtgyAhx9+GJPJFH7++uuvZ/jw4fzyl78kPz+f9PT08HMNDQ38+Mc/ZvHixQBcdtllJCcn85Of/IS33nqLSy65BIBTTz2VnJwcXn311RYZMvR6PZ9//jk6nQ6AjIwM7rzzTv71r39x7rnntnoeMk4VQgghhBBCCCGE6F6SAl0MeA6HA4B//OMfbabZ1Wg04ZuKwWCQyspKGhsbmTZtGuvWreutpgohhphLLrmE0tJSvvrqq/C29957j2AwyCWXXEJlZSVffPEFF198MTU1NZSXl1NeXk5FRQXz5s1j165dFBQURBzz+uuvj1hFePzxxxMIBNi3bx8QmhTkcrlYsGBB+Hjl5eVoNBpmzJjRZkrd3/72t3z00Ue88sorjBkz5qjP9d133+X444/H6XRGvO/cuXMJBAJ8/fXXbb62eXDK7/dTUVHB8OHDcTgc0kcLITrstdde45lnnuGRRx7h5JNPBiL7F4/HQ3l5ObNmzUJRFNavX9/iGNdee234Z4fDwahRo4iKiuLiiy8Obx81ahQOh4O9e/e2eP31118fDn4D/PznP0er1fLvf/+7zXbLOFUIIYQQQgghhBCie8kKcDHgXXLJJbz44otce+213H333cyZM4cLLriACy+8ELX60ByPV199lT/84Q9s374dv98f3n546kohhOgup59+Ona7nXfeeYc5c+YAofTnkyZNYuTIkaxevRpFUbj33nu59957Wz1GaWkpKSkp4cfNVytCaOUgEK4xu2vXLgBOOeWUVo9ns9labPvkk0+47777WLx4MfPnzz/KsyT8vps2bSIuLq7V50tLS9t8bX19PUuXLuXll1+moKAARVHCz1VXV3eqPUKIoWXDhg387Gc/Y8GCBSxatCi8PT8/n1//+tf885//bFGL+/D+xWg0tujD7HY7qampLdKX2+32FscDwhkwmlgsFpKSksjLy2u3/TJOFUIIIYQQQgghhOg+EgAX/VpbtRIDgUD4Z5PJxNdff82XX37Jxx9/zCeffMI777zDKaecwn//+180Gg1//etfWbhwIeeddx533HEH8fHxaDQali5dyp49e3rrdIQQQ4zBYOC8887jgw8+4JlnnqGkpIRvv/2WBx98ECCcteL2229n3rx5rR5j+PDhEY+bUqkfrilo3HTM119/ncTExBb7abWR//Tn5uZy+eWXc+qpp/LAAw90+Nya98NN73vqqady5513trr/yJEj2zzWL37xC15++WVuueUWZs6cid1uR6VScemll7aZ2UMIIZpUVVUxf/58Ro4cyYsvvhjeHggEOPXUU6msrOSuu+4iJyeHqKgoCgoKWLhwYYv+pa3+9Uj9blfJOFUIIYQQQgghhBCie0kAXPRrTqcTl8vVYntTqt8marWaOXPmMGfOHB577DEefPBBfvWrX/Hll18yd+5c3nvvPbKzs3n//fcjgupLlizp6VMQQgxxl1xyCa+++iqff/45P/zwA4qihOvIZmdnA6DT6Zg7d263vN+wYcMAiI+PP+Ix6+vrueCCC3A4HLz11lsRWTOatNYP+3w+ioqKWrxvbW1tp87jvffe46qrruIPf/hDeFtDQ0Or/b8QQjQXDAa5/PLLcblcfPbZZ5jN5vBzmzdvZufOnbz66qtceeWV4e1N9cF7wq5du8Lp1wFqa2spKirizDPPbPM1Mk4VQgghhBBCCCGE6F5SA1z0a8OGDaO6uppNmzaFtxUVFfHBBx+EH1dWVrZ43aRJkwDwer3AoZU7zVfqrFq1ihUrVvREs4UQImzu3LlER0fzzjvv8M477zB9+vRwStv4+HhOOukknn/++RYBZYCysrKjfr958+Zhs9l48MEHI9LotnbMn/3sZ+zcuZMPPvggnEr9cMOGDWtRv/uFF15osQL84osvZsWKFXz66actjuFyuWhsbGyzzRqNpsVKyieffLLFewghxOHuu+8+Pv30U956660W6cJbG/8pisKf/vSnHmvPCy+8ENH3PvvsszQ2NnLGGWe0+RoZpwohhBBCCCGEEEJ0L1kBLvq1Sy+9lLvuuovzzz+fm266ibq6Op599llGjhzJunXrALj//vv5+uuvOeuss8jIyKC0tJRnnnmG1NRUZs+eDcDZZ5/N+++/z/nnn89ZZ51Fbm4uzz33HGPGjKG2trYvT1EIMcjpdDouuOAC3n77bTweD7///e8jnn/66aeZPXs248eP57rrriM7O5uSkhJWrFjBgQMH2Lhx41G9n81m49lnn+WKK65gypQpXHrppcTFxZGfn8/HH3/Mcccdx1NPPcXHH3/Ma6+9xvz589m0aVPERCOLxcJ5550HwLXXXsvPfvYz5s+fz6mnnsrGjRv59NNPiY2NjXjfO+64g3/+85+cffbZLFy4kKlTp+LxeNi8eTPvvfceeXl5LV7T5Oyzz+b111/HbrczZswYVqxYwWeffUZMTMxRnbsQYmjZvHkzv/3tbznhhBMoLS3lr3/9a8Tzl1xyCcOGDeP222+noKAAm83G3//+91Zrd3cXn8/HnDlzuPjii9mxYwfPPPMMs2fP5txzz23zNTJOFUIIIYQQQgghhOheEgAX/VpMTAwffPABixYt4s477yQrK4ulS5eya9eucAD83HPPJS8vj5deeony8nJiY2M58cQTue+++7Db7QAsXLiQ4uJinn/+eT799FPGjBnDX//6V959912++uqrPjxDIcRQcMkll/Diiy+iUqm4+OKLI54bM2YM33//Pffddx+vvPIKFRUVxMfHM3nyZH7961936v0uu+wykpOTeeihh3j00Ufxer2kpKRw/PHHc/XVVwOHVoL//e9/5+9//3vE6zMyMsIB8Ouuu47c3Fz+8pe/8Mknn3D88cezbNky5syZE/Eas9nM8uXLefDBB3n33Xd57bXXsNlsjBw5MqI/bs2f/vQnNBoNb7zxBg0NDRx33HF89tlnbdZFF0IIgIqKChRF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egUD4BSVUqnEY4891iIlMnUdjyn1h7vuuitqyvOhbKh/14b6+wOG/nsc6u+Phhb+vvYOHtfeweNKRERERERERAAgiB0pwE1ERERERERERERERERERDTASfp7AERERERERERERERERERERD2BAXAiIiIiIiIiIiIiIiIiIhoSGAAnIiIiIiIiIiIiIiIiIqIhgQFwIiIiIiIiIiIiIiIiIiIaEhgAP8M99dRTmD59OjQaDUwmU9Q2giC0+Fm5cmVEmzVr1mDixIlQKpXIysrCihUren/wA1RHjmlpaSnmzZsHjUaD+Ph4/PKXv0QgEIhow2NK1Hn79u3D/PnzERsbC4PBgJkzZ+Lbb7+NaNOR799AtGbNmqjnY0EQsGnTpnC77du346yzzoJKpUJqaiqeffbZfhx1533++eeYOnUq1Go1zGYzFixYELF+sH5+J2RkZLT4/J555pmINoP9M6TBZ9myZZg8eTL0ej3i4+OxYMECFBcXR7TxeDxYtGgRYmJioNPpcMUVV6C6urqfRjw4vPLKKxg3bhwMBgMMBgMKCgrw73//O7yex7RnPPPMMxAEAffdd194GY8tERERERER0ZmNAfAznM/nw5VXXomf//znbbZbvnw5Kisrwz+nBiRKSkowb948nHfeeSgqKsJ9992HW2+9FV999VUvj35gau+YBoNBzJs3Dz6fDz/88APefvttrFixAo8++mi4DY8pUddccsklCAQC+Oabb1BYWIjx48fjkksuQVVVFYCOff8GqunTp0echysrK3HrrbciMzMTkyZNAgA4HA7Mnj0b6enpKCwsxHPPPYff/OY3eP311/t59B3z4Ycf4oYbbsBNN92Ebdu24fvvv8e1114bXj+YP79TPfHEExGf49133x1eN9g/Qxqc1q5di0WLFuHHH3/EqlWr4Pf7MXv2bLhcrnCbxYsX49NPP8X777+PtWvXoqKiApdffnk/jnrgS0lJwTPPPIPCwkJs3rwZ559/PubPn49du3YB4DHtCZs2bcJrr72GcePGRSznsSUiIiIiIiI6w4lEoiguX75cNBqNUdcBED/66KNWt33ggQfEMWPGRCy7+uqrxTlz5vTgCAef1o7pF198IUokErGqqiq87JVXXhENBoPo9XpFUeQxJeqK2tpaEYC4bt268DKHwyECEFetWiWKYse+f4OFz+cT4+LixCeeeCK87OWXXxbNZnPEe3nwwQfFUaNG9ccQO8Xv94vJycniX//611bbDIXPLz09XfzjH//Y6vrB/BnS0FFTUyMCENeuXSuKoijabDZRLpeL77//frjNnj17RADi+vXr+2uYg5LZbBb/+te/8pj2gMbGRnHEiBHiqlWrxHPOOUe89957RVHk7ysRERERERERiSJngFOHLFq0CLGxsZgyZQreeustiKIYXrd+/XrMmjUrov2cOXOwfv36vh7moLB+/XqMHTsWCQkJ4WVz5syBw+EIzwjiMSXqvJiYGIwaNQrvvPMOXC4XAoEAXnvtNcTHxyM/Px9Ax75/g8W//vUvHDt2DDfddFN42fr163H22WdDoVCEl82ZMwfFxcVoaGjoj2F22JYtW1BeXg6JRIK8vDwkJiZi7ty52LlzZ7jNUPn8nnnmGcTExCAvLw/PPfdcRAr3wfwZ0tBht9sBABaLBQBQWFgIv98fcW2SnZ2NtLQ0Xpt0UDAYxMqVK+FyuVBQUMBj2gMWLVqEefPmtbhm5rElIiIiIiIiIll/D4AGvieeeALnn38+NBoNvv76a9x5551wOp245557AABVVVURwQgASEhIgMPhgNvthlqt7o9hD1itHa8T69pqw2NK1DpBEPCf//wHCxYsgF6vh0QiQXx8PL788kuYzWYAHfv+DRZvvvkm5syZg5SUlPCyqqoqZGZmRrQ79f2dOA4D0aFDhwAAv/nNb/D8888jIyMDf/jDH3Duuedi3759sFgsQ+Lzu+eeezBx4kRYLBb88MMPWLp0KSorK/H8888DGNyfIQ0NoVAI9913H2bMmIHc3FwAzb97CoUCJpMpom1CQsKg+e71lx07dqCgoAAejwc6nQ4fffQRcnJyUFRUxGPaDStXrsSWLVuwadOmFuv4+0pEREREREREnAE+BD300EMQBKHNn71793a4v0ceeQQzZsxAXl4eHnzwQTzwwAN47rnnevEdDDw9fUyJqOM6+v0TRRGLFi1CfHw8/vvf/2Ljxo1YsGABLr30UlRWVvb322hVV84vR48exVdffYVbbrmln0bdcR19f6FQCADw61//GldccQXy8/OxfPlyCIKA999/v5/fRds68xkuWbIE5557LsaNG4c77rgDf/jDH/CXv/wFXq+3n98FUbNFixZh586dWLlyZX8PZUgYNWoUioqKsGHDBvz85z/H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", "text/plain": [ - "<Figure size 1440x1440 with 50 Axes>" + "<Figure size 2000x2000 with 69 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -754,7 +770,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 45, "metadata": {}, "outputs": [ { @@ -763,20 +779,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 11, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "<Figure size 432x288 with 1 Axes>" + "<Figure size 640x480 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -787,7 +801,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 46, "metadata": {}, "outputs": [ { @@ -796,20 +810,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 12, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "<Figure size 576x576 with 1 Axes>" + "<Figure size 800x800 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -848,7 +860,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -1002,7 +1014,7 @@ "[3 rows x 51 columns]" ] }, - "execution_count": 13, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -1025,7 +1037,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 48, "metadata": { "scrolled": false }, @@ -1034,7 +1046,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/folders/yk/yj8t31wd1sd_9w0f9cfg5jv80000gn/T/ipykernel_82121/3440732423.py:2: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + "C:\\Users\\bryan\\AppData\\Local\\Temp\\ipykernel_31064\\3440732423.py:2: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", " china_copy = china.append(china_sars)\n" ] }, @@ -1044,20 +1056,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 14, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9EAAALDCAYAAAASWYNXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd5hkZZU/8O+tnFPn3D0550AWBERRDKCygDnHVdTVZdVV0FV3/a24RtR1xQCCKCAZyWlCT+7pyd3TOXdXzun+/uiZZno6Vb4Vvp/n4WGmq+reMzPdVffc97znCKIoiiAiIiIiIiKiBcmkDoCIiIiIiIioUDCJJiIiIiIiIkoQk2giIiIiIiKiBDGJJiIiIiIiIkoQk2giIiIiIiKiBDGJJiIiIiIiIkoQk2giIiIiIiKiBDGJJiIiIiIiIkqQQuoAzhePxzE4OAij0QhBEKQOh4iIiIiIiIqcKIrweDyora2FTDb/WnPeJdGDg4NoaGiQOgwiIiIiIiIqMX19faivr5/3OUkl0d/+9rdx++23T/va8uXLcfz4cQDA5Zdfjpdeemna45/85Cdx1113JXwOo9EIYDJ4k8mUTHhERERERERESXO73WhoaJjKR+eT9Er06tWr8eyzz75+AMX0Q3z84x/HHXfcMfV7nU6X1PHPlnCbTCYm0URERERERJQziWwpTjqJVigUqK6unvNxnU437+NEREREREREhSrp7tynTp1CbW0tFi1ahFtuuQW9vb3THr/nnntQXl6ONWvW4LbbboPf75/3eKFQCG63e9p/RERERERERPkoqZXo7du34+6778by5csxNDSE22+/HZdeeina29thNBpx8803o6mpCbW1tWhra8PXvvY1nDhxAg8++OCcx/z+978/Y581ERERERERUT4SRFEUU32x0+lEU1MTfvSjH+GjH/3ojMeff/55XHnllejo6MDixYtnPUYoFEIoFJr6/dkN3S6Xi3uiiYiIiIiIKOvcbjfMZnNCeWhaI64sFguWLVuGjo6OWR/fvn07AMybRKvVaqjV6nTCICIiIiIiIsqJpPdEn8vr9aKzsxM1NTWzPn7w4EEAmPNxIiIiIiIiokKS1Er0V77yFVx33XVoamrC4OAgvvWtb0Eul+Omm25CZ2cn7r33Xlx77bUoKytDW1sbbr31Vlx22WVYt25dtuInIiIiIiIiypmkkuj+/n7cdNNNmJiYQEVFBS655BLs2rULFRUVCAaDePbZZ/HjH/8YPp8PDQ0NuOGGG/CNb3wjW7ETERERERER5VRajcWyIZkN3URERERERETpSiYPTWtPNBEREREREVEpYRJNRERERERElCAm0UREREREREQJYhJNRERERERElCAm0UREREREREQJYhJNRERERERElCAm0UREREREREQJYhJNRERERERElCAm0UREREREREQJYhJNRERERERElCAm0UREREREREQJYhJNRERERERElCAm0UREREREREQJYhJNRERERERElCAm0UREREREREQJYhJNRERERERElCAm0UREREREREQJYhJNRERERERElCCF1AEQEREREVFmiaKIkyNePHd8BK+cHMeAMwCHP4zlVUasq7fAoFGgz+6HWiHD29bV4uIlZRAEQeqwiQqCIIqiKHUQ53K73TCbzXC5XDCZTFKHQ0REREQkuSFXAO0Dbpwa9eDUiBcapQzbW8qgVysQisbgDkThDkbQ7/Dj5IgXp0Y8cPgjCR9/Xb0Zt169DJcvq2AyTSUpmTyUSTQRERERUR4RRRE9E360dtmxu8uO1u4J9NkDOTn3pkYLPvWGxbh8eSVUCu78pNKRTB7Kcm4iIiIiIgnF4yI6xryTCXOXHa1dExhxhySJZX+vE5/44z5YdUpsa7EBAP7lmuVYUmmUJB6ifMQkmoiIiIgoy0RRxKsd4zg14sWYN4RRd+jM/4OIxkRYdEoc6nciEsuPIlGHP4Knj4wAmEys//api9BYppM4KqL8wCSaiIiIiChL4nERzxwbwU+eO4Ujg+55n1umV6HSpMaxIU+OokvMmCeEa378Mj5wYRO2NNvQVKZDS7keSjnLvak0cU80EREREVEW7OycwO2PHsHx4cSTYptehVhchCuQeFMwKTSX6fDVN6/AW9ZUo9fux9f+1oaTI16YtUpcvaoK12+qw4pqXstT4WBjMSIiIiIiCT10oB//8kAbovHkL7XX1ZnRNuDKQlSZt7TSgGhcRNe4b8Zjb11bg1uvXsr91FQQmEQTEREREUlAFEXc9dJp/OdTx9M6zrZmK1q7HRmKSjqCAFy6tAJvWVMNuSDguvW10KrkUodFNAO7cxMRERER5VgsLuKOR4/g9zt7MnC04pjVLIrAyyfH8PLJMQBA24AT333nWomj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", "text/plain": [ - "<Figure size 864x864 with 1 Axes>" + "<Figure size 1200x1200 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1087,7 +1097,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 49, "metadata": {}, "outputs": [], "source": [ @@ -1106,14 +1116,14 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/var/folders/yk/yj8t31wd1sd_9w0f9cfg5jv80000gn/T/ipykernel_82121/642512976.py:2: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + "C:\\Users\\bryan\\AppData\\Local\\Temp\\ipykernel_31064\\642512976.py:2: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", " finland_copy = finland.append(finland_aland)\n" ] }, @@ -1123,20 +1133,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 16, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "<Figure size 864x864 with 1 Axes>" + "<Figure size 1200x1200 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1159,7 +1167,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 51, "metadata": {}, "outputs": [ { @@ -1168,20 +1176,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 17, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "<Figure size 432x288 with 1 Axes>" + "<Figure size 640x480 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1192,7 +1198,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 52, "metadata": {}, "outputs": [ { @@ -1201,20 +1207,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 18, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "<Figure size 432x288 with 1 Axes>" + "<Figure size 640x480 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1236,7 +1240,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 53, "metadata": {}, "outputs": [ { @@ -1245,20 +1249,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 19, + "execution_count": 53, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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w/avv/4a2dnZob4MERERDSJB9aCsWrUK8+fPR1ZWFmw2GzZu3Ihdu3Zhx44dkEgk+M1vfoOHH34YY8aMwdixY7FhwwYcP34cW7Zs6av6iYiIKAoFFVAaGhqwePFi1NbWwmAwoKioCDt27MDs2bMBAPfddx8cDgfuv/9+mM1mjBkzBjt37sTQoUP7pHgiIiKKTiHPgxJunAeFiIgo8ohmHhQiIiKivsKAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiE1RAWb9+PYqKiqDX66HX61FcXIzt27dftp8gCJg/fz4kEgnefPPNcNVKREREg0RQASUzMxNr165FaWkpDhw4gJkzZ2LhwoU4evRoh/3+/Oc/QyKRhLVQIiIiGjzkwex83XXXdXj82GOPYf369di7dy9GjhwJACgrK8Of/vQnHDhwAGlpaeGrlIiIiAaNoALKpbxeLzZv3gy73Y7i4mIAQGtrK2655RY8++yzSE1NDagdp9MJp9Ppf2y1WntbEhEREUWJoAfJlpeXQ6vVQqVSYenSpdi6dSsKCwsBAPfffz+mTZuGhQsXBtzemjVrYDAY/D8mkynYkoiIiCjKBN2Dkp+fj7KyMlgsFmzZsgV33HEHdu/ejVOnTuHjjz/GoUOHgmpv1apVWLFihf+x1WplSCEiIhrkJIIgCKE0MGvWLAwdOhQxMTH47//+b0il33XKeL1eSKVSXHnlldi1a1dA7VmtVhgMBlgsFuj1+lBKIyIion4S7u/vXo9Bucjn88HpdOKRRx7Bz3/+8w7bRo8ejXXr1l02uJaIiIioO0EFlFWrVmH+/PnIysqCzWbDxo0bsWvXLuzYsQOpqamdDozNyspCbm5u2AomIiKi6BdUQGloaMDixYtRW1sLg8GAoqIi7NixA7Nnz+6r+oiIiGgQCiqgvPzyy0E1HuLwFiIiIhqkuBYPERERiQ4DChEREYkOAwoRERGJDgMKERERiQ4DChEREYkOAwoRERGJDgMKERERiQ4DChEREYkOAwoRERGJDgMKERERiQ4DChEREYkOAwoRERGJDgMKERERiQ4DChFRF/7rgxN453DNQJdBNCgxoBARdeKb8y1odXlRkKof6FKIBiX5QBdARCRGQ5O0+P0PCwe6DKJBiz0oREREJDoMKERERCQ6DChEFLU8Xh/+UVIJr08Y6FKIKEgcg0JEUevx947jlc8r8P6ROtx11VC0OD3YfKAKCVoVHpxfAEOMYqBLJKIuMKAQUdSyOdwAgE9OnMcnJ8532Pavk+fxhx8WYkSaHglaJWKV/N8hkZjwEg8RRa3f/7AQk3LiO912rqkNd/2tFP9vzxm0ODz9XBkR9YQBhYiiliFGgf+9cyr+76LRyE/RXbZ94dh0/G5BIZL16gGojoi6wz5NIopqcpkUN0/Kwk0TTdjzzQV8cKweTa0uGDVK3H3V0IEuj4i6wIBCRIOCRCLBtLxETMtLHOhSiCgAvMRDRPQtn0/A56caB7oMIgIDChGRn1Qq4a3HRCLBgEJEdIlRGYaBLoGIwIBCREREIsSAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiE1RAWb9+PYqKiqDX66HX61FcXIzt27cDAMxmM5YvX478/HzExMQgKysL9957LywWS58UTkRERNErqKnuMzMzsXbtWgwbNgyCIGDDhg1YuHAhDh06BEEQUFNTg6eeegqFhYU4e/Ysli5dipqaGmzZsqWv6iciIqIoJBEEQQilAaPRiCeffBJLliy5bNvmzZtx2223wW63Qy4PLAtZrVYYDAZYLBbo9fpQSiMiIqJ+Eu7v714vFuj1erF582bY7XYUFxd3us/FIrsLJ06nE06n0//YarX2tiQiIiKKEkEPki0vL4dWq4VKpcLSpUuxdetWFBYWXrZfY2MjVq9ejbvuuqvb9tasWQODweD/MZlMwZZEREREUSboSzwulwuVlZWwWCzYsmULXnrpJezevbtDSLFarZg9ezaMRiO2bdsGhaLrxbc660ExmUy8xENERBRBwn2JJ+QxKLNmzcLQoUPxwgsvAABsNhvmzp2L2NhYvPPOO1Cr1UG1xzEoREREkSfc398hz4Pi8/n8PSBWqxVz5syBUqnEtm3bgg4nRERERECQg2RXrVqF+fPnIysrCzabDRs3bsSuXbuwY8cOfzhpbW3Fa6+9BqvV6h/wmpSUBJlM1idvgIiIiKJPUAGloaEBixcvRm1tLQwGA4qKirBjxw7Mnj0bu3btwr59+wAAeXl5HY6rqKhATk5O2IomIiKi6BbyGJRw4xgUIiKiyCO6MShERERE4caAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiw4BCREREosOAQkRERKLDgEJERESiE1RAWb9+PYqKiqDX66HX61FcXIzt27f7tzscDixbtgwJCQnQarVYtGgR6uvrw140ERERRbegAkpmZibWrl2L0tJSHDhwADNnzsTChQtx9OhRAMD999+Pt99+G5s3b8bu3btRU1ODH/3oR31SOBHRQBMEAQ1Wx0CXQRSVJIIgCKE0YDQa8eSTT+LGG29EUlISNm7ciBtvvBEAcPz4cYwYMQJ79uzB1KlTA2rParXCYDDAYrFAr9eHUhoRERH1k3B/f/d6DIrX68WmTZtgt9tRXFyM0tJSuN1uzJo1y79PQUEBsrKysGfPni7bcTqdsFqtHX6IiMTM5wvp7zoiCkDQAaW8vBxarRYqlQpLly7F1q1bUVhYiLq6OiiVSsTFxXXYPyUlBXV1dV22t2bNGhgMBv+PyWQK+k0QEfUnqVQy0CUQRb2gA0p+fj7Kysqwb98+3HPPPbjjjjtw7NixXhewatUqWCwW/09VVVWv2yIiIqLoIA/2AKVSiby8PADAhAkTUFJSgqeffho333wzXC4XmpubO/Si1NfXIzU1tcv2VCoVVCpV8JUTERFR1Ap5HhSfzwen04kJEyZAoVDgo48+8m87ceIEKisrUVxcHOrLEBER0SASVA/KqlWrMH/+fGRlZcFms2Hjxo3YtWsXduzYAYPBgCVLlmDFihUwGo3Q6/VYvnw5iouLA76Dh4iIiAgIMqA0NDRg8eLF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", "text/plain": [ - "<Figure size 432x288 with 1 Axes>" + "<Figure size 640x480 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1269,7 +1271,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 54, "metadata": {}, "outputs": [ { @@ -1278,20 +1280,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 20, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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Uumo/X0RilDv36xZs6BSqVBdXY3zzjsPAODz+VBbWyvK74uzPmyGqqGhARdddBEKCwvxhz/8Aa2trb2vnfxX57e//W088MADuOmmm3DXXXdhz549ePjhh/HHP/4xUWUnlbq6OnR0dKCurg6BQAA7d+4EAJSUlECn02HRokX4+c9/jpUrV+InP/kJgsEg1qxZA7lcjosvvjixxSeB4e7f+PHjsXz5ctx222144oknYDAYsGrVKkyYMIH3D8PfvzMDZVtbGwBg4sSJw67LeTYY7v7t2bMHCxYswJIlS3DnnXf2jjOUyWQxDbQj1XD3b/HixZg0aRKuv/56/P73v0dzczPuvfderFy5EiqVKrHFJ6Hy8nKYzWbccMMN+OUvfwmNRoMnn3wSNTU1WLZsWaLLS3oGgwG33HIL7rvvPuTn56OwsBBr164FAFxzzTWxv2Bc5ryPAs8884wAYMCv0+3atUs477zzBJVKJeTm5gpr1qxJUMXJ54Ybbhjw/n388ce957z33nvCueeeKxiNRsFsNgsLFiwQNm/enLiik0go989mswnf+973BJPJJFgsFuHKK6/ss5TU2SyU+3e6jz/+mEsfnWa4+3ffffcN+HphYWFC604Wofz9q62tFZYuXSpoNBohLS1N+OlPfyr4fL7EFZ3kKioqhMWLFwsWi0XQ6/XCvHnzhLfffjvRZY0YXq9X+OlPfypkZGQIer1eWLhwobBnzx5RriURhBMDk4iIiIiIYuysn41OREREROJh2CQiIiIi0TBsEhEREZFoGDaJiIiISDQMm0REREQkGoZNIiIiIhINwyYRERERiYZhk4iIiIhEw7BJRERERKJh2CQiIiIi0TBsEhEREZFo/j/Leu2X4KxGVQAAAABJRU5ErkJggg==", "text/plain": [ - "<Figure size 576x576 with 1 Axes>" + "<Figure size 800x800 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1311,7 +1311,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 55, "metadata": {}, "outputs": [ { @@ -1320,20 +1320,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 21, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAARgAAAD4CAYAAAA3vfm6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA110lEQVR4nO3dd3zkd3ng8c93etFoinofbe/Fq103bGyMY7AJ4IQWAoZLTAkQICFwB5d7EdrdhYSWQOBoCQnFhGIgFGOcGNuA7fVWb++SVm3VRtJIM5r6vT9mpJU0RaMyq7LP+/Xyy7szv9/Md3Y1z37r8yitNUIIUQyGpW6AEGL1kgAjhCgaCTBCiKKRACOEKBoJMEKIojFdyzcrLy/Xfr//Wr6lEKLIDh482K+1rsj23DUNMH6/nwMHDlzLtxRCFJlSqi3XczJEEkIUjQQYIUTRSIARQhRNwQFGKWVUSh1WSv10xuP/oJQaXfymCSFWurn0YN4DnJr6gFKqBfAuaouEEKtGQQFGKVUP3Ad8dcpjRuDvgA8Up2lCiJWu0B7MZ0kFkuSUx94F/ERr3Z3vRqXUW5VSB5RSB/r6+ubXSiHEijRrgFFKvQzo1VofnPJYLfBq4B9nu19r/WWtdYvWuqWiIuteHCHEKlXIRrtbgZcrpe4FbEApcAKIAOeVUgAOpdR5rfW6orVULLme4XGi8SQj4zEAttW5l7hFYrmbNcBorT8IfBBAKXUH8Fda65dNvUYpNSrBZXX7wuPn+cpTF9lR7+G35/qoLLWRSGo21ZTywZduYnNN6bxed2Q8RqnNvMitFcuF7IMReQ2HY/zV947y2cfOMhSK8eTZPtZUlNA9PE5vMMKTZ/t457cPcWVkHICJDIlaa7TWDI5FSSQ18USSRFJzuD3AyHiM872j/MfRLm763//JN59pQzIrrk7qWv7FtrS0aDmLtHL0BSPc9sn/IhJPMvXH5MZmH89eGpx2rdVkwGUzcfuGCh453sN4LIHTYmI0GqeixEo0kWQoFMv5XnUeO0pBidVEi9/LHRsqeeHGCszGuf0bOBSK4rabefriAI0+B/Vex5zuF3OnlDqotW7J9tw1PewoVhan1cg77ljHN59pozcYST1mMdI5FM64NhJP0uiwcKA1QCiaACAYiQNM3pvP1Nc83RPkm8+0A7Cp2kWFy8rOeg/37aihxm2j1GbGYFAAJJOaJ8/1caYnyHf2t1PjtjMaiXOsc5hSm4n/8wc7uHltGT6nBUj1rB453kPbYIittaXc2FyGxSQd+WKRHowAYGA0gs9pQSlFPJHkc/95jnNXRllb6eSffn1hsgdT77XTEcgMMAAtTV4OtAWK3tZb1vi42B8ioTXD4RjReHLWezZVu3j9jY20D4T46m8uAeCymognNXduquAD92zCX+6cvH40EudgW4DHT/fy4d/fQnoxQ2SRrwcjAUbw8OEO3v+959lQ5cJsMnC6e4RIli/t5hoXp7qDeV9rU7WL0z35r5mv6lIrjWVOxiJxTnSNFHRPpctKc7mT8ViC0z3BrJ8LYK/fx2gkjtaaqlIbz14aYDyWZG2Fk0afkz95gZ9L/WPcubGSBp8Mu6aSIZLI6qfPd3Ghd4xvPdtGPKk52Z3/S+sqYLUnMBal1mMjEIoRTg+VFmJnvZtgJE6dx05wPM7+GXM/ufgcFgZDUeq9dkLRBBaTwmY2sLbCyeXBEMHI1batKXdypD1ALJn6x3YiQO5p9HK2N8iFvjEeP9MLwAM3j/LRV2xb8Oe6Xsjg8zrVMzzOvz3dxmceO1vQHAlANDb7UORKMILVZGT7AvbIVLqs+Msc7PP7ONoxzMW+McLRBEcuD816r9dhZl+zj8FQlDqPneFwjGOdwxxsG6LGbedc7yj1U3ogJRYj5S7rZHCZYDYqkjpJcDw++ZjDYuTVexo431ucHtpqJD2Y69Q3n2nLWAmaTThWWI/E6zBn9DS8DjPrK0tIJMFohMGxGFaTgRNdI+xu8GA2GUgkksS15ujlYQBaB0KT9x9oC3D7+nKGwzEsJgNKqYz3WFdZQihytZczczLaaTWyo95DXzDCvmYfiaRmNBInEIpmfIbtdW4OtQ9lPP7U+T4ePtTJH+6p5w9vqKfCZS3oz+R6JXMw16mP/fQkj57s4fJg9gnbbNx2E8Ph+OwXAnv9Xo60D1FWYiEa11SUWjkzY27GoGBTdSltA2OMzTKcWlfh5Hzf2PTHKktQCs5dGcWooKzEismo6Boaz7h/c42LrqFx1lQ4OTwlcHgcZtZVlGA0KPpHI9jMRpwWE4enDJlyUQpuX1/BvdurGY8leN3eRqxm4yx/MqtPvjkYGSJdp/7y7g18+jW7yLc4YjOnfjz8ZQ7c9tQXsVAGBS67mZ6RCIOhaEZwAUhqONk9MmtwKbEYyTY4O987ittupsZtI6HBZTPhc1gyrlMKFIqmMgfHO4enPTcUinGgLcCzlwbpCISJxpLsbx2cNbgAaA1PnO3jv//gGD863MX/feT0tHmnRAGvAXB5MESywGtXGhkiXaecVhNryp3csaGCeq+DX57omZyLUQosRgPb69wc7xyeHKokCvwO2M2GVGAZyxx6zEet187ZK9lzmh1qC7C3yUu91044miCe5Yuq04FsX7OPOo+d1oEQe/1eDEoRHI9xqjuIBowGRevAWOabzMJlNXK8a5jDl4foGgpT67EzEo7z1Lk+3nLbGh68rTnnMnc4muC2Tz6ent+pZ3u9h71+L01lzqzXrzQyRLrOXewb5eWf/y3jsQQ+p4VGn4MzPSNEE0ki8ek/Gy6biTKnZdrcyEwbq1LHCEbGCxtKFWJNuZOL/ZlffKVSy8unukemTcbmYzIobmj0ooBzfUEMSpFMagZDMfb6vTzXOrd9PNvrSvE4LDx1rj/nNW++xc/dW6p45uIAvSMR7r+hjnA0gcdhJp5I8r7vPU/74NU/U3+Zg/t21GAxGnn7HWuwmpb3sEuWqUVOvzjeg0HBp16zk6fO9fP9gx05r43Fk7OuODkspkUNLpB7ctlkUBxqG6SAfXaTdjd6QIEGvA4LkXgSh8VIndee9yjDTAYFO+s9nLkSZFtd/q/Rv/yulX/5Xevk77974PK057fXlWI3Gyc/Z+tAiC88fgFIBdF337W+4HYtNxJgrnP3ba/hBevK8TktvOehIxnPr68swW1Pbc0fHItmPSYwlcmoMBsVsULHUwUwGbMPL4wGhcNiLngoVuuxTfZQDCoVYExGRTiaCoznegvbvOdzmKnx2Dk8sWy+wFFA+2CIZI7XOFrA0vxyJgHmOucvdxIYi/LpX51Fpb90E1/Y7XVuTnUPT+shlDktbKst5XjXCOFoArvFSDyRJJbQqfmN/rH0v+5ujnYM53jXudE5eii17tQByUIDTF8wQqXLSm8wQlLDwJT7RsdjbKx2UWozMRyO5ZzzAWgqd3Kqe2RyZ3O2eZ+5WFdZwsG2oazPDYVjtA2M8fNjPRxqG6S8xMrr9jXidVhoLHOQTOrJ+aOpuofD/OrkFbSG1+5twGw0ZFxzLcgcjADgQt8oT5zp43P/eY7hcGqo0OC1cznHuaMyp4Uat432QIjR8Tgtfi/BcJxT6dWiKpcVm8VIW575mkLta/Zl3cG7qdpFa/8Y4wWOkewWI3azsaCAdEOjh8uDYfpGM4eEa8qd9I9GJoeCBgUbqlz0plfM5qrEamQ0Utgeo71+L6d7gvz83bfxD/95jkdPXsHrMPOW29fwqj319I9Gecs3DtA+GGI0cnWo+uyH7qKq1DbnthVCziKJWf38WDefevQMO+o9PHy4c/Lxid7KbAwqtew8Vba0DoWo89joC0bYWucmmd4Md6Ev++rOXM4+bagqydszmanWYyMW19OCjL/MQUcgPK3XsqvBg8VkoHdkPO8EeC4Os4FQAbuk11U6qXRZGY8lUYqMXk95iYWhUCxrj8pkUHzlgRbu3FQ55/bNZlH2wcysi6SU+pZS6oxS6rhS6utKKUlLtoL93pYq9vp904ILwMh4nHUVsy+ZTv2ZtpoU+5p9ROJJWvxettaWsrbCybbawrLeNfocVLvtkxvicgUXALe98B872xw3wXUNjTMaibPPf7UyT2WpLeMLfLpnhP2XBmedn8plXZWroOs8Dgu/uzDIofahrKtm/aPRrMHlj/Y18PA7buW29eXzat9CzGUOZqIu0sRPybeAN6R//W3gQeCLi9c0cS39y+9aeei56asbXoeZP9hdxxcePz+n19pW58l5KNFf5sDjsKDQWExGookkyaQmEk9O9kSOd45M5pLpHh7PmwbiQt8ouxs9tA2EZh36XB4MUea0MDAWxahSwaJ7eJwSq5HNNaUYlOJQewCt9eS80/Z6N7HE1d5FKJL5xR5P9z5cVvO8hkgFB74pseNi3xh7/V4Uikg8wZmeYM6hYl8wyobqEkxzTN61GAoKMFPqIn0C+EsArfXPpzy/H6gvRgPFtfGtZ1MJnjZWpfKm3L2liur0mL3e5+BDPzxGNDF7N77SZeXyYO5hQutACLIMIzwOM7vq3ZiMisuB8LRkVVPztMzUPxrFYTHRXOYgMBYl34A/EIpRXmLhxmbf5L/03cPjbKwunVxdspgMbKkp5WjHMNvqSjMC5fGuEbbXuTk2ZUewyaDYXlc67bG56Cv0sOmUABJP6ml7dvxlDgxKZd0v9NipK/ziWA+v3F03r/YtRKE9mM+SqouU0ZdLD43eSKqHk0Ep9VbgrQCNjY3zaqQoPp/TQlOZg4+/ctu0NJNap/LozhZclIL337ORR473YDcb2Vjt4mLfGOOxBOFYYjLLXS5DoRhHQsNsrHJNyzBnNxs5eyX/HEv7YAiHxchev5f9s2yU6x+NYjeHuRwIYzYq/GUODk7pHUXjSYwGRYnFyIXeUXY3eFAKroyM0zk0jtdh5kLf9HmceDLVG9tQ5ZrcFVyoPU3eae+fS2qeJvef4cBolBJb7q9zsXL0zGbWADO1LlK6qsBM/wQ8qbV+Ktv9WusvA1+G1CTv/Jsqiul9d2+gxe/LSB959soo300PnV6ytZrOoTA3Nvs42zvKMxcHiCeSJDVsqSnl7bev5R13XC0uEU8kMSjFn3/nMD87lrc+36QzV4I0eO1XXyOZxGM2s8HvonMohMtmzviymAwKu9mYM7golcoZbDEa2FDlmhxuxRI666TsofYhbGYDVpORYCTO+d5RnBYj6ytLCMUSBEKZcy0Tk9n7mn1z2vxX6MLx+ipXzmX/Rp+DSpc1bzbBF6y79vMvMM+6SEqpb2qt36CU+jBQAbytmI0UxXdLjh/AjdUuPnH/NhSK1+xtmHx8OByjtX+MhNbUe+xUuKwZ520mxvyNZXPLAOewXP2xjCU03cOpyVaX1URnIMxev5fnO4YwGw1srColnkzSP5p5gnqCz2Gh1G7GYlQFp/QcjyUZjyVZkx6ejUUTnOudfQVq/6XBgnslLU3eq5v1cqj32glFEnlPaRsNiqTWKMjoPZWXWPnOW25kfYETyYttvnWR3qCUehC4B7hL61xbocRq8Nq9mUNbt93MzgZPQffPPME8m1AscyI1OB6fXDl5rjWA2agYjSQ42J76Iu9u8HA5kD3I+MsdOTeyzWY+m9NGwjGqXFau5JlbaWnycqg9kLG0P1Otx86B1sG8mfwu9Y9xidTmRps5NXF+pnuEW9aV88lX7ZxMeL4UFrKT90tAG/B0+l+uH2qtP7oorRKryrvuXMd7X7ye0z1BPvvYuVknNStLrLPmqZl5FMGcozLAfPfiANS4bQUfopzqXO8oLpuJ6lIrPSOZn7W8xFJ4cnStZw1CEyaGULsbPXz37Tezvc5TYIuLZ04BRmv9a+DX6V/LMQNRkBvXlAGwp8mH227mXd8+nPf6Q+1D1Hnsc9pXcqF3lH1+H/tbB7GbDWyv92AxGjjYOjCvNjf47HQGwnQP5x565RMcj2NQil0Nbo5cnt6D6x+NzrqBscXvxagU1gJLqpiNivt31/GmW/xsrV0+JX0lSIhrJpnU/P0vz8x63fZ6d0FfbLvFSI3bRkWJle7hMPtbB9lY5cJlM00OKXY1uLnYP8ZIgZn4JgTGYpiNKiNlxVwMh2McuTxMi9/LgRkT0PledU+Th3NXRhkOx2gqc8w63LprUyXvffEGttcvn8AyQQKMuCYi8QQf+Y+TBW2lt5oMeYdRtW4bRqOiYzDMxb4xLk7Z6XtmxpL2kcvD3NDoyZpfN5d9fh8oONU1TCS+8MoIwfE4NW4rkZhmXVUJJoPidxey96xm5qRpGwixr9mXM8Dct72Gz79+97Kt2yQBRhRdKBrns4+d4+FDnbNfDHn3zLjtZmq9do60Bwreb3Kia4Sb1vg42xNkLBpna232hN6Q2mh3sG2w4Ox9M22qLsFoSAXIidw5Z3qCGFRqdWyiZ7WlxoXFZESRSkcRiiYYi8Szzs3svzTIusoSzs9Yxdpe5+Yjr9i6bIMLSIARRZRMav7kG8+x/9IgoWgCo0r1DjoCIYLj8ckhjkEpNKneRziaYGQ8d+KnDVUlc8o6t6PeTVJrnr88NHmg8FD7EP4yBzazEYvRwPNTVrmi8eSsQ5J8zMZU4iilUntiDramglVSM3m62eswExyPczlQ+OY3n9PCmnInN68tY6/fx6YaFxsqXZMldJcrCTCiaD7/+Hl+faZv8vcJDftbU/+C+8tSm8Ombo5z2UxsrS3FZFBYTUa8DjOa1C7f7qEw2+rcPN8xVNB7b6gqodZt54mzfVl7OhNDtRq3LeNEdqndxJoKJ+OxZM59Ko0+O2VOK20DIYLjMUrtZipcVobDscn0l1dGIpQ5LayrLOFk1zDBSIISq4nGMsdkaZZ8PA4zL91Ww+/vrGFjlYuykpVXIkXSNYhFFxiLcronyLsfOlzwOZtsJuYjJrLPOa1GeoORycOFueysd3OmJ4jRkKokcHKWcrdmo2J3gxeNJpHUBEIxOgIhYgnN9jo3p3tGJpfF11U4sZmNnOweIalT80EWk4FYUtOZI3cOpJaOzUYDDrORX5/ty3ldo8/BCzdUsKvBwyt21S7JAcW5kpy84po61jnMA1/fv+DXmQhOE9nnBsZS5VwnNtfNZDEZ2FZbyrGO4cmyI07r7D/isYSe7FnNdKxzmG21pZzrDRKJa0bG49PqM3UVuIw9tRbTjjr3tGHZhNvWl/OlN+wpqM0rxfIPj2LFuX1DBS/eXLXg18lWNfFge4BN1dm3ve9IV2OcWtMoUkAip9kc7xrhhsbUOa1Cy+zm0zOSGZR21rv5ygMtqyq4gAQYUSSv2FW74NcI5MjyX5LjS9g+I02Ey2rieNfi5AVuHwzhtCxO+ZCZ87Lb69z865/eOOeEWCuBBBhRFGNZEjPNxb5mX8ay7IQDbQF2TNlUtq2uFJ/DktG7GIvG2ZijtzNXnUPheQWAfX4f+5p9NJc7qHBZeeGGiozjA73BcT7xs5N5V89WqtXVHxPLxoYFfLF31rvzHu6D1Ga8W9eW0REIMTQWy5pJLqlThxXrPXY6Cjh2YLcY0VqzptyZdWLYMYceTHmJhTXlJRzvTC2PmwyQSMITwb50cqqrxwRC0QROqwmzYfX9ey8BRhTFwTlWSIRUNrymMkdB+1yeaw1Q5bJSYjPRNpg7Z+/xzhH2NHpnDTDb69zYzAaeaw1wsjvI7gYPSa052jFMdamNep+d43MowzJRcWBi783U/DBnr4zS0uTlWOcQH33FNnbUe9hcU1i+4pVm9YVMsSysqyrJ+nh5SfbUAWaDoi8YKbhgPKRSeeZLCD7h+c4hWpq8OZ/f1+xjYCwyLbAdvjzEULpX1OhzcKA1UHB5FEht2MuVBTAST3KgLcDr9jby2r2Nqza4gAQYUSQzhzgum4m9fi+BsSjb6kozJkxrPHa21eXewj9TrcdWcDa4WEJzrnd0Wqa8Oq+dFr+XJp+DkXCUrqHMlZ22wTC3ri3jYNv80j3k28Litpt53z0b5/W6K4kEGFEUL5pSf2d3owejQfFca4CETg1btqRLmOxp8qYy/Y9GCk6a3eSz43NaODKHsqrB8RhTj+zUum0caA3QNhjidE/uTHW/vTDAtrq5n1I2G1XeDYEfuncTpbbVX+lH5mDEoorEE/zocCePnrhCi9+LQSla+8cyCstPzKEcbAtQ57HRXO7kQFuA5nIH47FkRrqGRp+DqlIrz7UG8JVYMRkUNzR6QWkUirFonOOdufOruO1mqt122tOJrOYyFLvQN8aeJk/BWfHWlDspL7HkzBH80m3VvGpPQ9bnVpuCjwoopYzAAaBTa/0ypVQz8BBQBhwE3qi1zlsURo4KrH4PH+7gL757dF73rqt00jYQYkOVixPpZEzlJZZUGsh4kt5ghOZyJ5FYnK7hzA1v6yqdeB0WDrUPZQ0gHoeZDVUutNa09oeyloXNZ1O1K5WE3G7haMdQRlY9SAWykXAs50nvF2+u5POvv2FV7XlZlMqOXC28NuFvgc9ordcBAeBP599EsVq8aFMVb7hpfuVpzveOEUtoSm0mWpq87PV7GY8lCEUSk3tcLvWPZQ0uE/c/1xogmdTsa/ZNe25rbSnlJVYOtQ3yXGtgzsEFUqU/fI5U9v5Gn4M9WSaON1SV5AwuTouRj71y27IKLlpr4okko5E4vcFxFvtsYkEBZkrhta+mf6+AFwHfT1/yDeCVi9oysSK57Wb+18u2YF/Al6htMMSBtgDPtQYYjSTmXC3RX+4kEkuwva4Ut92E02LkRNcIJoMquJxILhf7R9nr9+K2m0lqjT09Wb2m3Emtx5Zzid1lNfHTd99Gjdue9fml8tnHzrH+r3/Btg//kpd+9im++MSFRX39+RZeKwOGtNYT2zU7gKxl46Tw2vWnfSBEOE+RsHwMKpXmYL72NfvQWnO8c5jwjElWyyKcTO4fjdI/GmVnvZvT3SNEEpq9fi/haCJrVcUJb79jLc15KlQWw9krQX57vp9EUvPynbVUpit1TnX3lioMSnG+b5T/ONrFpx49yy1ry9lVYMWI2SxG4bW8pPDa9efnx3rmfW9SQ3OZg0t5vqz55NsBPBCK4rIaCUYWngbTajYSSc/BDIxGcdvN7EiXlJ35Q37P1ir+7IVrF/yehWofCPGxn53kv073kkhqbllbxt1bsh8+3Vbnnlwl+6N9DfztI2cYDi/ekYV5FV4DPgd4lFKmdC+mHigsH6JY1YLjMT7z2NkFvUYyqdnnT21+K2QjXaE6A+EFlTGZYDQouqbkfpnac9nn96FJzWuYjAbaBsb4xP3br1nmud+e7+ft3zw4rdzK5UCIU91BHj1xBZNR8eZb/FnTbN6ytpwfv3NxK0DOt/DaHyulvge8itRK0puAHy9qy8Syd7xzmLNXUomdUjWfjYtyerltMETbYCg9ibp4AQbgZNcI/jJHQcnHs2lOL0HnmmuZmVfmPXetp/waZKKLJZJ88pHTfOPpNqIzJpouD4Z5+zcPAqk5sgdu9mO8Rpk2F7IP5r8DDymlPg4cBr62OE0SK4VS8IHvP098DntKCmU2qpynqWeymlLflkJKjAQjcbbUls4rwNgtRsYi8YKHb1WlVt56+5o5v89cjYzHuPdzT9GRJ6PehP/zB9vnVa1yvuY066W1/rXW+mXpX1/UWu/TWq/TWr9aa73wTDxiRdla6+af/vgGipHUPpbQ+MsdmAyKMqeFbXWlVKUTUN3Y7KO53Emly4rHYUajqPfOXv/aYU79uCfnuRS7tbZ0Tgmn/vxF669JAqkSi4k/f9E6Gn0OfvbuF/DZ1+7Ket3rb2zk3u01RW/PVLKTVyzI722t5jtvuYnXffkZANZWOLkyEpnMoL8QRy8Ps7HKhdthYv+lAC/cUE65yzptDsWgUoHu3JXseXcVcEOTh7aBEEkNW2qdWAqsljiTbY73NfhmD3qLwWBQvHZvKni4bGaclsyvtUHBgy9ovibtmfa+1/wdxaozMebf5/dSXmIllkiwtsKZNeVlISYCwO4GDyU2I8OhKGsrnPQMj0/u8J2Q1KncMDsbPJhndP1dViPVbhsH24boH40yOBblQFuA450jtPi9uO0m6jz2jHaW2kw0l18NDg0+O7saPPzm/AAtTV7WVRS23Hypr7Ah3mJxpc82NZU5+LtX7eAv795ArduG2aj4q3s2sqYi+wn3YpKqAmLBtNZ88IfHeOJsL70jkcmiZVtrSzMCQiH2NHq51J8qnTp1N/7MqocztTR5MRgUinSS8NFIzrSbqffxcDB9erulyUs4lkBrKLGZ6AyEKLGaKbWbONYxnJGqIVshtJl2Nnj40TtuWdLCaMc7h0lqzY56T9HeQ6oKiKJSSnHjGh+/PNEzLSA4LSZa/N7Jg4vJpM5Zc9phMbKlppSuoTB9o+MMzggMm6pdGJTCZjbkPKWcrSpiLs3lTp6fkkDqQFsAo2JGRcfcFQMcBexUPnp5iGOdw0X9cufTPxqhwefAbV+6U9sSYMSiuH93PcOhGCe7R/j3Ax1A5pJtjdtKc7mTS/1jbK8rJTgep7I0lddlPJbg6OXpFQGmSiT1gvevTFVRYs1YDZpLudhCN6MNjM7tmMNUWmvaB0M8euIKd2ysYH3V3NKQdgTCrC1wOFcsEmDEonnzralJxAOtgazb5ruHI1iMUTZVuzjVPUI8SUHLxS1NXoYWcXcpsOCVr0Inir/4xAXu2Fgxr2HSl564yN8+choAjZ5zgFms7f4LIZO8YlEdbs8eXCZEE5rTPcE5HTrsH40s6ilfq8lQcAnaXPpGI+xq8LDX78WSZ9fa/kuDfO9gx5xf/8jlIb6zvx2AuzZV8sDN/vk2dUlJD0YsGq01X33q0qK/rs9p4XIBm8gKFYkncdvNWM3GjERYhRoKxTgSGgJSGfsOz0j16bKZ2FJTSiyR5AcHO7jUN8bNa8u4bX15Qb0Zk0Fx58YKbBYjH7hn0zXdHLeYJMCIRdERCPHObx/m6BzSWBYqEIotqMZ1NsPhGHv9Xg60BnLmb8knlfohdafbZsZmMhBLJCkvsVLjsXOhb3TanNGzlwb54hMXeP89G3nnnetmff2JQ4jJpL5m55iKQYZIYlH8t39+btGDyz6/j5YmL1aTIWOPy2J4rjWAf44pFPxljslh0Q2NHgwKhsIx4kmN12mhqdxJ+2Bo2mHDCeUl1rzVDbL5v4+c5r9OX1nUE87XkvRgxKJYzPNIDrOB5oqSaatQe/1ejl4eIjqXpZ5Z7Gv2zVrgbaZ4Uk/uxTnUPsQta8r43cUBYCJXTPbXe9sL1/CGG5vmvLv3T9O7b00rtBcjAUYs2JHLQ/PO3zJTk89OV5Ydu8+1Bqh0WfE5zXmrABTKbFSMjccpsRoZLTA/TLaNg/FZJp83VJVw2/oKPvjSzfNqZ1WWJFEriQQYsWAn57FbN5ttdaV0BsJZk2kD9AYjDIdjeXO6GBVoQGuodtsIjEXZUO3CZjaiSD2XTGq6hsKc6B7BPIe8BTPTIJTaTNPywkxVYjXxqdfs5MWbq1bsBO1ikAAjFuw1LfX8/Fg3vznfv6DXCUcTebf2Q2oF6NlLg+xp9BKKxbGajJgMCoNSoKAvGKEjEKLGbScQiuKwGqft2J0pltBsT2eiy6bWY6O61Mah9iFctulflwpX5mY9SC2Df/yV27hna3UBn3p1k0lesWAmo4HPvW4XlfM83DhhLomZDrYHONUdxGI0cKAtwP7WQfZfGuRSf6oywcRE6+DY7JOj5/tGqXFffW+72UhLk5cbm30MjEY43jnM1lpXRtXJC31jWTe/fejezbxyd9YU1dedWQOMUsqmlNqvlDqqlDqhlPpI+vG7lFKHlFJHlFK/UUrNvvYmVq2yEivvvms99V47t6+voLq0sGBhNigq0oEllqOWcz5XRsILHoKEowm8jlQb1leWUOmycKAtwLOXBonENdGE5kRX9nQQyRmT2+UllmuSA2alKKQHEwFepLXeCewCXqKUugn4IvDHWutdwLeBvy5WI8XK8Mc3NvLk++8kFI0zGklMZprLpbzEQrXbRlWplRsaPfOqRBCOJbHOM7/LhG11pZzsHsFiMhCOJmgbLHxT38zyr199015etad+Qe1ZTQrJyauBiWl7c/o/nf6vNP24G+gqRgPFytE5FKa1PzTtVLPDYqTSZaWsxMr53iDD4av7Qxp8Dg63D9E1PE4iqdlcM7ezNpCayM03xzKb9ZUlGJViZ4Mbh9nI0xfntmw9s/fUeI2STK0UBfXl0mVjDwLrgC9orZ9VSj0I/FwpFQZGgJty3Ct1ka4Dn3r0DN8/2JGRjiEUTdA6EKJ1IESDz87GKhea1LDkbE9q2DFR5vVUdzDvhGs2XUPzP0Kwvc5NLJHkaDpAVZfacJgNhPIUrZ/pUHuARl+q5vWdGyuWNDXCclRQ31JrnUgPheqBfUqpbcBfAPdqreuBfwY+nePeL2utW7TWLRUVFYvUbLGcxBNJvvlMW85cLxMuD4bZ3xpAKcXxrhHGoplDonB0bqk2I/Ms1bizIRXITvdcnVsZi8TZXONmX7OPrbWlee6+Kp7UqSXxUisfefm263pJOpu5Jv0eAh4HXgrs1Fo/m37qu8Ati9s0sRJorfnSExdmXV6e4Lab8k7mnu8by6grnU/pPHoMdrORrkBmMKwstXKwPcD+S4Nz2jl7ORCmubyEOs/K3hRXDIWsIlUopTzpX9uBu4FTgFsptSF92cRj4jrzzWfa+PtHZy+0tq/Zm96Ja8k4eTyVItUjgtRu243V+edlKkqszLXTsK6yhL7RzMOTU4c3c+2JfPz+bfQs8oHM1aCQHkwN8LhS6nngOeBXWuufAm8BfqCUOgq8EXh/8ZopliOtdUFlYtdWOOkdidAbjHCpP3+CqVqPja7hcW5s9lHrtnGmJ8iWmtzDld5g7mHZRGF6pWBPk5fyEgteh5lsoUOp6UEllGX4ls/7/v0obYt0XGI1KWQV6Xlgd5bHHwYeLkajxMpwsnuEp9MH/fK50DeGUYHXYZ51KNU5lAoYPVPmc2buoJ2qa2iclnTahan8ZQ7C0QQbKkuIJzUH2wKTRwUCocxJZAUcmdKzOt0TpKXJm5Hn12Ex8pqWBuo8dgZDUfb6vVzqD7HX72VrrTvvZ7seyY4gMW+bq0vZ5/dl5N7NJqFhQ5VrXnl1+7MMZ6Y6eyVIvddORyCM226myefg+fRK1JUpw5ZcxxJ3N3oYHI3SNji9d3W6J0i9x05HeqWqvMTKd95y45xTV17PJMCIeTMYFC1+b0EBZiEu9I1xQ6MnY6v+BK/DQr3HjtdhwWRUeed4ZsqXsmE0Emc0EmdthZNb1pbx5lubWbsEtYVWMgkwYkGacyRsUip1onmq+S4pA5y7EqTBZ2cskmBw7Gqm/hubfRy9PETbPIvZdwZmv29Xg5ePvXL7vF7/eicBRixItduGxWjA7TBTYjVhNiocFhNneoIZW//nkhphpmAkwdpKK5UligavnfbBEE6riY5AKKMo2myMBkW9x05FqZVTs6Sa2N3o4eOv3Dbvdl/vJMCIBbllbTnPfuguvE4LkFpZah0I8YXHz/P9eWTTz2Z3g4fxeIK+4PjkJDBApcvKmStzTz61p8nL/kuDGXMu2bz1tjWTq1Fi7iRdg1gQo0FNBhdIVXlsLnfy96/eyS/ecxsbp0yITh3a5DJzq/32Ojc9I+Oc6g5OCy4AF/vHsi4557Oj3s3zBeYONhkUN60pm+M7iKkkwIii2VxTyo/fdStvvsUPpErJ5uKymShzWthY5aKlyUuD184dGys41jmc8whCLKHZ3eiZ09ArmdQFD6nu3FQ5LXiKuZMhkigqm9nI37x8K+FognAsTrXHxvOXh+kZSQWNfc1exqNJLvaP4rabJ1ekFDAwy/I0pBJvV7pSJWlPdo9kzeY/VaEpIdZUOHn/PRsLulbkJgFGXBNvv2Mtn370DI+euILZqFhf6cRsNLL/0tWNbKOR1E7YvX4vfcEITqspI8l2Nr3B1C5hq8nAjno3xzqGs+55qffaM85B2c1GHri5afL6Lz95EYAPvnQzG2S/y4JJgBHXxIXeUR45kTpWEEtozvXm3lYfHI/PWrN64lzTSDhGY5mDzTWlDIdjNPkceOxm6rx2njjTR8/IOA/c7KepzAFoeoYjKKX4+m8vEY0neXVLPR+892rG/wavnbFoghdvrlyUz329kwAjrokttaWTeV/yMRnyz9UAWIwGvv2WG1lXmb+HkUhqhsMxfFnmUd5z13qOXB5iz4xCaG9coTWglyuZ5BXXRK3HzvGP3MMbbsqddKzOY6PGbedgeyDnNS6bib95+dZZgwukVriyBRdIHYS8eW0ZlgWm2xT5SQ9GXDMmgwF/mTPrLt8Si5E6r4NkUmcUur9/dx1NZQ6GQjHu21HDXn/h+WLE0pIAI64Zi8lAjdueEVwARqOJyTNBNzR6OHdllPf93gZ+f2ctZXMoZyKWF+kfimvq3u3V7Gzw5L1mLBLnbS9cw5tvbZbgssItpC6SUkp9Qil1Vil1Sin17uI3V6x0Sin++c178xZZGxiL8Sfpou9iZStkiDRRF2lUKWUGfqOU+gWwGWgANmmtk0opWdcTBfE5LXztTS0cbg/w+cfP0z969QjBbevLuWdrNY5ZVpLEyrCQukh/Brxea51MX9dbrEaK1Wdng4edDR72Nvv48I9PcLRjKL3138sbbmpa6uaJRbKQukhrgdcqpe4H+oB3a63PFa+pYjXaWuvm+392C4fbA4xFEty8Vg4XriYLqYtkBca11i3AV4CvZ7tXKfVWpdQBpdSBvr6+RWq2WG12N3p5wfpyEknNYyevoLMtNYkVZ751kV4CdAA/TD/1MLAjxz1SeE0UzGIyUFVqQykpYLYazLcu0mngR8Cd6cteCMxeHEeIAmyvl+z8q0UhczA1wDfS8zAG4N+11j9VSv0G+JZS6i9ITQI/WMR2CiFWoIXURRoC7itCm4QQq4Ts5BVCFI0EGCFE0UiAEded6ALqM4m5kQAjrjtneoJL3YTrhgQYcd2RZfBrRwKMEKJoJMAIIYpGAowQomgkwAghikYCjBCiaCTACCGKRgKMEKJoJMAIIYpGAowQomgkwAghikYCjBCiaOZdeG3K8/+glBrNdb8Q4vo178JrWutnlFItgLe4TRRCrFSz9mB0SkbhtXSO3r8DPlDE9gkhVrCC5mCUUkal1BGgF/iV1vpZ4F3AT7TW3bPcK3WRhLhOzbfw2u3Aq4F/LOBeqYskxHVqvoXX7iRVRva8UqoVcCilzi9664QQK9p8C68d1FpXa639Wms/ENJarytqS4UQK868C68Vt1lCiNVg3oXXZlxTsmgtEkKsGrKTVwhRNBJghBBFIwFGCFE0EmCEEEUjAUYIUTQSYIQQRSMBRghRNBJghBBFIwFGCFE0EmCEEEUjAUYIUTQSYIQQRSMBRghRNBJghBBFIwFGCFE0866LpJT6llLqjFLquFLq6+mSJkIIMamQHsxEXaSdwC7gJUqpm4BvAZuA7YAdeLBYjRRCrEyFZLTTQEZdJK31zyeuUUrtJ1VxQAghJi2kLtLEc2bgjcAjRWmhEGLFmm9dpG1Tnv4n4Emt9VPZ7pXCa0Jcv+ZbF+klAEqpDwMVwF/muUcKrwlxnZpvXaTTSqkHgXuAP9JaJ4vaSiHEijTvukhKqTjQBjytlAL4odb6o8VrqhBipZl3XSStdSHBSQhxHZOdvEKIopEAI4QoGgkwQoiikQAjhCgaCTBCiKKRACOEKBoJMEKIopEAI4QoGgkwQoiikQAjhCgaCTBCiKKRACOEKBoJMEKIopEAI4QoGgkwQoiikQAjhCiahRRea1ZKPauUOq+U+q5SylL85gohVpKFFF77W+AzWut1QAD406K1UgixIs0aYHRKRuE14EXA99OPfwN4ZTEaKIRYueZVeA24AAxprePpSzqAuhz3Sl0kIa5T8yq8RqomdUGkLpIQ16/5Fl67GfAopSYqC9QDnYvbNCHESjffwmunSAWaV6UvexPw4yK1UQixQi2k8NpJ4CGl1MeBw8DXithOIcQKtJDCaxdJzccIIURWspNXCFE0EmCEEEUjAWaRDYWiS90EIZYNCTCLSGvN1397ieFwbKmbIsSyIAFmkYSjCX52rJvfnh/AYTEudXOEWBYKWaYWs/jxkU4+9ehZ2gdD7GrwYDZK3BYCJMAsir/5yQkCoRjlJVYevK15qZsjxLIhAWaBzvQEGY8l+cLrb+AF68tx281L3SQhlo1lHWACY1He9m8HAfjam1tw2Zbfl3d9ZQlPf/BFeBySb0uImZb1ZMHlQIj9rYOp/y4NLnVzMvz6TC9//ePjOK3LOk4LsWSWdYDZXudmbYUTgG117iVuTaYv/voC3362nYt9Y0vdFCGWpWUdYJRSvPPOdbispnkt/cYSSX5xrJt/fbqVs1eCi9q2KyPjHL48BIDdLMvSQmSz7Pv2d2+pomsoPOf5l2RS8+7vHOYXx3v46/s2s66iZFHb9ZUnLxKNJ6lwWan32hf1tYVYLZZ9gHHZzLzrRetnvS6WSDI4FqV/NMKJzhF+dKST310Y4P33bOTB29Ysapv6ghH+9ek2ABwWIwaDWtTXF2K1WPYBplCPHO/hvd89QiKpJx/zOsy88851i/5ePznaRTSRBOC+7TWL/vpCrBaFZLRrUEo9rpQ6ma6L9J7047uUUs8opY6kk3pf09ww47EE47HE5O9ftqOGWo9t2jX3FunL/7vz/VhNBnY3evijfY1FeQ8hVoNCejBx4H1a60NKKRdwUCn1K+CTwEe01r9QSt2b/v0dxWvqdG/7t4Oc6h7hKw+0sLPBg1KKN9/SzMd+enLymru3VOW8/7nWQfqCEeo8dpSCHfWeWd8zkdR8+cmLbK4p5bOv27Us9+UIsZwUUhepW2t9KP3rIKl8vHWkaiOVpi9zA13FamQ2DouR3mCEY53Dk489cHMT29PL2fftqOH29bmrGDy0/zLv+NYhXvGF33K0YzjndRMOtgV473ePMDgW4a/u2SjBRYgCKK317FdNXKyUH3gS2EYqyPwSUKQC1S1a67Z897e0tOgDBw7Mu7FTjccSnLsyyvb66ftjnr4wwFgkzs1ry3JugPv6by7x0Sk9nZvW+HjorTcvSruEuN4opQ5qrVuyPVfwJK9SqgT4AfBerfVIOtn3X2itf6CUeg2ppN8vznLfW4G3AjQ2Lt58hc1szAguADevLZv13qm9HgCrSfaxCFEMhVZ2NJMKLt/SWv8w/fCbgIlff48cCcAXUnitZ3icLz1xYU73FOK1exswG68uLe9r9i36ewghCujBKKUUqd7JKa31p6c81QW8EPg1qTrV5xazYR/9j5Psbx3g1rXli/myANy0poyvvWkvPzzUwR/uqecF6xb/PYQQhQ2RbgXeCBxL16cG+BDwFuBz6eqO46SHQYvlVXvq6RuN8I4i7GMBuH1DBbdvkFK2QhTTnCZ5F2oxJ3mFEMtDvkneZX3YUQixskmAEUIUjQQYIUTRSIARQhSNBBghRNFIgBFCFI0EGCFE0UiAEUIUjQQYIUTRXNOdvEqpPiBvSodlohzoX+pGLAL5HMvLavgc2T5Dk9Y667mbaxpgVgql1IFcW59XEvkcy8tq+Bxz/QwyRBJCFI0EGCFE0UiAye7LS92ARSKfY3lZDZ9jTp9B5mCEEEUjPRghRNFIgBFCFI0EmCmUUq9OV69MKqVapjzuV0qF01UsjyilvrSU7ZxNrs+Rfu6DSqnzSqkzSql7lqqNc6WU+hulVOeUv4N7l7pNhVJKvST9531eKfU/lro986WUalVKHZuo5lrIPaumNvUiOQ78AfD/sjx3QWu969o2Z96yfg6l1BbgdcBWoBZ4TCm1QWudyHyJZekzWuu/X+pGzIVSygh8Abgb6ACeU0r9RGt9Mv+dy9adWuuCNwtKD2YKrfUprfWZpW7HQuX5HK8AHtJaR7TWl4Dz5Cg3IxbNPuC81vqi1joKPETq7+G6IAGmcM1KqcNKqSeUUrctdWPmqQ64POX3HenHVop3KaWeV0p9XSnlXerGFGil/5lPpYFHlVIH0wUVZ3XdDZGUUo8B1Vme+p9a6x/nuK0baNRaDyil9gA/Ukpt1VqPFK2hs5jn51jW8n0m4IvAx0j9kH8M+BTwJ9eudQJ4gda6UylVCfxKKXVaa/1kvhuuuwCjtc4ob1vAPREgkv71QaXUBWADsGQ1WObzOYBOoGHK7+vTjy0LhX4mpdRXgJ8WuTmLZVn/mc+F1roz/f9epdTDpIZ/eQOMDJEKoJSqSE/WoZRaA6wHLi5tq+blJ8DrlFJWpVQzqc+xf4nbVBClVM2U395PaiJ7JXgOWK+UalZKWUhNsv9kids0Z0opp1LKNfFr4Pco4O/guuvB5KOUuh/4R6AC+JlS6ojW+h7gduCjSqkYkATerrUeXMKm5pXrc2itTyil/h04CcSBd66gFaRPKqV2kRoitQJvW9LWFEhrHVdKvQv4JWAEvq61PrHEzZqPKuDhVCVpTMC3tdaPzHaTHBUQQhSNDJGEEEUjAUYIUTQSYIQQRSMBRghRNBJghBBFIwFGCFE0EmCEEEXz/wE6u2h3vkVT1gAAAABJRU5ErkJggg==", + "image/png": "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69L4tYyJ0oEjUSIiIokYRImIiCRiECUiIpKIQZSIiEgiBlEiIiKJGESJiIgkYhAlIiKSiEGUiIhIIgZRIiIiiRhEiYiIJGIQJSIikohBlIiISCIGUSIiIokYRImIiCRiECUiIpKIQZSIiEgiBlEiIiKJGESJiIgkYhAlIiKSiEGUiIhIIgZRIiIiiZIKoo899hiqq6thMplgMplQW1uLV199ddh1oihi/fr1EAQBL730Urr6SkRENKUkFUQLCwvx4IMPoq6uDrt378Yll1yCq6++GgcPHhxy3SOPPAJBENLaUSIioqlGkczFV1111ZDvH3jgATz22GN4//33sXDhQgDAvn378MMf/hC7d+9GXl5e+npKREQ0xSQVRM8WDofxwgsvwO12o7a2FgDg8Xjwuc99Do8++ihyc3MTasfv98Pv98e+dzqdUrtEREQ0oZLeWFRfXw+DwQC1Wo3bbrsNW7duRVVVFQDgnnvuwZo1a3D11Vcn3N6WLVtgNptjX0VFRcl2iYiIaFIkPRKtqKjAvn374HA48OKLL2LDhg146623cOLECfz973/H3r17k2pv8+bN2LRpU+x7p9PJQEpERNOCIIqimEoDa9euxdy5c6HVavGTn/wEMtmHg9twOAyZTIYLLrgA27ZtS6g9p9MJs9kMh8MBk8mUSteIiIiSlkwckrwmOigSicDv9+P+++/Hv/3bvw352eLFi/Hwww8P25BEREQ0EyQVRDdv3oz169ejuLgYLpcLzzzzDLZt24bXXnsNubm5cTcTFRcXo6ysLG0dJiIimiqSCqJdXV246aab0N7eDrPZjOrqarz22mu47LLLxqt/REREU1ZSQfTJJ59MqvEUl1uJiIimNObOJSIikohBlIiISCIGUSIiIokYRImIiCRiECUiIpKIQZSIiEgiBlEiIiKJGESJiIgkYhAlIiKSiEGUiIhIIgZRIiIiiRhEiYiIJGIQJSIikohBlIiISCIGUSIiIokYRImIiCRiECUiIpKIQZSIiEgiBlEiIiKJGESJiIgkYhAlIiKSiEGUiIhIIgZRIiIiiRhEiYiIJGIQJSIikohBlIiISCIGUSIiIokYRImIiCRiECUiIpKIQZSIiEgiBlEiIiKJkgqijz32GKqrq2EymWAymVBbW4tXX30VANDX14c777wTFRUV0Gq1KC4uxl133QWHwzEuHSciIppsimQuLiwsxIMPPoh58+ZBFEU8/fTTuPrqq7F3716Iooi2tjb84Ac/QFVVFRobG3Hbbbehra0NL7744nj1n4iIaNIIoiiKqTRgs9nw0EMP4dZbbx32sxdeeAGf//zn4Xa7oVAkFq+dTifMZjMcDgdMJlMqXSMiIkpaMnEoqZHo2cLhMF544QW43W7U1tbGvWawA6MFUL/fD7/fH/ve6XRK7RIREdGESnpjUX19PQwGA9RqNW677TZs3boVVVVVw67r6enBd77zHXzhC18Ytb0tW7bAbDbHvoqKipLtEhER0aRIejo3EAigqakJDocDL774In75y1/irbfeGhJInU4nLrvsMthsNrz88stQKpUjthdvJFpUVMTpXCIimhTJTOemvCa6du1azJ07F0888QQAwOVyYd26ddDpdPjzn/8MjUaTVHtcEyUiosmUTBxK+ZxoJBKJjSSdTicuv/xyqFQqvPzyy0kHUCIioukkqY1Fmzdvxvr161FcXAyXy4VnnnkG27Ztw2uvvRYLoB6PB7/73e/gdDpjm4SysrIgl8vH5QUQERFNlqSCaFdXF2666Sa0t7fDbDajuroar732Gi677DJs27YNO3bsAACUl5cPed7p06dRWlqatk4TERFNBSmviaYb10SJiGgyTeiaKBER0WzFIEpERCQRgygREZFEDKJEREQSMYgSERFJxCBKREQkEYMoERGRRAyiREREEjGIEhERScQgSkREJBGDKBERkUQMokRERBIxiBIREUnEIEpERCQRgygREZFEDKJEREQSMYgSERFJxCBKREQkEYMoERGRRAyiREREEjGIEhERScQgSkREJBGDKBERkUQMokRERBIxiBIREUnEIEpERCQRgygREZFEDKJEREQSMYgSERFJxCBKREQkUVJB9LHHHkN1dTVMJhNMJhNqa2vx6quvxn7u8/mwceNGZGRkwGAw4Nprr0VnZ2faO01ERDQVJBVECwsL8eCDD6Kurg67d+/GJZdcgquvvhoHDx4EANxzzz3405/+hBdeeAFvvfUW2tra8KlPfWpcOk5ERDTZBFEUxVQasNlseOihh/DpT38aWVlZeOaZZ/DpT38aAHDkyBEsWLAA27dvx3nnnZdQe06nE2azGQ6HAyaTKZWuERERJS2ZOCR5TTQcDuPZZ5+F2+1GbW0t6urqEAwGsXbt2tg1lZWVKC4uxvbt20dsx+/3w+l0DvkiIiKaDpIOovX19TAYDFCr1bjtttuwdetWVFVVoaOjAyqVChaLZcj1OTk56OjoGLG9LVu2wGw2x76KioqSfhFERESTIekgWlFRgX379mHHjh24/fbbsWHDBhw6dEhyBzZv3gyHwxH7am5ultwWERHRRFIk+wSVSoXy8nIAwIoVK7Br1y78+Mc/xvXXX49AIAC73T5kNNrZ2Ync3NwR21Or1VCr1cn3nIiIaJKlfE40EonA7/djxYoVUCqVePPNN2M/O3r0KJqamlBbW5vqbYiIiKacpEaimzdvxvr161FcXAyXy4VnnnkG27Ztw2uvvQaz2Yxbb70VmzZtgs1mg8lkwp133ona2tqEd+YSERFNJ0kF0a6uLtx0001ob2+H2WxGdXU1XnvtNVx22WUAgIcffhgymQzXXnst/H4/1q1bh5///Ofj0nEiIqLJlvI50XTjOVEiIppME3JOlIiIaLZjECUiIpKIQZSIiEgiBlEiIiKJGESJiIgkYhAlIiKSiEGUiIhIIgZRIiIiiRhEKa5Opw8v7W2d7G4QEU1pDKIUV7vDh3eOd2N3Q99kd4WIaMpiEKW4yjL1eGlfG5r7PZPdFSKiKSvpeqI0sx3pcOIPdS040uFCtlGNq5cUTHaXiIimLAZRAgAcanPixboWPLerCe5AGABg1iohkwmT3DMioqmLQZTQO+DHZ3/xPhze4JDHK3ONk9QjIqLpgWuihBfrWoYFUItOibvXzp+kHhERTQ8ciRI6nD4AgEwAyrMN+PSKQnz+vBLoVPz1ICIaDf9KznL97gBe2tsKlUKG/7t9DRYVmCe7S0RE08asCqKBUATf/+sR5Fm06B3w47aL58KkUU52tyaVRafEC7etQZvdywBKRJSkWRVEt7x6GE+92xD7vrrQjCsW5U1eh6YAQRBQnm1AebZhsrtCRDTtzKqNRad73EO+/+37jZPUk8kXCkfw+x2N+OZLB9Dl8k12d4iIpqVZNRLdUFuKbUe7Y99/bPHsHYW+cqAD/7X1AAAgFIlgy6eqJ7lHRETTz6waia4qsyHbqI59n2VQj3L1zLansT/23429TO1HRCTFrAqiBrUC//qRstj33mB4wu4dCEUm7F6JeP9Ub+y/1YpZ9WtARJQ2s2o6F4hO6f7yn6egkMlw6YKccbtPh8OHx986iWOdLoQjItyBEP585wXjdr9kvHGoE0c6XLHvM2bxiJyIKBWzLohqVXIsLbJieYkFBvX4vHyHJ4jLfvQWXP4QAOD6lUX42vrKcbmXFD/fdmLI9xdXZE1ST4iIprdZF0QBYNNl85Fr1oxL2w5vEDf/emcsgK5flIv/9+mps2nnneM92NNkH/LYgjzT5HSGiGiam5VBtCo/9aARCEWglEcrnBxud8HuCeDNI114tb4dbY7okZGPVmThR9ctTfle6fTAK4eHPdbc58HcLJ4TJSJK1qwMoqnafrIXd/7vXlTmGuH0BfFBi2PYNeXZBvzq5lUQhKlTSqzV7sXhdueQx3JMalw0n9O5RERSMIhKMDdbD4VMwDsneka8RiETplQABYBfvH1q2GM3rymbcv0kIpoueLZBgmyjBrddNGfUa26sLZmg3iTu3FGoUi7g49WzN+EEEVGqOBIdQb87gD990Iblxda4idlryjJGfK5Zq8SnlhWOZ/eS1tTrwb5mO4xqBS5bmINF+WZ8ZF4mimy6ye4aEdG0ldRIdMuWLVi1ahWMRiOys7NxzTXX4OjRo0Ou6ejowI033ojc3Fzo9XosX74cf/jDH9La6Ynw/deO4r//eBCf+Nk7+OmbxxGJiEN+XpVvwmdriuM+tyLXCK1KnvC9whERz+5swqnuAfiCYYiiiD/tb4MvTckgjnQ4seGpnbjl/DL8bdOF+NF1S/GvHynD/BxjWtonIpqtkhqJvvXWW9i4cSNWrVqFUCiE//zP/8Tll1+OQ4cOQa/XAwBuuukm2O12vPzyy8jMzMQzzzyD6667Drt378ayZcvG5UWMh6a+aLL6iAj88PVjWFRgxkcrs4dc84UL5+AvH7TB6QsNeXxDbWlS9/IEQvjGSwcQOhOoM/QqzM024Kol+ZL77/AG4fIF8fsdTXjyndP49wvK8JV1U+esKhHRTJDUSPSvf/0rbr75ZixcuBBLlizBr3/9azQ1NaGuri52zXvvvYc777wTNTU1mDNnDr7xjW/AYrEMuWY6WHtWNqP5OQYsjHMspixTj/++auGQx76+vhJXJrnOWN/iiAVQAOh1B1Df4kD4nNFvMl6sa8Gj/ziJ53c147KqHHzp0vmS2yIiovhSWhN1OKJHO2w2W+yxNWvW4LnnnsOVV14Ji8WC559/Hj6fDxdffHHcNvx+P/x+f+x7p9MZ97qJdvOaUpi1SjT0uHHL+WWw6lVxr7tiUS6++5dDWFVqw/lzM7BhTWlS99lxqhf3PL9v2OPeYBgv1jXj+lXxp4zHcuuZHMFbPrVY0vOJiGhskoNoJBLB3XffjfPPPx+LFi2KPf7888/j+uuvR0ZGBhQKBXQ6HbZu3Yry8vK47WzZsgX333+/1G6MG0EQ8KnlY28OMqgVeH/zpdAoE18DHRQKR/C5X+4YccR5uN0V93EiIpoaJB9x2bhxIw4cOIBnn312yOPf/OY3Ybfb8cYbb2D37t3YtGkTrrvuOtTX18dtZ/PmzXA4HLGv5uZmqV2aNFICKADIZQJkoxzRNGq4eZqIaCqT9Ff6jjvuwJ///Ge8/fbbKCz8cLR28uRJ/OxnP8OBAwewcGF0rXDJkiX45z//iUcffRSPP/74sLbUajXU6tlZRUQQBCwrtmLn6b64Py+waCe4R0RElIykRqKiKOKOO+7A1q1b8fe//x1lZWVDfu7xRIs7y2RDm5XL5YhEJr+e5iv17bj60XfRO+Af++IJ8pV1FTDGqSZTlqnHRayuQkQ0pSUVRDdu3Ijf/e53eOaZZ2A0GtHR0YGOjg54vV4AQGVlJcrLy/HFL34RO3fuxMmTJ/HDH/4Qr7/+Oq655prx6P+YXL4g+t0BfNBix70v7Eeb3Qu1xOnX8bCq1IbHPr8C2jN90ihl+MyKQvxyw0rkmTkSJSKaygRRFBM+RzFSjtWnnnoKN998MwDg+PHj+PrXv4533nkHAwMDKC8vx7333osbb7wxoXs4nU6YzWY4HA6YTKlXW7nv5YP49XsNUMgEhCIivnHlAvzbBaOn7JsM/e4A6lsd0CjlqCmzjf0EIiIaF8nEoaSC6ERIdxB1+oJ462g3XqxrQUu/B69+6UKoFEwZTERE8SUTh2b89k+TRomrluTjo5XZqGvsZwAlIqK0mTURxaBWsG4mERGl1awJokREROnGIEpERCQRgygREZFEDKJEREQSMYgSERFJxCBKREQkEYMoERGRRAyiREREEjGIEhERScQgSkREJBGDKBERkUQMokRERBIxiBIREUnEIEpERCTRlKsnOlgj3Ol0TnJPiIhoNhqMP4PxaDRTLoi6XC4AQFFR0ST3hIiIZjOXywWz2TzqNYKYSKidQJFIBG1tbTAajRAEYbK7MyU5nU4UFRWhubkZJpNpsrsz7fH9TD++p+nF9zP9RntPRVGEy+VCfn4+ZLLRVz2n3EhUJpOhsLBwsrsxLZhMJv4PlUZ8P9OP72l68f1Mv5He07FGoIO4sYiIiEgiBlEiIiKJGESnIbVajW9961tQq9WT3ZUZge9n+vE9TS++n+mXrvd0ym0sIiIimi44EiUiIpKIQZSIiEgiBlEiIiKJGESJiIgkYhCdZh544AGsWbMGOp0OFosl7jWCIAz7evbZZye2o9NEIu9nU1MTrrzySuh0OmRnZ+MrX/kKQqHQxHZ0GistLR32+/jggw9OdremlUcffRSlpaXQaDRYvXo1du7cOdldmpbuu+++Yb+LlZWVKbU55TIW0egCgQA+85nPoLa2Fk8++eSI1z311FO44oorYt+PFCBmu7Hez3A4jCuvvBK5ubl477330N7ejptuuglKpRLf+973JqHH09O3v/1t/Pu//3vse6PROIm9mV6ee+45bNq0CY8//jhWr16NRx55BOvWrcPRo0eRnZ092d2bdhYuXIg33ngj9r1CkWIYFGlaeuqpp0Sz2Rz3ZwDErVu3Tmh/pruR3s9XXnlFlMlkYkdHR+yxxx57TDSZTKLf75/AHk5fJSUl4sMPPzzZ3Zi2ampqxI0bN8a+D4fDYn5+vrhly5ZJ7NX09K1vfUtcsmRJWtvkdO4MtXHjRmRmZqKmpga/+tWvEirpQ8Nt374dixcvRk5OTuyxdevWwel04uDBg5PYs+nlwQcfREZGBpYtW4aHHnqI0+EJCgQCqKurw9q1a2OPyWQyrF27Ftu3b5/Enk1fx48fR35+PubMmYMbbrgBTU1NKbXH6dwZ6Nvf/jYuueQS6HQ6/O1vf8N//Md/YGBgAHfddddkd23a6ejoGBJAAcS+7+jomIwuTTt33XUXli9fDpvNhvfeew+bN29Ge3s7fvSjH01216a8np4ehMPhuL+DR44cmaReTV+rV6/Gr3/9a1RUVKC9vR33338/LrjgAhw4cEDyEgNHolPA17/+9bibgc7+SuZ/mG9+85s4//zzsWzZMnzta1/DV7/6VTz00EPj+AqmlnS/nzRcMu/xpk2bcPHFF6O6uhq33XYbfvjDH+KnP/0p/H7/JL8Kmm3Wr1+Pz3zmM6iursa6devwyiuvwG634/nnn5fcJkeiU8CXv/xl3HzzzaNeM2fOHMntr169Gt/5znfg9/tnRe7NdL6fubm5w3ZCdnZ2xn42W6XyHq9evRqhUAgNDQ2oqKgYh97NHJmZmZDL5bHfuUGdnZ2z+vcvXSwWC+bPn48TJ05IboNBdArIyspCVlbWuLW/b98+WK3WWRFAgfS+n7W1tXjggQfQ1dUV2wn5+uuvw2QyoaqqKi33mI5SeY/37dsHmUzGnaUJUKlUWLFiBd58801cc801AIBIJII333wTd9xxx+R2bgYYGBjAyZMnceONN0pug0F0mmlqakJfXx+ampoQDoexb98+AEB5eTkMBgP+9Kc/obOzE+eddx40Gg1ef/11fO9738O99947uR2fosZ6Py+//HJUVVXhxhtvxPe//310dHTgG9/4BjZu3DhrPpSkYvv27dixYwc++tGPwmg0Yvv27bjnnnvw+c9/HlardbK7Ny1s2rQJGzZswMqVK1FTU4NHHnkEbrcbt9xyy2R3bdq59957cdVVV6GkpARtbW341re+Bblcjs9+9rPSG03rXl8adxs2bBABDPv6xz/+IYqiKL766qvi0qVLRYPBIOr1enHJkiXi448/LobD4cnt+BQ11vspiqLY0NAgrl+/XtRqtWJmZqb45S9/WQwGg5PX6Wmkrq5OXL16tWg2m0WNRiMuWLBA/N73vif6fL7J7tq08tOf/lQsLi4WVSqVWFNTI77//vuT3aVp6frrrxfz8vJElUolFhQUiNdff7144sSJlNpkKTQiIiKJuDuXiIhIIgZRIiIiiRhEiYiIJGIQJSIikohBlIiISCIGUSIiIokYRImIiCRiECUiIpKIQZSIiEgiBlEiIiKJGESJiIgkYhAlIiKS6P8DsWpGF3/Z9tIAAAAASUVORK5CYII=", "text/plain": [ - "<Figure size 432x288 with 1 Axes>" + "<Figure size 640x480 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1344,7 +1342,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 56, "metadata": {}, "outputs": [ { @@ -1353,20 +1351,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 22, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "<Figure size 576x576 with 1 Axes>" + "<Figure size 800x800 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1385,7 +1381,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 57, "metadata": {}, "outputs": [ { @@ -1394,20 +1390,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 23, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "<Figure size 432x288 with 1 Axes>" + "<Figure size 640x480 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1425,14 +1419,14 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 58, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/var/folders/yk/yj8t31wd1sd_9w0f9cfg5jv80000gn/T/ipykernel_82121/127064943.py:6: ShapelyDeprecationWarning: Iteration over multi-part geometries is deprecated and will be removed in Shapely 2.0. Use the `geoms` property to access the constituent parts of a multi-part geometry.\n", + "C:\\Users\\bryan\\AppData\\Local\\Temp\\ipykernel_31064\\127064943.py:6: ShapelyDeprecationWarning: Iteration over multi-part geometries is deprecated and will be removed in Shapely 2.0. Use the `geoms` property to access the constituent parts of a multi-part geometry.\n", " for item in splitted_geom:\n" ] }, @@ -1442,20 +1436,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 24, + "execution_count": 58, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABH4AAAJNCAYAAABHi7IgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOzddXhb99XA8e8Vg5kZ4zBz0iaFNG3KK66wwoqjbmvXUd8xr1u3roNuZWZmStIwM9mxY2ZGsXTfP5y6dQ0xSJZjn8/z9EksXThObUn33PM7R1FVFSGEEEIIIYQQQggx9miCHYAQQgghhBBCCCGECAxJ/AghhBBCCCGEEEKMUZL4EUIIIYQQQgghhBijJPEjhBBCCCGEEEIIMUZJ4kcIIYQQQgghhBBijJLEjxBCCCGEEEIIIcQYpRvJk8XExKgZGRkjeUohhBBCCCGEEEKIMW3Xrl31qqrG9vbciCZ+MjIy2Llz50ieUgghhBBCCCGEEGJMUxSlpK/nZKmXEEIIIYQQQgghxBgliR8hhBBCCCGEEEKIMUoSP0IIIYQQQgghhBBjlCR+hBBCCCGEEEIIIcYoSfwIIYQQQgghhBBCjFGS+BFCCCGEEEIIIYQYoyTxI4QQQgghhBBCCDFGSeJHCCGEEEIIIYQQYoySxI8QQgghhBBCCCHEGCWJHyGEEEIIIYQQQogxShI/QgghhBBCCCGEEGOUJH6EEEIIIYQQQgghxihJ/AghhBBCCCGEEEKMUZL4EUIIIYQQQgghhBijJPEjhBBCCCGEEEIIMUZJ4kcIIYQQQgghhBBijJLEjxBCCCGEEEIIIcQYJYkfIYQQQgghhBBCiDFKEj9CCCGEEEIIIYQQY5QkfoQQQgghhBBCCCHGKEn8CCGEEEIIIYQQQoxRkvgRQgghhBBCCCGEGKMk8SOEEEIIIYQQQggxRumCHYAQQgxXs81FeZMdm8tLh9NDh8vT+afTi0Gn4StzkgkxysudEEIIIYQQYvyRKyEhxElty7EGbnhsOy6vr9vjERY90VYDMSFGvjInOUjRCSGEEEIIIURwSeJHCHFSU1H55UVTSY4wExdqIibEQKTVgF7rv5WstW0O3tpbyeGqViqb7Tg9PsJMeiIteiIsBiIseqKsBi6bm4JVKouEEEIIIYQQo4hcoQghTmpLs2NYmh0T0HPEhZq4ZVkWTo+Xjw7VkF/TRl27E5vLS2WznWN17UxNCkMNaBRCCCGEEEIIMXiS+BFCnBSabS6e2FyMw+3D4fZytKYNnVbDv66ZQ5hJPyIxGHVaLpyVNCLnEkIIIYQQQgh/kMSPEGJUU1WVTQUN3P3yPqpbHT2en//bT8iOCyEu1MikhFDuPGsiZoM2CJEKIYQQQgghxOgjiR8hxKjU0O7kj+/n8mleHfXtzj63u3BWElmxViItBiYlhFLTauf5HWUcqmhFp1W4dG4KF0mVjhBCCCGEEGKcksSPECLo3F4ftzy5kyNVrURaDGTGWNlV2kRdW98Jn8+Em/V86/RsFEUBwOH2sjAjiuQIMw3tLhxuLz6fikajBPrbEGJcaHd6yKtuxen24fR0TtNbkh2NSS+VdkIIIYQQo5EkfoQQQafXarjp1Ez+vaaAxAgT2bEhxIcZeXlXObGhRq5bnI5eq+HV3eXsL2/p2k+rUdBpuyd0THotK6bEj/S30IPD7SWvuo26NifhFj0zksPlwlj4jcPt5dXd5bTaPRh1Ggw6zRf+1BJh0RMTYiQ71tqVFPUHn0/l9+8e4fntpd0eX5YTw4/Omcy0pDBJsgohhBBCjDKKqo7cHJr58+erO3fuHLHzCSEGp7CunV+/fZg9pU2cOz2RP18+0+/n6HB6yKtpY1pSGEbd4BMhZY021h2tIynCxJzUSAw6Dfm17cxKCR/WBa7Xp+Jwe7G7vei1GsLNQ28Y3e70cNZ967r1JDLpNVw8K5l7zptCuGVkmlGLsetgRQs/emU/jR0uGjtcuLy+HtukR1t49Ib5TIgLHfJ5WuxuyptsNHa42F/ewht7Ksivbe9z+wUZkfzhkhnkxA/9nEIIIYQQYvAURdmlqur83p6Tih8hRJeEcBMT40NIijDx/bMm+v34Pp/K91/cy8eHazDrtSzMjGJZTgynTIghJsSI0+PF5fHh8vqIshqICzX1OIaigNWoRafR8PimIp7cUkKL3U1MiIHZqZGcNyOBS+Yk95sEcnq8rMur4539VWwqqKfN6cHl+fzCOTPGykd3Lkev1Qzp+3zvQFWPRtQOt48Xd5bRZHPx0PW9vh4LMWDTk8N573vLgM4G6O1OD40dLho6XDS2u9Bo4LSJcWgHWH3T5nCzv7yFdqeHqmY7hypb2VLYQHmTfVBx7Shu4qJ/bWLt3aeTEN7z91cIIYQQQow8qfgRQoyYF7aX8pPXDgx4++QIMxfMSuTahemkRVsAWH2khtue3oXX1/dr1x1nTuAHZ0/q8/n3D1Tx5t5KShpt1LQ6aOxwEWLUkR1r5cJZSXxlTjIxIcZ+Y2t1uHlnXxUN7U7anB5sLg9eH1S32NlW1IjN5e11vxnJ4bz57VNkOcwwtdjdfJpXS5vDQ7vTg93lJSbEQGK4mey4EDJjrMEO8aRgc3n4wUv7+ORIDW6v/z4PhJv1/OuaOZw6IcavS82EEEIIIUTv+qv4kcSPEONUUX0He8uaOFDeysGKFkoaO4iyGokJMeD2+siKDeE7Z0wgKcI87HMdqmzhtd0VfHKkhpIG25COccqEaFZOiefMyfG02N3sLW9mbW4ta3Jre2yr1yq8cNti5qVHDejYLo8P/fFeQbVtTvaWNVNY14HFoCUl0szctEgirQYAqlrsvLyznMc2FdFscw/qe0gKN3HnyolcOjdlwJUYoqcWu5vLHtxMQS9LjnQahaxYKy/fvlSW1J3AyzvL+NfagiH/Tg5ERrSFS+emcMmcZFKjLAE7jxBCCCHEeCeJHyHGILfXx4s7yvjocA27ihvRaBSmJoYxJTEMo15Dq92NxaDj4tlJzEyJ6NqvoLad7zy3m9zqthOew6TXcNvybL5xWhYWw9BXhq4/Wsfz20spqG2nqsVBu9Mz5GMB5MSFcNGsJG5fnsXP3zzEJ0dqaOhwdT2v0yg8csN8Tp8UB3QuhfnnmgLeP1hNi82F26dy1YJUUiLNVDY7KG20UVjXTmFdB229xJYda+XjO0/D5fVx0xM72HysYcCx6jQKi7KiWDUtgSvmp0qDZz9oaHfywo4yrAYtUSFGoq0GoqwGoq0GokOMklQbgF0ljVz+3y3oNRpiQ420Ody0Oob3e3kiOXEhJEWYuXh2EpfOTQnouYQQQgghxhtJ/AhxklJVlfp2F8UNHRTVd1DaYKO2zUF9u4u86jYqmj/vvxFtNfCfa+eyt6yZ+z462tXsVatR+Pc1c1k1PQGAX711iCc2Fw8qjvgwI2dOjuOulZOIDe1/CdSJ2FweXt9TQYhRR4hRR1F9BzuKG9lc0NBr0uWLrAYtCzKjWJIVzYopcd2a1jZ1uPD4VHQahXCzvttSqqF8z180PTmMd+74vJ/KlsIGnt5Swu7SJpweH5EWA7GhRuJCjcSHmYgLNRIXZiQu1MSMlHDCTFJ5IkYfh7tzOeLfPz7KwxsK6Wf1pF9lxlhZe/fpI3MyIYQQQohxQpo7C3GSKKxr5539VeTXtlNc30Fxfe8VKF82Ny2C/103n9hQI4uyolkxJZ7Nx+oprrdR0tBBdUv3BNFgGHQaZiSHMyc1sms51HBYDDquXZTe7bFblmVR3mTjN28fpqrFgVajoNcqRFkNpEZaSI2yMDMlnBnJ4ej6aLgc2cf3VVzfMaykD8APz5nc9XdFUViaHcPS7JhhHVOIYDNoNdzx/B7ePVAV0PMkR5i5bkk6KZFm0qIszEgOD+j5hBBCCCFEd5L4EWIUibYaOX1SLB6vj6pmO2aDllmpEXh9nVUmn5mVEk5mjJUws57vrsghzKTHoPs8IZIWZcGoi2OLvoGrF6Z2G61sc/fedPiLDDoNZr2W82YkcM95UwgdRsXK3z8+Sn5tG2dNiWdZTmyfFUMpkZaATLvaXtw4pP3OmhLPPedNJinCLMuzxJhT0+rgrpf2sqlg4MsWh0JR4NEb5zM5ISyg5xFCCCGEEH2TxI8Qo0i4Rc9MSwQzUyK46wuP17Y5WPHXdTg8Xk6bGMu/rpnbIxmRV93GE5uL2VhQR1nj5xU+eq3CkuwYPF4fDreXvWXNXc/pNAp3rpzI1MQw0qMtxIWZMOu1fu2RUtvm5L0D1bx3oJrL56Xw1ytmDflYL2wvxeH2EhNqJMykR6/VYNAp6LWa43/XkBJpxqj7/N/mjElxXDInmTf2VqCqnVUO8zMimZoYxp6yZvaUNnUtcQkx6vjpeZM5dUIMaVEWmUYkxgRVVVl3tI6jNW2UNNjYX97CkapWPCOwtktVYeuxBkn8CCGEEEIEkfT4EeIk4XB7Meo03ZIRLo+Pjw5X8/z20kHduddpOpMlK6bE8dcrZg27osXnU3nnQBU1LQ48PpWvLkgl6gtLrxo7XOwpbeKUCTHDOtfBihau/N+WPkelQ2eia0piGHNSI7hsXkpXY+uShg6cHh9pUZZuMTTbXBysaKWm1cHc9EgZAy7GlLJGGz94ad+QK9/8IdpqYOOPz8RskMo5IYQQQohAkR4/QowBX0xWlDXaeGZbCa/sLO82zaovmTFW/nXNHCbEhaDXaLo1Ph6uNoeb37x9mJd3lXc9tvpIDXeunMjCzCj0Wg1RVgMrpsT32LfD6WF1bi05cSFMSeysCFBVlV++dQiNomA2aDHqNLy+p4IOp5frl6QzNy2SjQX1PY4VYtRx6oQYIq0Gwkw6Qk069pU1kxFjJcykJz2694ROhMXAqTnSr0eMTY9tKgpq0gegocPF917YwwNXz5Flk0IIIYQQQTCgxI+iKHcCtwAqcAD4OpAIvABEA7uA61RVPfEVqBBi2HRahdIGW7ekzykTokmJsGBze/n4cDUOt6/rubJGG994Zhf3XjaLJdnR3Y5V1mij3ekhwqInMdw84BiK6zv4+hM7KKrv6PHczpImrn1kG4uzonj4+vm99ghSVZVfvXWImjYnl81N7kr8KIrCq7vK6eilqmd/eTMzU8J7TfxcPDuJ318yY8DxCzEe3LlyIlMSwzhc2cravFpKGmwjcl6DVkNcWOeUu4QwE9cvSZekjxBCCCFEkJxwqZeiKMnARmCqqqp2RVFeAt4DzgNeU1X1BUVR/gvsU1X1wf6OJUu9hPCvT/NqqWl1kBZlZUl2NA3tTu7/JJ8Xd5R1jXNfmh3NhbOS2FhQz7WL0rqmUTXbXNz98n4+OVIDdE7eefM7pxATMvBx7W6vj+L6DtYdrcPp8WHUaTAbtJj1WnLiQpmRMrjpPaqq8uGhGr793G68vfQfuXFpBlctTOWah7fReDzppVHgeysmcv2S9D4newkhwOnx8vSWEvaUNrO/orlbL7CBMGg15MSHEBNiJMysJ8ykI8ysJ9SkIyakM8kTH2YkPtREhEWPT4XKZjtljTYabS5a7G70Wg0XzUqSJJAQQgghhJ/1t9RroImfrcAsoBV4A/gn8CyQoKqqR1GUJcCvVFU9p79jSeJHiMBak1vD2tw6JsaHcMHMJDYdq2d+ehQJ4aZetz9U2cIzW0tpdbi57wu9ftqdHt4/UIVWo3DGpLgRS6gcqWrlma0ltDk82FwevD4Vj0/Fp6p4fSrfPTOHpRNiUFWV8iY7+bVtZMeG9LqMy+dTya1uY0thA1sLG3B6fFw2N5mLZyePyPcixGihqmqvjcqbOlwcrGxha2EDq4/Uklvd1mObKYlhXLUglbOnxRMTYuTd/VUkR5qZnx7JY5uK2XKsAZfXh0mnITrESF2bE1VVKWm0Udpow+Xx9ThmcoSZ/103j+lfGOveV4xCCCGEEGJghpX4OX6A7wG/B+zAR8D3gK2qqk44/nwq8L6qqtP7O44kfoQYnVRV5dOjdXx0qIbtRQ2UNtpweztfG6YmhvHmd05Br9Wc4Cijy4OfHuPPH+R2eyzUqGPtD08fVFWTECebkoYOfv32YXYWN9Lu9OBTOxu6m/RaUiLNLMqMYl5GFFkxVlKjLISbO5diVjTbWZNbS3WLnfgwEyumxJMcYUZVVXaXNvPYpiLe3V8FQEa0heIhLhszaDX84dIZXD4vBYC391Xy/Rf3YtFrSQg3kR5t5ZQJ0Vy9ME0qg4QQQgghBmi4FT+RwKvAV4Fm4GXgFTorfE6Y+FEU5TbgNoC0tLR5JSUlQ/9OhBABU9fm5KPD1RytbsOg03SNSLe7vaRHW7h2UXqwQxy04voOntteSrhZz9SkMBZmRGE1Sk97MbZtPlbPNQ9vG/D24WY9qVFm0qIsTE8O5/SJcUxN6uy51dDu5KqHtpJf2+63+H5y7mRuW5bVtTz07lf28druih7bpUaZuWpBGl+Zk0xyxMD7jwkhhBBCjEfDTfxcAaxSVfXm419fDywBrkCWegkhhBCjzu7SJu77KI+thY299svqS3KEmSdvWsiEuBAA/vNpAfd+kOe3uC6dk8yty7P4wUv7KKhtJy7MSHlT/72GQow6Hr5+fo/G9EIIIYQQ4nPDHedeCixWFMVC51KvFcBOYC1wOZ2TvW4A3vRPuEIIIYQYjrlpkTx7y2KaOly8ta+Sh9YXUtHce4JFp1E4Z1oCVy1MZXFWNHqtBpvLw18/PMpjm4r8GpdPVbnu0e3UtzsBTpj0gc6eY2/tq5DEjxBCCCHEEA20x8+v6Vzq5QH20DnaPZnOpE/U8ce+pqqqs7/jSMWPEEKMby02NyaDBqNOereMJLfXx9v7Ktla2ECbw4PVqCMpwsyUhFCWTojp6vNT0tDBuweqeGZLCZUtjiBH3WleeiQXz07C41W5bG4K4RZ9sEMSQgghhBh1ht3c2V8k8SOEEOPb/9Yd44nNxaRGWtBoYGZKBDOSw5mZEk5alEUmOwVJVYud7z6/hx3FTcEOpYdHb5hPbnUbaVEWLpiZKD8jQgghhBC9GO5SLyGEEMIvbj8tm6sWpnGgvIW9ZU3c9/FRFMCk15IQZmLl1HhuPy2bKKsh2KGOG4cqW7jpiR3UtPZbtBs0OXGhrJgSH+wwhBBCCCFOWlLxI4QQImhUVZUKjiCzu7x8mleLw+PF7vJR3ergQHkzu0ubabG7gxpbYriJLT9dMaR93V4f24saiQ8zkRVjRaORnzMhhBBCjF1S8SOEEGJUkqRP8JkNWs6dkdjjcZ9P5WdvHuS5baVBiKqTXqsZ8LY+n8oLO8qIsupZNT2RV3eV85PXDgCdI+vPnhrPHWfmkBZtCVS4QgghhBCjkiR+hBBCCNGDRqPwvRU5rDlSS3XryDV6vmFJOnqthsoWOzefmjng/Y5Ut3LP6wfQaxUevFZDmPnzJtAtdjdv7avEatTxywunSsJRCCGEEOOKLPUSQgghRJ8Katv52RsH2FrYOGLnPHtqPA9cPQeT/sTT3w5WtPB/bxzkUEULHl/fn2l+c/E0rl+S4ccohRBCCCFGj/6Weg28hloIIYQQ486EuBB+ddE04kKN3R6PshoIVOHMR4dr+PrjO3hjTwV1bX03nW53evjWs7vZV9bcb9LHpNdwxbzUrq/3lDbx67cPcc3DW/npa/txuL1+jV8IIYQQYjSRpV5CCCGE6NfkhDDW/+gMNuTXU1DbztLsaGamhPPCjjJ+eryPjqJAiEFHm9Pjl3NuKWxgS2EDCzOieOkbS3rdJq+6jdJG2wmP9e3TJ1Db5uCRDUUcqWplZ8nnY+s3H2vAYtDxs/OnyBIwIYQQQoxJstRLCCGEEEPW5nCjURQsBi2KotDY4aKqxU5xvY1fvnWI+vbhjYmPtOhZ96MzCDPpuz1e2+pgxX3rTphoyo618vI3lnLpfzZR3NB3kigmxMCirGj+dOkMQr90LiGEEEKI0U6WegkhhBAiIEJNeqxGXVe1TJTVwLSkcM6fmcjau0/jFxdMZWJ8yKCPq1E6Gz2vvfv0HkkfgPza9gFVF91xZg63PrWz36QPQH27i3f3V7G/vAUAh9vLSN4cE0IIIYQIFKn4EUIIIUTAlTfZKKzroLbNSbvDjcPjY29pMy6vj+xYKxkxViItBkKMOkJMOlIizcSFmnocp7TBxqHKFkwGLd98ZhcOt6/f8+o0Sr/9f75MUSAmxEhdm5OkcBP3Xj6LU3NiBv39CiGEEEKMpP4qfqTHjxBCCCECLiXSQkqkZVjH2FXSyLWPbDthsueLBpP0AVBVuhpKV7Y4+MWbB/nkrtPQaKT/jxBCCCFOTrLUSwghhBAnhd+8fXhQSR9/KKzv4EBFy4ieUwghhBDCnyTxI4QQQohRz+H2nrBPT6DU9jNSXgghhBBitJPEjxBCCCFGvfs/yafF7h7x885OjWBOWsSIn1cIIYQQwl+kx48QQgghRjWXx8cLO0pH9JwWg5YfnTOJ65ZkoJX+PkIIIYQ4iUniRwghhBCjltPj5c/v59FsC1y1T1qUheUTY5iXHkl8qIlWh4c5aRHEh/WcKvZFudWt/G9dIdcuSmN+RlTA4hNCCCGEGA5J/AghhBBiVDpQ3sKdL+2loLZ9SPuHmXTEhhqpbXWCAt8+YwKRFj2KoqBRFHQahdmpEWTEWAd13Lf3VfLE5mJiQgycNyORSKthSPEJIYQQQowESfwIIYQQYtQ5XNnKFf/b3O8Ur/gwIz88ZzJTE8PQahS0GjAbdFgNWiwGHQZdZyvDujYnKipxof1X8AzUBTMTOX1SLCa9ljf2VPDC9lLanV5sLg8dTg/tTg9hJj1/vmymJIWEEEIIEXSS+BFCCCHEqNLU4eIXbx7sNemjKLAsJ5ZrFqaxYkoceu2J51TEhhr9Gp+iKISa9ABcNjeFqlYHBbXt1LQ40GoU8mvbKWnoQK+TGRpCCCGECD5J/AghhBBiVClu6MDp8aHXKri9KnqtwpzUSM6bkcCq6YkkhPuncscfNBqF5AgzyRHmYIcihBBCCNErSfwIIYQQYlSZkxbJ23ecis+n0mhzEWHWoxtAZY8QQgghhOhJEj9CCCGEGJU0GoWYEP8u0xJCCCGEGG/k9pkQQgghxjWH24vD7Q12GEIIIYQQASEVP0IIIYQYl/Kq23h4QyFv7q3A61OZkRzOkuwYTpkQzcLMKIw6bbBDFEIIIYQYNkn8CCGEEGLMs7u8vLSzjFd2lVPRbMdq1FLWaO+2zb7yFvaVt/DfdceYnBDKzy+YyvyMSEkACSGEEOKkJokfIYQQQoxZNpeHxzcV89jGIho6XF2PN3b0v19udRvXPrINs17LjORwUqLMZMeGcMmcZJJkgpcQQgghTiKS+BFCCCHEmKOqKu8dqOZ37x6mqsUx5OPY3V62Fzeyvbjz63+vLeCl25cwPTncP4EKIYQQQgSYJH6EEEIIMaYU1Lbxy7cOsamgwa/HnZ4cxgUzkzAb+l/6daC8hVCTjowYq1/PL4QQQggxFJL4EUIIIUa5l3eW8eructqdHh6+fj6J4bLUqDftTg8PrM7nsY1FeHyq346r1yp8/6yJ3L48C522/4GojR0uLvnPJlKjLDx/62ISwk1+i0MIIYQQYigk8SOEEEKMchXNdrQahQtnJpEQNnoTCW0ON6uP1HLejEQMuv4TJP72yeEa7nn9ALVtTr8cL8pqYGFGFKdNiuX0SbEDTrZFWvQc+s050hBaCCGEEKOGJH6EEEKIUe77Z00Mdgh9auxwsSG/jnf2V7HuaB3hZj3LJ8YSpTOMWAzPbivhZ28cRB1GkY/FoOUrc5KZlhRGTlwo0SEG9BoNOq2CT4WjNW2kRlpOuMxLURRJ+gghhBBiVJHEjxBCjHJOjxeH20eYSYeiKMEORwhq2xw8urGIY7UdrM2rxXt8WdXCzCju/+psoqwjk/RRVZWPDtfw82EmfQBsLi/PbSvtd5t7L5vJ+TMT2ZBfx/7yFgw6DVMTw4gLM1FY1052bAjTk8PRauT3VAghhBCjh6IO95PSIMyfP1/duXPniJ1PCCFORg63lyNVrRyqbGVTQT1rcmtxenxYDFrSo60szIhkSXYMp0yIJtSkD3a4YpzLrW6l3eEhOzYEi1E7otUud764l9f3VIzY+XQaBUUBt7fvz06RFj1/u3I2Z0yOG7G4hBBCCCEURdmlqur83p6Tih8hhBglCmrbeXRjEa/tLsfp8fV43ubqTAgdqWrlyS0lxIQY+O3F0zl3RmIQohWi0+SEsKCcV1VV3tlfOaLnHEjDaI9XPeFyMCGEEEKIkTSynReFEEL0UFDbxq1P7eSsv63j+e2lvSZ9elPf7uJbz+3mlV3lAY5QiNFHURTOmhIf7DC6SY+28PI3l7A4KzrYoQghAsTu8lJU34HbO7D3aiGEGA2k4kcIIYLopR1l/PT1A109UgZLVeHvHx/l8nkpfo5MCP9ptrnQaTWEGP37seMPl8xgdW4trgEmSwNpYWYUD18/n3Bzz+WXT2wq4khVG5mxVhSgw+mhocNFY4eLhnYXTq+P5AgTKZEWUiPNtDo8HKps4WBFKwBJESaSws2kRJpZkBnFgowoTHqpKhJiJLi9Pl7cUcaz20qpbLbTYndz72UzyYxJDXZoQggxYJL4EUKIICmq7+Bnbx4cctLnM6dMkOoCMboV1nfw94+P8sgN8/3aAyi3um1UJH2mJobxyA3zCeul59ahyhZ+9fbhEx5jX1nfz5U22rp9nRxh5ucXTOHUnFhUVWVTQQPhZj2NHS7Om5EgTeCF8KODFS1oFIVbl2Vi1GmxGLQsy4kJdlhCCDEokvgRQogR1GJ389y2UnaXNrGjuNEvF61TEoPTY0WIgZqbFsmvL5o27MlbX6SqKq/uLictykJ1iwNXEJZdnDUlnluXZZIdF9KV9FFVtSvx0mJz8991hX4/b0WznW88sxujTsPPL5gCKNz/yVFyq9v47ooc7lo50e/nFGK8mpMWyZy0yGCHIYQQwyJTvYQQIsAKatt4ZmspRfUd7CxupMPl9ctxQ006/nblbFZOHV19ToQYioMVLfzu3cPEhppICjeRGG5Cp9VQ0+qgzeEhxKjDqNNQWN/B4cpWShttnD8zkckJoei1GiIsep7eUsLOkqYRi9mo0xBlNRAXZmJOagQbC+oprGsn1KQn1KSjrs054J5dw/H41xewPCeWX799iJgQI99dkRPwcwohhBBidOlvqpckfoQQIgCabS72lbfw/LZSPjxc7ddKB4CMaAuP3biArNgQ/x5YiCDaV9bMt5/bTXmTPdihnDRCjDpOmxjLkepWTpsYy4Wzkpgr1QlCCCHEuCOJHyGEGABVVelwealvc+LweIkNMRIdYux3H4fby87iJg5XtXCstoPC+nYK6zpo6HAFLM556ZE8cv18Iq2GgJ1DiBPxeH3otBoaO1xYDFqMOg0HK1pJj7EQZtLzaV4t/1xTwIu3LUanHfgQUZvLwz9W5/PIhqJh978ajxZmRPHSN5YEOwwhhBBCjLD+Ej/S40cIIei8iP3ao9vYWtjY7fHUKDPz06OYnBBKpNVAs81Fm8ODUadhR3ET24oacLgDv5RjUWYU505PYFFWNJPiQ9FopHmrCJ686jZuf3onGTFW1h+tw6dChEVPq93NmZPjuW15Fv/59BgzU8JPmPRp6nDx3sEqsmJCun7PfnruFL46P5VfvX2Y9UfrRui7GhuOVLXi9vpQVfj9u4dJi7Zy86mZwQ5LCCGEEEEkFT9CCEFn4mfiz95nNBUYWAxavrogla8tTidblnSJEfbFJsWbC+qJCjGQFROCTqNQ1mSjyeYGVPJr2jla00ZDu4vKFjsv3NZZbdLU4eqzKs3m8vDq7grW5dWxPr+uW5PzOWkRXDInmYtmJWHSa7npiR1sPtYQ8O93LLn77Il858wcHttYxO/ePczHd50mryHCbxxuL9uLGnlpZxnrjtbxjdOy+fYZEwZ9HFVVqWtzEhtqHPeT6P7+8VF2lzbx9M2Lgh2KEOIkJhU/QgjxBbtLm3h8UzHVLXbaHB7OnpaAAqMi6RNtNTAvPZIzJ8exanoCERZZziUCp7LZjtWg468f5eH2+lg1PYF9ZS28vb+SkoYO4kJNRFkNHKhoAUCnUdBplW5VbooCkxPCePaWRURaPh9n3lvS51hdO6/uKmdNbi251W29xrSntJk9pc387t0j3H32RM6bkSiJn0FQFNBrNfzqrUM8u60Enwov7yznJ+dODnZo4iTXbHNx+9O72FbUvTL2Lx/mUdZo45unZ5MebR3QsewuL79++xAv7CgjOcLMzadmcs2iNEx6bSBCH/VuXpbJvFLpzSWECByp+BFCjCsVzXaueXgrJQ22YIfSJSHMxBmTY7l4djILM6JkGZcYMbc9tZMN+fXY3cObNHfrskzuOW8Kx+ra+TSvjrOmxJMRY8Xl8fHUlmJe3V3BxbOTeHd/VVcSaSDMei0/PW8yv3jz0LDiG+8mxYfy4Z3Lgx2GOAmpqspz20v58FANhytbqG/vu3+dosC50xP48arJ/SaA1ubV8n+vHaCyxdHt8cwYK3+4ZAZLsqP9Fr8QQownUvEjhBiXVFXlUGUrO4obOVzZyoGKlj6rDEZSuFnP6ZNiWZodzeKsaNKiLOO+zF0Ex+SEUE7NiSE92srG/DpWTU9kb1kzPp/KtqJGPjlS0+/+Bp2GX104jcK6dpb/ZS1ljXYMOg2xoUZe21PBW3srKD6eZD1S1Tro+K6Yn0JjABuljxd5NW2szaulusXBVQtS5fVGDNhHh2v4v9cPDmhbVYX3DlTzyZFa/nL5TC6endxjG7fXxx3P7aHd6enxXFF9B1c/vJWrFqRy18qJxIWZhh2/EEKITlLxI4QYc/aUNvH7d49wtKaNVkfPD5cj7bOlMAsyIlk5NZ7FWdHoBzHlSIhA6XB6KKhtJ7+2nfyaNg5XtbKntLnXi7K+6LUKbq//P0tMig/l9Emx/G99od+PPVYlhZs4Z3oCL+4ow+bqWcUVYtSx9xcrBzVlTYw9+TVtJISbCDXpT7htfbuTM/7yKW2DeE34zLfPyOb8GUkkhHcuGYXO5aVL/7TmhPtqNQrLc2I4c0o8OXEhnT+7Zc2sza1Fq1G4eHYyK6bEjdulYUII0RsZ5y6EGBca2p38d90xHttUHPQx0DEhRs6cHMuKKfEsyY4mbAAfsIUIlGabi5pWJ3VtTsqabKzLq+NgZQvlTfZghyb8bElWNPecN4XHNxfx2u6Kbs9dvTCNP146I0iRidHilid3kBUbwj3nTel3uz+8d4SqFgdVzXZ2ljQN+XzJEWbW3n06Bp2GNoebGb/6aMjH+qIwk44LZyVx2bwU5qRGSCWbEGLck6VeQogxbW1eLc9tK2Xd0e7TgUaKVqOwLCeG7NgQZqaEMyM5nIxoq/TqESPO4fbSZOtcGqWqsKO4kSc2F7OntDm4gYkRs6WwgXs/zOWpmxZyy6lZ7Chu5MND1WwpbOCGpenBDk+MAlsLG1l/tJ6J8aFcNje514SJqqo8ubkYpx/eUyua7fxv3TG+c+YEqr7U1+eLQow6rlmUxvKcWOamR6Cg0OZwc94DG6lvd/bYvtXh4dltpTy7rZSsWCuXzU3hkjnJJEWYhx2zEEKMNZL4EUKc1DxeH09tLmZtXt2InjfcrGdhZhTz0yO5ZE6y9CIQI66pw8U7B6o4VttOYX0HRfXtlDfZGcFCXjFKbciv57/rCqlpdTA7NYI/XzaTRzcWMTkhLNihiSBTVRWTXku708PdL+/DpNdwwcykHtvVtTn9kvT5zH0fH+WxTUX9NpK3GLQ9qpC2FTXQbDtxn6/Cug7+8mEef/0oj6XZ0Vy7KJ3zZiT2uq3L46PJ5iJe3reFEOOIJH6EECetA+Ut/PCVfSPWsDkhzMTZ0+I5Z1oCCzOjpE/PSe6Dg1WEmfUszY4JdiiDUtVi55ENRTy3rXTY07jE2PXnD3IBMOk13LYsi1uXZwU5IjEalDfZaezorJ65emEa5/eRHAlE/rjJ5u73+do2J+1ODyHGzsuTl3aW8aNX9g/qHKoKta1OdhQ3snxibNexvuie1w/w3oEq/n3NXM6YHDeo4wshxMlKEj9CiJOSz6dyx/O7uyYGBUq01cAV81NZNT2BmcnhsnxrDPjgYDURFj33vH7w+HS10Zv4cXl8rDtax2u7yymobSfcrGdfeXNAmimLscnh9vHAmgIe2VjE5p+cSYTFEOyQRBA9sbmYz1rgxYUa++yLExdqJNysp8Xef7LG3/aXN3e9Jh+rax/Uvgathl9eNJVrFqb1+X0V1Lbxyq5yALYXN3Ylflrsbt7ZX0mzzU2YSUeYWU+oSUeYSU9ShFmWjwkhTnqS+BFCjHoOt5e/fXyUPaVNhJsNTE0MxWrUBTTpE2U1cNvyLK5fko7FIC+VY8XRmja++/weXF4fJr0mMLe1/cDl8fGvtQU8s7VExpkLv8iItkrSR3D78iwumZNMlNXQZzLjzb0VeLxqUBI//1l7jMWZ0Wg0CsmDTLYsnRDdb9IH4JmtpV1/f213Oc02N3aXhw8OVeNw9760zajTkPvbVdI8WghxUjvh1YyiKJOAF7/wUBbwCyACuBX4rLHGPaqqvufvAIUQwutTeW5badeI6U+O1ATkPDqNwj+umsOCzEiiLAYZeTwGTYwP5dEb56PTaFifX8ePV00OdkjduL0+Pj5cw38+LeBgRWuwwxFjhEGr4Xtn5QQ7DDEKxIWZTtiT7qPDNby7v2qEIupuY0E9/1xTwPfOyuGSOcn8b10hFc0Dmz74aV4d+8tbmJUa0ec2Hx/+/PNDTauT57eX9rntZ2JCjHS4vIQYdTg9XvaWNmPSawk36wk364mw6CUpJIQY9QY1zl1RFC1QASwCvg60q6r614HuL+PchRAnUtPq4NO8WuZnRJEdGwLAu/ur+O4LewI6oj0j2sJvLp7O8omxATuHENC5fCG3qo35GZFdzUXLm2y8sL2MF3eWUdfWc3qNEEMVZTXw0HXzmJ8RFexQxEmivMnGpf/ZTG2QXosUBR69YT5nTo6ntMHGjY9vp7C+o999ws16/nL5TM6eltDnNh6vj288s4v1+fWDngBq0GmIMOuxu7y0Hb8J9cXnksJNTE8O557zpnRVUvl8qiwPF0KMqP7GuQ828XM28EtVVU9RFOVXSOJHCOFHDreXJX9c3dUA8oYl6UxODONnbxwMaNJnXnokT3x9AaEmfcDOIQR09pFY8sfV2FydTZmzY63Eh5nYUtgg07iE302IC+GxGxaQFm0JdijiJJNX3ca3nt3Fsbr+Ey6BEmrS8bcrZ3Pm5DjaHG7+9H4unxypxe7y0OHq3tT+lAnR3Hv5rAEvDWt3evg0r5bXdlewJrfWr3EbdBquW5yOy+PDatTxk3NHV1WpEGJs82fi5zFgt6qq/zqe+LkRaAV2Aj9QVbWpv/0l8SOEOJF/rs7nsU1FhJv1VDTbA9bENiXSzDdPzyYtysLCzCiMOm1AziPEF3l9KtWtDpo6XLyxp4LHNhURwJymGMfOmBTL/VfNIdwsCW0xNE6Pl7f2VvLoxqIRm575ZckRZh6+fj5Tk8K6Hmuxudlf0Uxls52pieHMSAkf8vH3lTXzizcPsq+8xR/hdrP27tPJjLH6/bhCCNEXvyR+FEUxAJXANFVVaxRFiQfq6WyN+VsgUVXVm3rZ7zbgNoC0tLR5JSUlQ/suhBDjiqqq/HNNAX/7+GhAjn/WlDhuXZbFoqzogBxfiM9sKqjn6S0leHwqTo8Xj1fl2VsWUdTQwYr71gU7PDHGnDUljm+cli1Lu4TftDncXPzvTRQOoPpHr1X45ukT2Hqsge3Fjf1umxxhZlFWFKumJTAhLoQDFS384KV9eL6UDb9+STq/uXj6sL6H/vh8KgV17RTUdv734o6yAfcV6suKyXE8euMCP0UohBAD46/Ez8XAt1VVPbuX5zKAd1RV7fdVWSp+hBADcaSqlR+/up/9AbgD9xmjTsPPLpjKdYvTA3YOIbw+le88t5tDla3Y3V7q2px898wJXDAriRse205ViyPYIYoxQFHg0jkpfOO0LHLiQ4MdjhiDCmrbufQ/m2h1ePrd7vJ5Kfz1ilmoqsonR2p5ZmsJZY02JsSFsDAzivRoK2lRFlKjzL1OzHxpRxk/ff0AXp/K1MQwfnreZJbljGzvvQ6nhz+9n8sz20oGtQRXq1FYlBnFVQvTOHd6AnoZECGEGGH+Svy8AHyoqurjx79OVFW16vjf7wQWqap6VX/HkMSPEOJEnt1Wwq/fOozLO7jGi4ORHGHmP9fO7XfyhxD+8MSmIk6ZENN1MW5zedhf1sxtT+864QWUEAMRH2bk71+dzdLsmGCHIsa4vOo2/rvuGJsK6vts/Pz0zQuHnaipaXXgdPtIjTIHdVpWUX0HG/LrqGiy09jhosnmorHDRbvTg0JnXEa9hskJoZwyIYbTJ8YRbpGllUKI4Bl24kdRFCtQCmSpqtpy/LGngdl0LvUqBm7/LBHUF0n8CCH6896BKr717G6/HtNq0HY1gvzDJTNYkBFJerQVg07uxInAeXFHKR8dqmF1bi16rcJty7O4aFYyr+0u55GNRQFtVi7GPr1WYXFWNCsmx3Hx7GQirYZghyTGEVVVOVbXzqaCBtYfrWNNXi2qCudMi+e/X5sno82FECJI/Nbcebgk8SOE6MuukiaueXgrzkGOWO1PUriJNXefzlt7K3lueyk/XjWZJdnS00cE3mu7yzlY0cqhyhZ2ljRJokf4RbTVwPdXTuQrs5NkCqEYNSqb7VQ225mbFinjy4UQIoj6S/z0XFwrhBBBkB5tYeXUeFrsbrYWNvhlmtfEhFBMei1XLkjlygWpfohSiIG5dG4Kl87t/HuL3c1LO8p4aEMhdX0sjxCiP3GhRi6bl8I3T88m7EsJH59PZXVuLbGhRnLiQrAa5aOdGFlJEWaSBjhKXQghRHDIpwMhRND5fCpOj4+rF6ZR3NCBQathdW7toI+jUeAfV80hv6aN2jYnty3PCkC0YrxzuL385cM8PjhYzQNXz2Zeev/Tk9xeH1fO70w+3v3yPj4+XDNCkYqT3dULU7lkTgrz0/uupChptHHrU59XUydHmJkYH8KkhDDmp0eyICNK+o4IIYQQ45wkfoQQQVXRbOfif22kvt017GP51M5pHHedPckPkQnRO6NOw1dmJ7MgI7LfpI/T4+WWJ3eyIb8erUbhxqUZ/Ofauewvb+GXbx3kYEXrCEYtTiYGnYabT83kx6sm97lNaYMNr6qy+kj3RGJFs52KZjtr8+oACDXq2PiTMwk3S/JHCCGEGK8k8SOECBpVVbnntQN+Sfp85sWdZVy1MM1vxxPiyxRFYUZKODNSwvvdbmN+PbtLmoDOse6Pbixie1EjigKHKyXpI3r3s/OncPXCtH6XbKmqyl8/yuOtfZUnPN6irChJ+gghhBDjnCR+hBBB8/qeCtYdrfPrMSfGhfr1eEIM1Yop8ez95dkcq2tnf1kL936Yx4GKlmCHJUa5KKvhhH16FEXhvitncdbUeB7ZUMj+8p4/Vxql82fwVxdNC1So4iTj86n8+cNcLpyZxPTk/hPX/vLSzjKe3FxMQ7sLh8eLAtx0SiZ3rMgZkfMLIYToJIkfIURQFNS28cu3Dvn1mLNSI/jFhVP9ekwx9pU0dPDa7grOnZFAdmwIO4obKWu0kRplYUpC2LBGZeu1GiYnhDE5IYw5aRFc9K9N2N1eP0YvxgqtRuHaRWlcNCtpQNvrtRoumpXEBTMSeW1PBe/sryS3qo3qVgcA/7x6LufPTAxkyOIko9EozE6J4MbHd3DJnCR+cPYkTHptwM6nqiq/f/cILXZ3t8df21MhiR8hhBhhkvgRQoy4wrp2LntwC20Oz7CPFWnRc8HMJL4yJ5m5aREoioySFYMTZTXg9amsy6vDotdRUNtOWaONxzYWkxBu4n/XzfPLxVFOfCh/umwG33th7/CDFmOCosCM5HBOnRDDpXOTmXCCisU2h5vqFgeJEWZCjlcFaTQKl89L4fJ5KQA0drioaXUwJTEs4PGLk8+5MxKJCTVyzcNbWZ1by5NfX0hqlCUg51IUhZkp4WzIr+/2+OQEqcwVQoiRpqjq8EcmD9T8+fPVnTt3nnhDIcSYpaoqV/x3CzuP9z4ZjlXTEnjg6jkYdBo/RCbEyPjFmwd5aktJsMMQQZYVa+Wh6+YzIS6k2+Mer4/nd5SxLq+W1CgLc9MimZseSVK4iYc3FPLSznKumJfCjadkYNT1npD0+VQUBUmEiz7tLG7kG8/sxqjTsPoHpwWs8uftfZXc9dJe3N7O640FGZHcffYkFmVFB+R8QggxnimKsktV1fm9PScVP0KIgFNVlfX59Ty6sYjDla3Utzv9ctydJY2ojFzyWoih6HB6KGuy4fGqRFoN/N/5U9hf3sLesuZghyaC5MzJcdx/1WzCTN2bLjfbXFz/2PZuPXse31QMQEyIEZfHy7kzErj9tOwTnuO2p3fxf+dNISPG6tfYT1b3fpBLWZOdv14xs8+E2XgyPyOKt+84hX98kh/Q5V4XzkoiLcrCgYoWVkyJIzHc3PWc0+OloLad/Jp26tqchJv1TE8OZ0piqCQthRDCz6TiRwgRUAW17fzp/Vw++dLI4aGKDTVy6oQY3txbgU+F7f+3grhQk1+OLcRwOdxeXtlVzoHyFnKrWylttNFk+7y/haLAq99cyuSEUN7aW8lreyrYXtQYxIjFSPv2GdnctXISWk3PC9vvPLebd/ZX9bqfTgNz0iIpbrDxg5UTuWxeCnpt39WOP35lP5sL63n/e8u7loWNZ3VtTgrr2qXSJMg8Xh8/fe0Ab+6rxOtT8fp6XodMig/l1uVZfGV2Erp+fsaFEEJ0JxU/QoigqG11cM7963v9YDdUdW1O4sNMvH3HqdhdXkn6iBHncHs5XNXK5oJ6wsx6TpkQQ5TFQF27k/s/Ocp7B6p73S/KauD3X5nO3LRIAHwqHOhlGpMYm8x6LX+5YiYXzOy7ebPD7UOjdP5s6LUKE+JCOW96AhkxFu79MI8dxZ1LZH/y2gHu/ySfaxalcfqkWKYkhqHXavB4fRQ3dLCrpIk39lbg9Ph4ZEMh3z9r4kh9m6OOy+PjQEUze0qbMRu0pERZSI4wn3hHERB//+QoL+8q73ebvJo27n55H89tK+HvX51NerRUrQkhxHBJxY8QIqD+/vFR/rE636/H1Ciw82criRrGtCUxPrXY3VS12KltdeL2+vD6VHxq53JEr9r5d59PxaeqXXej95Y1U9Zko7bVSU2rg9YhNCW/cn4KPzl3StfP7NrcWm55aqdfk6JidEoMN3HejESuXph6wubNAF6fSrvDQ6ip897ctqJGnttWQmmTjYZ2F+VN9h77GHQaLAYtNqcXl9fX7TmzXssH3192wotnh9vLh4eqeXV3BY0dTqwGHVajDotBS4hRh8WgI8SkY2J8CDOSw0mLsozK5Thur49NBfXMTY9kc0E9P3xlf49BAmdMiuWOFTldSVgxMo7VtbPq/vVd/X4GwmLQ8vMLpnLVgtRR+fMmhBCjiVT8CCGC5s6VE4kLM/LzNw7ij2tcg1bDj1ZNkqTPScbm8lDeZCcrxjpipfsHK1o4WNHC0Zp2jta0kVfTRl2bf/pLDUSkRc+VC1KZlxaJXqfh3f2VlDbaKGu0szavVpI+Y5BGgV9fPJ2FGVFoNQoGrYaUSDOaXpZ19UWrUQgz61ibV8vv3z3CsboOAFIjzcSFGntN/Lg8PlweX4/HAbyq2m1JWLPNxUeHa2ixuWl1uGm1u2nocLH+aN2gkpqhJh3Tk8KZlBCK2aBFp1HQaTTotApajYJOoxAdYmBxVnS3vi6B9siGIv78QS5ajYJ6PJn7ZWvz6libV8epE2K448wJsvxrBLg8Pu5+ed+gkj4ANpeXn752gNVHarj38lny3i+EEEMkFT9CiIDz+lTO/vu6rguYoUqNMvPw9fOZnCBjiger3emhtMFGWZON8iY7E+JCWJ4TE/A7qDuKG/nVW4c4XNXK4sxobjo1g1++eYjL56Vw/dIMYkKMATv30j+uprLFEbDj9+eMSbFcMT+V/3xawMGK1qDEIEbeLy6Yyk2nZg5qH1VVaXN6uho959e08dt3j7D+aF3XNgsyIruWeQ3WX6+YxUWzknh4QyFHa9pYk1vbowIm0CbGh/D6t07BOgK9hs75+3ryatoGtc+50xN48Gvz2FncyLaiRj45UsOjNyzoSjJsLWzgF28eJCculGnJYUxPCmdGcjiRkoQYkOoWB3c8v3vIP8OfOX9mIv++Zq6fohJCiLFHKn6EEEGlUSA50sKxug6WZEVz/sxEkiJMHKvt4JGNhdS0DqwK4w+XzJCkzyDVtzv53gt72HysgS/n+S+Ymcg/r54T0ORPXZuT31w8HZ1GYVpSGDqthlMnxJJf28amgnrOnBxH6JcmG/nD6iM11He4/H7cgfrOmRO4+qFtPZbdiLHr6oVpfP2UjEHto6oqf/kwjwfXHSMnLgSPT6WovqPb7+qizCi2DbEBuEmvYX56JHqtwuojNewubR7ScYbqmZsXkRplJsJiGJGkD0B8uGnQiZ+NBfWsun89udWd+2XFWIm0dL4u1bQ6uOf1AxTWdXC0pp13D3Q239YosCwnlv9+bR5mg0wJ+6L8mjae2lJCaaONZpuLqUnhXDInhRuXZrKvvJn1R+u6/q0H48OD1aiqKku+hBBiCKTiRwgxIkobbBTWt1PeZOeVXeU0drhYlBnFDUsz6HB62FnSRJvDg83loaTBxqaCejzHa/Qzoi3csDSDr58yuDvpAr75zC7eP9h7s2HovFj91UVTx9x449P/spbiBlvQzv/YjfP537rCIV+wi5ODXqsQG2JkWU4sv7tker9TtqAz0dPq8LC3rJntRQ1sKmhgb1lzv/tMTggd0kXyZ8LNer5zxgS+fkoGz+8o45dv+mfZ7YnEhBjY+bOVgT/Rl7ywvZSfvHZg2Mc5ZUI0q6Yl8LePj3abzPdlS7Oj+cHZk5iXLv2CPmNzeXh4fRGxoUbOn5lIuLlncr+8ycZLO8t5aUcZ1a0Dr8w8+OtzZEqdEEL0ob+KH0n8CCECorCunYc3FHKsroMpCaG02N2s7mWJgaJATlwIkxPCmJQQSnyYiSirnonxnfuY9FqyYqxyh2+IbntqJx8drul3m1XTEvjvdfNGKKKRcf4DGzhUGbwlVnqtwtlTE5iUEMrjm4r6vXAUJx+zXsvr317KpPjQAb02lTfZ2FHcyK/fPkzzIH8WhrPM6zOzUsL59hkTuPPFvXS4vMM61mBs/ekKEsJHdvKix+vjsv9uYd8JEmr+NC89kq8uSCXSYmD5xJgxl0gPJK9PparFTmWzg6oWOwfKW9hX3ozXp2Jzealvd1Lf/nn15rZ7VhAfJtM8hRCiN5L4EUKMmIMVLXzjmV29NiAdDEWB31w8nesWp/spsvHpqoe2sLWw76qThDAT6dEWXrx9yQhGFXgDSXiNhHCznu+tyGFfeTNv7q0MdjjCT/5wyQyuWZTW9bXXp1LT6qC8yY5BpyHaasDu9tLQ7uKZrSVdy4OGwqTTkB0XMqxE5uzUCEx6Tb+vBYEQadFz+2nZXL8kHYuhZ5VGs82F3e31e/Pnjw5Vc9vTu/x6zIFKCjfx5E0LyYk/8QQ3MTBtDjd1bU4iLQbpqySEEP2QHj9CiBHz6MaiYSd9AKKtBpZmy6SV4Shp6Oh2oWfWazllQgyLMqOYnhzO1KSwXkvwB8PrU/nf+mMcqmgl3KJnUWYU50xLwKQP7B3vhvbOi4C+piWtmBI3KhI/LXY3v3nnMNOSwpiZEs7+8pZghySGacXkOK5emIrN5eFvHx3l4yM1VDbbBz2taKAcHh/tjuFVjBl0GhRGvmqyyebmT+/n8siGQq5ZlM6SrGjmpEVg0mt5a18l331+DwCXzk3mvitm+aWys6zRxree3T3s4wxVZYuD/60v5JpFaTIu3k9CTfqA9IITQojxRBI/Qgi/muinu5z/vHou2bEhfjnWeJUWZeGR6zuT/iqdPSt6u+s+HLtKmrj3g7yurz1eH1MSw/z2c9CbbYUNfOOZXWTFhvD8rYsx6Hr2VblyfiqxoUZ+/sYhKpqHn4gcrmAuOxP+E2018KfLZqIoCr988xAv7yofkfOWNNrJiLYMuW9VtNXAp3l1J94wQOrbXTywOp8HVuej1yqcPyORu1ZO5D/Xdk5oWj4xdkhJn8OVrTTZXCzOiu4a3/7nD3K7+sMFy4b8Om5dlhXUGIQQQogvkqVeQgi/Kqrv4PIHN9MwzIlKO/7vLGJDAzfqe6z6NK+WhzcUcuPSTFZOjQ/4+Xw+lUc3FvHAmny8PpV9vzz7hA1uh+PFHaX87I2DXdUVXz8lg19eOK3P7Z/eUszP3zwUsHjE+GHSa3jouvksy4nh1d0V/PCVfT0m5QVKUoSJVruHdufgx7CHGHUsy4npt8l7MBi0GmakhGPWa3F6vDg9PlweHzEhRuZnRDIhLoT8mnZyq1txeXxoFIXkSDM/WjW5q7nvlmMNPLA6n/zadk6bGEuzzcXq3Nqgfl9Xzk/hR6smExMi719CCCFGliz1EkIEVElDBz9/8xCbC+oJMekG3by0N94g37E9GbU63Nz98n7q252oKrx/sIrqFgcN7S5MBi1WgxatRqHV4aHN4abt+J8mvZbrF6dz22nZg56WotEo3Lo8iysXpPLW3gpcHh/F9R002dzMTAn365Kvtbm1/PjV7tN6nt1a2m/iZ2fJ8JriCgGdE6oevn4+yZFmvvHMLj48NHLLCLNjrRQ32Ib0mhhq0vHtMybw5w9yAxDZ8Li8Pnb1+vvZxsaC+j73W5Nby9y0SCItehRFwenpbAD86u6Rqb7qT4RFj6rCIxuKuHRuckArH09Gj20sYmdJI2lRVjKiLSybGEtyhH/7OwkhhOidJH6EEMOyvaiRm5/YQdvxO9HDSfpMSQxjaXY0KZHmEZ8EMxb8c3U+9e1OADYfaxjwfg63jwfWFPDklhIMOg3pURYWZEZxzcI0UqMsAzpGuFnPdUsyqGqxc/b961FVSI4w89iNC5iU4J+Ln1mpEZw2MZZ1Rz9fsqLT9r08pKrFznvDaKorBEBGtIWLZifzwOp8NhU04PL6RvT8FoN2yInwqYlh7CltGrHKpJFQ3mT3Sx+5QGi2ubuW/724o5SXbl8iTZ6/4LRJsTyztYT3DnRWn4UYdXx3xQRWTImX6Z1CCBFgstRLCDEs647W8eNX9lPd6hj2sf559RwunJXkh6jGn4LaNlbdv8GvvS30WoXbl2dz9zmTBrXfd5/fw1v7OidYXTQriQeunuO3mABqWx0cq+vgWF07Oo3CVQvTet3ug4PVfOOZ4Ez2EcJfQo1a7G7fkH63dRqFf187l9VHalh9pHbYS3DFwBl1Gv5x1RxWTU8IdiijSovNzdn3r6Om1dnt8YQwE4uyooiyGjDqtBh1Gkz6zj+Neg1GnRaTXkNCmIk5aZFo+2jsL4QQ45mMcxdCBNwPX943rEanUVYDa39wOuEWmdwxFMP99+9LmEnH/l+dM6h9KpvtnP6XT3F5fSgKvP2dU5meHD6gfdudHl7cUYZJr+GMSXEkDWMZgMPtZf7vPhlSXxQhRpNFmVFsKxraKPYIi555aZHEhRl5YUfZmKr+Ga1OnxTLby+ePuCKyfHmm8/sGlbPKYNWQ2yokfgwI/FhJqYmhrE4O5qsGCtRVoNUDgkhxi3p8SOECLii+o4h73vx7CT+fNnMgI8AH6scbm/AGrcOZYRuUoSZU3NiWJNbi6rCq7vLB5T4qW93cul/NlPa+PnkomlJYdx8aiaXzk0ZdBwmvZZTJ8TwwaHR1dRWiMHaVtRIZoyV2BAj5U02KlsGXmHZbHMHveHxeBAbauTiWUmcOTmOJdnRknzoRUO7k7f2VVJYN/TPC9DZH6qi2d41sfH9g9XwcedzVoOW1CgLWbFWZiRHsHJqHBPiZLmdEEJI4kcIMWwfHaoeVhPdFVPiJekzDJ8cqQlYVUu4eWgVWDnxIaw5frFpGMCUr3anhzue29Mt6QOdY9A/OlQzpMQPwHfOnMCesqYeywqEONkU1XdQVN/BosyoQSV+xMioa3Oy+VgDhypbeXhDIeFmPbefls2UxLBghzZinB4vf/84ny3H6lEUBY0CGkVBoyjUtzspHMYNooHqcHnJrW4jt7qN9w5U8+cPcpmeHEZOXCg58SFcNCuJlEipxBJCjD+S+BFCDNuG/L4nsAyEXtbqD8ubeysDduykiKE12Y62Grr+vqWwAVVV+7wDvv5oHT997UDX3dvPzEuP5OZTM3G6vfxv3TE6XN7Ofg86DcbjvR+mJob1W000PTmcd7+7jD+9n8va3Fpa7G6/9kESYiRlxlhlUt0ocdncFOZnRPL7d490Jd4PV7V222ZjQT3rf3QGFsPY/7jdbHNx+9O7hrwk0R9y4kK4cFYSWo1CU4eLHSVNVDbbKWmwcbSmHdceHy6Pj++fNTFoMQohRLCM/XciIURA1bY5eGf/8BIPe8uaOXdGop8iGl+cHi+b+hl9PFzZcSFD2s/t/Ty5sr+8hS3HGlg6IabXbT84VI1RpyEzxopZryXEqGNJdhQtNg/ff2Fv1xSljGgLxQ3dK4IUBa5ZmMaPVk3uszopJsTIX6+YBYCqqlS3Ovg0r46nt5T0uFATYjQrqu8gOcJMSqSZssbBLfkS/vX2/kquW5LOh3cu5/fvHu6aVPVF9e0u3tlXxZULUoMQ4cj66WsHgpb0Mek1XDgziV9eNI0QY/dLG6fHS5vDQ5vDQ4vdTavdzQcHq7G5PFiNOs6ZlkBFs52/fXSUAxXNGHQaws16wkzH/zPriAs1MTstghnJ4VKdLIQ4aUniRwgxZKUNNs5/YEPXKPehenJLMd88PZsIi+HEG4tudhU3YXN5A3b8BelRQ9rvi9U705PDmJUa0ee2f7hkRtfffT6V0kYbv33ncI++JFFWQ4/Ej6rCs9tK+fBQDXetnMjKqfHEhhr7PJeiKCSGm7l6YRpXLUjlxR1l/OS1A4P87oQIns96m+g1CkkRJiqbJfkTDC6Pj8se3MyvLpzKf66dx9GaNn748j72lbd02268NJc36DqX9E6MD2F2agStdg+tDjeHKltpsbsDdt6rF6bx8wumoNdq2FrYwEeHath8rJ5mm5s2hweX18fctAiO1rT3+H+xNDua2FAjtz21k/r2E0+802kUpiWHc860eC6cmSTNu4UQJxVJ/AghBqy+3ckbeyrIjLFiNer40/u5w076AGTHhhA2hCbCAtbl1wX0+PPSIwe9T1F9B29/YfnZX6+YhdU4sLeb+z7O499rj/X63J7SZualR9Lh9JBb3dbtufp2J/e8foB7Xj/A9OQwzpoSzw1LMoi09p1MVBSFK+ancu+HeTTKmGtxknH7VCItBkKNevJq2k68g/A7r0/l528eQqNRuHZROi99Ywl/fC+XJzYXA50ViZMTxkdj4VuXZXH6pFhWTk0gxKjjnf2VvH+wGvfxis1AeX57Kevyamlzdlb19OYHZ08iI8bKw+sL+fhwDRXNdrJirNy2PIuvPbJtwDdPPD6VfWXN7Ctr5t4P8pidGsH3VuRwxuQ4f35LQggREDLOXQgxIAfKW7j2ka209vHBajh+deFUbjwl0+/HHQ9W3b++RxLEXyYnhPLB95cPeHu318dLO8v443u5XXdW56dH8so3l/a5z2fvQZ/1/9lZ3Eib08PizGhKG2387t3DvfaQSo00kxRhprbNicWgpbzJ3uOucohRxx8uncFFs5L6jfuRDYX87t0jA/4+hRhNoix6Gm2Bq6gQA/PPq+dw4fHXmo359TTZXKREmpmTNvjk+cnuSFUrF/5z46jpp/b+95YxJTGM2jYHp//lU1IjLfz64ml869ndfkn6Xzonmb9cMQut9CsUQgSZjHMXQgzbH98/EpCkD8DCzOiAHHesK2noCFjSB+CrA+xL4fR4eXd/Ff9cU0DRF6a2hJl0fPP07B7b51W38e+1BRytaaOiyY7VqOOGpRnctjyL+RmfLy2blBDKP66awyl/WoPd3f2ObFmTnbKmz5eTGXUKCzMiKW2yU32870m708MzW0q4YEYimn4+kN+yLAuvT+WP7+cO6PsVQogv+9Er+8mJD2FyQhin5sT029B+rHK4vazNreVvHx8dNUkfgKe2lPDHS2fwwOp8rpyfyvVL0rnu0e1+q/R8bU8FMaFG7jlvil+OJ4QQgSCJHyHECbXY3Gw+1hCQY+u1ClUtdqYmjZ+Rt/7y7LbSgB07NtTI1QvT+nze6fHy3LZSPjpUw+7SJpyenuX8l89LZcWU+G6P/fH9Izy8vpAvXhO0OT38+YNcPjlSw9+vnE1adGffBLfXx+6SJnwDqEx1elS2FzehAHNSI9hT1gzA9uJGbnh8O/ddOYu40L4nlN1+Wjbp0Vbe3ldJaaON4oaOPpcNCCHEl9ndXm5/ehdvfftUwi16Cus7qGlx9NnUfrBUVeXprSV8bVF6v4nsYFIUCDPriQkxkl/bHrQ4rpiXgl6noazRxtLsGM6bkQDAj1dNpsXu5uuP7+gxRXK41uTWSuJHCDGqSeJHCHFCrY7ALSNwe1Vue3oXG398Bonh5oCdZ6xpsbl5cUdZwI5/27KsPqeXVLc4uPy/mylv6v+Dc4ip51tMmElPXzeCd5U0ce4/1rNqeiIapfODdMMg7sgqwNSksK6kz2c25Ndz7v0b+MsVMzlzcnyv+wKsmp7AqumdFwhur4/fv3ukq1eHEEKcSEmDje+/uIdHb1jAkapW/vphHu9+d9mAe5z157XdFfzizUNMiA3xWzLJ34w6LadMiKHN4WFLYWBuFg3EhLgQbj+tZ7Xp3rJmvvfC3mFX+qRHW1ic2dkYOsysI8yk59Sc0fn/RAghPiOJHyHECcWGGjHqNL1WdfiD16fy2u4Kvn3GhIAcfyz655r8gE1K0WkULp2b3OtzPp/K3S/vO2HSB+DJzcVcOT+FlMjPJ59cMieZv36UR19FPB0uL6/uLh9S3CrQ3keVTkOHi5ue2Mm1i9K4fXk2iREm9FoNrQ43u0ua2FncRGWzHYNOw7SkMC6fl8r/nT+F7UWNMvJdCDFga/PquPaRbTg8XhZlRrOpoJ6zpyUM65i1rQ5+/fYhAP74fi7P3rpoVA9EaLEHt1n+4qzO5eM2l4eC2nZyq9t4fXeFX5JRq6Yl8J9r547aqishhOiLJH6EECdk0mtZmBnVa5Ndf3l5Zxm3Lc9Cr9UE7BxjxeZj9Ty5pThgx//6KRlEh/Q+Ev3JLcVsLBjYz0GL3c0dz+/h9W+d0vVYUoSZ0yfGsjbP/9PIQk069Lr+f36e3VbatUTOoNXg9vl6TUKtzq3lia8v5KfnTea6R7f7PVYhxNh14ykZnDPMZM8X/fmDvK4eewcqWrj5iR08ddMizIbeqzJHisfrQ9fLe/bs1EjMem2P3mwj5asPbSEmxEhFs73PmwxDtaesiesf206YWcfUxDDOmhrP5ARZqi6EGP0k8SOEGJCbTskMaOKnuMHGSzvLuHZResDOMRa8d6CK77+wF7fX/40zDVoNty3P4vtn5fT6fH5NG38aZAPkhvaed35/et4UDle1UtPqHFKcn9FrFTJjrBh0GvQaDYX1HRQMoq+Eq58xw5/1JpoQFzKsGIUQ48+Dnx7jYEULd62cOOwGz7VtDt7YW9HtsR3FTdz85A4evHYe4ZaBV/6oqtqV/C5rtKFRYFpSOKumJ3DRrCQirYaubWtaHWzMr8fu9uL0+Igw67l0bjJv7atkb1kzS7Kiuef1g0xJDOXey2d2W6o9KSGUv105i28+u3tY3/tQOdy+AVWlDkVNq7Prveu9A9X89aOjTEkM4/eXTGfuOJzgJsamgto29pa1kBBmwuPzsa2okbhQI7NSI5gYH0qIH5avipEn49yFEAP2zv5K/vFJPk6Pj+nJYVw2N4UWu5u9Zc00tLvIjLEyOzWCN/ZW8M7+qkEfPzbUyJofnEboKC5hDxaH28vfPj7KwxsK/X4H8zN3rZzId1f0nvRxeXxc8p9NHKoc3LKnm07J5BcXTu3xeJvDzZObi3lofeGQp8Vlx1o5Vtdx4g0HaVpSGG9/51Q0GoUXd5Ty41cP+P0cQviLjHMfvb444n2o/rvuWJ8J98wYK/+6Zg7TksL73N/j9fHKrnLW5NZypLqVssbeEyJmvZYr56dwy7IsEsNNnPuPDRTUtRNm0tNidxNi1PHbi6dx50v7euybEmnmtW8tJS7URJvDTW51G26vjx++vN/vTZRHqzCTjmsWpeP2+nC4vcxNi+SyeSnBDkuIAWvqcPHH949wpKqNAxUt/W6bEW3hzpUTuWhW0ribXjja9TfOXRI/Qohha3N0fij87MV/2b1r+vxweSLXLErjD5fM8Gd4J729Zc386JV9HK0J7JSUqxem8cdLe/+331bYwFcf2jqo481KjeDVbyzpdSnAZ1odbl7fXcGbeyvYXdo84GOnRpnpcHr9No73MzEhBh67cQEzUyKwuTyc8qc1NMlFtRjFQoxavCrYXcFZViP6FmrS8e4dy7omFQ7FqvvXk1vd1u82p02M5cJZSSzPiSEu7PPphT6fyk1P7uDTQSyt1Shw3oxEvnl6NtFWI1ajlsc2FnPJnGRueWpHn+9DGdEWEsJN7CppCkhF6snmR6sm8a3TpW+hGP1abG7+740DrM2tpcPlJT3KQkmjbUD7LsuJ4ZEb5mPUBXfZqficJH6EEH5X0WznntcOcLCihXCznonxoTz4tbkoisIru8r54GAVnxypHdKxn7ppIcsnxvo54pOLz6eypbCBxzYWsTp3aP+OQ/HsLYs4pZeJMaqq8tLOMn737pEBjzmPCzXyxNcXMjXpxP0PVFVlbV4tf3gvl4LadvRaBatRR3MfSRezXoNBp/Vrg+urF6byk1VTupZOPLqxiN++c9hvxxciUKKtBtKjLYNKnoqRccqEaJ65edGQ7oqXNdpYdu/aQe2TFG7Cq6q4PD6cHh+2ISYENQrcfU735MXG/Ho+OFTFSzvLcQVo2MPJzqTX8JuLp5MeZeHt/ZVsK2zEYtRx0awkLp+XQrhZKprF6FFQ28ZtT+2isP7z6unBJH4AZqaE84dLZjA9ue/KQzFyJPEjhPC7ymY7P3qls4y76Pgbxu8vmc6V81PRazU0dbj47gt7htQXKNys581vn0JGjNXfYZ8UjtW1c8Nj2wPWo6A/oSYdPzt/ClfOT+31QqWovoOrH9pKdatjwMeclRrBZXOTOXVCDJkx1n4vgFRVpc3pQa/RoNMqrMmt5aevHei1skevUciOC8Gg07C/vP+y5P4syIjkZ+dPZVZqRNdjPp/KqX9eQ2XLwL9PIYJtckIIR2va8UnBxahy/1dn85U5vU9K7M9QEj/+dvfZE/n2GRNweX08sqGIv3yYF9R4RjOTXsOCjCgKatup6uW9w6zX8s3Ts/nOGRNkKpgIqha7m3+tyeeJzcU9KvQGm/j5zFfnp/Lny2f6K0QxRJL4EUIEjNen8tt3DvPE5mIA/nblLC6d27mu3edTeWZbCX/7+GiflRt9mRAXwuvfWjou+/1874U9vLm3MqgxLM2O5k+Xzux1icIHB6v4xjNDa9oZG2okJsRIqFFHqEnH3PRILpmTzNbCBiwGHVajloxoK6lRn5/3X2vy+etHR/s97qLMKHYUNw7pgvcPl8zgmkVp3R7bVdLEZQ9uHvzBhAiyjGgLxQ2D/9AuAicmxMDqu04fVCNml8fH1Q9vZVdJUwAjG5izpsRz2/Is7nppb1BuSIw1Ny7N4FcXTQt2GGKc8vpUbnhse58TWoea+Im2Gtjxf2dJUjPI+kv8SEtuIcSwaDUKd66cyAcHq3F5fV1LtFRVpaTRxv7yFk6fGMsbg0xkFNS2853n9vC/6+Zh0o+ftcNv7q3grX3BTfoAbD7WwF0v7eWVby7t8dzZUxOYkhjGkarBNXoGqGtzUtf2+TSv1bm1/G/dsW4Nns16LX+5YiYXzOxsivq1xen8d10h7c6+l5htK2okNcpMQpgJVYWCuvYBJxvTe0lu7SkN/sWWEIMVYtDKh+5RqL7dxXee380Pz5nEzJSIAe3z8IbCUZH0AfjkSA2f5tViCfL4+LHiic3FTE4I5aqFaSfeeAhyq1spquugs7hWQaOARlGwGLWEGHVd/0VYDBh0fffgE2PT79493GfSZ6gWZ0Vx35Wz5f1nlJOKHyGEX7TY3fx33TF+vGoy0NkL4GuPbhv2cWenRvDw9fOJDTUO+1gng4Ladn7+xkG2FDYEOxQUBbbfc1av//bbixr56kNbAjZhDOD25Vn88JxJ6LQa1uTW8N3n99Lu9JAUbqK+w9Vvj4koi4FG28AaP+/9xUoiLIZuj9ldXr7y703k1fTfVFWIYAsz65gcH4ZPVSlttFH7hcSqGH1uOTWT/zt/Sr9LXlsdbk7505oB91MTJ5/sWCuvfeuUIfX8UVWV6lYH+8tbOFTRQovdjcen4vWp5Fa3sbeseUDHURSIDzWREmkmPdrKmZPjOGNyLBaD1AWMZXN/+3G/gzH6qxrVahSmJ4UxOSGM5EgzKZFmZqaEkxUTIkmfUUIqfoQQARdu1nP9kvSur6Oshn62Hri9Zc1c8p9NPHLDfCYnnLhJ8MlOVVV2FDcGOwwAVBW2FDZwUS/jiBdmRnHDkoyuJX6B8L/1hazOreW2ZVksnRDN+99bxu7SJmwuLz9/42C/+zbbBz7tq7TRRoTFQHmTjdd2V3Dd4nQirQb+cOkMWe4lRiWjTmFWSiQur4/yJhvbR8lrhjixRzYW0Wx388NzJhEfZuK13eVdy6M/8+SmYkn6jGFpURauX5LBYK6T7S4v647W8eGhajbk11PfPvwEr6pCdauD6lYHO0uaeHV3OSa9htMnxnHhrCTOmRbf71ROAIfbS0mDjUkJocOOR4yMMybF8eru8h6PT00M48+XzWRiQggFte28vruCNXm1JIWbmZYcxuKsaOanR47LFgxjhVT8CCH8rri+g++9sId9w2i4+2V6rcINSzK4YWlGt/4vY80/Psnn75909rPRa5Wgj8X92flTuGVZVq/P2VweVt2/gdIhrAUfCZMTQk84Bhk6m5fesiyLpX9aQ2OHi/NmJPCfa+cBcMuTO4Y8nU4If9NpIDMmBEWhz7Ha4uSg1ypMSwpnb1kzu352FtEhnZWVudWtXPafzXQMcRqXOHlYDFoumZPMNYvSSAw34/J0JnJLGmyUNNqobrHj8aq02N1sOlaPwz2yk9RSIs3ctjyLK+alYu5jmV9tq4NT713Li7ctZk5a5IjGJ4Zme1EjX398OxfNTuLUCbFEWQ1EhxjIiLbK0r8xQJo7CyGCIr+mjR3FTewta2JbUSMlfmg4qiiwYnI8v754GskRZj9EOTr4fJ3TrFRVZWthI3PSIjha08Z1j24Palw/WDmRO1bk9Pn81sIGrnpo6whGNHDz0iPYVdJ8wu2+e+YEpieHc9vTuwDIjLGy9u7TAThS1cq5/9gQwCiF6N/CjCgcbi8Oj5fiBpuM0R6Dvrsih7tWTmT90Tq+/+LefpdhCDHSoqwG7jhzAjcuzehz2qdRpyFpDH0mG8tUVcXl9WHUSc+usUiWegkhgiInPpSc+FCuWZSGqqpsyK/nnf2VzE6N5F9r8rtGZceEGEmONFNc30GLvbMhb3KEmb9/dTb/WlvA+qN1XcdUVVh3tJbdJUljKvFT3NBBQ4eLBRlRrJqeAEB8mIkoqyGoFwF93eX7zOKsaG5cGtglX0Ol0wzsztXZ0xL477pjXV9/8cJ6SmIYCzOiZCmNGHEWvYYZKRFsK5KfvbHugdX5PLqhUKp8xKjU2OHi128fZntRI3+5YhYhxu6Xj5kx1iBFJoZCURRJ+oxTkvgRQowIRVFYPjG2a+rXNYvScHs7L7D1x9eQv7SzjGabC4tBR1F9Bz95dT8Pfm0eZ02JY1tRIzuKGlkxJY5vnT5hzC33CjXpef9gNQsyoroeU1W1KxEWLANp8njnWRNHZeJnT2kTZoMWez8XU4syo3B5fbx7oKrrsZiQ7v2pLpiVKIkfMaImxFqpa3dJ0mcckaSPGO3eP1hNcYONV7+5RBpAC3ESkt9aIUTQ6L/UNPDK+andvr50bjKpUWYmJWRw/ZKMEYxs5MWGGvH6ui+9bXV4ejw20gYyvrfV4UajQJBD7WFGcgS7TjCWPTnCzK/eOtRtOtnUpPBu2yzNjglEeEL0yWLQ0WLvCHYYQgjRzZGqVh7fVMy3z5gQ7FCEEIMkHZyEEKPWtKTwId1V6nB6eGd/JcX1J9eF03e+9EGqbBQ0TR7IqNl/ry0YVUmf5AgTs1LCqWqxn3DbooYO9n+pCfnZU+O7fV1QK010xcgy6aUMXwgxOj23rZSR7BErhPAPqfgRQowpHU4P1z+2nV0lTYSb9fzp0hmcOyMx2GENiOZLs133lTcHJ5DjsmOtLMmO7nebT/NqeWFH2QhFdGKLMqPYVtRIRbNjQNsfqmjt9nVmTPfvuarFzr0f5vo1RiF6kxJhJinCTKvDzY4SWeIlhBidKprtVLY4xlSfRSHGgxMmfhRFmQS8+IWHsoBfAE8dfzwDKAauVFW1/5p6IYQIoIZ2J6v+sYG6NicALXY333x2N7/9ynSuW5we5OgG72BFy4k3ChBFgb9dObvfyoOaVgd3vbRvBKPqW7hZR0586KB7ori8nzdyVhT4+1dnY9RpeHtfJS/vKmdHUSN2t/TeEIGXFGGWXlJCiJPCsdp2SfwIcZI54VIvVVXzVFWdrarqbGAeYANeB34CrFZVNQdYffxrIYQIGp8KzbaeE7B+9dYhPjpUHYSIhqfdGbyEg6p2ThXrz5/ezx0VY4dnp0bgU2Fn8fDuPcxOjWB2agQAv377EOuP1knSRwRcqFHLgoxI9pTJvTMhxOinURhzAzaEGA8G2+NnBXBMVdUS4GLgyeOPPwl8xY9xCSHEoMWGGrl4dnKPx70+ldue3sVdL+6lpnVgS4BGgwtmBneJ2p5+GiPXtjp4Y2/FCEbTu0iLnmO17bQ5PMM+1t6yZjYV1KMoCjlxoX6ITogTU1XYXdqM2ys9M4QQo9/VC9PG7Qh36W0kTmaD7fFzFfD88b/Hq6r62fzbaiC+912EEGLk3L48i7f2VnZbwvOZ1/ZUsCavlgevnXfC3jWjQUlDcJtT1/dTzfPh4RqC+flHARZmRnGospV25/CTPtB5AX7j49uZGB9KbnWbX44pxIm0u7wszIxiZ3HjqGqSLoQQvTljUlywQwia9w5U86NX9hFm1hMTYiQh3ERWrJU5qZHMTY8gLrT/SmkhgmnAiR9FUQzARcBPv/ycqqqqoii9flxRFOU24DaAtLS0IYYpTkZen4r2S81qhQi0nPhQfnfJdH70yv5en2+2ufnao9u4bnE6Pzh7IqGmE0+tGmnVLQ5ue3onhypbT7xxANUf75XUmw8OVvX53EiYkhg26H4+A+H2qkH/dxfjj0yOE0KcLKzGk3s2kNPj5V9rCvj4cA0J4SaW5cSyPCeGCXEhKEr/1y0J4UY6XF46XF6qWhwc+FIvxuQIMzNTwkmOMJMYYSY5wsTctEjiTrB0XoiRMJjf3HOB3aqq1hz/ukZRlERVVasURUkEanvbSVXVh4CHAObPny/3ssaRbz27i9RICzcszZC1wGJEXTk/leoWB2a9ltJGGxvy6yhu+Hw0uten8sTmYrw+ld9+ZXoQI+3d5mP1PUaMB0NDR++Jn6YOF1sLg9eENic+hNJRMOpeCH/JiQsJSCJTCCH8KSPawqLMqGCHMWTNNhc3Pr6DvWXNAORWt/FpXh0AieEmluXEsCwnllXTE9Bre3ZE0Wr675JS0Wynotne7TFFgYUZUfxo1STmpUfx8s4y/r22gCvmp7I0O5r4MBN2txefTyU+3ETYl25Iur0+8mvaOVDRuST41AkxZIzTpXZieAaT+Lmaz5d5AbwF3AD86fifb/oxLnES83h9PLKxCI9X5ZGNRTy1pYQfnzuZqxaknvR3CcTJ47srcrr+7vL4OOOvn/Z4M2483gj607xa/rmmgMRwE4uyolmcGTWgOz+BsrNkdDR5rW/rfanX6txavEFckxJpNpBfIxUS4uRh1mvIiQ+lqcOFSa/FoNNg0mvZVdJEqEkniUwhxEmh1eGhzekh3Dz6qqUH4lhdR5/L6KtaHLy0s5yXdpbz8PXzWTm1ZxeT9w8MvtpZVWFbUSOXPbiFxVlR1LQ6KW6w8ZcP83rdPsSoI9ysx+tT8fh8tDo8uDzd2xdcNjeFn50/hUirYdDxiPFrQFfhiqJYgZXA7V94+E/AS4qi3AyUAFf6Pzwx2m0tbOBXbx3i4tnJfHVBKpEWPY9sLOJP7+d2bePy+vjtO4f58/u5LJ0QzW8umk5atFQAiZFj0Gk4f2YiD60vxKDVoKKi02hYlBnFhvw6bntqV1dPoHf2d76pR1kNTE8OJ8ykw2rQYTXqsBq1hJv1TEkMY1pSGBGWwLzhlo2Si8AOV++9c/Jrg9v/ZntxI3PTIthd2hzUOIQYqJkpEb1W9Bh0GlS184JDCCFGu8YOF6vuX89XF6Ry3oxEcoZ5k0xVVVodHsJMOhRFwebysL2oEZNey9y0SAy6wc4h6tvavFpsTi/v3HEqP3ntABvy63vdbtW0BJblxPR4fEN+HY9sLBpWDAOplm53ek7Yu/DV3eWszavlW6dnc+2idMwG7bDiEuODMpLdyefPn6/u3LlzxM4n/K/d6SHkC1U7De1O5v3uE6DzA2xsiLGrqkJR4Pbl2ZQ2drCtsJGG441i/3HV7F4nLwkRaE0dLrRaBVWFjfl1fHS4hg8PVeNw92wEPRApkWamJ4Vz1tR4Vk1P6Pa7MRw3PLadRVlRGHVant1WQmFdcJo8L8qM4sXbl/R4/JPDNdzyVPBfy+emRVBY30GzzR3sUIToRgEmxocSYdHT0OHiWF17UJuhCyFEIERbDSzOimZZTgyXzE3GqPs8AeFwezHpP//a6fGyo6iRgtp2ypvslDXZ2FPaTG2bk3CznhCjjto2R9eEw8kJodx7+UxmpkQMK8YWu5tfvHmQN/dWAjArNYJXbl/C6twant1WyqaC+m6N9X9z8TSuX5LR7RjH6tpZdf/6UTl9MSbEyDdOy+L0SXGkRVn8miwTJx9FUXapqjq/1+ck8SMG44lNRewqbeaulRPJjLFS1mhj2b1r+9z+hiXp3LVyEmFmHQW17VS1OFicFS0vSiKoOpwe5v3u4yEnfHpj0ms4a0o8X5mdzPKJscP6Gf/gYBWnT4qjuKEDo1ZDVauDv3yYx54RrnCZkxbB6986pcfjqqpy29O7+PhwTS97jawws45oq5Gi+uBOQBPjk0Wvwe728dknqRnJYWg1Ggpq2/02bU4IIU4GF8xM5F/XzAXgyc3FvLangje/fQo+n8qz20q47+OjJISZBjU1U6N0JmosBi1mvRazQYdZr8Fi0GE2aImyGFg1PaHPXqJbjjXwg5f2Uvmlqsqvn5LBLy+cBkB9u5P3D1Sxo7gJq1HHd86cQHKEudv2Xp/Ksbp29pQ28cDqgh6tA0YLrUYhM8bKlfNTuGphWo9+QWLsk8SP8JvfvnOYRzcWoSgwMS6UJpuL2n4m/wBcvySd82YkYtJrmZYUhkZRZNrXCPP5VD44VM3ukiZU4PJ5KUxJDAt2WEH1h/eO8ND6woAcO8pq4NZlWdywNB2LYWhVQHnVbVz+4Gb+dNlMzp+ZiMvj48WdZTy4tqDHB5hAmZEcztt3nNrrc40dLpbfu3ZUXNwuyIhkR/Ho6IskxpepiWG0Oz3EhBhosbs5FqTqPCGECLYFGZE8f+ti/r32GA+syWdqYhjP37aY7z2/h9W5nTOApiaGcrjK/8vFw816ko5P0UoMN5MYYaKgtp3Xdlf0ur1Zr2XPL1Z2q0gaqPs+yuOfawqGG3LAhRh1XLUgldMmxTIpIZTYEGPQeleKkSOJH+EX+8ubufqhrXS4vEM+hlaj8PiNC6hudbAxv577rpzVa9d84T9VLXa+9ezubtUiigKXz03hrrMnkhhu7nvnMazV4WbpH9cENHERE2LknvMmc8mc5EG/2TrcXnaXNLEgM6rb78j6o3Vc/9h2f4faqyvnp3Dv5bP6fP6WJ3fyyZHgV/1oFciMDRnwSOzJCaHotAoHK2Rsuxi6hZlRbJdJXEIIAUBSuIl/XzuXS/6zmSVZ0Xz9lAz+/kk+R6o+f6+dmRI+KqaWAjx/62KWZEcPer9DlS2c/8DGAEQUWFFWA6dOiOHCWUksnxjTbVmeGDv6S/zIiCXRr8pmO2tya/n4cA3r8+uG3aPA61P53gt7aLK5ibYa0CgKHU4PTo8Pj8+HgkJMiEEy0n5S1WLnkn9vprq1e4WIqsLLu8p5e38lN5+ayTdOyyZ0nJWDhpn0fHVBKo8Os1Fff+rbndz10j4+OlTDP66ePag3WZNey9IJPZsLTk4M9WeI/Zqc0H9VWFH96Jis5VWh1e5mXnokoKJVFLwq1LU5KG3sWY5t1GvIr27DpNf4dbmfEEIIMV5VtjhIDDcRE2LkqwtSeXJLcbekD8D+8hbSosy9vjePtIMVLUNK/ExNDOOsKfGj4sbXYDR2uHhrXyVv7avkrCnxPHJDr7kBMYZJ4kf06eWdZfzwlf1+P27T8UasU5PCKKpv57wHNnYbUxhlNXDGpDhWTo1nWU4MJr2Wt/dVUtvmYOXUBDJjrH6Paaz699qCHkmfL3K4ffx77TFe3lnOP6+ew6Kswb8Bnsy+fkoGT2wuDvho8o8OV/PijlLmpkUxPTl8WMeKsRox6DQ9RnsGQn/jWmvbHANa1pIWZWFifAitdg8NHU6K6jsIxD93bZuz12Wnc9MiOFDRwqSEULSKgsPtpbC2nRl9TFkSYqC2FzUyMT6EozWjIwEqhBDBVtPqxOvzUd/u5FBl71W1Lo9KfKiRmhO0igi0t/dXsnRCNBPiQgZ1Y05RFH73lelsyK/DOQKfxQJhTW4NX/3fFhZlRnHr8qxxd/N3vJLEj+jTU1tKAnr8c6cn8tt3jvS4gG3scPHq7nJe3V0OdC4P++zC/A/v5TIhLoRL5iRzw9IMv01RGquOVg/sgqS2rbMyZdNPzgxwRKNLSqSFc6cndI1wD5RQk46nt5TyizcPsywnhnOmJXDhrKR+Eyt90WgUvnFaNg+szg9ApN2Fmvr+/Wrq6H+SlkaBb58xge+uyOm2VK26xcGru8t5eWcZxQ2BH1u/u7SZEKO2x7KumlYHCzIiaXN4KGmwYXcPfQmrGL86nN4RS8QKIcRoV9lsp8nmxuH2EmHW9zp1s77dyazUiKAnfvaXdy7ZCjXquGBWElcvTB3wBLGEcBMXzkrilV3lgQ0yQHwqbCtqZFtRIx8fqeXxGxeQEG4KdlgiwKTHj+jV7tImLv3P5oAd/9K5yVgNOp7eOvTkUpTVwLdOz+Zri9OH1JxtPDjzvk8HNAr8inkp7Cxp4qM7l4+7nkulDTYcHi8X/2tTQC7+M6It2N1ealq7f8CxGLS8eNsSZqQMvgLI5fFx8b839Sih9rfHb1zAGZPj+nx+f3kzTTY3OXEhGHQathc1srWwAbNBy3nTE5mVGtHnvqqqsr2okYfWF3Y1fQyWKIsBi1FLeVPwS8/FyWdhRhTbi6V6TAgh7lo5kfcOVDEtKZxQk44nNhf32GZeeiS7SkbnQIZTJ8Rw19kTmZsWecJtX9tdzl0v7RuBqAIvIczE419fMO4Hv4wF0txZDFhZo41ntpXwwvYyWuz939EfLRLCTHznzAlctSAV3ThLWpzIyr+tI/8EDW9PnRDD0zcvpLLF0WN85XA53F5KG23YXF58qkqkxUBGtCXgPZxcHh8HKprJiQ8d8CjLqx7awtZC/168xYQYaHd6+u0jMy0pjJtPzeQrs5PRDGLaXUlDB5c9uJn6dpc/Qu3VLy+cytdPyfT7cW0uDyadtuv7PVjRwr/WFPDBoWq/n2sgoqwGrEYtZaOg54A4OcmSLyGEAINWw+8umY7L46Wpw819Hx/tsc1on8SZExfCx3ed1u82Pp/K91/cy1v7KkcoqsALMer482UzOXd6wqA+j4rRRRI/4oSO1bXzyIZCXt5ZjifA/U4CZVJ8KL+8aCpLs3s2xB2v7npxL6/t6X2UJXT2cHn1m0uZEBfi1/M2dbh4emsJT20pYVJCCNOSwpkQG8KctAhy4gPTnNjnU/nkSA0fHKzm4yM1tDk8/PPqOVw4K+mE+7bY3ay4bx317f4tO04MN1E1wNHrM5LDuenUDFZOTRjwEsajNW385u3DTE0KIzPGyi/ePIjb67/f3yVZ0Tx/2+JhH8fp8bKtsJFPjtTwaV4dpY024sOMvPrNpaREWrq2y61u5fsv7CW32v+jXk9ktH8QFaNbSoSZ2nanLPkSQgjgyZsWsv5oLY9uLO7xXKRFT7TVQMEAKtKD5ZO7Tuvzs7HPp/KT1/bz0s6Tc5nXiSzLieHsqfGcOSWecLNe2mqcZCTxI07ozb0VlDfZefDTYwEdbz0Szp+RyD3nT/F79crJaGdxI5f/d0uvz01PDuPXF00/PgnJP1odbh5ZX8ijG4vocHnRKHDj0kx+ceFUv53jyzxeH/9cU0C709NjQldmjJXnb13c77plVVX53guBuWtj1mu6mjk32dwDGjdu1HXuc+ncZK5dlD7gc318uIZbn/L/6+vfrpzFpXNTBrWPw+3lnf1VbC9qILe6jaM1bb1WPfWVWDpW186K+9YNOeahyI61DqhZtRB9kfHuQggBBp2G9+44lZ+9ebDPSuoQow6vz4d9lE7WXJYTw1M3LexRoe7zqdzz+gFe2FEWpMgCLz3KQkljZw/GKYlhPH3zQmJCjEGOSgyUJH7EgLi9Ppb+aQ11QW625g8mvYZvnT6B25Znjev+P6qq8vdP8vn32gK8PpXsWCtnTIrj0rkpTE3y3zpeu8vLE5uL+e+6Yz2WCN599kS+c2aO3871RWWNNr73wh52lzb3uc0Zk2J57MYFvS4vU1WVB1YX8PdPepYi+5tWgZRIM5FWI3vLmk+4vUGn4eM7l5MePbApdjc/sSMgvXIUBa5bnM4PVk4i3NL/srmqFjtPbi7hxR2lXdP7TuTRG+azYkp8t8dUVWX+7z6hoSNwy9h6MzUxlLp215h4DRQjb1FmlEyKE0KMe5fMSaagtp0DFS29Pp8ZY0Gr0QzoZlgwXTgriVCTjjaHh8YOJ5XNDiqa7WO+svOLiR/o7Em5anoCl89NYekEWVUx2vWX+JHaLdHlhe2lY+aCx+H28bePj/LSzjJ+f8kMTpsYG9R47C4v5U22gC1z6ouiKNy1ciJfX5qBUa/BYvD/r/y2wga+98LeXsfGaxS4eHay388J8Pqecn7+xqETVqjNTIlAVTsTGACPbizC4fZS2WxnX3lzj2lPgeJVoaTRTrjZMKDtXR4fl/93C/+4avYJly/WtTn59GidP8LsQVU7J/y9u7+K331lOufOSOx1O59P5euP7xj0Mq1vP7ebx29cyJLs6K7HFEVhfkYkHx6qGVbsg3W4qo1Qo5apiWEcDnDjbCGEEGIsmpsWwev9tBlwenxUNgd+qudwvT2G+vcMh83l5bXdFby2u4KbT83kZ+dPCXivThEY0glXAJ1LdP7+SeDHQ4+08iY7Nz2xI+jjFp0eLzc+voMr/7uFT/NqGclKO4BIqyEgSZ8jVa3c9dK+XpM+AInhZuLCBl4eWtpg46ev7efK/23hN28f5p+r83lkQ2G3u0IVzXa+9ewu7nxx3wmTPhfMTOTOlRO7Nam7/5Oj/OXDPJ7dVjpiSZ8v2l/Rwux+pl19UV2bk689so1/fJKPt5/eW2/urej3eX9o6HDxzWd387t3DuP29rzblVvdNqTePA63j5ue2NFjicwpI3xXyaLXsCAjkimJ4RyrG913IcXoNMIv60IIMer8YOVEthQ29LtNZbODmcmDn2gqgi+vuk2WNJ/EpOJHAPDEpmIaR3hZxUjx+lTufnkfLXY3N5/q/wlFAxFhMfD2Hafy/Rf3cuPjO5ieHMZpE2NxeXw0tLuo73DR0O6kscOFRlHIjLGSHWvlnOkJLM6MHjXd9VVV5VBlK9uLGvnKnGSmJIbx5E0LOOf+Db0mHiqa7fz943x+cu7kPo9Z1mjjV28dIq+mjaoWR9dxvvjG8rt3jzAlMYzkCDMb8utwDrDMNju2Z2O+hRlRQR8fvr+8mYxoC8UNJ77j5VPh758cxeb28JNVk3vcZWlzuHsdlxooj2wsIi7MyG3Ls7s9nls99CSa3e3lJ6/t5+M7T0N7/Gf9ollJ/O7dIyNWUm1z+6hoslM5wGbcQvQwOl6mhRAiKLJjrewrb+GTI/1X68aEGCiUGywnpUOVLbQ5PLi9PlYfqeX0SbHjuqXGyUYSPwJgzK9XBfjtO4dptrm4a+XEoJQoRlkNPH7jAv65Jp9/rM7vt9qkotnOxoJ6ntxSQkqkmeduWUxatKXP7QPN4/Xxwo4yHttYRGF9ZwPcNbm1PHPLIibEhfKV2cm8urv3qqqjNX1XgWzIr+Obz+weUEPxI1WtHBnk8huby4Oqqt3+f+u1wS101GsUZqWEs7OfvkS9+d+6Qg6Ut/DTc6cwI+XzO2W/eusw5U0jN4Zcr1VIi+rZd2i4k7gK6zrYWtjQVekTYTGwPCf2hB8g/SklyiKJHzEMUvIjhBi/jtV1DGhIQlZsiFSNnKSabG5ueWoncaFGzpwcx6HKFlZMiR9wJbsILkn8CADOmhrPv9YWBDuMgPvnmgJiQoxcv6RzWtJIJ4C0GoXvnzWROWmRfP+FPQNqgFveZOfuV/bxwq2LR7Typ7bNQUmDjc0FDbyxt4Ki+u5v5jnxIZQ12vj124f45Ej3Cppws54lWdGsmp7ApITe+xrtKmni5id3BjTp+PCGIjbk13P5vBRWTIknr7qVNXkjV+2j1yjMSY+kvs1Ju9NDm8OD0+OlvHloiZrNxxq48F8buWFJOj+/YCofHKruM+EWKD9eNZlV0xN6PJ4aNfzEZM2XlgwuyIgc0cRPywAbUgvRK1VKfoQQYkFGJM02N2FmPQrg8vqwu7xUtzhoc3rw9LJcXJxcatucvLCjjCVZ0cxNi+S+j/K448wcDDrpIjOaSeJHADArJZz0aAslA1h6crL75VuHeGh9IS6vj++flcM1C9NGPAF02sRYHvzaPK56aOuAtt9e1Mhjm4q4ZVlWgCPrvPj9xVsHeXNv/03tHt9UzOObins8HhNiYMOPzsRs6F762eH0UFDbTqTFQFq0hTW5NSNSaZZb3cbv3j3C7949EvBzfdnkxNAed7XmpEWwZ5DVPl/25JYSthQ2jPhEjIWZUdx0Su/LJa+Yl8L/1h0bVvVRx5cqv3Liey7VCySLUcqVxXBIxY8QYuxLjTRjMerQaxR0WgWtokGj6RyiYXN52VHc1Ot+eq3C9KSwfiexipNLaaONZruLRzYU4faq/bZ2EMEniR8BdFa+XD43hfs+DvxY69Gg4njFxf+9fpD1R+v406UzibQObNqSv8wYZGO7ez/IY2FmFDNTIgISj6qqrM2r5edvHOr69xmK+nYXc377ESa9loxoK1kxVg5WtnC0pjNJERtq5JmbF7G7pNlPkY9eSi9NP+wur1+O/dm/50j6+flT+6w6M+m1/OGSGVz/2PYhH/+zYzvcXv677hhvjfBEjRa7VPyI4ZCKHyHE2KIokBVjJcJiQKtRaLG5yetnCX9/3F6Vg5UyMXMsqWi2c+eL+wA4XNXKdY9u46ZTMzljUlyQIxO9kcSP6PKdMyewKCua57aV8N6BalzjpBTzw0M17CvbwN++Ooul2TFsOdZAdqyVuDBTQM9r1mvRapQBT2NyeX18+7ndvHPHMsLNer/G0tjh4s4X97LOTyPBHW4fDrePvbZm9pY1d3uurs3JOfev98t5RiutAnPTIzncywcci+HkrCqJCzV26y3Um2U5McOqHNQdT/y8ta+S+0dwymCURY/d7aNwAL0JhOiLKhU/QogxYEpiKGGmzs+Z1S2O43175P1R9G/98WuIjQX1nDM1gVuXZzEvPTLIUYkvksSP6KIoCgszo1iYGcXPL3DyzzUFIzotKJiqWx1c+8g2LpyZhFGnoaLZzjM3LwpoTx1FAZNOQ8cgKkDKGu189/k9PHbjgq7pR8Ohqiqrj9TyizcPSlNbP9BpYE5aJGWN9j5Lnf3x/y0YnB5fj0bZX6YoCqumJ/C/dYVDOodW07k2/N39VUPaf6jCzHoabWN/masIrGAMDRBCCH8JNekIM+k4UjW8YQ1ifFNV+OBQNR8cqubCWUncc95kEsPNwQ5LANKBSfQqOsTIzy+Yyty0iGCHMmJUtbPS4OVd5Ww+1sDP3zw44GqcobC7vTiG0ONm3dE6/u2HRtxbjjVw2YObueWpnZL08ZMJcSHsKG6iurXvf8/eln+dDFrsbho7XCfcbmpi2JDPodMoqKrK1sKGIR9jMDQKhBi1hJrkHogYvpPzN1sIITpNTgilolk+Dwr/eXtfJSvuW8eDnx7D6fFPqwMxdJL4EX3SahT+duVswsbpRdGz20r560d5ATv+tsLGISeWBjvWvLLZTnF9Bz6fyp7SJq57dBtXP7xVGuz5WW51O3Ghxn632V7cyOSEUHLiQkiLsjBxhBsYD4fFcOLXghDj0F8vEsNN+FTwBDDh+pn56ZEY9VranV4OVEjPASGEEONbs0y2FAFgc3n58we5nHv/Bj4dwcm6oqfxeUUvBiwjxsoDV8/hpid2MALXYqPOg58eI9Ki5/olGZj0/u3NMtB+OhaDlmlJYUxNDCPCYiA+zMTCzMGtmQ0x6TjrvnW02N04R2CS1ni1KDOKbV+a4tWb3OrPy6hnnqBvzmgxLz2yx6S23gxm6eIXaTUKM1LC0WoUJsaHDjq5OVhOjxenW+4+Cf9Rx+F7pBBi7Agz6zHrNdjd8jlR+F9hfQc3Pr6DlVPj+cUFU0mNsgQ7pHFHEj/ihE6fFMfvvjKDn71xYFwmf/7wXi5/+/goX1uUzuXzU5icMPSlLF+0Pr//xM91i9O5YWkGmTHWYfeFCTPpuXVZFr9/b+RHmo918zMiqWtzolGUASV9viyvuo2cuBDyR3g0+2BoNQo/PGfSgLYd6jItr0/lN28f5jcXT+cHKyfy6u5yNhXU0+rwnHjnIThQ0crE+BCqWhy0BegcYnxxjpOBCEKIsSXaaiA5woxOo2Ax6LC7T7ysW4ih+vhwDeuO1vGN07L55mnZA7qpKPxDEj9iQK5ZlMamY/Uj3nR1tHC4fTyysYhdpU28/q1Thn28koaOficIffP0bH50zqRhNQs9VtfOx4dr2FrYQH5NO265KPGrKIuB2DAjO/to4jwQGdEW4kJNlDWN3sbC6dEW/njpDBZnRZ9w25d2lPH89tIhn+uFHWUcqWrlvitn8+DX5uH1qRyoaGF3SRP7y5sprO+gyeairNE+5HN80dGadnLiQ2hzjN6kmzh5dDglgSiEOLnotQpOj5f9FS3BDkWMIy6PjwdW5/PhwWo+vHN5sMMZNyTxIwaspEFGORbUtJ9wstFAvLa7os/nbl2WOaykz7G6du54bg+HA7xUZjwLM+vQaDqrdYYjJsRIh8tD1Shtrn321Hj+cdWcAd2NeXZbCf/3+sFhn3NfeQtfe2Qb312RQ1qUBbfPR3SIgbnpkWTHhtBid/PizjK/VemYdBqirQYaBtC4Woj+SONKIcTJZnJCGAck6SOCJK+mjQPlLcw4SdoenOwk8SMG5IODVRyUBqi0OT1UtzqGNZbQ51N5bU95r89dtzide86bMqzEktvrk6RPgCWFm7v16RmqnSVNmPVa9BoF9yhbRxlm0vH7S2YMKOnzxKYifvX2Yb+du7rVwT2vH/Db8fpzoKKVmSnhkvgRw+aS/mlCiJNMXZtT+vqIoNpQUCeJnxEiU73ECRXVd/DDV/YHO4xR45PDNcPaf195c59LVW5ZljnsaiKHvHkHnNXon/XIigLTksJGXdIH4EerJhN7ggllAM9tK/Vr0icYPN7R9+8vTj72ITY2F0KIYKludTAjJSLYYYhxSlFgdkoEr+8pZ0/p0FsniIGRxI/oV6vDzc1P7pDmp1+wdQgNfL9oSz/Nb5/dVopnmL143tjT9zIyMTwGrcKizCgOVw2/2mdSQihpkWZ2loy+N7pZqRFcszDthNs53F7u/TB3BCIKrFCTFL+K4Ym06Ic80U4IIYLJNwpvPonxIcSg494P87j75f38/ZP8YIcz5kniR/Tr528c7LcJ8Xh0rLadFrt7yPv3t+9D6wu5+N+b+PhwDeoQZwO/va9yqKGJfsxNiyDCYmBbUeOw7+zPSYugsLadEj81KfYnjQK//8p0NAOYJHekqpVm29B/F0aDOakRozL5Jk4OOXEhzE6NICnCjFcunoQQJ6FDVa1MTggNdhhiHGpzethb1ozXp5ISOfQ2GmJgJPEj+vTWvkre3Du0JIJeq7AgI5KZKeFkxw5/HPloklvdxtI/rh7y/jcuzeBbp2eTFmXp9flDla3c+tROzn9gI822wfUdaXd6pFeJn+XEh5ATF8Lu0mZq25zDOpbVoGV+RiR7SptH5fIugBuWZjA9eWBrrcdCQ8i86lamJYUFOwxxksmOtTI3LYKSRht7y5o5VCl91YQQJye7y0teTRsLMyPRa8fO53VxcjljUlyfzw13NYToJPXtoleNHS5+9dahIe/v9qrUtTmZmx7Jj1dNxmLQsr2okbf3VfLGEJNJo4lBN/ScaWK4mR+tmswdZ+bwo1f391mhc7iqlWe2lvCdM3MGfOyKppGrIJmcEIJWo6HF7qamxTFqExnDsSAjkh3DGNf+ZZMTwoY1/j3Q4sOM3LVy4oC331PaHLhgRojN7WN/eQuLMqPYNsxlnGJ8MOs1tDo8HJNqWCHEGKGqsL2oiSirgQlxVg6Ut0jDZzGidMeLBA6Ut/DWvgo8PhWfT6XN4eHjIzVMiAvhK7OTWZgZxcT4UDQKw+6LOt5I4kf06i8f5tE4zMqR4gYbxQ02NuTX/z975x3eWFaf//fcon7VbEtusqwZe+xp9njs8ewuuwvLLix9WdoCC6HDJtQQCKT8EpKQhIQQAgQIhFBCCG2BUJbe2cJ6xuPpzTPj3m313u7vD9kaF9lWuZKupPN5nn32GVm6Orau7j3nPd/v++Lrb74Fd++3YnTRD1SB8NPdWHiFgFrB4m9fcBC/uLSA4DatQ198fBxvvGMPVHx2ZsJnp90Fj2s3DjXrEYkncXnev+Hxep0CdVoFtEoOPMsgKYoIRhMFtT/sdDkXkTKF2/61BIC4+hySPl48KcIbjoEBAcMADCFgGQJCCBiS+reCY6DiWQxL3AI04ZTvQpFlCP72vkMQVHxWz1/whvHDc3NFHlXpeHLMiaNtRpyf9dJ0JkpGWowqWAQVlgORbQ36KRQKpZJxBqIYGoviYLOeVjJSSsqJcSfu6ragvV6D2zsb8A+PXMKVhZuemiOTboxMuvH+Z3fDrFXgkbNzcAejaDaq8bzeZuiUVNbYDfoXomwhHEvg6ycmJTveki+S9rV58HgbvvzEBGbclT1pPiBRa4hJq0B3o4BT21ROLPuj+MQvR/Hee7t3PM60K4ifXljAx39ZPGM0m0mNZqMa52c8GU1Ml/1RLPtpm9lO6JSc7P5G9+y34u79Fuyp1+L4nrqsXuMMRPGazw8hUmUCyalJNxz1WsQSSUyXsHqOUhnMuMNoMaohKDmoeIYmKFIolKrl4pwXVkGJhQJb3CmUbPni4+N40x17YNIq8NR9Dbizsx6v+cIJ/PbqUvo5HRYdXMEo3vW103hKRx3a6rT48fk5/NX3LqDJoEI8IeIZB6x49zP3QZ/lRmYtQYUfyhZYhsCkUUjqFfMn3ziD/3zNAPY26PA/bzyOh748vEHFrTRefLRVsmNpd1Go/+M3N8AyDA63GGDS8DhiM8IXjuPkhAuPji7hd6PLuLFc/EqSNWNjSu50WnQwqPmimwibNDySYsrrKZEU0dtqwJnpnX14hsZW8PFXHIFGkd3tYHw5gIf+ZxiX5yv3+7sTY8sBaBUsWk1qKv5QtjC02qpJWwMpFEo1I4pAe72WCj+UkhGMJjDpDMKkVQBItXG9oLd5g/DDEoJgJIEnbqxsSUmeWAkCSAlIF2Y9+NLrB7Oe29YK9K9B2QLPMviz5+zHe755RrJj3lgO4IHPPIGvvflWdFh0+NE778Aj5+bw5NgKppwh/Gbdl1ru/PE9+3as+Hl0dBmX5rx40517sjqeXr2zIp1Iivj4L25W8hjUfEGpYvlgEZTwhSs7vakcdDcKcAejqRbHIvPS/lZ8+KW9AABPKAolx0DFc/iP31zHh36Uilw3anhEYkmEYjcrtrzhOH54bh4v6d9ZzAxE4vjMb2/gs7+9XvWVDoFoAnsbFFT4oWyLLxwDzxLEEtXnbUahUCgcQxCvQu9GinzhWbJlTdRsVG3495UFX1aFAyfGXfjL75zHvz5wRMohVjxU+KFk5MVHW/C1oUlJKxSW/VG87X9P4SX9rbj3YCOe39uM5/c2AwB+N7qEG0sBXFv045FzcwX7CxWL5/c24x13d+z4nCNtRlxZ8CGZFLOKxD7QpMcjZ7P3Siml6KNVsDjYYsDpqcITrWoJQoAuq4CJlUDJzBF/cmEe//Ciw+BZBm/9yggeu76MnhYDXnWLHZ968CgevbYMniH436GbbZwKjsFdXQ0w7iA+JpIiHh6ewkd+erWmzoFzMx40CEos1dDvTMmei3M+9NtNkvuAUSgUihzot5toVSOlpDxwzAZHvXbDY7+8tJj38b49MoOndjXgviMthQ6taqBx7pSMEELwznuyT5PKlsvzPnzwkUv47yfGNzx+R2cDXnNbO/7uhYfwudcMAEglDO2z6iQfQ7702oz48Et6dnWQ1yk5vOF2R1aiDwCcmXJLMDppYUgq0YrnGAyNOanZbZaoeAZdVh0YpM71UiZieMNxPHZtGQDw3nu7IIrAmWkPHru2jOccbsIdHfX40hMT6QqFY+0m/PRdd+Izrx7APQesGY/5u9ElPPfjv8P7vnWupkQfABhoN8lWgKbIg2A0Xu4hUCgUiuSwDMG0K1juYVBqDGcgiu+dmUV4tSr9OyPT+NyjYwUd893fOIMvPT4OUaTVawAVfig7cHtHPY61m4py7Fl3eNtJc2+rEV96/SB+89678P233443Z9kyVUyaDCr856v7d0zXisQTODvtzuniMuUM4meXFqQYomT0tBrQbFTjxLgL7iBt78oWs5bHPouAKwt+lKv74z3fPIPvnZlFV6OAv7vvIFiGwBdOfc+efbgJX3jtMbygtxnve1Y3vvyG42jftLOyni89Po5X/9dQ1Xr57MbpKXdBiXSU6mfeE0aW+j6FQqFUDP12E2bc4XIPg1Jj/PDcPN7x1RG84UsnAAD3HmzE25/egfY6Td7HTCRF/PX3LuCBz/4eU04qZpJSKmADAwPiyZMnS/Z+lML5/plZvP2rI0U5tlmrwDMPWPGXzzuwawTfo6PLeO/DZzDnKf2NyKTh8eU3HMehFsO2z0kkRbzuiynn+cF2Mz7xyj5Y9SrEE0mQ1bjwTLz/W2fxtRNTxRp6Tuxt0ELBMbg0V5sL/XwhBBiwm3Bpzgt/ZGvaWTlgCHDEZsR77+3CLXvqdq1Sy8RDXx7Gjy/MF2F0lUGXVahoA3pK8bGbNVj0RxDKkHJIoVAolYi9ToM5dwhR6l9Ws9jNGkyUWSQ59f+egTNTbogQ0dtqxJ3//KuMicK50GxQ4X/fdMuOm57VACFkWBTFgUw/ox4/lB25q9tSNANLVzCKWEKEVrF9Fc0at3fW41fveRp+eXkRJ8adODXhwoVZb9GN5wYdZnzs5UfQZFDv+LzP/vZG2nV+aNyJ4//wC2gVLIKxBEQRuHVPHT54/yHsbbjZujbtCuL8rBe9NgPOTO2cvFRMLIISrSb1tpHylJ3pbzPhxLi8fD6SYiqa/JWfexLPPGDFC3pbMOgwIxiNwxuKwxuOwRuKISkCTUYVDrcYwLMbC0Cv1rjoMb7ih6Nei7ESJOZRKg81z8AVjFLRh0KhVBUTK0Eca5ffvIZSXmxmNaacqcCLp3TU4bFrK7u8ojC+/MQEPvXra7iry4KOBgHBWOH32llPGA989gl8+Q3Hsc8qSDDKyoNW/FB25X0Pn8XXT0pflWIRlGiv0+L2znrc39cCmzm3Ur5QNNVadX7WC384Dn8khtFFP06MOQtWhS2CEm+43YE33rFn22qdNS7MevDCTz62qzimYBl8/rXHcHtnPQDgM7+5jn/80WUQpASmS3NeeMOl84zQ8AwOtxoxMuWmHj55sqdei1l3COEK//sZNTzefOcevPa2dogi8OGfXMEXHx8v97DKTnejDpfni5/IRqlMFBxDr50UCqWq0PAMNEoObWYN3MEYbtDNj5pjc8XPnz6rC/5wHJ/69XUY1Dw+8+p+vPyzvy/JWP7gVjuuL/klFZpe2t+K7iY9XjFoq8q4d1rxQymIdz9zH350fk5yUWLRF8GiL4KhcSf+9WdXMegw48+fsx9HbMasXq9WsDi+pw7H99RteDwcS+DR0WV87BejODeTWyVNr82I1z+lHc8+1AQFt7sF1uiCD6//4omsKqKiiSTmvTdb1c5Op8YmAnhyzAkFSzBgN2HJH8HESvFKLBmS6t++tuiniQ0FYBGUWPSFK170AQB3MIZ//vEVfPpX1xFPihvi3muZy/N+9NlS4iiFsplmgwrjRbxWUygUymY0PIODLQYwhODirAe+SAIdFh2uLe68SaHimKzmKwYNjzlPBMv+VLiBQc3DbtbgbI7zaUr1cHtHPbyhOB45N4f3PLML4yUUA39xaREz7pCkx/zm8DQAwKjm8eL+VkmPLXdoxQ8lK/77iXH81XcvFP19WIbgz57djTfeUbihcyIp4msnJvGt4WmcmfZkNGplGYJ9VgFHbEa8dKAVR9uyN7P+/Y0V/OH/DMOVgwHyK4+3IRxL4K+edwCff2wcH//FaMbnHWjSg2MJzs14kO9X9IjNCI4hSIoikiKQFEUoOAYL3nC6XJOSP72tBpyZphOhaqa9ToNoIolZanJJyUB7nQY6FYfzM95yD4VCodQIg+0mDK22YbXXacAyBNeXAui1GRCLi5j3hrGnQYuRCVc6aGLAboI7FMsoDpk0PPY06MAQgkQyCY4huLEcSAs/AJ3v1Bp2c+q8evWtdiSSIh48bod61ZYjFE3g2R/7bVVsetTrFNApOdjMGnzhtcfAsdWReUUrfigF87IBGz74g0uIJopb3ZBIivjgI5fQZFDjuT1NBR2LZQgePG7Hg8ftCMcSmHaFMOUMYsEbBs8ysNdpcLDZkL6YZcvVBR/++cdX8PM80rj+98lJAKk0mJ36Sy/OpRYSTQYltAoOgooDz7KY84Qw5dpdtBl0mDGUoZpnsN1MRR8JsNdp6CSoBrDoVRm/RxQKAIyvBNFh0e3+RAqFQpGIyLqqnfWL7/Vekc5AFBoFiyaDCkqOxcmJlFB0oEnAtDsEbyhVwd/XZsS1RT+GJ7b38znYrKfznRrkzn0NeN1THBsem3GHcGHGUxWiDwAs+6PQKDg8ecOJZX8UjQZVuYdUdKjwQ8kKFc9i0GHGo9eWS/J+7334DPZZdeiUyHxLxbPosOjynqSHYwn8/SOX8Ouri5IIJ49fX8Hj13fvV53zRABENjzW12bErDuEBW8k42u2E30AADR6WBIadMqituNR5MHleS/qdYoNO58UynquLfohqDj4SujPRqFQapdsPSyD0QSuL21sybk454OjXgtvKI5DzXqMZBHqsYvNJaVKyeS7enbKjT/8yqkyjEZ6bGY1/uUlvTi+pw6L3jAs+uoXfQCgOmqaKCXhnv2Wkr1XMJrA3z1yqWTvtxv/9OPL+PLvJ2RRLTMy6YYzEMWgw5yxWuks9SMpOnQiVBt4Q3E4qjz2k1I4PEsvCBQKpTjsbdDicIse7XWphbhBzRd0vGlXEPusOiz4Mm8erketYGkra40SiW8VGJ++35I+DyuZY+0mPPKOO9IesbUi+gBU+KHkwN37rSV9v5EdSk9LybeGp/GFx8bLPYwNxBIihsacUHMsBuwm9LQY0G834Vi7aUfzvlJ6elUbFkGJwXYTrIIy3V9PqX4WvGEMOsw42masigkPRXqyMfenUCiUXBlsN+P6UgDnZrwYXwnCIihxdd5X0DFjCRFXF/xYykL40Sk40KtbbfLLS4tIbvJGVXIs/u3lfVDzuVlklJPDLYYtj735zr3QqwoTUCsVKvxQssZm1kCnLF134JE2Y8neKxOxRBKf/vV1vPfhM2Udx044g1GcnHDh7IwHwxMunNhVkKA707niqNfgWLsJzkAEQ+OurHbJKNXDpDOEoTEnTk26MeUMopN6ulDWwbOEtnlRKJSiEE9u3Mhb9EXgi5TuehOMxtFnMyCLkFtKlXFywoX3PHwGoU2thUdsRvz0j++sGPHnGQeseEFv84bHfOHsQ3mqDfpVpuyKPxLHJ34xijf990kEoqW74dy6t273JxWJ01NuPP8Tj+KffnwZGcLAKpiq+mWKzqDDjLHlIILRBHQ1ujtAuUlCBEYX/TjYrC/3UCgygSUEA3YTWNr/SaFQJIaU+bISiCYwMuWBTsVj0GGGLscwFEpl8+1TM3jjf5/Y8niLUZ0xKbkcvPhoK/7vrU/BvQczd6X868+uoqtRwOf+YAB3d1uwp16LrkZp/GMrEWruTNkVNc/i55cXcabE3jH3lLi1bI3hCRde8h+P5x2jLmeq8XcqFgN2U9ok+8KsFz2tBriDNNmCAnAMAcsQ2Ux8KOUjHE/i5IQLA3ZTOjmHQqFQpEAu9xh3MIahMSfMWh4DTXp6rashHru2glA0scFTNJpIIpbMbCuhYBm84+4OPHCsDbPuEH59ZQk/v7SAczPFmT9/69Q0JlYC+PzrjqHVNIrhCRdOb1qvfvgnV/Djd92B/3rtsaKMoZKgwg9lV4LROEYXCuspzpVem7FsLRVPjq1QgaTG6bLqMLLpxnF22gOtgs06UYNSvZyZ9qDfbtoxApdSW5yccKHfbsTwhLvcQ6FQKFWCOyivlhRnIAZnwAWThsfeBh1GJl2gFmfVTZdVgHJTr5+KZ/FvDxzBb64urW6EMeBZAougxLMONaLDkqqoaRCU6LUZ8c57OjG+HMB3T8/iaycmMecJSzrGkxMufOfUDP7f8w5AFEX879AkOi0C2us1CEUTGBpzoi1DSlktQoUfyq7MuEMIlnCx22xQ4TOv6gcpU41rNYs+VfyrSQZLgFAsuWWnjZCU8//YcmCbV1JqiVruEadshCFAk0ENQj3UKBSKhFj1KoyvBMs9jC24gjGcnHDhcIse52jqV1XzDy86BCZDK/N9R1pw35GWrI/TXq/FO+/pxLMONeL5n3gU0cT2QTT58C8/vQIVz+CBY2148Lh9w8/sdTSddQ3q8UPZlVJHmK8EoiV9v83c1VW62PqSQ5WfXRloN2PSuXWiJYqpVLTeVgN46udR82STiEKpfgiAg816zLhDtP2BQqFIQrNRhd5WA55cbTeXK/GkCJ6l86Fqpa/NiH67WdJjdjUKePCWNkmPCQC+cBzdjdR/cTeyEn4IIUZCyMOEkMuEkEuEkFsJIR8ghMwQQk6v/vecYg+WUh6++PhYSd8vEk/ioz+7WtL3XM+BZj2ecaA8/kLFhhDguMOMnlYDrIIyY8xhrbNTQs/4ShBnpj3os5tKOCKKHGnUq8o9BIoM0CpZuuNNoVAKRqdgcazdhD6bEUu+CM5My99T8NKcDwea6GK7WnnFoPQCDQA8dV+DZMdiSMrg+cMv6UFPK13T7Ea2FT8fA/BjURS7AfQCuLT6+EdFUTyy+t8PizJCStn58uuP46X9rSV9z28MT+HS3NbJ9JkpN975tREsejP3hz48PI0HP/d7fPJX1+AJ5d+K8VfPOwAVX30FcScnXHhyzImz0x4s+CJY9kfA0eqVNL2tBkxlqPbZDP2L1TZ2s6bslYkUedBprd10EAqFIh0HWww4Me7CyJQbsQoyzjkz7cFxhxmdFh36bAb0241oNanLPSxKgdyz34IX9WXfypULe+ql83BNiimD5/d96yyuLvglO261suvKlhBiAHAngP8CAFEUo6Iouos8LoqMmHaFtjikFxtRBL55cnrL42dnPPjemVlc2cZs+pO/uobHrq3gwz+5gqd86Jf4+onJvN7fZtbgHXd35vXaSmLOE0Zfm7Hcwyg5ap5Bk2FjxYZZw2N00Q9fZPuKHwoFAKwGFRZpq1dNwzMER9uMGJl0l3soFAqFUlaeHHNidNGPkSkPhifcmHaFcKydVkYXG0HJQckxYBmCAbsJCrbwDWtCgPuPtuAzrx4AJ8HxMsFz0m+fJkXg9zdWJD9utZHNJ+oAsATgC4SQEULI5wghay5JbyOEnCWEfJ4QQr/hVcqb/vskRhdLr6L+4OwskpsMdl99ix3/77kH0J7BqGvGHdpgvOuPxPG+b53DV56cyOv9H7pzb9HUbjlxYykABVd91U3bwRCgzazFvDecnpgcd5jhDMayNjEPxWiyVy0Tk9iUkFJ5HGo14BQVfSgUikTIJbpdKk6Mu9DVKEBQsrs/mZIXgorDi4624KGn7sEdnQ34+/sP4Z79+fuUNhlU+M177sK77tkHtojdAPGEuCUprFCseiXu6KyX9JjVSDZ/dQ7AUQCfFkWxD0AAwPsBfBrAXgBHAMwB+EimFxNC3kwIOUkIObm0tCTJoCmlxaDmy/K+i74IZtxbjaVff7sDtk2xfA8PT+PVn3sy43H+4jvn8xJ/GIbgz56zXxIFXc6sBKLosxnLPYySMdBuxpUFH0QxNTEZbDfj/Ez2vfRaBYtLs9TTo5ZRsAxUPIP9TQKO2IwoUwAhpYzEqfhHoVAkosWorkpz+CvzPuzP0gOIABvCM8waHt2NtJV2MyxD8KfP6sJL+lsx6wnjq0NT+OSvruOjP7+KP//OObz5zr14SkddzsdVsAw+/oo+tNUVP/bcZtbgi68bhKAqPFxcwTK4v68FP3j7HdjTIF0LWbWSzYp2GsC0KIprq+qHARwVRXFBFMWEKIpJAP8JYDDTi0VR/KwoigOiKA40NEhn5kQpHW+4w1G29/ZmGZn8s4vzuLFDzPZffOc83v310/jEL0bxyNm5rN+/QVDi9hpQkM9MudFvN1V95c+A3YShTSkZQ+NOBLKs9AEAhhDstdCbSy3z5JgT4VgSl+Z8OD3lxsA6s2+eJVX/Pap1Ohq0uDyfud2YQqFQcmXGHUJnlc4rFn0RGDW7byAPOsw4M+2BRslhf5MAdyiGy/Mp82hH/c0q/54WAw4216ahdHejgPfe24UvPzEBdzCGhx+6FS8baMVL+1txz34rYgkRj15bxqde2Z+Tz5KSY/CpB4/iWLu0CV47ceveOnz7D2/LW/y5q6sB33/b7Tjz18/ERx84ggZBKfEIqxMiiruXFhJCfgfgjaIoXiGEfACAFsC/iqI4t/rzPwZwXBTFl+90nIGBAfHkyZOFj5pScs5Ne/CzSwv491+OopTVqG+83YG/fN6BXZ/3y8sLeP0Xsz+37tlvxTMPWnHvwcaMFU2haAL/+bsbiCWSuLEUwCPnsheLKhlBySIupn7/asNu1mAiC+PmbDjuMMs+ZpVSWgbbTRABXJ7zQqvkoFfz1GiwSum3mzBchbvzFAqlfPTZDBiZkn+SVz7wLMGhZgOiiQSmXCEEwnGs+VerOIKDLcZdr6kDdhNOTrhgUPMQRRFtdRoEIglMOQOIV2EBpopncGdnA+p0CrAMgZpnMe+N4Ifn5tJtgd9961PQu65i/9KcFzxLcHLchQPNerzhSyextIMf4YEmPf7kmftw6946aBSFV9/kw6I3jGV/FO31Gvz26hI+/+g4hsazm18fbjHg+2+/vcgjrDwIIcOiKA5k/FmWws8RAJ8DoABwA8DrAHwcqTYvEcA4gLesCUHbQYWfyufZH/tdxrStYvHBFx7Cq26xZ/XcLzw2hr/5/sWcjq9gGTy/txl/+qwuWFfjmeOJJF7w74/hYgl/T7nQqFdi3ludprUankEonkQWl7wdaTWpkUiKmPNkTpajUADgaJuResBUITxLcLDZUPLAAwqFUt1oeAZJAOFYFaoYm+BZgg6LDpfnfDhiM4LnmC3V2Jk47jDj5IRrgx9StQnxhAC3rQoxj19b3rEi/bOv7kedTomjbUYEown8yTfO4McX5sEQ4OLfPguBSBxP3FjB1XkfLs/78JurS4jEkyAEeMude/HuZ+yTZYXy49eW8f5vn8PkLpu1n3hFH57f21yiUVUOOwk/Wcl7oiieBrD5AK8ucFyUCuPGkh/jO7RTFQMmB/OM197WjkdHl/GLy4tZvyaaSOJbp6bx4/NzePvdnXjdU9rxi0uLNSP6WATlhnSiZqO6aoWf/c0GSSYH8URS0r+RimPAswS+SPVVWdUy1PenOuluFKjoQ6FQJMWg5mARVGUJUikHsYSIS3M+MAQYmXJjf1N2Xj6ZKq3PrLZbj68E4KjXIhhN4NKcN92d0GxUwaRR4EKFeDOKIvDYtd3TqQbbzfjQjy7jxnIAPa0GeEMxjK+khBJ7nRYqnoWKZ/G8nmagJ/WayZUgvnpiEvcebMQRGXt73tZRjx+/6w689gsndhQEv3t6FgY1j9s76sEU0Yy6msiq4kcqaMVPZfOB713AFx8fL+l7Pr+3GZ94RV/Wz5/3hPGMj/4GvnB+kdyEoOCKkEqhbzWK2CIoV82yRUTiSZyfqYybYy7olCx4loErmJ1n1HbwLMH+Jj0mVgJoEFQQVBwmV4JYCUSzPsZxhxkjU26whAAk1Van4BgcaTUCACLxBCLxBC7P18YEsFpZK0unVBcMAXptRlye91VlSyyFQtlIv92EeDKJM9u0YQ3YTXAFo6jXKTEy6UI0kd0kUsESRBMizFoF1DybMcykVhh0mLOq+NkJFc+kq6WMGh4dFh2SSREXZr3QKllEYsmc/Bwrmf1NevzonXeUexgFs+KP4LkffxTz3psV9s0GFWZXK+7X5lmHWvT4yhtugSELL6laoOBWL6mgwk9l85ML83jLl4dL/r7/9sARvDCHWPWfX1zAm758smYEnGwxangwBDCoFdCrOIyvBOEJFSaEVBJHbMai7NRrFSwc9Vqc32Y3qcuqg5JnoeQYEJCsepc1CjbraHkAcNRroVdxYBmC0UV/3sInRTqqrfycshGeIbDXa6HkGIgi4ApGseSLIF5lkcwUSi0zYDfhzLQb8aSIIzYjFr1h6JQ81AoGLMOAJRvv6U0GJeY821cEt5nVaDKo4QxGcWMpgJ4WA64t+RGOJRDLUjCqVnpbDTgzXTyPI4ugBM8yNSGwmTQ8nvizu6Hi2XIPpWCGJ5x47edPwBeJQ8Ey+OgDR/DW/z0FAPj5u+/Ee755Fqen3PiH+w/jlcfbyjxaeVBwqxeFAgBP77bgUIu+5BUh7/r6afx2dAkv6W/F2HIAVkGFew5Yt33+PQes+NqbbsHwpAvNBjV0Sg4ffORiugSy2uCYlFeRgmehYBlwLAHPEsy5w4gmRDQbVajTKqDiWZwYd8EZqB2xZz0Ktjh9zIFoAlrlzUtpk0EJi6CCKAJKnsGJ8dwX/92NQk7+ML5wDPOeMEKxBFqMajQb1VDxDK4v+uGPJKBgCeJJsaTG7LXO2BKt2KpmYkkRY0t+rF+rmTQ8bCYNzs5Up0ErhVJLEACX531pQWYkfU/e3t8v06aLimNwuNUAhhCcmXZj0nlTeAhE49hnpe2jAKAsskix6IvAUa9Fq0mNaVfqM2AIqnJe5ArG8MdfP41PvvJougVqzhNCkyH7pC+50G834yd/fCc+/evreHq3BRMrNy1H/JEEvvqmW8AwxZvjVxu04oeSE/FEEp9/bAwf+tHlsl4s33C7A3/xnP1Z93QOTzjx4k8/UeRRFYeeFgMISRn+JUQRRg2P0YXUDlE0sb1Z8bF2E06Mu7C/ScClORo9XMwkrl6bAbG4CDXPYMoV2uCblA8HmvS7+kztqddCp+JwdtoDm0mNlUB0S5UQzxJY9CrMuUPoa6MVKKWGGjzXJsfaTZh0BtFm1uD0lDu9cOSYlKHp6KJ/gzkphUKRJ+11GvgjcSz7s2vnXt+ydKzdhFOTbiRFkVag74IUrV65cLBZD1EUcWXBn54/VWOl9Iv6WvCB+w5Cr+Jx/6cew9vu6sDd+7ffOK8EApE4/vFHl2AzafDmO/eAUEPFLdBWL4rkfPAHF/G5R8fKOobn9jThYw8cAZeFyrvoC2Pw739RglFJx8FmAf5IAhN5VioZ1DxsZnVVevbkw5oQVgn0tBoQiSVxZSGzYOeo12LZH4EvHIdVrwQB2dADvR0GNY/uRoFG0ZeInhYDrf6ocbqsAniWQFBz8IcTODfjoWI8hVJmDrXowTEMbiz74Q3tvOA/2KzP2hiYZQj67Ua4AjGYNDyGKmTOUS5aTWoY1Tx8kXjec10p6Gk1YN4TLnjTTo406lW4ZY8Z3z87hwG7CV9/y63lHhKlyNBWL4rkOBq05R4CHjk7h2cesOK+I7v7/1gEVdE8XooFz7KYWMl/ceAJxeCZqc22rkycGHelDa3lztnVPvc+mxEj685ZBUvQu3oer1URLOSQMOYJxeAKZm9ETSmMWklooWzPevH2YLMeABCgCX4UStlgCDCxHIQvkhJ89tRroVYw8ATjqBMUUHJsuvpEUHG4PJ/9PCyRFDE0RsWebFByBIu+SLrtqpycnfagv81UlcLPvDeM/zs9CwAYGnfCHYzCqFGUeVSUckEb4ih5IZeSyE/+6hqi8WRWz+1pNRR5NNJyesqNY+2mcg+jqkhWWHvFyJQbzQYVWk1qHGzW41CLASfGXXmbQBrUfM0bSJYKR70WsUR21yZKbXBjOeVNIKhYsDR6lkIpC72thrToA6S+l5fmfCAEODPlQSgaB7e6OupuFGhbZpGIxEVoFfIxHx5b8aPar8qiCCg4uvSvZeinT8mZSDyBrw1NlnsYAICrC3485+O/wxcfH8P4cmDb5027gvjhubkSjkwaToy70NNqQG+rASYaU1gQexu0WPJX3m7OrCeMaVcIF2a9BfvF1OsUGNvhe0IpHEHFYaDdhPGVAE14qiH6bEYcWq3oMWtTu6mEpB7vbhSwz6pD/erjF2Z96LdTUZ9CKTUWQYkby1tbipIiMLVaeXJuxotGgxr9bcasW7wo+bHPKpR7CGmcgRj2NGjRZzOiQwZdDcXir797Ac4ArfyuVWirFyVn/u3no7JKyLq26Md3R2bxge9dhKNei1cM2vDgcTu0Sg4nxp34yE+v4MkxZ8Wa6621/RAAh1v0CMeStIUkD1iGYNa9uw9ONXN9KYDuRiGn0nVKbrSZNThJfR1qDpYhGJny4nCLHjeWAjjQpIeKZ7YVa2NZVqpSKJTC6bDoYFDzODfjyapKfNoVkkULUrWTlNnE/PrSWlUmB52ChT9afW253xyexrMPN+Lp3ZVt8kzJDyr8UHLiZxcX8JnfXC/3MLbAsakCzbHlAP7hh5fx6V9fx70HG/HtUzOIVkm7hYjUThRLgMF2M4bGqUFvthCgrMaBcmJ8JYAmgxJznsqrfpI7h1r01Ey9RllrHTm3+vlnSuXTKVjssehAIL8FD4VSrQzYTThJEy1lx2C7Sbbm175wHM1GFSKJZFW2x49nqHqj1Aa01YuSNQ8PT+NN/32yrDHumeBZssWQzRWM4WsnpqpG9FlPQkwZtA22m8s9lIrBpOERoTvsAIBwLIk2c/WWMZcTrYLupdQqBLvfGFtMGpyd9uDM6n8UCqX4hOm9X5a4gjFZe53NusOo11WnCfJCFimwlOqECj+UrHl+bxNu76gv9zAAAByTSmLobTXgUIuhJqs5hsad6GqUT3+0nNEq6YJ8PU+OOaFWsGjUq6jXiESYNTxtoathRHHnBQzHADoVvQ5RKKUmmaTCjxwZXfTjSKux3MPYEQVbfcvkwXYzbt1bV+5hUMpE9Z3RlKKh5Fh85tX96GszlnsoOGIz4cZyAGemPRURz10sDHQhkRUWvbLcQ5AdoWgC894whidcGKDiT8HY6jTwhGLlHgalDKRM03f3XeMYgiM2I7obdRiwm9CoV6FOW507yhSKHCBIVblS5MnVBXm2Rps0PAYdJkw4q8vniWUI7t5vwYEmPUTablyTUOGHkhNaJYcvvnYQt5VZLT416UKXjNIAyod8y2TlBJ347Qy9/RfOxVkvFdBqlL0NOkR38YGIJ1OVdqen3Lg878fJCRfmvWFwDIGOViRSKEXhcKsBN2iSpWxpNKjLPYQt7LPqEIjEMTQmT/+hQkgkRfzjjy7jm8PTeOLGSrmHQykDVPih5IxBw+PLbziOt93VUbYxJEXg+pIPfTZj2cYgB6rRw0hqzFpFRqNVyk0Suxh3dVp1ONpmhE7BlmhElUcsIcIXjpd7GJQycHbak3f874IvggOrMfAUCkVa1Dy9Z8mV3laD7O6ZLUY13MHYrkJ+pXN90Y//fXKy3MOglAEq/FDygmUI3nNvF77w2mMwqPmyjCGeBPgq7L/NBTkb48kFm0kNWtG6M7FNAqJefbMCoddmwPhyAKcm3ehqogvUnbix5IdVUEKgFRw1g1mrQFudBkIB98Fri37QSzmFIj20/Va+8CyDeRmZDLeZNQhFE1vCYqqRb4/MYHjCRb8fNUhtr5opBXNXtwXffOhWWITyeKiE44myvK9cuDrvRYdFV+5hyJpqjOKUmlgiCYYALAGOO8zwhuIgBDCoeZyb9qT/hiOTLpg11JNkO2JJEU0GdTram1L9dFh0uDLvK8hrzhmI4lCLQbpBUSgUmLUKXFmghvtyRU4bl0qOQSIpwhmMlnsoJWPOE8YDn3kCp6fc5R4KpYRQ4YdSMPusAj780t6yvPdojd/UfZEEri36MWA34QCtxsgITdLZnWlXCHo1DyXP4skxJwBAFFO7peu7wJIiEIon0GxQYZ9Vh55WAwbsJuptsw4in7kspQRIZZBJTxsKRVrazBpa7StT9jcJsmrz6m01YsZdXUbO2XB53of7P/UYfnhurtxDoZQIuiKiSMKdnfW4vaMej15bLun71umUmHbV3sV6MycnXDjcQoWfTISjtV0Vlg3BaALBLP9OoWgCoWgC8Gx8/LjDnBaNAKDFqEKrSYNwLAEFxyCeEKHgGFyY8cBfos9kTZDyR+KIxpMlMfmkwk/tsM+qk2zx4pXRIohCqQZcwepv2alE+mxGjMioykTNszgx7tz9iVWKKAJX5n14zuGmcg+FUgKo8EORBEIIPvKyXjz7Y7+DM1DCUkkRYAiwizdtTaBgqYlhJlTU3LEkPDnmRL1OAY2ChQhgyhnCjHtr/75GwaKn1YBILAmeJdAoOXhDMVyel7Z6r82sxqU5LwKrItNxh7kkwk+2Ahql8glGE5JtPGz22aJQKIUxuRKCimdoqqeMYAlk134XiiVwuMUAXziG8ZVguYdTcpoNKrzj7s5yD4NSImirF0UyrHoV3niHo6TvOe0O4WgbbTM57jBjeLL6oiel4OqiD92NQrmHURMs+6OYdIYw5dx+MRyMJnBjKYArCz6cn/ViaMyJy/M+7M0zFSkTva0GLPmjadEHAK4u+KDmi3vL45iUsEWpDZqN0kURL/sisNdpJDsehVLriABsJvqdkhMGNQ9Bhu3352Y8mHAG0WnRoV6nQJe1duaM894wJlaKvylGkQdU+KFIypSz9Gr5jSU/dDWcotPTYtjQYpMJniXY26Atmwl3OXEHY7KcaNQy/gzmx/W6ws9NjkmJoGemPal2tHW4gjEcbjUW/B7bwRJgT4MOpwow+aVUFsMTLsn8rcLxJKyCSpJjUSiUFPEkrfaRE85gDL5QTJbWBKIIjC76seyP4sayH302Y7mHVBKSIvDiTz+Ox0ts1UEpD1T4oUhGIBLH/43Mlvx9ncEY6nUK1OtqM22IZXc3FTnaZsL1pQAWfRHoFCw6rToca6+dSqk4TfaSPWdnPAVX/bSYNDuKoENjTtjMavS1GQEA/XYT9q1+F447zOgvYBHf12bC1QV/3q+nVB6JpIiTEy50WaVJVpwsw8YJhVLNuIM0rlpuBGNJuGUeIx5LiDgz7Za0ErkUvOqWNjy/txm3d9Tn9DpXMIYfnZ8v0qgocoJug1Mk49dXlhCKlcffYnwlCKOGx3GHGQveMAQVj0RSxMU5b1nGU0riO3hDDDrMmHGFNvwd/NEERhf8aDHWzu5yNuIYpbyEogks+6Pot5swPJF722KDTomJLPrzp1Zb0fY3CVvehxDAIiix6MvdFFTuE1lK8RBUfMHH2GfVUeGQQpGY9jotXEF3uYdB2cSUM4SjbcZtK2QJAY7ZzXjGASvqBQW+8vtJnMxjXlAISREIRBM41KxHIJrAWAk8AgvlD25txz6rgJf9xxM5v1ZN29RrAir8UCTjOyPTZX1/dzC2ZbffUa+tiIt1IYwtbf/7haLxbSMqGwRVRvPdamRz2w9FnnhCMQxPuLC3QQuOIbiybiFs1ipgN2vAcwQA2RJ/nUiKWPJnL9hcmttqMCmKqcrFXpsBZ6Y8GV6Vmc2JZpTa4sy0G4db9Dg3k/9Gg1FTmxWrFEoxSdI8d9nCsxubTggBBtvNeG5PE551sBEW/c3NyeccbsJbv3IKP7+0WNIxznvCmPeE0dNqKOn75svffv8iPvCCAzBqePS0GrDij2YVU2/VK/HmO/eUYISUckOFH4okXF3w4ZeXS3tBzoYGnaLqhZ8tK+C1h8nOopCSq51Oz0tz3pwX85TycX31vO1tNSCRFCECuDDrLUliYCCagCsQg1VQYsEXQU+rAQxJpeYNZYh8NWsUGR+n1A6xhAiNorDp1I0lWu1DqX4GHWYEo3GcL0AkzZbuRmGLuECRD+ur1RsEJR55++0bxJ71KDkWn331AH55eRHfGZnBjeUAri/5EY2XxsPJE4pByRFE4tIIiRwDHLWbQEAw7QoWvAm7p0GL+3pbcMxhQotRg8/+wUD6Zyv+CH5/w4n/+f0EnrixsuW1ehWHz7/2mCQ+ixT5Q4UfSsHEEkn82bfPyTRSvfpbfLb7DTU8C/8OlS7lassrB0kRUHG0jLXSuDDrRbwMF5ZJZxA8S7DPqsPZ6ZtiYabS9A6Ljgo/NQ7PEix4C5u4NxvVaDaqseSLYMEblun9lELJDxXHoNmoxrIvghvLARxuMSAUS2DWFUSwCHHrPEMw4wrBlyFIgCIP1rsU3LqnblvRJxCJ4y//7zwA4L4jzfjb+w7iu6dn8c3haVwqkZ3DxEoQ/W1GDGcR3qDkCI7YTBBF4NqiDyatAhMrAaxpVHazGgxDMDSWal3rsgoYbNfkPY94za12/Plz90O5zRy3TqfEc3ua8NyeJlxd8OFLj4/j26dm0muAz7/2GA42V0ZFE6VwqPBDKZh//vHlvDw5SkL16z6IJ0UY1Dw8mzxGAtEE6nUKLPszV0kUulCpNMI1JHRVC+UQfdaIJcQtniuX5nw41m7CifHU9e5Yu4mKPhT0tZkwVGCr33qBsafVsOHfFEql02szbmiHPTeTOr+L1SYbS4qwangq/MiYVNt2iu2M7Re8Ybz2CyfSAs93RmbAMQQmrQJLeXjxFQIhmRcU3Y06AASX530YsJswvhLYcE47gzGoeRYHmnVQ8yxOTboQWxc4cmUh1XbOMUCuBUx/+LS9eN+zurN+/j6rgL+//zD+9Fnd+ObJKfzHb66jr612gl4oABFL2P86MDAgnjx5smTvRyk+Dw9P4z3fPFPuYWREUHGAiJq48TcbVZh1h3HcYcal+Zs7IL5QHJm+4YKShS9SO0JIq0mNGXcItN2fIgV76rXwheMIROMIUv+omuZQsx7nZ6XddVZxDCKJJL1eUaqGDosO1xa3tjOatTx84fiGhbAUtJnV8IXjcNFUL9nBswR1WgWajep0Be3X3nwLbtlTt+W5b/rvk/jZxYUSjzAzLENwxGZEOJaAWsGCIQTxRDL9O2TagM2W7kYBl+e3+g5mgiHA83ub8YdP24vuRn1e77dGOJaAiqfV8NUGIWRYFMWBTD+jFT+UvPnV5UW871tnyz2MbUkmReyzCvCEY7ixg9dNNbDkjeBQsx4rgQi8od2FrhaTJuubTDXQZFBh2rW7wR2Fkg0MQ9BsVOEMrcqoebxh6TcWwvEkFBxTMv8KCqXYbBew4AzENlRRSoHdrMGkK0iFU5myzyrgwqwX895UxY5OyWGw3bzleZF4Ar+9ulTq4W1LIinu2N2Qr+gDAFPO4K4bsixD8LIBGx566h7Y66SJmaeiT+1BXc8oeXFh1oM/+sopJGRsRBCIJjAy5Ua9tvoNy2JJEednvbi2uLvApeEZ8DUWby7n85RSeVxb9Je1DY0iHxoE6e8vHQ1aKvpQqoqdugvOzXiwv0nY9RhMFtOWep0CIKCij0wRlCxUHAv1OsGh0aACk+HDHZl0I1Ij18FANAHzDmuVFx5pxrf+8Db844sOSyb6UGoTWvFDyRl/JI53fu10xZgDe8PFTwKqJA62GCTdXasEOJrsQZEYbYEpTpTKhyEAl81qNEfo9YpSTTTqlZj1bO8pGI4lcWMpgMF2E5IAWEK2+P7sqdeCYQg4hsAViGJhG3+XQ80GBKNxxBJJzK4mJXEMwVG7CXOeEKactPK3nPgiCQxPutBkUCHkSa0htruCytY7tEjwHIPBdvMW38AHj7fh7+8/XKZRUaoNOnOl5IQoinjvN89k7NWWK1cX/Biwm3Cyxm4i21GLO2EEwBGbEYFIHKMVdO5S5EssURnCN6U4qBUsmg0qyY1ppW57oVDKybF2E6ayaLOOxJMYWj3vBSUHvZpDLJ7EgSY9xpYD0Km4tOG5o16LHkMqAWq9CXqvzYBfr7YG1esU6G01gGMZBCJxDI05oWAJ+u2mmhMU5MaBJmHDPOzp+y0Zn+evAX/O9aytqzqtOiz7IjjaZsLb7+7EEZuxvAOjVBVU+KHkxLdPzeBH5+fLPYycSIrIWEZaqziDtVUBRQCMrwSwsNpPnm0kJ4WyE9eWAgWZOVIqF44h2FOvxQWJTZ3b6zQ4PeWW9JgUSjkZWw5smyy6Hb5IHAeb9QjFEhiedMOo4TcIPGPLqZZ2e51mw+uU7M32oWV/dMv7RhMpj5ZiJYlVI92NAv7mBQfRazPijV86iUevLad/1mHR4e1P78Dffv8iVgLZf8ZaJbfBzPvpXZmFn1iNtHlthiMEH3t5H+7c11DuoVCqECr8ULJm1h3CB753odzDyIt4ojZvIJthScpErpYQsdF0LxynlRqUwvGF4+huFNDVqMPogp+mx9QQa+akUiOoOMnTjSiUctFiVGHGvX2L106s/365t7m2rvnEcAzQbzfjxHh2Ys6TY07sbxJwaa52Ai4yQQhw/5EWMAzBtCuIoTEn9jTo8M67O+ELx9FrM+BAkz4dY/439x3EA595Aq5gDA89dQ/e/vROqHgWH/v5aE7Cz/ymtr/tPBjndmgPrDYIAV7Wb8NtHXVor9Og10Yj1inFgQo/lKyIJ5J419dOV2w0uq8IySuViM2swfhKbQk/AKBRcAjHUhOTWXcYgw4zEgkRsWQSKo7FSiACVzAKZ4Au3inZs5aMZ9TwOGIz4sq8r2K8zyj54w0X5zqRTSIjhVIJsCR13y0m4ysBDNhNGF8J5FzBwzO17aPVadHhz57Tjad3W9OPeYIxaJQs+G08xvY26PBvD/TBqlei05oy4/ZH4hhfyS01NxxLghCgvU4LZyCK13xhCP/04h686Ghr+jnJpIgrC9UvzPXajJh2BvGRl/XiadtUPlEoUkKFH0pW/Puvrm0xHKsUDjXrcb4Iu7OVyJwnhOMOM7zhWE3sdlkEJZoMKlxdN4FwBWMY2maSqOIYHG6tPfNrSmG4gzGcDrrBswSdFh31kapi+mxGsAzBdBa+Jbky4QxSjx9KVTDQXvx2qnAsmbd349kZDw636HFupvbmhvf3teBfXtoLdpMFgkHD7/ra2zvrN/z7xLgTuQZcPvS0vWjUK9HVqMc3h6fw2d/egEVQbXjOR352paK8RPPh+b3N+MQr+hBPJKmhP6VkUOGHsivDEy584pfXyj2MHeEZAqtBhSaDCoQAIxNuxFbvRjxHL6hrROJiejJm1vJVXeFiN6uRFIEz056sy7rD8SROjLvQ02LApCu4bYk5hZKJWELE6KIfB5r0YJmUsXytxNFWOwY1j65GYVvRWCrOz3iodxSlomEIKqJaQ7UuUrxWeOq+Bvzjiw5vEX3y5funZ3N6/lueugdvuN2R/vcrjrXBpFFsEZS+c2pGkvHJlWaDCn9330EANMWRUlqo8EPZkasLPrz+iye27cGVC4daDRiZdKd3YVtMaghKDv5IXPZjLweCkq0Y0WefVYcVfxSNBhXUPAtnMAoCgBAChqT+TwAwhICQlJmzMxjFxLrYVo0itwne2RkPzBoeh1r0OF+DO4KUwrg454VZq4CCY6jwUyVY9cqiiz4AEIolYdIqqPBDqUi6rDoIKr4iUlRrbW54z34rPvPqfslEn2lXEN8/m73w86KjLXjfvd0bHmuv1+Khp+7d8FgwGseiLyLJGOVEnVaBlUAUKp7BZ/9gAEaNotxDotQgVPihbIs/Esdbvjws+wloT4thQ+IDAMysK8P3ynz85aDVrKmIVq9BhwnnZ7wIRhM5mQeuR1BxeZkEOoMxOIMxDDrMODvtRjhGF/CU7Bh0mDA0Jv+FD2Vn1DyLnlYDookkRkqYBEg96SiVRqdVh3lPGFcWKqc95/yMB31txpJ+t8vJUzrqJBN9AODjvxjN2oz+2Yca8c8v7skqYVej4PDjd92Je/71N4UOUVY8eLwNT+moRywh4lCLodzDodQoVPihZEQURfz9IxfTsZnlYLf2nC6rAEJS1Rk74Q3HYdYoai7GfCcEpfy/+gqW4MyUp+CKiX1WHYYn3Hm/fmjMCUHJotdhxtUFH01vouxKnCYzVQVaJVvy2GdBxaFBUFLxh1IRHGwWoFPymHaHKu6cjSZEBCo0sCQfmo1qyY41uuDDt7Jsx3paVwM+9vK+nFqajBoePEuqJuXQqOEx6Qzijx3mdEoahVIO5L/6o5QcURTxzz+5gh+cmUNP69ZqGimxCErU6xRQcCx4lkAUgZFJF/raTDg54YJFUMKsVUBQcRiecCEpAnazBgY1v6vgs549DVo4J6jws4Zc76U8Q9BnN8IXikPFMxiZKvzc4yRI7/BFEnhyzIkWoxosQ7Dsp+cSZSsKlqCvzYSRKXe5h0KRgGV/FO11pU1C9IXj8IXjGLCbKqJdhlLb6JR8ycVRKdGrdjc0rgYOtehxi6NOsuPNuENZtcodd5jxH6/qhyIHr01RFPGRn16pGtEHAO490Ih/eklPuYdBoVDhh7KRZFLE3/7gIr74+DgAYHw5gGPtJogiEE+KODftllQ00ChYXNxU1dNep0mLOou+SLrX94jNCAJgdNGPCWduE/ElfwT7GwVcmpd/exMAHG0zIhhNQMEycIWimHIWniBj1irQYdEikQTGluVZjt1jM0reIrPgzb3Naztm3CH0tBio8EPZwhGbEbPuUEUvgigbGbCbcGG2eBsfO3F6yoXjDjOSokhTviiypNWkrvgABClbn+TKMw5Y8W8PHIFWwkrv/U36XZ/TazPiv157LCcTbVEU8aEfX8ZXh6YKGZ5sEFQcPv7yPty6VzrRjUIpBCr8UNLEE0m8+xtn8L0zN83avOH4hkmnScOj0ypgxhXCjLtwMcK0aoAaT4q4sZRqK9tud/X0lBs6JQs2jwqOidVjGjW8LCYqZq0CVr1y21Y2liG4vCpSHWjSA9j5b91qUoMhwLwnjOgmZc6o4dFlFTAy5S6q70ifzQhCUn/rXPx49jcJcAVjaDKoMCfBObWZ8ZUgeIakU94K5eyMB92NQvrzodQ2NpMagorHaVrlU1UMtpsxNF4+ES+eRFpE1ChYBKOJso2FQtlMh0WHiZVAxVdluKrcAuBYuwn//so+KDlpE8zWBHGGIGOce3ejgC+97hh0OYpN3zszi8/85oYUQ5QFFkGJu7ot5R4GhZKGZshR0nz8F6MbRJ9MuIIxDI05MeMOobtRQL/dBAWb346JoGQxsRLE6IIf/ix7ww80GQoymzbJwEV/sN0MVzAKfziO7f5y639HdzCK4w4zuht16LLq0GxU4Vi76ebxHGZMu0KYdIbAMARHbAY0GVTpnzcb1HhyzIloEdKFOAbQq1M39kV/BKcm3VgJRHGgSUg/x6TZvpT6aJsR3lAc854wRibdmM3DhDkbVDmmeu2GgsZvVjUWQYn9TQKMGh7W1XbTzbAk9d2b84RxcY4mv1UTap7FuRl3uYcBAHDUa6noQ5EdZg1f8aIPgKoObWgyqPDZVw9ILvoAwOcfHcc/3H8YVz74bDy/t3nDz/bUa/HlNxzPK7UqEKmea12rSY3/eFV/uYdBoWyAVvxQkEiK+KvvnsdXnpzM6XVrFQ+CksMRmx6LvnDWXghqnsH+Jj2Gxl1oNKgwn8WCn2cIRqYKq1ixCEpMrAQy7lDkioIlaDFpEIknMOvOXrAYWwlAFIEpVwhqnkWrSQ1BxYFnGSRFEZF4EtcWb7ZizXrCWwSRWXcYLcbU3+3COq+jcCyJ01MeHGs3pZOsJlaKZ9B9qNmI09Nu1OsUG5LUFOzNiQbPMtCrONjrtFCv7lxPLPvhi6SSuqSoHNuN7kZB0nYJtcRCEkU+7KnXwh2KbajGswpK2MzqdMtlnVaBOp2iJPHelNKj4hnZpFkqc/DGoFBKQa/NgKEqaD881KLHxdnqFe3feMcemDJsWkjBP77oMGzm1Pz3d6NL6cdNGh5fev0gGgRlXsd90dEWfOKXo3klscoJe50Gn/uDAXRahd2fTKGUECr8UPCRn17JWfRZjy8ST5fEd1h0MGl4XJjxILjDTkpPqzFdxp6N6NNl1UHBsTiXg6FzJp4cc2LQYZZkwba/SY8zq8bXfTYj3KEYxpYDqwbFJiSTIi7MehBa/TvolCzqdcoN4lgolsDoYn5+OzPuMHpbDekxrOfEuAsGNQ+bWY1LEk9sBttN8ITi0Km49OJos+fN6Wk3Wk1qNAjKdFTq5s+uxaROt+AVm6TEm3p0B156uhsFaBUcZtwh6FQcFjxh+DYlrlj1Siz7o+AYgn1WAdeW/AhJ+FkcbjHg2qIv/Z1dY8EXgU7BYqDdBJYQ+MJxWuVTxXRYdLLw1em3mzBMDZ4pMmN51Xex0plcCUqyCShHdEoOLxtoLdrxbWYNAODXV5Y22Cf8yTO70j/LlcevL+PPvn2uokWfJoMKLz7aijfe4cir4olCKTZU+KlxfnB2Fp/69XXJjrdWqaLmU4skTzC2RdiwmzU5+2EkxK3CQb4MjTlxrN2Ek+MuHG0z4eqiLx1D2mRQIZEU04bSa+yp10Kn4jYknAXWLTjXUnwc9VoAYlpYOtCkByGppBajhpc8IS0U237R6wnF4JmJwVGvxdiydFU/kYSIKwu7+9tMu0KYdm1fzTOzw8+khsuzHXE7NLTiR3J0Su5mipE3VVUz2GzGgieEaCIJk0aJy/NeNBnUWPFHcG7Gs62IKyg57G/WwxmIgiUEBjW/q1/L2jVhu3WAP5rAyVUxoMuqK+RXpcicWEIe7R8sjf2lyJAZd7hiU+fUPINQLAmThodLBn6PxeINtzsglCCx7Oq8DwwB+tpMsJnUeNmALafX//TCPP79V9ew5ItgwRuuaCHOIijxv2+6ZXUdQKHIEyr81DAXZ7147zfPApB+ZzEUu7lIstdpYBGUmPeGoeG5rESDzWTy2CiEE+OuVET8pAtWvRJdVgHhWALnZ70QlBwONOmhVrAgBJh1hXBjOQCNgsVxhxnTriAselW6kmU9mwWW9VUBk0XoCjGod7+x12kVkgo/syVozZKabGJHc2HZXx07nnLBrFXg4qb0pJVAFCvrRJ05T+pvvr410BuKYtBhBiBCFAGGEEQTSSx6I1sEob0NWlxfyvw90Ku4nCo8riz4cahZj/NV3CZQy5Bt3ddKx4EmAe5QdRvPUiqXM1NuEAKIFbRQ77ebcHHWi+MOMxJJsSKFq2w41m7C257eUZL3WglE8bU337p6H86NR87O4Z1fG0G8ktWeVXpaDfj0q/rRYlSXeygUyo5Q4adGcQWiePOXT0Kr5PDhl/bgeT3NePfXT+PbIzOSv9fESrDglp5YXPrWmrUqnwVvBAvemwt5XyRzG0cwmki3p83k4OlTTLK5X0q5acwSoMWohicUK4pZdLFwS+zXcX0pgD0N2nQSHaUwYvEkmDxO1Mvz2bdJLnjC6LRooVGkWhTdoRjsZg3OTHuwzyrkvAiIVND5T8kNRgYRz2oFR9u8KLLFXq/BtcXKuf8dd5jT87cnq9ib7dY9dfjcawbAlyiA4q+edyDn6+XkShB//8OL+MmFhSKNKjuMGh57G3QwaxUYmXTDHYyirU6DvQ06nJ5yYynLlsYHBmz4m/sO5hRbT6GUCyr81Cj+SBxffdMtaDWpQQjB+RlPThHcpaYKwiMkx7paRbUbUm6mJETg9JQbGp4Bq2Al9VcpFtv5IBUKNV2VjlazGlfmc68EzAV/NIHRTQsVd9CDDosur53f0UU/DrcYJGtBpciHa3n6rkkFS1JpjuWk1aRGk0GF8ZVg1gsgSu1QSZU+g+3mqhZ71njhkWZ86MU9JRUgchF9EkkRn/71NXz8F9cQLWM77Yv6WvCio624ZY8Z3KpAJq6e0GR1A+rSnBdv/+rIjveCPQ1a/NHTOvCS/uJ5KVEoUkNXLjWKzayBzaxJX+QseqWsE2pKtXtRSbTVabLyyZl1h1Cvk7ZVLhhLYp9FB0Elf+24WG1Zl+Z8G2LrKflxtM2IS3O+svX2F7LIl4sXDEVaPKEYusqYxjLQbt62LbHY6JQc+u1GTLtCODHuQjiWQF+bEbzEPmmUyiafCs1ykagklSoPWIbgr553AB994Iisq07+4jvn8C8/vVo00edVt7Tht++9K+PPWoxqvPnOPfjB22/Hvz5wBLd31qdFHyAl+JB15/T+Jj2+/7bbce9Ba8bjvfa2dvzkXXdS0YdScdDVNAUAYBFU+JeX9uYdwVhs6JxzKyTLidecJwyrXiX5+5+Z9kCrkLfwY9LwRW3Lk/Mkq1LgmMq9DV2Z90HFV+74KdsTTybLJmxPOEuTdpiJ9noNhifc6X/7wvG0n12nRYtj7SkTV0ptY9QU3zhYKhJVXjL+mVf14/W3O7KeE5aDGXcI3zg5VbTjv2ygFX/zgkO4msFD9M137sFv3vs0/Plz9uNQiyHrY6oVLD74wsMZwzxe2NdCN6QpFUlWZy0hxEgIeZgQcpkQcokQcishxEwI+RkhZHT1/6ZiD5ZSXJ7b04SHH7p1i5Fyk6H8YpCc29BKTU+rAQeb9VjIos0LSCVQ+cPx3Z+YJToFi55WA/rajPBHpDtuMSi2aeBkGRdo1cJyoHLbSA63GhCO0aqfauT6UgA6JYcBuwmDDjOOO8woRXfngSYB82WKM7aZ1Tg/k9mwPJYQMboYwIlxFxhCoKbJhjWLkiOYclZOyMOkM4i6dfNas5aXvAq6XLxisA33HMhclSInvnFiqihVvYKKw8defgT//JJesAzZkiL8nmfuw58/Z/+G6p5caBCUeOtdG42ymwwqHGrW5z1mCqWcZLud9TEAPxZF8SWEEAUADYA/B/ALURQ/RAh5P4D3A3hfkcZJKRH2Oi0+95oBfPKX17Dkj2Cw3YxIPLkavy7i3DaTwmJTzbGbudBl1eUcCX+oWY+hHBKLduNgiyHdL3+wSQ+tkkM8mUQ0nkQoloA/EodRrYArGMVimb0huvIw7c2FFX8qVerkuLOiY0jLSZ1WUbEm2Un6oVc1c54w5lZFGIYAHEMAFPcz1ypLX2XkqNfAIqhwfSm7tscJZxB76rVwh2Jw0k2ZmqPTIlRUoqEzGEWHRYe9DTp4wzFcmfdh0GHGsl++9gbZ0GxQ4c+f013uYeyKPxLHV56ckPy4b7lzD9505x7U625uTl+ev3le9rUZ8dBT9xb8Pg89dS8+9atrCKx6Wt62tz5vIYlCKTe7zjAIIQYAdwJ4LQCIohgFECWE3AfgaatP+xKAX4MKP1XB0TYT/uu1xzY89p2Rafzx18+gxahGi0ldcj8gTgYpK3Jgxh1Cg6DEki8CniUwahS7Gm96JEy0UrBkQzT8hQzpZ0AqKU0OlWJS/u6ZEAEMjTmh4Rk4GnS4UEGTYblQyQtHn4SVdBR5Y9IoSlJ5GilDBRnLMDmb395YDqDfbqro7y8lP+Re6ZuJzV5uVxd8ONZuwqlJNxIVKuD/44t7IKjk3XIXiMTxzq+OYNkv3XWiw6LD25/egfuOtGx4PJEU8ejoMoBU+Ma/vLRXEoGGZQi6m/TplMWe1uzbxSgUuZHNN8IBYAnAFwghI4SQzxFCtACsoijOrT5nHoD8aw0pefPCIy24c18DZtwhrPgjKLUMUwyPmkrEH0lg2ReBVVAilhDRXqfZ9TWF+NAcsRlx3GGGQZ3SiA+1GLKu4pnzRLDPqsv7vQulvU6zpey3WARjSaip309ebG4trRTUPIPFIhmHU+THSiCKBl3xxWyVovQ7yTOu/FpWz0670dtqgEEt78UnRVpcZU6ckwJXMLbatljukeTH3gYtnrqvodzD2BF3MIoHPvsEfnF5MafXDdhNeMVgGwQVBwXL4AuvO4bX3GpP//z+vpYtog8ATDmDaXH+T5/Vjb0N0s0//+nFh9PtgX1tRsmOS6GUmmxqijkARwG8XRTFJwkhH0OqrSuNKIoiISSjZE4IeTOANwNAW1tbgcOllAJPMIb7P/UY9Goe3Y0CjrWb8fRuC77w2mN46H+G8bOLCzjuKG085ow7hAG7qahtO5WCCGBhVXzJJqxCkacxhV7NYWw5AE8ohp5WA9Q8m/NnXk7zZ6OGB1ZK934TK+X3+znuMGPOE0ajQSXrlL5qoE6rhHubijKGpHYlDWo+1Rgkpr6rvkgMo4v+iopCpqTgWQJPqPgL3niJjWgPtehxIc8W7lhChIjUrj6ldvCE4mAZUrGVMutpNakRiiax5I9U1O/zzION5R7CrnzoR5e39QzbjnqdAh9/RR+ajWq8pL8FF+d8uKvLgqfta8CZaQ9OT7kzmi0DqZY+IDUPet1t7YUOfwMdFgHff/vtGBpz4nAOBtEUitzIZlU2DWBaFMUnV//9MFLCzwIhpEkUxTlCSBOAjJKuKIqfBfBZABgYGKicq2qNkUiKYFe3Pr4yNIEbq+08p6fcuLLgw1/83zk8vduCOU/K0C9Z4pWLM5Dq0aZsZCmLioNcN7TMWgUsghIqnsHpqZSfUK6+Qmv4wqX3ZuIYgl6bMV2WWyqW/BFY9UoseMtTBSKoOFye98ETimHGHUKnRQeWIWAIAc8RnFn9LFuMKoSiCYAQtNdpcGo1sadclPpaIhXT7hAadEq0mlTgGAYMQ8ASgqQo4saSH1cXMlebmTU8Oiw6SX23KMWDEKBBp0SdToFLc1sTY6REq2Bxab6477Geg816XJ7zFuZaJBbfRJ8iL7obdbg8X5pq2mLjDEThC8cx0G6umM0Sm1kt+xjxU5MufO1EbileDYISX33TLWg2plIDDzYb0G83A0il2P7R0/biHV8bwa176zK+fm+DDr02Iz7+ij4wRSjlajKoM1YaUSiVxK7CjyiK84SQKUJIlyiKVwDcDeDi6n+vAfCh1f9/t6gjpUhOOJbAgjcMe50WD/3PMBQsA7WCxY/OzW143sikGx0WHX52cQGx1d3IE+MuDDpKfKOs0AViMcmqoiaLiE9BxSEWT6K9XovL8z5JfBsYAsyUIZ1m/7pe7FLTbFCXTfjxhePosurgCcWQSIob2txYhmCfVYdlfwQz7jBYhkBQcbixHECLUY0Zd/kSWir5a73kj2Qlvq7HGYxhaNyFRoOqbOlNlOw5ZjdjaNyJaKL43jv7m/U4WSJBkCGp6t54gb9WOa8dlPKgLmMlr9R4QqlqtXzbHRkC6JQcvCX0e/ur5x2UtI1JajyhGN799dM5v+49z9y3YYN3s03BMw824tLfPmvb2HqDmsd33/qUnN+XQqklsr16vx3AV1YTvW4AeB1S/kDfIIS8AcAEgJcVZ4iUYnFy3IW/+L9z+LNnd+Pxa8tpx/pMXFv041i7CSdWJ6U8S0q+U09jk7dycc4LR712g+HyZhIJERZBuaM3z4EmPU5NunBZwt3mvjYjhifckh0vG5oNqrJWkHBs+QwDWowqRLdpE0kkxQ0VKImkCPdqUl4omsCgw4QTY64i5xVtRa1gZdEiVw7azBoq/MicAbsJI5Ope567BMmSU87SfRcqqcKBUl7MGh4NggrTriBaTRrEClULZUg+88u33LkH77i7ExpFqg3+c78bwy8uLxR9M8OqL39wxnYkkyLe9bURjOdxX79n/+5WsduJPhQKJTuyEn5EUTwNYCDDj+6WdDSUktJiUmNiJYiH/udUVs8/Me7CcYcZS/4I6rSKtAhUKs7NeFCvU0iaDlCJ9LYa4AxGoVVwYAhBNL69YAcAw6sLF42CRVejgJFNrT39dhMuz/vS1VxSUC4/JptZU1Lvqc0wZZqUHG0z4vK8D8Fo7kJCJJ7E0JgL+6w6jC0HJD0PdqPFoMK1Co1yL5ShMSd4lqCvzUQX4DIlHEsgVsI2JlKC2ITeVgPOTHskO+fazOqSpJ1Ryoe9XpueN1xZKF0rYinJVax561178d57b0ap37KnDrfsqcONJT9+cHYOn/3tjaKkn3EMkW3YiT8Sx7/97Cp+dWUp59fW65SoK4F5PoVS61RPvSYlZ/Sq3D/+tUX1jTIs1kwavmL9QKRCUHE4s8lvp8mQ3SQgGE1k3KlLJkXJY8/LJYCEYjuLYMWm1GdnR4MWCVGUxKfn6oIfB5oEROJJXC/i91vFM+iw6MAzTEnaZ+RMLCFiZNIFg5qX/DtIKRytsnRTpFKI5cfab1YwSQUhBGqeTV97CQEc9VokEkkIaj5nc1dK6VDzDEK7VLq012mwUgObbRa9Mm0OvBNrptbjy5krWvY06PCOuzvxsgEb3vvwGfxudBkvPtqKB29pw4UZDz7/2PiOFdq7ce/BRlj1KZ++cCwBk0xSMX83uoR3fu103jYBbWa1xCOiUCiZoMJPDTNXYW0Geyy6kvkfyBWDmodvUy/5cg4eI1OuVDra6SlX2tuhGMacC77Sn1taBYulLKPmi0WsxEKGVrlVCCyEi3M+NOpVEJQsfJHiiGiHWwwlrxaUM7GEiO5GoayVapTMXJrzosOixbXF4m50mLWKgttsVTyDTosO57YRWggBApFEwZ4+mzk16UaTQYXDJgOSoohoPImEKOLCUgBA6n4zuuinwqaMULAE+6wCJpxBHN7hnLEISriCsar97AQVl55PCVluhP7Ti3uw4A0jGk8inkiCYzOnpurVHF57Wzv0Kh5//YID0Kt4HG0z4QW9LXjOx3+XtzfW2Rk3Pvqzq/jaiUn4wnG86hY73nznHtSXsVrGHYwWJPoAgF7NSzgiCoWyHUQsYQXFwMCAePLkyZK9H2V3/ugrw/jhuXnJjscQICmmBIo175n1kwZ7nQZWQYUTE0406VUIxRJwZemd0Ndm3NKmJBcYktqxLXZSz+Y0DUHJgmGYnCdmexu0UPMszs960d0oSOvtYzNiZMot2fFyZW+DtqgVK7txtM0IjiGr1T8Ey/4IxlcCkvf9a3gGcRGIFsFvYa0dRGrKfW7IFbNWAV84VtI2O0r2rPe3KwY9rYa8kxPXOO4wY3TBh2hCzNhiUuzfYScEJQuOZbK+11OKy+brcHudBg2CErGEiPGVAOxmDeJJEVcXpG0BLxRBycG3em7f0VmPZx1qBEMIZlwhXJzzwhOKwaThYVArYNLwMGkVMKh5JJIivjo0uWGe8/qnOPCOuzvwwUcu4fyMBwxJbXysQQhw/5EWdFh1cAdj+OxvbwAA3vesbgy0m3Cs3Zz37zE84cLLPvOEZPHxLUY1vvLG42iv10pyvFwQRRHvffgsHh6eLug4d+5rwH+/flCiUVEotQ0hZFgUxUwWPbTip5b5yYV5/PLyoqTHPGIzwhuOg2NSUfDHHeb0Tja3Gi09NO7E3gYtJlYCUHIseloMODuz86RXp2Cx4JVvhdL+JgEjU270tBjAMAT+SGzLLvH63aVc0SlZ7LMKmHVv/BukqjISacEtW64vBXDckZq4SF2lwhYhRjMXVDwLlgDlmq9marvSKljsb9JL2srR1aQvmhB6Ztqz4bsrBfY6Dc7NuCU7XjXhDETRbzdheMIFQoA6rQJKjqWJSUWgzazBZI4mysU2FPWGYjjcYsCFWU9O1/E1mg0qnJpwIZYUcahZj6SYMv5fTyn8g7bDF0lg0KHH0Bit9CsGudzvOiy6LeL7+EpwgxmvJ+SRVdriXV0NeNMde3Dr3jq4gzEEYwm0GHNrDXpJfyue+uFfpyukX3ncBqNGgX95aS8AYMUfwVeHJvHl309gxR/F/3veAbzmtnYAKXFjyhnEj87P459+fBnvvLuzIOGn327Ch150GB/+yRWEoom0mJUvM+4Qvn1qGu9+ZldBx8mHT/36esGiD5DaPKVQKMWHCj81yvUlP97y5WHJj8uxDK6ti5EeXfRDxTMIx5I40KxP72quVWTEowlcW/ShQVBmbNM50CRAo+Bwfcm/RfSQEzPuMCx6VVrA2tOgBQHAMsBRuxkEwMVZLzotOpi0PBY8YSREYNqV3cKuu3F70YAlqYVJrv5HwWgcHRYtXAFpd2GvzHvBMaQoLWTZcGHWC7OWR4dFwMikSxY7loFoAicnXBh0mPJe/PAswd4GLbRKHixDcG4XsbRQpGwFbTGpseQNS95mUk2cm3ajXqfAij+KZX80a+8uSnYwJJVkNTLh2jUJcTPDEy6YNTycRapYWVt0H2gSNlQdrGHS8NjboENCFHF53ocDTXp4QzHolByC0QSmnIG0CfX5WS/2Nmzd+S91G+p6lBzBtJOKmFKjU7DobBTgDcVQp1MiFk+mkyXPTLkRTYjgGGy47gpZ+FbJRfR51sFGvOfefeiwCOnHTFoFTHkcS6vk8MIjzfjco2O4q6thwzEBoE6nxNue3om3PHUvIvEkdOv+ToQQfPilvXjNbe3QKjgcaNbn+yuleemADS8dsGHZH8FdH/51RvFHxTM42GyAkmPw+PWVDT9bX/0EAAouc8tZMfnmySl8+CdXJDnWy4/Ztv1ZOJbAnCcMRxkqmiiUaoMKPzXKr/Nw3c+GQGTjxNgZiIIhqVLi7Qx/g7EkVAoRxx1meEIxGNQ8zky7wTMEs55wSWJ0C8UbiiG5Tui4sRTA3gYtFn2RDekpgSU/kqtFVgY1j+MOM2KJJILRBLzhGAgIFBzBojclgqkVLDQKFmem3du+d0IEelv1OD/jzal0eLu+/kLxRRIYbDdh0hnCfJmqtJyBGIbGnDhiM+K0jFqLJrYxhMyGnlYjhkuYlDbpDOK4w4xri36YNHxh6Vti6ntO2Z5oQtyQWDjnCUvehlmrrBknr12LZ91BaBQsgtHsfKwSSREtJnXRhJ81BFVmn4t91pseUDxLdrwOrBePDGoeXVYB8WRSEgP4fOm0CDg/S02epaROqwDLkHTV5+b2ZkJSLUD+SBxdVgHuUBTOQBSX5uX/OTAE+Nv7DuHB422SVtv9yTO7cO+hRgzYt5eOeJYBn8G3R6fkcMueupzeb3w5gDazBsxqOYs/Esd3Tk0jmhAhqDhMO4P4xsnpbSt+Hhiw4W/uOwQA+OcfX8anfn0dAPAHt9rx/md345O/uobbOxrQ1SiAZ0tbMvOrK4t4/7fPFXwcniV47uEm3HuwMePPXYEo3vzlk2g2qvGxl/cV/H4USq1DPX5qlJd95gnJ4lw7LDokkkkEIgkEInEEspxM74RezaHVqMayP4rFMhv27sT+JgFqnsW0K1T2ccrRA8kqKMEwpGxG4v12I4Yn3GV57+1w1GswloMAJKg47G/Sly3yW8Ex0Cm5gowbWYZAFMW82lhqmfa6VFsS/bvlz1rF6WYG280YGs/uO9Vep0EomsBCka/xLUYVIvHkBgGQEMBu1mxoxdmJPpsBc54Imo0qnJv2lDSOfjvazGpMu0L0PJYIglTrbLbnRKXxzy/pwcsGtq8AqQSmXUH82bfP4dOv6odOyeHR0WX84VeGs2r3V3IM/t/zDuBpXQ1oNWkApNJXvzk8BZNGgbu6LRnFqVIhiiLu+pdfS3L+NepVePz9T0+LY2t4gjF878wM/vN3Y5h0BtFh0eHn735qwe9HodQC1OOHsoEnbywDIjDoMGPJFykoWnKNRFKEVslJJn54Q3FcDPlSY/RHZFN6vB6pPVAK5fSkG4TIp0wbAOoFJS6Ucae3nL4W22ERVFkJPwqWYF+jgLGlQNlEHyBlHh1iEjBrFFnF3WbCKigxW2EpguWGAKjXKTHnCSNCe+TyJhpPZvRAuzjnQa/NgDNTO7dM9ttNOD/jRiRe/AvrzGo788FmPVQ8i0QyiWg8mbH9azsIIWg1qYseDZ8Lk84QBh3msl7HqgmOIVUr+rz33q6KF30AgGMYfPCFh9ItY4da9BkrsntaDfi7+w7hpxfn8clfpSp6/uSZ+/CqW+wbnscwBA8cayv+wLPg5IRLsvMvFEsgHE9Ao7i5HH10dBlv+NKJDfe9BTp/oFAkgQo/NcayP4L3PHwWU6v99nsK7JktdkrP0JgTTQYl5jzF2WnttOjgDsXQZlYjEk9iyRvJald3sF1eok93ow56lQLnZz1Zty+UArWCLfcQZMecZ3evi06LDpF4EqMLflks+kPRBHpaDHmf82adggo/OXCgSYAnHJfV4r1SSYo3W73W448kcGbKg/42E8LxREaBuqfVUNL2yjUKEctlKxTKaEOikhFUHGwmdU5iYKXQZFDhDbc7yj0MSWjc5NFm1CjwysE2fO7RMQCpKthDzXr85fMOoNdmRK/NiBcdbcWlOS+etU3bk1z45skpSY5j1PD43ltv3yD6AEAsmdxyDWs1ayR5Twql1qHCT43x8V+MpkUfALixHECnVYdkUkSdVoFIIokbS4GsylEtghJXStAv7grEwJBUYhjHMghG4tv6BRx3mBHY4eeb8YRiWPJFNhhL71bJo+YZnJ8trrFurqh4Nuu2hVJyZd4Hg5rPOW5eKooRdV4ok87QroKpe/W8lBNL/giOO8wIxRJQ8Sy8oSimnKFdWzvX0qoo2aHmGSx4I1gpoLWOshFvePvrz/CkCw065ZbHOSYVE11plKutdjfyrRakbKTDopNdS7dUvPWuDqj46t0set+zu/HQ0/YiEImjXqeEdpPR9t4GHfY26Mo0uuwIRuN45OycJMf6h/sPo61uq6BzaV0i4XN7mvDS/tac/ZUoFEpmqPBTY2SaMIwupFK41swBDzbrseKPZjTm7W4UEEskseiNoL1eW5LS7XA8CUe9Nm1OyTME+6w6XF3wb3ieRVDi1GqKU6aFtVVQwhOKIRxP4li7KZWElRS3tKc9OebE0TbjtmaYKp6VxMdIKgYdZkna9YqBLxzf8W9ZbORacbToC4NlyLZm3LwMs01vLAVwI4PB83GHGYFoAgwBWEIQjidwaXU32qpX4moFmInKiZ5Wo6yqCauB3RaTS/4IjrYZwbMMLs154Q3HEU+KaDaqqAAnEbkED1C2R46bGVLQZtZURYvXTvAsg3qdEvUZhOZK4TO/uSHJ/Pc9z9yH5xxu2vK4KIr44bk5NBtU+KeX9OCOzoaC34tCodyECj81Rp1OsetzLsx6oeRIxmjZ64v+dEx3Kfv11wsbsaSIqwv+DZG8CpaAZ5l0dPe1JT+sgjLdtlWvU8AdiiEST8Kk4XFifOcKhFOT7m0jfzutgmy8CvrajLIZSybKKfoAKRGv2ZgquZ51y2cnfMYdxnGHGScnXFsWRJ0WnWyFvExkEimaDCq0mTVYCUSx4JVX5ZKcadApZZVCVw10WnSYdO7uR7F2nepuFOCd96FRr5JV22ylY9RkTiyj5IYs2/gKhGcJPv6KvrJEklOy5/yMB59eTRYrhBf0NuNtT+/M+LMnbqwgnhDxnbc+BVa9KuNzKBRK/tCrbI2xzypk9bxIXMT4cgAtJvWGx1tMaoiQR7v+2HIAmtWKjr42E2bcN8vyfeE49GoeLEmJI+5gLD1hcmUZyWtanahaBSX624w4YjPgtj3yMKjUKlj0242Yl2lZ/xocU/5LzKw7DLUMy8efHHPCoOIw6DChp9WA4w4zDjTpMbpOXK1U5jxhRBNJXFv07/5kSpq2Ok1VLuzKhVbBYskfgTuHGPbL8z4catZj3hveEpFNyR9OhlWMlUZ3o1BRmwLZwLMEn36wH0dsxnIPhbID4VgCf/iVYUQThd2fVDyD9z+7O+PPxpYD+Pyj4/j6W26log+FUiRoxU+N0WnJvn84GEvikEGd9jngWQKljHZk7GYNmk0qJJLIaII6uujHrXvq8PuxlbySrk5NulGvU2DBd9PwWVBy0ClY+Mu4E8wSoNmoLntMuYpjEF63SO2y6sCzDK4u+BBdrbxKyiRirE6rlOUizhmMwRWIYbTEAslxhxlJUdy18i1f7HUaXFv0ZzTVpWSmUa+kXkgS0mJUw6pX5lVxmK1HHCV7Toy70NtqwKV5X9W2KxULg5rDPquAa4v+qmqZswhKfORlvbSdpwL4r0fHNviD5sub79iDZqM648+SoogPvvAQDGpaHUihFAsq/NQYexpyS/EaGneiy6qDQaNAOJbA2enymRofbNZDo2DBEAIRIoYn3JjYoYRfwRJE44mC4s2X/Rv9HXyRODosurJWMjQb1SUXCtbT0aDFkj+KeCKJAbsJDAOEo0koeQYnxl047jBjzhOCRVBBwZdfKNzToMUlGfvMaErsQ6RWsBiZdIGQ1A7y5Xlp02GseiX84Th84TgYQnf5s0VOvmGVTLNRBRXH4sZyYEMVKKX8nJn2oMsq4MpC9SVSFZMmg7poIn25ePHRVvzV8w/QRX4F8KNzc/iXn14p+DhqnsVbnrp325/L3diaQqkGqPBTYwQiuS8uriz4cdxhLqvoY9bwGF3057RTeMRmKkrSlbHME5U6nRJTZUyb8UXi6ZSuTNUcT445wTIEk6u7Qweb9QXFExeKTsHhRlh+1T5rlLqKbn+jkK6CiBdYtr0ZJceAYxgseEM4YjPKMmlOrvjCcTTqVRlN9SnZYxVUOybmUYqDTsGi1azB+EoAWgUHo4aHVsHh7MzGecPYinyvxXJldMEHjiEV3wK8xguPNONfXtoDQjcGZM8XHhvD3/3gYkEbqGsMtJu2JJlRKJTSUv7teEpJyac/vLux/GbGbXXanMvDw3Hpd9DrtIqy99iPlnG3VKdkt6SgZUIu5ei9rQacny2fYJkNpf5LrV88GDW7m71nS4OgRHejkK6ymHQGoWDpxD4XmgzU16AQDGoe52bc5R5GTdK1Wj0YjiWxEoji+lIAs54QtJsqGktd4VgNJEUgIZO26UJpMarxoRdT0UfuiKKID/7gIv7m+xch1XSORrJTKOWHCj81Rqc191JKvZovyeK0z2bEoMMMi5CKuhx0mNFqUqPPZswr6SYaT6BBkDY2s9zxviqOKWtLyIFmQ847P+XYpbQISgy0m3BuxiPZpKVYXFv0o1S+pzolh4vrhDCpvLfrtArwLMGZdVWBnlAMZq10wlItEJO4AqtWYAjQ02KAimNA7WPKw4QzCH6T0Lvsj8KsVaDfbkJvqwFdVgGtpsz+HpSbKFgCe506lVbKEOy16CSpuJADb75zD1QyDFugbOSffnwFn3t0TNJjHm0zSXo8CoWSO7Tmrsa4xVEHq16ZY8SyCI5BUSbULAE6LAIWfeF0eT4hwGC7GfOeMKZdIUzn2dZ0ed6PvQ1aLPsjkkyaDGo+bXRdTAi2rwLZ06DDxbnytU1N5FHtlEiWdiWm5BgoWAYnK8QTwRWMlawdrqtR2GAgHI2LMGp4NAhKCEoOPMtg3hvGxMpW76x+uwmL3jBYhoBjCVjCgGUIGIZgyRvGrHtji1KXVSjruVqJnJ/1orfVgMvzPprutQpDUhUPhGDb6/iBZv2WliJKaWEZglhi6wc05QptaE0ebDeXclgViVrBYsYVRqdVh2lnsKrSEe/cR42c5c43TkzhP35TeGz7ehgC9LQaJD0mhULJHSr81BgMQ3BnZwO+OTyd9WuGxlzoazNiJI90lN2wmTWY94bTnjFAanIvlTeIXsVLtlPWalIXdXHe02LA2RkPlDyDwy0G+MJxXJ73YdBhRiAShzcUgzsURe/qzZMQgIAAJNVaVQoPpgVfBM1G1ZZF/k5cWwyg324sWQpZd5OAM1OVtQgsVftDJLaxWmytkm593HWTQYV+uwkEqfaCUDQBg5rHkzm2e16c8+JomxEXZj2IxKtku7oEnJn2gGcJDjbrwTEbq6hqkQG7GWPLAQSjcTAMgS8c3/IcrYJOZcqJRch+M6laWpaKiScUR2+rAWemPdhn1SG8HMgoqlUazQYV2us05R4GZRM3lvyw6lXgWIKRSTc+9ovRorwP7e6jUMoPnS3VIEftppyEHwA4M+XGwWYBF2al9ZcZXwlisN1cFBPYQYcJQ2PSVH3ss+qKXpGhWl38h2NJnBh3wWZSp/42mxbc24kudrMGjQZVzgv0XGk1aXISfgCUtHohEqucSonuRgGxRLIkiS2CksOlLCpw5jxhzHmkMRg+NelGe50G7lBsg7hE2ZlYQkxfb461m9LpaNeX/FuSBqsZR70GJ8ad6QrITosOvvDG6gcVz2DatX26I6X4KHIwqA9Ftwp3lK3Me8JoNKhwdaF6qn1u66in3j4yIxiN40Wffhy+cLyoVgJJETg14cbtnfUAgEVfGBdmvXjavgZ6TlAoJYR6/NQgLz7amvOuS1IELsz6oFNy6LDocKxdml7dOq0CVxeLY1YspcGwoCp+kpc/vHFhPOUK5SSITTiDmHGFir6rIuaxY+sNlW7Rf3nehwNNQsneL1+OO8y4PO/D9aXSmIWbtAqUY9N4fCWIZmpanDcnxl14csyJJ8ec2NOgLfdwSkq9Trmh7dWo2XgdFlQcDjTpMZOjEE2RDhXH5PT9ziYcgJKqrm0zV1d1zB2ri36KfPja0BTcwRgSSbHo/pH//qtRhFerjt/038N43RdO4L5PPobHri0X9X0pFMpNaMVPjTG5EsQf/e8wxjN4eGSDPxLHtUU/BiUSfux1mnS0tNQEownwbGbfATmiK1BcElQcnMFo0U0gQ3lMDlZKXKVwbSmwo1dSuVCwBEdsJiRFEacmS+tBVE7jYAVHzTylIF4h17JsGLCbEI4noeJSXlGiCHjDMVye92GfVQe9isf1Td4mpyZc6LDo0p4nzUZ10e4flOzotRmzrjLV8ExNVawVypkpF7oaBVyZL1+SpxQQAjwwYMO9BxvLPZSa57unZ/D5R8fw8sE2xJMiPvNbab18duL3N5y4798fw188dz8urVa0np324MHPPYnPvrofz6TnB4VSdKjwU2N86YlxnJ+RomWp8LISBUuQLKJKcWnOhz6bAaenPUUTQwbbzQARMTLp3iIwNQhKLGW5u9nTatiyyMmVBp0SN0oQNa/Ow48mEE1AwTGIlqjlq7tRKInnUS7sbdAiGk8Wpa0xG+Y8YUnbH3OBK1VsWZXDVElJfKNehZMTmc/Djgbttu0tCTFVJXpt9d8GFZ3ClJtcKmtZhqBOqyhrMmYlEYmLCFd4a9yhFj0++MLDOGIzlnsoFADXF/04M+3BmelzZXn/Kws+vOvrpxHdtBFFBWEKpTTQVq8awhmI4vOPSRPPuBKIFCz9dFoFnC6yCe/IlAfH7IVXJ8W3qZaIxBMp82vbzfc41m7CsXZT1ovd4w4zzk57Cp4M65SlWQTlU3XQZlYXVfQhBDjYrMdguwl7G7QYXZDXDmmHRYfxleCGdJtyECuTyfJKIAJdiQysq5VDzXr4I5W9CFzDvkOr8bVdWh9dwZvXybiE7byU/JjzhNCoz67VyxdJoMOig1rBQpmDL1AtU8lFfjxL8J9/MEBFHxnxR3d1QCjRXHE7nBnmur02mvhFoZQCeuetIWZcIcnSTziGKaiNhgCYdZdmETzpLMz4s6fVkPFGBdw0tRwad+Jwix6HmvU4Me7CiXEXkusWJSqewbF2E2xm9YbXO+q12+58Z8vBZgHHHWYo+OJ/nQfsJpyeduf8ull3CPU6hfQDWuVYuxkXZr0YmXRjbDmAkMwMnseW/LJY6My4Q1CVYRxjy0EcaKETu3xp1CtxYc6LyxXe8rFGIWbM1xb9sOqVAFLm4fZN11RKaZlxh7d4L+1EKJaAhmfRYdEVcVTVwYDdVNHi5isH29BkoN9POaHiWeyV2XfvhUeacbCZzg8olFJA66RriMOtBnzm1f148HNPFnwsgzo/P5oOixYLnjC6GvUFCx7ZkkviSMbXs8yWSg0Fx+BQs35DK9e5HVroeltTPghWQYkWowquQBSHW424MOvNy4SaZwh4jkGdToGLc76i+vo0G1VoNWqQEMW8P7N4EqjTKYtSzmvS8BhZ9cuJyXSS3GHR4YoM0lkaBCV84fKka7loe0deWAUl1AoOolgdprj7rLqCkoqSYsos/ojNgCvzfrhKaBxPyYyQQ8vdWguut0zXoUrBUa/FpTlv0Q13i8U77u7E2+7qKPcwKBnQyKj6trtRwD++qKfcw6BQaobyb0FTSspAuwnPOGAt+Dj5WE30thpwbTEAXyRRMtEHACadIQw6Uq1Y+VRdbPbVGLCbwCC127yTSXYgEsegw4yjbUZcmElNdpf8ESx4IwjGknhyzJl364bVoEIwmsCUM1R0M+c6rRJD404MF/iZRWLFmcDazBrZG3gzMvC40SpYXJ7zlq0aanTRn/LEouSEWafAWAm8u0pFvpsG6wnFkri24AdLAG+oOtrfKpl8rr+0EmRnTBq+YkWfp3db8O5n7Ct4040iPYFIvOTBEtuh4Bh8/BV9eflGUiiU/KBX5RpDybH49INH8exDhbnn+yNxmDXZt+50WXUFt1wVwtCYC/U6BfY25Fbiqlaw4DmC4w4z+mwG7G3Q4uy0G+Es/Gr80QSGxpw4NemGf3UCV6dVSlK6nRRFaPO4WeoULKyCMqfXZGtQvRsNOb5vtpRfUtmd64v+sk+CA9EEOiwCeJbgaJsRfWXwXRgad6K7UV5l5nJGp2QLqo6RGzxLcHlOinCB1PXVX6EL42pj2hVEi1GNQYc5a2EvlkjktYFUK8h7KyMzhAD397Xgwy+hFRxy5eeXFhCWSSt8f5sJ+6xCuYdBodQUtNWrBuFYBnd0NuBH5+fzPsaFWS8ONAlwBndv3zjWbsLIpLvsverL/ijazNubiq5HxTPYU68FyxA8dm1FkvfXKVkEJEromHWHYRGUOe8IdjUK4FgGCzmIOUYNj3lvONchbqHQiqHtODvjgVmjyOpcLBfRhIgBu7GklW6ZGF30YaDdjKHV+GVHvbbk1SRGjQLH2k0gBIjFk/CE4iVJo6tEDjQb0p9VNXCw2YDTU+5yD4OSA3sbtKjXKRGIxHF+NrNot+yPgiEpDzGbSQ1PFu13c54IDjQJuDhXHb5VUsAQYKDdjFg8KbtUymz4+Mv78Pze5nIPg7IDXx2aLPcQ0nAsVX4plFJDhZ8a5fc3ChczeHbnCobeVgOmXEGcGJdHWSkARLKo1FFwDDhCJJ+QGtQKzEhoaO3OYnI9YDeBISnhgWMIGJKqFsoFvQStGUCqr9wfkX6HXhQBnpP/BIKVQbtXUsQGIaEchtOeUAyXNn239CoOWiUHnmXAswQ8y4BlCDiGgGUIGEIQjiW2XXhWI11WoapEHyD3aw+lvDQZVAhEE7g+5sTRNuOOz02KqYTKJ3M4ZwWVNPeWaoFjCK7M+7ISzuTGHZ31eF5PU7mHQdmBc9Me/P6GfO4pEztYJVAolOJAhZ8aJBiN44fn5go+znZT+L42Iy7NeXFGhjtWu0We723QIp5IYsIpfeLYrDuEvjYjRibdkhxPq2AzRqQLSha+SAJNBtWWChONgkWdTgGOAQ63GBFPJnc0pQZSkfVSkEyKIASSexINOswYHpfPZGY75LjkvTzvw9E2I05JdE5mQ6bWQW84Dm9452o4hgAHm/VQcQwuzXkRlEm5erGIJ5PY26DF9V3izSsFBcfg4qz87gmVytE2IziWkVwc7LDo4A5GoeZZTLlC4FmCfrsJ1xZ33whJ5HhxD9JWvQ1EEyLESByD7SYMyWjDbDdaTWp88IWHQGjvnmwJRuN419dHyj2MDZQq2ZdCodyEevzUIEu+iCRtVyqOBc8SaFdjxM0aBRgChKIJ2fQQbyaa2HlcrkCsKKIPkFr4sxJNjAQlmzGdadBhRqNBjeMOc0ahYc0QmmUYjEy5s5qoXZjxwKwtLIpdwzM41GKUvMKkTqvA0JgTMvd2BgCEZbrIOT/rxYEmfcneb9kfzStVJCmmWkyHJ91IiCmBuafFgGqtFr++FIApBx81uRONJ9HXZir3MCoCAkC5SxWjJxTDjSU/GvXSeacpWIJ5TxjL/mg6ybLTosPwhAuebEy0c7wOMwxg1qaqfsxaHv12I9rrNFDzDBQswT6rDv12Ew61lO76VG5iSREz7lBeHn7l4IjNiP9761Ngr9OWeyiUbUgkRbz34bOy3EQQaRUohVJSaMVPDSJV7/jQuBNGDQ+eZSBoUhNGg5rH5Xn59OynvEQILs544I8mENyh1chRr8HYcvFKT3taDHl7vPAMgb1OA4NagVAsgUA0DoYQqHkGsYSI0UU/DrfocWLcmVVFzVrL24o/ika9EvPe7T1/4kmgxagCzxIs7PC8ndjToMOQRFU59joNGgQlkkkR4xXkDXNxzoN6naIokfaFEI0nMbYcgKDi4Nul6kYquhuFgqqMIvFkunJOr+Kw16KTrJJOTiz7qyPCfY0y27xVDMfaTTg368URmwCOIVvuGwTAvCeMQDSBep0CHRYdCIBFXxihaAIHmg04P+NGFp3NG+hrM21o1Rp0mDHpDKJOq8BKYPfr1vhKbtfjM1MeHG0zwmYWMesKY3jCveHn643NBx3mqmt93I4Zdxh9NgNGpuRdIadXcfjsH/SjXlec4AZK4YiiiL/+3nk8crbwKn+pMWoUtEqMQikxVPipQbobBfzHq/rx0P8MF3wsi6DcMDmTW2/6sj+CseUgLIIS/mgCS/7tTYrNWgWi8STiCTEn8+PtUHEMem1GhGMJeMMxnJ3JfxLXYdWt+qJsnVgfbjHgcIsB5/I4/prn0G7tPudnvLDXZWeMnQkp/W0sglJWvlE7oeZZ7G9KGWqfGHei2aCWnfADAKFYAlaVsmTCz27+YLngDcdxbcEvS1EtX/bUaxGJJSRL1JML1OMnO+a9EYSiibQR9oDdBFcwCqNGAY4hcAdjuLKQ2mBZ9kfT5z0hgE7B4fSUG/usupwS4ep1ii0G/O5gFPOeMNrMGrTVacCzDFb8kXTlgFbB4mCLHvOeCDQKFlcXctv04VmCaDyZlXfX9cXqSbfLhpEpD3ptBpyRsfjz/mfvh0VQlXsYlB346M9H8T+/l4+h83qSoghRFKn4Q6GUECr81CCdVgGNBhU4hhTc8mWUaSvCcYcZ854wxlfN4xZ9EXQ3CjBq+G3N7ViGwYw7DJYhMGt4OIOFiVj7m/U5GV3uxNQO7Wf5CD6bubbLpPpwiyFv4apOq5A0c90fKY04USh7GrRQcWxaULtzXz1GZRjNrVdx6G7US1aRlQ1SCwC+SByOBkNVCD/9dhPOTqdSEPvtJpysEJEzG0Ym3VBwDPZZdDVl1J0NDTolVgIR1OuUmHRurDy9WfGzc0WNKKa+CwBgVOd2b7aZNFj2uzc8tpYaOekMpsfEswSDDjOCkTiW/VEMjeV/fu5tyP48WAlEcbTNiKSYqmJY8EUw7yk8bVLOqDj5tnsN2E14+TFbuYdB2YGfX1zAx38xWu5hbIszEMW3T83AqlfhmMMEpYzPdwqlWqDCT40iqHjc39eCbw5PF3QcXzhW0haRbDk95d6S4LXWgnZnZz1+O7q84WcNOmW6jDyRFCGouIKFn2RSBM8SxAo0oGk2qjDrLu4EV6/moeJZCCpuSx94d6OQs2nnetrrtZJGuV+a88Gk4eEq8PMpNkY1v6GKKhRNYE5mC5VBhxmuYLSkoo+igJbBnTg77UG/3bilXUSudDcKuLrggyjetEYZdJg2LKTjlWBelSPReBIM3eFN46jXokFQ4uqCD4KKl0wUHRp34nCLAQqOweiiD0Y1D42CS98He1oMYBgCBccglkhuqajZLqErlhAla7m6PO9Dd6OQdXv4+uupzaSGRsFWrUE0x8i31ZNnCf7xRYfByCCpkrI93zk9U+4h7MqffPMMAOB1T2nHXz//YJlHQ6FUP1T4qWHuP1q48HNpzocuqw5XwuWvZNApWOg1PAKR+I5GlMMTLvTbTeAYAk8oCoYwCEbjWFr3K9TrlGmT5yaDCjazBv5wHBfnst+lviKB19HBZiE7U80CcQYi0Cn5jKbcWgWH4cn8hZvhCRcG7Ka8/Y0yIajKI/xoFSwC0QSseiXsZi2WAxHEEkk0G9Q4M+1O//3UChajm9oe5FbOvL+pPHHhPa1GSc+F9Vyd92ftR1IqBh0miGKqDVYUU+lWF2a9CMUSMGsVCEQTONxiAIANn8exdlPFtDTmChV+gANNeuhUHM7NeDBWJK+ytWpQhgC+cByiiPS1eCUQTbf6ZuLinLckvjoGdX6R7lOuEEwaHo16FW5UkNdbttRplbI04wWAFx5pQadVKPcwKLtwdtpd7iFkTYIawFEoJYEKPzXMbXvrt93VywWeY8CQ8hp3OtZ5YrTXaeEJbS9EaZVcugJlbdyKTWlT3nAcGp6B1aCGOxjF0JgTPEswYDfh8rwXRo0CgoqDmmfBs8wGzwUgZcasVrAFixNaBY8Ls8UxyxZUHLqsAha8YbhDMbAMwYw7hMMt+g0R77Fkdg6h7XUa1OuUGRf1Jydcac+JXHZ4tyMSK/0ur4pn0GJSIymKuLYY2FC1MuUMocmgQotRjSVfBKFYAoub/Vlk5G8iqDjEcnV+lYjRInp1+CJx9DQY0sKPhmewx6KDVsEhkRRxbsaNSHznz6G7UYCg4kBACq6E0ilZTKwEt1Q4GdU8pl2h9GQ30+LaKSPxSmquZBENXu2oFWzJhNf19+aTEy7YzOod24eBlFB0ac4Lq15ZlAq9NUam3OiyChvun9niCsbQZFDjQJMeCo4BS0hBmxRyYdBhlvWi/fbO+nIPgbILrkB01+94uXHUa2HU8Jhzh2VXDU2hVCtU+KlxjtiMBQs/52e8Jdud3mfVwaDm0+/V02qAKIq4MOtNT253W1g2GVXpRfnaa6KbFsGji3446rVY9kXSngmxhJgWNfyRjTfU4w4zGnRKmLQ8jBoeHEPw+PXCJ/XjKwEMOkyYcoYkvzEeaEp5SAr3XAAAoZhJREFUENlMauiUXPr4m/us57JsM2sQlHAFt1+sCkoePEswvhzAwWY9lnyRDeJIvU6BNrMGwWhiR2FIwTGSmG/nSm/rzt+VOc/Ok5fTU27ZtEXub9KXLSGnzayRxJdqO85Oe9DbaoA/EsfYcgDn14mYO1WerZ1/4VgCJ8ZdaC/AzHztva4t+TMumt1ZmOA7A1EYNTzcMm9pzIdar/fR5mGELCXZLggJAThGOiP2TETjSVxZ8EGn5CCKYtpXKFs2V+EeaTWCkJQvkZwq/7KhvU6DKVdI1ullTQYV7j3YWO5hUHahmPdYKfjL5+7HG+/Yg+EJF17yH4+Dn6/1uwKFUhqKe0enyJ6Dqy0GhTLjDsFmUktyrJ0QVCnRR82z6LUZcHbag3Mz3pyqjbI1kBtbDqRFn904P+OBCBFXF/wYGnNhfCUINV/412vRF8HQmAtm7fZGnSqOwd4GbVbH67BocdxhRqdFlxYxplwbRaWrCz4M2E0YdJgBAEv+CNrMOy+Cj7WbcH3Jj2uL25emD0+6cOueOoTjSVyY9cKg4dFiUqO7UcDRNiMCkThOTbqx6ItAUKaqqY61m7YchyFAW5bnWr1OgYPNevBsdpOKY+0mHGs34UCTHuu7URoEZcHtGNGEiNYSfEeyQSxj9ZFGUXwDxzPTHlxfCmy5LpyccKGnNXXN0/AMeloM6Gk1YLDdjGV/FKcm3bg4l1qQF5JWc6TViAtz3oJEG1cwBgXL4GibMe9jyJHDLXqEqtSXJVsONOtlIQDvhqDkdmwHkxJ/JI79TXpkeaneltPTboxMubESiELBEnRYdOAqxIvGolfJvuXlAy84CBVPTXjljtyFn6d3W/Cry4t4zeeHIIrAki9S1nkJhVIrUOGnxrEISkmOM+sOY8oVQo9EQtJ2LPpSAkUolpBVzGkgmtiQKDTrDmOfRD3witUqmUwcbTOmKmCyLMU3a5R4csy5Y1WUNxxPVUWsuwfvtFhvMapxdtqDcCwJhqS8lgbbzRnPrYmVm2k1owt+zLhCuDzvw6lJN0Kr/jjOQBQGDQ+tksWJcReOrwpQa/S2GmE1ZLcob6/T4sKsF7GECDXP4IjNgMMtqbaA9WuBNZGHgODEuAujCykz1K7Vz9Ck4be2buXBpTkfzBoFDrfo0dta3O/KdvAsKat3xMikC92N5fOHWAlEcdxhBiEEZ2c8ODvtkcTcmmdJupIlCVEScWPRF8HpKXdahK0GfOE4an16P+sOYbBd/p/prDsMszY/D558ODnhQr9dur9LNCHi2qIfR2xGyY5ZVGS+8L1nv5VW+1QIcm4VBFJVr3/+nXPplNZwLFkxia0USiVDhZ8aZ2JF2gVgsohT+qNtRkl6lldKlJTBMESSloZoQoQtQ8XNoMOMU5NueMNx+CNxdFl1ux7LG86+AmF8JQDrqnjj3qGFa8YdgkVQgiUER9tMiCaSuDjnRXv9zSokjiHobzNhYlNM8XZMu0JpIe3kuDO98DWoeawEoojvsCu6fneXXXeFC8WSOD2VqhDjGYI6rRImDY9WoxpWQYlBhxkL3tT5FUuKcAVjCETiMGsVCEakq1BwBqM4N+Mt2yQnlhBhEXKLepYKFcfgYIsB+jwNXaVgxhXCk2POXVtK4ll6WwkqDvU6BQQVD6tehXqdAmenpROlkyLgXfXgqnTMWsWO7aC1wow7jKFxp+yruUQAdnN21aSF0mnRocsqYGRK+pbxKws+7MmyKrac+CW8z0iNmmfxN/fR1KVK4ZyE9yApqdMq8PnXDqC31YiGdZuDvTYjNArqPkKhFBv6LatxbCYN1DyL7iYB56Y9Oy6os6GQDSuWIRBFcdu2rUyJU/lwfSmATouuqCazgpKDLxyTTAa7PO+DXsWhyaCGXs0jEkts8QG4suAHzxK012kz/m6HmvU4P5t9KtmiLwKLoMRxhxnBaBxJEdtWvSz6wlCwLE5OuDDYbsa5GQ9mXTdFup5WQ96mmwkxJf702404N+3BtcUYGJLyVZpxh9AgKBGIxGHSKLASiEDJMRhdDGBvgxajCwHU6xQbqrGAVIXW2sJ/zYB7PkPV1LQ7BJ4lsOqVgDuv4W/L9aUAjtgMOF2GyjW9uvTCz6DDhDl3GCPrIpnlDM/uvC+i4RkcbjXi7LQHoljc3crL876SJCwVi/Y6DaZdIRjUfNESrCoRTxZeT+WmFDUozQZVcU3fw3F0WnbfGCknR1qNOC3TKg2LoMSnX9WPFqM8WpUpO7Pki2BWhmbJjnotHn7oVtTpUoLP3913CC/81GMwaxT47Kv7q2Jzg0KRO1T4qXFu66jHb/70abAIKnzyV9fw4Z9cwYDdhHlvGNOu3KtrknkqP2umq3VaBRoE5RZz355WAy7lEKW+Gzt55kgBz5Ed/W7y4XCLAb8fc+7oARBLiBhd9KO7UYfL8zcn0gN2U17Cy+KqAXOdVoHApoXtYLsJkUQSsbgIliHpnvK1nexTqwv8Abup4LjdpAgMT7g3/HvNoyjTeapXcxhfDiAUS+Jgs36L8JMLsUSqbacYxsyTK0F0NQogAPRqHkNjThyxGTG64MvZ5DQXSjm9SvlsCDgx7pJ7J8MGRqbcaDWqMb3O4+Rgsx4qnkU4FodRrcBj11dKNp7N379KwV6nwYwrBL2Ko6LPJq4vBdBvN6VTJuVIKdZiC74I7GbNhopQniXY36RHMBLHNQlaU09NumUtniok8AQsFv9w/2H027f67VHkyahMUxNfOdiWFn2AVJXPV954HDolB6s+f089CoWSPVT4oaRNTF91ix0mjQKvGLQhEk/ioz+7is/89kbWx+lvM2I4j938PpsxXf6/EojCFYxi0GGGNxSDTsXBs9rmEEtIt2qc94TQZzPi4pwX8aQouaGiTsnBGZB2N9cdimU9Tp3yZiuNWaNANJEsaNGtUbCwmTUgSLWwzXvCAEhGnyWdksP1pZToNOgwYWis9Isab+jmIjkfAXMz4yvBoiTXOYMxOFcrjgiAQy16nJ5yw27WoIEAKp7dMeEsH3RKDrMlMmwFUpO7UiT+SU00noRZp9gg/IwvB9KC3L4sWiul5OqCDwqO2ZJAKHcadEpMrATT5znlJmYND384DiXHICLTz/XctAeEFNd+JpEUoVr1kVNyBL2tqbCAs9MeNGbp55YNHhmfg3I1tn3H3Z2454C13MOg5IAUc55i8IwM59Fte+vLMBIKpXahwg8ljUHN45XH2wCkFpwvHbClhR+GAPU6JXiW2TblY2wlO/+Wzfgj8Q1ms0kRW3blDrXocz7uwWY9IvEkdApuSwn1hDOECWcICpbgaJu0C9N9Vh2uLkhftu7NoS3g5IQrJagFoljwRQr2HJlyhTC1bjJh1PA4P5v5mAwBuhv1WPZHkEwCR2xGnJt2Q0LdLieyTfTajeuL/qIu0EQgHT2+fue712aQzMhco2DRaFDhWhHbKtZj0vAVKfqsoeBSu/AsATqtwgYRrtTJNrGEiGPtlSei0fL97Wmr0+L0lLvcw9iRRqNKEm+93bgy74PNrIaSYzeYrc97whnbdfN6jwUfGnRK2MxqLPujiCeTsJk0WAlES3ZN3I5Spaflwvuf3Y2Hnrq33MOg5IgchZ9Oi26D7yOFQikPVPihbMua8XOrSY33P7sbz+tpBpCKLn/b/57C+KrQo+YZhGJJOANR6FUcvOE4dEouK8+L/rbsWpDOz3hhr9NsSIXaDZ5lcGHWCwXHgGcIYhmqZaIJESfGXRCULBr0KtRpFVj0RuAOxfLyX7CZ1EWJYzVqeDgDuU18R6bcONZuwniWhsq5sFNMtTccT7dhAalz6LjDvO6x0qHiGNTrlJIsGpzBGAbbTRgq8cJbyujrfVZdST2FKjmlg5BUlQ0A9NvNW5K/Ls56QVAaD5RKpdOiwykZtzGVm0pofVNypRM4txOY2uu0klzDAWDJH8HSuoCHWXcYLEn5DDUb1Vj0RTBZhHvmbjTqVZh1y8eX5fVPceAtd+4p9zAoeTAjQ+HnhX0t5R4ChUIBFX4oO/CUjnq89rZ2vO9Z3VCvi/M+1GLAJx88ihd+8jHEEiJ6Wo2YWAnCoOERjiVgXzXyHHSYcWnOCzXPQsWzYAjSYlGLUY1WkxrDE9mLAbnuG6+VTscSSexW9OGLJOBbCuDGauVRPl4AZq0CnnBsQ5uRVDjqtTmb4u6p1+KMTJIdhidcsAhKSSLRcyEcT0qaIFUOM9arC3702YzpNp9JZxBKnslrkbCbYbGUKDmCVpOmrNHxhcAxBPsb9RABXMvgmaBWsOAZBs4SpFTZzWrUC6qKq/bRKNmMgjslJebvJKDLhXii/C1oxW5vTIjASuCmIW6mKku1goXNpIYzEE2LUCxDdt3oMWl4tNdrEY4l4A7G0GpSIxpPgmeZVKAFUnObnQrjCEn5HDoD0ZJUXz301L1437O6QAit1qtEFn3yERCB1Ln9oqNU+KFQ5AAVfijbouJZfOAFmeM7DzYb8G8P9OEffngR15f8WPZHMe/deLNZE07WG+J2NwoQVBwmV4I5V4A0CMq0cLQbHRZdOq2ppzX3VpmhMWfOLVs2s1qylpzNJHLsk2qv02DGHZKNHwghpTUUXk8imcThFkPafLowyvNbjKy2g6xVmAy2m/MSfq4u+NHRoJXELHU3Iqum35VKLCHueI1aSwoqtvCzv0nA2HIAEyVY8EkNz8jXsLbcNBtUFSH8jK8EoVGwCBbRbH43lKvGx1oFC62SK8oGQiR+8x6rWCeQ99tNiCeTYAjByKQbHAMcbtEjEE1AwRIY1AokkiISoohrC3741lU5rvnCudZt2sxtk7Zk1PAYsJuQEEUoWAaRWBI8RxCKJRCOJtJzi95WQ9E2dAQVh39+cQ+efbipKMenlIalEm+w7cbhFgOaDDQRjkKRA1T4oeTNc3uasL9JwNM/8pusX1OIUW0uXghKjsG1RT80ChaXcogwX49OmdvXwyOxmfN6zs540NeWijOPZ7GDHoomEJXBTu0aXY1C2r+m1AxPuGFQc5IY47qCUfCstEbjubD2rpfmvehuFHL+PnlCMXQ1CkCJqnBK2SZSDm4sB8AxQLH01YPNelxb9MvW+Hc35HQNkhul9ogqBBVfXuGHEAKeIbDXaTHrCYElKKpn3MlxF9Q8g06LsCVxLZ5MebDplTxuLG0UY3taDZh2BdPBDiSHjQJ3MIaTWbRF5pucuhs6JYfv/NFt6LAIRTk+pXTITfjZayltEAKFQtkeuh1HKYhSlgJnu9iu0yrgWvXDaa/TIprnDDEUy22iK6iLq6OOTLpxxGbM6rkaJSub6GybSV020QcAjrYZsadBmomHo15bNtFnPb5wPC8R67jDjJEsPLWkgqvgip9sULBM0UQfJUsw4w5VrOgDAFNl8EqpBHRKVqIKxNKwp8ymrFfmfagXlLg454U7GCu6OCECCMWSOLvNZ+QNxTek/a1xdtoDZyCGIzYjBh1mnJ9xSz42ZyAKQSX9XOPdz9hHRZ8qIJZIlqT9OBfWkoMpFEr5oRU/lIKYk1kSxfoqCK2CzblqZz0rOZhJpsysi78j6s7CYyafSpBiwRCgyaDekAhWSnQKFqdy9EbajsEyGVRvx43lABz1WuiUqd34OzobMO0KYdoVxI2lQMZqiwuznpIJV4ea9ekWtWqFYwl6rcVpvTjSZkI8IWZlfi9XXMFYWby95A5B9hsZcmAtJZKQVGJQqT9Pz6awBblXkhUzqW3GHUaXVYcbsYBk51CLUY0Hb2mT5FiU8uIMRGWz6bdGIln876soitSTikLJgqxWxYSQcQA+AAkAcVEUBwghHwDwJgBLq0/7c1EUf1iMQVYanlAMhlVD2USysn0uduOrJ6ZK9l48S2DUKKBRsBvSvY6sGt9emffhyrwPWgWLQDQBm1mzJYknF7yhGPrtJniCUawEomnPoEx0WrQYKXJaEgFwY2lnz6FWYypVrL1Ok7UfUjHpbTUW9BlkgiXAQLsZSVFEJJ5Kk9scX0qQEmrCsYQki/Jj7aYtJf9yYGw5gPv7mvGPL+rZ0DriDkbxlScn8ZGfXsH6zsCDzXpoFBx+dWUpw9Gk5cqCD80GVdowtRrxheNFadlJGd+7wJD8jOblQqdFhxU/FX0244sk0KhXbfHFkzNrIu6gw1x2IS9QwWmBhWLU8JhwBiUTfeq0CvznHwxUfVturSBlCqhUbOdrJRWjCz688b9PQs2zeOfdndSjikLZgVxave4SRfGIKIoD6x776OpjR6jok8ITiuG3V1OLqvd/6yxe/8UTFR1pvBtP29dQsve6vaMeDICJlSCOtZvQ02pAp0WHi7MeDI05EU8k8dSuBgRWb3zrk8hyRc0z6LDoMDzhwrWlADqtAnpbDehrM8KqV8KqV6afSwhKkp416DBjN3ufeW8IIkQYNYqij2cn2us0GLCbilLxMdCeqrw5Me7C2WkPpl0hHHeYNzznYLMeT445JftcovHkruktpYYhwD37LfinF/duER+MGgXeelcHPvXgUahWjVFfc6sdX3/Lbfjca46h1VR8o8VYQoTNrCn6+1QlIhBPiogmRJyZkp/gmC1z7hCcFWBgXA4s6+4hlcSKPwKhgEpaKfCE5NXKUiqUHME+q4BwTJoKiiaDCt946FYcaNbv+DxRFJGU2f2Pkpk1I3Q5UewK9PZ6LY62mXB53if7akAKpdzI7wpR4fzfyAyeccAKIFVy+ZurS7j7I7/Gj87NlXlkxeEFR5phEYo/gWUJcGLchYXVnca1Rf/ooj/t4ROIJvC7q0uw12mgVrAI5im4sSTlXXR+nSn00KqIMDLpxoI3gnhCxGC7Ce11GjjqtbsKMvnAMUB/myn976sLu98840ng2mIAzkD5JsaDDjNcwWhWRpX58P/bu+vwuM4zb8C/d5hJDCPNCGxJFli2JMexncQBh6HhtMGmTdKm3RTTZtvtV9wt7267W0gppZQxKWzbtEkasszMFrM0oGE83x8jyYIZaeAMSc99Xb1qj2bOeSOPRuc87wMu/8J/12K1FCdHp9FluhD8meL5v//cuBO5lEW8taYAJz51Db79QCckotgf49c0l+G1D1+Bnz1yEf7fjZEJfUIBw30XVWdknRxW/81CzyT/jbIHbR7Ul0T6UvmCHDZV6Xg/R7pJRQI4c3D3maTm3IQLhWopTAXZC+rmWilLJshEAviCHC/Zf4wBN7SW4RePbUVtHP3v/nlmEjf/76t47dxkyucm6aWWibO9hCXOjjsxmsasH7FQgC/e0YbmCg1O5UibA0JyVbyBHw7AXxhj+xhjj8x7/F2MscOMse8yxvSxXrxW7Om1oLFMM7f7PluTPjbtwzt+vB93fuN1PPNqD374Rh9+9EYf+nOgFCdVYqFg7gYlnTabDHFlToU4oFApxbpiFU4lMIp98TH0yuUzZqZcfnT3WtE75YbN7Ue5jv/mdZuqDdjXb0WxWgqZiC1baraYWJi9KIXXH4Ldk54sN51CjGOLprSNO3xYX6pBd68FG2Z2Lqt4zDSRiwVYP+/nOhf4gqG4U/MNSgm21BRAMK/k9LL1xela2gLHh6ZRlIHAcDYpUsgsXI5hXtbesWE7CmY+k/QKMVRSETpNepRppegyG3KyiXYdTXJZljCXIskJ6pl0oUCZvZ/r5YLdq1FdsTIyjZEnH7muEf/z5k2o1Mf3e/K3B4dwZMiON39rN774f6ewry8/S0/XAqVECIkw934+vvSXU2k9vlDAcOm6Ivx4d/+aLgUlZCXxfjps5zhuE4BrATzOGLsEwNcB1ALYCGAEwJeivZAx9ghjbC9jbO/ERPr7SmSaNxCCwxvAmTEHvvdqz4KpSxOLeht091rw8eeO499+exQf/e1RfP2lsxleLf9G7B7s6UlvKUKlXo69CfSJGXN4ky7x6TTpsb5UjaEEmhFbXAE4vUFsKFej3ahDW6U2qXMvZp+ZzKBTiGE0KNFu1MUV0BELGApU2bso75lyLci+4ZPNHUBT2dK09Nld0POTLmwoV/M6enhDuRb7+qw5UztfrJbizg5jSseoK1al1Pg8Xk5/CEVZfC/ms/nvN1+QQ6lWhhK1FE5fEHKxEHt6rRix+9DdY8H60twLsiglNDtiOcE8L505NTqNbMQby7QyeBOcuJnPGkrVODvu4q1s+bqWUjy83Rz38w/0W/H84QsZ60+/fB5yMf1s5yrGGAwrbFxmwy/2DcaVtZ6K+y4ywRcM4buv9KT1PITks7g+vTmOG5r5/3HG2G8AdHEc9/Ls1xlj3wLwfIzXPg3gaQDo6OjI7yudRUbsHlzzX/9cMG3in6f/ioe2mzFq96yY0fOT7gGYCpR49NLadC81bb750vm01tQWqaQoUEmWNO9dzqDVg/Wl6oRTPjdX67GnN7kg1rQ3iGPDkfN1mRYmv5kKFBAJBRAyhjA4nIkjE0k9M6kJAE7Pe/76EjXOTzqXbexYrpevmA4uFjAE0nTj4fAGsafPgnKdDMM2/tN7l0vz9/hDc/8OfHF4c2P3yGiQ42ePbEW5LvX+PEIBQ6dJn5Emz2qZCGqpCI5VugvXO+XGljRMfDs8ZEdLhXZu7Pf8TLfFmwp2TxD1xSrYPAFM5MgErQN53JsoE0RZzMrkg9MfQpFamtH3m0jAoJQIMbKG2njwPbr94zduSGj60f/8/Sz8wQvf8F0bSlbsCUSyy6CU5GTj+F/vH8KHr21I2/FLtTK8a2cd/vNvZ9BYpsGVM203CCEXrJjxwxhTMsbUs38GsAvAUcbY/LbpbwJwND1LzF19U+4FQR8AcPiC+MoLZ/DzvYNx7eg9d3g4XcvLiHSOLQUAc6ESh5KYlmVQStA5E4CZbTS8Ej774hgNcggZoJGLUKiW4uy4E6fGHHB6g+g06efKNmIRi4RRR6CfGnNEzaAo00qxrkSFTVW6BRPPlhxXwLDFbEBjmi/cOC4yIjYdRqeTGw3fXK5BXbESXebEspFOjTnQnKUL3S6zAZ+/vRV/e9+lePEDO3kJ+szaXp+Zxuy7eyxYl4MZKXxKV/A73h5Jg1YPzow7UaKR8loSkopiNf/lr6tJPpd6zVJJM1v+urlaj7MT/PfUykVSUSQ4n+xmVDQSkQCFCWRghsIc9EoJPnVL89xjm6rWfFeHnJerjePTnfEDAI9eWou3bTfj6y+dW/K1F0+N49hw+gexEJLL4tlKKAHwm5kdAhGAZzmO+zNj7IeMsY2I9P/pBfBouhaZq8Z4iKhfXFvIw0qy54GLq3H457a0NDcGkHRD3VCIw55eK7aYDQiFORwYsKFAKYnZ9NeglPDapHXAEglOTHuC2Dvvwm3E7sWI3YsOkx7BcHhJLxwBA2qLVDgzHjsrqL5YBYvLD++8XbhynWJu3LhBIYn012DAgMWFEXtkR5YBqDTI5zIT2o26tEzdmpWuTBmdXAKAJRSo66jWzzWb3mJO7KJILGQYtHnm/szXGN1oJCIB2o06XLKuCFc1laC+WJXQ7mwiLqnP3GfP0SF72r932RRIU+BHkOC//dGh6SUT7rKlUi/HkC25IO1aEAznd9qKTiFOKBOXD/5gGJur9XO/61arYrUURWopr0EfIPL9Oz4yjeaK+MrRhQKGL97RBm8ghM//+STaKnV485YqXtdE+MfnBhGfdPL0N54WCwV48poGfO7PJ5d8bUd9ET7wi0O4qMaAuzrpfUzWphUDPxzHnQfQFuXx+9Kyojzyl+NjKR/jkgztuqfLm9oroZNL8C8/OcBrKYepQAGNXJx0+YR1pj/O/NeLRQJsrtZj3OGdC8zMqitW8TItAwC6e61oM2qXzVTa22vFpiod9vfbFjwe5oBJ5/Kp855gCAaVBBqZGFq5GL5gaG5iQkOpGidHHeie6YlUoZfDXKiETi6GWCRY+N8Y5z2lQSmGwxsExyXWl0Kbpl/y5yddEAmA2iIlzsWx+2sqUODk6IUymZW+v4sFQhzqZxrV9k+5UaiWQi4WwubxQykRpdR74eHtZnAcIBYxdFQbsL2uEPI0NQterK5YhUKVNOHvRzJ8QQ7tRi0OJJG9lw8UaehnY1BKcDiJ95YvmBsBhWEK+ixr1J4bJXnJqilULvn9lW4HBmyoKVJm9JyZ1lapxeEhO8bTVEJ369dew64NJfjArvUwFcb3vZSJhXjq2kZc01yaU0MOSHTpyrZOxeZqPf7jtpaMnEsoYHjy6vVRH//sbS1497MHUKyRYWeGhlwQkkuoQ1uS+qZc+L+joykfpz0Px/QutrOhGHUlKhxI8iJQLROhUi+HxemfG9fu8AbRm+DUMwag02yA2xdcMIp91qjdi1G7F6WaSAmCRi5CuVaOEbuXt6DPLGcc2S77+21oqdBiyhUZDz/u8EErF604vcvtD2HY5sUwLmScdZr0GLV7oFzUsHe5JtWnRh1oKFWjb8oFTyD6zaJUJECYi+xAhsIc5BJRXJlReoUYZ9KY1hsMR/qc1BdHz44qUEpQXaDAqVEHJp0+OH2Rfkm1RUqcTyKza/7O69iiC/KmMg2Ojyx9v8VSqpHhmbd2wqCUZLUchjGGmiJlRgI/MyfMzHmywOWLf+JevKSi5L5f4TCXtewqmTjSy8wdCK3ank58md2cyEcqqTDh3898mXL6IWSR6Zur0Yjdm9Zx9f5QGM8fHsH/HRvFHR1GSIQCnBl3YMoZeT/aPQG8+/L6JZk9lOmTPyr12Qv8tFZqcWVjCf50dBQnZq6LtHIxvnJPe9yTSPkgijHZTCoS4n/fsglffeEMLq4tyOiaCMkFFPhJgjcQwvt+fijlqRxiIUvbKOBMmvYGcGwo/hvfxUwFChyZeX27UYchmyep3S4OQO+ka8XXVhkUGJ32wiCX4GSCDaDjFe/EpCNDdsglQggAdJj0mJj2QiwUYNIZ+6ZAHmXH7dSoAzKxMKEUeLc/hJOjDhSqJNhoVCPEcZh0+BYERtaXqHF4yA7bXDDKh4ZSFU6OLt+gusqg4G0KSSzTniAaSyO9krRyMSr1cjAWSWd3+YJRd6OdviDvF9Vuf/w3uAalBH9+zw7oFLkxdWMyg41Zz6/i3hxioQBqmYjX8kaNTDxXppmIw0N2bChX4+SoE6EMTo6abfQrYICpQMlr6exqpFeIUWVQ4tSYY0mvwFxSpJKipkgJq9sPxhjkYiF6p1y89sRLhN0TQHuVLumNJhIRCHF4dnd/1K9lbDOApEU2Aj+MAR+7oQkPXmwCYwz3XVSNf5wahz8YxqZqfU5lIYmFAjxx5Tq4/UEK/JA1hwI/SfAFwnjbdjNuaivHuMOLSYcf094A7J7A3P/b3QE4VrjJDIQ4nJtwoq44N5pxJksjE+Pzt7fiPT87mNTrz45fuEE4OmxHfbE66TTn6gLFiq8NzfyjTLn9KNPKMGLnf/pBIr05Zsc2742znt/hDSy5yZxO4YZz0unHpHMKbUYtLG4/xEKG+mIVTo05Mela+r0ctHqwvkQNrVyEvik3ClTSJRkvmUoH39NrweZqPewe/4KpR7HwHWhNZJqTgAHb6gpzJugDZHaktD9KCZJKKsLdnUZ8O4/HrxqUEgRCHKoNiqiZhsnSyiUQCxkkQgFc/sTGVx8bdsBokC8paU2nmkIlJhw+hDlQ0CcOo9M+jE77UKzOzUasYgFDq1GHA/3WJVPksqVSL4dWLsaZMSc0chGmPasrq6xYLU1biVciClS58ztqbNqLEg01ik9EbVHmhyl86Y423Lqpcu7veqVkwd9zjVDAoJalv+cQIbmGAj9J0CrEuLalbMXnhcMcHL4gpj0zQaGZ/3f5Q/AEQvAFQvAHV0e+8rUtpfjwrwXwxigZWk6pVjZ3oxAIcQmVzcwnFbG4+lvs67NCIxdhfYk6LbuG60pUaW16eXLUiZpCJe/Nk73+EGzuwFzTZ3OhEv1TS2/gnL4QTo05IBIApkIlNHIRukx6nJtwzTXPTteUo8XCHOLOclJJ+C9PCMeI7O5cX4T7tlajQCnF0WE7NlXp4fQF422rlBFOXzDqzq6AAUoJ/+PXBfP+45USITZW6fDR65vQO+lKa+Bno1EHxpCWn/X1JWqMObxzQcd4+07FgzGgqVyDnkkXaoqUGLF54QnEHwAqVEkzEviRiQUIhTnex9mvBRvKNXEFrLOhsUyTc02Uy3VyHBm0IRjmVl2j+FKNFFUFypwI/LRV6uJ+rjcQSttGD8dxeOsze/Ds2y6CVkE36fHSKSQoVEmWzRzn00PbTDkd5CGEXECBnzQSCBi08kgDXmO2F5NmUpEQV28oxe8OJj6e3pfAzUw0rZVaDFk9sHsCcWfvNJRoMGh1857xUF+sgoCxtO2QChmw0ajH/gH+L8jdM/8Os5O+Vtq1D3OR7J/ZjC21TAStXAy7JwBJjPrqbHL6Q+gw6ePOrIrHpNMPhUQItz+EAqUEOoUY17WU4X1XrZubxtVm1PF2Pj79+ego3FEySW5oLcetmyrw4Pf28Ho+geDC9+Nb92+e628Uq9yADwqJEP1TLhgNirQcPxgOzyuDBK87iAf6rfDP3Nx6/CG0VuoSuhHP1I1xsVqGfkt2+r3kO6Egl0LBF3Sa9Gkv1U3GkNUTsx9dPpudOjk6nf2gDxDJYpz1ozf68PuDw3jymvXoMC2dGPjD1/uwu8eC9+9ah8YyDQBgyObBL/cO4q5OI0q1yWXr/HzPAJ47PIxjw9P41f5BvHW7Obn/mDWqtkiFSWf6g/GXNxTjqWsb034eQgg/KPBDePOBXeuxv9+a0C5zXZESZ1PYId9iNmBPr2VunPxEnLtl3b0WFCj5T2fWysU4MmSHqUDBa3ZJfYkKMpEQ5yec2Nefnl1YjUwMIP5/uzAH1BSq5jK0XL4gdDO7ct4Ug3l8KtNKYTQo4fAGEOQ5E8nlC+LODiNaK7W4sa0c4hwMeMVyZWMxHr2kBi+dnkCpVoaNRh2uaymDXiGZaTzNb9mBSMDw6CU1eP+u9ZCIBPAHw+DA4W8nUp+OGE2BUoIKnRyHh+ywuO28ZFcoJEI0V2jhDYQgFwuXZLkcHLBBIxehoVSTcsN4/7zATSDEIdEYwdEhOyr18rSP3O63uLHRqEPPpBP2VVZ6k04VOnlSU9vSrUQtxcEBW05m1CTSTy1fdJr0vI9tT9XsRM6vvXgWn//zKTSVadBepY/63LoSFT7zxxN44eQY2o06FKqkeOHkOEJhDm+cn8L3HupMKiOoqVyDJ391GADwbHc/HtpmmttMISurK1alPQtza00BvnHvZkhE+XPdQ8haR4EfwhujQYHn3rUd7//5Ibxwcjyu1xhUUiCFwI8/GEaySTumQuVcaRJfTo46UFeswgjPo4wlQgGODKX3JiGZizO3PwgBiwSBwlxkYpU/yMUdgMuEIpUM3T0WiIWMlwwvqUiAdSVqrCtR4507a7NST88HnUKCp65rxFPXRd+tu3pDKWyeAG7bVIEXTozjh2/0JXWe2iIlttUV4u7OKjSVa+Ye/8oLZ/A//zib1DGXIxcLUaSWwhcI4fC8nxmbO4CNRi3OjDnj6pnDGCATCVFbrEQwFIbdEymNWymgM+0JorvHwusN3RazAfuTCPiWa2VpD/wAkYBXbZESHn9oQcCKxFauk2Eox0beq6VCiISCnAz6AEBNkSrnys9SoRALcHAmwzZXiAQXho68fm4K60pU+MHDXTGz02Yf5TgsGajw+vkpPPLDfXj6vs0JX180V2hx9YYS/N+xMZwdd2Js2pd09tBaVFec/uuS9161joI+hOQZ+oklvNIpJPj2Ax3YUV8Y1/MVEiFaKrRJnYsBODex/HSp5bjSMG7Y6QsiGArDMq/8QyJkaK7QoMoghz6JOvWNlTqMpzkFXC4RIhBHf6TFuJmAz6zjIw4EQ2EYlBIYcqCJsUoixInRSJZHIMStONFLKGD45M0b8LbtZmhkkbi4WMiw0ajD9rpC3NRWjhc/eBmee/d2fOnOtrwN+sRDIRFCLGC4bH0xPnnzBtzYVj73tX9/UwsuWVcU13GevKYBn7y5eUHQBwCuairhdb1A5N+qQCVBv8WNsUXBxyGbBwcH7FBJRVhXsvK/W0u5Fq2VWiglIpwcdWLE7k3ohvhgvw1dJj0v5TwuXzCpm/FMBhbOTbjQmkBvkLVMJRHy2gicL43l2pwLRs0XDq+uMi+DUppzQbZSrWwus+bTtzTj3IQLzx2KXcKvkCy/f/zy6Ql87HdHk1rLB69eDwGLfK7rqMdPQtId+CnVyNBRHT0LjBCSuyjjh/COMQblChcDQCSg8erZSQRCXFJlJZ1mQ8rlFHxjDLC6F47m3WjUoXtm518qEmBztX7JrqVYyNBepceEwweO4+DyhWDz+NFWqcP+fivkYiFaK7VpKw2oNigWZEfEq0gtRd+i/h7eYBjHR6bRaYp/4lU6lGllCIU5OBN4X93ZUYn7t5oARAIWu3um4PaHcPWG0jStMndd21KG8pkdVsYYvnB7K65tLkWVQYHGMg2+9+rKDZlrCpXojNIXAoj0+rmprRy/X+amIhESkQCmAgVOjy0fDB5z+DDm8EX9OZw1O62tUCVJulF5IMyhu9c6178jGzRyMYZs/E8tjMXuCYAByK1b2dzTVK5Fd2/u/O5qLtcgzCHnfp8udmjQjnUlqhV/xvNFuV6OwRwLtM0PGARCHEJhDp947jj+dHQUH7qmAZtnbvY9/hC++2oPGstWnkr724PD+OTNzQln/dQVq3F5QzEmnP6MTQpdLdK9KdVm1M717SOE5A8K/BDecRyHA3E0Hz4yZMPsZlehSgpzoRIA4goWqCTClC9SPWnoF9Bu1C1Jd55/E+QLhnFwwIYyrRQj9gsBibZK3YL/nkKVBCKBYO6G0eUPwcnDFC9TgQIKiQgSkQDTngCCYQ5SkQAnRx1JHS/WL/4wB97L6BJVoZMnfMM9/2JJIhJgR318WS2r0cZFTallYiGuaymDNxDC+35+EGfGY998iYUMjWUafPv+jgWNQhf7wh2tcHgD+MepiZTX21yuWfKzt5xYfaiayzVzn0F8TEU5N+FEhV6OoRRKro4OT6MriUB3ppusnxl3zgXNSGz91txpht1YpsaZcWdcEzGzLcwlV5KcqwYsLrRURIJuuTLdbdoTgDcQwomR6QXl5W2VWjRXXMja/Omefvykux/vu2rdisf0B8PY22vF9jgzwecr1coSmmZIIko1MoiFLG0ZZfXFKwf8CCG5hwI/hHfBMIf3XLkOwVAYhwft+MW+wSXPaa3QLsgwmW0QLGSRX1ij08vvUpdqZSk1hQYiN3VKiTCufh/RdJkNmPYEMGTzQC4WYl2JCq+cnUKbUQupUAC3P4QQxy25GQ2FOVTqFbC6AvDOXGwLFjUtjHbDeX7SlVSD2jKtDJNOH8JcZAdv9nsNAGIBQyCFvjfWZYI7vZOutF54rCSZxsS5OmUnlzz5y8PLZun8yxX1eNfOOggFbMXvp1QkxNfv3Yy3/2Av/nlmMuk1JdNPZ9obWPKYRiZaksGWKqs7gLpiVUqBH61cBG8Sn1PneRotn4i9fVaYC5UrTgVcq1oqNDgylP2bfHOhEsVqad4F6XpX0ftqxO6b2wDaYjbA5QtCMVMGGG3iYiacGHEs+TxWSIR44sp1kIouBN3+dGQUbUZd3EMsnnmtB9vqChJu0Hxq1AGXjwI/iRIIGMq08rRNXKxK06RMQkh6UY8fwjuxUIB7uqpw31YTvnBHG77/1q4FE2kKVRL0WqJfvIU4oFgtXXGCzYjdi1QHPLj8oSV9R+KlnMk4OjnqgMMbxLjDNxfgODxoR3evFUeHp3FixIFQlMDKnl4rwgA2VemwuVoPl3/pTWg0Ew7fXOPFeBmUEogFDDVFyiX9G1IJ+qhlomV7LAXDHBpLNZCKshNMkYkT+3iTrvEMn3jY3H784chIzK9/YNc6vG+m4WO8QTSZWIin7+vARTXRS8IWEwsZtHIx5GIhOkx6bDEbcCSJEkiJUIAtZsOCz5H1pWo4eMisWyzVi29jkqWYs1mUmRQKc1BJhWAAukwGtFfpMr6GXDb/5jlbtpgN6Jl05V3QB0DSGzW5bnePBUeHp9Hda0Vzkn0P+eAJhJYE4d+2owYq6YV94ucPD+PggA3vv2od/nkmvmzNv50Yx3df7U14PQqJCKfHHHBECdST5ZVq0tcM2+LObkY3ISQ5FPghaddRrZ8rdxKwSFnX9DJjfw/PjCFeTmOZBnU81DCv1Ow3lmjBnNljxXtMfzCM/f027Ouz4thwfKVW4w4fmsriD1ZtqtLh+PA03IEwzvDcF6GxVLPiRLXDQ3a0ZKHhq0IsSHiyWHOFdu59xyX7xljlRqe9c+/9pjIN7thciU5TpOfDlY0leNfl9UkdVy4R4tsPdKJtUXkZEJlMJZoJIrVWaqGTSzDtCcATCGFvrxW7eyxzmXOJODcRufFVSUUQCyPHt6bpYnZs2pdUY3cgUnKXbBmISJj5oKtOIcaRoWk0lWvQ3WvBwQEbuswGlNFEHgDA+cns9qepLVLmVH+hRIXCHJQJbn7kHZ5+/cglkQmHqfjMm5rnyrn8wTC++sIZvOvZA3jkkhp4AiEcSKC89j/+eCKhqWxf/L9TeOn0BIJhDq+fm0p06Wteqv/2y3klhQxdQkj2UKkXSTuFRIhOU6Q/RUOpZkGpUSyiGL0p9AoxTAUKHB22w6CUJNX3YpapQAFu5v9n05W3mA2wuQPot7gX1JUbFGIYDQocmsksKNZI0W9ZVLqRoXusRMqRhAKWlkarCrEAp8fjC1YdHrRDrxAvaXqdTgLGYPMkdr59fVZc8aWXsKFcgxG7F8+9e3uaVpe/TAVKaGQiXNlUgi/d0TaXtv+1F8/CkmI/HJVUhO8/1Im7vvkGTo1F3luzP9/1xSqcn3RBKhJgwsnvhDuHN4iOaj3GHT6cHU9fGYlRr4DL74A/wSBVKBxOOkDdF2cZRqqkIgZfkINIEPnZ22I2zP13cjNNg9VS0dzz1qq6YhXOLtMbKxPOTbgglwjhyePMmXWl6qgBh0q9HHdsNsLtD6J3yoVBqydneuckYsqV2GecQSmBTi7G+XllcLVFSujkkQmHyf7+lQgFcPmC+ML/ncSIzYtXzk7OlVA3lWvwmT+cSOh4wTCHN3/rDTx5TQMeuti0YnPgYs2FwMXLZyawaw0OWUhFOgM/Bwds4Dgu4dI9Qkh2UeCHpB1jDN97sBNv/8HeuC82C1XSqP0pKnRyHBiIBF+GbV4M27xYX6Keu1FMhFomwr6+yNSd3ik3NDIRDvRb4Q9xCybxlKilYIzh5KgD9cUq6BRiWKL0ttnXZ0V7lS6hHbBkHBm0YXOVHvv6Y++c1RYpYVBK0nZxL5eIYI8zsOIPhtFu1GW0rMDpD0ErF8e9xllDNg8uqimgC8wYZGIh3nvVOtzdWbXggu8dl9bC4Uu9REqnkOCHD3fhjm++jr4p91x2kd0TgFomSriPT7z29lnTnpEym8lYrpNjT68l7mCOPI4JibFMufyon5nSs1wz7mSU62QYtnmxoVyD85MubKpSIxAK48jQdNSfdYcviC6zAceH7HDmcdAhFQVKCc5meQ0iAfI66AMAJRoZ3n15XeT7OeFEgVKKTpMBW2oMEM/bNAqEwvjob47iZ3sHsrjaxCVyK91SocWA1Y0JhxdbzAZMOHwwKCUz1y+Ra6hkG677Q2H8+x9PRv3aO3+8P+HjAZEBF596/jgYgLduNy/4mscfwqf/cByFKinee9W6BdeA/zg5QYGGBKUz8NNcoaF/C0LyEMtkSUNHRwe3d+/ejJ2P5JbvvnIen3w+vh0isSAy3pyxSHlTz6QL7UYdDgzYljxXIRagriQyYSDececiAUNLpRYH+m2R1xerMWj1zNUtVxnkkIiEsDj9UMlEcffoKNPKMGLPzPjk5bKdYn2v+NRSoV0w9WM5MrEALRVaMMZwbMiekT4NGpkI0wn2a6krVuFv77s0TSsi8RqwuPHg97oxPu2FY5U19lRKhBAKWNzvzU1VSycFJqpYLYXV7U+50XqXWY9AiEM4zKF3yo11JaqEg3G1RUooJEL0TrkT7qckFjLIJcJlS4VzWS40vVaIBVDLxRib5jdzLt2EAoarGktw39ZqXFwbf5NgjuPw4939+NEbfUlPr8w0nUIMWxwZOolsblTo5Et6/GWTUiLEbx/fhvqSC9OhPv77Y3jmtV4AkbLexddzz797e1b7H+WbX+wdwAd/eTgtx750XRG+/9autBybEJIaxtg+juM6on2NevyQjHju0DC++fL5uJ8fCHPo7rVgd48FEiGbKcuKftPiDkSmh004fNho1KHKoECxWopOkx4VUXoFCVikWepsZo47EMbhIfuCZnX9Fg/kYgEsbn9CjVlH7N6MNTPd02OBVBT9RzjW94pPtgT6oXgDYezptUbK/RLoUZSKZMYTewMhDKRpCgaJn9GgwEeub1x1QR8gUiKRSEDy4IANFbrle56tZNzhW9CcNRmbq/To7rHiQL8NhwbtsHsCSWVgnZtw4cjQNMwF8Tee1spF6DIbYC5UorE0M58ffCtWS7Me9AEiv++qDZlv+p2M9iodHthajU/d0oxXP3Q5vnHfZmyrK0wo04AxhnsvqsafntiBjmp9GlfLH48/uOLwiuoCBRpK4x+pnYlrgkS4/CG8+du78eKp8bnHjs7bSIq2ifeX42MZWdtqUZzG5s6vnJ2kayVC8hCVehHe+IIhnBlzQiuP9MOZNTbtxft+fjDp3WaLKxDp67FCb78Ru3cu20YuFmBPrxVdZsOSMcphDihSrXwRnuz0lTG7F0IWmVCWThyAcp086n/HkaFpaOUi2NO4Mx6t3C0ep8ccMOrlKNPJk+7PtBKNXJTUCNhBqweXfOEfuK65DK2VWrx1u3lB6QDJnMsbStBlMuR1I9rFaouUcyWk8Qpzkd4lqezWd5n06E6xTG7Yzm+2wPGRabRWauH2BXF2hbHz60rUc58VBmVyTbKzzVSgmOuPkm39FheayzU4msP9bz549Xq887Ja3spJGGP42ls24emXz+OX+wdh9wRQX6zCaZ6HHvChSCVDuV4Ohsi0r3ajDgIBEAxxkIoECAM4P+6Mu4eXkAEiQe79Hptw+PCr/UO4bH0xgEgp8XL29a2e3wWZUKTit9RLKhLgoW1mVOjl+PJfTuHwoH3BtT4hJPdR4Ifw5hd7B/HR3x6FWMjwl/deCnOhEsM2D+77zu6USgwmnD4UqiSYTKB5rCcQyfaY9vhhUIphcS1Mh3bG0Y8kEEo8YwQAhu1edJr0aetHMl8wxhpDYQ6mQiUODSQ+AjoeDaXqpNPmHd4gHN4gFCn0LlnJtCeY9Bo5DvjDkRH84cgI/np8DB+7sQmtWZhMRoB37KxF9/dWz8X+kNWDdcXJ9SRLVke1PqlR8IsZDQpey1iDYQ6HB+3YYjbg7IQLjWVqqGVi9E+5MDpThiQTCVBTpFxwc66SLv08z3XtRi0OxlmGnAmj074Vb7Kz6UPXNOAdl9XyftxijQwfvaEJd3Ua8UaPBfddVI3Xzk3inT/eH1dpVaYM2jwYnAn0dpr0ONBvRRIJrHMayjQ52+TaOC8rW7HCtLZcDNLlsvnNsVN1U1s5PnRtw1z2aW2hEr4kr5EJIdmTe1sAJG/9ev8gACAQ4nDll1/Czi++iF3/+TLOrbCbG4/CJHcuTo46oZCIsKlKh05TpGeQUiKESrZy0CHayPZ4nRl3QiFO/4/XcjvIkjRmqihTLBsBgN4pV1q/R3y0L9vbZ8XtX38doxnq20QWumxdEZoyVBqYCd5gGINWN7aYDXG/RixkODeR3A1Pu1GHvX1WeAO5e4E+23T2xIgD3T0WaOSRjB5TgQLeYBjHRxwL+pj0W9xoqcif90SX2YADA/aEp7ml2/i0F10JvA8zZaNRh0cuqUnrOepL1LjvomoAwMW1hfjtO7fh9s2Vaf2dmaw9vakFfQCkXObJt1vbK3DbpkrUFCrx9h0X/q1NhcuXIE44fElvyK1FBoUkoSmw89UWRf4thAKG/7prI75yT/uCkuOL6wqxcyZTixCSP3LrtwHJWxzHwT/vF3IozPHSz0AiZGgs0yCYQhBm0OqByxeA1R1Ea6UWFqc/rhKjVIIbNnckjdzi8mMqyZKoeCgkwpi9bHomXeg06eH2h3jd7RMLGMI8RFV8wTA2V+mwLw1T0FRSYcI3y0IBw4MXm2AuVMLhDeL0mAP9FjeGbR6IhTS9IhsYY3jnzlq869kD2V4Kb1z+EEIJ/PxU6hUYn04u8Cji8X3r8GYmI+LchAtdZgOCoTB6Y5SyTDr9EAtZys2q00nIgPYqfdrKWVPlDoQRyLFglEQkwBdub036ZjVZpkIlvnhHG+yeAP66yvrIGBSSuIcwZMpfjo/hT0/sQKlWtqCUWhajZ+F8Ew4fylPsebZWCAQMeoU4oWz5Wb96x8V4908OoMtkwC3tFWlYHSEkGyjwQ3jBGMOHrmnAfd/p5vW4rZW6hHtiLMYY4A9GbhDinfoFJF/qNevMuBNtldq0Bn7UMjGsMVLUJ51+TDr9MCglvJ1PyIC6EhVvI+vTdeO2rkSd8CSk61rK8G83NC15nEbIZte1zWWoLjgVdz+LfJDIDXfPpAtFKikEApbwFCwBD+/bpjINVDIR9qX4ORyvjmo9xh2+ZbPsRuyRMfJ9Uy44c7ABuEoqRJUh8X5OmRZPyXMmfeKmDQumPGXaxbUF6O6xxD0pKx/UFiszUnaeCKcviHf/5AC+/1AXtIoLwR5vHJ+LnkDu/bznsmRLOh/+/l589tYWmFfIwiKE5Jfcy2sleWtHfRFu3cTvzoCDhwtTjUycVJo9HyGJQ4N2bChPX1nCco1OSzRSVOjkqCvm7xd3Y5kGJ0b4609yYnQa9cUq3qetJLpjLGDAO2P0lKCgT3YJBQxv227O9jJ4lchULyDS56wxwZI3sYBh0JpaQ2ajQY5TY5ESrFRKX+OllAhxdtyJnknXijd4x4anUVusgjjD2SErKdVIoVdKcHwkN3uqzOfNoZvot2034+5OY1bX8NA2Mz53W0tW18A3PoK/6XBwwIb7v7t7wWPxvB8z8Tm0mpRrk8uOGrZ5UF+ihigHyx8JIcmjn2jCqxvbynk93ulRR8r9HMRCBrk0sV2PumL+slrSpVwnw9h09B4/XWYDJhw+eANBdPfwt9vH9w5xIMThzLiT99T+RC92b2mvSPjGmmTO7ZuN0Cvyc5pTNHqFGKIE3vNqmQjnEyxdbK/SpzQJDAAKldKM3mi5/CGU6eIfQXxowA6DSoIqQ26UftQXq+ALhjFg4XcCWjq0VWoxkGJgkC+Vejk+cn1jTgTZr95Qiutby7K9DN4cG7JDGkcJVTYsLkGKZ1JoMIfLO3NRU5IbjxvKtTyvhBCSC3LztwHJWyd43uXkAMhTnP6kkoowneBYczmPTYfPT7jiql2PxxazAbVFSrRUaFChk2MiSnPnzdV67O+zIMxFRtK3V+mwrkSV8rk7qvVpaxLJR8+g+RLtCVVblPr3h6SPXCLEfVtN2V4GLyr1coQ5oM2oi/s1dcWqhPo0dJj06O5NvbdMrP5h6aKUCGFNcGLX2LQPNncAzRUaZDP5p92oQ5/FHbP0NpeUaaUpBwX5NNtUOZwD2RyMMajSOHGSb5ur9WitjH2T7vSH5hr15ppgeOHny1gcvcwy3f8p3126viip122rK+B5JYSQXECBH8KrXU0l4HvTzuZOrUdOiSb+HeRZx4aneattritWxlW7vpItZgP291txbsKFI0PTONBvRVOZBu1GHTYaddhcrUe7UYt9fRemgAzbvTjQb+Nll8zq9uNomkbCHh2eXpDR0WU2oDqVXfwE/3OP5ljzS7LUvVuqEsqSyUVCFsmaOzhgw4jNE/fEskTKmbpMeuzloaeHuVCZ8XKl5gptUgGJaW8QR4emsTGBYBqfIpO7bDk3uSuaLpMBNncwqYav6XJ+0oUrvvQSGj72Z1z6hX/geJZHj/M5BjvdXL4gDg/a0WU2wFyoxOJ+7utKVDgxyl95Np908oX9B0fjCPwUqfPn3yYX7KgrTCrwV1dMm2GErEYU+CG8UkpFvIzRnqWVi2KWM8Vr2O5BmTaxi4UwB0xMe2EuVKR07mK1FEeGlr+IrdTJ0RZlx04jF6HTFOl9s7lah909lgXNkINh4PCQHQcGbDg4YMO+PisODEQPYJyfdGFTlQ7mQiXWl6iSGqPOZ5PoxTz+EKoNkYuTdqMO3T0WDNq82FCeZKPPeRe/9SUqVOrlEDLEvAB64cQ4Jp2pvc9IehVrZLimuTTby0hJS6UOtpmMkGG7F95ACO1VOhj1ctQWKbE5Sq8rg0Ic941bQ6malyl5MpEgK2OTUw2cnBx1ZLQZqZBFMiFzdXLXrNmE09YKLbp7LTnZIPf8pAv+YBh9U278dE9/Vtfy/l3rsaupJKtriNdsdmt3jwU9ky6oZGJ0VOtRPlMyqeL5moxPuzZc+B5POX0rlkhWGRRpvQ5ZjURCAR69JHr/wuUkOkiAEJIfKPBDeOX283tBWVekht0TgFIiRGulNqk+HwMWD5TSxF/n9IcgFQkhlyQ3FQEAxh0+bK0xoMusx+ZqHTpNenSZDAtKEir0chwatM8FJZrKNKjUy1FbpMKeXivqilXw+FO/Cdvfb0PPpAunxpyoycXSppnviXBmyzIU5iATJ5dyPzrtRfHMziDHRXZF9UoJzk1EAmDtVboFz/eHwvhpd3ZvNsjK7ruoOttLSMniksbzky4c6Ldh1O7FuQkX9vVZ0WUyoMtkAACopUJo5OK4L8IdviAvPXlaKrUpN4ZO1KYqHQ4M2FI6htsfQjAczljJV3uVPucnd22q0oEDg1wixKmx3Mz8WKzKkNqGCx8evbSG9+zldNDJF17b2D0B7O2zYtjmRWOZmvdrMj7taroQyH/p9MSKz3/s0sQDGAQoVCceLKMm2oSsTvlTyEzyQqzrJIlQAP/MDrJOIcbD28wIcRz6LW5oZGL8fO9A1AsUkZChy2zAkNWDw4N2lKilKNPKMGL3okIvR7lWBo7DihffZ8edqNDJMGRbOZV4vpOjDmjkIpQXKXFuwpXQawGg06TH6+eX7gZXGRQo1UrhDYSxe2a3+NyEC2qpaK68YvbG6+x4Yk1d43F0eBpdJj3c/lBc5VsVOnnaR8Kem3BGbv7mZSwkmwFgd/uhkIhQqZNjyOaBZ957a3+/De1RSkL4nFZG0qPLbMD6EnXe3MAuFmu0bmDeRXZ3r2UuMFlfosb+ODN4GkrVOMlTSUc2muzyNT1mwOLBpipd3N+3ZBWrpSkHqtJlNlOUgc31evLkcABgsWRHUPNpc7UB1QYFeqfc2V7KspZriJzrv9N+sqcfLZWRKWr/PDO54vNrcrRXUa7TyBLf+CxPoMk+ISR/UOCH8KrKoMDmaj32zQvEvOOyWrxrZx1+d3AYp8cceMdltUv67myq1uNffnJgyfHCHLcg4DDm8IEhUrJzbsKFIasHCrEAhSrJsj0LapMM3ADAtCcIBoAxJJQybVBKYvYq6Le40W9ZekHJx/j6eHX3WuO+kHL60t+w1OENLrhZ08hEcPsT/34oxAJsKNdid48Faqko6g2PZFGzbZ1CjHfEGOdOcgdjDPdurca//fZotpeSlO4eC4wG+YolDSIBg1TEEpqip+Sx8fpIFhr/7uu18Baw2d9vQ5lWhkq9HB5/CDZPgPcMJlOBEuNRmutng4BFmoWLhQIEguG0B+nTbX+fFffmQHbfZeuL8cxrvdlexrLOT7pQqpHF1R8n1zy7ux+NZRrcd1F1XI2d5TkQEMxH5brE+iXKxUKa6kXIKkWlXoRXIqEAb99Rs+CxHfWFUEpFePOWKnz8pg1Rmy3f2Fq2ZJx2p0kfdceKAxYEcdyBMMRCho3G6L+oitXSub4aySrVyBKuk68pVMKV47us5ydcaK+KNIZebvBYNqatmAqVcPmCkCzuVrmCxnLNXBZVtEDahnlfFzCgRCPF9x/qQnMFXejkgze1V6RtulwmSOLIbFFKRVDLxDg9tnK2n6lAgS6THgNRAsmJKlZL0ZqlMd8hDph0+mDkaTS71e3Hnl4rjg5P894UPNK7LXcawneYDDjQb0N3jwVHh3NnXcmKp+wnE0q1uZv10FCqRpfZgJYKbV4GfWZ9/PfHok4njUbK47TVtaREI0toGtq2usKcyLojhPCPPkUJ7y5ZV4jmikgQZ0O5BpuqljYsXYwxhutbLtR7K8QC+ALhuHe8R+w+HB2yo9OkR3O5ZkFtvtGgwNSidGipiKFSJ0exWgqVVIiOav2yTUFVssRvNL3B3A76zDrQH2kMvWGZwIe5MPM9gU6POTA67UN1QWLp3SvtwitmejbpFGL88Ykd2P2vVyY0Wptkl0oqwm2bKrK9jLiUaaUQzwQut5gN2FytR98ypSMKsQANpWq8eGoirqlLhSoJ+ixudPdaYVBKUKRKfuKNUS+Hc2ZCULa4/SF0VBt4OZY3cKFMtHfKjY4ojbOTVa6T50yD5GqDAvvnZdgGeJjgmG2Le2Fly/UtZdlewhLNFRpUFyhwctSB7h5LTgUgk2EuVKJQJYkrMCHmqRx0rREKGEoTmG57RWNxGldDCMkm+hQlvFNIRPj949vxh3/Zjl+94+K4dw4urisEELmQ5cBwOMELmmAYczu8XSYD1FIRClUSKBadv0InR5VBiZFpL7RyMSp0Cuzts8a88JAIGUYS7A0ERL4P+WTA4kaXSQ/DogbahSoJBm2Z73Mwe+N2ZtwJ2XLpSIsIYnaaihid9sJcoMAzD3WhoTS+cdokt9y3NftlICtpq9RixO6DqUCJLlNk3Pe+PuvcFJ5oWip1CfXpqTIo5jIRT446kh5DLREyCAQs641gd9QX4aPXN+K2TZW8H7vf4ual6XNbpRYHc6i3T4FKsux7Kh+1x7FZlAmFKmnONXi2OP3LBo/zzRazAYwxCOL4RluX6WdEllcRZ7mXVCTAdTkY8CSE8IMCPyQtBAKGDeXahNJFN1bqsMVsgEEpSXk3dX+fFSVaGWxuP3omnRAKGMp1MnSZ9ZBLhDgz7kQozOHMuHOuUey5CSdaK7XYXK1DhV4OsZChqUyD5gotKvTyJZOglmNQSrC3N7dH/C5mcQXQ3WtFIMShdSb7RyQA9AoJLK709/iJpVgthTeBJs8r3fwOWDz46SNbsZGyfPJWXbEaW2sKsr2MZUlnPvvOjDvR3WtZsVG5WMASbuQuWBTJOD3mQEOpOqHsFpVUiKZybU7cTHaaDChQSfGlO9vw1XvaE9qlXsm4w4eNRl1KwZ9qgwKn09BsP1mZaGKdDbkyvU8uEaJmmUzgTOs06TFsz9+yrmgKZrIUpXFs7pyfTK5PI4m/WfN1LWXQyhNvBk0IyQ8U+CE5QyBg+OIdbZBLUn9bBsIczo47EQwDg7ZIZo/V5Ud3jxUFyuijLTkOODxox74+G4asHgRCHI6PTGN/vw17eq040G+bm5ayklKNDPm6CevwBeeynzYa9TiT5Rud2bHsi+kVYtQWKZdkKMWzc/jBXx3GuYncuYEjicvlrJ8yrRQnR1aeljffxirdkpLUlSz+pAyEOJwcdWBvnxWFKgnUUhFqi5ToMhtQX7KwXFMkiPQHKtPKcyKDpUQjxZvaL5Tw3dhWjlc/fDl+886LY34GJGp/vw0lGllSJXGlGil8wXBOTMdqKFWv2qDPnR2V2NmQO6Umb96SO58zdk/2NmDSoVIvx9t2mAFE+sqsJJ7JXyS6eJv/39lhTPNKCCHZRIEfklOMBgWubCzh/bgWlx+eQHKjwefzzmQiNZSqscVsiLmLopLmd2O80WkvNlfpsLcv+9NhTo050FSmXvK4qTAyqU0pFaHLbIBCLIC5UBnXdJCXT0/grm++DpubUsfz1VVNJSjiKSDAtyqDEtPexCbSeQOhuf5T8YhskMcOck46/XD4gjg34UJ3jwUjNi/ajTq0VGjRWqlFVYESvVPurAd2gUifj/958ybIF/33CwUM7VV6fOv+DugU/OxCj9i9qNQn1kC6oVQNTyCcE010N1VFygFXY9Dn5o3l+Pc3tWR7GQvc02XMajN5tVSILrMBlXp5XM3e88ljl9bOjRq/bXPlio3v9+fA9Ui+iqeHUke1HlvM/PRYI4TkpvxqQkJWtVCYw/OHh/H84ZG0naO9SpfUiPBZI3YvWiu16Jlw4eSoA2IhwxazAceG7CjRyuDwBiEVC3IiYJIKpzeId91Sh//++9mo2QAbyjW4vKEYP97dD0ua6+4DIQ4ysRBbzAYcH7bD4Quhy2xA98xkrgGrZ24KUU8CqeCTTj/+eWYSN7aVp2XdJL3EQgHu7jTiq38/m+2lLNBcrsG+JH7+jwxNo9Okj3sU9+Zqw9x0ung4fUEcyIHMnsV21Bfi2w90QCqKHfRqM+qw5yNXYsLhg8sXxIjdiy/95RQOJdmIenGJXCxKiRAbKrTY12dFKAdSOLeYE/s3zyc76gvx5Ts3JjR9KBMUEhE2VevxcgYnjZkLlVBKhZCJhdjXZ537XbeatFfpcPvmC728Ru0ecFj+ZyyeTR0S3UqZ0BKRAJ+7vTXuz0ZCSH6ijB+SMziOwyefO57WnUyOi9xgJWvS6cfhQfvcmPBAiMPuHgtcgRDOTbhQZVCgplCZt2Ves564sh47G0vwm3dejI/d0LTga1c1leB3j2/D+3etx/t3rcvIejhEgm71JWrUFilxZiz+BrjL+cRzx/G1F89i2ru6UujXiru7qnhp2MunMMcl3WzX6l76PhQJgJYKDTZX6VA506Cz2iDP++DyrAe2mpYN+swSCwUo18lRX6LGJeuK8Ot3bsMnbtoAdRLZGPG8Z7aYDQhzQHePJeNBHwag3aid+/eetVp7nMjFQnz2ttacC/rM4jI8ZUwlFeHo0DT29lqRIwPOeKWWifDt+zsW9ICsK1bjQ9c0LPu6YJhLaeNuLVvpZ+tD1zSgtijz01sJIZlFgR+SM0RCQdqzL0RpurCcvTjb22fFS6cn0ZXH6bJbzAY8tC1Sd88YwwMXm+YaL17ZWIyv3tMO0UxK9m2bKmP2TOLTgX4b+i1u7O+34dyEK+oNcjImnT58/s+nsP2zf8czr/bwckySORU6OXauz51+IG2VWhwfSS4o2VqhXdLceVttAdQyMY4MTeP0uBODNg/MhQpMOv05kYHCh444+6YtJhREPpv+/oHLcOumipVfME9vHI2sx6a9WRnZHmm2rcGBATsGbR50mvQo00qxxWzAhMOX8fVkwvb6wrinDmXDvRluNp1IyWc+2lytn2vqPN+DF5tQX7x88OGbL51P17JWtViBH6GA4b/v3oiHt5szvCJCSDZQqRfJKWpZet+Smcrs6O6xoLVSi8NJliJki1jIluy8CgUM332wEzKxAG2VurmgDwDIxEL89vFtEAgYTgxPY8jmQZtRh93np/DZP5/Mm93KaW8Qn/7DCbxydhJXNpbgjg5jzu4+k4Xu7DTihZPjWTs/A7CpWg9/MJx06REAHB6yLyhhBCK9tqoNSljdNjhmegb1TGZ/+hYfFBIhvvdgJ3SK1ALHRWopvnznRmytKYA3EML+fhv+eGQEvmWmqE04fOgyGeZKS6KV1wVC6fvwaq/SQSxg8AbDEAsE2NcfOX9tkRK+YBjHhi9kpc6ubcS+OoM+ALA9jsa+2XRxbWYnCK72DNR2Y/Rgr0gowGOX1uL9vzgU87U/eqMP770qM5nGq0msqWkPXmzCzRsTC5wTQvIXBX5ITinnaddPImTYWBW5uAiFOOwfsKK1Qoshm4eX48dj0pl/F+r3XWSCOcr42uUmbhgNCgBYsGO70aiD3RPA1148x/8i0yQY5vC3E+P424lx9FncK6adk9xw2foiaGSihJsp86HLbMCpUUdSPX2i6e6xoKVCgyND0zAXKtA35YIii41l0+na5jJsqeHvhvqOmWk0920FPnJ9I7718nk881pvzABQd++FAFt9iQpnFjXO1SvFaft9MWzzYGz6wu+HTpMeLl8w6WyxfCYVCXB9a1m2l7EstUyM6gIF+uLIFEtVsVoKqXB1Z/zsbCiK+bWrm0vxoV8djlkuO+Xyg+M4sDimd5ILSrVLB5HIxcKMZ7MRQrKLSr1ITllXsnR6U6JaKjQQCBi6eyzo7rFgX3+kTv7Y8DTqilXQ8zQdZiWTeZaW31yhwTt31vJ2vEcuqcnqNJRUfP3FcxinRpJ5QSoS4rqW6DeORoMcVzXxPyWwRC1Fe5UO3T0W3kcsHxmKfE65fCEEw4CIrc5f09c0l6bt2IUqKZ66rhG3xLmTPbsbXqaVosukR6dJjyFreoI+TWXqBUEfIJLVsxaDPgBwV6cRhVHKfnJNusrEF9PIxTg4aMvIubJhQ7kGrZW6mF9XSUVor4r9dQCw8VTqvZZ0mQwQCxe+hz9yfWPUjT5CyOq1Oq8oSd4yGuR49u1b8L6r1kEmFqBcK0NDafzBIJ1CDLsnCG+U0e3BMIc3zlugkPAfjDAVKBb8vb5YhfWlaqxfZu2MRXb3MnVBGYtYyPDJmzfg949v5/UCXKeQ4D/v2sjbGOZMm23gTXJftFT19SVqfP0tm/Gt+ztw66YKyMX87KJX6uUYc/hwII1N6M+OOzE+Ezj2BIIoVKW/j1amZSIA7w/FLvdagANqCpXwBzl091qxp9fKWx+xxUQCQc41JM+mOzYbs72EuOyoj52lwpcN5Zolfb5Wm2s2rBzw3Vy9fI/E3x0c4ms5a0Z9iRoPXmya+/sVDcV4y5aq7C2IEJIVFPghOaVYLcPFtYX4lyvqsfupK/Hqhy/H/7x5U9TnbjEbUFd0Ybeio1oPuyeAfsvy6dgV+qUpr6nYUK5B75QbGyt12GI2oK1Si0GrG0eGpnFu3IFN83avpCIBjHo5hAKG+mIVxh0+BMMcDAox2iq16DTpMxoIKlRJ8cU72nD/VlNaxnhe1VSCF953KdaV5Ne0iJoiJWpoJyxvbDEbUKJZGLT8txua0FyhBQB8+c6NuKcr9YvcumIltPLMBjI9gTBqVtm0FcYAUwZ+vuKtBuEA9E65MOXyp3U9QKSX03IZD2tNY1nqWb6ZkMgGVDIqdPIFvZ1WK20cAd9Y/Whm9a1wjUei6zRFAmo1RUr8590bqVyOkDUoP+swyJowe4FQW6TEXR1G/Pbg0Fy/Br1CjOPD03D4gpCLhSjRSOMeb2xzB1BlUKBUI8PePkvKo9dnMwmipWcHw8DBARuaKzQIBDnIJUIcHLBBJRXi9LyeEhZ3ABZ3pDFsh0mPvVGajfKJMeB7D3bikvqitAR85itQRZqv3vQ/ryT9vdYpxLiprRyBEIdf7B2Yq/+/trkUD283o2/KDZlYiK+8cAaneBj13lSmoYuiPCIQMFzbXIZnXuude8yxqEHqqbHUb6qETIARe+ZLAEPxZq7kibZKXUbKezYadfj1/pWzAzJ5w91Rrcep0bVZ1rVYl9mwYFhALutM86TOCr08oz0Is0UZR8b1Sr96Byyr//uUDiUaGTQyEb59fwc0svzMxCaEpIYCPyTnMcbwudtbcWzEjlMjDgTCHEo0MpycuXj2BEJxjeeddXrMCaVEiH6LG2VaWUo3coun8EQT5oCjQwtvLJy+2GOCeyddSa8nXo2lGlyWwTHYzRVa3N1VhWd39+OeripsMRvw1K+PrDgu+X1XrcPmaj0ayzQwzIyNry5Q4LN/Ogkg0keovUqPjpmdrC6zAbf876spX0Cne3eX8O/61oWBn8U3D4EQh211BXj17FRcx/vArnUwGhT4/mu92D9T1nVqzAG5WIBNVTqMO3wYTFMfmMX29duw0ajDwQFbRs6XbkppZprX5lr/Co1cFPcGxVqQTw30a4tU2FFfiH+emeT92LP9wtaCxjLNis9ZqYfPAGX8JMVUoMQPHt6y6jJICSHxy4+tFkIQ2SkyFSpRqJLMBX2S5fKH0F6lg9u/fOBhOV2mlYM+yZh0+rGhfOWLo1TsqM/8+Nwnr14PpUQIjuNwS3sFfvBw17J9Vx69pAbvvrwO2+oK54I+s4//63UN+NxtLWivWjgWtkgtxYevTf1mYnsG+jkQfm2u0qNEI0V9sQq/esdW7Gpa2Evi549uxY/fdhGqDIoYRwAkQgHesqUKH72+Ee+6vB43b6zAr95xMT52Q9NcIMkTCGN/vw1lUaakpNOZMceCyXn57PVzUzg7nv6sF32Ko+L5Vq5dHf9+fNhiNmBzdfSx3rnqg1evT8tx3ctsBK0mFTp5XKV9b5xfPjg/YHWD41JM1V6lvvyXU/j7ybEFj4XDHDiOg1YhxkajLjsLI4TkBAr8kLyxoVyLM+NOTDr56cMgAEt6Is+mKh2ODNl4WUc0Ckn6dsRripR4eIc5bcePRaeQ4I4OI147F7mo6zQZ8P9ubIr63MYyDT58bUPUcivGGB65pBZ3dUbv2XJ9SxlaK7Ux13HJuiK8/6p1Mb9+T5cRbcu8nuSm2XKvL9+5EZurDTFLGGuKYmeB3LyxHJ95UwvetqNm7jHGGN663YzP3da64LmHB21x95Dhg8sf4qUh8ra6Ajx6aeS/T8AAmTjzlwFhDvi/Y2MrPzFFImFulWvK0/i5nm82lOffZ2xrpS6u5sSJiqfvzWpwVVPJiiXUbn8Qp1co13b7Q7BkoB9XPrqsoXhBwNvlC+Lup9/Ar+IoeSWErH4U+CF5Y9cGfscyW9z+pG96REIBPFEmh/FBImTomyldMxrkqC1SorogdpZCIsyFSvz07RehWJ3ZbIVZ2+sKMe64UFp3V6cRN7aVL3neLRvLk+6xIxAwfPT6ppg35Xd3GvHYZbVLRsbqFGJ8+pZmfPqWFurvk6fev2sd1pUun8b+pvYKfPzGJvzpiR343G0taDPq8MglNXj00hp8/KYNMV93Z4dxQaZcpV6BTG86Hx2eRn1xamn61zSX4X1XrcPlDcV49NJafP+hLp5Wl5hM9DNpKNVgS5p7s8SrqUyT1klw+Wa54Hwue2ibidfjiQTA8TXQ1BmI9GtcSc+kK65egAMZKrPNN5uq9Giv0oPjODz16yP4/mu96O61oGAVToYkhCSOevyQvOH28zteu2fShTajFkNWT8JZRPv7rDAoJWnZddIpJHOjnIvVUuzrs6FcdyFQ01CqxrDdgzKNPKFGxoUqKb73YCeKNdkJ+gBAqVYGfzAMjuPAGANjDF++sw0KsRA/2zsAIBL0eXh7ahlJXWYD/vTEDvzf0TG8cnYCR4em4QmEIBEJsKO+EGKhAD9/dCtePTuJQasH9cUqtFbqaEc+z6njaFg5f/R7Y5kmZuZYNHdsNsIXCMMXDGWlyTMASJMIVn/1nnZc2VgCfygMjUwExhj+583tYGBgDCjRSDE27UvDamN79ewkwmEu7c3lBTkSxD0+Mo1Okx77+qwpDxTIdy0VWlzfWpbtZSSl02SAWiaCw8vP9YhaJkZ9iRouX3DVT/UyKFdu6D4a5+dqv8VNZUvLePXsFH7S3Y+fP3oR7uowYkdd5sv7CSG5hwI/JG+ko5HqoQE7tpgNmHQm1qsnGOagU4jTEvgZd/jQWqHFhNOLUXvkZmzU7gVjkQaTcokQ054gagvjD1J89tYWXNlUkpFJOsupKVJiU5V+QUaNWCjA525vxa2bKmB1B3D1hpXTwePRUKpBQ6kGT1xZj0GrG9s/9w/c1FY+FxwQCwUZbXBN8t+NbWX4zivncWjQnrU1HB2aRpdZj+6e+JoE/8vldXNZdXJc+MxQzJuu8/y7dyAU5mDz+HF0aBqDVjcmHD74gmG8fm4qLdk5fVNufP7/TuGJK+rTGnBNZ9lsovb0WlGhk2HK5Yc3TRmj+eDxnXUQ58k0r8UEAoZitZS3wI/VHUB3jwVG/erv/zS/V18s/mB8PxfU4Hl5/zwzASCSmfq521tXeDYhZK2gwA/JG5euK4KAgffd0nCS9RpFKinOT6RnAtfhoYU3lmEOEAsZzo07MbvaU6PT6DIZwIHDnhXGv49N+7Ie9AEiN5u/eGxr1K9tqSlI23mVEhG+/pZN2JWG/gxk7WCM4frWsqwGfgCgu8eKhlL1sk3uBQy4fXMl3rdr5Ya0RerIZ0OpVoaG0oWN5X97YAjv+dnBlNYbyzdeOocKnQz3bTWl5fgA8K37O/CZP57Ad17pSek4qU6AnDVk86K1UovDWX4PZVOHKb+aOs/n8YfmSrH5VKKVrfryJQ4rX2vFk7UJAH1T6Z9+mq84jsNLpydQqJJmfAgBISS3UeCH5I3qAiXetbMOP9rdjyevXo9TYw58/7XeqIEgc6ES9cUq/OX4yg1Ez447k1qP08dv6dlKAqGF/6HuQBjdvRZIRQxSkQDrS9XwB8NRbwYtrsyWcSwnG/1z9EoJrm3Jz9ICkluqC7I7IlzIgFajLuaOt1jI8MGr1+NN7ZVzAZ1U1KZ59K9Gnt7GtgJB5PtxZNCO7t7EpzAWqaX41M3NuKa5FEeH7Hj+8AiODduTGuvdUKqGRibGgYG1O9J9R31hTmxCJEsiEqBILeW91FPI2IrB3Hw3Hccwjbo4e5idSfK6bbXzBUP47YEhnBx14J6uKupXSAhZgAI/JK88vKMGt7RXoGbmZoSB4buvXtjJvWx9EXY1leLGtjKIhQJc+9//RM/k8jtD9SWquMsm5suVEgJfkMP6EiV+9HBXJCPhK6+gf9FNYbb6kRCy2rRUZK8pbX2xCjZPIGaTYLVUhC/e2YarecxsqzLw01g+ltIM9ByTiYV49u1b8O1XevC9V3tW7GdUW6TEbZsrcW1zGcyFFwJ9zRVaNM/8+//+0DC++sIZ6BRilGhkODRow4AldsZGe5UO5ydcq/rGPh6vnZvC84eHcUPr0qb++UAoYLxlf823u8cCrVyELWYDdvckHqDMBzb3yoGfEo00rh5KZ8acc70CScSZMQdu+d9X4fKHAEQmlBJCyHxxBX4YY70AHABCAIIcx3UwxgwAfgbABKAXwJ0cx63dbSySEVq5GNp5O8RPXrMej1xSg6d+fRg3tpXj1k2VC54f+dqRZY/JkNyFw6Qzd7Jo7uqsgkYeqZ//7K0tePO3dy/4+onR1d00kpBMKdPKcFeHEc8dHoZ75gI7U9QyUcydbsaAT7+pmdegDwBo5CIIBQyhNHQklggF2JChQJpIKMBjl9bi0UtqsKfXiruffj1qtuiX72xb8nskmpvaynHTvImETl8QD32vO2rZbaVennMTvYrVUrzr8jqcGHFgyunD3j5rRkZkh8Ic9vRY8jbwAwBfvnMj3vytNzDMc/DH7gni7LgTMrFgVfaAsseR8cMYQ5Fq5R5KTl8Q5yZccWcIrXbHhu246X9enfucvrKxBK2VuuwuihCScxLprreT47iNHMd1zPz9wwBe4DiuHsALM38nJKNkYiFKtTJ86/6OqBfr2+sKsdLQmGRuaFortFBKcidhbv6494vrCheMnQaAAYsnpwJVhOQrxhg+d3sr9n70yozvqPZOupaMcxcKGN55WS2OfeLqBRPL+MIYw30XVfN+XADYVlcAlTSzn6OMMXSZDfjx2y7ClY0lqC5Q4J4uIzZX6/HUtQ1xBX2iUUlF+NpbNkMiWnhZJRMJoImzb0mmVBkUeP5ftuP+rSb8x60tePr+DvzpiR3ozFDvHZ0iv0dLmwqVuH1zcu+TlUy5/Gguz89R9yuxxRH4ARB34+8XT42nspxVpbFUg1CYQ6FKgk/evAFfoIbOhJAoUhmrcDOA78/8+fsAbkl5NYQkSRTjQsFoUOCeruXHNR8atKE4wV4Y7kAIIY6DMM2jiJP15NUNSx7rXqXp44Rkg0IiwmduacEHdq2DTpGZG3uLOwDtvHPdvrkSv33nNjx5TcOCKV18+8j1jWgq06z8xARd05y9Zutbawvw7Qc68NIHd+I/bm3Fr95xMR69tDalYxappbirY2EwsFAlxfGR3Mm4bKnQ4pmHOlGsXlhiV6KR4Qdv3ZKRZrCXrMv/0dKvnZtK27EXl2qvFn87PgZfcOUsyXgHbrx0eiLVJa0ajAEamQifuKkZ9281QR/HBDVCyNoTb+CHA/AXxtg+xtgjM4+VcBw3MvPnUQAlvK+OEB587MYmtFfpAAA/eftFC7JjgEjT5ET6TBSqJHD5gjgx4sDmquxPJ5GKBNiwaIewpVK7JOtnOA0jmQlZywQChnddXo+rmzIXwJh/T/TUtQ1oqUx/doBYKMDnb2/FX997Cb7zQAcWt9XYXleIEo0UJZr4A+jXt5Th9s2rrwfFR29oxLXNpSjTylCglCDJSuK0eO+V6/Dbx7fN9chbTC4R4gu3ty3592Us8u+ValmNQSnBx29swuZqQ0rHyQXnJtLTXLi2SIlxx+rMztXIxZDEkc0Tb+Bn93kL3P7MDtnIVYwx/PPJy3FdC00uJYTEFu8W4XaO44YYY8UA/soYOzn/ixzHcYyxqJ/UM4GiRwCgqmr5zAtC0kEqEuLp+zrw3y+cxkU1Bvzu8W040G/Dx587NjeW1eqOv7dBtUGBfTP9GgZtbrQbdTgwYEvDyuPzlXvaURpll/a9V63DK2cnwXGRBqp89/4ghEQ4M3jz0TPhwtu2m3HTxnIUZHA60mxT4/oSNb50RxucviBeOzuFK5tKcFNbObzBEMQCAT7wy0M40GfFpMsPpUQI66KGrlc2lmBXUwlu3VSRsxmTqZCKhPj6vZvn/j427cVvDwzhP/50cplXpd/7r1qHd19Rv+LzttcX4hM3bcAnnzuOYJhDTZES/31XO1oqtQiFOTy7uw+f+sMJ+IPx96C5vrUMH76mARU6OQSr5N/cl8B/fyLOTbiwuUo3d42xmjy+szauZsxxxn3gD4Xx+rkpXNFI+84AFmSDEkJINHEFfjiOG5r5/3HG2G8AdAEYY4yVcRw3whgrAxC12JbjuKcBPA0AHR0d/HeHJCQORWopPn1LC4BIf4GdDcWoK1bhkR/ug0wswIgt/iaNg/MyZ4ZtXgzbvFmbxPHgxaaYAZ1NVXr82/VNODvhxJNXr8/7vgqE5KprNpTiD4dHVn4iDyxuP/71usas3kDP9sG5f6tp7rHZ3jb/++ZN4DgOVncAeoUYBwZsuPMbryMY5qCUCPGlO9rW1A1KiUaGDlN2M1wevNiEd11eF/fz799qwh2bjRiyeVChk0M+M8FSKGC4b6sJgRCHTz5/PK5jvefKejxxRf2qm75UrpPjbJpGisfbCyffmAvjyxiLN+MHiJSwU+CHEELis2LOJWNMyRhTz/4ZwC4ARwH8HsADM097AMDv0rVIQtLBaFDgT0/swG/euQ33XhRfNlq5ToaJKGnY3T0WNJap+V7iiu7oWL7B5Fu3m/Hvb2qhoA8haXRdSxkqdPJln6OSinDJuiJezpfrpSCMMRiUEjDGsKlKj/detQ4iAcNX7mlfU0GfXNBWqcXHbmhKOPAilwhRV6yaC/rM9+DFJrxtu3nFY9x3UTXec+W6VRf0AYD3XbUubceO9j1fDY4O2eN6XiLzNnKpfxYhhOS6eHr8lAB4hTF2CEA3gD9wHPdnAJ8FcBVj7AyAK2f+TkheenxnHf755M5lG5jWFimhlIiiXpRwyHwrhxKNNC0NVwkhiREKGO7uXL5fzf+7sQk3tJSlfK57uqoy1kyaL++8rBYnPnXNmt2Zl4lTmaORmutby3jPDhMIGD56QxO+ck879DHei9vqCvCxG5t4PW8uua6lDBfXFqTl2HLx6gz8RNs0iyaRjJ9jw9PgEng+IYSsZSuWenEcdx5AW5THpwBckY5FEZJpjDEYDQr8+G1bcOc3X4fVHUC5Tga5WIhQmMOYw4tzE65ljyERZfZirbFMsyp3UgnJRzdtLIfDF8SQ1YNXz03CNq+3zWOX1uL2zZXY/rl/JH38y9YX4ZL6Irw1jkyLXMMYg1i4dj+rmso02Lm+CP84ldkpRAVKCa5MY7DtprZybKstwG8ODOHAgG2u3LGmUImvvXlz3GO589Xnb2/Fe356EHv7rAAAtUyExlINhmweDKUwTCEYSk//oGwLxZnKk0gcx+Lyo9/iRnWBMslV5bevv3gO77gstWmEhJC1I33zXwnJQ3qlBM+9ezsA4BPPHcNPugfifm2mG5XWxZjMQgjJvOoCJf71ukYAkRucY8N2vPsnB1BXpMKHrlkPxhg+efMGvP0HexMqZWiu0ODkiANPXFGP9hyYIkgSxxjDF+9ow7uePYDXz6dvDLiAAbuaSudGZn/2tlaUJDCxMhkFKinetqMGAHD7pnF877VefPzGpjVR0lepV+Dnj27FoNUDXzCEmiIVhAKGPx8dxWM/2pf0cadcq7PHT7QhFNFMexP779/Ta12TgZ9pbwBHhmzZXgYhJI9Q4IeQRWQzadaD1sR27CyuzPbdKFuhpwghJDuEAobWSh1e+uDOBY9f0ViCG9vK8buDwzFfe/PGctzZYYROIcYrZyaxra4QWrkYRoMi3csmaVSgkuJrb9mEa//7nxidjn+YQDwELDJ17VM3N6PNqOP12InY2VCMnQ3FWTt/NggEDFUFC382N1Xp8OYtVfhJd39C2SuzFm8hdVTrYfME0tZMOlNq49issnsCcHgTm5J4ZsyR7JLy2h8Oj2CLOT3lhoSQ1YkCP4TEcFVTCf55ZjLby4hptfYBIGQ1u/ei6mUDP/96XeNclsaGcm2mlkUyQK+U4Gv3bsL93+mG05fYze18MrEApgIlrm8pw7b6QjSWalZtQ+B8VKyR4d/f1IL6YhX6LW7UF6vx8d8fgz/OEi6tQgzMDAktVkuxt88KAYtkzIza+Q0aZpK5cOWsnJ7J5Uvqo+mbcieznLz3p6OjaM9ioJcQkn8o8ENIDBpZYqnq0gz3+PnlvgHctrki4+clhCSvo1qPS9cV4aXT0fu9JPq5Q/LLpio9XnvqckiEAkhFAnAc4PQH8cfDI/jKC2cwvMKNvdEgx9ffshnNFRQUzHUPbbvQj8vuCeDLfz2FQGjlFCCpSIDWSi1EAga3P4Rxhw9hDqg2KFBtUMDhDebdNKvWSm1cwcm+qdiBH41MhBvaylFXpEKZVoZDg3Y881oPzk3kdyZUshrL1LhkXWG2l0EIySMU+CEkhtfOJZbt4/GH0rSS6Pb32/C/fz+L9+1an9HzEkKSxxjDtx/owPdf68Wn/3Biwdc+cl0jZW6sAfODe4xF/n53VxXu6jTi+Mg0Xjw1gT8fHUUgFMaVjSX43qs9cPlDuLKxGF+6Y+Oa6J+z2rzjslowBnz2TydjPqeuWAWb249gmMPRIfuSXmC7eyJpQIUqCTqq9RiyeTCSJxlAXSZDXM8bn45eMq9TiPGbd25bkDV0bUsZrmoqwV3ffB2TTh8KVVJe1povnrq2MdtLIITkGQr8EBLF0SE7frlvMKHXqGQibKrSYX+/LT2LiuL02Nrc6SIkn4mFArx1mxlPv3werZU6PHBxNYx6BaoLqI/PWsYYw4ZyLTaUa/H4zjqEwhyEAoZdG0ow4fBh5/pi3kezk8x56zYzfvRGX8z+gRqZCGfHnZh0+pc9zqTTj0mnH8VqKRhLbApWtqwvVcf1vAln9MDPPV1VUUvFNlfrcUdHJf5xchx3dBhTWiMhhKx2q3vWJiFJ2H1+Cu/52cGEJu8AwLHhaezvt2GjMXMp+Jc3rq1GmoSsFgIBwy8e24pv3LsJO+qLYCpUgjG6qScXzE6KbK3U4YrGEgr65DmJSIAnrqiP+jWlRIgjQ/aEjjfu8KEszVPb+FIR5zCKQWv0fj1d5tgZQ++9ah3+cWocXD5EwAghJIso8EPIIk/95khK0zMODtiXvUjhy7a6Aty+qTLt5yGEpEd1gRIiIf0aJmSteFN7BZorNAsea67QoLFME1f/n8UK1flR3rSvzxrX844PR+9dZFpmXHuxWoZbNlbgh2/0JbU2QghZK+iKk5BFPn1zM4yG1Eal9yYxmWI5EiGDQrzwx/VdO+tpB5gQQgjJEyKhAN97sAvXt5ShQidHR7UeJ0cc2BtnYGSxfJnu2VSuWfE54w4veqNM6JKJBajUL39NtmtDKQ702zA2nR89j5L1i70D2V4CISSPUeCHkEX0SgnecWldSscYd/hQzNNOHANQrpPDGwyjo1oPAKgvVuGimvRnFRFCCCGEP0VqKf73LZvw6ocvR1O5BsFE68rnGbV7sLlaD608dxt+F6uluHRd0YrP29MTPfjVVqmDOI7MyIe3m/HG+amE15cvhm0e6BWSbC+DEJLHqLkzIYu892cHcXLUkdIxyrQyjDuiNylM1OZq/dxu4N4+K7pMetQWq6gfCCGEEJLHlNLULsP7LB70WSLNojtNeuzpjVwrbDTqMGzz8HYdkooOkz6uktbTY9GvuzbPbHitpLFMgx6es61zSSjM4Qrq60gISQFl/BAyj90TSDnoMyuUwi7erGK1dMmFTHevFZurKNuHEEIIyWdHBhNr6Lycc+NObKrSYYvZgIMDNpRopJBLhBALs7tJVBJnA+pYk7/iDfwIBQydcY6Nz0dGg4I2/AghKaHADyHzCBhw/9bqlI9TmuKkDXOhEl0mPTgAU66lo13L9fkxyYMQQggh0cU75jweFncA+/tt2N1jAQAcGZqGXiGGuVCJLRkYOBFLvNdDO9cXQylZ2rNoU1V8gR8AKNXStREhhMRCgR9C5lHLxPjETRugSiL9WiYSoMtsQEuFFgcGbKmtQypCd68VEzHStEftq7uBISGEELLa3dlhRDpnNAzbvDg95kQ4i6PO60tUcT1PLhFi14bSBY/VFimhV1JfG0II4QMFfghZhDGG2qLYo0Njaa3UobvHgiNDyaduS0UMG41aHBuJPtJ01mvnpsBl8UKOEEIIIalZX6rGHZuNaTn2hnI1Oqr1aCpT42CKm1HzlWtlaC7XwFSgWPG5OoUYW8wFcR/7svULm0DHW+ZFCCFkZRT4ISSK0SRGgvJRel1XrMLBAfuK/YF+uW8Qn3r+BLyBUOonJYQQQkhW7FhXyNuxjAY5PndbCw59bBf+5Yp1OD3mwPERBwIhfjaK1FIRSjQyHB2ehiGOTJz3XbUuoQbW2+sWfi8o8EMIIfyhwA8hUTx2aW3CrwmEwgm/xlyohFp24aLI7gmisSy+mv/vvtqD+76zO+FzEkIIISQ3WKP08UsUY8AHr16Pv7//MtzVWQWtQoyrN5Tiw9c2pnxsuViIYrUUhSoJpGLBXCn7SpO6rm0uxX0XJdYzsUAlXdATiAI/hBDCHwr8EBLFy6cnEn5NMjtqxWopFPOaGZZrZbA4/ZCJ4/vR3NNrxVgS2UmEEEIIyb5Xz06lfIz3XLEOj++sg3hRMKZUK03puCqpCHKxEOMOHyadfkw6LwSpzo470RWjaXSxWoov3NGW1BSq2Z4+aqkINYXx9QcihBCyssQ72BKyynkDoaQuxJy+YMKvcfmC8AfDaDNqIWIM+/ttqCpQoKZIhbPjTkw4ozd3nm/Q6o57XCohhBBCcseQzZPwayRCAZ64sh6FKgnEQgFu3lgR9Xl/Pjqa0tqayjTo7rVE/ZrF5Qdi9Bp8+46apIZkAEDBTOCnuUILQTo7XxNCyBpDgR9CFtnXZ4U/ibItnUKMjUYdxEKGPb3WuF5zdHganSb9guefn3Dh/IQLDaVqmAuVMS+6Zikk9GNMCCGE5KOGUnXCQyH+/dYW3L65csXnxXstEsuYY/mM4pEoE0YbyzR4cJsp6XMqpZEs6DIdbWgRQgifqNSLkEV6Jl1Jve5Avw0HB2zY02tFl3nlunSdQgwgkvUTzclRB86MO1Y8zuLUbkIIIYTkhw9cvR6SOH+Pl2tlePbtW+IK+gCp98jpm3KjrVILUYzlySTCBePoVVIRvnpPe0rXJbPBJJ2cxrgTQgif6I6RrFkuXxBfeeEMfvhGH/52fAx/PzmG3x0cwgsnxlI+9v4+K4rVsWvrxQIGjz+ESr0cp8acMZ9n8wRgUCx/8fPiqfGk10kIIYSQ7CnRyHDpojHmsbzlompcXBv/FLCd64uTXdacQ4N2aGMEYc6MOdFQqpn7+6OX1KCuOPm+POMOL44NTwMAJLGiTYQQQpJCNSJkzfr1gSF8+a+n03LsYBgwGhQYdyzt0VOkks6VcA1al6/t5zigrkSF7p7Y5V7ffaUHFTo5vvbiOVQXKNBYpkFjmRpbawohn9c4mhBCCCG5p65Yhb8eX37TSSRguKa5NKHjXrq+CGIhS3mce5VBjqko08dK1FKcGotkJgsYcEeHMaXz/PX4GELhyFq9gVBKx8pXx4btEDCGxjLNyk8mhJAEUOCHrEk2tx9Pv3wurecIR2l6KBcLwBhW7Nsz34jNAyEDYl23Ddu9eMeP9wMAjgzZ8fzhEQDAw9vN+LcbmhJfOCGEEEIy5rZNFSjVyLCjvhBhDvjWy+fBgUNDqQZtRh2qDAowBhSqEpvSJRcLoZKKYHUHUlrf0eFpNJVpoJAKsXemb5C5UIlBq3suUHPZ+mKUalPry/PauQuDNfot7pSOla8KVdK5BteEEMInCvyQNSUYCuMrfz+LX+4dwHCUpoR8Ojpkh0oqWjDta32JBgcHbQkdZ8DqwRazAbvnZf20G3U4OGDDcnt4P9szgCeurIdGJk5w5YQQQgjJlLpiNeqK1XN//9ztrbwcd2+vJeWgDwAEQhyOj0yjbF5gp3fSBb1SEpnuBeBN7dEniyXiYL9t7s9vnJ+CLxiCVLS2MpdpSishJF2ogJasKS+cHMdXXjiT9qAPELlQqi1WYovZMPeYZ17qcpfZgI1GXVzHOjxon+sZ1FSmwZTLD7V8+bit0xfED1/vS3zhhBBCCMlrHMfhf1/kN7PZ7rkQROKAuWwfiVCAy+LsUxTv8d3+EF45M5nyMQkhhERQ4IesKUMr9NTh26EBO3b3WLC5WodKvRwOXwA1hUoAQCiBmntPIIQwx2GL2QBfMASnN4BpT/RpYPN9+5/nY04NI4QQQsjqM2Tz4LN/OomXT0/wetzmcu2Cv68vVWOL2YDL1hdBzUN28ewo91nf+ud5hMOp9ScihBASQYEfsqZkq2Z8X58Ng1YPhm1eFKql2Fylx+EES74mnX7s7rFAKGCwxJm6bXUH8KM3KOuHEEIIWQtCYQ5v//5efPPl87wet8tsWNKfsLvHgt09Fty8sZyXc6ikCzOZ3zhvwX/86QQvxyaEkLWOAj9kTREJ2NyfZ0eFdpr0kIkz96PgC4TgDQYRCHNgKz99idNjThgSaPz3nVd6EAyFkzgTIYQQQvLJ6+emcHxkOqVjKCRCbCiPTJXSysVYt8x00a01BbiupSyl882q0CuWPPbj3f1rdsIXIYTwiQI/ZE1x+YMQMOBjNzShSCXFFrMBv3jsYlzfws9uVTwODdpxbDgy/jSpyA+A2iJl3M8dd/jwxvn4p4gRQgghJD+pZdH7/2nl8ZdiNZdrcWx4Gh3VelQZ5Dg95oz6PLGQ4VO3bABjSV7MLGLUy5c85vaHsCeBSaiEEEKio6leZE2RioT41TsuhlwiRIdJjw0z9erb6grwq/2DGV9PspdKLl9iu19/ODKM7fWFSZ6NEEIIIflAOa9cSiUVobFMjXAYOD3uQJVBEVfJe2AmS3hvn3XZ5z28vWbBNLJUqWIErU6MTGNHferNo3NN76QLgVAY9SX8fQ8JISQWyvgha8rHb9qA9io9Gko1aK3URfrluPw4PGjPynrEwuR+BE+OTs9N+YrHHw6PUKo0IYQQssr9ct+FTayGUjX29Fqxr98KhzeIYDgMpWTl8eieOK4XtHIx/uWKupTWuthYjImrJ0ccvJ4nF4TDHH74Rh9qi1TZXgohZI2gwA9Z0147O4ld//kynnmtNyvnD3HJTasIc5GgkVq68gUcAEx7g/i/Y6NJnYsQQggh+eHVs5ER6HXFKhwdWripNe0OQKeQYEO5Zq7P4WKmAgWGrCtnBV22vggKCb+FAydHowd4DgzYeD1PLvj1gSFc01wKgYCfMjlCCFkJBX7ImtQz4cRTvz6Me7+zG5NOX1bWoBALMGxLfrz8kM2DhjJN3OVizx0aTvpchBBCCMltgVAYJ0cjjZ0FDPAGFw52cPpDsLp8ODY8jeaZ5s2LSUVCOOIoJ2+p0K74nES4/UGcHose+OmZdGEwjmBUvjg77sTZcSc6TYZsL4UQsoZQ4IesOUcG7bjmv/+J02NOFKkulEttKNegUieH0SCHKs5MmmQJGWAuUmHYFj2tOV57eq3oMsd34fDy6UnYPfGNgSeEEEJIfrG5AwiEIpnEsZo8uwPhued2mfTYYjZAwIA2oxZbzAacihF8WYyvSV6zjg9PI7xMEvRXXziLn+3p5/Wc2fLMaz144or6bC+DELLGUHNnsmZwHIdpTxBlOhl8wTD29VlRqokEfrpMenT3LmxiuMVswO4Y40tT1V6tx97e5Zsmxmul3j23barEVU0leOa1HviDNNadEEIIWY3mb+7MBoBiOT/pwvlJF4DIZtShgfh7HW4o16Bct3QCVyoOLeq1qFOIoZGJ55pR/2zvAH62dwAX1RSguiD+yaa56NO3tGR7CYSQNYgCP2TVG7F7MGj14Mdv9OH3h4bRUqmb+1qlXgGZWLgk6AMgbUESg1KCA/02Xo5VZVDA5vYv+5wClQTXNJfimuZSXs5JCCGEkNxzaMCGTpMe4TCX0NCKFWJES5jSEHgZWDRt7HsPdkIuEeLa//4n5rdDPD/hyvvADyGEZAMFfsiqN+X0445vvD7390PzmgTu7bMiVl+90HI5x1F0mvTwB8NLdq0W08hEcHgD4GPGlkIiwMlR57LP+fneAdzQWobWeQEvQgghhKwuP9s7gD08ZRMvp6pAwfsx52crdZr0aK/SAwD2ffQq9Ew68Y+TE/iff5xFz6QLO3k/OyGErH7U44eseo1lGlQsk5IcK75zeMiOtsr4mxeOT/twaNCODpN+2ef1Trl5G9/p8AZXfI7NHcBtX38N332lB1ySU8QIIYQQkru8gRC601SePl+hSoqHt5t5P+787OUrG0vm/mxQSrC52oAPXL0e7VU6jE6n1huREELWKgr8kFVPKGB41+V1qC9OPNgiE8ff5LlEIwMA7O21ostkQEe1Pmrj5XajDuOO1C5cukwG1BerMOGIbyJZIMThk88fx3t/dhC+IB+5RoQQQgjJFTKxEFq5OO3nuba5FIXzBmPwZf5o+FhDK8wFSoxR4IcQQpJCpV5kTbinqwo3tpXjpq++MtfMMB7xZsjIRAKEuAs9gbp7L+y6zW8SzQD0WVywuJKfrtVQql5w/ET89uAwpr1BfPfBzqTPTwghhJDcEgiF4fGnf2NnpazmZJkLI317BCySqR1NmU4Gj5+GVBBCSDIo44dknd0dyEgJkkoqwlff3A5hrKY+Uezps6JILUWpVoauZS52Wo1a7OuzLXlcrxBjT69lLtuoqVydUtAHAEanvWg36tBu1CX1+k/ctCGl8xNCCCEkt5wdd8IfSm9QRCRguKimIC3HNs0EfkwFypjZ1vXFalxcm57z8yUU5uDxh6i0nhCScyjwQ7Lunm+9gSd/eTjhZsrJ2FCuxZu7quJ+PscBEw4fRu1edPdal/T8kQgZ2o06DFo9S15bV6yCRiaCqVAJhzeILrMBVndqQR8g0rPnwIANLP74FYBIydsTV9TDaOC/KSMhhBBCsiMYCuOdP96f9vPctqlyrqydb9UzDaPXlahjPkevlKC+hJ8eiekQCIXx6A/34rEf7QPFfQghuYZKvUhW2d0BHB+ZxvGRafRZ3GgsVePRS2tRvkwz5mRxHIdPPHccImGCEZN5Dg/Z0V6lmxvHXqyR4cDMlLBClQQ1hSp091pQV6zCiM0D10zadUe1nvemiw5vEBuNOnAct+IksW11BfjIdU1oKo+ePk0IIYSQ/BQMc+hJoIw9GSIBw+M769J2/BJ1JKAUq8wLiGRupyvwlKpwmMOTvzyMEyMOPP/u7RAkkF1OCCGZQIEfklVahRhVBgX6LW5091jQ3WPBiN2LT93SDJVUBKWUn7foq2cn8dfjY3jmtd6UjsNxQCAYSaWuK1YhGAqjpUKLcxNOFKqksLj9aK3QYmzaOxf0ASIj5LtMeoxO+zDh8METSL0O/8y4E3KxEHLJyg2oK3UKCvoQQgghq1DvVHqDPkAk2ycdY9xnVerlKNXIcFVTScznbDTqEirXz6Svv3QOvzkwhB+/bQv0Skm2l0MIIUtQ4IdkVbQgyF+Oj+Evx8dw2foiPPNQFy/n+evxMfx0Tz8vx+qZdKGlQoPTYw74ghdyeSedPkw6/VFfEwhz6O61AgC0chH0ShmGbalPplhfqsLBgeWzfT6wax2ODk2nfC5CCCGE5BaO4/Ctl3vSfp537qxN6/EFAoav37tp2U2qXA36TDh8+N9/nEWVQRFzIhkhhGQbBX5I1tjdAbztB3tjjiR/+fQEb+c60G+FN8BP00OXPwSZWLgg6AMgZtBnMbsnCKNBwUvgRypaPtvnrg4j3nV5fcrnIYQQQkjuef38FH61fzCt5+gyG1BdoEzrOQCgvSo9E8PSacTuwdt/sBelGhm+du8miIXUPpUQkpvo04lkXDjM4TcHBnHL117FoZn+OFGfxwG/3DeIYIpTKs6MOXBkaPmsmESluud0dGgaTcvUscfL7Q/G/FqXyYB/u7Ep5XMQQgghJDedn0h/b59/u56uJWL53qu9GLZ58dNHL0JDKZXUE0JyF2X8kIziOA4f/d1RPLs7vrKrD/ziEFy+IB642JT0Of/9jyfA18CwDpMegWAYe/usKR9LJUv9x2/IGskaMhcqEQqHoVdIYFBK8I7LatFpMoAlOvqLEEIIIXlj1J569vBy3nNlPVoWTTQlER5/CD/bM4BP39KMYnVuNp0mhJBZlPFDMurf/3gi7qDPrO+92oNwkpGbQasb/zjFT8mYUMCwt9eKQ4N2XgJJ58adqEhxelmVQYHWSi36LW5c01yKf7+1Bd95oBMcBwr6EEIIIatYIBTmPaN5vrpiFR67NL29ffLZidFpPHVtA25oLcv2UgghZEUU+CEZ89Pufnzrn4k3IOydcuOFk+NJnZPP8aZCAYM4hVHwi025/Jj2+LHFbEBrpRbJ9Cw8OGjD4UE7QmEOo3YfNpRrIRAweIP89DMihBBCSO7xBUN4y7d24yUe+yEu9sGr10NEPWsARPpS/v7Q8ILHNlXpcXdXFW20EULyAn2ak4zY12fFv/3uaNKv/8ZL58BxC9Nszo478NSvD+PZ3f3wB8MIhsIYn16Y8ryjvgg6hTjp887nD4bRWqHj5VizHL4QdvdYcHjQjqZyDZRxjGaP5ca28rk/b6st4GN5hBBCCMlB+/ts6O61pO34m6p02LXMaPW1JBzm8OiP9uLpl89leymEEJI06vFDMuLMmAMtFVoUqKT46/GxhF+/r8+K3xwYwnUtZfjIb47i2LAdbn8I/RY3foIB+IMhlOnk+NCvDuMXj25FfYkaAxY3frV/EDZ3gLf/jp4pJ2/HWuzo0DSqDXKogmGMTUefdBaLRibCVfMu0GiHjhBCCMlfHMctm0lyNI0lXhKhAJ+8uXlNZ7L8+egIrmmOlHB9//VevHHewstQDkIIyZa4Az+MMSGAvQCGOI67gTH2DIBLAcz+5nmQ47iDvK+QrAp3d1Xh7q4qAMDn/nwSX38x8V2TD/7yMP7jTyeXjH8XMGDXhlKU6+Q4NGDD236wF5ur9Pj1gSFe1j6fxRWAkAEhnppFL9Zn8cCgEKOuWIWz4/EHmcpT7BVECCGEkNzxjZfOo71Kh4tqomfw9k6lb5rXU9c1oLlibTd0/vpL5yERCTDp9OMXewfx/Lu3o65Yle1lEUJI0hLJ+HkCwAkA88PdH+Q47pf8Lomsdh/ctR5jdi8ODtoSGkMaCnNLgj4A0FKpg0Yuxvt/fgi/PjAIjgP6ptxJra1EI10x26ahTAMBA44MTSd1jpVY3AE4fEF0VOvjnh62ra4wLWshhBBCSGadHJ3GV/9+BoFQGNe3lOGRS2rRVL4w28QTCKXl3Fc2FuPBFCaprgb7+qwYsLjx1mf24qlrG/Cbxy+GVJR8KT4hhOSCuOpBGGOVAK4H8O30LoesBQIBw5fv2oi/vffSBeVJ8bh6QwkMSsmCx+qKVBAwwOENQJBCWnKxWgqnN4gukx4KiRAVOjmkoqU/IseGp3FqzJlUM+Z4BUIc9vZZ0RLnjtv8/j6EEEIIyV/PHRqG2x9CIMThtweHcd1X/on7v9uN185OAoiUgfFZxj7f+3etX9MlXr5gCO/7+UFYXH48ckkNHr20loI+hJBVId6Mn/8C8CQA9aLHP8MY+xiAFwB8mOO4xBqTkDVNIGC4f2t13D1/Lm8oxjfv60D/lBv3fmc3TIVKKCVCPLzdDIVEhKfv78CQzYP3/PQA9vSunCmjlokgYAx2T+TiqVQjAwB091ohFTEM2TxoKFWjz+KGx79wZ80fDKO9SocD/bbE/qMTtnJNWaFKgtY1npJNCCGErAY2tx8/7R5Y8vjLpyfw8ukJNJVpsLFKh78nOe10OZeuK0JD6eJL/bWD4zjc9+1u9E250VKhxYeuacj2kgghhDcrBn4YYzcAGOc4bh9j7LJ5X3oKwCgACYCnAXwIwCejvP4RAI8AQFVVVeorJqtKvPXShSoJPnj1egBAVYECLz+5M+rzKnRyPPv2i/DOH+9fMaDUVKbBoQEbOqr1GLF7cX7CiUCYwxazAb5AGAcHbTg56kC7UYsDA0ubKPZNubDFbMDunvRN1QiHgUq9HEqJCFqFGL5ACKdGHQvGtd+/1QRBOtOPCCGEEJJ2Z8Yc+MhvjmLK5Y/5nOMj0zg+wn+pOWPAx2/asKazff5wZARTLh/ef9U63LSxHEK6tiKErCLxZPxsA3ATY+w6ADIAGsbYjziOu3fm6z7G2PcAfCDaizmOexqRwBA6OjrS1BKXrGZCAcOv3nExqguUcT1fLBTgyavXrxj42d9vRXO5dkEfna6ZQE6XyTD32IEBO6oLFEv6BllcAfhDYaSTVCzA4IhnwWPFaimMCjHOjDmhkAixawONWyWEEELylcsXxFu+vRtHhuwIhbNzqXxVYwnMhfFdZ61Ge3ot+OAvDuOuTiPefUV9tpdDCCG8WzHww3HcU4hk92Am4+cDHMfdyxgr4zhuhEW2Bm4BcDSN6ySr1JkxJyp0MgzZvAseFwoYHt5uxqYqPVy+YNxBn1l1xSpUGRTot8Ru8hwIcTgwYMPmaj2EAgYGYNIZqVac/f9ZpRpZ1IbR6d4LCka5ABx3+OD0BVFfrMLD282oKaQpE4QQQki+OjRow8EBW9bOL2DAuy6vy9r5sy0U5vChXx6GRCTA2y+pyfZyCCEkLRKZ6rXYjxljRYjc+x4E8BgvKyJryqlRBzyBhVkzEpEAP3n7RdhcrU/6uIwx/Ot1jXj82f0IcxzEAkHM7Jx9USZnzc907qjWw+pemnbdXK7B8eH0TPYCAI1chJ7J6FPP3P4Qmso1uKvTuKbTsgkhhJB8t6lKD5lYAG8gvVnEsTy0zYzWSl1Wzp0LRuwenJ904bsPdqBCJ8/2cgghJC3imuo1i+O4FzmOu2Hmz5dzHNfCcVwzx3H3chznTM8SyWq2p9eC+kV9fu7pNKYU9Jl1TXMpXvzAZXjhfZfiPVcllrY7f3LYqVEHTo8tfXsLBGxBrx2+rStRw+ENxvz6x25ooqAPIYQQkudkYiE655WYZ9q/rPHSplfOTOKaDaW4vIFK5wkhq1dCgR9C+MRxHHb3WODwXhhJKhEJ8Oiltbydw2hQoKZIhbduMye0ixOeiecoJUJ4AqGozzkyZIepQMHHMpdoLFNj7zKTyYwGOQpU0rScmxBCCCGZla1pWutL1NDKxVk5dy44N+HEf/3tDB7eYc72UgghJK0o8EOyhjGGz9/eiuMjDqwriWT9fPGONpSnIc1WJhbiQ9fGP5bTMlPa5ZopqYqG44CxaR+6TAbeA0C+FTKJpCIhr+cjhBBCSPaYs9CvTykR4gMzE1PXgr+fHMMPX+9d8NgrZybx/bd2ZTXjihBCMoECPySrrt5Qim/cuwmdJj2evm8zbmorT9u5bmwtwwNbq7HSdM4SjXRBbx3hMuVU5kIlunstKFLzm31zfsIFc2HsYNLZcSf+408nYPcEYj6HEEIIIfmhpiizE7UkIgF++shWXNW0dsqbnnmtD//2u2O49WuvzjXTvqmtHOuzlG1FCCGZRIEfknXXNJfhM29qxa4NpWk9D2MMn7i5Ga8/dQU+fG0DlJLoWTMObxAtFReyfETC2IEfhy8AIQP29FphUEjQZTbwMg51XYkKk46lDaXn++ZL53Hfd3ZnbfQrIYQQQvhRW5TZjJ9b2yvQUqnN6DmzadzhxStnJiASMHz8pg3YaNQBAPTzejoSQshqRoEfsuaUaGR47NJafPXN7VG/7vaHMDbtmyvf8odiB1YGLB5IRZEfI4vbj+4eC6Y9AQhXSitaRpdZj9NjTjh8sRs7zzo8aMczr/UmfS5CCCGEZF+hSgK1LJVhu4l5y5bqjJ0rF3ztH+ewra4Qrz11+ZqeYEYIWbso8EPWrMsbSvDIJTVLHm836jDp9MHjjzR1HrV7Yh6jvkQF97zxqwalBAqJMKUsnL29VmjlInSa4pts9rk/n8SU05f0+QghhBCSXYyxjGX9tFZq11S2z9i0F385Noov3dGGYrUs28shhJCsoMAPWdM+ePV6tFfpFjwmYMCmKj3GHJFgimxeI+WGUjWaKzRYV6KCVCSAb9HEL3OBAgPW2IGieIQ5wO4JIrhMptF8/mAYfzwyktI5CSGEEJJdlXr+h1tE8+auqoycJ1c8d2gYd3VWoVhDQR9CyNpFgR+ypomFAnz1nvYFo0wFAoa9fRdGqZfMu1DQyMU4OjSNcJhDc4UW/ZaFQZ5+iwdbzAboFbFHo4qFLK5GgkqJCFUGxYJj1RQp50rL5uteZvQ7IYQQQnLf6TFH2s+hkopwYxoHaeQahzeAZ3f3446OymwvhRBCsooCP2TNq9Qr8IXbWxc8VhFlpPymKh26eywAgLMTLuzrWxpsmXD6sLvHgpqZBs9KiRAdJj2q5417b6/S49SoA0aDPOru3mzDQavHjwGLG1Z3AJtmspImpr1oiBI0OjNzschx1OiZEEIIyUeTzuWHOvDhsvVFUEoz10somziOw4d/dQRv3lKF8ijXdYQQspZQ4IcQALs2lGLn+iIAkQldE04fNs40/xud9gJAQn17Jpw+VOjlKFBJsHdm4lebUYuOaj3OjjkBRBpDl2tlkIkFaCpTQzVzITZq90IsZDg+Mo3ZMx4ZtMOol8PhC+HYsH3uubN6p1yYcvrmAlOEEEIIyR8cx8HhDaT9PNE2j1ar3T0WBMNhPLzdvORrDm8AX/7LKZwaTX+WFSGE5AIK/BAy4wNXr5/7sz8YxqEhGzpNevRb3AAAz6J+PssJc8CQ1TNXCnZgwIZDA3bs7bPC4l64oxcIhnF8xIEN5RqoZSJY3X4EQhzmJ+8Ewtxc7yCZSAhfcOFavIEwXjg5jjIt7WgRQggh+cYbCCMQZ2+/ZNUUKvHWKEGQ1crpDWJ9iRqMLZ20uq/PihG7F0YDXTcRQtYGCvwQMmNDuRYPbL0w3pTjItk/yYhWKhaNNxCGRBxpHh0Ih1FlUMAXDC/7mqYKTdSLw/MTLrqAIYQQQvJQILz8734+fP72Vigka6PMC4iUtV3ZVLLgMX8wjHCYw2Xri/G529bW94MQsrZR4IeQeT50bQOqDJF+PGLhwh2ieDN+NlfrsDvOkqvDQ3aUaWXoMhmglopxbHh6xdf4gtF3BO0ef9RdLUIIIYTkNpEgvb+/N5Rr0GEypPUcuUYkFKB1pmx/lscfmttgE6T5e04IIbmEwtyEzKOQiPD521tx99Nv4HsPdqGuWIU/HhmBJxDC7w8Nx3mU+C8kGAC5WIju3kigaIvZsGzQSC4WoH/KFfVrQrqAIYQQQvKSgDFIhAL4Q/xn/jAGPL6zjvfj5iPtMlNXCSFkNaOMH0IWuaimAF+8ow3b6gpQqpXhrdvNeHxnHX71jouxva5wxdfHG39RS4XoMhsgnJel091jWTaA01imgdUdvfljoUoa34kJIYQQklNkYiFu3pieMetfvL0N17WUpeXY+eL8hBPjM8M6CCFkLaLADyFR3L65cknZlEoqwg/e2oX/umsjrmwsQayqKluMwMx8IgFQoJJib58Vp8YcMMzsQHEAClWSmK+bXmbih1hIP86EEEJIvkpHts+7dtbhts2VvB8339QUqVCskWV7GYQQkjV0p0hIAgQChlvaK/DtBzrwsRuaoj5npebM60pUWF8aydwJhTn4gmEIBRd+FPWK2IGfs+MuaOXR05SnnP6ojxNCCCEk980fLV5lUOB9V60DAFy6riip412zoRTvnTkGIYSQtY16/BCSpIe2mdFQqsGZcQf6p9wo1kixtaYAu3ss+MwfT0AiFEQNAmnl4iXTwsRCBnOhEj2TLqiky/9YemM0maaEH0IIISQ/hcMceiYv9PD7+r2b8OPd/eio1uPdl9fhpdMTCR3vxrZyfPnONur/RwghBAAFfghJydbaAmytLVjwWEulDvdtrYbHH8IHfnEYfzsxtuDrw7alNebDdi+qCyLTxFYazBV9phdQqVfEvW5CCCGE5I5jw9Nzm0W7mkqwoVwLpzeI/33LJpyfiD7UIZZb2yvw+dtbIaIdIUIIITPoNwIhaSAVCaFTSPCR6xsXjIVvqdBgyOaJ+pq+KTeMevmKI9lbKjRRHzcoY5eIEUIIISR3/e7g0Nyf3zkzgesr97SjRCOLmekbzY1t5fjCHW0U9CGEELIA/VYgJI3MhUp8497N0MrFWF+iWrH/j0IiBMfFyumZEePLP3y9D8E0NIYkhBBCSHpNuSJ9+loqtNho1C34mtsfX+CnoVSNz97aQuVdhBBClqDADyFpdkVjCf74xA60VupweswZ9TnrSlSo0MkxbPdCECPjp8ogx6YqHUanfVG/3t1rwU+6+3lbNyGEEELSa8jmwV+OjeKfZyI9fG5oXTp2valcg589chEe3m5GaYzJVFc2FuMXj22FcoU+gYQQQtYm+u1ASAZU6OT4wh1t2Filw8d+dwyh8MK0Hb1CgtNjFgCImfFTqpGhe1FT6MX+eGQU92018bJmQgghhKSH3R3Ah399GH89PobgzDVBlUGB26OMXjcXKmEuVGJLTQHu7DDidweH8LUXz0EqEuDBi024s9MIc4ESAsr0IYQQEgMFfgjJoLdsqcaZMSeeea0XANBYpsG/XteA8Wkv9AoJWo1a/PXYWNTXegMrl3FNuaJnAxFCCCEkd/zg9V786ejogsfevsOMApV02detL1Xjg1evh90TwFu2VKOpPHrfP0IIIWQ+CvwQkmH7+yNZO3dsrsSnbmmGTBzp61NbrMZGow43tpbjqv98aUGgZ6NRi4MD9hWPfXbciSODdrRUatO2fkIIIYSk5vGdkRHt17eWwRMIwe4O4PbNxrheyxjDZ97UkuYVEkIIWU0o8ENIhn36lmZ4A2F0mQ1zjzHG5po5Gg0KvPvyejx3aBgDFjf8wfBc08eVhDng3/94Aj955KJ0LJ0QQgghPBAIGGRiIV49O4lvP9CZ7eUQQghZ5SjwQ0iGtVbqVnzO4zvr8PjOOvRMOvHETw7i8NDK2T6zXj8/hQP9VrRX6VNYJSGEEELSyR8Kw0/TOAkhhGQATfUiJId5/OGEgj6zvvbiuTSshhBCCCF8eehiEy6qKcj2MgghhKwBlPFDSA47MTKd1Ov+enwMvZMumAqVPK+IEEIIIXzoNBtgLqLf04QQQtKPMn4IyWEnR5ML/ADAs939PK6EEEIIIXwqVEnRUEpTuQghhKQfBX4IyWH3bzXBaJAn9dpf7htEgHoHEEIIIYQQQsiaRoEfQnKY0aDAzx/dCp1CnPBrLS4/Xjk7mYZVEUIIIYQQQgjJFxT4ISTHlWnl+OVjF+ORS2ogFrKEXvu342NpWhUhhBBCCCGEkHxAgR9C8kBdsQr/el0jfvjwloSyf353cBhHk5gKRgghhBBCCCFkdaDADyF55KKaAvzi0a3oMhkgFKyc/eP0BfGp549nYGWEEEIIIYQQQnIRBX4IyTP1JWr8/LGtuKfLGNfzdzYUp3lFhBBCCCGEEEJyFQV+CMlTT17TgFKNbMXn3byxPAOrIYQQQgghhBCSiyjwQ0ie0sjEeHxn7bLP2bm+CGXa5MbBE0IIIYQQQgjJfxT4ISSPvWVLNa7ZUBr1a9vqCvCfd23M7IIIIYQQQgghhOQUCvwQkscEAobHLlua9bOtrgA/fOsW6BSSLKyKEEIIIYQQQkiuoMAPIXmuoVS9ZMLX7ZsrIYhj6hchhBBCCCGEkNWNAj+E5DmZWIhP3LQBapkIAKCRiXBtc1mWV0UIIYQQQgghJBeIsr0AQkjq7r2oGjdtLMcb56YgEwshEwuzvSRCCCGEEEIIITmAAj+ErBIamRi7YjR6JoQQQgghhBCyNlGpFyGEEEIIIYQQQsgqRYEfQgghhBBCCCGEkFWKAj+EEEIIIYQQQgghqxQFfgghhBBCCCGEEEJWKQr8EEIIIYQQQgghhKxSFPghhBBCCCGEEEIIWaUo8EMIIYQQQgghhBCySlHghxBCCCGEEEIIIWSVosAPIYQQQgghhBBCyCoVd+CHMSZkjB1gjD0/83czY2w3Y+wsY+xnjDFJ+pZJCCGEEEIIIYQQQhKVSMbPEwBOzPv75wD8J8dxdQCsAB7mc2GEEEIIIYQQQgghJDVxBX4YY5UArgfw7Zm/MwCXA/jlzFO+D+CWNKyPEEIIIYQQQgghhCQp3oyf/wLwJIDwzN8LANg4jgvO/H0QQAW/SyOEEEIIIYQQQgghqVgx8MMYuwHAOMdx+5I5AWPsEcbYXsbY3omJiWQOQQghhBBCCCGEEEKSEE/GzzYANzHGegH8FJESr/8GoGOMiWaeUwlgKNqLOY57muO4Do7jOoqKinhYMiGEEEIIIYQQQgiJx4qBH47jnuI4rpLjOBOAuwH8neO4twD4B4DbZ572AIDfpW2VhBBCCCGEEEIIISRhiUz1WuxDAN7HGDuLSM+f7/CzJEIIIYQQQgghhBDCB9HKT7mA47gXAbw48+fzALr4XxIhhBBCCCGEEEII4UMqGT+EEEIIIYQQQgghJIdR4IcQQgghhBBCCCFklaLADyGEEEIIIYQQQsgqRYEfQgghhBBCCCGEkFWKAj+EEEIIIYQQQgghqxQFfgghhBBCCCGEEEJWKcZxXOZOxtgEgL6MnXB1KwQwme1FkFWD3k+Eb/SeInyj9xThE72fCN/oPUX4RO8nkoxqjuOKon0ho4Efwh/G2F6O4zqyvQ6yOtD7ifCN3lOEb/SeInyi9xPhG72nCJ/o/UT4RqVehBBCCCGEEEIIIasUBX4IIYQQQgghhBBCVikK/OSvp7O9ALKq0PuJ8I3eU4Rv9J4ifKL3E+EbvacIn+j9RHhFPX4IIYQQQgghhBBCVinK+CGEEEIIIYQQQghZpSjwk+MYY0bG2D8YY8cZY8cYY0/MPP5xxtgQY+zgzP+uy/ZaSf5gjPUyxo7MvHf2zjxmYIz9lTF2Zub/9dleJ8l9jLH18z6HDjLGphlj76HPKJIIxth3GWPjjLGj8x6L+pnEIr7CGDvLGDvMGNuUvZWTXBXjPfUFxtjJmffNbxhjupnHTYwxz7zPq29kbeEkJ8V4P8X8PccYe2rmM+oUY+zq7Kya5LIY76mfzXs/9TLGDs48Tp9RJGVU6pXjGGNlAMo4jtvPGFMD2AfgFgB3AnByHPfFbK6P5CfGWC+ADo7jJuc99nkAFo7jPssY+zAAPcdxH8rWGkn+YYwJAQwB2ALgIdBnFIkTY+wSAE4AP+A4rnnmsaifSTM3V+8GcB0i77X/5jhuS7bWTnJTjPfULgB/5zguyBj7HADMvKdMAJ6ffR4hi8V4P30cUX7PMcaaAPwEQBeAcgB/A7CO47hQRhdNclq099Sir38JgJ3juE/SZxThA2X85DiO40Y4jts/82cHgBMAKrK7KrJK3Qzg+zN//j4iAUZCEnEFgHMcx/VleyEkv3Ac9zIAy6KHY30m3YzIhTLHcdwbAHQzmySEzIn2nuI47i8cxwVn/voGgMqML4zkpRifUbHcDOCnHMf5OI7rAXAWkSAQIXOWe08xxhgim/w/yeiiyKpGgZ88MhPtbQewe+ahd82kK3+XynJIgjgAf2GM7WOMPTLzWAnHcSMzfx4FUJKdpZE8djcWXqTQZxRJRazPpAoAA/OeNwjaECGJeyuAP837u5kxdoAx9hJjbEe2FkXyTrTfc/QZRVK1A8AYx3Fn5j1Gn1EkJRT4yROMMRWAXwF4D8dx0wC+DqAWwEYAIwC+lL3VkTy0neO4TQCuBfD4TLrpHC5SA0p1oCRujDEJgJsA/GLmIfqMIryhzyTCJ8bYRwAEAfx45qERAFUcx7UDeB+AZxljmmytj+QN+j1H0uUeLNxIo88okjIK/OQBxpgYkaDPjzmO+zUAcBw3xnFciOO4MIBvgVJISQI4jhua+f9xAL9B5P0zNlsuMfP/49lbIclD1wLYz3HcGECfUYQXsT6ThgAY5z2vcuYxQlbEGHsQwA0A3jITUMRMSc7UzJ/3ATgHYF3WFknywjK/5+gziiSNMSYCcCuAn80+Rp9RhA8U+MlxMzWe3wFwguO4L897fH4/gzcBOLr4tYREwxhTzjQKB2NMCWAXIu+f3wN4YOZpDwD4XXZWSPLUgt0p+owiPIj1mfR7APfPTPe6CJHmlyPRDkDIfIyxawA8CeAmjuPc8x4vmmlOD8ZYDYB6AOezs0qSL5b5Pfd7AHczxqSMMTMi76fuTK+P5K0rAZzkOG5w9gH6jCJ8EGV7AWRF2wDcB+DI7Eg/AP8K4B7G2EZEUt97ATyajcWRvFQC4DeRmCJEAJ7lOO7PjLE9AH7OGHsYQB8iTeUIWdFMAPEqLPwc+jx9RpF4McZ+AuAyAIWMsUEA/w/AZxH9M+mPiEz0OgvAjcgEOUIWiPGeegqAFMBfZ34HvsFx3GMALgHwScZYAEAYwGMcx8XbyJesATHeT5dF+z3HcdwxxtjPARxHpKTwcZroRRaL9p7iOO47WNovEaDPKMIDGudOCCGEEEIIIYQQskpRqRchhBBCCCGEEELIKkWBH0IIIYQQQgghhJBVigI/hBBCCCGEEEIIIasUBX4IIYQQQgghhBBCVikK/BBCCCGEEEIIIYSsUhT4IYQQQgghhBBCCFmlKPBDCCGEEEIIIYQQskpR4IcQQgghhBBCCCFklfr/H+gnXyKTsP0AAAAASUVORK5CYII=", + "image/png": "iVBORw0KGgoAAAANSUhEUgAABj0AAAMyCAYAAAA2aQPiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzddXhk5fUH8O+4zySZuMsmm9WsuwKLu7v9sBZaKC0tFCm0SCkUt0JxpzgLLLDCuls2nmzcfTTj9/dHlkDYZGMzmcj38zw82czc+94z7CaT3POec0SCIAggIiIiIiIiIiIiIiIa5cTBDoCIiIiIiIiIiIiIiMgfmPQgIiIiIiIiIiIiIqIxgUkPIiIiIiIiIiIiIiIaE5j0ICIiIiIiIiIiIiKiMYFJDyIiIiIiIiIiIiIiGhOY9CAiIiIiIiIiIiIiojGBSQ8iIiIiIiIiIiIiIhoTmPQgIiIiIiIiIiIiIqIxQRrsAH7N5/OhtrYWOp0OIpEo2OEQEREREREREREREVEQCYIAi8WC2NhYiMXHruUYcUmP2tpaJCQkBDsMIiIiIiIiIiIiIiIaQaqqqhAfH3/MY0Zc0kOn0wHoDF6v1wc5GiIiIiIiIiIiIiIiCiaz2YyEhISu/MGxjLikx08trfR6PZMeREREREREREREREQEAP0aicFB5kRERERERERERERENCYw6UFERERERERERERERGMCkx5ERERERERERERERDQmMOlBRERERERERERERERjApMeREREREREREREREQ0JjDpQUREREREREREREREYwKTHkRERERERERERERENCYw6UFERERERERERERERGMCkx5ERERERERERERERDQmMOlBRERERERERERERERjApMeREREREREREREREQ0JjDpQUREREREREREREREYwKTHkRERERERERERERENCYw6UFERERERERERERERGMCkx5ERERERERERERERDQmMOlBRERERERERERERERjApMeREREREREREREREQ0JjDpQUREREREREREREREYwKTHkRERERERERERERENCYw6UFERERERERERERERGMCkx5ERERERERERERERDQmMOlBRERERERERERERERjApMeREREREREREREREQ0JjDpQUREREREREREREREYwKTHkRERERERERERERENCYw6UFERERERERERERERGMCkx5ERERERERERERERDQmMOlBRERERERERERERERjApMeREREREREREREREQ0JjDpQUREREREREREREREYwKTHkRERERERERERERENCYw6UFERERERERERERERGOCNNgBEBER9cTl8eHrQ7U4WGWCzemBzeWBzek98ufOj3aXB1anB+FaBV66fDamxhmCHTYREREREREREQURkx5ERDQiPbu+GM+uL+n1eaVMjHCtAnGhaoRr5JgQqR3G6IiIiIiIiIiIaCRi0oOIiEakNrsL586KQ3yoGjEGJcK1Chi1coRrFAjXyaGWD89bmM8n4EB1O/aUt8Lq8MB6pNrE5fVBr5TCoJYjVC1DqFoOw5GPoWoZEsPUEIlEwxIjERERERERERF1YtKDiIhGpAfPnhbsEAAAPkFAtF6JOclhaDQ78O7OSuwsbYXL6zvmea9eNQfHT4oapiiJiIiIiIiIiAhg0oOIiOiYpBIxYkNUiA1RAQBOnhoDj9eHylY7atsdsLs86HB74XB7YXd5IQjA/NQwTInlfBEiIiIiIiIiouHGpAcREQXF4SYrPtpdBalEBJlEjIoWOwrqLWiyOPHQOVNx0pToYIfYK6lEjNQILVIjOEeEiIiIiIiIiGgkYdKDiIiGlc8n4NUtZfjXdwVwe4Uej7nlvX1YkGrE1DgDInUKROqUmByrR0q4ZpijJSIiIiIiIiKi0YRJDyIiGha17R3YVdaK/+2twtaSlmMe6/YK2FzcjM3FzV2PJRvVeOe6+YgPVR85xocOtxd6pSygcRMRERERERER0ejBpAcREQVUWbMNf/zoAPZVtvf7nGSjGreekI5QtRxhGjlC1XLEhajg8vrwwFe52FzcjJJGKwAgI0qLaxen4OJ5iQF6BURERERERERENFow6UFEREPm9Qm485NsFDVY0Gx1ITZEiZRwDULVcry9owJ2l3dA61W3dWB6fAjSfjUzQyES46Qp0YjWK1Hb3oGadgeUMjHqTA64PD7IpWJ/viwiIr/zeH1wenxQyyUQiUTBDoeIiIiIiGjMYdKDiIiGTCIWYVKMHv/bWw0AqGnvwO7yNsgkoqPmduiVUkTqlV2VGj3x+AQ89HU+Xrt6brfHRSIRFqQasSDV6P8XQUQUAPd9kYMvD9bC5elMdnh9nd8Ts+INeOv/5sOgYos+IiIiIiIi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", "text/plain": [ - "<Figure size 1440x1440 with 1 Axes>" + "<Figure size 2000x2000 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1496,7 +1488,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 59, "metadata": {}, "outputs": [ { @@ -1505,20 +1497,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 25, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAD0CAYAAAB6r4ayAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAZ1ElEQVR4nO3de3Bc5Znn8e/TrbutqyXbsmVbMjZ2zGBuQpg4IRNgAglsTFLZrKlJ1plh15ssk2V2spXhsn/sTE1qyc5UEqaS2R1XIOOtIQsUE8cMEyDmkplAwEbGXHwBW/gu32Td763ufvaPPhCNLduou+WWdH6fKkp93nPU7/P6oJ9evX1Ot7k7IiIyvUVyXYCIiEw8hb2ISAgo7EVEQkBhLyISAgp7EZEQyMt1AaNVV1d7fX19rssQEZlStm/fftrda853zKQK+/r6epqbm3NdhojIlGJmhy50jJZxRERCQGEvIhICCnsRkRBQ2IuIhIDCXkQkBBT2IiIhoLAXEQkBhb2ISAhk5aYqMzsI9AIJIO7ujWZWBTwO1AMHgS+7e2c2+hOZ7F4/2MHTbx/jwOl+Nny1kcK8CGaW67IkxLI5s/+0u1/p7o3B9r3AC+6+FHgh2BYJhZ9uPczG3xyitXOQb/z9dr72k9d570RvrsuSEJvIZZw1wMbg8UbgjgnsS2TSGIzFOd03zDWLKqgsKeDto92c7h3izg2vcsePXqZ3aISjnQO5LlNCJlvvjePAL83Mgb919w3AHHc/Huw/AcwZ6xvNbD2wHmDhwoVZKkdk4nT0xwCoKM4nEkktzfQNx9m0o5Xmgx28+n47DdUlHOkYpHMghuHUV8+gY2CEWKKf//r4mxzrGuJ/fvFyVtaVa3lHLopshf0n3L3VzGYDW8zs3dE73d2DXwRnCX4xbABobGzUB+LKpPfLXSe4f9M7/J+vXMPc8iJqy4vZsvskz7xznJM9Q1SWFFCUF+VU7zCFeREK8qKMJJLkRWBFbSk7W7s50TPMd/5pNwuqSlhQWULCna+sWsScsqJcD0+mqayEvbu3Bl9PmdkmoAk4aWa17n7czGqBU9noSyTX/t21C3j45QM8+My77D/dD0BRXoRlc0t5vy21XVtewCeWzMKA4YRjwPK5ZWw7mLpGoaIkn/b+GNsOdrJqcRVvH+3mH986xg2X1lBWnM+yOaWsWjyLmtLCHI1SppuMw97MZgARd+8NHn8G+HPgKWAd8GDwdXOmfYlcDO7OztYe3m7tIpl0fv7mMeZVFPPtW5ax/3Q/iWSSeRXFHOkY4PrFVRzrHuJUzzAH2wf45JJZ9McSDMScoZEEs2bm8+uWdgCuWVjBktkzKMyL0N4X+/AFs2NdQ5QW5jG7tIhX32+nvX+YBVUzuK6hKnf/CDLtZGNmPwfYFKw75gE/dfdnzex14Akzuws4BHw5C32JTLj+4TiPNx9m845j9A7HqZpRwK5jqZn37NJCSgqidA+OsLy2lONdQwyPJFg2t5SCaIR4Et443EV+1PjEkmrcIWJwbX0VsXiSllOpmf81iyrYcbiL1Utm0TMYp6C0kMGROBUl+QzE4nz7lmXM1pKOZFHGYe/u+4ErxmhvB27K9PlFLraZRfl88eo6tu7voNYgkXA6+mPMqyhiTlkRO4IwH44lOdg+QFNDFdsOdABw/eIqmuqrKMgzXmk5jZNa4jnWNcjRrkGaGqrIMyMSMfIixist7dywtJqheIKkp/oC4+OXzMrpv4FMP5Pqk6pEJourF1ay5U8+hbuz53gPz+48we7jPbT3DbN8bil7T/YSjRoVJfmc7h3m45fMIpZIEosn2X28l8oZ+Vw2r5zC/AjuMDiSwMzYcbiTeeVFHOoY5Iq6csqL83m55TTVMwtZXDOD8uJ8KmcU6AodyTqFvch5mBlLZpfynz41g3jCefjl/fzklYNEDLoHR+geGKEgGiFq0By8+Lp6ySxi8ST50Qi/eb+dsuI8EgmnP5agvqoECy7XfOtoNzcsraapvorXD3aQdOex9dezZPbMXA5ZpimFvcgFFORFKMhLvZz6havm80pLOz1DI7R29NNYX8nrBzupLClg6eyZzJpZwLYDHYwknMvnlwFQUVxAeXE+J3oGqS4tZPvhTlbUljEUT/B+Wx/RSITFNTP56X9cpatvZMLojdBExqGhZib337acipJ8CgvycU/dGlKUH2HfqT5aTvVx+bwyLp9fRnF+lNWXzOJwxwDvtHbT2RcjnnTcoaWtj+qZhZQV5dM7NMJ/v+1jbD3QnuPRyXRmH/zPOhk0NjZ6c3NzrssQuaDD7f089Pxe3m7toaw4n5KCCMMjTkGesXV/B7PLimjtGmT2zAJmlxVRXBBNXXWTZ1SWFBBLJHltfwcRg9WXVHOkc4D2/hi/+C+fZEFVSa6HJ1OMmW0f9b5kY9Iyjkga6ipLiEZTs/nrGqr49b525pUXUVtRzEjSKS/OZ2FVCYV5EX61tw2A4oIoJflR8qIR9p/q44ZLq4nFkwzEEswuK6KmtJCheCLHI5PpSss4ImmIRIyIwe0ra4klkiyunkEskWT7oU5WL5nF7uM9vLq/naF4gmvrK/nkkllcPq+cFbWl5EWMpoYqTnYP8dr+DgZHEhzrHOT1g538/auHcj00maY0sxdJ06v7O+gaGAGc5XPLONCeumFq97EemuorKcqP8i/7TlNXWUzVjALaeofoG4qzdE4p753so2dohCvqytl5rIfrF8/i2oZK7rn50twOSqYtzexF0rSgsoT+4Tjdg3GSSefy+eU0NVRRW17ItoOdDI0kWFlXTmffMN2DIxzvHmbFvHLeONzF3LJCugZG6B2Ks7CyhL0ne9l1rIeDwS8MkWxT2IukoWsgxsstp8mLGNfVV9IzFOed1m6S7hTn53FdQxUF0SitnYP0jySpKS1k2ZxSDFg5v5zSwtQxdZXFqRuz+oZJOjy38wSvvt/OQCye6yHKNKOwF0nD1uDtEYbiSY51D2E4BVHD3MEgP2q8/H7q7RIWzSrBHcqK8kg67DzWzVAiydBIgvb+GCe6B7lk9kxmlxby8Mv7eeSVAxTmRXM7QJl2tGYvMk4d/TGe23mCa+srGUk4I4kElSUFnOgdpmcowaneIZLuXL+4isGRJD2DMbYf6mROWSHrb1hMU0Mlv9rbRklBHjsPdjCzKI/jPcMMxhI8tPYqbls5L9dDlGlIYS8yThXF+dz4sdn84Pl97G/ro66yiIOnB6ivnsHxriEWzZpB79AIJ3qGOXC6n/yo8T/+zQruvG7hhzP2/3bLcgBeff80L77bBuZ84co6VswrG7PP7sERyovzL9oYZfpR2IuMUyRi3L5yHrevnMe7J3poOdnHr/edprw4n6bFVbyw5yS/aTnNouoZVM3Ip613mI9fUj3m0sz1l1Rz/SXV5+wrmXRe29/OP+9t477PfWwihyXTnMJeJAPL55axfG4Zt1/x26WXmz82h56hETa/eYzugRhzgjto07H5rVb+6rm9tPUOc+9nl+vdMCVtCnuRCVBWlM9XVy3K+HnmV5TQMzTC7y6ryUJVEma6GkdkErt8fjmLZpXQ1FClWb1kRDN7kUmsuCDKpv+8mkRy8rxhoUxNWZvZm1nUzHaY2dPBdoOZbTWzFjN73MwKstWXSJjkRyMU5eu6e8lMNpdx7gH2jNr+LvB9d18CdAJ3ZbEvEREZh6yEvZnVAbcBPw62DbgReDI4ZCNwRzb6EhGR8cvWzP4HwLeBZLA9C+hy9w/e4OMoMH+sbzSz9WbWbGbNbW1tWSpHRERGyzjszex24JS7b0/n+919g7s3untjTY0uLxMRmQjZuBpnNfB5M/scUASUAQ8BFWaWF8zu64DWLPQlIiJpyHhm7+73uXudu9cDa4EX3f33gZeALwWHrQM2Z9qXiIikZyJvqvpT4E/MrIXUGv7DE9iXiIicR1ZvqnL3XwG/Ch7vB5qy+fwiIpIevV2CiEgIKOxFREJAYS8iEgIKexGREFDYi4iEgMJeRCQEFPYiIiGgsBcRCQGFvYhICCjsRURCQGEvIhICCnsRkRBQ2IuIhIDCXkQkBBT2IiIhoLAXEQkBhb2ISAhkHPZmVmRm28zsLTPbZWZ/FrQ3mNlWM2sxs8fNrCDzckVEJB3ZmNkPAze6+xXAlcCtZrYK+C7wfXdfAnQCd2WhLxERSUPGYe8pfcFmfvCfAzcCTwbtG4E7Mu1LRETSk5U1ezOLmtmbwClgC/A+0OXu8eCQo8D8bPQlIiLjl5Wwd/eEu18J1AFNwPKP+r1mtt7Mms2sua2tLRvliIjIGbJ6NY67dwEvAdcDFWaWF+yqA1rP8T0b3L3R3RtramqyWY6IiASycTVOjZlVBI+Lgd8D9pAK/S8Fh60DNmfal4iIpCfvwodcUC2w0cyipH55POHuT5vZbuAxM/sLYAfwcBb6EhGRNGQc9u7+NnDVGO37Sa3fi4hIjukOWhGREFDYi4iEgMJeRCQEFPYiIiGgsBcRCQGFvYhICCjsRURCQGEvIhICCnsRkRBQ2IuIhIDCXkQkBBT2IiIhoLAXEQkBhb2ISAgo7EVEQkBhLyISAgp7EZEQUNiLiIRANj5wfIGZvWRmu81sl5ndE7RXmdkWM9sXfK3MvFwREUlHNmb2ceBb7r4CWAXcbWYrgHuBF9x9KfBCsC0iIjmQcdi7+3F3fyN43AvsAeYDa4CNwWEbgTsy7UtERNKT1TV7M6sHrgK2AnPc/Xiw6wQw5xzfs97Mms2sua2tLZvliIhIIGthb2YzgX8A/tjde0bvc3cHfKzvc/cN7t7o7o01NTXZKkdEREbJStibWT6poH/U3X8WNJ80s9pgfy1wKht9iYjI+GXjahwDHgb2uPv3Ru16ClgXPF4HbM60LxERSU9eFp5jNfBV4B0zezNoux94EHjCzO4CDgFfzkJfIiKShozD3t1fBuwcu2/K9PlFRCRzuoNWRCQEFPYiIiGgsBcRCYFpFfbtfcO5LkFEZFKaNmH/d68cYPuhTkbiiVyXIiIy6WTj0stJ4QtXzWNoJEl+XjTXpYiITDrTJuzLSwopz3URIiKT1LRZxhERkXObVmEfiyf54Yv7cl2GiMikM63CviAvwu0r5+W6DBGRSWdahT1AffWMXJcgIjLpTLuwFxGRsynsRURCQGEvIhICCnsRkRBQ2IuIhIDCXkQkBBT2IiIhkJWwN7NHzOyUme0c1VZlZlvMbF/wtTIbfYmIyPhla2b/d8CtZ7TdC7zg7kuBF4JtERHJgayEvbv/C9BxRvMaYGPweCNwRzb6EhGR8ZvINfs57n48eHwCmDPWQWa23syazay5ra1tAssREQmvi/ICrbs74OfYt8HdG929saam5mKUIyISOhMZ9ifNrBYg+HpqAvsSEZHzmMiwfwpYFzxeB2yewL5EROQ8snXp5f8DXgWWmdlRM7sLeBD4PTPbB9wcbIuISA5k5TNo3f3Oc+y6KRvPLyIimdEdtCIiIaCwFxEJAYW9iEgIKOxFREJAYS8iEgIK+3N470Qvbx7pynUZIiJZkZVLL6ebgVicP396F6+0tDO7tJA/WN3A1z+1GDPLdWkiImnRzH4MP3yxhVda2gE41TvMd599l/s3vcNALJ7jykRE0qOwH8NALHFW2+OvH+E/bGxm17HuHFQkIpIZhf0YFlSVnNWWdGg+2Mlj247koCIRkcwo7Mdw2+W11JQWntXuOGuunJeDikREMqOwH8Pc8iK+9vH6s9q/smoRjfVVF78gEZEMKezP4ec7Wv/Vdm15Ed/6zLIcVSMikhmF/Ri6BmIc6xr8V213Ni1kZqGuVBWRqUnpNYYHn3kXgGsWVXK6b5ioGWuvXZDjqkRE0mepj4edHBobG725uTnXZdA3HGdoJEH1zEKSSWckmaQwL5rrskRExmRm29298XzHaGY/hpmFeR8u2UQiRmFEQS8iU5vW7EVEQmDCw97MbjWz98ysxczunej+RETkbBMa9mYWBX4EfBZYAdxpZismsk8RETnbRM/sm4AWd9/v7jHgMWDNBPcpIiJnmOiwnw+MfjOZo0Hbh8xsvZk1m1lzW1vbBJcjIhJOOX+B1t03uHujuzfW1NTkuhwRkWlposO+FRh9N1Jd0CYiIhfRRIf968BSM2swswJgLfDUBPcpIiJnmNCbqtw9bmZ/BDwHRIFH3H3XRPYpIiJnm/A7aN39F8AvJrofERE5t5y/QCsiIhNPYS8iEgIKexGREFDYi4iEgMJeRCQEFPYiIiGgsBcRCQGFvYhICCjsRURCQGEvIhICCnsRkRBQ2IuIhIDCXkQkBBT2IiIhoLAXEQkBhb2ISAgo7EVEQiCjsDezf2tmu8wsaWaNZ+y7z8xazOw9M7slszJFRCQTmX4s4U7gi8Dfjm40sxWkPlz8MmAe8LyZXeruiQz7ExGRNGQ0s3f3Pe7+3hi71gCPufuwux8AWoCmTPoSEZH0TdSa/XzgyKjto0GbiIjkwAWXcczseWDuGLsecPfNmRZgZuuB9QALFy7M9OlERGQMFwx7d785jedtBRaM2q4L2sZ6/g3ABoDGxkZPoy8REbmAiVrGeQpYa2aFZtYALAW2TVBfIiJyAZleevkFMzsKXA/8k5k9B+Duu4AngN3As8DduhJHRCR3Mrr00t03AZvOse87wHcyeX4REckO3UErIhICCnsRkTMMjSSIJ5K5LiOrFPYiImdwhyMdA7kuI6sU9iIiZyguiNJQMzPXZWSVwl5EJAQU9iIiIaCwFxEJAYW9iEgIKOxFREJAYS8iEgIKexGREFDYi4iEgMJeRCQEFPYiIiGgsBcRCQGFvYhICCjsRURCQGEvIhICmX4G7V+a2btm9raZbTKzilH77jOzFjN7z8xuybhSERFJW6Yz+y3A77j7SmAvcB+Ama0A1gKXAbcCf2Nm0Qz7EhGRNGUU9u7+S3ePB5uvAXXB4zXAY+4+7O4HgBagKZO+REQkfdlcs/9D4Jng8XzgyKh9R4O2s5jZejNrNrPmtra2LJYjIiIfyLvQAWb2PDB3jF0PuPvm4JgHgDjw6HgLcPcNwAaAxsZGH+/3i4jIhV0w7N395vPtN7OvAbcDN7n7B2HdCiwYdVhd0CYiIqPsb+tj1oxCykvyJ7SfTK/GuRX4NvB5dx/9UexPAWvNrNDMGoClwLZM+hIRmY6+t2Uvf/aPuya8nwvO7C/gh0AhsMXMAF5z96+7+y4zewLYTWp55253T2TYl4jItPPXa6+iPxa/8IEZyijs3X3JefZ9B/hOJs8vIjLdRSJGadHELuGA7qAVEQkFhb2ISAgo7EVEQkBhLyISAgp7EZEQUNiLiISAwl5EJAQU9iIiIWC/fTub3DOzNuBQFp+yGjidxefLNY1n8ppOYwGNZ7I7czyL3L3mfN8wqcI+28ys2d0bc11Htmg8k9d0GgtoPJNdOuPRMo6ISAgo7EVEQmC6h/2GXBeQZRrP5DWdxgIaz2Q37vFM6zV7ERFJme4zexERQWEvIhIK0zbszeybZvaume0ys/81qv0+M2sxs/fM7JZc1jgeZvYtM3Mzqw62zcz+OhjL22Z2da5r/CjM7C+D8/K2mW0ys4pR+6bqubk1qLnFzO7NdT3jYWYLzOwlM9sd/KzcE7RXmdkWM9sXfK3Mda3jYWZRM9thZk8H2w1mtjU4R4+bWUGua/yozKzCzJ4Mfm72mNn16ZyfaRn2ZvZpYA1whbtfBvxV0L4CWAtcBtwK/I2ZRXNW6EdkZguAzwCHRzV/ltRn+y4F1gP/OwelpWML8DvuvhLYC9wHU/rcRIEfkTofK4A7g7FMFXHgW+6+AlgF3B3Ufy/wgrsvBV4ItqeSe4A9o7a/C3w/+HS9TuCunFSVnoeAZ919OXAFqXGN+/xMy7AHvgE86O7DAO5+KmhfAzzm7sPufgBoAZpyVON4fJ/UB7uPfjV9DfB/PeU1oMLManNS3Ti4+y/d/YMP3HwNqAseT9Vz0wS0uPt+d48Bj5Eay5Tg7sfd/Y3gcS+pIJlPagwbg8M2AnfkpMA0mFkdcBvw42DbgBuBJ4NDpsx4zKwcuAF4GMDdY+7eRRrnZ7qG/aXAJ4M/2/7ZzK4N2ucDR0YddzRom7TMbA3Q6u5vnbFryo1lDH8IPBM8nqrjmap1n8XM6oGrgK3AHHc/Huw6AczJVV1p+AGpyVEy2J4FdI2aZEylc9QAtAE/CZalfmxmM0jj/GT0geO5ZGbPA3PH2PUAqXFVkfqz9FrgCTNbfBHLG5cLjOV+Uks4U8b5xuPum4NjHiC1hPDoxaxNxmZmM4F/AP7Y3XtSk+EUd3czmxLXaJvZ7cApd99uZr+b43KyIQ+4Gvimu281s4c4Y8nmo56fKRv27n7zufaZ2TeAn3nqJoJtZpYk9cZBrcCCUYfWBW05da6xmNnlpH6zvxX88NUBb5hZE5N0LHD+cwNgZl8Dbgdu8t/e6DFpx3MBU7XuD5lZPqmgf9TdfxY0nzSzWnc/HiwPnjr3M0wqq4HPm9nngCKgjNSad4WZ5QWz+6l0jo4CR919a7D9JKmwH/f5ma7LOD8HPg1gZpcCBaTeIe4pYK2ZFZpZA6kXN7flqsgLcfd33H22u9e7ez2pE3+1u58gNZZ/H1yVswroHvVn3aRlZreS+hP78+4+MGrXlDo3o7wOLA2u9igg9SLzUzmu6SML1rMfBva4+/dG7XoKWBc8Xgdsvti1pcPd73P3uuDnZS3worv/PvAS8KXgsKk0nhPAETNbFjTdBOwmjfMzZWf2F/AI8IiZ7QRiwLpgBrnLzJ4g9Y8VB+5290QO68zEL4DPkXohcwD4g9yW85H9ECgEtgR/rbzm7l939yl5btw9bmZ/BDwHRIFH3H1Xjssaj9XAV4F3zOzNoO1+4EFSy593kXrb8S/nprys+VPgMTP7C2AHwQueU8Q3gUeDycR+Uj/rEcZ5fvR2CSIiITBdl3FERGQUhb2ISAgo7EVEQkBhLyISAgp7EZEQUNiLiISAwl5EJAT+P9XzG/DLJ27KAAAAAElFTkSuQmCC", + "image/png": "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QoEumlioA10hvdfcqe5wRFdOL012eQAAJBWhZRg5e1yezv7EOi2+VJfGfspMIgAARhJ+HgIAAJZAaAEAAJZAaAEAAJYwLELLb37zG40ZM0YpKSmaOXOm1q5dm+ySAADAMJP00PLMM89o4cKFuuuuu/T2229r6tSpmjVrllpbW5NdGgAAGEaSHlp+8YtfaP78+br22ms1adIkPfLII0pLS9Mf/vCHZJcGAACGkaSGlnA4rNraWlVVVcXb7Ha7qqqqVFNTc9j3hEIhBYPBARsAAPj8S2po2b9/v6LRqAoLCwe0FxYWyu/3H/Y9S5Yskc/ni29lZWVDUSoAAEiypP88NFiLFy9WIBCIbw0NDckuCQAADIGkroibl5cnh8OhlpaWAe0tLS0qKio67Hs8Ho88Hs9QlAcAAIaRpN5pcbvdmj59ulatWhVvi8ViWrVqlSorK5NYGQAAGG6S/uyhhQsX6pprrtHpp5+uGTNm6Je//KW6u7t17bXXJrs0AAAwjCQ9tHzjG9/Qvn37dOedd8rv9+vUU0/Vq6++esjgXAAAMLLZjDEm2UV8FsFgUD6fT4FAQF6vN9nlAACAo3As39+Wmz0EAABGJkILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwhISFlnvuuUdnnXWW0tLSlJWVddhj6uvrdckllygtLU0FBQX68Y9/rEgkkqiSAACAhTkTdeJwOKwrr7xSlZWVeuyxxw7ZH41Gdckll6ioqEhvvvmmmpub9d3vflcul0s/+9nPElUWAACwKJsxxiTyAo8//rgWLFigjo6OAe2vvPKKvvKVr6ipqUmFhYWSpEceeUS33nqr9u3bJ7fbfVTnDwaD8vl8CgQC8nq9x7t8AACQAMfy/Z20MS01NTU65ZRT4oFFkmbNmqVgMKgtW7Yc8X2hUEjBYHDABgAAPv+SFlr8fv+AwCIp/trv9x/xfUuWLJHP54tvZWVlCa0TAAAMD4MKLbfddptsNtunblu3bk1UrZKkxYsXKxAIxLeGhoaEXg8AAAwPgxqIu2jRIs2dO/dTjxk7duxRnauoqEhr164d0NbS0hLfdyQej0cej+eorgEAAD4/BhVa8vPzlZ+ff1wuXFlZqXvuuUetra0qKCiQJL322mvyer2aNGnScbkGAAD4/EjYlOf6+nq1tbWpvr5e0WhUGzZskCSNGzdOGRkZuvjiizVp0iR95zvf0b333iu/36877rhD1dXV3EkBAACHSNiU57lz5+qJJ544pP2vf/2rzj//fEnSnj17dMMNN+hvf/ub0tPTdc0112jp0qVyOo8+SzHlGQAA6zmW7++Er9OSaIQWAACsx1LrtAAAAAwGoQUAAFgCoQUAAFgCoQUAgCQwxuiN9/cluwxLIbQAAJAENptN6R5HssuwFEILAABJMn10TrJLsBRCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsARCCwAAsISEhZbdu3dr3rx5qqioUGpqqk444QTdddddCofDA47btGmTzj33XKWkpKisrEz33ntvokoCAAAW5kzUibdu3apYLKZHH31U48aNU11dnebPn6/u7m7dd999kqRgMKiLL75YVVVVeuSRR7R582Z973vfU1ZWlq677rpElQYAACzIZowxQ3Wxn//853r44Ye1c+dOSdLDDz+s22+/XX6/X263W5J022236fnnn9fWrVsPe45QKKRQKBR/HQwGVVZWpkAgIK/Xm/gPAQAAPrNgMCifzzeo7+8hHdMSCASUk5MTf11TU6PzzjsvHlgkadasWdq2bZva29sPe44lS5bI5/PFt7KysoTXDQAAkm/IQsuOHTv04IMP6vvf/368ze/3q7CwcMBxH732+/2HPc/ixYsVCATiW0NDQ+KKBgAAw8agQ8ttt90mm832qdv//mln7969+tKXvqQrr7xS8+fP/0wFezweeb3eARsAAPj8G/RA3EWLFmnu3LmfeszYsWPjf25qatIFF1ygs846S7/97W8HHFdUVKSWlpYBbR+9LioqGmxpAADgODkYjspulzxOR7JLiRt0aMnPz1d+fv5RHbt3715dcMEFmj59upYtWya7feCNncrKSt1+++3q6+uTy+WSJL322ms66aSTlJ2dPdjSAADAcfLVX/9DHT19WrXwC/KluZJdjqQEjmnZu3evzj//fJWXl+u+++7Tvn375Pf7B4xV+da3viW326158+Zpy5YteuaZZ/SrX/1KCxcuTFRZAADgKHzv7AqluOx6p+HwE2OSIWFTnh9//HFde+21h933yUtu2rRJ1dXVWrdunfLy8nTTTTfp1ltvPerrHMuUKQAAkFzH8v09pOu0JAKhBQAA6xn267QAAAAcK0ILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBEILAACwBGeyC/isPnp0UjAYTHIlAADgaH30vT2YRyBaPrR0dnZKksrKypJcCQAAGKzOzk75fL6jOtbyT3mOxWJqampSZmambDbbkFwzGAyqrKxMDQ0NPFn6KNFng0efDQ79NXj02eDRZ4Pzaf1ljFFnZ6dKSkpktx/daBXL32mx2+0qLS1NyrW9Xi9/aQeJPhs8+mxw6K/Bo88Gjz4bnCP119HeYfkIA3EBAIAlEFoAAIAlEFqOgcfj0V133SWPx5PsUiyDPhs8+mxw6K/Bo88Gjz4bnOPdX5YfiAsAAEYG7rQAAABLILQAAABLILQAAABLILQAAABLILQAAABLILQcg7/85S+aOXOmUlNTlZ2drcsuu2zA/vr6el1yySVKS0tTQUGBfvzjHysSiSSn2GEkFArp1FNPlc1m04YNGwbs27Rpk84991ylpKSorKxM9957b3KKHAZ2796tefPmqaKiQqmpqTrhhBN01113KRwODziOPhvoN7/5jcaMGaOUlBTNnDlTa9euTXZJw8KSJUt0xhlnKDMzUwUFBbrsssu0bdu2Acf09vaqurpaubm5ysjI0Jw5c9TS0pKkioefpUuXymazacGCBfE2+uxQe/fu1be//W3l5uYqNTVVp5xyitavXx/fb4zRnXfeqeLiYqWmpqqqqkrbt28f3EUMBuXZZ5812dnZ5uGHHzbbtm0zW7ZsMc8880x8fyQSMZMnTzZVVVXmnXfeMS+//LLJy8szixcvTmLVw8MPf/hDM3v2bCPJvPPOO/H2QCBgCgsLzdVXX23q6urM008/bVJTU82jjz6avGKT6JVXXjFz5841K1euNB988IF5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", "text/plain": [ - "<Figure size 432x288 with 1 Axes>" + "<Figure size 640x480 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1536,7 +1526,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 60, "metadata": {}, "outputs": [ { @@ -1545,20 +1535,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 26, + "execution_count": 60, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAApsAAAJ8CAYAAACx02peAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3gkaXUv4F+lrs5RUiurNUmTk2Y0m3eBJZgcLtgsLCYYYwzYhosDvjaOGMzFGHMxOWMWWHJYWGAX2LyjyVmaoJxD5xyq7h8t9SirQ1V3tXTe51mbkbqrS1KHU993AiPLsgxCCCGEEEJUwFb6BAghhBBCyMZFwSYhhBBCCFENBZuEEEIIIUQ1FGwSQgghhBDVULBJCCGEEEJUQ8EmIYQQQghRDQWbhBBCCCFENXylT2ApSZIwNjYGi8UChmEqfTqEEEIIIWQJWZYRCoXQ2NgIll177VJzwebY2BhaWloqfRqEEEIIIWQdw8PDaG5uXvM2mgs2LRYLgOzJW63WCp8NIYQQQghZKhgMoqWlJRe3rUVzweb81rnVaqVgkxBCCCFEw/JJeaQCIUIIIYQQohoKNgkhhBBCiGoo2CSEEEIIIaqhYJMQQgghhKiGgk1CCCGEEKIaCjYJIYQQQohqKNgkhBBCCCGqoWCTEEIIIYSohoJNQgghhBCiGgo2CSGEEEKIaijYJIQQQgghqqFgkxBCCCGEqIaCTUIIIYQQohoKNgkhhBBCiGoo2CSEEEIIIaqhYJMQQgghhKiGgk1CCCGEEKIaCjYJIYQQQohqKNgkhBBCCCGqoWCTEEIIIYSohoJNQgghhBCiGgo2CSGEEEKIaijYJIQQQgghqqFgkxBCCCGEqIaCTUII0ZBkWsL3To3gqeszlT4VQghRBF/pEyCEkM1GlmVcGQ/BJHJwW/WYDiVwYsCLEwNePHJlCtOhBO7cXoPbt9VU+lQJIaRkFGwSQkgZJNIZPNvnxW+uTOLRnimM+GJr3v7SWLBMZ0YIIeqiYJMQQlQyHUrgt71TePTKJJ64NoNoMpP3fb2RJLyRJJwmnYpnSAgh6qNgkxBCShCKp/CbnimM+mMY98cRjKcwMBPBwGwUgViqpGM/dX0GLzvQqNCZEkJIZVCwSQghBZoMxvHdk8O4OBpE94AX3khy0ff3NloRSZQWaALAR37Rg4MtdrQ4jSUfixBCKoWCTUIIyUNGkvHEtWl8q3sIj1yZQkaSV73txbEgjrU7cbzfW9JjjvpjuO+Lz+In77oDDtpOJ4RUKQo2CSFkDZPBOB48MYxvnxjGqH/top6FLo4GYDPwCMTSJT3+sDeGLz3Zj/e/sKOk4xBCSKVQsEkIISvISDI++nAPvvhk/5qrmKuJJDPo8jjQPeAr+VysBnqrJoRUL2rqTgghK/i7H13A5x7vKyrQnHdm2A+3RSzpPN5wrBVvv3NLSccghJBKomCTEEKW+MYzA/hW93DJx0llZDQ7Sivu8bhMYBim5HMhhJBKob0ZQggB4I8m8b1TIzg/EsBPzo0pdtzTwz60OY0Y9EaLuv+vLk/g7XfRyiYhpHpRsEkIIQBe97lncHUyrPhxZRmos4pFB5tnhvxIZyTwHG1EEUKqE717EUIIAIPAqXbs/plI0ffd02QDx9I2OiGkelGwSQghAO7uqFPt2DPhJDrc5qLue27Yj4883KPwGRFCSPnQNjohhAC4p6MWn3z0mmrHtxqEou/7lacGEE1kIPIsdjda8erDzQqeGSGEqIuCTUIIAbC7warq8U8O+nCs3YkrE0FEE2kIHAuBZxGOp7Fed6VkWsI3nh0EAHAsg842B9pcJlXPlxBClELb6IQQAmAqmFD1+LIMHO/3IhhLIy0BsZSEYCwNh1EHuzH/Vc+MJOP3P/csrowH877PdCiB750awbsfOI07/v03+OCPLyKRzhTzYxBCSMFoZZMQQgB8/ZmBijxuk8OA8yOBgu4zEYzj/i9144m/eg4MupULm8KJNL7yZD9+dXkSF0YXH//rzwzCadLhL+7dUfR5E0JIvmhlkxCy6SXSGXzv9EjZH7fFYcCl0cICzXkz4QS+1T206vde/qkn8R+/vros0Jz36d/dwNBsce2YCCGkEBRsEkI2vd/2TMMfTVXksXmu+LZGH/r5Ffz7wz2YCMQXff2ffnoZfdNrt1tKpiV8+nfXi35sQgjJF22jE0I2veP9sxV53GFfDHsbrbg4ln/+5UIZScZnfncDn3+8Dy/c48Z9XW0YD8Tw0zwnIH3n5DBG/TH83Ut2o6PeUtQ5EELIeijYJIRsetFE5YplZiOlFyZlJBk/vzCBn1+YKOh+sgw8cW0GX3iiDx977YGSz4MQQlZC2+iEkE3PbdNX7LE5lsWBFhsOt9qLuv/uBiuOehwoZcbQTFjdSnxCyOZGK5uEkE1vR5HTfZQw4othxBcDABxrd+J4vzfv++5rym7ByzJwqMWOM8P+os7heTvVm55ECCEUbBJCNj2PRhqkH+/3Yme9BVY9DzAMGAAysv9HhgxZzm59JzMZ8ByLqxMhyHMN4UOJNDwuIwaKqDC/MhFS8scghJBFKNgkhGx6thJGSSqtp4jAr9AV0aUe652GLMtgmFI24wkhZGWUs0kI2fRsBUzw0aLLBUwTWsmoP4aLo6UdgxBCVkPBJiFk07OIPNprtLGVXiiGAdIZqeTj/PziuAJnQwghy1GwSQjZ9BiGwYdetRfVuIvc2eZALFV6sHljKqzA2RBCyHIUbBJCCIDJYBwiX31viaxCEXI0Wbleo4SQja363lkJIURh8VQG7/3OOcQVWCEst1ODPhxqtWNbnRk2g4CdRU4COjXoQ9/0yqubkiSju9+LWerHSQgpAgWbhJBNzxtJVvoUipaRZJwZ8uP6VBiBWAreSBJd7Q4c9ThwrN2JfEevx1IZ/P7nn8V3Tw4jtSAHdNgbxZ9+8zRe97ln8Pkn+lT6KQghGxm1PiKEbHrBeKrSp6CYqVACU6GbK5BHPQ6cGPDldd/pUAJ/+b3z+Pivr+JwqwOD3siiKvVRXwxfeLwPDAPYjTrc01GLGrOo+M9ACNlYKNgkhGx6GUmu9CmoJp0p/GcbD8Tx0IXl1ek/Oz+On52/+XW9wOITv38IL9pbX9I5EkI2NtpGJ4Rsehs52Dw34kdXuwM765UfyRlPSfjfD57FVCiu+LEJIRsHBZuEkE2vu4TpO1onyUB3vw86jlPl+JFkBs/2bdzfHyGkdBRsEkI2vR+cHq30Kaiq2WGAN6peEdRqVeyEEAJQsEkIIXjzbR7ohY35dtheY8JUMI4RX0y1x/BHN06BFSFEeRvz3ZUQQgpwz85afOYNnXCZdJU+FcUZBA7JIoqECCFEKRRsEkI2vb/74UW85asn0OoyLvterUVER70FHfUWGAR18h7VdHk8iC6PU9XHSEvV1wyfEFI+1PqIELKpTYcS+NXlSQDAxZEAutqd8EWScJp0mAzGMTAbxfRc30q3RYTTpMOoX70taTV0D3hxsNmOsyN+VY6/cIt+2BvFx399FZPBOGQZaHIY8NrOZhzb4srd5tJYAL+5MoWOegtesIfaJhGy0VGwSQjZ1PpnIrn/nZoby7iayVACHpcRTpMAvcDBbdVjMhDHWED7rX9mI+qNmrw+FYY01z7qfz94Dt0Di3+H3zs1ghfsdmO724zHr87gwmgg973/8+JdePtdW1Q7N0JI5VGwSQjZ1EZ80YJuPzAbhcgziCYyYBlG1SpvJdVaRAyrVCQ04ovhz79zFrdvdS0LNOf96vJkbgV5oQ/9/AoujAbwz6/YA7tx4+XMEkIoZ5MQsslFk5mC75NIy4inJXjDCRxotsMsavu6/UCzDWeG/Ko+xk/PjeFvfnChqPv+5NwY3vyVE5BlKmQiZCOiYJMQsql1tTuxra646TrRlITj/V4wkHGs3QmjTpsFRCwDMAxwqMWOI20OOIxCpU9pmbPDfvymZwq9EyF8+cl+pDJUdETIRsHIGruUDAaDsNlsCAQCsFqtlT4dQsgmIEky/uf4ID7440slHafWLELgGYz5tZXD6TQJEHkO43O5pRY9D6dRh0FvYSkEamuyG7C3yYpfXprEm2/z4B9fvqfSp0QIWUUh8RqtbBJCNj2WZfDGY23Y01jaBe50OIEmuyGv2x71OOC2igAAkVf3rdgbSeUCTQAIxdOIpwtPH1DbqD+GX16ahFnkcU9HbaVPhxCiEAo2CSGb1uBsBJ977AZ+fHYUGVnG9995Gz7y6n1oduQXMK5kzB+Hfck2tY5nUWPWweMyoqvdic42B04M+GA3COhssyOVkdDZ5kC9TV/qj5Q3rRbjiDyLH/zpbbino67Sp0IIUYi2s9oJIUQlgVgKb/7KiVzro48+3Iu33O7Bc3fWYfslc9HjHUf9MVgNPHY3WJGWJMRSGYz7Y5gJJzETTmJg9ubWde/kzZnipwZ9MOk4GAQOsZS6q44elxHDs5H1b1gBd+2oxQ63pdKnQQhREAWbhJBN6eO/6l3UY3PUH8O/PnQF//XINYAp7djBWBqXY8GC7tNsN8Bh0i3qQakWp0m3KOjVkmPt6k47IoSUH22jE0I2HVmWV+z5CAChRBqheLqs59PlcWI8GFc10DzW7oRlrkWTVgNNAHjxvgbVH2NoNorZsHpN7gkhi9HKJiFk0+mZCC0qmKmkPY3WVRuhK2FvoxWzkQSO93uxvc4MSyKt2YlHO+staMyzwKpY3z05jL/+/nm8/EAjXGYR99/SBk+NSdXHJGSzo2CTELKpSJKMLz3ZX+nTyDHNrTbqBRb7m+1gAMRTGYgCi77pCFiGwVRo8SpcV7sTZ4f9SKbX70XJMAycJhHNDiOuT4Wxpdas2WAzmszgC4/3YSIYx9+/dLfix//KU/34p59eBgD86OwYAOD2bS4KNglRGQWbhJBN5Z9/dhnfOzVS6dPI8UYSYBhgf7N9xbnsO9xmeCNJpOdmj9eYdeju9+Jwqx2n85gKtHRrni0xH1VNQ94oPvTzKwCAP7l7K2otoiLHlWUZn/rNdfzHr68u+57HRYEmIWqjnE1CyKbxpSf78dWnByp9Gotcn4pga60JZ4d8K37/6mQYsixju9uMgy02ZOaCztNDfuxuKLwv6IRGVzWXeur6jCLHkWUZH/lFz4qB5gt2u9HsMCryOISQ1dHKJiFkw5NlGQ8cH8K/PnS50qeyoutTa7chysjAtbk2SY12PXzRFADAJGbHY7qtIkSew9CSiUAdbgtEnoVeYHFjOoJoMoPhIls6ldsD3UN45aGmko9zaSyIzz3et+zrW2pM+MwbO8FpeamXkA2ioJXNf/zHfwTDMIv+27lzZ+778Xgc73rXu+ByuWA2m/Ga17wGk5MrV3wSQkg5hBNp/Pm3z+Lzj9/A1triZqBryfwozBaHAWeH/dhZb0EslVlxLrvNIOD8aADdAz5Ek2kcarVDiWFFFj2PhgUN6OssIo60ObCz3oJj7U7sa7KizWWAUSjuwWrMIl5xsLH0EwXgtq7cKL+r3UmBJiFlUvDK5p49e/DII4/cPAB/8xDvfe978dBDD+G73/0ubDYb3v3ud+PVr341nnrqKWXOlhBCCnB5LIh3PXA610+TQbYF0Jk8i2u0LBhPYV+TDWeG/JABzO+ot9eY4DLpwLIMxvw3VzFjKQlP35hFq9MIHc8sWk01CiziaQlzO/QAgG11Joz744gkbzaY1/Ms9jTZ0DcdxnggjgPNNog8h8vjQZwcXDkNwCzy2FZnxtlhP0SewcEWB3zRJJJpacUWTF3tTnz2jZ1wmpSZcJTKrPx31gvLg3NCiDoKDjZ5nkd9ff2yrwcCAXzpS1/CAw88gOc+97kAgK985SvYtWsXnn32Wdxyyy2lny0hhORBlmV8+8Qw/vEnl5BYEFTKAI73e9FkN8As8uidDFXuJEsUiKUXFQhNhuI44nHg5IBvUbP6pYa8UbAMcNf2GviiKQz7ovBHUxA4BjtqzbAaBITjaVweD8Ko49DZ5gADgGUYXJsK4dSCoPLcyPp9QcOJNM4O+7G30YpgPI3jc0VQ+5qW55vqBRZfeNMR2AzCsu8Vq3di5b/x/+psVuwxCCFrKzjYvHbtGhobG6HX63Hrrbfiwx/+MFpbW3Hq1CmkUince++9udvu3LkTra2teOaZZ1YNNhOJBBKJm209gsHCpm4QQshCsizjQw9dwRfXaG80Orfi19XuQHf/yity1cYfTeHkQH4/iyQDT82tcvrn8j9TGRk9SwKzaDKzKLgsxcWxxe/tIr98ZZEBo3i1/ErN+7s8Tuxtsin7QISQVRWUUHPs2DF89atfxcMPP4zPfOYz6O/vx5133olQKISJiQnodDrY7fZF93G73ZiYmFj1mB/+8Idhs9ly/7W0tBT1gxBCSCCawr/9fO1Ac6Hufh+OtDnAbMLUvYwkQ19kTqUSTg76sLPegiNtDpjn8k2T6Qz6psPr3HN9w94ovvJUP/7m++fx4MnhZd9/8+2ekh+DEJK/glY2f+/3fi/3v/fv349jx46hra0NDz74IAyG4qY+fOADH8D73ve+3L+DwSAFnISQgoQTafzk7Bj+9aHLiC7IMczHyUEfOtscOD3kgyyvf/uNxKpXbru6GPMrqTqexfY6M8YDcXzwx5fwF/fuwD0dtZBlYCIYx3QogY56y7p5lpfHgvjc4zfws/PjuRZRK7mno1bRn4MQsraSWh/Z7Xbs2LED169fx/Of/3wkk0n4/f5Fq5uTk5Mr5njOE0URoqhM415CyOYx6o/h0SuT+PXlSRzv8yK5SiFIPk4N+tDZ6sDp4c0TcB5qtefyJystmZZwbSq7onluJIC3fPUEXCYdai069Exkv67jWBxqtePWrS7ctrUGB1vs0PEsZFnGMzdm8dnH+/D41em8Hu+LT/Tj7XdugWGFCn5CiPJKCjbD4TBu3LiB+++/H52dnRAEAY8++ihe85rXAAB6e3sxNDSEW2+9VZGTJYRsXpIk49yIH49emcIjVyaX5ReW6tSQD4db7Tg77Mcai2IbAssAoxrvtzkbSaLGfHMhIpmRcLzfi+P9XnzikWvQCyz2NtowGYpj2FvYz/LxX1/FFx7vw4devQ8vP6BMiyVCyOoKCjbf//7342Uvexna2towNjaGf/iHfwDHcXj9618Pm82Gt73tbXjf+94Hp9MJq9WK97znPbj11lupEp0QUpRoMo0nr83g0StTeLRnCjPhxPp3KsHpIT8OtdhxfjSw5jZstdvXbMe5YX+lT2NdFsPqH1HxlLRqu6V8hBJpfPThHgo2CSmDgoLNkZERvP71r8fs7Cxqa2txxx134Nlnn0VtbTb/5T//8z/Bsixe85rXIJFI4IUvfCE+/elPq3LihJCNaSIQx6M9k3j0yhSeuj6zqHVROZwZ9uNgix3nRvwbdks9VSU9RnvHQ7CIHEKJwvJw86VTosM9IWRdjCxr6+00GAzCZrMhEAjAai187i8hRPuSaQlPXp/GU9dnIckyOIaBJAPdA7O4OKqN9mdHPQ6cyLOVUDU51u7UTK5mPtT8O/zZc7fhfS/oUOXYhGx0hcRrNBudEFI206EEPvHIVfzs/DgCsVSlT2dN0WS60qeguN0N1qoKNAGotrqs41i8/a4t6hycELIIBZuEENX1ToTw8MUJfPmpfs0HmfOuTYahF1jEU9Wx5ZwPnquuhqJ1FhEXRv2qHDuZkXC8z4t7d7tVOT4h5CYKNgkhqhn1x/DRh3vw47NjlT6VgiUzMrpaHeiuspXAtcRT6uQ+qqXVacTJQfWKwq5Ph3EvKNgkRG0UbBJCFBeKp/CZ393Al57sL3uBj5IujvhRaxExHVK3Cr5clJw5Xg6j/mjZHkuSZNyYDqPWIsJu1JXtcQnZDCjYJIQo6ne9U3j/d89hJpys9KmULJqSsLfJtCGCzZ31lqoqeOJZBhMBdX/v3zw+CF8kiUAshd/1TmMiGIdFz+Nz93fitq01qj42IZsJVaMTQhRxdtiPrz7Vj4cujCOV0dTbSkmOehyYCBbeOFyLdrjN4FkGl8eVbYivlsOtdpwe8pf9cXUci79/2W68trN53RGZhGxWhcRrFGwSQoqWykj4xcUJfOWpfpypQFCgti6PAycHfZDkbKCmFzicHwlU+rRKUk0tneqtekwE4xV7fL3A4lWHmvGhV+4Fy1ZXcRUhaqPWR4SsomciCI5hsN1tqfSpVDVJkvGDM6P4xCNXMaLxsYfF8riMOD10c3Tl1ckwGAawGngEY9XbFqmacmgdJqGiwWY8JeFb3UNodRrxznu2Vuw8CKl2FGySTeV1n30GoUQarzjQCI5l8QddLTjqcRZ8nPk53c/2ecGxwHa3BR1uCxpsejDMxl4B8UWSeN+DZ/Hb3ulKn4qqOJZBesnISlkGmu1GDGYiaHIYYDMIub/35bEAwipNuskXywC7Gqy4Mh5cNt99Z70FFj2PjCSDAaCpLa0VdNRbMObXxoXMx37Vi652BzrbCn+vIIRQsEk2kUQ6g3hKgiwDP5prxTMZjOO+Y63oaneixizmdZzJYBz3feFZ3JiOLPueReSxu9GKL735KMzixnt5JdMS/uDzz6J3sjpy/oplNwoQOHbFLedrUyGkMjKuToYXfd2k49DV7sT1yRDiqQxqLHpY9Tz0AgeWZSDJMjKSDB3HIpbM4NJYAEqnth7xONHd78XWWhNcZhEj3igsegGRRBpWvYDugWwbp2aHQdMr0nubrOgZD0Iri7AZScZbvnIC//G6g7h3Vx2mQgmcHfZjV70VrS5jpU+PEM2jnE2yafgiSXzgBxfw6yuTyCxd9kG2LYynxoRb2p144d56HGy2L8vTiqcyuP9Lx9fNefvKW47iOR11ip6/Fvyudwpv/sqJSp9G2XS4zehdElSuh2Hym3qztdaERFpSLOhzGgUkMzLCifW3+M0iV/FV2NUca3fi5IBX8UBcKRaRR2jud+wy6fDgn9yKrbXmCp8VIeVHBUKErMEfTeLUoA/veuD0mtNh6iwi/uTurfDHUnj2xixu2eLEI1emcHl8/dndz9tZhy+9+aiSp60Jf/vDC3jg+FClT6MsdjdYMBtJYjKoXvsdHc9ie50ZZpFHLJnB+dHCi48MAotdDVYMzEbgjaw/ncltFVX9mUpxsMWGs8PVVYC1r8mGn77njkqfBiFlRwVChKzBbtThebvceM3hZnxzjcBpKpTAP//scu7f81uQ+Xi0Zwo3psMbasVDkmT8+vJkpU+jLBgAE8F4XsFbKZJpCZfGbl68HGnLVr8Xos1lKqg9kNui11SwyTLA4VYHOJbB5bHqCjQBoL3GVOlTIETz2EqfACGV8rojLaodu8Gmz2srtZqcGfZviObm+ZABbKkp/4XCyUEf2muMcJl0OOJxrHgbt0XEkTYHOtsc2NtohVFXWB9IWWOlQTvcFpwc9OF4vxchjW7tr6Wj3oIRXxT//NPL6JlYf9eDkM2IVjbJpmU3qje671P3HcK2uo2zqgkAPz1XffPNS1GppgL9M9kRjbORJPY326DjWEyFEpAhIxRPg2OZglc/F7o0FkSLw4BhjRQIXZ8KwyJyVRloAsD//WUv/t9vriGekvDlp/rxN7+3E39yN7VJImQhWtkkm9ZsRPlxil3tTnz6DYexv9mu+LEraXA2smlyNeexGmhhdX4kgJODPgx5o2iwGrDDbcZYoLS+k5IMNNoNCp1h6dKSrPm+t0aBRWebA45VLlDjKQk6jkFXuxOfeOQqzgxVR9N8QsqFgk2yaV0qohhjPa842IgX72uAwG2sl9aHHrqCZEYjfWjKJJbS1krbqSEfuvuVCWJW6sZQSQwqH9ivpb3WjFODPggciw63GS6TDh6nEfzcy7zOIqLJYUR3vxfxlIR//MklSBr7HRNSSRvrE5GQPD18cQL/8tAVxY+r5d6FxXrq+gx+tUkKgxaaLHEFUWlKBoicxkYvau18luqbyfbUnQol0DsZxmwkiQFvFIdaHTjQYkNaktA/c7Pv7rmRAL5/emTV48VTGQTjN4vPuvu9+F3vFDTWHIYQxVDOJtmUvvxkP5IqdIz+xjODuP+WNk1tU5ZqrQ/NjcwfUz7NQis0N7JSw7GmQcg24V/JWv12f9c7jdcuKEKUZRkMw6BnIoj7v9SNmXACz9vpxrY6M776dD/iKQlHPQ58/a3HYCiw6IsQraOVTbIp/ePL98Ckwht6OJHGJx+9pvhxK+mejrqKFctUUiIto9Yior3GCI0vvBUsEFO3pVMhdDyLaB6N6CtlX5O9qPs12PQAAG8kiXf+zykc+7dH8dGHe/DBH13CdCgBWQYeuTKJzz52I9fv98SAD3/9/fOaS3MgpFTU1J1sWg8cH8Lf/vCC4sc1izye/OvnwG7UKX7sSvmXn13Gl57sL/h+Asdgf5MNl8aDazbQ1yodxyCZkbG7wYLL4xtnROe2OjOuTxU2GUktXR5nQT1sy82o4xBdZWVzLQ02Pe471oIvPzkAX7Sw4P6WLU687Y4t6PI4YVuna0Y8lcF//voqxgNxSLKMA812vPZI84Z6/yHaRBOECMnDTDiBY//2qCqrCLdtdeFrb+3aUIVC/TMRnBv2IxRP4YlrM3js6vSa27F3bq9Bl8eJ//j1VbTXmOCNJDW1opYvj8uIyVBi1a3UaqSlAK+9xoSBmYjGun/etL/JVtRkJwDY02hd1LS/2GN85NX7sG+FDhc/OTeGf/rJpWWdNeosIv7jdQdw5/bakh6bkLVQsElInj7444v4+jODqhz79V2t+LdX7QWzQfegI4k0Tgx4MeyNYsQXw3QogXqbHi1OI2RZxqNXJvFoz3Tu9nsarbg8HqxYs3uzyEPgmIJWmfQ8C4ZlNlSgOa+zzYFTJfTrVNIRjwMn18h/rCSBY2AQOATjhW/1N9j0GFeg0OzFe+vx6Td2Lvpa33QYb/nqCQzORle93ysPNuJlBxqRSEv43GM30FFvwTvu3rqhJpuRyqFgk5A8PX19Bvd98bhqx//7l+7G2+5oV+34WuCLJHFuxI+zw9n/zg37Vw3oDrXawQDgORYnB7woR2oaxzI41GLH+RE/khkZRoGF22aAzSBA5FmkMhIujgVXLBgrZnxkteBYRhO5gQdabJgJJTHq124nhwPNNpwbKXx181i7E8f7l68gG3Qckmkp79//wRY7tteZMRaIIRxPIxRPY9gXRSpT+N+PYYAX7anHu56zDXubbAXfn5B5NBudEI340EOX8byddfBskPnJiXQGV8ZDODvkywaWIwFIsoTB2fwChTMLZnivtJplNwqwGYQ1V2sK1dnqWLRlHE0tblMDAFYDj0MtdvTNRBaN5ExrIBhT2vxUIo5lVgyEyk3Pc5oONAFA5IsrJhz1xcCzzKLn0aEWO65NhlBv1SOVkTCVxwhYGTK+e0qZrhCyDPzi4gQevTKFb7ytC8e2uBQ5LiFroWCTbGqFJu4XSpKB4/2zi4LN+RYo1ebZvlm8/7vnlvUSFVgGDIOCt8evTYbQ1e6EJMlgGQZToTgGZqPwR1PoaneiW4FAqMlhyCs3MRhL43i/FyyTXX1NpCSYRR6StjZ+FBGKp5cF25V0esiHLo8DDMNAkmWk0jL8sSQGFLzgKFVaKq64bcQfQ4vDALPII5bKwB9L4cywHwAQTsbQ7DDAIvIIrVGNL7AMbkwp//dKZiT87Pw4BZukLCjYJJuawySAZxm4zDpMBtdfYSjGfBGNLMv48C968OUn+yFwLEwiD7PIwajj0Wg34GUHGvD83W4Yddp6WUqSjA//4gq++GT/igFlSpLhNAnwRgoL3AOx9KoBZXe/F13tTpwb9pfUE7LBqsdoAY32JXnx6mtXu7Pox9Yii8hXLNCst4qIJDMILcl9ZAB0r5CvubXWhFgqgzF/ZZvrW0QOF0so8llrBv2IL4ajHsea/Tq31pnRM6FOJ4TvnhrG7+2tx23balQ5PiHzKGeTbHrRZBrfOzWCf/rpZVVy2J76m+fCZdJhyBvFC/7z8TVva9JxeOHeerzqUBN21lth0fPQC5Vt8Pz1ZwbwwR9fWvM2TpMOXhVmzTuMApodRlwoohrYbRUxHUqUlBd6qNW+KPisdgdb7Dg7t7JWTvPV7ywDHGlzYtgXQavTBG80CQPPrVrtbdJx2OG25FYDK+Fwqx2nVXwOsEy2eG21AqQGm4hwYnmQrhS9wOLLbz6K27ZSwEkKQzmbhBTAqOPxpls9sBkEfPzXV7G9zoxHrkwpdvxXf/op2A06/NPL96zbsy+SzOAHp0fxg9Ojua/pOBZmPQ/L3H81ZhG3b63B/mYbeidD+J9nB7Gz3or7jrWis80BBgDDMCWPABz2RvH5x/vwnRPD697WbhAUDzbNOg7+aArNjvyixZ31FtgMAmRZRlqSkUhLJa9WX58KF5UioEU2g4BQvPytp1wmHeS5xkaSjFxaw3hg/b9NJJnBmWE/jnocODvkR6rMObTrrToqQZKBWou4arA5Hkhga61JtWBTkoFnb8xSsElURSubhCwQTqTx1af68bFfXVX82ErlIeaDYxm8bH8D/vYlu1Bn0Rd032Rawk/OjeHffn4l7wBya60JN6aV3Z7tbHPg/IgfDqNu3SIKNYOC7XVmXNNIA/RCNdr0aLQbkMxIGPZGVc9RFjgGHW4LjCKPmVACI/6YYmNhDzTbcH4kULZ+nDVmHSLJTFnaXtVb9ZgIrp0uUGcR8yomKtS2OjN+/d67qjKPnFQWrWwSUiSzyOOJazOqHHtGhQ+K1WQkGT86O4afnBtDR70Vd++oxTvv3rriNBJJknF9OozTgz6cHvLhd73TBX+oFdOCZT1XJ0NwW/XLCpIWsuh5bK8z41KRTbfz4TBV7yQWt01fltZNAsvgUJsDV8aCJeU3ruXcSABtLiMcRh1YBqpubQPZ4rJzw+o9rxZqdRnXDTab7HoE4ynFJ3FdnwrjE49cw1/cu50CTqIaWtkkZIkxfwzv/OZpnFMwT8xhFFRfVcrnHN73/B14fVcrfNEUvnl8EKeH/Dgz5Ct5i06tlUWBZXCgxY5wIr2oSKLVaYTIs2VZcXRbREyFE1W5lS7yLLbUmnBF5VGb5Z5IJPIs3FYRQ171WiaZdRwyQNka+u+fW7ldi5r5o390Rzv+9sW7wJaYfkM2D2rqTkiJPvvYDXzkFz2KHrPYxtBK63BbEEmm11wxLMZ2txkOo4DufnVW0hYGNAeb7Tg74lflcVailb9dMQwCB4OOU6WAa57VwCOSyJS1SXyjTY9mpxEZSQbHMkikMvBGk5Ck7OSeUld0LSIHnmPLcpHYYNPDG0mu23mh3ipiQqWuGQDwqkNN+Oj/2r+hxuwS9RQSr9EzipAVvPGWNuh4ZV8eVydD6HBbFD1mMXonQ4oHmgBwfTKMbCMbdXQPeNHZ5sCeRiviafVXm/Y32WAWeRxoqe4pK7FUBjbD8vQJJQVjadRaRFUfY6mxQBzd/V6cGvShu9+LcyMBDHtjGPXHcHLQhzanIe9j6XkWteab59/mNMKg48u2G+E06fJq8TURTMCxQiqMUn54ZhR9CudeEwJQziYhKzKLPG7f6sK1qTBiyQxmFVgViqUkDHkj6HBb0Dup7rZmJRxqtateAFXOWd46nkU4kcbVyTDanMayPa7SyjV33KSrbIuupUyigCa7jAabASlJQt9UBE6zDrVmEQwDeCNJmHQ8OJbBpfEgpsMJ7Gm0gmOAQW8MgVh5Ak0GwOXx/PNcPS4TfFG/aufzzm+ewoPvuBU15vJePJCNjYJNQlbx7uduRyiewpPXZjAZSuCh82Mlz/LeyAHnRisuMOg4mHQcIsmMak211XakrTyBJoCK94Ndaj6AG13QFD6USK85CvXSWBBdHmfZAk0AsBh4BGP55UwbBBYzEXULDfumI/jVpUncd6xV1cchmwttoxOyis42B+IpCV98sh8/PVd6oDlvYcAJZItdjrU7cajVrswDVMipQR8OV/nPMM9tEfFs3yx2FJj2UGPW4UibQzOTh1IZZSuX16LjWXhc1bsCPC9T5jKGUCyNLbWm9W8IYHudBcMqFkXN+9rTAyvmrP/s/Bg+8IML+Mazg/jiE304X8a8aVLdaGWTkDXU2wrrUZmvWErCtakQ7EYBQ94ohrxRdLY5VHmscjo95MfeRqtq7W/KpdVlxGQokRsnmMzICMdTa/YSPdBiQ/9MJFeYsr8pm+vpj6Uw5K3MnO9oMoOudiciiTSGZqOos4pwGHWqtEM6M+SHUWCretW+3qbH+TJPK5KRXU3sbHXg1NDaf5dybR70TobgqVl+4XBlPIhvdQ8t+tpL9jXgT5+zFVtrzZpb3SbaQcEmIWvY4TaDZxmkVaiylWTAv6AA4XqVNg5fyqCx3L1izBdJTIcTmA7f3Lass4hochggsAzAMEilJWRkGf5ocllPxoUjGNtrTHCZdLg4FoBZ5NHiMGLYF8WWWjOujAdVmw6ztDVUaDoNIL/AphjRlITeyRBcJp0iec7l1uowYCJQmVnsaWn9VehIQp3nyUrM4vJCpK52F/77tzcWfe2hC+N46MI4Pv2Gw3jxvoaCHiOVkfBY7zQysowX7qkv6XyJtlGwScgajDoeLz/QiB+eHVW9z2KDTV/WXDG1XBgJoMasw0y4+oINIDtRZbXAfyqUKGqKS/9MBP0z2QA2nkrmfjczYS/MIodj7U6cG/Er3rB7NRyn3BIZzwJ7G+1IzwXdjXZD2SZlKc1fwdff1cn1LzavT0dQb9OXJSD+4ZkRRBJpmEQeLU4DXrC7Hj86M7rq7Yt5Rr3tayfx+NVpiDyLrnYn6ix6/NnztqHNlV9aAakeFGwSso4DLXb89PyYKlNyFlJj9bQS4mkJ+2vMmAlXZ8DhMulwvYyPF05kcLzfC6dJh31NJpwZ8qv6XDDpONxQcBW9s82J4wuCSzXaapXL1ckwGmx6jFdgdTOf/Fo9z6raL3UhSQYevjSR+/cnHrm25u17JkL4vX0NuDgawGd+dwP//Io9cK1S0T40G8UzfTN4/Oo0ACCRlnKT215+sJGCzQ2Igk1C1hBOpPGhn19RPdAEstvoh1rsOFPmnDE1JMrQB1MtlQg0gGwrHm8kiYa5eeYMA/SMhxBWcOtU4BhsrTOvO6lmM2txGivyHPDUmDDqj0HHsct2OBgAe5usSKSlvFZAK+GHZ0bxsgMN+OGZUTx0YRzP9M3i/lvasKXWBJZhwDIM2lxGuK16vOi/Hkd0lclMPz8/jrt31Jb57InaKNgkZA0XRwNI5tFsWSkbZXJHpUdzFqvRrq9YMc+88UA8F+x0tjpwetiHequIBpsBvRMhRIoYn9hg08NmEMAA0HEs9jfZFuWUliJdxor3cqjUhVL/dBiSDDTWLk+n2dVgxYVRbRfdDXmjuPfjj+f+7Y0k8V+PLl8NtRmEVQNNAPjOyWE8f7cb9+52q3KepDIo2CRkDXsardlehWVqJh5Jlq8AQC1WAw+nScBQle2iWw08ttaa0WQ3IBRPo3cihIXr2SwDyDJQzmSHU0M+3Lm9Bk9en8F4IIFtdWboOAZmPY8zQ364TDo4TDoYBR4SZMSSaVj02cKO6VACdVY9grEUeiZCy1brjrUv3v4uVqxMeablkkpXJp1lfvPkxnQEtRYR0wtyg5MbKKDPJy/9fQ+exYdfvR/P21VHFe4bBAWbhKzBohfKGlz4otVZVDPP4zJiYDaKs8Pa36blWaC91gynUYdEOoOrk+Fc3hgAHPU4cGLAhwabiHqbARdHAxB5DltqTWXdhr40FsgVpy0sXKq1iEikJVwZX73N0MAaDcwvjAZgFjmEE8Wv5B1ssVXF37owlc+dbnMZFwWbdpXHjSqty+OEL5pc1g0hX8F4Gu964DQYBthZb8UHX7obt251KXyWpJw2xp4dISqKJjMwCBz2N9vAs+o2upsIxCEoWClcbsPeKNpX6M+nJRY9j531FjAMg2uTYRzv9+LscGDZ1t7VyTAOt9oxE07izJAfqYyMcCKteleChXgW8EZWXgmaDiVKSleIJjOotxbfR9YosDi3AXM/Y6nK5xuzSxpqnh32Yd9c39ZqcH06BFaB90pZzvb2fO93zmLcH0PPRBAPXxxHIJrC+RE/PvCD8/jiE324OhmCPPfClGU597+JdjCyxv4qwWAQNpsNgUAAVqu10qdDCP73g+fwlts9+MAPLiCZllRtWG03CrCIPIaruKLXILDY4bZoNhAReQZ6gS+6zZRFz6vWF3OprbWmNRvJl8Ii8ogk0yVNxmqy6yHJ2RQDgMGov3qftwsdaXPgxnS4YrnH8zsES22rM8MscppeTe5wW3BjOgyWZSBJEpRKee/yONC9xuhVt1WEyHOYCsXBsyxe39WCd9y9lWa8q6iQeI2CTULWEU6kMRGILUp+V8N2txkjvhhiRRSAaI3dKCxqWK81O+stJc07399sQyotwTQXsOl5FmcUDgCyrZCsePrGrCrdEDiWQb1Vr0iAWGPWQZJRtrY85aBUTmuhtrvNuLZOxfmeRisuaXBKl0nHQeDZ3Gv/cKsd3nASAyUW3bU5s0MQCr0wMggc/vA2D/74ri1wmnQlnQNZrpB4jbbRCVmHWeRVr1BushswFUxsiEATANiiWjyXT7DE5t0XRgO4MhHCyUEfroyHcHEsCLclu4Kyrc4Mu1GAQeDQaNcXNSd9S40pO13l6kzB89nzlZGyaQEdbnNJx2myG5CR5A0VaLIMcLVCIzcN/PoFMSadNsstttSaFl1knh7yY8AbRa1FRFe7E61OQ1HHtRmFolbgY6kMPvvYDdz577/Bx37ZC3+V58RXM20+YwnRmGGvetuDdRYRkixX5fQgt0WEwLPLGnkbdCxQ2Q5Ca0qkpZJGNi7dD0plZDQ5DJgMJaDjbq7sxPyZRYUeC7EMcLDFjmAshRszkdwx22tMmA4nclv1k0H1ej4GYilEk2kcbrXj9JC/4Pu7TDoYdNyG2T6fJ/JcxbbQL48H1v17XBkP4Fi7E7ORpKbG3IqrBMrToUTudVBrEcGzTN69TBtselwosU1XJJnBp357HV95qh+dHif2NVmxt9GGQ60O1NuKz1sm+aNgk5A8uMw6iDyLhAIJSLa5FjsCxyIjy7g2GdZ8oFljzgYVC4NulgHMeh4ZSYbbIiIYT2FPow0j/hhaHEaM+ivTHD0fs5EkttWVtqK3VFqSsb3OjMvji7c3D7U6Fo1v3FKbnZNuEDg8Plf9bhY5bK01g2EYXBkPILGg/Y7HZVJ19GcqI+P0kL/gbWMG2b6wWgp2lCJVMLtMktfvUxuamzoFADvc5oo3ehd5BjvclrxaxE2HEuhsc2A2nEByLj2kxWFArUWEwLGIJjPQCyxOzOVnNtoNijXZjyQzePzqdG5y0S1bnPjW228Bw2h7J2YjoGCTkDw8b6cbexqtRa3+LLW9Lr83Za1wzm1hJVISTDoOexqtiCQzCMXTi4pXWAa5n0vUeEW9QWCh55XNIroyHlz2odXlcS4KNLvaHeju96FvOoLdDTdznMKJzKoFVeXa+jve78WhVjsujgbyyhE9XMLKsNbta7KV/TU6v9J9eTyISAFTo5JpCZ1tDkiSjIwsIyPJSEsy4qkMBtdofaWk/c32XHCYj1ODPggcg1qLiFA8hWFfbFlRZEe9BQaBwymV/g5mkccnX3+IAs0yoWCTkDz8x696cVahMZJD3ijcVhGTwZW3V7WmwW7IFSPoBXbVitD5nKpSi2/UxrOAzaDDY9dmsL/ZpljPzGyAdjNIM+g4nBvJ/q72N9uQzkjo7s/++2CLDbN5rlZGy9iK58yQH1trTbliitUCiEMtdpwb8ZftvMqBZYAjHidC8VRFLgaPem6uLMdT+b83DMxGV+2nquTzey3FdM9IZeRVU0wAoFfl95A/uXsL6iy0hV4uFGwSkoeB2cIrIVczFUrgqMeh+WDTrOOws9GKkwsCjnge02IySv2iVBSIZ7cp1ayYt4g8pkIJdNRbFn3g37W9Bom0hEa7AY12A2Rkm7WvVmDjtuoxVsaUhBvTEdyYjmB3w8qFSUfasiua2upjUrrDS9IdNoLJMs14b3EYMFGBefLFshkEvO2OLZU+jU2Fgk1SFEmSEYqnYTNW12SLYilZALGvyYob09rNc2MAHPE4cHUyvCjQzNe1qTAOttggcCwkCRj0RnI5h26LiGgqU7Y+lStJS0CbTY8b0xEMeaMlFQqtZTaSxFGPE/0zN//WRz2OXJ7mQjvcZoTiqRW3rysVvE+FEmCweJ7ODrd5QwaaQOVHQqpRZFVn1WNyjdVDpZwc8OFYuxM9EyHN558DwCsPNsKgozGY5UStj8i64qkM3vjF47ncmaHZKP7Pjy7i9n//DYJx7b+xlGrYG1WkDUqr04AmhwEXRoOrToUp1eFWO2otIrbWmtBkL7zNyN5GK1qcRpwY8JX0oXF2OIATAz6cGvJhJpxEi8OA/c02VQpzCtXhNi9qZTXsi8IiKv/Bk5FknBz05gJtjmXQM75yb8Srk2HUW/U41u5E45Lq2NEKNfifCSdxqNUOg3DzY4JhmA0ZaAJAWoVepoUY8cVg0Su7/jMwq85AgKVkZHN+46k0jnoc2F7h1/h6XnukpdKnsOnQyuYmNhGIo84irjpWLBBL4dvdQ/jV5UmcGvThJfsbAADv+MYpzIQTMOo4cBs8uTqRzuDdD5wueXXJbRHhi6ZKWtGziBy21JpxYyqM8Fw/TovIob3GDL2Ow2w4kStgmg4l0GjXwyJyMOt5+GNpNNsNcJp0CMXTuDYZQmrBz9TqNMCqF3BRpUbRCwsArk2GYTPwCMTKu7rpNOnQbDfg/JI2KlOhBI60OVTJ05Nl5FYHdTyL+BrdDOZ/R80OAzwuI2wGAedGAmhyGDBboR6Wp4f8qLOI2NtkhI5n8dT12YqcRzkoHegVQy9wiq76NzsMuDJevvzpRFrGiQEfjrQ5Fn39qMeBUX+srOkgq9nVYMXeKhr9uVFU/tVFKkKSZLz96ydxfSqMbXVmvPf523HHtlpwLINfX57Ej86M4jc9U4u2lhKpDN785W6E5iolk2kJl8eDkCQZ16fDuK+rdcNV9ok8h++/8za84D8fR99M8asEbTWmkvPBdjfacLzfC73AYm+jFaFEGoOz0WXB07wxfxytTiOcJh3GA35cW9CiRsez2FNvgUnkIcsyTg36IMnlWUELJ9LY12TFhdHyTUBxGnXgWWbV39W4ir0s9879rLFkBhY9jya7DnUWEZfHgwgnFhf/NNkNi3qWdrY5Kj7neSqUwFQogf3NG/sDWgu5xkpvQacyMniWQbqMP5vTqFuUlmLQcRiajcJTY8J0KKHKNKxCvO5Ic0Uff7OicZWbUDoj4fNP9OGjD/fmvuYwCvj31+zHT8+P46fnxpbd50CzDaF4elHAVWMWsa/Jit/2TmNPoxU/efcd4FZZJa12f/vDC3jg+FBJx6i3ipCBoguDDrTYcE7DM5ELVc5xgOvNVd7dYF3WH1MpLQ4DIokMvEtaGO1utMIfTYJjGHAsA5ZhMBNOILhkZauz1Y5TCrTcKtZRjwP+aArjgdiy4HijaK8xob+Ei0kltDqNqkwq6/I40T1Q3sKn+df2UY8DZ4f9uQCzvcaEqWAckQpNStvhNuPH77qD8jUVUki8Riubm9BrPvsMzi1p4+OLpvDH3zi16n36piO5Fc159TYRv+2dxpYaE37wp7dt2EATAGoUmKs7ESy8Ct1tEdHmMiGeyqjeCqTc5j+M5rf11Vrw4Fmgf51+g2YVt1CHfTG0OAwAdIsCTovI43IeaQtXKvx3T6SlRaviG1Eyne0hW6kgCADcVlGVYLN7INs/9cyQH012AwSOWbVVklKuTYVxpM2BCyOLe7b2z0Sws96CG9Phsq5wtjqNeMfdW/DazhboFO6vS/JDweYmZC3ig3VpoLmrwQppboe9byaCP/xyN+7eUQeznsf2OjNu2eJS4lQ1Q+CUeYM6MeBDk92AJrsBDJOdVDI0G4XNKMBh1GHEH8sVhOyst6B/JoLJMq9KlNN8H8dWpxHToThiebRWWshl0qG9xoQr48EVA4UOd3Yqz3p9P9WcGKPnWdRYRLQ6OZwfDeRy8lJ5Vj9HkxkILLMox7ZcbAYBIyoEQFoz6o+hwaZHnVVfsRXOqIqB7qXRAFqchtwEsM42Oy6PhRBTqYerN5JctZVXz0QIh1rsOKNQ3+J8/OULO/CyA41lezyyHG2jb0JToThe+amnMFZCX7R6qx4Tq+S5NdkNeOpvnlv0sbXoNz2TeOtXT6r+OAyyeXosw+DKeHBZkL+RzU/XyYfDKMBp0sFp0uHEgA/NDsOi6nt/NAW9wK46lWcpgWOWjZUsVZNdj1qLiCvjodyY0zqLCLdVxIXRIDrbHHlPR3GZdBUpEtpZb4E3ksRUGdrnaIFRx6HVaSz7UIIjHkdRbcZK0WAT0eI0QZZlDHtjq76fq6XOIqr+vPrnV+xBi8OI27a5Vp3bTopH2+gbnD+ahFHHr7gdkMpIa67CybKMy2NBPHdXHf7n2eJzENd6Y3r+bnfRx9Wqu7bX4o23tJb0O8uHjOzIx0abflMFmgDybqmzpcaEEX8MvmgkNy5zxBdbVFhTqFRGxsXRAFgGijXvr7PqcWZJruVUKIFYKoNmhwGRRHpZ3irDAA1WPVLSzekqDAOEE5VpMdYzEYLAMZrIaSyHaDJTkUKhvuny/27HAwmMB7LPsZ31lrIGm3UWUfWLJ5Fn8aZbPao+BskfBZtVIiPJODfixycfvYbHr07jyb9+LhqX9FHsn4ngM7+7jiMeJ2RZRo1ZxPN2LQ78UhkZb/vaSVXfUP/n2UHscFtw37FW1R5DCZIkr9r2aSmeY/Evr9iLcX8cj/ZMqXxm2RGFx9qdODHgVSz40bK9SyYVLaXnWWyrM4PnWHgjSSTXaCFUrJ31llzrKCUMr7L9HIqnF7W32dWQnQHti6Yw6otiLBCH3SjALPIIJ9LobCv/qtdCqYxc0Kzualeu3pQLba01rbrtXA49EyEc9TgKmm9eimaHQfVVzTu316p6fFIYCjY1KpHO4MyQH7FUBnsarWAZBq/+9NO571+bCi8LNv/i22dwbiSAB0+O5L72+q4W3NNRh6HZKN5+1xboeBb7m23LVlyUlJZk/O0PL6DJYcDdO5R/wcdTGeiFwrdEYskMvn1iCJfGgrg0FsS2OjP+3+sP5X1/hmHwwj31ZQk2/dEUjvd70eG2IBBPVdUouGLIyG6NexeMj3RbRLTVmBCKp3B9KqxaD1AAsBsFRQPNvU1WXMyztdNKfRD90VTuw39AAyuKU6EEGmx6jKv4PHSZdEikMthRb4EkA33TYeh4FkYdD4OOg15gMRVMqHoOAMAyS+cmqe/UoA8Wka/obsaJAR/2N9vAALg8HlStgGd/k03R19pKnr/bjf/8/YOqPgYpDAWbFTQdSiAYT2Fr7eJpC49fncb7Hjy7aPLI0ia5Pz47ilu3uHBq0Ieudif6psPLWqYAwLe6h/Gt7mE0O/QIxVNwmUVEy9S+5M++dQb/fd9h3LG9RrFjxlMZ/O/vnsMHfm8nmh3GvO/3rm+expkh36I8VUcRozZfe6QZW2pN+N6pEXz7xHDB9y9U72QI9VYRAsdUvD+dmi6NBbGn0YpgPIW0lF1lHPRGyzar2h9NKVK00OY0wB9L5x1oruXEgG/ub6+N6lmbQVAt0Fu4qrY8ELm54tfV7lTkHBxGATvcFsyGE7i+YAubQbY13LY6M66XsQJfkgGbUah46sz5uRznXQ0WDMxGEVOhaCms8s/43J11+MwbDoPXyOuGZFGwWWapjISrkyF87rE+PHRhHBlJxmffeBgv2tsAWZYRTqTx598+A9+CFZ6MJC/rR/j09Vm85avdMAgcbt3qwoXRwJpj7WQZ+ORvrqv2c60kEEvhD7/SjX942e6ic2eiyTR0HAueY+GLJPHub53GU9dnIbAMPvEH669KSpKMj/2qF49cmcwVacz751fsLfh8GIbBEY8Te5ts2NVghd0o4KHz4/jV5cmCj5Uvl1nERJG9OavJpbEgbAYB+5qsODXkV+WDbi1nhv0lBxkus4hBr7LN8f0amTU9qML2stsiosFuwI3p/H7nStWzNtj0K/Z4lQFk5GxgXW6ihlryXBkPYWutCQaBU3xHwSzyqLWIuZxkpVj0PN5+5xb88V1bKNDUIAo2y+zRK5N473fOLWo5MeKL4YtP9OFTv72OJrsBbS4TfFH/mseZCMYxEYyDYYCPPtyD5+92L5r2s1Sl1sQykowP/vgSXrC7HvVLZj6v54dnRvA337+AnfUW/N6+Bnz+8T54I0k02PT42xfvwsMXJ7Cz3gJPjSl3n0Q6g8evzuDyWBAsA+xrtuHTv7ux4vEb8jyfgZkwZDBotOsh8hxSGQnXJsNgGeCxq9NodhhRYxYxE1YnIBxUuSeelgRiKdVWVPKRkWRY9HzRIwPXeg0WqtGuRzItKTq+sBQGgUe9TVCsUOhgix0XRwOYLCDoYBWYUNbiMEAUOBxssePCiH/F/q6VaBmstWrp+eK7FocBDTZ9dgqWAq2Szo8GcNTjUDzY/OQfHMJzdtYpekyiHAo2VfTbnilcmcheFcZTEo73za54Nf2vD13J/W9/tLBVDFkGPv27G3js6vSat8tUeAu2e8CLlxfY58yqF5CWZJwbCSxqYfP3L92Nrz8ziE/99jr+7VX7FgWb7/3OWfz8wkTu3/9936FVmzV/6OdX8MGX7l4x/zOVkXB+JIBPPHIV4Xg6t71aZxERiKWWrZKqaXuduaw96SqtkoUS/TMRuEy6osdpGgXl3lLdK1SzV5I3moQ3mlRkIk1nqwNnhn0FF78pUZU/P4MeAPY323JbxwtdHAvCbRELCoRLxXPaHIox//syixy62p0Y9kYxHUpgS60J/miqqEIfpTsb/K/OZgo0NY6CTRXEUxmcHwlA4Fh88tFriBfYqLoYl9bZ6pgMJdbsjam2vjy3yQBgMhjHhx66gp+sMDYTAP70m6dz//srT/Xj3t11MIs8vtU9vOzD+aEL43jtkRZ89emBZcd54PgQfnB6BAdb7DDpeLAsg1RGwtBsFEPeaG6esFFgYdRxiCYzFek3KGhoe60coskMttaacisr5TYbSWI2kkRXu7OInFHlLuqiGq0AH/ZFcdTjQCyZKWqLtZSekiZRgBLlOyLPYme9ZdWuHLFkBg6DgGaHoaSWWoVQs6m7EsKJTO71wLPA1ckwOCb79zw/Esi7Q4TSbbQYBvi7l+xS7HhEHRRsqmDMH8Pvf/4ZCCyrqavVGrMOk6F43v0MlfTb3mm8ZF8Dtrstq94mnEjj47+6iu+cGMp7bNy1qTAevjiBZFrCiC+2rHjgsd5pfOq+QxA4Bt88PrTsDT2ekvBs39oBRTQllXWO91IbvRJ9JUZd5d+aivm9Mwps885TckteKdvqzPCGkzgx4IPLpINZ5Aqal17qqmh3vxftNUboOA69k8U1Xj/QYkPPeHDdhv9jgTjMIo8ujxOnh7xQczOjku8vxZj/XWRk4ORcFfulsWBeLfVqLaKiwWa7ywS7sfRxwkRdNEFIAYl0Bl95agBPXptBMi3hVYebMOKL4r9/u3KuYCVV8k1N5Fm84+6tePNtHjhXmDX+rgdO46Hz4wUfV8ezSKYlcCyz4pvdO+7egnaXCZ989FrRU5NsBh7xlFTW7XMg2ybk/Gh+U3A2mmNzK4uVfIM60ubAyTyn/ACAx2VUbO50jVmX60ihBRaRh8Cxi+a7b68zw6Ln121lI/IMDjTb0a1gH8fONgf6psOLiinz0eVxFHwe9TY9jAKHPhXaUCn5nKmkw632dZ8HNgMPkecU3SG6fZsL3/yjWxQ7HslfIfHa5tqfU8H1qTCe9x+P4SO/6MGT12fQPeDFB35wAZ9ZpSil0o73e7G7oTJBfCIt4ZOPXsPtH/kNLi/Zfvvx2dGiAk0Aue2b1a6qv3V8CMfaXSu2hspXIJbGjjVWZdVg1nEIJ5XfSu1qd2J/s60iRRCFON7vxdY6Myxi5QonTg76lrUdW+pgix3H5n6nSgUNTqOgqUATADrqLYsCTSC7sxBLZcAA2FZnQle7E0c8y39fB1sKD/DWc2rQh1RGRpfHgUKeysVMrpkIxDHqj+Fwq73g+64nnEij1iIqftxyOz3kx9EV/vbzjnqyY3iVTkVSomiMqK/ye1VVTJZl/MNPLq6Y06PlqS8WfWX/7DaDgDaXEdcmQ/jV5UkEYil8+cl+1R4vGE/jOyeH8Of3bsOvLk0WPSXDIOR3bWYWeWypNSGWzKB/JpLL/SyEy6SDRc+rMsZuYCaCqVACTpMOJpHDsMKtepR0fSqMHW4zUrNRxMu8qjzv1JAPRoFFdJXc6yFvBN6Isu2JttSa4S1gRVVtJh23apA2MBuF26bH9akIgAgYJrtdfn06nCv2Ums0YTiRRveAL7e1Pjgbwf4WGy6MBOG2iqiz6OdegxL0AgeRZyHyXFFjSRNpKRdQ9U6GEIwpcyE4E05CxzHY12TDhSrfxTgx4Fu0e8YxgMUgoM1pVG060Y2pMDKSDE7rV8+bHAWbJXjq+iyeuj5b6dMoWKUTJyaCcbz96yfxe/sa8H9/2VuWx7wxHcHveqdLardxbsSfV3+49hpjrsLVKLDY02iFyHMYmI3kdVVv0nEQeFbRrbU6i4h6qx56HZdL8vdGkqgxm9e5Z+VdnQyvWjVcDrIMWPQCoqnlfzu1pupoKV9z+1zv0dXy7GLJzKJWVbKMXF6mQcehxqxTpUfnQv0z0dzjdfdng5qB2SgGZqPobHPg1KAPgDIXBCcGstN+jrU7cXrIp8iwhWRGhj7Pi1ktE3kGGUnCPTtqcWEsgNlwEv5oCv6oeq/dmUgSE8E4mpZM1CPaQsFmCR7tUa+Rt1psBh6Xx9Ub+5evp2/MFpQLV6pfL2i6XmxVfiIto8VhWDXYrLOIaHMtvoKPpqRcIYJJx6Gr3YHh2SjG55q0cwywq8EKvcAhnsogkZbQYNPj8WszBZ9fV7sTqYwEnmXAMAxmwwn0zUTQ4jBiPBBbMdBVom9eOVS61+hqq2CNdoMqwaaWZpE7Tbqi82ZjyUxZV85X6s+qxopXKJHG8X4vnCYBzQ4jOJZBKJ4uberQ3C+5xWFArUWEN5KsqlzOJrsBPMfg5KAfAHIDGoppIZYvu1HA/7ztGAWaVYCCzTnJtIRHr0yixWnE3iZbXvc50ubEt7uHq+YDGwB21ls1U/WYb6sMpUklLO2eHvKjq92JM0tWNObb5Ky1chlJZtDd74OOZ6HjWZhFHtFkeln7mBvTYWypNRW0hX7U41ixTY9F5DATiq+6+mI3CBhhYhVf7V5Pg02PQAUn6bTXmjC9QtN+tfLFVur9Wgk1Zh0mK9QuTQlmkccNFcdOeiMpeCPZi8kdbnNR2/PzZGSLns4O+3N9QBeO8dSyg812XJ0KLer2IckyrhbZMSBfrzzYlPfnNaksCjYBnBv245OPXsOjPVOotYj42XvugNu6/nSZSCKdbW2kjWlyeQnF0+iot6B3Qt03Aa1SYv51d78Xe5uskCQZOp5FRpIL7seYTEvwplfOY5Pk7IfkQh6XEW5rNuCKJjMY8kbRZDeg3qZHMp1Z9QMptE5bmgujwYI/0HiWwdZaM2xGAYlUBoFYCjXm7EqMGtW6ADATToBnoWr7mbV093vR1e7A5dEgwgs+UNWaGmXQSLC5pcZccgP3StrdaC2iV2pxrk6Gsa/JhquTQSTS60ec8yuY8ZQEs55f8TzLuSq8v8kGHc9iYDZSUHHaav1oLXoeY351V+jbFwz0INpGrY+QLfTpm4ngJ2fH8ObbPHCs0JZnqVRGwr5//GVZGrYrjWMAnmPL3san0qwGHgyYiq6QCSyDVJ5LH/uarOBYFqP+GPQ8m1vtcJl0kGS54JYva9nTaIWOZ9edWLOvyYpwIrNq/l5xjdDzU2gbIjVY9Dx2N1gRiKVgEnlcnwqr8nzSyopWo12PMX/1rmzuarBgMhCHV8HXynp2uM0YD8TXHDPa5XHi7Ih/3d2dQ6121adIsQxw1HOzqKeQx1zrNdnqNGLIq14aQJ1FxGN/+RwYdNq4MNuMConXaGUT2UbMW2vNeO/zd+R9n9lwUpFAU8ezsBkExefErsVtq+4PkGLtqLNUPFgx6/m8g8TVcp3UqOydn0C11uSem4UWq7uiYj7wNRW3Q/MViqcXpaHYDIIqj5NYo29sObkt1f1ecWU8BKueL+skoKuTYbQ6jdDzXC714kCzDZPBBKLJNDiWyWu12KDjMBEo/pzz6alcY9bBZRIX3W69xJDOVjuGfTG0Oo04PbT6+4HaXU9etLeeAs0qQsFmkexGARY9v+bV62qcJh221ppgMwgY8kZxdbI8H6J1FhEMkw2UN6N0hefDA9lWLVq2dPseAIw6DltrzXnlX5nF4l4T+dhSY9LcjPgmuzq5pMPeKFwmXUXGoy6kFzhFxkNWUjCeRp1VX1I+ZaGGvFHcvtWFLbUmhBPpdacVrcRp1K1Y8LSSpTsmB5ptON7vxVGPA9enso3vzSKHSCKD/S02iBwLhmHQOxlaNonp9JAfeoGF26qH3SBA4FicG/EjlZFxuNWOU0N+GARu3Qt3o8qB4D7K1awqFGwWSS9w+P0jLfhinv0hdRyLN9/uwf23tKHWIuLfH+7BN54ZLKoHY7F0HIuZSGLTbZ/PG/ZVvrIzlZFhNwrwl3FbrxA8t7z9isusy7v/n1XPY1yFLidOkw7nRvzKH7hEw94oWpwGRXPrdjdYMOqPVzzQ9LiMODfswxGNbOmX4vpUGIdb7bg2FVbtYmihNqcBZ4b9Jc07H/XHIHAMDrfaEYilVt1xAIDdTVak0jKS6QzCiQyuzOXkz//dWCY7ajSVkXFueP0XaDwlYXA2isG5f1v1PPY1mXNBcz5FsWo3W6/Lo66CaAcFm0XKSHLeLU/u3F6Df3r5HmypNSMjyfjjr5/Eoz1TKp/hciP+GEw6Lq+xYhvRbCSJOotY8Q9xp0mnqWDTILBodZpy217b6kzwRlKw6nnUmMWCUg/UuIyxGQTYDEKuQbiWhBIZ7GzQKxZsbq8zo38mqmqHC4YBWhxGpDMSvNFsOpBB4NBo18Nu1IFjGfgiSbAMk2tkX0iusVadHsr2yc1kpFUb9Cul3mbAoALPiVRGxukhP3a41+6HK0lYs6WdJANn8wgyVxOMpwv+zFA7BaRnPIi7d9Sq+hhEORRsFoljmUWrPX9wtAVGHY8fnR2FN5LEoVY7Xn+0FUfbnfC4jGDmrvL+5WeXc4GmwDE41OKA1SBgJpzA2TJsEUaSGdUqaKtBnbXywaZlha3qSrGIHAw6ftlWGoCi+vwpmaIh8iz2NdkwMBtZtSBJC5RaKWtzGjERjKsSaLpMOrTXmsCCgTeamJv2kw0i52ewZ1fOlv+eTw/5IcsyPC4j9AKHniruZDEdSuCox4GzQ35Vg+f57W+RZyGj9DZv06EEjrU7IckyGDCYXzSUZcAfS2py8tDVKXWfJ7/tncI77t6q6mMQ5WjnU68K/dcfHMST12aQkWW85nAzWpxG/J+X7II/moTTpMPveqdxvG82157heN8sJoNxvOe52wAA77xnK1iGwece68N/PnK1bOc9HoiXNX9JK456HEXlTilNWGGrulJ21FvXLfophDeSxPY6c9HFPGaRh6fGCIPA4cp4sOIFXfm4PhVatwClyWGAtMZuSINNRDiRVi/ftda04lZ4SpLXbXMzv0I1MBsFw2ijK0ApTgz4YNHz2O8249RcA3KlhRJpOE06pCUJ0US65JZrvmhKM/2R87Wt1ozTQ37VPmu00h6M5IeCzRIcanXgUKtj0dc4loHLLEKWZXz0l7144y2tue8d2+LCsS2uRbe/PhVGNJnGndtrcH4kgGA8pXqD7VRGruj4v0oZ8kYr1kh+kQ0+wjctyXCahKLmhW+vM2uuCGg9aQmYDsXXLBjUcSymI/HcKuL+JhtEgcWN6Qi8kSQsekHVQkFfVJkVZ1kGzgz7sbPejJ6JyncHKFYonla16ql/JgKDwCI2t11/eTygiRSecjo95AczF2gqfYFyrN2Jf3r5XsWOR9RHwaZKfNFUrg2MJMmIzjW/TqQyaK8x5bbVmx0GvPWOdoTiabhMOvymZwpP3ZjBD06Pqnp+5UiS1xqjjgdQ2Td7gWMqPnpxobgKW7b9MxFY9Hxu2y8QS+UdSKkxWrAcDjQ7lrWzYRlgh9sCjmVyraWanUa0OI24MOJHWsrmyzbZDUilJQgco8ic7ZXMb5srISPJmA4l4TTq4FUoiK0EVuXnWmxBXmgiLaPept9UwSaA3MJJz0QIh1rtSKUljPnjJT1v2lxGPPD2W6r2vWKzoqbuCpMkGX/5vfOwGQR8+alspfrSbYSX7G9As8OAZ2/M4vxoALKcLSICgAujgbIVj2yrM5c2y1fDjngcGPXF0Gg3IBxPw6znVNsyK0SXx6mpiSwel1H1+cuFrGpwLAMWqLpilCZH9nnW5jRCr+MQiqcwMBNZFHCsR4npVqtpcRhyQwGUsrPegquToapOxyl3seSxdidC8TRiqdUHI2xEC4c9sAywtbb4VJuX7m/Ap+47rOTpkSJRU/cKiybTmArFsaXGhL6ZyLI344fOjy+7zxPXZsp0djdFkxtvdZMBsK/ZhpNz+Wn5dgwol0pOL1pJOc5ndi6P88Z0eN3ARJZlpKoweGmxG/BsvxfnSyjU4Dn1VmrqbXrFg82eiZDmLp4KtVKrLzUtzLtca4DCRrK11rRoqpgkZztyFKueWh5VJQo2FcayDD7zxk4AwOWxIF78yScAZNu3bK01aablUIfbjN4yNZMvBx3HwGHSYTKY0HQuqs2ozsSZYvmiKdUn1cyv4FhEDlvrLNBxLDKynO3oMBJYVH0tyYDNwCMQq54LIadJwAkFAq7B2WwjdzUmRKmVNjMTqe5tYamCy7Im3cb/+F2tOOj8aADH2p24MR0uaA47ANxJ7Y6qknbKYjegB08OAwD0Aotf/Pmd+MGf3o4vvOkIDjTbsLPeUtFzE/mNVcm3w23BZFD7H3yDGtw6s6o8Vm5eKJHB2WE/uge8ODXoQ3e/d8X+gdvrKvvaKBTLMFAi1XIqlEAincGRNsf6Ny7A3iarau2KAhrqF1uMUpqul8obSWJb3dr9M6vdUY9zxXSBWDKD4/1eBGIpHGlzoNlhyOt4d+2oxV1zKWekulCwqaIX7HEDAF7b2YJGe/bF9Pzdbvz43Xfgs2/sxK1bXBVr3xBSYGyioOK2XyHqLGLVTEWaDCU083sDsjmb+c5qV8O5kQAOtdgXfe30kA82Q/Ws+syEk3AotGIdTmRwctCHrnZnyccy6bjs6pGKednhRBoaejoXzB+rXIHTiD+GvunsZKONqM4i4tw6OcipjIyTgz6M+GI40GLHtlrTqrettYj4+OsO5IprSXWhYFNF2+sssIg83n7nlmXf89SY8K0/vgXn/uEFuHVJO6RyKPXD8Vi7E+mMDJbJHqvLU/qHY7GaHIaik80rId+reLU5jYLq84vzcW0qtGilv81lrOiKUzHsxuJz0FbiVWB7utFuwPF+b0FFSoVgGaDDbVFkVbdSKj3JS5I3Zu48kM2tjBewCHBu2I/r0xE02pfnZDIM8InfP4gas6jkKZIyomBTRb5oEp+9vxOtLuOqt9HxLO7cUZ5tAZ7Nztnd3ZBtx3KkzYGDLXbsabTgqKewrbtRfwwysm+WvmgK3QNe6AU29zjlNOZXtvBBbXaDsoFJMQ632pGWZFwer/w0mHAig56JEPY2WbG3yYo6i171XrNKsYg8OlsdilcWO42lfajaDILqF2AmkYdULX+oVVQ6nckgsJiogvSfQh1ssRdVLMexDPwr5Cy/9fZ23L6Nts+rWfXsVVWhHW4LdrjXfzN7+YFGfO6xPtUqg50mAdvrLLg2FV61QGlnvQUsk22HpOc56AVuWZUpw2S3Rtpci6sL5+1rsiGRlnBxNIB6q4gGuwFniiiI2lmfLSJJZiSkMhI4loFZ5Fc89842h6ITcMohEK/sakqXx4HuFabJVNrF0ZuznbfVmWEzCIinsoGo2nOWi9Fg0yMQTeLUkHK/S4PAot6W38q3QeDQMRcsLR11215jwmw4gRF/TLXAPRRP4+JYEPuarLgxFUY0JWFbnRlGHafpIr2FKj3kodFu2HAV6QLHFL0AIMsy6qwGjPpii9qfvXhfvVKnRyqEgk0NaHYYcef2GvxshZZIpTDoOOyut+DciH/dUWc9EyEILLOo+fZ2txk2vYBYKgNfNInJQByTwcSqhTgLx+FNBBOYCCaws94CkWcx7IvmPVGG55gVr4oX9gXV8yx2NSo7arEcBJapeH+9tAYDt6UW9n891Gov6qJFbS1Og+KttfY129Hd7133OSLyLJodBpwd9mP7XJGJ06TDtjozfJFELvi0GXjscFtwYTSAuErb6RdGg2i06bHPaczlITqMQkVzgfMVqXC6hsssbrhg027UFd28XpKzY1GbHNmAE8i+zvY02pQ8RVIBFGxqhBrVovsabQX1wFvaSPuaAq2R5n8ujsmuWM7/e3udGQ6jDv5Yctl0mdWKfQwCiwabHg02Pfqmw1U5BSklyRUfW1fu3oLFanEaYNLxuUBT5FkcaLaDYaCJOdEDM8o3wx/zx3C41Q6WZZDJyIinM9DzLHiOBcswuW3rqWA8t00+MBPJNW1fuuMQiKVxYsC3qKm2GsYCcYwtCLy31ZlXnMWuJRY9j6HZygV6Oo7JTZnbSKZDiUXv9cUY9cVwrN2JZDqDN93qgZ7moFc9CjbLJJ2R0DMRwplhP84M+XB22A9JkvGcnXWot+pVmeSjxijCYmXkbLAocAx21VtzK5cr5YqGVwkiL8xts86vJtkM2vn5CuEyF3/lr4TxgPZzXI+0ORCMp6AXWHS2OcCxDAZnIuge8KJWA0UCaqVvjPhiGCmw+XpKktdt2D5d5ufbiQGf5tI1utqd6J0IotYiwmUSEU9lcK6C2/073BZcHNt4wSbPMggpkCo0f0H5ufspV3MjoGBTJROBeC6oPDPkx/lR/4rbWF95akC1c/BFk5razjozHECDTVwzcXxPozU3R3o9g94YdjdYNFHkUgizWNmXXTqj/TZRKUnCjanwipXOs5EEbAahrNOYjDoO2+vMCCfSsBt0uFTCpKBK6J+JlP13dmE0iFqziOlw5Qtg2mtu5pkHYmlcR+W3rmOpTMV3OdRwuNWh2FQpvcCijiYGbQgUbCogkkjja88MgGcZnBny4+ywXxNjEod9sdwHZEoj/UnGA4vfWBeeVYfbgv7pwlZ4r02F57bXDejTYMP0ldyYiqgyqzpfrU7Tsr+DlhxosUHkuexkoxWet5KcrVrd32yDJMuLCouU0OVxIiVJ0HEsEuns/7846l+wClYdz7OlOtyWso6WjKUy2Flv0USwaRC0lzpyYzoCl0mHFqcBw17t7zbkw2nS4fSQcs+xeEpCRspOGyPVraRX4Ec+8hEwDIO/+Iu/yH1tYmIC999/P+rr62EymXD48GF8//vfL/U8Ne3Bk8P46MO9+Lef9+AXFyc0EWjOuzYVxqFWZSeSqGFPoxWDsxFECyxiSGVkNDkMmhsDuRZvNIkGe/l6bQosg10NFnS1O7Gn0aqJfMe1DM1G0d3vRXKNCyRvJInzIwH0TYVRZ1FuW/2oJ7sqc2YoW1Q3P/Go0OelFp0c9Ja9H+6ZYT92N1R+ItTl8RDaa1ZvGF4ps5EkwvE06m0bY/VuW50ZShf4j/iUz40m5Vd0sHnixAl87nOfw/79+xd9/U1vehN6e3vxk5/8BBcuXMCrX/1qvO51r8OZM2dKPlmt8tSY8IZjrWhxGmDUcbl+k1oxFdRO8LuUN5zEoVY7Lo0FC2oADAD7mqxwmnS4PhXRZLXyWuQy9ic82GrHlfEQuvu9eacoVNJ2txnmPJvNR1MSrHq+6Ob0ZpHHrgYL9jfb0NXuxNkqex4VQpKB7gEvjikwnagQIQ1MGeJZpqJz0Nfii6YQS6bR5XFqarpYoUSexXUFikqX+ujDvYofk5RfUVFROBzGG97wBnzhC1+Aw7F41ezpp5/Ge97zHnR1dWHLli34u7/7O9jtdpw6dWrFYyUSCQSDwUX/VZvndNThQ6/ahyf+6rm4/M8vwqV/ehFe39WCA802PP6Xz8GrDjVV9PwGZqNoWmEqgxb0zRQfKDJg4F2hAXA1YGnk2qq6+31oLGDK0vXpCFqdhqI+qDvcFlwZD+H8SADd/d5lHRk2op6J8r7HDntjOFjm3ZUdbjMONtthNfBodhhwuNUBHa+tRYCFArE0uge82N9cvS1+DrbY4Y0q/3780IVxPH1jRvHjkvIq6tX3rne9Cy95yUtw7733Lvvebbfdhu985zvwer2QJAnf/va3EY/Hcc8996x4rA9/+MOw2Wy5/1paWoo5JU3hWAb/9qp9+N47b0Ory4iPv+4A/vWVe6GrYMuZZsfNKUYbJcyRZBn7mmywGapnCx3ItlwpZ6eAEwM+HGnTfirFQoX+TXsmwjhcQEBjNwpwmoSqn4BTjGgyg3Je63S1O3B+nRnZSupss+PqZBhnR/wIxtIY8cXQPeDFjekwOtzZdJIOt7ls51OIkTxzN10mHTwuIziWwZYaE7raK/v63t1gxQkV84G/8Hifascm5VFw9PPtb38bp0+fxoc//OEVv//ggw8ilUrB5XJBFEW84x3vwA9/+ENs27Ztxdt/4AMfQCAQyP03PDxc6ClpEsMwEOaCS4Zh8MZb2vC9d96Kxgrl5pwY8OJAsw3NDgNkAFtqTGhzamNGd7EujgVxYTSAQCyFequIrnbtbkMdarGjvcYEm0FAKJ4ue8uVi6OBqgrKi/krnh7yoclhgFnkV83jNIs8jnocCERT8EZSiCUzaLYbsEsDeYXlsrfRVtZxoGeG/NjXbMMOtxlNZchVXm1xWpKB3slsOolW+zaa9SvX7DbbDYue026riIHZKDKSjL6ZCLr7fWVPj5jnMukwHoit+ntXQjm7KBB1FFSNPjw8jD//8z/Hr3/9a+j1KwdNf//3fw+/349HHnkENTU1+NGPfoTXve51eOKJJ7Bv375ltxdFEaJY+b555bC/2Y4vv+UoXvXfTyNW5h6YkoxFAU7fTAQCx6Cr3YlURoLAZgPjk4NeVd801DI/scjjMiIYT+U9ragcdjdYcHbEX9F53/G0hI56S0X7ChakiKW3VEZGNJFGOiNhKpTG/iYb4ukMrk6GwTDZgH9gJrKo2XjPZLZt1jFHZT6oKyFa5veeVEbOjZrdVpt/kQ6DbD/Tk2v0M3Uadaix6GASeQgci4wk42IebakCsRT2N9twaTSwYnutSvFGkjgw12VhOpzExFyxqcCzcFv1SGUktLqMODe8/Ges1GSwJodB9fGkx7a4VD0+UR8jF1Cp8KMf/QivetWrwHE3rwozmQwYhgHLsujt7cW2bdtw8eJF7NmzJ3ebe++9F9u2bcNnP/vZdR8jGAzCZrMhEAjAarUW+ONUh5+cG8OffUubBVOHWmw4s8IbWTU5ss4HVLntcJuXTUkqF6dRgNOsg00v4PJECLEKj+fLl5ITb+qtIqKpDIKxlYcFNNr1CMfTCFbhRKpC6DgGB1sdqk4SWs/+JtuKfXbNIodwIvvczDZfD2FbrRmnh33ocGen0Qgcg8OtDkSTafhjKUwFE6tOG8tXR70FvSpMb1NCq9OAmVACu5tsODk3BWrUF8PoKnPHsxO2bOidDCEQS8Oiz44qnQzGEU6kc6vKqxUJcky22LWQ8ZkGgVN94eTF++rx/15/mNofaVAh8VpBK5vPe97zcOHChUVfe8tb3oKdO3fir//6rxGNZlsUsOzi3XmO4yBJ1d86RCkvP9CI3/ZM4YdnRte8nV5gVZtnvBodr83tpUJMaKj1lFFgc2MFy+1Qqx3nhv3waqSpf746Wx04qWD+10Rw7T6PzXZjWftPVoJJx6HOKlY00ASA/tkIDrXawYJBIpOBUeAhQ8apQR8abHroeDZ3jqeGsheM2dGFDngjKcXbdmk5tWTIG8Mt7U48O/czr/e3S6QldA/4YNRx2FZnxkQgvmjKlX/ufeBgix3D3ihmlxRXdnqyF3jH2p15/55dZl3BE68Kdf8tHgo0N4CCgk2LxYK9e/cu+prJZILL5cLevXuRSqWwbds2vOMd78DHPvYxuFwu/OhHP8Kvf/1r/OxnP1P0xKvd2+5oXzfYfPmBRvz8wgTCicUrLg6joKlG7VrDaqjo1FNjxuUKzT9OpKSqS4lQe4b3SuargNXeCqyUzlY7gvF0xS56FgrF06t2n1itP3Fo7r1OjfOPpzI41GpHKiMpPhygVK1OQ1Ert9FkZs3xx2eH/TDpOHR5HLgyEUIqLWF3oxXn5oq4uge8eU9ya7QZVA82rQaaPbMRKPqxLAgCfv7zn6O2thYve9nLsH//fnz961/H1772Nbz4xS9W8qGq3q4GK+zrNCL/Tc80XnmocdnX79xei6f++rm4a0et4udVqbwfJTmMukqfQo5llYT/clit2EDLLo9VJuA7PxLARl08SaQlTQSapciolPA85I3iyngQ/dORshQv5avNacB4II4zKlXxR5IZdA/4EIqnEU9LOD3kzwW2sgwMzERwxOOAfo12UUYdhxsFTnwr1J3ba7C7YWOm0202JX8a/e53v1v07+3bt2/4iUFK4FgGrzrUtOJs9HqrHi/aW48HuofQYDPgU/cdwi8uTODnF8fR5jTCbhRQZ9Xj8/d34sX/9YQiYxp5loFe4DDsrf5pDXwFW0wtxDJQ/c14LZFE9eUgVjKntPovs1Zm1FXfRcdSQ7PqvC/5F6SYuMwMDAKLWIWnRfEsYNDxFd25iiQzODngg80gYEutCZfHl+e1NjsMqueiP3+3Gwz1JN4Qqv9dqIrdvaN2xWDTH0viTbe24fVdreioz7Zkecm+Blwa24p4KoNdc1d6eoHDJ19/CH/27TPoKyCpe6lGux6z4QTCifSyLftqJMkyWp1GTATjSCo9O60AO+YKG8qNgXoNltUm8mxFRkN2eZwbNm9zLFDdc7cZJls9zjKrtzVSwpA3WpE0joWaHQaIPFuR942VBGIpRJPpFX8v16bCMOk4RFS8QByYqf7FD5KljSWgTWhgJoIHT67cUzSekvD+755bNC+XYRjsbbLhiMcJk3jzGmFvkw0v3FNf8OM3Owzo8jhh1HFoshuQSG+cdZ0zQ34MeaPY11jZaRzWChUfdLU7cWbYj0GVVoPUUm/VVyTQ7Gyzb9hAE8jmeFczWc6uOptEHjqV++ieGPCiuYDpVUrq8jgwHUoUVA1eDqmMjO5+Lw602GAWbxaQ7m6wqhpoGgQOd3conypGKoOCzQrpn4ng5xcmVvyeVc/jr160M+9Kyfe/oCO32rnQWh8yNoOA7gEvYsnMor6DG4s6AbTHZcSuBgtaHAbsb7Khxrw8R1TgGIyv0qJEbZVczS1Fm8u4/o3UIG/sbbqNsI0uy9niot0qX0DKMhZd5JeD0yhgT6MV3QO+kls5qenccAAHW+w41u7Evqb8CohK8dL9DbhbhboEUhnV/y5UpY5tceKXf3EXIsk0oolM9v8n0+BZFndur4G9gCIXjmXwkVfvw6M9U2hxGPDolSnctaMWrz3SjLd+9QTODmcbii/cIg/M5SptnPXM5eb79imlxqzD1lozLoz4cytww74Y9jfZkMrIi6Zc7G20QeBYeCPJda/+eRZQ8jPmzLAfW2tNcJnEqlqx81eoRdOpIR+Oehwb9qJL3tCvcuUFyzytptlhXLH3qNZ0tjrw5PVZMAxQZ1Z/EMtzd9ap/hikfCjYrBCjjs/lYyrhQIsdB1rsAIDXHrk5X/4bbzsGIDuZ4l9/dhmxVAa9EyE02g3wRpOIrhEIsQzQXmCTXy3oandgOpRE76QyeU+tTiNqLTqcHfLjeHh58Db/QdFg06PWLEKv4yByLJ64PgOHUcDuRisSKWmuhYuEVEZCIi3lgqu9TTYMeWO5WccjvtiqbWBWwzGAyyxiKpTtKXljOgK7QTtV+evZ3WBZsQihXFZr+F7NtteZYdbzGyqIHvKq9160tdaEeEpCf5nf76RKjhbLk8dlxPlRP4Ds6m9KklUfntHsqNBOB1EFBZubhNOkw8d//+Cir33pyX78y88ur3h7jmVwX1crvvHsYBnOTlnheEaxSuwujxMnB70YyqNKfzwQzwWJRz0OAIAvmlr1w95tFdHmNOHMsA+pjAzvgibLdRYRLU4jABnD3lguiFxK5Bkk0jKOeJw4NehDl8cBXywFt0XEySoIMjiWwZE2B04PVe5cs7/D7EWXzSBA5NlVf99a5jAK2FprBjNXSHNKQ1O0lOJxmeCN+FU5dmRuhylV5vZvRlH7H8MW/eLqeG8kCW8kiS01JuhUKmg6P+rHvubK5t0T5VDO5ib2lts82FZnXvb1Q612fPnNRzEbWf6B+/zdbvzZc7eV4/SKdnk8iKlQAlsKmMO8kr1NVnQPqDcrfjKYQPeAd8UWJ1OhBE4N+nBq0I+pUAKNdj2OtDlwuNUO51wuble7E2kp203geL8XaUlG94AP1ybDePL6LBodBhxqtUOLGYkCx+BYuxM1Jh2O96/8OyiXRFrGbCSJrbUmdNRbEEtlcKTNAUHlYhSlOYw6nBz04cSAb8MFmh6XEfubbLkZ62qYCMYr0tMxrPExqXajgAurNLzvm4mgZyKEAy02NCic65rPjHtSPbR/SUVUw7IMPvbaA3jd557JFZUYBA7/9PI9ePcDZ1ZczXvmxiz+6w8OYiaSxAPHh8p9yusSWAa7Gq2IJjMYKKH/aGerAz0TxSfAR5MZWEQeIYVWWMf8cYz5b26t15h1uVYkC7++0Hw7rAabHs0OA84N+5GcC+p0HJP73+XGMsDOeoviowdLEYqnEUumcykjJwd9sBsF2AxC1VT1z4SrbzU2H1tqTIr0Es5HJYZa+GPablFWaxbXzac+NxyAwDGKTuLaWrt8IYRUL1rZ3OQOttjx4Vftwy1bnHj3c7bh82/qRFqS8ZyOWty21bXs9ofbHAjG0viLe7dDi712LQYB50cCuD4VXvODY+m0GIYBOtwWHGt3osGmx6khX0ltPS6NBRFKpHGwxa7KZJqZcP4fUOOBOE4M+GAUeRxrd+JImwM6nkNLhVq87Gm0on8mCk+lqs9XsbRIyx9Nod5a3srkUnhqTNjbtPGmrRh13Po3Uoh/QW9al6k8Oc8WvbZbU+WbkpTKyLgxFcYaQ4fydttWF952R3vpByKaQSubBK/pbMZrOptz/46nMogmMnjOTgkd9RZ8/ZlBZCQZ93TU4lP3HcaDJ4bxpSf7ocW8dm8kCZdJh9nIysHY9joz7EYBvZMhOAwC3DYDJElG33RYsYKihc4O+/OeM6w2fzSVW02sZBNzSc42bx+YjeJAsw3ToQSanUbIsozxQFz1WcuFWOmD9kCzDSzDYCIYL7iQS03zK0qVbkyutHK+zdyYjuBwqx0cy+D6VBhWA69q8ZhJx2Fa4/nBY4E4mu0GjOTRyi2SzKDZUfq8dJPI0+SgDYaCTbKMXuBwx/YaAMA9HXV47s46vPWrJ/DS/Y144X8+jtEK9Y/M17Y6M2bnPmx3N1hh1vOQZRnRZGZR0BeMpTHoVf9n0Slxqa+4ylwpzP8u5i8Gzs0FSGMLgrY6i4hWlxG94yHF0hCK1TcdhtOkyxVvsQzQMxFEIi3DKLDobHPg3LAfaUmGVc/DbtTBLPLQCyyEubGpGUmGJMu4OBYsSw/U7n4vDrbYcHZ4Y+S8Gcq4sglgUV5oZ5tjUf7roVY7YsnMugUx+5ts0OtYzISTSKUlOM06nFvw9/C4jHBb9eifiVRFMVqjQ59XsAlkPz9KdWk0AF8kCUeZVpeJ+ijYJOu6c3stvvbWLggcu26gedtWF56+MVumM1tZWpLgMunQXmNStTVHNRvxxxblbXa2OcAxDILxlCqVpQ6jgB1uC84O+9Zd5Z0KJTAVSmhihS6aktDq0iEjZfuoHm692e4lmpJwatAHBtlc4WA8jeAaxR4elxEDZcr/XG1lvxpVsoDm1KAPRzwO3JgKo8Yi4vJYEDsb1m5Z115jWtY3c9gXw856C6x6AePBGAZmo2V7LighHM8vpYhjGUwGS1/tHwvE8Yr/fgq/+PM7F03MI9VLi0suRINu21oDSZLXzdNsdhjwkn0NqxzDhb98YQcMAocGm161at+JQALb68yaCTTTGQm8GombJRjzx9FoN+BImwPH2rNtk7oHvOiZCGFrrQk7S+gBK3BM7nly1OPAznozwvE0jvd7CxqLqpXfWM9EGDJk7Guyrlg0JgN5tcsZmI3CaSpPfl5I4xXO+eryOCs+J/zkgA++aArXJsNIpCWcGw7gqGf1bgXOVQZy9EyE0D3gxXAZdlOUForn1+j+cKtdsefekDeKrz49oMixSOXRJQPJ27EtLjzyvrvx1q+eWLVClwGDrQvaKW2pNeHz93ei0W6AQeDwTN8sttSawLMM7thWg++eGlH8PEf9MTTatVPYcWE0CIueR4c721bnynhQtXZKhVhtdWW+Int/sw2+SBLDS/KvXCYdArHkqlOPmuzZwqNai1hSQ/FYKruacqTNgSFvFKF4ClvrzLi4ShsWNQVj6VXbv+SDAbCrwQq7UUAkkYZe4BZNolJam9MIf7S6t9EFjkHPZOVznVdyYsCHeqsedqOwKBh2GnU4P+qHScdhV4MV50b8FW3rpZR88idtBgFnh/2KPu7nHruBlx9onOs5TKoZI8vaKvMIBoOw2WwIBAKwWjdeZeVGcGbIh/d+5yyiyUwu3+jO7TV44toM9jfb8M+v2Ivu/llcnwrjj+7cgh3uxatkvkgSD1+awNeeHlBt1WJfk7Wk4EBNTqOArXVm9EyENL8CxTJAi8MIt1VE30wEM+EkDrfacW0yjMNtDgRiSdyYjiz6OdprTOhXoFXN3iYrTDoe3f3eXIZpl8eBlCQjEE2VrR1OKfQ8i/3NNlydCi9rH1NrEdHqMGI2koDbqsdMOJHrlVkqngU8NWZcnwqXfKxKOdhiVzx4UdoRjwNnBn3obHMCkCFwDBIZGbG5/PBj7U5NtfgqlkXkEU9l1lzBN+k41Nv08EVTiwZUlOpVh5rwn0sGkhBtKCReo5VNUrBDrQ684Vgb6m16fOQXPXjDLa2w6gXsarDieL8XF0b8+OO7tq56f4dJhyFvVLVA0yLyFVn9ypc3moJ3wFcVH0SSDAx6oxj0RiFwDHY3WHFlIoRYMgN/NJkr8HGadGivMUKWgWCeW27rWelv2D23UtpsN0DHs2UpuCnFdrc5d85LTYcSuUrkmyvMEUVyVdNSdsa3QeByK8RAtguA3ShgMqjtohSGAXwrDJXQmvMjAdTbDBXr7FAuoUR63ferSDKDG9MRsAzQ2WbHqUF/yY+7vc6Mlx9oLPk4pPIo2CRFsRsFvOxAI1625I3AH03iiWszSGUkfO3pAbiterzsQCOujAexvc4MnmPhiyTxucduqHZuLU5DRedsL9XV7kR0buuUYxnIsgxJhuYDzaVSGRmXx7MBYHaqyM1t2vnxdeUy4o/hcKtd1YkySpguoB/qvO5+L1wmXXZEoCSj3ioW9MFtNwpothsgcCxMIo/43CjO2XASg7MRTAYTaHMZi2pWzzAoS8uzzlZ1524rJZmW1iya7JuOVMVFUT7y7UQkycDZ4QD2N9mWFUrly2XS4cOv3ofn73ZTC6QNgoJNUpStK4y5BAC7UZcLQGvMIj7+66t44tp0rgfg/mYbzgz5F+Usuq0iaswiMpKsyGqnWa+tp3UqLeGiBvpsKqnNacytalaKP6bMCqqaasw6tDgMSGakRa1v1jMbSeYqyqeC8bx7F3a1O3FhNLDu881aZCPxo57s8WMlDDxYT7YHq/ZTJPIxHU5gZ72l4kVOhagx69BsN+LqZBDNTiMcRh1SGQkXRgI41u6EJMuIpTJIZ1Z/v85IMnonQ0Wl1GyrM+Prb+1Co70yQyeIOrT1qUyqwkw4gUevTOJwq2PN273yUBN2uC146f97IhdcLn1zes3hbDP55+6sw1985wzsRgG3b6tBIJrC0zdmCi6ksRsFzVV7LtzG3CgSFV6paXMac+M4tWw+FUBgGdiNwrpj/1aSysgwr9D+pcGmx1QwjoX1J7FkJq9AMJnOoL3GhJlQouBepvsabapuGx9osVe85ZVS9DxbFW2o9AILt0WEWS9g3B/D2RE/AODq5OKc34W7MetNWEqkJdgMhV/UDMxEMDAboWBzg6FgkxRsMhjHb3um8f4XdKy7xbG70Yo/vM2Drzw1ACD7BvWCPW6IPIenb8zgr3+vA5FEBsm0hBP/516YRR78XDPs8UAM3z81gocvTSAQS8EbTuZGSNZZRPiiSaQyMhpseowH4theZ8aIL1rUB7qaeiZCOOpxVEVBUL4GvZXtETjojeKIx4GTJVS7l1NKkrHDbSk6iOqZCC3KmXOadJgKJbC70Yqe8RBSkowjbQ5MhxJrTtCa17sgiNjXZMXl8RAyK1zZua0iXCYRfTNhxFMSMpKc7T3Zps42d2ebY8MEmgCws8Fa8SKnRrseDTYDOIZBOJGCwLHom4nAYdQhEEshEEthX5NtrnNE/hfq+exux4u40H7Xc7ZhT6Ot4PsRbaNgkxRsh9uCIW8UPzg9umjM5Wo++NLdeOXBJsgA9jZac8FkzgotHWfDCfzV984jGEshGEsvWq10mnTwRZJocRph0fM4PxKA06SDQcchplIrmVLNtwAy6TjUWHSw6gXoBQ4sw2DMH1vWXkjr2l2mXP5mpZwb8qPRpl80fUjLeiaCqLfqMVFk0+vj/V4ca3fi7LAP22rN6B7w4sJoEE0OA0SezQV/Xe3O3AStfFwYDeJQix0Cx2ImnIDNIODMsB876y0YmsvxFDgG+5qsGJvLTzw56CspJ281GmtHW7TOVjsiyUzFA835sbRj/sXPOY/LCG80iUxGxrF2JwaK6OzQZDdgJpwEwwBvONaKu3fU4RcXxwEg1+bt2mQIgVhq3bGueoHFXdtr8WjPFASOKWpFlGgbtT4iRTkz5EMglsJd22vBqvAJIcsynvfxx1bcKl2pMGThSMFqc9TjKKkfZSVopbXUgWZbxXNHC7Gn0bruBKVSuUw6xFOZ3C5AMdprTBicjayZxtLhNi9aIVWCWium5cQgO2IzqmJeaz50PAu9wKo2273WIua6KTzxV89ZtRfmt7qH8IEfXFjzWDzL4KfvuQM1ZhEuk06VzxSivELiNZogRIpyqNWBezrqVHtTkOVs24tbtjixp9GKI20OdLU7cahl5Qrkag00gfwaJmtJi8OgiUATyM5WXy93TEuujAdVm5w1bzaSREcJE6AAoH9m7UATyG7Fb6kxYX+zDTvcKxcMFmqlrfxqYxY5SBpYw9nXaFMt0ASyrbs65noof6t7aNXbPXxxYt1jpSUZw94oai0iBZobFAWbRJNYlsHn7j+Ct92xBZfGgjg56EN3vxdnNN7kuRgBjeWYrqdBQ9OZgOwqXLWQZCxPI1HBUJlyavtmIjg/EsDATAT7m1fPs9Pxa//MHMvgiMdR8W1nJYQSGWQyMg632sv+2PNxmsAx8EbVvwC3GQU02Q14xcGmVW/zlts98LgWr3qKPAurnofAMdALLN5x9xY8f7db7dMlFUQ5m0SzpkJxHNvixNff2oXvnRrBT86NVfqUVNE7GUKdRcxNY9K6oMZaDnEaXgk51u5ERpIRSaZxZTyEnfVm9EyoP9XHbRUxU0SPz2IlMzIujgbQ2ebAqSXb4Adb7Lg0FlizGn+jFQalJBkMyvu8dBgFMAyDZDoDo45XZIrXet5ymwfP2VkHvcCtept7Ourw2/fX4peXJvDT8+N4Q1crutqduYsuSZJpNXMToGCTrEuSZDBM+bZ7p0MJ/N9f9uDBkyO4dYsLDXb9hg0057U4DVUTbK6X7F9uld+wXNnOesuiVjFmkcdQmdpymXTlL7CQZODUoA/7mrK5WxfHgpBlQJJlpDIy+DUCio0YasTT5e08scN98/kWTqifL3rXjlrc07F2oDmPYRi8aG8DXrS3Ydn3KNDcHCjYJOv6xCNXcXYkgD+5awtu21aj6mM92zeLt3/tZK733zN9s6o+XrnUWUTUmHVgGQYsy4AFA4YBBI5FSpIw7tdWALeWeqsegZiGZm5rNNpc2hszXGA/y2IJLIPeyco1EZ/P522wiWh2GHFq0JdrT1Zj1qHNZUIkkV7Uc3d4bhxqKqPRP2YResZD2NtkVXV0brPDgGRaQlqSyzqR7EV76vGZNx6uunxzUjkUbJJ1WQ0CHr86jcevTuPO7TX4j9cdQJ1Fnby9Y+1O/OPL9+Cvvn9+QxQLtNeYwLMMrk2Fq2blci1uq1iW7blCRFPa7F1aqRGFhzSyJT0eSGA8kH3Oz4QS6Gyz4+JoAKcGfcvyGccC8aqbtLOejJxt6r+9zoxrU8pfnBkEDjqOzWuylJIYBvjgy3aDYRhkJBmz4QSuT4Wh41kc8TjLei6kelDrI7KuUDyFI//6SG5qjMdlxIPvuBV1VvUKRd7/3XM4OeDFQBHzmyvJauDhcZmgm8tHOj3kK3gKkpZprdWQnmchoXKB3VpMOg4ZWUa8jL1f6ywiZiNJzV+oba014caCtmYcy8BhFMqaZ1ouK+WxFkLkWRh1HHxz+a51FhGeGhNGfVGMVmBHROAYbK+zYCqUgDeSyL2/CRyDz99/BM/ZWVf2cyKVQa2PiKIsemFRxe/AbBR/8IVn8atLE6pVj3a4LfjG246hwaatyue17G2yQpKA8yMBnBz04eTgxgo0j3gcmgo0gWyemhYDTQCIJDNln4Si41jNB5oAMOqL5VpAHWq1Z4uo4insadx4CwylbDQfbrXDLPLwRVNorzFha60JU6EEuvu9FQk0gez41MvjQcyEE4ve31iGwUy4+ndviDpoG53k5W13tONrzwzk8o/6piP442+cQrPDgCf/+rmKPU5GkhFPZfDGW9pg0HH47zccxqs//XRe991eZ8aL9zXAbhRgNwqwGQTYDDpkJBm/7Z3C5x/vU/WD2B9NlS0vr9wabXqc02BbGm8kqelcv2iyvM+HEX8MRzwOXJsMI6CxrgELxdMSdtabYdXrcnPWY2k5r2KTalNMt4SttSawLLOop7DW0lcWqrOI+Mm770B9FS0OkPKiYJPk5bVHWvDaIy2YCsbRPxPBTDgJbySBfc12RR8nI8n4xCNXMRNO4mUHGvCLC9mGwCLPIpmRsFrSx7273PjMGw+DZxn4oilMBuOYDMbx+NVptDqN+KsXduCVB5twaSyAH58dw2NXpxU9bwCw6vmqnAaUjyaHQZNjIUf8MexptGLIG1Vl7ryOZ0taOa1EktLJAR+21poQTaY1G4QDWLEFlMayuhRxYzqM9hoj+mfWTwlymgS015hL2nYvtxftqcd/vf4gRH7jXSgQ5VDOJtGkMX8Mn/rtdTx4Yhjb6sz46XvugC+axDu+cQpnlkwQ2t1gxWff2Al/LIl3PXB60Rz1eTVmEce2OHF1IoRPvv4QBmej+MvvnVMlQNndYK343HClNdr1y+Yra0mtWUStRYdIIo0asx7jgVjBwXGDTQ+DwKHGLCKWykDgGFwZD2JnvXXVYQKHWuyIpTIwiRx6xkO5EZE8CxxodqB/NgxvpDIrjIda7OiZCCGWquzYxEKsNIp2I3CZBGyrs+DUoA/pud0VvcBCx7EIxtPgWQaH2xy4NBooacxoJXz3T27FUSoM2pQKidco2CSa5oskkZKkXPW7N5LEG754HFfGgzAIHL74h0dw+1w7pnf+zyn8Yp3RaCLP4sOv3odXH27Gjekw3vCF45gIKhtE1VlExJKZXPumamczCJrekl2J0yjAKPJ5Veq2OAxotGdbyKwWVB5rdy5rLdNg02M2kly08mk3CtBxLKbDiYqsai5VanFKuR1qtS+7mKx2W2pM6JvbAm92GNBoMyCaTKN3IgQZMro8TlyfjlRtt4ofv+t2HGixV/o0SAUUEq/RNjrRNMeSuddOkw4/ffftuDgWRKvTCOeC7+ezmphIS3jfg+fwvVMjOOJx4l9euRfv/c5ZRXMtp0IJtDoN2O42g2GYqvqwX0mb04jzo9oqDFqPN5pCk8OwarBpMwhIpDOIpySkJWndHoXH+7046nHg5KAvF0TWmsVlDe5Xm5BTKSNlGluplAsjfmyvM0OWZThMug2RklJrEXPB5ogvtuw5mZbkqg00t9WZUWMRK30apApQsEmqDs+xOLjClbRVn//UlKdvzOLpG7NoshvwsdcewPkRP564NoMLCgVVQ95YblpMrUXEdJV+mACAQVeduVgXRoPoqLegd0HvxoMtdoQTaVyfCkNgmYJ6O54Y8OFAsw1902GEEpmq+L1MhhKwiHzVrLKnJdzsSTkdQavTWLY572qJr5PG0D8bhY5jkNRwfu1K7jvWir9/ye6qeB2QyqNgk2wYLzvQUHCwOOqP4Z3fPIV2lwk6ngXDKF/U0eowVnWwWQ2tdFY198dsdhhgMwiLWnWlJLngJuLnRgLgWQYmHVfWiS2l2FFvqdrVdbdVrPpgM7hOXvh0KIFWpxEsg6rpK/zvr9mH3z/aWunTIFWE+mySDWO+kXqhZBnom4mgZyKkSp5dIlNdCf9LVXM7p97JMO7pqMVEIIZLY6UXbTmMAtKSXFVFHJEq/vupUcBXTjvrLXm1LBryRjHqj2FvFfQZ/csXdlCgSQpGwSapehlJxuBsBE9e194cdY4BEmWcIKOG2Sqf6nJqwAuTmH+KxVp2uC2KHKeceiZCcC3Jfa4GLIOqHl/JsQxiBfRZTWVk+GMpcBoeN36kzYE/vmtLpU+DVCEKNklVmwzG8drPPo27/+/v8MiVyUqfzjJHPE5V5iKryaLn4XEZ4TQJ2Ntorfreh6FEBh31pQeJnW2Oqtk6X8rjMq1/Iw1pshvQ2ebAsfbqbalzpM2BwRXasK1lxBfDoVaHSmdUmud01OIbbzsGocgdJLK50bOGVDWBY3Go1QGPywhGYysCO+stVRmctDqNGJiNwhtJ4eJYEJ65UaUWsXoLAdKZ0laXt9SYcGaoOvMeAUBGdVwwcAzQ1e7EdDiBEwM+HO/3oqsKA85ai4jzI/6i7ssWMXFITSwD/MHRFnz+TUeoGIgUjQqESFVzmnT4+5fuxt+/dDeiyWyVcc9ECI/1TuOhC+MVPTezWH0vrzanYVlu46khH3bWW5CWZISqbJV2XqmrMX0zEXhcRriteviiSVybCsOk47G70YqBmQgykgynWQerXtBkMY7WZ1YfarFjOpzAZDCO7iUXaN39XnR5nJgKxaumgKbJbsDZ4cJ/5zzLYCyP3rDl9M0/ugW3bnVV+jRIlaOm7mTDOjfsxz/99FLFJpIYBBb7m+24WMGpIEaBRZ1FD6tBgF5gwSxY/k1LMoZmo5ieC0QcRgHtNaZVf19GHYddDVbEkmlcHq+OXDqbgQfHMvBHU1CyqN4scoglM1ipW02NWYcZjeW5bnebcW1SmxcKW2tNuDGd39zvrnbnsmBUa/Y323B+pLgWaoda7KsOFqiEVx5sxIdetQ+mKrxwJuqjCUKEzEmkM7jvC8fLutrktopIpKVcg2+rgUeD1YDeSfUCtB1uM+KpDIa8MTiMArbUmhFJpNctsJj/8D7S5sDpIV9eAZnLpMNsRFvB1Go6W+04VeaLjTqLqLkm3YX0Ey23XQ0WXMnz4sUs8kimM2AYIJHW1EcX7EYBHW5LSReXAssgpYFWYzqOxTfe1oVjW2hFk6yukHiNcjbJhibyHP72xbvK9nhGHQeOZRCMpXCkzQGLyCMYS2PIG0G9Va/KY+5qsODqZBhD3hiaHAb4oimcGvTlFVxcnQzhqMcBgWPzXvkTBRZbakw46nHgSJs2ixkAYHeDpeyBZoNNe4EmAPROhNCp0b/V9akwTHnmAoYTaTQ5DJDB4KhHGz8PM5dnCmQnTRUbaIo8C14jpej3dNRSoEkURcEmqVoZSUYsjzf2Qy02iLxyT/WV8vcPttjQ1e7E7gYrxvxxSDJwctAHgWexv9mGWEpCg02dYJNnb/5sowXme/mjKZwY8GHQm982JgCM+ePom4ngxIAPl8aCOOpxoMluKOhx1SawDOLp8recSqRkWPXa23KUAZwa9KFepedgKVIZGdvd5rxv3z8TRTIt4eSgD3ubKr/75XGZ0N3vLXlUaUe9BTGNtEm7MhGs+i4URFu0965ISB6evDaD+798HLIMHGq141tvvwV6YeXVkQ/9vAcelwnjgdi60zzWcqTNgfFAHALHLCpUYBng4mgAK8U23kgS3kgSB5ptiK0wts5hFOAr4UPKadIpUmk85o+jeY1Z4quJpTI4MeBDZ6sdo/7yFzYcarFBBoMbU2FwHIMOtwXXpsJocRpwbrj889y90STanEbI0GZDcquex4QGx9xHi1gNlGXg0lgQuxosMIs8hr1RmEQ+7/xPpUwE4jAKLKIlBIoiz6J3Iphr9VTJLhY8y+CfX7F3UX43IaWiYJNUpTu212BnvRVXxoM4M+RHPJVZMdicCsbx1acHkJFk7Kw3IzYdQaqIGcQCx+DUoC8X1i0sApFkQM+zSEurf9icmysY2FJjQo1FRCotIZHO4NpkGEfaHIinM5AkIJRIYTjP3nxdHifOjvhxcbT0yThANhez0GBzXr4BczEB7WqOtDlwckku7vyHtLeCOaWD3iiOehw4MaC9qnQtBRAsk+1dmpHkoov4ZBlL8j0T2NdkxQWFXhP5cJp08EdLe74l0hIMC0agdrY5IMsyRn0xTJYxLaPJbsD/u+8QDmu01yepXhRskqp1144aXBnPfqis1pvul5cmcrO9eybCONRqx5kiPtiMOh6B2M2AilvyeHaTDlF/fN3j9M1E0LdkfN3JQR9aHAbwHIOJQBxH2hxgmOzKmD+aQoNND2EuDYBBNn1gNpJE94Cyqx+j/hi6PM6ijjsdWv9nB7JBulnkEU6kSwo6rQZ+WaCpJdECJseUU765keXQ5jKpEpArFVBzTPZCcqVL0/YaE3gOcBh1ODXgW7ErQaEWpgQtLGhscRjgMos4q2KVuknH4YV76/HBl+6G3Vh906aI9lGwSarWH97qwY2pbP/DN3zhOP7qRR24c3tt7vuyLOMHZ0YX3efMkB+dbQ6cH/EXtMIZiKVWrcI26Dh4S2x1M+yLwaLnYdELy4KoiWB+gVypZsJJcIy6W5AZSUbPRAgCx+CIx4FrkyEEYoUHZrGEtmeTmxUaj6k0VkMrm0OzEXR5nBjyRhV9jl8cDcBtEQtaEWSQbcTuMOpgFDlwDIMr40Fsd1twdtgPlskGZHaTDi5TNvDjWQYBU1qRQHMtw74Yhn2xoi+UV1Nj1uH5u914we563LrVtWoaEiFKoGCTVK1GuwFf/MMjAIAvPN6H+7/UjZ+95w7sbbIhnEjjY7/sXfHN+dSgD21OA5xzqwX55sE32Q25YNMs8phEAk6TgEa7QZGt7FA8jaMeR0W3gIttu9LqMi1rBg8AHW4LrAYeDBgwzM3cvFRGxskBH/Y0WhGIFf67M+l5hONppDXQJmYlC1fBtWRaQ5XyGRnoHvDicKtd0WBTkrMXgPubbegZDyK5RjRoM/DoqLfi6mQIU6HEsk4C80FlWpIRSmQQSsRyaS5pSYbHZSpb94FRXwwMVl5pLYRRx+Fdz9mGt93RTgEmKRsKNsmG8JbbPfhW9xAujwfR7DDgFf/9FAbXmDYy6I1h0BtDk92ABpseZ4f96wYuonCz6ptBtt1Jz0RQsZxJADgx4MNRjwNnhwtbeVWKN5KEx2UseFLLiC+Gox4HJBmQJBk6nkVGktfd6r40Fiwqj9Nl0pVc/asmLU6PqrOIGPRqbwJPRoWq5/nnr0HgsMWhX5a60mQ3oNGux/mRwLpN4td6Xzg95CtbjuhUKFFQA/zVvO/5O/BHd25R6KwIyY/23hEJKQLPsfirF+3Mjnvzx9cMNBca9ccw6o9hW50Jo774ihXj8xa+yV+fjgAqVb2eGPBVdFJKnVVfcLAZiKWKzr9rshdRBV+hiUz5OjPkw7F2Z0Wripdqdhg02QNUYNXrwBdLZVBjFtE3E0FnmwPjgRjiKQljgZgi3RPSkoyrk2F0uM3oLcOEJqMCObfP2VmnwJkQUhjqs0k2jBftrcfeJhv+12efLvi+16ci2FprWlb4s9B8C6NySGcq128vUOYVwxFfDIW0QRVYpmx5rMXKyNnKeC31H9XqfPQhbxTtNSbVjn9uxI+d9RacGvRhzB+HN5LMO3UmH4m0hFF/vCzvDTqu9I9sX5VM/yIbCwWbZEO5MhEsqmcfAFwcC2JnvQVHPQ4c9Tiwt9G6rBn8WsGokiqZt9k7GcK2uvybbJdq1B9DZ5sz79u3OI2KzjlXy7F2Z0V6j65myBtDh9tS6dNYZiqUwNBsBDsKaOxeiERaUn1UZziRxrmRAJochlyvTDUo0fT984/3KXAmhBSGttHJhpIpMc9xaZGLwDLY3WCFZW4qzMXR8nTEHpiNlr1f4ELBWAqNNj3GAuVZQTwx4MW2WlM2PWEdDpMOmClv4+5CHWixaWoLfV6ygivma8nI2fZi1W7UF8OoL4YDLTak0jIujyv7+r08HsQRjwMnS2gZtVJHDULURiubZEOps4qKHi8lZT8wjvd7S5p7XIye8RCOtTshVGBe8lQogWansWyPJ8nZFah8flZOQ+17VpOqwKjM9exptKBfg0H61loT9jZZVe0jWW7nhgOq7YKcHPChyWHAgWYbrIbCA/SX7GtQ4awIWVv1X0oSskBHvQUWPa/JUYGFSkkyjvd70ewwQJZRti3ZequIZocR1ybV3XpcatiXX1P5cEK7Vejzyj0yMR+xpPYCYCDbGF3LDfoL4XEZ4TKJ4DgGgyoG9vMrqK1OIwSWzXu1UuAYvKazWbXzImQ1tLJJNhSR5/DDP70N99/ShipYAMvLiC+GVCa/VT8l1JhFnBz0lTSzvVgnBr3oWCd3T6lxl2qqtSi7wl4qj8u4rP2PVtyYVr+Kuxx2N1gwMBvFqSEfuvu9ZRkzOeSNQuBYNNj0ed3+1q01sBm0OXCAbGwUbJINZ1udBf/yyr144I9u0WS/w2KkJVnRCtq1VLL2Rpazze31q5Sn76y3IFgFq9bhRBpba9WrsF4PxzLY22RFl8f5/9m77/DIzvJ++N/T5kyv6mXKNmm1q9XuqqxtjDHYJhDTmwOmBoKTkNASQgghIQkJkDeEAL8klIQADokJhNBDMNUG26tdbW/apt6l6X3mzHn/GGlWZSRNOW20z+e69gJrRzNnpZHmnvu5CwZ8Tvhc6l3LVlgaaLZpp2O/GpOBBPYq2Fi3YjacRCqbg9e1fdnL8GyYdKMTqiDBJrFj3bnbhX97Sz8MO2BLhs9lVGxbjpqd8AAwHUpid4O50JS1OqFbK28egvEMXCZ1spu76kxwO424MBXG4Kh/OcumrVFRBo5Gv9cBiqIkb6JRSziZxUQgDoUGVqzhj6WxFE1jT8PWbyrmwimMa3CwP7HzkWCT2NH6vU584Y19NX+kPhFIKDZ2aSaUxICM41tKcXE6DBPP4q7dLjhMOjRZeRxqtdVMYNLnceD0hPJ1iAM+J0aXYhsagS7NRHC43S774zfbeBxsscLAbf7S0tlkgc2ow4nRgCpbsuS0v9mq2lgumqa2Hfs24HOiq8Wq0BURxC21kSYgCADnJoOIJrPo9znBlTHc+O69dfj1g834/vkZGa9OXvORlKIbaS4pNOJpK7OhJIw6BkvRNFiGwmxYm0PJ1/M4jbI3vDRaecRTAiKpLFiagolnUWfWbbl16uxEEAM+Jy5MhZARcpIEegM+JwwcjQl/fiPPTCiFmVAKzTY9TEIOi9FbWfL9zRYYOAanxoNVP65WJdICDBwtyTzMcuxpMCOcyGA6WDyDbeFZfPDB/XhVbxtYCQbDE0S5yLOOqBnvfuwMXvcvx3H3x3+K/xwcL+tzf+95e2S6KuWcmQjAZdIp8ljNDm3U0d1ciKG7zVZTGbBIMot2Gb9+ThMHlqbQYOVxxG1HV7MVoUQG49usGBUBDI74kUgLyOVEDHhLy15v1pim52hMBxL45bVFJDICUqvGPc2EknAYdeBoCo0WHm6nEZdnIjs60ASAK7MRdLfZFX3Mfq8Do4vRTVeR6lgan3tjL35jwE0CTUI1JLNJ1Ix/fPgoJvxxCDkRkVQWs6EkmkrswtzfbMVjb78Dj1+aw7/9aqQmNtCsl8qK6GkzYykmf3bTrqGO1fVbnLTOH0/DHwfMPIP9zdaKd8YX0+4wIJsTMVUkg5Up8UktIj9EfXDUXxg11Wjl4XGZIIr5RrQL0yEkMzkcddtxaTqM/W1WnJtcm+32ukyFzTztDiNm1i0AuDYfxb5GM2ZCSUU6s7ViTqFVqixNoafNtuXz696OenzghfvR0aS9zVHE7YUEm0TN2N9sxf7myuuN7tjlwh27XBhbiuHHl+clvDLlnJ0MwMyziKbk68husxswpKG5h3SNFtxGUwLCCem+T212A2ZCCUg5L35w1I/d9SaMLsYwt6pMod7MY3c9X8hExtY931pseows3hpZNLoUg8PIbRiXdXVuZ4w1KsfYUhxOIwe/zKPDdtebMbRJpthXZ8Jfv+wg7tpTJ+s1EESpaitlQBASeFUNDzVOZUX46uQdY9PqMGgq8xtKaH+I+2akiJN9dUZ0t1oRiKclDTRX3FiIYX2VwkI0tWZ1642FGGwGDnqOxoDPiZlQEqnsrU+aj6TQaOXJDMdlHpl/RoH8fNIW+8aTnZ42G/77d+4igSahKSTYJG47LzjYjI+/slvty6iYTua6q4zm9mdrKPIt05XZCHrabGCrmCTgMvM4PxVWdFVqMc02HkYdi8ERf9HvyJXZ/LE5If/PKACY9SxorH1ePXtvHf7jt+6AU6HaboIoFQk2idvSQ/1u3L+/Ue3LqEg0lZF1ll81gZEcTHxtZ8vOToaqKv+YC2ljRuaV2ei2M1jPTQbR7tRGc5ma5H7DZtQxMOkYTK5aYfuSnhb865v6YaqRWbTE7YUEm8Rt6/kHajPYHJ6LorvVJtv9D44GcKDFUhiqrrZEWvsbg7ZTzXF6Y4lNcFqQyopYjKQUW62qVRdkHh3W7jCuaRJ7811e/MNDh6GrsWY64vZBnpnEbetlh1vxYHez2pdREZ6VdyvSxemIZjIkl2Yiqg+ZrwZNAdPByve5jy/FYTVo43tRikQmd1vXbvZ5HEjLPKrr+kIUB5aHs7/tbh/+/MVdoDV2IkEQq5Fgk7ht6VhaM9m7coky1zF6nUbMauT4FsjPh+xqtqKzqfZqAo+6HWuGm5drPpLCnvra+ndrqcFMSf1eh+wD/QFAyIm4uRDDkXY77u1oAFWjExuI2wcJNonbWq2ubosk5T1a1uLR7aWZMK7MRmsuyxmToAwgEFd3X305TDqmpq5XSqOLyu0dT2QEnJ4I4pM/virrKDSCkEJtpnUIQiI9bXbQVO1lYqx6+Y4pDRy9Ybe2lkwFEzjUakMO+QHkN+ajSMoxE0giuVy+6Spb4pOMoSnYDBzsBg71Fh7BeLqm5lXG0gI8TiOMPIPLMxG1L0dRTpMOC1FlB9jvrjfBpJO3rIYgqkWCTeK21tlswb7G/HaNlW0oWmfSMRgal++orqvFpqmh7utNBRKYCtyqgWyx6xFJZBBJqTsaaDPDc/nxR2cnizeN1Jl12FVnRiCeBk3lB6T7Y2n4Y2nc1HDQv5Uxfz7Dd7DVWhiXdDtIZAQcaLHg4rQyv0s6myz4y5ceJMfohOaRY3TitsazDNocRrz0cKval1KyREaQdTzRjYXayaIBwHQwif0aL4fYrKHrmM+JUCKDwVE/rs1HMTwXXTMsvdZdmApjcMSPXo9DkgH3cqoz6+BxGrCv0YxetwM0lZ8icLDViiPtdlgNLJxGDkfa7Zvex7g/jovTERx1b34bKf3FSw5Az5GsJqF9JLNJ3Pb++fVHQQFwmjh8Y2hS0l3WcsiJgMdllO1o1WXSISjzqj2pZWowQOvzOnD8Nsn4DY0F4DLp4HEZwdI0zk4GkdJY6YPHZVqT0TfpGIiiiAtT4TW3C8SD6G614vy6j69gaAqCAnU5L+lpwbFdLtkfhyCkQIJN4rbHLW/7eKjfjVcebcNHvn8Z/3N6StNrEu0G+TaEZGUe2yIHQdTuNbtMOoz51x6H97rtOKnxNzVSW4qlsbQ8FL7JyiMQz2gq4Fy//32zjU0igPNTYRxut4OhgZHFGFiahrfOhGRGwMhibNOSCanwLI2PvkKaLWiiKJJjeEJ2lChq67d0OByGzWZDKBSC1artozFi5xJFERP+BN78pUHcXNBe3Vy/1yFbBpahsGFXttbVmXVotOrX7POWSr2Zh9tpxNX5SNlTAPQsDZeZx9SqOZu76024ocHnlNLcTiPG/cp1b2+lzqyrajyVr86IEQU70QFg8IP3ocFS2dSIsaUYPvfETZyfDGF4NgJBFMGzNJptety1uw537Xbhjl0uOMjaS2IL5cRrJLNJEEVQFAW3y4gXdTfjZ8MLiKeziKUEzIa1MXtyPiJfx6tBxyCq0WabzSxG81mzZhuPmZC0X5t2pwFD4wF0t1pxbS6KnnY7rs5FkBPzO7BZhkKdmQcgIiPkkBOBkYUYMjkRB9tsmPDHYdGziKWyyIkAS5NSeSCf3dRKsNlo1VcVbCqNpSmkMuVnhUVRxFePj+NvfnAZ8XWZ23hawI2FGG4sxPDoM2OgKGB/kxV37XbhDXd64HGZpLp84jZEgk2C2MJ7n9+B9z6/o/Df/lgaf/LN8/jhxVkVryo/+siqZxGWYd4mRVE1OQ5Kx9BYKjNgGPA6AerWEWqxzCiz3Iy1UqNXrM5yZt0AfJuBg8usw+nx4Jr6PQNLIaetwyTVaOkI3VDl6KAGix5TwSTSCv2bju1y4ufD83jdMU/h+bmVXE7EpZkw/vb/hvHE1YWSHkMU87NtL82EcWo8gG/+7rOqvWziNkaCTYIog9Okw98/1INT/19A1uzids5PheAy6bC3wYxr89I2CkWSWRzzOWuueaWrxYrT48E1H6MpoM/jRDCxcVblgM+5ZiSPVc+CofKBYp2FRySZRZNVX9GsyFAiU7TmN5EVEUtnYeAYJDK1lT2W2lQVKzyllhGqCxKPj/jhNOnAGijZfy8cbrfjV9eX8KvrS/jm6Sl86c0DsBk3zt1diqbw0f+9gieuLiCYyFQVCMu9RILY+ch5DkGUyahj0e9Vf4vNUiyNmWACRhkGOh8f8WN3fW0cm1n0LHo9dpyfCGLA64TLpINVz2JXvQn9XicGR/2Ip4Q1g6+PrQs0ASCczMJh0iEjiLg6F8VMKInTE0HJt7NMB5PYXW+Cjr29f/02a2RLVZvDgHMT1Tf0+GNpeGU+am608rg8c+taT48H8Tc/uLzhdjOhBF7xz0/hG0OTmI+kqs64vrK3rarPJwiS2SSICvR7Hfj++RkAwJ4GM+bCybLe/Rs4Bh6XMb8JiELZQ68ZCjjUbgdDUzgl0wB2WsMdqrvqTOAYGmkhh4VIEkNjQQDA4Oitr2M4mS00d00GE2i08NjTYAbL0JtmbZWq27swHcaAz4HBkdurI3013SazR5XWYjNgMiBNljWcTIOi8kfQUrPqWehZZsMc1puLazP2GSGH3/uP0xhbkqYe9v79DXjknl2S3Bdx+yLBJkFU4OVH21Bn4dHVbMWuejMm/HE88ugQLs1s3Q19uN2GWErAjYVoYWPR6l3fLE2hzWGAP5besh6zp92OU+uOjKW2+mjOV2eEiWc1sQ1Gx9KIprJlH1fORVKYj6TQ63HIdGXlSVbQ4LGTxFLaGC0m5disK7NRtDkMaLbpt5wW0dVsBc/SOD0RLPm+252GopuJXjvgXvPff//4VUk3gDVY9WQ0ElE1MvqIICSSFXL4ztlp/PszY4VA8O49dXjjnR4kMgK++swYTk8EkVk3V2ilSSWeymJsKVZYuzjgdeL8dAiJtACOpnDEbUdKyCGRFhTZlW03cuBZGslMDjQFBJYHvdsMnKozSKsd+9Trdsi67rNUDAUccTtwfiqkqWYZpcg5vqtUNgOHZCYry9amAa8TM6EEJtZlTfc0mDHhjyGVFUv+Ghx1F39z2Wjl8eQfPa9QkrEUTaHvr38saWaVoSn81yN3oNejfukQoS3lxGu3d9EQQUiIZWi84mgbvvDGPtSZdWi1G/DoWwfw/ANNeOnhVvzuc/dsCDSB/NHv4IgfF6bDa/Z7D476YeFZPGu3C812AwZHAzg7EVIk0ASAYDyDZEaAUccUAk0Aa2ofldbdaqs+QNFIkkYQgZNjAWSEHA632dW+HMU0WHgcddtlDzQpCmixb10X2tlkkW096OCoH43WtY/vMumQTAuFxzwxGsChVtuW93N4i1OMVxxtW1P7a+JZmHTSHlgKORFv+bcTuLzNqQ1BbIUEmwQhMZeZx+fe0IvDbvua46cBn7PsppD5SApLsZRq8whDieyasT4WPYsZhWeNOowc7EYODiNX0piXrTTbeJwp4+hSCTkRODMZhNdlRFfzzj3NMXB0YRe8FCUgx3xO7Gs043C7rdAk1+914GBr/mvY1WzFdDCJXo99k+thti17qVY8fasUprvVhqVYGpPruvD13Oa/E46023FxavPmpfWBqp5jcN/+hgqvdnPhZBbvfuwMslV27RO3L1KzSRBlCK0cJRcZNbJar8dZ9NhJx9Bld4ZeUyiTWYquZqtiI5H0HI2ORsua1X+BeLCq+2xzGCUf+i6VuXASiUxuw0imUjE0hVa7AYvR1IaB3WphaArdrVbQFAVRLD6jtFLB+K1xVjSVD2ZPjAZg0bM41GoDx1LLtyte8tHdZpO9/phjaexpMMNmYAtNbOudngjiUJsNHE2BpilQFAUKQDIjbFvT2eYwbvjY6+/w4Pp8FONLcUQknKQwPBfB2ckgOU4nKkJqNgmiBFPBBB559CRmQynQFPCj99wDu7H0VW5nJoL4k2+eryiTopX1hnsbzLi5GFszpFwuHENhX6O5aENEpRosPALxdNFSBi3hWQoOI1/WtqoGCw8dQ2MymIDVwMLIsapvu2JoCl3NlsIwfI6mkJHoucPQFHQMhUSJTVY9bbYN+8rbnQZM+LUz67McTpMOFj2L//itO9BqNxS9zW995SQevzQn2WMebLXiu793N2kWIgpIzSZBSKzVbsDLj7QhlRHwxTf348psBB//4RXMhrZ+QRdFEX/1vUt4+T/9quIjuxsLsXwTkYpYGoiksrIHmhxDYcDrhMdlkjTQBAC3y6j5QBMAUlkRDRa+rM/x1ZkKx7PhRBaN1vI+X2ocQ8HjNBYCTQAw66U7SNvXaC450ASAsXVlKGaerclA8+49dfja2+/AqQ89gF+877mbBpqjizHJy0X+4IEOEmgSFSPH6ARRorfe7cNsKIGX/L9fwusywW7kMDQawP5mC/Y0WrCn3ozuNhvM/K0fqxsLUfzrL0eqfuzBUT8GlgeUq+FAy8bMkBzqzLxs/0axhsrNzk2F0ObYfP6jjqVh4fOD60+OBbA+hFY7qM4I4pqfAyB/LNxg4avesMMxFJIZAX0eB06WOOInlsyuWe/qdhplr9eUEkUB//qmPjyvs3Hb2/7fxVl88H8uYDEqXbmI12XEvR31kt0fcfshwSZBlOGDD3bhfb/WCR1LQxRF/OD8LP78Oxew+PQYAKDewuPzb+jFEXd+luNcWLpf+ENjfnQ0WjA8J23GrxRKbbuZCSXR1WyVJRC4NBOC06SDP6bM4PZqNVr1mwabZp7BUiyNpVgau+tNGF1cW2ZR7a5vKbDM2ixYIpNDIpNCV7MF85FUYYC+UcdgX6MF8XQW1+ajEMX8x0w8i4V1gSlDUzjUZsPQWBAji3EcabeXNKsykxNxuMlS6ICXMsuqBB1Do9e99elGNJXFn3zzPL5zdlryx3/RoRaS1SSqQo7RCaJMK4EXRVF48FAzHn/Pc/DyI60AgIVICm9/dAjJjABRFPGux85I9riCCCxEU3CaSq8VlcrlmTAOt9uhxOtNtXuqN5PI5JDJChjwOso+plZDbIvmjibrrePTGwuxDdnCKpv2JbFZk9KlmVvLDPo8DoiiiDMTQVydi8Jh1GF/swUZIYeFSAoNFh79Xge6mq044rZjV71pbaNNGf/OS8tbmw612UBtyAVrWyqbw4e+fWHTvxdyIt75n6dlCTQB4K49Llnul7h91NbbO4LQIIdJh08+dBjvuX8fLkyHcHE6hEgyC72Fx2/e7cWVmQieurEoySpEfyyNziYLIsmMokel0ZSAMxNBNFl5tDuNss5IHF2KgabyI4GkFkkJGBwNwGnSwWHk1swP1ZorsxEcbrdvqL0z6RhEkltf9/nJEFwmHZZUzOLObFHPvBhNYzG6sVzCH0uvyTzPL2992gxHl54viaWFwnrQfq82tkiVYz6y+dfzI9+/hJ9emZftsXfySC5CGSTYJAiJuF1GuF1G/Hp3c+Fjv3vvHgDAl341gr/5wRWkJcjaXZmNwOsyosGiR04UkcwKuDClTP3ZbDiF2XCqrA55hqa2bCxqdRjgMHKIJLPwx9KIJLOS1PZtxR9Ll1Xzp5ZoKgOWppBd/vrxLI1d9aY1jTfFJLM57G8xqhpsGnSMLJum+jwO0BSQzoo4O1nZ929e5U79SrzwYDM+/J2LODnmx1I0DT3H4JVHW3F8xI8nry3K+tgjizEccSt/okLsHGT0EUEo5G1fPoEfX5Yn+1DpbMZKNdv0W2augPxRbmeTFeP+GKx6DtNFbt9i0yMYTyO+qrPY7TBgfJNaRSkdbLHiwrS2m0TcTgOSmRy8LhMoCpgMJDAVLP1ro/TzYjU5RnYd8zmrntV5oMWKixr/vq8w8yzaHAZQFHBlJqLq4X+704CjbgdedrgVz+2UfnA8UXvKiddIZpMgFPLmu3y4OheVZRvQ4IgfA77lBgIRiKQyuDwjTSORnqPhcZlg0jH5Bo6cuG2gCQA9bbeaN1wmHhY9i0jyVh2iy6QDTVFrAk0AcFl4RYJNI69+E812LHoW4/5IxVnewRE/DrRYoWcZMHR+cDzL0IrMbZW6ROGo2y7JUHg9q/3v+4DPiXF/HG6noXD0r7YJfwIT/gTOTARJsEmUjQSbBKGQu/fW4YGuRklGIRWzPoNVbRaIZ2n0tNtxdS6C4dl84Nps06PRokMkJYChqS33tE+HEoXB2WP+ODxOA7qarUhkBBg4BmNLsQ2r+wCAVqjrNZEWtj3iVxtHVx8Yrc/idTZZqr7PUvhjabidBoxLMM+ys8mCc5PB6i8KwGRAndWvpXKZdBgc8cPA0Rgs4U2d0t77wD61L4GoQSTYJAgFDficsgWb6x0f8cPI0eA5BjqGRrvTiGAig+vz26+/tBs51Jl1GwLYmVCykNWkqXxAO7YUR04UQVMUaDrfpT8bSmIunMK+RnPhc8f8CYxpaJD2+akwfHUmTAcTSJW5QlQpSzHp61avzEZwpN0OlqFAU/lgWxBFcDSNyUB8TbkDS1M40GpFKpPDldnyM+UuE191sFln1mEqmIAU3yK30yjLyYKUVkZGlTO0XklsGU1ZBLGiqmfNxz72MVAUhXe/+91rPv7000/jec97HkwmE6xWK+655x4kEtp5kSEIqVyaDuPzT9zAUokDlO/eU4d3Pm+PzFd1SzyTQyCewVwkhZNjAVyfj+KYz7nlaBwLz8KoY3B9fuuj1tzyruvZcBLzkRRmw0lMB5OYCiRg5hkcaLFsmfncTCIt3T7n7YwsxhTL9FViIpBAT5tN8vs9PRHEidEAjo/4cXIsgNPjQQyO+jEdSmJvoxkdTRYMeJ0w8QzOToRgqrDkgGOqz1K32A1ryi+qUV8DI6+01UWxkT+ext8/fhWPPj0KjbV8EBpWcWbzxIkT+NznPodDhw6t+fjTTz+NF7zgBfjABz6Az3zmM2BZFmfPngVN3g0RO5DHZcRDn7+OT/34Gv7ipQfxqt62LW9v4lm854F9+M7ZaYwuqZNhOT7iR2eTGUuxzIah2QDQ1WKtujYulMgilKisZvTSTAQDXgcGZRyvtJqe03YNX1iiQKtU14q8QRir8LkqxSDwc5MhDPicOD0WqHq3ekajGezVAnFtLx340LduzfuMpQX89nN2q3g1RK2oKAKMRqN4+OGH8YUvfAEOx9p5Ze95z3vwzne+E3/8x3+MAwcOoKOjA695zWvA88XfUaZSKYTD4TV/CKJWmHgWrzzahlhawB9+/Sz++ec3Nr1tPJ3F8ZtL+N65GdUCzRVXZqOgANgM3JqPO00cTo2r35BwZjKEI247jrrtsj+WFOOo5DSyGIOFV7fiaTGaRpvDgD6PAwNeJzqbLOBL2Col1eilwRF/YStXNSIp7c5VXZERxJpYOgAAH/vfK/j2mSm1L4OoARUFm+94xzvw4IMP4v7771/z8fn5eRw/fhwNDQ2466670NjYiOc85zn45S9/uel9ffSjH4XNZiv8aW9vr+SSCEI1D3Td2lf88R9ewbsfO433fO0Mkpm1G1SMOhZ/+q0L+P3/PK30JRY1H0kVxqqs2NtgUX2vNgCkszmcHg/i1HgQnU3m7T+hCtdmI+iVIJCRi56lEdlim5BS5kJJnBwLYHDUjyuzEWSFHPq8ji2DTpMEazMpCuhptyGQqD5w1fj7igI1toRV6n1fP4enbyypfRmExpUdbD722GM4deoUPvrRj274u5s3bwIAPvzhD+O3fuu38MMf/hBHjx7Ffffdh2vXrhW9vw984AMIhUKFPxMTE+VeEkGoav2x17fOTON/Tk/h4nRow21fO+BW6rJKcnE6jH6PE2aexVG3HWcm1M9qrsfIXIITTQsb9ngTG60/whZE4ORoAL46E4yrgkq304hejwN9HockO+4PtlhxdiJU9Hi/XK4aCeIqrZFVQ1rI4bO/2PxEhyCAMoPNiYkJvOtd78JXv/pV6PX6DX+fy+XfNj7yyCN4y1vegiNHjuCTn/wkOjo68MUvfrHoffI8D6vVuuYPQdSS5+yrR6N147FXsaaG1w644XYalbiskg2O+tHm0OPUeBCprPpZzfXkDAM5msoPPh9VZ/B5KQ60St8gJKUrsxE0WHgc8znR0WjBuD+OobEATo4FJMmSX5gOo9/rgNVQfSkBo4Wl8SVgqNrqcXjy2gIWS2ySJG5PZT2jh4aGMD8/j6NHj4JlWbAsi1/84hf49Kc/DZZl0diYP07s6upa83n79+/H+Pi4dFdNEBpi0XP459f3rsnuAMD/XZzdcFt/PL3ljmO1JDM5Tb4QH2ixYmxJvgHkB9tsGBzxa7YDuM1uwNl1u9G1aKUGeXhOmkUCq4kicGI0AAoUDlXZmX9yLIDOJgvqzNrOcHIsteXECK3JicATVxfUvgxCw8oKNu+77z6cP38eZ86cKfzp6+vDww8/jDNnzmDXrl1oaWnB8PDwms+7evUqPB6PpBdOEFpy1O3Ad3//7jWjVX52ZQG/WPcLuNVuwP37G9d/umr2NZpxoMWKiUBCM8PN9zdb0OdxYH+zBRenw4ikhO0/qUILkRSOtNtxqM2GjkbtjUBqsRsKe9G17vJMWNYxUqFEBosVblJa7cpsBHVmHvoSGpzUks7m0OvRbh1xMTcWqi9zIHauss4lLBYLDh48uOZjJpMJLper8PH3ve99+PM//3P09PTg8OHD+PKXv4wrV67gG9/4hnRXTRAatLvejH97cz9e87mnEU8LmA0n8aYvDuK7v3c3uttsEEURZydDmAtrJ7OZSAu4GtDWi4RRx+LkmDK1o5OBBCZXrcbs9zpwQqGRS9vJrweVPlMol3Ayi9h8FB2NFlkynABgMXCABFt1rsxGcNRtB8vQODHiV3XneDGRZBYWvbwTCGgK6PM64Y+lS1r0sJU+jwN/+PwOia6M2Ikkfza/+93vRjKZxHve8x74/X709PTg8ccfx+7dZBYXsfMdbLXhHx8+ird+6QRWElKx5SHlf/I/F/Cfg9oqJ5kIJNDmMKwJuNSm5qBoKeZCSoGhgHansaKtPWoSciLsRm77G1ZIx0iXjTw1HgQA9HocODUW0EzAaeAY3FyIokPmZQO9HgcGR/zgWQoOI1fVLvuH73Br5meH0Kaqg82f//znGz72x3/8x/jjP/7jau+aIGrSczsa8FB/O/5zMD9Zwe004tFnxjQXaK5otWsr2JwJqXctWZVn49SZddhVZ0ZOFBXL7kotlJBvluX5qRD6PA5cmQkjmpamvGJoLIA+j6OqrzdLA0fcDoz747AbOAxX0Tnf2WzB6fEgojKWjwx4bzXFZQUR2Soaufo8Drz4UItUl0bsUNotWiGIGvbmu3wA8qsfG616WGU+EquG1vaCz4fV62pllzNneo5GT5sNfR4HDrXZ0Go3yP7YTiMHg47B4Ki/ZgNNj0v+bOzJsQA6mqWdWpKrMpt+1OPEidEA5sIpjPnjONhS+fXllo9ElmLy/BzUmXVrRpwd9TjKnuNq0bPwuIx413178ehbjxV+bghiM9p9BSSIGrav0YxWuwHdrTYwNIVn761X+5I2pdNQo4RJxyAmUcaqEoMjftiNHOKpLM5O3pqT2tNuw1RQvozrngYz5sNJTPi1k2GuhJ5VZj7ktMTfi+3WcVLApsfsbqcRQ6veHCQzOUxUeFJg0DGF2aThRBZ7G8y4VmU95Xq7680VraP11Znw8DE3rsxG8KEXdW3YPkYQWyHBJkHIgKIofPDB/djTkN9+4zTpUGfmNTeLzqJncU2mZo5KNFr1uLko36ijUgSL1K6dncgf315fiBb9+2o5jbqqmzS0QKlh5G6nETMSNAqtWIqlcajVBj1H4/JMBCKAVrseeo6BP5ZGMJ6G22VCJJnB+Lo3BBY9u2GSQyiRQZ1Zh8VoeVuP9tSbcX7q1pucxWgKAz4Hcjng7GRQkrml8+s6+k+NBdDTbsPZiY1LKFaYeRZf/+07UWeujTWahPaQYJMgZOJ2GvHNU1P48eU5mHkWf/j8ffjjb55X/Dp0DIXOZit0DI1sTsR0MIH5SAocTaHVblC9CcXrMqLBymM2lILLrFM92NzMybEADByNYz4nTk8EkZaw/ODUuB++OhNGNPpvL1Vcgax0u8OAU+PSlxmcm1obbK3UXfZ7HZgIJHBxOp9xPNhqxUI4hblIastaT1+dqexgc/3qz0A8g8GR/P0f8zkrykiu1ud14OS6aQuCCFyYDGHA50QiLWAhksLsuokZd+xykUCTqAoJNglCJn/27QuFjlcgvyrvr156AB/+7iVZZ1q22Q1otuuRFkSkMgJGl2I4t+pI2OPKrxP0x9KqB5oAYDNwhRfUcf/Wx5lqS2RyOD7iz28dqvKFf7VsDpqu6y2VFFt+tmPiWUkyfKVa/wbgwlQYOpZGu9OwZW3tyGIMZh1TViNTdIvayWoar2gK6PNsvilLELHm+bw+sJVzwgBxe9BOsRZB7DDr68B+cmUeE4EEHn3rABwy/vLOiiJOjAZwdiKIK7MRJDNrM3BjS/l1glrIog34nGtqI2tFLFX8hX9vgxndFa6XvLEQhbNGdndv5tRYEA0WeTNggsKjsZKZjcFiOpvbtr52MZrGnkZLWZuAArHNM6HX5yMbVt3uqjehu9UKA7d1+cLhdntZK1mPj/ixd7kEiKKg6QH4RG0gzyCCkMFiNIWlIi8cn3/iJn5wfgZfe+ROWTbW2Aws6sw6Rbqnq9XndUiaHVQSS2/81dnrceDafBTnp0I45nOWfZ/RlAB/LI0BX21tjlktmxNh5llZB5Jfm4vCpGNkD2pXNNsM8NWZKvrcMxNBHGy1gWO2jzhtBg5zW2xIyuaA+XAS/V4Hej0OHPM5MbIQw/mpMPQcXVUHfDE0nZ+/2dVsxS+ukVWURHVIsEkQMri6xfH0vz8zjtd+/hk8p6MejVZpXzBDiSwuTIXR6tB+sLlUZj2blujXZZJcJh0uTd/K0B4f8aPezKO71YoBnxOuEjOWNAUIgoijbruUl6uom4sx7Jd4NNF6LXYDFiRYXVmKa/NRjC7F0Od1oJKx5ecmQ9jTYIaR2/rltpQ3n8lsDidGAxgaC+D4qs1HgXgGl2fCOFAk4OQYqqImQAvPgqIoXJwOY8KfkHV+KrHzkWCTIGRg1rN4SU8L3vHc3TDpNh5xLcXS+PwTNzEn00xJre/y6Gm3IV7mbD8tWT2X0aBjsLvejMS6coWFaArnp8IYHPEjlRXQ792YsXQ7jTjcZkef14EBnxMelwlD40FcnA7VdA3nqMwlGqmsoOjGH1EEzowHsbu+sgzn5ZkIOpqKB+AWPYsBrwOnq2x6EsT8SKj1pRhH2h2IVDAg/uRYAP5VpzNfeWq0qusjbm+UqOZuuCLC4TBsNhtCoRCsVnnfHROEEp64uoC3fOmErE1B60nRuSqXnnYbLkyGQNMU2h1GZHMiGiw8To0HoOCXqGr37K3DzYUYJsuY+djZZEEklcVUIAGKArqarYUu5/V62mw1Wc+64kCLBRenpW9AY2kKPEsrNo81f0Rtk2TQflezBZdmbn1NbAYOVgMr6XzVziYLQokMDDoGDiOHobGgJPfLMRQ+/JIDeG2/G3Q5hajEjlVOvEaCTYJQwNM3lvDlp0bx0+F5SUfmbKba9XtyabTyiCQyiGc2fg20HCDvqTchLYhwmDgIggg9x2AiEK8oM80xFA612hBKZnB9fvMM4KE225opArVmu9mN1TjcZseZyaAs972amWfRajdgWKJZtKuHtOffbMgTkMvJwrN4dV87/vTB/STovM2VE6/V7jkNQdSQO3e7cOduF/yxNN765RM4vWokkhwYjb4INNn0mwZox0f8MPOMrDuhK+E0coinBUyHkhiXIBbOCCKGSvj+F+uCriXnJkPYXW/CjQXpj9RFhQ7RPS7jppnnSlybj+KOXfmxWb0eB06Mau8N4XYiqSy++KsRzIYTeNuzd6Gnza7Z3zeEdpCaTYJQkNOkw5d/cwA9bZWNxylVKqutQGXA54SvzrRlpstl0mkq0Gyy8hjwOZHJiZiWcFtNKTqbLJoYTVUNUVwe/1NhneNWzk5W1vFfjla7QdJAc0UiLYBjqJoMNFf7wflZvOKfnsKHvn1B7UshagAJNglCYVY9h6+89Rj+4IF9JXcpl4uh6IqbGeQwshDbNnha30Hf02ZDo4WHmWdwsMUKt9OAfY1m2b5mqx1utyOczGJwxI9IUtlGpmM+J67MRhQdXC6XUCKDyWAC3a3Sl0QdH/HL0rXPszRabHq4zPI8zy5Oh2HU7ZxDxTDpUidKsHOe8QRRQ2wGDr9/315kcyI+9ZNrkt//0Lh0K+6kQJVwynZhKoRejwPZXA40ReHyTLgQcF1YlWGyGzk4jTr449KPTtpu04oSlqLKjPRRSjKTw6WZCHo9DgxJXEd8ajyIfq8DF6dCReuAN6NjaRxut0MURaSzOcQzAqLJLILxNBKZHKZDSdmy2dmciH2NFk38XErhof52tS+BqAEk2CQIFb2qtw0/ujSHyzPSH9cB+exPd6sVo0txxTN0K1iaQqCEwDAnoqRgJBjP5NdtjlUWbLY5DOAYekOm1WnUocHKqxpoAsCMwkf2ShByIobGApKv+QSAE6MBNFp5dLeZkEgLYGhAxzIQxXw5SbGO/lxOhLi8aUsN56ZCsBpYhBO1O/5rxWRAuk56Yucix+gEoaDvnp3Giz/zy8J/tzuN+J/fvQtvvNMj22OenwqjzqzMtpViDrZaJT8SPjUegNdl3P6GRTTbDBj3x3HM54SZZ9Bs06OnzQaKgiZ2xR+scN1lLRgc8cuyOWsunMLxET/OTYVweiKE4yN+DI76cXYyhENFvp7ZXD7QlLvuczOJtID9m8zdrDWPPj2m9iUQNYAEmwShkGRGwF989xIywtrjPj3H4C9fehCfff1R2db8KbXabz2nicP4kvSZj3zWKodDbTZYDaV/zQwcjcszYQg5EcdH/IimBMyEkjg7GSq6XlQNx0f8qFfp+6WEcr5fUtiqU/r4iB+tdr2CV3PLSnaz1s2Fd14mnpAeCTYJQiFfOzGBxWgKDE2h2HjbFxxsxg/e+WwckaHpISPk4DBykt/vdrwukyy1lUD+uPncZAjhRBadTaVlyw602BCtgc1FNoPy3yulyDEKaSszoc3f7NSZdZgKqhMs7ZTspj+ervkxXYT8SLBJEArICDl89hc3AOS7Ub/4q9Git2t3GvFfj9yJBw81S/r4p8aDyGRzGPAqd2zoqzPhlMzzRFdsF5zVm3kcapNmC4wSctratSEpfyxddIe3HAwcg9lN5rrSFOBxqTuxYSdkN0UR+MefXd9wYkMQq5FgkyAUMDQWWNP48Vffu4QPf+di0V/QHEPjE6/ukTzDGU0LiKeVyeo5jBxYhQY9dzVbN+3sHfA50WjlsRhL1dQ2HvsOzmwC+ee4EtJCDkZu42OtrKCUuju+XKVkNxkKONBihcdZWY2yEj7z0+v4tU8+gZMqN9cR2kWCTYJQQLG6pi89NYqHv3C86DGfnmPwhTf2wanATEkp7a43oc1uQCCeKazlk9vwXAT9Xgfa1s3pXOl8ngunUGuJwsvTIexrNMs+/F8tOkaZNyJCToTTzONAixU9bTaYdAx4lkabw4hzU9p487FddvOIx4GL02GMLTe1adXNxRh+4/PP4MtPjap9KYQGkWCTIBQQ3mTs0OCoH8/9u5/j7x+/isV18xXrzDw+8MJOSa/DxMt3ZDfgc2JsKYbJoLKjUITlzuLZUBJ9HgeOuO3oabPhRA1nWdpdJlydi+LsZH726L5GM3bKRkCKAhaiyjVjTQYSuDgdxtnJELparOhpt+O6Qm+ESpFIC+jcIrsZWNW4dnzEj36vQ4nLqkg2J+LD372IqxLtkid2DhJsEoQCIsnNt2wkMzl8+ifX8JrPPb3mhQUAXnG0TdJNQPMR6QeG2wwcDrXaMDjiR1bFsq1sTsTJsQBOjwdxcyGG7pbazQraDbcy2kNjAVydi8LAMYrW3Mql3+tQbRXnidEAhjT4JuTEqB8DPmfRaRTpdaU2J0bzY7+OtNtxzOfE3gazUpdZElEE/t9PryOXq7HjBEJWJNgkCAWUMlD95kIMb/vKyTWdnQxN4ZF7dkt2HXaJmxFoKl9fqJUjyRWRVLakrUVa4DTqwK07Vk4JG7t7Y2kBg6N+7GmQt6ml1W7AgM+JunXrGr0uIw612orWQJaqz+PA4Ih6dZIWnoUWt4CKYn4GaTqbQ5/XAV/dre9xqshmpNGlOE5PBHF8xI+pYKLimbNy+c7ZaTz4mV/im6cmSdBJACDBJkEoYqvM5mpDYwG8+7EzEFb9gn5hdxP0VbzArzDrGCxKfHzZ2WTFmD8u6X1KJZXV/jiWvY1m+ONp1Jl57G3MZ6iMHI2rs5sf8/Iss+FjFp6BSbfx4+VotvHo9diRygoYHPEjlcnhmM+Jo247HEYOo0txnJsKgWMZDPicZddd8iyNa/PqHq9yrLZf8lLZHE6OBjCyGENHowVH3XbQ29RPxNMCYmkBNo11tV+eCeO9/3V2Q3kQcXvS9k8eQewQ5ayK/OHFWfzV9y4VZnFa9Bye39VU1eM323g4TDpMSLxaTq4h9FLQc2zRxiEtuTYXxYEWK2ZCSVybi6LBwsNq0CGxxdzCi9NhdLda0etxoLvVhnoLj0hKAE1ROOZzwlDBG5N+rwMzoRSGxoKFNySRVBbHR/w4NR5EIH7rzVIokcHgiB97t9kExDEUBrxOOI35DKmvzoRQCesZW+0GHG63o9fjQK/bDo6h0GTl4XEZCwF5pfyxNJpttTEwf3guglPjQcyWsL50IZLCPhk2M1Wrz+NAg1WdofmEtmj3lYIgdpBy95J/6alRtDkMeNuzdwEAXn60Fd85O13x40dTAurN0v+4xzQ8IP3MRBAGjoHTpO0xQqHErUCu1Jra81PhDR9bCQ4bLDyMOrGkjUgU8o1dm42O2srF6TCOuO04PR5EnVkHr8uEnCgWZqt2t9owOOqHjqXR73VAx9CgABxqt4FjaFyZDiOa3hhUtzoMa/anm3kWoUQWiXAKvrrKj4ttBg4elxFGHYOZ0M7Ltl2d007T04r3/VqH2pdAaATJbBKEAko9Rl/tI9+/jOM3lwAAd+5ybajr299sKXk0UiSZlWWM0upASWuabHrYjaxqG2JK0dNuw6TE2eb5SAq7N6nr1DEU7u2oh9tphK/OBLOerSjQXHFlNoIBrwM5Md+cdWo8CF+dCb1uB4aX98ynszmcGA1gKpjA4XY7zk6EcHI0gF0NZvR6HBjw5v/sb7bAqmfXBJoAEE1lC5nekcU49jeXl8GzGTgMeJ2Ip7I4NxlCdpsaQq/LCDNfXUmCGkKJzIbfEWp6690+HNvlUvsyCI0gmU2CUEC5mc0Vf/Tf5/Cj99wDPceg3+vE9fko/LE0TDyLSX8cHc1W+Evc6b3VjuhKKTWcu1wukw4mHaP4asRy7KozYUriQHPF9fkYGAprmmEoAJ3NVkz44xiXqM42kRYwOLq24WdkMYYRbPy6jy7FMbp063ErHbJfbNVrMSxNodfjwMWpEAZXdaAvbpI9brUbYNGzuDIbweF2G85MaKvpbTu+OpNqXf7rDXidko9tI2qbNl8pCGKHCVeYARxbiuPUWBBAfrXefCQFURSRzGQRSQkIxku/31Aig16PA30eR76WToJMJy9B45IcdtWbNB1oAgBNU5I3bK3wx9LoWzcmqdfrwLnJ0Jb1oFrnNOlwZYvmqdW6WvKbpdYf1Y8uxdeMkGIo4JjPiflIEleWs7FnJkJotRvQ59HuTMvVfHVGxDVU0rK7wQRWo29ECXWQzCZBKKDSzCaQn8F3524XPMvjTQQRELL57M71+SgGvA6ksjlkcyKuzEbWdLKvtvJCukLP0jjmcyKaymJ8KY5ImS9WdiOH8SVtdqJXUragpJXtRnI6PuJHV7MVPEshkxNxcjkDyVAUrAYWDRYe8bSAaQ2XGaznj6XR7jRgwr91Rnhvg3nLzOmJMT962mxIZAQsRtNFSwmmggkkMwKcRh38ceWG0JeLZ2mE4hn4y3jjKbdrGqwfJdRFgk2CkFkyIyBaxU7ylaPWzXYjrz7G9LqMSAu5kgKIZDZXeJH1uoxlBZsNFh4mntXMsd16Rp02f7V1NVsLo4WUcGlmYyPRykSC8HJneFezFTcXokiqOZG/DPVmHjxLYzGaLiuzv5ooAjOh5LYNWUuxNFiagpln4TJxGNsmyFVDR6NFc3Nuh8YDWIymUGeujc5/Qn4kz00QMrs2F61qN/fQeD6YdJcwuHl0KY5MVoS5zLWUpdZ90hTQ63bAH0tpNtAE8p3oWjwC1XO05o73L82Eqx4ppKRT40Fcn48hnhYwsMnqxkAJmchSj52zORHRVBZpQZR0m5dUtLi8oMVmAEeT8IK4RZtv/wliB7lcJLtUjpWmII+rtBe6hWgK+5stuDxT+gBtlqaxu94EE89CFIHzm2RKOposheBXy3iWQVRDNWwA0NNmw8Xp6p4LctFztdd9nc7mMDgawF27XUhlc2CXG+Byooh0NrdtPWyqjEwuRQGL0ZQmZ7ZOBLRVymLVs/if370LNqO2R44RyiLBJkHI7PJs9QHGyGIUvZ78CsFSmkqSZTaB+OPpNXVpexvMuDYfhc3AoaPJgoyQw3wkhXSNHLW2Ow0balTV1NNmw9kKu6+VoOURVtt56sYSvC7jmk73UtA0gBKfzqIIZAQRCxHt1W76Yxm02vWqjfiiKeCF3c148aFmjC3FwTE0GeRObECCTYKQWbWZTSDfld7rccLtNJYUbBq46n60bUYOAz4nLk+HFKsvlApF5Ws29zWaNTPomtd45vDqXBQDXueaEUG1JFzCZqL1TDoOqWx5wWMsnQVLA1p7z9VsM6gSbNqNHL729jvR0aS97UWEtpCiCoKQkSiKkmTYVrI2pR6lV7tLPZbKYnDEj0iq9sbkiGK+ZrPUbTxKGFuMQafxvdxLMe18vcrR2WSpqFu8qYK1laIItDkq32Ikl+32p8vlvQ/sI4EmURKS2SQIGc2GkxV3zK42tpRvKnFv0pG+3qnxfINMThSRWw6+yhGrwSBzvd31ZgyNaaO+dC6SQrvDIPlueinVSjf6enSFHTIWfWU1hS6Truwje7mVOuheKu947m7saTDjZYdbFX1conaRYJMgZHSljCadrYwud357SuhIX3FyVaB1sMUKUMCFIju1i7Hqa/9XQyyVhYGjkcioH0S5nQaMa3BszmrRKmbBqqXOrCs63qkUlQZoWhxWfnUuil6PAzRFgaJuNRVWw27k8LFXdKPdacTPrszjs7+4iWgqC4oCXna4FXsbSUaTKF3tv6IQhIZV+kJY7H6C8TR21Vc2oubCchd0n9dRGO69mQGvY8MKwlp0ZTaCeguP7tZ8gJ4DcGM+ioAKw6/rzXrNB5uhRAZ7Gsy4Pq+NOtetHHXbEUsLyOXEKrYwVZYRjWlsygGQ/96tzuIfbrdVFGwaOAbveO5uvPXuXeBZunA8f6DFhtff4cF3z83AbuAq/j1E3L5IsEkQMlo5/q5WRhDxzVNTeMOdHlh4tuxtPytOjgbQ53UglMgUtnwcaLGCpSlwDA2KAiYDcbTY9TBw+fFBc+HarOUDgIVICgurajcbLMoPmdazNM5NBRV/3EoEYmkcbrfj2lwEsbR2SykoisLEUgxNtipGEVUQa3IMhatz2plyUAxFAbmciF6PHQCFnChibCkGf2zzN1n7my3ICiI+9spu9HqcRW9jN+rwhjs88lw0seORYJMgZLQk4e7r/xgcx1ue5cUDXY345umpiu9nJbPpWt6NvtXsxwGvo6aDzdVMOkaVpqGDrbY1JQ1athRLI5bOwsixmg02OYaCIIiIZ3K4WcVigcERP3bXm8oasu8y8ZgNa3u9Z2eTBefWlcsYOBr1Fn7NGy8AaLUbEE6kcXkmApuBK7kBkSDKpb3iE4LYQRarrJta7fp8FE9eW8Tv3Ltbks7mpVgaS9tcn9YaIaoRSwvYVafsi2lHoxnDGpr3uR2OoeB1mTS9C/yo24Ezk0FJ7stV5jrF2XASNgMHhqZw1G3f8rZ9HgcGfMWzhHIqtj0skclteO7vazRjKpgoTJwIJTJ45NEhZAT1a5yJnYcEmwQho6WotJm0P/rGObjMPL7+yJ0ld6ZXg9NgM0Q1jLxy8y6Puu24sRCruORBDXsbLJoahl+MlI3X6zN9pQglMhByIqaDSfR7HTjmc2LA58TBVisAwGpg0dO2nM1WuEt8K8dH/PDVmTDgc2Jfo7no4oehsUBND/gntGtnvZIQhMZIeYwO5DMrv/cfp9DRZMHP//Be/Pfv3ImX9LTIth+51a699XzVuDAVRk+brfDffR4HOhrNsOhZmHXSBqKCKCKb006wUYpgPA2NjwPFsIQ1k1ZD5ZVks+EkTowGcHzEj8ERP8aW4thVZwIFqrAtSo3v/laj1kYWYxgc8ePqXHTThrVvn5mW69KI25jGf60QRO2Kp7NIlLk2shRP3VjCb33lJOYjKZwaC+IFB5vwmdcekfxxOIaSZPuR1pyfCuFgixVdzVacHAtgKZZGMiMgJeTQ63bAVkUAslpKAyOXyjUdSqK7za72ZRR1pN2OziYLhJx0X1eeke4NRiSZxc3F2JrMYFSFrHYsXd1j/s0PLuMV//Qr/M0PLpe99pYgNkOJSk+D3UY4HIbNZkMoFILValX7cgiiYhP+OJ79tz+T7f4brTzeed9e/P2PrsJm4JDICJgJSde80GjhMaehLTxSOdJux+WZ8KZDzF0mHZwmHa5JMAJoZcd8rRnwOTW3ptTI0YhLHMB3NslbNsDQFHQMpeis136vA7FUFmaeA0UBQ2P+itdr/tmLuvCbd/ukvUBixygnXiOZTYKQyXbNN9WaC6fwL0+O4Lfu2YWbizFJA00AcJcxQL6WLMZSW27LWYqlMRlIoLPCNXwUgK5mC/q9DsxpvHN5M4MjfnS3auvN/u4G6Wc7XpmNoKNRvpmRQk6seFNRpU6MBnBpJoLBUT+Oj/jR2Vz593FUotFtBEFGHxGETKRuDipmMZpCiwx1lfVmvuwVl7WizsRjYpsB64mMgFQ2B5oCNiu7POq2g6YoTIcSaLEZEExkkMuJaLHr8cvrSzJcubJ4Vrlmqs3UW3gkMwL2NVowsiBPhljOo70GC6/KuK3VmCoKuoUaqzkmtIsEmwQhE6mbg4ox6hhcnApJfr+tdgMWFAiW1bCyFWU7I4sxtDsMMPHsmqPWfY1miGJ+//yK6eCtDGZQw2ODSjXgdSCVzeGI247Tq/6dSuIYCtFkBolMTtYd91fnorDwTGEEkJTqNRBsVjMmbadNoyDUQ4JNgpDJYkz+F5lgPCPLjuIbi9GiQ6B3gnF/6bNDJwIJ6Fi6MC9xJpjA1bmtM2z+eAYMTcmaFWp1GNBg5nFawuyzjqFQZ+FhN+gK60pXd+4rbW+DGZdm5B/DpOdoRGUINLXixGgAh9vtFZ1U0HKNuSBuO+RtC0HIRInMZiqbk2VXcySZhW+HbhNZ2ZxUqnQ2h8Hl8TYTgdL2mzuN5T1GOerMOmSzOVybi6DFrpfkPo/5nEgL+dmRl1ZNILg2H4WBU+dlglUoq7av0SLbUbpWMoPpbGXB9HfOTiGcJHM3iepp4yeBIHYgJWo2AeCxExOS3ydNAXOR2mxu2Y7VIH/Dht0oz2NY9CxMOgZzkRSiaaGioNbMM9i7qtmm3+vA8U06z+NpQZVRSF3NVpyblL48pBhexsGiUmz6kkKlwfRiNI03/uugYr/LiJ1LGz8JBLEDyd2NvkKOWZh9HifGtllV2d1qQ6/bAYu+xqpxFOh5cJSZPS0Fz9Jotukxtqq5qZLnWGezFTOhJBotPI75nDgxunU95PBsBMZNspttdgOOtNvgkCi4tupZ7Gs0IxBXJrjRczSuyziaKqeRBhtdFRnWMxNBvPBTT+LbZ6agsUmJRA2psVcJgqgdShyjy2W7Ui0dSyMnihgaD4Cm8sewm2XHtKTf68CJUfmvc2wxBp6lkap0wOE6DE1hX6MZ56fWvrGIJDLo8zgQSmQQSmRKakaJpbKILv8pZY5qKJHZ9PubE0Wcngih3WlAYIvNNZtxO40w6hjoWBqzoSTmIymEk8rMJaUpoKPRUtj2I4eIAkfQjVYeFj2H2VASrQ4D0tlcvjEpnISJZ2DgWOSqDBLnIym867Ez+M/BcTxyz27E0wIuTIfgMHJ4xdE21JW5Y564/ZBgkyBksqRAg5Bcjo/40e91IBjPYCGa2rAC72CLtdCNLYqQZVOS1A62WrfN4kllLpKSNAA/3GbH0PjGa4+mhfwObgBH2m3bBpsMBYxuk7Eu5tJMGGYdg2j61vdZz9JYXM6s2g06TKC0etbVmm161d6kHGy1yRpoApXtXi9Hv9eBc5NBzIXzjzO8PDVhZFGe+ZjP3PTjmZtrv19/939X8e4H9uJ3790jy2MSOwMJNglCBqIo1nRmE8CawMzI0Wi0GWDTc0hmhUKg2dFoQUbIKVZfVw2lV++dHPWj3WnYdqbndvY1mosGmuudnghtOarIamDRYjNUtDEnksyiu9WGQCyNVocBQk7EYjRVCFyvz0dxoMUKk45FIJHGtS069jmGwhG3A6F4RrVAs8Wmh1/mn0+jjoG/gmzvVg632zEdTMBu5CCKUOzN01bSQg5/+8Nh3L+/EftkmIxB7Awk2CQIGYQTWWQ1Uq8lhXgmt2m25KZMWRSpHGy1gmdpDI0FFX1cQQRcJQyQ305ZDU1bPOX2N1mrCu7OL89znQxu/PckMgIuTueP+BmawsEWKy5MF68lPurevCFJCTqWBkNTJU8WqJSBYxBPS/cGp9fjKMwbVXt2ZzF2BRrviNpFGoQIQgZKzNjUgpHFKPQqjcYpRZNNj8vTYcUDzRVnJoJwmip/ETZwDGaKBHebOTsZxDGfE/WWjTV0SjWsCTkRNxZiONCycU1is02PUyVkaeXU3WqTPdAE8l/vYz4nbIZ8TqfX44C+iu50tsRlBGpgaQpGnuSuiM1p91WCIGrY6iP0z7+hFw/1tat4NfJJCyIOtao3+Hs7Wnh9tlWR8elutWEqWPoIqpyYr7f1rttrr2dp2er4iklkBAzPRjDgc8K5qjO/zqxDRlA341/N+sZyHR/xI5LMoqvZiplgAh1NloqekwYdg4SEWVKpZXMifj48r/ZlEBpG3ooQhAz8y5nNu/fU4fkHmvD8A03w1Bnxtz8cVvnKpNPdakM6m8NsOAVfnUnRYKZU08Ek6sw6LKpUP8vSwGSFWTQDx+DMRGVZwPVbjrx1popqNauRzYkYHPGjfnnEUkbIrVnxqR5lg92ciMKg/OlQEnsbzJiLJBFObL6Mwe00osmmByAimcnhykwY52RYSyul4dkIXnRI7asgtIpkNglCBovRNHiWxkdedrDwsd+9dw8+9KIuFa+qOkfcdhxosWJPQ36z0PX5KIbnIhj3x0FTgAaSiBscddtVCzQBwOMyVZzJa7brka7wc3fVr93+ZFbxiHMhksL1+ahGAk0gKdE4qkpdm49iV93m27k4hkJGEJa3VgVwbjJU8fNASY9fmtPMXFFCe0iwSRAyWIqm8e7798G77kXlrXf78IfP36fSVVXO4zTg9HgQF6fDiKUEDHida8Yd3ViI4WDrxho9tVBUvnNXjoH35XCZKp8/WO5azdU4eu2vdkblegJaC/UMy85PhdBsU3cu5JmJEBosPHrabTjmc6KnzYZmG48mK49+rwMzodqr+b4yG8H/XZxV+zIIjSLBJkHIIBBP4013eYr+3bP21Cl8NdVbPbR5JpTEYJHB6Cy9/a+TRkv+xbTf6yhkSFfjGApclYGJmWfR0WjGmYkgEhl1s1iV6vU4qhxrcyvDZDOwsm7JKcVCJIUmqzYGf4si0Go3bn9Dmc1HUjg7EcLxET/OToYwE0phNpzCdDBZ9c+A0hosPHQMjU/95BrZMkQURWo2CUIGZp6FUVf8x+uI24EXHGjCD2soCzAZSMCkYxDboknh3FQIrXb9hoYWp0kHIZdDKJGF3aQrBFEtNj32NpiRyeZg1rPQcwwuzYTBMTTsBg5j/vKGj7faDXCYOIwuxnBlVt3gasXgqB99Hkdh8HopvC4jzlTZsT2yGF8+jhWxr9GiiXmMHpcJs2FtZOy0PJYsmMhsu8FLS/765QfxugE34mkBp8eDEHIiWKaG/gGEIkiwSRAyaFzO4pwaD+BfnrwJt9OEu3a74HYacWE6VFbwoQVzkRSMHI1etx3npkJF6xCFnIg6M4/ZUBKCCHA0haMeB85OBsExNDqaLIUNJ0C+WaI4AbvrTWUHmwYdgwtT6h6bb8du5LC3wYxIMguLnsWFqTA6mszICiJoioJeR+PaXBTVlugtRFPo9ThwdiKwoVlILdHU5g0xSgvGtblwwaJn0WjhMSzxMHg5uJ1G3LXbhYeP5U9wTDyLu/fW3qkNoQwSbBKEDHY3mCGKIt7ztTMYW96y8tlf3FD5qqoTz+QwNB6EnqM3bXo5OxmCy6SDr86EyUCiMLw7mcmtCTS3s77G0KJnYeCYTYdZ97TJv3qwUguRfFA94HNgcCSwJsuoZ2mcmZDnuofGAjjcrp2vy2JUG1nNAy3WwgB6NXU0WmAzcsjlRNA0hdlQAuP+BIYV2g1fDV+dETPBZFVjvYjbCwk2CUIGR90O3FiIFgLNnaKUfd9LsXRVA8TNPIvzqwKk/P7nECLJLDqaLIAoYnhVto6i8jWyWjXmT+CYz4nr8xuDbbk7o89MhCTd0V6NuXAKOoZStbPaoGM081zRsRQGNfB9KdehNhtmgkkkszkMzyk7TouoXaRBiCBkoOcYPHltUe3LkFRXs7VoY5DUoqksetrt2F1vwpF2O06MBpBaDsqGZyO4vhBDv9dRuH2fx4HxKldCyu34iB9LMXWORgdH/Ohs0sbOarV3Zx9otmK6jCH5cjFwTGGvfK3oarZgb4MZ5yZDWIimoOdofOwVZLAmURqS2SQImQzVWF3mVpwmHWbDCSjVaLpVJk7IiTgxGsD+Zgs4htbc19njMoKmKIQSGURTWeypN4NlKJxT6ThbRP4I22bgEEqoWwuo5xjVHtth5HBa5VWZK7rbbDWV1SyWHX/7s3ctD54niO2RzCZByODcZBD/e6F2us23QiE/2sSvUmZuMw6TDhemQtBKY7FBx2DA68DYUhwjizH4Y2mkszlcmgmrFmiuWIym0e4wqHoNQL5hbsDn2P6GMtjTYK668UoKXpcRJ2oo0BwoEmgO+Jx45Dm7VboiohaRYJMgZPDX378MQStRUIWcJh0OtdnQ63EovupwK3sazDjQYsVT15c0E2j2ehzQMRQGNTBiaDMXpsPoaVN3j31OBE6OBtBqVz7w1cowHpeZV3hhZuX6vY4NGdg33+XFV992DCYVt1IRtYc8WwhCBgbd5seFDE3VRCDaYOFVz8it12o3YGSh+tFAUqEoYMCrjQacUmhh3nZOBFodBkwFla2zTWpkwP/5qZDi0xMaLPymkxyK6WyyIJXNbZjP2tNmw5+/uAtULQ0CJTSBZDYJQgYHWzZmkDiGQr/XAZdJhwGfc8uAVG0DPqemspkrFqIpNNvUPw4GgGabHgearTUTaALQzLDtJRXGIIWS2uhCT2dzODsZQk+7Mllmm4FDVsih1116+YLNwGFkMbbh4xY9RwJNoiIk2CQIGdiNa+fPtTsNaHMYcWI0gPlICoMjfrBUfouO1hg5GuentJXRXJHO5tCiwhHsaq0OA/q8DixEkriggXmN5dDK5pybizGYeWXfbM1rZHvRClahoM3nMsEfz+DcZBB7G8zb3l7H0ptmnUcWY8gI2sgQE7WFBJsEIYNwIgOnSYcBrxMdjRZM+BMbMgWRlIAWDTRtrNdoMyCxxVpKteVUPAt2mXSYCiRwcjQAmUdkymJ0KQY9p/6vfVEEdtVvH/hIxWbgkFDhGL2zyQyHkcOBFit6PQ4YOAZWPYtDrTYMjQdlfWyDjkGfx4Ezk/nHyeRELEVT23aQH2m3YzJQPNicCibwn4PjUl8qcRtQ/7cOQexAaSGHQCyNwVH/loOP/VUMP5fLyGIMR9rtal/Gpq6qOEh6KZZGg4VX7fGrFU5k0d2qbpPQCoOCY5B21ZkUe6zVKIpCIJ7BxekwhsYCEEURWSGHc1WeHNAU0Ot2gKHy9Zjrv5bdrVYIQm7DWlx/PINkRsDBFmvR++UYCpemt762v/nBZc2NGyO0jwSbBCGDCX9i245Tm4HFzYV8tlPH0pu++Fp4Fj1tNgx4nehqtqLP4wAnc+2dFoPgFeFkFodUDJi0MEKoGidGAzjqtqt9GYikMoq8qWFoCgtlNMdIKZLMrum8T2ZziEuQYe31ODA0HoAgAvORFLrXTRkIxDObbmoKxjO4MB1GnVmHI+129Hkc6Pc6MOBzoKPJgkhq61ONZCaHt/zbII7fXKr630HcPkg3OkHIYLKETttoMovuViuyORHX56PI5kQcbLHCoGOQzORg1DFYjKZwYyG2oXO13+vY0CkqpQYrjzG/djecDM9F4KszFW1ikNtOaJCYCam7RWdlP7lJx8CkYxCTsWzjQIu15KkKh9vs4Fiq6p+tZpsebqcRoUQGHENJ1nlv0jHoarFuuL4z4wEM+JyFMUWlDO9fjKaxGK3sTWWjVXu15oS2kWCTIGQwUUKgJojA+am1DSalNpykZS4Y1Ho4lcrm4DRyGFHhsScC2g3CS8Wz6hxq0VR+w1I4mQ+GYmlB9t3tLF3as/lQq61Q39jncWw4gi4HRQEXp0KIShhE93ocGJ4NFw2E04KIwRE/OposGJ6NoMVuwLCM0yT+5hXd6Pc6Zbt/Yuchx+gEIbFIMiP7MfTZyRB63Y4NXe9SWdLwMfqKjJDDUbdd8RrEuXAKRxQaWyMXi175PAPHUKg38xhZjGNi1S77REbeZjSW2f5ljqHWPudPjgVwzFd5MDUdTKJLwudlq8OAU2MBRLc74k4L2NNgRkbGN6MUlc8WE0Q5SLBJEBIbV+j4eWg8ACEnos8j7fo/HUMhLeRKzgjJrc/jQFfzrRc3jqHQYtcjnMzi1HgQapxqTwaTMGl4Tup2eFb5a88IYtHpC4zMz7NsCaN6er3ODUfdN6ss0fDH0pDqn9ZmN5S0dWjMH8f1+WjV176VFpsBRh05FCXKQ4JNgpDY+JJyx6yRZBYnxwKbdpeWo7PJgsPtNtA0hQl/QjMzGU+OBXBpJgyHkYNZxyAjiJgOJjG6/HXWK9jVvGIhkkJnc+1md9T6zs6Ekljf26YrIfNYje0ypwaOxuUi5Stup7Gqx70+H0VXs7XqNyVNVj0ubtMhrqTZcBLP3CDNQUR5SLBJEBJTo7GGpihYqzwaNegYnJkIaWatH5Cfa7kiEM8UrYGLJrOKXY9Rx8BXZ8I9e+twqobHv8idTdzMbCiJXesGi4ur5qY2bdN4YlyeHXnM5yxkDXfXmzDgc2DA60RzkRmS0VR2ywzj7gYzIqm1z6HD7XZJxvtcmA6DpikcarVhb2N+5marXY9ySmYNOmbb43OlHGixYm+DCb/91SHVOvyJ2kSCTYKQmFLH6Kudmwohksyis8mMfm9lx+rjS3HUmXXb31BBu0vYeGLQyfdrrNVhQL/XUchOxdMCRhZjmAxsP9pKyy5Ph2BUqQzAyq99U3RpJow2uwFmnsFsOIljPmfRBiaXSYcGC4+TYwGcHPUXajGzQg6DIwEMjvoxG0qiZ90YIBr5fewcQ6GjybIhIA3E8gsYrHoWNgOHJqsewbh0NcuRZBbnpkK4NhdFIJ7BVDCJ7lZ7SZ/LMRQWIupODlgx4HXg4nQYV2ajCMYzePSZMbUviaghJNgkCIkpeYy+mgjgymwUJ0YD6PU4ys5eLcXSmpshGUttn7UcGgui3+uAha88s8sxFLpbbYWZiGaeRU+7DVOBBE6MBjaM5qE1Us9aqURGACfz8fVm1j8voykBk8FEIXt3fMQPh5FDd+utMoWuZivSWaFQOiECcBp1qLfwa8Y4icgHr0dWzRFd2RyUEUQMz0ZAAWuO8qeCCfhjaYSTWYQSGcyG8yUaFPIjjFZuajdyks0nTQtbZyoPtFhRb+GREUR0tajfjNbRZMHgui74rz4zhvmwNgJhQvtIsEkQEruxEFX7EjA0lg84yzU8G9FMYxAAXJwOo8WuXxM8FHNiNACaBvq9TjA0BZamcLB185pKm4FDR6Ol8N9dLdblffAiKCq/cebsxOZ1cjqGxlG3HZ1Nlm3X/2nR4XZHSbMY5TA8FwW3zXNsNpzC+akwetps6Pc6MBWMrxk2nhOBUCKNSGLj8PKMIOL0eBDtDgOO+ZwbgtvpUBIHtugUP9RmQ6/HDouexUwoCb2Owb5GM0QRECSqY54Lp+DcZJKEScfg6lwE8VQWh9pskj1mpTiGKtpktRRL48X/75e4Pq/eRi+idpBgkyAkFE1lVR+YXYrOJkvRjx9stWumMWjFdDCJ7CbbUFYLJbI4MeqHgaXRaNXjwlR40yaPvY1mDM9FCpmqqeVd0FPBJBot/LbrBC/NhHFqPIgrsxEkZR7dIweKguxbqDYTSmRwsMSxQGcnQzgxGkAosTHDncjkkNxixM9EIIHjI/6idZzrs7qtdj0Ot9uxu96Ec5MhDI0FEV6uBU6kBVydiyKUyEjWjLYYTSOVzRX9OcyJ+aa3WFrAucmQ6sHc/mYrbiwU726fC6fwDz++pvAVEbWIBJsEIaGbGshqrths5AvHULgyG8ERt70QcNSbefR5HBgclW+4djXKybZG0wKmggl0Nlk21M+adAz6vQ6cXD4SvLEQhd3IIRjPwMznA4nZcOmNDyYdg32NxQN3LTsxGkCLTY+9JdTEykGn4FB5fyy9oQZ0eDYCi55Fm8MAj8uIqWASZyaCmwZVK6R8GxZLC7AaNmY3ExkBVj0Hx3Lms1igrZTuVtu225d+dmUe40txLERSJS2zIG5PZFgWQUhIC0foK3Ji8ZdGM88iEM/g9HgQnU0W2I0cTo0Hq9qYIqcGC48zE8GyP28mlMAxnxOTwQRmggkcdTtwcyG6ZgNLKJFFg4VHk02PyUB5KwX1LA2OpQsrAmvN2PJg9SPtdpyfCima0U5mlcsGjy7F0d1qWy6TyIumsjDqGEwHEyjnn316PD/sPZzMgKby5RpXZsNIZSv72m32FmoqmEBXsxWBuDqlDivYErLfsbSAe//uZ4Wv44t7WvBHv9aB9ipHRxE7Cwk2CUJC1+e1E2ymszl0NVsQSmSxEE0VVlw2WPSFF7ErsxEcbLXKvv6yGt46I+YrGLMSSmTXrEHcLJiu5L6BfKf8xRLXi2rZ6YkgDrVtn8GSisPI4dKUsl83PUeDooDV77/iFaySzAjihtWaRh2Dfq8VyYyAxWgKM6HSn0/iulxpR6MZRh2Ly7NhXJoJy77KcysGjsGlEud7rg7Yv3t2Gv93YRYvOtSMh+9wo9dD1loSJNgkCEndmJdvc0e5Ls2srfWyGVg4TTwWomtfDI0qDEUvVVezBWcryGoqYWwphnoLX3TeIM/SONRmA0VRGFmMaX4mIYX8piaGpgoZ8elQslDLKqW9jRbFs8EnRgMY8Do2dFRLIZ4WCtlyM8+CZ6mSM50GlsHBViuMHIsbC1EMz+XfrDqMHHra7BA2OZ1QQmeTBacr/NlLCzl88/QUvnl6Cq/ubcMHH9wPu1FbY9UIZZFgkyAkdF1Dx+jrhRLZ4vVfaux7LIFRx2A2nKr4iFJu0ZSAaEpAZ5MFkWS2sO6wp82G2VDyVgCiY9DrcUgyJFwuZ4tkNT3O0sdg9XocmA4m0OYw4ORYAJvFSBxD4fqcOg0vSlQJRFNZdDZZcGW2+L+xq9kKiso/t0+MBvD0zaUN3fRAfoGBWhnNFVLV1X59aBI/G17AX7zkAH69uwlUmb9vcjkRX3pqFBemQ/ibl3ersjGMqB4JNglCIhkhh7El7WQ2SyWKIvY3WyCK+a7s9dtU1BJPC9jTYIY/Jt2AbSk12/Qw8yyEnIgWux4WPQuOoTYEbtG0gKGxAPo8Ds3Wxa5n1bOwGjgcaGGxFMtgdpsJC+cmg8gIImZCSextMCMt5DBWZN7s4Xb7mppZJSlVk5oRcnA7DRj3r80KN1p5TATiiCSzYKj88yeREZBWuS5zMykJS2sWoym84z9O4bkd9XjjnV4cbrfDYdo80xlOZvCL4QWcGPXj7GQIZyeC2NtgJoFmDSPBJkFIZMIfR6aEET1as/7Fv9WuR4NVD46hEUpkMLYUU3SFZXerFVOBBPY0WBBOauuFeG+DGRSVr93L1+eVPuZqaCyAQ6028ByNa/P5LSxa5XEZcX65rlLP0hjwOXFi1L9pxpKhKGSW6w+vzUfBUMCAz4lALA1/LI2lWBoDPqeqzVRKzY+9sRCDbrmMYqUOtt7Cg6UpRJbHKQkiamBEmvS/y342vICfDS9Az9F4/D3PWdNENLoYw48vz+Enl+dxYtS/4c1BLc6zJW6hRFHFopAiwuEwbDYbQqEQrNbNhzIThNb86OIs3v7okNqXITkKgNtpgMXA4YLMjR37my0Yno0ocuS5lZX6xeG5SCEo7HU7cGpi8yPicuyuN8Fu1GFkMQp/TLtB52p7G8ww8QxuLMTAMRT0HAM9y6Dewm975EtBjtClPEo329AUcKjNDpuexdBYANEKGpLUdqDFKlsT3O56E47tckEUgcGRpW3HTlEU8JXfHMCz99bLcj1E+cqJ10hmkyAkst0vy1olApgMJNAuc22nmp23qzlNusJxt46l0edxIJ7O4vpCVJJAE1h5rsTAs5TqGb/1dtWbcLPIc/nahkkL+SD55uL2z3u1A01g81Fg8j0ecGYiiD6PoyYDTSD/c+806uCXcFf8ihsLsbJ+Z4oi8MijQ3jyj54Ll5mX/HoIeZGh7gQhES2NPZJar9dZ2Estl43BjDr8sTR8dSYA+fFRJ8cCuDQTkWW9YyorYnDEj5529fdfA/maytESgsdaNBmI42CLFQM+ZUfxaLT/riShRAa76k1qX0ZBPC3gW2em1b4MogJVBZsf+9jHQFEU3v3ud2/4O1EU8cIXvhAUReFb3/pWNQ9DEDVBSwPdpURTkGRl3oEWK3rddhx129FgWZuZ6Gq2IqGhtY+xVBauLRoYpJZTu25gWX6FpwMDPofalyK5mVAKF6bDGBzxo9et3L8vlhJwoKV2S8K0FizbimxdIrSv4mP0EydO4HOf+xwOHTpU9O//4R/+oewRBwRRq0RR3LHB5sESVtYV091qQyCehsukw3wktab2q9HCo8HCI5kR0NFkyc9B9DlxfjKEQ202iKIoy0zEUs1HUhjwOrCkUCf8pekwBrwOZHMiTk8EJTuuL1ciLRRKCLwuI+otPE6OBjRxDC6l4dkwGix8xQP9y3FpJv+8txpYhFVcPVmpnIb2PbzlWV684kir2pdBVKCizGY0GsXDDz+ML3zhC3A4Nr5DPHPmDD7xiU/gi1/8YtUXSBC1YCGSKnSa7iRmHYNwmcfHexrMONhixfmpECYDCZydDG3ovJ2LpBBPZZHI3BqIPRWIw6BjcHzEX/EwaSkp+WZZEIHB0QBOjQcx4NXGxpXRpThOjAbQ1WKF1bCzyvujaQE2I6fYjnaKAjIa3tK1lfFAHK129TvBW+0GfOjBLtAKTRUgpFXRT9o73vEOPPjgg7j//vs3/F08HsfrXvc6/OM//iOampq2va9UKoVwOLzmD0HUmqtzOzOrSTMUxv0bazX7vQ4c8znRsupFqN/rwO56E67PR3GhhA7WaFpYMypqKpgszNTc02CW4Oor19Vc+faUap0aC6BFQ2NeLk6Hsa/BovZlSO7aXBQ9bcrUyu5vsiKh4PgwKa28ke73qltacc++ehJo1rCy364+9thjOHXqFE6cOFH079/znvfgrrvuwktf+tKS7u+jH/0o/uIv/qLcyyAITbk8szPfJIUTWXQ05ccRrehps62ZzXnEbUdi1cq+avEshaiKg+X7PA6cnghCUKmOMpMTUWfhMa2ROYw8S1e0R1zrBnxO3FSo9IVnaztICiezODEawBG3HafHg4o/Pk0Br+lrU/xxCemUFWxOTEzgXe96Fx5//HHo9RvfeX/nO9/BT3/6U5w+fbrk+/zABz6A9773vYX/DofDaG9vL+eyCEJ1l3ZQsGnWMWtGtTiMHI75nBCRH7w8F14bBEn94nOoTb0tM+0OA85Oqhdorjg3GYJVzyKscmkGReXna5aSqV6x/vmjVbmciMWo/DW5DiNXUc2zFs2Fk2CofNmHkj7ysm4cUbCpi5BeWcfoQ0NDmJ+fx9GjR8GyLFiWxS9+8Qt8+tOfBsuyePzxx3Hjxg3Y7fbC3wPAK1/5Stx7771F75PneVit1jV/CKLWXJJp8LGSeJbCUbcd0bSAgVVHZrmciOMjfgyO+DEfSWE2LF9TxVG38oGmnqVxuN2Ow+12ZARRE1ugnEZO9UCToSn0uh1lBZoDPieiaQFGHYMDLVaYddpcL2jkaEwGEtvfUAIuM694cCaX6WASRz3KBX06hsZnXnsErzvmVuwxCXmUldm87777cP78+TUfe8tb3oLOzk68//3vR11dHR555JE1f9/d3Y1PfvKTePGLX1z91RKEBiUzAq7vgE70/c1WnFrOUq5+bVSqUabdaVClTpJjKJzRQEPSav54BnsbzKrOHi038O9psxWG08fTAi5Oh7G3wYyRxSi01BvTYNFBz7FFa5HlcH0+iiNuOziaxrg/JuubNSWcHAtgwOvE4Kj8iwg+94ZePLezQfbHIeRXVrBpsVhw8ODBNR8zmUxwuVyFjxdrCnK73fD5fFVcJkFo17W5qOrHruXiaAqH3XbMR1KwGzlEklmcmbh11DcfVr5ecMKfQEejBVYDi1Q2B4amcHYiKPvqymQ2B4eRQ0Bju8rnIknUmXWKHPWuZ9IxODVWWqDJ0kA2B3DMxoOyWCqrmUDTomexv8mKq3NhtDt10HO0Yo19K6UmR9rtNR9siiIwOOrHgNch63iylx1uIYHmDrKz5lkQhAouzdRWPRZNAbsbzIWs1djSxtsEE1n0tNnAMjTOTSn37xueWzs8vs/jKMx9lJKFZ7G/xYpoMot4OoupoDJHquUIJ7IY8DpUCTa7W20Qlod9np0IIr3JOfCBFiuuzUdhZKmi36d2p1ETjU5tDgNyoljIxg2NBQGszBLV4+J0SJEmqIAMax+VwDEU9jVaMDwbxhG3A1fnohgcDaDP68BJGQLOnjYb/uYV3ZLfL6GeqoPNn//851v+vajWdGKCUMjZGiv+17M0FrYZZh1KZDTx75Jqn7Weo7Gv0YJEWsBUMIHdDebCka/DyGmiTrMYQcGsoNdlRIOVR1bIB2UrGeWVnfXNNj0arXok0lkMz0VBAYgks0hncyglhGIowGbUIZLMKPr1HvA5cWEyiHiR0UOjS3GMLsVh5hn0ehwYkuGNzWp1Zl72ta9So6l8097K1+bEaAAWnsHuehPOylB+Umfm8YU39cGoI7mwnYR8NwmiCqIo4hfDC2pfRlnimRzcLl6x7TjVSElwBtvVbEUgnlrTEby6RjMQz6CzyYIrs9Wv5JTabFiZjKuvzojpYKJoIDQZSICm8lnKwRE/dCyNfq8Doohts87HR/w40GJFPC1gMhCHP5aGQcfAW2fANQWOsAd8zsKbiq1EUwKGxgLobrVi3J9AqMxFBqVgaArTIe1l0DfT3WqFP5ZBKJ7eEIRHUgIiCzFZHve3n7MLDRbtzJklpKHM+gSC2KFuLEQ1eQS7nSuzEbQ7DWpfxraiVXZk93ocuDQTxkxo60wux2hzDuJUMAlfnVH2x2mw6JHKFs82TgUT6GyyFmZSprM5nBgNlFzecHE6jJHFWCGbmUgLsOq1ud/6/FQYTpMOVr30eZgj7XZMB9UvKShVRhAxFUwoPsZKz2lzggFRHRJsEkQVfnF1Ue1LqFidiVf7ErY15o/DVMX4nDMTQfR7HduuWzw/FQav0OrCctWb5c/yBLepJbw0E5a0dlSphrpUtvxAaWQxhjozD4vEAWckmUWbw4ABnxN1Zp2k9y0HpVZ5rndxWv3yHUJ65BidIKpQq78YrQYWV+e0d2xcTJvTuGaD0XqdTRbYDBwWoyncWHe0J+REBOIZ2Awcwomts6Rup1HVUUObOT0eQKvDgKkq50J2NlkQSmTAszTqzDywnMzNZHOaqM+VQyxVWVbu5mIMu+tNgAhEJNpmlcwImAwkMBlIwKhj0O91qLa8oBRqvfl64uoiRFFUbOQaoQwSbBJEFWolYFuvs8laUi2b2lgamFkuU7AbOeyqM4Gm8vvao8kMGIYu1FqadQwarTzmlkfLWPUsOposJb+gX5+Potdjx0IkrdgMxlJkciLMOgYcQ1XVWGM1cIWvldpNKjcXohjwOQFRxPmpkGx7w6vJit9YyAecXJyGX4L65rFVz6n48nrXnnYbzk5IF+ibeQYHWmwQcmLRMgcdQ+FQmx2CKIKlKcTTAhiago6hMR1KoNGiByAilc2ptqhiKpgPyNud8pePEMohwSZBVEjIiYo0OcihVnIG2Vx+LzPHUDDrmMLQ+YJVQUo0LcBh1qGzyQKznsW1uUhZmSMR+ZE4R912TQWbADA8F1VtL7Ucwsls4c2O12VEIi1gbpsJCZWo9ij4xkIMVgOLAZ8TZyeCkjSsrXZtLoo2h0GSbUZGjkajVY/jy1/XlSkCq/W0bz2ofzqYxN4GE67Ny9P8U4rPvPYICTR3IG0WKRFEDRhbikn+4qOUWptIlhFENNu3b2ia8CdwZTaCk6MBhLY5Nt/M8GxEkw1Dp8fz9afFGEvI4M1otBN6dCmOtJDDkXa7pPer52hcmak+OxdO5ANjE8+i3+uQ9LkRTwugKMDA5V+KGyyV1VFzDAVPnWlNGcnxET8GfLeeLzxLlZSt1HOMom9G6y083n3/XjRYeNy/vzGf8SZ2HJLZJIgK1eoROgDMR2qnK3bF0FgAB1utuDAl7/FeLC2gp82myTrGE6MBHHHbcX0uikgqCz1Ho6fNjqExP1rserQ5jIilsrhYJKioN/OY8Gsz4AzEMwjEg9hVZ0IslZUky3mwxSbpQgB/LA1/LA2HkYOZz790mngWVgMHURQx7o8XSjjKMeFP4HC7HSydb1Q75nNiaMyPbA5wmXSwGTjYDCxOb3LcrmMo7G+2Fn2+Do4E0O91IBBPw27QlfT1OD8VRoOFh6/OhHg6i+lgUtYxaZ966DDu2lOHB7ub4XGZVGtMIuRFgk2CqNDwbG0eoQMovFjWkpwIjCzE4HEaMCZz0ETT2stsrjg9HgRLA7vrTZgMxAtHpdPBZGG0TrHNLrWQzL65GENPu02SYFOub2E+MN44h9Np5NBi01e0MSmWyoLnaFDIZyTbHQa02A3wx9K4Nh+FhWc3PO9X6jOH5yJbvjG6dWxe+tH4fCSF+eXvQWeTRbZg02nSoc+bz2TubbTI8hiENpC3EARRoeE5dQropcDVaPYglhawEE3jqNsu6+Ncmg6h2abdwdLZXL6ecLPZmP7lMUX1Fh6G5bmFWiwNKObsRAi+OlNZn+My6dDrccDrMmLA54TdyCkeXPvjGQg5EbvqS7t2msq/YTjmc2JsKYYLU2EcarMDACYCCRwf8RemI0RSWcxH02h35EtJ6sw6GHUsjo/4ESwS+EppeC4Ch1GeuaiPvf0Oksm8TdReeoMgNGKrcTxa1Wjh4XYZZV/LJ6d4WpB9208+iBPRZNNjVgO7vctl4hm4TBwWIik4jBwOtFhxUebyAym5TDqMLJaWibPwLFiaKjynR5fi0LO0Ks/xuUgKiKRwsNUKA8fg+ny0aBa0z+PA5ZkwbizE1tRZnp8Kbdqgk0gLqG/iMRFIwO00bmyWk4ko5jOQxf4d5XrdMTee29GAwZEl0FR+3zpxeyDBJkFUIJEWVB8fU4mcCE3P9itVPC3IPqdwJpTCUbe95oJNk47B6FIckeXtS4F4RtLaRSWU03i3r8myIbBMqty4t7quuLPJDKtBh3Q2h2wuBwqbr/l0GLktg+wzE/lpCUrXE1e7yQsA9jaY8dcvOwiKovBAV6MEV0XUEhJsEkQFnrm5pNgWFClpuBSxbCdGA+hutWEmlJB0u82KBgtfc9MGdtebwNI0hmu4eQ0offOPzcDhlMYD6Svb1HYbOAb7msxgaRrX5yPY6imXE6FYRnM1b52pojraXo8D739BJ06M+tFo1ZNB7bcxEmwSRAV+emVe7UuoSJNdL8s8Q7WcnwrBzLOydI+3O4wYGtdOINNqN8Bl0kEQRZh0LE6NB5BdfsPT3WpDNpfD5ZnaDjJXmHSlvTR1NFlqYjnBZjiGgsPESTrYXQ7HR/xF53Zu5x8eOox2p5GMMyJIgxBBVOJnw7UZbOqYrX/kDRyDNoehpjKg0eVRPwdarJLe76WZEAa8TmglGdPqMODcVAgXp8MYHPWjwcpjwOeEx2nE+anQjgk0gdJXRAbjacnncyrpSLujMEFA61YCTiBfqrHdj4XLpCPD2YkCEmwSRJlC8YwkGz/ksNJ5vJkzE0EYNhkAPuB1IifmMBlIoLvVJsflySabE3FzIQYLX/l6wvUSmRwGR/3YXW+G16X+i+b6ua7TwSQGR/xr1iDWOpdJhwGfE9dL3FF/dS4KjtXIu4EK5Gpsu8LxET/MPItYWkD/NtlK/Ta/i4jbCzlGJ4gynZsKqn0JRR1ut+HyTBgdTZainfL7my0wcAzmwymEmQyarQbYjRxS2RyMHIOnbi4VbluLLxQmnpGldvP6fBQMBRx12xFOZksOhKQWLzHbV6v2NZpxYz5a8rF4Z5MFGSGHoRKaxFpsesyEk5rbnKWVrHk5osvPQ3GbL+Z0KIFUVgDP1t7vEkJ6JLNJEGVIZgR8+DsXS779kXZ7RS8odWYd+jwOeJxGDPgchXWELpOuaPbymM+JMxMhpLIicjkRJh2D3fUmHHHbccznREejBZdnIjg1HsRkMIFwIovhuQiOj/hxZiKI6wvRNYPe5dwYIpdd9WbZ7ltYbswYW4qVPQNSKtuVQNSq/MxIBgxNQSgxGNzXaAZF5WeNlvI5eh2Dd9y7p6zrsss0W3K1E6OBwtF0rQknio9COtRmw3//zp14XkcDrs3V7uILQloks0kQZfjCEzfXzMXbykpB/YDPuWm2ptVhQLNNj6lAAu0OA0QAFICzk8HCeJQxfxwukw5up7EwX7LVbkCDhYeOpZHMCmsK91cGQZd6nUB+Y8jqBoDr81F4XUZNj3fiWRo6lkYuJ+JAq02RRpGMIEIURbA0VWjOUcreJgvOjAdrYhPQVhiawkP97XhNXzs6Gi0w6BiIoohQIoOP/e8VPHZiYsvPr2Tk1c2FGCgqX2sYS2/f6W7mWfzwXffgt75yEvORZEVrKEt1fMQPi54tjKqqBQdarIWVqEfddrz9nl1IZXP41fVFvP8FnXCZeXz8VSZY9CTEIPIocbtcuMLC4TBsNhtCoRCsVmkL/gmiGlfnInjbl04gK4pbFvXbDBz2NZoLL4h9HkchcLQbOaSzOcSXX/BWuqgpaGOd4IDXgcHl6+ZZCj1tDpydDGpuBBDHUGix6WVfW7mZrd5AyGn1c6kWWfQsPvf6Xty1p67o31+YCuFFn/ll0b9rsunR7jBUPFu1s8kCt9OIH12a2/a2z+tswBff3A8gf1z859+5iK88PVbR427HqmcRrqFAE7gV8DdYePz0D++tyfW3RPXKidd25rkMQUgsmRHw+/9xGuOBBFKZHA612mA3cjjUZsOA14ljvvyfo247hFxuzQsivXyO3tNmQzojwKRjcaTdjr0NZsQz+aBTC4EmAFxfiIFZbkVPZUUMjvrhMuebNqwaylLsb7aqFmgCwOCIHwNex5pVe8d8TuxrlO8oH8g/D2tVq92Ab/7OXZsGmgDweJFAsN7Co9ftwGwoWdUQ/7SQQ5uj/EYviqJw3/61Q8i3a8Qrx24Zyz/ksjIvk6YopDX2RpTQJu28ehCEhv3Tz28UBmUvxdKFmsZgfPv5eOcm81s/Ti8fgcYzKSxEtTnr0h9Lb5hZOR1MYjqYRK/boZm5k7wG9ikPjgbQ1WzFjYUoDrbYcHzED56lZM1U1WItLZCv4/uXN/WhwbL1vvlX9bbhC0/eLGT+gXzmT6rnXand37+8voifDc/juR0NAIB79tbhbXf78L1zM7hvfwMe6m/HS/7fryS5Jk4Dz+VyDS6XB6UzAkwSToAgdq7ae5YThMJSWQH/tU0d2VaS2RxO1VCt3WZbPtKCdrJqWlkheWkmnN/LvRwM7Wu0yHokWotzCx/oasRjb79j20ATyP/7vvm7dxVmpva02cqqPd5OWigtC5fO5vCWfzuBE6P5UgmKovCnL+rCM39yH/765d1IlFD3WapgvDbfQAyO+PGxVx4i3eZESUhmkyC28fWTk5gNayO4kZvHadg0a3h+KowWmx7TGgj0tHR0t7rhRM7a1kYrj7Et9mZr0Zvv8uJDL+oqlGaUorPJiu/9/t0YW4pjwh+HP57GYjSNpWgKS9E0lmIpLEbTCMbTcJh0aLHlm+wseg7fOzddaJBbL5bKlv28+dHFWfR7EcWHqQAAMddJREFU13aL53Ii/unnN8q6n61cnYtiwOvE4GhtbUKy6Fl0NFnUvgyiRpBgkyA2IYoifnB+Fh/9wWW1L0Uxjbb8lpo9DeYN8ySNHK2Z43+lO8FLld1mDk+/14FUNgeepRGIZzC2FENm+XM4hoLNkG8gW58d7Wq2Yj6SlGWOqBwoCvjQg134zbt9FX4+BW+dCd4yx0y98749+PrJSXzwW+cLX9cVc+EUmm3Fs6v7m614VW8bvvjLEUwFb9UCH1y33EDIifjr71/GL64ulHVd2zkzGUS7w4AJjS6LWG3A58TQWADf/J27yK5zomQk2CSITfzFdy/hS0+Nqn0ZioqnstjbYC6aAbLoOczLHGw22fTgWRqRZBbhRGbToFJQaYgGz1LobLZiMZLCVDAJjqHQ0WiBkWchiiJ0LI2bm2Qf68y6DQ0uLA00WnhEkhnEM7lCMMnSgNPEw2bg0GTV48nri7L/26Ri5ll84jU9+LUDTYo/NkVReE1/O351YxHfPjO94e+nggkcddtxajwIAKgz8/i7Vx/Cnbtd4FkGrxtw4/NP3MSV2TAarXr87Mo8vns2fz+iCJyfCmE+Iv3PQDqbg46lNTOVYoWOofFHL+jADy/MIi3k0GIz4Fl7XPjKbw7U5OIHQj0k2CSIVfyxNIZnIzg1HrjtAk0AuLA8O6+7deMYi7lICl3NFlyZjUCOxGJXsxXDs+E1Q7qNHI12pwnRVLaQceIYCqF48YHScutps2NweRB3k82Aq3ORwtdsxTGfE1dmI+AYCm6nERxDY3gugqVYGhxNIbPqi5fN5b+u62Vz+dmn85GUIsPFpVBn5vGbd3vx8DEPbAb1rjmRFopu0AKAb56awuuOuWHiWTx5bRH37K3DvctNQABg0DF41/17EYyn8ey//Znssy8PtlgRSwvQMTTimaymAk0AuLejHm979i785rN8oMsohSCI9UiwSdz2nr6xhIvTIXzhyZuyDm/Wsn6vAzRFFYa6b3Y8dmkmsmaotoVn4a0zYSaUqPiIl6KAXrcDV2bCG7bBxDM5DM9F4DLpCvWibqdR0qaRUrU5DBhazogd32LG5uq/W/maNNt4uJ02nJvcfnrBaqvntW7HyNHoarHh7ERwTUArN4/LiLffswuvPNqmiWzXt85MFZYfFPMfx8dxb0c9PvUbh/Fn375YdKXiN4YmFRmynsrmMKLhOtyVzWUk0CSqRbrRidve8ZElfOT7l2/bQBMAxpbiGFo1LHzSHwe7yQvMidEADrRYsKchn3E8PxUCx9DgmPzt2x2Gsh673+vEybEAolt0+C7F0hByIo6025HKqNMcZOZZCBUGcTOhVNmBJgDYjbqSb1tv0ePkWAA9bnvZj1Op+zob8MN33YOHj3k0EWgC+YHsLzrUXAiUivn58AISaQHP7ajHn33rIuYja5vePC5lVpJem49qesvO2569S+1LIHYI7T7LCUIhWnmRVFMyI8BbZyo0BfnjmTUr6da7OL02czQTSmJPgxkU8qOiStXZZCl5E89cJFX0yFkpiyo0R6XKGOK+koyeDCQUqf3rabPhs2/oBaexne2NVj3+3+uOIiPkcHE6jLMTQcTTAtLZHNJC/n9FMd/843GZkBPFDWOZnttRj65mKy7NFH/+r3j23jr86YNd+PRPr+H752bKvtYGCy9LDWi1fr27Cc/vasKuemWCbmLnI8Emcdt75J5dcBp1+KP/Pqf2pahmV70Z0WS+DpJjKBxut295FFnM6u71fY35wDObE+E06ZARRIwuxRBcVWvpMHLwa3xIuUnH4GCrDdFUFgsqBAVnJ0MbVlSydL6mc70Gix6jS3HMhpLo9dgxNBaU7bqMOgaf+o0jmgs0V+MYGofb7Tjcbi/7c1mGxlfeOoDvnp3GhD+BaCoDHUuj2ZbP2meEHJptery6tx00TeEfX3cU6ezJohuQttLqMGgu2GRoCh9+yYGS5qISRKnIbnSCWHb3x3+KyUACVj0LUQQiqdraV1wNI0cjvnw8vbomU2rtTgPcTiNS2RyuzUUQSsj7NeZoCgdabZgNJTBbQZmEFrYmUVR+J/qJ0QDMOgZul2lDxs1l0kHH0phZnoGqY2l0NlqQFnKw6FnJv59/+6pDeE1fu6T3Weu+9KsRfPi7l8r6HJdJB4/LiHAyu2HUmBooCvj4K8n3lihNOfEayWwSxLJ33bcX7U4jetrsyORyeO3nnykcI9NU/lhSW2/NpHHM58S1+ShEZJHI5GR90ZvwJxCMZxRpvgCAox4Hjo/4wTEUjiyvDF3Ratej2WbAlZlw0XpRCoBfA9tdRDFfJ+urMyKZyeHSTBhNVr4QPLtMOug5Zs18yHQ2h3NT+RrRrubK37TrORoWPYc2hwHX5qKIprJ4sLsZr+5tq+4ftQPds6++7M9ZWX3LMZTqR+p1Zh3+6qUH8cLuZtWugdi5SLBJEMteverdvAEMXGYeQP4F9+d/+FyY9SwevzSLT/34GkaX4mpdpuQm/HH4Y2l0NuXHGsk9p7mj0bLmWFhOK+8NMoKI85MhHGyxFkYVNVrzDTW76k0wJrNrXui7mq0w8YxsGd5KjCzees61OYxYjKZgM+ig1zGY2mIY+KWZMPY0mGHgGERT2ZK6n/s8Drzt2T480NVU2P7jj6Xx0yvz+PXuJjLMuwiPy4TuVhvOT5XfCJYR8uUmagabv3PvHhzb5cK3z0zhwlQIr7/Do1ijFLHzkWN0gtjEf52YwPu/eQ6v6W3Hx191qPDxdDaHsaUYaJrCqz/7tObrDrfT53EgEE9jZDGGnIg1Q6+lNuB1YFDBAM7MM+hqseHiVAixtACTjimsl+QYCjybD8BWOukPt9sxGUhgMZpCd6tNtq+DFBosPBiaKhydl0LH0vmO/mwO6WwONxYiSGVvvQQYOAaffKgHLzhIslvlEnIi7v27n2HCX94WoAYLj1a7AacngvJcWBkoKp9Jpyngx+99DnbVm9W+JELDyonXSLBJEFtIpAXoOXrTTM6/PzOGP/3WBYWvSj4sDTTbDWW/YJaqzW7AZFD5lXxGjkaz3YBEWijsdm+25Y+iV/8GpCiApSlkBHFDY85OpGPzTTSnxwKwm3T41zf14VCbXe3LqknHby7hoc8/U9bnNFp5ZLI5+FVaUrCZTz7Ug5cfIaUSxNbKide020pIEBpg0DFbHhnWLR+17xQHW+2yBZocQ8l+RL+ZjCAiJ4oIJDI41GaD22mAVa/bUIMriijs1L42H8FOn2WdzuYwOOLHHbtd+NY7nkUCzSosLI/G0hXp0N/see9xmTQXaAJAi628WbkEsR1Ss0kQBADgQIsVZ2Q6yuvzOHBlNoyJLWoL5UBTwKE2O4LxdKHmsdTh6qFEFo1W/rYY9v+eB/ah1U4CjGq86FALBrxO1Fv4fONPNI10NodQIoO9jWY8/5NPIJRYG1iqtXZ1O0/fXMKxXS61L4PYQUiwSRBVuLzN0OdaYuLl+XVQZ9bhwlQIyWLDIWXgcRphMbAIxTMIxjNVBdBup3HHB5sff2U3jrodal/GjtBgzc+mrDPzG0493v+CTvzJ/5wHALzlWV7YDBy+Njih+DWu9/yuxuX65ABGl+J4811evOEOj9qXRewwJNgkiCqcnQyqfQlVoymg1+PAZED6DnujjoFVz1W8N70STrNuzYijapwYDWDA5yx5y1Gtef8LOvFQv1vty7gtvHagHRY9iyevLeBPH+wCQ1NodxjxB18/q9o11Zl5/H+v7oHNwCEj5EBTVGH6AEFIiQSbBFGhcDKDp64vqX0ZVetpt8sy4odjKHhdRlyaKW8TUan2N1tg4TnMRZJotOpxeiyATE7EjYUojvmcODcZQqKMdY+bGRzxY1+jGTYDh+vzUQQ0evRZrsPtdvz2c8jua6VQFIUX97TgxT0thY/dv7+xMHJMbu1OA37vuXvgcZnQZNUjmsqi0aqHzcABgKa3QRG1jwSbBFGhR58eQ1pQ5mhYTokiA82l0NVsLbk+slz7Gs24vCqIHVuKw+00IpvLYTqYxPERP46023B6QprHvzqXH3RPATjSbsfY8mzSWsWzNP7sxV1kXqbKbEYO//uuZ+OJa4sY98fxiR8Nr1npOuBz4k13evHpn1zD8FzlAanDyOF7v//sQmBJEEojwSZBVOBnV+bxiR8Nr/nYHbuc6Gmz43NP3FTpqsrTbONRb9YXNs1I7exkCHsbzIinhTXbbaqlYygYOGbDx8f9cXQ2WTCNJPIhlPSBlAjg9EQQuuWsbYNFj8HR2jpi1zE0vvjmflKnqREUReE5y9uH6s06fPR/r2BseWlEm92ABw8148eX57YNNp0mHd56tw+/dqARLXYDLs+E8dlf3MSPL89hf7OVBJqEqkjenCDKdHE6hHf8xynkVo3NOdhqxaNvPYZrGthvXCo9x8gWaK64Nh/FYjSFAa9Tkvs72GoFx9A4u0nG9MpsBANeJ456HLIOyU4LIkaX4hgc9aO3xoK2F3Y34Vl76tS+DKKI53Y2oKPRUvjvb56ewvfOTeMTr+7B5b98AU7+6f24r7Nhw+fVmXn84J3Pxjueuwd7Giww6lj0epz4whv78JGXHUSL3QCNjdQmbjMks0kQZXr80hzi646e7+tsBEtTOKuBLSClWogocwycyuYwOOrHgRZrYdd8pViaLmwA2ozimcYaO4l+5VEyrFurPvn4Nfzo0hyAfM3znbvr8K3TU4ilsnio3w2DjsEHfn0/XnakFR6XEc02A/7oG2fhdhrRZNMXvc+Hj3nw8DHSXU6oiwSbBFGm3+h340tPja6prWqy6UFRFD76im6887HTSGa0X8tZZ9Yhmsoq9nhZYWdmVuSqeZVDo5UnWU0Ne+8D+xBPZ/HYiQn8znN24z0P7Ntwmz0NZuxpuLVG8gUHm7Cg4k51gigFCTYJokxNNj3+42134CPfv4TjI37QFNCzvHnl+Qea8Mv3Pw/nJoM4NxnCo0+PYUljjSR2IwczzyKTUzb4Y5nqU4A6VnuVP2wNjYp5qK+djLbRMB1L4y9fehDv+7UOsPT2z/UvPzWKf39mDE6TDofa7LhnufaTILSG7EYniCpkhByyggiDbmPDCgCEEhm8/xvn8MOLswpfWXEDXqcqDS1tDgNmggn0ep2YDycxthRHJb94tLqvvNVhwJTC25Eq8ZM/eA5215u3vyFRk9LZHH50aRb9XicarcWP1YmdYT6SRL2ZV3WiRDnxGslsEkQVOIZGkcboApuBwz89fBT/d3EWPEfj6ycn8b8X1Ak8D7XacGJMnc7pZEaAr95cGI5+qM1W0ViknLbeGxe02PSaDzbbnQbsqjOpfRmEDLJCDr/976dwczGKcCKDr77tDhJs7kDJjIBXf/ZpjC7FEE8L+MPnd+C3n7OrJkaYkWCTIGRG0xRe2N0MAHhuRwPGluK4OhfBn337ImbDScWug2UoqBWrLUbTa7YIcSUcERaj1bmmaYVWcVbjOfvqa+JFiSgfy9D4+Cu78cxNP57X2bDpSQtR2yb8cZxfNUHk4z+8AouexetrYL0oCTYJQkEURcFbZ4K3zoSOJgseeXRIke0hgLY2hFydj4ClgVJiND1LY2+jGTkRuDClzV30oYT2twoN+FxqXwIhI5eZx4OHmtW+DEJGTTY9GJqCsKre/o5dtfFzTYJNglCJx2XCt97xLPz48hyeuLqAhUgKi9E0MkIOnU0WHGixwaBj8Nlf3MCkBEe0WjqCNuoYpLMCsts0KblMOizF0jiv0SATyG95ubmg/fmqfZ7amgdKEMRaFj2Hl/S04H9OTxU+9vPh+TXTCbSKBJsEoSI9x+BFh1rwokMtm95GBPChb12o+rFSGhrH1GDhMRfeelxLs02PmZByZQaVYGlgcflNgtadnwqhxW5Q+zIIgqgCt26qx6UqZxcrRTvnagRBFPViCY7Gjrrtsm8LKtWRdvu2mUqP0wA9p/1fT9kcMO6Pwe00qn0pONhqxYGWzTtCv3t2WsGrIQhCaoMjfnzrdG3+HGv/tzlB3OakGBCvlYHqZp7FmD++7e0abQaMLG5/Oy3I5oAmFTt/D7XasLvehAtTYVycDuOYz7kh+wHkSxcIgqhd//DjqxuaJEeWYipdTXlIsEkQGtdo5fHhF3fhtQOVD+SmVRrkTVNAu8MAi56FhWfR5tDDr7Eh91IQK5oaWr1ejwPnpkK4sXDrBef4iB9Oow5H3fY1tyWjcAiitrUWKYMZXayNYJPUbBKExlEUhTc/ywcAeN2AB7/970OYCpbXMMSrtHmn3+vE8eXZmiwNXJktrZEmlamNFZAcTaGn3S5JA1e5HEYOV2eLlyPMRVKYi6Swu94EjqFxZTaCBguv8BUSBCGVjJDD5SI/74F4BqF4BjYjp8JVlY4EmwRRQ7rbbPjKWwfw4KefLPl4XcfSqFcp0FgdFK8fc7Sv0Yzff95eNFr1GJ4N47ETE7g+H0VGyGG8hKN2Ne1vtmAunEQinatqo9ERtx2JtABRBHQsBZahwdIU6OV5mDlRhJATkc2JyAg5JDM5JDICzDwLlqa2HZu1kvE81GpDs400BxFErfrG0OSmo99GlmI4bLQre0FlIsEmQdSY3fVmfPDX9+ND37647W3fercPd+xy4ZjPCbuRw78/M67AFd6yVcbvZUda8eKefBf+gM+JN9zpBQAE42l8/IdX8MTVBUwFtdmNnszk4I9VN1vTomdxZjyoyAH8uakQ7BrPfBAEsblf727GJx+/ivnIxikesVRWhSsqD6nZJIga9Po7PKgz6wAAeo7G3726Bw923+pa17E0PvaKbnzoRV14oKsRVgOHj7ysG197+x3QKTTcXbfN0X1ukxmbdqMOH33FIXzhjX144cEmOS6tak4jV/WxdCyVBVukkUcuLjM5RieIWmUzcPjt5+wu+ne10PxHMpsEUYMoisKJD96PV/zzUxBF4FW9bXhVbxt+fzaMC1Nh9Hsd8Lg27sE+tsuFDz64H2cmgrh7Tx0+/8RNDM/Js8GIpSls1Qp05+66LT+/q8WGf3zdUfzTz6/jrj11uDQdxj/8+BoC8fSaDRpqGBoPorPJUjTLUKqcCHgdRtxUqMDfbiCZTYKoZR7XxhFrLE2hs2nzkWdaQYJNgqhRFEXhb17ejV31t4LKzibrtr943nSXF29a/v//c3pKtmBzu855E7/9u3GapvB7z9sLADjqduD1d3ggiiIiqSymgwl8+ifX8IPzs5Jcb7mkOLpymHSAQsEmXwNzSwmC2NyNIpvKDrbmN81pHfntQxA1bH+zFTxb+S+a19/hkfBq1ooks9BtckxcZ+axq66yFWsURcGq59DZZMWnfuNI0XEgSgjE0kWHqNdbeFAlno4zpd5QArSCj0UQhPQOtdk3fOyYz6n8hVSABJsEcRt7wcEmvO/XOkq+vUnHlDXrs9lefLbjYjSFj3z/Usn3sxmOofGq3raq76cS0bSAi9Nh9Hkc6PM40O91oNHCYyGSQq+7tD3kOQXncy5UceRPEIS8EmkB//Tz6/jAN8/h7/5vGD+5PIfkuhFwp8Y3Tr7o99ZGsEmO0QniNvdQfzvOTATx+KW5on+/u96EfY0WHGqz4y3P8iIt5PDU9SX8y5M314z9eU1fG67PR3FqPFj4mN2gwxiKd6R//eQk/uIlB0BVmXF7011efP/8DNLZHO7a7QJDUxABiCIAiLi5ECvM+pRDsdFHQ2MB7G0w49r8xmOvJqseoWQGTpMOswrufhe1sUSKIIh1cjkR73zs9IbfwUYdg/c+sA9ve/YuZIQc/uvExIbP7fOW9sZWbSTYJIjbXJ2Zxxfe2IdP/+QavvDkTUSSWTiMHF55tA0P9bdjb6Nlze31HIMXHGxCn9eBe/72Z4inBbzhDg/+6mUHkUgLuPfvfoa5cKpw2804TbqqA82V+3n8PfcAQNH7G1+K4wWfegLxtHKD4kUA1+aj6Gm34eZCDJFkvr6zo8mC63MRCCIwlVZ2ELxas1YJgtjax394peib/XhawEe+fxn9XifOTQYxurR2/jBF5bvUawElitp6vxsOh2Gz2RAKhWC1ar/DiiB2klgqi3Ayg3ozD7aEEUn/8uRNPPrMGH74rnsKRerX5iIYXYrjQIu1kL3jORo6hgbPMeAYCovRNPQsrdg4nhsLUTz/k0+o0sU+4HNicMSPOrMOuZwIf7y6+ZyVYGgK1//6hZIE9wRBSGdwxI/XfO7pLW/z4p4WPHV9EUvrVv2adAwu/uUL5Ly8LZUTr5HMJkEQBSaehYkv/dfCW+/24Y13etfM1NzbaFmTDfXWbRzBpHRTz+56M1434Majz4zJ9hh7Gsyw6llwDA1BFEFTFLJCDgaWxu56E9LZHCZUWGsJAEJORCqb2zLTTBCEsmKpLL5+cuPR+HrfPTtd9ONZlUfAlYMEmwRBVIyiKOjY2siWvf+Fnfj++Rn4Y2l4XEYcdTtwuN2O7jYbPvK9S2tqTcu1kr3UsmgqS4JNglBRMiPgwlQIQ2MBnBwLYHDEj1Ci8pOOvY1mRJIZWPTaP0onwSZBELcFM8/ihQeb8NXj43jtgHvNNo6vPXInPv2Ta/j3Z8YQKPOY2+M0aD7QBIBwIoM6skWIIBS3FE3h0z+5hv88MYF0NifZ/V6YCuO7Z6fxiqNtmn8jSYJNgiBuG68dcONbp6dwb0f9mo9zDI0/eH4H/uD5HUhmBMyHU5gNJ/GZn17Dk9cWt7zPBqseY351jsfLUU0GhSCI8v340hyevLaAb56aQkSm/eUsTSOeFjQfbJI5mwRB3DYOttow9KEHttyypOcYuF1GDPiccDs3rodbr1aGpQfiWy0PJQhCat87N40vPz0mW6AJAN84NQmepfHUja3fFKuNZDYJgritlJMB+OuXd+NVvW346A+uQAQQSqQxF06BZ+lC49PpiaA8FyqxGQVnehLE7ehHF2cxHUzg/q5GCDkR/3tB/lW6gyN+fPg7F8EyFO7aXSf741WKBJsEQRCb+NnwPH7ryyeLdn3O19hGnuM3/Xj4mHzrSQnidsdzDD783Uv4xONXCxMglPD1oUkAwAcf7IK5jGkiStLmVREEQWjAJx+/WlPjRbbynbPTiKcFPHioCc/Z1wCnSaf2JRHEjiGKIiYD+aHrK0sclBZLZUmwSRAEUUuyQg7np0JqX4akfnx5Dj++PAeTjsFTH7ivZraPEISWCTkRjzx6Ej++PK/qdehKWMShFu1eGUEQhIpyItBiU3b4vFJiaUGVbUoEsRNdngmrHmgCAMdqN6TT7pURBEGoSMfS+MkfPAff+/278enXHsHr73CDYzZ2nr92wA2va/uuda35oQLNCwRxO1iKpWHSqT96KKet7eNrkGN0giCITeg5BgdbbTjYasNLelrwUJ8bv/+fpzC6FC/c5neesxuH2214/3+fV/FK13rvA/vQ1WyFP5bGrnoTzk2G8Jffu7TmNn/1vUt4XmcDmmx6la6SIHaGPo8DBh2LWFpQ9ToCsTSsGt0mRIJNgiCIEnW32fC9dz4bjz49hiuzYfz08jw+9ZNruHO3CyxNqdpM9M7n7cFde+pQZ+axp8G85u96PQ789Mo8fnn91iy+REbAz4fn8RsDbqUvlSB2lMERPxaj6k+n+PnwAt50l0ntyyiKBJsEQRBlMPMsfufe/KrLH12cxdsfHcJ/n5rc9vMarTye39UEj8uI/zk9hYvTYcmu6a9edhBvuGPzsUYUReFf39yHH5yfwYWpMEQR8NUZNT2XjyC0ThRFDM9FNFOSouXFDSTYJAiCqNB9+xth0bNFR530ehz4/151aPkFgMKRdjtoOl/z+ea7vPjUT67hX54cQSJT3tFbv9eB33veXtAUMLYUR1eLFUfdjm0/j2cZvPxIG15+pKyHIwhiEz+5PI+3feWk2pdRMOB1qn0JmyLBJkEQRIUYmkK/14mfXtnYifq79+7Grnpzkc8C2OVd7G+6y4sv/WoUT15fxLW5COLb1Hw91NeOv3rZQeiWu06fvbf6fwNBEOUJJzM4PxnEv/5yRO1LWaPZrt3pGaQbnSAIogovPdyy5r8pCvjEq3tw3/7GbT+3zszjD3+tA99+x7Pwvl/r2PK2u+pN+NgruwuBJkEQ6vjbH17B+75+DsmsgGM+pyY60bWO/NYiCIKowkt6WvAnv96JVrsBR9x2/MNDh/HK3ray7+d1x9zoabMV/puhKbz8SCs6mywA8kfmk4GEZNdNEERlDrTYkMmJaLEZcHoiCB1Lo9/rwMbBaMq6MR9V+Qo2R4mitgYzhcNh2Gw2hEIhWK1WtS+HIAhCMbFUFl87MYF//sUN9Lod+OwbegEAV2bDODMexP5mK3ra7epeJEHc5paiKZj1LEQRePdjZ/DDi/kGoRa7Hu0OI8LJDK7ORiAoHF29dqAdH33FIcUer5x4jQSbBEEQGpPKChDF/JxPgiC06RM/GsYTVxdwdnLjWlujjsGeBjNiqSwcJh1OjgZkvx6nSYeTH7y/0Igot3LiNXKMThAEoTE8y5BAkyA07g+e34F/fPgoHujaWJ8dTws4NxnCjYUYphQqf/HH0pgJJxV5rHKRYJMgCIIgCKICbQ4jvvDGPvzJr3duepuZUBJOo06R68kKOUUep1xk9BFBEARBEESZRFHETCiJJ68t4PNP3Nzytr56EyITGWRk3jJm0GhnPAk2CYIgCIIgSnR6PICRxRi+enwcQ2Ol1WIOjQWwq86EZFbAdFC+o26DRstvyDE6QRAEQRBEicb9cfzl9y6VHGiuuLkYQzCewRG3XZ4LAwk2CYIgCIIgat5LD7fiQEtl03LiaQGnx4M40m5Hn8eBejMv2XXpGBoso82wTptXRRAEQRAEoVH3dW6/IWwrpyeCODkWgNtllOiKAD2n3ZBOu1dGEARBEAShQdlcTpI1lUvRlARXk8dr9AgdIMEmQRAEQRBEyURRRKvdiFhaqPq+Rpfi8NWZJLgqYDGaQjiZkeS+pEaCTYIgCIIgiBJRFIXndtbjmM8pSXYzlRVgluB+RBHIZLU5Z5MEmwRBEARBEGUw6lh87ZE78dQH7qu4WWjFdDCJ3Y3mqq+JZ2k4TcoMjy8XCTYJgiAIgiAqYDNw+OeHe3Hig/fjZYdbKr6fsxMhDHgdVV3L7967BxSlzF70cpFgkyAIgiAIokJulxH1Fh5ve/auqu5nMlj5DvXXDrTjnfftqerx5VRVsPmxj30MFEXh/2/v7oOjqBM0jj8zk2QSkkmEEBIiBEJEooQXIYZacE84cgSLsrS8g3Mv3iGyeGpQEE9BPGQ9eVHElxU83m4rWgqiey6Krm9cFLJe8RIIIC+GFw2KiSTk0EwSJAkzfX9YjJslBCaZTvew309VqjI9k+6HXyXDU7/5dffMmTMlSadOndL999+vAQMGKCYmRmlpaXrggQdUW1sbiqwAAAC2lHVlgu4bndHun6/84YwincHPTEZHOvVIXqZtZzWlDpTNkpISrVq1SoMHDw5sq6ysVGVlpZYuXar9+/fr5Zdf1ocffqipU6eGJCwAAIBd/c3VSR36+T7dg7/u5j9m91ZXm67VPKdd90avr69Xfn6+1qxZowULFgS2Z2Vl6a233go8zsjI0MKFC3XHHXfo7NmziojgVuwAAODyUnbCq9/9qVz/Xfpth/bjcjg1MDVekS6nDp/w6nRz22eX9/C4NWvcgA4dszO0q/0VFBRowoQJys3NbVE2W1NbW6v4+PgLFs3GxkY1Nv58UVOv19ueSAAAAJ1u19en9KvV29Xk6/hlhw5V1QW+T4iJkC5SNv/jliwlxER2+LhmC7psrl+/XqWlpSopKbnoa2tqavTkk0/q7rvvvuBrFi9erCeeeCLYGAAAAJZzOZ0hKZqt7bct4wemaHxWSsiPa4ag1mweP35cM2bM0Nq1axUdHd3ma71eryZMmKBrr71Wv/nNby74ukcffVS1tbWBr+PHjwcTCQAAoFM1+/zaX1Grjw6c0MI/HjTlGFGuC5/w07VLpJ64ZaApxzVDUDObu3btUnV1tYYNGxbY5vP5VFxcrOXLl6uxsVEul0t1dXUaP368PB6PNmzYoMjIC0/xut1uud3u9v8LAAAAOpHL4dBvi45o08Eq044RFx0peVu/d/qSfxii5Pi2J/3sJKiyOXbsWO3bt6/FtilTpigzM1OzZ8+Wy+WS1+tVXl6e3G63Nm7ceNEZUAAAgHDidDq05O8Ha9gXm2QYP2+PcDqUlthF5TUNLba3R1t3A0pvx1nrVgqqbHo8HmVlZbXYFhsbq8TERGVlZcnr9WrcuHE6ffq0XnvtNXm93sAJP0lJSXK5On7vTwAAAKvV1DcGCmWXKJduvDpJD+cNUL+kOD2/6bB+W3SkQ/v/6mT9BZ+z8zU1WxPSaxGVlpZq+/btkqSrrmp5Jfvy8nL17ds3lIcDAACwRITLqcIp1+sX/RIVHdlyMu2+MRlat+Mbnaxr/WPwS1FT36S4KJfqm3znPRcOZ6D/uQ6Xzc2bNwe+Hz16tIyOzhsDAADYXHr3WKV3j231ubd3V3SoaEqSxx2husaz5213OKSuXex9Efe/xL3RAQAAQqi85nSH93F1iue8bdERTg26MkGudtzW0kqUTQAAgBDZeeyUNh+q7vB+TtY1KrtP18AlkLJS4+WOdKn+zPmznXbH/SMBAABCZHifrkqM6/jH3N+cOq1vTp1WfHSEMlNita+yVoYhRUWE3zwhZRMAAKCDDMNQ7Y/NKvzfY9pRfipk+/WeOavPK2oDj081NMnvN+QMo4/SKZsAAAAd9NnRGv3z73aYfhyf39D3p5uUGBc+N8QJv7lYAAAAm8lKTei0Y/3wY3OnHSsUmNkEAABop9ofm1V8+KTWbf+m047pDLOLujOzCQAA0E5Oh/Rjs0/lNQ3q1z1WD/3d1Rp0pbmznBFhtF5TYmYTAACg3TzRkZqU3VujruqunvHRcjod+tORGlOPGU4nB0mUTQAAgA678oqYwPdrJmfrQEWtTtY3avOhk/qkrFq1IVpneUWXSMW5w6u+hVdaAAAAm0uIidTIq7pLkm4ZeqXONPv00Jt79cd933Vov5Euh37/r78Iu3ujs2YTAADARHP/sK/DRVOSXE6Hfmz2hSBR52JmEwAAwAQ+v6H3Pq8MSdGUpKazfiV5wuf6mudQNgEAAEKo2ntGT31Yps+/rdXR6voO7cvhkPr3iFPjWb/evm+UusZ2/FaYnY2yCQAAEEIfH6zSH0orQrKvjKQ4ffzgjfKeaVZ8dHit1TyHNZsAAAAhFMp7ow9MjdeKzV9q0sqtOlpdF7L9diZmNgEAAELovjEZ2ri3MiT7emdPpd5RpaIinEqICb+P0CXKJgAAQEg5HQ7FuSNU33g2JPvLSe+m6WOuCsuTgyTKJgAAQEhdnezRzn/P1eff1ir/v7ap2We0e199Ervo1ak5cke4Qpiwc7FmEwAAIMSiI11Kjndr6g395Grn7SWjXE5tLLghrIumRNkEAAAwRZ/EWM25KVNr/mW4hva+IvgdOCTnZdDU+BgdAADARH+bmazsvt303t7vVN/YrI8PVGnn199L+ukWlBf6mL3prF9bv/w/jRuY0plxQ46yCQAAYLL46Ej904g0SdK0X/bT73d+qy1HTurqHh49/z+HW/2ZvoldNPaa5M6MaQrKJgAAQCdyOByadH1vTbq+t3aUn9JHB+J18Dtv4Pk4d4QmZvfSv40b0O71nnZyGawEAAAACE856d209tcj1LVLy7sD/fqX/RQdGd4nBp1D2QQAALDQRwdO6PvTzYHHURFOFX5WrrIT3jZ+KnxQNgEAACzUP9mjMQOSlBj70x2CTjU0aePeSl2TEm9xstBgzSYAAICFhvfpqsIpOTrr8+u5TYf1n5u/1K9y0uS8DNZrSpRNAAAAW4hwOfVw3gDlDUxR1pUJVscJGcomAACATTgcDg1pzwXgbYw1mwAAADANZRMAAACmoWwCAADANJRNAAAAmIayCQAAANNQNgEAAGAayiYAAABMQ9kEAACAaSibAAAAMA1lEwAAAKahbAIAAMA0lE0AAACYhrIJAAAA01A2AQAAYBrKJgAAAExD2QQAAIBpKJsAAAAwDWUTAAAApqFsAgAAwDSUTQAAAJiGsgkAAADTUDYBAABgGsomAAAATEPZBAAAgGkirA7wlwzDkCR5vV6LkwAAAKA153raud7WFtuVzbq6OklS7969LU4CAACAttTV1SkhIaHN1ziMS6mkncjv96uyslIej0cOh8PqOLbj9XrVu3dvHT9+XPHx8VbHCQuMWXAYr+AxZsFjzILHmAWH8QpeMGNmGIbq6uqUmpoqp7PtVZm2m9l0Op3q1auX1TFsLz4+nj+eIDFmwWG8gseYBY8xCx5jFhzGK3iXOmYXm9E8hxOEAAAAYBrKJgAAAExD2Qwzbrdb8+fPl9vttjpK2GDMgsN4BY8xCx5jFjzGLDiMV/DMGjPbnSAEAACAywczmwAAADANZRMAAACmoWwCAADANJRNAAAAmIayCQAAANNQNi8DjY2NGjp0qBwOh/bs2WN1HNs6duyYpk6dqvT0dMXExCgjI0Pz589XU1OT1dFs5aWXXlLfvn0VHR2tESNGaMeOHVZHsq3Fixfr+uuvl8fjUY8ePXTrrbfq0KFDVscKG0899ZQcDodmzpxpdRRbq6io0B133KHExETFxMRo0KBB2rlzp9WxbMvn82nevHkt3uuffPJJcfGdnxUXF+vmm29WamqqHA6H3n777RbPG4ahxx9/XD179lRMTIxyc3N15MiRdh+PsnkZeOSRR5Sammp1DNsrKyuT3+/XqlWrdODAAT3//PNauXKl5s6da3U023jjjTc0a9YszZ8/X6WlpRoyZIjy8vJUXV1tdTRb2rJliwoKCrRt2zZt2rRJzc3NGjdunBoaGqyOZnslJSVatWqVBg8ebHUUW/v+++81atQoRUZG6oMPPtDBgwf17LPPqmvXrlZHs62nn35aK1as0PLly/XFF1/o6aef1pIlS7Rs2TKro9lGQ0ODhgwZopdeeqnV55csWaIXX3xRK1eu1Pbt2xUbG6u8vDydOXOmfQc0ENbef/99IzMz0zhw4IAhydi9e7fVkcLKkiVLjPT0dKtj2EZOTo5RUFAQeOzz+YzU1FRj8eLFFqYKH9XV1YYkY8uWLVZHsbW6ujqjf//+xqZNm4wbb7zRmDFjhtWRbGv27NnGDTfcYHWMsDJhwgTjrrvuarHttttuM/Lz8y1KZG+SjA0bNgQe+/1+IyUlxXjmmWcC23744QfD7XYbr7/+eruOwcxmGKuqqtK0adP06quvqkuXLlbHCUu1tbXq1q2b1TFsoampSbt27VJubm5gm9PpVG5urrZu3WphsvBRW1srSfxOXURBQYEmTJjQ4ncNrdu4caOys7M1ceJE9ejRQ9ddd53WrFljdSxbGzlypIqKinT48GFJ0t69e/XZZ5/ppptusjhZeCgvL9eJEyda/H0mJCRoxIgR7f6/ICJU4dC5DMPQnXfeqXvuuUfZ2dk6duyY1ZHCztGjR7Vs2TItXbrU6ii2UFNTI5/Pp+Tk5Bbbk5OTVVZWZlGq8OH3+zVz5kyNGjVKWVlZVsexrfXr16u0tFQlJSVWRwkLX331lVasWKFZs2Zp7ty5Kikp0QMPPKCoqChNnjzZ6ni2NGfOHHm9XmVmZsrlcsnn82nhwoXKz8+3OlpYOHHihCS1+n/BueeCxcymzcyZM0cOh6PNr7KyMi1btkx1dXV69NFHrY5suUsdsz9XUVGh8ePHa+LEiZo2bZpFyXE5KSgo0P79+7V+/Xqro9jW8ePHNWPGDK1du1bR0dFWxwkLfr9fw4YN06JFi3Tdddfp7rvv1rRp07Ry5Uqro9nWm2++qbVr12rdunUqLS3VK6+8oqVLl+qVV16xOtpfLWY2beahhx7SnXfe2eZr+vXrp08++URbt26V2+1u8Vx2drby8/P/qv6oLnXMzqmsrNSYMWM0cuRIrV692uR04aN79+5yuVyqqqpqsb2qqkopKSkWpQoP06dP13vvvafi4mL16tXL6ji2tWvXLlVXV2vYsGGBbT6fT8XFxVq+fLkaGxvlcrksTGg/PXv21LXXXtti2zXXXKO33nrLokT29/DDD2vOnDm6/fbbJUmDBg3S119/rcWLFzMbfAnOvd9XVVWpZ8+ege1VVVUaOnRou/ZJ2bSZpKQkJSUlXfR1L774ohYsWBB4XFlZqby8PL3xxhsaMWKEmRFt51LHTPppRnPMmDEaPny4CgsL5XQyuX9OVFSUhg8frqKiIt16662SfppVKSoq0vTp060NZ1OGYej+++/Xhg0btHnzZqWnp1sdydbGjh2rffv2tdg2ZcoUZWZmavbs2RTNVowaNeq8y2kdPnxYffr0sSiR/Z0+ffq893aXyyW/329RovCSnp6ulJQUFRUVBcql1+vV9u3bde+997Zrn5TNMJWWltbicVxcnCQpIyODmZULqKio0OjRo9WnTx8tXbpUJ0+eDDzHzN1PZs2apcmTJys7O1s5OTl64YUX1NDQoClTplgdzZYKCgq0bt06vfPOO/J4PIH1TAkJCYqJibE4nf14PJ7z1rPGxsYqMTGRda4X8OCDD2rkyJFatGiRJk2apB07dmj16tV8KtOGm2++WQsXLlRaWpoGDhyo3bt367nnntNdd91ldTTbqK+v19GjRwOPy8vLtWfPHnXr1k1paWmaOXOmFixYoP79+ys9PV3z5s1TampqYCIiaB07YR52UV5ezqWPLqKwsNCQ1OoXfrZs2TIjLS3NiIqKMnJycoxt27ZZHcm2LvT7VFhYaHW0sMGljy7u3XffNbKysgy3221kZmYaq1evtjqSrXm9XmPGjBlGWlqaER0dbfTr18947LHHjMbGRquj2cann37a6nvX5MmTDcP46fJH8+bNM5KTkw23222MHTvWOHToULuP5zAMLqkPAAAAc7BgDQAAAKahbAIAAMA0lE0AAACYhrIJAAAA01A2AQAAYBrKJgAAAExD2QQAAIBpKJsAAAAwDWUTAAAApqFsAgAAwDSUTQAAAJjm/wHj0PsvBtU3WgAAAABJRU5ErkJggg==", "text/plain": [ - "<Figure size 576x576 with 1 Axes>" + "<Figure size 800x800 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1583,7 +1571,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 61, "metadata": {}, "outputs": [ { @@ -1592,20 +1580,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 27, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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1ZYtW4J9DQ0NamxslNfr7e/bAACACBXWlZGysjJNnTpVeXl5am9vV0VFhd566y1t2rRJbrdbs2bN0vz585WamiqXy6W5c+fK6/We9Z00AABg6AkrjBw6dEj33HOPDh48KLfbrcLCQm3atEnf/va3JUnLly9XVFSUSkpKFAgENGXKFK1cufKcFA4AACJDv58zMtB4zggAAIOPleeMAAAADATCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAq8IKI+Xl5frWt76lpKQkZWZm6rbbblNDQ0PIPpMmTZLD4QjZ5syZM6BFAwCAyBFWGKmsrFRpaamqq6u1efNmdXd36+abb1ZHR0fIfrNnz9bBgweD2xNPPDGgRQMAgMgRE87Or7/+esjr5557TpmZmaqpqdHEiROD7QkJCcrOzh6YCgEAQETr15oRn88nSUpNTQ1pX7NmjdLT01VQUKCysjIdPXr0jGMEAgH5/f6QDQAADB1hXRk5VU9Pjx5++GFdd911KigoCLbfddddys/PV25ururr67Vw4UI1NDRo/fr1vY5TXl6uxYsX97UMAAAwyDmMMaYvBz7wwAN67bXX9M4772jEiBFn3G/r1q2aPHmydu/erdGjR5/WHwgEFAgEgq/9fr88Ho98Pp9cLldfSgMAAOeZ3++X2+3u0/m7T1dGHnzwQb388st6++23vzKISFJRUZEknTGMOJ1OOZ3OvpQBAAAiQFhhxBijuXPnasOGDXrrrbc0atSorz2mrq5OkpSTk9OnAgEAQGQLK4yUlpaqoqJCGzduVFJSklpaWiRJbrdb8fHx2rNnjyoqKjRt2jSlpaWpvr5e8+bN08SJE1VYWHhOJgAAAAa3sNaMOByOXttXr16tmTNnqqmpSd/73ve0Y8cOdXR0yOPx6O///u+1aNGis/7+qD/fOQEAADvO25qRr8stHo9HlZWVYRUAAACGNv42DQAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCK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/KXwPoNPPvlEN954Y/DKaFRU6IXmwfYZ9Ofn/2WD8fff2YqLi9P48eO1ZcuW4OMcenp6tGXLFj344IN2izvPRo0apezsbG3ZsiUYPvx+v9577z098MAD4Q02MGtsh57vf//75qKLLjKbNm0yu3btMrNmzTKZmZnm8OHDxpi/3tp28803m7q6OvP666+bjIyMiLi17d133zXLly83dXV1Zs+ePeaFF14wGRkZ5p577gnu09bWZrKysszdd99tduzYYdauXWsSEhIi4rbGL9u7d+9pd9NE8vyrq6vNihUrTG1trdm3b5/ZsmWLufbaa83o0aNNZ2enMSay52+MMQcOHDCXXHKJmTx5sjlw4EDILe4nRfJnsH//flNbW2sWL15sEhMTTW1tramtrTXt7e3GmMj+/WfMF7f2Op1O89xzz5mPPvrI/NM//ZNJTk4OuXsoUrS3twd/vpLMsmXLTG1trdm/f78x5otbe5OTk83GjRtNfX29ufXWW7m193zq6uoyCxYsMJmZmSYpKckUFxebHTt2hOyzb98+M3XqVBMfH2/S09PNggULTHd3t6WKB05NTY0pKioybrfbDBs2zIwbN8785Cc/CZ6ITvrwww/N9ddfb5xOp7nooovM0qVLLVV8bvUWRoyJ3PnX19ebG2+80aSmphqn02lGjhxp5syZYw4cOBCyX6TO35gvbmmV1Ot2qkj9DO69995e5/7mm28G94nU338nrVixwuTl5Zm4uDhzzTXXmOrqatslnRNvvvlmrz/re++91xjzxe29P/rRj0xWVpZxOp1m8uTJpqGhIez3cRgzyFecAQCAQY27aQAAgFWEEQAAYBVhBAAAWEUYAQAAVhFGAACAVYQRAABgFWEEAABYRRgBAABWEUYAAIBVhBEAAGAVYQQAAFj1/wEMSXMPAGpn4gAAAABJRU5ErkJggg==", "text/plain": [ - "<Figure size 432x288 with 1 Axes>" + "<Figure size 640x480 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1616,7 +1602,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 62, "metadata": {}, "outputs": [ { @@ -1625,20 +1611,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 28, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "<Figure size 576x576 with 1 Axes>" + "<Figure size 800x800 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1656,7 +1640,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 63, "metadata": {}, "outputs": [ { @@ -1665,20 +1649,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 29, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "<Figure size 432x288 with 1 Axes>" + "<Figure size 640x480 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1689,7 +1671,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 64, "metadata": {}, "outputs": [ { @@ -1698,20 +1680,18 @@ "<AxesSubplot:>" ] }, - "execution_count": 30, + "execution_count": 64, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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JavFkKpAIEAEJkGehGNJTo/4sn7v3de2cuvGOvZ2O/nSn88WZJP+gZes4CWrqwBwGDUlWatAILi0EYFJkBd6jZJmh4FeZ+Yczw2rq7jvtg1AyrL8ts31PH12jN8cHqSzyznnNavNWq5ZUVG2NQsEgksTUWUW5IUsy2xrts36ujMQzfh7c0XKXuJnH7iK7757Fy0VhpzXXFVjosc5e2BVIBBc2YjAJMiLI/0e/i+LCGudNfuMkSRJ3Limml995FrqczzmuXMT/OXPDxGICP8igUBwkYIC0/33348kSRl/1q5dm/5+OBzmnnvuoaKiApPJxF133cXIyEjJFy1YfNbUmjFqlOm/69VK3rSziX9/45Y5n+cwavj716zP+f1YQubCWKBk6xQIBJc+BdeYNmzYwGOPPXbxAqqLl/jkJz/Jww8/zIMPPojVauWjH/0od955J88991xpVitYMnRqJc9/5uU8e3acSpOGjQ1WjNr8fn1u3VjL1iYbh6YN406xqcHKxgYxSC0QCC5ScGBSqVTU1tbO+rrH4+Fb3/oWP/7xj3nZy14GwHe+8x3WrVvHiy++yFVXXbXw1QqWFKteneGJlC+SJHHblvqsgen+124Qjq8CgSCDggPT2bNnqa+vR6fTcfXVV/PAAw/Q3NzM/v37icVi3HTTTenHrl27lubmZl544YWcgSkSiRCJRNJ/93oLk7MRXBqYp52uzDoVv/rINVj1mrS9uUAgEExRUI1p9+7dfPe73+X3v/89X/va1+jq6uL666/H5/MxPDyMRqPBZrNlPKempobh4eGc13zggQewWq3pP01NTUW9EcHy5oY1VWn18Qfu3MTKarMISgKBICsFBaZbb72VN7zhDWzevJlbbrmFRx55BLfbzc9//vOiF/CZz3wGj8eT/tPX11f0tQTLlxqLji++aStWvZpXbpidChYIBIIpFtQubrPZWL16NefOnaO2tpZoNIrb7c54zMjISNaa1BRarRaLxZLxR1A8sizzb384tdTLyMpN62v47UevQ6UUUwoCgSA3C9oh/H4/58+fp66ujh07dqBWq/nzn/+c/v7p06fp7e3l6quvXvBCBfkhSRJv3tWMN1y4yvdi0DzHwK1AIBBAgYHp3nvv5amnnqK7u5vnn3+e173udSiVSu6++26sVivvfe97+dSnPsUTTzzB/v37efe7383VV18t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", "text/plain": [ - "<Figure size 576x576 with 1 Axes>" + "<Figure size 800x800 with 1 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1729,7 +1709,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 65, "metadata": {}, "outputs": [], "source": [ @@ -1749,19 +1729,17 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 66, "metadata": {}, "outputs": [ { "data": { - "image/png": "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sy65bGbDJpZbusL86NEThKNROkNRbrxoPpcvKcLrMSLRGHkZAa5cnpwB4XLS/LzxisUcrG/jS388wAXzsnn/z3Zy+6ZKrr+wbNzb7Q5HecF//ZV1lXl87OYLkzJAV5rfO6CEyEyxfF42X3zpOp7zmT/TEYryqksXpjokmeb+5caVvOqbW+kZYVDPZEjze1OaWK4qzOAlGyq4bEkRaxbkpjASEREREREREZmNZl1yeTDOOfacbuWpM21UFqTzwvXlZPi9dIUi5GcG+wbK83mTXyXE4zGWFGfxykuriMZg1fw8Vs7PmdA2tx5ppKG9h/v31tITifH1V20g4JuTFU4AKM0JctdzL8Dv9XDp4plRM1pSZ/OiQh5415X8elcN//brJ5nMMfa2HWviwvIcDNh1qnXydnSOG1eXccczqthYlZ+0gUBFRERERERERM41a5PLsZjjcEM7Rxo6WbMglwvL43/9jaZ0RjJ4PB42VScv6dmbQN1UVcAL15Xj987d5FEkGiMUjfHCdQsIeA3/BAY6lLljfl46r3/mIrpCUT5z//5J3dfuU61sqi6Y1H30KsoK8IEbV3DLugVTsj8RERERERERmdtmfHI5FnOEojG8HsPnMSKJZoj1bT1UFWaypCQ7xREmn89j/PfLL+b6VfPm/ABdkWiMjCm6SCCzz53PWsS2Y008uL9+UvcTmuQSHBfMy+bNVy7m+gvnzbi66SIiIiIiIiIyc83IrFxdWzedoQil2Wl0hqIA5Kb7MbO+VrzzxzFo3kxhZtywevw1m2eTNCWWZQKCPi93v2o939tynH/9v72Tso9lpVkcrGublG0DrJqfw0/f/AzS1GpfRERERERERKbYjCzUW5KdRlVhFukBH4VZQQqzgpNSL1lkJjKzl5jZHjOLmdmGftNfbmaP9/uLmdnaQdb/iJmd6rfcDVN6AFMs6PPymsuqec4FyRnI81wxB+090UnZdsDn4XO3rVViWURERERERERSQhlZkdlnN/BC4KH+E51z33XOrXXOrQVeCRxxzj0+xDY+17usc+7XkxrtNPGll63jlZcsJCuYvNbwuel+jja0J21753rF5oUsK519pX9EREREREREZGZQcllklnHOPemce2qExW4HfjAV8cwUGQEfH3vBhTzwrivJSUtOgnlZaRaTVW454PXwovXlk7NxEREREREREZFRUHJZ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nIlGON43A293zlUAbwe+kdpoZbzMLAv4KfDPzrnW/vMSvQembQvVQWL/MrCYeOmGGuAzqYtucM65aKKczALiPRguSG1Eo3Nu3GZ2IfGLShcAG4EC4L2pi1BERERERERkdvOlOoDJ4py7ejzrmdkC4F7gVc65Q4nJp4gnL3otSExLuXEe5ymgot/9/scz1PRpYbjjNbNvA29L3P0x8PXE7eGOV6YZM/MTT85+1zn3s8TkWjMrc87VJEqa1KUuwqENFrtzrrbf/K8Bv0xReCNyzjWb2QPApcTLx/gSrZen9TnTL+7rnXP/kZjcY2bfAt6VwtBEREREREREZrVZ23J5PMwsD/gVcJdz7i+90xPd8VvN7BIzM+BVwC9SE2VS3Ae8NFFPupr4QHdbgUeBpWZWbWYB4oP+3ZfCOMfqNPCsxO2rgAOJ2/cBr7K4S4CWfiUWZBpJnF/fAJ50zn2236z7iA+ySeL/tDv/hor9nPretxAfaHPaMLPixHsfZpYOXEO8XvQDwIsTi027x3yIuPf1Pt6J5+MFTLPHW0RERERERGQ2sXgP87nFzG4BvgQUA83A486568zsg8S7VB/ot/i1zrk6M9sA/A+QDvwG+Cc3zR+8oY4zMe8DwGuBCPHu+79JTL8B+DzgBb7pnPvE1Ec+PmZ2OfAF4i3yu4F/cM5tTySZ/hO4HugEXuOc25a6SGUoiefwYWAXEEtMfj/x2sU/AiqBY8CtzrnGlAQ5hGFiv514SQwHHAXeOJ0ubpjZRcQH7PMSv+D4I+fcR81sEfFBPQuAHcArEjXop4Vh4v4T8fc8Ax4H3tRv4D8RERERERERSaI5mVwWERERERERERERkYlRWQwRERERERERERERGTMll0VERERERERERERkzJRcFhEREREREREREZExU3JZRERERERERERERMZMyWURERERERERERERGTMll0VERERERERERERkzJRcFhEREREREREREZExU3JZRERERERERERERMbs/wMM0TzzkjnzFAAAAABJRU5ErkJggg==", + "image/png": "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Cy9www03cP7553PBBRcAMGLECPc9HA4HM2bM4KSTTuKxxx5zt6E1Y9TmHDp0iE8++YRZs2aRkpJCYWEhL730EieffDK7d+8mLi6uVfcTQhy/LrroIpKTk3n44YdZu3YtzzzzDOXl5bzxxhsAPPjgg9x9991cdNFFXHfddRQXF/Pss88ydepUtmzZ0qAEzhEul4uzzz6b9evXc8MNNzBo0CA+/fTTTnuOvvjiixk8eDD/+c9/+PLLL3nggQcICwvjpZde4tRTT+WRRx5hxYoVLFy4kHHjxjF16tROaYcQ4vjVXH963XXX8frrr/O3v/2N2267jXXr1vHwww+zZ88eVq5c2arPuf3223n//ffdC9KPeP/995k+fTqhoaGNXv/0009zzjnncPnll2Oz2Xj33XeZNWsWX3zxBWeeeWbbvrwQQrRTc30owI8//sj777/P/PnziYiIcC/waUm/9ve//53TTz/d4zO/+eYbVqxYQVRUVJd9T9GNKEL4SE1NTYNja9asUQDljTfecB/76aefFED56aefmrz24YcfVlQqlZKZmek+Nnv2bAVQ7rvvPo9zR48erYwZM8b9+pNPPlEA5b///a/7mMPhUKZMmaIAyrJly9ryFYUQQlGUlvd3y5YtUwDlpJNOUhwOh/u41WpVwsPDlXHjxil2u919fPny5QqgnHzyye5jb775pqJWq5XVq1d7fN6LL76oAMrvv//uPgYoer1eSUtLcx/btm2bAijPPvus+9ijjz6qAEp6enqD75GUlKTMnj27wXc4/fTTFZfL5T5+6623KhqNRjGbzU3+XP7+978r/v7+Sl1dXYP3hBDHp5b2oUuWLFG8Pd4c6ZeO9GErV65UAGXDhg2NfmZxcbECKEuWLGnw3pHx5aJFi1rUVm9jVG9tPbY/raurU5xOp8c56enpisFgaDC2FUIIb470Neecc47H8RtvvFEBlG3btikZGRmKRqNRHnzwQY9zduzYoWi1Wo/js2fPVpKSktyvP/roIwVQnnrqKfcxp9OpnHrqqQ2eo4/t99LT0xt91j62/z1y7fXXX+8+5nA4lPj4eEWlUin/+c9/3MfLy8sVPz8/j/5UCCHaqyX96datWxVAue666zzOWbhwoQIoP/74o/vYySef7PEc761PnDhxosfcpaIoyvr16xuMgY/tmxWl4ZjUZrMpw4YNU0499dTW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ZwgheoeW9qGpqakA/Prrr+5jFouF119/3eO88vLyBvc7sir8SBr0I4Gc1vR7HT1G9fa9P/jgA3Jzc9t0PyHE8eu5557zeH3kOfeMM87gggsuQKPRsHTp0gZ9jqIolJaWNnrfGTNmYLfbPcadLperwed5ExwcTEREhEefDchYUAjRrTXVn/71r38F4KmnnvI450h2tjPPPLPVn3fhhRei0Wh45513+OCDDzjrrLPcz+eN0Wg0qFQqj7FyRkYGn3zySas/XwghOlJTfWhTWtqv5efnc9FFF3HSSSfx6KOPdkyjRY8mO8CFz5x11lm8+eabmEwmhgwZwpo1a1i1alWzNRkGDRpEamoqCxcuJDc3l+DgYD766KN21fg6++yzmTx5MosWLSIjI4MhQ4bw8ccfS20cIUSHaGt/d4Rer+fee+/lpptu4tRTT+Wiiy4iIyOD5cuXk5qa6rFT8corr+T999/nH//4Bz/99BOTJ0/G6XSyd+9e3n//fb799lvGjh3bqvaPGTMGgH//+99ccskl6HQ6zj777GYfvJsyadIkQkNDmT17NjfffDMqlYo333xT0lUKIRpoaR86ffp0EhMTufbaa/nXv/6FRqPhtddeIzIykqysLPd5r7/+Os8//zznn38+qampVFVV8corrxAcHOyeuPTz82PIkCG89957DBgwgLCwMIYNG8awYcMabWdHj1HPOuss7rvvPq6++momTZrEjh07WLFiBX379m3T/YQQx6/09HTOOeccZs6cyZo1a3jrrbe47LLLGDlyJAAPPPAAixcvJiMjg/POO4+goCDS09NZuXIl119/PQsXLvR63/POO4/x48dz2223kZaWxqBBg/jss88oKysDms8idN111/Gf//yH6667jrFjx/Lrr7+yf//+jv3yQgjRgZrrT2fPns3LL7/sLvm1fv16Xn/9dc477zyPbG4tFRUVxbRp03jiiSeoqqri4osvbvaaM888kyeeeIKZM2dy2WWXUVRUxHPPPUe/fv3Yvn17q9sghBAdpbk+tDEt7dduvvlmiouLuf3223n33Xc97jFixAiPDJri+CABcOEzTz/9NBqNhhUrVlBXV8fkyZNZtWoVM2bMaPI6nU7H559/zs0338zDDz+M0Wjk/PPPZ/78+c12lo1Rq9V89tln3HLLLbz11luoVCrOOeccHn/8cUaPHt2mewohxBFt7e+ONn/+fBRF4fHHH2fhwoWMHDmSzz77jJtvvhmj0eg+T61W88knn/Dkk0/yxhtvsHLlSvz9/enbty///Oc/W53aEmDcuHHcf//9vPjii3zzzTe4XC7S09PbFQAPDw/niy++4LbbbuOuu+4iNDSUK664gtNOO61VPxchRO/X0j5Up9OxcuVKbrzxRu6++25iYmK45ZZbCA0N5eqrr3afd2Qy8t1336WwsBCTycT48eNZsWKFRzq2//3vf9x0003ceuut2Gw2lixZ0mQAvKPHqHfeeScWi4W3336b9957jxNOOIEvv/ySRYsWtfpeQojj23vvvcc999zDokWL0Gq1zJ8/32NXzKJFixgwYABPPvkkS5cuBSAhIYHp06dzzjnnNHpfjUbDl19+yT//+U9ef/111Go1559/PkuWLGHy5MkeY1Rv7rnnHoqLi/nwww95//33OeOMM/j666+JiorqmC8uhBAdrLn+9H//+x99+/Zl+fLlrFy5kpiYGBYvXsySJUva/JkXX3wxq1atIigoyL1Ysymnnnoqr776Kv/5z3+45ZZbSElJ4ZFHHiEjI0MC4EIIn2quD21MS/u14uJinE4nCxYsaHCPJUuWSAD8OKRSZKuVEEII0SO5XC4iIyO54IILvKY8F0IIIYQQoqt98sknnH/++fz2229MnjzZ180RQgghhBBCHIekBrgQQgjRA9TV1TVID/7GG29QVlbGKaec4ptGCSGEEEKI41ptba3Ha6fTybPPPktwcDAnnHCCj1olhBBCCCGEON5JCnQhhBCiB1i7di233nors2bNIjw8nM2bN/Pqq68ybNgwZs2a5evmCSGEEEKI49BNN91EbW0tEydOxGq18vHHH/PHH3/w0EMP4efn5+vmCSGEEEIIIY5TEgAXQggheoDk5GQSEhJ45plnKCsrIywsjKuuuor//Oc/6PV6XzdPCCGEEEIch0499VQef/xxvvjiC+rq6ujXrx/PPvss8+fP93XThBBCCCGEEMcxqQEuhBBCCCGEEEIIIYQQQgghhBCiV5Aa4EIIIYQQQgghhBBCCCGEEEIIIXoFCYALIYQQQgghhBBCCCGEEEIIIYToFVpdAzw3N5c77riDr7/+mpqaGvr168eyZcsYO3YsAIqisGTJEl555RXMZjOTJ0/mhRdeoH///o3e895772Xp0qUexwYOHMje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GVlZWYiJibFaZmhoKHx8fLBv3z7zg1W1Wo1jx45h4cKFdm1PW7HH52JNdnY2SkpKLB5Id2ZNfS4tIRKJEBUVhX379mHGjBkAakfH79u3D08++WSryycdR6lUQqlUtklZMTExeOutt1BYWGhOCbt3717IZDLzzVtMTAx+++03i/P27t3brN9JW9naturqagCol0mEx+OZR1/b0jZ7srUtUVFREIvFSE5OxqhRowDUBqIyMjIQHBwMoOPbAtjeng8//BBvvvmm+XVubi5iY2PxzTffIDo6GkBte1566SXo9XoIhUIAte2JiIgwpwi0p+b8DuXk5GD8+PHmUfw3fuc6ui2k49hyXRYTEwOVSoVTp06Z13/cv38/TCaT+fehM6gLfl+6dAkHDhyAh4eHxf6u0o6HHnrI6tpvDz30kHl9ta7QFpFIhGHDhiE5Odlie0pKivnvQltdM9ubXq+HXq+v13fy+Xzz3+uu0pbuyB73KN3dhAkTcO7cOYttc+fORe/evbF06VIKfrfAyJEjG+0vCWkNR7o/bYnmPntgjGHbtm14+OGHzfdGdbrifZOj3dO3RGuePyUkJIDH45nb2xW/A6RlHPm55fXaso+0JiEhocNiG476u9+WzwOt6cifmS3sGi9iDqyiooLFx8ez+Ph4BoCtXbuWxcfHs8zMTMYYY99++y07cOAAu3z5Mvvxxx9ZcHAwu/POOy3KeOihh9iyZcvMr1977TX2559/ssuXL7NTp06x++67j0kkEnbhwoV2bVtLLVy4kMnlcnbw4EGWl5dn/q+6utp8zOOPP86CgoLY/v372cmTJ1lMTAyLiYmxKCciIoL98MMP5terV69mbm5u7KeffmJnz55l06dPZ6Ghoaympqbd2tYa9vhcKioq2PPPP8/i4uJYeno6++uvv9iQIUNYeHg402g07dq+lrLlc8nLy2Px8fHs448/ZgDY4cOHWXx8PCspKTEfc/PNN7MNGzaYX3/99ddMLBaz7du3s8TERLZgwQLm5ubG8vPz27V9pONkZmay+Ph49tprrzEXFxdzX11RUcEYY8xgMLD+/fuzSZMmsYSEBPbHH38wpVLJli9fbi4jLS2NSaVS9p///IclJSWxjRs3Mj6fz/7444+OahYrKipiHh4e7M4772QJCQksOTmZPf/880woFLKEhATGmG1t6ywWL17M/P392Z9/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n3/+aVGdfX19MWjQIOzYscMi5c/evXsbXN+HEEJai8fjYcaMGfjll19w8uTJevsZY21+LWjrdWBz+kU+nw+O4yyycGRkZODHH39sUR0JIaS1bOlf25KXlxfGjRuHLVu2IC8vr97+669ZCSGkM2jvfrIh9IySENJebOn3br31Vhw/fhxxcXHm7VVVVdi6dStCQkLQt29fq2Vff/98/aSf8+fPY8+ePbj11lvbvD2fffYZKioqzK+/++475OXlYcqUKQ2eQ/fuXQ/NACd2k56ejmnTpmHy5MmIi4vD559/jlmzZmHgwIEAgEcffRSrV6/Go48+iqFDh+Lw4cNISUlpslxvb28sXrwY77//vrn8M2fO4Pfff4enp6dFiuDbbrsNr7/+OubOnYsRI0bg3Llz+OKLL8wjzFuid+/e6NGjB55//nnk5ORAJpPh+++/b9YaZ4QQ0hB79Z3Xe+SRR7B27VrExsZi3rx5KCwsxObNm9GvXz+o1eoW1XvVqlWYOnUqRo0ahUceeQSlpaXYsGED+vXrh8rKyhaVSQghTXn77bexZ88ejB07FgsWLECfPn2Ql5eHnTt34u+//27za8HmXAfa2i9OnToVa9euxeTJkzFr1iwUFhZi48aN6NmzJ86ePdviz4YQQlqjqf61rW3cuBGjRo3CgAEDMH/+fISFhaGgoABxcXHIzs7GmTNn2vw9CSGkNdq7n7SGnlESQtpTU/3esmXL8NVXX2HKlCl4+umnoVAosGPHDqSnp+P7778Hj9fwfNx3330XU6ZMQUxMDObNm4eamhps2LABcrkcr776apu3RaFQYNSoUZg7dy4KCgqwbt069OzZE/Pnz2/wHLp373poBjixm2+++QZisRjLli3D7t278eSTT1qkn3zllVcwb948fPfdd3jhhRdgNBrx+++/21T2mjVrsGLFCpw4cQLPP/88UlNTsWfPHjDGIJFIzMe9+OKLeO655/Dnn39i8eLFOH36NHbv3o3AwMAWt0soFOKXX37BoEGDsGrVKrz22msIDw/HZ5991uIyCSGkjj37zjp9+vTBZ599hvLycixZsgQ///wz/ve//2HIkCEtrvfkyZOxc+dOGI1GLF++HD/88AO2bduGoUOHtrhMQghpir+/P44dO4a7774bX3zxBZ5++ml89tlnGDduHKRSaZtfCzbnOtDWfvHmm2/GJ598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ZjYTJSfDG57a+koC6qsc7GjyjHsjPhMSqTQ/eu44WxvdvGVNKe9YX5FNRHr7unL+ua9z1t47rYA7FKfaZSKdVmhyn+ocopElVpbb6QlEaR6l28ivtzSN+PjAfMpIIjXpexZBEISh/NEEf9reQo8vQkWekQe3t9EzaL/gC1csFQmcgvA6snFBHhv7//2sBXk53zvU4eeON9VlrwlVLhNVrkxA+albL5jye5bYjfz+gxv5+B92Z8e/HOlf7wwuuhlQatf3V0CqMWhVHGj3U2o3EEukSCmMOatWp1YhSUwoSfXoOK18V5Xb2Npw6r2OdwdYU2FHo5Jp6A1h0qp4/7nVotJROC2++93v8sEPfpCbbroJgJ/85Cc89thj/PKXv+T222+f47MTZspZC/J4y5pSvv/MUYxaVX8XDDi31kUgmsjGcNJKZu9geYmVZnd43FEOQzW7IyRTCha9eszOy5cvL+J771id/fqyZUWT/1DCvDNvAuAPPvggO3fuZNu2beM+t7e3l69+9avcfPPNoz7n7rvv5s4775zJUzztJElCrZK4441L2Nfq46ofvjTr76lXy7R6I1Pe2BxKo57dm0udZubH2A+t3tk5qAJckqDKaSSRShOIJZElCe84LdJlKTM3cWezl4vrCljgMrG6ws5Fiwsm3I68Ms/EgzefxS2/38nREdrfj+SsBU7esb6cTl+MZw93kUorxFNpDrSfGckgwsz43Oc+R0lJCXv27JnrUxEmSCVLXLi4gKcPdc36e6llCadRk7MxOJ67r13BqnL77J2UIAinVWWeid+8fyOP7++gzGHAqFUjSRImnYbzFubjMOroCUZpcoepzDNyrCtIIjW5G86hWj0RFhaYp1VRPJP80SRqmUlXpZt0qlmv+h7swW0t3LCpkgdv3jTse+fUulhTYc8Z5zPTWjwRZAmKbLltL9UqCZUMnmkkampUErLIrBcEYZpeONLNb19potMX423rSnMSrVSyRL5ldkYNCYJw5vnoxQtn7dhn17godxqyAfABhzr8lNkNtHpPXZtcFh17WnysLrezu3/s0Ime8YueyhwGTFo1NoNm3H1JyCS+jrZurcozEorlru/d4US2I6ZOLfOjd68VwW/htIjH4+zYsYM77rgj+5gsy1x66aVs2bJlDs9MmA23XFTLh85fwL42H1tO9hFNpLlqZTELCy187bGD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7OCWu66xY7zWBx98AA6H0wGtbD5Xju/w4cOYNGkSJkyYgISEBBw7dgyLFy8Gl9s1vi6uHOO8efOQmpqKbdu24cyZM5gxYwZmz56NkydPdmDLCXEdfc6bLzg4GG+99RYSExNx/PhxjBs3DtOmTcPZs2cBAE8++SR+/fVXbNiwAX/99Rdyc3MxY8aMDm5159DQa+cO5wCk9RiNRsyaNQsPP/xwg9utXr0aeXl5tn/XXqSkp6djypQpGDt2LJKSkvDEE0/gvvvuw86dO9u49c41dkyJiYnw9fXF999/j7Nnz+KFF17A0qVL8fHHHztsm5qaanfcvr6+bd18pxo7JovFgilTpsBoNOLQoUNYu3Yt1qxZg2XLltm26WzvU13Dhw+3e63z8vJw3333ISIiAoMHD7bbdvfu3XbbxcbGdlCrXfPqq6/atffRRx+1rdNqtZgwYQLCwsKQmJiIlStX4pVXXsGXX37ZgS0mnZE7xrZa10OMq+XOsa4WxTzS1Rw7dszuM7tr1y4AwKxZs2zb3H///XbbdKWOGzqdDv3798cnn3zidP0777yD//73v/j8889x9OhRyGQyTJw4EXq93rbNnXfeibNnz2LXrl347bffcODAATzwwAPtdQhN0tDxVlVV4cSJE3jppZdw4sQJbN68Gampqbj11lsdtm0olnUmjb2/ADBp0iS7Y/nxxx/t1nel95eQlrrllltgNpuxd+9eJCYmon///rjllltsHUJdOe8kzbNp0ybcfffduOeee3Dq1Cn8888/uOOOO2zrr/vXnpFmKywsZADYX3/9Ve82P//8MxMKhcxkMrVjy1pPfcd48uRJFhQUxPLy8hgAtmXLlo5pYAs5O764uDj24osvdmCrWpezY5TJZOy7776z287T05N99dVX7d08QloFfc5bRq1Ws6+//pqVl5czgUDANmzYYFuXkpLCALDDhw93YAs7r9rXzpmufg5AWm716tVMpVI5XdfY+dP//d//sd69e9stmzNnDps4cWIrtrDpGjqmuh555BE2duxY29/79u1jAFhZWVnbNK6Z6jum33//nXG5XJafn29b9tlnnzGlUskMBgNjrPO+T/UxGo3Mx8eHvfrqq7Zl6enpDAA7efJkxzWsicLCwtiqVavqXf/pp58ytVpte58YY+y5555jMTEx7dA60hW5Y2yrdT3FuFruEutqUcwj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Bw+GTCaDQqHAzJkzcfDgwU58Y4QQctqCBQswadIkAMA111wDhmEwefJkLFiwADKZDAUFBbjkkksgl8txww03AAh9bNd0jYqKCsyePRsymQxRUVFYsmQJ3G6337kejwevvfYaBg8eDJFIhKioKMyYMQN79uzxO+/jjz/GiBEjIBaLodFocP3116OsrKwLvyFCCAneVzaN85pjGAaLFi3Cd999h0GDBvnGp+vXr2/zPt9//z0uvfRSxMfHQygUIiMjA88++2yLPnPy5MkYNGhQm2NYACgvL8fs2bMhlUoRHR2N+++/v8XzPiGEdMTWrVsxcuRIiEQiZGRk4J133gnYL4Yyfmvq1/bu3YuJEydCIpHg8ccf9z2L/+c//8Ebb7yB9PR0SCQSTJs2DWVlZWBZFs8++ywSExMhFotxxRVXQKvV+l07nH2ryWSCVCrFvffe2+L7KC8vB5fLxfLlyzv71ZIuQCnQSZtqamowZswY32AuKioK69atwy233AKDwYD77ruvXddbunQpli9fjltvvRU5OTkwGAzYs2cP9u3bh4svvhgA8Ntvv6GwsBALFy5EbGwsjh49infffRdHjx7Fjh07WnSoTa677jrcdNNN2L17t2/iEwBKSkqwY8cOvPzyy75jb731FgYOHIjLL78cPB4PP/74I+6++254PB7885//9J331FNP4bnnnsMll1yCSy65BPv27cO0adPgcDhafE/jxo2DxWLB4sWLERERgTVr1uDyyy/H119/jSuvvNLv/GeffRYCgQBLliyB3W6n1MGEEACh9bnvvfceFi9ejKuvvtoXTDl06BB27tyJf/zjH7jqqqtw8uRJfPbZZ1ixYgUiIyMBAFFRUQCAW2+9FWvWrMHVV1+NBx98EDt37sTy5ctx/PhxrF271q89+fn5uPrqq3HLLbdg/vz5+PDDD7FgwQKMGDECAwcODPo5vvrqK1gsFtx1112IiIjArl27sHLlSpSXl+Orr77qui+QEHLOa6ufnDt3Lp555hk89dRTuP322zFhwgQAwLhx43zXaGxsxIwZM3DVVVfh2muvxddff41HHnkEgwcPxsyZM4Pee+PGjZg5cybS09OxdOlSWK1WrFy5EhdccAH27duH1NRUv/OvvfZapKamYvny5dixYwdef/11NDY2tlhI1FxhYSG+++47XHPNNUhLS0NNTQ3eeecd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3n77bcjlckilUowePdpvN3ZHvPzyy5g5cybGjh2LW265BVarFStXroRSqcTSpUtbnF9UVITLL78cM2bMwPbt2/Hxxx/jH//4B4YMGRL0HpdddhmeeeYZLFy4EOPGjcPhw4fxySef+GUjIoSQ7tQVY7spU6Zg3rx5eP3115GXl+crd7Zt2zZMmTIFixYtQkZGBp577jk89thjKC4uxuzZsyGXy1FUVIS1a9fi9ttvx5IlS8L4SQkhpHuNGzcOarUa8+fPx+LFi8EwDP73v/91KqX5bbfdhv/+97+46aabsHfvXsTFxeF///sfJBJJGFtOCDkfLV26FBs2bMAFF1yAu+66C263G//9738xaNAgHDhwAAB6xfitK/rWJv/4xz/w8MMPY+3atbjrrrvA5/PD0GLSVSgATtoUExODXbt24ZlnnsG3336LN998ExERERg4cCBefPHFdl9v8eLF+OGHH7BhwwbY7XakpKTgueeew0MPPeQ759NPP8U999yDN954AyzLYtq0aVi3bp1fGvPWiEQiXH755fjkk08wdepUREdH+/08KysLX3/9NZ544gksWbIEsbGxuOuuuxAVFYWbb77Z79znnnsOIpEIb7/9tm+ydcOGDS12ScbExODvv//GI488gpUrV8JmsyE7Oxs//vhjWHZUEkLOD6H0uXfccQc++eQTvPLKKzCZTEhMTMTixYvxxBNP+K4zatQoPPvss3j77bexfv16eDweFBUVQSqV4v3330d6ejpWr16NtWvXIjY2Fo899hiefvrpsHwGPp+PH3/8EYsXL8by5cshEolw5ZVXYtGiRa0GfQghJBSh9JN8Ph9r1qzBY489hjvvvBMulwurVq3qdAB86tSpWL9+PZ5++mk89dRT4PP5mDRpEl588cWA1/7iiy/w1FNP4dFHHwWPx8OiRYvw8ssvt3qPxx9/HGazGZ9++im++OILDB8+HD///DMeffTRTrWdEEI6qqvGdqtWrUJ2djY++OADPPTQQ1AqlRg5ciTGjRvnO+fRRx9F3759sWLFCt9u8aSkJEybNg2XX355pz8bIYT0pIiICPz000948MEH8cQTT0CtVuPGG2/ERRddhOnTp3fomhKJBJs2bcI999yDlStXQiKR4IYbbsDMmTMxY8aMMH8CQsj5ZMSIEVi3bh2WLFmCJ598EklJSXjmmWdw/PhxXxlY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zJgxEAqFSEtLw2OPPQan0xn0Omlpabjwwgvx448/Ij8/HyKRCBkZGXj77bc7vefx48exaNEiiMViJCUl4emnnw6Z8aLj/Pbc97rxxhsDt9vrnH3//fe46667oNPpkJSUBCC8OTEAuN1urF+/HllZWRCJRIiJicHcuXOxefPmXvQmIWQ0C1Vz8euvv8b8+fMhl8uhUCgwY8aMTufDu3fvxvLly6FUKiGRSDB//nz89NNPPb7fp59+ipUrV0Kv10MoFGLMmDH47W9/C6/XG3TcggULkJubixMnTmDhwoWQSCRITEzEM8880+k1q6urcemll0IqlUKn0+GBBx7oNN4TQshg6ji2DsScs2MNcJfLhSeeeALTpk2DUqmEVCrFvHnz8N133w3UxySEjFKDMcYBwEsvvYScnBwIhULo9XrcfffdMBqNQcf0Zs7odDrx5JNPIjMzE0KhEMnJyfjVr37Vad64efNmzJ07FyqVCjKZDNnZ2XjssccCj4eKd1G8Z/igHeAkbAcPHsTy5cuRkJCA9evXw+v14qmnnoJWq+3T6+3duxc7duzA1VdfjaSkJJSXl2Pjxo1YsGABTpw4AYlEgvPOOw/33nsvnn/+eTz22GMYP348AAT+fuedd7BmzRosW7YMf/zjH2Gz2bBx40bMnTsXBw8eDArMeL1erFixAueddx6eeeYZ/Otf/8I999wDqVSKX//617juuuuwatUqvPzyy/jZz36GWbNmIT09HQBQWlqKTz75BFdeeSXS09PR0NCAV155BfPnz8eJEyeg1+u7/JybN29GaWkpbrrpJsTHx+P48eN49dVXcfz4cezatSuweIAQQvpj9erVSE9Px4YNG3DgwAH84x//gE6nwx//+EcAwMaNG5GTk4OLL74YPB4Pn3/+Oe666y74fD7cfffdIV9z/PjxeOqpp/DEE0/g9ttvx7x58wAAs2fPHrTPRQghPY1vt956K9566y1cccUVePDBB7F7925s2LABJ0+exMcffxz0WsXFxbjiiitwyy23YM2aNfjnP/+JG2+8EdOmTUNOTg4AoL6+HgsXLoTH48EjjzwCqVSKV199FWKxuN+f5a677oJWq8UTTzwBq9UKILw5MQCsW7cOGzZswK233or8/HyYTCbs27cPBw4cwPnnn9/vthFCRp8333wTN998M3JycvDoo49CpVLh4MGD+Oabb3DttdcCALZu3YoVK1Zg2rRpePLJJ8HhcAILK7dv3478/PxuX18mk2Ht2rWQyWTYunUrnnjiCZhMJvzpT38KOra1tRXLly/HqlWrsHr1avzf//0fHn74YUycOBErVqwAANjtdixevBiVlZW49957odfr8c4772Dr1q0D10mEENIHAz3nNJlM+Mc//oFrrrkGt912G8xmM15//XUsW7YMe/bs6VS+jBBCIinSY9y6deuwfv16LFmyBHfeeScKCwuxceNG7N27Fz/99FNQBspw5ow+nw8XX3wxfvzxR9x+++0YP348jh49imeffRanT5/GJ598AsAfoL/wwguRl5eHp556CkKhEMXFxT0u9KR4zzDCEhKmiy66iJVIJGxNTU3gvqKiIpbH47HtP0plZWUsAPaNN97o9HwA7JNPPhm4bbPZOh2zc+dOFgD79ttvB+7797//zQJgv/vuu6BjzWYzq1Kp2Ntuuy3o/vr6elapVAbdv2bNGhYA+/vf/z5wX2trKysWi1mGYdhNmzYF7j916lSntjocDtbr9Qa9T1lZGSsUCtmnnnoq6L6Onz/U53z//fdZAOwPP/zQ6TFCCOmNJ598kgXA3nzzzUH3X3bZZWxMTEzgdqixaNmyZWxGRkbQffPnz2fnz58fuL13794ux/U1a9awqamp/Wo/IYR0JZzx7dChQywA9tZbbw065qGHHmIBsFu3bg3cl5qa2mn+1djYyAqFQvbBBx8M3Hf//fezANjdu3cHHadUKlkAbFlZWeD+jnPGc99rzZo1gdtvvPEGC4CdO3cu6/F4go4Nd048adIkduXKlZ2OJYSQcLWPRWVlZazRaGTlcjlbUFDA2u32oON8Pl/g76ysLHbZsmWB+1jWP26lp6ez559/fsjXPve4jn7+85+zEomEdTgcgfvmz5/facxzOp1sfHw8e/nllwfue+6551gA7Icffhi4z2q1spmZmSGvGRBCyGDoOP4NxJyz43m6x+NhnU5nUDtaW1vZuLi4TnNnQgjpj4Ee4xobG1mBQMAuXbo0KP7ywgsvsADYf/7zn4H7wp0zvvPOOyyHw2G3b98e9FlefvllFgD7008/sSzLss8++ywLgG1qaury81O8Z3ijFOgkLF6vF1u2bMGll14atNs5MzMzsLKmt85d7eN2u9HS0oLMzEyoVCocOHCgx+dv3rwZRqMR11xz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jRs3cvHFF5OcnExFRQUvv/wyCQkJTJ8+vcVri3hP/yIC4EKHZWRk8M033/CHP/yBRx55hMTERB5//HEOHTpEVlZW8LxHH32UyspKVqxYwUcffcS8efP45ptviIqKanK9//u//0Mmk/Hee+/hdDqZNm0a33//PXPnzm1yXkxMDEuXLmXJkiXcdttt+Hw+1q1bR1RUFL/85S+Ji4vj6aef5tlnn8XlchEfH88555zDrbfe2m2f/eGHH6a+vp7ly5fz4YcfMm7cOFatWsWf/vSndl+7fPly7rnnHl566SUCgQAXXHAB33zzDXFxcd3WPkEQhLYMGTKEFStW8Je//IU//OEPxMTE8Nvf/pbIyEgWLFjQ5msVCgVvvfUWixYt4s4778Tr9bJs2TIRABcEoc94/fXXSU1N5c0332TlypXExMSwaNGiLqeAjI2NZd26ddxzzz08/fTThIeHc+eddxIXF8dtt93W5Nw77riD3Nxc3njjDVavXs0555zDd999x3nnndfh9+vomPjee+/liy++YM2aNbhcLpKTk3niiSd48MEHu/Q5BUEQbrvtNqKionj66af529/+hkKhYOjQoTzwwAPBc2bNmsWWLVv429/+xosvvojNZiMmJoZJkybxm9/8ptVrh4eH89VXX/H73/+ev/zlL4SFhXHTTTdx3nnnNevfOkqr1bJ27VruueceXnjhBbRaLTfeeCPz5s3jwgsv7NI1BUEQektnxpwnu+WWWygrK+PVV1/l22+/JT09nXfffZePP/6Y9evXn54PIAiC0IbO9HGPPfYYkZGRvPjiizzwwAOYTCZ+/etf89RTT6FQKDr93lKplM8++4znn3+et99+m5UrV6LVaklNTeW+++5j8ODBAFx22WXk5eXx3//+l6qqKiIiIpg5cyaLFy/GaDS2en0R7+k/JIHTUZleOKNdccUVHDhwQNQ5EARBEARBEARBEARBEARBEARBEAShV4ka4EKnOByOJo+PHDnC119/zaxZs3qnQYIgCIIgCIIgCIIgCIIgCIIgCIIgCMeJHeBCp8TGxnLLLbeQmppKfn4+r7zyCi6Xi127djFo0KDebp4gCIIgCIIgCIIgCIIgCIIgCIIgCGcxUQNc6JQLL7yQ999/n7KyMlQqFVOmTOGpp54SwW9BEARBEARBEARBEARBEARBEARBEHpdn0iBvnHjRi69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hk8++QQVFRUW6wsLC5t1XGvPUZVKZYuCLvfffz9OnDiBU6dOmbVv06ZNZtuVlpZanLfbs9spDToh5LbG3PO2JCZ0W2OPMW7cOOh0OrPnpUajEV988YXFMcPCwnD16lWzPvr8+fM4evSoxWtTTKjjoxngxO4efPBBbNu2DZMnT8YDDzyA1NRUfPXVV4iKirJ6gVh33++++w5yuRxRUVE4fvw49u3bB3d3d6vbz5w5E//5z39w4MABfPjhh2brysvLERAQgEceeQR9+vSBVCrFvn37cPr0abMR5XU98MADWLFiBe677z488cQTKCgowBdffIHu3bvjwoULTT8hhBDSTDNmzMDPP/+MefPm4cCBAxg6dCgMBgOuXr2Kn3/+GXv27MGAAQOwf/9+fPnll1iyZAn69+8PoGaE4siRI/Hmm2/io48+snp8LpeL1atXY8KECejbty9mz54NX19fXL16FZcuXcKePXsA1KR4Gz9+POLi4jB37lxUV1fj888/h1wux9KlS9vrdBBCCADgmWeewZo1a/DUU08hISEBISEh2Lp1K44ePYpVq1bBxcWlwWM0tl/74IMP8Ndff2HEiBF45pln0LNnT+Tm5mLLli04cuQIFAoFXnvtNWzduhWPPvoo5syZg9jYWJSUlOC3337DV199hT59+rRKmwkhpCmeeOIJ/POf/8T27dvx3HPPQSAQmK1/8MEH8c4772D27Nm46667kJSUhE2bNqFbt252anHTnwcQQkhYWBjee+89LF68GGlpaXjooYfg4uKC1NRUbN++Hc888wxeffVVADUB7J9++gmLFi3CwIEDIZVKMWHChEa/FpfLxdq1azF+/HhER0dj9uzZ8Pf3R3Z2Ng4cOACZTIadO3c2+T2MHTsWQqEQEyZMwLPPPouKigp888038PLyQm5ubpOPBwD//Oc/8d133+G+++7DSy+9BGdnZ3z99demrES3bdy4EV9++SUmT56MsLAwlJeX45tvvoFMJqPB7oQQk8bc87YkJnRbY4/x0EMPYdCgQXjllVeQkpKCHj164LfffkNJSQkA84wfc+bMwYoVKzBu3DjMnTsXBQUF+OqrrxAdHQ2VSmXajmJCnQMFwIndPfXUU8jLy8OaNWuwZ88eREVF4fvvv8eWLVtw8OBBm/t+9tln4PF42LRpE9RqNYYOHYp9+/Zh3LhxVrePjY1F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OBwcOHAAM2bMgFwuB5fLhbOzM/7++2/Y29ub3efkyZP4+eefsXfv3naOtvU15vw763dic3z99deYMGECPD09Dcv8/Pzwzz//YPbs2Xjssceg0+kQERGBP//804KRko7O3HspMzMTfn5+RtvV/CzVlXPa2+3btwEAa9aswfvvvw9fX1+89957GDVqFG7dumW4ofT6669jzJgxkEql+Oeff7Bs2TKUlpbiqaeesmT4RhpzLp0txz311FPo378/HBwccPLkSaxcuRIZGRl4//33AQA2NjZ47733MHToUHC5XPz666+YMWMGdu3ahWnTplk4emMNnUtn+cyQriMuLg6ffPIJ3n33XcOyrvA+7Qz5viU62/dAYzSUXwnpDCZOnIh7770Xfn5+iI+PxyuvvIJJkybh1KlT4PF4lg6vXVnrvcPWZO41AoAHHngAPj4+cHd3x5UrV/DSSy8hJiYGO3futGC0zUM9wAkhrWr58uW4du0atm3bZulQSCO8/PLL4HA49f6xtiIw6fysNc8EBQUhKioKZ86cweOPP4758+cjOjra0mGRLqSx3wmMMSxfvhzOzs44duwYzp49ixkzZmDq1KnIyMgwOe61a9cwffp0rF69GuPHj7fAmTVOW51/Z9Gca4LU1FTs27cPixYtMlqemZmJxYsXY/78+Th37hyOHDkCoVCI++67z6p6PxHzWvO9ZGmNPRe9Xg8A+N///oeZM2ciLCwMkZGR4HA42L59u+F4r732GoYOHYp+/frhpZdewosvvoiNGzd2ynOxtKa8z1asWIFRo0ahd+/eWLp0Kd577z188sknUKlUAAAnJyesWLEC4eHhGDhwIDZs2ICHHnqow/3fNOZcCGkrzcntaWlpmDhxImbNmoXFixdbKPLGae17I5bM93Xpivd/KL+SrmbOnDmYNm0aevXqhRkzZuCPP/7AuXPncPjwYUuH1u6s9d5ha6rrNVqyZAkmTJiAXr164cEHH8R3332H3377DfHx8RaKtPmoB3gH5OTkBB6Ph6ysLKPlWVlZcHV1tVBU1qv6Nc3KyoKbm5theVZWFvr27WuhqDqnJ554An/88QeOHj1q1HPD1dUVarUahYWFRi2s6D1tec899xwWLFhQ7zb+/v6NOparqyvOnj1rtKw6j3Xk/+eulHOtId9Zc54RCoUIDAwEUDV88Llz5/DRRx/h/vvv7/TnRjqHxn4n/Pvvv/jjjz9QUFAAhUIBAPj888+xf/9+fPvtt3j55ZcN20dHR2Ps2LFYsmQJXn311bYMv8Va8/w743dic64JIiMj4ejoaNJD8rPPPoOtrS3eeecdw7KtW7fCy8sLZ86cweDBg1stbtLxtOZ7ydXV1ew1WvW6ttbYc6lu/BISEmJYLhKJ4O/vj+Tk5Dr3DQ8Px7p166BSqSASiVol5rq05rl0hBzXkt8x4eHh0Gq1SExMRFBQUJ3b7N+/v6VhNkprnoulPzPEejX1fZqeno7Ro0djyJAh+PLLL42264jv09a8N2JOe+b7unTF+z9t/V1BSEfn7+8PJycnxMXFYezYsZYOp91Y873D1lLXa2ROeHg4gKpRXQICAtojvFZDBfAOSCgUIiwsDAcPHsSMGTMAVA1HcPDgQTzxxBOWDc4K+fn5wdXVFQcPHjQUgIqLiw098EjDGGN48skn8dtvv+Hw4cMmQ1mFhYVBIBDg4MGDmDlzJgAgJiYGycnJiIiIsETI5A6lUgmlUtkqx4qIiMCbb76J7OxsODs7AwD2798PhUJhdAOto+lKObcz57uumGf0ej1UKpVVnhvpmBr7nVA99xOXazyYFJfLNfQcBIDr169jzJgxmD9/Pt58883WDbYNtOb5d8bvxKZeEzDGEBkZiXnz5pnM611eXm7y+lQPuVfzPUKsU2u+lyIiIvC///0PGo3GsG7//v0ICgpqlyFyG3suYWFhEIlEiImJwbBhwwAAGo0GiYmJ8PHxqXO/qKgo2Nvbt0sxpDXPpSPkuJb8jomKijJMX1HfNjUbjLal1jwXS39miPVqyvs0LS0No0ePNowgUfuaoCO+T1vz3og57Znv69IV7/+09XcFIR1damoq8vLy2u2axtK64r3DpmroNTInKioKADrn+4iRDmnbtm1MJBKxLVu2sOjoaLZkyRJmZ2fHMjMzLR1ap1RSUsIuXbrELl26xACw999/n126dIklJSUxxhjbsGEDs7OzY7t372ZXrlxh06dPZ35+fqyiosLCkXcOjz/+OLO1tWWHDx9mGRkZhj/l5eWGbZYuXcq8vb3Zv//+y86fP88iIiJYRESEBaMmTZWUlMQuXbrE1q5dy2xsbAyfqZKSEsYYY1qtloWGhrLx48ezqKgo9vfffzOlUslWrlxp4cgbZk0511rznbXnmZdffpkdOXKEJSQksCtXrrCXX36ZcTgc9s8//zDGOve5EeuTk5PDHB0d2b333suioqJYTEwMe/7555lAIGBRUVGMMcauXr3KlEole+ihh4w+s9nZ2RaOvuUac/6d+TuxsQ4cOMAAsBs3bpisO3jwIONwOGzt2rXs1q1b7MKFC2zChAnMx8fHKG8Twlj976XCwkLm4uLCHn74YXbt2jW2bds2JpVK2RdffGGBSOv39NNPMw8PD7Zv3z528+ZNtmjRIubs7Mzy8/MZY4zt2bOHffXVV+zq1assNjaWff7550wqlbJVq1ZZOHJTDZ1LZ8pxJ0+eZB988AGLiopi8fHxbOvWrUypVLJ58+YZttmyZQv78ccf2Y0bN9iNGzfYm2++ybhcLvvmm28sGLmpxpxLZ/rMEOuUmprKAgMD2dixY1lqaqrRdWC1zv4+bejeSGfK93Wx5vs/5jQmvxLSEdR3z6+kpIQ9//zz7NSpUywhIYEdOHCA9e/fn3Xr1o1VVlZaOvR2Ye33DltDQ69RXFwce/3119n58+dZQkIC2717N/P392cjRoywcOTNQwXwDuyTTz5h3t7eTCgUskGDBrHTp09bOqRO69ChQwyAyZ/58+czxhjT6/XstddeYy4uLkwkErGxY8eymJgYywbdiZh7bQGwyMhIwzYVFRVs2bJlzN7enkmlUnbPPfcY/QAiHd/8+fPN/j8fOnTIsE1iYiKbNGkSk0gkzMnJiT333HNMo9FYLugmsJaca635ztrzzMKFC5mPjw8TCoVMqVSysWPHGorfjHXucyPW6dy5c2z8+PHMwcGByeVyNnjwYPbnn38a1q9evdrsZ9bHx8dyQbeihs6fsc79ndgYc+fOZUOGDKlz/U8//cT69evHZDIZUyqVbNq0aWYLnIQ09F66fPkyGzZsGBOJRMzDw4Nt2LChHaNrPLVazZ577jnm7OzM5HI5GzduHLt27Zph/V9//cX69u3LbGxsmEwmY3369GGbN29mOp3OglGb19C5MNZ5ctyFCxdYeHg4s7W1ZWKxmPXo0YO99dZbRjeCt2zZwnr06MGkUilTKBRs0KBBbPv27RaM2rzGnAtjneczQ6xTZGRknb/daurM79OG7o10pnxfF2u//1NbY/MrIZZW3z2/8vJyNn78eKZUKplAIGA+Pj5s8eLFnbJzT3NZ+73D1tDQa5ScnMxGjBjBHBwcmEgkYoGBgeyFF15gRUVFlg28mTiMMdaSHuSEEEIIIYQQQgghhBBCCCGEEEJIR8BteBNCCCGEEEIIIYQQQgghhBBCCCGk46MCOCGEEEIIIYQQQgghhBBCCCGEEKtABXBCCCGEEEIIIYQQQgghhBBCCCFWgQrghBBCCCGEEEIIIYQQQgghhBBCrAIVwAkhhBBCCCGEEEIIIYQQQgghhFgFKoATQgghhBBCCCGEEEIIIYQQQgixClQAJ4QQQgghhBBCCCGEEEIIIYQQYhWoAE4IIYQQQgghhBBCCCGEEEIIIcQqUAGcEEIIIYQQQgghhBBCCCGEEEKIVaACOCGEEEIIIYQQQgghhBBCCCGEEKtABXBCCCGEEEIIIYQQQgghhBBCCCFWgQrghBBCCCGEEEIIIYQQQgghhBBCrAIVwAkhhBBCCCGEEEIIIYQQQgghhFgFKoATQgghhBBCCCGEEEIIIYQQQgixClQAJ4QQQgghhBBCCCGEEEIIIYQQYhWoAE4IIYQQQgghhBBCCCGEEEIIIcQqUAGcEEIIIYQQQgghhBBCCCGEEEKIVaACOCFNsGbNGnA4HEuHQQghFkE5kBBCWm7Lli3gcDhITEy0dCiEkA6qPa+5Ro0ahdDQ0HZ5rvaOw9fXFwsWLGjVYxJCrB/97v0P5VFCSH0WLFgAX19fS4dBSJ2oAE46rejoaKxZs4ZuHhJCCCGEEEIIIQBOnjyJNWvWoLCw0NKhmEhPT8eaNWsQFRVl6VAIIaRNdOQcXJfOGDMhhBDSGFQAJ51WdHQ01q5d264F8FdffRUVFRXt9nyEENKRUA4khBBCCGl7LbnmOnnyJNauXdshCxnp6elYu3YtFcAJIR2atebgutQXc0xMDL766qv2D4oQ0il89dVXiImJsXQYhNSJCuCk06msrIRer2/X5ywrKwMA8Pl8iMXidn1uQggxpzovtSfKgYSQjs4SuZEQQlqbtV1zabVaqNVqS4dBCCGNYm05uC6NuW4WiUQQCATtEA0hpDMSCAQQiUSWDqNd0T2HzoUK4KRB1XPf3Lx5E7Nnz4ZCoYCjoyOefvppVFZWGrZLTEwEh8PBli1bTI7B4XCwZs0ao2VpaWlYuHAhXFxcIBKJ0LNnT3zzzTdG2xw+fBgcDgfbtm3Dq6++Cg8PD0ilUnz88ceYNWsWAGD06NHgcDjgcDg4fPiwYd/PP/8cPXv2hEgkgru7O5YvX96oFpjV5xsdHY0HHngA9vb2GDZsmNG62rZu3YpBgwZBKpXC3t4eI0aMwD///GO0TXPjIYSQuvLSqFGjMGrUKJPtzc3Bs23bNoSFhUEul0OhUKBXr1746KOPDOs1Gg3Wrl2Lbt26QSwWw9HREcOGDcP+/ftN4qgpMjISY8aMgbOzM0QiEUJCQrBp06ZWPX9CCDGnrtzI4XBw5coVw3a//vorOBwO7r33XqP9e/Togfvvv9/wuLH5zNfXF1OmTMHx48cxaNAgiMVi+Pv747vvvjPZ9vr16xgzZgwkEgk8PT3xxhtvmG3IuXv3bkyePBnu7u4QiUQICAjAunXroNPpWvISEULaUUlJCZ555hn4+vpCJBLB2dkZd911Fy5evGjY5tixY5g1axa8vb0hEong5eWFZ5991qSnoblrLg6HgyeeeAK7du1CaGio4Tf033//bbTfCy+8AADw8/Mz/E5uzKhpFy5cwJAhQyCRSODn54fNmzcbrVer1Vi1ahXCwsJga2sLmUyG4cOH49ChQ0bbVd8XePfdd/Hhhx8iICAAIpEIn3/+OQYOHAgAeOSRRwyx1b5/EB0djdGjR0MqlcLDwwPvvPOOSawqlQqrV69GYGCg4XV88cUXoVKpGjzPwsJCPPPMM/Dy8oJIJEJgYCDefvtto9xc8xw+++wz+Pv7QyqVYvz48UhJSQFjDOvWrYOnpyckEgmmT5+O/Px8w/7z58+Hk5MTNBqNyfOPHz8eQUFBDcZJCGmazpqDR40ahdDQUFy5cgUjR46EVCpFYGAgduzYAQA4cuQIwsPDIZFIEBQUhAMHDhjtn5SUhGXLliEoKAgSiQSOjo6YNWuWyXNu2bIFHA4HR44cwbJly+Ds7AxPT88GY649B3j1cU6cOIEVK1ZAqVRCJpPhnnvuQU5OTt3/QYSQTqmh3Fr7/mPNa6gvv/zScB04cOBAnDt3zuT427dvR0hICMRiMUJDQ/Hbb7+Zvaf57rvvYsiQIXB0dIREIkFYWJghT9ZUnat/+OEHBAUFQSwWIywsDEePHjXZ9tKlS5g0aRIUCgVsbGwwduxYnD592mibunJntb/++gvDhw+HTCaDXC7H5MmTcf369aa8xKSN8S0dAOk8Zs+eDV9fX6xfvx6nT5/Gxx9/jIKCArM3+xqSlZWFwYMHG5KSUqnEX3/9hUWLFqG4uBjPPPOM0fbr1q2DUCjE888/D5VKhfHjx+Opp57Cxx9/jFdeeQU9evQAAMPfa9aswdq1azFu3Dg8/vjjiImJwaZNm3Du3DmcOHGiUa0XZ82ahW7duuGtt94CY6zO7dauXYs1a9ZgyJAheP311yEUCnHmzBn8+++/GD9+fKvFQwghtfPSL7/80qj99u/fj7lz52Ls2LF4++23AQA3btzAiRMn8PTTTwOoylPr16/Ho48+ikGDBqG4uBjnz5/HxYsXcdddd9V57E2bNqFnz56YNm0a+Hw+fv/9dyxbtgx6vR7Lly9v+UkTQkgDaubGgoICXL58GUePHkXv3r0BVN3s5HK5OH78uGGfnJwc3Lx5E0888YRhWVPyWVxcHO677z4sWrQI8+fPxzfffIMFCxYgLCwMPXv2BABkZmZi9OjR0Gq1ePnllyGTyfDll19CIpGYnMOWLVtgY2ODFStWwMbGBv/++y9WrVqF4uJibNy4sS1eNkJIK1u6dCl27NiBJ554AiEhIcjLy8Px48dx48YN9O/fH0DVTb7y8nI8/vjjcHR0xNmzZ/HJJ58gNTUV27dvb/A5jh8/jp07d2LZsmWQy+X4+OOPMXPmTCQnJ8PR0RH33nsvbt26hZ9++gkffPABnJycAABKpbLe4xYUFODuu+/G7NmzMXfuXPzyyy94/PHHIRQKsXDhQgBAcXEx/u///g9z587F4sWLUVJSgq+//hoTJkzA2bNn0bdvX6NjRkZGorKyEkuWLIFIJMI999yDkpISrFq1CkuWLMHw4cMBAEOGDDGKY+LEibj33nsxe/Zs7NixAy+99BJ69eqFSZMmAQD0ej2mTZuG48ePY8mSJejRoweuXr2KDz74ALdu3cKuXbvqPM/y8nKMHDkSaWlpeOyxx+Dt7Y2TJ09i5cqVyMjIwIcffmi0/Q8//AC1Wo0nn3wS+fn5eOeddzB79myMGTMGhw8fxksvvYS4uDh88skneP755w0N+h9++GF899132LdvH6ZMmWI4XmZmJv7991+sXr263v8PQkjTdfYcPGXKFMyZMwezZs3Cpk2bMGfOHPzwww945plnsHTpUjzwwAPYuHEj7rvvPqSkpEAulwMAzp07h5MnT2LOnDnw9PREYmIiNm3ahFGjRiE6OhpSqdTouZYtWwalUolVq1ahrKwMkyZNalbMTz75JOzt7bF69WokJibiww8/xBNPPIGff/65wdeRENJ5NCa3mvPjjz+ipKQEjz32GDgcDt555x3ce++9uH37tqEOsnfvXtx///3o1asX1q9fj4KCAixatAgeHh4mx/voo48wbdo0PPjgg1Cr1di2bRtmzZqFP/74A5MnTzba9siRI/j555/x1FNPGRphTpw4EWfPnkVoaCiAqobqw4cPh0KhwIsvvgiBQIAvvvgCo0aNMjQ8qql27gSA77//HvPnz8eECRPw9ttvo7y8HJs2bcKwYcNw6dIlkyI+sRBGSANWr17NALBp06YZLV+2bBkDwC5fvswYYywhIYEBYJGRkSbHAMBWr15teLxo0SLm5ubGcnNzjbabM2cOs7W1ZeXl5Ywxxg4dOsQAMH9/f8Oyatu3b2cA2KFDh4yWZ2dnM6FQyMaPH890Op1h+aeffsoAsG+++aZR5zt37tw611WLjY1lXC6X3XPPPUbPxRhjer2+VeIhhJC68tLIkSPZyJEjTbafP38+8/HxMTx++umnmUKhYFqtts7n6NOnD5s8eXKj4qipdm5mjLEJEyYwf3//eo9FCCEtVVdu7NmzJ5s9e7bhcf/+/dmsWbMYAHbjxg3GGGM7d+40uo5lrPH5zMfHhwFgR48eNSzLzs5mIpGIPffcc4ZlzzzzDAPAzpw5Y7Sdra0tA8ASEhLqfe7HHnuMSaVSVllZ2dBLQQjpAGxtbdny5cvr3cbcZ339+vWMw+GwpKQkwzJz11wAmFAoZHFxcYZlly9fZgDYJ598Yli2ceNGkxxTn5EjRzIA7L333jMsU6lUrG/fvszZ2Zmp1WrGGGNarZapVCqjfQsKCpiLiwtbuHChYVn1fQGFQsGys7ONtj937lyd9wyq4/juu++M4nB1dWUzZ840LPv+++8Zl8tlx44dM9p/8+bNDAA7ceKEYZmPjw+bP3++4fG6deuYTCZjt27dMtr35ZdfZjwejyUnJxudg1KpZIWFhYbtVq5cyQCwPn36MI1GY1g+d+5cJhQKDflap9MxT09Pdv/99xs9z/vvv884HA67ffu2yfkTQlqms+fgH3/80bDs5s2bDADjcrns9OnThuX79u0zyaHmzunUqVMm+TQyMpIBYMOGDTO5L1BfzLXzaPVxxo0bZ7jvyRhjzz77LOPxeEY5kxDS+TWUW2vff6y+hnJ0dGT5+fmG5bt372YA2O+//25Y1qtXL+bp6clKSkoMyw4fPswAGB2TMdNcp1arWWhoKBszZozRcgAMADt//rxhWVJSEhOLxeyee+4xLJsxYwYTCoUsPj7esCw9PZ3J5XI2YsQIw7K6cmdJSQmzs7NjixcvNnr+zMxMZmtra7KcWA4NgU4arXbPlyeffBIA8OeffzbpOIwx/Prrr5g6dSoYY8jNzTX8mTBhAoqKioyGKAKqhhAz11vGnAMHDkCtVuOZZ54Bl/vfW3zx4sVQKBTYu3dvo46zdOnSBrfZtWsX9Ho9Vq1aZfRcAAzDJbVWPIQQ0pi8ZI6dnR3KysqMhjM3t83169cRGxvbpGPXzM1FRUXIzc3FyJEjcfv2bRQVFTUrXkIIaYrauXH48OE4duwYgKoh2y5fvowlS5bAycnJsPzYsWOws7MztAAHmpbPQkJCDL0XgapeMkFBQbh9+7Zh2Z9//onBgwdj0KBBRts9+OCDJudQ87lLSkqQm5uL4cOHo7y8HDdv3mzS60EIsQw7OzucOXMG6enpdW5T87NeVlaG3NxcDBkyBIwxXLp0qcHnGDduHAICAgyPe/fuDYVCYZR7moPP5+Oxxx4zPBYKhXjssceQnZ2NCxcuAAB4PB6EQiGAql7Y+fn50Gq1GDBggMnvdwCYOXNmgz0Ia7OxscFDDz1kFMegQYOMzm/79u3o0aMHgoODje4ljBkzBgBMhmSvafv27Rg+fDjs7e2N9h03bhx0Op3J8JizZs2Cra2t4XF1b6CHHnoIfD7faLlarUZaWhoAgMvl4sEHH8SePXtQUlJi2O6HH37AkCFD4Ofn16TXhRDSsM6cg21sbDBnzhzD46CgINjZ2aFHjx5GvRCr/13z+Wqek0ajQV5eHgIDA2FnZ2c2Ny9evBg8Hq9F8QLAkiVLjIaJHz58OHQ6HZKSklp8bEJIx9GY3GrO/fffD3t7e8Pj6t/O1fkrPT0dV69exbx582BjY2PYbuTIkejVq5fJ8WrmuoKCAhQVFWH48OFm81xERATCwsIMj729vTF9+nTs27cPOp0OOp0O//zzD2bMmAF/f3/Ddm5ubnjggQdw/PhxFBcXGx2zdu7cv38/CgsLMXfuXKNrSh6Ph/Dw8HqvR0n7ogI4abRu3boZPQ4ICACXy23UfGI15eTkoLCwEF9++SWUSqXRn0ceeQQAkJ2dbbRPU34gVl9s1Z5XSygUwt/fv9EXY415zvj4eHC5XISEhLR5PIQQ0tybZcuWLUP37t0xadIkeHp6YuHChUZzlQHA66+/jsLCQnTv3h29evXCCy+8YDSHbl1OnDiBcePGQSaTwc7ODkqlEq+88goAUAGcENIuaufG4cOHIyMjA3FxcTh58iQ4HA4iIiKMCuPHjh3D0KFDjRonNiWfeXt7m8Rhb2+PgoICw+OkpCST62fA9JoQqBqC7Z577oGtrS0UCgWUSqWhCES5lJDO4Z133sG1a9fg5eWFQYMGYc2aNSZFkeTkZCxYsAAODg6wsbGBUqnEyJEjATTus96Y3NMc7u7ukMlkRsu6d+8OAEa/97/99lv07t0bYrEYjo6OUCqV2Lt3r9nYm3Pd6unpaTLvbu3zi42NxfXr103uJVTHW/teQk2xsbH4+++/TfYdN26c2X1rv97VxXAvLy+zy2vGOW/ePFRUVOC3334DAMTExODChQt4+OGHG34hCCFN1plzsLncZ2tr26hcU1FRgVWrVsHLywsikQhOTk5QKpUoLCxstdxsTu3XorrQ1dLXghDSsTQmt5rTUI6orocEBgaa7Gtu2R9//IHBgwdDLBbDwcEBSqUSmzZtMpvnzP0G7969O8rLy5GTk4OcnByUl5eb/V3eo0cP6PV6pKSkGC2vnTurOw+NGTPG5Lryn3/+qfd6lLQvmgOcNFvti7Paj6vpdDqjx3q9HkBVq+n58+eb3ad6zsZqje393Zos8ZyEEFKf2nmJw+GAMWayXe286+zsjKioKOzbtw9//fUX/vrrL0RGRmLevHn49ttvAQAjRoxAfHw8du/ejX/++Qf/93//hw8++ACbN2/Go48+ajae+Ph4jB07FsHBwXj//ffh5eUFoVCIP//8Ex988IEh3xNCSFuqnRuHDRsGADh69Chu376N/v37QyaTYfjw4fj4449RWlqKS5cu4c033zTs09R8VlfPGXM5uSGFhYUYOXIkFAoFXn/9dQQEBEAsFuPixYt46aWXKJcS0knMnj0bw4cPx2+//YZ//vkHGzduxNtvv42dO3di0qRJ0Ol0uOuuu5Cfn4+XXnoJwcHBkMlkSEtLw4IFCxr1WW/N3NNUW7duxYIFCzBjxgy88MILcHZ2Bo/Hw/r16xEfH2+yfXN+Tzfm/PR6PXr16oX333/f7La1C0Y16fV63HXXXXjxxRfNrq8uojcUT2PiDAkJQVhYGLZu3Yp58+Zh69atEAqFmD17dp3xEUKarzPn4JbkmieffBKRkZF45plnEBERAVtbW3A4HMyZM8fsObXWvU5Lfh8RQtpPQ7m1Lq2ZI44dO4Zp06ZhxIgR+Pzzz+Hm5gaBQIDIyEj8+OOPTT5ec9TOndX59fvvv4erq6vJ9jVHCiKWRf8TpNFiY2ONWrvExcVBr9fD19cXwH8teQoLC432q93DWalUQi6XQ6fTGVpaN0ddBXcfHx8AVS2saw5joVarkZCQ0KLnrC0gIAB6vR7R0dHo27evxeMhhHQt9vb2ZltemhtZQigUYurUqZg6dSr0ej2WLVuGL774Aq+99pqhdaWDgwMeeeQRPPLIIygtLcWIESOwZs2aOgvgv//+O1QqFfbs2WPUupOG+iGEWJK3tze8vb1x7Ngx3L592zDc2ogRI7BixQps374dOp0OI0aMMOzTFvnMx8fH7LQSMTExRo8PHz6MvLw87Ny50yimhISEZj83IcQy3NzcsGzZMixbtgzZ2dno378/3nzzTUyaNAlXr17FrVu38O2332LevHmGfeqboqY56vqdXJ/09HSUlZUZ9QK/desWABh+7+/YsQP+/v7YuXOn0XOsXr26TWOrLSAgAJcvX8bYsWObfLyAgACUlpa222/wefPmYcWKFcjIyMCPP/6IyZMnGw0HSghpXZ01B7fEjh07MH/+fLz33nuGZZWVlSb3ZuvT3jETQjqX+nJrc1XXS+Li4kzW1V7266+/QiwWY9++fRCJRIblkZGRZo9t7jf4rVu3IJVKDdPzSKVSk9/lAHDz5k1wudx6G1QCMEyH4ezsTLWdDo6GQCeN9tlnnxk9/uSTTwDAkOwUCgWcnJxM5s36/PPPjR7zeDzMnDkTv/76K65du2byPDk5OY2Kp/rHee2LunHjxkEoFOLjjz82alX09ddfo6ioCJMnT27U8RtjxowZ4HK5eP31101aVlY/d3vGQwjpWgICAnDz5k2jvHn58mWcOHHCaLu8vDyjx1wu1zDShkqlMruNjY0NAgMDDevNqW7RWTO3FRUV1XkRSggh7WX48OH4999/cfbsWUMBvG/fvpDL5diwYQMkEonRvGBtkc/uvvtunD59GmfPnjUsy8nJwQ8//GC0nbnnVqvVJtfQhJCOS6fTmQzB6OzsDHd3d8O1lLnPOmMMH330UavGUtfv5PpotVp88cUXhsdqtRpffPEFlEqlIVeai//MmTM4depUm8ZW2+zZs5GWloavvvrKZF1FRQXKysrq3ffUqVPYt2+fybrCwkJotdpmx2XO3LlzweFw8PTTT+P27dtG85sTQlpPZ8/BLcHj8Ux6VH7yyScmo8LVp71jJoR0Do3Jrc3l7u6O0NBQfPfddygtLTUsP3LkCK5evWq0LY/HA4fDMcpriYmJ2LVrl9ljnzp1ymhu8JSUFOzevRvjx48Hj8cDj8fD+PHjsXv3bqOpfrKysvDjjz9i2LBhUCgU9cY/YcIEKBQKvPXWW9BoNCbrG1vfIm2PeoCTRktISMC0adMwceJEnDp1Clu3bsUDDzyAPn36GLZ59NFHsWHDBjz66KMYMGAAjh49amg5XtOGDRtw6NAhhIeHY/HixQgJCUF+fj4uXryIAwcOID8/v8F4+vbtCx6Ph7fffhtFRUUQiUQYM2YMnJ2dsXLlSqxduxYTJ07EtGnTEBMTg88//xwDBw5s1R+dgYGB+N///od169Zh+PDhuPfeeyESiXDu3Dm4u7tj/fr1UCqV7RYPIaRrWbhwId5//31MmDABixYtQnZ2NjZv3oyePXuiuLjYsN2jjz6K/Px8jBkzBp6enkhKSsInn3yCvn37okePHgCqhmkcNWoUwsLC4ODggPPnz2PHjh144okn6nz+8ePHG3qWP/bYYygtLcVXX30FZ2dnZGRktPn5E0JIXYYPH44ffvgBHA7HMCQ6j8fDkCFDsG/fPowaNQpCodCwfVvksxdffBHff/89Jk6ciKeffhoymQxffvklfHx8cOXKFcN2Q4YMgb29PebPn4+nnnoKHA4H33//PQ0hSUgnUlJSAk9PT9x3333o06cPbGxscODAAZw7d87QKy84OBgBAQF4/vnnkZaWBoVCgV9//bXV50utLlj/73//w5w5cyAQCDB16lSTOb5rcnd3x9tvv43ExER0794dP//8M6KiovDll19CIBAAAKZMmYKdO3finnvuweTJk5GQkIDNmzcjJCTE6MZlfQICAmBnZ4fNmzdDLpdDJpMhPDy8SXPSPvzww/jll1+wdOlSHDp0CEOHDoVOp8PNmzfxyy+/YN++fRgwYIDZfV944QXs2bMHU6ZMwYIFCxAWFoaysjJcvXoVO3bsQGJiIpycnBodS0OUSiUmTpyI7du3w87Ojhq/E9JGOnsObokpU6bg+++/h62tLUJCQnDq1CkcOHAAjo6OHTZmQkjn0Jjc2hJvvfUWpk+fjqFDh+KRRx5BQUEBPv30U4SGhhpdW06ePBnvv/8+Jk6ciAceeADZ2dn47LPPEBgYaPS7ulpoaCgmTJiAp556CiKRyNCwfO3atYZt3njjDezfvx/Dhg3DsmXLwOfz8cUXX0ClUuGdd95pMHaFQoFNmzbh4YcfRv/+/TFnzhwolUokJydj7969GDp0KD799NMWv0akFTBCGrB69WoGgEVHR7P77ruPyeVyZm9vz5544glWUVFhtG15eTlbtGgRs7W1ZXK5nM2ePZtlZ2czAGz16tVG22ZlZbHly5czLy8vJhAImKurKxs7diz78ssvDdscOnSIAWDbt283G9tXX33F/P39GY/HYwDYoUOHDOs+/fRTFhwczAQCAXNxcWGPP/44KygoaPT55uTk1Lmutm+++Yb169ePiUQiZm9vz0aOHMn2799vtE1z4yGEkPry0tatW5m/vz8TCoWsb9++bN++fWz+/PnMx8fHsM2OHTvY+PHjmbOzMxMKhczb25s99thjLCMjw7DNG2+8wQYNGsTs7OyYRCJhwcHB7M0332Rqtdokjpr27NnDevfuzcRiMfP19WVvv/02++abbxgAlpCQ0OqvBSGEVKsvN16/fp0BYD169DBa/sYbbzAA7LXXXjPZp7H5zMfHh02ePNlk/5EjR7KRI0caLbty5QobOXIkE4vFzMPDg61bt459/fXXJsc8ceIEGzx4MJNIJMzd3Z29+OKLbN++fSbXt4SQjkmlUrEXXniB9enTh8nlciaTyVifPn3Y559/brRddHQ0GzduHLOxsWFOTk5s8eLF7PLlywwAi4yMNGxn7poLAFu+fLnJc/v4+LD58+cbLVu3bh3z8PBgXC63wWuykSNHsp49e7Lz58+ziIgIJhaLmY+PD/v000+NttPr9eytt95iPj4+TCQSsX79+rE//vjD5LozISGBAWAbN240+3y7d+9mISEhjM/nG513dRy11T4+Y4yp1Wr29ttvs549exp+g4eFhbG1a9eyoqKiel+bkpIStnLlShYYGMiEQiFzcnJiQ4YMYe+++67hureuc6jr/kRkZCQDwM6dO2cS/y+//MIAsCVLlph9PQghLWcNOdjccc1db9aOo6CggD3yyCPM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nZ2N//znP0hPT8fOnTshFAqdy2ZmZuKmm27CggULMHfuXHz88ceYN28e0tLS0KtXr2b389tvv0VtbS3uu+8+BAYGYt++fXjrrbeQn5+Pb7/91hVdSQghjbTlGFtZWYnrr78et9xyC+bMmYNvvvkG9913H0QiEebPnw8A0Ov1+PDDDzFnzhzcc889MBgM+OijjzBx4kTs27cP/fr1a7Utt9xyC+Lj47Fq1SocOnQIH374IUJCQvDCCy+4swsIIaTFY+G1114Lh8OBHTt2YOrUqQDqBy7yeDxs377duY709HQYjUaMHDnS+VxbzyGfeeYZPPfcc7j++utx/fXX49ChQ5gwYQIsFkuDdtbW1mLUqFEoKCjAokWLEBMTg127dmHZsmUoKirC66+/3mD5L7/8EgaDAYsWLQLHcXjxxRcxc+ZMnDt3rsH5KyGk63HXce9yM2fOxJkzZ/DVV1/htddeQ1BQEAAgODgYixYtwvjx4xssv2HDBnzxxRcICQkBUD+IaNq0adixYwcWLlyInj174tixY3jttddw5swZrF+/vsH7//rrL3zzzTdYvHgxgoKCEBcX12S79u/fj127duHWW29FVFQUcnJy8M4772D06NE4efIkZDJZg+UffPBBaDQarFixAjk5OXj99dexePFifP31185l2nocJ4SQ1rR0fL7jjjvwz3/+E19//TUWL17sfI/FYsH//vc/zJo1q0Hmi4yMDMyZMweLFi3CPffcg+Tk5Ca3ee7cOaxfvx4333wz4uPjUVJSgvfeew+jRo3CyZMnERER4fb9JoR0PS2dK77zzjvo1asXpk2bBoFAgJ9++gn3338/HA4HHnjggQbraUs85rPPPmu0/aeffhqlpaVQKBQAgI0bN+LcuXO46667EBYWhhMnTuD999/HiRMnsGfPHnAc1+D9V3Mfk463nRwjxMXUajV74IEHmn197ty5LDY21vl4/fr1DAB77rnnGix30003MY7jWGZmJmOMsYyMDAaAvfXWWw2Wu//++5lCoWC1tbWMMca2b9/OALAvvviiwXIbNmxo9HxsbCwDwLZt2+Z8rrS0lInFYvbII484n9u8eTMDwDZv3ux87uL2Lrdq1SrGcRzLzc1tdv8JIaQjWjvGjho1igFgr7zyivM5s9nM+vXrx0JCQpjFYmGMMWaz2ZjZbG7w3srKShYaGsrmz5/f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umpnIrfeeiv3338/d9xxB+effz52ux1Jknj3u99d8N5brKWCIJxMk63PTqeTa6+9lgcffJDPfe5zPProo8RiMd73vvflvVex6+LXvvY1/uu//osPfehDfPnLX8blciHLMnfccYc4kxQE4aQ7evQol112GQsXLuTb3/42dXV16HQ6/va3v/Gd73wnb10qdq8Wj8d55zvfiV6v5+GHH0ajyQ1nXnfddbzyyit84hOfYOXKlVgsFtLpNG984xtnbI8o1tszmwiAC7OiqqqKW265hVtuuYX+/n5Wr17NV7/61YLBmYaGBp555hkCgUBOFfiBAweyPx/R1NTE+vXr+d3vfsdHP/pRHnvsMd761rei1+uzz2lubuaZZ57hwgsvLHrjOFW7d+/m0KFDPPDAA9x4443Zx//+97/PyucJgiCMNtka293dTSgUyqkCP3ToEACNjY0APProo8yZM4fHHnssJ+v885///Mn7IoIgCCdgorVw/fr16HQ6XnzxRV588UU+8YlPAHDJJZfw05/+lH/84x/ZP48odg85sjc9fPgwc+bMyT4+MDCQlzne3NxMMBjMVnwLgiCciJle9woZW4042osvvshdd93FHXfcwQ033JD38+bmZnbu3Mlll1024ftM1aOPPsoHPvAB/ud//if7WDQaxev1Tuv9prKOC4IgFGOye/Qbb7yRt7zlLWzZsoUHH3yQVatWsWTJkml/3qOPPsqll17Kz372s5zHvV4vpaWlJ/RdBEEQJlJoj/fnP/+ZWCzGn/70p5wq67Hjb6bqtttuY8eOHbzwwgtUVFTk/Mzj8fCPf/yDL37xi3zuc5/LPn748OET+syxxHp7ZhMt0IUZlUql8lo/lJeXU11dTSwWK/iaN73pTaRSKX7wgx/kPP6d73wHSZLygubXX389r776Kj//+c8ZHBzMaX8OmcyfVCrFl7/85bzPSiaT075JHm0kW2h0dpCqqnzve9874fcWBEEYT7FrbDKZ5N57783+OR6Pc++991JWVsaaNWuAwuvYpk2bsjMiBUEQTlfFrIUGg4F169bx29/+lvb29pxKyEgkwv/+7//S3NxMVVVV9j2K3UNefvnlaLVavv/97+esod/97nfzXnfdddexceNGnnrqqbyfeb1eksnklL+/IAjnntla9woZSaAce9/c09PDddddx0UXXcS3vvWtgq+97rrr6Orq4qc//WnezyKRCKFQqKjvO5aiKHmVOd///vdJpVLTer+prOOCIAgTKfYe/eqrr6a0tJRvfOMbPP/88wWrv6ei0Lr4yCOPZEdGCoIgzJZCe8VCZ4w+n4/7779/2p9z//33c++99/LDH/6Q9evX5/280GfCzO/nxHp7ZhMV4MKMCgQC1NbW8s53vpMVK1ZgsVh45pln2LJlS0629mhvfvObufTSS/nsZz9La2srK1as4Omnn+aPf/wjd9xxB83NzTnPv+6667jrrru46667cLlceRU1r3vd67j55pu555572LFjB1deeSVarZbDhw/zyCOP8L3vfY93vvOdJ/Q9Fy5cSHNzM3fddRddXV3YbDZ+//vfi2xxQRBmVbFrbHV1Nd/4xjdobW1l/vz5/O53v2PHjh3cd999aLVaAK699loee+wx3va2t3HNNdfQ0tLCT37yExYvXkwwGDxVX1EQBGFSxa6FF198MV//+tex2+0sW7YMyBxILliwgIMHD3LTTTflvG+xe8iysjLuuusu7rnnHq699lre9KY3sX37dp544om8DPBPfOIT/OlPf+Laa6/lpptuYs2aNYRCIXbv3s2jjz5Ka2uryBoXBGFSs7XuFTKSLPnZz36Wd7/73Wi1Wt785jdz2223MTAwwCc/+UkeeuihnNcsX76c5cuX8/73v5+HH36Yj3zkIzz77LNceOGFpFIpDhw4wMMPP8xTTz3F2rVrp/z9r732Wn71q19ht9tZvHgxGzdu5JlnnsmZPz4VU1nHBUEQJlLs+qzVann3u9/ND37wAxRF4T3vec8Jfe61117Ll770JT74wQ9ywQUXsHv3bh588MGcrhaCIAizodBe8ZJLLkGn0/HmN7+Zm2++mWAwyE9/+lPKy8vp6emZ8mcMDg5yyy23sHjxYvR6Pb/+9a9zfv62t70Nm83GJZdcwje/+U0SiQQ1NTU8/fTTtLS0zMj3HCHW2zObCIALM8pkMnHLLbfw9NNP89hjj5FOp5k7dy4/+tGP+Pd///eCr5FlmT/96U987nOf43e/+x33338/jY2NfOtb3+LjH/943vNra2u54IILePnll/m3f/u3bDBntJ/85CesWbOGe++9l8985jNoNBoaGxt53/vex4UXXnjC31Or1fLnP/+Z2267jXvuuQeDwcDb3vY2PvrRj7JixYoTfn9BEIRCil1jnU4nDzzwALfeeis//elPqaio4Ac/+AEf/vCHs8+56aab6O3t5d577+Wpp55i8eLF/PrXv+aRRx7hueeeOwXfThAEoTjFroUjgaALLrgAWZZzHj948GDBObjF7iG/8pWvYDAY+MlPfsKzzz7Lhg0bePrpp7nmmmvyrvX555/na1/7Go888gi//OUvsdlszJ8/ny9+8YvY7fZZ+BsSBOFsM5vr3ljr1q3jy1/+Mj/5yU948sknSafTtLS0MDAwQCqV4mMf+1jeaz7/+c+zfPlyZFnmD3/4A9/5znf45S9/yeOPP47JZGLOnDncfvvtzJ8/f1rf/3vf+x6KovDggw8SjUa58MILeeaZZ7jqqqum9X5Q/DouCIIwkamcg95444384Ac/4LLLLpu0G8dkPvOZzxAKhfjNb37D7373O1avXs1f//pXPv3pT5/Q+wqCIExmvL3io48+yn/+539y1113UVlZyb//+79TVlbGhz70oSl/RjAYJBqNsm/fPt7//vfn/bylpQWz2cxvfvMbbr31Vn74wx+iqipXXnklTzzxBNXV1TPxVQGx3p7pJHWiCe+CIAiCIJxRXv/61zM4OMiePXtO9aUIgiAIgiAIgiAIggDs3LmTlStX8stf/rJgQEcQBEEQhJklZoALgiAIgiAIgiAIgiAIgiAIwiz56U9/isVi4e1vf/upvhRBEARBOCeIFuiCIAiCIAiCIAiCIAiCIAiCMMP+/Oc/s2/fPu677z4++tGPYjabT/UlCYIgCMI5QQTABUEQBEEQBEEQBEEQBEEQBGGG3XrrrfT19fGmN72JL37xi6f6cgRBEAThnCFmgAuCIAiCIAiCIAiCIAiCIAiCIAiCIAhnBTEDXBAEQRAEQRAEQRAEQRAEQRAEQRAEQTgriAC4IAiCIAiCIAiCIAiCIAiCIAiCIAiCcFY4Z2aAp9Npuru7sVqtSJJ0qi9HEIQToKoqgUCA6upqZFnk8cwGsWYKwtlDrJmzT6yZgnB2Eevm7BJrpiCcXcSaObvEmikIZxexZs4usWYKwtnlRNfMcyYA3t3dTV1d3am+DEEQZlBHRwe1tbWn+jLOSmLNFISzj1gzZ49YMwXh7CTWzdkh1kxBODuJNXN2iDVTEM5OYs2cHWLNFISz03TXzHMmAG61WoHMX5TNZjvFVyMIwonw+/3U1dVl/10LM0+smYJw9hBr5uwTa6YgnF3Eujm7xJopCGcXsWbOLrFmCsLZRayZs0usmYJwdjnRNfOcCYCPtLyw2Wxi8ROEs4RoZTN7xJp5ekinVfZ2+6lyGDjSH2B9YwmSJP63L0yP+N/N7BFrpiCcncS6OTvEmikIZyexZs4OsWYKwtlJrJmzQ6yZgnB2mu6aec4EwAXhXNU+FGZTyxBzysw0l1mQkPBHEwRjCfyRJIFoEn80QSCaJBhLcn5zCavrnaf6sgXhnPfswX4+9eguLHoNvf4ozWUW3KE4qbTK/7tkDh+6qGnK7xmOJ9nX7Wdto2sWrlgQBEEQBEEQBEEQBEEQBEEQTj0RABeEs1Ayleb5QwP8cmMbLxweQFUzj1fZDfT4ogBoZIlV9Q7ah8L0BWLZ1yqyxJfesoRrl1VjM2pERqIgnGRb2zz86Nkj/ONAPwD9gRguk5YDvX4Sqcw/5i/9ZR/t7jCLqqw4TToGg3HC8SQGrUJ/IEad00g0mSYYTXJsIEit00SvP8r+Hj87Ory8Z309FzSXkEilaSgxUWk3UuMwnsqvLQiCcNaLJVM8/FonP/znEXyRBJV2A29eXsUdl89HlsV+SxAEYcSR/gBv/eEr2I1afvmv60mk0hzpD3Lt8upTfWmCIAhCkRKpNHc9spPXLyhjXaOLWqfpVF+SIAgnaE+Xj9ahEA+80kp/IIZWkaf1Pg0uE23u8KTPm19h4bbL5rGwUlTzC9MjAuCCcJZ46fAgT+/r5VBfgAO9ATSyxGAwTq3DSLXTSCqtYtLK2AwaDvYFSaZVtrR60MgSa+qdDIVitA6FSaVVHny1jc8+voeHbz6f9U2iUlQQTqa93T6ODYZyHptTbuG1Vk/OY794pRWLTmFVvZMXjwxO6TN+u7md325uB0CnkYkn06xvdFHnMtFcbqbErOOC5lLqXPk3qIFogsP9QTYdc9Pnj1JlN/D7bZ04TDq++talNJdZcgI5R/oD9AdizK+wUmrRT+k6BUEQziZ6jcJ719fzq42t9PqjtAyG+N9/HuH/XmrhTcuquOmCRpbW2E/1ZQqCIJx0qbTKrza20u6O0O4OcaA3QDCW6VD2z/39bGv38MSeXlJplXWNLqpF4qYgCMJpzRuOc+fvdvDswQH+uKMbp0nLLz+0gWW1Yq8rCGeyoVCcj/5m+wm/j1aRONIfnPR5R/qDPLmnl+vW1vGxK+dTbjWc8GcL5xYRABeEs4Cqqnz77wfZ1u7NPqbXSCyptnGwN0CnNwLA+kYXB/uCrG1w8lpbJpiWTKtsbc8EwpfW2NjT5cdq0NJUamZ1veMUfBtBODckU2m6vVHqS0xE4ikO9QV4fHsXHe4wq+octAwHwdc3utjW7in4HvUl5ikHv8eKJ9MAbG51s7nVnfMzo1ahwqrHZtQiyxKhWJJ2d5jY8GvGuuI7L2A1aFhea+eNSyppHQrz85dbUFUotegpteh43YIyPnB+A9UOE6qqoqpwsC/AC4cGWFRl45L5ZSf0fQRBEE6mVFolmkhh1k9+W9U6GOKbTx3gUF/ujX44nuLRrZ08urWTi+eVctWSSi5dWE613SA68QiCcE74/j8P891nDhf82Vf/tj/7n29/aAd2o5bn7no9TrPuZF2eIAiCUAR/NMH+7kzXuftfziR8jvCEEyTShc8RBEE4c7xufllOXGG6ksMdLouRVuGhLR38aWc3H3ldM/92cRMmnQhrCsUR/0sRhLOAJEmEYqmcx1xmHXu7/TmPjWw2X2vzsLreQSCW5PDwIWwyrWLSZpaELm+E/33PSjTTbGMiCMLE+gNRbv3Ndja1uGkoMdHliZBMF978Hej1j/uzfT1+NjS52NTiLvjz6dDKEpUOAx3uCMtq7PgiCXZ1+Yp67cJKKwatQpcnwuf+tDc7fgFgMBhjMBij2xvhsa1dJNNpJElClmAwGMdl1tFcZuYnzx9lfoUVo07hjsvnodcoM/bdBEEQZtKDm9r44p/2kVJVLpxbSqlZRyyVxmbQsKjKxqIqG/PLrdhNWlJplUN9AbaPSlYs5MXDg7x4OJPYtL7JxflzSjDrFeaUWmgqM9NcZjkJ30wQBOHkSKVVXjg0wAOvtBb9mretqskGvx/d2slQMMabllUV7FwkCIIgFKaqKm1DYVqGQnR7IxEM62EAAQAASURBVPT5opRa9cwttzC33EKZRT9uIqaqqvT6o+zr9rO328++bj/7evy0T9LO+OXDg6yud87G1xEE4ST6zYfP43v/OMQPnz16Qu9j1ikoioRGkpBlCV8kkR39WEg4nuLbfz/Eg5va+MRVC3n7qhoxSkyYlAiAC8JZIBhLoKJS7zLS7s5Ue9sMWnp8x2d71ziNHOg5HhDf1u5lWc3x+Rkusw5FhtX1Di6aW8rqetH6XBBm2kAgxl2P7GRbu4dANAlA29D4N4l2oyb7vPFsanGzvslJMqXmdIGYKglYVe+gdSjEgD9Gg8uYVxE+3jXOr7ACYNFr8EUSyJLEBXNK8EeTDIVidHuPZ34vqrIVDNhLwJbhNu+vHB2iwqbn9svmkU6rYkMrCMJpSZYk4qlMcuELhwbGfV65VU9TqZn9PX78k6zpo21ucbN5zHpZYdPzzjW1fOjCJkrEWAlBEM5wH/j5Zl4qopvRggoLDpOOYCzJAxtbaSo1I0vwnWcO4w7FueeJA3z8ivl89A1zRecMQRCECUQTKf64o4ufv9TKwb7AuM9zmLRcOLcUh1FLJJEilkgTSaQIxpIc6Q/iDsWn/NmDwdjkTxIE4bSn08jcsKGBX7zcSiiemvwFo2hkWFlXuILcqtfgMin0BSZeK/r8mbPVn7/Uwn9es4gL5pZO6RqEc4sIgAvCWWAgEM+201zX6GQwGMcbiXPxvFJiiRSSJNHpCRNJ5LYb0g5XeFfbDSiKxMZjmUPWYCzJHZfPF0EnQZhhn318N89PECQZyxdJUmkz5LQOK0RV4fCY2Tk2o4Z5ZVaCsQRGnQadRmJfl59gPMWqegeplIqKil6jMBiMMRSM5wTQHWZdpjOEToPDpOVQXwBf5HjgxqxTWFxtY1+3Pxu4Hs2i1xBLpqh2GCk164kmU5h1GtrHBPy1ikRjqTnbjWLE5Ysq+PJf9rGg0sqViyuptIs5P4IgnDrd3giVNkN2b6SqatEHf/2BGP2T3MQXq88f44fPHmVnh4/3bqjnTcuqZuR9BUEQTgXLBOMjZCnT8nJdo5PdXT4O9gVZ3+RCVeHzf9qbfd4FzS76A3Ha3WG6fVFqxswH7/ZG+P4/jzAUjOE06XCadThNWpwmHVpNZk0/f06p2GsKgnDW8obj3P9yK9vaPezq9OGLJIp4TYK/7uqZkc/XKhJf/JelvGd93Yy8nyAIp161w8jliyv4447uol/jNGkptxnGbZ9uM2pRKb41+r4eP+/9v01ctrCcu9+0iLnloluakE8EwAXhLKDXHG9VPjoQ5Q4NTdg6pMMTYX2Ti6P9QYZ8xw9xD/UF+evuHt68onp2LlgQzkGqqqLTyNQ6jXR6IkW/zmXWThoA397uYW2Di0P9QcqtelKqSiqtsnXM7HCbQcPSGtukLXglIJpI0zWqcrvcqmd9oy1bFb6g0oonnCiY7bmyzo47lKDSbsipXqxxGqlxGqkvMdHji1Jp0xOKp/LGNQA8uKk9+58/98e9zCkz8y8rqjFqFS6ZX8qiKvuE30EQBOFEDQVj/GN/P0/s6eHZgwPYDBrWNDhZ1+TicF+Qx7d3nbJre+nIIC8dGeSKxRV84PxGLponst4FQTjz/OiG1Tx3qJ+fPH+MQ30BLplXxvXr6phbbqHUoufYQJDPPL6b6HAi9/4eP+saM52PZAkSKZWNx9wsqbLxyNZO/rCji9fNL6PCZiAYS3J0IMj+ngCpccYJjaiw6WksMWPQKswpM3PZwgounFsiqskFQTijRRMpfvFKKz969siUuhDNJLtRy73vX8N5c0pOyecLgjB75Cnsk5pKzYRiSQ72Fu48odPIuEOxvOK9YvzjQD/d3ghrG13ccfk80SlNyCEC4IJwmkunVQaDMYKxJCVmPXaTNu851Q4j6xtdOe2KNTIosjRuALzeZcKsV/Jaa474+MM7KbPqxSZVEGaIJEn877tX8bOXWvjq3/ZTZTfQ48sPbC+rsWHUakACs1bh2SIqxpNpSAOecHzCikR/NMmervxg81jrmlx5a0N/IEYilWZRlZW2wRC7u3ysGmd+l04jYzNq8t6jyxOhazj4X2rRsbl14hlhox0bCPHdZw6zocnFLze28amrF/KGheUoksTLRwa5aF4pBu3488JDsSQPbmpjXoWVC5tL0Y1KHBIEQRhr07Ehbvi/TSRHBU380STPHhzg2YPFd/KYbYlUmtUNjlN9GYIgCDlUVcUbTtDtizAYjOMwallQac3bq8myxBsWVvCGhRUAHOkPMhSMUWLWocgSX/rLvpy9ayCazCZ8l1v1+KMJDBqFWDJzWJpIqTyzv3/K19vnj9Hnz3TqeP7QAPe/3EpzmZkbz2/k7atrsBry78EFQRBGiyVTPPJaJ3/c0UWnJ0K5zcCaeifrm1ysb3LhMutOynWoqsrh/iAvHxnk3uePTZpMP5vqXSZ+ftM6UZUpCGep/kBx68vKOgcHewNEEuO3S9fIEourbEgSBbtMTiYUT/GrV9v4w/Yubrl0Lh+8sHHCM0Lh3CEC4IJwCrQPhXlkawer652U2/RU2Ay4TLpsW83BYIyXDg/yytFB/nmgn8Hg8YBWhU3Pm5ZV8S8rqllZ58hmpf/3u1bww2eP8LvXOoBM8Ntu1BJNFG65qVUk9veMP+8nnkrz4Qde49oVVdzz9uUz9dUF4ZwmyxJXLamkqdTM1588AGQCwfUuExpZIhRPsq/bz0jeSplFz8JKKwfGyZAEsOgVllTb2dbuQS2+U9CE/OO0RIsm09gNWqodRjSKPG4CzeYWD5V2AyvrHPT6wpj0Wgb8MRZWWbMb2TmlFgaDk88YH6FIsLTGwaG+AJ5wgtt+ux27UUs4niSRUrHqNfzPdSu4bFEFh/sDDAXjLK2xo8gSFr0GdyjO1/6W+TvXa2TqXSb+9aImFlXZqLAZRNtLQRCyPKE4n/z9rpzg9+mq3R1Gp4iEHkEQps4bjhOKp/Jaho+IxFMYtPKUqqCjiRTPHezn8e1dPLW3L+dnWkXiz7dexMJKW97rgrEk//bAFl4dHsl1+aJyvv+eVYRjqXEPSxtLzXR7Ishy/iigmXB0IMTn/7SXbz55gLevruXG8xuYV2Gd8c8RBOHk2Nzipssb5uJ5ZZTOYHVg21CIv+7u4dcb2+geleDe44uys8PLz19uQZbgX1ZU89W3LcM8weiHExFNpHhiTw8/evborKyJU7Wmwcl9718jKjEF4Sz21pU1vHxkaMLnbGhysWmcs8PRltXY6R21hk61e2Z0eL8YiCX5xpMH+PWrbXzyjQv4lxXVoqPPOU4EwAXhFDg2GOT7/zyS85hGlnCYdCRS6ew8nkqbnjllFnxhD4nhQ9g+f4z7X27l/pdbqXeZuGJxBYuqbJRYdHzxLUuIJlP8cUc3saSKNxxneY0dScoE1XUahVQ6TYlZh14rc3QgNOF1BmJJfru5g6ZSMw6TjguaS6h1mmbnL0UQzhH1JSY+8/hu0mmVL71lCT9/qSVn9vZoA8EYjaUT/5urdZqK2kxOhVlXeHswr9zCq0V+Vq8vSr3LRGOpBV84TnOZmXgyzdIaG0atQt8UMtGX19hJDnfDGB2cHz27LBBL8v9+tRWdIhNPZaqAnCYt8eGKIJXjG+9YMs3h/iCffmw3AFaDhr/ddjF1LrG+CcK57KHN7ezu8vHknl6GipzvfaqtqXcyGIxTbtVnEykFQRAK6fdHeXpfH68eG2Jnp5cOd4RvvnM5163Nn8naPhTm3fdtJJxIYdZpMGhlvva2ZWyYoDvY9nYPH/7lVgaDhROwEymVd/54I2sbncwts6DTyEgS6DUKLx4eyKn26fFFefuPXmH/BEmgm1vcyBIsrLSyttHJ9jYPE0z/mraRiqJfvdrGBc0l3Hh+I5cvKkcjko8E4YwRS6b43B/3ZBPLl9bYmFdupaHExE0XNOIwFV+d7Y8mONwXYE+Xn7/s6i6qUjGtwh92dHOoL8jPPrCWqnESj6ZCVVX6/DGeO9jPM/v7eenIQHZcxKl27fIq/vtdK0T1pSCc5SYarbCoykqpRc+LhweLeq9t7R4ubC5hIBhnSbWNvd1+NjS5iKfSaGSJA70BAhN8Xp3TSH/g+B60yxvh9od28POXW/nPaxaxrtFV/BcTzioiAC4IsyyaSHGoL4A/ksRp1pJIqfzsxZac5yyptqGq0OeP5gR0DNpMi/LGEhMus47t7V5G39O3u8NsPDrEbza1EUmkaSgx8ZaVNdmfx5Iqu7p8lJh1OQe57e4IZp2CWacUnN87Yl2jk6P9QR5+rZMj/UGseg1b/+sK0TpYEE7QrW+Yy4JKK794pZXWodw24NV2A1UOA6iZimtZAkli3OruUouOplIzQ8HYjM31SlP4w/RT+Ldf5zJmK8RlKZO9adFrMWhltLJEu7u49ucbmlxsbfOQTKvYjdpJDzZHgt8AnnBuJbs/WriyPRBN8lqbmzqXiXA8iQQYdRpUVRWZooJwjnlsW9eErdlONyMzb79z/UquXV59qi9HEITTUJ8/ynf+fojWoTC7OjyEE2l0isw1y6pY0+BEVVWCsSTtQ2FahkLs7fbzm03t+CIJLDqFrnCm+ubzf9rL/AIV0MFYkmMDQdrc4Um7EQVjSZ47OMBzw6Mk1jY4ea0tP3jU7Y2g10weOEmrsG+4q1mDy0RbkfvL6Xrl6BCvHB2i2m7ghvMaePe6OlHdKAhngCP9wZyuanu6/NnxCn/a0c0/73r9hK+PxFP8+tU2fvdaB0dOoLp6X4+fzzy+mwvnlrK20YVJpxCJZzpd9PgiOEw6NjS5MI1KSI8lU7QNhTnWH+ToYIijA0GODWT+/0TBoFPlo5fO5WNXzBeJmYJwFhsZdXN0ILMe1jqM2IxaQvEkFVYDA8EYsUSaHe1eDBqZaHLy5JxESmVPtx9/NJktZBld7GPRa1hWY2P3OGMdfeOc9+3s8PKun2zk6qWVfPrqhTSUmKf6dYUznAiAC8Is+sP2Lv7zD3sIxnI3pavqHdn/vLzWzq5OH5CZm1vrMNLpzRwyuMw6WofC2f8zahXmV1gwaBVUFRKpFNs7fNn3ahsK89MXj3H+nBKGQjEO9WV+EXnCceqcRjpGtQ4JxVMsrrIhS5lN+EiXT6teIRBLsaTals1k9YQTLK+1c/6cEtIz1WNZEM5hG+aUcKQ/wL5uP5fML+PFwwPZA0ODVmFrmzfn+VV2A/UuE+5QHKNOwaBV8IUTaBWJ11o9RJNpah3GGQuAJwpsTkstOgYChSt6CulwRyi16BgMxkmrmcQbOL4GyRKsqnOgUWT2d/sIxPIDTnNKzezp8tFUaqbPHyUQTdBYYqLLGyExjRKfidrN/XVXL5uOufnngX4aS0yY9Bpu2FDPpQvKeWZ/H0OhOG9YWE6VPZOtv7fbx/6eAH/Z1c1QMM41y6t468oa0UpdEM5g715fz7JaO9f870un+lKm5MtvWSqC34IgjOtQX4C/7OrJ3pMuqbbhiyQYDMa4/t6NeMOJ7MiHUouO5jILvkgie5+6vtHJ5lYPB3oDE47lmar1jS42txbuLJRJYix8kDkefzTB2gYn7lCcY4MTdzqbTJ3TSIXNgCJLBTstdfuifOupg3zvmcPceH4D/3nt4hP6PEEQZtdTe3rH/Zk3kuBIf5C/7OpGkSSODARxmXXMKTVT6zLROhjix88dzaksnK4NTS6GgnG+8tf94z5Hq0isrHNg0Cq0u8N0uMOk1cy98/YO7wlfw2zRyBL3vH0Z7yrQVUQQhLNHjy/CB+/fwsG+QPYc02HWZpOK2sYU+SyvtdPvj9Lrn3wNHQzGWd/kKjhuMRhLsrvLz/omFz3eCL5oAlmSGCnT8YYn3jc+saeXZ/b3ceP5jdz6hrlT6vwhnNlEAFw460UTKfZ0+dje7mV3lw+NLFFu02PWaXCYdThNWpwmHS6TDrtJi0GrEE2kiCYyWZjRRJpYIkU0mSKRTBOKH3+8xJxpC15uyw94BKIJfv5yS17wG2B3p4/z57hIplV6R7UBjifTDIXiLKy0YjNq0coS65ucbGvzkkyrRBKpTAWjBL3eaMH3dhg1tHvC9HgjbGhysavTSySRhgLJl/t6/Og1EmsbnBwdCKHTyMQSKS5sdqBRjr+gocTEr/51A3ajdpr/LQiCMNbccisXzy/jZy8eY0HF8TnfTrMOxhza9fii9PhyW4brNRIOoy6bSdk5/G9+Ou3Q9RqJWFKlxmGgwmZkW3t+Jc5gME5zmSWvYn0888otE84eS6tkW7+bdApLq23s6c7N5Cyz6jk2GMq+j14jY9JpWFnnKKrVXN53mODQ4pn9x+dUahWJOWUWfv1qGz969khOotH1a+sIxpO8cGggJ+N+d5ePl48M8u+vb+aC5tIpX5sgCKde62CI32/tOtWXMWVf+9t+ap0mLpon1h5BONPNdPeZSDzFL15pzblv3Du83yo0V3EwGCcY87Ki1s6ursz+Z3Orh7WNTl6bxt5rPKvrHeMGv6fLE07wWpuHdY3OogPgFVY9A8FYNhkcMgnhDpOW/kCMXn80myBu0sosq3UQiiU52BdgTqkFu1HL1nYPh/sCYj64IJzGJhr/5w7Fufzbz5+U69jV6St4NjdaIqUWvNdtHQrlFbacauVWPfMrrMyvsPL21TUsrbGf6ksSBGGW/frVtuz5pUaGVfXOCc/ndnX6MGoVNjS56PVFJ+3Ws7nFzbrG8d+zUHBclsjZy40nkVL52UstPLq1k1vfMJcbz28UXW7PASIALpzV/nmgj3//9TZiY6oZCy2koyuxxzNeq43r1tZy15ULsoHwaCLFT547yr5uH3NKzbjMOmRZQlUzG9lkWqXdHaHbF8lrExdJpFBVNWdBX1XvYHu7lxqHkR5flJbBMI0lJnQamVA8d/MrIdE1vCHe1OLGatCwodaBIkl0uHOfu6beQa8/xuZRfxdLqm28fHQIgPVNLra1uSm16NnR4eV188sm/PsRBGFq6l0myqz6nPVof49/woqYEbGkSt9wQFcrS6wc7iyxpsFJJJ4ikUqjUST290xcqVPrMNJYamJvt58eXxTTBFXSQ6E4ikRR8xVNuuLnfYXjKfZ0+1laY6PfH6M/EEOWMkHl0fQamcP9AZZUTe/GutyqnzSAbzdq8EeT2TlFS6pzDzN/91pHwdetqLXzwQsbC7YGFQTh9BaMJfncH/bw2PYzL/gNmdlr7/vZJm59w1w+fuWCU305giBM0wOvtPL9fx7GbtQyv8JKMJakyxvBqFU4b04JDqOWD18yp6iZqj989ggaWcrexzlNWsqteg4Odwgrs+hpKDGhDLeo3dfjzyb2RRNpdo65L97a5mFDk4twPDlu68mpmK352UadQrc3Pzi0ut6BP5oklkxRataj1cioqsqR/iA1DiNVDiPRRAp3MI5BJ6NRZHyRBPFkmkqbiYVVeg71BdnU4s4elB7sO77Hfu//beL/blzL8lq7GJ8jCKeZZCqdbdN7qkUSKWocRrriUw9ie8IJQvEULrMWWZKYU2qmyxulq8CaNxv0Gpnr19Uxr8LK/HIL8yusmeR9QRDOKaM7Q1bYjOwoojNFJJFiU4ubVfWOosbVbGn1ZDsQFaPOObUxOL5Igq/8dT+/erWNT79xIW9cWin2b2cxEQAXzmjptIokQSiW5Km9fbxwaICXjgzwg/euIRhLcsuDWwu2yR0JtIy056h1GpGlTBu2vd2+vLnYLpOO5nJzTrX2aA+/1sn2Di8NLjPRRIoDvX4Gg3HmVVg43BfMyUCvcxnRyDItg6FxWxiNDUB5QnGWVtsotejpP5q5BqdJV/C12uEb8pEZG4Fokk5PhFQ6nW29HogkMBs0bG3Pf/3ebn+23cjmFjdrG5x0uMN84OebWd/o4n3nN/DGJZUiQ0oQTlCXN8I9f9ufzZwcabN2QXMJPf5o0VUxsgRLauzjZkdWWPVYDBq0ioxJp6BRZCQyme6+SJwSi46Xjgxln59IprEaNAXniR3pD7Ku0Um3N0KXt/B6OOLYYIiFlVZaB0M4zVoMWg0tgyGWVFvRaRS0ikw0nmJvt4+UCourrEhAajhtM61CU6k5W6UEmSCPQSujKNPbmMaLiNwHoknKbYacQ+D1TS7SaZV4Kj1uopQ7HKfGYaJUzIEUhDPKkf4AN/9q64SVQWeKC+eKCnBBOJOtaXAyGIwzGIznrUl7u/2877z6ooLfI+/1tb/tZ1enjzKLnjKbntSozOtkOk1/IEb78GHhvHILgej4ASJVzSRXl1p0LKq0crg/QBHjHMd1uC+Aw6SdtF3lVEXiKSqrbHn71F5/FJdZx5H+YF5SuCecmLCist0dzv49Adm5lC6TluZyC5Ik0eEO89Yfvkx9iYn/eP1c3rmmVsy/FYTTxGttnhkd33CiquyGaQet48k07uE1aDAYR5ag3mmk/SRUhX/uzYu5YUPDrH+OIAint9FnYl3eCBfPK80WkExme7t3wupugPkVFmRJYnd38QmXZTb9lALgI9qGwvz7g9u4ekklH7m0mRW1jim/h3D6EwFw4Yz1l13d3P3YbqKJVKaFuVnHgd4AtU4j//30QTrc4XFnxEbiqew87VRapWUwlG0BN3bWRIPLxFAonrc4a2WJxHCgxqRT6HKHOdyXe2igkSVqncac9nId7ggus5bz57iQJYkFFdac7PGR6xttdMXiwkorrUMhdnR6uXRBGR3uMEeGD0hqnUYaS8w4jFpah8Isr3Ugy5nDClWFZFpFr5EZCMRYXG1jVZ2DHR1eRv6WllRbMWg12PUaapxGbAYNkUSKOpeJ+hITm1vdbG7NBMV/9a8bME6hwlMQhFyReJIDvQGaSs18853LWVnnQDtcDROIJhgMxHj24MCE71Fu1eMJxYkmUug1MolUOq/tT18glq0UH2tFrR2bQZPTrlyRpYLB7xFbWj0sq7Fj1Ckc6R8/YBSIZr7f6+eX0e2LDI+a0LK/N0B4eI3Ta2TKrHp6/THsRi09vihDoXj2PQqdGy6tsbOjQIv2yVQ7DHkV5QWfZzfSHzz+93V0IJRzCL22wclrbfmf3+GO8OjWDj57jZgBKQhngsFgjJ88d5TfbG7PrklnKkWWuGZZFQtEBwpBOGN5w3H+trtnwudsOubm6b29bJhTkh1NlUyl6fFFSaVVdBoJjSyzq9PLvS8cQzO8kRoIxhgYtbcxaGRqHEb29WQOFo06hXZ3cUlAmYCLxJqG6Y3dGeEJJ7JdzmZalydCtcNA93AQ3KpXcJp06Gag6rzGYaDGYSQUT3GwN8ChvgCqqrKw0s6CSguvHh3ik7/fxfomF42l5hP+PEEQTtzKOgeNJaaiR3nNJptBQ6dn5q7DrFNwmHWzHgBf3+jiPevqZ/UzBEE4M3zrnSvY0urmd1s6cJq1vHR4kHqXKSdZcCKH+oJU2vTjzgS3GbQFz9wKWdfozCYiTofTpKW5zMITe3t5/vAAVy+t4s4r5lHrNE3r/YTTkwiAC2ek11rd3P7QjmylYH8g0zJ3JIuo0xOh0mYYt2U5ZFp2jN4AS8MV4NvHBFZsRk1eFpFeIxFPqThNWuaUWYgmkph1Gtrd4ZwFfH9PgFV1jrz5au5Qgo3Hjh8YrKl30uWL0OuLokiZVhzjOdAboMKqJ5FS6Q/E0CgyWiUTaG8ZDOd81uZWNwsqrNk264PBOMtr7XR5o+wYnml7ybwSdnT48EeTyJIMKmxuc+OLJGlodvHK0cx1WvUayq16+gMxXmvz8O8PbuW+968VleCCME0VNgO3XzaP/7h0bt6/o88+vodnDw6gkSUaSkzoNQpaRWJvt5/k8Lqn08g8/h8XkkimSaVVVMAXiRNPqnzjyQNFtSEaaW+5vsmZfUyryKxvcvFaq5umUnPBqsg+f5Rap3HC99ZpZFbU2nnu0PhB/FgyDZLEmobM57cOhXGZdcwttyCRqTgf67VWT/Y529rcRVcfOYy67EHoRMqsejrHycivH06IGo9omSQIZ45YIsULhwdIpk6ghPE0sbzWzv++Z9WpvgxBEKbplge38uSe3klnFx7uD/L/frUVSYL3rq+nPxDj5SOD2SSeOaVmyix6Euk0kiRlEytHVFj1lFp1dHqi7On2I0mZvU2l3VBwnmIhzWVmosk0u7p8uExa3CdQwb293cvqegfbZjgIHk+liUczfyeKBPUluR2Fpspq0GA3ajFqFYZC8Ww7TrtRg1mvodZppMMdQgKiyeP7dEEQTg8GrcKnr17ER369FQCTViacOPn7v8VVNgKxRF4XihMxt9zC9g5fUSPUTsSX3rpEdLUQBAGAZbV2ltXa+cAFjVz49X+iUSRCsfGLaMaKJ9PEEuMnoCtTWGtkSTqhhMxqhzEbbA/HU/x+Wyd/3tXN/TetE93VziKzGgD/+te/zt13383tt9/Od7/73ezjGzdu5LOf/SybNm1CURRWrlzJU089hdFY+DD9C1/4Al/84hdzHluwYAEHDhyYzcsXTlPptMpnHt+dDX6PtqPDy4amTDZ6rz9Krz+a11rDoldYXGUDSaLTE8kGk8qterYOB1MMGplltXZ6fFEiiXReFffyWgdbWj14wgm2jspKWt/oystgGgzGcqorC9na7kEavoZoMkW9y0SPb/xATV8ghlErc6A3QCqtYjNq8EcK/7IZCuVez65OHyvq7Bi1Cu5QnBcOD9FYkplDHIjEaR21GfdFkswtt2TaxfUF6B9VRfrcwQE+8uutfPVtS6myTxwIEwQhn9Wg5c4r5hf82e2Xz6OhxMQNGxooseiyB5jPHuin3KYnnkwzr8KKZZx53WsanEUFwCGz3iVHdcsYaQ+3sNLKgd5MEk80mSIUS+Iy6dEoErLEuLN47EYt5TY9iiRN2NZoRK8vSq8vitWgQZEyrdknO4Qdec5krZNGrG/KT24aa1GVlXAsmVMhNZokQaXdUHCupMus42tvW8oViysnvRZBEE4NVVWJJtL0+aO8eGSQ5w/2c7g/iEQmoFNq0dPri9A2g4eSJ8vebj/PHujnvDklojuPIJxB2ofC3P34Ll4eNYqmGKoKD25qz3v82GCIY4MhrHoN1Q4jkqRmkwxVVeXoQIi93cc7jzW4MhWRk1XsWHQK5TYDPf5oTmKkDEXvxQqZU2rOub+cKd5wnHWNLra0uFleV3yV+YpaO7FkmmAsObz3Vun1RbHolbyEdoAl1XZ6fVECkSR9/lg2geH6tXVUO8T9sSCcTq5aUsHDN5/H7Q/tIJpI4bLoC/67nilmnYLTrMNp0mHQyngjiWzXjZmkyJlzgtfa3LMWBLcZNCystM34+wqCcGZTZIl5FRY0gxIOo3bCYhHIdORJplXWNzl5/lDhlumyBB1T6JIx+ZDDiSmyhN2ozSlEjCfTvHpsSATAzyKzFgDfsmUL9957L8uXL895fOPGjbzxjW/k7rvv5vvf/z4ajYadO3ciyxNnyC5ZsoRnnnkm+2eNRhSvn6ue3teLN5yg3JoJxLhMOvYMZ3QnUmpe1pFRq1Bp01NlN5JWVbq8kWzgZk6pmYFgjEA0SUOJmT5/jOW1dloGQjk38qUWHSuH24WPt6m06hVSanr4M2UWV9sJxTItgOsmqZSEzKLdH4jRXGrKVKOPacU+ornMnG33vqTaymttHkLRJBfOLWV7h5dANIlFr2FhlTUTHDdo2N7uxT+qpfHODh9zSs3Z2eStQ2HqnEacJh1r6vXZ2eClFj0lZh3BWBKTXoPFoM05IPnngX7e8N/P8+W3LuWda2on/Y6CIBSnuczCx69ckPf4pQvLi3p962CIxhIT3d4o8UmqGx0mbd74BjgeCN8+KpDePhwYWl3vGPe9yiz6gu83mUA0ydwyc3akQzH2dPvZMLxWFtr42owanCZdUVVNqbQ6YeBLVWFzixujVmFlnZ2BQJxap5F1jS4+fPEc7CZt0dctCMLJ9fGHd/KHHV0FkydVckcdVA+3t1VVGArFaRk8/WeDx5NpPviLLaysc/Drf9swbnKUIAinj2AsyXv/79VsAMaoVXCYtMyvsLLx6NCk+7eJBGJJOjxhKmx6TDoVjSKjqpBI5o/Z2tDkQkUlrUKvN5rtgiNLsLreSTKtsq/Hn71vHC0UT51QFw2TTkFJzXxFYXp4XvmKWnvRwe+mUjMtg6Gce2bIJIr2+GLUOI3UOoy4QzEO94fQa2ReOZqfuHDbZfO48/J5M/E1hDPEj3/8Y3784x/T2toKZM4uP/e5z3H11VdnnzPVIiDhxEUTKYKxJKFYkr3dfipseoaCcfoDMVJpFathdu7d5pVnxiweGwwRikdmNcgOZM/n0irZcYU7OjxFd0krRp1LtAIWBCFXy2CIe/62n41Hh0imVayGie8/F1Za6PRkOkkeGwxh1MrMKbPgDSeIJFK4Q3HWN7mIJVLoNDI93mhRwe0T3UXu6vQVTOa0zdLvCOHUmJXTkWAwyA033MBPf/pTvvKVr+T87M477+S2227j05/+dPaxBQvyD/nH0mg0VFaKyqpzXSyZ4ltPHczJFI8l0jS4jNnAhTucm3F0ZCBIrz9WcLbEscEQTaVmFlZa6fZGeN38UvZ0+QmMCaIPBuPEkmmay0zs7S48Q3Z+pY1t7R4qbHrcoXi2Mtxm0NBR5KZ3Q5OLXZ0+jg5mNrGr6uz0+GL0+jPV4COL8tGBEFpFQpEl6lxGook0LxweZEWtnUN9AZrLzLw2avGWJVhRZ0enKMQSKQw6ha1jgvgdnggGnYJeq+XfLmpiTYOTC5pL84I6e7p83P7Q9uxBcSSR4rvPHOIdq2tE+19BOE389Ma1yLJEMJbkPx/fzR92dI/73F5/bNyEm/G0DIZygtXVDgNVdgPRRCqnsqhYS2tshGKpKQW/ASLxVPaAE463dB8RS6RwmnS0TTDvrc5lRJElVLW43NF4Ko3NqOO96xu4cnEFDrNuStcsCMLJd8XiCn6/rbOo53Z7oznjEhqGu+Ts7vQSS55ojvn0lFn16DUyBq1CWlU5NhBiZMslSxJpVUUjS+zo8PKjZ4/wyTcuPCXXKQhC8STgFx9cj92oxW7U5rTMPjYQ5Ib/2zRhR7DJhOMpWgbDtHB8D7Sw0ooE7O89vlcb2zZyZZ2deFLFrFfyDgONWoXIqJaV6xud43YEKsaebj9rG5yTP3Gadnb6it7jllh0xJKpnAC4ImXafG5p9dDlidA1fE9fatHhMusYCETxhI8/f0Wdg4+N091JOHvV1tby9a9/nXnz5qGqKg888ABvectb2L59O0uWLJl2EZBwYjo9Ya7+3ososkR0TLvzepeJZHrmW6CbdQq+SGJWOlsUMrZTJcBrbR7mlVvwhOMMBieuxixWnZiFKwjCKLFkike3dvD0vr7sY/t7AswpM3NsnDM9q0FLMBbMdsddWmNjz/DIWkWWWFBhzdmvNZaYKLXoGQzmjq8daybuzhUJVtU7ONIfJBBNsqDCyr9d3DQD7yycLmYlAP4f//EfXHPNNVx++eU5AfD+/n42bdrEDTfcwAUXXMDRo0dZuHAhX/3qV7nooosmfM/Dhw9TXV2NwWDg/PPP55577qG+vn7c58diMWKx45sOv3/mW82cbHc8tJ1dXT7mlVuYX2FlXoWVKruBQDRBtzdKjy9Cjy+KXiNT6zRxybwyltbYzqqg5I+ePUoqrbK63oE/kuDIQIihUJxAVMKskymzGnK+r1mnMDDJ5rNlMETLYAitLDG3zDzu3IpANEm1w0Aonj+nYkWtnQM9flQV+sYE2hMplYvmlpJIpUmm00TiaTSKhEbOBLAz89kkfJEEwWgi51Bhe4eP9U1Oev1RtDIcHdVGPZFSSadVujwR1jY4MWoVdnb6OH+Oi0QyTb3LmK3WTKuZqu+JlFn13P3GRVwwtwSDdvz2mUtr7Dx5xyX0+qLYTVp6fVHuff4Ye7r8LBsOQgmCcGqNzOfSa+TiZh6qmU1noerI0ax6DQ2lJsw6Da+1ullV70AjZ1qdh2IpFlRapzVTzahVspvf6RgJfK9tcGbn9wDEkpmgUOHPlFlYZctWBm1ocgHjB+AdJi1vXVnDLZc2U241TPtaBUE4+Q73TT0xZ0TbUJi2oTBWvYbltVYC0SQHewMzcrM9kWq7gW5fFI0s8Z51dXzooia6vBFUFXZ1Zjr+XL+ujlA8hUEj0zIYQiXTQUQQhNOfWa9hbnn+v9ejA0EefLWdoWkELhQJFlZZx01GtBk04+6LRuwocM9YZTfgMuvY2+2nxKzDadaiU+ScUWDTtbfbz4paO6F4kiP9M99xY2ic0TZj7e70UmHLrcZdVV+4vftgMI7VoM0Jfpt1CnddKYLf56I3v/nNOX/+6le/yo9//GNeffVVlixZMu0iIOHE9AdiJFIqiVT+js2oVTjYV3yL3WItqLSyrciuEzOh2m4oWGF+uD+Iy6xlYaWFA71T78w2Vp1LdCoQBOG46+99teDIRadJx3hnapExM79Hn/+l0ioHx9yvtw6FaR0Ko8gSJWYd9SWmvK4+skTeGebIeaREZr53V4ERhpDprptKq1TYDGxt95BIqayos7Ozw8fBvgDn3fMPXvrUG7LjKIUz24wHwB966CG2bdvGli1b8n527NgxIDPT+7//+79ZuXIlv/zlL7nsssvYs2cP8+YVbhW1YcMGfvGLX7BgwQJ6enr44he/yMUXX8yePXuwWq0FX3PPPffkzQ0/kx3o9fO3Pb3Ek2mODYR4am/fpK/51lMHqXUaedOyKt64tJKVtY5sUORMsLXNw9/39VHjyGzqnj80kG3JO5L901xmxmnSkUil2dnpwxxPUWkzUOs0UGoxEEmkONhb/KHn0YEQJr3C8jo7ICGRaXubUlWMWpmXCsxnW1nrYEenFyA7SzuVVkmlVRRZQpEkXjpSeLbFiDUNTvZ0+Tl/TgnlVn1OxqhBo/C6+WVsbfOg1cgsrLQSS6bxhuMMBGOc31ySMzfOG0mwvyfznZ0mLRU2A2Z95rBjKBQjFEtR5zTR54/SNtwuaW65hd/82wbKbcUFdbSKnG2DZDNo+Z/rVpxQ+ztBEGbeYDDGJx/dlc2wnOy5EwW/1zY42dvtIxBL5mxUR29AfZEEm1vcU6om12sya8kkcfdxWfQKwdjxjXS3L8KSahuhWJIyqx5Zltgy5lp0ioROkZlTbsm5/n3dfpZU2womDLjMOv5860XUiHmOZ6yuri4+9alP8cQTTxAOh5k7dy73338/a9euBeCmm27igQceyHnNVVddxZNPPnkqLleYYb97reOE3yMQS2YDIUadQr3ThN2kpXUwNCuVPtFkmovnldJcZqHWZUJVVRwmLTUOE0trjiccOoaLckos+hm/BkEQTh5fJMF3/n6Ix7Z15rXhHqFVJOZXWHGHYvT6YtlEHKdJy9xyC21DYfZ2B5ClTIDdpFMwahV0Ghl/NEk0keZAb+F9jnucuY0NLhP9gWi2Gn0oFJ90xuNUaGQJrSLPSvC7xmEseo+ZTKl5fwfxCXoIl1v12REZZVY9D/7bBuZXFD6bEs4dqVSKRx55hFAoxPnnnz/tIqCzsaDnZCsU+B7R44uwoclF21CoYKfI6TrSH6TUopuxyuvJRCdYo9yhBP5I8oQ7dUAmYUAQBAEyXWELBb+BgnGBhZVWLHoNnvD01sVUWs3uPWsdxuyoHoC1jcfPHp0mLfMqMmd8a+odJNKZEbkLKq0M+KO4w4lRr3Oyo91LMq3mVJfv7PCxut7BtnYvff4Yt/12O19/+3Ix7vAsMKMB8I6ODm6//Xb+/ve/YzDkB9LSwy1mbr75Zj74wQ8CsGrVKv7xj3/w85//nHvuuafg+46enbN8+XI2bNhAQ0MDDz/8MP/6r/9a8DV33303H/vYx7J/9vv91NXVTfu7nWq7On0T3oCNp9MT4b4XjnHfC8eoshtY0+BEliQGgzH6/FFcZh3nzSnhfec1UFFk8PNkePZgPzf/cuuks88ybbiP3yz3B2L0B2KsqncUPe8LQCtLLKyysbsrk/G+uSV/gzi33MyGRmfmoEGS2NHuodJuwGbUsKzGTstgKJuhNNr6RhfLa20YtBpSKZWUqnKkP5ATtIkPz2NLqyr9gRhrGpwc6vWzsMrGy0eHSKVV1jQ42d7uyakwr7Dp89o5mXQKG5pcbGpx4wkn8Ixa5Ef0+KLIUqaleiSRYn2jq+jg93g0IitKEE4L+7r97O7y8sz+fvyRBGadUrBzxWilFn3B2Y4A65tcdHrCRIqo6jbpFHq8EV4/v5RwPI2KSjKtEo5lZrCNzb6cX2HNrrtTtaregaqCTiOzt8tHKJ7KaV08shZf0OwimkgjIRFNpmgdDBGMp9g1pl16IJZkIBDDqJWJJNJoFYm55VYWVFi45dK5Ivh9BvN4PFx44YVceumlPPHEE5SVlXH48GGczty2q2984xu5//77s3/W60VA8WyQTqvjZn5PVySeyslSr7DpqbIb0cgSxwZCeeN4ilVh07Oi1kGN04iExFtWVuM0aZElCYdJh/Ms6uokCEKun7/Uwi9eaZ3wOStqHdlONxpZotSiJ55K4w7FcyqV02qme1kgmsRl1lHvNHG0P0jvcBC7wqqnvsREIpXGF0nSMhjK3M8OBAmO2jOWW/WoqHl7wCXVNsx6De1FBo/WNTpJplSS6TS7RyVSOkxakql0TveemWLRKdiNWvb1FBc4tBg01DlN+KNJPOE4gWiSgWAUk04hPGYfPb/CwrbhazbpFO6/aZ0Ifp/jdu/ezfnnn080GsVisfD444+zePFiXn31VWDqRUBnW0HPyfbU3l62tY+/rvijSTa1uFleY5/RALg/mqTWaaTKrqfHN7tt0GUpE3CfSDKtsrnVw5oGJ7s6vRMmBUzkka2d3HLp3Ak7RQqCcPbzRxN8/OGd4/58Z6ePFbX2bIfGQrO1i6VVpLw1q8JuyAbA55SZ0SqgU2BJjYMDvYFsLGfrcDyoxmGkayDE6noH7tHFO+EEyXEyJEcnoT6xp5edHV6+++5VrG9yTet7CKeHGQ2Ab926lf7+flavXp19LJVK8cILL/CDH/yAgwcPArB48eKc1y1atIj29vaiP8fhcDB//nyOHDky7nP0ev1ZdXC5v5gWtpPo8UX5y64e6lyZOTGqmgkgb2n18POXWrj98nl88MKmU9reYW+3j6P9QT7x6K5Jg98Tseo16DVSUbMatYrEnDLLpEGYowMhdJUKJr3Cay1uDFqZdnck22Z8PJtb3cyvsKCR0+zq9JJMZw4s1jY6UdVMqzoVuGhuKXuG54tvbfNgM2hoHwqzvNbO9nYvW9s8LKux0eeP4Q7FWFHnZGubh9X1juxnrW10Zmd/S0w8CyOtkv1F1O+PcfebFonWHoJwhnvl6CA3/XxLzvpp0sosr7Wj18hIkkS/P4ovkqDCZsBu1OKLJDDpZJbW2DjcF6TUoqfLG0GvkVlV7+DVY5NXc+s1Ms1lFiQp08qyo0ArNsgkBO3p8mZbpLe7wyyrsZFIqRO2FNYqEgatQmB4M+o0ZVpvbhtuVaTTyKxrdOKPJHOCUusanbxydPLrl6TMofIFzSU0uMwsq7XTXG5GrxE3+WeDb3zjG9TV1eUEt5ua8mc66fV6KisrT+alCSfBl/6yD3WW+5X3+WPZBEVJynTWseo17Or0UuUwUuMwEk+m8Ubi6BQFs15Bq8ik0iqheBJ3ME5/IEY4niKWTHPt8irWNIibbEE4l6QnWKg0MpTbDPT4j88ET6ZVev3jzwivcRopMenY3+vPdisb0ReIUWrV53S92d3lw2rQ0FxmxhdJEImn0GrkvHtdvSbTSWdzi5t6l4kqu4Hq4SRBRRrpOJakz5+pUF8xPEMbwG7UYtDI2apFbzgxI9WJc8vMuMx6Euk0GlnKJikVG/wG8EWS+CLHn7+w0oJFr2V+hYatbR6CsSRNpSbKLAa2d3hIpFVkCb7/nlU5XTmEc9OCBQvYsWMHPp+PRx99lA984AM8//zz0y4COtsKemZLjy9CMqVmuxMeHQjysYd3crQ/SHCc0YajHewL0FxmHi6smRmdnkx1+WwHwOeVWzjYV1x7861tHuaUmQlFk/RNo2tRjy/K/714jI++oXDChiAI54avP3Egr1X5WKPjCuPNAx+xss5ONJFGVcFu0hKJJznaH0RRZLSyTGOpCY0isbXNSyqtsrXNw6Xzy2j3hDk6EOLYQIg1Dc5xR/KMJMFva/eyss6RrVw368cPh4bjub87un1R3n3fRj566Vxuu2yeKP47Q81oAPyyyy5j9+7dOY998IMfZOHChXzqU59izpw5VFdXZwPhIw4dOpRT5T2ZYDDI0aNHef/73z8j1306SabSPL2vj25vBF8kgSxJbG5xkxgVzKi06XGH4sSnmL1n1SssqbYzEIzlHQSG4im+9rcDPPxaJ3dePm84k0ZBq2TmVGsVGY0soVFkdIqcnWE9et52OJ7JHi+z6ouej6qqKtFEmv5AlN9v6+JHzx4hmVZxmbU0lJhwGHXs7fZNWr042rwKC4f7g6hILKuxYtJlWm20DIRIFJgNsaTGPm5GkiTBukYX4ViSUDyFxaCwucXDggoLZr2GY4MhvAUqrMc6NLwxdZi0zK+w0j4UygaqR6uwHU/a8EeTBGNJUmk1W9E9kjGv1xyfuRZPpllWY0NVyb7n/ApL9jOL0R+I8dTeXq5dXl30awRBOH2EYkkO9wf5wp/25iUPhRPpvGpnIKc7RK8/SjiWRJYlurwRFlfZaB0MEopNvvY2lZpIp1V6/ZFJO4lsbnUzt9yC3ahFVVVkSSKWTHGgN0Cl3UC5Rc+uUclIy2vsaBSJI/1B0momoB1NpDk2EGRzqzv7uyyeTGfX8dX1DiRJwqJXeP7Q+OMnFlfZaCw18calVVw0txSXWTfpdxXOTH/605+46qqreNe73sXzzz9PTU0Nt9xyCx/+8Idznvfcc89RXl6O0+nkDW94A1/5ylcoKSkp+J6iNeWZ4ck9Pezr9lPjMNDlHT9QNJNU9XhFjkEr0+mJFJzPOJYiS9Q4jMyvsLCyzjnp8wVBODt0eSP86NkjPDxmVEOJWZfpohNPkkyr2Q43E5EkmF9uwWHS0e4O5eypxur0hFnX6GRbuzc7BmekanxEKB7hknml+CIJvOEEgVimpe724QPE9uFxWiPt0UcbSdLeP2ocmS+SyBuVo5IJNh/sDWYTIccmPk6kzmmkdSjEkTGHrMoJNswYPTdXI2fG7rQMhmkZPN7t7Z1rarlsUcWJfZBwVtDpdMydOxeANWvWsGXLFr73ve9l535PtQjobCvomQ2bjg1x/X2vcvmiCu64fB5Lqm28cnSIneO05i0klkwTiCaL6phWrMVVNnZ0zHxXi7Hspqndux4bCGE3allcZWVfT/FjIkf86LmjXLe27oQ7RwqCcGbq9UX5887uSZ8nD8eJSi06quwGmsst7Ojw5nU1NuoUhkJxOgoVFQ4XzLjbM13VLHqF+hITpWY9zx4ayHnq1jYPy2vsE+55AVoGQ8wtM+M06/BFxo/jdHujVFj1OclCaRX+959HeOnIIN9796ps0pVw5pjRALjVamXp0qU5j5nNZkpKSrKPf+ITn+Dzn/88K1asYOXKlTzwwAMcOHCARx99NPuayy67jLe97W189KMfBeCuu+7izW9+Mw0NDXR3d/P5z38eRVF4z3veM5OXf8q1Doa49bfbC1YiN5eZWdvgpNsbodsXRaeRWVlnI55MT7p5sRo0LKqycbA3wKvDN5vNZWZKzDoO9AXwR47fWLYNhfjvpw9l51mNsBk1rKxx8MKYWdaZoLiEVpYJDGdYllr0/OKD61hSbcsJkI81GIzxoV9sKRiYcYcSuEOZBWl+hQWtIqHXZKplwvEkaVUlnc4sQilVRStL2Ixa2t1hDo8K/I5usZaZmWbBadIhSZk5X3qNzMtH8+d6j1jb4My5QS+zZm5CRmdarmlw0OePFXW46Q1nZuRKUmbudzyZyl6jVpZYWGHNzioLRBPYDFoO9vrZ1OLOaR0SG/WLw6BTeK3VgyxlWhX3+6PYDFqWVtvYM4XOAdvavCIALghnqB5flPf/bFNRB4WFjCTyrKy2s6PDm62YOdDrZ265pWB7NZNOYWmNnQO9/uzvkTlllkk/a7xWbb2+KP3+KOubXPR4w1Q5THmzxItpn7RtVGujpTW2nJnlkAky/ec1i7jpgsYJf0cJZ49jx47x4x//mI997GN85jOfYcuWLdx2223odDo+8IEPAJn2529/+9tpamri6NGjfOYzn+Hqq69m48aNKEp+JwDRmvL0Fkum+Opf9/PLjW3ZxxZWWglGkzlzw2bb2DE145EkWFPv5BNvXMDaBqdYmwThHBBNpPifpw/yi1da81o8zi03E0+q2QBzsdY1uvL2TuPxRZJsafWwqs6RDWgXsvHoEOV2A11F3OuOtm2ccWS7O304TdpsImY4nuJAbxCjTqHWYSSSSNHpiZBIJTHqFJZW2/L2f4uqrOgUmQ5PhA5PBKNWocqhQ5EkQvEUwWiSSCKFWadQbjPknW1MVTJNzviyETddkN9NRhAgM/4xFovR2Ng4I0VAQq4/7ujirkcybXif2d/HM/v7WNPgxGXSopWl4TFcxb1XfyDGijo7/f7oCVdtl1p0tA+FiupEeaKiiakH7H2RBIFoIltgMxXheIo/7ujmw5fMmfLnCoJwZoslU7zr3leKO2+UMq3HnSYte7r82W5AO0fFftY3uejzR0mP04Z8rGAshUWn4YXD+QUulXYDB3onjn3YjVrmlltQVbWoM8VosvD66g7FecsPX+bzb17MW1bWFHXtwulhRgPgxbjjjjuIRqPceeeduN1uVqxYwd///neam5uzzzl69CiDg8f/R93Z2cl73vMehoaGKCsr46KLLuLVV1+lrKzsZF/+rDncF+CG/9tE/zjtaMbOuo4n0+zoyCwec8st+COJvNcqEqysd3B0IJR3I3x0IMTRgRBaRWJVvYNANEGnO0JzmYW9Y1qFrap3sK/bz8vHhlhQYc1pd5FMZ+a7Rjm+uxwMxnjfzzZR4zCyuMqGJMHh/iArah187trFyHLmUO9Lf95XMPg9lkGrsLfbn81MX15rZ2+BgAaqykRF8YmUmq2KHmlzJEuZA1GbUUuvL5pzyFDjMHKgNze5YFubO6dtBkA6nWlztLLOwa5OL8Ws36pKtoJ7w/AciYN9AZ4vsJgvq7Gzu8vHllYPjSWmnBnjFVY9ne4wJWYdzWXm7H/PrUPh7Hcb+x3GoznRNHlBEE6ZueUW7rpyAZ//095pv4fLpM07IEykVCx6DbJE3tq2tMae97vFP0EmZTHSKmxucVPjMBR9gDuR7jGHtRa9hm9ft4Irl4g21+eSdDrN2rVr+drXvgZkWk/u2bOHn/zkJ9kA+Lvf/e7s85ctW8by5ctpbm7mueee47LLLst7T9Ga8vTV6QnzH7/ZnlcBNLIfWl3vIJJIsX8a1S+zpd5l4pL5pZMmjwqCcHYIxpK896evZu+FM/ftThRZIhRL5rQmn4odHV7WDreCPJ5wnc45dBxre4eXVfUOto8TsE6kVcy6mRsJE0mkWFZ7fA9pHJ4pG4mnODwmSTIST7Gl1cOiKiutgyEiiXTBwE0kkSpYQRSKp3CYtBi1MqpKtvX6TCm3iQpdIbMnvPrqq6mvrycQCPCb3/yG5557jqeeegpJkooqAhKm5rJFFXmJQ1vbPBi0Mia9wqIqGwd6A0V1awTY2eHDqFWYW27mSP/0E2aayyxTDixP2zRj7GkVNrW4WVXvYH+3f0rr4kRjNwRBODu9emyIrz9xoHCldgFdnjCxZJo93cefr1Vk1jQ40cgSg8EYB3v9hGOpvC6947HqNXl7xBH1ThO9BToRQaYLb0OJiWMDIba2eVjbUFyXtWSB4FImuSoTBL/9oR08f2iAL71lKZYJ2qkLp49Z/2/pueeey3vs05/+dLYVUCGtra05f37ooYdm+KpOH6qq8vttXXz+j3um3XLnSH+Q5jIzsWQKXyRJU6mZMoueg30BtrZ5J3xtIqXm3OyOnYNQ4zCyq9OXDT7bjMX9T2ZeuYUtrZ6cm/ft7V7mllt433kNtAyE+NvunqLeSzc8I3GEocBMVlVVWd/oIhRPkkipw+11QSU/u0crS9lkgbR6/EB0bYOTZCqNSa/BotfQ443kZTcl05mDhdGB5ZF2wzs6vCyptmHUKvgiiXEX57HC8WROpfpYu7t8XDK/lI1Hh6iwGUilVarsBkw6DRuPDWWrwQOxZM5MNZXMYcBob1hYjt2o5U87u3P+TgF+8XIrqbTKHZfPw2rQFnXtgiCcPhym6f+71cjQVGYpODtnR4eX9U1ONrdkfqbXyKyoc+RVcmsVKW9dma5Sq37K7YqXVNuQpUy79Egixao6B/t6cg981zU60WpkVFUVQaZzSFVVVcHWk7///e/Hfc2cOXMoLS3lyJEjBQPgojXl6WkwGOPGn2+ecN7YtnYviiyxvtHF7i4vkSKrtGdT21CYJ/f2UmrRc9miimzHIUEQzj67O318/Yn92IwaNjS5SKsqHZ7IuPMLpyKeTPPa8AGfN5LgUF+Qcqs+m8Q+t8ycuc+TYCgYI5WGWqeRbe0Tf/ahviA1DmN2luKJ2tbmYVmNjd1dfuQitmP7ewKYdAorau2k0iqVNkPRgZjt7V7On1PCa21uNjS52NbmKfrAdTJ/39fHe9bXz8h7CWeu/v5+brzxRnp6erDb7SxfvpynnnqKK664AiiuCEgonqqqPPBKa8GfRRNpltc6ePWYmyq7gflN1qKTqptKzdkuaNPVfZK6DFn0Cu5w/ITeY3u7l8YSE7FkuuAYi0Ji41RFCsJMa2xspK2tLeexe+65Z8JYkjBzvvHkgeEEIpXfbu6Y9PmjdXmjzCu3MBg8vkYd7PUTKGK84niayszjFlD2+qPUOox5Xd4WVlrxhuPs7Dj+uvTYecDjWFJtzxvHu2pMh+DHtnWxtc3D/757FSvqHFP4NsKpINIUTpEOd5jHtnXx+22dU25tVsjRgRAXzS1BQmJHh3fabb72dvtYUWtHp5FJpNK0DIZzAhqxIrIDm0rNORXSo33uj3vY2uZhV6eXiWIP5VY9jSVm3OE4r406DNBpZI4O5AeWV9U7s+3dRzPrFKwGhUA0lfPcza35z32tzZOTUT6/wkJKVXMW7czrHewZ1aZeI0tY9BqCo7L1R6q6i6EvENAfyxOKU27V0x+IZlu9AVTZDbhDcWLJNPFkmvWNTja3erDoNZRZ9ayodbC+wcmOTh/vWV/Phy7KtGn714ua+OKf92aTAxRZotZl5NVjQ+zqLOfCuaVFX78gCKeHueWTtx8vpMquR0Ka8OD12ECIxdU2rHoFjSLz8pH80RGJlIpJp6HBZaKtiN9rpRYdRp2ChJT3e7DIfSmQWb/WNjhpHQzRF4ihVSSsBg17un0sqLBmR0FoZImjAyF2tHt5/fyzp4OMMLkLL7ywYOvJhoaGcV/T2dnJ0NAQVVVVs315wgwqteh5+o5L2Nnp45cbW/njjsJzylJplc2tbirtBuoMGkKx1IwFdqZrT5efL/x5L/FUmvef1yCSdAThLOOPJvjeM4e5/+WWbFedtQ3OnHvdmTLynqOTthdWWmkbChNJ5J4TFLv2VdkNM7ZOJtMqe7r9zK+wkEyplFp0effcY4XjKXZ2+ljX6JxSFaJFp7Cz00sipbKpxU21w0Ct00Q0kcIfTtDrj067Mvyrf93PG5dU4jRPbRavcHb52c9+NulzJisCEornDsX51lMHx/15Yvjfc48vOqU5rYf6AlTZ9dNug66Rpew53WySJWgoMU+7U8horUNhrAZNUfNzATSyfMKfKQjF+tKXvsSHP/zh7J+tVuspvJpzRyyZ4v6XW4oe5VWIa8y+6ESC33qNPGH34HZ3mOYyMxadQnBUwNpm0OR1xO3zF7e+b251U2LWsaTGjqqqqKpaMJmqbSjMO378Ch+7cj4fuaQ52/FYOP2IAPhJFImnONQX4BevtPLHHV1FtcqejGW4vY8nnOCl4YCEWZdp3aORZSx6DYos0R+I0jI4eUAiFE8xGIwzFIwVvBHsKyIzsMyqp2UwxPomJ55QAqtBg0aWsgd5A4EYWkWm2mGkwmpAkiCRSmMzaBgKJYgkUhzpDxZsB7+yzp6tQhwhS9Azzs243ahFkSUWVmZmf3lDcV5rGz8D9Eh/EK0iZdulN5eZqbIbAAlQ0Soyu7t82XZLCystxJIpdEomAJNMpwEJjSxR4zQWNStNo0g0lpjQa5TMPHVFRpEz7+EJxzFolXEX+x5flBqHgcZS83BbfC+QmYu2pdXD724+j3KrIe91S2vsPPKRC3CH4njCcWqdxqIC8YIgnL4mqngcT6Z7SJrOSdaqwWAcTyhOY6l5wgSr3V0+FlZahxN2Cm8uy6x6mkrMDARjtAyGUKTMWhqKZ9pXbmhy4Y8W30o9lVaJJVP0DX9eIqWSSGW6d+zp9rO4yobFoPDpqxdR4zBSYctfE4Wz25133skFF1zA1772Na677jo2b97Mfffdx3333QdAMBjki1/8Iu94xzuorKzk6NGjfPKTn2Tu3LlcddVVp/jqhanSDLdY80cT4wbAR/T6ovQOb7HWNjhRgQM9/ml3ZZouvUbm3evqeNfaOtEGXRDOQr/a2MoX/rwvr1PO6H/qVXYDVXYDGlnCG0lg1Crs7vJN+cxgcZUNjSyRUlUO9vppKjVjN2qLHtU1ng7PiSftj6aqZMeTVVh1XNBcwlAojj+SGLcacV2jc9zZ4uNpLrfktIDv9kbpHtNlqM5lLLq152jBWJIOT1gEwAXhJFFVlfteODbhc7Sa40HaZKr4AE4yraJVFBZWWjjQW1w3x7GvX9PgZEe7Z8LRjCdqbYOrYEHPdAWiSXZ1+WgsMVFq0aOqKv5okmRaJZVOk0yr+MIJUqoqOl4IJ5XVaqWyUoyuO9mePTBwQsHvKrth2kWZhcSS6eGIzPiODoRY1+hkZ4eX+HBX4D0Fknq6vBFMOoVwEff6Q6E4Qy1uyq16BoPjB86TaZVvPnkQTyjOZ69ZPO7zhFNLBMBPki2tbm76+eYZO1CrdhiosBnY2+3Pa/EdiqcKzq2pcxmpshvZ0eElPkGWsyyDxaAhWiALu8puzAYZRiyvtROOpwjGkqRSKpF4kkqbIS9QPWL0XJ22UfOsV9ZlZl2Px6xTUNPgMuly2v1U2/NbXYzoD8SosOmzf0cr6+yAxLHBIP5IMu/5Q6F4zpztUos+b4bP+iYXe7t8LKm2sXnU3727QPZ+U6kZRYIjEwSmtrR6WFJtw6BVCmYULay0UOs0UmbR0xeIYtZpcJp17OvyEYyn6PJGiadUApEE8eGd9o4OL1aDhn5/rGAAfITLrMvLzBIE4cwUiuWvafMrLNiNWtyhOEdHrUMWncLiGjuJVHrcmY9jWQyanPcYz4HeAHPKzHjC8WyykEaWsBk1NJaYCcSSOTftKRUO9AZZ1+jEqtewd3htmwp5gmDRgV4/D/7beayuL27ej3D2WbduHY8//jh33303X/rSl2hqauK73/0uN9xwAwCKorBr1y4eeOABvF4v1dXVXHnllXz5y18Wbc5Pc55QnNahEImUmt0baxWZdFrl2QP9U3qvkYpJqyHTlng6a9F02Awa/nrbxVOqUhKEk+nrX/86d999N7fffjvf/e53aW1tpampqeBzH374Yd71rned5Cs8fR3sDfD7bZ3c/3JLwTExqgrLamy0u8P0+KJ5gd8yix6HSVv0aC2AfT1+1jY4iSRSNJVZ0CnyuN3ZimXWKUVXzUzVijo7uzp99AUyyfxNpaZsYrleo5BWVdJp6A1E8849iqHTTF6xqEwz6ehDFzaxrMY+rdcKgjB1kiTx1lU1/H5b17gBifSotVaZYjVeuztMY4mJxhIT5TYDXZ4Ivkgck06DUSsTS6bpnWAt3NqWOdtrHQzNSjLlusbC3SxnQutQOHsOWsgP3rOKBZWiAlc4eb7+9a/z5S9/mfr6et773vdy5513otGIMNZsK3ZsxHhqHMYZ7W7UNEkRzogtrZnxOhKg1SjjdrgsJvg9WjKdRpaYchKpOtzWUiS2nx7EynESROIpPvHIzhkNfvvCibzM5cl0uCN0uCPIEqxpcLKvx09kzDXVOI2Eoknc4cLVd0OhGCvr7HR7o/QHYiyqtOZUJ8+vsEw4zxoyLSfMOiXv7+Ngb4D5FZZsJvhoaxqctA2F2NLmQaeR2dDkYk9XZh5DtTM3AO4y6XCZtRwZCLG81s7RgRDrG10c6POj1yhsanFj1Cksq7ERTaYJRJKkVZXGUjM6RaJjuBXvwkoLh/oCedeyucXN3HJLTvB7PC2DIZZU2yZ8TiqtjlvhbdIpuEMJ6ktMvDbm89Y2OrOPDQRiOX93iZTKqjob5TZxcH8uGHswCRCNRvn4xz/OQw89RCwW46qrruJHP/oRFRUVp/ZihVkzf9QN6cJKKxpZYm+3HxUwaGQaS0x0eiLZta7Yja1RKzOv3Mr+3uLbrB0bCOUkO61ucLK9zTNh1c6WVg/La2zTCjhplPEPNz92xXzOby6Z8nsKZ5drr72Wa6+9tuDPjEYjTz311Em+IuFE/HVXD/e9cDSnqg8yXYHKrQZMOoVj08w8D0STbGpxZ2fzSkgk0mki8RShWBJfNIFBo1Bm1WHSaZAkiUg8Oen+dzxf+JclIvgtnLa2bNnCvffey/Lly7OP1dXV0dPTk/O8++67j29961tcffXVJ/sST1vb2j286ycbCwa+R0x2QDgQjFHnMk75s0fe16xTCCdO/AzCbtLOSjAn08ktilaRswn6LYPhojrXFcNl1hV1aFpm1U8Y+ClkXaOTd6ypIRhLZuaqkwm8ybJEPJkmnkpj0YvjNkGYaYuqbLz0qUv51lMH+dlLLXk/H91JLK2CVpZIptUJqwdHzCu3EEumaXfnBoODw+17JSlzDucJxelwh7MFKKPt7fbTWGLCFEsxMEHV4FQtqbZOuQPGTFnb4OTaFdWn5LOFc9Ntt93G6tWrcblcvPLKK9x999309PTw7W9/u+DzY7EYsdjxf29+/4mPCDhXlVimXyS3vNbOtvaZHe0zNm41EYNWmTBZssKqzyvqLKTeZcJh0pJKq5h1GtzhOEcmSEa16jXccfn8nMe+/sQBDFqFO6+YP86rhJNJ7MhnWTqt8l9/2D3lG6qJOIy6KQe/c65JzWQmllv1LK22EU9lsquP9gcxamUicQmtIqFT5Lwb3Q5PhFgyTX8ghkaWsBq12Z+5zDpsBu3Yj8th1SusqLXz8tH8+bGRRJoOd5g5ZeZsK98GlwlFyZ1NG0+m2dTixm7UsqDCxIA/ilmnUOcyYTNq2d3lo3UowZJqK0cHQvgiCTa3ullYacU7XDkeiafY3eVnYaU1O0NsdLve8+eUcKDXz7wKKzs7PMSSuRvb1sEgF84tYWurZ9KZYQd7/Ri1CpFJDh/qnMacmUFlVj02gwarQUOqwMZ6bA6RY9R/F1V2A7dc2jxh9bdwdih0MAmZlr9//etfeeSRR7Db7Xz0ox/l7W9/Oy+//PIpulJhtkQTKR5+rYOXDw+yvskJqkTLYCjnhjuaTNM2FB4ezRCm1mlkYaWVowNBltXY826mJQnWNboIRBNoZYlYMs2SajtaRUJVMz/f2+0fN3vSbtTiMuuBzFouAYkiUiZ3dWValnvC8XHbX442t9xCiVmX16ljxPVr6/j318+d9H0EQTgzRBMpPv/HvfzutY6CP0+rTGk27Hi0isTBvgDecRJC/SRz9o1mXWZ/q9cq+COJvHljYzWVmnnH6hpW1jmpdoi9mnB6CgaD3HDDDfz0pz/lK1/5SvZxRVHyWlI+/vjjXHfddVgslpN9mactp0k3YfB7MvPKM118ipnLOp6ZClp7Q3HqXSba3TPbBj2tgj+SIJ5MU27V01RqZlu7J9tBaLocJi3zKywc6Q8yGBx/rI4kwep6J1taPTSVmunxRoqeB76ny8/7/28T7nACq16TWf+jCfSKTGC4K1OFTc/KOger6p2srHOwrMaOWQTFBeGEGbQK/3nNIra35ydYJ0etu1vbPBh1Cs0uEzaDFn80s964zDokCbq9EXp8UdY2unit1Y1JP3ECpaqSU5hi0WsyoyzU4+15VVVlIBDDpNewvNZOnz+KTiMTGe6aOZ3WwjUOI+3uyAn9TjkRIlFTmAmf/vSn+cY3vjHhc/bv38/ChQv52Mc+ln1s+fLl6HQ6br75Zu65556CHdruuecevvjFL874NZ+L/mVFNd/5+6GctbRYBq0yI+N+R7MaNExWi6PXyMwrt0zaKajMNnkAvNJuwBeJT2nPW2bTox/Tccg4i92ThKkTu+9Z9PKRQf7n6YPs7fazrtFJLJnmQI8/L0tweY2dTm8Yo1aDXptp25hSVUy6TPBTliRSaZVwPIk3HCccz29zOx39gVjO4Z3DpM1pnW415FdpQ2Zm9cjz9466IZ9bZiEYSzK3PDOP2qjVoNVImIYXwHgyzaH+AG1D4cx3UvNXxUgijV4jo5ElmsssdPsiBKKFv68vksAXSXDeHBctQ+G8w0ZfJIkvcvyG90BvgNX1jpznjDdnNpVO4wkn2NziZkm1jQM9/pw5Psk0JJKZDO8l1TYseg3RRIpOT4ShUG7r+GQaap0TZ5UbtDI2oxaGA+B1LiOhaCrbbnik6n10kGf034skwWAozrXLKrl8cSVXL6sUM73PAeMdTPp8Pn72s5/xm9/8hje84Q0A3H///SxatIhXX32V884771RdsjALjvQH+daTB7OHbeNRITvr+/DwWq9TJA71+qlxGOnxRVhYaUOSIJFKs7nFjTx8Q1/oNl2RMpnoRq2GvkA0Z3aiL5LgcF+A+eUWDDpl3AB1Ift6/CiyxOp6B9rhyu59Pf683wUOkxZ3cPxMzNsvm8cdl88TLYcE4Syxv8fPJx/dNeG4nOmyGzXUOk34IwnSKrhD8XGD34WE4qmcavQVdXYO9gRyAinrG11curCcaoeB8+eUUG7LBL57fFOfOysIJ8N//Md/cM0113D55Zfn7DPH2rp1Kzt27OCHP/zhuM851ypzdnR4ueuRndN+vVaW6PVHp9T6fDaFE2nSqopFryE4yX5zqqLDsx0Hhs8mmsvMRY3cmYjDqKV1MIw7NPE6rqqZSn2tkkkeHQmaF3N4G0mkaC4z4wknCMSS2X346FFzff4YT+3t46m9fUCm4n1+hZVV9Q5W1jl455q6KbdoFgQhQ5Ik5pRZ8gLgpRZdtqAGMsUvY88KR4LcLrOWueUWQrEkaRWSKRVZgmJThyZaD0PxFBU2fV4ARCOD1aDNjiNMqyo93ijd4yR/W/UKSIx7LnoyzC0XyW3Cifv4xz/OTTfdNOFz5syZU/DxDRs2kEwmaW1tZcGCBXk/v/vuu3OC5n6/n7q6uhO63nNVncvEu9bW8tvNhRPOl9XYSKuZPZRBK9PtjRCKJQnEUvgjxd8/F+twf5A1DU4O9foJxAqvzrFkesIK7RHFxEmcJi29RRTjjPbWlTV5XSnnlJoZmIHEfGFmiAD4LDLplOxmbCQLRatIzB3O5lZkCVSVre3e4Uy+iReKxhITIBGOp1hcZWNfz8weHMwts+AJx0mm0ph0GkotOvzRJHqNTFqFQCyJRpYos+gJxVIMBuM0l5lpd4dJpNTsLJrGEhMd7gh6jUxTmTmvVXiHJ8LaBue4Ld/292Q2pzqNNOkmb3mNPSewopElFlXZ8EcSlFn0+CKJnPfY1u7NBpLXNTrHzQ4aXWE/ksDgDsXxRRIMBuMsr7GzvSOTnb63O/e/h1KLjmqHEVVVsRu1JJJp0oBZn2lnbtIplJh1JNIq0UQKRZKIp9I571Nq0dPh9mb/PFL1vqjKmv37sRu13HzJHN6ysoa55Zai5psJZ5fxDia3bt1KIpHg8ssvzz62cOFC6uvr2bhxY8EA+Ll2MHk2WVpj52+3X8ybvvfipEHwseIplTqXiaMDIcw6Je/3ykQHgCkV9nYHkIB1TS4cRh0mnYIK+MIJLAaFrW3eKX8fyIyG2NbuZWm1jWMDQaodmfafI+v5qjpH3ro52s2XzOHWN8w9bYLff9zRxfZ2L5F4CodZy4cubKLCJqo+BWEqdnf5ZiX4DZmkyYWVGg70BmakumZnh48rF1dQ7zIxt9yCJ5zgI6+bU3BNqrJPvb2xIMy2hx56iG3btrFly5ZJn/uzn/2MRYsWccEFF4z7nHOlMudAr5//efoQf9/Xd0Lvs67RxSvH8jum1TqNVNsNRJNpoolUwdFhs2UkibLaYUCWpOyfi7Gw0orNqEEi00koE8xJoJElTDoNnnCcgUCMxVU2BoOZZHKJTHKSTqPkJO0Xo3UoTKVNT6lFl32/8agq2YrzQ31B1tQ72Fpkm+E9w+cExc4mT6uZpPwDvQF+u7kDCYnr1s3cAb2qqmxp9eAOxblqScVpsw8WhNmSLrBnGwhM/G9+NHcokU2UMemUce8tp0su8G8wmQZPOIEnnMhJ9nGYtNQ7TRh1CoFokpahELFEijqXecbPfqfqTcuqTunnC2eHsrIyysrKpvXaHTt2IMsy5eXlBX+u1+sLVoYL03P5ooqcALjdqGF+hZW0mrknH53sZzVoWFhlY0urB7NudsKMW9s81LmMqMSzIynGmlfESN4u7+R716kGvyGzbx8tmUpz34vHeP95DVN+L2F2iAD4LFpV72RhpTUn2zCRUovKSilEp5GzVcT9gRjrGp10+6J0TeHmczyyBHu6fHktv+xGLfUuY8FFZEWdnVgijUEjk0ilsu8TjqdQyczm2d7hLfh529s9VNoNEy4s/kiSDU0ufJEEPb4o8WSaZDoTnE+nVaLJFIqcuYkuteioshtoc4ezh6Nt7jAus451jU4O9wezlTybWtxc2FwybutegIFg7nWNvqldWGlFp5HHbc02GIwzFIyzrtHJS0cyBxdaRaLErKN3OPtzbFZ7uVXP+c0uZCT8kUyQfGQ2hcOkZXmtA5tBg06Ref38MtY0uHjdgrJsdaRw7pnoYLK3txedTofD4ch5vKKigt7e3oLvd64cTJ6trAbNpGMWxmMbHp8wnTaZy2psGLUaBgKxvBmLa+qd07qe0fYMH0LYTFpSamb9VdWJZ2a+fXUNd79p0Ql/drF84QSvtbmHO5KUZIP1o5VZ9Jnqg74AOzu8/GVnD3+77WLsponHhgiCkPHknh4++/juWf2MTS1umsvMmPUadnVOL9BeYtaRTKtU2Q38v0vmsHbMzbAgnAk6Ojq4/fbb+fvf/47BMHGyViQS4Te/+Q3/9V//NeHzzsbKnGgixd5uPzs6vMP/58nphjMd1XYD5TY9rxwbos5ppNZlwhOKE0lkqmo6PRE6PRHmlJnzxmGdLMmUylBo8oB0hVVPqVWPUaugDI/T0WkkBoL5e8YRLx8dotphwGHS4oskaC63srXNk3emUoxef4y1DZkufFOpnEwW6FI3kSk+fdYMBGJ89DfbssUBt75hLh+/Mr9KThDOJjdd2EibO0QipaJVZBRJQpYYd42ZyETng9Nl0BbfldEbTuANH99/SkBzmZlkeuot02fSnDIzTaXmU3oNwrll48aNbNq0iUsvvRSr1crGjRu58847ed/73ofTeeJnTMLkLppXmpNE6IskkSSJra35nR0D0SRbWj2c1+RkYJKkwxNRYtZPGP8qZrxEpU0/YRxqZZ2DHePEscYzp8zM+c0lOY/1B2L817WLWS/OAk4bIgA+y65aUjnlm7VCyiz6vAzvkaDsoiorRq1CpycyYXa0Ra/BbtJS6zDiiyRIqypmvQatLJNGzZllM8IXSbC7K0GN00id04gvnJlrqJKpbhlrSbU9G4CWx4nNGrUyaxqcvFJgDvhobe4wbQVmLoxua97ljbChyUVKLXz9ZRYdOzt9qKrK8ho7u7p8LKm28VqbmzKLgSXVtoJZnrVO07it13QamT3dhQ9GrXqFRdV2OtzhnMr3REqlxmnKBsDzXmfQsKvDlxOAsug1/PiG1VyxuCKvlYZwbpvKwWSxzsaDyXPJ/S+3TmtGD8CeTh/rGp3s6PBOeebiRBmWPb4IDpN2Sm2EC3GYtGwbriTv8oRZWGVjfZOLHm+EjuENsCxlqmquWlLB19++/IQ+r1jtQ2G++8whntrbSyieYlGVjeW1joLPvWBuKRfMLUVVVZ4/NMDDr3UQS6UAEQAXhGKsrnfiNOmmXAU4VSN7v6ZSM3ajdko3wNetreWtq2poKDGjSBKVdtHlQTgzbd26lf7+flavXp19LJVK8cILL/CDH/yAWCyGomQO9R999FHC4TA33njjhO95NlXmHBsI8rOXWvjjju4Zawdu0SmsqMt0Nhtpg9vhiVBuMxQ8Syi16HmtwCHkyVDlMEy6FisS+KPJvDmLGlmioWTiWbIjndjKrXp2Da/BgWiC9U0uYskU6bSa3X8qskRaVccNQr/W5mF9k4vNUxjFE51CEGxNg2PCpMzJTPZ3UaxYMsUHf7GZPaP25d//5xH2dvv5zJsWMrfcOiOfIwinmwM9gYIdx3QaOadC8VSocRiza9h0qMCR4X3pVNexmVTnFPO/hZNLr9fz0EMP8YUvfIFYLEZTUxN33nlnznmlMLv0GoXr1tbxo+eOZh/rnyBwLEuZcTknOsJmPFpFom0oNGGHysP9wbzRsWPt7PCxtNqWLbQZTSNLHO2fevzuXy9qynus2mEsWBgjnDoiAD7Lbr9sHhuPDbGzw8sbl1biiyTo9UUnDYprZYmV9Q5UoMcXxT9BAGGkJTYcr4TWKjLJtEo4niIQSeAOxwnGkgRjSarGuZGeSJcnQrlVz/7eAGsanGwd50Zv9CFAoeybWqcRScq0F1OkzA3riRiZY67XSKxrdNIyGMpmKNU6jdnKcYBuX4R1DQ52dPhIpFU6vRG6fRFqHMa8NhiFFtVyq56mUvNwNbc+7zVNpWYGg7FxN6Zbh2/At7a6c+aJL6iwcqQ/kPOYLMEP3ruK1y8o3N5FOLdNdjD51FNPEY/H8Xq9OVXgfX19VFZWFnzPs+lg8lyhqiqSJBGIJvjJ80cnf8E4EmkVbzhBhdVAZxEtgYrV7YtO+PuiWPPLrdkRG/GUmq3MnF9hoaHERIXNwKG+AOsanPzPdStnfRxENJHisW1dfPWv+3KSlg70+vnGkweIxFOE40ke/LfzMOpys/4lSeL1C8rF2i4IU1RuM3D9ujq+/88jJ+XzWgZDuExa1je62NnpJTbqEFWWoLHUnJ0vWeMw8rZVNdx62dyi5ooJwunusssuY/fu3I4LH/zgB1m4cCGf+tSnssFvyLQ//5d/+Zdpt7Q8E33i0V1F7W1KLTqayywkUum8GbUjZAk2NLnY1xPg2GCYErM+J2jc74+i18g5axBAMpmmzKLPCzDPFlmCtY0uQrFkwST40QwamcXVtoLfWZIywftANDluEL3OmTk0PNgXIDF8U97ljdI1akTZhiYXqbTKgV4/Jp0Gi15DiUWX07VNp5FZWm2bciWow6Qr6nnNZeZpj/oZ8Z1nDvGNdyynoWTq1ZWqqvLU3j4UWcITiucEv0f880A/29s9bP3PK5DFrHHhLNPhDvPZPxTuDuQy66bVxnYyGlliTpkZh1FHSlU50OMft4tauS3/zHC6Nre4mV9hOaljL0YkUqc2kUA496xevZpXX331VF/GOW9pjT3nzx2eMBpZKlh4k1ah2xthTqmZY6P2XXPLLbjMOkKx5AmNmFBkCYN28nM+d2iSsTdA21Co4FjeplIzh6fYsdmsU7h2eTWQGePY7g6LjhmnKREAn2WyLPHxK+bzyNZObthQz6rhlrA9vgjHBkL8dXcPD2/pyFtAltbYip4lNdpgMD7hnCtZgsHg1G6UZQnmV1jZOZy9mE6rLKq0crAvkBcothuPV7Pt7fazoclJlzeaaWFWZuZQXzDbWmjsvCyzTqHcZqB1MMRkYXFFArtJh02vwahXMGhkDFoF3ahKaadJlzObzBtOsC3kzQk0m/WavE2pVpFoH8q/Ua52GLOZREurbXmviyZSRCbJGN/c4mZtg5PtHV7et6GeSxdmgiC+SIJQLEUoliSWTPHGpZUiU1sY12QHk3V1dWi1Wv7xj3/wjne8A4CDBw/S3t7O+eeffyouWZghA4EY//KDlwAYCsYx6ZUTrrCGTLbk0mrbjAbAIZP4M90g+MJKK33+KNs7Cr925ACgbXg0yPXr6rHoZ3db89TeXv7n6YMFDx9UlezMz7esrC5qgy4IQnFUVeUPO7pOymdpZYlVDU62tXmyyTejpVXo80V57/o6jg2EuHJJJSvrHSL4LZw1rFYrS5cuzXnMbDZTUlKS8/iRI0d44YUX+Nvf/nayL/GUiSVTHOqbOJHcYdIyv9zK1jY3m4JuLHqlYOBiaY0Nh1HHS0cGs/fFZVZ9TnJ2hydScB+VVFUaS81U2AwMBKMEYymC0eSk99DTJcGk1Yd1LiNlFj2ecGLcgH8ipbKpxc3qekfBAPjKWgc7Or3ZDj/jGV3dE4yl6A/E6HCHWVxlA8CsVzjQ48cdyswWL9aGJhfb292sqnegSNJwhTnEkynC8RSDwRie4X23y6w74UqnV4+5ecP/PM/SGjur6hysbnCyut5BjcM46fzuh1/r4FO/n3w0SJXdKILfwlkpnkoX7F5m1MrEpjkabCKZ9cGTs5bXOAx5AfDFVTYMWpl9MzxP/ESLh6YrOgt/l4IgnN5UVeXRrZ05j6VUqHcaaS/QqRcy8Sh3KI5Fr1BlN4IEx/qDHOnP/HxFnX3SJMrxlFsN437uaFbD5OeBgViK19o8OR2Bl9XYsomWzWVmdBqZ/T0Bah0GKh1GJCAcT7K3O/ce4O2ra7NxsEO9fn7w7FF+eMNqhNOPCICfBBvmlLBhTu48gCq7kSq7kQvnlvLe9fXc+bsdOZkmxwZDeZkzJ8qklVnb6OKFw4NFPb9xVGXd6IrxkbneZp3CvAorWkVCQmJLq5sdHV4unldKJJ5CkkCryPT4oqTSKjpFzga/dYqEVpGZV24hlVYps+rZ0+WjdSjE+c0ldLjDeMMJ7CYtZVY9GlkinkwzEIzhj2Qq2d2heDa7R6tkbupW1DqocRpRybQvW1BuocJuIBhLYtZr6PZGsjeqdoPCgkprTqtyi17Dsho7iXQa1EzwP6VCMJrI2fjpC1QY9viik7YmWlXvoHUoxH3vX8NliyqK+u9BEMYq5mDyX//1X/nYxz6Gy+XCZrNx6623cv7553PeeeediksWZkiZVc/33r2KWx7cRjyVJh6euYzstqEQi6us7OsJsL7RRTKdqVhaXmsnnkwRS6r0+6PMr7CiUaQJk7QkMr8jgvFMq8rp8EXi2UPGybxrTS2XL579NVUCbAYtt182j5X1Dv7jwW158+IumlvK19++fNKDS0EQpsZh1NHBiSXpWPSZWbQaWcZl1mHRK+g0CpFEisTwQao3HJ800BNOpIgn09x11QIx51s4Z/385z+ntraWK6+88lRfykmj1yj85zWL8gKPI53ChkJxWgaCOckzwVgqJ0m8zmXEbtRmK3ZH7h/XN7pIo9IyEGJhpYUDvUGW19gLJhGOdMMZa0FFJkl9pq1ucE6anO8w6sYNfI81Mt7LolcIxo7vo3QnkDyYSKsc7g/kBMT02mRetdKcMjOqqtIymKlkWl5rR6PIhGLJbGB9+wTfY2GlhWSaaRUrFJJKq+zs8LKzw8svXmkFMhVT97x9GevG+f2STqv8fltxSWEb5ojfUcLZaahA4c/aRieH+4JF30NW2PT0jTOmEKDGacRh1BKJpzjSHyQ+JuDe5Y2yocnFllY3aZVJ2++eiJZZai08mWLm6gqCcHZ54fAg/zzQn/d4pX3iQHRazex7C1VSa04gGa/Mqp80AK6RpQn3b2N1eMJsaHKhqiq9vijBaCK7hrvMOlbVO4Z/nxzv9LGi1k48lUYCTDoNF849Huv7w44uDvX5iSaSGLQi3Hq6Ef+NnAaW1tj5y20X0TIYwhNKYDNqSKdVnt7Xx9/39RGIJqfdOseiU2gsNWPWazjQG6DbF2Vtg5NEKk00kaLTE8n+Q66yGyix6DFp5Ux/MlTiqTSNJWZshhht7txrCMVT2dmIspS5UQvHU7hD8WwWzdwyM6nhG87NrR7WNTrRyDKH+wO8cnSIOqeRDk8kG+hf3+TKmQ0eiCVzqrhHNJWaMekU9BoZjSwTSaTY3eXLa2ExtyxzEDG61YZRq2DSKTSXmYkNt49LpVXiyRTBWJKNx/Jnk49kBpVadDSWmNEoUsG5QpuHM9oL3fyvb3SxudXNx6+YL4Lfwqz7zne+gyzLvOMd7yAWi3HVVVfxox/96FRfljAD1je5+MfHX8fqL/+dVFqlucycTfCZqAPIZAKxFO3uMBfMcXGwL8j8Siuvm1/Ky0eGcg4OPeE4vkjhQ4Uah5Eap5HdnT4kSWJxlRWdRkanSHkHBhNpLjOT2R8XV7Uzt9xS9HufiCuXVPL6BeXoNDKqqtJYYmZfz/HfL5IEn3nTorzW54IgnLhqh4HdXdPLGh+hyHJ2/RqapEXaWMtq7Mwtt7C/x895c0q45fXNlNvEnG/h3PDcc8/lPfa1r32Nr33tayf/Yk4xm0HLyjo7siQhyxKJZJqdnb4J52Lv7/bTVGqm1JIJEneMuq/ucIeZW2Zmc6ubSpueoVAcbyTB+kYXrQW6khWiyBJrhjvNzYZQbOIKwLnlZvZ2F78+J1JprHqFKoeRaCJNpU1PSgWTVmFxlS1nbzUViZSKRCZg7w3HaRnMnRdZZTdkx1fMKTXjj45frT6eA72z34L4SH+Qd/1kI1ctqeDqpVWsqndQYTPQ5Y3w3MEB/rC9q+jfh6eoaFQQZl2hfwOvDSemjG5vO7/CgsOoZWenD6tBQ1OpOVtc0+2NZs/pIHNP6TRp8YQTmPUKOzt8dHkiyFLhMYmQ6UixvNbOkf4g+6awDk5HtcNAt3fmW7tPJBxPTv4kQRDOKqMTN0c72OtHq0gFu29MZmeHlxW1dnaOk8Q5EaWI4hKXWTfhXnwsfyTJQCCWjUctq7FlE5hGF1yOLnQce+3XLK/K/me7SUcwluSpvX1cu7waRXTfOa2IAPhpQq9RWFhpy3lMp1H4/j+PUGrRUWrRTSmwoVUkVtU52dHpZc+o4O/YoIUkwevml9Lrj3GwN0BPgTk5ZVY9yiT/btMqHBkIcvG8Uo6MyvRpHQrlLI5tQ2G0Gjn7XSxj2lOMrhRUpMzNayyZxhOO448ksRs12I06nCYtLx4enLTNW38wxvwxrcTnV1jY1+Nnc6sHh0lLjcOQ18ZiLG84Qa3DSOeoAFNzmblg27NDfQHWNzlJplS0w1XvOo3M5lY3Cyut3HLp3EmuWhCmbuzBpMFg4Ic//CE//OEPT80FCbNKp8gsrLRi0WvwRRLZSqDltfZxq4Imsr7JRVpVaR8Ks6XVQzKtcqw/SDSZzhvR4YsksOg1zCk1s7fbj0mvodphwKhV2NHhzUnY2tcTwKrXYDVoWVRpJZZKI0sS29ozBxKyJLGoyoqERGS4y0ZKVTncF0SrSMwbnhl0uC+IOzz+78CXjgxy8+uap/y9p2NkxrgkSTx2ywX0+2P880Aff93dw91vWsTiatsk7yAIwlRJksR/v2sFe7tfoNMz/YO/BpcJbySBOxSnxKyj0m5AVVWCsRS9/uiEc8MSqTQfv3I+tU7TtD9fEIQzWzSR4ot/3kevf2rrUDCeYolFz6YCYxVSaTUb6I4l09l7zEIjGMaTmTsYoneCSsYTsa/Hz8paB72BaMG5ui6zjiP9xVcnJlNpArEUNZJEuzucU9WzrObE9lFLqm0Fq+ZNOgWnSZc975jJTnuz5am9fTy1t++E3mNBpRirJpydVtbZx/2ZImf+tx+IJIgn02xu9aBVpIIjI/d1+1hd76Dr/7N33/FRVen/wD93em+ZtElvJBASSgKhiSgoIHYXGyqWVde1IKwNKyqIurqylrV93dX9Kaura1l17QKuSy8h1EBCek8mmd7n/v4YMmTITDIJk/68Xy9eL3Lnzp0zN5Mz597nnOdptwXcy+yqt4RmJbUGSAVcmHqZLHQmPCzAAQO5iAeTffCC0qFqnBNCRq+cODkYpvskOoPN3a2cbbjcXl8AuShNg+KaDjjc4WWX4HMZ2N2990P9KfditJ+KkR2oCz75srimAxN1ioDYWqd/7a3FTbPTAABRUgGyYuR44ftS5CUokR49OIt0SHgoAD5M2V0erPpnMQBfHYUpSao+BcCnJKt7Td8I+Opa76lqD0g91m0fpajHGToKEQ/j4xVoMTnwy7Hu6dWnJqthOZmCvLbDCpPdhfxEJaR8LppOm52zu6odU5JUYBjfRenpnaovgO8LruTq5L0Gro02N3ZXtWNykgrFNR1QSfgobTyVGq3D6kKH1dee400m2EKk9zl9Bb5MwAWPw0GuTgGDzQUWQN3Jlepmhwc7K061OydO7p+des/8LJoFRAg5Y2IBF3eek4H7/rkf1i79Fsv6Zq7Xtdtgd3vA53bPVNEpUS2GQsQPme43WiGE2e7uNnGq3epCu9WFmnYbxHxuwOzIYEwON5KkYuyvM/gv1mPlQshEvlXrxSHqALk8rD91UopG0mMA/L/HW/G/slbMztSG3GcgiPhcJGnEWFqYhOWzUintOSEDSC7iIzNGDrcH0MoEkAp5ONFiQYs5/IBPSZfVQjlx8m5pKiUCX5YgqYAHpZgPEd+XzYE9mRXpr79W4K5zs6CRCiLzpgghI8q/9tb2OfjdqdFoh04pQv1pAWS1RAAGQJPJAbmI36+60goRr0+1rvujuLYDPI4vq9mRBiNMjlMBmGCpiHvC43LAwDfpsWtWtVydIuQNyHDwuQwUYj6mJqtgdXpgtLkQpxSBy2FQ3mzu98rykerC/HhcPjVhqJtByICYmqwOqOHaaUK8HEcaTTDaAoPEoVYsmp2ePmeCCGYwAsW1HTaMj5fjeJO52yT1gUI1wAkZe0R8Li6epMMXxfXdHuvrmO90Oyr0mJKkgodlcaLFArMj9IQexcmsHeGsGm81OSDkMXC4w+8beZzeS+843V5IhMHDpya7G1anGxIBD1cWJmHuuGj87v/twb7qDgqADzMUAB+GLA43Hv7sQMBAbl9NBzKipeBxGJQ29Z52K5yaqzIhD8zJ+gw94XNDdwhyIQ98LqfbDcQJ8XLIhHw0Gu0BjxWmqNFkaEdJrQGFqeqgM6+bTHZwGQYdIer2SAVcjIuVw+1lUZCiBgNfh1TSQxqwzpCE1elBgkqMitNet6TWEHTwHIr55KruA3UGaGUC8DhMt1X6Ih4Hk5JUcHu90Ej40FtdNAObEBIxF+TpwGE42Fbein/sqoHT7fVPthFwGbAskKQWw8sCzUY70qKlYMBAeHIFM4dhsLNSD16QLj5XJ/fXpuyJLcwL4hiZKCDdZ5PJ0W0CVCgFKeqgK3lOd6zJ1O8AuNnhxtayVlS1WbF8Vqp/lXc4mk0OGG0uZMVS/07IQLI43Nha3gan2+sPQIn4HExJUoHP44Q18RMAJHwOJiQocTjImM/q9MDq9KAV3S/sZUIe1l2aR8FvQsawGelRkAi4sPYj0FGltyJZI0ZBshoGuwtqCR8muxschoHN7UF2rKzfq5KzYuTYUx2ZmtQ9cXuBnZV6pEZJoJDwESUVQMTnQsjlIEomhMXhDut6ur7DhjlZWpjtLqRFSWF2ulHXbgta+ixcSWoxHG5vQDk1AN0mHIwlDy7KgZBHZXnI6MQwDOaPjw3oc3Li5DjaaOp1xfZIdqTBFPb1cSTMzYoelNchhAwvT10yEd8fagq458cgMpNi9tX4JlVmxMhR2hh8YWOcUgQGbNgp01USfp9LQkqF4Y2RHCHec1WbFTf9bReWzUjBxZN0iFeK8co1UyHih38/kQwOCoAPI063F//YWY1Xfj4e9I+2czZ4RrQUKjEfNXorkqKkOFRngP20FX67q9pDpugGfKnP07SSsGZYNxhOXYjGK0WQCLhoNtphcniglgoCUpZ14nE4QdO27a5qR6JaDJ1KDD6HQZxCiEajAwyAyUkq2Fy+FJQaiQDT0zSoarOgyegAj8NgXKwMMiEflW0W7DtZe7zT9NTAmmdKMQ/jYuWobrOAw+H493e6vWg1OzA9VY2dJ1eX58TJ4fGyaDU7/IHqcPC5DKalqnGsyQy9xekfZOcnKiHmc9HUJfgv5nNRlKZBZasFGTQLiBASIYsmxmFhbiz2VncE1EHrrLfd+R2gkQhCBrRPXyAuE3LhCS8bUdgsZ1A7zGhzQSbk9jpZ688/HceSvPg+1+S1uzxY8vJ/UdVmRWqUBFdOS+pTADxWIUIs1QEmZMD993hrt4wWdpcX+2o6EK8U9TiG06lEiFeI4PayEPK5YQfLuzpvQiwmJoROt0kIGf2UYj7OJNdLtd6Gar0NqVESOD1eONxeVLRaUJiqxqF6Y79qKgIAr7d6ZRFW2ea7/q8LErBOVIsRrxT5y4EBLBiGgcvjhcfLgmV92TiaTqZrT1CJ4PKwmJ0ZhSNhTkYPJl4p7lPa+LHgm4MNuG3u4JQIImQoLMqNw8s/HQfgu+fWYfXdl1OK+bC5PCEzoY10e6raA+rSDhSpgItHLxw/oK9BCBmelGI+bpiVgje3nADgC34X9jP9eTAFKZpuiyk7ZcfKcazJ1GvZ2676WhoiM0YWsuzF6Xq6n7mjQg+31wuP14vLpiQiOYrKpQ1HFAAfBjxeFl8U1+FPPxwLa9ZzZ0BjarKqx4GPWiIA4NuXxwE8Xvg7j/wEZdizaOKUIiSoJThUZwioEa4Q8aAQ8RAlFcBkdyE5Soomgw0mhwcM46t/0BYkLW5tl9ndE+LliJIJ0WCwBwS1O6wunGi1QCHiYWa6BkcbTTjcEDrd+Z7qDkxP0/hSqXlZnGg1Y1dlO9QSPjyuwI7KZHdjV1U7ZqZrUNZigZjPhVjARVmzuU+dK5fDBO34PV62Wyduc3mwo0IPjVSAghQ1VBJaPUQIiYwviusDgt/B9JQ+/HRmhwdyUeSGBwoR74yOd7zZjBi5ELEKEaJkwqDfdzFyIdotTqz8ZzEevmA8smPl4PWQvaSr578tRZPRjt8UJOLBRTlQivn9bishZOCwLAulmN+tLAMANBjsSNKIoZEJoLe4/DdAO4n4XOw5g/SWeQlKJKnF+KK4DpdMpnSyhIw1dR02/HNXDTburO53mttpqWpwwcDp9cLi9KCk1oCCZDUqWi2wOjywnUH63OG02LG2jyu56zp89xckAm7YE9E7xSqEUEsE4HIYCn6fZn5ODC6l7ysyyk3QKbDuson45kAjEtVi1BvsiFU4cfMcX03W1zeX40SrZVQGwndW6DEpMfz7uv1x38JsxCvFA3Z8Qsjw9tCiHMQrRHhzywlEyQQRC34DCBov6iQVcvs0to2SCpCgEveYGfh0akn49/3Kmi1IjZIgWi4Meg5cbhbr/3MUczKjES0Xhn1cMngoAD6EWJbFz0eb8crPZSg+bUVzb2LkQv/M61CpGDgMAz6HgUjARXasHG0WJ4Q8Do42muBwezAhXo6adhtiFSIoxXzwOAycbi+q2qwBwRKb04PDDd3bZ7S7cbDeCA7jS5PeOXMmRi6EiM/tsTPrdLjBhHilEBnRUmTFyOBlWRhsLshFPHAYBnaXF9tOBL+YTY2SwOH2oMHggMfLBg2KZETLsDtIaqDpqRpsP6EHC/jrpeXqFOBxGdSfvAjnML4ZTxI+D8W1vvcv4nGgEPMh5nNgD1Ev/FC9ESkaCaqCrIxvNTtw7dvbsebiXExPi+r1/BBCSCh2lwdvbCnH+9urInrcnDhZRAe2RrsbuyrbkZ+oREk/L9CbTQ40mxxQSwRQinkw2NxgAExL1cDp8WJ/bQdYFvhfWRuWvPwrpAIu1l+Rj4sn6Xo99uMXTcC952VBwGEgEtCwiJDhanFePGZlaPFzaRO+LmnAj0eaAx7vWmYB8E2+UUkEkAq4EPK5SNNK4fF6weNwwOUwOB7mjG8uh8HtZ6fjwvze+xNCyOjCsiy+LGnAw58e6LFGYThMdhfqO2wAw8Boc0PIY7C7qh3ZsTJUtfUv9Xmn0kYTpqdpcLTR2K3u7UgR3eX+RjimJqtwoPbUSnIS6NELJ/Q5KxIhI9GyohQsK0oJ+tieqnacCJEVczQobTQhTSvtVuIxEvITlbhhZmrEj0sIGTkYhsGNs9NwyWQdVny0v9vj0TIhRAIOmgx2fxbKvpIJeciJk6Pd6vQv+ORwws9spFOJIBVw+xT8BgBHHydGVbZZESULHtwW8bloNjnw27/vxkX58fjtWel9OjYZeAN6p/fZZ5/F6tWrsWLFCmzYsMG/fdu2bXjkkUewY8cOcLlcTJ48Gd999x3E4tAzy1577TX88Y9/RGNjIyZNmoRXXnkF06dPH8jmDyi7y4O7Nu7Dj0eawOcyKEoLnvohXilEvFKMug4bJAIeomUCeOFb6dJ8cmZ110AsjwPk6pRoMtphc3kwMUGJfTUdAUHgZI0EgO/G35RkdbfAMZ/LYGqyCntPrpSR9bJyz8sGdhzNJgf0FgeSNZKg6dFP12BwoMEQ/MKVz2WQES2Fl/XdyOysYVWtt/ovkCclKlGjtwadMX60wYg0rRRurxcxchE4jO9G5o6Twe+uDtUboVOK4HR7/auLmowOKEQ8TE/ToLzZjDaLE3Z/3VobFCKe73wyvnNgd/lm7zvcHkxLVcPh9gYEfHZXtaMwRY0r39yOSUkqzM+JwRUFiUhQ0axKQkjfPPBJCf69vz5ix8uJk0PA40Am5CEzBmGnAwrXkQYj+Fwm7PSeIj4HeQlKmOwuNBud0MoFYBjfd55EwEWuToEmkx1VQW6W6lRixPZh5qWIx8W6rw/jvAlxmJPVvzrihJCBp5TwcdmURFw6OQEbd1bjkc8OhtzXaHfDGCIVGocBitI02FPVDncvhSI9XhZtZie8XrZPF+OEkJGr0WDHp/tq8cme2ogFT442Bo6rHG4W2bEyVLfbzmj1NwAYbC7sPJltLNR9heEqUSVGjCL8Mdv0NA06rE7/vQrS3aREJXQqCn6Tse1P35fii+J6OCNd22sYsbu9MNvdIbNv9heHAZ65LA9cGvcSQgCopUK8eV0Brn5rG/bXGpATJ4fR5kL9ySzBOXFyHA1RyzsUm8uDSYlKHG8y+WNWqSfThzNhdj1Tk1XYX2uAx8tiQrwcHi9Q225Frk6JyjYLmk3BY01CHqdfY+9jjSZMTvIt7Am4hXDy3oLB5sKffzyO2ZlajI9X9Pn4ZOAMWAB8165dePPNN5Gfnx+wfdu2bVi0aBFWr16NV155BTweD/v37weHEzpV6UcffYRVq1bhjTfeQFFRETZs2ICFCxeitLQUMTExA/UWBtQ/dlbjxyNNAACXx5cye0qyCvu6XMjpVCLYXd4uF3eOoDP7jjefmvXn9vpmnjQaHWgMMRu6a1B6Z4U+oB52Z3v2VndgSrIKQi4X2yva/I911rf2siw4DAMvy+J4sxkdpwWf3V5fvfBwAuA9cXtYqCQC7AmyirvT/loDYhVCJKrEqO0IXP1jdnpgPnnOOlcGxStFmJamhsvDgsswYBjfKvdGox31Bjt0KhFy4uTYX9sBu8sLo90dsraO0e5Go9EetGZ75/kvTFVj98nzy7K+yQtyIRf7azqwv6YDn+yuwZ+unozCFE3fTxAhZExiWdafveJMxSmESNJIAlZ9a2WCiK4kYhjf5KvyPtxEzk9UBfS9YiEXx5pO3TwOtUr9zesLMDtTC5kw/CEOj8Pg0QsnnKxVSQgZCfRBxl7h8rK+el3xSiH4XG6v49XKNgsFvwkZAww2F5779ig+3FmNXubGnBEeB4iWi1DXYT/j4HdXeotzxKX6VUn4YQezlWI+9lW1wzWQv5xR4M3rC/0LBwgZq+5dMA4rzxuHx744iPe3Vw91cwZMi9mBzBgpzA53n1c0hnL19GRMTFBG5FiEkNFBLODiL9cV4MFPSvC/8lawXYZi5S3hL54RC7gYHycHh2FwvNkEa5dFnZ0LHZuMdkTLhT3e85QKuLC7PPCcHBN2LZu7s1IPPpdBskaCOIUQLACLw40jDb664vmJyn5lvTQ53LA5vd2uEbret5wQrwCfS/cNhpsBCYCbzWYsW7YMb7/9NtauXRvw2MqVK3HPPffgoYce8m/Lzs7u8Xh/+tOfcOutt+Kmm24CALzxxhv4+uuv8de//jXgOCNJsBW/+6o7MO1ksFQu5sHtYaEPYxaflwWsTjd0KhHqO+ywOPsWrNhZ2Y5YhRByET9gxZ/T7QWfwyA/UQmb01cTNtjF6eQkFRp4NiSoxOBzOdhVqUdOvByt5jMPzrAAShuNYBgEdK6nazI6IBfxUJCi7jFYDvgC0FEyAQ7VG7sdUy7kQS7iw+bygEF4HZYvkA6EWtS4p7IdWpkAbi8LpYiHKr0NYj4XKVESpGmlKK7pQAulbiOE9MHRRhO2nWjrfcdeZERLYXN5ug3+Ws1OtJr1kAl5KExVY09le681eHgc3+SnyUkqmB1usCwLl8cLxclSEg63p0+rktpP+/6LkQtRF6Km5KyMKFxblIzpaRrEyPu+4oXDYcAJs88nhAwNlmWx/YQeVW0W2FwevPzT8TM+ZoPBgXStFAXJahjsLlS1WYJmqehpDEoIGflYlsXXBxrw5JeHIzbBMJTpaWocqDWi4eSqmUgpSFaDx2X6fC9gKKklfDAMkJegxIEwUldmx8lDTkwnpzz/7VE8smQ8VCfroxMyFnVOXFx7aR7StDI8/dXhIW7RwClrtmBKkgr7+lha83QM4ysxdv/5Pd+jJ4SMTQkqMXLi5Pi1rDVgu8vDYkK8AhIBF1wOg50V3bPuAkC6Voq6DmuvEx9tLi/kIgTNbjElSYVWswM17baAoPfpXB4W1XprwET36Wka7KzQw9rPyaf5iUocrg89XhXwOHjpqknIjJH36/hk4AxIAPzOO+/EkiVLsGDBgoAAeHNzM3bs2IFly5Zh1qxZKC8vR05ODtatW4c5c+YEPZbT6cSePXuwevVq/zYOh4MFCxZg27ZtIdvgcDjgcJy6eDUajRF4Z5Hxp+9L8drm8qCP7apsR16CAlIBD14WIdM1nK7J6ACfy2BGmqbbKuhwn8+yvpQNLo8Xbg+LkjoDYuRCqCUCHG82Iy/Bl76Bc3Iln1LCh5DHhcXhRovJgVaTA1NT1PCywOF6EzQSPsbHy3HktA5pUpISh+qMkAi4yIyRoaLVgvbTVpDnJyoh4nNR126FxeFBtIyHaLnQv/q81exEtd4KqYDrrzdusruxp6odBSkq7KnqCPo+mZPtZ1lgTqYW/z0e2GmbHG6U9jFth8Hm8neiwbAAMqNl2F6hR1aMDFV6GzJjpLA4PNhc2oJrpidjcV58n16TEDK2ZUTLcMlkHb4o7n8KdI1U0OuKbLPDjd2V7ZioU4DDMBALTq0mYVmAha8/Von5aDY7oBTxUdzlwpvDAN4udXnFAi6mpapDzrbM1SnQYnLAaHeBPS3idHqmkU7XTE/GM5dNBBNuniRCyIj1zq8n/LW/45QiJChF2HOGaXBPtFoA+PrCrFgZWk2ObuPSktoO2F0eiPi0oo6Q0aa23YrHvziEn482D9Lr2WBzRW7VdyeL09Utzfpwl6AW40CdEfmJ4a00tDjcUIp5MISRnSgzRga1hA8AKK7pCLsEz3Al4HEwPl6BvAQFMqNlMDvc+Mvm8qA3cT/dV4dP99WBYYDLpiTgxaWTaJxMxjSpYPSP3/bVdPS5BAaHAeZkRaMwRY2pyWpMSlJCLuIPYCsJISPdldOS8H+/VnTbfrjhVNwtI1oa9F6jRiY4ee3du2aTA0kaMdpO7j4tVY1Gox3Hmkyw9DOAXVzTgTilCG2W/k12FfG46CnRxoLxMciOo9Tnw1HEA+Affvgh9u7di127dnV77MSJEwCANWvW4IUXXsDkyZPx97//HfPnz8fBgweRlZXV7Tmtra3weDyIjY0N2B4bG4ujR4+GbMf69evx5JNPnuG7GRiXTknA1wcaQgYemk0O6JQcFNd29Om4Ih4HBpsrZJCgN80mB5pNDuQnKlFycgZ257bOgVRmjAwSAddX1/q0xYenB4FTtVIcbjBCKxMgXSuD0e6CQsxHXbsNbi8Lo92Nww1GTE1Ww+1hYXG6wOVwwOUwAangJyUqsb/W0G0ygJDnW6Pt9HiRGiXxp8oIVg8WAMbFynCsyQwvfPW+ASBJLUaUTAghj9PvWmkaKb/bSsXTHao34OxxWlidHsTKhThQd+qL4ZLJun69LiFk7BLwOHhx6SQYbC5sLm3p1zH0FicyY2Rh1fo+eLLPjJYJ0dJDdo86BE7AOj01kM3pQU27DTIBF+aTg9bJSSoIeRx0WJ04VG9EvFIICZ+LstO+I6vaLEhUi1HbZRX4pZN1FPwmZIxgGAb3LhiHnRV6Xwkagx2NBjvyE5UoawpMn9Zfx5vMQW8eHqo3orTRhElJqjN+DULI8MCyLP76v0q88F3pgASkQ5EIBqYKHYcZWWVctDIBDtYZIRfxcKQhvMUKh+qNPU4874rPZQImXMYrhUhUS/qV8nIopUdL8fLVU5AdJ+9WquerkoYea26yLPDp3jqsmJ+FlCjpQDeVkGHrqmlJ2FGhx2f76oa6KQNqR4UeU5NVva6u5DC++9J3n5uFNC31DYSQ8GXFyCAX8WCyh56MGGwiTVaMDA19XLBZo7chP0EBFqFLIPaF0+1Fo8GOojQN+FyOv1RuOMQCLpyenq8XrpmefKZNJAMkoldJNTU1WLFiBT744AOIRN1TkHq9vhtTt99+O2666SZMmTIFL730ErKzs/HXv/41kk3B6tWrYTAY/P9qamoievwzkR4tw7/umIWzsrQAAJmQh0W5cdhw1WT8uGou/nPPWbC5PH1Kt5gdK0eSRoojjSbEyIWYkqSCgNe3X69awkdegsIX3D5Ntd4XiChrNgd9HEC31Xp8HoP8k3VjdlbqcbTR5L9YjZELAQATdUpsLW/Dzko9DtWbUFJrCAh+T0lWYX+I13O4WZidHpjsbhhsLmRES09u92Jmhgb5iUoIeb6gSH6C0l87tmsza9ptAasV+yo/UQkvCxzvJYBkcnhQ12HDrsp2NA1wWj1CyNjA43Kw7rI83LsgCzfNTsX0NE2vSbw5DDA9VY38BCXEvL4HjVvMDuTqzmxGI5dhYHZ6wOUwGB8vR3FNB3ZU6FF6so9uMDigDzKRSykOnGxUkKLGZVMTKfhNwlJXV4frrrsOUVFREIvFyMvLw+7du/2PsyyLxx9/HPHx8RCLxViwYAGOHz/zFNsksiYmKPH2DYUBKV1Lag3QykWIkgrO+PiTk1RBJ0Q63F68+H0ppq37ET8ebsJLPxzDl/t9GThYlvXXHiOEjBxby9vw9FeHBzX4DfgCswUpakxNViEjWgrxGWSWkAi4KErTYHKSCqWNwyfjXTgyomUAALvTA7UksP9OiZIgO1aG/AQlitI0KExRY3y8HNPTNPB4WBSmqJETJ0dqlAQxciFi5EJkx8oxNVmFaalqxMqF3bLQNRgcYZc4G05umJGCiQnKbsFvAJigU/hXuffkTD5jpHevv/468vPzoVAooFAoMHPmTHzzzTfd9mNZFosXLwbDMPj8888Hv6FjGMMwSNFIkBolQU6cHCoJH5kxMv/9ytHkQJ0BWTGyoI9xGODyKQn4cdXZ+NOVkyn4TQjpM4Zhel3Id3o8SiMVoKrNgrqOvpf/abO4ekx13h87KvSobbdhWqoaE+JDpytnGF+GOKWYB5fbg+Kansv1nF6O0eXxwuIYOaWJRrOITj/es2cPmpubMXXqVP82j8eDX375Ba+++ipKS0sBABMmTAh43vjx41FdXR30mFqtFlwuF01NTQHbm5qaEBcXF7ItQqEQQqGwv29lwKkkArx303R4WRa8IBczS/Lie5zN20nC5yAjRh5QM6sznUSyRgy3h0V9mPXFzA63fxV1V0oxv8daaHkJCnhZdKtjtuNEO3Li5Gg1B66OruuwYXqaBs0mR483HAQ8Dg6GCH6frt3qgtXhxox0DQ7WGbGtXO9vu0QA/4r2UA43GJEVIwsZyM6MkUIq5MHh8qKs2QS3FyhMUWN3L/XGu2oM8XugzpAQ0l/RMiFumZOG+S9ugd7ixKQkJXgcDg7UdSBOIULVaTMap6X6VjZmx8kh4HP7XBcwJ04e1ndTKJkxMsTIhDDYXMiOk2NPH/rQaLnQP5EJAK6fkYKzx0X3uy1k7Ghvb8fs2bNxzjnn4JtvvkF0dDSOHz8OtVrt3+f555/Hyy+/jPfeew9paWl47LHHsHDhQhw+fDjopE4ydPITVYiRCwPGndV6K+IUIhSlabC3qh2ufgaki2s6MClRiTaLMyDbhEYqwJFGE1pMDvz2776JExzGlxr99rnp+PFIM66mGd+EjCizMqJw61lpePu/3dM4DqSugdkpSSrUsn0vXwb4JgLW6q39zmJ2ptKjpdBKhfB4WXC5DFiWhdXpQY3eCmOIVUE8DoO8BCXarU5/u11eFhqpAGaHG1anB0IeB3Ihz599KFzhlI6rbQ+eKW64WpIfj6umhf5u+dOVk+H1sti4sxp/31YJL+ubaFrRaoHT41t8Mj1VgxgFjWMGUmJiIp599llkZWWBZVm89957uOSSS7Bv3z7k5ub699uwYQNN3B1CFmfg/c4OqwsMg7BWTI8kLg+LNrMDMXKhv1/kMMAlkxNw17mZ/slHhBDSX/cvzMH3h5pCjr3Kmk3+hZluLwuJgNutBG24tHIB6vpR6rc3LAvsrzUgMzr0RCCFiI/jTeGXF/rPgQbEq0RQiPjwelm88tNx/G5eRiSaS85QRAPg8+fPx4EDBwK23XTTTcjJycGDDz6I9PR06HQ6fyC807Fjx7B48eKgxxQIBCgoKMBPP/2ESy+9FIBvJflPP/2Eu+66K5LNH3QcDgNOkFnILMviQL0BBSlqHK43wBYipSMDICNGFhD87qpab4OEz8H0NA3213TA0VOhAgBpWmlAcKGTweaCXMTD+HgF9gW5qWiy+waSGdFSaKQC6Lus0JOLgn/EHCcD3z3VUnS6vYiSCtDWS3pxwHdhV6W3YPuJwBsABlt46eBNdjfsLguK0jQoqe2AzeWFgMtgSrIa7VZnwHmZEK8AA/QpcAPg5ESH7gH//tauIISMbV+V1OOdXytwoNYA98l+uXNGokTARXW7Dbk6BYQ8DngcBi4Pi4Mnvy9KTwax5SI31BJ+t3q3ochFvH6vdJyarEK71YWtJ07Wz+hLmhMAx5rM/rSXSRoxpiSr+tUOMvY899xzSEpKwt/+9jf/trS0NP//WZbFhg0b8Oijj+KSSy4BAPz9739HbGwsPv/8c1x99dWD3mYS2rtbK7tNugSARqMdjUa7v1wPn8tgT1VHWMfsnKTu9vouhLkMUJSugc3hAQvfCm+5KHBCqJcF3v5vBf6xswZ3nZsJvcUBgIEmAivRCSEDb1t5Gz7cOfhZ4hJUItR12BGnEOFAnQESAbfX63TAlzVufLwcXpZFfYcde6raMTlJNSTZxQQ8DlrNDpwIUtJNxOMgP0EJkYCLEy1maKQCyEV8MIwvm9y+INnXjjaaIOJxcPa4aBxtMPY5+B0OPpdBo7HvK4+GyhVTE/HilZN63Y/DYXDdjBRcNyPFv83l8aKi1YIavRVTk9U9PJtEwkUXXRTw87p16/D6669j+/bt/gB4cXExXnzxRezevRvx8fFD0cwxy+tl8fi/D+L97d0XXbGsr3Z2rk6OQ/WRXWE4lPRWF1KjJJAJeThvQiwFvgkhEaUU8/H0pRNx+//bE/RxvcUFvaUjYNv4eDk8XjZo3KknLSYHElVi2N0e2JwesCyLFK0UEgEP7VYn6jtssPezFNrkJFWPZXXSo6UBWYp78/LPx5GqleDCfB3u/agYWTGyASt9RPomor8FuVyOiRMnBmyTSqWIioryb7///vvxxBNPYNKkSZg8eTLee+89HD16FJ988on/OfPnz8dll13mD3CvWrUKy5cvR2FhIaZPn44NGzbAYrHgpptuimTzh40dFXp8f8i34j1aLkROvBgWhzugk+BzGUxMUPb6h2h1ebGzQg8uA0xLVaNab0WTMfhFck8rAU12N3ZW6JGmlcLicAfM8tFIBahss6K8xQK5kIdpqWp/bQZ9iOC1kH/yTmMv8Y82ixMT4uU9pruYEC/Hzsozn/nu8rDYUaGHmM9FQYoaHi8bdEa9r265qremB9DKBN1WwneKlQ/fTAWEkOHJ62Xx6s9lIVdjW09OrDl08gbi1GRV0BuOnWl/wq2n09/g9/RUTbd+2uVhkaaVQC3xrfoJZyC8q1KPojQNlhUlUy1DErZ///vfWLhwIZYuXYotW7YgISEBv//973HrrbcCACoqKtDY2IgFCxb4n6NUKlFUVIRt27YFDYA7HA44HKfGQkbjyEo9O1J5vCxqelnBV9Ylm09hihptFgdaTQ6kaH2phjusLlS2WvwTOjv7QC6HwfQ0NViWRZPRgR1dJlXKRTyMiwk+adPscOOL4jpsLWvF9DQN7jo3KwLvlBAykPZWt+PGd3fBGUbgOdLqOuy+VN5eFjIRF2XNFuQnKmGyu1DRGrx/S1KLg9Y/7LD2PlE80tKjpVCK+SHvQ9jd3oDsa6GugU+Xq1Nga3krXJ6BKSnh8rCYkhR8PByMiM9BtFwICZ+HE61mf7u4HGZQyl6k97AiqTd8LgfjYuUYFxs6rScZGB6PBx9//DEsFgtmzpwJALBarbj22mvx2muv9ZjFsisaZ545lmXx8e5aVLRZgga/T+0HNBkdPd6zG2k4jC+wc8/8LKRT4JsQMgDOnxCLiQkKHKwL7/upMwNS4cnFntYwg9b1QdKmd82mlKgSI1YpCmuRopjPxYR4BcpaTIhTiHGoh2zBWpkAbjeLjGgpyoNM+AyGZX3ZRTqsLkxJUuLyqUlhPY8MvEGfhnDvvffCbrdj5cqV0Ov1mDRpEn744QdkZJxKCVBeXo7W1lOpEa666iq0tLTg8ccfR2NjIyZPnoxvv/0WsbGxg938AefyePH+9ipoJHzorS54vF7wOAysjlOrhDtTM/ZlFoqH9V0w87lMyBXh4dSGqmi1IEoqQJJGjJqTqXWbjHbwOAzcXhYmhztgJWF5iwVKMb/bSuyyJl/ncaLVjHStBCdCXOwDCFoLtiu5qPe6V31hc3nAML40mIUpajQY7N3SbRxtCK+DZxggRSMJeSGfFSNDYarmjNtMCBk7jHYXVn1U3Gsq8hSNBDEKIRiGwYmW0MHlXZXtGB8v71YrMRhPH1dtA76ZnsEmKYkEXJTUGVABKyYlhld/jWWBWIUIRelRfW4HGbtOnDiB119/HatWrcLDDz+MXbt24Z577oFAIMDy5cvR2NgIAN3GlbGxsf7HTrd+/Xo8+eSTA9524iudU95sRrPJgXd+rcCRMMdgALC7qh0FKWpUtFoDLs7lQh6m6hSwuzyoOZnq3ONlu80AV4r5cLq9GB+nCDnZks9lwLLAL8db8cvxVkTJBLhgog7KMOqyEkIGX2WrBbf9ffeQBL87nd7XlJws+9V1wmBmjAxyIQ8mhxsVLWacfjk5PVWNnWFOYDwTmTEy8DgMpAIenB4PDoR5ozNcBclqFNd2YM8gpCAubfRNZLe7vDjcw3fJ1dOSsObiXH+2utc2leGP35ViXnY0XrpyMmY9+/OA146PltEk+ZHkwIEDmDlzJux2O2QyGT777DN/6ceVK1di1qxZ/ixD4aBx5plxebx44t+HsHFH6MB3V61mJzRSPqalqlFc0zFgE3EGGocBLp6kw13nZiEzRB1wQgiJBIZhsLQgCQfrDvXpebur2jEuVoby5u5j2/4Q8jloCjPDT2aMDHuqfWNng63n+59JajH21RjAYYD8RCWEPA5KG00hy/wAvkmSS/LiES0XYmlhMpRiuh8wXAx4AHzz5s3dtj300EN46KGHQj6nsrKy27a77rprxKc8D8dbv5zAVyUNSNaIMV6nQEltR7eZ3gfrDChM1aDd4uxz+myXx3dzTy3hY3KSCh1WF5pNdrRbXShvsUDC5/Q6C6fN4oRaKkNuvBwWpweVbdaAC3DVaX/gcQoRHG5PQEoKvdWJKKkAKVES7K/pwOQkFYprOiAVcJESJcWxJpM/pa/b03N7wk1z3lVhihp2lydkerXOtfCdNb470+4CgJDHAZfLAXo5T7k6BRoM9qB11Tstn5Xa5xq8hJCx7V97avHjkeYe90mNkkBvcaJK33utw2mpvok+09M0MFidkIl4IdMG768xIDVK0mO/BgAZ0VLUtNvAsmzQlD8ME5ghhNOHengVrRYcqjcgluoZkjB5vV4UFhbimWeeAQBMmTIFBw8exBtvvIHly5f365irV6/GqlWr/D8bjUYkJdEM34FwsM4QMr1aOIKNs0wON3ZU6DEtVY3GIOnUO2XFyLC/piMg+C3iccDlMEjTSiHkc1FS2+GfkJSoFqOixQKj3UUBcEKGqRUf7ovYKr84hQjJURIoRDy4PCycbi8aDDZU6a19rfQCAKhss4DPZZCrU2B/jaHnjGMDXEs4J863eri3CZdnQiPh41izaVBWVAO+7Hh7qzvAwDf5P1gQOzNGhqcumQhBZ20MAHeek4n542OQoBJDLuJDKeYPeAD88+I6LC1MpJrRI0R2djaKi4thMBjwySefYPny5diyZQvKysrw888/Y9++fX06Ho0zz8yffjgWdvC7ky9lbzs0Uj7ilWLUddjQEWaZsKFGgW9CyFA4e1x0n5+THi2FSsJHQaqmx/Tj4RDxOOBzOb2u0M6MkcHicIUsIXy6rjEgL3tqomqsXIgomaBbxiaZkId4pQizMqIQc/I+JQW/hxdKRD+MVLVZ8PJPxwEALWYn4pRiaGUi2F3WgBmIHtaXJl0jFSAlStrj7GXAF8zNO1mHCywLs8ONww2mgPTeMgEX0XIB4uRCVLfboRTzIOJz4WVZ1Opt3WqLCXmMv0ZOrk4Bo93lTyFZpbdCKebBYPPVllWIeShIVmFfdQeSo6SQCLg4UGeATMTDsSYTPCxwqN6AeeO0ONJgwuEGI4Q8BuNi5ZCJ+LA43EjXSkPOcJeLeIhTCMHlMGDAoMFgCzqLSCHiISdOgXar0x/Yzk9QQsjnoM3iRKPBDjGfi4xoWbdVPjtPnu8kjRitJidUEj54HAZ1HbaQN1AkAm7IFPCd+rKKiRBCvF4Wb2wp73W/yjYrpAIu5CIeTD3MUAROpdOsPbkKksPAn9UjmGADuawYmS+Vp5AHML4BopjPgcvLBk1FND5OEfDdVdFmQYxcGFBeAwCW5MVjSrIKVW1WzMuORo3eCp1KjMlJVM+QhC8+Pt6/CqfT+PHj8a9//QsA/Okom5qaAuoyNjU1YfLkyUGPKRQKIRTS6qyB9uneWrz4/bEzOobDHTpI0W51Be17Oh1rMoHLYfzp0nkcQMjnwmBzBUyi5HIYzBunxSNLxsPhYpGkkZxRmwkhAyczRo79teHdAAsmQSXG7Wen44qpiZAKg99O8ZUvM6G00YSjjSYcaTDiYJ2h18nrzSZfGt7imp7bNz0CNw2TNRKoJXyI+Fw0GU9N2s6Jk4NhEFZmoP6Ikgpw85w0zM2KRlq0FDIhD+0WJ654Y2vQmuIDgQXAhpheMDsjKiD43SknTuH/v0LMQ+MAX8YrRHzUG+xIUIkH9oVIRAgEAmRmZgIACgoKsGvXLvz5z3+GWCxGeXk5VCpVwP5XXHEFzjrrrKALhgAaZ/YHy7JgWcDu9uCsLC3Km834/nBTn4/jC4S7kJ+oRIe1/98Vg4E5Gfi+mwLfhJAhkKqV4vwJsWH3tWlaCU60WFCjt0IrEyIvQdHvzEI8DqCVC3udqBktF6LJYIPJEd7ExQnxcuwLkU69yeSAxM6BWMDFRJ0CDBi0WRwob7HgeLMZKxdQKbThigLgw8jft1X505LbnJ6Ai1ouh0F+ghI8LoNWsxMVrRboLU4YbU4UpPjS9ASbOZ2foESzyRFQhwsA0rRSVLSeusA0Oz1QiPg42mTuFtBlGF8AXcjjoLzFjA6rC+YuHcehLjcA8xOUqDfY4HB7kR0rR1mLGbsq2xGvFMLq8gZ0TFVdVhC6PCyMdrc/0O5wswF1v3Wq7iv9OIxvFo+XBRq71DXXygTwst3rj+tU4m6B7ZI6A3LiZP6LbavTgzZL4D46pQgJajEO1xmw/+TNiM6U6NPTNGg1B7/50GCwQ8Bl4Owhp8dHu2pw61npSNVSLVtCSO84HAa3z83AU18d7nVfi9ODojRNwGSncHhZoDBVHfLG6v5agz9FZ5RUALmIh+PN3VOs24JkyYhVCKGVCXH4tOwbHVYX0rRSFKjFvklQfC6euSwPF+TFdzsGIX01e/ZslJaWBmw7duwYUlJSAABpaWmIi4vDTz/95A94G41G7NixA3fcccdgN5d0kaASdytD01dCXugSP+UtZhSmqP0BcB6HwdQUNVxuL2wuN0x2N1pMDqgkfGTHysEA2H6yb2QY4ML8eERJBZiarAafy0GiSow2y8hYLUTIWOTxsoiSCSAVcPuUSU3A5WB8vBw3zEzFxZN14HO7B0i7kgp5mJKsxpTkUxP27C4Plv3fDuyrbkdPC57DWp3ez0XBUgEXuQkK2JwelDaaUN0lU1CiSgwRnzOgK74TVGJ8ducsxMgDr+3VUgHmZkUPWgAc8E3GDFYP/B+7alCUHtXjGHQwVvV8e6gR3x5qRJxChJQoCfISlHhgUU7Q4DwZfrxeLxwOB5588kn89re/DXgsLy8PL730Ei666KIhat3o89m+Wry55QQYhkF5ixnpWimyYuVndMySWgPyE5Uobzb3OfPmQKPANyFkuFh72USUNpkCYjyhWE7GklweFjaXB3Xt/b/O93gRVral1ChJt8zKPdFbnP7J78FYXV7kJypRXN3Rbb/aM7xvQQYOBcCHkcYeahZ0Zm/s/KPNiJZCKxPCe/KvfVZ6FPbXdvhrESSqxRDyON0C351cHi+mJqvg8ngh5vPQZLRjb4i6WywLf5oIhgEKUtT+FdSn6/p6pU2nLp7NdjfyExQo6WFmT2WbFdPTNDhYZ4D1tAFmokqC+o7A86OWCFDWbO52A6HV7ERqlARZMTIY7a6TK8N9Nx1OV5CiDro6sSu5iB+ys/T20NvWttuQl6DEkQYDQpWY87AsjHa6UUoICd/0NE3Y+7aag69q7M2eSj0KU9SwOj0BK7W1MgEyomXYW6VHapQE1pNlMMLlcHsDJk11VdFqQQWAVeeNwx3zMnq9uUxIuDprLz7zzDO48sorsXPnTrz11lt46623APjqV917771Yu3YtsrKykJaWhsceeww6nQ6XXnrp0DZ+jCtKj8LsjCgcaTRBI+GjrI/BkXilELtC1O4GfDEkh8uDCfFyVLdZ4Q5SBxwAnFYXWAB7u4wZWRY4XG9EdqwMZc1mjI+XoaLVgux4ZZ/aSAgZPFwOg4cvGI+7z83Eyz8dx9v/rQi6n1YmxD3zMzErQ4sYhRASPhe8MxyXiPhcqCV8MPBN7uYyDBRifshxUU/ae8kyBvgm9PC4DFwe1j9RPlYhwokWS9Ag+2DctGuzOCDmB5+UJBWGnqw0EMpbuk/eBACn29tjaQwAgzpGbTTa0Wi0Y19NB1YsyKIA+DC0evVqLF68GMnJyTCZTNi4cSM2b96M7777DnFxcf5MQ10lJycjLS1tCFo7+nywowqPf3EoYEHQ0ZPZN85USa0ByRoJ4nkMypoHb4JOKBT4JoQMNzFyEf591xxsP9EGhYiPdqsTb24p75ZtiWF8wejOiednWmJCJuIhSSMGy7Ko7zJukwl5MDvcEPI40KnEfQp+MwxgDaPETUmITFJflTTgtrkZYb8eGTwUAB9GMrQypGgk4PMYeLyAx+sFl8NBlFSA483mgBnK5S2WbjUOJHwOCpJV4HI4EPE5+OV4a8jXqm23obbdhpw4GQ7Uhb86kGWD11IMRS7kIidegb3VHShrsXRbed6V3uLEzgo9xsXKUN1mhb1L1PhgvaHbc9ssTuTqFEFvGlS2WbsFZVKjJAEriZI04oAbmaEoxKH/TKyO0KmF52RqMS1Vg7PHaVFSZ0RduxU2pwd8HgdKsa8G++VTE5GfqOq1DYQQ0ilJIwHDABI+F3weB3IRDzwOB81Ge7fZ6SqxAEDfL9Y9LLCnuh0z0qIwPl4OuYgPl8cLAZfjX1EebuBbLOAiN14Bj5cNutKmq1vPSsPd52ZSvUMSUdOmTcNnn32G1atX46mnnkJaWho2bNiAZcuW+fd54IEHYLFYcNttt6GjowNz5szBt99+C5GIas0PtsP1RkgEXKRqpahsteB/5W3gML5xolLMR0a0FCwLVOutaDstCMQ92XV0Jt8R8Xlg2dATgbysbwJEb+WEAF9qTZeXRV6CAtV6Gww2F+QiPmIUYszK1GJykmqgS/ISQiJELuLjkSUTUNpkxi/HWgIem5OpxWvLpkZ0lS/Lsnj7vyfw09FmsCz8E7sT+1n62mBzISNaivIWC6Ykq8DjMNhfa4DT7UVKlAQyIReH6k1we1nwOEBmjBQmmxsnQlyHD4aMaClWnjcOclHw89pbyZ5Ic/WQpe1YU8+Bs1vPSofD7e11In0oXA6D2ZlaFCSroVOJwMJXGu1fe2r9Cxq60ilF+OPSSSHPHRlazc3NuOGGG9DQ0AClUon8/Hx89913OO+884a6aaNeeYsZj35+MKxVgP1VrbeCz2X8JR+Hgi/rkA4r5mciM+bMVrYTQkikKcV8LMw9NdlrYW4cch77xj/WipELweUgZGnbcDHwLRBN00pR2WbF9hN6qCV8TEtV41iTGQabCyzLIk4hRLJG0ufXy0tQhgxuh+NYkwnfH2rE+bndJ76RoUUB8GHkrnMz0WJ24IviuoAV0KECxqezurzYU92BJI0Y0TIhZmdGYVdlO5yhlh8Dfb6IipIKsL+XAEanaJkQDHNq1brV6YHB5sTEBAUOBlkJLhfxkB0rR4PRjhiFEDwOx3+RbnV60GiwIzPGt8qmU6gatcFUtlnBYYCiNA1YlkVxTUeIyl+Bdle1Y3pa8DprdR12SPgc2NxevHFdAWIVIpQ2GpGskWJmRlTYbSOEkHApxXzsfmQBomSn6sLVd9jw6d5avLu1KmDVt6cfdwPEAi4ytFK4vSy2nWjzb2cARMsEfT7eRJ0irJsFcQoRVi8eT8FvMiAuvPBCXHjhhSEfZxgGTz31FJ566qlBbBU5nd3lwW3/bzdYFthy/zy8u7USAPzZfgw2lz9jUa5OERAAL0rzlWbo7PY4DOD2eCEX8mAKMWFRpxJBIuBhcpIKXpbt8YL3RIsF01LVODcnBptLWzAvOxqFqRqIeBwkaSQQhVjVSAgZnlrNDhyo7QjYtiQvHn+6alKPpRP6o95gx3PflnYL0nTYnChMVaOs2dynlTDNJgdi5MKAUje5OgX0Fme3FJRuL4Z05aKAy8FLV03GBXlxPY7x+rMSvr96KxH0VUkD1l2WF3Li/zk5MZiXHY3fvLGt1yB4dqwcDyzKxrcHG9FmceKsLC0uzNchWt69vvNFk3S4/C9bu21/6arJKEqnewvD1TvvvNOn/dmBjNaOMftrOhCvEAWs/hsILg+LXZXt3e5HDjSGAS7K1+HuczPPOKU7IYQMFi6HwctXT8GXJfWwu7zYVNqMyUkqNBj6nqFyeqoaLHxldE0ON+wuT0BWuHarC7sq25GskcDscIPDYdBodPRrhTmfc2ZZduwuL7452IiZGVE0aXGYoQD4MCLgcbD+8jw8duF4VLZa0Wp24HizGf/YWe0fZKVGSRBz8mKJYRh4WRYujxc2lxdmuxt6ixM1ehtq9L5VznEKIRLVEhxqMMIWpG6N1dm3mdYJKnHItOqnU0v53YL3eosLeosLszOj4PawEPE4aLe60G5zorbdFpBancdhfDczK/RgAdhcHpQ1+2o16i1OeFkWpX1MayQX8dFmcfZp0MqywM4KfdALZYPNhSlJKuyr6cD4OAWSoySYnKTqU5sIIaSvuga/AUCnEuOuc7Pw27PS8fYvJ/CXzeWwuTy9pnDMjJGhw+oEh2HQYnZgarIajQY7Dga5CckCSIuWodkcftaQwpTwZ8pfOiUBnD5kGCGEjD4iPhdXFibhTz8cQ+Yj3/S476F6I4rSNLA4PWg22lHRagkILnlZoKbdhsIUNfbXdsDtZcGyvrFsrEIIq9ODGr0V2zpOTfRJ0oghE/JwpOHU+FLI40DI4yBVK8Ufzs/G9FQNbpmTTmloCRnhnvv2KLJi5NhT3Q6Pl0VKlAQvXzOlT9nOwpWgEuO5K/Lx8KcH4PScmpxudniwu7IdBckq7AlRjiyYqckqHKozwNFlFfNgBpDDJRPy8NYNBZiVoe1xvxaTA3urB29lZbu15xTy4XwGGIbBExdNwJVvboPdFXrBQa5OgfnjYzF/fGyvx0yLkgbdbgsjHSchY9HlUxNxyeQEXPLarwGLbGLkQjg93jNOsRuMkMfA4R7YSQydge97aMU3IWSEWpwXj8V58bC7PDj/pV/A68f4OkYuDHsVd5RUgGi5EEIeg63l+oCswuHSW/tXQrKrfdXtFPwehigAPgxJBDxM0CkAAHPHRWP5zBR8sqcWPxxuwk9Hm/tUb7XR6ECj0QExn4PCFDVq260Q8bnQW5wQ8bmobA3/WICvxndhqhq7w+iAjjWZMS5WBpvL4w/Id3K6vf6giEYiQIJaBJ1SDIfbg/JmC0wON9xeFjtOpkQ3O9z+VHFmR+j0bSoJH9EyIdqtTrSZnZiepsH+2g6I+VzIRXwkqsXYWt4W9Lm92VGh96ea6yTgcsDlMHhkyXho+rEykhBCIknE5+Lu+Vm4oiARN/5tJxJUYqil/IBgTq5OAZmQBxaAxeGGQsRHs9GO7FgZuAzjLxMRzI4KPSYlKeHxsDhUb+w1i4bHG96gMydOjmunJ4e1LyFkdBsXG35Nw55W8HXaXdUOPofB7IwodFhdON5sCtnPme1upGikmJUhgErMh0zER06cHEsLEwMuZAU0WYeQEa2s2YSPd9cCABLVYkTJBGgxOdBssiNeKR6Q1/xNQSLGx8tx87u70GQMvMG2v7YD42JlONbU+yRtAY/jz4QxHCWoxJiSrEJWjK/v1Kl6P5+/lrUMaArjrlKjJDjR0vOK+N+dnRFWEDw/UYVvVszFxh1VOFhnhIdlwbIsvCzgZVlESYX4/TmZYbdNLRVgTqYWv5YFlrK784O9ePKSibhiagJlSiKki3/vr8fbv5zwB78lfA6So6Q42mhCYYo6YIFNJJQ1m5GrU6DBYIfe0vNEmv7oTHV+D634JoSMEiI+F788cA7cHi8+2FENk92Fv2+r8tcC70mzyYHx8fKA+5mhdC23OC1VjX3VHX3KGgz44nFnqtFox4oP9+GlKyfTAp9hhALgIwCPy8HV05Nx6ZQEbDrajO8ONeKno819qpNlc/lqVOUnKLG/zgAhj8EEnQJlzeZuNWN7s7uyHfmJSnAANBrsaOyh0zrWZAYD+FdJd+pMT1Gtt0JvdULfZRb21GRVwEX9sSYzxHyuP/CukvAxPU0NsAxcXi8O1Brg9rKYlKhEWbMZx0+u7o6VC/03Ru0uL9qtLjSdDPKUhnFzIZhEtRhpWikKUzUoTFFjYoKSUl4SQoYdnUqMtZfm4a1fynGkwYREtRgxciE8LIv9Nd2zeExJVoHP5aBa3/ukqM7nqyV8pGmlON5kgsnR/XskUS1GiynwxkCMXIgFE2LB5zAob7Hg17JWxMiFePem6YhTUq1lQgigkfpK6Ih4XHhZFo5+zN4+XbRCiEP1RrT3shKo3erC/8pboZUJoRLzcd2MFNwwM4UCDoSMMttPnJo8U9tuQ227b1LMm1tO4PELJ8DLsuBxI5/lIVenxJvXF+LS1/4XsN3tBVpPpjXv7YbglCRVWJN/BpvwZDa7y6b0PUh7+oSAgVTXbkOcUuT/nZ+uMEWN2+amh328NK0UjyyZEKnm4e0bCvHKz8fx1i8n/DduLU4P7vt4P442GPHohZF7LUJGMpPdhQ93VuNAlwyVVpcXbWYnClPUYV3X9seheiNkQh6K0jQw2FwobTSFVVqxJwzjK8Fxz/wsjKPANyFkFOJxOVg+KxUAMDMjCl/ub8Cm0uZupXtOJ+H3PXS5q7Idk5NUMDvcUIn5YU2G4nGYiHxv2F1e/Ht/PdZfnheRgDqJDPpNjCAiPtefQsLp9mL7iTY8/NmBkBdvXaVrpWAYYP/JwaHDzWL7CT34XKbXGlin08oEEPG5aOiwQSHhw2B3wRYi7VeiWoxouRB8DgMuh4HHy0J7cqV0gkoUtHMJNtva5vKlh8tLUKKuwxawojw7Vg4hj4P9p9VtVEr4aDrtBoLD7YXZ4UG0TIgWc3gX2kkaMa4qTMKiiXFI18poBg8hZERoMNjw45FmAIE3d4NhWRY7e/ge0MoEOG9CHEx2F2RCHvISldCbnUiOkqCqzQKpkI+S2g4cazLjqsJEJKolcHq8MNpccHlZfLK7BhWtFjxzWR4WTPClgPR4Wby3tRJnZWkp+E0I8YtXivDKNVPw+b46CHkcVLZZcKi+byVvutJIBPCy6DX43Yllfel407VS5OoU/Q5+H28y0eodQoaZZpMvo9ih+uAlvd7dWolP99biljnpWLEga0Da8NORpqDb9VYX0rRSiO3uoCmvxQIu8nSKYRn8BoAZ6VG4IC++X33mhHjFALQoOJeXhU4lDjkuXnXeuAFJgx8usYCLBxbloDBVjZvf3R3wWGuY9y8IGe22lrXipR+PBS211WJ2hH2vr7/MDre/L86IloIBAmrShosC34SQsaggRYOCFA3+YB+Hj3bV4EiDCf/aWxt03z3VvljQgTDL8QKARsIHh/Fl7ZiWqg7rObk6Rbe4Un9NiFcM6ViSdEcB8BFKwONg7rhovLN8Gq54fSvMjp5Xg4sF3KB1wVweX5rx3tIDyYRcZETLwOdyUFzTERAo0UgFmJggxe7Kdv/MR6WYj3GxMuypavdfXGplAmhlAijFfOyoaEerWY94pRAaqRASARcH6gxQifko7rJS/HQH6gwQ8DjQygRoNftWFpY2Bb8pqpYET0le12GDUsxHrk7Ra620F5ZOwuVUl5YQMgLNGxeDG2am4Mv99SEDPyIeB/lJKuzpof/nchhsuGoK5mT1XL+xJ9fPSAl63JvnpPX7mISQ0SlJI4FUyMP3hxpxpMGEjGhpvwPgYj4H2XFytJh9Kyu1MiEaDTboQ/SJnfu0mh2wu71QhRhLhoOC34QMDzV6Kz7bV4evSurDSjGeESPDpVN0A9KWrWWteHVTWcjHK1otyE9Q4kijEa4u9b2zY+VoMtnDroM4FLYca8Hlf9mKf90xC2JB3zKkzR0XjbWXTsT726twtLH/E57CZXW4weMw3VJjzkyPwsyMqAF//XDMytAiTSuFkMfBjPQonD8hdti0jZChZHa48caWcuyNcHrz/ipvsYDDAEVpGuytaocrzJS7C3Njseq8bGTH0XiRjC3r1q3D119/jeLiYggEAnR0dHTbp7q6GnfccQc2bdoEmUyG5cuXY/369eDxKIw1mshFfPz2rHSwLIsLJ/kWe76xpRz7Tiv1c/OcVLz9SwUON/QcwwF8mXnMDrc/s/DpWYZEfA5cHhaeLn01hwH4nMhlfjpUb8Smo81YNDE+YsckZ4Z6jhEuO06OV6+dgpvf3YWexlmH6o1IUotRE2Smc5xCBIbxpfvyeL0w2t3gczmQi3iwuTwoazbD7PCEnAmjtzihtziRrJEgSSOG0+3FkXpjt9mYrWYnWs1OyIQ8SPgcWF1eNBgcaDD4OqOJCQqY7e6Ai/1g8hOUYaWv8PRwQgw2F0x2F5I1YlTru5+TeKUIWbEy5OoUFPwmhIxISgkfqxePh0YqwIYfj3d7PE0rRbTcF+jp2l8KuBzMydLCaHNBIxVg7aUTEaOgFdqEkMGjkQowO1OLOVnRWPvV4X4fZ2KCEttOtPl/bjY5UJCshr66+zhyepoGe6ra0WxyIFkjQVGaGhnR0rBfi+1SwHZbeRuiZEK6qUnIENta1orr3tnR43VypzmZWtw2Nx1nZWkHpOwBy7J4+usjvda6Lqkz+IPgOXEKACwO1PV+w284ONxgxJNfHsKzV+T3+bnXzUjBdTNSUN1mxVv/Lcf726sHoIU+B+uNiFcKoRQLcLTRBDGfixeWTsL5ubHDpuSFiM/FpvvmDXUzCBl2PF4WlW1WFKYGz2SZHStHVZsF9pMldNK1Uigl/G4BlUjyssCOCj2SNRLwub5SX6GclaXFfednY1KSasDaQ8hw5nQ6sXTpUsycORPvvPNOt8c9Hg+WLFmCuLg4bN26FQ0NDbjhhhvA5/PxzDPPDEGLyUBjGAbnZMcA8JVnLG+2QCMVwO7y4PF/H8K5ObGYPz4Wv31vd4+ZKwuSVSipM/jjSvkJSpSctnJ8ok4Js8Ptn3A5LlYGt9eL8tb+lcoN5ZM9tRQAH0YoAD4KzMuOwZqLc/H4F4dC7hNqhTeXw8Dp9gRNHdRX1XorNFJBjyu4Ad+MzWmp6m6vebDOiMwYWcDq7tMpxfyQK75Pd7zZhJw4ebdZ5CI+B3IRH6lRkm5tSFSLESsXYV+Nr0b5Ra/8io9un4GCFA0AwOtlKSBOCBkxxAIuZMLgX/UVrRZUtPoGljIhD1NT1Lh2ehIKUzXQyoSD3FJCCAl01bRkfHuwEfYQZXZCKUhRg8thYLC6go5vedxT47isGBmUYj4YBrA43PB4WXA5DBaMj8XiPlyw7qzQ4//+ewKtZgdYAL+fl4FZcf3PmkEIiYyCVDXOzYnxl4QJRi7kYcPVkzF/fOyAtmXbiTYcCWPlCuALgot4nD6lexwuvtxf368AeKfkKAnWXpqHGelRWPFhcY+T2s9Eg8GBFpMDRWkaFKVpsCSfblISMhIoxXxMS9WgvsMKIY8DIY+B0e6BmM9BkkYChvFlE/J4WUTLhdhRoQePwyBDK0WrxQGtTAiZiAc+h4N91e3oZf1Nn1TrreByfGUm91Tp4e4yhJ2arMIDi3IwI50yOZCx7cknnwQAvPvuu0Ef//7773H48GH8+OOPiI2NxeTJk/H000/jwQcfxJo1ayAQ9D9DFxn+YuQixMhPLcD57I5Z/jjM/7tlOha+9Asqg9QNL0rTYGelPmCiqdvLIjNGBgGXgZcFXB4v9td0YEqyLy16Z2yqMEWNEy1nXv+7q7JmMzqszjPKKEcihwLgo8QNM1NxosWCd7dWdnssP0GJPUFWugC+2ZMKMT9kKsje8LkMJsQrcKLVApPdjeKaDkxKVOJYkylkXXDAV4eRy6DbYLOs2Qw+h0FOnBxKMR8VrRY0d6njnR0rCzv1m8HmhsluCgi25ycqUd5sRovJgVazA0oxH06P1xfYZpiAOrl7qtpRkKLGTX/bhZtmp6G23YZvDjbg/oXZuHFW6rCZHU4IGTrtFifU0uE9oLllTho2l7bg17LWoI/rLU6cPU6LP189mQZnhJBhZXKSChfkxeHz4noAAJ/D9JhakssAJ1rMPdb73lmpx7hYGUR8LngcBnuqTpXwAXxj4w93VWNJflyvYz2vl8WHu2rw+BcH4fayuHxqAh5anBNw0U4IGTpCHhcFKRr8eKQZXA4DiYALLodBx8k+IjNGhjeuK0BmjGzA27K1rK33nbqwu/s2+We4EPK5YFn2jK+VL8zXweNlsfKj4rBW8PfHjHQt7piXgVmUWpyQEWXZjGTc/O4uxMiF4HAYqKVAVZu1W5mLE60WJGnEEPK4aDLYYHJ4YLCdKh+pU4qgtzgj2t96vL4yk6lREjAMAwGXg/sXZmP++Bi6h0hIGLZt24a8vDzExp6amLhw4ULccccdOHToEKZMmdLtOQ6HAw7HqdiB0TgyMueQ3nVdhCjkcfHXG6fhktf+B5M9sBSww+3tlmUpVMr0dqsT09M02Fmhx/RUX+A80trMTrRbXXSPdZigAPgo8uiS8ahss2BzaUvAdi/L9phqLVouDDp7JhSNVIBkjQRCHgdmhxv7aw2Qi3goSFFjf00H9tcagq7w7qooTYOPb5+BD3fV4rlvjwY85vKy/lXbDACpgAuL0wOZkIcTraFTCQXjZYFdle3IjJFBzOfiUJ3BH3RnWV8q9FDcJweuRWka/PmnU+mDn/zyMFgWVLuWkDHO42XxwvelWHNxLvjcyNWLiTSGYfDXG6fh9x/sRXmLGRWn9aMaqQDXFqXQwIwQMuzEKUX4w/njsLe6A+0WJ8brFD2mPQuVDrMrloX/BmmcUgQ+l4HztBmZUiGv1zTFALD+myN4+78V/p91SjGipJRBg5Dhwu7yQCsT4MdVc5ESJfWP1060mKG3ODE1WT1o2b0W5sahvsOG8lYLTrSYu924Gy3WXjoxYkGeSyYnwO1hcd8n+8Pqk8MVrxTh9esKMJlSEBMyItmcHmREy1BS24FYuQi1Hd3LGnYS8rgoaw6e2rbeYEdegnJAsm24vSz+cH4WLp6UAC5lkSQkbI2NjQHBbwD+nxsbG4M+Z/369f6V5WR0S4+W4a5zMrH+m8BYUlmY2YIB4HiX74Qqfd/iTOHSyAR4+qvDeOzCCUjThl9WjQwMCoCPIjwuB68vK8AfvyvF1yX1SI6SAPDVj4pXitBotAe9cCxvMUPIY+Bwh76q5HEYTE1Ro8XkQEWrBXpLYIpyk92NPVXt4DJAkkYMCZ8b8lhZMTI8cVEuBDwOdKqeV8jkJSjB4zLgchiY7C4cbexfTQaZkAen29vn9EZ8LgNvl5Mm4HIwKzMKVW0WWBxuSEOkFiaEjF7tFif+c7ABX+1vAI/LDOvgdycBj4P/W14Ir5fFiz+U4oMd1f7VTxtvLUK6duBXPhFCSH9opEI8e0Ue7v2wGAfqDEjXSqGRCVDZavGXzEnRiKGUCHoNfp9OJeah0WDvtn1qssq/IvS/x1swLVUDUZCxrU4l9v9fzOdCIeahyWgP2E4IGToiPhdLC5O6bU+PliE9enDbkpeoxJ+umgzAVw/84z21eOCTksFtxADK1Snw9KUTMfVkWslIuaIgEVNT1Nh0tBkf7qrGsSYzRHwOZqRHdZv4H65nr8in4DchI9jsTC3e21aJaJmwx+A34Cv7VZQWeoLkgToDcuLkUIh4qGqzoqlLBsr+0MqEuGd+Jq6elgwBb/jfJyAkEh566CE899xzPe5z5MgR5OTkDMjrr169GqtWrfL/bDQakZTUffxHRoes2MD7lzIBFznxiqClf3ujkgjQZDyzfj+YqjYrqtqskIt4yEtQYvms1BFx73i0oujdKCMWcPH4RRMwOVmFe/6xL+AxqYCL8ToFatttATf79BYXzsrSwuH2wmR3wWBzweNhIeRzIOBy4PR40WJy9LjippOHBWr0NsQrgt/4y4qR4W83TfMPBF09RKRToyQoidBMzOKaDkxP7fliXMDjwHla6qMpySrsrGjHuTkxuHFWKiYnq6AQ8SPSJkLIyHTDX3fiQJ0BfC6Dhy8YP9TN6RMOh8H9C3Pwh/Oy8f3hRqRHy5AVI6N0bISQYUsq5GFmehQunZKAt345gROtFn9GoMJUNfgcBrur2lHdHvwGaE6cHAoxHy6311//2+LwAGChkQrA51i6pVW/85xMqCQC1HfY8O3BRpyVFTxSFiXzrfaelRGFq6YlYUlePHh0YUtGmWeffRarV6/GihUrsGHDBv/2bdu24ZFHHsGOHTvA5XIxefJkfPfddxCLaQJIODbuqB7qJkTE6sU5uGiSDvFK0YCNJ9O0UqTNScNNs1NxvNkMlZiPaLkQe6ra0WZxwun24i+by8OusS4VhJ6sTwgZGRKUYpTUdCBFI0GVPnhGy8JUNRwuD8yOnjNudGagzEtQQm9x9lhuJxS5kIffzcvATbNTIRHQrXYytvzhD3/AjTfe2OM+6enpYR0rLi4OO3fuDNjW1NTkfywYoVAIoZCycI0VszK0YBhfZjcOA2jlwn4FvwGgtNGEiToFhHwuavTWgDK8/cFhfNmIVRI+xsXI8dX+emw62oxdlXr89qx0ZEbLhn0ZzdGIvpVHoW8PNuD+j/d3225xerD7ZFryCfEKeFgWFa0W5MTJoTc7YLS7URPi5mFftVudiJIK0NZlpfjC3Fj86crJAaum52VHI07hW51+uso2KxJUItR1dH+sP3ZXtaMwVY3y5sDakFFSAeKUQhyqN4HHAVK1UuiUYjSb7NhZ0Y7zJsTi2cvz/Dc5CSEDy+tlBy0dZV/VddjQYnLgT1dOwtxx0dCO0H6Bw2GwaGI8AKCktgMMGOQlKoe4VYQQEhzDMFgxPwuH6434tazVv313ZTtydQrwOQx4HAYTE5RgAXAZBiyAXRV6dNhc/hubwWTGyNBosMHs8AAAuBwGjQY7JupY/N9/K3DvgnEhnzsnU4v5OTF48/oCCnyTUWnXrl148803kZ+fH7B927ZtWLRoEVavXo1XXnkFPB4P+/fvB4dDfwfhYBgGLSYHeBwG7oEqcD1IbpiZCvEgBZQZhsG4WLn/58JUjf//RekazH725x4n2PM4DKalapATrxjQdhJCBl5WrAxHGqUoru4I+nhnfde+OFBngFYmgELMh9vjRbW+9/ujfC6D62ek4q5zM6GhoAYZo6KjoxEdHZnUOjNnzsS6devQ3NyMmJgYAMAPP/wAhUKBCRMmROQ1yMjmcPnqfccphJAKeShvObM05gfrT02gjFUIkaiWgAGwv7ajx3Flp5w4OWRCHuwuD9qtTjQZHdApxf7a4ka7G98dasL2E3q8fUMhpqdpejkiiTQKgI8gLMvi/e1V2FzaAqPdhVydEr8pSPTd7GNZmB1ufLSrBt8faoLjtJXMpzvcZXZ0Sa0BKgkf3ghefB9vNqMgRe0PgI+LleHVa6d2S/eglQnx5d1z8Mx/juCzfXX+7TwOg8lJKgh5nIgFwL2s70ZpYYoajQY71FI+nG4Wte1WHKr33Rh1e4GyZgsaOuxQSwVI1ojxyAXjKfhNyCCxuzy45NX/oclkx6vXTMWcLO1QNylAlFSAXx88Z1QFOvITVWAjWViREEIGgFTIw/O/ycf726vw9n9P+C9GD9UbkaIRI1YhhsHuQmmXYHeuThGy7iMAFKVpYHW6A8bAKjEfhalqrPioGDlxckTLQ48BXR4vXlg6aVR9JxDSyWw2Y9myZXj77bexdu3agMdWrlyJe+65Bw899JB/W3Z29mA3cUR7+ILxmJ6mgcXhxgP/KulzoGY4iJYLBy343ROvl8WGH4/3eJPymulJeGjReCgllM2NkJHO7fHi56PNKG00wd7Lvc++ajU70Wp2YnqqpscAOMMAl05OwKrzxiFJI4loGwgZzaqrq6HX61FdXQ2Px4Pi4mIAQGZmJmQyGc4//3xMmDAB119/PZ5//nk0Njbi0UcfxZ133kmrvAkAQC7iYl52NA7WGc44+H26JqPDnxJ9QrwiIH4GACI+B7k6JbgcX5yp3eLsNtl+epoGRpsLp8uMkSFVS98XQ4EC4CMIwzC4aloyylsseHdrJXZVtuPdrZVQSfgw293+2eMyIQ9KMQ8GW89pfrpK00pxuD68lGHhqmqzIF0rBRjg8qkJIWsdRMuFeOmqybh5dhre/u8JNBntqGi1YHdVO3TKnmuE90eDwY66DluPtYIsTg8sThs0Uj7e21aJJy7KjXg7CCHdCXkcSIRcdDS50GqOfB2WM/HCd6V485dy/PyHeaPuIpdSoBNCRgKdSowHFuWAx+Vg445q//eEWiL0z7Du6lAPY9tpqepu9SCFPA6WzUjBmn8fRo3eileumdJje2IVkR+nEjJc3HnnnViyZAkWLFgQEABvbm7Gjh07sGzZMsyaNQvl5eXIycnBunXrMGfOnKDHcjgccDhOjeuMxshed45ES/J9mXii5UJ88NsiPPvNUbzza8UQt6pvbpyVOtRNAMuyWPFRMb7cX9/jftPTNBT8JmSU+KqkAb8ca4Gzh0kvLWeYxnZ3lR7TUzVBx5dnZWnx4KIcTEygDGqE9NXjjz+O9957z//zlCm+661NmzZh3rx54HK5+Oqrr3DHHXdg5syZkEqlWL58OZ566qmhajIZZjgcDgpT1Nhc2jKgr3O4wYicOLk/wF2UpsGhOgP29JJuPdik1vsXZuP38zLo3usQGfDlCs8++ywYhsG9997r3zZv3jwwDBPw73e/+12Px7nxxhu7PWfRokUD3Prhh8thcMe8DMzOjPJv67C6AlKnmR1uSAU8TEpUQsIP71e8r7oD+RFOf9tqdvrqNLZYkBEt73X/vEQlXr5mCljAX3Oh2eRAZrQ0ou1qNNoxNVkV1r56iwsf7qyByxPZWaWEkOAYhsFDi3LAMOhXkNnp9mJreSu+PdgQ0awWdpcHn+2rg8vD9lpDjBBCyMBadd447Hh4PuJPTpQsru3AlC5jOwGPgynJKkxKVCJJLUawqhpCHgdJ6sBaxQ8tzsHZ47T49/56PLCQVrOSsevDDz/E3r17sX79+m6PnThxAgCwZs0a3Hrrrfj2228xdepUzJ8/H8ePHw96vPXr10OpVPr/JSUlDWj7Rxo+l4PHLpyAV6/tedLNUONxGGTGyLAwNxZrLpqAO87OGOom4d/763sNfgPAV/sbBqE1hJCB1miw408/HOsx+A0ADrfnjF7HywI7K/WYlqqGgOsbSObqFHj/liL8v1uKKPhNSD+9++67YFm227958+b590lJScF//vMfWK1WtLS04IUXXgCPR2s4ySlxSnHvO0WAzelGrk6BojQNdlToYXb27bslTiHCezdPx53nZFLwewgNaO8RqmYYANx6660Bs3ckkt4DHYsWLcLf/vY3/8+jLfVFWbMJBpsbNqcbjUY7mowONBvtcHm8ONRgQpPBjhazA54wgjr1BjvqDb7U4RqpAOlaaY+1CzgMUNEa2bQRnZI0YpzVhzTGXWdqur0sylstKExRo7TRCJPjzAaxgC+FRV8CWDaXB/uqO6hGAyGDpCg9Co9cMB4FKeo+Pa++w4Zr394Ou8uL15ZNiWgd8bd+OYG6DhvUEj6yYmQROy4hhJC++6qkHs99exRxShGipAJIhDzYnG7kxMnRZnaixezAvpM1IQtS1DDaXciOVQAMcKzJBC/L4teyNgC+m5keL4sYuRA3zkrF/8rakJegxMyMqB5aQMjoVVNTgxUrVuCHH36ASNQ9y4HX65sYfPvtt+Omm24C4Fu989NPP+Gvf/1r0KD56tWrsWrVKv/PRqORguBBXJivwxfF9fjhcFPEj31uTgxeXDoJZocbRxtNKG00orTJjK1lrf6yZT155rI8LC1MDJnVbagszI3D1/fMwVclDfh0b60/bWVXF0/S4Y9Lu9+TIoSMPHFKEbbcPw+17Ta8/NNxfLynNviOLFCQosLheiNsrv4vaNlV2Y6iNA2umZ6EiyclRPQeAyGEkP453mzqfacIqNLboJF6oA9jrNxVskaCG2amYPms1GE3dh6LBiwA3lPNMMAX8I6Li+vTMYVCYZ+fM5IIeVw8+80B7K5qx0SdEgfqDACAiToFDp5BenK9xQm9xYmsGBmaTfagqdGnJKt7TeHQH/mJSvzxN5Mg4odfG+wvy6bixe9L8cuxVjg9XrAssLuqHRqpAPnRMpTU+s5LvFIImZAPEZ8LIZ8Dj4cFn8cBA+BgnQGWELNyTHYX9FYnMmOkKGsOL+i/cUcVBcDJsPH666/j9ddfR2VlJQAgNzcXjz/+OBYvXgzAl2Vjy5YtAc+5/fbb8cYbbwx2U/vtt2el97rPrko9DtQaUNtuw4lWM3ac0CNBLca/bp2BBFXkZgO2mh14+SffiqZYhQhcuuglhJAhs6dKjy2lLdDKhP4gd0+ajXZEy0U41myCkMeBVMCD0+OFVsZFkkYMvcWJDqsLjywZD4ZhkKyRYO2lE2mGNhmz9uzZg+bmZkydOtW/zePx4JdffsGrr76K0tJSAMCECRMCnjd+/HhUV1cHPaZQKBx1k9cHyu/OzohYADwnTo4rC5MwNUWNCfEKCHgcqKUCJGkkOG9CLABflqMnvjiEj3bXBD0Gl8NgRroG1xYlR6RNkSbic5GrUyJXp8R952fj3a2VePqrwwH7bDrajA6rC7GKoa9XTgg5cwzDIEkjwdrLJmJWZhRWfrS/2z71BjvkIj7EfB5srr4FLjpppALcfW4mlhWlQMCjAAYhhAwXm442D9prxStFYQXAeRwGjy4ZjysKEiEXUdmd4WTAAuChaoZ1+uCDD/D+++8jLi4OF110ER577LFeV4Fv3rwZMTExUKvVOPfcc7F27VpERQVfnTES64wlaSR4celknPPiZnAYgM9l4GUBpYQPuZAH0xmk3RXxOXjxykmwONwoa7FgW3krvjnYCPbkgvCKFjMKUiIXBE/XSvHQ4hycNyG2zzcQx8cr8H/Lp8HscOOXYy344XATfj7a7A/kF6VpcKjegHilGHu73Pj87PezIORx8fZ/T6CyzQIOg6ArxusNdiSoRIiSClHPt8EaxmzQz4vrkRkjw61z0yHk0YUzGVqJiYl49tlnkZWVBZZl8d577+GSSy7Bvn37kJvrq1ffnywbI020TIhn/nMkoATEgvGxEQ1+A8BHu2rg9rJgGGDleeMoKNIHLMvieLMZ42J7L4NBCCHhKEjRYF91R+gVP6dxe1nMTFbhkskJmJURBYZh4PWy8LIseFwOmgx2dNhcyI7z9VPJURIkR42+70xCwjV//nwcOHAgYNtNN92EnJwcPPjgg0hPT4dOp/MHwjsdO3bMPxmT9F9Biho3zkrFu1sr+32M7Fg5VizIwqLcuF5XK4r4XKy/PA+Tk1WQCnloNNiwtbwNzUYH9BYnpqdp8PI1wzs1eycuh8HNs1Oxu1KPbw42+rebHG7cvXEfbpiVghnpUdDKaDIGIaOBkMfFotx4vBZTjrJmc7fHeVwGadFSOBo8IRfIBCPmc/Hbs9Jw29x0CmIQQsgwdO+Ccbj7H/vCypJ8pqSC4OHTaLkQ10xPhlLMh8HmwtnjovucyZQMjgEJgHfWDNu1a1fQx6+99lqkpKRAp9OhpKQEDz74IEpLS/Hpp5+GPOaiRYtw+eWXIy0tDeXl5Xj44YexePFibNu2DVxu94Dk+vXr8eSTT0bsPQ0Wg80FL8tif60B4+PlkIt4+F9Zm7/WQH8xYCDkcZGfqMLMDC2un5GC7Sfa8Mx/jqCk1gC91QV9VTvStFJ/KvTUKAkWTYxHUZoGMQohShtN2Fzagk2lzTDZgwfjkzRiXDM9GTfPTuvTqu9gZEIeLsiLxwV58XB5vNh+og23/n23/zx0DX5nREuRn6gCl8PgpasmY3elHkcbTdhZocdXJfXo2h9OTlRhZ6UeFa3WPrXnhe+P4f3t1fjtWWm4ZnoypEKqP0KGxkUXXRTw87p16/D6669j+/bt/gB4f7JsDHdPfXkYh+oNePrSiRgXK0eqVoorpib6V6wwDHDz7NSQz//PgQbEKoRgWaAwtfeMDizLYsuxFtS22/DhbTOQl6Ckv/s+YhiGgt+EkIj77VnpMNrdePXn4+jpmvfyqQl46pKJkJ3Wd3M4DHw5g4BYpQixyu5pngkZq+RyOSZOnBiwTSqVIioqyr/9/vvvxxNPPIFJkyZh8uTJeO+993D06FF88sknQ9HkUWfNxbmYoFPgsc8PwuEOPll7fLwCV0xNwCWTE8DjMGi3OtFudSFGLkSiWtynCZscDoNrpp9a4X3b3KGv7d1fDMPgj0snYX9Nh78kHOCr5buzUo+JCQp8dfdZQ9hCQkgkiQVc/GXZVHy6tw4yIRcbd1T7//YPncykmRMnx9HG3tPlcjkMrp6WhBXzsxCjoLEhIYQMVxfkxePbg4349/76AX2dO+ZlYHZGFOo6bPh8Xz22nWhDlFSANRfnYnamFhqpYEBfn0RGxO/k91YzDABuu+02///z8vIQHx+P+fPno7y8HBkZwS+2rr766oDn5OfnIyMjA5s3b8b8+fO77T9S64zlJSrx/i1FWPHhPhxp8A3QpqWqzyj4DfjqWN/+/3bj+5Vn+1P3zEiPwhd3zkZxTQd2VujRYnJAKuRBKeZjZkYUcuLkARfOuTolLp+aCKfbi8o2C6rbrKhpt4LHYaAQ86FTiVGQrB6Qmjh8LgdnZUXjtrkZ/lTEndK1UryzfFpAWuLCVA0KUzW4bkYKHr9oAmxOD1weL441mfDct0f73Y5Gox3fHGzExZN0FAgjw4LH48HHH38Mi8WCmTNn+rf3NcvGSMiaIRPxcLTRhOo2qz+ouubiXOytbke13opnr8gLeaFa3mLGnRv3gmUBtYSPnY8s6LEOS4PBhm8PNqLF5MC6SydSrS9CCBlmVp03Dl4vi1c3lYXc597547oFvwkhZ+7ee++F3W7HypUrodfrMWnSJPzwww8hr+VJ311ZmISzsrT4uqQBFa0WeLwsFGI+smJkmDsuGrGnjXnVdAPOTybk4dIpCfjL5vJuj6VESYegRYSQgTQuVo6HFucAAJbPSsWL3x8LyKKhEPe+ivu8CbF4cFEOMmNkA9VMQgghEfTyNVNQlK7BI58dDPr4pEQlUrVSfFHcvyD5tFQ1HlyU4//50ikJ2FzagoIUNWUTGmEYlmUjmivg888/x2WXXRawKtvj8YBhGHA4HDgcjm4rti0WC2QyGb799lssXLgw7NeKjo7G2rVrcfvtt/e6r9FohFKphMFggEKhCP8NDRG9xYmdFW2wOj0Q8DgQ8Xx1roU8LoQ8DvhcDrYca8G7WyvQZHSEPA6Pw2Baqgbzx8dgSX484pWRTQ082DxeFtV6KypazTA7PChMUUPXx3THdpcHb2wpx182l8MZYkZ9V1IBF1IhD14WmJURhfWX51Hwe4iNtL/ngXDgwAHMnDkTdrsdMpkMGzduxAUXXAAAeOutt7pl2Zg+fXqPWTbWrFkTNGvGcDvHLMt2W9HSaLAjSiYIGdC2ONyY8vQPAX/v/++W6TgrK3pA20rIcDHW+8xg/Vt2djaOHvVNiJs3bx62bNkS8Pjtt9+ON954I+zXGOvneKg88tkBfLAjeM1hwLfi5993zaG6jaTP6G96YNH5JQPt/o/3dyuVkaAS46u759BkgQFAf9MDi85v3/17fz2e+vIQWs3OHjNqTohX4PGLJmBGevDymoQMBPqbHlh0fscOr5fFsv/bAbfXC4+Xhc3lRYPBhgXjY/HH3+TDywI/HmnCqz+X4UCdIeC5sQohxHwurE4Pmk2BsTWpgIsnLsrFldOG/2LaseBM/6YjHsXrrWZYsHTlxcXFAID4+PiwX6e2thZtbW19es5IopEKsGhiz+9tgk6BW+ak4YviOqz9+ggMNlfA4xMTFPjLtQWjqo4hl8MgTStFmrb/M7dFfC7uXTAOl09JxJNfHsJPR5sDHhfyOChMVWNWhhazM7WYqFOA18NKUUKGQnZ2NoqLi2EwGPDJJ59g+fLl2LJlCyZMmNCvLBvDJWsGy7L4X1kbZmVEBV11HSydY1wvqWvFfC6yY+X+wY5EwEVWDKXlJmQsyc3NxY8//uj/mccLHALfeuuteOqpp/w/95QxgwwPTUY74pUiTIhXoKzZjIwYGQpSVIiRi+BlWZTUGnD9jBQKfhNCyBjDsix4XA5WL87BwXojdlfqoZYI8H/LCyn4TcgYcfEkHS6epEO7xYnSJhMaDXbUddjw89Fm6C1OmOwurDovG1dNSwrIJkkIIWTk4HAY/OO2GQHbvF7Wfz+ZywALc+MgFfDw8s/HkRolwdbyNqglArx01WRkxshQ32HDKz+XodXswOF6I+6Yl4Fzc2L6vOCSDF8RD4D3VjOsvLzcv1IxKioKJSUlWLlyJebOnYv8/Hz/c3JycrB+/XpcdtllMJvNePLJJ3HFFVcgLi4O5eXleOCBB5CZmdmnFeOjkYDHwdLCJFw0SYdjTSY0GOxoNtphdXpw9bRkKCW9p/oZq5KjJHjnxmkobzGjocOOZpMdcUoRpiarz7h+OSEDTSAQIDMzEwBQUFCAXbt24c9//jPefPPNbvsWFRUBAMrKykIGwIVCIYTCoU3h8vm+OvxyvAVVbVbMypjZ+xPCxOEweP+3RXhjSznsLg+WFSX3GjQnhIwuPB4PcXFxIR+XSCQ9Pk6Gn1iFCHedm4W7zs0a6qYQQggZRhiGwfrL84a6GYSQYUAtFQSs7r7znMwhbA0hhJCBFmwx1ZwsLeZkaYPur1OJadw4yg16HmeBQIAff/wRGzZsgMViQVJSEq644go8+uijAfuVlpbCYPCt1uNyuSgpKcF7772Hjo4O6HQ6nH/++Xj66aeHPGAzXIj4XOQnqpCfONQtGXkyomXIiKY6P2Rk83q9ATW8u+pPlo2hcN6EWPC4DHLi5BGvua0U8wNqtxBCxpbjx49Dp9NBJBJh5syZWL9+PZKTk/2Pf/DBB3j//fcRFxeHiy66CI899liPq8AdDkdAn2s0Gge0/YQQQgghhBBCCCGEkPANSgB88+bN/v8nJSV1q7MYTNfS5GKxGN99991ANI0QQkac1atXY/HixUhOTobJZMLGjRuxefNmfPfdd2Fn2RiOpEIeLszXDXUzCCGjTFFREd59911kZ2ejoaEBTz75JM466ywcPHgQcrkc1157LVJSUqDT6VBSUoIHH3wQpaWl+PTTT0Mec/369d3qihNCCCGEEEIIIYQQQoaHQV8BPlQ6A+q0QoeQka/z77jrRJmxpLm5GTfccAMaGhqgVCqRn5+P7777Dueddx5qamrCyrLRG+ozCRk9xnqfuXjxYv//8/PzUVRUhJSUFPzzn//ELbfcgttuu83/eF5eHuLj4zF//nyUl5eHLBuxevVqrFq1yv+zwWBAcnIy9ZmEjBJjvd8caDTOJGR0oT5zYFGfScjoQn3mwKI+k5DR5Uz7zDETADeZTAB8K9AJIaODyWSCUqkc6mYMunfeeSfkY+Fm2egN9ZmEjD5jtc88nUqlwrhx41BWVhb08aKiIgBAWVlZyAC4UCgMKMPTOSCnPpOQ0YX6zYFB40xCRifqMwcG9ZmEjE7UZw4M6jMJGZ3622eOmQC4TqdDTU0N5HI5GOZUbVmj0YikpCTU1NRAoVAMYQsHB73f0W2svF+WZWEymaDTUbrsgRKqzyQ9Gyt/g8MZ/Q66oz4zkNlsRnl5Oa6//vqgjxcXFwMA4uPjwz5mf/rMsfpZpfdN73skoH5zYA32OHOkfg6HMzqnA2OknlfqMwfWaL02H6mf9+GKzmfkDdQ5pT5zYAXrM+nvo//o3PUfnbv+63ru5HL5GfWZYyYAzuFwkJiYGPJxhUIxpj6I9H5Ht7HwfmmW5MDqrc8kPRsLf4PDHf0OAo3lPvO+++7DRRddhJSUFNTX1+OJJ54Al8vFNddcg/LycmzcuBEXXHABoqKiUFJSgpUrV2Lu3LnIz88P+zXOpM8cq59Vet9jy0h832O53xxoQzXOHImfw+GOzunAGInnlfrMgTPar81H4ud9OKPzGXkDcU6pzxw4PfWZ9PfRf3Tu+o/OXf91nrsz6TPHTACcEEIIIYSMPbW1tbjmmmvQ1taG6OhozJkzB9u3b0d0dDTsdjt+/PFHbNiwARaLBUlJSbjiiivw6KOPDnWzCSGEEEIIIYQQQggh/UQBcEIIIYQQMmp9+OGHIR9LSkrCli1bBrE1hBBCCCGEEEIIIYSQgcYZ6gYMNaFQiCeeeAJCoXComzIo6P2ObmPt/RIy3NDf4NCj3wEZKcbqZ5XeN71vQgYbfQ4jj87pwKDzSsYS+rxHFp3PyKNzOnrQ77L/6Nz1H527/ovkuWNYlmUj0CZCCCGEEEIIIYQQQgghhBBCCCFkSI35FeCEEEIIIYQQQgghhBBCCCGEEEJGBwqAE0IIIYQQQgghhBBCCCGEEEIIGRUoAE4IIYQQQgghhBBCCCGEEEIIIWRUoAA4IYQQQgghhBBCCCGEEEIIIYSQUWHMBMB/+eUXXHTRRdDpdGAYBp9//nnA42vWrEFOTg6kUinUajUWLFiAHTt2DE1jI6C399vV7373OzAMgw0bNgxa+yKtt/d74403gmGYgH+LFi0amsaeoXB+t0eOHMHFF18MpVIJqVSKadOmobq6evAbS8gYsm7dOsyaNQsSiQQqlSroPtXV1ViyZAkkEgliYmJw//33w+12D25DR7HXXnsNqampEIlEKCoqws6dO4e6SYQENRY+q72NV1iWxeOPP474+HiIxWIsWLAAx48fH5rGRsj69esxbdo0yOVyxMTE4NJLL0VpaWnAPna7HXfeeSeioqIgk8lwxRVXoKmpaYhaHBmvv/468vPzoVAooFAoMHPmTHzzzTf+x0fjeyYjQ11dHa677jpERUVBLBYjLy8Pu3fvHupmjWgejwePPfYY0tLSIBaLkZGRgaeffhosyw5100aUsfgdScam3sYI8+bN63av7ne/+90QtnhkefbZZ8EwDO69917/Nhp3nZlg55Q+pyPDWL0WiwS6nosc6pfDt2bNmm59a05Ojv/xSJ23MRMAt1gsmDRpEl577bWgj48bNw6vvvoqDhw4gF9//RWpqak4//zz0dLSMsgtjYze3m+nzz77DNu3b4dOpxuklg2McN7vokWL0NDQ4P/3j3/8YxBbGDm9vdfy8nLMmTMHOTk52Lx5M0pKSvDYY49BJBINcksJGVucTieWLl2KO+64I+jjHo8HS5YsgdPpxNatW/Hee+/h3XffxeOPPz7ILR2dPvroI6xatQpPPPEE9u7di0mTJmHhwoVobm4e6qYREmCsfFZ7G688//zzePnll/HGG29gx44dkEqlWLhwIex2+yC3NHK2bNmCO++8E9u3b8cPP/wAl8uF888/HxaLxb/PypUr8eWXX+Ljjz/Gli1bUF9fj8svv3wIW33mEhMT8eyzz2LPnj3YvXs3zj33XFxyySU4dOgQgNH5nsnw197ejtmzZ4PP5+Obb77B4cOH8eKLL0KtVg9100a05557Dq+//jpeffVVHDlyBM899xyef/55vPLKK0PdtBFlLH5HkrGptzECANx6660B9+qef/75IWzxyLFr1y68+eabyM/PD9hO467+C3VOAfqcjgRj9VosEuh6LjKoX+673NzcgL71119/9T8WsfPG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n//8Z1x88cVYtmwZnE4nPvzwQyxduhRfffUVlixZErBvOO07cOAAzj//fERHR2PNmjVwu9144oknEBsbe6anjxAyivTWHwZz9913Iy4uDk8++SS2b9+Ot956CyqVClu3bkVycjKeeeYZ/Oc//8Ef//hHTJw4ETfccAMAX4Dl4osvxqZNm3DLLbdg8uTJ+O6773D//fejrq4OL730UsDr/Pzzz/jnP/+Ju+66C1qtNuigFQCampowY8YM/4A1Ojoa33zzDW655RYYjUbce++9AIC3334b99xzD37zm99gxYoVsNvtKCkpwY4dO3Dttdf2ei7WrVuHxx57DFdeeSV++9vfoqWlBa+88grmzp2Lffv2QaVSncFvghAy1t1444345z//ieuvvx4zZszAli1buo0Bgb6PQe+++26o1Wo88cQTqKysxIYNG3DXXXfho48+8u/z+OOPY+3atbjgggtwwQUXYO/evTj//PPhdDoDjnXixAl8/vnnWLp0KdLS0tDU1IQ333wTZ599Ng4fPgydTjcwJ4cQQobAo48+imeeeQZvvvkmbr311qFuDiGERERPfdvTTz8NgUCA++67Dw6HAwKBAIcPHz6j8Z/H48HChQtRVFSEF154AT/++CNefPFFZGRk4I477vDvd/vtt+Pdd9/FTTfdhHvuuQcVFRV49dVXsW/fPvzvf/8bNtnpCCGjU7B7kH0pj/j111/jqquuQl5eHtavX4/29nbccsstSEhI6HebfvjhB5w4cQI33XQT4uLicOjQIbz11ls4dOgQtm/fDoZhMG/ePCQlJeGDDz7AZZddFvD8Dz74ABkZGZg5c2a/20AGCUtIhP3xj39kAbAVFRUB2wGwAoGALSsr82/bv38/C4B95ZVX/NusVmu3Y27bto0FwP7973/3b9u0aRMLgN20aZN/2/Lly9mUlJSA555+PKfTyU6cOJE999xz+9W+Sy+9lBWJRGxVVZV/2+HDh1kul8vSnxQhpKtQ/WFKSgq7fPly/89/+9vfWADswoULWa/X698+c+ZMlmEY9ne/+51/m9vtZhMTE9mzzz7bv+3zzz9nAbBr164NeJ3f/OY3LMMwAf0aAJbD4bCHDh3q1l4A7BNPPOH/+ZZbbmHj4+PZ1tbWgP2uvvpqVqlU+vvXSy65hM3Nze3XuaisrGS5XC67bt26gO0HDhxgeTxet+2E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lZXxv//7v5x22mmcc845vPvuu72qFwmCIBwNxmtuG4/1X2lpKatXr2bZsmWD2ggvCIIwGEOZJ/t7P9DrHIe/v/ueuq/798NfG+w5Ozo6ePfdd1m+fDm//OUvk6/3Fe8BuOyyy7j55pt5+umnCQQCqNVqvvnNb/bzyYSjjegBLow6o9EI9J5sBkupVPbKnPnTn/40rB1ASqUSSZJS3ltVVcXLL7887LGdffbZvPzyy9TU1CRf3717N2+99dawzikIwrFrpPPhYJ133nnEYrFeOxDvu+8+JEni3HPPHfI5lUoll1xyCS+88AI7duzo9f3W1tbkn9vb21O+p9FomD59OrIsE4lEgP5/FhdffDFKpZLly5f3mvtlWe51bkEQhG6lpaW43W62bduWfK2xsZGXXnop+fXZZ58NwMMPP5zy3j/96U+9zjeaa1CAM888E7VazZ/+9KeU895///2Duvbzzz9PfX39sK4tCIIwHgYzD/c0e/ZsXn/9dXbv3s2FF15IIBAYr6EKgiAM2njNbeOx/rv00kuJxWLcfffdvb4XjUbH/FmFIAjHpqHOk4crKipCqVTywQcfpLx++H17bm4uM2fOTLab6LZ27Vq2b98+rHN2V884fP7t6z4dID09nXPPPZcnn3ySp556inPOOUdsUv8CERngwqibP38+AHfddReXXXYZarWaCy+8cNDvv+CCC/jnP/+J1Wpl+vTpfPrpp6xevXpY/Q+66/TsAAEAAElEQVTPP/98/vjHP3LOOedw+eWX09LSwkMPPURZWVnKBD0Uy5cv58033+Tkk0/mhz/8IdFolD/96U/MmDFj2OcUBOHYNNL5cLAuvPBCTj/9dO666y6qqqqYM2cOb7/9Nq+88go33XQTpaWlwzrvPffcw/vvv8/ixYv5/ve/z/Tp03E6nXz++eesXr0ap9MJwFlnnUV2djbLli0jKyuL3bt38+CDD3L++ecnd7/397MoLS3lt7/9LXfccQdVVVVcdNFFmM1mKisreemll7juuuu49dZbR+cHJQjCMeWyyy7jtttu42tf+xo/+tGP8Pv9PPLII0yePDnZC2z+/Plccskl3H///bS3t7NkyRLWrl3Lvn37gNRKHaO5BoVEJY1bb72VFStWcMEFF3DeeeexefNm3njjjV43zBdccAG/+c1vuOaaazjxxBPZvn07Tz31VErmuCAI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QfEWCqsaiLPpufCoDM6emEpKC3VgN+2r5sLnVuCuD3RXs4UQol9zmHScNjZ8D/vh88Z36FzDk2xRj688dhCzRyZi1mtIsBtbOUr0JxIAF/2CUaeJBL+F6E+eeOIJZsyYgdVqZdmyZdxyyy088MADUStvRowYwZIlSzj77LOpra1l8eLFzJs3j6SkJHbt2sWtt97KkCFDmDNnTs9diBBCCNEOg+KtDIq39nQzhBiwnE4nw4YNY+fOnZx88sn4fD6qqqqixqLFxcUt1gxv1FdL7fRHBwe/WyPBbyGO3OrVq3n22WcZN25cs21XXXUV9957b+Sx2SzZFXqLK2Zmc+7kNDbnV/PpliLW762ioKqBv10wkcw4M7UNgRYD343GpjkYmWxnXJqs/hZCiL4gK87S000Q3UgC4EII0YutWrWKu+++m9raWkaMGMGzzz7LJZdcErXP9u3bqa6uBkCj0bBx40aWLl1KVVUVKSkpnHLKKdx3332S4lwIIYQQQhyR2tpadu3axSWXXMLkyZPR6XQsX76cefPmAeFxaF5eHtOnT2/1HFJqRwjR39XW1nLxxRfz97//nT/96U/NtpvN5kNOFBI9y2HSccyQOI4ZEtdsW1syEL16xTRMek1XNE0IIYQQHSABcCGE6MVeeeWVw+6jKAdSdZlMJj799NOubJIQQgghhOinbr75Zs4880wyMzMpKCjg7rvvRqPRMH/+fBwOB1dccQULFy4kJiYGu93O73//e6ZPn87RRx/d000XQogec80113D66acze/bsFgPgr732Gv/4xz9ISkrizDPP5M4775RV4P2IBL+FEEKI3mnABMAbA0Rut7uHWyKE6KjG3+OmgV/RuaTPFKL/kD6z60mfKUT/MpD7zX379jF//nzKy8uJj49n5syZ/PDDD8THxwPw17/+FbVazbx58/B6vcyZM4ennnrqiF5D+kwh+peB3GcCvPnmm6xdu5bVq1e3uP2iiy4iMzOTlJQUNm7cyG233cb27dt57733Wtzf6/Xi9XojjxuzvUmfKUT/MND7zK4m40wh+peO9pkDJgBeU1MDILXGhOhHampqcDikzlJXkD5TiP5H+syuI32mEP3TQOw333zzzUNuNxqNPPnkkzz55JPtfg3pM4XonwZin7l3716uv/56li1bhtFobHGfq6++OvLvsWPHkpyczKxZs9i1axeD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/TbHH3981La33nqL0aNHM2bMGLZs2cIxxxxDamoqt99+OxaLhbfffpu5c+fyz3/+k7PPPjvq2N///ve4XC7uvvtucnNzefTRR7n22mt56623Ivu8+uqrXHbZZcyZM4cHH3yQuro6nn76aWbOnMm6devIyspi5MiRvPrqq1HnrqqqYuHChSQkJBzx9dbV1XH88ceTn5/Pb37zGzIyMvj+++9ZtGgRhYWFPProo60eu3r1ar7//nsuvPBC0tLSyM3N5emnn+aEE05g69atmM3mI26PEKL/i4+Pb9aP+f1+brzxxsgq63feeYe6ujp+97vfERsby6pVq3j88cfZt28f77zzTtSxwWCQ0047jeOOO46HHnqI1157jWuvvRaLxcIf//hHLr74Ys455xyeeeYZLr30UqZPn052dnbUOa699lqcTif33HMP27dv5+mnn2bPnj2RSUctkXGqEEIIIYQQQgghROeSALjo85YtW4bP5+Pjjz8mLi6uxX1cLhe5ublRKSevuuoqRowYweOPP84LL7zQXc0VQgwQJpOJM888k3fffZfHHnsMjUYDQFFREV9//XVkVfX1119PRkYGq1evxmAwAPB///d/zJw5k9tuu61ZADw2NpbPPvssEkgJhUI89thjVFdX43A4qK2t5brrruPKK6/kueeeixx32WWXMXz4cO6//36ee+45EhMT+dWvfhXZrigKZ511FgaDgZdffvmIr/eRRx5h165drFu3jqFDhwLwm9/8hpSUFB5++GFuuukm0tPTWzz29NNP59xzz4167swzz2T69On885//5JJLLjni9ggh+j+LxRLVjwFcc8011NbWsmzZMgAefPBBTCZTZPvVV1/NkCFD+MMf/kBeXh4ZGRmRbQ0NDfzqV79i0aJFAFx00UWkpKTw61//mjfeeIMLLrgAgJNPPpkRI0awdOnSZhky9Ho9y5cvR6fTAZCZmcmtt97Kf/7zH84666wWr0PGqUIIIYQQQgghhBCdS1Kgiz7P6XQC8K9//avVNLsajSZyUzEUClFRUUEgEGDKlCmsXbu2u5oqhBhgLrjgAkpKSvjqq68iz7377ruEQiEuuOACKioq+OKLLzj//POpqamhrKyMsrIyysvLmTNnDjt27CA/Pz/qnFdffXXUKsJjjz2WYDDInj17gPCkoKqqKubPnx85X1lZGRqNhmnTprWaUve+++7jww8/5OWXX2bUqFFHfK3vvPMOxx57LC6XK+p1Z8+eTTAY5Jtvvmn12KbBKb/fT3l5OUOGDMHpdEofLYRos1deeYWnnnqKhx56iBNPPBGI7l88Hg9lZWXMmDEDRVFYt25ds3NceeWVkX87nU6GDx+OxWLh/PPPjzw/fPhwnE4nu3fvbnb81VdfHQl+A/zud79Dq9Xy3//+t9V2yzhVCCGEEEIIIYQQonPJCnDR511wwQU8//zzXHnlldx+++3MmjWLc845h3PPPRe1+sAcj6VLl/KXv/yFn376Cb/fH3n+4NSVQgjRWU499VQcDgdvvfUWs2bNAsLpzydMmMCwYcNYtWoViqJw5513cuedd7Z4jpKSElJTUyOPm65WhPDKQSBSY3bHjh0AnHTSSS2ez263N3vuk08+YfHixSxatIh58+Yd4VUSed2NGzcSHx/f4vaSkpJWj62vr2fJkiW89NJL5OfnoyhKZFt1dXW72iOEGFjWr1/Pb3/7W+bPn8/ChQsjz+fl5XHXXXfx73//u1kt7oP7F6PR2KwPczgcpKWlNUtf7nA4mp0PiGTAaGS1WklOTiY3N/eQ7ZdxqhBCCCGEEEIIIUTnkQC46NVaq5UYDAYj/zaZTHzzzTd8+eWXfPTRR3zyySe89dZbnHTSSXz22WdoNBr+8Y9/sGDBAubOncstt9xCQkICGo2GJUuWsGvXru66HCHEAGMwGJg7dy7vv/8+Tz31FMXFxXz33Xfcf//9AJGsFTfffDNz5sxp8RxDhgyJetyYSv1gjUHjxnO++uqrJCUlNdtPq43+05+Tk8PFF1/MySefzJ/+9Kc2X1vTfrjxdU8++WRuvfXWFvcfNmxYq+f6/e9/z0svvcQNN9zA9OnTcTgcqFQqLrzwwlYzewghRKPKykrmzZvHsGHDeP755yPPB4NBTj75ZCoqKrjtttsYMWIEFouF/Px8FixY0Kx/aa1/PVy/21EyThVCCCGEEEIIIYToXBIAF72ay+Wiqqqq2fONqX4bqdVqZs2axaxZs3jkkUe4//77+eMf/8iXX37J7Nmzeffddxk0aBDvvfdeVFD97rvv7upLEEIMcBdccAFLly5l+fLlbNu2DUVRInVkBw0aBIBOp2P27Nmd8nqDBw8GICEh4bDnrK+v55xzzsHpdPLGG29EZc1o1FI/7PP5KCwsbPa6tbW17bqOd999l8suu4y//OUvkecaGhpa7P+FEKKpUCjExRdfTFVVFZ9//jlmszmybdOmTfz8888sXbqUSy+9NPJ8Y33wrrBjx45I+nWA2tpaCgsL+cUvftHqMTJOFUIIIYQQQgghhOhcUgNc9GqDBw+murqajRs3Rp4rLCzk/fffjzyuqKhodtyECRMA8Hq9wIGVO01X6qxcuZIVK1Z0RbOFECJi9uzZxMTE8NZbb/HWW28xderUSErbhIQETjjhBJ599tlmAWWA0tLSI369OXPmYLfbuf/++6PS6LZ0zt/+9rf8/PPPvP/++5FU6gcbPHhws/rdzz33XLMV4Oeffz4rVqzg008/bXaOqqoqAoFAq23WaDTNVlI+/vjjzV5DCCEOtnjxYj799FPeeOONZunCWxr/KYrC3/72ty5rz3PPPRfV9z799NMEAgFOO+20Vo+RcaoQQgghhBBCCCFE55IV4KJXu/DCC7nttts4++yzue6666irq+Ppp59m2LBhrF27FoB7772Xb775htNPP53MzExKSkp46qmnSEtLY+bMmQCcccYZvPfee5x99tmcfvrp5OTk8MwzzzBq1Chqa2t78hKFEP2cTqfjnHPO4c0338Tj8fD//t//i9r+5JNPMnPmTMaOHctVV13FoEGDKC4uZsWKFezbt48NGzYc0evZ7XaefvppLrnkEiZNmsSFF15IfHw8eXl5fPTRRxxzzDE88cQTfPTRR7zyyivMmzePjRs3Rk00slqtzJ07F4Arr7yS3/72t8ybN4+TTz6ZDRs28OmnnxIXFxf1urfccgv//ve/OeOMM1iwYAGTJ0/G4/GwadMm3n33XXJzc5sd0+iMM87g1VdfxeFwMGrUKFasWMHnn39ObGzsEV27EGJg2bRpE/fddx/HHXccJSUl/OMf/4jafsEFFzB48GBuvvlm8vPzsdvt/POf/2yxdndn8fl8zJo1i/PPP5/t27fz1FNPMXPmTM4666xWj5FxqhBCCCGEEEIIIUTnkgC46NViY2N5//33WbhwIbfeeivZ2dksWbKEHTt2RALgZ511Frm5ubz44ouUlZURFxfH8ccfz+LFi3E4HAAsWLCAoqIinn32WT799FNGjRrFP/7xD9555x2++uqrHrxCIcRAcMEFF/D888+jUqk4//zzo7aNGjWKH3/8kcWLF/Pyyy9TXl5OQkICEydO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bQLgGRkZqK6uhsFggCCM/Tn+nE4nsrOzUV1dDaPRONLDGTbcb+430JmN43K5kJGRMYKjG92Sk5Mhk8nQ2NgYtbyxsRFpaWnd2q9evRr33ntv1+tIJIK2tjYkJSWNuXPmeP++jPf9A8b/Pg73/vGcOfTG23Xmycb793Gk8LgOjUQdV543iYiIiIiIiMa20yYALooisrKyRnoYCWc0Gk/Lm2bc79NLrP1mNk7vlEoliouL8cEHH+Cyyy4D0BnU/uCDD3DHHXd0a69SqaBSqaKWmc3mYRjp0Bnv35fxvn/A+N/H4dw/njOH1ni9zjzZeP8+jhQe16GRiOPK8yYRERERERHR2HXaBMCJiE439957L1atWoV58+ZhwYIFeOqpp+B2u3HjjTeO9NCIiIiIiIiIiIiIiIiGBAPgRETj1NVXX43m5mY8+OCDaGhowOzZs/HOO+8gNTV1pIdGREREREREREREREQ0JBgAH6NUKhUeeuihbiWLxzvuN/eb+ueOO+6IWfJ8PBvvPzfjff+A8b+P433/aHzhz+vQ4HEdGjyuRERERERERAQAgiRJ0kgPgoiIiIiIiIiIiIiIiIiIaLDEkR4AERERERERERERERERERFRIjAATkRERERERERERERERERE4wID4ERERERERERERERERERENC4wAE5EREREREREREREREREROMCA+Cj3KOPPopFixZBq9XCbDZ3W79jxw5cc801yM7OhkajwbRp0/Db3/62W7sNGzZg7ty5UKlUKCgowNq1a4d+8IPQ134DQFVVFS6++GJotVrYbDZ8//vfRygUimoz1vY7lgMHDmDlypVITk6G0WjE4sWL8dFHH0W1iedYjEVvvfUWFi5cCI1GA4vFgssuuyxq/Xjdbxq48fx92bBhAwRBiPlny5YtXe127tyJs846C2q1GtnZ2fjlL385gqPuv/H+vc/Ly+v2+T3++ONRbcb6Z0hjz2OPPYb58+fDYDDAZrPhsssuQ3l5eVQbn8+H22+/HUlJSdDr9bjiiivQ2Ng4QiMeG5577jnMnDkTRqMRRqMRJSUl+O9//9u1nsc0MR5//HEIgoC77767axmPLREREREREdHpjQHwUS4QCODKK6/ErbfeGnN9aWkpbDYb/vrXv2LPnj340Y9+hNWrV+Ppp5/ualNRUYGLL74YS5YsQVlZGe6++258+9vf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KSnBj370IwSDwa5169evx5QpU0asdPbp8L0fzO+3srKyrnL9wOj8DGn8kyQJd955J15//XVs2LChWxn+4uJiKBQKfPDBB7jiiisAAOXl5aiqqhoV11VjSSQSgd/v5zEdhPPPPx+7du2KWnbjjTdi6tSp+OEPf4js7GweWyIiIiIiIqLTnUSj2tGjR6Xt27dLDz/8sKTX66Xt27dL27dvl1wulyRJkrRr1y4pJSVF+uY3vynV19d3/Wlqaurq48iRI5JWq5W+//3vS/v27ZOeeeYZSSaTSe+8885I7Vaf+trvUCgkFRUVScuWLZPKysqkd955R0pJSZFWr17d1cdY3O9TNTc3S0lJSdLll18ulZWVSeXl5dL3vvc9SaFQSGVlZZIkxXcsxqK77rpLyszMlN59911p//790k033STZbDapra1NkqTxu980cKfL9+X999+XAEj79u3rts5ut0upqanSddddJ+3evVtat26dpNVqpeeff34ERtp/4/17/8UXX0i/+c1vpLKyMunw4cPSX//6VyklJUW6/vrru9qM9c+QxqZbb71VMplM0oYNG6KuJz0eT1ebW265RcrJyZE+/PBDaevWrVJJSYlUUlIygqMe/e6//37p448/lioqKqSdO3dK999/vyQIgvTee+9JksRjmkjnnHOOdNddd3W95rElIiIiIiIiOr0xAD7KrVq1SgLQ7c9HH30kSZIkPfTQQzHX5+bmRvXz0UcfSbNnz5aUSqU0YcIEac2aNcO+L/3R135LkiRVVlZKK1askDQajZScnCzdd999UjAYjOpnrO13LFu2bJGWLVsmWa1WyWAwSGeccYb09ttvR7WJ51iMNYFAQLrvvvskm80mGQwGaenSpdLu3buj2ozH/abBOR2+L9dcc420aNGiHtfv2LFDWrx4saRSqaTMzEzp8ccfH8bRDc54/96XlpZKCxculEwmk6RWq6Vp06ZJP//5zyWfzxfVbix/hjQ2xbrmAhB13eT1eqXbbrtNslgsklarlb761a9K9fX1IzfoMeBb3/qWlJubKymVSiklJUU6//zzu4LfksRjmkinBsB5bImIiIiIiIhOb4IkSdJwZpwTERERERERERERERERERENBbHvJkRERERERERERERERERERKMfA+BERERERERERERERERERDQuMABORERERERERERERERERETjAgPgREREREREREREREREREQ0LjAATkRERERERERERERERERE4wID4ERERERERERERERERERENC4wAE5EREREREREREREREREROMCA+BERERERERERERERERERDQuMABORERERERERERERERERETjAgPgREREREREREREREREREQ0LjAATkRERERERERERERERERE4wID4ERERERERERERERERERENC78fzKb2ZcvOL18AAAAAElFTkSuQmCC", "text/plain": [ - "<Figure size 1440x1440 with 50 Axes>" + "<Figure size 2000x2000 with 69 Axes>" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1771,7 +1749,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 67, "metadata": { "scrolled": false }, @@ -1781,362 +1759,76 @@ "output_type": "stream", "text": [ "aland\tSize 0.913\tSaving geojson for aland...\n", + "argentina\tSize 662.347\tSaving geojson for argentina...\n", "australia\tSaving geojson for australia...\n", "belgium\tSize 7.709\tSaving geojson for belgium...\n", + "bolivia\tSize 161.264\tSaving geojson for bolivia...\n", "brazil\tSaving geojson for brazil...\n", - "bulgaria\tSize 18.715\tSaving geojson for bulgaria...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "bulgaria\tSize 18.715\tSaving geojson for bulgaria...\n", "burundi\tSize 3.99\tSaving geojson for burundi...\n", "canada\tSaving geojson for canada...\n", + "chile\tSize 1652.977\tSaving geojson for chile...\n", "china\tSaving geojson for china...\n", - "denmark\t" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Size 22.461\tSaving geojson for denmark...\n", + "colombia\tSize 264.526\tSaving geojson for colombia...\n", + "costa rica\tSize 25.939\tSaving geojson for costa rica...\n", + "cuba\tSize 37.185\tSaving geojson for cuba...\n", + "denmark\tSize 22.461\tSaving geojson for denmark...\n", + "dominican republic\tSize 8.806\tSaving geojson for dominican republic...\n", + "ecuador\tSize 112.048\tSaving geojson for ecuador...\n", "egypt\tSize 117.982\tSaving geojson for egypt...\n", + "el salvador\tSize 3.116\tSaving geojson for el salvador...\n", "estonia\tSize 13.694\tSaving geojson for estonia...\n", "ethiopia\tSize 172.021\tSaving geojson for ethiopia...\n", - "france\t" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Size 142.834\tSaving geojson for france...\n", + "france\tSize 142.834\tSaving geojson for france...\n", "finland\tSize 112.354\tSaving geojson for finland...\n", - "germany\t" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Size 71.47\tSaving geojson for germany...\n", + "germany\tSize 71.47\tSaving geojson for germany...\n", + "guatemala\tSize 16.442\tSaving geojson for guatemala...\n", + "haiti\tSize 5.882\tSaving geojson for haiti...\n", + "honduras\tSize 27.669\tSaving geojson for honduras...\n", "iceland\tSize 34.959\tSaving geojson for iceland...\n", "india\tSaving geojson for india...\n", - "indonesia\tSaving geojson for indonesia...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "indonesia\tSaving geojson for indonesia...\n", "iran\tSize 284.014\tSaving geojson for iran...\n", - "italy\t" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Size 138.162\tSaving geojson for italy...\n", - "japan\t" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Size 661.569\tSaving geojson for japan...\n", + "italy\tSize 138.162\tSaving geojson for italy...\n", + "japan\tSize 661.569\tSaving geojson for japan...\n", "kenya\tSize 77.61\tSaving geojson for kenya...\n", "korea\tSize 34.227\tSaving geojson for korea...\n", - "liechtenstein\tSize 0.029\tSaving geojson for liechtenstein...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "liechtenstein\tSize 0.029\tSaving geojson for liechtenstein...\n", "malaysia\tSize 127.7\tSaving geojson for malaysia...\n", - "mexico\tSize 575.302\tSaving geojson for mexico...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "mexico\tSize 575.302\tSaving geojson for mexico...\n", "morocco\tSize 231.84\tSaving geojson for morocco...\n", "myanmar\tSize 168.709\tSaving geojson for myanmar...\n", "netherlands\tSize 10.818\tSaving geojson for netherlands...\n", - "nigeria\tSize 115.287\tSaving geojson for nigeria...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "nicaragua\tSize 21.415\tSaving geojson for nicaragua...\n", + "nigeria\tSize 115.287\tSaving geojson for nigeria...\n", "norway\tSize 530.052\tSaving geojson for norway...\n", + "panama\tSize 14.275\tSaving geojson for panama...\n", + "paraguay\tSize 69.763\tSaving geojson for paraguay...\n", "portugal\tSize 105.727\tSaving geojson for portugal...\n", "poland\tSize 58.556\tSaving geojson for poland...\n", + "puerto rico\tSize 1.616\tSaving geojson for puerto rico...\n", "russia\tSaving geojson for russia...\n", - "rwanda\tSize 3.59\tSaving geojson for rwanda...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "rwanda\tSize 3.59\tSaving geojson for rwanda...\n", + "saint barthelemy\tSize 0.004\tSaving geojson for saint barthelemy...\n", + "saint martin\tSize 0.012\tSaving geojson for saint martin...\n", "singapore\tSize 0.067\tSaving geojson for singapore...\n", "slovenia\tSize 4.537\tSaving geojson for slovenia...\n", - "spain\tSize 178.488\t" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving geojson for spain...\n", + "spain\tSize 178.488\tSaving geojson for spain...\n", "sweden\tSize 178.774\tSaving geojson for sweden...\n", "switzerland\tSize 8.935\tSaving geojson for switzerland...\n", - "syria\tSize 33.348\tSaving geojson for syria...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "syria\tSize 33.348\tSaving geojson for syria...\n", "tanzania\tSize 119.579\tSaving geojson for tanzania...\n", - "thailand\tSize 122.959\t" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving geojson for thailand...\n", + "thailand\tSize 122.959\tSaving geojson for thailand...\n", "timorleste\tSize 4.486\tSaving geojson for timorleste...\n", "uganda\tSize 31.083\tSaving geojson for uganda...\n", - "uk\tSaving geojson for uk...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "uk\tSaving geojson for uk...\n", "ukraine\tSize 128.988\tSaving geojson for ukraine...\n", "uruguay\tSize 25.985\tSaving geojson for uruguay...\n", - "usa\tSaving geojson for usa...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n", - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "usa\tSaving geojson for usa...\n", + "venezuela\tSize 204.361\tSaving geojson for venezuela...\n", "zambia\tSize 115.483\tSaving geojson for zambia...\n", "Done. \n" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/yann/Library/Python/3.8/lib/python/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.\n", - " pd.Int64Index,\n" - ] } ], "source": [ @@ -2194,7 +1886,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3.10.7 64-bit", "language": "python", "name": "python3" }, @@ -2208,7 +1900,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.9" + "version": "3.10.7" + }, + "vscode": { + "interpreter": { + "hash": "cfa538cd06c93e304ca575fcc7e49a96f6a8b18fe97e2a1aa2a1d32cf31b50ca" + } } }, "nbformat": 4, diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts index f1aad661eeae..c6b26bd2b685 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts @@ -22,6 +22,7 @@ import { D3_FORMAT_OPTIONS, D3_FORMAT_DOCS, sections, + getStandardizedControls, } from '@superset-ui/chart-controls'; import { countryOptions } from './countries'; @@ -88,6 +89,11 @@ const config: ControlPanelConfig = { renderTrigger: false, }, }, + formDataOverrides: formData => ({ + ...formData, + entity: getStandardizedControls().shiftColumn(), + metric: getStandardizedControls().shiftMetric(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries.ts b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries.ts index 871c3cdb7cc8..fcabfa6d23b5 100755 --- a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries.ts @@ -18,21 +18,33 @@ */ import austria from './countries/austria.geojson'; +import argentina from './countries/argentina.geojson'; import australia from './countries/australia.geojson'; import belgium from './countries/belgium.geojson'; +import bolivia from './countries/bolivia.geojson'; import brazil from './countries/brazil.geojson'; import bulgaria from './countries/bulgaria.geojson'; import burundi from './countries/burundi.geojson'; import canada from './countries/canada.geojson'; +import chile from './countries/chile.geojson'; import china from './countries/china.geojson'; +import colombia from './countries/colombia.geojson'; +import costa_rica from './countries/costa rica.geojson'; +import cuba from './countries/cuba.geojson'; import cyprus from './countries/cyprus.geojson'; import denmark from './countries/denmark.geojson'; +import dominican_republic from './countries/dominican republic.geojson'; +import ecuador from './countries/ecuador.geojson'; import egypt from './countries/egypt.geojson'; +import el_salvador from './countries/el salvador.geojson'; import estonia from './countries/estonia.geojson'; import ethiopia from './countries/ethiopia.geojson'; import france from './countries/france.geojson'; import finland from './countries/finland.geojson'; import germany from './countries/germany.geojson'; +import guatemala from './countries/guatemala.geojson'; +import haiti from './countries/haiti.geojson'; +import honduras from './countries/honduras.geojson'; import iceland from './countries/iceland.geojson'; import india from './countries/india.geojson'; import indonesia from './countries/indonesia.geojson'; @@ -44,6 +56,7 @@ import jordan from './countries/jordan.geojson'; import kenya from './countries/kenya.geojson'; import korea from './countries/korea.geojson'; import kuwait from './countries/kuwait.geojson'; +import latvia from './countries/latvia.geojson'; import liechtenstein from './countries/liechtenstein.geojson'; import lithuania from './countries/lithuania.geojson'; import nigeria from './countries/nigeria.geojson'; @@ -53,15 +66,22 @@ import mexico from './countries/mexico.geojson'; import morocco from './countries/morocco.geojson'; import myanmar from './countries/myanmar.geojson'; import netherlands from './countries/netherlands.geojson'; +import nicaragua from './countries/nicaragua.geojson'; import oman from './countries/oman.geojson'; import pakistan from './countries/pakistan.geojson'; +import panama from './countries/panama.geojson'; +import papua_new_guinea from './countries/papua new guinea.geojson'; +import paraguay from './countries/paraguay.geojson'; import philippines from './countries/philippines.geojson'; import peru from './countries/peru.geojson'; import poland from './countries/poland.geojson'; import portugal from './countries/portugal.geojson'; +import puerto_rico from './countries/puerto rico.geojson'; import qatar from './countries/qatar.geojson'; import russia from './countries/russia.geojson'; import rwanda from './countries/rwanda.geojson'; +import saint_barthelemy from './countries/saint barthelemy.geojson'; +import saint_martin from './countries/saint martin.geojson'; import saudi_arabia from './countries/saudi_arabia.geojson'; import singapore from './countries/singapore.geojson'; import slovenia from './countries/slovenia.geojson'; @@ -72,6 +92,7 @@ import syria from './countries/syria.geojson'; import tanzania from './countries/tanzania.geojson'; import thailand from './countries/thailand.geojson'; import timorleste from './countries/timorleste.geojson'; +import turkey from './countries/turkey.geojson'; import united_arab_emirates from './countries/united_arab_emirates.geojson'; import uganda from './countries/uganda.geojson'; import uk from './countries/uk.geojson'; @@ -79,25 +100,38 @@ import ukraine from './countries/ukraine.geojson'; import uruguay from './countries/uruguay.geojson'; import usa from './countries/usa.geojson'; import zambia from './countries/zambia.geojson'; +import venezuela from './countries/venezuela.geojson'; import vietnam from './countries/vietnam.geojson'; export const countries = { austria, + argentina, australia, belgium, + bolivia, brazil, bulgaria, burundi, canada, + chile, china, + colombia, + costa_rica, + cuba, cyprus, denmark, + dominican_republic, + ecuador, egypt, + el_salvador, estonia, ethiopia, france, finland, germany, + guatemala, + haiti, + honduras, iceland, india, indonesia, @@ -109,6 +143,7 @@ export const countries = { kenya, korea, kuwait, + latvia, liechtenstein, lithuania, malaysia, @@ -116,17 +151,24 @@ export const countries = { morocco, myanmar, netherlands, + nicaragua, nigeria, norway, oman, pakistan, + panama, + papua_new_guinea, + paraguay, philippines, peru, poland, portugal, + puerto_rico, qatar, russia, rwanda, + saint_barthelemy, + saint_martin, saudi_arabia, singapore, slovenia, @@ -137,6 +179,7 @@ export const countries = { tanzania, thailand, timorleste, + turkey, united_arab_emirates, uganda, uk, @@ -144,6 +187,7 @@ export const countries = { uruguay, usa, zambia, + venezuela, vietnam, }; diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/argentina.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/argentina.geojson new file mode 100644 index 000000000000..35ac2073a0a1 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/argentina.geojson @@ -0,0 +1,30 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "AR-E", "NAME_1": "Entre Ríos" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -58.200111852217844, -32.447129912359713 ], [ -58.222808397999927, -32.534274997999944 ], [ -58.179351365999935, -32.828301690999922 ], [ -58.137766079999949, -32.900323174999926 ], [ -58.14679928299995, -33.049981377999927 ], [ -58.204457160999937, -33.091892184999949 ], [ -58.383168097999942, -33.07545338299991 ], [ -58.430165167999917, -33.102634372999944 ], [ -58.41234290299991, -33.298272393999923 ], [ -58.50649980399993, -33.405857028999947 ], [ -58.549387173999946, -33.683038018999923 ], [ -58.540679490999935, -33.745212497999944 ], [ -58.461048956999946, -33.859470309999949 ], [ -58.439361131999931, -33.979668877999927 ], [ -58.446970686747761, -34.006940156662893 ], [ -58.638508267342672, -34.048515719524858 ], [ -59.031817592907601, -33.829562676876037 ], [ -59.231314459594614, -33.797988376462399 ], [ -59.268934903023364, -33.721248874635876 ], [ -59.392648281393065, -33.739387301882459 ], [ -59.520702481334411, -33.655309746747434 ], [ -59.602764654864927, -33.677788994666344 ], [ -59.772392544380409, -33.610506279641072 ], [ -59.843886887969518, -33.533921807445438 ], [ -60.118082038255466, -33.393568616798234 ], [ -60.495423346909945, -33.122060641685266 ], [ -60.675464036735889, -32.846521905161808 ], [ -60.705823941221922, -32.679503675554201 ], [ -60.767008836388698, -32.578321221946851 ], [ -60.706934984362022, -32.156176446186066 ], [ -60.66179561957216, -32.069256687146378 ], [ -60.719957444580416, -31.922340589546593 ], [ -60.674042935233274, -31.85288746508445 ], [ -60.647765469001172, -31.716048271910211 ], [ -60.414110480414308, -31.673518568826864 ], [ -60.163660650818372, -31.442059828098593 ], [ -60.063382533876847, -31.26951222121204 ], [ -59.719837612815581, -30.830986016491465 ], [ -59.660642259033011, -30.736056409675541 ], [ -59.622350022935223, -30.574825941563972 ], [ -59.61477942562999, -30.462688083488274 ], [ -59.661520759075756, -30.336907646670568 ], [ -59.388540004717413, -30.305953463881281 ], [ -59.241313849654432, -30.343470553623149 ], [ -59.004997525215629, -30.204099215806139 ], [ -58.876168178918306, -30.226991875774445 ], [ -58.587141893283729, -30.153042901009087 ], [ -58.229644335117939, -30.252985121166432 ], [ -58.06800045405771, -30.420726821185838 ], [ -57.98725602924236, -30.603506362128883 ], [ -57.801867634999979, -30.773314309999932 ], [ -57.807241984999848, -30.907569681999917 ], [ -57.911731730999946, -30.94736053499993 ], [ -57.855249389999898, -31.058981627999955 ], [ -57.911731730999946, -31.17060272199997 ], [ -57.905117146999942, -31.240986022999905 ], [ -57.990228230999975, -31.399322611999921 ], [ -58.07523596199988, -31.475183613999931 ], [ -57.986817585999944, -31.554145202999891 ], [ -57.988626260999922, -31.642821960999896 ], [ -58.059267943999913, -31.811493834999922 ], [ -58.15285396399986, -31.835988464999971 ], [ -58.202618367999975, -31.893142597999898 ], [ -58.145309203999915, -32.017889505999904 ], [ -58.186546996999908, -32.152920023999883 ], [ -58.096526652999955, -32.280974222999888 ], [ -58.200111852217844, -32.447129912359713 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-A", "NAME_1": "Salta" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.284732110969486, -23.834136437456095 ], [ -67.251328739999906, -23.733090625999878 ], [ -67.079775967386979, -23.833583672748318 ], [ -66.873561164116438, -24.050056247597752 ], [ -66.768502976930847, -24.098373712177079 ], [ -66.675330370200413, -24.199142754634408 ], [ -66.50448808475727, -24.237124933269058 ], [ -66.388009406009246, -24.140955092103809 ], [ -66.351990933035097, -24.04137460715242 ], [ -66.337934943143125, -23.723822930583765 ], [ -66.406664598092732, -23.518822524140205 ], [ -66.377570767277064, -23.390716648254738 ], [ -66.352197638610107, -23.367823989185752 ], [ -66.257164679906055, -23.391285089035648 ], [ -65.992090419637123, -23.533860365063788 ], [ -65.986845262299028, -23.719223727493045 ], [ -66.025964321596177, -23.847639661741027 ], [ -66.000203620200921, -23.94132903420757 ], [ -65.959405076982705, -23.993160496259918 ], [ -65.901940883964585, -23.980396416661279 ], [ -65.759107224618731, -24.076824640244979 ], [ -65.751536628212818, -24.175113214003602 ], [ -65.580358445985496, -24.407967217812882 ], [ -65.276862759308869, -24.501811619010994 ], [ -65.164879929964798, -24.454269300787587 ], [ -65.064265917138357, -24.54646005558709 ], [ -64.922310756935872, -24.599531751988764 ], [ -64.828182135796908, -24.455457859192848 ], [ -64.618014086380981, -24.613949477086692 ], [ -64.502982346657973, -24.480727634172979 ], [ -64.298033617057797, -24.401611016435254 ], [ -64.177084927327542, -24.240690605786824 ], [ -64.183415290283392, -23.525953870974377 ], [ -64.367486742419203, -23.509572442014587 ], [ -64.438283454018176, -23.619591566597535 ], [ -64.555769823118851, -23.505645032492282 ], [ -64.660104539892586, -23.454640394538558 ], [ -64.79567766029578, -23.502441095180416 ], [ -64.868954840593403, -23.496291598478479 ], [ -64.95254147021268, -23.308396090507188 ], [ -65.036877406866836, -23.265814710580457 ], [ -65.013002895866919, -23.033994235545549 ], [ -65.05718624534893, -22.991826266768783 ], [ -65.181984829336386, -22.984953301453686 ], [ -65.227175869170992, -22.950640150822323 ], [ -65.285596075698322, -22.731790460061688 ], [ -65.265235562171426, -22.638204441281971 ], [ -65.345489060571651, -22.588233331203298 ], [ -65.190478219194461, -22.098473959105945 ], [ -65.020367594999897, -22.096582946999916 ], [ -64.586879841999917, -22.21275156699997 ], [ -64.542774006999934, -22.275486755999921 ], [ -64.572022867999891, -22.343182881999908 ], [ -64.428284871999921, -22.542343851999931 ], [ -64.453709675999846, -22.642906188999945 ], [ -64.355731160999909, -22.751943460999968 ], [ -64.325293741999957, -22.871936136999878 ], [ -64.250828002999924, -22.540690204999876 ], [ -64.160549275999898, -22.438474223 ], [ -63.933172973999916, -22.001808369999949 ], [ -63.81312862199988, -22.003048604999904 ], [ -63.740419880999923, -22.050590921999913 ], [ -63.639392455999882, -21.997467549999968 ], [ -62.804352986999902, -22.004082131999965 ], [ -62.78347570899993, -22.130896097999937 ], [ -62.624829060999929, -22.247271422999944 ], [ -62.625294148999842, -22.305045674999946 ], [ -62.341356966999911, -22.472261048 ], [ -62.334380866383867, -24.4029029267287 ], [ -63.398579474962787, -25.659363701473637 ], [ -63.924387173029629, -25.652335706527651 ], [ -64.191761033944545, -25.579885348530013 ], [ -64.425002611381387, -26.027558281689323 ], [ -64.486342536179109, -26.220208021483018 ], [ -64.767358974936712, -26.21137135230606 ], [ -64.945720180841647, -26.274106541083995 ], [ -65.252807380256399, -26.172355644897095 ], [ -65.314379849050795, -26.076030775899596 ], [ -65.442072312886921, -26.120059095750662 ], [ -65.665340338685667, -26.074790540650952 ], [ -65.71900631428997, -26.299014580858227 ], [ -66.053817918961784, -26.253487644239385 ], [ -66.1570415916961, -26.169875177097765 ], [ -66.209053920901738, -26.165741062000393 ], [ -66.399352383205894, -26.387329603878129 ], [ -66.533271857210423, -26.259998875247902 ], [ -66.815838588679924, -25.812480970820161 ], [ -66.809973313717421, -25.73016041397193 ], [ -66.745713670649366, -25.677398776832092 ], [ -66.571279873367473, -25.667115166831479 ], [ -66.495031297056698, -25.608514093150859 ], [ -66.469244758139041, -25.479788099641098 ], [ -66.560350308220166, -25.272358900442896 ], [ -67.806863368849406, -25.283210951224419 ], [ -68.496467799049697, -25.159996516725869 ], [ -68.36664912899991, -25.123426614999929 ], [ -68.443543660999893, -25.021107278999921 ], [ -68.473050903999933, -24.907935892999973 ], [ -68.551030639999908, -24.868765156999928 ], [ -68.578005737999945, -24.80871714299991 ], [ -68.49553015099994, -24.601804707999904 ], [ -68.451501831999877, -24.629296569999966 ], [ -68.397654988999932, -24.500518899999875 ], [ -68.326806599999884, -24.49824513699987 ], [ -68.244486043999927, -24.385383809999979 ], [ -67.362369344999934, -24.030366718999929 ], [ -67.284732110969486, -23.834136437456095 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-Y", "NAME_1": "Jujuy" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.251328739999906, -23.733090625999878 ], [ -67.013966837999874, -23.000713805999879 ], [ -67.193904174999972, -22.82222340899996 ], [ -67.026627563999909, -22.639392190999985 ], [ -67.032725382999871, -22.524567158999986 ], [ -66.785091918999882, -22.427622171999957 ], [ -66.735895955999922, -22.225050557999921 ], [ -66.377468220999845, -22.127072040999892 ], [ -66.307601684999952, -22.077049254999906 ], [ -66.22246476199993, -21.786937763999973 ], [ -66.094488078999944, -21.832929789999881 ], [ -66.046532348999932, -21.917989196999983 ], [ -65.9326891689999, -21.944550882999906 ], [ -65.775308593999938, -22.105057880999908 ], [ -65.190478219194461, -22.098473959105945 ], [ -65.345489060571651, -22.588233331203298 ], [ -65.265235562171426, -22.638204441281971 ], [ -65.286629605371957, -22.722798761253841 ], [ -65.231025764327569, -22.945059095800616 ], [ -65.017421230905086, -23.026707859080432 ], [ -65.041347418748387, -23.256667983040984 ], [ -64.95254147021268, -23.308396090507188 ], [ -64.874742601190064, -23.494069513097543 ], [ -64.79567766029578, -23.502441095180416 ], [ -64.660104539892586, -23.454640394538558 ], [ -64.555769823118851, -23.505645032492282 ], [ -64.438283454018176, -23.619591566597535 ], [ -64.367486742419203, -23.509572442014587 ], [ -64.188841314774834, -23.513293145062619 ], [ -64.158765632028292, -24.183639824818044 ], [ -64.298033617057797, -24.401611016435254 ], [ -64.502982346657973, -24.480727634172979 ], [ -64.609358282558674, -24.610538831501856 ], [ -64.828182135796908, -24.455457859192848 ], [ -64.901743536934646, -24.592555433886162 ], [ -64.935875821312095, -24.597671400914408 ], [ -65.064265917138357, -24.54646005558709 ], [ -65.164879929964798, -24.454269300787587 ], [ -65.276862759308869, -24.501811619010994 ], [ -65.587102220091367, -24.402592869265504 ], [ -65.751536628212818, -24.175113214003602 ], [ -65.759107224618731, -24.076824640244979 ], [ -65.901940883964585, -23.980396416661279 ], [ -65.959405076982705, -23.993160496259918 ], [ -66.000203620200921, -23.94132903420757 ], [ -66.025964321596177, -23.847639661741027 ], [ -65.986845262299028, -23.719223727493045 ], [ -65.986819423877307, -23.543317152764416 ], [ -66.170193244022983, -23.420688979113095 ], [ -66.342120734184505, -23.368702487429857 ], [ -66.377570767277064, -23.390716648254738 ], [ -66.406664598092732, -23.518822524140205 ], [ -66.337934943143125, -23.723822930583765 ], [ -66.351990933035097, -24.04137460715242 ], [ -66.388009406009246, -24.140955092103809 ], [ -66.50448808475727, -24.237124933269058 ], [ -66.675330370200413, -24.199142754634408 ], [ -66.768502976930847, -24.098373712177079 ], [ -66.873561164116438, -24.050056247597752 ], [ -67.079775967386979, -23.833583672748318 ], [ -67.251328739999906, -23.733090625999878 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-P", "NAME_1": "Formosa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -62.341356966999911, -22.472261048 ], [ -62.2872269289999, -22.483949482999961 ], [ -62.241183227999983, -22.538416442999861 ], [ -62.25281042499995, -22.603632100999974 ], [ -62.192969116999876, -22.628230081999959 ], [ -62.188266560999892, -22.70832855299993 ], [ -62.035821085999885, -22.884855244999898 ], [ -61.956446085999914, -23.034406839999917 ], [ -61.769274048999961, -23.165561624999953 ], [ -61.732997192999903, -23.243386331999901 ], [ -61.51605952999995, -23.344982197999911 ], [ -61.501073363999893, -23.407820739999892 ], [ -61.296951456999921, -23.481407979999886 ], [ -61.272611856999902, -23.52357594799993 ], [ -61.109856933999907, -23.606981709999985 ], [ -61.118848632999942, -23.666409606999935 ], [ -61.006349039999861, -23.805470885999924 ], [ -60.837625487999929, -23.871823424999945 ], [ -60.632159993999892, -23.89228729299991 ], [ -60.577538004999951, -23.944170430999918 ], [ -60.337371785999892, -24.016414082999944 ], [ -60.033669392999883, -24.007008971999895 ], [ -59.610516927999925, -24.289575703999958 ], [ -59.465900431999927, -24.353551126999946 ], [ -59.34097265699998, -24.487599792999958 ], [ -59.000915893999974, -24.644179381999905 ], [ -58.809196329999878, -24.776781106999934 ], [ -58.473402872999941, -24.851298522999883 ], [ -58.335995238999914, -24.991858418999882 ], [ -58.224064087999892, -24.941215514999911 ], [ -57.983768676999915, -25.074230651999954 ], [ -57.870700643999982, -25.085289407999952 ], [ -57.754066934999912, -25.18089080799993 ], [ -57.640792195999921, -25.372610371999926 ], [ -57.558109904999952, -25.443510436999901 ], [ -57.575318156999941, -25.56443328899995 ], [ -57.774582478999974, -25.701685891999944 ], [ -57.740372680999883, -25.722149759999908 ], [ -57.820626179999891, -25.778270364999941 ], [ -57.801867634999979, -25.831393737999889 ], [ -57.875351521999875, -25.876145527999938 ], [ -57.851373656999925, -25.908391621999911 ], [ -57.905840617999843, -25.968646341999971 ], [ -57.859590210999954, -25.980945332999923 ], [ -57.872716023999942, -26.010297546 ], [ -58.08650142399992, -26.127189635999954 ], [ -58.124018514999932, -26.201913756999957 ], [ -58.151303669999919, -26.181449889999982 ], [ -58.105983438999914, -26.239534199999881 ], [ -58.169958862999891, -26.270333353999945 ], [ -58.16763342299987, -26.33503224699993 ], [ -58.213057006999918, -26.418644713999939 ], [ -58.1854101159999, -26.451717630999923 ], [ -58.217346150999873, -26.527578632999933 ], [ -58.164946248999939, -26.592277526999922 ], [ -58.192283081999875, -26.612844746999912 ], [ -58.178640502999968, -26.650671894999888 ], [ -58.235536254999914, -26.649845072999952 ], [ -58.24793859899998, -26.758158874999893 ], [ -58.287936157999951, -26.768597513999921 ], [ -58.288556274999934, -26.811488952999881 ], [ -58.340026001999917, -26.808595071999903 ], [ -58.315789753999923, -26.874120788999903 ], [ -58.351274896203968, -26.885811609526552 ], [ -58.382141485940792, -26.845647882243952 ], [ -58.457589076574607, -26.8342273897822 ], [ -58.56983028833713, -26.694804376021125 ], [ -58.863326585853258, -26.503859958570217 ], [ -58.982104865247322, -26.389603367001769 ], [ -59.152301194644394, -26.296379082528631 ], [ -59.264516567985197, -26.346660251869139 ], [ -59.346992153565054, -26.340097344916558 ], [ -59.419623378715926, -26.184447930927263 ], [ -59.663200242996822, -26.132203057724951 ], [ -59.67356136736322, -26.013502292696671 ], [ -59.853679571554949, -25.866121108002744 ], [ -59.867838915133802, -25.817700290635912 ], [ -60.038629522834185, -25.697190850477398 ], [ -60.178052538393899, -25.665099786126234 ], [ -60.238694831201485, -25.495239352614021 ], [ -60.344243943902882, -25.424029228965765 ], [ -60.360341152921876, -25.363257744948953 ], [ -60.499660813895446, -25.209572034821576 ], [ -60.645129970671576, -25.164510186196139 ], [ -61.034253506094444, -24.897963148480528 ], [ -61.076473150815275, -24.895275974206868 ], [ -61.145202805764882, -24.72567392311305 ], [ -61.208532273745448, -24.66578093823972 ], [ -61.44366004067831, -24.62397470466891 ], [ -61.573367886119058, -24.486101982720356 ], [ -61.654603238248853, -24.483621514920969 ], [ -61.775706956710678, -24.341718031561925 ], [ -61.902029994988254, -24.317275078881778 ], [ -62.026621874300076, -24.215989271587603 ], [ -62.339212612571998, -24.120646253621715 ], [ -62.341356966999911, -22.472261048 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-N", "NAME_1": "Misiones" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -54.598497273999925, -25.653833516999939 ], [ -54.60020261299988, -25.574944883999891 ], [ -54.560050007999877, -25.570221048999926 ], [ -54.473026895999936, -25.625824890999922 ], [ -54.447343708999938, -25.689180195999938 ], [ -54.395408894999946, -25.58107309899988 ], [ -54.299239054999902, -25.552651061999939 ], [ -54.255624144999871, -25.598746438999882 ], [ -54.190253458999905, -25.580763040999983 ], [ -54.214799764999952, -25.531463723999892 ], [ -54.16508703599996, -25.534357604999883 ], [ -54.11640783699994, -25.494566751999869 ], [ -54.098889526999869, -25.597196146999948 ], [ -54.082714802999874, -25.550067240999937 ], [ -53.997448689999914, -25.574975279999919 ], [ -53.96773474099993, -25.653213398999881 ], [ -53.898126586999922, -25.639467467999935 ], [ -53.883450480999926, -25.735585632999943 ], [ -53.84035233599991, -25.791396178999918 ], [ -53.833427693999937, -25.962238464999928 ], [ -53.765008097999953, -26.02807423899992 ], [ -53.666719522999955, -26.219173685999948 ], [ -53.72444209799994, -26.37606333399988 ], [ -53.739531616999926, -26.675579935999863 ], [ -53.774309854999984, -26.714337259999894 ], [ -53.722426716999877, -26.814382832999868 ], [ -53.724597127999886, -26.940473327999925 ], [ -53.800923217999923, -27.039071960999919 ], [ -53.830017049999924, -27.156790872999906 ], [ -53.882210245999886, -27.119893900999969 ], [ -53.909495401999919, -27.168263040999918 ], [ -53.964117390999945, -27.154000345999947 ], [ -53.961791951999913, -27.191414082999913 ], [ -54.00514847799991, -27.188210143999939 ], [ -54.091758178999925, -27.285155130999968 ], [ -54.158059041999934, -27.279470722999932 ], [ -54.177024292999903, -27.243400573999935 ], [ -54.231646281999929, -27.380549824999903 ], [ -54.286888386999948, -27.428402200999898 ], [ -54.347711547999978, -27.394295755999934 ], [ -54.371586059999856, -27.454447122999881 ], [ -54.388897664999973, -27.411142272999911 ], [ -54.444553181999879, -27.408971861999916 ], [ -54.448377237999921, -27.458891296999894 ], [ -54.543255167999916, -27.487003274999921 ], [ -54.58945389799996, -27.452586770999872 ], [ -54.690326293999959, -27.55128875699998 ], [ -54.773938760999982, -27.563794453999975 ], [ -54.805047973999933, -27.526380716999924 ], [ -54.845097208999931, -27.611853535999941 ], [ -54.89827225699986, -27.62363576199995 ], [ -54.913206745999929, -27.73691050199993 ], [ -54.985192016999889, -27.785279641999878 ], [ -55.081155151999951, -27.778251647999952 ], [ -55.029633747999952, -27.850702005999935 ], [ -55.099939533999958, -27.843777363999962 ], [ -55.119240682999902, -27.880881042999945 ], [ -55.177557535999938, -27.853595885999923 ], [ -55.260239827999925, -27.919224954999962 ], [ -55.314112508999955, -27.914987487999909 ], [ -55.44074560599995, -28.078905130999942 ], [ -55.505935424999876, -28.078905130999942 ], [ -55.553477742999888, -28.145567727999961 ], [ -55.604740763999928, -28.116938984999891 ], [ -55.623041889271747, -28.144350089584975 ], [ -55.736954107945735, -28.065986829428653 ], [ -55.832658861117523, -27.918398940059035 ], [ -55.858600429666069, -27.753292739268488 ], [ -56.017324591556644, -27.45155404997945 ], [ -56.014482387652038, -27.393779798598814 ], [ -55.966094416224337, -27.331723069164298 ], [ -55.913094034999915, -27.327839863999969 ], [ -55.854157063999878, -27.401220397999921 ], [ -55.754731607999872, -27.443698424999951 ], [ -55.591330728999964, -27.328356627999923 ], [ -55.568670613999927, -27.245984394999937 ], [ -55.598281209999953, -27.167539570999921 ], [ -55.555338094999911, -27.153793639999975 ], [ -55.533840698999938, -27.099430033999923 ], [ -55.461855428999911, -27.097983092999925 ], [ -55.414003051999885, -26.979850768999924 ], [ -55.280600341999843, -26.934272155999935 ], [ -55.138360962999911, -26.953702493999927 ], [ -55.125777750999873, -26.863578795999928 ], [ -55.060897989999944, -26.805184427999876 ], [ -54.975270141999886, -26.787821145999942 ], [ -54.919898844999949, -26.674132995999869 ], [ -54.793059041999896, -26.644987487999941 ], [ -54.789829264999895, -26.528508808999987 ], [ -54.697664347999961, -26.428153177999931 ], [ -54.638288126999925, -26.196952819999908 ], [ -54.66381628399995, -26.149203796999927 ], [ -54.642525594999967, -26.06280080199987 ], [ -54.662265990999941, -25.97991180399994 ], [ -54.60640376799995, -25.946632181999902 ], [ -54.587903604999923, -25.810826517999899 ], [ -54.642887329999979, -25.661584980999947 ], [ -54.598497273999925, -25.653833516999939 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-H", "NAME_1": "Chaco" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -58.351274896203968, -26.885811609526552 ], [ -58.475469930999907, -26.937992858999863 ], [ -58.511540079999918, -27.060155944999948 ], [ -58.545439819999928, -27.041035664999953 ], [ -58.565490274999974, -27.115966490999909 ], [ -58.653288533999927, -27.156274108999952 ], [ -58.652358357999873, -27.198028665999914 ], [ -58.601560424999974, -27.245674336999954 ], [ -58.604195923403154, -27.31626434282515 ], [ -58.886529304184023, -27.478942560250971 ], [ -58.815732590786411, -27.716860854245056 ], [ -58.864747687355873, -27.999324232926995 ], [ -61.709948696874847, -28.00040943764543 ], [ -61.710517136756437, -26.146569105979438 ], [ -61.722325201946489, -25.744164727020518 ], [ -61.753873663938407, -25.661430759022323 ], [ -63.398579474962787, -25.659363701473637 ], [ -62.334380866383867, -24.4029029267287 ], [ -62.339212612571998, -24.120646253621715 ], [ -62.026621874300076, -24.215989271587603 ], [ -61.902029994988254, -24.317275078881778 ], [ -61.775706956710678, -24.341718031561925 ], [ -61.654603238248853, -24.483621514920969 ], [ -61.573367886119058, -24.486101982720356 ], [ -61.44366004067831, -24.62397470466891 ], [ -61.208532273745448, -24.66578093823972 ], [ -61.145202805764882, -24.72567392311305 ], [ -61.076473150815275, -24.895275974206868 ], [ -61.034253506094444, -24.897963148480528 ], [ -60.645129970671576, -25.164510186196139 ], [ -60.499660813895446, -25.209572034821576 ], [ -60.360341152921876, -25.363257744948953 ], [ -60.344243943902882, -25.424029228965765 ], [ -60.238694831201485, -25.495239352614021 ], [ -60.178052538393899, -25.665099786126234 ], [ -60.038629522834185, -25.697190850477398 ], [ -59.867838915133802, -25.817700290635912 ], [ -59.853679571554949, -25.866121108002744 ], [ -59.67356136736322, -26.013502292696671 ], [ -59.663200242996822, -26.132203057724951 ], [ -59.419623378715926, -26.184447930927263 ], [ -59.346992153565054, -26.340097344916558 ], [ -59.264516567985197, -26.346660251869139 ], [ -59.152301194644394, -26.296379082528631 ], [ -58.95352779836918, -26.405623060755659 ], [ -58.863326585853258, -26.503859958570217 ], [ -58.56983028833713, -26.694804376021125 ], [ -58.462394986139714, -26.83040333394672 ], [ -58.382141485940792, -26.845647882243952 ], [ -58.351274896203968, -26.885811609526552 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-W", "NAME_1": "Corrientes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -58.238223428999845, -27.257043151999937 ], [ -57.944029500999903, -27.274613138999911 ], [ -57.513358113999914, -27.414139505999927 ], [ -57.33522945099989, -27.409488626999874 ], [ -57.180096801999952, -27.487313333999907 ], [ -57.076227173999939, -27.484006042999908 ], [ -56.904351358999918, -27.418687031999951 ], [ -56.771155354999934, -27.506743671999885 ], [ -56.612999633999948, -27.446385598999896 ], [ -56.546440388999883, -27.455067240999938 ], [ -56.39973099799991, -27.586842142999942 ], [ -56.296998250999906, -27.480905456999963 ], [ -56.279841674999943, -27.389644876999881 ], [ -56.149978799999957, -27.311820169999919 ], [ -55.966094416224337, -27.331723069164298 ], [ -56.000555588969235, -27.360396823954261 ], [ -56.017324591556644, -27.45155404997945 ], [ -55.873276537182448, -27.7157756486273 ], [ -55.83862748886753, -27.906616713290703 ], [ -55.736954107945735, -28.065986829428653 ], [ -55.623041889271747, -28.144350089584975 ], [ -55.772534138999902, -28.231970723999936 ], [ -55.663600219999921, -28.326538593999928 ], [ -55.694244343999941, -28.400125833999923 ], [ -55.842348999999871, -28.346382344999924 ], [ -55.905600951999958, -28.378008320999911 ], [ -55.902035278999904, -28.465134785999894 ], [ -56.011589314999952, -28.496554056999926 ], [ -56.040812336999892, -28.609001973999881 ], [ -56.184705362999892, -28.744187520999915 ], [ -56.286146199999877, -28.780154316999884 ], [ -56.301003173999902, -28.881440123999909 ], [ -56.391617797999913, -28.95223683699993 ], [ -56.427972167999883, -29.069852396999892 ], [ -56.617288777999931, -29.160906269999927 ], [ -56.688653930999919, -29.329578144999871 ], [ -56.769940958999911, -29.379084166999917 ], [ -56.819033569999931, -29.474995625999966 ], [ -57.020933390999915, -29.683355000999896 ], [ -57.112865763999878, -29.766037291999865 ], [ -57.291511189999909, -29.815129902999985 ], [ -57.325152547999949, -29.981011249999952 ], [ -57.506175089999942, -30.144308776999935 ], [ -57.64246584634791, -30.193092102762034 ], [ -57.623738972999888, -30.25810028099994 ], [ -57.652729451999875, -30.329103698999944 ], [ -57.849616658999963, -30.485269877999968 ], [ -57.889769246999975, -30.550795592999876 ], [ -57.808659168999952, -30.747331216999925 ], [ -57.98725602924236, -30.603506362128883 ], [ -58.06800045405771, -30.420726821185838 ], [ -58.260753546638853, -30.230712578822477 ], [ -58.629749111632179, -30.152267754653167 ], [ -58.876168178918306, -30.226991875774445 ], [ -59.004997525215629, -30.204099215806139 ], [ -59.241313849654432, -30.343470553623149 ], [ -59.388540004717413, -30.305953463881281 ], [ -59.661520759075756, -30.336907646670568 ], [ -59.669298061955999, -30.293861178750376 ], [ -59.595349087190641, -30.049173272228757 ], [ -59.6727862210073, -29.847118421577875 ], [ -59.5910857808841, -29.614987888180508 ], [ -59.582895066853837, -29.377793063698959 ], [ -59.511271532055559, -29.207570895880167 ], [ -59.358877733120892, -29.143492119965345 ], [ -59.197440557635616, -29.022052503820021 ], [ -59.194391649055376, -28.921386814150139 ], [ -59.086956345958583, -28.627089531856427 ], [ -59.066208258804068, -28.401366875780695 ], [ -59.087524786739493, -28.175230807655623 ], [ -59.059929571792281, -28.129445488618387 ], [ -58.95047888888962, -28.112392266989559 ], [ -58.894720018214286, -28.070792738993703 ], [ -58.841570808346148, -27.916331881611029 ], [ -58.815732590786411, -27.716860854245056 ], [ -58.886529304184023, -27.478942560250971 ], [ -58.655974901020841, -27.331147962608384 ], [ -58.510764932999905, -27.278437194999952 ], [ -58.238223428999845, -27.257043151999937 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-K", "NAME_1": "Catamarca" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -68.33776200399987, -27.045583190999892 ], [ -68.305360880999871, -26.897995300999895 ], [ -68.570150919999918, -26.5506263219999 ], [ -68.595317342999948, -26.457298685999945 ], [ -68.57516353399987, -26.303509623999958 ], [ -68.409023804999919, -26.144242857999885 ], [ -68.498475707999916, -25.754912617999906 ], [ -68.559350545999877, -25.663031920999941 ], [ -68.555009724999906, -25.572598163999956 ], [ -68.609941772999917, -25.474206237999937 ], [ -68.496467799049697, -25.159996516725869 ], [ -67.806863368849406, -25.283210951224419 ], [ -66.555105149982694, -25.275459486765897 ], [ -66.469244758139041, -25.479788099641098 ], [ -66.495031297056698, -25.608514093150859 ], [ -66.571279873367473, -25.667115166831479 ], [ -66.735378383805369, -25.673988132146576 ], [ -66.799250454145124, -25.717913100109513 ], [ -66.80286780530497, -25.859196465844207 ], [ -66.533271857210423, -26.259998875247902 ], [ -66.410592006715717, -26.382730400787352 ], [ -66.362300380558111, -26.372033379636775 ], [ -66.30158057338474, -26.245632826094038 ], [ -66.224815233136496, -26.170960381816144 ], [ -66.1570415916961, -26.169875177097765 ], [ -66.053817918961784, -26.253487644239385 ], [ -66.10017167788061, -26.321545504721257 ], [ -66.152028978354679, -26.537863050839121 ], [ -66.015835741226454, -26.600753269248003 ], [ -65.852021449830033, -26.730357761001869 ], [ -65.883776618296281, -26.940267428898721 ], [ -66.194636196703129, -27.319365736739371 ], [ -65.981884324901671, -27.393831475442255 ], [ -65.929329393336843, -27.654332371042074 ], [ -65.877859667389714, -27.697223810230639 ], [ -65.850832893223412, -27.780164482904581 ], [ -65.703038295580882, -27.81788827912078 ], [ -65.664565192329746, -27.945167331806942 ], [ -65.570694952709914, -28.050225518992534 ], [ -65.496952684418829, -27.961238701504897 ], [ -65.348951382100608, -27.863260186108675 ], [ -65.227589281220332, -27.923514907087281 ], [ -65.169091559427898, -27.909665622770262 ], [ -65.079097053386306, -28.274604587931378 ], [ -65.07222408717189, -28.424052830173991 ], [ -65.179995287052861, -28.645072931270761 ], [ -65.092584600698729, -28.721347345103879 ], [ -65.035430466942501, -29.292681979789563 ], [ -64.882468228126243, -29.557110284012424 ], [ -64.951146206232409, -29.578969415206359 ], [ -64.961636521808032, -29.610492038776556 ], [ -64.943394740874567, -29.878330986785613 ], [ -65.138189052582675, -30.063074232489839 ], [ -65.401893887293056, -30.140175469522319 ], [ -65.729496628966217, -29.502178236536395 ], [ -65.755386521570699, -29.314799492502573 ], [ -65.792438524218483, -29.250100599862776 ], [ -66.121824102600272, -28.970634453817013 ], [ -66.362300380558111, -28.854517511174208 ], [ -66.379327765563914, -28.82444182662897 ], [ -66.337573207937169, -28.735713392459104 ], [ -66.464697231891705, -28.631068616423534 ], [ -66.495961473043508, -28.499138685601849 ], [ -66.584354011328571, -28.404157402841861 ], [ -66.976164720125723, -28.267421562455127 ], [ -67.042646450373354, -28.284216403464256 ], [ -67.098586188202034, -28.341473890907366 ], [ -67.18710791679689, -28.356305027155258 ], [ -67.704156460052559, -28.339251803727734 ], [ -67.82409746032954, -28.382401624435431 ], [ -67.914402024733647, -28.248921400901907 ], [ -67.931946173676977, -28.124071140071067 ], [ -68.092091437070167, -28.154353530191258 ], [ -68.151519334849411, -28.105622653562591 ], [ -68.277273933245397, -28.086243991966683 ], [ -68.348432380050269, -28.019426364934816 ], [ -68.442225104405054, -27.9994275857145 ], [ -68.442302618770839, -27.743060805211996 ], [ -68.849616258283675, -27.79344532554137 ], [ -69.134060456999947, -27.772343536999884 ], [ -69.075830647999908, -27.696189473999951 ], [ -69.092341268999888, -27.640172220999943 ], [ -69.028572550999854, -27.55128875699998 ], [ -69.017410441999914, -27.460441588999913 ], [ -68.931446695999881, -27.395225931999889 ], [ -68.870752726999882, -27.198442077999914 ], [ -68.814322061999945, -27.120307311999895 ], [ -68.718617309999843, -27.106664733999892 ], [ -68.585860554999954, -27.162785338999925 ], [ -68.518009398999936, -27.076899108999982 ], [ -68.33776200399987, -27.045583190999892 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-F", "NAME_1": "La Rioja" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.420305744999894, -28.212643737999983 ], [ -69.303232787999889, -27.999530130999887 ], [ -69.190190592999869, -27.951367695999892 ], [ -69.134060456999947, -27.772343536999884 ], [ -68.849616258283675, -27.79344532554137 ], [ -68.657095709699206, -27.752052504019844 ], [ -68.569064906620156, -27.772102960083544 ], [ -68.499172532586272, -27.735774427847559 ], [ -68.428556688140645, -27.760217379628386 ], [ -68.442225104405054, -27.9994275857145 ], [ -68.348432380050269, -28.019426364934816 ], [ -68.277273933245397, -28.086243991966683 ], [ -68.151519334849411, -28.105622653562591 ], [ -68.092091437070167, -28.154353530191258 ], [ -67.931946173676977, -28.124071140071067 ], [ -67.914402024733647, -28.248921400901907 ], [ -67.82409746032954, -28.382401624435431 ], [ -67.704156460052559, -28.339251803727734 ], [ -67.18710791679689, -28.356305027155258 ], [ -67.098586188202034, -28.341473890907366 ], [ -67.042646450373354, -28.284216403464256 ], [ -66.976164720125723, -28.267421562455127 ], [ -66.584354011328571, -28.404157402841861 ], [ -66.518337368174969, -28.467512709244147 ], [ -66.464697231891705, -28.631068616423534 ], [ -66.335531988810203, -28.740674329856461 ], [ -66.377570767277064, -28.816793714957953 ], [ -66.362300380558111, -28.854517511174208 ], [ -66.121824102600272, -28.970634453817013 ], [ -65.792438524218483, -29.250100599862776 ], [ -65.755386521570699, -29.314799492502573 ], [ -65.729496628966217, -29.502178236536395 ], [ -65.401893887293056, -30.140175469522319 ], [ -65.767272101126537, -31.096241143913687 ], [ -65.75964982787724, -31.885495294272403 ], [ -65.907289394989562, -31.900739840771053 ], [ -66.054386358843374, -31.871439303481054 ], [ -66.21716712056616, -31.925441175869594 ], [ -66.373850064229089, -31.93381275795241 ], [ -66.730520799195517, -31.8765552705093 ], [ -66.782119717251135, -31.77444264091514 ], [ -66.836741706364649, -31.747467542692959 ], [ -66.854466721561948, -31.635743096666602 ], [ -66.944822963708816, -31.615692640602902 ], [ -67.048925137385197, -31.523295180228388 ], [ -67.103934699226954, -31.354261569915536 ], [ -67.05995805532001, -31.081823418815702 ], [ -67.114735074064413, -31.038518568477173 ], [ -67.08362586074486, -30.89160247177665 ], [ -67.192275559769257, -30.713990573805916 ], [ -67.566232062159941, -30.379747409915012 ], [ -67.634522468437183, -30.247869155037449 ], [ -67.913704392743512, -30.050723564940597 ], [ -68.076562669731402, -29.88272348430138 ], [ -68.156247728250037, -29.849133803182497 ], [ -68.335461594876676, -29.687231540603136 ], [ -68.605005866127783, -29.645321954244821 ], [ -68.700581428090402, -29.60212045669374 ], [ -68.823054572110777, -29.633074639483027 ], [ -69.01293962326497, -29.622377617433074 ], [ -69.019476690896568, -29.52233204448828 ], [ -68.979349942146087, -29.452982272813642 ], [ -68.975241664571172, -29.34291147228663 ], [ -68.941884528348282, -29.310613701461136 ], [ -69.000227219610508, -29.233409111641208 ], [ -69.004102953188749, -29.150261732492936 ], [ -68.913410814257645, -29.002053724599705 ], [ -69.102985806150002, -28.777674655660803 ], [ -69.190189785130485, -28.594016615574333 ], [ -69.473040738339364, -28.426429946085136 ], [ -69.542984789216632, -28.437540379285053 ], [ -69.65404516415299, -28.400993548313579 ], [ -69.510093546999883, -28.267524108999893 ], [ -69.490508178999875, -28.198381041999909 ], [ -69.420305744999894, -28.212643737999983 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-J", "NAME_1": "San Juan" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.957663126999904, -30.092735696999924 ], [ -69.980374918999871, -30.07247853599992 ], [ -69.927975016999937, -29.976773782999913 ], [ -69.915598510999871, -29.805621439999911 ], [ -69.929086059999946, -29.718288268999885 ], [ -69.973191894999928, -29.666095071999905 ], [ -70.040655477999849, -29.297538757999959 ], [ -69.910947631999903, -29.143232930999929 ], [ -69.803925740999915, -29.098687845999933 ], [ -69.802788859999907, -28.939937845999893 ], [ -69.73276729299991, -28.794313658999926 ], [ -69.753386189999901, -28.67339080799988 ], [ -69.678403686999928, -28.573861998999931 ], [ -69.65404516415299, -28.400993548313579 ], [ -69.542984789216632, -28.437540379285053 ], [ -69.473040738339364, -28.426429946085136 ], [ -69.420666673028506, -28.477331231251299 ], [ -69.33633073637435, -28.484772638246682 ], [ -69.161793586304952, -28.62135344810315 ], [ -69.102985806150002, -28.777674655660803 ], [ -68.908630744013635, -29.014146009730553 ], [ -68.998831957428877, -29.117912285723435 ], [ -69.000227219610508, -29.233409111641208 ], [ -68.941884528348282, -29.310613701461136 ], [ -68.978859015730961, -29.356295667710924 ], [ -69.017254604616312, -29.617778416140993 ], [ -68.823054572110777, -29.633074639483027 ], [ -68.700581428090402, -29.60212045669374 ], [ -68.605005866127783, -29.645321954244821 ], [ -68.335461594876676, -29.687231540603136 ], [ -68.156247728250037, -29.849133803182497 ], [ -68.076562669731402, -29.88272348430138 ], [ -67.913704392743512, -30.050723564940597 ], [ -67.634522468437183, -30.247869155037449 ], [ -67.566232062159941, -30.379747409915012 ], [ -67.192275559769257, -30.713990573805916 ], [ -67.08362586074486, -30.89160247177665 ], [ -67.114735074064413, -31.038518568477173 ], [ -67.05995805532001, -31.081823418815702 ], [ -67.103934699226954, -31.354261569915536 ], [ -67.048925137385197, -31.523295180228388 ], [ -66.944822963708816, -31.615692640602902 ], [ -66.854466721561948, -31.635743096666602 ], [ -66.836741706364649, -31.747467542692959 ], [ -66.782119717251135, -31.77444264091514 ], [ -66.730520799195517, -31.8765552705093 ], [ -67.366967740368921, -31.857951756168632 ], [ -67.393012660805653, -32.262164808459147 ], [ -67.493264940224776, -32.21348560957324 ], [ -67.739063889886609, -32.252863051288784 ], [ -67.831848923888742, -32.239168796602655 ], [ -67.985482958072055, -32.088376967223269 ], [ -68.055840420099287, -32.068429863947074 ], [ -68.251590746215982, -32.139588310751947 ], [ -68.393700935150036, -32.150130304070274 ], [ -68.68960018609971, -32.33508025445019 ], [ -68.88617733361707, -32.33657887121791 ], [ -68.922169969068818, -32.0762330061483 ], [ -69.039062058966863, -32.070755303914154 ], [ -69.174996913676637, -31.955671889146345 ], [ -69.291785650787119, -32.053857110117519 ], [ -69.447693448094128, -32.052823582242524 ], [ -69.608148769849834, -32.120261325999422 ], [ -69.662305670969943, -32.258030694261151 ], [ -69.981226773097092, -32.305366306010228 ], [ -70.256119043999973, -32.314277880999953 ], [ -70.309708821999948, -32.288312275999971 ], [ -70.335236979999905, -32.140000914999874 ], [ -70.387481852999883, -32.041712340999965 ], [ -70.284697428999948, -32.046776631999947 ], [ -70.244467326999938, -31.942235208999932 ], [ -70.313326172999922, -31.882083841999901 ], [ -70.428280395999963, -31.870094909999935 ], [ -70.475228433999916, -31.82007212399995 ], [ -70.486313028999945, -31.731188659999901 ], [ -70.589769246999936, -31.567684427999964 ], [ -70.568969482999904, -31.304237975999897 ], [ -70.535922403999905, -31.172566426999921 ], [ -70.479801798999887, -31.096705423999907 ], [ -70.408643350999938, -31.150035501999895 ], [ -70.339784505999916, -31.041721699999954 ], [ -70.266559000999933, -31.036450703999932 ], [ -70.339216064999874, -30.938162129999924 ], [ -70.21710465599989, -30.51513885499989 ], [ -70.143930826999906, -30.439587910999961 ], [ -70.173412231999919, -30.364657084999905 ], [ -70.030191, -30.397109882999914 ], [ -69.964587768999877, -30.374785664999948 ], [ -69.912136190999917, -30.329517109999955 ], [ -69.890742146999912, -30.228954772999927 ], [ -69.835758422999874, -30.161878762999905 ], [ -69.880716919999884, -30.099763691999925 ], [ -69.957663126999904, -30.092735696999924 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-M", "NAME_1": "Mendoza" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.010011352999925, -33.299103291999913 ], [ -70.10946264699993, -33.169602151999925 ], [ -70.111193807999911, -33.038447366999975 ], [ -70.04248998999995, -32.992662047999943 ], [ -70.000218668999963, -32.876596780999918 ], [ -70.155738891999931, -32.738414001999956 ], [ -70.181086181999916, -32.607569274999918 ], [ -70.13772965499993, -32.56901865599994 ], [ -70.172482056999883, -32.464942321999956 ], [ -70.245319986999874, -32.403964130999981 ], [ -70.256119043999973, -32.314277880999953 ], [ -69.662305670969943, -32.258030694261151 ], [ -69.608148769849834, -32.120261325999422 ], [ -69.447693448094128, -32.052823582242524 ], [ -69.291785650787119, -32.053857110117519 ], [ -69.184272834223918, -31.95675709386478 ], [ -69.13530941359852, -31.968280938214718 ], [ -69.024980230653114, -32.077318210866736 ], [ -68.922169969068818, -32.0762330061483 ], [ -68.88617733361707, -32.33657887121791 ], [ -68.68960018609971, -32.33508025445019 ], [ -68.393700935150036, -32.150130304070274 ], [ -68.020726283790964, -32.069049980672048 ], [ -67.831848923888742, -32.239168796602655 ], [ -67.467194179567741, -32.217929783033071 ], [ -67.393012660805653, -32.262164808459147 ], [ -67.361696742810409, -32.396833591297195 ], [ -67.32071733333828, -32.430991713196988 ], [ -67.258369717288588, -32.653562107005655 ], [ -67.192120531037688, -32.761100762889896 ], [ -67.226950445606576, -32.91613006015416 ], [ -67.151942105443823, -33.429070325834857 ], [ -67.01967627603932, -33.616500745812743 ], [ -66.929578417210166, -33.83793425895891 ], [ -66.844002245307365, -33.896276951120399 ], [ -66.747057257786196, -34.064173678972111 ], [ -66.759201218861165, -34.184528089499736 ], [ -66.82136796685819, -34.229279880661977 ], [ -66.812608812047017, -34.3846192362887 ], [ -66.737962206190844, -34.615406182549293 ], [ -66.546087612753126, -34.924896336296854 ], [ -66.553554857270854, -34.997243340607668 ], [ -66.505134039904021, -35.124160658987194 ], [ -66.521127896135511, -35.494215590277292 ], [ -66.608151007962647, -35.82985401814841 ], [ -66.617168545192214, -35.999921157235633 ], [ -68.24631974955679, -35.999301038711963 ], [ -68.282234869743434, -36.021056817118392 ], [ -68.293190274211781, -36.128285413740855 ], [ -68.256758389188292, -36.276751804052537 ], [ -68.24939449655875, -37.557035413853271 ], [ -68.427523159366274, -37.537760105044811 ], [ -68.506846482679009, -37.447378024476222 ], [ -68.678153856115557, -37.426294040537528 ], [ -68.756676194650652, -37.371672051424014 ], [ -68.985060186578323, -37.363817234177986 ], [ -69.020148485364302, -37.344335218895253 ], [ -69.061050381369967, -37.236021416655035 ], [ -69.154662237672142, -37.182691338734287 ], [ -69.302353481627847, -37.149773451183819 ], [ -69.53099585597397, -37.173647963083056 ], [ -69.703362595707233, -37.112153008654445 ], [ -69.815888028309871, -36.997379653148471 ], [ -69.787956915679104, -36.960172620869741 ], [ -69.790127326015295, -36.863227634247949 ], [ -69.907200283066572, -36.79558318491604 ], [ -69.956008674061025, -36.705821221971803 ], [ -70.067655605721598, -36.611770115198681 ], [ -70.162998622788223, -36.581591077865937 ], [ -70.260253668671851, -36.372818291530905 ], [ -70.341463182379925, -36.376952406628277 ], [ -70.37799842019092, -36.325327651050259 ], [ -70.358800624848925, -36.199392184601663 ], [ -70.430748044186885, -36.129402118113262 ], [ -70.38032466699994, -36.046015726999954 ], [ -70.412725789999939, -35.968914489999918 ], [ -70.383683634999869, -35.913207295999968 ], [ -70.42078731299992, -35.903802184999918 ], [ -70.420244710999981, -35.8683521519999 ], [ -70.3573286539999, -35.815228779999956 ], [ -70.421536620999944, -35.659682718999903 ], [ -70.408229939999927, -35.506203714999899 ], [ -70.471766113999877, -35.37938974999993 ], [ -70.428383748999892, -35.357065530999961 ], [ -70.475280110999847, -35.314070739999892 ], [ -70.560417033999869, -35.298361104999927 ], [ -70.578891357999908, -35.259707132999921 ], [ -70.542898722999922, -35.209270934999921 ], [ -70.38662919099994, -35.166689553999859 ], [ -70.353711303999916, -34.953265888999866 ], [ -70.276713419999879, -34.798236592999928 ], [ -70.316297566999935, -34.745629983999933 ], [ -70.252218790999933, -34.695813903999905 ], [ -70.227827514999916, -34.585329690999885 ], [ -70.067578898999869, -34.414590759999982 ], [ -70.057579508999936, -34.291187438999955 ], [ -69.911567749999875, -34.284572855999969 ], [ -69.828885457999917, -34.23330983399994 ], [ -69.873249674999869, -34.139982197999885 ], [ -69.855808878999937, -33.984746195 ], [ -69.909552367999936, -33.955704039999915 ], [ -69.91425492399992, -33.771942647999893 ], [ -69.860046345999876, -33.7263640339999 ], [ -69.895367187999881, -33.662285257999898 ], [ -69.878830728999873, -33.558002216999867 ], [ -69.841468668999937, -33.53278411799991 ], [ -69.787673502999922, -33.379408466999934 ], [ -69.813899292999935, -33.289491475999895 ], [ -69.869684000999911, -33.249597269999953 ], [ -69.940558227999958, -33.242879333999937 ], [ -70.010011352999925, -33.299103291999913 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-Q", "NAME_1": "Neuquén" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.499128784999925, -36.163631285999926 ], [ -70.430748044186885, -36.129402118113262 ], [ -70.372029792440969, -36.172158704860351 ], [ -70.382416755229087, -36.306569106179325 ], [ -70.35619096494105, -36.365997003059249 ], [ -70.260253668671851, -36.372818291530905 ], [ -70.162998622788223, -36.581591077865937 ], [ -70.067655605721598, -36.611770115198681 ], [ -69.956008674061025, -36.705821221971803 ], [ -69.907200283066572, -36.79558318491604 ], [ -69.790127326015295, -36.863227634247949 ], [ -69.787956915679104, -36.960172620869741 ], [ -69.815888028309871, -36.997379653148471 ], [ -69.703362595707233, -37.112153008654445 ], [ -69.53099585597397, -37.173647963083056 ], [ -69.302353481627847, -37.149773451183819 ], [ -69.154662237672142, -37.182691338734287 ], [ -69.061050381369967, -37.236021416655035 ], [ -69.020148485364302, -37.344335218895253 ], [ -68.985060186578323, -37.363817234177986 ], [ -68.756676194650652, -37.371672051424014 ], [ -68.678153856115557, -37.426294040537528 ], [ -68.506846482679009, -37.447378024476222 ], [ -68.427523159366274, -37.537760105044811 ], [ -68.24939449655875, -37.557035413853271 ], [ -68.252133347675851, -38.659293714533305 ], [ -68.01041683626795, -38.975501803965074 ], [ -68.258437873109358, -38.996327407284014 ], [ -68.320914680368219, -38.961807550178321 ], [ -68.604566615656779, -39.129600925242528 ], [ -68.67146175795375, -39.213626803534169 ], [ -68.797733120287262, -39.293466891683693 ], [ -68.835198534085066, -39.374340508607588 ], [ -68.962219204352778, -39.488700452963542 ], [ -69.244475878359083, -39.585490410853765 ], [ -69.364029304109067, -39.717161961055638 ], [ -69.516061366938516, -39.821910088979394 ], [ -69.680392422272462, -39.823150322429456 ], [ -69.944717372808498, -39.947380465636002 ], [ -70.095638394296429, -40.441303805825953 ], [ -70.180232713369037, -40.465643405718595 ], [ -70.238937140736425, -40.549824313641182 ], [ -70.444816047222787, -40.566877537068706 ], [ -70.536309170032155, -40.512203871111751 ], [ -70.680512254936616, -40.590183608186976 ], [ -70.812080450552344, -40.584964287471905 ], [ -70.971502245332317, -40.640361423840659 ], [ -71.130226407222892, -40.779474379239218 ], [ -71.026279263177457, -40.906805107869445 ], [ -71.148003099263633, -41.05124073677058 ], [ -71.297322150296964, -41.095114027890077 ], [ -71.553740606743588, -41.031965427062801 ], [ -71.867401588999911, -41.010235286999929 ], [ -71.851449340999949, -40.938326924999942 ], [ -71.955577352999853, -40.72035573299992 ], [ -71.853102986999914, -40.616382751999964 ], [ -71.861836303999979, -40.549720153999942 ], [ -71.796413940999912, -40.414534606999922 ], [ -71.729286255999881, -40.421355895999881 ], [ -71.67404414899994, -40.32410085099994 ], [ -71.68670487499989, -40.288547464999894 ], [ -71.742670450999896, -40.296505635999949 ], [ -71.81599930899992, -40.227155862999908 ], [ -71.814035603999884, -40.092900492999931 ], [ -71.683707641999973, -40.098998311999893 ], [ -71.680503702999914, -40.009494730999876 ], [ -71.61663163299994, -39.909862568999898 ], [ -71.684586140999926, -39.833484802999948 ], [ -71.714351766999897, -39.601354267999881 ], [ -71.689753783999919, -39.568384704999914 ], [ -71.617820190999879, -39.616650492999923 ], [ -71.503511922999905, -39.601664326999952 ], [ -71.495657104999879, -39.565594176999952 ], [ -71.541959187999879, -39.532314554999914 ], [ -71.46165401199994, -39.433819274999863 ], [ -71.476536824999897, -39.382969665999937 ], [ -71.412044636999951, -39.317960713999881 ], [ -71.430234741999897, -38.999117126999934 ], [ -71.399900674999884, -38.910543720999968 ], [ -71.236034708999938, -38.811635029999906 ], [ -71.048423421999871, -38.746626077999935 ], [ -70.945044718999981, -38.747246195999907 ], [ -70.87383459499992, -38.691435648999942 ], [ -70.883420572999938, -38.643066507999905 ], [ -70.83430212499988, -38.564414977999931 ], [ -70.97375097699998, -38.424681904999957 ], [ -71.019743000999966, -38.234305927999941 ], [ -71.007418171999916, -38.071008402999965 ], [ -71.185030069999897, -37.706069436999911 ], [ -71.190766154999949, -37.640026957999879 ], [ -71.127927611999951, -37.584423115999954 ], [ -71.117695678999979, -37.466497497999924 ], [ -71.205597289999872, -37.292657978999983 ], [ -71.146479451999909, -37.214833271999936 ], [ -71.139296427999852, -37.133287861999889 ], [ -71.089118611999936, -37.103418884999968 ], [ -71.207147583999898, -36.972367451999958 ], [ -71.135679077999981, -36.951490173999986 ], [ -71.195158650999929, -36.839145608999956 ], [ -71.145342569999912, -36.688250426999957 ], [ -71.057440958999905, -36.687630309999903 ], [ -71.043281615999973, -36.484335224999953 ], [ -70.934967813999947, -36.472552998999859 ], [ -70.890371053999928, -36.400412699999947 ], [ -70.807197835999915, -36.433382262999913 ], [ -70.71865026899988, -36.414572041999904 ], [ -70.710511230999941, -36.265847269999895 ], [ -70.604367838999906, -36.194637145999948 ], [ -70.581423502999883, -36.143167418999951 ], [ -70.499128784999925, -36.163631285999926 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-U", "NAME_1": "Chubut" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.923796346999922, -42.176907653999962 ], [ -71.749440063999941, -42.10435394299995 ], [ -71.739569865999869, -42.031903584999966 ], [ -71.769259569273686, -41.999606621748171 ], [ -65.127207810591983, -42.000226738473202 ], [ -65.054595506999931, -42.010674737999921 ], [ -64.972401495999918, -42.126885674999926 ], [ -64.857289191999939, -42.193617445999905 ], [ -64.602894660999937, -42.258233330999929 ], [ -64.480865037999934, -42.254652601999908 ], [ -64.464222785999937, -42.275323174999926 ], [ -64.602284308999913, -42.422051690999922 ], [ -64.445057745999918, -42.446709893999923 ], [ -64.103586391999954, -42.427829684999949 ], [ -64.051584438999953, -42.372247002999927 ], [ -64.068430141999954, -42.269626559999949 ], [ -64.339711066999939, -42.237399997999944 ], [ -64.162180141999954, -42.209405205999929 ], [ -63.87091450999992, -42.083712721999916 ], [ -63.76864810099994, -42.077723186999947 ], [ -63.59797115799995, -42.299981377999927 ], [ -63.579335089999915, -42.592950127999927 ], [ -63.633290167999917, -42.714613539999903 ], [ -63.620269334999932, -42.75123463299991 ], [ -63.671498175999943, -42.802178643999923 ], [ -64.107899542999917, -42.883721612999921 ], [ -64.251332160999937, -42.77507903399993 ], [ -64.202381964999915, -42.635430596999925 ], [ -64.388050910999937, -42.51726653399993 ], [ -64.614857550999943, -42.51531340899993 ], [ -64.734730597999942, -42.55787525799991 ], [ -64.804025844999899, -42.621514580999929 ], [ -64.946034308999913, -42.654229424999926 ], [ -65.018910285999937, -42.746840101999908 ], [ -64.997141079999949, -42.78484465899993 ], [ -64.645497199999909, -42.925388278999947 ], [ -64.503163214999915, -42.937269789999903 ], [ -64.433461066999939, -42.976332289999903 ], [ -64.315785285999937, -42.95045338299991 ], [ -64.302113410999937, -42.980889580999929 ], [ -64.44758053299995, -43.068617445999905 ], [ -64.765248175999943, -43.147393487999921 ], [ -64.943918423999946, -43.239434502999927 ], [ -65.032338019999941, -43.299411716999941 ], [ -65.039051886999914, -43.395603122999944 ], [ -65.330799933999913, -43.66334400799991 ], [ -65.318226691999939, -43.832207940999922 ], [ -65.271962042999917, -43.964043877999927 ], [ -65.22860967999992, -43.975253423999902 ], [ -65.241977130999942, -44.027267402999939 ], [ -65.186707583999919, -44.035539424999911 ], [ -65.237863735999952, -44.084161065999922 ], [ -65.2148171259999, -44.137434820999943 ], [ -65.282567470999936, -44.154517219999946 ], [ -65.30870792199994, -44.200084510999943 ], [ -65.216884701999902, -44.366410337999923 ], [ -65.331590022999933, -44.460759638999946 ], [ -65.279277940999918, -44.516263273999925 ], [ -65.373101766999923, -44.516183220999949 ], [ -65.36122495099994, -44.540394157999913 ], [ -65.393308255999898, -44.551921981999953 ], [ -65.356328053999903, -44.574118015999943 ], [ -65.36867923099993, -44.586061982999922 ], [ -65.461812047999899, -44.576558053999918 ], [ -65.460914654999954, -44.600993420999941 ], [ -65.64320848299991, -44.667999982999902 ], [ -65.727100467999946, -44.809604833999913 ], [ -65.715443141999913, -44.869962545999954 ], [ -65.52139967599993, -44.931897591999927 ], [ -65.605435772999954, -44.97274058499994 ], [ -65.602642604999915, -45.02768655299991 ], [ -65.690618944999926, -45.062721426999929 ], [ -65.75137518799994, -45.023645878999901 ], [ -65.817396704999908, -45.040290191999929 ], [ -65.841591843999936, -45.003216459999919 ], [ -65.936237910999921, -45.04868440599995 ], [ -66.016356974999951, -45.003107233999913 ], [ -66.200366618999908, -44.992919196999935 ], [ -66.281578807999949, -45.057602903999907 ], [ -66.349707295999906, -45.043450413999949 ], [ -66.496589922999931, -45.088381841999933 ], [ -66.525300853999909, -45.131880123999906 ], [ -66.454758083999934, -45.149340906999953 ], [ -66.473302345999912, -45.168673843999954 ], [ -66.587798631999931, -45.139336846999925 ], [ -66.52399711399994, -45.216097126999955 ], [ -66.929265871999917, -45.256533542999932 ], [ -67.06479532499992, -45.349948803999951 ], [ -67.331924500999946, -45.613491404999934 ], [ -67.364597391999951, -45.786610410999913 ], [ -67.455873973999928, -45.825002835999953 ], [ -67.581661577619684, -46.000030059539597 ], [ -71.649163192227547, -45.999414157937053 ], [ -71.612290812999873, -45.970526224999915 ], [ -71.624383097999953, -45.934146015999929 ], [ -71.758483438999889, -45.848156432999971 ], [ -71.749026651999912, -45.7867648309999 ], [ -71.798532674999876, -45.739945983999874 ], [ -71.782409627999897, -45.641760762999894 ], [ -71.742825480999841, -45.59432179799991 ], [ -71.765098022999894, -45.572410990999941 ], [ -71.713731648999925, -45.53324025499991 ], [ -71.48909419799989, -45.498513691999875 ], [ -71.508317830999914, -45.408389993999975 ], [ -71.389358683999916, -45.370769550999867 ], [ -71.311533976999954, -45.299456074999895 ], [ -71.317166706999899, -45.267209980999922 ], [ -71.487182169999897, -45.123342793999939 ], [ -71.588726358999878, -44.978132018999887 ], [ -71.702362833999956, -44.973687845999876 ], [ -71.782461303999924, -44.92738576299989 ], [ -71.889431518999885, -44.947229512999883 ], [ -72.073502970999897, -44.902167663999933 ], [ -72.088747518999924, -44.782795104999906 ], [ -72.047819783999898, -44.7547864779999 ], [ -71.854549927999898, -44.790959980999929 ], [ -71.762669229999943, -44.754373066999889 ], [ -71.631204386999912, -44.780004576999943 ], [ -71.497104044999872, -44.742900899999967 ], [ -71.297839721999935, -44.795610859999982 ], [ -71.238153442999931, -44.747861836999917 ], [ -71.234897826999941, -44.638824563999975 ], [ -71.131648314999978, -44.570611673999863 ], [ -71.122656616999933, -44.53030405699991 ], [ -71.209783080999898, -44.427571308999887 ], [ -71.822045450999951, -44.403180033999959 ], [ -71.860596069999929, -44.377135110999888 ], [ -71.804010376999969, -44.314813334999954 ], [ -71.831812296999914, -44.270164896999916 ], [ -71.805095580999961, -44.205155944999959 ], [ -71.858735717999934, -44.107797546999905 ], [ -71.762204141999916, -44.06407928499992 ], [ -71.659884806999912, -43.926309915999894 ], [ -71.761842407999922, -43.828434753 ], [ -71.755021118999963, -43.771383971999896 ], [ -71.819203246999905, -43.758051452999965 ], [ -71.709184122999915, -43.684360859999956 ], [ -71.714300089999881, -43.602195332999926 ], [ -71.800703084999952, -43.544214374999882 ], [ -71.873825235999931, -43.538943379999935 ], [ -71.868812621999979, -43.462565612999896 ], [ -71.955112264999912, -43.443548685999929 ], [ -71.901730509999908, -43.322005716999897 ], [ -71.750680297999878, -43.295340677999945 ], [ -71.742980508999977, -43.190127461999879 ], [ -71.861887980999882, -43.133180033999892 ], [ -72.054434366999914, -43.105378112999944 ], [ -72.148537150999886, -42.99871795599995 ], [ -72.112673705999924, -42.863842467999916 ], [ -72.143214477999919, -42.557091165999879 ], [ -72.039189819999962, -42.481230163999953 ], [ -72.075208292999946, -42.433791198999955 ], [ -72.069885620999912, -42.3499720249999 ], [ -72.133706013999955, -42.287598571999936 ], [ -72.009837605999905, -42.124714456999897 ], [ -71.923796346999922, -42.176907653999962 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-R", "NAME_1": "Río Negro" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.769259569273686, -41.999606621748171 ], [ -71.794036824999949, -41.86746917699989 ], [ -71.925915079999896, -41.653011983999917 ], [ -71.853258015999955, -41.567332458999942 ], [ -71.888087931999905, -41.512762145999915 ], [ -71.903952595999925, -41.367654723999891 ], [ -71.853981486999942, -41.078886819999923 ], [ -71.867401588999911, -41.010235286999929 ], [ -71.553740606743588, -41.031965427062801 ], [ -71.297322150296964, -41.095114027890077 ], [ -71.148003099263633, -41.05124073677058 ], [ -71.026279263177457, -40.906805107869445 ], [ -71.130226407222892, -40.779474379239218 ], [ -70.971502245332317, -40.640361423840659 ], [ -70.812080450552344, -40.584964287471905 ], [ -70.680512254936616, -40.590183608186976 ], [ -70.536309170032155, -40.512203871111751 ], [ -70.444816047222787, -40.566877537068706 ], [ -70.238937140736425, -40.549824313641182 ], [ -70.180232713369037, -40.465643405718595 ], [ -70.095638394296429, -40.441303805825953 ], [ -69.944717372808498, -39.947380465636002 ], [ -69.680392422272462, -39.823150322429456 ], [ -69.516061366938516, -39.821910088979394 ], [ -69.364029304109067, -39.717161961055638 ], [ -69.244475878359083, -39.585490410853765 ], [ -68.962219204352778, -39.488700452963542 ], [ -68.835198534085066, -39.374340508607588 ], [ -68.797733120287262, -39.293466891683693 ], [ -68.67146175795375, -39.213626803534169 ], [ -68.604566615656779, -39.129600925242528 ], [ -68.320914680368219, -38.961807550178321 ], [ -68.258437873109358, -38.996327407284014 ], [ -68.01041683626795, -38.975501803965074 ], [ -68.252133347675851, -38.659293714533305 ], [ -68.24939449655875, -37.557035413853271 ], [ -67.850323248818881, -37.600236912303671 ], [ -67.748598191952965, -37.669069920040783 ], [ -67.711752895779512, -37.734750664611454 ], [ -67.72369015217879, -37.816864515884674 ], [ -67.848256192169515, -37.907763359491469 ], [ -67.871743130441132, -38.007240492554672 ], [ -67.84489722432744, -38.056901544270829 ], [ -67.705655076820335, -38.100568128915995 ], [ -67.591992763555197, -38.247122491309938 ], [ -67.375959439176768, -38.255545750236195 ], [ -67.176591762799603, -38.222627861786407 ], [ -67.135767381159724, -38.338073011760059 ], [ -67.069828254170602, -38.408973077045857 ], [ -66.647941860828212, -38.557387790514099 ], [ -66.593500738867988, -38.607307223749388 ], [ -66.56195227687607, -38.70156503699684 ], [ -66.391859300266503, -38.734172866184849 ], [ -66.215229255126019, -38.716602878819799 ], [ -65.960180223338625, -38.742131036218325 ], [ -65.689550747369083, -38.817888686113974 ], [ -65.562995165094776, -38.775824070124713 ], [ -65.367399867709707, -38.838352552428375 ], [ -64.970163132622474, -38.803574313803551 ], [ -64.471485562408759, -38.853700452613793 ], [ -64.010221727350824, -38.999789727913594 ], [ -63.908160772801409, -39.092238865131492 ], [ -63.782121955363948, -39.128360690893146 ], [ -63.71122189007815, -39.20019093216581 ], [ -63.516401739948321, -39.305972588863881 ], [ -63.388580084902969, -39.325764661609867 ], [ -63.387417364919429, -40.709091077890946 ], [ -63.10301611989803, -40.753946221840636 ], [ -62.861454637221698, -40.938379409182403 ], [ -62.801625129196339, -41.041680597181823 ], [ -63.099517381999931, -41.154880466999941 ], [ -63.779408331999946, -41.158786716999941 ], [ -64.062855597999942, -41.041273695999905 ], [ -64.062123175999943, -40.999444268999923 ], [ -64.174305792999917, -41.008965752999927 ], [ -64.64476477799991, -40.846449476999908 ], [ -64.911203579999949, -40.823825778999947 ], [ -64.867990688999953, -40.792168877999927 ], [ -64.744984503999945, -40.797295830999929 ], [ -64.800282355999911, -40.758884372999944 ], [ -64.771636522999927, -40.736504815999922 ], [ -64.796213344999899, -40.723321221999925 ], [ -64.981841600999928, -40.723321221999925 ], [ -64.922474738999938, -40.729668877999927 ], [ -64.90884355399993, -40.770114841999941 ], [ -65.010853644999941, -40.76726653399993 ], [ -65.121937628999945, -40.83367278399993 ], [ -65.175689256999931, -40.969170830999929 ], [ -65.104888475999928, -41.32976653399993 ], [ -65.06118730399993, -41.448418877999927 ], [ -64.991363084999932, -41.524102471999925 ], [ -65.037220831999946, -41.665134372999944 ], [ -64.999908006999931, -41.793389580999929 ], [ -65.07453365799995, -41.950941664999903 ], [ -65.054595506999931, -42.010674737999921 ], [ -71.769259569273686, -41.999606621748171 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-Z", "NAME_1": "Santa Cruz" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.912530884999853, -47.23453175899995 ], [ -71.863283243999973, -47.196601256999955 ], [ -71.874135294999917, -47.142547709999874 ], [ -72.005186726999938, -47.061932474999963 ], [ -71.914804646999869, -46.998473815999915 ], [ -71.970356811999864, -46.94845102999993 ], [ -71.950099649999856, -46.813988952999892 ], [ -71.834086059999947, -46.788564147999892 ], [ -71.680193644999918, -46.659579772999933 ], [ -71.680503702999914, -46.538140156999944 ], [ -71.751868855999902, -46.39303273499992 ], [ -71.763341023999914, -46.244514668999955 ], [ -71.912634236999878, -46.142091979999933 ], [ -71.770162312999872, -46.112636413999937 ], [ -71.649163192227547, -45.999414157937053 ], [ -67.581661577619684, -46.000030059539597 ], [ -67.622466600999928, -46.16375090899993 ], [ -67.540882941999939, -46.401299737999921 ], [ -67.423219764999942, -46.567419448999942 ], [ -67.129994791999934, -46.706595608999919 ], [ -67.033192511999914, -46.819105726999908 ], [ -66.786447719999899, -47.006605726999908 ], [ -66.628795452999952, -47.051218087999928 ], [ -66.505238410999937, -47.040785414999903 ], [ -66.200492770999915, -47.089586768999936 ], [ -65.979562954999949, -47.066176039999903 ], [ -65.881155731999911, -47.096555184999943 ], [ -65.744902193999906, -47.204164007999907 ], [ -65.713013816999933, -47.341497173999926 ], [ -65.73566515999994, -47.50953542499991 ], [ -65.845625843999926, -47.742205726999941 ], [ -66.032064417999948, -47.739525295999954 ], [ -66.273915167999917, -47.859470309999949 ], [ -66.389149542999917, -47.863864841999941 ], [ -66.30109615799995, -47.872491143999923 ], [ -66.02257205199993, -47.770993068999928 ], [ -65.901824013999942, -47.769949847999953 ], [ -65.853409382999928, -47.879590371999939 ], [ -65.761738816999923, -47.911907625999902 ], [ -65.795121458999915, -47.935934179999947 ], [ -65.761952337999901, -47.94855158699994 ], [ -65.927384798999924, -47.941408740999918 ], [ -65.968445, -48.047168107999937 ], [ -65.903187628999945, -48.078545830999929 ], [ -65.917237455999953, -48.113813629999925 ], [ -66.108631964999915, -48.123304945999905 ], [ -66.159535285999937, -48.185316664999903 ], [ -66.316883917999917, -48.264255466999941 ], [ -66.354987535999953, -48.321216130999915 ], [ -66.341114641999923, -48.352724522999949 ], [ -66.448597785999937, -48.350274346999925 ], [ -66.501055556999916, -48.413988107999955 ], [ -66.650990363999938, -48.431084893999923 ], [ -66.857811500999901, -48.548307111999918 ], [ -66.866435494999905, -48.589834355999926 ], [ -67.114348487999905, -48.673750085999927 ], [ -67.198284666999939, -48.818353344999935 ], [ -67.405736886999932, -48.904235248999953 ], [ -67.556548697999915, -49.01581686399993 ], [ -67.632557745999918, -49.129978122999944 ], [ -67.609929546999922, -49.178107403999945 ], [ -67.732329881999931, -49.27467213299991 ], [ -67.711903449999909, -49.315606377999927 ], [ -67.774312151999936, -49.37440818999994 ], [ -67.830881313999953, -49.379571221999925 ], [ -67.725183958999935, -49.390745539999955 ], [ -67.663207323999927, -49.267152912999904 ], [ -67.60765540299991, -49.265069268999923 ], [ -67.700062628999945, -49.534274997999944 ], [ -67.732012047999945, -49.781301772999939 ], [ -67.833207005999952, -49.954540455999904 ], [ -68.076350219999938, -50.087267966999946 ], [ -68.341867641999954, -50.117608330999929 ], [ -68.654042120999918, -49.757907809999949 ], [ -68.739735480999911, -49.727715752999927 ], [ -68.664051886999914, -49.767510674999926 ], [ -68.577272287999904, -49.927615881999941 ], [ -68.674387173999946, -49.968357028999947 ], [ -68.875379085999953, -49.962495301999923 ], [ -69.013498501999948, -50.007745049999926 ], [ -68.583469757999922, -49.970337441999902 ], [ -68.518851004999931, -50.015666031999956 ], [ -68.493753645999902, -50.08011367499995 ], [ -68.349872666999943, -50.148810460999925 ], [ -68.438099738999938, -50.200778903999947 ], [ -68.876429323999901, -50.330572018999931 ], [ -69.076518607999901, -50.5601720599999 ], [ -69.149973110999952, -50.742120049999926 ], [ -69.136799819999908, -50.903480807999927 ], [ -69.410715298999946, -51.083916924999926 ], [ -69.167778304999899, -50.978224847999911 ], [ -68.962554490999935, -51.560153903999947 ], [ -69.047596808999913, -51.563164971999925 ], [ -69.119618292999917, -51.60475025799991 ], [ -69.37718665299991, -51.556898695999905 ], [ -69.616810675999943, -51.625176690999922 ], [ -69.304558921999899, -51.593489703999921 ], [ -69.156982355999901, -51.634883308999918 ], [ -69.218902147999927, -51.680433851999908 ], [ -69.198963995999918, -51.686618747999944 ], [ -69.028920050999943, -51.614190362999921 ], [ -68.973511143999929, -51.619951743999934 ], [ -68.685059011999954, -52.005006357999946 ], [ -68.365610640999932, -52.306203708999931 ], [ -68.362472384999933, -52.339071520999937 ], [ -68.417814782999926, -52.386051570999939 ], [ -68.442451000999938, -52.379480573999956 ], [ -68.454499063999975, -52.299907327999861 ], [ -68.820497396999912, -52.243166605999939 ], [ -69.212256428999865, -52.13795338999995 ], [ -69.485288859999855, -52.13247568699996 ], [ -69.952753865999881, -52.007418721999976 ], [ -71.917698527999875, -51.990055439999963 ], [ -71.965240844999869, -51.970625101999893 ], [ -71.948497680999935, -51.896004332999915 ], [ -71.981725626999946, -51.844948018999936 ], [ -72.14212927199992, -51.739424742999873 ], [ -72.300724243999923, -51.691469014999939 ], [ -72.330903279999916, -51.599381611999917 ], [ -72.450069132999914, -51.552666117999927 ], [ -72.35121211799995, -51.475978291999894 ], [ -72.320464640999887, -51.312577412999893 ], [ -72.258814656999846, -51.245191345999977 ], [ -72.382217977999886, -51.160597025999898 ], [ -72.404593872999953, -51.105820006999913 ], [ -72.293437866999852, -51.029235534999906 ], [ -72.265946004999876, -50.960712584999982 ], [ -72.263465535999899, -50.836275736999973 ], [ -72.347388061999908, -50.743154805999971 ], [ -72.302842977999916, -50.648896993999962 ], [ -72.505983032999893, -50.601251321999918 ], [ -72.662614298999955, -50.667810566999904 ], [ -72.755786905999884, -50.616444193999946 ], [ -73.05173783399988, -50.757830911999868 ], [ -73.177724975999922, -50.749459329999894 ], [ -73.192246053999952, -50.641352233999918 ], [ -73.261854207999875, -50.55660288499989 ], [ -73.284333455999871, -50.333050638999943 ], [ -73.346345174999925, -50.243650410999955 ], [ -73.530571655999978, -50.140814310999914 ], [ -73.531501831999947, -50.083143411999941 ], [ -73.478585164999856, -50.009452819999922 ], [ -73.568398803999855, -49.920052591999934 ], [ -73.465097615999895, -49.759959004999935 ], [ -73.196749612564901, -49.682423211773184 ], [ -73.059744674589552, -49.554970792414601 ], [ -73.057423510851791, -49.475919864136046 ], [ -73.118651507246582, -49.392427141779507 ], [ -73.097626505999955, -49.266552428999965 ], [ -73.183151000999885, -49.239060566999903 ], [ -73.171317097999889, -49.1893478389999 ], [ -73.009724894999863, -48.990393574999935 ], [ -72.781211710999884, -48.933859557999973 ], [ -72.618792684999846, -48.819654641999946 ], [ -72.578019978999862, -48.721882832999974 ], [ -72.614710245999845, -48.51000946099991 ], [ -72.576779743999936, -48.452131856999898 ], [ -72.295091511999885, -48.333276061999896 ], [ -72.325632283999909, -48.285527038999916 ], [ -72.309509236999901, -48.211216328999924 ], [ -72.343047241999926, -48.070449726999883 ], [ -72.509445353999922, -47.972987976 ], [ -72.543913533999898, -47.914800312999901 ], [ -72.344442505999893, -47.602261250999874 ], [ -72.320878051999898, -47.498391621999943 ], [ -72.370487426999972, -47.474517109999866 ], [ -72.361185669999941, -47.450952656999874 ], [ -72.17055131099994, -47.407544453999961 ], [ -72.038156290999979, -47.287035012999922 ], [ -72.030301473999941, -47.197531432999909 ], [ -71.912530884999853, -47.23453175899995 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-V", "NAME_1": "Tierra del Fuego" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -68.654135431866308, -54.886244564385144 ], [ -68.642342895999917, -54.853653258999927 ], [ -68.641997850999928, -54.799167575999945 ], [ -68.568226691999939, -54.878350518999923 ], [ -68.654135431866308, -54.886244564385144 ] ] ], [ [ [ -68.641881926766189, -54.78297131557072 ], [ -68.627616776477794, -52.639571698869695 ], [ -68.311431443999936, -52.912041924999926 ], [ -68.225819464999915, -53.102471612999921 ], [ -68.280425584999932, -53.015394789999903 ], [ -68.34956888499994, -53.016162039999926 ], [ -68.520715487999951, -53.120631403999937 ], [ -68.554798715999937, -53.167051676999904 ], [ -68.550750821999941, -53.23853671899991 ], [ -68.451350728999898, -53.297717398999907 ], [ -68.111401855999929, -53.343801801999916 ], [ -68.047678188999953, -53.523207289999903 ], [ -67.983631964999915, -53.601332289999903 ], [ -67.702461186999926, -53.774746160999939 ], [ -67.708779429999936, -53.804568288999917 ], [ -67.558247920999918, -53.836188706999906 ], [ -67.587757941999939, -53.869317315999922 ], [ -67.571522589999915, -53.907972914999903 ], [ -67.140844462999951, -54.123398269999939 ], [ -66.766581649999921, -54.249841673999924 ], [ -66.482213313999921, -54.465800354999942 ], [ -65.844227667999917, -54.647393487999921 ], [ -65.698109503999945, -54.662367445999905 ], [ -65.309315558999913, -54.626560153999947 ], [ -65.141916469999899, -54.646905205999929 ], [ -65.193714972999942, -54.690199476999908 ], [ -65.243397589999915, -54.820977471999925 ], [ -65.358957485999952, -54.926690362999921 ], [ -65.462717251999948, -54.88445403399993 ], [ -65.499663865999935, -54.933038018999923 ], [ -65.615142381999931, -54.934177341999941 ], [ -65.669097459999932, -54.971774997999944 ], [ -65.718861456999946, -54.909274997999944 ], [ -65.9662250639999, -54.902073326999925 ], [ -65.987557938999942, -54.910682792999921 ], [ -65.950828884999908, -54.939949353999907 ], [ -65.993355086999941, -54.972366361999946 ], [ -66.317068197999902, -54.994977935999941 ], [ -66.450672980999911, -55.05201588299991 ], [ -66.630067345999919, -55.031097363999947 ], [ -66.802805141999954, -54.942559502999927 ], [ -67.030995245999918, -54.905205987999921 ], [ -67.93195553299995, -54.862481377999927 ], [ -68.302072719999899, -54.792168877999927 ], [ -68.328236456999946, -54.842380466999941 ], [ -68.520334438999953, -54.852227471999925 ], [ -68.641881926766189, -54.78297131557072 ] ] ], [ [ [ -63.888417120999918, -54.729913018999923 ], [ -63.812123175999943, -54.729913018999923 ], [ -63.966786261999914, -54.815036716999941 ], [ -63.990834113999938, -54.811211846999925 ], [ -63.979644334999932, -54.757419528999947 ], [ -64.244536912999934, -54.837090752999927 ], [ -64.270741339999915, -54.824883721999925 ], [ -64.251576300999943, -54.77703215899993 ], [ -64.311105923999946, -54.777601820999905 ], [ -64.445139126999948, -54.843357028999947 ], [ -64.506581183999913, -54.827325127999927 ], [ -64.624419725999928, -54.903741143999923 ], [ -64.68976803299995, -54.900567315999922 ], [ -64.66860917899993, -54.86646900799991 ], [ -64.758656378999945, -54.832289320999905 ], [ -64.683094855999911, -54.770196221999925 ], [ -64.60374915299991, -54.79810963299991 ], [ -64.522572394999941, -54.781670830999929 ], [ -64.504750128999945, -54.770928643999923 ], [ -64.569894985999952, -54.722100518999923 ], [ -64.542347785999937, -54.715590101999908 ], [ -64.497914191999939, -54.750420830999929 ], [ -64.407053188999953, -54.74382903399993 ], [ -64.384388800999943, -54.78443775799991 ], [ -64.363880988999938, -54.705987237999921 ], [ -64.187163865999935, -54.747002862999921 ], [ -64.158762173999946, -54.715590101999908 ], [ -64.093251105999911, -54.715590101999908 ], [ -64.065988735999952, -54.750420830999929 ], [ -63.888417120999918, -54.729913018999923 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-B", "NAME_1": "Buenos Aires" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -56.668324347999942, -36.736423434999949 ], [ -56.686431443999936, -36.927666924999926 ], [ -57.055897589999915, -37.412692966999941 ], [ -57.487416144999941, -37.832207940999922 ], [ -57.528879360999952, -37.913669528999947 ], [ -57.558420376999948, -38.120863539999903 ], [ -58.155669725999928, -38.430108330999929 ], [ -59.063221808999913, -38.693780205999929 ], [ -59.632394985999952, -38.783786716999941 ], [ -59.796864386999914, -38.838474216999941 ], [ -61.143381313999953, -39.001071872999944 ], [ -61.42804928299995, -38.982517184999949 ], [ -61.518055792999917, -39.011488539999903 ], [ -61.722808397999927, -38.968194268999923 ], [ -61.839019334999932, -38.980889580999929 ], [ -62.064035610999952, -38.922946872999944 ], [ -62.157338019999941, -38.810479424999926 ], [ -62.379750128999945, -38.798435153999947 ], [ -62.373931443999936, -38.899997653999947 ], [ -62.336008266999954, -38.896905205999929 ], [ -62.320464647999927, -38.960707289999903 ], [ -62.274037238999938, -38.954522393999923 ], [ -62.357818162999934, -39.102227471999925 ], [ -62.339182094999899, -39.194105726999908 ], [ -62.257232225999928, -39.25554778399993 ], [ -62.325591600999928, -39.254652601999908 ], [ -62.167876756999931, -39.283379815999922 ], [ -62.023915167999917, -39.364841403999947 ], [ -62.056996222999942, -39.411553643999923 ], [ -62.188343878999945, -39.310723565999922 ], [ -62.283924933999913, -39.310723565999922 ], [ -62.154204881999931, -39.42742278399993 ], [ -62.055775519999941, -39.451918226999908 ], [ -62.114369269999941, -39.821465752999927 ], [ -62.164173956999946, -39.858819268999923 ], [ -62.305043097999942, -39.811130466999941 ], [ -62.283924933999913, -39.852634372999944 ], [ -62.314564581999946, -39.869398695999905 ], [ -62.366322394999941, -40.054131768999923 ], [ -62.339182094999899, -40.112725518999923 ], [ -62.35968990799995, -40.191827080999929 ], [ -62.490061001999948, -40.30787525799991 ], [ -62.414906378999945, -40.462090752999927 ], [ -62.328684048999946, -40.496270440999922 ], [ -62.283680792999917, -40.564385674999926 ], [ -62.264149542999917, -40.551527601999908 ], [ -62.267201300999943, -40.633477471999925 ], [ -62.34601803299995, -40.59929778399993 ], [ -62.329741990999935, -40.669122002999927 ], [ -62.181548631999931, -40.62664153399993 ], [ -62.229237433999913, -40.658623955999929 ], [ -62.337798631999931, -40.87273528399993 ], [ -62.751332160999937, -41.04420338299991 ], [ -62.801625129196339, -41.041680597181823 ], [ -62.861454637221698, -40.938379409182403 ], [ -63.117795580201857, -40.74614307963941 ], [ -63.387417364919429, -40.709091077890946 ], [ -63.381887986741162, -34.579646091094219 ], [ -63.373593919923451, -34.413609713417543 ], [ -63.339616665176948, -34.380485121191384 ], [ -61.710517136756437, -34.376816094986793 ], [ -60.963069220867851, -33.677220553885434 ], [ -60.910462613358902, -33.563739108672905 ], [ -60.671510789691183, -33.576916598522189 ], [ -60.566762660868108, -33.640323581767859 ], [ -60.47565711078704, -33.622185153621956 ], [ -60.410131394947882, -33.459559421530059 ], [ -60.347809618219287, -33.410053398545529 ], [ -60.34052324085485, -33.346439710624168 ], [ -60.27752966965852, -33.306442153082912 ], [ -60.294091965771599, -33.256574394892425 ], [ -60.118082038255466, -33.393568616798234 ], [ -59.640617642290351, -33.671019382138752 ], [ -59.520702481334411, -33.655309746747434 ], [ -59.392648281393065, -33.739387301882459 ], [ -59.268934903023364, -33.721248874635876 ], [ -59.231314459594614, -33.797988376462399 ], [ -59.031817592907601, -33.829562676876037 ], [ -58.638508267342672, -34.048515719524858 ], [ -58.446970686747761, -34.006940156662893 ], [ -58.395375128999945, -34.031182549999926 ], [ -58.378570115999935, -34.188246351999908 ], [ -58.460194464999915, -34.272881768999923 ], [ -58.570423956999946, -34.288181247999944 ], [ -58.454607113999941, -34.366182764999905 ], [ -58.511465270999906, -34.435944762999952 ], [ -58.474191861065549, -34.521579685054405 ], [ -58.538480224882449, -34.567009778178715 ], [ -58.560532174320372, -34.653642438547706 ], [ -58.541630503245131, -34.710347452672806 ], [ -58.443971868606866, -34.774928162704555 ], [ -58.315030934430069, -34.657194617637515 ], [ -57.965031436999936, -34.824530286999902 ], [ -57.871032093999929, -34.829914576999954 ], [ -57.522032339999953, -35.013153725999928 ], [ -57.248768683999913, -35.248793226999908 ], [ -57.128143504999912, -35.441320754999936 ], [ -57.352625390999947, -35.727523632999919 ], [ -57.393299933999913, -35.86296965899993 ], [ -57.366444464999915, -35.987888278999947 ], [ -57.248036261999914, -36.170342705999929 ], [ -57.108265753999945, -36.282321872999944 ], [ -56.93773352799991, -36.350762627999927 ], [ -56.939198370999918, -36.384860934999949 ], [ -56.856678839999915, -36.343926690999922 ], [ -56.76789303299995, -36.343926690999922 ], [ -56.77603105399993, -36.306410414999903 ], [ -56.740589972999942, -36.316582940999922 ], [ -56.697621222999942, -36.39617278399993 ], [ -56.668324347999942, -36.736423434999949 ] ] ], [ [ [ -61.907215949999909, -39.136651299999926 ], [ -61.868275519999941, -39.239434502999927 ], [ -62.026844855999911, -39.18287525799991 ], [ -62.098011847999942, -39.087823174999926 ], [ -61.907215949999909, -39.136651299999926 ] ] ], [ [ [ -62.085926886999914, -39.023370049999926 ], [ -62.130767381999931, -39.020603122999944 ], [ -62.040191209999932, -39.005466403999947 ], [ -61.967274542999917, -39.046970309999949 ], [ -62.010243292999917, -39.064385674999926 ], [ -62.085926886999914, -39.023370049999926 ] ] ], [ [ [ -62.155299648999915, -40.374205078999921 ], [ -62.093997489999936, -40.377419249999946 ], [ -62.028517293999926, -40.454881721999925 ], [ -62.10870882599994, -40.564063739999938 ], [ -62.161339835999911, -40.557101384999953 ], [ -62.165729508999902, -40.509400967999909 ], [ -62.237325909999925, -40.509949104999919 ], [ -62.155299648999915, -40.374205078999921 ] ] ], [ [ [ -62.118961952999939, -40.130719995999925 ], [ -62.014659846999905, -40.175163236999936 ], [ -62.021164559999931, -40.343552548999924 ], [ -62.133179519999942, -40.181094019999932 ], [ -62.118961952999939, -40.130719995999925 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-C", "NAME_1": "Ciudad de Buenos Aires" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -58.474191861065549, -34.521579685054405 ], [ -58.378771882999899, -34.57250942099995 ], [ -58.315030934430069, -34.657194617637515 ], [ -58.443971868606866, -34.774928162704555 ], [ -58.541630503245131, -34.710347452672806 ], [ -58.560532174320372, -34.653642438547706 ], [ -58.538480224882449, -34.567009778178715 ], [ -58.474191861065549, -34.521579685054405 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-S", "NAME_1": "Santa Fe" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -59.597441983160991, -28.00040943764543 ], [ -58.864747687355873, -27.999324232926995 ], [ -58.920299851556877, -28.094822279624509 ], [ -59.059929571792281, -28.129445488618387 ], [ -59.087524786739493, -28.175230807655623 ], [ -59.066208258804068, -28.401366875780695 ], [ -59.086956345958583, -28.627089531856427 ], [ -59.194391649055376, -28.921386814150139 ], [ -59.197440557635616, -29.022052503820021 ], [ -59.358877733120892, -29.143492119965345 ], [ -59.511271532055559, -29.207570895880167 ], [ -59.582895066853837, -29.377793063698959 ], [ -59.5910857808841, -29.614987888180508 ], [ -59.6727862210073, -29.847118421577875 ], [ -59.595349087190641, -30.049173272228757 ], [ -59.669298061955999, -30.293861178750376 ], [ -59.61477942562999, -30.462688083488274 ], [ -59.660642259033011, -30.736056409675541 ], [ -60.163660650818372, -31.442059828098593 ], [ -60.414110480414308, -31.673518568826864 ], [ -60.647765469001172, -31.716048271910211 ], [ -60.674042935233274, -31.85288746508445 ], [ -60.719957444580416, -31.922340589546593 ], [ -60.66179561957216, -32.069256687146378 ], [ -60.706934984362022, -32.156176446186066 ], [ -60.767008836388698, -32.578321221946851 ], [ -60.705823941221922, -32.679503675554201 ], [ -60.675464036735889, -32.846521905161808 ], [ -60.552112392672768, -33.061082452093501 ], [ -60.294091965771599, -33.256574394892425 ], [ -60.27752966965852, -33.306442153082912 ], [ -60.34052324085485, -33.346439710624168 ], [ -60.347809618219287, -33.410053398545529 ], [ -60.410131394947882, -33.459559421530059 ], [ -60.430569423739882, -33.547926120494083 ], [ -60.49991919631384, -33.634019057233729 ], [ -60.582937385152206, -33.635207614739613 ], [ -60.67763444707208, -33.575676365072184 ], [ -60.910462613358902, -33.563739108672905 ], [ -60.963069220867851, -33.677220553885434 ], [ -61.710517136756437, -34.376816094986793 ], [ -62.853806524651361, -34.38213876669073 ], [ -61.91991004071582, -33.114102471651734 ], [ -61.76283952522391, -32.999845880083285 ], [ -61.735295987120082, -32.81226043047451 ], [ -61.833016120097852, -32.676919854067989 ], [ -61.894485236104742, -32.658781426821406 ], [ -61.86611487480161, -32.586176039192878 ], [ -61.914122281018422, -32.462927747917206 ], [ -62.014632941057357, -32.386291598878188 ], [ -62.078220790557054, -32.244078058055948 ], [ -62.218573981204258, -32.138503106033511 ], [ -62.184079963419549, -31.962751560036452 ], [ -62.237539231650203, -31.730982760945665 ], [ -62.121551480216624, -31.608561292869354 ], [ -61.857097336672723, -30.731457207484141 ], [ -62.12532385920872, -30.457675470146853 ], [ -62.134083014919213, -30.416851087607597 ], [ -61.709948696874847, -28.00040943764543 ], [ -59.597441983160991, -28.00040943764543 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-T", "NAME_1": "Tucumán" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -65.658699917367301, -26.074583835975261 ], [ -65.442072312886921, -26.120059095750662 ], [ -65.314379849050795, -26.076030775899596 ], [ -65.252807380256399, -26.172355644897095 ], [ -64.945720180841647, -26.274106541083995 ], [ -64.767358974936712, -26.21137135230606 ], [ -64.486342536179109, -26.220208021483018 ], [ -64.524040493074267, -26.446550795183043 ], [ -64.500631070067811, -26.677596123862031 ], [ -64.581453010148266, -26.676510919143595 ], [ -64.622070685313872, -26.79185271543048 ], [ -64.674367235359625, -26.804823499704753 ], [ -64.879832729796647, -27.309185478626944 ], [ -65.063594122670622, -27.47237965329839 ], [ -64.969594692740884, -27.513720797976475 ], [ -65.069407721689004, -27.60069223385949 ], [ -64.99915361244922, -27.778149102199336 ], [ -65.09149939598035, -27.899071953507871 ], [ -65.227589281220332, -27.923514907087281 ], [ -65.348951382100608, -27.863260186108675 ], [ -65.496952684418829, -27.961238701504897 ], [ -65.558008389275756, -28.054359633190529 ], [ -65.664565192329746, -27.945167331806942 ], [ -65.703038295580882, -27.81788827912078 ], [ -65.850832893223412, -27.780164482904581 ], [ -65.877859667389714, -27.697223810230639 ], [ -65.929329393336843, -27.654332371042074 ], [ -65.981884324901671, -27.393831475442255 ], [ -66.194636196703129, -27.319365736739371 ], [ -65.883776618296281, -26.940267428898721 ], [ -65.850962084432638, -26.752785332976714 ], [ -65.872562832308859, -26.699145195794131 ], [ -66.152028978354679, -26.537863050839121 ], [ -66.10017167788061, -26.321545504721257 ], [ -66.053817918961784, -26.253487644239385 ], [ -65.711823289713038, -26.2953972305977 ], [ -65.658699917367301, -26.074583835975261 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-G", "NAME_1": "Santiago del Estero" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -63.398579474962787, -25.659363701473637 ], [ -61.753873663938407, -25.661430759022323 ], [ -61.722325201946489, -25.744164727020518 ], [ -61.709948696874847, -28.00040943764543 ], [ -62.087134975898437, -30.156608574426173 ], [ -62.242577684312664, -29.8056222472689 ], [ -62.28815629687557, -29.776735121128922 ], [ -63.384058397077354, -29.771309095738161 ], [ -63.396331550260811, -29.72852101023642 ], [ -63.457904019055206, -29.714309990713502 ], [ -63.462709926821674, -29.655243829039478 ], [ -63.807650112762474, -29.649766126805332 ], [ -64.027585008241545, -29.545173027613146 ], [ -64.049056565807859, -29.473032728877342 ], [ -64.253746913888961, -29.424301853147995 ], [ -64.882468228126243, -29.557110284012424 ], [ -65.035430466942501, -29.292681979789563 ], [ -65.092584600698729, -28.721347345103879 ], [ -65.179995287052861, -28.645072931270761 ], [ -65.07222408717189, -28.424052830173991 ], [ -65.079097053386306, -28.274604587931378 ], [ -65.169091559427898, -27.909665622770262 ], [ -65.07261165990019, -27.889718519494068 ], [ -65.031296352744448, -27.790396416961073 ], [ -64.99915361244922, -27.778149102199336 ], [ -65.069407721689004, -27.60069223385949 ], [ -64.969594692740884, -27.513720797976475 ], [ -65.063594122670622, -27.47237965329839 ], [ -64.879832729796647, -27.309185478626944 ], [ -64.674367235359625, -26.804823499704753 ], [ -64.622070685313872, -26.79185271543048 ], [ -64.581453010148266, -26.676510919143595 ], [ -64.500631070067811, -26.677596123862031 ], [ -64.523265346718347, -26.437455742688371 ], [ -64.425002611381387, -26.027558281689323 ], [ -64.191761033944545, -25.579885348530013 ], [ -63.924387173029629, -25.652335706527651 ], [ -63.398579474962787, -25.659363701473637 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-D", "NAME_1": "San Luis" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -65.086615973848097, -35.001790866855004 ], [ -65.087778692932318, -35.998784274774437 ], [ -66.623111335419765, -35.997905775631011 ], [ -66.521127896135511, -35.494215590277292 ], [ -66.505134039904021, -35.124160658987194 ], [ -66.572003342879952, -34.852911064494037 ], [ -66.737962206190844, -34.615406182549293 ], [ -66.812608812047017, -34.3846192362887 ], [ -66.82136796685819, -34.229279880661977 ], [ -66.759201218861165, -34.184528089499736 ], [ -66.747057257786196, -34.064173678972111 ], [ -66.844002245307365, -33.896276951120399 ], [ -66.929578417210166, -33.83793425895891 ], [ -67.01967627603932, -33.616500745812743 ], [ -67.151942105443823, -33.429070325834857 ], [ -67.226950445606576, -32.91613006015416 ], [ -67.192120531037688, -32.761100762889896 ], [ -67.38986039943785, -32.304332778135176 ], [ -67.366967740368921, -31.857951756168632 ], [ -66.730520799195517, -31.8765552705093 ], [ -66.373850064229089, -31.93381275795241 ], [ -66.21716712056616, -31.925441175869594 ], [ -66.054386358843374, -31.871439303481054 ], [ -65.907289394989562, -31.900739840771053 ], [ -65.671515672010628, -31.885701999847413 ], [ -65.310529954793594, -32.061143486582637 ], [ -65.245081753320221, -32.125118909709897 ], [ -65.189658780328443, -32.327638849253503 ], [ -64.922827520873398, -32.299165134263546 ], [ -64.883191697638722, -32.61950733789331 ], [ -65.014656542265584, -32.948169447661883 ], [ -65.032484911149709, -33.111260267747184 ], [ -65.091137660774393, -33.136840101989094 ], [ -65.131703660895198, -33.205466404151252 ], [ -65.086900193788892, -33.96237110774041 ], [ -65.086615973848097, -35.001790866855004 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-L", "NAME_1": "La Pampa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -65.095788539809234, -36.001316419417208 ], [ -65.086615973848097, -35.001790866855004 ], [ -63.384058397077354, -35.002100925217519 ], [ -63.388580084902969, -39.325764661609867 ], [ -63.516401739948321, -39.305972588863881 ], [ -63.71122189007815, -39.20019093216581 ], [ -63.782121955363948, -39.128360690893146 ], [ -63.908160772801409, -39.092238865131492 ], [ -64.010221727350824, -38.999789727913594 ], [ -64.471485562408759, -38.853700452613793 ], [ -64.970163132622474, -38.803574313803551 ], [ -65.367399867709707, -38.838352552428375 ], [ -65.562995165094776, -38.775824070124713 ], [ -65.689550747369083, -38.817888686113974 ], [ -65.960180223338625, -38.742131036218325 ], [ -66.215229255126019, -38.716602878819799 ], [ -66.391859300266503, -38.734172866184849 ], [ -66.56195227687607, -38.70156503699684 ], [ -66.593500738867988, -38.607307223749388 ], [ -66.647941860828212, -38.557387790514099 ], [ -67.069828254170602, -38.408973077045857 ], [ -67.135767381159724, -38.338073011760059 ], [ -67.176591762799603, -38.222627861786407 ], [ -67.375959439176768, -38.255545750236195 ], [ -67.591992763555197, -38.247122491309938 ], [ -67.705655076820335, -38.100568128915995 ], [ -67.84489722432744, -38.056901544270829 ], [ -67.871743130441132, -38.007240492554672 ], [ -67.848256192169515, -37.907763359491469 ], [ -67.72369015217879, -37.816864515884674 ], [ -67.711752895779512, -37.734750664611454 ], [ -67.748598191952965, -37.669069920040783 ], [ -67.850323248818881, -37.600236912303671 ], [ -68.24939449655875, -37.557035413853271 ], [ -68.256758389188292, -36.276751804052537 ], [ -68.293190274211781, -36.128285413740855 ], [ -68.266111823202095, -36.006484063288895 ], [ -65.095788539809234, -36.001316419417208 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "AR-X", "NAME_1": "Córdoba" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -62.087134975898437, -30.156608574426173 ], [ -62.132067634213911, -30.441035657869293 ], [ -61.857097336672723, -30.731457207484141 ], [ -62.121551480216624, -31.608561292869354 ], [ -62.235885586150857, -31.719768975857562 ], [ -62.184079963419549, -31.962751560036452 ], [ -62.218573981204258, -32.138503106033511 ], [ -62.078220790557054, -32.244078058055948 ], [ -62.014632941057357, -32.386291598878188 ], [ -61.916990323344749, -32.458690280931705 ], [ -61.86611487480161, -32.586176039192878 ], [ -61.894485236104742, -32.658781426821406 ], [ -61.833016120097852, -32.676919854067989 ], [ -61.742272305222684, -32.796964207132476 ], [ -61.780254482958014, -33.029921562829884 ], [ -61.91991004071582, -33.114102471651734 ], [ -62.853806524651361, -34.38213876669073 ], [ -63.339616665176948, -34.380485121191384 ], [ -63.373593919923451, -34.413609713417543 ], [ -63.384058397077354, -35.002100925217519 ], [ -65.086615973848097, -35.001790866855004 ], [ -65.086900193788892, -33.96237110774041 ], [ -65.131703660895198, -33.205466404151252 ], [ -65.091137660774393, -33.136840101989094 ], [ -65.032484911149709, -33.111260267747184 ], [ -65.014656542265584, -32.948169447661883 ], [ -64.883191697638722, -32.61950733789331 ], [ -64.919391038665481, -32.308156833970713 ], [ -65.189658780328443, -32.327638849253503 ], [ -65.245081753320221, -32.125118909709897 ], [ -65.310529954793594, -32.061143486582637 ], [ -65.640587327643061, -31.893246758730925 ], [ -65.75964982787724, -31.885495294272403 ], [ -65.767272101126537, -31.096241143913687 ], [ -65.401893887293056, -30.140175469522319 ], [ -65.138189052582675, -30.063074232489839 ], [ -64.943394740874567, -29.878330986785613 ], [ -64.951146206232409, -29.578969415206359 ], [ -64.253746913888961, -29.424301853147995 ], [ -64.049056565807859, -29.473032728877342 ], [ -64.027585008241545, -29.545173027613146 ], [ -63.807650112762474, -29.649766126805332 ], [ -63.462709926821674, -29.655243829039478 ], [ -63.457904019055206, -29.714309990713502 ], [ -63.396331550260811, -29.72852101023642 ], [ -63.384058397077354, -29.771309095738161 ], [ -62.28815629687557, -29.776735121128922 ], [ -62.242577684312664, -29.8056222472689 ], [ -62.087134975898437, -30.156608574426173 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/bolivia.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/bolivia.geojson new file mode 100644 index 000000000000..c4fb51bf7d32 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/bolivia.geojson @@ -0,0 +1,15 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "BO-L", "NAME_1": "La Paz" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.290029459999914, -17.976627704999899 ], [ -69.317857218999876, -17.951616312999903 ], [ -69.334238647999911, -17.805785420999968 ], [ -69.359405069999951, -17.759379983999864 ], [ -69.497122762999965, -17.621403909999884 ], [ -69.522599243999906, -17.369119567999931 ], [ -69.597271687999893, -17.30049326599989 ], [ -69.666492269999878, -17.288297627999967 ], [ -69.622799845999907, -17.185564879999944 ], [ -69.595049601999875, -17.179673766999954 ], [ -69.510093546999883, -17.112080992999978 ], [ -69.427437092999924, -17.086862894999939 ], [ -69.406017211999909, -17.062988382999947 ], [ -69.413587809999882, -17.022267353999979 ], [ -69.364314331999879, -16.991158141999932 ], [ -69.325944579999941, -16.922221780999905 ], [ -69.224452066999874, -16.818248799999949 ], [ -69.182361612999841, -16.728745218999933 ], [ -69.112055826999949, -16.711485289999942 ], [ -69.037073323999977, -16.670247496999934 ], [ -69.008341227999949, -16.634177347999938 ], [ -69.040122233999909, -16.58136403399989 ], [ -69.02787491899997, -16.454136657999925 ], [ -69.001726643999859, -16.422820739999906 ], [ -68.855844075999926, -16.363186135999911 ], [ -68.833494018999943, -16.328976338999908 ], [ -68.843648437999917, -16.302001240999886 ], [ -68.918760131999932, -16.266654560999967 ], [ -68.982037923999911, -16.210017190999892 ], [ -69.053558105999855, -16.208363545999944 ], [ -69.120814982999917, -16.231204528999939 ], [ -69.184867919999931, -16.195031025999924 ], [ -69.219646159999883, -16.152759704999937 ], [ -69.430020915999933, -15.626280211999884 ], [ -69.356407837999939, -15.501429951999867 ], [ -69.343411214999918, -15.442208760999875 ], [ -69.285921182999886, -15.405415140999963 ], [ -69.291166341999912, -15.35084482799995 ], [ -69.255897176999923, -15.313327738999945 ], [ -69.222591715999982, -15.302165628999916 ], [ -69.209130005999924, -15.263615010999942 ], [ -69.166135213999922, -15.263925068999924 ], [ -69.148100138999922, -15.233332620999917 ], [ -69.28858251999992, -15.101971129999924 ], [ -69.384313110999926, -14.981771748999876 ], [ -69.367750813999919, -14.900536396999897 ], [ -69.370541341999882, -14.801524352999891 ], [ -69.339044555999919, -14.774755960999926 ], [ -69.267627726999905, -14.750674742999976 ], [ -69.234658162999949, -14.574251403999938 ], [ -69.170398518999889, -14.57755869599994 ], [ -69.164274861999928, -14.503041279999891 ], [ -68.990254475999848, -14.3790178429999 ], [ -69.016170206999902, -14.32114023799997 ], [ -69.010149902999871, -14.245899352999928 ], [ -68.984905964999911, -14.228329365999954 ], [ -68.883723510999914, -14.211482848999964 ], [ -68.864448201999949, -14.191225686999971 ], [ -68.905763508999883, -14.039296975999989 ], [ -68.982968098999976, -13.972220967999959 ], [ -68.992993327999898, -13.869798278999937 ], [ -69.023094848999875, -13.806029561999907 ], [ -69.015963500999931, -13.75311289499993 ], [ -69.101591349999893, -13.66660654699993 ], [ -69.087587036999906, -13.643868916999864 ], [ -69.044023803999949, -13.648003031999878 ], [ -69.023844157999889, -13.634980569999939 ], [ -69.02319820199989, -13.596946715999906 ], [ -68.985655273999896, -13.550231221999908 ], [ -68.970746622999854, -13.501448668999956 ], [ -68.962788452999888, -13.283580829999948 ], [ -68.986585448999847, -12.890478209999941 ], [ -68.87656632599996, -12.754982604999938 ], [ -68.766133788999952, -12.710540872999957 ], [ -68.742956909999862, -12.665789082999908 ], [ -68.785331583999977, -12.645945332999915 ], [ -68.793418945999861, -12.620210469999918 ], [ -68.726058715999869, -12.565950215999877 ], [ -68.689463238237863, -12.49341765609995 ], [ -68.629681362804661, -12.490813490150458 ], [ -68.581958177427907, -12.406942640590387 ], [ -68.558212856737953, -12.402291761555546 ], [ -68.50994706900201, -12.427406507804108 ], [ -68.476874151820653, -12.416709486653474 ], [ -68.390161099255295, -12.242456556524871 ], [ -68.271770392589531, -12.18132333730216 ], [ -68.2461647199259, -12.153676445511564 ], [ -68.215133022770772, -12.019937838660326 ], [ -68.012819789701496, -11.970018405425094 ], [ -67.973519864150376, -11.904854424791893 ], [ -66.927821418023996, -12.382241305491846 ], [ -66.938285895177899, -12.420016777652165 ], [ -66.927666389292426, -12.525333347256151 ], [ -66.96665625738035, -12.581505629081505 ], [ -66.948569505178511, -12.670802504032338 ], [ -67.004095831857171, -12.901072685456086 ], [ -67.052258266805552, -13.015897718704764 ], [ -67.119928554559124, -13.03724008596123 ], [ -67.159073452277994, -13.107468356779236 ], [ -67.193179898233723, -13.129637545436367 ], [ -67.205943976033666, -13.167826429646027 ], [ -67.336659511827008, -13.304458917245256 ], [ -67.395596483191127, -13.402489108585485 ], [ -67.361076626085435, -13.573899834809538 ], [ -67.471664191449293, -13.710532321509447 ], [ -67.492644822600482, -13.771355483268962 ], [ -67.482722947805769, -13.836674492633733 ], [ -67.509207118713562, -13.87997934297232 ], [ -67.535975511360732, -13.998370049638083 ], [ -67.50360022616951, -14.258664238763629 ], [ -67.568169929398721, -14.330287773561906 ], [ -67.532383998622606, -14.443045750161275 ], [ -67.48794226762152, -14.511620374580616 ], [ -67.497838303994513, -14.551307874658676 ], [ -67.535975511360732, -14.598591810463688 ], [ -67.504116991006299, -14.668871759024455 ], [ -67.427506680389001, -14.754137871665478 ], [ -67.434250453595553, -14.896351414286357 ], [ -67.417558967172567, -14.968491713022161 ], [ -67.363892991568321, -15.012054945779141 ], [ -67.281288214779295, -15.023578790129079 ], [ -67.179072232397573, -15.165172214226288 ], [ -67.115510220420333, -15.289815768582855 ], [ -67.120006069824228, -15.367950535288969 ], [ -67.107500372644097, -15.400144951528318 ], [ -67.055875617066079, -15.43177092878534 ], [ -67.025644903789271, -15.476781100567337 ], [ -66.784419317897175, -15.699299818431882 ], [ -66.934461839342418, -15.844717299263948 ], [ -66.918235440013518, -15.863992608072408 ], [ -66.944383714137075, -15.923833917001673 ], [ -66.949938930737062, -16.057830906271306 ], [ -66.872062547348662, -16.171105645009504 ], [ -66.870563930580943, -16.215237318547395 ], [ -66.834907192812693, -16.22944833717105 ], [ -66.799612189351024, -16.283295179928643 ], [ -66.816200323885823, -16.482972913768947 ], [ -66.765944993866356, -16.589529717722314 ], [ -66.758451910926965, -16.741148370301062 ], [ -66.798216926270129, -16.79525359457773 ], [ -66.932291429006227, -16.8351478002308 ], [ -66.978102587364504, -16.914626153174424 ], [ -66.977895880890173, -16.963873792841298 ], [ -67.015206265057088, -17.046866143257887 ], [ -66.994974941840098, -17.078853854821546 ], [ -66.948802049175242, -17.09647551813066 ], [ -66.9032751125564, -17.159520766170431 ], [ -66.885085007567056, -17.291502373835499 ], [ -66.850461798573122, -17.377491956888321 ], [ -66.870021328221696, -17.415370781836145 ], [ -66.841935186859359, -17.468080743031862 ], [ -66.989936490076957, -17.551279799023519 ], [ -67.083729214431685, -17.429220066153107 ], [ -67.12008358419007, -17.403381849492746 ], [ -67.302449713983094, -17.445136407119492 ], [ -67.751001146285887, -17.726721286658062 ], [ -67.732630174143196, -17.814209486478603 ], [ -67.772162644590367, -17.862630303845435 ], [ -67.809318000025655, -17.860356540721796 ], [ -68.005765957233109, -17.718453058262014 ], [ -68.140486416015278, -17.65902515958345 ], [ -68.32685746879713, -17.643522230666406 ], [ -68.446617601021444, -17.652358900742684 ], [ -68.552089199357056, -17.694785251937844 ], [ -68.73176815487642, -17.878443292024315 ], [ -68.867703009586194, -17.966758315044217 ], [ -69.08228408714092, -18.039077667900074 ], [ -69.092057047999901, -18.023343199999971 ], [ -69.157711954999854, -18.025720315999934 ], [ -69.234813191999905, -17.992957457999921 ], [ -69.262046671999911, -17.964018655999965 ], [ -69.290029459999914, -17.976627704999899 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "BO-O", "NAME_1": "Oruro" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -68.9896085213162, -18.946490987269271 ], [ -68.959842895999884, -18.907837015999903 ], [ -68.951445475999918, -18.867322692999906 ], [ -69.010537475999854, -18.744539488999933 ], [ -69.003483642999953, -18.702681579999961 ], [ -69.03384354699989, -18.649454853999899 ], [ -69.034386148999943, -18.478302510999896 ], [ -69.077820190999944, -18.398824157999911 ], [ -69.100351114999881, -18.234286396999906 ], [ -69.141201334999948, -18.186847432999912 ], [ -69.155438192999924, -18.140235289999936 ], [ -69.08921484399994, -18.08308115699991 ], [ -69.08228408714092, -18.039077667900074 ], [ -68.816801724420031, -17.940351657602946 ], [ -68.696395637049022, -17.847127374029071 ], [ -68.552089199357056, -17.694785251937844 ], [ -68.446617601021444, -17.652358900742684 ], [ -68.32685746879713, -17.643522230666406 ], [ -68.140486416015278, -17.65902515958345 ], [ -68.005765957233109, -17.718453058262014 ], [ -67.809318000025655, -17.860356540721796 ], [ -67.772162644590367, -17.862630303845435 ], [ -67.732630174143196, -17.814209486478603 ], [ -67.755858730895682, -17.73865854305734 ], [ -67.732035894940566, -17.712872003240363 ], [ -67.302449713983094, -17.445136407119492 ], [ -67.132615118892602, -17.401056409525665 ], [ -67.083729214431685, -17.429220066153107 ], [ -66.989936490076957, -17.551279799023519 ], [ -66.808345505740476, -17.687912285723428 ], [ -66.68047217475106, -17.863973890982265 ], [ -66.624920009650737, -17.991252943668428 ], [ -66.654168870996614, -18.027271416642577 ], [ -66.734758267080338, -18.053936455602923 ], [ -66.748349168978962, -18.162663669892481 ], [ -66.736231045426393, -18.208190605611946 ], [ -66.684580451426655, -18.237387791013759 ], [ -66.521618821651316, -18.252632337512352 ], [ -66.679826218705045, -18.358000583959779 ], [ -66.690574916699063, -18.494271335453789 ], [ -66.641249762666405, -18.591009616500628 ], [ -66.503041143933615, -18.69839324275398 ], [ -66.350647345898267, -18.734876803721534 ], [ -66.28460486522232, -18.765727633723316 ], [ -66.182130500422261, -18.995842786415437 ], [ -66.040588752269116, -19.172886243605262 ], [ -66.055988329297975, -19.198672783422239 ], [ -66.097096930878649, -19.20905974710962 ], [ -66.453922696375344, -19.241512545767364 ], [ -66.728117844862652, -19.44150033886956 ], [ -67.551891852327117, -19.782358086556428 ], [ -67.687464972730311, -19.826024672100914 ], [ -67.739606493145118, -19.824939466483215 ], [ -67.831926439153847, -19.807886243955011 ], [ -68.576735882999941, -19.564606984999969 ], [ -68.510206257999926, -19.47162689199989 ], [ -68.447626098999905, -19.434626566999938 ], [ -68.455015828999933, -19.415402933999914 ], [ -68.60007157499993, -19.303368428999974 ], [ -68.663323526999932, -19.273602802999889 ], [ -68.698463500999964, -19.215621845999934 ], [ -68.815407267999944, -19.113302509999926 ], [ -68.908502359999943, -19.067930602999908 ], [ -68.961703246999889, -18.969435322999942 ], [ -68.9896085213162, -18.946490987269271 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "BO-P", "NAME_1": "Potosí" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -68.597177693999953, -20.056707457999963 ], [ -68.574543415999898, -20.035210062999923 ], [ -68.544622761999875, -19.93475107799992 ], [ -68.553511107999981, -19.857856546999926 ], [ -68.705439818999963, -19.733833109999935 ], [ -68.690298624999855, -19.695385843999887 ], [ -68.576735882999941, -19.564606984999969 ], [ -67.831926439153847, -19.807886243955011 ], [ -67.687464972730311, -19.826024672100914 ], [ -66.728117844862652, -19.44150033886956 ], [ -66.453922696375344, -19.241512545767364 ], [ -66.097096930878649, -19.20905974710962 ], [ -66.046169807290767, -19.191541435688691 ], [ -66.05857214988481, -19.140846856097539 ], [ -66.182130500422261, -18.995842786415437 ], [ -66.220500250885834, -18.92633798600923 ], [ -66.272848476875708, -18.777354831760078 ], [ -66.350647345898267, -18.734876803721534 ], [ -66.503041143933615, -18.69839324275398 ], [ -66.633317430155273, -18.602895196056465 ], [ -66.690574916699063, -18.494271335453789 ], [ -66.679826218705045, -18.358000583959779 ], [ -66.521618821651316, -18.252632337512352 ], [ -66.684580451426655, -18.237387791013759 ], [ -66.736231045426393, -18.208190605611946 ], [ -66.748349168978962, -18.162663669892481 ], [ -66.734758267080338, -18.053936455602923 ], [ -66.654168870996614, -18.027271416642577 ], [ -66.624920009650737, -17.991252943668428 ], [ -66.534382901249899, -17.976938572257325 ], [ -66.346435716435167, -17.988617446238152 ], [ -66.175154182319659, -17.866816094886872 ], [ -66.018522914600794, -17.862165215852031 ], [ -65.94025895938347, -17.981331068873715 ], [ -65.843313971862301, -17.968308607756057 ], [ -65.642370165250895, -18.129073988773541 ], [ -65.595396287808398, -18.203694757107371 ], [ -65.510336879843123, -18.266688328303701 ], [ -65.436310390711924, -18.369266045891322 ], [ -65.347194382914438, -18.413862806523298 ], [ -65.391894497233238, -18.428177178833721 ], [ -65.503179693687912, -18.387972913918873 ], [ -65.554261847806004, -18.405181166077966 ], [ -65.585474413013742, -18.374950452801158 ], [ -65.657046270968635, -18.364201754807141 ], [ -65.672833420725794, -18.345236505260516 ], [ -65.692444628117073, -18.354899997636778 ], [ -65.683607958040795, -18.421097507044294 ], [ -65.628650072143103, -18.45825286158032 ], [ -65.624283413049056, -18.476391289726223 ], [ -65.628572556877998, -18.565739840621177 ], [ -65.607772792880098, -18.674105319704722 ], [ -65.651930304839709, -18.725058281714325 ], [ -65.652188687258104, -18.748674412094431 ], [ -65.457446052393379, -18.683045342568505 ], [ -65.423804694431112, -18.702475681007854 ], [ -65.437188889855349, -18.751309909524707 ], [ -65.506357795276017, -18.812908216740823 ], [ -65.469977587095968, -18.904995618752821 ], [ -65.540774298694942, -19.012947685787083 ], [ -65.506176927223407, -19.093614597135968 ], [ -65.461631843434816, -19.128082778297596 ], [ -65.447214118336888, -19.178932386620374 ], [ -65.292804937797655, -19.310293877560412 ], [ -65.248001471590612, -19.318303724437328 ], [ -65.130540940911658, -19.379230238984348 ], [ -64.963703579356718, -19.350446465631876 ], [ -64.919985317868111, -19.370600273583761 ], [ -64.868670619753289, -19.454057711993812 ], [ -64.870815191667759, -19.547126966836061 ], [ -64.746920946144712, -19.732438652421877 ], [ -64.867740444665799, -19.868399346452691 ], [ -65.05643693741473, -19.968651624972495 ], [ -65.228235236367027, -19.991337578466471 ], [ -65.313242966589598, -20.042342218218778 ], [ -65.315103318563274, -20.108746433201361 ], [ -65.368846809432682, -20.203107599236318 ], [ -65.366056280572877, -20.26904672622544 ], [ -65.29595720096404, -20.533785088810816 ], [ -65.422719488813357, -20.836815687493981 ], [ -65.429282395765938, -20.962596124311688 ], [ -65.471992966901894, -21.101295667660963 ], [ -65.476876389933466, -21.292085055480925 ], [ -65.458453741846711, -21.335079847456996 ], [ -65.317377081686971, -21.477913506802906 ], [ -65.234927333629514, -21.53537769892165 ], [ -65.238467170423576, -21.589379571310189 ], [ -65.289420132433179, -21.678418063842571 ], [ -65.328539190831009, -21.802906588568192 ], [ -65.27647518568125, -21.85070728921005 ], [ -65.211492072201338, -21.946463717426639 ], [ -65.17301896805094, -22.098082370904706 ], [ -65.457343505999944, -22.101440530999923 ], [ -65.579894165999917, -22.086454365999955 ], [ -65.744612793999892, -22.114049580999861 ], [ -65.775308593999938, -22.105057880999908 ], [ -65.9326891689999, -21.944550882999906 ], [ -66.046532348999932, -21.917989196999983 ], [ -66.063585571999852, -21.864039000999924 ], [ -66.094488078999944, -21.832929789999881 ], [ -66.22246476199993, -21.786937763999973 ], [ -66.240008910999904, -21.792415465999866 ], [ -66.307601684999952, -22.077049254999906 ], [ -66.335248575999884, -22.082320250999928 ], [ -66.377468220999845, -22.127072040999892 ], [ -66.626755330999885, -22.192597757999906 ], [ -66.641379760999939, -22.212544859999923 ], [ -66.699309041999896, -22.200762634999919 ], [ -66.735895955999922, -22.225050557999921 ], [ -66.790517943999959, -22.388348082999883 ], [ -66.785091918999882, -22.427622171999957 ], [ -66.9353153079999, -22.480538838999934 ], [ -66.978155069999843, -22.522500100999935 ], [ -67.032725382999871, -22.524567158999986 ], [ -67.026627563999909, -22.639392190999985 ], [ -67.113237263999849, -22.710085550999906 ], [ -67.193904174999972, -22.82222340899996 ], [ -67.547112589999927, -22.892503356999967 ], [ -67.80358272299992, -22.878654072999907 ], [ -67.833038289999934, -22.840103454999934 ], [ -67.887091837999918, -22.818709411999919 ], [ -67.891329304999971, -22.715666605999914 ], [ -67.859186564999931, -22.547304788999966 ], [ -67.951894083999917, -22.334087828999941 ], [ -67.934789184999971, -22.251715596999958 ], [ -67.976595418999921, -22.159834899999893 ], [ -67.960627400999982, -22.102887470999917 ], [ -68.096226359999946, -21.953955993999955 ], [ -68.107595173999925, -21.789624938999907 ], [ -68.128369099999873, -21.712316996999988 ], [ -68.198442341999908, -21.571860452999942 ], [ -68.193739786999942, -21.32846445699991 ], [ -68.207537394999889, -21.284332783999915 ], [ -68.416310180999915, -20.959804788999932 ], [ -68.453930622999934, -20.9397543339999 ], [ -68.510206257999926, -20.940167744999911 ], [ -68.55511307799992, -20.913916116999971 ], [ -68.571959594999896, -20.872368265999881 ], [ -68.572786417999907, -20.742867126999982 ], [ -68.550203816999982, -20.699045511999898 ], [ -68.481629190999854, -20.643028258999962 ], [ -68.480957397999873, -20.624734802999896 ], [ -68.685544392999958, -20.516834410999891 ], [ -68.765410319999944, -20.421233012 ], [ -68.757684692999959, -20.36428558399993 ], [ -68.678516398999932, -20.32862884499994 ], [ -68.7294693609999, -20.228686624999895 ], [ -68.726265421999926, -20.150965270999876 ], [ -68.789465698999891, -20.125850524999947 ], [ -68.792592121999945, -20.106626891999923 ], [ -68.652884887999875, -20.054226988999886 ], [ -68.597177693999953, -20.056707457999963 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "BO-T", "NAME_1": "Tarija" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -62.650357218999943, -22.234455667999967 ], [ -62.679296020999914, -22.194768167999896 ], [ -62.78347570899993, -22.130896097999937 ], [ -62.8013557539999, -22.013487242999929 ], [ -62.81856400599986, -22.00087819399991 ], [ -63.639392455999882, -21.997467549999968 ], [ -63.693911092999912, -22.012040302999935 ], [ -63.740419880999923, -22.050590921999913 ], [ -63.81312862199988, -22.003048604999904 ], [ -63.933172973999916, -22.001808369999949 ], [ -64.004383097999948, -22.099270120999932 ], [ -64.051021077999934, -22.229184671999931 ], [ -64.086238565999906, -22.257916767999944 ], [ -64.160549275999898, -22.438474223 ], [ -64.250828002999924, -22.540690204999876 ], [ -64.325293741999957, -22.871936136999878 ], [ -64.343897257999913, -22.863667906999936 ], [ -64.355731160999909, -22.751943460999968 ], [ -64.453709675999846, -22.642906188999945 ], [ -64.428284871999921, -22.542343851999931 ], [ -64.4981255699999, -22.472787373999921 ], [ -64.53132767799994, -22.42565846699992 ], [ -64.524558065999884, -22.38535085099997 ], [ -64.572022867999891, -22.343182881999908 ], [ -64.542774006999934, -22.275486755999921 ], [ -64.586879841999917, -22.21275156699997 ], [ -64.657779907999981, -22.178438414999945 ], [ -64.762321329999907, -22.17440765399995 ], [ -64.832472086999957, -22.137510680999924 ], [ -65.020367594999897, -22.096582946999916 ], [ -65.190478219194461, -22.098473959105945 ], [ -65.17301896805094, -22.098082370904706 ], [ -65.211492072201338, -21.946463717426639 ], [ -65.27647518568125, -21.85070728921005 ], [ -65.328539190831009, -21.802906588568192 ], [ -65.289420132433179, -21.678418063842571 ], [ -65.235521612832144, -21.576925550973385 ], [ -65.171907924910784, -20.962027682631458 ], [ -65.15661170066943, -20.945749606459174 ], [ -65.109792852857879, -20.962492770624863 ], [ -65.078476934862636, -20.955154718215681 ], [ -65.033776822342475, -21.000371595572688 ], [ -64.922000697674036, -21.021765638773218 ], [ -64.829577398877859, -21.097523288668867 ], [ -64.775187953761019, -21.073752129557136 ], [ -64.750124885255218, -20.985798841743133 ], [ -64.702660082296973, -20.928851413561915 ], [ -64.640700038975581, -20.947196547282829 ], [ -64.530990973654525, -21.089978529785299 ], [ -64.445699021692462, -21.083208917257707 ], [ -64.359037645071226, -21.13473032004822 ], [ -64.23235287068843, -21.142016696513338 ], [ -64.198969896043877, -21.110235690524689 ], [ -64.175172899409745, -20.891437676607495 ], [ -64.142590907744193, -20.916345717281047 ], [ -64.074326340787991, -20.914330335676482 ], [ -64.053526576790091, -20.945284518465769 ], [ -64.000403205343616, -20.944250989691398 ], [ -64.00996334493243, -20.965593356947863 ], [ -63.983039923553633, -20.996702568468777 ], [ -62.271885774109194, -21.00042365282934 ], [ -62.275703084999861, -21.06656829799995 ], [ -62.650357218999943, -22.234455667999967 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "BO-S", "NAME_1": "Santa Cruz" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -57.859745238999921, -19.980122985999955 ], [ -57.895608682999864, -20.024151305999922 ], [ -57.959170694999926, -20.02621836299997 ], [ -58.103554647999943, -20.144040628999889 ], [ -58.158796752999962, -20.165124612999918 ], [ -58.141846883999875, -20.000896910999899 ], [ -58.175281534999954, -19.821372984999925 ], [ -59.069645548999858, -19.291482848999948 ], [ -60.006384236999878, -19.298097431999935 ], [ -61.753202677999894, -19.645879821999941 ], [ -61.944250447999906, -20.104146422999946 ], [ -62.210573102366766, -20.471305463076646 ], [ -63.285873176106179, -20.475132338286812 ], [ -63.303107265787673, -20.46887948969669 ], [ -63.368477952895205, -20.357413425189407 ], [ -63.415219286340971, -20.403250421070084 ], [ -63.467102424337384, -20.420355319542352 ], [ -63.502423265321454, -20.460352878882247 ], [ -63.651897345985731, -20.450120944825755 ], [ -63.706906907827545, -20.003843275646659 ], [ -63.725303718391899, -19.962967218062659 ], [ -63.767652554321899, -19.271278171050767 ], [ -63.741349249668133, -19.044366956569775 ], [ -63.750521817427909, -19.02829558687182 ], [ -63.872633226242385, -19.026280206166575 ], [ -63.896585253406727, -19.055890801819032 ], [ -63.905912848998753, -19.128909600597581 ], [ -63.927126024146673, -19.162757664134915 ], [ -63.973453946442476, -19.174436537216422 ], [ -64.016293707888281, -19.160587252899404 ], [ -64.064662849311048, -18.999821872781183 ], [ -64.120370043142941, -18.955276788093272 ], [ -64.191967740418875, -18.939205417495998 ], [ -64.220648159185203, -18.865566501992475 ], [ -64.289041918249893, -18.814200127933589 ], [ -64.319453497780671, -18.735393568558322 ], [ -64.319866908930692, -18.679014581158015 ], [ -64.340201585834507, -18.65694874348975 ], [ -64.29325354681373, -18.591009616500628 ], [ -64.302116055311672, -18.499594008057045 ], [ -64.420041673084711, -18.420942478312725 ], [ -64.445647345748398, -18.356398613505235 ], [ -64.441229010710288, -18.326116225183625 ], [ -64.488383755306074, -18.240333346806494 ], [ -64.589307827394293, -18.114914646094064 ], [ -64.641242642234147, -18.005257256717016 ], [ -64.710644089852849, -17.910741061950432 ], [ -64.689896002698333, -17.866971123618441 ], [ -64.564322272354957, -17.745686537104007 ], [ -64.405649787307823, -17.520377293077615 ], [ -64.396373866760541, -17.45629851716285 ], [ -64.339503953844371, -17.420693454439402 ], [ -64.224601406229908, -17.41599089856112 ], [ -64.216229824147035, -17.35971526484758 ], [ -64.238269823393637, -17.310932712274848 ], [ -64.375677456449466, -17.174610283937454 ], [ -64.503447434651378, -17.103141777870746 ], [ -64.591504076152205, -17.020252781140925 ], [ -64.647443813980829, -16.996016534035846 ], [ -64.741649950384897, -16.898399752946261 ], [ -64.782215948707062, -16.766263115650247 ], [ -64.807744107004908, -16.729624525951124 ], [ -64.751055060342765, -16.611182142441919 ], [ -64.778366055349181, -16.587255954598618 ], [ -64.779890509639301, -16.556146742178441 ], [ -64.723149787033037, -16.491086113433369 ], [ -64.682170375762212, -16.37434905406559 ], [ -64.696433072128571, -16.343963311157893 ], [ -64.67596920401553, -16.306084487109388 ], [ -64.699792039970646, -16.304689223129174 ], [ -64.67596920401553, -16.265156751782683 ], [ -64.677286952730697, -16.169090265203579 ], [ -64.661680671026147, -16.118033948607831 ], [ -64.689611781858218, -16.056590671022661 ], [ -64.688681606770729, -15.969929295300744 ], [ -64.730591193129044, -15.922490329864843 ], [ -64.703900315746978, -15.911586602239879 ], [ -64.67596920401553, -15.922490329864843 ], [ -64.703900315746978, -15.874741306066426 ], [ -64.664393683721528, -15.872467542942786 ], [ -64.657520718406431, -15.850453383017225 ], [ -63.317395798777056, -15.914067070938586 ], [ -63.384807705011553, -15.891329440601226 ], [ -63.420696987675854, -15.856551201976401 ], [ -63.440876634049403, -15.774230645128171 ], [ -63.498676723851702, -15.692065117910886 ], [ -63.623811204623394, -15.627366225271089 ], [ -63.67016496444154, -15.580185642253582 ], [ -63.68812252543421, -15.504944757194778 ], [ -63.757989061046317, -15.456058851834541 ], [ -63.863176439441133, -15.298083997878223 ], [ -63.949786140118249, -15.08564218443928 ], [ -63.934748298295347, -15.027919609902085 ], [ -63.940200161208452, -14.832324313416336 ], [ -63.963015305911654, -14.737394707499732 ], [ -63.570403612336804, -14.618538913739883 ], [ -61.593060170999934, -13.506794492999958 ], [ -61.550811930999913, -13.538035582999981 ], [ -61.503424641999914, -13.548164163999942 ], [ -61.45875036699988, -13.543719990999932 ], [ -61.347723551999934, -13.493697204999947 ], [ -61.248556477999983, -13.524393004999894 ], [ -61.14910518399995, -13.519845478999954 ], [ -61.1187194419999, -13.484498798999951 ], [ -61.047225097999871, -13.464551696999933 ], [ -61.041256469999951, -13.515194600999891 ], [ -61.022006998999927, -13.535245055999937 ], [ -60.896743326999882, -13.552918395999939 ], [ -60.801968750999947, -13.60418141599996 ], [ -60.652701375999897, -13.718799742999906 ], [ -60.588622599999951, -13.744534606999906 ], [ -60.575135050999904, -13.765618590999935 ], [ -60.472634846999938, -13.797864684999894 ], [ -60.448812011999877, -13.896773375999956 ], [ -60.387187866999938, -13.983279723999971 ], [ -60.419433960999896, -14.076917418999912 ], [ -60.473513345999891, -14.117225036999869 ], [ -60.464340779999901, -14.27835215199994 ], [ -60.391347818999861, -14.357107034999942 ], [ -60.338431151999885, -14.53260019899993 ], [ -60.36920446799985, -14.542832132999905 ], [ -60.291715657999902, -14.630061949999913 ], [ -60.269804849999844, -15.083367614999972 ], [ -60.27497249399994, -15.095149840999881 ], [ -60.582240559999946, -15.098870543999894 ], [ -60.246395425999879, -15.478278909999872 ], [ -60.1798103429999, -16.222006122999943 ], [ -60.160690063999908, -16.264794209999963 ], [ -58.464721232999892, -16.331250101999927 ], [ -58.421623087999876, -16.318434345999947 ], [ -58.392942667999904, -16.279366963999934 ], [ -58.349741170999948, -16.280400491999913 ], [ -58.33454829899992, -16.386647236999892 ], [ -58.363590453999905, -16.436670022999877 ], [ -58.342661498999917, -16.473153584999892 ], [ -58.35609737199988, -16.50953379299996 ], [ -58.455884562999898, -16.619087829999941 ], [ -58.480275838999916, -16.683683369999898 ], [ -58.45293900599998, -16.841296487999912 ], [ -58.4662715259999, -16.887288512999916 ], [ -58.40627518799991, -17.110117288999945 ], [ -58.39914383999988, -17.237448017999952 ], [ -58.381160441999981, -17.267213642999934 ], [ -58.231557169999945, -17.329742125999928 ], [ -58.204065307999969, -17.377387796999884 ], [ -58.152233845999888, -17.396404723999936 ], [ -58.010175333999882, -17.496760354999907 ], [ -57.943564412999905, -17.51784433999994 ], [ -57.836749226999871, -17.511023050999981 ], [ -57.800730753999886, -17.533450622999879 ], [ -57.785899617999945, -17.677524514999917 ], [ -57.724456339999875, -17.736642353999883 ], [ -57.732982950999968, -17.768475036999931 ], [ -57.696809448999943, -17.825112406999921 ], [ -57.698773152999877, -17.843095804999905 ], [ -57.730089070999981, -17.846093037999921 ], [ -57.551081909999937, -18.183643492999934 ], [ -57.465660766999946, -18.217749938999901 ], [ -57.466797648999943, -18.239557393999931 ], [ -57.535734008999981, -18.240487568999882 ], [ -57.5667398679999, -18.256093850999918 ], [ -57.782333943999873, -18.910420836999904 ], [ -57.731794392999944, -18.921996357999944 ], [ -57.71582637599991, -19.044572854999956 ], [ -57.789000203999905, -19.059248961999941 ], [ -58.124638630999897, -19.729905699999875 ], [ -58.1169388429999, -19.758017679999909 ], [ -57.859745238999921, -19.980122985999955 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "BO-H", "NAME_1": "Chuquisaca" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -62.210573102366766, -20.471305463076646 ], [ -62.277305053999896, -20.579776305999886 ], [ -62.271885774109194, -21.00042365282934 ], [ -63.983039923553633, -20.996702568468777 ], [ -64.00996334493243, -20.965593356947863 ], [ -64.000403205343616, -20.944250989691398 ], [ -64.053526576790091, -20.945284518465769 ], [ -64.074326340787991, -20.914330335676482 ], [ -64.142590907744193, -20.916345717281047 ], [ -64.175172899409745, -20.891437676607495 ], [ -64.198969896043877, -21.110235690524689 ], [ -64.23235287068843, -21.142016696513338 ], [ -64.359037645071226, -21.13473032004822 ], [ -64.445699021692462, -21.083208917257707 ], [ -64.530990973654525, -21.089978529785299 ], [ -64.640700038975581, -20.947196547282829 ], [ -64.697001512010161, -20.929988295123735 ], [ -64.717439540802161, -20.935879407608581 ], [ -64.750124885255218, -20.985798841743133 ], [ -64.775187953761019, -21.073752129557136 ], [ -64.829577398877859, -21.097523288668867 ], [ -64.922000697674036, -21.021765638773218 ], [ -65.033776822342475, -21.000371595572688 ], [ -65.078476934862636, -20.955154718215681 ], [ -65.109792852857879, -20.962492770624863 ], [ -65.15661170066943, -20.945749606459174 ], [ -65.174285040821985, -20.968228855277459 ], [ -65.234927333629514, -21.53537769892165 ], [ -65.317377081686971, -21.477913506802906 ], [ -65.458453741846711, -21.335079847456996 ], [ -65.476876389933466, -21.292085055480925 ], [ -65.471992966901894, -21.101295667660963 ], [ -65.429282395765938, -20.962596124311688 ], [ -65.422719488813357, -20.836815687493981 ], [ -65.29595720096404, -20.533785088810816 ], [ -65.366056280572877, -20.26904672622544 ], [ -65.368846809432682, -20.203107599236318 ], [ -65.315103318563274, -20.108746433201361 ], [ -65.313242966589598, -20.042342218218778 ], [ -65.228235236367027, -19.991337578466471 ], [ -65.05643693741473, -19.968651624972495 ], [ -64.867740444665799, -19.868399346452691 ], [ -64.746920946144712, -19.732438652421877 ], [ -64.870815191667759, -19.547126966836061 ], [ -64.868670619753289, -19.454057711993812 ], [ -64.919985317868111, -19.370600273583761 ], [ -64.963703579356718, -19.350446465631876 ], [ -65.130540940911658, -19.379230238984348 ], [ -65.248001471590612, -19.318303724437328 ], [ -65.292804937797655, -19.310293877560412 ], [ -65.447214118336888, -19.178932386620374 ], [ -65.461631843434816, -19.128082778297596 ], [ -65.506176927223407, -19.093614597135968 ], [ -65.540774298694942, -19.012947685787083 ], [ -65.469977587095968, -18.904995618752821 ], [ -65.506357795276017, -18.812908216740823 ], [ -65.437188889855349, -18.751309909524707 ], [ -65.423804694431112, -18.702475681007854 ], [ -65.457446052393379, -18.683045342568505 ], [ -65.652188687258104, -18.748674412094431 ], [ -65.651930304839709, -18.725058281714325 ], [ -65.607772792880098, -18.674105319704722 ], [ -65.628572556877998, -18.565739840621177 ], [ -65.624283413049056, -18.476391289726223 ], [ -65.628650072143103, -18.45825286158032 ], [ -65.683607958040795, -18.421097507044294 ], [ -65.692444628117073, -18.354899997636778 ], [ -65.672833420725794, -18.345236505260516 ], [ -65.657046270968635, -18.364201754807141 ], [ -65.585474413013742, -18.374950452801158 ], [ -65.554261847806004, -18.405181166077966 ], [ -65.503179693687912, -18.387972913918873 ], [ -65.391894497233238, -18.428177178833721 ], [ -65.343938767859811, -18.422647799756135 ], [ -65.336988288178929, -18.451896661102012 ], [ -65.305956590124538, -18.451844985157948 ], [ -65.293502569787734, -18.495356541071544 ], [ -65.250249396292588, -18.530238131584497 ], [ -65.231387498634149, -18.616279391480759 ], [ -65.157257656715501, -18.613643894050483 ], [ -65.080182258104742, -18.655863538771314 ], [ -65.05486080628117, -18.644132988846366 ], [ -65.024759284213587, -18.576178481151999 ], [ -64.964582079399463, -18.531323337202252 ], [ -64.816038173822676, -18.484659519021591 ], [ -64.771699794709775, -18.521194756832585 ], [ -64.685012579666818, -18.540108330435089 ], [ -64.57458004393385, -18.666715589552837 ], [ -64.493990647850126, -18.666250501559432 ], [ -64.413995530968975, -18.609716484528121 ], [ -64.369993048640254, -18.608941339071521 ], [ -64.319866908930692, -18.679014581158015 ], [ -64.319453497780671, -18.735393568558322 ], [ -64.281781379307176, -18.826240737120315 ], [ -64.220648159185203, -18.865566501992475 ], [ -64.191967740418875, -18.939205417495998 ], [ -64.120370043142941, -18.955276788093272 ], [ -64.064662849311048, -18.999821872781183 ], [ -64.006940273874534, -19.168648776619762 ], [ -63.955108811822186, -19.172989597292087 ], [ -63.917591722080317, -19.153817641271132 ], [ -63.896585253406727, -19.055890801819032 ], [ -63.872633226242385, -19.026280206166575 ], [ -63.750521817427909, -19.02829558687182 ], [ -63.741349249668133, -19.044366956569775 ], [ -63.767652554321899, -19.271278171050767 ], [ -63.725303718391899, -19.962967218062659 ], [ -63.706906907827545, -20.003843275646659 ], [ -63.651897345985731, -20.450120944825755 ], [ -63.502423265321454, -20.460352878882247 ], [ -63.467102424337384, -20.420355319542352 ], [ -63.415219286340971, -20.403250421070084 ], [ -63.368477952895205, -20.357413425189407 ], [ -63.303107265787673, -20.46887948969669 ], [ -63.285873176106179, -20.475132338286812 ], [ -62.210573102366766, -20.471305463076646 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "BO-N", "NAME_1": "Pando" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -65.44248653199989, -9.679821471999986 ], [ -65.397993123999896, -9.686746113999973 ], [ -65.370501261999948, -9.710620625999866 ], [ -65.340063842999967, -9.789685566999935 ], [ -65.299110270999847, -9.841258645999858 ], [ -65.336834065999881, -9.96724578899989 ], [ -65.284821736999874, -10.206817727999891 ], [ -65.327816528999847, -10.314408060999909 ], [ -65.365023559999941, -10.332184752999936 ], [ -65.394646196065082, -10.392070070277555 ], [ -65.464241503342691, -10.406444593743004 ], [ -65.526253220809508, -10.486594740255043 ], [ -65.652292040045609, -10.560388686288832 ], [ -65.67391862724287, -10.57155079453355 ], [ -65.761432664585811, -10.564109388437544 ], [ -65.753112759346379, -10.666997166186263 ], [ -65.785746426056733, -10.701258639974242 ], [ -65.85623308019251, -10.723014417481409 ], [ -65.89806515218504, -10.679761243986206 ], [ -65.921784633554012, -10.682396741416483 ], [ -65.942429368820285, -10.719500420907707 ], [ -65.886722174988392, -10.764820651951538 ], [ -65.895042080227824, -10.811742851651275 ], [ -66.011675787707418, -10.789418634262574 ], [ -66.107923143238452, -10.840681654634636 ], [ -66.094849006176673, -10.858303317943751 ], [ -66.053275315703274, -10.851482028572775 ], [ -66.045342984091405, -10.867553399170049 ], [ -66.090353155873458, -10.969976088026044 ], [ -66.12153988265942, -10.968167412895809 ], [ -66.130609096732428, -10.981809990738498 ], [ -66.147223069688891, -11.080615330233286 ], [ -66.171175095953913, -11.100820815028612 ], [ -66.217838915033894, -11.097720228705612 ], [ -66.211534389600388, -11.174614760163081 ], [ -66.264115159586936, -11.253938083475759 ], [ -66.267758348269126, -11.277295830538151 ], [ -66.24316036595809, -11.31295256920572 ], [ -66.254632534363964, -11.33165943813259 ], [ -66.308918626693242, -11.344475192775917 ], [ -66.316876796726774, -11.385919692040147 ], [ -66.416715664096614, -11.400802504232217 ], [ -66.4970208402396, -11.442298678541192 ], [ -66.564794480780677, -11.434598890926054 ], [ -66.678999396405004, -11.449378349431299 ], [ -66.690833299117457, -11.537590019663696 ], [ -66.720857306819255, -11.583530369231141 ], [ -66.715276251797548, -11.655567315179439 ], [ -66.729022183327061, -11.674739272099714 ], [ -66.796769986345794, -11.685746351612863 ], [ -66.835604823903509, -11.727810967602068 ], [ -66.905290493261646, -11.735407402429701 ], [ -66.876842616693409, -11.795558769721424 ], [ -66.888366461942667, -11.818141370427895 ], [ -66.917615323288544, -11.841809176752122 ], [ -66.970609504425056, -11.848992200429734 ], [ -66.974562750570499, -11.869197686124323 ], [ -66.961333583877774, -11.910538831701729 ], [ -66.933066576261467, -11.911779066950373 ], [ -66.896970588022214, -11.965987644014547 ], [ -66.877436895896039, -12.064999688185083 ], [ -66.897228970440608, -12.152229505587229 ], [ -66.889348313873597, -12.223181247716411 ], [ -66.919294807209553, -12.288758639499633 ], [ -66.905238817317581, -12.34167530716968 ], [ -66.927821418023996, -12.382241305491846 ], [ -67.973519864150376, -11.904854424791893 ], [ -68.012819789701496, -11.970018405425094 ], [ -68.215133022770772, -12.019937838660326 ], [ -68.2461647199259, -12.153676445511564 ], [ -68.271770392589531, -12.18132333730216 ], [ -68.390161099255295, -12.242456556524871 ], [ -68.476874151820653, -12.416709486653474 ], [ -68.50994706900201, -12.427406507804108 ], [ -68.558212856737953, -12.402291761555546 ], [ -68.581958177427907, -12.406942640590387 ], [ -68.629681362804661, -12.490813490150458 ], [ -68.689463238237863, -12.49341765609995 ], [ -69.577634643999943, -10.952301940999931 ], [ -69.502884684999941, -10.955299173999947 ], [ -69.395940307999894, -10.93504201199994 ], [ -69.086889404999908, -10.967184752999884 ], [ -68.996998250999894, -11.001704609999948 ], [ -68.8840335699999, -11.016380716999947 ], [ -68.80465856999993, -10.99467661599995 ], [ -68.757633016999932, -11.011936543999937 ], [ -68.791171020999855, -11.085110371999917 ], [ -68.775926473999903, -11.140610859999896 ], [ -68.615729532999893, -11.112498880999865 ], [ -68.536096150999953, -11.061545918999911 ], [ -68.428195760999927, -11.043665872999952 ], [ -68.378276326999867, -11.005011900999946 ], [ -68.293320271999903, -10.978966979999882 ], [ -68.112091023999938, -10.714073587999906 ], [ -68.043774780999883, -10.666944681999908 ], [ -67.862648885999874, -10.658779804999881 ], [ -67.755782022999938, -10.714176940999934 ], [ -67.721727254999877, -10.705495299999967 ], [ -67.68467525199992, -10.610514017999961 ], [ -67.584629678999931, -10.50178680399992 ], [ -67.468047648999857, -10.452280781999974 ], [ -67.41833491999995, -10.381484069999942 ], [ -67.342835652999923, -10.372492370999893 ], [ -67.337823038999971, -10.326086933999889 ], [ -67.323508666999885, -10.31885223399992 ], [ -67.184705769999965, -10.326707051999946 ], [ -67.151736206999914, -10.288983254999906 ], [ -67.064299682999945, -10.256943867999908 ], [ -66.902655802999931, -10.093129576999985 ], [ -66.770622517999954, -9.992567240999961 ], [ -66.66008662899992, -9.945334980999931 ], [ -66.642619995999979, -9.90792124399988 ], [ -66.513842325999889, -9.883943379999948 ], [ -66.432710327999956, -9.886113788999936 ], [ -66.190657918999875, -9.800847676999879 ], [ -66.118181721999889, -9.806015319999887 ], [ -66.086994995999902, -9.784517923999942 ], [ -66.029479126999888, -9.808289082999906 ], [ -65.946951863999857, -9.77139210999988 ], [ -65.86246089699992, -9.781830748999909 ], [ -65.834064696999889, -9.758266295999903 ], [ -65.806417805999871, -9.784414570999914 ], [ -65.788563598999929, -9.733048196999945 ], [ -65.772440552999853, -9.76880828799996 ], [ -65.709963744999868, -9.755992532999898 ], [ -65.713116007999929, -9.794233092999974 ], [ -65.678957886999854, -9.789375507999864 ], [ -65.628883422999934, -9.826892597999858 ], [ -65.583976603999929, -9.837227884999962 ], [ -65.510776936999946, -9.734081725999928 ], [ -65.44248653199989, -9.679821471999986 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "BO-B", "NAME_1": "El Beni" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -65.394646196065082, -10.392070070277555 ], [ -65.387270263999909, -10.4067021689999 ], [ -65.410938069999929, -10.449180195999929 ], [ -65.449979614999933, -10.468093769999967 ], [ -65.429231526999899, -10.561421406999926 ], [ -65.435691081999948, -10.625810241999929 ], [ -65.386753498999951, -10.66952850299991 ], [ -65.381069091999905, -10.698053893999955 ], [ -65.404736897999925, -10.799236348999941 ], [ -65.327118896999934, -10.850499368999877 ], [ -65.299110270999847, -10.982067565999927 ], [ -65.341975871999892, -11.032813821999909 ], [ -65.341045695999924, -11.106607767999961 ], [ -65.394737508999924, -11.153426614999972 ], [ -65.398148152999852, -11.178024596999961 ], [ -65.360010945999903, -11.218848978999858 ], [ -65.388613850999945, -11.253162129999879 ], [ -65.387270263999909, -11.277553404999907 ], [ -65.326447102999879, -11.327782897999953 ], [ -65.354765787999952, -11.382353209999891 ], [ -65.319548299999894, -11.476404316999933 ], [ -65.292469848999929, -11.504723001999935 ], [ -65.257562418999953, -11.495317890999971 ], [ -65.222654988999864, -11.517435403999883 ], [ -65.219244343999947, -11.584511413999905 ], [ -65.167438721999957, -11.615517272999938 ], [ -65.193354451999909, -11.632363789999914 ], [ -65.19619665599987, -11.741814472999948 ], [ -65.151496541999933, -11.773130390999953 ], [ -65.133978231999976, -11.702643737999907 ], [ -65.113411010999897, -11.690551452999927 ], [ -65.113566039999938, -11.722590839999924 ], [ -65.065558634999974, -11.753079935999907 ], [ -65.038454345999924, -11.818709004999945 ], [ -65.033674275999914, -11.879790547999932 ], [ -64.998120889999967, -11.90893605499987 ], [ -65.016336832999912, -11.968467304999933 ], [ -64.997449096999873, -11.996269225999896 ], [ -64.792500365999899, -12.03254608099985 ], [ -64.736793171999949, -12.119775898999947 ], [ -64.739532023999914, -12.144580585999975 ], [ -64.716277628999876, -12.146544290999913 ], [ -64.710283162999957, -12.111921080999906 ], [ -64.689922648999925, -12.104376321999951 ], [ -64.688992472999871, -12.153882343999911 ], [ -64.66485957799992, -12.180960794999876 ], [ -64.593416910999906, -12.215997415999894 ], [ -64.48939225299992, -12.239458515999956 ], [ -64.468153239999964, -12.272634785999884 ], [ -64.489779825999847, -12.373610533999909 ], [ -64.452521118999925, -12.390353697999956 ], [ -64.395728718999891, -12.457326354999864 ], [ -64.29769852799987, -12.465697936999931 ], [ -64.287544107999906, -12.497117207999878 ], [ -64.215222940999951, -12.473759459999926 ], [ -64.144787963999903, -12.520371601999983 ], [ -64.11982824699993, -12.489675801999852 ], [ -64.104454508999936, -12.507142435999896 ], [ -64.044458170999945, -12.509106139999929 ], [ -64.022831583999874, -12.537838235999928 ], [ -63.972447062999976, -12.523885599999943 ], [ -63.921235717999963, -12.544349466999904 ], [ -63.862893025999909, -12.46921193499989 ], [ -63.801398071999898, -12.454949238999916 ], [ -63.657737589999954, -12.475413105999877 ], [ -63.542189086999969, -12.547966816999889 ], [ -63.485758422999936, -12.557475280999967 ], [ -63.431446492999982, -12.636953633999966 ], [ -63.317913370999946, -12.701962585999922 ], [ -63.23595454999986, -12.698551940999906 ], [ -63.136684122999895, -12.633749695 ], [ -63.075034139999843, -12.65266326899993 ], [ -63.043459838999865, -12.719119160999895 ], [ -63.051107950999949, -12.742166849999947 ], [ -63.014727742999952, -12.777720234999919 ], [ -62.988011026999914, -12.843866067999983 ], [ -62.955144815999887, -12.857508646999889 ], [ -62.928893188999922, -12.846036478999878 ], [ -62.86507279499989, -12.935540059 ], [ -62.831431437999953, -12.94494516999994 ], [ -62.789831909999947, -13.00065236399989 ], [ -62.770453247999882, -13.01047088599995 ], [ -62.768644571999886, -12.990627135999958 ], [ -62.686634073999926, -12.964995625999904 ], [ -62.65133907099991, -12.992487487999966 ], [ -62.641675577999905, -13.030004577999961 ], [ -62.554600788999949, -13.066798196999869 ], [ -62.472125203999923, -13.06845184399991 ], [ -62.427476765999899, -13.124572448999956 ], [ -62.381846476999897, -13.13986867299991 ], [ -62.290327514999944, -13.142039082999901 ], [ -62.211520954999912, -13.120334981999903 ], [ -62.173952189999909, -13.140798848999864 ], [ -62.172453572999899, -13.117854512999926 ], [ -62.162376668999883, -13.120748392999914 ], [ -62.139845743999842, -13.14700002099994 ], [ -62.114679321999915, -13.150203958999924 ], [ -62.099228068999906, -13.262600198999863 ], [ -62.003264933999844, -13.360475361999946 ], [ -61.872316853999877, -13.456076761999924 ], [ -61.836350056999976, -13.540619404999902 ], [ -61.735115926999896, -13.538035582999981 ], [ -61.668091593999861, -13.512507425999956 ], [ -61.593060170999934, -13.506794492999958 ], [ -63.570403612336804, -14.618538913739883 ], [ -63.963015305911654, -14.737394707499732 ], [ -63.940200161208452, -14.832324313416336 ], [ -63.934748298295347, -15.027919609902085 ], [ -63.949786140118249, -15.08564218443928 ], [ -63.863176439441133, -15.298083997878223 ], [ -63.757989061046317, -15.456058851834541 ], [ -63.68812252543421, -15.504944757194778 ], [ -63.67016496444154, -15.580185642253582 ], [ -63.623811204623394, -15.627366225271089 ], [ -63.498676723851702, -15.692065117910886 ], [ -63.440876634049403, -15.774230645128171 ], [ -63.420696987675854, -15.856551201976401 ], [ -63.384807705011553, -15.891329440601226 ], [ -63.320599737887562, -15.916599215581357 ], [ -64.684108242101672, -15.842908624133713 ], [ -65.163898078033867, -15.907142428780048 ], [ -65.193922084836345, -15.927141208899684 ], [ -65.2732454090484, -16.071886895264015 ], [ -65.330864630798089, -16.279109388887207 ], [ -65.359570888885401, -16.324171237512587 ], [ -65.45555986199804, -16.368871351831444 ], [ -65.804375779718441, -16.465712985665789 ], [ -65.886153734207483, -16.466333103290083 ], [ -66.069579230297222, -16.420082696259442 ], [ -66.239232958234425, -16.316936536991591 ], [ -66.460795660791121, -16.074212335231095 ], [ -66.50353207124806, -15.97194467510667 ], [ -67.025644903789271, -15.476781100567337 ], [ -67.055875617066079, -15.43177092878534 ], [ -67.107500372644097, -15.400144951528318 ], [ -67.120006069824228, -15.367950535288969 ], [ -67.115510220420333, -15.289815768582855 ], [ -67.179072232397573, -15.165172214226288 ], [ -67.270513679262876, -15.036394544772406 ], [ -67.292708706341728, -15.015362236777833 ], [ -67.363892991568321, -15.012054945779141 ], [ -67.417558967172567, -14.968491713022161 ], [ -67.434250453595553, -14.896351414286357 ], [ -67.427506680389001, -14.754137871665478 ], [ -67.504116991006299, -14.668871759024455 ], [ -67.535975511360732, -14.598591810463688 ], [ -67.497838303994513, -14.551307874658676 ], [ -67.48794226762152, -14.511620374580616 ], [ -67.532383998622606, -14.443045750161275 ], [ -67.568169929398721, -14.330287773561906 ], [ -67.50360022616951, -14.258664238763629 ], [ -67.535975511360732, -13.998370049638083 ], [ -67.509207118713562, -13.87997934297232 ], [ -67.482722947805769, -13.836674492633733 ], [ -67.492644822600482, -13.771355483268962 ], [ -67.471664191449293, -13.710532321509447 ], [ -67.361076626085435, -13.573899834809538 ], [ -67.395596483191127, -13.402489108585485 ], [ -67.336659511827008, -13.304458917245256 ], [ -67.205943976033666, -13.167826429646027 ], [ -67.193179898233723, -13.129637545436367 ], [ -67.159073452277994, -13.107468356779236 ], [ -67.119928554559124, -13.03724008596123 ], [ -67.052258266805552, -13.015897718704764 ], [ -67.004095831857171, -12.901072685456086 ], [ -66.948569505178511, -12.670802504032338 ], [ -66.96665625738035, -12.581505629081505 ], [ -66.927666389292426, -12.525333347256151 ], [ -66.938285895177899, -12.420016777652165 ], [ -66.905238817317581, -12.34167530716968 ], [ -66.919294807209553, -12.288758639499633 ], [ -66.889348313873597, -12.223181247716411 ], [ -66.897228970440608, -12.152229505587229 ], [ -66.877436895896039, -12.064999688185083 ], [ -66.896970588022214, -11.965987644014547 ], [ -66.933066576261467, -11.911779066950373 ], [ -66.961333583877774, -11.910538831701729 ], [ -66.970609504425056, -11.848992200429734 ], [ -66.917615323288544, -11.841809176752122 ], [ -66.888366461942667, -11.818141370427895 ], [ -66.876842616693409, -11.795558769721424 ], [ -66.905290493261646, -11.735407402429701 ], [ -66.835604823903509, -11.727810967602068 ], [ -66.796769986345794, -11.685746351612863 ], [ -66.729022183327061, -11.674739272099714 ], [ -66.715276251797548, -11.655567315179439 ], [ -66.720857306819255, -11.583530369231141 ], [ -66.690833299117457, -11.537590019663696 ], [ -66.678999396405004, -11.449378349431299 ], [ -66.564794480780677, -11.434598890926054 ], [ -66.4970208402396, -11.442298678541192 ], [ -66.416715664096614, -11.400802504232217 ], [ -66.316876796726774, -11.385919692040147 ], [ -66.308918626693242, -11.344475192775917 ], [ -66.254632534363964, -11.33165943813259 ], [ -66.24316036595809, -11.31295256920572 ], [ -66.267758348269126, -11.277295830538151 ], [ -66.264115159586936, -11.253938083475759 ], [ -66.211534389600388, -11.174614760163081 ], [ -66.217838915033894, -11.097720228705612 ], [ -66.171175095953913, -11.100820815028612 ], [ -66.147223069688891, -11.080615330233286 ], [ -66.130609096732428, -10.981809990738498 ], [ -66.12153988265942, -10.968167412895809 ], [ -66.090353155873458, -10.969976088026044 ], [ -66.045342984091405, -10.867553399170049 ], [ -66.053275315703274, -10.851482028572775 ], [ -66.094849006176673, -10.858303317943751 ], [ -66.107923143238452, -10.840681654634636 ], [ -66.011675787707418, -10.789418634262574 ], [ -65.895042080227824, -10.811742851651275 ], [ -65.886722174988392, -10.764820651951538 ], [ -65.942429368820285, -10.719500420907707 ], [ -65.921784633554012, -10.682396741416483 ], [ -65.89806515218504, -10.679761243986206 ], [ -65.85623308019251, -10.723014417481409 ], [ -65.785746426056733, -10.701258639974242 ], [ -65.753112759346379, -10.666997166186263 ], [ -65.761432664585811, -10.564109388437544 ], [ -65.67391862724287, -10.57155079453355 ], [ -65.526253220809508, -10.486594740255043 ], [ -65.464241503342691, -10.406444593743004 ], [ -65.394646196065082, -10.392070070277555 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "BO-C", "NAME_1": "Cochabamba" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -66.989936490076957, -17.551279799023519 ], [ -66.841935186859359, -17.468080743031862 ], [ -66.870021328221696, -17.415370781836145 ], [ -66.850461798573122, -17.377491956888321 ], [ -66.885085007567056, -17.291502373835499 ], [ -66.897228970440608, -17.174972019143354 ], [ -66.948802049175242, -17.09647551813066 ], [ -67.010374517969638, -17.065056248247288 ], [ -67.012312385208418, -17.026247247312597 ], [ -66.977895880890173, -16.963873792841298 ], [ -66.970997077153356, -16.897159518596936 ], [ -66.932291429006227, -16.8351478002308 ], [ -66.798216926270129, -16.79525359457773 ], [ -66.758451910926965, -16.741148370301062 ], [ -66.765944993866356, -16.589529717722314 ], [ -66.816200323885823, -16.482972913768947 ], [ -66.799612189351024, -16.283295179928643 ], [ -66.834907192812693, -16.22944833717105 ], [ -66.870563930580943, -16.215237318547395 ], [ -66.872062547348662, -16.171105645009504 ], [ -66.949938930737062, -16.057830906271306 ], [ -66.944383714137075, -15.923833917001673 ], [ -66.918235440013518, -15.863992608072408 ], [ -66.934461839342418, -15.844717299263948 ], [ -66.784419317897175, -15.699299818431882 ], [ -66.50353207124806, -15.97194467510667 ], [ -66.460795660791121, -16.074212335231095 ], [ -66.239232958234425, -16.316936536991591 ], [ -66.069579230297222, -16.420082696259442 ], [ -65.886153734207483, -16.466333103290083 ], [ -65.804375779718441, -16.465712985665789 ], [ -65.45555986199804, -16.368871351831444 ], [ -65.359570888885401, -16.324171237512587 ], [ -65.330864630798089, -16.279109388887207 ], [ -65.2732454090484, -16.071886895264015 ], [ -65.193922084836345, -15.927141208899684 ], [ -65.163898078033867, -15.907142428780048 ], [ -64.684108242101672, -15.842908624133713 ], [ -64.657520718406431, -15.850453383017225 ], [ -64.664393683721528, -15.872467542942786 ], [ -64.703900315746978, -15.874741306066426 ], [ -64.67596920401553, -15.922490329864843 ], [ -64.703900315746978, -15.911586602239879 ], [ -64.730591193129044, -15.922490329864843 ], [ -64.688681606770729, -15.969929295300744 ], [ -64.689611781858218, -16.056590671022661 ], [ -64.661680671026147, -16.118033948607831 ], [ -64.677286952730697, -16.169090265203579 ], [ -64.67596920401553, -16.265156751782683 ], [ -64.699792039970646, -16.304689223129174 ], [ -64.67596920401553, -16.306084487109388 ], [ -64.696433072128571, -16.343963311157893 ], [ -64.684237434210218, -16.388353367114178 ], [ -64.723149787033037, -16.491086113433369 ], [ -64.779890509639301, -16.556146742178441 ], [ -64.778366055349181, -16.587255954598618 ], [ -64.751055060342765, -16.611182142441919 ], [ -64.807744107004908, -16.729624525951124 ], [ -64.782215948707062, -16.766263115650247 ], [ -64.741649950384897, -16.898399752946261 ], [ -64.647443813980829, -16.996016534035846 ], [ -64.591504076152205, -17.020252781140925 ], [ -64.503447434651378, -17.103141777870746 ], [ -64.375677456449466, -17.174610283937454 ], [ -64.238269823393637, -17.310932712274848 ], [ -64.212147385893161, -17.378732192136965 ], [ -64.224601406229908, -17.41599089856112 ], [ -64.339503953844371, -17.420693454439402 ], [ -64.396373866760541, -17.45629851716285 ], [ -64.405649787307823, -17.520377293077615 ], [ -64.564322272354957, -17.745686537104007 ], [ -64.689896002698333, -17.866971123618441 ], [ -64.710644089852849, -17.910741061950432 ], [ -64.641242642234147, -18.005257256717016 ], [ -64.589307827394293, -18.114914646094064 ], [ -64.488383755306074, -18.240333346806494 ], [ -64.441229010710288, -18.326116225183625 ], [ -64.445647345748398, -18.356398613505235 ], [ -64.420041673084711, -18.420942478312725 ], [ -64.302116055311672, -18.499594008057045 ], [ -64.29325354681373, -18.591009616500628 ], [ -64.340201585834507, -18.65694874348975 ], [ -64.369993048640254, -18.608941339071521 ], [ -64.391412930262504, -18.60180999043871 ], [ -64.493990647850126, -18.666250501559432 ], [ -64.57458004393385, -18.666715589552837 ], [ -64.685012579666818, -18.540108330435089 ], [ -64.771699794709775, -18.521194756832585 ], [ -64.816038173822676, -18.484659519021591 ], [ -64.910270147749088, -18.506725355790536 ], [ -65.001944138611123, -18.555921318613969 ], [ -65.066798061781128, -18.654778334052878 ], [ -65.157257656715501, -18.613643894050483 ], [ -65.231387498634149, -18.616279391480759 ], [ -65.250249396292588, -18.530238131584497 ], [ -65.293502569787734, -18.495356541071544 ], [ -65.305956590124538, -18.451844985157948 ], [ -65.336988288178929, -18.451896661102012 ], [ -65.350966762805854, -18.410245457162148 ], [ -65.436310390711924, -18.369266045891322 ], [ -65.510336879843123, -18.266688328303701 ], [ -65.595396287808398, -18.203694757107371 ], [ -65.642370165250895, -18.129073988773541 ], [ -65.843313971862301, -17.968308607756057 ], [ -65.94025895938347, -17.981331068873715 ], [ -66.018522914600794, -17.862165215852031 ], [ -66.175154182319659, -17.866816094886872 ], [ -66.346435716435167, -17.988617446238152 ], [ -66.534382901249899, -17.976938572257325 ], [ -66.624920009650737, -17.991252943668428 ], [ -66.68047217475106, -17.863973890982265 ], [ -66.808345505740476, -17.687912285723428 ], [ -66.989936490076957, -17.551279799023519 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/chile.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/chile.geojson new file mode 100644 index 000000000000..f07ed52bee54 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/chile.geojson @@ -0,0 +1,22 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "CL-AP", "NAME_1": "Arica y Parinacota" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.510088751999945, -17.506588197999946 ], [ -69.497122762999965, -17.621403909999884 ], [ -69.334238647999911, -17.805785420999968 ], [ -69.302405964999963, -17.976214293999888 ], [ -69.081721761999916, -18.039983011999908 ], [ -69.155438192999924, -18.140235289999936 ], [ -69.034386148999943, -18.478302510999896 ], [ -68.959842895999884, -18.907837015999903 ], [ -69.078336147894902, -19.049948011591482 ], [ -69.19298031309097, -19.102864679261529 ], [ -69.788292813362659, -18.98819467474442 ], [ -70.270334439282919, -19.171482028672699 ], [ -70.356597459999932, -18.773370049999926 ], [ -70.303561491999915, -18.445438941999953 ], [ -70.394702746778677, -18.337746206368088 ], [ -70.159067226999895, -18.325969708999963 ], [ -69.970344894999897, -18.250625470999907 ], [ -69.783095342999928, -17.981597962999913 ], [ -69.849835454999948, -17.691589825999912 ], [ -69.683902430999865, -17.656036439999951 ], [ -69.510088751999945, -17.506588197999946 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-TA", "NAME_1": "Tarapacá" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -68.9896085213162, -18.946490987269271 ], [ -68.908502359999943, -19.067930602999908 ], [ -68.447626098999905, -19.434626566999938 ], [ -68.70321773299986, -19.715539652999965 ], [ -68.553511107999981, -19.857856546999926 ], [ -68.579349324999896, -20.045441995999909 ], [ -68.792592121999945, -20.106626891999923 ], [ -68.726265421999926, -20.150965270999876 ], [ -68.678516398999932, -20.32862884499994 ], [ -68.757684692999959, -20.36428558399993 ], [ -68.75070837399997, -20.451825459999924 ], [ -68.480957397999873, -20.624734802999896 ], [ -68.572786417999907, -20.742867126999982 ], [ -68.531554425999872, -20.927688032999924 ], [ -68.557902798375437, -21.064140313124938 ], [ -68.690220302824684, -21.124446710047607 ], [ -68.794348314023466, -21.240873711952247 ], [ -69.449993048740168, -21.446339207288588 ], [ -69.742404140638541, -21.384172459291563 ], [ -69.913298102025749, -21.451300143786625 ], [ -70.061354116260617, -21.448341796045341 ], [ -70.080094470999938, -21.23332500999993 ], [ -70.171294725999928, -21.014580987999921 ], [ -70.12746248499991, -20.935275 ], [ -70.213844252999934, -20.811577406999959 ], [ -70.12328040299991, -19.999932549999926 ], [ -70.151193813999953, -19.719414971999925 ], [ -70.242544126999917, -19.598202934999904 ], [ -70.199574347999942, -19.534356377999927 ], [ -70.28774980399993, -19.300957940999922 ], [ -70.270334439282919, -19.171482028672699 ], [ -69.788292813362659, -18.98819467474442 ], [ -69.19298031309097, -19.102864679261529 ], [ -68.9896085213162, -18.946490987269271 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-AN", "NAME_1": "Antofagasta" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -68.531554425999872, -20.927688032999924 ], [ -68.416310180999915, -20.959804788999932 ], [ -68.207537394999889, -21.284332783999915 ], [ -68.198442341999908, -21.571860452999942 ], [ -68.107595173999925, -21.789624938999907 ], [ -68.096226359999946, -21.953955993999955 ], [ -67.960627400999982, -22.102887470999917 ], [ -67.951894083999917, -22.334087828999941 ], [ -67.859186564999931, -22.547304788999966 ], [ -67.876343139999904, -22.833592223999872 ], [ -67.616772420999951, -22.89725758799996 ], [ -67.193904174999972, -22.82222340899996 ], [ -67.013966837999874, -23.000713805999879 ], [ -67.339786742999905, -24.000601094999936 ], [ -68.244486043999927, -24.385383809999979 ], [ -68.326806599999884, -24.49824513699987 ], [ -68.397654988999932, -24.500518899999875 ], [ -68.451501831999877, -24.629296569999966 ], [ -68.503695027999953, -24.612346699999961 ], [ -68.578005737999945, -24.80871714299991 ], [ -68.473050903999933, -24.907935892999973 ], [ -68.36664912899991, -25.123426614999929 ], [ -68.493049682999953, -25.155879414999944 ], [ -68.554228469999913, -25.291191962999903 ], [ -68.68975521483128, -25.370854180675906 ], [ -69.005524054691364, -25.38501352245612 ], [ -68.9942585918605, -25.479581394066088 ], [ -69.079524706300163, -25.649545179466486 ], [ -69.441001349932321, -25.679879245530742 ], [ -69.568254564196764, -25.64804656269871 ], [ -69.711449957849254, -25.660810642297292 ], [ -69.883248256801608, -25.746696872562609 ], [ -70.147340664240232, -25.737136732973852 ], [ -70.271415777815889, -25.826226901450354 ], [ -70.398694831401315, -25.823074640082552 ], [ -70.634635707410524, -26.028631179974749 ], [ -70.739985094999952, -25.829322758999922 ], [ -70.634774733999905, -25.625502419999918 ], [ -70.646880662999934, -25.521661065999922 ], [ -70.538482225999928, -25.468194268999923 ], [ -70.444813605999911, -25.344903252999927 ], [ -70.437001105999911, -25.193454684999949 ], [ -70.500599738999938, -25.095472914999959 ], [ -70.472727016999897, -24.975274346999925 ], [ -70.57640540299991, -24.73170338299991 ], [ -70.582834438999953, -24.524834893999923 ], [ -70.506097837999903, -24.167380796999907 ], [ -70.498524542999917, -23.784600518999923 ], [ -70.390736456999946, -23.576918226999908 ], [ -70.413084759999947, -23.511252712999919 ], [ -70.49698299399995, -23.469472339999925 ], [ -70.539315015999932, -23.532273105999934 ], [ -70.631612254999936, -23.517038645999946 ], [ -70.585072394999941, -23.423597914999959 ], [ -70.600123425999925, -23.244225197999924 ], [ -70.562245245999918, -23.05982838299991 ], [ -70.50617428299995, -23.010023695999905 ], [ -70.48438615799995, -23.086034158999951 ], [ -70.425423188999901, -23.088530150999929 ], [ -70.291574673999946, -22.901950778999947 ], [ -70.312570766999897, -22.790622653999947 ], [ -70.240589972999942, -22.48756275799991 ], [ -70.192128058999913, -21.884372653999947 ], [ -70.150054490999935, -21.861993096999925 ], [ -70.150217251999948, -21.653497002999927 ], [ -70.082915818999936, -21.483330987999921 ], [ -69.742404140638541, -21.384172459291563 ], [ -69.449993048740168, -21.446339207288588 ], [ -68.794348314023466, -21.240873711952247 ], [ -68.690220302824684, -21.124446710047607 ], [ -68.557902798375437, -21.064140313124938 ], [ -68.531554425999872, -20.927688032999924 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-AT", "NAME_1": "Atacama" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -68.554228469999913, -25.291191962999903 ], [ -68.608236449999936, -25.492913105999918 ], [ -68.409023804999919, -26.144242857999885 ], [ -68.57516353399987, -26.303509623999958 ], [ -68.595317342999948, -26.457298685999945 ], [ -68.570150919999918, -26.5506263219999 ], [ -68.305360880999871, -26.897995300999895 ], [ -68.330475626999885, -27.04496307299992 ], [ -68.518009398999936, -27.076899108999982 ], [ -68.585860554999954, -27.162785338999925 ], [ -68.718617309999843, -27.106664733999892 ], [ -68.814322061999945, -27.120307311999895 ], [ -68.931446695999881, -27.395225931999889 ], [ -69.017410441999914, -27.460441588999913 ], [ -69.190190592999869, -27.951367695999892 ], [ -69.303232787999889, -27.999530130999887 ], [ -69.420305744999894, -28.212643737999983 ], [ -69.490508178999875, -28.198381041999909 ], [ -69.653030558999916, -28.397852070999903 ], [ -69.678403686999928, -28.573861998999931 ], [ -69.753386189999901, -28.67339080799988 ], [ -69.73276729299991, -28.794313658999926 ], [ -69.802788859999907, -28.939937845999893 ], [ -69.803925740999915, -29.098687845999933 ], [ -69.910947631999903, -29.143232930999929 ], [ -70.040655477999849, -29.297538757999959 ], [ -69.929352837999886, -29.717877115999968 ], [ -70.089153001709633, -29.746969495845576 ], [ -70.302163255030166, -29.675604342566373 ], [ -70.455978156366825, -29.510859876981726 ], [ -70.605323045821876, -29.091453953237362 ], [ -70.708133308305548, -29.070886733236136 ], [ -70.762832810885527, -29.151346938110692 ], [ -70.974706184442823, -29.206640719893301 ], [ -71.052375861356893, -29.385802910575876 ], [ -71.199317795579816, -29.335470066190624 ], [ -71.337345547159259, -29.192378024426262 ], [ -71.487120921937759, -29.211343169083875 ], [ -71.511219855999911, -28.889580987999921 ], [ -71.301869269999941, -28.674899997999944 ], [ -71.316232876999948, -28.572930596999925 ], [ -71.173939581999946, -28.36060963299991 ], [ -71.173085089999915, -28.092950127999927 ], [ -71.104725714999915, -27.838962497999944 ], [ -71.031605597999942, -27.657403252999927 ], [ -70.91242428299995, -27.621840101999908 ], [ -70.891672329999949, -27.493096612999921 ], [ -70.959950324999909, -27.16139088299991 ], [ -70.929269985999952, -27.10670338299991 ], [ -70.870838995999918, -27.117852471999925 ], [ -70.788644985999952, -26.996270440999922 ], [ -70.824208136999914, -26.873793226999908 ], [ -70.732466942999906, -26.749280592999924 ], [ -70.699289516999897, -26.392998955999929 ], [ -70.629954372999919, -26.340976922999914 ], [ -70.681443437999917, -26.304495915999951 ], [ -70.634635707410524, -26.028631179974749 ], [ -70.398694831401315, -25.823074640082552 ], [ -70.271415777815889, -25.826226901450354 ], [ -70.147340664240232, -25.737136732973852 ], [ -69.883248256801608, -25.746696872562609 ], [ -69.711449957849254, -25.660810642297292 ], [ -69.568254564196764, -25.64804656269871 ], [ -69.441001349932321, -25.679879245530742 ], [ -69.079524706300163, -25.649545179466486 ], [ -68.9942585918605, -25.479581394066088 ], [ -69.005524054691364, -25.38501352245612 ], [ -68.716678636210077, -25.379432467434413 ], [ -68.554228469999913, -25.291191962999903 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-CO", "NAME_1": "Coquimbo" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.929352837999886, -29.717877115999968 ], [ -69.922187256999877, -29.939566751999905 ], [ -69.980374918999871, -30.07247853599992 ], [ -69.849736898999879, -30.126635436999933 ], [ -69.848961750999962, -30.199085794999917 ], [ -69.964587768999877, -30.374785664999948 ], [ -70.173412231999919, -30.364657084999905 ], [ -70.143930826999906, -30.439587910999961 ], [ -70.21710465599989, -30.51513885499989 ], [ -70.339216064999874, -30.938162129999924 ], [ -70.266559000999933, -31.036450703999932 ], [ -70.339784505999916, -31.041721699999954 ], [ -70.408643350999938, -31.150035501999895 ], [ -70.479801798999887, -31.096705423999907 ], [ -70.568969482999904, -31.304237975999897 ], [ -70.589769246999936, -31.567684427999964 ], [ -70.475228433999916, -31.82007212399995 ], [ -70.244467326999938, -31.942235208999932 ], [ -70.284697428999948, -32.046776631999947 ], [ -70.387481852999883, -32.041712340999965 ], [ -70.330823609022332, -32.209588118696729 ], [ -70.444454312016887, -32.21405404945483 ], [ -70.721233282889671, -32.030499363055185 ], [ -70.959875047295611, -31.97391367007981 ], [ -71.045425380776692, -32.030654391786754 ], [ -71.180972662758165, -31.997116387511255 ], [ -71.338999192658605, -32.079230238784476 ], [ -71.448372362094801, -32.043160088966943 ], [ -71.543839657530185, -32.193026502100871 ], [ -71.501128709999932, -31.889825127999927 ], [ -71.666167772999927, -31.169854424999926 ], [ -71.703480597999942, -30.508558851999908 ], [ -71.637766079999949, -30.24146900799991 ], [ -71.542144334999932, -30.285332940999922 ], [ -71.445912238999938, -30.162367445999905 ], [ -71.398793097999942, -30.176690362999921 ], [ -71.412464972999942, -29.991794528999947 ], [ -71.297759568999936, -29.933851820999905 ], [ -71.282582160999937, -29.88014088299991 ], [ -71.335926886999914, -29.728122653999947 ], [ -71.288075324999909, -29.603122653999947 ], [ -71.336048956999946, -29.524997653999947 ], [ -71.30882727799991, -29.408868096999925 ], [ -71.360910610999952, -29.295586846999925 ], [ -71.487120921937759, -29.211343169083875 ], [ -71.337345547159259, -29.192378024426262 ], [ -71.199317795579816, -29.335470066190624 ], [ -71.052375861356893, -29.385802910575876 ], [ -70.974706184442823, -29.206640719893301 ], [ -70.762832810885527, -29.151346938110692 ], [ -70.708133308305548, -29.070886733236136 ], [ -70.605323045821876, -29.091453953237362 ], [ -70.455978156366825, -29.510859876981726 ], [ -70.302163255030166, -29.675604342566373 ], [ -70.089153001709633, -29.746969495845576 ], [ -69.929352837999886, -29.717877115999968 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-RM", "NAME_1": "Región Metropolitana de Santiago" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.10610066299995, -33.052592520999909 ], [ -70.10946264699993, -33.169602151999925 ], [ -70.010011352999925, -33.299103291999913 ], [ -69.869684000999911, -33.249597269999953 ], [ -69.787673502999922, -33.379408466999934 ], [ -69.878830728999873, -33.558002216999867 ], [ -69.860046345999876, -33.7263640339999 ], [ -69.91425492399992, -33.771942647999893 ], [ -69.832761189999957, -34.243231709999932 ], [ -70.04817621499987, -34.283461794999965 ], [ -70.188759325082799, -34.081536960762151 ], [ -70.313997157742619, -34.060039564774115 ], [ -70.437581345802471, -33.9001526829 ], [ -70.811563686614818, -33.957565199973999 ], [ -70.815000169722055, -34.027380059642041 ], [ -70.949126350200913, -34.151041762067678 ], [ -71.066845262398942, -34.185768324748381 ], [ -71.712077195905863, -33.981439710973859 ], [ -71.400675015139825, -33.797109876419654 ], [ -71.366723598815042, -33.512682793875854 ], [ -71.451188726678367, -33.433307793719678 ], [ -71.44431576226259, -33.336879571035354 ], [ -71.053357713287824, -33.044442640715317 ], [ -70.79812781434714, -32.9604167615243 ], [ -70.676507331048469, -33.013281751451643 ], [ -70.61622677344684, -32.973645929116344 ], [ -70.302008226298597, -33.171359959094843 ], [ -70.10610066299995, -33.052592520999909 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-VS", "NAME_1": "Valparaíso" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -70.256119043999973, -32.314277880999953 ], [ -70.13772965499993, -32.56901865599994 ], [ -70.181086181999916, -32.607569274999918 ], [ -70.155738891999931, -32.738414001999956 ], [ -70.000218668999963, -32.876596780999918 ], [ -70.04248998999995, -32.992662047999943 ], [ -70.302008226298597, -33.171359959094843 ], [ -70.61622677344684, -32.973645929116344 ], [ -70.676507331048469, -33.013281751451643 ], [ -70.79812781434714, -32.9604167615243 ], [ -71.053357713287824, -33.044442640715317 ], [ -71.44431576226259, -33.336879571035354 ], [ -71.451188726678367, -33.433307793719678 ], [ -71.366723598815042, -33.512682793875854 ], [ -71.400675015139825, -33.797109876419654 ], [ -71.717942470868309, -33.971156100973303 ], [ -71.871253985532391, -33.93280402130739 ], [ -71.808094855999911, -33.776950778999947 ], [ -71.671864386999914, -33.69850025799991 ], [ -71.624663865999935, -33.541436455999929 ], [ -71.705922003999945, -33.434340101999908 ], [ -71.671864386999914, -33.325778903999947 ], [ -71.761870897999927, -33.101983330999929 ], [ -71.572865363999938, -33.010186455999929 ], [ -71.518299933999913, -32.873142184999949 ], [ -71.548695441999939, -32.78484465899993 ], [ -71.454172329999949, -32.685642184999949 ], [ -71.476714647999927, -32.535251559999949 ], [ -71.407948370999918, -32.386325778999947 ], [ -71.543853318999936, -32.193291924999926 ], [ -71.448372362094801, -32.043160088966943 ], [ -71.338999192658605, -32.079230238784476 ], [ -71.180972662758165, -31.997116387511255 ], [ -71.045425380776692, -32.030654391786754 ], [ -70.959875047295611, -31.97391367007981 ], [ -70.771902024958479, -32.012309258965104 ], [ -70.444454312016887, -32.21405404945483 ], [ -70.330823609022332, -32.209588118696729 ], [ -70.321801107999931, -32.280147399999947 ], [ -70.256119043999973, -32.314277880999953 ] ] ], [ [ [ -80.759348110999952, -33.766778252999927 ], [ -80.777333136999914, -33.734470309999949 ], [ -80.740834113999938, -33.685153903999947 ], [ -80.704701300999943, -33.766778252999927 ], [ -80.759348110999952, -33.766778252999927 ] ] ], [ [ [ -78.788970506999931, -33.60906340899993 ], [ -78.757639126999948, -33.643243096999925 ], [ -78.991688605999911, -33.656914971999925 ], [ -78.884877081999946, -33.575616143999923 ], [ -78.788970506999931, -33.60906340899993 ] ] ], [ [ [ -109.231597459999932, -27.092461846999925 ], [ -109.243560350999928, -27.129164320999905 ], [ -109.451324022999927, -27.195489190999922 ], [ -109.379628058999913, -27.059502862999921 ], [ -109.231597459999932, -27.092461846999925 ] ] ], [ [ [ -105.459543423999946, -26.464776299999926 ], [ -105.47093665299991, -26.457696221999925 ], [ -105.463490363999938, -26.456963799999926 ], [ -105.459543423999946, -26.464776299999926 ] ] ], [ [ [ -79.901763475999928, -26.347426039999903 ], [ -79.890736456999946, -26.351739190999922 ], [ -79.890207485999952, -26.356052341999941 ], [ -79.909413214999915, -26.358168226999908 ], [ -79.901763475999928, -26.347426039999903 ] ] ], [ [ [ -80.095692511999914, -26.266045830999929 ], [ -80.090443488999938, -26.274509372999944 ], [ -80.107777472999942, -26.274997653999947 ], [ -80.095692511999914, -26.266045830999929 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-ML", "NAME_1": "Maule" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.372446571999944, -35.027388544999923 ], [ -70.38662919099994, -35.166689553999859 ], [ -70.578891357999908, -35.259707132999921 ], [ -70.428383748999892, -35.357065530999961 ], [ -70.471766113999877, -35.37938974999993 ], [ -70.361566121999942, -35.78308603999993 ], [ -70.420244710999981, -35.8683521519999 ], [ -70.38032466699994, -36.046015726999954 ], [ -70.451483113999871, -36.152262471999933 ], [ -70.581423502999883, -36.143167418999951 ], [ -70.710511230999941, -36.265847269999895 ], [ -70.71865026899988, -36.414572041999904 ], [ -70.907786010999956, -36.40516693099994 ], [ -70.971037963999947, -36.485472106999879 ], [ -71.108754848757258, -36.401912123245893 ], [ -71.414723088123154, -36.426077007963855 ], [ -72.050609503625708, -36.124047946755354 ], [ -72.190402738456243, -36.195604514567279 ], [ -72.38304015761193, -36.187401449057717 ], [ -72.496060349605443, -36.059865818053083 ], [ -72.698218553043773, -36.012685235035576 ], [ -72.799135160834751, -36.053102038421557 ], [ -72.793324347999942, -35.967461846999925 ], [ -72.583566860999952, -35.770603122999944 ], [ -72.646595831999946, -35.566582940999922 ], [ -72.529652472999942, -35.490411065999922 ], [ -72.398060675999943, -35.233493747999944 ], [ -72.230580206999946, -35.116143487999921 ], [ -72.18781490799995, -34.885511976999908 ], [ -72.103016730999911, -34.760918877999927 ], [ -71.736804369426068, -34.951044609521091 ], [ -71.417960781664704, -34.925309746547555 ], [ -71.325718350021816, -34.845159600934835 ], [ -71.170534024025983, -34.818391209186927 ], [ -70.95695532902522, -34.915439547696963 ], [ -70.785131191651146, -34.919883722056113 ], [ -70.649248012885494, -35.013986504773357 ], [ -70.372446571999944, -35.027388544999923 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-LI", "NAME_1": "Libertador General Bernardo O'Higgins" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.04817621499987, -34.283461794999965 ], [ -70.067578898999869, -34.414590759999982 ], [ -70.316297566999935, -34.745629983999933 ], [ -70.276713419999879, -34.798236592999928 ], [ -70.372446571999944, -35.027388544999923 ], [ -70.649248012885494, -35.013986504773357 ], [ -70.785131191651146, -34.919883722056113 ], [ -70.95695532902522, -34.915439547696963 ], [ -71.170534024025983, -34.818391209186927 ], [ -71.325718350021816, -34.845159600934835 ], [ -71.417960781664704, -34.925309746547555 ], [ -71.736804369426068, -34.951044609521091 ], [ -72.103016730999911, -34.760918877999927 ], [ -72.057240363999938, -34.658786716999941 ], [ -72.055490688999953, -34.428155205999929 ], [ -71.989084438999953, -34.355238539999903 ], [ -72.026844855999911, -34.162692966999941 ], [ -71.871253985532391, -33.93280402130739 ], [ -71.066845262398942, -34.185768324748381 ], [ -70.949126350200913, -34.151041762067678 ], [ -70.815000169722055, -34.027380059642041 ], [ -70.811563686614818, -33.957565199973999 ], [ -70.437581345802471, -33.9001526829 ], [ -70.313997157742619, -34.060039564774115 ], [ -70.188759325082799, -34.081536960762151 ], [ -70.04817621499987, -34.283461794999965 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-NB", "NAME_1": "Ñuble" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.027819303999934, -36.481168389999937 ], [ -71.057440958999905, -36.687630309999903 ], [ -71.145342569999912, -36.688250426999957 ], [ -71.196863973999911, -36.848240661999938 ], [ -71.135679077999981, -36.951490173999986 ], [ -71.207147583999898, -36.972367451999958 ], [ -71.089118611999936, -37.103418884999968 ], [ -71.257224486867983, -37.104549661739036 ], [ -71.451313946871565, -37.036579979880294 ], [ -71.572324374856237, -37.13094363717142 ], [ -72.203955119703437, -37.198294008409931 ], [ -72.268925914689063, -37.154626315306011 ], [ -72.187237227153787, -37.053143363119943 ], [ -72.21278575311031, -37.019094912370321 ], [ -72.385944239307804, -36.924838597873659 ], [ -72.654597449781946, -36.915770531963773 ], [ -72.556317032128902, -36.871810455610031 ], [ -72.600239533150457, -36.724008440769524 ], [ -72.798250177494268, -36.605965154944123 ], [ -72.812602241784518, -36.462806388067506 ], [ -72.895863410999937, -36.438083591999941 ], [ -72.826161261999914, -36.287041924999926 ], [ -72.819081183999913, -36.081149997999944 ], [ -72.698218553043773, -36.012685235035576 ], [ -72.496060349605443, -36.059865818053083 ], [ -72.38304015761193, -36.187401449057717 ], [ -72.190402738456243, -36.195604514567279 ], [ -72.050609503625708, -36.124047946755354 ], [ -71.414723088123154, -36.426077007963855 ], [ -71.108754848757258, -36.401912123245893 ], [ -71.027819303999934, -36.481168389999937 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-AR", "NAME_1": "La Araucanía" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -71.016142412999869, -38.143697093999947 ], [ -70.97375097699998, -38.424681904999957 ], [ -70.83430212499988, -38.564414977999931 ], [ -70.87383459499992, -38.691435648999942 ], [ -71.399900674999884, -38.910543720999968 ], [ -71.412044636999951, -39.317960713999881 ], [ -71.541959187999879, -39.532314554999914 ], [ -71.495657104999879, -39.565594176999952 ], [ -71.519996703999908, -39.614996845999968 ], [ -71.632392944999935, -39.607555439999956 ], [ -71.680916306642246, -39.495986829428659 ], [ -71.770213181593022, -39.455369155162373 ], [ -71.992034268366751, -39.729719334179947 ], [ -72.373845588003462, -39.733026625178582 ], [ -72.54533382769398, -39.623214207070021 ], [ -72.966186693161376, -39.589159437957676 ], [ -72.956936611935078, -39.37976653399835 ], [ -73.246694477929154, -39.385850630523741 ], [ -73.209828253999945, -39.193780205999929 ], [ -73.245432094999899, -39.221286716999941 ], [ -73.433420376999948, -38.686944268999923 ], [ -73.445057745999918, -38.76140715899993 ], [ -73.520659959999932, -38.521579684999949 ], [ -73.525135870999918, -38.475681247999944 ], [ -73.364172736182809, -38.425354506005647 ], [ -73.270457526193866, -38.476824232852039 ], [ -73.280818650560263, -38.331665133539104 ], [ -73.091372849877132, -38.137826837138846 ], [ -73.166562058991815, -38.025017184595413 ], [ -73.059152595216062, -37.811335137706465 ], [ -73.111940069878301, -37.722038262755632 ], [ -73.071554937810106, -37.649277845496158 ], [ -72.505646327615921, -37.679508558772966 ], [ -72.377204555845537, -37.853554782427238 ], [ -72.089160122141891, -38.01649057378097 ], [ -71.720629645142026, -38.057056573002455 ], [ -71.745563524237241, -38.102273451258782 ], [ -71.655078090881204, -38.246140638479687 ], [ -71.312928432900833, -38.063051039174127 ], [ -71.016142412999869, -38.143697093999947 ] ] ], [ [ [ -73.882435675999943, -38.360772393999923 ], [ -73.912098761999914, -38.409926039999903 ], [ -73.95343990799995, -38.313571872999944 ], [ -73.930775519999941, -38.323825778999947 ], [ -73.882435675999943, -38.360772393999923 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-BI", "NAME_1": "Bío-Bío" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -71.089118611999936, -37.103418884999968 ], [ -71.205597289999872, -37.292657978999983 ], [ -71.117695678999979, -37.466497497999924 ], [ -71.127927611999951, -37.584423115999954 ], [ -71.192264770999941, -37.660904235999936 ], [ -71.007418171999916, -38.071008402999965 ], [ -71.016142412999869, -38.143697093999947 ], [ -71.312928432900833, -38.063051039174127 ], [ -71.655078090881204, -38.246140638479687 ], [ -71.745563524237241, -38.102273451258782 ], [ -71.720629645142026, -38.057056573002455 ], [ -72.089160122141891, -38.01649057378097 ], [ -72.377204555845537, -37.853554782427238 ], [ -72.505646327615921, -37.679508558772966 ], [ -73.061090460656203, -37.647159112003408 ], [ -73.111940069878301, -37.722038262755632 ], [ -73.059152595216062, -37.811335137706465 ], [ -73.166562058991815, -38.025017184595413 ], [ -73.091372849877132, -38.137826837138846 ], [ -73.280818650560263, -38.331665133539104 ], [ -73.270457526193866, -38.476824232852039 ], [ -73.364172736182809, -38.425354506005647 ], [ -73.524768911556009, -38.478105612983654 ], [ -73.462961391999897, -38.051202080999929 ], [ -73.668080206999946, -37.719414971999925 ], [ -73.685129360999952, -37.598402601999908 ], [ -73.59788977799991, -37.49187590899993 ], [ -73.680409308999913, -37.347832940999922 ], [ -73.644642706999946, -37.201429945999905 ], [ -73.594471808999913, -37.152439059999949 ], [ -73.460682745999918, -37.241957289999903 ], [ -73.23696855399993, -37.191501559999949 ], [ -73.173329230999911, -37.076348565999922 ], [ -73.145375128999945, -36.833916924999926 ], [ -73.207427537999934, -36.775323174999926 ], [ -73.131703253999945, -36.736423434999949 ], [ -73.118641730999911, -36.597100518999923 ], [ -73.070220506999931, -36.713799737999921 ], [ -72.988026495999918, -36.702569268999923 ], [ -72.986195441999939, -36.521416924999926 ], [ -72.932240363999938, -36.523614190999922 ], [ -72.895863410999937, -36.438083591999941 ], [ -72.812602241784518, -36.462806388067506 ], [ -72.798250177494268, -36.605965154944123 ], [ -72.600239533150457, -36.724008440769524 ], [ -72.556317032128902, -36.871810455610031 ], [ -72.654597449781946, -36.915770531963773 ], [ -72.385944239307804, -36.924838597873659 ], [ -72.191888626439834, -37.033175127816605 ], [ -72.259358093345199, -37.098049955915727 ], [ -72.241708181749033, -37.190968392267031 ], [ -71.572324374856237, -37.13094363717142 ], [ -71.451313946871565, -37.036579979880294 ], [ -71.257224486867983, -37.104549661739036 ], [ -71.089118611999936, -37.103418884999968 ] ] ], [ [ [ -73.540830256999925, -36.989441495999927 ], [ -73.523095958999932, -36.975265374999935 ], [ -73.446493783999927, -37.059169519999955 ], [ -73.518884494999952, -37.079921528999932 ], [ -73.540830256999925, -36.989441495999927 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-LR", "NAME_1": "Los Ríos" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.641098842999952, -39.599999000999915 ], [ -71.705411743999974, -39.583577574999936 ], [ -71.714351766999897, -39.726307881999929 ], [ -71.61663163299994, -39.909862568999898 ], [ -71.683707641999973, -40.098998311999893 ], [ -71.814035603999884, -40.092900492999931 ], [ -71.823750773999933, -40.210102640999963 ], [ -71.742670450999896, -40.296505635999949 ], [ -71.68670487499989, -40.288547464999894 ], [ -71.678488321999879, -40.34022389699993 ], [ -71.729286255999881, -40.421355895999881 ], [ -71.796413940999912, -40.414534606999922 ], [ -71.892634649669333, -40.593490899185667 ], [ -72.011438768384437, -40.65131682651031 ], [ -72.634346482704018, -40.652918796964912 ], [ -72.88626908974669, -40.522280775537354 ], [ -72.992877569644122, -40.353040459649492 ], [ -73.748646613999938, -40.273044528999947 ], [ -73.73501542899993, -40.174737237999921 ], [ -73.659982876999948, -40.109551690999922 ], [ -73.71117102799991, -39.968682549999926 ], [ -73.458404100999928, -39.833754164999903 ], [ -73.378773566999939, -39.900485934999949 ], [ -73.406076626999948, -39.694919528999947 ], [ -73.241566535999937, -39.48951588299991 ], [ -73.24645382398478, -39.385761000170021 ], [ -72.956936611935078, -39.37976653399835 ], [ -72.966186693161376, -39.589159437957676 ], [ -72.54533382769398, -39.623214207070021 ], [ -72.373845588003462, -39.733026625178582 ], [ -71.992034268366751, -39.729719334179947 ], [ -71.770213181593022, -39.455369155162373 ], [ -71.680916306642246, -39.495986829428659 ], [ -71.641098842999952, -39.599999000999915 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-LL", "NAME_1": "Los Lagos" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -71.769259569273686, -41.999606621748171 ], [ -71.749440063999941, -42.10435394299995 ], [ -71.923796346999922, -42.176907653999962 ], [ -72.009837605999905, -42.124714456999897 ], [ -72.12471431599991, -42.263310648999948 ], [ -72.039189819999962, -42.481230163999953 ], [ -72.143214477999919, -42.557091165999879 ], [ -72.112673705999924, -42.863842467999916 ], [ -72.148537150999886, -42.99871795599995 ], [ -72.054434366999914, -43.105378112999944 ], [ -71.750163533999938, -43.172454121999877 ], [ -71.750680297999878, -43.295340677999945 ], [ -71.901730509999908, -43.322005716999897 ], [ -71.955112264999912, -43.443548685999929 ], [ -71.868812621999979, -43.462565612999896 ], [ -71.873825235999931, -43.538943379999935 ], [ -71.714300089999881, -43.602195332999926 ], [ -71.709184122999915, -43.684360859999956 ], [ -71.819203246999905, -43.758051452999965 ], [ -71.755021118999963, -43.771383971999896 ], [ -71.669599975999944, -43.959796243999889 ], [ -71.745259914013786, -44.044998116469912 ], [ -71.796413132560019, -44.000001315808049 ], [ -72.107660284594431, -43.954526056032648 ], [ -72.348188239395711, -43.733040866942474 ], [ -72.561663580709649, -43.777327569211934 ], [ -72.768317633551931, -43.725651136790532 ], [ -72.825445929785815, -43.636457614627204 ], [ -72.875727098227003, -43.695885511507129 ], [ -73.045887824999909, -43.728448174999926 ], [ -72.973011847999942, -43.621351820999905 ], [ -72.905832485999952, -43.607679945999905 ], [ -73.02603105399993, -43.586683851999908 ], [ -73.111317511999914, -43.461032809999949 ], [ -73.084584113999938, -43.316338799999926 ], [ -72.912180141999897, -43.235446872999944 ], [ -72.934437628999945, -43.098239841999941 ], [ -72.864857550999943, -43.018731377999927 ], [ -72.734486456999946, -43.079685153999947 ], [ -72.747141079999949, -42.909763278999947 ], [ -72.842193162999934, -42.838067315999922 ], [ -72.864857550999943, -42.75123463299991 ], [ -72.823841925999943, -42.66529713299991 ], [ -72.856800910999937, -42.55592213299991 ], [ -72.753570115999935, -42.49187590899993 ], [ -72.539418097999942, -42.55828215899993 ], [ -72.678456183999913, -42.478448174999926 ], [ -72.843739386999914, -42.278252862999921 ], [ -72.594553188999953, -42.182061455999929 ], [ -72.456166144999941, -42.440850518999923 ], [ -72.419789191999939, -42.439629815999922 ], [ -72.481312628999945, -42.288506768999923 ], [ -72.41234290299991, -42.237399997999944 ], [ -72.481312628999945, -42.199151299999926 ], [ -72.42601477799991, -42.147230726999908 ], [ -72.488026495999918, -42.127536716999941 ], [ -72.464344855999911, -41.976169528999947 ], [ -72.517201300999943, -41.950941664999903 ], [ -72.580555792999917, -42.031182549999926 ], [ -72.737294074999909, -42.013929945999905 ], [ -72.888579881999931, -41.910821221999925 ], [ -72.645130988999938, -41.722832940999922 ], [ -72.494943813999953, -41.716566664999903 ], [ -72.303089972999942, -41.648207289999903 ], [ -72.343413865999935, -41.61296965899993 ], [ -72.303089972999942, -41.380791924999926 ], [ -72.339222785999937, -41.371514580999929 ], [ -72.416086391999897, -41.658298434999949 ], [ -72.58429928299995, -41.709730726999908 ], [ -72.669667120999918, -41.682386976999908 ], [ -72.758859829999949, -41.543877862999921 ], [ -72.947377081999946, -41.483168226999908 ], [ -73.104115363999938, -41.576592705999929 ], [ -73.059193488999938, -41.697442315999922 ], [ -73.20140540299991, -41.784763278999947 ], [ -73.494862433999913, -41.80592213299991 ], [ -73.759946025999909, -41.748841348999917 ], [ -73.696631787999934, -41.637124513999936 ], [ -73.554758266999897, -41.608493747999944 ], [ -73.494862433999913, -41.510430596999925 ], [ -73.615223761999914, -41.599867445999905 ], [ -73.798166469999899, -41.56568775799991 ], [ -73.931684519999919, -41.094883543999913 ], [ -73.946904237999945, -40.972840597999948 ], [ -73.854640368999924, -40.916162739999947 ], [ -73.893229782999924, -40.863782443999924 ], [ -73.808885281999949, -40.70598594799992 ], [ -73.841495232999932, -40.666706764999901 ], [ -73.728497657999924, -40.544180162999908 ], [ -73.782826300999943, -40.424574476999908 ], [ -73.748646613999938, -40.273044528999947 ], [ -72.992877569644122, -40.353040459649492 ], [ -72.88626908974669, -40.522280775537354 ], [ -72.526652798088151, -40.672555840979271 ], [ -72.011438768384437, -40.65131682651031 ], [ -71.860596069999929, -40.559435322999988 ], [ -71.853102986999914, -40.616382751999964 ], [ -71.955577352999853, -40.72035573299992 ], [ -71.851449340999949, -40.938326924999942 ], [ -71.903952595999925, -41.367654723999891 ], [ -71.853258015999955, -41.567332458999942 ], [ -71.925915079999896, -41.653011983999917 ], [ -71.794036824999949, -41.86746917699989 ], [ -71.769259569273686, -41.999606621748171 ] ] ], [ [ [ -73.611480272999927, -42.936211846999925 ], [ -73.552805141999897, -42.918633721999925 ], [ -73.365101691999939, -42.990817966999941 ], [ -73.450062628999945, -42.993747653999947 ], [ -73.611480272999927, -42.936211846999925 ] ] ], [ [ [ -73.604725714999915, -42.579278252999927 ], [ -73.616769985999952, -42.638767184999949 ], [ -73.755034959999932, -42.598809502999927 ], [ -73.620961066999939, -42.56804778399993 ], [ -73.604725714999915, -42.579278252999927 ] ] ], [ [ [ -73.41234290299991, -42.525648695999905 ], [ -73.419422980999911, -42.564222914999903 ], [ -73.612660285999937, -42.451836846999925 ], [ -73.646311001999948, -42.373793226999908 ], [ -73.54320227799991, -42.379164320999905 ], [ -73.41234290299991, -42.525648695999905 ] ] ], [ [ [ -73.087635870999918, -42.247491143999923 ], [ -73.073231574999909, -42.288995049999926 ], [ -73.141590949999909, -42.31373463299991 ], [ -73.193918423999946, -42.249118747999944 ], [ -73.087635870999918, -42.247491143999923 ] ] ], [ [ [ -72.542713995999918, -42.141045830999929 ], [ -72.617787238999938, -42.103610934999949 ], [ -72.559722459999932, -42.051690362999921 ], [ -72.509266730999911, -42.073337497999944 ], [ -72.50804602799991, -42.138929945999905 ], [ -72.542713995999918, -42.141045830999929 ] ] ], [ [ [ -74.33462480399993, -43.281670830999929 ], [ -74.407215949999909, -43.237888278999947 ], [ -74.311714246999941, -43.137515868999913 ], [ -74.317849796999951, -43.072118534999902 ], [ -74.229519769999911, -43.022876985999915 ], [ -74.255649993999953, -42.990917052999919 ], [ -74.167362736999905, -42.882514078999918 ], [ -74.131390855999939, -42.692981927999938 ], [ -74.189617663999911, -42.431906016999903 ], [ -74.159503479999898, -42.241297913999915 ], [ -74.053335515999947, -42.130345173999956 ], [ -74.055287238999938, -41.94500090899993 ], [ -74.008778449999909, -41.887872002999927 ], [ -74.064035610999952, -41.80592213299991 ], [ -73.917062954999949, -41.782647393999923 ], [ -73.896107550999943, -41.842705987999921 ], [ -74.00617428299995, -41.845147393999923 ], [ -73.866037563999953, -41.89226653399993 ], [ -73.825835740999935, -41.856866143999923 ], [ -73.76984615799995, -41.901543877999927 ], [ -73.777414516999897, -41.858086846999925 ], [ -73.690988735999952, -41.809014580999929 ], [ -73.564930792999917, -41.804945570999905 ], [ -73.502308722999942, -41.846856377999927 ], [ -73.57843990799995, -41.945489190999922 ], [ -73.456450975999928, -42.044366143999923 ], [ -73.502308722999942, -42.116631768999923 ], [ -73.386219855999911, -42.195733330999929 ], [ -73.378773566999939, -42.278252862999921 ], [ -73.666167772999927, -42.354099216999941 ], [ -73.688547329999949, -42.452732028999947 ], [ -73.611480272999927, -42.511651299999926 ], [ -73.753732876999948, -42.533623955999929 ], [ -73.789662238999938, -42.504164320999905 ], [ -73.762318488999938, -42.457126559999949 ], [ -73.82445227799991, -42.514418226999908 ], [ -73.809152798999946, -42.60865650799991 ], [ -73.491932745999918, -42.818617445999905 ], [ -73.509510870999918, -42.877699476999908 ], [ -73.70767167899993, -42.867364190999922 ], [ -73.577381964999915, -42.965752862999921 ], [ -73.522775844999899, -43.052911065999922 ], [ -73.611740700999917, -43.049549053999954 ], [ -73.502308722999942, -43.128024997999944 ], [ -73.775746222999942, -43.118096612999921 ], [ -73.744984503999945, -43.226983330999929 ], [ -73.666047110999898, -43.294407384999943 ], [ -73.731543404999911, -43.316730932999917 ], [ -73.66901449799991, -43.363847189999944 ], [ -73.731109191999906, -43.392640296999957 ], [ -73.799976153999921, -43.359775889999923 ], [ -73.847490657999913, -43.423483242999907 ], [ -73.929529614999922, -43.364898904999905 ], [ -74.053378751999901, -43.362935892999928 ], [ -74.084948394999913, -43.401628082999935 ], [ -74.33462480399993, -43.281670830999929 ] ] ], [ [ [ -73.087635870999918, -41.84343840899993 ], [ -73.085804816999939, -41.747816664999903 ], [ -73.066883917999917, -41.736993096999925 ], [ -73.003000454999949, -41.844333591999941 ], [ -73.087635870999918, -41.84343840899993 ] ] ], [ [ [ -74.253361380999934, -43.350392082999917 ], [ -74.230726440999945, -43.413369569999929 ], [ -74.257307307999952, -43.427452099999925 ], [ -74.284026069999925, -43.417837554999949 ], [ -74.253361380999934, -43.350392082999917 ] ] ], [ [ [ -73.691091608999898, -43.188156497999955 ], [ -73.6564222209999, -43.196000224999921 ], [ -73.661238284999911, -43.24479598399995 ], [ -73.718523942999923, -43.215980905999913 ], [ -73.691091608999898, -43.188156497999955 ] ] ], [ [ [ -73.009191783999938, -42.695259426999939 ], [ -72.93044389399995, -42.723340169999915 ], [ -72.918815191999897, -42.786532358999921 ], [ -72.956524680999905, -42.807804137999938 ], [ -73.03361629099993, -42.713886268999943 ], [ -73.009191783999938, -42.695259426999939 ] ] ], [ [ [ -73.307340928999906, -42.627343397999937 ], [ -73.241038163999917, -42.631371442999921 ], [ -73.238950666999926, -42.65082611999992 ], [ -73.356926876999921, -42.629037360999916 ], [ -73.307340928999906, -42.627343397999937 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-AI", "NAME_1": "Aisén del General Carlos Ibáñez del Campo" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -71.745259914013786, -44.044998116469912 ], [ -71.858735717999934, -44.107797546999905 ], [ -71.804010376999969, -44.314813334999954 ], [ -71.860596069999929, -44.377135110999888 ], [ -71.209783080999898, -44.427571308999887 ], [ -71.122656616999933, -44.53030405699991 ], [ -71.234897826999941, -44.638824563999975 ], [ -71.238153442999931, -44.747861836999917 ], [ -71.297839721999935, -44.795610859999982 ], [ -71.497104044999872, -44.742900899999967 ], [ -72.088747518999924, -44.782795104999906 ], [ -72.073502970999897, -44.902167663999933 ], [ -71.588726358999878, -44.978132018999887 ], [ -71.317166706999899, -45.267209980999922 ], [ -71.389358683999916, -45.370769550999867 ], [ -71.508317830999914, -45.408389993999975 ], [ -71.48909419799989, -45.498513691999875 ], [ -71.765098022999894, -45.572410990999941 ], [ -71.801788289999962, -45.724029642999938 ], [ -71.758483438999889, -45.848156432999971 ], [ -71.665879272999945, -45.884019876999915 ], [ -71.612290812999873, -45.970526224999915 ], [ -71.770162312999872, -46.112636413999937 ], [ -71.91470129399994, -46.152323912999918 ], [ -71.763341023999914, -46.244514668999955 ], [ -71.680503702999914, -46.538140156999944 ], [ -71.687169962999917, -46.690068867999926 ], [ -71.950099649999856, -46.813988952999892 ], [ -71.970356811999864, -46.94845102999993 ], [ -71.914804646999869, -46.998473815999915 ], [ -72.005186726999938, -47.061932474999963 ], [ -71.874135294999917, -47.142547709999874 ], [ -71.880698201999905, -47.221922708999926 ], [ -72.030301473999941, -47.197531432999909 ], [ -72.038156290999979, -47.287035012999922 ], [ -72.17055131099994, -47.407544453999961 ], [ -72.361185669999941, -47.450952656999874 ], [ -72.320878051999898, -47.498391621999943 ], [ -72.344442505999893, -47.602261250999874 ], [ -72.543913533999898, -47.914800312999901 ], [ -72.343047241999926, -48.070449726999883 ], [ -72.302326212999873, -48.347538756999967 ], [ -72.576779743999936, -48.452131856999898 ], [ -72.614710245999845, -48.51000946099991 ], [ -72.592334350999863, -48.791129251999898 ], [ -72.781211710999884, -48.933859557999973 ], [ -73.009724894999863, -48.990393574999935 ], [ -73.171317097999889, -49.1893478389999 ], [ -73.171135422761552, -49.250740247664282 ], [ -74.089222785999937, -48.717217705999929 ], [ -74.330922003999945, -48.712985934999949 ], [ -74.289906378999945, -48.692478122999944 ], [ -74.364328579999949, -48.682305596999925 ], [ -74.399769660999937, -48.610528252999927 ], [ -74.327992316999939, -48.549004815999922 ], [ -74.197132941999939, -48.473321221999925 ], [ -73.993478969999899, -48.597263278999947 ], [ -74.028553839999915, -48.448011976999908 ], [ -73.892689581999946, -48.411309502999927 ], [ -74.237904425999943, -48.350762627999927 ], [ -74.107167120999918, -48.306084893999923 ], [ -74.270090298999946, -48.33562590899993 ], [ -74.317860480999911, -48.212090752999927 ], [ -74.442494269999941, -48.182386976999908 ], [ -74.512074347999942, -48.089939059999949 ], [ -74.468658006999931, -48.027764580999929 ], [ -74.626823284999944, -48.058903881999925 ], [ -74.625409323999918, -48.004227071999935 ], [ -74.537464972999942, -47.963067315999922 ], [ -74.415394660999937, -47.98365650799991 ], [ -74.334380662999934, -48.032159112999921 ], [ -74.276478644999941, -48.184502862999921 ], [ -74.205637173999946, -48.231052341999941 ], [ -74.171986456999946, -48.218601169999943 ], [ -74.330922003999945, -48.000420830999929 ], [ -73.891102667999917, -48.022230726999908 ], [ -73.879709438999953, -48.095961195999905 ], [ -73.76984615799995, -48.027764580999929 ], [ -73.804188605999911, -48.108086846999925 ], [ -73.748117641999897, -48.08171965899993 ], [ -73.601307745999918, -48.13014088299991 ], [ -73.604725714999915, -48.205824476999908 ], [ -73.556263800999943, -48.246840101999908 ], [ -73.486398891999897, -48.172539971999925 ], [ -73.351429816999939, -48.219496351999908 ], [ -73.276682094999899, -48.13836028399993 ], [ -73.290028449999909, -48.062432549999926 ], [ -73.294585740999935, -48.127048434999949 ], [ -73.400298631999931, -48.162041924999926 ], [ -73.642201300999943, -47.983575127999927 ], [ -73.642689581999946, -47.896579684999949 ], [ -73.507069464999915, -47.977959893999923 ], [ -73.227853969999899, -48.004082940999922 ], [ -73.481312628999945, -47.963067315999922 ], [ -73.516835089999915, -47.878513278999947 ], [ -73.619007941999939, -47.863864841999941 ], [ -73.550119594999899, -47.808038018999923 ], [ -73.731922980999911, -47.743096612999921 ], [ -73.666167772999927, -47.616306247999944 ], [ -73.701527472999942, -47.629815362999921 ], [ -73.673573370999918, -47.568454684999949 ], [ -73.721424933999913, -47.527439059999949 ], [ -73.775990363999938, -47.588962497999944 ], [ -73.730946417999917, -47.623711846999925 ], [ -73.772938605999911, -47.779473565999922 ], [ -73.923695441999939, -47.842705987999921 ], [ -74.023019985999952, -47.828545830999929 ], [ -74.067738410999937, -47.77076588299991 ], [ -74.350697394999941, -47.788506768999923 ], [ -74.407215949999909, -47.767673434999949 ], [ -74.338368292999917, -47.754001559999949 ], [ -74.378407355999911, -47.744805596999925 ], [ -74.548898891999897, -47.784763278999947 ], [ -74.735585089999915, -47.718682549999926 ], [ -74.656727667999917, -47.644138278999947 ], [ -74.567616339999915, -47.68092213299991 ], [ -74.632191535999937, -47.621270440999922 ], [ -74.556711391999897, -47.55006275799991 ], [ -74.520659959999932, -47.60320403399993 ], [ -74.437652147999927, -47.554782809999949 ], [ -74.344553188999953, -47.636651299999926 ], [ -74.481760219999899, -47.698825778999947 ], [ -74.344553188999953, -47.670830987999921 ], [ -74.295887824999909, -47.725355726999908 ], [ -74.205067511999914, -47.756605726999908 ], [ -74.159657355999911, -47.746514580999929 ], [ -74.26976477799991, -47.732598565999922 ], [ -74.303578253999945, -47.678317966999941 ], [ -74.132883266999897, -47.663995049999926 ], [ -74.253895636999914, -47.631280205999929 ], [ -74.043527798999946, -47.609470309999949 ], [ -74.140004035999937, -47.586195570999905 ], [ -74.057199673999946, -47.534274997999944 ], [ -74.314116990999935, -47.595798434999949 ], [ -74.344553188999953, -47.519952080999929 ], [ -74.392323370999918, -47.534763278999947 ], [ -74.453521287999934, -47.481052341999941 ], [ -74.394398566999939, -47.44654713299991 ], [ -74.465321417999917, -47.418145440999922 ], [ -74.506581183999913, -47.469659112999921 ], [ -74.528553839999915, -47.431735934999949 ], [ -74.324696417999917, -47.218926690999922 ], [ -74.283762173999946, -47.246270440999922 ], [ -74.177601691999939, -47.205254815999922 ], [ -74.112416144999941, -47.335544528999947 ], [ -74.115386522999927, -47.192966403999947 ], [ -74.016224738999938, -47.17742278399993 ], [ -73.973500128999945, -47.254978122999944 ], [ -73.989572719999899, -47.167413018999923 ], [ -74.057199673999946, -47.156914971999925 ], [ -73.941273566999939, -47.027927341999941 ], [ -74.153228318999936, -46.967217705999929 ], [ -74.208648240999935, -46.893975518999923 ], [ -74.126088019999941, -46.828545830999929 ], [ -74.243316209999932, -46.864678643999923 ], [ -74.289906378999945, -46.821709893999923 ], [ -74.266835089999915, -46.781670830999929 ], [ -74.591623501999948, -46.725518487999921 ], [ -74.477650519999941, -46.772393487999921 ], [ -74.640004035999937, -46.780043226999908 ], [ -74.673491990999935, -46.849053643999923 ], [ -74.434559699999909, -46.855889580999929 ], [ -74.47915605399993, -46.902276299999926 ], [ -74.680978969999899, -46.883884372999944 ], [ -74.815256313999953, -46.768487237999921 ], [ -74.856353318999936, -46.813897393999923 ], [ -75.00649980399993, -46.753513278999947 ], [ -75.083363410999937, -46.640883070999905 ], [ -74.94163977799991, -46.516778252999927 ], [ -74.934193488999938, -46.437595309999949 ], [ -75.201730923999946, -46.629978122999944 ], [ -75.207915818999936, -46.595147393999923 ], [ -75.342355923999946, -46.657321872999944 ], [ -75.414865688999953, -46.632745049999926 ], [ -75.575062628999945, -46.687920830999929 ], [ -75.661040818999936, -46.767185153999947 ], [ -75.631337042999917, -46.785414320999905 ], [ -75.540598110999952, -46.698174737999921 ], [ -75.422474738999938, -46.713962497999944 ], [ -75.476063605999911, -46.774021091999941 ], [ -75.386708136999914, -46.780043226999908 ], [ -75.43390865799995, -46.863376559999949 ], [ -75.346302863999938, -46.866794528999947 ], [ -75.410552537999934, -46.931573174999926 ], [ -75.551747199999909, -46.948337497999944 ], [ -75.650217251999948, -46.873223565999922 ], [ -75.707020636999914, -46.786553643999923 ], [ -75.704701300999943, -46.639255466999941 ], [ -75.636057094999899, -46.573011976999908 ], [ -75.517079230999911, -46.554294528999947 ], [ -75.540598110999952, -46.513278903999947 ], [ -75.373036261999914, -46.471612237999921 ], [ -75.401112433999913, -46.440524997999944 ], [ -75.345326300999943, -46.394789320999905 ], [ -75.270619269999941, -46.362399997999944 ], [ -75.222238735999952, -46.40398528399993 ], [ -75.196278449999909, -46.298272393999923 ], [ -75.10578365799995, -46.347100518999923 ], [ -75.029774542999917, -46.341973565999922 ], [ -75.138661261999914, -46.314060153999947 ], [ -75.090687628999945, -46.21607838299991 ], [ -74.92804928299995, -46.273614190999922 ], [ -74.958119269999941, -46.215264580999929 ], [ -74.87954667899993, -46.146742445999905 ], [ -74.777211066999939, -46.21217213299991 ], [ -74.756011522999927, -46.177992445999905 ], [ -74.821197068999936, -46.112237237999921 ], [ -74.77375240799995, -46.04029713299991 ], [ -74.70148678299995, -46.03289153399993 ], [ -74.737863735999952, -46.02312590899993 ], [ -74.72874915299991, -45.944024346999925 ], [ -74.665598110999952, -45.823337497999944 ], [ -74.559966600999928, -45.826267184999949 ], [ -74.558094855999911, -45.903090101999908 ], [ -74.458159959999932, -45.933851820999905 ], [ -74.45335852799991, -46.016371351999908 ], [ -74.399769660999937, -45.930433851999908 ], [ -74.461822068999936, -45.815036716999941 ], [ -74.35960852799991, -45.79029713299991 ], [ -74.321278449999909, -45.83171965899993 ], [ -74.170277472999942, -45.791761976999908 ], [ -74.103138800999943, -45.836846612999921 ], [ -74.192779100999928, -45.881931247999944 ], [ -74.059193488999938, -45.929864190999922 ], [ -74.080067511999914, -45.981866143999923 ], [ -74.167062954999949, -46.00554778399993 ], [ -74.083851691999939, -46.029717705999929 ], [ -74.167062954999949, -46.13640715899993 ], [ -74.076283331999946, -46.096123955999929 ], [ -74.061350063999953, -45.980889580999929 ], [ -73.970570441999939, -46.084161065999922 ], [ -74.063588019999941, -46.172051690999922 ], [ -74.313221808999913, -46.249932549999926 ], [ -74.489898240999935, -46.189385674999926 ], [ -74.342152472999942, -46.260837497999944 ], [ -74.049712693999936, -46.19109465899993 ], [ -74.077707485999952, -46.322035414999903 ], [ -74.026437954999949, -46.286716403999947 ], [ -73.844878709999932, -46.341973565999922 ], [ -74.019276495999918, -46.20435963299991 ], [ -73.968169725999928, -46.144707940999922 ], [ -73.881825324999909, -46.141778252999927 ], [ -73.76984615799995, -46.234551690999922 ], [ -73.773060675999943, -46.320896091999941 ], [ -73.989165818999936, -46.559747002999927 ], [ -73.873890753999945, -46.602227471999925 ], [ -73.78734290299991, -46.497165622999944 ], [ -73.741851365999935, -46.533786716999941 ], [ -73.742339647999927, -46.420993747999944 ], [ -73.601307745999918, -46.318454684999949 ], [ -73.488636847999942, -46.300957940999922 ], [ -73.568348761999914, -46.270440362999921 ], [ -73.523915167999917, -46.175225518999923 ], [ -73.344593878999945, -46.026543877999927 ], [ -73.430287238999938, -46.029717705999929 ], [ -73.687855597999942, -46.322035414999903 ], [ -73.619007941999939, -46.102308851999908 ], [ -73.660552537999934, -45.975681247999944 ], [ -73.522775844999899, -45.875746351999908 ], [ -73.560210740999935, -45.82976653399993 ], [ -73.402088995999918, -45.701918226999908 ], [ -73.18578040299991, -45.662530205999929 ], [ -73.327259894999941, -45.619073174999926 ], [ -73.591664191999939, -45.780205987999921 ], [ -73.510853644999941, -45.451755466999941 ], [ -73.445871548999946, -45.413506768999923 ], [ -73.406076626999948, -45.451267184999949 ], [ -73.392445441999939, -45.375583591999941 ], [ -73.323557094999899, -45.395928643999923 ], [ -73.327707485999952, -45.340915622999944 ], [ -73.226429816999939, -45.300876559999949 ], [ -73.01431230399993, -45.444756768999923 ], [ -72.859527147999927, -45.464450778999947 ], [ -72.830637173999946, -45.418064059999949 ], [ -72.981516079999949, -45.400974216999941 ], [ -73.256662563999953, -45.248223565999922 ], [ -73.448068813999953, -45.279473565999922 ], [ -73.450062628999945, -45.199476820999905 ], [ -73.304432745999918, -45.144789320999905 ], [ -73.397775844999899, -44.988213799999926 ], [ -73.117095506999931, -44.948337497999944 ], [ -72.727650519999941, -44.758558851999908 ], [ -72.679839647999927, -44.543552341999941 ], [ -72.59797115799995, -44.505303643999923 ], [ -72.591135219999899, -44.340752862999921 ], [ -72.721913214999915, -44.501397393999923 ], [ -72.75023352799991, -44.448988539999903 ], [ -72.924631313999953, -44.373711846999925 ], [ -72.939930792999917, -44.306735934999949 ], [ -73.183501756999931, -44.248142184999949 ], [ -73.128081834999932, -44.14576588299991 ], [ -73.197661912999934, -44.195489190999922 ], [ -73.283599412999934, -44.174086195999905 ], [ -73.286936001999948, -44.123467705999929 ], [ -73.223011847999942, -44.127048434999949 ], [ -73.215402798999946, -44.067966403999947 ], [ -73.116118943999936, -44.085707289999903 ], [ -73.139149542999917, -43.985121351999908 ], [ -73.012684699999909, -43.772149346999925 ], [ -72.967274542999917, -43.820082289999903 ], [ -72.898915167999917, -43.776950778999947 ], [ -72.824615037999934, -43.80787525799991 ], [ -72.847157355999911, -43.679457289999903 ], [ -72.885894334999932, -43.751153252999927 ], [ -73.042328591890964, -43.729587928939793 ], [ -72.875727098227003, -43.695885511507129 ], [ -72.825445929785815, -43.636457614627204 ], [ -72.768317633551931, -43.725651136790532 ], [ -72.561663580709649, -43.777327569211934 ], [ -72.348188239395711, -43.733040866942474 ], [ -72.129519415788423, -43.946257826737337 ], [ -71.796413132560019, -44.000001315808049 ], [ -71.745259914013786, -44.044998116469912 ] ] ], [ [ [ -75.338937954999949, -48.624200127999927 ], [ -75.296986456999946, -48.727146091999941 ], [ -75.384185350999928, -48.696465752999927 ], [ -75.493234829999949, -48.775567315999922 ], [ -75.647857225999928, -48.778903903999947 ], [ -75.641835089999915, -48.701348565999922 ], [ -75.507557745999918, -48.717543226999908 ], [ -75.338937954999949, -48.624200127999927 ] ] ], [ [ [ -75.32835852799991, -48.552178643999923 ], [ -75.339914516999897, -48.614841403999947 ], [ -75.54165605399993, -48.70086028399993 ], [ -75.606556769999941, -48.661065362999921 ], [ -75.499379035999937, -48.660088799999926 ], [ -75.440663214999915, -48.610528252999927 ], [ -75.598947719999899, -48.637302341999941 ], [ -75.675363735999952, -48.583184502999927 ], [ -75.606434699999909, -48.439222914999903 ], [ -75.547718878999945, -48.472914320999905 ], [ -75.344349738999938, -48.42742278399993 ], [ -75.366200324999909, -48.541680596999925 ], [ -75.32835852799991, -48.552178643999923 ] ] ], [ [ [ -74.472075975999928, -48.455987237999921 ], [ -74.510243292999917, -48.408298434999949 ], [ -74.303130662999934, -48.479913018999923 ], [ -74.429025844999899, -48.525811455999929 ], [ -74.472075975999928, -48.455987237999921 ] ] ], [ [ [ -74.090687628999945, -48.479587497999944 ], [ -74.179066535999937, -48.443129164999903 ], [ -74.250803188999953, -48.378024997999944 ], [ -74.057199673999946, -48.425551039999903 ], [ -74.090687628999945, -48.479587497999944 ] ] ], [ [ [ -74.495432094999899, -48.349867445999905 ], [ -74.358794725999928, -48.370293877999927 ], [ -74.393177863999938, -48.313164971999925 ], [ -74.314116990999935, -48.28093840899993 ], [ -74.22329667899993, -48.444919528999947 ], [ -74.27171790299991, -48.462660414999903 ], [ -74.495432094999899, -48.349867445999905 ] ] ], [ [ [ -74.499134894999941, -48.583184502999927 ], [ -74.514068162999934, -48.666110934999949 ], [ -74.607329881999931, -48.693942966999941 ], [ -74.750599738999938, -48.629489841999941 ], [ -74.996245897999927, -48.603692315999922 ], [ -75.033070441999939, -48.504489841999941 ], [ -74.84593665299991, -48.390232028999947 ], [ -74.78156490799995, -48.485039971999925 ], [ -74.717152472999942, -48.453545830999929 ], [ -74.813588019999941, -48.342543226999908 ], [ -74.737660285999937, -48.125746351999908 ], [ -74.680043097999942, -48.303399346999925 ], [ -74.584787563999953, -48.376560153999947 ], [ -74.673491990999935, -48.418145440999922 ], [ -74.605213995999918, -48.459161065999922 ], [ -74.599436001999948, -48.563653252999927 ], [ -74.530629035999937, -48.621758721999925 ], [ -74.499134894999941, -48.583184502999927 ] ] ], [ [ [ -74.543812628999945, -48.32195403399993 ], [ -74.521880662999934, -48.194512627999927 ], [ -74.60374915299991, -48.235446872999944 ], [ -74.605213995999918, -48.157403252999927 ], [ -74.558176235999952, -48.12232838299991 ], [ -74.372629360999952, -48.25318775799991 ], [ -74.543812628999945, -48.32195403399993 ] ] ], [ [ [ -75.160755988999938, -48.298435153999947 ], [ -75.11978105399993, -48.26100025799991 ], [ -75.207915818999936, -48.212090752999927 ], [ -75.256337042999917, -48.068617445999905 ], [ -75.017504644999917, -48.083020135999902 ], [ -74.804514126999948, -48.174493096999925 ], [ -74.841297980999911, -48.359307549999926 ], [ -75.031117316999939, -48.443780205999929 ], [ -75.160755988999938, -48.298435153999947 ] ] ], [ [ [ -75.149891730999911, -48.658379815999922 ], [ -75.224476691999939, -48.706475518999923 ], [ -75.229644334999932, -48.637302341999941 ], [ -75.282826300999943, -48.63054778399993 ], [ -75.320668097999942, -48.492445570999905 ], [ -75.270619269999941, -48.418145440999922 ], [ -75.325266079999949, -48.39421965899993 ], [ -75.317941860999952, -48.34889088299991 ], [ -75.48656165299991, -48.423028252999927 ], [ -75.554188605999911, -48.397149346999925 ], [ -75.345773891999897, -48.301446221999925 ], [ -75.407134568999936, -48.31568775799991 ], [ -75.394154425999943, -48.274102471999925 ], [ -75.543771938999953, -48.32195403399993 ], [ -75.43390865799995, -48.198988539999903 ], [ -75.540109829999949, -48.22625090899993 ], [ -75.585316535999937, -48.085707289999903 ], [ -75.551136847999942, -48.055759372999944 ], [ -75.338937954999949, -48.017510674999926 ], [ -75.268910285999937, -48.165948174999926 ], [ -75.289947068999936, -48.215508721999925 ], [ -75.164784308999913, -48.369561455999929 ], [ -75.187408006999931, -48.411309502999927 ], [ -75.098703579999949, -48.465915622999944 ], [ -75.149891730999911, -48.483005466999941 ], [ -75.083404100999928, -48.507745049999926 ], [ -75.071400519999941, -48.596286716999941 ], [ -75.149891730999911, -48.658379815999922 ] ] ], [ [ [ -75.270619269999941, -48.027764580999929 ], [ -75.16777265099995, -47.893604282999945 ], [ -74.94292566799993, -47.883665608999934 ], [ -74.872792120999918, -47.815524997999944 ], [ -74.78832381299992, -47.812324270999909 ], [ -74.765736867999919, -47.884211562999951 ], [ -74.812981955999931, -47.938897175999955 ], [ -74.777181868999946, -47.970611898999948 ], [ -74.834868943999936, -48.007907809999949 ], [ -74.764418836999937, -48.021441390999939 ], [ -74.727379237999912, -48.105891838999923 ], [ -75.012847459999932, -48.041436455999929 ], [ -75.052357550999943, -47.986260674999926 ], [ -75.270619269999941, -48.027764580999929 ] ] ], [ [ [ -74.413726365999935, -47.938246351999908 ], [ -74.502837693999936, -47.917901299999926 ], [ -74.364247199999909, -47.830824476999908 ], [ -74.248931443999936, -47.876885674999926 ], [ -74.330922003999945, -47.822198174999926 ], [ -74.289906378999945, -47.807386976999908 ], [ -73.80890865799995, -47.887383721999925 ], [ -73.831206834999932, -47.952569268999923 ], [ -73.923003709999932, -47.963636976999908 ], [ -73.924875454999949, -47.915948174999926 ], [ -74.318470831999946, -47.981215101999908 ], [ -74.413726365999935, -47.938246351999908 ] ] ], [ [ [ -75.182362433999913, -47.831475518999923 ], [ -75.342546400999936, -47.782862441999953 ], [ -75.355913455999939, -47.736140027999909 ], [ -75.091637528999911, -47.680492216999937 ], [ -75.059369179999919, -47.749886964999916 ], [ -75.123199022999927, -47.781914971999925 ], [ -75.023682360999942, -47.803325029999939 ], [ -75.227313789999926, -47.854714287999911 ], [ -75.182362433999913, -47.831475518999923 ] ] ], [ [ [ -74.885228798999947, -47.712063181999952 ], [ -74.868040452999935, -47.763242241999933 ], [ -74.957722775999912, -47.774795059999917 ], [ -75.054421420999915, -47.689572060999922 ], [ -75.000383613999929, -47.662200149999933 ], [ -74.885228798999947, -47.712063181999952 ] ] ], [ [ [ -74.468658006999931, -47.074965101999908 ], [ -74.356678839999915, -47.045017184999949 ], [ -74.315785285999937, -47.078057549999926 ], [ -74.454701300999943, -47.167738539999903 ], [ -74.468658006999931, -47.074965101999908 ] ] ], [ [ [ -74.074574347999942, -47.020277601999908 ], [ -73.97524980399993, -47.047621351999908 ], [ -74.145904100999928, -47.17115650799991 ], [ -74.226470506999931, -47.122002862999921 ], [ -74.177357550999943, -47.016534112999921 ], [ -74.111195441999939, -47.053887627999927 ], [ -74.074574347999942, -47.020277601999908 ] ] ], [ [ [ -73.725087042999917, -46.05046965899993 ], [ -73.684071417999917, -46.105401299999926 ], [ -73.775461391999897, -46.199476820999905 ], [ -73.940500454999949, -46.068129164999903 ], [ -73.896473761999914, -46.011488539999903 ], [ -73.725087042999917, -46.05046965899993 ] ] ], [ [ [ -73.70767167899993, -45.923597914999903 ], [ -73.683176235999952, -46.017673434999949 ], [ -73.819488084999932, -45.998711846999925 ], [ -73.77212480399993, -45.898695570999905 ], [ -73.70767167899993, -45.923597914999903 ] ] ], [ [ [ -74.752919074999909, -45.807549737999921 ], [ -74.71507727799991, -45.848402601999908 ], [ -74.780751105999911, -46.011488539999903 ], [ -74.919667120999918, -46.104180596999925 ], [ -75.074330206999946, -46.093845309999949 ], [ -75.084380662999934, -46.026788018999923 ], [ -74.890451626999948, -46.016208591999941 ], [ -74.859120245999918, -45.998711846999925 ], [ -75.07876542899993, -45.985039971999925 ], [ -75.029774542999917, -45.96453215899993 ], [ -75.088734503999945, -45.950290622999944 ], [ -75.108265753999945, -45.874200127999927 ], [ -74.883534308999913, -45.92937590899993 ], [ -74.970529751999948, -45.862888278999947 ], [ -74.889393683999913, -45.881931247999944 ], [ -74.831857876999948, -45.807549737999921 ], [ -74.752919074999909, -45.807549737999921 ] ] ], [ [ [ -73.741851365999935, -45.793877862999921 ], [ -73.694081183999913, -45.888848565999922 ], [ -73.789662238999938, -45.875746351999908 ], [ -73.856556769999941, -45.967543226999908 ], [ -73.934315558999913, -45.97193775799991 ], [ -73.911447719999899, -45.875258070999905 ], [ -73.741851365999935, -45.793877862999921 ] ] ], [ [ [ -73.926828579999949, -45.74537525799991 ], [ -73.97524980399993, -45.780205987999921 ], [ -74.015614386999914, -45.913995049999926 ], [ -74.094593878999945, -45.763929945999905 ], [ -73.926828579999949, -45.74537525799991 ] ] ], [ [ [ -74.790842251999948, -45.63250090899993 ], [ -74.752430792999917, -45.699639580999929 ], [ -74.879261847999942, -45.624607028999947 ], [ -74.839100714999915, -45.601820570999905 ], [ -74.790842251999948, -45.63250090899993 ] ] ], [ [ [ -74.554351365999935, -45.574802341999941 ], [ -74.583892381999931, -45.735284112999921 ], [ -74.685699022999927, -45.743340752999927 ], [ -74.679676886999914, -45.620700778999947 ], [ -74.554351365999935, -45.574802341999941 ] ] ], [ [ [ -74.071441209999932, -45.690850518999923 ], [ -74.114654100999928, -45.599704684999949 ], [ -74.050445115999935, -45.54461028399993 ], [ -73.910227016999897, -45.590997002999927 ], [ -73.920643683999913, -45.697686455999929 ], [ -74.071441209999932, -45.690850518999923 ] ] ], [ [ [ -74.502837693999936, -45.732354424999926 ], [ -74.421254035999937, -45.454278252999927 ], [ -74.273548956999946, -45.495293877999927 ], [ -74.276966925999943, -45.567315362999921 ], [ -74.221669074999909, -45.601495049999926 ], [ -74.289906378999945, -45.622491143999923 ], [ -74.207997199999909, -45.635511976999908 ], [ -74.241810675999943, -45.675957940999922 ], [ -74.358794725999928, -45.697686455999929 ], [ -74.330922003999945, -45.724867445999905 ], [ -74.43968665299991, -45.776950778999947 ], [ -74.502837693999936, -45.732354424999926 ] ] ], [ [ [ -73.666167772999927, -45.436944268999923 ], [ -73.58421790299991, -45.512627862999921 ], [ -73.611480272999927, -45.629327080999929 ], [ -73.680409308999913, -45.622491143999923 ], [ -73.611480272999927, -45.690850518999923 ], [ -73.680409308999913, -45.752862237999921 ], [ -73.818267381999931, -45.642510674999926 ], [ -73.741851365999935, -45.608982028999947 ], [ -73.786203579999949, -45.569919528999947 ], [ -73.770904100999928, -45.511976820999905 ], [ -73.666167772999927, -45.436944268999923 ] ] ], [ [ [ -73.885894334999932, -45.471123955999929 ], [ -73.816965298999946, -45.474786065999922 ], [ -73.870472785999937, -45.561700127999927 ], [ -74.029652472999942, -45.517347914999903 ], [ -74.142648891999897, -45.574965101999908 ], [ -74.064035610999952, -45.423272393999923 ], [ -73.885894334999932, -45.471123955999929 ] ] ], [ [ [ -74.554351365999935, -45.546807549999926 ], [ -74.51976477799991, -45.444105726999908 ], [ -74.445668097999942, -45.428155205999929 ], [ -74.501332160999937, -45.588067315999922 ], [ -74.554351365999935, -45.546807549999926 ] ] ], [ [ [ -73.82445227799991, -45.395928643999923 ], [ -73.921742316999939, -45.430433851999908 ], [ -74.023019985999952, -45.392673434999949 ], [ -73.941029425999943, -45.366306247999944 ], [ -73.82445227799991, -45.395928643999923 ] ] ], [ [ [ -74.341420050999943, -45.337660414999903 ], [ -74.310414191999939, -45.389255466999941 ], [ -74.378041144999941, -45.400974216999941 ], [ -74.525786912999934, -45.295017184999949 ], [ -74.389271613999938, -45.281670830999929 ], [ -74.341420050999943, -45.337660414999903 ] ] ], [ [ [ -73.82445227799991, -45.266289971999925 ], [ -73.786244269999941, -45.333916924999926 ], [ -74.012277798999946, -45.353610934999949 ], [ -74.129505988999938, -45.323988539999903 ], [ -74.167062954999949, -45.252618096999925 ], [ -74.070383266999897, -45.204278252999927 ], [ -73.986073370999918, -45.27076588299991 ], [ -73.82445227799991, -45.266289971999925 ] ] ], [ [ [ -74.273548956999946, -45.207940362999921 ], [ -74.325347459999932, -45.302341403999947 ], [ -74.420277472999942, -45.23211028399993 ], [ -74.387562628999945, -45.155205987999921 ], [ -74.273548956999946, -45.207940362999921 ] ] ], [ [ [ -73.731922980999911, -45.214776299999926 ], [ -73.767974412999934, -45.284600518999923 ], [ -73.842844204999949, -45.239678643999923 ], [ -73.989572719999899, -45.24578215899993 ], [ -74.084095831999946, -45.140069268999923 ], [ -74.205474412999934, -45.169366143999923 ], [ -74.250111456999946, -45.109633070999905 ], [ -74.173898891999897, -45.026055596999925 ], [ -73.866078253999945, -44.994561455999929 ], [ -73.714588995999918, -45.114190362999921 ], [ -73.731922980999911, -45.214776299999926 ] ] ], [ [ [ -74.270090298999946, -44.944105726999908 ], [ -74.163726365999935, -44.864678643999923 ], [ -73.913197394999941, -44.950372002999927 ], [ -74.356922980999911, -45.011488539999903 ], [ -74.270090298999946, -44.944105726999908 ] ] ], [ [ [ -73.96157792899993, -44.810153903999947 ], [ -74.071441209999932, -44.854180596999925 ], [ -74.187489386999914, -44.80632903399993 ], [ -73.995716925999943, -44.772149346999925 ], [ -73.96157792899993, -44.810153903999947 ] ] ], [ [ [ -73.930531378999945, -44.789239190999922 ], [ -73.854481574999909, -44.768731377999927 ], [ -73.762318488999938, -44.929864190999922 ], [ -73.813710089999915, -44.960870049999926 ], [ -73.883208787999934, -44.928155205999929 ], [ -73.926747199999909, -44.854424737999921 ], [ -73.857899542999917, -44.895684502999927 ], [ -73.930531378999945, -44.789239190999922 ] ] ], [ [ [ -75.091473254999926, -44.796056055999941 ], [ -75.021734398999911, -44.843664722999904 ], [ -75.031272062999903, -44.903969270999937 ], [ -75.152357944999949, -44.921213887999954 ], [ -75.198322394999934, -44.807232422999903 ], [ -75.147181885999942, -44.763766525999927 ], [ -75.091473254999926, -44.796056055999941 ] ] ], [ [ [ -73.604725714999915, -44.744886976999908 ], [ -73.627308722999942, -44.82976653399993 ], [ -73.749256964999915, -44.802829684999949 ], [ -73.741688605999911, -44.754652601999908 ], [ -73.604725714999915, -44.744886976999908 ] ] ], [ [ [ -74.341420050999943, -44.80632903399993 ], [ -74.312367316999939, -44.841403903999947 ], [ -74.393544074999909, -44.857028903999947 ], [ -74.527740037999934, -44.743259372999944 ], [ -74.427113410999937, -44.718194268999923 ], [ -74.341420050999943, -44.80632903399993 ] ] ], [ [ [ -74.482329881999931, -44.636325778999947 ], [ -74.46898352799991, -44.697198174999926 ], [ -74.669504360999952, -44.670179945999905 ], [ -74.622670050999943, -44.622002862999921 ], [ -74.482329881999931, -44.636325778999947 ] ] ], [ [ [ -73.926828579999949, -44.628838799999926 ], [ -73.875884568999936, -44.694024346999925 ], [ -74.258697068999936, -44.804457289999903 ], [ -74.368763800999943, -44.747491143999923 ], [ -74.317860480999911, -44.704522393999923 ], [ -74.413807745999918, -44.685967705999929 ], [ -74.400542772999927, -44.626071872999944 ], [ -74.267160610999952, -44.603122653999947 ], [ -73.926828579999949, -44.628838799999926 ] ] ], [ [ [ -74.777211066999939, -44.581149997999944 ], [ -74.732533331999946, -44.593194268999923 ], [ -74.747792120999918, -44.665622653999947 ], [ -74.803863084999932, -44.673760674999926 ], [ -74.824940558999913, -44.581149997999944 ], [ -74.798247850999928, -44.548760674999926 ], [ -74.777211066999939, -44.581149997999944 ] ] ], [ [ [ -73.659982876999948, -44.676527601999908 ], [ -73.591542120999918, -44.70671965899993 ], [ -73.752512173999946, -44.741387627999927 ], [ -73.844309048999946, -44.652520440999922 ], [ -73.821400519999941, -44.578708591999941 ], [ -73.67992102799991, -44.544854424999926 ], [ -73.625152147999927, -44.622002862999921 ], [ -73.659982876999948, -44.676527601999908 ] ] ], [ [ [ -74.193714972999942, -44.492282809999949 ], [ -74.132883266999897, -44.546970309999949 ], [ -74.326324022999927, -44.579685153999947 ], [ -74.368885870999918, -44.541110934999949 ], [ -74.193714972999942, -44.492282809999949 ] ] ], [ [ [ -74.036040818999936, -44.498467705999929 ], [ -74.143666144999941, -44.458103122999944 ], [ -74.167062954999949, -44.430271091999941 ], [ -73.971547003999945, -44.471286716999941 ], [ -73.947336391999897, -44.543552341999941 ], [ -74.132883266999897, -44.518975518999923 ], [ -74.036040818999936, -44.498467705999929 ] ] ], [ [ [ -74.392974412999934, -44.546970309999949 ], [ -74.523304816999939, -44.526462497999944 ], [ -74.541127081999946, -44.453789971999925 ], [ -74.420277472999942, -44.471286716999941 ], [ -74.348255988999938, -44.402276299999926 ], [ -74.259510870999918, -44.412855726999908 ], [ -74.223052537999934, -44.467380466999941 ], [ -74.420277472999942, -44.505303643999923 ], [ -74.392974412999934, -44.546970309999949 ] ] ], [ [ [ -73.789662238999938, -44.422784112999921 ], [ -73.867014126999948, -44.46607838299991 ], [ -73.910959438999953, -44.396742445999905 ], [ -73.887684699999909, -44.369235934999949 ], [ -73.789662238999938, -44.422784112999921 ] ] ], [ [ [ -73.382476365999935, -44.587823174999926 ], [ -73.241200324999909, -44.639336846999925 ], [ -73.280506964999915, -44.541761976999908 ], [ -73.131581183999913, -44.545179945999905 ], [ -73.241566535999937, -44.512139580999929 ], [ -73.246245897999927, -44.43718840899993 ], [ -73.167103644999941, -44.409112237999921 ], [ -73.036203579999949, -44.484795830999929 ], [ -73.090809699999909, -44.402276299999926 ], [ -73.002023891999897, -44.361260674999926 ], [ -72.926258917999917, -44.437107028999947 ], [ -72.980946417999917, -44.512139580999929 ], [ -72.872303839999915, -44.437107028999947 ], [ -72.721180792999917, -44.528008721999925 ], [ -72.813343878999945, -44.636325778999947 ], [ -72.980946417999917, -44.601495049999926 ], [ -72.831288214999915, -44.676527601999908 ], [ -72.837635870999918, -44.710137627999927 ], [ -73.256988084999932, -44.940036716999941 ], [ -73.407582160999937, -44.822442315999922 ], [ -73.207427537999934, -44.80006275799991 ], [ -73.299631313999953, -44.758558851999908 ], [ -73.393422003999945, -44.788669528999947 ], [ -73.468129035999937, -44.642510674999926 ], [ -73.382476365999935, -44.587823174999926 ] ] ], [ [ [ -73.726470506999931, -44.42506275799991 ], [ -73.789662238999938, -44.382419528999947 ], [ -73.654123501999948, -44.35084400799991 ], [ -73.72883053299995, -44.388604424999926 ], [ -73.678700324999909, -44.434502862999921 ], [ -73.726470506999931, -44.42506275799991 ] ] ], [ [ [ -74.029896613999938, -44.354587497999944 ], [ -73.926828579999949, -44.354587497999944 ], [ -73.940500454999949, -44.450616143999923 ], [ -74.112416144999941, -44.327243747999944 ], [ -74.029896613999938, -44.354587497999944 ] ] ], [ [ [ -73.262806769999941, -44.388441664999903 ], [ -73.302723761999914, -44.349704684999949 ], [ -73.249012824999909, -44.306735934999949 ], [ -73.177154100999928, -44.367771091999941 ], [ -73.262806769999941, -44.388441664999903 ] ] ], [ [ [ -73.865386522999927, -44.334079684999949 ], [ -73.932484503999945, -44.328545830999929 ], [ -73.97524980399993, -44.289646091999941 ], [ -73.805653449999909, -44.266371351999908 ], [ -73.789051886999914, -44.309502862999921 ], [ -73.865386522999927, -44.334079684999949 ] ] ], [ [ [ -74.386626756999931, -44.249932549999926 ], [ -74.303578253999945, -44.258233330999929 ], [ -74.290028449999909, -44.297295830999929 ], [ -74.409901495999918, -44.28443775799991 ], [ -74.386626756999931, -44.249932549999926 ] ] ], [ [ [ -73.741851365999935, -44.265069268999923 ], [ -73.675689256999931, -44.241306247999944 ], [ -73.666167772999927, -44.265069268999923 ], [ -73.722035285999937, -44.302829684999949 ], [ -73.741851365999935, -44.265069268999923 ] ] ], [ [ [ -74.108713344999899, -44.227471612999921 ], [ -74.110503709999932, -44.18914153399993 ], [ -74.049712693999936, -44.196872653999947 ], [ -74.064320441999939, -44.149021091999941 ], [ -73.893625454999949, -44.239353122999944 ], [ -74.009348110999952, -44.257256768999923 ], [ -74.017933722999942, -44.327732028999947 ], [ -74.108713344999899, -44.227471612999921 ] ] ], [ [ [ -74.276966925999943, -44.149021091999941 ], [ -74.258168097999942, -44.17310963299991 ], [ -74.337391730999911, -44.189873955999929 ], [ -74.385568813999953, -44.159600518999923 ], [ -74.276966925999943, -44.149021091999941 ] ] ], [ [ [ -73.882801886999914, -44.118340752999927 ], [ -73.846262173999946, -44.190199476999908 ], [ -74.016224738999938, -44.142836195999905 ], [ -73.952707485999952, -44.10475025799991 ], [ -73.882801886999914, -44.118340752999927 ] ] ], [ [ [ -74.297352667999917, -44.011895440999922 ], [ -74.277414516999897, -44.011895440999922 ], [ -74.207997199999909, -44.019301039999903 ], [ -74.298329230999911, -44.031914971999925 ], [ -74.297352667999917, -44.011895440999922 ] ] ], [ [ [ -73.744984503999945, -43.953545830999929 ], [ -73.638824022999927, -44.005059502999927 ], [ -73.633412238999938, -44.123793226999908 ], [ -73.72883053299995, -44.04656340899993 ], [ -73.744984503999945, -43.953545830999929 ] ] ], [ [ [ -73.227935350999928, -44.011895440999922 ], [ -73.284169074999909, -43.935723565999922 ], [ -73.159657355999911, -43.881524346999925 ], [ -73.151600714999915, -44.015801690999922 ], [ -73.227935350999928, -44.011895440999922 ] ] ], [ [ [ -74.143937792999907, -43.82755091699994 ], [ -74.045244664999927, -43.796093797999902 ], [ -73.967349755999919, -43.82883363499991 ], [ -73.865101691999939, -43.762627862999921 ], [ -73.762318488999938, -43.888929945999905 ], [ -73.872181769999941, -43.888929945999905 ], [ -73.913197394999941, -43.867852471999925 ], [ -73.865386522999927, -43.84734465899993 ], [ -73.928456183999913, -43.840752862999921 ], [ -73.97524980399993, -43.867852471999925 ], [ -73.906361456999946, -43.90943775799991 ], [ -73.995716925999943, -43.936700127999927 ], [ -74.165394660999937, -43.875095309999949 ], [ -74.143937792999907, -43.82755091699994 ] ] ], [ [ [ -74.818186001999948, -43.635023695999905 ], [ -74.825025557999936, -43.562412198999937 ], [ -74.744900592999898, -43.565905912999938 ], [ -74.737900484999898, -43.530177431999903 ], [ -74.557486089999941, -43.627409746999945 ], [ -74.758454711999946, -43.676949150999917 ], [ -74.818186001999948, -43.635023695999905 ] ] ], [ [ [ -74.649865233999947, -47.797742236999909 ], [ -74.526180506999935, -47.812868098999957 ], [ -74.524671364999904, -47.868351277999921 ], [ -74.593972314999917, -47.864388601999906 ], [ -74.644015791999948, -47.923110272999907 ], [ -74.689230284999951, -47.834117121999952 ], [ -74.649865233999947, -47.797742236999909 ] ] ], [ [ [ -75.323146851999923, -46.685089311999945 ], [ -75.17399230399991, -46.677963655999918 ], [ -75.132213585999921, -46.777994805999924 ], [ -75.342251861999898, -46.701736590999928 ], [ -75.323146851999923, -46.685089311999945 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CL-MA", "NAME_1": "Magallanes y Antártica Chilena" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -73.170447858999893, -49.250870019999937 ], [ -73.098246622999909, -49.272753600999955 ], [ -73.457862914999936, -49.307686868999944 ], [ -73.466725423999947, -49.387578632999954 ], [ -73.54044185499987, -49.427782897999883 ], [ -73.586588907999896, -49.529998880999948 ], [ -73.521114868999916, -49.608960469999907 ], [ -73.539511678999901, -49.692676288999863 ], [ -73.465097615999895, -49.759959004999935 ], [ -73.57273962499994, -49.932351582999971 ], [ -73.478585164999856, -50.009452819999922 ], [ -73.530571655999978, -50.140814310999914 ], [ -73.301438354999931, -50.299564310999948 ], [ -73.257616740999907, -50.573035990999948 ], [ -73.139484415999931, -50.770233255999933 ], [ -72.77842118399991, -50.619648131999917 ], [ -72.662614298999955, -50.667810566999904 ], [ -72.505983032999893, -50.601251321999918 ], [ -72.302842977999916, -50.648896993999962 ], [ -72.347388061999908, -50.743154805999971 ], [ -72.263465535999899, -50.836275736999973 ], [ -72.265946004999876, -50.960712584999982 ], [ -72.404593872999953, -51.105820006999913 ], [ -72.258814656999846, -51.245191345999977 ], [ -72.320464640999887, -51.312577412999893 ], [ -72.35121211799995, -51.475978291999894 ], [ -72.450069132999914, -51.552666117999927 ], [ -72.330903279999916, -51.599381611999917 ], [ -72.300724243999923, -51.691469014999939 ], [ -71.981725626999946, -51.844948018999936 ], [ -71.965240844999869, -51.970625101999893 ], [ -69.952753865999881, -52.007418721999976 ], [ -69.485288859999855, -52.13247568699996 ], [ -69.212256428999865, -52.13795338999995 ], [ -68.454499063999975, -52.299907327999861 ], [ -68.448609732999898, -52.346617015999925 ], [ -68.898461399999917, -52.303537198999948 ], [ -69.234708121999915, -52.203143069999953 ], [ -69.47093665299991, -52.27271900799991 ], [ -69.496937628999945, -52.385349216999941 ], [ -69.672351495999919, -52.53085653799991 ], [ -69.846579596999902, -52.48654268599995 ], [ -70.151981893999903, -52.586508318999904 ], [ -70.2077156819999, -52.651003467999942 ], [ -70.321792923999908, -52.638147171999947 ], [ -70.517734388999941, -52.723254926999914 ], [ -70.548235298999941, -52.722721843999921 ], [ -70.525878290999913, -52.659927067999945 ], [ -70.698178096999925, -52.73943212599994 ], [ -70.734038865999935, -52.701429945999905 ], [ -70.863758917999917, -52.721368096999925 ], [ -70.738840298999946, -52.783868096999925 ], [ -70.889214765999952, -52.913626393999948 ], [ -70.809152798999946, -52.961602471999925 ], [ -70.950550910999937, -53.197523695999905 ], [ -70.992746548999946, -53.382989190999922 ], [ -70.939442511999914, -53.592217705999929 ], [ -70.973622199999909, -53.756036065999922 ], [ -71.285023566999939, -53.88600025799991 ], [ -71.644642706999946, -53.823663018999923 ], [ -71.874419725999928, -53.69654713299991 ], [ -71.929432745999918, -53.728773695999905 ], [ -72.001454230999911, -53.674086195999905 ], [ -72.103871222999942, -53.689060153999947 ], [ -72.453277147999927, -53.407321872999944 ], [ -72.41234290299991, -53.310967705999929 ], [ -72.282297329999949, -53.242771091999941 ], [ -72.114613410999937, -53.256768487999921 ], [ -72.080433722999942, -53.329034112999921 ], [ -72.099598761999914, -53.390069268999923 ], [ -72.241688605999911, -53.434502862999921 ], [ -72.092518683999913, -53.422621351999908 ], [ -72.015126105999911, -53.392998955999929 ], [ -72.02171790299991, -53.24732838299991 ], [ -71.855620897999927, -53.225355726999908 ], [ -71.789173956999946, -53.441338799999926 ], [ -72.007964647999927, -53.554294528999947 ], [ -71.814198370999918, -53.520684502999927 ], [ -71.754465298999946, -53.462497653999947 ], [ -71.74242102799991, -53.223402601999908 ], [ -71.360218878999945, -53.116143487999921 ], [ -71.198581546999947, -52.923903591999931 ], [ -71.118764335999913, -52.9196357699999 ], [ -71.169285396999953, -52.812813005999942 ], [ -71.352114779999908, -52.807111447999944 ], [ -71.398793097999942, -52.72820403399993 ], [ -71.398629153999934, -52.831715458999952 ], [ -71.483957485999952, -52.824883721999925 ], [ -71.906232838999927, -53.010888517999945 ], [ -72.021962042999917, -53.125420830999929 ], [ -72.117054816999939, -53.12859465899993 ], [ -72.286000128999945, -53.029880466999941 ], [ -72.268950975999928, -53.071465752999927 ], [ -72.380034959999932, -53.050388278999947 ], [ -72.56314042899993, -53.078871351999908 ], [ -72.367095506999931, -53.068129164999903 ], [ -72.191395636999914, -53.180596612999921 ], [ -72.364572719999899, -53.180759372999944 ], [ -72.315785285999937, -53.20671965899993 ], [ -72.364572719999899, -53.222263278999947 ], [ -72.488026495999918, -53.187595309999949 ], [ -72.461984829999949, -53.229913018999923 ], [ -72.538197394999941, -53.197360934999949 ], [ -72.41234290299991, -53.256442966999941 ], [ -72.535878058999913, -53.270114841999941 ], [ -72.522206183999913, -53.366306247999944 ], [ -72.645130988999938, -53.317803643999923 ], [ -72.364572719999899, -53.536879164999903 ], [ -72.531727667999917, -53.542087497999944 ], [ -72.721424933999913, -53.462497653999947 ], [ -72.763172980999911, -53.387790622999944 ], [ -72.794667120999918, -53.440118096999925 ], [ -72.809559699999909, -53.386814059999949 ], [ -73.199086066999939, -53.240817966999941 ], [ -73.30304928299995, -53.153415622999944 ], [ -73.139149542999917, -53.187595309999949 ], [ -72.956369594999899, -53.160577080999929 ], [ -72.713286912999934, -53.29029713299991 ], [ -72.689198370999918, -53.240329684999949 ], [ -72.795969204999949, -53.173272393999923 ], [ -72.65257727799991, -53.153415622999944 ], [ -72.713978644999941, -53.105564059999949 ], [ -72.845082160999937, -53.150160414999903 ], [ -72.933745897999927, -53.10475025799991 ], [ -72.878488735999952, -53.016778252999927 ], [ -72.92642167899993, -53.024590752999927 ], [ -72.923980272999927, -52.88640715899993 ], [ -72.976470506999931, -52.838799737999921 ], [ -72.762440558999913, -52.769789320999905 ], [ -72.703480597999942, -52.707696221999925 ], [ -72.611317511999914, -52.774102471999925 ], [ -72.714833136999914, -52.869398695999905 ], [ -72.58820553299995, -52.795993747999944 ], [ -72.595855272999927, -52.834242445999905 ], [ -72.473988410999937, -52.806410414999903 ], [ -72.431263800999943, -52.856622002999927 ], [ -72.398060675999943, -52.783461195999905 ], [ -72.16087419899992, -52.6521177649999 ], [ -71.980140099999915, -52.645461079999905 ], [ -71.850528565999923, -52.694709557999943 ], [ -71.478102850999903, -52.646137732999932 ], [ -71.571611052999913, -52.561277867999934 ], [ -72.28156490799995, -52.513848565999922 ], [ -72.433461066999939, -52.618910414999903 ], [ -72.398060675999943, -52.618910414999903 ], [ -72.419260219999899, -52.653008721999925 ], [ -72.54914303299995, -52.591566664999903 ], [ -72.389637824999909, -52.507582289999903 ], [ -72.569976365999935, -52.556898695999905 ], [ -72.858021613999938, -52.502211195999905 ], [ -72.988352016999897, -52.704278252999927 ], [ -72.819203253999945, -52.586521091999941 ], [ -72.673898891999897, -52.652520440999922 ], [ -72.790842251999948, -52.752699476999908 ], [ -73.015614386999914, -52.841729424999926 ], [ -72.953602667999917, -52.893324476999908 ], [ -72.979562954999949, -53.054782809999949 ], [ -73.139719204999949, -53.099216403999947 ], [ -73.176665818999936, -53.015232028999947 ], [ -73.198475714999915, -53.104913018999923 ], [ -73.455962693999936, -52.986504815999922 ], [ -73.351429816999939, -52.99578215899993 ], [ -73.371937628999945, -52.965264580999929 ], [ -73.313872850999928, -52.934258721999925 ], [ -73.241566535999937, -52.961602471999925 ], [ -73.262074347999942, -52.92742278399993 ], [ -73.213856574999909, -52.887790622999944 ], [ -73.351429816999939, -52.885918877999927 ], [ -73.563710089999915, -52.797051690999922 ], [ -73.23306230399993, -52.790622653999947 ], [ -73.306630011999914, -52.715427341999941 ], [ -73.152699347999942, -52.633965752999927 ], [ -73.122141079999949, -52.55006275799991 ], [ -73.003977016999897, -52.55828215899993 ], [ -73.117990688999953, -52.532810153999947 ], [ -73.091623501999948, -52.49382903399993 ], [ -72.885853644999941, -52.525648695999905 ], [ -72.905832485999952, -52.496026299999926 ], [ -73.143544074999909, -52.490004164999903 ], [ -73.194976365999935, -52.429864190999922 ], [ -73.235340949999909, -52.496026299999926 ], [ -73.159657355999911, -52.56373463299991 ], [ -73.268910285999937, -52.673597914999903 ], [ -73.337757941999939, -52.646661065999922 ], [ -73.308461066999939, -52.584649346999925 ], [ -73.393625454999949, -52.544122002999927 ], [ -73.397328253999945, -52.636488539999903 ], [ -73.508697068999936, -52.656019789999903 ], [ -73.616444464999915, -52.749118747999944 ], [ -73.69953365799995, -52.71453215899993 ], [ -73.57054602799991, -52.632012627999927 ], [ -73.669585740999935, -52.643243096999925 ], [ -73.687855597999942, -52.597832940999922 ], [ -73.55337480399993, -52.551039320999905 ], [ -73.619252081999946, -52.520440362999921 ], [ -73.565500454999949, -52.478936455999929 ], [ -73.494862433999913, -52.475518487999921 ], [ -73.515288865999935, -52.420342705999929 ], [ -73.666167772999927, -52.424004815999922 ], [ -73.562977667999917, -52.322849216999941 ], [ -73.612660285999937, -52.277439059999949 ], [ -73.580555792999917, -52.208428643999923 ], [ -73.680409308999913, -52.145928643999923 ], [ -73.73501542899993, -52.029961846999925 ], [ -73.550119594999899, -52.186944268999923 ], [ -73.468332485999952, -52.169040622999944 ], [ -73.495716925999943, -52.131931247999944 ], [ -73.30304928299995, -52.221774997999944 ], [ -73.221791144999941, -52.179864190999922 ], [ -73.204090949999909, -52.108086846999925 ], [ -72.997792120999918, -52.064873955999929 ], [ -72.987456834999932, -52.142998955999929 ], [ -73.040882941999939, -52.148858330999929 ], [ -73.079253709999932, -52.237074476999908 ], [ -72.994536912999934, -52.186944268999923 ], [ -72.866444464999915, -52.256768487999921 ], [ -72.754872199999909, -52.056817315999922 ], [ -72.841175910999937, -52.105726820999905 ], [ -72.883697068999936, -52.198337497999944 ], [ -72.947377081999946, -52.166436455999929 ], [ -72.947377081999946, -52.049737237999921 ], [ -72.902333136999914, -52.064060153999947 ], [ -72.864857550999943, -51.95476653399993 ], [ -72.802805141999897, -51.937432549999926 ], [ -72.686675584999932, -51.988376559999949 ], [ -72.703480597999942, -52.060316664999903 ], [ -72.601389126999948, -52.111911716999941 ], [ -72.535878058999913, -52.221774997999944 ], [ -72.601714647999927, -52.339288018999923 ], [ -72.679025844999899, -52.323011976999908 ], [ -72.930531378999945, -52.448174737999921 ], [ -72.721424933999913, -52.406670830999929 ], [ -72.522206183999913, -52.448337497999944 ], [ -72.637562628999945, -52.397637627999927 ], [ -72.497141079999949, -52.315362237999921 ], [ -72.466949022999927, -52.204278252999927 ], [ -72.64867102799991, -52.049004815999922 ], [ -72.669667120999918, -51.961032809999949 ], [ -72.46898352799991, -51.929294528999947 ], [ -72.508371548999946, -51.837090752999927 ], [ -72.466949022999927, -51.789727471999925 ], [ -72.689035610999952, -51.59343840899993 ], [ -72.926258917999917, -51.54265715899993 ], [ -73.067941860999952, -51.478610934999949 ], [ -73.090972459999932, -51.420830987999921 ], [ -73.267648891999897, -51.480564059999949 ], [ -73.054310675999943, -51.502618096999925 ], [ -73.098255988999938, -51.60475025799991 ], [ -72.989165818999936, -51.52662525799991 ], [ -72.793812628999945, -51.596123955999929 ], [ -72.702951626999948, -51.698011976999908 ], [ -72.555246548999946, -51.729668877999927 ], [ -72.562408006999931, -51.778252862999921 ], [ -72.724110480999911, -51.838148695999905 ], [ -72.829741990999935, -51.767998955999929 ], [ -72.976673956999946, -51.76921965899993 ], [ -73.048817511999914, -51.696872653999947 ], [ -73.150786912999934, -51.703057549999926 ], [ -73.182443813999953, -51.637465101999908 ], [ -73.280018683999913, -51.606215101999908 ], [ -73.224476691999939, -51.710870049999926 ], [ -73.070057745999918, -51.724541924999926 ], [ -72.994536912999934, -51.789727471999925 ], [ -73.106027798999946, -51.744886976999908 ], [ -73.139149542999917, -51.76921965899993 ], [ -73.060373501999948, -51.76921965899993 ], [ -73.049794074999909, -51.83131275799991 ], [ -73.207427537999934, -51.879082940999922 ], [ -72.972401495999918, -51.821709893999923 ], [ -72.919422980999911, -51.858575127999927 ], [ -73.145334438999953, -51.940036716999941 ], [ -73.176665818999936, -52.081231377999927 ], [ -73.223703579999949, -52.09148528399993 ], [ -73.272613084999932, -52.039646091999941 ], [ -73.326771613999938, -51.726983330999929 ], [ -73.386219855999911, -51.652520440999922 ], [ -73.292836066999939, -52.16570403399993 ], [ -73.563547329999949, -52.039971612999921 ], [ -73.611480272999927, -51.934340101999908 ], [ -73.577992316999939, -51.926934502999927 ], [ -73.645578579999949, -51.848728122999944 ], [ -73.620920376999948, -51.81218840899993 ], [ -73.399810350999928, -52.015720309999949 ], [ -73.589182094999899, -51.749607028999947 ], [ -73.460682745999918, -51.686700127999927 ], [ -73.550119594999899, -51.721449476999908 ], [ -73.550119594999899, -51.680433851999908 ], [ -73.591664191999939, -51.721449476999908 ], [ -73.654855923999946, -51.688571872999944 ], [ -73.718902147999927, -51.775811455999929 ], [ -73.812001105999911, -51.688571872999944 ], [ -73.714588995999918, -51.638848565999922 ], [ -73.899525519999941, -51.625176690999922 ], [ -73.816965298999946, -51.536553643999923 ], [ -73.909250454999949, -51.526950778999947 ], [ -73.934315558999913, -51.406019789999903 ], [ -73.880360480999911, -51.367933851999908 ], [ -73.814035610999952, -51.392185153999947 ], [ -73.611887173999946, -51.625420830999929 ], [ -73.638824022999927, -51.536553643999923 ], [ -73.604603644999941, -51.51295338299991 ], [ -73.659982876999948, -51.494886976999908 ], [ -73.59788977799991, -51.432793877999927 ], [ -73.692209438999953, -51.414483330999929 ], [ -73.717681443999936, -51.288506768999923 ], [ -73.782826300999943, -51.234795830999929 ], [ -73.759592251999948, -51.19500090899993 ], [ -73.682728644999941, -51.275974216999941 ], [ -73.673573370999918, -51.187676690999922 ], [ -73.72883053299995, -51.179620049999926 ], [ -73.694081183999913, -51.139255466999941 ], [ -73.76984615799995, -51.118096612999921 ], [ -73.762847459999932, -51.163832289999903 ], [ -73.879383917999917, -51.237888278999947 ], [ -74.023304816999939, -51.11101653399993 ], [ -74.029896613999938, -51.207614841999941 ], [ -74.129505988999938, -51.187676690999922 ], [ -74.152943488999938, -51.060967705999929 ], [ -74.071441209999932, -50.953708591999941 ], [ -74.232248501999948, -51.035577080999929 ], [ -74.256418423999946, -50.939385674999926 ], [ -74.15103105399993, -50.872816664999903 ], [ -73.926828579999949, -50.864353122999944 ], [ -73.803334113999938, -50.960544528999947 ], [ -73.789662238999938, -50.919528903999947 ], [ -73.879709438999953, -50.834161065999922 ], [ -73.854603644999941, -50.797295830999929 ], [ -73.741851365999935, -50.820489190999922 ], [ -73.789662238999938, -50.79656340899993 ], [ -73.772938605999911, -50.670668226999908 ], [ -73.636708136999914, -50.63990650799991 ], [ -73.553212042999917, -50.707207940999922 ], [ -73.474354620999918, -50.672458591999941 ], [ -73.725087042999917, -50.559502862999921 ], [ -73.563710089999915, -50.404961846999925 ], [ -73.759388800999943, -50.515720309999949 ], [ -73.822621222999942, -50.757907809999949 ], [ -73.937123175999943, -50.827080987999921 ], [ -74.042713995999918, -50.822035414999903 ], [ -74.126088019999941, -50.762465101999908 ], [ -74.060170050999943, -50.712009372999944 ], [ -74.118641730999911, -50.68678150799991 ], [ -74.14712480399993, -50.728692315999922 ], [ -74.235951300999943, -50.604180596999925 ], [ -74.198719855999911, -50.559014580999929 ], [ -74.297352667999917, -50.480645440999922 ], [ -74.207997199999909, -50.463636976999908 ], [ -74.126088019999941, -50.590508721999925 ], [ -74.149810350999928, -50.483086846999925 ], [ -73.879709438999953, -50.542738539999903 ], [ -74.128895636999914, -50.422946872999944 ], [ -74.016224738999938, -50.363946221999925 ], [ -74.252552863999938, -50.440524997999944 ], [ -74.321278449999909, -50.38445403399993 ], [ -74.262928839999915, -50.317071221999925 ], [ -74.282704230999911, -50.26490650799991 ], [ -74.354847785999937, -50.359551690999922 ], [ -74.439320441999939, -50.35711028399993 ], [ -74.536366339999915, -50.296319268999923 ], [ -74.481760219999899, -50.248630466999941 ], [ -74.694650844999899, -50.183038018999923 ], [ -74.573719855999911, -50.09929778399993 ], [ -74.504383917999917, -50.131931247999944 ], [ -74.495432094999899, -50.076592705999929 ], [ -74.347645636999914, -50.086114190999922 ], [ -74.289906378999945, -50.131280205999929 ], [ -74.324696417999917, -50.172784112999921 ], [ -74.224964972999942, -50.197035414999903 ], [ -74.194406704999949, -50.259698174999926 ], [ -74.121449347999942, -50.223077080999929 ], [ -73.857899542999917, -50.289483330999929 ], [ -73.999134894999941, -50.241794528999947 ], [ -74.00609290299991, -50.201918226999908 ], [ -74.174712693999936, -50.19850025799991 ], [ -74.242176886999914, -50.080010674999926 ], [ -74.364857550999943, -49.990329684999949 ], [ -74.349436001999948, -49.935316664999903 ], [ -74.266346808999913, -49.932549737999921 ], [ -74.139475063999953, -50.015883070999905 ], [ -73.934315558999913, -50.028903903999947 ], [ -73.885894334999932, -50.076592705999929 ], [ -73.913197394999941, -50.007745049999926 ], [ -74.007679816999939, -49.991387627999927 ], [ -73.879709438999953, -49.919040622999944 ], [ -73.906361456999946, -49.856866143999923 ], [ -74.035959438999953, -49.964776299999926 ], [ -74.324696417999917, -49.871189059999949 ], [ -74.348255988999938, -49.792087497999944 ], [ -74.064035610999952, -49.713555596999925 ], [ -74.289906378999945, -49.74146900799991 ], [ -74.322255011999914, -49.63250090899993 ], [ -74.233876105999911, -49.566013278999947 ], [ -74.053822394999941, -49.539320570999905 ], [ -74.023019985999952, -49.617852471999925 ], [ -73.999134894999941, -49.559258721999925 ], [ -73.926828579999949, -49.569512627999927 ], [ -73.901356574999909, -49.649997653999947 ], [ -73.727853969999899, -49.781670830999929 ], [ -73.687855597999942, -49.720310153999947 ], [ -73.852528449999909, -49.653252862999921 ], [ -73.879709438999953, -49.528497002999927 ], [ -74.090972459999932, -49.497165622999944 ], [ -74.123524542999917, -49.422621351999908 ], [ -74.07445227799991, -49.261651299999926 ], [ -73.96353105399993, -49.32976653399993 ], [ -73.844878709999932, -49.349786065999922 ], [ -73.985096808999913, -49.273370049999926 ], [ -73.979725714999915, -49.164239190999922 ], [ -74.043527798999946, -49.082940362999921 ], [ -73.942250128999945, -49.023532809999949 ], [ -73.832875128999945, -49.032159112999921 ], [ -74.057484503999945, -49.012465101999908 ], [ -74.036040818999936, -49.144952080999929 ], [ -74.106434699999909, -49.221286716999941 ], [ -74.192860480999911, -49.208184502999927 ], [ -74.145904100999928, -49.30201588299991 ], [ -74.214914516999897, -49.52312590899993 ], [ -74.422759568999936, -49.384698174999926 ], [ -74.412709113999938, -49.218845309999949 ], [ -74.371896938999953, -49.186618747999944 ], [ -74.405506964999915, -49.067803643999923 ], [ -74.440785285999937, -49.090427341999941 ], [ -74.468658006999931, -49.031670830999929 ], [ -74.403146938999953, -48.987237237999921 ], [ -74.422474738999938, -48.934991143999923 ], [ -74.365630662999934, -48.932061455999929 ], [ -74.453480597999942, -48.830987237999921 ], [ -74.371896938999953, -48.719170830999929 ], [ -74.334828253999945, -48.755059502999927 ], [ -74.066725035931654, -48.741957988470404 ], [ -73.170447858999893, -49.250870019999937 ] ] ], [ [ [ -68.641997850999928, -54.799167575999945 ], [ -68.665842251999948, -54.88640715899993 ], [ -68.928578253999945, -54.778497002999927 ], [ -68.965687628999945, -54.78443775799991 ], [ -68.737863735999952, -54.896091403999947 ], [ -69.067005988999938, -54.948825778999947 ], [ -69.648304816999939, -54.822523695999905 ], [ -69.678822394999941, -54.787692966999941 ], [ -69.624379035999937, -54.760837497999944 ], [ -69.627064581999946, -54.692071221999925 ], [ -69.678822394999941, -54.764743747999944 ], [ -69.716053839999915, -54.689060153999947 ], [ -69.73078365799995, -54.803155205999929 ], [ -69.774403449999909, -54.715590101999908 ], [ -69.808990037999934, -54.810967705999929 ], [ -69.911610480999911, -54.818617445999905 ], [ -69.966623501999948, -54.778415622999944 ], [ -69.969553188999953, -54.676853122999944 ], [ -69.993275519999941, -54.835056247999944 ], [ -70.092844204999949, -54.849053643999923 ], [ -70.087147589999915, -54.77857838299991 ], [ -70.164865688999953, -54.845961195999905 ], [ -70.309437628999945, -54.838555596999925 ], [ -70.244536912999934, -54.689060153999947 ], [ -70.365345831999946, -54.83521900799991 ], [ -70.581166144999941, -54.77898528399993 ], [ -70.758778449999909, -54.840590101999908 ], [ -70.837025519999941, -54.787692966999941 ], [ -70.624582485999952, -54.731540622999944 ], [ -70.452870245999918, -54.633721612999921 ], [ -70.543080206999946, -54.623467705999929 ], [ -70.630970831999946, -54.667738539999903 ], [ -70.606353318999936, -54.703789971999925 ], [ -70.815907355999911, -54.750420830999929 ], [ -70.92210852799991, -54.71257903399993 ], [ -70.774322068999936, -54.681573174999926 ], [ -70.944813605999911, -54.672133070999905 ], [ -71.02757727799991, -54.77703215899993 ], [ -70.951568162999934, -54.616387627999927 ], [ -71.062367316999939, -54.592705987999921 ], [ -71.050038214999915, -54.657403252999927 ], [ -71.103342251999948, -54.633721612999921 ], [ -71.179676886999914, -54.702569268999923 ], [ -71.289662238999938, -54.676446221999925 ], [ -71.192697719999899, -54.626885674999926 ], [ -71.255767381999931, -54.613864841999941 ], [ -71.233631964999915, -54.531345309999949 ], [ -71.297963019999941, -54.559340101999908 ], [ -71.347075975999928, -54.517185153999947 ], [ -71.336048956999946, -54.565524997999944 ], [ -71.412464972999942, -54.579196872999944 ], [ -71.336048956999946, -54.606377862999921 ], [ -71.487863735999952, -54.687432549999926 ], [ -71.521066860999952, -54.661065362999921 ], [ -71.494292772999927, -54.592705987999921 ], [ -71.583119269999941, -54.654880466999941 ], [ -71.555775519999941, -54.585870049999926 ], [ -71.597767706999946, -54.580987237999921 ], [ -71.64517167899993, -54.654880466999941 ], [ -71.685047980999911, -54.634698174999926 ], [ -71.652007615999935, -54.599541924999926 ], [ -71.754465298999946, -54.592705987999921 ], [ -71.822661912999934, -54.654880466999941 ], [ -71.944325324999909, -54.654554945999905 ], [ -71.980946417999917, -54.613213799999926 ], [ -71.905262824999909, -54.613213799999926 ], [ -71.889759894999941, -54.568129164999903 ], [ -72.001454230999911, -54.571709893999923 ], [ -72.007720506999931, -54.505303643999923 ], [ -71.940012173999946, -54.510837497999944 ], [ -72.002349412999934, -54.459079684999949 ], [ -71.973500128999945, -54.448663018999923 ], [ -71.849761522999927, -54.538181247999944 ], [ -71.671864386999914, -54.571709893999923 ], [ -71.748199022999927, -54.510837497999944 ], [ -71.583119269999941, -54.545017184999949 ], [ -71.69359290299991, -54.469333591999941 ], [ -71.840687628999945, -54.465915622999944 ], [ -71.850656704999949, -54.414646091999941 ], [ -71.749134894999941, -54.397149346999925 ], [ -71.563221808999913, -54.510837497999944 ], [ -71.494292772999927, -54.476006768999923 ], [ -71.614125128999945, -54.410902601999908 ], [ -71.389271613999938, -54.457289320999905 ], [ -71.323068813999953, -54.427666924999926 ], [ -71.432932094999899, -54.400974216999941 ], [ -71.364613410999937, -54.372979424999926 ], [ -71.090240037999934, -54.510837497999944 ], [ -71.144886847999942, -54.435153903999947 ], [ -70.972401495999918, -54.469008070999905 ], [ -70.952504035999937, -54.338799737999921 ], [ -70.800648566999939, -54.315850518999923 ], [ -70.610463019999941, -54.338799737999921 ], [ -70.727162238999938, -54.427666924999926 ], [ -70.764393683999913, -54.599541924999926 ], [ -70.740223761999914, -54.551202080999929 ], [ -70.634022589999915, -54.600274346999925 ], [ -70.696929490999935, -54.494805596999925 ], [ -70.585194464999915, -54.390557549999926 ], [ -70.249419725999928, -54.575372002999927 ], [ -70.301991339999915, -54.496514580999929 ], [ -70.130726691999939, -54.545017184999949 ], [ -70.427642381999931, -54.437676690999922 ], [ -70.577707485999952, -54.274834893999923 ], [ -70.843251105999911, -54.263116143999923 ], [ -70.898508266999897, -54.181817315999922 ], [ -70.822743292999917, -54.195489190999922 ], [ -70.932687954999949, -54.113539320999905 ], [ -70.136870897999927, -54.427666924999926 ], [ -70.144642706999946, -54.391371351999908 ], [ -70.074818488999938, -54.369805596999925 ], [ -70.199045376999948, -54.320570570999905 ], [ -70.034494594999899, -54.256931247999944 ], [ -69.973011847999942, -54.297295830999929 ], [ -69.966867641999897, -54.379815362999921 ], [ -69.874867316999939, -54.420993747999944 ], [ -69.883656378999945, -54.503350518999923 ], [ -69.785227016999897, -54.484144789999903 ], [ -69.775380011999914, -54.554864190999922 ], [ -69.741322394999941, -54.477959893999923 ], [ -69.881947394999941, -54.312676690999922 ], [ -69.859120245999918, -54.280368747999944 ], [ -69.691883917999917, -54.317803643999923 ], [ -69.558583136999914, -54.436455987999921 ], [ -69.522043423999946, -54.436455987999921 ], [ -69.570871548999946, -54.372816664999903 ], [ -69.522938605999911, -54.337497653999947 ], [ -69.239979620999918, -54.441338799999926 ], [ -69.226673956999946, -54.476983330999929 ], [ -69.417469855999911, -54.623304945999905 ], [ -69.37718665299991, -54.681573174999926 ], [ -69.373036261999914, -54.615899346999925 ], [ -69.269439256999931, -54.532403252999927 ], [ -69.169911261999914, -54.578220309999949 ], [ -69.157460089999915, -54.453057549999926 ], [ -68.994943813999953, -54.46843840899993 ], [ -68.989003058999913, -54.431410414999903 ], [ -69.27961178299995, -54.32154713299991 ], [ -70.014027472999942, -54.113539320999905 ], [ -70.178212042999917, -53.833428643999923 ], [ -70.13695227799991, -53.738702080999929 ], [ -69.651439879999941, -53.636230524999917 ], [ -69.36084245099994, -53.521674508999922 ], [ -69.318612726999902, -53.450522830999944 ], [ -69.352650519999941, -53.355726820999905 ], [ -69.897822395999924, -53.386643750999951 ], [ -70.202707485999952, -53.468682549999926 ], [ -70.442534959999932, -53.362481377999927 ], [ -70.473540818999936, -53.309258721999925 ], [ -70.418992610999908, -53.01171639599994 ], [ -70.314865037999937, -52.968047700999932 ], [ -70.335238748999927, -53.051295798999945 ], [ -70.243452110999954, -53.061724858999924 ], [ -70.134229284999947, -53.011950621999915 ], [ -70.089174815999911, -52.91106302299994 ], [ -70.21939042899993, -52.865166924999926 ], [ -70.30089064099991, -52.914930227999946 ], [ -70.257201763999944, -52.868296175999944 ], [ -70.282659854999906, -52.798448676999953 ], [ -70.416127081999946, -52.758070570999905 ], [ -70.128615208999918, -52.732282481999903 ], [ -70.001133009999933, -52.841733788999932 ], [ -69.911399762999906, -52.847904273999916 ], [ -69.734351084999901, -52.774459190999949 ], [ -69.591011074999926, -52.641873410999949 ], [ -69.603871222999942, -52.52117278399993 ], [ -69.417565115999935, -52.451472415999945 ], [ -69.140248175999943, -52.683770440999922 ], [ -68.920656562999909, -52.640175252999938 ], [ -68.779026105999947, -52.548253849999924 ], [ -68.627616776477794, -52.639571698869695 ], [ -68.641881926766189, -54.78297131557072 ], [ -68.712391730999911, -54.770928643999923 ], [ -68.641997850999928, -54.799167575999945 ] ] ], [ [ [ -67.245106574999909, -55.839613539999903 ], [ -67.224110480999911, -55.897556247999944 ], [ -67.417062954999949, -55.833591403999947 ], [ -67.358550584999932, -55.810479424999926 ], [ -67.245106574999909, -55.839613539999903 ] ] ], [ [ [ -67.094309048999946, -55.826104424999926 ], [ -67.07843990799995, -55.910088799999926 ], [ -67.170033331999946, -55.873793226999908 ], [ -67.140370245999918, -55.817315362999921 ], [ -67.094309048999946, -55.826104424999926 ] ] ], [ [ [ -67.501616990999935, -55.821058851999908 ], [ -67.472013427999912, -55.8425992949999 ], [ -67.621842579999907, -55.9185042229999 ], [ -67.632030186999941, -55.859396381999943 ], [ -67.693558354999936, -55.88952097799995 ], [ -67.748408918999928, -55.849203520999936 ], [ -67.802810182999906, -55.897956432999933 ], [ -67.913944711999932, -55.836566116999904 ], [ -67.501616990999935, -55.821058851999908 ] ] ], [ [ [ -67.232085740999935, -55.771416924999926 ], [ -67.18781490799995, -55.756931247999944 ], [ -67.156971808999913, -55.778252862999921 ], [ -67.228505011999914, -55.798435153999947 ], [ -67.232085740999935, -55.771416924999926 ] ] ], [ [ [ -67.376088019999941, -55.750909112999921 ], [ -67.44554602799991, -55.762627862999921 ], [ -67.581532355999911, -55.709405205999929 ], [ -67.505848761999914, -55.654066664999903 ], [ -67.420643683999913, -55.707452080999929 ], [ -67.431996222999942, -55.595472914999903 ], [ -67.348703579999949, -55.575616143999923 ], [ -67.320871548999946, -55.654066664999903 ], [ -67.361805792999917, -55.706231377999927 ], [ -67.269927537999934, -55.716241143999923 ], [ -67.252552863999938, -55.763929945999905 ], [ -67.341379360999952, -55.791924737999921 ], [ -67.376088019999941, -55.750909112999921 ] ] ], [ [ [ -67.643137173999946, -55.49732838299991 ], [ -67.587757941999939, -55.585870049999926 ], [ -67.73859615799995, -55.61687590899993 ], [ -67.683949347999942, -55.565362237999921 ], [ -67.699370897999927, -55.505466403999947 ], [ -67.643137173999946, -55.49732838299991 ] ] ], [ [ [ -69.714507615999935, -55.34498463299991 ], [ -69.637318488999938, -55.38836028399993 ], [ -69.801747199999909, -55.407810153999947 ], [ -69.801747199999909, -55.332614841999941 ], [ -69.714507615999935, -55.34498463299991 ] ] ], [ [ [ -70.014027472999942, -55.30592213299991 ], [ -69.947824673999946, -55.283868096999925 ], [ -70.006459113999938, -55.374444268999923 ], [ -70.02765865799995, -55.318942966999941 ], [ -70.110218878999945, -55.29225025799991 ], [ -70.014027472999942, -55.30592213299991 ] ] ], [ [ [ -66.855336066999939, -55.27117278399993 ], [ -66.839588995999918, -55.302504164999903 ], [ -66.938059048999946, -55.334567966999941 ], [ -67.060170050999943, -55.326348565999922 ], [ -67.07445227799991, -55.278008721999925 ], [ -66.992258266999954, -55.228692315999922 ], [ -66.865305141999954, -55.233005466999941 ], [ -66.855336066999939, -55.27117278399993 ] ] ], [ [ [ -66.426747199999909, -55.185479424999926 ], [ -66.515492316999939, -55.264336846999925 ], [ -66.643055792999917, -55.264336846999925 ], [ -66.632191535999937, -55.205987237999921 ], [ -66.534820115999935, -55.162774346999925 ], [ -66.426747199999909, -55.185479424999926 ] ] ], [ [ [ -66.869007941999939, -55.024102471999925 ], [ -66.80687415299991, -55.112888278999947 ], [ -67.070912238999938, -55.00945403399993 ], [ -67.023915167999917, -54.992445570999905 ], [ -66.869007941999939, -55.024102471999925 ] ] ], [ [ [ -67.999256964999915, -55.627536716999941 ], [ -68.033355272999927, -55.661553643999923 ], [ -67.985585089999915, -55.675225518999923 ], [ -68.09829667899993, -55.712090752999927 ], [ -68.153309699999909, -55.596286716999941 ], [ -68.289784308999913, -55.610121351999908 ], [ -68.252512173999946, -55.524509372999944 ], [ -68.353627081999946, -55.475274346999925 ], [ -68.500477667999917, -55.490980726999908 ], [ -68.616810675999943, -55.407810153999947 ], [ -68.602528449999909, -55.462334893999923 ], [ -68.801136847999942, -55.421319268999923 ], [ -68.768299933999913, -55.492608330999929 ], [ -68.865345831999946, -55.505303643999923 ], [ -68.965687628999945, -55.407810153999947 ], [ -68.753407355999911, -55.380466403999947 ], [ -68.808664516999897, -55.359958591999941 ], [ -68.760243292999917, -55.332614841999941 ], [ -68.971302863999938, -55.377129815999922 ], [ -68.801136847999942, -55.188653252999927 ], [ -68.986683722999942, -55.265232028999947 ], [ -69.116607225999928, -55.205661716999941 ], [ -69.122670050999943, -55.147637627999927 ], [ -69.134103969999899, -55.24773528399993 ], [ -69.212717251999948, -55.21648528399993 ], [ -69.239979620999918, -55.127129815999922 ], [ -69.438628709999932, -55.161879164999903 ], [ -69.287831183999913, -55.168145440999922 ], [ -69.267323370999918, -55.23015715899993 ], [ -69.479603644999941, -55.236993096999925 ], [ -69.459095831999946, -55.30592213299991 ], [ -69.280384894999941, -55.318942966999941 ], [ -69.308257615999935, -55.359958591999941 ], [ -69.240589972999942, -55.369561455999929 ], [ -69.300852016999897, -55.428155205999929 ], [ -69.13703365799995, -55.441827080999929 ], [ -69.161610480999911, -55.514336846999925 ], [ -69.339222785999937, -55.474867445999905 ], [ -69.362863735999952, -55.388929945999905 ], [ -69.437082485999952, -55.491306247999944 ], [ -69.451527472999942, -55.408868096999925 ], [ -69.520578579999949, -55.393975518999923 ], [ -69.416086391999897, -55.353122653999947 ], [ -69.60765540299991, -55.365492445999905 ], [ -69.620187954999949, -55.329522393999923 ], [ -69.788075324999909, -55.30592213299991 ], [ -69.568959113999938, -55.27117278399993 ], [ -69.673980272999927, -55.260349216999941 ], [ -69.500070766999897, -55.174981377999927 ], [ -69.848052537999934, -55.257907809999949 ], [ -69.924672003999945, -55.222751559999949 ], [ -69.852406378999945, -55.215508721999925 ], [ -69.911610480999911, -55.196058851999908 ], [ -69.842681443999936, -55.168145440999922 ], [ -70.031076626999948, -55.147637627999927 ], [ -69.885975714999915, -55.063571872999944 ], [ -69.587473110999952, -55.041192315999922 ], [ -69.582020636999914, -55.154473565999922 ], [ -69.541493292999917, -55.145114841999941 ], [ -69.52757727799991, -55.031996351999908 ], [ -69.32876542899993, -55.05201588299991 ], [ -69.383412238999938, -55.016696872999944 ], [ -68.441151495999918, -54.939711195999905 ], [ -68.335072394999941, -55.010430596999925 ], [ -68.334828253999945, -55.062432549999926 ], [ -68.441395636999914, -55.045668226999908 ], [ -68.431263800999943, -55.078789971999925 ], [ -68.510812954999949, -55.112399997999944 ], [ -68.602609829999949, -55.06609465899993 ], [ -68.569447394999941, -55.135430596999925 ], [ -68.616078253999945, -55.152276299999926 ], [ -69.061879035999937, -55.04461028399993 ], [ -68.786610480999911, -55.165215752999927 ], [ -68.38312740799995, -55.184502862999921 ], [ -68.20921790299991, -55.262872002999927 ], [ -68.500070766999954, -55.311455987999921 ], [ -68.616810675999943, -55.30592213299991 ], [ -68.660959438999953, -55.25750090899993 ], [ -68.745961066999939, -55.27117278399993 ], [ -68.561594204999949, -55.326348565999922 ], [ -68.602528449999909, -55.359958591999941 ], [ -68.447987433999913, -55.326348565999922 ], [ -68.345326300999943, -55.344008070999905 ], [ -68.324370897999927, -55.399509372999944 ], [ -68.146473761999914, -55.404392184999949 ], [ -68.177357550999943, -55.462334893999923 ], [ -68.057484503999945, -55.469008070999905 ], [ -68.101389126999948, -55.527601820999905 ], [ -67.96515865799995, -55.593357028999947 ], [ -67.999256964999915, -55.627536716999941 ] ] ], [ [ [ -67.883168097999942, -55.24382903399993 ], [ -67.73859615799995, -55.236993096999925 ], [ -67.898101365999935, -55.168715101999908 ], [ -67.985585089999915, -55.223565362999921 ], [ -68.13508053299995, -55.218845309999949 ], [ -68.186350063999953, -54.97820403399993 ], [ -68.328846808999913, -54.990655205999929 ], [ -68.360503709999932, -54.93092213299991 ], [ -67.301828579999949, -54.928887627999927 ], [ -67.183094855999911, -54.96803150799991 ], [ -67.05337480399993, -55.093682549999926 ], [ -67.088490363999938, -55.190524997999944 ], [ -67.270619269999941, -55.306898695999905 ], [ -67.451161261999914, -55.271579684999949 ], [ -67.423247850999928, -55.21648528399993 ], [ -67.502919074999909, -55.172133070999905 ], [ -67.608794725999928, -55.188653252999927 ], [ -67.647368943999936, -55.261488539999903 ], [ -67.883168097999942, -55.24382903399993 ] ] ], [ [ [ -70.29515540299991, -55.082452080999929 ], [ -70.267241990999935, -55.112888278999947 ], [ -70.338449673999946, -55.128513278999947 ], [ -70.418080206999946, -55.078789971999925 ], [ -70.397572394999941, -55.106622002999927 ], [ -70.446034308999913, -55.127129815999922 ], [ -70.370269334999932, -55.161879164999903 ], [ -70.49445553299995, -55.209649346999925 ], [ -70.538482225999928, -55.154473565999922 ], [ -70.548085089999915, -55.213555596999925 ], [ -70.564076300999943, -55.14031340899993 ], [ -70.513661261999914, -55.106622002999927 ], [ -70.59007727799991, -55.05046965899993 ], [ -70.715809699999909, -55.122816664999903 ], [ -70.728993292999917, -55.05396900799991 ], [ -70.815337693999936, -55.086195570999905 ], [ -71.007150844999899, -55.04461028399993 ], [ -70.919016079999949, -54.990655205999929 ], [ -71.012847459999932, -54.965020440999922 ], [ -70.864409959999932, -54.930840752999927 ], [ -70.795480923999946, -54.976332289999903 ], [ -70.788563605999911, -54.932224216999941 ], [ -70.562652147999927, -54.968926690999922 ], [ -70.610463019999941, -54.942152601999908 ], [ -70.350453253999945, -54.893731377999927 ], [ -70.315663214999915, -54.907972914999903 ], [ -70.493804490999935, -54.942152601999908 ], [ -70.524525519999941, -54.996758721999925 ], [ -70.729847785999937, -55.01336028399993 ], [ -70.309437628999945, -55.027927341999941 ], [ -70.277740037999934, -55.04851653399993 ], [ -70.342925584999932, -55.069105726999908 ], [ -70.29515540299991, -55.082452080999929 ] ] ], [ [ [ -69.904164191999939, -54.996758721999925 ], [ -69.950347459999932, -54.952894789999903 ], [ -69.842681443999936, -54.942152601999908 ], [ -69.915598110999952, -54.886895440999922 ], [ -69.836333787999934, -54.872247002999927 ], [ -69.774403449999909, -54.955824476999908 ], [ -69.713490363999938, -54.948825778999947 ], [ -69.733469204999949, -54.914239190999922 ], [ -69.691883917999917, -54.914239190999922 ], [ -69.774403449999909, -54.879489841999941 ], [ -69.728342251999948, -54.86451588299991 ], [ -69.513742641999897, -54.893731377999927 ], [ -69.530018683999913, -54.946058851999908 ], [ -69.426380988999938, -54.899590752999927 ], [ -69.16429602799991, -54.955824476999908 ], [ -69.776437954999949, -55.034600518999923 ], [ -69.917795376999948, -55.03834400799991 ], [ -69.904164191999939, -54.996758721999925 ] ] ], [ [ [ -70.421783006999931, -54.845961195999905 ], [ -70.400990363999938, -54.873304945999905 ], [ -70.580881313999953, -54.897881768999923 ], [ -70.747670050999943, -54.873304945999905 ], [ -70.421783006999931, -54.845961195999905 ] ] ], [ [ [ -70.983794725999928, -54.928480726999908 ], [ -71.151722785999937, -54.934177341999941 ], [ -71.090240037999934, -54.907972914999903 ], [ -71.279042120999918, -54.865411065999922 ], [ -71.350982225999928, -54.95435963299991 ], [ -71.33462480399993, -54.902276299999926 ], [ -71.402821417999917, -54.94264088299991 ], [ -71.459584113999938, -54.879489841999941 ], [ -71.404123501999948, -54.829847914999903 ], [ -71.165394660999937, -54.832289320999905 ], [ -71.077870245999918, -54.88014088299991 ], [ -70.946888800999943, -54.873304945999905 ], [ -70.966175910999937, -54.907972914999903 ], [ -70.911529100999928, -54.921075127999927 ], [ -70.983794725999928, -54.928480726999908 ] ] ], [ [ [ -71.946848110999952, -54.702569268999923 ], [ -71.926380988999938, -54.736748955999929 ], [ -71.997466600999928, -54.753106377999927 ], [ -71.991525844999899, -54.69890715899993 ], [ -72.104318813999953, -54.644789320999905 ], [ -72.028187628999945, -54.629327080999929 ], [ -71.946848110999952, -54.702569268999923 ] ] ], [ [ [ -72.339833136999914, -54.331475518999923 ], [ -72.30532792899993, -54.365166924999926 ], [ -72.378814256999931, -54.352634372999944 ], [ -72.360829230999911, -54.379815362999921 ], [ -72.41234290299991, -54.366794528999947 ], [ -72.470692511999914, -54.427666924999926 ], [ -72.541737433999913, -54.34303150799991 ], [ -72.415882941999939, -54.304131768999923 ], [ -72.339833136999914, -54.331475518999923 ] ] ], [ [ [ -70.384592251999948, -54.188083591999941 ], [ -70.28774980399993, -54.188083591999941 ], [ -70.218658006999931, -54.234633070999905 ], [ -70.339751756999931, -54.265801690999922 ], [ -70.521107550999943, -54.174411716999941 ], [ -70.384592251999948, -54.188083591999941 ] ] ], [ [ [ -72.296945766999897, -54.078789971999925 ], [ -72.206288214999915, -54.14771900799991 ], [ -72.296742316999939, -54.200941664999903 ], [ -72.301503058999913, -54.251397393999923 ], [ -72.501698370999918, -54.242771091999941 ], [ -72.515370245999918, -54.202325127999927 ], [ -72.296945766999897, -54.113539320999905 ], [ -72.393137173999946, -54.094496351999908 ], [ -72.296945766999897, -54.078789971999925 ] ] ], [ [ [ -73.180083787999934, -54.07195403399993 ], [ -73.178456183999913, -54.127211195999905 ], [ -73.313384568999936, -54.121189059999949 ], [ -73.337391730999911, -54.065850518999923 ], [ -73.474354620999918, -54.07195403399993 ], [ -73.358265753999945, -54.023614190999922 ], [ -73.180083787999934, -54.07195403399993 ] ] ], [ [ [ -71.630930141999897, -54.078789971999925 ], [ -71.657053188999953, -53.983168226999908 ], [ -71.612172003999945, -53.948011976999908 ], [ -71.514800584999932, -53.989434502999927 ], [ -71.463286912999934, -53.941582940999922 ], [ -71.396351691999939, -54.062758070999905 ], [ -71.398793097999942, -53.975762627999927 ], [ -71.337961391999897, -53.97625090899993 ], [ -71.282093878999945, -54.009942315999922 ], [ -71.288929816999939, -54.106133721999925 ], [ -71.221058722999942, -54.184665622999944 ], [ -71.179676886999914, -54.08562590899993 ], [ -71.155140753999945, -54.155368747999944 ], [ -71.112456834999932, -54.070489190999922 ], [ -71.016224738999938, -54.09539153399993 ], [ -71.062367316999939, -54.202325127999927 ], [ -71.004953579999949, -54.166436455999929 ], [ -71.02798417899993, -54.237399997999944 ], [ -70.990142381999931, -54.265801690999922 ], [ -71.062367316999939, -54.291110934999949 ], [ -71.056467251999948, -54.330010674999926 ], [ -71.157948370999918, -54.297295830999929 ], [ -71.082834438999953, -54.335137627999927 ], [ -71.106516079999949, -54.37664153399993 ], [ -71.176828579999949, -54.327732028999947 ], [ -71.207508917999917, -54.369235934999949 ], [ -71.357818162999934, -54.297295830999929 ], [ -71.24054928299995, -54.277439059999949 ], [ -71.21320553299995, -54.229099216999941 ], [ -71.300770636999914, -54.26140715899993 ], [ -71.331695115999935, -54.204034112999921 ], [ -71.354807094999899, -54.244561455999929 ], [ -71.411000128999945, -54.233330987999921 ], [ -71.44595292899993, -54.185316664999903 ], [ -71.371449347999942, -54.153903903999947 ], [ -71.416615363999938, -54.110039971999925 ], [ -71.507964647999927, -54.14031340899993 ], [ -71.481312628999945, -54.171319268999923 ], [ -71.542144334999932, -54.269952080999929 ], [ -71.596791144999941, -54.229099216999941 ], [ -71.549631313999953, -54.181817315999922 ], [ -71.651519334999932, -54.232028903999947 ], [ -71.699818488999938, -54.166192315999922 ], [ -71.59634355399993, -54.087823174999926 ], [ -71.630930141999897, -54.078789971999925 ] ] ], [ [ [ -72.015126105999911, -54.202325127999927 ], [ -72.110707160999937, -54.153903903999947 ], [ -72.042388475999928, -54.14031340899993 ], [ -72.124379035999937, -54.133477471999925 ], [ -72.042388475999928, -54.113539320999905 ], [ -72.103871222999942, -54.058363539999903 ], [ -72.20531165299991, -54.091892184999949 ], [ -72.203195766999897, -53.996270440999922 ], [ -72.259103969999899, -53.929864190999922 ], [ -72.128041144999941, -53.934177341999941 ], [ -72.06476803299995, -53.983575127999927 ], [ -72.083404100999928, -53.94850025799991 ], [ -72.042388475999928, -53.962090752999927 ], [ -71.945708787999934, -53.85279713299991 ], [ -71.830148891999897, -53.920586846999925 ], [ -71.85187740799995, -53.974053643999923 ], [ -71.792591925999943, -53.897067966999941 ], [ -71.652902798999946, -53.926364841999941 ], [ -71.792225714999915, -53.997979424999926 ], [ -71.700591600999928, -53.985446872999944 ], [ -71.702015753999945, -54.030694268999923 ], [ -71.768666144999941, -54.051446221999925 ], [ -71.652007615999935, -54.089043877999927 ], [ -71.766102667999917, -54.163995049999926 ], [ -71.952300584999932, -54.01490650799991 ], [ -71.915516730999911, -54.116794528999947 ], [ -71.74445553299995, -54.231052341999941 ], [ -71.871083136999914, -54.283623955999929 ], [ -71.830148891999897, -54.331475518999923 ], [ -71.987863735999952, -54.317803643999923 ], [ -71.905262824999909, -54.229099216999941 ], [ -72.015126105999911, -54.202325127999927 ] ] ], [ [ [ -70.455035868999914, -53.611598014999913 ], [ -70.419718551999949, -53.871226476999936 ], [ -70.452219204999949, -53.886895440999922 ], [ -70.34279526499995, -54.028068898999948 ], [ -70.439252421999925, -54.060409171999936 ], [ -70.669961948999912, -53.950341516999913 ], [ -70.568918423999946, -54.065118096999925 ], [ -70.540435350999928, -54.221612237999921 ], [ -70.822743292999917, -54.113539320999905 ], [ -70.884185350999928, -54.02703215899993 ], [ -70.881505322999942, -53.842263989999935 ], [ -70.606114426999909, -53.865125201999945 ], [ -70.60054127099994, -53.829152182999906 ], [ -70.699289516999897, -53.787204684999949 ], [ -70.712880011999914, -53.701429945999905 ], [ -70.566453036999917, -53.626053264999939 ], [ -70.535552537999934, -53.560479424999926 ], [ -70.469534061999923, -53.566314954999939 ], [ -70.455035868999914, -53.611598014999913 ] ] ], [ [ [ -73.82445227799991, -53.472100518999923 ], [ -73.706450975999928, -53.508233330999929 ], [ -73.687855597999942, -53.523207289999903 ], [ -73.848540818999936, -53.588311455999929 ], [ -73.82445227799991, -53.536879164999903 ], [ -73.892323370999918, -53.526299737999921 ], [ -73.833363410999937, -53.505791924999926 ], [ -73.854847785999937, -53.448174737999921 ], [ -73.82445227799991, -53.472100518999923 ] ] ], [ [ [ -73.392445441999939, -53.413995049999926 ], [ -73.509103969999899, -53.475518487999921 ], [ -73.392445441999939, -53.530694268999923 ], [ -73.481800910999937, -53.571709893999923 ], [ -73.54328365799995, -53.510349216999941 ], [ -73.577992316999939, -53.544366143999923 ], [ -73.803334113999938, -53.434502862999921 ], [ -73.574940558999913, -53.491143487999921 ], [ -73.619007941999939, -53.455010674999926 ], [ -73.537017381999931, -53.455010674999926 ], [ -73.592600063999953, -53.385837497999944 ], [ -73.392445441999939, -53.413995049999926 ] ] ], [ [ [ -72.529652472999942, -54.075372002999927 ], [ -72.574370897999927, -54.095472914999903 ], [ -72.635487433999913, -54.023614190999922 ], [ -72.706898566999939, -54.103285414999903 ], [ -72.843088344999899, -54.133558851999908 ], [ -72.926258917999917, -54.119805596999925 ], [ -72.88508053299995, -54.083916924999926 ], [ -73.008859829999949, -54.092461846999925 ], [ -72.795969204999949, -54.058363539999903 ], [ -72.880726691999939, -54.03443775799991 ], [ -72.762440558999913, -54.030450127999927 ], [ -72.823841925999943, -53.996270440999922 ], [ -72.77603105399993, -53.975762627999927 ], [ -72.850575324999909, -53.955254815999922 ], [ -72.645130988999938, -53.859633070999905 ], [ -72.768625454999949, -53.87273528399993 ], [ -72.727650519999941, -53.838636976999908 ], [ -72.809559699999909, -53.859633070999905 ], [ -72.801665818999936, -53.817478122999944 ], [ -73.007313605999911, -53.873711846999925 ], [ -73.056019660999937, -53.812758070999905 ], [ -73.104400193999936, -53.934177341999941 ], [ -73.036203579999949, -53.98601653399993 ], [ -73.098255988999938, -54.037855726999908 ], [ -73.308949347999942, -53.973809502999927 ], [ -73.337757941999939, -53.955254815999922 ], [ -73.236398891999897, -53.896579684999949 ], [ -73.313059048999946, -53.844496351999908 ], [ -73.252837693999936, -53.786065362999921 ], [ -73.310454881999931, -53.742364190999922 ], [ -73.245350714999915, -53.715752862999921 ], [ -73.591664191999939, -53.756036065999922 ], [ -73.484852667999917, -53.70086028399993 ], [ -73.608754035999937, -53.656833591999941 ], [ -73.615345831999946, -53.614027601999908 ], [ -73.435454881999931, -53.563246351999908 ], [ -73.204213019999941, -53.666192315999922 ], [ -72.952870245999918, -53.664483330999929 ], [ -72.958485480999911, -53.633233330999929 ], [ -73.080799933999913, -53.648207289999903 ], [ -73.029286261999914, -53.584730726999908 ], [ -73.134836391999897, -53.646254164999903 ], [ -73.258656378999945, -53.635186455999929 ], [ -73.29124915299991, -53.605889580999929 ], [ -73.262074347999942, -53.558038018999923 ], [ -73.420318162999934, -53.478936455999929 ], [ -73.077137824999909, -53.530694268999923 ], [ -73.175160285999937, -53.420830987999921 ], [ -73.037709113999938, -53.385511976999908 ], [ -73.002023891999897, -53.493259372999944 ], [ -73.015614386999914, -53.407321872999944 ], [ -72.913238084999932, -53.42701588299991 ], [ -72.940988735999952, -53.518324476999908 ], [ -72.872547980999911, -53.53484465899993 ], [ -72.913238084999932, -53.623223565999922 ], [ -72.884144660999937, -53.68132903399993 ], [ -72.81704667899993, -53.564873955999929 ], [ -72.858469204999949, -53.452732028999947 ], [ -72.734486456999946, -53.516534112999921 ], [ -72.678578253999945, -53.673272393999923 ], [ -72.630482550999943, -53.659926039999903 ], [ -72.673003709999932, -53.536879164999903 ], [ -72.464182094999899, -53.575127862999921 ], [ -72.397287563999953, -53.633477471999925 ], [ -72.48468990799995, -53.674004815999922 ], [ -72.453277147999927, -53.742364190999922 ], [ -72.373036261999914, -53.687758070999905 ], [ -72.138661261999914, -53.797621351999908 ], [ -72.250884568999936, -53.877536716999941 ], [ -72.391835089999915, -53.84539153399993 ], [ -72.34406490799995, -53.910088799999926 ], [ -72.419789191999939, -53.897067966999941 ], [ -72.37140865799995, -53.94850025799991 ], [ -72.419789191999939, -53.969496351999908 ], [ -72.323597785999937, -53.989434502999927 ], [ -72.329904751999948, -54.034600518999923 ], [ -72.454213019999941, -54.038262627999927 ], [ -72.453277147999927, -53.989434502999927 ], [ -72.515370245999918, -53.982598565999922 ], [ -72.529652472999942, -54.075372002999927 ] ] ], [ [ [ -74.145904100999928, -53.242771091999941 ], [ -74.058094855999911, -53.250258070999905 ], [ -74.116118943999936, -53.307386976999908 ], [ -74.242176886999914, -53.310967705999929 ], [ -74.145904100999928, -53.242771091999941 ] ] ], [ [ [ -73.433420376999948, -52.865411065999922 ], [ -73.378773566999939, -52.910332940999922 ], [ -73.419300910999937, -52.957696221999925 ], [ -73.501942511999914, -52.885918877999927 ], [ -73.81078040299991, -52.91375090899993 ], [ -73.684559699999909, -52.849704684999949 ], [ -73.601307745999918, -52.865411065999922 ], [ -73.611724412999934, -52.821709893999923 ], [ -73.433420376999948, -52.865411065999922 ] ] ], [ [ [ -73.207427537999934, -53.317803643999923 ], [ -73.090809699999909, -53.355726820999905 ], [ -73.317290818999936, -53.352634372999944 ], [ -73.420318162999934, -53.283135674999926 ], [ -73.58421790299991, -53.317803643999923 ], [ -73.603627081999946, -53.293226820999905 ], [ -73.494862433999913, -53.290622653999947 ], [ -73.880441860999952, -53.057712497999944 ], [ -74.057199673999946, -53.057793877999927 ], [ -74.016224738999938, -53.085137627999927 ], [ -74.086293097999942, -53.104913018999923 ], [ -74.248931443999936, -53.037286065999922 ], [ -74.239857550999943, -53.082940362999921 ], [ -74.318348761999914, -53.09734465899993 ], [ -74.330922003999945, -53.037286065999922 ], [ -74.407215949999909, -53.029880466999941 ], [ -74.407215949999909, -52.969008070999905 ], [ -74.596547003999945, -52.922946872999944 ], [ -74.571156378999945, -52.851739190999922 ], [ -74.749867316999939, -52.75554778399993 ], [ -74.674427863999938, -52.721286716999941 ], [ -74.370961066999939, -52.872653903999947 ], [ -74.407215949999909, -52.91375090899993 ], [ -74.358794725999928, -52.947930596999925 ], [ -74.188303188999953, -52.940524997999944 ], [ -74.142974412999934, -52.989678643999923 ], [ -74.083851691999939, -52.961602471999925 ], [ -74.132883266999897, -52.934258721999925 ], [ -74.074574347999942, -52.947930596999925 ], [ -73.938221808999913, -52.996189059999949 ], [ -73.96157792899993, -53.023614190999922 ], [ -73.875884568999936, -53.00318775799991 ], [ -73.628895636999914, -53.146579684999949 ], [ -73.659982876999948, -53.057793877999927 ], [ -73.62328040299991, -53.05982838299991 ], [ -73.551177537999934, -53.11842213299991 ], [ -73.577992316999939, -53.187595309999949 ], [ -73.516346808999913, -53.26140715899993 ], [ -73.468129035999937, -53.222263278999947 ], [ -73.497710740999935, -53.143243096999925 ], [ -73.459543423999946, -53.132907809999949 ], [ -73.311675584999932, -53.238864841999941 ], [ -73.366037563999953, -53.27117278399993 ], [ -73.266468878999945, -53.268731377999927 ], [ -73.207427537999934, -53.317803643999923 ] ] ], [ [ [ -73.330962693999936, -52.694024346999925 ], [ -73.369211391999897, -52.728610934999949 ], [ -73.399810350999928, -52.72820403399993 ], [ -73.371937628999945, -52.707696221999925 ], [ -73.330962693999936, -52.694024346999925 ] ] ], [ [ [ -73.837391730999911, -52.70086028399993 ], [ -73.954741990999935, -52.707696221999925 ], [ -73.844878709999932, -52.597832940999922 ], [ -73.982045050999943, -52.653008721999925 ], [ -73.872181769999941, -52.55006275799991 ], [ -74.1234192739999, -52.706616519999955 ], [ -74.184368000999939, -52.586800723999943 ], [ -74.049712693999936, -52.56373463299991 ], [ -73.943999463999944, -52.482787733999942 ], [ -74.034209823999902, -52.475987113999906 ], [ -74.029728727999952, -52.429917726999918 ], [ -73.725168423999946, -52.404717705999929 ], [ -73.676991339999915, -52.485121351999908 ], [ -73.78734290299991, -52.554294528999947 ], [ -73.748524542999917, -52.627862237999921 ], [ -73.837391730999911, -52.70086028399993 ] ] ], [ [ [ -74.672565600999917, -52.390548821999914 ], [ -74.713277681999898, -52.34282817299993 ], [ -74.81541341399992, -52.350446949999935 ], [ -74.806660388999944, -52.284244089999902 ], [ -74.911610480999911, -52.20281340899993 ], [ -74.815174933999913, -52.236586195999905 ], [ -74.620676235999952, -52.204278252999927 ], [ -74.544421839999927, -52.246159275999901 ], [ -74.593838670999901, -52.394820257999925 ], [ -74.672565600999917, -52.390548821999914 ] ] ], [ [ [ -73.76984615799995, -52.379327080999929 ], [ -73.872670050999943, -52.376153252999927 ], [ -73.82445227799991, -52.338474216999941 ], [ -74.092762824999909, -52.166599216999941 ], [ -74.042225714999915, -52.141289971999925 ], [ -73.815337693999936, -52.241143487999921 ], [ -73.76984615799995, -52.379327080999929 ] ] ], [ [ [ -74.122547980999911, -52.39771900799991 ], [ -74.245350714999915, -52.316582940999922 ], [ -74.193714972999942, -52.280043226999908 ], [ -74.235951300999943, -52.248304945999905 ], [ -74.207102016999897, -52.226332289999903 ], [ -74.104969855999911, -52.248304945999905 ], [ -74.221669074999909, -52.186944268999923 ], [ -74.145904100999928, -52.193780205999929 ], [ -74.416859503999945, -52.129001559999949 ], [ -74.286773240999935, -52.088636976999908 ], [ -73.935699022999927, -52.324883721999925 ], [ -74.122547980999911, -52.39771900799991 ] ] ], [ [ [ -74.790842251999948, -52.179457289999903 ], [ -74.793853318999936, -52.123955987999921 ], [ -74.60179602799991, -52.064060153999947 ], [ -74.671945766999897, -52.163018487999921 ], [ -74.790842251999948, -52.179457289999903 ] ] ], [ [ [ -74.344553188999953, -52.064060153999947 ], [ -74.387806769999941, -52.077243747999944 ], [ -74.407215949999909, -52.043064059999949 ], [ -74.359730597999942, -52.056817315999922 ], [ -74.344553188999953, -52.064060153999947 ] ] ], [ [ [ -74.492298956999946, -51.978692315999922 ], [ -74.514068162999934, -52.005303643999923 ], [ -74.735585089999915, -52.084567966999941 ], [ -74.543812628999945, -51.920668226999908 ], [ -74.492298956999946, -51.978692315999922 ] ] ], [ [ [ -73.70767167899993, -52.186944268999923 ], [ -73.694081183999913, -52.242282809999949 ], [ -73.871245897999927, -52.094903252999927 ], [ -74.090240037999934, -52.010023695999905 ], [ -74.043527798999946, -52.008884372999944 ], [ -74.110218878999945, -51.968926690999922 ], [ -74.09439042899993, -51.92701588299991 ], [ -74.034982876999948, -51.914483330999929 ], [ -73.784006313999953, -52.059665622999944 ], [ -73.70767167899993, -52.186944268999923 ] ] ], [ [ [ -74.749867316999939, -52.043064059999949 ], [ -74.850575324999909, -52.13014088299991 ], [ -74.896351691999939, -52.113051039999903 ], [ -74.783355272999927, -52.008884372999944 ], [ -74.844878709999932, -51.996758721999925 ], [ -74.750884568999936, -51.833916924999926 ], [ -74.72874915299991, -51.872247002999927 ], [ -74.598459438999953, -51.837497653999947 ], [ -74.749867316999939, -52.043064059999949 ] ] ], [ [ [ -75.061146613999938, -51.882256768999923 ], [ -75.116851365999935, -51.894138278999947 ], [ -75.095366990999935, -51.776462497999944 ], [ -74.98265540299991, -51.721449476999908 ], [ -75.000884568999936, -51.843845309999949 ], [ -75.061146613999938, -51.882256768999923 ] ] ], [ [ [ -74.434559699999909, -51.844903252999927 ], [ -74.409657355999911, -51.808689059999949 ], [ -74.502837693999936, -51.707207940999922 ], [ -74.163075324999909, -51.855564059999949 ], [ -74.221669074999909, -51.872247002999927 ], [ -74.096302863999938, -51.877373955999929 ], [ -74.194732225999928, -51.950290622999944 ], [ -74.434559699999909, -51.844903252999927 ] ] ], [ [ [ -73.789662238999938, -51.735039971999925 ], [ -73.771555141999897, -51.781019789999903 ], [ -73.838775193999936, -51.812595309999949 ], [ -73.940500454999949, -51.663181247999944 ], [ -73.789662238999938, -51.735039971999925 ] ] ], [ [ [ -74.889800584999932, -52.002048434999949 ], [ -74.964222785999937, -52.117608330999929 ], [ -74.947865363999938, -52.056573174999926 ], [ -75.01398678299995, -52.104099216999941 ], [ -74.975168423999946, -52.036228122999944 ], [ -75.071400519999941, -51.98211028399993 ], [ -74.96898352799991, -51.926934502999927 ], [ -75.037220831999946, -51.920668226999908 ], [ -74.957508917999917, -51.815606377999927 ], [ -74.865345831999946, -51.879082940999922 ], [ -74.831857876999948, -51.837497653999947 ], [ -74.886382615999935, -51.773044528999947 ], [ -74.844838019999941, -51.762383721999925 ], [ -74.852284308999913, -51.707207940999922 ], [ -74.922230597999942, -51.655857028999947 ], [ -74.865345831999946, -51.618340752999927 ], [ -74.783355272999927, -51.659356377999927 ], [ -74.762928839999915, -51.78289153399993 ], [ -74.889800584999932, -52.002048434999949 ] ] ], [ [ [ -73.943918423999946, -51.741306247999944 ], [ -73.928537563999953, -51.776299737999921 ], [ -74.014556443999936, -51.799737237999921 ], [ -74.240630662999934, -51.69850025799991 ], [ -74.139068162999934, -51.666761976999908 ], [ -74.149647589999915, -51.604180596999925 ], [ -74.071441209999932, -51.60475025799991 ], [ -74.082142706999946, -51.538181247999944 ], [ -73.992665167999917, -51.663181247999944 ], [ -74.008778449999909, -51.714613539999903 ], [ -73.943918423999946, -51.741306247999944 ] ] ], [ [ [ -74.197132941999939, -51.426690362999921 ], [ -74.23859615799995, -51.409600518999923 ], [ -74.254628058999913, -51.290785414999903 ], [ -74.165109829999949, -51.287041924999926 ], [ -74.112416144999941, -51.378838799999926 ], [ -74.11937415299991, -51.447442315999922 ], [ -74.197132941999939, -51.426690362999921 ] ] ], [ [ [ -75.023589647999927, -51.330987237999921 ], [ -75.016184048999946, -51.413506768999923 ], [ -75.070790167999917, -51.400648695999905 ], [ -75.115956183999913, -51.473239841999941 ], [ -75.160755988999938, -51.426690362999921 ], [ -75.141753709999932, -51.565036716999941 ], [ -75.215402798999946, -51.549493096999925 ], [ -75.205799933999913, -51.601739190999922 ], [ -75.312896287999934, -51.629164320999905 ], [ -75.31468665299991, -51.536553643999923 ], [ -75.225331183999913, -51.490655205999929 ], [ -75.187408006999931, -51.375420830999929 ], [ -75.219838019999941, -51.305433851999908 ], [ -75.126047329999949, -51.270196221999925 ], [ -75.148833787999934, -51.367120049999926 ], [ -75.102406378999945, -51.29615650799991 ], [ -75.023589647999927, -51.330987237999921 ] ] ], [ [ [ -73.793080206999946, -51.258721612999921 ], [ -73.754872199999909, -51.297621351999908 ], [ -73.793690558999913, -51.371026299999926 ], [ -73.895578579999949, -51.33521900799991 ], [ -73.82445227799991, -51.303643487999921 ], [ -73.920643683999913, -51.303643487999921 ], [ -73.793080206999946, -51.258721612999921 ] ] ], [ [ [ -74.739003058999913, -51.368584893999923 ], [ -74.798654751999948, -51.432305596999925 ], [ -75.024159308999913, -51.456231377999927 ], [ -74.798329230999911, -51.330010674999926 ], [ -74.963775193999936, -51.343682549999926 ], [ -74.793080206999946, -51.211195570999905 ], [ -74.643055792999917, -51.19695403399993 ], [ -74.555734829999949, -51.250420830999929 ], [ -74.548980272999927, -51.284356377999927 ], [ -74.626332160999937, -51.262139580999929 ], [ -74.543812628999945, -51.365166924999926 ], [ -74.594227667999917, -51.399509372999944 ], [ -74.646229620999918, -51.392510674999926 ], [ -74.687163865999935, -51.283298434999949 ], [ -74.735585089999915, -51.29615650799991 ], [ -74.739003058999913, -51.368584893999923 ] ] ], [ [ [ -74.865345831999946, -51.121514580999929 ], [ -74.876942511999914, -51.158461195999905 ], [ -75.020497199999909, -51.172784112999921 ], [ -74.96898352799991, -51.104424737999921 ], [ -74.865345831999946, -51.121514580999929 ] ] ], [ [ [ -74.420277472999942, -51.111260674999926 ], [ -74.385365363999938, -51.143731377999927 ], [ -74.434152798999946, -51.205824476999908 ], [ -74.574370897999927, -51.154880466999941 ], [ -74.605213995999918, -51.080254815999922 ], [ -74.486073370999918, -51.021254164999903 ], [ -74.460275844999899, -51.062107028999947 ], [ -74.519520636999914, -51.096368096999925 ], [ -74.420277472999942, -51.111260674999926 ] ] ], [ [ [ -74.248931443999936, -51.234795830999929 ], [ -74.284575975999928, -51.23560963299991 ], [ -74.351958787999934, -50.925713799999926 ], [ -74.301340298999946, -50.939222914999903 ], [ -74.196929490999935, -51.175388278999947 ], [ -74.248931443999936, -51.234795830999929 ] ] ], [ [ [ -74.385568813999953, -50.981052341999941 ], [ -74.398304816999939, -51.086846612999921 ], [ -74.475493943999936, -50.994561455999929 ], [ -74.725453253999945, -51.105075778999947 ], [ -74.749867316999939, -51.042413018999923 ], [ -74.680978969999899, -51.008233330999929 ], [ -74.774566209999932, -50.993340752999927 ], [ -74.831857876999948, -51.076429945999905 ], [ -74.89321855399993, -51.049248955999929 ], [ -74.838002081999946, -50.974216403999947 ], [ -74.966420050999943, -50.949883721999925 ], [ -74.903187628999945, -50.885430596999925 ], [ -74.625477667999917, -50.924899997999944 ], [ -74.584787563999953, -50.885430596999925 ], [ -74.640451626999948, -50.885430596999925 ], [ -74.643055792999917, -50.847832940999922 ], [ -74.558094855999911, -50.817071221999925 ], [ -74.66047115799995, -50.727715752999927 ], [ -74.399769660999937, -50.844414971999925 ], [ -74.434559699999909, -50.925713799999926 ], [ -74.385568813999953, -50.981052341999941 ] ] ], [ [ [ -74.906320766999897, -50.79656340899993 ], [ -74.958973761999914, -50.728285414999903 ], [ -74.844838019999941, -50.748223565999922 ], [ -74.901112433999913, -50.676039320999905 ], [ -74.831857876999948, -50.707207940999922 ], [ -74.804514126999948, -50.666273695999905 ], [ -74.71507727799991, -50.802829684999949 ], [ -74.777211066999939, -50.802829684999949 ], [ -74.718169725999928, -50.861504815999922 ], [ -74.66047115799995, -50.82390715899993 ], [ -74.693023240999935, -50.890069268999923 ], [ -74.781971808999913, -50.882012627999927 ], [ -74.931263800999943, -50.851006768999923 ], [ -74.859120245999918, -50.82390715899993 ], [ -74.94163977799991, -50.79656340899993 ], [ -74.906320766999897, -50.79656340899993 ] ] ], [ [ [ -74.981516079999949, -50.797784112999921 ], [ -75.083892381999931, -50.783623955999929 ], [ -75.113148566999939, -50.721286716999941 ], [ -75.044056769999941, -50.707207940999922 ], [ -75.081695115999935, -50.654880466999941 ], [ -74.985422329999949, -50.657159112999921 ], [ -74.981516079999949, -50.797784112999921 ] ] ], [ [ [ -74.608713344999899, -50.514825127999927 ], [ -74.602650519999941, -50.563083591999941 ], [ -74.673491990999935, -50.576918226999908 ], [ -74.680978969999899, -50.514825127999927 ], [ -74.608713344999899, -50.514825127999927 ] ] ], [ [ [ -75.126047329999949, -50.494317315999922 ], [ -75.119862433999913, -50.533623955999929 ], [ -75.215402798999946, -50.556410414999903 ], [ -75.215402798999946, -50.59693775799991 ], [ -75.345570441999939, -50.560723565999922 ], [ -75.270863410999937, -50.620538018999923 ], [ -75.304758266999897, -50.64576588299991 ], [ -75.263172980999911, -50.666273695999905 ], [ -75.290598110999952, -50.781833591999941 ], [ -75.336293097999942, -50.740817966999941 ], [ -75.461822068999936, -50.762465101999908 ], [ -75.407053188999953, -50.673760674999926 ], [ -75.513824022999927, -50.649102471999925 ], [ -75.359364386999914, -50.590508721999925 ], [ -75.468617316999939, -50.494317315999922 ], [ -75.403797980999911, -50.460137627999927 ], [ -75.352609829999949, -50.501153252999927 ], [ -75.330922003999945, -50.46648528399993 ], [ -75.126047329999949, -50.494317315999922 ] ] ], [ [ [ -74.310414191999939, -50.834161065999922 ], [ -74.373768683999913, -50.82740650799991 ], [ -74.399769660999937, -50.748223565999922 ], [ -74.517079230999911, -50.731622002999927 ], [ -74.581206834999932, -50.633558851999908 ], [ -74.420277472999942, -50.528497002999927 ], [ -74.673491990999935, -50.473809502999927 ], [ -74.552479620999918, -50.423923434999949 ], [ -74.476673956999946, -50.476332289999903 ], [ -74.38312740799995, -50.455987237999921 ], [ -74.239003058999913, -50.676202080999929 ], [ -74.427113410999937, -50.652601820999905 ], [ -74.222645636999914, -50.721612237999921 ], [ -74.181304490999935, -50.782321872999944 ], [ -74.199208136999914, -50.848321221999925 ], [ -74.269357876999948, -50.786553643999923 ], [ -74.310414191999939, -50.834161065999922 ] ] ], [ [ [ -74.783355272999927, -50.480645440999922 ], [ -74.736724412999934, -50.371840101999908 ], [ -74.544585740999935, -50.38209400799991 ], [ -74.720285610999952, -50.489353122999944 ], [ -74.783355272999927, -50.480645440999922 ] ] ], [ [ [ -75.040638800999943, -50.289483330999929 ], [ -75.22288977799991, -50.436455987999921 ], [ -75.323231574999909, -50.400323174999926 ], [ -75.194894985999952, -50.302504164999903 ], [ -75.454945441999939, -50.363946221999925 ], [ -75.390451626999948, -50.162286065999922 ], [ -75.26789303299995, -50.158623955999929 ], [ -75.352609829999949, -50.200778903999947 ], [ -75.179310675999943, -50.255791924999926 ], [ -75.11978105399993, -50.138767184999949 ], [ -75.187977667999917, -50.164157809999949 ], [ -75.304758266999897, -50.125095309999949 ], [ -75.400380011999914, -50.039157809999949 ], [ -75.296986456999946, -50.002862237999921 ], [ -75.271473761999914, -50.067071221999925 ], [ -75.157053188999953, -50.021416924999926 ], [ -75.052113410999937, -50.125176690999922 ], [ -74.953277147999927, -50.07976653399993 ], [ -75.071400519999941, -50.186455987999921 ], [ -74.799712693999936, -50.125420830999929 ], [ -74.811268683999913, -50.213799737999921 ], [ -74.942372199999909, -50.220147393999923 ], [ -75.040638800999943, -50.289483330999929 ] ] ], [ [ [ -75.448109503999945, -49.774997653999947 ], [ -75.617386955999905, -49.864222678999909 ], [ -75.634854258999951, -49.827943019999907 ], [ -75.626786262999929, -49.756342570999948 ], [ -75.510757276999925, -49.718222964999939 ], [ -75.613519646999919, -49.636375453999904 ], [ -75.504351867999901, -49.556973395999933 ], [ -75.355339445999903, -49.610176139999908 ], [ -75.211293097999942, -49.792738539999903 ], [ -75.180653449999909, -49.905368747999944 ], [ -75.262766079999949, -49.834567966999941 ], [ -75.270415818999936, -49.898044528999947 ], [ -75.339711066999939, -49.859551690999922 ], [ -75.366200324999909, -49.720310153999947 ], [ -75.448109503999945, -49.774997653999947 ] ] ], [ [ [ -75.521308187999921, -49.379099001999919 ], [ -75.429432675999919, -49.466365155999938 ], [ -75.440419541999916, -49.517810861999919 ], [ -75.54429919599994, -49.452866366999956 ], [ -75.501575445999947, -49.438411025999926 ], [ -75.547554101999935, -49.411311342999909 ], [ -75.521308187999921, -49.379099001999919 ] ] ], [ [ [ -74.903187628999945, -49.076755466999941 ], [ -74.935699022999927, -49.280450127999927 ], [ -75.057728644999941, -49.165459893999923 ], [ -75.201730923999946, -49.172295830999929 ], [ -75.11978105399993, -49.131280205999929 ], [ -75.235585089999915, -49.144952080999929 ], [ -75.15843665299991, -49.051039320999905 ], [ -75.098703579999949, -49.048760674999926 ], [ -75.126047329999949, -49.021416924999926 ], [ -74.903187628999945, -49.076755466999941 ] ] ], [ [ [ -75.557972785999937, -49.24732838299991 ], [ -75.661040818999936, -49.205743096999925 ], [ -75.337269660999937, -48.989353122999944 ], [ -75.373036261999914, -49.056247653999947 ], [ -75.28742428299995, -49.086602471999925 ], [ -75.315907355999911, -49.133477471999925 ], [ -75.403797980999911, -49.186618747999944 ], [ -75.415191209999932, -49.134942315999922 ], [ -75.493763800999943, -49.263441664999903 ], [ -75.557972785999937, -49.24732838299991 ] ] ], [ [ [ -75.215402798999946, -49.014580987999921 ], [ -75.228138800999943, -49.06609465899993 ], [ -75.27603105399993, -49.063246351999908 ], [ -75.316517706999946, -48.953708591999941 ], [ -75.373036261999914, -48.952569268999923 ], [ -75.499338344999899, -49.039157809999949 ], [ -75.533273891999897, -49.019463799999926 ], [ -75.468617316999939, -48.952569268999923 ], [ -75.597401495999918, -48.987725518999923 ], [ -75.654855923999946, -48.911065362999921 ], [ -75.614735480999911, -48.85865650799991 ], [ -75.468617316999939, -48.842705987999921 ], [ -75.511057094999899, -48.908623955999929 ], [ -75.394154425999943, -48.829034112999921 ], [ -75.421620245999918, -48.884209893999923 ], [ -75.359364386999914, -48.918389580999929 ], [ -75.379261847999942, -48.852227471999925 ], [ -75.305978969999899, -48.86492278399993 ], [ -75.215402798999946, -49.014580987999921 ] ] ], [ [ [ -75.105824347999942, -48.969903252999927 ], [ -75.223011847999942, -48.978936455999929 ], [ -75.235910610999952, -48.870700778999947 ], [ -75.308176235999952, -48.794854424999926 ], [ -75.091420050999943, -48.870700778999947 ], [ -75.090728318999936, -48.914483330999929 ], [ -75.139637824999909, -48.921807549999926 ], [ -75.064442511999914, -48.948337497999944 ], [ -75.105824347999942, -48.969903252999927 ] ] ], [ [ [ -75.198312954999949, -49.77117278399993 ], [ -75.297230597999942, -49.632989190999922 ], [ -75.235910610999952, -49.555840752999927 ], [ -75.317779100999928, -49.549004815999922 ], [ -75.256337042999917, -49.49382903399993 ], [ -75.335194464999915, -49.511163018999923 ], [ -75.325266079999949, -49.459649346999925 ], [ -75.423200333999944, -49.411058337999918 ], [ -75.461984829999949, -49.306573174999926 ], [ -75.383290167999917, -49.280450127999927 ], [ -75.166981574999909, -49.501153252999927 ], [ -75.323353644999941, -49.263604424999926 ], [ -75.259755011999914, -49.264092705999929 ], [ -75.152211066999939, -49.377699476999908 ], [ -75.09243730399993, -49.370293877999927 ], [ -75.187408006999931, -49.295179945999905 ], [ -75.111154751999948, -49.319431247999944 ], [ -75.112538214999915, -49.273207289999903 ], [ -75.037220831999946, -49.260430596999925 ], [ -75.09243730399993, -49.199639580999929 ], [ -74.89321855399993, -49.364027601999908 ], [ -74.88508053299995, -49.254571221999925 ], [ -74.844838019999941, -49.23992278399993 ], [ -74.859120245999918, -49.110772393999923 ], [ -74.804514126999948, -49.103936455999929 ], [ -74.954701300999943, -49.00709400799991 ], [ -74.856922980999911, -48.976495049999926 ], [ -74.818186001999948, -49.00709400799991 ], [ -74.823638475999928, -48.950372002999927 ], [ -74.96898352799991, -48.986586195999905 ], [ -74.954701300999943, -48.918389580999929 ], [ -75.015207485999952, -48.891778252999927 ], [ -74.872792120999918, -48.842705987999921 ], [ -75.011830206999946, -48.873223565999922 ], [ -75.057972785999937, -48.816664320999905 ], [ -74.94163977799991, -48.829034112999921 ], [ -75.009917772999927, -48.774346612999921 ], [ -74.83031165299991, -48.689548434999949 ], [ -74.794789191999939, -48.747247002999927 ], [ -74.783314581999946, -48.687758070999905 ], [ -74.696644660999937, -48.679864190999922 ], [ -74.680978969999899, -48.726657809999949 ], [ -74.622670050999943, -48.722832940999922 ], [ -74.667347785999937, -48.857028903999947 ], [ -74.634836391999897, -48.855238539999903 ], [ -74.616322394999941, -48.76336028399993 ], [ -74.543812628999945, -48.706149997999944 ], [ -74.530140753999945, -48.86687590899993 ], [ -74.563872850999928, -48.900974216999941 ], [ -74.475493943999936, -48.946384372999944 ], [ -74.530140753999945, -49.028252862999921 ], [ -74.461781378999945, -49.119317315999922 ], [ -74.445790167999917, -49.302341403999947 ], [ -74.539418097999942, -49.519301039999903 ], [ -74.503651495999918, -49.587497653999947 ], [ -74.605213995999918, -49.713555596999925 ], [ -74.508290167999917, -49.620293877999927 ], [ -74.430083787999934, -49.65789153399993 ], [ -74.423654751999948, -49.744886976999908 ], [ -74.536366339999915, -49.747002862999921 ], [ -74.434559699999909, -49.788669528999947 ], [ -74.454416469999899, -49.884860934999949 ], [ -74.475493943999936, -49.843194268999923 ], [ -74.523304816999939, -49.856866143999923 ], [ -74.474232550999943, -49.944512627999927 ], [ -74.612131313999953, -49.911553643999923 ], [ -74.536366339999915, -49.994724216999941 ], [ -74.67992102799991, -50.050225518999923 ], [ -74.673491990999935, -49.994724216999941 ], [ -74.768422003999945, -50.053317966999941 ], [ -74.804514126999948, -49.987237237999921 ], [ -74.831857876999948, -50.028903903999947 ], [ -74.856271938999953, -49.991306247999944 ], [ -74.739654100999928, -49.921807549999926 ], [ -74.66047115799995, -49.953057549999926 ], [ -74.680531378999945, -49.928399346999925 ], [ -74.73460852799991, -49.899102471999925 ], [ -74.881214972999942, -49.958916924999926 ], [ -74.913685675999943, -49.925876559999949 ], [ -74.891224738999938, -49.867852471999925 ], [ -74.72874915299991, -49.843194268999923 ], [ -74.838002081999946, -49.836358330999929 ], [ -74.77375240799995, -49.767510674999926 ], [ -74.882557745999918, -49.796970309999949 ], [ -74.865345831999946, -49.733982028999947 ], [ -74.920521613999938, -49.67937590899993 ], [ -74.844838019999941, -49.686211846999925 ], [ -74.891957160999937, -49.614434502999927 ], [ -74.708322719999899, -49.63836028399993 ], [ -74.766590949999909, -49.621026299999926 ], [ -74.756011522999927, -49.576348565999922 ], [ -74.864003058999913, -49.589450778999947 ], [ -74.88695227799991, -49.534600518999923 ], [ -74.782948370999918, -49.478692315999922 ], [ -74.743316209999932, -49.518731377999927 ], [ -74.752552863999938, -49.457696221999925 ], [ -74.66047115799995, -49.432305596999925 ], [ -74.735585089999915, -49.432305596999925 ], [ -74.646229620999918, -49.349786065999922 ], [ -74.746978318999936, -49.398044528999947 ], [ -74.811268683999913, -49.377699476999908 ], [ -74.748890753999945, -49.424899997999944 ], [ -74.944732225999928, -49.542168877999927 ], [ -74.987700975999928, -49.479261976999908 ], [ -75.002797003999945, -49.580173434999949 ], [ -75.044056769999941, -49.590020440999922 ], [ -75.010975714999915, -49.676039320999905 ], [ -74.952870245999918, -49.640883070999905 ], [ -75.022572394999941, -49.742120049999926 ], [ -74.961537238999938, -49.785251559999949 ], [ -75.043446417999917, -49.826348565999922 ], [ -75.009917772999927, -49.898532809999949 ], [ -75.133941209999932, -49.858330987999921 ], [ -75.198312954999949, -49.77117278399993 ] ] ], [ [ [ -75.085031704999949, -48.637302341999941 ], [ -75.060658331999946, -48.699395440999922 ], [ -75.109445766999897, -48.809177341999941 ], [ -75.246083136999914, -48.784763278999947 ], [ -75.085031704999949, -48.637302341999941 ] ] ], [ [ [ -75.023589647999927, -48.68873463299991 ], [ -74.975168423999946, -48.684991143999923 ], [ -75.009917772999927, -48.637302341999941 ], [ -74.824940558999913, -48.658379815999922 ], [ -74.988270636999914, -48.740492445999905 ], [ -75.044056769999941, -48.732842705999929 ], [ -75.023589647999927, -48.68873463299991 ] ] ], [ [ [ -73.037178985999901, -54.4564614169999 ], [ -72.972841243999937, -54.445011876999899 ], [ -72.9537844809999, -54.45685838299994 ], [ -72.989115445999914, -54.495697428999904 ], [ -73.09831420699993, -54.485808119999945 ], [ -73.037178985999901, -54.4564614169999 ] ] ], [ [ [ -70.402603411999905, -54.078632689999949 ], [ -70.313252632999934, -54.052750105999905 ], [ -70.298143286999903, -54.125952652999899 ], [ -70.405134176999923, -54.150441659999956 ], [ -70.513691449999953, -54.091285822999907 ], [ -70.402603411999905, -54.078632689999949 ] ] ], [ [ [ -70.686814366999897, -52.847389516999954 ], [ -70.619251986999927, -52.843384318999938 ], [ -70.725155177999909, -52.91360801299993 ], [ -70.789740348999942, -52.900540722999949 ], [ -70.686814366999897, -52.847389516999954 ] ] ], [ [ [ -74.427757414999917, -52.503661635999947 ], [ -74.39419819099993, -52.519902713999954 ], [ -74.349256660999913, -52.622980783999935 ], [ -74.481960304999916, -52.570765139999935 ], [ -74.427757414999917, -52.503661635999947 ] ] ], [ [ [ -74.476368398999909, -52.309666915999912 ], [ -74.488886782999941, -52.389906569999937 ], [ -74.45232240799993, -52.394783463999943 ], [ -74.482232513999918, -52.441658257999904 ], [ -74.536448527999937, -52.368736196999919 ], [ -74.476368398999909, -52.309666915999912 ] ] ], [ [ [ -73.815143293999938, -51.864058671999942 ], [ -73.718329605999941, -51.848860045999913 ], [ -73.713450735999913, -51.996006957999953 ], [ -73.767059469999936, -52.005296916999953 ], [ -73.979358161999926, -51.838543888999936 ], [ -73.900748790999899, -51.803603080999949 ], [ -73.815143293999938, -51.864058671999942 ] ] ], [ [ [ -74.359035942999924, -51.33794079799992 ], [ -74.296510172999945, -51.39538906599995 ], [ -74.306248931999903, -51.417783641999904 ], [ -74.396488010999917, -51.413082380999924 ], [ -74.412026427999933, -51.367044337999914 ], [ -74.359035942999924, -51.33794079799992 ] ] ], [ [ [ -74.970276692999903, -50.287516392999919 ], [ -74.889258390999942, -50.294923200999904 ], [ -74.976266336999913, -50.432887515999937 ], [ -75.044522301999905, -50.475994397999955 ], [ -75.171581489999937, -50.462150014999906 ], [ -74.970276692999903, -50.287516392999919 ] ] ], [ [ [ -74.42601477799991, -49.61492278399993 ], [ -74.468617316999939, -49.501153252999927 ], [ -74.427032029999907, -49.426527601999908 ], [ -74.287993943999936, -49.548435153999947 ], [ -74.42601477799991, -49.61492278399993 ] ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/colombia.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/colombia.geojson new file mode 100644 index 000000000000..bfe3ae6a74ea --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/colombia.geojson @@ -0,0 +1,40 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "CO-NAR", "NAME_1": "Nariño" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.641267455999895, 1.259407450000069 ], [ -78.684288086999885, 1.281886698000079 ], [ -78.719479735999954, 1.341056214000062 ], [ -78.828684048999946, 1.43431224200009 ], [ -78.812855597999942, 1.441799221000053 ], [ -78.854481574999909, 1.490179755000042 ], [ -78.860707160999937, 1.558498440000051 ], [ -78.899599346999935, 1.545328417000064 ], [ -79.021511546999932, 1.638310358000069 ], [ -79.0087697539999, 1.664760146000049 ], [ -78.955839935999904, 1.692179301000067 ], [ -78.84605195599994, 1.82158548600006 ], [ -78.759447805999912, 1.830547266000053 ], [ -78.571230417999914, 1.782207066000069 ], [ -78.545399542999917, 1.914740302000041 ], [ -78.59136712399993, 1.896842641000092 ], [ -78.586333787999934, 2.000392971000053 ], [ -78.608021613999938, 2.02798086100006 ], [ -78.629017706999946, 2.025336005000042 ], [ -78.647474133999935, 1.980641280000043 ], [ -78.665605777999929, 1.982915292000087 ], [ -78.703158746999918, 2.189805173000082 ], [ -78.574086066999939, 2.433172919000071 ], [ -78.558990037999934, 2.449164130000042 ], [ -78.558990037999934, 2.381537177000041 ], [ -78.525045132999935, 2.495506662000082 ], [ -78.506457944999909, 2.490871279000089 ], [ -78.432215845999906, 2.587028252000039 ], [ -78.346018238999932, 2.647985921000043 ], [ -78.277503605999925, 2.542509370000062 ], [ -78.254750128999945, 2.541896877000056 ], [ -78.270076330999927, 2.634952070000054 ], [ -78.24693074399994, 2.663600774000088 ], [ -78.207753058999913, 2.537339585000041 ], [ -78.132476365999935, 2.492743231000077 ], [ -78.085275844999899, 2.516058661000045 ], [ -78.096104901999922, 2.651451390000091 ], [ -77.983921372373402, 2.586920565331809 ], [ -77.952729864791422, 2.555658271212224 ], [ -77.933351203195457, 2.477471829461365 ], [ -77.948750780224316, 2.381973781864531 ], [ -77.859428066851763, 2.237383124231769 ], [ -77.840126918722319, 2.177231756940046 ], [ -77.70274512408821, 2.142608547046791 ], [ -77.446326666742266, 2.221363430477936 ], [ -77.313027310362088, 2.171392320399264 ], [ -77.30132259795954, 2.154804184965144 ], [ -77.326385668263981, 2.062200019015677 ], [ -77.213963589348168, 1.986442369120027 ], [ -77.199261644309445, 1.961017564509007 ], [ -77.213679369407373, 1.926911119452598 ], [ -77.28339087628791, 1.855700994904964 ], [ -77.325067918649495, 1.689406235709214 ], [ -77.232980515738177, 1.663464667160667 ], [ -77.150866665364276, 1.686822415122322 ], [ -77.099371100995484, 1.667908839721179 ], [ -77.044671596616865, 1.704289048800547 ], [ -76.94090532062404, 1.727543443075433 ], [ -76.844812994723895, 1.607085679760303 ], [ -76.854088915271234, 1.55804474476912 ], [ -76.924472214820867, 1.502957668561521 ], [ -76.911708137020867, 1.313201809515874 ], [ -76.94204220218586, 1.287208564123944 ], [ -76.970102505126476, 1.29521841100086 ], [ -76.973280605815319, 1.247779446464278 ], [ -76.991005621911881, 1.225661932851892 ], [ -77.088699917367251, 1.186077786460658 ], [ -77.086710375083726, 1.073423163548171 ], [ -77.032140061914333, 1.041280422353623 ], [ -77.038212043351109, 0.996425279303196 ], [ -77.118775601013169, 0.835194810292251 ], [ -77.238561570759884, 0.697167060511447 ], [ -77.109137946159251, 0.584512436699583 ], [ -77.124615037553951, 0.540019028855113 ], [ -77.086245287090321, 0.390622463455941 ], [ -77.103856080293838, 0.354140948446002 ], [ -77.185180623999969, 0.335432841000028 ], [ -77.362534138999962, 0.374810283000031 ], [ -77.424390828999947, 0.408296610000107 ], [ -77.468057413999929, 0.650865784000118 ], [ -77.543349975999973, 0.656446838000136 ], [ -77.645565959999942, 0.7162881470001 ], [ -77.666804972999927, 0.747707418000047 ], [ -77.673316202999899, 0.819641012000076 ], [ -77.703185180999924, 0.843102112000054 ], [ -77.847982543999962, 0.809254048000057 ], [ -77.903224649999856, 0.832095032000069 ], [ -77.91826249199994, 0.874418030000072 ], [ -78.077942667999935, 0.900773011000126 ], [ -78.250154378999923, 1.019628804000121 ], [ -78.349218099999945, 1.05580230700005 ], [ -78.485204630999903, 1.192641500000121 ], [ -78.540601766999941, 1.205353902000084 ], [ -78.570057332999852, 1.19584543900001 ], [ -78.602148396999951, 1.263644918000111 ], [ -78.641267455999895, 1.259407450000069 ] ] ], [ [ [ -78.131418423999946, 2.62726471600007 ], [ -78.097279425999943, 2.572170315000051 ], [ -78.096180792999917, 2.540025132000039 ], [ -78.107289191999939, 2.512518622000073 ], [ -78.134429490999935, 2.504380601000094 ], [ -78.207020636999914, 2.575344143000052 ], [ -78.216420050999943, 2.596869208000044 ], [ -78.194965920999948, 2.632143556000074 ], [ -78.214867980999941, 2.681913849000068 ], [ -78.145085734999952, 2.673748199000045 ], [ -78.131418423999946, 2.62726471600007 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-PUT", "NAME_1": "Putumayo" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -76.177593546999901, 0.400131735000102 ], [ -76.243687703999854, 0.415427958000052 ], [ -76.290506551999869, 0.457182516000103 ], [ -76.311590535999898, 0.458526103000068 ], [ -76.365385701999912, 0.406953023000057 ], [ -76.416390339999879, 0.401888733000078 ], [ -76.408018757999912, 0.254507548000035 ], [ -76.565425171999976, 0.21606028300009 ], [ -76.626868448999886, 0.258538310000034 ], [ -76.724536905999912, 0.277555237000087 ], [ -76.736887573999866, 0.272904358000034 ], [ -76.734355427999873, 0.233113505000119 ], [ -76.797865763999937, 0.249960022000096 ], [ -76.882460082999927, 0.240141500000036 ], [ -76.945867065999948, 0.287063701000079 ], [ -77.04462072799987, 0.305667216000131 ], [ -77.103856080293838, 0.354140948446002 ], [ -77.084979214319276, 0.396771959258501 ], [ -77.124615037553951, 0.540019028855113 ], [ -77.112238531582932, 0.59427928276267 ], [ -77.238561570759884, 0.697167060511447 ], [ -77.118775601013169, 0.835194810292251 ], [ -77.028832770016322, 1.023193671051047 ], [ -77.032140061914333, 1.041280422353623 ], [ -77.086710375083726, 1.073423163548171 ], [ -77.088699917367251, 1.186077786460658 ], [ -76.976897956075788, 1.238012600401191 ], [ -76.970102505126476, 1.29521841100086 ], [ -76.94204220218586, 1.287208564123944 ], [ -76.911708137020867, 1.313201809515874 ], [ -76.772750210353934, 1.313976955871794 ], [ -76.722830777118645, 1.354646307880785 ], [ -76.670482551128828, 1.433711248775126 ], [ -76.638184781202654, 1.431902574544154 ], [ -76.588368699855607, 1.407459621864064 ], [ -76.520465868105305, 1.301522935535047 ], [ -76.546174892657177, 1.117606513030125 ], [ -76.5365889146467, 1.075593572984985 ], [ -76.492405565164688, 1.024588935031318 ], [ -76.351018845743113, 0.976943264020406 ], [ -76.209838832795867, 0.972137356253995 ], [ -76.148473069576482, 1.006863918035378 ], [ -76.086383836844561, 1.011411444282714 ], [ -76.06227678094865, 1.043244127114747 ], [ -75.949803026088773, 1.03482086818849 ], [ -75.917815313625795, 1.019162908741237 ], [ -75.899573533591706, 0.953843899376466 ], [ -75.828105028424318, 0.879481513461087 ], [ -75.732296921565649, 0.84811391772314 ], [ -75.600082769903906, 0.847442125054044 ], [ -75.55985266836592, 0.828580227395548 ], [ -75.498616096355761, 0.763571275493973 ], [ -75.459083625009271, 0.749463608758504 ], [ -75.31759355280019, 0.751323960732179 ], [ -75.27387529221096, 0.736286118909277 ], [ -75.212432013726414, 0.619497381798737 ], [ -75.21604936398694, 0.55190460931027 ], [ -75.186697149853558, 0.496197415478321 ], [ -75.164863857980663, 0.488445950120479 ], [ -75.095694952559995, 0.507462877409864 ], [ -75.072337206396924, 0.472943020304115 ], [ -74.996166143552671, 0.469945786768619 ], [ -74.989034796718499, 0.360908515015922 ], [ -74.962447272123882, 0.270836492809906 ], [ -74.855347866710645, 0.221898912404868 ], [ -74.742874111850767, 0.200298162730007 ], [ -74.682903611712277, 0.150947170275685 ], [ -74.676702439965595, 0.109864407116675 ], [ -74.695590176045755, 0.074621080498446 ], [ -74.658279791878897, 0.053847154022947 ], [ -74.684066331695817, 0.00630483579954 ], [ -74.663835007579507, -0.054156588955436 ], [ -74.609703945780439, -0.063561699812624 ], [ -74.592676560774635, -0.102060641485423 ], [ -74.558957689345846, -0.116633396214297 ], [ -74.469790004704919, -0.125780124653033 ], [ -74.429637416633454, -0.082992039151293 ], [ -74.4131784742072, -0.09027841561641 ], [ -74.399458381099407, -0.132291354762231 ], [ -74.327576463882679, -0.122834567960979 ], [ -74.282023687942853, -0.149396254133819 ], [ -74.251612108412075, -0.221433200981437 ], [ -74.19290768104463, -0.220451348151187 ], [ -74.168774786726999, -0.258330173099012 ], [ -74.116684943155576, -0.246341240755669 ], [ -73.989715948831986, -0.349539075967584 ], [ -73.864142219387929, -0.392947279093676 ], [ -74.414716937236847, -0.563756555820419 ], [ -74.422920288999933, -0.538312275999886 ], [ -74.562394978999947, -0.439403584999909 ], [ -74.64231258199996, -0.339771422999931 ], [ -74.686573445999869, -0.353414000999948 ], [ -74.718121907999944, -0.32726572699994 ], [ -74.790701456999869, -0.312589618999951 ], [ -74.755328938999952, -0.278276468999934 ], [ -74.824652872999906, -0.170479430999933 ], [ -74.872711954999943, -0.221949156999926 ], [ -74.933457601999862, -0.209443460999921 ], [ -75.015364745999904, -0.140507100999898 ], [ -75.050737263999935, -0.134305928999908 ], [ -75.101638549999848, -0.06909026999989 ], [ -75.14168778599992, -0.043458759999922 ], [ -75.222096313999884, -0.032400003999925 ], [ -75.240131388999885, -0.07477467799994 ], [ -75.283487914999881, -0.107020771999899 ], [ -75.464923868999875, -0.039738056999923 ], [ -75.626774454999946, 0.078911031000118 ], [ -75.731625935999915, 0.071159567000024 ], [ -75.789710245999913, 0.084388733000111 ], [ -75.951974243999899, 0.203967997000092 ], [ -76.053466756999882, 0.363544820000058 ], [ -76.119560913999919, 0.351762594000149 ], [ -76.136304077999881, 0.396721090000071 ], [ -76.177593546999901, 0.400131735000102 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-CHO", "NAME_1": "Chocó" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -77.46937330143669, 8.537811606220657 ], [ -77.429093384999931, 8.592629090000059 ], [ -77.434002644999879, 8.628259989000043 ], [ -77.374936483999932, 8.6509459440001 ], [ -77.366688605999911, 8.678412177000041 ], [ -77.298817511999914, 8.574286200000074 ], [ -77.274728969999899, 8.495794989000046 ], [ -77.144439256999931, 8.421087958000044 ], [ -77.052805141999897, 8.276312567000048 ], [ -76.985457524345236, 8.256179684045151 ], [ -76.960516527115999, 8.169553331521001 ], [ -76.959870571969304, 8.065218613847946 ], [ -77.003459642248686, 7.99940867806805 ], [ -77.02167558476043, 7.898484605080455 ], [ -77.093350796402092, 7.837144680282734 ], [ -77.120170864993383, 7.842389838520205 ], [ -77.113323737200687, 7.788387966131722 ], [ -77.126372035840745, 7.780920722513315 ], [ -76.980851203120494, 7.63917226788584 ], [ -76.876878220653339, 7.565404161173092 ], [ -76.692496711054332, 7.354435126080205 ], [ -76.646220465601971, 7.321310532954726 ], [ -76.59785132507858, 7.312241318881775 ], [ -76.542945116024271, 7.266998603103048 ], [ -76.508347743653417, 7.186305854231762 ], [ -76.505272996651456, 7.074426378574515 ], [ -76.546097378291336, 6.991020616108528 ], [ -76.68340165855966, 7.026031398730083 ], [ -76.816597663051709, 7.008332221055127 ], [ -76.835640427863439, 6.985982164345387 ], [ -76.802257453218886, 6.926786811462193 ], [ -76.797244838978145, 6.889321396765013 ], [ -76.811042447351042, 6.862630520282266 ], [ -76.836157192700284, 6.840590521935042 ], [ -76.883286098874351, 6.844621283345532 ], [ -76.972789680299513, 6.810204779027345 ], [ -76.966614346075175, 6.752378851702645 ], [ -76.948837653135172, 6.731966661332365 ], [ -76.969947476394907, 6.704655667225268 ], [ -76.944858567668746, 6.702175198526561 ], [ -76.932172004234587, 6.672357896399774 ], [ -76.905739509270916, 6.693648585913479 ], [ -76.901062791814354, 6.650033678111754 ], [ -76.866284553189587, 6.639801744055205 ], [ -76.896127691939398, 6.614531969075074 ], [ -76.893182136146663, 6.582156683883852 ], [ -76.866336229133651, 6.581769111155552 ], [ -76.852641975346899, 6.540169583159695 ], [ -76.788098111438671, 6.483454698075832 ], [ -76.8032909819932, 6.451492824933894 ], [ -76.784377408390696, 6.437772731826101 ], [ -76.805461392329391, 6.423484197937398 ], [ -76.788718228163702, 6.39570811583684 ], [ -76.798019986233385, 6.368862208823884 ], [ -76.784377408390696, 6.362661037976522 ], [ -76.798019986233385, 6.300597641867682 ], [ -76.770708991226968, 6.286929226502593 ], [ -76.713735724623973, 6.178382880265701 ], [ -76.673841518970903, 6.161717231365117 ], [ -76.349778612293107, 6.192206326160999 ], [ -76.258207974218635, 6.173964545227591 ], [ -76.216970181428735, 6.03477407546319 ], [ -76.188729011334772, 5.998471380749606 ], [ -76.111266039096392, 5.975578722579996 ], [ -76.105142380816233, 5.929974269796674 ], [ -76.135579799667994, 5.837240911738661 ], [ -76.087572395249822, 5.727764390414279 ], [ -76.097907681194499, 5.643428452860803 ], [ -76.042484707303402, 5.577334296240792 ], [ -76.080234341042001, 5.537595120218612 ], [ -76.093256802159658, 5.455377916157886 ], [ -76.165552131425727, 5.40866242113384 ], [ -76.18291541231639, 5.35194753694924 ], [ -76.179918178780895, 5.308720200976495 ], [ -76.097597621932721, 5.17503327096864 ], [ -76.075919358791339, 5.035713609095751 ], [ -76.141057501902196, 4.96998118678232 ], [ -76.169531215992833, 4.8894434684413 ], [ -76.298515591021669, 4.764076442773614 ], [ -76.316912400686704, 4.678965358864218 ], [ -76.427319098897271, 4.581736152301573 ], [ -76.450315110753763, 4.514324246067076 ], [ -76.44233110229851, 4.46644603105949 ], [ -76.455715297722804, 4.420686550443918 ], [ -76.547105068643987, 4.391670233994091 ], [ -76.495971238581774, 4.319969183930709 ], [ -76.49651384094102, 4.237571111817317 ], [ -76.454888475422763, 4.216228746359548 ], [ -76.443338792651161, 4.18829763372878 ], [ -76.473285285087798, 4.155870673492757 ], [ -76.520801764889541, 4.136957098990933 ], [ -76.574958666009593, 4.055799262126243 ], [ -76.654256150900608, 4.063318183487354 ], [ -76.743242966589605, 3.994640204481868 ], [ -76.892742885675602, 4.041898301865103 ], [ -76.956795824068024, 4.122591050736389 ], [ -76.987259081341506, 4.12398631381734 ], [ -77.018239101653194, 4.101558742741759 ], [ -77.065807258298321, 4.103884181809519 ], [ -77.155465867555733, 4.182871609237338 ], [ -77.221172451447444, 4.16806631141111 ], [ -77.244530199409155, 4.190855617692591 ], [ -77.254437965351315, 4.24218662549124 ], [ -77.236317511999914, 4.265326239000046 ], [ -77.336537238999938, 4.268744208000044 ], [ -77.387196417999917, 4.347235419000071 ], [ -77.358998175999943, 4.387193101000094 ], [ -77.345082160999937, 4.445542710000041 ], [ -77.31273352799991, 4.471380927000041 ], [ -77.333159959999932, 4.471380927000041 ], [ -77.318918423999946, 4.683661200000074 ], [ -77.298980272999927, 4.65570709800005 ], [ -77.291615363999938, 4.682074286000045 ], [ -77.318837042999917, 4.709662177000041 ], [ -77.325754360999952, 4.752508856000077 ], [ -77.28579667899993, 4.737005927000041 ], [ -77.25804602799991, 4.704087632000039 ], [ -77.318918423999946, 4.820868231000077 ], [ -77.339995897999927, 4.813381252000056 ], [ -77.348622199999909, 4.854193427000041 ], [ -77.372873501999948, 5.14915599200009 ], [ -77.346180792999917, 5.24477773600006 ], [ -77.360585089999915, 5.253485419000071 ], [ -77.380970831999946, 5.375067450000074 ], [ -77.408558722999942, 5.38617584800005 ], [ -77.408273891999897, 5.403021552000041 ], [ -77.380970831999946, 5.403021552000041 ], [ -77.408273891999897, 5.464504299000055 ], [ -77.462147589999915, 5.501044012000079 ], [ -77.501332160999937, 5.502427476000094 ], [ -77.510650193999936, 5.484930731000077 ], [ -77.559193488999938, 5.503078518000052 ], [ -77.526234503999945, 5.530178127000056 ], [ -77.490834113999938, 5.594794012000079 ], [ -77.404855923999946, 5.62836334800005 ], [ -77.355620897999927, 5.607896226000094 ], [ -77.333159959999932, 5.615301825000074 ], [ -77.318918423999946, 5.663031317000048 ], [ -77.261138475999928, 5.700913804000038 ], [ -77.245920376999948, 5.734198309000078 ], [ -77.246449347999942, 5.787339585000041 ], [ -77.31273352799991, 5.896429755000042 ], [ -77.353016730999911, 6.026190497000073 ], [ -77.366688605999911, 5.998928127000056 ], [ -77.484364386999914, 6.188788153000075 ], [ -77.483387824999909, 6.294338283000059 ], [ -77.415109829999949, 6.239081122000073 ], [ -77.380970831999946, 6.300523179000038 ], [ -77.377919074999909, 6.351792710000041 ], [ -77.399281378999945, 6.387640692000048 ], [ -77.373524542999917, 6.404201565000051 ], [ -77.360463019999941, 6.389878648000092 ], [ -77.359934048999946, 6.419175523000092 ], [ -77.380970831999946, 6.444525458000044 ], [ -77.347523566999939, 6.521551825000074 ], [ -77.345366990999935, 6.566107489000046 ], [ -77.415109829999949, 6.636297919000071 ], [ -77.411244269999941, 6.693793036000045 ], [ -77.462635870999918, 6.720689195000091 ], [ -77.505686001999948, 6.700140692000048 ], [ -77.510650193999936, 6.671087958000044 ], [ -77.537993943999936, 6.663641669000071 ], [ -77.531809048999946, 6.712062893000052 ], [ -77.593251105999911, 6.828111070000091 ], [ -77.671050584999932, 6.879706122000073 ], [ -77.696278449999909, 6.849188544000071 ], [ -77.692209438999953, 6.947251695000091 ], [ -77.652740037999934, 6.976629950000074 ], [ -77.665028449999909, 7.015570380000042 ], [ -77.696278449999909, 7.07453034100007 ], [ -77.688832160999937, 7.04718659100007 ], [ -77.895839150733224, 7.235098056585514 ], [ -77.820180623999903, 7.476547343000107 ], [ -77.755119994999916, 7.486107483000097 ], [ -77.731245483999942, 7.530342509000121 ], [ -77.765817016999932, 7.626460674000043 ], [ -77.764215047999897, 7.705732320000081 ], [ -77.740237182999891, 7.718858134000044 ], [ -77.679930786999904, 7.670954081000033 ], [ -77.674814819999909, 7.644650778000084 ], [ -77.625463826999891, 7.587444967000039 ], [ -77.613319865999898, 7.537473857000066 ], [ -77.57998856699993, 7.528378805000088 ], [ -77.509346883999939, 7.594111227000056 ], [ -77.339744832999969, 7.707230937000091 ], [ -77.379897420999953, 7.774410299000039 ], [ -77.300419067999968, 7.90210276300013 ], [ -77.163269815999911, 7.939258117000037 ], [ -77.201200317999906, 7.98199452700004 ], [ -77.231069294999941, 8.098731588000064 ], [ -77.316903849999875, 8.250841166000086 ], [ -77.374368042999976, 8.289314270000133 ], [ -77.391266235999865, 8.393545634000063 ], [ -77.422323770999895, 8.456410014000141 ], [ -77.488727986999947, 8.473644104000115 ], [ -77.46937330143669, 8.537811606220657 ] ] ], [ [ [ -77.435160502512787, 4.152847603334193 ], [ -77.426665818999936, 4.180365302000041 ], [ -77.377552863999938, 4.193589585000041 ], [ -77.360096808999913, 4.221136786000045 ], [ -77.313099738999938, 4.198879299000055 ], [ -77.285227053605013, 4.211282578561078 ], [ -77.298635422786504, 4.178763333461063 ], [ -77.350208503319777, 4.194679674427448 ], [ -77.394624395899143, 4.159668890906573 ], [ -77.435160502512787, 4.152847603334193 ] ] ], [ [ [ -77.353016730999911, 4.265326239000046 ], [ -77.27171790299991, 4.258490302000041 ], [ -77.30296790299991, 4.217596747000073 ], [ -77.333159959999932, 4.244818427000041 ], [ -77.381581183999913, 4.231634833000044 ], [ -77.466297980999911, 4.237372137000079 ], [ -77.504505988999938, 4.210638739000046 ], [ -77.549549933999913, 4.204779364000046 ], [ -77.544260219999899, 4.231634833000044 ], [ -77.499663865999935, 4.260972398000092 ], [ -77.435617641999897, 4.258490302000041 ], [ -77.462880011999914, 4.28579336100006 ], [ -77.428130662999934, 4.28579336100006 ], [ -77.452015753999945, 4.291693427000041 ], [ -77.415109829999949, 4.320502020000049 ], [ -77.435617641999897, 4.327337958000044 ], [ -77.428130662999934, 4.341009833000044 ], [ -77.386138475999928, 4.314642645000049 ], [ -77.353016730999911, 4.265326239000046 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-GUA", "NAME_1": "Guainía" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.065229858999913, 1.172694397000015 ], [ -67.086107136999971, 1.176001689000103 ], [ -67.098199421999965, 1.253361308000123 ], [ -67.07360144099988, 1.541199035000133 ], [ -67.117164673999923, 1.709793396000052 ], [ -67.155715291999883, 1.788083191000112 ], [ -67.264752563999906, 1.932544657000065 ], [ -67.340613565999917, 2.090106100000071 ], [ -67.381748005999896, 2.122739767000041 ], [ -67.439728962999965, 2.139560445000114 ], [ -67.592949585999889, 2.05481109600008 ], [ -67.820842651999925, 1.784000753000015 ], [ -67.928846394999965, 1.741290181000096 ], [ -67.998247842999916, 1.749971823000067 ], [ -68.031785848999931, 1.777515361000042 ], [ -68.111109171999971, 1.942414856000141 ], [ -68.177099975999909, 1.973188172000107 ], [ -68.192189493999905, 2.014891052000038 ], [ -68.280246134999942, 1.829398499000135 ], [ -68.248310098999951, 1.82211212100006 ], [ -68.238956664999904, 1.770280660000083 ], [ -68.193533081999874, 1.763743592000097 ], [ -68.188778849999977, 1.73583831800002 ], [ -68.163302367999876, 1.721291402000062 ], [ -69.352402913999953, 1.720206197000067 ], [ -69.541952066999869, 1.772709452000043 ], [ -69.649051472999957, 1.738938904000065 ], [ -69.729149942999925, 1.738990581000081 ], [ -69.841184587999862, 1.707579109000065 ], [ -70.050188972043429, 1.780976873783686 ], [ -70.163851284409247, 1.885363267400862 ], [ -70.119047818202262, 2.007061265065317 ], [ -70.103028124448372, 2.122248033519895 ], [ -69.994455938890439, 2.213353582701643 ], [ -70.037321539657341, 2.277432359515785 ], [ -70.062642992380177, 2.287405911153883 ], [ -70.189922045066339, 2.251852525273819 ], [ -70.237257656815416, 2.265598455904012 ], [ -70.284619106986213, 2.25826040349483 ], [ -70.304256151000573, 2.226427721562118 ], [ -70.407298956581542, 2.263324692780316 ], [ -70.492875129383719, 2.244772854383712 ], [ -70.50287451944348, 2.275882065904625 ], [ -70.590750291992379, 2.301358547359087 ], [ -70.622324592406017, 2.327610175169411 ], [ -70.676093919898449, 2.437887681271491 ], [ -70.747071498650712, 2.529044908195942 ], [ -70.899775356847215, 2.592503567385734 ], [ -70.908534511658388, 2.610797024263263 ], [ -70.499748093799496, 2.78453318955502 ], [ -70.359136521633161, 2.860807603388196 ], [ -70.333272468349719, 2.910003567110948 ], [ -70.281466843819771, 2.941965440252829 ], [ -70.276014980906609, 2.983694159457855 ], [ -70.291595425088758, 3.030254624851068 ], [ -70.265576341275107, 3.04508576109896 ], [ -70.263405930938973, 3.062914129983085 ], [ -70.308519457307113, 3.083946437977716 ], [ -70.202996182128118, 3.196213487262639 ], [ -70.163954637196753, 3.186291612467926 ], [ -70.159872198942821, 3.227710273310436 ], [ -70.144627652444171, 3.201949571015859 ], [ -70.129253912937713, 3.20427501098294 ], [ -70.141578742065292, 3.276441148140464 ], [ -70.116024746245046, 3.290161241248256 ], [ -70.151138881654049, 3.347883815785451 ], [ -70.119745449293021, 3.416639309156778 ], [ -70.068611620130127, 3.424623318511351 ], [ -70.054865688600614, 3.48451630338468 ], [ -70.082770961910342, 3.525495713756186 ], [ -70.010863207171269, 3.528596300079187 ], [ -69.962984992163626, 3.505006008120745 ], [ -69.926346401565183, 3.555907294186284 ], [ -69.89410030758313, 3.566449285705971 ], [ -69.866660122266808, 3.530611680784432 ], [ -69.849400194163593, 3.559007880509284 ], [ -69.722043627111702, 3.568619696042106 ], [ -69.658119879928506, 3.532472031858788 ], [ -69.648740606593719, 3.594690456699198 ], [ -69.611404384904404, 3.618823350117509 ], [ -69.612412075257055, 3.686338609139511 ], [ -69.474280971789426, 3.715742499216958 ], [ -69.430717739931765, 3.68608022672106 ], [ -69.346252611169064, 3.712771104103183 ], [ -69.301526659327862, 3.700136217512409 ], [ -69.279538336924702, 3.728919989066242 ], [ -69.251012945990681, 3.701221422230844 ], [ -69.191119961117295, 3.679879054974379 ], [ -69.183549363812062, 3.652102972873877 ], [ -69.140089483842587, 3.674530543949459 ], [ -69.105776333211224, 3.655823675921908 ], [ -69.108928596377609, 3.627892564190461 ], [ -69.090299241816524, 3.609366563316257 ], [ -69.040638190100367, 3.655203559196877 ], [ -68.962425909927788, 3.640940862830519 ], [ -68.937776251672688, 3.707345078712422 ], [ -68.907312995298469, 3.688560696319087 ], [ -68.848350186411949, 3.709825548310391 ], [ -68.827757127989059, 3.689361681096671 ], [ -68.804476895292453, 3.690136827452591 ], [ -68.810135463780625, 3.727989813978695 ], [ -68.744222175213224, 3.736206366430679 ], [ -68.739597133700727, 3.772534897767287 ], [ -68.68879920132207, 3.797804674546057 ], [ -68.643168911016403, 3.781836655836969 ], [ -68.579606899938483, 3.80806244522563 ], [ -68.546353114704459, 3.795944322572439 ], [ -68.504882778817205, 3.84452016777152 ], [ -68.438452725412958, 3.873071397127262 ], [ -68.444938117100435, 3.912629705996096 ], [ -68.37253943504686, 3.923585110464444 ], [ -68.351377935843061, 3.968491930358311 ], [ -68.368431159270585, 3.994898586000943 ], [ -68.355537889362097, 4.019858303517879 ], [ -68.26789465991061, 4.00272756572457 ], [ -68.252365891672525, 3.94322215447886 ], [ -68.18810624860447, 3.973168646915497 ], [ -68.183481207991349, 3.922112332118445 ], [ -68.156583625034273, 3.927693386240776 ], [ -68.092737393116181, 4.00544057931927 ], [ -68.048709073265115, 3.955934556334682 ], [ -68.013414068904126, 3.998464260317348 ], [ -67.999125535914743, 3.936375026686108 ], [ -67.950704719447231, 3.957484849046523 ], [ -67.876962450256883, 3.922732448843419 ], [ -67.838489346106428, 3.924282742454579 ], [ -67.797096523685582, 3.953764145998548 ], [ -67.749114955890491, 4.021563625860608 ], [ -67.716932481999919, 4.039878247000033 ], [ -67.693873657999916, 3.928598531000105 ], [ -67.644419311999883, 3.834624939000079 ], [ -67.631758585999933, 3.761864523000014 ], [ -67.594809936999894, 3.730910340000094 ], [ -67.537449096999921, 3.735509542000045 ], [ -67.499828654999902, 3.717913717000059 ], [ -67.471406616999872, 3.680060730000079 ], [ -67.403917195999924, 3.504464213000063 ], [ -67.304646768999959, 3.425709331000064 ], [ -67.309452677999872, 3.383928935000114 ], [ -67.395803995999927, 3.266571757000037 ], [ -67.452182983999933, 3.243679098000101 ], [ -67.838619344999927, 2.886129863000065 ], [ -67.85525915499997, 2.858172913000061 ], [ -67.855930948999941, 2.789753316000073 ], [ -67.823323120999902, 2.827322083000084 ], [ -67.751027790999842, 2.842101542000094 ], [ -67.690411336999972, 2.80634145100008 ], [ -67.62659094299994, 2.813421122000108 ], [ -67.594293172999954, 2.776110738000071 ], [ -67.57558630399987, 2.691103007000066 ], [ -67.500293741999911, 2.675341695000085 ], [ -67.470889852999932, 2.627127584000092 ], [ -67.340613565999917, 2.510493876000098 ], [ -67.325420694999906, 2.474630432000055 ], [ -67.189718383999917, 2.394376933000046 ], [ -67.173750365999894, 2.336447652000103 ], [ -67.217675333999921, 2.284512838000097 ], [ -67.217261921999921, 2.266064351000082 ], [ -67.177832804999895, 2.15449493400007 ], [ -67.11463252799993, 2.102999370000077 ], [ -67.111170206999901, 2.048842469000064 ], [ -67.132615925999914, 1.990809835000093 ], [ -67.066831827999948, 1.894123230000034 ], [ -66.980893920999904, 1.66594594300004 ], [ -66.97417598499996, 1.580033875000083 ], [ -66.933609985999851, 1.501692403000092 ], [ -66.932731485999909, 1.424642843000072 ], [ -66.883535521999931, 1.349944560000068 ], [ -66.900898803999951, 1.288966370000097 ], [ -66.87506058799994, 1.222510478000046 ], [ -67.065229858999913, 1.172694397000015 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-VAU", "NAME_1": "Vaupés" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.841184587999862, 1.707579109000065 ], [ -69.856170613999922, 1.707674663000063 ], [ -69.852191528999953, 1.05941965700012 ], [ -69.749665486999902, 1.090528870000085 ], [ -69.716024128999948, 1.058592835000098 ], [ -69.619905965999919, 1.072752177000055 ], [ -69.54295975699992, 1.055595601000093 ], [ -69.478260864999953, 1.060659892000075 ], [ -69.418161172999902, 1.02862050400006 ], [ -69.370851399999964, 1.062985332000011 ], [ -69.338786173999949, 1.064122213000104 ], [ -69.232849487999971, 0.988364563000033 ], [ -69.226183227999854, 0.957203675000059 ], [ -69.204324096999926, 0.943664449000082 ], [ -69.209982665999945, 0.907542623000069 ], [ -69.152389282999906, 0.867803446000067 ], [ -69.17538529499987, 0.844445699000119 ], [ -69.167763021999889, 0.756027323000097 ], [ -69.192257649999931, 0.728948873000135 ], [ -69.141201334999948, 0.668177388000032 ], [ -69.143655965999926, 0.637533265000101 ], [ -69.162336995999908, 0.631435445000051 ], [ -69.200603393999899, 0.639496969000035 ], [ -69.226183227999854, 0.614795634000117 ], [ -69.297057454999901, 0.618102925000116 ], [ -69.302147583999982, 0.656550191000065 ], [ -69.362557331999909, 0.640943909000029 ], [ -69.439710245999976, 0.715771382000057 ], [ -69.478079996999895, 0.732824606000094 ], [ -69.594119425999935, 0.689313049000077 ], [ -69.619156656999934, 0.650659078000075 ], [ -69.694681762999949, 0.668745829000088 ], [ -69.805321004999911, 0.60694081600009 ], [ -70.039415242999922, 0.574591369000103 ], [ -70.054246378999949, 0.588130595000081 ], [ -70.068043985999907, -0.160144144999933 ], [ -69.933633585999871, -0.314346618999934 ], [ -69.85810848099996, -0.341425068999897 ], [ -69.834776570999907, -0.383179625999929 ], [ -69.746461547999928, -0.453046162999911 ], [ -69.649516560999871, -0.492010192999899 ], [ -69.619750935999889, -0.52456634499994 ], [ -69.584223388999931, -0.644559020999864 ], [ -69.628380900999929, -0.733442483999909 ], [ -69.57272538299992, -0.813540954999965 ], [ -69.573242147999849, -0.849197691999947 ], [ -69.53732702699989, -0.889505309999905 ], [ -69.532598632999907, -0.934050394999915 ], [ -69.442862508999923, -1.008361103999988 ], [ -69.448159342999958, -1.092076924999944 ], [ -69.399454304999921, -1.182717386999883 ], [ -69.421065071999919, -1.239310156999906 ], [ -69.465315111403243, -1.180031020015576 ], [ -69.564456345883627, -1.137449639189526 ], [ -69.650600958567395, -1.160497327889402 ], [ -69.649102341799619, -1.055490817547195 ], [ -69.716436733668331, -0.995132744680404 ], [ -69.746925829363533, -0.997251479072531 ], [ -69.774159309104846, -1.043811943566368 ], [ -69.864567227195778, -1.026086927469748 ], [ -69.93148820701515, -1.05502572955379 ], [ -69.947352871138094, -1.029187513792749 ], [ -69.902781948927782, -0.91606780378612 ], [ -69.971149867772169, -0.93570484780048 ], [ -70.001509772258146, -0.920563653190072 ], [ -70.033936734292865, -0.946866956944518 ], [ -70.071143764772899, -0.933534437464346 ], [ -70.099850022860267, -0.942371107540566 ], [ -70.124112108387067, -0.974410495947666 ], [ -70.07235816070056, -1.044122002828203 ], [ -70.098635626932605, -1.073422540118145 ], [ -70.138374802954786, -1.071355482569459 ], [ -70.196019864025516, -1.023089694833573 ], [ -70.185968797122257, -0.956117039070079 ], [ -70.242192755791052, -0.988001396946913 ], [ -70.279735683954641, -0.933689467095235 ], [ -70.212711351347764, -0.852402439021375 ], [ -70.264181078194213, -0.788065280688159 ], [ -70.273069424214555, -0.75204680681469 ], [ -70.23464799690754, -0.720162448937856 ], [ -70.244466518914692, -0.564099622899278 ], [ -70.260253668671851, -0.550560397844094 ], [ -70.303713547742007, -0.556709892747335 ], [ -70.305031297356493, -0.534230644828426 ], [ -70.221392991793152, -0.446897474638774 ], [ -70.21612199603328, -0.423436374788878 ], [ -70.280381639101336, -0.404781181806129 ], [ -70.329551765301744, -0.43387501352106 ], [ -70.334383510590555, -0.471805515312269 ], [ -70.448330043796489, -0.465552666722203 ], [ -70.457140876350365, -0.407416681034988 ], [ -70.500859137838916, -0.359564303549803 ], [ -70.567418381553068, -0.359719334080012 ], [ -70.6158391989199, -0.321065361876947 ], [ -70.661030239653826, -0.324424329719079 ], [ -70.740922003747471, -0.279259128306137 ], [ -70.76053321023943, -0.280602715442967 ], [ -70.787224086722233, -0.321943861020372 ], [ -70.847323778069892, -0.321323744295398 ], [ -70.90062801756892, -0.193682957302656 ], [ -70.939049444875991, -0.145727227029909 ], [ -70.934501918628655, -0.07100310590863 ], [ -70.984111294400691, 0.000930487252162 ], [ -71.041988897669455, -0.002531834276738 ], [ -71.1400449292301, 0.037672431537487 ], [ -71.173867154345658, 0.115807196444962 ], [ -71.268383348212922, 0.098340561867417 ], [ -71.352822638553903, 0.162471015524943 ], [ -71.421423102294341, 0.191616523183995 ], [ -71.538547736189059, 0.177663886079472 ], [ -71.688977831261866, 0.258279119685596 ], [ -71.787085536967936, 0.373310859408605 ], [ -71.847004361162305, 0.355534166468601 ], [ -71.84302527479656, 0.417235826472222 ], [ -71.936404588001324, 0.486688950934308 ], [ -71.932787237740797, 0.555211900308962 ], [ -71.96084754068147, 0.580326646557467 ], [ -71.979115160036599, 0.564513658378644 ], [ -71.995083176947048, 0.576295885146976 ], [ -72.008596563580511, 0.63339834205982 ], [ -72.035752529855358, 0.664042467385968 ], [ -71.786542934608747, 0.916946926359572 ], [ -71.756699794959559, 0.971310533054634 ], [ -71.724660406552516, 0.986606757295988 ], [ -71.673113166239602, 0.981955878261147 ], [ -71.609861212624878, 1.042520656702948 ], [ -71.552913784443604, 1.160963040212152 ], [ -71.527824876616762, 1.116521308311746 ], [ -71.505061407857681, 1.115126044331475 ], [ -71.553120490018614, 1.216463528469035 ], [ -71.552448697349519, 1.262042141031998 ], [ -71.441008470364579, 1.548019517186958 ], [ -71.405248378909562, 1.598662420834046 ], [ -71.390778977867512, 1.732245998953658 ], [ -71.263758307599801, 1.673386541955324 ], [ -71.15983700197603, 1.756223862741081 ], [ -70.967729865440901, 1.853272203049698 ], [ -70.904529587770242, 1.918591213313846 ], [ -70.65534583184467, 1.904276841902742 ], [ -70.499257168283691, 1.951819159226829 ], [ -70.444454312016887, 1.988354397037767 ], [ -70.201652594991231, 2.031245836226333 ], [ -70.104965989888512, 2.1011640495812 ], [ -70.119047818202262, 2.007061265065317 ], [ -70.161990933334891, 1.902313137141562 ], [ -70.15656490704481, 1.869343572747653 ], [ -69.999933641124642, 1.754983629291075 ], [ -69.841184587999862, 1.707579109000065 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-AMA", "NAME_1": "Amazonas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.421065071999919, -1.239310156999906 ], [ -69.433948323999914, -1.42218597399993 ], [ -69.947198648999859, -4.201137796999902 ], [ -69.964949503999975, -4.236484476999905 ], [ -70.030501058999903, -4.131581318999906 ], [ -70.188398396999901, -4.028951923999912 ], [ -70.216975463999859, -3.924978942999957 ], [ -70.311104084999926, -3.829274189999865 ], [ -70.377689168999922, -3.818835550999921 ], [ -70.438512328999934, -3.867721455999913 ], [ -70.490886393999887, -3.878470153999928 ], [ -70.5442939859999, -3.865240986999936 ], [ -70.690641642999964, -3.78679616299992 ], [ -70.734127359999974, -3.782041930999924 ], [ -70.050629027999946, -2.715130309999935 ], [ -70.075795450999891, -2.691359150999887 ], [ -70.094967406999899, -2.632551370999906 ], [ -70.105793619999957, -2.625213316999904 ], [ -70.150467895999981, -2.66924163799996 ], [ -70.183876709999964, -2.619528910999875 ], [ -70.236069905999841, -2.625109964999879 ], [ -70.273948730999933, -2.546251728999948 ], [ -70.295885376999905, -2.535399678999909 ], [ -70.364615030999886, -2.557620543999946 ], [ -70.376345580999953, -2.532609150999946 ], [ -70.349628865999904, -2.518346455999961 ], [ -70.357535360999947, -2.486927184999928 ], [ -70.445256103999981, -2.498502705999968 ], [ -70.48445267799994, -2.452510680999893 ], [ -70.57860713799991, -2.40548512799991 ], [ -70.59607377099988, -2.416543883999907 ], [ -70.598631754999957, -2.446619567999974 ], [ -70.647595174999964, -2.450753682999903 ], [ -70.663718221999943, -2.398250426999937 ], [ -70.69903906299993, -2.370138447999906 ], [ -70.706583821999885, -2.32828053799993 ], [ -70.787870849999877, -2.307403258999955 ], [ -70.90455623399987, -2.211078388999894 ], [ -70.925252644999915, -2.220276794999975 ], [ -71.021448323999948, -2.196712340999881 ], [ -71.029690714999873, -2.263995055999956 ], [ -71.119969441999899, -2.252109476999934 ], [ -71.142810424999908, -2.262858174999863 ], [ -71.161930705999907, -2.310193785999914 ], [ -71.209059611999919, -2.339235940999913 ], [ -71.253346313999941, -2.326626891999879 ], [ -71.307606567999898, -2.347814228999937 ], [ -71.315461384999935, -2.334068297999906 ], [ -71.420829630999947, -2.3760295619999 ], [ -71.432146768999928, -2.355152281999935 ], [ -71.41163122599994, -2.326626891999879 ], [ -71.456486368999947, -2.255106708999946 ], [ -71.480567586999882, -2.265752054999936 ], [ -71.498137572999951, -2.315051370999939 ], [ -71.52097855599996, -2.292107034999901 ], [ -71.538393513999893, -2.22296396899992 ], [ -71.67853999899998, -2.169530536999986 ], [ -71.731404988999941, -2.189891051999922 ], [ -71.746132772999943, -2.132323506999896 ], [ -71.836204793999912, -2.179762470999975 ], [ -71.948652709999863, -2.324146423999906 ], [ -72.061514038999917, -2.320012307999974 ], [ -72.176390746999942, -2.410342711999931 ], [ -72.250959839999894, -2.396286721999914 ], [ -72.281862344999894, -2.405691832999963 ], [ -72.283826049999931, -2.433183694999926 ], [ -72.378032186999917, -2.450753682999903 ], [ -72.414257364999884, -2.437111103999896 ], [ -72.441594197999905, -2.405175068999924 ], [ -72.562982137999882, -2.383057555999912 ], [ -72.6443208419999, -2.334068297999906 ], [ -72.683181518999845, -2.404761657999913 ], [ -72.712430378999898, -2.422124938999929 ], [ -72.733721069999973, -2.367554626999905 ], [ -72.761678019999863, -2.402281187999932 ], [ -72.804672810999961, -2.377786559999976 ], [ -72.935414184999871, -2.425328877999988 ], [ -72.987555705999938, -2.337685648999894 ], [ -73.05644038899996, -2.299858499999914 ], [ -73.083828898999911, -2.345127054999907 ], [ -73.098866739999977, -2.31494801799991 ], [ -73.158914754999898, -2.293037210999955 ], [ -73.197775431999872, -2.213558857999956 ], [ -73.195294962999895, -2.187203877999906 ], [ -73.14992305499996, -2.14358896899995 ], [ -73.1110623779999, -2.073412373999886 ], [ -73.168733276999973, -1.959310810999881 ], [ -73.158914754999898, -1.895232034999964 ], [ -73.193641317999948, -1.836837666999898 ], [ -73.193021199999862, -1.788675231999918 ], [ -73.257255005999923, -1.742373147999928 ], [ -73.267693643999877, -1.772242125999952 ], [ -73.316579549999943, -1.765420836999894 ], [ -73.350530965999951, -1.790638935999951 ], [ -73.387066202999904, -1.760873311999958 ], [ -73.440086221999906, -1.758702900999964 ], [ -73.446287394999899, -1.738135680999974 ], [ -73.510934611999943, -1.698551533999932 ], [ -73.530985066999904, -1.673746845999887 ], [ -73.528814656999913, -1.635092874999884 ], [ -73.508815876999876, -1.586827086999961 ], [ -73.484527953999873, -1.572461038999961 ], [ -73.497162841999909, -1.477996520999909 ], [ -73.574212402999933, -1.416914977999909 ], [ -73.583436645999939, -1.401722106999969 ], [ -73.562921102999979, -1.372163186999941 ], [ -73.588966023999944, -1.350252379999901 ], [ -73.597130899999883, -1.306120706999906 ], [ -73.618214884999901, -1.306120706999906 ], [ -73.636560017999898, -1.255167744999952 ], [ -73.732368123999919, -1.216513772999861 ], [ -73.754718180999902, -1.183337503999937 ], [ -73.802544718999883, -1.22364512099989 ], [ -73.857166707999909, -1.210519306999927 ], [ -73.91990189699996, -1.113781025999941 ], [ -73.981293497999843, -1.107476501999926 ], [ -73.982792113999949, -1.066238707999929 ], [ -74.016795206999888, -1.091560159999901 ], [ -74.037207397999936, -1.079674580999963 ], [ -74.076894897999921, -0.990894469999944 ], [ -74.092371988999929, -1.0201433309999 ], [ -74.119631306999935, -1.020970153999926 ], [ -74.266754109999908, -0.972290954999906 ], [ -74.303392699999876, -0.897773538999942 ], [ -74.344423787999915, -0.858602802999911 ], [ -74.28913000599988, -0.836278584999945 ], [ -74.310601562999921, -0.801448668999882 ], [ -74.30279842199991, -0.78542897599992 ], [ -74.344320434999901, -0.774060159999934 ], [ -74.385144815999894, -0.721970315999982 ], [ -74.364887654999876, -0.676184996999936 ], [ -74.414716937236847, -0.563756555820419 ], [ -73.864142219387929, -0.392947279093676 ], [ -73.770091111715431, -0.406899916198199 ], [ -73.713660448371002, -0.386694430503553 ], [ -73.64942664282529, -0.416666762261286 ], [ -73.644026454956929, -0.454235527947276 ], [ -73.595838181586771, -0.462038669249182 ], [ -73.554212816068571, -0.520639743829122 ], [ -73.388977424068855, -0.531336764979756 ], [ -73.331771612569867, -0.507307223449629 ], [ -73.205500251135675, -0.604717298964204 ], [ -73.16532182464249, -0.608386326068114 ], [ -73.081295946350849, -0.593555189820165 ], [ -72.997425095891458, -0.526582533157409 ], [ -72.884822149822355, -0.601720065428708 ], [ -72.749894986364495, -0.559242039188746 ], [ -72.590447354062121, -0.67303354186447 ], [ -72.549752162732091, -0.683265475920962 ], [ -72.478412848773928, -0.59402027781357 ], [ -72.421852993320954, -0.556554864015766 ], [ -72.324520433071541, -0.629263603532479 ], [ -72.279820318752684, -0.621253756655562 ], [ -72.24238074427592, -0.586940606024143 ], [ -72.232381354216102, -0.467309665908374 ], [ -72.128640916644997, -0.326336357636819 ], [ -72.036863572995458, -0.259622084291777 ], [ -71.981388923160239, -0.244480888781993 ], [ -71.845040656401181, -0.245876152762264 ], [ -71.774192267958767, -0.224688816036064 ], [ -71.689055344728388, -0.085679212525633 ], [ -71.389719610671477, 0.067489731865635 ], [ -71.32233354375802, 0.133222154179066 ], [ -71.251666021569633, 0.096015122799656 ], [ -71.173867154345658, 0.115807196444962 ], [ -71.1400449292301, 0.037672431537487 ], [ -71.041988897669455, -0.002531834276738 ], [ -70.996565313838175, 0.008733629453445 ], [ -70.971528082854718, -0.012815444277351 ], [ -70.930109422012208, -0.086867770930894 ], [ -70.939049444875991, -0.145727227029909 ], [ -70.90062801756892, -0.193682957302656 ], [ -70.847323778069892, -0.321323744295398 ], [ -70.787224086722233, -0.321943861020372 ], [ -70.76053321023943, -0.280602715442967 ], [ -70.740922003747471, -0.279259128306137 ], [ -70.661030239653826, -0.324424329719079 ], [ -70.6158391989199, -0.321065361876947 ], [ -70.567418381553068, -0.359719334080012 ], [ -70.500859137838916, -0.359564303549803 ], [ -70.457140876350365, -0.407416681034988 ], [ -70.448330043796489, -0.465552666722203 ], [ -70.334383510590555, -0.471805515312269 ], [ -70.329551765301744, -0.43387501352106 ], [ -70.280381639101336, -0.404781181806129 ], [ -70.21612199603328, -0.423436374788878 ], [ -70.221392991793152, -0.446897474638774 ], [ -70.305031297356493, -0.534230644828426 ], [ -70.303713547742007, -0.556709892747335 ], [ -70.260253668671851, -0.550560397844094 ], [ -70.244466518914692, -0.564099622899278 ], [ -70.23464799690754, -0.720162448937856 ], [ -70.273069424214555, -0.75204680681469 ], [ -70.264181078194213, -0.788065280688159 ], [ -70.212711351347764, -0.852402439021375 ], [ -70.279735683954641, -0.933689467095235 ], [ -70.242192755791052, -0.988001396946913 ], [ -70.185968797122257, -0.956117039070079 ], [ -70.196019864025516, -1.023089694833573 ], [ -70.138374802954786, -1.071355482569459 ], [ -70.098635626932605, -1.073422540118145 ], [ -70.07235816070056, -1.044122002828203 ], [ -70.124112108387067, -0.974410495947666 ], [ -70.099850022860267, -0.942371107540566 ], [ -70.071143764772899, -0.933534437464346 ], [ -70.033936734292865, -0.946866956944518 ], [ -70.001509772258146, -0.920563653190072 ], [ -69.971149867772169, -0.93570484780048 ], [ -69.902781948927782, -0.91606780378612 ], [ -69.947352871138094, -1.029187513792749 ], [ -69.93148820701515, -1.05502572955379 ], [ -69.864567227195778, -1.026086927469748 ], [ -69.774159309104846, -1.043811943566368 ], [ -69.746925829363533, -0.997251479072531 ], [ -69.716436733668331, -0.995132744680404 ], [ -69.649102341799619, -1.055490817547195 ], [ -69.650600958567395, -1.160497327889402 ], [ -69.564456345883627, -1.137449639189526 ], [ -69.465315111403243, -1.180031020015576 ], [ -69.421065071999919, -1.239310156999906 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-LAG", "NAME_1": "La Guajira" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.327506533469858, 11.849997690578633 ], [ -71.357629353999897, 11.850802307000023 ], [ -71.449458373999931, 11.795456848000086 ], [ -71.990613973999871, 11.649057516000099 ], [ -72.267082885999884, 11.154901632000048 ], [ -72.341341918999944, 11.162110494000103 ], [ -72.49931677299989, 11.12079518700007 ], [ -72.576469685999939, 10.957368469000073 ], [ -72.682974812999902, 10.855617575000025 ], [ -72.754391641999888, 10.674853414000012 ], [ -72.843016723999966, 10.560596822000065 ], [ -72.915232105177495, 10.428171729841438 ], [ -73.012592128923586, 10.400864163050699 ], [ -73.077652756769282, 10.415126858517681 ], [ -73.139586961668954, 10.404429836467784 ], [ -73.151472541224791, 10.436701767972181 ], [ -73.181341519295643, 10.456571356882591 ], [ -73.125117560626904, 10.527238878171659 ], [ -73.075198127391673, 10.630049139755954 ], [ -73.123541428594024, 10.678469957122786 ], [ -73.249916143715041, 10.7338670916929 ], [ -73.254515346805817, 10.810141506425396 ], [ -73.284952765657579, 10.852490343254715 ], [ -73.452151862418475, 10.866313788250693 ], [ -73.605785894803205, 10.845514024252793 ], [ -73.650150113237146, 11.009767564321635 ], [ -73.637773607266126, 11.139165351399811 ], [ -73.581808031015782, 11.191461900546244 ], [ -73.565581834999932, 11.277085679000038 ], [ -73.292388475999928, 11.294012762000079 ], [ -73.054839647999927, 11.493963934000078 ], [ -72.933990037999934, 11.556789455000057 ], [ -72.741322394999941, 11.707953192000048 ], [ -72.511626756999931, 11.789252020000049 ], [ -72.433461066999939, 11.796087958000044 ], [ -72.263050910999937, 11.885972398000092 ], [ -72.232167120999918, 11.919745184000078 ], [ -72.138661261999914, 12.104559637000079 ], [ -72.145415818999936, 12.200832424000055 ], [ -72.170521613999938, 12.234279690000051 ], [ -72.138661261999914, 12.256048895000049 ], [ -72.107533331999946, 12.245021877000056 ], [ -72.004872199999909, 12.262884833000044 ], [ -71.969634568999936, 12.255113023000092 ], [ -72.015126105999911, 12.19399648600006 ], [ -71.967274542999917, 12.153021552000041 ], [ -71.937611456999946, 12.166449286000045 ], [ -71.914418097999942, 12.202785549000055 ], [ -71.868031378999945, 12.208238023000092 ], [ -71.871083136999914, 12.256048895000049 ], [ -71.905262824999909, 12.282700914000088 ], [ -71.946848110999952, 12.269029039000088 ], [ -71.960519985999952, 12.282700914000088 ], [ -71.871245897999927, 12.362616278000075 ], [ -71.829090949999909, 12.376206773000092 ], [ -71.809071417999917, 12.372137762000079 ], [ -71.843129035999937, 12.338080145000049 ], [ -71.822865363999938, 12.319810289000088 ], [ -71.802845831999946, 12.32367584800005 ], [ -71.803212042999917, 12.335882880000042 ], [ -71.751088019999941, 12.35618724200009 ], [ -71.740793423999946, 12.385728257000039 ], [ -71.751820441999939, 12.390814520000049 ], [ -71.732533331999946, 12.410223700000074 ], [ -71.713449673999946, 12.413723049000055 ], [ -71.719838019999941, 12.395982164000088 ], [ -71.69359290299991, 12.365301825000074 ], [ -71.69163977799991, 12.393377997000073 ], [ -71.630930141999897, 12.427394924000055 ], [ -71.679107225999928, 12.416978257000039 ], [ -71.658802863999938, 12.440375067000048 ], [ -71.69359290299991, 12.427394924000055 ], [ -71.686146613999938, 12.454657294000071 ], [ -71.734527147999927, 12.413723049000055 ], [ -71.730539516999897, 12.438055731000077 ], [ -71.697255011999914, 12.46430084800005 ], [ -71.511301235999952, 12.443264065000051 ], [ -71.439076300999943, 12.396185614000046 ], [ -71.29515540299991, 12.358465887000079 ], [ -71.227162238999938, 12.30540599200009 ], [ -71.107492641999897, 12.07493724200009 ], [ -71.138091600999928, 12.015814520000049 ], [ -71.298817511999914, 11.92023346600007 ], [ -71.327506533469858, 11.849997690578633 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-CES", "NAME_1": "Cesar" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -72.915232105177495, 10.428171729841438 ], [ -72.935620890999928, 10.175193991000057 ], [ -72.987710733999876, 9.999416606000082 ], [ -72.996960814999909, 9.900714620000073 ], [ -72.977633829999945, 9.838056946000052 ], [ -72.985540323999885, 9.81216705300011 ], [ -73.107651733999973, 9.577995301000087 ], [ -73.178448445999919, 9.523037415000147 ], [ -73.324382690999954, 9.255921936000078 ], [ -73.390838582999919, 9.194504496000093 ], [ -73.391148640999916, 9.172774556000078 ], [ -73.363644981999926, 9.165032761000077 ], [ -73.417011887688432, 9.150707912839891 ], [ -73.436597255758727, 9.116343085365088 ], [ -73.44783688016787, 8.865505683040851 ], [ -73.426701219385734, 8.781944891843295 ], [ -73.476413947046012, 8.736495470489558 ], [ -73.479514533369013, 8.705980536372635 ], [ -73.539975959023252, 8.653787340013707 ], [ -73.562326015733049, 8.608622137701502 ], [ -73.553127611350192, 8.563766995550395 ], [ -73.491813524074871, 8.462222804938506 ], [ -73.527211880323989, 8.380522365714569 ], [ -73.468688321009211, 8.356777045024614 ], [ -73.455640020570456, 8.324117539892541 ], [ -73.406289029015454, 8.373856105974482 ], [ -73.419931606858142, 8.455453193310234 ], [ -73.356679654142738, 8.43917511623863 ], [ -73.36711829287492, 8.332721665972088 ], [ -73.413084479065446, 8.206191921220181 ], [ -73.408562792139151, 8.127592068319302 ], [ -73.379830694730742, 8.084674790709016 ], [ -73.375541550901858, 8.029897772863933 ], [ -73.289267747908241, 7.985688584960201 ], [ -73.290818040620081, 7.945949408038757 ], [ -73.350581835183561, 7.89646922437521 ], [ -73.357377285233497, 7.810582994109893 ], [ -73.396212123690532, 7.747331041394432 ], [ -73.483777838776234, 7.68154694313688 ], [ -73.515377976712216, 7.684104926201371 ], [ -73.598447842394023, 7.737021592972098 ], [ -73.751901007625406, 7.7408973247517 ], [ -73.744227058431989, 7.830736802961098 ], [ -73.676996019350781, 7.893368638951529 ], [ -73.670303921188975, 7.928973699876337 ], [ -73.728517422141294, 7.987238878571361 ], [ -73.77122799327725, 8.077310898978794 ], [ -73.796368577947476, 8.212935696225372 ], [ -73.755415005098371, 8.329000962924113 ], [ -73.767429775863434, 8.358637396998233 ], [ -73.754691534686572, 8.388738918166553 ], [ -73.762236293570083, 8.459354763511499 ], [ -73.829648199804581, 8.643581244378936 ], [ -73.807582363934955, 8.816593940158214 ], [ -73.870395067078675, 8.887674871697982 ], [ -73.799805061054712, 9.055597438870677 ], [ -73.8550471668932, 9.117970893342033 ], [ -73.878689133896387, 9.184452622690344 ], [ -73.958529222045968, 9.20292694672122 ], [ -73.955738694984746, 9.295040188054202 ], [ -73.994676887128605, 9.34227244701583 ], [ -74.000955573241072, 9.399064846465478 ], [ -74.137097134425176, 9.498231920266903 ], [ -74.027103848263948, 9.591171983000606 ], [ -73.876053635566791, 9.569287014284271 ], [ -73.8257983064467, 9.597218126015662 ], [ -73.800709397720539, 9.577839464419753 ], [ -73.784224615973244, 9.597450670012392 ], [ -73.842748176187342, 9.739819241364899 ], [ -73.841766324256469, 9.789945380175141 ], [ -73.952612271139401, 9.915183213734338 ], [ -73.997725795708902, 9.945982366892679 ], [ -74.066197069139434, 10.053753566773651 ], [ -74.050539109692124, 10.169896348737495 ], [ -73.906387701631104, 10.367894599556109 ], [ -73.77045284692133, 10.391174832252716 ], [ -73.570878464969155, 10.51243358034543 ], [ -73.597595180772942, 10.549046332522209 ], [ -73.614079963419556, 10.65046133102561 ], [ -73.563721279713263, 10.744021511383608 ], [ -73.58968868668353, 10.763348497035508 ], [ -73.64560258698981, 10.77109996239335 ], [ -73.605785894803205, 10.845514024252793 ], [ -73.452151862418475, 10.866313788250693 ], [ -73.284952765657579, 10.852490343254715 ], [ -73.254515346805817, 10.810141506425396 ], [ -73.249916143715041, 10.7338670916929 ], [ -73.123541428594024, 10.678469957122786 ], [ -73.075198127391673, 10.630049139755954 ], [ -73.125117560626904, 10.527238878171659 ], [ -73.181341519295643, 10.456571356882591 ], [ -73.151472541224791, 10.436701767972181 ], [ -73.139586961668954, 10.404429836467784 ], [ -73.077652756769282, 10.415126858517681 ], [ -73.012592128923586, 10.400864163050699 ], [ -72.915232105177495, 10.428171729841438 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-NSA", "NAME_1": "Norte de Santander" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -73.009724894999863, 9.295376892000093 ], [ -72.980062622999895, 9.216518656000076 ], [ -72.973189656999949, 9.128436178000044 ], [ -72.955309611999979, 9.103993225000096 ], [ -72.826686971999919, 9.141691182000045 ], [ -72.791030232999844, 9.113940939000102 ], [ -72.800021932999897, 9.079446920000123 ], [ -72.783072062999878, 9.059939067000116 ], [ -72.675430053999946, 8.651514384000052 ], [ -72.386765502999907, 8.33861358700004 ], [ -72.395963907999914, 8.256603088000062 ], [ -72.357258259999895, 8.172137960000015 ], [ -72.33384883599993, 8.065477804000125 ], [ -72.350075235999924, 8.042585144000014 ], [ -72.40707434199993, 8.043773702000124 ], [ -72.430122029999978, 7.990521139000066 ], [ -72.491203572999979, 7.937501119000061 ], [ -72.45864741999992, 7.893524475000106 ], [ -72.451774454999878, 7.832804667000104 ], [ -72.483348754999952, 7.649353333000064 ], [ -72.463401651999931, 7.570753479000103 ], [ -72.478697875999899, 7.484453837000061 ], [ -72.414619099999868, 7.413812155000059 ], [ -72.20620804899994, 7.381876119000083 ], [ -72.164040079999978, 7.328856099000078 ], [ -72.174220337999941, 7.279608460000091 ], [ -72.164143432999907, 7.22080068000011 ], [ -72.098255981999927, 7.086752014000098 ], [ -71.99381791199994, 7.012854716000021 ], [ -72.18171261304667, 7.040139065465496 ], [ -72.242070685913404, 6.978850815712576 ], [ -72.2878301656296, 7.005696722725588 ], [ -72.326354946623496, 6.927949530546357 ], [ -72.383199022017266, 6.878365994095361 ], [ -72.42278316930782, 6.879218654817066 ], [ -72.50487118215932, 6.915082099059589 ], [ -72.546574062942625, 6.884954739469663 ], [ -72.560733404722839, 6.999495550978907 ], [ -72.650882941294697, 6.995438951146639 ], [ -72.670080735737372, 6.973424791221134 ], [ -72.688813443085905, 7.005076606000557 ], [ -72.74483069528037, 6.989160265034172 ], [ -72.792993130228751, 7.030837307395814 ], [ -72.879370286909193, 7.05985362384564 ], [ -72.885933193861774, 7.073806260950164 ], [ -72.830045131977272, 7.162095445548346 ], [ -72.837176479710763, 7.207880763686262 ], [ -72.88146318198028, 7.256379096318256 ], [ -72.844514533019264, 7.300975856950231 ], [ -72.842292446739009, 7.357535712403205 ], [ -72.897637906264322, 7.428694159208078 ], [ -72.903115606699885, 7.47633983021899 ], [ -72.983885870836275, 7.546774807511326 ], [ -72.991327276932282, 7.613179023393229 ], [ -73.027655809168266, 7.621188870270146 ], [ -73.056594611252308, 7.607597968371522 ], [ -73.216403977861262, 7.630025540346423 ], [ -73.247849087065731, 7.597055975952514 ], [ -73.260742356974163, 7.544914456437027 ], [ -73.360348680347329, 7.549642848938333 ], [ -73.393835007779387, 7.573620714524338 ], [ -73.496722784628787, 7.600854194265651 ], [ -73.544316778796315, 7.669764716368547 ], [ -73.640331590330618, 7.745160631058241 ], [ -73.588655157909216, 7.733455919555013 ], [ -73.505042690767539, 7.679299018434961 ], [ -73.452823655986947, 7.695602932129589 ], [ -73.365671352950585, 7.792341213176428 ], [ -73.350581835183561, 7.89646922437521 ], [ -73.312315435708797, 7.91918101629085 ], [ -73.286968146362824, 7.960392971558406 ], [ -73.289267747908241, 7.985688584960201 ], [ -73.319420945919887, 8.011836859983077 ], [ -73.375541550901858, 8.029897772863933 ], [ -73.379830694730742, 8.084674790709016 ], [ -73.408562792139151, 8.127592068319302 ], [ -73.413084479065446, 8.206191921220181 ], [ -73.36711829287492, 8.332721665972088 ], [ -73.356679654142738, 8.43917511623863 ], [ -73.419931606858142, 8.455453193310234 ], [ -73.406289029015454, 8.373856105974482 ], [ -73.462047898791468, 8.328380846199082 ], [ -73.468688321009211, 8.356777045024614 ], [ -73.529227261029234, 8.385483303111926 ], [ -73.491813524074871, 8.462222804938506 ], [ -73.562196825423143, 8.587899888968707 ], [ -73.54708146833508, 8.645002345881551 ], [ -73.479514533369013, 8.705980536372635 ], [ -73.476413947046012, 8.736495470489558 ], [ -73.426701219385734, 8.781944891843295 ], [ -73.44783688016787, 8.865505683040851 ], [ -73.436597255758727, 9.116343085365088 ], [ -73.40814938008981, 9.154686998306317 ], [ -73.212244832999886, 9.173446350000063 ], [ -73.032669230999915, 9.294601746000083 ], [ -73.009724894999863, 9.295376892000093 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-ARA", "NAME_1": "Arauca" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.964020716999897, 7.005920692000061 ], [ -71.848193725999863, 6.983864238000137 ], [ -71.771505899999937, 7.011149394000057 ], [ -71.77403804599993, 7.028926086000084 ], [ -71.669599975999944, 7.027737529000063 ], [ -71.667016153999953, 7.051508688000112 ], [ -71.62040401299987, 7.052128805000095 ], [ -71.5947208259999, 7.030114645000111 ], [ -71.509919799999864, 7.034610494000034 ], [ -71.467700154999903, 7.012441304000106 ], [ -71.413904988999974, 7.030993144000135 ], [ -71.292517048999883, 7.025773824000041 ], [ -71.275515503999969, 6.984381002000077 ], [ -71.18404821799993, 6.962573547000062 ], [ -71.13604081299988, 6.99213246700009 ], [ -71.011268065999872, 6.99089223200005 ], [ -70.961322794999916, 7.009444072000093 ], [ -70.895538696999921, 7.06851023300004 ], [ -70.703302368999886, 7.099929504000073 ], [ -70.63927526899991, 7.073471171000094 ], [ -70.57860713799991, 7.085821838000044 ], [ -70.510704305999866, 7.009702454000063 ], [ -70.451663981999928, 7.007687073000113 ], [ -70.31906225599991, 6.938285624000059 ], [ -70.287617146999935, 6.936942037000094 ], [ -70.195012979999888, 6.977559713000034 ], [ -70.129203043999922, 6.972547099000067 ], [ -69.432018568999922, 6.122237244000132 ], [ -69.53236528243184, 6.062317613567018 ], [ -69.784908006199487, 6.062136746413728 ], [ -69.855756394641901, 6.026273302171148 ], [ -69.888054164568018, 6.040277615219736 ], [ -69.939627245101292, 6.114691677079236 ], [ -70.025797696206723, 6.150296738903364 ], [ -70.052591926376294, 6.194066677235355 ], [ -70.118091803793675, 6.250006415063979 ], [ -70.165298225232902, 6.267524726484908 ], [ -70.347741869391768, 6.279022732413182 ], [ -70.504889899249463, 6.224710802561503 ], [ -70.727227749061342, 6.209130357479978 ], [ -70.789446173901808, 6.23253978138581 ], [ -70.864170295023087, 6.215254014860875 ], [ -70.959668341720601, 6.222307848228581 ], [ -71.031421067728104, 6.247836004727844 ], [ -71.207146776202762, 6.274061794116506 ], [ -71.462273322355941, 6.198872585001766 ], [ -71.557357957903434, 6.190733546915624 ], [ -71.608750170384042, 6.210422267773424 ], [ -71.721999070700519, 6.200035304985306 ], [ -71.856125251179378, 6.154508368366521 ], [ -71.946481493326246, 6.149909166175064 ], [ -72.057999233777593, 6.110195828574604 ], [ -72.115050014746373, 6.068828844575478 ], [ -72.156313645957994, 6.073970649126124 ], [ -72.259847377954145, 6.138359483403406 ], [ -72.345423549856946, 6.262796332184962 ], [ -72.350591192829256, 6.297574570809786 ], [ -72.272688971918512, 6.432088324016945 ], [ -72.236153734107518, 6.426352240263668 ], [ -72.19941179072157, 6.462189846084527 ], [ -72.157269660366524, 6.474695543264716 ], [ -72.136289029215334, 6.504409490805358 ], [ -72.10169165684448, 6.729098619006038 ], [ -72.053038296380237, 6.782402859404442 ], [ -71.964020716999897, 7.005920692000061 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-BOY", "NAME_1": "Boyacá" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.99381791199994, 7.012854716000021 ], [ -71.965110846988011, 7.001433417318367 ], [ -72.053038296380237, 6.782402859404442 ], [ -72.10169165684448, 6.729098619006038 ], [ -72.136289029215334, 6.504409490805358 ], [ -72.157269660366524, 6.474695543264716 ], [ -72.19941179072157, 6.462189846084527 ], [ -72.236153734107518, 6.426352240263668 ], [ -72.258813850079093, 6.438392849450452 ], [ -72.282042405932259, 6.422243964487336 ], [ -72.295452439778273, 6.375218411100775 ], [ -72.354363572720672, 6.334497382248401 ], [ -72.395963100716529, 6.267524726484908 ], [ -72.415729335940114, 6.204066067295173 ], [ -72.371210089673866, 6.109110622956848 ], [ -72.341031053240499, 6.078854071258377 ], [ -72.392759161606023, 5.900932114925126 ], [ -72.44107662618535, 5.882096055688407 ], [ -72.447381150719536, 5.854242459222121 ], [ -72.311136236747927, 5.77401479744492 ], [ -72.237652350875294, 5.683090115416462 ], [ -72.26682369695601, 5.659422309092292 ], [ -72.302609625933485, 5.584000555980879 ], [ -72.319275274834069, 5.506098334170758 ], [ -72.348059048186485, 5.510154934002969 ], [ -72.398495246258619, 5.564311835123078 ], [ -72.420612758971629, 5.557697252226376 ], [ -72.590137294800286, 5.354195460751896 ], [ -72.690182867745136, 5.277921046918777 ], [ -72.709613207083805, 5.279548854895722 ], [ -72.808470221623395, 5.383986925356282 ], [ -72.857588670980363, 5.3458238795684 ], [ -72.938255581429928, 5.240455634020293 ], [ -72.934612392747738, 5.205160631457943 ], [ -72.953190069566062, 5.160460517139143 ], [ -72.938462287004938, 5.115372830092042 ], [ -72.90611284023538, 5.083023383322484 ], [ -72.933062100035897, 5.020417384854397 ], [ -72.973679776100767, 4.978766180914533 ], [ -73.011351894574261, 4.994889228355191 ], [ -73.030937262644557, 4.985122382292104 ], [ -73.068609382017371, 4.81079193779766 ], [ -73.052977260991781, 4.734827582327057 ], [ -73.073311936996276, 4.728471380949486 ], [ -73.113231981071067, 4.6639791938847 ], [ -73.218083461782328, 4.677647610149052 ], [ -73.228392910204605, 4.723587957917914 ], [ -73.296424934063452, 4.729789130563915 ], [ -73.329058600773806, 4.783791002053079 ], [ -73.36825517443674, 4.797743639157602 ], [ -73.365800544159754, 4.819783637504827 ], [ -73.402723354699049, 4.871460069026966 ], [ -73.523258633279283, 4.888358262823544 ], [ -73.545298630727189, 4.919389959978673 ], [ -73.514266933572117, 4.991246038773681 ], [ -73.517600063891848, 5.023828030439233 ], [ -73.475948859052608, 5.065892646428495 ], [ -73.525093145931919, 5.210974229577005 ], [ -73.521630825302339, 5.237277533331508 ], [ -73.584831102073679, 5.304611925200163 ], [ -73.590102097833551, 5.385614732433964 ], [ -73.641675178366768, 5.430702419481065 ], [ -73.653767462598296, 5.461734117535457 ], [ -73.791510993337681, 5.507958686144434 ], [ -73.791510993337681, 5.558549912948138 ], [ -73.812620815698097, 5.561960556734277 ], [ -73.899230516375212, 5.481887926386662 ], [ -73.90672359931466, 5.442019558255993 ], [ -73.93483557819934, 5.434190579431686 ], [ -74.000102911620047, 5.374297594558357 ], [ -74.088702154580744, 5.419669501546252 ], [ -74.098029751072147, 5.455610460154617 ], [ -74.147535773157415, 5.45294912430262 ], [ -74.24993262359169, 5.49075043398534 ], [ -74.256908941694292, 5.544674791108719 ], [ -74.31352047399065, 5.613792018786626 ], [ -74.288379890219744, 5.681617336171144 ], [ -74.312848680422235, 5.793186754365195 ], [ -74.339074469810896, 5.825691229866379 ], [ -74.440644497045867, 5.767193508073944 ], [ -74.533946295884846, 5.790551256035599 ], [ -74.646084153960544, 5.752517402356204 ], [ -74.662491421341997, 5.771947739896291 ], [ -74.639882982213862, 5.861761378784593 ], [ -74.590816209700279, 5.918166205505941 ], [ -74.605130581111439, 5.978446764006947 ], [ -74.57425391268788, 6.001597805494328 ], [ -74.577690395795116, 6.078802395314256 ], [ -74.605130581111439, 6.136111557802167 ], [ -74.566734992226088, 6.241169744987701 ], [ -74.519425217999412, 6.282304184990153 ], [ -74.479789394764737, 6.155180161934936 ], [ -74.419534674685451, 6.073583075498505 ], [ -74.356851161851637, 6.039114895236196 ], [ -74.290266078816444, 6.070689194750514 ], [ -74.26998307965539, 6.04983775480855 ], [ -74.239158088075271, 5.981702379061517 ], [ -74.269569667606049, 5.898451646226476 ], [ -74.257451544952801, 5.848196316207009 ], [ -74.233783738628631, 5.846310125811669 ], [ -74.174510871379596, 5.900777086193557 ], [ -74.11081966819313, 5.87059804886087 ], [ -74.087978685068265, 5.824063421889377 ], [ -74.04873043456189, 5.813650621578915 ], [ -74.008422817758799, 5.752129827829265 ], [ -73.97317949114057, 5.73257029908001 ], [ -73.893959519716077, 5.747323920062854 ], [ -73.877448900446382, 5.737091986905682 ], [ -73.878534105164817, 5.71140879987621 ], [ -73.833885667689401, 5.739107366711607 ], [ -73.737121548220841, 5.761147365958152 ], [ -73.694307624297437, 5.751974799097695 ], [ -73.64865149557005, 5.715439561286701 ], [ -73.613976609732731, 5.844863185887334 ], [ -73.618653327189293, 5.904756170760663 ], [ -73.589249437111846, 5.988859565216728 ], [ -73.535221727200963, 6.042060451928307 ], [ -73.499280768592598, 6.107095242251603 ], [ -73.438121710948167, 6.069552314088014 ], [ -73.381871913857708, 6.001029363814098 ], [ -73.400759649937868, 5.922274482181592 ], [ -73.47155636333548, 5.847705389791884 ], [ -73.468300747381591, 5.813495591948026 ], [ -73.428794115356141, 5.763937893019317 ], [ -73.403007574639844, 5.756238105404236 ], [ -73.351331143117761, 5.862536526039833 ], [ -73.28616716158524, 5.855870266299746 ], [ -73.219246181765868, 5.982477525417437 ], [ -73.195423346710072, 5.991107489019385 ], [ -73.127029587645325, 5.955476588773536 ], [ -73.016855435230127, 5.940748806212412 ], [ -72.992386644128317, 5.999634100733147 ], [ -72.893658819898633, 6.123218288792998 ], [ -72.817436082908898, 6.153423162748766 ], [ -72.799297654762938, 6.202515774583333 ], [ -72.754623378865801, 6.229516710327914 ], [ -72.733410203717938, 6.45660879196214 ], [ -72.794414231731423, 6.533193264157831 ], [ -72.791623704670201, 6.567093004538492 ], [ -72.762245653014475, 6.57360423374837 ], [ -72.708889736672006, 6.528774929119663 ], [ -72.66155412492293, 6.434801336712326 ], [ -72.616673142551463, 6.438082791087936 ], [ -72.550578985931452, 6.490353501812649 ], [ -72.542414110322909, 6.561356919885952 ], [ -72.497817348791614, 6.645770371805213 ], [ -72.476862556062088, 6.759820257798651 ], [ -72.487766282787732, 6.809171251152293 ], [ -72.477973599202244, 6.844078680986343 ], [ -72.50487118215932, 6.915082099059589 ], [ -72.42278316930782, 6.879218654817066 ], [ -72.383199022017266, 6.878365994095361 ], [ -72.326354946623496, 6.927949530546357 ], [ -72.2878301656296, 7.005696722725588 ], [ -72.242070685913404, 6.978850815712576 ], [ -72.18171261304667, 7.040139065465496 ], [ -71.99381791199994, 7.012854716000021 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-VID", "NAME_1": "Vichada" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.456299400197167, 6.193223721097866 ], [ -67.486961221999906, 6.166782328000039 ], [ -67.491198689999948, 6.114485779000034 ], [ -67.428566853999939, 6.038469747000079 ], [ -67.422469034999978, 5.978240865000103 ], [ -67.485204223999915, 5.944082743000124 ], [ -67.625144002999946, 5.784505921000076 ], [ -67.649070190999936, 5.656089986000083 ], [ -67.617030802999921, 5.541600851000069 ], [ -67.652480834999949, 5.477961324000077 ], [ -67.809783895999914, 5.378820089000044 ], [ -67.843683634999906, 5.29724884000008 ], [ -67.81474483299985, 5.210277405000056 ], [ -67.82663041299989, 5.120386251000113 ], [ -67.793092406999875, 5.063335470000112 ], [ -67.826372029999902, 4.894844462000052 ], [ -67.813504598999913, 4.840506694000084 ], [ -67.82285803299996, 4.743587545000139 ], [ -67.845647338999953, 4.689740703000027 ], [ -67.855155802999946, 4.566156515000046 ], [ -67.875051228999951, 4.532644348000119 ], [ -67.829059203999947, 4.491432394000128 ], [ -67.813504598999913, 4.443269959000048 ], [ -67.793092406999875, 4.42898142500006 ], [ -67.799862019999921, 4.398905741000092 ], [ -67.77939815299996, 4.350794983000114 ], [ -67.799862019999921, 4.306069031000064 ], [ -67.79944860899991, 4.235323995000044 ], [ -67.777744506999909, 4.153933614000039 ], [ -67.740175740999888, 4.118716126000066 ], [ -67.714079141999918, 4.056497701000055 ], [ -67.797096523685582, 3.953764145998548 ], [ -67.838489346106428, 3.924282742454579 ], [ -67.876962450256883, 3.922732448843419 ], [ -67.950704719447231, 3.957484849046523 ], [ -67.999125535914743, 3.936375026686108 ], [ -68.013414068904126, 3.998464260317348 ], [ -68.048709073265115, 3.955934556334682 ], [ -68.092737393116181, 4.00544057931927 ], [ -68.16942521809932, 3.919709376886203 ], [ -68.1894498357413, 3.930638942932831 ], [ -68.177254197822947, 3.960895493732039 ], [ -68.18810624860447, 3.973168646915497 ], [ -68.252365891672525, 3.94322215447886 ], [ -68.26789465991061, 4.00272756572457 ], [ -68.355537889362097, 4.019858303517879 ], [ -68.368431159270585, 3.994898586000943 ], [ -68.351377935843061, 3.968491930358311 ], [ -68.37253943504686, 3.923585110464444 ], [ -68.444938117100435, 3.912629705996096 ], [ -68.438452725412958, 3.873071397127262 ], [ -68.504882778817205, 3.84452016777152 ], [ -68.546353114704459, 3.795944322572439 ], [ -68.579606899938483, 3.80806244522563 ], [ -68.643168911016403, 3.781836655836969 ], [ -68.68879920132207, 3.797804674546057 ], [ -68.739597133700727, 3.772534897767287 ], [ -68.744222175213224, 3.736206366430679 ], [ -68.810135463780625, 3.727989813978695 ], [ -68.804476895292453, 3.690136827452591 ], [ -68.827757127989059, 3.689361681096671 ], [ -68.848350186411949, 3.709825548310391 ], [ -68.907312995298469, 3.688560696319087 ], [ -68.937776251672688, 3.707345078712422 ], [ -68.962425909927788, 3.640940862830519 ], [ -69.040638190100367, 3.655203559196877 ], [ -69.090299241816524, 3.609366563316257 ], [ -69.108928596377609, 3.627892564190461 ], [ -69.105776333211224, 3.655823675921908 ], [ -69.140089483842587, 3.674530543949459 ], [ -69.183549363812062, 3.652102972873877 ], [ -69.191119961117295, 3.679879054974379 ], [ -69.251012945990681, 3.701221422230844 ], [ -69.279538336924702, 3.728919989066242 ], [ -69.301526659327862, 3.700136217512409 ], [ -69.346252611169064, 3.712771104103183 ], [ -69.430717739931765, 3.68608022672106 ], [ -69.474280971789426, 3.715742499216958 ], [ -69.603213670874197, 3.691997179426266 ], [ -69.616029426416901, 3.675848293563888 ], [ -69.611404384904404, 3.618823350117509 ], [ -69.648740606593719, 3.594690456699198 ], [ -69.658119879928506, 3.532472031858788 ], [ -69.722043627111702, 3.568619696042106 ], [ -69.849400194163593, 3.559007880509284 ], [ -69.866660122266808, 3.530611680784432 ], [ -69.89410030758313, 3.566449285705971 ], [ -69.926346401565183, 3.555907294186284 ], [ -69.962984992163626, 3.505006008120745 ], [ -70.010863207171269, 3.528596300079187 ], [ -70.082770961910342, 3.525495713756186 ], [ -70.054865688600614, 3.48451630338468 ], [ -70.068611620130127, 3.424623318511351 ], [ -70.119745449293021, 3.416639309156778 ], [ -70.151138881654049, 3.347883815785451 ], [ -70.116024746245046, 3.290161241248256 ], [ -70.141578742065292, 3.276441148140464 ], [ -70.129253912937713, 3.20427501098294 ], [ -70.144627652444171, 3.201949571015859 ], [ -70.159872198942821, 3.227710273310436 ], [ -70.163954637196753, 3.186291612467926 ], [ -70.202996182128118, 3.196213487262639 ], [ -70.308519457307113, 3.083946437977716 ], [ -70.263405930938973, 3.062914129983085 ], [ -70.265576341275107, 3.04508576109896 ], [ -70.291595425088758, 3.030254624851068 ], [ -70.2750848049198, 2.960362249917864 ], [ -70.383424444682362, 2.846751614395487 ], [ -70.499748093799496, 2.78453318955502 ], [ -70.592843187063409, 2.841868191363915 ], [ -70.650204027294023, 2.832333889297558 ], [ -70.694774950403598, 2.869411729467743 ], [ -70.686403368320782, 2.823419704855496 ], [ -70.734824184788295, 2.782517807950455 ], [ -70.748208381111908, 2.813937078733204 ], [ -70.811279465774703, 2.791974596550403 ], [ -70.848641526785002, 2.828845730246258 ], [ -70.889595099634107, 2.815874945072665 ], [ -70.904064500676157, 2.857629502699353 ], [ -70.923598191903011, 2.828458157517957 ], [ -70.961709560847567, 2.866001084782226 ], [ -70.980132208934265, 2.813006902746338 ], [ -70.986514247834236, 2.854683946007299 ], [ -71.063667161710157, 2.868636583111822 ], [ -71.060334032289745, 4.919389959978673 ], [ -71.027080247955041, 4.959206651265958 ], [ -70.960288459344895, 5.117724107581466 ], [ -70.887889777291377, 5.154956977382597 ], [ -70.695705126390465, 5.313681139273172 ], [ -70.67865190296294, 5.389412949847724 ], [ -70.448795131789893, 5.53309926991534 ], [ -70.342858446360196, 5.568187567801999 ], [ -70.185193650766337, 5.587411199767018 ], [ -70.122768521250237, 5.620949204941837 ], [ -69.986575283222749, 5.779208278839008 ], [ -69.898647833830466, 5.97079865233593 ], [ -69.817102424237476, 6.05479869220585 ], [ -69.53236528243184, 6.062317613567018 ], [ -69.432018568999922, 6.122237244000132 ], [ -69.331396443999949, 6.15636952700001 ], [ -69.246104492999876, 6.08066355400004 ], [ -69.061128702999895, 6.217838644000011 ], [ -68.892921915999892, 6.184326477000099 ], [ -68.807862507999886, 6.184326477000099 ], [ -68.635314900999902, 6.135879822000049 ], [ -68.584723673999861, 6.170012106000115 ], [ -68.4490213629999, 6.194997661000102 ], [ -68.304172322999932, 6.176988424000101 ], [ -68.146507527999887, 6.223781433000028 ], [ -68.019021769999966, 6.211611634000107 ], [ -67.924143839999971, 6.234555970000144 ], [ -67.904300089999879, 6.275147807000081 ], [ -67.868126587999967, 6.279876201000064 ], [ -67.827198852999942, 6.313414205000072 ], [ -67.573984334999949, 6.266233622000058 ], [ -67.490475219999951, 6.201638082000017 ], [ -67.456299400197167, 6.193223721097866 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-CAU", "NAME_1": "Cauca" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -77.902333136999914, 2.696234442000048 ], [ -77.850493943999936, 2.63812897300005 ], [ -77.785023566999939, 2.593817450000074 ], [ -77.839914516999897, 2.577337958000044 ], [ -77.888050910999937, 2.593817450000074 ], [ -77.86750240799995, 2.639837958000044 ], [ -77.914051886999914, 2.658677476000094 ], [ -77.916371222999942, 2.697211005000042 ], [ -77.902333136999914, 2.696234442000048 ] ] ], [ [ [ -77.806141730999911, 2.662054755000042 ], [ -77.75413977799991, 2.617987372000073 ], [ -77.759103969999899, 2.603094794000071 ], [ -77.847075975999928, 2.648382880000042 ], [ -77.880686001999948, 2.696234442000048 ], [ -77.882557745999918, 2.724595445000091 ], [ -77.860096808999913, 2.709865627000056 ], [ -77.847075975999928, 2.724107164000088 ], [ -77.806141730999911, 2.662054755000042 ] ] ], [ [ [ -78.073901625059932, 2.646820262744939 ], [ -77.949840129999927, 2.67451808800007 ], [ -77.917591925999943, 2.63226959800005 ], [ -77.888050910999937, 2.634711005000042 ], [ -77.904286261999914, 2.579982815000051 ], [ -77.839670376999948, 2.56586334800005 ], [ -77.76040605399993, 2.591620184000078 ], [ -77.751535610999952, 2.62726471600007 ], [ -77.798695441999939, 2.675726630000042 ], [ -77.778187628999945, 2.689398505000042 ], [ -77.797596808999913, 2.698716539000088 ], [ -77.812367316999939, 2.764471747000073 ], [ -77.794789191999939, 2.75726959800005 ], [ -77.733550584999932, 2.786118882000039 ], [ -77.785755988999938, 2.794826565000051 ], [ -77.764556443999936, 2.815659898000092 ], [ -77.709339972999942, 2.812241929000038 ], [ -77.688832160999937, 2.79173411700009 ], [ -77.698597785999937, 2.81313711100006 ], [ -77.735422329999949, 2.822495835000041 ], [ -77.708159959999932, 2.848456122000073 ], [ -77.668324347999942, 2.86749909100007 ], [ -77.641713019999941, 2.846380927000041 ], [ -77.636057094999899, 2.869614976000094 ], [ -77.657704230999911, 2.876898505000042 ], [ -77.709339972999942, 2.860663153000075 ], [ -77.715687628999945, 2.897528387000079 ], [ -77.696278449999909, 2.928941148000092 ], [ -77.640126105999911, 2.900051174000055 ], [ -77.619699673999946, 2.931586005000042 ], [ -77.641713019999941, 2.956244208000044 ], [ -77.627349412999934, 2.991034247000073 ], [ -77.654652472999942, 3.004706122000073 ], [ -77.665435350999928, 2.984564520000049 ], [ -77.688832160999937, 2.997259833000044 ], [ -77.723540818999936, 2.969916083000044 ], [ -77.721791144999941, 2.982001044000071 ], [ -77.647706847999928, 3.073852830000078 ], [ -77.571428684999944, 3.13807513900008 ], [ -77.539628839999921, 3.196844681000073 ], [ -77.508656378999945, 3.194566148000092 ], [ -77.501820441999939, 3.22337474200009 ], [ -77.479683974999944, 3.227463768000064 ], [ -77.500799921999942, 3.24475811700006 ], [ -77.54179451899995, 3.246080663000043 ], [ -77.464864340999952, 3.301625682000065 ], [ -77.418834804582559, 3.25866445609978 ], [ -77.372403531297891, 3.169677639511463 ], [ -77.31922848210877, 3.175491238529844 ], [ -77.261480069149854, 3.124047349205796 ], [ -77.234246589408542, 3.125442613186067 ], [ -77.18603247761672, 3.169445095514732 ], [ -77.109603034152713, 3.191872667489577 ], [ -77.014647589814388, 3.168204861165407 ], [ -76.985243699736941, 3.140041205437285 ], [ -76.869591844188221, 3.092860623319098 ], [ -76.828974169022672, 3.105366318700646 ], [ -76.778589646894659, 3.183940334079125 ], [ -76.672833827718932, 3.107846788298616 ], [ -76.632345343762609, 3.124615789986706 ], [ -76.608858404591672, 3.098157457500633 ], [ -76.576663988352379, 3.124047349205796 ], [ -76.553306241289988, 3.110094713000592 ], [ -76.515504929808628, 3.163088894137161 ], [ -76.466774054978657, 3.178591823953525 ], [ -76.447602098058383, 3.203964951721161 ], [ -76.442356939820911, 3.254866237786644 ], [ -76.462846646355615, 3.285277818216741 ], [ -76.436698371332739, 3.317937323348758 ], [ -76.353990240856945, 3.290238756513418 ], [ -76.255882534251555, 3.282874863883876 ], [ -76.176636726203924, 3.241068630313009 ], [ -76.075764330059769, 3.213292548212507 ], [ -76.091525642294528, 3.203189806264561 ], [ -76.112790493386569, 3.095108547121754 ], [ -76.044577603273751, 3.035525621510203 ], [ -76.024423794422546, 2.911863918185247 ], [ -75.819035814351366, 2.734872137838863 ], [ -75.781027798194316, 2.669604804418157 ], [ -75.823376634124372, 2.530388495332772 ], [ -75.795342169605419, 2.474732978344264 ], [ -75.844486457384107, 2.428120836107666 ], [ -75.877533535244424, 2.426622219339947 ], [ -75.966184455048563, 2.490959376773787 ], [ -76.050081143030297, 2.420627753168276 ], [ -76.233661668750983, 2.351794745431164 ], [ -76.277689988602106, 2.35634227077918 ], [ -76.348719245097072, 2.413186347072269 ], [ -76.378898282429759, 2.419955958700541 ], [ -76.392566697794848, 2.366780911310002 ], [ -76.357323371176619, 2.271541246131619 ], [ -76.396519944839554, 2.186223455747893 ], [ -76.421531338300611, 2.163847561515752 ], [ -76.416751268056544, 2.131446437902753 ], [ -76.455405240259608, 2.112791245819324 ], [ -76.550799934169618, 2.12157623905216 ], [ -76.566974656655077, 2.100027167120061 ], [ -76.565036791214936, 2.01445099521726 ], [ -76.600719367404849, 1.958640447698485 ], [ -76.576896532349053, 1.879678860491026 ], [ -76.504084439145515, 1.823093167515651 ], [ -76.381766323856766, 1.659072170544221 ], [ -76.145294968887697, 1.575511379346665 ], [ -76.227072923376682, 1.464820461195302 ], [ -76.282289190793506, 1.339970201263782 ], [ -76.29704281267567, 1.196051337199435 ], [ -76.255004035108129, 1.137501939462936 ], [ -76.15960934119812, 1.132644354853085 ], [ -76.06051978176248, 1.043657538264767 ], [ -76.07806393070581, 1.021488348708317 ], [ -76.148473069576482, 1.006863918035378 ], [ -76.209838832795867, 0.972137356253995 ], [ -76.351018845743113, 0.976943264020406 ], [ -76.512456021228388, 1.038593248079906 ], [ -76.546174892657177, 1.117606513030125 ], [ -76.520465868105305, 1.301522935535047 ], [ -76.588368699855607, 1.407459621864064 ], [ -76.654488694897339, 1.437742011084936 ], [ -76.772750210353934, 1.313976955871794 ], [ -76.911708137020867, 1.313201809515874 ], [ -76.924472214820867, 1.502957668561521 ], [ -76.865173509150111, 1.544402166926432 ], [ -76.843650274740355, 1.598869127308376 ], [ -76.924446377298466, 1.719791977717591 ], [ -77.044671596616865, 1.704289048800547 ], [ -77.099371100995484, 1.667908839721179 ], [ -77.150866665364276, 1.686822415122322 ], [ -77.232980515738177, 1.663464667160667 ], [ -77.325067918649495, 1.689406235709214 ], [ -77.28339087628791, 1.855700994904964 ], [ -77.213679369407373, 1.926911119452598 ], [ -77.199261644309445, 1.961017564509007 ], [ -77.213963589348168, 1.986442369120027 ], [ -77.326385668263981, 2.062200019015677 ], [ -77.30132259795954, 2.154804184965144 ], [ -77.313027310362088, 2.171392320399264 ], [ -77.446326666742266, 2.221363430477936 ], [ -77.70274512408821, 2.142608547046791 ], [ -77.840126918722319, 2.177231756940046 ], [ -77.859428066851763, 2.237383124231769 ], [ -77.948750780224316, 2.381973781864531 ], [ -77.931697556796792, 2.467033188930486 ], [ -77.952729864791422, 2.555658271212224 ], [ -78.073901625059932, 2.646820262744939 ] ] ], [ [ [ -78.186611575999905, 2.990372525000055 ], [ -78.164269952999916, 3.001595525000084 ], [ -78.16709082999995, 2.959704273000057 ], [ -78.193223497999952, 2.933616561000065 ], [ -78.220288919999916, 2.933616538000081 ], [ -78.186611575999905, 2.990372525000055 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-VAC", "NAME_1": "Valle del Cauca" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.464864340999952, 3.301625682000065 ], [ -77.477658403999897, 3.313153257000067 ], [ -77.468658006999931, 3.344671942000048 ], [ -77.380970831999946, 3.387640692000048 ], [ -77.343739386999914, 3.329413153000075 ], [ -77.318918423999946, 3.319973049000055 ], [ -77.367054816999939, 3.402085679000038 ], [ -77.353016730999911, 3.429836330000057 ], [ -77.333159959999932, 3.411810614000046 ], [ -77.346180792999917, 3.436021226000094 ], [ -77.326283331999946, 3.490668036000045 ], [ -77.333159959999932, 3.511786200000074 ], [ -77.31273352799991, 3.511786200000074 ], [ -77.316151495999918, 3.480373440000051 ], [ -77.282826300999943, 3.485174872000073 ], [ -77.264271613999938, 3.470851955000057 ], [ -77.284779425999943, 3.49750397300005 ], [ -77.27171790299991, 3.504950262000079 ], [ -77.298980272999927, 3.511786200000074 ], [ -77.274891730999911, 3.532782294000071 ], [ -77.325754360999952, 3.532212632000039 ], [ -77.321766730999911, 3.547837632000039 ], [ -77.277943488999938, 3.545884507000039 ], [ -77.298980272999927, 3.558986721000053 ], [ -77.277943488999938, 3.566392320000091 ], [ -77.284779425999943, 3.580633856000077 ], [ -77.20962480399993, 3.580633856000077 ], [ -77.227162238999938, 3.591009833000044 ], [ -77.189198370999918, 3.662583726000094 ], [ -77.169545050999943, 3.652248440000051 ], [ -77.118275519999941, 3.67804596600007 ], [ -77.170806443999936, 3.67719147300005 ], [ -77.174916144999941, 3.692694403000075 ], [ -77.126454230999911, 3.717230536000045 ], [ -77.198719855999911, 3.710028387000079 ], [ -77.195423956999946, 3.758205471000053 ], [ -77.167388475999928, 3.737941799000055 ], [ -77.12564042899993, 3.733547268000052 ], [ -77.174916144999941, 3.758205471000053 ], [ -77.144439256999931, 3.759588934000078 ], [ -77.126454230999911, 3.778713283000059 ], [ -77.150380011999914, 3.813666083000044 ], [ -77.133941209999932, 3.827093817000048 ], [ -77.120269334999932, 3.79913971600007 ], [ -77.105620897999927, 3.813462632000039 ], [ -77.114491339999915, 3.852606512000079 ], [ -77.06859290299991, 3.867743231000077 ], [ -77.03156490799995, 3.915838934000078 ], [ -77.093006964999915, 3.909002997000073 ], [ -77.079335089999915, 3.922064520000049 ], [ -77.126454230999911, 3.929510809000078 ], [ -77.123036261999914, 3.886135158000059 ], [ -77.181141730999911, 3.85297272300005 ], [ -77.253163214999915, 3.840806382000039 ], [ -77.291615363999938, 3.860581773000092 ], [ -77.27171790299991, 3.88540273600006 ], [ -77.311756964999915, 3.908433335000041 ], [ -77.300200975999928, 3.969142971000053 ], [ -77.270415818999936, 3.986395575000074 ], [ -77.25999915299991, 3.975409247000073 ], [ -77.27171790299991, 3.964260158000059 ], [ -77.20962480399993, 3.97728099200009 ], [ -77.243763800999943, 3.97728099200009 ], [ -77.189198370999918, 4.067328192000048 ], [ -77.264271613999938, 4.108221747000073 ], [ -77.264271613999938, 4.067328192000048 ], [ -77.298980272999927, 4.067328192000048 ], [ -77.298980272999927, 4.045599677000041 ], [ -77.318918423999946, 4.05304596600007 ], [ -77.326324022999927, 3.981390692000048 ], [ -77.346180792999917, 3.929510809000078 ], [ -77.362131313999953, 3.92804596600007 ], [ -77.379790818999936, 3.950018622000073 ], [ -77.373524542999917, 3.964260158000059 ], [ -77.430775519999941, 4.012640692000048 ], [ -77.430409308999913, 4.044012762000079 ], [ -77.408273891999897, 4.045599677000041 ], [ -77.431141730999911, 4.09438711100006 ], [ -77.435160502512787, 4.152847603334193 ], [ -77.394624395899143, 4.159668890906573 ], [ -77.350208503319777, 4.194679674427448 ], [ -77.298635422786504, 4.178763333461063 ], [ -77.254437965351315, 4.24218662549124 ], [ -77.244530199409155, 4.190855617692591 ], [ -77.221172451447444, 4.16806631141111 ], [ -77.155465867555733, 4.182871609237338 ], [ -77.065807258298321, 4.103884181809519 ], [ -77.018239101653194, 4.101558742741759 ], [ -76.987259081341506, 4.12398631381734 ], [ -76.956795824068024, 4.122591050736389 ], [ -76.892742885675602, 4.041898301865103 ], [ -76.822643806066765, 4.029806015834936 ], [ -76.761407233157286, 3.995880438831193 ], [ -76.730375536002157, 3.998619289948238 ], [ -76.654256150900608, 4.063318183487354 ], [ -76.574958666009593, 4.055799262126243 ], [ -76.545942348660446, 4.110498764706222 ], [ -76.473285285087798, 4.155870673492757 ], [ -76.43964392802485, 4.200648302177399 ], [ -76.49651384094102, 4.237571111817317 ], [ -76.495971238581774, 4.319969183930709 ], [ -76.545709804663716, 4.394848333783557 ], [ -76.503671027096232, 4.396243597763828 ], [ -76.455715297722804, 4.420686550443918 ], [ -76.44233110229851, 4.46644603105949 ], [ -76.450315110753763, 4.514324246067076 ], [ -76.427319098897271, 4.581736152301573 ], [ -76.316912400686704, 4.678965358864218 ], [ -76.298515591021669, 4.764076442773614 ], [ -76.169531215992833, 4.8894434684413 ], [ -76.141057501902196, 4.96998118678232 ], [ -76.075919358791339, 5.035713609095751 ], [ -76.02238257529558, 4.941507472691683 ], [ -75.986286587056327, 4.911095893160905 ], [ -75.981118944084017, 4.872622789010506 ], [ -75.922181972719841, 4.872416083435496 ], [ -75.94026872402236, 4.821954046941698 ], [ -75.91928809287117, 4.77012258488935 ], [ -75.894302537831834, 4.760820827718987 ], [ -75.851902025058394, 4.776633815897867 ], [ -75.853555670557739, 4.731959540000787 ], [ -75.713951788744055, 4.712942612711402 ], [ -75.716018846292684, 4.658785712490612 ], [ -75.824849413369691, 4.664444280978785 ], [ -75.862108119793902, 4.612948717509312 ], [ -75.876758388888504, 4.552564806220801 ], [ -75.866914029358952, 4.458229477708244 ], [ -75.890375129208849, 4.423632107136029 ], [ -75.809062262713212, 4.397483832113153 ], [ -75.787926601931133, 4.350845852354212 ], [ -75.790252040998894, 4.288394884416391 ], [ -75.828105028424318, 4.210337632975381 ], [ -75.8381560944282, 4.121815904380469 ], [ -75.762217577379261, 4.078511054041883 ], [ -75.745448574791908, 4.041510728237483 ], [ -75.79614315528238, 4.008076076749546 ], [ -75.857663947233391, 3.869893297337796 ], [ -75.988792894176697, 3.6467544618489 ], [ -75.99677690263195, 3.559240424505958 ], [ -76.049383511040162, 3.442400011451355 ], [ -76.064989793644031, 3.357831529001828 ], [ -76.043854132861952, 3.314061591569157 ], [ -76.06072648823681, 3.294734605017993 ], [ -76.075764330059769, 3.213292548212507 ], [ -76.176636726203924, 3.241068630313009 ], [ -76.255882534251555, 3.282874863883876 ], [ -76.353990240856945, 3.290238756513418 ], [ -76.436698371332739, 3.317937323348758 ], [ -76.462846646355615, 3.285277818216741 ], [ -76.442356939820911, 3.254866237786644 ], [ -76.447602098058383, 3.203964951721161 ], [ -76.466774054978657, 3.178591823953525 ], [ -76.515504929808628, 3.163088894137161 ], [ -76.553306241289988, 3.110094713000592 ], [ -76.576663988352379, 3.124047349205796 ], [ -76.608858404591672, 3.098157457500633 ], [ -76.632345343762609, 3.124615789986706 ], [ -76.672833827718932, 3.107846788298616 ], [ -76.778589646894659, 3.183940334079125 ], [ -76.828974169022672, 3.105366318700646 ], [ -76.869591844188221, 3.092860623319098 ], [ -76.985243699736941, 3.140041205437285 ], [ -77.014647589814388, 3.168204861165407 ], [ -77.109603034152713, 3.191872667489577 ], [ -77.18603247761672, 3.169445095514732 ], [ -77.234246589408542, 3.125442613186067 ], [ -77.261480069149854, 3.124047349205796 ], [ -77.31922848210877, 3.175491238529844 ], [ -77.372403531297891, 3.169677639511463 ], [ -77.418834804582559, 3.25866445609978 ], [ -77.464864340999952, 3.301625682000065 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-ANT", "NAME_1": "Antioquia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -76.985457524345236, 8.256179684045151 ], [ -76.962025519999941, 8.266546942000048 ], [ -76.96312415299991, 8.203680731000077 ], [ -76.935292120999918, 8.20538971600007 ], [ -76.935292120999918, 8.184963283000059 ], [ -76.921701626999948, 8.199204820000091 ], [ -76.917591925999943, 8.188950914000088 ], [ -76.928537563999953, 8.15766022300005 ], [ -76.948963995999918, 8.164496161000045 ], [ -76.942534959999932, 8.128851630000042 ], [ -76.918324347999942, 8.11391836100006 ], [ -76.895741339999915, 8.117254950000074 ], [ -76.893706834999932, 8.136542059000078 ], [ -76.83226477799991, 8.136542059000078 ], [ -76.846547003999945, 8.095526434000078 ], [ -76.825428839999915, 8.103013414000088 ], [ -76.860218878999945, 8.082505601000037 ], [ -76.839100714999915, 8.054632880000042 ], [ -76.866444464999915, 8.061997789000088 ], [ -76.83226477799991, 8.027289130000042 ], [ -76.907704230999911, 8.044094143000052 ], [ -76.933705206999946, 7.964585679000038 ], [ -76.907053188999953, 7.929510809000078 ], [ -76.853586391999897, 7.91274648600006 ], [ -76.757232225999928, 7.923570054000038 ], [ -76.730620897999927, 8.051336981000077 ], [ -76.732004360999952, 8.079291083000044 ], [ -76.744130011999914, 8.103013414000088 ], [ -76.750355597999942, 8.075669664000088 ], [ -76.759185350999928, 8.11469147300005 ], [ -76.747914191999939, 8.171535549000055 ], [ -76.77017167899993, 8.258490302000041 ], [ -76.774810350999928, 8.416693427000041 ], [ -76.802072719999899, 8.430161851000037 ], [ -76.838612433999913, 8.500433661000045 ], [ -76.947173631999931, 8.545477606000077 ], [ -76.893706834999932, 8.620347398000092 ], [ -76.660227016999897, 8.687445380000042 ], [ -76.647328253999945, 8.747300523000092 ], [ -76.560454881999931, 8.775376695000091 ], [ -76.44483097368402, 8.869865946937113 ], [ -76.412307094596713, 8.839512436749544 ], [ -76.388845994746873, 8.738898423923104 ], [ -76.346316290764207, 8.674793808687298 ], [ -76.277534959870479, 8.64151418683025 ], [ -76.229114143402967, 8.577590440546373 ], [ -76.213688727952444, 8.452921046868823 ], [ -76.217331915735315, 8.410158799788746 ], [ -76.317945930360395, 8.280890203919739 ], [ -76.41938676638614, 8.09865326623526 ], [ -76.419490119173645, 7.979099840485219 ], [ -76.468324347690498, 7.874816798756228 ], [ -76.505117967020567, 7.74074229602013 ], [ -76.497573208137055, 7.600001531745306 ], [ -76.407759569248697, 7.38035085710635 ], [ -75.856992153664919, 7.367250880723532 ], [ -75.769426438579274, 7.49889659340306 ], [ -75.590005866377624, 7.569512436949367 ], [ -75.565433723387628, 7.606280218757092 ], [ -75.546675177617317, 7.689453437226348 ], [ -75.490296190217009, 7.738571886583259 ], [ -75.458566861071745, 7.807792467048728 ], [ -75.361673550394016, 7.883808499362715 ], [ -75.228761765842819, 8.045969143461207 ], [ -75.114401822386185, 8.067621568180812 ], [ -75.060942552356892, 8.05914663331049 ], [ -75.01735348207751, 8.074675401548518 ], [ -74.942577684112791, 8.072582506477488 ], [ -74.886224535134204, 8.154205431335583 ], [ -74.834883998597661, 8.188725287541956 ], [ -74.599549526989051, 7.99824595808451 ], [ -74.552472296759049, 7.929206243873068 ], [ -74.522344937169123, 7.771541449178528 ], [ -74.480900437904893, 7.724231675851172 ], [ -74.499038866050796, 7.678058783186259 ], [ -74.573556280697801, 7.605970160394577 ], [ -74.586113653822053, 7.492617906391274 ], [ -74.562600878028093, 7.423578193079152 ], [ -74.507978888914579, 7.362832545685421 ], [ -74.468653124042419, 7.361359768238685 ], [ -74.432686327012391, 7.396499742069409 ], [ -74.404419317597444, 7.457400418194709 ], [ -74.364370083212748, 7.488819688078138 ], [ -74.347420214371368, 7.432879950249514 ], [ -74.358323941097012, 7.391926378299729 ], [ -74.396461147563912, 7.343428046567055 ], [ -74.405065273643459, 7.19997427049617 ], [ -74.343906215999084, 7.010425116126214 ], [ -74.252878181183121, 6.99605906787167 ], [ -73.93023637600794, 7.300794988897621 ], [ -73.926722377635599, 7.126102810096597 ], [ -73.887810024812779, 7.019856065405065 ], [ -73.925068732136253, 6.97450999593957 ], [ -74.016096767851536, 6.927794500915468 ], [ -74.108571742591835, 6.790309353493853 ], [ -74.29272070999275, 6.654426173828824 ], [ -74.386435919981693, 6.626288357421743 ], [ -74.40876013916909, 6.567144680482613 ], [ -74.405840419999379, 6.47534149841141 ], [ -74.379201218561377, 6.423484197937398 ], [ -74.392223679679034, 6.402581082051256 ], [ -74.413333502938769, 6.404234727550602 ], [ -74.459506394704363, 6.33351553031747 ], [ -74.547201300999234, 6.262718817819177 ], [ -74.579834967709587, 6.215951645951691 ], [ -74.605130581111439, 6.136111557802167 ], [ -74.577690395795116, 6.078802395314256 ], [ -74.57425391268788, 6.001597805494328 ], [ -74.605130581111439, 5.978446764006947 ], [ -74.590816209700279, 5.918166205505941 ], [ -74.639882982213862, 5.861761378784593 ], [ -74.662491421341997, 5.771947739896291 ], [ -74.715098028850946, 5.772774563095595 ], [ -74.743726772572472, 5.699600734686157 ], [ -74.777264776847971, 5.689678859891444 ], [ -74.866768358273077, 5.743835761011553 ], [ -74.990946824636239, 5.71388926857486 ], [ -75.021539273118947, 5.67650137004216 ], [ -75.0911991031561, 5.659577337823862 ], [ -75.091715867992889, 5.596273709164336 ], [ -75.134426439128845, 5.535424708983101 ], [ -75.215765144046145, 5.502997747847758 ], [ -75.276123216013616, 5.433647976173177 ], [ -75.29141944025497, 5.473826401767042 ], [ -75.318032803271251, 5.463594469509133 ], [ -75.316172451297575, 5.517131252105571 ], [ -75.339917771987587, 5.586636054310418 ], [ -75.377486537673576, 5.619218044177387 ], [ -75.384617886306387, 5.674150092552736 ], [ -75.426114060615419, 5.694329738926285 ], [ -75.486653002434082, 5.669654242249464 ], [ -75.530577968598379, 5.688128567179604 ], [ -75.556131965317945, 5.721020616308408 ], [ -75.601142137099941, 5.735050766879397 ], [ -75.613234422230789, 5.735179958987885 ], [ -75.612536791139974, 5.700840969035482 ], [ -75.59246049665461, 5.683167628882927 ], [ -75.585742560970402, 5.518759060082573 ], [ -75.687415940992878, 5.528990994139065 ], [ -75.724726325159793, 5.558937486575758 ], [ -75.85779313844256, 5.489355170005069 ], [ -75.925411750252067, 5.493928533774806 ], [ -75.982591722430016, 5.521084500049653 ], [ -76.097907681194499, 5.643428452860803 ], [ -76.087572395249822, 5.727764390414279 ], [ -76.135579799667994, 5.837240911738661 ], [ -76.105142380816233, 5.929974269796674 ], [ -76.111266039096392, 5.975578722579996 ], [ -76.188729011334772, 5.998471380749606 ], [ -76.216970181428735, 6.03477407546319 ], [ -76.258207974218635, 6.173964545227591 ], [ -76.349778612293107, 6.192206326160999 ], [ -76.649217699137466, 6.158616645042116 ], [ -76.713735724623973, 6.178382880265701 ], [ -76.770708991226968, 6.286929226502593 ], [ -76.798019986233385, 6.300597641867682 ], [ -76.784377408390696, 6.362661037976522 ], [ -76.798019986233385, 6.368862208823884 ], [ -76.788718228163702, 6.39570811583684 ], [ -76.805461392329391, 6.423484197937398 ], [ -76.784377408390696, 6.437772731826101 ], [ -76.8032909819932, 6.451492824933894 ], [ -76.788098111438671, 6.483454698075832 ], [ -76.852641975346899, 6.540169583159695 ], [ -76.866336229133651, 6.581769111155552 ], [ -76.893182136146663, 6.582156683883852 ], [ -76.896127691939398, 6.614531969075074 ], [ -76.866284553189587, 6.639801744055205 ], [ -76.901062791814354, 6.650033678111754 ], [ -76.905739509270916, 6.693648585913479 ], [ -76.932172004234587, 6.672357896399774 ], [ -76.944858567668746, 6.702175198526561 ], [ -76.969947476394907, 6.704655667225268 ], [ -76.948837653135172, 6.731966661332365 ], [ -76.966614346075175, 6.752378851702645 ], [ -76.972789680299513, 6.810204779027345 ], [ -76.883286098874351, 6.844621283345532 ], [ -76.836157192700284, 6.840590521935042 ], [ -76.811042447351042, 6.862630520282266 ], [ -76.797244838978145, 6.889321396765013 ], [ -76.802257453218886, 6.926786811462193 ], [ -76.835640427863439, 6.985982164345387 ], [ -76.816597663051709, 7.008332221055127 ], [ -76.68340165855966, 7.026031398730083 ], [ -76.546097378291336, 6.991020616108528 ], [ -76.505272996651456, 7.074426378574515 ], [ -76.508347743653417, 7.186305854231762 ], [ -76.542945116024271, 7.266998603103048 ], [ -76.59785132507858, 7.312241318881775 ], [ -76.646220465601971, 7.321310532954726 ], [ -76.692496711054332, 7.354435126080205 ], [ -76.876878220653339, 7.565404161173092 ], [ -76.980851203120494, 7.63917226788584 ], [ -77.126372035840745, 7.780920722513315 ], [ -77.113323737200687, 7.788387966131722 ], [ -77.120170864993383, 7.842389838520205 ], [ -77.093350796402092, 7.837144680282734 ], [ -77.02167558476043, 7.898484605080455 ], [ -77.003459642248686, 7.99940867806805 ], [ -76.959870571969304, 8.065218613847946 ], [ -76.960516527115999, 8.169553331521001 ], [ -76.985457524345236, 8.256179684045151 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-COR", "NAME_1": "Córdoba" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -76.44483097368402, 8.869865946937113 ], [ -76.426869269999941, 8.910549221000053 ], [ -76.323963995999918, 8.941351630000042 ], [ -76.264271613999938, 8.996323960000041 ], [ -76.254953579999949, 9.070786851000037 ], [ -76.192616339999915, 9.134914455000057 ], [ -76.168120897999927, 9.246975002000056 ], [ -76.116932745999918, 9.265814520000049 ], [ -76.096099412999934, 9.333197333000044 ], [ -75.976925156999926, 9.382517238000048 ], [ -75.953284621999899, 9.402296152000076 ], [ -75.943798042999902, 9.440734321000093 ], [ -75.909982876999948, 9.428168036000045 ], [ -75.811024542999917, 9.443548895000049 ], [ -75.798207160999937, 9.418198960000041 ], [ -75.826730923999946, 9.426011460000041 ], [ -75.852853969999899, 9.412054755000042 ], [ -75.82485917899993, 9.412054755000042 ], [ -75.811879035999937, 9.391546942000048 ], [ -75.76203365799995, 9.421820380000042 ], [ -75.698272265352728, 9.416896877388979 ], [ -75.699094814973705, 9.354080512205883 ], [ -75.580884976360551, 9.30581472446994 ], [ -75.548535528691673, 9.26785838515633 ], [ -75.465336472700017, 9.237989407085479 ], [ -75.430222338190333, 9.152800807910921 ], [ -75.212845424876434, 9.04161896424381 ], [ -75.222431402886912, 9.02309296336955 ], [ -75.197652554321905, 8.983353787347369 ], [ -75.209202237093564, 8.92384837520234 ], [ -75.29681962812333, 8.896692409826812 ], [ -75.356609260209154, 8.84176036235084 ], [ -75.344491135757323, 8.678592027000434 ], [ -75.305268723672668, 8.491239122287652 ], [ -75.183544887586493, 8.401942247336819 ], [ -75.078099127672601, 8.453127753343153 ], [ -74.943326992047048, 8.486278183990976 ], [ -74.809407518042519, 8.350730902908822 ], [ -74.800958421593862, 8.249625962767936 ], [ -74.834883998597661, 8.188725287541956 ], [ -74.886224535134204, 8.154205431335583 ], [ -74.942577684112791, 8.072582506477488 ], [ -75.01735348207751, 8.074675401548518 ], [ -75.060942552356892, 8.05914663331049 ], [ -75.114401822386185, 8.067621568180812 ], [ -75.228761765842819, 8.045969143461207 ], [ -75.361673550394016, 7.883808499362715 ], [ -75.458566861071745, 7.807792467048728 ], [ -75.490296190217009, 7.738571886583259 ], [ -75.546675177617317, 7.689453437226348 ], [ -75.565433723387628, 7.606280218757092 ], [ -75.590005866377624, 7.569512436949367 ], [ -75.769426438579274, 7.49889659340306 ], [ -75.856992153664919, 7.367250880723532 ], [ -76.407759569248697, 7.38035085710635 ], [ -76.497573208137055, 7.600001531745306 ], [ -76.505117967020567, 7.74074229602013 ], [ -76.468324347690498, 7.874816798756228 ], [ -76.419490119173645, 7.979099840485219 ], [ -76.41938676638614, 8.09865326623526 ], [ -76.317945930360395, 8.280890203919739 ], [ -76.217331915735315, 8.410158799788746 ], [ -76.213688727952444, 8.452921046868823 ], [ -76.229114143402967, 8.577590440546373 ], [ -76.277534959870479, 8.64151418683025 ], [ -76.346316290764207, 8.674793808687298 ], [ -76.388845994746873, 8.738898423923104 ], [ -76.412307094596713, 8.839512436749544 ], [ -76.44483097368402, 8.869865946937113 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-SUC", "NAME_1": "Sucre" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -75.698272265352728, 9.416896877388979 ], [ -75.672607851999942, 9.409990145000052 ], [ -75.620632772999897, 9.452853128000072 ], [ -75.577167464999945, 9.56221350900006 ], [ -75.57636690399994, 9.62108590400004 ], [ -75.618031378999945, 9.689276434000078 ], [ -75.657794426999942, 9.705232142000057 ], [ -75.702806239999916, 9.690716519000091 ], [ -75.70513735399993, 9.700661772000046 ], [ -75.639945061999924, 9.783262609000076 ], [ -75.589515920999929, 9.964189339000086 ], [ -75.581576475907369, 10.09200204903731 ], [ -75.485645311182168, 10.143127956989588 ], [ -75.53654659724765, 10.04721649824279 ], [ -75.524144252854967, 10.032953802775751 ], [ -75.475749273909855, 10.039620063415157 ], [ -75.463941209619122, 9.965050971025505 ], [ -75.478203905086161, 9.915415757731012 ], [ -75.375083584240031, 9.877614447149028 ], [ -75.327205370131708, 9.881412665462108 ], [ -75.37446346661568, 9.640290432357574 ], [ -75.29793067126343, 9.677678330890217 ], [ -75.182769742129892, 9.643158473784524 ], [ -75.067763840828604, 9.539805609840982 ], [ -75.008413459213784, 9.53127899812722 ], [ -75.029549119995863, 9.483090724757119 ], [ -75.020454068400511, 9.46828542693089 ], [ -74.984668137624453, 9.457950140986213 ], [ -74.942035081753602, 9.469293118182861 ], [ -74.903975388753167, 9.437408759406708 ], [ -74.940794847404277, 9.34669078205394 ], [ -74.900409715336082, 9.176856186963448 ], [ -74.862789272806708, 9.14931264885962 ], [ -74.825349698329887, 9.076474718133738 ], [ -74.659209967865706, 8.96568044719487 ], [ -74.542188686758493, 8.814526881710208 ], [ -74.602960170775248, 8.727090358733051 ], [ -74.550508591997925, 8.462765408197015 ], [ -74.574408942318826, 8.40101207135001 ], [ -74.603735318030488, 8.4050428327605 ], [ -74.636007250434261, 8.331946518716848 ], [ -74.680216437438617, 8.309829006003838 ], [ -74.740006070423817, 8.311301785249157 ], [ -74.804963344582688, 8.279882514466465 ], [ -74.809407518042519, 8.350730902908822 ], [ -74.943326992047048, 8.486278183990976 ], [ -75.078099127672601, 8.453127753343153 ], [ -75.183544887586493, 8.401942247336819 ], [ -75.295114304881224, 8.48061961550286 ], [ -75.31914384641135, 8.52126312909013 ], [ -75.356609260209154, 8.84176036235084 ], [ -75.29681962812333, 8.896692409826812 ], [ -75.209202237093564, 8.92384837520234 ], [ -75.197652554321905, 8.983353787347369 ], [ -75.222431402886912, 9.02309296336955 ], [ -75.212845424876434, 9.04161896424381 ], [ -75.430222338190333, 9.152800807910921 ], [ -75.465336472700017, 9.237989407085479 ], [ -75.548535528691673, 9.26785838515633 ], [ -75.580884976360551, 9.30581472446994 ], [ -75.699094814973705, 9.354080512205883 ], [ -75.698272265352728, 9.416896877388979 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-BOL", "NAME_1": "Bolívar" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -75.581576475907369, 10.09200204903731 ], [ -75.589360705999923, 10.128261433000091 ], [ -75.540882941999939, 10.188544012000079 ], [ -75.530669725999928, 10.240668036000045 ], [ -75.64378608699991, 10.154375703000085 ], [ -75.703576645999931, 10.134428033000063 ], [ -75.688922325999897, 10.167966257000046 ], [ -75.630848761999914, 10.213446356000077 ], [ -75.615101691999939, 10.269517320000091 ], [ -75.592152472999942, 10.268622137000079 ], [ -75.592152472999942, 10.302720445000091 ], [ -75.583811001999948, 10.282375393000052 ], [ -75.515695766999897, 10.31899648600006 ], [ -75.523833787999934, 10.391506252000056 ], [ -75.539173956999946, 10.386297919000071 ], [ -75.551136847999942, 10.419419664000088 ], [ -75.578480597999942, 10.398342190000051 ], [ -75.565500454999949, 10.43305084800005 ], [ -75.502756313999953, 10.48773834800005 ], [ -75.522206183999913, 10.432928778000075 ], [ -75.493275519999941, 10.434637762000079 ], [ -75.489125128999945, 10.501369533000059 ], [ -75.510243292999917, 10.508205471000053 ], [ -75.504465298999946, 10.551581122000073 ], [ -75.524525519999941, 10.567084052000041 ], [ -75.463856574999909, 10.602728583000044 ], [ -75.461822068999936, 10.631048895000049 ], [ -75.424183722999942, 10.64329661700009 ], [ -75.403797980999911, 10.680121161000045 ], [ -75.30728105399993, 10.709540106000077 ], [ -75.27961178299995, 10.742743231000077 ], [ -75.263050910999937, 10.739813544000071 ], [ -75.262868211798548, 10.673974106819571 ], [ -75.227133958765194, 10.62826630304744 ], [ -75.266382209271512, 10.530675361278895 ], [ -75.25382483614726, 10.497369900100807 ], [ -75.174914923984545, 10.478611355229873 ], [ -75.176775275058901, 10.456571356882591 ], [ -75.132746955207779, 10.402569485393428 ], [ -75.07652299743836, 10.414351711262441 ], [ -74.982652756919208, 10.342754014885884 ], [ -74.917462937864286, 10.267409776140255 ], [ -74.944644741661477, 10.186639512903184 ], [ -74.943482021677937, 10.137469386702833 ], [ -74.852660692436984, 10.09307933254513 ], [ -74.807598842912284, 10.034452419543527 ], [ -74.81232723721223, 9.985463162295105 ], [ -74.87051489884351, 9.95065908524856 ], [ -74.878860643403982, 9.915493272096796 ], [ -74.874080573159915, 9.848985704326765 ], [ -74.815221117060901, 9.768680528183836 ], [ -74.828450282854249, 9.685791531454015 ], [ -74.781347215101903, 9.631324571072071 ], [ -74.799795701610321, 9.44862254539413 ], [ -74.770236782801248, 9.453066717954641 ], [ -74.742305671069857, 9.418314316852218 ], [ -74.703238287716772, 9.429631456526465 ], [ -74.677115852014936, 9.394724025793153 ], [ -74.636472338427666, 9.38216665356822 ], [ -74.53265438469208, 9.242976182005179 ], [ -74.512164679956015, 9.240831610990028 ], [ -74.478807542833806, 9.269279487558265 ], [ -74.43072262225121, 9.267496649950431 ], [ -74.413333502938769, 9.226517239578925 ], [ -74.35362138521873, 9.231245632080231 ], [ -74.311660122017031, 9.213908188711912 ], [ -74.294968634694726, 9.16646922417533 ], [ -74.238021205614132, 9.154325263100418 ], [ -74.197015956820962, 9.093062851769162 ], [ -74.141515468564023, 9.058310452465378 ], [ -74.153271856910635, 9.049008694395695 ], [ -74.090795050551151, 9.029164943907006 ], [ -74.060460985386158, 9.032472235805017 ], [ -74.043407761958633, 9.055209866142377 ], [ -74.010438199363421, 9.022963772160324 ], [ -74.016096767851536, 9.007409166399896 ], [ -73.984057380343813, 8.989270738253936 ], [ -73.872100389421405, 8.973276882022446 ], [ -73.882409837843738, 8.914184881926758 ], [ -73.807582363934955, 8.816593940158214 ], [ -73.829648199804581, 8.643581244378936 ], [ -73.796368577947476, 8.579450792520049 ], [ -73.754691534686572, 8.388738918166553 ], [ -73.767429775863434, 8.358637396998233 ], [ -73.755415005098371, 8.329000962924113 ], [ -73.796368577947476, 8.212935696225372 ], [ -73.785645718375179, 8.16146596937898 ], [ -73.855357225255716, 8.105448717184515 ], [ -73.872255419052351, 8.044909776265172 ], [ -73.816858282683597, 7.80141042724938 ], [ -73.836004401182151, 7.694776108930284 ], [ -73.823291999326273, 7.672038479492244 ], [ -73.830475023003885, 7.610078437070229 ], [ -73.913183152580416, 7.494865831093193 ], [ -73.899385546006158, 7.421252753112071 ], [ -73.93023637600794, 7.300794988897621 ], [ -74.252878181183121, 6.99605906787167 ], [ -74.343906215999084, 7.010425116126214 ], [ -74.398269822694147, 7.168554998814159 ], [ -74.396461147563912, 7.343428046567055 ], [ -74.358323941097012, 7.391926378299729 ], [ -74.347420214371368, 7.432879950249514 ], [ -74.364370083212748, 7.488819688078138 ], [ -74.404419317597444, 7.457400418194709 ], [ -74.445993008070843, 7.380893459465597 ], [ -74.489065314412699, 7.357768256399879 ], [ -74.528701137647374, 7.381746121086621 ], [ -74.581772834049048, 7.466779689730856 ], [ -74.573556280697801, 7.605970160394577 ], [ -74.499038866050796, 7.678058783186259 ], [ -74.480900437904893, 7.724231675851172 ], [ -74.522344937169123, 7.771541449178528 ], [ -74.552472296759049, 7.929206243873068 ], [ -74.599549526989051, 7.99824595808451 ], [ -74.834883998597661, 8.188725287541956 ], [ -74.800958421593862, 8.249625962767936 ], [ -74.804963344582688, 8.279882514466465 ], [ -74.740006070423817, 8.311301785249157 ], [ -74.657117071895357, 8.317451280152454 ], [ -74.620917730868598, 8.349103094931877 ], [ -74.603735318030488, 8.4050428327605 ], [ -74.574408942318826, 8.40101207135001 ], [ -74.567510138582008, 8.413078518059137 ], [ -74.550508591997925, 8.462765408197015 ], [ -74.562342494710322, 8.570459092812882 ], [ -74.585751918616154, 8.611800238390288 ], [ -74.602960170775248, 8.727090358733051 ], [ -74.542188686758493, 8.814526881710208 ], [ -74.659209967865706, 8.96568044719487 ], [ -74.825349698329887, 9.076474718133738 ], [ -74.862789272806708, 9.14931264885962 ], [ -74.900409715336082, 9.176856186963448 ], [ -74.940794847404277, 9.34669078205394 ], [ -74.903975388753167, 9.437408759406708 ], [ -74.942035081753602, 9.469293118182861 ], [ -74.984668137624453, 9.457950140986213 ], [ -75.020454068400511, 9.46828542693089 ], [ -75.029549119995863, 9.483090724757119 ], [ -75.008413459213784, 9.53127899812722 ], [ -75.067763840828604, 9.539805609840982 ], [ -75.182769742129892, 9.643158473784524 ], [ -75.29793067126343, 9.677678330890217 ], [ -75.37446346661568, 9.640290432357574 ], [ -75.327205370131708, 9.881412665462108 ], [ -75.375083584240031, 9.877614447149028 ], [ -75.478203905086161, 9.915415757731012 ], [ -75.463941209619122, 9.965050971025505 ], [ -75.475749273909855, 10.039620063415157 ], [ -75.524144252854967, 10.032953802775751 ], [ -75.53654659724765, 10.04721649824279 ], [ -75.485645311182168, 10.143127956989588 ], [ -75.581576475907369, 10.09200204903731 ] ] ], [ [ [ -75.229682862134098, 10.763420758879358 ], [ -75.249501105999911, 10.747748114000046 ], [ -75.270008917999917, 10.759100653000075 ], [ -75.267404751999948, 10.795314846000053 ], [ -75.228736899568716, 10.810866721483071 ], [ -75.229682862134098, 10.763420758879358 ] ] ], [ [ [ -75.586801161999915, 10.367791823000061 ], [ -75.575830134999933, 10.377872464000063 ], [ -75.535319918999903, 10.350646060000088 ], [ -75.590661324999928, 10.319043831000045 ], [ -75.586801161999915, 10.367791823000061 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-ATL", "NAME_1": "Atlántico" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -75.256337043719554, 10.709337773519394 ], [ -75.222238735999952, 10.73468659100007 ], [ -75.228736899568716, 10.810866721483071 ], [ -75.215687628999945, 10.826605536000045 ], [ -75.049549933999913, 10.901190497000073 ], [ -75.023589647999927, 10.974310614000046 ], [ -74.962809279999931, 10.994894226000042 ], [ -74.923570574999928, 11.045671746000039 ], [ -74.861510172999942, 11.048833740000077 ], [ -74.845338024999933, 11.062129538000079 ], [ -74.8474980055788, 11.087667762584534 ], [ -74.774267544211796, 11.010025945840709 ], [ -74.724709846182463, 10.900316881418917 ], [ -74.742305671069857, 10.840940660483056 ], [ -74.722642787734458, 10.774820665441325 ], [ -74.728637254805449, 10.583953762356259 ], [ -74.748119269188919, 10.550338242815656 ], [ -74.806720343768859, 10.51034068437508 ], [ -74.836072557002865, 10.406135158810514 ], [ -74.917462937864286, 10.267409776140255 ], [ -74.982652756919208, 10.342754014885884 ], [ -75.07652299743836, 10.414351711262441 ], [ -75.132746955207779, 10.402569485393428 ], [ -75.176775275058901, 10.456571356882591 ], [ -75.17134924966814, 10.476363430527897 ], [ -75.25382483614726, 10.497369900100807 ], [ -75.266382209271512, 10.530675361278895 ], [ -75.227133958765194, 10.62826630304744 ], [ -75.262868211798548, 10.673974106819571 ], [ -75.256337043719554, 10.709337773519394 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-MAG", "NAME_1": "Magdalena" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -74.8474980055788, 11.087667762584534 ], [ -74.84437231499993, 11.10966965700004 ], [ -74.5229509159999, 10.995924341000091 ], [ -74.403472459999932, 10.982855536000045 ], [ -74.297829547999925, 10.991499283000053 ], [ -74.361805792999917, 10.971665757000039 ], [ -74.491566535999937, 10.979478257000039 ], [ -74.517445441999939, 10.926662502000056 ], [ -74.481760219999899, 10.850816148000092 ], [ -74.525013800999943, 10.88344961100006 ], [ -74.536366339999915, 10.871893622000073 ], [ -74.581369594999899, 10.888088283000059 ], [ -74.596994594999899, 10.86782461100006 ], [ -74.598459438999953, 10.781927802000041 ], [ -74.564279751999948, 10.830959377000056 ], [ -74.543812628999945, 10.80923086100006 ], [ -74.543812628999945, 10.76203034100007 ], [ -74.499663865999935, 10.764715887000079 ], [ -74.495432094999899, 10.781927802000041 ], [ -74.515614386999914, 10.778225002000056 ], [ -74.523304816999939, 10.802964585000041 ], [ -74.509632941999939, 10.844549872000073 ], [ -74.477121548999946, 10.82758209800005 ], [ -74.456613735999952, 10.748032945000091 ], [ -74.402088995999918, 10.748032945000091 ], [ -74.362172003999945, 10.77570221600007 ], [ -74.280425584999932, 10.989732164000088 ], [ -74.218129035999937, 11.079087632000039 ], [ -74.235951300999943, 11.125148830000057 ], [ -74.233631964999915, 11.241156317000048 ], [ -74.187489386999914, 11.316961981000077 ], [ -74.151844855999911, 11.319728908000059 ], [ -74.153391079999949, 11.343654690000051 ], [ -74.139068162999934, 11.323716539000088 ], [ -74.126088019999941, 11.343654690000051 ], [ -74.112416144999941, 11.337388414000088 ], [ -74.112416144999941, 11.357896226000037 ], [ -74.083851691999939, 11.330633856000077 ], [ -74.065419074999909, 11.351752020000049 ], [ -74.004628058999913, 11.355292059000078 ], [ -73.951039191999939, 11.320298570000091 ], [ -73.826039191999939, 11.276760158000059 ], [ -73.565581834999932, 11.277085679000038 ], [ -73.581808031015782, 11.191461900546244 ], [ -73.637773607266126, 11.139165351399811 ], [ -73.651002773958851, 10.999819851105258 ], [ -73.605785894803205, 10.845514024252793 ], [ -73.64560258698981, 10.77109996239335 ], [ -73.58968868668353, 10.763348497035508 ], [ -73.563721279713263, 10.744021511383608 ], [ -73.614079963419556, 10.65046133102561 ], [ -73.597595180772942, 10.549046332522209 ], [ -73.570878464969155, 10.51243358034543 ], [ -73.77045284692133, 10.391174832252716 ], [ -73.920159470683018, 10.357171739084492 ], [ -74.050539109692124, 10.169896348737495 ], [ -74.069090948988105, 10.079488429747244 ], [ -74.008009405709515, 9.958307196020257 ], [ -73.841766324256469, 9.789945380175141 ], [ -73.842748176187342, 9.739819241364899 ], [ -73.784224615973244, 9.597450670012392 ], [ -73.800709397720539, 9.577839464419753 ], [ -73.8257983064467, 9.597218126015662 ], [ -73.876053635566791, 9.569287014284271 ], [ -74.027103848263948, 9.591171983000606 ], [ -74.137097134425176, 9.498231920266903 ], [ -74.000955573241072, 9.399064846465478 ], [ -73.994676887128605, 9.34227244701583 ], [ -73.955738694984746, 9.295040188054202 ], [ -73.958529222045968, 9.20292694672122 ], [ -73.878689133896387, 9.184452622690344 ], [ -73.8550471668932, 9.117970893342033 ], [ -73.799805061054712, 9.055597438870677 ], [ -73.870395067078675, 8.887674871697982 ], [ -73.884890305643069, 8.943640447948326 ], [ -73.872100389421405, 8.973276882022446 ], [ -73.984057380343813, 8.989270738253936 ], [ -74.016096767851536, 9.007409166399896 ], [ -74.010438199363421, 9.022963772160324 ], [ -74.043407761958633, 9.055209866142377 ], [ -74.060460985386158, 9.032472235805017 ], [ -74.090795050551151, 9.029164943907006 ], [ -74.153271856910635, 9.049008694395695 ], [ -74.141515468564023, 9.058310452465378 ], [ -74.197015956820962, 9.093062851769162 ], [ -74.238021205614132, 9.154325263100418 ], [ -74.294968634694726, 9.16646922417533 ], [ -74.311660122017031, 9.213908188711912 ], [ -74.35362138521873, 9.231245632080231 ], [ -74.413333502938769, 9.226517239578925 ], [ -74.43072262225121, 9.267496649950431 ], [ -74.478807542833806, 9.269279487558265 ], [ -74.512164679956015, 9.240831610990028 ], [ -74.53265438469208, 9.242976182005179 ], [ -74.636472338427666, 9.38216665356822 ], [ -74.677115852014936, 9.394724025793153 ], [ -74.703238287716772, 9.429631456526465 ], [ -74.742305671069857, 9.418314316852218 ], [ -74.770236782801248, 9.453066717954641 ], [ -74.799795701610321, 9.44862254539413 ], [ -74.781347215101903, 9.631324571072071 ], [ -74.828450282854249, 9.685791531454015 ], [ -74.815221117060901, 9.768680528183836 ], [ -74.874080573159915, 9.848985704326765 ], [ -74.878860643403982, 9.915493272096796 ], [ -74.87051489884351, 9.95065908524856 ], [ -74.81232723721223, 9.985463162295105 ], [ -74.804369066279378, 10.025331529526454 ], [ -74.852660692436984, 10.09307933254513 ], [ -74.932113206958945, 10.12604889603972 ], [ -74.947745327085158, 10.165633043330274 ], [ -74.924310064757663, 10.254154771025867 ], [ -74.836072557002865, 10.406135158810514 ], [ -74.806720343768859, 10.51034068437508 ], [ -74.748119269188919, 10.550338242815656 ], [ -74.725846726844964, 10.605115261560059 ], [ -74.722642787734458, 10.774820665441325 ], [ -74.742305671069857, 10.840940660483056 ], [ -74.728637254805449, 10.919127102233972 ], [ -74.759022996813826, 10.954447944117305 ], [ -74.774267544211796, 11.010025945840709 ], [ -74.8474980055788, 11.087667762584534 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-SAP", "NAME_1": "San Andrés y Providencia" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -81.711496548999946, 12.522935289000088 ], [ -81.716949022999927, 12.56321849200009 ], [ -81.691029425999943, 12.59125397300005 ], [ -81.704741990999935, 12.504461981000077 ], [ -81.717396613999938, 12.502427476000037 ], [ -81.711496548999946, 12.522935289000088 ] ] ], [ [ [ -81.382639126999948, 13.319159247000073 ], [ -81.386138475999928, 13.341457424000055 ], [ -81.365345831999946, 13.373968817000048 ], [ -81.346302863999938, 13.348700262000079 ], [ -81.382639126999948, 13.319159247000073 ] ] ], [ [ [ -80.089914516999897, 13.578355210000041 ], [ -80.089426235999952, 13.576849677000041 ], [ -80.090402798999946, 13.576605536000045 ], [ -80.090891079999949, 13.578029690000051 ], [ -80.089914516999897, 13.578355210000041 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-X01~", "NAME_1": null }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -81.611724412999934, 3.958970445000091 ], [ -81.601429816999939, 3.988348700000074 ], [ -81.58226477799991, 3.991522528000075 ], [ -81.58031165299991, 3.97601959800005 ], [ -81.611724412999934, 3.958970445000091 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-CAQ", "NAME_1": "Caquetá" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -75.155587938332701, 2.523670558749302 ], [ -75.122385829942061, 2.534109198380804 ], [ -75.003194139397976, 2.638185532736145 ], [ -75.003504197760492, 2.685107734234521 ], [ -75.049573736738523, 2.724381822263297 ], [ -75.052906867058255, 2.768203437438672 ], [ -75.020299037870302, 2.835434474721239 ], [ -74.922578904892532, 2.941732896256156 ], [ -74.897515834588091, 2.950724595963322 ], [ -74.712565884208175, 2.896955268470833 ], [ -74.662465582920277, 2.795591945911553 ], [ -74.59644894066605, 2.721229559996175 ], [ -74.659442511862437, 2.382645575432946 ], [ -74.645851609963813, 2.318205064312281 ], [ -74.543738980369653, 2.181934311918951 ], [ -74.549190843282759, 2.142918606308626 ], [ -74.6159051166278, 2.043131414882907 ], [ -74.606835904353488, 1.962361152545157 ], [ -74.550534431318965, 1.871358954352274 ], [ -74.510821091919865, 1.843918769035952 ], [ -73.917834031615257, 1.634732571550899 ], [ -73.757482061747737, 1.6382465681246 ], [ -73.675058153011321, 1.624500637494407 ], [ -73.665213792582449, 1.584037991060427 ], [ -73.563927985288274, 1.436811835098126 ], [ -73.496877814259733, 1.381156318109561 ], [ -73.443186001133029, 1.302349757835032 ], [ -73.425745204977204, 1.209435533523049 ], [ -73.247254807863101, 1.028309638079349 ], [ -73.199040696970599, 1.009447740420853 ], [ -73.175682949908207, 0.968468329150085 ], [ -73.135297817840012, 0.941544907771288 ], [ -73.062899135786495, 0.924698390818094 ], [ -73.011351894574261, 0.947746080417289 ], [ -72.938178067064143, 1.024743963762887 ], [ -72.893064540696002, 1.046551418113438 ], [ -72.870611131198757, 1.157655748314141 ], [ -72.82557512099504, 1.194759426006669 ], [ -72.760747036246698, 1.153418280429264 ], [ -72.738629522634369, 1.197343248392201 ], [ -72.670700853361666, 1.191090399802079 ], [ -72.544507005393996, 1.103602199981538 ], [ -72.474097865624003, 1.085102037528998 ], [ -72.428105841911076, 1.042417303915443 ], [ -72.40291358129673, 0.947332668367949 ], [ -72.362425096441029, 0.932966620113405 ], [ -72.347051357833891, 0.876846015131491 ], [ -72.312247280787346, 0.883615626759763 ], [ -72.311523811274867, 0.813542385572646 ], [ -72.264084845838966, 0.784655260331988 ], [ -72.238117437969379, 0.736596178171055 ], [ -72.152463751700793, 0.727707831251394 ], [ -72.098410204267509, 0.704143377714672 ], [ -72.078023851419573, 0.669210110358279 ], [ -72.019655320836364, 0.655464178828765 ], [ -71.995083176947048, 0.576295885146976 ], [ -71.979115160036599, 0.564513658378644 ], [ -71.96084754068147, 0.580326646557467 ], [ -71.932787237740797, 0.555211900308962 ], [ -71.936404588001324, 0.486688950934308 ], [ -71.84302527479656, 0.417235826472222 ], [ -71.847004361162305, 0.355534166468601 ], [ -71.787085536967936, 0.373310859408605 ], [ -71.688977831261866, 0.258279119685596 ], [ -71.538547736189059, 0.177663886079472 ], [ -71.421423102294341, 0.191616523183995 ], [ -71.32233354375802, 0.133222154179066 ], [ -71.389719610671477, 0.067489731865635 ], [ -71.689055344728388, -0.085679212525633 ], [ -71.774192267958767, -0.224688816036064 ], [ -71.845040656401181, -0.245876152762264 ], [ -72.012188076318637, -0.247581475104994 ], [ -72.128640916644997, -0.326336357636819 ], [ -72.232381354216102, -0.467309665908374 ], [ -72.24238074427592, -0.586940606024143 ], [ -72.279820318752684, -0.621253756655562 ], [ -72.324520433071541, -0.629263603532479 ], [ -72.421852993320954, -0.556554864015766 ], [ -72.478412848773928, -0.59402027781357 ], [ -72.56442827024847, -0.684970798263748 ], [ -72.749894986364495, -0.559242039188746 ], [ -72.884822149822355, -0.601720065428708 ], [ -72.997425095891458, -0.526582533157409 ], [ -73.081295946350849, -0.593555189820165 ], [ -73.16532182464249, -0.608386326068114 ], [ -73.205500251135675, -0.604717298964204 ], [ -73.331771612569867, -0.507307223449629 ], [ -73.388977424068855, -0.531336764979756 ], [ -73.554212816068571, -0.520639743829122 ], [ -73.586071337322323, -0.470565280962944 ], [ -73.640434943118123, -0.457852878207746 ], [ -73.643561366963525, -0.421886082077037 ], [ -73.695857917009278, -0.39377410229298 ], [ -73.728362393409725, -0.386539401771984 ], [ -73.787325202296245, -0.407365004191604 ], [ -73.941682705092774, -0.369744560762854 ], [ -74.011420051294294, -0.335121351768976 ], [ -74.116684943155576, -0.246341240755669 ], [ -74.168774786726999, -0.258330173099012 ], [ -74.19290768104463, -0.220451348151187 ], [ -74.240424159946997, -0.22789275514657 ], [ -74.282023687942853, -0.149396254133819 ], [ -74.327576463882679, -0.122834567960979 ], [ -74.399458381099407, -0.132291354762231 ], [ -74.4131784742072, -0.09027841561641 ], [ -74.429637416633454, -0.082992039151293 ], [ -74.469790004704919, -0.125780124653033 ], [ -74.592676560774635, -0.102060641485423 ], [ -74.609703945780439, -0.063561699812624 ], [ -74.663835007579507, -0.054156588955436 ], [ -74.684066331695817, 0.00630483579954 ], [ -74.658279791878897, 0.053847154022947 ], [ -74.695590176045755, 0.074621080498446 ], [ -74.676702439965595, 0.109864407116675 ], [ -74.682903611712277, 0.150947170275685 ], [ -74.742874111850767, 0.200298162730007 ], [ -74.855347866710645, 0.221898912404868 ], [ -74.962447272123882, 0.270836492809906 ], [ -74.989034796718499, 0.360908515015922 ], [ -74.996166143552671, 0.469945786768619 ], [ -75.072337206396924, 0.472943020304115 ], [ -75.095694952559995, 0.507462877409864 ], [ -75.164863857980663, 0.488445950120479 ], [ -75.186697149853558, 0.496197415478321 ], [ -75.21604936398694, 0.55190460931027 ], [ -75.212432013726414, 0.619497381798737 ], [ -75.251421881814395, 0.679700425933902 ], [ -75.262868211798548, 0.728948066500038 ], [ -75.31759355280019, 0.751323960732179 ], [ -75.459083625009271, 0.749463608758504 ], [ -75.498616096355761, 0.763571275493973 ], [ -75.55985266836592, 0.828580227395548 ], [ -75.600082769903906, 0.847442125054044 ], [ -75.732296921565649, 0.84811391772314 ], [ -75.828105028424318, 0.879481513461087 ], [ -75.899573533591706, 0.953843899376466 ], [ -75.932749802661249, 1.030738429934559 ], [ -76.06051978176248, 1.043657538264767 ], [ -76.15960934119812, 1.132644354853085 ], [ -76.255004035108129, 1.137501939462936 ], [ -76.295337491232203, 1.184785875267892 ], [ -76.282289190793506, 1.339970201263782 ], [ -76.164647792961262, 1.562695623803961 ], [ -76.145294968887697, 1.575511379346665 ], [ -75.980576340825451, 1.563729153477652 ], [ -75.840998298332806, 1.680621243375697 ], [ -75.626386074557672, 1.964634914769476 ], [ -75.551222703864653, 2.032899481725678 ], [ -75.421463181580577, 2.247408351813988 ], [ -75.305966355662747, 2.345076808847637 ], [ -75.231448941015799, 2.531318671319639 ], [ -75.207858649057414, 2.546718248348498 ], [ -75.155587938332701, 2.523670558749302 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-HUI", "NAME_1": "Huila" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -74.897515834588091, 2.950724595963322 ], [ -74.976787481956706, 2.892226874170888 ], [ -75.052906867058255, 2.768203437438672 ], [ -75.049573736738523, 2.724381822263297 ], [ -75.003504197760492, 2.685107734234521 ], [ -75.003194139397976, 2.638185532736145 ], [ -75.122385829942061, 2.534109198380804 ], [ -75.155587938332701, 2.523670558749302 ], [ -75.207858649057414, 2.546718248348498 ], [ -75.231448941015799, 2.531318671319639 ], [ -75.305966355662747, 2.345076808847637 ], [ -75.421463181580577, 2.247408351813988 ], [ -75.551222703864653, 2.032899481725678 ], [ -75.626386074557672, 1.964634914769476 ], [ -75.840998298332806, 1.680621243375697 ], [ -75.960164151354491, 1.573030911547335 ], [ -76.006337043120027, 1.560111803217126 ], [ -76.145294968887697, 1.575511379346665 ], [ -76.346936408388501, 1.638918361693015 ], [ -76.408586392448058, 1.685168768723713 ], [ -76.504084439145515, 1.823093167515651 ], [ -76.576896532349053, 1.879678860491026 ], [ -76.600719367404849, 1.958640447698485 ], [ -76.562272101676115, 2.024114488492842 ], [ -76.566974656655077, 2.100027167120061 ], [ -76.5365889146467, 2.129069321991608 ], [ -76.455405240259608, 2.112791245819324 ], [ -76.419438443229581, 2.126175442142937 ], [ -76.421531338300611, 2.163847561515752 ], [ -76.396519944839554, 2.186223455747893 ], [ -76.357323371176619, 2.271541246131619 ], [ -76.392566697794848, 2.366780911310002 ], [ -76.378898282429759, 2.419955958700541 ], [ -76.348719245097072, 2.413186347072269 ], [ -76.277689988602106, 2.35634227077918 ], [ -76.233661668750983, 2.351794745431164 ], [ -76.050081143030297, 2.420627753168276 ], [ -75.966184455048563, 2.490959376773787 ], [ -75.877533535244424, 2.426622219339947 ], [ -75.844486457384107, 2.428120836107666 ], [ -75.795342169605419, 2.474732978344264 ], [ -75.823376634124372, 2.530388495332772 ], [ -75.781027798194316, 2.669604804418157 ], [ -75.806039190756053, 2.71998932474753 ], [ -76.031245082894259, 2.929537258337803 ], [ -76.001091884882555, 2.949949448708082 ], [ -75.974013434772189, 2.948166611999511 ], [ -75.854692552119559, 2.890909125455778 ], [ -75.812472907398728, 2.891916815808372 ], [ -75.781570400553505, 2.948244127264672 ], [ -75.627548793641893, 3.090302639355286 ], [ -75.569645351951408, 3.233291327432823 ], [ -75.492311570922254, 3.347263699060477 ], [ -75.387046678161653, 3.378708808264889 ], [ -75.355317349016445, 3.408655299802206 ], [ -75.316120775353511, 3.411755886125206 ], [ -75.257778083191965, 3.373644517180708 ], [ -75.213258836925775, 3.410128079047581 ], [ -75.178015510307546, 3.388708197425387 ], [ -75.177602098258205, 3.40547720001274 ], [ -75.142642991580772, 3.432142238973142 ], [ -75.03564693895504, 3.434157620577707 ], [ -75.067841356093709, 3.3014267031798 ], [ -74.966142136750193, 3.278844102473329 ], [ -74.908884650206403, 3.289928697251582 ], [ -74.777109748116345, 3.441392320199384 ], [ -74.77452592573087, 3.514772854183889 ], [ -74.733882412143601, 3.560325629224394 ], [ -74.727991298759434, 3.608668931326122 ], [ -74.563531053115582, 3.772121487516642 ], [ -74.493561163816651, 3.70401194929201 ], [ -74.498367071583061, 3.675150662473072 ], [ -74.542602097908457, 3.583528347555159 ], [ -74.6159051166278, 3.48505890484455 ], [ -74.651742723347979, 3.259982204814889 ], [ -74.681353319000436, 3.210398668363837 ], [ -74.824600388597048, 3.107381700305211 ], [ -74.897515834588091, 2.950724595963322 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-GUV", "NAME_1": "Guaviare" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -73.082897915006754, 0.924336656511457 ], [ -73.175682949908207, 0.968468329150085 ], [ -73.199040696970599, 1.009447740420853 ], [ -73.247254807863101, 1.028309638079349 ], [ -73.425745204977204, 1.209435533523049 ], [ -73.443186001133029, 1.302349757835032 ], [ -73.496877814259733, 1.381156318109561 ], [ -73.563927985288274, 1.436811835098126 ], [ -73.665213792582449, 1.584037991060427 ], [ -73.675058153011321, 1.624500637494407 ], [ -73.661131354328518, 1.641967271172632 ], [ -73.660330369550877, 2.253402817985659 ], [ -73.626637335644489, 2.366367499260662 ], [ -73.598266975240676, 2.386366278480978 ], [ -73.585399542854589, 2.362543443425182 ], [ -73.530415819434495, 2.383110663426351 ], [ -73.510313687426731, 2.352414862156138 ], [ -73.455071580688866, 2.347195543239707 ], [ -73.444684617900805, 2.385901191386836 ], [ -73.42685624901668, 2.331020819854928 ], [ -73.395488654178052, 2.344094956916706 ], [ -73.376704270885398, 2.329418850299703 ], [ -73.36344926577101, 2.353758450192288 ], [ -73.346344367298684, 2.349055894314063 ], [ -73.344122281018429, 2.328643703943783 ], [ -73.317741461998878, 2.347247219183828 ], [ -73.250355394186101, 2.34378489855419 ], [ -73.247125616653875, 2.371948554282369 ], [ -73.215318773142826, 2.388381659186223 ], [ -73.173202481209501, 2.385126044131596 ], [ -73.144754604641264, 2.36171662022582 ], [ -73.124445767058489, 2.394169419782884 ], [ -73.102431607132928, 2.382077135551356 ], [ -73.061323004652934, 2.413082994284764 ], [ -73.020576138278159, 2.411274319154472 ], [ -72.930452440128022, 2.467756659342342 ], [ -72.937635463805577, 2.513645331167083 ], [ -72.819942390029269, 2.596741034371234 ], [ -72.790305955955091, 2.600978502256055 ], [ -72.762297328958539, 2.565890204369452 ], [ -72.737208422031017, 2.559534002991825 ], [ -72.703334520072019, 2.607489732365252 ], [ -72.670442470943271, 2.613897609686944 ], [ -72.641994595274355, 2.562789618046452 ], [ -72.610032722132416, 2.620512193482909 ], [ -72.576727260954328, 2.579584459055525 ], [ -72.573445808377357, 2.629400540402628 ], [ -72.535747849683503, 2.641596178320981 ], [ -72.553679572254453, 2.675444240958939 ], [ -72.507274135592866, 2.665212306902447 ], [ -72.474847175356842, 2.687949937239807 ], [ -72.421904670164395, 2.694202785829873 ], [ -72.366533373116681, 2.738076076949369 ], [ -72.309818488032761, 2.71673370969296 ], [ -72.283747728275046, 2.752390448360472 ], [ -72.252302619070576, 2.697613430515389 ], [ -72.247780931244961, 2.754870917059179 ], [ -72.193469001393282, 2.772957668361698 ], [ -72.197370571594604, 2.833884182009399 ], [ -72.1807049217947, 2.853753770020433 ], [ -72.121044480918044, 2.867086290399982 ], [ -72.07877315935383, 2.827295437534417 ], [ -71.980381231908325, 2.799105943384575 ], [ -71.83728919104334, 2.830938625317287 ], [ -71.792046475264613, 2.861195177015816 ], [ -71.759309454867434, 2.816727606693689 ], [ -71.743160569904376, 2.881994941013716 ], [ -71.683138393821821, 2.840085353756081 ], [ -71.649548712702938, 2.86336558735195 ], [ -71.643657600218091, 2.819311428179844 ], [ -71.622625292223461, 2.815719916341038 ], [ -71.56149207210143, 2.855691637259213 ], [ -71.468707038099296, 2.852280992573753 ], [ -71.443411423798182, 2.876258857260439 ], [ -71.382381558262296, 2.845924791196126 ], [ -71.35685339996445, 2.875328681273629 ], [ -71.329594081801417, 2.858094590692815 ], [ -71.293394740774659, 2.905430203341211 ], [ -71.273757696760299, 2.871582138904557 ], [ -71.225130173818457, 2.855071518735599 ], [ -71.169061244780607, 2.884087836084746 ], [ -71.128107672830822, 2.864373276805281 ], [ -71.111803758236817, 2.876956488351254 ], [ -71.082839117731112, 2.864063219342086 ], [ -71.041007045738581, 2.873158270937438 ], [ -70.986514247834236, 2.854683946007299 ], [ -70.980132208934265, 2.813006902746338 ], [ -70.969900274877773, 2.865380968057195 ], [ -70.923598191903011, 2.828458157517957 ], [ -70.904064500676157, 2.857629502699353 ], [ -70.889595099634107, 2.815874945072665 ], [ -70.848641526785002, 2.828845730246258 ], [ -70.811279465774703, 2.791974596550403 ], [ -70.748208381111908, 2.813937078733204 ], [ -70.734824184788295, 2.782517807950455 ], [ -70.686403368320782, 2.823419704855496 ], [ -70.694774950403598, 2.869411729467743 ], [ -70.650204027294023, 2.832333889297558 ], [ -70.592843187063409, 2.841868191363915 ], [ -70.499748093799496, 2.78453318955502 ], [ -70.895692918593284, 2.62092560553225 ], [ -70.909387173279413, 2.601908678242921 ], [ -70.747071498650712, 2.529044908195942 ], [ -70.676093919898449, 2.437887681271491 ], [ -70.622324592406017, 2.327610175169411 ], [ -70.590750291992379, 2.301358547359087 ], [ -70.50287451944348, 2.275882065904625 ], [ -70.492875129383719, 2.244772854383712 ], [ -70.407298956581542, 2.263324692780316 ], [ -70.304256151000573, 2.226427721562118 ], [ -70.284619106986213, 2.25826040349483 ], [ -70.237257656815416, 2.265598455904012 ], [ -70.189922045066339, 2.251852525273819 ], [ -70.051403367971034, 2.286837470372973 ], [ -69.99507605741411, 2.219554755347644 ], [ -69.999933641124642, 2.19774730099715 ], [ -70.103028124448372, 2.122248033519895 ], [ -70.104965989888512, 2.1011640495812 ], [ -70.201652594991231, 2.031245836226333 ], [ -70.444454312016887, 1.988354397037767 ], [ -70.499257168283691, 1.951819159226829 ], [ -70.672786628000495, 1.901176256479062 ], [ -70.745417853151366, 1.917971095689495 ], [ -70.904529587770242, 1.918591213313846 ], [ -70.967729865440901, 1.853272203049698 ], [ -71.15983700197603, 1.756223862741081 ], [ -71.263758307599801, 1.673386541955324 ], [ -71.390778977867512, 1.732245998953658 ], [ -71.405248378909562, 1.598662420834046 ], [ -71.441008470364579, 1.548019517186958 ], [ -71.552448697349519, 1.262042141031998 ], [ -71.553120490018614, 1.216463528469035 ], [ -71.505061407857681, 1.115126044331475 ], [ -71.527824876616762, 1.116521308311746 ], [ -71.552913784443604, 1.160963040212152 ], [ -71.609861212624878, 1.042520656702948 ], [ -71.673113166239602, 0.981955878261147 ], [ -71.724660406552516, 0.986606757295988 ], [ -71.756699794959559, 0.971310533054634 ], [ -71.786542934608747, 0.916946926359572 ], [ -72.035752529855358, 0.664042467385968 ], [ -72.078023851419573, 0.669210110358279 ], [ -72.098410204267509, 0.704143377714672 ], [ -72.152463751700793, 0.727707831251394 ], [ -72.238117437969379, 0.736596178171055 ], [ -72.264084845838966, 0.784655260331988 ], [ -72.311523811274867, 0.813542385572646 ], [ -72.312247280787346, 0.883615626759763 ], [ -72.347051357833891, 0.876846015131491 ], [ -72.362425096441029, 0.932966620113405 ], [ -72.40291358129673, 0.947332668367949 ], [ -72.428105841911076, 1.042417303915443 ], [ -72.474097865624003, 1.085102037528998 ], [ -72.544507005393996, 1.103602199981538 ], [ -72.703231167284514, 1.203854478501398 ], [ -72.738629522634369, 1.197343248392201 ], [ -72.760747036246698, 1.153418280429264 ], [ -72.818159553320697, 1.197756659542222 ], [ -72.857924566865279, 1.17398550043049 ], [ -72.885028856296685, 1.114195868344666 ], [ -72.893064540696002, 1.046551418113438 ], [ -72.938178067064143, 1.024743963762887 ], [ -73.033236864189917, 0.932243149701605 ], [ -73.082897915006754, 0.924336656511457 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-CAL", "NAME_1": "Caldas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -74.662491421341997, 5.771947739896291 ], [ -74.631847296915225, 5.702546292277532 ], [ -74.65194942892299, 5.660042425817267 ], [ -74.637376675093492, 5.644203599216723 ], [ -74.660372686949927, 5.574388739548681 ], [ -74.640683966991446, 5.562890732721144 ], [ -74.677632615952461, 5.549403184509345 ], [ -74.660372686949927, 5.525967922181849 ], [ -74.660372686949927, 5.458323472849997 ], [ -74.674997117622866, 5.455843004151291 ], [ -74.673395148067641, 5.42695587801137 ], [ -74.748687709969829, 5.290840155248929 ], [ -74.833075324366689, 5.314404608785651 ], [ -75.01275427898679, 5.293914903150267 ], [ -75.062828741852968, 5.26892934811093 ], [ -75.125098842637442, 5.163716132193713 ], [ -75.170625780155603, 5.173741359775931 ], [ -75.223258226086273, 5.142451280202408 ], [ -75.294364996947024, 5.131831773417616 ], [ -75.348470222123012, 5.060208237719962 ], [ -75.317283495337051, 5.027471218222104 ], [ -75.353922085036174, 4.939104519258137 ], [ -75.330719366705409, 4.878901475122973 ], [ -75.378029140932085, 4.800069078225363 ], [ -75.49244076213148, 4.919389959978673 ], [ -75.610650600744634, 4.933678493867376 ], [ -75.6380907860609, 4.973546861098725 ], [ -75.666977912200878, 4.947011013347549 ], [ -75.705580206661182, 4.949103909317955 ], [ -75.748419969006363, 5.045092882430595 ], [ -75.783430751627861, 5.000315252846633 ], [ -75.790536261839009, 4.9480187037002 ], [ -75.818803270354636, 4.920165107233913 ], [ -75.858490770432695, 4.932283229887162 ], [ -75.895878668965395, 4.973159288370425 ], [ -75.926807014232281, 5.043465074453593 ], [ -75.887636278091747, 5.12439036732161 ], [ -75.837923550431469, 5.111109523785501 ], [ -75.804075486894192, 5.20841624651257 ], [ -75.81733049200858, 5.272339992796446 ], [ -75.79805518320012, 5.28779124576937 ], [ -75.752037320166153, 5.283657131571374 ], [ -75.692454392756019, 5.256992091711652 ], [ -75.667546352981788, 5.265699571478024 ], [ -75.643723517925991, 5.304353541882449 ], [ -75.669225836902854, 5.352567654573591 ], [ -75.718809374253226, 5.396260076741157 ], [ -75.802731899757362, 5.364969998066954 ], [ -75.839163783881531, 5.360861721391302 ], [ -75.856372036040625, 5.374220079293195 ], [ -75.85779313844256, 5.489355170005069 ], [ -75.724726325159793, 5.558937486575758 ], [ -75.687415940992878, 5.528990994139065 ], [ -75.585742560970402, 5.518759060082573 ], [ -75.59246049665461, 5.683167628882927 ], [ -75.612536791139974, 5.700840969035482 ], [ -75.613234422230789, 5.735179958987885 ], [ -75.556131965317945, 5.721020616308408 ], [ -75.530577968598379, 5.688128567179604 ], [ -75.486653002434082, 5.669654242249464 ], [ -75.426114060615419, 5.694329738926285 ], [ -75.384617886306387, 5.674150092552736 ], [ -75.377486537673576, 5.619218044177387 ], [ -75.339917771987587, 5.586636054310418 ], [ -75.316172451297575, 5.517131252105571 ], [ -75.318032803271251, 5.463594469509133 ], [ -75.29141944025497, 5.473826401767042 ], [ -75.276123216013616, 5.433647976173177 ], [ -75.215765144046145, 5.502997747847758 ], [ -75.134426439128845, 5.535424708983101 ], [ -75.091715867992889, 5.596273709164336 ], [ -75.0911991031561, 5.659577337823862 ], [ -75.021539273118947, 5.67650137004216 ], [ -74.990946824636239, 5.71388926857486 ], [ -74.866768358273077, 5.743835761011553 ], [ -74.777264776847971, 5.689678859891444 ], [ -74.743726772572472, 5.699600734686157 ], [ -74.715098028850946, 5.772774563095595 ], [ -74.662491421341997, 5.771947739896291 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-CAS", "NAME_1": "Casanare" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -72.321678229166935, 6.351343899201595 ], [ -72.350901252091091, 6.288169459952599 ], [ -72.32330603714388, 6.225718492014778 ], [ -72.245507168121321, 6.126654771000858 ], [ -72.131224738131152, 6.069087226094609 ], [ -71.946481493326246, 6.149909166175064 ], [ -71.856125251179378, 6.154508368366521 ], [ -71.721999070700519, 6.200035304985306 ], [ -71.608750170384042, 6.210422267773424 ], [ -71.557357957903434, 6.190733546915624 ], [ -71.462273322355941, 6.198872585001766 ], [ -71.207146776202762, 6.274061794116506 ], [ -71.031421067728104, 6.247836004727844 ], [ -70.959668341720601, 6.222307848228581 ], [ -70.864170295023087, 6.215254014860875 ], [ -70.789446173901808, 6.23253978138581 ], [ -70.727227749061342, 6.209130357479978 ], [ -70.671778936748524, 6.208871975061584 ], [ -70.504889899249463, 6.224710802561503 ], [ -70.347741869391768, 6.279022732413182 ], [ -70.165298225232902, 6.267524726484908 ], [ -70.118091803793675, 6.250006415063979 ], [ -70.052591926376294, 6.194066677235355 ], [ -70.038871833268502, 6.161097112841446 ], [ -69.939627245101292, 6.114691677079236 ], [ -69.888054164568018, 6.040277615219736 ], [ -69.855756394641901, 6.026273302171148 ], [ -69.898647833830466, 5.97079865233593 ], [ -69.986575283222749, 5.779208278839008 ], [ -70.091400926411609, 5.645288804834479 ], [ -70.185193650766337, 5.587411199767018 ], [ -70.342858446360196, 5.568187567801999 ], [ -70.448795131789893, 5.53309926991534 ], [ -70.662089605950541, 5.404554145357508 ], [ -70.67865190296294, 5.389412949847724 ], [ -70.695705126390465, 5.313681139273172 ], [ -70.887889777291377, 5.154956977382597 ], [ -70.960288459344895, 5.117724107581466 ], [ -71.048577643943077, 4.93011282045029 ], [ -71.215208299023743, 4.815597846463447 ], [ -71.274507004694499, 4.80658030833456 ], [ -71.564980231152731, 4.681988429922114 ], [ -71.685748053729696, 4.607651882428399 ], [ -71.809435593677676, 4.577860418723333 ], [ -71.897440559234383, 4.485385443983034 ], [ -72.012162237896973, 4.398646552096693 ], [ -72.069884813333431, 4.394305732323687 ], [ -72.089237637407052, 4.42270193114922 ], [ -72.149905768636302, 4.450710557246396 ], [ -72.323461065875506, 4.409963690871621 ], [ -72.36666256432585, 4.343559474989775 ], [ -72.414592455277557, 4.341311550287799 ], [ -72.433325160827508, 4.354721584133813 ], [ -72.50487118215932, 4.321364447011604 ], [ -72.520813360648049, 4.343714503721344 ], [ -72.559648200004403, 4.354721584133813 ], [ -72.595485805825263, 4.306171576457075 ], [ -72.614580248379752, 4.320589301555003 ], [ -72.679744229012954, 4.320589301555003 ], [ -72.718113980375904, 4.298239243945943 ], [ -72.748034634390876, 4.313147895458997 ], [ -72.753150601419122, 4.34883047074959 ], [ -72.784182297674874, 4.350690822723266 ], [ -72.812604335821447, 4.426267605465625 ], [ -72.837098965344978, 4.430298366876116 ], [ -72.926576708348421, 4.525253811214384 ], [ -72.994582892886172, 4.649561468786771 ], [ -73.040600755020819, 4.694313259049636 ], [ -73.066309781371274, 4.830093085027841 ], [ -73.030937262644557, 4.985122382292104 ], [ -73.011351894574261, 4.994889228355191 ], [ -72.973679776100767, 4.978766180914533 ], [ -72.933062100035897, 5.020417384854397 ], [ -72.90611284023538, 5.083023383322484 ], [ -72.938462287004938, 5.115372830092042 ], [ -72.953190069566062, 5.160460517139143 ], [ -72.934612392747738, 5.205160631457943 ], [ -72.938255581429928, 5.240455634020293 ], [ -72.857588670980363, 5.3458238795684 ], [ -72.808470221623395, 5.383986925356282 ], [ -72.709613207083805, 5.279548854895722 ], [ -72.690182867745136, 5.277921046918777 ], [ -72.590137294800286, 5.354195460751896 ], [ -72.420612758971629, 5.557697252226376 ], [ -72.398495246258619, 5.564311835123078 ], [ -72.348059048186485, 5.510154934002969 ], [ -72.319275274834069, 5.506098334170758 ], [ -72.302609625933485, 5.584000555980879 ], [ -72.26682369695601, 5.659422309092292 ], [ -72.237652350875294, 5.683090115416462 ], [ -72.311136236747927, 5.77401479744492 ], [ -72.447381150719536, 5.854242459222121 ], [ -72.447639533137931, 5.874318751908845 ], [ -72.392759161606023, 5.900932114925126 ], [ -72.341031053240499, 6.078854071258377 ], [ -72.371210089673866, 6.109110622956848 ], [ -72.415729335940114, 6.204066067295173 ], [ -72.354363572720672, 6.334497382248401 ], [ -72.321678229166935, 6.351343899201595 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-MET", "NAME_1": "Meta" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -74.897515834588091, 2.950724595963322 ], [ -74.824600388597048, 3.107381700305211 ], [ -74.681353319000436, 3.210398668363837 ], [ -74.651742723347979, 3.259982204814889 ], [ -74.6159051166278, 3.48505890484455 ], [ -74.520665453248057, 3.62099376135302 ], [ -74.493561163816651, 3.70401194929201 ], [ -74.464544847366824, 3.677631130272459 ], [ -74.427777065559098, 3.67956899751124 ], [ -74.223551804572082, 4.009626370360706 ], [ -74.208462286805059, 4.019935817883663 ], [ -74.123299526951598, 4.005130520057435 ], [ -74.022633837281774, 4.094117335746432 ], [ -73.959924486026182, 4.111428940693031 ], [ -73.919177618752087, 4.154320379881597 ], [ -73.814429490828331, 4.203981430698434 ], [ -73.751901007625406, 4.202198594889239 ], [ -73.764019131177974, 4.261471462138275 ], [ -73.787351039818645, 4.293510850545317 ], [ -73.810682950257956, 4.420996608806433 ], [ -73.740196296122178, 4.473112290799577 ], [ -73.70957801011707, 4.517889919484162 ], [ -73.622374030237268, 4.483757636006089 ], [ -73.581058723081583, 4.421306667168949 ], [ -73.552197435363325, 4.320666815920788 ], [ -73.52765112989573, 4.299867051922888 ], [ -73.486878425099235, 4.285681870821691 ], [ -73.428690761669316, 4.315705878523488 ], [ -73.365671352950585, 4.322294622998413 ], [ -73.220615607324419, 4.283046373391414 ], [ -73.14434119259198, 4.226331488307551 ], [ -73.052977260991781, 4.734827582327057 ], [ -73.040600755020819, 4.694313259049636 ], [ -72.994582892886172, 4.649561468786771 ], [ -72.926576708348421, 4.525253811214384 ], [ -72.837098965344978, 4.430298366876116 ], [ -72.812604335821447, 4.426267605465625 ], [ -72.784182297674874, 4.350690822723266 ], [ -72.753150601419122, 4.34883047074959 ], [ -72.748034634390876, 4.313147895458997 ], [ -72.725555385572591, 4.300564683013704 ], [ -72.679744229012954, 4.320589301555003 ], [ -72.614580248379752, 4.320589301555003 ], [ -72.595485805825263, 4.306171576457075 ], [ -72.559648200004403, 4.354721584133813 ], [ -72.520813360648049, 4.343714503721344 ], [ -72.50487118215932, 4.321364447011604 ], [ -72.433325160827508, 4.354721584133813 ], [ -72.414592455277557, 4.341311550287799 ], [ -72.36666256432585, 4.343559474989775 ], [ -72.323461065875506, 4.409963690871621 ], [ -72.149905768636302, 4.450710557246396 ], [ -72.049756842903946, 4.388259589308575 ], [ -71.973663296224117, 4.421849270427458 ], [ -71.809435593677676, 4.577860418723333 ], [ -71.685748053729696, 4.607651882428399 ], [ -71.564980231152731, 4.681988429922114 ], [ -71.274507004694499, 4.80658030833456 ], [ -71.215208299023743, 4.815597846463447 ], [ -71.060334032289745, 4.919389959978673 ], [ -71.063667161710157, 2.868636583111822 ], [ -71.111803758236817, 2.876956488351254 ], [ -71.128107672830822, 2.864373276805281 ], [ -71.169061244780607, 2.884087836084746 ], [ -71.225130173818457, 2.855071518735599 ], [ -71.264740160430051, 2.865380968057195 ], [ -71.303471646099581, 2.905430203341211 ], [ -71.329594081801417, 2.858094590692815 ], [ -71.35685339996445, 2.875328681273629 ], [ -71.382381558262296, 2.845924791196126 ], [ -71.443411423798182, 2.876258857260439 ], [ -71.468707038099296, 2.852280992573753 ], [ -71.56149207210143, 2.855691637259213 ], [ -71.622625292223461, 2.815719916341038 ], [ -71.643657600218091, 2.819311428179844 ], [ -71.649548712702938, 2.86336558735195 ], [ -71.683138393821821, 2.840085353756081 ], [ -71.743160569904376, 2.881994941013716 ], [ -71.759309454867434, 2.816727606693689 ], [ -71.792046475264613, 2.861195177015816 ], [ -71.83728919104334, 2.830938625317287 ], [ -71.980381231908325, 2.799105943384575 ], [ -72.07877315935383, 2.827295437534417 ], [ -72.121044480918044, 2.867086290399982 ], [ -72.192357958253183, 2.847862657535586 ], [ -72.193469001393282, 2.772957668361698 ], [ -72.247780931244961, 2.754870917059179 ], [ -72.252302619070576, 2.697613430515389 ], [ -72.283747728275046, 2.752390448360472 ], [ -72.309818488032761, 2.71673370969296 ], [ -72.366533373116681, 2.738076076949369 ], [ -72.421904670164395, 2.694202785829873 ], [ -72.474847175356842, 2.687949937239807 ], [ -72.507274135592866, 2.665212306902447 ], [ -72.553679572254453, 2.675444240958939 ], [ -72.535747849683503, 2.641596178320981 ], [ -72.573445808377357, 2.629400540402628 ], [ -72.576727260954328, 2.579584459055525 ], [ -72.610032722132416, 2.620512193482909 ], [ -72.641994595274355, 2.562789618046452 ], [ -72.670442470943271, 2.613897609686944 ], [ -72.703334520072019, 2.607489732365252 ], [ -72.737208422031017, 2.559534002991825 ], [ -72.762297328958539, 2.565890204369452 ], [ -72.790305955955091, 2.600978502256055 ], [ -72.819942390029269, 2.596741034371234 ], [ -72.937635463805577, 2.513645331167083 ], [ -72.930452440128022, 2.467756659342342 ], [ -73.020576138278159, 2.411274319154472 ], [ -73.061323004652934, 2.413082994284764 ], [ -73.102431607132928, 2.382077135551356 ], [ -73.124445767058489, 2.394169419782884 ], [ -73.144754604641264, 2.36171662022582 ], [ -73.173202481209501, 2.385126044131596 ], [ -73.215318773142826, 2.388381659186223 ], [ -73.247125616653875, 2.371948554282369 ], [ -73.250355394186101, 2.34378489855419 ], [ -73.317741461998878, 2.347247219183828 ], [ -73.344122281018429, 2.328643703943783 ], [ -73.346344367298684, 2.349055894314063 ], [ -73.36344926577101, 2.353758450192288 ], [ -73.376704270885398, 2.329418850299703 ], [ -73.395488654178052, 2.344094956916706 ], [ -73.42685624901668, 2.331020819854928 ], [ -73.444684617900805, 2.385901191386836 ], [ -73.455071580688866, 2.347195543239707 ], [ -73.510313687426731, 2.352414862156138 ], [ -73.530415819434495, 2.383110663426351 ], [ -73.577493048765177, 2.361199856288351 ], [ -73.592711757741426, 2.385281072863222 ], [ -73.606716070790014, 2.382645575432946 ], [ -73.626637335644489, 2.366367499260662 ], [ -73.660330369550877, 2.253402817985659 ], [ -73.661131354328518, 1.641967271172632 ], [ -73.675058153011321, 1.624500637494407 ], [ -73.757482061747737, 1.6382465681246 ], [ -73.917834031615257, 1.634732571550899 ], [ -74.510821091919865, 1.843918769035952 ], [ -74.550534431318965, 1.871358954352274 ], [ -74.606835904353488, 1.962361152545157 ], [ -74.6159051166278, 2.043131414882907 ], [ -74.549190843282759, 2.142918606308626 ], [ -74.543738980369653, 2.181934311918951 ], [ -74.645851609963813, 2.318205064312281 ], [ -74.659442511862437, 2.382645575432946 ], [ -74.59644894066605, 2.721229559996175 ], [ -74.662465582920277, 2.795591945911553 ], [ -74.712565884208175, 2.896955268470833 ], [ -74.897515834588091, 2.950724595963322 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-CUN", "NAME_1": "Bogota" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -74.154382900950111, 4.007223416027841 ], [ -74.208462286805059, 4.019935817883663 ], [ -74.223551804572082, 4.009626370360706 ], [ -74.427777065559098, 3.67956899751124 ], [ -74.464544847366824, 3.677631130272459 ], [ -74.493561163816651, 3.70401194929201 ], [ -74.370054491021904, 3.909141546944852 ], [ -74.371604783733744, 4.033526719782287 ], [ -74.341994188081287, 4.112514146310787 ], [ -74.328144903764269, 4.12607920978769 ], [ -74.27267025392905, 4.098535670784543 ], [ -74.262515835137663, 4.109465236831227 ], [ -74.250630255581825, 4.196462511135962 ], [ -74.214017504304366, 4.256122952012618 ], [ -74.191512417064359, 4.394305732323687 ], [ -74.216420457737911, 4.399189154455883 ], [ -74.179265103201942, 4.500759181690853 ], [ -74.188799405268298, 4.581968695398984 ], [ -74.224714524555623, 4.628994248785546 ], [ -74.166061774031618, 4.667570705723506 ], [ -74.174924283428936, 4.698989976506198 ], [ -74.134332444886411, 4.730874335282351 ], [ -74.084671394069574, 4.80658030833456 ], [ -74.081389939693963, 4.835519111317922 ], [ -74.010696580882495, 4.815365302466716 ], [ -74.013564623208765, 4.681523341928653 ], [ -74.03121212404028, 4.65064667440447 ], [ -73.995038622334562, 4.632249863840116 ], [ -74.013693814417991, 4.566543279948405 ], [ -74.116400723214781, 4.430298366876116 ], [ -74.107693244347729, 4.342241726274608 ], [ -74.15298763696984, 4.248733221860675 ], [ -74.093895636874151, 4.141995550754075 ], [ -74.133479784164706, 4.08791616489907 ], [ -74.154382900950111, 4.007223416027841 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-SAN", "NAME_1": "Santander" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -73.625448778138605, 7.734541124273449 ], [ -73.544316778796315, 7.669764716368547 ], [ -73.496722784628787, 7.600854194265651 ], [ -73.393835007779387, 7.573620714524338 ], [ -73.360348680347329, 7.549642848938333 ], [ -73.260742356974163, 7.544914456437027 ], [ -73.247849087065731, 7.597055975952514 ], [ -73.216403977861262, 7.630025540346423 ], [ -73.056594611252308, 7.607597968371522 ], [ -73.027655809168266, 7.621188870270146 ], [ -72.991327276932282, 7.613179023393229 ], [ -72.983885870836275, 7.546774807511326 ], [ -72.903115606699885, 7.47633983021899 ], [ -72.897637906264322, 7.428694159208078 ], [ -72.842292446739009, 7.357535712403205 ], [ -72.844514533019264, 7.300975856950231 ], [ -72.88146318198028, 7.256379096318256 ], [ -72.837176479710763, 7.207880763686262 ], [ -72.830045131977272, 7.162095445548346 ], [ -72.885933193861774, 7.073806260950164 ], [ -72.879370286909193, 7.05985362384564 ], [ -72.792993130228751, 7.030837307395814 ], [ -72.74483069528037, 6.989160265034172 ], [ -72.688813443085905, 7.005076606000557 ], [ -72.670080735737372, 6.973424791221134 ], [ -72.650882941294697, 6.995438951146639 ], [ -72.560733404722839, 6.999495550978907 ], [ -72.546574062942625, 6.884954739469663 ], [ -72.50487118215932, 6.915082099059589 ], [ -72.477973599202244, 6.844078680986343 ], [ -72.481203375835094, 6.721579698544247 ], [ -72.497817348791614, 6.645770371805213 ], [ -72.542414110322909, 6.561356919885952 ], [ -72.542414110322909, 6.502549139731002 ], [ -72.616673142551463, 6.438082791087936 ], [ -72.66155412492293, 6.434801336712326 ], [ -72.708889736672006, 6.528774929119663 ], [ -72.762245653014475, 6.57360423374837 ], [ -72.791623704670201, 6.567093004538492 ], [ -72.794414231731423, 6.533193264157831 ], [ -72.733410203717938, 6.45660879196214 ], [ -72.735322231635678, 6.375993557456695 ], [ -72.755734422005958, 6.319666246000452 ], [ -72.747750413550705, 6.241324775517967 ], [ -72.799297654762938, 6.202515774583333 ], [ -72.817436082908898, 6.153423162748766 ], [ -72.893658819898633, 6.123218288792998 ], [ -72.992386644128317, 5.999634100733147 ], [ -73.016855435230127, 5.940748806212412 ], [ -73.127029587645325, 5.955476588773536 ], [ -73.195423346710072, 5.991107489019385 ], [ -73.219246181765868, 5.982477525417437 ], [ -73.28616716158524, 5.855870266299746 ], [ -73.351331143117761, 5.862536526039833 ], [ -73.36941789442028, 5.810937607984215 ], [ -73.415306566245022, 5.755075385420696 ], [ -73.468300747381591, 5.813495591948026 ], [ -73.47155636333548, 5.847705389791884 ], [ -73.400759649937868, 5.922274482181592 ], [ -73.381871913857708, 6.001029363814098 ], [ -73.438121710948167, 6.069552314088014 ], [ -73.499280768592598, 6.107095242251603 ], [ -73.535221727200963, 6.042060451928307 ], [ -73.578268195121098, 6.007230536460099 ], [ -73.613718228213656, 5.922196966916488 ], [ -73.638367885569437, 5.722725937751818 ], [ -73.64865149557005, 5.715439561286701 ], [ -73.694307624297437, 5.751974799097695 ], [ -73.737121548220841, 5.761147365958152 ], [ -73.833885667689401, 5.739107366711607 ], [ -73.878534105164817, 5.71140879987621 ], [ -73.877448900446382, 5.737091986905682 ], [ -73.893959519716077, 5.747323920062854 ], [ -73.97317949114057, 5.73257029908001 ], [ -74.008422817758799, 5.752129827829265 ], [ -74.04873043456189, 5.813650621578915 ], [ -74.087978685068265, 5.824063421889377 ], [ -74.11081966819313, 5.87059804886087 ], [ -74.174510871379596, 5.900777086193557 ], [ -74.233783738628631, 5.846310125811669 ], [ -74.257451544952801, 5.848196316207009 ], [ -74.269569667606049, 5.898451646226476 ], [ -74.239158088075271, 5.981702379061517 ], [ -74.26998307965539, 6.04983775480855 ], [ -74.290266078816444, 6.070689194750514 ], [ -74.356851161851637, 6.039114895236196 ], [ -74.419534674685451, 6.073583075498505 ], [ -74.479789394764737, 6.155180161934936 ], [ -74.519425217999412, 6.282304184990153 ], [ -74.459506394704363, 6.33351553031747 ], [ -74.413333502938769, 6.404234727550602 ], [ -74.392223679679034, 6.402581082051256 ], [ -74.379201218561377, 6.423484197937398 ], [ -74.405840419999379, 6.47534149841141 ], [ -74.40876013916909, 6.567144680482613 ], [ -74.386435919981693, 6.626288357421743 ], [ -74.29272070999275, 6.654426173828824 ], [ -74.108571742591835, 6.790309353493853 ], [ -74.016096767851536, 6.927794500915468 ], [ -73.925068732136253, 6.97450999593957 ], [ -73.887810024812779, 7.019856065405065 ], [ -73.926722377635599, 7.126102810096597 ], [ -73.937109341323037, 7.253898626720229 ], [ -73.899385546006158, 7.421252753112071 ], [ -73.913183152580416, 7.494865831093193 ], [ -73.835151739561127, 7.595273139243943 ], [ -73.823291999326273, 7.672038479492244 ], [ -73.836004401182151, 7.694776108930284 ], [ -73.815540533968431, 7.779525458533044 ], [ -73.872255419052351, 8.044909776265172 ], [ -73.855357225255716, 8.105448717184515 ], [ -73.785645718375179, 8.16146596937898 ], [ -73.778979457735772, 8.098033149510229 ], [ -73.728517422141294, 7.987238878571361 ], [ -73.670303921188975, 7.928973699876337 ], [ -73.676996019350781, 7.893368638951529 ], [ -73.744227058431989, 7.830736802961098 ], [ -73.751901007625406, 7.7408973247517 ], [ -73.625448778138605, 7.734541124273449 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-TOL", "NAME_1": "Tolima" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -74.563531053115582, 3.772121487516642 ], [ -74.727991298759434, 3.608668931326122 ], [ -74.733882412143601, 3.560325629224394 ], [ -74.77452592573087, 3.514772854183889 ], [ -74.777109748116345, 3.441392320199384 ], [ -74.908884650206403, 3.289928697251582 ], [ -74.966142136750193, 3.278844102473329 ], [ -75.067841356093709, 3.3014267031798 ], [ -75.03564693895504, 3.434157620577707 ], [ -75.142642991580772, 3.432142238973142 ], [ -75.177602098258205, 3.40547720001274 ], [ -75.178015510307546, 3.388708197425387 ], [ -75.213258836925775, 3.410128079047581 ], [ -75.257778083191965, 3.373644517180708 ], [ -75.316120775353511, 3.411755886125206 ], [ -75.355317349016445, 3.408655299802206 ], [ -75.387046678161653, 3.378708808264889 ], [ -75.492311570922254, 3.347263699060477 ], [ -75.569645351951408, 3.233291327432823 ], [ -75.627548793641893, 3.090302639355286 ], [ -75.781570400553505, 2.948244127264672 ], [ -75.812472907398728, 2.891916815808372 ], [ -75.854692552119559, 2.890909125455778 ], [ -75.974013434772189, 2.948166611999511 ], [ -76.001091884882555, 2.949949448708082 ], [ -76.031245082894259, 2.929537258337803 ], [ -76.044577603273751, 3.035525621510203 ], [ -76.112997198961523, 3.105908921959156 ], [ -76.091525642294528, 3.203189806264561 ], [ -76.065997483996682, 3.227167670051927 ], [ -76.064162971344047, 3.282022203162114 ], [ -76.043854132861952, 3.314061591569157 ], [ -76.064989793644031, 3.357831529001828 ], [ -76.049383511040162, 3.442400011451355 ], [ -75.99677690263195, 3.559240424505958 ], [ -75.988792894176697, 3.6467544618489 ], [ -75.961714444066331, 3.712150987378152 ], [ -75.857663947233391, 3.869893297337796 ], [ -75.79614315528238, 4.008076076749546 ], [ -75.745448574791908, 4.041510728237483 ], [ -75.762217577379261, 4.078511054041883 ], [ -75.601400518619016, 4.296456407237372 ], [ -75.582073533866492, 4.42712026618733 ], [ -75.512646246926749, 4.559411933114234 ], [ -75.422134976048312, 4.636978258140061 ], [ -75.389604662125464, 4.7090668809318 ], [ -75.378029140932085, 4.800069078225363 ], [ -75.330719366705409, 4.878901475122973 ], [ -75.353922085036174, 4.939104519258137 ], [ -75.317283495337051, 5.027471218222104 ], [ -75.348470222123012, 5.060208237719962 ], [ -75.338858404791551, 5.085813910383649 ], [ -75.279508023176732, 5.138653061889272 ], [ -75.241577521385466, 5.136250108455727 ], [ -75.170625780155603, 5.173741359775931 ], [ -75.125098842637442, 5.163716132193713 ], [ -75.062828741852968, 5.26892934811093 ], [ -75.01275427898679, 5.293914903150267 ], [ -74.833075324366689, 5.314404608785651 ], [ -74.748687709969829, 5.290840155248929 ], [ -74.742305671069857, 5.269626980101066 ], [ -74.735458544176481, 5.108241482358494 ], [ -74.749747077165864, 5.02630849913794 ], [ -74.728637254805449, 4.985354926288778 ], [ -74.762795375805922, 4.964245103029043 ], [ -74.749747077165864, 4.889133409179465 ], [ -74.770805222682895, 4.863062649421749 ], [ -74.767187873321689, 4.786891588376079 ], [ -74.827907681394379, 4.722166856415299 ], [ -74.790700650014969, 4.652351995847937 ], [ -74.818037481644467, 4.607961940790915 ], [ -74.804369066279378, 4.591528834987741 ], [ -74.818037481644467, 4.587498074476571 ], [ -74.805764330259649, 4.504634915269094 ], [ -74.89115963410984, 4.279635727806578 ], [ -74.880720995377601, 4.26906789786517 ], [ -74.784034390274883, 4.283588974851284 ], [ -74.749152797963234, 4.242532050113994 ], [ -74.73212541385675, 4.247906399560691 ], [ -74.699310879093787, 4.218554185427308 ], [ -74.65463660319665, 4.209174912991841 ], [ -74.616990323144876, 4.256898098368538 ], [ -74.581385261320747, 4.272633572181576 ], [ -74.523895229880964, 4.242532050113994 ], [ -74.480202805914757, 4.133443101517912 ], [ -74.524773729024389, 4.052156073443996 ], [ -74.531801723970375, 3.98425324079443 ], [ -74.511363695178375, 3.936995144310458 ], [ -74.551283739253165, 3.845605374288596 ], [ -74.563531053115582, 3.772121487516642 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-QUI", "NAME_1": "Quindío" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -75.390379807582065, 4.716818346289642 ], [ -75.428361986216657, 4.626823839348674 ], [ -75.504972296834012, 4.570341498261541 ], [ -75.55907752111068, 4.475773627550836 ], [ -75.582073533866492, 4.42712026618733 ], [ -75.601400518619016, 4.296456407237372 ], [ -75.710566983379579, 4.137422186984338 ], [ -75.762217577379261, 4.078511054041883 ], [ -75.829913702655233, 4.109413559987786 ], [ -75.837897712009806, 4.154165351150027 ], [ -75.790252040998894, 4.288394884416391 ], [ -75.787926601931133, 4.350845852354212 ], [ -75.809062262713212, 4.397483832113153 ], [ -75.890375129208849, 4.423632107136029 ], [ -75.866914029358952, 4.458229477708244 ], [ -75.876758388888504, 4.552564806220801 ], [ -75.862108119793902, 4.612948717509312 ], [ -75.824849413369691, 4.664444280978785 ], [ -75.716018846292684, 4.658785712490612 ], [ -75.703048062018411, 4.720228990075839 ], [ -75.659433153317366, 4.702943223550903 ], [ -75.532670864568729, 4.699145006137087 ], [ -75.484560105564412, 4.671368923137265 ], [ -75.390379807582065, 4.716818346289642 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-CUN", "NAME_1": "Cundinamarca" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -74.493561163816651, 3.70401194929201 ], [ -74.563531053115582, 3.772121487516642 ], [ -74.551283739253165, 3.845605374288596 ], [ -74.511363695178375, 3.936995144310458 ], [ -74.531801723970375, 3.98425324079443 ], [ -74.524773729024389, 4.052156073443996 ], [ -74.480202805914757, 4.133443101517912 ], [ -74.523895229880964, 4.242532050113994 ], [ -74.581385261320747, 4.272633572181576 ], [ -74.616990323144876, 4.256898098368538 ], [ -74.65463660319665, 4.209174912991841 ], [ -74.699310879093787, 4.218554185427308 ], [ -74.73212541385675, 4.247906399560691 ], [ -74.749152797963234, 4.242532050113994 ], [ -74.784034390274883, 4.283588974851284 ], [ -74.880720995377601, 4.26906789786517 ], [ -74.89115963410984, 4.279635727806578 ], [ -74.805764330259649, 4.504634915269094 ], [ -74.818037481644467, 4.587498074476571 ], [ -74.804369066279378, 4.591528834987741 ], [ -74.818037481644467, 4.607961940790915 ], [ -74.790700650014969, 4.652351995847937 ], [ -74.827907681394379, 4.722166856415299 ], [ -74.767187873321689, 4.786891588376079 ], [ -74.770805222682895, 4.863062649421749 ], [ -74.749747077165864, 4.889133409179465 ], [ -74.762795375805922, 4.964245103029043 ], [ -74.728637254805449, 4.985354926288778 ], [ -74.749747077165864, 5.02630849913794 ], [ -74.735458544176481, 5.108241482358494 ], [ -74.750522224421104, 5.302364000498187 ], [ -74.673395148067641, 5.42695587801137 ], [ -74.674997117622866, 5.455843004151291 ], [ -74.660372686949927, 5.458323472849997 ], [ -74.660372686949927, 5.525967922181849 ], [ -74.680113084651111, 5.539610500923857 ], [ -74.640683966991446, 5.562890732721144 ], [ -74.660372686949927, 5.574388739548681 ], [ -74.637376675093492, 5.644203599216723 ], [ -74.65194942892299, 5.660042425817267 ], [ -74.631847296915225, 5.702546292277532 ], [ -74.646084153960544, 5.752517402356204 ], [ -74.533946295884846, 5.790551256035599 ], [ -74.440644497045867, 5.767193508073944 ], [ -74.347523566259554, 5.826388861856458 ], [ -74.312848680422235, 5.793186754365195 ], [ -74.288379890219744, 5.681617336171144 ], [ -74.31352047399065, 5.613792018786626 ], [ -74.256908941694292, 5.544674791108719 ], [ -74.243886480576577, 5.483929145513628 ], [ -74.208772346066894, 5.484239202976823 ], [ -74.147535773157415, 5.45294912430262 ], [ -74.098029751072147, 5.455610460154617 ], [ -74.088702154580744, 5.419669501546252 ], [ -74.000102911620047, 5.374297594558357 ], [ -73.93483557819934, 5.434190579431686 ], [ -73.90672359931466, 5.442019558255993 ], [ -73.899230516375212, 5.481887926386662 ], [ -73.821612515405263, 5.558472398582296 ], [ -73.798254768342872, 5.563975938338899 ], [ -73.791510993337681, 5.507958686144434 ], [ -73.653767462598296, 5.461734117535457 ], [ -73.641675178366768, 5.430702419481065 ], [ -73.590102097833551, 5.385614732433964 ], [ -73.584831102073679, 5.304611925200163 ], [ -73.521630825302339, 5.237277533331508 ], [ -73.525093145931919, 5.210974229577005 ], [ -73.475948859052608, 5.065892646428495 ], [ -73.517600063891848, 5.023828030439233 ], [ -73.514266933572117, 4.991246038773681 ], [ -73.545298630727189, 4.932438259518051 ], [ -73.523258633279283, 4.888358262823544 ], [ -73.411689215984495, 4.877738756038752 ], [ -73.365800544159754, 4.819783637504827 ], [ -73.36825517443674, 4.797743639157602 ], [ -73.329058600773806, 4.783791002053079 ], [ -73.296424934063452, 4.729789130563915 ], [ -73.228392910204605, 4.723587957917914 ], [ -73.218083461782328, 4.677647610149052 ], [ -73.113231981071067, 4.6639791938847 ], [ -73.073311936996276, 4.728471380949486 ], [ -73.052977260991781, 4.734827582327057 ], [ -73.137726609695278, 4.229819648258172 ], [ -73.220615607324419, 4.283046373391414 ], [ -73.365671352950585, 4.322294622998413 ], [ -73.428690761669316, 4.315705878523488 ], [ -73.486878425099235, 4.285681870821691 ], [ -73.52765112989573, 4.299867051922888 ], [ -73.552197435363325, 4.320666815920788 ], [ -73.581058723081583, 4.421306667168949 ], [ -73.622374030237268, 4.483757636006089 ], [ -73.697279019411212, 4.521300564169678 ], [ -73.810682950257956, 4.420996608806433 ], [ -73.787351039818645, 4.293510850545317 ], [ -73.764019131177974, 4.261471462138275 ], [ -73.751901007625406, 4.202198594889239 ], [ -73.814429490828331, 4.203981430698434 ], [ -73.919177618752087, 4.154320379881597 ], [ -73.959924486026182, 4.111428940693031 ], [ -74.022633837281774, 4.094117335746432 ], [ -74.123299526951598, 4.005130520057435 ], [ -74.154382900950111, 4.007223416027841 ], [ -74.133479784164706, 4.08791616489907 ], [ -74.093895636874151, 4.141995550754075 ], [ -74.15298763696984, 4.248733221860675 ], [ -74.107693244347729, 4.342241726274608 ], [ -74.116400723214781, 4.430298366876116 ], [ -74.013693814417991, 4.566543279948405 ], [ -73.995038622334562, 4.632249863840116 ], [ -74.03121212404028, 4.65064667440447 ], [ -74.013564623208765, 4.681523341928653 ], [ -74.010696580882495, 4.815365302466716 ], [ -74.085188158007099, 4.833038641719952 ], [ -74.084671394069574, 4.80658030833456 ], [ -74.134332444886411, 4.730874335282351 ], [ -74.174924283428936, 4.698989976506198 ], [ -74.166061774031618, 4.667570705723506 ], [ -74.224714524555623, 4.628994248785546 ], [ -74.188799405268298, 4.581968695398984 ], [ -74.179265103201942, 4.500759181690853 ], [ -74.216420457737911, 4.399189154455883 ], [ -74.191512417064359, 4.394305732323687 ], [ -74.214017504304366, 4.256122952012618 ], [ -74.250630255581825, 4.196462511135962 ], [ -74.262515835137663, 4.109465236831227 ], [ -74.27267025392905, 4.098535670784543 ], [ -74.328144903764269, 4.12607920978769 ], [ -74.341994188081287, 4.112514146310787 ], [ -74.371604783733744, 4.033526719782287 ], [ -74.370054491021904, 3.909141546944852 ], [ -74.493561163816651, 3.70401194929201 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CO-RIS", "NAME_1": "Risaralda" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -75.85779313844256, 5.489355170005069 ], [ -75.856372036040625, 5.374220079293195 ], [ -75.839163783881531, 5.360861721391302 ], [ -75.802731899757362, 5.364969998066954 ], [ -75.718809374253226, 5.396260076741157 ], [ -75.669225836902854, 5.352567654573591 ], [ -75.643723517925991, 5.304353541882449 ], [ -75.667546352981788, 5.265699571478024 ], [ -75.692454392756019, 5.256992091711652 ], [ -75.752037320166153, 5.283657131571374 ], [ -75.79805518320012, 5.28779124576937 ], [ -75.81733049200858, 5.272339992796446 ], [ -75.804075486894192, 5.20841624651257 ], [ -75.837923550431469, 5.111109523785501 ], [ -75.887636278091747, 5.12439036732161 ], [ -75.926807014232281, 5.043465074453593 ], [ -75.895878668965395, 4.973159288370425 ], [ -75.858490770432695, 4.932283229887162 ], [ -75.818803270354636, 4.920165107233913 ], [ -75.790536261839009, 4.9480187037002 ], [ -75.783430751627861, 5.000315252846633 ], [ -75.748419969006363, 5.045092882430595 ], [ -75.705580206661182, 4.949103909317955 ], [ -75.666977912200878, 4.947011013347549 ], [ -75.6380907860609, 4.973546861098725 ], [ -75.610650600744634, 4.933678493867376 ], [ -75.49244076213148, 4.919389959978673 ], [ -75.378029140932085, 4.800069078225363 ], [ -75.390379807582065, 4.716818346289642 ], [ -75.441410284856772, 4.68516653151022 ], [ -75.491639777353839, 4.671756496764885 ], [ -75.532670864568729, 4.699145006137087 ], [ -75.853555670557739, 4.731959540000787 ], [ -75.851902025058394, 4.776633815897867 ], [ -75.894302537831834, 4.760820827718987 ], [ -75.924094000637581, 4.774928494454457 ], [ -75.94026872402236, 4.821954046941698 ], [ -75.922181972719841, 4.872416083435496 ], [ -75.981118944084017, 4.872622789010506 ], [ -75.986286587056327, 4.911095893160905 ], [ -76.02238257529558, 4.941507472691683 ], [ -76.075919358791339, 5.035713609095751 ], [ -76.097597621932721, 5.17503327096864 ], [ -76.179918178780895, 5.308720200976495 ], [ -76.165552131425727, 5.40866242113384 ], [ -76.093256802159658, 5.455377916157886 ], [ -76.080234341042001, 5.537595120218612 ], [ -76.042484707303402, 5.577334296240792 ], [ -75.960474208817686, 5.507028510157625 ], [ -75.85779313844256, 5.489355170005069 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/costa rica.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/costa rica.geojson new file mode 100644 index 000000000000..b0dd0f68f676 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/costa rica.geojson @@ -0,0 +1,13 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "CR-A", "NAME_1": "Alajuela" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -84.355466471999875, 10.994627177000098 ], [ -84.3459838469999, 10.989898784000019 ], [ -84.343658406999879, 10.982379863000062 ], [ -84.343865112999936, 10.972277121000033 ], [ -84.341798055999874, 10.959900615000066 ], [ -84.337405558999876, 10.952665914000093 ], [ -84.324098876999955, 10.936181132000115 ], [ -84.321308349999896, 10.9291531370001 ], [ -84.310740519999939, 10.919412130000055 ], [ -84.264283406999908, 10.901816305000082 ], [ -84.253663900999925, 10.89471079600014 ], [ -84.244723877999888, 10.88491811100009 ], [ -84.225655273999905, 10.875306295000073 ], [ -84.208369506999901, 10.860966085000072 ], [ -84.204648803999902, 10.836988220000066 ], [ -84.218523925999875, 10.829831035000026 ], [ -84.222658040999903, 10.827040507000063 ], [ -84.227102213999899, 10.819314881000068 ], [ -84.225241862999894, 10.81368214900003 ], [ -84.221159423999978, 10.809418844000078 ], [ -84.218885660999973, 10.80595652300012 ], [ -84.19687150099989, 10.788515727000089 ], [ -84.19160050499994, 10.781720276000044 ], [ -84.180412557999915, 10.789755961000125 ], [ -84.164832112999875, 10.789445903000043 ], [ -84.15772972504675, 10.788424645281168 ], [ -84.157984178327126, 10.784251613820913 ], [ -84.160516323869217, 10.571138006813555 ], [ -84.162686734205408, 10.41011424427694 ], [ -84.164185350073808, 10.295702623077602 ], [ -84.165787319629089, 10.158398341909958 ], [ -84.177362839923092, 10.006831366174595 ], [ -84.177621223240862, 10.004350898375264 ], [ -84.196018032905897, 9.985075587768165 ], [ -84.200978970303197, 9.977169094578016 ], [ -84.201599087028228, 9.974171861042521 ], [ -84.201857469446622, 9.971381333981356 ], [ -84.201754116659117, 9.966006985434035 ], [ -84.199971279950603, 9.957221991301822 ], [ -84.214673224989326, 9.941460679966383 ], [ -84.242449307089828, 9.932520657102657 ], [ -84.309241095699974, 9.914020493750797 ], [ -84.327069464584099, 9.911540025052091 ], [ -84.332340461243291, 9.913141995506692 ], [ -84.344329392687314, 9.914537257688266 ], [ -84.349135301353044, 9.915674140149463 ], [ -84.352959357188581, 9.916966051342172 ], [ -84.37275143083383, 9.920118312709974 ], [ -84.392155930851516, 9.925647690888184 ], [ -84.416573046009262, 9.920945135909278 ], [ -84.461040616331388, 9.917276108805368 ], [ -84.49183976859041, 9.903840237437009 ], [ -84.499927130732488, 9.898930975983717 ], [ -84.500908982663418, 9.897484036059382 ], [ -84.502175056333783, 9.895106920148237 ], [ -84.51382809099357, 9.883738105429188 ], [ -84.531036343152721, 9.874849758509527 ], [ -84.537625087627703, 9.869992173899675 ], [ -84.540544806797357, 9.86647817642671 ], [ -84.540260585957242, 9.863894354940498 ], [ -84.540725673950703, 9.860638738986609 ], [ -84.559199998880842, 9.837952786391952 ], [ -84.560853645279508, 9.834180406500536 ], [ -84.562145554673577, 9.82658397077364 ], [ -84.563773362650522, 9.824723618799965 ], [ -84.57105974001496, 9.824516913224954 ], [ -84.592789679999726, 9.853145656946481 ], [ -84.601781378807573, 9.860070299105018 ], [ -84.613744472729195, 9.862447415016163 ], [ -84.626766933846909, 9.863170885428019 ], [ -84.643303392437588, 9.86761505798853 ], [ -84.664206509222993, 9.875883287283841 ], [ -84.671079475437409, 9.880637519106187 ], [ -84.674412603958501, 9.884358222154219 ], [ -84.672965664034166, 9.889629217914035 ], [ -84.67304317929927, 9.895520331298258 ], [ -84.672552252884145, 9.898259182415302 ], [ -84.670846931440735, 9.900481268695557 ], [ -84.669244960986134, 9.901979885463334 ], [ -84.662191127618428, 9.905080470887015 ], [ -84.643690965165888, 9.933864244239487 ], [ -84.635991176651487, 9.941253974391373 ], [ -84.624906581873233, 9.944612942233505 ], [ -84.575710619049801, 9.976342271378712 ], [ -84.560000982759107, 9.982543443125394 ], [ -84.55506588378347, 9.985127265510869 ], [ -84.551758591885516, 9.988124498147045 ], [ -84.550880092742091, 9.990294908483236 ], [ -84.55010494728549, 9.997736314579242 ], [ -84.562791510719649, 10.018303534580468 ], [ -84.569974535296524, 10.021714179265928 ], [ -84.572455003995231, 10.020680650491613 ], [ -84.580335659662921, 10.014634508375821 ], [ -84.58806128569978, 10.01251577398375 ], [ -84.591394416019455, 10.012619126771256 ], [ -84.593513150411525, 10.013239244395606 ], [ -84.594443326398391, 10.014686184319942 ], [ -84.595812751057622, 10.017786769743623 ], [ -84.596432867782596, 10.020163886554087 ], [ -84.602685716372719, 10.029775702086965 ], [ -84.619041306910788, 10.049206041425634 ], [ -84.627102830631088, 10.062228502543348 ], [ -84.643458422068534, 10.082278957707729 ], [ -84.649375372975044, 10.091218980571455 ], [ -84.660434130230897, 10.113801581277926 ], [ -84.664929978735529, 10.129769599087695 ], [ -84.661131761321712, 10.154936021280321 ], [ -84.661519334949332, 10.158708401171737 ], [ -84.662604539667768, 10.164289456193444 ], [ -84.668159756267698, 10.174314682876286 ], [ -84.668960741045339, 10.178397122029537 ], [ -84.668960741045339, 10.182066148234128 ], [ -84.663198818870399, 10.20449372020903 ], [ -84.660201586234223, 10.211883450360915 ], [ -84.649633755393495, 10.231003730437806 ], [ -84.648496873831618, 10.236068019723291 ], [ -84.648884446559919, 10.239788722771323 ], [ -84.65046057769348, 10.241494045114052 ], [ -84.656480882286871, 10.246144924148894 ], [ -84.660511643697362, 10.251777655114665 ], [ -84.666066861196668, 10.267280584931029 ], [ -84.683921067603194, 10.278752753336903 ], [ -84.69154334175181, 10.279837958055282 ], [ -84.694153001659686, 10.278907782068472 ], [ -84.696452603205046, 10.277874254193478 ], [ -84.702989671735963, 10.273998521514557 ], [ -84.716683926422036, 10.270071112891515 ], [ -84.735726691233822, 10.266712144150119 ], [ -84.743917406163348, 10.26635040894422 ], [ -84.74955013712912, 10.266712144150119 ], [ -84.756035528816597, 10.270897935191556 ], [ -84.757844203946831, 10.272448227903396 ], [ -84.764252082167843, 10.280096340473733 ], [ -84.786627977299304, 10.315339667091962 ], [ -84.770608282646094, 10.345467027581265 ], [ -84.768902961202684, 10.355388902375921 ], [ -84.771280077113829, 10.359729723048247 ], [ -84.77267534019478, 10.361693426910108 ], [ -84.775465868155266, 10.368566392225205 ], [ -84.779393276778308, 10.387066555577064 ], [ -84.763993699749449, 10.442153631784663 ], [ -84.785775315678279, 10.485148423760734 ], [ -84.79326839861767, 10.496620592166607 ], [ -84.850396694851554, 10.540028795292642 ], [ -84.86845760773241, 10.549123846887994 ], [ -84.923389655208382, 10.563283189567528 ], [ -84.937316453891242, 10.568760890902354 ], [ -84.948013475041819, 10.580543118570063 ], [ -84.974704353323204, 10.604107571207408 ], [ -84.977934129956111, 10.607724921467934 ], [ -84.983592699343603, 10.616251532282377 ], [ -84.986538256035658, 10.623227851284298 ], [ -84.991111619805395, 10.650151271763775 ], [ -85.002532111367827, 10.67046011024587 ], [ -85.016717291569762, 10.692732651690505 ], [ -85.022995978581548, 10.699347236385847 ], [ -85.029326340638079, 10.703222968165448 ], [ -85.042839729070238, 10.708907375974604 ], [ -85.05402767573662, 10.71211131418579 ], [ -85.107099372138293, 10.724617011365979 ], [ -85.122731493163883, 10.72983633118173 ], [ -85.128906827388164, 10.734332179686305 ], [ -85.136348232584851, 10.741256821844843 ], [ -85.166036342603093, 10.761255601065102 ], [ -85.17373613201687, 10.765131333744023 ], [ -85.179575567658333, 10.767508450554544 ], [ -85.185931769935223, 10.768025214492013 ], [ -85.192520515309525, 10.76781850801774 ], [ -85.204819506015383, 10.7662682153059 ], [ -85.226704474731719, 10.760997219546027 ], [ -85.252801072911154, 10.758516750847377 ], [ -85.282721726926127, 10.759550278722372 ], [ -85.307319709237163, 10.80771271457013 ], [ -85.316053025626616, 10.820941881262797 ], [ -85.320471360664726, 10.824145820373303 ], [ -85.322770962210143, 10.825489407510133 ], [ -85.325251430908793, 10.826574612228569 ], [ -85.327783575551564, 10.827453111371995 ], [ -85.350340338735634, 10.83024363933248 ], [ -85.356438157694811, 10.832414048769294 ], [ -85.380829434430836, 10.846366684974498 ], [ -85.392198249149885, 10.854944973531701 ], [ -85.437544317716061, 10.906879788371498 ], [ -85.438784552964705, 10.908585109814965 ], [ -85.441006639244961, 10.912770900856401 ], [ -85.441187507297627, 10.91540639918594 ], [ -85.440722419304166, 10.917680162309637 ], [ -85.437001716256191, 10.922020982082643 ], [ -85.403024462409007, 10.924501450781293 ], [ -85.393877733070894, 10.928428860303654 ], [ -85.390983853222224, 10.93297638655099 ], [ -85.388968471617659, 10.937420559111501 ], [ -85.310471970604965, 10.99023387309478 ], [ -85.262671270862427, 11.043357245440518 ], [ -85.258950567814452, 11.045941066926673 ], [ -85.256263394440111, 11.046767890126034 ], [ -85.25233598491775, 11.047284654063503 ], [ -85.246289841902637, 11.049403388455573 ], [ -85.238848435806631, 11.05110870989904 ], [ -85.236478239279279, 11.05309661721509 ], [ -85.092837483999915, 11.000647482000119 ], [ -84.931400309999873, 10.941891378000065 ], [ -84.908404296999919, 10.939359233000076 ], [ -84.884969034999955, 10.947679138000041 ], [ -84.781771199999923, 11.014884339000091 ], [ -84.707770548999918, 11.063046774000085 ], [ -84.676454630999899, 11.070410665000082 ], [ -84.658729614999885, 11.062736715000099 ], [ -84.620669921999934, 11.035761617000077 ], [ -84.603229125999889, 11.033281149000089 ], [ -84.581680053999946, 11.034469706000024 ], [ -84.558606526999966, 11.027209168000056 ], [ -84.508738769999923, 11.005530904000054 ], [ -84.503338582999874, 11.004032288000047 ], [ -84.498170939999852, 11.001991069000098 ], [ -84.493313354999941, 10.999407248000097 ], [ -84.489127563999887, 10.996358337000061 ], [ -84.46638993399992, 10.968453064000087 ], [ -84.457837483999896, 10.961347555000145 ], [ -84.448871623999963, 10.956334941000094 ], [ -84.438200439999946, 10.952200826000066 ], [ -84.427245035999874, 10.951115621000071 ], [ -84.417762410999899, 10.955043030000041 ], [ -84.363967244999884, 10.989614563000131 ], [ -84.355466471999875, 10.994627177000098 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CR-G", "NAME_1": "Guanacaste" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -85.597793741999936, 11.209937032000099 ], [ -85.569164998999952, 11.195390117000045 ], [ -85.540949666999978, 11.17032704600004 ], [ -85.508626058999909, 11.152421163000071 ], [ -85.407417765999895, 11.115446676000118 ], [ -85.272361409999917, 11.066199036000043 ], [ -85.236478239279279, 11.05309661721509 ], [ -85.238848435806631, 11.05110870989904 ], [ -85.246289841902637, 11.049403388455573 ], [ -85.25233598491775, 11.047284654063503 ], [ -85.256263394440111, 11.046767890126034 ], [ -85.258950567814452, 11.045941066926673 ], [ -85.262671270862427, 11.043357245440518 ], [ -85.310471970604965, 10.99023387309478 ], [ -85.388968471617659, 10.937420559111501 ], [ -85.390983853222224, 10.93297638655099 ], [ -85.393877733070894, 10.928428860303654 ], [ -85.403024462409007, 10.924501450781293 ], [ -85.437001716256191, 10.922020982082643 ], [ -85.440722419304166, 10.917680162309637 ], [ -85.441187507297627, 10.91540639918594 ], [ -85.441006639244961, 10.912770900856401 ], [ -85.438784552964705, 10.908585109814965 ], [ -85.437544317716061, 10.906879788371498 ], [ -85.392198249149885, 10.854944973531701 ], [ -85.380829434430836, 10.846366684974498 ], [ -85.356438157694811, 10.832414048769294 ], [ -85.350340338735634, 10.83024363933248 ], [ -85.327783575551564, 10.827453111371995 ], [ -85.325251430908793, 10.826574612228569 ], [ -85.322770962210143, 10.825489407510133 ], [ -85.320471360664726, 10.824145820373303 ], [ -85.316053025626616, 10.820941881262797 ], [ -85.307319709237163, 10.80771271457013 ], [ -85.282721726926127, 10.759550278722372 ], [ -85.252801072911154, 10.758516750847377 ], [ -85.226704474731719, 10.760997219546027 ], [ -85.204819506015383, 10.7662682153059 ], [ -85.192520515309525, 10.76781850801774 ], [ -85.185931769935223, 10.768025214492013 ], [ -85.179575567658333, 10.767508450554544 ], [ -85.17373613201687, 10.765131333744023 ], [ -85.166036342603093, 10.761255601065102 ], [ -85.136348232584851, 10.741256821844843 ], [ -85.128906827388164, 10.734332179686305 ], [ -85.122731493163883, 10.72983633118173 ], [ -85.107099372138293, 10.724617011365979 ], [ -85.05402767573662, 10.71211131418579 ], [ -85.042839729070238, 10.708907375974604 ], [ -85.029326340638079, 10.703222968165448 ], [ -85.022995978581548, 10.699347236385847 ], [ -85.016717291569762, 10.692732651690505 ], [ -85.002532111367827, 10.67046011024587 ], [ -84.991111619805395, 10.650151271763775 ], [ -84.986538256035658, 10.623227851284298 ], [ -84.983592699343603, 10.616251532282377 ], [ -84.977934129956111, 10.607724921467934 ], [ -84.974704353323204, 10.604107571207408 ], [ -84.948013475041819, 10.580543118570063 ], [ -84.937316453891242, 10.568760890902354 ], [ -84.923389655208382, 10.563283189567528 ], [ -84.86845760773241, 10.549123846887994 ], [ -84.850396694851554, 10.540028795292642 ], [ -84.79326839861767, 10.496620592166607 ], [ -84.785775315678279, 10.485148423760734 ], [ -84.763993699749449, 10.442153631784663 ], [ -84.779393276778308, 10.387066555577064 ], [ -84.775465868155266, 10.368566392225205 ], [ -84.77267534019478, 10.361693426910108 ], [ -84.771280077113829, 10.359729723048247 ], [ -84.768902961202684, 10.355388902375921 ], [ -84.770608282646094, 10.345467027581265 ], [ -84.786627977299304, 10.315339667091962 ], [ -84.802260098324837, 10.32784536427215 ], [ -84.806678433363004, 10.329809068133954 ], [ -84.81238867869456, 10.33166942010763 ], [ -84.817401292935301, 10.331979478470146 ], [ -84.824920214296412, 10.33166942010763 ], [ -84.829183518804314, 10.330790920064885 ], [ -84.832516649124045, 10.329705715346449 ], [ -84.838433600929932, 10.325674953935959 ], [ -84.847089402953543, 10.316528225497223 ], [ -84.850810106001575, 10.313427639174222 ], [ -84.859879320074526, 10.308776760139381 ], [ -84.865822110302133, 10.304797675572274 ], [ -84.870240445340244, 10.300301825269003 ], [ -84.872979295558025, 10.296271063858512 ], [ -84.87481380910998, 10.292860419172996 ], [ -84.875433925835011, 10.289914863380204 ], [ -84.875433925835011, 10.28696930578883 ], [ -84.874891324375085, 10.284333808358554 ], [ -84.873728604391545, 10.282163398022362 ], [ -84.87228166356789, 10.280199693261238 ], [ -84.864917771837668, 10.273481757577031 ], [ -84.863600023122558, 10.27151805281585 ], [ -84.862850715188358, 10.26888255538563 ], [ -84.862488979982402, 10.266247057056034 ], [ -84.862954067975863, 10.263559881883054 ], [ -84.867630785432368, 10.25033071519033 ], [ -84.869878710134344, 10.231107083225311 ], [ -84.870886399587675, 10.228109848790496 ], [ -84.876984219446172, 10.215500799722122 ], [ -84.877914395432981, 10.212090155036606 ], [ -84.877940232955382, 10.209402980762945 ], [ -84.877139248177741, 10.206922512064239 ], [ -84.876183233769211, 10.204752101728104 ], [ -84.87481380910998, 10.202685045078738 ], [ -84.871635708421195, 10.199067694818268 ], [ -84.870240445340244, 10.196173814070278 ], [ -84.869542813350165, 10.192401435078125 ], [ -84.870085414810035, 10.185166734557129 ], [ -84.8717390612087, 10.181756089871612 ], [ -84.87380611785801, 10.179120592441393 ], [ -84.892978074778284, 10.170904039090146 ], [ -84.897344732973011, 10.16806183518554 ], [ -84.915405645853866, 10.152352199794166 ], [ -84.920108201732091, 10.14666779198501 ], [ -84.922795376005809, 10.142223619424499 ], [ -84.923622199205113, 10.136125800465322 ], [ -84.923699713570898, 10.133025214142322 ], [ -84.922640347274182, 10.127289130389045 ], [ -84.918867967382766, 10.116592109238411 ], [ -84.918351203445241, 10.112768053402931 ], [ -84.919927333679482, 10.111217759791771 ], [ -84.922330288012347, 10.11101105421676 ], [ -84.925043300707728, 10.111631170941791 ], [ -84.927575446249818, 10.112457994141096 ], [ -84.93685136589778, 10.117367254695012 ], [ -84.944706184043127, 10.123310044922619 ], [ -84.948375210247718, 10.126927395183145 ], [ -84.960570848166071, 10.142120265737674 ], [ -84.968038092683798, 10.148528143958686 ], [ -84.970053474288363, 10.149975083883021 ], [ -84.979251878671221, 10.154936021280321 ], [ -84.984212816068577, 10.156848049198118 ], [ -84.987158372760689, 10.157468166822412 ], [ -84.990388150292858, 10.157623196453358 ], [ -84.994367234859965, 10.157003078829007 ], [ -84.999483201888268, 10.155452786117166 ], [ -85.001085171443492, 10.155142726855331 ], [ -85.003513964198078, 10.154987698123762 ], [ -85.006175300050018, 10.155607814848736 ], [ -85.008500739117778, 10.156589666779666 ], [ -85.010593635088185, 10.158036606704002 ], [ -85.014366014080281, 10.161137193027002 ], [ -85.016562262838136, 10.162170721801374 ], [ -85.019197761167732, 10.162790839425668 ], [ -85.021962449807177, 10.162739163481604 ], [ -85.027621019194669, 10.161653957863848 ], [ -85.033873867784735, 10.161033840239497 ], [ -85.037077805995921, 10.161137193027002 ], [ -85.040152553897201, 10.161653957863848 ], [ -85.048369107248504, 10.161808987494737 ], [ -85.068393723991164, 10.155866197267187 ], [ -85.068565921124971, 10.155815093516726 ], [ -85.072865363999938, 10.158758856000077 ], [ -85.076771613999938, 10.160589911000045 ], [ -85.089873826999906, 10.172390041000085 ], [ -85.107899542999917, 10.166571356000077 ], [ -85.175567186999899, 10.16555410400008 ], [ -85.193470831999946, 10.170111395000049 ], [ -85.209462042999917, 10.18117910400008 ], [ -85.234527147999927, 10.207098700000074 ], [ -85.234527147999927, 10.213324286000045 ], [ -85.228789842999902, 10.231594143000052 ], [ -85.246245897999927, 10.252630927000041 ], [ -85.289173956999946, 10.282253322000088 ], [ -85.283070441999939, 10.26203034100007 ], [ -85.254180467999902, 10.241156317000048 ], [ -85.247547980999911, 10.216742255000042 ], [ -85.244903123999904, 10.170355536000045 ], [ -85.238880988999938, 10.143133856000077 ], [ -85.227080857999908, 10.124579169000071 ], [ -85.240101691999939, 10.116278387000079 ], [ -85.238270636999914, 10.102443752000056 ], [ -85.226470506999931, 10.08938222900008 ], [ -85.195912238999938, 10.07876211100006 ], [ -85.185047980999911, 10.067084052000041 ], [ -85.171864386999914, 10.042059637000079 ], [ -85.165638800999943, 10.042059637000079 ], [ -85.157582160999937, 10.045355536000045 ], [ -85.154082811999899, 10.042669989000046 ], [ -85.15257727799991, 10.035834052000041 ], [ -85.161284959999932, 10.035183010000083 ], [ -85.170277472999942, 10.036322333000044 ], [ -85.178822394999941, 10.038845119000086 ], [ -85.186146613999938, 10.042059637000079 ], [ -85.186146613999938, 10.035834052000041 ], [ -85.167397671565254, 10.019403308315987 ], [ -85.177508511008966, 9.986987615685905 ], [ -85.183373785971412, 9.978822740077362 ], [ -85.205336269952852, 9.973603420261611 ], [ -85.210323045771929, 9.971484686768861 ], [ -85.23613542401057, 9.956756904207737 ], [ -85.240786302146091, 9.955464993015028 ], [ -85.242827521273057, 9.956498520890023 ], [ -85.244713710769133, 9.958152167288688 ], [ -85.246264004380293, 9.959857488732098 ], [ -85.248072678611209, 9.961459459186699 ], [ -85.254868129560521, 9.960787664718964 ], [ -85.265306770091343, 9.957532050563657 ], [ -85.289930589924779, 9.945749822896005 ], [ -85.299103155885916, 9.937378240813132 ], [ -85.303288946927353, 9.929678453198051 ], [ -85.301583624584566, 9.923942369444774 ], [ -85.298224656742491, 9.919394843197438 ], [ -85.294400600907011, 9.916035875355362 ], [ -85.290163133022133, 9.913917140963292 ], [ -85.285925666036633, 9.913245348294197 ], [ -85.276598070444606, 9.914485581744202 ], [ -85.27336829291238, 9.914537257688266 ], [ -85.270319383432764, 9.914433904900761 ], [ -85.261431037412422, 9.912831936244856 ], [ -85.258976407135492, 9.911746731526421 ], [ -85.25466142398551, 9.909266261928451 ], [ -85.25218095618618, 9.908232734053399 ], [ -85.249390428225638, 9.907612616429105 ], [ -85.239933641424386, 9.907715969216611 ], [ -85.23419755677179, 9.906475734867229 ], [ -85.227531297931023, 9.902755031819254 ], [ -85.219831509416622, 9.900119534388978 ], [ -85.217480231027821, 9.898930975983717 ], [ -85.215568203110081, 9.897329006428492 ], [ -85.21130489770286, 9.891437893044326 ], [ -85.205801357946314, 9.886476956546289 ], [ -85.203088345250933, 9.882291165504853 ], [ -85.202003139633177, 9.879914048694388 ], [ -85.200659553395667, 9.877743639257517 ], [ -85.198644171791102, 9.873041083379292 ], [ -85.197765672647677, 9.867098293151685 ], [ -85.196318731824022, 9.861517239029354 ], [ -85.195000983108855, 9.859450182379987 ], [ -85.192908088037825, 9.858003241556332 ], [ -85.190350104074014, 9.857124742412907 ], [ -85.175725674300395, 9.853714097727391 ], [ -85.173839483905056, 9.851802069809651 ], [ -85.173400235232634, 9.849373277055065 ], [ -85.176345791025426, 9.843223782151824 ], [ -85.180144009338562, 9.832940172151211 ], [ -85.190401780917455, 9.794596259209982 ], [ -85.190660163335849, 9.788446764306741 ], [ -85.189264899355578, 9.784312649209369 ], [ -85.186448533872749, 9.781108710098863 ], [ -85.186009284301008, 9.778834946975223 ], [ -85.186939460287874, 9.776974595900867 ], [ -85.192649705619431, 9.772427070552851 ], [ -85.194665087223996, 9.769378160173915 ], [ -85.19683549666081, 9.765037340400909 ], [ -85.199677700565417, 9.756355699056257 ], [ -85.201848110901608, 9.752169908014821 ], [ -85.204251065234473, 9.749534410584545 ], [ -85.206834885821308, 9.747829088241815 ], [ -85.209754604991019, 9.745400295487229 ], [ -85.216188320734375, 9.732222804738626 ], [ -85.218642951011361, 9.730672512026786 ], [ -85.220735846981711, 9.730259100876765 ], [ -85.226626960365934, 9.727571925703785 ], [ -85.229184943430369, 9.724936428273509 ], [ -85.229295448878645, 9.724822572867236 ], [ -85.234527147999927, 9.737331447000088 ], [ -85.238636847999942, 9.742010809000078 ], [ -85.247914191999939, 9.747748114000046 ], [ -85.272979295999903, 9.758002020000049 ], [ -85.275054490999935, 9.76593659100007 ], [ -85.274688279999907, 9.775051174000055 ], [ -85.275502081999946, 9.782009182000081 ], [ -85.299305792999917, 9.808010158000059 ], [ -85.332427537999934, 9.826605536000045 ], [ -85.439971482999908, 9.864528713000084 ], [ -85.449574347999942, 9.862494208000044 ], [ -85.4638972649999, 9.852606512000079 ], [ -85.470366990999935, 9.85024648600006 ], [ -85.480010545999903, 9.852484442000048 ], [ -85.493560350999928, 9.862250067000048 ], [ -85.50454667899993, 9.864528713000084 ], [ -85.510975714999915, 9.865057684000078 ], [ -85.513213670999903, 9.86664459800005 ], [ -85.514515753999945, 9.869655666000085 ], [ -85.518177863999938, 9.874172268000052 ], [ -85.525176561999899, 9.877386786000045 ], [ -85.530995245999918, 9.875881252000056 ], [ -85.534820115999935, 9.872707424000055 ], [ -85.535552537999934, 9.870754299000055 ], [ -85.592071092999902, 9.888739325000074 ], [ -85.619130011999914, 9.89288971600007 ], [ -85.625518357999908, 9.89679596600007 ], [ -85.630604620999918, 9.901556708000044 ], [ -85.638579881999931, 9.905462958000044 ], [ -85.649810350999928, 9.904974677000041 ], [ -85.657215949999909, 9.900539455000057 ], [ -85.663807745999918, 9.900091864000046 ], [ -85.672718878999945, 9.911688544000071 ], [ -85.665557420999903, 9.93032461100006 ], [ -85.676136847999942, 9.955511786000045 ], [ -85.778553839999915, 10.079901434000078 ], [ -85.784657355999911, 10.090887762000079 ], [ -85.792713995999918, 10.11782461100006 ], [ -85.805043097999942, 10.136664130000042 ], [ -85.844024217999902, 10.231024481000077 ], [ -85.847564256999931, 10.259344794000071 ], [ -85.851836717999902, 10.276556708000044 ], [ -85.857696092999902, 10.289089260000083 ], [ -85.843902147999927, 10.302435614000046 ], [ -85.838164842999902, 10.31203847900008 ], [ -85.840321417999917, 10.320135809000078 ], [ -85.861602342999902, 10.346991278000075 ], [ -85.874989386999914, 10.355047919000071 ], [ -85.867583787999934, 10.364894924000055 ], [ -85.85024980399993, 10.378485419000071 ], [ -85.83853105399993, 10.395453192000048 ], [ -85.830352342999902, 10.412014065000051 ], [ -85.813262498999904, 10.405300197000088 ], [ -85.803985154999907, 10.415920315000051 ], [ -85.796742316999939, 10.431423244000086 ], [ -85.775502081999946, 10.447292385000083 ], [ -85.783721482999908, 10.465236721000053 ], [ -85.798817511999914, 10.483954169000071 ], [ -85.80923417899993, 10.494533596000053 ], [ -85.80296790299991, 10.498806057000081 ], [ -85.800282355999911, 10.500270901000079 ], [ -85.795643683999913, 10.501369533000059 ], [ -85.795643683999913, 10.508205471000053 ], [ -85.80923417899993, 10.508205471000053 ], [ -85.80923417899993, 10.515041408000059 ], [ -85.797840949999909, 10.517157294000071 ], [ -85.790516730999911, 10.524115302000041 ], [ -85.781971808999913, 10.542995510000083 ], [ -85.775135870999918, 10.542995510000083 ], [ -85.761219855999911, 10.531805731000077 ], [ -85.741607225999928, 10.539821682000081 ], [ -85.721587693999936, 10.550930080000057 ], [ -85.706288214999915, 10.54913971600007 ], [ -85.700062628999945, 10.54913971600007 ], [ -85.70140540299991, 10.562282619000086 ], [ -85.697987433999913, 10.568630276000079 ], [ -85.692290818999936, 10.572088934000078 ], [ -85.687001105999911, 10.57648346600007 ], [ -85.677845831999946, 10.59210846600007 ], [ -85.674224412999934, 10.59125397300005 ], [ -85.661854620999918, 10.590114651000079 ], [ -85.631743943999936, 10.621161200000074 ], [ -85.634022589999915, 10.629461981000077 ], [ -85.63931230399993, 10.635809637000079 ], [ -85.652251756999931, 10.644720770000049 ], [ -85.693226691999939, 10.603786526000079 ], [ -85.694203253999945, 10.607082424000055 ], [ -85.694081183999913, 10.61001211100006 ], [ -85.695179816999939, 10.61163971600007 ], [ -85.700062628999945, 10.611232815000051 ], [ -85.700062628999945, 10.617458401000079 ], [ -85.688465949999909, 10.629950262000079 ], [ -85.681385870999918, 10.635199286000045 ], [ -85.672718878999945, 10.637884833000044 ], [ -85.679554816999939, 10.644720770000049 ], [ -85.680449998999904, 10.643825588000084 ], [ -85.681792772999927, 10.641913153000075 ], [ -85.683867967999902, 10.639797268000052 ], [ -85.687001105999911, 10.637884833000044 ], [ -85.684478318999936, 10.646185614000046 ], [ -85.683990037999934, 10.64907461100006 ], [ -85.672718878999945, 10.652167059000078 ], [ -85.672718878999945, 10.658392645000049 ], [ -85.679554816999939, 10.658392645000049 ], [ -85.679554816999939, 10.665838934000078 ], [ -85.662871873999904, 10.678981838000084 ], [ -85.659575975999928, 10.712958075000074 ], [ -85.665272589999915, 10.77883535400008 ], [ -85.680287238999938, 10.79633209800005 ], [ -85.713368292999917, 10.81085846600007 ], [ -85.746490037999934, 10.816188869000086 ], [ -85.761504686999899, 10.80609772300005 ], [ -85.767486131999931, 10.80609772300005 ], [ -85.795074022999927, 10.828640041000085 ], [ -85.803089972999942, 10.837184963000084 ], [ -85.798329230999911, 10.835638739000046 ], [ -85.792388475999928, 10.838324286000045 ], [ -85.789906378999945, 10.843898830000057 ], [ -85.795643683999913, 10.850856838000084 ], [ -85.80296790299991, 10.852484442000048 ], [ -85.822295701999906, 10.850612697000088 ], [ -85.830352342999902, 10.850856838000084 ], [ -85.859771287999934, 10.861761786000045 ], [ -85.882923956999946, 10.875148830000057 ], [ -85.908802863999938, 10.886419989000046 ], [ -85.946441209999932, 10.891140041000085 ], [ -85.946441209999932, 10.898586330000057 ], [ -85.923817511999914, 10.904201565000051 ], [ -85.88149980399993, 10.923163153000075 ], [ -85.857696092999902, 10.925930080000057 ], [ -85.861480272999927, 10.932074286000045 ], [ -85.864491339999915, 10.93585846600007 ], [ -85.869130011999914, 10.93813711100006 ], [ -85.878163214999915, 10.939601955000057 ], [ -85.878163214999915, 10.946356512000079 ], [ -85.828724738999938, 10.949286200000074 ], [ -85.816151495999918, 10.946356512000079 ], [ -85.810902472999942, 10.938666083000044 ], [ -85.812163865999935, 10.929714260000083 ], [ -85.814605272999927, 10.922267971000053 ], [ -85.812652147999927, 10.919094143000052 ], [ -85.808501756999931, 10.917181708000044 ], [ -85.795643683999913, 10.905462958000044 ], [ -85.789418097999942, 10.905462958000044 ], [ -85.781971808999913, 10.912868557000081 ], [ -85.781971808999913, 10.919094143000052 ], [ -85.793365037999934, 10.930243231000077 ], [ -85.782460089999915, 10.937445380000042 ], [ -85.761138475999928, 10.940578518000052 ], [ -85.740996873999904, 10.939601955000057 ], [ -85.734160936999899, 10.936428127000056 ], [ -85.725209113999938, 10.927679755000042 ], [ -85.717071092999902, 10.925930080000057 ], [ -85.710560675999943, 10.928290106000077 ], [ -85.707793748999904, 10.934027411000045 ], [ -85.708892381999931, 10.940822658000059 ], [ -85.713734503999945, 10.946356512000079 ], [ -85.713734503999945, 10.953802802000041 ], [ -85.698882615999935, 10.959255276000079 ], [ -85.694691535999937, 10.97024160400008 ], [ -85.698150193999936, 10.983221747000073 ], [ -85.706288214999915, 10.994818427000041 ], [ -85.71353105399993, 11.000026760000083 ], [ -85.730376756999931, 11.006903387000079 ], [ -85.737578904999907, 11.011867580000057 ], [ -85.746001756999931, 11.020656643000052 ], [ -85.746001756999931, 11.023016669000071 ], [ -85.740956183999913, 11.02407461100006 ], [ -85.734160936999899, 11.028957424000055 ], [ -85.718861456999946, 11.042914130000042 ], [ -85.7099910149999, 11.038112697000088 ], [ -85.699615037999934, 11.028631903000075 ], [ -85.679554816999939, 11.028957424000055 ], [ -85.667510545999903, 11.039862372000073 ], [ -85.670196092999902, 11.054388739000046 ], [ -85.681019660999937, 11.068386135000083 ], [ -85.693226691999939, 11.077337958000044 ], [ -85.701735565999883, 11.080880181000097 ], [ -85.677582153999907, 11.119632467000059 ], [ -85.659314534999851, 11.158829041000018 ], [ -85.631150879999893, 11.196216939000067 ], [ -85.597793741999936, 11.209937032000099 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CR-L", "NAME_1": "Limón" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -82.719726521999945, 9.541330872000032 ], [ -82.729364176999951, 9.544896546000089 ], [ -82.771092895999885, 9.579855652000091 ], [ -82.829022175999938, 9.6027224730001 ], [ -82.847470662999854, 9.600655416000052 ], [ -82.866048340999896, 9.585074972000101 ], [ -82.877391316999876, 9.569184469000092 ], [ -82.879251668999899, 9.55990854900007 ], [ -82.867133544999888, 9.538643697000097 ], [ -82.860208902999915, 9.511203512000037 ], [ -82.855919758999846, 9.505441590000075 ], [ -82.849382690999875, 9.503477885000038 ], [ -82.844783488999923, 9.500687358000079 ], [ -82.846385457999958, 9.492548320000068 ], [ -82.861294108999914, 9.484099223000072 ], [ -82.914624186999902, 9.476864522000099 ], [ -82.933305216999969, 9.470327454000127 ], [ -82.941702636999935, 9.45634897900004 ], [ -82.944286458999869, 9.437151185000118 ], [ -82.94320125399986, 9.354313863000101 ], [ -82.941650960999937, 9.234424540000134 ], [ -82.93952108499991, 9.070641889000072 ], [ -82.940229050829998, 9.071229559896267 ], [ -82.949504971377337, 9.078929348410668 ], [ -82.952657232745082, 9.080996405060034 ], [ -82.968831957029181, 9.086060696144216 ], [ -82.985807665191601, 9.102855536253969 ], [ -82.990897792898807, 9.110245266405911 ], [ -82.997150642388192, 9.127505195408446 ], [ -83.002473314092128, 9.135825099748558 ], [ -83.006607429189501, 9.138357245290649 ], [ -83.012860276880247, 9.14125112603864 ], [ -83.047302618720835, 9.150759588783956 ], [ -83.050299852256387, 9.152516587970126 ], [ -83.053090380216872, 9.154997057568153 ], [ -83.056113451274769, 9.160164700540463 ], [ -83.057482875933943, 9.163885402689175 ], [ -83.068386603558906, 9.217628891759944 ], [ -83.071952276975992, 9.227447415565734 ], [ -83.074277716943072, 9.231788235338797 ], [ -83.075750495289128, 9.233751939200602 ], [ -83.077559170419363, 9.235405584699947 ], [ -83.079626227968049, 9.236955878311107 ], [ -83.115437995367188, 9.257109687162313 ], [ -83.119391242411893, 9.259951890167599 ], [ -83.12660010361185, 9.266773180437895 ], [ -83.165667486964935, 9.316847642404753 ], [ -83.170008307637261, 9.318087876754078 ], [ -83.176571214589842, 9.318811347165934 ], [ -83.198068609678558, 9.317261054454093 ], [ -83.211917893995576, 9.314728908912002 ], [ -83.215328538681092, 9.314728908912002 ], [ -83.220625372862628, 9.315659084898812 ], [ -83.227705043752735, 9.317777818391619 ], [ -83.243337164778325, 9.32568431248103 ], [ -83.252871466844681, 9.332040513858601 ], [ -83.257677374611148, 9.334520982557308 ], [ -83.276151700440607, 9.340618801516484 ], [ -83.281267665670214, 9.342892563740804 ], [ -83.283567268114894, 9.344287827721075 ], [ -83.28584103123859, 9.345373033338831 ], [ -83.30434119279181, 9.361289374305159 ], [ -83.30873369030752, 9.364183254153829 ], [ -83.313462083708202, 9.366560370065031 ], [ -83.316795214027877, 9.36671539969592 ], [ -83.321136033800883, 9.36594025334 ], [ -83.328448248687721, 9.36211619750452 ], [ -83.332143114213352, 9.359739080693998 ], [ -83.334726935699507, 9.357258612894668 ], [ -83.346405808781014, 9.341032213565768 ], [ -83.34805945517968, 9.339326890323719 ], [ -83.352296923064557, 9.337931627242767 ], [ -83.371003791092051, 9.336174628056654 ], [ -83.376584846113758, 9.334831040919767 ], [ -83.380305549161733, 9.333074041733653 ], [ -83.383845384157155, 9.329456692372446 ], [ -83.385705736130774, 9.328009752448111 ], [ -83.38795366083275, 9.326666165311281 ], [ -83.390124071168941, 9.32645945883695 ], [ -83.392371995870917, 9.32738963482376 ], [ -83.395007494200456, 9.335141099282282 ], [ -83.395627610925487, 9.338396715236229 ], [ -83.396402757281408, 9.341032213565768 ], [ -83.400045945963598, 9.344132798989449 ], [ -83.403275722596504, 9.34609650285131 ], [ -83.42939816009698, 9.353692939477583 ], [ -83.441645473959454, 9.362322903079473 ], [ -83.445159471432419, 9.36573354686567 ], [ -83.453634406302797, 9.377309068059049 ], [ -83.48686235221578, 9.467587794940755 ], [ -83.490428025632866, 9.478284816990708 ], [ -83.496835903853878, 9.491462306839992 ], [ -83.498954637346628, 9.494356186688663 ], [ -83.502158575557814, 9.497766832273498 ], [ -83.50401892843081, 9.500505683390543 ], [ -83.510065069647226, 9.514044908445783 ], [ -83.512132128095232, 9.526395575095705 ], [ -83.514302538431366, 9.535852362796277 ], [ -83.51091773126825, 9.566444810379664 ], [ -83.496990932585447, 9.594556790163722 ], [ -83.439113329316683, 9.663286445113329 ], [ -83.416634081397717, 9.719717109357077 ], [ -83.40875342483065, 9.732119451951121 ], [ -83.378548549975562, 9.7683446313996 ], [ -83.335915493205448, 9.821002915751933 ], [ -83.329249234364681, 9.838262843855148 ], [ -83.331833054951517, 9.856452947945172 ], [ -83.343382737723175, 9.891902981037731 ], [ -83.344855516069174, 9.913917140963292 ], [ -83.34154822507054, 9.931590481115791 ], [ -83.333641730081752, 9.947920234131459 ], [ -83.321291063431829, 9.965748603015584 ], [ -83.318913946621308, 9.969624334795185 ], [ -83.338990241106728, 9.973603420261611 ], [ -83.444901089014024, 9.976032213016197 ], [ -83.589052497075045, 9.977169094578016 ], [ -83.615226609620322, 9.986574205435204 ], [ -83.713256801859927, 10.031739406848146 ], [ -83.773563198782597, 10.059954739419652 ], [ -83.817462328323757, 10.080418605734053 ], [ -83.942726000304674, 10.136229153252827 ], [ -83.929083421562666, 10.181187649090703 ], [ -83.922546353031748, 10.190127671954485 ], [ -83.913554654223901, 10.198964342030763 ], [ -83.866477423993899, 10.248728746534425 ], [ -83.863402676092619, 10.253534654300836 ], [ -83.85107784696504, 10.279269517274372 ], [ -83.848416511113101, 10.286504217795425 ], [ -83.84722795270784, 10.291981920029571 ], [ -83.847718879122965, 10.294772447090736 ], [ -83.84686621840126, 10.306916409065025 ], [ -83.843610603346633, 10.321230780476128 ], [ -83.842732103303888, 10.328310452265555 ], [ -83.842912971356554, 10.333219712819471 ], [ -83.844127367284159, 10.335493475943167 ], [ -83.84722795270784, 10.339317531778647 ], [ -83.849863451037436, 10.343348293189138 ], [ -83.851749641432775, 10.348412584273319 ], [ -83.854798550013072, 10.359264635054842 ], [ -83.868131070392565, 10.383759264578373 ], [ -83.869422979786691, 10.387531643570469 ], [ -83.87167090538793, 10.402104397400024 ], [ -83.871076626185356, 10.408047186728254 ], [ -83.870275642307035, 10.412336331456515 ], [ -83.866787482356415, 10.419519355134128 ], [ -83.863945279351128, 10.423601793388059 ], [ -83.855935431574892, 10.438846339886652 ], [ -83.853920050869647, 10.441223455797854 ], [ -83.85164628774595, 10.442256985471488 ], [ -83.849010790315731, 10.442567042934684 ], [ -83.846246100776909, 10.443290514245803 ], [ -83.843998176074933, 10.444479070852424 ], [ -83.842060309735473, 10.446029364463584 ], [ -83.838029548324982, 10.450111802717515 ], [ -83.829037848617816, 10.463651027772698 ], [ -83.823430956073764, 10.484631658923888 ], [ -83.823405117652044, 10.489592597220565 ], [ -83.823870204746129, 10.492331448337666 ], [ -83.827875128634275, 10.502201646288938 ], [ -83.828495246258569, 10.505198878925114 ], [ -83.828650274990196, 10.50860952450995 ], [ -83.827720099902649, 10.516774400118436 ], [ -83.827616747115144, 10.520081692016447 ], [ -83.828030158265165, 10.522975571865118 ], [ -83.829192878248705, 10.525301011832198 ], [ -83.830588142228976, 10.527419745324949 ], [ -83.833766242018442, 10.53114044837298 ], [ -83.835239021263817, 10.533207505921666 ], [ -83.836195034773027, 10.535584621832811 ], [ -83.836350064403916, 10.541475735216977 ], [ -83.830691494117161, 10.584367174405543 ], [ -83.831363287685576, 10.593772284363411 ], [ -83.829968023705305, 10.624261379159293 ], [ -83.828650274990196, 10.633356432553285 ], [ -83.82699663039017, 10.639247545038131 ], [ -83.825394659935569, 10.641056220168423 ], [ -83.821570604100089, 10.644260159278929 ], [ -83.813121506752111, 10.64968618377037 ], [ -83.803509691219233, 10.65464712206699 ], [ -83.799556444174527, 10.657644354703166 ], [ -83.789531215693046, 10.668289699909735 ], [ -83.772581345952347, 10.679090073847817 ], [ -83.762142707220164, 10.682552395376717 ], [ -83.756329108201783, 10.683740952882658 ], [ -83.72715776212101, 10.686221422480628 ], [ -83.716615769702003, 10.688856919910904 ], [ -83.712765876344122, 10.688960272698409 ], [ -83.709174363605996, 10.688650214335894 ], [ -83.704575161414539, 10.687151598467494 ], [ -83.703567471061945, 10.688081773554984 ], [ -83.703696662271113, 10.689787095897771 ], [ -83.70578955824152, 10.6929910341089 ], [ -83.70827002604085, 10.695833238013506 ], [ -83.711990729088882, 10.698933824336507 ], [ -83.720646532011813, 10.704153144152258 ], [ -83.724573940634855, 10.707357083262764 ], [ -83.72793290937625, 10.71076772704896 ], [ -83.73100765727753, 10.71459178288444 ], [ -83.731886156420956, 10.718105780357462 ], [ -83.732273729149256, 10.722963364967313 ], [ -83.72927649561376, 10.743013821031013 ], [ -83.729431525244706, 10.746527818504035 ], [ -83.729999966025616, 10.749835110401989 ], [ -83.732738817142661, 10.754641018168456 ], [ -83.736511197034076, 10.759136868471671 ], [ -83.741549648797218, 10.763994452182203 ], [ -83.743849250342635, 10.765648098580868 ], [ -83.74625220377618, 10.767146715348645 ], [ -83.749352790099181, 10.768335272854529 ], [ -83.760799120083334, 10.771487535121651 ], [ -83.763818115413699, 10.773683167843899 ], [ -83.698142252999872, 10.789161682000071 ], [ -83.66302811699984, 10.807015889000112 ], [ -83.660134236999852, 10.834171855000093 ], [ -83.669306803999945, 10.869751078000064 ], [ -83.669854510493167, 10.891717678072528 ], [ -83.679831847356198, 10.897010590307339 ], [ -83.676850114500567, 10.910298763549688 ], [ -83.678799709060002, 10.916154380185779 ], [ -83.680976324785831, 10.917119398852687 ], [ -83.688754410845718, 10.93458680566807 ], [ -83.696499785854115, 10.936594144736317 ], [ -83.686867076854611, 10.937970246495594 ], [ -83.681766322780319, 10.935434518184676 ], [ -83.67833546290187, 10.935952757867287 ], [ -83.672991238860462, 10.933231989430151 ], [ -83.672991238860462, 10.931288568122966 ], [ -83.675564383769284, 10.929409915424063 ], [ -83.675564383769284, 10.925976484931059 ], [ -83.671275808921237, 10.926494741135784 ], [ -83.666195497178151, 10.931223787193453 ], [ -83.665352396489226, 10.935318186754772 ], [ -83.660755988999938, 10.934393622000073 ], [ -83.644357876999948, 10.925930080000057 ], [ -83.624256964999915, 10.902899481000077 ], [ -83.598703579999949, 10.856594143000052 ], [ -83.580555792999917, 10.807318427000041 ], [ -83.582875128999945, 10.77570221600007 ], [ -83.597564256999931, 10.79360586100006 ], [ -83.623850063999896, 10.857611395000049 ], [ -83.606922980999911, 10.777777411000045 ], [ -83.608631964999915, 10.745510158000059 ], [ -83.637521938999896, 10.721096096000053 ], [ -83.622222459999932, 10.723863023000092 ], [ -83.611887173999946, 10.730861721000053 ], [ -83.602162238999938, 10.739569403000075 ], [ -83.589100714999915, 10.747748114000046 ], [ -83.593658006999931, 10.742661851000037 ], [ -83.594715949999909, 10.736558335000041 ], [ -83.593006964999915, 10.729315497000073 ], [ -83.589100714999915, 10.721096096000053 ], [ -83.585275844999899, 10.732855536000045 ], [ -83.581044074999909, 10.755804755000042 ], [ -83.575428839999915, 10.768255927000041 ], [ -83.526966925999943, 10.636053778000075 ], [ -83.466175910999937, 10.494533596000053 ], [ -83.394520636999914, 10.376044012000079 ], [ -83.203724738999938, 10.129339911000045 ], [ -83.188384568999936, 10.117743231000077 ], [ -83.124663865999935, 10.040594794000071 ], [ -83.085316535999937, 10.002142645000049 ], [ -83.061512824999909, 10.015326239000046 ], [ -83.052398240999935, 10.009588934000078 ], [ -83.02603105399993, 10.005031643000052 ], [ -83.020578579999949, 9.997381903000075 ], [ -83.01984615799995, 9.978705145000049 ], [ -83.016672329999949, 9.963120835000041 ], [ -83.009348110999952, 9.949286200000074 ], [ -82.99632727799991, 9.935939846000053 ], [ -82.949777798999946, 9.867580471000053 ], [ -82.934885219999899, 9.857082424000055 ], [ -82.87726803299995, 9.780096747000073 ], [ -82.833811001999948, 9.739488023000092 ], [ -82.808257615999935, 9.747219143000052 ], [ -82.802479620999918, 9.731512762000079 ], [ -82.796986456999946, 9.691229559000078 ], [ -82.78774980399993, 9.672756252000056 ], [ -82.772328253999945, 9.661037502000056 ], [ -82.705230272999927, 9.637925523000092 ], [ -82.681385870999918, 9.63548411700009 ], [ -82.657948370999918, 9.636297919000071 ], [ -82.635894334999932, 9.634507554000038 ], [ -82.616444464999915, 9.624335028000075 ], [ -82.591420050999943, 9.586981512000079 ], [ -82.574574347999942, 9.57680898600006 ], [ -82.573597785999937, 9.576198635000083 ], [ -82.562836873999913, 9.53869537300011 ], [ -82.570614176999925, 9.538230285000083 ], [ -82.585884562999865, 9.546240133000055 ], [ -82.601103271999904, 9.548668925000115 ], [ -82.608208781999934, 9.537868551000088 ], [ -82.612394572999875, 9.499498800000055 ], [ -82.618854125999917, 9.486708883000077 ], [ -82.632134969999925, 9.484667663000039 ], [ -82.650712646999892, 9.487845764000085 ], [ -82.668205118999936, 9.493168437000037 ], [ -82.678049479999913, 9.497767639000088 ], [ -82.688668986999915, 9.509446513000057 ], [ -82.701458903999878, 9.53355356900002 ], [ -82.711690836999963, 9.544999899000118 ], [ -82.719726521999945, 9.541330872000032 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CR-P", "NAME_1": "Puntarenas" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -82.93952108499991, 9.070641889000072 ], [ -82.939377197999931, 9.059577332000032 ], [ -82.90945654399988, 9.072005514000097 ], [ -82.900232299999885, 9.072057190000109 ], [ -82.893281819999885, 9.066941224000033 ], [ -82.889690307999928, 9.059370626000074 ], [ -82.88687394299987, 9.051489970000119 ], [ -82.882429769999931, 9.04534047500006 ], [ -82.876564494999855, 9.041929830000129 ], [ -82.854085246999944, 9.031982117000041 ], [ -82.80817073599988, 8.9983665970001 ], [ -82.762695475999919, 8.98299285900012 ], [ -82.749130411999914, 8.974078674000097 ], [ -82.72334387199993, 8.930928854000072 ], [ -82.719364786999847, 8.921523743000108 ], [ -82.720156710164019, 8.92023775007209 ], [ -82.733860025999974, 8.897985128000116 ], [ -82.763780679999911, 8.879950053000115 ], [ -82.866926839999934, 8.838066304000051 ], [ -82.8785798749999, 8.829772238000089 ], [ -82.888320882999949, 8.816930644000095 ], [ -82.883566650999853, 8.812383118000071 ], [ -82.875634318999914, 8.807525533000046 ], [ -82.875789347999842, 8.793908793000043 ], [ -82.885116943999975, 8.78318593400013 ], [ -82.914882568999957, 8.764789124000032 ], [ -82.92296992999988, 8.756159160000081 ], [ -82.924158488999893, 8.741198832000123 ], [ -82.919223388999939, 8.72706532800008 ], [ -82.910335042999918, 8.713913676000104 ], [ -82.878941609999913, 8.679057923000045 ], [ -82.862224284999854, 8.655700176000096 ], [ -82.849796102999875, 8.629861959000067 ], [ -82.841863769999918, 8.599476217000117 ], [ -82.835972656999928, 8.52976471000008 ], [ -82.838918213999932, 8.494624736000034 ], [ -82.848297485999865, 8.46516916900012 ], [ -82.870414998999877, 8.438116557000072 ], [ -82.896511596999886, 8.425352478000107 ], [ -82.924778604999858, 8.41674835200007 ], [ -82.953510701999875, 8.402098084000087 ], [ -82.997771565999898, 8.360162659000096 ], [ -83.043298502999875, 8.334737854000082 ], [ -83.052109334999869, 8.327632345000055 ], [ -83.053246216999952, 8.315100810000047 ], [ -83.044073649999859, 8.305359803000101 ], [ -83.016065023999943, 8.289004211000062 ], [ -83.010768188999918, 8.283371480000127 ], [ -83.001104695999885, 8.269237976000085 ], [ -82.995523640999892, 8.264819641000088 ], [ -82.989193277999874, 8.264457907000093 ], [ -82.977126830999879, 8.269237976000085 ], [ -82.968005940999888, 8.267971904000134 ], [ -82.95051346899993, 8.258825175000055 ], [ -82.943666341999887, 8.248567403000067 ], [ -82.939092977999849, 8.216838074000052 ], [ -82.886408854999928, 8.102193909000093 ], [ -82.891369791999892, 8.057545471000068 ], [ -82.897629258999899, 8.034748020000023 ], [ -82.911244269999941, 8.045355536000045 ], [ -82.909698045999903, 8.060614325000074 ], [ -82.902129686999899, 8.077460028000075 ], [ -82.897613084999932, 8.092800197000088 ], [ -82.900380011999914, 8.105047919000071 ], [ -82.968495245999918, 8.221218166000085 ], [ -82.992583787999934, 8.24640534100007 ], [ -83.116851365999935, 8.336127020000049 ], [ -83.150868292999917, 8.369289455000057 ], [ -83.121490037999934, 8.40493398600006 ], [ -83.116078253999945, 8.407782294000071 ], [ -83.110463019999941, 8.418036200000074 ], [ -83.099598761999914, 8.431341864000046 ], [ -83.092681443999936, 8.446682033000059 ], [ -83.099029100999928, 8.462713934000078 ], [ -83.131703253999945, 8.503200588000084 ], [ -83.137196417999917, 8.514553127000056 ], [ -83.1377253899999, 8.529323635000083 ], [ -83.130604620999918, 8.534491278000075 ], [ -83.118153449999909, 8.538153387000079 ], [ -83.102447068999936, 8.548041083000044 ], [ -83.114247199999909, 8.551784572000088 ], [ -83.143422003999945, 8.55023834800005 ], [ -83.157704230999911, 8.555487372000073 ], [ -83.165150519999941, 8.563747463000084 ], [ -83.185047980999911, 8.602687893000052 ], [ -83.181752081999946, 8.607855536000045 ], [ -83.180165167999917, 8.611354885000083 ], [ -83.178212042999917, 8.616970119000086 ], [ -83.171376105999911, 8.616970119000086 ], [ -83.161732550999943, 8.600734768000052 ], [ -83.158802863999938, 8.592800197000088 ], [ -83.157704230999911, 8.579413153000075 ], [ -83.153309699999909, 8.577175197000088 ], [ -83.123565232999908, 8.589016018000052 ], [ -83.123565232999908, 8.596462307000081 ], [ -83.137237107999908, 8.60219961100006 ], [ -83.151722785999937, 8.612860419000071 ], [ -83.164051886999914, 8.62563711100006 ], [ -83.171376105999911, 8.637477932000081 ], [ -83.178212042999917, 8.637477932000081 ], [ -83.18578040299991, 8.625189520000049 ], [ -83.203968878999945, 8.62445709800005 ], [ -83.224761522999927, 8.626857815000051 ], [ -83.240264451999906, 8.623806057000081 ], [ -83.247588670999903, 8.637233791000085 ], [ -83.259307420999903, 8.651312567000048 ], [ -83.273182745999918, 8.658474026000079 ], [ -83.287383592999902, 8.651068427000041 ], [ -83.319081183999913, 8.669582424000055 ], [ -83.32835852799991, 8.684597072000088 ], [ -83.322173631999931, 8.70571523600006 ], [ -83.329009568999936, 8.706203518000052 ], [ -83.335804816999939, 8.70571523600006 ], [ -83.331695115999935, 8.722072658000059 ], [ -83.345855272999927, 8.72992584800005 ], [ -83.366932745999918, 8.734279690000051 ], [ -83.383656378999945, 8.739813544000071 ], [ -83.389515753999945, 8.728094794000071 ], [ -83.394805467999902, 8.728949286000045 ], [ -83.4013972649999, 8.733710028000075 ], [ -83.411529100999928, 8.733669338000084 ], [ -83.416289842999902, 8.728298244000086 ], [ -83.417510545999903, 8.721258856000077 ], [ -83.421660936999899, 8.71515534100007 ], [ -83.435170050999943, 8.712551174000055 ], [ -83.468251105999911, 8.717474677000041 ], [ -83.481719529999907, 8.712591864000046 ], [ -83.486683722999942, 8.692694403000075 ], [ -83.479115363999938, 8.698431708000044 ], [ -83.479237433999913, 8.698879299000055 ], [ -83.473011847999942, 8.698879299000055 ], [ -83.437896287999934, 8.646429755000042 ], [ -83.433257615999935, 8.630519924000055 ], [ -83.41274980399993, 8.598456122000073 ], [ -83.404774542999917, 8.589016018000052 ], [ -83.391590949999909, 8.582302151000079 ], [ -83.354237433999913, 8.571071682000081 ], [ -83.339222785999937, 8.569159247000073 ], [ -83.325469529999907, 8.560980536000045 ], [ -83.312367316999939, 8.545070705000057 ], [ -83.299712693999936, 8.534369208000044 ], [ -83.287383592999902, 8.541815497000073 ], [ -83.286854620999918, 8.517157294000071 ], [ -83.288848436999899, 8.507025458000044 ], [ -83.294911261999914, 8.500270901000079 ], [ -83.294911261999914, 8.493434963000084 ], [ -83.279815232999908, 8.472927151000079 ], [ -83.273711717999902, 8.437933661000045 ], [ -83.276356574999909, 8.401556708000044 ], [ -83.287383592999902, 8.376735744000086 ], [ -83.309844529999907, 8.375921942000048 ], [ -83.346424933999913, 8.387600002000056 ], [ -83.380889451999906, 8.404120184000078 ], [ -83.397246873999904, 8.417669989000046 ], [ -83.391102667999917, 8.417669989000046 ], [ -83.386626756999931, 8.414129950000074 ], [ -83.382964647999927, 8.412502346000053 ], [ -83.36937415299991, 8.410915432000081 ], [ -83.388661261999914, 8.419501044000071 ], [ -83.396473761999914, 8.424587307000081 ], [ -83.404774542999917, 8.43195221600007 ], [ -83.404774542999917, 8.417669989000046 ], [ -83.462432420999903, 8.442694403000075 ], [ -83.482940232999908, 8.44562409100007 ], [ -83.544178839999915, 8.438259182000081 ], [ -83.561146613999938, 8.438177802000041 ], [ -83.575591600999928, 8.444973049000055 ], [ -83.5888972649999, 8.458563544000071 ], [ -83.613270636999914, 8.490016994000086 ], [ -83.7002253899999, 8.570339260000083 ], [ -83.705799933999913, 8.579413153000075 ], [ -83.710113084999932, 8.580511786000045 ], [ -83.730580206999946, 8.588812567000048 ], [ -83.736805792999917, 8.592718817000048 ], [ -83.739898240999935, 8.623806057000081 ], [ -83.709462042999917, 8.670355536000045 ], [ -83.702381964999915, 8.678412177000041 ], [ -83.686675584999932, 8.687689520000049 ], [ -83.675933397999927, 8.691799221000053 ], [ -83.671009894999941, 8.68891022300005 ], [ -83.667836066999939, 8.682928778000075 ], [ -83.660918748999904, 8.689846096000053 ], [ -83.636586066999939, 8.726752020000049 ], [ -83.630034959999932, 8.733669338000084 ], [ -83.642567511999914, 8.74953847900008 ], [ -83.627471482999908, 8.767401434000078 ], [ -83.600005662999934, 8.782049872000073 ], [ -83.575428839999915, 8.788275458000044 ], [ -83.575428839999915, 8.79446035400008 ], [ -83.597075975999928, 8.797023830000057 ], [ -83.607940232999908, 8.796047268000052 ], [ -83.615386522999927, 8.790106512000079 ], [ -83.626942511999914, 8.777736721000053 ], [ -83.638661261999914, 8.772284247000073 ], [ -83.642567511999914, 8.78188711100006 ], [ -83.637806769999941, 8.798854885000083 ], [ -83.623809373999904, 8.815578518000052 ], [ -83.599029100999928, 8.827541408000059 ], [ -83.587635870999918, 8.835353908000059 ], [ -83.582875128999945, 8.846625067000048 ], [ -83.589100714999915, 8.856756903000075 ], [ -83.602080857999908, 8.863796291000085 ], [ -83.613880988999938, 8.873236395000049 ], [ -83.616363084999932, 8.890692450000074 ], [ -83.597035285999937, 8.880886135000083 ], [ -83.587676561999899, 8.877997137000079 ], [ -83.575428839999915, 8.877630927000041 ], [ -83.581410285999937, 8.884955145000049 ], [ -83.588978644999941, 8.890529690000051 ], [ -83.603382941999939, 8.898138739000046 ], [ -83.609486456999946, 8.903143622000073 ], [ -83.612945115999935, 8.907782294000071 ], [ -83.618275519999941, 8.910956122000073 ], [ -83.630034959999932, 8.911769924000055 ], [ -83.617909308999913, 8.919012762000079 ], [ -83.619618292999917, 8.924261786000045 ], [ -83.626576300999943, 8.928249416000085 ], [ -83.630034959999932, 8.931667385000083 ], [ -83.625518357999908, 8.942653713000084 ], [ -83.620391404999907, 8.950832424000055 ], [ -83.613392706999946, 8.958075262000079 ], [ -83.603382941999939, 8.966376044000071 ], [ -83.629872199999909, 9.035345770000049 ], [ -83.634755011999914, 9.044094143000052 ], [ -83.651153123999904, 9.06195709800005 ], [ -83.657989061999899, 9.055202541000085 ], [ -83.680449998999904, 9.084133205000057 ], [ -83.700917120999918, 9.117865302000041 ], [ -83.72720292899993, 9.144313869000086 ], [ -83.767201300999943, 9.151393947000088 ], [ -83.764881964999915, 9.17719147300005 ], [ -83.786895311999899, 9.199245510000083 ], [ -83.817128058999913, 9.214504299000055 ], [ -83.839507615999935, 9.220282294000071 ], [ -83.918080206999946, 9.294745184000078 ], [ -83.995106574999909, 9.330226955000057 ], [ -84.007435675999943, 9.339748440000051 ], [ -84.103627081999946, 9.37726471600007 ], [ -84.109852667999917, 9.37726471600007 ], [ -84.116322394999941, 9.37258535400008 ], [ -84.121937628999945, 9.372626044000071 ], [ -84.126616990999935, 9.376898505000042 ], [ -84.130360480999911, 9.384711005000042 ], [ -84.144073045999903, 9.378851630000042 ], [ -84.152251756999931, 9.385321356000077 ], [ -84.161529100999928, 9.394720770000049 ], [ -84.178700324999909, 9.397772528000075 ], [ -84.167958136999914, 9.416205145000049 ], [ -84.182240363999938, 9.442206122000073 ], [ -84.208363410999937, 9.464992580000057 ], [ -84.233387824999909, 9.473456122000073 ], [ -84.233387824999909, 9.466701565000051 ], [ -84.224598761999914, 9.464992580000057 ], [ -84.218658006999931, 9.462551174000055 ], [ -84.205433722999942, 9.453029690000051 ], [ -84.231434699999909, 9.457546291000085 ], [ -84.272694464999915, 9.481594143000052 ], [ -84.298858201999906, 9.487127997000073 ], [ -84.324208136999914, 9.489081122000073 ], [ -84.457915818999936, 9.52602773600006 ], [ -84.483509894999941, 9.528102932000081 ], [ -84.495472785999937, 9.52602773600006 ], [ -84.508290167999917, 9.521999416000085 ], [ -84.521595831999946, 9.519313869000086 ], [ -84.535023566999939, 9.521307684000078 ], [ -84.546742316999939, 9.531073309000078 ], [ -84.550689256999931, 9.542873440000051 ], [ -84.555409308999913, 9.552394924000055 ], [ -84.569121873999904, 9.555446682000081 ], [ -84.566558397999927, 9.55141836100006 ], [ -84.56509355399993, 9.548407294000071 ], [ -84.562977667999917, 9.541164455000057 ], [ -84.579497850999928, 9.554348049000055 ], [ -84.616566535999937, 9.578070380000042 ], [ -84.623768683999913, 9.592962958000044 ], [ -84.627308722999942, 9.606716213000084 ], [ -84.636097785999937, 9.613348700000074 ], [ -84.647206183999913, 9.617702541000085 ], [ -84.657948370999918, 9.624335028000075 ], [ -84.661366339999915, 9.634466864000046 ], [ -84.659942186999899, 9.644924221000053 ], [ -84.662709113999938, 9.651678778000075 ], [ -84.67837480399993, 9.65102773600006 ], [ -84.674427863999938, 9.662380276000079 ], [ -84.675526495999918, 9.67328522300005 ], [ -84.678089972999942, 9.683539130000042 ], [ -84.67837480399993, 9.692572333000044 ], [ -84.672474738999938, 9.703802802000041 ], [ -84.655262824999909, 9.720770575000074 ], [ -84.648467576999906, 9.737697658000059 ], [ -84.641468878999945, 9.746120510000083 ], [ -84.634429490999935, 9.757025458000044 ], [ -84.631214972999942, 9.771429755000042 ], [ -84.634551561999899, 9.783392645000049 ], [ -84.642364061999899, 9.793768622000073 ], [ -84.657948370999918, 9.809271552000041 ], [ -84.698394334999932, 9.868841864000046 ], [ -84.709706183999913, 9.87759023600006 ], [ -84.725941535999937, 9.884466864000046 ], [ -84.723784959999932, 9.899603583000044 ], [ -84.709706183999913, 9.922552802000041 ], [ -84.734283006999931, 9.942572333000044 ], [ -84.738799607999908, 9.952297268000052 ], [ -84.733631964999915, 9.966945705000057 ], [ -84.762318488999938, 9.975653387000079 ], [ -84.850941535999937, 9.966945705000057 ], [ -84.850941535999937, 9.974391994000086 ], [ -84.838653123999904, 9.97915273600006 ], [ -84.82290605399993, 9.980861721000053 ], [ -84.788238084999932, 9.980617580000057 ], [ -84.788238084999932, 9.987453518000052 ], [ -84.820098436999899, 9.988959052000041 ], [ -84.848540818999936, 9.993963934000078 ], [ -84.874256964999915, 10.002630927000041 ], [ -84.898101365999935, 10.015326239000046 ], [ -84.928252732999908, 10.040106512000079 ], [ -84.932850714999915, 10.045477606000077 ], [ -84.939320441999939, 10.046942450000074 ], [ -84.952015753999945, 10.055446682000081 ], [ -84.960967576999906, 10.064886786000045 ], [ -84.956166144999941, 10.069362697000088 ], [ -84.97288977799991, 10.077948309000078 ], [ -85.01390540299991, 10.115993557000081 ], [ -85.035755988999938, 10.126735744000086 ], [ -85.046050584999932, 10.136135158000059 ], [ -85.052357550999943, 10.138251044000071 ], [ -85.057362433999913, 10.136013088000084 ], [ -85.061675584999932, 10.13226959800005 ], [ -85.067372199999909, 10.131415106000077 ], [ -85.076201951999906, 10.138251044000071 ], [ -85.070301886999914, 10.148871161000045 ], [ -85.068348761999914, 10.155666408000059 ], [ -85.068565921124971, 10.155815093516726 ], [ -85.068393723991164, 10.155866197267187 ], [ -85.048369107248504, 10.161808987494737 ], [ -85.040152553897201, 10.161653957863848 ], [ -85.037077805995921, 10.161137193027002 ], [ -85.033873867784735, 10.161033840239497 ], [ -85.027621019194669, 10.161653957863848 ], [ -85.021962449807177, 10.162739163481604 ], [ -85.019197761167732, 10.162790839425668 ], [ -85.016562262838136, 10.162170721801374 ], [ -85.014366014080281, 10.161137193027002 ], [ -85.010593635088185, 10.158036606704002 ], [ -85.008500739117778, 10.156589666779666 ], [ -85.006175300050018, 10.155607814848736 ], [ -85.003513964198078, 10.154987698123762 ], [ -85.001085171443492, 10.155142726855331 ], [ -84.999483201888268, 10.155452786117166 ], [ -84.994367234859965, 10.157003078829007 ], [ -84.990388150292858, 10.157623196453358 ], [ -84.987158372760689, 10.157468166822412 ], [ -84.984212816068577, 10.156848049198118 ], [ -84.979251878671221, 10.154936021280321 ], [ -84.970053474288363, 10.149975083883021 ], [ -84.968038092683798, 10.148528143958686 ], [ -84.960570848166071, 10.142120265737674 ], [ -84.948375210247718, 10.126927395183145 ], [ -84.944706184043127, 10.123310044922619 ], [ -84.93685136589778, 10.117367254695012 ], [ -84.927575446249818, 10.112457994141096 ], [ -84.925043300707728, 10.111631170941791 ], [ -84.922330288012347, 10.11101105421676 ], [ -84.919927333679482, 10.111217759791771 ], [ -84.918351203445241, 10.112768053402931 ], [ -84.918867967382766, 10.116592109238411 ], [ -84.922640347274182, 10.127289130389045 ], [ -84.923699713570898, 10.133025214142322 ], [ -84.923622199205113, 10.136125800465322 ], [ -84.922795376005809, 10.142223619424499 ], [ -84.920108201732091, 10.14666779198501 ], [ -84.915405645853866, 10.152352199794166 ], [ -84.897344732973011, 10.16806183518554 ], [ -84.892978074778284, 10.170904039090146 ], [ -84.87380611785801, 10.179120592441393 ], [ -84.8717390612087, 10.181756089871612 ], [ -84.870085414810035, 10.185166734557129 ], [ -84.869542813350165, 10.192401435078125 ], [ -84.870240445340244, 10.196173814070278 ], [ -84.871635708421195, 10.199067694818268 ], [ -84.87481380910998, 10.202685045078738 ], [ -84.876183233769211, 10.204752101728104 ], [ -84.877139248177741, 10.206922512064239 ], [ -84.877940232955382, 10.209402980762945 ], [ -84.877914395432981, 10.212090155036606 ], [ -84.876984219446172, 10.215500799722122 ], [ -84.870886399587675, 10.228109848790496 ], [ -84.869878710134344, 10.231107083225311 ], [ -84.867630785432368, 10.25033071519033 ], [ -84.862954067975863, 10.263559881883054 ], [ -84.862488979982402, 10.266247057056034 ], [ -84.862850715188358, 10.26888255538563 ], [ -84.863600023122558, 10.27151805281585 ], [ -84.864917771837668, 10.273481757577031 ], [ -84.87228166356789, 10.280199693261238 ], [ -84.873728604391545, 10.282163398022362 ], [ -84.874891324375085, 10.284333808358554 ], [ -84.875433925835011, 10.28696930578883 ], [ -84.875433925835011, 10.289914863380204 ], [ -84.87481380910998, 10.292860419172996 ], [ -84.872979295558025, 10.296271063858512 ], [ -84.870240445340244, 10.300301825269003 ], [ -84.865822110302133, 10.304797675572274 ], [ -84.859879320074526, 10.308776760139381 ], [ -84.850810106001575, 10.313427639174222 ], [ -84.847089402953543, 10.316528225497223 ], [ -84.838433600929932, 10.325674953935959 ], [ -84.832516649124045, 10.329705715346449 ], [ -84.829183518804314, 10.330790920064885 ], [ -84.824920214296412, 10.33166942010763 ], [ -84.817401292935301, 10.331979478470146 ], [ -84.81238867869456, 10.33166942010763 ], [ -84.806678433363004, 10.329809068133954 ], [ -84.802260098324837, 10.32784536427215 ], [ -84.786627977299304, 10.315339667091962 ], [ -84.764252082167843, 10.280096340473733 ], [ -84.757844203946831, 10.272448227903396 ], [ -84.756035528816597, 10.270897935191556 ], [ -84.74955013712912, 10.266712144150119 ], [ -84.743917406163348, 10.26635040894422 ], [ -84.735726691233822, 10.266712144150119 ], [ -84.716683926422036, 10.270071112891515 ], [ -84.702989671735963, 10.273998521514557 ], [ -84.696452603205046, 10.277874254193478 ], [ -84.694153001659686, 10.278907782068472 ], [ -84.69154334175181, 10.279837958055282 ], [ -84.683921067603194, 10.278752753336903 ], [ -84.666066861196668, 10.267280584931029 ], [ -84.660511643697362, 10.251777655114665 ], [ -84.656480882286871, 10.246144924148894 ], [ -84.65046057769348, 10.241494045114052 ], [ -84.648884446559919, 10.239788722771323 ], [ -84.648496873831618, 10.236068019723291 ], [ -84.649633755393495, 10.231003730437806 ], [ -84.660201586234223, 10.211883450360915 ], [ -84.663198818870399, 10.20449372020903 ], [ -84.668960741045339, 10.182066148234128 ], [ -84.668960741045339, 10.178397122029537 ], [ -84.668159756267698, 10.174314682876286 ], [ -84.662604539667768, 10.164289456193444 ], [ -84.661519334949332, 10.158708401171737 ], [ -84.661131761321712, 10.154936021280321 ], [ -84.664929978735529, 10.129769599087695 ], [ -84.660434130230897, 10.113801581277926 ], [ -84.649375372975044, 10.091218980571455 ], [ -84.643458422068534, 10.082278957707729 ], [ -84.627102830631088, 10.062228502543348 ], [ -84.619041306910788, 10.049206041425634 ], [ -84.602685716372719, 10.029775702086965 ], [ -84.596432867782596, 10.020163886554087 ], [ -84.595812751057622, 10.017786769743623 ], [ -84.594443326398391, 10.014686184319942 ], [ -84.593513150411525, 10.013239244395606 ], [ -84.591394416019455, 10.012619126771256 ], [ -84.58806128569978, 10.01251577398375 ], [ -84.580335659662921, 10.014634508375821 ], [ -84.572455003995231, 10.020680650491613 ], [ -84.569974535296524, 10.021714179265928 ], [ -84.562791510719649, 10.018303534580468 ], [ -84.55010494728549, 9.997736314579242 ], [ -84.550880092742091, 9.990294908483236 ], [ -84.551758591885516, 9.988124498147045 ], [ -84.55506588378347, 9.985127265510869 ], [ -84.560000982759107, 9.982543443125394 ], [ -84.575710619049801, 9.976342271378712 ], [ -84.624906581873233, 9.944612942233505 ], [ -84.635991176651487, 9.941253974391373 ], [ -84.643690965165888, 9.933864244239487 ], [ -84.662191127618428, 9.905080470887015 ], [ -84.669244960986134, 9.901979885463334 ], [ -84.670846931440735, 9.900481268695557 ], [ -84.672552252884145, 9.898259182415302 ], [ -84.67304317929927, 9.895520331298258 ], [ -84.672965664034166, 9.889629217914035 ], [ -84.674412603958501, 9.884358222154219 ], [ -84.671079475437409, 9.880637519106187 ], [ -84.664206509222993, 9.875883287283841 ], [ -84.643303392437588, 9.86761505798853 ], [ -84.626766933846909, 9.863170885428019 ], [ -84.613744472729195, 9.862447415016163 ], [ -84.601781378807573, 9.860070299105018 ], [ -84.592789679999726, 9.853145656946481 ], [ -84.57105974001496, 9.824516913224954 ], [ -84.579973923557702, 9.817333889547342 ], [ -84.570439623289985, 9.813044744819081 ], [ -84.563256598713053, 9.809117336196095 ], [ -84.559277513246627, 9.80612010355992 ], [ -84.555530971776932, 9.802709458874403 ], [ -84.553825650333465, 9.800745754113223 ], [ -84.548063728158525, 9.792787584079747 ], [ -84.543180305126953, 9.78358917879757 ], [ -84.542353481927648, 9.779713446118649 ], [ -84.541810878669082, 9.774184067940382 ], [ -84.543283657914458, 9.765915839544334 ], [ -84.544911464992083, 9.761936754077908 ], [ -84.546901008174984, 9.759404609435137 ], [ -84.548864712036789, 9.758061021398987 ], [ -84.551293504791374, 9.757027493523992 ], [ -84.554032355009156, 9.756355699056257 ], [ -84.557107102910436, 9.755993963850358 ], [ -84.576304898252431, 9.757027493523992 ], [ -84.582247687580718, 9.756304023112136 ], [ -84.585038214641884, 9.755477199912832 ], [ -84.587441168974749, 9.754185288720066 ], [ -84.589379035314209, 9.752634996008226 ], [ -84.59072262155172, 9.75061961530298 ], [ -84.59149776880696, 9.748242499391836 ], [ -84.591626960016185, 9.745503648274735 ], [ -84.59131690075435, 9.742868149945139 ], [ -84.583642950661613, 9.717650050909128 ], [ -84.581214158806347, 9.705609443520984 ], [ -84.581937629218203, 9.68628245696982 ], [ -84.581627569956368, 9.68318187154614 ], [ -84.579250454045223, 9.677290758161973 ], [ -84.557055426966372, 9.638688462802293 ], [ -84.556306118132852, 9.636414700577973 ], [ -84.54971737275855, 9.603186753765669 ], [ -84.547004360962489, 9.595693670826222 ], [ -84.542586025924322, 9.58639191275654 ], [ -84.536384854177641, 9.578072008416427 ], [ -84.529253506444149, 9.571457423721142 ], [ -84.526101244177084, 9.569287014284271 ], [ -84.515817634176472, 9.568046779934946 ], [ -84.484940964853649, 9.573059394175687 ], [ -84.477835456441142, 9.57021719027108 ], [ -84.475354986843172, 9.569855455065181 ], [ -84.471324226331944, 9.569907131009302 ], [ -84.455743781250476, 9.573937893319112 ], [ -84.452694871770916, 9.573989570162496 ], [ -84.449645962291299, 9.573679510900718 ], [ -84.447268846380155, 9.572645982126346 ], [ -84.445072597622243, 9.571199042202011 ], [ -84.440344204221617, 9.565876370498074 ], [ -84.438432176303877, 9.564171047256025 ], [ -84.436210090023621, 9.5629308129067 ], [ -84.433781298168356, 9.562103989707339 ], [ -84.430861578998645, 9.561845608188264 ], [ -84.428148566303264, 9.562207343394164 ], [ -84.425047979980263, 9.563550930530994 ], [ -84.422334968184202, 9.566031399229701 ], [ -84.416262986747427, 9.578123684360548 ], [ -84.414841885244812, 9.580190741009858 ], [ -84.412128871650111, 9.58277456339539 ], [ -84.400837572196167, 9.591766262203237 ], [ -84.397297736301482, 9.595176906888753 ], [ -84.395101488442947, 9.598225816368313 ], [ -84.394171311556761, 9.600757961011084 ], [ -84.393628710096891, 9.606700751238691 ], [ -84.397116869148192, 9.62649282488394 ], [ -84.396961840416566, 9.62902497042603 ], [ -84.394481370818596, 9.630678615925376 ], [ -84.38877112458772, 9.631815497487196 ], [ -84.377092250606836, 9.631608791912186 ], [ -84.350840623695831, 9.636569729309542 ], [ -84.308130051660555, 9.638791816489118 ], [ -84.293298916311926, 9.637448228452968 ], [ -84.288053758074454, 9.632693997529941 ], [ -84.284178026294853, 9.62995514641284 ], [ -84.277434252188982, 9.621583564330024 ], [ -84.275858120156101, 9.620084947562248 ], [ -84.265212774949589, 9.618224596487948 ], [ -84.22960771402478, 9.619103094731997 ], [ -84.216585252907066, 9.613522039710347 ], [ -84.201650763871612, 9.612281806260341 ], [ -84.156898972709428, 9.616260890827448 ], [ -84.147907273901581, 9.615227362952453 ], [ -84.145504319568659, 9.614400539753092 ], [ -84.142119514204182, 9.61166168953531 ], [ -84.139406500609482, 9.607269192019601 ], [ -84.137287767116732, 9.599414373874254 ], [ -84.136977708754216, 9.594763494839412 ], [ -84.137313604639132, 9.59083608621637 ], [ -84.139225632556872, 9.582464504133554 ], [ -84.139768235815438, 9.576056626811862 ], [ -84.139535691818708, 9.573007717332302 ], [ -84.137830370375298, 9.569338691127655 ], [ -84.134316372002957, 9.565204576030339 ], [ -84.126719937175324, 9.558383287558684 ], [ -84.119071824604987, 9.555644436441582 ], [ -84.114420945570146, 9.554714260454716 ], [ -84.105351732396514, 9.556264553166557 ], [ -84.092303432857136, 9.556522934685688 ], [ -84.083234218784128, 9.555179348448178 ], [ -84.078092414233538, 9.553318997373822 ], [ -84.075663622378272, 9.551872057449486 ], [ -84.073441535198697, 9.548203030345576 ], [ -84.071400316071731, 9.542777004055495 ], [ -84.069359096944765, 9.530271307774626 ], [ -84.069384935366486, 9.524276842502275 ], [ -84.070134243300686, 9.520039373718134 ], [ -84.072795580051945, 9.515440172425997 ], [ -84.074836799178911, 9.510479234129321 ], [ -84.071090256809896, 9.504278062382639 ], [ -84.049360317724449, 9.494511217218871 ], [ -84.03300472718638, 9.463402003899375 ], [ -84.0102412584273, 9.441439520817198 ], [ -83.944715541688879, 9.398186347322053 ], [ -83.92934180398106, 9.393328761812882 ], [ -83.928024055265894, 9.395602524936578 ], [ -83.926318732023844, 9.397359524122749 ], [ -83.92451005689361, 9.398909816834589 ], [ -83.922365484979139, 9.400253403971419 ], [ -83.920117561176482, 9.401286932745734 ], [ -83.917507901268607, 9.402113755945095 ], [ -83.914691534886401, 9.402527167095059 ], [ -83.911590948563401, 9.402527167095059 ], [ -83.908826259923956, 9.40201040315759 ], [ -83.905751512022618, 9.399736640033893 ], [ -83.902418381702944, 9.396222642560872 ], [ -83.895261197346372, 9.38351023980573 ], [ -83.893736742156932, 9.379582831182688 ], [ -83.889550951115496, 9.360255846430164 ], [ -83.88849158391946, 9.357775376832137 ], [ -83.856142137149902, 9.325322577275131 ], [ -83.8495275542532, 9.316589259986358 ], [ -83.845936042414394, 9.31023305950805 ], [ -83.84722795270784, 9.300414537500899 ], [ -83.847098762397934, 9.294316718541722 ], [ -83.845470954420989, 9.28330963812931 ], [ -83.839088914621698, 9.263207506121489 ], [ -83.834231330011846, 9.253492336002466 ], [ -83.831518317316466, 9.249461575491296 ], [ -83.827823451790834, 9.245224106707155 ], [ -83.820950487375057, 9.239074611803858 ], [ -83.771237758815516, 9.216905422247407 ], [ -83.763770515197109, 9.214941718385603 ], [ -83.760979987236624, 9.215355129535567 ], [ -83.758499519437237, 9.216130275891487 ], [ -83.756639166564241, 9.217628891759944 ], [ -83.754933845120831, 9.219489243733619 ], [ -83.746174689410395, 9.231478176076962 ], [ -83.74434017585844, 9.232925116001297 ], [ -83.742040575212343, 9.234165351249942 ], [ -83.739379239360403, 9.235198879124937 ], [ -83.736459520190692, 9.235974026380177 ], [ -83.733203905136122, 9.236439114373638 ], [ -83.730568406806526, 9.236439114373638 ], [ -83.72772620290192, 9.235974026380177 ], [ -83.72503902862826, 9.235198879124937 ], [ -83.715272182565172, 9.230548000989415 ], [ -83.701397060725753, 9.217370510240869 ], [ -83.678633591966673, 9.189620266562031 ], [ -83.675093756971307, 9.183625800390359 ], [ -83.674835374552856, 9.180938626116699 ], [ -83.674292772193667, 9.178354803731168 ], [ -83.666748013310155, 9.152619940757631 ], [ -83.665636970169999, 9.150449530421497 ], [ -83.66300147184046, 9.14662547368664 ], [ -83.656154344047707, 9.138615626809724 ], [ -83.565358853228474, 9.080376288335003 ], [ -83.563059251683114, 9.079342760460008 ], [ -83.552155524058151, 9.080066229972545 ], [ -83.54370642760955, 9.081306464321869 ], [ -83.541122606123338, 9.081358140265934 ], [ -83.537608608650373, 9.081048081903418 ], [ -83.535128139951667, 9.080066229972545 ], [ -83.530890672966166, 9.076965644548864 ], [ -83.526394822662894, 9.071642971046288 ], [ -83.524741177163605, 9.070041002390326 ], [ -83.520348679647839, 9.067457180004851 ], [ -83.517506476642552, 9.06663035680549 ], [ -83.514845139891293, 9.0660619169239 ], [ -83.512235479983417, 9.066320299342351 ], [ -83.509884203393256, 9.066992092011446 ], [ -83.507817145844569, 9.068284003204155 ], [ -83.506008469815015, 9.070092678334447 ], [ -83.495208095876933, 9.085078844213285 ], [ -83.491616584038127, 9.088437812055361 ], [ -83.488464321771005, 9.090504868704727 ], [ -83.486293911434871, 9.091538398378361 ], [ -83.484201016363784, 9.092881985515191 ], [ -83.482288988446044, 9.094638983802042 ], [ -83.480971238831614, 9.098256334062569 ], [ -83.480273606841479, 9.10347565387832 ], [ -83.483141649167749, 9.126419988891371 ], [ -83.482521532442775, 9.130709132720312 ], [ -83.480893723566453, 9.135773423804437 ], [ -83.473219774373092, 9.149726060009641 ], [ -83.471307745555976, 9.155927231756323 ], [ -83.471902024758606, 9.16781281221148 ], [ -83.473116420686267, 9.173393866333868 ], [ -83.474615038353306, 9.177424627744358 ], [ -83.476010301434258, 9.179491685293044 ], [ -83.476733770946737, 9.182127182723264 ], [ -83.477844814986213, 9.184297593958775 ], [ -83.479575974851343, 9.185589504252221 ], [ -83.482133958815155, 9.185641181095605 ], [ -83.48474361782371, 9.1851760931022 ], [ -83.48743079299669, 9.1851760931022 ], [ -83.48970455612033, 9.186002916301561 ], [ -83.491616584038127, 9.187449856225896 ], [ -83.493166876749967, 9.18920685541201 ], [ -83.495027228723586, 9.190860500911356 ], [ -83.497300991847283, 9.191997382473232 ], [ -83.506034309136055, 9.193754380760026 ], [ -83.508178881050526, 9.194994615109408 ], [ -83.509444952922252, 9.196958319870532 ], [ -83.509651659396525, 9.199645494144249 ], [ -83.499833137389373, 9.250081692216327 ], [ -83.498980475768349, 9.252665513702482 ], [ -83.495724859814402, 9.257523098312333 ], [ -83.468362188863921, 9.287960517164095 ], [ -83.466088425740224, 9.291939601731201 ], [ -83.463556281097453, 9.297675686383798 ], [ -83.456838345413303, 9.322015286276439 ], [ -83.453944464665312, 9.32718292924875 ], [ -83.451257290391595, 9.330955308240846 ], [ -83.42939816009698, 9.353692939477583 ], [ -83.403275722596504, 9.34609650285131 ], [ -83.400045945963598, 9.344132798989449 ], [ -83.396402757281408, 9.341032213565768 ], [ -83.395627610925487, 9.338396715236229 ], [ -83.395007494200456, 9.335141099282282 ], [ -83.392371995870917, 9.32738963482376 ], [ -83.390124071168941, 9.32645945883695 ], [ -83.38795366083275, 9.326666165311281 ], [ -83.385705736130774, 9.328009752448111 ], [ -83.383845384157155, 9.329456692372446 ], [ -83.380305549161733, 9.333074041733653 ], [ -83.376584846113758, 9.334831040919767 ], [ -83.371003791092051, 9.336174628056654 ], [ -83.352296923064557, 9.337931627242767 ], [ -83.34805945517968, 9.339326890323719 ], [ -83.346405808781014, 9.341032213565768 ], [ -83.334726935699507, 9.357258612894668 ], [ -83.332143114213352, 9.359739080693998 ], [ -83.328448248687721, 9.36211619750452 ], [ -83.321136033800883, 9.36594025334 ], [ -83.316795214027877, 9.36671539969592 ], [ -83.313462083708202, 9.366560370065031 ], [ -83.30873369030752, 9.364183254153829 ], [ -83.30434119279181, 9.361289374305159 ], [ -83.28584103123859, 9.345373033338831 ], [ -83.283567268114894, 9.344287827721075 ], [ -83.281267665670214, 9.342892563740804 ], [ -83.276151700440607, 9.340618801516484 ], [ -83.257677374611148, 9.334520982557308 ], [ -83.252871466844681, 9.332040513858601 ], [ -83.243337164778325, 9.32568431248103 ], [ -83.227705043752735, 9.317777818391619 ], [ -83.220625372862628, 9.315659084898812 ], [ -83.215328538681092, 9.314728908912002 ], [ -83.211917893995576, 9.314728908912002 ], [ -83.198068609678558, 9.317261054454093 ], [ -83.176571214589842, 9.318811347165934 ], [ -83.170008307637261, 9.318087876754078 ], [ -83.165667486964935, 9.316847642404753 ], [ -83.12660010361185, 9.266773180437895 ], [ -83.119391242411893, 9.259951890167599 ], [ -83.115437995367188, 9.257109687162313 ], [ -83.079626227968049, 9.236955878311107 ], [ -83.077559170419363, 9.235405584699947 ], [ -83.075750495289128, 9.233751939200602 ], [ -83.074277716943072, 9.231788235338797 ], [ -83.071952276975992, 9.227447415565734 ], [ -83.068386603558906, 9.217628891759944 ], [ -83.057482875933943, 9.163885402689175 ], [ -83.056113451274769, 9.160164700540463 ], [ -83.053090380216872, 9.154997057568153 ], [ -83.050299852256387, 9.152516587970126 ], [ -83.047302618720835, 9.150759588783956 ], [ -83.012860276880247, 9.14125112603864 ], [ -83.006607429189501, 9.138357245290649 ], [ -83.002473314092128, 9.135825099748558 ], [ -82.997150642388192, 9.127505195408446 ], [ -82.990897792898807, 9.110245266405911 ], [ -82.985807665191601, 9.102855536253969 ], [ -82.968831957029181, 9.086060696144216 ], [ -82.952657232745082, 9.080996405060034 ], [ -82.949504971377337, 9.078929348410668 ], [ -82.940229050829998, 9.071229559896267 ], [ -82.93952108499991, 9.070641889000072 ] ] ], [ [ [ -85.167397671565254, 10.019403308315987 ], [ -85.144520636999914, 9.999335028000075 ], [ -85.083851691999939, 9.97492096600007 ], [ -85.076201951999906, 9.970648505000042 ], [ -85.069081183999913, 9.973415432000081 ], [ -85.053130662999934, 9.966945705000057 ], [ -85.014515753999945, 9.944973049000055 ], [ -84.996693488999938, 9.939276434000078 ], [ -84.9775691399999, 9.938788153000075 ], [ -84.959584113999938, 9.946478583000044 ], [ -84.947783982999908, 9.937160549000055 ], [ -84.922596808999913, 9.921454169000071 ], [ -84.911122199999909, 9.911688544000071 ], [ -84.911122199999909, 9.905462958000044 ], [ -84.931060350999928, 9.90070221600007 ], [ -84.930165167999917, 9.886297919000071 ], [ -84.918080206999946, 9.869533596000053 ], [ -84.90493730399993, 9.857082424000055 ], [ -84.913075324999909, 9.854315497000073 ], [ -84.920765753999945, 9.848944403000075 ], [ -84.932850714999915, 9.836615302000041 ], [ -84.918080206999946, 9.830023505000042 ], [ -84.90062415299991, 9.828070380000042 ], [ -84.864613410999937, 9.829169012000079 ], [ -84.864613410999937, 9.822943427000041 ], [ -84.878692186999899, 9.813544012000079 ], [ -84.896595831999946, 9.80609772300005 ], [ -84.912017381999931, 9.795843817000048 ], [ -84.91860917899993, 9.778265692000048 ], [ -84.922352667999917, 9.774196682000081 ], [ -84.945912238999938, 9.760891018000052 ], [ -84.950347459999932, 9.753566799000055 ], [ -84.955474412999934, 9.735134182000081 ], [ -84.959584113999938, 9.727362372000073 ], [ -84.990956183999913, 9.742743231000077 ], [ -85.007598436999899, 9.744086005000042 ], [ -85.014800584999932, 9.73078034100007 ], [ -85.010365363999938, 9.722601630000042 ], [ -84.994984503999945, 9.703273830000057 ], [ -84.997425910999937, 9.699408270000049 ], [ -85.029815232999908, 9.683742580000057 ], [ -85.035267706999946, 9.682399807000081 ], [ -85.038929816999939, 9.67727285400008 ], [ -85.062611456999946, 9.665309963000084 ], [ -85.067494269999941, 9.657375393000052 ], [ -85.089344855999911, 9.588568427000041 ], [ -85.098500128999945, 9.571071682000081 ], [ -85.110463019999941, 9.555446682000081 ], [ -85.11782792899993, 9.555446682000081 ], [ -85.145782029999907, 9.612616278000075 ], [ -85.229115363999938, 9.724391994000086 ], [ -85.229295448878645, 9.724822572867236 ], [ -85.229184943430369, 9.724936428273509 ], [ -85.226626960365934, 9.727571925703785 ], [ -85.220735846981711, 9.730259100876765 ], [ -85.218642951011361, 9.730672512026786 ], [ -85.216188320734375, 9.732222804738626 ], [ -85.209754604991019, 9.745400295487229 ], [ -85.206834885821308, 9.747829088241815 ], [ -85.204251065234473, 9.749534410584545 ], [ -85.201848110901608, 9.752169908014821 ], [ -85.199677700565417, 9.756355699056257 ], [ -85.19683549666081, 9.765037340400909 ], [ -85.194665087223996, 9.769378160173915 ], [ -85.192649705619431, 9.772427070552851 ], [ -85.186939460287874, 9.776974595900867 ], [ -85.186009284301008, 9.778834946975223 ], [ -85.186448533872749, 9.781108710098863 ], [ -85.189264899355578, 9.784312649209369 ], [ -85.190660163335849, 9.788446764306741 ], [ -85.190401780917455, 9.794596259209982 ], [ -85.180144009338562, 9.832940172151211 ], [ -85.176345791025426, 9.843223782151824 ], [ -85.173400235232634, 9.849373277055065 ], [ -85.173839483905056, 9.851802069809651 ], [ -85.175725674300395, 9.853714097727391 ], [ -85.190350104074014, 9.857124742412907 ], [ -85.192908088037825, 9.858003241556332 ], [ -85.195000983108855, 9.859450182379987 ], [ -85.196318731824022, 9.861517239029354 ], [ -85.197765672647677, 9.867098293151685 ], [ -85.198644171791102, 9.873041083379292 ], [ -85.200659553395667, 9.877743639257517 ], [ -85.202003139633177, 9.879914048694388 ], [ -85.203088345250933, 9.882291165504853 ], [ -85.205801357946314, 9.886476956546289 ], [ -85.21130489770286, 9.891437893044326 ], [ -85.215568203110081, 9.897329006428492 ], [ -85.217480231027821, 9.898930975983717 ], [ -85.219831509416622, 9.900119534388978 ], [ -85.227531297931023, 9.902755031819254 ], [ -85.23419755677179, 9.906475734867229 ], [ -85.239933641424386, 9.907715969216611 ], [ -85.249390428225638, 9.907612616429105 ], [ -85.25218095618618, 9.908232734053399 ], [ -85.25466142398551, 9.909266261928451 ], [ -85.258976407135492, 9.911746731526421 ], [ -85.261431037412422, 9.912831936244856 ], [ -85.270319383432764, 9.914433904900761 ], [ -85.27336829291238, 9.914537257688266 ], [ -85.276598070444606, 9.914485581744202 ], [ -85.285925666036633, 9.913245348294197 ], [ -85.290163133022133, 9.913917140963292 ], [ -85.294400600907011, 9.916035875355362 ], [ -85.298224656742491, 9.919394843197438 ], [ -85.301583624584566, 9.923942369444774 ], [ -85.303288946927353, 9.929678453198051 ], [ -85.299103155885916, 9.937378240813132 ], [ -85.289930589924779, 9.945749822896005 ], [ -85.265306770091343, 9.957532050563657 ], [ -85.254868129560521, 9.960787664718964 ], [ -85.248072678611209, 9.961459459186699 ], [ -85.246264004380293, 9.959857488732098 ], [ -85.244713710769133, 9.958152167288688 ], [ -85.242827521273057, 9.956498520890023 ], [ -85.240786302146091, 9.955464993015028 ], [ -85.23613542401057, 9.956756904207737 ], [ -85.210323045771929, 9.971484686768861 ], [ -85.205336269952852, 9.973603420261611 ], [ -85.183373785971412, 9.978822740077362 ], [ -85.177508511008966, 9.986987615685905 ], [ -85.167397671565254, 10.019403308315987 ] ] ], [ [ [ -85.131337042999917, 10.098700262000079 ], [ -85.121571417999917, 10.096380927000041 ], [ -85.116037563999896, 10.091701565000051 ], [ -85.107899542999917, 10.089544989000046 ], [ -85.097320115999935, 10.089829820000091 ], [ -85.097320115999935, 10.083644924000055 ], [ -85.109486456999946, 10.079291083000044 ], [ -85.124826626999948, 10.07562897300005 ], [ -85.141835089999915, 10.074164130000042 ], [ -85.158802863999938, 10.076157945000091 ], [ -85.176136847999942, 10.083238023000092 ], [ -85.185292120999918, 10.09243398600006 ], [ -85.199126756999931, 10.117743231000077 ], [ -85.180287238999938, 10.124009507000039 ], [ -85.171864386999914, 10.124579169000071 ], [ -85.139963344999899, 10.119208075000074 ], [ -85.110463019999941, 10.110296942000048 ], [ -85.110463019999941, 10.103461005000042 ], [ -85.145130988999938, 10.103461005000042 ], [ -85.135650193999936, 10.098456122000073 ], [ -85.131337042999917, 10.098700262000079 ] ] ], [ [ [ -87.099029100999928, 5.516017971000053 ], [ -87.117665167999917, 5.51508209800005 ], [ -87.104603644999941, 5.53742096600007 ], [ -87.092518683999913, 5.546698309000078 ], [ -87.078521287999934, 5.555080471000053 ], [ -87.064605272999927, 5.557847398000092 ], [ -87.064605272999927, 5.54759349200009 ], [ -87.065541144999941, 5.53461334800005 ], [ -87.078521287999934, 5.520656643000052 ], [ -87.099029100999928, 5.516017971000053 ] ] ], [ [ [ -83.896617592999917, 8.706491863000053 ], [ -83.883463738999922, 8.712992682000049 ], [ -83.869114045999936, 8.713587405000055 ], [ -83.870305238999947, 8.701776235000068 ], [ -83.878076405999934, 8.698821179000049 ], [ -83.890634796999905, 8.701178567000056 ], [ -83.896617592999917, 8.706491863000053 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CR-H", "NAME_1": "Heredia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -83.859527750999916, 10.721775615000055 ], [ -83.855807047999917, 10.723997701000059 ], [ -83.835343180999956, 10.747613831000081 ], [ -83.768964802999932, 10.772470195000039 ], [ -83.763818115413699, 10.773683167843899 ], [ -83.760799120083334, 10.771487535121651 ], [ -83.749352790099181, 10.768335272854529 ], [ -83.74625220377618, 10.767146715348645 ], [ -83.743849250342635, 10.765648098580868 ], [ -83.741549648797218, 10.763994452182203 ], [ -83.736511197034076, 10.759136868471671 ], [ -83.732738817142661, 10.754641018168456 ], [ -83.729999966025616, 10.749835110401989 ], [ -83.729431525244706, 10.746527818504035 ], [ -83.72927649561376, 10.743013821031013 ], [ -83.732273729149256, 10.722963364967313 ], [ -83.731886156420956, 10.718105780357462 ], [ -83.73100765727753, 10.71459178288444 ], [ -83.72793290937625, 10.71076772704896 ], [ -83.724573940634855, 10.707357083262764 ], [ -83.720646532011813, 10.704153144152258 ], [ -83.711990729088882, 10.698933824336507 ], [ -83.70827002604085, 10.695833238013506 ], [ -83.70578955824152, 10.6929910341089 ], [ -83.703696662271113, 10.689787095897771 ], [ -83.703567471061945, 10.688081773554984 ], [ -83.704575161414539, 10.687151598467494 ], [ -83.709174363605996, 10.688650214335894 ], [ -83.712765876344122, 10.688960272698409 ], [ -83.716615769702003, 10.688856919910904 ], [ -83.72715776212101, 10.686221422480628 ], [ -83.756329108201783, 10.683740952882658 ], [ -83.762142707220164, 10.682552395376717 ], [ -83.772581345952347, 10.679090073847817 ], [ -83.789531215693046, 10.668289699909735 ], [ -83.799556444174527, 10.657644354703166 ], [ -83.803509691219233, 10.65464712206699 ], [ -83.813121506752111, 10.64968618377037 ], [ -83.821570604100089, 10.644260159278929 ], [ -83.825394659935569, 10.641056220168423 ], [ -83.82699663039017, 10.639247545038131 ], [ -83.828650274990196, 10.633356432553285 ], [ -83.829968023705305, 10.624261379159293 ], [ -83.831363287685576, 10.593772284363411 ], [ -83.830691494117161, 10.584367174405543 ], [ -83.836350064403916, 10.541475735216977 ], [ -83.836195034773027, 10.535584621832811 ], [ -83.835239021263817, 10.533207505921666 ], [ -83.833766242018442, 10.53114044837298 ], [ -83.830588142228976, 10.527419745324949 ], [ -83.829192878248705, 10.525301011832198 ], [ -83.828030158265165, 10.522975571865118 ], [ -83.827616747115144, 10.520081692016447 ], [ -83.827720099902649, 10.516774400118436 ], [ -83.828650274990196, 10.50860952450995 ], [ -83.828495246258569, 10.505198878925114 ], [ -83.827875128634275, 10.502201646288938 ], [ -83.823870204746129, 10.492331448337666 ], [ -83.823405117652044, 10.489592597220565 ], [ -83.823430956073764, 10.484631658923888 ], [ -83.829037848617816, 10.463651027772698 ], [ -83.838029548324982, 10.450111802717515 ], [ -83.842060309735473, 10.446029364463584 ], [ -83.843998176074933, 10.444479070852424 ], [ -83.846246100776909, 10.443290514245803 ], [ -83.849010790315731, 10.442567042934684 ], [ -83.85164628774595, 10.442256985471488 ], [ -83.853920050869647, 10.441223455797854 ], [ -83.855935431574892, 10.438846339886652 ], [ -83.863945279351128, 10.423601793388059 ], [ -83.866787482356415, 10.419519355134128 ], [ -83.870275642307035, 10.412336331456515 ], [ -83.871076626185356, 10.408047186728254 ], [ -83.87167090538793, 10.402104397400024 ], [ -83.869422979786691, 10.387531643570469 ], [ -83.868131070392565, 10.383759264578373 ], [ -83.854798550013072, 10.359264635054842 ], [ -83.851749641432775, 10.348412584273319 ], [ -83.849863451037436, 10.343348293189138 ], [ -83.84722795270784, 10.339317531778647 ], [ -83.844127367284159, 10.335493475943167 ], [ -83.842912971356554, 10.333219712819471 ], [ -83.842732103303888, 10.328310452265555 ], [ -83.843610603346633, 10.321230780476128 ], [ -83.84686621840126, 10.306916409065025 ], [ -83.847718879122965, 10.294772447090736 ], [ -83.84722795270784, 10.291981920029571 ], [ -83.848416511113101, 10.286504217795425 ], [ -83.85107784696504, 10.279269517274372 ], [ -83.863402676092619, 10.253534654300836 ], [ -83.866477423993899, 10.248728746534425 ], [ -83.913554654223901, 10.198964342030763 ], [ -83.95052914070726, 10.195140286195226 ], [ -83.969933640724946, 10.170438951096685 ], [ -83.975979783740001, 10.164237779350003 ], [ -83.980785692405789, 10.162584132951338 ], [ -84.002929042641199, 10.160930488351369 ], [ -84.022281866714764, 10.156796373253997 ], [ -84.066413540252654, 10.15338572856848 ], [ -84.071400316071731, 10.151525377494181 ], [ -84.070625169715811, 10.146564439197505 ], [ -84.067059496298725, 10.138554592320588 ], [ -84.044089321964634, 10.104913235257584 ], [ -84.030911831216031, 10.090857245365555 ], [ -84.028302172207475, 10.082847398488639 ], [ -84.02664852580881, 10.058869533801953 ], [ -84.018509487722667, 10.050032863725676 ], [ -84.013677740635217, 10.045795395840855 ], [ -84.01042212558059, 10.042281399267154 ], [ -84.009414436127315, 10.034943345958652 ], [ -84.015512255086492, 10.015099596369282 ], [ -84.02799211294564, 9.982026679187868 ], [ -84.04747412822843, 9.97050283483793 ], [ -84.073906623192102, 9.962182928699178 ], [ -84.084216070715058, 9.960219223937997 ], [ -84.109925096166251, 9.962337958330124 ], [ -84.114550136779371, 9.962027899967609 ], [ -84.15131791858704, 9.945646471007819 ], [ -84.162738410149473, 9.950400701930846 ], [ -84.182401292585553, 9.960219223937997 ], [ -84.199971279950603, 9.957221991301822 ], [ -84.201754116659117, 9.966006985434035 ], [ -84.201857469446622, 9.971381333981356 ], [ -84.201599087028228, 9.974171861042521 ], [ -84.200978970303197, 9.977169094578016 ], [ -84.196018032905897, 9.985075587768165 ], [ -84.177621223240862, 10.004350898375264 ], [ -84.177362839923092, 10.006831366174595 ], [ -84.165787319629089, 10.158398341909958 ], [ -84.164185350073808, 10.295702623077602 ], [ -84.162686734205408, 10.41011424427694 ], [ -84.160516323869217, 10.571138006813555 ], [ -84.157984178327126, 10.784251613820913 ], [ -84.15772972504675, 10.788424645281168 ], [ -84.149019124999882, 10.787172140000038 ], [ -84.137004354999931, 10.789161682000071 ], [ -84.118426676999974, 10.771229960000099 ], [ -84.106928670999935, 10.766914978000031 ], [ -84.095430663999934, 10.775519104000068 ], [ -84.088557698999864, 10.775519104000068 ], [ -84.076439574999966, 10.763814393000075 ], [ -84.051634887999938, 10.779549866000053 ], [ -84.034555826999878, 10.775519104000068 ], [ -84.022696085999968, 10.78722381700004 ], [ -84.00923437599991, 10.789445903000043 ], [ -83.998201456999908, 10.782056173000043 ], [ -83.99362809299987, 10.765002950000095 ], [ -83.933321695999979, 10.718054911000053 ], [ -83.92657792199995, 10.714902649000095 ], [ -83.917276163999929, 10.7134815470001 ], [ -83.907483479999968, 10.715367737000108 ], [ -83.893556681999968, 10.724927877000113 ], [ -83.886864583999852, 10.72714996400012 ], [ -83.859527750999916, 10.721775615000055 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CR-SJ", "NAME_1": "San José" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -84.084216070715058, 9.960219223937997 ], [ -84.073906623192102, 9.962182928699178 ], [ -84.04747412822843, 9.97050283483793 ], [ -84.02799211294564, 9.982026679187868 ], [ -84.015512255086492, 10.015099596369282 ], [ -84.009414436127315, 10.034943345958652 ], [ -84.01042212558059, 10.042281399267154 ], [ -84.013677740635217, 10.045795395840855 ], [ -84.018509487722667, 10.050032863725676 ], [ -84.02664852580881, 10.058869533801953 ], [ -84.028302172207475, 10.082847398488639 ], [ -84.030911831216031, 10.090857245365555 ], [ -84.044089321964634, 10.104913235257584 ], [ -84.067059496298725, 10.138554592320588 ], [ -84.070625169715811, 10.146564439197505 ], [ -84.071400316071731, 10.151525377494181 ], [ -84.066413540252654, 10.15338572856848 ], [ -84.022281866714764, 10.156796373253997 ], [ -84.002929042641199, 10.160930488351369 ], [ -83.980785692405789, 10.162584132951338 ], [ -83.975979783740001, 10.164237779350003 ], [ -83.969933640724946, 10.170438951096685 ], [ -83.95052914070726, 10.195140286195226 ], [ -83.913554654223901, 10.198964342030763 ], [ -83.922546353031748, 10.190127671954485 ], [ -83.929083421562666, 10.181187649090703 ], [ -83.942726000304674, 10.136229153252827 ], [ -83.928644171990925, 10.088686835029421 ], [ -83.926370408867285, 10.084707750462314 ], [ -83.922598028975813, 10.080211900159043 ], [ -83.913864711687097, 10.072563788488026 ], [ -83.905389776816719, 10.06667267510386 ], [ -83.900868089890423, 10.064295559192715 ], [ -83.898826869864138, 10.062900295212444 ], [ -83.878828090643879, 10.040472724136919 ], [ -83.875081550073446, 10.034839993171147 ], [ -83.872394374900466, 10.026054999038934 ], [ -83.870430671038605, 10.000061754546323 ], [ -83.865960660056373, 9.977995916878058 ], [ -83.86820858385903, 9.969882717213636 ], [ -83.871231655816246, 9.96590363174721 ], [ -83.875004034808342, 9.962596339849199 ], [ -83.880585089829992, 9.960632635987338 ], [ -83.892677374960897, 9.959237372007124 ], [ -83.905234748085149, 9.945646471007819 ], [ -83.90849036313972, 9.944612942233505 ], [ -83.912236904609472, 9.943786119034144 ], [ -83.915156622879806, 9.944664618177569 ], [ -83.917507901268607, 9.94585317658283 ], [ -83.926680467229744, 9.947300116507165 ], [ -83.95300961030523, 9.94699005814465 ], [ -83.953965623814497, 9.946473293307804 ], [ -83.999957648426744, 9.930298569923025 ], [ -84.026338467446294, 9.887148749215385 ], [ -84.028069628210744, 9.878983872707522 ], [ -84.026415981812079, 9.877691962414133 ], [ -84.022591925976599, 9.875469876133877 ], [ -84.002618985178003, 9.86683991073329 ], [ -84.03145443357522, 9.820692857389417 ], [ -84.038895839671227, 9.812734687355942 ], [ -84.051272345642246, 9.804363105273069 ], [ -84.06884233300724, 9.788653468982375 ], [ -84.075508591848006, 9.777801418200852 ], [ -84.078609178171007, 9.771341864035776 ], [ -84.079280971739422, 9.766949368318706 ], [ -84.079177618951917, 9.763848781995705 ], [ -84.078712530958512, 9.761058254035163 ], [ -84.077627326240076, 9.758577786235833 ], [ -84.076128710371677, 9.756717434262157 ], [ -84.073932460714502, 9.755580552700337 ], [ -84.071090256809896, 9.755477199912832 ], [ -84.068222215382946, 9.755787258275348 ], [ -84.056052415886256, 9.760438137310189 ], [ -84.047965053744235, 9.762556870802939 ], [ -84.045019497052124, 9.762815253221333 ], [ -84.039050869302173, 9.761988430022029 ], [ -84.033288947127176, 9.760644842885199 ], [ -83.996391975009601, 9.768809719393005 ], [ -83.988149584136011, 9.767672837831185 ], [ -83.985979173799819, 9.758164374186492 ], [ -83.983860440307069, 9.75330679047596 ], [ -83.982129278643299, 9.748242499391836 ], [ -83.975514695746597, 9.736098538316867 ], [ -83.956187710094753, 9.729845688827481 ], [ -83.950761684703991, 9.725091457904455 ], [ -83.95014156797896, 9.722766017937374 ], [ -83.949831508717125, 9.720853990019634 ], [ -83.940917325174382, 9.70607452971575 ], [ -83.918748134718612, 9.677549140580368 ], [ -83.913451301436396, 9.672794907858702 ], [ -83.910557420688406, 9.672071438346165 ], [ -83.898387621191773, 9.66773061857316 ], [ -83.877846238712948, 9.657602037304173 ], [ -83.87283362537147, 9.656465154843033 ], [ -83.8703531557735, 9.657291978042338 ], [ -83.86820858385903, 9.658583889235103 ], [ -83.865263028066295, 9.659979153215318 ], [ -83.861154751390643, 9.660702622727854 ], [ -83.853144903614407, 9.659824124483748 ], [ -83.849062466259795, 9.658377182760773 ], [ -83.846142747989404, 9.656413478898912 ], [ -83.84454077843418, 9.654501450981172 ], [ -83.836970181128947, 9.642150784331193 ], [ -83.830200567702036, 9.627939764808275 ], [ -83.829451259767836, 9.625459296109625 ], [ -83.827513394327696, 9.620808417074784 ], [ -83.823275926442818, 9.612850247041251 ], [ -83.818289150623798, 9.604995428895904 ], [ -83.814956021203386, 9.601274725847929 ], [ -83.811881273302106, 9.598794257149223 ], [ -83.809168259707405, 9.597864081162413 ], [ -83.787205776625285, 9.593316554915077 ], [ -83.782451544802939, 9.593626614176912 ], [ -83.763279588781984, 9.595693670826222 ], [ -83.752014125951121, 9.580190741009858 ], [ -83.749378627621525, 9.578123684360548 ], [ -83.744391852701824, 9.575023098037548 ], [ -83.72925065809136, 9.569958807852686 ], [ -83.724780646209865, 9.567374986366531 ], [ -83.722041795992084, 9.564791164880319 ], [ -83.721034104740113, 9.562310696181669 ], [ -83.718011033682217, 9.551665350975156 ], [ -83.715866461767803, 9.538436184282489 ], [ -83.714161140324336, 9.536885891570648 ], [ -83.712016568409865, 9.536679185096318 ], [ -83.698167284092847, 9.543448798523229 ], [ -83.693180508273826, 9.545309150496905 ], [ -83.690260790003435, 9.545929267221879 ], [ -83.678633591966673, 9.544844062503444 ], [ -83.675248785702877, 9.544947415290949 ], [ -83.672277390589102, 9.545309150496905 ], [ -83.6695127019496, 9.545980943166001 ], [ -83.666954718885165, 9.546962795096931 ], [ -83.664784309448294, 9.54804800071463 ], [ -83.662923956575298, 9.549443263795581 ], [ -83.661011928657558, 9.551045234250125 ], [ -83.659513311889839, 9.553008938111986 ], [ -83.654552375391802, 9.561897284132328 ], [ -83.650573289925376, 9.566341458491479 ], [ -83.638739387212922, 9.569907131009302 ], [ -83.613211228915077, 9.543500474467294 ], [ -83.604529589369065, 9.536369126733803 ], [ -83.594685228040817, 9.531666570855521 ], [ -83.592153083398046, 9.530788071712152 ], [ -83.48686235221578, 9.467587794940755 ], [ -83.453634406302797, 9.377309068059049 ], [ -83.445159471432419, 9.36573354686567 ], [ -83.441645473959454, 9.362322903079473 ], [ -83.42939816009698, 9.353692939477583 ], [ -83.451257290391595, 9.330955308240846 ], [ -83.453944464665312, 9.32718292924875 ], [ -83.456838345413303, 9.322015286276439 ], [ -83.463556281097453, 9.297675686383798 ], [ -83.466088425740224, 9.291939601731201 ], [ -83.468362188863921, 9.287960517164095 ], [ -83.495724859814402, 9.257523098312333 ], [ -83.498980475768349, 9.252665513702482 ], [ -83.499833137389373, 9.250081692216327 ], [ -83.509651659396525, 9.199645494144249 ], [ -83.509444952922252, 9.196958319870532 ], [ -83.508178881050526, 9.194994615109408 ], [ -83.506034309136055, 9.193754380760026 ], [ -83.497300991847283, 9.191997382473232 ], [ -83.495027228723586, 9.190860500911356 ], [ -83.493166876749967, 9.18920685541201 ], [ -83.491616584038127, 9.187449856225896 ], [ -83.48970455612033, 9.186002916301561 ], [ -83.48743079299669, 9.1851760931022 ], [ -83.48474361782371, 9.1851760931022 ], [ -83.482133958815155, 9.185641181095605 ], [ -83.479575974851343, 9.185589504252221 ], [ -83.477844814986213, 9.184297593958775 ], [ -83.476733770946737, 9.182127182723264 ], [ -83.476010301434258, 9.179491685293044 ], [ -83.474615038353306, 9.177424627744358 ], [ -83.473116420686267, 9.173393866333868 ], [ -83.471902024758606, 9.16781281221148 ], [ -83.471307745555976, 9.155927231756323 ], [ -83.473219774373092, 9.149726060009641 ], [ -83.480893723566453, 9.135773423804437 ], [ -83.482521532442775, 9.130709132720312 ], [ -83.483141649167749, 9.126419988891371 ], [ -83.480273606841479, 9.10347565387832 ], [ -83.480971238831614, 9.098256334062569 ], [ -83.482288988446044, 9.094638983802042 ], [ -83.484201016363784, 9.092881985515191 ], [ -83.486293911434871, 9.091538398378361 ], [ -83.488464321771005, 9.090504868704727 ], [ -83.491616584038127, 9.088437812055361 ], [ -83.495208095876933, 9.085078844213285 ], [ -83.506008469815015, 9.070092678334447 ], [ -83.507817145844569, 9.068284003204155 ], [ -83.509884203393256, 9.066992092011446 ], [ -83.512235479983417, 9.066320299342351 ], [ -83.514845139891293, 9.0660619169239 ], [ -83.517506476642552, 9.06663035680549 ], [ -83.520348679647839, 9.067457180004851 ], [ -83.524741177163605, 9.070041002390326 ], [ -83.526394822662894, 9.071642971046288 ], [ -83.530890672966166, 9.076965644548864 ], [ -83.535128139951667, 9.080066229972545 ], [ -83.537608608650373, 9.081048081903418 ], [ -83.541122606123338, 9.081358140265934 ], [ -83.54370642760955, 9.081306464321869 ], [ -83.552155524058151, 9.080066229972545 ], [ -83.563059251683114, 9.079342760460008 ], [ -83.565358853228474, 9.080376288335003 ], [ -83.656154344047707, 9.138615626809724 ], [ -83.66300147184046, 9.14662547368664 ], [ -83.665636970169999, 9.150449530421497 ], [ -83.666748013310155, 9.152619940757631 ], [ -83.674292772193667, 9.178354803731168 ], [ -83.674835374552856, 9.180938626116699 ], [ -83.675093756971307, 9.183625800390359 ], [ -83.678633591966673, 9.189620266562031 ], [ -83.701397060725753, 9.217370510240869 ], [ -83.715272182565172, 9.230548000989415 ], [ -83.72503902862826, 9.235198879124937 ], [ -83.72772620290192, 9.235974026380177 ], [ -83.730568406806526, 9.236439114373638 ], [ -83.733203905136122, 9.236439114373638 ], [ -83.736459520190692, 9.235974026380177 ], [ -83.739379239360403, 9.235198879124937 ], [ -83.742040575212343, 9.234165351249942 ], [ -83.74434017585844, 9.232925116001297 ], [ -83.746174689410395, 9.231478176076962 ], [ -83.754933845120831, 9.219489243733619 ], [ -83.756639166564241, 9.217628891759944 ], [ -83.758499519437237, 9.216130275891487 ], [ -83.760979987236624, 9.215355129535567 ], [ -83.763770515197109, 9.214941718385603 ], [ -83.771237758815516, 9.216905422247407 ], [ -83.820950487375057, 9.239074611803858 ], [ -83.827823451790834, 9.245224106707155 ], [ -83.831518317316466, 9.249461575491296 ], [ -83.834231330011846, 9.253492336002466 ], [ -83.839088914621698, 9.263207506121489 ], [ -83.845470954420989, 9.28330963812931 ], [ -83.847098762397934, 9.294316718541722 ], [ -83.84722795270784, 9.300414537500899 ], [ -83.845936042414394, 9.31023305950805 ], [ -83.8495275542532, 9.316589259986358 ], [ -83.856142137149902, 9.325322577275131 ], [ -83.88849158391946, 9.357775376832137 ], [ -83.889550951115496, 9.360255846430164 ], [ -83.893736742156932, 9.379582831182688 ], [ -83.895261197346372, 9.38351023980573 ], [ -83.902418381702944, 9.396222642560872 ], [ -83.905751512022618, 9.399736640033893 ], [ -83.908826259923956, 9.40201040315759 ], [ -83.911590948563401, 9.402527167095059 ], [ -83.914691534886401, 9.402527167095059 ], [ -83.917507901268607, 9.402113755945095 ], [ -83.920117561176482, 9.401286932745734 ], [ -83.922365484979139, 9.400253403971419 ], [ -83.92451005689361, 9.398909816834589 ], [ -83.926318732023844, 9.397359524122749 ], [ -83.928024055265894, 9.395602524936578 ], [ -83.92934180398106, 9.393328761812882 ], [ -83.944715541688879, 9.398186347322053 ], [ -84.0102412584273, 9.441439520817198 ], [ -84.03300472718638, 9.463402003899375 ], [ -84.049360317724449, 9.494511217218871 ], [ -84.071090256809896, 9.504278062382639 ], [ -84.074836799178911, 9.510479234129321 ], [ -84.072795580051945, 9.515440172425997 ], [ -84.070134243300686, 9.520039373718134 ], [ -84.069384935366486, 9.524276842502275 ], [ -84.069359096944765, 9.530271307774626 ], [ -84.071400316071731, 9.542777004055495 ], [ -84.073441535198697, 9.548203030345576 ], [ -84.075663622378272, 9.551872057449486 ], [ -84.078092414233538, 9.553318997373822 ], [ -84.083234218784128, 9.555179348448178 ], [ -84.092303432857136, 9.556522934685688 ], [ -84.105351732396514, 9.556264553166557 ], [ -84.114420945570146, 9.554714260454716 ], [ -84.119071824604987, 9.555644436441582 ], [ -84.126719937175324, 9.558383287558684 ], [ -84.134316372002957, 9.565204576030339 ], [ -84.137830370375298, 9.569338691127655 ], [ -84.139535691818708, 9.573007717332302 ], [ -84.139768235815438, 9.576056626811862 ], [ -84.139225632556872, 9.582464504133554 ], [ -84.137313604639132, 9.59083608621637 ], [ -84.136977708754216, 9.594763494839412 ], [ -84.137287767116732, 9.599414373874254 ], [ -84.139406500609482, 9.607269192019601 ], [ -84.142119514204182, 9.61166168953531 ], [ -84.145504319568659, 9.614400539753092 ], [ -84.147907273901581, 9.615227362952453 ], [ -84.156898972709428, 9.616260890827448 ], [ -84.201650763871612, 9.612281806260341 ], [ -84.216585252907066, 9.613522039710347 ], [ -84.22960771402478, 9.619103094731997 ], [ -84.265212774949589, 9.618224596487948 ], [ -84.275858120156101, 9.620084947562248 ], [ -84.277434252188982, 9.621583564330024 ], [ -84.284178026294853, 9.62995514641284 ], [ -84.288053758074454, 9.632693997529941 ], [ -84.293298916311926, 9.637448228452968 ], [ -84.308130051660555, 9.638791816489118 ], [ -84.350840623695831, 9.636569729309542 ], [ -84.377092250606836, 9.631608791912186 ], [ -84.38877112458772, 9.631815497487196 ], [ -84.394481370818596, 9.630678615925376 ], [ -84.396961840416566, 9.62902497042603 ], [ -84.397116869148192, 9.62649282488394 ], [ -84.393628710096891, 9.606700751238691 ], [ -84.394171311556761, 9.600757961011084 ], [ -84.395101488442947, 9.598225816368313 ], [ -84.397297736301482, 9.595176906888753 ], [ -84.400837572196167, 9.591766262203237 ], [ -84.412128871650111, 9.58277456339539 ], [ -84.414841885244812, 9.580190741009858 ], [ -84.416262986747427, 9.578123684360548 ], [ -84.422334968184202, 9.566031399229701 ], [ -84.425047979980263, 9.563550930530994 ], [ -84.428148566303264, 9.562207343394164 ], [ -84.430861578998645, 9.561845608188264 ], [ -84.433781298168356, 9.562103989707339 ], [ -84.436210090023621, 9.5629308129067 ], [ -84.438432176303877, 9.564171047256025 ], [ -84.440344204221617, 9.565876370498074 ], [ -84.445072597622243, 9.571199042202011 ], [ -84.447268846380155, 9.572645982126346 ], [ -84.449645962291299, 9.573679510900718 ], [ -84.452694871770916, 9.573989570162496 ], [ -84.455743781250476, 9.573937893319112 ], [ -84.471324226331944, 9.569907131009302 ], [ -84.475354986843172, 9.569855455065181 ], [ -84.477835456441142, 9.57021719027108 ], [ -84.484940964853649, 9.573059394175687 ], [ -84.515817634176472, 9.568046779934946 ], [ -84.526101244177084, 9.569287014284271 ], [ -84.529253506444149, 9.571457423721142 ], [ -84.536384854177641, 9.578072008416427 ], [ -84.542586025924322, 9.58639191275654 ], [ -84.547004360962489, 9.595693670826222 ], [ -84.54971737275855, 9.603186753765669 ], [ -84.556306118132852, 9.636414700577973 ], [ -84.557055426966372, 9.638688462802293 ], [ -84.579250454045223, 9.677290758161973 ], [ -84.581627569956368, 9.68318187154614 ], [ -84.581937629218203, 9.68628245696982 ], [ -84.581214158806347, 9.705609443520984 ], [ -84.583642950661613, 9.717650050909128 ], [ -84.59131690075435, 9.742868149945139 ], [ -84.591626960016185, 9.745503648274735 ], [ -84.59149776880696, 9.748242499391836 ], [ -84.59072262155172, 9.75061961530298 ], [ -84.589379035314209, 9.752634996008226 ], [ -84.587441168974749, 9.754185288720066 ], [ -84.585038214641884, 9.755477199912832 ], [ -84.582247687580718, 9.756304023112136 ], [ -84.576304898252431, 9.757027493523992 ], [ -84.557107102910436, 9.755993963850358 ], [ -84.554032355009156, 9.756355699056257 ], [ -84.551293504791374, 9.757027493523992 ], [ -84.548864712036789, 9.758061021398987 ], [ -84.546901008174984, 9.759404609435137 ], [ -84.544911464992083, 9.761936754077908 ], [ -84.543283657914458, 9.765915839544334 ], [ -84.541810878669082, 9.774184067940382 ], [ -84.542353481927648, 9.779713446118649 ], [ -84.543180305126953, 9.78358917879757 ], [ -84.548063728158525, 9.792787584079747 ], [ -84.553825650333465, 9.800745754113223 ], [ -84.555530971776932, 9.802709458874403 ], [ -84.559277513246627, 9.80612010355992 ], [ -84.563256598713053, 9.809117336196095 ], [ -84.570439623289985, 9.813044744819081 ], [ -84.579973923557702, 9.817333889547342 ], [ -84.57105974001496, 9.824516913224954 ], [ -84.563773362650522, 9.824723618799965 ], [ -84.562145554673577, 9.82658397077364 ], [ -84.560853645279508, 9.834180406500536 ], [ -84.559199998880842, 9.837952786391952 ], [ -84.540725673950703, 9.860638738986609 ], [ -84.540260585957242, 9.863894354940498 ], [ -84.540544806797357, 9.86647817642671 ], [ -84.537625087627703, 9.869992173899675 ], [ -84.531036343152721, 9.874849758509527 ], [ -84.51382809099357, 9.883738105429188 ], [ -84.502175056333783, 9.895106920148237 ], [ -84.500908982663418, 9.897484036059382 ], [ -84.499927130732488, 9.898930975983717 ], [ -84.49183976859041, 9.903840237437009 ], [ -84.461040616331388, 9.917276108805368 ], [ -84.416573046009262, 9.920945135909278 ], [ -84.392155930851516, 9.925647690888184 ], [ -84.37275143083383, 9.920118312709974 ], [ -84.352959357188581, 9.916966051342172 ], [ -84.349135301353044, 9.915674140149463 ], [ -84.344329392687314, 9.914537257688266 ], [ -84.332340461243291, 9.913141995506692 ], [ -84.327069464584099, 9.911540025052091 ], [ -84.309241095699974, 9.914020493750797 ], [ -84.242449307089828, 9.932520657102657 ], [ -84.214673224989326, 9.941460679966383 ], [ -84.199971279950603, 9.957221991301822 ], [ -84.182401292585553, 9.960219223937997 ], [ -84.162738410149473, 9.950400701930846 ], [ -84.15131791858704, 9.945646471007819 ], [ -84.114550136779371, 9.962027899967609 ], [ -84.109925096166251, 9.962337958330124 ], [ -84.084216070715058, 9.960219223937997 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CR-C", "NAME_1": "Cartago" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -83.912236904609472, 9.943786119034144 ], [ -83.90849036313972, 9.944612942233505 ], [ -83.905234748085149, 9.945646471007819 ], [ -83.892677374960897, 9.959237372007124 ], [ -83.880585089829992, 9.960632635987338 ], [ -83.875004034808342, 9.962596339849199 ], [ -83.871231655816246, 9.96590363174721 ], [ -83.86820858385903, 9.969882717213636 ], [ -83.865960660056373, 9.977995916878058 ], [ -83.870430671038605, 10.000061754546323 ], [ -83.872394374900466, 10.026054999038934 ], [ -83.875081550073446, 10.034839993171147 ], [ -83.878828090643879, 10.040472724136919 ], [ -83.898826869864138, 10.062900295212444 ], [ -83.900868089890423, 10.064295559192715 ], [ -83.905389776816719, 10.06667267510386 ], [ -83.913864711687097, 10.072563788488026 ], [ -83.922598028975813, 10.080211900159043 ], [ -83.926370408867285, 10.084707750462314 ], [ -83.928644171990925, 10.088686835029421 ], [ -83.942726000304674, 10.136229153252827 ], [ -83.817462328323757, 10.080418605734053 ], [ -83.773563198782597, 10.059954739419652 ], [ -83.713256801859927, 10.031739406848146 ], [ -83.615226609620322, 9.986574205435204 ], [ -83.589052497075045, 9.977169094578016 ], [ -83.444901089014024, 9.976032213016197 ], [ -83.338990241106728, 9.973603420261611 ], [ -83.318913946621308, 9.969624334795185 ], [ -83.321291063431829, 9.965748603015584 ], [ -83.333641730081752, 9.947920234131459 ], [ -83.34154822507054, 9.931590481115791 ], [ -83.344855516069174, 9.913917140963292 ], [ -83.343382737723175, 9.891902981037731 ], [ -83.331833054951517, 9.856452947945172 ], [ -83.329249234364681, 9.838262843855148 ], [ -83.335915493205448, 9.821002915751933 ], [ -83.378548549975562, 9.7683446313996 ], [ -83.40875342483065, 9.732119451951121 ], [ -83.416634081397717, 9.719717109357077 ], [ -83.439113329316683, 9.663286445113329 ], [ -83.496990932585447, 9.594556790163722 ], [ -83.51091773126825, 9.566444810379664 ], [ -83.514302538431366, 9.535852362796277 ], [ -83.512132128095232, 9.526395575095705 ], [ -83.510065069647226, 9.514044908445783 ], [ -83.50401892843081, 9.500505683390543 ], [ -83.502158575557814, 9.497766832273498 ], [ -83.498954637346628, 9.494356186688663 ], [ -83.496835903853878, 9.491462306839992 ], [ -83.490428025632866, 9.478284816990708 ], [ -83.48686235221578, 9.467587794940755 ], [ -83.592153083398046, 9.530788071712152 ], [ -83.594685228040817, 9.531666570855521 ], [ -83.604529589369065, 9.536369126733803 ], [ -83.613211228915077, 9.543500474467294 ], [ -83.638739387212922, 9.569907131009302 ], [ -83.650573289925376, 9.566341458491479 ], [ -83.654552375391802, 9.561897284132328 ], [ -83.659513311889839, 9.553008938111986 ], [ -83.661011928657558, 9.551045234250125 ], [ -83.662923956575298, 9.549443263795581 ], [ -83.664784309448294, 9.54804800071463 ], [ -83.666954718885165, 9.546962795096931 ], [ -83.6695127019496, 9.545980943166001 ], [ -83.672277390589102, 9.545309150496905 ], [ -83.675248785702877, 9.544947415290949 ], [ -83.678633591966673, 9.544844062503444 ], [ -83.690260790003435, 9.545929267221879 ], [ -83.693180508273826, 9.545309150496905 ], [ -83.698167284092847, 9.543448798523229 ], [ -83.712016568409865, 9.536679185096318 ], [ -83.714161140324336, 9.536885891570648 ], [ -83.715866461767803, 9.538436184282489 ], [ -83.718011033682217, 9.551665350975156 ], [ -83.721034104740113, 9.562310696181669 ], [ -83.722041795992084, 9.564791164880319 ], [ -83.724780646209865, 9.567374986366531 ], [ -83.72925065809136, 9.569958807852686 ], [ -83.744391852701824, 9.575023098037548 ], [ -83.749378627621525, 9.578123684360548 ], [ -83.752014125951121, 9.580190741009858 ], [ -83.763279588781984, 9.595693670826222 ], [ -83.782451544802939, 9.593626614176912 ], [ -83.787205776625285, 9.593316554915077 ], [ -83.809168259707405, 9.597864081162413 ], [ -83.811881273302106, 9.598794257149223 ], [ -83.814956021203386, 9.601274725847929 ], [ -83.818289150623798, 9.604995428895904 ], [ -83.823275926442818, 9.612850247041251 ], [ -83.827513394327696, 9.620808417074784 ], [ -83.829451259767836, 9.625459296109625 ], [ -83.830200567702036, 9.627939764808275 ], [ -83.836970181128947, 9.642150784331193 ], [ -83.84454077843418, 9.654501450981172 ], [ -83.846142747989404, 9.656413478898912 ], [ -83.849062466259795, 9.658377182760773 ], [ -83.853144903614407, 9.659824124483748 ], [ -83.861154751390643, 9.660702622727854 ], [ -83.865263028066295, 9.659979153215318 ], [ -83.86820858385903, 9.658583889235103 ], [ -83.8703531557735, 9.657291978042338 ], [ -83.87283362537147, 9.656465154843033 ], [ -83.877846238712948, 9.657602037304173 ], [ -83.898387621191773, 9.66773061857316 ], [ -83.910557420688406, 9.672071438346165 ], [ -83.913451301436396, 9.672794907858702 ], [ -83.918748134718612, 9.677549140580368 ], [ -83.940917325174382, 9.70607452971575 ], [ -83.949831508717125, 9.720853990019634 ], [ -83.95014156797896, 9.722766017937374 ], [ -83.950761684703991, 9.725091457904455 ], [ -83.956187710094753, 9.729845688827481 ], [ -83.975514695746597, 9.736098538316867 ], [ -83.982129278643299, 9.748242499391836 ], [ -83.983860440307069, 9.75330679047596 ], [ -83.985979173799819, 9.758164374186492 ], [ -83.988149584136011, 9.767672837831185 ], [ -83.996391975009601, 9.768809719393005 ], [ -84.033288947127176, 9.760644842885199 ], [ -84.039050869302173, 9.761988430022029 ], [ -84.045019497052124, 9.762815253221333 ], [ -84.047965053744235, 9.762556870802939 ], [ -84.056052415886256, 9.760438137310189 ], [ -84.068222215382946, 9.755787258275348 ], [ -84.071090256809896, 9.755477199912832 ], [ -84.073932460714502, 9.755580552700337 ], [ -84.076128710371677, 9.756717434262157 ], [ -84.077627326240076, 9.758577786235833 ], [ -84.078712530958512, 9.761058254035163 ], [ -84.079177618951917, 9.763848781995705 ], [ -84.079280971739422, 9.766949368318706 ], [ -84.078609178171007, 9.771341864035776 ], [ -84.075508591848006, 9.777801418200852 ], [ -84.06884233300724, 9.788653468982375 ], [ -84.051272345642246, 9.804363105273069 ], [ -84.038895839671227, 9.812734687355942 ], [ -84.03145443357522, 9.820692857389417 ], [ -84.002618985178003, 9.86683991073329 ], [ -84.022591925976599, 9.875469876133877 ], [ -84.026415981812079, 9.877691962414133 ], [ -84.028069628210744, 9.878983872707522 ], [ -84.026338467446294, 9.887148749215385 ], [ -83.999957648426744, 9.930298569923025 ], [ -83.953965623814497, 9.946473293307804 ], [ -83.95300961030523, 9.94699005814465 ], [ -83.926680467229744, 9.947300116507165 ], [ -83.917507901268607, 9.94585317658283 ], [ -83.915156622879806, 9.944664618177569 ], [ -83.912236904609472, 9.943786119034144 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/cuba.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/cuba.geojson new file mode 100644 index 000000000000..eaeb865197e5 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/cuba.geojson @@ -0,0 +1,22 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "CU-14", "NAME_1": "Guantánamo" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -75.095005810746201, 19.897225962598796 ], [ -75.09495029099989, 19.97158369 ], [ -75.137035780433081, 19.971550610171906 ], [ -75.135159714999929, 19.976278928000056 ], [ -75.129750128999945, 19.981146552000041 ], [ -75.115052261999949, 19.990617325000073 ], [ -75.102076925999938, 19.99290049800004 ], [ -75.090132651999909, 20.014136874000087 ], [ -75.084857109999916, 20.025895131000084 ], [ -75.090809699999909, 20.03546784100007 ], [ -75.09243730399993, 20.061224677000041 ], [ -75.112791213999913, 20.057484937000083 ], [ -75.122380731999897, 20.043912247000037 ], [ -75.128609475999951, 20.033508485000084 ], [ -75.135794742999906, 20.021295780000059 ], [ -75.143811785999901, 20.025948425000081 ], [ -75.154332992999912, 20.031165777000069 ], [ -75.169425450999938, 20.025576828000055 ], [ -75.175445115999935, 20.013739325000074 ], [ -75.177357550999943, 20.003973700000074 ], [ -75.17406165299991, 19.993475653000075 ], [ -75.168680239999901, 19.991935841000043 ], [ -75.162111921999951, 19.990411082000037 ], [ -75.158070441999939, 19.991359768000052 ], [ -75.155425584999932, 19.994940497000073 ], [ -75.153309699999909, 19.999172268000052 ], [ -75.151234503999945, 19.994574286000045 ], [ -75.146996645999934, 19.984277612000085 ], [ -75.15912652399993, 19.97776874200008 ], [ -75.160192443999904, 19.970647995000036 ], [ -75.178862062999883, 19.970731793000041 ], [ -75.22896927899987, 19.937440491000118 ], [ -75.232858852999925, 19.900051174000055 ], [ -75.284657355999911, 19.888251044000071 ], [ -75.382080421154143, 19.882543917011262 ], [ -75.382111579186017, 19.882585150983914 ], [ -75.442753871993602, 19.962838650283459 ], [ -75.464277106403301, 19.98177806230774 ], [ -75.470529954993424, 19.98888357251883 ], [ -75.483707444842707, 20.009528306885841 ], [ -75.488280808612387, 20.024617825552184 ], [ -75.489676072592658, 20.061721503244769 ], [ -75.476111009115755, 20.067199205478914 ], [ -75.47295874684869, 20.067199205478914 ], [ -75.468798794228974, 20.069653835755901 ], [ -75.4569390530948, 20.083528958494639 ], [ -75.43327124677063, 20.094665229216957 ], [ -75.430480719709408, 20.098205064212323 ], [ -75.428827074210119, 20.103631090502404 ], [ -75.429628058987703, 20.112545274045146 ], [ -75.432082689264689, 20.117015285926698 ], [ -75.438361376276475, 20.120348416246372 ], [ -75.442521327996872, 20.120658473709568 ], [ -75.445544399954088, 20.121433620964808 ], [ -75.448102383018522, 20.123500678513494 ], [ -75.451202969341523, 20.134895330754887 ], [ -75.450505337351444, 20.161457016927784 ], [ -75.460039639417801, 20.1679424104139 ], [ -75.461874152070436, 20.169957791119145 ], [ -75.462726812792141, 20.171404731043481 ], [ -75.467816942298043, 20.18471141210199 ], [ -75.470219895731589, 20.188974718408531 ], [ -75.47528418591645, 20.203366604185419 ], [ -75.480994432147327, 20.22729279202872 ], [ -75.481511196984115, 20.233674831828012 ], [ -75.48045182978808, 20.238170681231963 ], [ -75.475955980384185, 20.246258043373984 ], [ -75.473320482054589, 20.25000458394436 ], [ -75.470633307780929, 20.252355862333161 ], [ -75.467351854304638, 20.254758815766706 ], [ -75.465181443968447, 20.256929226102898 ], [ -75.463501960047381, 20.262329413071939 ], [ -75.462106696067167, 20.294601345475712 ], [ -75.464561327243416, 20.31108612722295 ], [ -75.475129157184824, 20.331498318492606 ], [ -75.479134081072971, 20.340024929307049 ], [ -75.477325405942736, 20.342841294789878 ], [ -75.472545335698669, 20.346717027468799 ], [ -75.459962124152696, 20.351471259291145 ], [ -75.448567471011984, 20.358266710240457 ], [ -75.437017788240325, 20.3671808937832 ], [ -75.426992560658107, 20.381546942937064 ], [ -75.423039312714081, 20.389608465758045 ], [ -75.421773240842356, 20.396119696766561 ], [ -75.421644049633187, 20.401054795742198 ], [ -75.420946417643052, 20.404697984424445 ], [ -75.419241096199642, 20.407927761057294 ], [ -75.416553921026605, 20.409116319462555 ], [ -75.4114896308418, 20.40808279068824 ], [ -75.407820603737832, 20.406454982711239 ], [ -75.398467169724086, 20.403354397287615 ], [ -75.39355790917017, 20.404232896430983 ], [ -75.389397955651134, 20.407333481854664 ], [ -75.384772915038013, 20.415730903258577 ], [ -75.375471157867651, 20.422862250092749 ], [ -75.364076503827562, 20.425756129941419 ], [ -75.344801195019102, 20.438597723905843 ], [ -75.337230597713926, 20.439889635098552 ], [ -75.330719366705409, 20.437977607180812 ], [ -75.326481899719909, 20.434256904132781 ], [ -75.316973436075216, 20.428159085173604 ], [ -75.311495733841014, 20.423120632511143 ], [ -75.307981737267369, 20.417617091855277 ], [ -75.306663987652882, 20.415911770411867 ], [ -75.299971890390395, 20.41017568575927 ], [ -75.291109381892454, 20.404930528421119 ], [ -75.286742722798408, 20.403302721343493 ], [ -75.282221034972792, 20.403741970015915 ], [ -75.263901739673543, 20.412191067363835 ], [ -75.260181036625511, 20.412578640092136 ], [ -75.25653784884264, 20.41017568575927 ], [ -75.255065069597265, 20.407152614701374 ], [ -75.240492315767767, 20.396791490334977 ], [ -75.231397264172415, 20.412036037732946 ], [ -75.228296677849414, 20.442111721378808 ], [ -75.225764533206643, 20.447692776400515 ], [ -75.212354499360629, 20.459216619851134 ], [ -75.189694383389053, 20.471696479508921 ], [ -75.183028123648967, 20.473298448164826 ], [ -75.177834642254936, 20.472290757812232 ], [ -75.169488897694464, 20.465650336493809 ], [ -75.164605475562212, 20.464668484562878 ], [ -75.158352626972146, 20.465572822128024 ], [ -75.139878302941327, 20.475003770507612 ], [ -75.116882290185515, 20.483220322959539 ], [ -75.110474412863823, 20.484744778148979 ], [ -75.104970873107277, 20.484176337368069 ], [ -75.098847214827117, 20.479292914336497 ], [ -75.070476854423305, 20.45081920024586 ], [ -75.048255988023413, 20.433714300874271 ], [ -75.015854865309791, 20.43115631780978 ], [ -74.988776415199368, 20.413224596138207 ], [ -74.982239345769187, 20.412036037732946 ], [ -74.978234421881041, 20.41304372808554 ], [ -74.977304246793551, 20.416686916767787 ], [ -74.97725256995011, 20.419477443828953 ], [ -74.978001878783687, 20.422242133367718 ], [ -74.979242113133012, 20.425136013216445 ], [ -74.981774257775783, 20.429554348254555 ], [ -74.985494960823758, 20.433921007348602 ], [ -74.991411912629644, 20.438571886383443 ], [ -74.999344245140776, 20.439372870261764 ], [ -75.000506965124316, 20.439734605467663 ], [ -75.000713670699326, 20.441284898179504 ], [ -75.000196905862481, 20.444437161345888 ], [ -74.998104010791451, 20.451490993814275 ], [ -74.998336554788182, 20.454074815300487 ], [ -74.999447597928281, 20.456994534470198 ], [ -75.003400844972987, 20.464823513294505 ], [ -75.001204597114452, 20.466735541212245 ], [ -74.99577857082437, 20.468311672345806 ], [ -74.968777635079789, 20.472058213815501 ], [ -74.959527553853491, 20.471231391515516 ], [ -74.949838223055565, 20.466347968483944 ], [ -74.91617102667152, 20.443403632571574 ], [ -74.879635789759902, 20.4273322619743 ], [ -74.868602870925713, 20.421079413384177 ], [ -74.858396776190261, 20.413999742494127 ], [ -74.844986742344247, 20.408186143475746 ], [ -74.838708055332461, 20.406765041973074 ], [ -74.834703132343691, 20.40847036431586 ], [ -74.833230353098315, 20.411674303426366 ], [ -74.83214514837988, 20.417384547858603 ], [ -74.830594854768719, 20.421415310168413 ], [ -74.829147914844384, 20.42443838122631 ], [ -74.826409063727283, 20.427280585130859 ], [ -74.823618536666118, 20.42924428989204 ], [ -74.783155891131457, 20.444773058130124 ], [ -74.791604986680795, 20.471567288299696 ], [ -74.790287237965629, 20.491023464261445 ], [ -74.784706183843298, 20.506681422809379 ], [ -74.779641892759116, 20.516164048931671 ], [ -74.772510545924945, 20.5260084093606 ], [ -74.767187873321689, 20.531796169957261 ], [ -74.759591436695416, 20.538074856069727 ], [ -74.75599992485661, 20.539728502468392 ], [ -74.751891649080335, 20.540167752040134 ], [ -74.744010993412587, 20.539986883987467 ], [ -74.740936244611987, 20.540658678455202 ], [ -74.737603116090895, 20.542544867051959 ], [ -74.727758754762704, 20.549857082838059 ], [ -74.715167585115921, 20.556063378921806 ], [ -74.709828253999945, 20.552232164000088 ], [ -74.673491990999935, 20.540961005000042 ], [ -74.669992641999897, 20.52765534100007 ], [ -74.65070553299995, 20.513088283000059 ], [ -74.605213995999918, 20.485744533000059 ], [ -74.597279425999943, 20.476792710000041 ], [ -74.586496548999946, 20.45579661700009 ], [ -74.554798956999946, 20.414455471000053 ], [ -74.547230597999942, 20.410060940000051 ], [ -74.543934699999909, 20.403550523000035 ], [ -74.494984503999945, 20.355169989000046 ], [ -74.485747850999928, 20.350816148000035 ], [ -74.472075975999928, 20.349188544000071 ], [ -74.450266079999949, 20.343085028000075 ], [ -74.423410610999952, 20.32758209800005 ], [ -74.401112433999913, 20.30727773600006 ], [ -74.392974412999934, 20.286525783000059 ], [ -74.385568813999953, 20.286525783000059 ], [ -74.372181769999941, 20.300523179000038 ], [ -74.351918097999942, 20.300441799000055 ], [ -74.329701300999943, 20.29523346600007 ], [ -74.310414191999939, 20.293931382000039 ], [ -74.293690558999913, 20.300930080000057 ], [ -74.276234503999945, 20.311224677000041 ], [ -74.257191535999937, 20.319647528000075 ], [ -74.235951300999943, 20.321234442000048 ], [ -74.223540818999936, 20.317368882000039 ], [ -74.213612433999913, 20.310980536000045 ], [ -74.193714972999942, 20.293931382000039 ], [ -74.159657355999911, 20.273423570000091 ], [ -74.147531704999949, 20.259182033000059 ], [ -74.139637824999909, 20.242336330000057 ], [ -74.13508053299995, 20.223822333000044 ], [ -74.132883266999897, 20.204575914000088 ], [ -74.141957160999937, 20.182603257000039 ], [ -74.162912563999953, 20.17055898600006 ], [ -74.184071417999917, 20.162665106000077 ], [ -74.198068813999953, 20.148871161000045 ], [ -74.218332485999952, 20.137844143000052 ], [ -74.225087042999917, 20.135687567000048 ], [ -74.230295376999948, 20.13031647300005 ], [ -74.235951300999943, 20.094671942000048 ], [ -74.267404751999948, 20.068304755000042 ], [ -74.304514126999948, 20.069322007000039 ], [ -74.346587693999936, 20.079575914000088 ], [ -74.392974412999934, 20.081040757000039 ], [ -74.455922003999945, 20.06867096600007 ], [ -74.49836178299995, 20.065619208000044 ], [ -74.580476955999927, 20.047642379000081 ], [ -74.618649989999938, 20.054519508000055 ], [ -74.650183918999915, 20.042163631000051 ], [ -74.713124171999937, 20.051800607000075 ], [ -74.788424855999949, 20.03946681900004 ], [ -74.812977667999917, 20.037258205000057 ], [ -74.838002081999946, 20.026434637000079 ], [ -74.855132615999935, 20.012762762000079 ], [ -74.870676235999952, 19.997015692000048 ], [ -74.887806769999941, 19.984076239000046 ], [ -74.910023566999939, 19.978664455000057 ], [ -74.933516762999943, 19.97821893400004 ], [ -74.9473341019999, 19.975949496000055 ], [ -74.955515932999901, 19.967813299000056 ], [ -74.961560749999933, 19.947009654000055 ], [ -74.977867950999951, 19.92303486600008 ], [ -75.01008053299995, 19.91156647300005 ], [ -75.045667739999942, 19.90760060100007 ], [ -75.05103469799991, 19.919371866000063 ], [ -75.058231433999936, 19.922965563000048 ], [ -75.063517880999939, 19.921604784000067 ], [ -75.066378021999924, 19.914368366000076 ], [ -75.066332835999901, 19.904861972000049 ], [ -75.091779838999912, 19.89713258800009 ], [ -75.095005810746201, 19.897225962598796 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-09", "NAME_1": "Camagüey" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.333119269999941, 20.554632880000042 ], [ -78.326079881999931, 20.535101630000042 ], [ -78.32835852799991, 20.521307684000078 ], [ -78.338978644999941, 20.518011786000045 ], [ -78.357289191999939, 20.530422268000052 ], [ -78.368967251999948, 20.536525783000059 ], [ -78.383859829999949, 20.540594794000071 ], [ -78.396595831999946, 20.546454169000071 ], [ -78.409779425999943, 20.573635158000059 ], [ -78.427845831999946, 20.585638739000046 ], [ -78.463449673999946, 20.602443752000056 ], [ -78.449208136999914, 20.612941799000055 ], [ -78.433501756999931, 20.609523830000057 ], [ -78.418934699999909, 20.599107164000088 ], [ -78.408192511999914, 20.588771877000056 ], [ -78.393422003999945, 20.569973049000055 ], [ -78.384185350999928, 20.562160549000055 ], [ -78.367258266999897, 20.554632880000042 ], [ -78.364491339999915, 20.570217190000051 ], [ -78.355295376999948, 20.573431708000044 ], [ -78.343576626999948, 20.567328192000048 ], [ -78.333119269999941, 20.554632880000042 ] ] ], [ [ [ -78.436146613999938, 20.725978908000059 ], [ -78.449126756999931, 20.711615302000041 ], [ -78.495757615999935, 20.701239325000074 ], [ -78.511830206999946, 20.691148179000038 ], [ -78.527821417999917, 20.699286200000074 ], [ -78.545399542999917, 20.704250393000052 ], [ -78.533192511999914, 20.712795315000051 ], [ -78.49836178299995, 20.72016022300005 ], [ -78.483957485999952, 20.732163804000038 ], [ -78.478586391999897, 20.730169989000046 ], [ -78.478423631999931, 20.729193427000041 ], [ -78.476470506999931, 20.725978908000059 ], [ -78.465891079999949, 20.73118724200009 ], [ -78.455799933999913, 20.731756903000075 ], [ -78.436146613999938, 20.725978908000059 ] ] ], [ [ [ -77.634185350999928, 22.054266669000071 ], [ -77.626576300999943, 22.042059637000079 ], [ -77.624379035999937, 22.029730536000045 ], [ -77.627064581999946, 22.016180731000077 ], [ -77.64867102799991, 21.971136786000045 ], [ -77.645578579999949, 21.961493231000077 ], [ -77.634185350999928, 21.945013739000046 ], [ -77.649647589999915, 21.944484768000052 ], [ -77.661529100999928, 21.940130927000041 ], [ -77.682606574999909, 21.925116278000075 ], [ -77.677886522999927, 21.943019924000055 ], [ -77.684315558999913, 21.951157945000091 ], [ -77.695057745999918, 21.948065497000073 ], [ -77.703114386999914, 21.93195221600007 ], [ -77.700428839999915, 21.928859768000052 ], [ -77.696156378999945, 21.922267971000053 ], [ -77.695423956999946, 21.915187893000052 ], [ -77.703114386999914, 21.910834052000041 ], [ -77.708892381999931, 21.912176825000074 ], [ -77.712635870999918, 21.916937567000048 ], [ -77.715891079999949, 21.923041083000044 ], [ -77.728179490999935, 21.938788153000075 ], [ -77.732980923999946, 21.948187567000048 ], [ -77.739125128999945, 21.957220770000049 ], [ -77.751535610999952, 21.966131903000075 ], [ -77.765777147999927, 21.959784247000073 ], [ -77.787261522999927, 21.964056708000044 ], [ -77.808664516999897, 21.973578192000048 ], [ -77.82258053299995, 21.98314036700009 ], [ -77.825103318999936, 21.991848049000055 ], [ -77.821156378999945, 22.002427476000037 ], [ -77.815297003999945, 22.013617255000042 ], [ -77.812367316999939, 22.024115302000041 ], [ -77.817128058999913, 22.031317450000074 ], [ -77.827951626999948, 22.036118882000039 ], [ -77.847075975999928, 22.041205145000049 ], [ -77.84203040299991, 22.032619533000059 ], [ -77.84007727799991, 22.023993231000077 ], [ -77.841664191999939, 22.015366929000038 ], [ -77.847075975999928, 22.007025458000044 ], [ -77.853911912999934, 22.027533270000049 ], [ -77.860096808999913, 22.027533270000049 ], [ -77.870228644999941, 22.013251044000071 ], [ -77.886586066999939, 22.00922272300005 ], [ -77.901844855999911, 22.015204169000071 ], [ -77.908558722999942, 22.031236070000091 ], [ -77.917225714999915, 22.043158270000049 ], [ -77.934478318999936, 22.056138414000088 ], [ -77.947132941999939, 22.072821356000077 ], [ -77.94204667899993, 22.095851955000057 ], [ -77.94945227799991, 22.102606512000079 ], [ -77.930165167999917, 22.102118231000077 ], [ -77.91624915299991, 22.093817450000074 ], [ -77.903635219999899, 22.083238023000035 ], [ -77.888050910999937, 22.075995184000078 ], [ -77.871693488999938, 22.07562897300005 ], [ -77.860422329999949, 22.080959377000056 ], [ -77.850819464999915, 22.088690497000073 ], [ -77.839670376999948, 22.095851955000057 ], [ -77.82249915299991, 22.100531317000048 ], [ -77.808501756999931, 22.099554755000042 ], [ -77.796376105999911, 22.095038153000075 ], [ -77.785023566999939, 22.089016018000052 ], [ -77.781239386999914, 22.084784247000073 ], [ -77.771962042999917, 22.071356512000079 ], [ -77.767689581999946, 22.068508205000057 ], [ -77.759103969999899, 22.07062409100007 ], [ -77.744699673999946, 22.080023505000042 ], [ -77.737212693999936, 22.082180080000057 ], [ -77.726307745999918, 22.077622789000088 ], [ -77.694203253999945, 22.058010158000059 ], [ -77.682606574999909, 22.054266669000071 ], [ -77.669667120999918, 22.06085846600007 ], [ -77.661447719999899, 22.069322007000039 ], [ -77.651722785999937, 22.070257880000042 ], [ -77.634185350999928, 22.054266669000071 ] ] ], [ [ [ -77.847075975999928, 22.260321356000077 ], [ -77.839588995999918, 22.27374909100007 ], [ -77.850697394999941, 22.288804429000038 ], [ -77.868478969999899, 22.301743882000039 ], [ -77.880686001999948, 22.308742580000057 ], [ -77.85610917899993, 22.312445380000042 ], [ -77.83421790299991, 22.295884507000039 ], [ -77.818430141999897, 22.271144924000055 ], [ -77.805734829999949, 22.228216864000046 ], [ -77.790150519999941, 22.211493231000077 ], [ -77.772043423999946, 22.196112372000073 ], [ -77.757720506999931, 22.17837148600006 ], [ -77.781727667999917, 22.177801825000074 ], [ -77.807118292999917, 22.20258209800005 ], [ -77.847075975999928, 22.260321356000077 ] ] ], [ [ [ -77.997303839999915, 22.147365627000056 ], [ -78.00413977799991, 22.162258205000057 ], [ -78.036040818999936, 22.183417059000078 ], [ -78.045725063999953, 22.198879299000055 ], [ -78.029449022999927, 22.20453522300005 ], [ -78.016468878999945, 22.21743398600006 ], [ -78.007923956999946, 22.23383209800005 ], [ -78.004750128999945, 22.250067450000074 ], [ -78.003325975999928, 22.286363023000035 ], [ -78.006825324999909, 22.297674872000073 ], [ -78.01781165299991, 22.314886786000045 ], [ -78.002674933999913, 22.312689520000049 ], [ -77.987172003999945, 22.307806708000044 ], [ -77.97492428299995, 22.298895575000074 ], [ -77.969960089999915, 22.284816799000055 ], [ -77.975656704999949, 22.275620835000041 ], [ -77.986480272999927, 22.265570380000042 ], [ -77.993397589999915, 22.253119208000044 ], [ -77.987416144999941, 22.236721096000053 ], [ -77.978627081999946, 22.233221747000073 ], [ -77.953968878999945, 22.236517645000049 ], [ -77.94204667899993, 22.232977606000077 ], [ -77.935129360999952, 22.224025783000059 ], [ -77.930572068999936, 22.213853257000039 ], [ -77.923410610999952, 22.206366278000075 ], [ -77.908558722999942, 22.205023505000042 ], [ -77.921620245999918, 22.212469794000071 ], [ -77.917632615999935, 22.218817450000074 ], [ -77.913197394999941, 22.224310614000046 ], [ -77.908070441999939, 22.228949286000045 ], [ -77.902333136999914, 22.232977606000077 ], [ -77.89484615799995, 22.220851955000057 ], [ -77.884877081999946, 22.214789130000042 ], [ -77.875070766999897, 22.216294664000088 ], [ -77.867583787999934, 22.226752020000049 ], [ -77.85960852799991, 22.20962148600006 ], [ -77.870472785999937, 22.202215887000079 ], [ -77.888661261999914, 22.198431708000044 ], [ -77.902333136999914, 22.19204336100006 ], [ -77.890777147999927, 22.189154364000046 ], [ -77.882191535999937, 22.183294989000046 ], [ -77.874908006999931, 22.176703192000048 ], [ -77.867583787999934, 22.171535549000055 ], [ -77.857004360999952, 22.168198960000041 ], [ -77.836415167999917, 22.164211330000057 ], [ -77.825998501999948, 22.157904364000046 ], [ -77.848500128999945, 22.116034247000073 ], [ -77.863433397999927, 22.099188544000071 ], [ -77.874419725999928, 22.109523830000057 ], [ -77.878977016999897, 22.107570705000057 ], [ -77.890492316999939, 22.104641018000052 ], [ -77.894886847999942, 22.102606512000079 ], [ -77.898101365999935, 22.110296942000048 ], [ -77.900746222999942, 22.114488023000035 ], [ -77.908558722999942, 22.123114325000074 ], [ -77.912831183999913, 22.14321523600006 ], [ -77.933949347999942, 22.150213934000078 ], [ -77.950754360999952, 22.142157294000071 ], [ -77.94204667899993, 22.116888739000046 ], [ -77.954945441999939, 22.122259833000044 ], [ -77.990101691999939, 22.141831773000035 ], [ -77.997303839999915, 22.147365627000056 ] ] ], [ [ [ -78.196522589999915, 22.329169012000079 ], [ -78.175363735999952, 22.341620184000078 ], [ -78.184885219999899, 22.358221747000073 ], [ -78.205189581999946, 22.367987372000073 ], [ -78.216420050999943, 22.359605210000041 ], [ -78.217681443999936, 22.350287177000041 ], [ -78.221547003999945, 22.339911200000074 ], [ -78.228138800999943, 22.33344147300005 ], [ -78.237456834999932, 22.336004950000074 ], [ -78.243723110999952, 22.346625067000048 ], [ -78.244211391999897, 22.359116929000038 ], [ -78.239613410999937, 22.366929429000038 ], [ -78.23070227799991, 22.363348700000074 ], [ -78.230458136999914, 22.380764065000051 ], [ -78.24632727799991, 22.400620835000041 ], [ -78.26976477799991, 22.410142320000091 ], [ -78.292144334999932, 22.396877346000053 ], [ -78.297230597999942, 22.402044989000046 ], [ -78.301747199999909, 22.403225002000056 ], [ -78.306548631999931, 22.403021552000041 ], [ -78.312611456999946, 22.404282945000091 ], [ -78.298736131999931, 22.420396226000037 ], [ -78.279042120999918, 22.425441799000055 ], [ -78.243723110999952, 22.424750067000048 ], [ -78.21157792899993, 22.436590887000079 ], [ -78.197621222999942, 22.437201239000046 ], [ -78.18968665299991, 22.424750067000048 ], [ -78.169748501999948, 22.435044664000088 ], [ -78.144195115999935, 22.428941148000035 ], [ -78.119048631999931, 22.413763739000046 ], [ -78.100331183999913, 22.396877346000053 ], [ -78.090728318999936, 22.384466864000046 ], [ -78.082020636999914, 22.369696356000077 ], [ -78.075550910999937, 22.354071356000077 ], [ -78.071644660999937, 22.320868231000077 ], [ -78.06704667899993, 22.310451565000051 ], [ -78.045725063999953, 22.288234768000052 ], [ -78.037220831999946, 22.288031317000048 ], [ -78.023345506999931, 22.283026434000078 ], [ -78.010975714999915, 22.281398830000057 ], [ -78.02765865799995, 22.266017971000053 ], [ -78.051584438999953, 22.27220286700009 ], [ -78.100331183999913, 22.301906643000052 ], [ -78.122141079999949, 22.305853583000044 ], [ -78.146311001999948, 22.305853583000044 ], [ -78.171538865999935, 22.310736395000049 ], [ -78.196522589999915, 22.329169012000079 ] ] ], [ [ [ -78.081820195245825, 22.082791411494441 ], [ -78.079823370999918, 22.082180080000057 ], [ -78.065052863999938, 22.086981512000079 ], [ -78.055572068999936, 22.077460028000075 ], [ -78.042307094999899, 22.051174221000053 ], [ -78.023264126999948, 22.034328518000052 ], [ -78.01781165299991, 22.027533270000049 ], [ -78.011219855999911, 22.009263414000088 ], [ -77.993234829999949, 21.979681708000044 ], [ -77.985218878999945, 21.970038153000075 ], [ -77.973378058999913, 21.966131903000075 ], [ -77.961333787999934, 21.958238023000035 ], [ -77.915394660999937, 21.914252020000049 ], [ -77.911976691999939, 21.905991929000038 ], [ -77.895008917999917, 21.876939195000091 ], [ -77.888050910999937, 21.86985911700009 ], [ -77.876047329999949, 21.871527411000045 ], [ -77.870350714999915, 21.881537177000041 ], [ -77.865589972999942, 21.956244208000044 ], [ -77.860096808999913, 21.966131903000075 ], [ -77.849110480999911, 21.970526434000078 ], [ -77.822255011999914, 21.966457424000055 ], [ -77.806141730999911, 21.966131903000075 ], [ -77.815012173999946, 21.955755927000041 ], [ -77.846994594999899, 21.950384833000044 ], [ -77.853911912999934, 21.941839911000045 ], [ -77.852528449999909, 21.924017645000049 ], [ -77.848540818999936, 21.910589911000045 ], [ -77.842152472999942, 21.899969794000071 ], [ -77.833485480999911, 21.890326239000046 ], [ -77.822010870999918, 21.880275783000059 ], [ -77.813303188999953, 21.876450914000088 ], [ -77.788726365999935, 21.876695054000038 ], [ -77.777943488999938, 21.870021877000056 ], [ -77.770375128999945, 21.854559637000079 ], [ -77.766021287999934, 21.83734772300005 ], [ -77.764556443999936, 21.825506903000075 ], [ -77.760894334999932, 21.813299872000073 ], [ -77.751576300999943, 21.804632880000042 ], [ -77.738392706999946, 21.798651434000078 ], [ -77.710072394999941, 21.790187893000052 ], [ -77.704457160999937, 21.789252020000049 ], [ -77.68976803299995, 21.795884507000039 ], [ -77.681263800999943, 21.791693427000041 ], [ -77.673207160999937, 21.784735419000071 ], [ -77.664662238999938, 21.781154690000051 ], [ -77.603871222999942, 21.789740302000041 ], [ -77.586415167999917, 21.787909247000073 ], [ -77.569650844999899, 21.780585028000075 ], [ -77.524973110999952, 21.753810940000051 ], [ -77.524403449999909, 21.767645575000074 ], [ -77.516590949999909, 21.774603583000044 ], [ -77.490834113999938, 21.781154690000051 ], [ -77.489247199999909, 21.771226304000038 ], [ -77.483387824999909, 21.766180731000077 ], [ -77.474232550999943, 21.765041408000059 ], [ -77.462880011999914, 21.766831773000035 ], [ -77.464955206999946, 21.770575262000079 ], [ -77.467518683999913, 21.777736721000053 ], [ -77.469715949999909, 21.781154690000051 ], [ -77.455637173999946, 21.776841539000088 ], [ -77.442250128999945, 21.766587632000039 ], [ -77.421986456999946, 21.74640534100007 ], [ -77.436350063999953, 21.744614976000037 ], [ -77.446278449999909, 21.750230210000041 ], [ -77.452544725999928, 21.750677802000041 ], [ -77.456044074999909, 21.733343817000048 ], [ -77.453724738999938, 21.715033270000049 ], [ -77.439076300999943, 21.683823960000041 ], [ -77.435617641999897, 21.667873440000051 ], [ -77.430287238999938, 21.657619533000059 ], [ -77.417469855999911, 21.653713283000059 ], [ -77.387196417999917, 21.650132554000038 ], [ -77.363352016999897, 21.638251044000071 ], [ -77.356760219999899, 21.636542059000078 ], [ -77.347157355999911, 21.638617255000042 ], [ -77.342152472999942, 21.64329661700009 ], [ -77.339426235999952, 21.648016669000071 ], [ -77.336537238999938, 21.650132554000038 ], [ -77.336903449999909, 21.655585028000075 ], [ -77.342884894999941, 21.667547919000071 ], [ -77.352406378999945, 21.679510809000078 ], [ -77.378407355999911, 21.690497137000079 ], [ -77.389149542999917, 21.70384349200009 ], [ -77.401478644999941, 21.733343817000048 ], [ -77.407093878999945, 21.75657786700009 ], [ -77.411691860999952, 21.763413804000038 ], [ -77.418568488999938, 21.767279364000046 ], [ -77.438303188999953, 21.77484772300005 ], [ -77.442372199999909, 21.777736721000053 ], [ -77.443714972999942, 21.788234768000052 ], [ -77.448801235999952, 21.801906643000052 ], [ -77.459136522999927, 21.809271552000041 ], [ -77.476551886999914, 21.800970770000049 ], [ -77.490834113999938, 21.815252997000073 ], [ -77.504383917999917, 21.803534247000073 ], [ -77.518544074999909, 21.811835028000075 ], [ -77.545480923999946, 21.843166408000059 ], [ -77.583078579999949, 21.873277085000041 ], [ -77.593658006999931, 21.888739325000074 ], [ -77.600493943999936, 21.890448309000078 ], [ -77.614328579999949, 21.884182033000059 ], [ -77.605824347999942, 21.901271877000056 ], [ -77.589914516999897, 21.919256903000075 ], [ -77.571644660999937, 21.930812893000052 ], [ -77.556019660999937, 21.928534247000073 ], [ -77.521229620999918, 21.901190497000073 ], [ -77.517486131999931, 21.893011786000045 ], [ -77.511097785999937, 21.867743231000077 ], [ -77.507557745999918, 21.862453518000052 ], [ -77.401356574999909, 21.79047272300005 ], [ -77.380970831999946, 21.781154690000051 ], [ -77.330067511999914, 21.76634349200009 ], [ -77.315785285999937, 21.756903387000079 ], [ -77.301584438999953, 21.743353583000044 ], [ -77.267730272999927, 21.71751536700009 ], [ -77.254302537999934, 21.712836005000042 ], [ -77.195423956999946, 21.671291408000059 ], [ -77.180653449999909, 21.664252020000049 ], [ -77.166737433999913, 21.660142320000091 ], [ -77.151844855999911, 21.660060940000051 ], [ -77.133941209999932, 21.664455471000053 ], [ -77.141713019999941, 21.645575262000079 ], [ -77.136301235999952, 21.633490302000041 ], [ -77.126210089999915, 21.624741929000038 ], [ -77.120269334999932, 21.616034247000073 ], [ -77.123768683999913, 21.596177476000037 ], [ -77.147816535999937, 21.571966864000046 ], [ -77.154408331999946, 21.554592190000051 ], [ -77.163197394999941, 21.56000397300005 ], [ -77.180490688999953, 21.578029690000051 ], [ -77.185414191999939, 21.581854559000078 ], [ -77.249745245999918, 21.609767971000053 ], [ -77.266021287999934, 21.614243882000039 ], [ -77.284779425999943, 21.616034247000073 ], [ -77.284250454999949, 21.614243882000039 ], [ -77.286732550999943, 21.610581773000035 ], [ -77.290028449999909, 21.607123114000046 ], [ -77.291615363999938, 21.60610586100006 ], [ -77.293771938999953, 21.602484442000048 ], [ -77.298817511999914, 21.603989976000037 ], [ -77.304676886999914, 21.607367255000042 ], [ -77.313588019999941, 21.611151434000078 ], [ -77.32445227799991, 21.620347398000035 ], [ -77.333159959999932, 21.623439846000053 ], [ -77.356190558999913, 21.621649481000077 ], [ -77.364247199999909, 21.611761786000045 ], [ -77.360951300999943, 21.600775458000044 ], [ -77.349598761999914, 21.595526434000078 ], [ -77.338002081999946, 21.592962958000044 ], [ -77.329701300999943, 21.587103583000044 ], [ -77.322010870999918, 21.580267645000049 ], [ -77.31273352799991, 21.575100002000056 ], [ -77.302805141999897, 21.572943427000041 ], [ -77.274769660999937, 21.575100002000056 ], [ -77.255116339999915, 21.567450262000079 ], [ -77.249989386999914, 21.550848700000074 ], [ -77.257232225999928, 21.534247137000079 ], [ -77.274769660999937, 21.526678778000075 ], [ -77.27757727799991, 21.518459377000056 ], [ -77.271229620999918, 21.500474351000037 ], [ -77.262521938999953, 21.483099677000041 ], [ -77.25804602799991, 21.476385809000078 ], [ -77.24673417899993, 21.474310614000046 ], [ -77.224354620999918, 21.477769273000035 ], [ -77.208485480999911, 21.476060289000088 ], [ -77.216460740999935, 21.458400783000059 ], [ -77.206613735999952, 21.460882880000042 ], [ -77.181711391999897, 21.472642320000091 ], [ -77.180775519999941, 21.473822333000044 ], [ -77.171294725999928, 21.478949286000045 ], [ -77.161854620999918, 21.480129299000055 ], [ -77.153065558999913, 21.495266018000052 ], [ -77.140736456999946, 21.548407294000071 ], [ -77.11546790299991, 21.59320709800005 ], [ -77.107248501999948, 21.60297272300005 ], [ -77.088286912999934, 21.60618724200009 ], [ -77.069935675999943, 21.595770575000074 ], [ -76.962635870999918, 21.472642320000091 ], [ -76.946766730999911, 21.459051825000074 ], [ -76.944813605999911, 21.45774974200009 ], [ -76.947209846057547, 21.455796617519866 ], [ -76.955374721666033, 21.448432725789644 ], [ -76.971265225110017, 21.442464098039693 ], [ -76.999738939200654, 21.421638494720753 ], [ -77.012425502634812, 21.41616079428519 ], [ -77.039555629588619, 21.4098045920083 ], [ -77.057461513737849, 21.409029446551699 ], [ -77.080690069591014, 21.414326279833915 ], [ -77.10048214413564, 21.416470851748386 ], [ -77.116346809157903, 21.37068553271115 ], [ -77.124666714397335, 21.361461289906572 ], [ -77.130738694934792, 21.348490504732979 ], [ -77.131591355656496, 21.339111233196832 ], [ -77.127147183095985, 21.322703965815379 ], [ -77.122289597586871, 21.316838690852876 ], [ -77.117793749082239, 21.313893134160821 ], [ -77.079501512085074, 21.314099839735775 ], [ -77.073687913966069, 21.31265289981144 ], [ -77.071672533260767, 21.309164739860819 ], [ -77.073248664394328, 21.305521552077948 ], [ -77.129705166160477, 21.256687323561096 ], [ -77.134795294767002, 21.244930935214484 ], [ -77.135518765178858, 21.238083808321107 ], [ -77.131126267663092, 21.17351410599116 ], [ -77.167558152686581, 21.116825059329017 ], [ -77.174069382795778, 21.109538682863899 ], [ -77.18698849202525, 21.099048367288276 ], [ -77.193473883712727, 21.097110500948816 ], [ -77.222722744159285, 21.091219387564649 ], [ -77.227735358400082, 21.089178168437684 ], [ -77.237088793313148, 21.083648790259474 ], [ -77.248948534447266, 21.078351956077881 ], [ -77.263004523439974, 21.059903469569463 ], [ -77.291839972736511, 20.995023708877056 ], [ -77.300082363610159, 20.991147976198135 ], [ -77.308298916062085, 20.993395900900111 ], [ -77.314267543812093, 20.996186427961277 ], [ -77.324292772293575, 21.005255642034228 ], [ -77.328995327272537, 21.008485419566455 ], [ -77.333646206307378, 21.009493109919049 ], [ -77.339692349322434, 21.006573390749395 ], [ -77.346306932219136, 21.001509101463853 ], [ -77.356590542219749, 20.980657659723192 ], [ -77.366641608223631, 20.990450344208 ], [ -77.369793871390016, 20.997116603948086 ], [ -77.369664680180847, 21.000243027793488 ], [ -77.368967048190711, 21.003085231698094 ], [ -77.362326625972969, 21.012516180976945 ], [ -77.361525642094705, 21.015203355250605 ], [ -77.361835699557901, 21.017477118374302 ], [ -77.36390275710653, 21.020112615804578 ], [ -77.368786180138102, 21.021585395049897 ], [ -77.377235276586759, 21.023032334974289 ], [ -77.393926764808327, 21.024220893379493 ], [ -77.411419236908216, 21.02845836036505 ], [ -77.413693000031913, 21.030499579491959 ], [ -77.414519823231217, 21.03303172503405 ], [ -77.414054735237812, 21.038974514362337 ], [ -77.414907395959517, 21.043573717453057 ], [ -77.416922776664819, 21.048172918745195 ], [ -77.42560441800947, 21.060652778402982 ], [ -77.428627489067367, 21.063805039770727 ], [ -77.432864956052867, 21.06910187395232 ], [ -77.434492764029812, 21.071685696337795 ], [ -77.435629644692312, 21.074166165036445 ], [ -77.436120572006757, 21.076259060107532 ], [ -77.437670864718598, 21.076104031375905 ], [ -77.441055670982394, 21.073907781718731 ], [ -77.44792863629749, 21.066078802894424 ], [ -77.46239803733954, 21.059386704732617 ], [ -77.465963710756625, 21.056957912877351 ], [ -77.467901577096086, 21.053676459401061 ], [ -77.46777238588686, 21.047862861281999 ], [ -77.467074754796101, 21.043522039710354 ], [ -77.464749314829021, 21.035951443304441 ], [ -77.464826830094125, 21.034582016846571 ], [ -77.468935105870401, 21.025848700457118 ], [ -77.469994473066492, 21.018949896720358 ], [ -77.473172573755278, 21.011999417039476 ], [ -77.479735479808539, 21.004092922050688 ], [ -77.497925584797883, 21.000682278264492 ], [ -77.511361457065561, 20.999364529549382 ], [ -77.524177211708945, 21.000217190271087 ], [ -77.526786871616821, 21.000139675005983 ], [ -77.529396532424016, 20.996909898373076 ], [ -77.532187058585862, 20.982285467700137 ], [ -77.546656459627911, 20.980270086994892 ], [ -77.566913622165941, 20.974689031973242 ], [ -77.576990525692167, 20.969443875534409 ], [ -77.5823131991948, 20.955982163945691 ], [ -77.582261522351359, 20.943347276455654 ], [ -77.58422522711254, 20.940272529453637 ], [ -77.587351650957885, 20.937792059855667 ], [ -77.594973924207238, 20.938644721476692 ], [ -77.600141568078868, 20.939781602139192 ], [ -77.611510382797917, 20.940479234129327 ], [ -77.617013922554463, 20.941331894851032 ], [ -77.620812140867599, 20.944432481174033 ], [ -77.625876431052461, 20.95078868345098 ], [ -77.629778002153046, 20.956989854298342 ], [ -77.635281541909592, 20.964017849244328 ], [ -77.640810920087858, 20.966239936423904 ], [ -77.647425502984561, 20.965154730806148 ], [ -77.655125292398338, 20.960142117464727 ], [ -77.655151129920682, 20.952183946531875 ], [ -77.653523321943737, 20.9457502298892 ], [ -77.652644822800312, 20.939394029410892 ], [ -77.653316617268047, 20.933657944758352 ], [ -77.657528245831884, 20.917483222272892 ], [ -77.658535936184478, 20.909680080970929 ], [ -77.658690964916104, 20.902652086024943 ], [ -77.658096685713474, 20.896864325428282 ], [ -77.666029019123926, 20.891515815302625 ], [ -77.68117021373439, 20.885728053806645 ], [ -77.742174241747819, 20.874669298349431 ], [ -77.765790371228661, 20.876193753538871 ], [ -77.817725186068458, 20.807309068059055 ], [ -77.831109382392071, 20.725686143200903 ], [ -77.831130344456355, 20.725558300366398 ], [ -77.840809699999909, 20.728257554000038 ], [ -77.877512173999946, 20.732163804000038 ], [ -77.899240688999953, 20.72728099200009 ], [ -77.914173956999946, 20.716376044000071 ], [ -77.926869269999941, 20.704901434000078 ], [ -77.94204667899993, 20.69798411700009 ], [ -78.007069464999915, 20.696193752000056 ], [ -78.041127081999946, 20.704494533000059 ], [ -78.051909959999932, 20.725978908000059 ], [ -78.059396938999953, 20.725978908000059 ], [ -78.065541144999941, 20.71165599200009 ], [ -78.098378058999913, 20.748114325000074 ], [ -78.110259568999936, 20.753241278000075 ], [ -78.132069464999915, 20.757391669000071 ], [ -78.144113735999952, 20.768255927000041 ], [ -78.161773240999935, 20.800441799000055 ], [ -78.172352667999917, 20.811753648000035 ], [ -78.190785285999937, 20.827622789000088 ], [ -78.211048956999946, 20.839504299000055 ], [ -78.226918097999942, 20.838934637000079 ], [ -78.237660285999937, 20.833400783000059 ], [ -78.241281704999949, 20.83852773600006 ], [ -78.241851365999935, 20.847886460000041 ], [ -78.243723110999952, 20.855047919000071 ], [ -78.255726691999939, 20.868638414000088 ], [ -78.262074347999942, 20.878159898000035 ], [ -78.264800584999932, 20.886664130000042 ], [ -78.272043423999946, 20.90110911700009 ], [ -78.342681443999936, 20.949408270000049 ], [ -78.356353318999936, 20.953029690000051 ], [ -78.391468878999945, 20.951239325000074 ], [ -78.403920050999943, 20.957953192000048 ], [ -78.415028449999909, 20.973089911000045 ], [ -78.42992102799991, 20.999701239000046 ], [ -78.442250128999945, 21.011135158000059 ], [ -78.478993292999917, 21.037583726000037 ], [ -78.487904425999943, 21.038560289000088 ], [ -78.494740363999938, 21.047919012000079 ], [ -78.500884568999936, 21.082098700000074 ], [ -78.504383917999917, 21.14712148600006 ], [ -78.512277798999946, 21.175116278000075 ], [ -78.52757727799991, 21.203273830000057 ], [ -78.538197394999941, 21.231634833000044 ], [ -78.531727667999917, 21.26040273600006 ], [ -78.522572394999941, 21.25031159100007 ], [ -78.511463995999918, 21.248846747000073 ], [ -78.502105272999927, 21.255560614000046 ], [ -78.498199022999927, 21.269964911000045 ], [ -78.505523240999935, 21.280218817000048 ], [ -78.537993943999936, 21.290350653000075 ], [ -78.545399542999917, 21.29759349200009 ], [ -78.547474738999938, 21.31509023600006 ], [ -78.55687415299991, 21.347479559000078 ], [ -78.558990037999934, 21.366522528000075 ], [ -78.563303188999953, 21.38344961100006 ], [ -78.582102016999897, 21.413885809000078 ], [ -78.586333787999934, 21.428208726000037 ], [ -78.59243730399993, 21.461818752000056 ], [ -78.607818162999934, 21.493719794000071 ], [ -78.628163214999915, 21.521063544000071 ], [ -78.641632785454689, 21.533876702401543 ], [ -78.641499192633603, 21.53393138332666 ], [ -78.604886441356143, 21.548917548306179 ], [ -78.552744920941336, 21.579561671833687 ], [ -78.545794440361135, 21.585220242120442 ], [ -78.542461310940723, 21.589276841952653 ], [ -78.530756599437495, 21.599250392691431 ], [ -78.519516975028353, 21.605580756546658 ], [ -78.496831020635057, 21.615399278553866 ], [ -78.479700283741067, 21.620282700686062 ], [ -78.477168138198977, 21.619714259905152 ], [ -78.474971890340441, 21.618060615305126 ], [ -78.469855923312196, 21.61216950102164 ], [ -78.46802140976024, 21.609534002692044 ], [ -78.465980190633275, 21.607053533993394 ], [ -78.463448045990503, 21.605890814909174 ], [ -78.459365606837252, 21.605864976487453 ], [ -78.453887906401746, 21.61160106024073 ], [ -78.45083899602281, 21.615864366547271 ], [ -78.439392666038714, 21.645268255725398 ], [ -78.429496629665721, 21.669866238036434 ], [ -78.420608282746059, 21.674077867499591 ], [ -78.415156419832897, 21.67307017714694 ], [ -78.39187618713629, 21.671649074745005 ], [ -78.378440313969293, 21.669271958833804 ], [ -78.359707608419399, 21.669943753301538 ], [ -78.352421231054961, 21.671183986751544 ], [ -78.349708218359581, 21.67366445634957 ], [ -78.351620246277321, 21.6757573514206 ], [ -78.356167771625337, 21.678470364115981 ], [ -78.359371710735843, 21.683198757516607 ], [ -78.360844489081899, 21.690355942772499 ], [ -78.348803880794435, 21.707228298147413 ], [ -78.34392045776292, 21.712654324437494 ], [ -78.337641770751077, 21.722111111238803 ], [ -78.334308641330722, 21.724023139156543 ], [ -78.328985968727466, 21.724591579937453 ], [ -78.32655717597288, 21.726116034227573 ], [ -78.32485185363015, 21.729785061331484 ], [ -78.32407670817355, 21.735960395555821 ], [ -78.324412604058409, 21.743866888745913 ], [ -78.325316941623555, 21.749938870182689 ], [ -78.330510423017586, 21.765984402358242 ], [ -78.333766038971532, 21.784613756020008 ], [ -78.330510423017586, 21.790194810142339 ], [ -78.324438443379449, 21.798411363493585 ], [ -78.30940060065717, 21.812183132545499 ], [ -78.299065313813173, 21.818048407508002 ], [ -78.290745408573741, 21.820916448934952 ], [ -78.286430427222399, 21.820606391471756 ], [ -78.283639899261914, 21.819598700219842 ], [ -78.282012092184289, 21.817428289883651 ], [ -78.281030240253358, 21.81412099888496 ], [ -78.280952724988254, 21.808074855869904 ], [ -78.279531622586319, 21.803268948103437 ], [ -78.276586065894207, 21.798152981075191 ], [ -78.270488246935031, 21.79236522137785 ], [ -78.267155116615299, 21.786990871931152 ], [ -78.251910570116706, 21.767379666338513 ], [ -78.241549444850989, 21.762857978512898 ], [ -78.227777675799075, 21.762341212776732 ], [ -78.188865322976255, 21.767224635808304 ], [ -78.183206752689443, 21.769214178991149 ], [ -78.1835684878954, 21.772573146833224 ], [ -78.187754278936836, 21.792985338102881 ], [ -78.187625087727611, 21.796990261091651 ], [ -78.18607479501577, 21.799780789052136 ], [ -78.182974208692769, 21.802545477691638 ], [ -78.168582322915881, 21.809625149481064 ], [ -78.156076625735693, 21.818125921873786 ], [ -78.176152920221057, 21.849777737552529 ], [ -78.193180305226917, 21.866236680878103 ], [ -78.24216956157602, 21.904632269763397 ], [ -78.245838588679931, 21.908120428814698 ], [ -78.251910570116706, 21.925612900914643 ], [ -78.240360887345048, 21.954680894207911 ], [ -78.235115729107576, 21.957626450899966 ], [ -78.228165249426695, 21.960778713167088 ], [ -78.221369797578063, 21.961011257163761 ], [ -78.215401170727432, 21.961967271572291 ], [ -78.199148932976868, 21.966824856182143 ], [ -78.18359432631712, 21.967160752966379 ], [ -78.171295335611262, 21.969512031355123 ], [ -78.162691210430978, 21.973697822396559 ], [ -78.151580777231061, 21.981061713227461 ], [ -78.127422045391086, 22.004652004286527 ], [ -78.109619514029362, 22.018759670122677 ], [ -78.097966477570878, 22.024857489981173 ], [ -78.084556443724864, 22.029353339385068 ], [ -78.078897875236748, 22.033048204011379 ], [ -78.075254685655182, 22.03769908304622 ], [ -78.071585658551271, 22.048318589831013 ], [ -78.070655484363101, 22.05410635042773 ], [ -78.070862189038792, 22.059894111024391 ], [ -78.072825893799973, 22.065165106784207 ], [ -78.074996304136107, 22.068885809832238 ], [ -78.083497077428149, 22.0739242624947 ], [ -78.081820195245825, 22.082791411494441 ] ] ], [ [ [ -78.581695115999935, 20.661607164000088 ], [ -78.578480597999942, 20.65766022300005 ], [ -78.578277147999927, 20.648423570000091 ], [ -78.585682745999918, 20.643622137000079 ], [ -78.59398352799991, 20.64288971600007 ], [ -78.600982225999928, 20.64524974200009 ], [ -78.606312628999945, 20.650213934000078 ], [ -78.611724412999934, 20.653631903000075 ], [ -78.613392706999946, 20.657945054000038 ], [ -78.609038865999935, 20.660711981000077 ], [ -78.604074673999946, 20.658351955000057 ], [ -78.579945441999939, 20.653998114000046 ], [ -78.58071855399993, 20.657375393000052 ], [ -78.581288214999915, 20.659002997000073 ], [ -78.581695115999935, 20.661607164000088 ] ] ], [ [ [ -78.651519334999932, 20.664943752000056 ], [ -78.643625454999949, 20.663275458000044 ], [ -78.629750128999945, 20.65884023600006 ], [ -78.63117428299995, 20.653143622000073 ], [ -78.646473761999914, 20.652289130000042 ], [ -78.656158006999931, 20.65851471600007 ], [ -78.654693162999934, 20.663804429000038 ], [ -78.651519334999932, 20.664943752000056 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-08", "NAME_1": "Ciego de Ávila" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.826568162999934, 20.753241278000075 ], [ -78.807036912999934, 20.757228908000059 ], [ -78.785959438999953, 20.748968817000048 ], [ -78.750843878999945, 20.725978908000059 ], [ -78.768055792999917, 20.712225653000075 ], [ -78.792347785999937, 20.719916083000044 ], [ -78.814808722999942, 20.737453518000052 ], [ -78.826568162999934, 20.753241278000075 ] ] ], [ [ [ -78.925852016999897, 20.807847398000035 ], [ -78.876616990999935, 20.80923086100006 ], [ -78.858550584999932, 20.79954661700009 ], [ -78.847035285999937, 20.773138739000046 ], [ -78.854481574999909, 20.773138739000046 ], [ -78.871490037999934, 20.784857489000046 ], [ -78.94163977799991, 20.792629299000055 ], [ -78.964344855999911, 20.814113674000055 ], [ -78.952137824999909, 20.831366278000075 ], [ -78.942250128999945, 20.839585679000038 ], [ -78.932728644999941, 20.838934637000079 ], [ -78.928089972999942, 20.831122137000079 ], [ -78.926136847999942, 20.820746161000045 ], [ -78.925852016999897, 20.807847398000035 ] ] ], [ [ [ -79.025217251999948, 20.886664130000042 ], [ -79.013539191999939, 20.88226959800005 ], [ -78.989979620999918, 20.87962474200009 ], [ -78.971180792999917, 20.873521226000037 ], [ -78.973988410999937, 20.858791408000059 ], [ -78.98273678299995, 20.844631252000056 ], [ -78.988880988999938, 20.839056708000044 ], [ -78.991688605999911, 20.845445054000038 ], [ -78.995106574999909, 20.849188544000071 ], [ -79.018910285999937, 20.855047919000071 ], [ -79.069203253999945, 20.885972398000035 ], [ -79.079823370999918, 20.897284247000073 ], [ -79.06704667899993, 20.89915599200009 ], [ -79.048817511999914, 20.898016669000071 ], [ -79.032297329999949, 20.893744208000044 ], [ -79.025217251999948, 20.886664130000042 ] ] ], [ [ [ -79.073597785999937, 20.917710679000038 ], [ -79.078602667999917, 20.91828034100007 ], [ -79.09406490799995, 20.917710679000038 ], [ -79.091297980999911, 20.912095445000091 ], [ -79.087228969999899, 20.897284247000073 ], [ -79.115589972999942, 20.910834052000041 ], [ -79.134510870999918, 20.927069403000075 ], [ -79.169178839999915, 20.964911200000074 ], [ -79.169178839999915, 20.972357489000046 ], [ -79.151763475999928, 20.966050523000035 ], [ -79.13890540299991, 20.954657294000071 ], [ -79.127552863999938, 20.94171784100007 ], [ -79.114572719999899, 20.930812893000052 ], [ -79.127674933999913, 20.950873114000046 ], [ -79.149810350999928, 20.976792710000041 ], [ -79.175038214999915, 20.997015692000048 ], [ -79.197092251999948, 20.999701239000046 ], [ -79.197092251999948, 20.992254950000074 ], [ -79.193755662999934, 20.988714911000045 ], [ -79.192860480999911, 20.986761786000045 ], [ -79.192209438999953, 20.984279690000051 ], [ -79.189605272999927, 20.979193427000041 ], [ -79.200998501999948, 20.982407945000091 ], [ -79.210764126999948, 20.987779039000088 ], [ -79.218658006999931, 20.995510158000059 ], [ -79.224436001999948, 21.005845445000091 ], [ -79.182118292999917, 21.008002020000049 ], [ -79.137684699999909, 20.982652085000041 ], [ -79.098947719999899, 20.947007554000038 ], [ -79.073597785999937, 20.917710679000038 ] ] ], [ [ [ -79.38890540299991, 21.123236395000049 ], [ -79.357329881999931, 21.12759023600006 ], [ -79.331898566999939, 21.113185940000051 ], [ -79.292632615999935, 21.074774481000077 ], [ -79.308013475999928, 21.068793036000045 ], [ -79.324777798999946, 21.068304755000042 ], [ -79.340728318999936, 21.07290273600006 ], [ -79.354115363999938, 21.082220770000049 ], [ -79.347401495999918, 21.081691799000055 ], [ -79.32681230399993, 21.082220770000049 ], [ -79.331166144999941, 21.093003648000035 ], [ -79.33853105399993, 21.099839585000041 ], [ -79.346791144999941, 21.101263739000046 ], [ -79.354115363999938, 21.095892645000049 ], [ -79.380238410999937, 21.113836981000077 ], [ -79.38890540299991, 21.123236395000049 ] ] ], [ [ [ -78.426177537999934, 22.462591864000046 ], [ -78.445668097999942, 22.454575914000088 ], [ -78.472767706999946, 22.451157945000091 ], [ -78.518055792999917, 22.452093817000048 ], [ -78.540842251999948, 22.458482164000088 ], [ -78.568226691999939, 22.476304429000038 ], [ -78.609527147999927, 22.483465887000079 ], [ -78.638417120999918, 22.492010809000078 ], [ -78.655995245999918, 22.503119208000044 ], [ -78.641590949999909, 22.514146226000037 ], [ -78.656971808999913, 22.529974677000041 ], [ -78.677357550999943, 22.515692450000074 ], [ -78.69359290299991, 22.507513739000046 ], [ -78.696197068999936, 22.541449286000045 ], [ -78.692534959999932, 22.538723049000055 ], [ -78.683176235999952, 22.53461334800005 ], [ -78.679758266999897, 22.554429429000038 ], [ -78.670643683999913, 22.556545315000051 ], [ -78.660023566999939, 22.551906643000052 ], [ -78.652170376999948, 22.551703192000048 ], [ -78.64126542899993, 22.55337148600006 ], [ -78.596913214999915, 22.544867255000042 ], [ -78.57258053299995, 22.530462958000044 ], [ -78.544422980999911, 22.528387762000079 ], [ -78.515980597999942, 22.530462958000044 ], [ -78.490793423999946, 22.528469143000052 ], [ -78.466420050999943, 22.529852606000077 ], [ -78.450550910999937, 22.54173411700009 ], [ -78.436838344999899, 22.55540599200009 ], [ -78.419056769999941, 22.56195709800005 ], [ -78.396351691999939, 22.559800523000035 ], [ -78.372385219999899, 22.553534247000073 ], [ -78.352040167999917, 22.543036200000074 ], [ -78.340565558999913, 22.528469143000052 ], [ -78.344227667999917, 22.529852606000077 ], [ -78.353586391999897, 22.53461334800005 ], [ -78.349110480999911, 22.521144924000055 ], [ -78.282215949999909, 22.457464911000045 ], [ -78.278472459999932, 22.44867584800005 ], [ -78.28148352799991, 22.438788153000075 ], [ -78.288685675999943, 22.43891022300005 ], [ -78.297678188999953, 22.443101304000038 ], [ -78.305775519999941, 22.445257880000042 ], [ -78.42992102799991, 22.41860586100006 ], [ -78.42992102799991, 22.424750067000048 ], [ -78.427805141999897, 22.427801825000074 ], [ -78.425282355999911, 22.43032461100006 ], [ -78.423329230999911, 22.434393622000073 ], [ -78.422474738999938, 22.44212474200009 ], [ -78.419545050999943, 22.445868231000077 ], [ -78.412953253999945, 22.445379950000074 ], [ -78.406076626999948, 22.444037177000041 ], [ -78.401966925999943, 22.445257880000042 ], [ -78.401112433999913, 22.454657294000071 ], [ -78.40461178299995, 22.46430084800005 ], [ -78.412831183999913, 22.468817450000074 ], [ -78.426177537999934, 22.462591864000046 ] ] ], [ [ [ -78.927194791406464, 22.39874909099774 ], [ -78.828684048999946, 22.388332424000055 ], [ -78.781849738999938, 22.390611070000091 ], [ -78.776722785999937, 22.380560614000046 ], [ -78.757639126999948, 22.322333075000074 ], [ -78.754017706999946, 22.32485586100006 ], [ -78.744618292999917, 22.329169012000079 ], [ -78.73460852799991, 22.316229559000078 ], [ -78.725331183999913, 22.324204820000091 ], [ -78.709868943999936, 22.355902411000045 ], [ -78.722645636999914, 22.372707424000055 ], [ -78.729481574999909, 22.379136460000041 ], [ -78.737782355999911, 22.383775132000039 ], [ -78.737782355999911, 22.390611070000091 ], [ -78.708078579999949, 22.386908270000049 ], [ -78.676136847999942, 22.357001044000071 ], [ -78.566883917999917, 22.32103099200009 ], [ -78.552845831999946, 22.311835028000075 ], [ -78.544300910999937, 22.299058335000041 ], [ -78.524403449999909, 22.283270575000074 ], [ -78.501454230999911, 22.268866278000075 ], [ -78.483957485999952, 22.260321356000077 ], [ -78.460072394999941, 22.253607489000046 ], [ -78.399891730999911, 22.244045315000051 ], [ -78.38149980399993, 22.246649481000077 ], [ -78.381947394999941, 22.239935614000046 ], [ -78.380970831999946, 22.22601959800005 ], [ -78.38149980399993, 22.219305731000077 ], [ -78.371205206999946, 22.224025783000059 ], [ -78.367258266999897, 22.226752020000049 ], [ -78.360503709999932, 22.216782945000091 ], [ -78.351144985999952, 22.197658596000053 ], [ -78.343902147999927, 22.18891022300005 ], [ -78.334868943999936, 22.182562567000048 ], [ -78.316965298999946, 22.173895575000074 ], [ -78.309193488999938, 22.167792059000078 ], [ -78.30142167899993, 22.163804429000038 ], [ -78.291574673999946, 22.163641669000071 ], [ -78.281117316999939, 22.164618231000077 ], [ -78.271636522999927, 22.164048570000091 ], [ -78.237456834999932, 22.151068427000041 ], [ -78.221913214999915, 22.147040106000077 ], [ -78.172352667999917, 22.143622137000079 ], [ -78.163644985999952, 22.139349677000041 ], [ -78.161691860999952, 22.129461981000077 ], [ -78.160878058999913, 22.118109442000048 ], [ -78.155588344999899, 22.109523830000057 ], [ -78.147328253999945, 22.107570705000057 ], [ -78.121693488999938, 22.107855536000045 ], [ -78.124989386999914, 22.106350002000056 ], [ -78.128285285999937, 22.102606512000079 ], [ -78.117787238999938, 22.093451239000046 ], [ -78.105376756999931, 22.089016018000052 ], [ -78.09243730399993, 22.08624909100007 ], [ -78.081820195245825, 22.082791411494441 ], [ -78.083497077428149, 22.0739242624947 ], [ -78.074996304136107, 22.068885809832238 ], [ -78.072825893799973, 22.065165106784207 ], [ -78.070862189038792, 22.059894111024391 ], [ -78.070655484363101, 22.05410635042773 ], [ -78.071585658551271, 22.048318589831013 ], [ -78.075254685655182, 22.03769908304622 ], [ -78.078897875236748, 22.033048204011379 ], [ -78.084556443724864, 22.029353339385068 ], [ -78.097966477570878, 22.024857489981173 ], [ -78.109619514029362, 22.018759670122677 ], [ -78.127422045391086, 22.004652004286527 ], [ -78.151580777231061, 21.981061713227461 ], [ -78.162691210430978, 21.973697822396559 ], [ -78.171295335611262, 21.969512031355123 ], [ -78.18359432631712, 21.967160752966379 ], [ -78.199148932976868, 21.966824856182143 ], [ -78.215401170727432, 21.961967271572291 ], [ -78.221369797578063, 21.961011257163761 ], [ -78.228165249426695, 21.960778713167088 ], [ -78.235115729107576, 21.957626450899966 ], [ -78.240360887345048, 21.954680894207911 ], [ -78.251910570116706, 21.925612900914643 ], [ -78.245838588679931, 21.908120428814698 ], [ -78.24216956157602, 21.904632269763397 ], [ -78.193180305226917, 21.866236680878103 ], [ -78.176152920221057, 21.849777737552529 ], [ -78.156076625735693, 21.818125921873786 ], [ -78.168582322915881, 21.809625149481064 ], [ -78.182974208692769, 21.802545477691638 ], [ -78.18607479501577, 21.799780789052136 ], [ -78.187625087727611, 21.796990261091651 ], [ -78.187754278936836, 21.792985338102881 ], [ -78.1835684878954, 21.772573146833224 ], [ -78.183206752689443, 21.769214178991149 ], [ -78.188865322976255, 21.767224635808304 ], [ -78.227777675799075, 21.762341212776732 ], [ -78.241549444850989, 21.762857978512898 ], [ -78.251910570116706, 21.767379666338513 ], [ -78.267155116615299, 21.786990871931152 ], [ -78.270488246935031, 21.79236522137785 ], [ -78.276586065894207, 21.798152981075191 ], [ -78.279531622586319, 21.803268948103437 ], [ -78.280952724988254, 21.808074855869904 ], [ -78.281030240253358, 21.81412099888496 ], [ -78.282012092184289, 21.817428289883651 ], [ -78.283639899261914, 21.819598700219842 ], [ -78.286430427222399, 21.820606391471756 ], [ -78.290745408573741, 21.820916448934952 ], [ -78.299065313813173, 21.818048407508002 ], [ -78.30940060065717, 21.812183132545499 ], [ -78.324438443379449, 21.798411363493585 ], [ -78.330510423017586, 21.790194810142339 ], [ -78.333766038971532, 21.784613756020008 ], [ -78.330510423017586, 21.765984402358242 ], [ -78.325316941623555, 21.749938870182689 ], [ -78.324412604058409, 21.743866888745913 ], [ -78.32407670817355, 21.735960395555821 ], [ -78.32485185363015, 21.729785061331484 ], [ -78.32655717597288, 21.726116034227573 ], [ -78.328985968727466, 21.724591579937453 ], [ -78.334308641330722, 21.724023139156543 ], [ -78.337641770751077, 21.722111111238803 ], [ -78.34392045776292, 21.712654324437494 ], [ -78.348803880794435, 21.707228298147413 ], [ -78.360844489081899, 21.690355942772499 ], [ -78.359371710735843, 21.683198757516607 ], [ -78.356167771625337, 21.678470364115981 ], [ -78.351620246277321, 21.6757573514206 ], [ -78.349708218359581, 21.67366445634957 ], [ -78.352421231054961, 21.671183986751544 ], [ -78.359707608419399, 21.669943753301538 ], [ -78.378440313969293, 21.669271958833804 ], [ -78.39187618713629, 21.671649074745005 ], [ -78.415156419832897, 21.67307017714694 ], [ -78.420608282746059, 21.674077867499591 ], [ -78.429496629665721, 21.669866238036434 ], [ -78.439392666038714, 21.645268255725398 ], [ -78.45083899602281, 21.615864366547271 ], [ -78.453887906401746, 21.61160106024073 ], [ -78.459365606837252, 21.605864976487453 ], [ -78.463448045990503, 21.605890814909174 ], [ -78.465980190633275, 21.607053533993394 ], [ -78.46802140976024, 21.609534002692044 ], [ -78.469855923312196, 21.61216950102164 ], [ -78.474971890340441, 21.618060615305126 ], [ -78.477168138198977, 21.619714259905152 ], [ -78.479700283741067, 21.620282700686062 ], [ -78.496831020635057, 21.615399278553866 ], [ -78.519516975028353, 21.605580756546658 ], [ -78.530756599437495, 21.599250392691431 ], [ -78.542461310940723, 21.589276841952653 ], [ -78.545794440361135, 21.585220242120442 ], [ -78.552744920941336, 21.579561671833687 ], [ -78.604886441356143, 21.548917548306179 ], [ -78.641499192633603, 21.53393138332666 ], [ -78.641632785454689, 21.533876702401543 ], [ -78.649037238999938, 21.540920315000051 ], [ -78.665353969999899, 21.551174221000053 ], [ -78.680978969999899, 21.556626695000091 ], [ -78.733998175999943, 21.564357815000051 ], [ -78.74632727799991, 21.568060614000046 ], [ -78.751088019999941, 21.575506903000075 ], [ -78.744618292999917, 21.58930084800005 ], [ -78.733306443999936, 21.583238023000035 ], [ -78.720611131999931, 21.581244208000044 ], [ -78.693104620999918, 21.581854559000078 ], [ -78.689116990999935, 21.586411851000037 ], [ -78.694203253999945, 21.596665757000039 ], [ -78.706776495999918, 21.612616278000075 ], [ -78.713693813999953, 21.61859772300005 ], [ -78.723947719999899, 21.625555731000077 ], [ -78.744618292999917, 21.636542059000078 ], [ -78.759266730999911, 21.640611070000091 ], [ -78.766509568999936, 21.639715887000079 ], [ -78.773060675999943, 21.635646877000056 ], [ -78.785552537999934, 21.63031647300005 ], [ -78.831898566999939, 21.620306708000044 ], [ -78.878407355999911, 21.616034247000073 ], [ -78.883371548999946, 21.614203192000048 ], [ -78.889027472999942, 21.60968659100007 ], [ -78.893544074999909, 21.604193427000041 ], [ -78.895415818999936, 21.599269924000055 ], [ -78.89875240799995, 21.595526434000078 ], [ -78.90648352799991, 21.594671942000048 ], [ -78.937082485999952, 21.596380927000041 ], [ -78.949208136999914, 21.598781643000052 ], [ -78.959950325247291, 21.599554754748112 ], [ -78.964848980096349, 21.620314369412597 ], [ -78.967760748359808, 21.650887929434361 ], [ -78.964848980096349, 21.677093838409917 ], [ -78.970672515724004, 21.690196792447978 ], [ -78.992510772753917, 21.704755630168165 ], [ -79.017260798047403, 21.714946816842087 ], [ -79.03181963576759, 21.694564443494244 ], [ -79.03181963576759, 21.678549721192667 ], [ -79.043466707022901, 21.665446767154549 ], [ -79.072584383362596, 21.653799696798558 ], [ -79.100246175120844, 21.653799696798558 ], [ -79.108981478112696, 21.665446767154549 ], [ -79.10315794338436, 21.682917373138253 ], [ -79.098790291438775, 21.710579164896501 ], [ -79.106069710748557, 21.726593887198135 ], [ -79.122084433050134, 21.749888027910117 ], [ -79.114805012841032, 21.765902750211751 ], [ -79.092966755811119, 21.809579265170953 ], [ -79.082775570036517, 21.848888128184569 ], [ -79.072584383362596, 21.870726385214482 ], [ -79.058025544743089, 21.89693229418998 ], [ -79.046378474387097, 21.91877055121995 ], [ -79.040554938759385, 21.939152924567793 ], [ -79.028907868403394, 21.946432342978255 ], [ -79.012893146101817, 21.944976460195448 ], [ -78.998334308381629, 21.942064691931989 ], [ -78.992510772753917, 21.95371176228798 ], [ -78.97504016677027, 21.978461787581409 ], [ -78.960481329050083, 22.003211811975518 ], [ -78.960481329050083, 22.026505952687558 ], [ -78.964848980096349, 22.043976559570524 ], [ -78.977951935033786, 22.049800094298917 ], [ -78.999790192063699, 22.059991280972838 ], [ -79.030363752085464, 22.08328542258414 ], [ -79.046378474387097, 22.096388375722938 ], [ -79.047834358069167, 22.116770749970101 ], [ -79.03327552034898, 22.148800194573312 ], [ -79.034731404031049, 22.17646198633156 ], [ -79.021628449093612, 22.188109056687608 ], [ -79.012893146101817, 22.211403198298967 ], [ -78.999790192063699, 22.23324145532888 ], [ -78.985231354343512, 22.256535596040919 ], [ -78.97504016677027, 22.275462085706693 ], [ -78.966304863778419, 22.307491530309846 ], [ -78.956113678003817, 22.32787390275837 ], [ -78.950290142376161, 22.339520973114418 ], [ -78.94155483938431, 22.346800393323463 ], [ -78.934275420074584, 22.354079811733925 ], [ -78.931363652710388, 22.384653371755689 ], [ -78.927194791406464, 22.39874909099774 ] ] ], [ [ [ -78.737660285999937, 22.548407294000071 ], [ -78.735422329999949, 22.551255601000037 ], [ -78.728260870999918, 22.547919012000079 ], [ -78.72883053299995, 22.54165273600006 ], [ -78.736195441999939, 22.530585028000075 ], [ -78.738758917999917, 22.524318752000056 ], [ -78.756988084999932, 22.518540757000039 ], [ -78.765980597999942, 22.518784898000035 ], [ -78.76789303299995, 22.525213934000078 ], [ -78.768137173999946, 22.54165273600006 ], [ -78.762196417999917, 22.543524481000077 ], [ -78.74828040299991, 22.53978099200009 ], [ -78.738880988999938, 22.541001695000091 ], [ -78.737660285999937, 22.548407294000071 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-11", "NAME_1": "Holguín" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -75.517079230999911, 20.794256903000075 ], [ -75.508168097999942, 20.78656647300005 ], [ -75.493763800999943, 20.761053778000075 ], [ -75.485707160999937, 20.749823309000078 ], [ -75.482167120999918, 20.737779039000088 ], [ -75.500843878999945, 20.737941799000055 ], [ -75.534087693999936, 20.74640534100007 ], [ -75.551828579999949, 20.749009507000039 ], [ -75.567534959999932, 20.756781317000048 ], [ -75.577748175999943, 20.769517320000091 ], [ -75.578480597999942, 20.78742096600007 ], [ -75.529164191999939, 20.795803127000056 ], [ -75.517079230999911, 20.794256903000075 ] ] ], [ [ [ -76.313547330045253, 21.251898504712187 ], [ -76.290272589999915, 21.233710028000075 ], [ -76.275868292999917, 21.225043036000045 ], [ -76.169667120999918, 21.187160549000055 ], [ -76.137806769999941, 21.167222398000035 ], [ -76.133412238999938, 21.143703518000052 ], [ -76.129994269999941, 21.135565497000073 ], [ -76.130726691999939, 21.114162502000056 ], [ -76.126576300999943, 21.102118231000077 ], [ -76.116769985999952, 21.091498114000046 ], [ -76.109852667999917, 21.092230536000045 ], [ -76.09984290299991, 21.102118231000077 ], [ -76.083811001999948, 21.110541083000044 ], [ -76.072661912999934, 21.112982489000046 ], [ -76.058257615999935, 21.109564520000049 ], [ -76.048085089999915, 21.10382721600007 ], [ -76.041005011999914, 21.096665757000039 ], [ -76.037220831999946, 21.08734772300005 ], [ -76.037180141999897, 21.074774481000077 ], [ -76.030913865999935, 21.074774481000077 ], [ -76.028920050999943, 21.079575914000088 ], [ -76.025746222999942, 21.084540106000077 ], [ -76.023548956999946, 21.089056708000044 ], [ -76.016713019999941, 21.07367584800005 ], [ -76.008168097999942, 21.070298570000091 ], [ -76.00218665299991, 21.078070380000042 ], [ -76.003041144999941, 21.095892645000049 ], [ -75.994618292999917, 21.094549872000073 ], [ -75.967884894999941, 21.093980210000041 ], [ -75.95531165299991, 21.095892645000049 ], [ -75.949045376999948, 21.099798895000049 ], [ -75.933461066999939, 21.112941799000055 ], [ -75.924875454999949, 21.115708726000037 ], [ -75.91242428299995, 21.115179755000042 ], [ -75.899891730999911, 21.112779039000088 ], [ -75.890248175999943, 21.10773346600007 ], [ -75.881947394999941, 21.090277411000045 ], [ -75.873524542999917, 21.088771877000056 ], [ -75.868275519999941, 21.093085028000075 ], [ -75.87336178299995, 21.102118231000077 ], [ -75.821766730999911, 21.136867580000057 ], [ -75.816273566999939, 21.135646877000056 ], [ -75.801258917999917, 21.129299221000053 ], [ -75.798207160999937, 21.126613674000055 ], [ -75.794016079999949, 21.119045315000051 ], [ -75.784291144999941, 21.118638414000088 ], [ -75.766835089999915, 21.123236395000049 ], [ -75.732289191999939, 21.123277085000041 ], [ -75.704009568999936, 21.118963934000078 ], [ -75.684315558999913, 21.103094794000071 ], [ -75.675363735999952, 21.068589585000041 ], [ -75.635894334999932, 21.076361395000049 ], [ -75.613148566999939, 21.062567450000074 ], [ -75.578480597999942, 21.013373114000046 ], [ -75.598947719999899, 20.972357489000046 ], [ -75.604847785999937, 20.965399481000077 ], [ -75.616037563999953, 20.956732489000046 ], [ -75.620106574999909, 20.951239325000074 ], [ -75.621937628999945, 20.944810289000088 ], [ -75.624175584999932, 20.929877020000049 ], [ -75.626332160999937, 20.923976955000057 ], [ -75.634877081999946, 20.912543036000045 ], [ -75.64875240799995, 20.899400132000039 ], [ -75.665150519999941, 20.89008209800005 ], [ -75.681548631999931, 20.890448309000078 ], [ -75.686512824999909, 20.900051174000055 ], [ -75.690256313999953, 20.915187893000052 ], [ -75.696400519999941, 20.924872137000079 ], [ -75.708851691999939, 20.917710679000038 ], [ -75.71703040299991, 20.922552802000041 ], [ -75.723622199999909, 20.923407294000071 ], [ -75.729481574999909, 20.921454169000071 ], [ -75.735503709999932, 20.917710679000038 ], [ -75.727365688999953, 20.916571356000077 ], [ -75.721424933999913, 20.914455471000053 ], [ -75.717518683999913, 20.910345770000049 ], [ -75.715687628999945, 20.903509833000044 ], [ -75.744007941999939, 20.901556708000044 ], [ -75.743397589999915, 20.889349677000041 ], [ -75.730458136999914, 20.872219143000052 ], [ -75.721831834999932, 20.855047919000071 ], [ -75.715687628999945, 20.855047919000071 ], [ -75.704497850999928, 20.870835679000038 ], [ -75.678130662999934, 20.878241278000075 ], [ -75.648182745999918, 20.87954336100006 ], [ -75.626332160999937, 20.876776434000078 ], [ -75.584868943999936, 20.856838283000059 ], [ -75.578480597999942, 20.851955471000053 ], [ -75.577381964999915, 20.838080145000049 ], [ -75.573312954999949, 20.827541408000059 ], [ -75.564930792999917, 20.821478583000044 ], [ -75.551136847999942, 20.821519273000035 ], [ -75.559071417999917, 20.797674872000073 ], [ -75.573150193999936, 20.797674872000073 ], [ -75.589100714999915, 20.807684637000079 ], [ -75.602691209999932, 20.814113674000055 ], [ -75.610178188999953, 20.816555080000057 ], [ -75.613433397999927, 20.822495835000041 ], [ -75.615712042999917, 20.829657294000071 ], [ -75.620106574999909, 20.835842190000051 ], [ -75.627430792999917, 20.841457424000055 ], [ -75.630604620999918, 20.843085028000075 ], [ -75.685373501999948, 20.835109768000052 ], [ -75.704741990999935, 20.828680731000077 ], [ -75.770253058999913, 20.835842190000051 ], [ -75.765004035999937, 20.824408270000049 ], [ -75.766346808999913, 20.811590887000079 ], [ -75.776478644999941, 20.78742096600007 ], [ -75.77570553299995, 20.781317450000074 ], [ -75.776600714999915, 20.768703518000052 ], [ -75.779367641999897, 20.756903387000079 ], [ -75.783924933999913, 20.74640534100007 ], [ -75.774647589999915, 20.737616278000075 ], [ -75.763050910999937, 20.716009833000044 ], [ -75.724517381999931, 20.695502020000049 ], [ -75.708851691999939, 20.690578518000052 ], [ -75.702015753999945, 20.701117255000042 ], [ -75.691029425999943, 20.722886460000041 ], [ -75.643177863999938, 20.760728257000039 ], [ -75.63312740799995, 20.780585028000075 ], [ -75.617298956999946, 20.768622137000079 ], [ -75.60773678299995, 20.753159898000035 ], [ -75.60570227799991, 20.735988674000055 ], [ -75.612619594999899, 20.718491929000038 ], [ -75.586822068999936, 20.721502997000073 ], [ -75.577504035999937, 20.718451239000046 ], [ -75.581898566999939, 20.707953192000048 ], [ -75.583566860999952, 20.698228257000039 ], [ -75.573312954999949, 20.691392320000091 ], [ -75.551136847999942, 20.684393622000073 ], [ -75.556711391999897, 20.706447658000059 ], [ -75.497792120999918, 20.693426825000074 ], [ -75.482248501999948, 20.71165599200009 ], [ -75.476063605999911, 20.71165599200009 ], [ -75.471262173999946, 20.706122137000079 ], [ -75.464711066999939, 20.70062897300005 ], [ -75.456857876999948, 20.695502020000049 ], [ -75.448109503999945, 20.691148179000038 ], [ -75.440663214999915, 20.71165599200009 ], [ -75.457183397999927, 20.717962958000044 ], [ -75.465931769999941, 20.719224351000037 ], [ -75.476063605999911, 20.718491929000038 ], [ -75.463612433999913, 20.734076239000046 ], [ -75.43968665299991, 20.740627346000053 ], [ -75.413563605999911, 20.741156317000048 ], [ -75.394154425999943, 20.738959052000041 ], [ -75.376576300999943, 20.732163804000038 ], [ -75.356027798999946, 20.719916083000044 ], [ -75.349232550999943, 20.708482164000088 ], [ -75.373036261999914, 20.704250393000052 ], [ -75.364328579999949, 20.691392320000091 ], [ -75.359364386999914, 20.677557684000078 ], [ -75.352609829999949, 20.677557684000078 ], [ -75.351389126999948, 20.681870835000041 ], [ -75.345773891999897, 20.691148179000038 ], [ -75.337228969999899, 20.669663804000038 ], [ -75.31281490799995, 20.664740302000041 ], [ -75.256337042999917, 20.670721747000073 ], [ -75.27375240799995, 20.681586005000042 ], [ -75.311594204999949, 20.699448960000041 ], [ -75.331410285999937, 20.704250393000052 ], [ -75.318714972999942, 20.71710846600007 ], [ -75.294300910999937, 20.723130601000037 ], [ -75.267974412999934, 20.723334052000041 ], [ -75.249501105999911, 20.718491929000038 ], [ -75.256337042999917, 20.725978908000059 ], [ -75.241037563999953, 20.724798895000049 ], [ -75.194325324999909, 20.715643622000073 ], [ -75.18195553299995, 20.709133205000057 ], [ -75.178578253999945, 20.702215887000079 ], [ -75.194894985999952, 20.69798411700009 ], [ -75.194894985999952, 20.691148179000038 ], [ -75.166981574999909, 20.684393622000073 ], [ -75.165150519999941, 20.686428127000056 ], [ -75.164865688999953, 20.68781159100007 ], [ -75.163970506999931, 20.689195054000038 ], [ -75.160755988999938, 20.691148179000038 ], [ -75.14907792899993, 20.683091539000088 ], [ -75.131825324999909, 20.687404690000051 ], [ -75.115345831999946, 20.686590887000079 ], [ -75.10610917899993, 20.663275458000044 ], [ -75.104115363999938, 20.66860586100006 ], [ -75.099598761999914, 20.677679755000042 ], [ -75.098703579999949, 20.684393622000073 ], [ -75.089426235999952, 20.677679755000042 ], [ -75.08039303299995, 20.673651434000078 ], [ -75.071929490999935, 20.673244533000059 ], [ -75.064564581999946, 20.677557684000078 ], [ -75.07876542899993, 20.691148179000038 ], [ -74.99836178299995, 20.700751044000071 ], [ -74.978871222999942, 20.694566148000035 ], [ -74.969227667999917, 20.689520575000074 ], [ -74.959095831999946, 20.687323309000078 ], [ -74.951079881999931, 20.683579820000091 ], [ -74.947865363999938, 20.67413971600007 ], [ -74.940744594999899, 20.668402411000045 ], [ -74.924672003999945, 20.668036200000074 ], [ -74.900054490999935, 20.670721747000073 ], [ -74.883534308999913, 20.659491278000075 ], [ -74.869292772999927, 20.64594147300005 ], [ -74.850900844999899, 20.634588934000078 ], [ -74.771839972999942, 20.625799872000073 ], [ -74.751210089999915, 20.619574286000045 ], [ -74.735585089999915, 20.609279690000051 ], [ -74.745716925999943, 20.603949286000045 ], [ -74.749867316999939, 20.602443752000056 ], [ -74.735585089999915, 20.578558661000045 ], [ -74.734934048999946, 20.567613023000035 ], [ -74.732574022999927, 20.564846096000053 ], [ -74.728382941999939, 20.564439195000091 ], [ -74.721913214999915, 20.56085846600007 ], [ -74.715167585115921, 20.556063378921806 ], [ -74.727758754762704, 20.549857082838059 ], [ -74.737603116090895, 20.542544867051959 ], [ -74.740936244611987, 20.540658678455202 ], [ -74.744010993412587, 20.539986883987467 ], [ -74.751891649080335, 20.540167752040134 ], [ -74.75599992485661, 20.539728502468392 ], [ -74.759591436695416, 20.538074856069727 ], [ -74.767187873321689, 20.531796169957261 ], [ -74.772510545924945, 20.5260084093606 ], [ -74.779641892759116, 20.516164048931671 ], [ -74.784706183843298, 20.506681422809379 ], [ -74.790287237965629, 20.491023464261445 ], [ -74.791604986680795, 20.471567288299696 ], [ -74.783155891131457, 20.444773058130124 ], [ -74.823618536666118, 20.42924428989204 ], [ -74.826409063727283, 20.427280585130859 ], [ -74.829147914844384, 20.42443838122631 ], [ -74.830594854768719, 20.421415310168413 ], [ -74.83214514837988, 20.417384547858603 ], [ -74.833230353098315, 20.411674303426366 ], [ -74.834703132343691, 20.40847036431586 ], [ -74.838708055332461, 20.406765041973074 ], [ -74.844986742344247, 20.408186143475746 ], [ -74.858396776190261, 20.413999742494127 ], [ -74.868602870925713, 20.421079413384177 ], [ -74.879635789759902, 20.4273322619743 ], [ -74.91617102667152, 20.443403632571574 ], [ -74.949838223055565, 20.466347968483944 ], [ -74.959527553853491, 20.471231391515516 ], [ -74.968777635079789, 20.472058213815501 ], [ -74.99577857082437, 20.468311672345806 ], [ -75.001204597114452, 20.466735541212245 ], [ -75.003400844972987, 20.464823513294505 ], [ -74.999447597928281, 20.456994534470198 ], [ -74.998336554788182, 20.454074815300487 ], [ -74.998104010791451, 20.451490993814275 ], [ -75.000196905862481, 20.444437161345888 ], [ -75.000713670699326, 20.441284898179504 ], [ -75.000506965124316, 20.439734605467663 ], [ -74.999344245140776, 20.439372870261764 ], [ -74.991411912629644, 20.438571886383443 ], [ -74.985494960823758, 20.433921007348602 ], [ -74.981774257775783, 20.429554348254555 ], [ -74.979242113133012, 20.425136013216445 ], [ -74.978001878783687, 20.422242133367718 ], [ -74.97725256995011, 20.419477443828953 ], [ -74.977304246793551, 20.416686916767787 ], [ -74.978234421881041, 20.41304372808554 ], [ -74.982239345769187, 20.412036037732946 ], [ -74.988776415199368, 20.413224596138207 ], [ -75.015854865309791, 20.43115631780978 ], [ -75.048255988023413, 20.433714300874271 ], [ -75.070476854423305, 20.45081920024586 ], [ -75.098847214827117, 20.479292914336497 ], [ -75.104970873107277, 20.484176337368069 ], [ -75.110474412863823, 20.484744778148979 ], [ -75.116882290185515, 20.483220322959539 ], [ -75.139878302941327, 20.475003770507612 ], [ -75.158352626972146, 20.465572822128024 ], [ -75.164605475562212, 20.464668484562878 ], [ -75.169488897694464, 20.465650336493809 ], [ -75.177834642254936, 20.472290757812232 ], [ -75.183028123648967, 20.473298448164826 ], [ -75.189694383389053, 20.471696479508921 ], [ -75.212354499360629, 20.459216619851134 ], [ -75.225764533206643, 20.447692776400515 ], [ -75.228296677849414, 20.442111721378808 ], [ -75.231397264172415, 20.412036037732946 ], [ -75.240492315767767, 20.396791490334977 ], [ -75.255065069597265, 20.407152614701374 ], [ -75.25653784884264, 20.41017568575927 ], [ -75.260181036625511, 20.412578640092136 ], [ -75.263901739673543, 20.412191067363835 ], [ -75.282221034972792, 20.403741970015915 ], [ -75.286742722798408, 20.403302721343493 ], [ -75.291109381892454, 20.404930528421119 ], [ -75.299971890390395, 20.41017568575927 ], [ -75.306663987652882, 20.415911770411867 ], [ -75.307981737267369, 20.417617091855277 ], [ -75.311495733841014, 20.423120632511143 ], [ -75.316973436075216, 20.428159085173604 ], [ -75.326481899719909, 20.434256904132781 ], [ -75.330719366705409, 20.437977607180812 ], [ -75.337230597713926, 20.439889635098552 ], [ -75.344801195019102, 20.438597723905843 ], [ -75.364076503827562, 20.425756129941419 ], [ -75.375471157867651, 20.422862250092749 ], [ -75.401464403259581, 20.456116034427453 ], [ -75.417096524285171, 20.468905951548436 ], [ -75.423504400707486, 20.476812446537167 ], [ -75.424589606325242, 20.480429795898374 ], [ -75.420403815283862, 20.482729397443734 ], [ -75.416760626601615, 20.485571601348283 ], [ -75.414305996324686, 20.489111436343705 ], [ -75.412729865191125, 20.492418728241717 ], [ -75.411748013260194, 20.495777696083792 ], [ -75.409680955711508, 20.499420884765982 ], [ -75.407200487012858, 20.502263087771269 ], [ -75.403479783964826, 20.504330146219274 ], [ -75.396736008959635, 20.506965644548814 ], [ -75.395004849094505, 20.508386746051485 ], [ -75.393402880438543, 20.513115139452111 ], [ -75.390147263585334, 20.537635606498043 ], [ -75.390689866843843, 20.54432770376053 ], [ -75.392705248448465, 20.547505805348635 ], [ -75.401929491252986, 20.543242499042094 ], [ -75.406993781437848, 20.541640530386132 ], [ -75.411076218792459, 20.540865383130892 ], [ -75.423426887241021, 20.540762031242707 ], [ -75.467222663095413, 20.532984727463202 ], [ -75.485800339913737, 20.538488267219748 ], [ -75.501794196145227, 20.550528876406531 ], [ -75.507401088689278, 20.551846625121641 ], [ -75.511638556574098, 20.55086477319071 ], [ -75.515023362837894, 20.54815176049533 ], [ -75.518744065885926, 20.546136378890765 ], [ -75.524816047322702, 20.544250190294008 ], [ -75.528562587893077, 20.542467352686174 ], [ -75.53174068858192, 20.540245266405918 ], [ -75.535538906894999, 20.535749417001966 ], [ -75.55543433332781, 20.516422431350122 ], [ -75.570498012673113, 20.505182806940979 ], [ -75.57793941876912, 20.500712795059428 ], [ -75.582590297803961, 20.499550075975208 ], [ -75.5953543774026, 20.506035468562004 ], [ -75.601788093145956, 20.50828339326398 ], [ -75.609203660820299, 20.511771552315281 ], [ -75.611425747100554, 20.510634669854142 ], [ -75.61421627506104, 20.50712067328044 ], [ -75.61555986219787, 20.503115750291613 ], [ -75.61576656777288, 20.500015163968612 ], [ -75.614836391786014, 20.496888739223891 ], [ -75.609565396026198, 20.485985012498304 ], [ -75.612510951818933, 20.477019151212858 ], [ -75.61555986219787, 20.469836127535245 ], [ -75.658813035693015, 20.441491603754514 ], [ -75.701342739675681, 20.437874254393307 ], [ -75.73314958408605, 20.442060045434744 ], [ -75.744337530752432, 20.441052354182773 ], [ -75.752399055372109, 20.439036974376847 ], [ -75.824668545317081, 20.407617702694779 ], [ -75.85626868415244, 20.410098171393486 ], [ -75.873011848318129, 20.418314723845413 ], [ -75.876655036100999, 20.421725369430249 ], [ -75.87805030008127, 20.424360866860525 ], [ -75.879445563162221, 20.427797349967705 ], [ -75.883553839837816, 20.443972073352484 ], [ -75.900141975271936, 20.448080349128816 ], [ -75.929752570025073, 20.467071437996424 ], [ -75.937193977020399, 20.472936712958926 ], [ -75.940578783284195, 20.477122504000363 ], [ -75.939364387356591, 20.479215399970712 ], [ -75.936806403392779, 20.482160955763504 ], [ -75.934222581906624, 20.48629507086082 ], [ -75.931716274786254, 20.491023464261445 ], [ -75.930786098799388, 20.497844752733158 ], [ -75.933292405919758, 20.500454413540353 ], [ -75.940139532813191, 20.501642971046238 ], [ -75.952438524418369, 20.501462103892948 ], [ -75.969827643730753, 20.502960719761404 ], [ -75.977243212304415, 20.505828762087674 ], [ -75.980498827358986, 20.509704494766595 ], [ -75.976183845108324, 20.520143134398097 ], [ -75.985614794387232, 20.534767564171716 ], [ -76.033027919602773, 20.567866318875474 ], [ -76.046670498344781, 20.573602403528071 ], [ -76.049202643886872, 20.57241384512281 ], [ -76.051398891745464, 20.56608348216696 ], [ -76.048970099890198, 20.557505195408453 ], [ -76.041864589679051, 20.541433823911802 ], [ -76.04106360490141, 20.534690049805931 ], [ -76.043440720812612, 20.529574082777685 ], [ -76.061346604961841, 20.522675279040868 ], [ -76.066307543258517, 20.519755560770477 ], [ -76.079019945114339, 20.509161892407406 ], [ -76.094548713352424, 20.499395046344318 ], [ -76.096925829263569, 20.495984402558122 ], [ -76.09640906442678, 20.493374741750927 ], [ -76.092869229431358, 20.492031155513416 ], [ -76.090285407045883, 20.488853053925254 ], [ -76.088347540706422, 20.479499619911508 ], [ -76.08173295780972, 20.464435940566204 ], [ -76.084368456139316, 20.442008367691983 ], [ -76.090543788564958, 20.420562649446708 ], [ -76.092610847012963, 20.417462063123708 ], [ -76.111343552562914, 20.400615546170513 ], [ -76.114805874091815, 20.408315335584234 ], [ -76.107106085577357, 20.424128322863794 ], [ -76.106150072068147, 20.42828827638283 ], [ -76.106770188793178, 20.430277817767035 ], [ -76.111756964612198, 20.428779201898635 ], [ -76.116304490859534, 20.42846914353612 ], [ -76.121394618566796, 20.42983856909467 ], [ -76.130463832639748, 20.434153551345275 ], [ -76.138189459575869, 20.436892402462377 ], [ -76.146457688871237, 20.438597723905843 ], [ -76.155423550156684, 20.438881943846638 ], [ -76.17965979726182, 20.437590033553192 ], [ -76.204335293039321, 20.474331976939141 ], [ -76.233971727113499, 20.502779853507434 ], [ -76.244410366745001, 20.509471950769921 ], [ -76.253092007190389, 20.513631904288957 ], [ -76.28006710541257, 20.519574692717867 ], [ -76.300530971726971, 20.528566392425034 ], [ -76.312881639276213, 20.53213206584212 ], [ -76.338048062368159, 20.536369533726997 ], [ -76.360372280656236, 20.544560247757204 ], [ -76.372567918574589, 20.545800483005848 ], [ -76.366935186709497, 20.5668586294222 ], [ -76.367813686752243, 20.571948757129405 ], [ -76.370785081866018, 20.578692532134653 ], [ -76.374479947391649, 20.581250515199088 ], [ -76.377890591177845, 20.582413235182628 ], [ -76.380758632604795, 20.582723294444463 ], [ -76.385306158852131, 20.581741440714893 ], [ -76.387347377979097, 20.580397854477383 ], [ -76.390137905939582, 20.578072415409622 ], [ -76.393057624209973, 20.576547960220182 ], [ -76.396132372111254, 20.576392931488556 ], [ -76.404762335713201, 20.579932766483978 ], [ -76.439566412759746, 20.589906318122075 ], [ -76.485894335055491, 20.615770372304837 ], [ -76.503826056727121, 20.623289292766628 ], [ -76.550670742061072, 20.633857122708037 ], [ -76.559843308921529, 20.638223781802083 ], [ -76.564416672691266, 20.641892808905993 ], [ -76.564442512012306, 20.646181951835615 ], [ -76.562814704035361, 20.660935573717722 ], [ -76.563408983237991, 20.67264028612027 ], [ -76.564520026378091, 20.680055853794613 ], [ -76.570307786974752, 20.696463121176066 ], [ -76.581237352122116, 20.697083237901097 ], [ -76.608160772601536, 20.683828232786709 ], [ -76.618237677926459, 20.681787014559063 ], [ -76.627901171202097, 20.682432969705758 ], [ -76.635394253242168, 20.684835924038623 ], [ -76.649915331127602, 20.68772980388735 ], [ -76.657976853948639, 20.690985418941921 ], [ -76.664462245636116, 20.696127224391887 ], [ -76.673608974974229, 20.710674139799721 ], [ -76.677174649290635, 20.713180446920092 ], [ -76.6803527490801, 20.713180446920092 ], [ -76.689938727989897, 20.70793528958194 ], [ -76.699783088418769, 20.704524643997104 ], [ -76.707250332037177, 20.706152451974049 ], [ -76.712831387058827, 20.70964061102535 ], [ -76.717043015622664, 20.714498196534521 ], [ -76.721900601131836, 20.722301336937107 ], [ -76.712392136587823, 20.725634467256839 ], [ -76.702237717796436, 20.732068183000251 ], [ -76.699473029156934, 20.736564032404146 ], [ -76.698827074010239, 20.742636012941603 ], [ -76.702547777058271, 20.752454534948811 ], [ -76.707818772818086, 20.759534206738238 ], [ -76.71872250044305, 20.770825507091445 ], [ -76.720892909879865, 20.776406562113152 ], [ -76.721125453876596, 20.784287217780843 ], [ -76.71965267642986, 20.797283840476837 ], [ -76.71678463410359, 20.806404731393229 ], [ -76.709575772004257, 20.819608058764857 ], [ -76.691308152649128, 20.841932277952253 ], [ -76.687923347284652, 20.851518255962731 ], [ -76.686347215251772, 20.865496731488975 ], [ -76.687303228760982, 20.936138414356321 ], [ -76.674668342170264, 20.970348212200236 ], [ -76.662756924192706, 20.965309760437094 ], [ -76.652809210976272, 20.956886502410157 ], [ -76.647279832798006, 20.953320828093752 ], [ -76.642809820916511, 20.951563828907581 ], [ -76.636789517222439, 20.951098740914119 ], [ -76.629735683854733, 20.951641344172685 ], [ -76.613586798891617, 20.955181179168051 ], [ -76.56082516085246, 20.976626899212022 ], [ -76.547802699734802, 20.979804999001487 ], [ -76.538423428198655, 20.980399278204118 ], [ -76.532558153236153, 20.978332221554751 ], [ -76.527623054260516, 20.977557074299511 ], [ -76.5207759255685, 20.978409735920536 ], [ -76.517236090573135, 20.981277778246863 ], [ -76.514368049146128, 20.996212267282317 ], [ -76.50245663116857, 21.024195054957829 ], [ -76.48356889508841, 21.042307643782692 ], [ -76.458815884045805, 21.060652778402982 ], [ -76.453079800292528, 21.063598334195774 ], [ -76.437008429695254, 21.076362412895037 ], [ -76.392592536216569, 21.103182481486328 ], [ -76.370836757810139, 21.111709093200091 ], [ -76.343913337330662, 21.12749624295725 ], [ -76.338513150361564, 21.134059149909831 ], [ -76.336859503962899, 21.140337836022297 ], [ -76.340295987070135, 21.158243720171527 ], [ -76.339960090285899, 21.164470730339929 ], [ -76.334740769570828, 21.171059474814911 ], [ -76.330839200268883, 21.174444281078706 ], [ -76.325671556397197, 21.177570705823371 ], [ -76.318075120670244, 21.194262193145676 ], [ -76.314199387991323, 21.250667018967761 ], [ -76.313547330045253, 21.251898504712187 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-99", "NAME_1": "Isla de la Juventud" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -81.372303839999915, 21.70538971600007 ], [ -81.376535610999952, 21.703070380000042 ], [ -81.417551235999952, 21.667914130000042 ], [ -81.496693488999938, 21.618475653000075 ], [ -81.527699347999942, 21.605861721000053 ], [ -81.560658331999946, 21.60297272300005 ], [ -81.56078040299991, 21.622381903000075 ], [ -81.551380988999938, 21.62759023600006 ], [ -81.523508266999897, 21.623439846000053 ], [ -81.512440558999913, 21.630845445000091 ], [ -81.503041144999941, 21.645697333000044 ], [ -81.493519660999937, 21.657049872000073 ], [ -81.482167120999918, 21.653876044000071 ], [ -81.46906490799995, 21.648179429000038 ], [ -81.454497850999928, 21.65180084800005 ], [ -81.442697719999899, 21.659979559000078 ], [ -81.43781490799995, 21.667873440000051 ], [ -81.431711391999897, 21.68500397300005 ], [ -81.417307094999899, 21.697211005000042 ], [ -81.385975714999915, 21.715969143000052 ], [ -81.377674933999913, 21.718939520000049 ], [ -81.371652798999946, 21.714748440000051 ], [ -81.36937415299991, 21.708563544000071 ], [ -81.372303839999915, 21.70538971600007 ] ] ], [ [ [ -82.568023240999935, 21.636542059000078 ], [ -82.575184699999909, 21.624701239000046 ], [ -82.567128058999913, 21.612005927000041 ], [ -82.552642381999931, 21.601385809000078 ], [ -82.540760870999918, 21.595526434000078 ], [ -82.550892706999946, 21.580267645000049 ], [ -82.571441209999932, 21.559759833000044 ], [ -82.594634568999936, 21.541815497000073 ], [ -82.612700975999928, 21.534084377000056 ], [ -82.631459113999938, 21.530747789000088 ], [ -82.759185350999928, 21.470607815000051 ], [ -82.835560675999943, 21.444728908000059 ], [ -82.906239386999914, 21.437486070000091 ], [ -82.918120897999927, 21.441595770000049 ], [ -82.927235480999911, 21.450995184000078 ], [ -82.992583787999934, 21.452134507000039 ], [ -83.00226803299995, 21.455023505000042 ], [ -83.021839972999942, 21.463080145000049 ], [ -83.033558722999942, 21.465806382000039 ], [ -83.069488084999932, 21.46515534100007 ], [ -83.078521287999934, 21.469224351000037 ], [ -83.111154751999948, 21.509751695000091 ], [ -83.123605923999946, 21.520453192000048 ], [ -83.151722785999937, 21.537909247000073 ], [ -83.162098761999914, 21.549261786000045 ], [ -83.171376105999911, 21.568264065000051 ], [ -83.178212042999917, 21.595526434000078 ], [ -83.189523891999897, 21.620266018000052 ], [ -83.191802537999934, 21.63031647300005 ], [ -83.185047980999911, 21.63031647300005 ], [ -83.173939581999946, 21.620103257000039 ], [ -83.123605923999946, 21.585638739000046 ], [ -83.117014126999948, 21.57172272300005 ], [ -83.101307745999918, 21.559800523000035 ], [ -83.082020636999914, 21.551459052000041 ], [ -83.065256313999896, 21.548407294000071 ], [ -83.023915167999917, 21.548407294000071 ], [ -83.020578579999949, 21.552476304000038 ], [ -82.992583787999934, 21.575100002000056 ], [ -82.976918097999942, 21.584865627000056 ], [ -82.969227667999917, 21.59125397300005 ], [ -82.965931769999941, 21.599269924000055 ], [ -82.962798631999931, 21.59829336100006 ], [ -82.957630988999938, 21.592352606000077 ], [ -82.956532355999911, 21.582180080000057 ], [ -82.965931769999941, 21.568264065000051 ], [ -82.959095831999946, 21.561997789000088 ], [ -82.941029425999943, 21.593085028000075 ], [ -82.946115688999896, 21.604641018000052 ], [ -82.975900844999899, 21.609198309000078 ], [ -82.987660285999937, 21.61977773600006 ], [ -83.073475714999915, 21.760565497000073 ], [ -83.085601365999935, 21.800279039000088 ], [ -83.075184699999909, 21.843166408000059 ], [ -83.032826300999943, 21.874335028000075 ], [ -83.027333136999914, 21.887274481000077 ], [ -83.018666144999941, 21.897691148000035 ], [ -82.998524542999917, 21.910956122000073 ], [ -82.975697394999941, 21.921820380000042 ], [ -82.959095831999946, 21.925116278000075 ], [ -82.970082160999937, 21.92999909100007 ], [ -82.981027798999946, 21.93195221600007 ], [ -82.992583787999934, 21.93195221600007 ], [ -83.004709438999896, 21.937648830000057 ], [ -83.005238410999937, 21.939601955000057 ], [ -82.998768683999913, 21.941839911000045 ], [ -82.989491339999915, 21.948431708000044 ], [ -82.858998175999943, 21.933661200000074 ], [ -82.777495897999927, 21.914862372000073 ], [ -82.721424933999913, 21.900091864000046 ], [ -82.703724738999938, 21.892808335000041 ], [ -82.690174933999913, 21.881822007000039 ], [ -82.684722459999932, 21.866156317000048 ], [ -82.688221808999913, 21.847642320000091 ], [ -82.693470831999946, 21.835435289000088 ], [ -82.692534959999932, 21.824042059000078 ], [ -82.677886522999927, 21.807806708000044 ], [ -82.632964647999927, 21.773627020000049 ], [ -82.619536912999934, 21.774318752000056 ], [ -82.60960852799991, 21.769598700000074 ], [ -82.602935350999928, 21.758490302000041 ], [ -82.59788977799991, 21.746039130000042 ], [ -82.592600063999896, 21.736761786000045 ], [ -82.592355923999946, 21.729071356000077 ], [ -82.597727016999897, 21.71743398600006 ], [ -82.608998175999943, 21.698553778000075 ], [ -82.616444464999915, 21.698553778000075 ], [ -82.611073370999918, 21.690130927000041 ], [ -82.609527147999927, 21.681586005000042 ], [ -82.611439581999946, 21.672919012000079 ], [ -82.616444464999915, 21.664455471000053 ], [ -82.593861456999946, 21.651068427000041 ], [ -82.581898566999939, 21.645738023000035 ], [ -82.568023240999935, 21.643947658000059 ], [ -82.568023240999935, 21.636542059000078 ] ] ], [ [ [ -81.981190558999913, 21.647772528000075 ], [ -81.973622199999909, 21.639878648000035 ], [ -81.972767706999946, 21.622219143000052 ], [ -81.989816860999952, 21.60883209800005 ], [ -82.029449022999927, 21.59516022300005 ], [ -82.058583136999914, 21.581447658000059 ], [ -82.065297003999945, 21.579738674000055 ], [ -82.070464647999927, 21.57648346600007 ], [ -82.074330206999946, 21.572211005000042 ], [ -82.088368292999917, 21.568182684000078 ], [ -82.11001542899993, 21.567450262000079 ], [ -82.114247199999909, 21.570298570000091 ], [ -82.102162238999938, 21.574448960000041 ], [ -82.082183397999927, 21.590033270000049 ], [ -82.071197068999936, 21.592962958000044 ], [ -82.061838344999899, 21.59837474200009 ], [ -82.054514126999948, 21.606146552000041 ], [ -82.048329230999911, 21.610663153000075 ], [ -82.01976477799991, 21.621039130000042 ], [ -82.007883266999897, 21.621527411000045 ], [ -81.996652798999946, 21.626613674000055 ], [ -81.987619594999899, 21.634833075000074 ], [ -81.984120245999918, 21.641913153000075 ], [ -81.982899542999917, 21.646307684000078 ], [ -81.981190558999913, 21.647772528000075 ] ] ], [ [ [ -81.852528449999909, 21.663560289000088 ], [ -81.839019334999932, 21.666205145000049 ], [ -81.837798631999931, 21.661078192000048 ], [ -81.852650519999941, 21.649888414000088 ], [ -81.870106574999909, 21.639471747000073 ], [ -81.901356574999909, 21.615627346000053 ], [ -81.918853318999936, 21.615464585000041 ], [ -81.932362433999913, 21.628485419000071 ], [ -81.935699022999927, 21.641913153000075 ], [ -81.932850714999915, 21.640204169000071 ], [ -81.92218990799995, 21.629339911000045 ], [ -81.905629035999937, 21.631008205000057 ], [ -81.892201300999943, 21.641058661000045 ], [ -81.888172980999911, 21.647040106000077 ], [ -81.892079230999911, 21.647406317000048 ], [ -81.889149542999917, 21.649359442000048 ], [ -81.859201626999948, 21.66156647300005 ], [ -81.852528449999909, 21.663560289000088 ] ] ], [ [ [ -82.64517167899993, 21.95453522300005 ], [ -82.60773678299995, 21.938706773000035 ], [ -82.591175910999937, 21.926662502000056 ], [ -82.602894660999937, 21.921942450000074 ], [ -82.630116339999915, 21.920721747000073 ], [ -82.657866990999935, 21.932074286000045 ], [ -82.668080206999946, 21.949123440000051 ], [ -82.64517167899993, 21.95453522300005 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-07", "NAME_1": "Sancti Spíritus" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.984201626999948, 22.637681382000039 ], [ -78.989857550999943, 22.651434637000079 ], [ -79.004505988999938, 22.656724351000037 ], [ -79.064442511999914, 22.660345770000049 ], [ -79.074615037999934, 22.664252020000049 ], [ -79.087228969999899, 22.671820380000042 ], [ -79.070383266999897, 22.674017645000049 ], [ -78.976551886999914, 22.668524481000077 ], [ -78.960845506999931, 22.660142320000091 ], [ -78.96117102799991, 22.649115302000041 ], [ -78.984201626999948, 22.637681382000039 ] ] ], [ [ [ -79.416737434085292, 22.472479559284238 ], [ -79.341786261999914, 22.413153387000079 ], [ -79.312489386999914, 22.400295315000051 ], [ -79.285878058999913, 22.404282945000091 ], [ -79.275746222999942, 22.39484284100007 ], [ -79.256947394999941, 22.38226959800005 ], [ -79.238758917999917, 22.37641022300005 ], [ -79.230580206999946, 22.387193101000037 ], [ -79.219838019999941, 22.388413804000038 ], [ -79.167469855999911, 22.377875067000048 ], [ -79.14867102799991, 22.377630927000041 ], [ -79.137806769999941, 22.384833075000074 ], [ -79.135650193999936, 22.391180731000077 ], [ -79.13312740799995, 22.395656643000052 ], [ -79.120716925999943, 22.396877346000053 ], [ -79.110585089999915, 22.394598700000074 ], [ -79.095041469999899, 22.385728257000039 ], [ -79.083485480999911, 22.383775132000039 ], [ -79.062001105999911, 22.386664130000042 ], [ -79.024484829999949, 22.399969794000071 ], [ -79.005279100999928, 22.404282945000091 ], [ -78.982492641999897, 22.40460846600007 ], [ -78.927194791406464, 22.39874909099774 ], [ -78.931363652710388, 22.384653371755689 ], [ -78.934275420074584, 22.354079811733925 ], [ -78.94155483938431, 22.346800393323463 ], [ -78.950290142376161, 22.339520973114418 ], [ -78.956113678003817, 22.32787390275837 ], [ -78.966304863778419, 22.307491530309846 ], [ -78.97504016677027, 22.275462085706693 ], [ -78.985231354343512, 22.256535596040919 ], [ -78.999790192063699, 22.23324145532888 ], [ -79.012893146101817, 22.211403198298967 ], [ -79.021628449093612, 22.188109056687608 ], [ -79.034731404031049, 22.17646198633156 ], [ -79.03327552034898, 22.148800194573312 ], [ -79.047834358069167, 22.116770749970101 ], [ -79.046378474387097, 22.096388375722938 ], [ -79.030363752085464, 22.08328542258414 ], [ -78.999790192063699, 22.059991280972838 ], [ -78.977951935033786, 22.049800094298917 ], [ -78.964848980096349, 22.043976559570524 ], [ -78.960481329050083, 22.026505952687558 ], [ -78.960481329050083, 22.003211811975518 ], [ -78.97504016677027, 21.978461787581409 ], [ -78.992510772753917, 21.95371176228798 ], [ -78.998334308381629, 21.942064691931989 ], [ -79.012893146101817, 21.944976460195448 ], [ -79.028907868403394, 21.946432342978255 ], [ -79.040554938759385, 21.939152924567793 ], [ -79.046378474387097, 21.91877055121995 ], [ -79.058025544743089, 21.89693229418998 ], [ -79.072584383362596, 21.870726385214482 ], [ -79.082775570036517, 21.848888128184569 ], [ -79.092966755811119, 21.809579265170953 ], [ -79.114805012841032, 21.765902750211751 ], [ -79.122084433050134, 21.749888027910117 ], [ -79.106069710748557, 21.726593887198135 ], [ -79.098790291438775, 21.710579164896501 ], [ -79.10315794338436, 21.682917373138253 ], [ -79.108981478112696, 21.665446767154549 ], [ -79.100246175120844, 21.653799696798558 ], [ -79.072584383362596, 21.653799696798558 ], [ -79.043466707022901, 21.665446767154549 ], [ -79.03181963576759, 21.678549721192667 ], [ -79.03181963576759, 21.694564443494244 ], [ -79.017260798047403, 21.714946816842087 ], [ -78.992510772753917, 21.704755630168165 ], [ -78.970672515724004, 21.690196792447978 ], [ -78.964848980096349, 21.677093838409917 ], [ -78.967760748359808, 21.650887929434361 ], [ -78.964848980096349, 21.620314369412597 ], [ -78.959950325247291, 21.599554754748112 ], [ -78.970570441999939, 21.595526434000078 ], [ -78.977365688999953, 21.60297272300005 ], [ -78.994536912999934, 21.59406159100007 ], [ -79.012806769999941, 21.590073960000041 ], [ -79.055897589999915, 21.58930084800005 ], [ -79.075550910999937, 21.586086330000057 ], [ -79.128163214999915, 21.561997789000088 ], [ -79.169260219999899, 21.551703192000048 ], [ -79.208892381999931, 21.548488674000055 ], [ -79.249419725999928, 21.551947333000044 ], [ -79.329579230999911, 21.57367584800005 ], [ -79.346099412999934, 21.583156643000052 ], [ -79.364654100999928, 21.599269924000055 ], [ -79.378773566999939, 21.601263739000046 ], [ -79.430653449999909, 21.595404364000046 ], [ -79.450306769999941, 21.595526434000078 ], [ -79.472279425999943, 21.601996161000045 ], [ -79.481760219999899, 21.607367255000042 ], [ -79.491322394999941, 21.616034247000073 ], [ -79.506459113999938, 21.639797268000052 ], [ -79.515288865999935, 21.648586330000057 ], [ -79.519195115999935, 21.640204169000071 ], [ -79.522206183999913, 21.630031643000052 ], [ -79.529693162999934, 21.623439846000053 ], [ -79.539662238999938, 21.621975002000056 ], [ -79.549672003999945, 21.626898505000042 ], [ -79.559152798999946, 21.634995835000041 ], [ -79.564930792999917, 21.637884833000044 ], [ -79.607777472999942, 21.648993231000077 ], [ -79.613677537999934, 21.651312567000048 ], [ -79.621652798999946, 21.657619533000059 ], [ -79.62759355399993, 21.666937567000048 ], [ -79.632313605999911, 21.678208726000037 ], [ -79.639271613999938, 21.687730210000041 ], [ -79.652088995999918, 21.69171784100007 ], [ -79.722727016999897, 21.693426825000074 ], [ -79.790109829999949, 21.711615302000041 ], [ -79.815785285999937, 21.71124909100007 ], [ -79.827056443999936, 21.695135809000078 ], [ -79.833851691999939, 21.677679755000042 ], [ -79.850819464999915, 21.680080471000053 ], [ -79.872954881999931, 21.69086334800005 ], [ -79.895375128999945, 21.698553778000075 ], [ -79.895375128999945, 21.70538971600007 ], [ -79.874867316999939, 21.712836005000042 ], [ -79.874867316999939, 21.71906159100007 ], [ -79.890370245999918, 21.722398179000038 ], [ -79.893625454999949, 21.733587958000044 ], [ -79.892648891999897, 21.747748114000046 ], [ -79.895375128999945, 21.759995835000041 ], [ -79.91234290299991, 21.74835846600007 ], [ -79.93000240799995, 21.743312893000052 ], [ -79.94945227799991, 21.743109442000048 ], [ -79.971669074999909, 21.74640534100007 ], [ -79.992054816999939, 21.753322658000059 ], [ -80.003651495999918, 21.755804755000042 ], [ -80.012684699999909, 21.753810940000051 ], [ -80.015370245999918, 21.74673086100006 ], [ -80.009022589999915, 21.739935614000046 ], [ -79.999134894999941, 21.73501211100006 ], [ -79.990956183999913, 21.733343817000048 ], [ -80.003244594999899, 21.720892645000049 ], [ -80.02179928299995, 21.729193427000041 ], [ -80.038807745999918, 21.747137762000079 ], [ -80.046213344999899, 21.763413804000038 ], [ -80.048451300999943, 21.784898179000038 ], [ -80.05532792899993, 21.803697007000039 ], [ -80.067250128999945, 21.81704336100006 ], [ -80.084339972999942, 21.822088934000078 ], [ -80.101026702777816, 21.824765419775595 ], [ -80.101022508382016, 21.824843858457257 ], [ -80.09880042210176, 21.866391710508992 ], [ -80.097715217383382, 21.871481838216255 ], [ -80.094097867122855, 21.87639110056881 ], [ -80.087276576852503, 21.883419093716213 ], [ -80.060043098010567, 21.903702093776587 ], [ -80.024050462558762, 21.938506170823132 ], [ -79.98860043036558, 21.953905747851991 ], [ -79.969893562338029, 21.968090928953188 ], [ -79.963072272067677, 21.969822088818319 ], [ -79.948292812663169, 21.968762722521603 ], [ -79.943202684056587, 21.971734116736059 ], [ -79.940489672260526, 21.976824246241961 ], [ -79.938319261025072, 21.985325019534002 ], [ -79.934521043611255, 21.993231512724094 ], [ -79.924650844760663, 22.004987901070763 ], [ -79.914496425969276, 22.008992824958909 ], [ -79.904962123902862, 22.010233059308234 ], [ -79.846877814159768, 21.997262275033961 ], [ -79.839591436795331, 21.994368394285971 ], [ -79.834733853084856, 21.990906072757014 ], [ -79.820548671983602, 21.983929755553731 ], [ -79.790705533233734, 21.981785182739998 ], [ -79.765926682870088, 22.001551418862846 ], [ -79.746263801333328, 22.03152374882194 ], [ -79.72977901868677, 22.062374578823722 ], [ -79.724482185404497, 22.080874742175581 ], [ -79.723552009417688, 22.093871364871575 ], [ -79.72745357871969, 22.099374905527441 ], [ -79.731820237813736, 22.101441962176807 ], [ -79.737685512776181, 22.101700343695882 ], [ -79.742723965438643, 22.101209418180076 ], [ -79.747142299577433, 22.102062078901781 ], [ -79.750242885900434, 22.105033474015613 ], [ -79.753782721795176, 22.111570543445794 ], [ -79.758304408721472, 22.122810166955617 ], [ -79.772877162550969, 22.14929433786341 ], [ -79.779259203249637, 22.166528429343543 ], [ -79.779646775977938, 22.176915392131605 ], [ -79.777528041585811, 22.183710842181597 ], [ -79.766624314860223, 22.192831733097989 ], [ -79.73360307542157, 22.19208242426447 ], [ -79.722001715806527, 22.183168239822407 ], [ -79.718306851180216, 22.176605332869826 ], [ -79.713320075361196, 22.169784044398114 ], [ -79.702855598207293, 22.161257433583671 ], [ -79.692416957676414, 22.158802802407365 ], [ -79.683838670917908, 22.159267890400827 ], [ -79.676578131975191, 22.162962755027081 ], [ -79.662237922142367, 22.171928616312584 ], [ -79.64900875455038, 22.173323879393479 ], [ -79.639732835801738, 22.172652085825064 ], [ -79.598805101374296, 22.161050727109341 ], [ -79.578367071682976, 22.167226060434302 ], [ -79.564827846627793, 22.161438299837641 ], [ -79.556172044604182, 22.1560122753462 ], [ -79.541961025980527, 22.150689601843624 ], [ -79.527853360144434, 22.152291572298225 ], [ -79.516717089422116, 22.156709906437015 ], [ -79.507725388815629, 22.164306342163968 ], [ -79.499250453945251, 22.174977524892824 ], [ -79.491809047849245, 22.188904324475004 ], [ -79.486693080820999, 22.201565050386762 ], [ -79.481267056329557, 22.219445095214951 ], [ -79.463387009702728, 22.23654999368722 ], [ -79.45144975510209, 22.242415269549042 ], [ -79.433828090893655, 22.248487250086498 ], [ -79.421580777031238, 22.249314073285859 ], [ -79.41173641570299, 22.247169501371388 ], [ -79.386905891193919, 22.235025540296419 ], [ -79.361119351376942, 22.231201484460939 ], [ -79.358044602576342, 22.249184882076634 ], [ -79.359129808194098, 22.265049547098897 ], [ -79.356649340394711, 22.27703847944224 ], [ -79.352696091551365, 22.289544175723108 ], [ -79.353471238806605, 22.296830553087545 ], [ -79.381841600109738, 22.333262437211715 ], [ -79.415353766862836, 22.395480862052125 ], [ -79.423699509624669, 22.408064072698778 ], [ -79.435378383605496, 22.416461493203315 ], [ -79.416852382731236, 22.448449204766973 ], [ -79.417369146668761, 22.471445217522728 ], [ -79.416737434085292, 22.472479559284238 ] ] ], [ [ [ -79.224517381999931, 22.639715887000079 ], [ -79.215728318999936, 22.643011786000045 ], [ -79.176869269999941, 22.644680080000057 ], [ -79.18976803299995, 22.634507554000038 ], [ -79.206410285999937, 22.624416408000059 ], [ -79.213246222999942, 22.624416408000059 ], [ -79.21320553299995, 22.631048895000049 ], [ -79.216420050999943, 22.636623440000051 ], [ -79.224517381999931, 22.639715887000079 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-05", "NAME_1": "Villa Clara" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -79.357533331999946, 22.637681382000039 ], [ -79.366363084999932, 22.639349677000041 ], [ -79.375559048999946, 22.64321523600006 ], [ -79.38890540299991, 22.651312567000048 ], [ -79.403797980999911, 22.663641669000071 ], [ -79.437367316999939, 22.698472398000035 ], [ -79.45539303299995, 22.692287502000056 ], [ -79.473744269999941, 22.694322007000039 ], [ -79.490834113999938, 22.702053127000056 ], [ -79.513579881999931, 22.718410549000055 ], [ -79.520090298999946, 22.720689195000091 ], [ -79.524037238999938, 22.725002346000053 ], [ -79.525461391999897, 22.736395575000074 ], [ -79.528879360999952, 22.740301825000074 ], [ -79.544829881999931, 22.75141022300005 ], [ -79.549672003999945, 22.753729559000078 ], [ -79.557972785999937, 22.760158596000053 ], [ -79.563099738999938, 22.774237372000073 ], [ -79.571766730999911, 22.788275458000044 ], [ -79.590646938999953, 22.794663804000038 ], [ -79.620350714999915, 22.783148505000042 ], [ -79.633656378999945, 22.78384023600006 ], [ -79.635324673999946, 22.802150783000059 ], [ -79.606922980999911, 22.810248114000046 ], [ -79.586537238999938, 22.811224677000041 ], [ -79.569976365999935, 22.804103908000059 ], [ -79.517974412999934, 22.749579169000071 ], [ -79.49632727799991, 22.73314036700009 ], [ -79.450266079999949, 22.719916083000044 ], [ -79.412912563999953, 22.691351630000042 ], [ -79.371978318999936, 22.676662502000056 ], [ -79.351918097999942, 22.657294012000079 ], [ -79.335601365999935, 22.634670315000051 ], [ -79.32681230399993, 22.616522528000075 ], [ -79.349476691999939, 22.635321356000077 ], [ -79.357533331999946, 22.637681382000039 ] ] ], [ [ [ -79.895375128999945, 22.959173895000049 ], [ -79.887115037999934, 22.95970286700009 ], [ -79.887847459999932, 22.946275132000039 ], [ -79.898548956999946, 22.936712958000044 ], [ -79.919829881999931, 22.949286200000074 ], [ -79.929351365999935, 22.946478583000044 ], [ -79.939808722999942, 22.932847398000035 ], [ -79.949696417999917, 22.928412177000041 ], [ -79.957427537999934, 22.953029690000051 ], [ -79.943023240999935, 22.961127020000049 ], [ -79.927235480999911, 22.966294664000088 ], [ -79.911000128999945, 22.966376044000071 ], [ -79.895375128999945, 22.959173895000049 ] ] ], [ [ [ -80.32054602799991, 22.986517645000049 ], [ -80.271880662999934, 23.008693752000056 ], [ -80.249745245999918, 23.010931708000044 ], [ -80.231800910999937, 23.000148830000057 ], [ -80.23696855399993, 22.997300523000035 ], [ -80.246693488999938, 22.989447333000044 ], [ -80.251616990999935, 22.986517645000049 ], [ -80.24250240799995, 22.982570705000057 ], [ -80.236073370999918, 22.976752020000049 ], [ -80.232533331999946, 22.968939520000049 ], [ -80.231800910999937, 22.959173895000049 ], [ -80.332508917999917, 22.97532786700009 ], [ -80.347808397999927, 22.986517645000049 ], [ -80.341704881999931, 22.991034247000073 ], [ -80.335764126999948, 22.993353583000044 ], [ -80.328968878999945, 22.992254950000074 ], [ -80.32054602799991, 22.986517645000049 ] ] ], [ [ [ -80.197010870999918, 23.124253648000035 ], [ -80.190744594999899, 23.111395575000074 ], [ -80.179839647999927, 23.10024648600006 ], [ -80.166493292999917, 23.092474677000041 ], [ -80.15265865799995, 23.089544989000046 ], [ -80.136586066999939, 23.089016018000052 ], [ -80.131255662999934, 23.086981512000079 ], [ -80.134103969999899, 23.082831122000073 ], [ -80.142404751999948, 23.075873114000046 ], [ -80.16242428299995, 23.067328192000048 ], [ -80.182728644999941, 23.07094961100006 ], [ -80.224964972999942, 23.089544989000046 ], [ -80.222645636999914, 23.099758205000057 ], [ -80.217396613999938, 23.107123114000046 ], [ -80.210804816999939, 23.114447333000044 ], [ -80.204457160999937, 23.124253648000035 ], [ -80.197010870999918, 23.124253648000035 ] ] ], [ [ [ -80.593095662534779, 23.068032199226593 ], [ -80.556792772999927, 23.007391669000071 ], [ -80.536244269999941, 22.993963934000078 ], [ -80.520375128999945, 22.99290599200009 ], [ -80.479847785999937, 22.985663153000075 ], [ -80.464507615999935, 22.980292059000078 ], [ -80.455067511999914, 22.972072658000059 ], [ -80.444732225999928, 22.96039459800005 ], [ -80.431507941999939, 22.94993724200009 ], [ -80.413319464999915, 22.945502020000049 ], [ -80.356922980999911, 22.94562409100007 ], [ -80.344471808999913, 22.942084052000041 ], [ -80.329416469999899, 22.929836330000057 ], [ -80.313343878999945, 22.921291408000059 ], [ -80.296701626999948, 22.915676174000055 ], [ -80.27961178299995, 22.912014065000051 ], [ -80.246693488999938, 22.911037502000056 ], [ -80.215687628999945, 22.917059637000079 ], [ -80.156076626999948, 22.938706773000035 ], [ -80.163563605999911, 22.962551174000055 ], [ -80.14671790299991, 22.963080145000049 ], [ -80.093617316999939, 22.938544012000079 ], [ -80.070057745999918, 22.931789455000057 ], [ -80.050038214999915, 22.935248114000046 ], [ -80.046213344999899, 22.959173895000049 ], [ -80.035511847999942, 22.95384349200009 ], [ -80.024566209999932, 22.946682033000059 ], [ -80.016102667999917, 22.938055731000077 ], [ -80.012684699999909, 22.92845286700009 ], [ -79.990061001999948, 22.890611070000091 ], [ -79.987863735999952, 22.884100653000075 ], [ -79.950021938999896, 22.86359284100007 ], [ -79.944569464999915, 22.862779039000088 ], [ -79.926747199999909, 22.86359284100007 ], [ -79.919829881999931, 22.861314195000091 ], [ -79.916981574999909, 22.856431382000039 ], [ -79.916411912999934, 22.851548570000091 ], [ -79.916493292999917, 22.849310614000046 ], [ -79.895741339999915, 22.855169989000046 ], [ -79.863148566999939, 22.883693752000056 ], [ -79.801747199999909, 22.899725653000075 ], [ -79.792958136999914, 22.897772528000075 ], [ -79.792958136999914, 22.890122789000088 ], [ -79.802357550999943, 22.882147528000075 ], [ -79.820912238999938, 22.870428778000075 ], [ -79.843861456999946, 22.880682684000078 ], [ -79.854969855999911, 22.872544664000088 ], [ -79.868031378999945, 22.83624909100007 ], [ -79.857167120999918, 22.820705471000053 ], [ -79.850900844999899, 22.814113674000055 ], [ -79.841379360999952, 22.808335679000038 ], [ -79.83071855399993, 22.805650132000039 ], [ -79.789540167999917, 22.802150783000059 ], [ -79.771880662999934, 22.796616929000038 ], [ -79.71312415299991, 22.757798570000091 ], [ -79.709950324999909, 22.753078518000052 ], [ -79.706166144999941, 22.74876536700009 ], [ -79.700184699999909, 22.746893622000073 ], [ -79.694650844999899, 22.749172268000052 ], [ -79.688628709999932, 22.754095770000049 ], [ -79.684193488999938, 22.758978583000044 ], [ -79.683094855999911, 22.76117584800005 ], [ -79.660308397999927, 22.763861395000049 ], [ -79.651722785999937, 22.758775132000039 ], [ -79.627023891999897, 22.657497463000084 ], [ -79.626454230999911, 22.656927802000041 ], [ -79.611480272999927, 22.652329820000091 ], [ -79.599354620999918, 22.646551825000074 ], [ -79.58853105399993, 22.638495184000078 ], [ -79.577259894999941, 22.627101955000057 ], [ -79.565825975999928, 22.611151434000078 ], [ -79.552113410999937, 22.580267645000049 ], [ -79.542836066999939, 22.565659898000035 ], [ -79.517486131999931, 22.539129950000074 ], [ -79.511830206999946, 22.53461334800005 ], [ -79.496937628999945, 22.53196849200009 ], [ -79.468006964999915, 22.531398830000057 ], [ -79.456532355999911, 22.528469143000052 ], [ -79.429839647999927, 22.490220445000091 ], [ -79.424712693999936, 22.478745835000041 ], [ -79.416737434085292, 22.472479559284238 ], [ -79.417369146668761, 22.471445217522728 ], [ -79.416852382731236, 22.448449204766973 ], [ -79.435378383605496, 22.416461493203315 ], [ -79.423699509624669, 22.408064072698778 ], [ -79.415353766862836, 22.395480862052125 ], [ -79.381841600109738, 22.333262437211715 ], [ -79.353471238806605, 22.296830553087545 ], [ -79.352696091551365, 22.289544175723108 ], [ -79.356649340394711, 22.27703847944224 ], [ -79.359129808194098, 22.265049547098897 ], [ -79.358044602576342, 22.249184882076634 ], [ -79.361119351376942, 22.231201484460939 ], [ -79.386905891193919, 22.235025540296419 ], [ -79.41173641570299, 22.247169501371388 ], [ -79.421580777031238, 22.249314073285859 ], [ -79.433828090893655, 22.248487250086498 ], [ -79.45144975510209, 22.242415269549042 ], [ -79.463387009702728, 22.23654999368722 ], [ -79.481267056329557, 22.219445095214951 ], [ -79.486693080820999, 22.201565050386762 ], [ -79.491809047849245, 22.188904324475004 ], [ -79.499250453945251, 22.174977524892824 ], [ -79.507725388815629, 22.164306342163968 ], [ -79.516717089422116, 22.156709906437015 ], [ -79.527853360144434, 22.152291572298225 ], [ -79.541961025980527, 22.150689601843624 ], [ -79.556172044604182, 22.1560122753462 ], [ -79.564827846627793, 22.161438299837641 ], [ -79.578367071682976, 22.167226060434302 ], [ -79.598805101374296, 22.161050727109341 ], [ -79.639732835801738, 22.172652085825064 ], [ -79.64900875455038, 22.173323879393479 ], [ -79.662237922142367, 22.171928616312584 ], [ -79.676578131975191, 22.162962755027081 ], [ -79.683838670917908, 22.159267890400827 ], [ -79.692416957676414, 22.158802802407365 ], [ -79.702855598207293, 22.161257433583671 ], [ -79.713320075361196, 22.169784044398114 ], [ -79.718306851180216, 22.176605332869826 ], [ -79.722001715806527, 22.183168239822407 ], [ -79.73360307542157, 22.19208242426447 ], [ -79.766624314860223, 22.192831733097989 ], [ -79.777528041585811, 22.183710842181597 ], [ -79.779646775977938, 22.176915392131605 ], [ -79.779259203249637, 22.166528429343543 ], [ -79.772877162550969, 22.14929433786341 ], [ -79.758304408721472, 22.122810166955617 ], [ -79.753782721795176, 22.111570543445794 ], [ -79.750242885900434, 22.105033474015613 ], [ -79.747142299577433, 22.102062078901781 ], [ -79.742723965438643, 22.101209418180076 ], [ -79.737685512776181, 22.101700343695882 ], [ -79.731820237813736, 22.101441962176807 ], [ -79.72745357871969, 22.099374905527441 ], [ -79.723552009417688, 22.093871364871575 ], [ -79.724482185404497, 22.080874742175581 ], [ -79.72977901868677, 22.062374578823722 ], [ -79.746263801333328, 22.03152374882194 ], [ -79.765926682870088, 22.001551418862846 ], [ -79.790705533233734, 21.981785182739998 ], [ -79.820548671983602, 21.983929755553731 ], [ -79.834733853084856, 21.990906072757014 ], [ -79.839591436795331, 21.994368394285971 ], [ -79.846877814159768, 21.997262275033961 ], [ -79.904962123902862, 22.010233059308234 ], [ -79.914496425969276, 22.008992824958909 ], [ -79.924650844760663, 22.004987901070763 ], [ -79.934521043611255, 21.993231512724094 ], [ -79.938319261025072, 21.985325019534002 ], [ -79.940489672260526, 21.976824246241961 ], [ -79.943202684056587, 21.971734116736059 ], [ -79.948292812663169, 21.968762722521603 ], [ -79.963072272067677, 21.969822088818319 ], [ -79.969893562338029, 21.968090928953188 ], [ -79.98860043036558, 21.953905747851991 ], [ -80.024050462558762, 21.938506170823132 ], [ -80.023275316202842, 21.95212291114342 ], [ -80.024748093649578, 21.954215807113769 ], [ -80.045005256187608, 21.968607692890714 ], [ -80.048415899973804, 21.977211818970261 ], [ -80.04988867921918, 21.986797796980738 ], [ -80.049268561594829, 22.001809801281297 ], [ -80.05084469272839, 22.028319809711434 ], [ -80.053376838270481, 22.03653636306268 ], [ -80.058777025239522, 22.043435166799497 ], [ -80.077380541378886, 22.057878730319146 ], [ -80.084124314585438, 22.070255235390789 ], [ -80.089369472822909, 22.083768622024252 ], [ -80.099859789297795, 22.123404446158247 ], [ -80.100479906022827, 22.131879381028568 ], [ -80.099808111555092, 22.151593940308089 ], [ -80.103580492345827, 22.190196234768393 ], [ -80.102417772362287, 22.199265447942025 ], [ -80.098567878105086, 22.207611192502497 ], [ -80.09497636626628, 22.213424791520879 ], [ -80.084072638641373, 22.245619207760228 ], [ -80.109187384889879, 22.25641958349695 ], [ -80.121434698752353, 22.271431585998869 ], [ -80.130219692884509, 22.286211046302753 ], [ -80.135697395118655, 22.29768321380925 ], [ -80.138410406914716, 22.306726589460538 ], [ -80.141588507603501, 22.329102485491319 ], [ -80.143293829946288, 22.332642320486684 ], [ -80.145696784279153, 22.334554348404424 ], [ -80.14990841284299, 22.335381170704466 ], [ -80.154972703927115, 22.334916082711004 ], [ -80.169984707328354, 22.330626938882119 ], [ -80.177090216640181, 22.330110174944593 ], [ -80.184273241217113, 22.331350409293918 ], [ -80.196598070344635, 22.33737071388731 ], [ -80.23295244010302, 22.370314438960179 ], [ -80.239050259062196, 22.378169257105526 ], [ -80.242486742169376, 22.384654648793003 ], [ -80.243003506106902, 22.39537750926462 ], [ -80.223986578817517, 22.4146786564948 ], [ -80.220808479028051, 22.427804470399963 ], [ -80.223521490824112, 22.432145291072288 ], [ -80.227242193872144, 22.436021022851889 ], [ -80.234399380027355, 22.43950918190319 ], [ -80.238481818281286, 22.446692206480122 ], [ -80.238998583118075, 22.452402451811679 ], [ -80.23737077514113, 22.45955963796689 ], [ -80.23352088088393, 22.468292955255663 ], [ -80.236518114419425, 22.478473212468771 ], [ -80.255560879231155, 22.488472602528589 ], [ -80.259100715125896, 22.493588569556834 ], [ -80.270236985848214, 22.517798977340931 ], [ -80.271399705831755, 22.526480617786262 ], [ -80.271089646569919, 22.531648260758629 ], [ -80.268014898668639, 22.53418040630072 ], [ -80.264785122035732, 22.535575670280934 ], [ -80.260806036569306, 22.536609198155929 ], [ -80.257937995142356, 22.53797862371448 ], [ -80.25548336486537, 22.542862046746052 ], [ -80.254010585619994, 22.551362820038094 ], [ -80.25398474809765, 22.569036160190649 ], [ -80.255405849600265, 22.57559906714323 ], [ -80.257550422414056, 22.578544622935965 ], [ -80.260134243000891, 22.576606757495824 ], [ -80.264785122035732, 22.571697496042589 ], [ -80.267756517149508, 22.569862983389953 ], [ -80.273725144899515, 22.568881130559703 ], [ -80.280158860642871, 22.568803616193918 ], [ -80.294137336169115, 22.570043850543243 ], [ -80.299950935187496, 22.569862983389953 ], [ -80.303516607705262, 22.568571072197187 ], [ -80.306798062080873, 22.564927883514997 ], [ -80.310492926707184, 22.558313299718975 ], [ -80.318011848068295, 22.536040758274339 ], [ -80.319975551930156, 22.533327745578958 ], [ -80.323153652618942, 22.531648260758629 ], [ -80.328657193274807, 22.531389879239498 ], [ -80.33640865773333, 22.531699936702694 ], [ -80.341834683124091, 22.531260688030329 ], [ -80.346459723737269, 22.529581204109263 ], [ -80.357595995358906, 22.522734076316567 ], [ -80.364055548624663, 22.519814358046176 ], [ -80.37537268739959, 22.516248683729771 ], [ -80.380824551212072, 22.51604197815476 ], [ -80.385217047828462, 22.517411403713311 ], [ -80.386767341439622, 22.519633489993566 ], [ -80.387464973429758, 22.522372341110611 ], [ -80.386689826174518, 22.526713161782993 ], [ -80.381754727198881, 22.540071518785567 ], [ -80.379816860859421, 22.549450792120354 ], [ -80.379274257600912, 22.563971869106467 ], [ -80.383976812579817, 22.569320380131444 ], [ -80.39234839466269, 22.570870672843284 ], [ -80.4171789209704, 22.566452337805117 ], [ -80.441079271291301, 22.584797472425407 ], [ -80.446221075841947, 22.586425279503032 ], [ -80.454618496346541, 22.587097073071448 ], [ -80.459424405012271, 22.584642441895141 ], [ -80.463196784004367, 22.581412665262292 ], [ -80.465909796699748, 22.57751109506097 ], [ -80.478157110562165, 22.564514472364976 ], [ -80.519679125091557, 22.542009386024347 ], [ -80.534096849290165, 22.565082913145886 ], [ -80.540349697880231, 22.571413276101794 ], [ -80.544768032918398, 22.581386826840571 ], [ -80.547610235923628, 22.591515408109558 ], [ -80.549935675890708, 22.611178290545638 ], [ -80.554844937343944, 22.618981431847601 ], [ -80.559314948326175, 22.623658149304106 ], [ -80.561717901759721, 22.627818101024502 ], [ -80.562648077746587, 22.63515615523238 ], [ -80.557532110718341, 22.682130031775557 ], [ -80.557997198711746, 22.690811672220889 ], [ -80.559625006688691, 22.69740041849451 ], [ -80.564172532936027, 22.704247545387886 ], [ -80.571433071878744, 22.711301377856273 ], [ -80.573138394221473, 22.71571971289444 ], [ -80.57194983581627, 22.721429959125317 ], [ -80.566368780794562, 22.728948878687788 ], [ -80.557015346780815, 22.732721259478524 ], [ -80.551796026965064, 22.735589300905474 ], [ -80.550323248619009, 22.740705267933777 ], [ -80.552984585370325, 22.748224189294888 ], [ -80.568074104036668, 22.772176215559909 ], [ -80.57523128929256, 22.792846788348584 ], [ -80.579572109964886, 22.801580104738036 ], [ -80.580760668370147, 22.804939073479431 ], [ -80.584920620090543, 22.813646552346484 ], [ -80.587659471207587, 22.81747060818202 ], [ -80.595049201359529, 22.82049367923986 ], [ -80.604712693735792, 22.82033865050829 ], [ -80.624298061806087, 22.81341400834981 ], [ -80.644115973873056, 22.799952296761091 ], [ -80.651402351237493, 22.7970067409683 ], [ -80.667473720935448, 22.795973212193985 ], [ -80.687730881674838, 22.812251288366269 ], [ -80.704396532374062, 22.822405707157657 ], [ -80.708530645672738, 22.825893866208958 ], [ -80.711424527320048, 22.829821274831943 ], [ -80.714421759956224, 22.835273139543744 ], [ -80.720726283591091, 22.843696397570682 ], [ -80.730932380125239, 22.854057521937079 ], [ -80.734394700754819, 22.85886342970349 ], [ -80.73633256709428, 22.863514308738331 ], [ -80.737366095868595, 22.870077215690912 ], [ -80.739329799730456, 22.873306993223139 ], [ -80.743050502778487, 22.875735785078405 ], [ -80.746848721091567, 22.877647812996145 ], [ -80.748424852225128, 22.880515855322471 ], [ -80.747158780353402, 22.884288235213887 ], [ -80.740130785407416, 22.888008938261862 ], [ -80.735092332744955, 22.892763170084208 ], [ -80.729666307354194, 22.899997869705885 ], [ -80.727056647446318, 22.914493110068975 ], [ -80.728271044273242, 22.922606308834077 ], [ -80.732224291317948, 22.937825018709646 ], [ -80.732792731199595, 22.948987127853627 ], [ -80.732095100108779, 22.956945298786479 ], [ -80.729382087413398, 22.966402086487108 ], [ -80.725945604306162, 22.970717067838393 ], [ -80.720726283591091, 22.973275050902885 ], [ -80.695792406294515, 22.972603258233789 ], [ -80.691529099987974, 22.973068346227194 ], [ -80.677473110995265, 22.978029282725174 ], [ -80.672667202329535, 22.979088649921266 ], [ -80.667318692203878, 22.979424546705445 ], [ -80.663442958625637, 22.978804429980414 ], [ -80.659360521271026, 22.9770215932719 ], [ -80.650704719247358, 22.971363022985088 ], [ -80.646131353679039, 22.970484523841662 ], [ -80.640317755559977, 22.971104641466013 ], [ -80.630189175190253, 22.973972682892963 ], [ -80.623006150613321, 22.979424546705445 ], [ -80.618019374794301, 22.987305203272513 ], [ -80.61742509559167, 23.003945013751377 ], [ -80.61817440532451, 23.014280299696054 ], [ -80.61530636299824, 23.03717296056368 ], [ -80.59928666924435, 23.065672512176661 ], [ -80.593095662534779, 23.068032199226593 ] ] ], [ [ [ -79.680083787999934, 22.859442450000074 ], [ -79.666371222999942, 22.852118231000077 ], [ -79.66079667899993, 22.84516022300005 ], [ -79.669829881999931, 22.83624909100007 ], [ -79.685292120999918, 22.833685614000046 ], [ -79.692372199999909, 22.84015534100007 ], [ -79.692290818999936, 22.847154039000088 ], [ -79.695179816999939, 22.850490627000056 ], [ -79.699086066999939, 22.852484442000048 ], [ -79.704579230999911, 22.851752020000049 ], [ -79.711537238999938, 22.853461005000042 ], [ -79.730865037999934, 22.866115627000056 ], [ -79.739857550999943, 22.875799872000073 ], [ -79.738758917999917, 22.885809637000079 ], [ -79.726185675999943, 22.88898346600007 ], [ -79.728260870999918, 22.895331122000073 ], [ -79.727528449999909, 22.903957424000055 ], [ -79.722157355999911, 22.907212632000039 ], [ -79.715443488999938, 22.896144924000055 ], [ -79.718332485999952, 22.880031643000052 ], [ -79.711293097999942, 22.877834377000056 ], [ -79.692005988999938, 22.873928127000056 ], [ -79.68586178299995, 22.865301825000074 ], [ -79.680083787999934, 22.859442450000074 ] ] ], [ [ [ -79.826283331999946, 22.964667059000078 ], [ -79.818470831999946, 22.954331773000035 ], [ -79.81704667899993, 22.947251695000091 ], [ -79.823109503999945, 22.942450262000079 ], [ -79.835072394999941, 22.938950914000088 ], [ -79.842152472999942, 22.931789455000057 ], [ -79.837635870999918, 22.926174221000053 ], [ -79.829009568999936, 22.924750067000048 ], [ -79.827381964999915, 22.919134833000044 ], [ -79.834950324999909, 22.911810614000046 ], [ -79.846506313999896, 22.910345770000049 ], [ -79.858021613999938, 22.916937567000048 ], [ -79.864491339999915, 22.925970770000049 ], [ -79.861480272999927, 22.93195221600007 ], [ -79.855295376999948, 22.936712958000044 ], [ -79.852935350999928, 22.941636460000041 ], [ -79.861887173999946, 22.942938544000071 ], [ -79.871164516999897, 22.947699286000045 ], [ -79.861073370999918, 22.962591864000046 ], [ -79.83853105399993, 22.968085028000075 ], [ -79.826283331999946, 22.964667059000078 ] ] ], [ [ [ -80.061390753999945, 23.049790757000039 ], [ -80.057606574999909, 23.04242584800005 ], [ -80.053578253999945, 23.029201565000051 ], [ -80.056304490999935, 23.026678778000075 ], [ -80.061919725999928, 23.034247137000079 ], [ -80.066558397999927, 23.038885809000078 ], [ -80.070708787999934, 23.038560289000088 ], [ -80.077300584999932, 23.037298895000049 ], [ -80.085357225999928, 23.038316148000035 ], [ -80.091216600999928, 23.042873440000051 ], [ -80.094797329999949, 23.048325914000088 ], [ -80.094471808999913, 23.050685940000051 ], [ -80.091053839999915, 23.049994208000044 ], [ -80.089466925999943, 23.055487372000073 ], [ -80.087635870999918, 23.067450262000079 ], [ -80.076771613999938, 23.069891669000071 ], [ -80.064605272999927, 23.058010158000059 ], [ -80.061390753999945, 23.049790757000039 ] ] ], [ [ [ -80.244699673999946, 23.107489325000074 ], [ -80.242176886999914, 23.104315497000073 ], [ -80.238148566999939, 23.097642320000091 ], [ -80.239409959999932, 23.091009833000044 ], [ -80.244618292999917, 23.085272528000075 ], [ -80.25031490799995, 23.084865627000056 ], [ -80.257069464999915, 23.08930084800005 ], [ -80.261789516999897, 23.096177476000037 ], [ -80.26585852799991, 23.103745835000041 ], [ -80.273793097999942, 23.106268622000073 ], [ -80.288563605999911, 23.114081122000073 ], [ -80.293039516999897, 23.11587148600006 ], [ -80.294748501999948, 23.120428778000075 ], [ -80.296457485999952, 23.122626044000071 ], [ -80.30296790299991, 23.12641022300005 ], [ -80.305734829999949, 23.134507554000038 ], [ -80.296009894999941, 23.140448309000078 ], [ -80.288563605999911, 23.141750393000052 ], [ -80.281117316999939, 23.142320054000038 ], [ -80.272450324999909, 23.140041408000059 ], [ -80.272572394999941, 23.134466864000046 ], [ -80.265533006999931, 23.127427476000037 ], [ -80.250884568999936, 23.115301825000074 ], [ -80.244699673999946, 23.107489325000074 ] ] ], [ [ [ -80.401437954999949, 23.15460846600007 ], [ -80.390004035999937, 23.154486395000049 ], [ -80.376291469999899, 23.152167059000078 ], [ -80.378000454999949, 23.147691148000035 ], [ -80.386097785999937, 23.145819403000075 ], [ -80.393950975999928, 23.146429755000042 ], [ -80.419667120999918, 23.143377997000073 ], [ -80.429269985999952, 23.136216539000088 ], [ -80.444406704999949, 23.130194403000075 ], [ -80.458078579999949, 23.126776434000078 ], [ -80.459787563999896, 23.128607489000046 ], [ -80.462228969999899, 23.135199286000045 ], [ -80.458404100999928, 23.137193101000037 ], [ -80.44945227799991, 23.136216539000088 ], [ -80.451079881999931, 23.145086981000077 ], [ -80.446115688999896, 23.150620835000041 ], [ -80.431792772999927, 23.152533270000049 ], [ -80.42446855399993, 23.152777411000045 ], [ -80.401437954999949, 23.15460846600007 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-04", "NAME_1": "Matanzas" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -80.828236456999946, 23.178900458000044 ], [ -80.820790167999917, 23.178900458000044 ], [ -80.811105923999946, 23.164292710000041 ], [ -80.804798956999946, 23.157538153000075 ], [ -80.804839647999927, 23.152899481000077 ], [ -80.814035610999952, 23.144761460000041 ], [ -80.830637173999946, 23.135646877000056 ], [ -80.842600063999896, 23.136664130000042 ], [ -80.853179490999935, 23.141750393000052 ], [ -80.86554928299995, 23.144761460000041 ], [ -80.897816535999937, 23.141750393000052 ], [ -80.92218990799995, 23.133856512000079 ], [ -80.971669074999909, 23.110663153000075 ], [ -80.960438605999911, 23.122137762000079 ], [ -80.899810350999928, 23.159165757000039 ], [ -80.881947394999941, 23.162787177000041 ], [ -80.862538214999915, 23.162176825000074 ], [ -80.841297980999911, 23.157782294000071 ], [ -80.845204230999911, 23.163234768000052 ], [ -80.850819464999915, 23.173651434000078 ], [ -80.854969855999911, 23.178900458000044 ], [ -80.848133917999917, 23.185126044000071 ], [ -80.843739386999914, 23.178208726000037 ], [ -80.828236456999946, 23.165228583000044 ], [ -80.828236456999946, 23.178900458000044 ] ] ], [ [ [ -80.491851365999935, 23.192572333000044 ], [ -80.486439581999946, 23.193793036000045 ], [ -80.479400193999936, 23.196356512000079 ], [ -80.473378058999913, 23.19603099200009 ], [ -80.470773891999897, 23.188869533000059 ], [ -80.473011847999942, 23.181545315000051 ], [ -80.478911912999934, 23.177435614000046 ], [ -80.486805792999917, 23.173895575000074 ], [ -80.495228644999941, 23.168361721000053 ], [ -80.505279100999928, 23.169745184000078 ], [ -80.522938605999911, 23.176743882000039 ], [ -80.543080206999946, 23.182196356000077 ], [ -80.560170050999943, 23.178900458000044 ], [ -80.564076300999943, 23.184759833000044 ], [ -80.568470831999946, 23.185126044000071 ], [ -80.580637173999946, 23.178900458000044 ], [ -80.576975063999896, 23.192572333000044 ], [ -80.570423956999946, 23.200913804000038 ], [ -80.559681769999941, 23.205064195000091 ], [ -80.543365037999934, 23.206244208000044 ], [ -80.53929602799991, 23.204331773000035 ], [ -80.531361456999946, 23.195461330000057 ], [ -80.525990363999938, 23.192572333000044 ], [ -80.517323370999918, 23.191799221000053 ], [ -80.491851365999935, 23.192572333000044 ] ] ], [ [ [ -81.683914255838204, 23.156927833552686 ], [ -81.658070441999939, 23.156805731000077 ], [ -81.642323370999918, 23.15884023600006 ], [ -81.628977016999897, 23.165228583000044 ], [ -81.617583787999934, 23.15961334800005 ], [ -81.606434699999909, 23.15884023600006 ], [ -81.594593878999945, 23.159328518000052 ], [ -81.581166144999941, 23.157782294000071 ], [ -81.574289516999897, 23.153998114000046 ], [ -81.556792772999927, 23.140814520000049 ], [ -81.535552537999934, 23.129380601000037 ], [ -81.532093878999945, 23.109320380000042 ], [ -81.535308397999927, 23.086330471000053 ], [ -81.540191209999932, 23.069037177000041 ], [ -81.546213344999899, 23.06118398600006 ], [ -81.552398240999935, 23.05735911700009 ], [ -81.552561001999948, 23.054348049000055 ], [ -81.540191209999932, 23.048570054000038 ], [ -81.528797980999911, 23.04718659100007 ], [ -81.517648891999897, 23.049790757000039 ], [ -81.502674933999913, 23.055365302000041 ], [ -81.498768683999913, 23.060492255000042 ], [ -81.492543097999942, 23.084865627000056 ], [ -81.489003058999913, 23.093247789000088 ], [ -81.48070227799991, 23.10032786700009 ], [ -81.47329667899993, 23.102606512000079 ], [ -81.464222785999937, 23.102850653000075 ], [ -81.380116339999915, 23.116359768000052 ], [ -81.368885870999918, 23.120917059000078 ], [ -81.358143683999913, 23.131740627000056 ], [ -81.333363410999937, 23.138251044000071 ], [ -81.286284959999932, 23.144761460000041 ], [ -81.271392381999931, 23.149562893000052 ], [ -81.234242316999939, 23.166449286000045 ], [ -81.209828253999945, 23.183742580000057 ], [ -81.165598110999952, 23.207831122000073 ], [ -81.149159308999913, 23.212388414000088 ], [ -81.130604620999918, 23.205633856000077 ], [ -81.14476477799991, 23.194281317000048 ], [ -81.172434048999946, 23.183661200000074 ], [ -81.217884894999941, 23.172674872000073 ], [ -81.272206183999913, 23.141994533000059 ], [ -81.286284959999932, 23.130519924000055 ], [ -81.286284959999932, 23.124253648000035 ], [ -81.241932745999918, 23.113714911000045 ], [ -81.184885219999899, 23.052069403000075 ], [ -81.149159308999913, 23.034898179000038 ], [ -81.129302537999934, 23.034491278000075 ], [ -81.120716925999943, 23.038967190000051 ], [ -81.113677537999934, 23.049221096000053 ], [ -81.098540818999936, 23.065985419000071 ], [ -81.093739386999914, 23.074204820000091 ], [ -81.083159959999932, 23.098700262000079 ], [ -81.078114386999914, 23.10382721600007 ], [ -81.066761847999942, 23.104966539000088 ], [ -81.046254035999937, 23.109849351000037 ], [ -81.039906378999945, 23.110663153000075 ], [ -80.99836178299995, 23.10382721600007 ], [ -80.991444464999915, 23.104071356000077 ], [ -80.987538214999915, 23.105861721000053 ], [ -80.985707160999937, 23.102240302000041 ], [ -80.985259568999936, 23.086411851000037 ], [ -80.977772589999915, 23.064439195000091 ], [ -80.959380662999934, 23.059027411000045 ], [ -80.936756964999915, 23.062933661000045 ], [ -80.916371222999942, 23.069037177000041 ], [ -80.759348110999952, 23.096991278000075 ], [ -80.734771287999934, 23.097601630000042 ], [ -80.68814042899993, 23.08860911700009 ], [ -80.663156704999949, 23.089544989000046 ], [ -80.642241990999935, 23.097805080000057 ], [ -80.623524542999917, 23.112941799000055 ], [ -80.618031378999945, 23.131740627000056 ], [ -80.636463995999918, 23.15102773600006 ], [ -80.623443162999934, 23.156724351000037 ], [ -80.609852667999917, 23.158189195000091 ], [ -80.597279425999943, 23.156073309000078 ], [ -80.587473110999952, 23.15102773600006 ], [ -80.587473110999952, 23.144761460000041 ], [ -80.59601803299995, 23.13743724200009 ], [ -80.622222459999932, 23.089544989000046 ], [ -80.594349738999938, 23.070135809000078 ], [ -80.593095662534779, 23.068032199226593 ], [ -80.59928666924435, 23.065672512176661 ], [ -80.61530636299824, 23.03717296056368 ], [ -80.61817440532451, 23.014280299696054 ], [ -80.61742509559167, 23.003945013751377 ], [ -80.618019374794301, 22.987305203272513 ], [ -80.623006150613321, 22.979424546705445 ], [ -80.630189175190253, 22.973972682892963 ], [ -80.640317755559977, 22.971104641466013 ], [ -80.646131353679039, 22.970484523841662 ], [ -80.650704719247358, 22.971363022985088 ], [ -80.659360521271026, 22.9770215932719 ], [ -80.663442958625637, 22.978804429980414 ], [ -80.667318692203878, 22.979424546705445 ], [ -80.672667202329535, 22.979088649921266 ], [ -80.677473110995265, 22.978029282725174 ], [ -80.691529099987974, 22.973068346227194 ], [ -80.695792406294515, 22.972603258233789 ], [ -80.720726283591091, 22.973275050902885 ], [ -80.725945604306162, 22.970717067838393 ], [ -80.729382087413398, 22.966402086487108 ], [ -80.732095100108779, 22.956945298786479 ], [ -80.732792731199595, 22.948987127853627 ], [ -80.732224291317948, 22.937825018709646 ], [ -80.728271044273242, 22.922606308834077 ], [ -80.727056647446318, 22.914493110068975 ], [ -80.729666307354194, 22.899997869705885 ], [ -80.735092332744955, 22.892763170084208 ], [ -80.740130785407416, 22.888008938261862 ], [ -80.747158780353402, 22.884288235213887 ], [ -80.748424852225128, 22.880515855322471 ], [ -80.746848721091567, 22.877647812996145 ], [ -80.743050502778487, 22.875735785078405 ], [ -80.739329799730456, 22.873306993223139 ], [ -80.737366095868595, 22.870077215690912 ], [ -80.73633256709428, 22.863514308738331 ], [ -80.734394700754819, 22.85886342970349 ], [ -80.730932380125239, 22.854057521937079 ], [ -80.720726283591091, 22.843696397570682 ], [ -80.714421759956224, 22.835273139543744 ], [ -80.711424527320048, 22.829821274831943 ], [ -80.708530645672738, 22.825893866208958 ], [ -80.704396532374062, 22.822405707157657 ], [ -80.687730881674838, 22.812251288366269 ], [ -80.667473720935448, 22.795973212193985 ], [ -80.651402351237493, 22.7970067409683 ], [ -80.644115973873056, 22.799952296761091 ], [ -80.624298061806087, 22.81341400834981 ], [ -80.604712693735792, 22.82033865050829 ], [ -80.595049201359529, 22.82049367923986 ], [ -80.587659471207587, 22.81747060818202 ], [ -80.584920620090543, 22.813646552346484 ], [ -80.580760668370147, 22.804939073479431 ], [ -80.579572109964886, 22.801580104738036 ], [ -80.57523128929256, 22.792846788348584 ], [ -80.568074104036668, 22.772176215559909 ], [ -80.552984585370325, 22.748224189294888 ], [ -80.550323248619009, 22.740705267933777 ], [ -80.551796026965064, 22.735589300905474 ], [ -80.557015346780815, 22.732721259478524 ], [ -80.566368780794562, 22.728948878687788 ], [ -80.57194983581627, 22.721429959125317 ], [ -80.573138394221473, 22.71571971289444 ], [ -80.571433071878744, 22.711301377856273 ], [ -80.564172532936027, 22.704247545387886 ], [ -80.559625006688691, 22.69740041849451 ], [ -80.557997198711746, 22.690811672220889 ], [ -80.557532110718341, 22.682130031775557 ], [ -80.562648077746587, 22.63515615523238 ], [ -80.561717901759721, 22.627818101024502 ], [ -80.559314948326175, 22.623658149304106 ], [ -80.554844937343944, 22.618981431847601 ], [ -80.549935675890708, 22.611178290545638 ], [ -80.547610235923628, 22.591515408109558 ], [ -80.544768032918398, 22.581386826840571 ], [ -80.540349697880231, 22.571413276101794 ], [ -80.534096849290165, 22.565082913145886 ], [ -80.519679125091557, 22.542009386024347 ], [ -80.539807094621722, 22.529271144847428 ], [ -80.543321092094686, 22.525162869071153 ], [ -80.565257737654463, 22.486870632073988 ], [ -80.571639776554434, 22.47865408052138 ], [ -80.576083950913585, 22.474390774214839 ], [ -80.580192226689917, 22.473563951015535 ], [ -80.588486294406948, 22.472633775028669 ], [ -80.594764981418734, 22.471393541578664 ], [ -80.601560432368046, 22.469223131242472 ], [ -80.623703782603457, 22.45953380044449 ], [ -80.630085822402748, 22.459197902760991 ], [ -80.634891730169215, 22.459766344441221 ], [ -80.644555223444797, 22.462841091443181 ], [ -80.736875170352789, 22.472013658303695 ], [ -80.760336270202686, 22.470204983173403 ], [ -80.767829353142133, 22.470592555901703 ], [ -80.81821387437077, 22.482969061872666 ], [ -80.829272630727303, 22.483356635500286 ], [ -80.83710160955161, 22.482038885885856 ], [ -80.845834926840382, 22.47650950770759 ], [ -80.849684821097583, 22.473512275071414 ], [ -80.861699591862646, 22.466587632912933 ], [ -80.882886928588846, 22.457363390108355 ], [ -80.888984748447342, 22.45379771579195 ], [ -80.900766975215731, 22.443359076160391 ], [ -80.903790046273627, 22.440129299527541 ], [ -80.909112717977564, 22.435633450123589 ], [ -80.921179164686691, 22.427571926403289 ], [ -80.928672247626139, 22.419226182742136 ], [ -80.928388027685287, 22.41736583076846 ], [ -80.925442470993232, 22.415893053321724 ], [ -80.920326503964986, 22.41506623012242 ], [ -80.916373256920281, 22.41333506935797 ], [ -80.91482296420844, 22.411087143756674 ], [ -80.91536556656763, 22.406849676771174 ], [ -80.921721767945201, 22.390519923755448 ], [ -80.925132411731397, 22.383621120917951 ], [ -80.940738695234586, 22.360134181747071 ], [ -80.942986619936562, 22.35491486283064 ], [ -80.941901415218126, 22.352899482125395 ], [ -80.939472621564221, 22.352279365400364 ], [ -80.935545213840555, 22.35261526128528 ], [ -80.930687629230704, 22.35413971647472 ], [ -80.925985074251741, 22.356155097179965 ], [ -80.922781135141236, 22.357188625954279 ], [ -80.919938931236686, 22.357111110689175 ], [ -80.916993373645255, 22.35607758191486 ], [ -80.913427701127489, 22.354088040530655 ], [ -80.91210995061374, 22.350057278220788 ], [ -80.913427701127489, 22.344889635248478 ], [ -80.921230842429395, 22.334037584466955 ], [ -80.924279751009692, 22.328094794239348 ], [ -80.925597499724802, 22.322823798479476 ], [ -80.924331427853076, 22.318793036169666 ], [ -80.921230842429395, 22.312204290795364 ], [ -80.921256679951796, 22.307036647822997 ], [ -80.922574428666962, 22.299155992155306 ], [ -80.927897102169538, 22.285280870315887 ], [ -80.929938321296504, 22.276547553027115 ], [ -80.930946010749778, 22.269106146931108 ], [ -80.929860806031343, 22.260011095335756 ], [ -80.928310513319502, 22.254791775520005 ], [ -80.926372646980042, 22.251510322043714 ], [ -80.923607958340597, 22.249469102017429 ], [ -80.919473843243281, 22.248409735720713 ], [ -80.903324958280166, 22.250218410850948 ], [ -80.89937171123546, 22.250089220541099 ], [ -80.89725297684339, 22.248978176501623 ], [ -80.896219448968395, 22.246704413377984 ], [ -80.89572852165395, 22.242131048708927 ], [ -80.894255744207214, 22.238410346560215 ], [ -80.893248053854563, 22.230142117264904 ], [ -80.897433844896, 22.211486925181418 ], [ -80.855343391384395, 22.183840033390823 ], [ -80.843044399779217, 22.172936305765859 ], [ -80.832269864262798, 22.157536728737 ], [ -80.800773078214945, 22.140741889526566 ], [ -80.765891485903353, 22.127461045990458 ], [ -80.752042201586335, 22.11958039032271 ], [ -80.744781664442257, 22.116944891993171 ], [ -80.741190151704131, 22.116944891993171 ], [ -80.73827043343374, 22.119399522270101 ], [ -80.735660772626545, 22.122448431749717 ], [ -80.732844408042979, 22.124644680507572 ], [ -80.728839484154832, 22.125884914856897 ], [ -80.712923143188505, 22.126453354738487 ], [ -80.705559252357602, 22.127512721934579 ], [ -80.696283331810321, 22.127693589987189 ], [ -80.691219041625459, 22.125600694016782 ], [ -80.684759488359703, 22.119632066266831 ], [ -80.6800310940597, 22.117926743924102 ], [ -80.670729335990075, 22.118340155973385 ], [ -80.656440803000635, 22.121905829390471 ], [ -80.635589362159294, 22.124386298089178 ], [ -80.624711472956108, 22.123507798945752 ], [ -80.61817440532451, 22.121285711766177 ], [ -80.611068895113419, 22.113973496879339 ], [ -80.608200852787093, 22.110020249834633 ], [ -80.606211311402888, 22.105472724486617 ], [ -80.605203620150917, 22.100201727827482 ], [ -80.604790209000953, 22.082786770093321 ], [ -80.602955695448998, 22.07144379289673 ], [ -80.600785285112806, 22.065320136415153 ], [ -80.593421394281904, 22.054313056002741 ], [ -80.593365862034759, 22.05423004999443 ], [ -80.638010219999899, 22.05304596600007 ], [ -80.761097785999937, 22.061102606000077 ], [ -80.905262824999909, 22.046128648000035 ], [ -80.992095506999931, 22.054266669000071 ], [ -81.011626756999931, 22.060532945000091 ], [ -81.049183722999942, 22.07843659100007 ], [ -81.088449673999946, 22.085842190000051 ], [ -81.103667772999927, 22.095892645000049 ], [ -81.113758917999917, 22.111232815000051 ], [ -81.139475063999896, 22.161810614000046 ], [ -81.142974412999934, 22.171535549000055 ], [ -81.143625454999949, 22.187404690000051 ], [ -81.136097785999937, 22.229885158000059 ], [ -81.140695766999897, 22.23273346600007 ], [ -81.167144334999932, 22.270819403000075 ], [ -81.180531378999945, 22.278876044000071 ], [ -81.193959113999938, 22.28156159100007 ], [ -81.205189581999946, 22.27806224200009 ], [ -81.211822068999936, 22.267767645000049 ], [ -81.21157792899993, 22.25531647300005 ], [ -81.19758053299995, 22.212469794000071 ], [ -81.196888800999943, 22.09125397300005 ], [ -81.204701300999943, 22.060288804000038 ], [ -81.225493943999936, 22.061672268000052 ], [ -81.21125240799995, 22.083482164000088 ], [ -81.215443488999938, 22.114976304000038 ], [ -81.229807094999899, 22.143947658000059 ], [ -81.239125128999945, 22.151068427000041 ], [ -81.267079230999911, 22.141587632000039 ], [ -81.273304816999939, 22.137396552000041 ], [ -81.276437954999949, 22.128892320000091 ], [ -81.275257941999939, 22.110256252000056 ], [ -81.27953040299991, 22.102606512000079 ], [ -81.29133053299995, 22.097560940000051 ], [ -81.299305792999917, 22.101263739000046 ], [ -81.306060350999928, 22.107367255000042 ], [ -81.314279751999948, 22.109523830000057 ], [ -81.321522589999915, 22.104722398000035 ], [ -81.322743292999917, 22.097845770000049 ], [ -81.325591600999928, 22.091701565000051 ], [ -81.337880011999914, 22.089016018000052 ], [ -81.374094204999949, 22.10415273600006 ], [ -81.396107550999943, 22.170721747000073 ], [ -81.434071417999917, 22.185777085000041 ], [ -81.482167120999918, 22.185777085000041 ], [ -81.493560350999928, 22.188869533000059 ], [ -81.512806769999941, 22.201971747000073 ], [ -81.523508266999897, 22.205023505000042 ], [ -81.531239386999914, 22.201971747000073 ], [ -81.545887824999909, 22.188869533000059 ], [ -81.557606574999909, 22.185777085000041 ], [ -81.560210740999935, 22.184637762000079 ], [ -81.562123175999943, 22.182074286000045 ], [ -81.565174933999913, 22.179510809000078 ], [ -81.571197068999936, 22.17837148600006 ], [ -81.574330206999946, 22.180121161000045 ], [ -81.576771613999938, 22.188869533000059 ], [ -81.581166144999941, 22.19204336100006 ], [ -81.622710740999935, 22.205023505000042 ], [ -81.627797003999945, 22.207953192000048 ], [ -81.639556443999936, 22.212713934000078 ], [ -81.651478644999941, 22.212958075000074 ], [ -81.656849738999938, 22.201971747000073 ], [ -81.666615363999938, 22.19790273600006 ], [ -81.688628709999932, 22.196844794000071 ], [ -81.711984829999949, 22.199164130000042 ], [ -81.725738084999932, 22.205023505000042 ], [ -81.732004360999952, 22.205023505000042 ], [ -81.73460852799991, 22.192775783000059 ], [ -81.741078253999945, 22.189601955000057 ], [ -81.759917772999927, 22.19204336100006 ], [ -81.756906704999949, 22.188055731000077 ], [ -81.755238410999937, 22.185370184000078 ], [ -81.752512173999946, 22.17837148600006 ], [ -81.763539191999939, 22.178412177000041 ], [ -81.810210740999935, 22.183823960000041 ], [ -81.82445227799991, 22.18891022300005 ], [ -81.849680141999897, 22.214992580000057 ], [ -81.858754035999937, 22.228908596000053 ], [ -81.862375454999949, 22.243557033000059 ], [ -81.879709438999896, 22.26040273600006 ], [ -82.021392381999931, 22.313299872000073 ], [ -82.035878058999913, 22.320990302000041 ], [ -82.05101477799991, 22.332586981000077 ], [ -82.059966600999928, 22.337307033000059 ], [ -82.079904751999948, 22.33930084800005 ], [ -82.088246222999942, 22.342230536000045 ], [ -82.093169725999928, 22.347845770000049 ], [ -82.104644334999932, 22.366197007000039 ], [ -82.105620897999927, 22.370184637000079 ], [ -82.119252081999946, 22.370062567000048 ], [ -82.137603318999936, 22.372137762000079 ], [ -82.15453040299991, 22.379868882000039 ], [ -82.163970506999931, 22.396877346000053 ], [ -82.158384389999924, 22.412534203000064 ], [ -82.146392381999931, 22.42218659100007 ], [ -82.131214972999942, 22.428127346000053 ], [ -82.118737067999916, 22.431827964000036 ], [ -82.003629358999945, 22.428152882000063 ], [ -81.966079797999896, 22.437123578000069 ], [ -81.939472509999916, 22.433215589000042 ], [ -81.909035309999922, 22.43546427800004 ], [ -81.890575232999936, 22.438550096000085 ], [ -81.863891580999905, 22.432626484000082 ], [ -81.841138343999944, 22.430757290000088 ], [ -81.789641646999939, 22.438316738000083 ], [ -81.750070766999897, 22.454006252000056 ], [ -81.738840298999946, 22.452093817000048 ], [ -81.728505011999914, 22.457220770000049 ], [ -81.708729620999918, 22.457180080000057 ], [ -81.697865363999938, 22.459540106000077 ], [ -81.68350178299994, 22.463594853000075 ], [ -81.67030253799993, 22.475948351000056 ], [ -81.660949184999936, 22.484185962000083 ], [ -81.651562644999899, 22.487827104000075 ], [ -81.652803766999909, 22.50878298400005 ], [ -81.648793097999942, 22.51829661700009 ], [ -81.651308485999948, 22.533840785000052 ], [ -81.642648891999897, 22.56195709800005 ], [ -81.643255003999911, 22.572736736000081 ], [ -81.65071455219578, 22.5750738990961 ], [ -81.649231980271679, 22.577162400924067 ], [ -81.648085699895091, 22.578777166932696 ], [ -81.647233039173386, 22.579474798922831 ], [ -81.643925747275375, 22.580870062903045 ], [ -81.639481573815544, 22.583893133960942 ], [ -81.636122605973469, 22.586838691552373 ], [ -81.623358527274206, 22.606010647573328 ], [ -81.614754401194659, 22.616397610361389 ], [ -81.609095831807167, 22.625105089228441 ], [ -81.605917731118382, 22.632468980059343 ], [ -81.603850673569696, 22.639522813427106 ], [ -81.596176724376335, 22.690088201809033 ], [ -81.598088752294075, 22.704971014900423 ], [ -81.614340990044639, 22.718432726489141 ], [ -81.652116462204958, 22.739930121577856 ], [ -81.657981737167404, 22.749361069957388 ], [ -81.6575424866964, 22.764631455777021 ], [ -81.646638759970756, 22.789901230757152 ], [ -81.646638759970756, 22.796128240925555 ], [ -81.650902066277297, 22.801657620003141 ], [ -81.663795336185785, 22.810184230817583 ], [ -81.679169073893604, 22.823568427141197 ], [ -81.695498826909329, 22.850646878150883 ], [ -81.682605557000841, 22.888008938261862 ], [ -81.68009924988047, 22.916586005140005 ], [ -81.679039882684435, 22.920668443393936 ], [ -81.679789190618635, 22.927489731865592 ], [ -81.68066769066138, 22.930667833453754 ], [ -81.692269050276423, 22.946454983210913 ], [ -81.708572963971108, 22.966014512859488 ], [ -81.716427782116455, 22.972758286965359 ], [ -81.723688321059171, 22.97800344520283 ], [ -81.730974698423552, 22.980613105110706 ], [ -81.742007616358421, 22.981853339460031 ], [ -81.745573289775507, 22.983636176168602 ], [ -81.747175259330731, 22.986840115279051 ], [ -81.744643113788641, 22.99456574131591 ], [ -81.743015305811696, 22.998260605942221 ], [ -81.741878425149196, 23.00030182506913 ], [ -81.741387498734071, 23.000973619536921 ], [ -81.735754767768299, 23.005546983306601 ], [ -81.715497606129588, 23.018414414793369 ], [ -81.706195848059906, 23.030403347136769 ], [ -81.702268439436921, 23.031953639848609 ], [ -81.699839646682335, 23.034821682174879 ], [ -81.700098029100729, 23.037663886079486 ], [ -81.704490525717176, 23.043141588313631 ], [ -81.713068814274322, 23.049523627213603 ], [ -81.713688930999353, 23.053270169582618 ], [ -81.711751064659893, 23.058256944502375 ], [ -81.704645555348065, 23.067377835418768 ], [ -81.699477912375755, 23.070142524058213 ], [ -81.694310269403388, 23.070297552789839 ], [ -81.684750128915312, 23.065026557029967 ], [ -81.682062953742332, 23.064096381043157 ], [ -81.680564337873875, 23.064509793092441 ], [ -81.680745205027165, 23.071460272773379 ], [ -81.68257971857912, 23.084172675528521 ], [ -81.695343798177703, 23.136546739040739 ], [ -81.685215216908716, 23.148742376959092 ], [ -81.683914255838204, 23.156927833552686 ] ] ], [ [ [ -81.556263800999943, 22.065985419000071 ], [ -81.549387173999946, 22.058417059000078 ], [ -81.547027147999927, 22.044582424000055 ], [ -81.55492102799991, 22.044012762000079 ], [ -81.565419074999909, 22.049872137000079 ], [ -81.575754360999952, 22.049058335000041 ], [ -81.581857876999948, 22.050604559000078 ], [ -81.586333787999934, 22.056789455000057 ], [ -81.588856574999909, 22.064357815000051 ], [ -81.588856574999909, 22.072699286000045 ], [ -81.582508917999917, 22.076605536000045 ], [ -81.571522589999915, 22.074123440000051 ], [ -81.561146613999938, 22.069159247000073 ], [ -81.556263800999943, 22.065985419000071 ] ] ], [ [ [ -80.668527798999946, 23.212225653000075 ], [ -80.665882941999939, 23.209173895000049 ], [ -80.663644985999952, 23.201402085000041 ], [ -80.666127081999946, 23.194484768000052 ], [ -80.670521613999938, 23.194810289000088 ], [ -80.673695441999939, 23.194037177000041 ], [ -80.674672003999945, 23.186835028000075 ], [ -80.679839647999927, 23.185614325000074 ], [ -80.691314256999931, 23.187730210000041 ], [ -80.698841925999943, 23.18390534100007 ], [ -80.700835740999935, 23.17719147300005 ], [ -80.704253709999932, 23.18032461100006 ], [ -80.704945441999939, 23.193060614000046 ], [ -80.694894985999952, 23.203924872000073 ], [ -80.677601691999939, 23.210272528000075 ], [ -80.668527798999946, 23.212225653000075 ] ] ], [ [ [ -80.775013800999943, 23.206610419000071 ], [ -80.712473110999952, 23.199896552000041 ], [ -80.711008266999897, 23.197007554000038 ], [ -80.711903449999909, 23.190822658000059 ], [ -80.717762824999909, 23.188950914000088 ], [ -80.725168423999946, 23.192775783000059 ], [ -80.732289191999939, 23.193060614000046 ], [ -80.736805792999917, 23.186753648000035 ], [ -80.740834113999938, 23.184271552000041 ], [ -80.762074347999942, 23.193182684000078 ], [ -80.773833787999934, 23.196600653000075 ], [ -80.780751105999911, 23.197699286000045 ], [ -80.799224412999934, 23.195868231000077 ], [ -80.810047980999911, 23.196600653000075 ], [ -80.838490363999938, 23.206244208000044 ], [ -80.848255988999938, 23.208482164000088 ], [ -80.855620897999927, 23.217718817000048 ], [ -80.861439581999946, 23.220363674000055 ], [ -80.857329881999931, 23.225816148000035 ], [ -80.837880011999914, 23.223537502000056 ], [ -80.809925910999937, 23.213812567000048 ], [ -80.775013800999943, 23.206610419000071 ] ] ], [ [ [ -80.878773566999939, 23.250433661000045 ], [ -80.874134894999941, 23.248968817000048 ], [ -80.870920376999948, 23.240383205000057 ], [ -80.878570115999935, 23.232123114000046 ], [ -80.890126105999911, 23.233872789000088 ], [ -80.901234503999945, 23.237209377000056 ], [ -80.913156704999949, 23.238714911000045 ], [ -80.92446855399993, 23.243109442000048 ], [ -80.929432745999918, 23.250148830000057 ], [ -80.933745897999927, 23.254461981000077 ], [ -80.942697719999899, 23.25726959800005 ], [ -80.93586178299995, 23.26312897300005 ], [ -80.912993943999936, 23.265570380000042 ], [ -80.885609503999945, 23.250067450000074 ], [ -80.878773566999939, 23.250433661000045 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-10", "NAME_1": "Las Tunas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -76.944813605999911, 21.45774974200009 ], [ -76.92992102799991, 21.447943427000041 ], [ -76.893706834999932, 21.431626695000091 ], [ -76.838449673999946, 21.420599677000041 ], [ -76.825428839999915, 21.411200262000079 ], [ -76.83226477799991, 21.397528387000079 ], [ -76.811756964999915, 21.397528387000079 ], [ -76.817616339999915, 21.376898505000042 ], [ -76.825550910999937, 21.36664459800005 ], [ -76.837717251999948, 21.363185940000051 ], [ -76.873158331999946, 21.361070054000038 ], [ -76.887440558999913, 21.355658270000049 ], [ -76.897450324999909, 21.346096096000053 ], [ -76.901193813999953, 21.332017320000091 ], [ -76.887277798999946, 21.30735911700009 ], [ -76.83617102799991, 21.332464911000045 ], [ -76.839100714999915, 21.307562567000048 ], [ -76.829457160999937, 21.314113674000055 ], [ -76.825021938999953, 21.324408270000049 ], [ -76.82258053299995, 21.33657461100006 ], [ -76.81859290299991, 21.348537502000056 ], [ -76.825428839999915, 21.348537502000056 ], [ -76.811431443999936, 21.368068752000056 ], [ -76.80728105399993, 21.378119208000044 ], [ -76.805572068999936, 21.39008209800005 ], [ -76.744130011999914, 21.370266018000052 ], [ -76.738392706999946, 21.37055084800005 ], [ -76.730580206999946, 21.374945380000042 ], [ -76.726144985999952, 21.373277085000041 ], [ -76.709339972999942, 21.362779039000088 ], [ -76.68228105399993, 21.356634833000044 ], [ -76.671498175999943, 21.355943101000037 ], [ -76.656076626999948, 21.349554755000042 ], [ -76.642486131999931, 21.335516669000071 ], [ -76.636586066999939, 21.321356512000079 ], [ -76.643910285999937, 21.315008856000077 ], [ -76.660145636999914, 21.311590887000079 ], [ -76.716175910999937, 21.287665106000077 ], [ -76.712310350999928, 21.302639065000051 ], [ -76.721506313999953, 21.311468817000048 ], [ -76.731434699999909, 21.311916408000059 ], [ -76.729847785999937, 21.301336981000077 ], [ -76.73468990799995, 21.285549221000053 ], [ -76.72134355399993, 21.279038804000038 ], [ -76.701161261999914, 21.275864976000037 ], [ -76.685210740999935, 21.269964911000045 ], [ -76.67015540299991, 21.259019273000035 ], [ -76.653309699999909, 21.251898505000042 ], [ -76.634388800999943, 21.247992255000042 ], [ -76.613148566999939, 21.24673086100006 ], [ -76.613148566999939, 21.252915757000039 ], [ -76.634917772999927, 21.26007721600007 ], [ -76.641468878999945, 21.264634507000039 ], [ -76.647328253999945, 21.273382880000042 ], [ -76.654042120999918, 21.28774648600006 ], [ -76.653553839999915, 21.294134833000044 ], [ -76.634266730999911, 21.301336981000077 ], [ -76.616769985999952, 21.301825262000079 ], [ -76.592925584999932, 21.294826565000051 ], [ -76.570790167999917, 21.282416083000044 ], [ -76.557932094999899, 21.266587632000039 ], [ -76.551665818999936, 21.266587632000039 ], [ -76.551665818999936, 21.287665106000077 ], [ -76.544911261999914, 21.287665106000077 ], [ -76.548410610999952, 21.247626044000071 ], [ -76.559885219999899, 21.234523830000057 ], [ -76.613148566999939, 21.232367255000042 ], [ -76.613148566999939, 21.225572007000039 ], [ -76.592681443999936, 21.225572007000039 ], [ -76.602365688999953, 21.220200914000088 ], [ -76.606312628999945, 21.218736070000091 ], [ -76.598255988999938, 21.205877997000073 ], [ -76.588449673999946, 21.206366278000075 ], [ -76.577300584999932, 21.211371161000045 ], [ -76.565337693999936, 21.211981512000079 ], [ -76.556792772999927, 21.205226955000057 ], [ -76.546742316999939, 21.18781159100007 ], [ -76.537464972999942, 21.184637762000079 ], [ -76.532378709999932, 21.186712958000044 ], [ -76.525502081999946, 21.191595770000049 ], [ -76.519520636999914, 21.197251695000091 ], [ -76.516957160999937, 21.202053127000056 ], [ -76.514556443999936, 21.205267645000049 ], [ -76.508941209999932, 21.205471096000053 ], [ -76.502430792999917, 21.204738674000055 ], [ -76.497059699999909, 21.205145575000074 ], [ -76.467640753999945, 21.22134023600006 ], [ -76.456125454999949, 21.225572007000039 ], [ -76.471587693999936, 21.230658270000049 ], [ -76.504261847999942, 21.234808661000045 ], [ -76.516957160999937, 21.239243882000039 ], [ -76.529042120999918, 21.252630927000041 ], [ -76.532378709999932, 21.268622137000079 ], [ -76.525542772999927, 21.282049872000073 ], [ -76.507313605999911, 21.287665106000077 ], [ -76.387562628999945, 21.284328518000052 ], [ -76.363026495999918, 21.277085679000038 ], [ -76.348784959999932, 21.266058661000045 ], [ -76.316517706999946, 21.25421784100007 ], [ -76.313547330045253, 21.251898504712187 ], [ -76.314199387991323, 21.250667018967761 ], [ -76.318075120670244, 21.194262193145676 ], [ -76.325671556397197, 21.177570705823371 ], [ -76.330839200268883, 21.174444281078706 ], [ -76.334740769570828, 21.171059474814911 ], [ -76.339960090285899, 21.164470730339929 ], [ -76.340295987070135, 21.158243720171527 ], [ -76.336859503962899, 21.140337836022297 ], [ -76.338513150361564, 21.134059149909831 ], [ -76.343913337330662, 21.12749624295725 ], [ -76.370836757810139, 21.111709093200091 ], [ -76.392592536216569, 21.103182481486328 ], [ -76.437008429695254, 21.076362412895037 ], [ -76.453079800292528, 21.063598334195774 ], [ -76.458815884045805, 21.060652778402982 ], [ -76.48356889508841, 21.042307643782692 ], [ -76.50245663116857, 21.024195054957829 ], [ -76.514368049146128, 20.996212267282317 ], [ -76.517236090573135, 20.981277778246863 ], [ -76.5207759255685, 20.978409735920536 ], [ -76.527623054260516, 20.977557074299511 ], [ -76.532558153236153, 20.978332221554751 ], [ -76.538423428198655, 20.980399278204118 ], [ -76.547802699734802, 20.979804999001487 ], [ -76.56082516085246, 20.976626899212022 ], [ -76.613586798891617, 20.955181179168051 ], [ -76.629735683854733, 20.951641344172685 ], [ -76.636789517222439, 20.951098740914119 ], [ -76.642809820916511, 20.951563828907581 ], [ -76.647279832798006, 20.953320828093752 ], [ -76.652809210976272, 20.956886502410157 ], [ -76.662756924192706, 20.965309760437094 ], [ -76.674668342170264, 20.970348212200236 ], [ -76.687303228760982, 20.936138414356321 ], [ -76.686347215251772, 20.865496731488975 ], [ -76.687923347284652, 20.851518255962731 ], [ -76.691308152649128, 20.841932277952253 ], [ -76.709575772004257, 20.819608058764857 ], [ -76.71678463410359, 20.806404731393229 ], [ -76.71965267642986, 20.797283840476837 ], [ -76.721125453876596, 20.784287217780843 ], [ -76.720892909879865, 20.776406562113152 ], [ -76.71872250044305, 20.770825507091445 ], [ -76.707818772818086, 20.759534206738238 ], [ -76.702547777058271, 20.752454534948811 ], [ -76.698827074010239, 20.742636012941603 ], [ -76.699473029156934, 20.736564032404146 ], [ -76.702237717796436, 20.732068183000251 ], [ -76.712392136587823, 20.725634467256839 ], [ -76.721900601131836, 20.722301336937107 ], [ -76.762182380412526, 20.706953436751689 ], [ -76.766290656188801, 20.704292100899693 ], [ -76.782878790723601, 20.690985418941921 ], [ -76.793446620665009, 20.695274562770862 ], [ -76.812024299281973, 20.732610785359441 ], [ -76.821300218030615, 20.739767971514652 ], [ -76.836105515856843, 20.743333644931738 ], [ -76.858688116563314, 20.743101100935064 ], [ -76.9012178214453, 20.74785533275741 ], [ -76.92121659976624, 20.747596951238279 ], [ -76.929252285064877, 20.746537584042244 ], [ -76.970955165848238, 20.753565578988287 ], [ -76.993227709091514, 20.746460068777139 ], [ -77.008084682861806, 20.744496364915278 ], [ -77.02162390791699, 20.743953762556089 ], [ -77.03805701372022, 20.738992825158732 ], [ -77.046867845374777, 20.738760281162001 ], [ -77.053456589849702, 20.740879015554128 ], [ -77.068029343679257, 20.750620022296175 ], [ -77.104357875915241, 20.763435776939559 ], [ -77.202491420942295, 20.76614879053426 ], [ -77.225875007325726, 20.772220771071716 ], [ -77.228355476024376, 20.778163560400003 ], [ -77.232205370281577, 20.784209703415058 ], [ -77.238639086024989, 20.784209703415058 ], [ -77.246209683330221, 20.781031601826953 ], [ -77.261815965034771, 20.77056712557237 ], [ -77.268198004834062, 20.767544054514474 ], [ -77.272202927822832, 20.767466539249369 ], [ -77.276259527655043, 20.777026678838126 ], [ -77.281685553945124, 20.782736925069003 ], [ -77.285328741728051, 20.781625881029584 ], [ -77.288119269688536, 20.777078354782248 ], [ -77.289359504037861, 20.766407172053334 ], [ -77.291349047220763, 20.760619412355993 ], [ -77.293726162232588, 20.755735989324421 ], [ -77.303673876348284, 20.744961452908683 ], [ -77.307265388187091, 20.739302883521248 ], [ -77.309616664777252, 20.73297252056534 ], [ -77.310779384760792, 20.730595405553515 ], [ -77.312717251100253, 20.728399155896284 ], [ -77.316851366197568, 20.726022039985139 ], [ -77.332405971958053, 20.719226589035827 ], [ -77.336540087055369, 20.716436061974662 ], [ -77.33668027431905, 20.71633924892582 ], [ -77.343129035999937, 20.718491929000038 ], [ -77.37173417899993, 20.716131903000075 ], [ -77.403187628999945, 20.709173895000049 ], [ -77.429351365999935, 20.698431708000044 ], [ -77.442372199999909, 20.684393622000073 ], [ -77.451893683999913, 20.690008856000077 ], [ -77.45767167899993, 20.689886786000045 ], [ -77.462717251999948, 20.686997789000088 ], [ -77.469715949999909, 20.684393622000073 ], [ -77.480295376999948, 20.681789455000057 ], [ -77.486724412999934, 20.679185289000088 ], [ -77.493397589999915, 20.677476304000038 ], [ -77.504505988999938, 20.677557684000078 ], [ -77.521962042999917, 20.68032461100006 ], [ -77.572743292999917, 20.69798411700009 ], [ -77.61164303299995, 20.67845286700009 ], [ -77.620513475999928, 20.677557684000078 ], [ -77.63499915299991, 20.687933661000045 ], [ -77.641713019999941, 20.691148179000038 ], [ -77.649281378999945, 20.692572333000044 ], [ -77.678863084999932, 20.691148179000038 ], [ -77.686675584999932, 20.69204336100006 ], [ -77.706125454999949, 20.697414455000057 ], [ -77.712717251999948, 20.701117255000042 ], [ -77.716420050999943, 20.698879299000055 ], [ -77.729318813999953, 20.69798411700009 ], [ -77.778431769999941, 20.700751044000071 ], [ -77.79556230399993, 20.705877997000073 ], [ -77.822132941999939, 20.723049221000053 ], [ -77.831130344456355, 20.725558300366398 ], [ -77.831109382392071, 20.725686143200903 ], [ -77.817725186068458, 20.807309068059055 ], [ -77.765790371228661, 20.876193753538871 ], [ -77.742174241747819, 20.874669298349431 ], [ -77.68117021373439, 20.885728053806645 ], [ -77.666029019123926, 20.891515815302625 ], [ -77.658096685713474, 20.896864325428282 ], [ -77.658690964916104, 20.902652086024943 ], [ -77.658535936184478, 20.909680080970929 ], [ -77.657528245831884, 20.917483222272892 ], [ -77.653316617268047, 20.933657944758352 ], [ -77.652644822800312, 20.939394029410892 ], [ -77.653523321943737, 20.9457502298892 ], [ -77.655151129920682, 20.952183946531875 ], [ -77.655125292398338, 20.960142117464727 ], [ -77.647425502984561, 20.965154730806148 ], [ -77.640810920087858, 20.966239936423904 ], [ -77.635281541909592, 20.964017849244328 ], [ -77.629778002153046, 20.956989854298342 ], [ -77.625876431052461, 20.95078868345098 ], [ -77.620812140867599, 20.944432481174033 ], [ -77.617013922554463, 20.941331894851032 ], [ -77.611510382797917, 20.940479234129327 ], [ -77.600141568078868, 20.939781602139192 ], [ -77.594973924207238, 20.938644721476692 ], [ -77.587351650957885, 20.937792059855667 ], [ -77.58422522711254, 20.940272529453637 ], [ -77.582261522351359, 20.943347276455654 ], [ -77.5823131991948, 20.955982163945691 ], [ -77.576990525692167, 20.969443875534409 ], [ -77.566913622165941, 20.974689031973242 ], [ -77.546656459627911, 20.980270086994892 ], [ -77.532187058585862, 20.982285467700137 ], [ -77.529396532424016, 20.996909898373076 ], [ -77.526786871616821, 21.000139675005983 ], [ -77.524177211708945, 21.000217190271087 ], [ -77.511361457065561, 20.999364529549382 ], [ -77.497925584797883, 21.000682278264492 ], [ -77.479735479808539, 21.004092922050688 ], [ -77.473172573755278, 21.011999417039476 ], [ -77.469994473066492, 21.018949896720358 ], [ -77.468935105870401, 21.025848700457118 ], [ -77.464826830094125, 21.034582016846571 ], [ -77.464749314829021, 21.035951443304441 ], [ -77.467074754796101, 21.043522039710354 ], [ -77.46777238588686, 21.047862861281999 ], [ -77.467901577096086, 21.053676459401061 ], [ -77.465963710756625, 21.056957912877351 ], [ -77.46239803733954, 21.059386704732617 ], [ -77.44792863629749, 21.066078802894424 ], [ -77.441055670982394, 21.073907781718731 ], [ -77.437670864718598, 21.076104031375905 ], [ -77.436120572006757, 21.076259060107532 ], [ -77.435629644692312, 21.074166165036445 ], [ -77.434492764029812, 21.071685696337795 ], [ -77.432864956052867, 21.06910187395232 ], [ -77.428627489067367, 21.063805039770727 ], [ -77.42560441800947, 21.060652778402982 ], [ -77.416922776664819, 21.048172918745195 ], [ -77.414907395959517, 21.043573717453057 ], [ -77.414054735237812, 21.038974514362337 ], [ -77.414519823231217, 21.03303172503405 ], [ -77.413693000031913, 21.030499579491959 ], [ -77.411419236908216, 21.02845836036505 ], [ -77.393926764808327, 21.024220893379493 ], [ -77.377235276586759, 21.023032334974289 ], [ -77.368786180138102, 21.021585395049897 ], [ -77.36390275710653, 21.020112615804578 ], [ -77.361835699557901, 21.017477118374302 ], [ -77.361525642094705, 21.015203355250605 ], [ -77.362326625972969, 21.012516180976945 ], [ -77.368967048190711, 21.003085231698094 ], [ -77.369664680180847, 21.000243027793488 ], [ -77.369793871390016, 20.997116603948086 ], [ -77.366641608223631, 20.990450344208 ], [ -77.356590542219749, 20.980657659723192 ], [ -77.346306932219136, 21.001509101463853 ], [ -77.339692349322434, 21.006573390749395 ], [ -77.333646206307378, 21.009493109919049 ], [ -77.328995327272537, 21.008485419566455 ], [ -77.324292772293575, 21.005255642034228 ], [ -77.314267543812093, 20.996186427961277 ], [ -77.308298916062085, 20.993395900900111 ], [ -77.300082363610159, 20.991147976198135 ], [ -77.291839972736511, 20.995023708877056 ], [ -77.263004523439974, 21.059903469569463 ], [ -77.248948534447266, 21.078351956077881 ], [ -77.237088793313148, 21.083648790259474 ], [ -77.227735358400082, 21.089178168437684 ], [ -77.222722744159285, 21.091219387564649 ], [ -77.193473883712727, 21.097110500948816 ], [ -77.18698849202525, 21.099048367288276 ], [ -77.174069382795778, 21.109538682863899 ], [ -77.167558152686581, 21.116825059329017 ], [ -77.131126267663092, 21.17351410599116 ], [ -77.135518765178858, 21.238083808321107 ], [ -77.134795294767002, 21.244930935214484 ], [ -77.129705166160477, 21.256687323561096 ], [ -77.073248664394328, 21.305521552077948 ], [ -77.071672533260767, 21.309164739860819 ], [ -77.073687913966069, 21.31265289981144 ], [ -77.079501512085074, 21.314099839735775 ], [ -77.117793749082239, 21.313893134160821 ], [ -77.122289597586871, 21.316838690852876 ], [ -77.127147183095985, 21.322703965815379 ], [ -77.131591355656496, 21.339111233196832 ], [ -77.130738694934792, 21.348490504732979 ], [ -77.124666714397335, 21.361461289906572 ], [ -77.116346809157903, 21.37068553271115 ], [ -77.10048214413564, 21.416470851748386 ], [ -77.080690069591014, 21.414326279833915 ], [ -77.057461513737849, 21.409029446551699 ], [ -77.039555629588619, 21.4098045920083 ], [ -77.012425502634812, 21.41616079428519 ], [ -76.999738939200654, 21.421638494720753 ], [ -76.971265225110017, 21.442464098039693 ], [ -76.955374721666033, 21.448432725789644 ], [ -76.947209846057547, 21.455796617519866 ], [ -76.944813605999911, 21.45774974200009 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-16", "NAME_1": "Mayabeque" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -82.100088300334789, 23.187648537050336 ], [ -82.088246222999942, 23.190415757000039 ], [ -82.065012173999946, 23.192572333000044 ], [ -82.05492102799991, 23.19476959800005 ], [ -82.044016079999949, 23.198716539000088 ], [ -82.033192511999914, 23.200506903000075 ], [ -82.023426886999914, 23.19594961100006 ], [ -81.985829230999911, 23.171454169000071 ], [ -81.956125454999949, 23.163641669000071 ], [ -81.892079230999911, 23.157863674000055 ], [ -81.862375454999949, 23.15102773600006 ], [ -81.84007727799991, 23.157782294000071 ], [ -81.683914255838204, 23.156927833552686 ], [ -81.685215216908716, 23.148742376959092 ], [ -81.695343798177703, 23.136546739040739 ], [ -81.68257971857912, 23.084172675528521 ], [ -81.680745205027165, 23.071460272773379 ], [ -81.680564337873875, 23.064509793092441 ], [ -81.682062953742332, 23.064096381043157 ], [ -81.684750128915312, 23.065026557029967 ], [ -81.694310269403388, 23.070297552789839 ], [ -81.699477912375755, 23.070142524058213 ], [ -81.704645555348065, 23.067377835418768 ], [ -81.711751064659893, 23.058256944502375 ], [ -81.713688930999353, 23.053270169582618 ], [ -81.713068814274322, 23.049523627213603 ], [ -81.704490525717176, 23.043141588313631 ], [ -81.700098029100729, 23.037663886079486 ], [ -81.699839646682335, 23.034821682174879 ], [ -81.702268439436921, 23.031953639848609 ], [ -81.706195848059906, 23.030403347136769 ], [ -81.715497606129588, 23.018414414793369 ], [ -81.735754767768299, 23.005546983306601 ], [ -81.741387498734071, 23.000973619536921 ], [ -81.741878425149196, 23.00030182506913 ], [ -81.743015305811696, 22.998260605942221 ], [ -81.744643113788641, 22.99456574131591 ], [ -81.747175259330731, 22.986840115279051 ], [ -81.745573289775507, 22.983636176168602 ], [ -81.742007616358421, 22.981853339460031 ], [ -81.730974698423552, 22.980613105110706 ], [ -81.723688321059171, 22.97800344520283 ], [ -81.716427782116455, 22.972758286965359 ], [ -81.708572963971108, 22.966014512859488 ], [ -81.692269050276423, 22.946454983210913 ], [ -81.68066769066138, 22.930667833453754 ], [ -81.679789190618635, 22.927489731865592 ], [ -81.679039882684435, 22.920668443393936 ], [ -81.68009924988047, 22.916586005140005 ], [ -81.682605557000841, 22.888008938261862 ], [ -81.695498826909329, 22.850646878150883 ], [ -81.679169073893604, 22.823568427141197 ], [ -81.663795336185785, 22.810184230817583 ], [ -81.650902066277297, 22.801657620003141 ], [ -81.646638759970756, 22.796128240925555 ], [ -81.646638759970756, 22.789901230757152 ], [ -81.6575424866964, 22.764631455777021 ], [ -81.657981737167404, 22.749361069957388 ], [ -81.652116462204958, 22.739930121577856 ], [ -81.614340990044639, 22.718432726489141 ], [ -81.598088752294075, 22.704971014900423 ], [ -81.596176724376335, 22.690088201809033 ], [ -81.603850673569696, 22.639522813427106 ], [ -81.605917731118382, 22.632468980059343 ], [ -81.609095831807167, 22.625105089228441 ], [ -81.614754401194659, 22.616397610361389 ], [ -81.623358527274206, 22.606010647573328 ], [ -81.636122605973469, 22.586838691552373 ], [ -81.639481573815544, 22.583893133960942 ], [ -81.643925747275375, 22.580870062903045 ], [ -81.647233039173386, 22.579474798922831 ], [ -81.648085699895091, 22.578777166932696 ], [ -81.649231980271679, 22.577162400924067 ], [ -81.65071455219578, 22.5750738990961 ], [ -81.65767724299991, 22.577255391000051 ], [ -81.672631177999904, 22.577679783000065 ], [ -81.700021938999896, 22.599595445000091 ], [ -81.718848665999928, 22.613702271000079 ], [ -81.753385962999914, 22.638036906000082 ], [ -81.788412189999917, 22.650097021000079 ], [ -81.877500934999944, 22.679730389000042 ], [ -81.91242428299995, 22.678534247000073 ], [ -81.992543097999942, 22.671698309000078 ], [ -82.098793446999935, 22.65492148800007 ], [ -82.130970831999946, 22.667873440000051 ], [ -82.198855197999933, 22.685773595000057 ], [ -82.274841361999904, 22.685616806000041 ], [ -82.317209438999896, 22.680975653000075 ], [ -82.339019334999932, 22.678656317000048 ], [ -82.359852667999917, 22.680812893000052 ], [ -82.391583815999923, 22.688420458000053 ], [ -82.387950241810188, 22.709693630156892 ], [ -82.39129437983172, 22.722239080968791 ], [ -82.404351811986544, 22.729922232924707 ], [ -82.41694692426114, 22.736723887397488 ], [ -82.437375403152316, 22.763280910585536 ], [ -82.457803882043493, 22.802095020568743 ], [ -82.457803882043493, 22.838866281853427 ], [ -82.449632490846739, 22.871551848439026 ], [ -82.437375403152316, 22.896066022928608 ], [ -82.437375403152316, 22.922623045217335 ], [ -82.435918748751249, 22.957281196470035 ], [ -82.419692349422348, 22.963379015429211 ], [ -82.412070075273732, 22.965471910500241 ], [ -82.405016241906026, 22.961234443514741 ], [ -82.394319220755392, 22.948987127853627 ], [ -82.388789841677863, 22.947850247191127 ], [ -82.381865201317964, 22.950614935830629 ], [ -82.368687709670041, 22.961441148190431 ], [ -82.36481197789044, 22.968417467192353 ], [ -82.355820279082593, 22.976685696487664 ], [ -82.316649542942059, 22.973300890223868 ], [ -82.290888840647483, 22.97490285887983 ], [ -82.280321010706075, 22.970562039106824 ], [ -82.270399135911362, 22.969321803858122 ], [ -82.258539394777245, 22.969399319123283 ], [ -82.249831915910192, 22.972577419812069 ], [ -82.24378577289508, 22.980251369904806 ], [ -82.236137661224063, 22.993170478234958 ], [ -82.202134568955159, 23.028129584013072 ], [ -82.201256069811734, 23.031798611116983 ], [ -82.202599656948621, 23.036552842939329 ], [ -82.211022914975558, 23.052650051059004 ], [ -82.212573207687342, 23.061331692403655 ], [ -82.212211473380762, 23.067739569725347 ], [ -82.209782680626176, 23.076188666174005 ], [ -82.209033372691977, 23.081227117937146 ], [ -82.209265916688707, 23.086110540968662 ], [ -82.210816210299868, 23.089908759281798 ], [ -82.211436327024842, 23.092725124764684 ], [ -82.210351122306406, 23.094146226267299 ], [ -82.204615037653866, 23.094533799894919 ], [ -82.199059821053879, 23.088978583294988 ], [ -82.191928474219708, 23.079599310859464 ], [ -82.188543667056592, 23.079056708500275 ], [ -82.182730068937531, 23.082699897182465 ], [ -82.176218837929014, 23.088358466569957 ], [ -82.171206223688273, 23.100864162850826 ], [ -82.170121018969837, 23.106186835454082 ], [ -82.168338182261266, 23.109468288930373 ], [ -82.164875860732366, 23.112491359988269 ], [ -82.160767584956091, 23.113809108703379 ], [ -82.151879238935692, 23.109674994505383 ], [ -82.14606563991731, 23.105902615513287 ], [ -82.110977342030708, 23.067610379415441 ], [ -82.101339688076109, 23.084017645897632 ], [ -82.099970261618239, 23.100941677216611 ], [ -82.098833380955739, 23.105463365042226 ], [ -82.09637874977949, 23.108279731424432 ], [ -82.090952725288048, 23.112543035932333 ], [ -82.090022549301182, 23.116832179761275 ], [ -82.092761400418283, 23.125798041046721 ], [ -82.093200649989967, 23.131430772012493 ], [ -82.090797695657102, 23.134970607907235 ], [ -82.081366747277571, 23.135384019057199 ], [ -82.076199104305203, 23.139388942945345 ], [ -82.092993944415014, 23.158896795750479 ], [ -82.098574999436664, 23.167888495457703 ], [ -82.096869676194558, 23.177913723039865 ], [ -82.100088300334789, 23.187648537050336 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-03", "NAME_1": "Ciudad de la Habana" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -82.538736165592212, 23.073564129558381 ], [ -82.532093878999945, 23.077093817000048 ], [ -82.50999915299991, 23.083319403000075 ], [ -82.504465298999946, 23.086493231000077 ], [ -82.494536912999934, 23.100653387000079 ], [ -82.489572719999899, 23.10382721600007 ], [ -82.47720292899993, 23.105169989000046 ], [ -82.467681443999936, 23.108547268000052 ], [ -82.452015753999945, 23.11749909100007 ], [ -82.422352667999917, 23.138861395000049 ], [ -82.40689042899993, 23.147447007000039 ], [ -82.367095506999931, 23.153021552000041 ], [ -82.321034308999913, 23.171454169000071 ], [ -82.251088019999941, 23.182114976000037 ], [ -82.219349738999938, 23.194240627000056 ], [ -82.150298631999931, 23.178900458000044 ], [ -82.128407355999911, 23.181057033000059 ], [ -82.100088300334789, 23.187648537050336 ], [ -82.096869676194558, 23.177913723039865 ], [ -82.098574999436664, 23.167888495457703 ], [ -82.092993944415014, 23.158896795750479 ], [ -82.076199104305203, 23.139388942945345 ], [ -82.081366747277571, 23.135384019057199 ], [ -82.090797695657102, 23.134970607907235 ], [ -82.093200649989967, 23.131430772012493 ], [ -82.092761400418283, 23.125798041046721 ], [ -82.090022549301182, 23.116832179761275 ], [ -82.090952725288048, 23.112543035932333 ], [ -82.09637874977949, 23.108279731424432 ], [ -82.098833380955739, 23.105463365042226 ], [ -82.099970261618239, 23.100941677216611 ], [ -82.101339688076109, 23.084017645897632 ], [ -82.110977342030708, 23.067610379415441 ], [ -82.14606563991731, 23.105902615513287 ], [ -82.151879238935692, 23.109674994505383 ], [ -82.160767584956091, 23.113809108703379 ], [ -82.164875860732366, 23.112491359988269 ], [ -82.168338182261266, 23.109468288930373 ], [ -82.170121018969837, 23.106186835454082 ], [ -82.171206223688273, 23.100864162850826 ], [ -82.176218837929014, 23.088358466569957 ], [ -82.182730068937531, 23.082699897182465 ], [ -82.188543667056592, 23.079056708500275 ], [ -82.191928474219708, 23.079599310859464 ], [ -82.199059821053879, 23.088978583294988 ], [ -82.204615037653866, 23.094533799894919 ], [ -82.210351122306406, 23.094146226267299 ], [ -82.211436327024842, 23.092725124764684 ], [ -82.210816210299868, 23.089908759281798 ], [ -82.209265916688707, 23.086110540968662 ], [ -82.209033372691977, 23.081227117937146 ], [ -82.209782680626176, 23.076188666174005 ], [ -82.212211473380762, 23.067739569725347 ], [ -82.212573207687342, 23.061331692403655 ], [ -82.211022914975558, 23.052650051059004 ], [ -82.202599656948621, 23.036552842939329 ], [ -82.201256069811734, 23.031798611116983 ], [ -82.202134568955159, 23.028129584013072 ], [ -82.236137661224063, 22.993170478234958 ], [ -82.24378577289508, 22.980251369904806 ], [ -82.249831915910192, 22.972577419812069 ], [ -82.258539394777245, 22.969399319123283 ], [ -82.270399135911362, 22.969321803858122 ], [ -82.280321010706075, 22.970562039106824 ], [ -82.290888840647483, 22.97490285887983 ], [ -82.316649542942059, 22.973300890223868 ], [ -82.355820279082593, 22.976685696487664 ], [ -82.36481197789044, 22.968417467192353 ], [ -82.368687709670041, 22.961441148190431 ], [ -82.381865201317964, 22.950614935830629 ], [ -82.388789841677863, 22.947850247191127 ], [ -82.394319220755392, 22.948987127853627 ], [ -82.405016241906026, 22.961234443514741 ], [ -82.412070075273732, 22.965471910500241 ], [ -82.419692349422348, 22.963379015429211 ], [ -82.435918748751249, 22.957281196470035 ], [ -82.445117154033426, 22.990612494271204 ], [ -82.44728756436956, 22.993041287025733 ], [ -82.450801560943262, 22.99554759414616 ], [ -82.452997809701117, 22.994488226950068 ], [ -82.455529955243207, 22.994255682953394 ], [ -82.492246060207492, 23.008802599260548 ], [ -82.499713303825899, 23.013918565389474 ], [ -82.502968919779789, 23.0182593860618 ], [ -82.50203874379298, 23.020429796397991 ], [ -82.482143317360169, 23.03601024058014 ], [ -82.473642544068127, 23.047714952083368 ], [ -82.474986132104277, 23.056861681421424 ], [ -82.485011358787176, 23.069548244855582 ], [ -82.492995368141692, 23.071615302404268 ], [ -82.499894171878509, 23.069935818483202 ], [ -82.50532019726927, 23.065439968179987 ], [ -82.517205776825108, 23.059729722848431 ], [ -82.534414028984258, 23.066757716895097 ], [ -82.538736165592212, 23.073564129558381 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-15", "NAME_1": "Artemisa" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -82.944424028446122, 22.985082820215951 ], [ -82.942453579999949, 22.986314195000091 ], [ -82.931752081999946, 23.011053778000075 ], [ -82.917591925999943, 23.032456773000035 ], [ -82.885161912999934, 23.033107815000051 ], [ -82.849354620999918, 23.027777411000045 ], [ -82.825306769999941, 23.031480210000041 ], [ -82.803293423999946, 23.038804429000038 ], [ -82.712717251999948, 23.034898179000038 ], [ -82.619984503999945, 23.046128648000035 ], [ -82.59601803299995, 23.055365302000041 ], [ -82.575510219999899, 23.054022528000075 ], [ -82.538736165592212, 23.073564129558381 ], [ -82.534414028984258, 23.066757716895097 ], [ -82.517205776825108, 23.059729722848431 ], [ -82.50532019726927, 23.065439968179987 ], [ -82.499894171878509, 23.069935818483202 ], [ -82.492995368141692, 23.071615302404268 ], [ -82.485011358787176, 23.069548244855582 ], [ -82.474986132104277, 23.056861681421424 ], [ -82.473642544068127, 23.047714952083368 ], [ -82.482143317360169, 23.03601024058014 ], [ -82.50203874379298, 23.020429796397991 ], [ -82.502968919779789, 23.0182593860618 ], [ -82.499713303825899, 23.013918565389474 ], [ -82.492246060207492, 23.008802599260548 ], [ -82.455529955243207, 22.994255682953394 ], [ -82.452997809701117, 22.994488226950068 ], [ -82.450801560943262, 22.99554759414616 ], [ -82.44728756436956, 22.993041287025733 ], [ -82.445117154033426, 22.990612494271204 ], [ -82.435918748751249, 22.957281196470035 ], [ -82.437375403152316, 22.922623045217335 ], [ -82.437375403152316, 22.896066022928608 ], [ -82.449632490846739, 22.871551848439026 ], [ -82.457803882043493, 22.838866281853427 ], [ -82.457803882043493, 22.802095020568743 ], [ -82.437375403152316, 22.763280910585536 ], [ -82.41694692426114, 22.736723887397488 ], [ -82.404351811986544, 22.729922232924707 ], [ -82.39129437983172, 22.722239080968791 ], [ -82.387950241810188, 22.709693630156892 ], [ -82.391583815999923, 22.688420458000053 ], [ -82.45735629099994, 22.68038488600007 ], [ -82.50999915299991, 22.692287502000056 ], [ -82.52171790299991, 22.69017161700009 ], [ -82.541086391999897, 22.680812893000052 ], [ -82.550933397999927, 22.678656317000048 ], [ -82.597418005999941, 22.688008495000076 ], [ -82.632945362999919, 22.680184949000079 ], [ -82.738433397999927, 22.706366278000075 ], [ -82.759877081999946, 22.705959377000056 ], [ -82.780669725999928, 22.696112372000073 ], [ -82.790882941999939, 22.679877020000049 ], [ -82.794300910999937, 22.66046784100007 ], [ -82.794585740999935, 22.640814520000049 ], [ -82.800689256999931, 22.622748114000046 ], [ -82.815419074999909, 22.613430080000057 ], [ -82.824601541721293, 22.610579205774144 ], [ -82.82501644575234, 22.61451141996605 ], [ -82.828013679287835, 22.620376694928495 ], [ -82.835765143746357, 22.631228745710018 ], [ -82.868863897550796, 22.665748602815768 ], [ -82.873437263119172, 22.673603420061795 ], [ -82.893151822398693, 22.71626231525363 ], [ -82.900644904438764, 22.728561305959488 ], [ -82.907078620182176, 22.736752020889014 ], [ -82.912737188670292, 22.740705267933777 ], [ -82.921883918008405, 22.745433661334403 ], [ -82.92544959232481, 22.747914130033053 ], [ -82.937567714978059, 22.762977810277732 ], [ -82.954078335147017, 22.789306952453899 ], [ -82.959090949387814, 22.795637315409749 ], [ -82.963095873275904, 22.79912547536037 ], [ -82.974257982419942, 22.803698839130107 ], [ -82.976428391856757, 22.805300807786011 ], [ -82.978030362311358, 22.807109482916303 ], [ -82.976635098331087, 22.809047350155083 ], [ -82.971906704031142, 22.810830185964278 ], [ -82.947567105037876, 22.81341400834981 ], [ -82.939712286892529, 22.816152859466854 ], [ -82.934544643920162, 22.820235296821465 ], [ -82.915941127780798, 22.840569972825961 ], [ -82.914675055909072, 22.849509995689743 ], [ -82.919170905313024, 22.873772081216543 ], [ -82.944389004349034, 22.91898895947287 ], [ -82.940849169353669, 22.93885854748396 ], [ -82.940823330032629, 22.943431912153017 ], [ -82.945396694701685, 22.979579576336334 ], [ -82.944424028446122, 22.985082820215951 ] ] ], [ [ [ -82.514475063999896, 22.625148830000057 ], [ -82.510812954999949, 22.613185940000051 ], [ -82.507720506999931, 22.590073960000041 ], [ -82.513579881999931, 22.572455145000049 ], [ -82.518788214999915, 22.565741278000075 ], [ -82.522857225999928, 22.55931224200009 ], [ -82.527455206999946, 22.563462632000039 ], [ -82.525298631999931, 22.626369533000059 ], [ -82.527821417999917, 22.634751695000091 ], [ -82.528309699999909, 22.640041408000059 ], [ -82.524566209999932, 22.640855210000041 ], [ -82.51976477799991, 22.636664130000042 ], [ -82.51593990799995, 22.629136460000041 ], [ -82.514475063999896, 22.625148830000057 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-01", "NAME_1": "Pinar del Río" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -82.824601541721293, 22.610579205774144 ], [ -82.849232550999943, 22.602932033000059 ], [ -82.909291144999941, 22.555568752000056 ], [ -82.921254035999937, 22.54828522300005 ], [ -82.943959113999938, 22.546576239000046 ], [ -82.959380662999934, 22.542059637000079 ], [ -83.025990363999938, 22.509751695000091 ], [ -83.058705206999946, 22.489447333000044 ], [ -83.086089647999927, 22.462795315000051 ], [ -83.143177863999938, 22.361273505000042 ], [ -83.166859503999945, 22.339544989000046 ], [ -83.199330206999946, 22.336004950000074 ], [ -83.232248501999948, 22.344794012000079 ], [ -83.245838995999918, 22.345933335000041 ], [ -83.260121222999942, 22.342230536000045 ], [ -83.260568813999896, 22.339748440000051 ], [ -83.260121222999942, 22.325751044000071 ], [ -83.261789516999897, 22.321966864000046 ], [ -83.265695766999897, 22.322251695000091 ], [ -83.270253058999913, 22.323553778000075 ], [ -83.277455206999946, 22.32103099200009 ], [ -83.281971808999913, 22.322333075000074 ], [ -83.28579667899993, 22.322699286000045 ], [ -83.28742428299995, 22.31867096600007 ], [ -83.286936001999948, 22.304632880000042 ], [ -83.28742428299995, 22.301906643000052 ], [ -83.323597785999937, 22.280218817000048 ], [ -83.335804816999939, 22.267767645000049 ], [ -83.341175910999937, 22.259344794000071 ], [ -83.34203040299991, 22.25454336100006 ], [ -83.341460740999935, 22.251044012000079 ], [ -83.342640753999945, 22.246649481000077 ], [ -83.349232550999943, 22.232163804000038 ], [ -83.354115363999938, 22.225775458000044 ], [ -83.363148566999939, 22.219305731000077 ], [ -83.366363084999932, 22.222398179000038 ], [ -83.367909308999913, 22.225572007000039 ], [ -83.368478969999899, 22.213853257000039 ], [ -83.375559048999946, 22.206976630000042 ], [ -83.381147589999898, 22.217147133000083 ], [ -83.389440523999951, 22.220365092000065 ], [ -83.398222607999912, 22.21928046000005 ], [ -83.398991226999897, 22.202831413000069 ], [ -83.415472436999949, 22.186093371000084 ], [ -83.465321417999917, 22.182074286000045 ], [ -83.516957160999937, 22.18821849200009 ], [ -83.561146613999938, 22.205023505000042 ], [ -83.552845831999946, 22.213446356000077 ], [ -83.555490688999896, 22.223618882000039 ], [ -83.562855597999942, 22.234849351000037 ], [ -83.56859290299991, 22.246649481000077 ], [ -83.575428839999915, 22.246649481000077 ], [ -83.589588995999918, 22.219916083000044 ], [ -83.614369269999941, 22.195746161000045 ], [ -83.643625454999949, 22.178290106000077 ], [ -83.671009894999941, 22.171535549000055 ], [ -83.668934699999909, 22.175034898000035 ], [ -83.666737433999913, 22.18195221600007 ], [ -83.664784308999913, 22.185777085000041 ], [ -83.775461391999897, 22.170721747000073 ], [ -83.780873175999943, 22.171535549000055 ], [ -83.784779425999943, 22.175441799000055 ], [ -83.787505662999934, 22.18235911700009 ], [ -83.788726365999935, 22.189032294000071 ], [ -83.787709113999938, 22.19204336100006 ], [ -83.79914303299995, 22.188788153000075 ], [ -83.811024542999917, 22.174750067000048 ], [ -83.825550910999937, 22.171535549000055 ], [ -83.903228318999936, 22.175685940000051 ], [ -83.925445115999935, 22.171535549000055 ], [ -83.966460740999935, 22.133978583000044 ], [ -83.967681443999936, 22.126369533000059 ], [ -83.975331183999913, 22.098822333000044 ], [ -83.980091925999943, 22.089016018000052 ], [ -83.97484290299991, 22.082464911000045 ], [ -83.97329667899993, 22.07648346600007 ], [ -83.972645636999914, 22.061672268000052 ], [ -83.983998175999943, 22.070542710000041 ], [ -83.994984503999945, 22.068264065000051 ], [ -84.001779751999948, 22.057562567000048 ], [ -84.000599738999938, 22.041205145000049 ], [ -83.993031378999945, 22.02798086100006 ], [ -83.983225063999896, 22.023098049000055 ], [ -83.971669074999909, 22.025783596000053 ], [ -83.958973761999914, 22.034979559000078 ], [ -83.964670376999948, 22.013332424000055 ], [ -83.999256964999915, 21.989488023000035 ], [ -84.007435675999943, 21.969183661000045 ], [ -84.003814256999931, 21.964422919000071 ], [ -83.997059699999909, 21.958685614000046 ], [ -83.993031378999945, 21.951361395000049 ], [ -83.997466600999928, 21.941839911000045 ], [ -84.006906704999949, 21.933294989000046 ], [ -84.017689581999946, 21.925482489000046 ], [ -84.029408331999946, 21.919867255000042 ], [ -84.041615363999938, 21.917669989000046 ], [ -84.060414191999939, 21.921942450000074 ], [ -84.098215298999946, 21.940741278000075 ], [ -84.120432094999899, 21.945013739000046 ], [ -84.142160610999952, 21.940334377000056 ], [ -84.180734829999949, 21.91828034100007 ], [ -84.199208136999914, 21.910834052000041 ], [ -84.209339972999942, 21.910101630000042 ], [ -84.230091925999943, 21.911525783000059 ], [ -84.240142381999931, 21.910834052000041 ], [ -84.251210089999915, 21.90656159100007 ], [ -84.273915167999917, 21.89321523600006 ], [ -84.305165167999917, 21.884507554000038 ], [ -84.423247850999928, 21.792303778000075 ], [ -84.466175910999937, 21.770453192000048 ], [ -84.508371548999946, 21.766831773000035 ], [ -84.521351691999939, 21.78656647300005 ], [ -84.481312628999945, 21.865179755000042 ], [ -84.473540818999936, 21.90460846600007 ], [ -84.496164516999897, 21.933783270000049 ], [ -84.536040818999936, 21.94017161700009 ], [ -84.580555792999917, 21.93390534100007 ], [ -84.659982876999948, 21.912054755000042 ], [ -84.698719855999911, 21.89484284100007 ], [ -84.799712693999936, 21.832098700000074 ], [ -84.839914516999897, 21.82290273600006 ], [ -84.883412238999938, 21.823553778000075 ], [ -84.925404425999943, 21.835760809000078 ], [ -84.939116990999935, 21.846096096000053 ], [ -84.947255011999914, 21.860337632000039 ], [ -84.949615037999934, 21.876776434000078 ], [ -84.946034308999913, 21.893540757000039 ], [ -84.942738410999937, 21.900051174000055 ], [ -84.937570766999897, 21.908107815000051 ], [ -84.931223110999952, 21.914740302000041 ], [ -84.924549933999913, 21.917222398000035 ], [ -84.919789191999939, 21.914740302000041 ], [ -84.916574673999946, 21.90961334800005 ], [ -84.913889126999948, 21.903713283000059 ], [ -84.91079667899993, 21.898993231000077 ], [ -84.903553839999915, 21.893622137000079 ], [ -84.895375128999945, 21.890570380000042 ], [ -84.886586066999939, 21.889553127000056 ], [ -84.87759355399993, 21.890326239000046 ], [ -84.860503709999932, 21.897040106000077 ], [ -84.848744269999941, 21.908392645000049 ], [ -84.848215298999946, 21.921087958000044 ], [ -84.864613410999937, 21.93195221600007 ], [ -84.847564256999931, 21.940619208000044 ], [ -84.832386847999942, 21.940578518000052 ], [ -84.82290605399993, 21.930894273000035 ], [ -84.822987433999913, 21.910834052000041 ], [ -84.741078253999945, 21.95180898600006 ], [ -84.668446417999917, 21.971869208000044 ], [ -84.583322719999899, 22.007513739000046 ], [ -84.528879360999952, 22.044338283000059 ], [ -84.521351691999939, 22.048041083000044 ], [ -84.50804602799991, 22.049017645000049 ], [ -84.495920376999948, 22.047349351000037 ], [ -84.489654100999928, 22.042792059000078 ], [ -84.494048631999931, 22.034979559000078 ], [ -84.462635870999918, 22.022040106000077 ], [ -84.439320441999939, 22.028143622000073 ], [ -84.41665605399993, 22.041001695000091 ], [ -84.387318488999938, 22.048041083000044 ], [ -84.372792120999918, 22.043931382000039 ], [ -84.355824347999942, 22.034084377000056 ], [ -84.341664191999939, 22.021673895000049 ], [ -84.335804816999939, 22.010443427000041 ], [ -84.330962693999936, 22.004584052000041 ], [ -84.303822394999941, 22.02289459800005 ], [ -84.288563605999911, 22.020697333000044 ], [ -84.274322068999936, 22.075995184000078 ], [ -84.286284959999932, 22.063381252000056 ], [ -84.296864386999914, 22.045965887000079 ], [ -84.308176235999952, 22.036688544000071 ], [ -84.322132941999939, 22.048041083000044 ], [ -84.328033006999931, 22.06712474200009 ], [ -84.326771613999938, 22.081854559000078 ], [ -84.330189581999946, 22.093329169000071 ], [ -84.350005662999934, 22.102606512000079 ], [ -84.340728318999936, 22.123968817000048 ], [ -84.335804816999939, 22.130560614000046 ], [ -84.354359503999945, 22.132513739000046 ], [ -84.374582485999952, 22.13930898600006 ], [ -84.39281165299991, 22.148504950000074 ], [ -84.405344204999949, 22.157904364000046 ], [ -84.413441535999937, 22.172023830000057 ], [ -84.420033331999946, 22.188666083000044 ], [ -84.429269985999952, 22.201727606000077 ], [ -84.445668097999942, 22.205023505000042 ], [ -84.435699022999927, 22.213690497000073 ], [ -84.42446855399993, 22.22915273600006 ], [ -84.415353969999899, 22.247381903000075 ], [ -84.411488410999937, 22.26398346600007 ], [ -84.409657355999911, 22.287258205000057 ], [ -84.405344204999949, 22.308742580000057 ], [ -84.391021287999934, 22.352769273000035 ], [ -84.388539191999939, 22.355169989000046 ], [ -84.373931443999936, 22.380682684000078 ], [ -84.368804490999935, 22.383286851000037 ], [ -84.358021613999938, 22.384263414000088 ], [ -84.353138800999943, 22.387193101000037 ], [ -84.349110480999911, 22.393622137000079 ], [ -84.345122850999928, 22.406236070000091 ], [ -84.342600063999896, 22.411078192000048 ], [ -84.321278449999909, 22.440130927000041 ], [ -84.306507941999939, 22.455633856000077 ], [ -84.288563605999911, 22.465765692000048 ], [ -84.288563605999911, 22.473211981000077 ], [ -84.309071417999917, 22.473211981000077 ], [ -84.291818813999896, 22.486273505000042 ], [ -84.249012824999909, 22.493557033000059 ], [ -84.230295376999948, 22.503607489000046 ], [ -84.218373175999943, 22.518744208000044 ], [ -84.205799933999913, 22.541164455000057 ], [ -84.201161261999914, 22.56281159100007 ], [ -84.212880011999914, 22.575588283000059 ], [ -84.212880011999914, 22.583075262000079 ], [ -84.202381964999915, 22.580064195000091 ], [ -84.192372199999909, 22.575588283000059 ], [ -84.178130662999934, 22.585679429000038 ], [ -84.164621548999946, 22.587632554000038 ], [ -84.15298417899993, 22.582017320000091 ], [ -84.144602016999897, 22.569403387000079 ], [ -84.135731574999909, 22.606838283000059 ], [ -84.130360480999911, 22.616522528000075 ], [ -84.120513475999928, 22.620266018000052 ], [ -84.094634568999936, 22.622381903000075 ], [ -84.089344855999911, 22.627101955000057 ], [ -84.088612433999913, 22.637152411000045 ], [ -84.085438605999911, 22.654201565000051 ], [ -84.078277147999927, 22.666205145000049 ], [ -84.065500454999949, 22.661281643000052 ], [ -84.052113410999937, 22.653306382000039 ], [ -84.041615363999938, 22.658433335000041 ], [ -84.031971808999913, 22.66937897300005 ], [ -84.021107550999943, 22.678656317000048 ], [ -84.028675910999937, 22.69009023600006 ], [ -84.038970506999931, 22.697088934000078 ], [ -84.052316860999952, 22.69985586100006 ], [ -84.068837042999917, 22.698472398000035 ], [ -84.064320441999939, 22.706244208000044 ], [ -84.057036912999934, 22.713283596000053 ], [ -84.048003709999932, 22.718247789000088 ], [ -84.038441535999937, 22.720200914000088 ], [ -84.022328253999945, 22.714748440000051 ], [ -84.013783331999946, 22.702541408000059 ], [ -84.007191535999937, 22.690375067000048 ], [ -83.997466600999928, 22.684881903000075 ], [ -83.984038865999935, 22.687079169000071 ], [ -83.972075975999928, 22.692531643000052 ], [ -83.911244269999941, 22.733303127000056 ], [ -83.897572394999941, 22.720200914000088 ], [ -83.888050910999937, 22.741441148000035 ], [ -83.872792120999918, 22.750799872000073 ], [ -83.829253709999932, 22.753729559000078 ], [ -83.812652147999927, 22.756740627000056 ], [ -83.743723110999952, 22.789129950000074 ], [ -83.709136522999927, 22.800685940000051 ], [ -83.692738410999937, 22.802150783000059 ], [ -83.681548631999931, 22.800360419000071 ], [ -83.668934699999909, 22.794907945000091 ], [ -83.658029751999948, 22.794663804000038 ], [ -83.651112433999913, 22.796820380000042 ], [ -83.637318488999938, 22.805121161000045 ], [ -83.630034959999932, 22.808335679000038 ], [ -83.630034959999932, 22.815822658000059 ], [ -83.637196417999917, 22.812689520000049 ], [ -83.644357876999948, 22.808335679000038 ], [ -83.645659959999932, 22.811997789000088 ], [ -83.645375128999945, 22.814276434000078 ], [ -83.646229620999918, 22.815375067000048 ], [ -83.651193813999896, 22.815822658000059 ], [ -83.629872199999909, 22.828314520000049 ], [ -83.607899542999917, 22.834377346000053 ], [ -83.558013475999928, 22.83624909100007 ], [ -83.553781704999949, 22.842230536000045 ], [ -83.54133053299995, 22.873846747000073 ], [ -83.534982876999948, 22.877020575000074 ], [ -83.493519660999937, 22.87726471600007 ], [ -83.496083136999914, 22.870347398000035 ], [ -83.497629360999952, 22.86749909100007 ], [ -83.500355597999942, 22.86359284100007 ], [ -83.480824347999942, 22.860256252000056 ], [ -83.469105597999942, 22.870591539000088 ], [ -83.461048956999946, 22.885972398000035 ], [ -83.452504035999937, 22.897772528000075 ], [ -83.437570766999897, 22.903469143000052 ], [ -83.42609615799995, 22.899237372000073 ], [ -83.414051886999914, 22.890814520000049 ], [ -83.397287563999896, 22.884100653000075 ], [ -83.404367641999897, 22.87376536700009 ], [ -83.393462693999936, 22.876898505000042 ], [ -83.377512173999946, 22.886135158000059 ], [ -83.36937415299991, 22.89398834800005 ], [ -83.363352016999897, 22.91046784100007 ], [ -83.348459438999896, 22.932114976000037 ], [ -83.329660610999952, 22.951076565000051 ], [ -83.311634894999941, 22.959173895000049 ], [ -83.298166469999899, 22.963324286000045 ], [ -83.246449347999942, 22.993963934000078 ], [ -83.226185675999943, 23.001857815000051 ], [ -83.207630988999938, 23.00267161700009 ], [ -83.191477016999897, 22.997381903000075 ], [ -83.178212042999917, 22.986517645000049 ], [ -83.178212042999917, 22.980292059000078 ], [ -83.187367316999939, 22.973822333000044 ], [ -83.191232876999948, 22.961859442000048 ], [ -83.189320441999939, 22.947821356000077 ], [ -83.181630011999914, 22.935288804000038 ], [ -83.169422980999911, 22.930121161000045 ], [ -83.159169074999909, 22.936224677000041 ], [ -83.150542772999927, 22.946275132000039 ], [ -83.143422003999945, 22.953029690000051 ], [ -83.161691860999952, 22.966945705000057 ], [ -83.160511847999942, 22.979966539000088 ], [ -83.145822719999899, 22.991400458000044 ], [ -83.123605923999946, 23.000148830000057 ], [ -83.081939256999931, 23.007635809000078 ], [ -83.074126756999931, 23.011297919000071 ], [ -83.061146613999938, 23.019598700000074 ], [ -83.055287238999938, 23.021226304000038 ], [ -83.044911261999914, 23.019517320000091 ], [ -83.031117316999939, 23.010687567000048 ], [ -83.020578579999949, 23.007635809000078 ], [ -83.015370245999918, 23.010321356000077 ], [ -83.009388800999943, 23.016017971000053 ], [ -83.002023891999897, 23.019232489000046 ], [ -82.992583787999934, 23.01439036700009 ], [ -82.986317511999914, 23.004095770000049 ], [ -82.99282792899993, 23.000962632000039 ], [ -83.002837693999936, 22.99945709800005 ], [ -83.006906704999949, 22.993963934000078 ], [ -83.002797003999945, 22.983587958000044 ], [ -82.996693488999938, 22.980169989000046 ], [ -82.988880988999938, 22.983628648000035 ], [ -82.979603644999941, 22.993963934000078 ], [ -82.981678839999915, 22.974188544000071 ], [ -82.964222785999937, 22.972886460000041 ], [ -82.944424028446122, 22.985082820215951 ], [ -82.945396694701685, 22.979579576336334 ], [ -82.940823330032629, 22.943431912153017 ], [ -82.940849169353669, 22.93885854748396 ], [ -82.944389004349034, 22.91898895947287 ], [ -82.919170905313024, 22.873772081216543 ], [ -82.914675055909072, 22.849509995689743 ], [ -82.915941127780798, 22.840569972825961 ], [ -82.934544643920162, 22.820235296821465 ], [ -82.939712286892529, 22.816152859466854 ], [ -82.947567105037876, 22.81341400834981 ], [ -82.971906704031142, 22.810830185964278 ], [ -82.976635098331087, 22.809047350155083 ], [ -82.978030362311358, 22.807109482916303 ], [ -82.976428391856757, 22.805300807786011 ], [ -82.974257982419942, 22.803698839130107 ], [ -82.963095873275904, 22.79912547536037 ], [ -82.959090949387814, 22.795637315409749 ], [ -82.954078335147017, 22.789306952453899 ], [ -82.937567714978059, 22.762977810277732 ], [ -82.92544959232481, 22.747914130033053 ], [ -82.921883918008405, 22.745433661334403 ], [ -82.912737188670292, 22.740705267933777 ], [ -82.907078620182176, 22.736752020889014 ], [ -82.900644904438764, 22.728561305959488 ], [ -82.893151822398693, 22.71626231525363 ], [ -82.873437263119172, 22.673603420061795 ], [ -82.868863897550796, 22.665748602815768 ], [ -82.835765143746357, 22.631228745710018 ], [ -82.828013679287835, 22.620376694928495 ], [ -82.82501644575234, 22.61451141996605 ], [ -82.824601541721293, 22.610579205774144 ] ] ], [ [ [ -83.552845831999946, 21.961371161000045 ], [ -83.550363735999952, 21.961493231000077 ], [ -83.545318162999934, 21.96124909100007 ], [ -83.550648566999939, 21.959418036000045 ], [ -83.570139126999948, 21.958807684000078 ], [ -83.592600063999896, 21.960109768000052 ], [ -83.607818162999934, 21.966498114000046 ], [ -83.597808397999927, 21.971747137000079 ], [ -83.568104620999918, 21.966213283000059 ], [ -83.552845831999946, 21.961371161000045 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-06", "NAME_1": "Cienfuegos" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -80.101026702777816, 21.824765419775595 ], [ -80.104888475999928, 21.825384833000044 ], [ -80.145904100999928, 21.839911200000074 ], [ -80.188221808999913, 21.848456122000073 ], [ -80.217681443999936, 21.871486721000053 ], [ -80.269927537999934, 21.88703034100007 ], [ -80.300770636999914, 21.911688544000071 ], [ -80.409901495999918, 22.020697333000044 ], [ -80.411854620999918, 22.025091864000046 ], [ -80.411854620999918, 22.030259507000039 ], [ -80.412587042999917, 22.035834052000041 ], [ -80.416737433999913, 22.041205145000049 ], [ -80.421131964999915, 22.041896877000056 ], [ -80.433216925999943, 22.040187893000052 ], [ -80.437245245999918, 22.041205145000049 ], [ -80.448109503999945, 22.050279039000088 ], [ -80.451079881999931, 22.056626695000091 ], [ -80.450917120999918, 22.068508205000057 ], [ -80.436756964999915, 22.065904039000088 ], [ -80.419341600999928, 22.066636460000041 ], [ -80.402170376999948, 22.071682033000059 ], [ -80.388783331999946, 22.082180080000057 ], [ -80.404164191999939, 22.078517971000053 ], [ -80.409901495999918, 22.075995184000078 ], [ -80.405832485999952, 22.08470286700009 ], [ -80.400298631999931, 22.093166408000059 ], [ -80.396148240999935, 22.101385809000078 ], [ -80.396311001999948, 22.109523830000057 ], [ -80.404286261999914, 22.112616278000075 ], [ -80.41633053299995, 22.109605210000041 ], [ -80.425363735999952, 22.110052802000041 ], [ -80.424183722999942, 22.123114325000074 ], [ -80.443918423999946, 22.123195705000057 ], [ -80.456532355999911, 22.130438544000071 ], [ -80.457753058999913, 22.142767645000049 ], [ -80.443430141999897, 22.157904364000046 ], [ -80.467274542999917, 22.171616929000038 ], [ -80.476714647999927, 22.180161851000037 ], [ -80.484445766999897, 22.19204336100006 ], [ -80.491281704999949, 22.181830145000049 ], [ -80.503570115999935, 22.178208726000037 ], [ -80.518422003999945, 22.179917710000041 ], [ -80.532826300999943, 22.185777085000041 ], [ -80.538238084999932, 22.164455471000053 ], [ -80.528797980999911, 22.150864976000037 ], [ -80.498646613999938, 22.130560614000046 ], [ -80.483998175999943, 22.111883856000077 ], [ -80.470855272999927, 22.089097398000035 ], [ -80.464670376999948, 22.06476471600007 ], [ -80.470773891999897, 22.041205145000049 ], [ -80.513742641999897, 22.056341864000046 ], [ -80.593365862034759, 22.05423004999443 ], [ -80.593421394281904, 22.054313056002741 ], [ -80.600785285112806, 22.065320136415153 ], [ -80.602955695448998, 22.07144379289673 ], [ -80.604790209000953, 22.082786770093321 ], [ -80.605203620150917, 22.100201727827482 ], [ -80.606211311402888, 22.105472724486617 ], [ -80.608200852787093, 22.110020249834633 ], [ -80.611068895113419, 22.113973496879339 ], [ -80.61817440532451, 22.121285711766177 ], [ -80.624711472956108, 22.123507798945752 ], [ -80.635589362159294, 22.124386298089178 ], [ -80.656440803000635, 22.121905829390471 ], [ -80.670729335990075, 22.118340155973385 ], [ -80.6800310940597, 22.117926743924102 ], [ -80.684759488359703, 22.119632066266831 ], [ -80.691219041625459, 22.125600694016782 ], [ -80.696283331810321, 22.127693589987189 ], [ -80.705559252357602, 22.127512721934579 ], [ -80.712923143188505, 22.126453354738487 ], [ -80.728839484154832, 22.125884914856897 ], [ -80.732844408042979, 22.124644680507572 ], [ -80.735660772626545, 22.122448431749717 ], [ -80.73827043343374, 22.119399522270101 ], [ -80.741190151704131, 22.116944891993171 ], [ -80.744781664442257, 22.116944891993171 ], [ -80.752042201586335, 22.11958039032271 ], [ -80.765891485903353, 22.127461045990458 ], [ -80.800773078214945, 22.140741889526566 ], [ -80.832269864262798, 22.157536728737 ], [ -80.843044399779217, 22.172936305765859 ], [ -80.855343391384395, 22.183840033390823 ], [ -80.897433844896, 22.211486925181418 ], [ -80.893248053854563, 22.230142117264904 ], [ -80.894255744207214, 22.238410346560215 ], [ -80.89572852165395, 22.242131048708927 ], [ -80.896219448968395, 22.246704413377984 ], [ -80.89725297684339, 22.248978176501623 ], [ -80.89937171123546, 22.250089220541099 ], [ -80.903324958280166, 22.250218410850948 ], [ -80.919473843243281, 22.248409735720713 ], [ -80.923607958340597, 22.249469102017429 ], [ -80.926372646980042, 22.251510322043714 ], [ -80.928310513319502, 22.254791775520005 ], [ -80.929860806031343, 22.260011095335756 ], [ -80.930946010749778, 22.269106146931108 ], [ -80.929938321296504, 22.276547553027115 ], [ -80.927897102169538, 22.285280870315887 ], [ -80.922574428666962, 22.299155992155306 ], [ -80.921256679951796, 22.307036647822997 ], [ -80.921230842429395, 22.312204290795364 ], [ -80.924331427853076, 22.318793036169666 ], [ -80.925597499724802, 22.322823798479476 ], [ -80.924279751009692, 22.328094794239348 ], [ -80.921230842429395, 22.334037584466955 ], [ -80.913427701127489, 22.344889635248478 ], [ -80.91210995061374, 22.350057278220788 ], [ -80.913427701127489, 22.354088040530655 ], [ -80.916993373645255, 22.35607758191486 ], [ -80.919938931236686, 22.357111110689175 ], [ -80.922781135141236, 22.357188625954279 ], [ -80.925985074251741, 22.356155097179965 ], [ -80.930687629230704, 22.35413971647472 ], [ -80.935545213840555, 22.35261526128528 ], [ -80.939472621564221, 22.352279365400364 ], [ -80.941901415218126, 22.352899482125395 ], [ -80.942986619936562, 22.35491486283064 ], [ -80.940738695234586, 22.360134181747071 ], [ -80.925132411731397, 22.383621120917951 ], [ -80.921721767945201, 22.390519923755448 ], [ -80.91536556656763, 22.406849676771174 ], [ -80.91482296420844, 22.411087143756674 ], [ -80.916373256920281, 22.41333506935797 ], [ -80.920326503964986, 22.41506623012242 ], [ -80.925442470993232, 22.415893053321724 ], [ -80.928388027685287, 22.41736583076846 ], [ -80.928672247626139, 22.419226182742136 ], [ -80.921179164686691, 22.427571926403289 ], [ -80.909112717977564, 22.435633450123589 ], [ -80.903790046273627, 22.440129299527541 ], [ -80.900766975215731, 22.443359076160391 ], [ -80.888984748447342, 22.45379771579195 ], [ -80.882886928588846, 22.457363390108355 ], [ -80.861699591862646, 22.466587632912933 ], [ -80.849684821097583, 22.473512275071414 ], [ -80.845834926840382, 22.47650950770759 ], [ -80.83710160955161, 22.482038885885856 ], [ -80.829272630727303, 22.483356635500286 ], [ -80.81821387437077, 22.482969061872666 ], [ -80.767829353142133, 22.470592555901703 ], [ -80.760336270202686, 22.470204983173403 ], [ -80.736875170352789, 22.472013658303695 ], [ -80.644555223444797, 22.462841091443181 ], [ -80.634891730169215, 22.459766344441221 ], [ -80.630085822402748, 22.459197902760991 ], [ -80.623703782603457, 22.45953380044449 ], [ -80.601560432368046, 22.469223131242472 ], [ -80.594764981418734, 22.471393541578664 ], [ -80.588486294406948, 22.472633775028669 ], [ -80.580192226689917, 22.473563951015535 ], [ -80.576083950913585, 22.474390774214839 ], [ -80.571639776554434, 22.47865408052138 ], [ -80.565257737654463, 22.486870632073988 ], [ -80.543321092094686, 22.525162869071153 ], [ -80.539807094621722, 22.529271144847428 ], [ -80.519679125091557, 22.542009386024347 ], [ -80.478157110562165, 22.564514472364976 ], [ -80.465909796699748, 22.57751109506097 ], [ -80.463196784004367, 22.581412665262292 ], [ -80.459424405012271, 22.584642441895141 ], [ -80.454618496346541, 22.587097073071448 ], [ -80.446221075841947, 22.586425279503032 ], [ -80.441079271291301, 22.584797472425407 ], [ -80.4171789209704, 22.566452337805117 ], [ -80.39234839466269, 22.570870672843284 ], [ -80.383976812579817, 22.569320380131444 ], [ -80.379274257600912, 22.563971869106467 ], [ -80.379816860859421, 22.549450792120354 ], [ -80.381754727198881, 22.540071518785567 ], [ -80.386689826174518, 22.526713161782993 ], [ -80.387464973429758, 22.522372341110611 ], [ -80.386767341439622, 22.519633489993566 ], [ -80.385217047828462, 22.517411403713311 ], [ -80.380824551212072, 22.51604197815476 ], [ -80.37537268739959, 22.516248683729771 ], [ -80.364055548624663, 22.519814358046176 ], [ -80.357595995358906, 22.522734076316567 ], [ -80.346459723737269, 22.529581204109263 ], [ -80.341834683124091, 22.531260688030329 ], [ -80.33640865773333, 22.531699936702694 ], [ -80.328657193274807, 22.531389879239498 ], [ -80.323153652618942, 22.531648260758629 ], [ -80.319975551930156, 22.533327745578958 ], [ -80.318011848068295, 22.536040758274339 ], [ -80.310492926707184, 22.558313299718975 ], [ -80.306798062080873, 22.564927883514997 ], [ -80.303516607705262, 22.568571072197187 ], [ -80.299950935187496, 22.569862983389953 ], [ -80.294137336169115, 22.570043850543243 ], [ -80.280158860642871, 22.568803616193918 ], [ -80.273725144899515, 22.568881130559703 ], [ -80.267756517149508, 22.569862983389953 ], [ -80.264785122035732, 22.571697496042589 ], [ -80.260134243000891, 22.576606757495824 ], [ -80.257550422414056, 22.578544622935965 ], [ -80.255405849600265, 22.57559906714323 ], [ -80.25398474809765, 22.569036160190649 ], [ -80.254010585619994, 22.551362820038094 ], [ -80.25548336486537, 22.542862046746052 ], [ -80.257937995142356, 22.53797862371448 ], [ -80.260806036569306, 22.536609198155929 ], [ -80.264785122035732, 22.535575670280934 ], [ -80.268014898668639, 22.53418040630072 ], [ -80.271089646569919, 22.531648260758629 ], [ -80.271399705831755, 22.526480617786262 ], [ -80.270236985848214, 22.517798977340931 ], [ -80.259100715125896, 22.493588569556834 ], [ -80.255560879231155, 22.488472602528589 ], [ -80.236518114419425, 22.478473212468771 ], [ -80.23352088088393, 22.468292955255663 ], [ -80.23737077514113, 22.45955963796689 ], [ -80.238998583118075, 22.452402451811679 ], [ -80.238481818281286, 22.446692206480122 ], [ -80.234399380027355, 22.43950918190319 ], [ -80.227242193872144, 22.436021022851889 ], [ -80.223521490824112, 22.432145291072288 ], [ -80.220808479028051, 22.427804470399963 ], [ -80.223986578817517, 22.4146786564948 ], [ -80.243003506106902, 22.39537750926462 ], [ -80.242486742169376, 22.384654648793003 ], [ -80.239050259062196, 22.378169257105526 ], [ -80.23295244010302, 22.370314438960179 ], [ -80.196598070344635, 22.33737071388731 ], [ -80.184273241217113, 22.331350409293918 ], [ -80.177090216640181, 22.330110174944593 ], [ -80.169984707328354, 22.330626938882119 ], [ -80.154972703927115, 22.334916082711004 ], [ -80.14990841284299, 22.335381170704466 ], [ -80.145696784279153, 22.334554348404424 ], [ -80.143293829946288, 22.332642320486684 ], [ -80.141588507603501, 22.329102485491319 ], [ -80.138410406914716, 22.306726589460538 ], [ -80.135697395118655, 22.29768321380925 ], [ -80.130219692884509, 22.286211046302753 ], [ -80.121434698752353, 22.271431585998869 ], [ -80.109187384889879, 22.25641958349695 ], [ -80.084072638641373, 22.245619207760228 ], [ -80.09497636626628, 22.213424791520879 ], [ -80.098567878105086, 22.207611192502497 ], [ -80.102417772362287, 22.199265447942025 ], [ -80.103580492345827, 22.190196234768393 ], [ -80.099808111555092, 22.151593940308089 ], [ -80.100479906022827, 22.131879381028568 ], [ -80.099859789297795, 22.123404446158247 ], [ -80.089369472822909, 22.083768622024252 ], [ -80.084124314585438, 22.070255235390789 ], [ -80.077380541378886, 22.057878730319146 ], [ -80.058777025239522, 22.043435166799497 ], [ -80.053376838270481, 22.03653636306268 ], [ -80.05084469272839, 22.028319809711434 ], [ -80.049268561594829, 22.001809801281297 ], [ -80.04988867921918, 21.986797796980738 ], [ -80.048415899973804, 21.977211818970261 ], [ -80.045005256187608, 21.968607692890714 ], [ -80.024748093649578, 21.954215807113769 ], [ -80.023275316202842, 21.95212291114342 ], [ -80.024050462558762, 21.938506170823132 ], [ -80.060043098010567, 21.903702093776587 ], [ -80.087276576852503, 21.883419093716213 ], [ -80.094097867122855, 21.87639110056881 ], [ -80.097715217383382, 21.871481838216255 ], [ -80.09880042210176, 21.866391710508992 ], [ -80.101022508382016, 21.824843858457257 ], [ -80.101026702777816, 21.824765419775595 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-12", "NAME_1": "Granma" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.03464353527859, 19.887765132826136 ], [ -77.088042772999927, 19.885443427000041 ], [ -77.113433397999927, 19.88930898600006 ], [ -77.163400844999899, 19.908107815000051 ], [ -77.188954230999911, 19.912583726000037 ], [ -77.202788865999935, 19.902899481000077 ], [ -77.20962480399993, 19.902899481000077 ], [ -77.21711178299995, 19.90961334800005 ], [ -77.227284308999913, 19.911078192000048 ], [ -77.237172003999945, 19.90688711100006 ], [ -77.243763800999943, 19.896714585000041 ], [ -77.269154425999943, 19.904527085000041 ], [ -77.298247850999928, 19.906683661000045 ], [ -77.324086066999939, 19.900295315000051 ], [ -77.339995897999927, 19.882473049000055 ], [ -77.31273352799991, 19.882473049000055 ], [ -77.31273352799991, 19.87563711100006 ], [ -77.330474412999934, 19.874823309000078 ], [ -77.358509894999941, 19.864488023000035 ], [ -77.37726803299995, 19.86196523600006 ], [ -77.469960089999915, 19.859564520000049 ], [ -77.533355272999927, 19.844916083000044 ], [ -77.569325324999909, 19.841498114000046 ], [ -77.611480272999927, 19.844631252000056 ], [ -77.673247850999928, 19.828924872000073 ], [ -77.692534959999932, 19.827826239000046 ], [ -77.706044074999909, 19.830023505000042 ], [ -77.719553188999953, 19.835882880000042 ], [ -77.730580206999946, 19.844794012000079 ], [ -77.737212693999936, 19.855698960000041 ], [ -77.735991990999935, 19.874172268000052 ], [ -77.717355923999946, 19.907212632000039 ], [ -77.716175910999937, 19.916571356000077 ], [ -77.708811001999948, 19.91868724200009 ], [ -77.696115688999953, 19.919989325000074 ], [ -77.688832160999937, 19.923407294000071 ], [ -77.682118292999917, 19.929592190000051 ], [ -77.675282355999911, 19.939886786000045 ], [ -77.668324347999942, 19.943915106000077 ], [ -77.671376105999911, 19.954779364000046 ], [ -77.666737433999913, 19.962469794000071 ], [ -77.647857225999928, 19.978664455000057 ], [ -77.625559048999946, 20.007798570000091 ], [ -77.623931443999936, 20.012762762000079 ], [ -77.620432094999899, 20.020331122000073 ], [ -77.572743292999917, 20.061102606000077 ], [ -77.574696417999917, 20.069810289000088 ], [ -77.58812415299991, 20.082464911000045 ], [ -77.586415167999917, 20.08852773600006 ], [ -77.577381964999915, 20.087958075000074 ], [ -77.55101477799991, 20.079779364000046 ], [ -77.541086391999897, 20.088771877000056 ], [ -77.521880662999934, 20.094549872000073 ], [ -77.517486131999931, 20.098456122000073 ], [ -77.514719204999949, 20.104437567000048 ], [ -77.496978318999936, 20.129461981000077 ], [ -77.479562954999949, 20.140855210000041 ], [ -77.436634894999941, 20.16242096600007 ], [ -77.42023678299995, 20.185044664000088 ], [ -77.401356574999909, 20.198065497000073 ], [ -77.300648566999939, 20.242743231000077 ], [ -77.281361456999946, 20.24555084800005 ], [ -77.266468878999945, 20.253241278000075 ], [ -77.250721808999913, 20.289292710000041 ], [ -77.236317511999914, 20.300767320000091 ], [ -77.233387824999909, 20.301214911000045 ], [ -77.229847785999937, 20.301336981000077 ], [ -77.22329667899993, 20.300767320000091 ], [ -77.228993292999917, 20.289129950000074 ], [ -77.22297115799995, 20.283392645000049 ], [ -77.210072394999941, 20.282863674000055 ], [ -77.195423956999946, 20.286525783000059 ], [ -77.181752081999946, 20.294867255000042 ], [ -77.171213344999899, 20.30727773600006 ], [ -77.16429602799991, 20.322170315000051 ], [ -77.161854620999918, 20.338324286000045 ], [ -77.15453040299991, 20.34406159100007 ], [ -77.113433397999927, 20.368475653000075 ], [ -77.110259568999936, 20.416408596000053 ], [ -77.103505011999914, 20.423651434000078 ], [ -77.095814581999946, 20.430161851000037 ], [ -77.082427537999934, 20.465277411000045 ], [ -77.113433397999927, 20.51243724200009 ], [ -77.123199022999927, 20.52094147300005 ], [ -77.150135870999918, 20.537909247000073 ], [ -77.185943162999934, 20.550930080000057 ], [ -77.195668097999942, 20.552150783000059 ], [ -77.189198370999918, 20.540961005000042 ], [ -77.195423956999946, 20.534125067000048 ], [ -77.214019334999932, 20.546210028000075 ], [ -77.229481574999909, 20.552923895000049 ], [ -77.239898240999935, 20.563055731000077 ], [ -77.243763800999943, 20.585353908000059 ], [ -77.240386522999927, 20.59210846600007 ], [ -77.232492641999897, 20.59601471600007 ], [ -77.223378058999913, 20.598822333000044 ], [ -77.216460740999935, 20.602443752000056 ], [ -77.195423956999946, 20.629787502000056 ], [ -77.195423956999946, 20.636542059000078 ], [ -77.231678839999915, 20.658270575000074 ], [ -77.251047329999949, 20.662095445000091 ], [ -77.25804602799991, 20.643377997000073 ], [ -77.278187628999945, 20.662054755000042 ], [ -77.29515540299991, 20.687079169000071 ], [ -77.314849412999934, 20.709051825000074 ], [ -77.33668027431905, 20.71633924892582 ], [ -77.336540087055369, 20.716436061974662 ], [ -77.332405971958053, 20.719226589035827 ], [ -77.316851366197568, 20.726022039985139 ], [ -77.312717251100253, 20.728399155896284 ], [ -77.310779384760792, 20.730595405553515 ], [ -77.309616664777252, 20.73297252056534 ], [ -77.307265388187091, 20.739302883521248 ], [ -77.303673876348284, 20.744961452908683 ], [ -77.293726162232588, 20.755735989324421 ], [ -77.291349047220763, 20.760619412355993 ], [ -77.289359504037861, 20.766407172053334 ], [ -77.288119269688536, 20.777078354782248 ], [ -77.285328741728051, 20.781625881029584 ], [ -77.281685553945124, 20.782736925069003 ], [ -77.276259527655043, 20.777026678838126 ], [ -77.272202927822832, 20.767466539249369 ], [ -77.268198004834062, 20.767544054514474 ], [ -77.261815965034771, 20.77056712557237 ], [ -77.246209683330221, 20.781031601826953 ], [ -77.238639086024989, 20.784209703415058 ], [ -77.232205370281577, 20.784209703415058 ], [ -77.228355476024376, 20.778163560400003 ], [ -77.225875007325726, 20.772220771071716 ], [ -77.202491420942295, 20.76614879053426 ], [ -77.104357875915241, 20.763435776939559 ], [ -77.068029343679257, 20.750620022296175 ], [ -77.053456589849702, 20.740879015554128 ], [ -77.046867845374777, 20.738760281162001 ], [ -77.03805701372022, 20.738992825158732 ], [ -77.02162390791699, 20.743953762556089 ], [ -77.008084682861806, 20.744496364915278 ], [ -76.993227709091514, 20.746460068777139 ], [ -76.970955165848238, 20.753565578988287 ], [ -76.929252285064877, 20.746537584042244 ], [ -76.92121659976624, 20.747596951238279 ], [ -76.9012178214453, 20.74785533275741 ], [ -76.858688116563314, 20.743101100935064 ], [ -76.836105515856843, 20.743333644931738 ], [ -76.821300218030615, 20.739767971514652 ], [ -76.812024299281973, 20.732610785359441 ], [ -76.793446620665009, 20.695274562770862 ], [ -76.782878790723601, 20.690985418941921 ], [ -76.766290656188801, 20.704292100899693 ], [ -76.762182380412526, 20.706953436751689 ], [ -76.721900601131836, 20.722301336937107 ], [ -76.717043015622664, 20.714498196534521 ], [ -76.712831387058827, 20.70964061102535 ], [ -76.707250332037177, 20.706152451974049 ], [ -76.699783088418769, 20.704524643997104 ], [ -76.689938727989897, 20.70793528958194 ], [ -76.6803527490801, 20.713180446920092 ], [ -76.677174649290635, 20.713180446920092 ], [ -76.673608974974229, 20.710674139799721 ], [ -76.664462245636116, 20.696127224391887 ], [ -76.657976853948639, 20.690985418941921 ], [ -76.649915331127602, 20.68772980388735 ], [ -76.635394253242168, 20.684835924038623 ], [ -76.627901171202097, 20.682432969705758 ], [ -76.618237677926459, 20.681787014559063 ], [ -76.608160772601536, 20.683828232786709 ], [ -76.581237352122116, 20.697083237901097 ], [ -76.570307786974752, 20.696463121176066 ], [ -76.564520026378091, 20.680055853794613 ], [ -76.563408983237991, 20.67264028612027 ], [ -76.562814704035361, 20.660935573717722 ], [ -76.564442512012306, 20.646181951835615 ], [ -76.564416672691266, 20.641892808905993 ], [ -76.559843308921529, 20.638223781802083 ], [ -76.550670742061072, 20.633857122708037 ], [ -76.503826056727121, 20.623289292766628 ], [ -76.485894335055491, 20.615770372304837 ], [ -76.439566412759746, 20.589906318122075 ], [ -76.404762335713201, 20.579932766483978 ], [ -76.396132372111254, 20.576392931488556 ], [ -76.393057624209973, 20.576547960220182 ], [ -76.390137905939582, 20.578072415409622 ], [ -76.387347377979097, 20.580397854477383 ], [ -76.385306158852131, 20.581741440714893 ], [ -76.380758632604795, 20.582723294444463 ], [ -76.377890591177845, 20.582413235182628 ], [ -76.374479947391649, 20.581250515199088 ], [ -76.370785081866018, 20.578692532134653 ], [ -76.367813686752243, 20.571948757129405 ], [ -76.366935186709497, 20.5668586294222 ], [ -76.372567918574589, 20.545800483005848 ], [ -76.360372280656236, 20.544560247757204 ], [ -76.338048062368159, 20.536369533726997 ], [ -76.312881639276213, 20.53213206584212 ], [ -76.300530971726971, 20.528566392425034 ], [ -76.28006710541257, 20.519574692717867 ], [ -76.253092007190389, 20.513631904288957 ], [ -76.244410366745001, 20.509471950769921 ], [ -76.233971727113499, 20.502779853507434 ], [ -76.204335293039321, 20.474331976939141 ], [ -76.17965979726182, 20.437590033553192 ], [ -76.205601365810367, 20.404439602005993 ], [ -76.21952816359385, 20.393871772064585 ], [ -76.227305467373412, 20.393251655339611 ], [ -76.230896979212218, 20.397514959847513 ], [ -76.235832079087174, 20.41071828901778 ], [ -76.240844693327915, 20.420226751763153 ], [ -76.24187822120291, 20.42560110120985 ], [ -76.24187822120291, 20.43175059701241 ], [ -76.241025559581885, 20.437745063184082 ], [ -76.24094804611542, 20.443842882143258 ], [ -76.243195969918077, 20.450018215468276 ], [ -76.248337775368043, 20.455237535284027 ], [ -76.258414679793646, 20.461076971824752 ], [ -76.266011114621222, 20.460560207887283 ], [ -76.270274420927763, 20.459087429541228 ], [ -76.271282111280414, 20.454617418558996 ], [ -76.267483893866597, 20.436091416785416 ], [ -76.267328864235708, 20.427048041134185 ], [ -76.268879156947548, 20.418314723845413 ], [ -76.272289801633008, 20.411570949739541 ], [ -76.277018195033634, 20.405602321989534 ], [ -76.283012661205362, 20.399788722971152 ], [ -76.286500821155983, 20.395267035145537 ], [ -76.288231981021113, 20.39128795057843 ], [ -76.289136318586202, 20.381857001299579 ], [ -76.289988980207283, 20.377283637529843 ], [ -76.293347948049359, 20.370539863423915 ], [ -76.298722296596679, 20.368576157763471 ], [ -76.308127408353187, 20.368576157763471 ], [ -76.329779833072848, 20.372503567285776 ], [ -76.339572516658279, 20.373278712742376 ], [ -76.355514696046384, 20.372865302491675 ], [ -76.363188646139122, 20.36661245390161 ], [ -76.369467333150908, 20.356638902263512 ], [ -76.390447964302098, 20.276256211754742 ], [ -76.390292934671209, 20.271553655876517 ], [ -76.390577154612004, 20.26853058481862 ], [ -76.389104377165268, 20.258686225289068 ], [ -76.404400601406621, 20.243932603406904 ], [ -76.413159756217738, 20.234760037445767 ], [ -76.419645147905214, 20.231065171920136 ], [ -76.420420295160454, 20.225975043313554 ], [ -76.41747473756908, 20.219076239576793 ], [ -76.411842006603308, 20.189517319868401 ], [ -76.408276333186222, 20.105284736001749 ], [ -76.418611620030219, 20.086681219862385 ], [ -76.447369554061652, 20.061101386519738 ], [ -76.462433234306332, 20.051179510825762 ], [ -76.476747605717435, 20.044048163092214 ], [ -76.488736538060778, 20.039474799322534 ], [ -76.498374192914639, 20.037304388986342 ], [ -76.505376350338281, 20.036658433839648 ], [ -76.528785773344737, 20.038105373763983 ], [ -76.557104457804485, 20.042601223167878 ], [ -76.56371904160045, 20.038777167332398 ], [ -76.563564011969561, 20.036012477793577 ], [ -76.56219458731033, 20.030379746827862 ], [ -76.554313930743319, 20.010225937976656 ], [ -76.555554165092644, 20.00549754547535 ], [ -76.562478807251125, 20.003766383811524 ], [ -76.590358242139132, 20.010096746767431 ], [ -76.598626472333819, 20.013042304358862 ], [ -76.604543423240386, 20.014489244283197 ], [ -76.606532966423231, 20.012861436306252 ], [ -76.609995287052868, 20.004076443073359 ], [ -76.613483446104169, 20.002190253577339 ], [ -76.637022061219113, 20.001906032737224 ], [ -76.654721238894069, 19.999322211251013 ], [ -76.663454556182785, 19.999193020041844 ], [ -76.668880580674227, 19.999787299244474 ], [ -76.670844286334727, 20.000820828018789 ], [ -76.674513311639998, 20.002190253577339 ], [ -76.690998094286613, 20.00585927978193 ], [ -76.698904589275344, 20.008856513317426 ], [ -76.70518327538781, 20.013042304358862 ], [ -76.713942430198983, 20.02262828236934 ], [ -76.72004024915816, 20.027330837348245 ], [ -76.725879685698942, 20.027201646139019 ], [ -76.744948289831711, 20.022602443947619 ], [ -76.750296799957312, 20.020612900764718 ], [ -76.753914151117158, 20.018287461696957 ], [ -76.755774502191514, 20.015031847541707 ], [ -76.759417690873704, 20.01141449638186 ], [ -76.762750821193436, 20.011336982016076 ], [ -76.766445685819747, 20.013584905818732 ], [ -76.769003668884181, 20.016427109723338 ], [ -76.771613328792057, 20.018287461696957 ], [ -76.774352179909158, 20.019450182579874 ], [ -76.777814501438058, 20.020225328036418 ], [ -76.781173469280191, 20.021233018389069 ], [ -76.78458411306633, 20.023248399094314 ], [ -76.788640712898541, 20.026814073410719 ], [ -76.790836961656453, 20.029268703687706 ], [ -76.800707159607725, 20.037950344133037 ], [ -76.81698523578001, 20.02857107169757 ], [ -76.833521695270008, 20.012422186734511 ], [ -76.843236863590391, 20.0083397493799 ], [ -76.858688116563314, 20.005600898262855 ], [ -76.88057308617897, 20.00529083900102 ], [ -76.894577399227558, 20.00642772146216 ], [ -76.918503587970179, 20.005006619060225 ], [ -76.92584164127868, 20.003352973560879 ], [ -76.930699225888532, 20.001105047959584 ], [ -76.968603889258077, 19.952968451432866 ], [ -76.973823208174508, 19.949583645169071 ], [ -76.980902879963935, 19.947516588519704 ], [ -77.039116380916255, 19.941470445504649 ], [ -77.047772182939866, 19.938912462440157 ], [ -77.047849698204971, 19.935889391382318 ], [ -77.047229579681357, 19.932788805059317 ], [ -77.044154832679396, 19.928060410759315 ], [ -77.035111457028108, 19.910593777081147 ], [ -77.03464353527859, 19.887765132826136 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "CU-13", "NAME_1": "Santiago de Cuba" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -75.382080421154143, 19.882543917011262 ], [ -75.383290167999917, 19.882473049000055 ], [ -75.394276495999918, 19.883490302000041 ], [ -75.427601691999939, 19.890692450000074 ], [ -75.437489386999914, 19.895656643000052 ], [ -75.444406704999949, 19.896714585000041 ], [ -75.447336391999897, 19.894761460000041 ], [ -75.455637173999946, 19.88548411700009 ], [ -75.461822068999936, 19.882473049000055 ], [ -75.488880988999938, 19.879095770000049 ], [ -75.520904100999928, 19.87962474200009 ], [ -75.550852016999897, 19.885158596000053 ], [ -75.571644660999937, 19.896714585000041 ], [ -75.604725714999915, 19.89203522300005 ], [ -75.645619269999941, 19.912583726000037 ], [ -75.687001105999911, 19.940375067000048 ], [ -75.721831834999932, 19.957505601000037 ], [ -75.743723110999952, 19.959865627000056 ], [ -75.815297003999945, 19.957505601000037 ], [ -75.834339972999942, 19.959784247000073 ], [ -75.87336178299995, 19.969549872000073 ], [ -75.893788214999915, 19.971828518000052 ], [ -75.932118292999917, 19.967678127000056 ], [ -75.952219204999949, 19.962225653000075 ], [ -75.96548417899993, 19.954413153000075 ], [ -75.980091925999943, 19.952378648000035 ], [ -76.112049933999913, 19.982489325000074 ], [ -76.202259894999941, 19.992336330000057 ], [ -76.248158331999946, 19.990627346000053 ], [ -76.327992316999939, 19.97016022300005 ], [ -76.366118943999936, 19.964992580000057 ], [ -76.438710089999915, 19.964992580000057 ], [ -76.460275844999899, 19.962103583000044 ], [ -76.50226803299995, 19.948391018000052 ], [ -76.524403449999909, 19.943915106000077 ], [ -76.651600714999915, 19.951117255000042 ], [ -76.781076626999948, 19.940741278000075 ], [ -76.801747199999909, 19.930731512000079 ], [ -76.823597785999937, 19.931586005000042 ], [ -76.845611131999931, 19.93626536700009 ], [ -76.866444464999915, 19.937689520000049 ], [ -76.881825324999909, 19.931382554000038 ], [ -76.914133266999897, 19.906642971000053 ], [ -76.935292120999918, 19.896714585000041 ], [ -76.958892381999931, 19.891058661000045 ], [ -77.03464353527859, 19.887765132826136 ], [ -77.035111457028108, 19.910593777081147 ], [ -77.044154832679396, 19.928060410759315 ], [ -77.047229579681357, 19.932788805059317 ], [ -77.047849698204971, 19.935889391382318 ], [ -77.047772182939866, 19.938912462440157 ], [ -77.039116380916255, 19.941470445504649 ], [ -76.980902879963935, 19.947516588519704 ], [ -76.973823208174508, 19.949583645169071 ], [ -76.968603889258077, 19.952968451432866 ], [ -76.930699225888532, 20.001105047959584 ], [ -76.92584164127868, 20.003352973560879 ], [ -76.918503587970179, 20.005006619060225 ], [ -76.894577399227558, 20.00642772146216 ], [ -76.88057308617897, 20.00529083900102 ], [ -76.858688116563314, 20.005600898262855 ], [ -76.843236863590391, 20.0083397493799 ], [ -76.833521695270008, 20.012422186734511 ], [ -76.81698523578001, 20.02857107169757 ], [ -76.800707159607725, 20.037950344133037 ], [ -76.790836961656453, 20.029268703687706 ], [ -76.788640712898541, 20.026814073410719 ], [ -76.78458411306633, 20.023248399094314 ], [ -76.781173469280191, 20.021233018389069 ], [ -76.777814501438058, 20.020225328036418 ], [ -76.774352179909158, 20.019450182579874 ], [ -76.771613328792057, 20.018287461696957 ], [ -76.769003668884181, 20.016427109723338 ], [ -76.766445685819747, 20.013584905818732 ], [ -76.762750821193436, 20.011336982016076 ], [ -76.759417690873704, 20.01141449638186 ], [ -76.755774502191514, 20.015031847541707 ], [ -76.753914151117158, 20.018287461696957 ], [ -76.750296799957312, 20.020612900764718 ], [ -76.744948289831711, 20.022602443947619 ], [ -76.725879685698942, 20.027201646139019 ], [ -76.72004024915816, 20.027330837348245 ], [ -76.713942430198983, 20.02262828236934 ], [ -76.70518327538781, 20.013042304358862 ], [ -76.698904589275344, 20.008856513317426 ], [ -76.690998094286613, 20.00585927978193 ], [ -76.674513311639998, 20.002190253577339 ], [ -76.670844286334727, 20.000820828018789 ], [ -76.668880580674227, 19.999787299244474 ], [ -76.663454556182785, 19.999193020041844 ], [ -76.654721238894069, 19.999322211251013 ], [ -76.637022061219113, 20.001906032737224 ], [ -76.613483446104169, 20.002190253577339 ], [ -76.609995287052868, 20.004076443073359 ], [ -76.606532966423231, 20.012861436306252 ], [ -76.604543423240386, 20.014489244283197 ], [ -76.598626472333819, 20.013042304358862 ], [ -76.590358242139132, 20.010096746767431 ], [ -76.562478807251125, 20.003766383811524 ], [ -76.555554165092644, 20.00549754547535 ], [ -76.554313930743319, 20.010225937976656 ], [ -76.56219458731033, 20.030379746827862 ], [ -76.563564011969561, 20.036012477793577 ], [ -76.56371904160045, 20.038777167332398 ], [ -76.557104457804485, 20.042601223167878 ], [ -76.528785773344737, 20.038105373763983 ], [ -76.505376350338281, 20.036658433839648 ], [ -76.498374192914639, 20.037304388986342 ], [ -76.488736538060778, 20.039474799322534 ], [ -76.476747605717435, 20.044048163092214 ], [ -76.462433234306332, 20.051179510825762 ], [ -76.447369554061652, 20.061101386519738 ], [ -76.418611620030219, 20.086681219862385 ], [ -76.408276333186222, 20.105284736001749 ], [ -76.411842006603308, 20.189517319868401 ], [ -76.41747473756908, 20.219076239576793 ], [ -76.420420295160454, 20.225975043313554 ], [ -76.419645147905214, 20.231065171920136 ], [ -76.413159756217738, 20.234760037445767 ], [ -76.404400601406621, 20.243932603406904 ], [ -76.389104377165268, 20.258686225289068 ], [ -76.390577154612004, 20.26853058481862 ], [ -76.390292934671209, 20.271553655876517 ], [ -76.390447964302098, 20.276256211754742 ], [ -76.369467333150908, 20.356638902263512 ], [ -76.363188646139122, 20.36661245390161 ], [ -76.355514696046384, 20.372865302491675 ], [ -76.339572516658279, 20.373278712742376 ], [ -76.329779833072848, 20.372503567285776 ], [ -76.308127408353187, 20.368576157763471 ], [ -76.298722296596679, 20.368576157763471 ], [ -76.293347948049359, 20.370539863423915 ], [ -76.289988980207283, 20.377283637529843 ], [ -76.289136318586202, 20.381857001299579 ], [ -76.288231981021113, 20.39128795057843 ], [ -76.286500821155983, 20.395267035145537 ], [ -76.283012661205362, 20.399788722971152 ], [ -76.277018195033634, 20.405602321989534 ], [ -76.272289801633008, 20.411570949739541 ], [ -76.268879156947548, 20.418314723845413 ], [ -76.267328864235708, 20.427048041134185 ], [ -76.267483893866597, 20.436091416785416 ], [ -76.271282111280414, 20.454617418558996 ], [ -76.270274420927763, 20.459087429541228 ], [ -76.266011114621222, 20.460560207887283 ], [ -76.258414679793646, 20.461076971824752 ], [ -76.248337775368043, 20.455237535284027 ], [ -76.243195969918077, 20.450018215468276 ], [ -76.24094804611542, 20.443842882143258 ], [ -76.241025559581885, 20.437745063184082 ], [ -76.24187822120291, 20.43175059701241 ], [ -76.24187822120291, 20.42560110120985 ], [ -76.240844693327915, 20.420226751763153 ], [ -76.235832079087174, 20.41071828901778 ], [ -76.230896979212218, 20.397514959847513 ], [ -76.227305467373412, 20.393251655339611 ], [ -76.21952816359385, 20.393871772064585 ], [ -76.205601365810367, 20.404439602005993 ], [ -76.17965979726182, 20.437590033553192 ], [ -76.155423550156684, 20.438881943846638 ], [ -76.146457688871237, 20.438597723905843 ], [ -76.138189459575869, 20.436892402462377 ], [ -76.130463832639748, 20.434153551345275 ], [ -76.121394618566796, 20.42983856909467 ], [ -76.116304490859534, 20.42846914353612 ], [ -76.111756964612198, 20.428779201898635 ], [ -76.106770188793178, 20.430277817767035 ], [ -76.106150072068147, 20.42828827638283 ], [ -76.107106085577357, 20.424128322863794 ], [ -76.114805874091815, 20.408315335584234 ], [ -76.111343552562914, 20.400615546170513 ], [ -76.092610847012963, 20.417462063123708 ], [ -76.090543788564958, 20.420562649446708 ], [ -76.084368456139316, 20.442008367691983 ], [ -76.08173295780972, 20.464435940566204 ], [ -76.088347540706422, 20.479499619911508 ], [ -76.090285407045883, 20.488853053925254 ], [ -76.092869229431358, 20.492031155513416 ], [ -76.09640906442678, 20.493374741750927 ], [ -76.096925829263569, 20.495984402558122 ], [ -76.094548713352424, 20.499395046344318 ], [ -76.079019945114339, 20.509161892407406 ], [ -76.066307543258517, 20.519755560770477 ], [ -76.061346604961841, 20.522675279040868 ], [ -76.043440720812612, 20.529574082777685 ], [ -76.04106360490141, 20.534690049805931 ], [ -76.041864589679051, 20.541433823911802 ], [ -76.048970099890198, 20.557505195408453 ], [ -76.051398891745464, 20.56608348216696 ], [ -76.049202643886872, 20.57241384512281 ], [ -76.046670498344781, 20.573602403528071 ], [ -76.033027919602773, 20.567866318875474 ], [ -75.985614794387232, 20.534767564171716 ], [ -75.976183845108324, 20.520143134398097 ], [ -75.980498827358986, 20.509704494766595 ], [ -75.977243212304415, 20.505828762087674 ], [ -75.969827643730753, 20.502960719761404 ], [ -75.952438524418369, 20.501462103892948 ], [ -75.940139532813191, 20.501642971046238 ], [ -75.933292405919758, 20.500454413540353 ], [ -75.930786098799388, 20.497844752733158 ], [ -75.931716274786254, 20.491023464261445 ], [ -75.934222581906624, 20.48629507086082 ], [ -75.936806403392779, 20.482160955763504 ], [ -75.939364387356591, 20.479215399970712 ], [ -75.940578783284195, 20.477122504000363 ], [ -75.937193977020399, 20.472936712958926 ], [ -75.929752570025073, 20.467071437996424 ], [ -75.900141975271936, 20.448080349128816 ], [ -75.883553839837816, 20.443972073352484 ], [ -75.879445563162221, 20.427797349967705 ], [ -75.87805030008127, 20.424360866860525 ], [ -75.876655036100999, 20.421725369430249 ], [ -75.873011848318129, 20.418314723845413 ], [ -75.85626868415244, 20.410098171393486 ], [ -75.824668545317081, 20.407617702694779 ], [ -75.752399055372109, 20.439036974376847 ], [ -75.744337530752432, 20.441052354182773 ], [ -75.73314958408605, 20.442060045434744 ], [ -75.701342739675681, 20.437874254393307 ], [ -75.658813035693015, 20.441491603754514 ], [ -75.61555986219787, 20.469836127535245 ], [ -75.612510951818933, 20.477019151212858 ], [ -75.609565396026198, 20.485985012498304 ], [ -75.614836391786014, 20.496888739223891 ], [ -75.61576656777288, 20.500015163968612 ], [ -75.61555986219787, 20.503115750291613 ], [ -75.61421627506104, 20.50712067328044 ], [ -75.611425747100554, 20.510634669854142 ], [ -75.609203660820299, 20.511771552315281 ], [ -75.601788093145956, 20.50828339326398 ], [ -75.5953543774026, 20.506035468562004 ], [ -75.582590297803961, 20.499550075975208 ], [ -75.57793941876912, 20.500712795059428 ], [ -75.570498012673113, 20.505182806940979 ], [ -75.55543433332781, 20.516422431350122 ], [ -75.535538906894999, 20.535749417001966 ], [ -75.53174068858192, 20.540245266405918 ], [ -75.528562587893077, 20.542467352686174 ], [ -75.524816047322702, 20.544250190294008 ], [ -75.518744065885926, 20.546136378890765 ], [ -75.515023362837894, 20.54815176049533 ], [ -75.511638556574098, 20.55086477319071 ], [ -75.507401088689278, 20.551846625121641 ], [ -75.501794196145227, 20.550528876406531 ], [ -75.485800339913737, 20.538488267219748 ], [ -75.467222663095413, 20.532984727463202 ], [ -75.423426887241021, 20.540762031242707 ], [ -75.411076218792459, 20.540865383130892 ], [ -75.406993781437848, 20.541640530386132 ], [ -75.401929491252986, 20.543242499042094 ], [ -75.392705248448465, 20.547505805348635 ], [ -75.390689866843843, 20.54432770376053 ], [ -75.390147263585334, 20.537635606498043 ], [ -75.393402880438543, 20.513115139452111 ], [ -75.395004849094505, 20.508386746051485 ], [ -75.396736008959635, 20.506965644548814 ], [ -75.403479783964826, 20.504330146219274 ], [ -75.407200487012858, 20.502263087771269 ], [ -75.409680955711508, 20.499420884765982 ], [ -75.411748013260194, 20.495777696083792 ], [ -75.412729865191125, 20.492418728241717 ], [ -75.414305996324686, 20.489111436343705 ], [ -75.416760626601615, 20.485571601348283 ], [ -75.420403815283862, 20.482729397443734 ], [ -75.424589606325242, 20.480429795898374 ], [ -75.423504400707486, 20.476812446537167 ], [ -75.417096524285171, 20.468905951548436 ], [ -75.401464403259581, 20.456116034427453 ], [ -75.375471157867651, 20.422862250092749 ], [ -75.384772915038013, 20.415730903258577 ], [ -75.389397955651134, 20.407333481854664 ], [ -75.39355790917017, 20.404232896430983 ], [ -75.398467169724086, 20.403354397287615 ], [ -75.407820603737832, 20.406454982711239 ], [ -75.4114896308418, 20.40808279068824 ], [ -75.416553921026605, 20.409116319462555 ], [ -75.419241096199642, 20.407927761057294 ], [ -75.420946417643052, 20.404697984424445 ], [ -75.421644049633187, 20.401054795742198 ], [ -75.421773240842356, 20.396119696766561 ], [ -75.423039312714081, 20.389608465758045 ], [ -75.426992560658107, 20.381546942937064 ], [ -75.437017788240325, 20.3671808937832 ], [ -75.448567471011984, 20.358266710240457 ], [ -75.459962124152696, 20.351471259291145 ], [ -75.472545335698669, 20.346717027468799 ], [ -75.477325405942736, 20.342841294789878 ], [ -75.479134081072971, 20.340024929307049 ], [ -75.475129157184824, 20.331498318492606 ], [ -75.464561327243416, 20.31108612722295 ], [ -75.462106696067167, 20.294601345475712 ], [ -75.463501960047381, 20.262329413071939 ], [ -75.465181443968447, 20.256929226102898 ], [ -75.467351854304638, 20.254758815766706 ], [ -75.470633307780929, 20.252355862333161 ], [ -75.473320482054589, 20.25000458394436 ], [ -75.475955980384185, 20.246258043373984 ], [ -75.48045182978808, 20.238170681231963 ], [ -75.481511196984115, 20.233674831828012 ], [ -75.480994432147327, 20.22729279202872 ], [ -75.47528418591645, 20.203366604185419 ], [ -75.470219895731589, 20.188974718408531 ], [ -75.467816942298043, 20.18471141210199 ], [ -75.462726812792141, 20.171404731043481 ], [ -75.461874152070436, 20.169957791119145 ], [ -75.460039639417801, 20.1679424104139 ], [ -75.450505337351444, 20.161457016927784 ], [ -75.451202969341523, 20.134895330754887 ], [ -75.448102383018522, 20.123500678513494 ], [ -75.445544399954088, 20.121433620964808 ], [ -75.442521327996872, 20.120658473709568 ], [ -75.438361376276475, 20.120348416246372 ], [ -75.432082689264689, 20.117015285926698 ], [ -75.429628058987703, 20.112545274045146 ], [ -75.428827074210119, 20.103631090502404 ], [ -75.430480719709408, 20.098205064212323 ], [ -75.43327124677063, 20.094665229216957 ], [ -75.4569390530948, 20.083528958494639 ], [ -75.468798794228974, 20.069653835755901 ], [ -75.47295874684869, 20.067199205478914 ], [ -75.476111009115755, 20.067199205478914 ], [ -75.489676072592658, 20.061721503244769 ], [ -75.488280808612387, 20.024617825552184 ], [ -75.483707444842707, 20.009528306885841 ], [ -75.470529954993424, 19.98888357251883 ], [ -75.464277106403301, 19.98177806230774 ], [ -75.442753871993602, 19.962838650283459 ], [ -75.382111579186017, 19.882585150983914 ], [ -75.382080421154143, 19.882543917011262 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/dominican republic.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/dominican republic.geojson new file mode 100644 index 000000000000..6af4a2f9fb0f --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/dominican republic.geojson @@ -0,0 +1,38 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "DO-15", "NAME_1": "Monte Cristi" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.746041408999929, 19.649017002000036 ], [ -71.745047566999943, 19.664898987000058 ], [ -71.748613240999902, 19.682598165000073 ], [ -71.757435675999943, 19.710109768000052 ], [ -71.738270636999914, 19.706122137000079 ], [ -71.720326300999943, 19.697455145000049 ], [ -71.724110480999911, 19.717189846000053 ], [ -71.741851365999935, 19.755804755000042 ], [ -71.740793423999946, 19.765692450000074 ], [ -71.740793423999946, 19.773179429000038 ], [ -71.767648891999897, 19.774481512000079 ], [ -71.771066860999952, 19.785142320000091 ], [ -71.760243292999917, 19.800930080000057 ], [ -71.744496222999942, 19.817206122000073 ], [ -71.739979620999918, 19.820257880000042 ], [ -71.734852667999917, 19.821275132000039 ], [ -71.723703579999949, 19.820990302000041 ], [ -71.716908331999946, 19.823635158000059 ], [ -71.705799933999913, 19.836493231000077 ], [ -71.699818488999938, 19.841498114000046 ], [ -71.687896287999934, 19.84601471600007 ], [ -71.679025844999899, 19.848089911000045 ], [ -71.670277472999942, 19.851996161000045 ], [ -71.658802863999938, 19.86196523600006 ], [ -71.665638800999943, 19.874497789000088 ], [ -71.666737433999913, 19.885687567000048 ], [ -71.661447719999899, 19.893622137000079 ], [ -71.648589647999927, 19.896714585000041 ], [ -71.64085852799991, 19.895575262000079 ], [ -71.628895636999914, 19.890448309000078 ], [ -71.621245897999927, 19.88930898600006 ], [ -71.617909308999913, 19.891424872000073 ], [ -71.610951300999943, 19.900824286000045 ], [ -71.607329881999931, 19.902899481000077 ], [ -71.504628058999913, 19.910345770000049 ], [ -71.478505011999914, 19.90688711100006 ], [ -71.452707485999952, 19.898098049000055 ], [ -71.357248501999948, 19.851263739000046 ], [ -71.329213019999941, 19.845892645000049 ], [ -71.302601691999939, 19.855698960000041 ], [ -71.282460089999915, 19.841782945000091 ], [ -71.268055792999917, 19.835516669000071 ], [ -71.223744269999941, 19.834051825000074 ], [ -71.221774161131975, 19.834566661839293 ], [ -71.214975755027069, 19.800626329341583 ], [ -71.195054491071915, 19.771584174470036 ], [ -71.163919440229961, 19.763057562756273 ], [ -71.133972947793268, 19.751766262403066 ], [ -71.145031704149801, 19.722465725113125 ], [ -71.153687507072789, 19.692493394254711 ], [ -71.150819464746462, 19.659420477972674 ], [ -71.148390671991933, 19.626295884847195 ], [ -71.172678595940454, 19.628621323914956 ], [ -71.17895728205292, 19.60730479597953 ], [ -71.172781948727959, 19.570872910956041 ], [ -71.184202440290392, 19.536508084380557 ], [ -71.201514045236991, 19.542063300081224 ], [ -71.216319343063219, 19.532218940551672 ], [ -71.247764452267631, 19.535009466713518 ], [ -71.278951179053649, 19.552321072559437 ], [ -71.300293545410796, 19.549711411752241 ], [ -71.319749722271865, 19.54025462495099 ], [ -71.352202520929609, 19.537644965043114 ], [ -71.382588263837306, 19.548367825514731 ], [ -71.3997965159964, 19.560537625011364 ], [ -71.413051520211468, 19.544543768779874 ], [ -71.454211798635583, 19.562940579344229 ], [ -71.492297329158419, 19.58684092876581 ], [ -71.507361009403041, 19.612860012579517 ], [ -71.532501594073324, 19.619629625107109 ], [ -71.637714809990484, 19.607330634401251 ], [ -71.734763150299159, 19.646294664067455 ], [ -71.746041408999929, 19.649017002000036 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-05", "NAME_1": "Dajabón" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.749517077051451, 19.279707722733178 ], [ -71.753729206999907, 19.28378529900003 ], [ -71.771557576999953, 19.307556457000075 ], [ -71.776518514999907, 19.327503561000086 ], [ -71.769955607999918, 19.333808085 ], [ -71.742980508999977, 19.348380839000058 ], [ -71.733472046999907, 19.355460511000089 ], [ -71.720811320999957, 19.385949606000068 ], [ -71.715281942999951, 19.391659851000028 ], [ -71.703861450999852, 19.414630025000079 ], [ -71.703189656999967, 19.459278463000103 ], [ -71.715126912999921, 19.53746490500005 ], [ -71.743083862999924, 19.600070903000059 ], [ -71.747683064999961, 19.622782695000026 ], [ -71.746041408999929, 19.649017002000036 ], [ -71.734763150299159, 19.646294664067455 ], [ -71.637714809990484, 19.607330634401251 ], [ -71.532501594073324, 19.619629625107109 ], [ -71.507361009403041, 19.612860012579517 ], [ -71.492297329158419, 19.58684092876581 ], [ -71.454211798635583, 19.562940579344229 ], [ -71.413051520211468, 19.544543768779874 ], [ -71.436331752908075, 19.508086046234041 ], [ -71.448656582035596, 19.46581472377045 ], [ -71.446460334177061, 19.443232123064035 ], [ -71.454082608325677, 19.422199815069405 ], [ -71.466174892557206, 19.358637803991428 ], [ -71.515060797917499, 19.338018907146818 ], [ -71.505138923122786, 19.316418158371278 ], [ -71.488266567747871, 19.298848171006284 ], [ -71.505319790276076, 19.281975816530689 ], [ -71.525809495911517, 19.270193589762357 ], [ -71.549632330967313, 19.277764187067589 ], [ -71.574075282748083, 19.284042874079375 ], [ -71.586348435931541, 19.270167752239956 ], [ -71.593764003605884, 19.251900132884828 ], [ -71.614925502809683, 19.244484565210485 ], [ -71.635105150082609, 19.232934882438883 ], [ -71.651732717191123, 19.21792388447966 ], [ -71.716522176999888, 19.247766825000028 ], [ -71.749517077051451, 19.279707722733178 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-07", "NAME_1": "La Estrelleta" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.862456421999951, 18.947087504000038 ], [ -71.865401977999852, 18.964424948000058 ], [ -71.848142048999961, 18.975483704000041 ], [ -71.796827351999923, 18.988609518000104 ], [ -71.783701537999946, 18.996309306000015 ], [ -71.740345011999864, 19.041887919000075 ], [ -71.710424356999937, 19.081652934000104 ], [ -71.695283161999924, 19.094546204 ], [ -71.661383422999904, 19.117593893000063 ], [ -71.648774373999885, 19.135293071000078 ], [ -71.64365840699989, 19.15247548400005 ], [ -71.63911088099988, 19.212110088000045 ], [ -71.651732717191123, 19.21792388447966 ], [ -71.635105150082609, 19.232934882438883 ], [ -71.614925502809683, 19.244484565210485 ], [ -71.593764003605884, 19.251900132884828 ], [ -71.586348435931541, 19.270167752239956 ], [ -71.574075282748083, 19.284042874079375 ], [ -71.549632330967313, 19.277764187067589 ], [ -71.525809495911517, 19.270193589762357 ], [ -71.505319790276076, 19.281975816530689 ], [ -71.488266567747871, 19.298848171006284 ], [ -71.446822069382961, 19.273604234447873 ], [ -71.415893724116074, 19.234485175150724 ], [ -71.371271125062378, 19.213272000002803 ], [ -71.327371996420482, 19.191076972024632 ], [ -71.334322476101363, 19.160923774012929 ], [ -71.336337856806608, 19.129995428746042 ], [ -71.367757127589357, 19.10718028404284 ], [ -71.405842658112192, 19.105139064915875 ], [ -71.43721025295082, 19.123251655539434 ], [ -71.471135829954562, 19.128393460090081 ], [ -71.491367154070872, 19.092349147794891 ], [ -71.50309770399582, 19.049716091024777 ], [ -71.518755663443073, 19.018064277144674 ], [ -71.549709846232417, 19.009460151065127 ], [ -71.577976853848725, 19.006747138369747 ], [ -71.60004269061767, 18.987756049502082 ], [ -71.624847377604397, 18.937836615367473 ], [ -71.633244798108933, 18.88380890635591 ], [ -71.615907354740614, 18.862905789570505 ], [ -71.627896287983276, 18.814200751363558 ], [ -71.605313687276862, 18.800248114259034 ], [ -71.585004848794711, 18.78340159820516 ], [ -71.577821825117098, 18.760431422971749 ], [ -71.577873501061219, 18.735859279981753 ], [ -71.559321661765239, 18.717049059166754 ], [ -71.532294887598994, 18.711002916151642 ], [ -71.520745204827335, 18.682580878005126 ], [ -71.534982061872654, 18.650774034494077 ], [ -71.597794765915694, 18.663667304402566 ], [ -71.661925217774581, 18.668421536224912 ], [ -71.729440476796583, 18.678446763807074 ], [ -71.784897638415259, 18.684730212729107 ], [ -71.758070027999878, 18.700513407000031 ], [ -71.744065714999891, 18.711442973000104 ], [ -71.732076782999911, 18.730072327000059 ], [ -71.725255492999878, 18.746970520000062 ], [ -71.72034623299993, 18.76544484500009 ], [ -71.71884761599992, 18.784229228000086 ], [ -71.726909139999918, 18.82352915500006 ], [ -71.727942668999901, 18.864069316000084 ], [ -71.733472046999907, 18.882569479 ], [ -71.740913452999933, 18.891612854000059 ], [ -71.763806111999941, 18.911508281000053 ], [ -71.772952839999931, 18.921714376000054 ], [ -71.787112182999891, 18.950033061000042 ], [ -71.796258910999967, 18.957061056000057 ], [ -71.819668334999932, 18.957810364000053 ], [ -71.844524698999891, 18.949748841000044 ], [ -71.862456421999951, 18.947087504000038 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-10", "NAME_1": "Independencia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.79177913299992, 18.680681698000072 ], [ -71.784897638415259, 18.684730212729107 ], [ -71.729440476796583, 18.678446763807074 ], [ -71.661925217774581, 18.668421536224912 ], [ -71.597794765915694, 18.663667304402566 ], [ -71.534982061872654, 18.650774034494077 ], [ -71.567460699851381, 18.642299098724436 ], [ -71.59947424983676, 18.632583930404053 ], [ -71.604280157603171, 18.6215251731482 ], [ -71.602678188947266, 18.608812771292321 ], [ -71.609447800575538, 18.586256008108251 ], [ -71.62066158656296, 18.565301215378781 ], [ -71.592601283622344, 18.47799388271153 ], [ -71.489971890090658, 18.439753323457069 ], [ -71.451627977149428, 18.423268540810511 ], [ -71.415454475443653, 18.402107042505975 ], [ -71.376722988874803, 18.392727769171188 ], [ -71.338404914355294, 18.407016303059947 ], [ -71.290552537769372, 18.404174099155341 ], [ -71.264585129899785, 18.357872016180579 ], [ -71.236731533433499, 18.335987047464243 ], [ -71.200764737302791, 18.338364163375445 ], [ -71.233915167950613, 18.296325384908585 ], [ -71.286625129146387, 18.282837835797466 ], [ -71.337061327218464, 18.299167588813134 ], [ -71.381373867010325, 18.290124213161903 ], [ -71.366646084449201, 18.232815049774729 ], [ -71.351013963423668, 18.177960517563804 ], [ -71.373984137757759, 18.17501495997243 ], [ -71.399305588681955, 18.181603705346731 ], [ -71.417573208037084, 18.162974350785646 ], [ -71.42193986713113, 18.135947577518664 ], [ -71.451834682724439, 18.159873766261285 ], [ -71.480463426445965, 18.185453600503251 ], [ -71.515086636339163, 18.198811957505825 ], [ -71.551621874150158, 18.207622789160382 ], [ -71.636784634003618, 18.247672024444341 ], [ -71.719492763580149, 18.292113756344747 ], [ -71.721708773141359, 18.292996236786905 ], [ -71.721111735999841, 18.293973823000087 ], [ -71.709339151999927, 18.313250224000015 ], [ -71.711509562999936, 18.316144105000106 ], [ -71.720707967999942, 18.323973083000041 ], [ -71.734970662999899, 18.332938945000066 ], [ -71.788714152999916, 18.352214254 ], [ -71.826437947999864, 18.37616628100001 ], [ -71.834551147999946, 18.38508046500003 ], [ -71.8497440189999, 18.406448670000131 ], [ -71.858167277999883, 18.413554179000059 ], [ -71.897182983999897, 18.422881775000107 ], [ -71.912169148999851, 18.430736593000049 ], [ -71.918163615999873, 18.449236755000058 ], [ -71.914391235999858, 18.460217997000044 ], [ -71.906898152999929, 18.464300436000045 ], [ -71.901575479999877, 18.469778138000052 ], [ -71.904055949999957, 18.484790141000119 ], [ -71.910515502999914, 18.494272766 ], [ -72.000949259999885, 18.582458598000059 ], [ -72.009837605999905, 18.598814189 ], [ -71.992629353999916, 18.61113901800006 ], [ -71.955474, 18.618606262000085 ], [ -71.88028479099998, 18.605402934 ], [ -71.841579141999972, 18.617986145000103 ], [ -71.828556680999924, 18.631292827000024 ], [ -71.807989460999949, 18.664649964000077 ], [ -71.794346883999935, 18.679171041000032 ], [ -71.79177913299992, 18.680681698000072 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-16", "NAME_1": "Pedernales" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -71.776234503999945, 18.039252020000063 ], [ -71.764271199999968, 18.069492493000084 ], [ -71.760653849999898, 18.086804097000098 ], [ -71.762875935999887, 18.115846253000072 ], [ -71.762204141999916, 18.132486064000105 ], [ -71.764581257999851, 18.143674011000044 ], [ -71.775329955999979, 18.172328593000131 ], [ -71.776828572999875, 18.181785380000079 ], [ -71.77403804599993, 18.201474101000045 ], [ -71.766131551999877, 18.220258484000041 ], [ -71.721708773141359, 18.292996236786905 ], [ -71.719492763580149, 18.292113756344747 ], [ -71.636784634003618, 18.247672024444341 ], [ -71.551621874150158, 18.207622789160382 ], [ -71.515086636339163, 18.198811957505825 ], [ -71.480463426445965, 18.185453600503251 ], [ -71.451834682724439, 18.159873766261285 ], [ -71.42193986713113, 18.135947577518664 ], [ -71.391166550595813, 18.118971869356244 ], [ -71.389900478724087, 18.078225002981469 ], [ -71.388970302737278, 18.05993154520462 ], [ -71.390908169076738, 18.041948146689606 ], [ -71.396385871310883, 18.031251126438292 ], [ -71.406411098893102, 18.027427069703492 ], [ -71.416849737625284, 18.023861396286406 ], [ -71.423748542261421, 18.014998887788408 ], [ -71.402225307851666, 17.963865057726196 ], [ -71.352925991341408, 17.925081895213282 ], [ -71.327656216361277, 17.930895494231663 ], [ -71.2976838846036, 17.929526069572432 ], [ -71.281715867693151, 17.894566961995679 ], [ -71.281741706114815, 17.855732123538644 ], [ -71.281044074124736, 17.853225816418274 ], [ -71.281017156045905, 17.853130772829296 ], [ -71.282093878999945, 17.853989976000037 ], [ -71.283599412999934, 17.846747137000079 ], [ -71.285145636999914, 17.844183661000045 ], [ -71.288929816999939, 17.841009833000044 ], [ -71.282093878999945, 17.841009833000044 ], [ -71.286122199999909, 17.832586981000077 ], [ -71.29133053299995, 17.826157945000091 ], [ -71.297718878999945, 17.821966864000046 ], [ -71.305653449999909, 17.820502020000049 ], [ -71.309315558999913, 17.816392320000091 ], [ -71.315825975999928, 17.796454169000071 ], [ -71.319650844999899, 17.789211330000057 ], [ -71.331857876999948, 17.772406317000048 ], [ -71.36554928299995, 17.678412177000041 ], [ -71.375884568999936, 17.660142320000091 ], [ -71.417225714999915, 17.604803778000075 ], [ -71.427235480999911, 17.609279690000051 ], [ -71.43586178299995, 17.617092190000051 ], [ -71.436350063999953, 17.621283270000049 ], [ -71.446115688999953, 17.629339911000045 ], [ -71.514881964999915, 17.737779039000088 ], [ -71.531605597999942, 17.755072333000044 ], [ -71.565256313999953, 17.767523505000042 ], [ -71.645130988999938, 17.75726959800005 ], [ -71.679310675999943, 17.765285549000055 ], [ -71.669667120999918, 17.772406317000048 ], [ -71.637766079999949, 17.804022528000075 ], [ -71.630930141999897, 17.816799221000053 ], [ -71.632394985999952, 17.838324286000045 ], [ -71.636586066999939, 17.853461005000042 ], [ -71.652007615999935, 17.881984768000052 ], [ -71.662831183999913, 17.897691148000092 ], [ -71.664947068999936, 17.903469143000052 ], [ -71.665638800999943, 17.91547272300005 ], [ -71.658802863999938, 17.953314520000049 ], [ -71.66624915299991, 17.970770575000074 ], [ -71.68382727799991, 17.990179755000042 ], [ -71.720326300999943, 18.019110419000071 ], [ -71.776234503999945, 18.039252020000063 ] ] ], [ [ [ -71.524484829999949, 17.54555898600006 ], [ -71.541167772999927, 17.554632880000042 ], [ -71.541371222999942, 17.576157945000091 ], [ -71.532215949999909, 17.601304429000038 ], [ -71.521066860999952, 17.621283270000049 ], [ -71.506947394999941, 17.613674221000053 ], [ -71.492583787999934, 17.603664455000057 ], [ -71.46711178299995, 17.580267645000049 ], [ -71.482533331999946, 17.57562897300005 ], [ -71.507394985999952, 17.551255601000037 ], [ -71.524484829999949, 17.54555898600006 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-11", "NAME_1": "La Altagracia" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -68.664051886999914, 18.169338283000059 ], [ -68.612375454999949, 18.170803127000056 ], [ -68.598784959999932, 18.166205145000049 ], [ -68.588693813999953, 18.153387762000079 ], [ -68.577504035999937, 18.133734442000048 ], [ -68.570179816999939, 18.115708726000037 ], [ -68.571848110999952, 18.107855536000045 ], [ -68.587025519999941, 18.111070054000038 ], [ -68.619292772999927, 18.125148830000057 ], [ -68.636097785999937, 18.12836334800005 ], [ -68.653920050999943, 18.126288153000075 ], [ -68.684885219999899, 18.116888739000046 ], [ -68.701893683999913, 18.11469147300005 ], [ -68.737049933999913, 18.123602606000077 ], [ -68.762074347999942, 18.14516836100006 ], [ -68.778187628999945, 18.172023830000057 ], [ -68.786936001999948, 18.196682033000059 ], [ -68.772084113999938, 18.200873114000046 ], [ -68.75454667899993, 18.197658596000053 ], [ -68.737172003999945, 18.189520575000074 ], [ -68.722320115999935, 18.179266669000071 ], [ -68.710764126999948, 18.175360419000071 ], [ -68.664051886999914, 18.169338283000059 ] ] ], [ [ [ -68.785145636999914, 18.979885158000059 ], [ -68.776966925999943, 18.974351304000038 ], [ -68.76781165299991, 18.96946849200009 ], [ -68.749989386999914, 18.968085028000075 ], [ -68.739735480999911, 18.964422919000071 ], [ -68.623524542999917, 18.861883856000077 ], [ -68.580799933999913, 18.812567450000074 ], [ -68.520497199999909, 18.768866278000075 ], [ -68.477284308999913, 18.740220445000091 ], [ -68.464995897999927, 18.73501211100006 ], [ -68.458566860999952, 18.731024481000077 ], [ -68.413400844999899, 18.689601955000057 ], [ -68.356190558999913, 18.65656159100007 ], [ -68.328602667999917, 18.616522528000075 ], [ -68.334055141999954, 18.577297268000052 ], [ -68.42804928299995, 18.441229559000078 ], [ -68.434681769999941, 18.435777085000041 ], [ -68.441273566999939, 18.429022528000075 ], [ -68.444325324999909, 18.419501044000071 ], [ -68.442494269999941, 18.384751695000091 ], [ -68.444325324999909, 18.374823309000078 ], [ -68.455677863999938, 18.357855536000045 ], [ -68.472157355999911, 18.349839585000041 ], [ -68.49282792899993, 18.347479559000078 ], [ -68.516590949999909, 18.347479559000078 ], [ -68.534901495999918, 18.353338934000078 ], [ -68.57453365799995, 18.378159898000092 ], [ -68.588937954999949, 18.38226959800005 ], [ -68.605458136999914, 18.37173086100006 ], [ -68.602853969999899, 18.355658270000049 ], [ -68.597523566999939, 18.336615302000041 ], [ -68.606027798999946, 18.317084052000041 ], [ -68.618316209999932, 18.301459052000041 ], [ -68.626088019999941, 18.283351955000057 ], [ -68.641509568999936, 18.225165106000077 ], [ -68.647084113999938, 18.214829820000091 ], [ -68.65843665299991, 18.210923570000091 ], [ -68.742990688999953, 18.20453522300005 ], [ -68.760243292999917, 18.210353908000059 ], [ -68.762521938999953, 18.246975002000056 ], [ -68.786854620999918, 18.295396226000037 ], [ -68.820139126999948, 18.342474677000041 ], [ -68.849598761999914, 18.374823309000078 ], [ -68.880970831999946, 18.395493882000039 ], [ -68.901149176876245, 18.403656131063737 ], [ -68.883283453768342, 18.444275011282741 ], [ -68.865584276093443, 18.489724433535741 ], [ -68.85201921261654, 18.51863739719812 ], [ -68.853104418234295, 18.549824123984138 ], [ -68.874136726228926, 18.574732163758313 ], [ -68.899328985943953, 18.596436266220678 ], [ -68.918707648439238, 18.629741726499446 ], [ -68.935295782973981, 18.665682685107811 ], [ -68.942866380279213, 18.686404933840606 ], [ -68.938861457290386, 18.708109036302972 ], [ -68.916588914946431, 18.720743922893689 ], [ -68.889898036665045, 18.7248005227259 ], [ -68.838712530658768, 18.763402818085581 ], [ -68.818041957870037, 18.82004018790434 ], [ -68.845172084823844, 18.869261990048813 ], [ -68.837446458787042, 18.911249090772912 ], [ -68.831736212556166, 18.92217865592022 ], [ -68.832408006124581, 18.935692044352322 ], [ -68.803830939246438, 18.956827704235138 ], [ -68.785145636999914, 18.979885158000059 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-08", "NAME_1": "El Seybo" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.211742894119254, 19.020982731867548 ], [ -69.173247850999928, 19.011135158000059 ], [ -69.157460089999915, 19.012193101000037 ], [ -69.138661261999914, 19.022284247000073 ], [ -69.144886847999942, 19.02960846600007 ], [ -69.157338019999941, 19.036688544000071 ], [ -69.157460089999915, 19.046372789000088 ], [ -69.139515753999945, 19.051214911000045 ], [ -69.123890753999945, 19.037787177000041 ], [ -69.102853969999899, 19.005357164000088 ], [ -69.089263475999928, 18.997870184000078 ], [ -69.074126756999931, 18.993557033000059 ], [ -69.06118730399993, 18.988185940000051 ], [ -69.054432745999918, 18.977484442000048 ], [ -69.042469855999911, 18.986761786000045 ], [ -69.018055792999917, 18.997463283000059 ], [ -69.006581183999913, 19.005357164000088 ], [ -69.014230923999946, 19.013413804000038 ], [ -69.010568813999953, 19.015366929000038 ], [ -69.001576300999943, 19.015611070000091 ], [ -68.992990688999953, 19.018459377000056 ], [ -68.982533331999946, 19.028794664000088 ], [ -68.979359503999945, 19.032863674000055 ], [ -68.975412563999953, 19.033148505000042 ], [ -68.939564581999946, 19.031317450000074 ], [ -68.91860917899993, 19.027289130000042 ], [ -68.899810350999928, 19.020900783000059 ], [ -68.88312740799995, 19.012193101000037 ], [ -68.881214972999942, 19.009426174000055 ], [ -68.88117428299995, 19.005804755000042 ], [ -68.880360480999911, 19.002020575000074 ], [ -68.876291469999899, 18.998602606000077 ], [ -68.855824347999942, 18.991766669000071 ], [ -68.853993292999917, 18.992092190000051 ], [ -68.818226691999939, 18.984930731000077 ], [ -68.795887824999909, 18.984116929000038 ], [ -68.786854620999918, 18.981024481000077 ], [ -68.785145636999914, 18.979885158000059 ], [ -68.803830939246438, 18.956827704235138 ], [ -68.832408006124581, 18.935692044352322 ], [ -68.831736212556166, 18.92217865592022 ], [ -68.837446458787042, 18.911249090772912 ], [ -68.845172084823844, 18.869261990048813 ], [ -68.818041957870037, 18.82004018790434 ], [ -68.838712530658768, 18.763402818085581 ], [ -68.889898036665045, 18.7248005227259 ], [ -68.916588914946431, 18.720743922893689 ], [ -68.938861457290386, 18.708109036302972 ], [ -68.942866380279213, 18.686404933840606 ], [ -68.935295782973981, 18.665682685107811 ], [ -68.978988206940187, 18.649482123301311 ], [ -69.004180466655214, 18.603257554692391 ], [ -69.042524379596443, 18.55698130924003 ], [ -69.092702196149446, 18.527344876065172 ], [ -69.085312465997504, 18.553415635822944 ], [ -69.080170661446857, 18.576489162944483 ], [ -69.10952287468092, 18.579408881214874 ], [ -69.140942144564292, 18.575119737385933 ], [ -69.169390021132585, 18.595041002240464 ], [ -69.193677945081106, 18.6203882924857 ], [ -69.210007697197454, 18.624703273836985 ], [ -69.226750861363143, 18.623101305181081 ], [ -69.240470953571617, 18.631085312736957 ], [ -69.253570929954435, 18.64023204207507 ], [ -69.241530320767652, 18.677129015091964 ], [ -69.224192878298709, 18.715111191927974 ], [ -69.219826219204663, 18.757795925541529 ], [ -69.235277473076906, 18.797948512713674 ], [ -69.292638312408201, 18.854534207487688 ], [ -69.328553432594845, 18.924064846315616 ], [ -69.27199357804119, 18.933599148381973 ], [ -69.189543829983734, 18.915279853082723 ], [ -69.217061529665841, 18.962382920835125 ], [ -69.212333137164535, 19.017056585892703 ], [ -69.212281460321151, 19.017366645154539 ], [ -69.211742894119254, 19.020982731867548 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-30", "NAME_1": "Hato Mayor" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.620887150421652, 19.10196055233763 ], [ -69.608469204999949, 19.093451239000046 ], [ -69.553293423999946, 19.101467190000051 ], [ -69.534250454999949, 19.094794012000079 ], [ -69.510487433999913, 19.102036851000037 ], [ -69.463449673999946, 19.08470286700009 ], [ -69.438628709999932, 19.08734772300005 ], [ -69.444732225999928, 19.092352606000077 ], [ -69.452748175999943, 19.096909898000035 ], [ -69.462310350999928, 19.100287177000041 ], [ -69.473378058999913, 19.101629950000074 ], [ -69.473378058999913, 19.108465887000079 ], [ -69.419992641999897, 19.111151434000078 ], [ -69.404449022999927, 19.108465887000079 ], [ -69.386708136999914, 19.096096096000053 ], [ -69.372954881999931, 19.065375067000048 ], [ -69.356068488999938, 19.053208726000037 ], [ -69.338978644999941, 19.048895575000074 ], [ -69.304595506999931, 19.044867255000042 ], [ -69.211742894119254, 19.020982731867548 ], [ -69.212281460321151, 19.017366645154539 ], [ -69.212333137164535, 19.017056585892703 ], [ -69.217061529665841, 18.962382920835125 ], [ -69.189543829983734, 18.915279853082723 ], [ -69.27199357804119, 18.933599148381973 ], [ -69.328553432594845, 18.924064846315616 ], [ -69.292638312408201, 18.854534207487688 ], [ -69.235277473076906, 18.797948512713674 ], [ -69.219826219204663, 18.757795925541529 ], [ -69.224192878298709, 18.715111191927974 ], [ -69.241530320767652, 18.677129015091964 ], [ -69.253570929954435, 18.64023204207507 ], [ -69.287677375010844, 18.617571926103494 ], [ -69.303903775239007, 18.580235704414235 ], [ -69.325297818439537, 18.553777371028843 ], [ -69.353745694108511, 18.521970527517794 ], [ -69.368990240607104, 18.554733385437373 ], [ -69.382917040189227, 18.588116360081926 ], [ -69.405758023314092, 18.621111761998179 ], [ -69.428547328696254, 18.654107163914489 ], [ -69.43557532364224, 18.694828192766863 ], [ -69.441259732350773, 18.736272691131774 ], [ -69.459165615600682, 18.767924505911196 ], [ -69.459113938757241, 18.802573554226115 ], [ -69.441311408294837, 18.825879625344442 ], [ -69.420459968352873, 18.846550198133116 ], [ -69.399918585874047, 18.858616644842243 ], [ -69.380875821062261, 18.871122341123112 ], [ -69.399350145093138, 18.888769842853947 ], [ -69.435601162063961, 18.893265693157218 ], [ -69.484512905845918, 18.918742173712303 ], [ -69.534716559921264, 18.942358303193146 ], [ -69.591663988102539, 18.969720974143627 ], [ -69.637836879868075, 19.008891710284161 ], [ -69.624452684443838, 19.037468777162303 ], [ -69.618639086324777, 19.067932034435842 ], [ -69.621558803695848, 19.094571234974524 ], [ -69.620887150421652, 19.10196055233763 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-20", "NAME_1": "Samaná" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.771477950746828, 19.303253286010317 ], [ -69.767689581999946, 19.299750067000048 ], [ -69.733469204999949, 19.28656647300005 ], [ -69.71320553299995, 19.289740302000041 ], [ -69.674387173999946, 19.303859768000052 ], [ -69.654367641999897, 19.307033596000053 ], [ -69.609364386999914, 19.308783270000049 ], [ -69.589426235999952, 19.31281159100007 ], [ -69.568959113999938, 19.320705471000053 ], [ -69.539418097999942, 19.339422919000071 ], [ -69.52798417899993, 19.341782945000091 ], [ -69.517648891999897, 19.339667059000078 ], [ -69.496449347999942, 19.329779364000046 ], [ -69.483306443999936, 19.32758209800005 ], [ -69.459095831999946, 19.333319403000075 ], [ -69.448597785999937, 19.334377346000053 ], [ -69.442779100999928, 19.334173895000049 ], [ -69.437367316999939, 19.332953192000048 ], [ -69.433420376999948, 19.329901434000078 ], [ -69.431792772999927, 19.324123440000051 ], [ -69.428618943999936, 19.319240627000056 ], [ -69.421701626999948, 19.321112372000073 ], [ -69.410715298999946, 19.32758209800005 ], [ -69.352691209999932, 19.305121161000045 ], [ -69.335601365999935, 19.293402411000045 ], [ -69.324289516999897, 19.31509023600006 ], [ -69.305897589999915, 19.331122137000079 ], [ -69.260487433999913, 19.354885158000059 ], [ -69.231271938999953, 19.363348700000074 ], [ -69.224354620999918, 19.351792710000041 ], [ -69.232085740999935, 19.327948309000078 ], [ -69.246815558999913, 19.299627997000073 ], [ -69.22687740799995, 19.292669989000046 ], [ -69.204335089999915, 19.292792059000078 ], [ -69.182443813999953, 19.298163153000075 ], [ -69.16429602799991, 19.307033596000053 ], [ -69.158355272999927, 19.285101630000042 ], [ -69.171376105999911, 19.26788971600007 ], [ -69.189320441999939, 19.25226471600007 ], [ -69.198394334999932, 19.235052802000041 ], [ -69.202707485999952, 19.216945705000057 ], [ -69.214344855999911, 19.20062897300005 ], [ -69.231800910999937, 19.188666083000044 ], [ -69.253651495999918, 19.183539130000042 ], [ -69.332142706999946, 19.197211005000042 ], [ -69.418120897999927, 19.190985419000071 ], [ -69.438384568999936, 19.196478583000044 ], [ -69.475453253999945, 19.214016018000052 ], [ -69.602935350999928, 19.228989976000037 ], [ -69.617298956999946, 19.22524648600006 ], [ -69.622792120999918, 19.211859442000048 ], [ -69.626047329999949, 19.164292710000041 ], [ -69.633534308999913, 19.12368398600006 ], [ -69.630441860999952, 19.108465887000079 ], [ -69.620887150421652, 19.10196055233763 ], [ -69.621558803695848, 19.094571234974524 ], [ -69.618639086324777, 19.067932034435842 ], [ -69.624452684443838, 19.037468777162303 ], [ -69.637836879868075, 19.008891710284161 ], [ -69.666930711583063, 19.029458930285386 ], [ -69.698608364784207, 19.046537991235311 ], [ -69.727340461293238, 19.066872667239807 ], [ -69.755788336962155, 19.087594915972602 ], [ -69.736125453626755, 19.105397447334326 ], [ -69.732533941787949, 19.136687526907849 ], [ -69.719020555154486, 19.152655544717618 ], [ -69.703285082240768, 19.162603257933995 ], [ -69.676749233590272, 19.179423936465469 ], [ -69.676800910433656, 19.206476549053491 ], [ -69.737314012032016, 19.220119126896179 ], [ -69.786148241448188, 19.198053290127234 ], [ -69.792814501188275, 19.221591905242235 ], [ -69.786587491019873, 19.246344916284841 ], [ -69.77725989362915, 19.271382148167561 ], [ -69.773642544268, 19.298202215859533 ], [ -69.771477950746828, 19.303253286010317 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-14", "NAME_1": "María Trinidad Sánchez" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.094044021252884, 19.636723807569691 ], [ -70.061024542999917, 19.670111395000049 ], [ -70.042103644999941, 19.67845286700009 ], [ -69.986683722999942, 19.677639065000051 ], [ -69.959543423999946, 19.680121161000045 ], [ -69.947255011999914, 19.678656317000048 ], [ -69.932036912999934, 19.670152085000041 ], [ -69.897938605999911, 19.635972398000035 ], [ -69.887196417999917, 19.61273834800005 ], [ -69.887766079999949, 19.58734772300005 ], [ -69.904164191999939, 19.532375393000052 ], [ -69.884144660999937, 19.524400132000039 ], [ -69.876535610999952, 19.506659247000073 ], [ -69.876820441999939, 19.461004950000074 ], [ -69.874379035999937, 19.441148179000038 ], [ -69.867990688999953, 19.425279039000088 ], [ -69.801380988999938, 19.330877997000073 ], [ -69.771477950746828, 19.303253286010317 ], [ -69.773642544268, 19.298202215859533 ], [ -69.77725989362915, 19.271382148167561 ], [ -69.786587491019873, 19.246344916284841 ], [ -69.792814501188275, 19.221591905242235 ], [ -69.786148241448188, 19.198053290127234 ], [ -69.855420497857665, 19.210739854460712 ], [ -69.922599860095431, 19.240686346897348 ], [ -69.991277839100974, 19.257119451801259 ], [ -70.039931199565217, 19.296109320788503 ], [ -70.053547939885505, 19.319337877540988 ], [ -70.083933681893882, 19.3230327421673 ], [ -70.118686082996305, 19.347088121219826 ], [ -70.131062588067948, 19.389230252474135 ], [ -70.133956467916676, 19.423517563784515 ], [ -70.145738694685008, 19.455195216985658 ], [ -70.17966427258807, 19.477002672235528 ], [ -70.215140144102349, 19.497389024184088 ], [ -70.21209123372347, 19.52596609106223 ], [ -70.206174281917583, 19.551649278091702 ], [ -70.184831915560437, 19.552941189284468 ], [ -70.161474169397366, 19.551416734094971 ], [ -70.111993984834498, 19.578701891579044 ], [ -70.093416307116854, 19.630740058307026 ], [ -70.094044021252884, 19.636723807569691 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-09", "NAME_1": "Espaillat" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.372716378957705, 19.714184419675234 ], [ -70.33617102799991, 19.677639065000051 ], [ -70.319569464999915, 19.666449286000045 ], [ -70.301340298999946, 19.65766022300005 ], [ -70.280832485999952, 19.65180084800005 ], [ -70.235218878999945, 19.64720286700009 ], [ -70.198557094999899, 19.634670315000051 ], [ -70.131418423999946, 19.622137762000079 ], [ -70.116444464999915, 19.622381903000075 ], [ -70.106434699999909, 19.625921942000048 ], [ -70.097523566999939, 19.633205471000053 ], [ -70.094044021252884, 19.636723807569691 ], [ -70.093416307116854, 19.630740058307026 ], [ -70.111993984834498, 19.578701891579044 ], [ -70.161474169397366, 19.551416734094971 ], [ -70.184831915560437, 19.552941189284468 ], [ -70.206174281917583, 19.551649278091702 ], [ -70.21209123372347, 19.52596609106223 ], [ -70.215140144102349, 19.497389024184088 ], [ -70.225785489308862, 19.499326891422868 ], [ -70.236585863247001, 19.499197699314379 ], [ -70.259349331106762, 19.534441025932608 ], [ -70.288339810034188, 19.558573920250183 ], [ -70.318312140892601, 19.542218328812794 ], [ -70.338827684050386, 19.513899644353103 ], [ -70.362443814430492, 19.498706772899254 ], [ -70.374251878721225, 19.52539765118064 ], [ -70.390814174834304, 19.533045762851657 ], [ -70.408900926136823, 19.539453640173349 ], [ -70.442258063258976, 19.500308743353798 ], [ -70.441922167374116, 19.433620307531157 ], [ -70.445720383888613, 19.377344672018978 ], [ -70.467321132664154, 19.3188211127042 ], [ -70.495458949970555, 19.313601792888392 ], [ -70.515561082877639, 19.361505846317755 ], [ -70.536076626035424, 19.357320055276318 ], [ -70.558504198010326, 19.349000149137566 ], [ -70.590078498423964, 19.351945705829621 ], [ -70.61390133258044, 19.368843898726936 ], [ -70.599070197231811, 19.379360052724223 ], [ -70.583670620202952, 19.390548001189302 ], [ -70.583412237784557, 19.412613837058927 ], [ -70.586254441689107, 19.435325628974567 ], [ -70.580518357935887, 19.460311184013904 ], [ -70.566875780093142, 19.481705227214434 ], [ -70.551941291057744, 19.497595729759098 ], [ -70.547703824072187, 19.517827052976088 ], [ -70.525586309560538, 19.564439195212685 ], [ -70.517395596429594, 19.617433377248517 ], [ -70.509824999124419, 19.637302965259607 ], [ -70.494167039677109, 19.650687161583221 ], [ -70.481092901716011, 19.650609646318117 ], [ -70.468535528591758, 19.647664088726685 ], [ -70.450681322185233, 19.649912014327981 ], [ -70.43293046676763, 19.654407863731933 ], [ -70.415050421939384, 19.654278673422027 ], [ -70.39822974340791, 19.659239609920064 ], [ -70.383476122425122, 19.685878811358066 ], [ -70.372716378957705, 19.714184419675234 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-18", "NAME_1": "Puerto Plata" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.221774161131975, 19.834566661839293 ], [ -71.212066209999932, 19.837103583000044 ], [ -71.209339972999942, 19.844794012000079 ], [ -71.208811001999948, 19.854966539000088 ], [ -71.203521287999934, 19.865383205000057 ], [ -71.191761847999942, 19.869696356000077 ], [ -71.183338995999918, 19.860419012000079 ], [ -71.172230597999942, 19.834051825000074 ], [ -71.164418097999942, 19.83860911700009 ], [ -71.15851803299995, 19.843491929000038 ], [ -71.154408331999946, 19.849107164000088 ], [ -71.151722785999937, 19.855698960000041 ], [ -71.160227016999897, 19.858221747000073 ], [ -71.162017381999931, 19.859442450000074 ], [ -71.162180141999897, 19.86204661700009 ], [ -71.165394660999937, 19.868801174000055 ], [ -71.149728969999899, 19.863023179000038 ], [ -71.136586066999939, 19.863714911000045 ], [ -71.123199022999927, 19.866888739000046 ], [ -71.107045050999943, 19.868801174000055 ], [ -71.096791144999941, 19.876206773000035 ], [ -71.078277147999927, 19.909125067000048 ], [ -71.066070115999935, 19.916571356000077 ], [ -71.050852016999897, 19.92023346600007 ], [ -71.018422003999945, 19.935492255000042 ], [ -71.000884568999936, 19.937689520000049 ], [ -70.984730597999942, 19.933742580000057 ], [ -70.969349738999938, 19.925197658000059 ], [ -70.961048956999946, 19.912665106000077 ], [ -70.966175910999937, 19.896714585000041 ], [ -70.946888800999943, 19.88930898600006 ], [ -70.939442511999914, 19.88930898600006 ], [ -70.944447394999941, 19.904730536000045 ], [ -70.946888800999943, 19.910345770000049 ], [ -70.898508266999897, 19.902899481000077 ], [ -70.884266730999911, 19.904282945000091 ], [ -70.854725714999915, 19.910834052000041 ], [ -70.843251105999911, 19.910345770000049 ], [ -70.830962693999936, 19.902533270000049 ], [ -70.786976691999939, 19.852850653000075 ], [ -70.783314581999946, 19.843329169000071 ], [ -70.788644985999952, 19.834051825000074 ], [ -70.750965949999909, 19.833807684000078 ], [ -70.73656165299991, 19.827093817000048 ], [ -70.698475714999915, 19.796820380000042 ], [ -70.662220831999946, 19.779364325000074 ], [ -70.62368730399993, 19.766546942000048 ], [ -70.579090949999909, 19.760199286000045 ], [ -70.518706834999932, 19.759751695000091 ], [ -70.513661261999914, 19.762640692000048 ], [ -70.508534308999913, 19.769354559000078 ], [ -70.496449347999942, 19.777248440000051 ], [ -70.482777472999942, 19.783880927000041 ], [ -70.472727016999897, 19.786851304000038 ], [ -70.433705206999946, 19.775213934000078 ], [ -70.372716378957705, 19.714184419675234 ], [ -70.383476122425122, 19.685878811358066 ], [ -70.39822974340791, 19.659239609920064 ], [ -70.415050421939384, 19.654278673422027 ], [ -70.43293046676763, 19.654407863731933 ], [ -70.450681322185233, 19.649912014327981 ], [ -70.468535528591758, 19.647664088726685 ], [ -70.481092901716011, 19.650609646318117 ], [ -70.494167039677109, 19.650687161583221 ], [ -70.509824999124419, 19.637302965259607 ], [ -70.517395596429594, 19.617433377248517 ], [ -70.525586309560538, 19.564439195212685 ], [ -70.547703824072187, 19.517827052976088 ], [ -70.608604499298167, 19.536120509853617 ], [ -70.63798255095395, 19.58110484501259 ], [ -70.658756477429506, 19.628724676702461 ], [ -70.712138231294318, 19.651100571833922 ], [ -70.715755580655525, 19.592370306944076 ], [ -70.760455694974326, 19.590432441503935 ], [ -70.782702398896561, 19.609139309531486 ], [ -70.805233323658967, 19.627303575199846 ], [ -70.832957729815348, 19.634848334083358 ], [ -70.864118618179646, 19.641747137820118 ], [ -70.906234911012348, 19.64701813447931 ], [ -70.943907030385105, 19.66494985615094 ], [ -70.977651740235615, 19.690478014448786 ], [ -71.01821774035642, 19.702570299579634 ], [ -71.045244513623402, 19.709262396842121 ], [ -71.067491218444957, 19.72525625307361 ], [ -71.099814825893475, 19.740242418053128 ], [ -71.133972947793268, 19.751766262403066 ], [ -71.163919440229961, 19.763057562756273 ], [ -71.195054491071915, 19.771584174470036 ], [ -71.214975755027069, 19.800626329341583 ], [ -71.221774161131975, 19.834566661839293 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-04", "NAME_1": "Barahona" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.96561521108714, 18.262083186130727 ], [ -70.965809699999909, 18.262152411000045 ], [ -70.972035285999937, 18.27024974200009 ], [ -70.977284308999913, 18.280259507000039 ], [ -70.983794725999928, 18.289129950000074 ], [ -70.994252081999946, 18.296616929000038 ], [ -71.004872199999909, 18.301011460000041 ], [ -71.048247850999928, 18.31000397300005 ], [ -71.068348761999914, 18.310370184000078 ], [ -71.083973761999914, 18.304388739000046 ], [ -71.090240037999934, 18.289129950000074 ], [ -71.092355923999946, 18.28070709800005 ], [ -71.101226365999935, 18.266099351000037 ], [ -71.103342251999948, 18.254950262000079 ], [ -71.101429816999939, 18.242132880000042 ], [ -71.096547003999945, 18.23509349200009 ], [ -71.089914516999897, 18.228705145000049 ], [ -71.082834438999953, 18.217718817000048 ], [ -71.066517706999946, 18.163316148000092 ], [ -71.061268683999913, 18.153998114000046 ], [ -71.061105923999946, 18.142075914000088 ], [ -71.080555792999917, 18.11391836100006 ], [ -71.097157355999911, 18.073716539000088 ], [ -71.191802537999934, 17.941799221000053 ], [ -71.200103318999936, 17.919175523000092 ], [ -71.204253709999932, 17.911118882000039 ], [ -71.213734503999945, 17.904852606000077 ], [ -71.233631964999915, 17.894964911000045 ], [ -71.245920376999948, 17.88507721600007 ], [ -71.254709438999953, 17.87531159100007 ], [ -71.261545376999948, 17.863226630000042 ], [ -71.26781165299991, 17.846584377000056 ], [ -71.275217251999948, 17.84906647300005 ], [ -71.278065558999913, 17.850775458000044 ], [ -71.281017156045905, 17.853130772829296 ], [ -71.281044074124736, 17.853225816418274 ], [ -71.281741706114815, 17.855732123538644 ], [ -71.281715867693151, 17.894566961995679 ], [ -71.2976838846036, 17.929526069572432 ], [ -71.327656216361277, 17.930895494231663 ], [ -71.352925991341408, 17.925081895213282 ], [ -71.402225307851666, 17.963865057726196 ], [ -71.423748542261421, 18.014998887788408 ], [ -71.416849737625284, 18.023861396286406 ], [ -71.406411098893102, 18.027427069703492 ], [ -71.396385871310883, 18.031251126438292 ], [ -71.390908169076738, 18.041948146689606 ], [ -71.388970302737278, 18.05993154520462 ], [ -71.389900478724087, 18.078225002981469 ], [ -71.391166550595813, 18.118971869356244 ], [ -71.42193986713113, 18.135947577518664 ], [ -71.417573208037084, 18.162974350785646 ], [ -71.399305588681955, 18.181603705346731 ], [ -71.373984137757759, 18.17501495997243 ], [ -71.351013963423668, 18.177960517563804 ], [ -71.366646084449201, 18.232815049774729 ], [ -71.381373867010325, 18.290124213161903 ], [ -71.337061327218464, 18.299167588813134 ], [ -71.286625129146387, 18.282837835797466 ], [ -71.233915167950613, 18.296325384908585 ], [ -71.200764737302791, 18.338364163375445 ], [ -71.197793342188959, 18.370791124510788 ], [ -71.18027503076803, 18.397068589843514 ], [ -71.163531866602341, 18.407093818325052 ], [ -71.147357144116881, 18.41766164826646 ], [ -71.13598832939789, 18.434172268435418 ], [ -71.119891120378895, 18.446652127193886 ], [ -71.089221158429723, 18.457297472400398 ], [ -71.063408780191025, 18.475306708437813 ], [ -71.047776659165493, 18.499878852327186 ], [ -71.034418301263599, 18.525872096819796 ], [ -71.014755418827519, 18.5020234242416 ], [ -71.004626837558476, 18.485771186491036 ], [ -71.001474575291411, 18.453886826815562 ], [ -71.02165422166496, 18.428875434253882 ], [ -71.052350022935173, 18.403786526427041 ], [ -71.047363247116152, 18.392288520498823 ], [ -71.042712368081311, 18.380661322462061 ], [ -71.033229742858339, 18.373865872412068 ], [ -71.020749884999191, 18.369318346164732 ], [ -70.988477952595417, 18.360688380764145 ], [ -70.959384120880486, 18.354047960345099 ], [ -70.96173539926923, 18.339552720881329 ], [ -70.958324754583771, 18.318287868890025 ], [ -70.950702481334417, 18.286067613329692 ], [ -70.96561521108714, 18.262083186130727 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-02", "NAME_1": "Azua" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.579381748901312, 18.271769273180571 ], [ -70.59243730399993, 18.279852606000077 ], [ -70.596791144999941, 18.289129950000074 ], [ -70.594349738999938, 18.299058335000041 ], [ -70.588449673999946, 18.303615627000056 ], [ -70.581654425999943, 18.307074286000045 ], [ -70.57640540299991, 18.313950914000088 ], [ -70.571766730999911, 18.334051825000074 ], [ -70.571156378999945, 18.355169989000046 ], [ -70.573882615999935, 18.37368398600006 ], [ -70.579457160999937, 18.385646877000056 ], [ -70.601429816999939, 18.411851304000038 ], [ -70.614654100999928, 18.420843817000048 ], [ -70.637806769999941, 18.429388739000046 ], [ -70.657541469999899, 18.433783270000049 ], [ -70.682484503999945, 18.435614325000074 ], [ -70.703846808999913, 18.430121161000045 ], [ -70.712880011999914, 18.412665106000077 ], [ -70.709462042999917, 18.391750393000052 ], [ -70.711984829999949, 18.383368231000077 ], [ -70.741688605999911, 18.355414130000042 ], [ -70.749867316999939, 18.350409247000073 ], [ -70.760650193999936, 18.347479559000078 ], [ -70.772328253999945, 18.347886460000041 ], [ -70.793120897999927, 18.354071356000077 ], [ -70.802316860999952, 18.35492584800005 ], [ -70.810047980999911, 18.352036851000037 ], [ -70.823963995999918, 18.342678127000056 ], [ -70.833322719999899, 18.340643622000073 ], [ -70.84601803299995, 18.342189846000053 ], [ -70.850453253999945, 18.339585679000038 ], [ -70.860340949999909, 18.33071523600006 ], [ -70.863107876999948, 18.326971747000073 ], [ -70.86937415299991, 18.314601955000057 ], [ -70.870594855999911, 18.310248114000046 ], [ -70.87328040299991, 18.306301174000055 ], [ -70.886708136999914, 18.302069403000075 ], [ -70.891672329999949, 18.299709377000056 ], [ -70.91828365799995, 18.269598700000074 ], [ -70.932484503999945, 18.261542059000078 ], [ -70.956206834999932, 18.258734442000048 ], [ -70.96561521108714, 18.262083186130727 ], [ -70.950702481334417, 18.286067613329692 ], [ -70.958324754583771, 18.318287868890025 ], [ -70.96173539926923, 18.339552720881329 ], [ -70.959384120880486, 18.354047960345099 ], [ -70.988477952595417, 18.360688380764145 ], [ -71.020749884999191, 18.369318346164732 ], [ -71.033229742858339, 18.373865872412068 ], [ -71.042712368081311, 18.380661322462061 ], [ -71.047363247116152, 18.392288520498823 ], [ -71.052350022935173, 18.403786526427041 ], [ -71.02165422166496, 18.428875434253882 ], [ -71.001474575291411, 18.453886826815562 ], [ -71.004626837558476, 18.485771186491036 ], [ -71.014755418827519, 18.5020234242416 ], [ -70.993619758045384, 18.509619859069232 ], [ -70.993283861261204, 18.527344876065172 ], [ -71.019871384956446, 18.544268907384151 ], [ -71.051394009425962, 18.549720771196633 ], [ -71.113819138942119, 18.570287991197802 ], [ -71.161309781221405, 18.615918281503468 ], [ -71.117384813258525, 18.627132065692251 ], [ -71.091055671082358, 18.664364936392701 ], [ -71.07470007964497, 18.670281887299268 ], [ -71.05581234356481, 18.678756822169589 ], [ -71.058086106688449, 18.691624254555677 ], [ -71.064726528906192, 18.702553818803665 ], [ -71.054287889274633, 18.716093044758168 ], [ -71.053099330869429, 18.728779609091646 ], [ -71.05942969382528, 18.766425890042797 ], [ -71.026899379902432, 18.776115220840779 ], [ -71.018476121875494, 18.758829454315844 ], [ -71.003929205568397, 18.753145046506688 ], [ -70.990260790203308, 18.765624905265156 ], [ -70.982457648002026, 18.78262645094992 ], [ -70.981940884064556, 18.834122016218032 ], [ -70.975274624324413, 18.883679714247421 ], [ -70.963130663249501, 18.908742784551862 ], [ -70.938584356882529, 18.92504669824649 ], [ -70.924502530367477, 18.937836615367473 ], [ -70.92049760558001, 18.957215277862758 ], [ -70.899568651272205, 18.967033799869967 ], [ -70.891197069189388, 18.988453681492217 ], [ -70.838693813568625, 18.954476426745657 ], [ -70.827428351637082, 18.862285671046891 ], [ -70.784795294866967, 18.807327786048461 ], [ -70.723765428431761, 18.777794704761789 ], [ -70.685834926640553, 18.734024767329117 ], [ -70.699994269320086, 18.676844794251849 ], [ -70.671262172810998, 18.622972113971855 ], [ -70.650333217603873, 18.572355047847168 ], [ -70.635553758199364, 18.563750921767621 ], [ -70.627983160894132, 18.548893947997271 ], [ -70.610619880003469, 18.533003445452607 ], [ -70.587417161672647, 18.525174464829661 ], [ -70.554137538916279, 18.504452216096865 ], [ -70.521865607411826, 18.488742580705491 ], [ -70.501091681835646, 18.454739488436644 ], [ -70.479077521010765, 18.413217474806629 ], [ -70.472462938114063, 18.394820665141594 ], [ -70.482178107333766, 18.376501369842345 ], [ -70.489981248635729, 18.349577948463548 ], [ -70.487397427149517, 18.321155911216294 ], [ -70.523700120963781, 18.28193349913164 ], [ -70.579381748901312, 18.271769273180571 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-17", "NAME_1": "Peravia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.180387699080853, 18.234131163402001 ], [ -70.202137824999909, 18.233547268000052 ], [ -70.220773891999897, 18.230536200000074 ], [ -70.233143683999913, 18.223944403000075 ], [ -70.250803188999953, 18.234320380000042 ], [ -70.269602016999897, 18.238104559000078 ], [ -70.397572394999941, 18.237616278000075 ], [ -70.419056769999941, 18.231146552000041 ], [ -70.460194464999915, 18.208929755000042 ], [ -70.483550584999932, 18.204087632000039 ], [ -70.552845831999946, 18.204250393000052 ], [ -70.568918423999946, 18.210353908000059 ], [ -70.570301886999914, 18.218939520000049 ], [ -70.563059048999946, 18.225653387000079 ], [ -70.553700324999909, 18.231512762000079 ], [ -70.54906165299991, 18.237616278000075 ], [ -70.551909959999932, 18.248439846000053 ], [ -70.558705206999946, 18.254380601000037 ], [ -70.565744594999899, 18.258205471000053 ], [ -70.573312954999949, 18.268011786000045 ], [ -70.579381748901312, 18.271769273180571 ], [ -70.523700120963781, 18.28193349913164 ], [ -70.487397427149517, 18.321155911216294 ], [ -70.489981248635729, 18.349577948463548 ], [ -70.482178107333766, 18.376501369842345 ], [ -70.472462938114063, 18.394820665141594 ], [ -70.479077521010765, 18.413217474806629 ], [ -70.452050746844463, 18.451251329385343 ], [ -70.403139003961826, 18.464919744750432 ], [ -70.378050096135041, 18.48143036491939 ], [ -70.356552700147006, 18.50357371695344 ], [ -70.308209398045278, 18.483574936833861 ], [ -70.268728604441549, 18.447220567075476 ], [ -70.236973435975301, 18.433009548451878 ], [ -70.238885463893041, 18.408902493455287 ], [ -70.264775357396843, 18.394691473932369 ], [ -70.269736293894823, 18.368801581327887 ], [ -70.251313645808068, 18.346503201461587 ], [ -70.231263189744425, 18.323972275799861 ], [ -70.224209357275981, 18.311208197100598 ], [ -70.21671627523591, 18.298676663297385 ], [ -70.203642137274812, 18.286481025378976 ], [ -70.190826381732109, 18.275939032060649 ], [ -70.186588914746608, 18.253433945720019 ], [ -70.180387699080853, 18.234131163402001 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-21", "NAME_1": "San Cristóbal" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.004017706999946, 18.417466539000088 ], [ -70.016590949999909, 18.411363023000092 ], [ -70.038929816999939, 18.392482815000051 ], [ -70.055775519999941, 18.367254950000074 ], [ -70.062408006999931, 18.337225653000075 ], [ -70.067697719999899, 18.329087632000039 ], [ -70.090687628999945, 18.317531643000052 ], [ -70.09593665299991, 18.310248114000046 ], [ -70.100005662999934, 18.299221096000053 ], [ -70.133778449999909, 18.269273179000038 ], [ -70.158070441999939, 18.242621161000045 ], [ -70.171783006999931, 18.231431382000039 ], [ -70.177886522999927, 18.234198309000078 ], [ -70.180387699080853, 18.234131163402001 ], [ -70.186588914746608, 18.253433945720019 ], [ -70.190826381732109, 18.275939032060649 ], [ -70.203642137274812, 18.286481025378976 ], [ -70.21671627523591, 18.298676663297385 ], [ -70.224209357275981, 18.311208197100598 ], [ -70.231263189744425, 18.323972275799861 ], [ -70.251313645808068, 18.346503201461587 ], [ -70.269736293894823, 18.368801581327887 ], [ -70.264775357396843, 18.394691473932369 ], [ -70.238885463893041, 18.408902493455287 ], [ -70.236973435975301, 18.433009548451878 ], [ -70.268728604441549, 18.447220567075476 ], [ -70.308209398045278, 18.483574936833861 ], [ -70.356552700147006, 18.50357371695344 ], [ -70.371564704447565, 18.533287665393402 ], [ -70.378799404968561, 18.565714627428122 ], [ -70.367895677343597, 18.601035468412135 ], [ -70.372184821172539, 18.636330470974428 ], [ -70.368748338065359, 18.679506130103789 ], [ -70.350015631616088, 18.720149643691116 ], [ -70.31306698265513, 18.719529526966085 ], [ -70.29955359602161, 18.75761505838824 ], [ -70.285394253342133, 18.786088772478877 ], [ -70.251184454598899, 18.80172089350441 ], [ -70.23464799690754, 18.78172211428415 ], [ -70.217233039173379, 18.762498481419755 ], [ -70.191317308147234, 18.748700873046857 ], [ -70.167184413829602, 18.731673488940373 ], [ -70.166383429951338, 18.686921697778132 ], [ -70.139304978941595, 18.645348009103316 ], [ -70.148012457808647, 18.623101305181081 ], [ -70.152844203996779, 18.598554998814109 ], [ -70.142121345323801, 18.56315664346431 ], [ -70.123647020393662, 18.531246446266493 ], [ -70.099074877403666, 18.513857326954053 ], [ -70.080497198786702, 18.492308254122634 ], [ -70.077810025412305, 18.475125841284523 ], [ -70.066312018584767, 18.463369452038592 ], [ -70.043703578557313, 18.464041246506326 ], [ -70.021224330638347, 18.463240260829366 ], [ -70.008537767204189, 18.445386054422841 ], [ -70.007710944004828, 18.423759467225636 ], [ -70.004017706999946, 18.417466539000088 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-32", "NAME_1": "Santo Domingo" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.980918008185284, 18.426464324006311 ], [ -69.993519660999937, 18.422552802000041 ], [ -70.004017706999946, 18.417466539000088 ], [ -70.007710944004828, 18.423759467225636 ], [ -70.008537767204189, 18.445386054422841 ], [ -70.021224330638347, 18.463240260829366 ], [ -70.043703578557313, 18.464041246506326 ], [ -70.066312018584767, 18.463369452038592 ], [ -70.077810025412305, 18.475125841284523 ], [ -70.080497198786702, 18.492308254122634 ], [ -70.099074877403666, 18.513857326954053 ], [ -70.123647020393662, 18.531246446266493 ], [ -70.142121345323801, 18.56315664346431 ], [ -70.152844203996779, 18.598554998814109 ], [ -70.148012457808647, 18.623101305181081 ], [ -70.139304978941595, 18.645348009103316 ], [ -70.166383429951338, 18.686921697778132 ], [ -70.167184413829602, 18.731673488940373 ], [ -70.1390207590008, 18.722035834086455 ], [ -70.120701462802231, 18.690694078568868 ], [ -70.088842943347174, 18.679480292581445 ], [ -70.056054247005875, 18.671031196132787 ], [ -70.008770311200863, 18.66222036447823 ], [ -69.966343960005759, 18.68092723250578 ], [ -69.963682624153762, 18.690125636888638 ], [ -69.959083421063042, 18.69903982223002 ], [ -69.947301195193972, 18.702838040543099 ], [ -69.934640469282215, 18.70340648042469 ], [ -69.91143775095145, 18.7024763053372 ], [ -69.888260871042348, 18.70133942287606 ], [ -69.861156581610942, 18.68108226213667 ], [ -69.838470629016285, 18.656690986299964 ], [ -69.824621344699267, 18.63927602856586 ], [ -69.818988613733552, 18.61943227807717 ], [ -69.797982144160585, 18.600105292425269 ], [ -69.789972297283668, 18.571838283909642 ], [ -69.743851080562933, 18.617726955734383 ], [ -69.685740933297438, 18.638242498892168 ], [ -69.663933478047568, 18.642660833930336 ], [ -69.645097418810792, 18.654288031067779 ], [ -69.611120164963609, 18.6612385125473 ], [ -69.575334235086871, 18.648216051429586 ], [ -69.587814093845338, 18.635167751890208 ], [ -69.593550177598615, 18.619794013283069 ], [ -69.587917446632844, 18.619354762812065 ], [ -69.582543098085523, 18.621628525935705 ], [ -69.578047247782251, 18.596591294952304 ], [ -69.579907599755927, 18.571528225547183 ], [ -69.600474819757096, 18.546180935301891 ], [ -69.616572027876771, 18.51998098433495 ], [ -69.576962043063816, 18.479750880998324 ], [ -69.518257615696371, 18.468537095910222 ], [ -69.524665493018063, 18.436601060290684 ], [ -69.528110123960076, 18.410312170145868 ], [ -69.579986131999931, 18.444484768000052 ], [ -69.602121548999946, 18.45571523600006 ], [ -69.616810675999943, 18.45734284100007 ], [ -69.623158331999946, 18.44798411700009 ], [ -69.622629360999952, 18.436753648000092 ], [ -69.620838995999918, 18.425482489000046 ], [ -69.623605923999946, 18.41632721600007 ], [ -69.632557745999918, 18.41351959800005 ], [ -69.646595831999946, 18.413560289000088 ], [ -69.659494594999899, 18.415920315000051 ], [ -69.665150519999941, 18.419501044000071 ], [ -69.68195553299995, 18.446763414000088 ], [ -69.689930792999917, 18.454087632000039 ], [ -69.697377081999946, 18.456366278000075 ], [ -69.851470506999931, 18.472479559000078 ], [ -69.879383917999917, 18.471218166000085 ], [ -69.877822232310166, 18.500964057045564 ], [ -69.905727504720574, 18.504968980034391 ], [ -69.924486049591508, 18.500085557902139 ], [ -69.943502976880893, 18.501816717767269 ], [ -69.955801967586751, 18.520239365854025 ], [ -69.967997606404424, 18.53674998602304 ], [ -69.994765998152275, 18.52243561371256 ], [ -69.997401495582551, 18.493884386155457 ], [ -69.975180630081979, 18.462620144104335 ], [ -69.980918008185284, 18.426464324006311 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-01", "NAME_1": "Distrito Nacional" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.879383917999917, 18.471218166000085 ], [ -69.883656378999945, 18.47101471600007 ], [ -69.899810350999928, 18.466457424000055 ], [ -69.931223110999952, 18.451971747000073 ], [ -69.957102016999897, 18.435288804000038 ], [ -69.966908331999946, 18.430812893000052 ], [ -69.980918008185284, 18.426464324006311 ], [ -69.975180630081979, 18.462620144104335 ], [ -69.997401495582551, 18.493884386155457 ], [ -69.994765998152275, 18.52243561371256 ], [ -69.967997606404424, 18.53674998602304 ], [ -69.955801967586751, 18.520239365854025 ], [ -69.943502976880893, 18.501816717767269 ], [ -69.924486049591508, 18.500085557902139 ], [ -69.905727504720574, 18.504968980034391 ], [ -69.877822232310166, 18.500964057045564 ], [ -69.879383917999917, 18.471218166000085 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-23", "NAME_1": "San Pedro de Macorís" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -69.085438605999911, 18.395900783000059 ], [ -69.104359503999945, 18.399115302000041 ], [ -69.148182745999918, 18.413234768000052 ], [ -69.168039516999897, 18.41632721600007 ], [ -69.185292120999918, 18.421698309000078 ], [ -69.214222785999937, 18.445135809000078 ], [ -69.236317511999914, 18.450506903000075 ], [ -69.255604620999918, 18.446682033000059 ], [ -69.275217251999948, 18.440334377000056 ], [ -69.295033331999946, 18.439032294000071 ], [ -69.31509355399993, 18.450506903000075 ], [ -69.336008266999897, 18.432074286000045 ], [ -69.465931769999941, 18.422552802000041 ], [ -69.504750128999945, 18.40892161700009 ], [ -69.525257941999939, 18.408433335000041 ], [ -69.528110123960076, 18.410312170145868 ], [ -69.524665493018063, 18.436601060290684 ], [ -69.518257615696371, 18.468537095910222 ], [ -69.576962043063816, 18.479750880998324 ], [ -69.616572027876771, 18.51998098433495 ], [ -69.600474819757096, 18.546180935301891 ], [ -69.579907599755927, 18.571528225547183 ], [ -69.578047247782251, 18.596591294952304 ], [ -69.582543098085523, 18.621628525935705 ], [ -69.587917446632844, 18.619354762812065 ], [ -69.593550177598615, 18.619794013283069 ], [ -69.587814093845338, 18.635167751890208 ], [ -69.575334235086871, 18.648216051429586 ], [ -69.518309291640492, 18.743429877286985 ], [ -69.459113938757241, 18.802573554226115 ], [ -69.459165615600682, 18.767924505911196 ], [ -69.441259732350773, 18.736272691131774 ], [ -69.43557532364224, 18.694828192766863 ], [ -69.428547328696254, 18.654107163914489 ], [ -69.405758023314092, 18.621111761998179 ], [ -69.382917040189227, 18.588116360081926 ], [ -69.368990240607104, 18.554733385437373 ], [ -69.353745694108511, 18.521970527517794 ], [ -69.325297818439537, 18.553777371028843 ], [ -69.303903775239007, 18.580235704414235 ], [ -69.287677375010844, 18.617571926103494 ], [ -69.253570929954435, 18.64023204207507 ], [ -69.240470953571617, 18.631085312736957 ], [ -69.226750861363143, 18.623101305181081 ], [ -69.210007697197454, 18.624703273836985 ], [ -69.193677945081106, 18.6203882924857 ], [ -69.169390021132585, 18.595041002240464 ], [ -69.140942144564292, 18.575119737385933 ], [ -69.10952287468092, 18.579408881214874 ], [ -69.080170661446857, 18.576489162944483 ], [ -69.085312465997504, 18.553415635822944 ], [ -69.092702196149446, 18.527344876065172 ], [ -69.108747728325, 18.502126777029105 ], [ -69.121770189442657, 18.475616766800329 ], [ -69.115000576015746, 18.462387600107661 ], [ -69.103011643672403, 18.452646593365557 ], [ -69.090557624234975, 18.423811143169701 ], [ -69.085438605999911, 18.395900783000059 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-12", "NAME_1": "La Romana" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -68.901149176876245, 18.403656131063737 ], [ -68.92251542899993, 18.412298895000049 ], [ -68.964344855999911, 18.417954820000091 ], [ -69.012562628999945, 18.399115302000041 ], [ -69.085438605999911, 18.395900783000059 ], [ -69.090557624234975, 18.423811143169701 ], [ -69.103011643672403, 18.452646593365557 ], [ -69.115000576015746, 18.462387600107661 ], [ -69.121770189442657, 18.475616766800329 ], [ -69.108747728325, 18.502126777029105 ], [ -69.092702196149446, 18.527344876065172 ], [ -69.042524379596443, 18.55698130924003 ], [ -69.004180466655214, 18.603257554692391 ], [ -68.978988206940187, 18.649482123301311 ], [ -68.935295782973981, 18.665682685107811 ], [ -68.918707648439238, 18.629741726499446 ], [ -68.899328985943953, 18.596436266220678 ], [ -68.874136726228926, 18.574732163758313 ], [ -68.853104418234295, 18.549824123984138 ], [ -68.85201921261654, 18.51863739719812 ], [ -68.865584276093443, 18.489724433535741 ], [ -68.883283453768342, 18.444275011282741 ], [ -68.901149176876245, 18.403656131063737 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-27", "NAME_1": "Valverde" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.148390671991933, 19.626295884847195 ], [ -71.150819464746462, 19.659420477972674 ], [ -71.153687507072789, 19.692493394254711 ], [ -71.145031704149801, 19.722465725113125 ], [ -71.133972947793268, 19.751766262403066 ], [ -71.099814825893475, 19.740242418053128 ], [ -71.067491218444957, 19.72525625307361 ], [ -71.045244513623402, 19.709262396842121 ], [ -71.01821774035642, 19.702570299579634 ], [ -70.977651740235615, 19.690478014448786 ], [ -70.943907030385105, 19.66494985615094 ], [ -70.906234911012348, 19.64701813447931 ], [ -70.864118618179646, 19.641747137820118 ], [ -70.870655686710563, 19.60826081038806 ], [ -70.885202603017717, 19.577771714692858 ], [ -70.910808274782028, 19.574593614004073 ], [ -70.935638801089794, 19.591207586960536 ], [ -70.933855964381223, 19.571105454952772 ], [ -70.925846116604987, 19.553122057337077 ], [ -70.911376715562938, 19.546507473541055 ], [ -70.896519740893325, 19.537825833095724 ], [ -70.897449916880134, 19.510333970936017 ], [ -70.904400396561016, 19.481550198482864 ], [ -70.881585252757191, 19.46527212231058 ], [ -70.885564338223617, 19.447547105314641 ], [ -70.929540982130618, 19.447288722896246 ], [ -70.970804613342239, 19.464083563905319 ], [ -70.979718796884981, 19.453438218698807 ], [ -70.989175584585553, 19.440467434424534 ], [ -71.003619147205882, 19.438658759294299 ], [ -71.018269416300484, 19.441811021561364 ], [ -71.047363247116152, 19.453438218698807 ], [ -71.075165167638374, 19.468062649371745 ], [ -71.148804084041217, 19.480594184074334 ], [ -71.184202440290392, 19.536508084380557 ], [ -71.172781948727959, 19.570872910956041 ], [ -71.17895728205292, 19.60730479597953 ], [ -71.172678595940454, 19.628621323914956 ], [ -71.148390671991933, 19.626295884847195 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-26", "NAME_1": "Santiago Rodríguez" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.3997965159964, 19.560537625011364 ], [ -71.382588263837306, 19.548367825514731 ], [ -71.352202520929609, 19.537644965043114 ], [ -71.319749722271865, 19.54025462495099 ], [ -71.300293545410796, 19.549711411752241 ], [ -71.278951179053649, 19.552321072559437 ], [ -71.247764452267631, 19.535009466713518 ], [ -71.216319343063219, 19.532218940551672 ], [ -71.201514045236991, 19.542063300081224 ], [ -71.184202440290392, 19.536508084380557 ], [ -71.148804084041217, 19.480594184074334 ], [ -71.075165167638374, 19.468062649371745 ], [ -71.088342658386978, 19.451009425944221 ], [ -71.090487230301449, 19.431191514776572 ], [ -71.077283902030445, 19.422329006278574 ], [ -71.068705614372618, 19.412458808327301 ], [ -71.107023687992807, 19.400185655143844 ], [ -71.143197190597846, 19.383855903027495 ], [ -71.162084926678006, 19.382899889518285 ], [ -71.180895148392381, 19.384760239693264 ], [ -71.196294725421239, 19.375070908895339 ], [ -71.208619553649442, 19.361505846317755 ], [ -71.226861334582907, 19.347165636484931 ], [ -71.240891486053215, 19.328975531495587 ], [ -71.244224616372946, 19.298718979797059 ], [ -71.247040981855832, 19.267893989116317 ], [ -71.243475308438747, 19.246861681121686 ], [ -71.226938849848011, 19.232030544873737 ], [ -71.225543585867797, 19.201593126021919 ], [ -71.230840420049333, 19.170173855239227 ], [ -71.284092983604296, 19.170690619176696 ], [ -71.327371996420482, 19.191076972024632 ], [ -71.371271125062378, 19.213272000002803 ], [ -71.415893724116074, 19.234485175150724 ], [ -71.446822069382961, 19.273604234447873 ], [ -71.488266567747871, 19.298848171006284 ], [ -71.505138923122786, 19.316418158371278 ], [ -71.515060797917499, 19.338018907146818 ], [ -71.466174892557206, 19.358637803991428 ], [ -71.454082608325677, 19.422199815069405 ], [ -71.446460334177061, 19.443232123064035 ], [ -71.448656582035596, 19.46581472377045 ], [ -71.436331752908075, 19.508086046234041 ], [ -71.413051520211468, 19.544543768779874 ], [ -71.3997965159964, 19.560537625011364 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-13", "NAME_1": "La Vega" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.61390133258044, 19.368843898726936 ], [ -70.590078498423964, 19.351945705829621 ], [ -70.558504198010326, 19.349000149137566 ], [ -70.536076626035424, 19.357320055276318 ], [ -70.515561082877639, 19.361505846317755 ], [ -70.495458949970555, 19.313601792888392 ], [ -70.467321132664154, 19.3188211127042 ], [ -70.452515834837868, 19.284973049166865 ], [ -70.432465379673545, 19.253295395965722 ], [ -70.404508430419696, 19.227612209835627 ], [ -70.363632371936376, 19.22492503556191 ], [ -70.331257086745154, 19.177589422913513 ], [ -70.281441006297371, 19.146428534549216 ], [ -70.279554815902031, 19.143741360275556 ], [ -70.277642787984291, 19.141080024423559 ], [ -70.299863654384126, 19.133251043800612 ], [ -70.324358283008337, 19.121184597091485 ], [ -70.364123298351501, 19.103304552263239 ], [ -70.392312791602023, 19.072324531052232 ], [ -70.399780036119751, 19.098266100500098 ], [ -70.423732062384772, 19.111727810290176 ], [ -70.443420783242516, 19.10508738897181 ], [ -70.454195318758934, 19.086483872832446 ], [ -70.501840989769846, 19.074210720548308 ], [ -70.522640753767746, 19.037365424374798 ], [ -70.523519252911171, 18.969049181474531 ], [ -70.583334724318036, 18.922462876760335 ], [ -70.592378099070004, 18.853242296294923 ], [ -70.533673671702559, 18.787949124452496 ], [ -70.548013882434702, 18.743559068496211 ], [ -70.574058803770754, 18.712036444925957 ], [ -70.595142787709449, 18.693587958417538 ], [ -70.610464851271843, 18.677361559088638 ], [ -70.654699876697919, 18.677904161447884 ], [ -70.699994269320086, 18.676844794251849 ], [ -70.685834926640553, 18.734024767329117 ], [ -70.723765428431761, 18.777794704761789 ], [ -70.784795294866967, 18.807327786048461 ], [ -70.827428351637082, 18.862285671046891 ], [ -70.838693813568625, 18.954476426745657 ], [ -70.891197069189388, 18.988453681492217 ], [ -70.89967200405971, 19.009925239058532 ], [ -70.916208461751125, 19.025919094390702 ], [ -70.911815965134679, 19.048139959891216 ], [ -70.919179856864901, 19.069404811882521 ], [ -70.890034349205848, 19.08307322814693 ], [ -70.857142300077101, 19.096612454101432 ], [ -70.794898036814914, 19.125137844136191 ], [ -70.742472297358631, 19.162809963509005 ], [ -70.730302496962679, 19.189707546466082 ], [ -70.708779262552923, 19.190844428027901 ], [ -70.682527634742542, 19.18598684341805 ], [ -70.685473192333973, 19.214770615871203 ], [ -70.67826433023464, 19.248799547461147 ], [ -70.694025641570079, 19.274999498428087 ], [ -70.724592250731746, 19.283035182827405 ], [ -70.748776821892818, 19.300579331770734 ], [ -70.74164547415927, 19.32093984619695 ], [ -70.716892463116665, 19.327502753149531 ], [ -70.666662970619598, 19.352591660976373 ], [ -70.61390133258044, 19.368843898726936 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-19", "NAME_1": "Hermanas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.288339810034188, 19.558573920250183 ], [ -70.259349331106762, 19.534441025932608 ], [ -70.236585863247001, 19.499197699314379 ], [ -70.242502814153511, 19.473721217859918 ], [ -70.250564337873868, 19.441681830352195 ], [ -70.279038051964505, 19.418763332861488 ], [ -70.321076830431366, 19.399436347209644 ], [ -70.340558844814836, 19.357216702488813 ], [ -70.348723721322642, 19.310397853777886 ], [ -70.362728034371287, 19.267480577066976 ], [ -70.363632371936376, 19.22492503556191 ], [ -70.404508430419696, 19.227612209835627 ], [ -70.432465379673545, 19.253295395965722 ], [ -70.452515834837868, 19.284973049166865 ], [ -70.467321132664154, 19.3188211127042 ], [ -70.445720383888613, 19.377344672018978 ], [ -70.441922167374116, 19.433620307531157 ], [ -70.442258063258976, 19.500308743353798 ], [ -70.408900926136823, 19.539453640173349 ], [ -70.390814174834304, 19.533045762851657 ], [ -70.374251878721225, 19.52539765118064 ], [ -70.362443814430492, 19.498706772899254 ], [ -70.338827684050386, 19.513899644353103 ], [ -70.318312140892601, 19.542218328812794 ], [ -70.288339810034188, 19.558573920250183 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-06", "NAME_1": "Duarte" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.225785489308862, 19.499326891422868 ], [ -70.215140144102349, 19.497389024184088 ], [ -70.17966427258807, 19.477002672235528 ], [ -70.145738694685008, 19.455195216985658 ], [ -70.133956467916676, 19.423517563784515 ], [ -70.131062588067948, 19.389230252474135 ], [ -70.118686082996305, 19.347088121219826 ], [ -70.083933681893882, 19.3230327421673 ], [ -70.053547939885505, 19.319337877540988 ], [ -70.039931199565217, 19.296109320788503 ], [ -69.991277839100974, 19.257119451801259 ], [ -69.922599860095431, 19.240686346897348 ], [ -69.855420497857665, 19.210739854460712 ], [ -69.786148241448188, 19.198053290127234 ], [ -69.737314012032016, 19.220119126896179 ], [ -69.676800910433656, 19.206476549053491 ], [ -69.676749233590272, 19.179423936465469 ], [ -69.703285082240768, 19.162603257933995 ], [ -69.719020555154486, 19.152655544717618 ], [ -69.732533941787949, 19.136687526907849 ], [ -69.736125453626755, 19.105397447334326 ], [ -69.755788336962155, 19.087594915972602 ], [ -69.821339891222976, 19.089997870305467 ], [ -69.874928351562176, 19.083977565712075 ], [ -69.876995409110805, 19.072815457467357 ], [ -69.878287320303571, 19.057338365173393 ], [ -69.893428514014715, 19.038347276305728 ], [ -69.920326096971792, 19.039251613870874 ], [ -69.911153531010655, 19.066846828818086 ], [ -69.907768723847539, 19.093486030256088 ], [ -69.929059414260564, 19.106379299265257 ], [ -69.95383826372489, 19.113691515051357 ], [ -69.986136033651007, 19.115810248544108 ], [ -70.016909349287005, 19.116146145328344 ], [ -70.040525478767847, 19.123122463430946 ], [ -70.063056402630878, 19.133070177546642 ], [ -70.089075487343848, 19.144283961735425 ], [ -70.117445847747661, 19.146325181761711 ], [ -70.161241625400692, 19.151156927949842 ], [ -70.205502489248488, 19.150433458437362 ], [ -70.226095546772058, 19.146945299386061 ], [ -70.247076178822567, 19.150588487168932 ], [ -70.266429002896132, 19.155626938932073 ], [ -70.285006679714513, 19.149839179234732 ], [ -70.281880255869112, 19.150666002434036 ], [ -70.281441006297371, 19.146428534549216 ], [ -70.331257086745154, 19.177589422913513 ], [ -70.363632371936376, 19.22492503556191 ], [ -70.362728034371287, 19.267480577066976 ], [ -70.348723721322642, 19.310397853777886 ], [ -70.340558844814836, 19.357216702488813 ], [ -70.321076830431366, 19.399436347209644 ], [ -70.279038051964505, 19.418763332861488 ], [ -70.250564337873868, 19.441681830352195 ], [ -70.242502814153511, 19.473721217859918 ], [ -70.236585863247001, 19.499197699314379 ], [ -70.225785489308862, 19.499326891422868 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-25", "NAME_1": "Santiago" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.547703824072187, 19.517827052976088 ], [ -70.551941291057744, 19.497595729759098 ], [ -70.566875780093142, 19.481705227214434 ], [ -70.580518357935887, 19.460311184013904 ], [ -70.586254441689107, 19.435325628974567 ], [ -70.583412237784557, 19.412613837058927 ], [ -70.583670620202952, 19.390548001189302 ], [ -70.599070197231811, 19.379360052724223 ], [ -70.61390133258044, 19.368843898726936 ], [ -70.666662970619598, 19.352591660976373 ], [ -70.716892463116665, 19.327502753149531 ], [ -70.74164547415927, 19.32093984619695 ], [ -70.748776821892818, 19.300579331770734 ], [ -70.724592250731746, 19.283035182827405 ], [ -70.694025641570079, 19.274999498428087 ], [ -70.67826433023464, 19.248799547461147 ], [ -70.685473192333973, 19.214770615871203 ], [ -70.682527634742542, 19.18598684341805 ], [ -70.708779262552923, 19.190844428027901 ], [ -70.730302496962679, 19.189707546466082 ], [ -70.742472297358631, 19.162809963509005 ], [ -70.794898036814914, 19.125137844136191 ], [ -70.857142300077101, 19.096612454101432 ], [ -70.890034349205848, 19.08307322814693 ], [ -70.919179856864901, 19.069404811882521 ], [ -70.911815965134679, 19.048139959891216 ], [ -70.916208461751125, 19.025919094390702 ], [ -70.942124192777271, 19.033696397270887 ], [ -70.968065762225137, 19.04147370015113 ], [ -70.992482875584244, 19.036306057178763 ], [ -71.015427212395934, 19.025609036028186 ], [ -71.060540737864756, 19.038941555508359 ], [ -71.105085821653347, 19.066071682462166 ], [ -71.124102748942676, 19.082298081791009 ], [ -71.127151659321612, 19.107102768777736 ], [ -71.135704107658455, 19.121933905925005 ], [ -71.152369758357622, 19.130098782432867 ], [ -71.193245815941623, 19.149141547244596 ], [ -71.230840420049333, 19.170173855239227 ], [ -71.225543585867797, 19.201593126021919 ], [ -71.226938849848011, 19.232030544873737 ], [ -71.243475308438747, 19.246861681121686 ], [ -71.247040981855832, 19.267893989116317 ], [ -71.244224616372946, 19.298718979797059 ], [ -71.240891486053215, 19.328975531495587 ], [ -71.226861334582907, 19.347165636484931 ], [ -71.208619553649442, 19.361505846317755 ], [ -71.196294725421239, 19.375070908895339 ], [ -71.180895148392381, 19.384760239693264 ], [ -71.162084926678006, 19.382899889518285 ], [ -71.143197190597846, 19.383855903027495 ], [ -71.107023687992807, 19.400185655143844 ], [ -71.068705614372618, 19.412458808327301 ], [ -71.077283902030445, 19.422329006278574 ], [ -71.090487230301449, 19.431191514776572 ], [ -71.088342658386978, 19.451009425944221 ], [ -71.075165167638374, 19.468062649371745 ], [ -71.047363247116152, 19.453438218698807 ], [ -71.018269416300484, 19.441811021561364 ], [ -71.003619147205882, 19.438658759294299 ], [ -70.989175584585553, 19.440467434424534 ], [ -70.979718796884981, 19.453438218698807 ], [ -70.970804613342239, 19.464083563905319 ], [ -70.929540982130618, 19.447288722896246 ], [ -70.885564338223617, 19.447547105314641 ], [ -70.881585252757191, 19.46527212231058 ], [ -70.904400396561016, 19.481550198482864 ], [ -70.897449916880134, 19.510333970936017 ], [ -70.896519740893325, 19.537825833095724 ], [ -70.911376715562938, 19.546507473541055 ], [ -70.925846116604987, 19.553122057337077 ], [ -70.933855964381223, 19.571105454952772 ], [ -70.935638801089794, 19.591207586960536 ], [ -70.910808274782028, 19.574593614004073 ], [ -70.885202603017717, 19.577771714692858 ], [ -70.870655686710563, 19.60826081038806 ], [ -70.864118618179646, 19.641747137820118 ], [ -70.832957729815348, 19.634848334083358 ], [ -70.805233323658967, 19.627303575199846 ], [ -70.782702398896561, 19.609139309531486 ], [ -70.760455694974326, 19.590432441503935 ], [ -70.715755580655525, 19.592370306944076 ], [ -70.712138231294318, 19.651100571833922 ], [ -70.658756477429506, 19.628724676702461 ], [ -70.63798255095395, 19.58110484501259 ], [ -70.608604499298167, 19.536120509853617 ], [ -70.547703824072187, 19.517827052976088 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-03", "NAME_1": "Bahoruco" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.376722988874803, 18.392727769171188 ], [ -71.415454475443653, 18.402107042505975 ], [ -71.451627977149428, 18.423268540810511 ], [ -71.489971890090658, 18.439753323457069 ], [ -71.592601283622344, 18.47799388271153 ], [ -71.62066158656296, 18.565301215378781 ], [ -71.609447800575538, 18.586256008108251 ], [ -71.602678188947266, 18.608812771292321 ], [ -71.604280157603171, 18.6215251731482 ], [ -71.59947424983676, 18.632583930404053 ], [ -71.567460699851381, 18.642299098724436 ], [ -71.534982061872654, 18.650774034494077 ], [ -71.487904833441291, 18.634263414325119 ], [ -71.438450487300145, 18.62480662752381 ], [ -71.393543667406334, 18.603180040326606 ], [ -71.344864467621051, 18.599614366010144 ], [ -71.323315395688951, 18.612766018337084 ], [ -71.300241868567355, 18.62020742443309 ], [ -71.272620816097799, 18.61731354458442 ], [ -71.245206468303877, 18.621861069932436 ], [ -71.197689989401454, 18.635374457465218 ], [ -71.161309781221405, 18.615918281503468 ], [ -71.113819138942119, 18.570287991197802 ], [ -71.051394009425962, 18.549720771196633 ], [ -71.019871384956446, 18.544268907384151 ], [ -70.993283861261204, 18.527344876065172 ], [ -70.993619758045384, 18.509619859069232 ], [ -71.014755418827519, 18.5020234242416 ], [ -71.034418301263599, 18.525872096819796 ], [ -71.047776659165493, 18.499878852327186 ], [ -71.063408780191025, 18.475306708437813 ], [ -71.089221158429723, 18.457297472400398 ], [ -71.119891120378895, 18.446652127193886 ], [ -71.13598832939789, 18.434172268435418 ], [ -71.147357144116881, 18.41766164826646 ], [ -71.163531866602341, 18.407093818325052 ], [ -71.18027503076803, 18.397068589843514 ], [ -71.197793342188959, 18.370791124510788 ], [ -71.200764737302791, 18.338364163375445 ], [ -71.236731533433499, 18.335987047464243 ], [ -71.264585129899785, 18.357872016180579 ], [ -71.290552537769372, 18.404174099155341 ], [ -71.338404914355294, 18.407016303059947 ], [ -71.376722988874803, 18.392727769171188 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-22", "NAME_1": "San Juan" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.405842658112192, 19.105139064915875 ], [ -71.367757127589357, 19.10718028404284 ], [ -71.336337856806608, 19.129995428746042 ], [ -71.334322476101363, 19.160923774012929 ], [ -71.327371996420482, 19.191076972024632 ], [ -71.284092983604296, 19.170690619176696 ], [ -71.230840420049333, 19.170173855239227 ], [ -71.193245815941623, 19.149141547244596 ], [ -71.152369758357622, 19.130098782432867 ], [ -71.135704107658455, 19.121933905925005 ], [ -71.127151659321612, 19.107102768777736 ], [ -71.124102748942676, 19.082298081791009 ], [ -71.105085821653347, 19.066071682462166 ], [ -71.060540737864756, 19.038941555508359 ], [ -71.015427212395934, 19.025609036028186 ], [ -70.992482875584244, 19.036306057178763 ], [ -70.968065762225137, 19.04147370015113 ], [ -70.942124192777271, 19.033696397270887 ], [ -70.916208461751125, 19.025919094390702 ], [ -70.89967200405971, 19.009925239058532 ], [ -70.891197069189388, 18.988453681492217 ], [ -70.899568651272205, 18.967033799869967 ], [ -70.92049760558001, 18.957215277862758 ], [ -70.924502530367477, 18.937836615367473 ], [ -70.938584356882529, 18.92504669824649 ], [ -70.963130663249501, 18.908742784551862 ], [ -70.975274624324413, 18.883679714247421 ], [ -70.981940884064556, 18.834122016218032 ], [ -70.982457648002026, 18.78262645094992 ], [ -70.990260790203308, 18.765624905265156 ], [ -71.003929205568397, 18.753145046506688 ], [ -71.018476121875494, 18.758829454315844 ], [ -71.026899379902432, 18.776115220840779 ], [ -71.05942969382528, 18.766425890042797 ], [ -71.053099330869429, 18.728779609091646 ], [ -71.054287889274633, 18.716093044758168 ], [ -71.064726528906192, 18.702553818803665 ], [ -71.058086106688449, 18.691624254555677 ], [ -71.05581234356481, 18.678756822169589 ], [ -71.07470007964497, 18.670281887299268 ], [ -71.091055671082358, 18.664364936392701 ], [ -71.117384813258525, 18.627132065692251 ], [ -71.161309781221405, 18.615918281503468 ], [ -71.197689989401454, 18.635374457465218 ], [ -71.245206468303877, 18.621861069932436 ], [ -71.272620816097799, 18.61731354458442 ], [ -71.300241868567355, 18.62020742443309 ], [ -71.323315395688951, 18.612766018337084 ], [ -71.344864467621051, 18.599614366010144 ], [ -71.393543667406334, 18.603180040326606 ], [ -71.438450487300145, 18.62480662752381 ], [ -71.487904833441291, 18.634263414325119 ], [ -71.534982061872654, 18.650774034494077 ], [ -71.520745204827335, 18.682580878005126 ], [ -71.532294887598994, 18.711002916151642 ], [ -71.559321661765239, 18.717049059166754 ], [ -71.577873501061219, 18.735859279981753 ], [ -71.577821825117098, 18.760431422971749 ], [ -71.585004848794711, 18.78340159820516 ], [ -71.605313687276862, 18.800248114259034 ], [ -71.627896287983276, 18.814200751363558 ], [ -71.615907354740614, 18.862905789570505 ], [ -71.633244798108933, 18.88380890635591 ], [ -71.624847377604397, 18.937836615367473 ], [ -71.60004269061767, 18.987756049502082 ], [ -71.577976853848725, 19.006747138369747 ], [ -71.549709846232417, 19.009460151065127 ], [ -71.518755663443073, 19.018064277144674 ], [ -71.50309770399582, 19.049716091024777 ], [ -71.491367154070872, 19.092349147794891 ], [ -71.471135829954562, 19.128393460090081 ], [ -71.43721025295082, 19.123251655539434 ], [ -71.405842658112192, 19.105139064915875 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-28", "NAME_1": "Monseñor Nouel" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.392312791602023, 19.072324531052232 ], [ -70.380892300039591, 19.048682563149725 ], [ -70.371823085966639, 19.02545400639724 ], [ -70.367120530987677, 18.998427232230995 ], [ -70.341799079164161, 18.986825873515215 ], [ -70.332652350725368, 18.975715440315298 ], [ -70.329577602824088, 18.961013495276575 ], [ -70.313867967432714, 18.94127309847471 ], [ -70.292913173803925, 18.926726183066876 ], [ -70.249918381827854, 18.897606512930224 ], [ -70.223847622070082, 18.854766751484362 ], [ -70.244414842071308, 18.833010973077933 ], [ -70.251184454598899, 18.80172089350441 ], [ -70.285394253342133, 18.786088772478877 ], [ -70.29955359602161, 18.75761505838824 ], [ -70.31306698265513, 18.719529526966085 ], [ -70.350015631616088, 18.720149643691116 ], [ -70.375621304279775, 18.737151191174519 ], [ -70.402286343240121, 18.747383124331691 ], [ -70.426470912602497, 18.739166571879764 ], [ -70.451456467641833, 18.73660858791601 ], [ -70.491686570978459, 18.76472056680069 ], [ -70.533673671702559, 18.787949124452496 ], [ -70.592378099070004, 18.853242296294923 ], [ -70.583334724318036, 18.922462876760335 ], [ -70.523519252911171, 18.969049181474531 ], [ -70.522640753767746, 19.037365424374798 ], [ -70.501840989769846, 19.074210720548308 ], [ -70.454195318758934, 19.086483872832446 ], [ -70.443420783242516, 19.10508738897181 ], [ -70.423732062384772, 19.111727810290176 ], [ -70.399780036119751, 19.098266100500098 ], [ -70.392312791602023, 19.072324531052232 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-24", "NAME_1": "Sánchez Ramírez" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.223847622070082, 18.854766751484362 ], [ -70.249918381827854, 18.897606512930224 ], [ -70.292913173803925, 18.926726183066876 ], [ -70.313867967432714, 18.94127309847471 ], [ -70.329577602824088, 18.961013495276575 ], [ -70.332652350725368, 18.975715440315298 ], [ -70.341799079164161, 18.986825873515215 ], [ -70.367120530987677, 18.998427232230995 ], [ -70.371823085966639, 19.02545400639724 ], [ -70.380892300039591, 19.048682563149725 ], [ -70.392312791602023, 19.072324531052232 ], [ -70.364123298351501, 19.103304552263239 ], [ -70.324358283008337, 19.121184597091485 ], [ -70.299863654384126, 19.133251043800612 ], [ -70.277642787984291, 19.141080024423559 ], [ -70.279554815902031, 19.143741360275556 ], [ -70.281441006297371, 19.146428534549216 ], [ -70.281880255869112, 19.150666002434036 ], [ -70.285006679714513, 19.149839179234732 ], [ -70.266429002896132, 19.155626938932073 ], [ -70.247076178822567, 19.150588487168932 ], [ -70.226095546772058, 19.146945299386061 ], [ -70.205502489248488, 19.150433458437362 ], [ -70.161241625400692, 19.151156927949842 ], [ -70.117445847747661, 19.146325181761711 ], [ -70.089075487343848, 19.144283961735425 ], [ -70.063056402630878, 19.133070177546642 ], [ -70.040525478767847, 19.123122463430946 ], [ -70.016909349287005, 19.116146145328344 ], [ -69.986136033651007, 19.115810248544108 ], [ -69.95383826372489, 19.113691515051357 ], [ -69.929059414260564, 19.106379299265257 ], [ -69.907768723847539, 19.093486030256088 ], [ -69.911153531010655, 19.066846828818086 ], [ -69.920326096971792, 19.039251613870874 ], [ -69.93531226285063, 18.974966132381098 ], [ -69.952546353431444, 18.909983018001867 ], [ -69.980554978629357, 18.889389960478297 ], [ -70.013085292552205, 18.904556993510425 ], [ -70.033084072671784, 18.908045152561726 ], [ -70.045357224955978, 18.890526842040117 ], [ -70.063159756317702, 18.893239853836178 ], [ -70.084114549047172, 18.897218940201924 ], [ -70.110469529645059, 18.891069444399307 ], [ -70.129615648143613, 18.874920559436248 ], [ -70.171990323394709, 18.865205390216545 ], [ -70.223847622070082, 18.854766751484362 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-31", "NAME_1": "San José de Ocoa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.533673671702559, 18.787949124452496 ], [ -70.491686570978459, 18.76472056680069 ], [ -70.451456467641833, 18.73660858791601 ], [ -70.426470912602497, 18.739166571879764 ], [ -70.402286343240121, 18.747383124331691 ], [ -70.375621304279775, 18.737151191174519 ], [ -70.350015631616088, 18.720149643691116 ], [ -70.368748338065359, 18.679506130103789 ], [ -70.372184821172539, 18.636330470974428 ], [ -70.367895677343597, 18.601035468412135 ], [ -70.378799404968561, 18.565714627428122 ], [ -70.371564704447565, 18.533287665393402 ], [ -70.356552700147006, 18.50357371695344 ], [ -70.378050096135041, 18.48143036491939 ], [ -70.403139003961826, 18.464919744750432 ], [ -70.452050746844463, 18.451251329385343 ], [ -70.479077521010765, 18.413217474806629 ], [ -70.501091681835646, 18.454739488436644 ], [ -70.521865607411826, 18.488742580705491 ], [ -70.554137538916279, 18.504452216096865 ], [ -70.587417161672647, 18.525174464829661 ], [ -70.610619880003469, 18.533003445452607 ], [ -70.627983160894132, 18.548893947997271 ], [ -70.635553758199364, 18.563750921767621 ], [ -70.650333217603873, 18.572355047847168 ], [ -70.671262172810998, 18.622972113971855 ], [ -70.699994269320086, 18.676844794251849 ], [ -70.654699876697919, 18.677904161447884 ], [ -70.610464851271843, 18.677361559088638 ], [ -70.595142787709449, 18.693587958417538 ], [ -70.574058803770754, 18.712036444925957 ], [ -70.548013882434702, 18.743559068496211 ], [ -70.533673671702559, 18.787949124452496 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "DO-29", "NAME_1": "Monte Plata" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.251184454598899, 18.80172089350441 ], [ -70.244414842071308, 18.833010973077933 ], [ -70.223847622070082, 18.854766751484362 ], [ -70.171990323394709, 18.865205390216545 ], [ -70.129615648143613, 18.874920559436248 ], [ -70.110469529645059, 18.891069444399307 ], [ -70.084114549047172, 18.897218940201924 ], [ -70.063159756317702, 18.893239853836178 ], [ -70.045357224955978, 18.890526842040117 ], [ -70.033084072671784, 18.908045152561726 ], [ -70.013085292552205, 18.904556993510425 ], [ -69.980554978629357, 18.889389960478297 ], [ -69.952546353431444, 18.909983018001867 ], [ -69.93531226285063, 18.974966132381098 ], [ -69.920326096971792, 19.039251613870874 ], [ -69.893428514014715, 19.038347276305728 ], [ -69.878287320303571, 19.057338365173393 ], [ -69.876995409110805, 19.072815457467357 ], [ -69.874928351562176, 19.083977565712075 ], [ -69.821339891222976, 19.089997870305467 ], [ -69.755788336962155, 19.087594915972602 ], [ -69.727340461293238, 19.066872667239807 ], [ -69.698608364784207, 19.046537991235311 ], [ -69.666930711583063, 19.029458930285386 ], [ -69.637836879868075, 19.008891710284161 ], [ -69.591663988102539, 18.969720974143627 ], [ -69.534716559921264, 18.942358303193146 ], [ -69.484512905845918, 18.918742173712303 ], [ -69.435601162063961, 18.893265693157218 ], [ -69.399350145093138, 18.888769842853947 ], [ -69.380875821062261, 18.871122341123112 ], [ -69.399918585874047, 18.858616644842243 ], [ -69.420459968352873, 18.846550198133116 ], [ -69.441311408294837, 18.825879625344442 ], [ -69.459113938757241, 18.802573554226115 ], [ -69.518309291640492, 18.743429877286985 ], [ -69.575334235086871, 18.648216051429586 ], [ -69.611120164963609, 18.6612385125473 ], [ -69.645097418810792, 18.654288031067779 ], [ -69.663933478047568, 18.642660833930336 ], [ -69.685740933297438, 18.638242498892168 ], [ -69.743851080562933, 18.617726955734383 ], [ -69.789972297283668, 18.571838283909642 ], [ -69.797982144160585, 18.600105292425269 ], [ -69.818988613733552, 18.61943227807717 ], [ -69.824621344699267, 18.63927602856586 ], [ -69.838470629016285, 18.656690986299964 ], [ -69.861156581610942, 18.68108226213667 ], [ -69.888260871042348, 18.70133942287606 ], [ -69.91143775095145, 18.7024763053372 ], [ -69.934640469282215, 18.70340648042469 ], [ -69.947301195193972, 18.702838040543099 ], [ -69.959083421063042, 18.69903982223002 ], [ -69.963682624153762, 18.690125636888638 ], [ -69.966343960005759, 18.68092723250578 ], [ -70.008770311200863, 18.66222036447823 ], [ -70.056054247005875, 18.671031196132787 ], [ -70.088842943347174, 18.679480292581445 ], [ -70.120701462802231, 18.690694078568868 ], [ -70.1390207590008, 18.722035834086455 ], [ -70.167184413829602, 18.731673488940373 ], [ -70.191317308147234, 18.748700873046857 ], [ -70.217233039173379, 18.762498481419755 ], [ -70.23464799690754, 18.78172211428415 ], [ -70.251184454598899, 18.80172089350441 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/ecuador.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/ecuador.geojson new file mode 100644 index 000000000000..76f332f09d54 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/ecuador.geojson @@ -0,0 +1,30 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "EC-E", "NAME_1": "Esmeraldas" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.828684048999946, 1.43431224200009 ], [ -78.769967610999856, 1.394102072000067 ], [ -78.664676879999945, 1.266642151000042 ], [ -78.602148396999951, 1.263644918000111 ], [ -78.570057332999852, 1.19584543900001 ], [ -78.540601766999941, 1.205353902000084 ], [ -78.47812265099995, 1.18711995600006 ], [ -78.495694139073237, 1.171350002100894 ], [ -78.494143846361396, 1.100759996076931 ], [ -78.53062740822827, 1.021384995920812 ], [ -78.534787359948666, 0.964024155690197 ], [ -78.523496059595459, 0.928367417922004 ], [ -78.442105678734094, 0.871936754577575 ], [ -78.450632290447857, 0.789047756049115 ], [ -78.513444993591577, 0.759902249289382 ], [ -78.424225633006529, 0.586217759941633 ], [ -78.426318528976935, 0.558519192206973 ], [ -78.448616908843235, 0.542034410459678 ], [ -78.497399462315343, 0.542137763247183 ], [ -78.539205694986833, 0.51505931223744 ], [ -78.667414923659805, 0.372949124202705 ], [ -78.719608120018734, 0.402714749486108 ], [ -78.859961310665938, 0.422816881493873 ], [ -78.987576260136279, 0.267477524967774 ], [ -79.01070146410126, 0.267425849023709 ], [ -79.040208706066892, 0.295021063970921 ], [ -79.14506018677821, 0.317655341520776 ], [ -79.221877203869838, 0.31558828397209 ], [ -79.3522310053566, 0.231665758467955 ], [ -79.303655158358879, 0.173271389463025 ], [ -79.369878506188115, 0.035967109194701 ], [ -79.450364548585014, -0.000929863822194 ], [ -79.420702276988493, -0.03338266427852 ], [ -79.43315629822456, -0.050125827544889 ], [ -79.492997606254505, -0.025631198920678 ], [ -79.595549486319726, -0.013590589733951 ], [ -79.618416306966992, 0.045372219152569 ], [ -79.567850917685689, 0.116530666856761 ], [ -79.623945686044578, 0.15389272696774 ], [ -79.649938931436509, 0.145676174515813 ], [ -79.659602423812771, 0.175958563736742 ], [ -79.682133347675858, 0.170429185558476 ], [ -79.702106289373717, 0.187430732142559 ], [ -79.652186856138485, 0.259157619728342 ], [ -79.71223486974344, 0.303651028472189 ], [ -79.695595059264576, 0.347110907542344 ], [ -79.717583380768417, 0.370778712967194 ], [ -79.75269751707674, 0.369280097098795 ], [ -79.814580044233651, 0.322667954862197 ], [ -79.889665899661509, 0.318688870295091 ], [ -79.929405076583009, 0.260294501290218 ], [ -79.973975999692641, 0.284272365976904 ], [ -79.999521235313509, 0.345101779873908 ], [ -79.993316209999932, 0.378119208000044 ], [ -80.043568488999938, 0.458929755000042 ], [ -80.043365037999934, 0.501206773000092 ], [ -80.016957160999937, 0.55890534100007 ], [ -80.036366339999915, 0.625230210000041 ], [ -80.090321417999917, 0.652167059000078 ], [ -80.104969855999911, 0.679673570000091 ], [ -80.097279425999943, 0.780340887000079 ], [ -80.046213344999899, 0.839667059000078 ], [ -79.981312628999945, 0.832220770000049 ], [ -79.862172003999945, 0.87641022300005 ], [ -79.765614386999914, 0.955145575000074 ], [ -79.655751105999911, 1.003607489000046 ], [ -79.670074022999927, 0.921616929000038 ], [ -79.614857550999943, 0.845282294000071 ], [ -79.648304816999939, 0.907416083000044 ], [ -79.632679816999939, 0.986029364000046 ], [ -79.614857550999943, 0.996079820000091 ], [ -79.571766730999911, 0.983710028000075 ], [ -79.435047980999911, 1.078029690000051 ], [ -79.364654100999928, 1.072455145000049 ], [ -79.272206183999913, 1.092962958000044 ], [ -79.248158331999946, 1.080267645000049 ], [ -79.165760870999918, 1.099798895000049 ], [ -79.057240363999938, 1.21751536700009 ], [ -79.013050910999937, 1.192775783000059 ], [ -78.991688605999911, 1.119696356000077 ], [ -78.962147589999915, 1.144680080000057 ], [ -78.954579230999911, 1.20734284100007 ], [ -78.928944464999915, 1.243150132000039 ], [ -78.901682094999899, 1.236314195000091 ], [ -78.871693488999938, 1.288967190000051 ], [ -78.812855597999942, 1.277289130000042 ], [ -78.881947394999941, 1.319281317000048 ], [ -78.83234615799995, 1.381333726000094 ], [ -78.828684048999946, 1.43431224200009 ] ] ], [ [ [ -78.901682094999899, 1.374172268000052 ], [ -78.899281378999945, 1.271429755000042 ], [ -78.912505662999934, 1.245266018000052 ], [ -78.936390753999945, 1.256822007000039 ], [ -78.956898566999939, 1.236314195000091 ], [ -78.995432094999899, 1.286810614000046 ], [ -78.901682094999899, 1.374172268000052 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-C", "NAME_1": "Carchi" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.47812265099995, 1.18711995600006 ], [ -78.349218099999945, 1.05580230700005 ], [ -78.250154378999923, 1.019628804000121 ], [ -78.077942667999935, 0.900773011000126 ], [ -77.91826249199994, 0.874418030000072 ], [ -77.903224649999856, 0.832095032000069 ], [ -77.847982543999962, 0.809254048000057 ], [ -77.703185180999924, 0.843102112000054 ], [ -77.673316202999899, 0.819641012000076 ], [ -77.666804972999927, 0.747707418000047 ], [ -77.645565959999942, 0.7162881470001 ], [ -77.579833536999899, 0.670916239000078 ], [ -77.514137794999868, 0.660531216000038 ], [ -77.570014207589622, 0.624716702513808 ], [ -77.669543015697627, 0.638669337819692 ], [ -77.673005337226527, 0.616965237155966 ], [ -77.649957647627332, 0.584977524692988 ], [ -77.775143806141728, 0.448293362049014 ], [ -77.791861130986376, 0.370985419441524 ], [ -77.814081997386268, 0.345663966718689 ], [ -78.000453050168119, 0.46865387647523 ], [ -78.130806850755562, 0.505602525436188 ], [ -78.168608161337545, 0.651381741474154 ], [ -78.258421800225904, 0.775405178206427 ], [ -78.360301886722652, 0.852816474500685 ], [ -78.428618129622976, 0.865373846725618 ], [ -78.523496059595459, 0.928367417922004 ], [ -78.53062740822827, 1.021384995920812 ], [ -78.494143846361396, 1.100759996076931 ], [ -78.495694139073237, 1.171350002100894 ], [ -78.47812265099995, 1.18711995600006 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-U", "NAME_1": "Sucumbios" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.509346883999939, 0.661201070000033 ], [ -77.468057413999929, 0.650865784000118 ], [ -77.434726115999865, 0.433824769000054 ], [ -77.397467406999851, 0.387626038000093 ], [ -77.206936401999968, 0.334192607000077 ], [ -77.117432820999852, 0.357550354000125 ], [ -77.082861287999947, 0.348868713000073 ], [ -77.04462072799987, 0.305667216000131 ], [ -76.945867065999948, 0.287063701000079 ], [ -76.882460082999927, 0.240141500000036 ], [ -76.797865763999937, 0.249960022000096 ], [ -76.734355427999873, 0.233113505000119 ], [ -76.736887573999866, 0.272904358000034 ], [ -76.724536905999912, 0.277555237000087 ], [ -76.626868448999886, 0.258538310000034 ], [ -76.565425171999976, 0.21606028300009 ], [ -76.425692098999917, 0.242725322000126 ], [ -76.408018757999912, 0.254507548000035 ], [ -76.416390339999879, 0.401888733000078 ], [ -76.365385701999912, 0.406953023000057 ], [ -76.300480102999899, 0.461626689000099 ], [ -76.223740600999946, 0.406746318000089 ], [ -76.136304077999881, 0.396721090000071 ], [ -76.119560913999919, 0.351762594000149 ], [ -76.053466756999882, 0.363544820000058 ], [ -75.951974243999899, 0.203967997000092 ], [ -75.81787390199986, 0.100098369000079 ], [ -75.75384680199997, 0.073019918000028 ], [ -75.626774454999946, 0.078911031000118 ], [ -75.464923868999875, -0.039738056999923 ], [ -75.283487914999881, -0.107020771999899 ], [ -75.330746012999896, -0.144641214999922 ], [ -75.402576253999911, -0.14577809599993 ], [ -75.429499674999931, -0.163658141999889 ], [ -75.539260417999856, -0.120043232999933 ], [ -75.623002075999921, -0.106607360999888 ], [ -75.643207560999912, -0.128828226999929 ], [ -75.619565592999976, -0.180918069999976 ], [ -75.578973754999936, -0.182675068999856 ], [ -75.484767619999872, -0.247684020999912 ], [ -75.452728230999952, -0.360648701999907 ], [ -75.405625162999854, -0.442400817999925 ], [ -75.34735998599993, -0.470926208999884 ], [ -75.290980997999895, -0.527976989999971 ], [ -75.272041584999869, -0.525703225999948 ], [ -75.257029581999888, -0.56198008199992 ], [ -75.257649699999945, -0.633190204999963 ], [ -75.282091843763567, -0.643526299898838 ], [ -75.289739956333904, -0.618359876806892 ], [ -75.382757534332711, -0.601771742272092 ], [ -75.403014695971422, -0.565494886879549 ], [ -75.542411872210096, -0.542343844492848 ], [ -75.574451259717875, -0.49516326327398 ], [ -75.588533088031568, -0.499969171040448 ], [ -75.654368863132504, -0.455010675202516 ], [ -75.69958574138883, -0.464157402741932 ], [ -75.748316617118178, -0.422609551589517 ], [ -75.831644864319003, -0.436665540582226 ], [ -75.886912807679892, -0.413411147206716 ], [ -75.947632615752582, -0.422867934007968 ], [ -75.937193977020399, -0.561670831044012 ], [ -75.994425625142469, -0.553299248961196 ], [ -76.077986416340025, -0.501622816539737 ], [ -76.102842780170135, -0.441936537241418 ], [ -76.274382696704095, -0.443125094747359 ], [ -76.410214200425003, -0.510304456985125 ], [ -76.427396613263056, -0.485706474674089 ], [ -76.502172411227775, -0.473665867285945 ], [ -76.575733812365513, -0.405091241067908 ], [ -76.621855028186985, -0.424883314713213 ], [ -76.714097459829873, -0.341942641140008 ], [ -76.767608404903967, -0.252645766189175 ], [ -76.917547573561649, -0.078599541635526 ], [ -76.945427009348975, -0.065680434204694 ], [ -77.073610398700907, -0.102112319228183 ], [ -77.147249315103807, -0.083043715095357 ], [ -77.19742713075749, -0.090588473978926 ], [ -77.284010993012885, -0.047335299584404 ], [ -77.349975959323046, -0.131619561193816 ], [ -77.374212206428183, -0.141076347995067 ], [ -77.446455857951491, -0.124849948666224 ], [ -77.44392371330872, -0.060409437545502 ], [ -77.46487850603819, -0.023460788584543 ], [ -77.588979458035567, -0.100045260780178 ], [ -77.64086259603198, -0.081028333490792 ], [ -77.758917405913564, -0.075033868218441 ], [ -77.778864509189759, -0.046818535646935 ], [ -77.778942022656224, 0.015813300343552 ], [ -77.845191209806501, 0.035967109194701 ], [ -77.863898077833994, 0.074155992505041 ], [ -77.970429043365641, 0.119734605067947 ], [ -77.835501879008518, 0.26918284731056 ], [ -77.852477587170881, 0.29264394805972 ], [ -77.791861130986376, 0.370985419441524 ], [ -77.783747932221274, 0.43470246015039 ], [ -77.649957647627332, 0.584977524692988 ], [ -77.673005337226527, 0.616965237155966 ], [ -77.669543015697627, 0.638669337819692 ], [ -77.570014207589622, 0.624716702513808 ], [ -77.509346883999939, 0.661201070000033 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-D", "NAME_1": "Orellana" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -75.266641397999877, -0.642698668999941 ], [ -75.293978230999926, -0.667916767999898 ], [ -75.297027139999841, -0.746981709999972 ], [ -75.252068644999923, -0.933430276999943 ], [ -75.227263957999895, -0.969810484999925 ], [ -75.34872941099988, -0.974978128999922 ], [ -75.406400309999952, -0.915136819999873 ], [ -75.41257564299994, -0.92392181299995 ], [ -75.5807400973776, -1.54663979598979 ], [ -75.602330694605882, -1.496187431704641 ], [ -75.702996385175027, -1.445596204900937 ], [ -75.717569139004524, -1.45567311022586 ], [ -75.747541469862938, -1.405288588097847 ], [ -75.833014288978234, -1.383997897684822 ], [ -75.844176398122272, -1.357332858724476 ], [ -75.880246547939805, -1.342863457682427 ], [ -75.878463711231291, -1.328445732584498 ], [ -75.89962521043509, -1.347307631142257 ], [ -75.950190598817073, -1.344517104081092 ], [ -76.004812587930587, -1.310152275706969 ], [ -76.056411505986205, -1.301160576899122 ], [ -76.063542852820376, -1.276149183438065 ], [ -76.105943365593816, -1.273048598014384 ], [ -76.155630255731694, -1.293099054078084 ], [ -76.245263028366026, -1.282143649609736 ], [ -76.284201218711246, -1.311082451693778 ], [ -76.358331060629951, -1.283125501540667 ], [ -76.362749395668061, -1.262661635226323 ], [ -76.463673468655657, -1.251344495552019 ], [ -76.511267462823128, -1.187782484474099 ], [ -76.515065681136264, -1.084377943687173 ], [ -76.545373907879537, -1.05156340892421 ], [ -76.594673225289114, -1.046344089108459 ], [ -76.760942145163881, -1.097865491898915 ], [ -76.810732388089207, -1.089648939446988 ], [ -76.850006477017303, -1.156828301684811 ], [ -77.056221280287843, -1.093524672125909 ], [ -77.074463060321989, -1.039626152524932 ], [ -77.04283708396423, -0.987949721002849 ], [ -77.061879848775959, -0.963713473897712 ], [ -77.036144985802423, -0.925214532224913 ], [ -77.113995530769103, -0.904233901073667 ], [ -77.186885139237745, -0.860360609954171 ], [ -77.196316087617333, -0.835762627643135 ], [ -77.176704881125374, -0.786928399126339 ], [ -77.1186205722816, -0.730342706150964 ], [ -77.124201626403931, -0.707915134176119 ], [ -77.16481930156948, -0.722797947267452 ], [ -77.209545254310001, -0.764707532726447 ], [ -77.254994675663738, -0.833850599725395 ], [ -77.49921749509133, -0.945316664232678 ], [ -77.566164313332365, -0.947177016206354 ], [ -77.579005907296789, -0.931364028027474 ], [ -77.528466356437207, -0.841188653033896 ], [ -77.533272264203617, -0.780778904223041 ], [ -77.496607836082774, -0.69137867558544 ], [ -77.575285204248758, -0.577018731229487 ], [ -77.621716478432745, -0.544772638146753 ], [ -77.566474371694881, -0.49573170315557 ], [ -77.551539882659426, -0.458007907838692 ], [ -77.448006150663332, -0.507823988286418 ], [ -77.404029506756331, -0.504154962081827 ], [ -77.356564703798028, -0.425658461069133 ], [ -77.329047004115921, -0.424056491513909 ], [ -77.32323340509754, -0.387417900915409 ], [ -77.273184780653082, -0.360391126749107 ], [ -77.254374558938707, -0.294865410910006 ], [ -77.259955613960415, -0.246341240755669 ], [ -77.297911953274024, -0.19027231171782 ], [ -77.299410570041744, -0.058549085571826 ], [ -77.284010993012885, -0.047335299584404 ], [ -77.19742713075749, -0.090588473978926 ], [ -77.147249315103807, -0.083043715095357 ], [ -77.073610398700907, -0.102112319228183 ], [ -76.931706916241183, -0.069607842827679 ], [ -76.767608404903967, -0.252645766189175 ], [ -76.714097459829873, -0.341942641140008 ], [ -76.621855028186985, -0.424883314713213 ], [ -76.575733812365513, -0.405091241067908 ], [ -76.502172411227775, -0.473665867285945 ], [ -76.427396613263056, -0.485706474674089 ], [ -76.410214200425003, -0.510304456985125 ], [ -76.274382696704095, -0.443125094747359 ], [ -76.102842780170135, -0.441936537241418 ], [ -76.077986416340025, -0.501622816539737 ], [ -75.994425625142469, -0.553299248961196 ], [ -75.937193977020399, -0.561670831044012 ], [ -75.947632615752582, -0.422867934007968 ], [ -75.886912807679892, -0.413411147206716 ], [ -75.831644864319003, -0.436665540582226 ], [ -75.748316617118178, -0.422609551589517 ], [ -75.69958574138883, -0.464157402741932 ], [ -75.654368863132504, -0.455010675202516 ], [ -75.588533088031568, -0.499969171040448 ], [ -75.574451259717875, -0.49516326327398 ], [ -75.542411872210096, -0.542343844492848 ], [ -75.403014695971422, -0.565494886879549 ], [ -75.382757534332711, -0.601771742272092 ], [ -75.289739956333904, -0.618359876806892 ], [ -75.285140754142503, -0.641355888663327 ], [ -75.266641397999877, -0.642698668999941 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-Y", "NAME_1": "Pastaza" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -75.5807400973776, -1.54663979598979 ], [ -76.091242228999931, -2.12891286199995 ], [ -76.625266479999937, -2.537673441999928 ], [ -76.725905524120606, -2.577051690083465 ], [ -76.831351284034497, -2.529974459853463 ], [ -76.918271043973505, -2.540361422641524 ], [ -76.95904374877, -2.528269137510677 ], [ -77.017128059412414, -2.477212822713625 ], [ -77.034620530612983, -2.430032239696118 ], [ -77.123064744842111, -2.313656914634919 ], [ -77.384263272432065, -2.154338473541713 ], [ -77.710625779755901, -2.02246021866415 ], [ -77.753155483738567, -1.950785007022489 ], [ -77.838318243592028, -1.912751152443718 ], [ -77.914127570331118, -1.668114922765483 ], [ -77.948544073749986, -1.655609225585295 ], [ -78.008979661881881, -1.668114922765483 ], [ -78.078458624765688, -1.506109306499297 ], [ -78.129282395566065, -1.45624155010745 ], [ -78.172561408382251, -1.446991468881208 ], [ -78.116828376128638, -1.357694593930376 ], [ -78.116518316866802, -1.23330942109294 ], [ -77.941955329275004, -1.223852634291632 ], [ -77.897177699691099, -1.23713347692842 ], [ -77.882062344401675, -1.214085789127864 ], [ -77.831109382392071, -1.221837252687067 ], [ -77.695613776354662, -1.151660657813125 ], [ -77.547069871677195, -1.13574431684674 ], [ -77.445525681964625, -1.087323499479908 ], [ -77.373023648022922, -1.079313652602991 ], [ -77.233755662993417, -1.024536634757908 ], [ -77.051647914719467, -1.010377292078374 ], [ -77.074463060321989, -1.039626152524932 ], [ -77.056221280287843, -1.093524672125909 ], [ -76.867938198688933, -1.157396741566401 ], [ -76.850006477017303, -1.156828301684811 ], [ -76.810732388089207, -1.089648939446988 ], [ -76.760942145163881, -1.097865491898915 ], [ -76.594673225289114, -1.046344089108459 ], [ -76.545373907879537, -1.05156340892421 ], [ -76.515065681136264, -1.084377943687173 ], [ -76.511267462823128, -1.187782484474099 ], [ -76.463673468655657, -1.251344495552019 ], [ -76.362749395668061, -1.262661635226323 ], [ -76.358331060629951, -1.283125501540667 ], [ -76.284201218711246, -1.311082451693778 ], [ -76.245263028366026, -1.282143649609736 ], [ -76.155630255731694, -1.293099054078084 ], [ -76.105943365593816, -1.273048598014384 ], [ -76.063542852820376, -1.276149183438065 ], [ -76.056411505986205, -1.301160576899122 ], [ -76.004812587930587, -1.310152275706969 ], [ -75.950190598817073, -1.344517104081092 ], [ -75.89962521043509, -1.347307631142257 ], [ -75.878463711231291, -1.328445732584498 ], [ -75.880246547939805, -1.342863457682427 ], [ -75.844176398122272, -1.357332858724476 ], [ -75.833014288978234, -1.383997897684822 ], [ -75.747541469862938, -1.405288588097847 ], [ -75.717569139004524, -1.45567311022586 ], [ -75.702996385175027, -1.445596204900937 ], [ -75.602330694605882, -1.496187431704641 ], [ -75.5807400973776, -1.54663979598979 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-S", "NAME_1": "Morona Santiago" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -76.669661558234338, -2.564588924739098 ], [ -77.86782629399994, -2.990255634999897 ], [ -77.941465209999961, -3.054541116999957 ], [ -78.042544311999904, -3.189933369999949 ], [ -78.104917765999858, -3.245433857999927 ], [ -78.148170938999925, -3.322431742999939 ], [ -78.196410888999935, -3.363669534999943 ], [ -78.154527140999846, -3.456790465999859 ], [ -78.163725545999938, -3.477254332999919 ], [ -78.226305704999845, -3.507019958999905 ], [ -78.257182372999921, -3.409558206999918 ], [ -78.33397355199989, -3.384546813999918 ], [ -78.36172379599995, -3.408524677999935 ], [ -78.355290079999889, -3.44552500399989 ], [ -78.375871848407087, -3.529348454167859 ], [ -78.645271573424338, -3.539370212165579 ], [ -78.684364794299825, -3.579316094662033 ], [ -78.822185839404938, -3.547018323836596 ], [ -78.864043748919869, -3.497305597075638 ], [ -78.873603889407946, -3.449608250120662 ], [ -78.84939347982521, -3.389146823567046 ], [ -78.938974575616157, -3.3227426076852 ], [ -78.937579311635886, -3.287809339429486 ], [ -78.671652390645306, -3.090767103918722 ], [ -78.656097784884878, -3.008446547070491 ], [ -78.56992733377939, -2.839206231182629 ], [ -78.598685268710142, -2.785927830105265 ], [ -78.566387498784025, -2.720815524516865 ], [ -78.421435105945363, -2.627022800162081 ], [ -78.427842984166375, -2.601494642763555 ], [ -78.472103848014171, -2.568266696850571 ], [ -78.510266892902791, -2.585216566591271 ], [ -78.526364101921729, -2.622837009120701 ], [ -78.550264452242686, -2.612501723175967 ], [ -78.549101732259146, -2.562944024247315 ], [ -78.528043585842795, -2.562220553835516 ], [ -78.490242276160075, -2.505893243278535 ], [ -78.481224738031244, -2.380681248141116 ], [ -78.579900886316864, -2.311538181142168 ], [ -78.544631721276915, -2.286888522887011 ], [ -78.530162320234865, -2.240379733437976 ], [ -78.497812872565987, -2.210510756266387 ], [ -78.500577562104809, -2.127104993800458 ], [ -78.445800544259669, -2.075221855803989 ], [ -78.489544644169996, -1.964840996914461 ], [ -78.415647346248022, -1.854356785237485 ], [ -78.44835852732416, -1.755654798530145 ], [ -78.44758338096824, -1.705993747713308 ], [ -78.359397549157563, -1.621709487003216 ], [ -78.363092413783875, -1.541611015535921 ], [ -78.30653255923022, -1.484560234567198 ], [ -78.218553432994497, -1.482079765868491 ], [ -78.172561408382251, -1.446991468881208 ], [ -78.129282395566065, -1.45624155010745 ], [ -78.069776984320356, -1.520733738071556 ], [ -78.008979661881881, -1.668114922765483 ], [ -77.948544073749986, -1.655609225585295 ], [ -77.914127570331118, -1.668114922765483 ], [ -77.829481574415126, -1.924843437574566 ], [ -77.753155483738567, -1.950785007022489 ], [ -77.710625779755901, -2.02246021866415 ], [ -77.384263272432065, -2.154338473541713 ], [ -77.123064744842111, -2.313656914634919 ], [ -76.992891812307278, -2.506048272010162 ], [ -76.918271043973505, -2.540361422641524 ], [ -76.831351284034497, -2.529974459853463 ], [ -76.725905524120606, -2.577051690083465 ], [ -76.669661558234338, -2.564588924739098 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-Z", "NAME_1": "Zamora Chinchipe" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.375871848407087, -3.529348454167859 ], [ -78.402393147999902, -3.594353128999927 ], [ -78.400739501999936, -3.679825947999859 ], [ -78.425854248999968, -3.689437763999962 ], [ -78.419678914999878, -3.791033629999959 ], [ -78.480682942999863, -3.849531351999957 ], [ -78.497632812999967, -3.949576924999946 ], [ -78.562073323999869, -3.979755960999853 ], [ -78.576620239999926, -4.10005869499993 ], [ -78.682427734999891, -4.326918232999972 ], [ -78.673151814999954, -4.401539000999946 ], [ -78.637210855999882, -4.435128681999885 ], [ -78.66979284699994, -4.493419697999911 ], [ -78.68167842699998, -4.567110290999935 ], [ -78.853063314999929, -4.652273049999877 ], [ -78.898641927999932, -4.694234313999885 ], [ -78.928614257999868, -4.74746103899993 ], [ -78.90021805899994, -4.843682555999891 ], [ -78.910811726999924, -4.863526305999883 ], [ -78.980342366999935, -4.873964944999912 ], [ -79.009281168999877, -4.960109557999914 ], [ -79.06392899599993, -5.011372578999939 ], [ -79.104159097999883, -4.980056660999935 ], [ -79.303216715999952, -4.961246438999922 ], [ -79.341043863999914, -4.904247333999933 ], [ -79.378070027999883, -4.884816995999955 ], [ -79.395329956999973, -4.847609964999947 ], [ -79.450572062999896, -4.810196227999882 ], [ -79.460823144172764, -4.770455598247281 ], [ -79.33158627009027, -4.60819386225694 ], [ -79.318357103397602, -4.513419285071961 ], [ -79.29151119728391, -4.482258395808344 ], [ -79.266422288557749, -4.477659193616887 ], [ -79.205056525338364, -4.50298064454114 ], [ -79.156093105612342, -4.469545993952465 ], [ -79.113537564107276, -4.407999362680471 ], [ -79.102633837381688, -4.206047864817094 ], [ -79.154775356897176, -4.138765150691142 ], [ -79.135887620817016, -4.032104993950327 ], [ -79.139608323865048, -3.947303969302766 ], [ -79.119247810338152, -3.883121839701175 ], [ -79.193558519410146, -3.731038100028286 ], [ -79.152863328979436, -3.71010914482116 ], [ -79.143949143638054, -3.676777846120729 ], [ -79.102246262854749, -3.636005140424913 ], [ -79.065478481946343, -3.619417005890114 ], [ -79.046306525026068, -3.474722995469847 ], [ -79.055091519158282, -3.412246189110363 ], [ -78.938974575616157, -3.3227426076852 ], [ -78.84939347982521, -3.389146823567046 ], [ -78.873603889407946, -3.449608250120662 ], [ -78.864043748919869, -3.497305597075638 ], [ -78.822185839404938, -3.547018323836596 ], [ -78.684364794299825, -3.579316094662033 ], [ -78.645271573424338, -3.539370212165579 ], [ -78.375871848407087, -3.529348454167859 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-L", "NAME_1": "Loja" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -80.325505737999919, -4.015412698999938 ], [ -80.259075683999868, -3.943685810999852 ], [ -80.181147623999891, -3.907925719999923 ], [ -80.165073793999909, -3.880695936999885 ], [ -80.01363766134898, -3.86239959096838 ], [ -79.934831101973771, -3.829533380261296 ], [ -79.741328700559052, -3.832840671259987 ], [ -79.606272345892023, -3.751915377492708 ], [ -79.559763557342308, -3.794858493524657 ], [ -79.446385464017908, -3.80514210352527 ], [ -79.415302090019452, -3.793359876756938 ], [ -79.396362677995171, -3.7656096330781 ], [ -79.402538011320132, -3.721839694746109 ], [ -79.366338671192693, -3.653316746270832 ], [ -79.379722866616987, -3.620295505033539 ], [ -79.427988654352873, -3.589444675031757 ], [ -79.485943772886799, -3.628408704697961 ], [ -79.467753668796774, -3.511671644430862 ], [ -79.422769335436442, -3.449349866802947 ], [ -79.456617398074457, -3.415760185684007 ], [ -79.457754278736957, -3.328013603445072 ], [ -79.317866176982477, -3.346772149215326 ], [ -79.281692674377382, -3.449918307583857 ], [ -79.236553311386217, -3.4607703592647 ], [ -79.184902717386478, -3.44206348943851 ], [ -79.130487433847975, -3.537509861091223 ], [ -79.120436366944773, -3.610942071019792 ], [ -79.102246262854749, -3.636005140424913 ], [ -79.143949143638054, -3.676777846120729 ], [ -79.152863328979436, -3.71010914482116 ], [ -79.193558519410146, -3.731038100028286 ], [ -79.119247810338152, -3.883121839701175 ], [ -79.139608323865048, -3.947303969302766 ], [ -79.135887620817016, -4.032104993950327 ], [ -79.154775356897176, -4.138765150691142 ], [ -79.102633837381688, -4.206047864817094 ], [ -79.113537564107276, -4.407999362680471 ], [ -79.156093105612342, -4.469545993952465 ], [ -79.205056525338364, -4.50298064454114 ], [ -79.266422288557749, -4.477659193616887 ], [ -79.29151119728391, -4.482258395808344 ], [ -79.318357103397602, -4.513419285071961 ], [ -79.33158627009027, -4.60819386225694 ], [ -79.460823144172764, -4.770455598247281 ], [ -79.527854166999902, -4.618063252999974 ], [ -79.507209431999883, -4.531556904999974 ], [ -79.557774821999914, -4.516570739999906 ], [ -79.657975422999925, -4.438746031999955 ], [ -79.795744791999965, -4.484738056999944 ], [ -79.832874308999862, -4.478950296999884 ], [ -79.904084431999905, -4.398645120999959 ], [ -79.9820124929999, -4.388619892999941 ], [ -80.079655110999909, -4.309038187999917 ], [ -80.140245727999883, -4.283096617999959 ], [ -80.205047973999882, -4.298186136999959 ], [ -80.255406656999867, -4.386759541999936 ], [ -80.382866577999891, -4.476263121999949 ], [ -80.469967203999971, -4.446084085999942 ], [ -80.4885448819999, -4.395957946999928 ], [ -80.345271972999882, -4.198450621999967 ], [ -80.469605468999958, -4.213230081999882 ], [ -80.512212686999931, -4.064195251999891 ], [ -80.481077636999885, -3.99877288799992 ], [ -80.447694661999918, -3.982753193999955 ], [ -80.407102823999878, -3.982443135999887 ], [ -80.325505737999919, -4.015412698999938 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-O", "NAME_1": "El Oro" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -80.165073793999909, -3.880695936999885 ], [ -80.188769897999862, -3.857696226999892 ], [ -80.226312825999855, -3.749279072999926 ], [ -80.216390950999966, -3.631560159999935 ], [ -80.224995076999903, -3.59187265999995 ], [ -80.249980631999904, -3.577713317999908 ], [ -80.240291300999871, -3.514047952999917 ], [ -80.271633056999889, -3.485522562999961 ], [ -80.265664428999855, -3.426404723999894 ], [ -80.340728666670429, -3.393497653515368 ], [ -80.341053839999915, -3.368584893999923 ], [ -80.30687415299991, -3.320733330999929 ], [ -80.314320441999939, -3.376071872999944 ], [ -80.286447719999899, -3.320733330999929 ], [ -80.259103969999899, -3.348077080999929 ], [ -80.135568813999896, -3.327569268999923 ], [ -80.059885219999899, -3.204034112999921 ], [ -80.037505662999934, -3.20826588299991 ], [ -80.039947068999936, -3.279880466999941 ], [ -80.029204881999931, -3.273532809999949 ], [ -79.953195766999897, -3.197442315999922 ], [ -79.933338995999918, -3.115411065999922 ], [ -79.89589342508755, -3.045437722386621 ], [ -79.760474819956983, -3.06467050483991 ], [ -79.638518438974756, -3.128852633542238 ], [ -79.600432909351298, -3.161718845148584 ], [ -79.594696824698701, -3.204351901918756 ], [ -79.632162237597186, -3.290909925752487 ], [ -79.667767300320634, -3.319848727836529 ], [ -79.614850632650587, -3.329873955418691 ], [ -79.507932095289959, -3.312975762521432 ], [ -79.457754278736957, -3.328013603445072 ], [ -79.456617398074457, -3.415760185684007 ], [ -79.422769335436442, -3.449349866802947 ], [ -79.467753668796774, -3.511671644430862 ], [ -79.48772660959537, -3.618693535478315 ], [ -79.481267056329557, -3.635333346856498 ], [ -79.427988654352873, -3.589444675031757 ], [ -79.373056606876901, -3.628357028753896 ], [ -79.368354050998619, -3.669078056706951 ], [ -79.402538011320132, -3.721839694746109 ], [ -79.40755062466161, -3.785505058611591 ], [ -79.446385464017908, -3.80514210352527 ], [ -79.559763557342308, -3.794858493524657 ], [ -79.606272345892023, -3.751915377492708 ], [ -79.741328700559052, -3.832840671259987 ], [ -79.934831101973771, -3.829533380261296 ], [ -80.01363766134898, -3.86239959096838 ], [ -80.165073793999909, -3.880695936999885 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-G", "NAME_1": "Guayas" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -80.059885219999899, -2.662774346999925 ], [ -80.014515753999945, -2.664239190999922 ], [ -79.902821417999917, -2.717461846999925 ], [ -79.907215949999909, -2.732354424999926 ], [ -79.995187954999949, -2.798028252999927 ], [ -80.131033119999927, -3.020920851999961 ], [ -80.203724738999938, -3.034112237999921 ], [ -80.26593990799995, -3.018487237999921 ], [ -80.262203789999944, -2.840848014999949 ], [ -80.210682745999918, -2.724867445999962 ], [ -80.059885219999899, -2.662774346999925 ] ] ], [ [ [ -79.89589342508755, -3.045437722386621 ], [ -79.874867316999939, -3.005466403999947 ], [ -79.881214972999942, -2.965427341999941 ], [ -79.834584113999938, -2.806817315999922 ], [ -79.776437954999949, -2.65943775799991 ], [ -79.726429816999939, -2.593845309999949 ], [ -79.745025193999936, -2.490166924999926 ], [ -79.789540167999917, -2.481052341999941 ], [ -79.839466925999943, -2.377048434999949 ], [ -79.839833136999914, -2.209567966999941 ], [ -79.868641730999911, -2.160902601999908 ], [ -79.861887173999946, -2.108005466999941 ], [ -79.818348761999914, -2.079847914999959 ], [ -79.765614386999914, -2.004978122999944 ], [ -79.831369594999899, -2.043552341999941 ], [ -79.834584113999938, -2.07000090899993 ], [ -79.874338344999899, -2.075372002999927 ], [ -79.891957160999937, -2.115899346999925 ], [ -79.901844855999911, -2.18482838299991 ], [ -79.863026495999918, -2.297133070999962 ], [ -79.878570115999935, -2.49187590899993 ], [ -79.896107550999943, -2.543389580999929 ], [ -79.933216925999943, -2.580254815999922 ], [ -79.998402472999942, -2.608168226999908 ], [ -80.063588019999941, -2.577243747999944 ], [ -80.068918423999946, -2.560804945999962 ], [ -80.02570553299995, -2.52507903399993 ], [ -80.001779751999948, -2.48015715899993 ], [ -79.97484290299991, -2.477227471999925 ], [ -79.943755662999934, -2.498304945999962 ], [ -79.929676886999914, -2.484144789999959 ], [ -79.936350063999896, -2.462985934999949 ], [ -79.940825975999928, -2.483982028999947 ], [ -79.977935350999928, -2.45671965899993 ], [ -80.034331834999932, -2.47389088299991 ], [ -80.008941209999932, -2.358819268999923 ], [ -79.977935350999928, -2.347426039999959 ], [ -79.950021938999896, -2.307224216999941 ], [ -80.012684699999909, -2.326429945999962 ], [ -80.076039191999939, -2.457696221999925 ], [ -80.175119594999899, -2.586683851999908 ], [ -80.231800910999937, -2.628676039999959 ], [ -80.270008917999917, -2.605075778999947 ], [ -80.27961178299995, -2.61256275799991 ], [ -80.27961178299995, -2.649183851999908 ], [ -80.244252081999946, -2.699476820999962 ], [ -80.255482550999943, -2.730238539999959 ], [ -80.278431769999941, -2.727146091999941 ], [ -80.467884894999941, -2.617933851999908 ], [ -80.542747415450577, -2.52976243927536 ], [ -80.41076665945377, -2.416674574272179 ], [ -80.276516835683424, -2.367938822418751 ], [ -80.232020041891417, -2.299776686444943 ], [ -80.213445776201581, -2.110307938660469 ], [ -80.288407472127119, -2.017346144708824 ], [ -80.478271172476639, -1.931161345819476 ], [ -80.516087613252751, -1.840817559282925 ], [ -80.437539436295936, -1.835701593153999 ], [ -80.396069098609985, -1.746198011728893 ], [ -80.329303148421559, -1.687131850054868 ], [ -80.299744228713166, -1.697622165630435 ], [ -80.221170214234007, -1.680672295889735 ], [ -80.226001960422138, -1.61891895904273 ], [ -80.267911546780454, -1.59519947677444 ], [ -80.283259446965872, -1.567655937771349 ], [ -80.222048713377433, -1.559439386218685 ], [ -80.188174812317698, -1.536546726250435 ], [ -80.201636522107776, -1.480684502787597 ], [ -80.191973028832194, -1.431178480702329 ], [ -80.130891485553605, -1.397743829214335 ], [ -80.124328578601023, -1.333975111662085 ], [ -80.043299933844878, -1.271808362765739 ], [ -79.983742844856408, -1.118432711900141 ], [ -79.975164558097845, -1.138224785545447 ], [ -79.937699144300041, -1.142875664580288 ], [ -79.853053148384049, -1.088305352310158 ], [ -79.712183193799319, -0.872246188610745 ], [ -79.535889045443071, -0.837467949985921 ], [ -79.517078823728696, -0.860463961842356 ], [ -79.53278845912007, -0.959527682856276 ], [ -79.561675585260048, -0.986709485754147 ], [ -79.580950894068508, -1.050633232937344 ], [ -79.673761765592985, -1.114298597702145 ], [ -79.686396653982399, -1.146648043572384 ], [ -79.738305630400532, -1.184836927781987 ], [ -79.748149990829404, -1.235169773066559 ], [ -79.847317063731509, -1.399139093194606 ], [ -79.870545619584675, -1.519028415728826 ], [ -79.859693569702472, -1.633698418447239 ], [ -79.758872850401701, -1.696691989643625 ], [ -79.649525520286545, -1.906549980697037 ], [ -79.523615892259613, -1.885155937496506 ], [ -79.482429776313097, -1.897454929101684 ], [ -79.372953254089396, -1.970111992674333 ], [ -79.285930142262259, -2.107674656260372 ], [ -79.235493944190182, -2.154338473541713 ], [ -79.17164771227209, -2.16198658611205 ], [ -79.139944220649227, -2.146535333139127 ], [ -79.130074021798634, -2.203689466895412 ], [ -79.192008225798986, -2.266941419610816 ], [ -79.352644415607301, -2.303321627790922 ], [ -79.416387294737831, -2.347918388422897 ], [ -79.425146451347644, -2.421815688143511 ], [ -79.514314134189931, -2.495196222127959 ], [ -79.489741991199935, -2.51777882193511 ], [ -79.437393765210061, -2.497056573202315 ], [ -79.419100308332531, -2.545529066513211 ], [ -79.690556606602115, -2.825718682071511 ], [ -79.703579067719772, -2.874966321738384 ], [ -79.69484575133032, -2.957131849854989 ], [ -79.74884762192022, -3.023691094468461 ], [ -79.760474819956983, -3.06467050483991 ], [ -79.89589342508755, -3.045437722386621 ] ] ], [ [ [ -79.819639715999926, -2.485910851999961 ], [ -79.772570694999899, -2.541987347999907 ], [ -79.828701939999917, -2.592050637999932 ], [ -79.833236679999914, -2.636017324999955 ], [ -79.877239380999924, -2.649677722999911 ], [ -79.881801126999903, -2.62693980399996 ], [ -79.819639715999926, -2.485910851999961 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-W", "NAME_1": "Galápagos" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -89.661284959999932, -1.340101820999962 ], [ -89.614572719999899, -1.370049737999921 ], [ -89.613270636999914, -1.391696872999944 ], [ -89.67609615799995, -1.397556247999944 ], [ -89.756906704999949, -1.36060963299991 ], [ -89.736398891999897, -1.340101820999962 ], [ -89.661284959999932, -1.340101820999962 ] ] ], [ [ [ -90.380686001999948, -1.254489841999941 ], [ -90.367054816999939, -1.278741143999923 ], [ -90.432118292999917, -1.345961195999962 ], [ -90.475209113999938, -1.342054945999962 ], [ -90.524037238999938, -1.30592213299991 ], [ -90.471913214999915, -1.216729424999926 ], [ -90.380686001999948, -1.254489841999941 ] ] ], [ [ [ -89.308094855999911, -0.685642184999949 ], [ -89.257191535999937, -0.681573174999926 ], [ -89.273182745999918, -0.759942315999922 ], [ -89.331695115999935, -0.819431247999944 ], [ -89.367298956999946, -0.82976653399993 ], [ -89.420033331999946, -0.919366143999923 ], [ -89.544585740999935, -0.956638278999947 ], [ -89.629953579999949, -0.925876559999949 ], [ -89.604603644999941, -0.883070570999962 ], [ -89.55142167899993, -0.853610934999949 ], [ -89.540882941999939, -0.819431247999944 ], [ -89.47720292899993, -0.796807549999926 ], [ -89.413238084999932, -0.713474216999941 ], [ -89.366444464999915, -0.689629815999922 ], [ -89.308094855999911, -0.685642184999949 ] ] ], [ [ [ -90.191965298999946, -0.538262627999927 ], [ -90.180531378999945, -0.54851653399993 ], [ -90.198801235999952, -0.681573174999926 ], [ -90.259510870999918, -0.743340752999927 ], [ -90.313628709999932, -0.74382903399993 ], [ -90.337066209999932, -0.776950778999947 ], [ -90.428863084999932, -0.762465101999908 ], [ -90.48306230399993, -0.702732028999947 ], [ -90.544545050999943, -0.681573174999926 ], [ -90.52757727799991, -0.569919528999947 ], [ -90.460560675999943, -0.513848565999922 ], [ -90.407948370999918, -0.517754815999922 ], [ -90.26398678299995, -0.483005466999941 ], [ -90.24282792899993, -0.497247002999927 ], [ -90.240589972999942, -0.528008721999925 ], [ -90.191965298999946, -0.538262627999927 ] ] ], [ [ [ -91.401112433999913, -0.452894789999959 ], [ -91.507557745999918, -0.490411065999922 ], [ -91.606516079999949, -0.45631275799991 ], [ -91.651966925999943, -0.381117445999962 ], [ -91.668568488999938, -0.284926039999959 ], [ -91.580962693999936, -0.287204684999949 ], [ -91.474191860999895, -0.24928150799991 ], [ -91.455677863999938, -0.257582289999959 ], [ -91.399525519999941, -0.30787525799991 ], [ -91.401112433999913, -0.452894789999959 ] ] ], [ [ [ -90.565012173999946, -0.284926039999959 ], [ -90.551503058999913, -0.292738539999959 ], [ -90.558176235999952, -0.310804945999962 ], [ -90.586781378999945, -0.363702080999929 ], [ -90.604888475999928, -0.369805596999925 ], [ -90.740061001999948, -0.353936455999929 ], [ -90.795887824999909, -0.330661716999941 ], [ -90.818226691999939, -0.339613539999959 ], [ -90.848947719999899, -0.275648695999962 ], [ -90.874134894999941, -0.271254164999959 ], [ -90.831654425999943, -0.212660414999959 ], [ -90.82681230399993, -0.164157809999949 ], [ -90.777251756999931, -0.14771900799991 ], [ -90.632476365999935, -0.201267184999949 ], [ -90.551991339999915, -0.278090101999908 ], [ -90.565012173999946, -0.284926039999959 ] ] ], [ [ [ -90.811431443999936, -0.730645440999922 ], [ -90.791574673999946, -0.754001559999949 ], [ -90.829090949999909, -0.77467213299991 ], [ -90.860463019999941, -0.872653903999947 ], [ -90.858631964999915, -0.915459893999923 ], [ -90.880279100999928, -0.908786716999941 ], [ -90.928700324999909, -0.970310153999947 ], [ -90.993885870999918, -0.963474216999941 ], [ -91.159779425999943, -1.030205987999921 ], [ -91.399728969999899, -1.018487237999921 ], [ -91.43586178299995, -0.997491143999923 ], [ -91.445790167999917, -0.941501559999949 ], [ -91.477406378999945, -0.935479424999926 ], [ -91.502308722999942, -0.896254164999959 ], [ -91.465891079999949, -0.80787525799991 ], [ -91.310454881999931, -0.68328215899993 ], [ -91.234771287999934, -0.661879164999959 ], [ -91.157785610999895, -0.678806247999944 ], [ -91.086781378999945, -0.582452080999929 ], [ -91.106841600999928, -0.558689059999949 ], [ -91.161488410999937, -0.538262627999927 ], [ -91.208892381999931, -0.484633070999962 ], [ -91.238677537999934, -0.376153252999927 ], [ -91.374989386999914, -0.281914971999925 ], [ -91.373768683999913, -0.250176690999922 ], [ -91.40648352799991, -0.216403903999947 ], [ -91.40453040299991, -0.195896091999941 ], [ -91.380604620999918, -0.18873463299991 ], [ -91.405751105999911, -0.148044528999947 ], [ -91.423329230999911, -0.02857838299991 ], [ -91.476429816999939, -0.01108163899994 ], [ -91.563099738999938, -0.051771742999961 ], [ -91.603382941999939, -0.01421477699995 ], [ -91.604359503999945, 0.001450914000088 ], [ -91.504465298999946, 0.066148179000038 ], [ -91.497303839999915, 0.10610586100006 ], [ -91.452748175999943, 0.103745835000041 ], [ -91.368763800999943, 0.150620835000041 ], [ -91.339670376999948, 0.153794664000088 ], [ -91.323638475999928, 0.13930898600006 ], [ -91.28351803299995, 0.033189195000091 ], [ -91.247425910999937, -0.003838799999926 ], [ -91.20929928299995, -0.010674737999921 ], [ -91.173573370999918, -0.228448174999926 ], [ -91.128041144999941, -0.27076588299991 ], [ -91.124134894999941, -0.299574476999908 ], [ -91.005034959999932, -0.373142184999949 ], [ -90.956044074999909, -0.422133070999962 ], [ -90.949208136999914, -0.521416924999926 ], [ -90.990142381999931, -0.579196872999944 ], [ -90.967844204999949, -0.564548434999949 ], [ -90.956044074999909, -0.60711028399993 ], [ -90.892974412999934, -0.625746351999908 ], [ -90.894602016999897, -0.64812590899993 ], [ -90.859730597999942, -0.664157809999949 ], [ -90.859852667999917, -0.689629815999922 ], [ -90.811431443999936, -0.730645440999922 ] ] ], [ [ [ -90.513783331999946, 0.28351471600007 ], [ -90.544545050999943, 0.31085846600007 ], [ -90.542307094999899, 0.333563544000071 ], [ -90.504465298999946, 0.361029364000046 ], [ -90.436431443999936, 0.346625067000048 ], [ -90.407948370999918, 0.31085846600007 ], [ -90.454579230999911, 0.267401434000078 ], [ -90.513783331999946, 0.28351471600007 ] ] ], [ [ [ -90.797759568999936, 0.653509833000044 ], [ -90.756988084999932, 0.630601304000038 ], [ -90.744496222999942, 0.58539459800005 ], [ -90.760568813999896, 0.553697007000039 ], [ -90.805246548999946, 0.571600653000075 ], [ -90.797759568999936, 0.653509833000044 ] ] ], [ [ [ -91.819162563999896, 1.386419989000046 ], [ -91.810943162999934, 1.377183335000041 ], [ -91.817738410999937, 1.368068752000056 ], [ -91.825306769999941, 1.377020575000074 ], [ -91.819162563999896, 1.386419989000046 ] ] ], [ [ [ -91.822010870999918, 1.394476630000042 ], [ -91.817534959999932, 1.394761460000041 ], [ -91.820464647999927, 1.39134349200009 ], [ -91.822010870999918, 1.394476630000042 ] ] ], [ [ [ -92.011586066999939, 1.658636786000045 ], [ -92.00609290299991, 1.66437409100007 ], [ -91.999826626999948, 1.651190497000073 ], [ -92.006662563999896, 1.649603583000044 ], [ -92.011586066999939, 1.658636786000045 ] ] ], [ [ [ -89.957117753210582, 0.341870937337148 ], [ -89.936668733838701, 0.327995159529848 ], [ -89.944702239599451, 0.303895008840129 ], [ -89.952005426654637, 0.317770860016822 ], [ -89.970993712998279, 0.309737474712847 ], [ -89.957117753210582, 0.341870937337148 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-SE", "NAME_1": "Santa Elena" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -80.542747415450577, -2.52976243927536 ], [ -80.656646287999934, -2.415785414999959 ], [ -80.803456183999913, -2.374769789999959 ], [ -80.86392167899993, -2.329278252999927 ], [ -80.913644985999952, -2.318780205999929 ], [ -80.934803839999915, -2.260918877999927 ], [ -81.010894334999932, -2.176690362999921 ], [ -81.001210089999915, -2.164483330999929 ], [ -80.949330206999946, -2.186211846999925 ], [ -80.931286318999923, -2.217333015999941 ], [ -80.906342922999897, -2.216258380999932 ], [ -80.780702356999939, -2.142843412999923 ], [ -80.744979189999924, -2.102914607999935 ], [ -80.737446656999907, -2.043497173999924 ], [ -80.762521938999896, -1.97389088299991 ], [ -80.733185043999924, -1.953769676999912 ], [ -80.733021613999938, -1.90398528399993 ], [ -80.782134568999936, -1.736993096999925 ], [ -80.818164557642575, -1.676979241717978 ], [ -80.624866502586997, -1.655867608003689 ], [ -80.563810797730127, -1.667339775510243 ], [ -80.539807094621722, -1.727387790913838 ], [ -80.561537034606431, -1.816994724227129 ], [ -80.516087613252751, -1.840817559282925 ], [ -80.478271172476639, -1.931161345819476 ], [ -80.288407472127119, -2.017346144708824 ], [ -80.213445776201581, -2.110307938660469 ], [ -80.232020041891417, -2.299776686444943 ], [ -80.276516835683424, -2.367938822418751 ], [ -80.41076665945377, -2.416674574272179 ], [ -80.542747415450577, -2.52976243927536 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-M", "NAME_1": "Manabi" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -80.818164557642575, -1.676979241717978 ], [ -80.855580206999946, -1.588311455999929 ], [ -80.816489555999908, -1.552254752999943 ], [ -80.82054602799991, -1.499932549999926 ], [ -80.770861664999927, -1.477829952999912 ], [ -80.764290159999916, -1.390887025999916 ], [ -80.74266293699992, -1.368161967999924 ], [ -80.744256335999921, -1.343773381999938 ], [ -80.882150844999899, -1.14576588299991 ], [ -80.916180217999909, -1.065524767999932 ], [ -80.909610914999917, -1.044915051999908 ], [ -80.816365198999904, -0.946343556999921 ], [ -80.722245176999934, -0.931125513999916 ], [ -80.690874930999939, -0.949588742999936 ], [ -80.653041719999919, -0.923064662999934 ], [ -80.616320398999903, -0.941408096999908 ], [ -80.569883134999941, -0.912242570999922 ], [ -80.547211961999949, -0.888489750999952 ], [ -80.497561625999936, -0.692437544999962 ], [ -80.448969096999917, -0.60606015299993 ], [ -80.421991646999913, -0.599599732999934 ], [ -80.405824602999928, -0.646034024999949 ], [ -80.37879806299992, -0.657885419999957 ], [ -80.299006949999921, -0.66222862099994 ], [ -80.298996049999914, -0.650355188999924 ], [ -80.391737228999943, -0.625486672999955 ], [ -80.437125419999916, -0.557538114999943 ], [ -80.452056443999936, -0.476739190999922 ], [ -80.496463547999952, -0.381374052999945 ], [ -80.432724739999912, -0.339187023999955 ], [ -80.371232334999945, -0.222830502999955 ], [ -80.349658206999948, -0.215264482999942 ], [ -80.323695251999936, -0.173172607999959 ], [ -80.305350455999928, -0.189366935999942 ], [ -80.231847859999903, -0.139698740999961 ], [ -80.107899542999917, 0.007066148000092 ], [ -80.098784959999932, 0.039211330000057 ], [ -80.066458956999952, 0.052209779000066 ], [ -80.036976691999939, 0.175970770000049 ], [ -80.048491990999935, 0.318304755000042 ], [ -80.036529100999928, 0.357082424000055 ], [ -80.012684699999909, 0.32453034100007 ], [ -79.999521235313509, 0.345101779873908 ], [ -79.961211920993321, 0.266082261886879 ], [ -79.933435838892819, 0.259674384565187 ], [ -79.889665899661509, 0.318688870295091 ], [ -79.814580044233651, 0.322667954862197 ], [ -79.75269751707674, 0.369280097098795 ], [ -79.717583380768417, 0.370778712967194 ], [ -79.695595059264576, 0.347110907542344 ], [ -79.71223486974344, 0.303651028472189 ], [ -79.652186856138485, 0.259157619728342 ], [ -79.702106289373717, 0.187430732142559 ], [ -79.682133347675858, 0.170429185558476 ], [ -79.659602423812771, 0.175958563736742 ], [ -79.649938931436509, 0.145676174515813 ], [ -79.623945686044578, 0.15389272696774 ], [ -79.567850917685689, 0.116530666856761 ], [ -79.619010586169622, 0.042116604097998 ], [ -79.595549486319726, -0.013590589733951 ], [ -79.607305873767018, -0.040824069475264 ], [ -79.598753425430232, -0.07177825316387 ], [ -79.496692470880816, -0.161850273571304 ], [ -79.411426358239851, -0.188101902280948 ], [ -79.410263638256311, -0.398269951696932 ], [ -79.449072639190945, -0.462297051667633 ], [ -79.536044074174697, -0.691016941278804 ], [ -79.578728806888932, -0.723108004730648 ], [ -79.619630702894597, -0.850232028685184 ], [ -79.722363451012427, -0.881237887418592 ], [ -79.841451788769007, -1.074817804098416 ], [ -79.904367844700232, -1.129749850675069 ], [ -79.969738531807764, -1.139775079156607 ], [ -79.977334968434036, -1.114712008852109 ], [ -79.993096279769475, -1.128819674688259 ], [ -80.043299933844878, -1.271808362765739 ], [ -80.124328578601023, -1.333975111662085 ], [ -80.130891485553605, -1.397743829214335 ], [ -80.191973028832194, -1.431178480702329 ], [ -80.201636522107776, -1.480684502787597 ], [ -80.188174812317698, -1.536546726250435 ], [ -80.222048713377433, -1.559439386218685 ], [ -80.283259446965872, -1.567655937771349 ], [ -80.267911546780454, -1.59519947677444 ], [ -80.226001960422138, -1.61891895904273 ], [ -80.221170214234007, -1.680672295889735 ], [ -80.299744228713166, -1.697622165630435 ], [ -80.329303148421559, -1.687131850054868 ], [ -80.396069098609985, -1.746198011728893 ], [ -80.437539436295936, -1.835701593153999 ], [ -80.516087613252751, -1.840817559282925 ], [ -80.552803718217035, -1.828105156527783 ], [ -80.562880621743261, -1.798029472881865 ], [ -80.539807094621722, -1.727387790913838 ], [ -80.577401699628695, -1.65974334068261 ], [ -80.818164557642575, -1.676979241717978 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-A", "NAME_1": "Azuay" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -79.437393765210061, -2.497056573202315 ], [ -79.388120287121524, -2.507753595252211 ], [ -79.349233770921785, -2.569972019193358 ], [ -79.29399166508324, -2.588007093652436 ], [ -79.163612026973453, -2.731667576197708 ], [ -79.142579718978823, -2.728515313031266 ], [ -79.137928839943982, -2.703297213995256 ], [ -79.078707647739748, -2.650845636117197 ], [ -79.060517543649723, -2.654256279903393 ], [ -78.951041022325285, -2.762156670993591 ], [ -78.915151739661042, -2.822514743860324 ], [ -78.816191372333947, -2.822514743860324 ], [ -78.784229499192008, -2.699628187790665 ], [ -78.725576747768685, -2.690998223289398 ], [ -78.638011033582302, -2.644024346746221 ], [ -78.610674201053541, -2.59736052766624 ], [ -78.564423794022844, -2.561600437110485 ], [ -78.549101732259146, -2.562944024247315 ], [ -78.554036831234782, -2.602269789119475 ], [ -78.533314581602667, -2.62392221383908 ], [ -78.480707974093718, -2.568111667219682 ], [ -78.421357590680259, -2.618496188448376 ], [ -78.436783006130838, -2.645264581095546 ], [ -78.557705858338693, -2.709963473735343 ], [ -78.597470872782537, -2.779158216678354 ], [ -78.56992733377939, -2.839206231182629 ], [ -78.656097784884878, -3.008446547070491 ], [ -78.671652390645306, -3.090767103918722 ], [ -78.937579311635886, -3.287809339429486 ], [ -78.938974575616157, -3.3227426076852 ], [ -79.055091519158282, -3.412246189110363 ], [ -79.05023393364911, -3.552134290864842 ], [ -79.065478481946343, -3.619417005890114 ], [ -79.084676276389018, -3.633317966151253 ], [ -79.102246262854749, -3.636005140424913 ], [ -79.120436366944773, -3.610942071019792 ], [ -79.123356086114484, -3.557043551418758 ], [ -79.178779060005581, -3.448161309297006 ], [ -79.236553311386217, -3.4607703592647 ], [ -79.281692674377382, -3.449918307583857 ], [ -79.317866176982477, -3.346772149215326 ], [ -79.43258785744365, -3.338090508769994 ], [ -79.507932095289959, -3.312975762521432 ], [ -79.614850632650587, -3.329873955418691 ], [ -79.667767300320634, -3.319848727836529 ], [ -79.626891241837313, -3.281608167682805 ], [ -79.595161912692106, -3.174999687785373 ], [ -79.638518438974756, -3.128852633542238 ], [ -79.760474819956983, -3.06467050483991 ], [ -79.74884762192022, -3.023691094468461 ], [ -79.69484575133032, -2.957131849854989 ], [ -79.703579067719772, -2.874966321738384 ], [ -79.690556606602115, -2.825718682071511 ], [ -79.424836392085808, -2.555347588520419 ], [ -79.417162441993071, -2.534160250894899 ], [ -79.437393765210061, -2.497056573202315 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-F", "NAME_1": "Cañar" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -79.1529150049235, -2.735026544039783 ], [ -79.29399166508324, -2.588007093652436 ], [ -79.349233770921785, -2.569972019193358 ], [ -79.388120287121524, -2.507753595252211 ], [ -79.437393765210061, -2.497056573202315 ], [ -79.489741991199935, -2.51777882193511 ], [ -79.512867194265596, -2.508838799970647 ], [ -79.514314134189931, -2.495196222127959 ], [ -79.425146451347644, -2.421815688143511 ], [ -79.425663215285169, -2.360734144864921 ], [ -79.364788377581533, -2.308540947606673 ], [ -79.192008225798986, -2.266941419610816 ], [ -79.130074021798634, -2.203689466895412 ], [ -79.116741503217781, -2.245030612472817 ], [ -79.028374803354495, -2.345127862261052 ], [ -78.945072394575334, -2.397372734564044 ], [ -78.862441779364588, -2.389983005311478 ], [ -78.762034471213838, -2.325955906240097 ], [ -78.598762783975303, -2.302546481435002 ], [ -78.481224738031244, -2.380681248141116 ], [ -78.490242276160075, -2.505893243278535 ], [ -78.517708298998798, -2.549663180711207 ], [ -78.600545619784498, -2.586611829672222 ], [ -78.638011033582302, -2.644024346746221 ], [ -78.725576747768685, -2.690998223289398 ], [ -78.784229499192008, -2.699628187790665 ], [ -78.816191372333947, -2.822514743860324 ], [ -78.930008714330711, -2.817088717570243 ], [ -78.951041022325285, -2.762156670993591 ], [ -79.072041388898981, -2.649967136074451 ], [ -79.132347784922331, -2.696992689461069 ], [ -79.1529150049235, -2.735026544039783 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-N", "NAME_1": "Napo" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.391436936665286, -0.963558445166143 ], [ -78.331673143001126, -1.059831638219521 ], [ -78.34508317684714, -1.164269707780818 ], [ -78.291933966979002, -1.140240167150012 ], [ -78.221524828108329, -1.139981784731617 ], [ -78.175791185015157, -1.184165134213572 ], [ -78.119696417555588, -1.200649915960867 ], [ -78.114167040276698, -1.342553398420591 ], [ -78.148170131646225, -1.424357192230673 ], [ -78.201655240097239, -1.474483331040915 ], [ -78.30653255923022, -1.484560234567198 ], [ -78.353377244564172, -1.526366469037328 ], [ -78.36893185122392, -1.493190199068465 ], [ -78.480087857368687, -1.440583590660196 ], [ -78.515434535875102, -1.480116062006687 ], [ -78.619717576704772, -1.489831231226333 ], [ -78.698575812024103, -1.478100681301385 ], [ -78.799964973005103, -1.424357192230673 ], [ -78.880735236242117, -1.459238782743626 ], [ -78.927554084053725, -1.383171074485517 ], [ -78.866239996778404, -1.17832569677347 ], [ -78.76691789424541, -1.131765232279633 ], [ -78.661239590334787, -1.138534844807225 ], [ -78.575120816072797, -1.102774752452888 ], [ -78.553287523300526, -1.060916842937957 ], [ -78.467840541707631, -1.080502211008252 ], [ -78.434380051797916, -1.044432061190662 ], [ -78.419988166021028, -0.988156426577859 ], [ -78.391436936665286, -0.963558445166143 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-T", "NAME_1": "Tungurahua" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.338571946737943, -1.164373060568323 ], [ -78.335729742833337, -1.045207207546582 ], [ -78.391436936665286, -0.963558445166143 ], [ -78.441537237953128, -0.938133639655746 ], [ -78.387793748882416, -0.813800143661695 ], [ -78.405053676985574, -0.710240574143199 ], [ -78.396759610167862, -0.684350680639398 ], [ -78.329657762295881, -0.660424492796096 ], [ -78.310873379003226, -0.598464451273401 ], [ -78.262297532904824, -0.531440117767204 ], [ -78.237467006597058, -0.452840263967005 ], [ -78.24565772242596, -0.399923598095597 ], [ -78.187444220574321, -0.296467379565911 ], [ -78.177263964260533, -0.180867200860632 ], [ -78.126801926867415, -0.169395032454815 ], [ -78.095175951409033, -0.184432875177038 ], [ -78.056909552833588, -0.132704765912251 ], [ -78.013139615400917, -0.135960381866141 ], [ -77.980350918160354, -0.100562025617023 ], [ -77.964486254037354, -0.047800387577809 ], [ -77.857025113418217, 0.001395575245567 ], [ -77.832685512626313, 0.031936346884891 ], [ -77.778942022656224, 0.015813300343552 ], [ -77.772120734184512, -0.066197198142163 ], [ -77.740288052251799, -0.078392836060573 ], [ -77.64086259603198, -0.081028333490792 ], [ -77.588979458035567, -0.100045260780178 ], [ -77.46487850603819, -0.023460788584543 ], [ -77.44392371330872, -0.060409437545502 ], [ -77.446455857951491, -0.124849948666224 ], [ -77.391058723381377, -0.139422702495722 ], [ -77.349975959323046, -0.131619561193816 ], [ -77.299410570041744, -0.058549085571826 ], [ -77.297911953274024, -0.19027231171782 ], [ -77.257681850836718, -0.25326588291415 ], [ -77.254503750147933, -0.309438164739504 ], [ -77.273184780653082, -0.360391126749107 ], [ -77.32323340509754, -0.387417900915409 ], [ -77.329047004115921, -0.424056491513909 ], [ -77.356564703798028, -0.425658461069133 ], [ -77.404029506756331, -0.504154962081827 ], [ -77.448006150663332, -0.507823988286418 ], [ -77.551539882659426, -0.458007907838692 ], [ -77.566474371694881, -0.49573170315557 ], [ -77.620166184821585, -0.536607760739571 ], [ -77.618796760162354, -0.552885836911855 ], [ -77.575285204248758, -0.577018731229487 ], [ -77.509707810666896, -0.655721937817191 ], [ -77.496607836082774, -0.69137867558544 ], [ -77.533272264203617, -0.780778904223041 ], [ -77.528466356437207, -0.841188653033896 ], [ -77.579109260084294, -0.940045667573486 ], [ -77.49921749509133, -0.945316664232678 ], [ -77.254994675663738, -0.833850599725395 ], [ -77.209545254310001, -0.764707532726447 ], [ -77.16481930156948, -0.722797947267452 ], [ -77.124201626403931, -0.707915134176119 ], [ -77.1186205722816, -0.730342706150964 ], [ -77.187711962437106, -0.803361504929512 ], [ -77.192466193360133, -0.852247410289749 ], [ -77.113995530769103, -0.904233901073667 ], [ -77.036144985802423, -0.925214532224913 ], [ -77.061879848775959, -0.963713473897712 ], [ -77.04283708396423, -0.987949721002849 ], [ -77.051647914719467, -1.010377292078374 ], [ -77.233755662993417, -1.024536634757908 ], [ -77.373023648022922, -1.079313652602991 ], [ -77.445525681964625, -1.087323499479908 ], [ -77.547069871677195, -1.13574431684674 ], [ -77.695613776354662, -1.151660657813125 ], [ -77.831109382392071, -1.221837252687067 ], [ -77.882062344401675, -1.214085789127864 ], [ -77.897177699691099, -1.23713347692842 ], [ -77.941955329275004, -1.223852634291632 ], [ -78.116518316866802, -1.23330942109294 ], [ -78.126801926867415, -1.194087009008285 ], [ -78.175791185015157, -1.184165134213572 ], [ -78.221524828108329, -1.139981784731617 ], [ -78.291933966979002, -1.140240167150012 ], [ -78.338571946737943, -1.164373060568323 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-H", "NAME_1": "Chimborazo" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.922334764237974, -2.40036996809954 ], [ -79.028374803354495, -2.345127862261052 ], [ -79.116741503217781, -2.245030612472817 ], [ -79.130074021798634, -2.203689466895412 ], [ -79.076330532727866, -2.175164075961334 ], [ -79.016360032589432, -2.09878630844139 ], [ -79.02558427629333, -2.046903170444978 ], [ -78.999591030901342, -1.918280530621985 ], [ -79.001709764394093, -1.781854749497086 ], [ -78.975199755064637, -1.760512384039316 ], [ -78.925667893658328, -1.752089125113059 ], [ -78.859754605090927, -1.663929131724046 ], [ -78.852649094879837, -1.540887546023441 ], [ -78.880735236242117, -1.459238782743626 ], [ -78.799964973005103, -1.424357192230673 ], [ -78.698575812024103, -1.478100681301385 ], [ -78.619717576704772, -1.489831231226333 ], [ -78.515434535875102, -1.480116062006687 ], [ -78.480087857368687, -1.440583590660196 ], [ -78.36893185122392, -1.493190199068465 ], [ -78.353377244564172, -1.526366469037328 ], [ -78.36531450096345, -1.549879245730608 ], [ -78.355651007687868, -1.612872816926995 ], [ -78.450167201555075, -1.717310885588915 ], [ -78.415647346248022, -1.854356785237485 ], [ -78.489544644169996, -1.964840996914461 ], [ -78.445800544259669, -2.075221855803989 ], [ -78.500577562104809, -2.127104993800458 ], [ -78.497812872565987, -2.210510756266387 ], [ -78.530162320234865, -2.240379733437976 ], [ -78.544631721276915, -2.286888522887011 ], [ -78.579900886316864, -2.311538181142168 ], [ -78.598762783975303, -2.302546481435002 ], [ -78.762034471213838, -2.325955906240097 ], [ -78.862441779364588, -2.389983005311478 ], [ -78.922334764237974, -2.40036996809954 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-B", "NAME_1": "Bolivar" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.866239996778404, -1.17832569677347 ], [ -78.927554084053725, -1.383171074485517 ], [ -78.852649094879837, -1.540887546023441 ], [ -78.859754605090927, -1.663929131724046 ], [ -78.925667893658328, -1.752089125113059 ], [ -78.975199755064637, -1.760512384039316 ], [ -79.001709764394093, -1.781854749497086 ], [ -78.999591030901342, -1.918280530621985 ], [ -79.02558427629333, -2.046903170444978 ], [ -79.016360032589432, -2.09878630844139 ], [ -79.076330532727866, -2.175164075961334 ], [ -79.130074021798634, -2.203689466895412 ], [ -79.139944220649227, -2.146535333139127 ], [ -79.17164771227209, -2.16198658611205 ], [ -79.235493944190182, -2.154338473541713 ], [ -79.205521613331769, -2.065041598590938 ], [ -79.279496425619527, -1.944893893638266 ], [ -79.258515795367657, -1.923086440187092 ], [ -79.22944780117507, -1.822937513555416 ], [ -79.252133754669046, -1.774878432293804 ], [ -79.250376756382195, -1.736172784146675 ], [ -79.299262660843112, -1.659588311051721 ], [ -79.343859423273727, -1.63834929748208 ], [ -79.292415533949736, -1.585277601979783 ], [ -79.266422288557749, -1.585794365917252 ], [ -79.2500925364414, -1.540887546023441 ], [ -79.318512132129172, -1.468023776875839 ], [ -79.318951381700913, -1.359244886642216 ], [ -79.292182989953005, -1.33444019875617 ], [ -79.337348192265267, -1.291135348417583 ], [ -79.377836677120911, -1.325913587941727 ], [ -79.385975715207053, -1.305656427202337 ], [ -79.327839727721255, -1.225196221428462 ], [ -79.137773811212412, -1.156208184060461 ], [ -79.082066617380463, -1.154916273767014 ], [ -78.990909389556691, -1.209279879562814 ], [ -78.951221890377951, -1.203440443921352 ], [ -78.906935187209115, -1.171556085145198 ], [ -78.866239996778404, -1.17832569677347 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-I", "NAME_1": "Imbabura" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.814081997386268, 0.345663966718689 ], [ -77.852477587170881, 0.29264394805972 ], [ -77.835501879008518, 0.26918284731056 ], [ -77.94536597396052, 0.161282457119682 ], [ -78.077683478409767, 0.197766018087236 ], [ -78.202172004034765, 0.134720770946785 ], [ -78.254881965230481, 0.142162177042849 ], [ -78.320330165804478, 0.188515936860995 ], [ -78.365366176907514, 0.16665680656638 ], [ -78.360689460350329, 0.217713121363431 ], [ -78.38670854416398, 0.242311102775147 ], [ -78.63106055390142, 0.215025946190451 ], [ -78.778105841811112, 0.239313870138972 ], [ -78.951661139949636, 0.211305243142419 ], [ -78.993854947148066, 0.228875230507469 ], [ -79.01070146410126, 0.267425849023709 ], [ -78.982847866735653, 0.271043199284236 ], [ -78.902465176226883, 0.386695054832899 ], [ -78.859961310665938, 0.422816881493873 ], [ -78.719608120018734, 0.402714749486108 ], [ -78.667414923659805, 0.372949124202705 ], [ -78.539205694986833, 0.51505931223744 ], [ -78.497399462315343, 0.542137763247183 ], [ -78.431176113586787, 0.55133616852936 ], [ -78.424225633006529, 0.586217759941633 ], [ -78.513444993591577, 0.759902249289382 ], [ -78.450632290447857, 0.789047756049115 ], [ -78.442105678734094, 0.871936754577575 ], [ -78.360301886722652, 0.852816474500685 ], [ -78.258421800225904, 0.775405178206427 ], [ -78.168608161337545, 0.651381741474154 ], [ -78.130806850755562, 0.505602525436188 ], [ -78.000453050168119, 0.46865387647523 ], [ -77.814081997386268, 0.345663966718689 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-X", "NAME_1": "Cotopaxi" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.396759610167862, -0.684350680639398 ], [ -78.39110103988105, -0.83281707095108 ], [ -78.441537237953128, -0.938133639655746 ], [ -78.391436936665286, -0.963558445166143 ], [ -78.419988166021028, -0.988156426577859 ], [ -78.455438199113587, -1.074766127254975 ], [ -78.492438524018667, -1.082259210194422 ], [ -78.553287523300526, -1.060916842937957 ], [ -78.575120816072797, -1.102774752452888 ], [ -78.661239590334787, -1.138534844807225 ], [ -78.7860381743223, -1.135899346477686 ], [ -78.866239996778404, -1.17832569677347 ], [ -78.906935187209115, -1.171556085145198 ], [ -78.96848181758179, -1.208659762837783 ], [ -79.014783902355191, -1.202665296666112 ], [ -79.082066617380463, -1.154916273767014 ], [ -79.109455125853344, -1.152280775437418 ], [ -79.234537929781595, -1.199564711242431 ], [ -79.280710822446508, -1.202613620722047 ], [ -79.322982144010723, -1.120964857442232 ], [ -79.29071021160695, -0.914000746237434 ], [ -79.180613572658217, -0.785481459202003 ], [ -79.086820848303489, -0.551903984980925 ], [ -79.047236701012935, -0.585080254949844 ], [ -78.990806036769186, -0.531646824241534 ], [ -79.032353888820921, -0.475629571147806 ], [ -79.002691617224343, -0.418682142966532 ], [ -78.927218187269489, -0.347006930425493 ], [ -78.869805671094809, -0.425348402706618 ], [ -78.829446377448335, -0.515678805532445 ], [ -78.751957566788235, -0.572316176250524 ], [ -78.714052904318066, -0.65262135149419 ], [ -78.617986415940322, -0.606732679669449 ], [ -78.589874437055585, -0.621667168704903 ], [ -78.552434861679501, -0.603477064614822 ], [ -78.489854701633135, -0.604355563758247 ], [ -78.396759610167862, -0.684350680639398 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-R", "NAME_1": "Los Rios" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -79.280710822446508, -1.202613620722047 ], [ -79.327839727721255, -1.225196221428462 ], [ -79.388378668640655, -1.31805876979638 ], [ -79.369697639034825, -1.322089532106247 ], [ -79.337348192265267, -1.291135348417583 ], [ -79.292182989953005, -1.33444019875617 ], [ -79.318951381700913, -1.359244886642216 ], [ -79.318512132129172, -1.468023776875839 ], [ -79.2500925364414, -1.540887546023441 ], [ -79.266422288557749, -1.585794365917252 ], [ -79.292415533949736, -1.585277601979783 ], [ -79.343859423273727, -1.63834929748208 ], [ -79.299262660843112, -1.659588311051721 ], [ -79.250376756382195, -1.736172784146675 ], [ -79.252133754669046, -1.774878432293804 ], [ -79.22944780117507, -1.822937513555416 ], [ -79.258515795367657, -1.923086440187092 ], [ -79.279496425619527, -1.944893893638266 ], [ -79.205521613331769, -2.065041598590938 ], [ -79.235493944190182, -2.154338473541713 ], [ -79.285930142262259, -2.107674656260372 ], [ -79.372953254089396, -1.970111992674333 ], [ -79.482429776313097, -1.897454929101684 ], [ -79.523615892259613, -1.885155937496506 ], [ -79.649525520286545, -1.906549980697037 ], [ -79.758872850401701, -1.696691989643625 ], [ -79.862122361557738, -1.624189954802603 ], [ -79.855662808291981, -1.573495375211394 ], [ -79.870545619584675, -1.519028415728826 ], [ -79.847317063731509, -1.399139093194606 ], [ -79.748149990829404, -1.235169773066559 ], [ -79.741406215824213, -1.189126071610929 ], [ -79.686396653982399, -1.146648043572384 ], [ -79.673761765592985, -1.114298597702145 ], [ -79.580950894068508, -1.050633232937344 ], [ -79.561675585260048, -0.986709485754147 ], [ -79.53278845912007, -0.959527682856276 ], [ -79.523073289900367, -0.845271091287827 ], [ -79.619630702894597, -0.850232028685184 ], [ -79.58658362503428, -0.740264580945677 ], [ -79.539067145232536, -0.696753025032081 ], [ -79.479975145136848, -0.543739108473062 ], [ -79.341999071300108, -0.554229424948005 ], [ -79.357269457119742, -0.577173760860376 ], [ -79.34721839111586, -0.622132256698308 ], [ -79.360602587439416, -0.655721937817191 ], [ -79.350758226111225, -0.682490329565042 ], [ -79.316186693061411, -0.695874525888655 ], [ -79.289728359676019, -0.691998793209734 ], [ -79.205469937387704, -0.62931528127524 ], [ -79.13154680014469, -0.555521335241451 ], [ -79.086820848303489, -0.551903984980925 ], [ -79.166014981306319, -0.758919773029106 ], [ -79.281640998433318, -0.899427991508617 ], [ -79.303732672724664, -0.948882337649763 ], [ -79.322982144010723, -1.120964857442232 ], [ -79.280710822446508, -1.202613620722047 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-P", "NAME_1": "Pichincha" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.832685512626313, 0.031936346884891 ], [ -77.857025113418217, 0.001395575245567 ], [ -77.964486254037354, -0.047800387577809 ], [ -77.980350918160354, -0.100562025617023 ], [ -78.013139615400917, -0.135960381866141 ], [ -78.056909552833588, -0.132704765912251 ], [ -78.095175951409033, -0.184432875177038 ], [ -78.134682583434483, -0.169395032454815 ], [ -78.183206752689443, -0.18779184301917 ], [ -78.194187994680192, -0.319980157158511 ], [ -78.24565772242596, -0.399923598095597 ], [ -78.237467006597058, -0.452840263967005 ], [ -78.262297532904824, -0.531440117767204 ], [ -78.310873379003226, -0.598464451273401 ], [ -78.329657762295881, -0.660424492796096 ], [ -78.396759610167862, -0.684350680639398 ], [ -78.462078620431953, -0.61541432011478 ], [ -78.527035894590824, -0.602030124690486 ], [ -78.589874437055585, -0.621667168704903 ], [ -78.617986415940322, -0.606732679669449 ], [ -78.70756751173127, -0.65587696654876 ], [ -78.751957566788235, -0.572316176250524 ], [ -78.829446377448335, -0.515678805532445 ], [ -78.921585456303774, -0.345146580250514 ], [ -78.891159546076153, -0.297630224555235 ], [ -78.76438574600536, -0.284952844997804 ], [ -78.745369675769894, -0.215227254734032 ], [ -78.796079195798256, -0.15817904492701 ], [ -78.92285299586905, -0.075776075105807 ], [ -79.100336315968207, -0.082114764884523 ], [ -79.106675005746922, 0.00028820493668 ], [ -79.309513085860203, 0.006626895614716 ], [ -79.363832364072323, 0.046922511864409 ], [ -79.303655158358879, 0.173271389463025 ], [ -79.3522310053566, 0.231665758467955 ], [ -79.221877203869838, 0.31558828397209 ], [ -79.195134649644331, 0.318895574970782 ], [ -79.040208706066892, 0.295021063970921 ], [ -78.993854947148066, 0.228875230507469 ], [ -78.951661139949636, 0.211305243142419 ], [ -78.778105841811112, 0.239313870138972 ], [ -78.63106055390142, 0.215025946190451 ], [ -78.38670854416398, 0.242311102775147 ], [ -78.360689460350329, 0.217713121363431 ], [ -78.365366176907514, 0.16665680656638 ], [ -78.320330165804478, 0.188515936860995 ], [ -78.226769986345801, 0.13327383102245 ], [ -78.175016038659237, 0.140715237118513 ], [ -78.077683478409767, 0.197766018087236 ], [ -77.94536597396052, 0.161282457119682 ], [ -77.970429043365641, 0.115342109350877 ], [ -77.863898077833994, 0.074155992505041 ], [ -77.832685512626313, 0.031936346884891 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "EC-SD", "NAME_1": "Santo Domingo de los Tsáchilas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.921585456303774, -0.345146580250514 ], [ -79.002691617224343, -0.418682142966532 ], [ -79.032353888820921, -0.475629571147806 ], [ -78.990806036769186, -0.531646824241534 ], [ -79.020054898115063, -0.546167901227648 ], [ -79.037030606277426, -0.580842787064967 ], [ -79.061912807629938, -0.582548110307073 ], [ -79.086820848303489, -0.551903984980925 ], [ -79.115449592025016, -0.546839694796063 ], [ -79.289728359676019, -0.691998793209734 ], [ -79.340784675372447, -0.68905323561836 ], [ -79.360602587439416, -0.655721937817191 ], [ -79.34721839111586, -0.622132256698308 ], [ -79.357269457119742, -0.577173760860376 ], [ -79.341999071300108, -0.554229424948005 ], [ -79.479975145136848, -0.543739108473062 ], [ -79.406930507936579, -0.383438815448983 ], [ -79.411426358239851, -0.188101902280948 ], [ -79.496692470880816, -0.161850273571304 ], [ -79.598753425430232, -0.07177825316387 ], [ -79.603430141987474, -0.022530612597677 ], [ -79.575214810315231, -0.012350356283946 ], [ -79.492997606254505, -0.025631198920678 ], [ -79.43315629822456, -0.050125827544889 ], [ -79.420702276988493, -0.03338266427852 ], [ -79.450364548585014, -0.000929863822194 ], [ -79.383546923351844, 0.022479560083639 ], [ -79.363832364072323, 0.046922511864409 ], [ -79.309513085860203, 0.006626895614716 ], [ -79.106675005746922, 0.00028820493668 ], [ -79.100336315968207, -0.082114764884523 ], [ -78.92285299586905, -0.075776075105807 ], [ -78.796079195798256, -0.15817904492701 ], [ -78.745369675769894, -0.215227254734032 ], [ -78.76438574600536, -0.284952844997804 ], [ -78.891159546076153, -0.297630224555235 ], [ -78.921585456303774, -0.345146580250514 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/el salvador.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/el salvador.geojson new file mode 100644 index 000000000000..14639b316044 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/el salvador.geojson @@ -0,0 +1,20 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "SV-AH", "NAME_1": "Ahuachapán" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -90.098306575132682, 13.731404008980572 ], [ -90.114313924999891, 13.796264954000023 ], [ -90.114779011999929, 13.81200042800009 ], [ -90.112298542999866, 13.828252666000111 ], [ -90.106975870999918, 13.844065654000104 ], [ -90.09904353899995, 13.85850921600013 ], [ -90.087080443999895, 13.870472310000082 ], [ -90.059640258999934, 13.884709167000054 ], [ -90.0473671069999, 13.894295146000061 ], [ -90.038091186999878, 13.908376974000078 ], [ -90.031476602999902, 13.922923889000032 ], [ -90.022975830999883, 13.936954041000135 ], [ -90.008170532999941, 13.949692281000097 ], [ -89.912078206999951, 14.015192159 ], [ -89.890787516999865, 14.035888570000026 ], [ -89.880116332999961, 14.042684021000071 ], [ -89.835855468999938, 14.059091289000037 ], [ -89.821101846999937, 14.060073141000089 ], [ -89.802963419999912, 14.055473938000134 ], [ -89.776944335999929, 14.0357852180001 ], [ -89.762268229999847, 14.029997457000121 ], [ -89.747643798999974, 14.037645569000105 ], [ -89.747256225999962, 14.04320078500011 ], [ -89.7480100679999, 14.044894904000031 ], [ -89.739658983075572, 14.041468817831685 ], [ -89.721572231773052, 14.030332546210047 ], [ -89.717903204669142, 14.027309475152151 ], [ -89.716197883225732, 14.025216580081064 ], [ -89.71498348729807, 14.02302033132321 ], [ -89.7128389153836, 14.014907130759468 ], [ -89.711805385709965, 14.012504177325923 ], [ -89.710332608263229, 14.010333766989731 ], [ -89.70671525800276, 14.006897283882552 ], [ -89.702658658170549, 14.003848375302255 ], [ -89.699041307010702, 14.000231025041785 ], [ -89.698963792644918, 13.999998481045054 ], [ -89.696819220730447, 13.996096909944413 ], [ -89.695863207221237, 13.993719794033268 ], [ -89.698808763013972, 13.975839749205022 ], [ -89.718833380655951, 13.908970445329771 ], [ -89.736584235174291, 13.901709906387055 ], [ -89.758546719155731, 13.895792955480488 ], [ -89.770716518652421, 13.893984280350253 ], [ -89.773481208191185, 13.892149765898978 ], [ -89.775625780105656, 13.889281724471971 ], [ -89.776633469558931, 13.882899685571999 ], [ -89.776866013555662, 13.878662217687179 ], [ -89.774488897644517, 13.859955348760309 ], [ -89.772835253044491, 13.854141751540567 ], [ -89.771000738593216, 13.849594224393911 ], [ -89.768649462003054, 13.844995022202511 ], [ -89.767745124437909, 13.84266958313475 ], [ -89.768339402741219, 13.83920726250517 ], [ -89.788699917167435, 13.809028225172426 ], [ -89.79056026914111, 13.803602199781665 ], [ -89.79110287060098, 13.799597275893575 ], [ -89.782653775051642, 13.773604031400907 ], [ -89.781594407855607, 13.768048813901601 ], [ -89.782963833414158, 13.764095566856895 ], [ -89.785935227628613, 13.759341335933868 ], [ -89.793531664254886, 13.750608017745833 ], [ -89.796451381625957, 13.745207830776735 ], [ -89.798053352080501, 13.74091868694785 ], [ -89.798621791962091, 13.731720282564993 ], [ -89.799448615161452, 13.729188137022902 ], [ -89.81226436980478, 13.70676056594732 ], [ -89.814098884256111, 13.701928818859869 ], [ -89.819757452744227, 13.679682114937634 ], [ -89.824770066984968, 13.677718411075773 ], [ -89.833064133802736, 13.676659043879738 ], [ -89.863243171135423, 13.678338527800804 ], [ -89.869418505359704, 13.679604600571849 ], [ -89.871408046743966, 13.6809740261304 ], [ -89.878668585686682, 13.687717800236271 ], [ -89.891768562069444, 13.702419745274995 ], [ -89.893758104353026, 13.704047553251939 ], [ -89.897892218551021, 13.706838080313162 ], [ -89.900295172883887, 13.707923285031541 ], [ -89.902982347157604, 13.708853461018407 ], [ -89.906522183052289, 13.709241033746707 ], [ -89.910552945362099, 13.709241033746707 ], [ -89.916289029115376, 13.708207505871712 ], [ -89.919622159435107, 13.70714813957494 ], [ -89.922593552750243, 13.70580455243811 ], [ -89.925022346404148, 13.704176744461165 ], [ -89.927838710987714, 13.701851305393404 ], [ -89.935331793927105, 13.693143826526352 ], [ -89.951222297371089, 13.668778388212047 ], [ -89.953482681905044, 13.665072624253359 ], [ -90.021170746999928, 13.695175041000084 ], [ -90.098306575132682, 13.731404008980572 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-SA", "NAME_1": "Santa Ana" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.7480100679999, 14.044894904000031 ], [ -89.754465087999932, 14.059401347000104 ], [ -89.755446939999899, 14.067075297000102 ], [ -89.752604736999928, 14.075240174000029 ], [ -89.709868326999896, 14.148724060000077 ], [ -89.689843709999963, 14.170014750000064 ], [ -89.664625610999906, 14.188850810000091 ], [ -89.638322306999868, 14.200555522000073 ], [ -89.530938679999906, 14.225566915000059 ], [ -89.524504964999949, 14.231768087000134 ], [ -89.524659993999876, 14.247374369000084 ], [ -89.527863931999946, 14.2514568080001 ], [ -89.540550496999913, 14.257606303000074 ], [ -89.544917155999883, 14.261817932000014 ], [ -89.546777506999888, 14.268329163000075 ], [ -89.54858618199998, 14.28359954900013 ], [ -89.549878092999933, 14.288276265 ], [ -89.555691690999907, 14.299024963000122 ], [ -89.558585571999913, 14.302823182000054 ], [ -89.564373331999974, 14.308145853000099 ], [ -89.571272135999948, 14.311143087000104 ], [ -89.592175252999937, 14.313830261000049 ], [ -89.598350586999914, 14.327989604000095 ], [ -89.592433634999907, 14.336387024000075 ], [ -89.582408406999974, 14.343363343000064 ], [ -89.576078043999956, 14.353130189000112 ], [ -89.578971923999944, 14.364783223000089 ], [ -89.586284139999918, 14.374679261000082 ], [ -89.590573283999902, 14.38597056100005 ], [ -89.584062052999911, 14.401809387000057 ], [ -89.569876871999867, 14.412015483000118 ], [ -89.555174926999968, 14.410826925 ], [ -89.544245361999913, 14.400052388000077 ], [ -89.541351480999907, 14.381526387000036 ], [ -89.527760579999921, 14.391060689000128 ], [ -89.503033406999918, 14.420051168000015 ], [ -89.496148129999909, 14.42289748400006 ], [ -89.485282551999887, 14.427389222000102 ], [ -89.469417886999878, 14.425373840000049 ], [ -89.458126586999896, 14.419586080000073 ], [ -89.446835286999942, 14.415529481000078 ], [ -89.431099812999946, 14.418707580000046 ], [ -89.40836218299998, 14.441522726000045 ], [ -89.398181925999921, 14.445372620000086 ], [ -89.396864176999969, 14.426045635000037 ], [ -89.391696533999948, 14.433719585000119 ], [ -89.390611328999881, 14.435993348000039 ], [ -89.361821562322675, 14.415505745792339 ], [ -89.36162084999998, 14.415477804000062 ], [ -89.346206290288023, 14.413075726263742 ], [ -89.308057421412855, 14.378502508783754 ], [ -89.301416999195112, 14.371319485106142 ], [ -89.300176764845787, 14.369407457188402 ], [ -89.296843635425432, 14.36186269830489 ], [ -89.292399461965601, 14.354602159362173 ], [ -89.290177374786026, 14.352405911503581 ], [ -89.286637538891284, 14.349692897908881 ], [ -89.271780565120991, 14.342070623760264 ], [ -89.2696101547848, 14.340365302316854 ], [ -89.264830085440053, 14.334138292148452 ], [ -89.24651079014086, 14.322846990895926 ], [ -89.259404060049292, 14.28664765076843 ], [ -89.263305630250613, 14.266519680338945 ], [ -89.272116461905171, 14.256959539850868 ], [ -89.309349330806981, 14.242257594812145 ], [ -89.30950436133719, 14.222258816491149 ], [ -89.30854834692866, 14.211200059235352 ], [ -89.30893591965696, 14.207427680243256 ], [ -89.3108479475747, 14.202750962786695 ], [ -89.330200771648265, 14.176602687763818 ], [ -89.333740606643687, 14.173243719921743 ], [ -89.335704312304131, 14.171822618419071 ], [ -89.338029751371892, 14.170530707226362 ], [ -89.340484381648878, 14.169600531239496 ], [ -89.343274908710043, 14.168825384883576 ], [ -89.346375495033044, 14.16833445936777 ], [ -89.356659105033657, 14.167714341743476 ], [ -89.359294603363253, 14.167326768115856 ], [ -89.362007616058634, 14.1665774601816 ], [ -89.364410570391499, 14.165543932306605 ], [ -89.36634843583164, 14.164252021113896 ], [ -89.368363817436204, 14.16254669787179 ], [ -89.380042691417032, 14.141824449138994 ], [ -89.382419807328233, 14.138620510028488 ], [ -89.384383511190094, 14.136785997375853 ], [ -89.386683111836135, 14.135519923705488 ], [ -89.389163581434104, 14.134615587039718 ], [ -89.40797380224916, 14.135829982967323 ], [ -89.427171596691835, 14.071622015843332 ], [ -89.424122688111538, 14.050150458277017 ], [ -89.413012254911621, 14.040228583482303 ], [ -89.398051926555127, 14.037438056421138 ], [ -89.383117438419049, 14.037489732365259 ], [ -89.37136105007238, 14.04059031778894 ], [ -89.382187263331502, 13.98527069758461 ], [ -89.383918423196633, 13.970827134964281 ], [ -89.383660040778238, 13.9677265495406 ], [ -89.385210334389399, 13.948554591721006 ], [ -89.386295539107834, 13.945428167875605 ], [ -89.38854346380981, 13.942740994501264 ], [ -89.393659430838056, 13.94054474484409 ], [ -89.397380133886031, 13.940312200847359 ], [ -89.400687424884723, 13.94038971611252 ], [ -89.403452115322864, 13.940105496171668 ], [ -89.405570847916294, 13.939020291453289 ], [ -89.41355485727081, 13.926540431795502 ], [ -89.416836310747101, 13.924473375146135 ], [ -89.419626837808323, 13.924085802417835 ], [ -89.422133144928694, 13.924860947874436 ], [ -89.424820319202354, 13.925067654348766 ], [ -89.427223272635899, 13.924447536724415 ], [ -89.429342007027969, 13.923078111165864 ], [ -89.43089229973981, 13.921166083248124 ], [ -89.432106695667471, 13.915585029125793 ], [ -89.433424445281901, 13.888790798056846 ], [ -89.432597622082596, 13.870755724497087 ], [ -89.434457974056215, 13.849490872505726 ], [ -89.452002122999545, 13.80293040621325 ], [ -89.456627162713346, 13.775076808847643 ], [ -89.504272833724258, 13.783939317345585 ], [ -89.517036913322897, 13.788150946808742 ], [ -89.518638881978802, 13.790088813148202 ], [ -89.520008308436672, 13.792155869797512 ], [ -89.526054449653088, 13.80678030047045 ], [ -89.539335293189197, 13.818872586500675 ], [ -89.560470953971333, 13.834194648264372 ], [ -89.570134447246915, 13.839827379230144 ], [ -89.576929898196227, 13.842747097500535 ], [ -89.579642910891607, 13.84207530393212 ], [ -89.581580777231068, 13.840680039951849 ], [ -89.583311937096198, 13.83881968797823 ], [ -89.585973272948195, 13.834556383470328 ], [ -89.589177212058644, 13.827528388524286 ], [ -89.59049496077381, 13.82202484786842 ], [ -89.59046912325141, 13.813058987482293 ], [ -89.591115078398104, 13.810630194727707 ], [ -89.59336300310008, 13.808356432503331 ], [ -89.596980354259927, 13.806573594895497 ], [ -89.604163377937539, 13.804919949396151 ], [ -89.608891771338165, 13.80585012538296 ], [ -89.612121547971071, 13.807116197254686 ], [ -89.614317796728926, 13.808821518698096 ], [ -89.616023119071656, 13.810656033149371 ], [ -89.617263353420981, 13.812981472217132 ], [ -89.618426073404521, 13.816082058540132 ], [ -89.620803189315723, 13.819389350438144 ], [ -89.625376553085459, 13.82396271420788 ], [ -89.631603563253805, 13.8250995957697 ], [ -89.634833339886711, 13.827063300530881 ], [ -89.636125251079477, 13.829207872445352 ], [ -89.635686000608416, 13.831714179565722 ], [ -89.634523282423515, 13.833936265845978 ], [ -89.632817959181466, 13.835874132185438 ], [ -89.628968064924265, 13.838948879187399 ], [ -89.627417772212425, 13.840680039951849 ], [ -89.626125861019659, 13.842927965553145 ], [ -89.625324877141338, 13.845692654192646 ], [ -89.625092333144664, 13.848509018776156 ], [ -89.626177537863043, 13.853676663547162 ], [ -89.630621711322874, 13.860704656694509 ], [ -89.636745367804451, 13.866208197350431 ], [ -89.639871791649853, 13.869593004513547 ], [ -89.642093878829428, 13.872486884362218 ], [ -89.645246141096493, 13.879618232095709 ], [ -89.648217536210325, 13.883597317562135 ], [ -89.664443936438488, 13.899022732113394 ], [ -89.67025753455755, 13.90318268473311 ], [ -89.674908412693071, 13.905378933490965 ], [ -89.678086514281176, 13.905378933490965 ], [ -89.681109585339073, 13.904991359863345 ], [ -89.686587286673898, 13.90357025836073 ], [ -89.695553147959401, 13.903286038419935 ], [ -89.718833380655951, 13.908970445329771 ], [ -89.698808763013972, 13.975839749205022 ], [ -89.695863207221237, 13.993719794033268 ], [ -89.696819220730447, 13.996096909944413 ], [ -89.698963792644918, 13.999998481045054 ], [ -89.699041307010702, 14.000231025041785 ], [ -89.702658658170549, 14.003848375302255 ], [ -89.70671525800276, 14.006897283882552 ], [ -89.710332608263229, 14.010333766989731 ], [ -89.711805385709965, 14.012504177325923 ], [ -89.7128389153836, 14.014907130759468 ], [ -89.71498348729807, 14.02302033132321 ], [ -89.716197883225732, 14.025216580081064 ], [ -89.717903204669142, 14.027309475152151 ], [ -89.721572231773052, 14.030332546210047 ], [ -89.739658983075572, 14.041468817831685 ], [ -89.7480100679999, 14.044894904000031 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-CH", "NAME_1": "Chalatenango" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.346206290288023, 14.413075726263742 ], [ -89.30756730199991, 14.407054546000069 ], [ -89.276535604999964, 14.392740173000078 ], [ -89.225530965999923, 14.382146505 ], [ -89.200157836999921, 14.36467987000006 ], [ -89.153984944999962, 14.351295675000117 ], [ -89.144502319999901, 14.35971893300011 ], [ -89.130110432999885, 14.38674570700006 ], [ -89.122178100999918, 14.394678040000102 ], [ -89.113341430999924, 14.397055156000064 ], [ -89.107476155999933, 14.395969951000069 ], [ -89.10256689499991, 14.391525777000055 ], [ -89.096830810999847, 14.384006856000013 ], [ -89.091844035999884, 14.374834290000109 ], [ -89.089673624999904, 14.364886577000021 ], [ -89.090552123999942, 14.354706320000048 ], [ -89.094479532999912, 14.34486195900007 ], [ -89.083084879999916, 14.335327657000079 ], [ -89.048978434999924, 14.331451925000039 ], [ -89.032984578999901, 14.323674622000027 ], [ -89.026602539999942, 14.311298117000149 ], [ -89.02262345399987, 14.28065399200004 ], [ -89.018127604999876, 14.27168813100009 ], [ -88.992754475999874, 14.252955424000106 ], [ -88.983530232999868, 14.242129211000062 ], [ -88.974564371999918, 14.227375590000051 ], [ -88.970791991999903, 14.214844056000047 ], [ -88.970228476163243, 14.210176262024845 ], [ -88.969241699999969, 14.202002462000067 ], [ -88.965986083999979, 14.19138295500008 ], [ -88.957175252999889, 14.18518178300009 ], [ -88.94748592199997, 14.187274679000055 ], [ -88.935626180999947, 14.194018453000083 ], [ -88.921647704999941, 14.199883728000088 ], [ -88.906015584999892, 14.199573670000092 ], [ -88.881262572999873, 14.184199931000123 ], [ -88.860333618999874, 14.158516744000053 ], [ -88.845321614999904, 14.128621928000115 ], [ -88.838758707999915, 14.100406596000056 ], [ -88.821188720999942, 14.102938741000045 ], [ -88.777341268999919, 14.099734802000071 ], [ -88.765429850999908, 14.104256490000097 ], [ -88.755120401999903, 14.110457662000087 ], [ -88.746387085999913, 14.111336162000029 ], [ -88.73922989999997, 14.099941508000128 ], [ -88.740056722999896, 14.083017477000041 ], [ -88.746077026999842, 14.066558533000062 ], [ -88.746645466999894, 14.052476705000032 ], [ -88.730961669999942, 14.042477316000117 ], [ -88.709515950999901, 14.039686788000054 ], [ -88.704865071999848, 14.038033142000103 ], [ -88.697656209999877, 14.032012838000071 ], [ -88.692695272999941, 14.025294902000056 ], [ -88.690447346999917, 14.016949157000084 ], [ -88.690811757999967, 14.011789871000062 ], [ -88.736851976137757, 14.004985255964755 ], [ -88.757574225769872, 13.995270086745109 ], [ -88.76509314713104, 13.985374050372116 ], [ -88.771914435602696, 13.980309760187254 ], [ -88.783825852680934, 13.974909573218213 ], [ -88.845320808008864, 13.955272529203853 ], [ -88.860410325775888, 13.949691474182146 ], [ -88.874027066096232, 13.946358343862471 ], [ -88.900227017063173, 13.948709622251272 ], [ -88.929734259928125, 13.947908637473631 ], [ -88.94621904167542, 13.949743150126267 ], [ -88.961670294648343, 13.955556749144648 ], [ -88.979808722794303, 13.954109809220313 ], [ -89.001202765994833, 13.964005846492626 ], [ -89.00502682183037, 13.966331285560386 ], [ -89.009496832812545, 13.970336209448476 ], [ -89.014767828572417, 13.97795848179851 ], [ -89.017455003745397, 13.983436184032655 ], [ -89.019160326088183, 13.988009547802392 ], [ -89.019806281234878, 13.990490017400361 ], [ -89.020193854862498, 13.993022162043133 ], [ -89.020168016440778, 13.995709337216113 ], [ -89.019392870084857, 13.999972641724014 ], [ -89.019392870084857, 14.000205185720745 ], [ -89.019806281234878, 14.00183299369769 ], [ -89.021640794786833, 14.004571844814791 ], [ -89.043577440346553, 14.029944973481747 ], [ -89.048099128172225, 14.037748113884334 ], [ -89.049649420884066, 14.039608465858009 ], [ -89.066521776258924, 14.051339015782958 ], [ -89.07378231520164, 14.057643541216464 ], [ -89.078820766964782, 14.06025320112434 ], [ -89.104607306781759, 14.069374091141356 ], [ -89.117138840585028, 14.075497748522253 ], [ -89.120627001434968, 14.075936998093994 ], [ -89.123675910015209, 14.075962836515657 ], [ -89.141349250167764, 14.066996975230211 ], [ -89.168970302637319, 14.054620470158568 ], [ -89.180339118255688, 14.057385158798013 ], [ -89.194420945670117, 14.068211371157815 ], [ -89.200751308625968, 14.055834866086172 ], [ -89.214678107308771, 14.055989894817799 ], [ -89.235400356940886, 14.064800727371676 ], [ -89.243074307033623, 14.062242743407865 ], [ -89.256019252886176, 14.053147690913192 ], [ -89.260205043927613, 14.051132310207947 ], [ -89.26731055413876, 14.052114163038198 ], [ -89.276819016884076, 14.056377468445419 ], [ -89.280074632838023, 14.057333481954629 ], [ -89.296404384954371, 14.059633084399309 ], [ -89.314439460312826, 14.069606635138086 ], [ -89.324774746257503, 14.071622015843332 ], [ -89.334567429842991, 14.064438992165719 ], [ -89.343688320759384, 14.059555569134204 ], [ -89.355496385050117, 14.057333481954629 ], [ -89.363816291188868, 14.054232896530948 ], [ -89.367020230299374, 14.047411607159916 ], [ -89.37136105007238, 14.04059031778894 ], [ -89.383117438419049, 14.037489732365259 ], [ -89.398051926555127, 14.037438056421138 ], [ -89.413012254911621, 14.040228583482303 ], [ -89.424122688111538, 14.050150458277017 ], [ -89.427171596691835, 14.071622015843332 ], [ -89.40797380224916, 14.135829982967323 ], [ -89.389163581434104, 14.134615587039718 ], [ -89.386683111836135, 14.135519923705488 ], [ -89.384383511190094, 14.136785997375853 ], [ -89.382419807328233, 14.138620510028488 ], [ -89.380042691417032, 14.141824449138994 ], [ -89.368363817436204, 14.16254669787179 ], [ -89.36634843583164, 14.164252021113896 ], [ -89.364410570391499, 14.165543932306605 ], [ -89.362007616058634, 14.1665774601816 ], [ -89.359294603363253, 14.167326768115856 ], [ -89.356659105033657, 14.167714341743476 ], [ -89.346375495033044, 14.16833445936777 ], [ -89.343274908710043, 14.168825384883576 ], [ -89.340484381648878, 14.169600531239496 ], [ -89.338029751371892, 14.170530707226362 ], [ -89.335704312304131, 14.171822618419071 ], [ -89.333740606643687, 14.173243719921743 ], [ -89.330200771648265, 14.176602687763818 ], [ -89.3108479475747, 14.202750962786695 ], [ -89.30893591965696, 14.207427680243256 ], [ -89.30854834692866, 14.211200059235352 ], [ -89.30950436133719, 14.222258816491149 ], [ -89.309349330806981, 14.242257594812145 ], [ -89.272116461905171, 14.256959539850868 ], [ -89.263305630250613, 14.266519680338945 ], [ -89.259404060049292, 14.28664765076843 ], [ -89.24651079014086, 14.322846990895926 ], [ -89.264830085440053, 14.334138292148452 ], [ -89.2696101547848, 14.340365302316854 ], [ -89.271780565120991, 14.342070623760264 ], [ -89.286637538891284, 14.349692897908881 ], [ -89.290177374786026, 14.352405911503581 ], [ -89.292399461965601, 14.354602159362173 ], [ -89.296843635425432, 14.36186269830489 ], [ -89.300176764845787, 14.369407457188402 ], [ -89.301416999195112, 14.371319485106142 ], [ -89.308057421412855, 14.378502508783754 ], [ -89.346206290288023, 14.413075726263742 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-CA", "NAME_1": "Cabañas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.690811757999967, 14.011789871000062 ], [ -88.690938272999858, 14.009998678000088 ], [ -88.684814615999898, 14.012298279000021 ], [ -88.659338135999889, 14.016122335000148 ], [ -88.633861653999958, 14.014468689000097 ], [ -88.558104003999858, 13.990904236000105 ], [ -88.514049845999892, 13.987648621000119 ], [ -88.50436051499986, 13.983695374000135 ], [ -88.495420491999937, 13.97514292400011 ], [ -88.49619563899995, 13.971990662000067 ], [ -88.496505696999918, 13.969561870000106 ], [ -88.497085348999917, 13.969068092000015 ], [ -88.497900960999914, 13.968373311000079 ], [ -88.498182576999938, 13.968409755000081 ], [ -88.502293457999912, 13.968941752000134 ], [ -88.501198105999947, 13.966600438000029 ], [ -88.496092285999907, 13.955686747000129 ], [ -88.496815754999915, 13.944033712000063 ], [ -88.500226399999946, 13.931863912000068 ], [ -88.502293457999912, 13.917110291000057 ], [ -88.499502930999938, 13.907601827000065 ], [ -88.48867671699989, 13.881350200000043 ], [ -88.48800492399991, 13.865330506000078 ], [ -88.496815755342823, 13.851197002439676 ], [ -88.498675299725278, 13.849568385972248 ], [ -88.50296444355422, 13.845692654192646 ], [ -88.496789110229258, 13.833264472277563 ], [ -88.498210211731873, 13.821404731143389 ], [ -88.505315721043701, 13.811431179505291 ], [ -88.516012743093597, 13.804713242921821 ], [ -88.513919847123248, 13.790838121082402 ], [ -88.523247442715274, 13.776911322399599 ], [ -88.532394172053387, 13.759651394296384 ], [ -88.532342495209946, 13.759367174355589 ], [ -88.548568895438166, 13.748695989828036 ], [ -88.558025682239418, 13.751150621004342 ], [ -88.583243781275485, 13.754199530483902 ], [ -88.586912808379395, 13.755413927310883 ], [ -88.588876512241256, 13.757093411231949 ], [ -88.590065069747141, 13.759263821568084 ], [ -88.590943569789886, 13.761666775001629 ], [ -88.592183804139211, 13.76709280039239 ], [ -88.593630744063546, 13.769392401937807 ], [ -88.596421272024088, 13.770813503440422 ], [ -88.603345913283249, 13.772648016992378 ], [ -88.605774706037835, 13.773681544867372 ], [ -88.612440965777921, 13.777557278445613 ], [ -88.623086310984434, 13.78117462780682 ], [ -88.625489265317299, 13.782414863055465 ], [ -88.64386023566135, 13.795644028848812 ], [ -88.64613399878499, 13.796729234466568 ], [ -88.657141079197402, 13.798744615171813 ], [ -88.670861172305251, 13.799442247161949 ], [ -88.677424079257833, 13.800604967145489 ], [ -88.70936011397805, 13.800294907883654 ], [ -88.716491461711598, 13.800915025508004 ], [ -88.721219855112224, 13.802155259857329 ], [ -88.735611741788432, 13.812283840227053 ], [ -88.738919033686443, 13.811973781864538 ], [ -88.742510546424569, 13.810165106734246 ], [ -88.74752315976599, 13.80370555346849 ], [ -88.75077877482056, 13.800346584727095 ], [ -88.754266933871861, 13.798098660025119 ], [ -88.760183884778428, 13.798589586440244 ], [ -88.767341070933639, 13.800372423148815 ], [ -88.773929816307941, 13.798641262384365 ], [ -88.805039028728174, 13.78520539011663 ], [ -88.814702522003756, 13.782208157480454 ], [ -88.821575487318853, 13.781097113441035 ], [ -88.831962450106971, 13.784481919704831 ], [ -88.837801886647753, 13.78579966931926 ], [ -88.844235603290429, 13.786058050838335 ], [ -88.847051967873995, 13.78233734779036 ], [ -88.84886064300423, 13.779314276732464 ], [ -88.850255906984501, 13.750633857066816 ], [ -88.884853277556715, 13.75980642302801 ], [ -88.893844978163202, 13.764870714112135 ], [ -88.894826830094132, 13.767377021232505 ], [ -88.901260545837488, 13.776911322399599 ], [ -88.91092403821375, 13.786988226825201 ], [ -88.915032314889402, 13.792336737850178 ], [ -88.917435269222267, 13.796729234466568 ], [ -88.918753017937433, 13.803240465475085 ], [ -88.919993252286758, 13.807038682888901 ], [ -88.9250317040499, 13.815668647390169 ], [ -88.926220261555784, 13.819880275953949 ], [ -88.927021247232744, 13.824350286936181 ], [ -88.93058692064983, 13.832153429137406 ], [ -88.935470343681402, 13.837424424897279 ], [ -88.943635220189265, 13.84282461186632 ], [ -88.949784715991825, 13.849206650766291 ], [ -88.969266730375296, 13.876104233723368 ], [ -88.973995123775921, 13.884682522280571 ], [ -88.976527269318012, 13.891038722758822 ], [ -88.976010505380486, 13.894035956294317 ], [ -88.975209519703526, 13.896774807411418 ], [ -88.974227667772652, 13.899151923322563 ], [ -88.972729051004876, 13.90127065681537 ], [ -88.971127082348971, 13.903027655102164 ], [ -88.969060024800285, 13.904577947814005 ], [ -88.955779182163496, 13.912096869175173 ], [ -88.951955126328016, 13.915171617076453 ], [ -88.948596157586564, 13.918659776127754 ], [ -88.94565060089451, 13.922974758378359 ], [ -88.944462043388569, 13.925222683080335 ], [ -88.929734259928125, 13.947908637473631 ], [ -88.900227017063173, 13.948709622251272 ], [ -88.874027066096232, 13.946358343862471 ], [ -88.860410325775888, 13.949691474182146 ], [ -88.845320808008864, 13.955272529203853 ], [ -88.783825852680934, 13.974909573218213 ], [ -88.771914435602696, 13.980309760187254 ], [ -88.76509314713104, 13.985374050372116 ], [ -88.757574225769872, 13.995270086745109 ], [ -88.736851976137757, 14.004985255964755 ], [ -88.690811757999967, 14.011789871000062 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-MO", "NAME_1": "Morazán" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.235074625999886, 13.992867941000043 ], [ -88.220062622999905, 13.991317647000116 ], [ -88.217658813303558, 13.990796705103833 ], [ -88.193475097999908, 13.985555725000054 ], [ -88.177532918999958, 13.985193990000056 ], [ -88.125391397999891, 13.991265971000104 ], [ -88.09903641799994, 13.98981903100011 ], [ -88.087538411999901, 13.980543112000092 ], [ -88.072888143999933, 13.94341359500001 ], [ -88.058392903999902, 13.926489563000104 ], [ -88.039970255999975, 13.910133972000054 ], [ -88.023640502999854, 13.891168722000103 ], [ -88.015320597999903, 13.866364035000061 ], [ -87.969741984999899, 13.888533223000081 ], [ -87.954781656999842, 13.892460633000056 ], [ -87.952594894338858, 13.892029035511541 ], [ -87.949380663386876, 13.872409369097113 ], [ -87.94503984181523, 13.856131292924829 ], [ -87.943076137953369, 13.827890122830865 ], [ -87.947210253050741, 13.767170314758232 ], [ -87.94695186973297, 13.763914699703605 ], [ -87.946254238642155, 13.761227525429945 ], [ -87.94503984181523, 13.759108791937194 ], [ -87.940518154888935, 13.753424384128039 ], [ -87.939122890908664, 13.751228136269447 ], [ -87.938141038977733, 13.748851020358302 ], [ -87.937365891722493, 13.746344713237932 ], [ -87.936358202269219, 13.740298570222819 ], [ -87.936668259732357, 13.721204128567649 ], [ -87.939613817323789, 13.697975571815164 ], [ -87.945634121017861, 13.671052151335687 ], [ -87.968552619407831, 13.613329575899172 ], [ -87.970257940851297, 13.594545193505837 ], [ -87.977595995059119, 13.583744819567755 ], [ -88.008550177848406, 13.551447047842942 ], [ -88.030099249780562, 13.554935207793562 ], [ -88.040408698202839, 13.554263414225147 ], [ -88.07957943434343, 13.5425587018226 ], [ -88.08704667796178, 13.541783556365999 ], [ -88.091852586627567, 13.542481187456815 ], [ -88.093325364973623, 13.544134832956161 ], [ -88.094979011372232, 13.546873684073262 ], [ -88.095883348038058, 13.548889064778507 ], [ -88.098260463949259, 13.551627915895608 ], [ -88.10154191832487, 13.554547634165942 ], [ -88.116347216151098, 13.56322927551065 ], [ -88.118465948744529, 13.564779568222491 ], [ -88.119964566411568, 13.566794948927736 ], [ -88.121101447074125, 13.569017035207992 ], [ -88.123995326922795, 13.586871243413157 ], [ -88.125545619634636, 13.592142239172972 ], [ -88.129240485160267, 13.59886017485718 ], [ -88.133503790567488, 13.604312039568981 ], [ -88.137198656093062, 13.606534124949917 ], [ -88.140945196663495, 13.607696844933457 ], [ -88.179599168866559, 13.604673773875561 ], [ -88.18533525261978, 13.60345937704858 ], [ -88.190373705282241, 13.60157318845188 ], [ -88.198486904946662, 13.596896470995318 ], [ -88.20388709191576, 13.595346178283478 ], [ -88.205618251780891, 13.596508897367698 ], [ -88.205695767045995, 13.598265896553869 ], [ -88.204533047062455, 13.60041046846834 ], [ -88.198616096155888, 13.608187771348582 ], [ -88.197582567381573, 13.610590724782128 ], [ -88.197427537750627, 13.613174547167603 ], [ -88.198977831361788, 13.615758367754438 ], [ -88.201277432007885, 13.617980454934013 ], [ -88.208382941319655, 13.622424628393844 ], [ -88.210630866021631, 13.624181627580015 ], [ -88.212155321211071, 13.626145331441876 ], [ -88.213137173142002, 13.628470771408956 ], [ -88.213886481076202, 13.631235460048401 ], [ -88.214325730647943, 13.634258531106298 ], [ -88.216444465040013, 13.638108425363498 ], [ -88.220087652822883, 13.642836818764181 ], [ -88.229621954889296, 13.649709784079278 ], [ -88.233290981993207, 13.653223782451562 ], [ -88.235073818701778, 13.659244086145634 ], [ -88.238406949021453, 13.66417918512127 ], [ -88.251119350877332, 13.675315456742908 ], [ -88.256286993849642, 13.68112905486197 ], [ -88.259387580172643, 13.685779933896811 ], [ -88.261067064093709, 13.710894680145373 ], [ -88.260912035362139, 13.713556015997312 ], [ -88.259826829744384, 13.715726427232823 ], [ -88.258147345823318, 13.717509263941338 ], [ -88.22522945827285, 13.740608629484655 ], [ -88.220707771346554, 13.7430115829182 ], [ -88.213033820354497, 13.745672918770197 ], [ -88.210708381286736, 13.747068182750411 ], [ -88.208770514947275, 13.748670152305692 ], [ -88.207220222235435, 13.750556341801712 ], [ -88.206445074980195, 13.753527736915487 ], [ -88.206470913401915, 13.757170924698414 ], [ -88.208150397322981, 13.763139553347685 ], [ -88.210811734074241, 13.767015286026606 ], [ -88.213137173142002, 13.769573269091097 ], [ -88.250860969358257, 13.794662176917939 ], [ -88.256545376268093, 13.799597275893575 ], [ -88.260136888106899, 13.80331797894155 ], [ -88.260989548828604, 13.80585012538296 ], [ -88.26168718081874, 13.808614814022462 ], [ -88.262152268812144, 13.818252467977004 ], [ -88.261247932146318, 13.823885198942776 ], [ -88.260705328887809, 13.825745550916452 ], [ -88.260085212162778, 13.827425034837461 ], [ -88.258922492179238, 13.829388738699322 ], [ -88.255873582699678, 13.833109443545993 ], [ -88.254064907569386, 13.834582220992672 ], [ -88.251946174076636, 13.835951646551223 ], [ -88.250189174890465, 13.837656968894009 ], [ -88.248690559022066, 13.839724026442639 ], [ -88.247527839038526, 13.841920274301231 ], [ -88.246545987107595, 13.844452418943945 ], [ -88.245925868583925, 13.847242946904487 ], [ -88.24608089911419, 13.853289089020222 ], [ -88.24933651416876, 13.861634833580695 ], [ -88.253238085269402, 13.869127916520142 ], [ -88.254840053925307, 13.873468736293148 ], [ -88.255201789131263, 13.876827704135223 ], [ -88.256958788317434, 13.88483755101214 ], [ -88.268741014186446, 13.911760973290257 ], [ -88.274170772999895, 13.919119724000055 ], [ -88.27016292299993, 13.926024475000077 ], [ -88.263600015999941, 13.93310414600009 ], [ -88.251636921999904, 13.938090922000058 ], [ -88.2427744149999, 13.936695658000076 ], [ -88.236366536999952, 13.938142599000074 ], [ -88.231586466999943, 13.951811015000075 ], [ -88.233369303999922, 13.954498190000024 ], [ -88.242309326999958, 13.962533875000091 ], [ -88.244376383999935, 13.966099548000059 ], [ -88.245358235999902, 13.98589162200004 ], [ -88.244893147999875, 13.989250591000058 ], [ -88.235074625999886, 13.992867941000043 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-SM", "NAME_1": "San Miguel" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.326206014999855, 13.885070903000056 ], [ -88.319255533999865, 13.89760243700006 ], [ -88.308429321999938, 13.901478170000104 ], [ -88.296311197999842, 13.902356669000142 ], [ -88.28543330899987, 13.905974019000027 ], [ -88.277526814999931, 13.913337911000028 ], [ -88.274170772999895, 13.919119724000055 ], [ -88.268741014186446, 13.911760973290257 ], [ -88.256958788317434, 13.88483755101214 ], [ -88.255201789131263, 13.876827704135223 ], [ -88.254840053925307, 13.873468736293148 ], [ -88.253238085269402, 13.869127916520142 ], [ -88.24933651416876, 13.861634833580695 ], [ -88.24608089911419, 13.853289089020222 ], [ -88.245925868583925, 13.847242946904487 ], [ -88.246545987107595, 13.844452418943945 ], [ -88.247527839038526, 13.841920274301231 ], [ -88.248690559022066, 13.839724026442639 ], [ -88.250189174890465, 13.837656968894009 ], [ -88.251946174076636, 13.835951646551223 ], [ -88.254064907569386, 13.834582220992672 ], [ -88.255873582699678, 13.833109443545993 ], [ -88.258922492179238, 13.829388738699322 ], [ -88.260085212162778, 13.827425034837461 ], [ -88.260705328887809, 13.825745550916452 ], [ -88.261247932146318, 13.823885198942776 ], [ -88.262152268812144, 13.818252467977004 ], [ -88.26168718081874, 13.808614814022462 ], [ -88.260989548828604, 13.80585012538296 ], [ -88.260136888106899, 13.80331797894155 ], [ -88.256545376268093, 13.799597275893575 ], [ -88.250860969358257, 13.794662176917939 ], [ -88.213137173142002, 13.769573269091097 ], [ -88.210811734074241, 13.767015286026606 ], [ -88.208150397322981, 13.763139553347685 ], [ -88.206470913401915, 13.757170924698414 ], [ -88.206445074980195, 13.753527736915487 ], [ -88.207220222235435, 13.750556341801712 ], [ -88.208770514947275, 13.748670152305692 ], [ -88.210708381286736, 13.747068182750411 ], [ -88.213033820354497, 13.745672918770197 ], [ -88.220707771346554, 13.7430115829182 ], [ -88.22522945827285, 13.740608629484655 ], [ -88.258147345823318, 13.717509263941338 ], [ -88.259826829744384, 13.715726427232823 ], [ -88.260912035362139, 13.713556015997312 ], [ -88.261067064093709, 13.710894680145373 ], [ -88.259387580172643, 13.685779933896811 ], [ -88.256286993849642, 13.68112905486197 ], [ -88.251119350877332, 13.675315456742908 ], [ -88.238406949021453, 13.66417918512127 ], [ -88.235073818701778, 13.659244086145634 ], [ -88.233290981993207, 13.653223782451562 ], [ -88.229621954889296, 13.649709784079278 ], [ -88.220087652822883, 13.642836818764181 ], [ -88.216444465040013, 13.638108425363498 ], [ -88.214325730647943, 13.634258531106298 ], [ -88.213886481076202, 13.631235460048401 ], [ -88.213137173142002, 13.628470771408956 ], [ -88.212155321211071, 13.626145331441876 ], [ -88.210630866021631, 13.624181627580015 ], [ -88.208382941319655, 13.622424628393844 ], [ -88.201277432007885, 13.617980454934013 ], [ -88.198977831361788, 13.615758367754438 ], [ -88.197427537750627, 13.613174547167603 ], [ -88.197582567381573, 13.610590724782128 ], [ -88.198616096155888, 13.608187771348582 ], [ -88.204533047062455, 13.60041046846834 ], [ -88.205695767045995, 13.598265896553869 ], [ -88.205618251780891, 13.596508897367698 ], [ -88.20388709191576, 13.595346178283478 ], [ -88.198486904946662, 13.596896470995318 ], [ -88.190373705282241, 13.60157318845188 ], [ -88.18533525261978, 13.60345937704858 ], [ -88.179599168866559, 13.604673773875561 ], [ -88.140945196663495, 13.607696844933457 ], [ -88.137198656093062, 13.606534124949917 ], [ -88.133503790567488, 13.604312039568981 ], [ -88.129240485160267, 13.59886017485718 ], [ -88.125545619634636, 13.592142239172972 ], [ -88.123995326922795, 13.586871243413157 ], [ -88.121101447074125, 13.569017035207992 ], [ -88.119964566411568, 13.566794948927736 ], [ -88.118465948744529, 13.564779568222491 ], [ -88.116347216151098, 13.56322927551065 ], [ -88.10154191832487, 13.554547634165942 ], [ -88.098260463949259, 13.551627915895608 ], [ -88.095883348038058, 13.548889064778507 ], [ -88.094979011372232, 13.546873684073262 ], [ -88.093325364973623, 13.544134832956161 ], [ -88.091852586627567, 13.542481187456815 ], [ -88.08704667796178, 13.541783556365999 ], [ -88.07957943434343, 13.5425587018226 ], [ -88.040408698202839, 13.554263414225147 ], [ -88.030099249780562, 13.554935207793562 ], [ -88.008550177848406, 13.551447047842942 ], [ -88.015061407957603, 13.542868761084435 ], [ -88.017205979872074, 13.530233872695078 ], [ -88.016663378412147, 13.50000316031759 ], [ -88.012787644833907, 13.485611274540645 ], [ -88.012787644833907, 13.482381497008475 ], [ -88.013795336085877, 13.478945013901239 ], [ -88.017516039133909, 13.474552517284849 ], [ -88.020306566195075, 13.472201238896048 ], [ -88.023019578890455, 13.470315050299291 ], [ -88.027360398663461, 13.467912095966426 ], [ -88.029220750637137, 13.466439316721051 ], [ -88.030771044248297, 13.46240855620988 ], [ -88.031597867447601, 13.456000677988868 ], [ -88.031132778554877, 13.430343329381117 ], [ -88.028238897806887, 13.412747504493723 ], [ -88.027257045875956, 13.410163683007568 ], [ -88.026042649948295, 13.407760727775326 ], [ -88.016663378412147, 13.393239650789212 ], [ -88.015500658428607, 13.390836697355667 ], [ -88.014647996807582, 13.388356227757697 ], [ -88.014234584758242, 13.385953274324152 ], [ -88.027050341200265, 13.314019680264039 ], [ -88.02674028193843, 13.309885566065986 ], [ -88.02518998922659, 13.304020291103541 ], [ -88.025887621216725, 13.297922472144364 ], [ -88.038935919856783, 13.256219591361059 ], [ -88.041313035767985, 13.253868312972259 ], [ -88.045963914802826, 13.252498888313028 ], [ -88.049322882644901, 13.252550564257149 ], [ -88.052552660177128, 13.253170680982123 ], [ -88.063068814174414, 13.256813870563633 ], [ -88.071672940253961, 13.261878159849175 ], [ -88.079889492705888, 13.267820950076782 ], [ -88.081982387776975, 13.268673610798487 ], [ -88.084617886106514, 13.258855088791279 ], [ -88.085961473243401, 13.251103624332757 ], [ -88.091465012999947, 13.172787991372672 ], [ -88.091470945800239, 13.172705728065043 ], [ -88.098378058999913, 13.174017645000049 ], [ -88.105213995999918, 13.174017645000049 ], [ -88.112507114174903, 13.171196219997629 ], [ -88.173759732325777, 13.240664984701255 ], [ -88.176421068177717, 13.241672675053906 ], [ -88.179289109604724, 13.242215278312415 ], [ -88.182389695927725, 13.242370307044041 ], [ -88.209571498825596, 13.238236191946669 ], [ -88.212051968423566, 13.238804632727579 ], [ -88.213912320397242, 13.24079417591048 ], [ -88.214041510707148, 13.245703437363716 ], [ -88.213498908347901, 13.249010728362407 ], [ -88.212517056417028, 13.252162991528849 ], [ -88.2050498118993, 13.265573025374806 ], [ -88.205618251780891, 13.268337714014251 ], [ -88.207943691747971, 13.271464137859653 ], [ -88.214506598700552, 13.274926459388553 ], [ -88.218304816114369, 13.277846178558264 ], [ -88.220630256081449, 13.281489366341191 ], [ -88.220862800078123, 13.296294664167419 ], [ -88.221172858440639, 13.299162706493689 ], [ -88.222154711270889, 13.302314967861491 ], [ -88.223834195191955, 13.305260525452866 ], [ -88.227115647768926, 13.308800361347608 ], [ -88.231353115653746, 13.309342962807477 ], [ -88.234531216342532, 13.308955390079177 ], [ -88.243910488777999, 13.304020291103541 ], [ -88.24894894144046, 13.301927395133191 ], [ -88.251791145345067, 13.301384792773945 ], [ -88.254685025193737, 13.301152248777271 ], [ -88.257423876310838, 13.301643175192339 ], [ -88.259981859375273, 13.302495835914101 ], [ -88.262074755345679, 13.303839423050931 ], [ -88.26589881118116, 13.306965846896276 ], [ -88.26801754377459, 13.308361110876547 ], [ -88.270549689316681, 13.309291286863356 ], [ -88.273391893221287, 13.309497992438367 ], [ -88.275949877185042, 13.309368801229198 ], [ -88.278869594556113, 13.311280829146938 ], [ -88.282952032810044, 13.315104884982418 ], [ -88.291866218151426, 13.325388494983031 ], [ -88.296956345858632, 13.329470933236962 ], [ -88.301478033684305, 13.332003078779053 ], [ -88.321115077698664, 13.334225165059308 ], [ -88.32641191277952, 13.335568752196139 ], [ -88.333904994819648, 13.338824368150028 ], [ -88.336075406055102, 13.340142116865195 ], [ -88.337909918707737, 13.341537379946089 ], [ -88.34493791365378, 13.350296536555902 ], [ -88.354988979657662, 13.366006171047957 ], [ -88.360415005048424, 13.376703193097853 ], [ -88.365686000808296, 13.394686590713604 ], [ -88.367158780053614, 13.402334703283941 ], [ -88.367753059256245, 13.408251655089771 ], [ -88.367598028726036, 13.414685369933864 ], [ -88.368166470406265, 13.417785956256864 ], [ -88.369665087174042, 13.420369777743019 ], [ -88.373747525427916, 13.421687527357506 ], [ -88.378346726720054, 13.420059719380504 ], [ -88.380155401850288, 13.420085557802224 ], [ -88.381498989886438, 13.421222439364044 ], [ -88.382687548291699, 13.42442637847455 ], [ -88.385891485603565, 13.442849026561305 ], [ -88.386124029600296, 13.449308579827061 ], [ -88.387829352842346, 13.462718614572395 ], [ -88.38790686720813, 13.46566417126445 ], [ -88.387674323211456, 13.468687242322346 ], [ -88.386821661590375, 13.471167711021053 ], [ -88.385271368878534, 13.473028062095352 ], [ -88.383411017804235, 13.473596502876319 ], [ -88.381964076980523, 13.473028062095352 ], [ -88.380827196318023, 13.472072047686822 ], [ -88.379457770759473, 13.470470079030918 ], [ -88.377829962782528, 13.469307359047377 ], [ -88.375995450129892, 13.469126491894087 ], [ -88.374574347727958, 13.470676785505248 ], [ -88.373644171741091, 13.473234768569682 ], [ -88.373204922169407, 13.479487616260485 ], [ -88.373411627744417, 13.485611274540645 ], [ -88.373024055016117, 13.488634344699221 ], [ -88.372197231816756, 13.491192327763713 ], [ -88.370879483101646, 13.493595282096578 ], [ -88.369303351968085, 13.495429796547853 ], [ -88.363980679364829, 13.5002098658926 ], [ -88.363773972890499, 13.500519924255059 ], [ -88.362533739440494, 13.50305206979715 ], [ -88.362197841756995, 13.505248318555061 ], [ -88.362611253806278, 13.509046535968821 ], [ -88.366667853638489, 13.522224025818105 ], [ -88.36746883841613, 13.527417507212192 ], [ -88.367494675938531, 13.531551622309507 ], [ -88.3653759433451, 13.539380601133814 ], [ -88.365427619289164, 13.541783556365999 ], [ -88.36671952958261, 13.545478420092991 ], [ -88.378811814713458, 13.570386460766542 ], [ -88.379586961968698, 13.573125311883643 ], [ -88.379948697174598, 13.575967515788193 ], [ -88.380155401850288, 13.58188446669476 ], [ -88.379690313856884, 13.584855861808535 ], [ -88.378837653135179, 13.587439683294747 ], [ -88.377752448416743, 13.589661770474322 ], [ -88.376124641339118, 13.591522122447998 ], [ -88.373825038894438, 13.592710679953882 ], [ -88.368399014402996, 13.594467678240733 ], [ -88.366151088801701, 13.595578722280209 ], [ -88.364497443302355, 13.597361558089403 ], [ -88.36307634090042, 13.599428616537409 ], [ -88.362068651447089, 13.601909085236059 ], [ -88.361681077819469, 13.604596259509776 ], [ -88.362223680178658, 13.608187771348582 ], [ -88.363515591371424, 13.612296047124858 ], [ -88.366357795276031, 13.6192982045485 ], [ -88.368321499137835, 13.627747300997157 ], [ -88.368269823193771, 13.630692856789892 ], [ -88.367753059256245, 13.633638414381323 ], [ -88.362998827433898, 13.646557521812156 ], [ -88.362921312168794, 13.649399725716762 ], [ -88.366254441589206, 13.651957708781197 ], [ -88.372429775813487, 13.653843899176593 ], [ -88.396795214127792, 13.656789455868704 ], [ -88.404546677686994, 13.65937327735486 ], [ -88.413202480609982, 13.665445257892316 ], [ -88.420075445925079, 13.671749783325822 ], [ -88.428421189586231, 13.68461721391327 ], [ -88.434544846967071, 13.692136135274382 ], [ -88.44648210336635, 13.692833767264517 ], [ -88.48733232342795, 13.688260403494837 ], [ -88.498830329356224, 13.705727037173006 ], [ -88.529655320936286, 13.735828559240588 ], [ -88.532342495209946, 13.759367174355589 ], [ -88.532394172053387, 13.759651394296384 ], [ -88.523247442715274, 13.776911322399599 ], [ -88.513919847123248, 13.790838121082402 ], [ -88.516012743093597, 13.804713242921821 ], [ -88.505315721043701, 13.811431179505291 ], [ -88.498210211731873, 13.821404731143389 ], [ -88.496789110229258, 13.833264472277563 ], [ -88.50296444355422, 13.845692654192646 ], [ -88.498675299725278, 13.849568385972248 ], [ -88.496815755342823, 13.851197002439676 ], [ -88.470150715999864, 13.852488912000098 ], [ -88.451443847999883, 13.863573507000098 ], [ -88.433227905999843, 13.871066590000041 ], [ -88.392946126999902, 13.879774068000103 ], [ -88.383360148999884, 13.879257304000063 ], [ -88.36741796899986, 13.873107809000089 ], [ -88.360105753999875, 13.872384338000103 ], [ -88.358917195999936, 13.87527821900008 ], [ -88.358917195999936, 13.881195170000098 ], [ -88.358193725999854, 13.887396343000077 ], [ -88.355067301999895, 13.890962016000046 ], [ -88.348556071999923, 13.891375427000057 ], [ -88.340572062999854, 13.890031840000091 ], [ -88.332613891999898, 13.887706401000059 ], [ -88.326206014999855, 13.885070903000056 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-UN", "NAME_1": "La Unión" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -87.817890787999943, 13.915870057000106 ], [ -87.808459839999898, 13.908635356000048 ], [ -87.798718831999935, 13.882332051000105 ], [ -87.790605631999938, 13.870472310000082 ], [ -87.785412150999917, 13.86739756200005 ], [ -87.771433674999912, 13.862126567000104 ], [ -87.765335855999865, 13.858870952000117 ], [ -87.749528722999912, 13.845627388000096 ], [ -87.721204183999873, 13.821896464000076 ], [ -87.703608357999883, 13.814997661000106 ], [ -87.712625895999849, 13.800450745000148 ], [ -87.732805541999937, 13.75510467600013 ], [ -87.737843993999888, 13.738774923000094 ], [ -87.731358602999933, 13.72221262700009 ], [ -87.73629370099988, 13.711463929000075 ], [ -87.746318929999887, 13.702188009000054 ], [ -87.755026407999964, 13.689914857000119 ], [ -87.758643757999948, 13.672267355000116 ], [ -87.757816935999926, 13.635163676000047 ], [ -87.760090698999932, 13.616947734000092 ], [ -87.784068563999938, 13.560465394000047 ], [ -87.789933838999843, 13.53281850200004 ], [ -87.779469360999911, 13.509977519000131 ], [ -87.769159911999907, 13.506360168000057 ], [ -87.747972574999949, 13.513233135000107 ], [ -87.733425659999909, 13.507703756000112 ], [ -87.725725871999913, 13.498970439000047 ], [ -87.720584065999901, 13.486981507000081 ], [ -87.718801228999922, 13.473674825000074 ], [ -87.721152506999942, 13.460833232000084 ], [ -87.738412434999958, 13.441687113000071 ], [ -87.817168748999904, 13.40656159100007 ], [ -87.817860480999911, 13.406805731000077 ], [ -87.825713670999903, 13.411281643000052 ], [ -87.830677863999938, 13.419501044000071 ], [ -87.838286912999934, 13.44094472900008 ], [ -87.866444464999915, 13.393337307000081 ], [ -87.873768683999913, 13.365261135000083 ], [ -87.855376756999931, 13.352809963000084 ], [ -87.843617316999939, 13.348456122000073 ], [ -87.810414191999939, 13.317409572000088 ], [ -87.791533982999908, 13.304958401000079 ], [ -87.789906378999945, 13.299099026000079 ], [ -87.789906378999945, 13.287014065000051 ], [ -87.798085089999915, 13.265651760000083 ], [ -87.817982550999943, 13.250392971000053 ], [ -87.892323370999918, 13.213893947000088 ], [ -87.912464972999942, 13.198187567000048 ], [ -87.916005011999914, 13.182196356000077 ], [ -87.892933722999942, 13.166571356000077 ], [ -87.928212042999917, 13.158636786000045 ], [ -88.066029425999943, 13.167873440000051 ], [ -88.091470945800239, 13.172705728065043 ], [ -88.091465012999947, 13.172787991372672 ], [ -88.085961473243401, 13.251103624332757 ], [ -88.084617886106514, 13.258855088791279 ], [ -88.081982387776975, 13.268673610798487 ], [ -88.079889492705888, 13.267820950076782 ], [ -88.071672940253961, 13.261878159849175 ], [ -88.063068814174414, 13.256813870563633 ], [ -88.052552660177128, 13.253170680982123 ], [ -88.049322882644901, 13.252550564257149 ], [ -88.045963914802826, 13.252498888313028 ], [ -88.041313035767985, 13.253868312972259 ], [ -88.038935919856783, 13.256219591361059 ], [ -88.025887621216725, 13.297922472144364 ], [ -88.02518998922659, 13.304020291103541 ], [ -88.02674028193843, 13.309885566065986 ], [ -88.027050341200265, 13.314019680264039 ], [ -88.014234584758242, 13.385953274324152 ], [ -88.014647996807582, 13.388356227757697 ], [ -88.015500658428607, 13.390836697355667 ], [ -88.016663378412147, 13.393239650789212 ], [ -88.026042649948295, 13.407760727775326 ], [ -88.027257045875956, 13.410163683007568 ], [ -88.028238897806887, 13.412747504493723 ], [ -88.031132778554877, 13.430343329381117 ], [ -88.031597867447601, 13.456000677988868 ], [ -88.030771044248297, 13.46240855620988 ], [ -88.029220750637137, 13.466439316721051 ], [ -88.027360398663461, 13.467912095966426 ], [ -88.023019578890455, 13.470315050299291 ], [ -88.020306566195075, 13.472201238896048 ], [ -88.017516039133909, 13.474552517284849 ], [ -88.013795336085877, 13.478945013901239 ], [ -88.012787644833907, 13.482381497008475 ], [ -88.012787644833907, 13.485611274540645 ], [ -88.016663378412147, 13.50000316031759 ], [ -88.017205979872074, 13.530233872695078 ], [ -88.015061407957603, 13.542868761084435 ], [ -88.008550177848406, 13.551447047842942 ], [ -87.977595995059119, 13.583744819567755 ], [ -87.970257940851297, 13.594545193505837 ], [ -87.968552619407831, 13.613329575899172 ], [ -87.945634121017861, 13.671052151335687 ], [ -87.939613817323789, 13.697975571815164 ], [ -87.936668259732357, 13.721204128567649 ], [ -87.936358202269219, 13.740298570222819 ], [ -87.937365891722493, 13.746344713237932 ], [ -87.938141038977733, 13.748851020358302 ], [ -87.939122890908664, 13.751228136269447 ], [ -87.940518154888935, 13.753424384128039 ], [ -87.94503984181523, 13.759108791937194 ], [ -87.946254238642155, 13.761227525429945 ], [ -87.94695186973297, 13.763914699703605 ], [ -87.947210253050741, 13.767170314758232 ], [ -87.943076137953369, 13.827890122830865 ], [ -87.94503984181523, 13.856131292924829 ], [ -87.949380663386876, 13.872409369097113 ], [ -87.952594894338858, 13.892029035511541 ], [ -87.946926839999918, 13.890910339000129 ], [ -87.932173217999889, 13.881556905000096 ], [ -87.925326090999931, 13.879619039000062 ], [ -87.920752725999904, 13.881866963000078 ], [ -87.907885294999886, 13.891530457000101 ], [ -87.900107991999874, 13.894140117000106 ], [ -87.890108602999959, 13.893545837000147 ], [ -87.87054907299995, 13.889566752000064 ], [ -87.860911417999944, 13.890186870000036 ], [ -87.851222087999901, 13.896878968000053 ], [ -87.842953857999959, 13.907110901000038 ], [ -87.832902791999913, 13.915249939000134 ], [ -87.817890787999943, 13.915870057000106 ] ] ], [ [ [ -87.726293426999916, 13.198387437000065 ], [ -87.727187439999909, 13.211114757000075 ], [ -87.719913325999926, 13.216190972000049 ], [ -87.706086587999948, 13.211726236000061 ], [ -87.697564970999906, 13.193313885000066 ], [ -87.696996275999936, 13.178063536000082 ], [ -87.693193511999937, 13.167862440000079 ], [ -87.701673410999945, 13.163412359000063 ], [ -87.714584805999948, 13.167903057000046 ], [ -87.723110910999935, 13.164077582000061 ], [ -87.723028398999929, 13.174895253000045 ], [ -87.728351879999934, 13.185678928000073 ], [ -87.726293426999916, 13.198387437000065 ] ] ], [ [ [ -87.765782054999931, 13.248011011000074 ], [ -87.757933196999943, 13.243557905000046 ], [ -87.751386787999934, 13.228924729000084 ], [ -87.757267368999919, 13.220651650000036 ], [ -87.763804817999926, 13.214287112000079 ], [ -87.776890196999943, 13.225736371000039 ], [ -87.780168819999915, 13.241643430000067 ], [ -87.774286185999927, 13.247372301000041 ], [ -87.765782054999931, 13.248011011000074 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-SO", "NAME_1": "Sonsonate" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.609424675506958, 13.513063056996836 ], [ -89.616352566999922, 13.514382675000093 ], [ -89.67976587499993, 13.534732428000041 ], [ -89.713127605999944, 13.527996506000079 ], [ -89.80804823099993, 13.526857633000077 ], [ -89.823296528999947, 13.537140191000049 ], [ -89.833376673999908, 13.573887876000072 ], [ -89.837147589999915, 13.596828518000052 ], [ -89.849662051999928, 13.606876111000076 ], [ -89.870262593999939, 13.619275773000084 ], [ -89.951318273999902, 13.664110063000066 ], [ -89.953482681905044, 13.665072624253359 ], [ -89.951222297371089, 13.668778388212047 ], [ -89.935331793927105, 13.693143826526352 ], [ -89.927838710987714, 13.701851305393404 ], [ -89.925022346404148, 13.704176744461165 ], [ -89.922593552750243, 13.70580455243811 ], [ -89.919622159435107, 13.70714813957494 ], [ -89.916289029115376, 13.708207505871712 ], [ -89.910552945362099, 13.709241033746707 ], [ -89.906522183052289, 13.709241033746707 ], [ -89.902982347157604, 13.708853461018407 ], [ -89.900295172883887, 13.707923285031541 ], [ -89.897892218551021, 13.706838080313162 ], [ -89.893758104353026, 13.704047553251939 ], [ -89.891768562069444, 13.702419745274995 ], [ -89.878668585686682, 13.687717800236271 ], [ -89.871408046743966, 13.6809740261304 ], [ -89.869418505359704, 13.679604600571849 ], [ -89.863243171135423, 13.678338527800804 ], [ -89.833064133802736, 13.676659043879738 ], [ -89.824770066984968, 13.677718411075773 ], [ -89.819757452744227, 13.679682114937634 ], [ -89.814098884256111, 13.701928818859869 ], [ -89.81226436980478, 13.70676056594732 ], [ -89.799448615161452, 13.729188137022902 ], [ -89.798621791962091, 13.731720282564993 ], [ -89.798053352080501, 13.74091868694785 ], [ -89.796451381625957, 13.745207830776735 ], [ -89.793531664254886, 13.750608017745833 ], [ -89.785935227628613, 13.759341335933868 ], [ -89.782963833414158, 13.764095566856895 ], [ -89.781594407855607, 13.768048813901601 ], [ -89.782653775051642, 13.773604031400907 ], [ -89.79110287060098, 13.799597275893575 ], [ -89.79056026914111, 13.803602199781665 ], [ -89.788699917167435, 13.809028225172426 ], [ -89.768339402741219, 13.83920726250517 ], [ -89.767745124437909, 13.84266958313475 ], [ -89.768649462003054, 13.844995022202511 ], [ -89.771000738593216, 13.849594224393911 ], [ -89.772835253044491, 13.854141751540567 ], [ -89.774488897644517, 13.859955348760309 ], [ -89.776866013555662, 13.878662217687179 ], [ -89.776633469558931, 13.882899685571999 ], [ -89.775625780105656, 13.889281724471971 ], [ -89.773481208191185, 13.892149765898978 ], [ -89.770716518652421, 13.893984280350253 ], [ -89.758546719155731, 13.895792955480488 ], [ -89.736584235174291, 13.901709906387055 ], [ -89.718833380655951, 13.908970445329771 ], [ -89.695553147959401, 13.903286038419935 ], [ -89.686587286673898, 13.90357025836073 ], [ -89.681109585339073, 13.904991359863345 ], [ -89.678086514281176, 13.905378933490965 ], [ -89.674908412693071, 13.905378933490965 ], [ -89.67025753455755, 13.90318268473311 ], [ -89.664443936438488, 13.899022732113394 ], [ -89.648217536210325, 13.883597317562135 ], [ -89.645246141096493, 13.879618232095709 ], [ -89.642093878829428, 13.872486884362218 ], [ -89.639871791649853, 13.869593004513547 ], [ -89.636745367804451, 13.866208197350431 ], [ -89.630621711322874, 13.860704656694509 ], [ -89.626177537863043, 13.853676663547162 ], [ -89.625092333144664, 13.848509018776156 ], [ -89.625324877141338, 13.845692654192646 ], [ -89.626125861019659, 13.842927965553145 ], [ -89.627417772212425, 13.840680039951849 ], [ -89.628968064924265, 13.838948879187399 ], [ -89.632817959181466, 13.835874132185438 ], [ -89.634523282423515, 13.833936265845978 ], [ -89.635686000608416, 13.831714179565722 ], [ -89.636125251079477, 13.829207872445352 ], [ -89.634833339886711, 13.827063300530881 ], [ -89.631603563253805, 13.8250995957697 ], [ -89.625376553085459, 13.82396271420788 ], [ -89.620803189315723, 13.819389350438144 ], [ -89.618426073404521, 13.816082058540132 ], [ -89.617263353420981, 13.812981472217132 ], [ -89.616023119071656, 13.810656033149371 ], [ -89.614317796728926, 13.808821518698096 ], [ -89.612121547971071, 13.807116197254686 ], [ -89.608891771338165, 13.80585012538296 ], [ -89.604163377937539, 13.804919949396151 ], [ -89.596980354259927, 13.806573594895497 ], [ -89.59336300310008, 13.808356432503331 ], [ -89.591115078398104, 13.810630194727707 ], [ -89.59046912325141, 13.813058987482293 ], [ -89.59049496077381, 13.82202484786842 ], [ -89.589177212058644, 13.827528388524286 ], [ -89.585973272948195, 13.834556383470328 ], [ -89.583311937096198, 13.83881968797823 ], [ -89.581580777231068, 13.840680039951849 ], [ -89.579642910891607, 13.84207530393212 ], [ -89.576929898196227, 13.842747097500535 ], [ -89.570134447246915, 13.839827379230144 ], [ -89.560470953971333, 13.834194648264372 ], [ -89.539335293189197, 13.818872586500675 ], [ -89.526054449653088, 13.80678030047045 ], [ -89.520008308436672, 13.792155869797512 ], [ -89.518638881978802, 13.790088813148202 ], [ -89.517036913322897, 13.788150946808742 ], [ -89.504272833724258, 13.783939317345585 ], [ -89.456627162713346, 13.775076808847643 ], [ -89.445206672050233, 13.771588649796342 ], [ -89.442777880195024, 13.770425929812802 ], [ -89.440710821747018, 13.768953152366066 ], [ -89.438979661881888, 13.767377021232505 ], [ -89.437661913166721, 13.765309962784556 ], [ -89.436654221914807, 13.76285533340689 ], [ -89.436163296399002, 13.760064806345724 ], [ -89.437584397901617, 13.756395779241814 ], [ -89.440297410596997, 13.752442532197108 ], [ -89.447480435173929, 13.74626719797277 ], [ -89.453784959708116, 13.74184886293466 ], [ -89.468538580690904, 13.733528957695228 ], [ -89.473964606081665, 13.728568020297871 ], [ -89.485798508794119, 13.714486191984179 ], [ -89.489829271103986, 13.711359768138777 ], [ -89.493756679726971, 13.709680284217711 ], [ -89.500758837150613, 13.709060167492737 ], [ -89.502980923430869, 13.708440049868386 ], [ -89.507089200106464, 13.706114609901306 ], [ -89.509078742390045, 13.704331773192791 ], [ -89.5112749911479, 13.70063690856648 ], [ -89.513497077428156, 13.695210883175719 ], [ -89.516442634120267, 13.683299465198161 ], [ -89.518018765253771, 13.671749783325822 ], [ -89.516726854061062, 13.649709784079278 ], [ -89.516985235580137, 13.646402493080586 ], [ -89.519672410753117, 13.641544908470735 ], [ -89.524633348150473, 13.635007839040497 ], [ -89.546389125657583, 13.613794663892634 ], [ -89.548456184105589, 13.612399399912363 ], [ -89.550471563911515, 13.610435696050502 ], [ -89.552745327035211, 13.607257595361716 ], [ -89.555122442946356, 13.602348333908481 ], [ -89.556982794920032, 13.594002590247328 ], [ -89.558300543635141, 13.581961981959864 ], [ -89.561013557229842, 13.577931220549374 ], [ -89.565431892268009, 13.572970282252697 ], [ -89.590727504770484, 13.551395371898877 ], [ -89.596076015795461, 13.54294627545022 ], [ -89.606669685057909, 13.519355984391154 ], [ -89.609424675506958, 13.513063056996836 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-LI", "NAME_1": "La Libertad" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.135715548042128, 13.414457692887732 ], [ -89.183501756999931, 13.443060614000046 ], [ -89.251454230999911, 13.472316799000055 ], [ -89.32485917899993, 13.489325262000079 ], [ -89.358998175999943, 13.489325262000079 ], [ -89.38499915299991, 13.495306708000044 ], [ -89.527066724999941, 13.494173340000089 ], [ -89.587790098999903, 13.508942124000043 ], [ -89.609424675506958, 13.513063056996836 ], [ -89.606669685057909, 13.519355984391154 ], [ -89.596076015795461, 13.54294627545022 ], [ -89.590727504770484, 13.551395371898877 ], [ -89.565431892268009, 13.572970282252697 ], [ -89.561013557229842, 13.577931220549374 ], [ -89.558300543635141, 13.581961981959864 ], [ -89.556982794920032, 13.594002590247328 ], [ -89.555122442946356, 13.602348333908481 ], [ -89.552745327035211, 13.607257595361716 ], [ -89.550471563911515, 13.610435696050502 ], [ -89.548456184105589, 13.612399399912363 ], [ -89.546389125657583, 13.613794663892634 ], [ -89.524633348150473, 13.635007839040497 ], [ -89.519672410753117, 13.641544908470735 ], [ -89.516985235580137, 13.646402493080586 ], [ -89.516726854061062, 13.649709784079278 ], [ -89.518018765253771, 13.671749783325822 ], [ -89.516442634120267, 13.683299465198161 ], [ -89.513497077428156, 13.695210883175719 ], [ -89.5112749911479, 13.70063690856648 ], [ -89.509078742390045, 13.704331773192791 ], [ -89.507089200106464, 13.706114609901306 ], [ -89.502980923430869, 13.708440049868386 ], [ -89.500758837150613, 13.709060167492737 ], [ -89.493756679726971, 13.709680284217711 ], [ -89.489829271103986, 13.711359768138777 ], [ -89.485798508794119, 13.714486191984179 ], [ -89.473964606081665, 13.728568020297871 ], [ -89.468538580690904, 13.733528957695228 ], [ -89.453784959708116, 13.74184886293466 ], [ -89.447480435173929, 13.74626719797277 ], [ -89.440297410596997, 13.752442532197108 ], [ -89.437584397901617, 13.756395779241814 ], [ -89.436163296399002, 13.760064806345724 ], [ -89.436654221914807, 13.76285533340689 ], [ -89.437661913166721, 13.765309962784556 ], [ -89.438979661881888, 13.767377021232505 ], [ -89.440710821747018, 13.768953152366066 ], [ -89.442777880195024, 13.770425929812802 ], [ -89.445206672050233, 13.771588649796342 ], [ -89.456627162713346, 13.775076808847643 ], [ -89.452002122999545, 13.80293040621325 ], [ -89.434457974056215, 13.849490872505726 ], [ -89.432597622082596, 13.870755724497087 ], [ -89.433424445281901, 13.888790798056846 ], [ -89.432106695667471, 13.915585029125793 ], [ -89.43089229973981, 13.921166083248124 ], [ -89.429342007027969, 13.923078111165864 ], [ -89.427223272635899, 13.924447536724415 ], [ -89.424820319202354, 13.925067654348766 ], [ -89.422133144928694, 13.924860947874436 ], [ -89.419626837808323, 13.924085802417835 ], [ -89.416836310747101, 13.924473375146135 ], [ -89.41355485727081, 13.926540431795502 ], [ -89.405570847916294, 13.939020291453289 ], [ -89.403452115322864, 13.940105496171668 ], [ -89.400687424884723, 13.94038971611252 ], [ -89.397380133886031, 13.940312200847359 ], [ -89.393659430838056, 13.94054474484409 ], [ -89.38854346380981, 13.942740994501264 ], [ -89.386295539107834, 13.945428167875605 ], [ -89.385210334389399, 13.948554591721006 ], [ -89.383660040778238, 13.9677265495406 ], [ -89.383918423196633, 13.970827134964281 ], [ -89.382187263331502, 13.98527069758461 ], [ -89.37136105007238, 14.04059031778894 ], [ -89.367020230299374, 14.047411607159916 ], [ -89.363816291188868, 14.054232896530948 ], [ -89.355496385050117, 14.057333481954629 ], [ -89.343688320759384, 14.059555569134204 ], [ -89.334567429842991, 14.064438992165719 ], [ -89.324774746257503, 14.071622015843332 ], [ -89.314439460312826, 14.069606635138086 ], [ -89.296404384954371, 14.059633084399309 ], [ -89.280074632838023, 14.057333481954629 ], [ -89.276819016884076, 14.056377468445419 ], [ -89.26731055413876, 14.052114163038198 ], [ -89.26844743480126, 14.018421129131809 ], [ -89.273795945826237, 13.996949571565438 ], [ -89.274106005088072, 13.991549383697077 ], [ -89.273330857832832, 13.987983710279991 ], [ -89.26731055413876, 13.983410346510254 ], [ -89.264907599805895, 13.979948024981354 ], [ -89.262013719057848, 13.974702866743883 ], [ -89.257026944138147, 13.963385727968955 ], [ -89.254055549024372, 13.957985540999914 ], [ -89.251316697907271, 13.954419867582828 ], [ -89.247105069343434, 13.951758530831512 ], [ -89.242376675043488, 13.949536445450576 ], [ -89.234263475379066, 13.947159329539431 ], [ -89.231266241843571, 13.946978461486822 ], [ -89.222041999038993, 13.947701930999301 ], [ -89.218889736771928, 13.947598578211796 ], [ -89.215918341658096, 13.947211005483496 ], [ -89.213076137753546, 13.946539211015761 ], [ -89.210363125058166, 13.945583197506551 ], [ -89.207133348425259, 13.943800360797979 ], [ -89.203490159743069, 13.940854804105925 ], [ -89.198141648718092, 13.938090115466423 ], [ -89.196591356006252, 13.936048896339457 ], [ -89.196203783277952, 13.934369412418448 ], [ -89.198839280708228, 13.927806505465867 ], [ -89.200157030322657, 13.922199612022439 ], [ -89.200544603050957, 13.920959376773794 ], [ -89.201371426250319, 13.920313422526419 ], [ -89.208838670768046, 13.92052012810143 ], [ -89.211422492254201, 13.919822496111294 ], [ -89.213282844227876, 13.918065496925124 ], [ -89.214316372102871, 13.914809881870553 ], [ -89.219328986343612, 13.859025172773499 ], [ -89.220775926267947, 13.853366604285327 ], [ -89.221886970307423, 13.851092841161687 ], [ -89.223928189434389, 13.849723416502457 ], [ -89.229069993985036, 13.847863064528781 ], [ -89.231266241843571, 13.846545314914351 ], [ -89.233333300291577, 13.845020859724855 ], [ -89.236356371349416, 13.841274319154479 ], [ -89.238371752054718, 13.836468411388068 ], [ -89.239586147982322, 13.831714179565722 ], [ -89.241446499056678, 13.814273383409898 ], [ -89.243539395027028, 13.806547756473776 ], [ -89.246795010081655, 13.799209703165275 ], [ -89.248629522734291, 13.789985460360697 ], [ -89.249818081139495, 13.773991604129208 ], [ -89.250670742760576, 13.769728297822667 ], [ -89.251420050694776, 13.767221990702296 ], [ -89.258318855330913, 13.754561265689858 ], [ -89.262685512626263, 13.742081406931391 ], [ -89.262375454263804, 13.738076483942564 ], [ -89.260566779133512, 13.735983587972214 ], [ -89.258008796069078, 13.735311794403799 ], [ -89.254779019436171, 13.735053411985348 ], [ -89.24976640519543, 13.728723049029497 ], [ -89.250748257126361, 13.71874949829072 ], [ -89.250050625136225, 13.709241033746707 ], [ -89.24896542041779, 13.706734727525657 ], [ -89.247595994859239, 13.70464183245457 ], [ -89.245942349359893, 13.702703966115109 ], [ -89.242092455102693, 13.699939277475664 ], [ -89.240206264707354, 13.697510483821759 ], [ -89.238991868779692, 13.694151515979684 ], [ -89.237157355227737, 13.686322537155377 ], [ -89.235658739359337, 13.681981716482994 ], [ -89.23374671144154, 13.67906199821266 ], [ -89.231576301105406, 13.67751170550082 ], [ -89.217184414429141, 13.670018622561372 ], [ -89.215453253664691, 13.668881740999552 ], [ -89.211164109835806, 13.6651351995298 ], [ -89.204472011674, 13.656479397506189 ], [ -89.203490159743069, 13.652655340771332 ], [ -89.203800218105584, 13.649580592870052 ], [ -89.207081671581875, 13.643611965120101 ], [ -89.209407110649636, 13.638134263785219 ], [ -89.209303757862131, 13.635033678361538 ], [ -89.207133348425259, 13.632785752760242 ], [ -89.199459398332522, 13.629220079343156 ], [ -89.198270839927318, 13.626817125010291 ], [ -89.198761766342443, 13.624595037830716 ], [ -89.200389574319388, 13.622631333968855 ], [ -89.202404955024633, 13.621081041257014 ], [ -89.203800218105584, 13.615370795026138 ], [ -89.204575365360824, 13.606017361012391 ], [ -89.202715013387149, 13.564676215434986 ], [ -89.203180101380553, 13.561523953167864 ], [ -89.209432949970619, 13.545736803410762 ], [ -89.211680873773275, 13.537132677331158 ], [ -89.212042608979232, 13.532404283031212 ], [ -89.211448329776601, 13.528683579983237 ], [ -89.195428636022712, 13.50346548094717 ], [ -89.189770066635276, 13.491579902290653 ], [ -89.18829728918854, 13.489693711895256 ], [ -89.186075202008965, 13.488479315967652 ], [ -89.183155483738574, 13.488117580761752 ], [ -89.180003220572132, 13.488272610392642 ], [ -89.174396328028081, 13.489564520686088 ], [ -89.163931850874178, 13.492975165371547 ], [ -89.157989060646628, 13.493672797361683 ], [ -89.154268357598596, 13.493181870946557 ], [ -89.151736212955825, 13.492484238956422 ], [ -89.144372321225603, 13.489254462323572 ], [ -89.140884162174302, 13.472976386151288 ], [ -89.137861091116463, 13.468816433531572 ], [ -89.135458136783541, 13.468919786319077 ], [ -89.131272345742161, 13.468687242322346 ], [ -89.125742966664575, 13.467447007973021 ], [ -89.115898607134966, 13.46354543687238 ], [ -89.112668829602796, 13.4601089537652 ], [ -89.111867844825156, 13.457292589181634 ], [ -89.114425828788967, 13.452951768509308 ], [ -89.119231736555378, 13.447189846334311 ], [ -89.120523647748144, 13.445148627207345 ], [ -89.122073941359304, 13.443236599289605 ], [ -89.12987708176189, 13.429749050178486 ], [ -89.132667608823056, 13.423780422428536 ], [ -89.135690680780272, 13.414530341202294 ], [ -89.135715548042128, 13.414457692887732 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-PA", "NAME_1": "La Paz" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.831558195814722, 13.266079643793562 ], [ -89.064808722999942, 13.372015692000048 ], [ -89.135715548042128, 13.414457692887732 ], [ -89.135690680780272, 13.414530341202294 ], [ -89.132667608823056, 13.423780422428536 ], [ -89.12987708176189, 13.429749050178486 ], [ -89.122073941359304, 13.443236599289605 ], [ -89.120523647748144, 13.445148627207345 ], [ -89.119231736555378, 13.447189846334311 ], [ -89.114425828788967, 13.452951768509308 ], [ -89.111867844825156, 13.457292589181634 ], [ -89.112668829602796, 13.4601089537652 ], [ -89.115898607134966, 13.46354543687238 ], [ -89.125742966664575, 13.467447007973021 ], [ -89.131272345742161, 13.468687242322346 ], [ -89.135458136783541, 13.468919786319077 ], [ -89.137861091116463, 13.468816433531572 ], [ -89.140884162174302, 13.472976386151288 ], [ -89.144372321225603, 13.489254462323572 ], [ -89.142201910889469, 13.497677721249829 ], [ -89.139230515775637, 13.499563909846529 ], [ -89.132073329620425, 13.507341212726772 ], [ -89.126957364390819, 13.517960720410883 ], [ -89.118456591098777, 13.542739569875209 ], [ -89.116208666396801, 13.553539943813348 ], [ -89.115666063138292, 13.560567938759334 ], [ -89.117603928578433, 13.565477200212626 ], [ -89.12527787957049, 13.578680528483574 ], [ -89.128197597840824, 13.586716212882891 ], [ -89.130032111392836, 13.595397854227599 ], [ -89.129592861821095, 13.599997057318319 ], [ -89.12817176031848, 13.603149318686121 ], [ -89.125949673138905, 13.604363715513045 ], [ -89.123236661342844, 13.604854641028851 ], [ -89.120058559754739, 13.604854641028851 ], [ -89.116983811853402, 13.604467068300551 ], [ -89.101015794942953, 13.599351101272305 ], [ -89.097941047041672, 13.5988860132789 ], [ -89.094892136662736, 13.598730984547274 ], [ -89.08980200895553, 13.60252920196109 ], [ -89.059726325309668, 13.6397362333405 ], [ -89.023578661126294, 13.672938340831763 ], [ -88.979550341275228, 13.657228705440389 ], [ -88.962238736328629, 13.648185329789101 ], [ -88.94335100024847, 13.642294216404935 ], [ -88.939940354663634, 13.642449246035881 ], [ -88.935470343681402, 13.643095201182575 ], [ -88.933506638920221, 13.643663641963485 ], [ -88.931336228584087, 13.644671332316136 ], [ -88.929785935872246, 13.646531684289812 ], [ -88.927563849591991, 13.651337592056223 ], [ -88.925961880036709, 13.653197944029898 ], [ -88.923791469700575, 13.654412339957503 ], [ -88.921078457005194, 13.655213323835824 ], [ -88.908546923201925, 13.656686103081199 ], [ -88.903017544124339, 13.658546454155498 ], [ -88.896067064443457, 13.662577216465365 ], [ -88.88857398060469, 13.642940172451006 ], [ -88.888238084719831, 13.626507065748456 ], [ -88.88934912785993, 13.609583035328797 ], [ -88.888263923141494, 13.602761745957821 ], [ -88.886377732746155, 13.598756822069674 ], [ -88.883277147322474, 13.598420925285438 ], [ -88.880073208211968, 13.5984984405506 ], [ -88.876946784366567, 13.5988860132789 ], [ -88.853046434045666, 13.606172389743961 ], [ -88.848938158269391, 13.606379096218291 ], [ -88.844390632022055, 13.605629788284091 ], [ -88.836509976354307, 13.602761745957821 ], [ -88.833848639602991, 13.599506130003874 ], [ -88.80919898134789, 13.548113919321906 ], [ -88.808475510936091, 13.545323391361421 ], [ -88.80803626226367, 13.54240367309103 ], [ -88.80824296693936, 13.535995794870018 ], [ -88.809483202188005, 13.530233872695078 ], [ -88.817157152280743, 13.509821682324741 ], [ -88.817699754639932, 13.507444566413596 ], [ -88.818552416260957, 13.505119127345836 ], [ -88.819250048251092, 13.50191518823533 ], [ -88.819405076982719, 13.500364895523489 ], [ -88.819405076982719, 13.500054836261654 ], [ -88.823409999971489, 13.478169867545319 ], [ -88.823565029602435, 13.473622341297983 ], [ -88.822118089678099, 13.456233221985599 ], [ -88.820800340962933, 13.450548814176443 ], [ -88.819353400139278, 13.446414699978391 ], [ -88.812816331608417, 13.439335029088284 ], [ -88.806796027015025, 13.434709988475163 ], [ -88.798062709726253, 13.429516506181812 ], [ -88.791163906888755, 13.42308279133772 ], [ -88.78452348467107, 13.414814561143089 ], [ -88.782275559969094, 13.409698595014106 ], [ -88.781319545560564, 13.405461127129286 ], [ -88.781629604822399, 13.402360540806285 ], [ -88.782973191959229, 13.396650295474728 ], [ -88.783825852680934, 13.394221502720143 ], [ -88.78514360229542, 13.392076930805672 ], [ -88.791189745310476, 13.387451891091871 ], [ -88.792843390809821, 13.385720730327421 ], [ -88.794109462681547, 13.38357615841295 ], [ -88.794962124302572, 13.380992336027475 ], [ -88.795401373874313, 13.378046780234683 ], [ -88.795556402605882, 13.374817002702514 ], [ -88.791034715679586, 13.333966783540234 ], [ -88.791318935620382, 13.328308214152742 ], [ -88.792610846813091, 13.326060289450766 ], [ -88.794161140424251, 13.324199937477147 ], [ -88.796176521129553, 13.322365423925135 ], [ -88.798269416200583, 13.32097015994492 ], [ -88.807493659005161, 13.316474311440288 ], [ -88.814857550735383, 13.313606269114018 ], [ -88.819327561717557, 13.311125800415368 ], [ -88.823177455974815, 13.308025214092368 ], [ -88.82480526395176, 13.306113186174571 ], [ -88.826200527931974, 13.304046129525261 ], [ -88.827414923859635, 13.301643175192339 ], [ -88.828370938268165, 13.299136868071969 ], [ -88.829120246202365, 13.296294664167419 ], [ -88.831549038057631, 13.266193142099837 ], [ -88.831558195814722, 13.266079643793562 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-SV", "NAME_1": "San Vicente" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.81663977799991, 13.25930410400008 ], [ -88.831558195814722, 13.266079643793562 ], [ -88.831549038057631, 13.266193142099837 ], [ -88.829120246202365, 13.296294664167419 ], [ -88.828370938268165, 13.299136868071969 ], [ -88.827414923859635, 13.301643175192339 ], [ -88.826200527931974, 13.304046129525261 ], [ -88.82480526395176, 13.306113186174571 ], [ -88.823177455974815, 13.308025214092368 ], [ -88.819327561717557, 13.311125800415368 ], [ -88.814857550735383, 13.313606269114018 ], [ -88.807493659005161, 13.316474311440288 ], [ -88.798269416200583, 13.32097015994492 ], [ -88.796176521129553, 13.322365423925135 ], [ -88.794161140424251, 13.324199937477147 ], [ -88.792610846813091, 13.326060289450766 ], [ -88.791318935620382, 13.328308214152742 ], [ -88.791034715679586, 13.333966783540234 ], [ -88.795556402605882, 13.374817002702514 ], [ -88.795401373874313, 13.378046780234683 ], [ -88.794962124302572, 13.380992336027475 ], [ -88.794109462681547, 13.38357615841295 ], [ -88.792843390809821, 13.385720730327421 ], [ -88.791189745310476, 13.387451891091871 ], [ -88.78514360229542, 13.392076930805672 ], [ -88.783825852680934, 13.394221502720143 ], [ -88.782973191959229, 13.396650295474728 ], [ -88.781629604822399, 13.402360540806285 ], [ -88.781319545560564, 13.405461127129286 ], [ -88.782275559969094, 13.409698595014106 ], [ -88.78452348467107, 13.414814561143089 ], [ -88.791163906888755, 13.42308279133772 ], [ -88.798062709726253, 13.429516506181812 ], [ -88.806796027015025, 13.434709988475163 ], [ -88.812816331608417, 13.439335029088284 ], [ -88.819353400139278, 13.446414699978391 ], [ -88.820800340962933, 13.450548814176443 ], [ -88.822118089678099, 13.456233221985599 ], [ -88.823565029602435, 13.473622341297983 ], [ -88.823409999971489, 13.478169867545319 ], [ -88.819405076982719, 13.500054836261654 ], [ -88.819405076982719, 13.500364895523489 ], [ -88.819250048251092, 13.50191518823533 ], [ -88.818552416260957, 13.505119127345836 ], [ -88.817699754639932, 13.507444566413596 ], [ -88.817157152280743, 13.509821682324741 ], [ -88.809483202188005, 13.530233872695078 ], [ -88.80824296693936, 13.535995794870018 ], [ -88.80803626226367, 13.54240367309103 ], [ -88.808475510936091, 13.545323391361421 ], [ -88.80919898134789, 13.548113919321906 ], [ -88.833848639602991, 13.599506130003874 ], [ -88.836509976354307, 13.602761745957821 ], [ -88.844390632022055, 13.605629788284091 ], [ -88.848938158269391, 13.606379096218291 ], [ -88.853046434045666, 13.606172389743961 ], [ -88.876946784366567, 13.5988860132789 ], [ -88.880073208211968, 13.5984984405506 ], [ -88.883277147322474, 13.598420925285438 ], [ -88.886377732746155, 13.598756822069674 ], [ -88.888263923141494, 13.602761745957821 ], [ -88.88934912785993, 13.609583035328797 ], [ -88.888238084719831, 13.626507065748456 ], [ -88.88857398060469, 13.642940172451006 ], [ -88.896067064443457, 13.662577216465365 ], [ -88.876585049160667, 13.681284085392235 ], [ -88.874337123559371, 13.68461721391327 ], [ -88.871934170125826, 13.689190579481647 ], [ -88.868497687917966, 13.703194892530234 ], [ -88.850255906984501, 13.750633857066816 ], [ -88.84886064300423, 13.779314276732464 ], [ -88.847051967873995, 13.78233734779036 ], [ -88.844235603290429, 13.786058050838335 ], [ -88.837801886647753, 13.78579966931926 ], [ -88.831962450106971, 13.784481919704831 ], [ -88.821575487318853, 13.781097113441035 ], [ -88.814702522003756, 13.782208157480454 ], [ -88.805039028728174, 13.78520539011663 ], [ -88.773929816307941, 13.798641262384365 ], [ -88.767341070933639, 13.800372423148815 ], [ -88.760183884778428, 13.798589586440244 ], [ -88.754266933871861, 13.798098660025119 ], [ -88.75077877482056, 13.800346584727095 ], [ -88.74752315976599, 13.80370555346849 ], [ -88.742510546424569, 13.810165106734246 ], [ -88.738919033686443, 13.811973781864538 ], [ -88.735611741788432, 13.812283840227053 ], [ -88.721219855112224, 13.802155259857329 ], [ -88.716491461711598, 13.800915025508004 ], [ -88.70936011397805, 13.800294907883654 ], [ -88.677424079257833, 13.800604967145489 ], [ -88.670861172305251, 13.799442247161949 ], [ -88.657141079197402, 13.798744615171813 ], [ -88.64613399878499, 13.796729234466568 ], [ -88.64386023566135, 13.795644028848812 ], [ -88.625489265317299, 13.782414863055465 ], [ -88.623086310984434, 13.78117462780682 ], [ -88.612440965777921, 13.777557278445613 ], [ -88.605774706037835, 13.773681544867372 ], [ -88.603345913283249, 13.772648016992378 ], [ -88.596421272024088, 13.770813503440422 ], [ -88.593630744063546, 13.769392401937807 ], [ -88.592183804139211, 13.76709280039239 ], [ -88.590943569789886, 13.761666775001629 ], [ -88.590065069747141, 13.759263821568084 ], [ -88.588876512241256, 13.757093411231949 ], [ -88.586912808379395, 13.755413927310883 ], [ -88.583243781275485, 13.754199530483902 ], [ -88.558025682239418, 13.751150621004342 ], [ -88.548568895438166, 13.748695989828036 ], [ -88.532342495209946, 13.759367174355589 ], [ -88.529655320936286, 13.735828559240588 ], [ -88.498830329356224, 13.705727037173006 ], [ -88.48733232342795, 13.688260403494837 ], [ -88.550145025672407, 13.643663641963485 ], [ -88.555855271903283, 13.626041977755051 ], [ -88.570634732207111, 13.606146552221617 ], [ -88.590840217002381, 13.593718370306533 ], [ -88.612828539405541, 13.598653469282169 ], [ -88.641612311858694, 13.563901069079066 ], [ -88.642930060573804, 13.557674058011344 ], [ -88.659363166377034, 13.555012722159404 ], [ -88.665099250130254, 13.547106228069936 ], [ -88.667450527619735, 13.516720486061558 ], [ -88.675873785646672, 13.487161567252485 ], [ -88.721452399108898, 13.402541408858895 ], [ -88.725689866993775, 13.391973578018224 ], [ -88.728118658848985, 13.379287014584065 ], [ -88.72938473162003, 13.348281154951337 ], [ -88.731865201218056, 13.341485704002025 ], [ -88.749383510840346, 13.324923406989626 ], [ -88.758736944854093, 13.311435858777827 ], [ -88.764757250346804, 13.300402939943694 ], [ -88.774136521882951, 13.292935696325287 ], [ -88.793773565897311, 13.290171006786522 ], [ -88.805633307930805, 13.285830186114197 ], [ -88.813203905236037, 13.275727444166193 ], [ -88.817157152280743, 13.2616197783301 ], [ -88.817131313859022, 13.259630235147199 ], [ -88.81663977799991, 13.25930410400008 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-US", "NAME_1": "Usulután" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.112507114174903, 13.171196219997629 ], [ -88.121937628999945, 13.167547919000071 ], [ -88.208282029999907, 13.160427151000079 ], [ -88.300892706999946, 13.174221096000053 ], [ -88.324940558999913, 13.166571356000077 ], [ -88.337757941999939, 13.170843817000048 ], [ -88.352284308999913, 13.174017645000049 ], [ -88.352284308999913, 13.180243231000077 ], [ -88.329701300999943, 13.181708075000074 ], [ -88.328114386999914, 13.197088934000078 ], [ -88.340199347999942, 13.216131903000075 ], [ -88.3584285149999, 13.228664455000057 ], [ -88.354481574999909, 13.220892645000049 ], [ -88.342559373999904, 13.204657294000071 ], [ -88.337920701999906, 13.194525458000044 ], [ -88.3740535149999, 13.195705471000053 ], [ -88.391753709999932, 13.193915106000077 ], [ -88.406849738999938, 13.187689520000049 ], [ -88.397206183999913, 13.183620510000083 ], [ -88.389393683999913, 13.184759833000044 ], [ -88.379994269999941, 13.187404690000051 ], [ -88.36587480399993, 13.187689520000049 ], [ -88.36587480399993, 13.180243231000077 ], [ -88.389149542999917, 13.170843817000048 ], [ -88.414824998999904, 13.171576239000046 ], [ -88.434844529999907, 13.183661200000074 ], [ -88.441029425999943, 13.208197333000044 ], [ -88.431182420999903, 13.203884182000081 ], [ -88.427357550999943, 13.201361395000049 ], [ -88.413685675999943, 13.215033270000049 ], [ -88.413685675999943, 13.221218166000085 ], [ -88.430775519999941, 13.228786526000079 ], [ -88.449574347999942, 13.254584052000041 ], [ -88.462147589999915, 13.262233791000085 ], [ -88.458770311999899, 13.247748114000046 ], [ -88.453114386999914, 13.235907294000071 ], [ -88.450184699999909, 13.225368557000081 ], [ -88.454701300999943, 13.215033270000049 ], [ -88.469227667999917, 13.223089911000045 ], [ -88.511504686999899, 13.233465887000079 ], [ -88.529774542999917, 13.242946682000081 ], [ -88.546294725999928, 13.271755276000079 ], [ -88.553985154999907, 13.276434637000079 ], [ -88.565703904999907, 13.277370510000083 ], [ -88.5986628899999, 13.283880927000041 ], [ -88.613392706999946, 13.283880927000041 ], [ -88.653920050999943, 13.276434637000079 ], [ -88.710438605999911, 13.274969794000071 ], [ -88.722767706999946, 13.269598700000074 ], [ -88.716053839999915, 13.264349677000041 ], [ -88.708729620999918, 13.260524807000081 ], [ -88.70140540299991, 13.259344794000071 ], [ -88.694854295999903, 13.262233791000085 ], [ -88.666615363999938, 13.255764065000051 ], [ -88.586333787999934, 13.264227606000077 ], [ -88.577381964999915, 13.262844143000052 ], [ -88.564483201999906, 13.256008205000057 ], [ -88.557484503999945, 13.249579169000071 ], [ -88.545033331999946, 13.234767971000053 ], [ -88.536610480999911, 13.228664455000057 ], [ -88.536610480999911, 13.221218166000085 ], [ -88.55532792899993, 13.224310614000046 ], [ -88.568959113999938, 13.226833401000079 ], [ -88.5986628899999, 13.235500393000052 ], [ -88.5986628899999, 13.228664455000057 ], [ -88.516713019999941, 13.212225653000075 ], [ -88.473907029999907, 13.198635158000059 ], [ -88.454701300999943, 13.180243231000077 ], [ -88.461699998999904, 13.16828034100007 ], [ -88.479603644999941, 13.171210028000075 ], [ -88.499541795999903, 13.181423244000086 ], [ -88.512684699999909, 13.191107489000046 ], [ -88.527455206999946, 13.198431708000044 ], [ -88.785674607999908, 13.245266018000052 ], [ -88.81663977799991, 13.25930410400008 ], [ -88.817131313859022, 13.259630235147199 ], [ -88.817157152280743, 13.2616197783301 ], [ -88.813203905236037, 13.275727444166193 ], [ -88.805633307930805, 13.285830186114197 ], [ -88.793773565897311, 13.290171006786522 ], [ -88.774136521882951, 13.292935696325287 ], [ -88.764757250346804, 13.300402939943694 ], [ -88.758736944854093, 13.311435858777827 ], [ -88.749383510840346, 13.324923406989626 ], [ -88.731865201218056, 13.341485704002025 ], [ -88.72938473162003, 13.348281154951337 ], [ -88.728118658848985, 13.379287014584065 ], [ -88.725689866993775, 13.391973578018224 ], [ -88.721452399108898, 13.402541408858895 ], [ -88.675873785646672, 13.487161567252485 ], [ -88.667450527619735, 13.516720486061558 ], [ -88.665099250130254, 13.547106228069936 ], [ -88.659363166377034, 13.555012722159404 ], [ -88.642930060573804, 13.557674058011344 ], [ -88.641612311858694, 13.563901069079066 ], [ -88.612828539405541, 13.598653469282169 ], [ -88.590840217002381, 13.593718370306533 ], [ -88.570634732207111, 13.606146552221617 ], [ -88.555855271903283, 13.626041977755051 ], [ -88.550145025672407, 13.643663641963485 ], [ -88.48733232342795, 13.688260403494837 ], [ -88.44648210336635, 13.692833767264517 ], [ -88.434544846967071, 13.692136135274382 ], [ -88.428421189586231, 13.68461721391327 ], [ -88.420075445925079, 13.671749783325822 ], [ -88.413202480609982, 13.665445257892316 ], [ -88.404546677686994, 13.65937327735486 ], [ -88.396795214127792, 13.656789455868704 ], [ -88.372429775813487, 13.653843899176593 ], [ -88.366254441589206, 13.651957708781197 ], [ -88.362921312168794, 13.649399725716762 ], [ -88.362998827433898, 13.646557521812156 ], [ -88.367753059256245, 13.633638414381323 ], [ -88.368269823193771, 13.630692856789892 ], [ -88.368321499137835, 13.627747300997157 ], [ -88.366357795276031, 13.6192982045485 ], [ -88.363515591371424, 13.612296047124858 ], [ -88.362223680178658, 13.608187771348582 ], [ -88.361681077819469, 13.604596259509776 ], [ -88.362068651447089, 13.601909085236059 ], [ -88.36307634090042, 13.599428616537409 ], [ -88.364497443302355, 13.597361558089403 ], [ -88.366151088801701, 13.595578722280209 ], [ -88.368399014402996, 13.594467678240733 ], [ -88.373825038894438, 13.592710679953882 ], [ -88.376124641339118, 13.591522122447998 ], [ -88.377752448416743, 13.589661770474322 ], [ -88.378837653135179, 13.587439683294747 ], [ -88.379690313856884, 13.584855861808535 ], [ -88.380155401850288, 13.58188446669476 ], [ -88.379948697174598, 13.575967515788193 ], [ -88.379586961968698, 13.573125311883643 ], [ -88.378811814713458, 13.570386460766542 ], [ -88.36671952958261, 13.545478420092991 ], [ -88.365427619289164, 13.541783556365999 ], [ -88.3653759433451, 13.539380601133814 ], [ -88.367494675938531, 13.531551622309507 ], [ -88.36746883841613, 13.527417507212192 ], [ -88.366667853638489, 13.522224025818105 ], [ -88.362611253806278, 13.509046535968821 ], [ -88.362197841756995, 13.505248318555061 ], [ -88.362533739440494, 13.50305206979715 ], [ -88.363773972890499, 13.500519924255059 ], [ -88.363980679364829, 13.5002098658926 ], [ -88.369303351968085, 13.495429796547853 ], [ -88.370879483101646, 13.493595282096578 ], [ -88.372197231816756, 13.491192327763713 ], [ -88.373024055016117, 13.488634344699221 ], [ -88.373411627744417, 13.485611274540645 ], [ -88.373204922169407, 13.479487616260485 ], [ -88.373644171741091, 13.473234768569682 ], [ -88.374574347727958, 13.470676785505248 ], [ -88.375995450129892, 13.469126491894087 ], [ -88.377829962782528, 13.469307359047377 ], [ -88.379457770759473, 13.470470079030918 ], [ -88.380827196318023, 13.472072047686822 ], [ -88.381964076980523, 13.473028062095352 ], [ -88.383411017804235, 13.473596502876319 ], [ -88.385271368878534, 13.473028062095352 ], [ -88.386821661590375, 13.471167711021053 ], [ -88.387674323211456, 13.468687242322346 ], [ -88.38790686720813, 13.46566417126445 ], [ -88.387829352842346, 13.462718614572395 ], [ -88.386124029600296, 13.449308579827061 ], [ -88.385891485603565, 13.442849026561305 ], [ -88.382687548291699, 13.42442637847455 ], [ -88.381498989886438, 13.421222439364044 ], [ -88.380155401850288, 13.420085557802224 ], [ -88.378346726720054, 13.420059719380504 ], [ -88.373747525427916, 13.421687527357506 ], [ -88.369665087174042, 13.420369777743019 ], [ -88.368166470406265, 13.417785956256864 ], [ -88.367598028726036, 13.414685369933864 ], [ -88.367753059256245, 13.408251655089771 ], [ -88.367158780053614, 13.402334703283941 ], [ -88.365686000808296, 13.394686590713604 ], [ -88.360415005048424, 13.376703193097853 ], [ -88.354988979657662, 13.366006171047957 ], [ -88.34493791365378, 13.350296536555902 ], [ -88.337909918707737, 13.341537379946089 ], [ -88.336075406055102, 13.340142116865195 ], [ -88.333904994819648, 13.338824368150028 ], [ -88.32641191277952, 13.335568752196139 ], [ -88.321115077698664, 13.334225165059308 ], [ -88.301478033684305, 13.332003078779053 ], [ -88.296956345858632, 13.329470933236962 ], [ -88.291866218151426, 13.325388494983031 ], [ -88.282952032810044, 13.315104884982418 ], [ -88.278869594556113, 13.311280829146938 ], [ -88.275949877185042, 13.309368801229198 ], [ -88.273391893221287, 13.309497992438367 ], [ -88.270549689316681, 13.309291286863356 ], [ -88.26801754377459, 13.308361110876547 ], [ -88.26589881118116, 13.306965846896276 ], [ -88.262074755345679, 13.303839423050931 ], [ -88.259981859375273, 13.302495835914101 ], [ -88.257423876310838, 13.301643175192339 ], [ -88.254685025193737, 13.301152248777271 ], [ -88.251791145345067, 13.301384792773945 ], [ -88.24894894144046, 13.301927395133191 ], [ -88.243910488777999, 13.304020291103541 ], [ -88.234531216342532, 13.308955390079177 ], [ -88.231353115653746, 13.309342962807477 ], [ -88.227115647768926, 13.308800361347608 ], [ -88.223834195191955, 13.305260525452866 ], [ -88.222154711270889, 13.302314967861491 ], [ -88.221172858440639, 13.299162706493689 ], [ -88.220862800078123, 13.296294664167419 ], [ -88.220630256081449, 13.281489366341191 ], [ -88.218304816114369, 13.277846178558264 ], [ -88.214506598700552, 13.274926459388553 ], [ -88.207943691747971, 13.271464137859653 ], [ -88.205618251780891, 13.268337714014251 ], [ -88.2050498118993, 13.265573025374806 ], [ -88.212517056417028, 13.252162991528849 ], [ -88.213498908347901, 13.249010728362407 ], [ -88.214041510707148, 13.245703437363716 ], [ -88.213912320397242, 13.24079417591048 ], [ -88.212051968423566, 13.238804632727579 ], [ -88.209571498825596, 13.238236191946669 ], [ -88.182389695927725, 13.242370307044041 ], [ -88.179289109604724, 13.242215278312415 ], [ -88.176421068177717, 13.241672675053906 ], [ -88.173759732325777, 13.240664984701255 ], [ -88.112507114174903, 13.171196219997629 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-CU", "NAME_1": "Cuscatlán" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.929734259928125, 13.947908637473631 ], [ -88.944462043388569, 13.925222683080335 ], [ -88.94565060089451, 13.922974758378359 ], [ -88.948596157586564, 13.918659776127754 ], [ -88.951955126328016, 13.915171617076453 ], [ -88.955779182163496, 13.912096869175173 ], [ -88.969060024800285, 13.904577947814005 ], [ -88.971127082348971, 13.903027655102164 ], [ -88.972729051004876, 13.90127065681537 ], [ -88.974227667772652, 13.899151923322563 ], [ -88.975209519703526, 13.896774807411418 ], [ -88.976010505380486, 13.894035956294317 ], [ -88.976527269318012, 13.891038722758822 ], [ -88.973995123775921, 13.884682522280571 ], [ -88.969266730375296, 13.876104233723368 ], [ -88.949784715991825, 13.849206650766291 ], [ -88.943635220189265, 13.84282461186632 ], [ -88.935470343681402, 13.837424424897279 ], [ -88.93058692064983, 13.832153429137406 ], [ -88.927021247232744, 13.824350286936181 ], [ -88.926220261555784, 13.819880275953949 ], [ -88.9250317040499, 13.815668647390169 ], [ -88.919993252286758, 13.807038682888901 ], [ -88.918753017937433, 13.803240465475085 ], [ -88.917435269222267, 13.796729234466568 ], [ -88.915032314889402, 13.792336737850178 ], [ -88.91092403821375, 13.786988226825201 ], [ -88.901260545837488, 13.776911322399599 ], [ -88.894826830094132, 13.767377021232505 ], [ -88.893844978163202, 13.764870714112135 ], [ -88.884853277556715, 13.75980642302801 ], [ -88.850255906984501, 13.750633857066816 ], [ -88.868497687917966, 13.703194892530234 ], [ -88.871934170125826, 13.689190579481647 ], [ -88.874337123559371, 13.68461721391327 ], [ -88.876585049160667, 13.681284085392235 ], [ -88.896067064443457, 13.662577216465365 ], [ -88.903017544124339, 13.658546454155498 ], [ -88.908546923201925, 13.656686103081199 ], [ -88.921078457005194, 13.655213323835824 ], [ -88.923791469700575, 13.654412339957503 ], [ -88.925961880036709, 13.653197944029898 ], [ -88.927563849591991, 13.651337592056223 ], [ -88.929785935872246, 13.646531684289812 ], [ -88.931336228584087, 13.644671332316136 ], [ -88.933506638920221, 13.643663641963485 ], [ -88.935470343681402, 13.643095201182575 ], [ -88.939940354663634, 13.642449246035881 ], [ -88.94335100024847, 13.642294216404935 ], [ -88.962238736328629, 13.648185329789101 ], [ -88.979550341275228, 13.657228705440389 ], [ -89.023578661126294, 13.672938340831763 ], [ -89.024431321847999, 13.70309153884341 ], [ -89.026627569706534, 13.708052476240766 ], [ -89.028384568892704, 13.713400987265743 ], [ -89.033267991924276, 13.719266262228189 ], [ -89.05065711123666, 13.751538193732642 ], [ -89.052129889582716, 13.756318263976709 ], [ -89.050424567239986, 13.777867335908809 ], [ -89.051354743226796, 13.782259833424575 ], [ -89.053137579935367, 13.78502452206402 ], [ -89.055695562999801, 13.785903022106766 ], [ -89.059493781312938, 13.788435166749537 ], [ -89.063679572354374, 13.792620957790973 ], [ -89.076340298266132, 13.810630194727707 ], [ -89.078304003027313, 13.812102973073706 ], [ -89.080784470826643, 13.813110663426357 ], [ -89.083704189996354, 13.813679104207267 ], [ -89.090137905739766, 13.813989163469103 ], [ -89.097088386319967, 13.819492703225649 ], [ -89.106235113859384, 13.829698797961157 ], [ -89.132900152819786, 13.870445665235252 ], [ -89.135613166414487, 13.878042100062828 ], [ -89.133856167228316, 13.879747423304934 ], [ -89.12662146670732, 13.882848008728615 ], [ -89.124011806799444, 13.884630846336449 ], [ -89.122073941359304, 13.886723741407536 ], [ -89.120316942173133, 13.890444444455511 ], [ -89.121221279738279, 13.892692369157487 ], [ -89.12739661306324, 13.900262966462719 ], [ -89.14817053863942, 13.933465073953982 ], [ -89.157679003183432, 13.952482001243368 ], [ -89.159694382989358, 13.960000921705159 ], [ -89.160831264551177, 13.968579210262305 ], [ -89.160133632561099, 13.970103665451802 ], [ -89.158660855114363, 13.971524766055097 ], [ -89.156800503140687, 13.972971706878752 ], [ -89.154991828010452, 13.974599513956377 ], [ -89.152356329680856, 13.978630276266244 ], [ -89.15147783143675, 13.981084906543174 ], [ -89.150754361024951, 13.983823756760955 ], [ -89.14992753782559, 13.989689031723401 ], [ -89.148454758580215, 13.995166733957603 ], [ -89.14801550990785, 13.999275011532518 ], [ -89.14801550990785, 14.00030853940757 ], [ -89.147834641855241, 14.002168891381245 ], [ -89.148635626632824, 14.011806545335787 ], [ -89.151710375433481, 14.028239651138961 ], [ -89.152097948161781, 14.032632147755407 ], [ -89.151116096230851, 14.035810248444193 ], [ -89.1462843491434, 14.04539622645467 ], [ -89.141891853426273, 14.057307644432228 ], [ -89.141349250167764, 14.066996975230211 ], [ -89.123675910015209, 14.075962836515657 ], [ -89.120627001434968, 14.075936998093994 ], [ -89.117138840585028, 14.075497748522253 ], [ -89.104607306781759, 14.069374091141356 ], [ -89.078820766964782, 14.06025320112434 ], [ -89.07378231520164, 14.057643541216464 ], [ -89.066521776258924, 14.051339015782958 ], [ -89.049649420884066, 14.039608465858009 ], [ -89.048099128172225, 14.037748113884334 ], [ -89.043577440346553, 14.029944973481747 ], [ -89.021640794786833, 14.004571844814791 ], [ -89.019806281234878, 14.00183299369769 ], [ -89.019392870084857, 14.000205185720745 ], [ -89.019392870084857, 13.999972641724014 ], [ -89.020168016440778, 13.995709337216113 ], [ -89.020193854862498, 13.993022162043133 ], [ -89.019806281234878, 13.990490017400361 ], [ -89.019160326088183, 13.988009547802392 ], [ -89.017455003745397, 13.983436184032655 ], [ -89.014767828572417, 13.97795848179851 ], [ -89.009496832812545, 13.970336209448476 ], [ -89.00502682183037, 13.966331285560386 ], [ -89.001202765994833, 13.964005846492626 ], [ -88.979808722794303, 13.954109809220313 ], [ -88.961670294648343, 13.955556749144648 ], [ -88.94621904167542, 13.949743150126267 ], [ -88.929734259928125, 13.947908637473631 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "SV-SS", "NAME_1": "San Salvador" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.141349250167764, 14.066996975230211 ], [ -89.141891853426273, 14.057307644432228 ], [ -89.1462843491434, 14.04539622645467 ], [ -89.151116096230851, 14.035810248444193 ], [ -89.152097948161781, 14.032632147755407 ], [ -89.151710375433481, 14.028239651138961 ], [ -89.148635626632824, 14.011806545335787 ], [ -89.147834641855241, 14.002168891381245 ], [ -89.14801550990785, 14.00030853940757 ], [ -89.14801550990785, 13.999275011532518 ], [ -89.148454758580215, 13.995166733957603 ], [ -89.14992753782559, 13.989689031723401 ], [ -89.150754361024951, 13.983823756760955 ], [ -89.15147783143675, 13.981084906543174 ], [ -89.152356329680856, 13.978630276266244 ], [ -89.154991828010452, 13.974599513956377 ], [ -89.156800503140687, 13.972971706878752 ], [ -89.158660855114363, 13.971524766055097 ], [ -89.160133632561099, 13.970103665451802 ], [ -89.160831264551177, 13.968579210262305 ], [ -89.159694382989358, 13.960000921705159 ], [ -89.157679003183432, 13.952482001243368 ], [ -89.14817053863942, 13.933465073953982 ], [ -89.12739661306324, 13.900262966462719 ], [ -89.121221279738279, 13.892692369157487 ], [ -89.120316942173133, 13.890444444455511 ], [ -89.122073941359304, 13.886723741407536 ], [ -89.124011806799444, 13.884630846336449 ], [ -89.12662146670732, 13.882848008728615 ], [ -89.133856167228316, 13.879747423304934 ], [ -89.135613166414487, 13.878042100062828 ], [ -89.132900152819786, 13.870445665235252 ], [ -89.106235113859384, 13.829698797961157 ], [ -89.097088386319967, 13.819492703225649 ], [ -89.090137905739766, 13.813989163469103 ], [ -89.083704189996354, 13.813679104207267 ], [ -89.080784470826643, 13.813110663426357 ], [ -89.078304003027313, 13.812102973073706 ], [ -89.076340298266132, 13.810630194727707 ], [ -89.063679572354374, 13.792620957790973 ], [ -89.059493781312938, 13.788435166749537 ], [ -89.055695562999801, 13.785903022106766 ], [ -89.053137579935367, 13.78502452206402 ], [ -89.051354743226796, 13.782259833424575 ], [ -89.050424567239986, 13.777867335908809 ], [ -89.052129889582716, 13.756318263976709 ], [ -89.05065711123666, 13.751538193732642 ], [ -89.033267991924276, 13.719266262228189 ], [ -89.028384568892704, 13.713400987265743 ], [ -89.026627569706534, 13.708052476240766 ], [ -89.024431321847999, 13.70309153884341 ], [ -89.023578661126294, 13.672938340831763 ], [ -89.059726325309668, 13.6397362333405 ], [ -89.08980200895553, 13.60252920196109 ], [ -89.094892136662736, 13.598730984547274 ], [ -89.097941047041672, 13.5988860132789 ], [ -89.101015794942953, 13.599351101272305 ], [ -89.116983811853402, 13.604467068300551 ], [ -89.120058559754739, 13.604854641028851 ], [ -89.123236661342844, 13.604854641028851 ], [ -89.125949673138905, 13.604363715513045 ], [ -89.12817176031848, 13.603149318686121 ], [ -89.129592861821095, 13.599997057318319 ], [ -89.130032111392836, 13.595397854227599 ], [ -89.128197597840824, 13.586716212882891 ], [ -89.12527787957049, 13.578680528483574 ], [ -89.117603928578433, 13.565477200212626 ], [ -89.115666063138292, 13.560567938759334 ], [ -89.116208666396801, 13.553539943813348 ], [ -89.118456591098777, 13.542739569875209 ], [ -89.126957364390819, 13.517960720410883 ], [ -89.132073329620425, 13.507341212726772 ], [ -89.139230515775637, 13.499563909846529 ], [ -89.142201910889469, 13.497677721249829 ], [ -89.144372321225603, 13.489254462323572 ], [ -89.151736212955825, 13.492484238956422 ], [ -89.154268357598596, 13.493181870946557 ], [ -89.157989060646628, 13.493672797361683 ], [ -89.163931850874178, 13.492975165371547 ], [ -89.174396328028081, 13.489564520686088 ], [ -89.180003220572132, 13.488272610392642 ], [ -89.183155483738574, 13.488117580761752 ], [ -89.186075202008965, 13.488479315967652 ], [ -89.18829728918854, 13.489693711895256 ], [ -89.189770066635276, 13.491579902290653 ], [ -89.195428636022712, 13.50346548094717 ], [ -89.211448329776601, 13.528683579983237 ], [ -89.212042608979232, 13.532404283031212 ], [ -89.211680873773275, 13.537132677331158 ], [ -89.209432949970619, 13.545736803410762 ], [ -89.203180101380553, 13.561523953167864 ], [ -89.202715013387149, 13.564676215434986 ], [ -89.204575365360824, 13.606017361012391 ], [ -89.203800218105584, 13.615370795026138 ], [ -89.202404955024633, 13.621081041257014 ], [ -89.200389574319388, 13.622631333968855 ], [ -89.198761766342443, 13.624595037830716 ], [ -89.198270839927318, 13.626817125010291 ], [ -89.199459398332522, 13.629220079343156 ], [ -89.207133348425259, 13.632785752760242 ], [ -89.209303757862131, 13.635033678361538 ], [ -89.209407110649636, 13.638134263785219 ], [ -89.207081671581875, 13.643611965120101 ], [ -89.203800218105584, 13.649580592870052 ], [ -89.203490159743069, 13.652655340771332 ], [ -89.204472011674, 13.656479397506189 ], [ -89.211164109835806, 13.6651351995298 ], [ -89.215453253664691, 13.668881740999552 ], [ -89.217184414429141, 13.670018622561372 ], [ -89.231576301105406, 13.67751170550082 ], [ -89.23374671144154, 13.67906199821266 ], [ -89.235658739359337, 13.681981716482994 ], [ -89.237157355227737, 13.686322537155377 ], [ -89.238991868779692, 13.694151515979684 ], [ -89.240206264707354, 13.697510483821759 ], [ -89.242092455102693, 13.699939277475664 ], [ -89.245942349359893, 13.702703966115109 ], [ -89.247595994859239, 13.70464183245457 ], [ -89.24896542041779, 13.706734727525657 ], [ -89.250050625136225, 13.709241033746707 ], [ -89.250748257126361, 13.71874949829072 ], [ -89.24976640519543, 13.728723049029497 ], [ -89.254779019436171, 13.735053411985348 ], [ -89.258008796069078, 13.735311794403799 ], [ -89.260566779133512, 13.735983587972214 ], [ -89.262375454263804, 13.738076483942564 ], [ -89.262685512626263, 13.742081406931391 ], [ -89.258318855330913, 13.754561265689858 ], [ -89.251420050694776, 13.767221990702296 ], [ -89.250670742760576, 13.769728297822667 ], [ -89.249818081139495, 13.773991604129208 ], [ -89.248629522734291, 13.789985460360697 ], [ -89.246795010081655, 13.799209703165275 ], [ -89.243539395027028, 13.806547756473776 ], [ -89.241446499056678, 13.814273383409898 ], [ -89.239586147982322, 13.831714179565722 ], [ -89.238371752054718, 13.836468411388068 ], [ -89.236356371349416, 13.841274319154479 ], [ -89.233333300291577, 13.845020859724855 ], [ -89.231266241843571, 13.846545314914351 ], [ -89.229069993985036, 13.847863064528781 ], [ -89.223928189434389, 13.849723416502457 ], [ -89.221886970307423, 13.851092841161687 ], [ -89.220775926267947, 13.853366604285327 ], [ -89.219328986343612, 13.859025172773499 ], [ -89.214316372102871, 13.914809881870553 ], [ -89.213282844227876, 13.918065496925124 ], [ -89.211422492254201, 13.919822496111294 ], [ -89.208838670768046, 13.92052012810143 ], [ -89.201371426250319, 13.920313422526419 ], [ -89.200544603050957, 13.920959376773794 ], [ -89.200157030322657, 13.922199612022439 ], [ -89.198839280708228, 13.927806505465867 ], [ -89.196203783277952, 13.934369412418448 ], [ -89.196591356006252, 13.936048896339457 ], [ -89.198141648718092, 13.938090115466423 ], [ -89.203490159743069, 13.940854804105925 ], [ -89.207133348425259, 13.943800360797979 ], [ -89.210363125058166, 13.945583197506551 ], [ -89.213076137753546, 13.946539211015761 ], [ -89.215918341658096, 13.947211005483496 ], [ -89.218889736771928, 13.947598578211796 ], [ -89.222041999038993, 13.947701930999301 ], [ -89.231266241843571, 13.946978461486822 ], [ -89.234263475379066, 13.947159329539431 ], [ -89.242376675043488, 13.949536445450576 ], [ -89.247105069343434, 13.951758530831512 ], [ -89.251316697907271, 13.954419867582828 ], [ -89.254055549024372, 13.957985540999914 ], [ -89.257026944138147, 13.963385727968955 ], [ -89.262013719057848, 13.974702866743883 ], [ -89.264907599805895, 13.979948024981354 ], [ -89.26731055413876, 13.983410346510254 ], [ -89.273330857832832, 13.987983710279991 ], [ -89.274106005088072, 13.991549383697077 ], [ -89.273795945826237, 13.996949571565438 ], [ -89.26844743480126, 14.018421129131809 ], [ -89.26731055413876, 14.052114163038198 ], [ -89.260205043927613, 14.051132310207947 ], [ -89.256019252886176, 14.053147690913192 ], [ -89.243074307033623, 14.062242743407865 ], [ -89.235400356940886, 14.064800727371676 ], [ -89.214678107308771, 14.055989894817799 ], [ -89.200751308625968, 14.055834866086172 ], [ -89.194420945670117, 14.068211371157815 ], [ -89.180339118255688, 14.057385158798013 ], [ -89.168970302637319, 14.054620470158568 ], [ -89.141349250167764, 14.066996975230211 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/guatemala.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/guatemala.geojson new file mode 100644 index 000000000000..034fd9c0a6a5 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/guatemala.geojson @@ -0,0 +1,28 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "GT-JU", "NAME_1": "Jutiapa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.7480100679999, 14.044894904000031 ], [ -89.747256225999962, 14.04320078500011 ], [ -89.747643798999974, 14.037645569000105 ], [ -89.762268229999847, 14.029997457000121 ], [ -89.776944335999929, 14.0357852180001 ], [ -89.802963419999912, 14.055473938000134 ], [ -89.821101846999937, 14.060073141000089 ], [ -89.835855468999938, 14.059091289000037 ], [ -89.880116332999961, 14.042684021000071 ], [ -89.890787516999865, 14.035888570000026 ], [ -89.912078206999951, 14.015192159 ], [ -90.008170532999941, 13.949692281000097 ], [ -90.022975830999883, 13.936954041000135 ], [ -90.031476602999902, 13.922923889000032 ], [ -90.038091186999878, 13.908376974000078 ], [ -90.0473671069999, 13.894295146000061 ], [ -90.059640258999934, 13.884709167000054 ], [ -90.087080443999895, 13.870472310000082 ], [ -90.09904353899995, 13.85850921600013 ], [ -90.106975870999918, 13.844065654000104 ], [ -90.112298542999866, 13.828252666000111 ], [ -90.114779011999929, 13.81200042800009 ], [ -90.114313924999891, 13.796264954000023 ], [ -90.098306575132682, 13.731404008980572 ], [ -90.09832812399992, 13.731414130000076 ], [ -90.240563423844662, 13.788715510162957 ], [ -90.236992967051776, 13.802310289488275 ], [ -90.2305075753643, 13.82721832926245 ], [ -90.23012000173668, 13.84515005093408 ], [ -90.230817633726815, 13.849955960499187 ], [ -90.232548793591945, 13.855020249784673 ], [ -90.245442064399754, 13.877757880122033 ], [ -90.255131395197736, 13.912691148377803 ], [ -90.258516202360852, 13.92070099525472 ], [ -90.261461758153587, 13.925455227077066 ], [ -90.266500209916728, 13.927780667044146 ], [ -90.268567268364734, 13.929227606968482 ], [ -90.27022091296476, 13.931036282098717 ], [ -90.271409471369964, 13.933413398009918 ], [ -90.278644171891017, 13.974702866743883 ], [ -90.280246141446241, 13.978785304997814 ], [ -90.285258754787662, 13.98390127202606 ], [ -90.28854020916333, 13.987932034335927 ], [ -90.29200252979291, 13.995166733957603 ], [ -90.292648484939605, 13.998784085117393 ], [ -90.292855191413935, 14.004003404033881 ], [ -90.291692471430395, 14.009739487787101 ], [ -90.29024553060674, 14.013253486159442 ], [ -90.284121874125162, 14.017749335563394 ], [ -90.265957607557539, 14.022710272960694 ], [ -90.237871467094521, 14.006897283882552 ], [ -90.218518643020957, 13.991032619759608 ], [ -90.213402675992711, 13.989068914998427 ], [ -90.174102748642895, 13.979818833772129 ], [ -90.164129197904117, 13.975943101093208 ], [ -90.159943406862737, 13.976201484410979 ], [ -90.15668779180811, 13.976769924292569 ], [ -90.141055670782578, 13.987311916711576 ], [ -90.125449388178708, 14.015837306746278 ], [ -90.119170702066242, 14.026999416789636 ], [ -90.115682543014941, 14.029531562331726 ], [ -90.110023972728129, 14.032787177386297 ], [ -90.098525966799912, 14.035991116496803 ], [ -90.085064257009833, 14.038471585195509 ], [ -90.082738817042753, 14.039350084338935 ], [ -90.077054410132916, 14.045447903298111 ], [ -90.059665289921156, 14.069580796716366 ], [ -90.054394294161341, 14.080742905860404 ], [ -90.051526251835014, 14.089269517574166 ], [ -90.050466884638979, 14.095108954114949 ], [ -90.05033769432913, 14.098157864493828 ], [ -90.05493689741985, 14.137845364571888 ], [ -90.053464118174475, 14.159756170810624 ], [ -90.058295865261982, 14.169729723348041 ], [ -90.082712978621032, 14.192932440779487 ], [ -90.113770515097201, 14.217840481453038 ], [ -90.120643480412298, 14.224713446768135 ], [ -90.124519213091219, 14.22771068030363 ], [ -90.130255296844439, 14.229984443427327 ], [ -90.176634895084305, 14.24274852122727 ], [ -90.191052619282914, 14.252928779339697 ], [ -90.155473395880506, 14.338918362392519 ], [ -90.142166713922677, 14.350132148379942 ], [ -90.139970466064142, 14.351785793879287 ], [ -90.105166389017597, 14.358452052720054 ], [ -90.094107631761801, 14.357883612838464 ], [ -90.089301723995334, 14.355558172871383 ], [ -90.084263272232192, 14.353852851427916 ], [ -90.082015346630897, 14.354834703358847 ], [ -90.080930141912518, 14.357935288782528 ], [ -90.083953212970357, 14.376900540127792 ], [ -90.069948899921769, 14.378450832839633 ], [ -90.051887987040971, 14.433486233103167 ], [ -89.988558519060405, 14.434313056302472 ], [ -89.964761522426329, 14.464905503885859 ], [ -89.960653245750677, 14.469298001401626 ], [ -89.957785204323727, 14.470796617270082 ], [ -89.953986986010591, 14.472140204406912 ], [ -89.947088182273774, 14.473483792443062 ], [ -89.942592332869822, 14.473793849906258 ], [ -89.938561570560012, 14.473483792443062 ], [ -89.9356160138679, 14.472863673919392 ], [ -89.932877162750856, 14.471933498831902 ], [ -89.929828254170559, 14.470589910795752 ], [ -89.885257331060984, 14.436483465739343 ], [ -89.880012172823513, 14.47089997005753 ], [ -89.87164059074064, 14.482940579244314 ], [ -89.851280077213801, 14.496428127456113 ], [ -89.83213395871519, 14.508727118161971 ], [ -89.815726691333737, 14.519475816155989 ], [ -89.796244676050947, 14.52469513597174 ], [ -89.789087490795055, 14.523403224778974 ], [ -89.785289273381238, 14.520302639355293 ], [ -89.782059495849012, 14.516426907575692 ], [ -89.775393236108926, 14.509863999723791 ], [ -89.764360318174113, 14.50138906485347 ], [ -89.762344936569548, 14.500458888866604 ], [ -89.699971482997512, 14.52986277894405 ], [ -89.678396572643692, 14.542213447392669 ], [ -89.677698940653556, 14.545417384704535 ], [ -89.677853970284502, 14.555235906711687 ], [ -89.685502081955519, 14.577611802742467 ], [ -89.645194465152429, 14.573219306126077 ], [ -89.632637092028176, 14.569033515084641 ], [ -89.630518357636106, 14.567224839954406 ], [ -89.623542040432824, 14.559835109802464 ], [ -89.617883470146012, 14.551825262925547 ], [ -89.613103399901945, 14.542730211330195 ], [ -89.601734585182953, 14.526348782370405 ], [ -89.598220587709932, 14.524075019246709 ], [ -89.594525723083621, 14.52298981452833 ], [ -89.519388189913002, 14.525935370321065 ], [ -89.513135342222256, 14.523713284040809 ], [ -89.499131029173668, 14.508727118161971 ], [ -89.496314662791463, 14.501854152846875 ], [ -89.496547206788136, 14.497306627498858 ], [ -89.497554898040107, 14.492138984526491 ], [ -89.502309129862454, 14.478341376153594 ], [ -89.505306363397949, 14.471933498831902 ], [ -89.5085619775532, 14.462321682399704 ], [ -89.511171638360395, 14.450849513993887 ], [ -89.5116625638762, 14.44547516544651 ], [ -89.511507535144631, 14.441857815185983 ], [ -89.510732387889391, 14.440307522474143 ], [ -89.50954383038345, 14.438343817713019 ], [ -89.496547206788136, 14.423357651834124 ], [ -89.496148129999909, 14.42289748400006 ], [ -89.503033406999918, 14.420051168000015 ], [ -89.527760579999921, 14.391060689000128 ], [ -89.541351480999907, 14.381526387000036 ], [ -89.544245361999913, 14.400052388000077 ], [ -89.555174926999968, 14.410826925 ], [ -89.569876871999867, 14.412015483000118 ], [ -89.584062052999911, 14.401809387000057 ], [ -89.590573283999902, 14.38597056100005 ], [ -89.586284139999918, 14.374679261000082 ], [ -89.578971923999944, 14.364783223000089 ], [ -89.576078043999956, 14.353130189000112 ], [ -89.582408406999974, 14.343363343000064 ], [ -89.592433634999907, 14.336387024000075 ], [ -89.598350586999914, 14.327989604000095 ], [ -89.592175252999937, 14.313830261000049 ], [ -89.571272135999948, 14.311143087000104 ], [ -89.564373331999974, 14.308145853000099 ], [ -89.558585571999913, 14.302823182000054 ], [ -89.555691690999907, 14.299024963000122 ], [ -89.549878092999933, 14.288276265 ], [ -89.54858618199998, 14.28359954900013 ], [ -89.546777506999888, 14.268329163000075 ], [ -89.544917155999883, 14.261817932000014 ], [ -89.540550496999913, 14.257606303000074 ], [ -89.527863931999946, 14.2514568080001 ], [ -89.524659993999876, 14.247374369000084 ], [ -89.524504964999949, 14.231768087000134 ], [ -89.530938679999906, 14.225566915000059 ], [ -89.638322306999868, 14.200555522000073 ], [ -89.664625610999906, 14.188850810000091 ], [ -89.689843709999963, 14.170014750000064 ], [ -89.709868326999896, 14.148724060000077 ], [ -89.752604736999928, 14.075240174000029 ], [ -89.755446939999899, 14.067075297000102 ], [ -89.754465087999932, 14.059401347000104 ], [ -89.7480100679999, 14.044894904000031 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-CQ", "NAME_1": "Chiquimula" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.36162084999998, 14.415477804000062 ], [ -89.361821562322675, 14.415505745792339 ], [ -89.390611328999881, 14.435993348000039 ], [ -89.391696533999948, 14.433719585000119 ], [ -89.396864176999969, 14.426045635000037 ], [ -89.398181925999921, 14.445372620000086 ], [ -89.40836218299998, 14.441522726000045 ], [ -89.431099812999946, 14.418707580000046 ], [ -89.446835286999942, 14.415529481000078 ], [ -89.458126586999896, 14.419586080000073 ], [ -89.469417886999878, 14.425373840000049 ], [ -89.485282551999887, 14.427389222000102 ], [ -89.496148129999909, 14.42289748400006 ], [ -89.496547206788136, 14.423357651834124 ], [ -89.50954383038345, 14.438343817713019 ], [ -89.510732387889391, 14.440307522474143 ], [ -89.511507535144631, 14.441857815185983 ], [ -89.5116625638762, 14.44547516544651 ], [ -89.511171638360395, 14.450849513993887 ], [ -89.5085619775532, 14.462321682399704 ], [ -89.505306363397949, 14.471933498831902 ], [ -89.502309129862454, 14.478341376153594 ], [ -89.497554898040107, 14.492138984526491 ], [ -89.496547206788136, 14.497306627498858 ], [ -89.496314662791463, 14.501854152846875 ], [ -89.499131029173668, 14.508727118161971 ], [ -89.513135342222256, 14.523713284040809 ], [ -89.519388189913002, 14.525935370321065 ], [ -89.594525723083621, 14.52298981452833 ], [ -89.598220587709932, 14.524075019246709 ], [ -89.601734585182953, 14.526348782370405 ], [ -89.613103399901945, 14.542730211330195 ], [ -89.617883470146012, 14.551825262925547 ], [ -89.623542040432824, 14.559835109802464 ], [ -89.630518357636106, 14.567224839954406 ], [ -89.632637092028176, 14.569033515084641 ], [ -89.645194465152429, 14.573219306126077 ], [ -89.685502081955519, 14.577611802742467 ], [ -89.696173264684376, 14.577146714749063 ], [ -89.699609747791612, 14.577611802742467 ], [ -89.696044074374527, 14.598954169099613 ], [ -89.660232306975388, 14.695692450146453 ], [ -89.664133877176653, 14.707423000970721 ], [ -89.6677770658589, 14.715742906210153 ], [ -89.66893978584244, 14.721323961231803 ], [ -89.668629726580605, 14.72726675145941 ], [ -89.668035448277294, 14.730212307252145 ], [ -89.667182786656269, 14.733054511156752 ], [ -89.665089890685863, 14.745146796287599 ], [ -89.664986537898415, 14.748350735398105 ], [ -89.66700191860366, 14.759874578848724 ], [ -89.67082597533846, 14.77057160089862 ], [ -89.676045295154211, 14.778633123719658 ], [ -89.6889644025851, 14.782250474879504 ], [ -89.73635169117756, 14.779873358968302 ], [ -89.712683884853391, 14.821369534176654 ], [ -89.7086272859205, 14.837802639080508 ], [ -89.71170203292246, 14.862245591760654 ], [ -89.71035844578563, 14.867258206001395 ], [ -89.687517462660765, 14.888238837152585 ], [ -89.670412564188496, 14.901054591795969 ], [ -89.658656174942507, 14.899607651871634 ], [ -89.624678921095324, 14.882657782130934 ], [ -89.59258785674416, 14.867464911576405 ], [ -89.577860074183036, 14.864157620577714 ], [ -89.524323289787958, 14.863175766848144 ], [ -89.509104579912389, 14.86674144116455 ], [ -89.44866899267987, 14.913818671394552 ], [ -89.429342007027969, 14.919244696785313 ], [ -89.421073777732659, 14.919037991210303 ], [ -89.399162970594602, 14.912578437045227 ], [ -89.385391202442008, 14.903483385449874 ], [ -89.369113125370404, 14.903483385449874 ], [ -89.319762132916082, 14.919658107935334 ], [ -89.304130011890493, 14.914903876112987 ], [ -89.300099249580683, 14.909787909084741 ], [ -89.293691372258991, 14.905498766155119 ], [ -89.286172451797199, 14.905808824517635 ], [ -89.274286872241362, 14.909632880353115 ], [ -89.268163214860465, 14.914490464962967 ], [ -89.263512335825624, 14.919606431991213 ], [ -89.258344692853257, 14.927202866818845 ], [ -89.254236416177662, 14.930975246710261 ], [ -89.247544318015855, 14.935471096114156 ], [ -89.225452643724509, 14.946426500582504 ], [ -89.217856207997556, 14.948545234075254 ], [ -89.212585212237741, 14.949320380431175 ], [ -89.210027229173249, 14.948235174813476 ], [ -89.208115201255509, 14.94694326452003 ], [ -89.206332363647618, 14.945341294964749 ], [ -89.204730394092394, 14.943532619834514 ], [ -89.203180101380553, 14.941413886341763 ], [ -89.199356044645754, 14.934540920127347 ], [ -89.196436327274682, 14.927512926080681 ], [ -89.195118577660196, 14.925239162956984 ], [ -89.194110887307602, 14.922965399833345 ], [ -89.192715624226651, 14.920691636709648 ], [ -89.189563361060266, 14.913818671394552 ], [ -89.189214955999915, 14.913059034000113 ], [ -89.198814249999941, 14.899815165000064 ], [ -89.223618937999902, 14.879015401000103 ], [ -89.231447916999912, 14.867310690000124 ], [ -89.232429768999879, 14.848500468000026 ], [ -89.227675537999886, 14.83457367000004 ], [ -89.218968058999934, 14.821680400000034 ], [ -89.198814249999941, 14.798090108000025 ], [ -89.189409139999896, 14.783000590000114 ], [ -89.170547240999952, 14.738791403000107 ], [ -89.159669352999913, 14.725122986000088 ], [ -89.150522624999923, 14.717294007000064 ], [ -89.14621323435324, 14.710857663850106 ], [ -89.144502319999901, 14.708302308000029 ], [ -89.142693644999895, 14.691274923 ], [ -89.145225789999898, 14.683445943000066 ], [ -89.155845295999967, 14.672257995000038 ], [ -89.159410970999943, 14.665979309000122 ], [ -89.155225179999917, 14.615594788000038 ], [ -89.155741943999942, 14.59784393400011 ], [ -89.16039282299991, 14.581281637000103 ], [ -89.172149210999919, 14.570403747000057 ], [ -89.183698893999946, 14.569525248000019 ], [ -89.208813639999875, 14.577948507000102 ], [ -89.221086791999909, 14.580093079000093 ], [ -89.238114176999915, 14.577948507000102 ], [ -89.245684774999887, 14.572987570000066 ], [ -89.250542358999894, 14.565184428000038 ], [ -89.259611571999869, 14.554254862000064 ], [ -89.290927489999973, 14.528003235000128 ], [ -89.304854288999962, 14.513352966000056 ], [ -89.31480200199988, 14.495963847000041 ], [ -89.323044392999918, 14.487463074000118 ], [ -89.345265258999945, 14.481959534000026 ], [ -89.355497192999934, 14.475448303000064 ], [ -89.361982584999879, 14.462400004000102 ], [ -89.363791259999886, 14.44656117800011 ], [ -89.36162084999998, 14.415477804000062 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-PE", "NAME_1": "Petén" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.150727874192, 17.321032080166333 ], [ -89.149204845179298, 17.036270806333576 ], [ -89.166067397566337, 16.777009063383176 ], [ -89.184352706122695, 16.495872444329748 ], [ -89.193139671658514, 16.392625602989199 ], [ -89.2085168605212, 16.186131919766652 ], [ -89.234135091999946, 15.954944560000044 ], [ -89.236022275999858, 15.90649316800004 ], [ -89.236692268133652, 15.90709137626601 ], [ -89.237415737646131, 15.907737332312024 ], [ -89.242531703775114, 15.91150971130412 ], [ -89.265992805423593, 15.914739487937027 ], [ -89.358002692170487, 15.912930812806735 ], [ -89.369526537419745, 15.901613674031807 ], [ -89.375934413842117, 15.885232245072018 ], [ -89.377768928293392, 15.878307602913537 ], [ -89.378957485799333, 15.875000311914846 ], [ -89.380662808142063, 15.871641344072771 ], [ -89.384590216765048, 15.867894801703699 ], [ -89.396346605111717, 15.861280218807053 ], [ -89.426396451235235, 15.853968003920215 ], [ -89.438437058623322, 15.848619492895239 ], [ -89.446395229556174, 15.849368800829495 ], [ -89.463345100196193, 15.858257147749157 ], [ -89.484661628131619, 15.854174710394545 ], [ -89.511119960617691, 15.842289129939388 ], [ -89.51243771023212, 15.842108262786098 ], [ -89.513031989434751, 15.843115953138692 ], [ -89.515512458133401, 15.895179959187772 ], [ -89.516313442911041, 15.897686266308142 ], [ -89.520602586739983, 15.899288234964047 ], [ -89.526958788117554, 15.899856675744957 ], [ -89.540833909956973, 15.899210719698942 ], [ -89.546931728916149, 15.897944647827217 ], [ -89.551324226431859, 15.896497707902881 ], [ -89.553365444659505, 15.894973252713442 ], [ -89.555665046204922, 15.893707179942396 ], [ -89.558300543635141, 15.89277700395553 ], [ -89.561246101226573, 15.892156887230556 ], [ -89.565044317741069, 15.892182724752956 ], [ -89.626952684218963, 15.900063381319967 ], [ -89.633954840743286, 15.899701646114067 ], [ -89.645659553145833, 15.890554918574594 ], [ -89.647907477847809, 15.889237168960165 ], [ -89.65038794564714, 15.888229477708194 ], [ -89.655839810358941, 15.886963405836468 ], [ -89.669249844204955, 15.887738552192388 ], [ -89.67390072323974, 15.889314683325949 ], [ -89.679533454205512, 15.892001858498929 ], [ -89.700384895046852, 15.905799465073244 ], [ -89.716197883225732, 15.918770250246837 ], [ -89.718988410286897, 15.920320542958677 ], [ -89.742552862924242, 15.930862535377685 ], [ -89.745472582093953, 15.931637681733605 ], [ -89.748495653151849, 15.93192190257372 ], [ -89.75219051777816, 15.929312241766524 ], [ -89.757616543168922, 15.926289170708628 ], [ -89.760407071129407, 15.925849921136944 ], [ -89.76916622594058, 15.926599229071144 ], [ -89.772163458576756, 15.926521714705359 ], [ -89.774798956906295, 15.925669053983654 ], [ -89.776736823245756, 15.924196274738279 ], [ -89.778442145588542, 15.922490953294869 ], [ -89.782602098208258, 15.916677354276487 ], [ -89.783842332557583, 15.915282091195536 ], [ -89.785005051641804, 15.914326076787006 ], [ -89.786865403615479, 15.913292548012691 ], [ -89.792213914640456, 15.911819770565955 ], [ -89.825855271703404, 15.910036932958064 ], [ -89.841332363997367, 15.912310696081761 ], [ -89.845595669404588, 15.912594916022556 ], [ -89.849238858086835, 15.912207343294256 ], [ -89.851951869882896, 15.911458035360056 ], [ -89.855336677046012, 15.91262075444422 ], [ -89.858902351362417, 15.915747179188941 ], [ -89.863604906341322, 15.924609686787619 ], [ -89.865181036575564, 15.92959646170732 ], [ -89.867790697382759, 15.935513414412526 ], [ -89.880838996022817, 15.952592475362451 ], [ -89.884249640708333, 15.958612779056466 ], [ -89.887272711766229, 15.962669378888734 ], [ -89.889701503621495, 15.963961290081443 ], [ -89.895308397064866, 15.963108629359738 ], [ -89.904713507922054, 15.964219672499894 ], [ -89.922180141600222, 15.975717678428111 ], [ -89.926624315060053, 15.971299343389944 ], [ -89.929078946236359, 15.97029165303735 ], [ -89.940473599377071, 15.97256541616099 ], [ -89.957449306640171, 15.985148626807643 ], [ -89.954943000419121, 15.991995753701076 ], [ -89.955201381938195, 15.99416616493653 ], [ -89.957087572333592, 15.99571645854769 ], [ -89.960007289704663, 15.997473455935221 ], [ -89.961350877740813, 15.999928087111527 ], [ -89.961195848109867, 16.000419013526653 ], [ -89.960885789747408, 16.001013291829963 ], [ -89.960188157757273, 16.002873642904262 ], [ -89.959645555398026, 16.005069892561494 ], [ -89.959723069763868, 16.007627874726609 ], [ -89.961118333744082, 16.009462389177884 ], [ -89.963211228815112, 16.010805976314714 ], [ -89.970781827019664, 16.01380320895089 ], [ -89.97284888366903, 16.014345811310136 ], [ -89.97455420601176, 16.013932400160115 ], [ -89.974812588430211, 16.01096100504634 ], [ -89.972719693359124, 16.003183702166098 ], [ -89.972487149362451, 16.001168321460852 ], [ -89.97246131094073, 16.000108954264817 ], [ -89.972538825306515, 15.999773058379901 ], [ -89.973081427665761, 15.999152939856288 ], [ -89.97494177874006, 15.998041896716131 ], [ -89.983003303359737, 15.996543279948412 ], [ -89.985793830420903, 15.995303046498407 ], [ -89.98866187184791, 15.994786282560881 ], [ -89.991038987759055, 15.995251370554286 ], [ -89.994940558859696, 15.999566351905628 ], [ -89.996490851571536, 16.000031439899033 ], [ -89.999255541110301, 16.000005601477312 ], [ -90.004733243344504, 15.998765367127987 ], [ -90.008531459858943, 15.999488837539786 ], [ -90.011296149397765, 16.002873642904262 ], [ -90.012097134175406, 16.006206773223994 ], [ -90.014732631605625, 16.008945624341095 ], [ -90.019176805065456, 16.010082505902915 ], [ -90.03010637111214, 16.008532213191074 ], [ -90.034447190885146, 16.006077582014768 ], [ -90.037160203580527, 16.003493761427933 ], [ -90.037780321204821, 16.001478379823368 ], [ -90.038322923564067, 16.000238145474043 ], [ -90.038477953194956, 16.000005601477312 ], [ -90.040105760272581, 15.998791205549708 ], [ -90.046668667225219, 15.999462999118123 ], [ -90.21681332067817, 16.052147121892119 ], [ -90.420754360825072, 16.082377835168927 ], [ -90.447841201999921, 16.079686593000091 ], [ -90.444164591999908, 16.084652405 ], [ -90.437420816999889, 16.098863424000044 ], [ -90.434475260999903, 16.107183330000012 ], [ -90.440211344999852, 16.104857890000076 ], [ -90.442743489999941, 16.104186096000106 ], [ -90.44452632699992, 16.103255920000052 ], [ -90.448143676999905, 16.099741924000099 ], [ -90.455585083999921, 16.099741924000099 ], [ -90.459486653999875, 16.11679514600003 ], [ -90.435302083999915, 16.136277161000024 ], [ -90.448143676999905, 16.148214417000062 ], [ -90.448143676999905, 16.154415589000038 ], [ -90.426129516999907, 16.163148906000018 ], [ -90.432718261999923, 16.173225810000062 ], [ -90.461812093999924, 16.18914215100007 ], [ -90.46558447299995, 16.208107402000039 ], [ -90.458504801999908, 16.221749980000041 ], [ -90.446231648999884, 16.230845032 ], [ -90.434475260999903, 16.236322734000098 ], [ -90.447988647999864, 16.241490377 ], [ -90.457833008999842, 16.249138489000089 ], [ -90.459434977999962, 16.259060364000064 ], [ -90.448143676999905, 16.27110097300006 ], [ -90.443725342999898, 16.266863505000103 ], [ -90.440624755999863, 16.265313212000066 ], [ -90.427679809999944, 16.263607890000017 ], [ -90.431426350999857, 16.268930563000069 ], [ -90.437524169999904, 16.280040996000068 ], [ -90.441296549999947, 16.285363668000016 ], [ -90.436749023999909, 16.284846904000077 ], [ -90.435508788999869, 16.286242168000072 ], [ -90.435508788999869, 16.288774312000058 ], [ -90.434475260999903, 16.291564840000106 ], [ -90.428558309999886, 16.28763743100005 ], [ -90.420238403999917, 16.285363668000016 ], [ -90.414063069999941, 16.287844137 ], [ -90.414011392999925, 16.298386129000065 ], [ -90.420186727999919, 16.296009013000017 ], [ -90.434733642999873, 16.301228333000026 ], [ -90.444888061999904, 16.308359680000066 ], [ -90.437885904999916, 16.312080383000094 ], [ -90.419463256999904, 16.317816467000043 ], [ -90.404683797999894, 16.331510722000061 ], [ -90.398792683999886, 16.347582092000025 ], [ -90.40719010499987, 16.360449524000032 ], [ -90.414011392999925, 16.360449524000032 ], [ -90.414011392999925, 16.353008118 ], [ -90.420806843999884, 16.353008118 ], [ -90.418223022999967, 16.367167461000051 ], [ -90.408740397999907, 16.372335103000054 ], [ -90.395123656999885, 16.371404927000086 ], [ -90.379853271999934, 16.367270813000076 ], [ -90.391377116999877, 16.385977681000057 ], [ -90.392694864999839, 16.391713766000024 ], [ -90.392901570999896, 16.404839580000086 ], [ -90.394916951999846, 16.419205627000096 ], [ -90.400601359999882, 16.420549215000065 ], [ -90.409463867999904, 16.41667348300011 ], [ -90.420806843999884, 16.415123190000074 ], [ -90.426697957999892, 16.417707011000076 ], [ -90.434113525999891, 16.42240956600007 ], [ -90.444371297999879, 16.426802063000068 ], [ -90.475842244999939, 16.430729472000039 ], [ -90.47842606699993, 16.436413879000057 ], [ -90.477082478999961, 16.44499216700008 ], [ -90.482301798999885, 16.45605092400011 ], [ -90.488218750999891, 16.461580302000087 ], [ -90.497753052999883, 16.468039856000061 ], [ -90.508915161999909, 16.47108876500009 ], [ -90.532893025999925, 16.459926656000064 ], [ -90.539068359999902, 16.468866679000072 ], [ -90.54371923899987, 16.490209045000071 ], [ -90.553408569999903, 16.490260722000087 ], [ -90.579350138999956, 16.482767639000073 ], [ -90.584724487999921, 16.480235495000059 ], [ -90.590615600999911, 16.483387757000045 ], [ -90.604671590999942, 16.486178284000076 ], [ -90.620742961999895, 16.486746725000032 ], [ -90.633093627999955, 16.483336080000115 ], [ -90.627874307999946, 16.492896220000105 ], [ -90.618985961999925, 16.500079244000077 ], [ -90.612061319999839, 16.507624003000032 ], [ -90.612629760999909, 16.518114319000077 ], [ -90.624153604999918, 16.524935608000121 ], [ -90.639501505999903, 16.525865784000061 ], [ -90.648183146999941, 16.529586487000088 ], [ -90.639966592999912, 16.544831034000126 ], [ -90.643532267999888, 16.561005758000121 ], [ -90.637021037999915, 16.577903952000028 ], [ -90.63376542199984, 16.592166646000081 ], [ -90.647356323999929, 16.600073140000049 ], [ -90.650250203999917, 16.593406881000121 ], [ -90.653609171999932, 16.590099590000122 ], [ -90.658828491999941, 16.588445943000082 ], [ -90.667200073999908, 16.586999003000088 ], [ -90.667200073999908, 16.593200175000064 ], [ -90.654022582999943, 16.616609599000029 ], [ -90.667716837999961, 16.6525763960001 ], [ -90.735309610999934, 16.74657582600004 ], [ -90.749779011999863, 16.757686259000067 ], [ -90.785590779999978, 16.774997864000071 ], [ -90.800370239999893, 16.786831767000066 ], [ -90.79695959599988, 16.798665670000091 ], [ -90.79695959599988, 16.805435283000023 ], [ -90.810602172999978, 16.812928365000076 ], [ -90.819955606999912, 16.805331930000094 ], [ -90.831737833999938, 16.805435283000023 ], [ -90.900622518999938, 16.826002503000026 ], [ -90.91907100399996, 16.836337789000126 ], [ -90.948164835999961, 16.864708150000027 ], [ -90.968887085999881, 16.87437164300006 ], [ -90.952764037999913, 16.890908102000068 ], [ -90.955192830999863, 16.898762919000077 ], [ -90.968835408999979, 16.901036682000026 ], [ -90.986250366999911, 16.901088359000127 ], [ -90.987955688999875, 16.896902568000073 ], [ -90.984286662999892, 16.887755840000082 ], [ -90.983253133999909, 16.878609110000113 ], [ -90.993071655999955, 16.87437164300006 ], [ -90.998342651999906, 16.877162170000119 ], [ -91.010900024999899, 16.890287984000096 ], [ -91.016687784999874, 16.894835511000039 ], [ -91.054928345999969, 16.908013 ], [ -91.066865600999904, 16.918193258000073 ], [ -91.071309774999918, 16.938915507 ], [ -91.076942504999948, 16.949509176000063 ], [ -91.11223750899984, 16.990488587000115 ], [ -91.116113240999908, 16.999273580000093 ], [ -91.121229207999875, 17.018393860000103 ], [ -91.126551879999937, 17.024595032000079 ], [ -91.137145548999911, 17.0265070600001 ], [ -91.161226765999857, 17.023974915000011 ], [ -91.171200317999961, 17.02800567700011 ], [ -91.206753703999908, 17.065367737000045 ], [ -91.215952107999925, 17.079217021000105 ], [ -91.22024125199988, 17.089293925000064 ], [ -91.225357218999875, 17.107018942000067 ], [ -91.229594685999928, 17.113995260000067 ], [ -91.238793090999934, 17.119214579000086 ], [ -91.259205281999868, 17.124330547000071 ], [ -91.263132690999839, 17.130738424000114 ], [ -91.265148071999903, 17.146241354000026 ], [ -91.270832479999939, 17.164276428000036 ], [ -91.279514119999902, 17.18008941600003 ], [ -91.290417846999873, 17.189081116000082 ], [ -91.317754679999979, 17.19047638000005 ], [ -91.344523071999873, 17.186342265000022 ], [ -91.364883585999877, 17.189752910000053 ], [ -91.372945108999971, 17.213575745000028 ], [ -91.388344685999954, 17.221585592000011 ], [ -91.419247192999961, 17.227735087000084 ], [ -91.442501586999867, 17.237967020000056 ], [ -91.438264119999928, 17.253676657000128 ], [ -91.433267451748108, 17.254538150951397 ], [ -91.430771036999886, 17.254968567000063 ], [ -90.991986449999871, 17.251919658000034 ], [ -90.991443847999932, 17.526941630500019 ], [ -90.990901245999879, 17.801963603 ], [ -90.982839721999881, 17.810541890000124 ], [ -90.962220825999879, 17.816019593000121 ], [ -90.919122680999862, 17.816019593000121 ], [ -90.699239461999923, 17.815812887000064 ], [ -90.479459594999923, 17.815606181000092 ], [ -90.259653890999886, 17.815347799000037 ], [ -90.039770670999928, 17.815141093000065 ], [ -89.820016642999946, 17.814986064000024 ], [ -89.600159261999892, 17.814727681000065 ], [ -89.380301880999866, 17.814520976000026 ], [ -89.160496174999935, 17.814314270000054 ], [ -89.156217395392076, 17.59824334848561 ], [ -89.150727874192, 17.321032080166333 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-SM", "NAME_1": "San Marcos" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -92.246256503999888, 14.546279476000095 ], [ -92.226097167999882, 14.54934560200013 ], [ -92.208062093999899, 14.570507101000089 ], [ -92.186073770999911, 14.62957326300004 ], [ -92.164731404999912, 14.668149720000116 ], [ -92.160803996999846, 14.683497620000082 ], [ -92.16173417199991, 14.702333679000105 ], [ -92.179381672999881, 14.751581320000085 ], [ -92.180105143999896, 14.758790182000041 ], [ -92.178813232999943, 14.773388774000111 ], [ -92.179381672999881, 14.781243591000049 ], [ -92.188657592999903, 14.80589324900005 ], [ -92.190828002999893, 14.814238993000103 ], [ -92.191654826999923, 14.835297140000122 ], [ -92.186797241999898, 14.847260233000085 ], [ -92.166023315999951, 14.870824687000081 ], [ -92.154680338999896, 14.900797018000034 ], [ -92.157574218999883, 14.963041280000127 ], [ -92.154215250999954, 14.995933329000081 ], [ -92.142355509999931, 15.007483012000108 ], [ -92.129875650999935, 15.010945333000052 ], [ -92.116982380999843, 15.012392274000135 ], [ -92.103830729999856, 15.017869975000039 ], [ -92.093598795999895, 15.02941965800008 ], [ -92.073806721999915, 15.073706360000102 ], [ -92.203359537999916, 15.237158915000109 ], [ -92.21093013499987, 15.253359477000117 ], [ -92.211291870999872, 15.272066345000013 ], [ -92.204651448999954, 15.289507141000044 ], [ -92.186177123999926, 15.320383810000038 ], [ -92.137446248999908, 15.401825866000067 ], [ -92.105931231441161, 15.4544690619976 ], [ -92.099773321581495, 15.433606064868002 ], [ -92.082461716634896, 15.412599596194411 ], [ -92.067553066920482, 15.407121893960209 ], [ -92.065020922277711, 15.39229075771226 ], [ -92.055228237792903, 15.288498643297714 ], [ -92.044066127749602, 15.280152900535938 ], [ -91.992983975430093, 15.277904974934643 ], [ -91.990245124312992, 15.281160589989213 ], [ -91.956577927929004, 15.318936062149533 ], [ -91.942883674142251, 15.327410997019854 ], [ -91.910250007431898, 15.32983978887512 ], [ -91.879941778889986, 15.34818492349541 ], [ -91.862914394783502, 15.358287665443413 ], [ -91.856222296621695, 15.360690618876959 ], [ -91.849607713724993, 15.361233222135468 ], [ -91.840796882070435, 15.357279975090762 ], [ -91.806819628223252, 15.336557725458647 ], [ -91.785632289698412, 15.334955755903422 ], [ -91.731113654271724, 15.349941920882941 ], [ -91.715739915664585, 15.35012278893555 ], [ -91.714990606831009, 15.346324571521734 ], [ -91.710081346277093, 15.332914536776457 ], [ -91.69594784201928, 15.30808401136801 ], [ -91.6793855459062, 15.285863144968175 ], [ -91.660937059397781, 15.26648448337221 ], [ -91.641170824174196, 15.250361435931495 ], [ -91.631274786901884, 15.243643500247344 ], [ -91.621275396842066, 15.234290066233541 ], [ -91.616107753869755, 15.220880032387583 ], [ -91.620681119438075, 15.201940619463983 ], [ -91.627011480595343, 15.195584418086412 ], [ -91.661660528910261, 15.168428452710884 ], [ -91.679850633000285, 15.149411526320876 ], [ -91.699125942708065, 15.122384752154574 ], [ -91.708376023934363, 15.092464098139601 ], [ -91.696412930012684, 15.064765530404884 ], [ -91.677370165200955, 15.0492625996892 ], [ -91.673287726947024, 15.033191229991246 ], [ -91.679669765846995, 14.990403144489505 ], [ -91.683390468895027, 14.980171210433014 ], [ -91.691607022246274, 14.96947418928238 ], [ -91.720778368327046, 14.941775621547663 ], [ -91.728529832785512, 14.938468328750332 ], [ -91.736488002819044, 14.933765773771427 ], [ -91.737728238067689, 14.931078600397086 ], [ -91.739045986782855, 14.926944485299714 ], [ -91.738322517270319, 14.919968167197169 ], [ -91.739976161870345, 14.910408026709035 ], [ -91.749148728730802, 14.898160711947298 ], [ -91.755763313426144, 14.860695299048814 ], [ -91.763308072309655, 14.847621161087716 ], [ -91.764961716909681, 14.845140693288329 ], [ -91.791885139187798, 14.789743556919575 ], [ -91.792944506383833, 14.786694648339335 ], [ -91.795347459817378, 14.782973945291303 ], [ -91.79906816286541, 14.779253241344009 ], [ -91.812245652714694, 14.7697964545427 ], [ -91.81679317896203, 14.7648355171454 ], [ -91.819221970817296, 14.761528225247389 ], [ -91.832141079147448, 14.738480536547513 ], [ -91.841933762732936, 14.732382716689017 ], [ -91.850667080021708, 14.72897207290282 ], [ -91.86074398534663, 14.728041896916011 ], [ -91.888830125809648, 14.729592190527171 ], [ -91.951487800221798, 14.736103419736992 ], [ -92.039311896826575, 14.711505439224652 ], [ -92.06075761597117, 14.707526352858906 ], [ -92.072436489952054, 14.701790269105629 ], [ -92.099669968793989, 14.680396225905099 ], [ -92.134086473112234, 14.642052313863189 ], [ -92.137962205791155, 14.635954494904013 ], [ -92.136773648285214, 14.633008938211901 ], [ -92.133698900383934, 14.630063381519847 ], [ -92.125094774304387, 14.626859443308661 ], [ -92.119797940122794, 14.625515855272511 ], [ -92.060680100706065, 14.619624741888288 ], [ -92.052153489891623, 14.617557685238978 ], [ -92.049543829983747, 14.616420802777839 ], [ -92.040474615910796, 14.599212551518008 ], [ -92.016625943332599, 14.530947984561806 ], [ -92.046494921403507, 14.523713284040809 ], [ -92.055176560949519, 14.519785875417824 ], [ -92.066338670992877, 14.507796943074425 ], [ -92.070266078716543, 14.505109767901445 ], [ -92.073960944242174, 14.503559475189604 ], [ -92.07677730972506, 14.503197739983705 ], [ -92.07987789604806, 14.503352768715274 ], [ -92.08272009995261, 14.503766180764615 ], [ -92.087965258190081, 14.505626531838971 ], [ -92.097447883413054, 14.507538559756711 ], [ -92.107473110995272, 14.508210354224445 ], [ -92.112356534026787, 14.507228502293515 ], [ -92.115741340290583, 14.505936591100806 ], [ -92.124681363154366, 14.497978420167954 ], [ -92.133543870752987, 14.491828925264656 ], [ -92.138530646572065, 14.489658514928522 ], [ -92.143517422391085, 14.489296779722565 ], [ -92.153981900444307, 14.491777249320592 ], [ -92.157986823433134, 14.491053778908736 ], [ -92.160699836128515, 14.490123602921926 ], [ -92.16232764410546, 14.487436427748946 ], [ -92.162394631747958, 14.487325889609581 ], [ -92.246256503999888, 14.546279476000095 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-HU", "NAME_1": "Huehuetenango" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -92.105931231441161, 15.4544690619976 ], [ -92.068535725999965, 15.516935120000042 ], [ -91.989599975999937, 15.648968404000115 ], [ -91.910560871999849, 15.780950013000066 ], [ -91.841676188999941, 15.896085103000061 ], [ -91.792971150999904, 15.977578837000081 ], [ -91.774470987999877, 16.008429667000073 ], [ -91.751888386999923, 16.04630849200008 ], [ -91.739847778999973, 16.060984599000065 ], [ -91.723776408999896, 16.068787740000076 ], [ -91.678404500999875, 16.068891093 ], [ -91.540480102999908, 16.069149475000089 ], [ -91.402607381999928, 16.069304505000034 ], [ -91.26478633699989, 16.069511210000073 ], [ -91.126913615999939, 16.069769593000061 ], [ -90.994797831999875, 16.069868593000066 ], [ -91.117430182756721, 15.834279283062472 ], [ -91.127171190398087, 15.815959987763222 ], [ -91.192257656665504, 15.68777659841129 ], [ -91.194583095733265, 15.684572659300784 ], [ -91.213289964660135, 15.667080186301519 ], [ -91.212023891889089, 15.660491440927217 ], [ -91.210835334383148, 15.658811957006208 ], [ -91.210034348706188, 15.656357326729221 ], [ -91.21204973031081, 15.654652004386492 ], [ -91.215692918993, 15.653308417249661 ], [ -91.224322882594947, 15.652533270893741 ], [ -91.228405320848879, 15.651628933328595 ], [ -91.232410243837649, 15.646073716728608 ], [ -91.25941117958223, 15.62762523022019 ], [ -91.262718472379561, 15.627005113495159 ], [ -91.269126349701253, 15.627030951017559 ], [ -91.272175259180869, 15.626643378289259 ], [ -91.27488827187625, 15.625945746299124 ], [ -91.277213710944011, 15.624783027214903 ], [ -91.289486864127468, 15.61449941721429 ], [ -91.293672655168905, 15.61318166849918 ], [ -91.297470872582664, 15.612613226818951 ], [ -91.300597297327386, 15.612923285181466 ], [ -91.303413661910952, 15.610985418842006 ], [ -91.305687425034591, 15.606877143065674 ], [ -91.307134365858303, 15.594836533878947 ], [ -91.309744024866859, 15.585379747077639 ], [ -91.31555762388524, 15.574165961090216 ], [ -91.318813238939811, 15.569385890846149 ], [ -91.321164517328612, 15.563572292727088 ], [ -91.322198046102926, 15.560032456832403 ], [ -91.323541633239756, 15.536803900979237 ], [ -91.329174364205528, 15.52781220127207 ], [ -91.331138068067389, 15.523006293505603 ], [ -91.331758185691683, 15.520319119231942 ], [ -91.332197435263424, 15.517141018543157 ], [ -91.332223272785768, 15.513988756276092 ], [ -91.331499803273289, 15.507839260473474 ], [ -91.330828009704874, 15.505152086199814 ], [ -91.329897833718007, 15.502516587870218 ], [ -91.327649909016088, 15.497969062522202 ], [ -91.326280484356857, 15.495927843395236 ], [ -91.325246954683166, 15.493705756215661 ], [ -91.322223883625327, 15.489235745233429 ], [ -91.302199265983347, 15.465826321327654 ], [ -91.300545619584682, 15.462699897482253 ], [ -91.299796311650425, 15.459650987103373 ], [ -91.299770474128081, 15.446964422769895 ], [ -91.298581915722821, 15.441331691804123 ], [ -91.294370287158984, 15.431668199427861 ], [ -91.288582525663003, 15.423064073348314 ], [ -91.282381354815641, 15.416320299242386 ], [ -91.263571133101266, 15.399292914236582 ], [ -91.25961788605656, 15.398466091037278 ], [ -91.253933479146724, 15.398311062305652 ], [ -91.224736293744968, 15.401773382935232 ], [ -91.212023891889089, 15.399318751758983 ], [ -91.184377000997756, 15.386787217955714 ], [ -91.182180752239901, 15.368752143496636 ], [ -91.190784878319448, 15.332914536776457 ], [ -91.189777187966854, 15.3272042914449 ], [ -91.184041104213577, 15.312269802409446 ], [ -91.179080165916901, 15.292245184767467 ], [ -91.19450558136748, 15.28880870255955 ], [ -91.203290574600317, 15.28787852657274 ], [ -91.227759365702127, 15.292167670401625 ], [ -91.236828578875816, 15.291935126404951 ], [ -91.259488694847391, 15.284648749040514 ], [ -91.302871059551762, 15.276897284581992 ], [ -91.310855068906278, 15.27165212724384 ], [ -91.31535091831023, 15.263151353052478 ], [ -91.341111619705487, 15.264908352238649 ], [ -91.352790493686314, 15.262815457167619 ], [ -91.376923387104625, 15.252325140692676 ], [ -91.392477993764373, 15.241240545914422 ], [ -91.43580868162536, 15.231499539172376 ], [ -91.445782233263458, 15.228786526476995 ], [ -91.450820685925919, 15.22638357214413 ], [ -91.454386359343005, 15.222688707517818 ], [ -91.467563850091608, 15.203878485803443 ], [ -91.473506639419838, 15.192664699816021 ], [ -91.474204271409974, 15.190003363964081 ], [ -91.47645219611195, 15.164862779293799 ], [ -91.47704647531458, 15.161813869814239 ], [ -91.481413132609987, 15.159385077059653 ], [ -91.485185513400722, 15.157731432459627 ], [ -91.51882686956435, 15.155974433273457 ], [ -91.538412237634645, 15.178970445129949 ], [ -91.541719530431976, 15.188298040721975 ], [ -91.541357795226077, 15.198064886785062 ], [ -91.548902554109588, 15.204007677012669 ], [ -91.616107753869755, 15.220880032387583 ], [ -91.621275396842066, 15.234290066233541 ], [ -91.631274786901884, 15.243643500247344 ], [ -91.641170824174196, 15.250361435931495 ], [ -91.660937059397781, 15.26648448337221 ], [ -91.6793855459062, 15.285863144968175 ], [ -91.69594784201928, 15.30808401136801 ], [ -91.710081346277093, 15.332914536776457 ], [ -91.714990606831009, 15.346324571521734 ], [ -91.715739915664585, 15.35012278893555 ], [ -91.731113654271724, 15.349941920882941 ], [ -91.785632289698412, 15.334955755903422 ], [ -91.806819628223252, 15.336557725458647 ], [ -91.840796882070435, 15.357279975090762 ], [ -91.849607713724993, 15.361233222135468 ], [ -91.856222296621695, 15.360690618876959 ], [ -91.862914394783502, 15.358287665443413 ], [ -91.879941778889986, 15.34818492349541 ], [ -91.910250007431898, 15.32983978887512 ], [ -91.942883674142251, 15.327410997019854 ], [ -91.956577927929004, 15.318936062149533 ], [ -91.990245124312992, 15.281160589989213 ], [ -91.992983975430093, 15.277904974934643 ], [ -92.044066127749602, 15.280152900535938 ], [ -92.055228237792903, 15.288498643297714 ], [ -92.065020922277711, 15.39229075771226 ], [ -92.067553066920482, 15.407121893960209 ], [ -92.082461716634896, 15.412599596194411 ], [ -92.099773321581495, 15.433606064868002 ], [ -92.105931231441161, 15.4544690619976 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-QC", "NAME_1": "Quiché" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -90.994797831999875, 16.069868593000066 ], [ -90.988989217999858, 16.069872946000075 ], [ -90.851116496999907, 16.070131327000055 ], [ -90.713295451999841, 16.070338034000102 ], [ -90.575474405999898, 16.070596415000082 ], [ -90.485738281999915, 16.070699768000097 ], [ -90.466152913999906, 16.072921855000104 ], [ -90.44819509742581, 16.079259908118274 ], [ -90.436412320272325, 16.073282781774935 ], [ -90.431503058819089, 16.065479641372349 ], [ -90.433544277946055, 16.056048692093441 ], [ -90.441993374394713, 16.044834906106018 ], [ -90.435998908223041, 16.034008693746216 ], [ -90.440262213630263, 16.024810289363359 ], [ -90.450494146787435, 16.020676174265986 ], [ -90.462483080030097, 16.024965318094928 ], [ -90.464395107947837, 16.019978543175228 ], [ -90.467831591055074, 16.015637722502902 ], [ -90.469330206923473, 16.010702623527266 ], [ -90.475531378670155, 16.010702623527266 ], [ -90.487365282281928, 16.017963162469982 ], [ -90.506743943877893, 16.006206773223994 ], [ -90.517105069143611, 16.010702623527266 ], [ -90.523952196036987, 16.010702623527266 ], [ -90.527776251872524, 16.004527289302928 ], [ -90.531031866927094, 16.003958849421338 ], [ -90.538214890604706, 16.010702623527266 ], [ -90.540385300940841, 16.00729197794243 ], [ -90.541625536189542, 16.004268906884533 ], [ -90.542710740907921, 16.004501450881264 ], [ -90.544416063250708, 16.010702623527266 ], [ -90.548576015870424, 16.006310126011499 ], [ -90.555113085300604, 16.000884101520057 ], [ -90.558084480414436, 15.997680162409551 ], [ -90.571339483730185, 16.004346422149638 ], [ -90.580227830649847, 16.012614651445006 ], [ -90.590304735075449, 16.018350735198283 ], [ -90.607099576084579, 16.017523911998921 ], [ -90.607099576084579, 16.024965318094928 ], [ -90.602216153053007, 16.026463934862704 ], [ -90.597281053178051, 16.02925446192387 ], [ -90.59283687971822, 16.03119232826333 ], [ -90.59283687971822, 16.038633735258657 ], [ -90.599761521876701, 16.042664495769827 ], [ -90.605549283372739, 16.042948717509319 ], [ -90.610096808720755, 16.039176336718526 ], [ -90.613300746931884, 16.03119232826333 ], [ -90.620147874724637, 16.03119232826333 ], [ -90.634307217404114, 16.045222479733638 ], [ -90.660145433165212, 16.039796454342877 ], [ -90.702700974670222, 16.017523911998921 ], [ -90.695259568574215, 16.003881334156233 ], [ -90.704199592337318, 15.998196926347077 ], [ -90.704044562706372, 15.993856106574071 ], [ -90.702158373210352, 15.988636785858944 ], [ -90.705801560993223, 15.980291043097168 ], [ -90.712752040674104, 15.976286119209021 ], [ -90.71748043497405, 15.980471910250458 ], [ -90.720684374084556, 15.987086493147103 ], [ -90.723164841883943, 15.990212917891824 ], [ -90.734430304714749, 15.985381170804374 ], [ -90.750191616949564, 15.97279796015772 ], [ -90.763524136429737, 15.96972321225644 ], [ -90.763524136429737, 15.962281806160433 ], [ -90.759364182910701, 15.958871161474917 ], [ -90.750501675312023, 15.949259345042719 ], [ -90.743654548418647, 15.956080634413752 ], [ -90.741871710810813, 15.952980048090751 ], [ -90.742181770072591, 15.951145535438116 ], [ -90.741380785295007, 15.950112005764424 ], [ -90.73621314232264, 15.949259345042719 ], [ -90.73621314232264, 15.942438056571063 ], [ -90.746109177796313, 15.935565090356647 ], [ -90.753808967210034, 15.921044013370533 ], [ -90.763524136429737, 15.88781606745755 ], [ -90.738616095756186, 15.885283921915459 ], [ -90.73256995274113, 15.868101508178029 ], [ -90.742956916428511, 15.848619492895239 ], [ -90.767244838578392, 15.839395250090718 ], [ -90.771353116153364, 15.833452459863111 ], [ -90.784633958790153, 15.798415838819892 ], [ -90.811815761688024, 15.765110378541124 ], [ -90.818146124643931, 15.750640977499074 ], [ -90.805020310738712, 15.75211375584513 ], [ -90.793341437657205, 15.75079600713002 ], [ -90.783858812434232, 15.745938422520169 ], [ -90.777166714272425, 15.736972561234722 ], [ -90.782101814147381, 15.734802150898531 ], [ -90.786520148286172, 15.731158962216341 ], [ -90.791455248161128, 15.729531155138659 ], [ -90.791455248161128, 15.723329983391977 ], [ -90.7766499503349, 15.712348741401286 ], [ -90.770965541626424, 15.709041449503275 ], [ -90.784478929159263, 15.699739692332912 ], [ -90.788225470628959, 15.688448391080385 ], [ -90.780629034902006, 15.678914089013972 ], [ -90.743396166000252, 15.672738755689011 ], [ -90.700995653226812, 15.660801500189052 ], [ -90.689032559305133, 15.654419461289081 ], [ -90.680790168431486, 15.659199529734508 ], [ -90.671617600671709, 15.660801500189052 ], [ -90.662470873132293, 15.659199529734508 ], [ -90.65428015820271, 15.654419461289081 ], [ -90.657819994097451, 15.65361847651144 ], [ -90.660688036423721, 15.65361847651144 ], [ -90.662186652292178, 15.652326565318731 ], [ -90.661721564298716, 15.647598171018785 ], [ -90.642756313852772, 15.635815945149716 ], [ -90.632705247848889, 15.622922675241227 ], [ -90.631904263071249, 15.608608302930804 ], [ -90.640637580360021, 15.59235606518024 ], [ -90.625548061693678, 15.582124132023068 ], [ -90.615445318846355, 15.561272691181728 ], [ -90.608649868796363, 15.540757148023943 ], [ -90.603378872137228, 15.531532905219365 ], [ -90.596970994815536, 15.525951850197714 ], [ -90.603740607343127, 15.514066269742557 ], [ -90.614515143758865, 15.503162543016913 ], [ -90.620147874724637, 15.500501207164973 ], [ -90.648078985556708, 15.476290798481557 ], [ -90.648078985556708, 15.469469509110525 ], [ -90.640069138679792, 15.458875840747453 ], [ -90.65221310065408, 15.45262299215733 ], [ -90.692158983150534, 15.44897980437446 ], [ -90.705594855418212, 15.442313543735054 ], [ -90.709754808037928, 15.426603909242999 ], [ -90.707765265754404, 15.408439643574695 ], [ -90.702700974670222, 15.394357815260946 ], [ -90.682030401881548, 15.37495331524326 ], [ -90.650817836673809, 15.363093573209824 ], [ -90.493514777185226, 15.339735826147432 ], [ -90.477624273741242, 15.330976671336316 ], [ -90.478476936261586, 15.310641995331821 ], [ -90.487830370275333, 15.287645982576009 ], [ -90.497235480233201, 15.270851142466256 ], [ -90.503772548764118, 15.262195339543268 ], [ -90.541315476927707, 15.212508450304711 ], [ -90.574362555687401, 15.20997630476262 ], [ -90.691564703947904, 15.214937242159976 ], [ -90.85739437515025, 15.252686875898576 ], [ -90.865662605344937, 15.256846829417611 ], [ -90.871915453035683, 15.148481350334009 ], [ -90.797243007858526, 15.054947008397733 ], [ -90.707274340238598, 15.000221666496714 ], [ -90.707739427332683, 14.995519111517751 ], [ -90.712157762370794, 14.973763333111322 ], [ -90.694277716643285, 14.955676580909483 ], [ -90.687404751328188, 14.949940497156206 ], [ -90.680816005953886, 14.945703030170705 ], [ -90.673477952645385, 14.939036770430619 ], [ -90.669007940763834, 14.92957998272999 ], [ -90.657613287623121, 14.903948473443279 ], [ -90.671385056675035, 14.908909409941316 ], [ -90.707274340238598, 14.916195787305753 ], [ -90.736704067838446, 14.92596263336884 ], [ -90.753602260735704, 14.92823639649248 ], [ -90.805123664425537, 14.92823639649248 ], [ -90.852898525746355, 14.941878974335168 ], [ -90.868375617140998, 14.941568915073333 ], [ -90.882199063036296, 14.939295151949693 ], [ -90.893955451382965, 14.936814683251043 ], [ -90.95896440328454, 14.935264391438523 ], [ -90.977154507374621, 14.938623359280598 ], [ -90.99387183311859, 14.928649806743181 ], [ -91.010950894068515, 14.92420563418267 ], [ -91.020717740131602, 14.919554755147828 ], [ -91.022578091205901, 14.918262843955063 ], [ -91.024593471911203, 14.916557522511653 ], [ -91.030897997344709, 14.906583970873555 ], [ -91.05345475873014, 14.844933986813999 ], [ -91.060766975415561, 14.838939521541647 ], [ -91.087432014375963, 14.82627879473057 ], [ -91.103916796123201, 14.832014879383166 ], [ -91.108541835837059, 14.829224351422681 ], [ -91.112443406937643, 14.815633450423377 ], [ -91.1135802876002, 14.813359687299737 ], [ -91.114949714058014, 14.811344305695116 ], [ -91.11647416924751, 14.809483953721497 ], [ -91.11854122589682, 14.808140367483929 ], [ -91.121125048282352, 14.80721019149712 ], [ -91.124148119340191, 14.807106837810295 ], [ -91.127093675132983, 14.80741689707213 ], [ -91.129755011884299, 14.810207424133296 ], [ -91.13187374537705, 14.814858303168137 ], [ -91.133294846879664, 14.825607001162155 ], [ -91.133294846879664, 14.830981349709532 ], [ -91.132442186157959, 14.834908759231837 ], [ -91.131150274965194, 14.837079169568028 ], [ -91.122830369725762, 14.84596751648769 ], [ -91.11988481303365, 14.850101629786366 ], [ -91.117249314704111, 14.854855862508032 ], [ -91.116680873923201, 14.857336331206682 ], [ -91.11854122589682, 14.860540269417868 ], [ -91.123062913722492, 14.863847561315879 ], [ -91.134690110859935, 14.868136705144821 ], [ -91.14014197467236, 14.869531969125035 ], [ -91.144482795344686, 14.870255439536891 ], [ -91.147221645562468, 14.870358792324396 ], [ -91.150089687888794, 14.870875556261922 ], [ -91.156265022113075, 14.875319728822433 ], [ -91.165721808914327, 14.89180451146899 ], [ -91.170786099099189, 14.9051370300499 ], [ -91.182981737017542, 14.910666409127487 ], [ -91.214685227741029, 14.934850979389182 ], [ -91.212488979882494, 14.941155503923369 ], [ -91.206933763282507, 14.957743639357432 ], [ -91.207243821645022, 14.963996487048234 ], [ -91.210163539915413, 14.969577542069885 ], [ -91.226596645718587, 14.980739651213923 ], [ -91.233547126298845, 14.991488349207941 ], [ -91.23822384285603, 15.00936839403613 ], [ -91.240988532394852, 15.014484361064376 ], [ -91.243003913100097, 15.017429917756488 ], [ -91.2607806060401, 15.030400702030761 ], [ -91.271477627190734, 15.037066961770847 ], [ -91.273182950432783, 15.038927313744523 ], [ -91.274423183882789, 15.041304430554987 ], [ -91.274862434353849, 15.044301663191163 ], [ -91.275017463085419, 15.047402249514164 ], [ -91.274242315830179, 15.055153713073366 ], [ -91.271865200818354, 15.061716620026004 ], [ -91.268532071397942, 15.06641917590423 ], [ -91.260470546778265, 15.07256867080747 ], [ -91.25543209501518, 15.074687405199597 ], [ -91.251142951186239, 15.075720933074592 ], [ -91.240678474032336, 15.075927639548922 ], [ -91.237758754862625, 15.078046373041673 ], [ -91.235407478272464, 15.081922104821274 ], [ -91.234503139808055, 15.092050686090261 ], [ -91.234554815752119, 15.097218329062628 ], [ -91.240807665241562, 15.108483791893491 ], [ -91.247732307400042, 15.110705878173746 ], [ -91.249127569581674, 15.124555162490765 ], [ -91.25886857812236, 15.138042710702507 ], [ -91.263803677097997, 15.157576401929418 ], [ -91.270676643312413, 15.160470281778089 ], [ -91.2985302397787, 15.18824636477791 ], [ -91.301656663624101, 15.195119330093007 ], [ -91.315195888679284, 15.201630561101524 ], [ -91.32015682697596, 15.217081814074447 ], [ -91.320001797345071, 15.235220242220407 ], [ -91.31535091831023, 15.263151353052478 ], [ -91.310855068906278, 15.27165212724384 ], [ -91.302871059551762, 15.276897284581992 ], [ -91.259488694847391, 15.284648749040514 ], [ -91.236828578875816, 15.291935126404951 ], [ -91.227759365702127, 15.292167670401625 ], [ -91.203290574600317, 15.28787852657274 ], [ -91.19450558136748, 15.28880870255955 ], [ -91.179080165916901, 15.292245184767467 ], [ -91.184041104213577, 15.312269802409446 ], [ -91.189777187966854, 15.3272042914449 ], [ -91.190784878319448, 15.332914536776457 ], [ -91.182180752239901, 15.368752143496636 ], [ -91.184377000997756, 15.386787217955714 ], [ -91.212023891889089, 15.399318751758983 ], [ -91.224736293744968, 15.401773382935232 ], [ -91.253933479146724, 15.398311062305652 ], [ -91.25961788605656, 15.398466091037278 ], [ -91.263571133101266, 15.399292914236582 ], [ -91.282381354815641, 15.416320299242386 ], [ -91.288582525663003, 15.423064073348314 ], [ -91.294370287158984, 15.431668199427861 ], [ -91.298581915722821, 15.441331691804123 ], [ -91.299770474128081, 15.446964422769895 ], [ -91.299796311650425, 15.459650987103373 ], [ -91.300545619584682, 15.462699897482253 ], [ -91.302199265983347, 15.465826321327654 ], [ -91.322223883625327, 15.489235745233429 ], [ -91.325246954683166, 15.493705756215661 ], [ -91.326280484356857, 15.495927843395236 ], [ -91.327649909016088, 15.497969062522202 ], [ -91.329897833718007, 15.502516587870218 ], [ -91.330828009704874, 15.505152086199814 ], [ -91.331499803273289, 15.507839260473474 ], [ -91.332223272785768, 15.513988756276092 ], [ -91.332197435263424, 15.517141018543157 ], [ -91.331758185691683, 15.520319119231942 ], [ -91.331138068067389, 15.523006293505603 ], [ -91.329174364205528, 15.52781220127207 ], [ -91.323541633239756, 15.536803900979237 ], [ -91.322198046102926, 15.560032456832403 ], [ -91.321164517328612, 15.563572292727088 ], [ -91.318813238939811, 15.569385890846149 ], [ -91.31555762388524, 15.574165961090216 ], [ -91.309744024866859, 15.585379747077639 ], [ -91.307134365858303, 15.594836533878947 ], [ -91.305687425034591, 15.606877143065674 ], [ -91.303413661910952, 15.610985418842006 ], [ -91.300597297327386, 15.612923285181466 ], [ -91.297470872582664, 15.612613226818951 ], [ -91.293672655168905, 15.61318166849918 ], [ -91.289486864127468, 15.61449941721429 ], [ -91.277213710944011, 15.624783027214903 ], [ -91.27488827187625, 15.625945746299124 ], [ -91.272175259180869, 15.626643378289259 ], [ -91.269126349701253, 15.627030951017559 ], [ -91.262718472379561, 15.627005113495159 ], [ -91.25941117958223, 15.62762523022019 ], [ -91.232410243837649, 15.646073716728608 ], [ -91.228405320848879, 15.651628933328595 ], [ -91.224322882594947, 15.652533270893741 ], [ -91.215692918993, 15.653308417249661 ], [ -91.21204973031081, 15.654652004386492 ], [ -91.210034348706188, 15.656357326729221 ], [ -91.210835334383148, 15.658811957006208 ], [ -91.212023891889089, 15.660491440927217 ], [ -91.213289964660135, 15.667080186301519 ], [ -91.194583095733265, 15.684572659300784 ], [ -91.192257656665504, 15.68777659841129 ], [ -91.127171190398087, 15.815959987763222 ], [ -91.117430182756721, 15.834279283062472 ], [ -90.994797831999875, 16.069868593000066 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-AV", "NAME_1": "Alta Verapaz" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -90.44819509742581, 16.079259908118274 ], [ -90.447841201999921, 16.079686593000091 ], [ -90.420754360825072, 16.082377835168927 ], [ -90.21681332067817, 16.052147121892119 ], [ -90.046668667225219, 15.999462999118123 ], [ -90.040105760272581, 15.998791205549708 ], [ -90.038477953194956, 16.000005601477312 ], [ -90.038322923564067, 16.000238145474043 ], [ -90.037780321204821, 16.001478379823368 ], [ -90.037160203580527, 16.003493761427933 ], [ -90.034447190885146, 16.006077582014768 ], [ -90.03010637111214, 16.008532213191074 ], [ -90.019176805065456, 16.010082505902915 ], [ -90.014732631605625, 16.008945624341095 ], [ -90.012097134175406, 16.006206773223994 ], [ -90.011296149397765, 16.002873642904262 ], [ -90.008531459858943, 15.999488837539786 ], [ -90.004733243344504, 15.998765367127987 ], [ -89.999255541110301, 16.000005601477312 ], [ -89.996490851571536, 16.000031439899033 ], [ -89.994940558859696, 15.999566351905628 ], [ -89.991038987759055, 15.995251370554286 ], [ -89.98866187184791, 15.994786282560881 ], [ -89.985793830420903, 15.995303046498407 ], [ -89.983003303359737, 15.996543279948412 ], [ -89.97494177874006, 15.998041896716131 ], [ -89.973081427665761, 15.999152939856288 ], [ -89.972538825306515, 15.999773058379901 ], [ -89.97246131094073, 16.000108954264817 ], [ -89.972487149362451, 16.001168321460852 ], [ -89.972719693359124, 16.003183702166098 ], [ -89.974812588430211, 16.01096100504634 ], [ -89.97455420601176, 16.013932400160115 ], [ -89.97284888366903, 16.014345811310136 ], [ -89.970781827019664, 16.01380320895089 ], [ -89.963211228815112, 16.010805976314714 ], [ -89.961118333744082, 16.009462389177884 ], [ -89.959723069763868, 16.007627874726609 ], [ -89.959645555398026, 16.005069892561494 ], [ -89.960188157757273, 16.002873642904262 ], [ -89.960885789747408, 16.001013291829963 ], [ -89.961195848109867, 16.000419013526653 ], [ -89.961350877740813, 15.999928087111527 ], [ -89.960007289704663, 15.997473455935221 ], [ -89.957087572333592, 15.99571645854769 ], [ -89.955201381938195, 15.99416616493653 ], [ -89.954943000419121, 15.991995753701076 ], [ -89.957449306640171, 15.985148626807643 ], [ -89.940473599377071, 15.97256541616099 ], [ -89.929078946236359, 15.97029165303735 ], [ -89.926624315060053, 15.971299343389944 ], [ -89.922180141600222, 15.975717678428111 ], [ -89.904713507922054, 15.964219672499894 ], [ -89.895308397064866, 15.963108629359738 ], [ -89.889701503621495, 15.963961290081443 ], [ -89.887272711766229, 15.962669378888734 ], [ -89.884249640708333, 15.958612779056466 ], [ -89.880838996022817, 15.952592475362451 ], [ -89.867790697382759, 15.935513414412526 ], [ -89.865181036575564, 15.92959646170732 ], [ -89.863604906341322, 15.924609686787619 ], [ -89.858902351362417, 15.915747179188941 ], [ -89.855336677046012, 15.91262075444422 ], [ -89.851951869882896, 15.911458035360056 ], [ -89.849238858086835, 15.912207343294256 ], [ -89.845595669404588, 15.912594916022556 ], [ -89.841332363997367, 15.912310696081761 ], [ -89.825855271703404, 15.910036932958064 ], [ -89.792213914640456, 15.911819770565955 ], [ -89.786865403615479, 15.913292548012691 ], [ -89.785005051641804, 15.914326076787006 ], [ -89.783842332557583, 15.915282091195536 ], [ -89.782602098208258, 15.916677354276487 ], [ -89.778442145588542, 15.922490953294869 ], [ -89.776736823245756, 15.924196274738279 ], [ -89.774798956906295, 15.925669053983654 ], [ -89.772163458576756, 15.926521714705359 ], [ -89.76916622594058, 15.926599229071144 ], [ -89.760407071129407, 15.925849921136944 ], [ -89.757616543168922, 15.926289170708628 ], [ -89.75219051777816, 15.929312241766524 ], [ -89.748495653151849, 15.93192190257372 ], [ -89.745472582093953, 15.931637681733605 ], [ -89.742552862924242, 15.930862535377685 ], [ -89.718988410286897, 15.920320542958677 ], [ -89.716197883225732, 15.918770250246837 ], [ -89.700384895046852, 15.905799465073244 ], [ -89.679533454205512, 15.892001858498929 ], [ -89.67390072323974, 15.889314683325949 ], [ -89.669249844204955, 15.887738552192388 ], [ -89.655839810358941, 15.886963405836468 ], [ -89.65038794564714, 15.888229477708194 ], [ -89.647907477847809, 15.889237168960165 ], [ -89.645659553145833, 15.890554918574594 ], [ -89.633954840743286, 15.899701646114067 ], [ -89.626952684218963, 15.900063381319967 ], [ -89.565044317741069, 15.892182724752956 ], [ -89.561246101226573, 15.892156887230556 ], [ -89.558300543635141, 15.89277700395553 ], [ -89.555665046204922, 15.893707179942396 ], [ -89.553365444659505, 15.894973252713442 ], [ -89.551324226431859, 15.896497707902881 ], [ -89.546931728916149, 15.897944647827217 ], [ -89.540833909956973, 15.899210719698942 ], [ -89.526958788117554, 15.899856675744957 ], [ -89.520602586739983, 15.899288234964047 ], [ -89.516313442911041, 15.897686266308142 ], [ -89.515512458133401, 15.895179959187772 ], [ -89.513031989434751, 15.843115953138692 ], [ -89.51243771023212, 15.842108262786098 ], [ -89.511119960617691, 15.842289129939388 ], [ -89.484661628131619, 15.854174710394545 ], [ -89.463345100196193, 15.858257147749157 ], [ -89.446395229556174, 15.849368800829495 ], [ -89.438437058623322, 15.848619492895239 ], [ -89.426396451235235, 15.853968003920215 ], [ -89.396346605111717, 15.861280218807053 ], [ -89.423760952006319, 15.825804348192094 ], [ -89.43396704764109, 15.817949530046747 ], [ -89.453319871714712, 15.816037503028326 ], [ -89.456859706710077, 15.814280503842156 ], [ -89.459314337886383, 15.812316799080975 ], [ -89.464378628071188, 15.803247585907343 ], [ -89.465360480002118, 15.800586249156083 ], [ -89.477530280398128, 15.779192205955553 ], [ -89.481406013077049, 15.77428294540158 ], [ -89.484945848072414, 15.77159577112792 ], [ -89.495384487703916, 15.766996568037143 ], [ -89.512101813447941, 15.755601914896431 ], [ -89.517295294841972, 15.753121446197781 ], [ -89.527656420107689, 15.75002085987478 ], [ -89.530627814322145, 15.747953803225414 ], [ -89.532694871870831, 15.745447496105044 ], [ -89.534916958151086, 15.740434881864303 ], [ -89.597910529347416, 15.654626165964771 ], [ -89.654031135228706, 15.577705796984901 ], [ -89.661369187637888, 15.560885118453427 ], [ -89.658630337420107, 15.560109972097507 ], [ -89.654186163960276, 15.557526149712032 ], [ -89.652222460098415, 15.555898341735087 ], [ -89.650207079393169, 15.553753769820617 ], [ -89.648760138569514, 15.552022609955486 ], [ -89.644961921155698, 15.545950629417973 ], [ -89.622844408442688, 15.522954617561538 ], [ -89.614963751875621, 15.511482449155665 ], [ -89.606204597064504, 15.502154853563638 ], [ -89.593104620681686, 15.490553493948596 ], [ -89.589564785686321, 15.485101630136114 ], [ -89.588143684183649, 15.481225898356513 ], [ -89.596308559792192, 15.468487657179594 ], [ -89.597548794141517, 15.46613637879085 ], [ -89.599409146115192, 15.461072089505308 ], [ -89.602303025963863, 15.449987493827791 ], [ -89.604654304352664, 15.445259101326428 ], [ -89.606023729011895, 15.443269558143584 ], [ -89.607754889776345, 15.441228339016618 ], [ -89.6095894033283, 15.439523017573208 ], [ -89.61165645997761, 15.438024399906112 ], [ -89.630621711322874, 15.429239407572595 ], [ -89.636667854337986, 15.424769394791724 ], [ -89.638295661415611, 15.422909043717368 ], [ -89.647261521801795, 15.305706895456865 ], [ -89.647054816226785, 15.290694892055626 ], [ -89.64620215460576, 15.287258408948389 ], [ -89.642093878829428, 15.277620754094528 ], [ -89.639716762918283, 15.273254095899802 ], [ -89.63305050317814, 15.264391588301123 ], [ -89.627391933790705, 15.254857286234767 ], [ -89.626539273069, 15.250697332715731 ], [ -89.626616787434784, 15.245555528165085 ], [ -89.62979488812357, 15.22907074641779 ], [ -89.630053269642644, 15.223593044183644 ], [ -89.62979488812357, 15.219252224410639 ], [ -89.62788286020583, 15.214058743016551 ], [ -89.623438686745999, 15.204653632159363 ], [ -89.605506965074369, 15.179900621116758 ], [ -89.67467586869634, 15.164294338512889 ], [ -89.706611905215254, 15.166361396061575 ], [ -89.770251430658959, 15.156956285204387 ], [ -89.782033658326668, 15.159333401115532 ], [ -89.817044440048846, 15.172355862233246 ], [ -89.840117967170443, 15.17318268543255 ], [ -89.850530769279544, 15.171735745508215 ], [ -89.877996792118267, 15.159850165053058 ], [ -89.907193976620704, 15.152408758957051 ], [ -89.923833787998888, 15.151065171820221 ], [ -89.97300391329992, 15.156542874054367 ], [ -89.928846402239628, 15.217934474796152 ], [ -89.918149380189732, 15.247054144932804 ], [ -89.917374233833812, 15.257182725302528 ], [ -89.919312100173272, 15.262143662699884 ], [ -89.921715053606817, 15.266561997737995 ], [ -89.926417608585723, 15.272194728703766 ], [ -89.937657232994866, 15.282478338704379 ], [ -89.945098639990249, 15.28674164501092 ], [ -89.948741827773119, 15.287826849729299 ], [ -89.952100795615195, 15.288498643297714 ], [ -89.997007616408325, 15.284855455514844 ], [ -90.006050992059613, 15.282788397966158 ], [ -90.038813849979192, 15.270153510476121 ], [ -90.078010423642127, 15.268835760861634 ], [ -90.187176886603993, 15.283718573053704 ], [ -90.235235968764925, 15.294932359041127 ], [ -90.248775193820109, 15.295707506296367 ], [ -90.253090176070771, 15.292787787126656 ], [ -90.254821336835221, 15.291056627261526 ], [ -90.256371630446381, 15.289118760922065 ], [ -90.258903775089152, 15.284338691577318 ], [ -90.259756435810857, 15.282168280341864 ], [ -90.260505743745057, 15.275967109494502 ], [ -90.268567268364734, 15.24509044017168 ], [ -90.275336879993006, 15.235659490892772 ], [ -90.280091111815352, 15.231654567903945 ], [ -90.292312588155426, 15.216849270077716 ], [ -90.29621415925601, 15.21287018551061 ], [ -90.306316901204013, 15.20752167448569 ], [ -90.310270148248719, 15.207056586492286 ], [ -90.313164028996709, 15.207805894426485 ], [ -90.323835211725623, 15.218089504427098 ], [ -90.378922288832541, 15.254314682976201 ], [ -90.400548876029802, 15.260980942716344 ], [ -90.424113328667147, 15.260128281994582 ], [ -90.45770300978603, 15.260980942716344 ], [ -90.480569831332616, 15.261135973246553 ], [ -90.503772548764118, 15.262195339543268 ], [ -90.497235480233201, 15.270851142466256 ], [ -90.487830370275333, 15.287645982576009 ], [ -90.478476936261586, 15.310641995331821 ], [ -90.477624273741242, 15.330976671336316 ], [ -90.493514777185226, 15.339735826147432 ], [ -90.650817836673809, 15.363093573209824 ], [ -90.682030401881548, 15.37495331524326 ], [ -90.702700974670222, 15.394357815260946 ], [ -90.707765265754404, 15.408439643574695 ], [ -90.709754808037928, 15.426603909242999 ], [ -90.705594855418212, 15.442313543735054 ], [ -90.692158983150534, 15.44897980437446 ], [ -90.65221310065408, 15.45262299215733 ], [ -90.640069138679792, 15.458875840747453 ], [ -90.648078985556708, 15.469469509110525 ], [ -90.648078985556708, 15.476290798481557 ], [ -90.620147874724637, 15.500501207164973 ], [ -90.614515143758865, 15.503162543016913 ], [ -90.603740607343127, 15.514066269742557 ], [ -90.596970994815536, 15.525951850197714 ], [ -90.603378872137228, 15.531532905219365 ], [ -90.608649868796363, 15.540757148023943 ], [ -90.615445318846355, 15.561272691181728 ], [ -90.625548061693678, 15.582124132023068 ], [ -90.640637580360021, 15.59235606518024 ], [ -90.631904263071249, 15.608608302930804 ], [ -90.632705247848889, 15.622922675241227 ], [ -90.642756313852772, 15.635815945149716 ], [ -90.661721564298716, 15.647598171018785 ], [ -90.662186652292178, 15.652326565318731 ], [ -90.660688036423721, 15.65361847651144 ], [ -90.657819994097451, 15.65361847651144 ], [ -90.65428015820271, 15.654419461289081 ], [ -90.662470873132293, 15.659199529734508 ], [ -90.671617600671709, 15.660801500189052 ], [ -90.680790168431486, 15.659199529734508 ], [ -90.689032559305133, 15.654419461289081 ], [ -90.700995653226812, 15.660801500189052 ], [ -90.743396166000252, 15.672738755689011 ], [ -90.780629034902006, 15.678914089013972 ], [ -90.788225470628959, 15.688448391080385 ], [ -90.784478929159263, 15.699739692332912 ], [ -90.770965541626424, 15.709041449503275 ], [ -90.7766499503349, 15.712348741401286 ], [ -90.791455248161128, 15.723329983391977 ], [ -90.791455248161128, 15.729531155138659 ], [ -90.786520148286172, 15.731158962216341 ], [ -90.782101814147381, 15.734802150898531 ], [ -90.777166714272425, 15.736972561234722 ], [ -90.783858812434232, 15.745938422520169 ], [ -90.793341437657205, 15.75079600713002 ], [ -90.805020310738712, 15.75211375584513 ], [ -90.818146124643931, 15.750640977499074 ], [ -90.811815761688024, 15.765110378541124 ], [ -90.784633958790153, 15.798415838819892 ], [ -90.771353116153364, 15.833452459863111 ], [ -90.767244838578392, 15.839395250090718 ], [ -90.742956916428511, 15.848619492895239 ], [ -90.73256995274113, 15.868101508178029 ], [ -90.738616095756186, 15.885283921915459 ], [ -90.763524136429737, 15.88781606745755 ], [ -90.753808967210034, 15.921044013370533 ], [ -90.746109177796313, 15.935565090356647 ], [ -90.73621314232264, 15.942438056571063 ], [ -90.73621314232264, 15.949259345042719 ], [ -90.741380785295007, 15.950112005764424 ], [ -90.742181770072591, 15.951145535438116 ], [ -90.741871710810813, 15.952980048090751 ], [ -90.743654548418647, 15.956080634413752 ], [ -90.750501675312023, 15.949259345042719 ], [ -90.759364182910701, 15.958871161474917 ], [ -90.763524136429737, 15.962281806160433 ], [ -90.763524136429737, 15.96972321225644 ], [ -90.750191616949564, 15.97279796015772 ], [ -90.734430304714749, 15.985381170804374 ], [ -90.723164841883943, 15.990212917891824 ], [ -90.720684374084556, 15.987086493147103 ], [ -90.71748043497405, 15.980471910250458 ], [ -90.712752040674104, 15.976286119209021 ], [ -90.705801560993223, 15.980291043097168 ], [ -90.702158373210352, 15.988636785858944 ], [ -90.704044562706372, 15.993856106574071 ], [ -90.704199592337318, 15.998196926347077 ], [ -90.695259568574215, 16.003881334156233 ], [ -90.702700974670222, 16.017523911998921 ], [ -90.660145433165212, 16.039796454342877 ], [ -90.634307217404114, 16.045222479733638 ], [ -90.620147874724637, 16.03119232826333 ], [ -90.613300746931884, 16.03119232826333 ], [ -90.610096808720755, 16.039176336718526 ], [ -90.605549283372739, 16.042948717509319 ], [ -90.599761521876701, 16.042664495769827 ], [ -90.59283687971822, 16.038633735258657 ], [ -90.59283687971822, 16.03119232826333 ], [ -90.597281053178051, 16.02925446192387 ], [ -90.602216153053007, 16.026463934862704 ], [ -90.607099576084579, 16.024965318094928 ], [ -90.607099576084579, 16.017523911998921 ], [ -90.590304735075449, 16.018350735198283 ], [ -90.580227830649847, 16.012614651445006 ], [ -90.571339483730185, 16.004346422149638 ], [ -90.558084480414436, 15.997680162409551 ], [ -90.555113085300604, 16.000884101520057 ], [ -90.548576015870424, 16.006310126011499 ], [ -90.544416063250708, 16.010702623527266 ], [ -90.542710740907921, 16.004501450881264 ], [ -90.541625536189542, 16.004268906884533 ], [ -90.540385300940841, 16.00729197794243 ], [ -90.538214890604706, 16.010702623527266 ], [ -90.531031866927094, 16.003958849421338 ], [ -90.527776251872524, 16.004527289302928 ], [ -90.523952196036987, 16.010702623527266 ], [ -90.517105069143611, 16.010702623527266 ], [ -90.506743943877893, 16.006206773223994 ], [ -90.487365282281928, 16.017963162469982 ], [ -90.475531378670155, 16.010702623527266 ], [ -90.469330206923473, 16.010702623527266 ], [ -90.467831591055074, 16.015637722502902 ], [ -90.464395107947837, 16.019978543175228 ], [ -90.462483080030097, 16.024965318094928 ], [ -90.450494146787435, 16.020676174265986 ], [ -90.440262213630263, 16.024810289363359 ], [ -90.435998908223041, 16.034008693746216 ], [ -90.441993374394713, 16.044834906106018 ], [ -90.433544277946055, 16.056048692093441 ], [ -90.431503058819089, 16.065479641372349 ], [ -90.436412320272325, 16.073282781774935 ], [ -90.44819509742581, 16.079259908118274 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-IZ", "NAME_1": "Izabal" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.22093665299991, 15.725653387000079 ], [ -88.232619995999926, 15.721418762 ], [ -88.23574641999997, 15.71242706300005 ], [ -88.234919596999958, 15.701575013000095 ], [ -88.241585855999858, 15.688242493000089 ], [ -88.247761190999938, 15.695683899000088 ], [ -88.264995279999937, 15.688604228000074 ], [ -88.279697224999921, 15.680749410000047 ], [ -88.295587728999948, 15.675013326000098 ], [ -88.316671712999948, 15.674599914000069 ], [ -88.322304443999911, 15.667261861000085 ], [ -88.352560994999919, 15.616903178000101 ], [ -88.398992269999923, 15.572797343000033 ], [ -88.467433936427028, 15.520739666502379 ], [ -88.500019693999974, 15.495954489000027 ], [ -88.587378702999928, 15.430299581 ], [ -88.674195108999896, 15.365058086000076 ], [ -88.76089940199995, 15.299961814000071 ], [ -88.847026936999868, 15.235298564000104 ], [ -88.97342749099991, 15.140394796000123 ], [ -89.008283243999898, 15.124400940000086 ], [ -89.109827433999868, 15.09145721400003 ], [ -89.140523234999904, 15.076393534000132 ], [ -89.146940319140413, 15.071284391261656 ], [ -89.147472906649284, 15.071690172563422 ], [ -89.150185920243985, 15.073757229212731 ], [ -89.157420619865718, 15.076857815535732 ], [ -89.161787278959764, 15.079855048171908 ], [ -89.181243455820834, 15.102592678509268 ], [ -89.183207159682638, 15.108173733530975 ], [ -89.189149949910245, 15.136389065203161 ], [ -89.190648565778645, 15.152098699695216 ], [ -89.190028449053671, 15.161710517026734 ], [ -89.19039018425957, 15.167911688773415 ], [ -89.198193325561533, 15.199692694762064 ], [ -89.198296678348981, 15.20633311608043 ], [ -89.197211472731283, 15.21038971591264 ], [ -89.184679938028694, 15.215247301421812 ], [ -89.180571662252419, 15.218011990061257 ], [ -89.178788824644528, 15.219588121194818 ], [ -89.177109340723462, 15.221603501900063 ], [ -89.174628872024812, 15.226073512882294 ], [ -89.173750372881386, 15.22832143848359 ], [ -89.172587652897846, 15.234832669492107 ], [ -89.170365566617591, 15.259869900475508 ], [ -89.170830654610995, 15.266251939375479 ], [ -89.171605800966915, 15.269042467335964 ], [ -89.173207771421517, 15.272168891181366 ], [ -89.175559048011621, 15.275605374288602 ], [ -89.180519986308298, 15.280773017260913 ], [ -89.183723925418803, 15.283486029956293 ], [ -89.186591965946434, 15.285346381030649 ], [ -89.209872198643041, 15.297619534214107 ], [ -89.219871588702858, 15.299944973281868 ], [ -89.25051571312963, 15.302890529973979 ], [ -89.273718430561132, 15.298032945364127 ], [ -89.288187831603125, 15.291056627261526 ], [ -89.314284430681937, 15.272117214337982 ], [ -89.43130571178915, 15.22638357214413 ], [ -89.549799771242419, 15.187755439262105 ], [ -89.564656745012769, 15.184551500151599 ], [ -89.605506965074369, 15.179900621116758 ], [ -89.623438686745999, 15.204653632159363 ], [ -89.62788286020583, 15.214058743016551 ], [ -89.62979488812357, 15.219252224410639 ], [ -89.630053269642644, 15.223593044183644 ], [ -89.62979488812357, 15.22907074641779 ], [ -89.626616787434784, 15.245555528165085 ], [ -89.626539273069, 15.250697332715731 ], [ -89.627391933790705, 15.254857286234767 ], [ -89.63305050317814, 15.264391588301123 ], [ -89.639716762918283, 15.273254095899802 ], [ -89.642093878829428, 15.277620754094528 ], [ -89.64620215460576, 15.287258408948389 ], [ -89.647054816226785, 15.290694892055626 ], [ -89.647261521801795, 15.305706895456865 ], [ -89.638295661415611, 15.422909043717368 ], [ -89.636667854337986, 15.424769394791724 ], [ -89.630621711322874, 15.429239407572595 ], [ -89.61165645997761, 15.438024399906112 ], [ -89.6095894033283, 15.439523017573208 ], [ -89.607754889776345, 15.441228339016618 ], [ -89.606023729011895, 15.443269558143584 ], [ -89.604654304352664, 15.445259101326428 ], [ -89.602303025963863, 15.449987493827791 ], [ -89.599409146115192, 15.461072089505308 ], [ -89.597548794141517, 15.46613637879085 ], [ -89.596308559792192, 15.468487657179594 ], [ -89.588143684183649, 15.481225898356513 ], [ -89.589564785686321, 15.485101630136114 ], [ -89.593104620681686, 15.490553493948596 ], [ -89.606204597064504, 15.502154853563638 ], [ -89.614963751875621, 15.511482449155665 ], [ -89.622844408442688, 15.522954617561538 ], [ -89.644961921155698, 15.545950629417973 ], [ -89.648760138569514, 15.552022609955486 ], [ -89.650207079393169, 15.553753769820617 ], [ -89.652222460098415, 15.555898341735087 ], [ -89.654186163960276, 15.557526149712032 ], [ -89.658630337420107, 15.560109972097507 ], [ -89.661369187637888, 15.560885118453427 ], [ -89.654031135228706, 15.577705796984901 ], [ -89.597910529347416, 15.654626165964771 ], [ -89.534916958151086, 15.740434881864303 ], [ -89.532694871870831, 15.745447496105044 ], [ -89.530627814322145, 15.747953803225414 ], [ -89.527656420107689, 15.75002085987478 ], [ -89.517295294841972, 15.753121446197781 ], [ -89.512101813447941, 15.755601914896431 ], [ -89.495384487703916, 15.766996568037143 ], [ -89.484945848072414, 15.77159577112792 ], [ -89.481406013077049, 15.77428294540158 ], [ -89.477530280398128, 15.779192205955553 ], [ -89.465360480002118, 15.800586249156083 ], [ -89.464378628071188, 15.803247585907343 ], [ -89.459314337886383, 15.812316799080975 ], [ -89.456859706710077, 15.814280503842156 ], [ -89.453319871714712, 15.816037503028326 ], [ -89.43396704764109, 15.817949530046747 ], [ -89.423760952006319, 15.825804348192094 ], [ -89.396346605111717, 15.861280218807053 ], [ -89.384590216765048, 15.867894801703699 ], [ -89.380662808142063, 15.871641344072771 ], [ -89.378957485799333, 15.875000311914846 ], [ -89.377768928293392, 15.878307602913537 ], [ -89.375934413842117, 15.885232245072018 ], [ -89.369526537419745, 15.901613674031807 ], [ -89.358002692170487, 15.912930812806735 ], [ -89.265992805423593, 15.914739487937027 ], [ -89.242531703775114, 15.91150971130412 ], [ -89.237415737646131, 15.907737332312024 ], [ -89.236692268133652, 15.90709137626601 ], [ -89.236022275999858, 15.90649316800004 ], [ -89.236512207999908, 15.89391469300007 ], [ -89.228243977999853, 15.880840556000109 ], [ -89.225996053999921, 15.884044495000083 ], [ -89.21653926699986, 15.888643697000035 ], [ -89.204834553999888, 15.89241607700005 ], [ -89.195765339999923, 15.892932841000103 ], [ -89.17744604499984, 15.900270894000087 ], [ -89.100913248999944, 15.896808574000048 ], [ -89.072387858999889, 15.901511129000127 ], [ -89.040322631999885, 15.901717834000081 ], [ -88.951878418999854, 15.879651999000075 ], [ -88.913970506999959, 15.893947658000044 ], [ -88.900013800999943, 15.887844143000052 ], [ -88.866200324999909, 15.860337632000039 ], [ -88.831613735999952, 15.868638414000088 ], [ -88.78734290299991, 15.859076239000046 ], [ -88.753285285999937, 15.839789130000042 ], [ -88.749501105999911, 15.818793036000045 ], [ -88.72679602799991, 15.81517161700009 ], [ -88.625965949999909, 15.753892320000091 ], [ -88.638295050999943, 15.708807684000078 ], [ -88.636219855999911, 15.702093817000048 ], [ -88.609242316999939, 15.702093817000048 ], [ -88.598378058999913, 15.706122137000079 ], [ -88.595204230999911, 15.714667059000078 ], [ -88.59634355399993, 15.722154039000088 ], [ -88.598703579999949, 15.723211981000077 ], [ -88.598988410999937, 15.727362372000073 ], [ -88.602365688999896, 15.730902411000045 ], [ -88.605580206999946, 15.735541083000044 ], [ -88.605458136999914, 15.743068752000056 ], [ -88.600453253999945, 15.744574286000045 ], [ -88.591175910999937, 15.743557033000059 ], [ -88.582183397999927, 15.745021877000056 ], [ -88.578195766999897, 15.753892320000091 ], [ -88.574330206999946, 15.769964911000045 ], [ -88.565500454999949, 15.780951239000046 ], [ -88.556060350999928, 15.789496161000045 ], [ -88.550282355999911, 15.79828522300005 ], [ -88.54906165299991, 15.813666083000044 ], [ -88.556711391999897, 15.83734772300005 ], [ -88.557687954999949, 15.852932033000059 ], [ -88.550282355999911, 15.852932033000059 ], [ -88.550648566999939, 15.842474677000041 ], [ -88.550282355999911, 15.839260158000059 ], [ -88.544056769999941, 15.839260158000059 ], [ -88.532134568999936, 15.846828518000052 ], [ -88.503041144999941, 15.841376044000071 ], [ -88.488840298999946, 15.846747137000079 ], [ -88.51195227799991, 15.867580471000053 ], [ -88.524810350999928, 15.877020575000074 ], [ -88.54328365799995, 15.885158596000053 ], [ -88.55101477799991, 15.89516836100006 ], [ -88.557687954999949, 15.90656159100007 ], [ -88.564523891999897, 15.914984442000048 ], [ -88.607574022999927, 15.938421942000048 ], [ -88.619862433999913, 15.953273830000057 ], [ -88.605458136999914, 15.969631252000056 ], [ -88.590199347999942, 15.961004950000074 ], [ -88.561838344999899, 15.949042059000078 ], [ -88.550282355999911, 15.942328192000048 ], [ -88.521229620999918, 15.91274648600006 ], [ -88.50023352799991, 15.901068427000041 ], [ -88.44790605399993, 15.858710028000075 ], [ -88.344838019999941, 15.81195709800005 ], [ -88.311024542999917, 15.782416083000044 ], [ -88.300404425999943, 15.777818101000037 ], [ -88.256337042999917, 15.740383205000057 ], [ -88.221547003999945, 15.725897528000075 ], [ -88.22093665299991, 15.725653387000079 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-ZA", "NAME_1": "Zacapa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.146940319140413, 15.071284391261656 ], [ -89.16080623499991, 15.060244649000055 ], [ -89.172769328999976, 15.042209575000058 ], [ -89.18858231699997, 14.996088359000026 ], [ -89.169100300999872, 14.97841501900011 ], [ -89.169151977999888, 14.952060038000056 ], [ -89.181528482999852, 14.923663839000127 ], [ -89.189214955999915, 14.913059034000113 ], [ -89.189563361060266, 14.913818671394552 ], [ -89.192715624226651, 14.920691636709648 ], [ -89.194110887307602, 14.922965399833345 ], [ -89.195118577660196, 14.925239162956984 ], [ -89.196436327274682, 14.927512926080681 ], [ -89.199356044645754, 14.934540920127347 ], [ -89.203180101380553, 14.941413886341763 ], [ -89.204730394092394, 14.943532619834514 ], [ -89.206332363647618, 14.945341294964749 ], [ -89.208115201255509, 14.94694326452003 ], [ -89.210027229173249, 14.948235174813476 ], [ -89.212585212237741, 14.949320380431175 ], [ -89.217856207997556, 14.948545234075254 ], [ -89.225452643724509, 14.946426500582504 ], [ -89.247544318015855, 14.935471096114156 ], [ -89.254236416177662, 14.930975246710261 ], [ -89.258344692853257, 14.927202866818845 ], [ -89.263512335825624, 14.919606431991213 ], [ -89.268163214860465, 14.914490464962967 ], [ -89.274286872241362, 14.909632880353115 ], [ -89.286172451797199, 14.905808824517635 ], [ -89.293691372258991, 14.905498766155119 ], [ -89.300099249580683, 14.909787909084741 ], [ -89.304130011890493, 14.914903876112987 ], [ -89.319762132916082, 14.919658107935334 ], [ -89.369113125370404, 14.903483385449874 ], [ -89.385391202442008, 14.903483385449874 ], [ -89.399162970594602, 14.912578437045227 ], [ -89.421073777732659, 14.919037991210303 ], [ -89.429342007027969, 14.919244696785313 ], [ -89.44866899267987, 14.913818671394552 ], [ -89.509104579912389, 14.86674144116455 ], [ -89.524323289787958, 14.863175766848144 ], [ -89.577860074183036, 14.864157620577714 ], [ -89.59258785674416, 14.867464911576405 ], [ -89.624678921095324, 14.882657782130934 ], [ -89.658656174942507, 14.899607651871634 ], [ -89.670412564188496, 14.901054591795969 ], [ -89.687517462660765, 14.888238837152585 ], [ -89.71035844578563, 14.867258206001395 ], [ -89.71170203292246, 14.862245591760654 ], [ -89.7086272859205, 14.837802639080508 ], [ -89.712683884853391, 14.821369534176654 ], [ -89.73635169117756, 14.779873358968302 ], [ -89.747720506795929, 14.782922268447919 ], [ -89.763636847762314, 14.785299384359064 ], [ -89.790431077931885, 14.785299384359064 ], [ -89.793660854564791, 14.785712795509085 ], [ -89.799448615161452, 14.79217235057348 ], [ -89.8076910060351, 14.803592841236593 ], [ -89.823633186322468, 14.833203436889107 ], [ -89.83290910507111, 14.84596751648769 ], [ -89.838851895298717, 14.856199448745542 ], [ -89.841719936725667, 14.859816799006069 ], [ -89.833994309789546, 14.876508287227637 ], [ -89.811592577135684, 14.901054591795969 ], [ -89.799009365589711, 14.906428941242609 ], [ -89.777563646445117, 14.90704905796764 ], [ -89.772680223413545, 14.907875881166945 ], [ -89.768675300424775, 14.90952952756561 ], [ -89.766685757241873, 14.914283759387956 ], [ -89.764567022849803, 14.934024156189821 ], [ -89.767047492447773, 14.937228095300327 ], [ -89.772111782632635, 14.940225327936503 ], [ -89.784927538175339, 14.941982327122673 ], [ -89.797123176093692, 14.948235174813476 ], [ -89.805107185448207, 14.959242255225888 ], [ -89.849083827556569, 15.017998359436717 ], [ -89.85179684115127, 15.022752590359744 ], [ -89.852727017138136, 15.026679998982729 ], [ -89.848696254828269, 15.02823029169457 ], [ -89.843942023005923, 15.02885040931892 ], [ -89.795572883381851, 15.029832262149171 ], [ -89.796554735312782, 15.043268134416849 ], [ -89.841048143157252, 15.108483791893491 ], [ -89.877996792118267, 15.159850165053058 ], [ -89.850530769279544, 15.171735745508215 ], [ -89.840117967170443, 15.17318268543255 ], [ -89.817044440048846, 15.172355862233246 ], [ -89.782033658326668, 15.159333401115532 ], [ -89.770251430658959, 15.156956285204387 ], [ -89.706611905215254, 15.166361396061575 ], [ -89.67467586869634, 15.164294338512889 ], [ -89.605506965074369, 15.179900621116758 ], [ -89.564656745012769, 15.184551500151599 ], [ -89.549799771242419, 15.187755439262105 ], [ -89.43130571178915, 15.22638357214413 ], [ -89.314284430681937, 15.272117214337982 ], [ -89.288187831603125, 15.291056627261526 ], [ -89.273718430561132, 15.298032945364127 ], [ -89.25051571312963, 15.302890529973979 ], [ -89.219871588702858, 15.299944973281868 ], [ -89.209872198643041, 15.297619534214107 ], [ -89.186591965946434, 15.285346381030649 ], [ -89.183723925418803, 15.283486029956293 ], [ -89.180519986308298, 15.280773017260913 ], [ -89.175559048011621, 15.275605374288602 ], [ -89.173207771421517, 15.272168891181366 ], [ -89.171605800966915, 15.269042467335964 ], [ -89.170830654610995, 15.266251939375479 ], [ -89.170365566617591, 15.259869900475508 ], [ -89.172587652897846, 15.234832669492107 ], [ -89.173750372881386, 15.22832143848359 ], [ -89.174628872024812, 15.226073512882294 ], [ -89.177109340723462, 15.221603501900063 ], [ -89.178788824644528, 15.219588121194818 ], [ -89.180571662252419, 15.218011990061257 ], [ -89.184679938028694, 15.215247301421812 ], [ -89.197211472731283, 15.21038971591264 ], [ -89.198296678348981, 15.20633311608043 ], [ -89.198193325561533, 15.199692694762064 ], [ -89.19039018425957, 15.167911688773415 ], [ -89.190028449053671, 15.161710517026734 ], [ -89.190648565778645, 15.152098699695216 ], [ -89.189149949910245, 15.136389065203161 ], [ -89.183207159682638, 15.108173733530975 ], [ -89.181243455820834, 15.102592678509268 ], [ -89.161787278959764, 15.079855048171908 ], [ -89.157420619865718, 15.076857815535732 ], [ -89.150185920243985, 15.073757229212731 ], [ -89.147472906649284, 15.071690172563422 ], [ -89.146940319140413, 15.071284391261656 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-RE", "NAME_1": "Retalhuleu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -91.658500845474649, 14.117349342936476 ], [ -91.762557670999911, 14.180174112000088 ], [ -91.908192511999914, 14.28384023600006 ], [ -92.049590623999904, 14.408026434000078 ], [ -92.162394631747958, 14.487325889609581 ], [ -92.16232764410546, 14.487436427748946 ], [ -92.160699836128515, 14.490123602921926 ], [ -92.157986823433134, 14.491053778908736 ], [ -92.153981900444307, 14.491777249320592 ], [ -92.143517422391085, 14.489296779722565 ], [ -92.138530646572065, 14.489658514928522 ], [ -92.133543870752987, 14.491828925264656 ], [ -92.124681363154366, 14.497978420167954 ], [ -92.115741340290583, 14.505936591100806 ], [ -92.112356534026787, 14.507228502293515 ], [ -92.107473110995272, 14.508210354224445 ], [ -92.097447883413054, 14.507538559756711 ], [ -92.087965258190081, 14.505626531838971 ], [ -92.08272009995261, 14.503766180764615 ], [ -92.07987789604806, 14.503352768715274 ], [ -92.07677730972506, 14.503197739983705 ], [ -92.073960944242174, 14.503559475189604 ], [ -92.070266078716543, 14.505109767901445 ], [ -92.066338670992877, 14.507796943074425 ], [ -92.055176560949519, 14.519785875417824 ], [ -92.046494921403507, 14.523713284040809 ], [ -92.016625943332599, 14.530947984561806 ], [ -92.008538581190578, 14.536425685896688 ], [ -92.003345099796491, 14.538647773076264 ], [ -92.000942146362945, 14.539112861069668 ], [ -91.996730516000468, 14.537975979507848 ], [ -91.937948575166615, 14.513481349984318 ], [ -91.926657273914032, 14.511724350798147 ], [ -91.897460090310915, 14.514308173183622 ], [ -91.855783047049954, 14.523454902521735 ], [ -91.824596320263936, 14.56882680950963 ], [ -91.814777798256785, 14.579937241810228 ], [ -91.812555711976529, 14.5840713569076 ], [ -91.810230272009449, 14.59058258701674 ], [ -91.806716275435747, 14.604948635271285 ], [ -91.803253953906847, 14.614043686866637 ], [ -91.798835618868679, 14.623138739361309 ], [ -91.780903897197106, 14.649183660697361 ], [ -91.776408046893835, 14.658795478028878 ], [ -91.767726407347823, 14.686235663345144 ], [ -91.761034309186016, 14.696519273345757 ], [ -91.725248379309221, 14.713469143086456 ], [ -91.711709154254038, 14.727938544128506 ], [ -91.704293585680432, 14.734139715875187 ], [ -91.700056118694931, 14.736878566992232 ], [ -91.69731726757783, 14.738325506916624 ], [ -91.694320034941654, 14.739514065321828 ], [ -91.690056728635113, 14.740134182046859 ], [ -91.686620246427196, 14.739927476471848 ], [ -91.683933072153536, 14.738997301384359 ], [ -91.682227748911487, 14.736568507730453 ], [ -91.68109086824893, 14.734398098293582 ], [ -91.682615323438426, 14.722150784431165 ], [ -91.69692969395021, 14.689129544093191 ], [ -91.699746060332416, 14.671611233571582 ], [ -91.697084723581099, 14.66882070651036 ], [ -91.692097947762079, 14.66634023691239 ], [ -91.679669765846995, 14.664118149732815 ], [ -91.673856166828614, 14.662412828289405 ], [ -91.666001349582586, 14.661999417139384 ], [ -91.656622077147119, 14.670681056685396 ], [ -91.653702358876728, 14.677347317324802 ], [ -91.651583625383978, 14.678845933193259 ], [ -91.648276332586647, 14.680292874016914 ], [ -91.642462735366905, 14.678639228517568 ], [ -91.636287401142624, 14.675228582932732 ], [ -91.633548550025523, 14.675228582932732 ], [ -91.630008715030158, 14.676468818181377 ], [ -91.622489793669047, 14.68447866505835 ], [ -91.61752885627169, 14.691351630373447 ], [ -91.616469489075655, 14.693522039810262 ], [ -91.610759243744099, 14.702100328367464 ], [ -91.607348599058582, 14.705614324941109 ], [ -91.604635586363202, 14.706699530558865 ], [ -91.60091488331517, 14.70700958892138 ], [ -91.590476243683668, 14.704374091491104 ], [ -91.584455939090276, 14.702255357099034 ], [ -91.57897823775545, 14.700963446805588 ], [ -91.57569678427916, 14.700860094018083 ], [ -91.570890875613372, 14.702358709886539 ], [ -91.564948086285142, 14.705200913791145 ], [ -91.544510056593822, 14.718585110114702 ], [ -91.538360561690524, 14.720445461189058 ], [ -91.526268276559676, 14.719463609258128 ], [ -91.510506965224238, 14.712952379148987 ], [ -91.540582647970837, 14.687114163387889 ], [ -91.563242763942412, 14.6623094755019 ], [ -91.565904099794352, 14.658330390035474 ], [ -91.568978847695632, 14.652232571076297 ], [ -91.569650642163367, 14.649390367171691 ], [ -91.570219082044957, 14.638176581184268 ], [ -91.569418098166693, 14.625412502485005 ], [ -91.568875494908127, 14.615593980477797 ], [ -91.608356289411233, 14.537149156308487 ], [ -91.608795538982918, 14.530896307718422 ], [ -91.608666347773692, 14.527640693563114 ], [ -91.608278775045392, 14.524746811915804 ], [ -91.616236945078924, 14.466145738235241 ], [ -91.61541012187962, 14.460151272063513 ], [ -91.613911506011164, 14.454931952247762 ], [ -91.611921962828319, 14.449919338007021 ], [ -91.599287076237545, 14.428008530868965 ], [ -91.598692797034914, 14.420567124772958 ], [ -91.603266160804651, 14.355506496927262 ], [ -91.602594367236236, 14.342225654290473 ], [ -91.603085292752041, 14.335714423282013 ], [ -91.603937954373066, 14.331115221090556 ], [ -91.615306769991435, 14.314682115287383 ], [ -91.627760790328182, 14.277785142270488 ], [ -91.632359991620319, 14.248019516987085 ], [ -91.634427050068268, 14.215153307179378 ], [ -91.635589769152489, 14.208848781745871 ], [ -91.636700813191965, 14.206626695465616 ], [ -91.665226203226666, 14.165388901776396 ], [ -91.659257574577396, 14.125494697022646 ], [ -91.658500845474649, 14.117349342936476 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-SU", "NAME_1": "Suchitepéquez" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -91.551869269999941, 14.05727773600006 ], [ -91.637115037999934, 14.104437567000048 ], [ -91.658500845474649, 14.117349342936476 ], [ -91.659257574577396, 14.125494697022646 ], [ -91.665226203226666, 14.165388901776396 ], [ -91.636700813191965, 14.206626695465616 ], [ -91.635589769152489, 14.208848781745871 ], [ -91.634427050068268, 14.215153307179378 ], [ -91.632359991620319, 14.248019516987085 ], [ -91.627760790328182, 14.277785142270488 ], [ -91.615306769991435, 14.314682115287383 ], [ -91.603937954373066, 14.331115221090556 ], [ -91.603085292752041, 14.335714423282013 ], [ -91.602594367236236, 14.342225654290473 ], [ -91.603266160804651, 14.355506496927262 ], [ -91.598692797034914, 14.420567124772958 ], [ -91.599287076237545, 14.428008530868965 ], [ -91.611921962828319, 14.449919338007021 ], [ -91.613911506011164, 14.454931952247762 ], [ -91.61541012187962, 14.460151272063513 ], [ -91.616236945078924, 14.466145738235241 ], [ -91.608278775045392, 14.524746811915804 ], [ -91.608666347773692, 14.527640693563114 ], [ -91.608795538982918, 14.530896307718422 ], [ -91.608356289411233, 14.537149156308487 ], [ -91.568875494908127, 14.615593980477797 ], [ -91.569418098166693, 14.625412502485005 ], [ -91.570219082044957, 14.638176581184268 ], [ -91.569650642163367, 14.649390367171691 ], [ -91.568978847695632, 14.652232571076297 ], [ -91.565904099794352, 14.658330390035474 ], [ -91.563242763942412, 14.6623094755019 ], [ -91.540582647970837, 14.687114163387889 ], [ -91.510506965224238, 14.712952379148987 ], [ -91.469682582685039, 14.739565741265949 ], [ -91.464824998974507, 14.733777981568608 ], [ -91.4619827950699, 14.729127102533766 ], [ -91.449528774733153, 14.696932685395097 ], [ -91.448417730693677, 14.691454983160952 ], [ -91.448133510752882, 14.688044338475436 ], [ -91.452887742575228, 14.673988349482727 ], [ -91.476607224843519, 14.629856675944836 ], [ -91.461879442282395, 14.616214098102148 ], [ -91.41632666724189, 14.610116279142972 ], [ -91.402994146862397, 14.606498927983125 ], [ -91.397981534420239, 14.620193183568574 ], [ -91.397077195955831, 14.627892971183655 ], [ -91.39780066636763, 14.640502021151349 ], [ -91.397542283949235, 14.643395901000019 ], [ -91.396612107962369, 14.646238104904626 ], [ -91.395061815250529, 14.64897695602167 ], [ -91.392322964133484, 14.651664130295387 ], [ -91.387465380422952, 14.654971422193341 ], [ -91.383977219573012, 14.656831773267697 ], [ -91.377879400613836, 14.658795478028878 ], [ -91.370102097733593, 14.658072008516342 ], [ -91.355219286440899, 14.651250719145366 ], [ -91.343824633300187, 14.638176581184268 ], [ -91.342971970779786, 14.637608141302678 ], [ -91.320596075648382, 14.639520169220418 ], [ -91.309278937772717, 14.641948961075684 ], [ -91.305532396303022, 14.641328844350653 ], [ -91.302586839610967, 14.640502021151349 ], [ -91.292199876822849, 14.629546617582321 ], [ -91.263131882630262, 14.604535224121264 ], [ -91.258584357282245, 14.599264228361449 ], [ -91.256724006207889, 14.595078437320012 ], [ -91.255173712596729, 14.58691355991283 ], [ -91.254863654234214, 14.577663478686588 ], [ -91.25522538944017, 14.574614570106291 ], [ -91.257628342873716, 14.563297431331364 ], [ -91.257654182194756, 14.560300197795868 ], [ -91.257189094201294, 14.557406317947198 ], [ -91.254191860665799, 14.555390937241953 ], [ -91.251375495182913, 14.553943997317617 ], [ -91.228818731998842, 14.557096258685362 ], [ -91.201068488320061, 14.571255601364896 ], [ -91.192257656665504, 14.572392482926716 ], [ -91.18194820824317, 14.572134101407642 ], [ -91.176082933280725, 14.571048895789886 ], [ -91.166393601583422, 14.567586575160306 ], [ -91.153112758946634, 14.559473375495884 ], [ -91.11414872928043, 14.530431219725017 ], [ -91.107198248700172, 14.524281724821719 ], [ -91.100790371378537, 14.517563788238249 ], [ -91.097224697961451, 14.512964586046792 ], [ -91.095390184409439, 14.503197739983705 ], [ -91.09717302111801, 14.480718492064739 ], [ -91.09717302111801, 14.46764435500296 ], [ -91.111332363797544, 14.430437322724231 ], [ -91.139573533891451, 14.373954983435738 ], [ -91.146188116788153, 14.356901760008213 ], [ -91.149056159114423, 14.308997708377547 ], [ -91.150089687888794, 14.303364976512455 ], [ -91.151484951869008, 14.299437567889413 ], [ -91.156032478116344, 14.292926336880953 ], [ -91.164920824136686, 14.275976467140254 ], [ -91.171096158361024, 14.272049058517212 ], [ -91.287729864941298, 14.280420641499404 ], [ -91.294086066318869, 14.281970933311925 ], [ -91.289125128921569, 14.30594879799861 ], [ -91.299951342180691, 14.316387436730793 ], [ -91.31819312221478, 14.296647039928928 ], [ -91.326280484356857, 14.291892808106581 ], [ -91.336254035095635, 14.291634425688187 ], [ -91.342765266104152, 14.292616279417757 ], [ -91.346589321939632, 14.294269924017783 ], [ -91.351627773702774, 14.297215480709838 ], [ -91.355891079109995, 14.301194566176264 ], [ -91.357983975080344, 14.304346829342705 ], [ -91.358991665432995, 14.30729238513544 ], [ -91.35927588627311, 14.310186265883431 ], [ -91.358991665432995, 14.313131822575542 ], [ -91.356872931940245, 14.321451727814974 ], [ -91.357053799093535, 14.32465566692548 ], [ -91.358061490345506, 14.327859605136666 ], [ -91.362919074055981, 14.334370836145183 ], [ -91.364366013980316, 14.336902980787897 ], [ -91.365244514023061, 14.339228419855658 ], [ -91.365296189967182, 14.341967270972759 ], [ -91.364572719555326, 14.344602769302355 ], [ -91.363539190781012, 14.3469798852135 ], [ -91.356278652737615, 14.357418524845059 ], [ -91.356433682368504, 14.361242581579859 ], [ -91.358268195021139, 14.366203518077896 ], [ -91.364727749186272, 14.375970364140983 ], [ -91.369068569858598, 14.379225979195553 ], [ -91.372918464115799, 14.380724595963329 ], [ -91.381057502201941, 14.378192450421238 ], [ -91.385734218759183, 14.375763658565972 ], [ -91.414233772170803, 14.355351467296373 ], [ -91.417799444688626, 14.351837469823352 ], [ -91.419168871146496, 14.349770413174042 ], [ -91.421210090273405, 14.345016181351696 ], [ -91.423328823766212, 14.336644599268823 ], [ -91.423638882128671, 14.330443427522141 ], [ -91.423070441347761, 14.32408722614457 ], [ -91.421365119005031, 14.315353908855798 ], [ -91.419427252665571, 14.310392971458441 ], [ -91.41459550737676, 14.301504625438099 ], [ -91.413691168912294, 14.299127509526954 ], [ -91.413381109650459, 14.296543687141423 ], [ -91.415396491255024, 14.293649807292752 ], [ -91.418781298418196, 14.290807603388146 ], [ -91.425809291565542, 14.28667348919015 ], [ -91.429917569140457, 14.285743313203341 ], [ -91.432656420257558, 14.286518460458581 ], [ -91.434025844916789, 14.288688869895395 ], [ -91.43655798955956, 14.296388658409853 ], [ -91.440071987931901, 14.301039537444694 ], [ -91.447978482021313, 14.30651723877952 ], [ -91.45831376796599, 14.300264391088774 ], [ -91.45986406067783, 14.296957099190763 ], [ -91.4615952223416, 14.290084132976347 ], [ -91.462189500644911, 14.277940171901378 ], [ -91.461724412651506, 14.269878648181077 ], [ -91.45792619523769, 14.246262518700291 ], [ -91.455600756169929, 14.206006577841265 ], [ -91.456918504885095, 14.189883531299927 ], [ -91.463067999788336, 14.181925361266394 ], [ -91.468287319604087, 14.176757717394707 ], [ -91.473041551426434, 14.169212958511196 ], [ -91.481232266356017, 14.151901353564597 ], [ -91.529808111555099, 14.08218984578474 ], [ -91.531978521891233, 14.076608792561728 ], [ -91.532908697878099, 14.071957913526887 ], [ -91.529523891614303, 14.056506658755268 ], [ -91.528516202160972, 14.048290107202661 ], [ -91.551869269999941, 14.05727773600006 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-ES", "NAME_1": "Escuintla" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -90.627334706133965, 13.920671995960658 ], [ -90.638018794999937, 13.922358034000069 ], [ -90.707277735999924, 13.928888581000081 ], [ -90.784614825999938, 13.921538447000046 ], [ -90.79624657599993, 13.918160508000085 ], [ -90.910333200999901, 13.911135082000044 ], [ -91.043740423999907, 13.913584837000087 ], [ -91.165760870999918, 13.926703192000048 ], [ -91.316461251999897, 13.955679359000044 ], [ -91.551869269999941, 14.05727773600006 ], [ -91.528516202160972, 14.048290107202661 ], [ -91.529523891614303, 14.056506658755268 ], [ -91.532908697878099, 14.071957913526887 ], [ -91.531978521891233, 14.076608792561728 ], [ -91.529808111555099, 14.08218984578474 ], [ -91.481232266356017, 14.151901353564597 ], [ -91.473041551426434, 14.169212958511196 ], [ -91.468287319604087, 14.176757717394707 ], [ -91.463067999788336, 14.181925361266394 ], [ -91.456918504885095, 14.189883531299927 ], [ -91.455600756169929, 14.206006577841265 ], [ -91.45792619523769, 14.246262518700291 ], [ -91.461724412651506, 14.269878648181077 ], [ -91.462189500644911, 14.277940171901378 ], [ -91.4615952223416, 14.290084132976347 ], [ -91.45986406067783, 14.296957099190763 ], [ -91.45831376796599, 14.300264391088774 ], [ -91.447978482021313, 14.30651723877952 ], [ -91.440071987931901, 14.301039537444694 ], [ -91.43655798955956, 14.296388658409853 ], [ -91.434025844916789, 14.288688869895395 ], [ -91.432656420257558, 14.286518460458581 ], [ -91.429917569140457, 14.285743313203341 ], [ -91.425809291565542, 14.28667348919015 ], [ -91.418781298418196, 14.290807603388146 ], [ -91.415396491255024, 14.293649807292752 ], [ -91.413381109650459, 14.296543687141423 ], [ -91.413691168912294, 14.299127509526954 ], [ -91.41459550737676, 14.301504625438099 ], [ -91.419427252665571, 14.310392971458441 ], [ -91.421365119005031, 14.315353908855798 ], [ -91.423070441347761, 14.32408722614457 ], [ -91.423638882128671, 14.330443427522141 ], [ -91.423328823766212, 14.336644599268823 ], [ -91.421210090273405, 14.345016181351696 ], [ -91.419168871146496, 14.349770413174042 ], [ -91.417799444688626, 14.351837469823352 ], [ -91.414233772170803, 14.355351467296373 ], [ -91.385734218759183, 14.375763658565972 ], [ -91.381057502201941, 14.378192450421238 ], [ -91.372918464115799, 14.380724595963329 ], [ -91.369068569858598, 14.379225979195553 ], [ -91.364727749186272, 14.375970364140983 ], [ -91.358268195021139, 14.366203518077896 ], [ -91.356433682368504, 14.361242581579859 ], [ -91.356278652737615, 14.357418524845059 ], [ -91.363539190781012, 14.3469798852135 ], [ -91.364572719555326, 14.344602769302355 ], [ -91.365296189967182, 14.341967270972759 ], [ -91.365244514023061, 14.339228419855658 ], [ -91.364366013980316, 14.336902980787897 ], [ -91.362919074055981, 14.334370836145183 ], [ -91.358061490345506, 14.327859605136666 ], [ -91.357053799093535, 14.32465566692548 ], [ -91.356872931940245, 14.321451727814974 ], [ -91.358991665432995, 14.313131822575542 ], [ -91.35927588627311, 14.310186265883431 ], [ -91.358991665432995, 14.30729238513544 ], [ -91.357983975080344, 14.304346829342705 ], [ -91.355891079109995, 14.301194566176264 ], [ -91.351627773702774, 14.297215480709838 ], [ -91.346589321939632, 14.294269924017783 ], [ -91.342765266104152, 14.292616279417757 ], [ -91.336254035095635, 14.291634425688187 ], [ -91.326280484356857, 14.291892808106581 ], [ -91.31819312221478, 14.296647039928928 ], [ -91.299951342180691, 14.316387436730793 ], [ -91.289125128921569, 14.30594879799861 ], [ -91.294086066318869, 14.281970933311925 ], [ -91.287729864941298, 14.280420641499404 ], [ -91.171096158361024, 14.272049058517212 ], [ -91.164920824136686, 14.275976467140254 ], [ -91.156032478116344, 14.292926336880953 ], [ -91.151484951869008, 14.299437567889413 ], [ -91.150089687888794, 14.303364976512455 ], [ -91.149056159114423, 14.308997708377547 ], [ -91.146188116788153, 14.356901760008213 ], [ -91.139573533891451, 14.373954983435738 ], [ -91.111332363797544, 14.430437322724231 ], [ -91.097405565114741, 14.420412096041389 ], [ -91.094899257994371, 14.418138332917692 ], [ -91.090196703015408, 14.415916245738117 ], [ -91.085700852712137, 14.415296129013143 ], [ -91.076657477960225, 14.416226304999952 ], [ -91.072084113291169, 14.417466539349277 ], [ -91.068518438974763, 14.418810126486107 ], [ -91.055237596337975, 14.426251532582171 ], [ -91.052757127639325, 14.427233385412364 ], [ -91.049889086212318, 14.428008530868965 ], [ -91.046866014255158, 14.428421942918305 ], [ -91.042421840795271, 14.42676829741896 ], [ -91.037176682557856, 14.423564358308454 ], [ -91.027306484606584, 14.414986069751308 ], [ -91.021389532800697, 14.411058661128266 ], [ -91.015989345831599, 14.408733222060562 ], [ -91.008651293422417, 14.409353338785536 ], [ -91.004930590374443, 14.410593573134861 ], [ -91.002140062413957, 14.412298896376967 ], [ -90.997024095385655, 14.417879950499298 ], [ -90.993251716393559, 14.420877183135474 ], [ -90.990693732429804, 14.42160065444665 ], [ -90.988058234100208, 14.419843655260479 ], [ -90.985577766300878, 14.415916245738117 ], [ -90.983510707852872, 14.399741523252658 ], [ -90.983433194386407, 14.391628322688916 ], [ -90.982813076762056, 14.388321030790905 ], [ -90.981236944729176, 14.385633857416565 ], [ -90.978472256089731, 14.38284332945608 ], [ -90.971340909255559, 14.386253974141596 ], [ -90.952220629178669, 14.423822739827585 ], [ -90.946355354216223, 14.438343817713019 ], [ -90.945037604601737, 14.440927639199174 ], [ -90.938087124021536, 14.449402574069495 ], [ -90.91718400813545, 14.468729559721396 ], [ -90.890544806697449, 14.489296779722565 ], [ -90.861089239776561, 14.464492091836576 ], [ -90.853053555377244, 14.456120509753703 ], [ -90.85204586502465, 14.453691717898437 ], [ -90.851348233034514, 14.450901190837271 ], [ -90.843751797307561, 14.435191555445897 ], [ -90.83124610102675, 14.415089423438133 ], [ -90.824967414014907, 14.40806142849209 ], [ -90.82021318219256, 14.404909166225025 ], [ -90.793780687228889, 14.42697500209465 ], [ -90.787062750645418, 14.434416409089977 ], [ -90.785486620411177, 14.436431789795222 ], [ -90.780577358957942, 14.4452684598715 ], [ -90.77587480307966, 14.451159573255666 ], [ -90.773575202433619, 14.453278306748416 ], [ -90.77166317361656, 14.454621893885303 ], [ -90.763007371592892, 14.459324448864209 ], [ -90.748512133028498, 14.459324448864209 ], [ -90.742724372431837, 14.462735094449044 ], [ -90.737763435034481, 14.470176500545051 ], [ -90.731097175294394, 14.472140204406912 ], [ -90.727247281037194, 14.469453030133195 ], [ -90.725774501791818, 14.467282619797061 ], [ -90.714689907912884, 14.444028225522175 ], [ -90.650507779210614, 14.468729559721396 ], [ -90.637743699612031, 14.431522529241306 ], [ -90.623015917050907, 14.418913479273613 ], [ -90.61479936369966, 14.416226304999952 ], [ -90.601828579425387, 14.416536363362468 ], [ -90.598831345889892, 14.416122952212447 ], [ -90.596350878090561, 14.415089423438133 ], [ -90.592165087049125, 14.401808579902024 ], [ -90.585550503253103, 14.350390529899016 ], [ -90.586325649609023, 14.317265936773538 ], [ -90.583173387341958, 14.305328681273579 ], [ -90.571029426266989, 14.277888495057994 ], [ -90.564931607307813, 14.256236070338389 ], [ -90.579659389868937, 14.24238678602137 ], [ -90.585705532883992, 14.231121324089827 ], [ -90.588831956729393, 14.220320950151688 ], [ -90.588651088676784, 14.215515042385277 ], [ -90.587204148752448, 14.212414456062277 ], [ -90.584930385628752, 14.211380927287962 ], [ -90.580744594587372, 14.210089016095196 ], [ -90.567205370431509, 14.207556871452425 ], [ -90.560745816266376, 14.207143460302461 ], [ -90.554337938045364, 14.207350164978095 ], [ -90.551392382252629, 14.207866929814941 ], [ -90.535889452436265, 14.213447983937272 ], [ -90.532013718858025, 14.213758043199107 ], [ -90.527466192610689, 14.212931219999803 ], [ -90.518784553064677, 14.20879710490243 ], [ -90.51630408436597, 14.205438137060355 ], [ -90.51570980516334, 14.202544257211684 ], [ -90.528086311134359, 14.187093004238761 ], [ -90.544338548884923, 14.172210191147371 ], [ -90.550772263728959, 14.168179429736881 ], [ -90.553356086114491, 14.167094224119126 ], [ -90.571856248566974, 14.16430369705796 ], [ -90.57854834672878, 14.161254788477663 ], [ -90.578393317097891, 14.147353827317261 ], [ -90.574801805259085, 14.14079092036468 ], [ -90.572941454184729, 14.138723862815993 ], [ -90.55849789066508, 14.125598048910831 ], [ -90.55656002522494, 14.121463934712779 ], [ -90.55617245159732, 14.118208320557528 ], [ -90.557438524368365, 14.116037909322017 ], [ -90.560435757004541, 14.112058823855648 ], [ -90.564208136895957, 14.108854884745142 ], [ -90.577437302689361, 14.10131012586163 ], [ -90.582449916930102, 14.096452542151098 ], [ -90.589968838291213, 14.08239655225907 ], [ -90.592991910248429, 14.072578030251861 ], [ -90.595369025260311, 14.071131090327526 ], [ -90.598417934739871, 14.069684150403191 ], [ -90.609580043883909, 14.068030504004525 ], [ -90.620845506714772, 14.065136624155855 ], [ -90.625031297756152, 14.060847480326913 ], [ -90.627124192827239, 14.055886542030294 ], [ -90.627434252089017, 13.931708074767812 ], [ -90.627334706133965, 13.920671995960658 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-SR", "NAME_1": "Santa Rosa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -90.240563423844662, 13.788715510162957 ], [ -90.245553207999933, 13.79072571100005 ], [ -90.401159453999924, 13.858588018000091 ], [ -90.500208785999916, 13.894699659000082 ], [ -90.580412887999898, 13.913267343000086 ], [ -90.627334706133965, 13.920671995960658 ], [ -90.627434252089017, 13.931708074767812 ], [ -90.627124192827239, 14.055886542030294 ], [ -90.625031297756152, 14.060847480326913 ], [ -90.620845506714772, 14.065136624155855 ], [ -90.609580043883909, 14.068030504004525 ], [ -90.598417934739871, 14.069684150403191 ], [ -90.595369025260311, 14.071131090327526 ], [ -90.592991910248429, 14.072578030251861 ], [ -90.589968838291213, 14.08239655225907 ], [ -90.582449916930102, 14.096452542151098 ], [ -90.577437302689361, 14.10131012586163 ], [ -90.564208136895957, 14.108854884745142 ], [ -90.560435757004541, 14.112058823855648 ], [ -90.557438524368365, 14.116037909322017 ], [ -90.55617245159732, 14.118208320557528 ], [ -90.55656002522494, 14.121463934712779 ], [ -90.55849789066508, 14.125598048910831 ], [ -90.572941454184729, 14.138723862815993 ], [ -90.574801805259085, 14.14079092036468 ], [ -90.578393317097891, 14.147353827317261 ], [ -90.57854834672878, 14.161254788477663 ], [ -90.571856248566974, 14.16430369705796 ], [ -90.553356086114491, 14.167094224119126 ], [ -90.550772263728959, 14.168179429736881 ], [ -90.544338548884923, 14.172210191147371 ], [ -90.528086311134359, 14.187093004238761 ], [ -90.51570980516334, 14.202544257211684 ], [ -90.51630408436597, 14.205438137060355 ], [ -90.518784553064677, 14.20879710490243 ], [ -90.527466192610689, 14.212931219999803 ], [ -90.532013718858025, 14.213758043199107 ], [ -90.535889452436265, 14.213447983937272 ], [ -90.551392382252629, 14.207866929814941 ], [ -90.554337938045364, 14.207350164978095 ], [ -90.560745816266376, 14.207143460302461 ], [ -90.567205370431509, 14.207556871452425 ], [ -90.580744594587372, 14.210089016095196 ], [ -90.584930385628752, 14.211380927287962 ], [ -90.587204148752448, 14.212414456062277 ], [ -90.588651088676784, 14.215515042385277 ], [ -90.588831956729393, 14.220320950151688 ], [ -90.585705532883992, 14.231121324089827 ], [ -90.579659389868937, 14.24238678602137 ], [ -90.564931607307813, 14.256236070338389 ], [ -90.53635454042967, 14.266209621976486 ], [ -90.528628912594229, 14.271325588105412 ], [ -90.509663662148284, 14.288430488376321 ], [ -90.490336677395703, 14.297370510340784 ], [ -90.482430183306292, 14.300264391088774 ], [ -90.476564908343846, 14.301504625438099 ], [ -90.474006924380035, 14.302434801424909 ], [ -90.47217241082808, 14.303675034874971 ], [ -90.463878343111048, 14.313493556882122 ], [ -90.460777757687367, 14.316077379267597 ], [ -90.457651332942646, 14.317937730341953 ], [ -90.454964158668986, 14.318867906328819 ], [ -90.452638718701905, 14.320004787890639 ], [ -90.450571662052539, 14.321451727814974 ], [ -90.448762986922304, 14.323053697370199 ], [ -90.443827887946668, 14.328583075548465 ], [ -90.442406786443996, 14.34103709588527 ], [ -90.447755296569653, 14.387907620540261 ], [ -90.429384325326339, 14.433486233103167 ], [ -90.388275722846288, 14.496531480243618 ], [ -90.371300014683925, 14.50407623912713 ], [ -90.367217577329313, 14.50448965117647 ], [ -90.359646980024081, 14.502474270471168 ], [ -90.356985643272822, 14.499787096197508 ], [ -90.355073615355025, 14.496789863561332 ], [ -90.353549161064905, 14.484749254374549 ], [ -90.352670661022159, 14.482165431989074 ], [ -90.351533780359659, 14.479995022552259 ], [ -90.34980261869589, 14.478134670578584 ], [ -90.345306770191257, 14.479271552140403 ], [ -90.338743863238676, 14.483198960763389 ], [ -90.319701096628307, 14.500097154560024 ], [ -90.31414588092764, 14.505936591100806 ], [ -90.305955165998114, 14.508830470949476 ], [ -90.297144335242876, 14.508830470949476 ], [ -90.285207078843598, 14.514308173183622 ], [ -90.27270138166341, 14.50138906485347 ], [ -90.270686000958165, 14.498701891479072 ], [ -90.266810269178563, 14.495911363518587 ], [ -90.264639858842372, 14.494774481956767 ], [ -90.25076473700301, 14.496531480243618 ], [ -90.237948980560986, 14.498908596154763 ], [ -90.12800737214252, 14.519062405005968 ], [ -90.122891405114217, 14.495497952368567 ], [ -90.113977219772835, 14.481752020839053 ], [ -90.078294643582922, 14.453123277117527 ], [ -90.051887987040971, 14.433486233103167 ], [ -90.069948899921769, 14.378450832839633 ], [ -90.083953212970357, 14.376900540127792 ], [ -90.080930141912518, 14.357935288782528 ], [ -90.082015346630897, 14.354834703358847 ], [ -90.084263272232192, 14.353852851427916 ], [ -90.089301723995334, 14.355558172871383 ], [ -90.094107631761801, 14.357883612838464 ], [ -90.105166389017597, 14.358452052720054 ], [ -90.139970466064142, 14.351785793879287 ], [ -90.142166713922677, 14.350132148379942 ], [ -90.155473395880506, 14.338918362392519 ], [ -90.191052619282914, 14.252928779339697 ], [ -90.176634895084305, 14.24274852122727 ], [ -90.130255296844439, 14.229984443427327 ], [ -90.124519213091219, 14.22771068030363 ], [ -90.120643480412298, 14.224713446768135 ], [ -90.113770515097201, 14.217840481453038 ], [ -90.082712978621032, 14.192932440779487 ], [ -90.058295865261982, 14.169729723348041 ], [ -90.053464118174475, 14.159756170810624 ], [ -90.05493689741985, 14.137845364571888 ], [ -90.05033769432913, 14.098157864493828 ], [ -90.050466884638979, 14.095108954114949 ], [ -90.051526251835014, 14.089269517574166 ], [ -90.054394294161341, 14.080742905860404 ], [ -90.059665289921156, 14.069580796716366 ], [ -90.077054410132916, 14.045447903298111 ], [ -90.082738817042753, 14.039350084338935 ], [ -90.085064257009833, 14.038471585195509 ], [ -90.098525966799912, 14.035991116496803 ], [ -90.110023972728129, 14.032787177386297 ], [ -90.115682543014941, 14.029531562331726 ], [ -90.119170702066242, 14.026999416789636 ], [ -90.125449388178708, 14.015837306746278 ], [ -90.141055670782578, 13.987311916711576 ], [ -90.15668779180811, 13.976769924292569 ], [ -90.159943406862737, 13.976201484410979 ], [ -90.164129197904117, 13.975943101093208 ], [ -90.174102748642895, 13.979818833772129 ], [ -90.213402675992711, 13.989068914998427 ], [ -90.218518643020957, 13.991032619759608 ], [ -90.237871467094521, 14.006897283882552 ], [ -90.265957607557539, 14.022710272960694 ], [ -90.284121874125162, 14.017749335563394 ], [ -90.29024553060674, 14.013253486159442 ], [ -90.291692471430395, 14.009739487787101 ], [ -90.292855191413935, 14.004003404033881 ], [ -90.292648484939605, 13.998784085117393 ], [ -90.29200252979291, 13.995166733957603 ], [ -90.28854020916333, 13.987932034335927 ], [ -90.285258754787662, 13.98390127202606 ], [ -90.280246141446241, 13.978785304997814 ], [ -90.278644171891017, 13.974702866743883 ], [ -90.271409471369964, 13.933413398009918 ], [ -90.27022091296476, 13.931036282098717 ], [ -90.268567268364734, 13.929227606968482 ], [ -90.266500209916728, 13.927780667044146 ], [ -90.261461758153587, 13.925455227077066 ], [ -90.258516202360852, 13.92070099525472 ], [ -90.255131395197736, 13.912691148377803 ], [ -90.245442064399754, 13.877757880122033 ], [ -90.232548793591945, 13.855020249784673 ], [ -90.230817633726815, 13.849955960499187 ], [ -90.23012000173668, 13.84515005093408 ], [ -90.2305075753643, 13.82721832926245 ], [ -90.236992967051776, 13.802310289488275 ], [ -90.240563423844662, 13.788715510162957 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-CM", "NAME_1": "Chimaltenango" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -90.765229457873147, 14.777909654207178 ], [ -90.780861578898737, 14.750262763315845 ], [ -90.783781298068448, 14.737705390191593 ], [ -90.778226080569141, 14.708818264051615 ], [ -90.77491878867113, 14.699309801306242 ], [ -90.771818203247449, 14.681533108366239 ], [ -90.771559820829054, 14.675435289407062 ], [ -90.77186988009089, 14.67093943910379 ], [ -90.77473792241716, 14.666030178549875 ], [ -90.780784063633632, 14.658692125241373 ], [ -90.794090745591404, 14.630683499144141 ], [ -90.819308844627471, 14.612906806204137 ], [ -90.864396531674572, 14.56422760731823 ], [ -90.886074794815897, 14.523713284040809 ], [ -90.891474981784938, 14.496221421881103 ], [ -90.890854865059964, 14.490433661284442 ], [ -90.890544806697449, 14.489296779722565 ], [ -90.91718400813545, 14.468729559721396 ], [ -90.938087124021536, 14.449402574069495 ], [ -90.945037604601737, 14.440927639199174 ], [ -90.946355354216223, 14.438343817713019 ], [ -90.952220629178669, 14.423822739827585 ], [ -90.971340909255559, 14.386253974141596 ], [ -90.978472256089731, 14.38284332945608 ], [ -90.981236944729176, 14.385633857416565 ], [ -90.982813076762056, 14.388321030790905 ], [ -90.983433194386407, 14.391628322688916 ], [ -90.983510707852872, 14.399741523252658 ], [ -90.985577766300878, 14.415916245738117 ], [ -90.988058234100208, 14.419843655260479 ], [ -90.990693732429804, 14.42160065444665 ], [ -90.993251716393559, 14.420877183135474 ], [ -90.997024095385655, 14.417879950499298 ], [ -91.002140062413957, 14.412298896376967 ], [ -91.004930590374443, 14.410593573134861 ], [ -91.008651293422417, 14.409353338785536 ], [ -91.015989345831599, 14.408733222060562 ], [ -91.021389532800697, 14.411058661128266 ], [ -91.027306484606584, 14.414986069751308 ], [ -91.037176682557856, 14.423564358308454 ], [ -91.042421840795271, 14.42676829741896 ], [ -91.046866014255158, 14.428421942918305 ], [ -91.049889086212318, 14.428008530868965 ], [ -91.052757127639325, 14.427233385412364 ], [ -91.055237596337975, 14.426251532582171 ], [ -91.068518438974763, 14.418810126486107 ], [ -91.072084113291169, 14.417466539349277 ], [ -91.076657477960225, 14.416226304999952 ], [ -91.085700852712137, 14.415296129013143 ], [ -91.090196703015408, 14.415916245738117 ], [ -91.094899257994371, 14.418138332917692 ], [ -91.097405565114741, 14.420412096041389 ], [ -91.111332363797544, 14.430437322724231 ], [ -91.09717302111801, 14.46764435500296 ], [ -91.09717302111801, 14.480718492064739 ], [ -91.095390184409439, 14.503197739983705 ], [ -91.097224697961451, 14.512964586046792 ], [ -91.100790371378537, 14.517563788238249 ], [ -91.107198248700172, 14.524281724821719 ], [ -91.11414872928043, 14.530431219725017 ], [ -91.105802984719958, 14.610116279142972 ], [ -91.105725471253493, 14.632440497430991 ], [ -91.102728237717997, 14.641638901813849 ], [ -91.09466671399764, 14.652645982226261 ], [ -91.074099493996414, 14.700446681968799 ], [ -91.07616655064578, 14.721892402012713 ], [ -91.07539140518918, 14.725406399485735 ], [ -91.068828498236599, 14.744836737925084 ], [ -91.084951544777937, 14.819819241464813 ], [ -91.087432014375963, 14.82627879473057 ], [ -91.060766975415561, 14.838939521541647 ], [ -91.05345475873014, 14.844933986813999 ], [ -91.030897997344709, 14.906583970873555 ], [ -91.024593471911203, 14.916557522511653 ], [ -91.022578091205901, 14.918262843955063 ], [ -91.020717740131602, 14.919554755147828 ], [ -91.010950894068515, 14.92420563418267 ], [ -90.99387183311859, 14.928649806743181 ], [ -90.977154507374621, 14.938623359280598 ], [ -90.95896440328454, 14.935264391438523 ], [ -90.893955451382965, 14.936814683251043 ], [ -90.882199063036296, 14.939295151949693 ], [ -90.868375617140998, 14.941568915073333 ], [ -90.852898525746355, 14.941878974335168 ], [ -90.805123664425537, 14.92823639649248 ], [ -90.753602260735704, 14.92823639649248 ], [ -90.736704067838446, 14.92596263336884 ], [ -90.707274340238598, 14.916195787305753 ], [ -90.671385056675035, 14.908909409941316 ], [ -90.657613287623121, 14.903948473443279 ], [ -90.660248785952717, 14.888497219571036 ], [ -90.660791389211226, 14.886016750872329 ], [ -90.661850756407262, 14.883071194180275 ], [ -90.663090989857267, 14.880745754213194 ], [ -90.664977180252663, 14.878006903995413 ], [ -90.668491176826308, 14.875009670459917 ], [ -90.672987027129579, 14.871909085036236 ], [ -90.684045782586793, 14.86829173387639 ], [ -90.688877529674244, 14.865501206815225 ], [ -90.704096238650493, 14.853925686521222 ], [ -90.709005500103729, 14.851961981760041 ], [ -90.712984584670835, 14.851548569710701 ], [ -90.715490891791205, 14.852582099384392 ], [ -90.718410610960916, 14.852788804959346 ], [ -90.721046109290512, 14.852375392910062 ], [ -90.723423225201657, 14.851290188191626 ], [ -90.727609016243093, 14.84844798428702 ], [ -90.731820644806874, 14.844882309970615 ], [ -90.737634243825255, 14.835115464806847 ], [ -90.746910162573954, 14.805143133948434 ], [ -90.765229457873147, 14.777909654207178 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-SA", "NAME_1": "Sacatepéquez" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -90.890544806697449, 14.489296779722565 ], [ -90.890854865059964, 14.490433661284442 ], [ -90.891474981784938, 14.496221421881103 ], [ -90.886074794815897, 14.523713284040809 ], [ -90.864396531674572, 14.56422760731823 ], [ -90.819308844627471, 14.612906806204137 ], [ -90.794090745591404, 14.630683499144141 ], [ -90.780784063633632, 14.658692125241373 ], [ -90.77473792241716, 14.666030178549875 ], [ -90.77186988009089, 14.67093943910379 ], [ -90.771559820829054, 14.675435289407062 ], [ -90.771818203247449, 14.681533108366239 ], [ -90.77491878867113, 14.699309801306242 ], [ -90.778226080569141, 14.708818264051615 ], [ -90.783781298068448, 14.737705390191593 ], [ -90.780861578898737, 14.750262763315845 ], [ -90.765229457873147, 14.777909654207178 ], [ -90.741949226075917, 14.757394111049393 ], [ -90.728797573749034, 14.749849351266505 ], [ -90.719263271682621, 14.747782293717876 ], [ -90.709780647358969, 14.74747223625468 ], [ -90.697585007641976, 14.749487616060605 ], [ -90.694510260640016, 14.749435940116541 ], [ -90.691590542369624, 14.74881582339151 ], [ -90.681513637944022, 14.739514065321828 ], [ -90.651334602409975, 14.702048652423343 ], [ -90.642497932333697, 14.673419907802497 ], [ -90.629113736010083, 14.658485418767043 ], [ -90.619476081156222, 14.647581692041456 ], [ -90.618158332441055, 14.645307928917759 ], [ -90.617589890760826, 14.637814845978369 ], [ -90.623015917050907, 14.619573065944223 ], [ -90.621052212289726, 14.607894191963396 ], [ -90.629423794372599, 14.598747463524603 ], [ -90.63464311418835, 14.58655182470693 ], [ -90.641877813810027, 14.506246650362584 ], [ -90.650507779210614, 14.468729559721396 ], [ -90.714689907912884, 14.444028225522175 ], [ -90.725774501791818, 14.467282619797061 ], [ -90.727247281037194, 14.469453030133195 ], [ -90.731097175294394, 14.472140204406912 ], [ -90.737763435034481, 14.470176500545051 ], [ -90.742724372431837, 14.462735094449044 ], [ -90.748512133028498, 14.459324448864209 ], [ -90.763007371592892, 14.459324448864209 ], [ -90.77166317361656, 14.454621893885303 ], [ -90.773575202433619, 14.453278306748416 ], [ -90.77587480307966, 14.451159573255666 ], [ -90.780577358957942, 14.4452684598715 ], [ -90.785486620411177, 14.436431789795222 ], [ -90.787062750645418, 14.434416409089977 ], [ -90.793780687228889, 14.42697500209465 ], [ -90.82021318219256, 14.404909166225025 ], [ -90.824967414014907, 14.40806142849209 ], [ -90.83124610102675, 14.415089423438133 ], [ -90.843751797307561, 14.435191555445897 ], [ -90.851348233034514, 14.450901190837271 ], [ -90.85204586502465, 14.453691717898437 ], [ -90.853053555377244, 14.456120509753703 ], [ -90.861089239776561, 14.464492091836576 ], [ -90.890544806697449, 14.489296779722565 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-GU", "NAME_1": "Guatemala" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -90.709780647358969, 14.74747223625468 ], [ -90.719263271682621, 14.747782293717876 ], [ -90.728797573749034, 14.749849351266505 ], [ -90.741949226075917, 14.757394111049393 ], [ -90.765229457873147, 14.777909654207178 ], [ -90.746910162573954, 14.805143133948434 ], [ -90.737634243825255, 14.835115464806847 ], [ -90.731820644806874, 14.844882309970615 ], [ -90.727609016243093, 14.84844798428702 ], [ -90.723423225201657, 14.851290188191626 ], [ -90.721046109290512, 14.852375392910062 ], [ -90.718410610960916, 14.852788804959346 ], [ -90.715490891791205, 14.852582099384392 ], [ -90.712984584670835, 14.851548569710701 ], [ -90.709005500103729, 14.851961981760041 ], [ -90.704096238650493, 14.853925686521222 ], [ -90.688877529674244, 14.865501206815225 ], [ -90.684045782586793, 14.86829173387639 ], [ -90.672987027129579, 14.871909085036236 ], [ -90.668491176826308, 14.875009670459917 ], [ -90.664977180252663, 14.878006903995413 ], [ -90.663090989857267, 14.880745754213194 ], [ -90.661850756407262, 14.883071194180275 ], [ -90.660791389211226, 14.886016750872329 ], [ -90.660248785952717, 14.888497219571036 ], [ -90.657613287623121, 14.903948473443279 ], [ -90.621982388276592, 14.891339423475586 ], [ -90.607099576084579, 14.894078273693367 ], [ -90.599425625092522, 14.885810045297319 ], [ -90.59415462933265, 14.883536282173679 ], [ -90.589917162347149, 14.884828193366388 ], [ -90.585395473622214, 14.887256985221654 ], [ -90.579194301875532, 14.887256985221654 ], [ -90.563975592899283, 14.884931545254574 ], [ -90.538835008229, 14.889995836338755 ], [ -90.513384366095579, 14.898780829571592 ], [ -90.497235480233201, 14.907772529278816 ], [ -90.489794074137194, 14.907772529278816 ], [ -90.484988166370783, 14.898574123996639 ], [ -90.477495083431336, 14.894233303324256 ], [ -90.467805751734033, 14.893148097706501 ], [ -90.456281908283415, 14.894078273693367 ], [ -90.443052740691428, 14.897488919278203 ], [ -90.4390219801802, 14.902449855776183 ], [ -90.436619024948016, 14.90818594042878 ], [ -90.428350795652705, 14.913973700126121 ], [ -90.41207272037974, 14.917022610505057 ], [ -90.404295416600178, 14.910769761914992 ], [ -90.399928758405451, 14.899039211090724 ], [ -90.41225358843235, 14.877645168789513 ], [ -90.4147598946534, 14.875061347303301 ], [ -90.417602097658687, 14.870875556261922 ], [ -90.417602097658687, 14.86694814673956 ], [ -90.416594408205356, 14.861418769460613 ], [ -90.4151216298593, 14.858163154406043 ], [ -90.413338793150785, 14.855941067226468 ], [ -90.411452602755389, 14.854390774514627 ], [ -90.409333869262639, 14.853098863321861 ], [ -90.406750047776484, 14.852117011390931 ], [ -90.400574713552146, 14.851238512247505 ], [ -90.39429602743968, 14.851858628972536 ], [ -90.380240038446971, 14.855682684808016 ], [ -90.357399055322105, 14.857336331206682 ], [ -90.350138516379388, 14.854855862508032 ], [ -90.348588222768228, 14.852685452171841 ], [ -90.344014858998548, 14.843590400576488 ], [ -90.33494564492554, 14.818475654327983 ], [ -90.331147426612404, 14.794084376692638 ], [ -90.332594367436116, 14.785919501084095 ], [ -90.333860440207104, 14.784214178741365 ], [ -90.335281541709776, 14.782818914761094 ], [ -90.339363979963707, 14.777444566213717 ], [ -90.343394742273517, 14.770416572167051 ], [ -90.344634975723523, 14.765765693132209 ], [ -90.344273241416943, 14.761528225247389 ], [ -90.343317227008413, 14.759202786179628 ], [ -90.338847216026181, 14.750986232828382 ], [ -90.317866583975672, 14.729282131265336 ], [ -90.308487312439524, 14.72225413721867 ], [ -90.250247972166164, 14.701686917217444 ], [ -90.236708747110981, 14.695072333421422 ], [ -90.230662604995189, 14.690111396024065 ], [ -90.219733038948561, 14.677760728474823 ], [ -90.209087693742049, 14.674298406945923 ], [ -90.218182746236721, 14.651974189557166 ], [ -90.222833625271562, 14.644842840924355 ], [ -90.224771490711703, 14.643292548212514 ], [ -90.233298103324785, 14.637969876508578 ], [ -90.265802577926593, 14.611511542223866 ], [ -90.271616176944974, 14.587792059955575 ], [ -90.272081264938436, 14.572082424564201 ], [ -90.27466508732391, 14.563917548056395 ], [ -90.277093879179176, 14.559370021809059 ], [ -90.281021287802162, 14.556321113228762 ], [ -90.282726610144948, 14.550171617426201 ], [ -90.283579270866653, 14.545210680028845 ], [ -90.285207078843598, 14.514308173183622 ], [ -90.297144335242876, 14.508830470949476 ], [ -90.305955165998114, 14.508830470949476 ], [ -90.31414588092764, 14.505936591100806 ], [ -90.319701096628307, 14.500097154560024 ], [ -90.338743863238676, 14.483198960763389 ], [ -90.345306770191257, 14.479271552140403 ], [ -90.34980261869589, 14.478134670578584 ], [ -90.351533780359659, 14.479995022552259 ], [ -90.352670661022159, 14.482165431989074 ], [ -90.353549161064905, 14.484749254374549 ], [ -90.355073615355025, 14.496789863561332 ], [ -90.356985643272822, 14.499787096197508 ], [ -90.359646980024081, 14.502474270471168 ], [ -90.367217577329313, 14.50448965117647 ], [ -90.371300014683925, 14.50407623912713 ], [ -90.388275722846288, 14.496531480243618 ], [ -90.429384325326339, 14.433486233103167 ], [ -90.447755296569653, 14.387907620540261 ], [ -90.442406786443996, 14.34103709588527 ], [ -90.443827887946668, 14.328583075548465 ], [ -90.448762986922304, 14.323053697370199 ], [ -90.450571662052539, 14.321451727814974 ], [ -90.452638718701905, 14.320004787890639 ], [ -90.454964158668986, 14.318867906328819 ], [ -90.457651332942646, 14.317937730341953 ], [ -90.460777757687367, 14.316077379267597 ], [ -90.463878343111048, 14.313493556882122 ], [ -90.47217241082808, 14.303675034874971 ], [ -90.474006924380035, 14.302434801424909 ], [ -90.476564908343846, 14.301504625438099 ], [ -90.482430183306292, 14.300264391088774 ], [ -90.490336677395703, 14.297370510340784 ], [ -90.509663662148284, 14.288430488376321 ], [ -90.528628912594229, 14.271325588105412 ], [ -90.53635454042967, 14.266209621976486 ], [ -90.564931607307813, 14.256236070338389 ], [ -90.571029426266989, 14.277888495057994 ], [ -90.583173387341958, 14.305328681273579 ], [ -90.586325649609023, 14.317265936773538 ], [ -90.585550503253103, 14.350390529899016 ], [ -90.592165087049125, 14.401808579902024 ], [ -90.596350878090561, 14.415089423438133 ], [ -90.598831345889892, 14.416122952212447 ], [ -90.601828579425387, 14.416536363362468 ], [ -90.61479936369966, 14.416226304999952 ], [ -90.623015917050907, 14.418913479273613 ], [ -90.637743699612031, 14.431522529241306 ], [ -90.650507779210614, 14.468729559721396 ], [ -90.641877813810027, 14.506246650362584 ], [ -90.63464311418835, 14.58655182470693 ], [ -90.629423794372599, 14.598747463524603 ], [ -90.621052212289726, 14.607894191963396 ], [ -90.623015917050907, 14.619573065944223 ], [ -90.617589890760826, 14.637814845978369 ], [ -90.618158332441055, 14.645307928917759 ], [ -90.619476081156222, 14.647581692041456 ], [ -90.629113736010083, 14.658485418767043 ], [ -90.642497932333697, 14.673419907802497 ], [ -90.651334602409975, 14.702048652423343 ], [ -90.681513637944022, 14.739514065321828 ], [ -90.691590542369624, 14.74881582339151 ], [ -90.694510260640016, 14.749435940116541 ], [ -90.697585007641976, 14.749487616060605 ], [ -90.709780647358969, 14.74747223625468 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-JA", "NAME_1": "Jalapa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -90.285207078843598, 14.514308173183622 ], [ -90.283579270866653, 14.545210680028845 ], [ -90.282726610144948, 14.550171617426201 ], [ -90.281021287802162, 14.556321113228762 ], [ -90.277093879179176, 14.559370021809059 ], [ -90.27466508732391, 14.563917548056395 ], [ -90.272081264938436, 14.572082424564201 ], [ -90.271616176944974, 14.587792059955575 ], [ -90.265802577926593, 14.611511542223866 ], [ -90.233298103324785, 14.637969876508578 ], [ -90.224771490711703, 14.643292548212514 ], [ -90.222833625271562, 14.644842840924355 ], [ -90.218182746236721, 14.651974189557166 ], [ -90.209087693742049, 14.674298406945923 ], [ -90.207304857033535, 14.674970201413657 ], [ -90.200251023665771, 14.677915758105712 ], [ -90.184231329911938, 14.686855780070175 ], [ -90.180355598132337, 14.697552802120128 ], [ -90.179296230936302, 14.704064032229269 ], [ -90.177513394227731, 14.706957912977259 ], [ -90.173534308761305, 14.709438380776646 ], [ -90.147179328163475, 14.719256904582494 ], [ -90.11351213267875, 14.730263984095586 ], [ -90.098370938068342, 14.728455308065975 ], [ -90.086123623306548, 14.722615872424569 ], [ -90.078139614851352, 14.720083725983159 ], [ -90.073462897394791, 14.722357489106798 ], [ -90.069716355925095, 14.72628489772984 ], [ -90.038555466661421, 14.782612210085404 ], [ -90.015430263595761, 14.789330145769611 ], [ -89.981763068111093, 14.793154202504411 ], [ -89.951584031677726, 14.80395457644255 ], [ -89.922412685596953, 14.819302475728648 ], [ -89.887505255762903, 14.861883857454018 ], [ -89.87396603070772, 14.873769436110592 ], [ -89.868333299741948, 14.875939846446727 ], [ -89.862519700723567, 14.877128403952668 ], [ -89.849626430815135, 14.877645168789513 ], [ -89.833994309789546, 14.876508287227637 ], [ -89.841719936725667, 14.859816799006069 ], [ -89.838851895298717, 14.856199448745542 ], [ -89.83290910507111, 14.84596751648769 ], [ -89.823633186322468, 14.833203436889107 ], [ -89.8076910060351, 14.803592841236593 ], [ -89.799448615161452, 14.79217235057348 ], [ -89.793660854564791, 14.785712795509085 ], [ -89.790431077931885, 14.785299384359064 ], [ -89.763636847762314, 14.785299384359064 ], [ -89.747720506795929, 14.782922268447919 ], [ -89.73635169117756, 14.779873358968302 ], [ -89.6889644025851, 14.782250474879504 ], [ -89.676045295154211, 14.778633123719658 ], [ -89.67082597533846, 14.77057160089862 ], [ -89.66700191860366, 14.759874578848724 ], [ -89.664986537898415, 14.748350735398105 ], [ -89.665089890685863, 14.745146796287599 ], [ -89.667182786656269, 14.733054511156752 ], [ -89.668035448277294, 14.730212307252145 ], [ -89.668629726580605, 14.72726675145941 ], [ -89.66893978584244, 14.721323961231803 ], [ -89.6677770658589, 14.715742906210153 ], [ -89.664133877176653, 14.707423000970721 ], [ -89.660232306975388, 14.695692450146453 ], [ -89.696044074374527, 14.598954169099613 ], [ -89.699609747791612, 14.577611802742467 ], [ -89.696173264684376, 14.577146714749063 ], [ -89.685502081955519, 14.577611802742467 ], [ -89.677853970284502, 14.555235906711687 ], [ -89.677698940653556, 14.545417384704535 ], [ -89.678396572643692, 14.542213447392669 ], [ -89.699971482997512, 14.52986277894405 ], [ -89.762344936569548, 14.500458888866604 ], [ -89.764360318174113, 14.50138906485347 ], [ -89.775393236108926, 14.509863999723791 ], [ -89.782059495849012, 14.516426907575692 ], [ -89.785289273381238, 14.520302639355293 ], [ -89.789087490795055, 14.523403224778974 ], [ -89.796244676050947, 14.52469513597174 ], [ -89.815726691333737, 14.519475816155989 ], [ -89.83213395871519, 14.508727118161971 ], [ -89.851280077213801, 14.496428127456113 ], [ -89.87164059074064, 14.482940579244314 ], [ -89.880012172823513, 14.47089997005753 ], [ -89.885257331060984, 14.436483465739343 ], [ -89.929828254170559, 14.470589910795752 ], [ -89.932877162750856, 14.471933498831902 ], [ -89.9356160138679, 14.472863673919392 ], [ -89.938561570560012, 14.473483792443062 ], [ -89.942592332869822, 14.473793849906258 ], [ -89.947088182273774, 14.473483792443062 ], [ -89.953986986010591, 14.472140204406912 ], [ -89.957785204323727, 14.470796617270082 ], [ -89.960653245750677, 14.469298001401626 ], [ -89.964761522426329, 14.464905503885859 ], [ -89.988558519060405, 14.434313056302472 ], [ -90.051887987040971, 14.433486233103167 ], [ -90.078294643582922, 14.453123277117527 ], [ -90.113977219772835, 14.481752020839053 ], [ -90.122891405114217, 14.495497952368567 ], [ -90.12800737214252, 14.519062405005968 ], [ -90.237948980560986, 14.498908596154763 ], [ -90.25076473700301, 14.496531480243618 ], [ -90.264639858842372, 14.494774481956767 ], [ -90.266810269178563, 14.495911363518587 ], [ -90.270686000958165, 14.498701891479072 ], [ -90.27270138166341, 14.50138906485347 ], [ -90.285207078843598, 14.514308173183622 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-PR", "NAME_1": "El Progreso" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -90.400574713552146, 14.851238512247505 ], [ -90.406750047776484, 14.852117011390931 ], [ -90.409333869262639, 14.853098863321861 ], [ -90.411452602755389, 14.854390774514627 ], [ -90.413338793150785, 14.855941067226468 ], [ -90.4151216298593, 14.858163154406043 ], [ -90.416594408205356, 14.861418769460613 ], [ -90.417602097658687, 14.86694814673956 ], [ -90.417602097658687, 14.870875556261922 ], [ -90.4147598946534, 14.875061347303301 ], [ -90.41225358843235, 14.877645168789513 ], [ -90.399928758405451, 14.899039211090724 ], [ -90.387371385281199, 14.887256985221654 ], [ -90.354298468999104, 14.881520901468434 ], [ -90.303397182933622, 14.889582424289415 ], [ -90.298436244636946, 14.905653794886689 ], [ -90.282571581413322, 14.954488023403542 ], [ -90.123873257045148, 15.061251532032543 ], [ -90.038452114773236, 15.116752021188802 ], [ -89.999953173100437, 15.142073473012374 ], [ -89.97300391329992, 15.156542874054367 ], [ -89.923833787998888, 15.151065171820221 ], [ -89.907193976620704, 15.152408758957051 ], [ -89.877996792118267, 15.159850165053058 ], [ -89.841048143157252, 15.108483791893491 ], [ -89.796554735312782, 15.043268134416849 ], [ -89.795572883381851, 15.029832262149171 ], [ -89.843942023005923, 15.02885040931892 ], [ -89.848696254828269, 15.02823029169457 ], [ -89.852727017138136, 15.026679998982729 ], [ -89.85179684115127, 15.022752590359744 ], [ -89.849083827556569, 15.017998359436717 ], [ -89.805107185448207, 14.959242255225888 ], [ -89.797123176093692, 14.948235174813476 ], [ -89.784927538175339, 14.941982327122673 ], [ -89.772111782632635, 14.940225327936503 ], [ -89.767047492447773, 14.937228095300327 ], [ -89.764567022849803, 14.934024156189821 ], [ -89.766685757241873, 14.914283759387956 ], [ -89.768675300424775, 14.90952952756561 ], [ -89.772680223413545, 14.907875881166945 ], [ -89.777563646445117, 14.90704905796764 ], [ -89.799009365589711, 14.906428941242609 ], [ -89.811592577135684, 14.901054591795969 ], [ -89.833994309789546, 14.876508287227637 ], [ -89.849626430815135, 14.877645168789513 ], [ -89.862519700723567, 14.877128403952668 ], [ -89.868333299741948, 14.875939846446727 ], [ -89.87396603070772, 14.873769436110592 ], [ -89.887505255762903, 14.861883857454018 ], [ -89.922412685596953, 14.819302475728648 ], [ -89.951584031677726, 14.80395457644255 ], [ -89.981763068111093, 14.793154202504411 ], [ -90.015430263595761, 14.789330145769611 ], [ -90.038555466661421, 14.782612210085404 ], [ -90.069716355925095, 14.72628489772984 ], [ -90.073462897394791, 14.722357489106798 ], [ -90.078139614851352, 14.720083725983159 ], [ -90.086123623306548, 14.722615872424569 ], [ -90.098370938068342, 14.728455308065975 ], [ -90.11351213267875, 14.730263984095586 ], [ -90.147179328163475, 14.719256904582494 ], [ -90.173534308761305, 14.709438380776646 ], [ -90.177513394227731, 14.706957912977259 ], [ -90.179296230936302, 14.704064032229269 ], [ -90.180355598132337, 14.697552802120128 ], [ -90.184231329911938, 14.686855780070175 ], [ -90.200251023665771, 14.677915758105712 ], [ -90.207304857033535, 14.674970201413657 ], [ -90.209087693742049, 14.674298406945923 ], [ -90.219733038948561, 14.677760728474823 ], [ -90.230662604995189, 14.690111396024065 ], [ -90.236708747110981, 14.695072333421422 ], [ -90.250247972166164, 14.701686917217444 ], [ -90.308487312439524, 14.72225413721867 ], [ -90.317866583975672, 14.729282131265336 ], [ -90.338847216026181, 14.750986232828382 ], [ -90.343317227008413, 14.759202786179628 ], [ -90.344273241416943, 14.761528225247389 ], [ -90.344634975723523, 14.765765693132209 ], [ -90.343394742273517, 14.770416572167051 ], [ -90.339363979963707, 14.777444566213717 ], [ -90.335281541709776, 14.782818914761094 ], [ -90.333860440207104, 14.784214178741365 ], [ -90.332594367436116, 14.785919501084095 ], [ -90.331147426612404, 14.794084376692638 ], [ -90.33494564492554, 14.818475654327983 ], [ -90.344014858998548, 14.843590400576488 ], [ -90.348588222768228, 14.852685452171841 ], [ -90.350138516379388, 14.854855862508032 ], [ -90.357399055322105, 14.857336331206682 ], [ -90.380240038446971, 14.855682684808016 ], [ -90.39429602743968, 14.851858628972536 ], [ -90.400574713552146, 14.851238512247505 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-SO", "NAME_1": "Sololá" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -91.087432014375963, 14.82627879473057 ], [ -91.084951544777937, 14.819819241464813 ], [ -91.068828498236599, 14.744836737925084 ], [ -91.07539140518918, 14.725406399485735 ], [ -91.07616655064578, 14.721892402012713 ], [ -91.074099493996414, 14.700446681968799 ], [ -91.09466671399764, 14.652645982226261 ], [ -91.102728237717997, 14.641638901813849 ], [ -91.105725471253493, 14.632440497430991 ], [ -91.105802984719958, 14.610116279142972 ], [ -91.11414872928043, 14.530431219725017 ], [ -91.153112758946634, 14.559473375495884 ], [ -91.166393601583422, 14.567586575160306 ], [ -91.176082933280725, 14.571048895789886 ], [ -91.18194820824317, 14.572134101407642 ], [ -91.192257656665504, 14.572392482926716 ], [ -91.201068488320061, 14.571255601364896 ], [ -91.228818731998842, 14.557096258685362 ], [ -91.251375495182913, 14.553943997317617 ], [ -91.254191860665799, 14.555390937241953 ], [ -91.257189094201294, 14.557406317947198 ], [ -91.257654182194756, 14.560300197795868 ], [ -91.257628342873716, 14.563297431331364 ], [ -91.25522538944017, 14.574614570106291 ], [ -91.254863654234214, 14.577663478686588 ], [ -91.255173712596729, 14.58691355991283 ], [ -91.256724006207889, 14.595078437320012 ], [ -91.258584357282245, 14.599264228361449 ], [ -91.263131882630262, 14.604535224121264 ], [ -91.292199876822849, 14.629546617582321 ], [ -91.302586839610967, 14.640502021151349 ], [ -91.305532396303022, 14.641328844350653 ], [ -91.309278937772717, 14.641948961075684 ], [ -91.320596075648382, 14.639520169220418 ], [ -91.342971970779786, 14.637608141302678 ], [ -91.343824633300187, 14.638176581184268 ], [ -91.355219286440899, 14.651250719145366 ], [ -91.370102097733593, 14.658072008516342 ], [ -91.377879400613836, 14.658795478028878 ], [ -91.383977219573012, 14.656831773267697 ], [ -91.387465380422952, 14.654971422193341 ], [ -91.392322964133484, 14.651664130295387 ], [ -91.395061815250529, 14.64897695602167 ], [ -91.396612107962369, 14.646238104904626 ], [ -91.397542283949235, 14.643395901000019 ], [ -91.39780066636763, 14.640502021151349 ], [ -91.397077195955831, 14.627892971183655 ], [ -91.397981534420239, 14.620193183568574 ], [ -91.402994146862397, 14.606498927983125 ], [ -91.41632666724189, 14.610116279142972 ], [ -91.461879442282395, 14.616214098102148 ], [ -91.476607224843519, 14.629856675944836 ], [ -91.452887742575228, 14.673988349482727 ], [ -91.448133510752882, 14.688044338475436 ], [ -91.448417730693677, 14.691454983160952 ], [ -91.449528774733153, 14.696932685395097 ], [ -91.4619827950699, 14.729127102533766 ], [ -91.464824998974507, 14.733777981568608 ], [ -91.469682582685039, 14.739565741265949 ], [ -91.440485399081865, 14.778478094988088 ], [ -91.428289761163512, 14.817648831128622 ], [ -91.424414029383911, 14.821059474914819 ], [ -91.37870622381314, 14.858783271131017 ], [ -91.369972907423744, 14.861677150979745 ], [ -91.358139003811971, 14.863279120534969 ], [ -91.335091315112095, 14.859868475849453 ], [ -91.325918749150958, 14.857336331206682 ], [ -91.320208502920082, 14.854855862508032 ], [ -91.313051316764813, 14.854029039308728 ], [ -91.292458259241243, 14.862607326966554 ], [ -91.27868649018933, 14.862607326966554 ], [ -91.271658495243344, 14.861367091717909 ], [ -91.255742154276959, 14.856251126488303 ], [ -91.252641567953958, 14.855837714438962 ], [ -91.246104499423097, 14.855682684808016 ], [ -91.240652634711296, 14.856716213582388 ], [ -91.229619716776483, 14.860023505480399 ], [ -91.215847947724569, 14.873252672173066 ], [ -91.202567105087837, 14.891752835524926 ], [ -91.182981737017542, 14.910666409127487 ], [ -91.170786099099189, 14.9051370300499 ], [ -91.165721808914327, 14.89180451146899 ], [ -91.156265022113075, 14.875319728822433 ], [ -91.150089687888794, 14.870875556261922 ], [ -91.147221645562468, 14.870358792324396 ], [ -91.144482795344686, 14.870255439536891 ], [ -91.14014197467236, 14.869531969125035 ], [ -91.134690110859935, 14.868136705144821 ], [ -91.123062913722492, 14.863847561315879 ], [ -91.11854122589682, 14.860540269417868 ], [ -91.116680873923201, 14.857336331206682 ], [ -91.117249314704111, 14.854855862508032 ], [ -91.11988481303365, 14.850101629786366 ], [ -91.122830369725762, 14.84596751648769 ], [ -91.131150274965194, 14.837079169568028 ], [ -91.132442186157959, 14.834908759231837 ], [ -91.133294846879664, 14.830981349709532 ], [ -91.133294846879664, 14.825607001162155 ], [ -91.13187374537705, 14.814858303168137 ], [ -91.129755011884299, 14.810207424133296 ], [ -91.127093675132983, 14.80741689707213 ], [ -91.124148119340191, 14.807106837810295 ], [ -91.121125048282352, 14.80721019149712 ], [ -91.11854122589682, 14.808140367483929 ], [ -91.11647416924751, 14.809483953721497 ], [ -91.114949714058014, 14.811344305695116 ], [ -91.1135802876002, 14.813359687299737 ], [ -91.112443406937643, 14.815633450423377 ], [ -91.108541835837059, 14.829224351422681 ], [ -91.103916796123201, 14.832014879383166 ], [ -91.087432014375963, 14.82627879473057 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-QZ", "NAME_1": "Quezaltenango" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -91.428289761163512, 14.817648831128622 ], [ -91.440485399081865, 14.778478094988088 ], [ -91.469682582685039, 14.739565741265949 ], [ -91.510506965224238, 14.712952379148987 ], [ -91.526268276559676, 14.719463609258128 ], [ -91.538360561690524, 14.720445461189058 ], [ -91.544510056593822, 14.718585110114702 ], [ -91.564948086285142, 14.705200913791145 ], [ -91.570890875613372, 14.702358709886539 ], [ -91.57569678427916, 14.700860094018083 ], [ -91.57897823775545, 14.700963446805588 ], [ -91.584455939090276, 14.702255357099034 ], [ -91.590476243683668, 14.704374091491104 ], [ -91.60091488331517, 14.70700958892138 ], [ -91.604635586363202, 14.706699530558865 ], [ -91.607348599058582, 14.705614324941109 ], [ -91.610759243744099, 14.702100328367464 ], [ -91.616469489075655, 14.693522039810262 ], [ -91.61752885627169, 14.691351630373447 ], [ -91.622489793669047, 14.68447866505835 ], [ -91.630008715030158, 14.676468818181377 ], [ -91.633548550025523, 14.675228582932732 ], [ -91.636287401142624, 14.675228582932732 ], [ -91.642462735366905, 14.678639228517568 ], [ -91.648276332586647, 14.680292874016914 ], [ -91.651583625383978, 14.678845933193259 ], [ -91.653702358876728, 14.677347317324802 ], [ -91.656622077147119, 14.670681056685396 ], [ -91.666001349582586, 14.661999417139384 ], [ -91.673856166828614, 14.662412828289405 ], [ -91.679669765846995, 14.664118149732815 ], [ -91.692097947762079, 14.66634023691239 ], [ -91.697084723581099, 14.66882070651036 ], [ -91.699746060332416, 14.671611233571582 ], [ -91.69692969395021, 14.689129544093191 ], [ -91.682615323438426, 14.722150784431165 ], [ -91.68109086824893, 14.734398098293582 ], [ -91.682227748911487, 14.736568507730453 ], [ -91.683933072153536, 14.738997301384359 ], [ -91.686620246427196, 14.739927476471848 ], [ -91.690056728635113, 14.740134182046859 ], [ -91.694320034941654, 14.739514065321828 ], [ -91.69731726757783, 14.738325506916624 ], [ -91.700056118694931, 14.736878566992232 ], [ -91.704293585680432, 14.734139715875187 ], [ -91.711709154254038, 14.727938544128506 ], [ -91.725248379309221, 14.713469143086456 ], [ -91.761034309186016, 14.696519273345757 ], [ -91.767726407347823, 14.686235663345144 ], [ -91.776408046893835, 14.658795478028878 ], [ -91.780903897197106, 14.649183660697361 ], [ -91.798835618868679, 14.623138739361309 ], [ -91.803253953906847, 14.614043686866637 ], [ -91.806716275435747, 14.604948635271285 ], [ -91.810230272009449, 14.59058258701674 ], [ -91.812555711976529, 14.5840713569076 ], [ -91.814777798256785, 14.579937241810228 ], [ -91.824596320263936, 14.56882680950963 ], [ -91.855783047049954, 14.523454902521735 ], [ -91.897460090310915, 14.514308173183622 ], [ -91.926657273914032, 14.511724350798147 ], [ -91.937948575166615, 14.513481349984318 ], [ -91.996730516000468, 14.537975979507848 ], [ -92.000942146362945, 14.539112861069668 ], [ -92.003345099796491, 14.538647773076264 ], [ -92.008538581190578, 14.536425685896688 ], [ -92.016625943332599, 14.530947984561806 ], [ -92.040474615910796, 14.599212551518008 ], [ -92.049543829983747, 14.616420802777839 ], [ -92.052153489891623, 14.617557685238978 ], [ -92.060680100706065, 14.619624741888288 ], [ -92.119797940122794, 14.625515855272511 ], [ -92.125094774304387, 14.626859443308661 ], [ -92.133698900383934, 14.630063381519847 ], [ -92.136773648285214, 14.633008938211901 ], [ -92.137962205791155, 14.635954494904013 ], [ -92.134086473112234, 14.642052313863189 ], [ -92.099669968793989, 14.680396225905099 ], [ -92.072436489952054, 14.701790269105629 ], [ -92.06075761597117, 14.707526352858906 ], [ -92.039311896826575, 14.711505439224652 ], [ -91.951487800221798, 14.736103419736992 ], [ -91.888830125809648, 14.729592190527171 ], [ -91.86074398534663, 14.728041896916011 ], [ -91.850667080021708, 14.72897207290282 ], [ -91.841933762732936, 14.732382716689017 ], [ -91.832141079147448, 14.738480536547513 ], [ -91.819221970817296, 14.761528225247389 ], [ -91.81679317896203, 14.7648355171454 ], [ -91.812245652714694, 14.7697964545427 ], [ -91.79906816286541, 14.779253241344009 ], [ -91.795347459817378, 14.782973945291303 ], [ -91.792944506383833, 14.786694648339335 ], [ -91.791885139187798, 14.789743556919575 ], [ -91.764961716909681, 14.845140693288329 ], [ -91.763308072309655, 14.847621161087716 ], [ -91.755763313426144, 14.860695299048814 ], [ -91.749148728730802, 14.898160711947298 ], [ -91.739976161870345, 14.910408026709035 ], [ -91.738322517270319, 14.919968167197169 ], [ -91.739045986782855, 14.926944485299714 ], [ -91.737728238067689, 14.931078600397086 ], [ -91.736488002819044, 14.933765773771427 ], [ -91.728529832785512, 14.938468328750332 ], [ -91.720778368327046, 14.941775621547663 ], [ -91.691607022246274, 14.96947418928238 ], [ -91.683390468895027, 14.980171210433014 ], [ -91.679669765846995, 14.990403144489505 ], [ -91.673287726947024, 15.033191229991246 ], [ -91.677370165200955, 15.0492625996892 ], [ -91.696412930012684, 15.064765530404884 ], [ -91.708376023934363, 15.092464098139601 ], [ -91.699125942708065, 15.122384752154574 ], [ -91.679850633000285, 15.149411526320876 ], [ -91.661660528910261, 15.168428452710884 ], [ -91.627011480595343, 15.195584418086412 ], [ -91.620681119438075, 15.201940619463983 ], [ -91.616107753869755, 15.220880032387583 ], [ -91.548902554109588, 15.204007677012669 ], [ -91.541357795226077, 15.198064886785062 ], [ -91.541719530431976, 15.188298040721975 ], [ -91.538412237634645, 15.178970445129949 ], [ -91.51882686956435, 15.155974433273457 ], [ -91.536319342563615, 15.15044505509519 ], [ -91.587479011047492, 15.131014715756521 ], [ -91.589701097327747, 15.129877835094021 ], [ -91.591871507663939, 15.12848257111375 ], [ -91.593886888369184, 15.120266017762503 ], [ -91.588770922240258, 15.091430569365286 ], [ -91.564147102406821, 15.000531724859172 ], [ -91.560219692884516, 14.985907294186291 ], [ -91.552726609945069, 14.976243800910652 ], [ -91.536035121723444, 14.961619371137033 ], [ -91.536293505041215, 14.949940497156206 ], [ -91.53833472416818, 14.944566147709509 ], [ -91.538412237634645, 14.938364975962884 ], [ -91.536500209716905, 14.931647040278676 ], [ -91.520609707172241, 14.913508613032036 ], [ -91.519343635300515, 14.911389879539286 ], [ -91.517819180111076, 14.9093228219906 ], [ -91.511075406005148, 14.907152410755145 ], [ -91.491645066666479, 14.9093228219906 ], [ -91.470483568361999, 14.910149644290641 ], [ -91.461879442282395, 14.890667629007851 ], [ -91.458856371224556, 14.860695299048814 ], [ -91.447978482021313, 14.850980128929791 ], [ -91.428289761163512, 14.817648831128622 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-BV", "NAME_1": "Baja Verapaz" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -90.399928758405451, 14.899039211090724 ], [ -90.404295416600178, 14.910769761914992 ], [ -90.41207272037974, 14.917022610505057 ], [ -90.428350795652705, 14.913973700126121 ], [ -90.436619024948016, 14.90818594042878 ], [ -90.4390219801802, 14.902449855776183 ], [ -90.443052740691428, 14.897488919278203 ], [ -90.456281908283415, 14.894078273693367 ], [ -90.467805751734033, 14.893148097706501 ], [ -90.477495083431336, 14.894233303324256 ], [ -90.484988166370783, 14.898574123996639 ], [ -90.489794074137194, 14.907772529278816 ], [ -90.497235480233201, 14.907772529278816 ], [ -90.513384366095579, 14.898780829571592 ], [ -90.538835008229, 14.889995836338755 ], [ -90.563975592899283, 14.884931545254574 ], [ -90.579194301875532, 14.887256985221654 ], [ -90.585395473622214, 14.887256985221654 ], [ -90.589917162347149, 14.884828193366388 ], [ -90.59415462933265, 14.883536282173679 ], [ -90.599425625092522, 14.885810045297319 ], [ -90.607099576084579, 14.894078273693367 ], [ -90.621982388276592, 14.891339423475586 ], [ -90.657613287623121, 14.903948473443279 ], [ -90.669007940763834, 14.92957998272999 ], [ -90.673477952645385, 14.939036770430619 ], [ -90.680816005953886, 14.945703030170705 ], [ -90.687404751328188, 14.949940497156206 ], [ -90.694277716643285, 14.955676580909483 ], [ -90.712157762370794, 14.973763333111322 ], [ -90.707739427332683, 14.995519111517751 ], [ -90.707274340238598, 15.000221666496714 ], [ -90.797243007858526, 15.054947008397733 ], [ -90.871915453035683, 15.148481350334009 ], [ -90.865662605344937, 15.256846829417611 ], [ -90.85739437515025, 15.252686875898576 ], [ -90.691564703947904, 15.214937242159976 ], [ -90.574362555687401, 15.20997630476262 ], [ -90.541315476927707, 15.212508450304711 ], [ -90.503772548764118, 15.262195339543268 ], [ -90.480569831332616, 15.261135973246553 ], [ -90.45770300978603, 15.260980942716344 ], [ -90.424113328667147, 15.260128281994582 ], [ -90.400548876029802, 15.260980942716344 ], [ -90.378922288832541, 15.254314682976201 ], [ -90.323835211725623, 15.218089504427098 ], [ -90.313164028996709, 15.207805894426485 ], [ -90.310270148248719, 15.207056586492286 ], [ -90.306316901204013, 15.20752167448569 ], [ -90.29621415925601, 15.21287018551061 ], [ -90.292312588155426, 15.216849270077716 ], [ -90.280091111815352, 15.231654567903945 ], [ -90.275336879993006, 15.235659490892772 ], [ -90.268567268364734, 15.24509044017168 ], [ -90.260505743745057, 15.275967109494502 ], [ -90.259756435810857, 15.282168280341864 ], [ -90.258903775089152, 15.284338691577318 ], [ -90.256371630446381, 15.289118760922065 ], [ -90.254821336835221, 15.291056627261526 ], [ -90.253090176070771, 15.292787787126656 ], [ -90.248775193820109, 15.295707506296367 ], [ -90.235235968764925, 15.294932359041127 ], [ -90.187176886603993, 15.283718573053704 ], [ -90.078010423642127, 15.268835760861634 ], [ -90.038813849979192, 15.270153510476121 ], [ -90.006050992059613, 15.282788397966158 ], [ -89.997007616408325, 15.284855455514844 ], [ -89.952100795615195, 15.288498643297714 ], [ -89.948741827773119, 15.287826849729299 ], [ -89.945098639990249, 15.28674164501092 ], [ -89.937657232994866, 15.282478338704379 ], [ -89.926417608585723, 15.272194728703766 ], [ -89.921715053606817, 15.266561997737995 ], [ -89.919312100173272, 15.262143662699884 ], [ -89.917374233833812, 15.257182725302528 ], [ -89.918149380189732, 15.247054144932804 ], [ -89.928846402239628, 15.217934474796152 ], [ -89.97300391329992, 15.156542874054367 ], [ -89.999953173100437, 15.142073473012374 ], [ -90.038452114773236, 15.116752021188802 ], [ -90.123873257045148, 15.061251532032543 ], [ -90.282571581413322, 14.954488023403542 ], [ -90.298436244636946, 14.905653794886689 ], [ -90.303397182933622, 14.889582424289415 ], [ -90.354298468999104, 14.881520901468434 ], [ -90.387371385281199, 14.887256985221654 ], [ -90.399928758405451, 14.899039211090724 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "GT-TO", "NAME_1": "Totonicapán" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -91.511075406005148, 14.907152410755145 ], [ -91.517819180111076, 14.9093228219906 ], [ -91.519343635300515, 14.911389879539286 ], [ -91.520609707172241, 14.913508613032036 ], [ -91.536500209716905, 14.931647040278676 ], [ -91.538412237634645, 14.938364975962884 ], [ -91.53833472416818, 14.944566147709509 ], [ -91.536293505041215, 14.949940497156206 ], [ -91.536035121723444, 14.961619371137033 ], [ -91.552726609945069, 14.976243800910652 ], [ -91.560219692884516, 14.985907294186291 ], [ -91.564147102406821, 15.000531724859172 ], [ -91.588770922240258, 15.091430569365286 ], [ -91.593886888369184, 15.120266017762503 ], [ -91.591871507663939, 15.12848257111375 ], [ -91.589701097327747, 15.129877835094021 ], [ -91.587479011047492, 15.131014715756521 ], [ -91.536319342563615, 15.15044505509519 ], [ -91.51882686956435, 15.155974433273457 ], [ -91.485185513400722, 15.157731432459627 ], [ -91.481413132609987, 15.159385077059653 ], [ -91.47704647531458, 15.161813869814239 ], [ -91.47645219611195, 15.164862779293799 ], [ -91.474204271409974, 15.190003363964081 ], [ -91.473506639419838, 15.192664699816021 ], [ -91.467563850091608, 15.203878485803443 ], [ -91.454386359343005, 15.222688707517818 ], [ -91.450820685925919, 15.22638357214413 ], [ -91.445782233263458, 15.228786526476995 ], [ -91.43580868162536, 15.231499539172376 ], [ -91.392477993764373, 15.241240545914422 ], [ -91.376923387104625, 15.252325140692676 ], [ -91.352790493686314, 15.262815457167619 ], [ -91.341111619705487, 15.264908352238649 ], [ -91.31535091831023, 15.263151353052478 ], [ -91.320001797345071, 15.235220242220407 ], [ -91.32015682697596, 15.217081814074447 ], [ -91.315195888679284, 15.201630561101524 ], [ -91.301656663624101, 15.195119330093007 ], [ -91.2985302397787, 15.18824636477791 ], [ -91.270676643312413, 15.160470281778089 ], [ -91.263803677097997, 15.157576401929418 ], [ -91.25886857812236, 15.138042710702507 ], [ -91.249127569581674, 15.124555162490765 ], [ -91.247732307400042, 15.110705878173746 ], [ -91.240807665241562, 15.108483791893491 ], [ -91.234554815752119, 15.097218329062628 ], [ -91.234503139808055, 15.092050686090261 ], [ -91.235407478272464, 15.081922104821274 ], [ -91.237758754862625, 15.078046373041673 ], [ -91.240678474032336, 15.075927639548922 ], [ -91.251142951186239, 15.075720933074592 ], [ -91.25543209501518, 15.074687405199597 ], [ -91.260470546778265, 15.07256867080747 ], [ -91.268532071397942, 15.06641917590423 ], [ -91.271865200818354, 15.061716620026004 ], [ -91.274242315830179, 15.055153713073366 ], [ -91.275017463085419, 15.047402249514164 ], [ -91.274862434353849, 15.044301663191163 ], [ -91.274423183882789, 15.041304430554987 ], [ -91.273182950432783, 15.038927313744523 ], [ -91.271477627190734, 15.037066961770847 ], [ -91.2607806060401, 15.030400702030761 ], [ -91.243003913100097, 15.017429917756488 ], [ -91.240988532394852, 15.014484361064376 ], [ -91.23822384285603, 15.00936839403613 ], [ -91.233547126298845, 14.991488349207941 ], [ -91.226596645718587, 14.980739651213923 ], [ -91.210163539915413, 14.969577542069885 ], [ -91.207243821645022, 14.963996487048234 ], [ -91.206933763282507, 14.957743639357432 ], [ -91.212488979882494, 14.941155503923369 ], [ -91.214685227741029, 14.934850979389182 ], [ -91.182981737017542, 14.910666409127487 ], [ -91.202567105087837, 14.891752835524926 ], [ -91.215847947724569, 14.873252672173066 ], [ -91.229619716776483, 14.860023505480399 ], [ -91.240652634711296, 14.856716213582388 ], [ -91.246104499423097, 14.855682684808016 ], [ -91.252641567953958, 14.855837714438962 ], [ -91.255742154276959, 14.856251126488303 ], [ -91.271658495243344, 14.861367091717909 ], [ -91.27868649018933, 14.862607326966554 ], [ -91.292458259241243, 14.862607326966554 ], [ -91.313051316764813, 14.854029039308728 ], [ -91.320208502920082, 14.854855862508032 ], [ -91.325918749150958, 14.857336331206682 ], [ -91.335091315112095, 14.859868475849453 ], [ -91.358139003811971, 14.863279120534969 ], [ -91.369972907423744, 14.861677150979745 ], [ -91.37870622381314, 14.858783271131017 ], [ -91.424414029383911, 14.821059474914819 ], [ -91.428289761163512, 14.817648831128622 ], [ -91.447978482021313, 14.850980128929791 ], [ -91.458856371224556, 14.860695299048814 ], [ -91.461879442282395, 14.890667629007851 ], [ -91.470483568361999, 14.910149644290641 ], [ -91.491645066666479, 14.9093228219906 ], [ -91.511075406005148, 14.907152410755145 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/haiti.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/haiti.geojson new file mode 100644 index 000000000000..3b520e3c3384 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/haiti.geojson @@ -0,0 +1,16 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "HT-NE", "NAME_1": "Nord-Est" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.757435675999943, 19.710109768000052 ], [ -71.748613240999902, 19.682598165000073 ], [ -71.745047566999943, 19.664898987000058 ], [ -71.746041408999929, 19.649017002000036 ], [ -71.747683064999961, 19.622782695000026 ], [ -71.743083862999924, 19.600070903000059 ], [ -71.715126912999921, 19.53746490500005 ], [ -71.703189656999967, 19.459278463000103 ], [ -71.703861450999852, 19.414630025000079 ], [ -71.715281942999951, 19.391659851000028 ], [ -71.720811320999957, 19.385949606000068 ], [ -71.733472046999907, 19.355460511000089 ], [ -71.742980508999977, 19.348380839000058 ], [ -71.769955607999918, 19.333808085 ], [ -71.776518514999907, 19.327503561000086 ], [ -71.771557576999953, 19.307556457000075 ], [ -71.753729206999907, 19.28378529900003 ], [ -71.749517077051451, 19.279707722733178 ], [ -71.749981859275351, 19.279650377462929 ], [ -71.78390743717847, 19.275464586421492 ], [ -71.819254115684885, 19.278358466270163 ], [ -71.837650926249239, 19.277118231920838 ], [ -71.86044023343004, 19.28125234611889 ], [ -71.887622036327912, 19.28486969727868 ], [ -71.906225551567957, 19.299752509470693 ], [ -71.94327755421574, 19.315772203224583 ], [ -71.978882616039868, 19.335770982444842 ], [ -71.995522427418052, 19.387344062078796 ], [ -72.045958624590867, 19.435764879445628 ], [ -72.064613816674296, 19.440932522417938 ], [ -72.08301062723865, 19.445686754240285 ], [ -72.073088752443937, 19.460414536801409 ], [ -72.069988166120936, 19.486924547030185 ], [ -72.087041388649141, 19.512969469265556 ], [ -72.097273321806369, 19.542528388074629 ], [ -72.110735033395088, 19.566144517555415 ], [ -72.113706427609543, 19.589657294248696 ], [ -72.109779018986501, 19.602369697003894 ], [ -72.110502489398357, 19.616115628533407 ], [ -72.098384365845789, 19.623660387416919 ], [ -72.082338832770915, 19.626864324728786 ], [ -72.060996467313089, 19.656526598124003 ], [ -72.056526455431538, 19.695077215740923 ], [ -72.052728238017778, 19.702621975523755 ], [ -72.047915174375632, 19.712042611329856 ], [ -72.04124915299991, 19.708970445000091 ], [ -72.02765865799995, 19.699611721000053 ], [ -72.018544074999909, 19.697455145000049 ], [ -72.010812954999949, 19.700873114000046 ], [ -72.005726691999939, 19.708319403000075 ], [ -71.999338344999899, 19.71556224200009 ], [ -71.987863735999952, 19.718573309000078 ], [ -71.968861456999946, 19.732326565000051 ], [ -71.940500454999949, 19.732123114000046 ], [ -71.891590949999909, 19.718573309000078 ], [ -71.864735480999911, 19.715073960000041 ], [ -71.857574022999927, 19.710028387000079 ], [ -71.863636847999942, 19.697455145000049 ], [ -71.872303839999915, 19.69212474200009 ], [ -71.884185350999928, 19.690252997000073 ], [ -71.912098761999914, 19.690619208000044 ], [ -71.901600714999915, 19.672308661000045 ], [ -71.884266730999911, 19.670396226000037 ], [ -71.86546790299991, 19.675360419000071 ], [ -71.850656704999949, 19.677639065000051 ], [ -71.832590298999946, 19.663275458000044 ], [ -71.821441209999932, 19.656683661000045 ], [ -71.816517706999946, 19.659857489000046 ], [ -71.811146613999938, 19.673570054000038 ], [ -71.813303188999953, 19.680731512000079 ], [ -71.835357225999928, 19.68618398600006 ], [ -71.84243730399993, 19.692328192000048 ], [ -71.84601803299995, 19.701117255000042 ], [ -71.84439042899993, 19.711127020000049 ], [ -71.836740688999953, 19.717352606000077 ], [ -71.825306769999941, 19.716620184000078 ], [ -71.799427863999938, 19.711127020000049 ], [ -71.757435675999943, 19.710109768000052 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HT-CE", "NAME_1": "Centre" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.749517077051451, 19.279707722733178 ], [ -71.716522176999888, 19.247766825000028 ], [ -71.651732717191123, 19.21792388447966 ], [ -71.63911088099988, 19.212110088000045 ], [ -71.64365840699989, 19.15247548400005 ], [ -71.648774373999885, 19.135293071000078 ], [ -71.661383422999904, 19.117593893000063 ], [ -71.695283161999924, 19.094546204 ], [ -71.710424356999937, 19.081652934000104 ], [ -71.740345011999864, 19.041887919000075 ], [ -71.783701537999946, 18.996309306000015 ], [ -71.796827351999923, 18.988609518000104 ], [ -71.848142048999961, 18.975483704000041 ], [ -71.865401977999852, 18.964424948000058 ], [ -71.862456421999951, 18.947087504000038 ], [ -71.844524698999891, 18.949748841000044 ], [ -71.819668334999932, 18.957810364000053 ], [ -71.796258910999967, 18.957061056000057 ], [ -71.787112182999891, 18.950033061000042 ], [ -71.772952839999931, 18.921714376000054 ], [ -71.763806111999941, 18.911508281000053 ], [ -71.740913452999933, 18.891612854000059 ], [ -71.733472046999907, 18.882569479 ], [ -71.727942668999901, 18.864069316000084 ], [ -71.726909139999918, 18.82352915500006 ], [ -71.71884761599992, 18.784229228000086 ], [ -71.72034623299993, 18.76544484500009 ], [ -71.725255492999878, 18.746970520000062 ], [ -71.732076782999911, 18.730072327000059 ], [ -71.744065714999891, 18.711442973000104 ], [ -71.758070027999878, 18.700513407000031 ], [ -71.784897638415259, 18.684730212729107 ], [ -71.79177913299992, 18.680681698000072 ], [ -71.792123989630397, 18.68108226213667 ], [ -71.798841926213925, 18.688885403438576 ], [ -71.836669074318309, 18.710279445739786 ], [ -71.87852698383324, 18.720666409427224 ], [ -71.912116664952123, 18.732241929721283 ], [ -71.946223110907852, 18.74350739255209 ], [ -72.026683315782407, 18.729554755447566 ], [ -72.105877447885916, 18.705060125924035 ], [ -72.182126024196634, 18.730019843441028 ], [ -72.242329068331799, 18.78650218452816 ], [ -72.272146368659946, 18.806035874855752 ], [ -72.306252813716355, 18.814200751363558 ], [ -72.339067349378638, 18.833837795377917 ], [ -72.365189785080531, 18.867014065346837 ], [ -72.318396775690644, 18.869701238721177 ], [ -72.270957811154062, 18.864430242961305 ], [ -72.247445033561462, 18.877142645716503 ], [ -72.243672654569366, 18.908045152561726 ], [ -72.229926723939172, 18.940549628062854 ], [ -72.232794766265442, 18.96705963829163 ], [ -72.238892585224619, 19.017082424314424 ], [ -72.225120816172705, 19.067880356693081 ], [ -72.231890427800977, 19.097490953244858 ], [ -72.234060838137168, 19.121778876294115 ], [ -72.224707404123365, 19.143069565807821 ], [ -72.251579148658777, 19.168494371318161 ], [ -72.245868903327221, 19.240893053371678 ], [ -72.200057745868264, 19.301922918907565 ], [ -72.170550503003312, 19.292104396900356 ], [ -72.148639695865256, 19.271382148167561 ], [ -72.1394671290048, 19.258308010206463 ], [ -72.120062628987114, 19.260065009392633 ], [ -72.050919561988167, 19.30088939103257 ], [ -71.978882616039868, 19.335770982444842 ], [ -71.94327755421574, 19.315772203224583 ], [ -71.906225551567957, 19.299752509470693 ], [ -71.887622036327912, 19.28486969727868 ], [ -71.86044023343004, 19.28125234611889 ], [ -71.837650926249239, 19.277118231920838 ], [ -71.819254115684885, 19.278358466270163 ], [ -71.78390743717847, 19.275464586421492 ], [ -71.749981859275351, 19.279650377462929 ], [ -71.749517077051451, 19.279707722733178 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HT-OU", "NAME_1": "Ouest" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -71.79177913299992, 18.680681698000072 ], [ -71.794346883999935, 18.679171041000032 ], [ -71.807989460999949, 18.664649964000077 ], [ -71.828556680999924, 18.631292827000024 ], [ -71.841579141999972, 18.617986145000103 ], [ -71.88028479099998, 18.605402934 ], [ -71.955474, 18.618606262000085 ], [ -71.992629353999916, 18.61113901800006 ], [ -72.009837605999905, 18.598814189 ], [ -72.000949259999885, 18.582458598000059 ], [ -71.910515502999914, 18.494272766 ], [ -71.904055949999957, 18.484790141000119 ], [ -71.901575479999877, 18.469778138000052 ], [ -71.906898152999929, 18.464300436000045 ], [ -71.914391235999858, 18.460217997000044 ], [ -71.918163615999873, 18.449236755000058 ], [ -71.912169148999851, 18.430736593000049 ], [ -71.897182983999897, 18.422881775000107 ], [ -71.858167277999883, 18.413554179000059 ], [ -71.8497440189999, 18.406448670000131 ], [ -71.834551147999946, 18.38508046500003 ], [ -71.826437947999864, 18.37616628100001 ], [ -71.788714152999916, 18.352214254 ], [ -71.734970662999899, 18.332938945000066 ], [ -71.720707967999942, 18.323973083000041 ], [ -71.711509562999936, 18.316144105000106 ], [ -71.709339151999927, 18.313250224000015 ], [ -71.721111735999841, 18.293973823000087 ], [ -71.722050746644641, 18.293819077788214 ], [ -71.809538947364501, 18.279401352690286 ], [ -71.861267055730025, 18.310045478016377 ], [ -71.928653124442121, 18.315006415413734 ], [ -72.012730678677883, 18.313972887538739 ], [ -72.09918534972411, 18.332628078722848 ], [ -72.18607927124134, 18.349629625306932 ], [ -72.271267870415898, 18.344565335122127 ], [ -72.354053514358213, 18.349319566045097 ], [ -72.367851121831791, 18.36404735040486 ], [ -72.380020922227743, 18.379912014527804 ], [ -72.408959724311842, 18.377793281035053 ], [ -72.428028326645972, 18.386991685417911 ], [ -72.454254116034633, 18.39934235296721 ], [ -72.490272589908102, 18.401512763303344 ], [ -72.523448858977645, 18.386733302999517 ], [ -72.548150194076186, 18.358517971327274 ], [ -72.558227097602469, 18.351179918018772 ], [ -72.570319382733317, 18.350818182812873 ], [ -72.594865689100232, 18.340792955230711 ], [ -72.618016729688293, 18.33805410411361 ], [ -72.631297574123721, 18.336503811401769 ], [ -72.642640550421049, 18.327305406119592 ], [ -72.66176082959862, 18.324928290208391 ], [ -72.681191168937289, 18.32415314385247 ], [ -72.692844203597133, 18.314644680207834 ], [ -72.703799608065424, 18.304774482256562 ], [ -72.721162888956144, 18.307151598167707 ], [ -72.736872525246838, 18.315316473776249 ], [ -72.739559698621179, 18.300950426421025 ], [ -72.745037400855381, 18.288496406084278 ], [ -72.757233038773734, 18.279349676746165 ], [ -72.76503618007564, 18.265293686854136 ], [ -72.798109097256997, 18.273251857786988 ], [ -72.832060512682517, 18.284207262255336 ], [ -72.848958705579776, 18.274543768979754 ], [ -72.860275845254023, 18.262968247786375 ], [ -72.881799078764459, 18.273355211473813 ], [ -72.893090380016986, 18.289064845965868 ], [ -72.907869839421551, 18.289891669165172 ], [ -72.92347612202542, 18.290925197939544 ], [ -72.950089484142381, 18.285344142917836 ], [ -72.971302660189622, 18.282605291800735 ], [ -72.983317430055365, 18.304567775782232 ], [ -72.997735155153293, 18.322757879872256 ], [ -73.013393113701227, 18.34151642474319 ], [ -73.020757005431449, 18.365804347792391 ], [ -73.038042771956327, 18.382392483226511 ], [ -73.063028326995664, 18.383374335157441 ], [ -73.06527625169764, 18.410246079692797 ], [ -73.049747484358932, 18.435205797209733 ], [ -73.05023840987468, 18.447298082340637 ], [ -73.055945009354673, 18.45845306255876 ], [ -72.985585089999915, 18.470404364000046 ], [ -72.898996548999946, 18.450506903000075 ], [ -72.904164191999939, 18.434149481000077 ], [ -72.88508053299995, 18.437689520000049 ], [ -72.858306443999936, 18.446682033000059 ], [ -72.840646938999953, 18.446763414000088 ], [ -72.826039191999939, 18.440822658000059 ], [ -72.754994269999941, 18.429388739000046 ], [ -72.716460740999935, 18.437730210000041 ], [ -72.689320441999939, 18.459662177000041 ], [ -72.669341600999928, 18.490464585000041 ], [ -72.65257727799991, 18.525580145000049 ], [ -72.628285285999937, 18.55414459800005 ], [ -72.596547003999945, 18.56085846600007 ], [ -72.429758266999897, 18.546698309000078 ], [ -72.423695441999939, 18.548814195000091 ], [ -72.421131964999915, 18.553534247000073 ], [ -72.419504360999952, 18.558254299000055 ], [ -72.416086391999897, 18.560370184000078 ], [ -72.409820115999935, 18.559149481000077 ], [ -72.40689042899993, 18.556626695000091 ], [ -72.40493730399993, 18.554103908000059 ], [ -72.401763475999928, 18.552923895000049 ], [ -72.380970831999946, 18.53070709800005 ], [ -72.37140865799995, 18.525580145000049 ], [ -72.35383053299995, 18.530096747000073 ], [ -72.345692511999914, 18.546861070000091 ], [ -72.343413865999935, 18.570135809000078 ], [ -72.345082160999937, 18.631008205000057 ], [ -72.343413865999935, 18.642279364000046 ], [ -72.336415167999917, 18.655829169000071 ], [ -72.328684048999946, 18.663885809000078 ], [ -72.325062628999945, 18.671372789000088 ], [ -72.330433722999942, 18.683294989000046 ], [ -72.339426235999952, 18.689439195000091 ], [ -72.38508053299995, 18.710598049000055 ], [ -72.397368943999936, 18.712632554000038 ], [ -72.421701626999948, 18.713364976000037 ], [ -72.433461066999939, 18.716782945000091 ], [ -72.453724738999938, 18.733343817000048 ], [ -72.471750454999949, 18.754095770000049 ], [ -72.491078253999945, 18.768500067000048 ], [ -72.515370245999918, 18.765814520000049 ], [ -72.549549933999913, 18.785630601000037 ], [ -72.558094855999911, 18.794623114000046 ], [ -72.566517706999946, 18.813625393000052 ], [ -72.617787238999938, 18.889349677000041 ], [ -72.631947394999941, 18.90306224200009 ], [ -72.651966925999943, 18.91860586100006 ], [ -72.673003709999932, 18.931301174000055 ], [ -72.69009355399993, 18.936509507000039 ], [ -72.7060447007661, 18.944241285750444 ], [ -72.692017381297092, 18.961168524907464 ], [ -72.675274217131403, 18.972847397989028 ], [ -72.611531338000816, 18.970573634865332 ], [ -72.536006232101897, 18.960393378551544 ], [ -72.512493456307936, 18.957809557065389 ], [ -72.487740445265331, 18.958894761783824 ], [ -72.476940070427872, 18.944425360741775 ], [ -72.466914841946391, 18.929025783712916 ], [ -72.441955126228095, 18.918793850555744 ], [ -72.415548468786767, 18.908665269286757 ], [ -72.388625047408027, 18.889958401259207 ], [ -72.365189785080531, 18.867014065346837 ], [ -72.339067349378638, 18.833837795377917 ], [ -72.306252813716355, 18.814200751363558 ], [ -72.272146368659946, 18.806035874855752 ], [ -72.242329068331799, 18.78650218452816 ], [ -72.182126024196634, 18.730019843441028 ], [ -72.105877447885916, 18.705060125924035 ], [ -72.026683315782407, 18.729554755447566 ], [ -71.946223110907852, 18.74350739255209 ], [ -71.912116664952123, 18.732241929721283 ], [ -71.87852698383324, 18.720666409427224 ], [ -71.836669074318309, 18.710279445739786 ], [ -71.798841926213925, 18.688885403438576 ], [ -71.792123989630397, 18.68108226213667 ], [ -71.79177913299992, 18.680681698000072 ] ] ], [ [ [ -73.258656378999945, 18.878485419000071 ], [ -73.277333136999914, 18.891099351000037 ], [ -73.282582160999937, 18.895493882000039 ], [ -73.289906378999945, 18.904201565000051 ], [ -73.296538865999935, 18.914496161000045 ], [ -73.299631313999953, 18.925523179000038 ], [ -73.296213344999899, 18.936509507000039 ], [ -73.28384355399993, 18.949693101000037 ], [ -73.266346808999913, 18.960842190000051 ], [ -73.245961066999939, 18.968410549000055 ], [ -73.224476691999939, 18.971258856000077 ], [ -73.200795050999943, 18.968695380000042 ], [ -73.061919725999928, 18.913316148000035 ], [ -72.993397589999915, 18.89203522300005 ], [ -72.917225714999915, 18.855454820000091 ], [ -72.846099412999934, 18.827093817000048 ], [ -72.81704667899993, 18.793117580000057 ], [ -72.809478318999936, 18.771470445000091 ], [ -72.805897589999915, 18.745672919000071 ], [ -72.808745897999927, 18.720404364000046 ], [ -72.820464647999927, 18.700669664000088 ], [ -72.831125454999949, 18.696437893000052 ], [ -72.83820553299995, 18.70258209800005 ], [ -72.847157355999911, 18.720526434000078 ], [ -72.85570227799991, 18.727687893000052 ], [ -72.863352016999897, 18.729641018000052 ], [ -72.885894334999932, 18.731024481000077 ], [ -72.975005662999934, 18.749904690000051 ], [ -73.005441860999952, 18.752142645000049 ], [ -73.03742428299995, 18.759588934000078 ], [ -73.125559048999946, 18.813625393000052 ], [ -73.214588995999918, 18.836615302000041 ], [ -73.23851477799991, 18.851507880000042 ], [ -73.258656378999945, 18.878485419000071 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HT-SE", "NAME_1": "Sud-Est" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.721111735999841, 18.293973823000087 ], [ -71.721708773141359, 18.292996236786905 ], [ -71.766131551999877, 18.220258484000041 ], [ -71.77403804599993, 18.201474101000045 ], [ -71.776828572999875, 18.181785380000079 ], [ -71.775329955999979, 18.172328593000131 ], [ -71.764581257999851, 18.143674011000044 ], [ -71.762204141999916, 18.132486064000105 ], [ -71.762875935999887, 18.115846253000072 ], [ -71.760653849999898, 18.086804097000098 ], [ -71.764271199999968, 18.069492493000084 ], [ -71.776234503999945, 18.039252020000063 ], [ -71.792591925999943, 18.049872137000079 ], [ -71.862456834999932, 18.136542059000078 ], [ -71.892974412999934, 18.162787177000041 ], [ -71.928089972999942, 18.183783270000049 ], [ -72.006743943999936, 18.209458726000037 ], [ -72.03929602799991, 18.225653387000079 ], [ -72.071766730999911, 18.237534898000092 ], [ -72.110707160999937, 18.237616278000075 ], [ -72.190541144999941, 18.224839585000041 ], [ -72.294545050999943, 18.225775458000044 ], [ -72.440297003999945, 18.223944403000075 ], [ -72.518788214999915, 18.210353908000059 ], [ -72.538889126999948, 18.220445054000038 ], [ -72.550933397999927, 18.224758205000057 ], [ -72.556304490999935, 18.220851955000057 ], [ -72.549549933999913, 18.18235911700009 ], [ -72.558990037999934, 18.172552802000041 ], [ -72.570668097999942, 18.172308661000045 ], [ -72.59797115799995, 18.18235911700009 ], [ -72.613270636999914, 18.18500397300005 ], [ -72.730865037999934, 18.174709377000056 ], [ -72.754994269999941, 18.176174221000053 ], [ -72.753000454999949, 18.171576239000046 ], [ -72.750111456999946, 18.160305080000057 ], [ -72.748158331999946, 18.15570709800005 ], [ -72.763010219999899, 18.156724351000037 ], [ -72.768950975999928, 18.158270575000074 ], [ -72.77603105399993, 18.163153387000079 ], [ -72.803700324999909, 18.146144924000055 ], [ -72.858876105999911, 18.151312567000048 ], [ -72.885894334999932, 18.141424872000073 ], [ -72.912180141999897, 18.155910549000055 ], [ -72.94749915299991, 18.169094143000052 ], [ -72.985340949999909, 18.178656317000048 ], [ -73.008043724859107, 18.181064983390439 ], [ -73.006933560435471, 18.185970364440777 ], [ -73.010059984280815, 18.203385322174881 ], [ -73.012462937714417, 18.220903631797171 ], [ -73.014426643374861, 18.242866115778611 ], [ -73.014504156841326, 18.264828599760051 ], [ -73.001688402197999, 18.293095608275678 ], [ -72.997735155153293, 18.322757879872256 ], [ -72.983317430055365, 18.304567775782232 ], [ -72.971302660189622, 18.282605291800735 ], [ -72.950089484142381, 18.285344142917836 ], [ -72.92347612202542, 18.290925197939544 ], [ -72.907869839421551, 18.289891669165172 ], [ -72.893090380016986, 18.289064845965868 ], [ -72.881799078764459, 18.273355211473813 ], [ -72.860275845254023, 18.262968247786375 ], [ -72.848958705579776, 18.274543768979754 ], [ -72.832060512682517, 18.284207262255336 ], [ -72.798109097256997, 18.273251857786988 ], [ -72.76503618007564, 18.265293686854136 ], [ -72.757233038773734, 18.279349676746165 ], [ -72.745037400855381, 18.288496406084278 ], [ -72.739559698621179, 18.300950426421025 ], [ -72.736872525246838, 18.315316473776249 ], [ -72.721162888956144, 18.307151598167707 ], [ -72.703799608065424, 18.304774482256562 ], [ -72.692844203597133, 18.314644680207834 ], [ -72.681191168937289, 18.32415314385247 ], [ -72.66176082959862, 18.324928290208391 ], [ -72.642640550421049, 18.327305406119592 ], [ -72.631297574123721, 18.336503811401769 ], [ -72.618016729688293, 18.33805410411361 ], [ -72.594865689100232, 18.340792955230711 ], [ -72.570319382733317, 18.350818182812873 ], [ -72.558227097602469, 18.351179918018772 ], [ -72.548150194076186, 18.358517971327274 ], [ -72.523448858977645, 18.386733302999517 ], [ -72.490272589908102, 18.401512763303344 ], [ -72.454254116034633, 18.39934235296721 ], [ -72.428028326645972, 18.386991685417911 ], [ -72.408959724311842, 18.377793281035053 ], [ -72.380020922227743, 18.379912014527804 ], [ -72.367851121831791, 18.36404735040486 ], [ -72.354053514358213, 18.349319566045097 ], [ -72.271267870415898, 18.344565335122127 ], [ -72.18607927124134, 18.349629625306932 ], [ -72.09918534972411, 18.332628078722848 ], [ -72.012730678677883, 18.313972887538739 ], [ -71.928653124442121, 18.315006415413734 ], [ -71.861267055730025, 18.310045478016377 ], [ -71.809538947364501, 18.279401352690286 ], [ -71.722050746644641, 18.293819077788214 ], [ -71.721111735999841, 18.293973823000087 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HT-SD", "NAME_1": "Sud" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -73.628895636999914, 18.094224351000037 ], [ -73.612049933999913, 18.093247789000088 ], [ -73.592274542999917, 18.089341539000088 ], [ -73.577992316999939, 18.081122137000079 ], [ -73.577992316999939, 18.066961981000077 ], [ -73.590443488999938, 18.059393622000073 ], [ -73.610829230999911, 18.057562567000048 ], [ -73.649728969999899, 18.059475002000056 ], [ -73.667225714999915, 18.06313711100006 ], [ -73.682525193999936, 18.072007554000038 ], [ -73.70767167899993, 18.094224351000037 ], [ -73.704457160999937, 18.104193427000041 ], [ -73.699940558999913, 18.108303127000056 ], [ -73.694243943999936, 18.10687897300005 ], [ -73.687855597999942, 18.100490627000056 ], [ -73.676380988999938, 18.108099677000041 ], [ -73.670887824999909, 18.105373440000051 ], [ -73.666900193999936, 18.098578192000048 ], [ -73.659982876999948, 18.094224351000037 ], [ -73.628895636999914, 18.094224351000037 ] ] ], [ [ [ -73.008043724859107, 18.181064983390439 ], [ -73.090809699999909, 18.189846096000053 ], [ -73.117258266999897, 18.188625393000052 ], [ -73.125559048999946, 18.189846096000053 ], [ -73.154652472999942, 18.207505601000037 ], [ -73.163400844999899, 18.210353908000059 ], [ -73.296213344999899, 18.23078034100007 ], [ -73.355865037999934, 18.22492096600007 ], [ -73.365101691999939, 18.227362372000073 ], [ -73.359852667999917, 18.240383205000057 ], [ -73.346587693999936, 18.245347398000092 ], [ -73.310454881999931, 18.245062567000048 ], [ -73.310454881999931, 18.251288153000075 ], [ -73.37726803299995, 18.25812409100007 ], [ -73.458241339999915, 18.257513739000046 ], [ -73.481800910999937, 18.251288153000075 ], [ -73.51398678299995, 18.23314036700009 ], [ -73.526193813999953, 18.23078034100007 ], [ -73.534169074999909, 18.234767971000053 ], [ -73.542795376999948, 18.253119208000044 ], [ -73.550119594999899, 18.258734442000048 ], [ -73.563465949999909, 18.251044012000079 ], [ -73.570708787999934, 18.231512762000079 ], [ -73.578114386999914, 18.216864325000074 ], [ -73.591664191999939, 18.223944403000075 ], [ -73.59788977799991, 18.223944403000075 ], [ -73.60968990799995, 18.216782945000091 ], [ -73.619618292999917, 18.221909898000092 ], [ -73.624012824999909, 18.234849351000037 ], [ -73.619007941999939, 18.251288153000075 ], [ -73.633208787999934, 18.247259833000044 ], [ -73.645619269999941, 18.221096096000053 ], [ -73.659982876999948, 18.210353908000059 ], [ -73.659291144999941, 18.223822333000044 ], [ -73.655995245999918, 18.235825914000088 ], [ -73.646311001999948, 18.258734442000048 ], [ -73.654164191999939, 18.25267161700009 ], [ -73.665435350999928, 18.238511460000041 ], [ -73.673573370999918, 18.23078034100007 ], [ -73.674387173999946, 18.233221747000073 ], [ -73.680246548999946, 18.235419012000079 ], [ -73.690988735999952, 18.237616278000075 ], [ -73.694569464999915, 18.235907294000071 ], [ -73.694162563999953, 18.231919664000088 ], [ -73.692982550999943, 18.227443752000056 ], [ -73.694081183999913, 18.223944403000075 ], [ -73.737782355999911, 18.190741278000075 ], [ -73.809315558999913, 18.159165757000039 ], [ -73.827463344999899, 18.14203522300005 ], [ -73.844878709999932, 18.11469147300005 ], [ -73.802805141999897, 18.071926174000055 ], [ -73.796498175999943, 18.056341864000046 ], [ -73.791411912999934, 18.036688544000071 ], [ -73.793812628999945, 18.028998114000046 ], [ -73.807036912999934, 18.025946356000077 ], [ -73.87328040299991, 18.026190497000073 ], [ -73.882964647999927, 18.027736721000053 ], [ -73.892689581999946, 18.032171942000048 ], [ -73.899973110999952, 18.039129950000074 ], [ -73.903797980999911, 18.053859768000052 ], [ -73.967762824999909, 18.141424872000073 ], [ -73.97093665299991, 18.143703518000052 ], [ -73.978505011999914, 18.146877346000053 ], [ -73.982045050999943, 18.148871161000045 ], [ -73.985585089999915, 18.15265534100007 ], [ -73.986398891999897, 18.15570709800005 ], [ -73.986887173999946, 18.158880927000041 ], [ -73.989572719999899, 18.163153387000079 ], [ -74.008208787999934, 18.179754950000074 ], [ -74.105051235999952, 18.247626044000071 ], [ -74.122425910999937, 18.255682684000078 ], [ -74.152943488999938, 18.260565497000073 ], [ -74.165760870999918, 18.265611070000091 ], [ -74.176665818999936, 18.273179429000038 ], [ -74.181304490999935, 18.282619533000059 ], [ -74.183420376999948, 18.29328034100007 ], [ -74.189076300999943, 18.296535549000055 ], [ -74.19758053299995, 18.297064520000049 ], [ -74.207997199999909, 18.299709377000056 ], [ -74.233794725999928, 18.309271552000041 ], [ -74.242176886999914, 18.313950914000088 ], [ -74.248931443999936, 18.306545315000051 ], [ -74.26781165299991, 18.312974351000037 ], [ -74.287831183999913, 18.304917710000041 ], [ -74.308949347999942, 18.292466539000088 ], [ -74.330922003999945, 18.286037502000056 ], [ -74.349354620999918, 18.28969961100006 ], [ -74.372181769999941, 18.298488674000055 ], [ -74.391590949999909, 18.308783270000049 ], [ -74.399769660999937, 18.317084052000041 ], [ -74.408314581999946, 18.328273830000057 ], [ -74.445912238999938, 18.346380927000041 ], [ -74.452648045966384, 18.360980548059175 ], [ -74.448809373553729, 18.362652086424646 ], [ -74.424857347288707, 18.365080878279912 ], [ -74.397081265188206, 18.360119940882555 ], [ -74.341684129718772, 18.365339259798986 ], [ -74.287010463761874, 18.376398017054839 ], [ -74.186654833353884, 18.395931708281694 ], [ -74.085317349216268, 18.403631496796152 ], [ -74.043123542017838, 18.393761297945503 ], [ -74.001498175600318, 18.380428779364649 ], [ -73.953800828645285, 18.367509670135178 ], [ -73.906310187265319, 18.36384064393053 ], [ -73.908015509608049, 18.387560126198821 ], [ -73.89416622619035, 18.407300523000742 ], [ -73.87106686064709, 18.407817287837531 ], [ -73.84794165668211, 18.407868963781652 ], [ -73.815979784439492, 18.416137193076963 ], [ -73.784043748819954, 18.424715480734847 ], [ -73.751590949262891, 18.420426336905905 ], [ -73.718440517715692, 18.42187327683024 ], [ -73.698364224129648, 18.412261461297362 ], [ -73.681440191911292, 18.406990465537547 ], [ -73.658754239316693, 18.425077215940746 ], [ -73.626663174066209, 18.429314683825567 ], [ -73.599403855903233, 18.427040919802607 ], [ -73.581885546280944, 18.412778225234888 ], [ -73.567441982761295, 18.395828355494189 ], [ -73.545117763573899, 18.385079657500171 ], [ -73.554083624859402, 18.367819729396956 ], [ -73.56405717559818, 18.346270657464856 ], [ -73.513362596006971, 18.334023341803743 ], [ -73.449619716876441, 18.343738511922766 ], [ -73.418071254884467, 18.346632391771436 ], [ -73.386496955370205, 18.345598862997122 ], [ -73.350607672705905, 18.354487209916783 ], [ -73.319343430654783, 18.366631170991752 ], [ -73.2672794264044, 18.359758206575975 ], [ -73.214336921211952, 18.360740058506906 ], [ -73.188111130923915, 18.357742824971353 ], [ -73.162841355943783, 18.355003973854309 ], [ -73.140077888084079, 18.361515203963449 ], [ -73.115867479400663, 18.355107327541134 ], [ -73.077936977609397, 18.325755113407752 ], [ -73.046000942889179, 18.297488104892125 ], [ -73.037939419168822, 18.254028224922649 ], [ -73.012462937714417, 18.220903631797171 ], [ -73.010059984280815, 18.203385322174881 ], [ -73.006933560435471, 18.185970364440777 ], [ -73.008043724859107, 18.181064983390439 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HT-GA", "NAME_1": "Grand'Anse" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -73.796498175999943, 18.628648179000038 ], [ -73.772694464999915, 18.639349677000041 ], [ -73.739979620999918, 18.636867580000057 ], [ -73.714955206999946, 18.623480536000045 ], [ -73.714588995999918, 18.601304429000038 ], [ -73.737619594999899, 18.58820221600007 ], [ -73.769520636999914, 18.588364976000037 ], [ -73.794422980999911, 18.60187409100007 ], [ -73.796498175999943, 18.628648179000038 ] ] ], [ [ [ -74.452648045966384, 18.360980548059175 ], [ -74.454416469999899, 18.364813544000071 ], [ -74.456654425999943, 18.384344794000071 ], [ -74.46320553299995, 18.398179429000038 ], [ -74.489165818999936, 18.429388739000046 ], [ -74.454416469999899, 18.477769273000092 ], [ -74.457427537999934, 18.481756903000075 ], [ -74.461822068999936, 18.491441148000092 ], [ -74.443511522999927, 18.503810940000051 ], [ -74.431752081999946, 18.550116278000075 ], [ -74.416859503999945, 18.560370184000078 ], [ -74.414133266999897, 18.565578518000052 ], [ -74.415842251999948, 18.577297268000052 ], [ -74.419789191999939, 18.589829820000091 ], [ -74.423695441999939, 18.597601630000042 ], [ -74.426258917999917, 18.608221747000073 ], [ -74.418527798999946, 18.61749909100007 ], [ -74.384632941999939, 18.636297919000071 ], [ -74.340199347999942, 18.653387762000079 ], [ -74.321278449999909, 18.65656159100007 ], [ -74.298207160999937, 18.651190497000073 ], [ -74.287993943999936, 18.651516018000052 ], [ -74.283762173999946, 18.659654039000088 ], [ -74.278797980999911, 18.666571356000077 ], [ -74.267689581999946, 18.669623114000046 ], [ -74.255930141999897, 18.670314846000053 ], [ -74.199777798999946, 18.667303778000075 ], [ -74.159982876999948, 18.659165757000039 ], [ -74.029123501999948, 18.603745835000041 ], [ -73.971547003999945, 18.601304429000038 ], [ -73.969471808999913, 18.599798895000049 ], [ -73.962961391999897, 18.592840887000079 ], [ -73.96157792899993, 18.590765692000048 ], [ -73.95929928299995, 18.582993882000039 ], [ -73.953724738999938, 18.583563544000071 ], [ -73.946766730999911, 18.586981512000079 ], [ -73.940500454999949, 18.587632554000038 ], [ -73.911447719999899, 18.573187567000048 ], [ -73.898548956999946, 18.568793036000045 ], [ -73.853586391999897, 18.567206122000073 ], [ -73.842925584999932, 18.565252997000073 ], [ -73.831206834999932, 18.560370184000078 ], [ -73.809681769999941, 18.542792059000078 ], [ -73.803334113999938, 18.539252020000049 ], [ -73.793039516999897, 18.53851959800005 ], [ -73.788075324999909, 18.54132721600007 ], [ -73.784738735999952, 18.544867255000042 ], [ -73.779408331999946, 18.546698309000078 ], [ -73.769439256999931, 18.545152085000041 ], [ -73.757069464999915, 18.53937409100007 ], [ -73.748117641999897, 18.539252020000049 ], [ -73.742014126999948, 18.541937567000048 ], [ -73.739352953478388, 18.543810558507932 ], [ -73.739395311344538, 18.543726305024961 ], [ -73.74771521658397, 18.527293199221731 ], [ -73.765052659952289, 18.508482978406732 ], [ -73.760169236920717, 18.494530341302209 ], [ -73.743710292695823, 18.487192287993707 ], [ -73.766008674360819, 18.46331777609447 ], [ -73.784043748819954, 18.424715480734847 ], [ -73.815979784439492, 18.416137193076963 ], [ -73.84794165668211, 18.407868963781652 ], [ -73.87106686064709, 18.407817287837531 ], [ -73.89416622619035, 18.407300523000742 ], [ -73.908015509608049, 18.387560126198821 ], [ -73.906310187265319, 18.36384064393053 ], [ -73.953800828645285, 18.367509670135178 ], [ -74.001498175600318, 18.380428779364649 ], [ -74.043123542017838, 18.393761297945503 ], [ -74.085317349216268, 18.403631496796152 ], [ -74.186654833353884, 18.395931708281694 ], [ -74.287010463761874, 18.376398017054839 ], [ -74.341684129718772, 18.365339259798986 ], [ -74.397081265188206, 18.360119940882555 ], [ -74.424857347288707, 18.365080878279912 ], [ -74.448809373553729, 18.362652086424646 ], [ -74.452648045966384, 18.360980548059175 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HT-NO", "NAME_1": "Nord-Ouest" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -72.850575324999909, 20.08852773600006 ], [ -72.821685350999928, 20.089789130000042 ], [ -72.802398240999935, 20.087225653000075 ], [ -72.785145636999914, 20.080023505000042 ], [ -72.762440558999913, 20.067368882000039 ], [ -72.667795376999948, 20.032294012000079 ], [ -72.627552863999938, 20.008246161000045 ], [ -72.63890540299991, 19.984849351000037 ], [ -72.655140753999945, 19.991400458000044 ], [ -72.739857550999943, 20.002427476000037 ], [ -72.779164191999939, 20.016994533000059 ], [ -72.827748175999943, 20.027329820000091 ], [ -72.844309048999946, 20.034491278000075 ], [ -72.85578365799995, 20.032416083000044 ], [ -72.867665167999917, 20.028225002000056 ], [ -72.878488735999952, 20.026434637000079 ], [ -72.899403449999909, 20.030422268000052 ], [ -72.923898891999897, 20.038153387000079 ], [ -72.946115688999953, 20.048773505000042 ], [ -72.960357225999928, 20.061224677000041 ], [ -72.955962693999936, 20.06118398600006 ], [ -72.953195766999897, 20.062486070000091 ], [ -72.947377081999946, 20.067368882000039 ], [ -72.901112433999913, 20.082017320000091 ], [ -72.850575324999909, 20.08852773600006 ] ] ], [ [ [ -73.120799824652181, 19.62909590874915 ], [ -73.122141079999949, 19.62921784100007 ], [ -73.12718665299991, 19.626939195000091 ], [ -73.131825324999909, 19.622056382000039 ], [ -73.138417120999918, 19.617132880000042 ], [ -73.14907792899993, 19.614935614000046 ], [ -73.163929816999939, 19.618394273000035 ], [ -73.186024542999917, 19.627101955000057 ], [ -73.207590298999946, 19.638413804000038 ], [ -73.221099412999934, 19.649644273000035 ], [ -73.241281704999949, 19.631048895000049 ], [ -73.284250454999949, 19.62571849200009 ], [ -73.37954667899993, 19.630275783000059 ], [ -73.398426886999914, 19.634955145000049 ], [ -73.409494594999899, 19.635972398000035 ], [ -73.416574673999946, 19.640326239000046 ], [ -73.43423417899993, 19.659084377000056 ], [ -73.443959113999938, 19.663316148000035 ], [ -73.457834438999953, 19.67218659100007 ], [ -73.463368292999917, 19.69212474200009 ], [ -73.465240037999934, 19.713080145000049 ], [ -73.468129035999937, 19.724798895000049 ], [ -73.432443813999953, 19.778957424000055 ], [ -73.427154100999928, 19.790269273000035 ], [ -73.417347785999937, 19.790513414000088 ], [ -73.365101691999939, 19.813544012000079 ], [ -73.365101691999939, 19.820990302000041 ], [ -73.420318162999934, 19.820990302000041 ], [ -73.404164191999939, 19.832505601000037 ], [ -73.385121222999942, 19.834418036000045 ], [ -73.364735480999911, 19.832831122000073 ], [ -73.344593878999945, 19.834051825000074 ], [ -73.222767706999946, 19.886948960000041 ], [ -73.187123175999943, 19.911444403000075 ], [ -73.167103644999941, 19.937689520000049 ], [ -73.155140753999945, 19.923976955000057 ], [ -73.143706834999932, 19.920314846000053 ], [ -73.115305141999897, 19.923407294000071 ], [ -73.100697394999941, 19.921372789000088 ], [ -73.074330206999946, 19.912339585000041 ], [ -73.060373501999948, 19.910345770000049 ], [ -73.048451300999943, 19.910589911000045 ], [ -73.041818813999953, 19.911525783000059 ], [ -73.021839972999942, 19.916571356000077 ], [ -73.007069464999915, 19.918402411000045 ], [ -72.991769985999952, 19.917181708000044 ], [ -72.977894660999937, 19.912298895000049 ], [ -72.967274542999917, 19.902899481000077 ], [ -72.960113084999932, 19.918402411000045 ], [ -72.941273566999939, 19.92804596600007 ], [ -72.918324347999942, 19.930161851000037 ], [ -72.898996548999946, 19.923407294000071 ], [ -72.872303839999915, 19.933783270000049 ], [ -72.840443488999938, 19.941636460000041 ], [ -72.807118292999917, 19.94562409100007 ], [ -72.77603105399993, 19.943915106000077 ], [ -72.673980272999927, 19.921372789000088 ], [ -72.648833787999934, 19.906642971000053 ], [ -72.628041144999941, 19.897284247000073 ], [ -72.568714972999942, 19.879868882000039 ], [ -72.565176999019286, 19.875720913589248 ], [ -72.573239101903027, 19.870260321856335 ], [ -72.583160976697684, 19.856204331964307 ], [ -72.589568854019376, 19.844112046833459 ], [ -72.597862921736464, 19.838014227874282 ], [ -72.609025030880446, 19.828092353079626 ], [ -72.622125007263264, 19.817240302298103 ], [ -72.632692837204672, 19.818480535748108 ], [ -72.642563036055265, 19.824423325975715 ], [ -72.658582729809098, 19.82835073549802 ], [ -72.672535366014301, 19.824785061181615 ], [ -72.675842657912312, 19.812796128838272 ], [ -72.675584276393238, 19.80674998582316 ], [ -72.705995855924016, 19.810780748133027 ], [ -72.730542162290931, 19.794089259911402 ], [ -72.747181972769795, 19.78499420831605 ], [ -72.768162603921041, 19.779826565343683 ], [ -72.830303514395666, 19.729597072846616 ], [ -72.905776944350464, 19.717039699722363 ], [ -72.946627162613424, 19.724222724299295 ], [ -72.987916633146085, 19.727426663409744 ], [ -73.028224249949176, 19.736831773367612 ], [ -73.066774867566096, 19.733266099950526 ], [ -73.113826260273697, 19.686395575295535 ], [ -73.121810268728893, 19.631773587081341 ], [ -73.120799824652181, 19.62909590874915 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HT-ND", "NAME_1": "Nord" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -72.565176999019286, 19.875720913589248 ], [ -72.544341600999928, 19.851263739000046 ], [ -72.517567511999914, 19.834133205000057 ], [ -72.489735480999911, 19.824652411000045 ], [ -72.474436001999948, 19.834051825000074 ], [ -72.456206834999932, 19.82485586100006 ], [ -72.425933397999927, 19.813788153000075 ], [ -72.397572394999941, 19.80695221600007 ], [ -72.38508053299995, 19.810451565000051 ], [ -72.378732876999948, 19.794663804000038 ], [ -72.330433722999942, 19.752101955000057 ], [ -72.330433722999942, 19.745835679000038 ], [ -72.335194464999915, 19.747870184000078 ], [ -72.350900844999899, 19.752101955000057 ], [ -72.338246222999942, 19.72296784100007 ], [ -72.333851691999939, 19.718573309000078 ], [ -72.316151495999918, 19.714829820000091 ], [ -72.312408006999931, 19.716131903000075 ], [ -72.316151495999918, 19.724798895000049 ], [ -72.303089972999942, 19.739081122000073 ], [ -72.306385870999918, 19.739243882000039 ], [ -72.312896287999934, 19.738755601000037 ], [ -72.316151495999918, 19.739081122000073 ], [ -72.315907355999911, 19.740301825000074 ], [ -72.313832160999937, 19.744533596000053 ], [ -72.311390753999945, 19.747788804000038 ], [ -72.309925910999937, 19.745835679000038 ], [ -72.309925910999937, 19.752101955000057 ], [ -72.312245245999918, 19.755194403000075 ], [ -72.316151495999918, 19.765692450000074 ], [ -72.309925910999937, 19.765692450000074 ], [ -72.295074022999927, 19.758042710000041 ], [ -72.274647589999915, 19.756252346000053 ], [ -72.256418423999946, 19.761867580000057 ], [ -72.248443162999934, 19.776597398000035 ], [ -72.238392706999946, 19.786444403000075 ], [ -72.218658006999931, 19.786932684000078 ], [ -72.205230272999927, 19.776190497000073 ], [ -72.213734503999945, 19.752101955000057 ], [ -72.196766730999911, 19.74249909100007 ], [ -72.180409308999913, 19.74087148600006 ], [ -72.14085852799991, 19.747463283000059 ], [ -72.137440558999913, 19.747219143000052 ], [ -72.131825324999909, 19.745835679000038 ], [ -72.124908006999931, 19.741441148000035 ], [ -72.110503709999932, 19.727687893000052 ], [ -72.100819464999915, 19.724798895000049 ], [ -72.066314256999931, 19.724798895000049 ], [ -72.058216925999943, 19.722642320000091 ], [ -72.053781704999949, 19.717962958000044 ], [ -72.050607876999948, 19.713283596000053 ], [ -72.047915174375632, 19.712042611329856 ], [ -72.052728238017778, 19.702621975523755 ], [ -72.056526455431538, 19.695077215740923 ], [ -72.060996467313089, 19.656526598124003 ], [ -72.082338832770915, 19.626864324728786 ], [ -72.098384365845789, 19.623660387416919 ], [ -72.110502489398357, 19.616115628533407 ], [ -72.109779018986501, 19.602369697003894 ], [ -72.113706427609543, 19.589657294248696 ], [ -72.110735033395088, 19.566144517555415 ], [ -72.097273321806369, 19.542528388074629 ], [ -72.087041388649141, 19.512969469265556 ], [ -72.069988166120936, 19.486924547030185 ], [ -72.073088752443937, 19.460414536801409 ], [ -72.08301062723865, 19.445686754240285 ], [ -72.064613816674296, 19.440932522417938 ], [ -72.045958624590867, 19.435764879445628 ], [ -71.995522427418052, 19.387344062078796 ], [ -71.978882616039868, 19.335770982444842 ], [ -72.050919561988167, 19.30088939103257 ], [ -72.120062628987114, 19.260065009392633 ], [ -72.1394671290048, 19.258308010206463 ], [ -72.148639695865256, 19.271382148167561 ], [ -72.170550503003312, 19.292104396900356 ], [ -72.200057745868264, 19.301922918907565 ], [ -72.210522223921487, 19.328846340286361 ], [ -72.227213711243792, 19.357268378432877 ], [ -72.231967943066081, 19.385742092523515 ], [ -72.226800300093771, 19.413440660258232 ], [ -72.243620977725925, 19.449149074869865 ], [ -72.28379940511843, 19.467804266953351 ], [ -72.32237586115707, 19.501652330490629 ], [ -72.327207608244521, 19.565162664725165 ], [ -72.346457078631261, 19.574464422794847 ], [ -72.361029833360135, 19.58149241774089 ], [ -72.378186407776468, 19.580045477816554 ], [ -72.396634894284944, 19.56335399049425 ], [ -72.416530320717698, 19.563974107219281 ], [ -72.416633674404522, 19.538084215514118 ], [ -72.446657681207, 19.528989163019446 ], [ -72.482391934240354, 19.543045152012155 ], [ -72.512648485039563, 19.566092840712031 ], [ -72.54034705277428, 19.591931057372392 ], [ -72.556831835420837, 19.632652086224766 ], [ -72.570603603573431, 19.672442939090331 ], [ -72.594788173835127, 19.682261461097539 ], [ -72.607268032593595, 19.699418036413249 ], [ -72.597862921736464, 19.733214423107142 ], [ -72.618714361678428, 19.74778717693664 ], [ -72.640289272931568, 19.744996649875475 ], [ -72.643183152780239, 19.767320868163495 ], [ -72.663724535259064, 19.782565416460784 ], [ -72.675584276393238, 19.80674998582316 ], [ -72.675842657912312, 19.812796128838272 ], [ -72.672535366014301, 19.824785061181615 ], [ -72.658582729809098, 19.82835073549802 ], [ -72.642563036055265, 19.824423325975715 ], [ -72.632692837204672, 19.818480535748108 ], [ -72.622125007263264, 19.817240302298103 ], [ -72.609025030880446, 19.828092353079626 ], [ -72.597862921736464, 19.838014227874282 ], [ -72.589568854019376, 19.844112046833459 ], [ -72.583160976697684, 19.856204331964307 ], [ -72.573239101903027, 19.870260321856335 ], [ -72.565176999019286, 19.875720913589248 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HT-AR", "NAME_1": "L'Artibonite" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -72.7060447007661, 18.944241285750444 ], [ -72.708729620999918, 18.945542710000041 ], [ -72.813547329999949, 19.052923895000049 ], [ -72.818348761999914, 19.078558661000045 ], [ -72.77603105399993, 19.094794012000079 ], [ -72.737660285999937, 19.097235419000071 ], [ -72.716460740999935, 19.103949286000045 ], [ -72.707183397999927, 19.118638414000088 ], [ -72.71312415299991, 19.13743724200009 ], [ -72.727691209999932, 19.14720286700009 ], [ -72.745838995999918, 19.153794664000088 ], [ -72.762440558999913, 19.163072007000039 ], [ -72.773019985999952, 19.175767320000091 ], [ -72.797027147999927, 19.216009833000044 ], [ -72.80337480399993, 19.231919664000088 ], [ -72.796538865999935, 19.236558335000041 ], [ -72.795765753999945, 19.238348700000074 ], [ -72.796864386999914, 19.240301825000074 ], [ -72.795969204999949, 19.245591539000088 ], [ -72.786203579999949, 19.254299221000053 ], [ -72.775217251999948, 19.277329820000091 ], [ -72.768625454999949, 19.28656647300005 ], [ -72.757679816999939, 19.291693427000041 ], [ -72.741810675999943, 19.294663804000038 ], [ -72.725697394999941, 19.295314846000053 ], [ -72.713978644999941, 19.293402411000045 ], [ -72.728342251999948, 19.320379950000074 ], [ -72.738677537999934, 19.325873114000046 ], [ -72.758697068999936, 19.32758209800005 ], [ -72.770578579999949, 19.336167710000041 ], [ -72.774484829999949, 19.355698960000041 ], [ -72.772938605999911, 19.376450914000088 ], [ -72.768625454999949, 19.38898346600007 ], [ -72.762318488999938, 19.382757880000042 ], [ -72.753977016999897, 19.377346096000053 ], [ -72.74437415299991, 19.37445709800005 ], [ -72.734486456999946, 19.375921942000048 ], [ -72.723459438999953, 19.383490302000041 ], [ -72.72288977799991, 19.390814520000049 ], [ -72.726429816999939, 19.39907461100006 ], [ -72.728098110999952, 19.422064520000049 ], [ -72.730620897999927, 19.42641836100006 ], [ -72.728342251999948, 19.425604559000078 ], [ -72.713978644999941, 19.423163153000075 ], [ -72.708973761999914, 19.420152085000041 ], [ -72.701975063999953, 19.414496161000045 ], [ -72.692372199999909, 19.409735419000071 ], [ -72.679839647999927, 19.409491278000075 ], [ -72.699126756999931, 19.445868231000077 ], [ -72.70921790299991, 19.451239325000074 ], [ -72.760894334999932, 19.454331773000035 ], [ -72.773996548999946, 19.463364976000037 ], [ -72.782785610999952, 19.476711330000057 ], [ -72.795969204999949, 19.492010809000078 ], [ -72.81476803299995, 19.504828192000048 ], [ -72.878488735999952, 19.532375393000052 ], [ -72.931548631999931, 19.563462632000039 ], [ -72.950510219999899, 19.567775783000059 ], [ -72.966908331999946, 19.575018622000073 ], [ -73.00218665299991, 19.603461005000042 ], [ -73.008859829999949, 19.604966539000088 ], [ -73.018869594999899, 19.600734768000052 ], [ -73.080799933999913, 19.622381903000075 ], [ -73.091053839999915, 19.623480536000045 ], [ -73.110747850999928, 19.628119208000044 ], [ -73.120799824652181, 19.62909590874915 ], [ -73.121810268728893, 19.631773587081341 ], [ -73.113826260273697, 19.686395575295535 ], [ -73.066774867566096, 19.733266099950526 ], [ -73.028224249949176, 19.736831773367612 ], [ -72.987916633146085, 19.727426663409744 ], [ -72.946627162613424, 19.724222724299295 ], [ -72.905776944350464, 19.717039699722363 ], [ -72.830303514395666, 19.729597072846616 ], [ -72.768162603921041, 19.779826565343683 ], [ -72.747181972769795, 19.78499420831605 ], [ -72.730542162290931, 19.794089259911402 ], [ -72.705995855924016, 19.810780748133027 ], [ -72.675584276393238, 19.80674998582316 ], [ -72.663724535259064, 19.782565416460784 ], [ -72.643183152780239, 19.767320868163495 ], [ -72.640289272931568, 19.744996649875475 ], [ -72.618714361678428, 19.74778717693664 ], [ -72.597862921736464, 19.733214423107142 ], [ -72.607268032593595, 19.699418036413249 ], [ -72.594788173835127, 19.682261461097539 ], [ -72.570603603573431, 19.672442939090331 ], [ -72.556831835420837, 19.632652086224766 ], [ -72.54034705277428, 19.591931057372392 ], [ -72.512648485039563, 19.566092840712031 ], [ -72.482391934240354, 19.543045152012155 ], [ -72.446657681207, 19.528989163019446 ], [ -72.416633674404522, 19.538084215514118 ], [ -72.416530320717698, 19.563974107219281 ], [ -72.396634894284944, 19.56335399049425 ], [ -72.378186407776468, 19.580045477816554 ], [ -72.361029833360135, 19.58149241774089 ], [ -72.346457078631261, 19.574464422794847 ], [ -72.327207608244521, 19.565162664725165 ], [ -72.32237586115707, 19.501652330490629 ], [ -72.28379940511843, 19.467804266953351 ], [ -72.243620977725925, 19.449149074869865 ], [ -72.226800300093771, 19.413440660258232 ], [ -72.231967943066081, 19.385742092523515 ], [ -72.227213711243792, 19.357268378432877 ], [ -72.210522223921487, 19.328846340286361 ], [ -72.200057745868264, 19.301922918907565 ], [ -72.245868903327221, 19.240893053371678 ], [ -72.251579148658777, 19.168494371318161 ], [ -72.224707404123365, 19.143069565807821 ], [ -72.234060838137168, 19.121778876294115 ], [ -72.231890427800977, 19.097490953244858 ], [ -72.225120816172705, 19.067880356693081 ], [ -72.238892585224619, 19.017082424314424 ], [ -72.232794766265442, 18.96705963829163 ], [ -72.229926723939172, 18.940549628062854 ], [ -72.243672654569366, 18.908045152561726 ], [ -72.247445033561462, 18.877142645716503 ], [ -72.270957811154062, 18.864430242961305 ], [ -72.318396775690644, 18.869701238721177 ], [ -72.365189785080531, 18.867014065346837 ], [ -72.388625047408027, 18.889958401259207 ], [ -72.415548468786767, 18.908665269286757 ], [ -72.441955126228095, 18.918793850555744 ], [ -72.466914841946391, 18.929025783712916 ], [ -72.476940070427872, 18.944425360741775 ], [ -72.487740445265331, 18.958894761783824 ], [ -72.512493456307936, 18.957809557065389 ], [ -72.536006232101897, 18.960393378551544 ], [ -72.611531338000816, 18.970573634865332 ], [ -72.675274217131403, 18.972847397989028 ], [ -72.692017381297092, 18.961168524907464 ], [ -72.7060447007661, 18.944241285750444 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HT-NI", "NAME_1": "Nippes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -73.739352953478388, 18.543810558507932 ], [ -73.729237433999913, 18.550930080000057 ], [ -73.725087042999917, 18.552923895000049 ], [ -73.723866339999915, 18.55532461100006 ], [ -73.71117102799991, 18.570257880000042 ], [ -73.704457160999937, 18.573472398000092 ], [ -73.696522589999915, 18.573797919000071 ], [ -73.688303188999953, 18.573146877000056 ], [ -73.680409308999913, 18.573431708000044 ], [ -73.63508053299995, 18.585923570000091 ], [ -73.622059699999909, 18.587632554000038 ], [ -73.586415167999917, 18.579169012000079 ], [ -73.585845506999931, 18.561997789000088 ], [ -73.60610917899993, 18.549017645000049 ], [ -73.632639126999948, 18.552923895000049 ], [ -73.632639126999948, 18.546698309000078 ], [ -73.654204881999931, 18.553615627000056 ], [ -73.673451300999943, 18.55609772300005 ], [ -73.692779100999928, 18.554022528000075 ], [ -73.714588995999918, 18.546698309000078 ], [ -73.707997199999909, 18.54242584800005 ], [ -73.691395636999914, 18.534002997000073 ], [ -73.674916144999941, 18.530178127000056 ], [ -73.673817511999914, 18.524318752000056 ], [ -73.674224412999934, 18.516669012000079 ], [ -73.669829881999931, 18.508856512000079 ], [ -73.652211066999939, 18.501369533000059 ], [ -73.620432094999899, 18.505764065000051 ], [ -73.604725714999915, 18.498277085000041 ], [ -73.569650844999899, 18.518377997000073 ], [ -73.526682094999899, 18.523504950000074 ], [ -73.368519660999937, 18.511948960000041 ], [ -73.34829667899993, 18.507635809000078 ], [ -73.308461066999939, 18.488348700000074 ], [ -73.286244269999941, 18.484035549000055 ], [ -73.206125454999949, 18.486802476000037 ], [ -73.166981574999909, 18.483547268000052 ], [ -73.131703253999945, 18.47101471600007 ], [ -73.113148566999939, 18.460760809000078 ], [ -73.098011847999942, 18.455267645000049 ], [ -73.081166144999941, 18.454169012000079 ], [ -73.055945009354673, 18.45845306255876 ], [ -73.05023840987468, 18.447298082340637 ], [ -73.049747484358932, 18.435205797209733 ], [ -73.06527625169764, 18.410246079692797 ], [ -73.063028326995664, 18.383374335157441 ], [ -73.038042771956327, 18.382392483226511 ], [ -73.020757005431449, 18.365804347792391 ], [ -73.013393113701227, 18.34151642474319 ], [ -72.997735155153293, 18.322757879872256 ], [ -73.001688402197999, 18.293095608275678 ], [ -73.014504156841326, 18.264828599760051 ], [ -73.014426643374861, 18.242866115778611 ], [ -73.012462937714417, 18.220903631797171 ], [ -73.037939419168822, 18.254028224922649 ], [ -73.046000942889179, 18.297488104892125 ], [ -73.077936977609397, 18.325755113407752 ], [ -73.115867479400663, 18.355107327541134 ], [ -73.140077888084079, 18.361515203963449 ], [ -73.162841355943783, 18.355003973854309 ], [ -73.188111130923915, 18.357742824971353 ], [ -73.214336921211952, 18.360740058506906 ], [ -73.2672794264044, 18.359758206575975 ], [ -73.319343430654783, 18.366631170991752 ], [ -73.350607672705905, 18.354487209916783 ], [ -73.386496955370205, 18.345598862997122 ], [ -73.418071254884467, 18.346632391771436 ], [ -73.449619716876441, 18.343738511922766 ], [ -73.513362596006971, 18.334023341803743 ], [ -73.56405717559818, 18.346270657464856 ], [ -73.554083624859402, 18.367819729396956 ], [ -73.545117763573899, 18.385079657500171 ], [ -73.567441982761295, 18.395828355494189 ], [ -73.581885546280944, 18.412778225234888 ], [ -73.599403855903233, 18.427040919802607 ], [ -73.626663174066209, 18.429314683825567 ], [ -73.658754239316693, 18.425077215940746 ], [ -73.681440191911292, 18.406990465537547 ], [ -73.698364224129648, 18.412261461297362 ], [ -73.718440517715692, 18.42187327683024 ], [ -73.751590949262891, 18.420426336905905 ], [ -73.784043748819954, 18.424715480734847 ], [ -73.766008674360819, 18.46331777609447 ], [ -73.743710292695823, 18.487192287993707 ], [ -73.760169236920717, 18.494530341302209 ], [ -73.765052659952289, 18.508482978406732 ], [ -73.74771521658397, 18.527293199221731 ], [ -73.739395311344538, 18.543726305024961 ], [ -73.739352953478388, 18.543810558507932 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/honduras.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/honduras.geojson new file mode 100644 index 000000000000..921c5d956b1d --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/honduras.geojson @@ -0,0 +1,24 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "HN-OC", "NAME_1": "Ocotepeque" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.346206290288023, 14.413075726263742 ], [ -89.36162084999998, 14.415477804000062 ], [ -89.363791259999886, 14.44656117800011 ], [ -89.361982584999879, 14.462400004000102 ], [ -89.355497192999934, 14.475448303000064 ], [ -89.345265258999945, 14.481959534000026 ], [ -89.323044392999918, 14.487463074000118 ], [ -89.31480200199988, 14.495963847000041 ], [ -89.304854288999962, 14.513352966000056 ], [ -89.290927489999973, 14.528003235000128 ], [ -89.259611571999869, 14.554254862000064 ], [ -89.250542358999894, 14.565184428000038 ], [ -89.245684774999887, 14.572987570000066 ], [ -89.238114176999915, 14.577948507000102 ], [ -89.221086791999909, 14.580093079000093 ], [ -89.208813639999875, 14.577948507000102 ], [ -89.183698893999946, 14.569525248000019 ], [ -89.172149210999919, 14.570403747000057 ], [ -89.16039282299991, 14.581281637000103 ], [ -89.155741943999942, 14.59784393400011 ], [ -89.155225179999917, 14.615594788000038 ], [ -89.159410970999943, 14.665979309000122 ], [ -89.155845295999967, 14.672257995000038 ], [ -89.145225789999898, 14.683445943000066 ], [ -89.142693644999895, 14.691274923 ], [ -89.144502319999901, 14.708302308000029 ], [ -89.14621323435324, 14.710857663850106 ], [ -89.13103980174543, 14.715071113541057 ], [ -89.098664516554152, 14.724476223498925 ], [ -89.08556454107071, 14.728920396059436 ], [ -89.02564571777566, 14.720807197294278 ], [ -89.010271980067785, 14.699981593975394 ], [ -89.00308895459159, 14.669854234385411 ], [ -88.994562343777147, 14.655643214862437 ], [ -88.930561083127486, 14.608565986431131 ], [ -88.92425655769398, 14.594871730845682 ], [ -88.924824999374209, 14.568723455822806 ], [ -88.923223028919608, 14.561282049726799 ], [ -88.909916347861156, 14.540869859356519 ], [ -88.892656419757941, 14.523248196047405 ], [ -88.874802211552776, 14.515910141839584 ], [ -88.861211310553529, 14.512551173997451 ], [ -88.849196539788466, 14.502680976046179 ], [ -88.836820034716823, 14.500303860135034 ], [ -88.826665615925435, 14.50330109277121 ], [ -88.824030117595839, 14.50500641511394 ], [ -88.82483110237348, 14.508313707011951 ], [ -88.827208218284625, 14.511414293334951 ], [ -88.827621630333965, 14.515496730689563 ], [ -88.827724982222151, 14.527433987088841 ], [ -88.824340175958355, 14.535185452446683 ], [ -88.817079637015638, 14.539991360213094 ], [ -88.800594855268344, 14.545985826384765 ], [ -88.790983038836146, 14.54856964787092 ], [ -88.781810471975689, 14.550016587795255 ], [ -88.773774786677052, 14.54991323500775 ], [ -88.754318609815982, 14.546760972740685 ], [ -88.730521613181907, 14.54877635344593 ], [ -88.721297370377329, 14.545262355972909 ], [ -88.718687709570133, 14.543350328055169 ], [ -88.715328741728058, 14.528054103813815 ], [ -88.741399502385093, 14.453795070685942 ], [ -88.743750779874574, 14.442167874447819 ], [ -88.74713558613837, 14.438085435294568 ], [ -88.752690802738357, 14.433227851584093 ], [ -88.760648972771833, 14.428783678124205 ], [ -88.789587774855931, 14.419378567267074 ], [ -88.810749274059731, 14.42237579990325 ], [ -88.817389696277417, 14.426871650206465 ], [ -88.819456752926783, 14.42656159094463 ], [ -88.820877855328717, 14.424236151876869 ], [ -88.823177455974815, 14.414934393807187 ], [ -88.82348751523665, 14.408009752548026 ], [ -88.822970751299124, 14.403152167038854 ], [ -88.810645922171545, 14.386822414922506 ], [ -88.836406622667482, 14.386357326929101 ], [ -88.847852952651635, 14.391421617113906 ], [ -88.853278978042397, 14.396537584142152 ], [ -88.862864956052874, 14.40769969328619 ], [ -88.870099656573871, 14.407803046073695 ], [ -88.875629034752137, 14.405891018155955 ], [ -88.877954474719218, 14.396124172092868 ], [ -88.879194709068543, 14.383153387818595 ], [ -88.885499233602729, 14.369252428456775 ], [ -88.890666876575096, 14.360777492687134 ], [ -88.923403896972275, 14.345998033282569 ], [ -88.939397753203707, 14.344241034096456 ], [ -88.945960660156345, 14.339796861535945 ], [ -88.952110155059586, 14.332872219377407 ], [ -88.960765957083254, 14.319229641534719 ], [ -88.96683793762071, 14.312615057738697 ], [ -88.973891770988416, 14.306775621197971 ], [ -88.977870855555523, 14.301401271751274 ], [ -88.978878546807493, 14.293804836024322 ], [ -88.971204596714756, 14.269310208299487 ], [ -88.969060024800285, 14.236960761529929 ], [ -88.970228476163243, 14.210176262024845 ], [ -88.970791991999903, 14.214844056000047 ], [ -88.974564371999918, 14.227375590000051 ], [ -88.983530232999868, 14.242129211000062 ], [ -88.992754475999874, 14.252955424000106 ], [ -89.018127604999876, 14.27168813100009 ], [ -89.02262345399987, 14.28065399200004 ], [ -89.026602539999942, 14.311298117000149 ], [ -89.032984578999901, 14.323674622000027 ], [ -89.048978434999924, 14.331451925000039 ], [ -89.083084879999916, 14.335327657000079 ], [ -89.094479532999912, 14.34486195900007 ], [ -89.090552123999942, 14.354706320000048 ], [ -89.089673624999904, 14.364886577000021 ], [ -89.091844035999884, 14.374834290000109 ], [ -89.096830810999847, 14.384006856000013 ], [ -89.10256689499991, 14.391525777000055 ], [ -89.107476155999933, 14.395969951000069 ], [ -89.113341430999924, 14.397055156000064 ], [ -89.122178100999918, 14.394678040000102 ], [ -89.130110432999885, 14.38674570700006 ], [ -89.144502319999901, 14.35971893300011 ], [ -89.153984944999962, 14.351295675000117 ], [ -89.200157836999921, 14.36467987000006 ], [ -89.225530965999923, 14.382146505 ], [ -89.276535604999964, 14.392740173000078 ], [ -89.30756730199991, 14.407054546000069 ], [ -89.346206290288023, 14.413075726263742 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-LE", "NAME_1": "Lempira" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.957175252999889, 14.18518178300009 ], [ -88.965986083999979, 14.19138295500008 ], [ -88.969241699999969, 14.202002462000067 ], [ -88.970228476163243, 14.210176262024845 ], [ -88.969060024800285, 14.236960761529929 ], [ -88.971204596714756, 14.269310208299487 ], [ -88.978878546807493, 14.293804836024322 ], [ -88.977870855555523, 14.301401271751274 ], [ -88.973891770988416, 14.306775621197971 ], [ -88.96683793762071, 14.312615057738697 ], [ -88.960765957083254, 14.319229641534719 ], [ -88.952110155059586, 14.332872219377407 ], [ -88.945960660156345, 14.339796861535945 ], [ -88.939397753203707, 14.344241034096456 ], [ -88.923403896972275, 14.345998033282569 ], [ -88.890666876575096, 14.360777492687134 ], [ -88.885499233602729, 14.369252428456775 ], [ -88.879194709068543, 14.383153387818595 ], [ -88.877954474719218, 14.396124172092868 ], [ -88.875629034752137, 14.405891018155955 ], [ -88.870099656573871, 14.407803046073695 ], [ -88.862864956052874, 14.40769969328619 ], [ -88.853278978042397, 14.396537584142152 ], [ -88.847852952651635, 14.391421617113906 ], [ -88.836406622667482, 14.386357326929101 ], [ -88.810645922171545, 14.386822414922506 ], [ -88.822970751299124, 14.403152167038854 ], [ -88.82348751523665, 14.408009752548026 ], [ -88.823177455974815, 14.414934393807187 ], [ -88.820877855328717, 14.424236151876869 ], [ -88.819456752926783, 14.42656159094463 ], [ -88.817389696277417, 14.426871650206465 ], [ -88.810749274059731, 14.42237579990325 ], [ -88.789587774855931, 14.419378567267074 ], [ -88.760648972771833, 14.428783678124205 ], [ -88.752690802738357, 14.433227851584093 ], [ -88.74713558613837, 14.438085435294568 ], [ -88.743750779874574, 14.442167874447819 ], [ -88.741399502385093, 14.453795070685942 ], [ -88.715328741728058, 14.528054103813815 ], [ -88.718687709570133, 14.543350328055169 ], [ -88.721297370377329, 14.545262355972909 ], [ -88.730521613181907, 14.54877635344593 ], [ -88.733596361083187, 14.609237779100226 ], [ -88.745559455004809, 14.630270087094857 ], [ -88.752768317104142, 14.640760403569743 ], [ -88.783283251221064, 14.668975735241986 ], [ -88.794109462681547, 14.694452215797128 ], [ -88.794703741884177, 14.698586330894443 ], [ -88.792843390809821, 14.713520819929897 ], [ -88.778089768927657, 14.718223374908803 ], [ -88.728196174114146, 14.712487291155526 ], [ -88.692048509031451, 14.715071113541057 ], [ -88.663729824571703, 14.723080960417974 ], [ -88.655900844848077, 14.723856105874574 ], [ -88.654970668861267, 14.729747219258741 ], [ -88.655513272119777, 14.735483303012018 ], [ -88.659776576627678, 14.753570055213856 ], [ -88.67006018842693, 14.775945950345317 ], [ -88.676803961633482, 14.787004705802531 ], [ -88.677811651986133, 14.801887518893864 ], [ -88.676313036117733, 14.815013332799083 ], [ -88.673832567419026, 14.823281562094394 ], [ -88.669543422690765, 14.830877996922027 ], [ -88.664117398199323, 14.835890611162768 ], [ -88.656856859256607, 14.844572252507419 ], [ -88.654815640129698, 14.84901642506793 ], [ -88.656624315259933, 14.859765123061948 ], [ -88.643317634201424, 14.869273585807321 ], [ -88.639286871891613, 14.895783596036097 ], [ -88.644609545394189, 14.927357896449735 ], [ -88.609262865089136, 14.937693183293732 ], [ -88.601692267783903, 14.941672267860838 ], [ -88.555105963969027, 14.934799303445061 ], [ -88.533220995252691, 14.878368639201312 ], [ -88.505625780305479, 14.834443671238432 ], [ -88.487306485006286, 14.811912747375402 ], [ -88.479632534913549, 14.814393215174732 ], [ -88.463716193047844, 14.827415676292389 ], [ -88.453587612678177, 14.843228665370589 ], [ -88.442347989168354, 14.853874010577101 ], [ -88.433640510301302, 14.854545803246197 ], [ -88.422400885892159, 14.849843248267291 ], [ -88.420230475555968, 14.847569485143595 ], [ -88.407776455219221, 14.830619615402895 ], [ -88.381033901893034, 14.831188056183805 ], [ -88.360518357835929, 14.819199123840463 ], [ -88.388837043194997, 14.772225247297285 ], [ -88.383049282598279, 14.765817369076331 ], [ -88.367003750422725, 14.739514065321828 ], [ -88.352508510959012, 14.731814276807427 ], [ -88.335739509270923, 14.729695543314676 ], [ -88.32336300329996, 14.731194159183076 ], [ -88.316800096347379, 14.719515286101569 ], [ -88.322277797682204, 14.688922838518181 ], [ -88.34377519367024, 14.654299627725607 ], [ -88.333879157297247, 14.636006170848077 ], [ -88.322510341678935, 14.573167629282636 ], [ -88.342224900958399, 14.538234361026923 ], [ -88.348064338398501, 14.519320787424363 ], [ -88.350053880682026, 14.507641913443535 ], [ -88.360492520313528, 14.491002102065352 ], [ -88.388036058417356, 14.476894436229259 ], [ -88.411574672633037, 14.473587144331248 ], [ -88.457049934207078, 14.474052232324652 ], [ -88.481544562831289, 14.466817531803656 ], [ -88.498236050153594, 14.456378892172097 ], [ -88.501465826786443, 14.448627427713632 ], [ -88.494618699893067, 14.407079576561216 ], [ -88.474723272560936, 14.38113800711335 ], [ -88.454259406246592, 14.363671373435125 ], [ -88.432374436630937, 14.360984198262145 ], [ -88.428834601635515, 14.357521876733188 ], [ -88.422375048369759, 14.348995265918745 ], [ -88.411729702263926, 14.299075833582833 ], [ -88.413409187084312, 14.280989081380994 ], [ -88.423046841038854, 14.260525214167274 ], [ -88.423925341081599, 14.253393866433782 ], [ -88.421496548327013, 14.2479161650989 ], [ -88.416742315605347, 14.244402166726616 ], [ -88.4112129383264, 14.241301581302935 ], [ -88.40467586889622, 14.238407701454264 ], [ -88.398578049937043, 14.234376939144397 ], [ -88.392712774974541, 14.231328030564157 ], [ -88.387984381573915, 14.229674384165492 ], [ -88.383979457685825, 14.229467677691161 ], [ -88.379121873975294, 14.230501207364796 ], [ -88.374031745368711, 14.230759588883927 ], [ -88.367804735200366, 14.230346177733907 ], [ -88.346100632738001, 14.22579865238589 ], [ -88.328168911066371, 14.215618394273463 ], [ -88.326541103988745, 14.20533478427285 ], [ -88.327910528647976, 14.201355698806424 ], [ -88.327936367969016, 14.191692206430162 ], [ -88.32832394069726, 14.187506415388725 ], [ -88.326773647985476, 14.166060696244131 ], [ -88.320055712301269, 14.122032376393065 ], [ -88.322277797682204, 14.107873032814211 ], [ -88.3256367664236, 14.105030828909605 ], [ -88.331011114970977, 14.099294745156328 ], [ -88.332561407682817, 14.094747218908992 ], [ -88.333517422091347, 14.088649399949816 ], [ -88.333517422091347, 14.080897935491294 ], [ -88.336204597264327, 14.076815497237419 ], [ -88.338995124325493, 14.075213528581457 ], [ -88.34377519367024, 14.074076646120318 ], [ -88.352999437374137, 14.070459295859791 ], [ -88.375297818139757, 14.050667223113862 ], [ -88.431211716647397, 14.018731187494268 ], [ -88.463509488372154, 14.004571844814791 ], [ -88.480149298851018, 13.992169501321428 ], [ -88.483043178699745, 13.98757029912997 ], [ -88.483766649111544, 13.984986476744496 ], [ -88.494928758255583, 13.970362046970877 ], [ -88.497085348999917, 13.969068092000015 ], [ -88.496505696999918, 13.969561870000106 ], [ -88.49619563899995, 13.971990662000067 ], [ -88.495420491999937, 13.97514292400011 ], [ -88.50436051499986, 13.983695374000135 ], [ -88.514049845999892, 13.987648621000119 ], [ -88.558104003999858, 13.990904236000105 ], [ -88.633861653999958, 14.014468689000097 ], [ -88.659338135999889, 14.016122335000148 ], [ -88.684814615999898, 14.012298279000021 ], [ -88.690938272999858, 14.009998678000088 ], [ -88.690811757999967, 14.011789871000062 ], [ -88.690447346999917, 14.016949157000084 ], [ -88.692695272999941, 14.025294902000056 ], [ -88.697656209999877, 14.032012838000071 ], [ -88.704865071999848, 14.038033142000103 ], [ -88.709515950999901, 14.039686788000054 ], [ -88.730961669999942, 14.042477316000117 ], [ -88.746645466999894, 14.052476705000032 ], [ -88.746077026999842, 14.066558533000062 ], [ -88.740056722999896, 14.083017477000041 ], [ -88.73922989999997, 14.099941508000128 ], [ -88.746387085999913, 14.111336162000029 ], [ -88.755120401999903, 14.110457662000087 ], [ -88.765429850999908, 14.104256490000097 ], [ -88.777341268999919, 14.099734802000071 ], [ -88.821188720999942, 14.102938741000045 ], [ -88.838758707999915, 14.100406596000056 ], [ -88.845321614999904, 14.128621928000115 ], [ -88.860333618999874, 14.158516744000053 ], [ -88.881262572999873, 14.184199931000123 ], [ -88.906015584999892, 14.199573670000092 ], [ -88.921647704999941, 14.199883728000088 ], [ -88.935626180999947, 14.194018453000083 ], [ -88.94748592199997, 14.187274679000055 ], [ -88.957175252999889, 14.18518178300009 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-IN", "NAME_1": "Intibucá" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.497900960999914, 13.968373311000079 ], [ -88.497085348999917, 13.969068092000015 ], [ -88.494928758255583, 13.970362046970877 ], [ -88.483766649111544, 13.984986476744496 ], [ -88.483043178699745, 13.98757029912997 ], [ -88.480149298851018, 13.992169501321428 ], [ -88.463509488372154, 14.004571844814791 ], [ -88.431211716647397, 14.018731187494268 ], [ -88.375297818139757, 14.050667223113862 ], [ -88.352999437374137, 14.070459295859791 ], [ -88.34377519367024, 14.074076646120318 ], [ -88.338995124325493, 14.075213528581457 ], [ -88.336204597264327, 14.076815497237419 ], [ -88.333517422091347, 14.080897935491294 ], [ -88.333517422091347, 14.088649399949816 ], [ -88.332561407682817, 14.094747218908992 ], [ -88.331011114970977, 14.099294745156328 ], [ -88.3256367664236, 14.105030828909605 ], [ -88.322277797682204, 14.107873032814211 ], [ -88.320055712301269, 14.122032376393065 ], [ -88.326773647985476, 14.166060696244131 ], [ -88.32832394069726, 14.187506415388725 ], [ -88.327936367969016, 14.191692206430162 ], [ -88.327910528647976, 14.201355698806424 ], [ -88.326541103988745, 14.20533478427285 ], [ -88.328168911066371, 14.215618394273463 ], [ -88.346100632738001, 14.22579865238589 ], [ -88.367804735200366, 14.230346177733907 ], [ -88.374031745368711, 14.230759588883927 ], [ -88.379121873975294, 14.230501207364796 ], [ -88.383979457685825, 14.229467677691161 ], [ -88.387984381573915, 14.229674384165492 ], [ -88.392712774974541, 14.231328030564157 ], [ -88.398578049937043, 14.234376939144397 ], [ -88.40467586889622, 14.238407701454264 ], [ -88.4112129383264, 14.241301581302935 ], [ -88.416742315605347, 14.244402166726616 ], [ -88.421496548327013, 14.2479161650989 ], [ -88.423925341081599, 14.253393866433782 ], [ -88.423046841038854, 14.260525214167274 ], [ -88.413409187084312, 14.280989081380994 ], [ -88.411729702263926, 14.299075833582833 ], [ -88.422375048369759, 14.348995265918745 ], [ -88.428834601635515, 14.357521876733188 ], [ -88.432374436630937, 14.360984198262145 ], [ -88.454259406246592, 14.363671373435125 ], [ -88.474723272560936, 14.38113800711335 ], [ -88.494618699893067, 14.407079576561216 ], [ -88.501465826786443, 14.448627427713632 ], [ -88.498236050153594, 14.456378892172097 ], [ -88.481544562831289, 14.466817531803656 ], [ -88.457049934207078, 14.474052232324652 ], [ -88.411574672633037, 14.473587144331248 ], [ -88.388036058417356, 14.476894436229259 ], [ -88.360492520313528, 14.491002102065352 ], [ -88.350053880682026, 14.507641913443535 ], [ -88.348064338398501, 14.519320787424363 ], [ -88.342224900958399, 14.538234361026923 ], [ -88.322510341678935, 14.573167629282636 ], [ -88.333879157297247, 14.636006170848077 ], [ -88.34377519367024, 14.654299627725607 ], [ -88.265950487125281, 14.64877025044666 ], [ -88.207452766232166, 14.654764715719068 ], [ -88.16321773990677, 14.658640448397932 ], [ -88.129628058787887, 14.652025865501287 ], [ -88.100430874285394, 14.649287014384186 ], [ -88.093351203395287, 14.654454657356553 ], [ -88.074954392830932, 14.664841620144614 ], [ -88.061311814988244, 14.64649648732302 ], [ -88.056144172015934, 14.64417104735594 ], [ -88.04622229722122, 14.641173813820444 ], [ -88.038729214281773, 14.640295315576338 ], [ -88.00420935717608, 14.631561998287566 ], [ -87.987337001801166, 14.619469713156718 ], [ -87.969146897711141, 14.613061834935706 ], [ -87.959767626174994, 14.600917873860794 ], [ -87.951602748767812, 14.585880032037835 ], [ -87.950646735258601, 14.582159328989803 ], [ -87.949639044906007, 14.571824042145806 ], [ -87.947365281782311, 14.56536448798073 ], [ -87.940983242882339, 14.553065497274872 ], [ -87.933257615946218, 14.546916002371574 ], [ -87.909021368841081, 14.535237128390747 ], [ -87.902691005885174, 14.530276190993391 ], [ -87.899047818102304, 14.525987047164506 ], [ -87.898763597262189, 14.515910141839584 ], [ -87.899745450092439, 14.506505031881716 ], [ -87.887937384902386, 14.495549628312688 ], [ -87.855820482129502, 14.455965481022133 ], [ -87.848224047301926, 14.441754462398478 ], [ -87.847784796830865, 14.438188788082073 ], [ -87.848146532036822, 14.435088201759072 ], [ -87.848999192758527, 14.432814439534752 ], [ -87.853107469434178, 14.42909373648672 ], [ -87.897652554122033, 14.397002672135613 ], [ -87.909589809621991, 14.390491441127097 ], [ -87.921992154014674, 14.38537547499817 ], [ -87.932482468690978, 14.385272122210665 ], [ -87.940363125257988, 14.386977444553395 ], [ -87.9471585762073, 14.389561266039607 ], [ -87.952067836761216, 14.389302882721836 ], [ -87.955142584662553, 14.383876858230394 ], [ -87.957390510263792, 14.370596014694286 ], [ -87.953308072009918, 14.340106919898403 ], [ -87.969405280129536, 14.310444648301882 ], [ -87.974702115210448, 14.30383006450586 ], [ -87.984313930743269, 14.297318834396663 ], [ -87.996225348720827, 14.292771308149327 ], [ -88.002349006101724, 14.287913723539475 ], [ -88.005863002675426, 14.275304674471158 ], [ -88.00519121000633, 14.267656561900822 ], [ -88.013459439301641, 14.253703924796298 ], [ -88.055420701604078, 14.252205308028522 ], [ -88.089733853134817, 14.224351711562235 ], [ -88.10596025336298, 14.208332016909026 ], [ -88.114641892908992, 14.187558092232166 ], [ -88.12291012220436, 14.176034246982908 ], [ -88.125648973321461, 14.173398749552632 ], [ -88.154381069830492, 14.159394436504044 ], [ -88.165233119712695, 14.149524238552772 ], [ -88.219674241672919, 14.090716458397821 ], [ -88.225952927785386, 14.085238756163676 ], [ -88.229621954889296, 14.086375636826176 ], [ -88.232231614797172, 14.083585109765011 ], [ -88.232205777274771, 14.078727525155159 ], [ -88.225694546266254, 14.068702297572941 ], [ -88.219312507366283, 14.0621910674638 ], [ -88.210294969237395, 14.043380845749425 ], [ -88.219157477735394, 13.993358058827312 ], [ -88.217736376232779, 13.990929266972103 ], [ -88.217658813303558, 13.990796705103833 ], [ -88.220062622999905, 13.991317647000116 ], [ -88.235074625999886, 13.992867941000043 ], [ -88.244893147999875, 13.989250591000058 ], [ -88.245358235999902, 13.98589162200004 ], [ -88.244376383999935, 13.966099548000059 ], [ -88.242309326999958, 13.962533875000091 ], [ -88.233369303999922, 13.954498190000024 ], [ -88.231586466999943, 13.951811015000075 ], [ -88.236366536999952, 13.938142599000074 ], [ -88.2427744149999, 13.936695658000076 ], [ -88.251636921999904, 13.938090922000058 ], [ -88.263600015999941, 13.93310414600009 ], [ -88.27016292299993, 13.926024475000077 ], [ -88.274170772999895, 13.919119724000055 ], [ -88.277526814999931, 13.913337911000028 ], [ -88.28543330899987, 13.905974019000027 ], [ -88.296311197999842, 13.902356669000142 ], [ -88.308429321999938, 13.901478170000104 ], [ -88.319255533999865, 13.89760243700006 ], [ -88.326206014999855, 13.885070903000056 ], [ -88.332613891999898, 13.887706401000059 ], [ -88.340572062999854, 13.890031840000091 ], [ -88.348556071999923, 13.891375427000057 ], [ -88.355067301999895, 13.890962016000046 ], [ -88.358193725999854, 13.887396343000077 ], [ -88.358917195999936, 13.881195170000098 ], [ -88.358917195999936, 13.87527821900008 ], [ -88.360105753999875, 13.872384338000103 ], [ -88.36741796899986, 13.873107809000089 ], [ -88.383360148999884, 13.879257304000063 ], [ -88.392946126999902, 13.879774068000103 ], [ -88.433227905999843, 13.871066590000041 ], [ -88.451443847999883, 13.863573507000098 ], [ -88.470150715999864, 13.852488912000098 ], [ -88.496815755342823, 13.851197002439676 ], [ -88.48800492399991, 13.865330506000078 ], [ -88.48867671699989, 13.881350200000043 ], [ -88.499502930999938, 13.907601827000065 ], [ -88.502293457999912, 13.917110291000057 ], [ -88.500226399999946, 13.931863912000068 ], [ -88.496815754999915, 13.944033712000063 ], [ -88.496092285999907, 13.955686747000129 ], [ -88.501198105999947, 13.966600438000029 ], [ -88.502293457999912, 13.968941752000134 ], [ -88.498182576999938, 13.968409755000081 ], [ -88.497900960999914, 13.968373311000079 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-LP", "NAME_1": "La Paz" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.177532918999958, 13.985193990000056 ], [ -88.193475097999908, 13.985555725000054 ], [ -88.217658813303558, 13.990796705103833 ], [ -88.217736376232779, 13.990929266972103 ], [ -88.219157477735394, 13.993358058827312 ], [ -88.210294969237395, 14.043380845749425 ], [ -88.219312507366283, 14.0621910674638 ], [ -88.225694546266254, 14.068702297572941 ], [ -88.232205777274771, 14.078727525155159 ], [ -88.232231614797172, 14.083585109765011 ], [ -88.229621954889296, 14.086375636826176 ], [ -88.225952927785386, 14.085238756163676 ], [ -88.219674241672919, 14.090716458397821 ], [ -88.165233119712695, 14.149524238552772 ], [ -88.154381069830492, 14.159394436504044 ], [ -88.125648973321461, 14.173398749552632 ], [ -88.12291012220436, 14.176034246982908 ], [ -88.114641892908992, 14.187558092232166 ], [ -88.10596025336298, 14.208332016909026 ], [ -88.089733853134817, 14.224351711562235 ], [ -88.055420701604078, 14.252205308028522 ], [ -88.013459439301641, 14.253703924796298 ], [ -88.00519121000633, 14.267656561900822 ], [ -88.005863002675426, 14.275304674471158 ], [ -88.002349006101724, 14.287913723539475 ], [ -87.996225348720827, 14.292771308149327 ], [ -87.984313930743269, 14.297318834396663 ], [ -87.974702115210448, 14.30383006450586 ], [ -87.969405280129536, 14.310444648301882 ], [ -87.953308072009918, 14.340106919898403 ], [ -87.957390510263792, 14.370596014694286 ], [ -87.955142584662553, 14.383876858230394 ], [ -87.952067836761216, 14.389302882721836 ], [ -87.9471585762073, 14.389561266039607 ], [ -87.940363125257988, 14.386977444553395 ], [ -87.932482468690978, 14.385272122210665 ], [ -87.921992154014674, 14.38537547499817 ], [ -87.909589809621991, 14.390491441127097 ], [ -87.897652554122033, 14.397002672135613 ], [ -87.853107469434178, 14.42909373648672 ], [ -87.842875536276949, 14.414314277082212 ], [ -87.829129604747436, 14.400361639977689 ], [ -87.789545458356201, 14.389871324402066 ], [ -87.788744472679241, 14.387855942797501 ], [ -87.779442714609559, 14.378347480052128 ], [ -87.776522997238487, 14.377210598490308 ], [ -87.746033902442605, 14.371267808262701 ], [ -87.735259366026924, 14.365635077296986 ], [ -87.714976365966493, 14.358503730462758 ], [ -87.70430518323758, 14.357728583207518 ], [ -87.696114468308053, 14.355454820083878 ], [ -87.651155971570802, 14.373438219498212 ], [ -87.646582607801065, 14.369820868338365 ], [ -87.634464484248554, 14.344189358152335 ], [ -87.631648118765668, 14.336386216850428 ], [ -87.62818579813603, 14.317059231198527 ], [ -87.634929572241958, 14.306362210047951 ], [ -87.626635505424247, 14.298559067846668 ], [ -87.629942797322201, 14.285639960415836 ], [ -87.639477097589975, 14.273702704016557 ], [ -87.644102139102415, 14.270395413017866 ], [ -87.652912970756972, 14.266933092388285 ], [ -87.668648443670747, 14.263625800490274 ], [ -87.68373796323641, 14.265692857139641 ], [ -87.696837937820533, 14.256081040707443 ], [ -87.706088019946151, 14.251740220934437 ], [ -87.727662930299971, 14.244143785207484 ], [ -87.740065273793334, 14.241198228515429 ], [ -87.755852423550493, 14.238976142235174 ], [ -87.775851202770752, 14.24062978773452 ], [ -87.813239102202772, 14.231689764870737 ], [ -87.819104377165274, 14.234066880781882 ], [ -87.820706345821179, 14.234170234468706 ], [ -87.82360022656917, 14.233653468732598 ], [ -87.825770636905361, 14.232206528808263 ], [ -87.828716192698096, 14.225281887549045 ], [ -87.825641445696135, 14.20554148984786 ], [ -87.791121588590443, 14.191382148067646 ], [ -87.777117276441118, 14.175362454313813 ], [ -87.782078212939155, 14.159652818023119 ], [ -87.784326137641131, 14.155622057511948 ], [ -87.785798915987186, 14.150557766427767 ], [ -87.784558681637805, 14.146682033748846 ], [ -87.780967169799055, 14.14311636033176 ], [ -87.764275681577431, 14.136915187685759 ], [ -87.754121262786043, 14.134951483823897 ], [ -87.742778285589395, 14.130662339994956 ], [ -87.731926235707192, 14.12440949140489 ], [ -87.714304572398078, 14.109785060731951 ], [ -87.703685064713966, 14.104204005710301 ], [ -87.696579556301458, 14.095160630958333 ], [ -87.690688442917292, 14.084773668170214 ], [ -87.689629075721257, 14.051028958319762 ], [ -87.663609991907606, 14.075730292518983 ], [ -87.650613369211612, 14.085032049689346 ], [ -87.615240852283478, 14.088494371218246 ], [ -87.596585660200049, 13.957287909009779 ], [ -87.598316820065179, 13.938167628932888 ], [ -87.6060424470013, 13.902924303214036 ], [ -87.608832974062466, 13.896206365731189 ], [ -87.611520148336183, 13.892175605220018 ], [ -87.619374965582153, 13.868817857258307 ], [ -87.647047695794527, 13.834194648264372 ], [ -87.668415899674017, 13.834194648264372 ], [ -87.692858853253483, 13.849904282756427 ], [ -87.734096646043383, 13.848405666888027 ], [ -87.749528722999912, 13.845627388000096 ], [ -87.765335855999865, 13.858870952000117 ], [ -87.771433674999912, 13.862126567000104 ], [ -87.785412150999917, 13.86739756200005 ], [ -87.790605631999938, 13.870472310000082 ], [ -87.798718831999935, 13.882332051000105 ], [ -87.808459839999898, 13.908635356000048 ], [ -87.817890787999943, 13.915870057000106 ], [ -87.832902791999913, 13.915249939000134 ], [ -87.842953857999959, 13.907110901000038 ], [ -87.851222087999901, 13.896878968000053 ], [ -87.860911417999944, 13.890186870000036 ], [ -87.87054907299995, 13.889566752000064 ], [ -87.890108602999959, 13.893545837000147 ], [ -87.900107991999874, 13.894140117000106 ], [ -87.907885294999886, 13.891530457000101 ], [ -87.920752725999904, 13.881866963000078 ], [ -87.925326090999931, 13.879619039000062 ], [ -87.932173217999889, 13.881556905000096 ], [ -87.946926839999918, 13.890910339000129 ], [ -87.952594894338858, 13.892029035511541 ], [ -87.954781656999842, 13.892460633000056 ], [ -87.969741984999899, 13.888533223000081 ], [ -88.015320597999903, 13.866364035000061 ], [ -88.023640502999854, 13.891168722000103 ], [ -88.039970255999975, 13.910133972000054 ], [ -88.058392903999902, 13.926489563000104 ], [ -88.072888143999933, 13.94341359500001 ], [ -88.087538411999901, 13.980543112000092 ], [ -88.09903641799994, 13.98981903100011 ], [ -88.125391397999891, 13.991265971000104 ], [ -88.177532918999958, 13.985193990000056 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-VA", "NAME_1": "Valle" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -87.769159911999907, 13.506360168000057 ], [ -87.779469360999911, 13.509977519000131 ], [ -87.789933838999843, 13.53281850200004 ], [ -87.784068563999938, 13.560465394000047 ], [ -87.760090698999932, 13.616947734000092 ], [ -87.757816935999926, 13.635163676000047 ], [ -87.758643757999948, 13.672267355000116 ], [ -87.755026407999964, 13.689914857000119 ], [ -87.746318929999887, 13.702188009000054 ], [ -87.73629370099988, 13.711463929000075 ], [ -87.731358602999933, 13.72221262700009 ], [ -87.737843993999888, 13.738774923000094 ], [ -87.732805541999937, 13.75510467600013 ], [ -87.712625895999849, 13.800450745000148 ], [ -87.703608357999883, 13.814997661000106 ], [ -87.721204183999873, 13.821896464000076 ], [ -87.749528722999912, 13.845627388000096 ], [ -87.734096646043383, 13.848405666888027 ], [ -87.692858853253483, 13.849904282756427 ], [ -87.668415899674017, 13.834194648264372 ], [ -87.647047695794527, 13.834194648264372 ], [ -87.647280239791201, 13.804790758186925 ], [ -87.649398973283951, 13.761227525429945 ], [ -87.641854214400439, 13.749858709811576 ], [ -87.60102983276056, 13.722676906913705 ], [ -87.570308193967946, 13.716889146317044 ], [ -87.551988897769377, 13.71874949829072 ], [ -87.548397385930627, 13.717302558366384 ], [ -87.543694830951665, 13.714512030405842 ], [ -87.540749274259611, 13.710998032932878 ], [ -87.505144213334745, 13.684643053234311 ], [ -87.479021775834269, 13.668623359480421 ], [ -87.468789841777777, 13.665832831519936 ], [ -87.46114173010676, 13.670173652192261 ], [ -87.459126350300835, 13.667899889068622 ], [ -87.441504686092401, 13.653585516758199 ], [ -87.433055589643743, 13.649348048873321 ], [ -87.426260138694431, 13.644542141106911 ], [ -87.42181596613392, 13.637824205422703 ], [ -87.424373949198355, 13.598033352557138 ], [ -87.419800585428675, 13.590695299248637 ], [ -87.415718146275424, 13.582582099584215 ], [ -87.414555427191203, 13.575915838944809 ], [ -87.400266893302444, 13.545530096936432 ], [ -87.364429286582265, 13.519381821913555 ], [ -87.367684903435531, 13.498814601912329 ], [ -87.366263801033597, 13.489512843842647 ], [ -87.360682746011889, 13.474475002019688 ], [ -87.349546475289571, 13.453339342136928 ], [ -87.347789476103401, 13.432978826811393 ], [ -87.358719042150085, 13.408484198187182 ], [ -87.37902787973286, 13.393291326733333 ], [ -87.379017706999946, 13.393133856000077 ], [ -87.393788214999915, 13.406439520000049 ], [ -87.40062415299991, 13.411159572000088 ], [ -87.409779425999943, 13.413031317000048 ], [ -87.429839647999927, 13.409369208000044 ], [ -87.437774217999902, 13.411037502000056 ], [ -87.447295701999906, 13.420477606000077 ], [ -87.464385545999903, 13.408270575000074 ], [ -87.469634568999936, 13.40298086100006 ], [ -87.474598761999914, 13.393133856000077 ], [ -87.476429816999939, 13.379706122000073 ], [ -87.473052537999934, 13.372463283000059 ], [ -87.472279425999943, 13.367010809000078 ], [ -87.482045050999943, 13.359035549000055 ], [ -87.488270636999914, 13.358303127000056 ], [ -87.522979295999903, 13.359035549000055 ], [ -87.538604295999903, 13.355292059000078 ], [ -87.547596808999913, 13.35500722900008 ], [ -87.557158982999908, 13.359035549000055 ], [ -87.557158982999908, 13.36587148600006 ], [ -87.542836066999939, 13.36587148600006 ], [ -87.542836066999939, 13.372015692000048 ], [ -87.561797654999907, 13.376003322000088 ], [ -87.581328904999907, 13.382879950000074 ], [ -87.598866339999915, 13.384344794000071 ], [ -87.611805792999917, 13.372015692000048 ], [ -87.618560350999928, 13.372015692000048 ], [ -87.616729295999903, 13.381862697000088 ], [ -87.605580206999946, 13.406805731000077 ], [ -87.619252081999946, 13.412014065000051 ], [ -87.622425910999937, 13.423000393000052 ], [ -87.618560350999928, 13.451198635000083 ], [ -87.624012824999909, 13.46625397300005 ], [ -87.636463995999918, 13.463690497000073 ], [ -87.650380011999914, 13.452297268000052 ], [ -87.660145636999914, 13.44094472900008 ], [ -87.650990363999938, 13.412543036000045 ], [ -87.665679490999935, 13.386013088000084 ], [ -87.692779100999928, 13.366481838000084 ], [ -87.720977342999902, 13.359035549000055 ], [ -87.738880988999938, 13.362372137000079 ], [ -87.762237107999908, 13.376369533000059 ], [ -87.781361456999946, 13.382595119000086 ], [ -87.782948370999918, 13.389431057000081 ], [ -87.782948370999918, 13.396266994000086 ], [ -87.786488410999937, 13.399359442000048 ], [ -87.796254035999937, 13.39984772300005 ], [ -87.803008592999902, 13.401393947000088 ], [ -87.817168748999904, 13.40656159100007 ], [ -87.738412434999958, 13.441687113000071 ], [ -87.721152506999942, 13.460833232000084 ], [ -87.718801228999922, 13.473674825000074 ], [ -87.720584065999901, 13.486981507000081 ], [ -87.725725871999913, 13.498970439000047 ], [ -87.733425659999909, 13.507703756000112 ], [ -87.747972574999949, 13.513233135000107 ], [ -87.769159911999907, 13.506360168000057 ] ] ], [ [ [ -87.615142381999931, 13.290106512000079 ], [ -87.61196855399993, 13.282863674000055 ], [ -87.613880988999938, 13.267320054000038 ], [ -87.624338344999899, 13.252915757000039 ], [ -87.646555141999897, 13.249172268000052 ], [ -87.658558722999942, 13.250962632000039 ], [ -87.66274980399993, 13.252752997000073 ], [ -87.667062954999949, 13.256008205000057 ], [ -87.667062954999949, 13.262193101000037 ], [ -87.660145636999914, 13.262193101000037 ], [ -87.663970506999931, 13.267482815000051 ], [ -87.670033331999946, 13.278550523000092 ], [ -87.673817511999914, 13.283880927000041 ], [ -87.657622850999928, 13.289129950000074 ], [ -87.64484615799995, 13.290838934000078 ], [ -87.615142381999931, 13.290106512000079 ] ] ], [ [ [ -87.622303839999915, 13.368882554000038 ], [ -87.612416144999941, 13.366034247000073 ], [ -87.585438605999911, 13.37173086100006 ], [ -87.570790167999917, 13.372015692000048 ], [ -87.570790167999917, 13.36587148600006 ], [ -87.58812415299991, 13.357977606000077 ], [ -87.576283331999946, 13.318548895000049 ], [ -87.591297980999911, 13.304388739000046 ], [ -87.637562628999945, 13.319159247000073 ], [ -87.659006313999896, 13.331691799000055 ], [ -87.65648352799991, 13.34906647300005 ], [ -87.643462693999936, 13.367743231000077 ], [ -87.634429490999935, 13.373480536000045 ], [ -87.622303839999915, 13.368882554000038 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-OL", "NAME_1": "Olancho" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -84.999948289999907, 14.742015988000105 ], [ -85.001990316999951, 14.740677592000026 ], [ -85.015658732999867, 14.728171896000035 ], [ -85.024547078999973, 14.712539775000081 ], [ -85.029792236999896, 14.675539449000027 ], [ -85.033047851999896, 14.669570821 ], [ -85.038215494999889, 14.667219544000062 ], [ -85.053925130999858, 14.66305959100012 ], [ -85.048524943999979, 14.653318583000086 ], [ -85.020206257999888, 14.633733215000063 ], [ -85.042220418999875, 14.61347605400006 ], [ -85.048163207999892, 14.605776266000063 ], [ -85.022221639999941, 14.605802104000077 ], [ -85.02365718199988, 14.602540872000063 ], [ -85.029637206999951, 14.5889555870001 ], [ -85.065242268999839, 14.554254862000064 ], [ -85.086377929999884, 14.544539693000033 ], [ -85.103353637999902, 14.556864522000083 ], [ -85.119321655999926, 14.573969422000033 ], [ -85.13753759899987, 14.578491109000055 ], [ -85.145469929999933, 14.564254252000083 ], [ -85.149810750999904, 14.536504008000051 ], [ -85.15182613199994, 14.485964457000108 ], [ -85.155391805999926, 14.479479065000049 ], [ -85.178491170999905, 14.455604553000072 ], [ -85.179679728999929, 14.449248352000041 ], [ -85.177354288999908, 14.433977966000086 ], [ -85.178491170999905, 14.427647603000068 ], [ -85.205828002999937, 14.407157899000097 ], [ -85.189730794999946, 14.396848450000093 ], [ -85.171876587999918, 14.381009623000097 ], [ -85.15903499399991, 14.361062520000075 ], [ -85.158027302999926, 14.338273214000083 ], [ -85.169628662999884, 14.321762594000091 ], [ -85.190195882999973, 14.309644470000109 ], [ -85.215207274999869, 14.301582947000028 ], [ -85.239960286999917, 14.297319641000058 ], [ -85.277813273999897, 14.297319641000058 ], [ -85.288200236999899, 14.295149231000067 ], [ -85.311971394999972, 14.283651225000142 ], [ -85.321350666999905, 14.28132578600011 ], [ -85.326828369999902, 14.275744731000088 ], [ -85.330884968999897, 14.26900095700006 ], [ -85.337964639999939, 14.260681050000102 ], [ -85.3408068439999, 14.253368836000021 ], [ -85.343623209999862, 14.250113221000035 ], [ -85.347809000999916, 14.249234721000093 ], [ -85.358531860999932, 14.250888367000044 ], [ -85.362872680999914, 14.250113221000035 ], [ -85.37251033599992, 14.241095683000083 ], [ -85.384008341999845, 14.226445414000096 ], [ -85.393620157999948, 14.210761617000045 ], [ -85.400880696999934, 14.18518178300009 ], [ -85.409123087999973, 14.166164856000123 ], [ -85.420156005999871, 14.146863708000083 ], [ -85.431731526999897, 14.132833557000069 ], [ -85.457621419999839, 14.113041483000089 ], [ -85.474674641999883, 14.103403829000072 ], [ -85.510641438999954, 14.093792013000055 ], [ -85.51640336199992, 14.080537008000064 ], [ -85.518625447999909, 14.064594828000025 ], [ -85.527953043999872, 14.050900574000096 ], [ -85.546634074999929, 14.044906108000077 ], [ -85.563145912999914, 14.042012281000098 ], [ -85.563273077690383, 14.042347316975111 ], [ -85.575649583661345, 14.074955146163063 ], [ -85.58014543306524, 14.079295965936069 ], [ -85.587793544736257, 14.085187079320235 ], [ -85.5959325828224, 14.089579575936682 ], [ -85.605802781672992, 14.097227688507019 ], [ -85.609704352773633, 14.104875800178036 ], [ -85.61140967511642, 14.114797674972692 ], [ -85.61140967511642, 14.126476548953576 ], [ -85.615492113370294, 14.147353827317261 ], [ -85.621564093907807, 14.159704494866503 ], [ -85.631279263127453, 14.170349840073072 ], [ -85.646911384153043, 14.183423977134851 ], [ -85.655437994967485, 14.186007799520326 ], [ -85.660295579577337, 14.18492259390257 ], [ -85.662155930651636, 14.177429510963123 ], [ -85.665230678552973, 14.176395982188808 ], [ -85.672129483189053, 14.177067775757223 ], [ -85.710111660025063, 14.188746649738107 ], [ -85.75747311109518, 14.198720201376204 ], [ -85.763725958785926, 14.197893378176843 ], [ -85.768015102614868, 14.193552558403837 ], [ -85.779771490961537, 14.170401516017137 ], [ -85.784396531574657, 14.166629137025041 ], [ -85.790546027377218, 14.165130520257264 ], [ -85.803749355648222, 14.167507636168466 ], [ -85.813593716077094, 14.172468573565823 ], [ -85.826771205926377, 14.181356920485484 ], [ -85.8364863760454, 14.18301056598483 ], [ -85.844857958128273, 14.18202871315458 ], [ -85.849172940378878, 14.179289862936798 ], [ -85.853022833736759, 14.175827542307218 ], [ -85.857518684040031, 14.173037014346733 ], [ -85.867802294040644, 14.168437812155275 ], [ -85.871316290614288, 14.165543932306605 ], [ -85.873745083368874, 14.16182322835931 ], [ -85.875450405711661, 14.157120673380348 ], [ -85.87640642012019, 14.146837063379735 ], [ -85.877491624838626, 14.14234121307652 ], [ -85.880178799112286, 14.138103746091019 ], [ -85.885372281405637, 14.134383043042988 ], [ -85.892658657870754, 14.131850898400216 ], [ -85.906275397291722, 14.131334133563371 ], [ -85.913070848241034, 14.132781073487763 ], [ -85.924543015747588, 14.141824449138994 ], [ -85.944412604657941, 14.167507636168466 ], [ -85.982730679177507, 14.18450918185323 ], [ -85.990507982057693, 14.190968736018363 ], [ -85.99531388982416, 14.198720201376204 ], [ -85.99699337374517, 14.207815252971557 ], [ -86.000765753636585, 14.221457830814245 ], [ -86.006760219808257, 14.234635322462168 ], [ -86.019317592932566, 14.254634100783107 ], [ -86.029601202933179, 14.263419094015944 ], [ -86.040298224983076, 14.268896796250147 ], [ -86.05791988829219, 14.272772528929067 ], [ -86.062312384908637, 14.272927558559957 ], [ -86.066549851894138, 14.271739000154696 ], [ -86.070012173423038, 14.269000149037652 ], [ -86.072699347696698, 14.265692857139641 ], [ -86.07623918269212, 14.257321275056768 ], [ -86.080140753792762, 14.253393866433782 ], [ -86.088460659931513, 14.252877102496257 ], [ -86.113782110855709, 14.258613186249534 ], [ -86.142178310580562, 14.268948473093531 ], [ -86.149232143948268, 14.276441555133658 ], [ -86.175974698173775, 14.323570461307725 ], [ -86.184940558559902, 14.334009100939227 ], [ -86.193725551792738, 14.338453274399058 ], [ -86.206592984178883, 14.34103709588527 ], [ -86.232482875883989, 14.341398831091169 ], [ -86.242766485884601, 14.340106919898403 ], [ -86.26199011874894, 14.334732571351083 ], [ -86.276640387843599, 14.327601222718215 ], [ -86.287311570572513, 14.3211933462959 ], [ -86.292970139959948, 14.319384670266288 ], [ -86.298706223713225, 14.316852524724197 ], [ -86.303641323588181, 14.313338528150553 ], [ -86.313098111288809, 14.304656886805844 ], [ -86.335732387939345, 14.290962633019092 ], [ -86.342863735672836, 14.288068752271101 ], [ -86.354465095287878, 14.286363429928315 ], [ -86.428155686735522, 14.290755927444081 ], [ -86.437354092017699, 14.293753160080257 ], [ -86.442134162261766, 14.297732245546683 ], [ -86.447818570070922, 14.311478176176877 ], [ -86.452521125049884, 14.318041083129458 ], [ -86.457120327241284, 14.323157050157704 ], [ -86.47577552022409, 14.336644599268823 ], [ -86.498978237655535, 14.34279409417212 ], [ -86.502647263860126, 14.345119534139201 ], [ -86.522904426398156, 14.364859930941066 ], [ -86.578921677693245, 14.380104478338978 ], [ -86.599953985687876, 14.382429918306059 ], [ -86.607317878317417, 14.38113800711335 ], [ -86.611942918930538, 14.382378241462675 ], [ -86.615689460400233, 14.38651235655999 ], [ -86.62065039689827, 14.396744289717162 ], [ -86.630701463801472, 14.40806142849209 ], [ -86.635093960417919, 14.410438544403291 ], [ -86.638892177831735, 14.411058661128266 ], [ -86.649356655884958, 14.409456692472361 ], [ -86.652586433417127, 14.408113105335531 ], [ -86.655712857262529, 14.406459458936865 ], [ -86.665660569579586, 14.405529282950056 ], [ -86.671319138967078, 14.406407782093481 ], [ -86.714210578155644, 14.423822739827585 ], [ -86.713564623008949, 14.437827052876173 ], [ -86.726147833655602, 14.471571764525322 ], [ -86.729300095922667, 14.485317695155516 ], [ -86.731057095108838, 14.500407212922539 ], [ -86.734700283791028, 14.507641913443535 ], [ -86.745113085000867, 14.523661607197425 ], [ -86.747516039333732, 14.532963365267051 ], [ -86.748601244052168, 14.541438300137429 ], [ -86.744415453010731, 14.557457993891262 ], [ -86.743717821020596, 14.575338040518147 ], [ -86.76247636589153, 14.598799140368044 ], [ -86.797306281359795, 14.630321763938241 ], [ -86.806633876951821, 14.639830227582934 ], [ -86.826064216290547, 14.644481105718455 ], [ -86.834952562310889, 14.651509101563761 ], [ -86.848336757735183, 14.66592682486305 ], [ -86.860170661346899, 14.687579251381351 ], [ -86.891357388132917, 14.762200018815804 ], [ -86.899470587797396, 14.799096990933378 ], [ -86.907170376311797, 14.809949041714901 ], [ -86.909909227428898, 14.820697739708919 ], [ -86.912415533649948, 14.8476728379311 ], [ -86.916988898319005, 14.858318183137612 ], [ -86.923706834902475, 14.86906688113163 ], [ -86.927272508319561, 14.876249904809242 ], [ -86.933292812912953, 14.897333888747937 ], [ -86.923551805271586, 14.905395413367614 ], [ -86.915490281551229, 14.932525540321421 ], [ -86.906136848436802, 14.940173651992438 ], [ -86.908358933817738, 14.942860826266099 ], [ -86.912234667395978, 14.946116441320669 ], [ -86.926652390695267, 14.953506171472611 ], [ -86.938124559101084, 14.965288398240943 ], [ -86.961637335794421, 14.977277330584343 ], [ -86.970654873023932, 14.985855618242169 ], [ -86.980964322345585, 14.998102932104644 ], [ -86.984995082856756, 15.00476919184473 ], [ -86.987475551555463, 15.015879625044647 ], [ -86.973316209775248, 15.040580960143188 ], [ -86.969569668305553, 15.043784898354374 ], [ -86.96349768776804, 15.047608954189855 ], [ -86.959131028673994, 15.047453925458285 ], [ -86.951250373006303, 15.04600698553395 ], [ -86.920993822207095, 15.053965155567482 ], [ -86.901020881408556, 15.071535142033156 ], [ -86.886163906738886, 15.081560370514694 ], [ -86.88066036698234, 15.090552070221861 ], [ -86.879161750214564, 15.098303533781063 ], [ -86.879006720583675, 15.10460805921457 ], [ -86.878231574227755, 15.11111929022303 ], [ -86.875802782372489, 15.118095608325632 ], [ -86.871487800121884, 15.127242335865105 ], [ -86.864537320440945, 15.137991033859123 ], [ -86.862444423571276, 15.143778795355104 ], [ -86.862599453202165, 15.147602851190641 ], [ -86.863193732404795, 15.15158193575769 ], [ -86.862987026829785, 15.154630846136627 ], [ -86.855132208684495, 15.17163239182139 ], [ -86.862909511564681, 15.23193878784474 ], [ -86.862056850842976, 15.240051988408538 ], [ -86.85887875015419, 15.253591213463721 ], [ -86.855545619834459, 15.257673651717653 ], [ -86.851437344058183, 15.260619208409707 ], [ -86.844616054687151, 15.262014472389978 ], [ -86.829707404073417, 15.269765936848501 ], [ -86.826219245022116, 15.271109523985331 ], [ -86.817692634207674, 15.277259018888572 ], [ -86.815315518296529, 15.28537221945237 ], [ -86.768729213582333, 15.295294094247026 ], [ -86.738136765998945, 15.27090281841032 ], [ -86.729661831128567, 15.268680732130065 ], [ -86.71875810440298, 15.266820380156389 ], [ -86.70064551467874, 15.266923732943894 ], [ -86.692739020589329, 15.268629055286681 ], [ -86.686356980790038, 15.271936347184635 ], [ -86.676280077263755, 15.279274400493193 ], [ -86.666358201569722, 15.282323309972753 ], [ -86.659743618673019, 15.296586005439792 ], [ -86.651837123684288, 15.305939439453539 ], [ -86.64186357294551, 15.331260891277111 ], [ -86.63822038426332, 15.337203681504661 ], [ -86.632949387604128, 15.340872707709252 ], [ -86.628789435883732, 15.340355942872463 ], [ -86.624138556848891, 15.339115709422458 ], [ -86.618790045823914, 15.338753974216502 ], [ -86.611322801306244, 15.341492825333603 ], [ -86.526547614181027, 15.386244614697205 ], [ -86.514067756321879, 15.3892418482327 ], [ -86.503034838387066, 15.389293525076084 ], [ -86.47918616401023, 15.382317206074163 ], [ -86.464742601389901, 15.374669094403146 ], [ -86.451978521791318, 15.366400865107835 ], [ -86.442754278986797, 15.358494371018367 ], [ -86.434486049691429, 15.349864407416476 ], [ -86.429680141925019, 15.342836412470433 ], [ -86.426605394023682, 15.336841946298762 ], [ -86.420404222277, 15.331881008002085 ], [ -86.409112921923793, 15.328263657741616 ], [ -86.385264248446276, 15.32795360027842 ], [ -86.371957567387824, 15.329400540202755 ], [ -86.346067673884022, 15.341596178121108 ], [ -86.290515509683019, 15.374152330465677 ], [ -86.27764807819625, 15.378544827082067 ], [ -86.232896287933329, 15.409757392289805 ], [ -86.171633876602129, 15.378079739088662 ], [ -86.148560350379853, 15.37301544800448 ], [ -86.125667691310866, 15.378234767820288 ], [ -86.106805792753107, 15.38732982031496 ], [ -86.090191819796644, 15.390430405738641 ], [ -86.081329312197965, 15.394151108786616 ], [ -86.063345912783632, 15.396683254328707 ], [ -86.053656581985649, 15.395856432028722 ], [ -86.045543382321227, 15.393582668905026 ], [ -86.03828284427783, 15.39037872979452 ], [ -86.031668259582489, 15.39037872979452 ], [ -86.027508307862092, 15.396579902440521 ], [ -85.969940762056524, 15.426655585187063 ], [ -85.909143438718729, 15.484223130992689 ], [ -85.884597134150397, 15.523083807871444 ], [ -85.879946255115556, 15.52856151010559 ], [ -85.87312496574458, 15.531352037166755 ], [ -85.866277838851147, 15.53031850839244 ], [ -85.859611579111061, 15.52799306932468 ], [ -85.847855190764449, 15.520603339172737 ], [ -85.8368739487737, 15.519983222447763 ], [ -85.817262743181061, 15.531868801104281 ], [ -85.79579118471537, 15.548715318057475 ], [ -85.787858853103558, 15.557810370552147 ], [ -85.784551561205546, 15.565045071073143 ], [ -85.786308560391717, 15.574295152299442 ], [ -85.764139369935947, 15.584992174349338 ], [ -85.759126756594526, 15.584268703937539 ], [ -85.752382981589335, 15.581478175976997 ], [ -85.745561693117622, 15.575845445011282 ], [ -85.73587236231964, 15.571866360444176 ], [ -85.727836677021003, 15.573313300368511 ], [ -85.717837286961185, 15.577034003416486 ], [ -85.709362352090864, 15.581529852820438 ], [ -85.688304205674513, 15.577189032148112 ], [ -85.607714809590789, 15.534866033740457 ], [ -85.505240444790672, 15.449496568311986 ], [ -85.395944789720261, 15.408930569090501 ], [ -85.360417243161237, 15.381076971724838 ], [ -85.307113002762833, 15.305267645885124 ], [ -85.249312913859853, 15.236641343723022 ], [ -85.232647264059949, 15.226667792084925 ], [ -85.092681647040365, 15.166774807211596 ], [ -85.059634569179991, 15.137060858771576 ], [ -84.999948289881672, 15.06874461497199 ], [ -84.999948289881672, 14.980998032732998 ], [ -84.999948289881672, 14.742769680376455 ], [ -84.999948289999907, 14.742015988000105 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-GD", "NAME_1": "Gracias a Dios" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -84.984368651999944, 14.752227275000067 ], [ -84.999948289999907, 14.742015988000105 ], [ -84.999948289881672, 14.742769680376455 ], [ -84.999948289881672, 14.980998032732998 ], [ -84.999948289881672, 15.06874461497199 ], [ -84.999948697274533, 15.987941798774955 ], [ -84.950774182999908, 15.972006975000056 ], [ -84.85446430099995, 15.929750654000088 ], [ -84.733589441999925, 15.895029350000073 ], [ -84.67655175099992, 15.876203025000052 ], [ -84.662276815999917, 15.865637092000043 ], [ -84.668480615999897, 15.853211763000047 ], [ -84.680854078999914, 15.83491673900005 ], [ -84.680939234999926, 15.819181622000087 ], [ -84.681079925999938, 15.794266759000038 ], [ -84.660053913999946, 15.774494092000054 ], [ -84.640297128999919, 15.771775004000062 ], [ -84.615713245999927, 15.77951835600004 ], [ -84.612188505999939, 15.799820681000085 ], [ -84.60940910599993, 15.808983062000038 ], [ -84.599870326999906, 15.808277578000059 ], [ -84.593129224999927, 15.795787892000078 ], [ -84.575485152999931, 15.783895482000048 ], [ -84.55025536699992, 15.787693059000048 ], [ -84.526432806999935, 15.784936377000065 ], [ -84.477436545999922, 15.778755998000065 ], [ -84.468516404999946, 15.789188903000081 ], [ -84.452811170999951, 15.795647751000047 ], [ -84.473867337999934, 15.804293073000053 ], [ -84.499033204999932, 15.809683259000053 ], [ -84.577974540999946, 15.822580437000056 ], [ -84.607887389999917, 15.835195009000074 ], [ -84.633054966999907, 15.847125321000078 ], [ -84.641829709999911, 15.862907079000081 ], [ -84.601645592999944, 15.854824790000066 ], [ -84.464167581999902, 15.829792031000068 ], [ -84.374315457999899, 15.820715618000065 ], [ -84.315041911999913, 15.81770380200004 ], [ -84.294638382999949, 15.811010146000058 ], [ -84.240394391999928, 15.767350999000087 ], [ -84.167070508999927, 15.709697431000052 ], [ -84.058306091999896, 15.620248106000076 ], [ -83.952933206999944, 15.532886512000061 ], [ -83.894170739999936, 15.485180693000075 ], [ -83.817534959999932, 15.439886786000045 ], [ -83.79906165299991, 15.429348049000055 ], [ -83.780873175999943, 15.421535549000055 ], [ -83.745676235999952, 15.415838934000078 ], [ -83.736805792999917, 15.411322333000044 ], [ -83.729969855999911, 15.401556708000044 ], [ -83.729359503999945, 15.393744208000044 ], [ -83.735910610999952, 15.388617255000042 ], [ -83.750803188999896, 15.386786200000074 ], [ -83.768299933999913, 15.393377997000073 ], [ -83.806223110999952, 15.422349351000037 ], [ -83.834462042999917, 15.431789455000057 ], [ -83.853423631999931, 15.44476959800005 ], [ -83.862782355999911, 15.448879299000055 ], [ -83.893137173999946, 15.449164130000042 ], [ -83.906361456999946, 15.451971747000073 ], [ -83.918080206999946, 15.463120835000041 ], [ -83.913400844999899, 15.464829820000091 ], [ -83.909169074999909, 15.467840887000079 ], [ -83.904408331999946, 15.46938711100006 ], [ -83.913075324999909, 15.481838283000059 ], [ -83.94595292899993, 15.517767645000049 ], [ -83.952788865999935, 15.517767645000049 ], [ -83.963734503999945, 15.512518622000073 ], [ -83.977162238999938, 15.520209052000041 ], [ -83.991200324999909, 15.531683661000045 ], [ -84.004017706999946, 15.537583726000037 ], [ -84.024525519999941, 15.535101630000042 ], [ -84.033924933999913, 15.528876044000071 ], [ -84.041167772999927, 15.520209052000041 ], [ -84.055246548999946, 15.510931708000044 ], [ -84.061594204999949, 15.51508209800005 ], [ -84.089344855999911, 15.524603583000044 ], [ -84.076568162999934, 15.535549221000053 ], [ -84.071156378999945, 15.54165273600006 ], [ -84.068837042999917, 15.548163153000075 ], [ -84.073638475999928, 15.550482489000046 ], [ -84.084380662999934, 15.55219147300005 ], [ -84.096180792999917, 15.552639065000051 ], [ -84.103627081999946, 15.551214911000045 ], [ -84.106434699999909, 15.540432033000059 ], [ -84.100005662999934, 15.523260809000078 ], [ -84.088368292999917, 15.504868882000039 ], [ -84.075754360999952, 15.490423895000049 ], [ -84.078236456999946, 15.488226630000042 ], [ -84.079335089999915, 15.487534898000092 ], [ -84.08031165299991, 15.486395575000074 ], [ -84.082508917999917, 15.482977606000077 ], [ -84.089344855999911, 15.482977606000077 ], [ -84.119292772999927, 15.539292710000041 ], [ -84.130360480999911, 15.551214911000045 ], [ -84.141753709999932, 15.553127346000053 ], [ -84.154896613999938, 15.550685940000051 ], [ -84.171945766999897, 15.545070705000057 ], [ -84.18382727799991, 15.545884507000039 ], [ -84.200998501999948, 15.549872137000079 ], [ -84.212880011999914, 15.551214911000045 ], [ -84.205148891999897, 15.528509833000044 ], [ -84.198719855999911, 15.520738023000092 ], [ -84.180409308999913, 15.514471747000073 ], [ -84.180165167999917, 15.50617096600007 ], [ -84.183461066999939, 15.494940497000073 ], [ -84.185536261999914, 15.482977606000077 ], [ -84.178700324999909, 15.482977606000077 ], [ -84.175607876999948, 15.498277085000041 ], [ -84.155588344999899, 15.507391669000071 ], [ -84.146555141999897, 15.535101630000042 ], [ -84.137115037999934, 15.538072007000039 ], [ -84.127797003999945, 15.532619533000059 ], [ -84.114247199999909, 15.499904690000051 ], [ -84.098052537999934, 15.473456122000073 ], [ -84.092152472999942, 15.450913804000038 ], [ -84.11359615799995, 15.441392320000091 ], [ -84.124175584999932, 15.430243231000077 ], [ -84.116525844999899, 15.404974677000041 ], [ -84.099517381999931, 15.37759023600006 ], [ -84.082508917999917, 15.36009349200009 ], [ -84.056711391999897, 15.346828518000052 ], [ -84.03538977799991, 15.341864325000074 ], [ -84.025868292999917, 15.351223049000055 ], [ -84.03538977799991, 15.380560614000046 ], [ -84.021962042999917, 15.370306708000044 ], [ -84.01008053299995, 15.356756903000075 ], [ -84.005360480999911, 15.341294664000088 ], [ -84.013579881999931, 15.325344143000052 ], [ -83.999908006999931, 15.308823960000041 ], [ -83.980620897999927, 15.305731512000079 ], [ -83.931752081999946, 15.311672268000052 ], [ -83.931752081999946, 15.304877020000049 ], [ -83.941395636999914, 15.305243231000077 ], [ -83.94790605399993, 15.303412177000041 ], [ -83.958973761999914, 15.298041083000044 ], [ -83.958973761999914, 15.291815497000073 ], [ -83.950672980999911, 15.274807033000059 ], [ -83.938384568999936, 15.25922272300005 ], [ -83.921986456999946, 15.247870184000078 ], [ -83.900990363999938, 15.243394273000092 ], [ -83.882801886999914, 15.24555084800005 ], [ -83.859527147999927, 15.251288153000075 ], [ -83.837147589999915, 15.259995835000041 ], [ -83.821888800999943, 15.270697333000044 ], [ -83.834543423999946, 15.282619533000059 ], [ -83.877064581999946, 15.304877020000049 ], [ -83.884266730999911, 15.311712958000044 ], [ -83.887603318999936, 15.318345445000091 ], [ -83.891672329999949, 15.323391018000052 ], [ -83.900990363999938, 15.325344143000052 ], [ -83.911732550999943, 15.326117255000042 ], [ -83.988148566999939, 15.352362372000073 ], [ -84.000599738999938, 15.36009349200009 ], [ -84.023793097999942, 15.392564195000091 ], [ -84.03538977799991, 15.401068427000041 ], [ -84.026519334999932, 15.408677476000037 ], [ -84.016713019999941, 15.413723049000055 ], [ -83.99437415299991, 15.421535549000055 ], [ -83.905140753999945, 15.38353099200009 ], [ -83.890736456999946, 15.363226630000042 ], [ -83.88508053299995, 15.352606512000079 ], [ -83.87132727799991, 15.342840887000079 ], [ -83.854400193999936, 15.335598049000055 ], [ -83.825917120999918, 15.329738674000055 ], [ -83.814076300999943, 15.321682033000059 ], [ -83.803863084999932, 15.310492255000042 ], [ -83.79515540299991, 15.298041083000044 ], [ -83.801828579999949, 15.29368724200009 ], [ -83.809925910999937, 15.286688544000071 ], [ -83.815663214999915, 15.284369208000044 ], [ -83.815663214999915, 15.278143622000073 ], [ -83.799224412999934, 15.274603583000044 ], [ -83.785308397999927, 15.284409898000092 ], [ -83.774525519999941, 15.285711981000077 ], [ -83.767201300999943, 15.256415106000077 ], [ -83.769439256999931, 15.219224351000037 ], [ -83.767201300999943, 15.20929596600007 ], [ -83.759836391999897, 15.202093817000048 ], [ -83.75226803299995, 15.202541408000059 ], [ -83.747181769999941, 15.20970286700009 ], [ -83.747385219999899, 15.222886460000041 ], [ -83.739898240999935, 15.222886460000041 ], [ -83.731027798999946, 15.20343659100007 ], [ -83.722645636999914, 15.208075262000079 ], [ -83.705799933999913, 15.237209377000056 ], [ -83.690256313999896, 15.245917059000078 ], [ -83.669545050999943, 15.251898505000042 ], [ -83.633778449999909, 15.256415106000077 ], [ -83.629383917999917, 15.261135158000059 ], [ -83.631459113999938, 15.28384023600006 ], [ -83.630034959999932, 15.291815497000073 ], [ -83.62336178299995, 15.296087958000044 ], [ -83.617014126999948, 15.295599677000041 ], [ -83.609486456999946, 15.29328034100007 ], [ -83.544667120999918, 15.280991929000038 ], [ -83.52765865799995, 15.284369208000044 ], [ -83.52765865799995, 15.278143622000073 ], [ -83.533599412999934, 15.272162177000041 ], [ -83.532948370999918, 15.268133856000077 ], [ -83.529652472999942, 15.263739325000074 ], [ -83.52765865799995, 15.256415106000077 ], [ -83.52765865799995, 15.226304429000038 ], [ -83.532866990999935, 15.21124909100007 ], [ -83.544422980999911, 15.204982815000051 ], [ -83.555897589999915, 15.20929596600007 ], [ -83.561146613999938, 15.226304429000038 ], [ -83.564808722999942, 15.231390692000048 ], [ -83.573475714999915, 15.234767971000053 ], [ -83.583851691999939, 15.23663971600007 ], [ -83.592518683999913, 15.237209377000056 ], [ -83.598500128999945, 15.233099677000041 ], [ -83.603911912999934, 15.224025783000059 ], [ -83.610218878999945, 15.20929596600007 ], [ -83.614735480999911, 15.204087632000039 ], [ -83.619130011999914, 15.200873114000046 ], [ -83.622466600999928, 15.19594961100006 ], [ -83.623850063999896, 15.185370184000078 ], [ -83.621449347999942, 15.176174221000053 ], [ -83.615793423999946, 15.174505927000041 ], [ -83.608998175999943, 15.177394924000055 ], [ -83.603382941999939, 15.18195221600007 ], [ -83.608469204999949, 15.190415757000039 ], [ -83.609486456999946, 15.196926174000055 ], [ -83.607492641999897, 15.202826239000046 ], [ -83.603382941999939, 15.20929596600007 ], [ -83.59593665299991, 15.20929596600007 ], [ -83.593861456999946, 15.184759833000044 ], [ -83.587025519999941, 15.167181708000044 ], [ -83.57445227799991, 15.16046784100007 ], [ -83.55492102799991, 15.16828034100007 ], [ -83.549549933999913, 15.174017645000049 ], [ -83.540435350999928, 15.188666083000044 ], [ -83.534494594999899, 15.195013739000046 ], [ -83.526600714999915, 15.199896552000041 ], [ -83.481800910999937, 15.21556224200009 ], [ -83.482167120999918, 15.21906159100007 ], [ -83.486683722999942, 15.229722398000092 ], [ -83.49087480399993, 15.235907294000071 ], [ -83.496571417999917, 15.240464585000041 ], [ -83.502308722999942, 15.246283270000049 ], [ -83.50649980399993, 15.256415106000077 ], [ -83.509877081999946, 15.270575262000079 ], [ -83.517201300999943, 15.28969961100006 ], [ -83.52961178299995, 15.301011460000041 ], [ -83.548166469999899, 15.291815497000073 ], [ -83.577870245999918, 15.309068101000037 ], [ -83.592640753999945, 15.312241929000038 ], [ -83.610218878999945, 15.304877020000049 ], [ -83.616363084999932, 15.311672268000052 ], [ -83.614125128999945, 15.315415757000039 ], [ -83.610218878999945, 15.325344143000052 ], [ -83.626332160999937, 15.327460028000075 ], [ -83.669585740999935, 15.342922268000052 ], [ -83.678456183999913, 15.349269924000055 ], [ -83.688954230999911, 15.360581773000092 ], [ -83.709828253999945, 15.367092190000051 ], [ -83.725331183999913, 15.375881252000056 ], [ -83.71939042899993, 15.394232489000046 ], [ -83.702992316999939, 15.402004299000055 ], [ -83.687408006999931, 15.393744208000044 ], [ -83.673329230999911, 15.380601304000038 ], [ -83.661366339999915, 15.37376536700009 ], [ -83.65062415299991, 15.370306708000044 ], [ -83.542591925999943, 15.315741278000075 ], [ -83.408029751999948, 15.266424872000073 ], [ -83.356312628999945, 15.229722398000092 ], [ -83.344553188999896, 15.210882880000042 ], [ -83.32843990799995, 15.146633205000057 ], [ -83.31086178299995, 15.106431382000039 ], [ -83.284291144999941, 15.068345445000091 ], [ -83.253814256999931, 15.044623114000046 ], [ -83.130444472447948, 14.997012021272383 ], [ -83.143654134999935, 14.994899801000088 ], [ -83.177398843999896, 14.996811829000109 ], [ -83.191325642999885, 14.994253845000117 ], [ -83.21773230099987, 14.982497457000122 ], [ -83.262019002999892, 14.98319508900002 ], [ -83.266153116999902, 14.982497457000122 ], [ -83.278322916999912, 14.987122498000076 ], [ -83.285660970999913, 14.992109274000128 ], [ -83.2848858239999, 14.997380269000075 ], [ -83.272974405999946, 15.003038839000098 ], [ -83.317054402999929, 15.007560526000134 ], [ -83.334236816999919, 15.00644948300004 ], [ -83.349352172999915, 14.996811829000109 ], [ -83.354545653999935, 15.010066834000028 ], [ -83.364984293999868, 15.016345521000119 ], [ -83.377825886999943, 15.021254781000053 ], [ -83.390305745999939, 15.030969950000099 ], [ -83.399891723999929, 15.013632508000086 ], [ -83.41547216799998, 14.996941020000051 ], [ -83.435729329999873, 14.985184631000052 ], [ -83.45919042999995, 14.982497457000122 ], [ -83.468388834999956, 14.987406719000063 ], [ -83.48055863499988, 15.005545146000088 ], [ -83.485855468999915, 15.010480245000039 ], [ -83.499007120999892, 15.012650655000115 ], [ -83.509084024999908, 15.011539612000107 ], [ -83.512468831999939, 15.006501160000141 ], [ -83.505725056999893, 14.996811829000109 ], [ -83.510996052999928, 14.99017140700002 ], [ -83.51262386099998, 14.984021911000042 ], [ -83.513218139999935, 14.96885487900002 ], [ -83.523036661999896, 14.977691548000024 ], [ -83.528617716999918, 14.973402405000058 ], [ -83.529909627999871, 14.961775207000088 ], [ -83.526860717999938, 14.94836517400006 ], [ -83.532493448999872, 14.951026509000073 ], [ -83.547350423999916, 14.955212301000103 ], [ -83.545128336999909, 14.952163391000084 ], [ -83.542441161999875, 14.945083720000056 ], [ -83.540477458999931, 14.941569723000015 ], [ -83.55486934399994, 14.937409770000073 ], [ -83.579777384999915, 14.918108623000123 ], [ -83.604272013999974, 14.90919443700011 ], [ -83.609181274999912, 14.89836822500007 ], [ -83.611300008999876, 14.884906514000107 ], [ -83.615614990999859, 14.872685038000085 ], [ -83.623056396999885, 14.872685038000085 ], [ -83.631557169999979, 14.883201192000044 ], [ -83.649953979999879, 14.888498027000082 ], [ -83.672149007999906, 14.88963490800009 ], [ -83.691966918999896, 14.886973572000073 ], [ -83.710622110999878, 14.878343607000119 ], [ -83.714497843999936, 14.867233175000109 ], [ -83.705015218999847, 14.83852691700011 ], [ -83.712430785999857, 14.83852691700011 ], [ -83.7162031659999, 14.847053528000032 ], [ -83.723618733999899, 14.851575216000057 ], [ -83.733928181999914, 14.852970480000039 ], [ -83.746563069999922, 14.852195333000026 ], [ -83.744521851999878, 14.836666565000101 ], [ -83.76529577699992, 14.828785909000061 ], [ -83.821054646999869, 14.825478618000062 ], [ -83.813923299999942, 14.81377390600008 ], [ -83.808988199999902, 14.808890483000056 ], [ -83.801210896999891, 14.803774516000061 ], [ -83.819659383999891, 14.803619486000031 ], [ -83.83950313299988, 14.797418315000044 ], [ -83.857305664999927, 14.787780661000028 ], [ -83.869475463999919, 14.77710947700011 ], [ -83.875263224999912, 14.784266663000068 ], [ -83.878751383999941, 14.786747132000045 ], [ -83.882678791999922, 14.78783233700004 ], [ -83.889939330999908, 14.790726216000024 ], [ -83.885004231999858, 14.781346944000077 ], [ -83.883763997999921, 14.77710947700011 ], [ -83.896553914999885, 14.780442606000122 ], [ -83.912651122999961, 14.797185771000073 ], [ -83.924717569999927, 14.803774516000061 ], [ -83.929652669999882, 14.780881857000054 ], [ -83.929859375999939, 14.771657613000045 ], [ -83.924717569999927, 14.763441061 ], [ -84.023574584999892, 14.758325094000028 ], [ -84.040756998999967, 14.76034047400006 ], [ -84.042669026999903, 14.768066101000059 ], [ -84.047810832999886, 14.770804952000105 ], [ -84.064683186999872, 14.770262349000063 ], [ -84.075199340999916, 14.771631775000031 ], [ -84.078971720999874, 14.77517161100009 ], [ -84.081555541999961, 14.779796651000055 ], [ -84.104448201999872, 14.793930156000087 ], [ -84.111760416999857, 14.793413392000048 ], [ -84.122715820999929, 14.784525045000038 ], [ -84.111114461999904, 14.761038106000058 ], [ -84.104189819999903, 14.751865540000068 ], [ -84.095430663999934, 14.743597310000027 ], [ -84.095430663999934, 14.736104228000073 ], [ -84.102277791999882, 14.731866760000031 ], [ -84.106515258999934, 14.732331848000058 ], [ -84.111217814999918, 14.734708964000092 ], [ -84.119615234999912, 14.736104228000073 ], [ -84.128736124999875, 14.734192200000066 ], [ -84.13385209199987, 14.73003224700004 ], [ -84.137882853999969, 14.725226339000116 ], [ -84.143799804999873, 14.721867371000101 ], [ -84.168191081999908, 14.714968567000128 ], [ -84.182893026999892, 14.713857523000044 ], [ -84.195011148999896, 14.718715108000055 ], [ -84.218678955999906, 14.743442282000075 ], [ -84.226378743999902, 14.749772644000089 ], [ -84.235396280999851, 14.754733582000128 ], [ -84.249219726999911, 14.759410298000105 ], [ -84.261802938999921, 14.758531799000068 ], [ -84.267332316999841, 14.746672058000058 ], [ -84.262164672999916, 14.699749858000104 ], [ -84.26728063999991, 14.677735698000021 ], [ -84.287796183999887, 14.667219544000062 ], [ -84.298880777999898, 14.667994690000072 ], [ -84.323168701999919, 14.673317363000109 ], [ -84.338387410999928, 14.674686788000088 ], [ -84.346035522999927, 14.679983622000037 ], [ -84.353192708999956, 14.705976868000093 ], [ -84.362933715999901, 14.715614523000113 ], [ -84.376137044999894, 14.696726787000074 ], [ -84.390012166999952, 14.671482849000114 ], [ -84.408434814999879, 14.649417013000033 ], [ -84.445719360999902, 14.636678772000067 ], [ -84.47160925299994, 14.622622783000054 ], [ -84.48269384799994, 14.619470520000093 ], [ -84.498015909999907, 14.623914693000089 ], [ -84.508480387999867, 14.632622172000069 ], [ -84.519048217999938, 14.638280742000092 ], [ -84.534215250999949, 14.633733215000063 ], [ -84.531218017999919, 14.653318583000086 ], [ -84.527419799999905, 14.6603982540001 ], [ -84.600438598999943, 14.662516989000082 ], [ -84.622969523999956, 14.667219544000062 ], [ -84.661701009999888, 14.683445943000066 ], [ -84.680847127999897, 14.685461325000119 ], [ -84.699321451999907, 14.674686788000088 ], [ -84.714410970999921, 14.708922424000093 ], [ -84.72484960999995, 14.725639750000127 ], [ -84.745287637999894, 14.739101461000089 ], [ -84.744279947999928, 14.752408142000107 ], [ -84.747044637999892, 14.764474590000091 ], [ -84.766940063999897, 14.766903381000049 ], [ -84.766397461999929, 14.768867086000085 ], [ -84.758568481999902, 14.778659770000047 ], [ -84.755467895999857, 14.781476135000105 ], [ -84.770169840999955, 14.805143942000129 ], [ -84.792132324999926, 14.821060283000065 ], [ -84.818099731999979, 14.828656718000033 ], [ -84.844428873999931, 14.827545675000124 ], [ -84.904218506999882, 14.81697784400005 ], [ -84.920625772999927, 14.807701925000032 ], [ -84.966462768999889, 14.764629618000129 ], [ -84.984368651999944, 14.752227275000067 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-EP", "NAME_1": "El Paraíso" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -85.563145912999914, 14.042012281000098 ], [ -85.571697143999927, 14.04051361100008 ], [ -85.593607950999882, 14.033459778000065 ], [ -85.603064737999944, 14.019532980000079 ], [ -85.612805745999907, 14.009740295000114 ], [ -85.647868204999924, 13.999301657000089 ], [ -85.644612589999952, 13.988785503000116 ], [ -85.647661499999884, 13.98780365000006 ], [ -85.650400350999917, 13.987855327000076 ], [ -85.651950643999839, 13.986692607000066 ], [ -85.651485555999926, 13.981990052000086 ], [ -85.657660888999885, 13.981990052000086 ], [ -85.666187500999911, 13.984470520000059 ], [ -85.686496337999927, 13.967339783000099 ], [ -85.699234578999892, 13.961500346000022 ], [ -85.716985433999923, 13.962688904000046 ], [ -85.727346557999937, 13.965014344000068 ], [ -85.732204142999933, 13.959536641000085 ], [ -85.733392699999882, 13.937625834000116 ], [ -85.743288737999961, 13.907550151000052 ], [ -85.747448689999885, 13.88827484200003 ], [ -85.74367630999987, 13.879567363000149 ], [ -85.728690144999888, 13.87501983700011 ], [ -85.723005737999955, 13.863418478000071 ], [ -85.725124471999919, 13.847941386000059 ], [ -85.733392699999882, 13.831792501000066 ], [ -85.740293111999904, 13.825639142000043 ], [ -85.742461913999932, 13.823705139000069 ], [ -85.743114602999924, 13.823958222000059 ], [ -85.744994059999925, 13.824686991000135 ], [ -85.758300740999942, 13.83928558400001 ], [ -85.778661254999889, 13.84093923000006 ], [ -85.802019001999923, 13.840215760000063 ], [ -85.824162353999839, 13.847683004000089 ], [ -85.840104532999959, 13.866570740000029 ], [ -85.849871378999921, 13.887086283000087 ], [ -85.861601928999903, 13.904423727000108 ], [ -85.883564412999874, 13.913854675000067 ], [ -85.897206990999877, 13.913027853000045 ], [ -85.906302042999954, 13.909358826000044 ], [ -85.91550044799996, 13.907446798000123 ], [ -85.929401407999933, 13.912097677000091 ], [ -85.936119344999952, 13.918195496000052 ], [ -85.957771768999947, 13.94610076900004 ], [ -86.028413452999928, 13.996071879000098 ], [ -86.0312556559999, 14.022581889000023 ], [ -86.020455281999972, 14.044079284000048 ], [ -86.020196899999888, 14.055163879000062 ], [ -86.096729695999898, 14.044079284000048 ], [ -86.110475626999914, 14.037128805000066 ], [ -86.121689412999871, 14.027206930000062 ], [ -86.12690873199989, 14.018551127000109 ], [ -86.130836141999879, 14.008913473000092 ], [ -86.138019165999907, 13.996175232000041 ], [ -86.14969803999989, 13.984263815000091 ], [ -86.161790324999885, 13.978114319000028 ], [ -86.173572550999978, 13.973670146000117 ], [ -86.184062866999909, 13.966874695000072 ], [ -86.218582722999912, 13.91437144000011 ], [ -86.284108439999898, 13.845719299000052 ], [ -86.299921427999891, 13.82132802300012 ], [ -86.307776244999843, 13.791691589000081 ], [ -86.313564005999922, 13.776602072000074 ], [ -86.325191202999861, 13.76376047800008 ], [ -86.34012569199993, 13.756654968000063 ], [ -86.358470825999916, 13.752262472000069 ], [ -86.410095580999922, 13.749032695000082 ], [ -86.417071899999939, 13.750014547000148 ], [ -86.426528686999916, 13.752985942000066 ], [ -86.432471476999922, 13.757120056000076 ], [ -86.448232788999888, 13.772958883000086 ], [ -86.462857218999972, 13.770943502000137 ], [ -86.476293091999935, 13.764018860000064 ], [ -86.490814168999862, 13.759497172000124 ], [ -86.508539184999876, 13.764380595000148 ], [ -86.541663777999901, 13.78213145000008 ], [ -86.581144571999914, 13.77985768700006 ], [ -86.66268998299995, 13.764690654000049 ], [ -86.706304891999906, 13.770013326000083 ], [ -86.727233846999894, 13.768256327000103 ], [ -86.749919799999873, 13.757120056000076 ], [ -86.7614436449999, 13.749342753000064 ], [ -86.766197876999883, 13.745260315000067 ], [ -86.76790319899996, 13.739162496000105 ], [ -86.770228637999878, 13.72523569800012 ], [ -86.771167593109908, 13.70789040401894 ], [ -86.771881476748717, 13.707587389146681 ], [ -86.786247525003262, 13.701489570187505 ], [ -86.794205695036794, 13.700145982151355 ], [ -86.80120785156106, 13.694306544711253 ], [ -86.809191860915632, 13.681852525273825 ], [ -86.815987311864944, 13.6806122909245 ], [ -86.823609585114241, 13.6809740261304 ], [ -86.84071448358651, 13.679372057474438 ], [ -86.848827684150308, 13.676374823039623 ], [ -86.887352465144147, 13.651880195314732 ], [ -86.891383225655318, 13.659218247723913 ], [ -86.921148850938721, 13.656531073450253 ], [ -86.926135626757741, 13.658701483786444 ], [ -86.932853563341268, 13.6605618348608 ], [ -86.935075649621524, 13.657202867018668 ], [ -86.937943691947794, 13.638909410141139 ], [ -86.942517055717531, 13.629504299283951 ], [ -86.950010138656978, 13.618703925345869 ], [ -86.965952318045026, 13.601857408392675 ], [ -86.976933560035775, 13.593330797578233 ], [ -86.984736701337681, 13.588421536124997 ], [ -86.999516160742189, 13.583874009877661 ], [ -87.010574917098722, 13.573797105452059 ], [ -87.014166428937529, 13.56568390488826 ], [ -87.016543544848673, 13.550697739908742 ], [ -87.039203660820249, 13.525479640872732 ], [ -87.069873622769478, 13.508116359982012 ], [ -87.076617397774669, 13.505790920014931 ], [ -87.088916389379847, 13.507341212726772 ], [ -87.106615567054746, 13.520880439580594 ], [ -87.115116340346788, 13.539742336339714 ], [ -87.115607265862593, 13.549147447196901 ], [ -87.124004686367186, 13.555555325417913 ], [ -87.170125902188602, 13.558190822848189 ], [ -87.184285243968816, 13.566304023411931 ], [ -87.186894903876691, 13.578603014117789 ], [ -87.191287401392458, 13.597516587720349 ], [ -87.197591925926645, 13.60289093716699 ], [ -87.20632524321536, 13.612244371180793 ], [ -87.217280645885069, 13.615810045497199 ], [ -87.224127773677822, 13.628625800140526 ], [ -87.214231737304829, 13.671103827279808 ], [ -87.182683275312911, 13.68112905486197 ], [ -87.134753384361204, 13.660871894122579 ], [ -87.130205858113868, 13.660045070923275 ], [ -87.129844122907912, 13.664334214752216 ], [ -87.127027758324346, 13.681594142855374 ], [ -87.119508836963234, 13.697613837508584 ], [ -87.111628181295487, 13.70831085955848 ], [ -87.111163093302082, 13.724020494050535 ], [ -87.122557746442851, 13.744587714051761 ], [ -87.128681402924371, 13.752132472935273 ], [ -87.131549445250698, 13.76267446535428 ], [ -87.132272914763178, 13.776782131190373 ], [ -87.131652798038203, 13.790941473869907 ], [ -87.129895798852033, 13.798744615171813 ], [ -87.128190477408566, 13.802465318219845 ], [ -87.1215500560902, 13.810320136365192 ], [ -87.106486375845577, 13.80349884699416 ], [ -87.083800422351601, 13.783706773348911 ], [ -87.075687221787859, 13.779727687882485 ], [ -87.051218430685992, 13.775180162534468 ], [ -87.035534633716338, 13.775386868109479 ], [ -87.030547857897318, 13.779004218369948 ], [ -87.013933884940798, 13.8004499375146 ], [ -86.995071988181678, 13.84592519818932 ], [ -86.990989549028427, 13.891865545958183 ], [ -86.992488165796203, 13.911605942760048 ], [ -86.989904344310048, 13.924473375146135 ], [ -86.984995082856756, 13.934291897153344 ], [ -86.984219937400155, 13.942818507967729 ], [ -86.985150113387022, 13.950053209388102 ], [ -86.989258389163297, 13.964522610430095 ], [ -86.954583503325978, 13.958424791470918 ], [ -86.93827958873203, 13.966899726341296 ], [ -86.926729905960372, 13.978992011472144 ], [ -86.915955370443953, 13.999300849054919 ], [ -86.912286343340043, 14.038936672289594 ], [ -86.914250048101223, 14.049995429545447 ], [ -86.917118090427493, 14.056248277236193 ], [ -86.924740362777527, 14.06043406827763 ], [ -86.952232224937234, 14.080277817867 ], [ -86.978277147172605, 14.114745999028628 ], [ -86.984297451765997, 14.132626043856817 ], [ -86.963006761352915, 14.140842597208064 ], [ -86.949157477935216, 14.140842597208064 ], [ -86.933215297647848, 14.137845364571888 ], [ -86.912182989653218, 14.140842597208064 ], [ -86.901873542130261, 14.160996405159949 ], [ -86.903036262113801, 14.164820460995486 ], [ -86.906860317949281, 14.169574692817832 ], [ -86.912389696127548, 14.172675279140833 ], [ -86.920657925422915, 14.174897366320408 ], [ -86.921923998193961, 14.178566392524999 ], [ -86.91993445501106, 14.18357900586642 ], [ -86.908927374598647, 14.198668525432083 ], [ -86.89686092788952, 14.229932766583886 ], [ -86.848130052160172, 14.271687323311312 ], [ -86.829138964191827, 14.30496694606768 ], [ -86.821697557196501, 14.337781479931323 ], [ -86.788934699276922, 14.368270574727205 ], [ -86.714210578155644, 14.423822739827585 ], [ -86.671319138967078, 14.406407782093481 ], [ -86.665660569579586, 14.405529282950056 ], [ -86.655712857262529, 14.406459458936865 ], [ -86.652586433417127, 14.408113105335531 ], [ -86.649356655884958, 14.409456692472361 ], [ -86.638892177831735, 14.411058661128266 ], [ -86.635093960417919, 14.410438544403291 ], [ -86.630701463801472, 14.40806142849209 ], [ -86.62065039689827, 14.396744289717162 ], [ -86.615689460400233, 14.38651235655999 ], [ -86.611942918930538, 14.382378241462675 ], [ -86.607317878317417, 14.38113800711335 ], [ -86.599953985687876, 14.382429918306059 ], [ -86.578921677693245, 14.380104478338978 ], [ -86.522904426398156, 14.364859930941066 ], [ -86.502647263860126, 14.345119534139201 ], [ -86.498978237655535, 14.34279409417212 ], [ -86.47577552022409, 14.336644599268823 ], [ -86.457120327241284, 14.323157050157704 ], [ -86.452521125049884, 14.318041083129458 ], [ -86.447818570070922, 14.311478176176877 ], [ -86.442134162261766, 14.297732245546683 ], [ -86.437354092017699, 14.293753160080257 ], [ -86.428155686735522, 14.290755927444081 ], [ -86.354465095287878, 14.286363429928315 ], [ -86.342863735672836, 14.288068752271101 ], [ -86.335732387939345, 14.290962633019092 ], [ -86.313098111288809, 14.304656886805844 ], [ -86.303641323588181, 14.313338528150553 ], [ -86.298706223713225, 14.316852524724197 ], [ -86.292970139959948, 14.319384670266288 ], [ -86.287311570572513, 14.3211933462959 ], [ -86.276640387843599, 14.327601222718215 ], [ -86.26199011874894, 14.334732571351083 ], [ -86.242766485884601, 14.340106919898403 ], [ -86.232482875883989, 14.341398831091169 ], [ -86.206592984178883, 14.34103709588527 ], [ -86.193725551792738, 14.338453274399058 ], [ -86.184940558559902, 14.334009100939227 ], [ -86.175974698173775, 14.323570461307725 ], [ -86.149232143948268, 14.276441555133658 ], [ -86.142178310580562, 14.268948473093531 ], [ -86.113782110855709, 14.258613186249534 ], [ -86.088460659931513, 14.252877102496257 ], [ -86.080140753792762, 14.253393866433782 ], [ -86.07623918269212, 14.257321275056768 ], [ -86.072699347696698, 14.265692857139641 ], [ -86.070012173423038, 14.269000149037652 ], [ -86.066549851894138, 14.271739000154696 ], [ -86.062312384908637, 14.272927558559957 ], [ -86.05791988829219, 14.272772528929067 ], [ -86.040298224983076, 14.268896796250147 ], [ -86.029601202933179, 14.263419094015944 ], [ -86.019317592932566, 14.254634100783107 ], [ -86.006760219808257, 14.234635322462168 ], [ -86.000765753636585, 14.221457830814245 ], [ -85.99699337374517, 14.207815252971557 ], [ -85.99531388982416, 14.198720201376204 ], [ -85.990507982057693, 14.190968736018363 ], [ -85.982730679177507, 14.18450918185323 ], [ -85.944412604657941, 14.167507636168466 ], [ -85.924543015747588, 14.141824449138994 ], [ -85.913070848241034, 14.132781073487763 ], [ -85.906275397291722, 14.131334133563371 ], [ -85.892658657870754, 14.131850898400216 ], [ -85.885372281405637, 14.134383043042988 ], [ -85.880178799112286, 14.138103746091019 ], [ -85.877491624838626, 14.14234121307652 ], [ -85.87640642012019, 14.146837063379735 ], [ -85.875450405711661, 14.157120673380348 ], [ -85.873745083368874, 14.16182322835931 ], [ -85.871316290614288, 14.165543932306605 ], [ -85.867802294040644, 14.168437812155275 ], [ -85.857518684040031, 14.173037014346733 ], [ -85.853022833736759, 14.175827542307218 ], [ -85.849172940378878, 14.179289862936798 ], [ -85.844857958128273, 14.18202871315458 ], [ -85.8364863760454, 14.18301056598483 ], [ -85.826771205926377, 14.181356920485484 ], [ -85.813593716077094, 14.172468573565823 ], [ -85.803749355648222, 14.167507636168466 ], [ -85.790546027377218, 14.165130520257264 ], [ -85.784396531574657, 14.166629137025041 ], [ -85.779771490961537, 14.170401516017137 ], [ -85.768015102614868, 14.193552558403837 ], [ -85.763725958785926, 14.197893378176843 ], [ -85.75747311109518, 14.198720201376204 ], [ -85.710111660025063, 14.188746649738107 ], [ -85.672129483189053, 14.177067775757223 ], [ -85.665230678552973, 14.176395982188808 ], [ -85.662155930651636, 14.177429510963123 ], [ -85.660295579577337, 14.18492259390257 ], [ -85.655437994967485, 14.186007799520326 ], [ -85.646911384153043, 14.183423977134851 ], [ -85.631279263127453, 14.170349840073072 ], [ -85.621564093907807, 14.159704494866503 ], [ -85.615492113370294, 14.147353827317261 ], [ -85.61140967511642, 14.126476548953576 ], [ -85.61140967511642, 14.114797674972692 ], [ -85.609704352773633, 14.104875800178036 ], [ -85.605802781672992, 14.097227688507019 ], [ -85.5959325828224, 14.089579575936682 ], [ -85.587793544736257, 14.085187079320235 ], [ -85.58014543306524, 14.079295965936069 ], [ -85.575649583661345, 14.074955146163063 ], [ -85.563273077690383, 14.042347316975111 ], [ -85.563145912999914, 14.042012281000098 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-CH", "NAME_1": "Choluteca" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -86.732715272291955, 13.268469503364884 ], [ -86.739842895999942, 13.26371348100011 ], [ -86.74929968299989, 13.26128468800006 ], [ -86.758653117999927, 13.264178569000052 ], [ -86.816220662999882, 13.291928813000084 ], [ -86.833428914999871, 13.293349915000078 ], [ -86.84950028499992, 13.288828227000053 ], [ -86.862729451999911, 13.279939880000128 ], [ -86.910788533999977, 13.239580587000063 ], [ -86.918850057999862, 13.229762065000088 ], [ -86.925981404999902, 13.216352031000056 ], [ -86.933216104999872, 13.18818837500001 ], [ -86.934921427999939, 13.185527038000075 ], [ -86.933061076999934, 13.1797134400001 ], [ -86.925516317999978, 13.163642070000037 ], [ -86.923707641999897, 13.161135763000047 ], [ -86.932337605999919, 13.108529155000056 ], [ -86.929805460999944, 13.102224630000137 ], [ -86.924172729999924, 13.099795838000077 ], [ -86.920245320999953, 13.096178487000103 ], [ -86.922932494999969, 13.08638580400013 ], [ -86.927996785999937, 13.081243998000048 ], [ -86.942724568999949, 13.074060975000094 ], [ -86.9484089769999, 13.06969431600001 ], [ -86.97181840099995, 13.033882548000079 ], [ -86.983187214999958, 13.021867777000111 ], [ -87.008767049999904, 13.00608062800012 ], [ -87.029618489999876, 12.996081238000102 ], [ -87.035044515999942, 12.979777324000068 ], [ -87.04685257999995, 12.980552470000077 ], [ -87.069848592999904, 12.994375915000134 ], [ -87.084653890999931, 12.995926209000061 ], [ -87.314035610999952, 12.98155345300006 ], [ -87.313628709999932, 12.981838283000059 ], [ -87.303944464999915, 12.988470770000049 ], [ -87.300811326999906, 13.001247463000084 ], [ -87.293568488999938, 13.011053778000075 ], [ -87.282826300999943, 13.01821523600006 ], [ -87.269154425999943, 13.023220119000086 ], [ -87.269154425999943, 13.029445705000057 ], [ -87.296783006999931, 13.030340887000079 ], [ -87.316680467999902, 13.034206447000088 ], [ -87.331776495999918, 13.042669989000046 ], [ -87.344838019999941, 13.057318427000041 ], [ -87.351348436999899, 13.067206122000073 ], [ -87.352813279999907, 13.072536526000079 ], [ -87.351063605999911, 13.088405666000085 ], [ -87.344715949999909, 13.090765692000048 ], [ -87.314076300999943, 13.095404364000046 ], [ -87.303944464999915, 13.098334052000041 ], [ -87.361805792999917, 13.113348700000074 ], [ -87.394561326999906, 13.116848049000055 ], [ -87.4131160149999, 13.111354885000083 ], [ -87.419341600999928, 13.111354885000083 ], [ -87.42210852799991, 13.14992910400008 ], [ -87.43578040299991, 13.189398505000042 ], [ -87.455067511999914, 13.224310614000046 ], [ -87.474598761999914, 13.249172268000052 ], [ -87.480824347999942, 13.26516347900008 ], [ -87.482045050999943, 13.26593659100007 ], [ -87.484527147999927, 13.270086981000077 ], [ -87.490345831999946, 13.269720770000049 ], [ -87.496978318999936, 13.268337307000081 ], [ -87.501942511999914, 13.269598700000074 ], [ -87.508900519999941, 13.278631903000075 ], [ -87.512237107999908, 13.286688544000071 ], [ -87.510487433999913, 13.294948635000083 ], [ -87.501942511999914, 13.304388739000046 ], [ -87.493438279999907, 13.309759833000044 ], [ -87.476673956999946, 13.317328192000048 ], [ -87.467762824999909, 13.324896552000041 ], [ -87.447783982999908, 13.352565822000088 ], [ -87.440419074999909, 13.359035549000055 ], [ -87.426909959999932, 13.356024481000077 ], [ -87.411122199999909, 13.359808661000045 ], [ -87.379017706999946, 13.372015692000048 ], [ -87.380401170999903, 13.380438544000071 ], [ -87.380360480999911, 13.386297919000071 ], [ -87.379017706999946, 13.393133856000077 ], [ -87.37902787973286, 13.393291326733333 ], [ -87.358719042150085, 13.408484198187182 ], [ -87.347789476103401, 13.432978826811393 ], [ -87.349546475289571, 13.453339342136928 ], [ -87.360682746011889, 13.474475002019688 ], [ -87.366263801033597, 13.489512843842647 ], [ -87.367684903435531, 13.498814601912329 ], [ -87.364429286582265, 13.519381821913555 ], [ -87.400266893302444, 13.545530096936432 ], [ -87.414555427191203, 13.575915838944809 ], [ -87.415718146275424, 13.582582099584215 ], [ -87.419800585428675, 13.590695299248637 ], [ -87.424373949198355, 13.598033352557138 ], [ -87.42181596613392, 13.637824205422703 ], [ -87.426260138694431, 13.644542141106911 ], [ -87.433055589643743, 13.649348048873321 ], [ -87.441504686092401, 13.653585516758199 ], [ -87.459126350300835, 13.667899889068622 ], [ -87.46114173010676, 13.670173652192261 ], [ -87.465250006782355, 13.683506170773171 ], [ -87.465405036413301, 13.697820543083594 ], [ -87.459901495757379, 13.719472967803199 ], [ -87.457524379846234, 13.745414537251065 ], [ -87.454372117579169, 13.756886704757619 ], [ -87.443339199644356, 13.760297349443135 ], [ -87.42390886120495, 13.760607407805594 ], [ -87.412229987224123, 13.757506822381913 ], [ -87.40101620213602, 13.754974676839822 ], [ -87.396546190254469, 13.756008206513513 ], [ -87.390732591236088, 13.756111558401699 ], [ -87.386727668247261, 13.755078030526647 ], [ -87.387606167390686, 13.750892239485268 ], [ -87.394815030389339, 13.733942368845248 ], [ -87.392825487206437, 13.721126614201864 ], [ -87.373601854342098, 13.702781480480951 ], [ -87.360088466809259, 13.690120754569136 ], [ -87.31947079074439, 13.694874986391483 ], [ -87.307533535244431, 13.688777167432306 ], [ -87.29771501323728, 13.684332993972475 ], [ -87.263427701027581, 13.688415432226407 ], [ -87.214231737304829, 13.671103827279808 ], [ -87.224127773677822, 13.628625800140526 ], [ -87.217280645885069, 13.615810045497199 ], [ -87.20632524321536, 13.612244371180793 ], [ -87.197591925926645, 13.60289093716699 ], [ -87.191287401392458, 13.597516587720349 ], [ -87.186894903876691, 13.578603014117789 ], [ -87.184285243968816, 13.566304023411931 ], [ -87.170125902188602, 13.558190822848189 ], [ -87.124004686367186, 13.555555325417913 ], [ -87.115607265862593, 13.549147447196901 ], [ -87.115116340346788, 13.539742336339714 ], [ -87.106615567054746, 13.520880439580594 ], [ -87.088916389379847, 13.507341212726772 ], [ -87.076617397774669, 13.505790920014931 ], [ -87.069873622769478, 13.508116359982012 ], [ -87.039203660820249, 13.525479640872732 ], [ -87.016543544848673, 13.550697739908742 ], [ -87.014166428937529, 13.56568390488826 ], [ -87.010574917098722, 13.573797105452059 ], [ -86.999516160742189, 13.583874009877661 ], [ -86.984736701337681, 13.588421536124997 ], [ -86.976933560035775, 13.593330797578233 ], [ -86.965952318045026, 13.601857408392675 ], [ -86.950010138656978, 13.618703925345869 ], [ -86.942517055717531, 13.629504299283951 ], [ -86.937943691947794, 13.638909410141139 ], [ -86.935075649621524, 13.657202867018668 ], [ -86.932853563341268, 13.6605618348608 ], [ -86.926135626757741, 13.658701483786444 ], [ -86.921148850938721, 13.656531073450253 ], [ -86.891383225655318, 13.659218247723913 ], [ -86.887352465144147, 13.651880195314732 ], [ -86.848827684150308, 13.676374823039623 ], [ -86.84071448358651, 13.679372057474438 ], [ -86.823609585114241, 13.6809740261304 ], [ -86.815987311864944, 13.6806122909245 ], [ -86.809191860915632, 13.681852525273825 ], [ -86.80120785156106, 13.694306544711253 ], [ -86.794205695036794, 13.700145982151355 ], [ -86.786247525003262, 13.701489570187505 ], [ -86.771881476748717, 13.707587389146681 ], [ -86.771167593109908, 13.70789040401894 ], [ -86.77405269399992, 13.654594015000029 ], [ -86.772140665999899, 13.645524801000064 ], [ -86.768213256999843, 13.640357158000057 ], [ -86.764129565327153, 13.637335555191726 ], [ -86.755397501999965, 13.630874532000078 ], [ -86.751573445999924, 13.624414978000033 ], [ -86.750901651999925, 13.608421122000081 ], [ -86.757102823999929, 13.576407573000083 ], [ -86.756586059999876, 13.559380188000148 ], [ -86.724288289999919, 13.439413351000056 ], [ -86.725941935999856, 13.423832906000115 ], [ -86.738654337999918, 13.396211853000111 ], [ -86.740204630999926, 13.381923320000041 ], [ -86.736380574999885, 13.371949768000121 ], [ -86.730437784999879, 13.368900858000103 ], [ -86.723616496999909, 13.367324727000067 ], [ -86.71715694199986, 13.361640320000035 ], [ -86.709922241999891, 13.348902079000069 ], [ -86.707803507999927, 13.342830099000111 ], [ -86.701860717999921, 13.314201355000137 ], [ -86.704031128999901, 13.298827616000068 ], [ -86.711782592999896, 13.285675965000081 ], [ -86.725476847999914, 13.273299459000029 ], [ -86.732715272291955, 13.268469503364884 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-CR", "NAME_1": "Cortés" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.241585855999858, 15.688242493000089 ], [ -88.234919596999958, 15.701575013000095 ], [ -88.23574641999997, 15.71242706300005 ], [ -88.232619995999926, 15.721418762 ], [ -88.22093665299991, 15.725653387000079 ], [ -88.21507727799991, 15.723211981000077 ], [ -88.169748501999948, 15.691961981000077 ], [ -88.145253058999913, 15.684515692000048 ], [ -88.118885870999918, 15.695868231000077 ], [ -88.060902472999942, 15.755764065000051 ], [ -88.036284959999932, 15.77094147300005 ], [ -88.041615363999938, 15.786688544000071 ], [ -88.031605597999942, 15.789862372000073 ], [ -87.992258266999897, 15.78461334800005 ], [ -87.93390865799995, 15.818793036000045 ], [ -87.926665818999936, 15.83234284100007 ], [ -87.924549933999913, 15.842189846000053 ], [ -87.930165167999917, 15.846747137000079 ], [ -87.941314256999931, 15.849839585000041 ], [ -87.950428839999915, 15.856919664000088 ], [ -87.954579230999911, 15.86399974200009 ], [ -87.950998501999948, 15.867173570000091 ], [ -87.908762173999946, 15.868068752000056 ], [ -87.891957160999937, 15.872951565000051 ], [ -87.875559048999946, 15.884263414000088 ], [ -87.846058722999942, 15.893866278000075 ], [ -87.76008053299995, 15.899562893000052 ], [ -87.742095506999931, 15.904486395000049 ], [ -87.736317511999914, 15.91860586100006 ], [ -87.728357527078174, 15.921021546507177 ], [ -87.725156623179601, 15.897324530202866 ], [ -87.730686001357867, 15.887867743401614 ], [ -87.740530361786739, 15.882028306860832 ], [ -87.751614955665673, 15.872209783954361 ], [ -87.757376878739933, 15.862804673996493 ], [ -87.766446091913622, 15.838620102835478 ], [ -87.773732469278002, 15.828491523365074 ], [ -87.789493780613441, 15.81283356391782 ], [ -87.794868130060138, 15.803893541054038 ], [ -87.794661423585808, 15.79335154953435 ], [ -87.77952022987472, 15.776453354838452 ], [ -87.775437791620789, 15.763224189045047 ], [ -87.767376267900431, 15.765291245694414 ], [ -87.76117509615375, 15.760433661084562 ], [ -87.757867805155058, 15.751131903914199 ], [ -87.758410406614928, 15.739814765139272 ], [ -87.764275681577431, 15.729686183870285 ], [ -87.773241542862877, 15.724621893685423 ], [ -87.787581752695701, 15.721004544324273 ], [ -87.817967494704078, 15.701367499410537 ], [ -87.823548549725786, 15.691548977403386 ], [ -87.805461799322586, 15.687879950299475 ], [ -87.819750332311969, 15.671601874127191 ], [ -87.803446417717964, 15.653566798768736 ], [ -87.777349820437848, 15.63320628524184 ], [ -87.762208624928064, 15.610158596541964 ], [ -87.76463741678333, 15.606851305543273 ], [ -87.772001309412872, 15.581168118513858 ], [ -87.771252000579352, 15.577757472929022 ], [ -87.777763230688549, 15.574036769880991 ], [ -87.78486874089964, 15.574863593080352 ], [ -87.790837368649647, 15.577085680259927 ], [ -87.793912115651608, 15.577654120141517 ], [ -87.800423346660125, 15.564114895086334 ], [ -87.804505784913999, 15.547785142070609 ], [ -87.809776780673872, 15.533677476234516 ], [ -87.819931200364579, 15.52706289333787 ], [ -87.830938279877671, 15.50851105404189 ], [ -87.82747595924809, 15.494455064149861 ], [ -87.818639289171813, 15.482259426231508 ], [ -87.813549159665968, 15.469133613225665 ], [ -87.816417201992238, 15.451563625860615 ], [ -87.82437537292509, 15.45301056578495 ], [ -87.835124070919107, 15.460348619093509 ], [ -87.84633785690653, 15.460451971880957 ], [ -87.852719895806501, 15.4516669777488 ], [ -87.84597612170063, 15.445879218051459 ], [ -87.833728806938893, 15.439729723148162 ], [ -87.823781093722459, 15.429962877085075 ], [ -87.820189581883653, 15.416268622399002 ], [ -87.823858608987621, 15.408052069947075 ], [ -87.83848303876124, 15.396114814447117 ], [ -87.863003505807114, 15.356375637525616 ], [ -87.869953986387372, 15.347952379498679 ], [ -87.873907233432078, 15.345006821907305 ], [ -87.8785581115676, 15.342681382839544 ], [ -87.887627325640551, 15.335808417524447 ], [ -87.893570115868158, 15.332501126525756 ], [ -87.90687679692661, 15.32893545220935 ], [ -87.911579352804893, 15.32661001224227 ], [ -87.913310512670023, 15.323406073131764 ], [ -87.912587043157487, 15.320253810864642 ], [ -87.911269294442377, 15.316998195810072 ], [ -87.911140103233151, 15.313535875180492 ], [ -87.913749763141027, 15.308833320201529 ], [ -87.92576453300677, 15.296430975808846 ], [ -87.924110886608105, 15.289816392012881 ], [ -87.924059210664041, 15.282891750753663 ], [ -87.92553198901004, 15.276070461382687 ], [ -87.928374192914646, 15.26971426000506 ], [ -87.926462164996906, 15.259120592541308 ], [ -87.935117967020517, 15.244754544286764 ], [ -87.930725471303447, 15.237313137291437 ], [ -87.926849737725206, 15.237829902128283 ], [ -87.921036139606144, 15.240465400457822 ], [ -87.918374802854828, 15.239070136477608 ], [ -87.917496303711403, 15.237778225284842 ], [ -87.917186245348944, 15.225840968885564 ], [ -87.920596890034403, 15.211578274317901 ], [ -87.919795905256819, 15.204653632159363 ], [ -87.922974005945605, 15.194938462939717 ], [ -87.92310319715483, 15.190804347842345 ], [ -87.918374802854828, 15.187807115206169 ], [ -87.897755906909538, 15.193284817440372 ], [ -87.878713142097808, 15.191837877516036 ], [ -87.867861091316286, 15.18935740791801 ], [ -87.853081631012458, 15.178195298774028 ], [ -87.848689134396011, 15.173802802157581 ], [ -87.846079475387455, 15.16930695185431 ], [ -87.845149299400646, 15.165172838555634 ], [ -87.842565477015114, 15.160418605833968 ], [ -87.836932746049399, 15.159591783533983 ], [ -87.822153285745514, 15.159850165053058 ], [ -87.817864142815949, 15.157989813978702 ], [ -87.814427659708713, 15.154785874868196 ], [ -87.810991176601476, 15.153700670149817 ], [ -87.799803229935094, 15.153390610887982 ], [ -87.796521775559484, 15.149204819846545 ], [ -87.794067146181817, 15.139593004313667 ], [ -87.788434414316725, 15.137474269921597 ], [ -87.783395961654264, 15.136854153196623 ], [ -87.767686327162266, 15.139696357101172 ], [ -87.738359952349924, 15.11111929022303 ], [ -87.737300585153889, 15.104556383270449 ], [ -87.733321498788143, 15.094376126057341 ], [ -87.732313809334812, 15.08646963106861 ], [ -87.732158779703923, 15.081457016827869 ], [ -87.733786586781548, 15.077684637835773 ], [ -87.737429776363058, 15.075152493193002 ], [ -87.740065273793334, 15.067866115828565 ], [ -87.741279669720939, 15.061458238506873 ], [ -87.735879482751898, 15.016551419512382 ], [ -87.735801968386113, 14.983788559794164 ], [ -87.740685391417685, 14.962497870280458 ], [ -87.757221849109044, 14.947925116450961 ], [ -87.802593756996259, 14.915523992837961 ], [ -87.821455654654699, 14.906583970873555 ], [ -87.84367652105459, 14.901416327001868 ], [ -87.847423061624966, 14.898832506415033 ], [ -87.869437221550527, 14.876818346489472 ], [ -87.883674078595845, 14.858214830350107 ], [ -87.96297156438618, 14.803541165292529 ], [ -87.973668586436077, 14.81046580745101 ], [ -87.980283169332779, 14.820129298928009 ], [ -87.985812548410365, 14.836407375999613 ], [ -87.987879605059732, 14.877645168789513 ], [ -87.995631070417573, 14.900847887120278 ], [ -88.026972825935161, 14.928494778011554 ], [ -88.048909470595561, 14.929166572479346 ], [ -88.053586188052122, 14.930820217079315 ], [ -88.056712612796844, 14.94694326452003 ], [ -88.049555426641632, 14.98895620456517 ], [ -88.043974371619925, 14.997327785748723 ], [ -88.030745204927257, 15.04254466400505 ], [ -88.018136155858883, 15.055825507541101 ], [ -88.022296109377919, 15.063008531218713 ], [ -88.029065721006191, 15.065644029548309 ], [ -88.036016201586392, 15.071948554082496 ], [ -88.043018358110714, 15.075255845980507 ], [ -88.065342577298111, 15.082697252076514 ], [ -88.094048835385422, 15.101042384898108 ], [ -88.10593441404194, 15.114271552490152 ], [ -88.113530849768892, 15.130859687024895 ], [ -88.10805314843401, 15.149824937470896 ], [ -88.067125414006625, 15.192354641453505 ], [ -88.061518520563254, 15.207754218482364 ], [ -88.081439785417729, 15.213800361497476 ], [ -88.094513923378827, 15.222016913050084 ], [ -88.102187872572244, 15.227908027333569 ], [ -88.123814459769505, 15.270747788779431 ], [ -88.130945808402316, 15.367951157819675 ], [ -88.134330613766792, 15.37301544800448 ], [ -88.158954433600229, 15.377666327039321 ], [ -88.169083014869216, 15.382162177342593 ], [ -88.182544724659294, 15.39115387615044 ], [ -88.197634244224957, 15.403401190912234 ], [ -88.227115647768926, 15.420557766227887 ], [ -88.233678554721507, 15.427172350023909 ], [ -88.238096889759618, 15.433476874558096 ], [ -88.240112271364239, 15.439161282367252 ], [ -88.241145799239234, 15.445052394852098 ], [ -88.240680712145149, 15.452132065742205 ], [ -88.238329433756348, 15.464017646197419 ], [ -88.238665331439904, 15.469236965113851 ], [ -88.240654872824109, 15.478487047239412 ], [ -88.239802212102404, 15.486806952478844 ], [ -88.240939093664224, 15.490734361101886 ], [ -88.2477862205576, 15.496212063336031 ], [ -88.261997240080575, 15.504015203738675 ], [ -88.356565110791223, 15.532385565941127 ], [ -88.409921027133691, 15.540447088762107 ], [ -88.466816779370845, 15.520758367904364 ], [ -88.467433936427028, 15.520739666502379 ], [ -88.398992269999923, 15.572797343000033 ], [ -88.352560994999919, 15.616903178000101 ], [ -88.322304443999911, 15.667261861000085 ], [ -88.316671712999948, 15.674599914000069 ], [ -88.295587728999948, 15.675013326000098 ], [ -88.279697224999921, 15.680749410000047 ], [ -88.264995279999937, 15.688604228000074 ], [ -88.247761190999938, 15.695683899000088 ], [ -88.241585855999858, 15.688242493000089 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-SB", "NAME_1": "Santa Bárbara" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.76089940199995, 15.299961814000071 ], [ -88.674195108999896, 15.365058086000076 ], [ -88.587378702999928, 15.430299581 ], [ -88.500019693999974, 15.495954489000027 ], [ -88.467433936427028, 15.520739666502379 ], [ -88.466816779370845, 15.520758367904364 ], [ -88.409921027133691, 15.540447088762107 ], [ -88.356565110791223, 15.532385565941127 ], [ -88.261997240080575, 15.504015203738675 ], [ -88.2477862205576, 15.496212063336031 ], [ -88.240939093664224, 15.490734361101886 ], [ -88.239802212102404, 15.486806952478844 ], [ -88.240654872824109, 15.478487047239412 ], [ -88.238665331439904, 15.469236965113851 ], [ -88.238329433756348, 15.464017646197419 ], [ -88.240680712145149, 15.452132065742205 ], [ -88.241145799239234, 15.445052394852098 ], [ -88.240112271364239, 15.439161282367252 ], [ -88.238096889759618, 15.433476874558096 ], [ -88.233678554721507, 15.427172350023909 ], [ -88.227115647768926, 15.420557766227887 ], [ -88.197634244224957, 15.403401190912234 ], [ -88.182544724659294, 15.39115387615044 ], [ -88.169083014869216, 15.382162177342593 ], [ -88.158954433600229, 15.377666327039321 ], [ -88.134330613766792, 15.37301544800448 ], [ -88.130945808402316, 15.367951157819675 ], [ -88.123814459769505, 15.270747788779431 ], [ -88.102187872572244, 15.227908027333569 ], [ -88.094513923378827, 15.222016913050084 ], [ -88.081439785417729, 15.213800361497476 ], [ -88.061518520563254, 15.207754218482364 ], [ -88.067125414006625, 15.192354641453505 ], [ -88.10805314843401, 15.149824937470896 ], [ -88.113530849768892, 15.130859687024895 ], [ -88.10593441404194, 15.114271552490152 ], [ -88.094048835385422, 15.101042384898108 ], [ -88.065342577298111, 15.082697252076514 ], [ -88.043018358110714, 15.075255845980507 ], [ -88.036016201586392, 15.071948554082496 ], [ -88.029065721006191, 15.065644029548309 ], [ -88.022296109377919, 15.063008531218713 ], [ -88.018136155858883, 15.055825507541101 ], [ -88.030745204927257, 15.04254466400505 ], [ -88.043974371619925, 14.997327785748723 ], [ -88.049555426641632, 14.98895620456517 ], [ -88.056712612796844, 14.94694326452003 ], [ -88.053586188052122, 14.930820217079315 ], [ -88.048909470595561, 14.929166572479346 ], [ -88.026972825935161, 14.928494778011554 ], [ -87.995631070417573, 14.900847887120278 ], [ -87.987879605059732, 14.877645168789513 ], [ -87.985812548410365, 14.836407375999613 ], [ -87.98705278186037, 14.792585760824181 ], [ -88.02252865337465, 14.786281236289994 ], [ -88.052966071327091, 14.755378730344091 ], [ -88.058417935139573, 14.751968084759312 ], [ -88.069812588280286, 14.747213852936966 ], [ -88.074773525677642, 14.742459622013939 ], [ -88.077331508742134, 14.735224921492943 ], [ -88.077874112000643, 14.721375637175925 ], [ -88.071595424988857, 14.710885322499621 ], [ -88.06224199097511, 14.68561554572085 ], [ -88.074954392830932, 14.664841620144614 ], [ -88.093351203395287, 14.654454657356553 ], [ -88.100430874285394, 14.649287014384186 ], [ -88.129628058787887, 14.652025865501287 ], [ -88.16321773990677, 14.658640448397932 ], [ -88.207452766232166, 14.654764715719068 ], [ -88.265950487125281, 14.64877025044666 ], [ -88.34377519367024, 14.654299627725607 ], [ -88.322277797682204, 14.688922838518181 ], [ -88.316800096347379, 14.719515286101569 ], [ -88.32336300329996, 14.731194159183076 ], [ -88.335739509270923, 14.729695543314676 ], [ -88.352508510959012, 14.731814276807427 ], [ -88.367003750422725, 14.739514065321828 ], [ -88.383049282598279, 14.765817369076331 ], [ -88.388837043194997, 14.772225247297285 ], [ -88.360518357835929, 14.819199123840463 ], [ -88.381033901893034, 14.831188056183805 ], [ -88.407776455219221, 14.830619615402895 ], [ -88.420230475555968, 14.847569485143595 ], [ -88.422400885892159, 14.849843248267291 ], [ -88.433640510301302, 14.854545803246197 ], [ -88.442347989168354, 14.853874010577101 ], [ -88.453587612678177, 14.843228665370589 ], [ -88.463716193047844, 14.827415676292389 ], [ -88.479632534913549, 14.814393215174732 ], [ -88.487306485006286, 14.811912747375402 ], [ -88.505625780305479, 14.834443671238432 ], [ -88.533220995252691, 14.878368639201312 ], [ -88.555105963969027, 14.934799303445061 ], [ -88.601692267783903, 14.941672267860838 ], [ -88.609262865089136, 14.937693183293732 ], [ -88.644609545394189, 14.927357896449735 ], [ -88.679878710434139, 14.920950019128043 ], [ -88.68587317570649, 14.922913722989904 ], [ -88.692436082659071, 14.926944485299714 ], [ -88.695381639351183, 14.932525540321421 ], [ -88.697552048787998, 14.938830063956289 ], [ -88.699877488755078, 14.943532619834514 ], [ -88.70225460466628, 14.952369289910791 ], [ -88.689413010701855, 14.98513214783037 ], [ -88.679361944697973, 15.019496975305174 ], [ -88.677708299198628, 15.037428696976747 ], [ -88.668974981909855, 15.056393948322068 ], [ -88.644583706073149, 15.077012844267358 ], [ -88.642361619792894, 15.084144192000849 ], [ -88.642620002211288, 15.091482245309351 ], [ -88.644945441279049, 15.097270005906012 ], [ -88.652981126577686, 15.109362291036859 ], [ -88.657399461615853, 15.114426581221721 ], [ -88.66391069172505, 15.139541327470283 ], [ -88.651715053806697, 15.155095933230712 ], [ -88.652671068215227, 15.158558253860292 ], [ -88.654660611398072, 15.162795721745169 ], [ -88.662722134219109, 15.168273423979315 ], [ -88.679103563178899, 15.175663154131257 ], [ -88.699696620702468, 15.196798814014016 ], [ -88.718041755322758, 15.217159329339552 ], [ -88.716491461711598, 15.230905259969745 ], [ -88.715173712996432, 15.237313137291437 ], [ -88.715793829721463, 15.245271308224289 ], [ -88.758013475341613, 15.295655829452926 ], [ -88.76089940199995, 15.299961814000071 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-CP", "NAME_1": "Copán" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.146940319140413, 15.071284391261656 ], [ -89.140523234999904, 15.076393534000132 ], [ -89.109827433999868, 15.09145721400003 ], [ -89.008283243999898, 15.124400940000086 ], [ -88.97342749099991, 15.140394796000123 ], [ -88.847026936999868, 15.235298564000104 ], [ -88.76089940199995, 15.299961814000071 ], [ -88.758013475341613, 15.295655829452926 ], [ -88.715793829721463, 15.245271308224289 ], [ -88.715173712996432, 15.237313137291437 ], [ -88.716491461711598, 15.230905259969745 ], [ -88.718041755322758, 15.217159329339552 ], [ -88.699696620702468, 15.196798814014016 ], [ -88.679103563178899, 15.175663154131257 ], [ -88.662722134219109, 15.168273423979315 ], [ -88.654660611398072, 15.162795721745169 ], [ -88.652671068215227, 15.158558253860292 ], [ -88.651715053806697, 15.155095933230712 ], [ -88.66391069172505, 15.139541327470283 ], [ -88.657399461615853, 15.114426581221721 ], [ -88.652981126577686, 15.109362291036859 ], [ -88.644945441279049, 15.097270005906012 ], [ -88.642620002211288, 15.091482245309351 ], [ -88.642361619792894, 15.084144192000849 ], [ -88.644583706073149, 15.077012844267358 ], [ -88.668974981909855, 15.056393948322068 ], [ -88.677708299198628, 15.037428696976747 ], [ -88.679361944697973, 15.019496975305174 ], [ -88.689413010701855, 14.98513214783037 ], [ -88.70225460466628, 14.952369289910791 ], [ -88.699877488755078, 14.943532619834514 ], [ -88.697552048787998, 14.938830063956289 ], [ -88.695381639351183, 14.932525540321421 ], [ -88.692436082659071, 14.926944485299714 ], [ -88.68587317570649, 14.922913722989904 ], [ -88.679878710434139, 14.920950019128043 ], [ -88.644609545394189, 14.927357896449735 ], [ -88.639286871891613, 14.895783596036097 ], [ -88.643317634201424, 14.869273585807321 ], [ -88.656624315259933, 14.859765123061948 ], [ -88.654815640129698, 14.84901642506793 ], [ -88.656856859256607, 14.844572252507419 ], [ -88.664117398199323, 14.835890611162768 ], [ -88.669543422690765, 14.830877996922027 ], [ -88.673832567419026, 14.823281562094394 ], [ -88.676313036117733, 14.815013332799083 ], [ -88.677811651986133, 14.801887518893864 ], [ -88.676803961633482, 14.787004705802531 ], [ -88.67006018842693, 14.775945950345317 ], [ -88.659776576627678, 14.753570055213856 ], [ -88.655513272119777, 14.735483303012018 ], [ -88.654970668861267, 14.729747219258741 ], [ -88.655900844848077, 14.723856105874574 ], [ -88.663729824571703, 14.723080960417974 ], [ -88.692048509031451, 14.715071113541057 ], [ -88.728196174114146, 14.712487291155526 ], [ -88.778089768927657, 14.718223374908803 ], [ -88.792843390809821, 14.713520819929897 ], [ -88.794703741884177, 14.698586330894443 ], [ -88.794109462681547, 14.694452215797128 ], [ -88.783283251221064, 14.668975735241986 ], [ -88.752768317104142, 14.640760403569743 ], [ -88.745559455004809, 14.630270087094857 ], [ -88.733596361083187, 14.609237779100226 ], [ -88.730521613181907, 14.54877635344593 ], [ -88.754318609815982, 14.546760972740685 ], [ -88.773774786677052, 14.54991323500775 ], [ -88.781810471975689, 14.550016587795255 ], [ -88.790983038836146, 14.54856964787092 ], [ -88.800594855268344, 14.545985826384765 ], [ -88.817079637015638, 14.539991360213094 ], [ -88.824340175958355, 14.535185452446683 ], [ -88.827724982222151, 14.527433987088841 ], [ -88.827621630333965, 14.515496730689563 ], [ -88.827208218284625, 14.511414293334951 ], [ -88.82483110237348, 14.508313707011951 ], [ -88.824030117595839, 14.50500641511394 ], [ -88.826665615925435, 14.50330109277121 ], [ -88.836820034716823, 14.500303860135034 ], [ -88.849196539788466, 14.502680976046179 ], [ -88.861211310553529, 14.512551173997451 ], [ -88.874802211552776, 14.515910141839584 ], [ -88.892656419757941, 14.523248196047405 ], [ -88.909916347861156, 14.540869859356519 ], [ -88.923223028919608, 14.561282049726799 ], [ -88.924824999374209, 14.568723455822806 ], [ -88.92425655769398, 14.594871730845682 ], [ -88.930561083127486, 14.608565986431131 ], [ -88.994562343777147, 14.655643214862437 ], [ -89.00308895459159, 14.669854234385411 ], [ -89.010271980067785, 14.699981593975394 ], [ -89.02564571777566, 14.720807197294278 ], [ -89.08556454107071, 14.728920396059436 ], [ -89.098664516554152, 14.724476223498925 ], [ -89.13103980174543, 14.715071113541057 ], [ -89.14621323435324, 14.710857663850106 ], [ -89.150522624999923, 14.717294007000064 ], [ -89.159669352999913, 14.725122986000088 ], [ -89.170547240999952, 14.738791403000107 ], [ -89.189409139999896, 14.783000590000114 ], [ -89.198814249999941, 14.798090108000025 ], [ -89.218968058999934, 14.821680400000034 ], [ -89.227675537999886, 14.83457367000004 ], [ -89.232429768999879, 14.848500468000026 ], [ -89.231447916999912, 14.867310690000124 ], [ -89.223618937999902, 14.879015401000103 ], [ -89.198814249999941, 14.899815165000064 ], [ -89.189214955999915, 14.913059034000113 ], [ -89.181528482999852, 14.923663839000127 ], [ -89.169151977999888, 14.952060038000056 ], [ -89.169100300999872, 14.97841501900011 ], [ -89.18858231699997, 14.996088359000026 ], [ -89.172769328999976, 15.042209575000058 ], [ -89.16080623499991, 15.060244649000055 ], [ -89.146940319140413, 15.071284391261656 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-CL", "NAME_1": "Colón" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -86.437868288390803, 15.790846896267226 ], [ -86.414662238999938, 15.776434637000079 ], [ -86.399037238999938, 15.772406317000048 ], [ -86.374745245999918, 15.77094147300005 ], [ -86.354969855999911, 15.773993231000077 ], [ -86.338286912999934, 15.781398830000057 ], [ -86.243234829999949, 15.83860911700009 ], [ -86.218495245999918, 15.865057684000078 ], [ -86.207142706999946, 15.874009507000039 ], [ -86.172596808999913, 15.887518622000073 ], [ -86.137806769999941, 15.895656643000052 ], [ -85.994862433999913, 15.90070221600007 ], [ -85.982289191999939, 15.904201565000051 ], [ -85.972157355999911, 15.909165757000039 ], [ -85.933257615999935, 15.936672268000052 ], [ -85.912180141999897, 15.95929596600007 ], [ -85.903187628999945, 15.983465887000079 ], [ -85.919178839999915, 16.003729559000078 ], [ -85.982492641999897, 16.012518622000073 ], [ -86.012766079999949, 16.019964911000045 ], [ -86.007923956999946, 16.031073309000078 ], [ -85.981841600999928, 16.033148505000042 ], [ -85.904551557999923, 16.018383360000087 ], [ -85.851004879999948, 16.008733665000079 ], [ -85.813465949999909, 16.00454336100006 ], [ -85.766331744999945, 15.991582225000059 ], [ -85.719349738999938, 15.979722398000092 ], [ -85.703195766999897, 15.976467190000051 ], [ -85.69204667899993, 15.971502997000073 ], [ -85.689442511999914, 15.960028387000079 ], [ -85.689605272999927, 15.946437893000052 ], [ -85.687001105999911, 15.935492255000042 ], [ -85.679554816999939, 15.935492255000042 ], [ -85.680083787999934, 15.942206122000073 ], [ -85.67804928299995, 15.945379950000074 ], [ -85.675038214999915, 15.947088934000078 ], [ -85.672718878999945, 15.949164130000042 ], [ -85.656220702999917, 15.948768477000044 ], [ -85.647334405999914, 15.935942688000068 ], [ -85.629563115999929, 15.922042590000046 ], [ -85.608463942999947, 15.907071985000073 ], [ -85.564054792999912, 15.888874601000055 ], [ -85.488577667999948, 15.869566580000082 ], [ -85.436394406999909, 15.873762960000079 ], [ -85.361990541999944, 15.881110034000073 ], [ -85.254250156999944, 15.884084998000048 ], [ -85.196354780999911, 15.90744777000009 ], [ -85.123782968999933, 15.958574594000083 ], [ -85.0757802359999, 15.986247321000064 ], [ -84.999948697274533, 15.987941798774955 ], [ -84.999948289881672, 15.06874461497199 ], [ -85.059634569179991, 15.137060858771576 ], [ -85.092681647040365, 15.166774807211596 ], [ -85.232647264059949, 15.226667792084925 ], [ -85.249312913859853, 15.236641343723022 ], [ -85.307113002762833, 15.305267645885124 ], [ -85.360417243161237, 15.381076971724838 ], [ -85.395944789720261, 15.408930569090501 ], [ -85.505240444790672, 15.449496568311986 ], [ -85.607714809590789, 15.534866033740457 ], [ -85.688304205674513, 15.577189032148112 ], [ -85.709362352090864, 15.581529852820438 ], [ -85.717837286961185, 15.577034003416486 ], [ -85.727836677021003, 15.573313300368511 ], [ -85.73587236231964, 15.571866360444176 ], [ -85.745561693117622, 15.575845445011282 ], [ -85.752382981589335, 15.581478175976997 ], [ -85.759126756594526, 15.584268703937539 ], [ -85.764139369935947, 15.584992174349338 ], [ -85.786308560391717, 15.574295152299442 ], [ -85.784551561205546, 15.565045071073143 ], [ -85.787858853103558, 15.557810370552147 ], [ -85.79579118471537, 15.548715318057475 ], [ -85.817262743181061, 15.531868801104281 ], [ -85.8368739487737, 15.519983222447763 ], [ -85.847855190764449, 15.520603339172737 ], [ -85.859611579111061, 15.52799306932468 ], [ -85.866277838851147, 15.53031850839244 ], [ -85.87312496574458, 15.531352037166755 ], [ -85.879946255115556, 15.52856151010559 ], [ -85.884597134150397, 15.523083807871444 ], [ -85.909143438718729, 15.484223130992689 ], [ -85.969940762056524, 15.426655585187063 ], [ -86.027508307862092, 15.396579902440521 ], [ -86.031668259582489, 15.39037872979452 ], [ -86.03828284427783, 15.39037872979452 ], [ -86.045543382321227, 15.393582668905026 ], [ -86.053656581985649, 15.395856432028722 ], [ -86.063345912783632, 15.396683254328707 ], [ -86.081329312197965, 15.394151108786616 ], [ -86.090191819796644, 15.390430405738641 ], [ -86.106805792753107, 15.38732982031496 ], [ -86.125667691310866, 15.378234767820288 ], [ -86.148560350379853, 15.37301544800448 ], [ -86.171633876602129, 15.378079739088662 ], [ -86.232896287933329, 15.409757392289805 ], [ -86.234446580645169, 15.436060696044251 ], [ -86.241061164441192, 15.449341539580359 ], [ -86.241681281166166, 15.454405828865902 ], [ -86.235583462206989, 15.499312648759712 ], [ -86.237392137337224, 15.512541816351757 ], [ -86.240260178764231, 15.520861720691869 ], [ -86.243283250721447, 15.523497219021408 ], [ -86.247624071393773, 15.524117335746439 ], [ -86.250156216036544, 15.522722073564807 ], [ -86.251758185591768, 15.520086575235268 ], [ -86.252895067153588, 15.518742988098381 ], [ -86.254264492712139, 15.518794664042503 ], [ -86.25565975579309, 15.520138251179333 ], [ -86.25775265176344, 15.521688543891173 ], [ -86.260181443618706, 15.522773749508929 ], [ -86.263540412360101, 15.523290514345717 ], [ -86.266330939421323, 15.524272366276648 ], [ -86.269147304904209, 15.526236070138509 ], [ -86.272532111168005, 15.53031850839244 ], [ -86.275374315072554, 15.532695624303585 ], [ -86.277906459715325, 15.534142564227921 ], [ -86.280748663619931, 15.535331121733861 ], [ -86.282996589221227, 15.535796209727266 ], [ -86.288810188239552, 15.535589504152256 ], [ -86.314105800742084, 15.541790675898937 ], [ -86.362061530115511, 15.539930324824638 ], [ -86.372345140116124, 15.540653795236437 ], [ -86.377383591879266, 15.542410794422608 ], [ -86.37976070779041, 15.546234850258145 ], [ -86.391232876196284, 15.559670722525823 ], [ -86.420946824636246, 15.582821764013204 ], [ -86.39903601839751, 15.595534165869026 ], [ -86.37552324080491, 15.604422511889425 ], [ -86.366014777160217, 15.613620917171602 ], [ -86.361673957387211, 15.626540025501754 ], [ -86.361906501383942, 15.648915919733895 ], [ -86.363456794095782, 15.672170314908101 ], [ -86.366014777160217, 15.675529282750176 ], [ -86.369502937110838, 15.678939928335012 ], [ -86.37591081443253, 15.678268133867277 ], [ -86.379605679058841, 15.678474840341607 ], [ -86.384902513240377, 15.681110337771884 ], [ -86.394333461619965, 15.684417628770518 ], [ -86.397434047942966, 15.68968862632903 ], [ -86.408777025139557, 15.714183254053921 ], [ -86.41774288642506, 15.722916572242013 ], [ -86.432108933780228, 15.734492092536016 ], [ -86.43833594394863, 15.741933499531342 ], [ -86.441539883059136, 15.750046698296501 ], [ -86.443296882245306, 15.764102688188473 ], [ -86.444692146225577, 15.77025218309177 ], [ -86.446423306090708, 15.775471502907521 ], [ -86.447250129290012, 15.779088853168048 ], [ -86.446319953303203, 15.781414293135128 ], [ -86.444821337434746, 15.782189439491049 ], [ -86.437715827223656, 15.782551173797629 ], [ -86.437868288390803, 15.790846896267226 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-AT", "NAME_1": "Atlántida" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -87.728357527078174, 15.921021546507177 ], [ -87.722157355999911, 15.922919012000079 ], [ -87.704335089999915, 15.920721747000073 ], [ -87.687489386999914, 15.914984442000048 ], [ -87.643055792999917, 15.889227606000077 ], [ -87.626047329999949, 15.887681382000039 ], [ -87.626047329999949, 15.893947658000059 ], [ -87.636301235999952, 15.903509833000044 ], [ -87.625965949999909, 15.914943752000056 ], [ -87.591297980999911, 15.935492255000042 ], [ -87.610422329999949, 15.910101630000042 ], [ -87.617298956999946, 15.894598700000074 ], [ -87.608631964999915, 15.887681382000039 ], [ -87.603138800999943, 15.880764065000051 ], [ -87.509632941999939, 15.798651434000078 ], [ -87.479400193999936, 15.786037502000056 ], [ -87.447336391999897, 15.792141018000052 ], [ -87.441761847999942, 15.797756252000056 ], [ -87.431548631999931, 15.813950914000088 ], [ -87.426828579999949, 15.818793036000045 ], [ -87.417144334999932, 15.819525458000044 ], [ -87.391184048999946, 15.818426825000074 ], [ -87.385853644999941, 15.822495835000041 ], [ -87.379953579999949, 15.839504299000055 ], [ -87.364979620999918, 15.848334052000041 ], [ -87.345082160999937, 15.85032786700009 ], [ -87.241769985999952, 15.827378648000092 ], [ -87.151722785999937, 15.796861070000091 ], [ -87.058990037999934, 15.787014065000051 ], [ -86.952504035999937, 15.763332424000055 ], [ -86.916859503999945, 15.76040273600006 ], [ -86.878732876999948, 15.764146226000037 ], [ -86.817372199999909, 15.78188711100006 ], [ -86.799631313999896, 15.78461334800005 ], [ -86.796864386999914, 15.787583726000037 ], [ -86.780181443999936, 15.800197658000059 ], [ -86.776356574999909, 15.801988023000092 ], [ -86.770659959999932, 15.806545315000051 ], [ -86.75845292899993, 15.802313544000071 ], [ -86.746449347999942, 15.795599677000041 ], [ -86.741566535999937, 15.792141018000052 ], [ -86.699086066999939, 15.788641669000071 ], [ -86.503814256999931, 15.805080471000053 ], [ -86.470570441999939, 15.804185289000088 ], [ -86.439930792999917, 15.792141018000052 ], [ -86.437868288390803, 15.790846896267226 ], [ -86.437715827223656, 15.782551173797629 ], [ -86.444821337434746, 15.782189439491049 ], [ -86.446319953303203, 15.781414293135128 ], [ -86.447250129290012, 15.779088853168048 ], [ -86.446423306090708, 15.775471502907521 ], [ -86.444692146225577, 15.77025218309177 ], [ -86.443296882245306, 15.764102688188473 ], [ -86.441539883059136, 15.750046698296501 ], [ -86.43833594394863, 15.741933499531342 ], [ -86.432108933780228, 15.734492092536016 ], [ -86.41774288642506, 15.722916572242013 ], [ -86.408777025139557, 15.714183254053921 ], [ -86.397434047942966, 15.68968862632903 ], [ -86.394333461619965, 15.684417628770518 ], [ -86.384902513240377, 15.681110337771884 ], [ -86.379605679058841, 15.678474840341607 ], [ -86.37591081443253, 15.678268133867277 ], [ -86.369502937110838, 15.678939928335012 ], [ -86.366014777160217, 15.675529282750176 ], [ -86.363456794095782, 15.672170314908101 ], [ -86.361906501383942, 15.648915919733895 ], [ -86.361673957387211, 15.626540025501754 ], [ -86.366014777160217, 15.613620917171602 ], [ -86.37552324080491, 15.604422511889425 ], [ -86.39903601839751, 15.595534165869026 ], [ -86.420946824636246, 15.582821764013204 ], [ -86.44278011830778, 15.592123521183566 ], [ -86.470401170777393, 15.596464341855892 ], [ -86.49561926981346, 15.593467109219716 ], [ -86.502802294390335, 15.591813462821051 ], [ -86.509313523600213, 15.589436346909849 ], [ -86.517685105683086, 15.587989406985514 ], [ -86.526392585449457, 15.58871287739737 ], [ -86.53685706260336, 15.592846990696046 ], [ -86.546753098976296, 15.594293932419021 ], [ -86.583340012731412, 15.592020169295381 ], [ -86.619177618552214, 15.601735338515027 ], [ -86.636256680401459, 15.604629218363698 ], [ -86.647961391904687, 15.602458808027563 ], [ -86.669562140680227, 15.595740872343356 ], [ -86.690594448674858, 15.586749171736869 ], [ -86.732142299827274, 15.564166571929718 ], [ -86.757205370131715, 15.555639960215956 ], [ -86.778935310116424, 15.550679022818656 ], [ -86.810018684114937, 15.550575670031151 ], [ -86.824979010672791, 15.548870347688364 ], [ -86.843763393965446, 15.553004461886417 ], [ -86.85580400315223, 15.569282538058644 ], [ -86.927117478688672, 15.550679022818656 ], [ -86.972360196266038, 15.551764228436355 ], [ -86.990627813822528, 15.54881867084498 ], [ -87.028325771617062, 15.516882636124762 ], [ -87.044578010266946, 15.499002590397197 ], [ -87.054163988277423, 15.49156118430119 ], [ -87.072095709949053, 15.481639309506534 ], [ -87.137259690582255, 15.458798326381668 ], [ -87.167567919124167, 15.437972723962048 ], [ -87.177696498594514, 15.429446113147606 ], [ -87.18245073131618, 15.426552232399615 ], [ -87.22368852410608, 15.427172350023909 ], [ -87.294872810231993, 15.443502102140314 ], [ -87.305208096176671, 15.443347073408688 ], [ -87.314664882977922, 15.444897366120529 ], [ -87.323940802625941, 15.451408596229726 ], [ -87.335387132610037, 15.455439358539536 ], [ -87.342751024340259, 15.456421210470467 ], [ -87.349468960024467, 15.454560859396111 ], [ -87.354739955784339, 15.451046861023826 ], [ -87.360631070067825, 15.449341539580359 ], [ -87.364868537053326, 15.445672512476449 ], [ -87.370759650437492, 15.442985338202789 ], [ -87.375720587834849, 15.441228339016618 ], [ -87.381973436424914, 15.442158515003428 ], [ -87.387192756240665, 15.443657130871884 ], [ -87.402023891589295, 15.45047842024286 ], [ -87.410498827358992, 15.455904446532941 ], [ -87.416699999105674, 15.460762030243473 ], [ -87.42408972925756, 15.46980540589476 ], [ -87.430755988098383, 15.480657457575603 ], [ -87.436156175067424, 15.505617174193219 ], [ -87.436698778325933, 15.518432928836603 ], [ -87.4384040997694, 15.52897492125561 ], [ -87.455560675984373, 15.539930324824638 ], [ -87.46475908126655, 15.540653795236437 ], [ -87.469926724238917, 15.538741767318697 ], [ -87.508864916382777, 15.517399400062232 ], [ -87.52336015494717, 15.519104723304338 ], [ -87.56534725567127, 15.508097641992549 ], [ -87.609995694046006, 15.504428615787958 ], [ -87.625550299806491, 15.510784817165586 ], [ -87.665418667037841, 15.553572903566646 ], [ -87.668674282991731, 15.558585516908067 ], [ -87.671516485997017, 15.564683335867244 ], [ -87.676994188231163, 15.595534165869026 ], [ -87.678001878583814, 15.61010691969858 ], [ -87.687200283865991, 15.644678452748394 ], [ -87.697897305016625, 15.663695380037723 ], [ -87.714588793238192, 15.67211863896398 ], [ -87.787581752695701, 15.721004544324273 ], [ -87.773241542862877, 15.724621893685423 ], [ -87.764275681577431, 15.729686183870285 ], [ -87.758410406614928, 15.739814765139272 ], [ -87.757867805155058, 15.751131903914199 ], [ -87.76117509615375, 15.760433661084562 ], [ -87.767376267900431, 15.765291245694414 ], [ -87.775437791620789, 15.763224189045047 ], [ -87.77952022987472, 15.776453354838452 ], [ -87.794661423585808, 15.79335154953435 ], [ -87.794868130060138, 15.803893541054038 ], [ -87.789493780613441, 15.81283356391782 ], [ -87.773732469278002, 15.828491523365074 ], [ -87.766446091913622, 15.838620102835478 ], [ -87.757376878739933, 15.862804673996493 ], [ -87.751614955665673, 15.872209783954361 ], [ -87.740530361786739, 15.882028306860832 ], [ -87.730686001357867, 15.887867743401614 ], [ -87.725156623179601, 15.897324530202866 ], [ -87.728357527078174, 15.921021546507177 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-IB", "NAME_1": "Islas de la Bahía" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -86.878732876999948, 16.12726471600007 ], [ -86.872547980999911, 16.120998440000051 ], [ -86.88117428299995, 16.104559637000079 ], [ -86.878732876999948, 16.093166408000059 ], [ -86.897572394999941, 16.093817450000074 ], [ -86.913197394999941, 16.09015534100007 ], [ -86.940174933999913, 16.079494533000059 ], [ -86.963720509999916, 16.066387834000068 ], [ -86.978935229999934, 16.077789236000058 ], [ -86.997404698999901, 16.083959264000043 ], [ -86.988735173999942, 16.095466383000087 ], [ -86.944251203999897, 16.116508342000088 ], [ -86.918365037999934, 16.122056382000039 ], [ -86.903920050999943, 16.124172268000052 ], [ -86.890533006999931, 16.127834377000056 ], [ -86.878732876999948, 16.12726471600007 ] ] ], [ [ [ -86.606542220999927, 16.285029102000067 ], [ -86.599332887999935, 16.309298272000092 ], [ -86.570446806999939, 16.332440401000042 ], [ -86.530681582999932, 16.356180794000068 ], [ -86.499999801999934, 16.368908871000087 ], [ -86.440390430999912, 16.396545291000052 ], [ -86.3754442259999, 16.417332689000091 ], [ -86.3321254949999, 16.429448093000076 ], [ -86.302047367999933, 16.432903318000058 ], [ -86.262351476999925, 16.43058202800006 ], [ -86.23107686599991, 16.428835329000037 ], [ -86.181750880999914, 16.428225143000077 ], [ -86.202208966999933, 16.422471073000054 ], [ -86.223870070999908, 16.412101045000043 ], [ -86.243112175999897, 16.417881076000072 ], [ -86.273185837999904, 16.410972052000091 ], [ -86.294341600999928, 16.415269273000092 ], [ -86.312123175999943, 16.412502346000053 ], [ -86.318918423999946, 16.409328518000052 ], [ -86.33267167899993, 16.400458075000074 ], [ -86.338856574999909, 16.397853908000059 ], [ -86.347767706999946, 16.397528387000079 ], [ -86.362205888999938, 16.394254366000041 ], [ -86.380253568999933, 16.381557601000054 ], [ -86.416959740999914, 16.364231547000088 ], [ -86.453071272999921, 16.351511373000051 ], [ -86.491021777999947, 16.325487820000092 ], [ -86.525265547999936, 16.315212384000063 ], [ -86.548152687999902, 16.312852734000046 ], [ -86.563799277999919, 16.298390453000081 ], [ -86.580649961999939, 16.282767 ], [ -86.60050418499992, 16.269449111000085 ], [ -86.606542220999927, 16.285029102000067 ] ] ], [ [ [ -85.911472683999932, 16.462042911000083 ], [ -85.895569831999921, 16.48874459600006 ], [ -85.884144660999937, 16.502834377000056 ], [ -85.851131208999902, 16.517217619000064 ], [ -85.832128226999941, 16.510497688000044 ], [ -85.816949995999948, 16.498308834000056 ], [ -85.822061113999951, 16.486163010000041 ], [ -85.844254139999919, 16.483778923000045 ], [ -85.849366857999939, 16.469205087000091 ], [ -85.862720490999948, 16.452220959000044 ], [ -85.882362561999912, 16.451046980000058 ], [ -85.895699535999938, 16.436496074000047 ], [ -85.947068220999938, 16.403189644000065 ], [ -85.950847252999949, 16.412307873000088 ], [ -85.940679118999924, 16.429902700000071 ], [ -85.926691276999918, 16.454782230000092 ], [ -85.911472683999932, 16.462042911000083 ] ] ], [ [ [ -83.941151495999918, 17.418646552000041 ], [ -83.933583136999914, 17.417873440000051 ], [ -83.926136847999942, 17.41632721600007 ], [ -83.918934699999909, 17.414048570000091 ], [ -83.91234290299991, 17.411118882000039 ], [ -83.921945766999897, 17.409084377000056 ], [ -83.93032792899993, 17.409409898000092 ], [ -83.936879035999937, 17.412543036000045 ], [ -83.941151495999918, 17.418646552000041 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-CM", "NAME_1": "Comayagua" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.074954392830932, 14.664841620144614 ], [ -88.06224199097511, 14.68561554572085 ], [ -88.071595424988857, 14.710885322499621 ], [ -88.077874112000643, 14.721375637175925 ], [ -88.077331508742134, 14.735224921492943 ], [ -88.074773525677642, 14.742459622013939 ], [ -88.069812588280286, 14.747213852936966 ], [ -88.058417935139573, 14.751968084759312 ], [ -88.052966071327091, 14.755378730344091 ], [ -88.02252865337465, 14.786281236289994 ], [ -87.98705278186037, 14.792585760824181 ], [ -87.985812548410365, 14.836407375999613 ], [ -87.980283169332779, 14.820129298928009 ], [ -87.973668586436077, 14.81046580745101 ], [ -87.96297156438618, 14.803541165292529 ], [ -87.883674078595845, 14.858214830350107 ], [ -87.869437221550527, 14.876818346489472 ], [ -87.847423061624966, 14.898832506415033 ], [ -87.84367652105459, 14.901416327001868 ], [ -87.821455654654699, 14.906583970873555 ], [ -87.802593756996259, 14.915523992837961 ], [ -87.757221849109044, 14.947925116450961 ], [ -87.740685391417685, 14.962497870280458 ], [ -87.735801968386113, 14.983788559794164 ], [ -87.735879482751898, 15.016551419512382 ], [ -87.642345139916245, 15.017946681694013 ], [ -87.631183030772263, 15.016603095456503 ], [ -87.587413093339592, 15.026266587832765 ], [ -87.58387325744485, 15.034741522703087 ], [ -87.554727748886478, 15.055618801066828 ], [ -87.551342942622682, 15.057014065047042 ], [ -87.548268194721402, 15.057634181772073 ], [ -87.54359147816416, 15.056497301109516 ], [ -87.537571173570768, 15.054068508354987 ], [ -87.524729579606401, 15.045490220697104 ], [ -87.516848923938653, 15.037687079395198 ], [ -87.506410285206471, 15.022649238471558 ], [ -87.503232185417005, 15.013864244339402 ], [ -87.500467494978921, 15.001565252734224 ], [ -87.498658819848629, 14.997172756117777 ], [ -87.496436733568373, 14.993452053069802 ], [ -87.491604987380242, 14.989266262028366 ], [ -87.486669888404606, 14.985803941398785 ], [ -87.47713558633825, 14.982600002288279 ], [ -87.473182339293487, 14.980222887276398 ], [ -87.469099901039613, 14.974590155411306 ], [ -87.463751390014636, 14.972006333925151 ], [ -87.460676643012675, 14.965908514965975 ], [ -87.459436407763974, 14.960999254412059 ], [ -87.460263230963335, 14.951645820398255 ], [ -87.460134039754109, 14.946994941363414 ], [ -87.458738775773838, 14.941362210397699 ], [ -87.455638190350214, 14.934282537708953 ], [ -87.454552984732459, 14.929941717935947 ], [ -87.451788296092957, 14.923740546189265 ], [ -87.451710781727172, 14.921363430278063 ], [ -87.452020840089688, 14.918779608791908 ], [ -87.452020840089688, 14.916454168824828 ], [ -87.449437018603533, 14.913922024182057 ], [ -87.444269374731846, 14.91087311380312 ], [ -87.433572353581212, 14.90875438120969 ], [ -87.418637865445135, 14.90854767473536 ], [ -87.394065720656442, 14.920846666340537 ], [ -87.374687059060534, 14.938830063956289 ], [ -87.350657518429728, 14.937279771244448 ], [ -87.314897426974653, 14.927978014074085 ], [ -87.310556607201647, 14.925807602838574 ], [ -87.30285681778787, 14.919554755147828 ], [ -87.297198249299754, 14.916660875299158 ], [ -87.291746384587952, 14.918314520798504 ], [ -87.285235155378075, 14.92420563418267 ], [ -87.27900814520973, 14.923017075777409 ], [ -87.272677782253822, 14.921260077490558 ], [ -87.245806036819147, 14.897747300797278 ], [ -87.228391079085043, 14.889995836338755 ], [ -87.224670376037011, 14.886946925959876 ], [ -87.219425217799539, 14.881469225524313 ], [ -87.218262498715319, 14.874286200048061 ], [ -87.208340623920662, 14.859455063800112 ], [ -87.224541184827785, 14.847466132356089 ], [ -87.24544430161319, 14.845502428494285 ], [ -87.248364020782901, 14.844572252507419 ], [ -87.251361254318397, 14.841781725446253 ], [ -87.254487678163798, 14.836614081574567 ], [ -87.257252366803243, 14.82689891235492 ], [ -87.25820838121183, 14.811292628851731 ], [ -87.253609178121053, 14.795738023091303 ], [ -87.249449226400657, 14.761838284509224 ], [ -87.255417854150608, 14.738325506916624 ], [ -87.266244065611147, 14.71083364475686 ], [ -87.267019212866387, 14.706544500927976 ], [ -87.266011521614416, 14.705045885059519 ], [ -87.266089036879521, 14.703133857141779 ], [ -87.268104417584766, 14.700756741230634 ], [ -87.275519986158429, 14.695744126989837 ], [ -87.280403409189944, 14.693367011078692 ], [ -87.285105964168906, 14.691610011892521 ], [ -87.288749151951777, 14.690679835905712 ], [ -87.291978928584683, 14.689336248768825 ], [ -87.300738085194439, 14.682876695503069 ], [ -87.306293300895106, 14.681068020372834 ], [ -87.310014003943138, 14.680602932379429 ], [ -87.312261928645057, 14.679259345242599 ], [ -87.313347134262813, 14.676417141337993 ], [ -87.313812222256217, 14.670267646434695 ], [ -87.315052455706223, 14.667632148105156 ], [ -87.318669806866069, 14.666598619330784 ], [ -87.320555996362145, 14.667942206467615 ], [ -87.322106289073986, 14.66959585196696 ], [ -87.323656581785826, 14.670629380741332 ], [ -87.325051845766041, 14.66959585196696 ], [ -87.32582699302128, 14.665978501706491 ], [ -87.324173346622615, 14.658433742822979 ], [ -87.3235015530542, 14.652697659069702 ], [ -87.32347571463248, 14.647271632779621 ], [ -87.327144741736447, 14.633525702149427 ], [ -87.342130906715965, 14.607790839175891 ], [ -87.353215502393482, 14.608410955900865 ], [ -87.357272102225693, 14.609237779100226 ], [ -87.36130286273692, 14.610529690292935 ], [ -87.36455847869081, 14.612028307060712 ], [ -87.36590206582764, 14.613940334978452 ], [ -87.366987271445396, 14.618022773232383 ], [ -87.368382535425667, 14.619573065944223 ], [ -87.371121384744072, 14.619883124306739 ], [ -87.374170295123008, 14.619728095575113 ], [ -87.377735969439414, 14.619883124306739 ], [ -87.38192175958153, 14.620813300293548 ], [ -87.386365933041361, 14.62262197542384 ], [ -87.390629239347902, 14.62489573854748 ], [ -87.395202603117639, 14.626497708102704 ], [ -87.39869076216894, 14.626756090521155 ], [ -87.40197221564523, 14.62468903207315 ], [ -87.403729213932081, 14.620709947506043 ], [ -87.403419155569566, 14.605878811258094 ], [ -87.40403927319386, 14.600091051560753 ], [ -87.405357021909026, 14.594561672483167 ], [ -87.406028814578121, 14.589549058242426 ], [ -87.415046352707009, 14.571513983783291 ], [ -87.46592180035077, 14.522214667273033 ], [ -87.463002082080379, 14.506815090244231 ], [ -87.460495774960009, 14.498960272998204 ], [ -87.456335822340293, 14.489606838085081 ], [ -87.451064825681158, 14.482372138463404 ], [ -87.435225999979878, 14.472088528462791 ], [ -87.411894091339207, 14.451934718712266 ], [ -87.408974372169496, 14.448214016563611 ], [ -87.406958990564931, 14.44356313752877 ], [ -87.407372402614271, 14.433951321096572 ], [ -87.409852871312921, 14.429817205999257 ], [ -87.413186000733333, 14.427026678938091 ], [ -87.412359178433348, 14.423822739827585 ], [ -87.410679693612963, 14.421135566453188 ], [ -87.386262580253856, 14.402635403101385 ], [ -87.382748582780835, 14.395297349792827 ], [ -87.393187222412394, 14.374006659379802 ], [ -87.419413010901735, 14.339486803173429 ], [ -87.424554816351701, 14.336024482543792 ], [ -87.432047899291092, 14.333285631426747 ], [ -87.44434688999695, 14.339176743911594 ], [ -87.450134649694292, 14.340106919898403 ], [ -87.454708015262668, 14.339900214323393 ], [ -87.459281379032404, 14.338039863249094 ], [ -87.46207190609357, 14.332252101753056 ], [ -87.463854742802141, 14.321606757445863 ], [ -87.462046067671849, 14.282177638886935 ], [ -87.459875658235035, 14.271790676098817 ], [ -87.456568366337024, 14.265744533983025 ], [ -87.450599737687753, 14.259336655762013 ], [ -87.44491533077786, 14.254220688733767 ], [ -87.440419481373965, 14.251223456097591 ], [ -87.437060512632513, 14.249673163385751 ], [ -87.433727383212158, 14.248639635510756 ], [ -87.431401944144397, 14.24734772431799 ], [ -87.429877488954958, 14.245539049187755 ], [ -87.426931932262846, 14.239337877441073 ], [ -87.425691697913521, 14.234945379925307 ], [ -87.42545915391679, 14.229054267440461 ], [ -87.429644944958227, 14.222749742006954 ], [ -87.437086351054234, 14.218874010227353 ], [ -87.46320878765539, 14.213189602418197 ], [ -87.482949185356574, 14.201097317287349 ], [ -87.493542853719703, 14.179858302818388 ], [ -87.494266324131559, 14.174432278326947 ], [ -87.500674200553874, 14.166732488913226 ], [ -87.512585619430752, 14.159601142079055 ], [ -87.541214362253015, 14.146785387435671 ], [ -87.573305426604122, 14.14332306590677 ], [ -87.579532436772524, 14.143529771481781 ], [ -87.585707770996805, 14.140325833270595 ], [ -87.593433397033607, 14.133762926317956 ], [ -87.614336513819069, 14.109113267163536 ], [ -87.615240852283478, 14.088494371218246 ], [ -87.650613369211612, 14.085032049689346 ], [ -87.663609991907606, 14.075730292518983 ], [ -87.689629075721257, 14.051028958319762 ], [ -87.690688442917292, 14.084773668170214 ], [ -87.696579556301458, 14.095160630958333 ], [ -87.703685064713966, 14.104204005710301 ], [ -87.714304572398078, 14.109785060731951 ], [ -87.731926235707192, 14.12440949140489 ], [ -87.742778285589395, 14.130662339994956 ], [ -87.754121262786043, 14.134951483823897 ], [ -87.764275681577431, 14.136915187685759 ], [ -87.780967169799055, 14.14311636033176 ], [ -87.784558681637805, 14.146682033748846 ], [ -87.785798915987186, 14.150557766427767 ], [ -87.784326137641131, 14.155622057511948 ], [ -87.782078212939155, 14.159652818023119 ], [ -87.777117276441118, 14.175362454313813 ], [ -87.791121588590443, 14.191382148067646 ], [ -87.825641445696135, 14.20554148984786 ], [ -87.828716192698096, 14.225281887549045 ], [ -87.825770636905361, 14.232206528808263 ], [ -87.82360022656917, 14.233653468732598 ], [ -87.820706345821179, 14.234170234468706 ], [ -87.819104377165274, 14.234066880781882 ], [ -87.813239102202772, 14.231689764870737 ], [ -87.775851202770752, 14.24062978773452 ], [ -87.755852423550493, 14.238976142235174 ], [ -87.740065273793334, 14.241198228515429 ], [ -87.727662930299971, 14.244143785207484 ], [ -87.706088019946151, 14.251740220934437 ], [ -87.696837937820533, 14.256081040707443 ], [ -87.68373796323641, 14.265692857139641 ], [ -87.668648443670747, 14.263625800490274 ], [ -87.652912970756972, 14.266933092388285 ], [ -87.644102139102415, 14.270395413017866 ], [ -87.639477097589975, 14.273702704016557 ], [ -87.629942797322201, 14.285639960415836 ], [ -87.626635505424247, 14.298559067846668 ], [ -87.634929572241958, 14.306362210047951 ], [ -87.62818579813603, 14.317059231198527 ], [ -87.631648118765668, 14.336386216850428 ], [ -87.634464484248554, 14.344189358152335 ], [ -87.646582607801065, 14.369820868338365 ], [ -87.651155971570802, 14.373438219498212 ], [ -87.696114468308053, 14.355454820083878 ], [ -87.70430518323758, 14.357728583207518 ], [ -87.714976365966493, 14.358503730462758 ], [ -87.735259366026924, 14.365635077296986 ], [ -87.746033902442605, 14.371267808262701 ], [ -87.776522997238487, 14.377210598490308 ], [ -87.779442714609559, 14.378347480052128 ], [ -87.788744472679241, 14.387855942797501 ], [ -87.789545458356201, 14.389871324402066 ], [ -87.829129604747436, 14.400361639977689 ], [ -87.842875536276949, 14.414314277082212 ], [ -87.853107469434178, 14.42909373648672 ], [ -87.848999192758527, 14.432814439534752 ], [ -87.848146532036822, 14.435088201759072 ], [ -87.847784796830865, 14.438188788082073 ], [ -87.848224047301926, 14.441754462398478 ], [ -87.855820482129502, 14.455965481022133 ], [ -87.887937384902386, 14.495549628312688 ], [ -87.899745450092439, 14.506505031881716 ], [ -87.898763597262189, 14.515910141839584 ], [ -87.899047818102304, 14.525987047164506 ], [ -87.902691005885174, 14.530276190993391 ], [ -87.909021368841081, 14.535237128390747 ], [ -87.933257615946218, 14.546916002371574 ], [ -87.940983242882339, 14.553065497274872 ], [ -87.947365281782311, 14.56536448798073 ], [ -87.949639044906007, 14.571824042145806 ], [ -87.950646735258601, 14.582159328989803 ], [ -87.951602748767812, 14.585880032037835 ], [ -87.959767626174994, 14.600917873860794 ], [ -87.969146897711141, 14.613061834935706 ], [ -87.987337001801166, 14.619469713156718 ], [ -88.00420935717608, 14.631561998287566 ], [ -88.038729214281773, 14.640295315576338 ], [ -88.04622229722122, 14.641173813820444 ], [ -88.056144172015934, 14.64417104735594 ], [ -88.061311814988244, 14.64649648732302 ], [ -88.074954392830932, 14.664841620144614 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-YO", "NAME_1": "Yoro" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -87.787581752695701, 15.721004544324273 ], [ -87.714588793238192, 15.67211863896398 ], [ -87.697897305016625, 15.663695380037723 ], [ -87.687200283865991, 15.644678452748394 ], [ -87.678001878583814, 15.61010691969858 ], [ -87.676994188231163, 15.595534165869026 ], [ -87.671516485997017, 15.564683335867244 ], [ -87.668674282991731, 15.558585516908067 ], [ -87.665418667037841, 15.553572903566646 ], [ -87.625550299806491, 15.510784817165586 ], [ -87.609995694046006, 15.504428615787958 ], [ -87.56534725567127, 15.508097641992549 ], [ -87.52336015494717, 15.519104723304338 ], [ -87.508864916382777, 15.517399400062232 ], [ -87.469926724238917, 15.538741767318697 ], [ -87.46475908126655, 15.540653795236437 ], [ -87.455560675984373, 15.539930324824638 ], [ -87.4384040997694, 15.52897492125561 ], [ -87.436698778325933, 15.518432928836603 ], [ -87.436156175067424, 15.505617174193219 ], [ -87.430755988098383, 15.480657457575603 ], [ -87.42408972925756, 15.46980540589476 ], [ -87.416699999105674, 15.460762030243473 ], [ -87.410498827358992, 15.455904446532941 ], [ -87.402023891589295, 15.45047842024286 ], [ -87.387192756240665, 15.443657130871884 ], [ -87.381973436424914, 15.442158515003428 ], [ -87.375720587834849, 15.441228339016618 ], [ -87.370759650437492, 15.442985338202789 ], [ -87.364868537053326, 15.445672512476449 ], [ -87.360631070067825, 15.449341539580359 ], [ -87.354739955784339, 15.451046861023826 ], [ -87.349468960024467, 15.454560859396111 ], [ -87.342751024340259, 15.456421210470467 ], [ -87.335387132610037, 15.455439358539536 ], [ -87.323940802625941, 15.451408596229726 ], [ -87.314664882977922, 15.444897366120529 ], [ -87.305208096176671, 15.443347073408688 ], [ -87.294872810231993, 15.443502102140314 ], [ -87.22368852410608, 15.427172350023909 ], [ -87.18245073131618, 15.426552232399615 ], [ -87.177696498594514, 15.429446113147606 ], [ -87.167567919124167, 15.437972723962048 ], [ -87.137259690582255, 15.458798326381668 ], [ -87.072095709949053, 15.481639309506534 ], [ -87.054163988277423, 15.49156118430119 ], [ -87.044578010266946, 15.499002590397197 ], [ -87.028325771617062, 15.516882636124762 ], [ -86.990627813822528, 15.54881867084498 ], [ -86.972360196266038, 15.551764228436355 ], [ -86.927117478688672, 15.550679022818656 ], [ -86.85580400315223, 15.569282538058644 ], [ -86.843763393965446, 15.553004461886417 ], [ -86.824979010672791, 15.548870347688364 ], [ -86.810018684114937, 15.550575670031151 ], [ -86.778935310116424, 15.550679022818656 ], [ -86.757205370131715, 15.555639960215956 ], [ -86.732142299827274, 15.564166571929718 ], [ -86.690594448674858, 15.586749171736869 ], [ -86.669562140680227, 15.595740872343356 ], [ -86.647961391904687, 15.602458808027563 ], [ -86.636256680401459, 15.604629218363698 ], [ -86.619177618552214, 15.601735338515027 ], [ -86.583340012731412, 15.592020169295381 ], [ -86.546753098976296, 15.594293932419021 ], [ -86.53685706260336, 15.592846990696046 ], [ -86.526392585449457, 15.58871287739737 ], [ -86.517685105683086, 15.587989406985514 ], [ -86.509313523600213, 15.589436346909849 ], [ -86.502802294390335, 15.591813462821051 ], [ -86.49561926981346, 15.593467109219716 ], [ -86.470401170777393, 15.596464341855892 ], [ -86.44278011830778, 15.592123521183566 ], [ -86.420946824636246, 15.582821764013204 ], [ -86.391232876196284, 15.559670722525823 ], [ -86.37976070779041, 15.546234850258145 ], [ -86.377383591879266, 15.542410794422608 ], [ -86.372345140116124, 15.540653795236437 ], [ -86.362061530115511, 15.539930324824638 ], [ -86.314105800742084, 15.541790675898937 ], [ -86.288810188239552, 15.535589504152256 ], [ -86.282996589221227, 15.535796209727266 ], [ -86.280748663619931, 15.535331121733861 ], [ -86.277906459715325, 15.534142564227921 ], [ -86.275374315072554, 15.532695624303585 ], [ -86.272532111168005, 15.53031850839244 ], [ -86.269147304904209, 15.526236070138509 ], [ -86.266330939421323, 15.524272366276648 ], [ -86.263540412360101, 15.523290514345717 ], [ -86.260181443618706, 15.522773749508929 ], [ -86.25775265176344, 15.521688543891173 ], [ -86.25565975579309, 15.520138251179333 ], [ -86.254264492712139, 15.518794664042503 ], [ -86.252895067153588, 15.518742988098381 ], [ -86.251758185591768, 15.520086575235268 ], [ -86.250156216036544, 15.522722073564807 ], [ -86.247624071393773, 15.524117335746439 ], [ -86.243283250721447, 15.523497219021408 ], [ -86.240260178764231, 15.520861720691869 ], [ -86.237392137337224, 15.512541816351757 ], [ -86.235583462206989, 15.499312648759712 ], [ -86.241681281166166, 15.454405828865902 ], [ -86.241061164441192, 15.449341539580359 ], [ -86.234446580645169, 15.436060696044251 ], [ -86.232896287933329, 15.409757392289805 ], [ -86.27764807819625, 15.378544827082067 ], [ -86.290515509683019, 15.374152330465677 ], [ -86.346067673884022, 15.341596178121108 ], [ -86.371957567387824, 15.329400540202755 ], [ -86.385264248446276, 15.32795360027842 ], [ -86.409112921923793, 15.328263657741616 ], [ -86.420404222277, 15.331881008002085 ], [ -86.426605394023682, 15.336841946298762 ], [ -86.429680141925019, 15.342836412470433 ], [ -86.434486049691429, 15.349864407416476 ], [ -86.442754278986797, 15.358494371018367 ], [ -86.451978521791318, 15.366400865107835 ], [ -86.464742601389901, 15.374669094403146 ], [ -86.47918616401023, 15.382317206074163 ], [ -86.503034838387066, 15.389293525076084 ], [ -86.514067756321879, 15.3892418482327 ], [ -86.526547614181027, 15.386244614697205 ], [ -86.611322801306244, 15.341492825333603 ], [ -86.618790045823914, 15.338753974216502 ], [ -86.624138556848891, 15.339115709422458 ], [ -86.628789435883732, 15.340355942872463 ], [ -86.632949387604128, 15.340872707709252 ], [ -86.63822038426332, 15.337203681504661 ], [ -86.64186357294551, 15.331260891277111 ], [ -86.651837123684288, 15.305939439453539 ], [ -86.659743618673019, 15.296586005439792 ], [ -86.666358201569722, 15.282323309972753 ], [ -86.676280077263755, 15.279274400493193 ], [ -86.686356980790038, 15.271936347184635 ], [ -86.692739020589329, 15.268629055286681 ], [ -86.70064551467874, 15.266923732943894 ], [ -86.71875810440298, 15.266820380156389 ], [ -86.729661831128567, 15.268680732130065 ], [ -86.738136765998945, 15.27090281841032 ], [ -86.768729213582333, 15.295294094247026 ], [ -86.815315518296529, 15.28537221945237 ], [ -86.817692634207674, 15.277259018888572 ], [ -86.826219245022116, 15.271109523985331 ], [ -86.829707404073417, 15.269765936848501 ], [ -86.844616054687151, 15.262014472389978 ], [ -86.851437344058183, 15.260619208409707 ], [ -86.855545619834459, 15.257673651717653 ], [ -86.85887875015419, 15.253591213463721 ], [ -86.862056850842976, 15.240051988408538 ], [ -86.862909511564681, 15.23193878784474 ], [ -86.855132208684495, 15.17163239182139 ], [ -86.862987026829785, 15.154630846136627 ], [ -86.863193732404795, 15.15158193575769 ], [ -86.862599453202165, 15.147602851190641 ], [ -86.862444423571276, 15.143778795355104 ], [ -86.864537320440945, 15.137991033859123 ], [ -86.871487800121884, 15.127242335865105 ], [ -86.875802782372489, 15.118095608325632 ], [ -86.878231574227755, 15.11111929022303 ], [ -86.879006720583675, 15.10460805921457 ], [ -86.879161750214564, 15.098303533781063 ], [ -86.88066036698234, 15.090552070221861 ], [ -86.886163906738886, 15.081560370514694 ], [ -86.901020881408556, 15.071535142033156 ], [ -86.920993822207095, 15.053965155567482 ], [ -86.951250373006303, 15.04600698553395 ], [ -86.959131028673994, 15.047453925458285 ], [ -86.96349768776804, 15.047608954189855 ], [ -86.969569668305553, 15.043784898354374 ], [ -86.973316209775248, 15.040580960143188 ], [ -86.987475551555463, 15.015879625044647 ], [ -87.021039395151945, 15.023062648722259 ], [ -87.074705369856929, 15.020892239285388 ], [ -87.090053270042347, 15.025078030326824 ], [ -87.098088955340984, 15.029057114893931 ], [ -87.109690314056706, 15.03133087801757 ], [ -87.119379645754009, 15.031899318798537 ], [ -87.167025315865601, 15.02595652947025 ], [ -87.184827847227325, 15.011383774741375 ], [ -87.184233568024752, 15.001048488796698 ], [ -87.185525479217461, 14.980481268795529 ], [ -87.186894903876691, 14.974590155411306 ], [ -87.190202195774702, 14.96911245407648 ], [ -87.210149299050897, 14.952265937123286 ], [ -87.220277880319884, 14.937796536081237 ], [ -87.22655656643235, 14.923947251764218 ], [ -87.245806036819147, 14.897747300797278 ], [ -87.272677782253822, 14.921260077490558 ], [ -87.27900814520973, 14.923017075777409 ], [ -87.285235155378075, 14.92420563418267 ], [ -87.291746384587952, 14.918314520798504 ], [ -87.297198249299754, 14.916660875299158 ], [ -87.30285681778787, 14.919554755147828 ], [ -87.310556607201647, 14.925807602838574 ], [ -87.314897426974653, 14.927978014074085 ], [ -87.350657518429728, 14.937279771244448 ], [ -87.374687059060534, 14.938830063956289 ], [ -87.394065720656442, 14.920846666340537 ], [ -87.418637865445135, 14.90854767473536 ], [ -87.433572353581212, 14.90875438120969 ], [ -87.444269374731846, 14.91087311380312 ], [ -87.449437018603533, 14.913922024182057 ], [ -87.452020840089688, 14.916454168824828 ], [ -87.452020840089688, 14.918779608791908 ], [ -87.451710781727172, 14.921363430278063 ], [ -87.451788296092957, 14.923740546189265 ], [ -87.454552984732459, 14.929941717935947 ], [ -87.455638190350214, 14.934282537708953 ], [ -87.458738775773838, 14.941362210397699 ], [ -87.460134039754109, 14.946994941363414 ], [ -87.460263230963335, 14.951645820398255 ], [ -87.459436407763974, 14.960999254412059 ], [ -87.460676643012675, 14.965908514965975 ], [ -87.463751390014636, 14.972006333925151 ], [ -87.469099901039613, 14.974590155411306 ], [ -87.473182339293487, 14.980222887276398 ], [ -87.47713558633825, 14.982600002288279 ], [ -87.486669888404606, 14.985803941398785 ], [ -87.491604987380242, 14.989266262028366 ], [ -87.496436733568373, 14.993452053069802 ], [ -87.498658819848629, 14.997172756117777 ], [ -87.500467494978921, 15.001565252734224 ], [ -87.503232185417005, 15.013864244339402 ], [ -87.506410285206471, 15.022649238471558 ], [ -87.516848923938653, 15.037687079395198 ], [ -87.524729579606401, 15.045490220697104 ], [ -87.537571173570768, 15.054068508354987 ], [ -87.54359147816416, 15.056497301109516 ], [ -87.548268194721402, 15.057634181772073 ], [ -87.551342942622682, 15.057014065047042 ], [ -87.554727748886478, 15.055618801066828 ], [ -87.58387325744485, 15.034741522703087 ], [ -87.587413093339592, 15.026266587832765 ], [ -87.631183030772263, 15.016603095456503 ], [ -87.642345139916245, 15.017946681694013 ], [ -87.735879482751898, 15.016551419512382 ], [ -87.741279669720939, 15.061458238506873 ], [ -87.740065273793334, 15.067866115828565 ], [ -87.737429776363058, 15.075152493193002 ], [ -87.733786586781548, 15.077684637835773 ], [ -87.732158779703923, 15.081457016827869 ], [ -87.732313809334812, 15.08646963106861 ], [ -87.733321498788143, 15.094376126057341 ], [ -87.737300585153889, 15.104556383270449 ], [ -87.738359952349924, 15.11111929022303 ], [ -87.767686327162266, 15.139696357101172 ], [ -87.783395961654264, 15.136854153196623 ], [ -87.788434414316725, 15.137474269921597 ], [ -87.794067146181817, 15.139593004313667 ], [ -87.796521775559484, 15.149204819846545 ], [ -87.799803229935094, 15.153390610887982 ], [ -87.810991176601476, 15.153700670149817 ], [ -87.814427659708713, 15.154785874868196 ], [ -87.817864142815949, 15.157989813978702 ], [ -87.822153285745514, 15.159850165053058 ], [ -87.836932746049399, 15.159591783533983 ], [ -87.842565477015114, 15.160418605833968 ], [ -87.845149299400646, 15.165172838555634 ], [ -87.846079475387455, 15.16930695185431 ], [ -87.848689134396011, 15.173802802157581 ], [ -87.853081631012458, 15.178195298774028 ], [ -87.867861091316286, 15.18935740791801 ], [ -87.878713142097808, 15.191837877516036 ], [ -87.897755906909538, 15.193284817440372 ], [ -87.918374802854828, 15.187807115206169 ], [ -87.92310319715483, 15.190804347842345 ], [ -87.922974005945605, 15.194938462939717 ], [ -87.919795905256819, 15.204653632159363 ], [ -87.920596890034403, 15.211578274317901 ], [ -87.917186245348944, 15.225840968885564 ], [ -87.917496303711403, 15.237778225284842 ], [ -87.918374802854828, 15.239070136477608 ], [ -87.921036139606144, 15.240465400457822 ], [ -87.926849737725206, 15.237829902128283 ], [ -87.930725471303447, 15.237313137291437 ], [ -87.935117967020517, 15.244754544286764 ], [ -87.926462164996906, 15.259120592541308 ], [ -87.928374192914646, 15.26971426000506 ], [ -87.92553198901004, 15.276070461382687 ], [ -87.924059210664041, 15.282891750753663 ], [ -87.924110886608105, 15.289816392012881 ], [ -87.92576453300677, 15.296430975808846 ], [ -87.913749763141027, 15.308833320201529 ], [ -87.911140103233151, 15.313535875180492 ], [ -87.911269294442377, 15.316998195810072 ], [ -87.912587043157487, 15.320253810864642 ], [ -87.913310512670023, 15.323406073131764 ], [ -87.911579352804893, 15.32661001224227 ], [ -87.90687679692661, 15.32893545220935 ], [ -87.893570115868158, 15.332501126525756 ], [ -87.887627325640551, 15.335808417524447 ], [ -87.8785581115676, 15.342681382839544 ], [ -87.873907233432078, 15.345006821907305 ], [ -87.869953986387372, 15.347952379498679 ], [ -87.863003505807114, 15.356375637525616 ], [ -87.83848303876124, 15.396114814447117 ], [ -87.823858608987621, 15.408052069947075 ], [ -87.820189581883653, 15.416268622399002 ], [ -87.823781093722459, 15.429962877085075 ], [ -87.833728806938893, 15.439729723148162 ], [ -87.84597612170063, 15.445879218051459 ], [ -87.852719895806501, 15.4516669777488 ], [ -87.84633785690653, 15.460451971880957 ], [ -87.835124070919107, 15.460348619093509 ], [ -87.82437537292509, 15.45301056578495 ], [ -87.816417201992238, 15.451563625860615 ], [ -87.813549159665968, 15.469133613225665 ], [ -87.818639289171813, 15.482259426231508 ], [ -87.82747595924809, 15.494455064149861 ], [ -87.830938279877671, 15.50851105404189 ], [ -87.819931200364579, 15.52706289333787 ], [ -87.809776780673872, 15.533677476234516 ], [ -87.804505784913999, 15.547785142070609 ], [ -87.800423346660125, 15.564114895086334 ], [ -87.793912115651608, 15.577654120141517 ], [ -87.790837368649647, 15.577085680259927 ], [ -87.78486874089964, 15.574863593080352 ], [ -87.777763230688549, 15.574036769880991 ], [ -87.771252000579352, 15.577757472929022 ], [ -87.772001309412872, 15.581168118513858 ], [ -87.76463741678333, 15.606851305543273 ], [ -87.762208624928064, 15.610158596541964 ], [ -87.777349820437848, 15.63320628524184 ], [ -87.803446417717964, 15.653566798768736 ], [ -87.819750332311969, 15.671601874127191 ], [ -87.805461799322586, 15.687879950299475 ], [ -87.823548549725786, 15.691548977403386 ], [ -87.817967494704078, 15.701367499410537 ], [ -87.787581752695701, 15.721004544324273 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "HN-FM", "NAME_1": "Francisco Morazán" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -87.318669806866069, 14.666598619330784 ], [ -87.315052455706223, 14.667632148105156 ], [ -87.313812222256217, 14.670267646434695 ], [ -87.313347134262813, 14.676417141337993 ], [ -87.312261928645057, 14.679259345242599 ], [ -87.310014003943138, 14.680602932379429 ], [ -87.306293300895106, 14.681068020372834 ], [ -87.300738085194439, 14.682876695503069 ], [ -87.291978928584683, 14.689336248768825 ], [ -87.288749151951777, 14.690679835905712 ], [ -87.285105964168906, 14.691610011892521 ], [ -87.280403409189944, 14.693367011078692 ], [ -87.275519986158429, 14.695744126989837 ], [ -87.268104417584766, 14.700756741230634 ], [ -87.266089036879521, 14.703133857141779 ], [ -87.266011521614416, 14.705045885059519 ], [ -87.267019212866387, 14.706544500927976 ], [ -87.266244065611147, 14.71083364475686 ], [ -87.255417854150608, 14.738325506916624 ], [ -87.249449226400657, 14.761838284509224 ], [ -87.253609178121053, 14.795738023091303 ], [ -87.25820838121183, 14.811292628851731 ], [ -87.257252366803243, 14.82689891235492 ], [ -87.254487678163798, 14.836614081574567 ], [ -87.251361254318397, 14.841781725446253 ], [ -87.248364020782901, 14.844572252507419 ], [ -87.24544430161319, 14.845502428494285 ], [ -87.224541184827785, 14.847466132356089 ], [ -87.208340623920662, 14.859455063800112 ], [ -87.218262498715319, 14.874286200048061 ], [ -87.219425217799539, 14.881469225524313 ], [ -87.224670376037011, 14.886946925959876 ], [ -87.228391079085043, 14.889995836338755 ], [ -87.245806036819147, 14.897747300797278 ], [ -87.22655656643235, 14.923947251764218 ], [ -87.220277880319884, 14.937796536081237 ], [ -87.210149299050897, 14.952265937123286 ], [ -87.190202195774702, 14.96911245407648 ], [ -87.186894903876691, 14.974590155411306 ], [ -87.185525479217461, 14.980481268795529 ], [ -87.184233568024752, 15.001048488796698 ], [ -87.184827847227325, 15.011383774741375 ], [ -87.167025315865601, 15.02595652947025 ], [ -87.119379645754009, 15.031899318798537 ], [ -87.109690314056706, 15.03133087801757 ], [ -87.098088955340984, 15.029057114893931 ], [ -87.090053270042347, 15.025078030326824 ], [ -87.074705369856929, 15.020892239285388 ], [ -87.021039395151945, 15.023062648722259 ], [ -86.987475551555463, 15.015879625044647 ], [ -86.984995082856756, 15.00476919184473 ], [ -86.980964322345585, 14.998102932104644 ], [ -86.970654873023932, 14.985855618242169 ], [ -86.961637335794421, 14.977277330584343 ], [ -86.938124559101084, 14.965288398240943 ], [ -86.926652390695267, 14.953506171472611 ], [ -86.912234667395978, 14.946116441320669 ], [ -86.908358933817738, 14.942860826266099 ], [ -86.906136848436802, 14.940173651992438 ], [ -86.915490281551229, 14.932525540321421 ], [ -86.923551805271586, 14.905395413367614 ], [ -86.933292812912953, 14.897333888747937 ], [ -86.927272508319561, 14.876249904809242 ], [ -86.923706834902475, 14.86906688113163 ], [ -86.916988898319005, 14.858318183137612 ], [ -86.912415533649948, 14.8476728379311 ], [ -86.909909227428898, 14.820697739708919 ], [ -86.907170376311797, 14.809949041714901 ], [ -86.899470587797396, 14.799096990933378 ], [ -86.891357388132917, 14.762200018815804 ], [ -86.860170661346899, 14.687579251381351 ], [ -86.848336757735183, 14.66592682486305 ], [ -86.834952562310889, 14.651509101563761 ], [ -86.826064216290547, 14.644481105718455 ], [ -86.806633876951821, 14.639830227582934 ], [ -86.797306281359795, 14.630321763938241 ], [ -86.76247636589153, 14.598799140368044 ], [ -86.743717821020596, 14.575338040518147 ], [ -86.744415453010731, 14.557457993891262 ], [ -86.748601244052168, 14.541438300137429 ], [ -86.747516039333732, 14.532963365267051 ], [ -86.745113085000867, 14.523661607197425 ], [ -86.734700283791028, 14.507641913443535 ], [ -86.731057095108838, 14.500407212922539 ], [ -86.729300095922667, 14.485317695155516 ], [ -86.726147833655602, 14.471571764525322 ], [ -86.713564623008949, 14.437827052876173 ], [ -86.714210578155644, 14.423822739827585 ], [ -86.788934699276922, 14.368270574727205 ], [ -86.821697557196501, 14.337781479931323 ], [ -86.829138964191827, 14.30496694606768 ], [ -86.848130052160172, 14.271687323311312 ], [ -86.89686092788952, 14.229932766583886 ], [ -86.908927374598647, 14.198668525432083 ], [ -86.91993445501106, 14.18357900586642 ], [ -86.921923998193961, 14.178566392524999 ], [ -86.920657925422915, 14.174897366320408 ], [ -86.912389696127548, 14.172675279140833 ], [ -86.906860317949281, 14.169574692817832 ], [ -86.903036262113801, 14.164820460995486 ], [ -86.901873542130261, 14.160996405159949 ], [ -86.912182989653218, 14.140842597208064 ], [ -86.933215297647848, 14.137845364571888 ], [ -86.949157477935216, 14.140842597208064 ], [ -86.963006761352915, 14.140842597208064 ], [ -86.984297451765997, 14.132626043856817 ], [ -86.978277147172605, 14.114745999028628 ], [ -86.952232224937234, 14.080277817867 ], [ -86.924740362777527, 14.06043406827763 ], [ -86.917118090427493, 14.056248277236193 ], [ -86.914250048101223, 14.049995429545447 ], [ -86.912286343340043, 14.038936672289594 ], [ -86.915955370443953, 13.999300849054919 ], [ -86.926729905960372, 13.978992011472144 ], [ -86.93827958873203, 13.966899726341296 ], [ -86.954583503325978, 13.958424791470918 ], [ -86.989258389163297, 13.964522610430095 ], [ -86.985150113387022, 13.950053209388102 ], [ -86.984219937400155, 13.942818507967729 ], [ -86.984995082856756, 13.934291897153344 ], [ -86.989904344310048, 13.924473375146135 ], [ -86.992488165796203, 13.911605942760048 ], [ -86.990989549028427, 13.891865545958183 ], [ -86.995071988181678, 13.84592519818932 ], [ -87.013933884940798, 13.8004499375146 ], [ -87.030547857897318, 13.779004218369948 ], [ -87.035534633716338, 13.775386868109479 ], [ -87.051218430685992, 13.775180162534468 ], [ -87.075687221787859, 13.779727687882485 ], [ -87.083800422351601, 13.783706773348911 ], [ -87.106486375845577, 13.80349884699416 ], [ -87.1215500560902, 13.810320136365192 ], [ -87.128190477408566, 13.802465318219845 ], [ -87.129895798852033, 13.798744615171813 ], [ -87.131652798038203, 13.790941473869907 ], [ -87.132272914763178, 13.776782131190373 ], [ -87.131549445250698, 13.76267446535428 ], [ -87.128681402924371, 13.752132472935273 ], [ -87.122557746442851, 13.744587714051761 ], [ -87.111163093302082, 13.724020494050535 ], [ -87.111628181295487, 13.70831085955848 ], [ -87.119508836963234, 13.697613837508584 ], [ -87.127027758324346, 13.681594142855374 ], [ -87.129844122907912, 13.664334214752216 ], [ -87.130205858113868, 13.660045070923275 ], [ -87.134753384361204, 13.660871894122579 ], [ -87.182683275312911, 13.68112905486197 ], [ -87.214231737304829, 13.671103827279808 ], [ -87.263427701027581, 13.688415432226407 ], [ -87.29771501323728, 13.684332993972475 ], [ -87.307533535244431, 13.688777167432306 ], [ -87.31947079074439, 13.694874986391483 ], [ -87.360088466809259, 13.690120754569136 ], [ -87.373601854342098, 13.702781480480951 ], [ -87.392825487206437, 13.721126614201864 ], [ -87.394815030389339, 13.733942368845248 ], [ -87.387606167390686, 13.750892239485268 ], [ -87.386727668247261, 13.755078030526647 ], [ -87.390732591236088, 13.756111558401699 ], [ -87.396546190254469, 13.756008206513513 ], [ -87.40101620213602, 13.754974676839822 ], [ -87.412229987224123, 13.757506822381913 ], [ -87.42390886120495, 13.760607407805594 ], [ -87.443339199644356, 13.760297349443135 ], [ -87.454372117579169, 13.756886704757619 ], [ -87.457524379846234, 13.745414537251065 ], [ -87.459901495757379, 13.719472967803199 ], [ -87.465405036413301, 13.697820543083594 ], [ -87.465250006782355, 13.683506170773171 ], [ -87.46114173010676, 13.670173652192261 ], [ -87.468789841777777, 13.665832831519936 ], [ -87.479021775834269, 13.668623359480421 ], [ -87.505144213334745, 13.684643053234311 ], [ -87.540749274259611, 13.710998032932878 ], [ -87.543694830951665, 13.714512030405842 ], [ -87.548397385930627, 13.717302558366384 ], [ -87.551988897769377, 13.71874949829072 ], [ -87.570308193967946, 13.716889146317044 ], [ -87.60102983276056, 13.722676906913705 ], [ -87.641854214400439, 13.749858709811576 ], [ -87.649398973283951, 13.761227525429945 ], [ -87.647280239791201, 13.804790758186925 ], [ -87.647047695794527, 13.834194648264372 ], [ -87.619374965582153, 13.868817857258307 ], [ -87.611520148336183, 13.892175605220018 ], [ -87.608832974062466, 13.896206365731189 ], [ -87.6060424470013, 13.902924303214036 ], [ -87.598316820065179, 13.938167628932888 ], [ -87.596585660200049, 13.957287909009779 ], [ -87.615240852283478, 14.088494371218246 ], [ -87.614336513819069, 14.109113267163536 ], [ -87.593433397033607, 14.133762926317956 ], [ -87.585707770996805, 14.140325833270595 ], [ -87.579532436772524, 14.143529771481781 ], [ -87.573305426604122, 14.14332306590677 ], [ -87.541214362253015, 14.146785387435671 ], [ -87.512585619430752, 14.159601142079055 ], [ -87.500674200553874, 14.166732488913226 ], [ -87.494266324131559, 14.174432278326947 ], [ -87.493542853719703, 14.179858302818388 ], [ -87.482949185356574, 14.201097317287349 ], [ -87.46320878765539, 14.213189602418197 ], [ -87.437086351054234, 14.218874010227353 ], [ -87.429644944958227, 14.222749742006954 ], [ -87.42545915391679, 14.229054267440461 ], [ -87.425691697913521, 14.234945379925307 ], [ -87.426931932262846, 14.239337877441073 ], [ -87.429877488954958, 14.245539049187755 ], [ -87.431401944144397, 14.24734772431799 ], [ -87.433727383212158, 14.248639635510756 ], [ -87.437060512632513, 14.249673163385751 ], [ -87.440419481373965, 14.251223456097591 ], [ -87.44491533077786, 14.254220688733767 ], [ -87.450599737687753, 14.259336655762013 ], [ -87.456568366337024, 14.265744533983025 ], [ -87.459875658235035, 14.271790676098817 ], [ -87.462046067671849, 14.282177638886935 ], [ -87.463854742802141, 14.321606757445863 ], [ -87.46207190609357, 14.332252101753056 ], [ -87.459281379032404, 14.338039863249094 ], [ -87.454708015262668, 14.339900214323393 ], [ -87.450134649694292, 14.340106919898403 ], [ -87.44434688999695, 14.339176743911594 ], [ -87.432047899291092, 14.333285631426747 ], [ -87.424554816351701, 14.336024482543792 ], [ -87.419413010901735, 14.339486803173429 ], [ -87.393187222412394, 14.374006659379802 ], [ -87.382748582780835, 14.395297349792827 ], [ -87.386262580253856, 14.402635403101385 ], [ -87.410679693612963, 14.421135566453188 ], [ -87.412359178433348, 14.423822739827585 ], [ -87.413186000733333, 14.427026678938091 ], [ -87.409852871312921, 14.429817205999257 ], [ -87.407372402614271, 14.433951321096572 ], [ -87.406958990564931, 14.44356313752877 ], [ -87.408974372169496, 14.448214016563611 ], [ -87.411894091339207, 14.451934718712266 ], [ -87.435225999979878, 14.472088528462791 ], [ -87.451064825681158, 14.482372138463404 ], [ -87.456335822340293, 14.489606838085081 ], [ -87.460495774960009, 14.498960272998204 ], [ -87.463002082080379, 14.506815090244231 ], [ -87.46592180035077, 14.522214667273033 ], [ -87.415046352707009, 14.571513983783291 ], [ -87.406028814578121, 14.589549058242426 ], [ -87.405357021909026, 14.594561672483167 ], [ -87.40403927319386, 14.600091051560753 ], [ -87.403419155569566, 14.605878811258094 ], [ -87.403729213932081, 14.620709947506043 ], [ -87.40197221564523, 14.62468903207315 ], [ -87.39869076216894, 14.626756090521155 ], [ -87.395202603117639, 14.626497708102704 ], [ -87.390629239347902, 14.62489573854748 ], [ -87.386365933041361, 14.62262197542384 ], [ -87.38192175958153, 14.620813300293548 ], [ -87.377735969439414, 14.619883124306739 ], [ -87.374170295123008, 14.619728095575113 ], [ -87.371121384744072, 14.619883124306739 ], [ -87.368382535425667, 14.619573065944223 ], [ -87.366987271445396, 14.618022773232383 ], [ -87.36590206582764, 14.613940334978452 ], [ -87.36455847869081, 14.612028307060712 ], [ -87.36130286273692, 14.610529690292935 ], [ -87.357272102225693, 14.609237779100226 ], [ -87.353215502393482, 14.608410955900865 ], [ -87.342130906715965, 14.607790839175891 ], [ -87.327144741736447, 14.633525702149427 ], [ -87.32347571463248, 14.647271632779621 ], [ -87.3235015530542, 14.652697659069702 ], [ -87.324173346622615, 14.658433742822979 ], [ -87.32582699302128, 14.665978501706491 ], [ -87.325051845766041, 14.66959585196696 ], [ -87.323656581785826, 14.670629380741332 ], [ -87.322106289073986, 14.66959585196696 ], [ -87.320555996362145, 14.667942206467615 ], [ -87.318669806866069, 14.666598619330784 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/latvia.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/latvia.geojson new file mode 100644 index 000000000000..90dc6ddd50c4 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/latvia.geojson @@ -0,0 +1,125 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "LV-084", "NAME_1": "Rujienas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.263501424000111, 58.075138449000079 ], [ 25.281691528000067, 58.073407288000013 ], [ 25.299571574000112, 58.065604147 ], [ 25.30639286300007, 58.058731181000027 ], [ 25.318278443000111, 58.040618592 ], [ 25.324582967000111, 58.034753317000096 ], [ 25.333678019000104, 58.03180776 ], [ 25.33987919100008, 58.03258290600003 ], [ 25.346390421000137, 58.034443258000024 ], [ 25.356519002000084, 58.034753317000096 ], [ 25.396619914000098, 58.02317779600007 ], [ 25.419731367148021, 58.008250005422155 ], [ 25.406834255496449, 57.991310424136714 ], [ 25.403702900668293, 57.97095661685438 ], [ 25.370823673173959, 57.969390939440302 ], [ 25.345772833649335, 57.966259584612089 ], [ 25.341075801407101, 57.985047714480402 ], [ 25.326984703781022, 57.991310424136714 ], [ 25.301933864256398, 57.97095661685438 ], [ 25.278448702145852, 57.953734165299466 ], [ 25.261226250590994, 57.938077390259309 ], [ 25.270620315075462, 57.913026550734685 ], [ 25.30036818684232, 57.905198163664295 ], [ 25.336378769164867, 57.903632486250217 ], [ 25.358298253861335, 57.881713001553749 ], [ 25.381783415971825, 57.883278678967827 ], [ 25.406834255496449, 57.847268096645337 ], [ 25.417793997395052, 57.815954547464344 ], [ 25.452238902303463, 57.815954547464344 ], [ 25.455370257131619, 57.789338030525641 ], [ 25.378652061143669, 57.787772353111563 ], [ 25.31289360705432, 57.78307532086933 ], [ 25.270620315075462, 57.778378287727776 ], [ 25.267488960247306, 57.79560074018201 ], [ 25.245569475550838, 57.800297772424244 ], [ 25.250266507793071, 57.820651579706634 ], [ 25.247135152964916, 57.851965128887571 ], [ 25.217387281198057, 57.872318936169961 ], [ 25.212690248955823, 57.887975711210061 ], [ 25.195467796501589, 57.905198163664295 ], [ 25.167285602148809, 57.914592228148763 ], [ 25.134406374654475, 57.930249003188919 ], [ 25.12501231016995, 57.95060281047131 ], [ 25.137537729482631, 57.956865520127621 ], [ 25.13284069724034, 57.977219327410012 ], [ 25.10465850288756, 57.981916359652246 ], [ 25.095264438403092, 58.003835844348714 ], [ 25.10465850288756, 58.025755329045182 ], [ 25.109355535129851, 58.044543458913495 ], [ 25.094209432000127, 58.067309469000051 ], [ 25.141028280000057, 58.068007101000049 ], [ 25.166969848000093, 58.058731181000027 ], [ 25.180715780000128, 58.038163961000052 ], [ 25.189914184000116, 58.013514303000036 ], [ 25.20210982200004, 57.991965230000076 ], [ 25.216785930000128, 57.985376486000106 ], [ 25.232495565000107, 57.985376486000106 ], [ 25.264534953000094, 57.994187318000101 ], [ 25.284378703000101, 58.008139954000072 ], [ 25.277557414000057, 58.024107972000124 ], [ 25.249548788000141, 58.051186422000072 ], [ 25.250685669000035, 58.068498027 ], [ 25.263501424000111, 58.075138449000079 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-060", "NAME_1": "Mazsalacas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.034856819000083, 58.048574085000027 ], [ 25.048837524000106, 58.056199036000052 ], [ 25.070644978000132, 58.063614604000051 ], [ 25.094209432000127, 58.067309469000051 ], [ 25.109355535129851, 58.044543458913495 ], [ 25.10465850288756, 58.025755329045182 ], [ 25.095264438403092, 58.003835844348714 ], [ 25.10465850288756, 57.981916359652246 ], [ 25.13284069724034, 57.977219327410012 ], [ 25.137537729482631, 57.956865520127621 ], [ 25.12501231016995, 57.95060281047131 ], [ 25.134406374654475, 57.930249003188919 ], [ 25.167285602148809, 57.914592228148763 ], [ 25.195467796501589, 57.905198163664295 ], [ 25.212690248955823, 57.887975711210061 ], [ 25.217387281198057, 57.872318936169961 ], [ 25.247135152964916, 57.851965128887571 ], [ 25.250266507793071, 57.820651579706634 ], [ 25.245569475550838, 57.800297772424244 ], [ 25.223649990854369, 57.804994804666478 ], [ 25.157891536764964, 57.833176999918578 ], [ 25.142234762624184, 57.844136741817181 ], [ 25.112486889958006, 57.837874032160812 ], [ 25.123446632755872, 57.826914289362946 ], [ 25.13284069724034, 57.808126160393954 ], [ 25.128143664998106, 57.798732095010166 ], [ 25.112486889958006, 57.800297772424244 ], [ 25.092133083574936, 57.812823192636188 ], [ 25.06081953349468, 57.812823192636188 ], [ 25.034203016555978, 57.814388870050266 ], [ 25.017469133393774, 57.796470091421554 ], [ 25.007445510202103, 57.801381741474188 ], [ 24.965690951676038, 57.808306382733349 ], [ 24.953288609082051, 57.800089830281422 ], [ 24.946002231717614, 57.817530626437247 ], [ 24.941971470307067, 57.818615831155682 ], [ 24.938250767259092, 57.819055080727367 ], [ 24.933134800230846, 57.81755646395959 ], [ 24.926158482128244, 57.817091375966186 ], [ 24.909363641119114, 57.820657050282591 ], [ 24.901147087767868, 57.825514634892443 ], [ 24.895721063276426, 57.831199041802336 ], [ 24.893395623309345, 57.843368842198288 ], [ 24.887814569187015, 57.858535875230416 ], [ 24.885179070857419, 57.87153249792641 ], [ 24.883473747615369, 57.883753974266483 ], [ 24.885024041226529, 57.889076646869739 ], [ 24.881923455802848, 57.893004055492725 ], [ 24.873396844089086, 57.898016668834146 ], [ 24.864043410075283, 57.900316271278882 ], [ 24.842339307612917, 57.900936388003856 ], [ 24.82761152505185, 57.980130520107366 ], [ 24.827417479000076, 57.981876936000091 ], [ 24.848332967000118, 57.992146098000049 ], [ 24.872517537000078, 58.000440165 ], [ 24.949308716000047, 58.006434631000033 ], [ 24.9748368730001, 58.015839742000068 ], [ 25.034856819000083, 58.048574085000027 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-005", "NAME_1": "Alojas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.816810344000146, 57.976669007000041 ], [ 24.827417479000076, 57.981876936000091 ], [ 24.82761152505185, 57.980130520107366 ], [ 24.842339307612917, 57.900936388003856 ], [ 24.864043410075283, 57.900316271278882 ], [ 24.873396844089086, 57.898016668834146 ], [ 24.881923455802848, 57.893004055492725 ], [ 24.885024041226529, 57.889076646869739 ], [ 24.883473747615369, 57.883753974266483 ], [ 24.885179070857419, 57.87153249792641 ], [ 24.887814569187015, 57.858535875230416 ], [ 24.893395623309345, 57.843368842198288 ], [ 24.895721063276426, 57.831199041802336 ], [ 24.901147087767868, 57.825514634892443 ], [ 24.909363641119114, 57.820657050282591 ], [ 24.926158482128244, 57.817091375966186 ], [ 24.933134800230846, 57.81755646395959 ], [ 24.938250767259092, 57.819055080727367 ], [ 24.941971470307067, 57.818615831155682 ], [ 24.946002231717614, 57.817530626437247 ], [ 24.953288609082051, 57.800089830281422 ], [ 24.965690951676038, 57.808306382733349 ], [ 25.007445510202103, 57.801381741474188 ], [ 25.017469133393774, 57.796470091421554 ], [ 25.077260369870146, 57.767171942730954 ], [ 25.083616571247774, 57.75414948251256 ], [ 25.098706089014797, 57.736011054366656 ], [ 25.090902947712834, 57.73125682254431 ], [ 25.087182244664859, 57.727174384290379 ], [ 25.080205925662938, 57.721231594062772 ], [ 25.07617516425239, 57.714513658378621 ], [ 25.075710077158305, 57.705935370720738 ], [ 25.082221307267503, 57.696891995069507 ], [ 25.092453241323994, 57.688236192146519 ], [ 25.085321892691184, 57.674619452725551 ], [ 25.093745150718121, 57.653122056737516 ], [ 25.067028435813654, 57.654982407811815 ], [ 25.062222528047187, 57.65239858722498 ], [ 25.063307732765622, 57.648109443396095 ], [ 25.075865105889932, 57.638704332538907 ], [ 25.083306511985938, 57.63410513034745 ], [ 25.084701775966153, 57.629764308775805 ], [ 25.067803582169574, 57.626457017777113 ], [ 25.061602411322212, 57.623950711556063 ], [ 25.042378777558497, 57.625836900152819 ], [ 25.03302534444407, 57.630177720825145 ], [ 25.027599318153989, 57.634260159079076 ], [ 25.024033643837583, 57.637360745402077 ], [ 25.019072707339546, 57.638135890858621 ], [ 25.005740186960054, 57.636120510153376 ], [ 25.000159132837666, 57.635862127734981 ], [ 24.991477492392335, 57.636482246258652 ], [ 24.966311069300389, 57.628420722538294 ], [ 24.93453006421106, 57.612039293578505 ], [ 24.881437081755905, 57.624673657663152 ], [ 24.892562524640766, 57.652487264875333 ], [ 24.831372589673265, 57.666394068031764 ], [ 24.824419188095021, 57.699770395787084 ], [ 24.828591229401695, 57.719239921285293 ], [ 24.799386942053729, 57.733146724441724 ], [ 24.747931768935985, 57.731756044305996 ], [ 24.707602039602421, 57.749834888769101 ], [ 24.692304555410885, 57.760960331653962 ], [ 24.649193464906489, 57.770695093503718 ], [ 24.597738292688064, 57.870824078568319 ], [ 24.5740967267825, 57.881949520553917 ], [ 24.59078489110982, 57.894465643574563 ], [ 24.588003529938931, 57.920888570650959 ], [ 24.582445250259351, 57.946010847151072 ], [ 24.624057251000096, 57.943957825000055 ], [ 24.684828735000082, 57.94757517500004 ], [ 24.700435018000121, 57.954189758000027 ], [ 24.718831828000134, 57.981836650000034 ], [ 24.733507935000119, 57.992197774000047 ], [ 24.764720500000095, 57.987908631 ], [ 24.790765421000089, 57.978994446000073 ], [ 24.816810344000146, 57.976669007000041 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-064", "NAME_1": "Nauksenu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.551815984000143, 57.949859510000024 ], [ 25.552114298000049, 57.948815410000051 ], [ 25.552941122000078, 57.942174988000048 ], [ 25.55831547000011, 57.934242656000023 ], [ 25.579399455000072, 57.919463196 ], [ 25.601516968000055, 57.912202658000112 ], [ 25.625081421000061, 57.910290630000091 ], [ 25.650092814000061, 57.911427511000014 ], [ 25.703799772000053, 57.921326524000065 ], [ 25.666077060707778, 57.914373651522794 ], [ 25.660474006470224, 57.892672743452295 ], [ 25.657342650742692, 57.878581646725593 ], [ 25.65336801961837, 57.863651497818353 ], [ 25.613503682249132, 57.866056226513592 ], [ 25.582810907197597, 57.883133857541452 ], [ 25.574129265852946, 57.880834255996092 ], [ 25.565912713400962, 57.879929918430946 ], [ 25.5566109562306, 57.880033271218451 ], [ 25.546534050905734, 57.876881008951386 ], [ 25.535010206555796, 57.87440054025268 ], [ 25.522297803800598, 57.86887116207447 ], [ 25.501213819861903, 57.868225206028399 ], [ 25.469461354757698, 57.873884613584039 ], [ 25.466329999030222, 57.85979351685728 ], [ 25.511135694656559, 57.840991726287086 ], [ 25.526018507747892, 57.829958808352274 ], [ 25.542348259864298, 57.820657050282591 ], [ 25.555370720981955, 57.816057848091191 ], [ 25.560176628748422, 57.807582913220813 ], [ 25.555060662619439, 57.799573066343896 ], [ 25.552890252283305, 57.792390041766964 ], [ 25.494512194282322, 57.789338030525641 ], [ 25.455370257131619, 57.789338030525641 ], [ 25.452238902303463, 57.815954547464344 ], [ 25.417793997395052, 57.815954547464344 ], [ 25.406834255496449, 57.847268096645337 ], [ 25.381783415971825, 57.883278678967827 ], [ 25.358298253861335, 57.881713001553749 ], [ 25.336378769164867, 57.903632486250217 ], [ 25.30036818684232, 57.905198163664295 ], [ 25.270620315075462, 57.913026550734685 ], [ 25.261226250590994, 57.938077390259309 ], [ 25.278448702145852, 57.953734165299466 ], [ 25.301933864256398, 57.97095661685438 ], [ 25.326984703781022, 57.991310424136714 ], [ 25.341075801407101, 57.985047714480402 ], [ 25.345772833649335, 57.966259584612089 ], [ 25.370823673173959, 57.969390939440302 ], [ 25.403702900668293, 57.97095661685438 ], [ 25.406834255496449, 57.991310424136714 ], [ 25.419731367148021, 58.008250005422155 ], [ 25.457184692000055, 57.984058736000051 ], [ 25.496613810000071, 57.970597026000078 ], [ 25.531960489000056, 57.966437073000051 ], [ 25.541675659000106, 57.962819723000067 ], [ 25.550253947000044, 57.955326640000024 ], [ 25.551815984000143, 57.949859510000024 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-085", "NAME_1": "Salacgrivas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.553880656000103, 57.947420146000084 ], [ 24.582445250259351, 57.946010847151072 ], [ 24.588003529938931, 57.920888570650959 ], [ 24.59078489110982, 57.894465643574563 ], [ 24.5740967267825, 57.881949520553917 ], [ 24.597738292688064, 57.870824078568319 ], [ 24.649193464906489, 57.770695093503718 ], [ 24.599128972823792, 57.752616249040614 ], [ 24.608863735572925, 57.715067879978676 ], [ 24.562971283897639, 57.717849240250189 ], [ 24.558799242590965, 57.688644953801543 ], [ 24.564361964033424, 57.673347469610007 ], [ 24.54072039812786, 57.666394068031764 ], [ 24.515688152086511, 57.678910191052466 ], [ 24.4183405281928, 57.670566109338438 ], [ 24.426684610806149, 57.620501616356478 ], [ 24.423903249635259, 57.589906648872727 ], [ 24.43502869252012, 57.588515968736942 ], [ 24.433638012384336, 57.567655764002268 ], [ 24.460060938561469, 57.564874402831379 ], [ 24.478139783024574, 57.567655764002268 ], [ 24.497609307623406, 57.555139640981622 ], [ 24.49065590604522, 57.544014198096761 ], [ 24.553236521148506, 57.541232836925872 ], [ 24.529594956142319, 57.521763312326982 ], [ 24.549064480741151, 57.489777664707447 ], [ 24.565752644169152, 57.474480181415231 ], [ 24.578268768089174, 57.464745418666098 ], [ 24.558799242590965, 57.452229295645452 ], [ 24.511516111679214, 57.448057254338778 ], [ 24.501781348930081, 57.427197049604104 ], [ 24.486483864738545, 57.416071606719242 ], [ 24.447544815540766, 57.407727525005271 ], [ 24.394893257192049, 57.400012509164952 ], [ 24.381602410000085, 57.469427802000041 ], [ 24.379893425000091, 57.506537177000041 ], [ 24.375173373000052, 57.528550523000035 ], [ 24.364512566000087, 57.538397528000075 ], [ 24.358571811000047, 57.550360419000071 ], [ 24.36296634200005, 57.576605536000045 ], [ 24.37476647200009, 57.613470770000049 ], [ 24.36304772200009, 57.672267971000053 ], [ 24.357676629000082, 57.685492255000042 ], [ 24.313731316000087, 57.725043036000045 ], [ 24.299571160000085, 57.743841864000046 ], [ 24.299571160000085, 57.761908270000049 ], [ 24.28882897200009, 57.80890534100007 ], [ 24.285980665000068, 57.832586981000077 ], [ 24.28882897200009, 57.845282294000071 ], [ 24.296153191000087, 57.857367255000042 ], [ 24.306158734238295, 57.868186255842957 ], [ 24.349655395000127, 57.858640036000068 ], [ 24.378180786000087, 57.859441020000091 ], [ 24.401538533000121, 57.866469014000089 ], [ 24.412700643000051, 57.876571757000036 ], [ 24.429133748000112, 57.900342916000099 ], [ 24.441639445000106, 57.908094381000083 ], [ 24.481326945000092, 57.91930816700004 ], [ 24.533830200000068, 57.945068868000035 ], [ 24.553880656000103, 57.947420146000084 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-009", "NAME_1": "Apes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.430678413000066, 57.561764252 ], [ 26.430923706000016, 57.561707255000087 ], [ 26.447563517000049, 57.552922262 ], [ 26.481049846000133, 57.527135722000097 ], [ 26.499550008000057, 57.515818583000012 ], [ 26.515052938000082, 57.517265524000024 ], [ 26.528695516000084, 57.523880107000096 ], [ 26.542234741000073, 57.528169251000079 ], [ 26.551743205000065, 57.526825664000015 ], [ 26.570243367000074, 57.519590963000056 ], [ 26.579855183000092, 57.517833965000065 ], [ 26.590087118000071, 57.520366109000051 ], [ 26.594841349000063, 57.526489767000029 ], [ 26.598355347000108, 57.53385365900003 ], [ 26.604763224000067, 57.540313213000061 ], [ 26.634322144000095, 57.554420879000091 ], [ 26.666981649000064, 57.564859518000034 ], [ 26.700467976000141, 57.570750631000053 ], [ 26.778085978000064, 57.568476868000019 ], [ 26.795759318000137, 57.571319071000104 ], [ 26.806003385248005, 57.55384266750508 ], [ 26.808281793370043, 57.51966654837247 ], [ 26.808281793370043, 57.503717693316844 ], [ 26.758156820081183, 57.503717693316844 ], [ 26.721702292826535, 57.490047245483936 ], [ 26.714867069359741, 57.464984758839535 ], [ 26.703475029648871, 57.423973416240131 ], [ 26.687526174593245, 57.417138192773336 ], [ 26.644236424771179, 57.417138192773336 ], [ 26.614617121882645, 57.419416600895374 ], [ 26.594222040214959, 57.391303412422531 ], [ 26.567712029986183, 57.397427069803427 ], [ 26.544405958867912, 57.395618395572455 ], [ 26.531073439387683, 57.398874009727763 ], [ 26.525802442728548, 57.401871243263258 ], [ 26.52022138770684, 57.406470445454659 ], [ 26.475831332649875, 57.405075182373764 ], [ 26.480637241315605, 57.387401842221209 ], [ 26.479241978234711, 57.382389227980468 ], [ 26.474746127931439, 57.375051175571286 ], [ 26.446840854621712, 57.369160061287744 ], [ 26.43314659993564, 57.361408595929902 ], [ 26.421054314804792, 57.357946275300321 ], [ 26.397024774173985, 57.35427724909573 ], [ 26.393924187850985, 57.350711574779325 ], [ 26.394699334206905, 57.347145901362239 ], [ 26.399040154879231, 57.344019477516838 ], [ 26.404466180269992, 57.342236639909004 ], [ 26.411132440010078, 57.342856757533298 ], [ 26.424154901127793, 57.346990871731293 ], [ 26.430046013612639, 57.34600901980042 ], [ 26.430046013612639, 57.339704495266233 ], [ 26.423534784402761, 57.332159736382721 ], [ 26.359456007588676, 57.322547919051203 ], [ 26.276153598809515, 57.331022853921525 ], [ 26.277548861890466, 57.364715887827913 ], [ 26.286230503235117, 57.365826930968069 ], [ 26.302043491413997, 57.374844469096956 ], [ 26.301423373789646, 57.379831244915977 ], [ 26.299097934721885, 57.389468898870575 ], [ 26.302818637769917, 57.396135159509981 ], [ 26.309794955872519, 57.402207140047437 ], [ 26.312740512564574, 57.409726061408605 ], [ 26.315065951632334, 57.418097643491421 ], [ 26.320491977922416, 57.423782050401257 ], [ 26.318941685210575, 57.429001370217009 ], [ 26.315065951632334, 57.433135484415061 ], [ 26.308554722422457, 57.436158556372277 ], [ 26.300803257064615, 57.438974920955786 ], [ 26.293516879700235, 57.442695624003818 ], [ 26.296152378029831, 57.450007839789919 ], [ 26.304523960112647, 57.455356349915576 ], [ 26.312740512564574, 57.458663641813587 ], [ 26.325969679257298, 57.467603665576689 ], [ 26.311035191121164, 57.469774075013504 ], [ 26.311500278215249, 57.499332993822577 ], [ 26.361781446656437, 57.512820542933696 ], [ 26.362866652274192, 57.515636909315901 ], [ 26.362556593911677, 57.519848537879682 ], [ 26.354495070191319, 57.522819932993457 ], [ 26.349844191156478, 57.52966705988689 ], [ 26.344263137034147, 57.533232734203295 ], [ 26.341162550711147, 57.537780260450631 ], [ 26.344108107403201, 57.542379461742712 ], [ 26.345658400115042, 57.551913763809125 ], [ 26.352169631123559, 57.560879625094572 ], [ 26.356975538889969, 57.57069814710178 ], [ 26.352634719116963, 57.576227525280046 ], [ 26.351325149735828, 57.580203000867755 ], [ 26.430678413000066, 57.561764252 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-101", "NAME_1": "Valkas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.714998413000103, 57.923390605000051 ], [ 25.730294637000071, 57.923132223 ], [ 25.745384155000067, 57.909179586000093 ], [ 25.754685913000088, 57.888896586000087 ], [ 25.767501668000079, 57.868923646000056 ], [ 25.792616415000083, 57.855978699000033 ], [ 26.002732788000088, 57.845979310000118 ], [ 26.014515015000086, 57.842827047000057 ], [ 26.021956421000112, 57.837943624000033 ], [ 26.025263713000101, 57.828409322000041 ], [ 26.021749715000055, 57.822414856000123 ], [ 26.016065308000094, 57.816472067000106 ], [ 26.013068074000074, 57.807299500000013 ], [ 26.016065308000094, 57.786680603000022 ], [ 26.024746948000143, 57.774355774000057 ], [ 26.135231161000092, 57.724772238000085 ], [ 26.168510783000016, 57.704049988000051 ], [ 26.26318200700004, 57.62082509400004 ], [ 26.297185099000075, 57.599146830000066 ], [ 26.33862959800004, 57.583152975000118 ], [ 26.351325149735828, 57.580203000867755 ], [ 26.352634719116963, 57.576227525280046 ], [ 26.356975538889969, 57.57069814710178 ], [ 26.352169631123559, 57.560879625094572 ], [ 26.345658400115042, 57.551913763809125 ], [ 26.344108107403201, 57.542379461742712 ], [ 26.341162550711147, 57.537780260450631 ], [ 26.344263137034147, 57.533232734203295 ], [ 26.349844191156478, 57.52966705988689 ], [ 26.354495070191319, 57.522819932993457 ], [ 26.362556593911677, 57.519848537879682 ], [ 26.362866652274192, 57.515636909315901 ], [ 26.361781446656437, 57.512820542933696 ], [ 26.311500278215249, 57.499332993822577 ], [ 26.301609569426091, 57.527702810136532 ], [ 26.282074370036128, 57.525260909763119 ], [ 26.24544587073035, 57.522819010289084 ], [ 26.240562070882845, 57.54235420967899 ], [ 26.184398373086424, 57.547238009526495 ], [ 26.155095574001507, 57.547238009526495 ], [ 26.123350875442554, 57.569215108390495 ], [ 26.094048076357637, 57.559447508695541 ], [ 26.050093877730262, 57.559447508695541 ], [ 25.97683688001797, 57.549679909000588 ], [ 25.945092181458961, 57.530144709610624 ], [ 25.896254182984137, 57.530144709610624 ], [ 25.888928482763276, 57.549679909000588 ], [ 25.903579882305678, 57.569215108390495 ], [ 25.901137982831642, 57.588750307780458 ], [ 25.876718983594174, 57.603401707322917 ], [ 25.932882681390595, 57.608285507170365 ], [ 25.959743581001419, 57.620495006339468 ], [ 25.979278780391382, 57.649797805424328 ], [ 25.989046380086336, 57.671774905187704 ], [ 25.859625684577679, 57.68398440435675 ], [ 25.857183784204267, 57.703519603746713 ], [ 25.82788098511935, 57.705961504120069 ], [ 25.847416184509314, 57.752357602221537 ], [ 25.735088788017151, 57.730380503357537 ], [ 25.688656200823004, 57.737670674062315 ], [ 25.660474006470224, 57.750196093374996 ], [ 25.616635037077288, 57.758024480445386 ], [ 25.596281229794897, 57.773681255485542 ], [ 25.564827507783264, 57.782649034125598 ], [ 25.552890252283305, 57.792390041766964 ], [ 25.555060662619439, 57.799573066343896 ], [ 25.560176628748422, 57.807582913220813 ], [ 25.555370720981955, 57.816057848091191 ], [ 25.542348259864298, 57.820657050282591 ], [ 25.526018507747892, 57.829958808352274 ], [ 25.511135694656559, 57.840991726287086 ], [ 25.466329999030222, 57.85979351685728 ], [ 25.469461354757698, 57.873884613584039 ], [ 25.501213819861903, 57.868225206028399 ], [ 25.522297803800598, 57.86887116207447 ], [ 25.535010206555796, 57.87440054025268 ], [ 25.546534050905734, 57.876881008951386 ], [ 25.5566109562306, 57.880033271218451 ], [ 25.565912713400962, 57.879929918430946 ], [ 25.574129265852946, 57.880834255996092 ], [ 25.582810907197597, 57.883133857541452 ], [ 25.613503682249132, 57.866056226513592 ], [ 25.65336801961837, 57.863651497818353 ], [ 25.657342650742692, 57.878581646725593 ], [ 25.660474006470224, 57.892672743452295 ], [ 25.666077060707778, 57.914373651522794 ], [ 25.703799772000053, 57.921326524000065 ], [ 25.714998413000103, 57.923390605000051 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-007", "NAME_1": "Aluksne" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.87265384900013, 57.627181295000085 ], [ 26.884952840000096, 57.622091166000089 ], [ 26.896114950000111, 57.614985657000048 ], [ 26.911617880000023, 57.61343536400004 ], [ 26.929187866000092, 57.615554098000118 ], [ 26.946551148000111, 57.615347392000061 ], [ 26.981071004000086, 57.608991191000129 ], [ 27.004635458000109, 57.598914286000095 ], [ 27.041325724000075, 57.56845103000002 ], [ 27.061531209000066, 57.555661113000056 ], [ 27.085354045000116, 57.549434103000053 ], [ 27.165659220000066, 57.546695252000106 ], [ 27.319965047000068, 57.516128642000083 ], [ 27.352934611000137, 57.527600810000123 ], [ 27.528169393000042, 57.528479309000048 ], [ 27.522795044000077, 57.492021587000053 ], [ 27.525637248000066, 57.468379619000032 ], [ 27.514836873000036, 57.447889913000054 ], [ 27.511322876000065, 57.430397441000096 ], [ 27.536282593000067, 57.415695496000112 ], [ 27.640824015000049, 57.389004618000072 ], [ 27.694408720000069, 57.356375287 ], [ 27.688522169962141, 57.332573147532685 ], [ 27.681855910222055, 57.326759549413623 ], [ 27.672347445678042, 57.320222479983443 ], [ 27.662270542151759, 57.318413804853208 ], [ 27.652348667357103, 57.313685411452525 ], [ 27.600207146942239, 57.297794908008598 ], [ 27.587339714556151, 57.282550361509948 ], [ 27.571216668014813, 57.276969306488297 ], [ 27.555558708567503, 57.258908392708122 ], [ 27.526826612957791, 57.259864407116652 ], [ 27.51892011886838, 57.259347643179183 ], [ 27.501711866709286, 57.264773668569944 ], [ 27.487087436935667, 57.273868720165297 ], [ 27.46073245633778, 57.274178779427075 ], [ 27.406265496855156, 57.263068346227158 ], [ 27.354899122796269, 57.284772446890884 ], [ 27.326011996656291, 57.277434394481702 ], [ 27.275885857846049, 57.246686917267368 ], [ 27.248135614167268, 57.248960680391065 ], [ 27.24100426643372, 57.246428534848974 ], [ 27.234182977062744, 57.242811183689128 ], [ 27.228911981302872, 57.238987127853648 ], [ 27.220488722376615, 57.23438792656151 ], [ 27.20111005988133, 57.234801336812211 ], [ 27.184366895715641, 57.228109239549724 ], [ 27.156564976092739, 57.226378078785274 ], [ 27.056157667941989, 57.24870229797267 ], [ 27.045925733885497, 57.250304267527895 ], [ 27.046545850610471, 57.253353176108135 ], [ 27.048561232215093, 57.256427924009472 ], [ 27.060085076565031, 57.263223374958784 ], [ 27.066906365936006, 57.268701077192929 ], [ 27.059930046934085, 57.27275767702514 ], [ 27.020810987636935, 57.286736152551384 ], [ 26.988513217710818, 57.304409491804563 ], [ 26.905520868193491, 57.303737698236148 ], [ 26.865006544916071, 57.299526068773048 ], [ 26.849348586368137, 57.315261541686766 ], [ 26.845472852789896, 57.315933336154501 ], [ 26.840046828298455, 57.3162950713604 ], [ 26.836171094720214, 57.315313219429527 ], [ 26.790230746951408, 57.318413804853208 ], [ 26.7607235040864, 57.321669419907778 ], [ 26.747701042968743, 57.318956407212397 ], [ 26.714783156317594, 57.306476549353249 ], [ 26.682227003973026, 57.320015774408432 ], [ 26.681451856717786, 57.323684801512343 ], [ 26.677576124938184, 57.334330145819536 ], [ 26.6331860689819, 57.350298162729985 ], [ 26.61814822805826, 57.362493801547657 ], [ 26.594222040214959, 57.391303412422531 ], [ 26.614617121882645, 57.419416600895374 ], [ 26.644236424771179, 57.417138192773336 ], [ 26.687526174593245, 57.417138192773336 ], [ 26.703475029648871, 57.423973416240131 ], [ 26.714867069359741, 57.464984758839535 ], [ 26.721702292826535, 57.490047245483936 ], [ 26.758156820081183, 57.503717693316844 ], [ 26.808281793370043, 57.503717693316844 ], [ 26.808281793370043, 57.51966654837247 ], [ 26.806003385248005, 57.55384266750508 ], [ 26.795759318000137, 57.571319071000104 ], [ 26.816326538000055, 57.581189270000081 ], [ 26.828315471000082, 57.595038555000045 ], [ 26.838547404000082, 57.609869690000082 ], [ 26.854153687000121, 57.622556254000116 ], [ 26.87265384900013, 57.627181295000085 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-108", "NAME_1": "Vilakas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 27.694408720000069, 57.356375287 ], [ 27.707951701000098, 57.348128561000053 ], [ 27.809134155000095, 57.313944601000074 ], [ 27.827737671000136, 57.304952902000124 ], [ 27.840295044000072, 57.290638529000049 ], [ 27.846134481000036, 57.267306621 ], [ 27.841173543000082, 57.211211853000052 ], [ 27.833938842000123, 57.180490215000091 ], [ 27.824327027000038, 57.159070333000088 ], [ 27.794044637000098, 57.143386536000023 ], [ 27.700975383000099, 57.118788555000052 ], [ 27.682216838000102, 57.103699036000037 ], [ 27.696066121000058, 57.085457256000083 ], [ 27.722059367000043, 57.077990011000068 ], [ 27.745468791000093, 57.06799062100005 ], [ 27.750739786000111, 57.042359111000067 ], [ 27.745778848914711, 57.031455382559841 ], [ 27.690025652961481, 57.022973625432428 ], [ 27.637622271550583, 57.018416809188352 ], [ 27.630787048083789, 57.038922480488054 ], [ 27.589775705484385, 57.04347929673213 ], [ 27.553321179129114, 57.038922480488054 ], [ 27.541929139418244, 57.07765541496542 ], [ 27.514588244651748, 57.079933823087458 ], [ 27.455349638874736, 57.114109941320692 ], [ 27.402946257463782, 57.159678099264852 ], [ 27.425730335986202, 57.212081481575069 ], [ 27.446236007285904, 57.243979191686321 ], [ 27.487087436935667, 57.273868720165297 ], [ 27.501711866709286, 57.264773668569944 ], [ 27.51892011886838, 57.259347643179183 ], [ 27.526826612957791, 57.259864407116652 ], [ 27.555558708567503, 57.258908392708122 ], [ 27.571216668014813, 57.276969306488297 ], [ 27.587339714556151, 57.282550361509948 ], [ 27.600207146942239, 57.297794908008598 ], [ 27.652348667357103, 57.313685411452525 ], [ 27.662270542151759, 57.318413804853208 ], [ 27.672347445678042, 57.320222479983443 ], [ 27.681855910222055, 57.326759549413623 ], [ 27.688522169962141, 57.332573147532685 ], [ 27.694408720000069, 57.356375287 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-014", "NAME_1": "Baltinavas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 27.745778848914711, 57.031455382559841 ], [ 27.729552450000057, 57.009854635000053 ], [ 27.723351278000081, 56.998795878000053 ], [ 27.72076745600009, 56.988667298000095 ], [ 27.718545369000083, 56.968720195000074 ], [ 27.715134724000052, 56.957403056 ], [ 27.648730510000092, 56.879268291000059 ], [ 27.628369995000071, 56.844154155000027 ], [ 27.644379265690532, 56.841771673423978 ], [ 27.637155795903254, 56.836608588215768 ], [ 27.614986607246124, 56.845006008720304 ], [ 27.60082726366727, 56.852447414816311 ], [ 27.581293573339735, 56.857615057788678 ], [ 27.571836785639107, 56.863816230434679 ], [ 27.567650994597727, 56.867330227008324 ], [ 27.561604851582615, 56.87074087169384 ], [ 27.549615920138592, 56.866942654280024 ], [ 27.529927199280792, 56.862886054447813 ], [ 27.51814497161314, 56.857976792994577 ], [ 27.446701919957604, 56.852663522803311 ], [ 27.434843967575034, 56.883990742578703 ], [ 27.41661670439737, 56.902218005756311 ], [ 27.443957599163866, 56.915888453589218 ], [ 27.494082573352046, 56.91361004546718 ], [ 27.537372323174168, 56.934115716766883 ], [ 27.519145059996504, 56.954621388066585 ], [ 27.612559784006805, 56.984240690955119 ], [ 27.664963166317079, 56.988797506299875 ], [ 27.637622271550583, 57.018416809188352 ], [ 27.690025652961481, 57.022973625432428 ], [ 27.745778848914711, 57.031455382559841 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-044", "NAME_1": "Karsavas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 27.644379265690532, 56.841771673423978 ], [ 27.661184530000099, 56.839270732 ], [ 27.744073527000097, 56.864798890000046 ], [ 27.7863965250001, 56.871258443000087 ], [ 27.830838257000096, 56.864282125000088 ], [ 27.852232300000111, 56.854308573000068 ], [ 27.891506388000067, 56.829710592000097 ], [ 27.913520548000065, 56.820150452000107 ], [ 27.918894897000115, 56.805887757000036 ], [ 27.900084676000091, 56.783046774000113 ], [ 27.876106811000085, 56.759430644000091 ], [ 27.86546146677324, 56.742687480242978 ], [ 27.843812261626567, 56.743357570495448 ], [ 27.820513392279224, 56.727824990930571 ], [ 27.820513392279224, 56.688993542917672 ], [ 27.802392049453488, 56.665694674469648 ], [ 27.760971838179785, 56.691582306178475 ], [ 27.644477494141029, 56.686404779656812 ], [ 27.592702229824056, 56.655339621426378 ], [ 27.58020836772198, 56.619438382275519 ], [ 27.551631300843837, 56.636749986322798 ], [ 27.541554396418235, 56.645069892461549 ], [ 27.524811232252546, 56.6517878281457 ], [ 27.512408887859863, 56.654836738524637 ], [ 27.501815220396111, 56.655766912712807 ], [ 27.488017612023157, 56.653312283335197 ], [ 27.476390414885714, 56.658454087885843 ], [ 27.472049595112708, 56.663259996551574 ], [ 27.470344272769978, 56.674215400120602 ], [ 27.480266147564635, 56.680829983017247 ], [ 27.486312289680427, 56.693387356141557 ], [ 27.471030359263636, 56.740768807234645 ], [ 27.45549777969876, 56.771833965465134 ], [ 27.403722515381787, 56.784777781769208 ], [ 27.339861280973309, 56.782684231092389 ], [ 27.347922803794347, 56.784312039069334 ], [ 27.344822219269986, 56.801597804694893 ], [ 27.348387891787752, 56.807204698138264 ], [ 27.348077834324556, 56.815137031548716 ], [ 27.355209181158784, 56.821648260758593 ], [ 27.362495557623845, 56.824593818350024 ], [ 27.368696730269846, 56.824464627140799 ], [ 27.371332227700123, 56.822009995964493 ], [ 27.376603224359314, 56.820614731984278 ], [ 27.38342451283097, 56.821364040817798 ], [ 27.394948358080228, 56.828030301457204 ], [ 27.390917595770418, 56.831906033236805 ], [ 27.395723504436148, 56.835962633069016 ], [ 27.412156610239379, 56.84531606708282 ], [ 27.427814568787312, 56.85125885731037 ], [ 27.446701919957604, 56.852663522803311 ], [ 27.51814497161314, 56.857976792994577 ], [ 27.529927199280792, 56.862886054447813 ], [ 27.549615920138592, 56.866942654280024 ], [ 27.561604851582615, 56.87074087169384 ], [ 27.567650994597727, 56.867330227008324 ], [ 27.571836785639107, 56.863816230434679 ], [ 27.581293573339735, 56.857615057788678 ], [ 27.60082726366727, 56.852447414816311 ], [ 27.614986607246124, 56.845006008720304 ], [ 27.637155795903254, 56.836608588215768 ], [ 27.644379265690532, 56.841771673423978 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-023", "NAME_1": "Ciblas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 27.86546146677324, 56.742687480242978 ], [ 27.882618042000047, 56.725479228000083 ], [ 27.981009969000098, 56.687006124000035 ], [ 27.991345255000084, 56.66997874 ], [ 27.992172079000113, 56.624994406000084 ], [ 27.997443074000046, 56.603832906000022 ], [ 28.010982299000119, 56.58755483 ], [ 28.028655640000125, 56.576754456000074 ], [ 28.108650757000078, 56.555179546000019 ], [ 28.126117391000037, 56.547763977000088 ], [ 28.132215210000084, 56.535981751000079 ], [ 28.125238892000084, 56.527145081000086 ], [ 28.099245647000117, 56.513399150000041 ], [ 28.093251180000095, 56.501591086000033 ], [ 28.053502081255999, 56.518135171301083 ], [ 27.988783000634953, 56.523312697822746 ], [ 27.94477402610039, 56.502602591736206 ], [ 27.918886394391563, 56.481892486548986 ], [ 27.88523247290027, 56.497425065214543 ], [ 27.864522366813731, 56.528490224344353 ], [ 27.812747102496758, 56.551789092792376 ], [ 27.776504417744661, 56.541434039749106 ], [ 27.755794311658121, 56.520723934561886 ], [ 27.724729153427688, 56.533667749966639 ], [ 27.691075231936395, 56.567321672357252 ], [ 27.657421310445102, 56.567321672357252 ], [ 27.603057282867269, 56.575087962139719 ], [ 27.56113976358921, 56.575926826361922 ], [ 27.561449822851046, 56.599646307730893 ], [ 27.58020836772198, 56.619438382275519 ], [ 27.592702229824056, 56.655339621426378 ], [ 27.644477494141029, 56.686404779656812 ], [ 27.760971838179785, 56.691582306178475 ], [ 27.802392049453488, 56.665694674469648 ], [ 27.820513392279224, 56.688993542917672 ], [ 27.820513392279224, 56.727824990930571 ], [ 27.843812261626567, 56.743357570495448 ], [ 27.86546146677324, 56.742687480242978 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-058", "NAME_1": "Ludzas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 28.093251180000095, 56.501591086000033 ], [ 28.096455119000069, 56.491953431000027 ], [ 28.104516642000135, 56.483065084000017 ], [ 28.156503133000086, 56.446219788000107 ], [ 28.16425459800007, 56.437951559000041 ], [ 28.167871947832111, 56.427125345957904 ], [ 28.118221160977782, 56.422350932449547 ], [ 28.069034660820932, 56.422350932449547 ], [ 28.022436923025566, 56.437883512014423 ], [ 27.978427948491003, 56.432705985492817 ], [ 27.991371763895756, 56.40422958962381 ], [ 28.012081869982296, 56.383519484436647 ], [ 27.991371763895756, 56.37575319465418 ], [ 27.95512907914366, 56.378341957914984 ], [ 27.913708867869957, 56.355043088567641 ], [ 27.877466183117861, 56.331744220119617 ], [ 27.841223498365764, 56.321389167076347 ], [ 27.864522366813731, 56.285146482324251 ], [ 27.91629763113076, 56.285146482324251 ], [ 27.931830210695637, 56.308445350772274 ], [ 28.00431558019983, 56.331744220119617 ], [ 28.043147028212786, 56.313622877293938 ], [ 28.094922292529759, 56.298090298628324 ], [ 28.120809924238586, 56.274791429280981 ], [ 28.089744766008153, 56.238548744528885 ], [ 28.070411003964637, 56.208507392502156 ], [ 28.0650883322607, 56.203288071787028 ], [ 28.06126427642522, 56.20354645420548 ], [ 28.056096632553533, 56.206957098890996 ], [ 28.052685987868017, 56.211065375566591 ], [ 28.048035108833176, 56.214398504987003 ], [ 28.039818556381249, 56.215690416179712 ], [ 28.031446974298433, 56.214476020252107 ], [ 28.020904981879369, 56.209644273164656 ], [ 28.00131961380913, 56.203288071787028 ], [ 27.913056267632612, 56.18370270371679 ], [ 27.898483513803114, 56.183237617522025 ], [ 27.88757978707747, 56.186648261308164 ], [ 27.852853224396767, 56.181945706329259 ], [ 27.838435500198159, 56.182307441535158 ], [ 27.822415806444269, 56.185666409377291 ], [ 27.810943638038452, 56.196260077740362 ], [ 27.778490837582069, 56.195639960116011 ], [ 27.743919305431575, 56.199774075213384 ], [ 27.722473586286981, 56.20664704052848 ], [ 27.701854689442371, 56.219488634492848 ], [ 27.687126905981927, 56.225095527036899 ], [ 27.667593214755016, 56.240236720748044 ], [ 27.683561231665465, 56.24726471569403 ], [ 27.692552931372688, 56.249822700557161 ], [ 27.700459426361419, 56.255016181051872 ], [ 27.698909132750259, 56.258065091430808 ], [ 27.694258253715418, 56.260752264805149 ], [ 27.686816846720092, 56.262870999197219 ], [ 27.686816846720092, 56.276306871464897 ], [ 27.715497267285059, 56.298476061021347 ], [ 27.711001417881107, 56.311136786933162 ], [ 27.698909132750259, 56.321988836815365 ], [ 27.690227492304928, 56.332375800502746 ], [ 27.687591993975332, 56.347258612694816 ], [ 27.689607374680577, 56.354700018790822 ], [ 27.689917433043092, 56.360616969697389 ], [ 27.670383741816238, 56.371804918162411 ], [ 27.640411410957825, 56.378781236265013 ], [ 27.62242801334213, 56.392475490951142 ], [ 27.623978306053971, 56.401079617030689 ], [ 27.620412631737565, 56.407151598467465 ], [ 27.62180789571778, 56.420690823522648 ], [ 27.607958612300081, 56.420484117048318 ], [ 27.60253258601, 56.418572089130578 ], [ 27.596486443894264, 56.418985501179918 ], [ 27.591060417604183, 56.421827704185148 ], [ 27.592145623221938, 56.424385688148959 ], [ 27.589665155422551, 56.428313096771944 ], [ 27.581603630802874, 56.433609930953537 ], [ 27.571681756008218, 56.442808336235714 ], [ 27.559692823664875, 56.457096870124417 ], [ 27.55938276530236, 56.464460760955319 ], [ 27.549925977601788, 56.478568426791412 ], [ 27.508688184811888, 56.460171617126377 ], [ 27.49638919410603, 56.477922472544037 ], [ 27.495459019018483, 56.488025214492041 ], [ 27.487087436935667, 56.499497381998538 ], [ 27.486002232217231, 56.508850816012341 ], [ 27.486777377673832, 56.514896959027396 ], [ 27.493753695776434, 56.520865586777404 ], [ 27.506827833737532, 56.52807444887668 ], [ 27.525121290615061, 56.529288844804341 ], [ 27.538453810095234, 56.53153677040558 ], [ 27.551166212850433, 56.535102443822723 ], [ 27.566565789879292, 56.541717026719368 ], [ 27.574317254337814, 56.556961575016658 ], [ 27.56113976358921, 56.575926826361922 ], [ 27.603057282867269, 56.575087962139719 ], [ 27.657421310445102, 56.567321672357252 ], [ 27.691075231936395, 56.567321672357252 ], [ 27.724729153427688, 56.533667749966639 ], [ 27.755794311658121, 56.520723934561886 ], [ 27.776504417744661, 56.541434039749106 ], [ 27.812747102496758, 56.551789092792376 ], [ 27.864522366813731, 56.528490224344353 ], [ 27.88523247290027, 56.497425065214543 ], [ 27.918886394391563, 56.481892486548986 ], [ 27.94477402610039, 56.502602591736206 ], [ 27.988783000634953, 56.523312697822746 ], [ 28.053502081255999, 56.518135171301083 ], [ 28.093251180000095, 56.501591086000033 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-110", "NAME_1": "Zilupes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 28.167871947832111, 56.427125345957904 ], [ 28.16425459800007, 56.392812195 ], [ 28.167148478000058, 56.369867859000053 ], [ 28.174434855000129, 56.349636536000062 ], [ 28.214794148000095, 56.281371969000091 ], [ 28.217274617000072, 56.270726624000119 ], [ 28.215310913000053, 56.255998841000022 ], [ 28.209419800000063, 56.24814402300008 ], [ 28.201358276000065, 56.24168446900002 ], [ 28.193141724000043, 56.231039124000048 ], [ 28.184408406000045, 56.207526347000041 ], [ 28.17862064600007, 56.183910218000037 ], [ 28.169112182000106, 56.161741028 ], [ 28.148906697000115, 56.142414043000045 ], [ 28.110976196000109, 56.156805929000072 ], [ 28.068239787000095, 56.147581686000066 ], [ 28.051100037936408, 56.140665997038127 ], [ 28.050928988681846, 56.14112132379006 ], [ 28.047259963376575, 56.150888169853147 ], [ 28.04369428906017, 56.158019518485958 ], [ 28.06260786266273, 56.182100735060828 ], [ 28.077542351698128, 56.196725164834447 ], [ 28.070411003964637, 56.208507392502156 ], [ 28.089744766008153, 56.238548744528885 ], [ 28.120809924238586, 56.274791429280981 ], [ 28.094922292529759, 56.298090298628324 ], [ 28.043147028212786, 56.313622877293938 ], [ 28.00431558019983, 56.331744220119617 ], [ 27.931830210695637, 56.308445350772274 ], [ 27.91629763113076, 56.285146482324251 ], [ 27.864522366813731, 56.285146482324251 ], [ 27.841223498365764, 56.321389167076347 ], [ 27.877466183117861, 56.331744220119617 ], [ 27.913708867869957, 56.355043088567641 ], [ 27.95512907914366, 56.378341957914984 ], [ 27.991371763895756, 56.37575319465418 ], [ 28.012081869982296, 56.383519484436647 ], [ 27.991371763895756, 56.40422958962381 ], [ 27.978427948491003, 56.432705985492817 ], [ 28.022436923025566, 56.437883512014423 ], [ 28.069034660820932, 56.422350932449547 ], [ 28.118221160977782, 56.422350932449547 ], [ 28.167871947832111, 56.427125345957904 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-065", "NAME_1": "Neretas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.349085703000128, 56.159876323000091 ], [ 25.10919559700011, 56.183083395 ], [ 25.073125447000109, 56.197811178 ], [ 25.043979940000071, 56.227990214 ], [ 25.026203247000041, 56.260184632000048 ], [ 25.016488077000105, 56.269899801000079 ], [ 24.983208456000057, 56.290492859 ], [ 24.973183228000039, 56.300750631000071 ], [ 24.962124471000038, 56.319276632000097 ], [ 24.936286255000113, 56.379918925000069 ], [ 24.910137980000115, 56.421957703000018 ], [ 24.892257934000071, 56.438726706000054 ], [ 24.8709672446426, 56.442602437352548 ], [ 24.877635972122391, 56.454549473879069 ], [ 24.900877881109295, 56.459912991891031 ], [ 24.911604916233898, 56.472427865753389 ], [ 24.920544112620689, 56.486730579252821 ], [ 25.013511748568305, 56.495669774740293 ], [ 25.027814462067738, 56.459912991891031 ], [ 25.051056371054642, 56.463488670265917 ], [ 25.074298280041546, 56.4027021378933 ], [ 25.133296972777032, 56.413429173017903 ], [ 25.29357791508869, 56.407900906401665 ], [ 25.298228794123531, 56.377075913922283 ], [ 25.298538853385367, 56.365552070471665 ], [ 25.302104525903133, 56.349377346187566 ], [ 25.298228794123531, 56.342504380872469 ], [ 25.296213413418286, 56.336949164272482 ], [ 25.299158970110341, 56.334158637211317 ], [ 25.305360141857022, 56.330670478160016 ], [ 25.361377394051487, 56.334752916413947 ], [ 25.370265740971149, 56.327311510317941 ], [ 25.362927686763328, 56.3226606312831 ], [ 25.341998731556203, 56.317027900317328 ], [ 25.324325392302967, 56.30932811090355 ], [ 25.31094119597941, 56.297752591508868 ], [ 25.310476108885325, 56.28736562782143 ], [ 25.33750288305157, 56.275893460314933 ], [ 25.356416456654131, 56.261630763948574 ], [ 25.37222944483301, 56.255791328307112 ], [ 25.403442010040692, 56.231555081202032 ], [ 25.395535515951281, 56.202099514281144 ], [ 25.408092889075533, 56.182462470266785 ], [ 25.408557977068995, 56.178586738487184 ], [ 25.403752069302527, 56.175486152164183 ], [ 25.37181603368299, 56.174142565027353 ], [ 25.359517042977131, 56.168199774799746 ], [ 25.349543491339034, 56.160241603866893 ], [ 25.349085703000128, 56.159876323000091 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-107", "NAME_1": "Viesites" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.454807577000111, 56.149648743000014 ], [ 25.349085703000128, 56.159876323000091 ], [ 25.349543491339034, 56.160241603866893 ], [ 25.359517042977131, 56.168199774799746 ], [ 25.37181603368299, 56.174142565027353 ], [ 25.403752069302527, 56.175486152164183 ], [ 25.408557977068995, 56.178586738487184 ], [ 25.408092889075533, 56.182462470266785 ], [ 25.395535515951281, 56.202099514281144 ], [ 25.403442010040692, 56.231555081202032 ], [ 25.37222944483301, 56.255791328307112 ], [ 25.356416456654131, 56.261630763948574 ], [ 25.33750288305157, 56.275893460314933 ], [ 25.310476108885325, 56.28736562782143 ], [ 25.31094119597941, 56.297752591508868 ], [ 25.324325392302967, 56.30932811090355 ], [ 25.341998731556203, 56.317027900317328 ], [ 25.362927686763328, 56.3226606312831 ], [ 25.370265740971149, 56.327311510317941 ], [ 25.361377394051487, 56.334752916413947 ], [ 25.305360141857022, 56.330670478160016 ], [ 25.299158970110341, 56.334158637211317 ], [ 25.296213413418286, 56.336949164272482 ], [ 25.298228794123531, 56.342504380872469 ], [ 25.302104525903133, 56.349377346187566 ], [ 25.298538853385367, 56.365552070471665 ], [ 25.298228794123531, 56.377075913922283 ], [ 25.29357791508869, 56.407900906401665 ], [ 25.296213413418286, 56.420820013832554 ], [ 25.331301711304889, 56.421285101825958 ], [ 25.393520135246035, 56.410975654303002 ], [ 25.455583529556236, 56.413352770214146 ], [ 25.476202427300166, 56.418882148392413 ], [ 25.505399610903282, 56.436400458014703 ], [ 25.523538039049242, 56.444823716940959 ], [ 25.547774286154379, 56.444875392885024 ], [ 25.566687859756883, 56.447614244002125 ], [ 25.573819206591111, 56.452859402239596 ], [ 25.583431023922572, 56.458569648470473 ], [ 25.590717401287009, 56.460843410694793 ], [ 25.594644809910051, 56.467147936128299 ], [ 25.615928578241267, 56.446736111782116 ], [ 25.611476223648765, 56.431152872507027 ], [ 25.635964172108856, 56.408891100443896 ], [ 25.658225943272669, 56.393307860269488 ], [ 25.676035360743299, 56.36659373541255 ], [ 25.727237434959648, 56.368819911809453 ], [ 25.733915966848372, 56.351010495238143 ], [ 25.736142143245274, 56.328748723175011 ], [ 25.733915966848372, 56.299808421021794 ], [ 25.680487715335801, 56.29312988913307 ], [ 25.693844778213929, 56.228570752038536 ], [ 25.693844778213929, 56.208535158171003 ], [ 25.67380918344702, 56.184047209710911 ], [ 25.649679402582365, 56.143809306554203 ], [ 25.590044800000044, 56.141122131000017 ], [ 25.572888224000081, 56.143034159000123 ], [ 25.522762085000068, 56.156573385000101 ], [ 25.454807577000111, 56.149648743000014 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-105", "NAME_1": "Vecumnieku" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.8709672446426, 56.442602437352548 ], [ 24.857117960000096, 56.43536773700005 ], [ 24.853397257000097, 56.424722393000067 ], [ 24.852157023000075, 56.413663635000049 ], [ 24.845852498000056, 56.404930319000087 ], [ 24.837687622000118, 56.403948466000017 ], [ 24.815570109000106, 56.408806051000042 ], [ 24.805544881000088, 56.408547669000072 ], [ 24.715039531000059, 56.386252988000038 ], [ 24.678627563000106, 56.37728342700008 ], [ 24.639146770000082, 56.359971822000077 ], [ 24.572772161366768, 56.309810859570966 ], [ 24.529007335520078, 56.322249375808042 ], [ 24.480735677909195, 56.309734501945684 ], [ 24.468220804046837, 56.331188572194833 ], [ 24.491462713033741, 56.343703446057134 ], [ 24.505765426533173, 56.361581837931453 ], [ 24.452130251809649, 56.366945355044095 ], [ 24.446766733797688, 56.381248068543528 ], [ 24.514704622020645, 56.397338620780715 ], [ 24.530795174257889, 56.409853494643016 ], [ 24.51291678328289, 56.454549473879069 ], [ 24.473584321159478, 56.483154900877935 ], [ 24.437827538310216, 56.474215704491144 ], [ 24.42710050318567, 56.493881936002538 ], [ 24.40028291582388, 56.509972488239725 ], [ 24.380616685211862, 56.529638718851743 ], [ 24.387768041961522, 56.552880627838704 ], [ 24.34843557983811, 56.565395501701005 ], [ 24.321617992476376, 56.56360766296325 ], [ 24.309103118614019, 56.611879320574133 ], [ 24.368101810450185, 56.619030677323849 ], [ 24.355358623901338, 56.661563541524174 ], [ 24.374047479407636, 56.659590969447663 ], [ 24.372962273789881, 56.666308906031134 ], [ 24.376062860112881, 56.66840180110222 ], [ 24.383659294940514, 56.670856432278526 ], [ 24.414975212935701, 56.674267076064666 ], [ 24.42789432126591, 56.677677720750182 ], [ 24.443397251082274, 56.684240627702764 ], [ 24.482361280748478, 56.704704494916484 ], [ 24.521893752094968, 56.713644517780267 ], [ 24.556051873095441, 56.706978258040124 ], [ 24.600907017045188, 56.707029933984245 ], [ 24.634083286114731, 56.676850898450198 ], [ 24.58974490700183, 56.661037910271318 ], [ 24.59284549332483, 56.643028673334584 ], [ 24.599666781796543, 56.620678615725524 ], [ 24.617185093217472, 56.607191067513725 ], [ 24.629897495073294, 56.601454982861128 ], [ 24.656769239608707, 56.599801337361782 ], [ 24.662505324261303, 56.596855781569047 ], [ 24.662970412254708, 56.593961899921737 ], [ 24.660334913925112, 56.5904995792921 ], [ 24.661420118643548, 56.588329168955966 ], [ 24.666070997678389, 56.587166449871745 ], [ 24.673667433405285, 56.586546332247394 ], [ 24.691185743926951, 56.581662910115199 ], [ 24.697128534154501, 56.578872382154657 ], [ 24.697231886942006, 56.576236883825118 ], [ 24.681418897863807, 56.571327623271145 ], [ 24.671341994337524, 56.566780097023809 ], [ 24.664365676234979, 56.556832383807432 ], [ 24.657079298870542, 56.543577378693044 ], [ 24.732475212660916, 56.544249173160779 ], [ 24.949987336346453, 56.578568175680743 ], [ 24.956300895469951, 56.551092789100892 ], [ 24.995633356694043, 56.551092789100892 ], [ 25.013511748568305, 56.495669774740293 ], [ 24.920544112620689, 56.486730579252821 ], [ 24.911604916233898, 56.472427865753389 ], [ 24.900877881109295, 56.459912991891031 ], [ 24.877635972122391, 56.454549473879069 ], [ 24.8709672446426, 56.442602437352548 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-088", "NAME_1": "Saldus" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 22.214901977000096, 56.39038340300003 ], [ 22.195264933000146, 56.394853414000053 ], [ 22.158161255000095, 56.410252991000036 ], [ 22.139144328000015, 56.415704854000111 ], [ 22.094082479000065, 56.417410177000065 ], [ 21.983173071000039, 56.388353479000031 ], [ 21.982668897951271, 56.388780626324831 ], [ 21.980808546876915, 56.390356757458335 ], [ 21.945565220258686, 56.416711738056222 ], [ 21.951352979956027, 56.421130073094389 ], [ 21.961584914012576, 56.426271878544355 ], [ 21.976932814197994, 56.429114081549585 ], [ 21.987784864979517, 56.432524726235101 ], [ 21.99538130070647, 56.439320177184413 ], [ 21.989490187322247, 56.446115628133725 ], [ 21.954608595010654, 56.4706360951796 ], [ 21.957554151702709, 56.480842189915109 ], [ 21.953988478285623, 56.48781850891703 ], [ 21.956468946984273, 56.493606269513691 ], [ 21.966700881040822, 56.506628729732086 ], [ 21.99786176940512, 56.50593109774195 ], [ 22.009695672117573, 56.507972316868916 ], [ 22.024268425947071, 56.50745555293139 ], [ 22.037445915796354, 56.504044908245874 ], [ 22.056049431935719, 56.509057522486671 ], [ 22.05744469591599, 56.523268541110269 ], [ 22.049073113833117, 56.529056300807611 ], [ 22.018222283831335, 56.542595526762113 ], [ 22.011711052822818, 56.547504788215349 ], [ 22.011400995359622, 56.555049547098918 ], [ 22.060596958183055, 56.564506333900169 ], [ 22.099974399898599, 56.56853709620998 ], [ 22.121265090311624, 56.576340237511943 ], [ 22.126070998078092, 56.582205512474388 ], [ 22.123435499748496, 56.58763153696583 ], [ 22.118577915138644, 56.592359931265776 ], [ 22.115373976028138, 56.603806261249929 ], [ 22.112531773022909, 56.609516507480805 ], [ 22.109276157068962, 56.613624783257137 ], [ 22.111911655398558, 56.625691229966264 ], [ 22.111446567405153, 56.646671861117454 ], [ 22.103540073315742, 56.672871812983772 ], [ 22.112221713761073, 56.682948717409374 ], [ 22.125450881353061, 56.69013174108693 ], [ 22.155991652093064, 56.700311998300037 ], [ 22.166998731606157, 56.708218492389506 ], [ 22.173975050608078, 56.715969956848028 ], [ 22.181003044654744, 56.72852732997228 ], [ 22.188909538744213, 56.735658677705771 ], [ 22.189219598006048, 56.741756497564268 ], [ 22.185963982951421, 56.748112698042576 ], [ 22.174491815444924, 56.765889390982579 ], [ 22.162657911833151, 56.795034897742312 ], [ 22.204877556553981, 56.795215765794921 ], [ 22.230302362064322, 56.80906505011194 ], [ 22.251127963584622, 56.823095201582248 ], [ 22.269731479723987, 56.82970978537827 ], [ 22.305749952698136, 56.838623968921013 ], [ 22.316602004378979, 56.843662421583474 ], [ 22.34130333767888, 56.847486477418954 ], [ 22.342026808090679, 56.864229640685323 ], [ 22.329469434966427, 56.87477163400365 ], [ 22.32032270742701, 56.880404364969422 ], [ 22.310555861363866, 56.883763332811554 ], [ 22.30388960072446, 56.884512640745754 ], [ 22.295518018641644, 56.883298244818093 ], [ 22.287869906970627, 56.883091539243139 ], [ 22.269731479723987, 56.888052477539759 ], [ 22.26399539597071, 56.893943590024605 ], [ 22.267406039756906, 56.898542792216062 ], [ 22.287869906970627, 56.905777492737059 ], [ 22.290247022881772, 56.91006663746532 ], [ 22.304354688717865, 56.919730129841582 ], [ 22.328384230247991, 56.916836249093592 ], [ 22.335670606713109, 56.913012193258112 ], [ 22.338512810617715, 56.908025418338354 ], [ 22.338151076311078, 56.904072171293649 ], [ 22.348744744674207, 56.896424058723312 ], [ 22.392307977431187, 56.885882066304305 ], [ 22.417784457986329, 56.889344386933885 ], [ 22.432357211815884, 56.898542792216062 ], [ 22.443364292228296, 56.903555406456803 ], [ 22.454888135678914, 56.917094632411306 ], [ 22.492405226320102, 56.920091865047482 ], [ 22.511938918446333, 56.917404689874502 ], [ 22.526563348219952, 56.912960517313991 ], [ 22.529198845650171, 56.908774726272554 ], [ 22.524392937883761, 56.905105699168644 ], [ 22.520982293198244, 56.900299791402233 ], [ 22.52113732282919, 56.88464183195498 ], [ 22.518966913392319, 56.876838691552337 ], [ 22.514626091820674, 56.871981106043165 ], [ 22.506564568999636, 56.86748525753859 ], [ 22.500466750040459, 56.862989407235318 ], [ 22.490854932708942, 56.851517238829501 ], [ 22.462810392185816, 56.805420994483256 ], [ 22.442234072844144, 56.771127128913861 ], [ 22.460524134780997, 56.736833262445089 ], [ 22.487959227236558, 56.723115716217308 ], [ 22.497104258654588, 56.684249334938841 ], [ 22.501676773464283, 56.638524180546483 ], [ 22.535970639933055, 56.620234119509007 ], [ 22.549688186160836, 56.579081479926344 ], [ 22.574837020312202, 56.567650192002759 ], [ 22.60455837107196, 56.599657799268016 ], [ 22.654856041173332, 56.604230314977031 ], [ 22.693722422451799, 56.588226511344374 ], [ 22.712074313678613, 56.565372530317973 ], [ 22.701436395073529, 56.493296210251856 ], [ 22.741330600726599, 56.475442002946068 ], [ 22.744896275043061, 56.46812978805923 ], [ 22.748151890097631, 56.455701606144203 ], [ 22.742880894337759, 56.44926789040079 ], [ 22.736628044848374, 56.443790188166645 ], [ 22.726551141322091, 56.424540716880529 ], [ 22.767530551693596, 56.421827704185148 ], [ 22.785979038202015, 56.418417060399008 ], [ 22.821842482444595, 56.402707425007634 ], [ 22.858532748987159, 56.397229722773432 ], [ 22.859602845994516, 56.397069961809279 ], [ 22.822926880000097, 56.382864482000073 ], [ 22.681436808000058, 56.350308330000033 ], [ 22.666347290000147, 56.34909393400001 ], [ 22.649087361000085, 56.353098857000091 ], [ 22.604748982000018, 56.379092102000058 ], [ 22.578221703000111, 56.3870029160001 ], [ 22.575810180000076, 56.387722067000098 ], [ 22.511731404000045, 56.395964458000051 ], [ 22.214901977000096, 56.39038340300003 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-081", "NAME_1": "Rucavas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.485493169569811, 56.265791916040953 ], [ 21.419291626000131, 56.237395325000065 ], [ 21.403685343000092, 56.234475607000078 ], [ 21.35831343600006, 56.233235373000028 ], [ 21.327617635000109, 56.224372864000017 ], [ 21.290410603000112, 56.206932068000086 ], [ 21.254857218000041, 56.185202128000086 ], [ 21.229639119000097, 56.163187968 ], [ 21.212585897000054, 56.13099355100006 ], [ 21.205351196000095, 56.103424174000068 ], [ 21.190365031000113, 56.084458924 ], [ 21.150160767000102, 56.078180237000097 ], [ 21.091352986000118, 56.077896017000015 ], [ 21.053396030000044, 56.072617906000062 ], [ 21.053396030000044, 56.072943427000041 ], [ 21.052582227000073, 56.077541408000059 ], [ 21.04273522200009, 56.114569403000075 ], [ 21.028819207000083, 56.147406317000048 ], [ 20.98406009200005, 56.210435289000031 ], [ 20.973399285000085, 56.232001044000071 ], [ 20.969086134000065, 56.253485419000071 ], [ 20.971039259000065, 56.259670315000051 ], [ 21.034466751639286, 56.266395796628672 ], [ 21.055786793225934, 56.168323604250929 ], [ 21.083502847378497, 56.166191600362026 ], [ 21.083502847378497, 56.191775649726424 ], [ 21.085634852166663, 56.228019721233125 ], [ 21.109086897642214, 56.219491704778306 ], [ 21.16451900684666, 56.264263792739825 ], [ 21.179443035867394, 56.28771583821532 ], [ 21.183707044544462, 56.323959909722021 ], [ 21.179443035867394, 56.355939972551653 ], [ 21.226347127717759, 56.351675963874584 ], [ 21.26259119922446, 56.326091913610924 ], [ 21.379851429300004, 56.32822391839909 ], [ 21.452339571414086, 56.302639868135373 ], [ 21.485493169569811, 56.265791916040953 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-074", "NAME_1": "Priekules" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.736514296197203, 56.323732366476086 ], [ 21.684495076000076, 56.310104066000022 ], [ 21.596025025000131, 56.307881979000015 ], [ 21.558921346000147, 56.297288310000042 ], [ 21.485493169569811, 56.265791916040953 ], [ 21.452339571414086, 56.302639868135373 ], [ 21.379851429300004, 56.32822391839909 ], [ 21.416095500806705, 56.353807968662807 ], [ 21.437415542393353, 56.407108073079087 ], [ 21.386247441865919, 56.464672186172436 ], [ 21.384115437977073, 56.490256236436153 ], [ 21.354267379036287, 56.503048261567983 ], [ 21.407567483452567, 56.520104294477562 ], [ 21.399039466997806, 56.558480369873166 ], [ 21.433151533716284, 56.545688344741279 ], [ 21.473659613900054, 56.520104294477562 ], [ 21.482187630354815, 56.511576278022801 ], [ 21.52909172220518, 56.513708281911647 ], [ 21.499243664163771, 56.552084357307194 ], [ 21.52909172220518, 56.571272395004996 ], [ 21.571731806277796, 56.560612373762012 ], [ 21.584523831409683, 56.549952353418348 ], [ 21.661275982200777, 56.560612373762012 ], [ 21.712444082728211, 56.549952353418348 ], [ 21.708180074051143, 56.505180265456886 ], [ 21.73376412431486, 56.498784252890914 ], [ 21.73376412431486, 56.473200202627197 ], [ 21.680464019898579, 56.464672186172436 ], [ 21.684728027676329, 56.432692123342804 ], [ 21.665539989978527, 56.417768093422751 ], [ 21.701784061485228, 56.396448051836103 ], [ 21.723104103071876, 56.38152402281537 ], [ 21.750820158123759, 56.38152402281537 ], [ 21.750820158123759, 56.36873199768354 ], [ 21.725236107860098, 56.355939972551653 ], [ 21.736514296197203, 56.323732366476086 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-100", "NAME_1": "Vainodes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.965321874000068, 56.383676718000046 ], [ 21.736514296197203, 56.323732366476086 ], [ 21.725236107860098, 56.355939972551653 ], [ 21.750820158123759, 56.36873199768354 ], [ 21.750820158123759, 56.38152402281537 ], [ 21.723104103071876, 56.38152402281537 ], [ 21.701784061485228, 56.396448051836103 ], [ 21.665539989978527, 56.417768093422751 ], [ 21.684728027676329, 56.432692123342804 ], [ 21.680464019898579, 56.464672186172436 ], [ 21.73376412431486, 56.473200202627197 ], [ 21.73376412431486, 56.498784252890914 ], [ 21.708180074051143, 56.505180265456886 ], [ 21.712444082728211, 56.549952353418348 ], [ 21.752952162012662, 56.562744378550178 ], [ 21.795393507604274, 56.573343003976447 ], [ 21.793223097268083, 56.554377753530446 ], [ 21.807485792735122, 56.538461412564118 ], [ 21.818027785154129, 56.530839138415502 ], [ 21.833065626977088, 56.523966173100405 ], [ 21.850790643073708, 56.521149806718199 ], [ 21.866138543259126, 56.520426337205663 ], [ 21.893475375787943, 56.523010158691818 ], [ 21.904172397837897, 56.521511541924099 ], [ 21.908358188879276, 56.517454942091888 ], [ 21.910063511222063, 56.512054755122847 ], [ 21.912388950289824, 56.507920640924794 ], [ 21.920605502741751, 56.506938788094544 ], [ 21.956934034977735, 56.514173489514917 ], [ 21.966700881040822, 56.506628729732086 ], [ 21.956468946984273, 56.493606269513691 ], [ 21.953988478285623, 56.48781850891703 ], [ 21.957554151702709, 56.480842189915109 ], [ 21.954608595010654, 56.4706360951796 ], [ 21.989490187322247, 56.446115628133725 ], [ 21.99538130070647, 56.439320177184413 ], [ 21.987784864979517, 56.432524726235101 ], [ 21.976932814197994, 56.429114081549585 ], [ 21.961584914012576, 56.426271878544355 ], [ 21.951352979956027, 56.421130073094389 ], [ 21.945565220258686, 56.416711738056222 ], [ 21.980808546876915, 56.390356757458335 ], [ 21.982668897951271, 56.388780626324831 ], [ 21.983173071000039, 56.388353479000031 ], [ 21.965321874000068, 56.383676718000046 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-010", "NAME_1": "Auces" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.062292114000059, 56.304161276000102 ], [ 23.01671350100014, 56.32384999600005 ], [ 22.981366822000069, 56.373175151000041 ], [ 22.95697554500012, 56.401984762000083 ], [ 22.924522746, 56.41211334300003 ], [ 22.888969360000146, 56.408444316000029 ], [ 22.859602845994516, 56.397069961809279 ], [ 22.858532748987159, 56.397229722773432 ], [ 22.821842482444595, 56.402707425007634 ], [ 22.785979038202015, 56.418417060399008 ], [ 22.767530551693596, 56.421827704185148 ], [ 22.726551141322091, 56.424540716880529 ], [ 22.736628044848374, 56.443790188166645 ], [ 22.742880894337759, 56.44926789040079 ], [ 22.748151890097631, 56.455701606144203 ], [ 22.744896275043061, 56.46812978805923 ], [ 22.741330600726599, 56.475442002946068 ], [ 22.701436395073529, 56.493296210251856 ], [ 22.712074313678613, 56.565372530317973 ], [ 22.732287225075368, 56.565281481155409 ], [ 22.735904575335894, 56.565539863573804 ], [ 22.755128208200233, 56.562025865201463 ], [ 22.773421665077763, 56.567503567435665 ], [ 22.798123000176304, 56.56833038973565 ], [ 22.82340877409564, 56.561819824225495 ], [ 22.834135809220186, 56.540365753976346 ], [ 22.848438522719619, 56.538577914339271 ], [ 22.862741235319731, 56.552880627838704 ], [ 22.896710179431238, 56.56718334133808 ], [ 22.930679123542689, 56.568971180075891 ], [ 22.925315606430104, 56.588637411587229 ], [ 22.961072389279309, 56.601152285449587 ], [ 22.980738620790703, 56.577910376462683 ], [ 23.021858921651869, 56.59042525032504 ], [ 23.041525152263944, 56.577910376462683 ], [ 23.066554899988603, 56.551092789100892 ], [ 23.088008970237752, 56.545729271088987 ], [ 23.086221131499997, 56.524275201739158 ], [ 23.089796809874883, 56.479579222503105 ], [ 23.121977914349259, 56.470640026116257 ], [ 23.129129271098975, 56.445610278391598 ], [ 23.148795501710993, 56.43309540362992 ], [ 23.118402235974372, 56.409853494643016 ], [ 23.152371180085879, 56.390187264030999 ], [ 23.172569619592252, 56.357956441436613 ], [ 23.154172811000109, 56.351393534000024 ], [ 23.162854451000072, 56.341006572000097 ], [ 23.112728312000058, 56.310879212000017 ], [ 23.062292114000059, 56.304161276000102 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-016", "NAME_1": "Bauska" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.572772161366768, 56.309810859570966 ], [ 24.557911417000099, 56.29858022100008 ], [ 24.538997843000061, 56.287624817 ], [ 24.481326945000092, 56.268840435000087 ], [ 24.447220499000139, 56.260520528000043 ], [ 24.414354289000102, 56.265507304 ], [ 24.350792277000039, 56.291552226000064 ], [ 24.31854618400007, 56.29858022100008 ], [ 24.287643677000091, 56.295531311000062 ], [ 24.166824178000041, 56.260313823000089 ], [ 24.140421618000062, 56.257600226000093 ], [ 24.138918905000082, 56.257445780000111 ], [ 24.108636516000047, 56.260701396000101 ], [ 24.075150187000133, 56.271191712000032 ], [ 23.981305786000036, 56.312403666000037 ], [ 24.008746138723325, 56.322249375808042 ], [ 24.035563726984378, 56.331188572194833 ], [ 24.04092724409702, 56.35085480280685 ], [ 24.073108348571395, 56.363369676669208 ], [ 24.06774483145881, 56.383035907281283 ], [ 24.090986740445715, 56.383035907281283 ], [ 24.126743524194296, 56.36873319378185 ], [ 24.155348950293785, 56.386611585656112 ], [ 24.114228649432619, 56.400914299155545 ], [ 24.064169153083924, 56.415217012654978 ], [ 24.03735156572219, 56.425944047779581 ], [ 24.035563726984378, 56.447398117129353 ], [ 24.030200208972474, 56.477791382865973 ], [ 24.017743371059737, 56.502013034873642 ], [ 24.031742790897056, 56.501719469178113 ], [ 24.042904900940414, 56.502830512318269 ], [ 24.080938754619808, 56.527454332151706 ], [ 24.078871697970442, 56.535464179028622 ], [ 24.105289453945147, 56.529638718851743 ], [ 24.1499854331812, 56.524275201739158 ], [ 24.173227342168104, 56.517123844989442 ], [ 24.194681412417253, 56.509972488239725 ], [ 24.234013873641345, 56.501033291852934 ], [ 24.251892265515608, 56.518911683727197 ], [ 24.300163923126547, 56.535002235964384 ], [ 24.34485990146328, 56.536790075601459 ], [ 24.380616685211862, 56.529638718851743 ], [ 24.40028291582388, 56.509972488239725 ], [ 24.42710050318567, 56.493881936002538 ], [ 24.437827538310216, 56.474215704491144 ], [ 24.473584321159478, 56.483154900877935 ], [ 24.51291678328289, 56.454549473879069 ], [ 24.530795174257889, 56.409853494643016 ], [ 24.514704622020645, 56.397338620780715 ], [ 24.446766733797688, 56.381248068543528 ], [ 24.452130251809649, 56.366945355044095 ], [ 24.505765426533173, 56.361581837931453 ], [ 24.491462713033741, 56.343703446057134 ], [ 24.468220804046837, 56.331188572194833 ], [ 24.480735677909195, 56.309734501945684 ], [ 24.529007335520078, 56.322249375808042 ], [ 24.572772161366768, 56.309810859570966 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-098", "NAME_1": "Tervetes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.37803970300007, 56.354629849000034 ], [ 23.31064904800013, 56.37059132900005 ], [ 23.288428182000075, 56.373045960000113 ], [ 23.172569619592252, 56.357956441436613 ], [ 23.152371180085879, 56.390187264030999 ], [ 23.118402235974372, 56.409853494643016 ], [ 23.148795501710993, 56.43309540362992 ], [ 23.172037410697953, 56.45097379550424 ], [ 23.214945551196195, 56.454549473879069 ], [ 23.275732082669435, 56.454549473879069 ], [ 23.309701026780942, 56.459912991891031 ], [ 23.288246956531793, 56.468852187378502 ], [ 23.273944243032361, 56.490306257627651 ], [ 23.315064543893584, 56.513548166614555 ], [ 23.35618484475475, 56.545729271088987 ], [ 23.383002432116541, 56.545729271088987 ], [ 23.393729467241087, 56.518911683727197 ], [ 23.415087925167597, 56.493296210251856 ], [ 23.430745883715531, 56.477586574860538 ], [ 23.427800327023476, 56.472884019881576 ], [ 23.42593997594912, 56.46893077283687 ], [ 23.415397984429433, 56.461463528319143 ], [ 23.413072543563032, 56.459448146714578 ], [ 23.418808628215629, 56.4494487584534 ], [ 23.430900913346477, 56.445185452146859 ], [ 23.439427525060239, 56.436658841332417 ], [ 23.449504428586465, 56.421879381028589 ], [ 23.462061801710774, 56.407151598467465 ], [ 23.46237186007329, 56.397953193185288 ], [ 23.456945834682529, 56.391648667751781 ], [ 23.449969516579927, 56.38627431920446 ], [ 23.442373080852974, 56.382062689741304 ], [ 23.430435825353015, 56.377902737121588 ], [ 23.420203892195843, 56.375887356416342 ], [ 23.384805535946725, 56.360746161805878 ], [ 23.378345981781592, 56.354906725265153 ], [ 23.37803970300007, 56.354629849000034 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-JEL", "NAME_1": "Jelgava" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.517561482000133, 56.328655904000058 ], [ 23.481594686000079, 56.330102845000042 ], [ 23.37803970300007, 56.354629849000034 ], [ 23.378345981781592, 56.354906725265153 ], [ 23.384805535946725, 56.360746161805878 ], [ 23.420203892195843, 56.375887356416342 ], [ 23.430435825353015, 56.377902737121588 ], [ 23.442373080852974, 56.382062689741304 ], [ 23.449969516579927, 56.38627431920446 ], [ 23.456945834682529, 56.391648667751781 ], [ 23.46237186007329, 56.397953193185288 ], [ 23.462061801710774, 56.407151598467465 ], [ 23.449504428586465, 56.421879381028589 ], [ 23.439427525060239, 56.436658841332417 ], [ 23.430900913346477, 56.445185452146859 ], [ 23.418808628215629, 56.4494487584534 ], [ 23.413072543563032, 56.459448146714578 ], [ 23.415397984429433, 56.461463528319143 ], [ 23.42593997594912, 56.46893077283687 ], [ 23.427800327023476, 56.472884019881576 ], [ 23.430745883715531, 56.477586574860538 ], [ 23.415087925167597, 56.493296210251856 ], [ 23.437877232348399, 56.499264838001864 ], [ 23.44748904788122, 56.505621039379434 ], [ 23.459271274649609, 56.529831448062851 ], [ 23.458651157025258, 56.544817613042369 ], [ 23.445938755169379, 56.556393134235748 ], [ 23.434466586763563, 56.564092922750149 ], [ 23.432141147695802, 56.57083669685602 ], [ 23.436792025831323, 56.577063707024422 ], [ 23.448419223868086, 56.579079087729667 ], [ 23.477151320377118, 56.586933905875014 ], [ 23.480251905800799, 56.599542954943388 ], [ 23.405941195829485, 56.606441759579525 ], [ 23.412917514831406, 56.616027736690683 ], [ 23.424699740700476, 56.622125556549179 ], [ 23.438187289811538, 56.634450384777381 ], [ 23.444543491189165, 56.641555894988528 ], [ 23.476066114759362, 56.656180324762147 ], [ 23.485367872829045, 56.660288601437799 ], [ 23.484282668110609, 56.664913642050919 ], [ 23.479786817807394, 56.676773383185036 ], [ 23.481492140150124, 56.680416571867283 ], [ 23.478236525095554, 56.684809068483673 ], [ 23.462991977697584, 56.692534695419852 ], [ 23.442683140114809, 56.696798000827073 ], [ 23.417413364235358, 56.706823229308554 ], [ 23.436481968368128, 56.723876450937439 ], [ 23.459271274649609, 56.734573472987336 ], [ 23.502886183350654, 56.746872463693194 ], [ 23.525262079381434, 56.763667303803004 ], [ 23.50552168078093, 56.808212389390235 ], [ 23.48660810717837, 56.815912177005316 ], [ 23.461958448923269, 56.884228420804959 ], [ 23.506761916029575, 56.894615384492397 ], [ 23.587635532054151, 56.891204738907561 ], [ 23.600813022802754, 56.889292710989764 ], [ 23.626237827413775, 56.8892410350457 ], [ 23.669542677752361, 56.874900825212876 ], [ 23.70726647306924, 56.852137356453795 ], [ 23.718428582213278, 56.835962633069016 ], [ 23.734086540761211, 56.822009995964493 ], [ 23.769639926641275, 56.800047511983053 ], [ 23.759718051846619, 56.771883857154251 ], [ 23.764213901250514, 56.768266506893724 ], [ 23.756307407161103, 56.744133613475469 ], [ 23.701237802982178, 56.737028061895501 ], [ 23.701237802982178, 56.720937509658313 ], [ 23.670844537245557, 56.715573991646352 ], [ 23.683359411107915, 56.697695599772089 ], [ 23.710176999369025, 56.70663479615888 ], [ 23.731209870339228, 56.690498589838 ], [ 23.683804230181067, 56.674098589877985 ], [ 23.644412690693116, 56.677963454250005 ], [ 23.617950646704969, 56.669543712572249 ], [ 23.631181668699014, 56.650298589508282 ], [ 23.676992949365115, 56.629895770073688 ], [ 23.670992949664878, 56.601501410361777 ], [ 23.707587308907137, 56.591887308752291 ], [ 23.739007050035298, 56.6076591070821 ], [ 23.778804230530795, 56.6175788486849 ], [ 23.769818331450836, 56.636687308972114 ], [ 23.791941897500578, 56.646880719669468 ], [ 23.82817438394062, 56.627969872811377 ], [ 23.865719006427014, 56.615454998949019 ], [ 23.912202824400822, 56.608303642199303 ], [ 23.940808251399687, 56.579698215200438 ], [ 23.964050160386591, 56.554668467475778 ], [ 23.969413677499176, 56.518911683727197 ], [ 23.99231367413671, 56.502546292377474 ], [ 23.962651400741549, 56.497843736499192 ], [ 23.95009402761724, 56.488025214492041 ], [ 23.932110630001546, 56.482754217832849 ], [ 23.920018344870698, 56.472728990250687 ], [ 23.886015251702474, 56.466114407353984 ], [ 23.875008172189382, 56.462858792299414 ], [ 23.861675652709209, 56.44849274404487 ], [ 23.847516310029675, 56.438829250769288 ], [ 23.840695020658643, 56.434178371734447 ], [ 23.841005079920478, 56.43035431589891 ], [ 23.842710402263208, 56.427408759206855 ], [ 23.850151808359271, 56.423377996896988 ], [ 23.85046186672173, 56.418468736343073 ], [ 23.84798139802308, 56.411750799759545 ], [ 23.843020460625723, 56.401828924964889 ], [ 23.838679639953398, 56.397023017198478 ], [ 23.836664260147472, 56.393250637307062 ], [ 23.836199172154068, 56.387850450337965 ], [ 23.873922966571627, 56.389478258314966 ], [ 23.879348992861708, 56.384284776021559 ], [ 23.873612909108431, 56.373768622024272 ], [ 23.870822381147946, 56.36715403912757 ], [ 23.868651970811811, 56.34327952722839 ], [ 23.871029086722956, 56.332427477346187 ], [ 23.871106924844696, 56.332072130024756 ], [ 23.85810917200007, 56.334391989000025 ], [ 23.825036255000072, 56.33490875300005 ], [ 23.756099894000045, 56.325968730000042 ], [ 23.724990682000112, 56.328810934 ], [ 23.723647094000029, 56.332118226 ], [ 23.72478397600014, 56.338396912000107 ], [ 23.723543742000118, 56.345812480000021 ], [ 23.715068807000108, 56.352737122000107 ], [ 23.706697225000113, 56.354442444000071 ], [ 23.679412069000108, 56.351858622000051 ], [ 23.609855591000013, 56.353822327 ], [ 23.577712850000097, 56.348603007000079 ], [ 23.517561482000133, 56.328655904000058 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-083", "NAME_1": "Rundales" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.981305786000036, 56.312403666000037 ], [ 23.871106924844696, 56.332072130024756 ], [ 23.871029086722956, 56.332427477346187 ], [ 23.868651970811811, 56.34327952722839 ], [ 23.870822381147946, 56.36715403912757 ], [ 23.873612909108431, 56.373768622024272 ], [ 23.879348992861708, 56.384284776021559 ], [ 23.873922966571627, 56.389478258314966 ], [ 23.836199172154068, 56.387850450337965 ], [ 23.836664260147472, 56.393250637307062 ], [ 23.838679639953398, 56.397023017198478 ], [ 23.843020460625723, 56.401828924964889 ], [ 23.84798139802308, 56.411750799759545 ], [ 23.85046186672173, 56.418468736343073 ], [ 23.850151808359271, 56.423377996896988 ], [ 23.842710402263208, 56.427408759206855 ], [ 23.841005079920478, 56.43035431589891 ], [ 23.840695020658643, 56.434178371734447 ], [ 23.847516310029675, 56.438829250769288 ], [ 23.861675652709209, 56.44849274404487 ], [ 23.875008172189382, 56.462858792299414 ], [ 23.886015251702474, 56.466114407353984 ], [ 23.920018344870698, 56.472728990250687 ], [ 23.932110630001546, 56.482754217832849 ], [ 23.95009402761724, 56.488025214492041 ], [ 23.962651400741549, 56.497843736499192 ], [ 23.99231367413671, 56.502546292377474 ], [ 24.017743371059737, 56.502013034873642 ], [ 24.030200208972474, 56.477791382865973 ], [ 24.035563726984378, 56.447398117129353 ], [ 24.03735156572219, 56.425944047779581 ], [ 24.064169153083924, 56.415217012654978 ], [ 24.114228649432619, 56.400914299155545 ], [ 24.155348950293785, 56.386611585656112 ], [ 24.126743524194296, 56.36873319378185 ], [ 24.090986740445715, 56.383035907281283 ], [ 24.06774483145881, 56.383035907281283 ], [ 24.073108348571395, 56.363369676669208 ], [ 24.04092724409702, 56.35085480280685 ], [ 24.035563726984378, 56.331188572194833 ], [ 24.008746138723325, 56.322249375808042 ], [ 23.981305786000036, 56.312403666000037 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-004", "NAME_1": "Aknistes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.795496034000053, 56.040130340000061 ], [ 25.766261434000114, 56.058646546 ], [ 25.708797241000099, 56.081048279000086 ], [ 25.69660160300009, 56.087895406000044 ], [ 25.687816610000112, 56.098334046000062 ], [ 25.669213094000071, 56.132027080000043 ], [ 25.661875041000059, 56.140812073000021 ], [ 25.649679402582365, 56.143809306554203 ], [ 25.67380918344702, 56.184047209710911 ], [ 25.693844778213929, 56.208535158171003 ], [ 25.693844778213929, 56.228570752038536 ], [ 25.756177738012184, 56.230796929334815 ], [ 25.800701280339808, 56.23524928392726 ], [ 25.838546291678028, 56.226344574742313 ], [ 25.876391303016192, 56.221892221049131 ], [ 25.896426897783101, 56.201856626282222 ], [ 25.905331606068728, 56.170690146832783 ], [ 25.94762897199945, 56.157333083954654 ], [ 25.976569275051986, 56.148428375668971 ], [ 25.976569275051986, 56.128392780902061 ], [ 25.98547398333767, 56.110583363431431 ], [ 26.012188109093927, 56.108357187034528 ], [ 26.025522902060288, 56.079419663786439 ], [ 26.007694533176164, 56.087274481931786 ], [ 25.989556105030204, 56.080530706926538 ], [ 25.982218051721702, 56.075879828791017 ], [ 25.954467808042864, 56.06288320609508 ], [ 25.941755405287722, 56.06172048611154 ], [ 25.926200798627917, 56.070686347396986 ], [ 25.915968866370065, 56.080065619832453 ], [ 25.83127119271137, 56.122853705334194 ], [ 25.834681838296206, 56.109624539540846 ], [ 25.838092482082345, 56.104276028515869 ], [ 25.850959913569113, 56.093139756894232 ], [ 25.853905470261225, 56.088669745912 ], [ 25.859796583645391, 56.081848456541024 ], [ 25.848789504132299, 56.074872138438423 ], [ 25.844603713090862, 56.065441189159515 ], [ 25.83762739408894, 56.058103135851013 ], [ 25.810600619922639, 56.04820709947802 ], [ 25.795717807730625, 56.040248928545168 ], [ 25.795496034000053, 56.040130340000061 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-036", "NAME_1": "Ilukstes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.961251118000064, 55.958458834000069 ], [ 25.871267944000067, 55.992138977000124 ], [ 25.795496034000053, 56.040130340000061 ], [ 25.795717807730625, 56.040248928545168 ], [ 25.810600619922639, 56.04820709947802 ], [ 25.83762739408894, 56.058103135851013 ], [ 25.844603713090862, 56.065441189159515 ], [ 25.848789504132299, 56.074872138438423 ], [ 25.859796583645391, 56.081848456541024 ], [ 25.853905470261225, 56.088669745912 ], [ 25.850959913569113, 56.093139756894232 ], [ 25.838092482082345, 56.104276028515869 ], [ 25.834681838296206, 56.109624539540846 ], [ 25.83127119271137, 56.122853705334194 ], [ 25.915968866370065, 56.080065619832453 ], [ 25.926200798627917, 56.070686347396986 ], [ 25.941755405287722, 56.06172048611154 ], [ 25.954467808042864, 56.06288320609508 ], [ 25.982218051721702, 56.075879828791017 ], [ 25.989556105030204, 56.080530706926538 ], [ 26.007694533176164, 56.087274481931786 ], [ 26.025522902060288, 56.079419663786439 ], [ 26.036995069566785, 56.068567613004916 ], [ 26.046296827636468, 56.06634552672466 ], [ 26.058905876704841, 56.067740789805555 ], [ 26.079369744817825, 56.078799547061408 ], [ 26.092392205935539, 56.089599920999547 ], [ 26.097559848907906, 56.096007799220558 ], [ 26.108566929320318, 56.101485501454704 ], [ 26.120504184820277, 56.100710354199464 ], [ 26.129340854896498, 56.098384915131703 ], [ 26.152440220439814, 56.109185289069785 ], [ 26.153060337164789, 56.118280341564457 ], [ 26.151355014822059, 56.121019191782239 ], [ 26.138952671328695, 56.131096096207841 ], [ 26.205821974304627, 56.163600571708969 ], [ 26.219671257722325, 56.166029365362874 ], [ 26.243390740889936, 56.167062893237926 ], [ 26.25718834836357, 56.162076118318168 ], [ 26.282199740925307, 56.158949693573447 ], [ 26.304989048106052, 56.153471992238622 ], [ 26.313050570927089, 56.150371405915621 ], [ 26.317546421230361, 56.14592723245579 ], [ 26.320698682598106, 56.141534735839343 ], [ 26.31863162594874, 56.134997667308483 ], [ 26.315065951632334, 56.130734361001942 ], [ 26.316306186880979, 56.122724514125025 ], [ 26.345348341752526, 56.093449815256747 ], [ 26.348399284599282, 56.073187567052571 ], [ 26.357025587061173, 56.055446681519129 ], [ 26.369639519448242, 56.043768621424704 ], [ 26.365489128420506, 56.02167389573367 ], [ 26.376556836628708, 55.997748114383967 ], [ 26.392967022310188, 55.977725237829418 ], [ 26.372580424846717, 55.953827283302473 ], [ 26.33783624264845, 55.965408677068751 ], [ 26.317982424249465, 55.950518313269527 ], [ 26.291510666683905, 55.940591404070005 ], [ 26.286547212084145, 55.924046555703967 ], [ 26.303092060450183, 55.917428616537393 ], [ 26.319636909715598, 55.907501707337872 ], [ 26.27662030288468, 55.881029949772312 ], [ 26.336181758081636, 55.839667827508208 ], [ 26.349417636414785, 55.809887100809021 ], [ 26.291510666683905, 55.806578130776074 ], [ 26.258420969052452, 55.804923646209261 ], [ 26.226905151551478, 55.796931254273943 ], [ 26.203754110000091, 55.827446187000064 ], [ 26.178639364000077, 55.849589539000092 ], [ 26.07942061300011, 55.898139547000071 ], [ 26.017615600000113, 55.937361959000029 ], [ 25.961251118000064, 55.958458834000069 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-DGV", "NAME_1": "Daugavpils" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.594531291000067, 55.666990866000063 ], [ 26.537480509000062, 55.669523010000077 ], [ 26.481049846000133, 55.678308005000062 ], [ 26.342350301000067, 55.716341858000092 ], [ 26.279718466000134, 55.743239441000085 ], [ 26.226905151551478, 55.796931254273943 ], [ 26.258420969052452, 55.804923646209261 ], [ 26.291510666683905, 55.806578130776074 ], [ 26.349417636414785, 55.809887100809021 ], [ 26.336181758081636, 55.839667827508208 ], [ 26.27662030288468, 55.881029949772312 ], [ 26.319636909715598, 55.907501707337872 ], [ 26.303092060450183, 55.917428616537393 ], [ 26.286547212084145, 55.924046555703967 ], [ 26.291510666683905, 55.940591404070005 ], [ 26.317982424249465, 55.950518313269527 ], [ 26.33783624264845, 55.965408677068751 ], [ 26.372580424846717, 55.953827283302473 ], [ 26.392967022310188, 55.977725237829418 ], [ 26.376556836628708, 55.997748114383967 ], [ 26.365489128420506, 56.02167389573367 ], [ 26.369639519448242, 56.043768621424704 ], [ 26.357025587061173, 56.055446681519129 ], [ 26.348399284599282, 56.073187567052571 ], [ 26.345348341752526, 56.093449815256747 ], [ 26.342609490635482, 56.107893377877076 ], [ 26.340749138661806, 56.134248359374283 ], [ 26.33656334762037, 56.149441229928811 ], [ 26.328295119224379, 56.162670397520799 ], [ 26.300803257064615, 56.18334096941021 ], [ 26.33542646695787, 56.189748846731845 ], [ 26.380850050789206, 56.196906032887057 ], [ 26.41655846540084, 56.183547674985164 ], [ 26.455367466335474, 56.180447089561483 ], [ 26.484512973994526, 56.167786362750405 ], [ 26.507508985851018, 56.132336331456486 ], [ 26.54084028455145, 56.133912461690727 ], [ 26.543940870874451, 56.142103175720933 ], [ 26.556549919942825, 56.156572578561622 ], [ 26.570657585778918, 56.153962917754427 ], [ 26.576238640800625, 56.14804596594854 ], [ 26.609621616344498, 56.132207140247317 ], [ 26.62062869585759, 56.1249466013046 ], [ 26.624814486899027, 56.121122545469063 ], [ 26.647913853341663, 56.135281887249278 ], [ 26.687342970101952, 56.12551504208551 ], [ 26.700365431219666, 56.118693752714478 ], [ 26.718503859365626, 56.111252345719151 ], [ 26.748166130962147, 56.111097316987582 ], [ 26.774727817135044, 56.115076402454008 ], [ 26.807283970378933, 56.127323717215745 ], [ 26.823251987289382, 56.12951996507428 ], [ 26.836791213243885, 56.129390773865111 ], [ 26.847643263126088, 56.12396474937367 ], [ 26.872292922280508, 56.12722036442824 ], [ 26.888467644765967, 56.128874009927586 ], [ 26.890793083833728, 56.105051174871789 ], [ 26.931100702435458, 56.058697415053643 ], [ 26.968669468121448, 56.060196030922043 ], [ 26.951926303955759, 56.041024074901088 ], [ 26.953631626298488, 56.034306139216937 ], [ 26.958282505333329, 56.027123115539325 ], [ 26.969444613578048, 56.013635566428206 ], [ 26.967739292134581, 56.007847804932226 ], [ 26.932650995147299, 56.003300279584209 ], [ 26.943503045029502, 55.966790880194935 ], [ 26.947120396189291, 55.960072944510728 ], [ 26.955647007003734, 55.950280260025977 ], [ 26.944484897859752, 55.941650296424029 ], [ 26.935596550940033, 55.932193508723401 ], [ 26.954561802285355, 55.927594306532001 ], [ 26.946345248934051, 55.911316230359716 ], [ 26.937818638119609, 55.90387482426371 ], [ 26.934356316590709, 55.892764391063793 ], [ 26.934201287859139, 55.873902493405296 ], [ 26.97797122619113, 55.864213161707994 ], [ 26.980606723621406, 55.855350654109372 ], [ 26.981536899608216, 55.844653632059419 ], [ 26.979986606896375, 55.838917548306199 ], [ 26.97874637164773, 55.827083644694426 ], [ 26.979056430909566, 55.826721910387846 ], [ 26.979425814849435, 55.826290963357224 ], [ 26.957816610000094, 55.81858368000006 ], [ 26.900145711000107, 55.778715312000045 ], [ 26.842784872000038, 55.719339092 ], [ 26.822837769000103, 55.706109925000092 ], [ 26.743049357000132, 55.68285553 ], [ 26.72010502100008, 55.681873678000031 ], [ 26.66687829600005, 55.693965963000025 ], [ 26.64010990400007, 55.695567933000049 ], [ 26.615615275000096, 55.687971497000078 ], [ 26.594531291000067, 55.666990866000063 ] ], [ [ 26.51841105512608, 55.826555912625224 ], [ 26.532466108823826, 55.832177934464085 ], [ 26.556359700739563, 55.837799956302888 ], [ 26.581658797215709, 55.840610967222347 ], [ 26.597119357272504, 55.85326051546042 ], [ 26.601817253763215, 55.873724676752374 ], [ 26.616709831693356, 55.881170965267813 ], [ 26.6249292322982, 55.888861395437004 ], [ 26.631927930929237, 55.897406317347645 ], [ 26.61117441097025, 55.903858709311976 ], [ 26.61679643280911, 55.923535784848582 ], [ 26.612579916429979, 55.94602387130459 ], [ 26.609768905510577, 55.958673419542663 ], [ 26.594919269308832, 55.962130279488804 ], [ 26.54110825823949, 55.92708533342136 ], [ 26.471864215361222, 55.933230279553754 ], [ 26.437917514181891, 55.914618231546115 ], [ 26.449310742796513, 55.90570709850374 ], [ 26.485769076881354, 55.892889715188176 ], [ 26.48748993591181, 55.868721074617895 ], [ 26.490300946831212, 55.85326051546042 ], [ 26.504356000528958, 55.840610967222347 ], [ 26.51841105512608, 55.826555912625224 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-024", "NAME_1": "Dagdas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 28.051100037936408, 56.140665997038127 ], [ 28.023798055000015, 56.12964996400008 ], [ 27.981009969000098, 56.118022767000028 ], [ 27.939668823000147, 56.113061829000074 ], [ 27.927059774000043, 56.109366964000074 ], [ 27.911453491000088, 56.100246074 ], [ 27.901531617000103, 56.089342346000038 ], [ 27.892746622000118, 56.077095032 ], [ 27.880654337000124, 56.063865866000114 ], [ 27.812544800000126, 56.03451365100004 ], [ 27.781228882000107, 56.016375224000015 ], [ 27.776991414000065, 55.99239736 ], [ 27.76006402003836, 55.975416227688804 ], [ 27.724729153427688, 55.99520500250884 ], [ 27.680720178893125, 56.008148818812913 ], [ 27.654832547184299, 56.021092635116986 ], [ 27.641888730880225, 56.015915108595379 ], [ 27.644477494141029, 55.987438713625693 ], [ 27.618589862432202, 55.990027476886496 ], [ 27.571992124636836, 55.997793765769643 ], [ 27.460675306220367, 56.036625214681862 ], [ 27.414077568425, 56.036625214681862 ], [ 27.38560117345537, 56.021092635116986 ], [ 27.367479830629634, 56.023681398377789 ], [ 27.3752461204121, 56.057335319869082 ], [ 27.370068593890494, 56.080634189216426 ], [ 27.315704566312661, 56.080634189216426 ], [ 27.263929301995688, 56.072867899433959 ], [ 27.240630433547665, 56.111699347446915 ], [ 27.307938276530194, 56.124643163750989 ], [ 27.339003435660004, 56.140175742416545 ], [ 27.331237145877537, 56.160885848503085 ], [ 27.300171987647104, 56.181595953690305 ], [ 27.295936313909749, 56.203029690267954 ], [ 27.339086134617389, 56.21026439078895 ], [ 27.412001580608433, 56.207163805365326 ], [ 27.420683221053764, 56.210574449151466 ], [ 27.447865024851012, 56.209385890746205 ], [ 27.44068200027408, 56.223674425534284 ], [ 27.447244907226661, 56.229901434803367 ], [ 27.466933628084462, 56.233467109119772 ], [ 27.488947788009966, 56.235017401831612 ], [ 27.508998244073666, 56.241115220790789 ], [ 27.523570997903221, 56.24824656852428 ], [ 27.528066847307116, 56.257393296963073 ], [ 27.535043166309038, 56.261114000011048 ], [ 27.548220656158321, 56.24824656852428 ], [ 27.551631300843837, 56.245481878985515 ], [ 27.568116081691812, 56.24230377919605 ], [ 27.651573521001183, 56.249745185292056 ], [ 27.667593214755016, 56.240236720748044 ], [ 27.687126905981927, 56.225095527036899 ], [ 27.701854689442371, 56.219488634492848 ], [ 27.722473586286981, 56.20664704052848 ], [ 27.743919305431575, 56.199774075213384 ], [ 27.778490837582069, 56.195639960116011 ], [ 27.810943638038452, 56.196260077740362 ], [ 27.822415806444269, 56.185666409377291 ], [ 27.838435500198159, 56.182307441535158 ], [ 27.852853224396767, 56.181945706329259 ], [ 27.88757978707747, 56.186648261308164 ], [ 27.898483513803114, 56.183237617522025 ], [ 27.913056267632612, 56.18370270371679 ], [ 28.00131961380913, 56.203288071787028 ], [ 28.020904981879369, 56.209644273164656 ], [ 28.031446974298433, 56.214476020252107 ], [ 28.039818556381249, 56.215690416179712 ], [ 28.048035108833176, 56.214398504987003 ], [ 28.052685987868017, 56.211065375566591 ], [ 28.056096632553533, 56.206957098890996 ], [ 28.06126427642522, 56.20354645420548 ], [ 28.0650883322607, 56.203288071787028 ], [ 28.070411003964637, 56.208507392502156 ], [ 28.077542351698128, 56.196725164834447 ], [ 28.06260786266273, 56.182100735060828 ], [ 28.04369428906017, 56.158019518485958 ], [ 28.047259963376575, 56.150888169853147 ], [ 28.050928988681846, 56.14112132379006 ], [ 28.051100037936408, 56.140665997038127 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-047", "NAME_1": "Kraslavas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 27.76006402003836, 55.975416227688804 ], [ 27.74443526200011, 55.959737854000124 ], [ 27.645009806000104, 55.922840881000084 ], [ 27.617156209000115, 55.878554179000062 ], [ 27.610128214000014, 55.830960185000023 ], [ 27.601498251000066, 55.809617819000024 ], [ 27.592713256000081, 55.794244080000041 ], [ 27.564601278000055, 55.792228699000091 ], [ 27.438820842000069, 55.798739929000064 ], [ 27.405851277000124, 55.804346823000103 ], [ 27.374587036000037, 55.814837138000044 ], [ 27.349627319000035, 55.831218567000107 ], [ 27.329163452000074, 55.817575990000094 ], [ 27.282447957000073, 55.791866964000107 ], [ 27.263017619000095, 55.787216085000054 ], [ 27.235525757000033, 55.795846050000094 ], [ 27.173203980000096, 55.825740865000014 ], [ 27.151448201000079, 55.832458802000033 ], [ 27.110778849000042, 55.836282858000075 ], [ 26.981071004000086, 55.826877747000125 ], [ 26.979425814849435, 55.826290963357224 ], [ 26.979056430909566, 55.826721910387846 ], [ 26.97874637164773, 55.827083644694426 ], [ 26.979986606896375, 55.838917548306199 ], [ 26.981536899608216, 55.844653632059419 ], [ 26.980606723621406, 55.855350654109372 ], [ 26.97797122619113, 55.864213161707994 ], [ 26.934201287859139, 55.873902493405296 ], [ 26.934356316590709, 55.892764391063793 ], [ 26.937818638119609, 55.90387482426371 ], [ 26.946345248934051, 55.911316230359716 ], [ 26.954561802285355, 55.927594306532001 ], [ 26.935596550940033, 55.932193508723401 ], [ 26.944484897859752, 55.941650296424029 ], [ 26.955647007003734, 55.950280260025977 ], [ 26.947120396189291, 55.960072944510728 ], [ 26.943503045029502, 55.966790880194935 ], [ 26.932650995147299, 56.003300279584209 ], [ 26.967739292134581, 56.007847804932226 ], [ 26.999875454788366, 55.990027476886496 ], [ 27.041295666062126, 55.982261187104086 ], [ 27.103425983422369, 55.987438713625693 ], [ 27.147434957956932, 55.98484995036489 ], [ 27.194032695752298, 56.010737582073716 ], [ 27.188855169230635, 56.054746556608279 ], [ 27.263929301995688, 56.072867899433959 ], [ 27.315704566312661, 56.080634189216426 ], [ 27.370068593890494, 56.080634189216426 ], [ 27.3752461204121, 56.057335319869082 ], [ 27.367479830629634, 56.023681398377789 ], [ 27.38560117345537, 56.021092635116986 ], [ 27.414077568425, 56.036625214681862 ], [ 27.460675306220367, 56.036625214681862 ], [ 27.571992124636836, 55.997793765769643 ], [ 27.618589862432202, 55.990027476886496 ], [ 27.644477494141029, 55.987438713625693 ], [ 27.641888730880225, 56.015915108595379 ], [ 27.654832547184299, 56.021092635116986 ], [ 27.680720178893125, 56.008148818812913 ], [ 27.724729153427688, 55.99520500250884 ], [ 27.76006402003836, 55.975416227688804 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-066", "NAME_1": "Nicas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 20.971039259000065, 56.259670315000051 ], [ 20.98023522200009, 56.279282945000034 ], [ 20.982676629000082, 56.290757554000038 ], [ 20.982676629000082, 56.301459052000041 ], [ 20.981455925000091, 56.310492255000042 ], [ 20.970957879000082, 56.349839585000041 ], [ 20.968597852000073, 56.369818427000041 ], [ 20.970550977000073, 56.38898346600007 ], [ 20.979014519000089, 56.404364325000074 ], [ 20.992523634000065, 56.417914130000042 ], [ 20.998383009000065, 56.425685940000051 ], [ 21.003184441000087, 56.434800523000035 ], [ 21.005381707000083, 56.445868231000077 ], [ 21.019539950008664, 56.447081045853565 ], [ 21.022017119994075, 56.456989723097195 ], [ 21.02399885526296, 56.4713573046958 ], [ 21.035817904772443, 56.473944403311521 ], [ 21.04468834700009, 56.462103583000044 ], [ 21.030528191000087, 56.448431708000044 ], [ 21.037445509000065, 56.444647528000075 ], [ 21.04468834700009, 56.442206122000073 ], [ 21.04468834700009, 56.427964585000041 ], [ 21.04468834700009, 56.421128648000035 ], [ 21.030528191000087, 56.408107815000051 ], [ 21.053396030000044, 56.389960028000075 ], [ 21.061778191000087, 56.38703034100007 ], [ 21.070160352000073, 56.389349677000041 ], [ 21.077159050000091, 56.395209052000041 ], [ 21.07976321700005, 56.403062242000033 ], [ 21.068614129000082, 56.424058335000041 ], [ 21.066661004000082, 56.441839911000045 ], [ 21.06812584700009, 56.458807684000078 ], [ 21.072113477000073, 56.469549872000073 ], [ 21.067637566000087, 56.476385809000078 ], [ 21.063243035000085, 56.493963934000078 ], [ 21.128274935339959, 56.498784252890914 ], [ 21.147462973037761, 56.430560118554581 ], [ 21.211423098697026, 56.432692123342804 ], [ 21.226347127717759, 56.351675963874584 ], [ 21.179443035867394, 56.355939972551653 ], [ 21.183707044544462, 56.323959909722021 ], [ 21.179443035867394, 56.28771583821532 ], [ 21.16451900684666, 56.264263792739825 ], [ 21.109086897642214, 56.219491704778306 ], [ 21.085634852166663, 56.228019721233125 ], [ 21.083502847378497, 56.191775649726424 ], [ 21.083502847378497, 56.166191600362026 ], [ 21.055786793225934, 56.168323604250929 ], [ 21.034466751639286, 56.266395796628672 ], [ 20.971039259000065, 56.259670315000051 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-LPX", "NAME_1": "Liepāja" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 21.005381707000083, 56.445868231000077 ], [ 21.00554446700005, 56.465521552000041 ], [ 21.010590040000068, 56.475734768000052 ], [ 21.00326582100007, 56.492580471000053 ], [ 21.000498894000089, 56.510646877000056 ], [ 21.006358269000089, 56.519964911000045 ], [ 21.024261915000068, 56.510484117000033 ], [ 21.030528191000087, 56.500148830000057 ], [ 21.035817904772443, 56.473944403311521 ], [ 21.02399885526296, 56.4713573046958 ], [ 21.022017119994075, 56.456989723097195 ], [ 21.019539950008664, 56.447081045853565 ], [ 21.005381707000083, 56.445868231000077 ] ] ], [ [ [ 21.052907747694405, 56.511053778209259 ], [ 21.048106316000087, 56.515611070000034 ], [ 21.030528191000087, 56.524155992000033 ], [ 21.019541863000086, 56.527085679000038 ], [ 21.010508660000085, 56.527777411000045 ], [ 21.003103061000047, 56.530015367000033 ], [ 20.996348504000082, 56.537827867000033 ], [ 20.992198113000086, 56.548895575000074 ], [ 20.995127800000091, 56.55337148600006 ], [ 21.000336134000065, 56.557684637000079 ], [ 21.010508660000085, 56.598700262000079 ], [ 21.020642330455665, 56.615046011826529 ], [ 21.067247716508916, 56.605743150925662 ], [ 21.077412097989907, 56.562825341816051 ], [ 21.093761415756717, 56.568770547622648 ], [ 21.103220320461389, 56.532770547622647 ], [ 21.072706622012959, 56.523284245971126 ], [ 21.052907747694405, 56.511053778209259 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-032", "NAME_1": "Grobinas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.063243035000085, 56.493963934000078 ], [ 21.05836022200009, 56.503648179000038 ], [ 21.052907747694405, 56.511053778209259 ], [ 21.072706622012959, 56.523284245971126 ], [ 21.103220320461389, 56.532770547622647 ], [ 21.093761415756717, 56.568770547622648 ], [ 21.077412097989907, 56.562825341816051 ], [ 21.067247716508916, 56.605743150925662 ], [ 21.020642330455665, 56.615046011826529 ], [ 21.046153190717177, 56.656195380312511 ], [ 21.05791879711478, 56.643760537119078 ], [ 21.121878922774044, 56.63523252066426 ], [ 21.153858985603677, 56.682136612514626 ], [ 21.211423098697026, 56.645892541907244 ], [ 21.258327190547391, 56.656552562250909 ], [ 21.281779236922205, 56.611780474289446 ], [ 21.254063182769642, 56.588328428813895 ], [ 21.256195186658545, 56.530764315720546 ], [ 21.347871366470372, 56.543556340852433 ], [ 21.354267379036287, 56.503048261567983 ], [ 21.384115437977073, 56.490256236436153 ], [ 21.386247441865919, 56.464672186172436 ], [ 21.437415542393353, 56.407108073079087 ], [ 21.416095500806705, 56.353807968662807 ], [ 21.379851429300004, 56.32822391839909 ], [ 21.26259119922446, 56.326091913610924 ], [ 21.226347127717759, 56.351675963874584 ], [ 21.211423098697026, 56.432692123342804 ], [ 21.147462973037761, 56.430560118554581 ], [ 21.128274935339959, 56.498784252890914 ], [ 21.063243035000085, 56.493963934000078 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-071", "NAME_1": "Pavilostas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.046153190717177, 56.656195380312511 ], [ 21.05836022200009, 56.688666083000044 ], [ 21.065196160000085, 56.774318752000056 ], [ 21.061208530000044, 56.794134833000044 ], [ 21.054209832000083, 56.81195709800005 ], [ 21.052744988000086, 56.828924872000073 ], [ 21.065196160000085, 56.84634023600006 ], [ 21.147227410000085, 56.87641022300005 ], [ 21.156748894000089, 56.885565497000073 ], [ 21.222911004000082, 56.907700914000031 ], [ 21.240977410000085, 56.91828034100007 ], [ 21.277598504000082, 56.949123440000051 ], [ 21.287771030000044, 56.955511786000045 ], [ 21.30014082100007, 56.959540106000077 ], [ 21.328187478569248, 56.97362864854324 ], [ 21.331752556635138, 56.97362864854324 ], [ 21.362603386636977, 56.966704007284079 ], [ 21.384772577092747, 56.956523749171652 ], [ 21.39583133344928, 56.942416083335559 ], [ 21.391490512776954, 56.934483750824427 ], [ 21.397226597429494, 56.929393622217844 ], [ 21.406063266606452, 56.923450832889614 ], [ 21.447301060295672, 56.912082018170565 ], [ 21.493396436796104, 56.903813787975935 ], [ 21.473707716837623, 56.887587389546354 ], [ 21.467971633084403, 56.878905748201703 ], [ 21.436449008614829, 56.867588609426775 ], [ 21.439547546282199, 56.83990492277394 ], [ 21.40969948824079, 56.831376905419802 ], [ 21.345739362581526, 56.820716885076138 ], [ 21.320155312317809, 56.807924859944308 ], [ 21.324419320994878, 56.758888763305777 ], [ 21.31589130364074, 56.739700725607975 ], [ 21.292439258165189, 56.756756759416874 ], [ 21.260459195335557, 56.739700725607975 ], [ 21.273251220467444, 56.707720662778343 ], [ 21.288175249488177, 56.682136612514626 ], [ 21.258327190547391, 56.656552562250909 ], [ 21.211423098697026, 56.645892541907244 ], [ 21.153858985603677, 56.682136612514626 ], [ 21.121878922774044, 56.63523252066426 ], [ 21.05791879711478, 56.643760537119078 ], [ 21.046153190717177, 56.656195380312511 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-VEN", "NAME_1": "Ventspils" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.328187478569248, 56.97362864854324 ], [ 21.360118035000085, 56.98969147300005 ], [ 21.38249759200005, 57.008937893000052 ], [ 21.401621941000087, 57.037502346000053 ], [ 21.413584832000083, 57.073187567000048 ], [ 21.414805535000085, 57.113836981000077 ], [ 21.41187584700009, 57.12445709800005 ], [ 21.401052280000044, 57.151312567000048 ], [ 21.403168165000068, 57.162054755000042 ], [ 21.412608269000089, 57.176214911000045 ], [ 21.414805535000085, 57.184881903000075 ], [ 21.412608269000089, 57.250067450000074 ], [ 21.414805535000085, 57.270900783000059 ], [ 21.421397332000083, 57.288723049000055 ], [ 21.433604363000086, 57.306463934000078 ], [ 21.449473504000082, 57.320013739000046 ], [ 21.46656334700009, 57.325506903000075 ], [ 21.48023522200009, 57.333644924000055 ], [ 21.511533772406381, 57.378657806634251 ], [ 21.527651608135216, 57.358248103966787 ], [ 21.541985133307264, 57.340963559620548 ], [ 21.565593292096764, 57.342228281609891 ], [ 21.591730896663535, 57.360777549744114 ], [ 21.626367638655609, 57.35455976751922 ], [ 21.621475510186656, 57.389416618582061 ], [ 21.674789213251586, 57.400881341500678 ], [ 21.642327994241498, 57.45695071840089 ], [ 21.632631786327863, 57.466646927213901 ], [ 21.621669658996623, 57.473236291939322 ], [ 21.699229363000086, 57.55532461100006 ], [ 21.729665561000047, 57.573797919000071 ], [ 21.771657748000052, 57.586127020000049 ], [ 21.955902540000068, 57.592962958000044 ], [ 21.999278191000087, 57.600327867000033 ], [ 22.194509311000047, 57.657619533000059 ], [ 22.206427850165142, 57.626870428927134 ], [ 22.212939081173658, 57.620927638699527 ], [ 22.223791131055862, 57.623149725879102 ], [ 22.235625033768258, 57.619739081193586 ], [ 22.247097202174132, 57.599585273241757 ], [ 22.245391879831345, 57.588319811310214 ], [ 22.250352817228702, 57.576046658126756 ], [ 22.25903445767409, 57.564290269780088 ], [ 22.268491245374662, 57.55545359970381 ], [ 22.272056918791748, 57.549097399225559 ], [ 22.274227329127939, 57.517316393236911 ], [ 22.271901890060178, 57.507239487911988 ], [ 22.203792351835546, 57.483907579271317 ], [ 22.189529657267826, 57.476388657910206 ], [ 22.174491815444924, 57.471892809405574 ], [ 22.177282341606769, 57.465123195978663 ], [ 22.177437372136978, 57.459128729806991 ], [ 22.166688674142961, 57.45101553014257 ], [ 22.137853223947104, 57.437527981031451 ], [ 22.077960239073775, 57.423161932776964 ], [ 22.151650832320058, 57.404610094380303 ], [ 22.186429070944826, 57.401587023322463 ], [ 22.244926791837941, 57.407090563079009 ], [ 22.259573101217654, 57.397945550546694 ], [ 22.276707797826589, 57.387246813489639 ], [ 22.28213382321735, 57.381355699206154 ], [ 22.286009555896271, 57.351150825250329 ], [ 22.286009555896271, 57.334278468976152 ], [ 22.294897901916613, 57.321462714332768 ], [ 22.308850539021137, 57.288854885144815 ], [ 22.304199659986296, 57.286477770132933 ], [ 22.30140913292513, 57.276452542550771 ], [ 22.297068312252804, 57.271129869048195 ], [ 22.273762241134477, 57.265032050089019 ], [ 22.233092889125544, 57.243379625369414 ], [ 22.194025505772458, 57.212373765736686 ], [ 22.188134393287612, 57.198731187893998 ], [ 22.190304802724427, 57.195320543208481 ], [ 22.204102411097381, 57.19082469290521 ], [ 22.206427850165142, 57.177853909530256 ], [ 22.199606560794109, 57.166123358705988 ], [ 22.196350945739539, 57.157545071048162 ], [ 22.195575799383619, 57.153385118428446 ], [ 22.195110711390214, 57.149070136177841 ], [ 22.195265741021103, 57.132094428015421 ], [ 22.194335565034294, 57.128089505026594 ], [ 22.192475213060618, 57.124575507553629 ], [ 22.172734816258753, 57.116565659777336 ], [ 22.095168491232869, 57.101631170741882 ], [ 22.075324740744179, 57.101992905947839 ], [ 22.015276727139224, 57.113723455872787 ], [ 21.996466506324168, 57.107367255394479 ], [ 21.951973096681058, 57.098427232530753 ], [ 21.936573520551519, 57.097238675024812 ], [ 21.86009240114339, 57.099305732573498 ], [ 21.849860467086842, 57.098427232530753 ], [ 21.839938592292185, 57.093001207139991 ], [ 21.82190351693373, 57.085275580203813 ], [ 21.783094516898416, 57.085198065838028 ], [ 21.789502394220108, 57.095274970263631 ], [ 21.789812452582623, 57.099822496510967 ], [ 21.789192335857592, 57.104111640339909 ], [ 21.766971470357078, 57.107057197031963 ], [ 21.711574333988324, 57.116849881516771 ], [ 21.692350702023248, 57.114214383187232 ], [ 21.664083692608301, 57.116307278258262 ], [ 21.653851760350449, 57.116152249526692 ], [ 21.641449415957766, 57.114214383187232 ], [ 21.626256545403237, 57.104059964395788 ], [ 21.593028598590934, 57.087265123386715 ], [ 21.573804965726595, 57.085611476988049 ], [ 21.539026727101771, 57.07057363516509 ], [ 21.506160516394687, 57.075612087827551 ], [ 21.503008254127622, 57.058274645358551 ], [ 21.489210645754667, 57.051014106415835 ], [ 21.484869825981662, 57.028509020075205 ], [ 21.473552687206734, 57.0129544134154 ], [ 21.474947951187005, 56.986444404085944 ], [ 21.472002393595574, 56.971354885419601 ], [ 21.454329054342395, 56.960296129063067 ], [ 21.446680941772001, 56.949650783856555 ], [ 21.39583133344928, 56.942416083335559 ], [ 21.384772577092747, 56.956523749171652 ], [ 21.362603386636977, 56.966704007284079 ], [ 21.331752556635138, 56.97362864854324 ], [ 21.328187478569248, 56.97362864854324 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-VEN", "NAME_1": "Ventspils" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.511533772406381, 57.378657806634251 ], [ 21.517751498000052, 57.387600002000056 ], [ 21.589121941000087, 57.438788153000075 ], [ 21.621669658996623, 57.473236291939322 ], [ 21.632631786327863, 57.466646927213901 ], [ 21.642327994241498, 57.45695071840089 ], [ 21.674789213251586, 57.400881341500678 ], [ 21.621475510186656, 57.389416618582061 ], [ 21.626367638655609, 57.35455976751922 ], [ 21.591730896663535, 57.360777549744114 ], [ 21.565593292096764, 57.342228281609891 ], [ 21.541985133307264, 57.340963559620548 ], [ 21.527651608135216, 57.358248103966787 ], [ 21.511533772406381, 57.378657806634251 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-027", "NAME_1": "Dundagas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 22.194509311000047, 57.657619533000059 ], [ 22.48373457100007, 57.74249909100007 ], [ 22.526133660000085, 57.749660549000055 ], [ 22.549082879000082, 57.75063711100006 ], [ 22.56031334700009, 57.752752997000073 ], [ 22.572601759000065, 57.756822007000039 ], [ 22.585785352000073, 57.759711005000042 ], [ 22.600271030000044, 57.758042710000041 ], [ 22.610362175000091, 57.754624742000033 ], [ 22.610118035000085, 57.753485419000071 ], [ 22.604991082000083, 57.751044012000079 ], [ 22.600271030000044, 57.743841864000046 ], [ 22.590830925000091, 57.706122137000079 ], [ 22.58716881558837, 57.66498444187846 ], [ 22.567978247198312, 57.674198927038844 ], [ 22.570264505502507, 57.617042483823525 ], [ 22.609130886780974, 57.578176102545058 ], [ 22.61141714418585, 57.541595979570786 ], [ 22.625134690413631, 57.502729598292319 ], [ 22.54740192785664, 57.498157082583248 ], [ 22.503963031768478, 57.461576959608976 ], [ 22.476527938413597, 57.413565546912423 ], [ 22.423944010907348, 57.420424320026314 ], [ 22.380505114819186, 57.411279289507604 ], [ 22.34849750665461, 57.411279289507604 ], [ 22.325634929908063, 57.434141866254095 ], [ 22.282196032920581, 57.427283093140204 ], [ 22.259573101217654, 57.397945550546694 ], [ 22.244926791837941, 57.407090563079009 ], [ 22.186429070944826, 57.401587023322463 ], [ 22.151650832320058, 57.404610094380303 ], [ 22.077960239073775, 57.423161932776964 ], [ 22.137853223947104, 57.437527981031451 ], [ 22.166688674142961, 57.45101553014257 ], [ 22.177437372136978, 57.459128729806991 ], [ 22.177282341606769, 57.465123195978663 ], [ 22.174491815444924, 57.471892809405574 ], [ 22.189529657267826, 57.476388657910206 ], [ 22.203792351835546, 57.483907579271317 ], [ 22.271901890060178, 57.507239487911988 ], [ 22.274227329127939, 57.517316393236911 ], [ 22.272056918791748, 57.549097399225559 ], [ 22.268491245374662, 57.55545359970381 ], [ 22.25903445767409, 57.564290269780088 ], [ 22.250352817228702, 57.576046658126756 ], [ 22.245391879831345, 57.588319811310214 ], [ 22.247097202174132, 57.599585273241757 ], [ 22.235625033768258, 57.619739081193586 ], [ 22.223791131055862, 57.623149725879102 ], [ 22.212939081173658, 57.620927638699527 ], [ 22.206427850165142, 57.626870428927134 ], [ 22.194509311000047, 57.657619533000059 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-079", "NAME_1": "Rojas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 22.58716881558837, 57.66498444187846 ], [ 22.590993686000047, 57.644761460000041 ], [ 22.600759311000047, 57.630113023000035 ], [ 22.656097852000073, 57.585760809000078 ], [ 22.878916863000086, 57.481268622000073 ], [ 22.950368686000047, 57.432806708000044 ], [ 22.994593607347898, 57.411893115396275 ], [ 22.949783286869149, 57.402134258988838 ], [ 22.933779482337229, 57.376985423938152 ], [ 22.894913101058762, 57.374699165633956 ], [ 22.846901689261529, 57.388416712761057 ], [ 22.824039111615718, 57.408993032102728 ], [ 22.741733834249032, 57.459290701304781 ], [ 22.705153710375441, 57.43642812455829 ], [ 22.677718617919879, 57.457004443899962 ], [ 22.693722422451799, 57.482153278950648 ], [ 22.625134690413631, 57.502729598292319 ], [ 22.61141714418585, 57.541595979570786 ], [ 22.609130886780974, 57.578176102545058 ], [ 22.570264505502507, 57.617042483823525 ], [ 22.567978247198312, 57.674198927038844 ], [ 22.58716881558837, 57.66498444187846 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-097", "NAME_1": "Talsi" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 22.994593607347898, 57.411893115396275 ], [ 23.031423372590552, 57.394476629792621 ], [ 23.006939729185149, 57.367840392520066 ], [ 22.968073347906682, 57.351836588887465 ], [ 22.920061936109448, 57.333546526950613 ], [ 22.954355801678901, 57.296966403976342 ], [ 23.018371018008054, 57.290107630862451 ], [ 23.054951141881702, 57.283248856849241 ], [ 23.061809914995536, 57.258100022697874 ], [ 23.080379673283289, 57.238470363916122 ], [ 23.039865350005869, 57.210203356299814 ], [ 22.977491896433833, 57.187052313913114 ], [ 22.967259963276661, 57.183538316440149 ], [ 22.948914828656427, 57.167880356992839 ], [ 22.946744419219556, 57.160335598109327 ], [ 22.941473422560364, 57.152454942441636 ], [ 22.930931431040676, 57.144574286773889 ], [ 22.911242710182933, 57.137184557521266 ], [ 22.831299269245847, 57.140078437369937 ], [ 22.80804487497096, 57.136616115841036 ], [ 22.801998731955905, 57.131345120081221 ], [ 22.793265414667133, 57.126022447477965 ], [ 22.76086429195351, 57.112328192791836 ], [ 22.669603713140816, 57.097703762118897 ], [ 22.6415434102002, 57.094732367904442 ], [ 22.649449904289611, 57.041660672402088 ], [ 22.635807326446923, 57.015848294163391 ], [ 22.591417271389957, 57.022385361794989 ], [ 22.559584587658549, 57.008381048746401 ], [ 22.508218215398301, 57.013832913458145 ], [ 22.480002882826739, 57.017760322081187 ], [ 22.412668490958083, 57.014763089445012 ], [ 22.382386101737211, 57.019672349998928 ], [ 22.372619255674067, 57.035769558118602 ], [ 22.362697380879411, 57.042409980336288 ], [ 22.35959679455641, 57.051453355987576 ], [ 22.359286737093214, 57.056465969328997 ], [ 22.363007440141246, 57.078738512572272 ], [ 22.354170770064968, 57.102664700415573 ], [ 22.348899774305096, 57.11010610651158 ], [ 22.327609083892071, 57.120415554034537 ], [ 22.297998488239614, 57.128761297695689 ], [ 22.262755160722065, 57.145013536345573 ], [ 22.249887730134617, 57.155271307924465 ], [ 22.24182620641426, 57.166691800386275 ], [ 22.234694857781449, 57.170541693744156 ], [ 22.206427850165142, 57.177853909530256 ], [ 22.204102411097381, 57.19082469290521 ], [ 22.190304802724427, 57.195320543208481 ], [ 22.188134393287612, 57.198731187893998 ], [ 22.194025505772458, 57.212373765736686 ], [ 22.233092889125544, 57.243379625369414 ], [ 22.273762241134477, 57.265032050089019 ], [ 22.297068312252804, 57.271129869048195 ], [ 22.30140913292513, 57.276452542550771 ], [ 22.304199659986296, 57.286477770132933 ], [ 22.308850539021137, 57.288854885144815 ], [ 22.294897901916613, 57.321462714332768 ], [ 22.286009555896271, 57.334278468976152 ], [ 22.286009555896271, 57.351150825250329 ], [ 22.28213382321735, 57.381355699206154 ], [ 22.276707797826589, 57.387246813489639 ], [ 22.259573101217654, 57.397945550546694 ], [ 22.282196032920581, 57.427283093140204 ], [ 22.325634929908063, 57.434141866254095 ], [ 22.34849750665461, 57.411279289507604 ], [ 22.380505114819186, 57.411279289507604 ], [ 22.423944010907348, 57.420424320026314 ], [ 22.476527938413597, 57.413565546912423 ], [ 22.503963031768478, 57.461576959608976 ], [ 22.54740192785664, 57.498157082583248 ], [ 22.625134690413631, 57.502729598292319 ], [ 22.693722422451799, 57.482153278950648 ], [ 22.677718617919879, 57.457004443899962 ], [ 22.705153710375441, 57.43642812455829 ], [ 22.741733834249032, 57.459290701304781 ], [ 22.824039111615718, 57.408993032102728 ], [ 22.846901689261529, 57.388416712761057 ], [ 22.894913101058762, 57.374699165633956 ], [ 22.933779482337229, 57.376985423938152 ], [ 22.949783286869149, 57.402134258988838 ], [ 22.994593607347898, 57.411893115396275 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-063", "NAME_1": "Mersraga" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.031423372590552, 57.394476629792621 ], [ 23.08334394600007, 57.378241278000075 ], [ 23.117523634000065, 57.373928127000056 ], [ 23.13021894600007, 57.370794989000046 ], [ 23.133148634000065, 57.362982489000046 ], [ 23.133555535000085, 57.353094794000071 ], [ 23.13803144600007, 57.343166408000059 ], [ 23.160151242985478, 57.318606927967323 ], [ 23.128025344294201, 57.312315985894031 ], [ 23.120842318817949, 57.305184638160483 ], [ 23.114641147970588, 57.29335073544803 ], [ 23.112780795996912, 57.265290432507413 ], [ 23.080379673283289, 57.238470363916122 ], [ 23.061809914995536, 57.258100022697874 ], [ 23.054951141881702, 57.283248856849241 ], [ 23.018371018008054, 57.290107630862451 ], [ 22.954355801678901, 57.296966403976342 ], [ 22.920061936109448, 57.333546526950613 ], [ 22.968073347906682, 57.351836588887465 ], [ 23.006939729185149, 57.367840392520066 ], [ 23.031423372590552, 57.394476629792621 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-029", "NAME_1": "Engures" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.160151242985478, 57.318606927967323 ], [ 23.164561394000089, 57.313666083000044 ], [ 23.174571160000085, 57.297349351000037 ], [ 23.182383660000085, 57.27765534100007 ], [ 23.190196160000085, 57.24249909100007 ], [ 23.198741082000083, 57.224188544000071 ], [ 23.213552280000044, 57.21625397300005 ], [ 23.22242272200009, 57.207017320000034 ], [ 23.250498894000089, 57.114447333000044 ], [ 23.260915561000047, 57.098944403000075 ], [ 23.274912957000083, 57.092718817000048 ], [ 23.29265384200005, 57.088934637000079 ], [ 23.340098504000082, 57.058579820000034 ], [ 23.422862175000091, 57.040228583000044 ], [ 23.508555535000085, 57.031236070000034 ], [ 23.52084394600007, 57.025580145000049 ], [ 23.56967207100007, 56.986273505000042 ], [ 23.578603263929494, 56.982092082883298 ], [ 23.575853306185138, 56.980527452280057 ], [ 23.499785597027653, 56.961381333781503 ], [ 23.483817580117204, 56.949650783856555 ], [ 23.473430617329086, 56.943475450531594 ], [ 23.475135938772553, 56.940684923470428 ], [ 23.477151320377118, 56.936473294007271 ], [ 23.442001124852027, 56.926539013064996 ], [ 23.372275396991938, 56.910448460827752 ], [ 23.277519921407247, 56.915811977940393 ], [ 23.200642837696762, 56.930114691439826 ], [ 23.148795501710993, 56.921175495952355 ], [ 23.141644144961276, 56.935478208552468 ], [ 23.177400928709858, 56.955144439164485 ], [ 23.197067159321932, 56.967659313926163 ], [ 23.168461732323067, 56.985537705800482 ], [ 23.177400928709858, 57.012355293162216 ], [ 23.21315771155912, 57.039172880524006 ], [ 23.231036103433382, 57.06599046788574 ], [ 23.204218516071649, 57.105322929109889 ], [ 23.150583341348124, 57.123201320984151 ], [ 23.113038718861787, 57.137504034483584 ], [ 23.10052384410011, 57.155382425458527 ], [ 23.120190075611504, 57.171472978595034 ], [ 23.132704949473805, 57.209017601081371 ], [ 23.129129271098975, 57.242986545192878 ], [ 23.112780795996912, 57.265290432507413 ], [ 23.114641147970588, 57.29335073544803 ], [ 23.120842318817949, 57.305184638160483 ], [ 23.128025344294201, 57.312315985894031 ], [ 23.160151242985478, 57.318606927967323 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-JUR", "NAME_1": "Jurmala" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.578603263929494, 56.982092082883298 ], [ 23.585134311000047, 56.979071356000077 ], [ 23.632009311000047, 56.970933335000041 ], [ 23.695160352000073, 56.967271226000037 ], [ 23.866058790000068, 56.990179755000042 ], [ 23.926931186000047, 57.006333726000037 ], [ 23.92869998531603, 57.005900580047694 ], [ 23.934281040337737, 56.996986396504951 ], [ 23.95445041645354, 56.991383791928399 ], [ 23.937232573024801, 56.973022831038804 ], [ 23.903263628913351, 56.962295795914201 ], [ 23.863931166789882, 56.955144439164485 ], [ 23.801356796578887, 56.9497809220519 ], [ 23.779902726329738, 56.956932278801617 ], [ 23.76738785246738, 56.942629565302184 ], [ 23.706601320994139, 56.931902530177581 ], [ 23.672632376882689, 56.928326851802751 ], [ 23.638663432771182, 56.928326851802751 ], [ 23.613633684147203, 56.931902530177581 ], [ 23.590391775160299, 56.92296333469011 ], [ 23.549271474299076, 56.924751173427865 ], [ 23.492034132569131, 56.934638780455316 ], [ 23.477151320377118, 56.936473294007271 ], [ 23.475135938772553, 56.940684923470428 ], [ 23.473430617329086, 56.943475450531594 ], [ 23.483817580117204, 56.949650783856555 ], [ 23.499785597027653, 56.961381333781503 ], [ 23.575853306185138, 56.980527452280057 ], [ 23.578603263929494, 56.982092082883298 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-RIX", "NAME_1": "Riga" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.926931186000047, 57.006333726000037 ], [ 23.95289147200009, 57.013251044000071 ], [ 23.991221550000091, 57.031236070000034 ], [ 24.009287957000083, 57.045599677000041 ], [ 24.021983269000089, 57.059027411000045 ], [ 24.035655144000089, 57.06899648600006 ], [ 24.074554884000065, 57.074937242000033 ], [ 24.113025617338337, 57.0887232661658 ], [ 24.15168379117398, 57.055587470185571 ], [ 24.162383007569701, 57.052823973147838 ], [ 24.181294385927174, 57.047939358514554 ], [ 24.224444206634814, 57.021636053860789 ], [ 24.249920688988595, 57.012644355052942 ], [ 24.274415316713487, 57.006365668041099 ], [ 24.287902865824606, 56.999880276353622 ], [ 24.302527297396864, 56.99099193033328 ], [ 24.320200636650043, 56.96902944635184 ], [ 24.299064975867907, 56.955541897240721 ], [ 24.258447299803038, 56.946007595174365 ], [ 24.246510044303079, 56.940969143411223 ], [ 24.234676140691306, 56.930401313469815 ], [ 24.236691522295928, 56.904123847237713 ], [ 24.258718295213157, 56.872992254289102 ], [ 24.197004022217811, 56.882058010468768 ], [ 24.155404494222012, 56.902392687372583 ], [ 24.132718539828716, 56.898361925062773 ], [ 24.112254672615052, 56.892625841309496 ], [ 24.104038120163125, 56.883608303180608 ], [ 24.099387241128284, 56.878492337051682 ], [ 24.088146223669241, 56.876134365908229 ], [ 24.070810174250141, 56.872497870880011 ], [ 24.066252713192171, 56.886115998854223 ], [ 24.062128533804753, 56.898439440327877 ], [ 24.040269402610818, 56.9100407990436 ], [ 24.026575147924746, 56.919626777054077 ], [ 24.002390577662993, 56.923709215308008 ], [ 23.97148807081777, 56.933243517374422 ], [ 23.942652622420553, 56.938669541865863 ], [ 23.94916385342907, 56.946782742429605 ], [ 23.988592970189416, 56.964688626578834 ], [ 23.994174025211066, 56.973163561449155 ], [ 24.000995313682779, 56.979261380408332 ], [ 23.992778761230852, 56.984532376168204 ], [ 23.967767367769795, 56.987684638435269 ], [ 23.95445041645354, 56.991383791928399 ], [ 23.934281040337737, 56.996986396504951 ], [ 23.92869998531603, 57.005900580047694 ], [ 23.926931186000047, 57.006333726000037 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-020", "NAME_1": "Carnikavas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.113025617338337, 57.0887232661658 ], [ 24.210785352000073, 57.123724677000041 ], [ 24.219248894000089, 57.138006903000075 ], [ 24.238617384000065, 57.149562893000052 ], [ 24.261241082000083, 57.157456773000035 ], [ 24.278575066000087, 57.161037502000056 ], [ 24.278819207000083, 57.171779690000051 ], [ 24.28874759200005, 57.178900458000044 ], [ 24.312673373000052, 57.188299872000073 ], [ 24.330845177757187, 57.199754558993163 ], [ 24.34880651151127, 57.183827989869826 ], [ 24.341853109933083, 57.162967784235832 ], [ 24.337681068626409, 57.128200776344727 ], [ 24.320992904299089, 57.112903292153192 ], [ 24.26536569077399, 57.098996488996761 ], [ 24.258412289195746, 57.075354923091197 ], [ 24.247286846310885, 57.060057439798982 ], [ 24.23198936301867, 57.072573562819628 ], [ 24.162383007569701, 57.052823973147838 ], [ 24.15168379117398, 57.055587470185571 ], [ 24.113025617338337, 57.0887232661658 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-089", "NAME_1": "Saulkrastu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.330845177757187, 57.199754558993163 ], [ 24.379161004000082, 57.230210679000038 ], [ 24.400645379000082, 57.25812409100007 ], [ 24.408864780000044, 57.298163153000075 ], [ 24.405528191000087, 57.344468492000033 ], [ 24.404836854466101, 57.34807919696572 ], [ 24.40515669092855, 57.347895209296439 ], [ 24.410789421894265, 57.344665431764213 ], [ 24.425568882198149, 57.333968411512956 ], [ 24.429289585246124, 57.328542385222875 ], [ 24.432390170669805, 57.320222479983443 ], [ 24.430219761232991, 57.308388577270989 ], [ 24.426188998923124, 57.298828436782912 ], [ 24.426809115648155, 57.294590968898092 ], [ 24.42789432126591, 57.291387030686906 ], [ 24.45021853955393, 57.295831204146737 ], [ 24.461287311660101, 57.294765899626555 ], [ 24.476749102888789, 57.270050170878676 ], [ 24.48787454577365, 57.238064523259141 ], [ 24.444763455269253, 57.235283162088251 ], [ 24.372448077416834, 57.182437309734041 ], [ 24.34880651151127, 57.183827989869826 ], [ 24.330845177757187, 57.199754558993163 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-054", "NAME_1": "Limbaži" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.404836854466101, 57.34807919696572 ], [ 24.394893257192049, 57.400012509164952 ], [ 24.447544815540766, 57.407727525005271 ], [ 24.486483864738545, 57.416071606719242 ], [ 24.501781348930081, 57.427197049604104 ], [ 24.511516111679214, 57.448057254338778 ], [ 24.558799242590965, 57.452229295645452 ], [ 24.578268768089174, 57.464745418666098 ], [ 24.565752644169152, 57.474480181415231 ], [ 24.549064480741151, 57.489777664707447 ], [ 24.529594956142319, 57.521763312326982 ], [ 24.553236521148506, 57.541232836925872 ], [ 24.49065590604522, 57.544014198096761 ], [ 24.497609307623406, 57.555139640981622 ], [ 24.478139783024574, 57.567655764002268 ], [ 24.460060938561469, 57.564874402831379 ], [ 24.433638012384336, 57.567655764002268 ], [ 24.43502869252012, 57.588515968736942 ], [ 24.423903249635259, 57.589906648872727 ], [ 24.426684610806149, 57.620501616356478 ], [ 24.4183405281928, 57.670566109338438 ], [ 24.515688152086511, 57.678910191052466 ], [ 24.54072039812786, 57.666394068031764 ], [ 24.564361964033424, 57.673347469610007 ], [ 24.558799242590965, 57.688644953801543 ], [ 24.562971283897639, 57.717849240250189 ], [ 24.608863735572925, 57.715067879978676 ], [ 24.599128972823792, 57.752616249040614 ], [ 24.649193464906489, 57.770695093503718 ], [ 24.692304555410885, 57.760960331653962 ], [ 24.707602039602421, 57.749834888769101 ], [ 24.747931768935985, 57.731756044305996 ], [ 24.799386942053729, 57.733146724441724 ], [ 24.828591229401695, 57.719239921285293 ], [ 24.824419188095021, 57.699770395787084 ], [ 24.831372589673265, 57.666394068031764 ], [ 24.892562524640766, 57.652487264875333 ], [ 24.881437081755905, 57.624673657663152 ], [ 24.88004640162012, 57.582953247294483 ], [ 24.894945916021186, 57.567158312106415 ], [ 24.916184929590827, 57.555789496488046 ], [ 24.9329797705999, 57.55643545253406 ], [ 24.984346143759524, 57.563902696152468 ], [ 25.004344923879103, 57.562197373809738 ], [ 25.022328322394173, 57.555298570072921 ], [ 25.046409538969044, 57.535351467696046 ], [ 25.051370477265721, 57.524499416914523 ], [ 25.051370477265721, 57.518349921111962 ], [ 25.047029656593338, 57.51576610052507 ], [ 25.047804802949258, 57.514086615704741 ], [ 25.053850945964371, 57.511761175737661 ], [ 25.066718376551819, 57.51269135172447 ], [ 25.080826043287232, 57.510830999750794 ], [ 25.087078891877354, 57.507239487911988 ], [ 25.087802362289153, 57.503725491338344 ], [ 25.079585808937907, 57.500211493865322 ], [ 25.061912468785408, 57.498221951581797 ], [ 25.05323082923934, 57.491839911782449 ], [ 25.045634392613124, 57.482796536131218 ], [ 25.01256147633103, 57.476104437969411 ], [ 25.002949659898889, 57.467500311889864 ], [ 24.988841994062739, 57.461299140143183 ], [ 24.980315383248296, 57.452875882116246 ], [ 24.886884393200148, 57.420888170552587 ], [ 24.875877312787736, 57.41303335240724 ], [ 24.84668012918462, 57.412206529207936 ], [ 24.812677036016396, 57.419027818578911 ], [ 24.799499546167112, 57.417115789761851 ], [ 24.799964634160517, 57.411431382852015 ], [ 24.83164228736166, 57.395515041885631 ], [ 24.750713130106874, 57.396602082120353 ], [ 24.747931768935985, 57.410508885276784 ], [ 24.688132515003531, 57.389648680542166 ], [ 24.702039318159962, 57.349318950309282 ], [ 24.683960473696914, 57.328458745574608 ], [ 24.636677341885786, 57.320114662961316 ], [ 24.647802784770704, 57.300645138362427 ], [ 24.685351153832642, 57.286738335205996 ], [ 24.706211359466636, 57.242236563666438 ], [ 24.71309655106495, 57.227049872353689 ], [ 24.681573928394073, 57.223070786887263 ], [ 24.643281691396908, 57.237178452723413 ], [ 24.622146029715509, 57.265574653347528 ], [ 24.601527133770162, 57.278984687193542 ], [ 24.589124790276855, 57.285340888571113 ], [ 24.578066033920322, 57.28875153325663 ], [ 24.575430535590726, 57.29087026585006 ], [ 24.573725213247997, 57.295727851359231 ], [ 24.566283807151933, 57.310042222770335 ], [ 24.550005730979706, 57.316346747304522 ], [ 24.472232700378811, 57.293712469754666 ], [ 24.461287311660101, 57.294765899626555 ], [ 24.45021853955393, 57.295831204146737 ], [ 24.42789432126591, 57.291387030686906 ], [ 24.426809115648155, 57.294590968898092 ], [ 24.426188998923124, 57.298828436782912 ], [ 24.430219761232991, 57.308388577270989 ], [ 24.432390170669805, 57.320222479983443 ], [ 24.429289585246124, 57.328542385222875 ], [ 24.425568882198149, 57.333968411512956 ], [ 24.410789421894265, 57.344665431764213 ], [ 24.40515669092855, 57.347895209296439 ], [ 24.404836854466101, 57.34807919696572 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-094", "NAME_1": "Smiltenes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.311500278215249, 57.499332993822577 ], [ 26.311035191121164, 57.469774075013504 ], [ 26.325969679257298, 57.467603665576689 ], [ 26.312740512564574, 57.458663641813587 ], [ 26.304523960112647, 57.455356349915576 ], [ 26.296152378029831, 57.450007839789919 ], [ 26.293516879700235, 57.442695624003818 ], [ 26.300803257064615, 57.438974920955786 ], [ 26.308554722422457, 57.436158556372277 ], [ 26.315065951632334, 57.433135484415061 ], [ 26.318941685210575, 57.429001370217009 ], [ 26.320491977922416, 57.423782050401257 ], [ 26.315065951632334, 57.418097643491421 ], [ 26.312740512564574, 57.409726061408605 ], [ 26.309794955872519, 57.402207140047437 ], [ 26.302818637769917, 57.396135159509981 ], [ 26.299097934721885, 57.389468898870575 ], [ 26.301423373789646, 57.379831244915977 ], [ 26.302043491413997, 57.374844469096956 ], [ 26.286230503235117, 57.365826930968069 ], [ 26.277548861890466, 57.364715887827913 ], [ 26.276153598809515, 57.331022853921525 ], [ 26.277083774796324, 57.322961331100544 ], [ 26.280339389850951, 57.317871202493961 ], [ 26.27568851081611, 57.308336900427605 ], [ 26.264991488766157, 57.300947171174982 ], [ 26.266645135164822, 57.288854885144815 ], [ 26.261994256129981, 57.281930243885597 ], [ 26.130271029984044, 57.276478380073172 ], [ 26.101280551955881, 57.278157863994181 ], [ 26.075804071400739, 57.274127102583691 ], [ 26.058595819241646, 57.265290432507413 ], [ 26.043713006150313, 57.279966539124473 ], [ 26.027848342027369, 57.281646023045482 ], [ 26.012965528935979, 57.28782135726982 ], [ 25.991726515366395, 57.290017605128355 ], [ 25.910697869710873, 57.286736152551384 ], [ 25.904186638702413, 57.288441473994794 ], [ 25.891319207215645, 57.288312282785569 ], [ 25.880312126803176, 57.286296902080323 ], [ 25.769871138342353, 57.278712291539023 ], [ 25.754273309365715, 57.277641100056712 ], [ 25.745126580926922, 57.275108954514621 ], [ 25.736910027575675, 57.284669094103378 ], [ 25.733034294896754, 57.296606350502657 ], [ 25.738770378650031, 57.313065293828231 ], [ 25.736599969213216, 57.319395656784081 ], [ 25.740165642630302, 57.326423651730124 ], [ 25.753343133378905, 57.329679266784694 ], [ 25.751637811036119, 57.337689114560987 ], [ 25.722182245014551, 57.361305244041773 ], [ 25.704922316012073, 57.383784491960682 ], [ 25.713965691663304, 57.400992744119833 ], [ 25.667095167907632, 57.452514146910346 ], [ 25.657948438569576, 57.464606432041194 ], [ 25.675776808353021, 57.472719631705615 ], [ 25.680117629025347, 57.479592597020712 ], [ 25.718404072589863, 57.496556342401277 ], [ 25.776334139608821, 57.499687698128753 ], [ 25.835206685340211, 57.493516211204167 ], [ 25.896254182984137, 57.486190510983249 ], [ 25.935324581764007, 57.476422911288296 ], [ 25.959743581001419, 57.495958110678259 ], [ 25.959743581001419, 57.515493310068166 ], [ 25.945092181458961, 57.530144709610624 ], [ 25.97683688001797, 57.549679909000588 ], [ 26.050093877730262, 57.559447508695541 ], [ 26.094048076357637, 57.559447508695541 ], [ 26.123350875442554, 57.569215108390495 ], [ 26.155095574001507, 57.547238009526495 ], [ 26.184398373086424, 57.547238009526495 ], [ 26.240562070882845, 57.54235420967899 ], [ 26.24544587073035, 57.522819010289084 ], [ 26.282074370036128, 57.525260909763119 ], [ 26.301609569426091, 57.527702810136532 ], [ 26.311500278215249, 57.499332993822577 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-015", "NAME_1": "Balvu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 27.354899122796269, 57.284772446890884 ], [ 27.406265496855156, 57.263068346227158 ], [ 27.46073245633778, 57.274178779427075 ], [ 27.487087436935667, 57.273868720165297 ], [ 27.446236007285904, 57.243979191686321 ], [ 27.425730335986202, 57.212081481575069 ], [ 27.402946257463782, 57.159678099264852 ], [ 27.455349638874736, 57.114109941320692 ], [ 27.514588244651748, 57.079933823087458 ], [ 27.541929139418244, 57.07765541496542 ], [ 27.553321179129114, 57.038922480488054 ], [ 27.589775705484385, 57.04347929673213 ], [ 27.630787048083789, 57.038922480488054 ], [ 27.637622271550583, 57.018416809188352 ], [ 27.664963166317079, 56.988797506299875 ], [ 27.612559784006805, 56.984240690955119 ], [ 27.519145059996504, 56.954621388066585 ], [ 27.537372323174168, 56.934115716766883 ], [ 27.494082573352046, 56.91361004546718 ], [ 27.443957599163866, 56.915888453589218 ], [ 27.41661670439737, 56.902218005756311 ], [ 27.434843967575034, 56.883990742578703 ], [ 27.446701919957604, 56.852663522803311 ], [ 27.427814568787312, 56.85125885731037 ], [ 27.412156610239379, 56.84531606708282 ], [ 27.395723504436148, 56.835962633069016 ], [ 27.390917595770418, 56.831906033236805 ], [ 27.394948358080228, 56.828030301457204 ], [ 27.38342451283097, 56.821364040817798 ], [ 27.376603224359314, 56.820614731984278 ], [ 27.371332227700123, 56.822009995964493 ], [ 27.368696730269846, 56.824464627140799 ], [ 27.362495557623845, 56.824593818350024 ], [ 27.355209181158784, 56.821648260758593 ], [ 27.348077834324556, 56.815137031548716 ], [ 27.348387891787752, 56.807204698138264 ], [ 27.344822219269986, 56.801597804694893 ], [ 27.347922803794347, 56.784312039069334 ], [ 27.339861280973309, 56.782684231092389 ], [ 27.243174675870591, 56.789195462100849 ], [ 27.186072218957747, 56.793794664292307 ], [ 27.160750767134175, 56.81136465075798 ], [ 27.133155552186963, 56.808212389390235 ], [ 27.121373325418631, 56.81061534282378 ], [ 27.095586785601654, 56.80924591726523 ], [ 27.067526482661037, 56.805318509541564 ], [ 27.057914666228839, 56.800357571244888 ], [ 27.032283156042809, 56.801339423175818 ], [ 27.017555372582365, 56.806507066148129 ], [ 26.984017368306866, 56.805938626266538 ], [ 26.966188999422741, 56.809555976527065 ], [ 26.928465204105862, 56.831105048459165 ], [ 26.94401980986629, 56.840251776897958 ], [ 26.953324130104477, 56.846677123550364 ], [ 26.980761753252295, 56.865624905564914 ], [ 26.983707309944407, 56.870792548537281 ], [ 26.985102573025301, 56.878233953733968 ], [ 27.03612258399005, 56.883990742578703 ], [ 27.083969150056191, 56.874877110989871 ], [ 27.165991835254999, 56.861206664056283 ], [ 27.200167953488233, 56.861206664056283 ], [ 27.225230440132691, 56.895382782289516 ], [ 27.266241782732095, 56.915888453589218 ], [ 27.291304269376496, 56.927280493300088 ], [ 27.332315611975901, 56.93639412488892 ], [ 27.314088348798236, 56.979683874711043 ], [ 27.28674745403174, 56.972848651244249 ], [ 27.261684966488019, 56.972848651244249 ], [ 27.254849743021225, 56.993354322543951 ], [ 27.289025862153778, 57.000189546010688 ], [ 27.314088348798236, 57.025252032655146 ], [ 27.325480388509106, 57.061706559909794 ], [ 27.304974717209404, 57.06626337525455 ], [ 27.270798598076794, 57.063984967132512 ], [ 27.197889545366195, 57.07765541496542 ], [ 27.147764571178016, 57.08904745467629 ], [ 27.118145269188801, 57.084490638432214 ], [ 27.097639597889099, 57.091325861898952 ], [ 27.097639597889099, 57.114109941320692 ], [ 27.049793031822958, 57.111831533198654 ], [ 27.008103809043519, 57.114503838081646 ], [ 27.065046013962331, 57.155736395917927 ], [ 27.091245964929328, 57.170102444172414 ], [ 27.130209994595532, 57.199635525459087 ], [ 27.156564976092739, 57.226378078785274 ], [ 27.184366895715641, 57.228109239549724 ], [ 27.20111005988133, 57.234801336812211 ], [ 27.220488722376615, 57.23438792656151 ], [ 27.228911981302872, 57.238987127853648 ], [ 27.234182977062744, 57.242811183689128 ], [ 27.24100426643372, 57.246428534848974 ], [ 27.248135614167268, 57.248960680391065 ], [ 27.275885857846049, 57.246686917267368 ], [ 27.326011996656291, 57.277434394481702 ], [ 27.354899122796269, 57.284772446890884 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-096", "NAME_1": "Strencu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.729363815387728, 57.570143184460392 ], [ 25.710575685519473, 57.576405894116704 ], [ 25.724666782246175, 57.588931313429327 ], [ 25.707444330691317, 57.603022411055406 ], [ 25.694918910479316, 57.61554783036803 ], [ 25.66360536129838, 57.618679186095505 ], [ 25.630726133803989, 57.62024486350964 ], [ 25.591234165224535, 57.614106350227871 ], [ 25.571022764688848, 57.619461199674618 ], [ 25.533304885112329, 57.629454251312609 ], [ 25.509895461206554, 57.646197415478298 ], [ 25.530204298789329, 57.659064846065746 ], [ 25.600978262037131, 57.668780865144811 ], [ 25.600978262037131, 57.696963059497591 ], [ 25.611938004835054, 57.707922801396137 ], [ 25.621332069319521, 57.718882544194059 ], [ 25.67143374836877, 57.720448221608137 ], [ 25.688656200823004, 57.737670674062315 ], [ 25.735088788017151, 57.730380503357537 ], [ 25.847416184509314, 57.752357602221537 ], [ 25.82788098511935, 57.705961504120069 ], [ 25.857183784204267, 57.703519603746713 ], [ 25.859625684577679, 57.68398440435675 ], [ 25.989046380086336, 57.671774905187704 ], [ 25.979278780391382, 57.649797805424328 ], [ 25.959743581001419, 57.620495006339468 ], [ 25.932882681390595, 57.608285507170365 ], [ 25.876718983594174, 57.603401707322917 ], [ 25.901137982831642, 57.588750307780458 ], [ 25.903579882305678, 57.569215108390495 ], [ 25.888928482763276, 57.549679909000588 ], [ 25.896254182984137, 57.530144709610624 ], [ 25.945092181458961, 57.530144709610624 ], [ 25.959743581001419, 57.515493310068166 ], [ 25.959743581001419, 57.495958110678259 ], [ 25.935324581764007, 57.476422911288296 ], [ 25.896254182984137, 57.486190510983249 ], [ 25.835206685340211, 57.493516211204167 ], [ 25.776334139608821, 57.499687698128753 ], [ 25.821738785516516, 57.524738537653377 ], [ 25.809213366203892, 57.537263956966001 ], [ 25.779006690006725, 57.529797199880818 ], [ 25.743454912114487, 57.534132602137845 ], [ 25.734060847630019, 57.546658022349845 ], [ 25.771637106467267, 57.548223699763923 ], [ 25.78259684926519, 57.552920732006157 ], [ 25.752848977498275, 57.570143184460392 ], [ 25.729363815387728, 57.570143184460392 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-017", "NAME_1": "Beverinas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.630726133803989, 57.62024486350964 ], [ 25.66360536129838, 57.618679186095505 ], [ 25.694918910479316, 57.61554783036803 ], [ 25.707444330691317, 57.603022411055406 ], [ 25.724666782246175, 57.588931313429327 ], [ 25.710575685519473, 57.576405894116704 ], [ 25.729363815387728, 57.570143184460392 ], [ 25.752848977498275, 57.570143184460392 ], [ 25.78259684926519, 57.552920732006157 ], [ 25.771637106467267, 57.548223699763923 ], [ 25.734060847630019, 57.546658022349845 ], [ 25.743454912114487, 57.534132602137845 ], [ 25.779006690006725, 57.529797199880818 ], [ 25.809213366203892, 57.537263956966001 ], [ 25.821738785516516, 57.524738537653377 ], [ 25.776334139608821, 57.499687698128753 ], [ 25.718404072589863, 57.496556342401277 ], [ 25.680117629025347, 57.479592597020712 ], [ 25.675776808353021, 57.472719631705615 ], [ 25.657948438569576, 57.464606432041194 ], [ 25.602396275267893, 57.468637193451684 ], [ 25.561106804735232, 57.45101553014257 ], [ 25.547619255624113, 57.441558743341318 ], [ 25.526793654103813, 57.438199775499186 ], [ 25.519352248007806, 57.441248684079483 ], [ 25.509430373213149, 57.447010607153743 ], [ 25.500438674405302, 57.450137030999144 ], [ 25.474497104957436, 57.442540595272249 ], [ 25.420960320562301, 57.447449855826164 ], [ 25.398791131005851, 57.441248684079483 ], [ 25.392743157870427, 57.465242793220284 ], [ 25.378652061143669, 57.484030923088596 ], [ 25.377086383729591, 57.509081762613221 ], [ 25.395874512698583, 57.509081762613221 ], [ 25.431885095021073, 57.505950407785065 ], [ 25.452238902303463, 57.515344472269533 ], [ 25.456935934545697, 57.537263956966001 ], [ 25.480421096656244, 57.548223699763923 ], [ 25.507037613594946, 57.567011828732859 ], [ 25.536785485361861, 57.584234281187094 ], [ 25.569664712856195, 57.592062668257483 ], [ 25.591234165224535, 57.614106350227871 ], [ 25.630726133803989, 57.62024486350964 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-019", "NAME_1": "Burtnieku" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.552890252283305, 57.792390041766964 ], [ 25.564827507783264, 57.782649034125598 ], [ 25.596281229794897, 57.773681255485542 ], [ 25.616635037077288, 57.758024480445386 ], [ 25.660474006470224, 57.750196093374996 ], [ 25.688656200823004, 57.737670674062315 ], [ 25.67143374836877, 57.720448221608137 ], [ 25.621332069319521, 57.718882544194059 ], [ 25.611938004835054, 57.707922801396137 ], [ 25.600978262037131, 57.696963059497591 ], [ 25.600978262037131, 57.668780865144811 ], [ 25.530204298789329, 57.659064846065746 ], [ 25.509895461206554, 57.646197415478298 ], [ 25.533304885112329, 57.629454251312609 ], [ 25.571022764688848, 57.619461199674618 ], [ 25.591234165224535, 57.614106350227871 ], [ 25.569664712856195, 57.592062668257483 ], [ 25.536785485361861, 57.584234281187094 ], [ 25.507037613594946, 57.567011828732859 ], [ 25.480421096656244, 57.548223699763923 ], [ 25.456935934545697, 57.537263956966001 ], [ 25.43971348209152, 57.556052086834313 ], [ 25.41153128773874, 57.556052086834313 ], [ 25.378652061143669, 57.549789377178001 ], [ 25.352035544204966, 57.567011828732859 ], [ 25.31289360705432, 57.585799958601172 ], [ 25.278448702145852, 57.593628346570881 ], [ 25.269054637661384, 57.61554783036803 ], [ 25.231478377924759, 57.639032992478576 ], [ 25.225215668268447, 57.64842705786242 ], [ 25.198599151329745, 57.654689767518732 ], [ 25.189205086845277, 57.673477897387045 ], [ 25.156325859350886, 57.662518154589122 ], [ 25.121880955341794, 57.653124090104654 ], [ 25.093745150718121, 57.653122056737516 ], [ 25.085321892691184, 57.674619452725551 ], [ 25.092453241323994, 57.688236192146519 ], [ 25.082221307267503, 57.696891995069507 ], [ 25.075710077158305, 57.705935370720738 ], [ 25.07617516425239, 57.714513658378621 ], [ 25.080205925662938, 57.721231594062772 ], [ 25.087182244664859, 57.727174384290379 ], [ 25.090902947712834, 57.73125682254431 ], [ 25.098706089014797, 57.736011054366656 ], [ 25.083616571247774, 57.75414948251256 ], [ 25.077260369870146, 57.767171942730954 ], [ 25.017469133393774, 57.796470091421554 ], [ 25.034203016555978, 57.814388870050266 ], [ 25.06081953349468, 57.812823192636188 ], [ 25.092133083574936, 57.812823192636188 ], [ 25.112486889958006, 57.800297772424244 ], [ 25.128143664998106, 57.798732095010166 ], [ 25.13284069724034, 57.808126160393954 ], [ 25.123446632755872, 57.826914289362946 ], [ 25.112486889958006, 57.837874032160812 ], [ 25.142234762624184, 57.844136741817181 ], [ 25.157891536764964, 57.833176999918578 ], [ 25.223649990854369, 57.804994804666478 ], [ 25.245569475550838, 57.800297772424244 ], [ 25.267488960247306, 57.79560074018201 ], [ 25.270620315075462, 57.778378287727776 ], [ 25.31289360705432, 57.78307532086933 ], [ 25.378652061143669, 57.787772353111563 ], [ 25.455370257131619, 57.789338030525641 ], [ 25.494512194282322, 57.789338030525641 ], [ 25.552890252283305, 57.792390041766964 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-045", "NAME_1": "Kocenu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.916184929590827, 57.555789496488046 ], [ 24.894945916021186, 57.567158312106415 ], [ 24.88004640162012, 57.582953247294483 ], [ 24.881437081755905, 57.624673657663152 ], [ 24.93453006421106, 57.612039293578505 ], [ 24.966311069300389, 57.628420722538294 ], [ 24.991477492392335, 57.636482246258652 ], [ 25.000159132837666, 57.635862127734981 ], [ 25.005740186960054, 57.636120510153376 ], [ 25.019072707339546, 57.638135890858621 ], [ 25.024033643837583, 57.637360745402077 ], [ 25.027599318153989, 57.634260159079076 ], [ 25.03302534444407, 57.630177720825145 ], [ 25.042378777558497, 57.625836900152819 ], [ 25.061602411322212, 57.623950711556063 ], [ 25.067803582169574, 57.626457017777113 ], [ 25.084701775966153, 57.629764308775805 ], [ 25.083306511985938, 57.63410513034745 ], [ 25.075865105889932, 57.638704332538907 ], [ 25.063307732765622, 57.648109443396095 ], [ 25.062222528047187, 57.65239858722498 ], [ 25.067028435813654, 57.654982407811815 ], [ 25.093745150718121, 57.653122056737516 ], [ 25.121880955341794, 57.653124090104654 ], [ 25.156325859350886, 57.662518154589122 ], [ 25.189205086845277, 57.673477897387045 ], [ 25.198599151329745, 57.654689767518732 ], [ 25.225215668268447, 57.64842705786242 ], [ 25.231478377924759, 57.639032992478576 ], [ 25.269054637661384, 57.61554783036803 ], [ 25.278448702145852, 57.593628346570881 ], [ 25.31289360705432, 57.585799958601172 ], [ 25.352035544204966, 57.567011828732859 ], [ 25.378652061143669, 57.549789377178001 ], [ 25.372389350588037, 57.527869892481533 ], [ 25.377086383729591, 57.509081762613221 ], [ 25.378652061143669, 57.484030923088596 ], [ 25.392743157870427, 57.465242793220284 ], [ 25.398791131005851, 57.441248684079483 ], [ 25.404682245289393, 57.434995836388737 ], [ 25.402511834053882, 57.433548896464345 ], [ 25.391814812903249, 57.428045355808479 ], [ 25.398636102274281, 57.4111213244895 ], [ 25.397085808663121, 57.404532579115198 ], [ 25.392900017621685, 57.398202216159348 ], [ 25.39321007688352, 57.39068329479818 ], [ 25.386853874606629, 57.386058255084379 ], [ 25.35734663264094, 57.385076402254128 ], [ 25.348975050558124, 57.388900458089665 ], [ 25.334867384722031, 57.397323717015922 ], [ 25.328976271337808, 57.403447374396762 ], [ 25.322775098691807, 57.405488593523728 ], [ 25.301174350815643, 57.403679918393493 ], [ 25.272803988613191, 57.404920151843498 ], [ 25.238180779619256, 57.415048733112542 ], [ 25.21074059430299, 57.416650703567086 ], [ 25.196891309985972, 57.421844184061797 ], [ 25.184643996123498, 57.430086574935444 ], [ 25.159684278606562, 57.448250841503125 ], [ 25.140563999428991, 57.461764228136587 ], [ 25.140874057791507, 57.475019233250976 ], [ 25.123045688907382, 57.49494049720613 ], [ 25.097775913027931, 57.487964179103528 ], [ 25.079585808937907, 57.500211493865322 ], [ 25.087802362289153, 57.503725491338344 ], [ 25.087078891877354, 57.507239487911988 ], [ 25.080826043287232, 57.510830999750794 ], [ 25.066718376551819, 57.51269135172447 ], [ 25.053850945964371, 57.511761175737661 ], [ 25.047804802949258, 57.514086615704741 ], [ 25.047029656593338, 57.51576610052507 ], [ 25.051370477265721, 57.518349921111962 ], [ 25.051370477265721, 57.524499416914523 ], [ 25.046409538969044, 57.535351467696046 ], [ 25.022328322394173, 57.555298570072921 ], [ 25.004344923879103, 57.562197373809738 ], [ 24.984346143759524, 57.563902696152468 ], [ 24.9329797705999, 57.55643545253406 ], [ 24.916184929590827, 57.555789496488046 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-REZ", "NAME_1": "Rezeknes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.928465204105862, 56.831105048459165 ], [ 26.966188999422741, 56.809555976527065 ], [ 26.984017368306866, 56.805938626266538 ], [ 27.017555372582365, 56.806507066148129 ], [ 27.032283156042809, 56.801339423175818 ], [ 27.057914666228839, 56.800357571244888 ], [ 27.067526482661037, 56.805318509541564 ], [ 27.095586785601654, 56.80924591726523 ], [ 27.121373325418631, 56.81061534282378 ], [ 27.133155552186963, 56.808212389390235 ], [ 27.160750767134175, 56.81136465075798 ], [ 27.186072218957747, 56.793794664292307 ], [ 27.243174675870591, 56.789195462100849 ], [ 27.339861280973309, 56.782684231092389 ], [ 27.403722515381787, 56.784777781769208 ], [ 27.45549777969876, 56.771833965465134 ], [ 27.471030359263636, 56.740768807234645 ], [ 27.486312289680427, 56.693387356141557 ], [ 27.480266147564635, 56.680829983017247 ], [ 27.470344272769978, 56.674215400120602 ], [ 27.472049595112708, 56.663259996551574 ], [ 27.476390414885714, 56.658454087885843 ], [ 27.488017612023157, 56.653312283335197 ], [ 27.501815220396111, 56.655766912712807 ], [ 27.512408887859863, 56.654836738524637 ], [ 27.524811232252546, 56.6517878281457 ], [ 27.541554396418235, 56.645069892461549 ], [ 27.551631300843837, 56.636749986322798 ], [ 27.58020836772198, 56.619438382275519 ], [ 27.561449822851046, 56.599646307730893 ], [ 27.56113976358921, 56.575926826361922 ], [ 27.574317254337814, 56.556961575016658 ], [ 27.566565789879292, 56.541717026719368 ], [ 27.551166212850433, 56.535102443822723 ], [ 27.538453810095234, 56.53153677040558 ], [ 27.525121290615061, 56.529288844804341 ], [ 27.506827833737532, 56.52807444887668 ], [ 27.493753695776434, 56.520865586777404 ], [ 27.486777377673832, 56.514896959027396 ], [ 27.486002232217231, 56.508850816012341 ], [ 27.487087436935667, 56.499497381998538 ], [ 27.495459019018483, 56.488025214492041 ], [ 27.49638919410603, 56.477922472544037 ], [ 27.508688184811888, 56.460171617126377 ], [ 27.549925977601788, 56.478568426791412 ], [ 27.55938276530236, 56.464460760955319 ], [ 27.559692823664875, 56.457096870124417 ], [ 27.571681756008218, 56.442808336235714 ], [ 27.581603630802874, 56.433609930953537 ], [ 27.589665155422551, 56.428313096771944 ], [ 27.592145623221938, 56.424385688148959 ], [ 27.591060417604183, 56.421827704185148 ], [ 27.596486443894264, 56.418985501179918 ], [ 27.60253258601, 56.418572089130578 ], [ 27.607958612300081, 56.420484117048318 ], [ 27.62180789571778, 56.420690823522648 ], [ 27.620412631737565, 56.407151598467465 ], [ 27.623978306053971, 56.401079617030689 ], [ 27.62242801334213, 56.392475490951142 ], [ 27.640411410957825, 56.378781236265013 ], [ 27.670383741816238, 56.371804918162411 ], [ 27.689917433043092, 56.360616969697389 ], [ 27.689607374680577, 56.354700018790822 ], [ 27.687591993975332, 56.347258612694816 ], [ 27.690227492304928, 56.332375800502746 ], [ 27.698909132750259, 56.321988836815365 ], [ 27.711001417881107, 56.311136786933162 ], [ 27.715497267285059, 56.298476061021347 ], [ 27.686816846720092, 56.276306871464897 ], [ 27.686816846720092, 56.262870999197219 ], [ 27.694258253715418, 56.260752264805149 ], [ 27.698909132750259, 56.258065091430808 ], [ 27.700459426361419, 56.255016181051872 ], [ 27.692552931372688, 56.249822700557161 ], [ 27.683561231665465, 56.24726471569403 ], [ 27.667593214755016, 56.240236720748044 ], [ 27.651573521001183, 56.249745185292056 ], [ 27.568116081691812, 56.24230377919605 ], [ 27.551631300843837, 56.245481878985515 ], [ 27.548220656158321, 56.24824656852428 ], [ 27.535043166309038, 56.261114000011048 ], [ 27.528066847307116, 56.257393296963073 ], [ 27.523570997903221, 56.24824656852428 ], [ 27.508998244073666, 56.241115220790789 ], [ 27.488947788009966, 56.235017401831612 ], [ 27.466933628084462, 56.233467109119772 ], [ 27.447244907226661, 56.229901434803367 ], [ 27.44068200027408, 56.223674425534284 ], [ 27.447865024851012, 56.209385890746205 ], [ 27.420683221053764, 56.210574449151466 ], [ 27.412001580608433, 56.207163805365326 ], [ 27.339086134617389, 56.21026439078895 ], [ 27.295936313909749, 56.203029690267954 ], [ 27.173049757840033, 56.208300686027826 ], [ 27.162301059846016, 56.210781154726476 ], [ 27.150828892339518, 56.208429877236995 ], [ 27.125869174822526, 56.195846665691022 ], [ 27.102408074972686, 56.18907705316343 ], [ 27.099617547012144, 56.18638987888977 ], [ 27.097602166306899, 56.181997382273323 ], [ 27.09822228393125, 56.179568590418114 ], [ 27.101632927717446, 56.17075775786418 ], [ 27.07760338708664, 56.170912787495126 ], [ 27.054193963180865, 56.173315741827992 ], [ 27.044065382811141, 56.175951240157588 ], [ 27.038019239796085, 56.180111191877984 ], [ 27.034608595110569, 56.186648261308164 ], [ 27.035693800728325, 56.198120428814718 ], [ 27.034298536748054, 56.2077839220903 ], [ 27.028872512256612, 56.215432033761317 ], [ 27.015695020608689, 56.22416535105009 ], [ 27.001587354772596, 56.230573229271101 ], [ 26.99724653499959, 56.238583076148018 ], [ 26.988513217710818, 56.247936510161765 ], [ 26.986187777743737, 56.263232734403118 ], [ 26.95983279804517, 56.284032498401075 ], [ 26.949135775995273, 56.297752591508868 ], [ 26.946500277665677, 56.304315497562129 ], [ 26.944329868228806, 56.312945462063396 ], [ 26.950841099237323, 56.319663397747604 ], [ 26.975800815854939, 56.320128485741009 ], [ 26.991148716040414, 56.33149730135932 ], [ 26.966499057785256, 56.359066676985549 ], [ 26.951771275224132, 56.372631741361772 ], [ 26.89761437320476, 56.411311551087181 ], [ 26.899939813171841, 56.418468736343073 ], [ 26.910016716698124, 56.425083320139095 ], [ 26.914667595732965, 56.433403225378527 ], [ 26.925364617782861, 56.447614244002125 ], [ 26.992109165005957, 56.450827327419177 ], [ 27.033529377178979, 56.448238564158373 ], [ 27.041295666062126, 56.46635990698411 ], [ 27.007641744570833, 56.523312697822746 ], [ 27.00505298131003, 56.562144145835646 ], [ 26.981754112862006, 56.593209304066079 ], [ 26.9144462689801, 56.600975593848545 ], [ 26.883381110749667, 56.637218278600642 ], [ 26.852315952519177, 56.657928384687182 ], [ 26.808306977984614, 56.665694674469648 ], [ 26.772557406798853, 56.681010851069914 ], [ 26.782944369586971, 56.707391669190145 ], [ 26.907536247999417, 56.817979234554002 ], [ 26.928465204105862, 56.831105048459165 ] ], [ [ 27.339069016921599, 56.47490562749266 ], [ 27.355497216923027, 56.494984539005259 ], [ 27.360973283290377, 56.520539517784471 ], [ 27.365536672679298, 56.538793073541456 ], [ 27.363711316923741, 56.555221273542884 ], [ 27.340169016386994, 56.560760606316876 ], [ 27.310056339128721, 56.553347928164328 ], [ 27.274284355038958, 56.515546408040279 ], [ 27.284639408082171, 56.489658775432133 ], [ 27.339069016921599, 56.47490562749266 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-104", "NAME_1": "Vecpiebalgas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.745126580926922, 57.275108954514621 ], [ 25.754273309365715, 57.277641100056712 ], [ 25.769871138342353, 57.278712291539023 ], [ 25.760677364568721, 57.255442011639502 ], [ 25.752848977498275, 57.244482269740899 ], [ 25.745020589528565, 57.213168719660644 ], [ 25.771637106467267, 57.199077622933942 ], [ 25.763808719396877, 57.169329751167027 ], [ 25.774768461295423, 57.153672976126927 ], [ 25.804516333961601, 57.134884846258615 ], [ 25.83896123797075, 57.120793748632593 ], [ 25.862446400081296, 57.120793748632593 ], [ 25.881234529949552, 57.097308586522047 ], [ 25.923100213204236, 57.097445379700503 ], [ 25.907597284287249, 57.0700051952835 ], [ 25.906202020306978, 57.061426906726354 ], [ 25.899535759667572, 57.05016144479481 ], [ 25.896745232606406, 57.037552394827117 ], [ 25.895660027887971, 57.026261095373229 ], [ 25.904341668333302, 57.013962103768051 ], [ 25.911162956805015, 57.006753242568038 ], [ 25.919999626881236, 57.000086981928632 ], [ 25.923565301197698, 56.992955634195141 ], [ 25.920774774136476, 56.981896877838608 ], [ 25.917829217444421, 56.975230618098522 ], [ 25.886358269818288, 56.964223537686109 ], [ 25.854060499892114, 56.962569892186764 ], [ 25.850339796844139, 56.9663681104999 ], [ 25.844913770554058, 56.970269679801845 ], [ 25.841813185130377, 56.973835354118251 ], [ 25.837472365357371, 56.976780910810362 ], [ 25.833906691040966, 56.979726468401793 ], [ 25.829720899999529, 56.982413641776134 ], [ 25.822589553165301, 56.984997464161609 ], [ 25.813701206245639, 56.986754462448459 ], [ 25.796027866093141, 56.984997464161609 ], [ 25.787501255278698, 56.981690172263598 ], [ 25.779439731558341, 56.981018377795863 ], [ 25.769517856763684, 56.983498847393889 ], [ 25.754893426090746, 56.99329153097932 ], [ 25.727143182411908, 56.998691717948418 ], [ 25.705439080848862, 56.99367910370762 ], [ 25.69732588118444, 56.986134344824109 ], [ 25.629526401322323, 56.963086656124233 ], [ 25.63355716273287, 56.974868882892622 ], [ 25.639138217754521, 56.984480699324763 ], [ 25.636967808317706, 56.99021678307804 ], [ 25.638518101029547, 56.992955634195141 ], [ 25.638518101029547, 56.994764309325376 ], [ 25.634022250726275, 56.994712633381312 ], [ 25.602706332731032, 56.984377346537258 ], [ 25.582345819204193, 56.981896877838608 ], [ 25.565137567045042, 56.982103583413618 ], [ 25.517181837671671, 56.995126044531276 ], [ 25.50399548410428, 56.994820478282406 ], [ 25.510168968423159, 57.008064971221415 ], [ 25.492946516868244, 57.026853101089728 ], [ 25.507037613594946, 57.036247165574196 ], [ 25.528957098291414, 57.020590390534096 ], [ 25.547745228159727, 57.020590390534096 ], [ 25.58688716441111, 57.050338262300954 ], [ 25.616635037077288, 57.065995037341054 ], [ 25.618200714491365, 57.080086134967132 ], [ 25.594715552380819, 57.10983400673399 ], [ 25.564967680613961, 57.112965361562146 ], [ 25.541482518503415, 57.122359426945991 ], [ 25.563402002300563, 57.147410266470615 ], [ 25.572796067684351, 57.170895428581161 ], [ 25.575927422512507, 57.203774655176176 ], [ 25.560270647472407, 57.222562785044488 ], [ 25.575927422512507, 57.23665388177119 ], [ 25.599412584623053, 57.247613624569112 ], [ 25.600978262037131, 57.26483607702329 ], [ 25.638554521773756, 57.26483607702329 ], [ 25.669868070954692, 57.274230141507815 ], [ 25.709010008105395, 57.266401754437368 ], [ 25.745126580926922, 57.275108954514621 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-076", "NAME_1": "Raunas" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 25.657948438569576, 57.464606432041194 ], [ 25.667095167907632, 57.452514146910346 ], [ 25.713965691663304, 57.400992744119833 ], [ 25.704922316012073, 57.383784491960682 ], [ 25.722182245014551, 57.361305244041773 ], [ 25.751637811036119, 57.337689114560987 ], [ 25.753343133378905, 57.329679266784694 ], [ 25.740165642630302, 57.326423651730124 ], [ 25.736599969213216, 57.319395656784081 ], [ 25.738770378650031, 57.313065293828231 ], [ 25.733034294896754, 57.296606350502657 ], [ 25.736910027575675, 57.284669094103378 ], [ 25.745126580926922, 57.275108954514621 ], [ 25.709010008105395, 57.266401754437368 ], [ 25.669868070954692, 57.274230141507815 ], [ 25.638554521773756, 57.26483607702329 ], [ 25.600978262037131, 57.26483607702329 ], [ 25.597846907208975, 57.28518988340636 ], [ 25.579058777340663, 57.296149626204283 ], [ 25.555573615230117, 57.305543690688751 ], [ 25.547745228159727, 57.321200465728907 ], [ 25.533654130533705, 57.338422918183085 ], [ 25.513300323251315, 57.346251305253531 ], [ 25.511734645837237, 57.360342402879553 ], [ 25.546179550745649, 57.377564854434468 ], [ 25.575927422512507, 57.380696209262624 ], [ 25.602543939451209, 57.377564854434468 ], [ 25.605675294279365, 57.39635298430278 ], [ 25.626029101561755, 57.405747049686568 ], [ 25.649514263672302, 57.44019195369566 ], [ 25.657948438569576, 57.464606432041194 ] ] ], [ [ [ 25.991726515366395, 57.290017605128355 ], [ 26.012965528935979, 57.28782135726982 ], [ 26.027848342027369, 57.281646023045482 ], [ 26.043713006150313, 57.279966539124473 ], [ 26.058595819241646, 57.265290432507413 ], [ 26.058595819241646, 57.251286119458825 ], [ 26.049139032440394, 57.24999420826606 ], [ 26.01436079291625, 57.249865017056891 ], [ 26.008469678632764, 57.246738593211489 ], [ 26.004128858859758, 57.243844713362819 ], [ 26.013430616929384, 57.221055406182018 ], [ 25.989266276017815, 57.206906010004332 ], [ 25.945427306624879, 57.191249234964175 ], [ 25.893759949262233, 57.184986525307863 ], [ 25.868709109737608, 57.184986525307863 ], [ 25.849920980768616, 57.195946268105786 ], [ 25.81860743068836, 57.206906010004332 ], [ 25.798253623405969, 57.20847168741841 ], [ 25.771637106467267, 57.199077622933942 ], [ 25.745020589528565, 57.213168719660644 ], [ 25.752848977498275, 57.244482269740899 ], [ 25.760677364568721, 57.255442011639502 ], [ 25.769871138342353, 57.278712291539023 ], [ 25.880312126803176, 57.286296902080323 ], [ 25.891319207215645, 57.288312282785569 ], [ 25.904186638702413, 57.288441473994794 ], [ 25.910697869710873, 57.286736152551384 ], [ 25.991726515366395, 57.290017605128355 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-075", "NAME_1": "Priekulu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.602396275267893, 57.468637193451684 ], [ 25.657948438569576, 57.464606432041194 ], [ 25.649514263672302, 57.44019195369566 ], [ 25.626029101561755, 57.405747049686568 ], [ 25.605675294279365, 57.39635298430278 ], [ 25.602543939451209, 57.377564854434468 ], [ 25.575927422512507, 57.380696209262624 ], [ 25.546179550745649, 57.377564854434468 ], [ 25.511734645837237, 57.360342402879553 ], [ 25.513300323251315, 57.346251305253531 ], [ 25.533654130533705, 57.338422918183085 ], [ 25.547745228159727, 57.321200465728907 ], [ 25.555573615230117, 57.305543690688751 ], [ 25.579058777340663, 57.296149626204283 ], [ 25.597846907208975, 57.28518988340636 ], [ 25.600978262037131, 57.26483607702329 ], [ 25.599412584623053, 57.247613624569112 ], [ 25.575927422512507, 57.23665388177119 ], [ 25.560270647472407, 57.222562785044488 ], [ 25.546179550745649, 57.213168719660644 ], [ 25.522694388635102, 57.20847168741841 ], [ 25.500774903938634, 57.216300075388119 ], [ 25.500774903938634, 57.24917930198319 ], [ 25.489815161140768, 57.263270399609212 ], [ 25.466329999030222, 57.277361496335971 ], [ 25.427188062778839, 57.289886916547914 ], [ 25.394308835284505, 57.302412335860595 ], [ 25.362995286103569, 57.296149626204283 ], [ 25.331681736922576, 57.291452593961992 ], [ 25.311327929640242, 57.296149626204283 ], [ 25.323853348952866, 57.308675045516907 ], [ 25.311327929640242, 57.31337207865846 ], [ 25.273751669903618, 57.318069110900694 ], [ 25.254963540035305, 57.325897497971141 ], [ 25.231478377924759, 57.330594530213375 ], [ 25.245569475550838, 57.347816982667609 ], [ 25.286277090115618, 57.360342402879553 ], [ 25.319156316710632, 57.355645369737999 ], [ 25.3567325764472, 57.357211047152077 ], [ 25.377086383729591, 57.369736467364078 ], [ 25.386853874606629, 57.386058255084379 ], [ 25.39321007688352, 57.39068329479818 ], [ 25.392900017621685, 57.398202216159348 ], [ 25.397085808663121, 57.404532579115198 ], [ 25.398636102274281, 57.4111213244895 ], [ 25.391814812903249, 57.428045355808479 ], [ 25.402511834053882, 57.433548896464345 ], [ 25.404682245289393, 57.434995836388737 ], [ 25.398791131005851, 57.441248684079483 ], [ 25.420960320562301, 57.447449855826164 ], [ 25.474497104957436, 57.442540595272249 ], [ 25.500438674405302, 57.450137030999144 ], [ 25.509430373213149, 57.447010607153743 ], [ 25.519352248007806, 57.441248684079483 ], [ 25.526793654103813, 57.438199775499186 ], [ 25.547619255624113, 57.441558743341318 ], [ 25.561106804735232, 57.45101553014257 ], [ 25.602396275267893, 57.468637193451684 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-070", "NAME_1": "Pargaujas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.079585808937907, 57.500211493865322 ], [ 25.097775913027931, 57.487964179103528 ], [ 25.123045688907382, 57.49494049720613 ], [ 25.140874057791507, 57.475019233250976 ], [ 25.140563999428991, 57.461764228136587 ], [ 25.159684278606562, 57.448250841503125 ], [ 25.184643996123498, 57.430086574935444 ], [ 25.196891309985972, 57.421844184061797 ], [ 25.21074059430299, 57.416650703567086 ], [ 25.238180779619256, 57.415048733112542 ], [ 25.272803988613191, 57.404920151843498 ], [ 25.301174350815643, 57.403679918393493 ], [ 25.322775098691807, 57.405488593523728 ], [ 25.328976271337808, 57.403447374396762 ], [ 25.334867384722031, 57.397323717015922 ], [ 25.348975050558124, 57.388900458089665 ], [ 25.35734663264094, 57.385076402254128 ], [ 25.386853874606629, 57.386058255084379 ], [ 25.377086383729591, 57.369736467364078 ], [ 25.3567325764472, 57.357211047152077 ], [ 25.319156316710632, 57.355645369737999 ], [ 25.286277090115618, 57.360342402879553 ], [ 25.245569475550838, 57.347816982667609 ], [ 25.231478377924759, 57.330594530213375 ], [ 25.231478377924759, 57.296149626204283 ], [ 25.231478377924759, 57.28518988340636 ], [ 25.206427538400135, 57.26483607702329 ], [ 25.165719924734731, 57.263270399609212 ], [ 25.131275019826262, 57.266401754437368 ], [ 25.090567405261538, 57.247613624569112 ], [ 25.048294114181999, 57.241350914912744 ], [ 24.980969982678516, 57.238219559185268 ], [ 24.933134800230846, 57.246221829273964 ], [ 24.939646030339986, 57.257978216721312 ], [ 24.942126499038693, 57.267512518787669 ], [ 24.935770297661065, 57.278261216781686 ], [ 24.915099724872391, 57.289371649981661 ], [ 24.898046502344187, 57.302600815775008 ], [ 24.888744745173824, 57.30921540047035 ], [ 24.889364861898855, 57.312212633106526 ], [ 24.900216912680378, 57.318930568790677 ], [ 24.902852411009917, 57.323116359832113 ], [ 24.903317498104059, 57.32771556292289 ], [ 24.880993279815982, 57.337224026567526 ], [ 24.878822870379167, 57.342934271899082 ], [ 24.87076134575949, 57.350556546047756 ], [ 24.854276564012196, 57.372725734704886 ], [ 24.83164228736166, 57.395515041885631 ], [ 24.799964634160517, 57.411431382852015 ], [ 24.799499546167112, 57.417115789761851 ], [ 24.812677036016396, 57.419027818578911 ], [ 24.84668012918462, 57.412206529207936 ], [ 24.875877312787736, 57.41303335240724 ], [ 24.886884393200148, 57.420888170552587 ], [ 24.980315383248296, 57.452875882116246 ], [ 24.988841994062739, 57.461299140143183 ], [ 25.002949659898889, 57.467500311889864 ], [ 25.01256147633103, 57.476104437969411 ], [ 25.045634392613124, 57.482796536131218 ], [ 25.05323082923934, 57.491839911782449 ], [ 25.061912468785408, 57.498221951581797 ], [ 25.079585808937907, 57.500211493865322 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-048", "NAME_1": "Krimuldas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.83164228736166, 57.395515041885631 ], [ 24.854276564012196, 57.372725734704886 ], [ 24.87076134575949, 57.350556546047756 ], [ 24.878822870379167, 57.342934271899082 ], [ 24.880993279815982, 57.337224026567526 ], [ 24.903317498104059, 57.32771556292289 ], [ 24.902852411009917, 57.323116359832113 ], [ 24.900216912680378, 57.318930568790677 ], [ 24.889364861898855, 57.312212633106526 ], [ 24.888744745173824, 57.30921540047035 ], [ 24.898046502344187, 57.302600815775008 ], [ 24.915099724872391, 57.289371649981661 ], [ 24.935770297661065, 57.278261216781686 ], [ 24.942126499038693, 57.267512518787669 ], [ 24.939646030339986, 57.257978216721312 ], [ 24.933134800230846, 57.246221829273964 ], [ 24.923471306955207, 57.236041572060856 ], [ 24.900371942311267, 57.218678290270873 ], [ 24.884218442926795, 57.199125473162042 ], [ 24.861967557157016, 57.189390711312228 ], [ 24.823028507959236, 57.182437309734041 ], [ 24.804949663496132, 57.165749145406721 ], [ 24.79660558088284, 57.142107579501157 ], [ 24.77991741745484, 57.135154177922971 ], [ 24.772964014977276, 57.147670300943616 ], [ 24.736806326950386, 57.147670300943616 ], [ 24.700648638024234, 57.137935538194483 ], [ 24.665881629233809, 57.125419415173837 ], [ 24.675616391083565, 57.149060981079401 ], [ 24.67422571094778, 57.169921186713395 ], [ 24.65753754751978, 57.179655948563152 ], [ 24.619989177558466, 57.176874588291582 ], [ 24.615817137151168, 57.203297514468716 ], [ 24.66031890779135, 57.210250916046903 ], [ 24.681573928394073, 57.223070786887263 ], [ 24.71309655106495, 57.227049872353689 ], [ 24.706211359466636, 57.242236563666438 ], [ 24.685351153832642, 57.286738335205996 ], [ 24.647802784770704, 57.300645138362427 ], [ 24.636677341885786, 57.320114662961316 ], [ 24.683960473696914, 57.328458745574608 ], [ 24.702039318159962, 57.349318950309282 ], [ 24.688132515003531, 57.389648680542166 ], [ 24.747931768935985, 57.410508885276784 ], [ 24.750713130106874, 57.396602082120353 ], [ 24.83164228736166, 57.395515041885631 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-033", "NAME_1": "Gulbene" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.130271029984044, 57.276478380073172 ], [ 26.261994256129981, 57.281930243885597 ], [ 26.266645135164822, 57.288854885144815 ], [ 26.264991488766157, 57.300947171174982 ], [ 26.27568851081611, 57.308336900427605 ], [ 26.280339389850951, 57.317871202493961 ], [ 26.277083774796324, 57.322961331100544 ], [ 26.276153598809515, 57.331022853921525 ], [ 26.359456007588676, 57.322547919051203 ], [ 26.423534784402761, 57.332159736382721 ], [ 26.430046013612639, 57.339704495266233 ], [ 26.430046013612639, 57.34600901980042 ], [ 26.424154901127793, 57.346990871731293 ], [ 26.411132440010078, 57.342856757533298 ], [ 26.404466180269992, 57.342236639909004 ], [ 26.399040154879231, 57.344019477516838 ], [ 26.394699334206905, 57.347145901362239 ], [ 26.393924187850985, 57.350711574779325 ], [ 26.397024774173985, 57.35427724909573 ], [ 26.421054314804792, 57.357946275300321 ], [ 26.43314659993564, 57.361408595929902 ], [ 26.446840854621712, 57.369160061287744 ], [ 26.474746127931439, 57.375051175571286 ], [ 26.479241978234711, 57.382389227980468 ], [ 26.480637241315605, 57.387401842221209 ], [ 26.475831332649875, 57.405075182373764 ], [ 26.52022138770684, 57.406470445454659 ], [ 26.525802442728548, 57.401871243263258 ], [ 26.531073439387683, 57.398874009727763 ], [ 26.544405958867912, 57.395618395572455 ], [ 26.567712029986183, 57.397427069803427 ], [ 26.594222040214959, 57.391303412422531 ], [ 26.61814822805826, 57.362493801547657 ], [ 26.6331860689819, 57.350298162729985 ], [ 26.677576124938184, 57.334330145819536 ], [ 26.681451856717786, 57.323684801512343 ], [ 26.682227003973026, 57.320015774408432 ], [ 26.714783156317594, 57.306476549353249 ], [ 26.747701042968743, 57.318956407212397 ], [ 26.7607235040864, 57.321669419907778 ], [ 26.790230746951408, 57.318413804853208 ], [ 26.836171094720214, 57.315313219429527 ], [ 26.840046828298455, 57.3162950713604 ], [ 26.845472852789896, 57.315933336154501 ], [ 26.849348586368137, 57.315261541686766 ], [ 26.865006544916071, 57.299526068773048 ], [ 26.905520868193491, 57.303737698236148 ], [ 26.988513217710818, 57.304409491804563 ], [ 27.020810987636935, 57.286736152551384 ], [ 27.059930046934085, 57.27275767702514 ], [ 27.066906365936006, 57.268701077192929 ], [ 27.060085076565031, 57.263223374958784 ], [ 27.048561232215093, 57.256427924009472 ], [ 27.046545850610471, 57.253353176108135 ], [ 27.045925733885497, 57.250304267527895 ], [ 27.056157667941989, 57.24870229797267 ], [ 27.156564976092739, 57.226378078785274 ], [ 27.130209994595532, 57.199635525459087 ], [ 27.091245964929328, 57.170102444172414 ], [ 27.065046013962331, 57.155736395917927 ], [ 27.008103809043519, 57.114503838081646 ], [ 26.995179478350224, 57.105145169114223 ], [ 26.979056430909566, 57.095585029525466 ], [ 26.953166538305084, 57.064837551411813 ], [ 26.929550408824298, 57.04979971048823 ], [ 26.901955193877086, 57.039257718069223 ], [ 26.860510694612856, 57.018018704499582 ], [ 26.868417188702267, 57.005900580047694 ], [ 26.871207716662752, 57.002644964993124 ], [ 26.860045606619451, 56.983007920978764 ], [ 26.795811801973059, 56.989131578359604 ], [ 26.78154910740534, 56.99254222304512 ], [ 26.757622917763399, 56.992955634195141 ], [ 26.734833612381294, 56.988201402372795 ], [ 26.725996942305017, 56.982620348250464 ], [ 26.703776075905182, 56.974197089324207 ], [ 26.697419875426874, 56.973473618912351 ], [ 26.691063674049303, 56.978202013212297 ], [ 26.635201449687145, 56.96499868404203 ], [ 26.603678827016211, 56.953604030901261 ], [ 26.568177117979587, 56.94841055040655 ], [ 26.559650506265825, 56.978899645202432 ], [ 26.544250929236966, 57.009233710367425 ], [ 26.532933791361359, 57.025253404121258 ], [ 26.512624952879264, 57.044063625835634 ], [ 26.497277052693789, 57.055794175760582 ], [ 26.46203372607556, 57.061271877994727 ], [ 26.369377883282652, 57.044632065717224 ], [ 26.328915235949353, 57.071865546357856 ], [ 26.321318801121777, 57.097910467693907 ], [ 26.27165774940562, 57.087110093755769 ], [ 26.21517540921775, 57.08912547536039 ], [ 26.183187696754771, 57.082614244351873 ], [ 26.116783481772245, 57.078066718104537 ], [ 26.133216586676099, 57.097083645393866 ], [ 26.139882847315505, 57.108452460112915 ], [ 26.161328565560837, 57.128838812960794 ], [ 26.165824415864108, 57.134238999929892 ], [ 26.168149854931869, 57.143437405212069 ], [ 26.131666293964258, 57.172014472090211 ], [ 26.102520786305206, 57.201263333436088 ], [ 26.089291619612538, 57.209893297037979 ], [ 26.076114128863935, 57.21472504322611 ], [ 26.062161492658731, 57.217179674402416 ], [ 26.013430616929384, 57.221055406182018 ], [ 26.004128858859758, 57.243844713362819 ], [ 26.008469678632764, 57.246738593211489 ], [ 26.01436079291625, 57.249865017056891 ], [ 26.049139032440394, 57.24999420826606 ], [ 26.058595819241646, 57.251286119458825 ], [ 26.058595819241646, 57.265290432507413 ], [ 26.075804071400739, 57.274127102583691 ], [ 26.101280551955881, 57.278157863994181 ], [ 26.130271029984044, 57.276478380073172 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-082", "NAME_1": "Rugaju" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.860045606619451, 56.983007920978764 ], [ 26.871207716662752, 57.002644964993124 ], [ 26.868417188702267, 57.005900580047694 ], [ 26.860510694612856, 57.018018704499582 ], [ 26.901955193877086, 57.039257718069223 ], [ 26.929550408824298, 57.04979971048823 ], [ 26.953166538305084, 57.064837551411813 ], [ 26.979056430909566, 57.095585029525466 ], [ 26.995179478350224, 57.105145169114223 ], [ 27.008103809043519, 57.114503838081646 ], [ 27.049793031822958, 57.111831533198654 ], [ 27.097639597889099, 57.114109941320692 ], [ 27.097639597889099, 57.091325861898952 ], [ 27.118145269188801, 57.084490638432214 ], [ 27.147764571178016, 57.08904745467629 ], [ 27.197889545366195, 57.07765541496542 ], [ 27.270798598076794, 57.063984967132512 ], [ 27.304974717209404, 57.06626337525455 ], [ 27.325480388509106, 57.061706559909794 ], [ 27.314088348798236, 57.025252032655146 ], [ 27.289025862153778, 57.000189546010688 ], [ 27.254849743021225, 56.993354322543951 ], [ 27.261684966488019, 56.972848651244249 ], [ 27.28674745403174, 56.972848651244249 ], [ 27.314088348798236, 56.979683874711043 ], [ 27.332315611975901, 56.93639412488892 ], [ 27.291304269376496, 56.927280493300088 ], [ 27.266241782732095, 56.915888453589218 ], [ 27.225230440132691, 56.895382782289516 ], [ 27.200167953488233, 56.861206664056283 ], [ 27.165991835254999, 56.861206664056283 ], [ 27.083969150056191, 56.874877110989871 ], [ 27.03612258399005, 56.883990742578703 ], [ 26.985102573025301, 56.878233953733968 ], [ 26.971149936820098, 56.890920518966766 ], [ 26.962468296374766, 56.913270576575826 ], [ 26.953941684661004, 56.920711981772513 ], [ 26.92396935380259, 56.931719062184925 ], [ 26.911411980678338, 56.939315497012558 ], [ 26.911101922315822, 56.947712918416414 ], [ 26.914822625363854, 56.957867337207801 ], [ 26.917148065330935, 56.969339504714355 ], [ 26.911877068671743, 56.973835354118251 ], [ 26.90257531060206, 56.977969469215623 ], [ 26.878184034765354, 56.978357041943923 ], [ 26.869812452682538, 56.976264146872836 ], [ 26.860045606619451, 56.983007920978764 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-039", "NAME_1": "Jaunpiebalgas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.013430616929384, 57.221055406182018 ], [ 26.062161492658731, 57.217179674402416 ], [ 26.076114128863935, 57.21472504322611 ], [ 26.089291619612538, 57.209893297037979 ], [ 26.102520786305206, 57.201263333436088 ], [ 26.131666293964258, 57.172014472090211 ], [ 26.168149854931869, 57.143437405212069 ], [ 26.165824415864108, 57.134238999929892 ], [ 26.161328565560837, 57.128838812960794 ], [ 26.139882847315505, 57.108452460112915 ], [ 26.133216586676099, 57.097083645393866 ], [ 26.116783481772245, 57.078066718104537 ], [ 26.089601677975054, 57.086128241824895 ], [ 26.077044304850745, 57.088221136895925 ], [ 26.064952019719897, 57.08871206331105 ], [ 26.056270379274565, 57.084422919482108 ], [ 26.052859734589049, 57.080262966862392 ], [ 26.048828973178558, 57.076774806911772 ], [ 26.038390334446376, 57.076852322176876 ], [ 26.022577345368177, 57.079513658028873 ], [ 25.949661900276453, 57.100390937291877 ], [ 25.923100213204236, 57.097445379700503 ], [ 25.881234529949552, 57.097308586522047 ], [ 25.862446400081296, 57.120793748632593 ], [ 25.83896123797075, 57.120793748632593 ], [ 25.804516333961601, 57.134884846258615 ], [ 25.774768461295423, 57.153672976126927 ], [ 25.763808719396877, 57.169329751167027 ], [ 25.771637106467267, 57.199077622933942 ], [ 25.798253623405969, 57.20847168741841 ], [ 25.81860743068836, 57.206906010004332 ], [ 25.849920980768616, 57.195946268105786 ], [ 25.868709109737608, 57.184986525307863 ], [ 25.893759949262233, 57.184986525307863 ], [ 25.945427306624879, 57.191249234964175 ], [ 25.989266276017815, 57.206906010004332 ], [ 26.013430616929384, 57.221055406182018 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-001", "NAME_1": "Aglonas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 27.038019239796085, 56.180111191877984 ], [ 27.044065382811141, 56.175951240157588 ], [ 27.054193963180865, 56.173315741827992 ], [ 27.07760338708664, 56.170912787495126 ], [ 27.101632927717446, 56.17075775786418 ], [ 27.09822228393125, 56.179568590418114 ], [ 27.097602166306899, 56.181997382273323 ], [ 27.099617547012144, 56.18638987888977 ], [ 27.102408074972686, 56.18907705316343 ], [ 27.125869174822526, 56.195846665691022 ], [ 27.150828892339518, 56.208429877236995 ], [ 27.162301059846016, 56.210781154726476 ], [ 27.173049757840033, 56.208300686027826 ], [ 27.295936313909749, 56.203029690267954 ], [ 27.300171987647104, 56.181595953690305 ], [ 27.331237145877537, 56.160885848503085 ], [ 27.339003435660004, 56.140175742416545 ], [ 27.307938276530194, 56.124643163750989 ], [ 27.240630433547665, 56.111699347446915 ], [ 27.263929301995688, 56.072867899433959 ], [ 27.188855169230635, 56.054746556608279 ], [ 27.194032695752298, 56.010737582073716 ], [ 27.147434957956932, 55.98484995036489 ], [ 27.103425983422369, 55.987438713625693 ], [ 27.041295666062126, 55.982261187104086 ], [ 26.999875454788366, 55.990027476886496 ], [ 26.967739292134581, 56.007847804932226 ], [ 26.969444613578048, 56.013635566428206 ], [ 26.958282505333329, 56.027123115539325 ], [ 26.953631626298488, 56.034306139216937 ], [ 26.951926303955759, 56.041024074901088 ], [ 26.968669468121448, 56.060196030922043 ], [ 26.931100702435458, 56.058697415053643 ], [ 26.890793083833728, 56.105051174871789 ], [ 26.888467644765967, 56.128874009927586 ], [ 26.928487338220066, 56.124239223361428 ], [ 26.936759761953454, 56.135820618027083 ], [ 26.920214913587358, 56.145747527226547 ], [ 26.931796307353693, 56.157328920992882 ], [ 26.968194974118717, 56.168910314759216 ], [ 26.999630187183357, 56.17056480022535 ], [ 27.038019239796085, 56.180111191877984 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-078", "NAME_1": "Riebinu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.925364617782861, 56.447614244002125 ], [ 26.914667595732965, 56.433403225378527 ], [ 26.910016716698124, 56.425083320139095 ], [ 26.899939813171841, 56.418468736343073 ], [ 26.89761437320476, 56.411311551087181 ], [ 26.951771275224132, 56.372631741361772 ], [ 26.966499057785256, 56.359066676985549 ], [ 26.991148716040414, 56.33149730135932 ], [ 26.975800815854939, 56.320128485741009 ], [ 26.950841099237323, 56.319663397747604 ], [ 26.944329868228806, 56.312945462063396 ], [ 26.946500277665677, 56.304315497562129 ], [ 26.949135775995273, 56.297752591508868 ], [ 26.95983279804517, 56.284032498401075 ], [ 26.986187777743737, 56.263232734403118 ], [ 26.988513217710818, 56.247936510161765 ], [ 26.99724653499959, 56.238583076148018 ], [ 27.001587354772596, 56.230573229271101 ], [ 27.015695020608689, 56.22416535105009 ], [ 27.028872512256612, 56.215432033761317 ], [ 27.034298536748054, 56.2077839220903 ], [ 27.035693800728325, 56.198120428814718 ], [ 27.034608595110569, 56.186648261308164 ], [ 27.038019239796085, 56.180111191877984 ], [ 26.999630187183357, 56.17056480022535 ], [ 26.968194974118717, 56.168910314759216 ], [ 26.931796307353693, 56.157328920992882 ], [ 26.920214913587358, 56.145747527226547 ], [ 26.936759761953454, 56.135820618027083 ], [ 26.928487338220066, 56.124239223361428 ], [ 26.888467644765967, 56.128874009927586 ], [ 26.882428558730965, 56.152052055358013 ], [ 26.861750720319492, 56.162390974563777 ], [ 26.826598394300447, 56.176865461271973 ], [ 26.801784988386487, 56.185136597176211 ], [ 26.834869530204628, 56.199611083884406 ], [ 26.839005097707059, 56.214085570592601 ], [ 26.814191691793098, 56.253373464114077 ], [ 26.783174933276541, 56.282322438429787 ], [ 26.741819256453482, 56.290593573434649 ], [ 26.702531362932064, 56.313339196047025 ], [ 26.665311253611435, 56.321610331051886 ], [ 26.65083676690324, 56.336084818659401 ], [ 26.669446821113866, 56.369169360477599 ], [ 26.710802498836244, 56.383643847185795 ], [ 26.733548121448621, 56.396050550592406 ], [ 26.685989092022965, 56.429135091511228 ], [ 26.623955576788433, 56.449812930822077 ], [ 26.590871034970291, 56.445677362420327 ], [ 26.576396548262096, 56.433270659912978 ], [ 26.559854277352997, 56.439474011616312 ], [ 26.537108654740621, 56.445677362420327 ], [ 26.537108654740621, 56.466355201731119 ], [ 26.540530226188991, 56.489678859991386 ], [ 26.559495476634936, 56.486164863417685 ], [ 26.59639244965183, 56.488800360847961 ], [ 26.597012567276124, 56.494536445500557 ], [ 26.59732262473932, 56.495569973375552 ], [ 26.593136833697884, 56.496603502149867 ], [ 26.593756952221554, 56.501590277968944 ], [ 26.595152215302448, 56.506551215366244 ], [ 26.627760043591138, 56.543732408323933 ], [ 26.706411574234721, 56.546083685813414 ], [ 26.722276239257042, 56.543112290699639 ], [ 26.743670281558252, 56.558847765411997 ], [ 26.771110466874518, 56.556083075873232 ], [ 26.815655551562429, 56.540011705275958 ], [ 26.826094191193931, 56.524172879574678 ], [ 26.775451288446163, 56.512003079178726 ], [ 26.800927769001305, 56.507248847356379 ], [ 26.807594027842072, 56.498489692545263 ], [ 26.82030643059727, 56.495518297431431 ], [ 26.833225538927479, 56.494794827019632 ], [ 26.847333204763572, 56.495518297431431 ], [ 26.85787519718258, 56.492546902317656 ], [ 26.865936720003617, 56.485751451368344 ], [ 26.902265252239602, 56.479162705994042 ], [ 26.952701450311679, 56.476914781292123 ], [ 26.958437534064899, 56.461101793113244 ], [ 26.949755893619567, 56.458156236421132 ], [ 26.933116082241384, 56.454926458888963 ], [ 26.925364617782861, 56.447614244002125 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-109", "NAME_1": "Vilanu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.833225538927479, 56.494794827019632 ], [ 26.82030643059727, 56.495518297431431 ], [ 26.807594027842072, 56.498489692545263 ], [ 26.800927769001305, 56.507248847356379 ], [ 26.775451288446163, 56.512003079178726 ], [ 26.826094191193931, 56.524172879574678 ], [ 26.815655551562429, 56.540011705275958 ], [ 26.771110466874518, 56.556083075873232 ], [ 26.743670281558252, 56.558847765411997 ], [ 26.729252557359644, 56.578303941373747 ], [ 26.736538933824704, 56.587295641080971 ], [ 26.749716423673988, 56.595822251895356 ], [ 26.788835483870457, 56.607061876304499 ], [ 26.792401157287543, 56.610291652937406 ], [ 26.788525424608622, 56.615485134331436 ], [ 26.779688755431721, 56.621453762081444 ], [ 26.777208285833694, 56.632615872124745 ], [ 26.780928988881726, 56.644966538774725 ], [ 26.778138461820561, 56.655921943243072 ], [ 26.77751834509553, 56.663725084544978 ], [ 26.771317173348848, 56.677471015175172 ], [ 26.772557406798853, 56.681010851069914 ], [ 26.808306977984614, 56.665694674469648 ], [ 26.852315952519177, 56.657928384687182 ], [ 26.883381110749667, 56.637218278600642 ], [ 26.9144462689801, 56.600975593848545 ], [ 26.981754112862006, 56.593209304066079 ], [ 27.00505298131003, 56.562144145835646 ], [ 27.007641744570833, 56.523312697822746 ], [ 27.041295666062126, 56.46635990698411 ], [ 27.033529377178979, 56.448238564158373 ], [ 26.992109165005957, 56.450827327419177 ], [ 26.925364617782861, 56.447614244002125 ], [ 26.933116082241384, 56.454926458888963 ], [ 26.949755893619567, 56.458156236421132 ], [ 26.958437534064899, 56.461101793113244 ], [ 26.952701450311679, 56.476914781292123 ], [ 26.902265252239602, 56.479162705994042 ], [ 26.865936720003617, 56.485751451368344 ], [ 26.85787519718258, 56.492546902317656 ], [ 26.847333204763572, 56.495518297431431 ], [ 26.833225538927479, 56.494794827019632 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-012", "NAME_1": "Babites" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.95445041645354, 56.991383791928399 ], [ 23.967767367769795, 56.987684638435269 ], [ 23.992778761230852, 56.984532376168204 ], [ 24.000995313682779, 56.979261380408332 ], [ 23.994174025211066, 56.973163561449155 ], [ 23.988592970189416, 56.964688626578834 ], [ 23.94916385342907, 56.946782742429605 ], [ 23.942652622420553, 56.938669541865863 ], [ 23.917566341513407, 56.928326851802751 ], [ 23.899687950538464, 56.914024139202638 ], [ 23.856779810040166, 56.897933586066131 ], [ 23.822810865928716, 56.883630873466018 ], [ 23.844264936177865, 56.847874089717436 ], [ 23.854991971302411, 56.826420019468287 ], [ 23.824598705565791, 56.803178110481383 ], [ 23.781690565067493, 56.821056502355646 ], [ 23.769639926641275, 56.800047511983053 ], [ 23.734086540761211, 56.822009995964493 ], [ 23.718428582213278, 56.835962633069016 ], [ 23.70726647306924, 56.852137356453795 ], [ 23.669542677752361, 56.874900825212876 ], [ 23.626237827413775, 56.8892410350457 ], [ 23.600813022802754, 56.889292710989764 ], [ 23.587635532054151, 56.891204738907561 ], [ 23.506761916029575, 56.894615384492397 ], [ 23.492034132569131, 56.934638780455316 ], [ 23.549271474299076, 56.924751173427865 ], [ 23.590391775160299, 56.92296333469011 ], [ 23.613633684147203, 56.931902530177581 ], [ 23.638663432771182, 56.928326851802751 ], [ 23.672632376882689, 56.928326851802751 ], [ 23.706601320994139, 56.931902530177581 ], [ 23.76738785246738, 56.942629565302184 ], [ 23.779902726329738, 56.956932278801617 ], [ 23.801356796578887, 56.9497809220519 ], [ 23.863931166789882, 56.955144439164485 ], [ 23.903263628913351, 56.962295795914201 ], [ 23.937232573024801, 56.973022831038804 ], [ 23.95445041645354, 56.991383791928399 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-031", "NAME_1": "Garkalnes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.320200636650043, 56.96902944635184 ], [ 24.302527297396864, 56.99099193033328 ], [ 24.287902865824606, 56.999880276353622 ], [ 24.274415316713487, 57.006365668041099 ], [ 24.249920688988595, 57.012644355052942 ], [ 24.224444206634814, 57.021636053860789 ], [ 24.181294385927174, 57.047939358514554 ], [ 24.162383007569701, 57.052823973147838 ], [ 24.23198936301867, 57.072573562819628 ], [ 24.247286846310885, 57.060057439798982 ], [ 24.261193650366636, 57.041978595335877 ], [ 24.290397936815339, 57.030853152451016 ], [ 24.320992904299089, 57.028071791280126 ], [ 24.362713314667701, 57.057276078628092 ], [ 24.407215086207259, 57.061448119934767 ], [ 24.458670258425684, 57.072573562819628 ], [ 24.501781348930081, 57.094824447690087 ], [ 24.508734750508324, 57.105949890574948 ], [ 24.514297471950727, 57.079526964397871 ], [ 24.550455160876936, 57.083699004805226 ], [ 24.565530100633623, 57.060001151232143 ], [ 24.546093907607712, 57.061024109375126 ], [ 24.521064159883053, 57.052084912988335 ], [ 24.53179119410828, 57.00202541663964 ], [ 24.451338432023022, 57.00202541663964 ], [ 24.401278935674327, 56.994874059889924 ], [ 24.395915417662366, 56.968056472528133 ], [ 24.371677488825014, 56.944417404939259 ], [ 24.352011258212997, 56.956932278801617 ], [ 24.320200636650043, 56.96902944635184 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-052", "NAME_1": "Kekavas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.155404494222012, 56.902392687372583 ], [ 24.197004022217811, 56.882058010468768 ], [ 24.176803020542934, 56.86754032032951 ], [ 24.189317894405292, 56.851449768092323 ], [ 24.217923321404157, 56.828207859105362 ], [ 24.259043622265324, 56.824632180730532 ], [ 24.310890957351774, 56.824632180730532 ], [ 24.34198507914806, 56.851135707746664 ], [ 24.386241081260891, 56.842108465932938 ], [ 24.420367069484655, 56.839829503828526 ], [ 24.444017367807248, 56.837667955411803 ], [ 24.452182245214431, 56.837926336930877 ], [ 24.457763299336762, 56.837538764202577 ], [ 24.475850050639281, 56.832216092498641 ], [ 24.505305616660849, 56.818521836913192 ], [ 24.512695346812791, 56.817100735410577 ], [ 24.522978956813404, 56.795293281060026 ], [ 24.536983269861992, 56.777490749698302 ], [ 24.537603386587023, 56.770385240386531 ], [ 24.53310753808239, 56.759223131242493 ], [ 24.525459426411373, 56.75240184187146 ], [ 24.466432964409762, 56.763845649257291 ], [ 24.414585629323312, 56.776360523119592 ], [ 24.346647741100355, 56.787087558244195 ], [ 24.294800405114586, 56.78887539788127 ], [ 24.253680104253363, 56.78529971950644 ], [ 24.26261930064021, 56.762057809620217 ], [ 24.269770656490607, 56.745967257382972 ], [ 24.253680104253363, 56.738815900633256 ], [ 24.228650356528703, 56.751330775394933 ], [ 24.194681412417253, 56.740603740270387 ], [ 24.188165019300186, 56.717943050531346 ], [ 24.145576920538417, 56.728209824323926 ], [ 24.035563726984378, 56.720937509658313 ], [ 24.00812666231559, 56.709975491575676 ], [ 23.998204786621613, 56.721602687813743 ], [ 23.996344434647938, 56.730491034733461 ], [ 24.004357805068651, 56.737649103123601 ], [ 24.005170461247758, 56.762057809620217 ], [ 24.035563726984378, 56.767421327632121 ], [ 24.085623223333073, 56.762057809620217 ], [ 24.087411062070828, 56.779936201494479 ], [ 24.114228649432619, 56.801390271743628 ], [ 24.12316784581941, 56.821056502355646 ], [ 24.103501615207335, 56.835359215855078 ], [ 24.090986740445715, 56.846086250979681 ], [ 24.088146223669241, 56.876134365908229 ], [ 24.099387241128284, 56.878492337051682 ], [ 24.104038120163125, 56.883608303180608 ], [ 24.112254672615052, 56.892625841309496 ], [ 24.132718539828716, 56.898361925062773 ], [ 24.155404494222012, 56.902392687372583 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-062", "NAME_1": "Marupes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.942652622420553, 56.938669541865863 ], [ 23.97148807081777, 56.933243517374422 ], [ 24.002390577662993, 56.923709215308008 ], [ 24.026575147924746, 56.919626777054077 ], [ 24.040269402610818, 56.9100407990436 ], [ 24.062128533804753, 56.898439440327877 ], [ 24.066252713192171, 56.886115998854223 ], [ 24.035563726984378, 56.86754032032951 ], [ 24.012321817098154, 56.851449768092323 ], [ 23.967625838761421, 56.849661929354511 ], [ 23.885385237039031, 56.842510572604795 ], [ 23.854991971302411, 56.826420019468287 ], [ 23.844264936177865, 56.847874089717436 ], [ 23.822810865928716, 56.883630873466018 ], [ 23.856779810040166, 56.897933586066131 ], [ 23.899687950538464, 56.914024139202638 ], [ 23.917566341513407, 56.928326851802751 ], [ 23.942652622420553, 56.938669541865863 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-068", "NAME_1": "Olaines" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 24.066252713192171, 56.886115998854223 ], [ 24.070810174250141, 56.872497870880011 ], [ 24.088146223669241, 56.876134365908229 ], [ 24.090986740445715, 56.846086250979681 ], [ 24.103501615207335, 56.835359215855078 ], [ 24.12316784581941, 56.821056502355646 ], [ 24.114228649432619, 56.801390271743628 ], [ 24.087411062070828, 56.779936201494479 ], [ 24.085623223333073, 56.762057809620217 ], [ 24.035563726984378, 56.767421327632121 ], [ 24.005170461247758, 56.762057809620217 ], [ 24.004357805068651, 56.737649103123601 ], [ 23.996344434647938, 56.730491034733461 ], [ 23.941412388071228, 56.728579006815664 ], [ 23.935211216324547, 56.731240343566981 ], [ 23.924979282268055, 56.734108384993931 ], [ 23.919553256877293, 56.742144070292568 ], [ 23.912886997137207, 56.745425522869539 ], [ 23.900898064793864, 56.745838934918879 ], [ 23.828292678064599, 56.738139147303798 ], [ 23.818215772739677, 56.735503648074882 ], [ 23.811239454637132, 56.73255809228209 ], [ 23.801265902999035, 56.729535021224194 ], [ 23.783902622108315, 56.732093004288686 ], [ 23.767469517204461, 56.737932440829468 ], [ 23.756307407161103, 56.744133613475469 ], [ 23.764213901250514, 56.768266506893724 ], [ 23.759718051846619, 56.771883857154251 ], [ 23.769639926641275, 56.800047511983053 ], [ 23.781690565067493, 56.821056502355646 ], [ 23.824598705565791, 56.803178110481383 ], [ 23.854991971302411, 56.826420019468287 ], [ 23.885385237039031, 56.842510572604795 ], [ 23.967625838761421, 56.849661929354511 ], [ 24.012321817098154, 56.851449768092323 ], [ 24.035563726984378, 56.86754032032951 ], [ 24.066252713192171, 56.886115998854223 ] ] ], [ [ [ 24.230455055756181, 56.699422996873807 ], [ 24.209096307348659, 56.693464871406661 ], [ 24.195867139756672, 56.691527005067201 ], [ 24.184705030612633, 56.692560532942196 ], [ 24.179434034852818, 56.690441800348765 ], [ 24.173697951099541, 56.685119126846189 ], [ 24.172457716750216, 56.678504543949543 ], [ 24.160210401988422, 56.67010712344495 ], [ 24.148583204850979, 56.668065904317984 ], [ 24.131013218385306, 56.668272609892995 ], [ 24.117990757267592, 56.671373196215995 ], [ 24.08713992726581, 56.682070218265949 ], [ 24.033913202132567, 56.68821971316919 ], [ 24.000685256219583, 56.695635280843533 ], [ 24.00812666231559, 56.709975491575676 ], [ 24.035563726984378, 56.720937509658313 ], [ 24.145576920538417, 56.728209824323926 ], [ 24.188165019300186, 56.717943050531346 ], [ 24.20540844664248, 56.713786152908597 ], [ 24.230455055756181, 56.699422996873807 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-087", "NAME_1": "Salaspils" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.258718295213157, 56.872992254289102 ], [ 24.236691522295928, 56.904123847237713 ], [ 24.234676140691306, 56.930401313469815 ], [ 24.296588244751661, 56.921175495952355 ], [ 24.325193670851206, 56.915811977940393 ], [ 24.335920705975809, 56.896145747328376 ], [ 24.353799097850072, 56.910448460827752 ], [ 24.405646432936521, 56.926539013064996 ], [ 24.428888342822745, 56.924751173427865 ], [ 24.457349888186798, 56.886838079813515 ], [ 24.439831576765812, 56.887484035859529 ], [ 24.435645785724432, 56.884021715229949 ], [ 24.437816196060567, 56.878233953733968 ], [ 24.444482455800653, 56.872368678771466 ], [ 24.448203158848685, 56.86554739029981 ], [ 24.447583042123654, 56.857563381844557 ], [ 24.442932163088813, 56.845290229560419 ], [ 24.444017367807248, 56.837667955411803 ], [ 24.420367069484655, 56.839829503828526 ], [ 24.386241081260891, 56.842108465932938 ], [ 24.34198507914806, 56.851135707746664 ], [ 24.310890957351774, 56.824632180730532 ], [ 24.259043622265324, 56.824632180730532 ], [ 24.217923321404157, 56.828207859105362 ], [ 24.189317894405292, 56.851449768092323 ], [ 24.176803020542934, 56.86754032032951 ], [ 24.197004022217811, 56.882058010468768 ], [ 24.258718295213157, 56.872992254289102 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-095", "NAME_1": "Stopinu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.234676140691306, 56.930401313469815 ], [ 24.246510044303079, 56.940969143411223 ], [ 24.258447299803038, 56.946007595174365 ], [ 24.299064975867907, 56.955541897240721 ], [ 24.320200636650043, 56.96902944635184 ], [ 24.352011258212997, 56.956932278801617 ], [ 24.371677488825014, 56.944417404939259 ], [ 24.405646432936521, 56.926539013064996 ], [ 24.353799097850072, 56.910448460827752 ], [ 24.335920705975809, 56.896145747328376 ], [ 24.325193670851206, 56.915811977940393 ], [ 24.296588244751661, 56.921175495952355 ], [ 24.234676140691306, 56.930401313469815 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-090", "NAME_1": "Sejas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.550005730979706, 57.316346747304522 ], [ 24.566283807151933, 57.310042222770335 ], [ 24.573725213247997, 57.295727851359231 ], [ 24.575430535590726, 57.29087026585006 ], [ 24.578066033920322, 57.28875153325663 ], [ 24.589124790276855, 57.285340888571113 ], [ 24.601527133770162, 57.278984687193542 ], [ 24.622146029715509, 57.265574653347528 ], [ 24.643281691396908, 57.237178452723413 ], [ 24.681573928394073, 57.223070786887263 ], [ 24.66031890779135, 57.210250916046903 ], [ 24.615817137151168, 57.203297514468716 ], [ 24.619989177558466, 57.176874588291582 ], [ 24.65753754751978, 57.179655948563152 ], [ 24.67422571094778, 57.169921186713395 ], [ 24.675616391083565, 57.149060981079401 ], [ 24.665881629233809, 57.125419415173837 ], [ 24.618598497422681, 57.132372816752081 ], [ 24.568534005340041, 57.137935538194483 ], [ 24.553236521148506, 57.124028735038053 ], [ 24.508734750508324, 57.105949890574948 ], [ 24.467014340139656, 57.182437309734041 ], [ 24.425293929771044, 57.181046628698937 ], [ 24.394698962287237, 57.178265268427367 ], [ 24.372448077416834, 57.182437309734041 ], [ 24.444763455269253, 57.235283162088251 ], [ 24.48787454577365, 57.238064523259141 ], [ 24.476749102888789, 57.270050170878676 ], [ 24.461287311660101, 57.294765899626555 ], [ 24.472232700378811, 57.293712469754666 ], [ 24.550005730979706, 57.316346747304522 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-061", "NAME_1": "Malpils" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.984036086296328, 57.079927070078213 ], [ 24.9893070820562, 57.060600084426312 ], [ 25.01070112525673, 57.049437975282331 ], [ 25.040363396853252, 57.037914130033073 ], [ 25.048114862211094, 57.029103299277836 ], [ 25.055711297038727, 57.0249433457588 ], [ 25.063152704034053, 57.024245713768664 ], [ 25.092143182062159, 57.016003322895017 ], [ 25.100721469720042, 57.009802151148335 ], [ 25.125991244700174, 57.001585597797089 ], [ 25.147540316632274, 56.989389959878736 ], [ 25.138083529831022, 56.980062364286653 ], [ 25.142579380134293, 56.950787665418375 ], [ 25.036332635442761, 56.933992825308621 ], [ 25.000159132837666, 56.939573880330272 ], [ 24.976594679301002, 56.935413926811236 ], [ 24.954838900894515, 56.940607408205324 ], [ 24.938250767259092, 56.939108792336867 ], [ 24.918820427920366, 56.934638780455316 ], [ 24.890450066617291, 56.922675686533694 ], [ 24.877272576768007, 56.921487128128433 ], [ 24.840323927806992, 56.926034654375769 ], [ 24.807406040256524, 56.933889472521116 ], [ 24.816057621761843, 56.966268633790378 ], [ 24.817845460499598, 56.989510542777282 ], [ 24.845279392829696, 56.984960700775673 ], [ 24.889781164369197, 57.011383627852126 ], [ 24.88004640162012, 57.037806554029203 ], [ 24.888390483334149, 57.055885398492308 ], [ 24.86613959846369, 57.093433767554302 ], [ 24.878655721484336, 57.104559210439163 ], [ 24.89951592621901, 57.087871046111843 ], [ 24.93567361514522, 57.080917644533656 ], [ 24.984036086296328, 57.079927070078213 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-091", "NAME_1": "Siguldas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.147540316632274, 56.989389959878736 ], [ 25.125991244700174, 57.001585597797089 ], [ 25.100721469720042, 57.009802151148335 ], [ 25.092143182062159, 57.016003322895017 ], [ 25.063152704034053, 57.024245713768664 ], [ 25.055711297038727, 57.0249433457588 ], [ 25.048114862211094, 57.029103299277836 ], [ 25.040363396853252, 57.037914130033073 ], [ 25.01070112525673, 57.049437975282331 ], [ 24.9893070820562, 57.060600084426312 ], [ 24.984036086296328, 57.079927070078213 ], [ 24.93567361514522, 57.080917644533656 ], [ 24.89951592621901, 57.087871046111843 ], [ 24.878655721484336, 57.104559210439163 ], [ 24.86613959846369, 57.093433767554302 ], [ 24.888390483334149, 57.055885398492308 ], [ 24.88004640162012, 57.037806554029203 ], [ 24.889781164369197, 57.011383627852126 ], [ 24.845279392829696, 56.984960700775673 ], [ 24.817845460499598, 56.989510542777282 ], [ 24.774937320900619, 56.998449738264753 ], [ 24.726665663289737, 56.989510542777282 ], [ 24.669454810191326, 57.012752451764186 ], [ 24.630122348067914, 57.061024109375126 ], [ 24.650584145042217, 57.073964242955412 ], [ 24.678397752254455, 57.060057439798982 ], [ 24.707602039602421, 57.062838800070551 ], [ 24.759057211820846, 57.078136284262087 ], [ 24.749322449971089, 57.098996488996761 ], [ 24.766010613399089, 57.115684653324081 ], [ 24.77991741745484, 57.135154177922971 ], [ 24.79660558088284, 57.142107579501157 ], [ 24.804949663496132, 57.165749145406721 ], [ 24.823028507959236, 57.182437309734041 ], [ 24.861967557157016, 57.189390711312228 ], [ 24.884218442926795, 57.199125473162042 ], [ 24.900371942311267, 57.218678290270873 ], [ 24.934375033680851, 57.20839468027026 ], [ 24.967396274918144, 57.185011094786148 ], [ 24.973132358671421, 57.177750555843431 ], [ 24.975664504213455, 57.170670884953324 ], [ 24.978248324800347, 57.158733629453423 ], [ 24.983570998302923, 57.145013536345573 ], [ 24.984036086296328, 57.140750230938352 ], [ 24.987446730082524, 57.124678860341078 ], [ 25.026374629485531, 57.119228071218458 ], [ 25.067082243150992, 57.114531038976224 ], [ 25.112486889958006, 57.10983400673399 ], [ 25.137537729482631, 57.0894801994516 ], [ 25.168851279562887, 57.067560714755132 ], [ 25.13284069724034, 57.051903940614352 ], [ 25.150063149694574, 57.03311581074604 ], [ 25.168851279562887, 57.014327680877727 ], [ 25.167285602148809, 56.998670905837628 ], [ 25.147540316632274, 56.989389959878736 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-059", "NAME_1": "Madona" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.953324130104477, 56.846677123550364 ], [ 26.94401980986629, 56.840251776897958 ], [ 26.928465204105862, 56.831105048459165 ], [ 26.907536247999417, 56.817979234554002 ], [ 26.782944369586971, 56.707391669190145 ], [ 26.772557406798853, 56.681010851069914 ], [ 26.74392281748402, 56.696495154128058 ], [ 26.711043590889005, 56.707454896026604 ], [ 26.707912236060849, 56.723111671066761 ], [ 26.682861396536225, 56.721545993652683 ], [ 26.648416491627756, 56.716848960511072 ], [ 26.626497007830608, 56.704323541198448 ], [ 26.607708877962352, 56.69023244357237 ], [ 26.57639532788204, 56.691798120986448 ], [ 26.535687714216635, 56.677707024259746 ], [ 26.388514030997726, 56.677707024259746 ], [ 26.375579054130014, 56.635923163123437 ], [ 26.350774367143288, 56.60998159457489 ], [ 26.342712844322307, 56.60383209877233 ], [ 26.291346470263363, 56.58670136187834 ], [ 26.284215121630552, 56.605795803533454 ], [ 26.281269565837761, 56.610911770561756 ], [ 26.261994256129981, 56.616570339949192 ], [ 26.224632196019002, 56.609878241787385 ], [ 26.198225538577731, 56.6271381698906 ], [ 26.204891799217137, 56.635251370454341 ], [ 26.19109419084424, 56.642331041344448 ], [ 26.170010206905488, 56.645018216517428 ], [ 26.156470981850305, 56.650134181747035 ], [ 26.131046177239284, 56.653906562537827 ], [ 26.09223717630465, 56.643881334056289 ], [ 26.058130731248241, 56.629954536272805 ], [ 26.039992303102281, 56.626466376322185 ], [ 26.022887403730692, 56.629308580226791 ], [ 26.002113478154456, 56.639695543014852 ], [ 25.983613315701916, 56.665637112462719 ], [ 25.93209191291146, 56.637835191041233 ], [ 25.929818149787764, 56.64984996180624 ], [ 25.925115593909538, 56.654268296844407 ], [ 25.916278923833261, 56.659022529566073 ], [ 25.913798456033874, 56.664810289263414 ], [ 25.91565880710823, 56.668866889095625 ], [ 25.926975945883157, 56.671476549003501 ], [ 25.933332147260785, 56.675920722463331 ], [ 25.93570926317193, 56.681553453429103 ], [ 25.906822137031952, 56.697263088820478 ], [ 25.83437177903437, 56.712275092221716 ], [ 25.825535108958093, 56.740774644734017 ], [ 25.826930372938364, 56.74932709397018 ], [ 25.837317335726425, 56.756587632912897 ], [ 25.843828565835622, 56.764442451058244 ], [ 25.850804884837544, 56.77033356444241 ], [ 25.842743361117186, 56.789247138044971 ], [ 25.827705519294284, 56.800951850447518 ], [ 25.81199588390291, 56.801804511169223 ], [ 25.806259800149633, 56.804750067861335 ], [ 25.797113070811577, 56.811829738751442 ], [ 25.785795932935912, 56.818702704066538 ], [ 25.765487095353137, 56.82818533018883 ], [ 25.757546009740565, 56.851497223518038 ], [ 25.748151944356721, 56.867153998558138 ], [ 25.768505751639111, 56.879679417870818 ], [ 25.774768461295423, 56.890639160668684 ], [ 25.807647688789814, 56.895336192910975 ], [ 25.835829883142594, 56.900033225153209 ], [ 25.85931504525314, 56.906295934809521 ], [ 25.890628594434077, 56.900033225153209 ], [ 25.915679433958701, 56.906295934809521 ], [ 25.946992984038957, 56.906295934809521 ], [ 25.953255693695269, 56.925084064677833 ], [ 25.943861629210801, 56.932912452647543 ], [ 25.920376467100255, 56.943872194546088 ], [ 25.886358269818288, 56.964223537686109 ], [ 25.917829217444421, 56.975230618098522 ], [ 25.920774774136476, 56.981896877838608 ], [ 25.923565301197698, 56.992955634195141 ], [ 25.919999626881236, 57.000086981928632 ], [ 25.911162956805015, 57.006753242568038 ], [ 25.904341668333302, 57.013962103768051 ], [ 25.895660027887971, 57.026261095373229 ], [ 25.896745232606406, 57.037552394827117 ], [ 25.899535759667572, 57.05016144479481 ], [ 25.906202020306978, 57.061426906726354 ], [ 25.907597284287249, 57.0700051952835 ], [ 25.923100213204236, 57.097445379700503 ], [ 25.949661900276453, 57.100390937291877 ], [ 26.022577345368177, 57.079513658028873 ], [ 26.038390334446376, 57.076852322176876 ], [ 26.048828973178558, 57.076774806911772 ], [ 26.052859734589049, 57.080262966862392 ], [ 26.056270379274565, 57.084422919482108 ], [ 26.064952019719897, 57.08871206331105 ], [ 26.077044304850745, 57.088221136895925 ], [ 26.089601677975054, 57.086128241824895 ], [ 26.116783481772245, 57.078066718104537 ], [ 26.183187696754771, 57.082614244351873 ], [ 26.186541637386654, 57.058166650270664 ], [ 26.175581894588731, 57.034681488160118 ], [ 26.177147572002809, 57.006499293807337 ], [ 26.186541637386654, 56.984579809110869 ], [ 26.172450539760575, 56.965791679242557 ], [ 26.170884862346497, 56.953266259030613 ], [ 26.18184460514442, 56.953266259030613 ], [ 26.200632734113356, 56.951700581616535 ], [ 26.222552218809824, 56.928215419505989 ], [ 26.242906026092214, 56.929781096920067 ], [ 26.267956865616839, 56.931346774334145 ], [ 26.286744995485151, 56.940740839717932 ], [ 26.325886932635797, 56.931346774334145 ], [ 26.358766159230868, 56.931346774334145 ], [ 26.352503449574499, 56.948569226788379 ], [ 26.374422934270967, 56.956397614758089 ], [ 26.39321106413928, 56.970488711484847 ], [ 26.405736483451903, 56.989276841353103 ], [ 26.383816998755492, 57.004933616393259 ], [ 26.375988611685045, 57.031550133331962 ], [ 26.369377883282652, 57.044632065717224 ], [ 26.46203372607556, 57.061271877994727 ], [ 26.497277052693789, 57.055794175760582 ], [ 26.512624952879264, 57.044063625835634 ], [ 26.532933791361359, 57.025253404121258 ], [ 26.544250929236966, 57.009233710367425 ], [ 26.559650506265825, 56.978899645202432 ], [ 26.568177117979587, 56.94841055040655 ], [ 26.473060614955386, 56.854628578346194 ], [ 26.504374164136323, 56.832709093649726 ], [ 26.516899584348323, 56.824880706579336 ], [ 26.512202552106089, 56.812355286367335 ], [ 26.535687714216635, 56.801395544468789 ], [ 26.56073855374126, 56.809223931539179 ], [ 26.577961005296117, 56.804526899296945 ], [ 26.60927455537643, 56.818617996922967 ], [ 26.620234297274976, 56.832709093649726 ], [ 26.6734673320517, 56.867153998558138 ], [ 26.679730041708012, 56.884376450113052 ], [ 26.712609268303083, 56.903164579981365 ], [ 26.726700365929105, 56.890639160668684 ], [ 26.8002872070889, 56.895336192910975 ], [ 26.837863465926205, 56.900033225153209 ], [ 26.861348628036751, 56.900033225153209 ], [ 26.883268112733219, 56.88594212842645 ], [ 26.884833790147297, 56.873416708214506 ], [ 26.909884630571241, 56.873416708214506 ], [ 26.933369792681788, 56.86558832114406 ], [ 26.953324130104477, 56.846677123550364 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-057", "NAME_1": "Lubanas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.985102573025301, 56.878233953733968 ], [ 26.983707309944407, 56.870792548537281 ], [ 26.980761753252295, 56.865624905564914 ], [ 26.953324130104477, 56.846677123550364 ], [ 26.933369792681788, 56.86558832114406 ], [ 26.909884630571241, 56.873416708214506 ], [ 26.884833790147297, 56.873416708214506 ], [ 26.883268112733219, 56.88594212842645 ], [ 26.861348628036751, 56.900033225153209 ], [ 26.837863465926205, 56.900033225153209 ], [ 26.8002872070889, 56.895336192910975 ], [ 26.726700365929105, 56.890639160668684 ], [ 26.712609268303083, 56.903164579981365 ], [ 26.679730041708012, 56.884376450113052 ], [ 26.6734673320517, 56.867153998558138 ], [ 26.620234297274976, 56.832709093649726 ], [ 26.60927455537643, 56.818617996922967 ], [ 26.577961005296117, 56.804526899296945 ], [ 26.56073855374126, 56.809223931539179 ], [ 26.535687714216635, 56.801395544468789 ], [ 26.512202552106089, 56.812355286367335 ], [ 26.516899584348323, 56.824880706579336 ], [ 26.504374164136323, 56.832709093649726 ], [ 26.473060614955386, 56.854628578346194 ], [ 26.568177117979587, 56.94841055040655 ], [ 26.603678827016211, 56.953604030901261 ], [ 26.635201449687145, 56.96499868404203 ], [ 26.691063674049303, 56.978202013212297 ], [ 26.697419875426874, 56.973473618912351 ], [ 26.703776075905182, 56.974197089324207 ], [ 26.725996942305017, 56.982620348250464 ], [ 26.734833612381294, 56.988201402372795 ], [ 26.757622917763399, 56.992955634195141 ], [ 26.78154910740534, 56.99254222304512 ], [ 26.795811801973059, 56.989131578359604 ], [ 26.860045606619451, 56.983007920978764 ], [ 26.869812452682538, 56.976264146872836 ], [ 26.878184034765354, 56.978357041943923 ], [ 26.90257531060206, 56.977969469215623 ], [ 26.911877068671743, 56.973835354118251 ], [ 26.917148065330935, 56.969339504714355 ], [ 26.914822625363854, 56.957867337207801 ], [ 26.911101922315822, 56.947712918416414 ], [ 26.911411980678338, 56.939315497012558 ], [ 26.92396935380259, 56.931719062184925 ], [ 26.953941684661004, 56.920711981772513 ], [ 26.962468296374766, 56.913270576575826 ], [ 26.971149936820098, 56.890920518966766 ], [ 26.985102573025301, 56.878233953733968 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-102", "NAME_1": "Varaklanu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.772557406798853, 56.681010851069914 ], [ 26.771317173348848, 56.677471015175172 ], [ 26.77751834509553, 56.663725084544978 ], [ 26.778138461820561, 56.655921943243072 ], [ 26.780928988881726, 56.644966538774725 ], [ 26.777208285833694, 56.632615872124745 ], [ 26.779688755431721, 56.621453762081444 ], [ 26.788525424608622, 56.615485134331436 ], [ 26.792401157287543, 56.610291652937406 ], [ 26.788835483870457, 56.607061876304499 ], [ 26.749716423673988, 56.595822251895356 ], [ 26.736538933824704, 56.587295641080971 ], [ 26.729252557359644, 56.578303941373747 ], [ 26.743670281558252, 56.558847765411997 ], [ 26.722276239257042, 56.543112290699639 ], [ 26.706411574234721, 56.546083685813414 ], [ 26.627760043591138, 56.543732408323933 ], [ 26.608536410726742, 56.544714260254864 ], [ 26.595927361658369, 56.547039700221944 ], [ 26.586625603588743, 56.551432196838391 ], [ 26.583369989433436, 56.563524481969239 ], [ 26.593756952221554, 56.595150458326941 ], [ 26.522546827673921, 56.599853014205223 ], [ 26.484512973994526, 56.60613170031769 ], [ 26.401365593946991, 56.633856106474127 ], [ 26.375579054130014, 56.635923163123437 ], [ 26.388514030997726, 56.677707024259746 ], [ 26.535687714216635, 56.677707024259746 ], [ 26.57639532788204, 56.691798120986448 ], [ 26.607708877962352, 56.69023244357237 ], [ 26.626497007830608, 56.704323541198448 ], [ 26.648416491627756, 56.716848960511072 ], [ 26.682861396536225, 56.721545993652683 ], [ 26.707912236060849, 56.723111671066761 ], [ 26.711043590889005, 56.707454896026604 ], [ 26.74392281748402, 56.696495154128058 ], [ 26.772557406798853, 56.681010851069914 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-008", "NAME_1": "Amatas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.503922960975842, 56.994818797449511 ], [ 25.488191358744189, 56.99445425096286 ], [ 25.47263675298376, 56.989028225572099 ], [ 25.468761021204159, 56.988356432003684 ], [ 25.446901890010224, 56.99158620953591 ], [ 25.447366978003629, 56.981922716260328 ], [ 25.450157505064794, 56.977426865957057 ], [ 25.452637973763444, 56.96962372555447 ], [ 25.426696405214898, 56.948668931925624 ], [ 25.395845575213116, 56.937300117206632 ], [ 25.37222944483301, 56.941434231404628 ], [ 25.371609328107979, 56.94804881520065 ], [ 25.370265740971149, 56.952983914176286 ], [ 25.367165154648148, 56.959572659550588 ], [ 25.361687453313323, 56.966833198493305 ], [ 25.354556104680455, 56.97362864854324 ], [ 25.343704053898932, 56.977426865957057 ], [ 25.327425977726648, 56.977245998803767 ], [ 25.284121128287438, 56.964817816888683 ], [ 25.274819370217756, 56.958539129876897 ], [ 25.261796909100042, 56.952854722967061 ], [ 25.256991001333631, 56.947221992001289 ], [ 25.247327508058049, 56.942674465753953 ], [ 25.246707391333018, 56.939625556274393 ], [ 25.248412712776428, 56.937145087575686 ], [ 25.251668328730375, 56.934871324452047 ], [ 25.23399498857782, 56.934302884570457 ], [ 25.142579380134293, 56.950787665418375 ], [ 25.138083529831022, 56.980062364286653 ], [ 25.147540316632274, 56.989389959878736 ], [ 25.167285602148809, 56.998670905837628 ], [ 25.168851279562887, 57.014327680877727 ], [ 25.150063149694574, 57.03311581074604 ], [ 25.13284069724034, 57.051903940614352 ], [ 25.168851279562887, 57.067560714755132 ], [ 25.137537729482631, 57.0894801994516 ], [ 25.112486889958006, 57.10983400673399 ], [ 25.137537729482631, 57.111399684148068 ], [ 25.173548311805121, 57.11766239380438 ], [ 25.195467796501589, 57.133319168844537 ], [ 25.212690248955823, 57.145844589056537 ], [ 25.189205086845277, 57.163067040611395 ], [ 25.178245344047355, 57.181855170479707 ], [ 25.171982634391043, 57.206906010004332 ], [ 25.159457214179099, 57.227259817286722 ], [ 25.139103407796028, 57.233522526943034 ], [ 25.10465850288756, 57.233522526943034 ], [ 25.090567405261538, 57.247613624569112 ], [ 25.131275019826262, 57.266401754437368 ], [ 25.165719924734731, 57.263270399609212 ], [ 25.206427538400135, 57.26483607702329 ], [ 25.231478377924759, 57.28518988340636 ], [ 25.231478377924759, 57.296149626204283 ], [ 25.287842767529696, 57.280492851164126 ], [ 25.319156316710632, 57.258573366467658 ], [ 25.317590639296554, 57.231956849528956 ], [ 25.359863931275413, 57.231956849528956 ], [ 25.369257995759881, 57.219431430216275 ], [ 25.364560963517647, 57.205340332590254 ], [ 25.380217738557747, 57.188117880136019 ], [ 25.41153128773874, 57.186552202721941 ], [ 25.444410514333754, 57.170895428581161 ], [ 25.458501611959832, 57.156804330955083 ], [ 25.4960778716964, 57.152107298712849 ], [ 25.508603291009081, 57.156804330955083 ], [ 25.53208845311957, 57.156804330955083 ], [ 25.563402002300563, 57.147410266470615 ], [ 25.541482518503415, 57.122359426945991 ], [ 25.564967680613961, 57.112965361562146 ], [ 25.594715552380819, 57.10983400673399 ], [ 25.618200714491365, 57.080086134967132 ], [ 25.616635037077288, 57.065995037341054 ], [ 25.58688716441111, 57.050338262300954 ], [ 25.547745228159727, 57.020590390534096 ], [ 25.528957098291414, 57.020590390534096 ], [ 25.507037613594946, 57.036247165574196 ], [ 25.492946516868244, 57.026853101089728 ], [ 25.510168968423159, 57.008064971221415 ], [ 25.50399548410428, 56.994820478282406 ], [ 25.503922960975842, 56.994818797449511 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-030", "NAME_1": "Erglu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.488191358744189, 56.99445425096286 ], [ 25.503922960975842, 56.994818797449511 ], [ 25.50399548410428, 56.994820478282406 ], [ 25.517181837671671, 56.995126044531276 ], [ 25.565137567045042, 56.982103583413618 ], [ 25.582345819204193, 56.981896877838608 ], [ 25.602706332731032, 56.984377346537258 ], [ 25.634022250726275, 56.994712633381312 ], [ 25.638518101029547, 56.994764309325376 ], [ 25.638518101029547, 56.992955634195141 ], [ 25.636967808317706, 56.99021678307804 ], [ 25.639138217754521, 56.984480699324763 ], [ 25.63355716273287, 56.974868882892622 ], [ 25.629526401322323, 56.963086656124233 ], [ 25.69732588118444, 56.986134344824109 ], [ 25.705439080848862, 56.99367910370762 ], [ 25.727143182411908, 56.998691717948418 ], [ 25.754893426090746, 56.99329153097932 ], [ 25.769517856763684, 56.983498847393889 ], [ 25.779439731558341, 56.981018377795863 ], [ 25.787501255278698, 56.981690172263598 ], [ 25.796027866093141, 56.984997464161609 ], [ 25.813701206245639, 56.986754462448459 ], [ 25.822589553165301, 56.984997464161609 ], [ 25.829720899999529, 56.982413641776134 ], [ 25.833906691040966, 56.979726468401793 ], [ 25.837472365357371, 56.976780910810362 ], [ 25.841813185130377, 56.973835354118251 ], [ 25.844913770554058, 56.970269679801845 ], [ 25.850339796844139, 56.9663681104999 ], [ 25.854060499892114, 56.962569892186764 ], [ 25.886358269818288, 56.964223537686109 ], [ 25.920376467100255, 56.943872194546088 ], [ 25.943861629210801, 56.932912452647543 ], [ 25.953255693695269, 56.925084064677833 ], [ 25.946992984038957, 56.906295934809521 ], [ 25.915679433958701, 56.906295934809521 ], [ 25.890628594434077, 56.900033225153209 ], [ 25.85931504525314, 56.906295934809521 ], [ 25.835829883142594, 56.900033225153209 ], [ 25.807647688789814, 56.895336192910975 ], [ 25.774768461295423, 56.890639160668684 ], [ 25.768505751639111, 56.879679417870818 ], [ 25.748151944356721, 56.867153998558138 ], [ 25.757546009740565, 56.851497223518038 ], [ 25.765487095353137, 56.82818533018883 ], [ 25.746366815276303, 56.825937405486854 ], [ 25.73970055463684, 56.818366808181622 ], [ 25.748382195981549, 56.814671943555311 ], [ 25.748847283974953, 56.808832506115209 ], [ 25.746366815276303, 56.801132718500128 ], [ 25.734274530145456, 56.789350490832476 ], [ 25.730243767835589, 56.782322495886433 ], [ 25.692209914156194, 56.77048859317398 ], [ 25.668800490250419, 56.788988756525839 ], [ 25.641618687352548, 56.792115180371241 ], [ 25.605186802329058, 56.802476304737638 ], [ 25.561726922359583, 56.802579658424463 ], [ 25.505399610903282, 56.81309581242175 ], [ 25.506484815621718, 56.826712550943455 ], [ 25.504779494178308, 56.833068753220346 ], [ 25.501058791130276, 56.841957099240688 ], [ 25.492067092322429, 56.846246243069629 ], [ 25.483953891758688, 56.853842677897262 ], [ 25.484884066846178, 56.857046617007768 ], [ 25.483643833396172, 56.867175198276755 ], [ 25.55568078024379, 56.873944810804346 ], [ 25.53408003056893, 56.884951891216758 ], [ 25.527723830090679, 56.890067857345684 ], [ 25.520747511988077, 56.894201972443057 ], [ 25.51594160332229, 56.897922675491031 ], [ 25.516251661684805, 56.903193671250904 ], [ 25.519197219276236, 56.907896227129129 ], [ 25.524003127042647, 56.913632310882406 ], [ 25.532219678595254, 56.921409613762648 ], [ 25.53159956187028, 56.932649238171791 ], [ 25.522762891794002, 56.943501288053994 ], [ 25.516871779309156, 56.956317044495961 ], [ 25.508345167595394, 56.964481920104504 ], [ 25.507725050870363, 56.972750149399872 ], [ 25.49268720904746, 56.981276760214257 ], [ 25.488191358744189, 56.99445425096286 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-021", "NAME_1": "Cesvaines" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.321318801121777, 57.097910467693907 ], [ 26.328915235949353, 57.071865546357856 ], [ 26.369377883282652, 57.044632065717224 ], [ 26.375988611685045, 57.031550133331962 ], [ 26.383816998755492, 57.004933616393259 ], [ 26.405736483451903, 56.989276841353103 ], [ 26.39321106413928, 56.970488711484847 ], [ 26.374422934270967, 56.956397614758089 ], [ 26.352503449574499, 56.948569226788379 ], [ 26.358766159230868, 56.931346774334145 ], [ 26.325886932635797, 56.931346774334145 ], [ 26.286744995485151, 56.940740839717932 ], [ 26.267956865616839, 56.931346774334145 ], [ 26.242906026092214, 56.929781096920067 ], [ 26.222552218809824, 56.928215419505989 ], [ 26.200632734113356, 56.951700581616535 ], [ 26.18184460514442, 56.953266259030613 ], [ 26.170884862346497, 56.953266259030613 ], [ 26.172450539760575, 56.965791679242557 ], [ 26.186541637386654, 56.984579809110869 ], [ 26.177147572002809, 57.006499293807337 ], [ 26.175581894588731, 57.034681488160118 ], [ 26.186541637386654, 57.058166650270664 ], [ 26.183187696754771, 57.082614244351873 ], [ 26.21517540921775, 57.08912547536039 ], [ 26.27165774940562, 57.087110093755769 ], [ 26.321318801121777, 57.097910467693907 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-067", "NAME_1": "Ogre" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.468761021204159, 56.988356432003684 ], [ 25.47263675298376, 56.989028225572099 ], [ 25.488191358744189, 56.99445425096286 ], [ 25.49268720904746, 56.981276760214257 ], [ 25.507725050870363, 56.972750149399872 ], [ 25.508345167595394, 56.964481920104504 ], [ 25.516871779309156, 56.956317044495961 ], [ 25.522762891794002, 56.943501288053994 ], [ 25.53159956187028, 56.932649238171791 ], [ 25.532219678595254, 56.921409613762648 ], [ 25.524003127042647, 56.913632310882406 ], [ 25.519197219276236, 56.907896227129129 ], [ 25.516251661684805, 56.903193671250904 ], [ 25.51594160332229, 56.897922675491031 ], [ 25.520747511988077, 56.894201972443057 ], [ 25.527723830090679, 56.890067857345684 ], [ 25.53408003056893, 56.884951891216758 ], [ 25.55568078024379, 56.873944810804346 ], [ 25.483643833396172, 56.867175198276755 ], [ 25.484884066846178, 56.857046617007768 ], [ 25.483953891758688, 56.853842677897262 ], [ 25.492067092322429, 56.846246243069629 ], [ 25.501058791130276, 56.841957099240688 ], [ 25.504779494178308, 56.833068753220346 ], [ 25.506484815621718, 56.826712550943455 ], [ 25.505399610903282, 56.81309581242175 ], [ 25.437445103208915, 56.775191148152942 ], [ 25.391194696178275, 56.761264350369458 ], [ 25.378017206328991, 56.760049954441797 ], [ 25.365098097099462, 56.762840481503019 ], [ 25.353470899962019, 56.762530423140504 ], [ 25.353935987955481, 56.759326484029998 ], [ 25.356106398291615, 56.753383693802391 ], [ 25.326030714645754, 56.757982896893168 ], [ 25.29528323743142, 56.754520576263531 ], [ 25.26815310957835, 56.745218818193905 ], [ 25.257094354121136, 56.736123765699176 ], [ 25.293112827095285, 56.723359686999913 ], [ 25.298073765391962, 56.719328924690103 ], [ 25.296523471780802, 56.716280016109806 ], [ 25.295593295793935, 56.713024400155916 ], [ 25.278385043634842, 56.696849676771137 ], [ 25.217716913304912, 56.708218492389506 ], [ 25.215546502069401, 56.70522125885401 ], [ 25.200456984302377, 56.697805691179667 ], [ 25.176298666150501, 56.703333667314894 ], [ 25.153483106859881, 56.708554389173685 ], [ 25.148987258355248, 56.714523016923692 ], [ 25.097465854665415, 56.737157294473548 ], [ 25.074967533025188, 56.753948557080207 ], [ 25.059384292850837, 56.769531797254615 ], [ 25.041574875380149, 56.789567392021524 ], [ 25.005956041338209, 56.79401974571465 ], [ 24.968111029999989, 56.798472100307151 ], [ 24.943623081539954, 56.809602985889057 ], [ 24.923587487672421, 56.800698277603374 ], [ 24.885742476334201, 56.814055340481559 ], [ 24.843445110403479, 56.827412403359688 ], [ 24.816730984647222, 56.834090934349092 ], [ 24.805600099065316, 56.807376808592835 ], [ 24.778885973309002, 56.800698277603374 ], [ 24.783338327002184, 56.780662682836521 ], [ 24.761076555838372, 56.758400911672709 ], [ 24.724864128776517, 56.736436264821748 ], [ 24.704112175436535, 56.753037828033314 ], [ 24.697520378662546, 56.756903387581247 ], [ 24.678635353139043, 56.760212482619977 ], [ 24.661062045477024, 56.76329173342674 ], [ 24.652842643972804, 56.767523505005727 ], [ 24.645762565689836, 56.773138738761759 ], [ 24.625417514206902, 56.783148504300016 ], [ 24.618418815575865, 56.784857488682121 ], [ 24.596202019507587, 56.806423243937502 ], [ 24.587657097596946, 56.812201238796092 ], [ 24.616611454355109, 56.824632180730532 ], [ 24.666670950703804, 56.853237607729397 ], [ 24.700639894815254, 56.838934894229965 ], [ 24.736396678563835, 56.865752481591699 ], [ 24.702427734452385, 56.874691677079227 ], [ 24.693273497573841, 56.895471531885676 ], [ 24.715887079025435, 56.897147529135111 ], [ 24.738056267682566, 56.909394842997585 ], [ 24.760277134082457, 56.914975898019236 ], [ 24.807406040256524, 56.933889472521116 ], [ 24.840323927806992, 56.926034654375769 ], [ 24.877272576768007, 56.921487128128433 ], [ 24.890450066617291, 56.922675686533694 ], [ 24.918820427920366, 56.934638780455316 ], [ 24.938250767259092, 56.939108792336867 ], [ 24.954838900894515, 56.940607408205324 ], [ 24.976594679301002, 56.935413926811236 ], [ 25.000159132837666, 56.939573880330272 ], [ 25.036332635442761, 56.933992825308621 ], [ 25.142579380134293, 56.950787665418375 ], [ 25.23399498857782, 56.934302884570457 ], [ 25.251668328730375, 56.934871324452047 ], [ 25.248412712776428, 56.937145087575686 ], [ 25.246707391333018, 56.939625556274393 ], [ 25.247327508058049, 56.942674465753953 ], [ 25.256991001333631, 56.947221992001289 ], [ 25.261796909100042, 56.952854722967061 ], [ 25.274819370217756, 56.958539129876897 ], [ 25.284121128287438, 56.964817816888683 ], [ 25.327425977726648, 56.977245998803767 ], [ 25.343704053898932, 56.977426865957057 ], [ 25.354556104680455, 56.97362864854324 ], [ 25.361687453313323, 56.966833198493305 ], [ 25.367165154648148, 56.959572659550588 ], [ 25.370265740971149, 56.952983914176286 ], [ 25.371609328107979, 56.94804881520065 ], [ 25.37222944483301, 56.941434231404628 ], [ 25.395845575213116, 56.937300117206632 ], [ 25.426696405214898, 56.948668931925624 ], [ 25.452637973763444, 56.96962372555447 ], [ 25.450157505064794, 56.977426865957057 ], [ 25.447366978003629, 56.981922716260328 ], [ 25.446901890010224, 56.99158620953591 ], [ 25.468761021204159, 56.988356432003684 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-080", "NAME_1": "Ropazu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.807406040256524, 56.933889472521116 ], [ 24.760277134082457, 56.914975898019236 ], [ 24.738056267682566, 56.909394842997585 ], [ 24.715887079025435, 56.897147529135111 ], [ 24.693273497573841, 56.895471531885676 ], [ 24.574345330872291, 56.886657213559545 ], [ 24.520188428852919, 56.900067247405502 ], [ 24.507010939003635, 56.896475735566696 ], [ 24.511351759675961, 56.877872219427331 ], [ 24.507786086258875, 56.873014634817537 ], [ 24.499879592169407, 56.87035329896554 ], [ 24.491818068449106, 56.871619370837266 ], [ 24.485616895803105, 56.875365912306961 ], [ 24.479725783318202, 56.880481879335207 ], [ 24.469287143686699, 56.884176743961518 ], [ 24.457349888186798, 56.886838079813515 ], [ 24.428888342822745, 56.924751173427865 ], [ 24.405646432936521, 56.926539013064996 ], [ 24.371677488825014, 56.944417404939259 ], [ 24.395915417662366, 56.968056472528133 ], [ 24.401278935674327, 56.994874059889924 ], [ 24.451338432023022, 57.00202541663964 ], [ 24.53179119410828, 57.00202541663964 ], [ 24.521064159883053, 57.052084912988335 ], [ 24.546093907607712, 57.061024109375126 ], [ 24.565530100633623, 57.060001151232143 ], [ 24.580062851719219, 57.059236269738051 ], [ 24.630122348067914, 57.061024109375126 ], [ 24.669454810191326, 57.012752451764186 ], [ 24.726665663289737, 56.989510542777282 ], [ 24.774937320900619, 56.998449738264753 ], [ 24.817845460499598, 56.989510542777282 ], [ 24.816057621761843, 56.966268633790378 ], [ 24.807406040256524, 56.933889472521116 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-035", "NAME_1": "Ikskiles" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.512695346812791, 56.817100735410577 ], [ 24.505305616660849, 56.818521836913192 ], [ 24.475850050639281, 56.832216092498641 ], [ 24.457763299336762, 56.837538764202577 ], [ 24.452182245214431, 56.837926336930877 ], [ 24.444017367807248, 56.837667955411803 ], [ 24.442932163088813, 56.845290229560419 ], [ 24.447583042123654, 56.857563381844557 ], [ 24.448203158848685, 56.86554739029981 ], [ 24.444482455800653, 56.872368678771466 ], [ 24.437816196060567, 56.878233953733968 ], [ 24.435645785724432, 56.884021715229949 ], [ 24.439831576765812, 56.887484035859529 ], [ 24.457349888186798, 56.886838079813515 ], [ 24.469287143686699, 56.884176743961518 ], [ 24.479725783318202, 56.880481879335207 ], [ 24.485616895803105, 56.875365912306961 ], [ 24.491818068449106, 56.871619370837266 ], [ 24.499879592169407, 56.87035329896554 ], [ 24.507786086258875, 56.873014634817537 ], [ 24.511351759675961, 56.877872219427331 ], [ 24.507010939003635, 56.896475735566696 ], [ 24.520188428852919, 56.900067247405502 ], [ 24.574345330872291, 56.886657213559545 ], [ 24.693273497573841, 56.895471531885676 ], [ 24.702427734452385, 56.874691677079227 ], [ 24.736396678563835, 56.865752481591699 ], [ 24.700639894815254, 56.838934894229965 ], [ 24.666670950703804, 56.853237607729397 ], [ 24.616611454355109, 56.824632180730532 ], [ 24.587657097596946, 56.812201238796092 ], [ 24.565928581239007, 56.816433009475759 ], [ 24.525563998679559, 56.814276434309988 ], [ 24.512695346812791, 56.817100735410577 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-013", "NAME_1": "Baldones" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.525459426411373, 56.75240184187146 ], [ 24.521893752094968, 56.713644517780267 ], [ 24.482361280748478, 56.704704494916484 ], [ 24.443397251082274, 56.684240627702764 ], [ 24.42789432126591, 56.677677720750182 ], [ 24.414975212935701, 56.674267076064666 ], [ 24.383659294940514, 56.670856432278526 ], [ 24.376062860112881, 56.66840180110222 ], [ 24.372962273789881, 56.666308906031134 ], [ 24.374047479407636, 56.659590969447663 ], [ 24.355358623901338, 56.661563541524174 ], [ 24.335858595197976, 56.663621730858154 ], [ 24.294569125564692, 56.675455634469927 ], [ 24.274725375975322, 56.683956406862649 ], [ 24.263408237200395, 56.690441800348765 ], [ 24.257827183078007, 56.701190497443463 ], [ 24.245683221103775, 56.70367096614217 ], [ 24.230455055756181, 56.699422996873807 ], [ 24.20540844664248, 56.713786152908597 ], [ 24.188165019300186, 56.717943050531346 ], [ 24.194681412417253, 56.740603740270387 ], [ 24.228650356528703, 56.751330775394933 ], [ 24.253680104253363, 56.738815900633256 ], [ 24.269770656490607, 56.745967257382972 ], [ 24.26261930064021, 56.762057809620217 ], [ 24.253680104253363, 56.78529971950644 ], [ 24.294800405114586, 56.78887539788127 ], [ 24.346647741100355, 56.787087558244195 ], [ 24.414585629323312, 56.776360523119592 ], [ 24.466432964409762, 56.763845649257291 ], [ 24.525459426411373, 56.75240184187146 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-051", "NAME_1": "Keguma" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.521893752094968, 56.713644517780267 ], [ 24.525459426411373, 56.75240184187146 ], [ 24.53310753808239, 56.759223131242493 ], [ 24.537603386587023, 56.770385240386531 ], [ 24.536983269861992, 56.777490749698302 ], [ 24.522978956813404, 56.795293281060026 ], [ 24.512695346812791, 56.817100735410577 ], [ 24.525563998679559, 56.814276434309988 ], [ 24.565928581239007, 56.816433009475759 ], [ 24.587657097596946, 56.812201238796092 ], [ 24.596202019507587, 56.806423243937502 ], [ 24.618418815575865, 56.784857488682121 ], [ 24.625417514206902, 56.783148504300016 ], [ 24.645762565689836, 56.773138738761759 ], [ 24.652842643972804, 56.767523505005727 ], [ 24.661062045477024, 56.76329173342674 ], [ 24.678635353139043, 56.760212482619977 ], [ 24.697520378662546, 56.756903387581247 ], [ 24.704112175436535, 56.753037828033314 ], [ 24.724864128776517, 56.736436264821748 ], [ 24.761076555838372, 56.758400911672709 ], [ 24.783338327002184, 56.780662682836521 ], [ 24.778885973309002, 56.800698277603374 ], [ 24.805600099065316, 56.807376808592835 ], [ 24.816730984647222, 56.834090934349092 ], [ 24.843445110403479, 56.827412403359688 ], [ 24.885742476334201, 56.814055340481559 ], [ 24.923587487672421, 56.800698277603374 ], [ 24.903551892905512, 56.787341214725245 ], [ 24.872385413456072, 56.767305619958393 ], [ 24.852349818689163, 56.762853266265211 ], [ 24.845671287699759, 56.738365317805119 ], [ 24.818957161943445, 56.729460608620172 ], [ 24.799754982406512, 56.715212373352301 ], [ 24.817773611862663, 56.711897095474569 ], [ 24.834564649638878, 56.708807684127294 ], [ 24.852389025533057, 56.701708144515237 ], [ 24.868174675221042, 56.695420639650763 ], [ 24.878173388990717, 56.682521200393069 ], [ 24.905202670466849, 56.647650457502607 ], [ 24.919688347439262, 56.640204168987168 ], [ 24.938080274684921, 56.638210354024579 ], [ 24.957106048605226, 56.631887675775602 ], [ 24.975142934298958, 56.625893627788685 ], [ 24.991709831343599, 56.620388087939887 ], [ 25.024343703099419, 56.624554348404445 ], [ 25.026669142167179, 56.620058499000493 ], [ 25.019382764802742, 56.608121243500534 ], [ 25.049510125292045, 56.611996975280135 ], [ 25.056796501757105, 56.601325792551279 ], [ 25.042223747927608, 56.590034492198015 ], [ 24.968946566730665, 56.581559557327694 ], [ 24.949987336346453, 56.578568175680743 ], [ 24.732475212660916, 56.544249173160779 ], [ 24.657079298870542, 56.543577378693044 ], [ 24.664365676234979, 56.556832383807432 ], [ 24.671341994337524, 56.566780097023809 ], [ 24.681418897863807, 56.571327623271145 ], [ 24.697231886942006, 56.576236883825118 ], [ 24.697128534154501, 56.578872382154657 ], [ 24.691185743926951, 56.581662910115199 ], [ 24.673667433405285, 56.586546332247394 ], [ 24.666070997678389, 56.587166449871745 ], [ 24.661420118643548, 56.588329168955966 ], [ 24.660334913925112, 56.5904995792921 ], [ 24.662970412254708, 56.593961899921737 ], [ 24.662505324261303, 56.596855781569047 ], [ 24.656769239608707, 56.599801337361782 ], [ 24.629897495073294, 56.601454982861128 ], [ 24.617185093217472, 56.607191067513725 ], [ 24.599666781796543, 56.620678615725524 ], [ 24.59284549332483, 56.643028673334584 ], [ 24.58974490700183, 56.661037910271318 ], [ 24.634083286114731, 56.676850898450198 ], [ 24.600907017045188, 56.707029933984245 ], [ 24.556051873095441, 56.706978258040124 ], [ 24.521893752094968, 56.713644517780267 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-034", "NAME_1": "Iecavas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.245683221103775, 56.70367096614217 ], [ 24.257827183078007, 56.701190497443463 ], [ 24.263408237200395, 56.690441800348765 ], [ 24.274725375975322, 56.683956406862649 ], [ 24.294569125564692, 56.675455634469927 ], [ 24.335858595197976, 56.663621730858154 ], [ 24.355358623901338, 56.661563541524174 ], [ 24.368101810450185, 56.619030677323849 ], [ 24.309103118614019, 56.611879320574133 ], [ 24.321617992476376, 56.56360766296325 ], [ 24.34843557983811, 56.565395501701005 ], [ 24.387768041961522, 56.552880627838704 ], [ 24.380616685211862, 56.529638718851743 ], [ 24.34485990146328, 56.536790075601459 ], [ 24.300163923126547, 56.535002235964384 ], [ 24.251892265515608, 56.518911683727197 ], [ 24.234013873641345, 56.501033291852934 ], [ 24.194681412417253, 56.509972488239725 ], [ 24.173227342168104, 56.517123844989442 ], [ 24.1499854331812, 56.524275201739158 ], [ 24.105289453945147, 56.529638718851743 ], [ 24.078871697970442, 56.535464179028622 ], [ 24.088380160715815, 56.550760403269976 ], [ 24.10527835541177, 56.5639637324403 ], [ 24.11023929190975, 56.574944973531672 ], [ 24.106673617593344, 56.580370998922433 ], [ 24.094271274999301, 56.581766262003384 ], [ 24.081558872244159, 56.581895454111873 ], [ 24.055617302796293, 56.58574534836913 ], [ 24.040889520235169, 56.592411607209897 ], [ 24.026575147924746, 56.602746894053894 ], [ 24.02647179513724, 56.607837023559739 ], [ 24.030037468554326, 56.608793037069006 ], [ 24.039339226624008, 56.608793037069006 ], [ 24.049106072687096, 56.610989284927541 ], [ 24.057477654769912, 56.619076647069562 ], [ 24.055152214802831, 56.623779202048524 ], [ 24.051896599748261, 56.627964993089904 ], [ 24.050346307036421, 56.631840724869505 ], [ 24.050966423761452, 56.635251370454341 ], [ 24.046160515994984, 56.637757677574712 ], [ 24.036393669931897, 56.641478379723424 ], [ 24.009987013389946, 56.658867499035807 ], [ 24.006731398335376, 56.664758613319293 ], [ 24.00890180777219, 56.666205553243685 ], [ 24.017738477848468, 56.662743231714728 ], [ 24.023474561601745, 56.658505763829908 ], [ 24.034533318857541, 56.659487617559478 ], [ 24.042129753685174, 56.661244614947009 ], [ 24.033913202132567, 56.68821971316919 ], [ 24.08713992726581, 56.682070218265949 ], [ 24.117990757267592, 56.671373196215995 ], [ 24.131013218385306, 56.668272609892995 ], [ 24.148583204850979, 56.668065904317984 ], [ 24.160210401988422, 56.67010712344495 ], [ 24.172457716750216, 56.678504543949543 ], [ 24.173697951099541, 56.685119126846189 ], [ 24.179434034852818, 56.690441800348765 ], [ 24.184705030612633, 56.692560532942196 ], [ 24.195867139756672, 56.691527005067201 ], [ 24.209096307348659, 56.693464871406661 ], [ 24.230455055756181, 56.699422996873807 ], [ 24.245683221103775, 56.70367096614217 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-072", "NAME_1": "Plavinu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.765487095353137, 56.82818533018883 ], [ 25.785795932935912, 56.818702704066538 ], [ 25.797113070811577, 56.811829738751442 ], [ 25.806259800149633, 56.804750067861335 ], [ 25.81199588390291, 56.801804511169223 ], [ 25.827705519294284, 56.800951850447518 ], [ 25.842743361117186, 56.789247138044971 ], [ 25.850804884837544, 56.77033356444241 ], [ 25.843828565835622, 56.764442451058244 ], [ 25.837317335726425, 56.756587632912897 ], [ 25.826930372938364, 56.74932709397018 ], [ 25.825535108958093, 56.740774644734017 ], [ 25.83437177903437, 56.712275092221716 ], [ 25.906822137031952, 56.697263088820478 ], [ 25.93570926317193, 56.681553453429103 ], [ 25.933332147260785, 56.675920722463331 ], [ 25.926975945883157, 56.671476549003501 ], [ 25.91565880710823, 56.668866889095625 ], [ 25.913798456033874, 56.664810289263414 ], [ 25.916278923833261, 56.659022529566073 ], [ 25.925115593909538, 56.654268296844407 ], [ 25.929818149787764, 56.64984996180624 ], [ 25.93209191291146, 56.637835191041233 ], [ 25.883257684394607, 56.623572496473514 ], [ 25.830961135248174, 56.613237210528837 ], [ 25.788276400735299, 56.609309801006475 ], [ 25.756908806795991, 56.612255356799267 ], [ 25.744041375309223, 56.617267971040008 ], [ 25.711330194233085, 56.605847480376895 ], [ 25.688334180577954, 56.600783190192033 ], [ 25.646734652582154, 56.596390693575643 ], [ 25.601466099281026, 56.578924058998098 ], [ 25.579400261612761, 56.576288561567821 ], [ 25.569788446079883, 56.576701971818522 ], [ 25.509043815819439, 56.578802801607992 ], [ 25.493581576728388, 56.589056707900738 ], [ 25.498789909526693, 56.602362371825961 ], [ 25.495534701864983, 56.611843166029246 ], [ 25.520202960797974, 56.61369939730929 ], [ 25.53133384637988, 56.642639700361826 ], [ 25.582535920596229, 56.676032357107545 ], [ 25.5691788577181, 56.711651192048862 ], [ 25.615928578241267, 56.716103545741987 ], [ 25.615928578241267, 56.738365317805119 ], [ 25.595892983474414, 56.751722380683304 ], [ 25.600345338066859, 56.765079443561433 ], [ 25.627059463823173, 56.762853266265211 ], [ 25.655999766875709, 56.753948557080207 ], [ 25.692209914156194, 56.77048859317398 ], [ 25.730243767835589, 56.782322495886433 ], [ 25.734274530145456, 56.789350490832476 ], [ 25.746366815276303, 56.801132718500128 ], [ 25.748847283974953, 56.808832506115209 ], [ 25.748382195981549, 56.814671943555311 ], [ 25.73970055463684, 56.818366808181622 ], [ 25.746366815276303, 56.825937405486854 ], [ 25.765487095353137, 56.82818533018883 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-046", "NAME_1": "Kokneses" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.505399610903282, 56.81309581242175 ], [ 25.561726922359583, 56.802579658424463 ], [ 25.605186802329058, 56.802476304737638 ], [ 25.641618687352548, 56.792115180371241 ], [ 25.668800490250419, 56.788988756525839 ], [ 25.692209914156194, 56.77048859317398 ], [ 25.655999766875709, 56.753948557080207 ], [ 25.627059463823173, 56.762853266265211 ], [ 25.600345338066859, 56.765079443561433 ], [ 25.595892983474414, 56.751722380683304 ], [ 25.615928578241267, 56.738365317805119 ], [ 25.615928578241267, 56.716103545741987 ], [ 25.5691788577181, 56.711651192048862 ], [ 25.582535920596229, 56.676032357107545 ], [ 25.53133384637988, 56.642639700361826 ], [ 25.520202960797974, 56.61369939730929 ], [ 25.495534701864983, 56.611843166029246 ], [ 25.487233919809512, 56.613470769860101 ], [ 25.464772982986744, 56.612901108699191 ], [ 25.423106316103599, 56.627305406019616 ], [ 25.398448112490371, 56.630723374783884 ], [ 25.366709831493495, 56.614365952326807 ], [ 25.330170117756722, 56.597601629811322 ], [ 25.293373786970676, 56.591109263881378 ], [ 25.293132892768767, 56.631508814779977 ], [ 25.293132892768767, 56.676032357107545 ], [ 25.278385043634842, 56.696849676771137 ], [ 25.295593295793935, 56.713024400155916 ], [ 25.296523471780802, 56.716280016109806 ], [ 25.298073765391962, 56.719328924690103 ], [ 25.293112827095285, 56.723359686999913 ], [ 25.257094354121136, 56.736123765699176 ], [ 25.26815310957835, 56.745218818193905 ], [ 25.29528323743142, 56.754520576263531 ], [ 25.326030714645754, 56.757982896893168 ], [ 25.356106398291615, 56.753383693802391 ], [ 25.353935987955481, 56.759326484029998 ], [ 25.353470899962019, 56.762530423140504 ], [ 25.365098097099462, 56.762840481503019 ], [ 25.378017206328991, 56.760049954441797 ], [ 25.391194696178275, 56.761264350369458 ], [ 25.437445103208915, 56.775191148152942 ], [ 25.505399610903282, 56.81309581242175 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-002", "NAME_1": "Aizkraukles" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.217716913304912, 56.708218492389506 ], [ 25.278385043634842, 56.696849676771137 ], [ 25.293132892768767, 56.676032357107545 ], [ 25.293132892768767, 56.631508814779977 ], [ 25.293373786970676, 56.591109263881378 ], [ 25.235362175723822, 56.585638739136471 ], [ 25.215342643747988, 56.5888939476975 ], [ 25.188987085785357, 56.601004367657424 ], [ 25.163096550165619, 56.612901108699191 ], [ 25.13860087922717, 56.619146840953931 ], [ 25.179597858754164, 56.640413523065604 ], [ 25.181824035151067, 56.660449117832513 ], [ 25.168466973172258, 56.680484711700046 ], [ 25.176298666150501, 56.703333667314894 ], [ 25.200456984302377, 56.697805691179667 ], [ 25.215546502069401, 56.70522125885401 ], [ 25.217716913304912, 56.708218492389506 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-092", "NAME_1": "Skriveru" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.097465854665415, 56.737157294473548 ], [ 25.148987258355248, 56.714523016923692 ], [ 25.153483106859881, 56.708554389173685 ], [ 25.176298666150501, 56.703333667314894 ], [ 25.168466973172258, 56.680484711700046 ], [ 25.181824035151067, 56.660449117832513 ], [ 25.179597858754164, 56.640413523065604 ], [ 25.13860087922717, 56.619146840953931 ], [ 25.118093295069514, 56.624375717865064 ], [ 25.080179878598528, 56.621497567158997 ], [ 25.049510125292045, 56.611996975280135 ], [ 25.019382764802742, 56.608121243500534 ], [ 25.026669142167179, 56.620058499000493 ], [ 25.024343703099419, 56.624554348404445 ], [ 25.021243116776418, 56.632124945709677 ], [ 25.01488691629811, 56.640935777364234 ], [ 25.017367384996817, 56.671683255477831 ], [ 25.016902297003412, 56.681501777485039 ], [ 25.019537795332951, 56.687547918701455 ], [ 25.024498731830988, 56.69054515223695 ], [ 25.032715285182235, 56.692818915360647 ], [ 25.041758660833523, 56.694162503396797 ], [ 25.055246209045265, 56.701371365496072 ], [ 25.053695916333481, 56.706099758896755 ], [ 25.046564568599933, 56.708218492389506 ], [ 25.041913689565092, 56.7130760769993 ], [ 25.036125928968431, 56.716796780047332 ], [ 25.036642693805277, 56.720775865513758 ], [ 25.028684522872425, 56.727132065992009 ], [ 25.097465854665415, 56.737157294473548 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-053", "NAME_1": "Lielvardes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.097465854665415, 56.737157294473548 ], [ 25.028684522872425, 56.727132065992009 ], [ 25.036642693805277, 56.720775865513758 ], [ 25.036125928968431, 56.716796780047332 ], [ 25.041913689565092, 56.7130760769993 ], [ 25.046564568599933, 56.708218492389506 ], [ 25.053695916333481, 56.706099758896755 ], [ 25.055246209045265, 56.701371365496072 ], [ 25.041758660833523, 56.694162503396797 ], [ 25.032715285182235, 56.692818915360647 ], [ 25.024498731830988, 56.69054515223695 ], [ 25.019537795332951, 56.687547918701455 ], [ 25.016902297003412, 56.681501777485039 ], [ 25.017367384996817, 56.671683255477831 ], [ 25.01488691629811, 56.640935777364234 ], [ 25.021243116776418, 56.632124945709677 ], [ 25.024343703099419, 56.624554348404445 ], [ 24.991709831343599, 56.620388087939887 ], [ 24.975142934298958, 56.625893627788685 ], [ 24.957106048605226, 56.631887675775602 ], [ 24.938080274684921, 56.638210354024579 ], [ 24.919688347439262, 56.640204168987168 ], [ 24.905202670466849, 56.647650457502607 ], [ 24.878173388990717, 56.682521200393069 ], [ 24.868174675221042, 56.695420639650763 ], [ 24.852389025533057, 56.701708144515237 ], [ 24.834564649638878, 56.708807684127294 ], [ 24.817773611862663, 56.711897095474569 ], [ 24.799754982406512, 56.715212373352301 ], [ 24.818957161943445, 56.729460608620172 ], [ 24.845671287699759, 56.738365317805119 ], [ 24.852349818689163, 56.762853266265211 ], [ 24.872385413456072, 56.767305619958393 ], [ 24.903551892905512, 56.787341214725245 ], [ 24.923587487672421, 56.800698277603374 ], [ 24.943623081539954, 56.809602985889057 ], [ 24.968111029999989, 56.798472100307151 ], [ 25.005956041338209, 56.79401974571465 ], [ 25.041574875380149, 56.789567392021524 ], [ 25.059384292850837, 56.769531797254615 ], [ 25.074967533025188, 56.753948557080207 ], [ 25.097465854665415, 56.737157294473548 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-038", "NAME_1": "Jaunjelgavas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.949987336346453, 56.578568175680743 ], [ 24.968946566730665, 56.581559557327694 ], [ 25.042223747927608, 56.590034492198015 ], [ 25.056796501757105, 56.601325792551279 ], [ 25.049510125292045, 56.611996975280135 ], [ 25.080179878598528, 56.621497567158997 ], [ 25.118093295069514, 56.624375717865064 ], [ 25.13860087922717, 56.619146840953931 ], [ 25.163096550165619, 56.612901108699191 ], [ 25.188987085785357, 56.601004367657424 ], [ 25.215342643747988, 56.5888939476975 ], [ 25.235362175723822, 56.585638739136471 ], [ 25.293373786970676, 56.591109263881378 ], [ 25.330170117756722, 56.597601629811322 ], [ 25.366709831493495, 56.614365952326807 ], [ 25.398448112490371, 56.630723374783884 ], [ 25.423106316103599, 56.627305406019616 ], [ 25.464772982986744, 56.612901108699191 ], [ 25.487233919809512, 56.613470769860101 ], [ 25.495534701864983, 56.611843166029246 ], [ 25.498789909526693, 56.602362371825961 ], [ 25.493581576728388, 56.589056707900738 ], [ 25.509043815819439, 56.578802801607992 ], [ 25.569788446079883, 56.576701971818522 ], [ 25.560331659278631, 56.573859767913916 ], [ 25.580175408868001, 56.569157212935011 ], [ 25.599450717676461, 56.57029409449683 ], [ 25.607202183034303, 56.567710273010675 ], [ 25.605806919054032, 56.562025865201463 ], [ 25.598675571320541, 56.551819770466011 ], [ 25.575989617826565, 56.539701646913443 ], [ 25.558626336036582, 56.510659492041896 ], [ 25.566067743031908, 56.498308824492653 ], [ 25.580020379237112, 56.48838694879862 ], [ 25.594644809910051, 56.467147936128299 ], [ 25.590717401287009, 56.460843410694793 ], [ 25.583431023922572, 56.458569648470473 ], [ 25.573819206591111, 56.452859402239596 ], [ 25.566687859756883, 56.447614244002125 ], [ 25.547774286154379, 56.444875392885024 ], [ 25.523538039049242, 56.444823716940959 ], [ 25.505399610903282, 56.436400458014703 ], [ 25.476202427300166, 56.418882148392413 ], [ 25.455583529556236, 56.413352770214146 ], [ 25.393520135246035, 56.410975654303002 ], [ 25.331301711304889, 56.421285101825958 ], [ 25.296213413418286, 56.420820013832554 ], [ 25.29357791508869, 56.407900906401665 ], [ 25.133296972777032, 56.413429173017903 ], [ 25.074298280041546, 56.4027021378933 ], [ 25.051056371054642, 56.463488670265917 ], [ 25.027814462067738, 56.459912991891031 ], [ 25.013511748568305, 56.495669774740293 ], [ 24.995633356694043, 56.551092789100892 ], [ 24.956300895469951, 56.551092789100892 ], [ 24.949987336346453, 56.578568175680743 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-073", "NAME_1": "Preilu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.748166130962147, 56.111097316987582 ], [ 26.718503859365626, 56.111252345719151 ], [ 26.700365431219666, 56.118693752714478 ], [ 26.687342970101952, 56.12551504208551 ], [ 26.647913853341663, 56.135281887249278 ], [ 26.617752225085098, 56.149984271157166 ], [ 26.603277738376903, 56.166526542066208 ], [ 26.646701199400809, 56.164458757865361 ], [ 26.671514605314769, 56.176865461271973 ], [ 26.673582389515673, 56.218221138994352 ], [ 26.659107901908101, 56.259576815817354 ], [ 26.640497847697475, 56.276119086726453 ], [ 26.601209954175999, 56.282322438429787 ], [ 26.590871034970291, 56.319542547750359 ], [ 26.570193196558762, 56.321610331051886 ], [ 26.514363032128188, 56.334017034458554 ], [ 26.460600651898574, 56.358830440372515 ], [ 26.479210707008519, 56.391914982190656 ], [ 26.541244222243051, 56.375372711281557 ], [ 26.576396548262096, 56.433270659912978 ], [ 26.590871034970291, 56.445677362420327 ], [ 26.623955576788433, 56.449812930822077 ], [ 26.685989092022965, 56.429135091511228 ], [ 26.733548121448621, 56.396050550592406 ], [ 26.710802498836244, 56.383643847185795 ], [ 26.669446821113866, 56.369169360477599 ], [ 26.65083676690324, 56.336084818659401 ], [ 26.665311253611435, 56.321610331051886 ], [ 26.702531362932064, 56.313339196047025 ], [ 26.741819256453482, 56.290593573434649 ], [ 26.783174933276541, 56.282322438429787 ], [ 26.814191691793098, 56.253373464114077 ], [ 26.839005097707059, 56.214085570592601 ], [ 26.834869530204628, 56.199611083884406 ], [ 26.801784988386487, 56.185136597176211 ], [ 26.826598394300447, 56.176865461271973 ], [ 26.861750720319492, 56.162390974563777 ], [ 26.882428558730965, 56.152052055358013 ], [ 26.888467644765967, 56.128874009927586 ], [ 26.872292922280508, 56.12722036442824 ], [ 26.847643263126088, 56.12396474937367 ], [ 26.836791213243885, 56.129390773865111 ], [ 26.823251987289382, 56.12951996507428 ], [ 26.807283970378933, 56.127323717215745 ], [ 26.774727817135044, 56.115076402454008 ], [ 26.748166130962147, 56.111097316987582 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-056", "NAME_1": "Livanu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.33542646695787, 56.189748846731845 ], [ 26.300803257064615, 56.18334096941021 ], [ 26.264268019253677, 56.210781154726476 ], [ 26.249436883005728, 56.216465563434951 ], [ 26.239204949848556, 56.217447415365882 ], [ 26.219361200259186, 56.22168488235144 ], [ 26.208147414271707, 56.222666734282313 ], [ 26.193522983598768, 56.22607737896783 ], [ 26.189027134194873, 56.234733180991498 ], [ 26.19109419084424, 56.257393296963073 ], [ 26.19243777798107, 56.262612616778824 ], [ 26.195279981885619, 56.268762112581385 ], [ 26.197708774640205, 56.275893460314933 ], [ 26.197915480215215, 56.28411001186754 ], [ 26.196210157872486, 56.283334866410939 ], [ 26.191714307569214, 56.285401923060249 ], [ 26.186908399802803, 56.28855418622669 ], [ 26.184272902372527, 56.290931301238516 ], [ 26.183187696754771, 56.296047268266761 ], [ 26.184272902372527, 56.315477606706168 ], [ 26.181068963262021, 56.320800279309424 ], [ 26.166961297425928, 56.337181708269213 ], [ 26.163809035158806, 56.342452704029029 ], [ 26.162878859171997, 56.36332998329209 ], [ 26.160760124779927, 56.372270006155816 ], [ 26.156987745787831, 56.380331528976853 ], [ 26.144688755081972, 56.389245714318236 ], [ 26.108876986783514, 56.405859687274699 ], [ 26.088516473256618, 56.406428128055666 ], [ 26.153370396426624, 56.429269111180531 ], [ 26.191249219575809, 56.457872016480337 ], [ 26.199465772927056, 56.473039049512522 ], [ 26.232848747571609, 56.498825589329442 ], [ 26.25718834836357, 56.512003079178726 ], [ 26.290416294276554, 56.517894192562892 ], [ 26.309174839147488, 56.515620429439252 ], [ 26.315686069256685, 56.511951402335342 ], [ 26.320802036284931, 56.50688711215048 ], [ 26.323282504983581, 56.498179633283428 ], [ 26.353099806211048, 56.474537665380922 ], [ 26.362556593911677, 56.450844021534351 ], [ 26.412372674359403, 56.465313422576344 ], [ 26.43583377510862, 56.475932929361193 ], [ 26.445600620272387, 56.482650865045343 ], [ 26.45800296376575, 56.488903714534786 ], [ 26.475211215924844, 56.494071357507096 ], [ 26.498982375036576, 56.495931708581452 ], [ 26.529058057783118, 56.493606269513691 ], [ 26.540530226188991, 56.489678859991386 ], [ 26.537108654740621, 56.466355201731119 ], [ 26.537108654740621, 56.445677362420327 ], [ 26.559854277352997, 56.439474011616312 ], [ 26.576396548262096, 56.433270659912978 ], [ 26.541244222243051, 56.375372711281557 ], [ 26.479210707008519, 56.391914982190656 ], [ 26.460600651898574, 56.358830440372515 ], [ 26.514363032128188, 56.334017034458554 ], [ 26.570193196558762, 56.321610331051886 ], [ 26.590871034970291, 56.319542547750359 ], [ 26.601209954175999, 56.282322438429787 ], [ 26.561922060654581, 56.267847950822272 ], [ 26.510227464625757, 56.267847950822272 ], [ 26.441990597687891, 56.265780167520688 ], [ 26.402702704166472, 56.282322438429787 ], [ 26.379957081554039, 56.313339196047025 ], [ 26.355143675640079, 56.311271411846178 ], [ 26.353075891439232, 56.27405130252555 ], [ 26.293110159506227, 56.284390221731314 ], [ 26.311720214616173, 56.226492273999213 ], [ 26.33542646695787, 56.189748846731845 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-103", "NAME_1": "Varkavas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.507508985851018, 56.132336331456486 ], [ 26.484512973994526, 56.167786362750405 ], [ 26.455367466335474, 56.180447089561483 ], [ 26.41655846540084, 56.183547674985164 ], [ 26.380850050789206, 56.196906032887057 ], [ 26.33542646695787, 56.189748846731845 ], [ 26.311720214616173, 56.226492273999213 ], [ 26.293110159506227, 56.284390221731314 ], [ 26.353075891439232, 56.27405130252555 ], [ 26.355143675640079, 56.311271411846178 ], [ 26.379957081554039, 56.313339196047025 ], [ 26.402702704166472, 56.282322438429787 ], [ 26.441990597687891, 56.265780167520688 ], [ 26.510227464625757, 56.267847950822272 ], [ 26.561922060654581, 56.267847950822272 ], [ 26.601209954175999, 56.282322438429787 ], [ 26.640497847697475, 56.276119086726453 ], [ 26.659107901908101, 56.259576815817354 ], [ 26.673582389515673, 56.218221138994352 ], [ 26.671514605314769, 56.176865461271973 ], [ 26.646701199400809, 56.164458757865361 ], [ 26.603277738376903, 56.166526542066208 ], [ 26.617752225085098, 56.149984271157166 ], [ 26.647913853341663, 56.135281887249278 ], [ 26.624814486899027, 56.121122545469063 ], [ 26.62062869585759, 56.1249466013046 ], [ 26.609621616344498, 56.132207140247317 ], [ 26.576238640800625, 56.14804596594854 ], [ 26.570657585778918, 56.153962917754427 ], [ 26.556549919942825, 56.156572578561622 ], [ 26.543940870874451, 56.142103175720933 ], [ 26.54084028455145, 56.133912461690727 ], [ 26.507508985851018, 56.132336331456486 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-JKB", "NAME_1": "Jekabpils" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.088516473256618, 56.406428128055666 ], [ 26.108876986783514, 56.405859687274699 ], [ 26.144688755081972, 56.389245714318236 ], [ 26.156987745787831, 56.380331528976853 ], [ 26.160760124779927, 56.372270006155816 ], [ 26.162878859171997, 56.36332998329209 ], [ 26.163809035158806, 56.342452704029029 ], [ 26.166961297425928, 56.337181708269213 ], [ 26.181068963262021, 56.320800279309424 ], [ 26.184272902372527, 56.315477606706168 ], [ 26.183187696754771, 56.296047268266761 ], [ 26.184272902372527, 56.290931301238516 ], [ 26.186908399802803, 56.28855418622669 ], [ 26.191714307569214, 56.285401923060249 ], [ 26.196210157872486, 56.283334866410939 ], [ 26.197915480215215, 56.28411001186754 ], [ 26.197708774640205, 56.275893460314933 ], [ 26.195279981885619, 56.268762112581385 ], [ 26.19243777798107, 56.262612616778824 ], [ 26.19109419084424, 56.257393296963073 ], [ 26.189027134194873, 56.234733180991498 ], [ 26.193522983598768, 56.22607737896783 ], [ 26.208147414271707, 56.222666734282313 ], [ 26.219361200259186, 56.22168488235144 ], [ 26.239204949848556, 56.217447415365882 ], [ 26.249436883005728, 56.216465563434951 ], [ 26.264268019253677, 56.210781154726476 ], [ 26.300803257064615, 56.18334096941021 ], [ 26.328295119224379, 56.162670397520799 ], [ 26.33656334762037, 56.149441229928811 ], [ 26.340749138661806, 56.134248359374283 ], [ 26.342609490635482, 56.107893377877076 ], [ 26.345348341752526, 56.093449815256747 ], [ 26.316306186880979, 56.122724514125025 ], [ 26.315065951632334, 56.130734361001942 ], [ 26.31863162594874, 56.134997667308483 ], [ 26.320698682598106, 56.141534735839343 ], [ 26.317546421230361, 56.14592723245579 ], [ 26.313050570927089, 56.150371405915621 ], [ 26.304989048106052, 56.153471992238622 ], [ 26.282199740925307, 56.158949693573447 ], [ 26.25718834836357, 56.162076118318168 ], [ 26.243390740889936, 56.167062893237926 ], [ 26.219671257722325, 56.166029365362874 ], [ 26.205821974304627, 56.163600571708969 ], [ 26.138952671328695, 56.131096096207841 ], [ 26.151355014822059, 56.121019191782239 ], [ 26.153060337164789, 56.118280341564457 ], [ 26.152440220439814, 56.109185289069785 ], [ 26.129340854896498, 56.098384915131703 ], [ 26.120504184820277, 56.100710354199464 ], [ 26.108566929320318, 56.101485501454704 ], [ 26.097559848907906, 56.096007799220558 ], [ 26.092392205935539, 56.089599920999547 ], [ 26.079369744817825, 56.078799547061408 ], [ 26.058905876704841, 56.067740789805555 ], [ 26.046296827636468, 56.06634552672466 ], [ 26.036995069566785, 56.068567613004916 ], [ 26.025522902060288, 56.079419663786439 ], [ 26.012188109093927, 56.108357187034528 ], [ 25.98547398333767, 56.110583363431431 ], [ 25.976569275051986, 56.128392780902061 ], [ 25.976569275051986, 56.148428375668971 ], [ 25.94762897199945, 56.157333083954654 ], [ 25.905331606068728, 56.170690146832783 ], [ 25.896426897783101, 56.201856626282222 ], [ 25.876391303016192, 56.221892221049131 ], [ 25.838546291678028, 56.226344574742313 ], [ 25.800701280339808, 56.23524928392726 ], [ 25.756177738012184, 56.230796929334815 ], [ 25.693844778213929, 56.228570752038536 ], [ 25.680487715335801, 56.29312988913307 ], [ 25.733915966848372, 56.299808421021794 ], [ 25.736142143245274, 56.328748723175011 ], [ 25.733915966848372, 56.351010495238143 ], [ 25.794022749350404, 56.359915203523769 ], [ 25.842998646270473, 56.413343455036397 ], [ 25.809605989524755, 56.444509934485836 ], [ 25.820736875106661, 56.486807300416558 ], [ 25.845224823566753, 56.477902592130874 ], [ 25.883069834904916, 56.475676414834652 ], [ 25.876556836728639, 56.495306707638406 ], [ 25.925696060424855, 56.483753711764336 ], [ 26.043223503361958, 56.456122137226828 ], [ 26.055267774588117, 56.451361395212189 ], [ 26.06405683725319, 56.436835028413782 ], [ 26.080332878259696, 56.417914129833207 ], [ 26.088516473256618, 56.406428128055666 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-049", "NAME_1": "Krustpils" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.362556593911677, 56.450844021534351 ], [ 26.353099806211048, 56.474537665380922 ], [ 26.323282504983581, 56.498179633283428 ], [ 26.320802036284931, 56.50688711215048 ], [ 26.315686069256685, 56.511951402335342 ], [ 26.309174839147488, 56.515620429439252 ], [ 26.290416294276554, 56.517894192562892 ], [ 26.25718834836357, 56.512003079178726 ], [ 26.232848747571609, 56.498825589329442 ], [ 26.199465772927056, 56.473039049512522 ], [ 26.191249219575809, 56.457872016480337 ], [ 26.153370396426624, 56.429269111180531 ], [ 26.088516473256618, 56.406428128055666 ], [ 26.080332878259696, 56.417914129833207 ], [ 26.06405683725319, 56.436835028413782 ], [ 26.055267774588117, 56.451361395212189 ], [ 26.043223503361958, 56.456122137226828 ], [ 25.925696060424855, 56.483753711764336 ], [ 25.876556836728639, 56.495306707638406 ], [ 25.925367200835638, 56.513521426172872 ], [ 25.918688668946913, 56.529104666347223 ], [ 25.889748365894377, 56.522426134458499 ], [ 25.878617480312471, 56.535783197336684 ], [ 25.854129531852379, 56.535783197336684 ], [ 25.826426628486104, 56.527167059012527 ], [ 25.79973392008435, 56.527696030347499 ], [ 25.786875846942792, 56.530340887921625 ], [ 25.7692163419606, 56.554144597994764 ], [ 25.748057487662891, 56.566351629424105 ], [ 25.756108922788542, 56.592025575919592 ], [ 25.756908806795991, 56.612255356799267 ], [ 25.788276400735299, 56.609309801006475 ], [ 25.830961135248174, 56.613237210528837 ], [ 25.883257684394607, 56.623572496473514 ], [ 25.93209191291146, 56.637835191041233 ], [ 25.983613315701916, 56.665637112462719 ], [ 26.002113478154456, 56.639695543014852 ], [ 26.022887403730692, 56.629308580226791 ], [ 26.039992303102281, 56.626466376322185 ], [ 26.058130731248241, 56.629954536272805 ], [ 26.09223717630465, 56.643881334056289 ], [ 26.131046177239284, 56.653906562537827 ], [ 26.156470981850305, 56.650134181747035 ], [ 26.170010206905488, 56.645018216517428 ], [ 26.19109419084424, 56.642331041344448 ], [ 26.204891799217137, 56.635251370454341 ], [ 26.198225538577731, 56.6271381698906 ], [ 26.224632196019002, 56.609878241787385 ], [ 26.261994256129981, 56.616570339949192 ], [ 26.281269565837761, 56.610911770561756 ], [ 26.284215121630552, 56.605795803533454 ], [ 26.291346470263363, 56.58670136187834 ], [ 26.342712844322307, 56.60383209877233 ], [ 26.350774367143288, 56.60998159457489 ], [ 26.375579054130014, 56.635923163123437 ], [ 26.401365593946991, 56.633856106474127 ], [ 26.484512973994526, 56.60613170031769 ], [ 26.522546827673921, 56.599853014205223 ], [ 26.593756952221554, 56.595150458326941 ], [ 26.583369989433436, 56.563524481969239 ], [ 26.586625603588743, 56.551432196838391 ], [ 26.595927361658369, 56.547039700221944 ], [ 26.608536410726742, 56.544714260254864 ], [ 26.627760043591138, 56.543732408323933 ], [ 26.595152215302448, 56.506551215366244 ], [ 26.593756952221554, 56.501590277968944 ], [ 26.593136833697884, 56.496603502149867 ], [ 26.59732262473932, 56.495569973375552 ], [ 26.597012567276124, 56.494536445500557 ], [ 26.59639244965183, 56.488800360847961 ], [ 26.559495476634936, 56.486164863417685 ], [ 26.540530226188991, 56.489678859991386 ], [ 26.529058057783118, 56.493606269513691 ], [ 26.498982375036576, 56.495931708581452 ], [ 26.475211215924844, 56.494071357507096 ], [ 26.45800296376575, 56.488903714534786 ], [ 26.445600620272387, 56.482650865045343 ], [ 26.43583377510862, 56.475932929361193 ], [ 26.412372674359403, 56.465313422576344 ], [ 26.362556593911677, 56.450844021534351 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-086", "NAME_1": "Salas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.744041375309223, 56.617267971040008 ], [ 25.756908806795991, 56.612255356799267 ], [ 25.756108922788542, 56.592025575919592 ], [ 25.748057487662891, 56.566351629424105 ], [ 25.7692163419606, 56.554144597994764 ], [ 25.786875846942792, 56.530340887921625 ], [ 25.79973392008435, 56.527696030347499 ], [ 25.826426628486104, 56.527167059012527 ], [ 25.820736875106661, 56.486807300416558 ], [ 25.809605989524755, 56.444509934485836 ], [ 25.842998646270473, 56.413343455036397 ], [ 25.794022749350404, 56.359915203523769 ], [ 25.733915966848372, 56.351010495238143 ], [ 25.727237434959648, 56.368819911809453 ], [ 25.676035360743299, 56.36659373541255 ], [ 25.658225943272669, 56.393307860269488 ], [ 25.635964172108856, 56.408891100443896 ], [ 25.611476223648765, 56.431152872507027 ], [ 25.615928578241267, 56.446736111782116 ], [ 25.594644809910051, 56.467147936128299 ], [ 25.580020379237112, 56.48838694879862 ], [ 25.566067743031908, 56.498308824492653 ], [ 25.558626336036582, 56.510659492041896 ], [ 25.575989617826565, 56.539701646913443 ], [ 25.598675571320541, 56.551819770466011 ], [ 25.605806919054032, 56.562025865201463 ], [ 25.607202183034303, 56.567710273010675 ], [ 25.599450717676461, 56.57029409449683 ], [ 25.580175408868001, 56.569157212935011 ], [ 25.560331659278631, 56.573859767913916 ], [ 25.569788446079883, 56.576701971818522 ], [ 25.579400261612761, 56.576288561567821 ], [ 25.601466099281026, 56.578924058998098 ], [ 25.646734652582154, 56.596390693575643 ], [ 25.688334180577954, 56.600783190192033 ], [ 25.711330194233085, 56.605847480376895 ], [ 25.744041375309223, 56.617267971040008 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-003", "NAME_1": "Aizputes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.436449008614829, 56.867588609426775 ], [ 21.493086379332908, 56.864694729578105 ], [ 21.515772331927565, 56.84397247994599 ], [ 21.526004265984056, 56.842034614505849 ], [ 21.566673617993047, 56.842215480759819 ], [ 21.593028598590934, 56.84513519992953 ], [ 21.608686558038187, 56.832887885167736 ], [ 21.610288526694148, 56.822733466376349 ], [ 21.622535842355205, 56.81136465075798 ], [ 21.629667189189433, 56.799892483251483 ], [ 21.644239943018931, 56.791159165962711 ], [ 21.651681349114938, 56.790073961244275 ], [ 21.673747185883883, 56.790590725181801 ], [ 21.680103387261511, 56.791572578012051 ], [ 21.738446079422999, 56.764132391796409 ], [ 21.761235385704481, 56.741188055884038 ], [ 21.762785679315641, 56.731989651501181 ], [ 21.770537143774163, 56.723023790215734 ], [ 21.771777378123488, 56.713024400155916 ], [ 21.767591587082052, 56.704782010181589 ], [ 21.776118197896494, 56.698658351901372 ], [ 21.801439649720066, 56.690648505024456 ], [ 21.822988721652166, 56.68785797796329 ], [ 21.809346143809478, 56.66933197708903 ], [ 21.815237258092964, 56.661916409414744 ], [ 21.824383985632437, 56.647136949110859 ], [ 21.820508253852836, 56.639152939756343 ], [ 21.813841994112749, 56.62964447701097 ], [ 21.802989943331227, 56.622849026061658 ], [ 21.776738316420165, 56.613702298522242 ], [ 21.777720168351095, 56.6101883001499 ], [ 21.790587598938544, 56.597062486244738 ], [ 21.795238477973385, 56.588639228217801 ], [ 21.793688185261544, 56.58341990840205 ], [ 21.795393507604274, 56.573343003976447 ], [ 21.752952162012662, 56.562744378550178 ], [ 21.712444082728211, 56.549952353418348 ], [ 21.661275982200777, 56.560612373762012 ], [ 21.584523831409683, 56.549952353418348 ], [ 21.571731806277796, 56.560612373762012 ], [ 21.618635898128161, 56.588328428813895 ], [ 21.618635898128161, 56.613912479077612 ], [ 21.607975876885178, 56.643760537119078 ], [ 21.571731806277796, 56.658684567039131 ], [ 21.518431701861516, 56.652288554473159 ], [ 21.490715646809633, 56.652288554473159 ], [ 21.452339571414086, 56.645892541907244 ], [ 21.431019529827438, 56.673608596059807 ], [ 21.403303475674818, 56.671476592170961 ], [ 21.399039466997806, 56.692796633757609 ], [ 21.337211346126708, 56.718380684021326 ], [ 21.31589130364074, 56.739700725607975 ], [ 21.324419320994878, 56.758888763305777 ], [ 21.320155312317809, 56.807924859944308 ], [ 21.345739362581526, 56.820716885076138 ], [ 21.40969948824079, 56.831376905419802 ], [ 21.439547546282199, 56.83990492277394 ], [ 21.436449008614829, 56.867588609426775 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-050", "NAME_1": "Kuldigas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.526004265984056, 56.842034614505849 ], [ 21.515772331927565, 56.84397247994599 ], [ 21.493086379332908, 56.864694729578105 ], [ 21.436449008614829, 56.867588609426775 ], [ 21.467971633084403, 56.878905748201703 ], [ 21.473707716837623, 56.887587389546354 ], [ 21.493396436796104, 56.903813787975935 ], [ 21.518585955377546, 56.910588849495753 ], [ 21.564311109769903, 56.910588849495753 ], [ 21.584887429111575, 56.931165168837424 ], [ 21.639757614022642, 56.9334514262423 ], [ 21.664906449073328, 56.949455230774277 ], [ 21.706059087756671, 56.956314003888167 ], [ 21.69234154152889, 56.997466642571453 ], [ 21.655761418554619, 57.008897931394415 ], [ 21.632898840908751, 57.034046766445101 ], [ 21.639757614022642, 57.047764312672882 ], [ 21.60546374845319, 57.061481858900663 ], [ 21.573804965726595, 57.085611476988049 ], [ 21.593028598590934, 57.087265123386715 ], [ 21.626256545403237, 57.104059964395788 ], [ 21.641449415957766, 57.114214383187232 ], [ 21.653851760350449, 57.116152249526692 ], [ 21.664083692608301, 57.116307278258262 ], [ 21.692350702023248, 57.114214383187232 ], [ 21.711574333988324, 57.116849881516771 ], [ 21.766971470357078, 57.107057197031963 ], [ 21.789192335857592, 57.104111640339909 ], [ 21.789812452582623, 57.099822496510967 ], [ 21.789502394220108, 57.095274970263631 ], [ 21.783094516898416, 57.085198065838028 ], [ 21.82190351693373, 57.085275580203813 ], [ 21.839938592292185, 57.093001207139991 ], [ 21.849860467086842, 57.098427232530753 ], [ 21.86009240114339, 57.099305732573498 ], [ 21.936573520551519, 57.097238675024812 ], [ 21.951973096681058, 57.098427232530753 ], [ 21.996466506324168, 57.107367255394479 ], [ 22.015276727139224, 57.113723455872787 ], [ 22.075324740744179, 57.101992905947839 ], [ 22.095168491232869, 57.101631170741882 ], [ 22.172734816258753, 57.116565659777336 ], [ 22.192475213060618, 57.124575507553629 ], [ 22.194335565034294, 57.128089505026594 ], [ 22.195265741021103, 57.132094428015421 ], [ 22.195110711390214, 57.149070136177841 ], [ 22.195575799383619, 57.153385118428446 ], [ 22.196350945739539, 57.157545071048162 ], [ 22.199606560794109, 57.166123358705988 ], [ 22.206427850165142, 57.177853909530256 ], [ 22.234694857781449, 57.170541693744156 ], [ 22.24182620641426, 57.166691800386275 ], [ 22.249887730134617, 57.155271307924465 ], [ 22.262755160722065, 57.145013536345573 ], [ 22.297998488239614, 57.128761297695689 ], [ 22.327609083892071, 57.120415554034537 ], [ 22.348899774305096, 57.11010610651158 ], [ 22.354170770064968, 57.102664700415573 ], [ 22.363007440141246, 57.078738512572272 ], [ 22.359286737093214, 57.056465969328997 ], [ 22.35959679455641, 57.051453355987576 ], [ 22.362697380879411, 57.042409980336288 ], [ 22.372619255674067, 57.035769558118602 ], [ 22.382386101737211, 57.019672349998928 ], [ 22.412668490958083, 57.014763089445012 ], [ 22.480002882826739, 57.017760322081187 ], [ 22.508218215398301, 57.013832913458145 ], [ 22.472406447099843, 56.982465317720198 ], [ 22.455921665352548, 56.940400703529633 ], [ 22.445379672933541, 56.938540351555957 ], [ 22.454888135678914, 56.917094632411306 ], [ 22.443364292228296, 56.903555406456803 ], [ 22.432357211815884, 56.898542792216062 ], [ 22.417784457986329, 56.889344386933885 ], [ 22.392307977431187, 56.885882066304305 ], [ 22.348744744674207, 56.896424058723312 ], [ 22.338151076311078, 56.904072171293649 ], [ 22.338512810617715, 56.908025418338354 ], [ 22.335670606713109, 56.913012193258112 ], [ 22.328384230247991, 56.916836249093592 ], [ 22.304354688717865, 56.919730129841582 ], [ 22.290247022881772, 56.91006663746532 ], [ 22.287869906970627, 56.905777492737059 ], [ 22.267406039756906, 56.898542792216062 ], [ 22.26399539597071, 56.893943590024605 ], [ 22.269731479723987, 56.888052477539759 ], [ 22.287869906970627, 56.883091539243139 ], [ 22.295518018641644, 56.883298244818093 ], [ 22.30388960072446, 56.884512640745754 ], [ 22.310555861363866, 56.883763332811554 ], [ 22.32032270742701, 56.880404364969422 ], [ 22.329469434966427, 56.87477163400365 ], [ 22.342026808090679, 56.864229640685323 ], [ 22.34130333767888, 56.847486477418954 ], [ 22.316602004378979, 56.843662421583474 ], [ 22.305749952698136, 56.838623968921013 ], [ 22.269731479723987, 56.82970978537827 ], [ 22.251127963584622, 56.823095201582248 ], [ 22.230302362064322, 56.80906505011194 ], [ 22.204877556553981, 56.795215765794921 ], [ 22.162657911833151, 56.795034897742312 ], [ 22.113012961578875, 56.807707251888132 ], [ 22.09243664223726, 56.823711056420109 ], [ 22.030707684212246, 56.823711056420109 ], [ 21.982696271515692, 56.821424798115913 ], [ 21.934684859718459, 56.798562221369366 ], [ 21.959833694769202, 56.732260747635394 ], [ 21.930112344009444, 56.718543201407613 ], [ 21.886673447921282, 56.720829458812432 ], [ 21.840948293528925, 56.704825654280512 ], [ 21.822988721652166, 56.68785797796329 ], [ 21.801439649720066, 56.690648505024456 ], [ 21.776118197896494, 56.698658351901372 ], [ 21.767591587082052, 56.704782010181589 ], [ 21.771777378123488, 56.713024400155916 ], [ 21.770537143774163, 56.723023790215734 ], [ 21.762785679315641, 56.731989651501181 ], [ 21.761235385704481, 56.741188055884038 ], [ 21.738446079422999, 56.764132391796409 ], [ 21.680103387261511, 56.791572578012051 ], [ 21.673747185883883, 56.790590725181801 ], [ 21.651681349114938, 56.790073961244275 ], [ 21.644239943018931, 56.791159165962711 ], [ 21.629667189189433, 56.799892483251483 ], [ 21.622535842355205, 56.81136465075798 ], [ 21.610288526694148, 56.822733466376349 ], [ 21.608686558038187, 56.832887885167736 ], [ 21.593028598590934, 56.84513519992953 ], [ 21.566673617993047, 56.842215480759819 ], [ 21.526004265984056, 56.842034614505849 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-006", "NAME_1": "Alsungas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.493396436796104, 56.903813787975935 ], [ 21.447301060295672, 56.912082018170565 ], [ 21.406063266606452, 56.923450832889614 ], [ 21.397226597429494, 56.929393622217844 ], [ 21.391490512776954, 56.934483750824427 ], [ 21.39583133344928, 56.942416083335559 ], [ 21.446680941772001, 56.949650783856555 ], [ 21.454329054342395, 56.960296129063067 ], [ 21.472002393595574, 56.971354885419601 ], [ 21.474947951187005, 56.986444404085944 ], [ 21.473552687206734, 57.0129544134154 ], [ 21.484869825981662, 57.028509020075205 ], [ 21.489210645754667, 57.051014106415835 ], [ 21.503008254127622, 57.058274645358551 ], [ 21.506160516394687, 57.075612087827551 ], [ 21.539026727101771, 57.07057363516509 ], [ 21.573804965726595, 57.085611476988049 ], [ 21.60546374845319, 57.061481858900663 ], [ 21.639757614022642, 57.047764312672882 ], [ 21.632898840908751, 57.034046766445101 ], [ 21.655761418554619, 57.008897931394415 ], [ 21.69234154152889, 56.997466642571453 ], [ 21.706059087756671, 56.956314003888167 ], [ 21.664906449073328, 56.949455230774277 ], [ 21.639757614022642, 56.9334514262423 ], [ 21.584887429111575, 56.931165168837424 ], [ 21.564311109769903, 56.910588849495753 ], [ 21.518585955377546, 56.910588849495753 ], [ 21.493396436796104, 56.903813787975935 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-093", "NAME_1": "Skrundas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.866138543259126, 56.520426337205663 ], [ 21.850790643073708, 56.521149806718199 ], [ 21.833065626977088, 56.523966173100405 ], [ 21.818027785154129, 56.530839138415502 ], [ 21.807485792735122, 56.538461412564118 ], [ 21.793223097268083, 56.554377753530446 ], [ 21.795393507604274, 56.573343003976447 ], [ 21.793688185261544, 56.58341990840205 ], [ 21.795238477973385, 56.588639228217801 ], [ 21.790587598938544, 56.597062486244738 ], [ 21.777720168351095, 56.6101883001499 ], [ 21.776738316420165, 56.613702298522242 ], [ 21.802989943331227, 56.622849026061658 ], [ 21.813841994112749, 56.62964447701097 ], [ 21.820508253852836, 56.639152939756343 ], [ 21.824383985632437, 56.647136949110859 ], [ 21.815237258092964, 56.661916409414744 ], [ 21.809346143809478, 56.66933197708903 ], [ 21.822988721652166, 56.68785797796329 ], [ 21.840948293528925, 56.704825654280512 ], [ 21.886673447921282, 56.720829458812432 ], [ 21.930112344009444, 56.718543201407613 ], [ 21.959833694769202, 56.732260747635394 ], [ 21.934684859718459, 56.798562221369366 ], [ 21.982696271515692, 56.821424798115913 ], [ 22.030707684212246, 56.823711056420109 ], [ 22.09243664223726, 56.823711056420109 ], [ 22.113012961578875, 56.807707251888132 ], [ 22.162657911833151, 56.795034897742312 ], [ 22.174491815444924, 56.765889390982579 ], [ 22.185963982951421, 56.748112698042576 ], [ 22.189219598006048, 56.741756497564268 ], [ 22.188909538744213, 56.735658677705771 ], [ 22.181003044654744, 56.72852732997228 ], [ 22.173975050608078, 56.715969956848028 ], [ 22.166998731606157, 56.708218492389506 ], [ 22.155991652093064, 56.700311998300037 ], [ 22.125450881353061, 56.69013174108693 ], [ 22.112221713761073, 56.682948717409374 ], [ 22.103540073315742, 56.672871812983772 ], [ 22.111446567405153, 56.646671861117454 ], [ 22.111911655398558, 56.625691229966264 ], [ 22.109276157068962, 56.613624783257137 ], [ 22.112531773022909, 56.609516507480805 ], [ 22.115373976028138, 56.603806261249929 ], [ 22.118577915138644, 56.592359931265776 ], [ 22.123435499748496, 56.58763153696583 ], [ 22.126070998078092, 56.582205512474388 ], [ 22.121265090311624, 56.576340237511943 ], [ 22.099974399898599, 56.56853709620998 ], [ 22.060596958183055, 56.564506333900169 ], [ 22.011400995359622, 56.555049547098918 ], [ 22.011711052822818, 56.547504788215349 ], [ 22.018222283831335, 56.542595526762113 ], [ 22.049073113833117, 56.529056300807611 ], [ 22.05744469591599, 56.523268541110269 ], [ 22.056049431935719, 56.509057522486671 ], [ 22.037445915796354, 56.504044908245874 ], [ 22.024268425947071, 56.50745555293139 ], [ 22.009695672117573, 56.507972316868916 ], [ 21.99786176940512, 56.50593109774195 ], [ 21.966700881040822, 56.506628729732086 ], [ 21.956934034977735, 56.514173489514917 ], [ 21.920605502741751, 56.506938788094544 ], [ 21.912388950289824, 56.507920640924794 ], [ 21.910063511222063, 56.512054755122847 ], [ 21.908358188879276, 56.517454942091888 ], [ 21.904172397837897, 56.521511541924099 ], [ 21.893475375787943, 56.523010158691818 ], [ 21.866138543259126, 56.520426337205663 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-043", "NAME_1": "Kandavas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 22.454888135678914, 56.917094632411306 ], [ 22.445379672933541, 56.938540351555957 ], [ 22.455921665352548, 56.940400703529633 ], [ 22.472406447099843, 56.982465317720198 ], [ 22.508218215398301, 57.013832913458145 ], [ 22.559584587658549, 57.008381048746401 ], [ 22.591417271389957, 57.022385361794989 ], [ 22.635807326446923, 57.015848294163391 ], [ 22.649449904289611, 57.041660672402088 ], [ 22.6415434102002, 57.094732367904442 ], [ 22.669603713140816, 57.097703762118897 ], [ 22.76086429195351, 57.112328192791836 ], [ 22.793265414667133, 57.126022447477965 ], [ 22.801998731955905, 57.131345120081221 ], [ 22.80804487497096, 57.136616115841036 ], [ 22.831299269245847, 57.140078437369937 ], [ 22.911242710182933, 57.137184557521266 ], [ 22.930931431040676, 57.144574286773889 ], [ 22.955708872166724, 57.126776999358981 ], [ 22.941406158667291, 57.11426212549668 ], [ 22.912800732567746, 57.103535090372077 ], [ 22.896710179431238, 57.089232376872644 ], [ 22.841287165969902, 57.078505341748098 ], [ 22.855589879469335, 57.057051271498949 ], [ 22.866316913694618, 57.037385040886875 ], [ 22.878831788456239, 57.019506649911932 ], [ 22.862741235319731, 57.010567453525141 ], [ 22.830560130845356, 57.006991775150254 ], [ 22.818045256982998, 56.974810670675879 ], [ 22.830560130845356, 56.9497809220519 ], [ 22.873468270444334, 56.924751173427865 ], [ 22.916376410942576, 56.915811977940393 ], [ 22.918164249680387, 56.888994390578659 ], [ 22.923527767692292, 56.874691677079227 ], [ 22.943193998304366, 56.855025446467153 ], [ 22.907437214555785, 56.853237607729397 ], [ 22.875256110081409, 56.858601124841982 ], [ 22.835923647957998, 56.849661929354511 ], [ 22.846650683082544, 56.828207859105362 ], [ 22.816257417345923, 56.813905145605929 ], [ 22.788924594894127, 56.803871567818589 ], [ 22.718799675964249, 56.802011216744233 ], [ 22.679060499942125, 56.809555976527065 ], [ 22.642008498193604, 56.808212389390235 ], [ 22.645884229973205, 56.816351427476377 ], [ 22.634257032835762, 56.82412873035662 ], [ 22.586301304361712, 56.837151191474277 ], [ 22.527648552938331, 56.841595364034788 ], [ 22.490854932708942, 56.851517238829501 ], [ 22.500466750040459, 56.862989407235318 ], [ 22.506564568999636, 56.86748525753859 ], [ 22.514626091820674, 56.871981106043165 ], [ 22.518966913392319, 56.876838691552337 ], [ 22.52113732282919, 56.88464183195498 ], [ 22.520982293198244, 56.900299791402233 ], [ 22.524392937883761, 56.905105699168644 ], [ 22.529198845650171, 56.908774726272554 ], [ 22.526563348219952, 56.912960517313991 ], [ 22.511938918446333, 56.917404689874502 ], [ 22.492405226320102, 56.920091865047482 ], [ 22.454888135678914, 56.917094632411306 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-099", "NAME_1": "Tukums" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.492034132569131, 56.934638780455316 ], [ 23.506761916029575, 56.894615384492397 ], [ 23.461958448923269, 56.884228420804959 ], [ 23.48660810717837, 56.815912177005316 ], [ 23.451674838922656, 56.799401556836358 ], [ 23.408835076577532, 56.792399400312036 ], [ 23.397207879440089, 56.792244371580466 ], [ 23.389456414082247, 56.793975532344916 ], [ 23.375038689883638, 56.800770982394909 ], [ 23.321966994381285, 56.782115790311423 ], [ 23.315920851366172, 56.774157620277947 ], [ 23.314990676278683, 56.765475978933239 ], [ 23.325222609435855, 56.749456285179406 ], [ 23.299642775193888, 56.715349840122997 ], [ 23.272305941765808, 56.710285549938135 ], [ 23.215823601577938, 56.711060696294055 ], [ 23.193654412920807, 56.704962877334879 ], [ 23.171743604883432, 56.692405504210626 ], [ 23.123322788415919, 56.698813382431638 ], [ 23.093372487350393, 56.720937509658313 ], [ 23.070130578363489, 56.760269970882405 ], [ 23.055827865763376, 56.794238914993912 ], [ 23.036161634251982, 56.80675378885627 ], [ 22.975375102778742, 56.801390271743628 ], [ 22.932466963179763, 56.810329467231099 ], [ 22.923527767692292, 56.833571376218003 ], [ 22.943193998304366, 56.855025446467153 ], [ 22.923527767692292, 56.874691677079227 ], [ 22.918164249680387, 56.888994390578659 ], [ 22.916376410942576, 56.915811977940393 ], [ 22.873468270444334, 56.924751173427865 ], [ 22.830560130845356, 56.9497809220519 ], [ 22.818045256982998, 56.974810670675879 ], [ 22.830560130845356, 57.006991775150254 ], [ 22.862741235319731, 57.010567453525141 ], [ 22.878831788456239, 57.019506649911932 ], [ 22.866316913694618, 57.037385040886875 ], [ 22.855589879469335, 57.057051271498949 ], [ 22.841287165969902, 57.078505341748098 ], [ 22.896710179431238, 57.089232376872644 ], [ 22.912800732567746, 57.103535090372077 ], [ 22.941406158667291, 57.11426212549668 ], [ 22.955708872166724, 57.126776999358981 ], [ 22.930931431040676, 57.144574286773889 ], [ 22.941473422560364, 57.152454942441636 ], [ 22.946744419219556, 57.160335598109327 ], [ 22.948914828656427, 57.167880356992839 ], [ 22.967259963276661, 57.183538316440149 ], [ 22.977491896433833, 57.187052313913114 ], [ 23.039865350005869, 57.210203356299814 ], [ 23.080379673283289, 57.238470363916122 ], [ 23.112780795996912, 57.265290432507413 ], [ 23.129129271098975, 57.242986545192878 ], [ 23.132704949473805, 57.209017601081371 ], [ 23.120190075611504, 57.171472978595034 ], [ 23.10052384410011, 57.155382425458527 ], [ 23.113038718861787, 57.137504034483584 ], [ 23.150583341348124, 57.123201320984151 ], [ 23.204218516071649, 57.105322929109889 ], [ 23.231036103433382, 57.06599046788574 ], [ 23.21315771155912, 57.039172880524006 ], [ 23.177400928709858, 57.012355293162216 ], [ 23.168461732323067, 56.985537705800482 ], [ 23.197067159321932, 56.967659313926163 ], [ 23.177400928709858, 56.955144439164485 ], [ 23.141644144961276, 56.935478208552468 ], [ 23.148795501710993, 56.921175495952355 ], [ 23.200642837696762, 56.930114691439826 ], [ 23.277519921407247, 56.915811977940393 ], [ 23.372275396991938, 56.910448460827752 ], [ 23.442001124852027, 56.926539013064996 ], [ 23.477151320377118, 56.936473294007271 ], [ 23.492034132569131, 56.934638780455316 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-026", "NAME_1": "Dobele" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.397207879440089, 56.792244371580466 ], [ 23.408835076577532, 56.792399400312036 ], [ 23.451674838922656, 56.799401556836358 ], [ 23.48660810717837, 56.815912177005316 ], [ 23.50552168078093, 56.808212389390235 ], [ 23.525262079381434, 56.763667303803004 ], [ 23.502886183350654, 56.746872463693194 ], [ 23.459271274649609, 56.734573472987336 ], [ 23.436481968368128, 56.723876450937439 ], [ 23.417413364235358, 56.706823229308554 ], [ 23.442683140114809, 56.696798000827073 ], [ 23.462991977697584, 56.692534695419852 ], [ 23.478236525095554, 56.684809068483673 ], [ 23.481492140150124, 56.680416571867283 ], [ 23.479786817807394, 56.676773383185036 ], [ 23.484282668110609, 56.664913642050919 ], [ 23.485367872829045, 56.660288601437799 ], [ 23.476066114759362, 56.656180324762147 ], [ 23.444543491189165, 56.641555894988528 ], [ 23.438187289811538, 56.634450384777381 ], [ 23.424699740700476, 56.622125556549179 ], [ 23.412917514831406, 56.616027736690683 ], [ 23.405941195829485, 56.606441759579525 ], [ 23.480251905800799, 56.599542954943388 ], [ 23.477151320377118, 56.586933905875014 ], [ 23.448419223868086, 56.579079087729667 ], [ 23.436792025831323, 56.577063707024422 ], [ 23.432141147695802, 56.57083669685602 ], [ 23.434466586763563, 56.564092922750149 ], [ 23.445938755169379, 56.556393134235748 ], [ 23.458651157025258, 56.544817613042369 ], [ 23.459271274649609, 56.529831448062851 ], [ 23.44748904788122, 56.505621039379434 ], [ 23.437877232348399, 56.499264838001864 ], [ 23.415087925167597, 56.493296210251856 ], [ 23.393729467241087, 56.518911683727197 ], [ 23.383002432116541, 56.545729271088987 ], [ 23.35618484475475, 56.545729271088987 ], [ 23.315064543893584, 56.513548166614555 ], [ 23.273944243032361, 56.490306257627651 ], [ 23.288246956531793, 56.468852187378502 ], [ 23.309701026780942, 56.459912991891031 ], [ 23.275732082669435, 56.454549473879069 ], [ 23.214945551196195, 56.454549473879069 ], [ 23.172037410697953, 56.45097379550424 ], [ 23.148795501710993, 56.43309540362992 ], [ 23.129129271098975, 56.445610278391598 ], [ 23.121977914349259, 56.470640026116257 ], [ 23.089796809874883, 56.479579222503105 ], [ 23.086221131499997, 56.524275201739158 ], [ 23.088008970237752, 56.545729271088987 ], [ 23.066554899988603, 56.551092789100892 ], [ 23.041525152263944, 56.577910376462683 ], [ 23.021858921651869, 56.59042525032504 ], [ 22.980738620790703, 56.577910376462683 ], [ 22.961072389279309, 56.601152285449587 ], [ 22.925315606430104, 56.588637411587229 ], [ 22.930679123542689, 56.568971180075891 ], [ 22.896710179431238, 56.56718334133808 ], [ 22.862741235319731, 56.552880627838704 ], [ 22.848438522719619, 56.538577914339271 ], [ 22.834135809220186, 56.540365753976346 ], [ 22.82340877409564, 56.561819824225495 ], [ 22.798123000176304, 56.56833038973565 ], [ 22.791921828429622, 56.578975734942162 ], [ 22.788614535632291, 56.581352850853364 ], [ 22.784428744590855, 56.585771185891474 ], [ 22.778692660837635, 56.58781240501844 ], [ 22.776987339394168, 56.591791490484866 ], [ 22.776677280132333, 56.596649075094717 ], [ 22.776987339394168, 56.601351630073623 ], [ 22.780863071173769, 56.606105861895969 ], [ 22.793162061879627, 56.60729442030123 ], [ 22.817191603409753, 56.607346096245294 ], [ 22.829283887641282, 56.610498359411736 ], [ 22.840756056047155, 56.617190457573543 ], [ 22.854295282001658, 56.630858872938632 ], [ 22.859256219399015, 56.644243069262188 ], [ 22.837810500254363, 56.658454087885843 ], [ 22.828663770916251, 56.671579901791006 ], [ 22.805254347010475, 56.678375352740318 ], [ 22.800138380881549, 56.696022854471153 ], [ 22.826028272586711, 56.698089912019782 ], [ 22.875224237208784, 56.70904531468949 ], [ 22.90343956888097, 56.711629137074965 ], [ 22.986173536879221, 56.71075063703222 ], [ 23.028703240861887, 56.694937648853397 ], [ 23.083945346700375, 56.690648505024456 ], [ 23.099293246885793, 56.691578681011265 ], [ 23.123322788415919, 56.698813382431638 ], [ 23.171743604883432, 56.692405504210626 ], [ 23.193654412920807, 56.704962877334879 ], [ 23.215823601577938, 56.711060696294055 ], [ 23.272305941765808, 56.710285549938135 ], [ 23.299642775193888, 56.715349840122997 ], [ 23.325222609435855, 56.749456285179406 ], [ 23.314990676278683, 56.765475978933239 ], [ 23.315920851366172, 56.774157620277947 ], [ 23.321966994381285, 56.782115790311423 ], [ 23.375038689883638, 56.800770982394909 ], [ 23.389456414082247, 56.793975532344916 ], [ 23.397207879440089, 56.792244371580466 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-040", "NAME_1": "Jaunpils" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.083945346700375, 56.690648505024456 ], [ 23.028703240861887, 56.694937648853397 ], [ 22.986173536879221, 56.71075063703222 ], [ 22.90343956888097, 56.711629137074965 ], [ 22.875224237208784, 56.70904531468949 ], [ 22.826028272586711, 56.698089912019782 ], [ 22.818431837759078, 56.708218492389506 ], [ 22.814866164341993, 56.711060696294055 ], [ 22.814401076348588, 56.715246487335492 ], [ 22.818896925752483, 56.717830308821647 ], [ 22.824788039136706, 56.719794013582828 ], [ 22.828663770916251, 56.725969346907789 ], [ 22.826648390211005, 56.733746649788031 ], [ 22.82060224809527, 56.771547960370071 ], [ 22.787684359645482, 56.796791896928482 ], [ 22.788924594894127, 56.803871567818589 ], [ 22.816257417345923, 56.813905145605929 ], [ 22.846650683082544, 56.828207859105362 ], [ 22.835923647957998, 56.849661929354511 ], [ 22.875256110081409, 56.858601124841982 ], [ 22.907437214555785, 56.853237607729397 ], [ 22.943193998304366, 56.855025446467153 ], [ 22.923527767692292, 56.833571376218003 ], [ 22.932466963179763, 56.810329467231099 ], [ 22.975375102778742, 56.801390271743628 ], [ 23.036161634251982, 56.80675378885627 ], [ 23.055827865763376, 56.794238914993912 ], [ 23.070130578363489, 56.760269970882405 ], [ 23.093372487350393, 56.720937509658313 ], [ 23.123322788415919, 56.698813382431638 ], [ 23.099293246885793, 56.691578681011265 ], [ 23.083945346700375, 56.690648505024456 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-018", "NAME_1": "Brocenu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 22.788924594894127, 56.803871567818589 ], [ 22.787684359645482, 56.796791896928482 ], [ 22.82060224809527, 56.771547960370071 ], [ 22.826648390211005, 56.733746649788031 ], [ 22.828663770916251, 56.725969346907789 ], [ 22.824788039136706, 56.719794013582828 ], [ 22.818896925752483, 56.717830308821647 ], [ 22.814401076348588, 56.715246487335492 ], [ 22.814866164341993, 56.711060696294055 ], [ 22.818431837759078, 56.708218492389506 ], [ 22.826028272586711, 56.698089912019782 ], [ 22.800138380881549, 56.696022854471153 ], [ 22.805254347010475, 56.678375352740318 ], [ 22.828663770916251, 56.671579901791006 ], [ 22.837810500254363, 56.658454087885843 ], [ 22.859256219399015, 56.644243069262188 ], [ 22.854295282001658, 56.630858872938632 ], [ 22.840756056047155, 56.617190457573543 ], [ 22.829283887641282, 56.610498359411736 ], [ 22.817191603409753, 56.607346096245294 ], [ 22.793162061879627, 56.60729442030123 ], [ 22.780863071173769, 56.606105861895969 ], [ 22.776987339394168, 56.601351630073623 ], [ 22.776677280132333, 56.596649075094717 ], [ 22.776987339394168, 56.591791490484866 ], [ 22.778692660837635, 56.58781240501844 ], [ 22.784428744590855, 56.585771185891474 ], [ 22.788614535632291, 56.581352850853364 ], [ 22.791921828429622, 56.578975734942162 ], [ 22.798123000176304, 56.56833038973565 ], [ 22.773421665077763, 56.567503567435665 ], [ 22.755128208200233, 56.562025865201463 ], [ 22.735904575335894, 56.565539863573804 ], [ 22.732287225075368, 56.565281481155409 ], [ 22.712074313678613, 56.565372530317973 ], [ 22.693722422451799, 56.588226511344374 ], [ 22.654856041173332, 56.604230314977031 ], [ 22.60455837107196, 56.599657799268016 ], [ 22.574837020312202, 56.567650192002759 ], [ 22.549688186160836, 56.579081479926344 ], [ 22.535970639933055, 56.620234119509007 ], [ 22.501676773464283, 56.638524180546483 ], [ 22.497104258654588, 56.684249334938841 ], [ 22.487959227236558, 56.723115716217308 ], [ 22.460524134780997, 56.736833262445089 ], [ 22.442234072844144, 56.771127128913861 ], [ 22.462810392185816, 56.805420994483256 ], [ 22.490854932708942, 56.851517238829501 ], [ 22.527648552938331, 56.841595364034788 ], [ 22.586301304361712, 56.837151191474277 ], [ 22.634257032835762, 56.82412873035662 ], [ 22.645884229973205, 56.816351427476377 ], [ 22.642008498193604, 56.808212389390235 ], [ 22.679060499942125, 56.809555976527065 ], [ 22.718799675964249, 56.802011216744233 ], [ 22.788924594894127, 56.803871567818589 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-069", "NAME_1": "Ozolnieku" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.996344434647938, 56.730491034733461 ], [ 23.998204786621613, 56.721602687813743 ], [ 24.00812666231559, 56.709975491575676 ], [ 24.000685256219583, 56.695635280843533 ], [ 24.033913202132567, 56.68821971316919 ], [ 24.042129753685174, 56.661244614947009 ], [ 24.034533318857541, 56.659487617559478 ], [ 24.023474561601745, 56.658505763829908 ], [ 24.017738477848468, 56.662743231714728 ], [ 24.00890180777219, 56.666205553243685 ], [ 24.006731398335376, 56.664758613319293 ], [ 24.009987013389946, 56.658867499035807 ], [ 24.036393669931897, 56.641478379723424 ], [ 24.046160515994984, 56.637757677574712 ], [ 24.050966423761452, 56.635251370454341 ], [ 24.050346307036421, 56.631840724869505 ], [ 24.051896599748261, 56.627964993089904 ], [ 24.055152214802831, 56.623779202048524 ], [ 24.057477654769912, 56.619076647069562 ], [ 24.049106072687096, 56.610989284927541 ], [ 24.039339226624008, 56.608793037069006 ], [ 24.030037468554326, 56.608793037069006 ], [ 24.02647179513724, 56.607837023559739 ], [ 24.026575147924746, 56.602746894053894 ], [ 24.040889520235169, 56.592411607209897 ], [ 24.055617302796293, 56.58574534836913 ], [ 24.081558872244159, 56.581895454111873 ], [ 24.094271274999301, 56.581766262003384 ], [ 24.106673617593344, 56.580370998922433 ], [ 24.11023929190975, 56.574944973531672 ], [ 24.10527835541177, 56.5639637324403 ], [ 24.088380160715815, 56.550760403269976 ], [ 24.078871697970442, 56.535464179028622 ], [ 24.080938754619808, 56.527454332151706 ], [ 24.042904900940414, 56.502830512318269 ], [ 24.031742790897056, 56.501719469178113 ], [ 24.017743371059737, 56.502013034873642 ], [ 23.99231367413671, 56.502546292377474 ], [ 23.969413677499176, 56.518911683727197 ], [ 23.964050160386591, 56.554668467475778 ], [ 23.940808251399687, 56.579698215200438 ], [ 23.912202824400822, 56.608303642199303 ], [ 23.865719006427014, 56.615454998949019 ], [ 23.82817438394062, 56.627969872811377 ], [ 23.791941897500578, 56.646880719669468 ], [ 23.807818331051124, 56.65419577011869 ], [ 23.793615510647271, 56.681498590287674 ], [ 23.731209870339228, 56.690498589838 ], [ 23.710176999369025, 56.70663479615888 ], [ 23.683359411107915, 56.697695599772089 ], [ 23.670844537245557, 56.715573991646352 ], [ 23.701237802982178, 56.720937509658313 ], [ 23.701237802982178, 56.737028061895501 ], [ 23.756307407161103, 56.744133613475469 ], [ 23.767469517204461, 56.737932440829468 ], [ 23.783902622108315, 56.732093004288686 ], [ 23.801265902999035, 56.729535021224194 ], [ 23.811239454637132, 56.73255809228209 ], [ 23.818215772739677, 56.735503648074882 ], [ 23.828292678064599, 56.738139147303798 ], [ 23.900898064793864, 56.745838934918879 ], [ 23.912886997137207, 56.745425522869539 ], [ 23.919553256877293, 56.742144070292568 ], [ 23.924979282268055, 56.734108384993931 ], [ 23.935211216324547, 56.731240343566981 ], [ 23.941412388071228, 56.728579006815664 ], [ 23.996344434647938, 56.730491034733461 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-JEL", "NAME_1": "Jelgava" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 23.683804230181067, 56.674098589877985 ], [ 23.731209870339228, 56.690498589838 ], [ 23.793615510647271, 56.681498590287674 ], [ 23.807818331051124, 56.65419577011869 ], [ 23.791941897500578, 56.646880719669468 ], [ 23.769818331450836, 56.636687308972114 ], [ 23.778804230530795, 56.6175788486849 ], [ 23.739007050035298, 56.6076591070821 ], [ 23.707587308907137, 56.591887308752291 ], [ 23.670992949664878, 56.601501410361777 ], [ 23.676992949365115, 56.629895770073688 ], [ 23.631181668699014, 56.650298589508282 ], [ 23.617950646704969, 56.669543712572249 ], [ 23.644412690693116, 56.677963454250005 ], [ 23.683804230181067, 56.674098589877985 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-DGV", "NAME_1": "Daugavpils" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.594919269308832, 55.962130279488804 ], [ 26.609768905510577, 55.958673419542663 ], [ 26.612579916429979, 55.94602387130459 ], [ 26.61679643280911, 55.923535784848582 ], [ 26.61117441097025, 55.903858709311976 ], [ 26.631927930929237, 55.897406317347645 ], [ 26.6249292322982, 55.888861395437004 ], [ 26.616709831693356, 55.881170965267813 ], [ 26.601817253763215, 55.873724676752374 ], [ 26.597119357272504, 55.85326051546042 ], [ 26.581658797215709, 55.840610967222347 ], [ 26.556359700739563, 55.837799956302888 ], [ 26.532466108823826, 55.832177934464085 ], [ 26.51841105512608, 55.826555912625224 ], [ 26.504356000528958, 55.840610967222347 ], [ 26.490300946831212, 55.85326051546042 ], [ 26.48748993591181, 55.868721074617895 ], [ 26.485769076881354, 55.892889715188176 ], [ 26.449310742796513, 55.90570709850374 ], [ 26.437917514181891, 55.914618231546115 ], [ 26.471864215361222, 55.933230279553754 ], [ 26.54110825823949, 55.92708533342136 ], [ 26.594919269308832, 55.962130279488804 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-REZ", "NAME_1": "Rezekne" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 27.340169016386994, 56.560760606316876 ], [ 27.363711316923741, 56.555221273542884 ], [ 27.365536672679298, 56.538793073541456 ], [ 27.360973283290377, 56.520539517784471 ], [ 27.355497216923027, 56.494984539005259 ], [ 27.339069016921599, 56.47490562749266 ], [ 27.284639408082171, 56.489658775432133 ], [ 27.274284355038958, 56.515546408040279 ], [ 27.310056339128721, 56.553347928164328 ], [ 27.340169016386994, 56.560760606316876 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-028", "NAME_1": "Durbes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.292439258165189, 56.756756759416874 ], [ 21.31589130364074, 56.739700725607975 ], [ 21.337211346126708, 56.718380684021326 ], [ 21.399039466997806, 56.692796633757609 ], [ 21.403303475674818, 56.671476592170961 ], [ 21.431019529827438, 56.673608596059807 ], [ 21.452339571414086, 56.645892541907244 ], [ 21.490715646809633, 56.652288554473159 ], [ 21.518431701861516, 56.652288554473159 ], [ 21.571731806277796, 56.658684567039131 ], [ 21.607975876885178, 56.643760537119078 ], [ 21.618635898128161, 56.613912479077612 ], [ 21.618635898128161, 56.588328428813895 ], [ 21.571731806277796, 56.560612373762012 ], [ 21.52909172220518, 56.571272395004996 ], [ 21.499243664163771, 56.552084357307194 ], [ 21.52909172220518, 56.513708281911647 ], [ 21.482187630354815, 56.511576278022801 ], [ 21.473659613900054, 56.520104294477562 ], [ 21.433151533716284, 56.545688344741279 ], [ 21.399039466997806, 56.558480369873166 ], [ 21.407567483452567, 56.520104294477562 ], [ 21.354267379036287, 56.503048261567983 ], [ 21.347871366470372, 56.543556340852433 ], [ 21.256195186658545, 56.530764315720546 ], [ 21.254063182769642, 56.588328428813895 ], [ 21.281779236922205, 56.611780474289446 ], [ 21.258327190547391, 56.656552562250909 ], [ 21.288175249488177, 56.682136612514626 ], [ 21.273251220467444, 56.707720662778343 ], [ 21.260459195335557, 56.739700725607975 ], [ 21.292439258165189, 56.756756759416874 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-037", "NAME_1": "Incukalna" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.630122348067914, 57.061024109375126 ], [ 24.580062851719219, 57.059236269738051 ], [ 24.565530100633623, 57.060001151232143 ], [ 24.550455160876936, 57.083699004805226 ], [ 24.514297471950727, 57.079526964397871 ], [ 24.508734750508324, 57.105949890574948 ], [ 24.553236521148506, 57.124028735038053 ], [ 24.568534005340041, 57.137935538194483 ], [ 24.618598497422681, 57.132372816752081 ], [ 24.665881629233809, 57.125419415173837 ], [ 24.700648638024234, 57.137935538194483 ], [ 24.736806326950386, 57.147670300943616 ], [ 24.772964014977276, 57.147670300943616 ], [ 24.77991741745484, 57.135154177922971 ], [ 24.766010613399089, 57.115684653324081 ], [ 24.749322449971089, 57.098996488996761 ], [ 24.759057211820846, 57.078136284262087 ], [ 24.707602039602421, 57.062838800070551 ], [ 24.678397752254455, 57.060057439798982 ], [ 24.650584145042217, 57.073964242955412 ], [ 24.630122348067914, 57.061024109375126 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-011", "NAME_1": "Ādaži" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.34880651151127, 57.183827989869826 ], [ 24.372448077416834, 57.182437309734041 ], [ 24.394698962287237, 57.178265268427367 ], [ 24.425293929771044, 57.181046628698937 ], [ 24.467014340139656, 57.182437309734041 ], [ 24.508734750508324, 57.105949890574948 ], [ 24.501781348930081, 57.094824447690087 ], [ 24.458670258425684, 57.072573562819628 ], [ 24.407215086207259, 57.061448119934767 ], [ 24.362713314667701, 57.057276078628092 ], [ 24.320992904299089, 57.028071791280126 ], [ 24.290397936815339, 57.030853152451016 ], [ 24.261193650366636, 57.041978595335877 ], [ 24.247286846310885, 57.060057439798982 ], [ 24.258412289195746, 57.075354923091197 ], [ 24.26536569077399, 57.098996488996761 ], [ 24.320992904299089, 57.112903292153192 ], [ 24.337681068626409, 57.128200776344727 ], [ 24.341853109933083, 57.162967784235832 ], [ 24.34880651151127, 57.183827989869826 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-VMR", "NAME_1": "Valmiera" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.456935934545697, 57.537263956966001 ], [ 25.452238902303463, 57.515344472269533 ], [ 25.431885095021073, 57.505950407785065 ], [ 25.395874512698583, 57.509081762613221 ], [ 25.377086383729591, 57.509081762613221 ], [ 25.372389350588037, 57.527869892481533 ], [ 25.378652061143669, 57.549789377178001 ], [ 25.41153128773874, 57.556052086834313 ], [ 25.43971348209152, 57.556052086834313 ], [ 25.456935934545697, 57.537263956966001 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-022", "NAME_1": "Cesu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.231478377924759, 57.296149626204283 ], [ 25.231478377924759, 57.330594530213375 ], [ 25.254963540035305, 57.325897497971141 ], [ 25.273751669903618, 57.318069110900694 ], [ 25.311327929640242, 57.31337207865846 ], [ 25.323853348952866, 57.308675045516907 ], [ 25.311327929640242, 57.296149626204283 ], [ 25.331681736922576, 57.291452593961992 ], [ 25.362995286103569, 57.296149626204283 ], [ 25.394308835284505, 57.302412335860595 ], [ 25.427188062778839, 57.289886916547914 ], [ 25.466329999030222, 57.277361496335971 ], [ 25.489815161140768, 57.263270399609212 ], [ 25.500774903938634, 57.24917930198319 ], [ 25.500774903938634, 57.216300075388119 ], [ 25.522694388635102, 57.20847168741841 ], [ 25.546179550745649, 57.213168719660644 ], [ 25.560270647472407, 57.222562785044488 ], [ 25.575927422512507, 57.203774655176176 ], [ 25.572796067684351, 57.170895428581161 ], [ 25.563402002300563, 57.147410266470615 ], [ 25.53208845311957, 57.156804330955083 ], [ 25.508603291009081, 57.156804330955083 ], [ 25.4960778716964, 57.152107298712849 ], [ 25.458501611959832, 57.156804330955083 ], [ 25.444410514333754, 57.170895428581161 ], [ 25.41153128773874, 57.186552202721941 ], [ 25.380217738557747, 57.188117880136019 ], [ 25.364560963517647, 57.205340332590254 ], [ 25.369257995759881, 57.219431430216275 ], [ 25.359863931275413, 57.231956849528956 ], [ 25.317590639296554, 57.231956849528956 ], [ 25.319156316710632, 57.258573366467658 ], [ 25.287842767529696, 57.280492851164126 ], [ 25.231478377924759, 57.296149626204283 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-055", "NAME_1": "Ligatnes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.980969982678516, 57.238219559185268 ], [ 25.048294114181999, 57.241350914912744 ], [ 25.090567405261538, 57.247613624569112 ], [ 25.10465850288756, 57.233522526943034 ], [ 25.139103407796028, 57.233522526943034 ], [ 25.159457214179099, 57.227259817286722 ], [ 25.171982634391043, 57.206906010004332 ], [ 25.178245344047355, 57.181855170479707 ], [ 25.189205086845277, 57.163067040611395 ], [ 25.212690248955823, 57.145844589056537 ], [ 25.195467796501589, 57.133319168844537 ], [ 25.173548311805121, 57.11766239380438 ], [ 25.137537729482631, 57.111399684148068 ], [ 25.112486889958006, 57.10983400673399 ], [ 25.067082243150992, 57.114531038976224 ], [ 25.026374629485531, 57.119228071218458 ], [ 24.987446730082524, 57.124678860341078 ], [ 24.984036086296328, 57.140750230938352 ], [ 24.983570998302923, 57.145013536345573 ], [ 24.978248324800347, 57.158733629453423 ], [ 24.975664504213455, 57.170670884953324 ], [ 24.973132358671421, 57.177750555843431 ], [ 24.967396274918144, 57.185011094786148 ], [ 24.934375033680851, 57.20839468027026 ], [ 24.900371942311267, 57.218678290270873 ], [ 24.923471306955207, 57.236041572060856 ], [ 24.933134800230846, 57.246221829273964 ], [ 24.980969982678516, 57.238219559185268 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "LV-JKB", "NAME_1": "Jekabpils" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 25.820736875106661, 56.486807300416558 ], [ 25.826426628486104, 56.527167059012527 ], [ 25.854129531852379, 56.535783197336684 ], [ 25.878617480312471, 56.535783197336684 ], [ 25.889748365894377, 56.522426134458499 ], [ 25.918688668946913, 56.529104666347223 ], [ 25.925367200835638, 56.513521426172872 ], [ 25.876556836728639, 56.495306707638406 ], [ 25.883069834904916, 56.475676414834652 ], [ 25.845224823566753, 56.477902592130874 ], [ 25.820736875106661, 56.486807300416558 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/nicaragua.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/nicaragua.geojson new file mode 100644 index 000000000000..cdb45cff5812 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/nicaragua.geojson @@ -0,0 +1,23 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "NI-SJ", "NAME_1": "Rio San Juan" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -84.19160050499994, 10.781720276000044 ], [ -84.19687150099989, 10.788515727000089 ], [ -84.218885660999973, 10.80595652300012 ], [ -84.221159423999978, 10.809418844000078 ], [ -84.225241862999894, 10.81368214900003 ], [ -84.227102213999899, 10.819314881000068 ], [ -84.222658040999903, 10.827040507000063 ], [ -84.218523925999875, 10.829831035000026 ], [ -84.204648803999902, 10.836988220000066 ], [ -84.208369506999901, 10.860966085000072 ], [ -84.225655273999905, 10.875306295000073 ], [ -84.244723877999888, 10.88491811100009 ], [ -84.253663900999925, 10.89471079600014 ], [ -84.264283406999908, 10.901816305000082 ], [ -84.310740519999939, 10.919412130000055 ], [ -84.321308349999896, 10.9291531370001 ], [ -84.324098876999955, 10.936181132000115 ], [ -84.337405558999876, 10.952665914000093 ], [ -84.341798055999874, 10.959900615000066 ], [ -84.343865112999936, 10.972277121000033 ], [ -84.343658406999879, 10.982379863000062 ], [ -84.3459838469999, 10.989898784000019 ], [ -84.355466471999875, 10.994627177000098 ], [ -84.363967244999884, 10.989614563000131 ], [ -84.417762410999899, 10.955043030000041 ], [ -84.427245035999874, 10.951115621000071 ], [ -84.438200439999946, 10.952200826000066 ], [ -84.448871623999963, 10.956334941000094 ], [ -84.457837483999896, 10.961347555000145 ], [ -84.46638993399992, 10.968453064000087 ], [ -84.489127563999887, 10.996358337000061 ], [ -84.493313354999941, 10.999407248000097 ], [ -84.498170939999852, 11.001991069000098 ], [ -84.503338582999874, 11.004032288000047 ], [ -84.508738769999923, 11.005530904000054 ], [ -84.558606526999966, 11.027209168000056 ], [ -84.581680053999946, 11.034469706000024 ], [ -84.603229125999889, 11.033281149000089 ], [ -84.620669921999934, 11.035761617000077 ], [ -84.658729614999885, 11.062736715000099 ], [ -84.676454630999899, 11.070410665000082 ], [ -84.707770548999918, 11.063046774000085 ], [ -84.781771199999923, 11.014884339000091 ], [ -84.884969034999955, 10.947679138000041 ], [ -84.941792114414511, 10.980111229149884 ], [ -85.027331267523948, 11.008624280486117 ], [ -85.161749936310514, 11.057503796163246 ], [ -85.210629451987586, 11.077870261403405 ], [ -85.300241897245769, 11.110456604888384 ], [ -85.340974827726086, 11.147116241421372 ], [ -85.101518317116643, 11.631460882713554 ], [ -85.083302374604898, 11.662208359927831 ], [ -85.080873582749632, 11.665128079097542 ], [ -85.076687791708196, 11.668926296511358 ], [ -85.061184861891832, 11.676522732238311 ], [ -85.041160244249852, 11.690346178133609 ], [ -85.031987678288715, 11.695307115530966 ], [ -85.025708991276929, 11.697761745807895 ], [ -85.021058112242088, 11.696004747521044 ], [ -85.018551805121717, 11.695384629896751 ], [ -85.013694221411185, 11.69592723225594 ], [ -84.9950390293277, 11.702826035992757 ], [ -84.988992886312644, 11.706288357521657 ], [ -84.985685594414633, 11.708639635011139 ], [ -84.982378303415942, 11.714194850711749 ], [ -84.977804937847566, 11.720137640939356 ], [ -84.970828619744964, 11.727475694247858 ], [ -84.96943335576475, 11.729284369378149 ], [ -84.968451503833819, 11.731506456557725 ], [ -84.966901211121979, 11.733831894726166 ], [ -84.962741257602943, 11.738405260294485 ], [ -84.960777553741082, 11.741324978564876 ], [ -84.959795701810151, 11.745355739975423 ], [ -84.959769864287807, 11.746518459958963 ], [ -84.956979336327265, 11.753029690068104 ], [ -84.942122361657653, 11.775612290774575 ], [ -84.899360113678313, 11.784810696056752 ], [ -84.874271205851471, 11.801062933807316 ], [ -84.808228726074844, 11.860800889949076 ], [ -84.804973111020217, 11.865606797715543 ], [ -84.800167202354487, 11.867053738539198 ], [ -84.794973720960456, 11.867828883995799 ], [ -84.721308967035156, 11.866924547329972 ], [ -84.700870938243213, 11.870490220747058 ], [ -84.696504279149167, 11.870541896691179 ], [ -84.688029344278789, 11.868164780779978 ], [ -84.683998582868298, 11.867854723316839 ], [ -84.668909064201955, 11.869327500763518 ], [ -84.665524257938159, 11.868862412770113 ], [ -84.661751878946063, 11.868009752048408 ], [ -84.656945970280276, 11.866071885708948 ], [ -84.645706345871133, 11.863746445741867 ], [ -84.607414109773345, 11.862506212291862 ], [ -84.587156949033954, 11.793621527711309 ], [ -84.57219662067746, 11.766568915123344 ], [ -84.563928392281468, 11.759773464174032 ], [ -84.557598029325561, 11.753262234064835 ], [ -84.555220913414416, 11.746906032687264 ], [ -84.556357794976236, 11.734891261922201 ], [ -84.55506588378347, 11.708820502164428 ], [ -84.544265509845388, 11.683524888762577 ], [ -84.534291958207291, 11.652131456401605 ], [ -84.534782883723096, 11.644095771102968 ], [ -84.536514045386866, 11.63295950038065 ], [ -84.546384243338139, 11.610118516356408 ], [ -84.560517747595952, 11.562007758251411 ], [ -84.563308274657118, 11.542654934177847 ], [ -84.563644172340673, 11.529658311481853 ], [ -84.556280279711132, 11.491030177700509 ], [ -84.5525595766631, 11.45237620729614 ], [ -84.486129523258853, 11.428243312978509 ], [ -84.457190721174811, 11.410880032087789 ], [ -84.377453985812792, 11.361994126727552 ], [ -84.361976895317468, 11.346801256173023 ], [ -84.356111620354966, 11.333132839009295 ], [ -84.355388149943167, 11.320730496415251 ], [ -84.353346930816201, 11.307914739973285 ], [ -84.345828010354353, 11.292721869418699 ], [ -84.336836310647186, 11.283471788192458 ], [ -84.327560390999224, 11.276883042818156 ], [ -84.280534837612663, 11.25306020776236 ], [ -84.241079882430597, 11.225051580765808 ], [ -84.212683681806482, 11.197042955567952 ], [ -84.204002041361093, 11.185958359890378 ], [ -84.183589850990813, 11.1528337667649 ], [ -84.178551398328352, 11.147020167746518 ], [ -84.174417284130357, 11.144358831894579 ], [ -84.171420050594861, 11.144539699947188 ], [ -84.16793189244288, 11.143738715169548 ], [ -84.164133674129744, 11.141955878461033 ], [ -84.157777472752173, 11.138235175413001 ], [ -84.154857753582462, 11.13722748506035 ], [ -84.149250861038411, 11.135754705815032 ], [ -84.141731939677243, 11.132964178753809 ], [ -84.138863898250293, 11.132499090760405 ], [ -84.136590135126596, 11.132344062028835 ], [ -84.126332364447023, 11.133661810743945 ], [ -84.119950323748412, 11.13373932510973 ], [ -84.117211472631368, 11.133506781113056 ], [ -84.11082943373134, 11.132034002767 ], [ -84.094448004771607, 11.125522773557122 ], [ -84.081968146013139, 11.121414495982208 ], [ -84.050238816867875, 11.125445258292018 ], [ -84.043779262702799, 11.124825141567044 ], [ -84.040575323592293, 11.123042303959153 ], [ -84.041376309269253, 11.117461248937502 ], [ -84.041505499579102, 11.114567369088775 ], [ -84.041040411585698, 11.111931870759236 ], [ -84.039670986926467, 11.109838974788829 ], [ -84.02874142087984, 11.098599351279006 ], [ -84.018922898872688, 11.090589504402089 ], [ -84.013600227168752, 11.088031521337598 ], [ -84.009569464858885, 11.087488918079089 ], [ -84.000965338779338, 11.092010605904704 ], [ -83.994686651767552, 11.093405869884975 ], [ -83.992412888643855, 11.094181016240896 ], [ -83.987968716083344, 11.096506456207976 ], [ -83.985979173799819, 11.097979234554032 ], [ -83.980940721137358, 11.100847275980982 ], [ -83.977271694932767, 11.102242539961253 ], [ -83.969881964780825, 11.103482774310578 ], [ -83.963758308299248, 11.102475083957927 ], [ -83.954172329389451, 11.098909410540841 ], [ -83.94957312719805, 11.098289292916547 ], [ -83.945826585728355, 11.098444322547437 ], [ -83.943552822604659, 11.099607042530977 ], [ -83.940994838640847, 11.100537218517786 ], [ -83.938669399573143, 11.101622423236222 ], [ -83.936524827658673, 11.103017686317173 ], [ -83.928644171990925, 11.106118271740854 ], [ -83.919058193980447, 11.107358506989499 ], [ -83.914174770948932, 11.108598741338824 ], [ -83.900247972266072, 11.115109972347341 ], [ -83.897302415574018, 11.114567369088775 ], [ -83.895622931652952, 11.112707017115156 ], [ -83.895416226077941, 11.109606431691475 ], [ -83.896992357211502, 11.091054592395494 ], [ -83.896837327580613, 11.087876491706709 ], [ -83.895571254809568, 11.082450466315947 ], [ -83.894434374147011, 11.080047511983082 ], [ -83.89154049339902, 11.076016751471911 ], [ -83.888155687135225, 11.072528591521291 ], [ -83.886631231945785, 11.07059072518183 ], [ -83.88559770407079, 11.068110256483124 ], [ -83.885132616077328, 11.065164699791069 ], [ -83.884977587345759, 11.058550115995047 ], [ -83.88422827761292, 11.054674384215446 ], [ -83.882652147378678, 11.050798652435844 ], [ -83.878337165128073, 11.045605170142494 ], [ -83.874874843599116, 11.043744819068138 ], [ -83.871980963750445, 11.043667303803034 ], [ -83.8695780103169, 11.044674994155628 ], [ -83.867510951868894, 11.045992742870794 ], [ -83.865107998435349, 11.047155462854334 ], [ -83.858002489123578, 11.047388006851008 ], [ -83.84668535034865, 11.046535346129303 ], [ -83.807307908633049, 11.038938910402408 ], [ -83.799866503436363, 11.036535956069486 ], [ -83.797592740312723, 11.034985663357645 ], [ -83.794130418783766, 11.031704209881354 ], [ -83.775914476272021, 11.008294785975579 ], [ -83.761419236808308, 10.984704494916514 ], [ -83.735529344203883, 10.957160955913366 ], [ -83.718251105999911, 10.94399648600006 ], [ -83.710316535999937, 10.922674872000073 ], [ -83.692738410999937, 10.925930080000057 ], [ -83.696522589999915, 10.936590887000079 ], [ -83.696499785854115, 10.936594144736317 ], [ -83.688754410845718, 10.93458680566807 ], [ -83.680976324785831, 10.917119398852687 ], [ -83.678799709060002, 10.916154380185779 ], [ -83.676850114500567, 10.910298763549688 ], [ -83.679831847356198, 10.897010590307339 ], [ -83.669854510493167, 10.891717678072528 ], [ -83.669306803999945, 10.869751078000064 ], [ -83.660134236999852, 10.834171855000093 ], [ -83.66302811699984, 10.807015889000112 ], [ -83.698142252999872, 10.789161682000071 ], [ -83.763818115413699, 10.773683167843899 ], [ -83.768964802999932, 10.772470195000039 ], [ -83.835343180999956, 10.747613831000081 ], [ -83.855807047999917, 10.723997701000059 ], [ -83.859527750999916, 10.721775615000055 ], [ -83.886864583999852, 10.72714996400012 ], [ -83.893556681999968, 10.724927877000113 ], [ -83.907483479999968, 10.715367737000108 ], [ -83.917276163999929, 10.7134815470001 ], [ -83.92657792199995, 10.714902649000095 ], [ -83.933321695999979, 10.718054911000053 ], [ -83.99362809299987, 10.765002950000095 ], [ -83.998201456999908, 10.782056173000043 ], [ -84.00923437599991, 10.789445903000043 ], [ -84.022696085999968, 10.78722381700004 ], [ -84.034555826999878, 10.775519104000068 ], [ -84.051634887999938, 10.779549866000053 ], [ -84.076439574999966, 10.763814393000075 ], [ -84.088557698999864, 10.775519104000068 ], [ -84.095430663999934, 10.775519104000068 ], [ -84.106928670999935, 10.766914978000031 ], [ -84.118426676999974, 10.771229960000099 ], [ -84.137004354999931, 10.789161682000071 ], [ -84.149019124999882, 10.787172140000038 ], [ -84.15772972504675, 10.788424645281168 ], [ -84.164832112999875, 10.789445903000043 ], [ -84.180412557999915, 10.789755961000125 ], [ -84.19160050499994, 10.781720276000044 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-AN", "NAME_1": "Atlántico Norte" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -85.048163207999892, 14.605776266000063 ], [ -85.042220418999875, 14.61347605400006 ], [ -85.020206257999888, 14.633733215000063 ], [ -85.048524943999979, 14.653318583000086 ], [ -85.053925130999858, 14.66305959100012 ], [ -85.038215494999889, 14.667219544000062 ], [ -85.033047851999896, 14.669570821 ], [ -85.029792236999896, 14.675539449000027 ], [ -85.024547078999973, 14.712539775000081 ], [ -85.015658732999867, 14.728171896000035 ], [ -85.001990316999951, 14.740677592000026 ], [ -84.999948289999907, 14.742015988000105 ], [ -84.984368651999944, 14.752227275000067 ], [ -84.966462768999889, 14.764629618000129 ], [ -84.920625772999927, 14.807701925000032 ], [ -84.904218506999882, 14.81697784400005 ], [ -84.844428873999931, 14.827545675000124 ], [ -84.818099731999979, 14.828656718000033 ], [ -84.792132324999926, 14.821060283000065 ], [ -84.770169840999955, 14.805143942000129 ], [ -84.755467895999857, 14.781476135000105 ], [ -84.758568481999902, 14.778659770000047 ], [ -84.766397461999929, 14.768867086000085 ], [ -84.766940063999897, 14.766903381000049 ], [ -84.747044637999892, 14.764474590000091 ], [ -84.744279947999928, 14.752408142000107 ], [ -84.745287637999894, 14.739101461000089 ], [ -84.72484960999995, 14.725639750000127 ], [ -84.714410970999921, 14.708922424000093 ], [ -84.699321451999907, 14.674686788000088 ], [ -84.680847127999897, 14.685461325000119 ], [ -84.661701009999888, 14.683445943000066 ], [ -84.622969523999956, 14.667219544000062 ], [ -84.600438598999943, 14.662516989000082 ], [ -84.527419799999905, 14.6603982540001 ], [ -84.531218017999919, 14.653318583000086 ], [ -84.534215250999949, 14.633733215000063 ], [ -84.519048217999938, 14.638280742000092 ], [ -84.508480387999867, 14.632622172000069 ], [ -84.498015909999907, 14.623914693000089 ], [ -84.48269384799994, 14.619470520000093 ], [ -84.47160925299994, 14.622622783000054 ], [ -84.445719360999902, 14.636678772000067 ], [ -84.408434814999879, 14.649417013000033 ], [ -84.390012166999952, 14.671482849000114 ], [ -84.376137044999894, 14.696726787000074 ], [ -84.362933715999901, 14.715614523000113 ], [ -84.353192708999956, 14.705976868000093 ], [ -84.346035522999927, 14.679983622000037 ], [ -84.338387410999928, 14.674686788000088 ], [ -84.323168701999919, 14.673317363000109 ], [ -84.298880777999898, 14.667994690000072 ], [ -84.287796183999887, 14.667219544000062 ], [ -84.26728063999991, 14.677735698000021 ], [ -84.262164672999916, 14.699749858000104 ], [ -84.267332316999841, 14.746672058000058 ], [ -84.261802938999921, 14.758531799000068 ], [ -84.249219726999911, 14.759410298000105 ], [ -84.235396280999851, 14.754733582000128 ], [ -84.226378743999902, 14.749772644000089 ], [ -84.218678955999906, 14.743442282000075 ], [ -84.195011148999896, 14.718715108000055 ], [ -84.182893026999892, 14.713857523000044 ], [ -84.168191081999908, 14.714968567000128 ], [ -84.143799804999873, 14.721867371000101 ], [ -84.137882853999969, 14.725226339000116 ], [ -84.13385209199987, 14.73003224700004 ], [ -84.128736124999875, 14.734192200000066 ], [ -84.119615234999912, 14.736104228000073 ], [ -84.111217814999918, 14.734708964000092 ], [ -84.106515258999934, 14.732331848000058 ], [ -84.102277791999882, 14.731866760000031 ], [ -84.095430663999934, 14.736104228000073 ], [ -84.095430663999934, 14.743597310000027 ], [ -84.104189819999903, 14.751865540000068 ], [ -84.111114461999904, 14.761038106000058 ], [ -84.122715820999929, 14.784525045000038 ], [ -84.111760416999857, 14.793413392000048 ], [ -84.104448201999872, 14.793930156000087 ], [ -84.081555541999961, 14.779796651000055 ], [ -84.078971720999874, 14.77517161100009 ], [ -84.075199340999916, 14.771631775000031 ], [ -84.064683186999872, 14.770262349000063 ], [ -84.047810832999886, 14.770804952000105 ], [ -84.042669026999903, 14.768066101000059 ], [ -84.040756998999967, 14.76034047400006 ], [ -84.023574584999892, 14.758325094000028 ], [ -83.924717569999927, 14.763441061 ], [ -83.929859375999939, 14.771657613000045 ], [ -83.929652669999882, 14.780881857000054 ], [ -83.924717569999927, 14.803774516000061 ], [ -83.912651122999961, 14.797185771000073 ], [ -83.896553914999885, 14.780442606000122 ], [ -83.883763997999921, 14.77710947700011 ], [ -83.885004231999858, 14.781346944000077 ], [ -83.889939330999908, 14.790726216000024 ], [ -83.882678791999922, 14.78783233700004 ], [ -83.878751383999941, 14.786747132000045 ], [ -83.875263224999912, 14.784266663000068 ], [ -83.869475463999919, 14.77710947700011 ], [ -83.857305664999927, 14.787780661000028 ], [ -83.83950313299988, 14.797418315000044 ], [ -83.819659383999891, 14.803619486000031 ], [ -83.801210896999891, 14.803774516000061 ], [ -83.808988199999902, 14.808890483000056 ], [ -83.813923299999942, 14.81377390600008 ], [ -83.821054646999869, 14.825478618000062 ], [ -83.76529577699992, 14.828785909000061 ], [ -83.744521851999878, 14.836666565000101 ], [ -83.746563069999922, 14.852195333000026 ], [ -83.733928181999914, 14.852970480000039 ], [ -83.723618733999899, 14.851575216000057 ], [ -83.7162031659999, 14.847053528000032 ], [ -83.712430785999857, 14.83852691700011 ], [ -83.705015218999847, 14.83852691700011 ], [ -83.714497843999936, 14.867233175000109 ], [ -83.710622110999878, 14.878343607000119 ], [ -83.691966918999896, 14.886973572000073 ], [ -83.672149007999906, 14.88963490800009 ], [ -83.649953979999879, 14.888498027000082 ], [ -83.631557169999979, 14.883201192000044 ], [ -83.623056396999885, 14.872685038000085 ], [ -83.615614990999859, 14.872685038000085 ], [ -83.611300008999876, 14.884906514000107 ], [ -83.609181274999912, 14.89836822500007 ], [ -83.604272013999974, 14.90919443700011 ], [ -83.579777384999915, 14.918108623000123 ], [ -83.55486934399994, 14.937409770000073 ], [ -83.540477458999931, 14.941569723000015 ], [ -83.542441161999875, 14.945083720000056 ], [ -83.545128336999909, 14.952163391000084 ], [ -83.547350423999916, 14.955212301000103 ], [ -83.532493448999872, 14.951026509000073 ], [ -83.526860717999938, 14.94836517400006 ], [ -83.529909627999871, 14.961775207000088 ], [ -83.528617716999918, 14.973402405000058 ], [ -83.523036661999896, 14.977691548000024 ], [ -83.513218139999935, 14.96885487900002 ], [ -83.51262386099998, 14.984021911000042 ], [ -83.510996052999928, 14.99017140700002 ], [ -83.505725056999893, 14.996811829000109 ], [ -83.512468831999939, 15.006501160000141 ], [ -83.509084024999908, 15.011539612000107 ], [ -83.499007120999892, 15.012650655000115 ], [ -83.485855468999915, 15.010480245000039 ], [ -83.48055863499988, 15.005545146000088 ], [ -83.468388834999956, 14.987406719000063 ], [ -83.45919042999995, 14.982497457000122 ], [ -83.435729329999873, 14.985184631000052 ], [ -83.41547216799998, 14.996941020000051 ], [ -83.399891723999929, 15.013632508000086 ], [ -83.390305745999939, 15.030969950000099 ], [ -83.377825886999943, 15.021254781000053 ], [ -83.364984293999868, 15.016345521000119 ], [ -83.354545653999935, 15.010066834000028 ], [ -83.349352172999915, 14.996811829000109 ], [ -83.334236816999919, 15.00644948300004 ], [ -83.317054402999929, 15.007560526000134 ], [ -83.272974405999946, 15.003038839000098 ], [ -83.2848858239999, 14.997380269000075 ], [ -83.285660970999913, 14.992109274000128 ], [ -83.278322916999912, 14.987122498000076 ], [ -83.266153116999902, 14.982497457000122 ], [ -83.262019002999892, 14.98319508900002 ], [ -83.21773230099987, 14.982497457000122 ], [ -83.191325642999885, 14.994253845000117 ], [ -83.177398843999896, 14.996811829000109 ], [ -83.143654134999935, 14.994899801000088 ], [ -83.130444472447948, 14.997012021272383 ], [ -83.137766079999949, 14.986721096000053 ], [ -83.156076626999948, 14.978461005000042 ], [ -83.165150519999941, 14.96906159100007 ], [ -83.179839647999927, 14.985988674000055 ], [ -83.191883917999917, 14.974269924000055 ], [ -83.20148678299995, 14.953070380000042 ], [ -83.208892381999931, 14.94171784100007 ], [ -83.221669074999909, 14.935695705000057 ], [ -83.233876105999911, 14.92133209800005 ], [ -83.242909308999913, 14.904364325000074 ], [ -83.246449347999942, 14.890570380000042 ], [ -83.249094204999949, 14.885891018000052 ], [ -83.261830206999946, 14.87376536700009 ], [ -83.266957160999937, 14.86664459800005 ], [ -83.269520636999914, 14.856919664000088 ], [ -83.271351691999939, 14.835516669000071 ], [ -83.273793097999942, 14.825669664000088 ], [ -83.281971808999913, 14.813177802000041 ], [ -83.294016079999949, 14.804266669000071 ], [ -83.32843990799995, 14.790961005000042 ], [ -83.325998501999948, 14.796942450000074 ], [ -83.323231574999909, 14.801703192000048 ], [ -83.31476803299995, 14.811428127000056 ], [ -83.31476803299995, 14.803941148000092 ], [ -83.311390753999945, 14.809515692000048 ], [ -83.309437628999945, 14.814113674000055 ], [ -83.308583136999914, 14.819037177000041 ], [ -83.308501756999931, 14.825669664000088 ], [ -83.316273566999939, 14.82103099200009 ], [ -83.319488084999932, 14.820257880000042 ], [ -83.32843990799995, 14.825669664000088 ], [ -83.32843990799995, 14.831854559000078 ], [ -83.316477016999897, 14.83734772300005 ], [ -83.305083787999934, 14.838771877000056 ], [ -83.295074022999927, 14.835191148000092 ], [ -83.28742428299995, 14.825669664000088 ], [ -83.288197394999941, 14.844549872000073 ], [ -83.298939581999946, 14.870428778000075 ], [ -83.301665818999936, 14.890570380000042 ], [ -83.307850714999915, 14.910589911000045 ], [ -83.322173631999931, 14.913885809000078 ], [ -83.338368292999917, 14.908026434000078 ], [ -83.350168423999946, 14.900824286000045 ], [ -83.369862433999913, 14.883002020000049 ], [ -83.414133266999897, 14.827704169000071 ], [ -83.424631313999896, 14.803941148000092 ], [ -83.414865688999896, 14.81391022300005 ], [ -83.411529100999928, 14.818264065000051 ], [ -83.397816535999937, 14.807603257000039 ], [ -83.38695227799991, 14.766546942000048 ], [ -83.380238410999937, 14.757391669000071 ], [ -83.367054816999939, 14.749701239000046 ], [ -83.352650519999941, 14.736232815000051 ], [ -83.337513800999943, 14.731431382000039 ], [ -83.322173631999931, 14.749945380000042 ], [ -83.329457160999937, 14.756089585000041 ], [ -83.34788977799991, 14.767075914000088 ], [ -83.356312628999945, 14.770453192000048 ], [ -83.345041469999899, 14.776556708000044 ], [ -83.333485480999911, 14.773260809000078 ], [ -83.322987433999913, 14.763413804000038 ], [ -83.31476803299995, 14.749945380000042 ], [ -83.315419074999909, 14.772772528000075 ], [ -83.308176235999952, 14.779852606000077 ], [ -83.299224412999934, 14.771185614000046 ], [ -83.260121222999942, 14.59601471600007 ], [ -83.257964647999927, 14.590399481000077 ], [ -83.248605923999946, 14.57172272300005 ], [ -83.240305141999897, 14.523993231000077 ], [ -83.191802537999934, 14.386908270000049 ], [ -83.186594204999949, 14.347642320000091 ], [ -83.191395636999914, 14.313421942000048 ], [ -83.218576626999948, 14.25031159100007 ], [ -83.301665818999936, 14.119940497000073 ], [ -83.337513800999943, 14.077541408000059 ], [ -83.342640753999945, 14.060980536000045 ], [ -83.349680141999897, 14.048773505000042 ], [ -83.397287563999896, 14.016302802000041 ], [ -83.417388475999928, 13.98859284100007 ], [ -83.431263800999943, 13.956732489000046 ], [ -83.45531165299991, 13.86391836100006 ], [ -83.493804490999935, 13.73773834800005 ], [ -83.517486131999931, 13.62368398600006 ], [ -83.516021287999934, 13.574652411000045 ], [ -83.52017167899993, 13.550767320000091 ], [ -83.520375128999945, 13.531642971000053 ], [ -83.54133053299995, 13.48187897300005 ], [ -83.559152798999946, 13.415838934000078 ], [ -83.570139126999948, 13.287095445000091 ], [ -83.568226691999939, 13.263006903000075 ], [ -83.561146613999938, 13.249172268000052 ], [ -83.56859290299991, 13.24290599200009 ], [ -83.562977667999917, 13.230658270000049 ], [ -83.529571092999902, 13.032619533000059 ], [ -83.529650437717521, 13.032589830356358 ], [ -83.547969733016771, 13.030264391288597 ], [ -83.598173387092118, 13.033364975812958 ], [ -83.638946091888613, 13.031504624738602 ], [ -83.657291225609583, 13.037447414966209 ], [ -83.755734828999152, 13.093645535213284 ], [ -83.830924038113835, 13.147285671496547 ], [ -83.835239021263817, 13.151290595384637 ], [ -83.838158738634888, 13.155786444788589 ], [ -83.839037237778257, 13.161031602126741 ], [ -83.838339605788178, 13.166690172413496 ], [ -83.836143357929586, 13.172400417745052 ], [ -83.832551846090837, 13.178136502397649 ], [ -83.813664110010677, 13.200796617469905 ], [ -83.81002092222775, 13.206765245219856 ], [ -83.807824672570575, 13.212501328973133 ], [ -83.807204555845544, 13.218159898360625 ], [ -83.810925258893576, 13.222759101451345 ], [ -83.818625048307297, 13.226557318865162 ], [ -83.835859137988791, 13.231208197000683 ], [ -83.84629777672103, 13.235419827363103 ], [ -83.854126757343977, 13.240044867076961 ], [ -83.864307013657765, 13.244204819696677 ], [ -83.883530645622784, 13.247150377288051 ], [ -83.964559292177569, 13.250302639555173 ], [ -83.979752162732098, 13.251568712326218 ], [ -83.983808762564308, 13.254255885700559 ], [ -83.994273240617531, 13.256038723308393 ], [ -83.98869218559588, 13.244437363693351 ], [ -83.987606980877445, 13.234463812954573 ], [ -83.991456875134645, 13.230122992282247 ], [ -84.000500250785933, 13.235549018572328 ], [ -84.007321540156909, 13.235549018572328 ], [ -84.016390754229917, 13.230536404331588 ], [ -84.021015794843038, 13.230975653903272 ], [ -84.02781124489303, 13.235549018572328 ], [ -84.036105312610061, 13.214516710577698 ], [ -84.04806840743106, 13.212087917823112 ], [ -84.063493821982263, 13.217824002475709 ], [ -84.082433234006544, 13.221260483784306 ], [ -84.077265591034177, 13.215886135236929 ], [ -84.071839565643415, 13.205860906755447 ], [ -84.068764817742135, 13.201416734194936 ], [ -84.084448614711789, 13.204439806152095 ], [ -84.108607346551764, 13.197308458418604 ], [ -84.117185635108967, 13.201416734194936 ], [ -84.123619350852323, 13.202682806965981 ], [ -84.129277920239815, 13.208987332399431 ], [ -84.133334520072026, 13.216144516756003 ], [ -84.152609828880486, 13.275391547382014 ], [ -84.155193651265961, 13.280326646357651 ], [ -84.163100145355429, 13.282342027062896 ], [ -84.176613531988892, 13.280636704720109 ], [ -84.236894089590521, 13.264203598916936 ], [ -84.246635098131264, 13.263841863711036 ], [ -84.258339809634492, 13.267123318086647 ], [ -84.265212774949589, 13.271515814703093 ], [ -84.271517300383096, 13.274538885760933 ], [ -84.276891648930416, 13.27588247289782 ], [ -84.284488084657369, 13.27663178083202 ], [ -84.290973477244165, 13.276295884947103 ], [ -84.298440720862573, 13.273918769035959 ], [ -84.3089827141809, 13.267123318086647 ], [ -84.321230028043317, 13.254100856968932 ], [ -84.333684048380121, 13.249708360352543 ], [ -84.35347612202537, 13.247150377288051 ], [ -84.492924974208165, 13.246530260563077 ], [ -84.751436326625139, 13.215731106505359 ], [ -84.769755621924389, 13.2426803654065 ], [ -84.86962032681663, 13.366626287772931 ], [ -84.875511441100116, 13.376754869041974 ], [ -84.878922084886312, 13.380398057724165 ], [ -84.883107875927692, 13.381534939285984 ], [ -84.973774177336395, 13.298775132866069 ], [ -84.982843391409347, 13.295209459448984 ], [ -84.998242966639566, 13.293736681102928 ], [ -85.064621344999068, 13.295131944183879 ], [ -85.097952643699557, 13.292160549070047 ], [ -85.123351609888857, 13.277484443352364 ], [ -85.13632239506245, 13.259449367993909 ], [ -85.144487270670993, 13.241440131057175 ], [ -85.156269497439325, 13.206739406798192 ], [ -85.168671840932689, 13.181469630918741 ], [ -85.177327643855676, 13.171728624176637 ], [ -85.187094489019444, 13.164416409289856 ], [ -85.21572323274097, 13.151368109750479 ], [ -85.241845669342126, 13.145192776425461 ], [ -85.252439337705255, 13.146588040405732 ], [ -85.283264330184693, 13.159248766317489 ], [ -85.290395677018864, 13.169093125847041 ], [ -85.302307094996422, 13.170540065771377 ], [ -85.304167446970098, 13.172477932110837 ], [ -85.305407681319423, 13.18144379339634 ], [ -85.307371385181284, 13.184725246872631 ], [ -85.310833705810865, 13.187050685940392 ], [ -85.324889695702893, 13.193871975311424 ], [ -85.332460293008126, 13.198936266395549 ], [ -85.336491055317936, 13.20012482300217 ], [ -85.339824184738291, 13.200176499845554 ], [ -85.345301886972493, 13.198652045555434 ], [ -85.35142554435339, 13.197928575143635 ], [ -85.35450029225467, 13.198083603875205 ], [ -85.357445848047405, 13.198471178402144 ], [ -85.359926316746112, 13.199504706277139 ], [ -85.362200079869751, 13.200951646201474 ], [ -85.390828823591335, 13.226815701283556 ], [ -85.396358201769601, 13.231053168269113 ], [ -85.401112433591948, 13.233688665699333 ], [ -85.414574144281289, 13.238959662358525 ], [ -85.43444373229238, 13.258002428069574 ], [ -85.485370855880262, 13.325052599098171 ], [ -85.506377326352492, 13.370579534817637 ], [ -85.506118943934098, 13.406081243854317 ], [ -85.500434536124942, 13.4192328961812 ], [ -85.469351162126429, 13.446233831925781 ], [ -85.415039232274751, 13.480417792247295 ], [ -85.404057990284002, 13.489331976689357 ], [ -85.400647345598486, 13.497212633256424 ], [ -85.399381272827441, 13.506488552005067 ], [ -85.399794684876781, 13.511397813458302 ], [ -85.399329596883376, 13.529484564760821 ], [ -85.388813442886089, 13.56051626191595 ], [ -85.390441249963715, 13.570076402404027 ], [ -85.395221320207725, 13.58343476030592 ], [ -85.401939256791252, 13.594622707871679 ], [ -85.41000077961229, 13.611572576713058 ], [ -85.410879278755715, 13.620564277319545 ], [ -85.409122281368184, 13.626713772222786 ], [ -85.398709479259026, 13.633302516697768 ], [ -85.391578132424854, 13.641389878839846 ], [ -85.383774991122948, 13.653430488026572 ], [ -85.374886644203229, 13.677408351813995 ], [ -85.37010657395922, 13.686477565886946 ], [ -85.365093959718422, 13.691903591277708 ], [ -85.284659593265587, 13.702781480480951 ], [ -85.282566698194557, 13.70332408284014 ], [ -85.160610318111651, 13.777479763180509 ], [ -85.156889615063676, 13.778539130376544 ], [ -85.061339890623458, 13.735518499978753 ], [ -85.056792365275442, 13.737533881583374 ], [ -85.05175391261298, 13.742572333346516 ], [ -84.924810756711054, 13.940725612896699 ], [ -84.864039272694242, 14.040280260325744 ], [ -84.854840868311385, 14.059503892290763 ], [ -84.85282548670682, 14.071311957480816 ], [ -84.862075567933118, 14.107769680026706 ], [ -84.858949144087717, 14.154252631054078 ], [ -84.837115852214765, 14.268715929096857 ], [ -84.835462205816157, 14.292900499358552 ], [ -84.838046027302312, 14.306775621197971 ], [ -84.927420416618929, 14.312434189686087 ], [ -84.9345259259307, 14.314268704137362 ], [ -84.939667731380666, 14.317498480770269 ], [ -84.954033779635211, 14.334396674566847 ], [ -84.97080278222262, 14.349615383543096 ], [ -84.989561327093554, 14.373438219498212 ], [ -84.992429369419824, 14.380672919119888 ], [ -84.992816942148124, 14.387365017281695 ], [ -84.990879075808664, 14.393902085812613 ], [ -84.983127611350142, 14.4075188261329 ], [ -84.981990728889002, 14.412505601052658 ], [ -84.982972581719253, 14.434338893824872 ], [ -84.981577317738981, 14.440695095202443 ], [ -84.97038937017328, 14.459401964129313 ], [ -84.968606534364028, 14.469142970871417 ], [ -84.97023434144171, 14.476971951494363 ], [ -84.973774177336395, 14.483147283920005 ], [ -84.978270025841027, 14.487203883752215 ], [ -84.99312700140996, 14.495084540319283 ], [ -85.006485358412533, 14.50539398784224 ], [ -85.008113166389478, 14.507771103753441 ], [ -85.00896582711124, 14.510716661344816 ], [ -85.008294034442144, 14.520018419414498 ], [ -85.00857825438294, 14.528674221438166 ], [ -85.008061490445414, 14.534617010766397 ], [ -85.006175300050018, 14.544848944822945 ], [ -85.005813564844118, 14.549422309492002 ], [ -85.005968593575744, 14.555365098820232 ], [ -85.004444139285567, 14.561256212204398 ], [ -84.999224820369136, 14.575648097981343 ], [ -84.999483201888268, 14.582288520199029 ], [ -85.001085171443492, 14.588541367889775 ], [ -85.003178067413842, 14.592727158931211 ], [ -85.005529344004003, 14.596422024456842 ], [ -85.008733283114509, 14.598824977890388 ], [ -85.011523811074994, 14.600297756236444 ], [ -85.018861864383496, 14.602003079478493 ], [ -85.02365718199988, 14.602540872000063 ], [ -85.022221639999941, 14.605802104000077 ], [ -85.048163207999892, 14.605776266000063 ] ] ], [ [ [ -82.767323370999918, 14.414129950000074 ], [ -82.751047329999949, 14.422023830000057 ], [ -82.737782355999911, 14.421942450000074 ], [ -82.728993292999917, 14.413763739000046 ], [ -82.725697394999941, 14.397406317000048 ], [ -82.732533331999946, 14.369574286000045 ], [ -82.750843878999945, 14.361476955000057 ], [ -82.803944464999915, 14.36595286700009 ], [ -82.808257615999935, 14.366359768000052 ], [ -82.804351365999935, 14.366359768000052 ], [ -82.803700324999909, 14.36631907800006 ], [ -82.801625128999945, 14.366848049000055 ], [ -82.800445115999935, 14.369289455000057 ], [ -82.800852016999897, 14.373236395000049 ], [ -82.784779425999943, 14.381984768000052 ], [ -82.778228318999936, 14.39321523600006 ], [ -82.774647589999915, 14.404689846000053 ], [ -82.767323370999918, 14.414129950000074 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-JI", "NAME_1": "Jinotega" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -85.086377929999884, 14.544539693000033 ], [ -85.065242268999839, 14.554254862000064 ], [ -85.029637206999951, 14.5889555870001 ], [ -85.02365718199988, 14.602540872000063 ], [ -85.018861864383496, 14.602003079478493 ], [ -85.011523811074994, 14.600297756236444 ], [ -85.008733283114509, 14.598824977890388 ], [ -85.005529344004003, 14.596422024456842 ], [ -85.003178067413842, 14.592727158931211 ], [ -85.001085171443492, 14.588541367889775 ], [ -84.999483201888268, 14.582288520199029 ], [ -84.999224820369136, 14.575648097981343 ], [ -85.004444139285567, 14.561256212204398 ], [ -85.005968593575744, 14.555365098820232 ], [ -85.005813564844118, 14.549422309492002 ], [ -85.006175300050018, 14.544848944822945 ], [ -85.008061490445414, 14.534617010766397 ], [ -85.00857825438294, 14.528674221438166 ], [ -85.008294034442144, 14.520018419414498 ], [ -85.00896582711124, 14.510716661344816 ], [ -85.008113166389478, 14.507771103753441 ], [ -85.006485358412533, 14.50539398784224 ], [ -84.99312700140996, 14.495084540319283 ], [ -84.978270025841027, 14.487203883752215 ], [ -84.973774177336395, 14.483147283920005 ], [ -84.97023434144171, 14.476971951494363 ], [ -84.968606534364028, 14.469142970871417 ], [ -84.97038937017328, 14.459401964129313 ], [ -84.981577317738981, 14.440695095202443 ], [ -84.982972581719253, 14.434338893824872 ], [ -84.981990728889002, 14.412505601052658 ], [ -84.983127611350142, 14.4075188261329 ], [ -84.990879075808664, 14.393902085812613 ], [ -84.992816942148124, 14.387365017281695 ], [ -84.992429369419824, 14.380672919119888 ], [ -84.989561327093554, 14.373438219498212 ], [ -84.97080278222262, 14.349615383543096 ], [ -84.954033779635211, 14.334396674566847 ], [ -84.939667731380666, 14.317498480770269 ], [ -84.9345259259307, 14.314268704137362 ], [ -84.927420416618929, 14.312434189686087 ], [ -84.838046027302312, 14.306775621197971 ], [ -84.835462205816157, 14.292900499358552 ], [ -84.837115852214765, 14.268715929096857 ], [ -84.858949144087717, 14.154252631054078 ], [ -84.862075567933118, 14.107769680026706 ], [ -84.85282548670682, 14.071311957480816 ], [ -84.854840868311385, 14.059503892290763 ], [ -84.864039272694242, 14.040280260325744 ], [ -84.924810756711054, 13.940725612896699 ], [ -85.05175391261298, 13.742572333346516 ], [ -85.056792365275442, 13.737533881583374 ], [ -85.061339890623458, 13.735518499978753 ], [ -85.156889615063676, 13.778539130376544 ], [ -85.160610318111651, 13.777479763180509 ], [ -85.282566698194557, 13.70332408284014 ], [ -85.284659593265587, 13.702781480480951 ], [ -85.365093959718422, 13.691903591277708 ], [ -85.37010657395922, 13.686477565886946 ], [ -85.374886644203229, 13.677408351813995 ], [ -85.383774991122948, 13.653430488026572 ], [ -85.391578132424854, 13.641389878839846 ], [ -85.398709479259026, 13.633302516697768 ], [ -85.409122281368184, 13.626713772222786 ], [ -85.410879278755715, 13.620564277319545 ], [ -85.41000077961229, 13.611572576713058 ], [ -85.401939256791252, 13.594622707871679 ], [ -85.395221320207725, 13.58343476030592 ], [ -85.390441249963715, 13.570076402404027 ], [ -85.388813442886089, 13.56051626191595 ], [ -85.399329596883376, 13.529484564760821 ], [ -85.399794684876781, 13.511397813458302 ], [ -85.399381272827441, 13.506488552005067 ], [ -85.400647345598486, 13.497212633256424 ], [ -85.404057990284002, 13.489331976689357 ], [ -85.415039232274751, 13.480417792247295 ], [ -85.469351162126429, 13.446233831925781 ], [ -85.500434536124942, 13.4192328961812 ], [ -85.506118943934098, 13.406081243854317 ], [ -85.506377326352492, 13.370579534817637 ], [ -85.562084520184442, 13.335129503523774 ], [ -85.581540697045511, 13.327791449315896 ], [ -85.604975959373007, 13.327713934950111 ], [ -85.625930752102533, 13.313864651532413 ], [ -85.639883389207057, 13.298155016141095 ], [ -85.65455949582406, 13.275107327441219 ], [ -85.672129483189053, 13.245858466095342 ], [ -85.745019090758433, 13.162220160531945 ], [ -85.782536179600982, 13.130258287390063 ], [ -85.793439908125265, 13.12397960037822 ], [ -85.83974199109997, 13.084989732290296 ], [ -85.896482713706234, 13.032615667878758 ], [ -85.918316005579186, 13.017526150111735 ], [ -85.928418749325829, 13.014193019792003 ], [ -85.941079475237586, 13.012487698348593 ], [ -85.97735632973081, 13.013934638272929 ], [ -85.989371101395193, 13.012100124720973 ], [ -85.994383714736614, 13.009619656022267 ], [ -86.007457851798392, 12.993935859052613 ], [ -86.041745164907411, 13.019619045182765 ], [ -86.057222256302055, 13.034992783789903 ], [ -86.071691657344104, 13.043364365872776 ], [ -86.080735032995335, 13.047162584185912 ], [ -86.094455126103185, 13.046826687401676 ], [ -86.09951941628799, 13.047007555454286 ], [ -86.11517737483598, 13.065662747537772 ], [ -86.159050665955476, 13.091010036883688 ], [ -86.234446580645169, 13.164571438021426 ], [ -86.241422898747771, 13.175113430440433 ], [ -86.247856615390447, 13.189143581910741 ], [ -86.236151902987899, 13.208134669879087 ], [ -86.23310299260902, 13.22477448215659 ], [ -86.235686814994494, 13.237254340015738 ], [ -86.221243252374165, 13.278828030489194 ], [ -86.230389980812959, 13.32171946877844 ], [ -86.230054084028723, 13.343035996713866 ], [ -86.227263556967557, 13.359804999301275 ], [ -86.221475796370896, 13.375256252274198 ], [ -86.212949184657134, 13.390345770940542 ], [ -86.176207242170449, 13.428767198247613 ], [ -86.159980841942286, 13.442693996930416 ], [ -86.144038661654918, 13.445536199935646 ], [ -86.130008511083929, 13.446104640716555 ], [ -86.11765784443395, 13.44098867368831 ], [ -86.108097703945873, 13.451711534159983 ], [ -86.069237027067118, 13.481968084959135 ], [ -86.059676886579041, 13.493285223734063 ], [ -86.050039231725123, 13.5047832305616 ], [ -86.03885128505874, 13.509124050334663 ], [ -86.028283454218013, 13.496282457269558 ], [ -86.018516608154926, 13.500726629830069 ], [ -85.966245897430213, 13.505093288924115 ], [ -85.948985969326998, 13.503930568940575 ], [ -85.93784969770536, 13.497626044406388 ], [ -85.929400601256702, 13.490107123045277 ], [ -85.92009884318702, 13.485172024069641 ], [ -85.906740485285127, 13.486851507990707 ], [ -85.89968665191742, 13.491864122231448 ], [ -85.882840134964226, 13.515196030872119 ], [ -85.860464239832766, 13.531344915835177 ], [ -85.842222459798677, 13.540233262754839 ], [ -85.83129289375205, 13.553384915081779 ], [ -85.832972377673059, 13.612864487905767 ], [ -85.829871792249378, 13.637746690157599 ], [ -85.820750902232362, 13.660794378857474 ], [ -85.791812100148263, 13.709215196224307 ], [ -85.787497117897658, 13.721384995720939 ], [ -85.784551561205546, 13.734588323991943 ], [ -85.783078782859548, 13.781898098218619 ], [ -85.777032639844435, 13.798202012812624 ], [ -85.767136604370762, 13.809648341897457 ], [ -85.743114602999924, 13.823958222000059 ], [ -85.742461913999932, 13.823705139000069 ], [ -85.740293111999904, 13.825639142000043 ], [ -85.733392699999882, 13.831792501000066 ], [ -85.725124471999919, 13.847941386000059 ], [ -85.723005737999955, 13.863418478000071 ], [ -85.728690144999888, 13.87501983700011 ], [ -85.74367630999987, 13.879567363000149 ], [ -85.747448689999885, 13.88827484200003 ], [ -85.743288737999961, 13.907550151000052 ], [ -85.733392699999882, 13.937625834000116 ], [ -85.732204142999933, 13.959536641000085 ], [ -85.727346557999937, 13.965014344000068 ], [ -85.716985433999923, 13.962688904000046 ], [ -85.699234578999892, 13.961500346000022 ], [ -85.686496337999927, 13.967339783000099 ], [ -85.666187500999911, 13.984470520000059 ], [ -85.657660888999885, 13.981990052000086 ], [ -85.651485555999926, 13.981990052000086 ], [ -85.651950643999839, 13.986692607000066 ], [ -85.650400350999917, 13.987855327000076 ], [ -85.647661499999884, 13.98780365000006 ], [ -85.644612589999952, 13.988785503000116 ], [ -85.647868204999924, 13.999301657000089 ], [ -85.612805745999907, 14.009740295000114 ], [ -85.603064737999944, 14.019532980000079 ], [ -85.593607950999882, 14.033459778000065 ], [ -85.571697143999927, 14.04051361100008 ], [ -85.563145912999914, 14.042012281000098 ], [ -85.546634074999929, 14.044906108000077 ], [ -85.527953043999872, 14.050900574000096 ], [ -85.518625447999909, 14.064594828000025 ], [ -85.51640336199992, 14.080537008000064 ], [ -85.510641438999954, 14.093792013000055 ], [ -85.474674641999883, 14.103403829000072 ], [ -85.457621419999839, 14.113041483000089 ], [ -85.431731526999897, 14.132833557000069 ], [ -85.420156005999871, 14.146863708000083 ], [ -85.409123087999973, 14.166164856000123 ], [ -85.400880696999934, 14.18518178300009 ], [ -85.393620157999948, 14.210761617000045 ], [ -85.384008341999845, 14.226445414000096 ], [ -85.37251033599992, 14.241095683000083 ], [ -85.362872680999914, 14.250113221000035 ], [ -85.358531860999932, 14.250888367000044 ], [ -85.347809000999916, 14.249234721000093 ], [ -85.343623209999862, 14.250113221000035 ], [ -85.3408068439999, 14.253368836000021 ], [ -85.337964639999939, 14.260681050000102 ], [ -85.330884968999897, 14.26900095700006 ], [ -85.326828369999902, 14.275744731000088 ], [ -85.321350666999905, 14.28132578600011 ], [ -85.311971394999972, 14.283651225000142 ], [ -85.288200236999899, 14.295149231000067 ], [ -85.277813273999897, 14.297319641000058 ], [ -85.239960286999917, 14.297319641000058 ], [ -85.215207274999869, 14.301582947000028 ], [ -85.190195882999973, 14.309644470000109 ], [ -85.169628662999884, 14.321762594000091 ], [ -85.158027302999926, 14.338273214000083 ], [ -85.15903499399991, 14.361062520000075 ], [ -85.171876587999918, 14.381009623000097 ], [ -85.189730794999946, 14.396848450000093 ], [ -85.205828002999937, 14.407157899000097 ], [ -85.178491170999905, 14.427647603000068 ], [ -85.177354288999908, 14.433977966000086 ], [ -85.179679728999929, 14.449248352000041 ], [ -85.178491170999905, 14.455604553000072 ], [ -85.155391805999926, 14.479479065000049 ], [ -85.15182613199994, 14.485964457000108 ], [ -85.149810750999904, 14.536504008000051 ], [ -85.145469929999933, 14.564254252000083 ], [ -85.13753759899987, 14.578491109000055 ], [ -85.119321655999926, 14.573969422000033 ], [ -85.103353637999902, 14.556864522000083 ], [ -85.086377929999884, 14.544539693000033 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-NS", "NAME_1": "Nueva Segovia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -86.020196899999888, 14.055163879000062 ], [ -86.020455281999972, 14.044079284000048 ], [ -86.0312556559999, 14.022581889000023 ], [ -86.028413452999928, 13.996071879000098 ], [ -85.957771768999947, 13.94610076900004 ], [ -85.936119344999952, 13.918195496000052 ], [ -85.929401407999933, 13.912097677000091 ], [ -85.91550044799996, 13.907446798000123 ], [ -85.906302042999954, 13.909358826000044 ], [ -85.897206990999877, 13.913027853000045 ], [ -85.883564412999874, 13.913854675000067 ], [ -85.861601928999903, 13.904423727000108 ], [ -85.849871378999921, 13.887086283000087 ], [ -85.840104532999959, 13.866570740000029 ], [ -85.824162353999839, 13.847683004000089 ], [ -85.802019001999923, 13.840215760000063 ], [ -85.778661254999889, 13.84093923000006 ], [ -85.758300740999942, 13.83928558400001 ], [ -85.744994059999925, 13.824686991000135 ], [ -85.743114602999924, 13.823958222000059 ], [ -85.767136604370762, 13.809648341897457 ], [ -85.777032639844435, 13.798202012812624 ], [ -85.783078782859548, 13.781898098218619 ], [ -85.784551561205546, 13.734588323991943 ], [ -85.787497117897658, 13.721384995720939 ], [ -85.791812100148263, 13.709215196224307 ], [ -85.820750902232362, 13.660794378857474 ], [ -85.829871792249378, 13.637746690157599 ], [ -85.832972377673059, 13.612864487905767 ], [ -85.83129289375205, 13.553384915081779 ], [ -85.842222459798677, 13.540233262754839 ], [ -85.860464239832766, 13.531344915835177 ], [ -85.882840134964226, 13.515196030872119 ], [ -85.89968665191742, 13.491864122231448 ], [ -85.906740485285127, 13.486851507990707 ], [ -85.92009884318702, 13.485172024069641 ], [ -85.929400601256702, 13.490107123045277 ], [ -85.93784969770536, 13.497626044406388 ], [ -85.948985969326998, 13.503930568940575 ], [ -85.966245897430213, 13.505093288924115 ], [ -86.018516608154926, 13.500726629830069 ], [ -86.028283454218013, 13.496282457269558 ], [ -86.03885128505874, 13.509124050334663 ], [ -86.050039231725123, 13.5047832305616 ], [ -86.059676886579041, 13.493285223734063 ], [ -86.089881761434128, 13.528786932770743 ], [ -86.111999274147195, 13.56723419849942 ], [ -86.121740281788561, 13.57901642526781 ], [ -86.129853482352303, 13.586974596200662 ], [ -86.164425015402117, 13.614518134304433 ], [ -86.183881192263186, 13.608187771348582 ], [ -86.205869513767027, 13.59966116053414 ], [ -86.208711716772314, 13.595165310230868 ], [ -86.211889818360419, 13.588654080121671 ], [ -86.21785844611037, 13.560361233184324 ], [ -86.226901821761658, 13.549302475928528 ], [ -86.25739091655754, 13.562505805098795 ], [ -86.276795416575226, 13.574210517501342 ], [ -86.292324184813253, 13.578680528483574 ], [ -86.304028897215801, 13.58017914525135 ], [ -86.345550909946496, 13.575063178223104 ], [ -86.37764197519698, 13.574675605494804 ], [ -86.433452520917115, 13.592219753538757 ], [ -86.505282762189722, 13.593382473522297 ], [ -86.515204636984379, 13.592219753538757 ], [ -86.53778723769085, 13.5865095082072 ], [ -86.547838303694732, 13.577001044562564 ], [ -86.563522101563706, 13.569482123201396 ], [ -86.576001960322174, 13.580101629986245 ], [ -86.587448290306327, 13.586742052203931 ], [ -86.604320644781922, 13.592917385528892 ], [ -86.615301886772613, 13.600565497199909 ], [ -86.624138556848891, 13.609970608057097 ], [ -86.628531052566018, 13.618471381349138 ], [ -86.648323127110586, 13.647229316279891 ], [ -86.718344693252959, 13.659864202870665 ], [ -86.740462205966026, 13.66014842371078 ], [ -86.745035569735762, 13.656841131812769 ], [ -86.748136156058763, 13.653611355179862 ], [ -86.755758430207379, 13.64340526044441 ], [ -86.764129565327153, 13.637335555191726 ], [ -86.768213256999843, 13.640357158000057 ], [ -86.772140665999899, 13.645524801000064 ], [ -86.77405269399992, 13.654594015000029 ], [ -86.771167593109908, 13.70789040401894 ], [ -86.770228637999878, 13.72523569800012 ], [ -86.76790319899996, 13.739162496000105 ], [ -86.766197876999883, 13.745260315000067 ], [ -86.7614436449999, 13.749342753000064 ], [ -86.749919799999873, 13.757120056000076 ], [ -86.727233846999894, 13.768256327000103 ], [ -86.706304891999906, 13.770013326000083 ], [ -86.66268998299995, 13.764690654000049 ], [ -86.581144571999914, 13.77985768700006 ], [ -86.541663777999901, 13.78213145000008 ], [ -86.508539184999876, 13.764380595000148 ], [ -86.490814168999862, 13.759497172000124 ], [ -86.476293091999935, 13.764018860000064 ], [ -86.462857218999972, 13.770943502000137 ], [ -86.448232788999888, 13.772958883000086 ], [ -86.432471476999922, 13.757120056000076 ], [ -86.426528686999916, 13.752985942000066 ], [ -86.417071899999939, 13.750014547000148 ], [ -86.410095580999922, 13.749032695000082 ], [ -86.358470825999916, 13.752262472000069 ], [ -86.34012569199993, 13.756654968000063 ], [ -86.325191202999861, 13.76376047800008 ], [ -86.313564005999922, 13.776602072000074 ], [ -86.307776244999843, 13.791691589000081 ], [ -86.299921427999891, 13.82132802300012 ], [ -86.284108439999898, 13.845719299000052 ], [ -86.218582722999912, 13.91437144000011 ], [ -86.184062866999909, 13.966874695000072 ], [ -86.173572550999978, 13.973670146000117 ], [ -86.161790324999885, 13.978114319000028 ], [ -86.14969803999989, 13.984263815000091 ], [ -86.138019165999907, 13.996175232000041 ], [ -86.130836141999879, 14.008913473000092 ], [ -86.12690873199989, 14.018551127000109 ], [ -86.121689412999871, 14.027206930000062 ], [ -86.110475626999914, 14.037128805000066 ], [ -86.096729695999898, 14.044079284000048 ], [ -86.020196899999888, 14.055163879000062 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-CI", "NAME_1": "Chinandega" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -86.74929968299989, 13.26128468800006 ], [ -86.739842895999942, 13.26371348100011 ], [ -86.732715272291955, 13.268469503364884 ], [ -86.731573859046364, 13.266787421302411 ], [ -86.712634447022083, 13.26293752704521 ], [ -86.706846687324742, 13.25854503042882 ], [ -86.70390112973331, 13.250147609924227 ], [ -86.702712572227426, 13.242654526984836 ], [ -86.703203497743232, 13.236608384869044 ], [ -86.704753791354392, 13.231234036321723 ], [ -86.705890672916212, 13.228805243567137 ], [ -86.714934047668123, 13.200357366998901 ], [ -86.725476040087187, 13.191158961716724 ], [ -86.726406216073997, 13.189970405110103 ], [ -86.728938360716768, 13.18084951419371 ], [ -86.732219815092378, 13.149662787407692 ], [ -86.720695969843121, 13.090234890527768 ], [ -86.710954963101074, 13.056335151046369 ], [ -86.689819302318938, 13.008611964770353 ], [ -86.676254238842034, 12.987037055315852 ], [ -86.663903571292792, 12.959157620427845 ], [ -86.65460181322311, 12.838234768219991 ], [ -86.657573208336885, 12.806970527068131 ], [ -86.670001390251969, 12.778755195395945 ], [ -86.687855597557757, 12.767928982136823 ], [ -86.695710414803784, 12.764905911078927 ], [ -86.709921434326702, 12.761340236762521 ], [ -86.782010057118441, 12.752115993957943 ], [ -86.793042975952574, 12.746199042152057 ], [ -86.800200161208465, 12.73935191525868 ], [ -86.814075283947204, 12.712996933761474 ], [ -86.833324755233264, 12.690362657110938 ], [ -86.852806769616734, 12.681629339822166 ], [ -86.877301398240945, 12.655636095329498 ], [ -86.902752041273686, 12.628738512372422 ], [ -86.922156542190635, 12.610600084226519 ], [ -86.92610978923534, 12.604088853218002 ], [ -86.933783739328078, 12.584374293938481 ], [ -86.953937548179283, 12.552412420796543 ], [ -87.005794846854656, 12.499650784556025 ], [ -87.015303311398668, 12.493914699903485 ], [ -87.032227341818327, 12.484173692262061 ], [ -87.049383918033357, 12.47665477090095 ], [ -87.098657396121894, 12.471332099197014 ], [ -87.120749071312559, 12.458438829288525 ], [ -87.120843412540935, 12.45838376929831 ], [ -87.122670050999943, 12.460353908000059 ], [ -87.135487433999913, 12.470485744000086 ], [ -87.149322068999936, 12.474514065000051 ], [ -87.157866990999935, 12.481024481000077 ], [ -87.180409308999913, 12.52297597900008 ], [ -87.186634894999941, 12.52297597900008 ], [ -87.17642167899993, 12.485907294000071 ], [ -87.192738410999937, 12.499904690000051 ], [ -87.218861456999946, 12.532253322000088 ], [ -87.238067186999899, 12.55023834800005 ], [ -87.250477667999917, 12.55532461100006 ], [ -87.312977667999917, 12.602809963000084 ], [ -87.321278449999909, 12.611232815000051 ], [ -87.325795050999943, 12.621608791000085 ], [ -87.331206834999932, 12.63898346600007 ], [ -87.334014451999906, 12.633571682000081 ], [ -87.341786261999914, 12.624090887000079 ], [ -87.344838019999941, 12.619167385000083 ], [ -87.454864061999899, 12.743801174000055 ], [ -87.467762824999909, 12.769964911000045 ], [ -87.463490363999938, 12.76516347900008 ], [ -87.459339972999942, 12.762396552000041 ], [ -87.447295701999906, 12.756293036000045 ], [ -87.447295701999906, 12.762518622000073 ], [ -87.452056443999936, 12.764186916000085 ], [ -87.460926886999914, 12.769964911000045 ], [ -87.460926886999914, 12.776190497000073 ], [ -87.463490363999938, 12.786322333000044 ], [ -87.480254686999899, 12.799994208000044 ], [ -87.502919074999909, 12.81195709800005 ], [ -87.522979295999903, 12.817165432000081 ], [ -87.522979295999903, 12.810939846000053 ], [ -87.496449347999942, 12.793850002000056 ], [ -87.482533331999946, 12.781195380000042 ], [ -87.482045050999943, 12.769964911000045 ], [ -87.492217576999906, 12.771389065000051 ], [ -87.506988084999932, 12.782416083000044 ], [ -87.529204881999931, 12.803493557000081 ], [ -87.646514451999906, 12.872381903000075 ], [ -87.6709285149999, 12.893500067000048 ], [ -87.685658331999946, 12.91828034100007 ], [ -87.685821092999902, 12.94757721600007 ], [ -87.6670222649999, 12.982245184000078 ], [ -87.638824022999927, 13.00649648600006 ], [ -87.609974738999938, 13.02407461100006 ], [ -87.588775193999936, 13.04633209800005 ], [ -87.583851691999939, 13.084662177000041 ], [ -87.577626105999911, 13.084662177000041 ], [ -87.580433722999942, 13.063177802000041 ], [ -87.583851691999939, 13.057318427000041 ], [ -87.572621222999942, 13.057318427000041 ], [ -87.559071417999917, 13.055568752000056 ], [ -87.547637498999904, 13.052150783000059 ], [ -87.542836066999939, 13.047430731000077 ], [ -87.5381160149999, 13.044501044000071 ], [ -87.5127253899999, 13.023220119000086 ], [ -87.506377732999908, 13.019680080000057 ], [ -87.488270636999914, 12.995917059000078 ], [ -87.483876105999911, 12.992621161000045 ], [ -87.471058722999942, 12.985052802000041 ], [ -87.467762824999909, 12.982245184000078 ], [ -87.466908331999946, 12.975734768000052 ], [ -87.46898352799991, 12.960638739000046 ], [ -87.467762824999909, 12.954291083000044 ], [ -87.435047980999911, 12.922390041000085 ], [ -87.392486131999931, 12.913397528000075 ], [ -87.289580857999908, 12.919582424000055 ], [ -87.289580857999908, 12.927028713000084 ], [ -87.341664191999939, 12.925726630000042 ], [ -87.367787238999938, 12.928534247000073 ], [ -87.379017706999946, 12.937567450000074 ], [ -87.368926561999899, 12.953558661000045 ], [ -87.320586717999902, 12.97719961100006 ], [ -87.314035610999952, 12.98155345300006 ], [ -87.084653890999931, 12.995926209000061 ], [ -87.069848592999904, 12.994375915000134 ], [ -87.04685257999995, 12.980552470000077 ], [ -87.035044515999942, 12.979777324000068 ], [ -87.029618489999876, 12.996081238000102 ], [ -87.008767049999904, 13.00608062800012 ], [ -86.983187214999958, 13.021867777000111 ], [ -86.97181840099995, 13.033882548000079 ], [ -86.9484089769999, 13.06969431600001 ], [ -86.942724568999949, 13.074060975000094 ], [ -86.927996785999937, 13.081243998000048 ], [ -86.922932494999969, 13.08638580400013 ], [ -86.920245320999953, 13.096178487000103 ], [ -86.924172729999924, 13.099795838000077 ], [ -86.929805460999944, 13.102224630000137 ], [ -86.932337605999919, 13.108529155000056 ], [ -86.923707641999897, 13.161135763000047 ], [ -86.925516317999978, 13.163642070000037 ], [ -86.933061076999934, 13.1797134400001 ], [ -86.934921427999939, 13.185527038000075 ], [ -86.933216104999872, 13.18818837500001 ], [ -86.925981404999902, 13.216352031000056 ], [ -86.918850057999862, 13.229762065000088 ], [ -86.910788533999977, 13.239580587000063 ], [ -86.862729451999911, 13.279939880000128 ], [ -86.84950028499992, 13.288828227000053 ], [ -86.833428914999871, 13.293349915000078 ], [ -86.816220662999882, 13.291928813000084 ], [ -86.758653117999927, 13.264178569000052 ], [ -86.74929968299989, 13.26128468800006 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-MD", "NAME_1": "Madriz" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -86.732715272291955, 13.268469503364884 ], [ -86.725476847999914, 13.273299459000029 ], [ -86.711782592999896, 13.285675965000081 ], [ -86.704031128999901, 13.298827616000068 ], [ -86.701860717999921, 13.314201355000137 ], [ -86.707803507999927, 13.342830099000111 ], [ -86.709922241999891, 13.348902079000069 ], [ -86.71715694199986, 13.361640320000035 ], [ -86.723616496999909, 13.367324727000067 ], [ -86.730437784999879, 13.368900858000103 ], [ -86.736380574999885, 13.371949768000121 ], [ -86.740204630999926, 13.381923320000041 ], [ -86.738654337999918, 13.396211853000111 ], [ -86.725941935999856, 13.423832906000115 ], [ -86.724288289999919, 13.439413351000056 ], [ -86.756586059999876, 13.559380188000148 ], [ -86.757102823999929, 13.576407573000083 ], [ -86.750901651999925, 13.608421122000081 ], [ -86.751573445999924, 13.624414978000033 ], [ -86.755397501999965, 13.630874532000078 ], [ -86.764129565327153, 13.637335555191726 ], [ -86.755758430207379, 13.64340526044441 ], [ -86.748136156058763, 13.653611355179862 ], [ -86.745035569735762, 13.656841131812769 ], [ -86.740462205966026, 13.66014842371078 ], [ -86.718344693252959, 13.659864202870665 ], [ -86.648323127110586, 13.647229316279891 ], [ -86.628531052566018, 13.618471381349138 ], [ -86.624138556848891, 13.609970608057097 ], [ -86.615301886772613, 13.600565497199909 ], [ -86.604320644781922, 13.592917385528892 ], [ -86.587448290306327, 13.586742052203931 ], [ -86.576001960322174, 13.580101629986245 ], [ -86.563522101563706, 13.569482123201396 ], [ -86.547838303694732, 13.577001044562564 ], [ -86.53778723769085, 13.5865095082072 ], [ -86.515204636984379, 13.592219753538757 ], [ -86.505282762189722, 13.593382473522297 ], [ -86.433452520917115, 13.592219753538757 ], [ -86.37764197519698, 13.574675605494804 ], [ -86.345550909946496, 13.575063178223104 ], [ -86.304028897215801, 13.58017914525135 ], [ -86.292324184813253, 13.578680528483574 ], [ -86.276795416575226, 13.574210517501342 ], [ -86.25739091655754, 13.562505805098795 ], [ -86.226901821761658, 13.549302475928528 ], [ -86.21785844611037, 13.560361233184324 ], [ -86.211889818360419, 13.588654080121671 ], [ -86.208711716772314, 13.595165310230868 ], [ -86.205869513767027, 13.59966116053414 ], [ -86.183881192263186, 13.608187771348582 ], [ -86.164425015402117, 13.614518134304433 ], [ -86.129853482352303, 13.586974596200662 ], [ -86.121740281788561, 13.57901642526781 ], [ -86.111999274147195, 13.56723419849942 ], [ -86.089881761434128, 13.528786932770743 ], [ -86.059676886579041, 13.493285223734063 ], [ -86.069237027067118, 13.481968084959135 ], [ -86.108097703945873, 13.451711534159983 ], [ -86.11765784443395, 13.44098867368831 ], [ -86.130008511083929, 13.446104640716555 ], [ -86.144038661654918, 13.445536199935646 ], [ -86.159980841942286, 13.442693996930416 ], [ -86.176207242170449, 13.428767198247613 ], [ -86.212949184657134, 13.390345770940542 ], [ -86.221010708377491, 13.403755804786556 ], [ -86.230906744750428, 13.425718288767996 ], [ -86.234937507060295, 13.432203681354792 ], [ -86.25374772787535, 13.438120632261359 ], [ -86.309377408240778, 13.435459296409363 ], [ -86.386116910067301, 13.411326402091788 ], [ -86.428388230732253, 13.40437592241085 ], [ -86.471227993976697, 13.42424551042194 ], [ -86.485800746906932, 13.431221829423862 ], [ -86.496291063381875, 13.434451606056768 ], [ -86.522826911133052, 13.430446682168622 ], [ -86.562772792730186, 13.396805325105674 ], [ -86.60388139521018, 13.326396186235002 ], [ -86.612278814815454, 13.308826198869951 ], [ -86.630959846219923, 13.28296214378787 ], [ -86.714934047668123, 13.200357366998901 ], [ -86.705890672916212, 13.228805243567137 ], [ -86.704753791354392, 13.231234036321723 ], [ -86.703203497743232, 13.236608384869044 ], [ -86.702712572227426, 13.242654526984836 ], [ -86.70390112973331, 13.250147609924227 ], [ -86.706846687324742, 13.25854503042882 ], [ -86.712634447022083, 13.26293752704521 ], [ -86.731573859046364, 13.266787421302411 ], [ -86.732715272291955, 13.268469503364884 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-RI", "NAME_1": "Rivas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -85.236478239279279, 11.05309661721509 ], [ -85.272361409999917, 11.066199036000043 ], [ -85.407417765999895, 11.115446676000118 ], [ -85.508626058999909, 11.152421163000071 ], [ -85.540949666999978, 11.17032704600004 ], [ -85.569164998999952, 11.195390117000045 ], [ -85.597793741999936, 11.209937032000099 ], [ -85.631150879999893, 11.196216939000067 ], [ -85.659314534999851, 11.158829041000018 ], [ -85.677582153999907, 11.119632467000059 ], [ -85.701735565999883, 11.080880181000097 ], [ -85.702422654999907, 11.081203518000052 ], [ -85.752308722999942, 11.101711330000057 ], [ -85.77171790299991, 11.104681708000044 ], [ -85.78579667899993, 11.112250067000048 ], [ -85.793690558999913, 11.130031643000052 ], [ -85.803089972999942, 11.166083075000074 ], [ -85.8213191399999, 11.19281647300005 ], [ -85.928008592999902, 11.310736395000049 ], [ -85.936797654999907, 11.316961981000077 ], [ -85.941517706999946, 11.319118557000081 ], [ -85.956817186999899, 11.329779364000046 ], [ -85.960113084999932, 11.334011135000083 ], [ -85.994862433999913, 11.343654690000051 ], [ -86.010365363999938, 11.357977606000077 ], [ -86.043934699999909, 11.398098049000055 ], [ -86.070586717999902, 11.411688544000071 ], [ -86.104725714999915, 11.447292385000083 ], [ -86.148304816999939, 11.471747137000079 ], [ -86.16274980399993, 11.484523830000057 ], [ -86.16665605399993, 11.492621161000045 ], [ -86.175200963732777, 11.519466114006992 ], [ -86.17512203565343, 11.519607245477971 ], [ -86.146260748834493, 11.57182628025862 ], [ -86.139723680303575, 11.584047755699373 ], [ -86.136623093980575, 11.587923489277614 ], [ -86.101689825724861, 11.610816148346544 ], [ -86.07812537308746, 11.604718329387367 ], [ -86.070580614203948, 11.605777696583402 ], [ -86.067066616730983, 11.609317532478144 ], [ -86.039316372152825, 11.623166815895843 ], [ -86.03556983068313, 11.625750637381998 ], [ -86.024691942379206, 11.643320623847671 ], [ -86.009085659775337, 11.676212672976476 ], [ -86.006165940605683, 11.679132392146187 ], [ -86.003375414443781, 11.680837714488916 ], [ -86.000920783267532, 11.681044420063927 ], [ -85.999189623402401, 11.680966904798822 ], [ -85.99415117073994, 11.679752508871161 ], [ -85.989810350067557, 11.67706533549682 ], [ -85.985934618288013, 11.67303457318701 ], [ -85.976064419437364, 11.663061021548913 ], [ -85.971336026036738, 11.661484890415352 ], [ -85.926997646923837, 11.672724513925175 ], [ -85.894363980213484, 11.682052110416521 ], [ -85.522913784943228, 11.680527655227081 ], [ -85.101518317116643, 11.631460882713554 ], [ -85.340974827726086, 11.147116241421372 ], [ -85.300241897245769, 11.110456604888384 ], [ -85.210629451987586, 11.077870261403405 ], [ -85.161749936310514, 11.057503796163246 ], [ -85.027331267523948, 11.008624280486117 ], [ -84.941792114414511, 10.980111229149884 ], [ -84.884969034999955, 10.947679138000041 ], [ -84.908404296999919, 10.939359233000076 ], [ -84.931400309999873, 10.941891378000065 ], [ -85.092837483999915, 11.000647482000119 ], [ -85.236478239279279, 11.05309661721509 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-AS", "NAME_1": "Atlántico Sur" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -83.529571092999902, 13.032619533000059 ], [ -83.507679816999939, 12.902777411000045 ], [ -83.54133053299995, 12.63898346600007 ], [ -83.54133053299995, 12.580633856000077 ], [ -83.537993943999936, 12.57103099200009 ], [ -83.523508266999897, 12.542303778000075 ], [ -83.513824022999927, 12.51048411700009 ], [ -83.485910610999952, 12.472154039000088 ], [ -83.479237433999913, 12.447211005000042 ], [ -83.481800910999937, 12.41665273600006 ], [ -83.492298956999946, 12.400336005000042 ], [ -83.512562628999945, 12.393784898000092 ], [ -83.544748501999948, 12.392564195000091 ], [ -83.569243943999936, 12.387640692000048 ], [ -83.594227667999917, 12.378810940000051 ], [ -83.617583787999934, 12.375148830000057 ], [ -83.637521938999896, 12.385728257000039 ], [ -83.629994269999941, 12.39288971600007 ], [ -83.609364386999914, 12.407212632000039 ], [ -83.603382941999939, 12.413723049000055 ], [ -83.602528449999909, 12.425441799000055 ], [ -83.606312628999945, 12.441148179000038 ], [ -83.612700975999928, 12.454901434000078 ], [ -83.634632941999939, 12.474107164000088 ], [ -83.632883266999897, 12.539536851000037 ], [ -83.637521938999896, 12.564520575000074 ], [ -83.633859829999949, 12.566473700000074 ], [ -83.632679816999939, 12.566595770000049 ], [ -83.632069464999915, 12.56712474200009 ], [ -83.630034959999932, 12.570746161000045 ], [ -83.623850063999896, 12.570746161000045 ], [ -83.588449673999946, 12.559637762000079 ], [ -83.563791469999899, 12.590887762000079 ], [ -83.555409308999913, 12.635891018000052 ], [ -83.56859290299991, 12.66632721600007 ], [ -83.56859290299991, 12.673773505000042 ], [ -83.559966600999928, 12.683254299000055 ], [ -83.556548631999931, 12.69672272300005 ], [ -83.55492102799991, 12.75259023600006 ], [ -83.553130662999934, 12.754706122000073 ], [ -83.54906165299991, 12.758042710000041 ], [ -83.544422980999911, 12.763088283000059 ], [ -83.54133053299995, 12.769964911000045 ], [ -83.544667120999918, 12.796779690000051 ], [ -83.564035610999952, 12.812689520000049 ], [ -83.590809699999909, 12.81907786700009 ], [ -83.616363084999932, 12.81712474200009 ], [ -83.63703365799995, 12.80532461100006 ], [ -83.645904100999928, 12.786851304000038 ], [ -83.645334438999896, 12.766506252000056 ], [ -83.637521938999896, 12.748846747000073 ], [ -83.61554928299995, 12.737290757000039 ], [ -83.613270636999914, 12.735256252000056 ], [ -83.613392706999946, 12.73187897300005 ], [ -83.611683722999942, 12.714911200000074 ], [ -83.610218878999945, 12.707912502000056 ], [ -83.605946417999917, 12.701076565000051 ], [ -83.601307745999918, 12.698228257000039 ], [ -83.597482876999948, 12.694322007000039 ], [ -83.59593665299991, 12.684027411000045 ], [ -83.596424933999913, 12.667141018000052 ], [ -83.598622199999909, 12.660223700000074 ], [ -83.603382941999939, 12.65265534100007 ], [ -83.599436001999948, 12.647935289000088 ], [ -83.589100714999915, 12.632147528000075 ], [ -83.620472785999937, 12.614243882000039 ], [ -83.673695441999939, 12.570461330000057 ], [ -83.705799933999913, 12.557074286000045 ], [ -83.749012824999909, 12.552557684000078 ], [ -83.767201300999943, 12.546698309000078 ], [ -83.774647589999915, 12.53351471600007 ], [ -83.774647589999915, 12.481431382000039 ], [ -83.773426886999914, 12.480292059000078 ], [ -83.769439256999931, 12.482489325000074 ], [ -83.761057094999899, 12.482001044000071 ], [ -83.749012824999909, 12.479478257000039 ], [ -83.740956183999913, 12.479722398000092 ], [ -83.734242316999939, 12.477687893000052 ], [ -83.726226365999935, 12.468329169000071 ], [ -83.71939042899993, 12.423651434000078 ], [ -83.723378058999913, 12.402289130000042 ], [ -83.730376756999931, 12.382066148000092 ], [ -83.733713344999899, 12.362982489000046 ], [ -83.726226365999935, 12.344794012000079 ], [ -83.70767167899993, 12.335882880000042 ], [ -83.676340298999946, 12.342474677000041 ], [ -83.671009894999941, 12.327093817000048 ], [ -83.67218990799995, 12.317084052000041 ], [ -83.677316860999952, 12.29751211100006 ], [ -83.678456183999913, 12.286118882000039 ], [ -83.676380988999938, 12.279852606000077 ], [ -83.671742316999939, 12.288967190000051 ], [ -83.655873175999943, 12.340277411000045 ], [ -83.649769660999937, 12.353176174000055 ], [ -83.64093990799995, 12.358465887000079 ], [ -83.621205206999946, 12.355658270000049 ], [ -83.617014126999948, 12.348049221000053 ], [ -83.663726365999935, 12.256089585000041 ], [ -83.685902472999942, 12.13743724200009 ], [ -83.678578253999945, 12.009426174000055 ], [ -83.671009894999941, 11.987941799000055 ], [ -83.677845831999946, 11.983872789000088 ], [ -83.685292120999918, 11.98110586100006 ], [ -83.681223110999952, 12.001654364000046 ], [ -83.688303188999896, 12.018744208000044 ], [ -83.713246222999942, 12.049302476000037 ], [ -83.723744269999941, 12.074652411000045 ], [ -83.715240037999934, 12.08539459800005 ], [ -83.700672980999911, 12.095200914000088 ], [ -83.692738410999937, 12.118231512000079 ], [ -83.697865363999938, 12.135199286000045 ], [ -83.711008266999897, 12.154730536000045 ], [ -83.728627081999946, 12.171576239000046 ], [ -83.747385219999899, 12.18032461100006 ], [ -83.777740037999934, 12.177150783000059 ], [ -83.776275193999936, 12.162298895000049 ], [ -83.760324673999946, 12.15306224200009 ], [ -83.747385219999899, 12.16665273600006 ], [ -83.739898240999935, 12.16665273600006 ], [ -83.723052537999934, 12.149359442000048 ], [ -83.716135219999899, 12.138902085000041 ], [ -83.713246222999942, 12.125677802000041 ], [ -83.716908331999946, 12.108791408000059 ], [ -83.732045050999943, 12.087062893000052 ], [ -83.733713344999899, 12.07103099200009 ], [ -83.739369269999941, 12.051947333000044 ], [ -83.757313605999911, 12.051336981000077 ], [ -83.798573370999918, 12.063625393000052 ], [ -83.803944464999915, 12.060288804000038 ], [ -83.791737433999913, 12.052964585000041 ], [ -83.767201300999943, 12.043158270000049 ], [ -83.761301235999952, 12.035345770000049 ], [ -83.757232225999928, 12.024644273000092 ], [ -83.754953579999949, 12.012274481000077 ], [ -83.75422115799995, 11.999090887000079 ], [ -83.756255662999934, 11.990057684000078 ], [ -83.765207485999952, 11.971625067000048 ], [ -83.767201300999943, 11.96430084800005 ], [ -83.765533006999931, 11.958807684000078 ], [ -83.762115037999934, 11.953070380000042 ], [ -83.759836391999897, 11.946844794000071 ], [ -83.761057094999899, 11.940130927000041 ], [ -83.76626542899993, 11.933986721000053 ], [ -83.771880662999934, 11.931057033000059 ], [ -83.777088995999918, 11.929266669000071 ], [ -83.780873175999943, 11.926459052000041 ], [ -83.799387173999946, 11.902899481000077 ], [ -83.805083787999934, 11.899115302000041 ], [ -83.813710089999915, 11.896185614000046 ], [ -83.823475714999915, 11.88898346600007 ], [ -83.831857876999948, 11.879868882000039 ], [ -83.836089647999927, 11.871242580000057 ], [ -83.822987433999913, 11.862534898000092 ], [ -83.80695553299995, 11.848211981000077 ], [ -83.793365037999934, 11.83274974200009 ], [ -83.784779425999943, 11.813544012000079 ], [ -83.777495897999927, 11.808294989000046 ], [ -83.767730272999927, 11.804836330000057 ], [ -83.757639126999948, 11.803615627000056 ], [ -83.742909308999913, 11.805243231000077 ], [ -83.741810675999943, 11.809759833000044 ], [ -83.745961066999939, 11.816310940000051 ], [ -83.747385219999899, 11.824042059000078 ], [ -83.740589972999942, 11.843451239000046 ], [ -83.735096808999913, 11.853664455000057 ], [ -83.726226365999935, 11.857570705000057 ], [ -83.709543423999946, 11.85814036700009 ], [ -83.699940558999913, 11.84992096600007 ], [ -83.653635219999899, 11.667466539000088 ], [ -83.651193813999896, 11.63226959800005 ], [ -83.651722785999937, 11.619370835000041 ], [ -83.65298417899993, 11.611517645000049 ], [ -83.656809048999946, 11.605414130000042 ], [ -83.664784308999913, 11.598089911000045 ], [ -83.666737433999913, 11.600978908000059 ], [ -83.680897589999915, 11.598130601000037 ], [ -83.694732225999928, 11.593654690000051 ], [ -83.695871548999946, 11.59125397300005 ], [ -83.70376542899993, 11.587958075000074 ], [ -83.713734503999945, 11.573472398000092 ], [ -83.722808397999927, 11.570217190000051 ], [ -83.734934048999946, 11.569973049000055 ], [ -83.744699673999946, 11.568508205000057 ], [ -83.753041144999941, 11.564601955000057 ], [ -83.761057094999899, 11.557114976000037 ], [ -83.771229620999918, 11.52610911700009 ], [ -83.780913865999935, 11.479315497000073 ], [ -83.794422980999911, 11.44399648600006 ], [ -83.815663214999915, 11.447251695000091 ], [ -83.821888800999943, 11.447251695000091 ], [ -83.853627081999946, 11.407416083000044 ], [ -83.862782355999911, 11.39203522300005 ], [ -83.868031378999945, 11.374904690000051 ], [ -83.867909308999913, 11.273667710000041 ], [ -83.837269660999937, 11.142523505000042 ], [ -83.815663214999915, 11.090399481000077 ], [ -83.785633917999917, 11.044826565000051 ], [ -83.775949673999946, 11.01984284100007 ], [ -83.752064581999946, 10.982245184000078 ], [ -83.743641730999911, 10.974310614000046 ], [ -83.725453253999945, 10.96320221600007 ], [ -83.718251105999911, 10.94399648600006 ], [ -83.735529344203883, 10.957160955913366 ], [ -83.761419236808308, 10.984704494916514 ], [ -83.775914476272021, 11.008294785975579 ], [ -83.794130418783766, 11.031704209881354 ], [ -83.797592740312723, 11.034985663357645 ], [ -83.799866503436363, 11.036535956069486 ], [ -83.807307908633049, 11.038938910402408 ], [ -83.84668535034865, 11.046535346129303 ], [ -83.858002489123578, 11.047388006851008 ], [ -83.865107998435349, 11.047155462854334 ], [ -83.867510951868894, 11.045992742870794 ], [ -83.8695780103169, 11.044674994155628 ], [ -83.871980963750445, 11.043667303803034 ], [ -83.874874843599116, 11.043744819068138 ], [ -83.878337165128073, 11.045605170142494 ], [ -83.882652147378678, 11.050798652435844 ], [ -83.88422827761292, 11.054674384215446 ], [ -83.884977587345759, 11.058550115995047 ], [ -83.885132616077328, 11.065164699791069 ], [ -83.88559770407079, 11.068110256483124 ], [ -83.886631231945785, 11.07059072518183 ], [ -83.888155687135225, 11.072528591521291 ], [ -83.89154049339902, 11.076016751471911 ], [ -83.894434374147011, 11.080047511983082 ], [ -83.895571254809568, 11.082450466315947 ], [ -83.896837327580613, 11.087876491706709 ], [ -83.896992357211502, 11.091054592395494 ], [ -83.895416226077941, 11.109606431691475 ], [ -83.895622931652952, 11.112707017115156 ], [ -83.897302415574018, 11.114567369088775 ], [ -83.900247972266072, 11.115109972347341 ], [ -83.914174770948932, 11.108598741338824 ], [ -83.919058193980447, 11.107358506989499 ], [ -83.928644171990925, 11.106118271740854 ], [ -83.936524827658673, 11.103017686317173 ], [ -83.938669399573143, 11.101622423236222 ], [ -83.940994838640847, 11.100537218517786 ], [ -83.943552822604659, 11.099607042530977 ], [ -83.945826585728355, 11.098444322547437 ], [ -83.94957312719805, 11.098289292916547 ], [ -83.954172329389451, 11.098909410540841 ], [ -83.963758308299248, 11.102475083957927 ], [ -83.969881964780825, 11.103482774310578 ], [ -83.977271694932767, 11.102242539961253 ], [ -83.980940721137358, 11.100847275980982 ], [ -83.985979173799819, 11.097979234554032 ], [ -83.987968716083344, 11.096506456207976 ], [ -83.992412888643855, 11.094181016240896 ], [ -83.994686651767552, 11.093405869884975 ], [ -84.000965338779338, 11.092010605904704 ], [ -84.009569464858885, 11.087488918079089 ], [ -84.013600227168752, 11.088031521337598 ], [ -84.018922898872688, 11.090589504402089 ], [ -84.02874142087984, 11.098599351279006 ], [ -84.039670986926467, 11.109838974788829 ], [ -84.041040411585698, 11.111931870759236 ], [ -84.041505499579102, 11.114567369088775 ], [ -84.041376309269253, 11.117461248937502 ], [ -84.040575323592293, 11.123042303959153 ], [ -84.043779262702799, 11.124825141567044 ], [ -84.050238816867875, 11.125445258292018 ], [ -84.081968146013139, 11.121414495982208 ], [ -84.094448004771607, 11.125522773557122 ], [ -84.11082943373134, 11.132034002767 ], [ -84.117211472631368, 11.133506781113056 ], [ -84.119950323748412, 11.13373932510973 ], [ -84.126332364447023, 11.133661810743945 ], [ -84.136590135126596, 11.132344062028835 ], [ -84.138863898250293, 11.132499090760405 ], [ -84.141731939677243, 11.132964178753809 ], [ -84.149250861038411, 11.135754705815032 ], [ -84.154857753582462, 11.13722748506035 ], [ -84.157777472752173, 11.138235175413001 ], [ -84.164133674129744, 11.141955878461033 ], [ -84.16793189244288, 11.143738715169548 ], [ -84.171420050594861, 11.144539699947188 ], [ -84.174417284130357, 11.144358831894579 ], [ -84.178551398328352, 11.147020167746518 ], [ -84.183589850990813, 11.1528337667649 ], [ -84.204002041361093, 11.185958359890378 ], [ -84.212683681806482, 11.197042955567952 ], [ -84.241079882430597, 11.225051580765808 ], [ -84.280534837612663, 11.25306020776236 ], [ -84.327560390999224, 11.276883042818156 ], [ -84.336836310647186, 11.283471788192458 ], [ -84.345828010354353, 11.292721869418699 ], [ -84.353346930816201, 11.307914739973285 ], [ -84.355388149943167, 11.320730496415251 ], [ -84.356111620354966, 11.333132839009295 ], [ -84.361976895317468, 11.346801256173023 ], [ -84.377453985812792, 11.361994126727552 ], [ -84.457190721174811, 11.410880032087789 ], [ -84.486129523258853, 11.428243312978509 ], [ -84.5525595766631, 11.45237620729614 ], [ -84.556280279711132, 11.491030177700509 ], [ -84.563644172340673, 11.529658311481853 ], [ -84.563308274657118, 11.542654934177847 ], [ -84.560517747595952, 11.562007758251411 ], [ -84.546384243338139, 11.610118516356408 ], [ -84.536514045386866, 11.63295950038065 ], [ -84.534782883723096, 11.644095771102968 ], [ -84.534291958207291, 11.652131456401605 ], [ -84.544265509845388, 11.683524888762577 ], [ -84.55506588378347, 11.708820502164428 ], [ -84.556357794976236, 11.734891261922201 ], [ -84.555220913414416, 11.746906032687264 ], [ -84.557598029325561, 11.753262234064835 ], [ -84.563928392281468, 11.759773464174032 ], [ -84.57219662067746, 11.766568915123344 ], [ -84.587156949033954, 11.793621527711309 ], [ -84.607414109773345, 11.862506212291862 ], [ -84.612581752745655, 11.87919769871479 ], [ -84.619713101378522, 11.892426866306835 ], [ -84.620720790831797, 11.895320746155505 ], [ -84.621573451553559, 11.899635728406111 ], [ -84.613615282419346, 11.906508693721207 ], [ -84.574625414331365, 11.922528388374417 ], [ -84.702421230955053, 11.982731432509581 ], [ -84.709320034691814, 11.99293752724509 ], [ -84.772701178616501, 12.150033881158663 ], [ -84.785982022152609, 12.209694322035318 ], [ -84.787403123655224, 12.242689723951571 ], [ -84.781098599121037, 12.265168971870537 ], [ -84.784225022966439, 12.280284328958601 ], [ -84.819649216737957, 12.341960151439821 ], [ -84.825540331021443, 12.348238837552287 ], [ -84.83277503064312, 12.354181626880575 ], [ -84.839596320014152, 12.361493841767356 ], [ -84.846934374221973, 12.37356028937586 ], [ -84.852153693138405, 12.389864203070488 ], [ -84.856339484179841, 12.422136135474261 ], [ -84.855150925774581, 12.439163520480065 ], [ -84.852360398713415, 12.451462511185923 ], [ -84.846650153381859, 12.464975897819443 ], [ -84.845332403767429, 12.470815335259488 ], [ -84.847347785371994, 12.47758494688776 ], [ -84.853678148327845, 12.488075263362703 ], [ -84.867010667808074, 12.500813502740925 ], [ -84.887862107750038, 12.531793524851253 ], [ -84.90972123894403, 12.579490871806286 ], [ -84.915612352328196, 12.589180203503588 ], [ -84.944499477568797, 12.615250963261303 ], [ -84.968529019098924, 12.649512437049339 ], [ -84.973774177336395, 12.654654242499305 ], [ -84.985298020787013, 12.660416165573565 ], [ -84.986383226404769, 12.663749294094657 ], [ -84.986848314398173, 12.668193468453808 ], [ -84.983928596127782, 12.683722235792516 ], [ -84.985220507320548, 12.702144883879271 ], [ -84.989613003037618, 12.714779771369365 ], [ -84.998217129117222, 12.730696113235012 ], [ -85.004289109654678, 12.737724107281736 ], [ -85.010206062359885, 12.742917589575086 ], [ -85.019171922746011, 12.747697658919833 ], [ -85.027078416835479, 12.760048326469075 ], [ -85.031987678288715, 12.7620378687526 ], [ -85.061391568366162, 12.783845323103151 ], [ -85.079917569240422, 12.793663845110359 ], [ -85.098572761323851, 12.793224596437938 ], [ -85.117718878923085, 12.776248888275575 ], [ -85.122886521895452, 12.764337470298017 ], [ -85.126452196211858, 12.736328844200784 ], [ -85.1307671775632, 12.721626899162061 ], [ -85.133686895833534, 12.72196279504692 ], [ -85.142006801972343, 12.71700185854894 ], [ -85.149241503392659, 12.710904038690444 ], [ -85.148776415399254, 12.707958481998332 ], [ -85.15213538324133, 12.706098130923976 ], [ -85.165519578665624, 12.693695787430613 ], [ -85.155339322351836, 12.677546902467554 ], [ -85.154279955155801, 12.662689927797942 ], [ -85.162315639555118, 12.654964300861764 ], [ -85.179187994930032, 12.660157782255851 ], [ -85.205052049112737, 12.714521388950914 ], [ -85.212803513571259, 12.748395290909912 ], [ -85.217118495821921, 12.75958323847567 ], [ -85.226807826619904, 12.77865184170912 ], [ -85.227893033136979, 12.788056952566308 ], [ -85.226187709894873, 12.797875474573459 ], [ -85.222311978115272, 12.805756130241207 ], [ -85.215568203110081, 12.812319037193788 ], [ -85.206809048298908, 12.816737372231955 ], [ -85.192132940782585, 12.817874253793775 ], [ -85.181048346903651, 12.816349799503655 ], [ -85.169085252982029, 12.81603974024182 ], [ -85.159395922184046, 12.819217840930605 ], [ -85.148027105666358, 12.829191392568703 ], [ -85.144590624357818, 12.838803209000901 ], [ -85.144797329033509, 12.85459035875806 ], [ -85.141335008403871, 12.859422104946191 ], [ -85.131258103978325, 12.860843207348125 ], [ -85.122731493163883, 12.85918956094946 ], [ -85.105006477067263, 12.853944404510628 ], [ -85.094025235076515, 12.852704169261983 ], [ -85.081958788367388, 12.853117581311324 ], [ -85.067954475318743, 12.855701401898159 ], [ -85.040643480312326, 12.863685411252732 ], [ -85.030592414308444, 12.864848131236272 ], [ -84.971293707738425, 12.854745388388949 ], [ -84.958245409098311, 12.850714626978458 ], [ -84.95436967641939, 12.855262153225794 ], [ -84.942044847291868, 12.863168647315206 ], [ -84.935869513966907, 12.868723863015873 ], [ -84.925663418332078, 12.8838650585256 ], [ -84.918506232176867, 12.900375677795296 ], [ -84.898352424224981, 12.89660329790388 ], [ -84.875666469831685, 12.911822007779449 ], [ -84.854711677102216, 12.931536567058913 ], [ -84.839983893641772, 12.941329251543721 ], [ -84.828149990929319, 12.942595323415446 ], [ -84.809365606737344, 12.947633775178588 ], [ -84.795593837685431, 12.948176378437097 ], [ -84.782752244620383, 12.944998276848992 ], [ -84.776783616870432, 12.94070913302005 ], [ -84.77151262111056, 12.94014069313846 ], [ -84.760841438381647, 12.948176378437097 ], [ -84.755337896826461, 12.950346787873968 ], [ -84.751022914575856, 12.949416611887102 ], [ -84.748180711570569, 12.950346787873968 ], [ -84.746217006809388, 12.965307115331086 ], [ -84.741953702301487, 12.975254828547463 ], [ -84.740971848571917, 12.978587957967875 ], [ -84.739809130387016, 12.993005683065803 ], [ -84.73353044337523, 13.026388657710356 ], [ -84.729292976389729, 13.03478607821495 ], [ -84.708234829074058, 13.057575385395694 ], [ -84.707614712349084, 13.05811798775494 ], [ -84.700870938243213, 13.063311469148971 ], [ -84.697124395874141, 13.065714423481836 ], [ -84.696452603205046, 13.066386217050251 ], [ -84.699165615900426, 13.066747952256151 ], [ -84.701801114230022, 13.066541245781877 ], [ -84.704617478813589, 13.065946967478567 ], [ -84.707072109989895, 13.064939277125916 ], [ -84.718234219133876, 13.058428046117399 ], [ -84.720998907773378, 13.05773041412732 ], [ -84.724021978831217, 13.057265326133859 ], [ -84.727329270729228, 13.057291165454899 ], [ -84.730429857052229, 13.057807929392425 ], [ -84.733091192904226, 13.05866059011413 ], [ -84.735390795348906, 13.059926662885175 ], [ -84.737432013576552, 13.061451117175295 ], [ -84.740739304575243, 13.065120144279206 ], [ -84.743529833435048, 13.069047552902248 ], [ -84.758050910421161, 13.09837392771459 ], [ -84.764329597432948, 13.117804267053259 ], [ -84.765492315617848, 13.120103867699299 ], [ -84.77324378097569, 13.129870713762443 ], [ -84.777222867341436, 13.133048814451229 ], [ -84.779393276778308, 13.134340724744618 ], [ -84.781873744577638, 13.135374254418309 ], [ -84.784664273437443, 13.136123562352509 ], [ -84.787067226870988, 13.13713125180584 ], [ -84.789392665938749, 13.138371487054485 ], [ -84.796679043303186, 13.145089422738636 ], [ -84.798771939273536, 13.146277981143896 ], [ -84.800864834344623, 13.147182318709042 ], [ -84.797738409599901, 13.153977768759034 ], [ -84.794508632966995, 13.159171251052385 ], [ -84.751436326625139, 13.215731106505359 ], [ -84.492924974208165, 13.246530260563077 ], [ -84.35347612202537, 13.247150377288051 ], [ -84.333684048380121, 13.249708360352543 ], [ -84.321230028043317, 13.254100856968932 ], [ -84.3089827141809, 13.267123318086647 ], [ -84.298440720862573, 13.273918769035959 ], [ -84.290973477244165, 13.276295884947103 ], [ -84.284488084657369, 13.27663178083202 ], [ -84.276891648930416, 13.27588247289782 ], [ -84.271517300383096, 13.274538885760933 ], [ -84.265212774949589, 13.271515814703093 ], [ -84.258339809634492, 13.267123318086647 ], [ -84.246635098131264, 13.263841863711036 ], [ -84.236894089590521, 13.264203598916936 ], [ -84.176613531988892, 13.280636704720109 ], [ -84.163100145355429, 13.282342027062896 ], [ -84.155193651265961, 13.280326646357651 ], [ -84.152609828880486, 13.275391547382014 ], [ -84.133334520072026, 13.216144516756003 ], [ -84.129277920239815, 13.208987332399431 ], [ -84.123619350852323, 13.202682806965981 ], [ -84.117185635108967, 13.201416734194936 ], [ -84.108607346551764, 13.197308458418604 ], [ -84.084448614711789, 13.204439806152095 ], [ -84.068764817742135, 13.201416734194936 ], [ -84.071839565643415, 13.205860906755447 ], [ -84.077265591034177, 13.215886135236929 ], [ -84.082433234006544, 13.221260483784306 ], [ -84.063493821982263, 13.217824002475709 ], [ -84.04806840743106, 13.212087917823112 ], [ -84.036105312610061, 13.214516710577698 ], [ -84.02781124489303, 13.235549018572328 ], [ -84.021015794843038, 13.230975653903272 ], [ -84.016390754229917, 13.230536404331588 ], [ -84.007321540156909, 13.235549018572328 ], [ -84.000500250785933, 13.235549018572328 ], [ -83.991456875134645, 13.230122992282247 ], [ -83.987606980877445, 13.234463812954573 ], [ -83.98869218559588, 13.244437363693351 ], [ -83.994273240617531, 13.256038723308393 ], [ -83.983808762564308, 13.254255885700559 ], [ -83.979752162732098, 13.251568712326218 ], [ -83.964559292177569, 13.250302639555173 ], [ -83.883530645622784, 13.247150377288051 ], [ -83.864307013657765, 13.244204819696677 ], [ -83.854126757343977, 13.240044867076961 ], [ -83.84629777672103, 13.235419827363103 ], [ -83.835859137988791, 13.231208197000683 ], [ -83.818625048307297, 13.226557318865162 ], [ -83.810925258893576, 13.222759101451345 ], [ -83.807204555845544, 13.218159898360625 ], [ -83.807824672570575, 13.212501328973133 ], [ -83.81002092222775, 13.206765245219856 ], [ -83.813664110010677, 13.200796617469905 ], [ -83.832551846090837, 13.178136502397649 ], [ -83.836143357929586, 13.172400417745052 ], [ -83.838339605788178, 13.166690172413496 ], [ -83.839037237778257, 13.161031602126741 ], [ -83.838158738634888, 13.155786444788589 ], [ -83.835239021263817, 13.151290595384637 ], [ -83.830924038113835, 13.147285671496547 ], [ -83.755734828999152, 13.093645535213284 ], [ -83.657291225609583, 13.037447414966209 ], [ -83.638946091888613, 13.031504624738602 ], [ -83.598173387092118, 13.033364975812958 ], [ -83.547969733016771, 13.030264391288597 ], [ -83.529650437717521, 13.032589830356358 ], [ -83.529571092999902, 13.032619533000059 ] ] ], [ [ [ -83.726226365999935, 11.878648179000038 ], [ -83.733794725999928, 11.905829169000071 ], [ -83.736073370999918, 11.941799221000053 ], [ -83.728993292999917, 11.973334052000041 ], [ -83.708404100999928, 11.987290757000039 ], [ -83.706857876999948, 11.98704661700009 ], [ -83.705677863999938, 11.986232815000051 ], [ -83.70531165299991, 11.984320380000042 ], [ -83.705799933999913, 11.98110586100006 ], [ -83.712391730999911, 11.970851955000057 ], [ -83.719309048999946, 11.95453522300005 ], [ -83.724517381999931, 11.936346747000073 ], [ -83.726226365999935, 11.92023346600007 ], [ -83.720366990999935, 11.883693752000056 ], [ -83.719838019999941, 11.870306708000044 ], [ -83.726226365999935, 11.878648179000038 ] ] ], [ [ [ -83.053944464999915, 12.143866278000075 ], [ -83.055978969999899, 12.166205145000049 ], [ -83.046457485999952, 12.183742580000057 ], [ -83.032541469999899, 12.190822658000059 ], [ -83.021148240999935, 12.181789455000057 ], [ -83.025054490999935, 12.175197658000059 ], [ -83.053944464999915, 12.143866278000075 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-LE", "NAME_1": "León" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -86.670720801317927, 12.000522848093718 ], [ -86.689808722999942, 12.02407461100006 ], [ -86.7275691399999, 12.088283596000053 ], [ -86.762684699999909, 12.18227773600006 ], [ -86.772572394999941, 12.197414455000057 ], [ -86.79751542899993, 12.218532619000086 ], [ -87.002227342999902, 12.341376044000071 ], [ -87.015044725999928, 12.356838283000059 ], [ -87.071400519999941, 12.388698635000083 ], [ -87.101958787999934, 12.420965887000079 ], [ -87.171009894999941, 12.451442776000079 ], [ -87.173573370999918, 12.474514065000051 ], [ -87.162098761999914, 12.45962148600006 ], [ -87.142486131999931, 12.446844794000071 ], [ -87.119618292999917, 12.437689520000049 ], [ -87.097808397999927, 12.433539130000042 ], [ -87.120843412540935, 12.45838376929831 ], [ -87.120749071312559, 12.458438829288525 ], [ -87.098657396121894, 12.471332099197014 ], [ -87.049383918033357, 12.47665477090095 ], [ -87.032227341818327, 12.484173692262061 ], [ -87.015303311398668, 12.493914699903485 ], [ -87.005794846854656, 12.499650784556025 ], [ -86.953937548179283, 12.552412420796543 ], [ -86.933783739328078, 12.584374293938481 ], [ -86.92610978923534, 12.604088853218002 ], [ -86.922156542190635, 12.610600084226519 ], [ -86.902752041273686, 12.628738512372422 ], [ -86.877301398240945, 12.655636095329498 ], [ -86.852806769616734, 12.681629339822166 ], [ -86.833324755233264, 12.690362657110938 ], [ -86.814075283947204, 12.712996933761474 ], [ -86.800200161208465, 12.73935191525868 ], [ -86.793042975952574, 12.746199042152057 ], [ -86.782010057118441, 12.752115993957943 ], [ -86.709921434326702, 12.761340236762521 ], [ -86.695710414803784, 12.764905911078927 ], [ -86.687855597557757, 12.767928982136823 ], [ -86.670001390251969, 12.778755195395945 ], [ -86.657573208336885, 12.806970527068131 ], [ -86.65460181322311, 12.838234768219991 ], [ -86.663903571292792, 12.959157620427845 ], [ -86.676254238842034, 12.987037055315852 ], [ -86.689819302318938, 13.008611964770353 ], [ -86.710954963101074, 13.056335151046369 ], [ -86.720695969843121, 13.090234890527768 ], [ -86.703358527374121, 13.09703034147708 ], [ -86.693772549363644, 13.097831326254664 ], [ -86.680543381771656, 13.097572943836269 ], [ -86.664652880126312, 13.092327786498117 ], [ -86.645248379209306, 13.083026028428435 ], [ -86.633414475597533, 13.083878689150197 ], [ -86.613053962070694, 13.088297024188307 ], [ -86.547088995760532, 13.109949448907912 ], [ -86.491175096353572, 13.121524970101291 ], [ -86.479056972801061, 13.11824351572568 ], [ -86.471486376395148, 13.114522813576968 ], [ -86.453373785771589, 13.096668606271123 ], [ -86.427070482017143, 13.053958035135224 ], [ -86.416916063225699, 13.040418809180665 ], [ -86.411722581831668, 13.031814683101118 ], [ -86.404720425307346, 13.006906643326886 ], [ -86.406839158800096, 12.975513210066595 ], [ -86.428853318725658, 12.937298489233854 ], [ -86.430222744284208, 12.925748806462252 ], [ -86.429938524343413, 12.917299710013594 ], [ -86.419964972705316, 12.899755561070265 ], [ -86.386349453164712, 12.883296616845371 ], [ -86.263902146666737, 12.848518378220547 ], [ -86.266847704258112, 12.823713691233877 ], [ -86.278681606970565, 12.724598294275836 ], [ -86.288810188239552, 12.636464138409224 ], [ -86.328342657787402, 12.612615464931764 ], [ -86.34255367731032, 12.599257107029871 ], [ -86.350976936236577, 12.588120836307553 ], [ -86.353715785555039, 12.582358914132556 ], [ -86.354878506437899, 12.577346299891815 ], [ -86.354620124019505, 12.57380646399713 ], [ -86.356325446362234, 12.563522853996517 ], [ -86.356325446362234, 12.55987966621359 ], [ -86.355808682424765, 12.55701162388732 ], [ -86.35609290236556, 12.552412420796543 ], [ -86.35741065108067, 12.546107896262413 ], [ -86.363456794095782, 12.528512071374962 ], [ -86.364412807604992, 12.523809516396057 ], [ -86.363921882089187, 12.521018988435571 ], [ -86.362139045380616, 12.515903022306645 ], [ -86.36105383976286, 12.513525906395444 ], [ -86.351467861752383, 12.500115872549486 ], [ -86.351183640912268, 12.499805813287651 ], [ -86.345292528427422, 12.494689846259405 ], [ -86.344052294078097, 12.492829495185049 ], [ -86.343277146822857, 12.490297348743638 ], [ -86.343122118091287, 12.483941148265387 ], [ -86.342579514832721, 12.480711370733161 ], [ -86.341416795748501, 12.476913154218664 ], [ -86.342812058829452, 12.473838406317384 ], [ -86.346842821139262, 12.469110012017438 ], [ -86.444149542967011, 12.374878038090969 ], [ -86.510915494054814, 12.308861395836743 ], [ -86.524842291838297, 12.289741115759853 ], [ -86.526418422971801, 12.274186509999424 ], [ -86.526547614181027, 12.203260606291906 ], [ -86.525229864566597, 12.196516832186035 ], [ -86.522516852770536, 12.190625718801869 ], [ -86.51835690015082, 12.187215074116352 ], [ -86.513344285910023, 12.184321194267682 ], [ -86.506910570166667, 12.176879788171675 ], [ -86.505515306186396, 12.158922227179005 ], [ -86.518253547363315, 12.131120307556159 ], [ -86.537709724224385, 12.109002793943773 ], [ -86.575459357063664, 12.080761623849867 ], [ -86.581092088928756, 12.077996934311045 ], [ -86.584037644721491, 12.07789358242286 ], [ -86.598196988300344, 12.080839138215651 ], [ -86.612459682868064, 12.086110133975467 ], [ -86.614268357998299, 12.086394354815582 ], [ -86.616852180383773, 12.086497708502407 ], [ -86.619642707444996, 12.086187649240628 ], [ -86.622355720140376, 12.085490017250493 ], [ -86.637341885119895, 12.08021902149062 ], [ -86.644395717588282, 12.078746243144565 ], [ -86.648038907169791, 12.077066759223555 ], [ -86.650751918965852, 12.075335598459105 ], [ -86.652198858890188, 12.073320216854484 ], [ -86.653154873298774, 12.070865587476874 ], [ -86.653284063608623, 12.067997545150547 ], [ -86.652844814936259, 12.065129502824277 ], [ -86.651268683802698, 12.059703477433516 ], [ -86.644344041644217, 12.045880032437537 ], [ -86.639589809821871, 12.040298977415887 ], [ -86.638375413894209, 12.038154405501416 ], [ -86.637419400384999, 12.034588731185011 ], [ -86.637496913851464, 12.032237453695529 ], [ -86.637987841165909, 12.029601956265253 ], [ -86.642302823416571, 12.022134710848206 ], [ -86.645842658411937, 12.0181556262811 ], [ -86.670595668555222, 12.00061147733777 ], [ -86.670720801317927, 12.000522848093718 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-MN", "NAME_1": "Managua" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -86.502340697627318, 11.766775283401987 ], [ -86.515614386999914, 11.783107815000051 ], [ -86.542388475999928, 11.842352606000077 ], [ -86.553212042999917, 11.851345119000086 ], [ -86.563262498999904, 11.856634833000044 ], [ -86.589629686999899, 11.882839260000083 ], [ -86.605213995999918, 11.904689846000053 ], [ -86.622222459999932, 11.936102606000077 ], [ -86.625477667999917, 11.950995184000078 ], [ -86.630360480999911, 11.964911200000074 ], [ -86.641875779999907, 11.976507880000042 ], [ -86.666493292999917, 11.995306708000044 ], [ -86.670720801317927, 12.000522848093718 ], [ -86.670595668555222, 12.00061147733777 ], [ -86.645842658411937, 12.0181556262811 ], [ -86.642302823416571, 12.022134710848206 ], [ -86.637987841165909, 12.029601956265253 ], [ -86.637496913851464, 12.032237453695529 ], [ -86.637419400384999, 12.034588731185011 ], [ -86.638375413894209, 12.038154405501416 ], [ -86.639589809821871, 12.040298977415887 ], [ -86.644344041644217, 12.045880032437537 ], [ -86.651268683802698, 12.059703477433516 ], [ -86.652844814936259, 12.065129502824277 ], [ -86.653284063608623, 12.067997545150547 ], [ -86.653154873298774, 12.070865587476874 ], [ -86.652198858890188, 12.073320216854484 ], [ -86.650751918965852, 12.075335598459105 ], [ -86.648038907169791, 12.077066759223555 ], [ -86.644395717588282, 12.078746243144565 ], [ -86.637341885119895, 12.08021902149062 ], [ -86.622355720140376, 12.085490017250493 ], [ -86.619642707444996, 12.086187649240628 ], [ -86.616852180383773, 12.086497708502407 ], [ -86.614268357998299, 12.086394354815582 ], [ -86.612459682868064, 12.086110133975467 ], [ -86.598196988300344, 12.080839138215651 ], [ -86.584037644721491, 12.07789358242286 ], [ -86.581092088928756, 12.077996934311045 ], [ -86.575459357063664, 12.080761623849867 ], [ -86.537709724224385, 12.109002793943773 ], [ -86.518253547363315, 12.131120307556159 ], [ -86.505515306186396, 12.158922227179005 ], [ -86.506910570166667, 12.176879788171675 ], [ -86.513344285910023, 12.184321194267682 ], [ -86.51835690015082, 12.187215074116352 ], [ -86.522516852770536, 12.190625718801869 ], [ -86.525229864566597, 12.196516832186035 ], [ -86.526547614181027, 12.203260606291906 ], [ -86.526418422971801, 12.274186509999424 ], [ -86.524842291838297, 12.289741115759853 ], [ -86.510915494054814, 12.308861395836743 ], [ -86.444149542967011, 12.374878038090969 ], [ -86.346842821139262, 12.469110012017438 ], [ -86.342812058829452, 12.473838406317384 ], [ -86.341416795748501, 12.476913154218664 ], [ -86.342579514832721, 12.480711370733161 ], [ -86.343122118091287, 12.483941148265387 ], [ -86.343277146822857, 12.490297348743638 ], [ -86.344052294078097, 12.492829495185049 ], [ -86.345292528427422, 12.494689846259405 ], [ -86.351183640912268, 12.499805813287651 ], [ -86.351467861752383, 12.500115872549486 ], [ -86.36105383976286, 12.513525906395444 ], [ -86.362139045380616, 12.515903022306645 ], [ -86.363921882089187, 12.521018988435571 ], [ -86.364412807604992, 12.523809516396057 ], [ -86.363456794095782, 12.528512071374962 ], [ -86.35741065108067, 12.546107896262413 ], [ -86.35609290236556, 12.552412420796543 ], [ -86.355808682424765, 12.55701162388732 ], [ -86.356325446362234, 12.55987966621359 ], [ -86.356325446362234, 12.563522853996517 ], [ -86.354620124019505, 12.57380646399713 ], [ -86.354878506437899, 12.577346299891815 ], [ -86.353715785555039, 12.582358914132556 ], [ -86.350976936236577, 12.588120836307553 ], [ -86.34255367731032, 12.599257107029871 ], [ -86.328342657787402, 12.612615464931764 ], [ -86.288810188239552, 12.636464138409224 ], [ -86.118898077883955, 12.59961884223577 ], [ -86.101147224264992, 12.594115302479224 ], [ -86.086212735229537, 12.580653590890506 ], [ -86.070942349409904, 12.563781236414911 ], [ -86.06001278426254, 12.555047919126139 ], [ -86.050323451665918, 12.548588364961063 ], [ -85.988518438874848, 12.525256456320392 ], [ -85.972266202023604, 12.522078354732287 ], [ -85.978364020982781, 12.504560045109997 ], [ -85.974359097094634, 12.470867011203609 ], [ -85.969630702794689, 12.456655992579954 ], [ -85.962809414322976, 12.445261339439242 ], [ -85.950148688411218, 12.428569851217674 ], [ -85.924956427796872, 12.401646429838877 ], [ -85.921442430323907, 12.39611705255993 ], [ -85.920253871918646, 12.389941718335592 ], [ -85.922295091045612, 12.370304674321233 ], [ -85.922501796620622, 12.353613186099665 ], [ -85.920822312699556, 12.346404324000332 ], [ -85.91761837358905, 12.341133328240517 ], [ -85.830207689033614, 12.260130520107396 ], [ -85.828063117119143, 12.256797389787721 ], [ -85.829820116305314, 12.250983792567979 ], [ -85.846304898052608, 12.226308294991782 ], [ -85.851498379446639, 12.198764756888011 ], [ -85.869300909909043, 12.206051134252448 ], [ -85.876793992848491, 12.206180325461617 ], [ -85.885062222143802, 12.203157253504457 ], [ -85.91648149292655, 12.180833035216381 ], [ -86.000507372117511, 12.143806870990318 ], [ -86.018361579423356, 12.148328558815933 ], [ -86.023787604814117, 12.151248277086324 ], [ -86.025570440623312, 12.151894233132339 ], [ -86.028722703789754, 12.152281805860639 ], [ -86.045750087896238, 12.149956365893559 ], [ -86.080037401005256, 12.13631378805087 ], [ -86.109027879932682, 12.131275336287729 ], [ -86.127114631235202, 12.11796865522922 ], [ -86.187911952774357, 12.059057522286821 ], [ -86.184656337719787, 12.046319281109902 ], [ -86.170161099155393, 12.031720688858684 ], [ -86.164760912186352, 12.024227606818613 ], [ -86.162047898591652, 12.018310655012726 ], [ -86.163365648206081, 11.99603811356809 ], [ -86.174501918928399, 11.978235582206366 ], [ -86.180160489215211, 11.971672675253728 ], [ -86.186361660062573, 11.966014105866293 ], [ -86.194319830995369, 11.961750800459072 ], [ -86.203673265009172, 11.959218654916981 ], [ -86.211553920676863, 11.958495185404445 ], [ -86.223439501132077, 11.961621609249846 ], [ -86.230389980812959, 11.964773871516968 ], [ -86.25775265176344, 11.985521959570747 ], [ -86.281420458087666, 11.956996567737406 ], [ -86.293280199221783, 11.939245714118385 ], [ -86.35586035836883, 11.889248766517369 ], [ -86.375213182442394, 11.858165390720217 ], [ -86.382499558907512, 11.851189073516935 ], [ -86.409552172394797, 11.831396999871629 ], [ -86.419939134283595, 11.81638499647039 ], [ -86.432418993042063, 11.804628608123778 ], [ -86.436320563243385, 11.802716580205981 ], [ -86.441772427055867, 11.800675361079016 ], [ -86.453192918618299, 11.797910671540251 ], [ -86.459290737577476, 11.79710968676261 ], [ -86.467197231666887, 11.796799628400095 ], [ -86.477170783304985, 11.790805162228423 ], [ -86.502259691131826, 11.766853135963458 ], [ -86.502340697627318, 11.766775283401987 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-CA", "NAME_1": "Carazo" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -86.175200963732777, 11.519466114006992 ], [ -86.176136847999942, 11.522406317000048 ], [ -86.207142706999946, 11.536037502000056 ], [ -86.24437415299991, 11.571600653000075 ], [ -86.336455857999908, 11.611354885000083 ], [ -86.352080857999908, 11.622626044000071 ], [ -86.365386522999927, 11.637966213000084 ], [ -86.376616990999935, 11.66946035400008 ], [ -86.496367967999902, 11.759426174000055 ], [ -86.502340697627318, 11.766775283401987 ], [ -86.502259691131826, 11.766853135963458 ], [ -86.477170783304985, 11.790805162228423 ], [ -86.467197231666887, 11.796799628400095 ], [ -86.459290737577476, 11.79710968676261 ], [ -86.453192918618299, 11.797910671540251 ], [ -86.441772427055867, 11.800675361079016 ], [ -86.436320563243385, 11.802716580205981 ], [ -86.432418993042063, 11.804628608123778 ], [ -86.419939134283595, 11.81638499647039 ], [ -86.409552172394797, 11.831396999871629 ], [ -86.382499558907512, 11.851189073516935 ], [ -86.375213182442394, 11.858165390720217 ], [ -86.35586035836883, 11.889248766517369 ], [ -86.293280199221783, 11.939245714118385 ], [ -86.281420458087666, 11.956996567737406 ], [ -86.270516729563383, 11.944232489038143 ], [ -86.179075283597456, 11.907981472067263 ], [ -86.149748907885794, 11.894364731746975 ], [ -86.136597255558854, 11.876484686918729 ], [ -86.134297654912814, 11.87403005574248 ], [ -86.081122605723635, 11.858501288403716 ], [ -86.072466803700024, 11.856175849335955 ], [ -86.077350226731539, 11.845530504129442 ], [ -86.09781409394526, 11.809021103840848 ], [ -86.103472663332752, 11.783906358491663 ], [ -86.099984504281451, 11.759308377079947 ], [ -86.095669522030789, 11.742410183283312 ], [ -86.09551449329922, 11.730679633358363 ], [ -86.097865769889324, 11.721842963282143 ], [ -86.109828863811003, 11.705590725531522 ], [ -86.119104784358285, 11.687193914967168 ], [ -86.123213060134617, 11.656291409021321 ], [ -86.121998664206956, 11.641847846400992 ], [ -86.119440681142521, 11.632804469850385 ], [ -86.101689825724861, 11.610816148346544 ], [ -86.136623093980575, 11.587923489277614 ], [ -86.139723680303575, 11.584047755699373 ], [ -86.146260748834493, 11.57182628025862 ], [ -86.17512203565343, 11.519607245477971 ], [ -86.175200963732777, 11.519466114006992 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-MT", "NAME_1": "Matagalpa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -85.29587337925301, 12.652716376159844 ], [ -85.290447353862248, 12.677908636774134 ], [ -85.289052089882034, 12.680647487891235 ], [ -85.29626095198131, 12.686073513281997 ], [ -85.312203132268735, 12.687029526791207 ], [ -85.331090868348895, 12.697028916851025 ], [ -85.364112107787548, 12.708165188472663 ], [ -85.370985074001965, 12.711679185046364 ], [ -85.374473233053266, 12.721342678321946 ], [ -85.382844815136082, 12.731238714694939 ], [ -85.392947557084085, 12.738990180052781 ], [ -85.401706712794521, 12.742090766375782 ], [ -85.407623663701088, 12.743253486359322 ], [ -85.415245937849761, 12.737724107281736 ], [ -85.416744553718161, 12.735734564998154 ], [ -85.418346524172762, 12.731703802688344 ], [ -85.420594448874681, 12.727207953284392 ], [ -85.423772548664147, 12.723254706239686 ], [ -85.425658739059543, 12.721549383896956 ], [ -85.430025397254269, 12.718836371201576 ], [ -85.434598761923326, 12.716743476130489 ], [ -85.442427740747632, 12.714392197741745 ], [ -85.444959886289723, 12.713126125870019 ], [ -85.446691047054173, 12.711369127583168 ], [ -85.447750414250208, 12.709017849194367 ], [ -85.45335730679426, 12.707183336541732 ], [ -85.463537564007368, 12.706149806868098 ], [ -85.527538824657029, 12.709482937187772 ], [ -85.530768602189198, 12.708888657985142 ], [ -85.533404099619474, 12.707803453266763 ], [ -85.535316128436534, 12.706149806868098 ], [ -85.536892258670775, 12.704237778950301 ], [ -85.549888882266089, 12.67878713591756 ], [ -85.552886114902265, 12.674575507353779 ], [ -85.556787686002906, 12.673076891485323 ], [ -85.562704636909473, 12.672275905808419 ], [ -85.582005785038916, 12.672146715498513 ], [ -85.586656664073757, 12.671371568243273 ], [ -85.595674201303325, 12.666694850786712 ], [ -85.61603471572954, 12.662896633372895 ], [ -85.627894456863658, 12.660726223036761 ], [ -85.640115933203731, 12.650752672297983 ], [ -85.644120856192558, 12.648892320324308 ], [ -85.646988897619508, 12.648995673111813 ], [ -85.65285417438065, 12.652096259434813 ], [ -85.668718837604274, 12.655015976805885 ], [ -85.681870489931157, 12.658529975178226 ], [ -85.855735847331459, 12.623002427719825 ], [ -85.871936408238639, 12.614940903999525 ], [ -85.889532233126033, 12.57879323981615 ], [ -85.937358771290235, 12.552644964793274 ], [ -85.942707282315212, 12.548588364961063 ], [ -85.972266202023604, 12.522078354732287 ], [ -85.988518438874848, 12.525256456320392 ], [ -86.050323451665918, 12.548588364961063 ], [ -86.06001278426254, 12.555047919126139 ], [ -86.070942349409904, 12.563781236414911 ], [ -86.086212735229537, 12.580653590890506 ], [ -86.101147224264992, 12.594115302479224 ], [ -86.118898077883955, 12.59961884223577 ], [ -86.288810188239552, 12.636464138409224 ], [ -86.278681606970565, 12.724598294275836 ], [ -86.266847704258112, 12.823713691233877 ], [ -86.263902146666737, 12.848518378220547 ], [ -86.25832109164503, 12.884485175250632 ], [ -86.242430589999685, 12.91683462202019 ], [ -86.238890754105, 12.920968736218185 ], [ -86.231165127168879, 12.928255113582622 ], [ -86.208944260768988, 12.940605780232545 ], [ -86.197187873321695, 12.944636542542412 ], [ -86.171582200658008, 12.950114243877238 ], [ -86.15889563722385, 12.954455064549563 ], [ -86.150575731085098, 12.96019114830284 ], [ -86.146131557625267, 12.965539659327817 ], [ -86.143702765770001, 12.970991523140242 ], [ -86.137217373183205, 12.996726386113835 ], [ -86.09951941628799, 13.047007555454286 ], [ -86.094455126103185, 13.046826687401676 ], [ -86.080735032995335, 13.047162584185912 ], [ -86.071691657344104, 13.043364365872776 ], [ -86.057222256302055, 13.034992783789903 ], [ -86.041745164907411, 13.019619045182765 ], [ -86.007457851798392, 12.993935859052613 ], [ -85.994383714736614, 13.009619656022267 ], [ -85.989371101395193, 13.012100124720973 ], [ -85.97735632973081, 13.013934638272929 ], [ -85.941079475237586, 13.012487698348593 ], [ -85.928418749325829, 13.014193019792003 ], [ -85.918316005579186, 13.017526150111735 ], [ -85.896482713706234, 13.032615667878758 ], [ -85.83974199109997, 13.084989732290296 ], [ -85.793439908125265, 13.12397960037822 ], [ -85.782536179600982, 13.130258287390063 ], [ -85.745019090758433, 13.162220160531945 ], [ -85.672129483189053, 13.245858466095342 ], [ -85.65455949582406, 13.275107327441219 ], [ -85.639883389207057, 13.298155016141095 ], [ -85.625930752102533, 13.313864651532413 ], [ -85.604975959373007, 13.327713934950111 ], [ -85.581540697045511, 13.327791449315896 ], [ -85.562084520184442, 13.335129503523774 ], [ -85.506377326352492, 13.370579534817637 ], [ -85.485370855880262, 13.325052599098171 ], [ -85.43444373229238, 13.258002428069574 ], [ -85.414574144281289, 13.238959662358525 ], [ -85.401112433591948, 13.233688665699333 ], [ -85.396358201769601, 13.231053168269113 ], [ -85.390828823591335, 13.226815701283556 ], [ -85.362200079869751, 13.200951646201474 ], [ -85.359926316746112, 13.199504706277139 ], [ -85.357445848047405, 13.198471178402144 ], [ -85.35450029225467, 13.198083603875205 ], [ -85.35142554435339, 13.197928575143635 ], [ -85.345301886972493, 13.198652045555434 ], [ -85.339824184738291, 13.200176499845554 ], [ -85.336491055317936, 13.20012482300217 ], [ -85.332460293008126, 13.198936266395549 ], [ -85.324889695702893, 13.193871975311424 ], [ -85.310833705810865, 13.187050685940392 ], [ -85.307371385181284, 13.184725246872631 ], [ -85.305407681319423, 13.18144379339634 ], [ -85.304167446970098, 13.172477932110837 ], [ -85.302307094996422, 13.170540065771377 ], [ -85.290395677018864, 13.169093125847041 ], [ -85.283264330184693, 13.159248766317489 ], [ -85.252439337705255, 13.146588040405732 ], [ -85.241845669342126, 13.145192776425461 ], [ -85.21572323274097, 13.151368109750479 ], [ -85.187094489019444, 13.164416409289856 ], [ -85.177327643855676, 13.171728624176637 ], [ -85.168671840932689, 13.181469630918741 ], [ -85.156269497439325, 13.206739406798192 ], [ -85.144487270670993, 13.241440131057175 ], [ -85.13632239506245, 13.259449367993909 ], [ -85.123351609888857, 13.277484443352364 ], [ -85.097952643699557, 13.292160549070047 ], [ -85.064621344999068, 13.295131944183879 ], [ -84.998242966639566, 13.293736681102928 ], [ -84.982843391409347, 13.295209459448984 ], [ -84.973774177336395, 13.298775132866069 ], [ -84.883107875927692, 13.381534939285984 ], [ -84.878922084886312, 13.380398057724165 ], [ -84.875511441100116, 13.376754869041974 ], [ -84.86962032681663, 13.366626287772931 ], [ -84.769755621924389, 13.2426803654065 ], [ -84.751436326625139, 13.215731106505359 ], [ -84.794508632966995, 13.159171251052385 ], [ -84.797738409599901, 13.153977768759034 ], [ -84.800864834344623, 13.147182318709042 ], [ -84.798771939273536, 13.146277981143896 ], [ -84.796679043303186, 13.145089422738636 ], [ -84.789392665938749, 13.138371487054485 ], [ -84.787067226870988, 13.13713125180584 ], [ -84.784664273437443, 13.136123562352509 ], [ -84.781873744577638, 13.135374254418309 ], [ -84.779393276778308, 13.134340724744618 ], [ -84.777222867341436, 13.133048814451229 ], [ -84.77324378097569, 13.129870713762443 ], [ -84.765492315617848, 13.120103867699299 ], [ -84.764329597432948, 13.117804267053259 ], [ -84.758050910421161, 13.09837392771459 ], [ -84.743529833435048, 13.069047552902248 ], [ -84.740739304575243, 13.065120144279206 ], [ -84.737432013576552, 13.061451117175295 ], [ -84.735390795348906, 13.059926662885175 ], [ -84.733091192904226, 13.05866059011413 ], [ -84.730429857052229, 13.057807929392425 ], [ -84.727329270729228, 13.057291165454899 ], [ -84.724021978831217, 13.057265326133859 ], [ -84.720998907773378, 13.05773041412732 ], [ -84.718234219133876, 13.058428046117399 ], [ -84.707072109989895, 13.064939277125916 ], [ -84.704617478813589, 13.065946967478567 ], [ -84.701801114230022, 13.066541245781877 ], [ -84.699165615900426, 13.066747952256151 ], [ -84.696452603205046, 13.066386217050251 ], [ -84.697124395874141, 13.065714423481836 ], [ -84.700870938243213, 13.063311469148971 ], [ -84.707614712349084, 13.05811798775494 ], [ -84.708234829074058, 13.057575385395694 ], [ -84.729292976389729, 13.03478607821495 ], [ -84.73353044337523, 13.026388657710356 ], [ -84.739809130387016, 12.993005683065803 ], [ -84.740971848571917, 12.978587957967875 ], [ -84.741953702301487, 12.975254828547463 ], [ -84.746217006809388, 12.965307115331086 ], [ -84.748180711570569, 12.950346787873968 ], [ -84.751022914575856, 12.949416611887102 ], [ -84.755337896826461, 12.950346787873968 ], [ -84.760841438381647, 12.948176378437097 ], [ -84.77151262111056, 12.94014069313846 ], [ -84.776783616870432, 12.94070913302005 ], [ -84.782752244620383, 12.944998276848992 ], [ -84.795593837685431, 12.948176378437097 ], [ -84.809365606737344, 12.947633775178588 ], [ -84.828149990929319, 12.942595323415446 ], [ -84.839983893641772, 12.941329251543721 ], [ -84.854711677102216, 12.931536567058913 ], [ -84.875666469831685, 12.911822007779449 ], [ -84.898352424224981, 12.89660329790388 ], [ -84.918506232176867, 12.900375677795296 ], [ -84.925663418332078, 12.8838650585256 ], [ -84.935869513966907, 12.868723863015873 ], [ -84.942044847291868, 12.863168647315206 ], [ -84.95436967641939, 12.855262153225794 ], [ -84.958245409098311, 12.850714626978458 ], [ -84.971293707738425, 12.854745388388949 ], [ -85.030592414308444, 12.864848131236272 ], [ -85.040643480312326, 12.863685411252732 ], [ -85.067954475318743, 12.855701401898159 ], [ -85.081958788367388, 12.853117581311324 ], [ -85.094025235076515, 12.852704169261983 ], [ -85.105006477067263, 12.853944404510628 ], [ -85.122731493163883, 12.85918956094946 ], [ -85.131258103978325, 12.860843207348125 ], [ -85.141335008403871, 12.859422104946191 ], [ -85.144797329033509, 12.85459035875806 ], [ -85.144590624357818, 12.838803209000901 ], [ -85.148027105666358, 12.829191392568703 ], [ -85.159395922184046, 12.819217840930605 ], [ -85.169085252982029, 12.81603974024182 ], [ -85.181048346903651, 12.816349799503655 ], [ -85.192132940782585, 12.817874253793775 ], [ -85.206809048298908, 12.816737372231955 ], [ -85.215568203110081, 12.812319037193788 ], [ -85.222311978115272, 12.805756130241207 ], [ -85.226187709894873, 12.797875474573459 ], [ -85.227893033136979, 12.788056952566308 ], [ -85.226807826619904, 12.77865184170912 ], [ -85.217118495821921, 12.75958323847567 ], [ -85.212803513571259, 12.748395290909912 ], [ -85.205052049112737, 12.714521388950914 ], [ -85.179187994930032, 12.660157782255851 ], [ -85.178412848574112, 12.649357408317712 ], [ -85.179498054191811, 12.639797267829636 ], [ -85.182133551622087, 12.631735745008598 ], [ -85.186009284301008, 12.625405382052747 ], [ -85.192830572772721, 12.625405382052747 ], [ -85.197713995804236, 12.629720364303353 ], [ -85.207041592295639, 12.635895696728994 ], [ -85.21608496794687, 12.639332179836231 ], [ -85.220141567779137, 12.63566315453096 ], [ -85.223009610105407, 12.625844630725112 ], [ -85.229495001792884, 12.627549953967161 ], [ -85.260759242944687, 12.661811427755197 ], [ -85.272050544197214, 12.663516750997246 ], [ -85.289052089882034, 12.652716376159844 ], [ -85.29587337925301, 12.652716376159844 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-BO", "NAME_1": "Boaco" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -85.407623663701088, 12.743253486359322 ], [ -85.401706712794521, 12.742090766375782 ], [ -85.392947557084085, 12.738990180052781 ], [ -85.382844815136082, 12.731238714694939 ], [ -85.374473233053266, 12.721342678321946 ], [ -85.370985074001965, 12.711679185046364 ], [ -85.364112107787548, 12.708165188472663 ], [ -85.331090868348895, 12.697028916851025 ], [ -85.312203132268735, 12.687029526791207 ], [ -85.29626095198131, 12.686073513281997 ], [ -85.289052089882034, 12.680647487891235 ], [ -85.290447353862248, 12.677908636774134 ], [ -85.29587337925301, 12.652716376159844 ], [ -85.289052089882034, 12.652716376159844 ], [ -85.272050544197214, 12.663516750997246 ], [ -85.260759242944687, 12.661811427755197 ], [ -85.229495001792884, 12.627549953967161 ], [ -85.223009610105407, 12.625844630725112 ], [ -85.220141567779137, 12.63566315453096 ], [ -85.21608496794687, 12.639332179836231 ], [ -85.207041592295639, 12.635895696728994 ], [ -85.197713995804236, 12.629720364303353 ], [ -85.192830572772721, 12.625405382052747 ], [ -85.186009284301008, 12.625405382052747 ], [ -85.182133551622087, 12.631735745008598 ], [ -85.179498054191811, 12.639797267829636 ], [ -85.178412848574112, 12.649357408317712 ], [ -85.179187994930032, 12.660157782255851 ], [ -85.162315639555118, 12.654964300861764 ], [ -85.154279955155801, 12.662689927797942 ], [ -85.155339322351836, 12.677546902467554 ], [ -85.165519578665624, 12.693695787430613 ], [ -85.15213538324133, 12.706098130923976 ], [ -85.148776415399254, 12.707958481998332 ], [ -85.149241503392659, 12.710904038690444 ], [ -85.142006801972343, 12.71700185854894 ], [ -85.133686895833534, 12.72196279504692 ], [ -85.1307671775632, 12.721626899162061 ], [ -85.126452196211858, 12.736328844200784 ], [ -85.122886521895452, 12.764337470298017 ], [ -85.117718878923085, 12.776248888275575 ], [ -85.098572761323851, 12.793224596437938 ], [ -85.079917569240422, 12.793663845110359 ], [ -85.061391568366162, 12.783845323103151 ], [ -85.031987678288715, 12.7620378687526 ], [ -85.027078416835479, 12.760048326469075 ], [ -85.019171922746011, 12.747697658919833 ], [ -85.010206062359885, 12.742917589575086 ], [ -85.004289109654678, 12.737724107281736 ], [ -84.998217129117222, 12.730696113235012 ], [ -84.989613003037618, 12.714779771369365 ], [ -84.985220507320548, 12.702144883879271 ], [ -84.983928596127782, 12.683722235792516 ], [ -84.986848314398173, 12.668193468453808 ], [ -84.986383226404769, 12.663749294094657 ], [ -84.985298020787013, 12.660416165573565 ], [ -84.973774177336395, 12.654654242499305 ], [ -84.968529019098924, 12.649512437049339 ], [ -84.981215583432402, 12.624449368543537 ], [ -85.019275274634197, 12.569672348899758 ], [ -85.023228521678902, 12.561714178866225 ], [ -85.025708991276929, 12.553652655145925 ], [ -85.027130092779544, 12.542464708479486 ], [ -85.027621019194669, 12.505645249828376 ], [ -85.030437384677555, 12.494560655050179 ], [ -85.035656703593986, 12.483191840331131 ], [ -85.05229651587149, 12.462547105064857 ], [ -85.063303596283902, 12.451850083914223 ], [ -85.078005541322682, 12.440868841923475 ], [ -85.107383592079088, 12.426631984878213 ], [ -85.121723801911912, 12.424384060176237 ], [ -85.127744107404624, 12.424125677757786 ], [ -85.137950202140075, 12.425365912107168 ], [ -85.148621384868989, 12.422962957774246 ], [ -85.163710904434652, 12.417046006867736 ], [ -85.222234462850167, 12.377487697998845 ], [ -85.234145880827725, 12.371053982255489 ], [ -85.275047776833446, 12.357437241935145 ], [ -85.329049649221929, 12.351442775763473 ], [ -85.400854051173496, 12.338885403538541 ], [ -85.443719651940341, 12.340719916191176 ], [ -85.47283932207705, 12.341210841706982 ], [ -85.497592333119655, 12.345164088751687 ], [ -85.508547735789364, 12.345525823957587 ], [ -85.522810432155723, 12.34134003291615 ], [ -85.560560064995002, 12.323124091303782 ], [ -85.586346604811922, 12.304675604795307 ], [ -85.591074999111925, 12.30010224012625 ], [ -85.599110684410562, 12.289379381453273 ], [ -85.601100226694086, 12.284495958421758 ], [ -85.602262945778307, 12.278088080200746 ], [ -85.602107917046737, 12.253774318729825 ], [ -85.599704962713815, 12.23558421553912 ], [ -85.599937506710546, 12.228943793321378 ], [ -85.602082078625017, 12.221967475218776 ], [ -85.622132534688717, 12.176802272906571 ], [ -85.623295253772937, 12.175174464929626 ], [ -85.624457973756478, 12.173236599489485 ], [ -85.625879076158412, 12.171376248415129 ], [ -85.63525834769456, 12.156570949689581 ], [ -85.640038417938626, 12.146984972578423 ], [ -85.65665239089509, 12.046474310740848 ], [ -85.731479864803873, 12.041332506190201 ], [ -85.785094163564793, 12.114971421693724 ], [ -85.812301804884385, 12.138122463181105 ], [ -85.828347337959258, 12.144297797405386 ], [ -85.836796434407916, 12.150318101099458 ], [ -85.842119107011172, 12.15672597932047 ], [ -85.843746914088797, 12.164348253469086 ], [ -85.845271369278237, 12.179489447180231 ], [ -85.851498379446639, 12.198764756888011 ], [ -85.846304898052608, 12.226308294991782 ], [ -85.829820116305314, 12.250983792567979 ], [ -85.828063117119143, 12.256797389787721 ], [ -85.830207689033614, 12.260130520107396 ], [ -85.91761837358905, 12.341133328240517 ], [ -85.920822312699556, 12.346404324000332 ], [ -85.922501796620622, 12.353613186099665 ], [ -85.922295091045612, 12.370304674321233 ], [ -85.920253871918646, 12.389941718335592 ], [ -85.921442430323907, 12.39611705255993 ], [ -85.924956427796872, 12.401646429838877 ], [ -85.950148688411218, 12.428569851217674 ], [ -85.962809414322976, 12.445261339439242 ], [ -85.969630702794689, 12.456655992579954 ], [ -85.974359097094634, 12.470867011203609 ], [ -85.978364020982781, 12.504560045109997 ], [ -85.972266202023604, 12.522078354732287 ], [ -85.942707282315212, 12.548588364961063 ], [ -85.937358771290235, 12.552644964793274 ], [ -85.889532233126033, 12.57879323981615 ], [ -85.871936408238639, 12.614940903999525 ], [ -85.855735847331459, 12.623002427719825 ], [ -85.681870489931157, 12.658529975178226 ], [ -85.668718837604274, 12.655015976805885 ], [ -85.65285417438065, 12.652096259434813 ], [ -85.646988897619508, 12.648995673111813 ], [ -85.644120856192558, 12.648892320324308 ], [ -85.640115933203731, 12.650752672297983 ], [ -85.627894456863658, 12.660726223036761 ], [ -85.61603471572954, 12.662896633372895 ], [ -85.595674201303325, 12.666694850786712 ], [ -85.586656664073757, 12.671371568243273 ], [ -85.582005785038916, 12.672146715498513 ], [ -85.562704636909473, 12.672275905808419 ], [ -85.556787686002906, 12.673076891485323 ], [ -85.552886114902265, 12.674575507353779 ], [ -85.549888882266089, 12.67878713591756 ], [ -85.536892258670775, 12.704237778950301 ], [ -85.535316128436534, 12.706149806868098 ], [ -85.533404099619474, 12.707803453266763 ], [ -85.530768602189198, 12.708888657985142 ], [ -85.527538824657029, 12.709482937187772 ], [ -85.463537564007368, 12.706149806868098 ], [ -85.45335730679426, 12.707183336541732 ], [ -85.447750414250208, 12.709017849194367 ], [ -85.446691047054173, 12.711369127583168 ], [ -85.444959886289723, 12.713126125870019 ], [ -85.442427740747632, 12.714392197741745 ], [ -85.434598761923326, 12.716743476130489 ], [ -85.430025397254269, 12.718836371201576 ], [ -85.425658739059543, 12.721549383896956 ], [ -85.423772548664147, 12.723254706239686 ], [ -85.420594448874681, 12.727207953284392 ], [ -85.418346524172762, 12.731703802688344 ], [ -85.416744553718161, 12.735734564998154 ], [ -85.415245937849761, 12.737724107281736 ], [ -85.407623663701088, 12.743253486359322 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-CO", "NAME_1": "Chontales" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -85.127744107404624, 12.424125677757786 ], [ -85.121723801911912, 12.424384060176237 ], [ -85.107383592079088, 12.426631984878213 ], [ -85.078005541322682, 12.440868841923475 ], [ -85.063303596283902, 12.451850083914223 ], [ -85.05229651587149, 12.462547105064857 ], [ -85.035656703593986, 12.483191840331131 ], [ -85.030437384677555, 12.494560655050179 ], [ -85.027621019194669, 12.505645249828376 ], [ -85.027130092779544, 12.542464708479486 ], [ -85.025708991276929, 12.553652655145925 ], [ -85.023228521678902, 12.561714178866225 ], [ -85.019275274634197, 12.569672348899758 ], [ -84.981215583432402, 12.624449368543537 ], [ -84.968529019098924, 12.649512437049339 ], [ -84.944499477568797, 12.615250963261303 ], [ -84.915612352328196, 12.589180203503588 ], [ -84.90972123894403, 12.579490871806286 ], [ -84.887862107750038, 12.531793524851253 ], [ -84.867010667808074, 12.500813502740925 ], [ -84.853678148327845, 12.488075263362703 ], [ -84.847347785371994, 12.47758494688776 ], [ -84.845332403767429, 12.470815335259488 ], [ -84.846650153381859, 12.464975897819443 ], [ -84.852360398713415, 12.451462511185923 ], [ -84.855150925774581, 12.439163520480065 ], [ -84.856339484179841, 12.422136135474261 ], [ -84.852153693138405, 12.389864203070488 ], [ -84.846934374221973, 12.37356028937586 ], [ -84.839596320014152, 12.361493841767356 ], [ -84.83277503064312, 12.354181626880575 ], [ -84.825540331021443, 12.348238837552287 ], [ -84.819649216737957, 12.341960151439821 ], [ -84.784225022966439, 12.280284328958601 ], [ -84.781098599121037, 12.265168971870537 ], [ -84.787403123655224, 12.242689723951571 ], [ -84.785982022152609, 12.209694322035318 ], [ -84.772701178616501, 12.150033881158663 ], [ -84.709320034691814, 11.99293752724509 ], [ -84.702421230955053, 11.982731432509581 ], [ -84.574625414331365, 11.922528388374417 ], [ -84.613615282419346, 11.906508693721207 ], [ -84.621573451553559, 11.899635728406111 ], [ -84.620720790831797, 11.895320746155505 ], [ -84.619713101378522, 11.892426866306835 ], [ -84.612581752745655, 11.87919769871479 ], [ -84.607414109773345, 11.862506212291862 ], [ -84.645706345871133, 11.863746445741867 ], [ -84.656945970280276, 11.866071885708948 ], [ -84.661751878946063, 11.868009752048408 ], [ -84.665524257938159, 11.868862412770113 ], [ -84.668909064201955, 11.869327500763518 ], [ -84.683998582868298, 11.867854723316839 ], [ -84.688029344278789, 11.868164780779978 ], [ -84.696504279149167, 11.870541896691179 ], [ -84.700870938243213, 11.870490220747058 ], [ -84.721308967035156, 11.866924547329972 ], [ -84.794973720960456, 11.867828883995799 ], [ -84.800167202354487, 11.867053738539198 ], [ -84.804973111020217, 11.865606797715543 ], [ -84.808228726074844, 11.860800889949076 ], [ -84.874271205851471, 11.801062933807316 ], [ -84.899360113678313, 11.784810696056752 ], [ -84.942122361657653, 11.775612290774575 ], [ -84.956979336327265, 11.753029690068104 ], [ -84.959769864287807, 11.746518459958963 ], [ -84.959795701810151, 11.745355739975423 ], [ -84.960777553741082, 11.741324978564876 ], [ -84.962741257602943, 11.738405260294485 ], [ -84.966901211121979, 11.733831894726166 ], [ -84.968451503833819, 11.731506456557725 ], [ -84.96943335576475, 11.729284369378149 ], [ -84.970828619744964, 11.727475694247858 ], [ -84.977804937847566, 11.720137640939356 ], [ -84.982378303415942, 11.714194850711749 ], [ -84.985685594414633, 11.708639635011139 ], [ -84.988992886312644, 11.706288357521657 ], [ -84.9950390293277, 11.702826035992757 ], [ -85.013694221411185, 11.69592723225594 ], [ -85.018551805121717, 11.695384629896751 ], [ -85.021058112242088, 11.696004747521044 ], [ -85.025708991276929, 11.697761745807895 ], [ -85.031987678288715, 11.695307115530966 ], [ -85.041160244249852, 11.690346178133609 ], [ -85.061184861891832, 11.676522732238311 ], [ -85.076687791708196, 11.668926296511358 ], [ -85.080873582749632, 11.665128079097542 ], [ -85.083302374604898, 11.662208359927831 ], [ -85.101518317116643, 11.631460882713554 ], [ -85.522913784943228, 11.680527655227081 ], [ -85.65665239089509, 12.046474310740848 ], [ -85.640038417938626, 12.146984972578423 ], [ -85.63525834769456, 12.156570949689581 ], [ -85.625879076158412, 12.171376248415129 ], [ -85.624457973756478, 12.173236599489485 ], [ -85.623295253772937, 12.175174464929626 ], [ -85.622132534688717, 12.176802272906571 ], [ -85.602082078625017, 12.221967475218776 ], [ -85.599937506710546, 12.228943793321378 ], [ -85.599704962713815, 12.23558421553912 ], [ -85.602107917046737, 12.253774318729825 ], [ -85.602262945778307, 12.278088080200746 ], [ -85.601100226694086, 12.284495958421758 ], [ -85.599110684410562, 12.289379381453273 ], [ -85.591074999111925, 12.30010224012625 ], [ -85.586346604811922, 12.304675604795307 ], [ -85.560560064995002, 12.323124091303782 ], [ -85.522810432155723, 12.34134003291615 ], [ -85.508547735789364, 12.345525823957587 ], [ -85.497592333119655, 12.345164088751687 ], [ -85.47283932207705, 12.341210841706982 ], [ -85.443719651940341, 12.340719916191176 ], [ -85.400854051173496, 12.338885403538541 ], [ -85.329049649221929, 12.351442775763473 ], [ -85.275047776833446, 12.357437241935145 ], [ -85.234145880827725, 12.371053982255489 ], [ -85.222234462850167, 12.377487697998845 ], [ -85.163710904434652, 12.417046006867736 ], [ -85.148621384868989, 12.422962957774246 ], [ -85.137950202140075, 12.425365912107168 ], [ -85.127744107404624, 12.424125677757786 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-ES", "NAME_1": "Estelí" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -86.09951941628799, 13.047007555454286 ], [ -86.137217373183205, 12.996726386113835 ], [ -86.143702765770001, 12.970991523140242 ], [ -86.146131557625267, 12.965539659327817 ], [ -86.150575731085098, 12.96019114830284 ], [ -86.15889563722385, 12.954455064549563 ], [ -86.171582200658008, 12.950114243877238 ], [ -86.197187873321695, 12.944636542542412 ], [ -86.208944260768988, 12.940605780232545 ], [ -86.231165127168879, 12.928255113582622 ], [ -86.238890754105, 12.920968736218185 ], [ -86.242430589999685, 12.91683462202019 ], [ -86.25832109164503, 12.884485175250632 ], [ -86.263902146666737, 12.848518378220547 ], [ -86.386349453164712, 12.883296616845371 ], [ -86.419964972705316, 12.899755561070265 ], [ -86.429938524343413, 12.917299710013594 ], [ -86.430222744284208, 12.925748806462252 ], [ -86.428853318725658, 12.937298489233854 ], [ -86.406839158800096, 12.975513210066595 ], [ -86.404720425307346, 13.006906643326886 ], [ -86.411722581831668, 13.031814683101118 ], [ -86.416916063225699, 13.040418809180665 ], [ -86.427070482017143, 13.053958035135224 ], [ -86.453373785771589, 13.096668606271123 ], [ -86.471486376395148, 13.114522813576968 ], [ -86.479056972801061, 13.11824351572568 ], [ -86.491175096353572, 13.121524970101291 ], [ -86.547088995760532, 13.109949448907912 ], [ -86.613053962070694, 13.088297024188307 ], [ -86.633414475597533, 13.083878689150197 ], [ -86.645248379209306, 13.083026028428435 ], [ -86.664652880126312, 13.092327786498117 ], [ -86.680543381771656, 13.097572943836269 ], [ -86.693772549363644, 13.097831326254664 ], [ -86.703358527374121, 13.09703034147708 ], [ -86.720695969843121, 13.090234890527768 ], [ -86.732219815092378, 13.149662787407692 ], [ -86.728938360716768, 13.18084951419371 ], [ -86.726406216073997, 13.189970405110103 ], [ -86.725476040087187, 13.191158961716724 ], [ -86.714934047668123, 13.200357366998901 ], [ -86.630959846219923, 13.28296214378787 ], [ -86.612278814815454, 13.308826198869951 ], [ -86.60388139521018, 13.326396186235002 ], [ -86.562772792730186, 13.396805325105674 ], [ -86.522826911133052, 13.430446682168622 ], [ -86.496291063381875, 13.434451606056768 ], [ -86.485800746906932, 13.431221829423862 ], [ -86.471227993976697, 13.42424551042194 ], [ -86.428388230732253, 13.40437592241085 ], [ -86.386116910067301, 13.411326402091788 ], [ -86.309377408240778, 13.435459296409363 ], [ -86.25374772787535, 13.438120632261359 ], [ -86.234937507060295, 13.432203681354792 ], [ -86.230906744750428, 13.425718288767996 ], [ -86.221010708377491, 13.403755804786556 ], [ -86.212949184657134, 13.390345770940542 ], [ -86.221475796370896, 13.375256252274198 ], [ -86.227263556967557, 13.359804999301275 ], [ -86.230054084028723, 13.343035996713866 ], [ -86.230389980812959, 13.32171946877844 ], [ -86.221243252374165, 13.278828030489194 ], [ -86.235686814994494, 13.237254340015738 ], [ -86.23310299260902, 13.22477448215659 ], [ -86.236151902987899, 13.208134669879087 ], [ -86.247856615390447, 13.189143581910741 ], [ -86.241422898747771, 13.175113430440433 ], [ -86.234446580645169, 13.164571438021426 ], [ -86.159050665955476, 13.091010036883688 ], [ -86.11517737483598, 13.065662747537772 ], [ -86.09951941628799, 13.047007555454286 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-GR", "NAME_1": "Granada" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -85.851498379446639, 12.198764756888011 ], [ -85.845271369278237, 12.179489447180231 ], [ -85.843746914088797, 12.164348253469086 ], [ -85.842119107011172, 12.15672597932047 ], [ -85.836796434407916, 12.150318101099458 ], [ -85.828347337959258, 12.144297797405386 ], [ -85.812301804884385, 12.138122463181105 ], [ -85.785094163564793, 12.114971421693724 ], [ -85.731479864803873, 12.041332506190201 ], [ -85.65665239089509, 12.046474310740848 ], [ -85.522913784943228, 11.680527655227081 ], [ -85.894363980213484, 11.682052110416521 ], [ -85.926997646923837, 11.672724513925175 ], [ -85.971336026036738, 11.661484890415352 ], [ -85.976064419437364, 11.663061021548913 ], [ -85.985934618288013, 11.67303457318701 ], [ -85.989810350067557, 11.67706533549682 ], [ -85.99415117073994, 11.679752508871161 ], [ -85.999189623402401, 11.680966904798822 ], [ -86.000920783267532, 11.681044420063927 ], [ -86.003375414443781, 11.680837714488916 ], [ -86.006165940605683, 11.679132392146187 ], [ -86.009085659775337, 11.676212672976476 ], [ -86.024691942379206, 11.643320623847671 ], [ -86.03556983068313, 11.625750637381998 ], [ -86.039316372152825, 11.623166815895843 ], [ -86.067066616730983, 11.609317532478144 ], [ -86.070580614203948, 11.605777696583402 ], [ -86.07812537308746, 11.604718329387367 ], [ -86.101689825724861, 11.610816148346544 ], [ -86.119440681142521, 11.632804469850385 ], [ -86.121998664206956, 11.641847846400992 ], [ -86.123213060134617, 11.656291409021321 ], [ -86.119104784358285, 11.687193914967168 ], [ -86.109828863811003, 11.705590725531522 ], [ -86.097865769889324, 11.721842963282143 ], [ -86.09551449329922, 11.730679633358363 ], [ -86.095669522030789, 11.742410183283312 ], [ -86.099984504281451, 11.759308377079947 ], [ -86.103472663332752, 11.783906358491663 ], [ -86.09781409394526, 11.809021103840848 ], [ -86.077350226731539, 11.845530504129442 ], [ -86.072466803700024, 11.856175849335955 ], [ -86.053346523623134, 11.89772370048837 ], [ -86.043838059978441, 11.918394273277102 ], [ -86.040349900927197, 11.925887356216492 ], [ -86.004460619162217, 12.004099636389071 ], [ -85.964049648672358, 12.091381129735339 ], [ -85.967305263726928, 12.106703193297733 ], [ -86.000507372117511, 12.143806870990318 ], [ -85.91648149292655, 12.180833035216381 ], [ -85.885062222143802, 12.203157253504457 ], [ -85.876793992848491, 12.206180325461617 ], [ -85.869300909909043, 12.206051134252448 ], [ -85.851498379446639, 12.198764756888011 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "NI-MS", "NAME_1": "Masaya" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -86.000507372117511, 12.143806870990318 ], [ -85.967305263726928, 12.106703193297733 ], [ -85.964049648672358, 12.091381129735339 ], [ -86.004460619162217, 12.004099636389071 ], [ -86.040349900927197, 11.925887356216492 ], [ -86.043838059978441, 11.918394273277102 ], [ -86.053346523623134, 11.89772370048837 ], [ -86.072466803700024, 11.856175849335955 ], [ -86.081122605723635, 11.858501288403716 ], [ -86.134297654912814, 11.87403005574248 ], [ -86.136597255558854, 11.876484686918729 ], [ -86.149748907885794, 11.894364731746975 ], [ -86.179075283597456, 11.907981472067263 ], [ -86.270516729563383, 11.944232489038143 ], [ -86.281420458087666, 11.956996567737406 ], [ -86.25775265176344, 11.985521959570747 ], [ -86.230389980812959, 11.964773871516968 ], [ -86.223439501132077, 11.961621609249846 ], [ -86.211553920676863, 11.958495185404445 ], [ -86.203673265009172, 11.959218654916981 ], [ -86.194319830995369, 11.961750800459072 ], [ -86.186361660062573, 11.966014105866293 ], [ -86.180160489215211, 11.971672675253728 ], [ -86.174501918928399, 11.978235582206366 ], [ -86.163365648206081, 11.99603811356809 ], [ -86.162047898591652, 12.018310655012726 ], [ -86.164760912186352, 12.024227606818613 ], [ -86.170161099155393, 12.031720688858684 ], [ -86.184656337719787, 12.046319281109902 ], [ -86.187911952774357, 12.059057522286821 ], [ -86.127114631235202, 12.11796865522922 ], [ -86.109027879932682, 12.131275336287729 ], [ -86.080037401005256, 12.13631378805087 ], [ -86.045750087896238, 12.149956365893559 ], [ -86.028722703789754, 12.152281805860639 ], [ -86.025570440623312, 12.151894233132339 ], [ -86.023787604814117, 12.151248277086324 ], [ -86.018361579423356, 12.148328558815933 ], [ -86.000507372117511, 12.143806870990318 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/panama.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/panama.geojson new file mode 100644 index 000000000000..82a1cfadf713 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/panama.geojson @@ -0,0 +1,18 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "PA-1", "NAME_1": "Bocas del Toro" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -82.829022175999938, 9.6027224730001 ], [ -82.771092895999885, 9.579855652000091 ], [ -82.729364176999951, 9.544896546000089 ], [ -82.719726521999945, 9.541330872000032 ], [ -82.711690836999963, 9.544999899000118 ], [ -82.701458903999878, 9.53355356900002 ], [ -82.688668986999915, 9.509446513000057 ], [ -82.678049479999913, 9.497767639000088 ], [ -82.668205118999936, 9.493168437000037 ], [ -82.650712646999892, 9.487845764000085 ], [ -82.632134969999925, 9.484667663000039 ], [ -82.618854125999917, 9.486708883000077 ], [ -82.612394572999875, 9.499498800000055 ], [ -82.608208781999934, 9.537868551000088 ], [ -82.601103271999904, 9.548668925000115 ], [ -82.585884562999865, 9.546240133000055 ], [ -82.570614176999925, 9.538230285000083 ], [ -82.562836873999913, 9.53869537300011 ], [ -82.573597785999937, 9.576198635000083 ], [ -82.561879035999937, 9.56907786700009 ], [ -82.465646938999896, 9.493963934000078 ], [ -82.406605597999942, 9.435248114000046 ], [ -82.368967251999948, 9.414943752000056 ], [ -82.342762824999909, 9.432521877000056 ], [ -82.345082160999937, 9.415432033000059 ], [ -82.349598761999914, 9.402044989000046 ], [ -82.376779751999948, 9.355169989000046 ], [ -82.379465298999946, 9.343817450000074 ], [ -82.376291469999899, 9.330064195000091 ], [ -82.367787238999938, 9.320746161000045 ], [ -82.356434699999909, 9.313421942000048 ], [ -82.348133917999917, 9.305568752000056 ], [ -82.348947719999899, 9.294745184000078 ], [ -82.362456834999932, 9.284125067000048 ], [ -82.387603318999936, 9.286078192000048 ], [ -82.389963344999899, 9.27484772300005 ], [ -82.394927537999934, 9.267075914000088 ], [ -82.393666144999941, 9.262111721000053 ], [ -82.388783331999946, 9.26007721600007 ], [ -82.38304602799991, 9.261216539000088 ], [ -82.373199022999927, 9.25454336100006 ], [ -82.364491339999915, 9.242865302000041 ], [ -82.358143683999913, 9.229437567000048 ], [ -82.355824347999942, 9.216782945000091 ], [ -82.350575324999909, 9.207261460000041 ], [ -82.314808722999942, 9.185492255000042 ], [ -82.307972785999937, 9.185492255000042 ], [ -82.300445115999935, 9.197088934000078 ], [ -82.288238084999932, 9.198553778000075 ], [ -82.282460089999915, 9.202093817000048 ], [ -82.294300910999937, 9.220282294000071 ], [ -82.280995245999918, 9.216620184000078 ], [ -82.275949673999946, 9.206447658000059 ], [ -82.273060675999943, 9.194484768000052 ], [ -82.266428188999896, 9.185492255000042 ], [ -82.255482550999943, 9.182603257000039 ], [ -82.247914191999939, 9.186997789000088 ], [ -82.24445553299995, 9.19757721600007 ], [ -82.245961066999939, 9.213446356000077 ], [ -82.239084438999896, 9.213446356000077 ], [ -82.238148566999939, 9.200262762000079 ], [ -82.231068488999938, 9.193752346000053 ], [ -82.223052537999934, 9.192775783000059 ], [ -82.219227667999917, 9.196356512000079 ], [ -82.218739386999914, 9.208644924000055 ], [ -82.216867641999897, 9.217474677000041 ], [ -82.212513800999943, 9.220038153000075 ], [ -82.204945441999939, 9.213446356000077 ], [ -82.203968878999945, 9.216538804000038 ], [ -82.204009568999936, 9.219224351000037 ], [ -82.202788865999935, 9.220689195000091 ], [ -82.198109503999945, 9.220282294000071 ], [ -82.196197068999936, 9.211167710000041 ], [ -82.193430141999897, 9.204087632000039 ], [ -82.189605272999927, 9.198309637000079 ], [ -82.184437628999945, 9.192938544000071 ], [ -82.177642381999931, 9.192938544000071 ], [ -82.177642381999931, 9.199774481000077 ], [ -82.170806443999936, 9.199774481000077 ], [ -82.173451300999943, 9.184759833000044 ], [ -82.171701626999948, 9.157416083000044 ], [ -82.177642381999931, 9.14516836100006 ], [ -82.208119269999941, 9.163763739000046 ], [ -82.224110480999911, 9.169663804000038 ], [ -82.249623175999943, 9.171820380000042 ], [ -82.260731574999909, 9.164048570000091 ], [ -82.263783331999946, 9.146551825000074 ], [ -82.260731574999909, 9.127875067000048 ], [ -82.253407355999911, 9.116603908000059 ], [ -82.253407355999911, 9.110419012000079 ], [ -82.258941209999932, 9.11273834800005 ], [ -82.273833787999934, 9.116603908000059 ], [ -82.268462693999936, 9.102362372000073 ], [ -82.244536912999934, 9.089911200000074 ], [ -82.239084438999896, 9.079331773000092 ], [ -82.245961066999939, 9.014146226000037 ], [ -82.250477667999917, 9.015204169000071 ], [ -82.253488735999952, 9.016302802000041 ], [ -82.256214972999942, 9.017971096000053 ], [ -82.260161912999934, 9.020982164000088 ], [ -82.243031378999945, 9.004461981000077 ], [ -82.218820766999897, 8.993353583000044 ], [ -82.194691535999937, 8.99095286700009 ], [ -82.177642381999931, 9.000555731000077 ], [ -82.141753709999932, 8.988959052000041 ], [ -82.129017706999946, 8.981390692000048 ], [ -82.12922115799995, 8.973211981000077 ], [ -82.114409959999932, 8.950751044000071 ], [ -82.109364386999914, 8.945298570000091 ], [ -82.107004360999952, 8.941880601000037 ], [ -82.105376756999931, 8.935207424000055 ], [ -82.101918097999942, 8.931626695000091 ], [ -82.097808397999927, 8.930609442000048 ], [ -82.086659308999913, 8.931708075000074 ], [ -82.067616339999915, 8.930731512000079 ], [ -82.020008917999917, 8.945298570000091 ], [ -82.006746764256462, 8.946581223250567 ], [ -82.006771817365461, 8.946508490274596 ], [ -82.008373786021366, 8.941857612139074 ], [ -82.015892707382534, 8.919378363320789 ], [ -82.034625413831748, 8.908112901389302 ], [ -82.06087704074281, 8.90248017042353 ], [ -82.10214067285375, 8.90248017042353 ], [ -82.132138841234507, 8.900619819349174 ], [ -82.150871547683778, 8.891240546014387 ], [ -82.16399736158894, 8.870621650069097 ], [ -82.169630092554712, 8.848116562829091 ], [ -82.179009365889499, 8.844370022258715 ], [ -82.186502447929627, 8.855609645768538 ], [ -82.192135178895398, 8.88186127447824 ], [ -82.195881721264413, 8.891240546014387 ], [ -82.209007534270256, 8.898733628953778 ], [ -82.210893723766333, 8.917492173824769 ], [ -82.199628261834789, 8.92498525586484 ], [ -82.195881721264413, 8.941883450560795 ], [ -82.201514452230185, 8.954983425144917 ], [ -82.225879889645171, 8.969995429445476 ], [ -82.26151078989102, 8.977488512384923 ], [ -82.272750414300162, 8.98686778392107 ], [ -82.280269334761954, 8.998107408330213 ], [ -82.300888230707244, 9.001879788221629 ], [ -82.321507127551854, 9.009372870261757 ], [ -82.32339331704793, 9.024359036140595 ], [ -82.317760586082159, 9.039371039541834 ], [ -82.30274858268092, 9.050610663051657 ], [ -82.289648607197421, 9.067483018426572 ], [ -82.280269334761954, 9.080608832331734 ], [ -82.287762416802082, 9.08438121222315 ], [ -82.308381313646692, 9.091874294263278 ], [ -82.315874395686819, 9.099367377202668 ], [ -82.310267504042088, 9.114379381503227 ], [ -82.314014044612463, 9.12561900501305 ], [ -82.32339331704793, 9.127505195408446 ], [ -82.338379482926769, 9.112493191107887 ], [ -82.351505296831988, 9.086241563297506 ], [ -82.353391486328007, 9.061876125882463 ], [ -82.379643114138389, 9.039371039541834 ], [ -82.392768928043552, 9.026245224737295 ], [ -82.426513637894061, 9.013119411731452 ], [ -82.439639451799223, 8.99999359782629 ], [ -82.4283998282894, 8.988753974316467 ], [ -82.407755093023127, 8.981235052955299 ], [ -82.370263840803602, 8.968109239050136 ], [ -82.347758755362236, 8.949376531701546 ], [ -82.334632940557753, 8.92498525586484 ], [ -82.330886399987378, 8.90436635991955 ], [ -82.338379482926769, 8.889354356518311 ], [ -82.347758755362236, 8.857495836163878 ], [ -82.355251838301683, 8.827497666883801 ], [ -82.362951625916764, 8.808790797956931 ], [ -82.44594397723273, 8.846514594173186 ], [ -82.492271897729893, 8.861268215155974 ], [ -82.529711473105976, 8.86297353839808 ], [ -82.540770230361829, 8.884780991849254 ], [ -82.551622281143352, 8.893695177190637 ], [ -82.567693650841306, 8.899741319306429 ], [ -82.624951138284416, 8.902790228785989 ], [ -82.692750617247157, 8.894315293915668 ], [ -82.714532233175987, 8.916200263531323 ], [ -82.720156710164019, 8.92023775007209 ], [ -82.719364786999847, 8.921523743000108 ], [ -82.72334387199993, 8.930928854000072 ], [ -82.749130411999914, 8.974078674000097 ], [ -82.762695475999919, 8.98299285900012 ], [ -82.80817073599988, 8.9983665970001 ], [ -82.854085246999944, 9.031982117000041 ], [ -82.876564494999855, 9.041929830000129 ], [ -82.882429769999931, 9.04534047500006 ], [ -82.88687394299987, 9.051489970000119 ], [ -82.889690307999928, 9.059370626000074 ], [ -82.893281819999885, 9.066941224000033 ], [ -82.900232299999885, 9.072057190000109 ], [ -82.90945654399988, 9.072005514000097 ], [ -82.939377197999931, 9.059577332000032 ], [ -82.93952108499991, 9.070641889000072 ], [ -82.941650960999937, 9.234424540000134 ], [ -82.94320125399986, 9.354313863000101 ], [ -82.944286458999869, 9.437151185000118 ], [ -82.941702636999935, 9.45634897900004 ], [ -82.933305216999969, 9.470327454000127 ], [ -82.914624186999902, 9.476864522000099 ], [ -82.861294108999914, 9.484099223000072 ], [ -82.846385457999958, 9.492548320000068 ], [ -82.844783488999923, 9.500687358000079 ], [ -82.849382690999875, 9.503477885000038 ], [ -82.855919758999846, 9.505441590000075 ], [ -82.860208902999915, 9.511203512000037 ], [ -82.867133544999888, 9.538643697000097 ], [ -82.879251668999899, 9.55990854900007 ], [ -82.877391316999876, 9.569184469000092 ], [ -82.866048340999896, 9.585074972000101 ], [ -82.847470662999854, 9.600655416000052 ], [ -82.829022175999938, 9.6027224730001 ] ] ], [ [ [ -82.123036261999914, 9.322658596000053 ], [ -82.097727016999897, 9.31118398600006 ], [ -82.085275844999899, 9.302679755000042 ], [ -82.074615037999934, 9.28851959800005 ], [ -82.09398352799991, 9.291245835000041 ], [ -82.114165818999936, 9.283270575000074 ], [ -82.130197719999899, 9.268255927000041 ], [ -82.138824022999927, 9.245306708000044 ], [ -82.143625454999949, 9.247137762000079 ], [ -82.154408331999946, 9.258368231000077 ], [ -82.153960740999935, 9.259182033000059 ], [ -82.151722785999937, 9.259914455000057 ], [ -82.150298631999931, 9.264349677000041 ], [ -82.150257941999939, 9.287258205000057 ], [ -82.154042120999918, 9.296291408000059 ], [ -82.163970506999931, 9.30219147300005 ], [ -82.163970506999931, 9.308417059000078 ], [ -82.150298631999931, 9.30219147300005 ], [ -82.159331834999932, 9.323146877000056 ], [ -82.174305792999917, 9.33038971600007 ], [ -82.192616339999915, 9.333889065000051 ], [ -82.211781378999945, 9.343166408000059 ], [ -82.211781378999945, 9.349351304000038 ], [ -82.206166144999941, 9.354193427000041 ], [ -82.200998501999948, 9.35618724200009 ], [ -82.196034308999913, 9.354803778000075 ], [ -82.191314256999931, 9.349351304000038 ], [ -82.182484503999945, 9.345851955000057 ], [ -82.174387173999946, 9.34406159100007 ], [ -82.166005011999914, 9.344956773000092 ], [ -82.15656490799995, 9.349351304000038 ], [ -82.14671790299991, 9.344631252000056 ], [ -82.123036261999914, 9.322658596000053 ] ] ], [ [ [ -82.328480597999942, 9.412054755000042 ], [ -82.301665818999936, 9.432318427000041 ], [ -82.285511847999942, 9.438869533000059 ], [ -82.266428188999896, 9.439357815000051 ], [ -82.238758917999917, 9.39874909100007 ], [ -82.231800910999937, 9.37335846600007 ], [ -82.245961066999939, 9.356838283000059 ], [ -82.245961066999939, 9.349351304000038 ], [ -82.241566535999937, 9.344549872000073 ], [ -82.240142381999931, 9.341945705000057 ], [ -82.241688605999911, 9.338080145000049 ], [ -82.245961066999939, 9.330064195000091 ], [ -82.259673631999931, 9.353176174000055 ], [ -82.280751105999911, 9.374701239000046 ], [ -82.328480597999942, 9.412054755000042 ] ] ], [ [ [ -82.04723834999993, 9.172568781000052 ], [ -82.052409657999931, 9.177661002000093 ], [ -82.051840272999925, 9.182192803000078 ], [ -82.045522753999933, 9.179368136000051 ], [ -82.04149825099995, 9.173142195000082 ], [ -82.035755631999905, 9.169750291000071 ], [ -82.028866885999946, 9.169192132000092 ], [ -82.025414816999898, 9.160700151000071 ], [ -82.023113219999914, 9.153905700000053 ], [ -82.016223891999914, 9.15108183600006 ], [ -82.008760620999908, 9.147692229000086 ], [ -82.010477109999897, 9.141459268000062 ], [ -82.019655841999906, 9.137482707000061 ], [ -82.02711256799995, 9.13294146700008 ], [ -82.032853613999919, 9.134633315000087 ], [ -82.042043214999921, 9.140852517000042 ], [ -82.050083914999902, 9.145940624000048 ], [ -82.055257578999942, 9.153864964000093 ], [ -82.054690857999901, 9.16179681400007 ], [ -82.04723834999993, 9.172568781000052 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PA-4", "NAME_1": "Chiriquí" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -82.989193277999874, 8.264457907000093 ], [ -82.995523640999892, 8.264819641000088 ], [ -83.001104695999885, 8.269237976000085 ], [ -83.010768188999918, 8.283371480000127 ], [ -83.016065023999943, 8.289004211000062 ], [ -83.044073649999859, 8.305359803000101 ], [ -83.053246216999952, 8.315100810000047 ], [ -83.052109334999869, 8.327632345000055 ], [ -83.043298502999875, 8.334737854000082 ], [ -82.997771565999898, 8.360162659000096 ], [ -82.953510701999875, 8.402098084000087 ], [ -82.924778604999858, 8.41674835200007 ], [ -82.896511596999886, 8.425352478000107 ], [ -82.870414998999877, 8.438116557000072 ], [ -82.848297485999865, 8.46516916900012 ], [ -82.838918213999932, 8.494624736000034 ], [ -82.835972656999928, 8.52976471000008 ], [ -82.841863769999918, 8.599476217000117 ], [ -82.849796102999875, 8.629861959000067 ], [ -82.862224284999854, 8.655700176000096 ], [ -82.878941609999913, 8.679057923000045 ], [ -82.910335042999918, 8.713913676000104 ], [ -82.919223388999939, 8.72706532800008 ], [ -82.924158488999893, 8.741198832000123 ], [ -82.92296992999988, 8.756159160000081 ], [ -82.914882568999957, 8.764789124000032 ], [ -82.885116943999975, 8.78318593400013 ], [ -82.875789347999842, 8.793908793000043 ], [ -82.875634318999914, 8.807525533000046 ], [ -82.883566650999853, 8.812383118000071 ], [ -82.888320882999949, 8.816930644000095 ], [ -82.8785798749999, 8.829772238000089 ], [ -82.866926839999934, 8.838066304000051 ], [ -82.763780679999911, 8.879950053000115 ], [ -82.733860025999974, 8.897985128000116 ], [ -82.720156710164019, 8.92023775007209 ], [ -82.714532233175987, 8.916200263531323 ], [ -82.692750617247157, 8.894315293915668 ], [ -82.624951138284416, 8.902790228785989 ], [ -82.567693650841306, 8.899741319306429 ], [ -82.551622281143352, 8.893695177190637 ], [ -82.540770230361829, 8.884780991849254 ], [ -82.529711473105976, 8.86297353839808 ], [ -82.492271897729893, 8.861268215155974 ], [ -82.44594397723273, 8.846514594173186 ], [ -82.362951625916764, 8.808790797956931 ], [ -82.36114295078653, 8.807963974757627 ], [ -82.317786423604559, 8.791117458703752 ], [ -82.299777187567145, 8.782125758996585 ], [ -82.281690437163945, 8.777009792867659 ], [ -82.250865444684507, 8.772281399466976 ], [ -82.223502773734026, 8.768948269147302 ], [ -82.218076748343265, 8.770343533127516 ], [ -82.203994920928835, 8.772436428198603 ], [ -82.196165941205209, 8.771583767476898 ], [ -82.154850633150204, 8.762592067769674 ], [ -82.153222826072522, 8.762617906191394 ], [ -82.139631924173955, 8.703732612569979 ], [ -82.149011196609422, 8.61937083569552 ], [ -82.15650427864955, 8.589811916886447 ], [ -82.152757738079117, 8.568727932048432 ], [ -82.142913377650245, 8.557255764541878 ], [ -82.175262824419804, 8.482479967476479 ], [ -82.180172084973719, 8.457881985165443 ], [ -82.16399736158894, 8.448735255827387 ], [ -82.132836473224643, 8.449200343820792 ], [ -82.10025448335773, 8.458114529162174 ], [ -82.083718023867675, 8.464341539330576 ], [ -82.074002854648029, 8.467493800698321 ], [ -82.064494391902656, 8.46149933542597 ], [ -82.053383958702739, 8.44684906723063 ], [ -82.036744147324498, 8.418039456355814 ], [ -82.021499599926585, 8.401864732071715 ], [ -82.01775305935621, 8.370910549282428 ], [ -81.99713416161228, 8.339982204914804 ], [ -81.949100917873068, 8.327786566996451 ], [ -81.856496751923544, 8.326856391009642 ], [ -81.830012580116488, 8.318407294560984 ], [ -81.813372768738247, 8.287478949294041 ], [ -81.784304776344356, 8.264043686966545 ], [ -81.732059903141987, 8.262157498369845 ], [ -81.715885178857889, 8.278099676858574 ], [ -81.704619716926402, 8.294997869755889 ], [ -81.689633551946827, 8.296858221729565 ], [ -81.680486822608771, 8.277376207346094 ], [ -81.655888841197054, 8.281846218328326 ], [ -81.633616298853099, 8.297090765726239 ], [ -81.624004483320221, 8.313730577104423 ], [ -81.609793463797303, 8.347811183739111 ], [ -81.592120123644747, 8.371866562791638 ], [ -81.547833422274607, 8.385690008686936 ], [ -81.522486132029371, 8.379333808208685 ], [ -81.51933386886293, 8.341739203201655 ], [ -81.513210212381409, 8.310707506046526 ], [ -81.510471361264308, 8.281226100703975 ], [ -81.513106858694584, 8.251047065169928 ], [ -81.51550981302745, 8.246086126873251 ], [ -81.517137621004395, 8.243760687805491 ], [ -81.522951219123456, 8.239032294404865 ], [ -81.573180711620523, 8.176116238473639 ], [ -81.597907884241465, 8.152060859421113 ], [ -81.601886969707891, 8.145058701997471 ], [ -81.606124436693392, 8.134904283206083 ], [ -81.631755947778743, 8.034987901470458 ], [ -81.633771327584668, 8.022714749186321 ], [ -81.638008796368865, 8.011242580780447 ], [ -81.64247880735104, 8.0030001899068 ], [ -81.662555100937141, 7.99765167888188 ], [ -81.663574609280772, 7.997287569465755 ], [ -81.670521613999938, 8.006781317000048 ], [ -81.684803839999915, 8.044623114000046 ], [ -81.691029425999943, 8.054632880000042 ], [ -81.697132941999939, 8.039129950000074 ], [ -81.698353644999941, 8.031032619000086 ], [ -81.697865363999938, 8.021063544000071 ], [ -81.708363410999937, 8.031317450000074 ], [ -81.708526170999903, 8.045843817000048 ], [ -81.710357225999928, 8.059841213000084 ], [ -81.725738084999932, 8.068264065000051 ], [ -81.725738084999932, 8.07571035400008 ], [ -81.717274542999917, 8.070827541000085 ], [ -81.709462042999917, 8.068630276000079 ], [ -81.702870245999918, 8.069973049000055 ], [ -81.697865363999938, 8.07571035400008 ], [ -81.691029425999943, 8.07571035400008 ], [ -81.687611456999946, 8.072780666000085 ], [ -81.685414191999939, 8.071600653000075 ], [ -81.677357550999943, 8.068264065000051 ], [ -81.711455857999908, 8.13031647300005 ], [ -81.733550584999932, 8.15766022300005 ], [ -81.743438279999907, 8.173163153000075 ], [ -81.746245897999927, 8.191799221000053 ], [ -81.752471482999908, 8.191799221000053 ], [ -81.758208787999934, 8.180609442000048 ], [ -81.760650193999936, 8.169582424000055 ], [ -81.757476365999935, 8.161159572000088 ], [ -81.746245897999927, 8.15766022300005 ], [ -81.752430792999917, 8.148993231000077 ], [ -81.767486131999931, 8.132757880000042 ], [ -81.774199998999904, 8.123480536000045 ], [ -81.780384894999941, 8.123480536000045 ], [ -81.798329230999911, 8.137111721000053 ], [ -81.876576300999943, 8.167873440000051 ], [ -81.885365363999938, 8.17328522300005 ], [ -81.927032029999907, 8.183172919000071 ], [ -81.941151495999918, 8.184963283000059 ], [ -81.95181230399993, 8.191433010000083 ], [ -81.947865363999938, 8.206244208000044 ], [ -81.931182420999903, 8.233343817000048 ], [ -81.943267381999931, 8.229641018000052 ], [ -81.956695115999935, 8.22101471600007 ], [ -81.967640753999945, 8.209051825000074 ], [ -81.972198045999903, 8.195502020000049 ], [ -81.978382941999939, 8.192531643000052 ], [ -81.992176886999914, 8.201117255000042 ], [ -82.013172980999911, 8.21906159100007 ], [ -82.027862107999908, 8.208278713000084 ], [ -82.060292120999918, 8.210272528000075 ], [ -82.093129035999937, 8.220363674000055 ], [ -82.109364386999914, 8.233343817000048 ], [ -82.115589972999942, 8.233343817000048 ], [ -82.117298956999946, 8.21515534100007 ], [ -82.142404751999948, 8.160060940000051 ], [ -82.144561326999906, 8.161891994000086 ], [ -82.148915167999917, 8.164089260000083 ], [ -82.150298631999931, 8.164496161000045 ], [ -82.150298631999931, 8.15766022300005 ], [ -82.156524217999902, 8.15766022300005 ], [ -82.147206183999913, 8.180934963000084 ], [ -82.147572394999941, 8.188299872000073 ], [ -82.156524217999902, 8.184963283000059 ], [ -82.155384894999941, 8.193182684000078 ], [ -82.153797980999911, 8.199286200000074 ], [ -82.150380011999914, 8.203314520000049 ], [ -82.143462693999936, 8.20538971600007 ], [ -82.143462693999936, 8.212917385000083 ], [ -82.15689042899993, 8.211737372000073 ], [ -82.174102342999902, 8.201727606000077 ], [ -82.187896287999934, 8.199245510000083 ], [ -82.196522589999915, 8.202175197000088 ], [ -82.209258592999902, 8.215521552000041 ], [ -82.219227667999917, 8.21906159100007 ], [ -82.219227667999917, 8.225897528000075 ], [ -82.214100714999915, 8.227443752000056 ], [ -82.209584113999938, 8.231146552000041 ], [ -82.204945441999939, 8.233343817000048 ], [ -82.216542120999918, 8.264227606000077 ], [ -82.217559373999904, 8.278225002000056 ], [ -82.211781378999945, 8.287990627000056 ], [ -82.211781378999945, 8.294826565000051 ], [ -82.217640753999945, 8.299343166000085 ], [ -82.218780076999906, 8.304348049000055 ], [ -82.216420050999943, 8.309759833000044 ], [ -82.211781378999945, 8.315252997000073 ], [ -82.210601365999935, 8.312648830000057 ], [ -82.210845506999931, 8.309881903000075 ], [ -82.209828253999945, 8.30805084800005 ], [ -82.204945441999939, 8.308498440000051 ], [ -82.209828253999945, 8.321844794000071 ], [ -82.208648240999935, 8.332098700000074 ], [ -82.200550910999937, 8.33930084800005 ], [ -82.184437628999945, 8.34320709800005 ], [ -82.207875128999945, 8.343939520000049 ], [ -82.220122850999928, 8.342962958000044 ], [ -82.225453253999945, 8.339504299000055 ], [ -82.241444464999915, 8.306708075000074 ], [ -82.242461717999902, 8.301052151000079 ], [ -82.26195227799991, 8.302801825000074 ], [ -82.277088995999918, 8.309271552000041 ], [ -82.284413214999915, 8.322211005000042 ], [ -82.280059373999904, 8.34320709800005 ], [ -82.296498175999943, 8.336208401000079 ], [ -82.313954230999911, 8.330837307000081 ], [ -82.331654425999943, 8.329779364000046 ], [ -82.348907029999907, 8.335760809000078 ], [ -82.347075975999928, 8.329169012000079 ], [ -82.344960089999915, 8.315008856000077 ], [ -82.342762824999909, 8.308498440000051 ], [ -82.358672654999907, 8.30609772300005 ], [ -82.387196417999917, 8.291449286000045 ], [ -82.400135870999918, 8.287990627000056 ], [ -82.418934699999909, 8.293036200000074 ], [ -82.433257615999935, 8.304348049000055 ], [ -82.435332811999899, 8.316107489000046 ], [ -82.417225714999915, 8.322780666000085 ], [ -82.417225714999915, 8.328924872000073 ], [ -82.425689256999931, 8.332302151000079 ], [ -82.430287238999938, 8.338161526000079 ], [ -82.431752081999946, 8.346218166000085 ], [ -82.430897589999915, 8.356268622000073 ], [ -82.441029425999943, 8.348700262000079 ], [ -82.442616339999915, 8.336330471000053 ], [ -82.447010870999918, 8.323553778000075 ], [ -82.465606248999904, 8.315252997000073 ], [ -82.465606248999904, 8.308498440000051 ], [ -82.461415167999917, 8.302923895000049 ], [ -82.457427537999934, 8.296047268000052 ], [ -82.4541316399999, 8.28851959800005 ], [ -82.452015753999945, 8.281154690000051 ], [ -82.470855272999927, 8.277126369000086 ], [ -82.477772589999915, 8.277411200000074 ], [ -82.486114061999899, 8.281154690000051 ], [ -82.511708136999914, 8.276434637000079 ], [ -82.552642381999931, 8.287380276000079 ], [ -82.622670050999943, 8.315252997000073 ], [ -82.658924933999913, 8.322780666000085 ], [ -82.698597785999937, 8.322821356000077 ], [ -82.738026495999918, 8.317450262000079 ], [ -82.808705206999946, 8.295681057000081 ], [ -82.839019334999932, 8.278509833000044 ], [ -82.862456834999932, 8.254055080000057 ], [ -82.87718665299991, 8.21906159100007 ], [ -82.879872199999909, 8.177883205000057 ], [ -82.872832811999899, 8.135891018000052 ], [ -82.849232550999943, 8.068264065000051 ], [ -82.849232550999943, 8.06203847900008 ], [ -82.862090623999904, 8.048895575000074 ], [ -82.8681941399999, 8.032375393000052 ], [ -82.876942511999914, 8.023871161000045 ], [ -82.897629258999899, 8.034748020000023 ], [ -82.891369791999892, 8.057545471000068 ], [ -82.886408854999928, 8.102193909000093 ], [ -82.939092977999849, 8.216838074000052 ], [ -82.943666341999887, 8.248567403000067 ], [ -82.95051346899993, 8.258825175000055 ], [ -82.968005940999888, 8.267971904000134 ], [ -82.977126830999879, 8.269237976000085 ], [ -82.989193277999874, 8.264457907000093 ] ] ], [ [ [ -82.211781378999945, 8.199204820000091 ], [ -82.233021613999938, 8.205308335000041 ], [ -82.247059699999909, 8.206732489000046 ], [ -82.253407355999911, 8.202337958000044 ], [ -82.253325975999928, 8.193264065000051 ], [ -82.25259355399993, 8.188381252000056 ], [ -82.245961066999939, 8.171291408000059 ], [ -82.273833787999934, 8.191799221000053 ], [ -82.281361456999946, 8.193548895000049 ], [ -82.301380988999938, 8.196112372000073 ], [ -82.307972785999937, 8.199204820000091 ], [ -82.315663214999915, 8.214911200000074 ], [ -82.306467251999948, 8.22406647300005 ], [ -82.273833787999934, 8.233343817000048 ], [ -82.259592251999948, 8.227036851000037 ], [ -82.238880988999938, 8.220648505000042 ], [ -82.220122850999928, 8.212062893000052 ], [ -82.211781378999945, 8.199204820000091 ] ] ], [ [ [ -82.342762824999909, 8.259995835000041 ], [ -82.314808722999942, 8.240179755000042 ], [ -82.334868943999936, 8.23509349200009 ], [ -82.369699673999946, 8.216864325000074 ], [ -82.386463995999918, 8.212876695000091 ], [ -82.398345506999931, 8.21820709800005 ], [ -82.412505662999934, 8.231024481000077 ], [ -82.424712693999936, 8.246568101000037 ], [ -82.430897589999915, 8.259995835000041 ], [ -82.424672003999945, 8.259995835000041 ], [ -82.401926235999952, 8.257147528000075 ], [ -82.350005662999934, 8.293646552000041 ], [ -82.328480597999942, 8.287990627000056 ], [ -82.316517706999946, 8.277329820000091 ], [ -82.317209438999896, 8.267564195000091 ], [ -82.327056443999936, 8.262884833000044 ], [ -82.342762824999909, 8.267523505000042 ], [ -82.342762824999909, 8.259995835000041 ] ] ], [ [ [ -82.362049933999913, 8.086859442000048 ], [ -82.359242316999939, 8.099025783000059 ], [ -82.352447068999936, 8.11204661700009 ], [ -82.343129035999937, 8.12335846600007 ], [ -82.33234615799995, 8.129706122000073 ], [ -82.320708787999934, 8.13031647300005 ], [ -82.318348761999914, 8.123968817000048 ], [ -82.319447394999941, 8.113104559000078 ], [ -82.318226691999939, 8.09992096600007 ], [ -82.336537238999938, 8.091864325000074 ], [ -82.347482876999948, 8.088283596000053 ], [ -82.362049933999913, 8.086859442000048 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PA-KY", "NAME_1": "Kuna Yala" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.373524542999917, 8.664740302000041 ], [ -77.374936483999932, 8.6509459440001 ], [ -77.385375121999857, 8.643633728000111 ], [ -77.401549845999853, 8.642031759000076 ], [ -77.417672892999946, 8.638466085000104 ], [ -77.434002644999879, 8.628259989000043 ], [ -77.435036173999947, 8.620637716000061 ], [ -77.430230264999949, 8.610457459000102 ], [ -77.429093384999931, 8.592629090000059 ], [ -77.441133992999909, 8.567669372000069 ], [ -77.46937330143669, 8.537811606220657 ], [ -77.469787766592162, 8.538316352517654 ], [ -77.495884365670918, 8.570097358506302 ], [ -77.508415900373507, 8.573740546289173 ], [ -77.546268886899611, 8.590096136827242 ], [ -77.558929612811369, 8.606477565787031 ], [ -77.568799810762641, 8.639912218174288 ], [ -77.579160936028359, 8.654820867888702 ], [ -77.609779222033467, 8.684224757966206 ], [ -77.626160650993256, 8.70662649241865 ], [ -77.653600837208842, 8.730526841840287 ], [ -77.678767259401468, 8.748768621874376 ], [ -77.68613115113169, 8.757915351212489 ], [ -77.691583014944172, 8.766855374076215 ], [ -77.692513190031661, 8.772410589776882 ], [ -77.694838629998742, 8.786079006041291 ], [ -77.701143155432248, 8.800290025564209 ], [ -77.712408617363792, 8.813855089041112 ], [ -77.752044439699091, 8.850106106011992 ], [ -77.76418840167338, 8.859097804819839 ], [ -77.779226244395659, 8.866539210915846 ], [ -77.806718105656046, 8.885711167836121 ], [ -77.823667976296065, 8.893385117928858 ], [ -77.833693202978907, 8.90036143603146 ], [ -77.840359462718993, 8.911316840499751 ], [ -77.84648312009989, 8.924261786352361 ], [ -77.856663378212318, 8.941263332936444 ], [ -77.911905484050862, 8.996970526768393 ], [ -77.94208451958491, 9.020715847458405 ], [ -78.015335863259452, 9.073244941500832 ], [ -78.042543504579044, 9.073244941500832 ], [ -78.06504859091973, 9.107842312073046 ], [ -78.072386644228231, 9.112803250369723 ], [ -78.083290370953819, 9.118694362854569 ], [ -78.152330085165261, 9.134998277448517 ], [ -78.158841315274458, 9.139959214845874 ], [ -78.160805020035639, 9.145385240236635 ], [ -78.150469733191642, 9.161224066837178 ], [ -78.145818854156801, 9.172773748709517 ], [ -78.150831468397541, 9.194271144697552 ], [ -78.158686285643569, 9.203030300408045 ], [ -78.165610927802049, 9.205665797838265 ], [ -78.169564174846755, 9.202255154052125 ], [ -78.171347011555326, 9.197681790282388 ], [ -78.174034186728306, 9.192720851985712 ], [ -78.178400844923033, 9.190085354555436 ], [ -78.186694911740744, 9.189387722565357 ], [ -78.209122483715646, 9.192720851985712 ], [ -78.234650642013492, 9.193108424714012 ], [ -78.257000698723232, 9.190860500911356 ], [ -78.26472632476009, 9.196053982305443 ], [ -78.270772467775146, 9.204890652381664 ], [ -78.280435961050728, 9.231581528864467 ], [ -78.284854296088895, 9.248583075448551 ], [ -78.289091763074396, 9.255714423182098 ], [ -78.295602993183593, 9.257342231159043 ], [ -78.331208055007721, 9.239978949369004 ], [ -78.339011197208947, 9.237498481569673 ], [ -78.346917691298415, 9.238015245507142 ], [ -78.36606380889765, 9.241761786077575 ], [ -78.394873419772466, 9.240599066993354 ], [ -78.408748541611885, 9.243622138051194 ], [ -78.414303758211872, 9.247885444357735 ], [ -78.416835903753963, 9.254784247195232 ], [ -78.415776536557928, 9.261915594928723 ], [ -78.416525845391448, 9.269537869077396 ], [ -78.419703946080233, 9.278917141512864 ], [ -78.424742397843374, 9.287443752327306 ], [ -78.430323451965705, 9.291939601731201 ], [ -78.437739019640048, 9.294600938482517 ], [ -78.441718106005794, 9.298399155896334 ], [ -78.445257941001159, 9.304445298911389 ], [ -78.448952805627471, 9.312196764269231 ], [ -78.457686122916243, 9.320413315821838 ], [ -78.465075853068129, 9.321033433446189 ], [ -78.472000495226666, 9.317235216032373 ], [ -78.479493578166057, 9.311344101748887 ], [ -78.486418220324595, 9.30870860431861 ], [ -78.490759040097601, 9.311654161010722 ], [ -78.495099859870606, 9.328888250692216 ], [ -78.500189989376508, 9.337957464765168 ], [ -78.512876552810667, 9.349688014690116 ], [ -78.521816575674393, 9.351238308301276 ], [ -78.52835364510463, 9.347956854824986 ], [ -78.537164475859868, 9.335011908073113 ], [ -78.542047898891383, 9.331368720290186 ], [ -78.594525316090426, 9.319173082371833 ], [ -78.610079921850911, 9.317777818391619 ], [ -78.627701586059345, 9.321421007073809 ], [ -78.641783412574398, 9.330206000306646 ], [ -78.677052577614347, 9.357051907319658 ], [ -78.698860032864218, 9.370772000427451 ], [ -78.709712083645741, 9.374182644213647 ], [ -78.714879726618051, 9.371237087521536 ], [ -78.716998461010178, 9.353796292265088 ], [ -78.721003383998948, 9.34702667883812 ], [ -78.72818640767656, 9.34454621013947 ], [ -78.741751472052783, 9.350773220307872 ], [ -78.758778856159267, 9.368601589191996 ], [ -78.765419278376953, 9.371547145884051 ], [ -78.77058692134932, 9.371469631518266 ], [ -78.777795783448653, 9.370616969897242 ], [ -78.781645676806534, 9.368214016463696 ], [ -78.787485114246635, 9.363408107797909 ], [ -78.795908373172892, 9.358679714397283 ], [ -78.808982510234671, 9.356741848057823 ], [ -78.839988368968022, 9.361082667830829 ], [ -78.857041592395547, 9.360927639099259 ], [ -78.87135596380665, 9.359377346387419 ], [ -78.878306444386908, 9.355734157705228 ], [ -78.890786302246056, 9.344468695773685 ], [ -78.900113897838082, 9.341213079819738 ], [ -78.915358446135372, 9.341058051088169 ], [ -78.92633968812612, 9.345243842129605 ], [ -78.932773403869476, 9.346329046848041 ], [ -78.937165899586603, 9.34454621013947 ], [ -78.937941046841843, 9.340282903832929 ], [ -78.937656826001728, 9.333384100995431 ], [ -78.939413825187842, 9.327803045973781 ], [ -78.945666672878644, 9.324676622128379 ], [ -78.956131150931867, 9.328035589970511 ], [ -78.964657761746309, 9.328888250692216 ], [ -78.97274512388833, 9.327725530708676 ], [ -78.997084723780972, 9.317157700767268 ], [ -79.002820808433569, 9.312661851363316 ], [ -79.005637173017135, 9.30638316525085 ], [ -79.004164394671079, 9.299949449507494 ], [ -79.000650397198058, 9.294135850489113 ], [ -78.998169929398728, 9.288373928314115 ], [ -78.998169929398728, 9.284188137272679 ], [ -79.002200689909898, 9.280467434224704 ], [ -79.011140712773681, 9.277599391898377 ], [ -79.056796840601692, 9.276359158448372 ], [ -79.07180884490225, 9.277366847901703 ], [ -79.078242560645663, 9.282250270933218 ], [ -79.085038010695598, 9.289769192294386 ], [ -79.093642136775202, 9.297546495174572 ], [ -79.115372076759911, 9.306305649985745 ], [ -79.12865292029602, 9.30909617794623 ], [ -79.143303189390679, 9.310103868298881 ], [ -79.156713223236636, 9.309871324302151 ], [ -79.170536669131934, 9.307778429231121 ], [ -79.239162971294093, 9.286436061974655 ], [ -79.27205502042284, 9.279537258237838 ], [ -79.280064867299757, 9.286513577239759 ], [ -79.281046719230687, 9.293024807348957 ], [ -79.279031337626122, 9.303360094192954 ], [ -79.272494269994525, 9.314289659340318 ], [ -79.266112230195233, 9.321576035805379 ], [ -79.246991950118399, 9.330748603565212 ], [ -79.243477952645378, 9.320568346352104 ], [ -79.239318000025662, 9.320490831087 ], [ -79.220352748680398, 9.335554511331623 ], [ -79.192680020266721, 9.352685248225612 ], [ -79.176246913564171, 9.360152492743339 ], [ -79.157074958442536, 9.366586209386014 ], [ -79.148083258735369, 9.372012233877456 ], [ -79.142062954142034, 9.377851671317558 ], [ -79.139143235871643, 9.38351023980573 ], [ -79.137282883897967, 9.389943956448406 ], [ -79.135577561555181, 9.405524399731235 ], [ -79.132218593713105, 9.415239569850257 ], [ -79.120875617415777, 9.431517646022542 ], [ -79.11263322564281, 9.439449978533673 ], [ -79.102220425332348, 9.445883694277029 ], [ -79.095502488748821, 9.447744045351385 ], [ -79.087001716356099, 9.448751735704036 ], [ -79.078914354214078, 9.450999661305332 ], [ -79.074986944691716, 9.457278347417798 ], [ -79.074547696019351, 9.541278388187038 ], [ -79.074532601798481, 9.562041560085573 ], [ -79.048455651999916, 9.564218877000087 ], [ -79.012902007999912, 9.570225582000091 ], [ -78.970582971999931, 9.573313287000076 ], [ -78.957311407999953, 9.565283566000062 ], [ -78.957362509999939, 9.554032607000067 ], [ -78.97451246299994, 9.544735453000044 ], [ -78.986858370999926, 9.547135568000044 ], [ -78.996871111999951, 9.539680668000074 ], [ -79.007806002999928, 9.538792274000059 ], [ -79.038230630999919, 9.535170273000062 ], [ -79.054873438999948, 9.531958770000074 ], [ -79.065858829999911, 9.513720207000063 ], [ -79.063152069999944, 9.49029209400004 ], [ -79.058060022999939, 9.457931447000078 ], [ -79.040498114999934, 9.452233634000038 ], [ -79.024323598999899, 9.455913990000056 ], [ -79.013890376999939, 9.451183411000045 ], [ -79.001049694999949, 9.453471043000093 ], [ -78.988212133999923, 9.455289557000071 ], [ -78.977277268999899, 9.457115774000044 ], [ -78.966362218999905, 9.45472499400006 ], [ -78.95259004199994, 9.454663080000046 ], [ -78.935050173999912, 9.447556342000041 ], [ -78.924618639999949, 9.44423117000008 ], [ -78.915679490999935, 9.436835028000075 ], [ -78.908070441999939, 9.430812893000052 ], [ -78.903309699999909, 9.422919012000079 ], [ -78.89574330399995, 9.424421061000089 ], [ -78.882912972999918, 9.425295124000058 ], [ -78.874841132999904, 9.424788310000054 ], [ -78.864878247999911, 9.422397982000064 ], [ -78.852544202999923, 9.423753852000061 ], [ -78.847235740999906, 9.433084454000038 ], [ -78.836335919999897, 9.435384427000088 ], [ -78.817844768999919, 9.431080468000062 ], [ -78.78938426499991, 9.436570632000041 ], [ -78.781136414999935, 9.445882047000055 ], [ -78.764105287999939, 9.442521953000039 ], [ -78.752649044999941, 9.444333833000087 ], [ -78.741595066999935, 9.44848875100007 ], [ -78.728222884999923, 9.454983637000055 ], [ -78.717884894999941, 9.441839911000045 ], [ -78.701656968999941, 9.434259603000044 ], [ -78.688869084999908, 9.43555350400004 ], [ -78.655600285999924, 9.426498389000074 ], [ -78.63326473099994, 9.428733218000048 ], [ -78.620027581999921, 9.418825435000088 ], [ -78.603899646999935, 9.416394068000045 ], [ -78.58962149599995, 9.422402190000071 ], [ -78.578087387999915, 9.43189831300009 ], [ -78.561318325999935, 9.438040165000075 ], [ -78.546407441999918, 9.434370216000048 ], [ -78.527122645999953, 9.421502986000064 ], [ -78.512820123999916, 9.415992034000055 ], [ -78.479889665999906, 9.416002824000088 ], [ -78.463449673999946, 9.40460846600007 ], [ -78.452606688999936, 9.40883344000008 ], [ -78.437712497999939, 9.404351060000067 ], [ -78.427261341999952, 9.393895709000049 ], [ -78.415951381999946, 9.38430978100007 ], [ -78.388730732999932, 9.371848899000042 ], [ -78.378321713999924, 9.365750006000042 ], [ -78.364224503999935, 9.36119855700008 ], [ -78.33833926199992, 9.356006656000091 ], [ -78.317512241999907, 9.344662242000084 ], [ -78.302727033999929, 9.333313626000063 ], [ -78.287072173999945, 9.326287320000063 ], [ -78.277486314999919, 9.321878839000078 ], [ -78.267910993999919, 9.320943162000049 ], [ -78.254861620999918, 9.317389616000071 ], [ -78.241857412999934, 9.309545141000058 ], [ -78.226236340999947, 9.300807706000057 ], [ -78.208024793999925, 9.290335613000082 ], [ -78.192353942999944, 9.287610808000068 ], [ -78.176654083999949, 9.290058988000055 ], [ -78.167086290999919, 9.286516887000062 ], [ -78.154922565999925, 9.279491061000044 ], [ -78.141905495999936, 9.277709576000063 ], [ -78.123706892999905, 9.266364628000076 ], [ -78.114003058999913, 9.253810940000051 ], [ -78.088159299999916, 9.247983673000078 ], [ -78.055992348999951, 9.243438130000072 ], [ -78.036901178999926, 9.23639165700007 ], [ -78.024566209999932, 9.226467190000051 ], [ -78.020822719999899, 9.21360911700009 ], [ -77.999256964999915, 9.190822658000059 ], [ -77.986254645999907, 9.188899939000066 ], [ -77.968658006999931, 9.180609442000048 ], [ -77.935408951999932, 9.142888937000066 ], [ -77.918527798999946, 9.116603908000059 ], [ -77.905028417999915, 9.099310445000071 ], [ -77.890152348999948, 9.077213285000084 ], [ -77.855743596999901, 9.054290580000043 ], [ -77.860838441999931, 9.068091029000072 ], [ -77.865223761999914, 9.080267645000049 ], [ -77.876442099999906, 9.103554690000067 ], [ -77.877661019999948, 9.11888756500008 ], [ -77.860096808999913, 9.110419012000079 ], [ -77.847258796999938, 9.087558109000042 ], [ -77.83919444299994, 9.076501573000087 ], [ -77.811865107999949, 9.058039561000044 ], [ -77.808172351999929, 9.035333090000051 ], [ -77.798238538999897, 9.024263803000053 ], [ -77.785813840999936, 9.016871380000055 ], [ -77.770741339999915, 9.003973700000074 ], [ -77.767241990999935, 8.992336330000057 ], [ -77.758534308999913, 8.981512762000079 ], [ -77.747547980999911, 8.972560940000051 ], [ -77.744415965999906, 8.963576305000061 ], [ -77.754205715999944, 8.945658706000074 ], [ -77.734730597999942, 8.923488674000055 ], [ -77.720772329999932, 8.892290262000074 ], [ -77.710320862999936, 8.881281909000052 ], [ -77.701056068999947, 8.889259806000041 ], [ -77.696736843999929, 8.887426389000041 ], [ -77.695519647999902, 8.87331922900006 ], [ -77.676292523999905, 8.861628296000049 ], [ -77.655851862999953, 8.843200133000039 ], [ -77.63345292899993, 8.817450262000079 ], [ -77.614328579999949, 8.808742580000057 ], [ -77.61945553299995, 8.816961981000077 ], [ -77.626047329999949, 8.823146877000056 ], [ -77.631743943999936, 8.829901434000078 ], [ -77.634185350999928, 8.839789130000042 ], [ -77.629058397999927, 8.84446849200009 ], [ -77.617990688999953, 8.835191148000092 ], [ -77.607411261999914, 8.822170315000051 ], [ -77.60383053299995, 8.815578518000052 ], [ -77.574072649999948, 8.792754063000075 ], [ -77.577873707999913, 8.775030270000059 ], [ -77.559342152999932, 8.75970760000007 ], [ -77.553622633999908, 8.776756090000049 ], [ -77.543688488999919, 8.774885415000085 ], [ -77.535099402999947, 8.757744993000074 ], [ -77.538342776999912, 8.741314829000089 ], [ -77.540290285999902, 8.726078971000049 ], [ -77.544749517999946, 8.714603511000064 ], [ -77.532137328999909, 8.703201771000067 ], [ -77.500721808999913, 8.681830145000049 ], [ -77.476958787999934, 8.669907945000091 ], [ -77.444203253999945, 8.66437409100007 ], [ -77.413197394999941, 8.666693427000041 ], [ -77.394602016999897, 8.678412177000041 ], [ -77.390695766999897, 8.673529364000046 ], [ -77.385812954999949, 8.669582424000055 ], [ -77.380034959999932, 8.66665273600006 ], [ -77.373524542999917, 8.664740302000041 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PA-EM", "NAME_1": "Emberá" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -77.46937330143669, 8.537811606220657 ], [ -77.480356404999952, 8.526199036 ], [ -77.488676309999931, 8.496536764000055 ], [ -77.488727986999947, 8.473644104000115 ], [ -77.479684610999897, 8.467856343000051 ], [ -77.449608927999918, 8.470646871000014 ], [ -77.432710734999915, 8.465065816000092 ], [ -77.422323770999895, 8.456410014000141 ], [ -77.405787313999895, 8.428453064000053 ], [ -77.391266235999865, 8.393545634000063 ], [ -77.382998005999923, 8.324945171000124 ], [ -77.374368042999976, 8.289314270000133 ], [ -77.363205932999932, 8.27208018000006 ], [ -77.350493530999898, 8.267403463000093 ], [ -77.337161010999864, 8.26662831600008 ], [ -77.324345255999873, 8.261202291000103 ], [ -77.316903849999875, 8.250841166000086 ], [ -77.295199747999874, 8.205495097000068 ], [ -77.269434250999922, 8.167700643000046 ], [ -77.270032518386017, 8.167537949916436 ], [ -77.38338477238932, 8.136712958336318 ], [ -77.4045462706938, 8.133250636807418 ], [ -77.425320197169356, 8.127643744263366 ], [ -77.43909196622127, 8.11903961818382 ], [ -77.44524146202383, 8.109996243431851 ], [ -77.452527839388267, 8.101082058090469 ], [ -77.463224859639524, 8.096663723052359 ], [ -77.486401740447945, 8.092865504739223 ], [ -77.492783780247237, 8.094028224722763 ], [ -77.498984951094599, 8.096043606327385 ], [ -77.519991420667509, 8.092658800063532 ], [ -77.538620775228594, 8.08165172055044 ], [ -77.552573412333118, 8.084829820339905 ], [ -77.571900397085642, 8.110564683313498 ], [ -77.581072963946099, 8.11927216218055 ], [ -77.60135596400653, 8.125447496404831 ], [ -77.611174486013681, 8.14079539569093 ], [ -77.607350430178201, 8.15702179591915 ], [ -77.625540534268225, 8.199680691110984 ], [ -77.663548550425276, 8.230531521112823 ], [ -77.691634690888236, 8.243941554958781 ], [ -77.720831875390729, 8.251021225848888 ], [ -77.731683926172252, 8.258255927269204 ], [ -77.735818041269567, 8.272156887530343 ], [ -77.734862026861038, 8.280140895985539 ], [ -77.735223762066937, 8.287556464559202 ], [ -77.740494757826809, 8.290011094836132 ], [ -77.746515062420201, 8.290837918035493 ], [ -77.756591965946484, 8.295747179488728 ], [ -77.762974005745775, 8.304713039874855 ], [ -77.76268978490566, 8.310190741209738 ], [ -77.764343431304269, 8.313653061839318 ], [ -77.771526454981881, 8.324453437576096 ], [ -77.777469245209488, 8.331300564469473 ], [ -77.786951870432461, 8.34011139612403 ], [ -77.793282233388368, 8.348327948575957 ], [ -77.797261318854794, 8.36129873285023 ], [ -77.800051845915959, 8.374863796327134 ], [ -77.817363450862558, 8.401322129712526 ], [ -77.817027554078322, 8.409719550217062 ], [ -77.815813158150718, 8.417341824365678 ], [ -77.812402512565882, 8.42429230404656 ], [ -77.808940191936301, 8.434989325197193 ], [ -77.810387131860637, 8.446048082453046 ], [ -77.815167202104703, 8.455763250773373 ], [ -77.840230272409144, 8.48175649706468 ], [ -77.840126918722319, 8.487208359977842 ], [ -77.837052171720359, 8.492091783009357 ], [ -77.840101081199919, 8.498577174696834 ], [ -77.851263190343957, 8.50178111380734 ], [ -77.860875006776155, 8.505475979332971 ], [ -77.873380703056966, 8.517749132516428 ], [ -77.875757818968168, 8.521573188351965 ], [ -77.875757818968168, 8.523278509795375 ], [ -77.876016201386562, 8.525784816915746 ], [ -77.869504971277365, 8.537360338109124 ], [ -77.872192144651763, 8.555912177405048 ], [ -77.88583472429309, 8.568443712107637 ], [ -77.898495450204848, 8.583817449815456 ], [ -77.905316738676561, 8.601129054762055 ], [ -77.908598192152851, 8.62167043724088 ], [ -77.897100186224577, 8.641591702095354 ], [ -77.877488979732618, 8.652702135295272 ], [ -77.84725826735513, 8.694818427228597 ], [ -77.835786098949313, 8.716083279219959 ], [ -77.821807624322389, 8.732852280908048 ], [ -77.806253017662641, 8.737348131211263 ], [ -77.790129971121246, 8.740138658272429 ], [ -77.778296068408793, 8.749362901077006 ], [ -77.769278531179282, 8.762307847828879 ], [ -77.74721269441028, 8.773366604185412 ], [ -77.722743903308469, 8.776622219240039 ], [ -77.701711595313839, 8.771687120264403 ], [ -77.692513190031661, 8.772410589776882 ], [ -77.691583014944172, 8.766855374076215 ], [ -77.68613115113169, 8.757915351212489 ], [ -77.678767259401468, 8.748768621874376 ], [ -77.653600837208842, 8.730526841840287 ], [ -77.626160650993256, 8.70662649241865 ], [ -77.609779222033467, 8.684224757966206 ], [ -77.579160936028359, 8.654820867888702 ], [ -77.568799810762641, 8.639912218174288 ], [ -77.558929612811369, 8.606477565787031 ], [ -77.546268886899611, 8.590096136827242 ], [ -77.508415900373507, 8.573740546289173 ], [ -77.495884365670918, 8.570097358506302 ], [ -77.469787766592162, 8.538316352517654 ], [ -77.46937330143669, 8.537811606220657 ] ] ], [ [ [ -78.183439296686174, 8.093563136729358 ], [ -78.1673420885665, 8.081935940491235 ], [ -78.137163052133133, 8.039819648557909 ], [ -78.127422045391086, 8.029174303351397 ], [ -78.118197800787868, 8.016177679756083 ], [ -78.111609056312886, 7.986696275312852 ], [ -78.101790534305678, 7.978221340442474 ], [ -78.091868658611702, 7.972640286320143 ], [ -78.083109503800529, 7.917734076366514 ], [ -78.059209154378948, 7.931324978265138 ], [ -78.034998744796212, 7.950884507913713 ], [ -78.016214362402877, 7.931350815787482 ], [ -77.985311855557654, 7.835646064414334 ], [ -77.980971034885329, 7.803968411213191 ], [ -77.970997484146551, 7.797922268198079 ], [ -77.961695726076869, 7.794382432303394 ], [ -77.953039924053257, 7.779215400170585 ], [ -77.948466560283521, 7.762007148011435 ], [ -77.952161424010512, 7.748752142897047 ], [ -77.955907966379527, 7.739166164886569 ], [ -77.94479753317961, 7.651626288222587 ], [ -77.949706793733526, 7.618785915937281 ], [ -77.968361985816955, 7.60160350219985 ], [ -77.990892909680042, 7.590260525003202 ], [ -78.004561326843771, 7.605840969185351 ], [ -78.018901536676537, 7.617726548741246 ], [ -78.038176846384317, 7.607442938740633 ], [ -78.048331265175761, 7.589898789797303 ], [ -78.072438321071672, 7.601525986934746 ], [ -78.081223314304509, 7.644856675694996 ], [ -78.090008308436666, 7.652117213738393 ], [ -78.106028002190556, 7.65653554877656 ], [ -78.121220872745084, 7.667826850029087 ], [ -78.138325772116673, 7.67733531277446 ], [ -78.179563564906573, 7.665320542908717 ], [ -78.197004361062397, 7.677852078510625 ], [ -78.24506344322333, 7.730923774012922 ], [ -78.2695063950041, 7.772135728381159 ], [ -78.284595912771124, 7.819445501708515 ], [ -78.303897060900624, 7.8596497657241 ], [ -78.310899217424947, 7.862001044112901 ], [ -78.321182827425559, 7.867917995918788 ], [ -78.327203132018894, 7.879803575474625 ], [ -78.331078863798496, 7.892851874114683 ], [ -78.332499966200487, 7.915951238758623 ], [ -78.329606086351816, 7.936079210087485 ], [ -78.334489509383332, 7.945148424160436 ], [ -78.329321866410965, 7.959747016411654 ], [ -78.313379686123596, 7.964475408912961 ], [ -78.295835537180267, 7.965793158527447 ], [ -78.278084682661984, 7.982743028268146 ], [ -78.257439948294973, 7.996075547748319 ], [ -78.225736456672109, 7.984448349711556 ], [ -78.201991135982098, 8.001217353198285 ], [ -78.205815191817635, 8.012818711914008 ], [ -78.211861334832747, 8.024575100260677 ], [ -78.210259366176786, 8.033980211117864 ], [ -78.212791510819557, 8.04250682193225 ], [ -78.227725999855011, 8.050232448868428 ], [ -78.225452236731314, 8.069326890523541 ], [ -78.200079108064358, 8.08066986682087 ], [ -78.183439296686174, 8.093563136729358 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PA-5", "NAME_1": "Darién" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.269434250999922, 8.167700643000046 ], [ -77.260111449999926, 8.154025371000088 ], [ -77.231069294999941, 8.098731588000064 ], [ -77.209623575999899, 8.020700175000059 ], [ -77.207763223999905, 7.996567281000097 ], [ -77.201200317999906, 7.98199452700004 ], [ -77.191536824999901, 7.972847799000064 ], [ -77.180839803999902, 7.965148010000064 ], [ -77.171072957999939, 7.954916077000078 ], [ -77.163269815999911, 7.939258117000037 ], [ -77.169005899999974, 7.935072326000096 ], [ -77.20605790299993, 7.935485738000096 ], [ -77.236133585999909, 7.92923289 ], [ -77.269723266999932, 7.918122457000081 ], [ -77.300419067999968, 7.90210276300013 ], [ -77.321606404999841, 7.881018779000016 ], [ -77.347186238999882, 7.82381296800007 ], [ -77.376641805999981, 7.786605937000061 ], [ -77.379897420999953, 7.774410299000039 ], [ -77.36651322499992, 7.745109762000084 ], [ -77.345997680999858, 7.725731099000114 ], [ -77.339744832999969, 7.707230937000091 ], [ -77.369097045999922, 7.680772603 ], [ -77.509346883999939, 7.594111227000056 ], [ -77.554925496999914, 7.548480937000051 ], [ -77.57998856699993, 7.528378805000088 ], [ -77.602674519999908, 7.526053365000067 ], [ -77.613319865999898, 7.537473857000066 ], [ -77.625463826999891, 7.587444967000039 ], [ -77.633060261999873, 7.60067413400013 ], [ -77.660758829999878, 7.63803619400008 ], [ -77.663394327999896, 7.639948222000015 ], [ -77.671869262999905, 7.64196360300005 ], [ -77.674814819999909, 7.644650778000084 ], [ -77.674763142999979, 7.64842315700011 ], [ -77.670629028999969, 7.65731150400012 ], [ -77.670215617999958, 7.659947001000134 ], [ -77.679930786999904, 7.670954081000033 ], [ -77.729901896999962, 7.713328756000053 ], [ -77.740237182999891, 7.718858134000044 ], [ -77.764215047999897, 7.705732320000081 ], [ -77.770519571999898, 7.6689903770001 ], [ -77.765817016999932, 7.626460674000043 ], [ -77.756825317999898, 7.595558167000135 ], [ -77.734242716999944, 7.551788228000049 ], [ -77.731245483999942, 7.530342509000121 ], [ -77.740237182999891, 7.504607645000121 ], [ -77.755119994999916, 7.486107483000097 ], [ -77.774240274999926, 7.474738668000029 ], [ -77.796306111999911, 7.471276347000071 ], [ -77.820180623999903, 7.476547343000107 ], [ -77.855010538999863, 7.365391337000105 ], [ -77.895839150733224, 7.235098056585514 ], [ -77.896555141999897, 7.235296942000048 ], [ -77.918812628999945, 7.24164459800005 ], [ -77.947621222999942, 7.267645575000074 ], [ -77.99046790299991, 7.32094961100006 ], [ -78.006459113999938, 7.332464911000045 ], [ -78.014393683999913, 7.341009833000044 ], [ -78.01781165299991, 7.35228099200009 ], [ -78.015533006999931, 7.36273834800005 ], [ -78.011545376999948, 7.373195705000057 ], [ -78.009755011999914, 7.383490302000041 ], [ -78.014393683999913, 7.393540757000039 ], [ -78.020090298999946, 7.397853908000059 ], [ -78.022857225999928, 7.395982164000088 ], [ -78.024891730999911, 7.39203522300005 ], [ -78.02798417899993, 7.389837958000044 ], [ -78.035878058999913, 7.393011786000045 ], [ -78.038156704999949, 7.399400132000039 ], [ -78.036122199999909, 7.40460846600007 ], [ -78.03148352799991, 7.404120184000078 ], [ -78.043446417999917, 7.422308661000045 ], [ -78.049956834999932, 7.425930080000057 ], [ -78.059396938999953, 7.417792059000078 ], [ -78.065541144999941, 7.417792059000078 ], [ -78.089711066999939, 7.445217190000051 ], [ -78.105620897999927, 7.459418036000045 ], [ -78.11742102799991, 7.46556224200009 ], [ -78.120676235999952, 7.469916083000044 ], [ -78.123158331999946, 7.479478257000039 ], [ -78.127919074999909, 7.489162502000056 ], [ -78.137847459999932, 7.493475653000075 ], [ -78.144154425999943, 7.497870184000078 ], [ -78.14907792899993, 7.507879950000074 ], [ -78.155588344999899, 7.52765534100007 ], [ -78.161773240999935, 7.52765534100007 ], [ -78.166086391999897, 7.512640692000048 ], [ -78.168324347999942, 7.522406317000048 ], [ -78.169260219999899, 7.557440497000073 ], [ -78.174224412999934, 7.575425523000092 ], [ -78.184803839999915, 7.579413153000075 ], [ -78.194447394999941, 7.571437893000052 ], [ -78.196522589999915, 7.553697007000039 ], [ -78.202015753999945, 7.566839911000045 ], [ -78.200306769999941, 7.576157945000091 ], [ -78.196644660999937, 7.584906317000048 ], [ -78.196522589999915, 7.595892645000049 ], [ -78.200306769999941, 7.606431382000039 ], [ -78.204457160999937, 7.612127997000073 ], [ -78.216420050999943, 7.622544664000088 ], [ -78.237700975999928, 7.649888414000088 ], [ -78.252349412999934, 7.660956122000073 ], [ -78.271636522999927, 7.663560289000088 ], [ -78.269276495999918, 7.67454661700009 ], [ -78.273589647999927, 7.682806708000044 ], [ -78.282134568999936, 7.688462632000039 ], [ -78.292144334999932, 7.691473700000074 ], [ -78.282582160999937, 7.710638739000046 ], [ -78.277495897999927, 7.724351304000038 ], [ -78.278146938999953, 7.737372137000079 ], [ -78.285267706999946, 7.754136460000041 ], [ -78.315337693999936, 7.799872137000079 ], [ -78.320057745999918, 7.81126536700009 ], [ -78.329416469999899, 7.843247789000088 ], [ -78.351144985999952, 7.870184637000079 ], [ -78.375965949999909, 7.894191799000055 ], [ -78.394520636999914, 7.91742584800005 ], [ -78.407582160999937, 7.948228257000039 ], [ -78.415638800999943, 7.980129299000055 ], [ -78.416005011999914, 7.992173570000091 ], [ -78.413644985999952, 8.003648179000038 ], [ -78.415638800999943, 8.013617255000042 ], [ -78.433583136999914, 8.045803127000056 ], [ -78.436146613999938, 8.058294989000046 ], [ -78.430816209999932, 8.077134507000039 ], [ -78.419056769999941, 8.095404364000046 ], [ -78.407297329999949, 8.10219961100006 ], [ -78.395741339999915, 8.069891669000071 ], [ -78.381337042999917, 8.063625393000052 ], [ -78.365223761999914, 8.065985419000071 ], [ -78.353586391999897, 8.075669664000088 ], [ -78.325184699999909, 8.060939846000053 ], [ -78.286447719999899, 8.08071523600006 ], [ -78.25218665299991, 8.11749909100007 ], [ -78.237456834999932, 8.153957424000055 ], [ -78.239369269999941, 8.174383856000077 ], [ -78.244740363999938, 8.186916408000059 ], [ -78.253285285999937, 8.195786851000037 ], [ -78.264800584999932, 8.20538971600007 ], [ -78.294056769999941, 8.239203192000048 ], [ -78.305775519999941, 8.24640534100007 ], [ -78.305775519999941, 8.253851630000042 ], [ -78.278635219999899, 8.250962632000039 ], [ -78.270090298999946, 8.252386786000045 ], [ -78.257394985999952, 8.259995835000041 ], [ -78.257394985999952, 8.267523505000042 ], [ -78.263172980999911, 8.270331122000073 ], [ -78.266102667999917, 8.273260809000078 ], [ -78.268177863999938, 8.276678778000075 ], [ -78.271636522999927, 8.281154690000051 ], [ -78.263661261999914, 8.284328518000052 ], [ -78.261301235999952, 8.284735419000071 ], [ -78.257394985999952, 8.294826565000051 ], [ -78.248931443999936, 8.289211330000057 ], [ -78.237456834999932, 8.278509833000044 ], [ -78.23070227799991, 8.274359442000048 ], [ -78.221913214999915, 8.271918036000045 ], [ -78.214222785999937, 8.272162177000041 ], [ -78.199696417999917, 8.274359442000048 ], [ -78.198109503999945, 8.278306382000039 ], [ -78.18586178299995, 8.295111395000049 ], [ -78.182932094999899, 8.297919012000079 ], [ -78.184396938999953, 8.325344143000052 ], [ -78.182932094999899, 8.335760809000078 ], [ -78.180043097999942, 8.337591864000046 ], [ -78.161773240999935, 8.356268622000073 ], [ -78.157541469999899, 8.36554596600007 ], [ -78.155751105999911, 8.374335028000075 ], [ -78.155588344999899, 8.394110419000071 ], [ -78.151356574999909, 8.399481512000079 ], [ -78.141916469999899, 8.404038804000038 ], [ -78.132476365999935, 8.405340887000079 ], [ -78.128285285999937, 8.400946356000077 ], [ -78.12328040299991, 8.364488023000092 ], [ -78.120838995999918, 8.356268622000073 ], [ -78.110951300999943, 8.34796784100007 ], [ -78.094553188999953, 8.339056708000044 ], [ -78.076649542999917, 8.331854559000078 ], [ -78.062489386999914, 8.328924872000073 ], [ -78.05101477799991, 8.322495835000041 ], [ -78.042469855999911, 8.30735911700009 ], [ -78.024891730999911, 8.259711005000042 ], [ -78.015126105999911, 8.246527411000045 ], [ -78.002552863999938, 8.237005927000041 ], [ -77.987416144999941, 8.233343817000048 ], [ -77.98265540299991, 8.235337632000039 ], [ -77.972035285999937, 8.238470770000049 ], [ -77.961293097999942, 8.238023179000038 ], [ -77.953521287999934, 8.223781643000052 ], [ -77.946603969999899, 8.218410549000055 ], [ -77.93773352799991, 8.214422919000071 ], [ -77.929066535999937, 8.212876695000091 ], [ -77.915394660999937, 8.212876695000091 ], [ -77.915394660999937, 8.21906159100007 ], [ -77.930734829999949, 8.222398179000038 ], [ -77.944732225999928, 8.230536200000074 ], [ -77.955881313999953, 8.24164459800005 ], [ -77.962554490999935, 8.253851630000042 ], [ -77.912587042999917, 8.244330145000049 ], [ -77.885975714999915, 8.23468659100007 ], [ -77.869007941999939, 8.21548086100006 ], [ -77.845082160999937, 8.20258209800005 ], [ -77.839670376999948, 8.195502020000049 ], [ -77.838734503999945, 8.180650132000039 ], [ -77.835560675999943, 8.170111395000049 ], [ -77.829253709999932, 8.162787177000041 ], [ -77.819203253999945, 8.15766022300005 ], [ -77.808420376999948, 8.163763739000046 ], [ -77.797271287999934, 8.157700914000088 ], [ -77.788563605999911, 8.14398834800005 ], [ -77.785023566999939, 8.126898505000042 ], [ -77.778146938999953, 8.115790106000077 ], [ -77.762603318999936, 8.111883856000077 ], [ -77.74640865799995, 8.116359768000052 ], [ -77.737212693999936, 8.13031647300005 ], [ -77.765126105999911, 8.130072333000044 ], [ -77.801869269999941, 8.174383856000077 ], [ -77.819203253999945, 8.171291408000059 ], [ -77.870594855999911, 8.23578522300005 ], [ -77.880686001999948, 8.243312893000052 ], [ -77.895415818999936, 8.251532294000071 ], [ -77.984283006999931, 8.267523505000042 ], [ -78.005930141999897, 8.27602773600006 ], [ -78.023182745999918, 8.29047272300005 ], [ -78.034738735999952, 8.309637762000079 ], [ -78.038929816999939, 8.33234284100007 ], [ -78.060699022999927, 8.375921942000048 ], [ -78.06704667899993, 8.402736721000053 ], [ -78.051909959999932, 8.417669989000046 ], [ -78.06273352799991, 8.424709377000056 ], [ -78.074777798999946, 8.434515692000048 ], [ -78.085926886999914, 8.446356512000079 ], [ -78.094146287999934, 8.45929596600007 ], [ -78.098540818999936, 8.475775458000044 ], [ -78.095570441999939, 8.485174872000073 ], [ -78.089995897999927, 8.491888739000046 ], [ -78.086659308999913, 8.500230210000041 ], [ -78.08812415299991, 8.512762762000079 ], [ -78.093861456999946, 8.51593659100007 ], [ -78.102894660999937, 8.518052476000037 ], [ -78.114003058999913, 8.527573960000041 ], [ -78.118885870999918, 8.538763739000046 ], [ -78.119943813999953, 8.54828522300005 ], [ -78.123117641999897, 8.556057033000059 ], [ -78.134429490999935, 8.561712958000044 ], [ -78.130360480999911, 8.552476304000038 ], [ -78.12954667899993, 8.527289130000042 ], [ -78.124501105999911, 8.517645575000074 ], [ -78.111195441999939, 8.509019273000092 ], [ -78.106190558999913, 8.508042710000041 ], [ -78.105824347999942, 8.505031643000052 ], [ -78.106516079999949, 8.47211334800005 ], [ -78.104807094999899, 8.463364976000037 ], [ -78.090931769999941, 8.430853583000044 ], [ -78.089588995999918, 8.420396226000037 ], [ -78.094146287999934, 8.41087474200009 ], [ -78.100331183999913, 8.41087474200009 ], [ -78.119252081999946, 8.442531643000052 ], [ -78.131418423999946, 8.458075262000079 ], [ -78.14126542899993, 8.466131903000075 ], [ -78.156849738999938, 8.466213283000059 ], [ -78.17015540299991, 8.45766836100006 ], [ -78.179432745999918, 8.442084052000041 ], [ -78.182932094999899, 8.421087958000044 ], [ -78.188872850999928, 8.405747789000088 ], [ -78.20376542899993, 8.393947658000059 ], [ -78.222564256999931, 8.386297919000071 ], [ -78.240589972999942, 8.38353099200009 ], [ -78.249134894999941, 8.386908270000049 ], [ -78.252837693999936, 8.394720770000049 ], [ -78.253041144999941, 8.403794664000088 ], [ -78.251128709999932, 8.41087474200009 ], [ -78.245350714999915, 8.417669989000046 ], [ -78.216420050999943, 8.43195221600007 ], [ -78.212513800999943, 8.428656317000048 ], [ -78.209828253999945, 8.426988023000092 ], [ -78.202748175999943, 8.424505927000041 ], [ -78.201527472999942, 8.45734284100007 ], [ -78.206695115999935, 8.48773834800005 ], [ -78.223255988999938, 8.541815497000073 ], [ -78.23070227799991, 8.541815497000073 ], [ -78.237700975999928, 8.527533270000049 ], [ -78.232818162999934, 8.518377997000073 ], [ -78.22329667899993, 8.510565497000073 ], [ -78.216420050999943, 8.500230210000041 ], [ -78.217844204999949, 8.482489325000074 ], [ -78.225575324999909, 8.468247789000088 ], [ -78.230458136999914, 8.456447658000059 ], [ -78.223255988999938, 8.44562409100007 ], [ -78.223255988999938, 8.438177802000041 ], [ -78.226389126999948, 8.435980536000045 ], [ -78.229847785999937, 8.434393622000073 ], [ -78.237456834999932, 8.43195221600007 ], [ -78.241851365999935, 8.440008856000077 ], [ -78.247873501999948, 8.444525458000044 ], [ -78.253570115999935, 8.447821356000077 ], [ -78.257394985999952, 8.451849677000041 ], [ -78.260650193999936, 8.460638739000046 ], [ -78.258941209999932, 8.46165599200009 ], [ -78.254953579999949, 8.461371161000045 ], [ -78.251128709999932, 8.466131903000075 ], [ -78.240386522999927, 8.485296942000048 ], [ -78.241566535999937, 8.49477773600006 ], [ -78.257394985999952, 8.500230210000041 ], [ -78.25259355399993, 8.48773834800005 ], [ -78.254750128999945, 8.48187897300005 ], [ -78.26008053299995, 8.478420315000051 ], [ -78.264800584999932, 8.47296784100007 ], [ -78.278472459999932, 8.44562409100007 ], [ -78.294545050999943, 8.443264065000051 ], [ -78.303334113999938, 8.454291083000044 ], [ -78.312611456999946, 8.486558335000041 ], [ -78.320057745999918, 8.47915273600006 ], [ -78.321034308999913, 8.46625397300005 ], [ -78.334828253999945, 8.446193752000056 ], [ -78.353016730999911, 8.428900458000044 ], [ -78.367258266999897, 8.424505927000041 ], [ -78.376454230999911, 8.441310940000051 ], [ -78.386870897999927, 8.500474351000037 ], [ -78.394520636999914, 8.520697333000044 ], [ -78.390736456999946, 8.527492580000057 ], [ -78.388335740999935, 8.534369208000044 ], [ -78.394520636999914, 8.534369208000044 ], [ -78.394520636999914, 8.527573960000041 ], [ -78.401966925999943, 8.527573960000041 ], [ -78.401966925999943, 8.548041083000044 ], [ -78.408192511999914, 8.548041083000044 ], [ -78.412017381999931, 8.523504950000074 ], [ -78.393788214999915, 8.473863023000092 ], [ -78.384103969999899, 8.425970770000049 ], [ -78.365345831999946, 8.410630601000037 ], [ -78.360991990999935, 8.394110419000071 ], [ -78.388335740999935, 8.335760809000078 ], [ -78.392323370999918, 8.34438711100006 ], [ -78.399484829999949, 8.348822333000044 ], [ -78.407826300999943, 8.351996161000045 ], [ -78.409698045999903, 8.353013414000088 ], [ -78.413244391915157, 8.39754974982111 ], [ -78.429599981553906, 8.455634060463524 ], [ -78.432390510413711, 8.477674057911429 ], [ -78.445232102579439, 8.508318183237577 ], [ -78.44910783615768, 8.533536282273587 ], [ -78.447945116174139, 8.546274522551187 ], [ -78.451329922437935, 8.553715929546513 ], [ -78.454921434276741, 8.556583970973463 ], [ -78.458461270171483, 8.56038218838728 ], [ -78.457841153446452, 8.568624579260927 ], [ -78.452105068793855, 8.598105983704158 ], [ -78.448125983327429, 8.638749498190748 ], [ -78.44507707384787, 8.653580634438697 ], [ -78.441537237953128, 8.665052801945251 ], [ -78.435620287046618, 8.676447455085963 ], [ -78.431718715945976, 8.68717031555758 ], [ -78.428230556894675, 8.70259573010884 ], [ -78.428773159253865, 8.714481308765357 ], [ -78.433398199867042, 8.738381659086258 ], [ -78.436912198239327, 8.748303533880971 ], [ -78.448410204167601, 8.805948594951701 ], [ -78.451174892807046, 8.819694526481214 ], [ -78.446033088256399, 8.82535309496933 ], [ -78.438875902101188, 8.830003974004171 ], [ -78.393038907119831, 8.84542938945475 ], [ -78.379034593171923, 8.8448092718304 ], [ -78.362317268327274, 8.841708686406719 ], [ -78.338158534688603, 8.833027045062067 ], [ -78.331724819844567, 8.827368476573895 ], [ -78.321699592262348, 8.812072252332541 ], [ -78.30901302792887, 8.806723741307621 ], [ -78.299633754594083, 8.809126694741167 ], [ -78.290331997423721, 8.816025499377304 ], [ -78.285810309598105, 8.82457794771409 ], [ -78.284699265558629, 8.832949529796963 ], [ -78.281004400932318, 8.842561347128481 ], [ -78.271289231712672, 8.852664089076427 ], [ -78.242660488890408, 8.865996609455976 ], [ -78.221860724892508, 8.870337429228982 ], [ -78.205014207939314, 8.870880032487491 ], [ -78.185919766284201, 8.869329738876331 ], [ -78.174990200237517, 8.871965237205927 ], [ -78.167083706148105, 8.877727159380868 ], [ -78.154035406608727, 8.899663804940644 ], [ -78.137214728077197, 8.914262397191862 ], [ -78.119722255977308, 8.922091376016169 ], [ -78.094840053725477, 8.927827459769446 ], [ -78.084065518209059, 8.934364529199627 ], [ -78.079182095177543, 8.943743800735774 ], [ -78.081662563876193, 8.958704128192949 ], [ -78.082127651869598, 8.976713365129683 ], [ -78.079879727167679, 9.001078803443988 ], [ -78.075332200920343, 9.019785671471539 ], [ -78.068536749971031, 9.034590969297767 ], [ -78.048202073966536, 9.06128184757921 ], [ -78.042543504579044, 9.073244941500832 ], [ -78.015335863259452, 9.073244941500832 ], [ -77.94208451958491, 9.020715847458405 ], [ -77.911905484050862, 8.996970526768393 ], [ -77.856663378212318, 8.941263332936444 ], [ -77.84648312009989, 8.924261786352361 ], [ -77.840359462718993, 8.911316840499751 ], [ -77.833693202978907, 8.90036143603146 ], [ -77.823667976296065, 8.893385117928858 ], [ -77.806718105656046, 8.885711167836121 ], [ -77.779226244395659, 8.866539210915846 ], [ -77.76418840167338, 8.859097804819839 ], [ -77.752044439699091, 8.850106106011992 ], [ -77.712408617363792, 8.813855089041112 ], [ -77.701143155432248, 8.800290025564209 ], [ -77.694838629998742, 8.786079006041291 ], [ -77.692513190031661, 8.772410589776882 ], [ -77.701711595313839, 8.771687120264403 ], [ -77.722743903308469, 8.776622219240039 ], [ -77.74721269441028, 8.773366604185412 ], [ -77.769278531179282, 8.762307847828879 ], [ -77.778296068408793, 8.749362901077006 ], [ -77.790129971121246, 8.740138658272429 ], [ -77.806253017662641, 8.737348131211263 ], [ -77.821807624322389, 8.732852280908048 ], [ -77.835786098949313, 8.716083279219959 ], [ -77.84725826735513, 8.694818427228597 ], [ -77.877488979732618, 8.652702135295272 ], [ -77.897100186224577, 8.641591702095354 ], [ -77.908598192152851, 8.62167043724088 ], [ -77.905316738676561, 8.601129054762055 ], [ -77.898495450204848, 8.583817449815456 ], [ -77.88583472429309, 8.568443712107637 ], [ -77.872192144651763, 8.555912177405048 ], [ -77.869504971277365, 8.537360338109124 ], [ -77.876016201386562, 8.525784816915746 ], [ -77.875757818968168, 8.523278509795375 ], [ -77.875757818968168, 8.521573188351965 ], [ -77.873380703056966, 8.517749132516428 ], [ -77.860875006776155, 8.505475979332971 ], [ -77.851263190343957, 8.50178111380734 ], [ -77.840101081199919, 8.498577174696834 ], [ -77.837052171720359, 8.492091783009357 ], [ -77.840126918722319, 8.487208359977842 ], [ -77.840230272409144, 8.48175649706468 ], [ -77.815167202104703, 8.455763250773373 ], [ -77.810387131860637, 8.446048082453046 ], [ -77.808940191936301, 8.434989325197193 ], [ -77.812402512565882, 8.42429230404656 ], [ -77.815813158150718, 8.417341824365678 ], [ -77.817027554078322, 8.409719550217062 ], [ -77.817363450862558, 8.401322129712526 ], [ -77.800051845915959, 8.374863796327134 ], [ -77.797261318854794, 8.36129873285023 ], [ -77.793282233388368, 8.348327948575957 ], [ -77.786951870432461, 8.34011139612403 ], [ -77.777469245209488, 8.331300564469473 ], [ -77.771526454981881, 8.324453437576096 ], [ -77.764343431304269, 8.313653061839318 ], [ -77.76268978490566, 8.310190741209738 ], [ -77.762974005745775, 8.304713039874855 ], [ -77.756591965946484, 8.295747179488728 ], [ -77.746515062420201, 8.290837918035493 ], [ -77.740494757826809, 8.290011094836132 ], [ -77.735223762066937, 8.287556464559202 ], [ -77.734862026861038, 8.280140895985539 ], [ -77.735818041269567, 8.272156887530343 ], [ -77.731683926172252, 8.258255927269204 ], [ -77.720831875390729, 8.251021225848888 ], [ -77.691634690888236, 8.243941554958781 ], [ -77.663548550425276, 8.230531521112823 ], [ -77.625540534268225, 8.199680691110984 ], [ -77.607350430178201, 8.15702179591915 ], [ -77.611174486013681, 8.14079539569093 ], [ -77.60135596400653, 8.125447496404831 ], [ -77.581072963946099, 8.11927216218055 ], [ -77.571900397085642, 8.110564683313498 ], [ -77.552573412333118, 8.084829820339905 ], [ -77.538620775228594, 8.08165172055044 ], [ -77.519991420667509, 8.092658800063532 ], [ -77.498984951094599, 8.096043606327385 ], [ -77.492783780247237, 8.094028224722763 ], [ -77.486401740447945, 8.092865504739223 ], [ -77.463224859639524, 8.096663723052359 ], [ -77.452527839388267, 8.101082058090469 ], [ -77.44524146202383, 8.109996243431851 ], [ -77.43909196622127, 8.11903961818382 ], [ -77.425320197169356, 8.127643744263366 ], [ -77.4045462706938, 8.133250636807418 ], [ -77.38338477238932, 8.136712958336318 ], [ -77.270032518386017, 8.167537949916436 ], [ -77.269434250999922, 8.167700643000046 ] ], [ [ -78.083109503800529, 7.917734076366514 ], [ -78.091868658611702, 7.972640286320143 ], [ -78.101790534305678, 7.978221340442474 ], [ -78.111609056312886, 7.986696275312852 ], [ -78.118197800787868, 8.016177679756083 ], [ -78.127422045391086, 8.029174303351397 ], [ -78.137163052133133, 8.039819648557909 ], [ -78.1673420885665, 8.081935940491235 ], [ -78.183439296686174, 8.093563136729358 ], [ -78.200079108064358, 8.08066986682087 ], [ -78.225452236731314, 8.069326890523541 ], [ -78.227725999855011, 8.050232448868428 ], [ -78.212791510819557, 8.04250682193225 ], [ -78.210259366176786, 8.033980211117864 ], [ -78.211861334832747, 8.024575100260677 ], [ -78.205815191817635, 8.012818711914008 ], [ -78.201991135982098, 8.001217353198285 ], [ -78.225736456672109, 7.984448349711556 ], [ -78.257439948294973, 7.996075547748319 ], [ -78.278084682661984, 7.982743028268146 ], [ -78.295835537180267, 7.965793158527447 ], [ -78.313379686123596, 7.964475408912961 ], [ -78.329321866410965, 7.959747016411654 ], [ -78.334489509383332, 7.945148424160436 ], [ -78.329606086351816, 7.936079210087485 ], [ -78.332499966200487, 7.915951238758623 ], [ -78.331078863798496, 7.892851874114683 ], [ -78.327203132018894, 7.879803575474625 ], [ -78.321182827425559, 7.867917995918788 ], [ -78.310899217424947, 7.862001044112901 ], [ -78.303897060900624, 7.8596497657241 ], [ -78.284595912771124, 7.819445501708515 ], [ -78.2695063950041, 7.772135728381159 ], [ -78.24506344322333, 7.730923774012922 ], [ -78.197004361062397, 7.677852078510625 ], [ -78.179563564906573, 7.665320542908717 ], [ -78.138325772116673, 7.67733531277446 ], [ -78.121220872745084, 7.667826850029087 ], [ -78.106028002190556, 7.65653554877656 ], [ -78.090008308436666, 7.652117213738393 ], [ -78.081223314304509, 7.644856675694996 ], [ -78.072438321071672, 7.601525986934746 ], [ -78.048331265175761, 7.589898789797303 ], [ -78.038176846384317, 7.607442938740633 ], [ -78.018901536676537, 7.617726548741246 ], [ -78.004561326843771, 7.605840969185351 ], [ -77.990892909680042, 7.590260525003202 ], [ -77.968361985816955, 7.60160350219985 ], [ -77.949706793733526, 7.618785915937281 ], [ -77.94479753317961, 7.651626288222587 ], [ -77.955907966379527, 7.739166164886569 ], [ -77.952161424010512, 7.748752142897047 ], [ -77.948466560283521, 7.762007148011435 ], [ -77.953039924053257, 7.779215400170585 ], [ -77.961695726076869, 7.794382432303394 ], [ -77.970997484146551, 7.797922268198079 ], [ -77.980971034885329, 7.803968411213191 ], [ -77.985311855557654, 7.835646064414334 ], [ -78.016214362402877, 7.931350815787482 ], [ -78.034998744796212, 7.950884507913713 ], [ -78.059209154378948, 7.931324978265138 ], [ -78.083109503800529, 7.917734076366514 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PA-8", "NAME_1": "Panama" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.409698045999903, 8.353013414000088 ], [ -78.415638800999943, 8.356268622000073 ], [ -78.438710089999915, 8.384426174000055 ], [ -78.449777798999946, 8.391017971000053 ], [ -78.444406704999949, 8.403225002000056 ], [ -78.445179816999939, 8.421087958000044 ], [ -78.449940558999913, 8.439154364000046 ], [ -78.456654425999943, 8.451849677000041 ], [ -78.464019334999932, 8.446234442000048 ], [ -78.468088344999899, 8.440130927000041 ], [ -78.469960089999915, 8.433010158000059 ], [ -78.470855272999927, 8.424505927000041 ], [ -78.475493943999936, 8.434027411000045 ], [ -78.486398891999897, 8.447821356000077 ], [ -78.490793423999946, 8.45929596600007 ], [ -78.491363084999932, 8.47337474200009 ], [ -78.483957485999952, 8.507066148000092 ], [ -78.490793423999946, 8.524481512000079 ], [ -78.520008917999917, 8.563462632000039 ], [ -78.531727667999917, 8.575995184000078 ], [ -78.516713019999941, 8.575262762000079 ], [ -78.505767381999931, 8.571966864000046 ], [ -78.495920376999948, 8.570746161000045 ], [ -78.483957485999952, 8.575995184000078 ], [ -78.50031490799995, 8.588690497000073 ], [ -78.505848761999914, 8.59906647300005 ], [ -78.504383917999917, 8.634019273000092 ], [ -78.566477016999897, 8.651068427000041 ], [ -78.561268683999913, 8.666449286000045 ], [ -78.558990037999934, 8.670965887000079 ], [ -78.565581834999932, 8.671779690000051 ], [ -78.56899980399993, 8.67023346600007 ], [ -78.573312954999949, 8.664740302000041 ], [ -78.581532355999911, 8.670111395000049 ], [ -78.589222785999937, 8.669582424000055 ], [ -78.596547003999945, 8.666489976000037 ], [ -78.60374915299991, 8.664740302000041 ], [ -78.612538214999915, 8.669745184000078 ], [ -78.618885870999918, 8.681463934000078 ], [ -78.627919074999909, 8.70571523600006 ], [ -78.613677537999934, 8.717230536000045 ], [ -78.608387824999909, 8.735337632000039 ], [ -78.609486456999946, 8.755926825000074 ], [ -78.614247199999909, 8.774603583000044 ], [ -78.621693488999938, 8.774603583000044 ], [ -78.623117641999897, 8.758490302000041 ], [ -78.619130011999914, 8.737860419000071 ], [ -78.619740363999938, 8.723537502000056 ], [ -78.634755011999914, 8.726223049000055 ], [ -78.651519334999932, 8.707953192000048 ], [ -78.682199673999946, 8.747748114000046 ], [ -78.709868943999936, 8.747300523000092 ], [ -78.729400193999936, 8.759344794000071 ], [ -78.749379035999937, 8.801825262000079 ], [ -78.765126105999911, 8.815578518000052 ], [ -78.765126105999911, 8.822414455000057 ], [ -78.757639126999948, 8.822414455000057 ], [ -78.757639126999948, 8.829250393000052 ], [ -78.772450324999909, 8.833563544000071 ], [ -78.781809048999946, 8.842840887000079 ], [ -78.789621548999946, 8.853908596000053 ], [ -78.799875454999949, 8.863348700000074 ], [ -78.791900193999936, 8.846665757000039 ], [ -78.790150519999941, 8.833563544000071 ], [ -78.796457485999952, 8.823472398000092 ], [ -78.812855597999942, 8.815578518000052 ], [ -78.827870245999918, 8.81313711100006 ], [ -78.838002081999946, 8.816961981000077 ], [ -78.857574022999927, 8.839789130000042 ], [ -78.864572719999899, 8.855617580000057 ], [ -78.868560350999928, 8.874904690000051 ], [ -78.873890753999945, 8.891180731000077 ], [ -79.005279100999928, 8.959540106000077 ], [ -79.057606574999909, 8.97101471600007 ], [ -79.082997199999909, 8.988836981000077 ], [ -79.087228969999899, 8.994330145000049 ], [ -79.088490363999938, 9.004095770000049 ], [ -79.085682745999918, 9.009751695000091 ], [ -79.081776495999918, 9.015326239000046 ], [ -79.079823370999918, 9.024725653000075 ], [ -79.079335089999915, 9.045396226000037 ], [ -79.080881313999953, 9.06281159100007 ], [ -79.088856574999909, 9.073797919000071 ], [ -79.10773678299995, 9.07562897300005 ], [ -79.10773678299995, 9.083075262000079 ], [ -79.086293097999942, 9.08462148600006 ], [ -79.069894985999952, 9.093329169000071 ], [ -79.058583136999914, 9.107163804000038 ], [ -79.052479620999918, 9.124009507000039 ], [ -79.046254035999937, 9.124009507000039 ], [ -79.03742428299995, 9.110500393000052 ], [ -79.027699347999942, 9.111029364000046 ], [ -79.011545376999948, 9.124009507000039 ], [ -78.991200324999909, 9.13117096600007 ], [ -78.982167120999918, 9.136419989000046 ], [ -78.977365688999953, 9.14516836100006 ], [ -78.983754035999937, 9.141994533000059 ], [ -78.997181769999941, 9.14093659100007 ], [ -79.005279100999928, 9.138332424000055 ], [ -79.01195227799991, 9.13312409100007 ], [ -79.024728969999899, 9.119370835000041 ], [ -79.028920050999943, 9.116603908000059 ], [ -79.036936001999948, 9.119614976000037 ], [ -79.039540167999917, 9.125921942000048 ], [ -79.042632615999935, 9.131089585000041 ], [ -79.052479620999918, 9.130845445000091 ], [ -79.058664516999897, 9.12563711100006 ], [ -79.070871548999946, 9.107489325000074 ], [ -79.076649542999917, 9.103583075000074 ], [ -79.079009568999936, 9.101467190000051 ], [ -79.082183397999927, 9.096747137000079 ], [ -79.087798631999931, 9.092027085000041 ], [ -79.097482876999948, 9.089911200000074 ], [ -79.106760219999899, 9.089422919000071 ], [ -79.114165818999936, 9.087551174000055 ], [ -79.119048631999931, 9.083197333000044 ], [ -79.120716925999943, 9.07562897300005 ], [ -79.114572719999899, 9.068793036000045 ], [ -79.101673956999946, 9.065008856000077 ], [ -79.089995897999927, 9.056382554000038 ], [ -79.087228969999899, 9.035305080000057 ], [ -79.091786261999914, 9.023016669000071 ], [ -79.102121548999946, 9.006008205000057 ], [ -79.116078253999945, 8.994126695000091 ], [ -79.131581183999913, 8.997463283000059 ], [ -79.138091600999928, 9.000799872000073 ], [ -79.16234290299991, 9.007391669000071 ], [ -79.163400844999899, 9.011786200000074 ], [ -79.16828365799995, 9.01984284100007 ], [ -79.173491990999935, 9.022528387000079 ], [ -79.17601477799991, 9.010728257000039 ], [ -79.192982550999943, 9.005194403000075 ], [ -79.273345506999931, 9.019273179000038 ], [ -79.29946855399993, 9.014146226000037 ], [ -79.305734829999949, 9.014146226000037 ], [ -79.305734829999949, 9.020982164000088 ], [ -79.33031165299991, 9.013413804000038 ], [ -79.386830206999946, 9.018866278000075 ], [ -79.409331834999932, 9.007391669000071 ], [ -79.41820227799991, 9.014146226000037 ], [ -79.427479620999918, 9.013373114000046 ], [ -79.437123175999943, 9.009588934000078 ], [ -79.454457160999937, 9.006293036000045 ], [ -79.466908331999946, 9.001654364000046 ], [ -79.474517381999931, 9.000555731000077 ], [ -79.482004360999952, 8.99835846600007 ], [ -79.484038865999935, 8.993719794000071 ], [ -79.48468990799995, 8.98899974200009 ], [ -79.487904425999943, 8.986883856000077 ], [ -79.491078253999945, 8.983465887000079 ], [ -79.519195115999935, 8.966376044000071 ], [ -79.521229620999918, 8.957424221000053 ], [ -79.520253058999913, 8.948879299000055 ], [ -79.522206183999913, 8.942287502000056 ], [ -79.532866990999935, 8.939113674000055 ], [ -79.515533006999931, 8.909979559000078 ], [ -79.511830206999946, 8.898138739000046 ], [ -79.524973110999952, 8.907294012000079 ], [ -79.541127081999946, 8.92328522300005 ], [ -79.554676886999914, 8.942084052000041 ], [ -79.560170050999943, 8.959540106000077 ], [ -79.566395636999914, 8.959540106000077 ], [ -79.565012173999946, 8.95376211100006 ], [ -79.563221808999913, 8.950018622000073 ], [ -79.560170050999943, 8.945298570000091 ], [ -79.560170050999943, 8.939113674000055 ], [ -79.566395636999914, 8.939113674000055 ], [ -79.559193488999938, 8.914292710000041 ], [ -79.563872850999928, 8.892767645000049 ], [ -79.578480597999942, 8.88226959800005 ], [ -79.601185675999943, 8.890692450000074 ], [ -79.646839972999942, 8.882635809000078 ], [ -79.661203579999949, 8.875230210000041 ], [ -79.655751105999911, 8.863348700000074 ], [ -79.655751105999911, 8.857123114000046 ], [ -79.666859503999945, 8.860825914000088 ], [ -79.673980272999927, 8.86554596600007 ], [ -79.680653449999909, 8.867621161000045 ], [ -79.690541144999941, 8.863348700000074 ], [ -79.693470831999946, 8.86664459800005 ], [ -79.694650844999899, 8.868312893000052 ], [ -79.697010870999918, 8.869208075000074 ], [ -79.703602667999917, 8.870184637000079 ], [ -79.703602667999917, 8.863348700000074 ], [ -79.700795050999943, 8.859930731000077 ], [ -79.699208136999914, 8.854803778000075 ], [ -79.696766730999911, 8.849676825000074 ], [ -79.713937954999949, 8.852606512000079 ], [ -79.730213995999918, 8.844305731000077 ], [ -79.743560350999928, 8.830064195000091 ], [ -79.752023891999897, 8.815578518000052 ], [ -79.756255662999934, 8.796291408000059 ], [ -79.752023891999897, 8.736761786000045 ], [ -79.749867316999939, 8.731024481000077 ], [ -79.745187954999949, 8.728013414000088 ], [ -79.74046790299991, 8.725978908000059 ], [ -79.738352016999897, 8.722805080000057 ], [ -79.739328579999949, 8.716498114000046 ], [ -79.741363084999932, 8.711127020000049 ], [ -79.744536912999934, 8.70571523600006 ], [ -79.746815558999913, 8.697943427000041 ], [ -79.750803188999953, 8.689601955000057 ], [ -79.756011522999927, 8.681586005000042 ], [ -79.76195227799991, 8.674709377000056 ], [ -79.76593990799995, 8.671820380000042 ], [ -79.778391079999949, 8.665838934000078 ], [ -79.791005011999914, 8.663234768000052 ], [ -79.791737433999913, 8.659491278000075 ], [ -79.790516730999911, 8.65501536700009 ], [ -79.792958136999914, 8.651068427000041 ], [ -79.810018632999913, 8.646601108000084 ], [ -79.826310674999945, 8.638520066000069 ], [ -79.813690615999917, 8.626059908000059 ], [ -79.779608045999908, 8.618409940000049 ], [ -79.747351025999933, 8.631258633000073 ], [ -79.717304992999914, 8.646310358000051 ], [ -79.705803937999917, 8.652550776000055 ], [ -79.702093589999947, 8.657320823000077 ], [ -79.697269139999946, 8.657323396000038 ], [ -79.69689726799993, 8.648887585000068 ], [ -79.700607138999942, 8.641550643000073 ], [ -79.734365124999897, 8.615498574000071 ], [ -79.774395956999911, 8.579550130000086 ], [ -79.793673171999899, 8.572207498000068 ], [ -79.826298354999949, 8.561552820000088 ], [ -79.864117993999912, 8.552357599000061 ], [ -79.871525425999948, 8.542819456000075 ], [ -79.86978105399993, 8.531805731000077 ], [ -79.87173417899993, 8.52415599200009 ], [ -79.874867316999939, 8.520697333000044 ], [ -79.879994269999941, 8.518622137000079 ], [ -79.891224738999938, 8.516302802000041 ], [ -79.895375128999945, 8.514553127000056 ], [ -79.910552537999934, 8.500474351000037 ], [ -79.917632615999935, 8.495428778000075 ], [ -79.926747199999909, 8.493394273000092 ], [ -79.932118292999917, 8.489162502000056 ], [ -79.941802537999934, 8.470404364000046 ], [ -79.946888800999943, 8.466131903000075 ], [ -79.948963995999918, 8.462307033000059 ], [ -79.970204230999911, 8.44407786700009 ], [ -80.040801561999899, 8.39797597900008 ], [ -80.081721361151892, 8.445557156037921 ], [ -80.086475592974239, 8.455272325257567 ], [ -80.092030808674849, 8.470852769439773 ], [ -80.095622321412975, 8.52663747853677 ], [ -80.104665697064263, 8.551312974314328 ], [ -80.104407314645812, 8.583042304358855 ], [ -80.103089565930702, 8.591878974435133 ], [ -80.106784430557013, 8.626424669063226 ], [ -80.112546352731954, 8.643012804497289 ], [ -80.137609423036452, 8.755357367248678 ], [ -80.163680182794167, 8.830701605994307 ], [ -80.164507005993528, 8.854446925784998 ], [ -80.161768154876427, 8.872275295568443 ], [ -80.155696174338971, 8.888889268524906 ], [ -80.13311357273318, 8.922246404747796 ], [ -80.137454393405505, 8.949247341391697 ], [ -80.0926509262992, 8.983689683232285 ], [ -80.050172899159975, 8.96834178304681 ], [ -80.022241787428527, 8.966171372710676 ], [ -79.985396491255074, 8.977798569848119 ], [ -79.955940925233506, 8.996970526768393 ], [ -79.95061825173093, 9.007977607180806 ], [ -79.945192227239488, 9.023738918516244 ], [ -79.945502284702684, 9.039086818701719 ], [ -79.948990444653305, 9.050739854260826 ], [ -79.9573361883144, 9.066165268812085 ], [ -79.962684699339377, 9.083476873758684 ], [ -79.920671760193557, 9.175176703042382 ], [ -79.905943976733113, 9.190627956914682 ], [ -79.889252489410865, 9.193961086335037 ], [ -79.857988247359685, 9.179284979718034 ], [ -79.830005458784854, 9.173238836702922 ], [ -79.819050056115202, 9.167890326577322 ], [ -79.808559739640259, 9.158123481413497 ], [ -79.789542813250193, 9.126239121738081 ], [ -79.778225673575946, 9.114353543081563 ], [ -79.756237352072105, 9.10923757605326 ], [ -79.704741786803993, 9.110012722409181 ], [ -79.687921109171839, 9.115981350159188 ], [ -79.669756842604215, 9.128151150555141 ], [ -79.641567349353693, 9.16261932991813 ], [ -79.635159471132681, 9.189852810558762 ], [ -79.629345873013619, 9.193573512707417 ], [ -79.622292039645913, 9.198999538997498 ], [ -79.604747890702583, 9.20713857708364 ], [ -79.58774634501782, 9.212125352003397 ], [ -79.573716192648135, 9.218249010283557 ], [ -79.568781093672499, 9.22390757877173 ], [ -79.567515020901453, 9.230961412139436 ], [ -79.57193335593962, 9.248815619445281 ], [ -79.56999548960016, 9.26362091727151 ], [ -79.565060390624524, 9.284575710000979 ], [ -79.551908739196961, 9.318320420750808 ], [ -79.547542080102914, 9.333926703354678 ], [ -79.547180344896958, 9.344468695773685 ], [ -79.549893357592339, 9.348344428452606 ], [ -79.550590989582474, 9.355579128074282 ], [ -79.548498093612125, 9.365888577395935 ], [ -79.522504849119457, 9.454255276359902 ], [ -79.485194464952599, 9.469396470970366 ], [ -79.440778570574537, 9.479008287402507 ], [ -79.416128913218756, 9.472497057293367 ], [ -79.399721645837246, 9.46614085501642 ], [ -79.391220873444524, 9.459526272119774 ], [ -79.384606288749239, 9.45092214604017 ], [ -79.381195644963043, 9.445263577552055 ], [ -79.371247931746666, 9.432525336375136 ], [ -79.369697639034825, 9.428262030068595 ], [ -79.371402961377555, 9.425393987742325 ], [ -79.376028001990676, 9.422913519942995 ], [ -79.388352831118254, 9.417565008918018 ], [ -79.393753018087295, 9.414154364232502 ], [ -79.397267014660997, 9.409012558782536 ], [ -79.398791469850437, 9.40296641756612 ], [ -79.396130133998497, 9.395912584198413 ], [ -79.391427578120215, 9.393974717858953 ], [ -79.384477098439334, 9.394904892946442 ], [ -79.368147346322985, 9.400563463233254 ], [ -79.358793911409862, 9.402501329572715 ], [ -79.334893561988281, 9.402346299941769 ], [ -79.328614874976495, 9.403896593552929 ], [ -79.318176236244312, 9.412216497893041 ], [ -79.307789272556874, 9.414851996222637 ], [ -79.29016760924776, 9.415084540219368 ], [ -79.266939053394594, 9.407307237339126 ], [ -79.256707119338046, 9.402423814307554 ], [ -79.252082078724925, 9.396610216188492 ], [ -79.253761562645991, 9.391339220428677 ], [ -79.261513028003833, 9.380952256741239 ], [ -79.261616380791338, 9.375655422559703 ], [ -79.257068853644682, 9.372244777874187 ], [ -79.248077154836835, 9.368911648453775 ], [ -79.242728644711178, 9.363563137428855 ], [ -79.239343838447382, 9.356741848057823 ], [ -79.238103604098058, 9.34973969243282 ], [ -79.238672044878967, 9.344081122146065 ], [ -79.239808926440787, 9.339740302373059 ], [ -79.246991950118399, 9.330748603565212 ], [ -79.266112230195233, 9.321576035805379 ], [ -79.272494269994525, 9.314289659340318 ], [ -79.279031337626122, 9.303360094192954 ], [ -79.281046719230687, 9.293024807348957 ], [ -79.280064867299757, 9.286513577239759 ], [ -79.27205502042284, 9.279537258237838 ], [ -79.239162971294093, 9.286436061974655 ], [ -79.170536669131934, 9.307778429231121 ], [ -79.156713223236636, 9.309871324302151 ], [ -79.143303189390679, 9.310103868298881 ], [ -79.12865292029602, 9.30909617794623 ], [ -79.115372076759911, 9.306305649985745 ], [ -79.093642136775202, 9.297546495174572 ], [ -79.085038010695598, 9.289769192294386 ], [ -79.078242560645663, 9.282250270933218 ], [ -79.07180884490225, 9.277366847901703 ], [ -79.056796840601692, 9.276359158448372 ], [ -79.011140712773681, 9.277599391898377 ], [ -79.002200689909898, 9.280467434224704 ], [ -78.998169929398728, 9.284188137272679 ], [ -78.998169929398728, 9.288373928314115 ], [ -79.000650397198058, 9.294135850489113 ], [ -79.004164394671079, 9.299949449507494 ], [ -79.005637173017135, 9.30638316525085 ], [ -79.002820808433569, 9.312661851363316 ], [ -78.997084723780972, 9.317157700767268 ], [ -78.97274512388833, 9.327725530708676 ], [ -78.964657761746309, 9.328888250692216 ], [ -78.956131150931867, 9.328035589970511 ], [ -78.945666672878644, 9.324676622128379 ], [ -78.939413825187842, 9.327803045973781 ], [ -78.937656826001728, 9.333384100995431 ], [ -78.937941046841843, 9.340282903832929 ], [ -78.937165899586603, 9.34454621013947 ], [ -78.932773403869476, 9.346329046848041 ], [ -78.92633968812612, 9.345243842129605 ], [ -78.915358446135372, 9.341058051088169 ], [ -78.900113897838082, 9.341213079819738 ], [ -78.890786302246056, 9.344468695773685 ], [ -78.878306444386908, 9.355734157705228 ], [ -78.87135596380665, 9.359377346387419 ], [ -78.857041592395547, 9.360927639099259 ], [ -78.839988368968022, 9.361082667830829 ], [ -78.808982510234671, 9.356741848057823 ], [ -78.795908373172892, 9.358679714397283 ], [ -78.787485114246635, 9.363408107797909 ], [ -78.781645676806534, 9.368214016463696 ], [ -78.777795783448653, 9.370616969897242 ], [ -78.77058692134932, 9.371469631518266 ], [ -78.765419278376953, 9.371547145884051 ], [ -78.758778856159267, 9.368601589191996 ], [ -78.741751472052783, 9.350773220307872 ], [ -78.72818640767656, 9.34454621013947 ], [ -78.721003383998948, 9.34702667883812 ], [ -78.716998461010178, 9.353796292265088 ], [ -78.714879726618051, 9.371237087521536 ], [ -78.709712083645741, 9.374182644213647 ], [ -78.698860032864218, 9.370772000427451 ], [ -78.677052577614347, 9.357051907319658 ], [ -78.641783412574398, 9.330206000306646 ], [ -78.627701586059345, 9.321421007073809 ], [ -78.610079921850911, 9.317777818391619 ], [ -78.594525316090426, 9.319173082371833 ], [ -78.542047898891383, 9.331368720290186 ], [ -78.537164475859868, 9.335011908073113 ], [ -78.52835364510463, 9.347956854824986 ], [ -78.521816575674393, 9.351238308301276 ], [ -78.512876552810667, 9.349688014690116 ], [ -78.500189989376508, 9.337957464765168 ], [ -78.495099859870606, 9.328888250692216 ], [ -78.490759040097601, 9.311654161010722 ], [ -78.486418220324595, 9.30870860431861 ], [ -78.479493578166057, 9.311344101748887 ], [ -78.472000495226666, 9.317235216032373 ], [ -78.465075853068129, 9.321033433446189 ], [ -78.457686122916243, 9.320413315821838 ], [ -78.448952805627471, 9.312196764269231 ], [ -78.445257941001159, 9.304445298911389 ], [ -78.441718106005794, 9.298399155896334 ], [ -78.437739019640048, 9.294600938482517 ], [ -78.430323451965705, 9.291939601731201 ], [ -78.424742397843374, 9.287443752327306 ], [ -78.419703946080233, 9.278917141512864 ], [ -78.416525845391448, 9.269537869077396 ], [ -78.415776536557928, 9.261915594928723 ], [ -78.416835903753963, 9.254784247195232 ], [ -78.414303758211872, 9.247885444357735 ], [ -78.408748541611885, 9.243622138051194 ], [ -78.394873419772466, 9.240599066993354 ], [ -78.36606380889765, 9.241761786077575 ], [ -78.346917691298415, 9.238015245507142 ], [ -78.339011197208947, 9.237498481569673 ], [ -78.331208055007721, 9.239978949369004 ], [ -78.295602993183593, 9.257342231159043 ], [ -78.289091763074396, 9.255714423182098 ], [ -78.284854296088895, 9.248583075448551 ], [ -78.280435961050728, 9.231581528864467 ], [ -78.270772467775146, 9.204890652381664 ], [ -78.26472632476009, 9.196053982305443 ], [ -78.257000698723232, 9.190860500911356 ], [ -78.234650642013492, 9.193108424714012 ], [ -78.209122483715646, 9.192720851985712 ], [ -78.186694911740744, 9.189387722565357 ], [ -78.178400844923033, 9.190085354555436 ], [ -78.174034186728306, 9.192720851985712 ], [ -78.171347011555326, 9.197681790282388 ], [ -78.169564174846755, 9.202255154052125 ], [ -78.165610927802049, 9.205665797838265 ], [ -78.158686285643569, 9.203030300408045 ], [ -78.150831468397541, 9.194271144697552 ], [ -78.145818854156801, 9.172773748709517 ], [ -78.150469733191642, 9.161224066837178 ], [ -78.160805020035639, 9.145385240236635 ], [ -78.158841315274458, 9.139959214845874 ], [ -78.152330085165261, 9.134998277448517 ], [ -78.083290370953819, 9.118694362854569 ], [ -78.072386644228231, 9.112803250369723 ], [ -78.06504859091973, 9.107842312073046 ], [ -78.042543504579044, 9.073244941500832 ], [ -78.048202073966536, 9.06128184757921 ], [ -78.068536749971031, 9.034590969297767 ], [ -78.075332200920343, 9.019785671471539 ], [ -78.079879727167679, 9.001078803443988 ], [ -78.082127651869598, 8.976713365129683 ], [ -78.081662563876193, 8.958704128192949 ], [ -78.079182095177543, 8.943743800735774 ], [ -78.084065518209059, 8.934364529199627 ], [ -78.094840053725477, 8.927827459769446 ], [ -78.119722255977308, 8.922091376016169 ], [ -78.137214728077197, 8.914262397191862 ], [ -78.154035406608727, 8.899663804940644 ], [ -78.167083706148105, 8.877727159380868 ], [ -78.174990200237517, 8.871965237205927 ], [ -78.185919766284201, 8.869329738876331 ], [ -78.205014207939314, 8.870880032487491 ], [ -78.221860724892508, 8.870337429228982 ], [ -78.242660488890408, 8.865996609455976 ], [ -78.271289231712672, 8.852664089076427 ], [ -78.281004400932318, 8.842561347128481 ], [ -78.284699265558629, 8.832949529796963 ], [ -78.285810309598105, 8.82457794771409 ], [ -78.290331997423721, 8.816025499377304 ], [ -78.299633754594083, 8.809126694741167 ], [ -78.30901302792887, 8.806723741307621 ], [ -78.321699592262348, 8.812072252332541 ], [ -78.331724819844567, 8.827368476573895 ], [ -78.338158534688603, 8.833027045062067 ], [ -78.362317268327274, 8.841708686406719 ], [ -78.379034593171923, 8.8448092718304 ], [ -78.393038907119831, 8.84542938945475 ], [ -78.438875902101188, 8.830003974004171 ], [ -78.446033088256399, 8.82535309496933 ], [ -78.451174892807046, 8.819694526481214 ], [ -78.448410204167601, 8.805948594951701 ], [ -78.436912198239327, 8.748303533880971 ], [ -78.433398199867042, 8.738381659086258 ], [ -78.428773159253865, 8.714481308765357 ], [ -78.428230556894675, 8.70259573010884 ], [ -78.431718715945976, 8.68717031555758 ], [ -78.435620287046618, 8.676447455085963 ], [ -78.441537237953128, 8.665052801945251 ], [ -78.44507707384787, 8.653580634438697 ], [ -78.448125983327429, 8.638749498190748 ], [ -78.452105068793855, 8.598105983704158 ], [ -78.457841153446452, 8.568624579260927 ], [ -78.458461270171483, 8.56038218838728 ], [ -78.454921434276741, 8.556583970973463 ], [ -78.451329922437935, 8.553715929546513 ], [ -78.447945116174139, 8.546274522551187 ], [ -78.44910783615768, 8.533536282273587 ], [ -78.445232102579439, 8.508318183237577 ], [ -78.432390510413711, 8.477674057911429 ], [ -78.429599981553906, 8.455634060463524 ], [ -78.413244391915157, 8.39754974982111 ], [ -78.409698045999903, 8.353013414000088 ] ] ], [ [ [ -79.09406490799995, 8.308498440000051 ], [ -79.087505018999934, 8.295776164000074 ], [ -79.083001288999924, 8.274186322000048 ], [ -79.075863760999937, 8.265991063000058 ], [ -79.070992048999926, 8.264492413000085 ], [ -79.065741008999908, 8.260760089000087 ], [ -79.069859950999899, 8.257050825000078 ], [ -79.080390841999929, 8.254828134000093 ], [ -79.09127787299991, 8.259680790000061 ], [ -79.103788038999937, 8.252959415000078 ], [ -79.104527957999949, 8.244402237000088 ], [ -79.098447140999951, 8.238471424000068 ], [ -79.098509926999952, 8.229879634000042 ], [ -79.104887160999908, 8.228778713000054 ], [ -79.108681894999904, 8.22392517600008 ], [ -79.109519565999904, 8.210469238000087 ], [ -79.122708963999912, 8.208981766000079 ], [ -79.140002596999921, 8.244395848000067 ], [ -79.136972714999899, 8.25743809800008 ], [ -79.130564049999919, 8.256690183000046 ], [ -79.129804721999903, 8.264141881000057 ], [ -79.125649834999933, 8.277552791000062 ], [ -79.129410938999911, 8.287243020000062 ], [ -79.124499671999899, 8.303261001000067 ], [ -79.112430808999932, 8.317408727000043 ], [ -79.104886923999914, 8.318517622000059 ], [ -79.100372740999944, 8.317396915000074 ], [ -79.094878709999932, 8.311753648000092 ], [ -79.09406490799995, 8.308498440000051 ] ] ], [ [ [ -79.084393131999946, 8.38249055700004 ], [ -79.092844204999949, 8.377183335000041 ], [ -79.112175363999938, 8.391497737000066 ], [ -79.130098166999915, 8.404869682000083 ], [ -79.118237902999908, 8.429110441000091 ], [ -79.105018183999903, 8.418740701000047 ], [ -79.094838019999941, 8.406480210000041 ], [ -79.090148768999939, 8.410278495000057 ], [ -79.087942970999904, 8.419543644000044 ], [ -79.082437647999939, 8.415996564000068 ], [ -79.086283909999906, 8.403453466000087 ], [ -79.078867673999923, 8.398554347000072 ], [ -79.080251867999948, 8.390929745000051 ], [ -79.084393131999946, 8.38249055700004 ] ] ], [ [ [ -78.892244474999927, 8.458046989000081 ], [ -78.893713354999932, 8.469273655000052 ], [ -78.889929614999915, 8.474136485000088 ], [ -78.88018061799994, 8.468460590000063 ], [ -78.869130011999914, 8.46165599200009 ], [ -78.862782355999911, 8.453680731000077 ], [ -78.858225063999953, 8.442938544000071 ], [ -78.855376756999931, 8.431341864000046 ], [ -78.854481574999909, 8.421087958000044 ], [ -78.854683346999934, 8.413287151000077 ], [ -78.842228961999922, 8.411064086000067 ], [ -78.835510272999898, 8.397995399000081 ], [ -78.83733826699995, 8.386865516000057 ], [ -78.845670493999933, 8.381269455000051 ], [ -78.847959188999937, 8.368606294000074 ], [ -78.834476484999925, 8.342810923000059 ], [ -78.843207130999929, 8.320457840000074 ], [ -78.852298044999941, 8.312268477000089 ], [ -78.852281255999912, 8.303331914000069 ], [ -78.858021613999938, 8.295843817000048 ], [ -78.87041456299994, 8.296650181000075 ], [ -78.875343353999938, 8.301494433000073 ], [ -78.882503159999942, 8.300386780000053 ], [ -78.889230923999946, 8.29913971600007 ], [ -78.896399369999926, 8.297429279000085 ], [ -78.899051896999936, 8.302641950000066 ], [ -78.901325136999901, 8.308967386000063 ], [ -78.904690625999933, 8.302649751000047 ], [ -78.912197316999936, 8.293727235000063 ], [ -78.920475972999952, 8.282565959000067 ], [ -78.920117176999952, 8.274001963000046 ], [ -78.922775145999935, 8.265446118000057 ], [ -78.912987238999904, 8.253881356000079 ], [ -78.911139844999923, 8.234147619000055 ], [ -78.90511446499994, 8.22929004100007 ], [ -78.89757411699992, 8.228897258000075 ], [ -78.897578898999939, 8.224426574000063 ], [ -78.903985470999942, 8.219221605000087 ], [ -78.917924441999901, 8.227084176000062 ], [ -78.928454176999935, 8.235667604000071 ], [ -78.926937611999904, 8.249817786000051 ], [ -78.933656070999916, 8.273271306000083 ], [ -78.940042924999943, 8.282589941000083 ], [ -78.957997199999909, 8.290432033000059 ], [ -78.964344855999911, 8.294826565000051 ], [ -78.969897972999945, 8.305098917000066 ], [ -78.965412144999902, 8.320765975000086 ], [ -78.958237339999926, 8.329105164000055 ], [ -78.954776936999906, 8.346514341000045 ], [ -78.958485480999911, 8.352850653000075 ], [ -78.96727762699993, 8.362430036000092 ], [ -78.969907833999912, 8.369891318000043 ], [ -78.965753005999943, 8.377316386000075 ], [ -78.961602310999922, 8.383618156000068 ], [ -78.9612179209999, 8.390315085000054 ], [ -78.965717357999949, 8.408223900000053 ], [ -78.964344855999911, 8.417669989000046 ], [ -78.974711849999949, 8.444368241000063 ], [ -78.97092155699994, 8.458449965000057 ], [ -78.958126855999922, 8.458806186000061 ], [ -78.949104439999928, 8.452789919000054 ], [ -78.908777396999938, 8.470040703000052 ], [ -78.899769660999937, 8.461615302000041 ], [ -78.896962042999917, 8.456691799000055 ], [ -78.895415818999936, 8.451849677000041 ], [ -78.892244474999927, 8.458046989000081 ] ] ], [ [ [ -79.57039255199993, 8.798575963000076 ], [ -79.563339603999907, 8.80463886800004 ], [ -79.556894653999905, 8.802516973000081 ], [ -79.553827177999949, 8.803426325000089 ], [ -79.553211499999918, 8.800395163000076 ], [ -79.555357465999919, 8.797970274000079 ], [ -79.55259222199993, 8.791908401000057 ], [ -79.547988696999937, 8.788877806000073 ], [ -79.541852668999923, 8.786756789000037 ], [ -79.541236750999929, 8.781302357000072 ], [ -79.543380957999943, 8.775544614000069 ], [ -79.547980846999906, 8.774028666000049 ], [ -79.551357553999935, 8.779179747000057 ], [ -79.555347572999949, 8.782815983000091 ], [ -79.56270948699995, 8.781299764000039 ], [ -79.569153707999931, 8.78311735300008 ], [ -79.57161263799992, 8.789178986000081 ], [ -79.57039255199993, 8.798575963000076 ] ] ], [ [ [ -79.132576381999854, 8.956866310000066 ], [ -79.130530568999859, 8.959460533000026 ], [ -79.129509377999852, 8.958450242000197 ], [ -79.128782136999916, 8.954844397000045 ], [ -79.123091317999865, 8.951523107000185 ], [ -79.127034967999919, 8.948786364000171 ], [ -79.127039227999944, 8.943306586000062 ], [ -79.131418931999917, 8.943021518000137 ], [ -79.132585597999935, 8.944608663000054 ], [ -79.129955001999861, 8.948356008000076 ], [ -79.130683270999896, 8.950519661000101 ], [ -79.132434140999919, 8.951818870000068 ], [ -79.132723536999947, 8.955280099 ], [ -79.132576381999854, 8.956866310000066 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PA-2", "NAME_1": "Coclé" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -80.040801561999899, 8.39797597900008 ], [ -80.080881313999896, 8.371771552000041 ], [ -80.125843878999945, 8.348618882000039 ], [ -80.19554602799991, 8.312933661000045 ], [ -80.224964972999942, 8.301052151000079 ], [ -80.272735154999907, 8.294826565000051 ], [ -80.281605597999942, 8.295925197000088 ], [ -80.294463670999903, 8.300441799000055 ], [ -80.300038214999915, 8.301052151000079 ], [ -80.30882727799991, 8.298651434000078 ], [ -80.326283331999946, 8.290309963000084 ], [ -80.33421790299991, 8.287990627000056 ], [ -80.361480272999927, 8.294826565000051 ], [ -80.374663865999935, 8.30337148600006 ], [ -80.380726691999939, 8.310370184000078 ], [ -80.375762498999904, 8.315252997000073 ], [ -80.3857722649999, 8.311346747000073 ], [ -80.386260545999903, 8.30695221600007 ], [ -80.384755011999914, 8.301581122000073 ], [ -80.388783331999946, 8.294826565000051 ], [ -80.407012498999904, 8.283026434000078 ], [ -80.470244920999903, 8.220648505000042 ], [ -80.478179490999935, 8.202337958000044 ], [ -80.47484290299991, 8.106472072000088 ], [ -80.476104295999903, 8.094875393000052 ], [ -80.478464321999923, 8.091376044000071 ], [ -80.491437954098274, 8.095190944706303 ], [ -80.514563158063254, 8.110513007369377 ], [ -80.526448736719829, 8.11637828233188 ], [ -80.532184821372368, 8.115344753557508 ], [ -80.543553636091417, 8.106740627477961 ], [ -80.549470587897304, 8.106120509853611 ], [ -80.558488125126871, 8.112838446437138 ], [ -80.57732418526291, 8.132811388135053 ], [ -80.59122514462473, 8.13854747188833 ], [ -80.609725307976589, 8.137307237538948 ], [ -80.646415575418473, 8.125292466773885 ], [ -80.662745326635502, 8.12405223242456 ], [ -80.687007412162302, 8.132604682560043 ], [ -80.734058803970584, 8.16353302692761 ], [ -80.738089566280451, 8.180689602243319 ], [ -80.711941291257574, 8.227069200483186 ], [ -80.697446051793861, 8.277195339293485 ], [ -80.693466966327435, 8.309312242066312 ], [ -80.717987434272686, 8.348896389356867 ], [ -80.756667243098775, 8.450208035072762 ], [ -80.78007666700455, 8.491419989440942 ], [ -80.800514695796551, 8.51857595481647 ], [ -80.822089606150371, 8.537747910837425 ], [ -80.810255703437974, 8.548289903256432 ], [ -80.77873307986772, 8.553328355019573 ], [ -80.751318732073798, 8.58637543377921 ], [ -80.73940731499556, 8.615236721497467 ], [ -80.715791184615455, 8.613841458416573 ], [ -80.705688442667508, 8.629912828114527 ], [ -80.694991420617555, 8.641772569248644 ], [ -80.692588467184009, 8.652004503305193 ], [ -80.694836391885985, 8.66326996523668 ], [ -80.696102464657031, 8.675439764733369 ], [ -80.69491390715109, 8.693759060032562 ], [ -80.685327928241293, 8.715101427289028 ], [ -80.677498949416986, 8.738304144720473 ], [ -80.666982795419642, 8.752334296190782 ], [ -80.651686571178288, 8.767010402807841 ], [ -80.640188565250071, 8.772126369836087 ], [ -80.630421719186984, 8.773909207443978 ], [ -80.612024908622629, 8.770266017862411 ], [ -80.600811122635207, 8.769335841875602 ], [ -80.586135016917467, 8.769723416402542 ], [ -80.569391852751778, 8.774606838534737 ], [ -80.555077481340675, 8.781583157536659 ], [ -80.542468431372981, 8.790962429072806 ], [ -80.535853847577016, 8.80587107968654 ], [ -80.532675746888174, 8.821167303927893 ], [ -80.534691127593476, 8.852431545079753 ], [ -80.537920905125645, 8.861268215155974 ], [ -80.541409064176946, 8.866461697449381 ], [ -80.543424444882191, 8.870802517222387 ], [ -80.542184211432186, 8.880595200807875 ], [ -80.530970425444764, 8.916975408987923 ], [ -80.523942429599458, 8.924881903976654 ], [ -80.51564836278169, 8.926587226319441 ], [ -80.424516975178221, 8.892687485938723 ], [ -80.411442837217123, 8.884625963117685 ], [ -80.389687058810694, 8.878347276105899 ], [ -80.364753180614798, 8.874678249901308 ], [ -80.355477260966779, 8.871887721940823 ], [ -80.341731330336586, 8.876564439397328 ], [ -80.325530769429463, 8.888811754159121 ], [ -80.246517503579923, 8.9635358752804 ], [ -80.232823248893794, 8.973302721343487 ], [ -80.222074550899777, 8.978418687472413 ], [ -80.214581467960386, 8.985782579202635 ], [ -80.207605149857784, 8.998443305114449 ], [ -80.202385830042033, 9.02730459193333 ], [ -80.192231411250589, 9.047484239206256 ], [ -80.178227098202001, 9.021801052176784 ], [ -80.177322760636855, 9.010845649507132 ], [ -80.170501472165199, 8.976325792401383 ], [ -80.164248622675757, 8.965706284717271 ], [ -80.157479011047485, 8.959479275448189 ], [ -80.149779221633764, 8.954518337151512 ], [ -80.137454393405505, 8.949247341391697 ], [ -80.13311357273318, 8.922246404747796 ], [ -80.155696174338971, 8.888889268524906 ], [ -80.161768154876427, 8.872275295568443 ], [ -80.164507005993528, 8.854446925784998 ], [ -80.163680182794167, 8.830701605994307 ], [ -80.137609423036452, 8.755357367248678 ], [ -80.112546352731954, 8.643012804497289 ], [ -80.106784430557013, 8.626424669063226 ], [ -80.103089565930702, 8.591878974435133 ], [ -80.104407314645812, 8.583042304358855 ], [ -80.104665697064263, 8.551312974314328 ], [ -80.095622321412975, 8.52663747853677 ], [ -80.092030808674849, 8.470852769439773 ], [ -80.086475592974239, 8.455272325257567 ], [ -80.081721361151892, 8.445557156037921 ], [ -80.040801561999899, 8.39797597900008 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PA-9", "NAME_1": "Veraguas" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -81.807728644999941, 7.28742096600007 ], [ -81.798003709999932, 7.291083075000074 ], [ -81.789906378999945, 7.290106512000079 ], [ -81.780506964999915, 7.28782786700009 ], [ -81.766713019999941, 7.28742096600007 ], [ -81.779042120999918, 7.277492580000057 ], [ -81.792388475999928, 7.251654364000046 ], [ -81.800892706999946, 7.23899974200009 ], [ -81.796986456999946, 7.233954169000071 ], [ -81.793446417999917, 7.225978908000059 ], [ -81.800892706999946, 7.225978908000059 ], [ -81.816232876999948, 7.271307684000078 ], [ -81.814564581999946, 7.279974677000041 ], [ -81.818755662999934, 7.285630601000094 ], [ -81.819162563999896, 7.288723049000055 ], [ -81.814564581999946, 7.294256903000075 ], [ -81.81078040299991, 7.294134833000044 ], [ -81.808257615999935, 7.293443101000094 ], [ -81.807199673999946, 7.291571356000077 ], [ -81.807728644999941, 7.28742096600007 ] ] ], [ [ [ -81.149159308999913, 7.56118398600006 ], [ -81.135568813999896, 7.568182684000078 ], [ -81.118072068999936, 7.57453034100007 ], [ -81.087717251999948, 7.581610419000071 ], [ -81.075021938999896, 7.577337958000044 ], [ -81.061594204999949, 7.575588283000059 ], [ -81.033070441999939, 7.575425523000092 ], [ -81.044992641999897, 7.55414459800005 ], [ -81.052845831999946, 7.544623114000046 ], [ -81.064116990999935, 7.540676174000055 ], [ -81.075021938999896, 7.535345770000049 ], [ -81.082753058999913, 7.53384023600006 ], [ -81.091420050999943, 7.537543036000045 ], [ -81.097767706999946, 7.542547919000071 ], [ -81.103342251999948, 7.54555898600006 ], [ -81.109852667999917, 7.547064520000049 ], [ -81.119048631999931, 7.54751211100006 ], [ -81.129261847999942, 7.545314846000053 ], [ -81.134388800999943, 7.539943752000056 ], [ -81.137847459999932, 7.533392645000049 ], [ -81.142974412999934, 7.52765534100007 ], [ -81.170887824999909, 7.513373114000046 ], [ -81.184925910999937, 7.496975002000056 ], [ -81.190744594999899, 7.493475653000075 ], [ -81.199126756999931, 7.493475653000075 ], [ -81.208566860999952, 7.495591539000088 ], [ -81.215809699999909, 7.498277085000041 ], [ -81.218088344999899, 7.499701239000046 ], [ -81.245676235999952, 7.490057684000078 ], [ -81.251942511999914, 7.490423895000049 ], [ -81.242583787999934, 7.503404039000088 ], [ -81.232899542999917, 7.513373114000046 ], [ -81.222727016999897, 7.521063544000071 ], [ -81.210438605999911, 7.525946356000077 ], [ -81.174387173999946, 7.531439520000049 ], [ -81.164051886999914, 7.540513414000088 ], [ -81.157622850999928, 7.551581122000073 ], [ -81.149159308999913, 7.56118398600006 ] ] ], [ [ [ -81.66437740799995, 7.397284247000073 ], [ -81.652495897999927, 7.391017971000053 ], [ -81.622059699999909, 7.393866278000075 ], [ -81.61587480399993, 7.386704820000091 ], [ -81.588002081999946, 7.335191148000092 ], [ -81.606678839999915, 7.32758209800005 ], [ -81.628163214999915, 7.321600653000075 ], [ -81.649403449999909, 7.321519273000092 ], [ -81.68423417899993, 7.341376044000071 ], [ -81.727121548999946, 7.344427802000041 ], [ -81.746245897999927, 7.348863023000092 ], [ -81.756703253999945, 7.35773346600007 ], [ -81.780751105999911, 7.38422272300005 ], [ -81.800038214999915, 7.395575262000079 ], [ -81.841867641999897, 7.430812893000052 ], [ -81.864654100999928, 7.478461005000042 ], [ -81.872873501999948, 7.486029364000046 ], [ -81.875111456999946, 7.490423895000049 ], [ -81.882801886999914, 7.516791083000044 ], [ -81.878895636999914, 7.517482815000051 ], [ -81.85806230399993, 7.517523505000042 ], [ -81.848703579999949, 7.520209052000041 ], [ -81.848947719999899, 7.524115302000041 ], [ -81.83625240799995, 7.546698309000078 ], [ -81.834380662999934, 7.54751211100006 ], [ -81.831776495999918, 7.559271552000041 ], [ -81.831410285999937, 7.568182684000078 ], [ -81.829986131999931, 7.576157945000091 ], [ -81.82445227799991, 7.585353908000059 ], [ -81.816802537999934, 7.590399481000077 ], [ -81.798329230999911, 7.594224351000037 ], [ -81.770130988999938, 7.614813544000071 ], [ -81.760365363999938, 7.620184637000079 ], [ -81.759917772999927, 7.616400458000044 ], [ -81.752512173999946, 7.616400458000044 ], [ -81.755238410999937, 7.624009507000039 ], [ -81.757313605999911, 7.636419989000046 ], [ -81.759917772999927, 7.644273179000038 ], [ -81.752512173999946, 7.644273179000038 ], [ -81.752512173999946, 7.636867580000057 ], [ -81.746245897999927, 7.636867580000057 ], [ -81.746815558999913, 7.641831773000092 ], [ -81.745350714999915, 7.64329661700009 ], [ -81.74242102799991, 7.643459377000056 ], [ -81.738840298999946, 7.644273179000038 ], [ -81.716175910999937, 7.579657294000071 ], [ -81.715199347999942, 7.568019924000055 ], [ -81.713286912999934, 7.565904039000088 ], [ -81.70531165299991, 7.553697007000039 ], [ -81.704823370999918, 7.55109284100007 ], [ -81.705922003999945, 7.543117580000057 ], [ -81.70531165299991, 7.540676174000055 ], [ -81.702137824999909, 7.540187893000052 ], [ -81.693837042999917, 7.541408596000053 ], [ -81.691029425999943, 7.540676174000055 ], [ -81.682036912999934, 7.534572658000059 ], [ -81.675648566999939, 7.532131252000056 ], [ -81.671783006999931, 7.526353257000039 ], [ -81.670521613999938, 7.510239976000094 ], [ -81.676380988999938, 7.505519924000055 ], [ -81.708363410999937, 7.493475653000075 ], [ -81.709339972999942, 7.48663971600007 ], [ -81.716786261999914, 7.457505601000094 ], [ -81.71898352799991, 7.452541408000059 ], [ -81.712717251999948, 7.44009023600006 ], [ -81.694732225999928, 7.423976955000057 ], [ -81.691029425999943, 7.414048570000091 ], [ -81.689198370999918, 7.403794664000088 ], [ -81.684437628999945, 7.395005601000094 ], [ -81.677886522999927, 7.391587632000039 ], [ -81.670521613999938, 7.397284247000073 ], [ -81.66437740799995, 7.397284247000073 ] ] ], [ [ [ -81.213072785999941, 8.791808601000071 ], [ -81.17478467299992, 8.796765778000065 ], [ -81.130340235999938, 8.801736471000083 ], [ -81.087717251999948, 8.808742580000057 ], [ -81.079904751999948, 8.804836330000057 ], [ -81.070708787999934, 8.806830145000049 ], [ -81.061512824999909, 8.813177802000041 ], [ -81.053578253999945, 8.822414455000057 ], [ -80.97513893799993, 8.848088992000044 ], [ -80.898923209999907, 8.879635169000039 ], [ -80.881717073999937, 8.885697916000083 ], [ -80.862597200663629, 8.885066039578389 ], [ -80.861983811803441, 8.876900336181563 ], [ -80.861725430284366, 8.874161485064462 ], [ -80.860330166304095, 8.853594265063293 ], [ -80.856842007252794, 8.844111639840321 ], [ -80.851183437865359, 8.832716986699552 ], [ -80.840693122289736, 8.820857245565435 ], [ -80.833432583347019, 8.814552721031248 ], [ -80.815087449626105, 8.802615465531289 ], [ -80.797827520623571, 8.794553940911612 ], [ -80.78025753415784, 8.788895372423497 ], [ -80.769017909748698, 8.784063626235366 ], [ -80.761524827708627, 8.779490261566309 ], [ -80.740440842870612, 8.755744940876298 ], [ -80.733542040033115, 8.74458283083294 ], [ -80.728193529008138, 8.730139268212668 ], [ -80.732921923308083, 8.714868883292297 ], [ -80.73863216774032, 8.70282827410557 ], [ -80.741965298060052, 8.690813503340507 ], [ -80.738115403802851, 8.672494208041257 ], [ -80.733361171980505, 8.66443268522022 ], [ -80.727935146589743, 8.658619086201838 ], [ -80.725790574675273, 8.653038031180188 ], [ -80.723904385179196, 8.64611338992097 ], [ -80.73940731499556, 8.615236721497467 ], [ -80.751318732073798, 8.58637543377921 ], [ -80.77873307986772, 8.553328355019573 ], [ -80.810255703437974, 8.548289903256432 ], [ -80.822089606150371, 8.537747910837425 ], [ -80.800514695796551, 8.51857595481647 ], [ -80.78007666700455, 8.491419989440942 ], [ -80.756667243098775, 8.450208035072762 ], [ -80.717987434272686, 8.348896389356867 ], [ -80.693466966327435, 8.309312242066312 ], [ -80.697446051793861, 8.277195339293485 ], [ -80.711941291257574, 8.227069200483186 ], [ -80.738089566280451, 8.180689602243319 ], [ -80.734058803970584, 8.16353302692761 ], [ -80.687007412162302, 8.132604682560043 ], [ -80.709745043399039, 8.130718492164647 ], [ -80.71876257972923, 8.132966416866623 ], [ -80.732379320049574, 8.133353990494243 ], [ -80.742042813325156, 8.129788316177837 ], [ -80.764702928397412, 8.102554836436525 ], [ -80.780955166147976, 8.087956244185307 ], [ -80.817025315965566, 8.073616034352483 ], [ -80.853560553776504, 8.059947618088074 ], [ -80.837980108695035, 8.015893459815288 ], [ -80.839194506421336, 8.00036469247658 ], [ -80.849943202616714, 7.980831000350349 ], [ -80.857772183239661, 7.969565538418863 ], [ -80.886349250117803, 7.944347439382796 ], [ -80.907407395634777, 7.92186819146383 ], [ -80.93290971461164, 7.915408637298754 ], [ -80.93774146169909, 7.911067817525748 ], [ -80.943425868608927, 7.90145600019423 ], [ -80.946991542925332, 7.788413805452763 ], [ -80.942754075939831, 7.765831203846972 ], [ -80.919499680765625, 7.771799832496242 ], [ -80.909474453183464, 7.767691554921328 ], [ -80.904771898204501, 7.76327321988316 ], [ -80.897563036105225, 7.753247992300999 ], [ -80.891671922721059, 7.737435004122119 ], [ -80.884928147715812, 7.708651230769647 ], [ -80.879217902384255, 7.695318712188794 ], [ -80.802064989407711, 7.58116547340785 ], [ -80.772299364124365, 7.563647161986921 ], [ -80.751861335332364, 7.559228826948811 ], [ -80.745737677951468, 7.55574066789751 ], [ -80.719692755716096, 7.529592392874633 ], [ -80.722069871627241, 7.50173879640829 ], [ -80.715067715102975, 7.458899034063165 ], [ -80.699254726924096, 7.410710760693064 ], [ -80.673468187107119, 7.37595836048996 ], [ -80.667137824151268, 7.352523098162465 ], [ -80.666595221792022, 7.337795314702021 ], [ -80.668765632128213, 7.327304999126397 ], [ -80.668068000138078, 7.322809149722445 ], [ -80.653366055099355, 7.318003241056715 ], [ -80.644245165082282, 7.312577216565273 ], [ -80.623497077028446, 7.297203477058815 ], [ -80.613290982292995, 7.285808823918103 ], [ -80.606779751284478, 7.271830349291179 ], [ -80.6040750717072, 7.236721022557106 ], [ -80.71312415299991, 7.216457424000055 ], [ -80.793365037999934, 7.213568427000041 ], [ -80.813994920999903, 7.219142971000053 ], [ -80.820790167999917, 7.219142971000053 ], [ -80.825957811999899, 7.213324286000045 ], [ -80.8310847649999, 7.211371161000045 ], [ -80.836211717999902, 7.213324286000045 ], [ -80.841297980999911, 7.219142971000053 ], [ -80.848133917999917, 7.219142971000053 ], [ -80.861805792999917, 7.20571523600006 ], [ -80.873076951999906, 7.212551174000055 ], [ -80.889068162999934, 7.239040432000081 ], [ -80.894439256999931, 7.243434963000084 ], [ -80.901763475999928, 7.248114325000074 ], [ -80.910552537999934, 7.251776434000078 ], [ -80.920074022999927, 7.253322658000059 ], [ -80.929717576999906, 7.25649648600006 ], [ -80.930165167999917, 7.263576565000051 ], [ -80.925567186999899, 7.270575262000079 ], [ -80.920074022999927, 7.27374909100007 ], [ -80.916005011999914, 7.278143622000073 ], [ -80.917144334999932, 7.299627997000073 ], [ -80.916371222999942, 7.307928778000075 ], [ -80.9111628899999, 7.315008856000077 ], [ -80.899932420999903, 7.323513088000084 ], [ -80.895985480999911, 7.328395901000079 ], [ -80.892364061999899, 7.341742255000042 ], [ -80.891590949999909, 7.360174872000073 ], [ -80.895659959999932, 7.376613674000055 ], [ -80.921172654999907, 7.39203522300005 ], [ -80.920806443999936, 7.41079336100006 ], [ -80.910186326999906, 7.441677151000079 ], [ -80.9150691399999, 7.454657294000071 ], [ -80.951161261999914, 7.493475653000075 ], [ -80.954619920999903, 7.495510158000059 ], [ -80.962188279999907, 7.502468166000085 ], [ -80.966908331999946, 7.509914455000057 ], [ -80.954701300999943, 7.516913153000075 ], [ -80.952748175999943, 7.525458075000074 ], [ -80.951649542999917, 7.535589911000045 ], [ -80.947743292999917, 7.544094143000052 ], [ -80.9463191399999, 7.555690822000088 ], [ -80.95571855399993, 7.569647528000075 ], [ -80.96898352799991, 7.582058010000083 ], [ -80.979115363999938, 7.589056708000044 ], [ -80.979115363999938, 7.595892645000049 ], [ -80.971669074999909, 7.595892645000049 ], [ -80.971669074999909, 7.602728583000044 ], [ -81.020049607999908, 7.650539455000057 ], [ -81.02993730399993, 7.656073309000078 ], [ -81.037505662999934, 7.658270575000074 ], [ -81.041289842999902, 7.661688544000071 ], [ -81.039906378999945, 7.671047268000052 ], [ -81.035186326999906, 7.679958401000079 ], [ -81.027821417999917, 7.68618398600006 ], [ -81.017852342999902, 7.688421942000048 ], [ -81.005767381999931, 7.685329494000086 ], [ -81.010609503999945, 7.693915106000077 ], [ -81.021839972999942, 7.70266347900008 ], [ -81.034453904999907, 7.70929596600007 ], [ -81.043324347999942, 7.711981512000079 ], [ -81.044829881999931, 7.716701565000051 ], [ -81.026234503999945, 7.74673086100006 ], [ -81.037139451999906, 7.745998440000051 ], [ -81.046864386999914, 7.747219143000052 ], [ -81.054839647999927, 7.750026760000083 ], [ -81.061024542999917, 7.754177151000079 ], [ -81.057606574999909, 7.754950262000079 ], [ -81.054798956999946, 7.754828192000048 ], [ -81.053252732999908, 7.755926825000074 ], [ -81.053578253999945, 7.76040273600006 ], [ -81.076690232999908, 7.764797268000052 ], [ -81.086089647999927, 7.779120184000078 ], [ -81.085438605999911, 7.794338283000059 ], [ -81.078114386999914, 7.801336981000077 ], [ -81.07249915299991, 7.803534247000073 ], [ -81.067494269999941, 7.808172919000071 ], [ -81.060821092999902, 7.812892971000053 ], [ -81.050160285999937, 7.815008856000077 ], [ -81.037627732999908, 7.815008856000077 ], [ -81.02757727799991, 7.816799221000053 ], [ -81.021270311999899, 7.822699286000045 ], [ -81.020049607999908, 7.835516669000071 ], [ -81.026234503999945, 7.835516669000071 ], [ -81.048858201999906, 7.822699286000045 ], [ -81.055897589999915, 7.849391994000086 ], [ -81.053578253999945, 7.911200262000079 ], [ -81.0752253899999, 7.871283270000049 ], [ -81.090443488999938, 7.857855536000045 ], [ -81.101958787999934, 7.877101955000057 ], [ -81.108184373999904, 7.877101955000057 ], [ -81.105946417999917, 7.866400458000044 ], [ -81.102162238999938, 7.858587958000044 ], [ -81.096302863999938, 7.85305410400008 ], [ -81.087676561999899, 7.849188544000071 ], [ -81.087676561999899, 7.842311916000085 ], [ -81.13304602799991, 7.842311916000085 ], [ -81.142364061999899, 7.844427802000041 ], [ -81.154815232999908, 7.85382721600007 ], [ -81.167144334999932, 7.855983791000085 ], [ -81.1924128899999, 7.863348700000074 ], [ -81.197377081999946, 7.879055080000057 ], [ -81.199940558999913, 7.893622137000079 ], [ -81.218047654999907, 7.897528387000079 ], [ -81.208159959999932, 7.893459377000056 ], [ -81.205230272999927, 7.889919338000084 ], [ -81.204375779999907, 7.883327541000085 ], [ -81.217640753999945, 7.878973700000074 ], [ -81.215199347999942, 7.870998440000051 ], [ -81.197539842999902, 7.855983791000085 ], [ -81.180205857999908, 7.846869208000044 ], [ -81.177113410999937, 7.845729885000083 ], [ -81.178700324999909, 7.836859442000048 ], [ -81.181630011999914, 7.829657294000071 ], [ -81.183257615999935, 7.82367584800005 ], [ -81.16470292899993, 7.789007880000042 ], [ -81.174427863999938, 7.763006903000075 ], [ -81.196685350999928, 7.74172597900008 ], [ -81.218047654999907, 7.726263739000046 ], [ -81.222401495999918, 7.734401760000083 ], [ -81.223174607999908, 7.739203192000048 ], [ -81.221465623999904, 7.742702541000085 ], [ -81.218047654999907, 7.74673086100006 ], [ -81.218047654999907, 7.754177151000079 ], [ -81.232045050999943, 7.755031643000052 ], [ -81.245961066999939, 7.754177151000079 ], [ -81.245961066999939, 7.74673086100006 ], [ -81.2353816399999, 7.743841864000046 ], [ -81.229481574999909, 7.73781972900008 ], [ -81.218047654999907, 7.719427802000041 ], [ -81.231556769999941, 7.71438222900008 ], [ -81.237416144999941, 7.715114651000079 ], [ -81.245961066999939, 7.719427802000041 ], [ -81.238677537999934, 7.707464911000045 ], [ -81.231678839999915, 7.698919989000046 ], [ -81.225493943999936, 7.698919989000046 ], [ -81.212147589999915, 7.706122137000079 ], [ -81.197539842999902, 7.711981512000079 ], [ -81.193267381999931, 7.700751044000071 ], [ -81.197539842999902, 7.657375393000052 ], [ -81.195464647999927, 7.645697333000044 ], [ -81.195179816999939, 7.638861395000049 ], [ -81.197539842999902, 7.630072333000044 ], [ -81.201324022999927, 7.625189520000049 ], [ -81.213408982999908, 7.615423895000049 ], [ -81.218047654999907, 7.608954169000071 ], [ -81.225493943999936, 7.608954169000071 ], [ -81.234038865999935, 7.615261135000083 ], [ -81.266224738999938, 7.632391669000071 ], [ -81.273304816999939, 7.633490302000041 ], [ -81.278716600999928, 7.646063544000071 ], [ -81.291167772999927, 7.650661526000079 ], [ -81.314239061999899, 7.650539455000057 ], [ -81.396962042999917, 7.673529364000046 ], [ -81.424102342999902, 7.671047268000052 ], [ -81.428212042999917, 7.682562567000048 ], [ -81.434925910999937, 7.692653713000084 ], [ -81.442901170999903, 7.700466213000084 ], [ -81.450795050999943, 7.705145575000074 ], [ -81.473907029999907, 7.699408270000049 ], [ -81.503448045999903, 7.701971747000073 ], [ -81.525786912999934, 7.711452541000085 ], [ -81.527129686999899, 7.726263739000046 ], [ -81.518666144999941, 7.728908596000053 ], [ -81.499989386999914, 7.738674221000053 ], [ -81.488758917999917, 7.749212958000044 ], [ -81.528065558999913, 7.760565497000073 ], [ -81.539051886999914, 7.75735097900008 ], [ -81.540191209999932, 7.739935614000046 ], [ -81.563221808999913, 7.756293036000045 ], [ -81.574940558999913, 7.76040273600006 ], [ -81.574940558999913, 7.767238674000055 ], [ -81.568389451999906, 7.77602773600006 ], [ -81.573882615999935, 7.784328518000052 ], [ -81.583119269999941, 7.793402411000045 ], [ -81.588002081999946, 7.804470119000086 ], [ -81.586293097999942, 7.820868231000077 ], [ -81.581776495999918, 7.83156972900008 ], [ -81.567494269999941, 7.849188544000071 ], [ -81.567494269999941, 7.855983791000085 ], [ -81.574615037999934, 7.860663153000075 ], [ -81.581898566999939, 7.862494208000044 ], [ -81.588978644999941, 7.861110744000086 ], [ -81.595448370999918, 7.855983791000085 ], [ -81.601592576999906, 7.855983791000085 ], [ -81.609120245999918, 7.86281972900008 ], [ -81.609120245999918, 7.870266018000052 ], [ -81.599761522999927, 7.877834377000056 ], [ -81.599883592999902, 7.885036526000079 ], [ -81.608021613999938, 7.889837958000044 ], [ -81.622710740999935, 7.89008209800005 ], [ -81.619618292999917, 7.905340887000079 ], [ -81.618682420999903, 7.922023830000057 ], [ -81.612945115999935, 7.931423244000086 ], [ -81.595448370999918, 7.924872137000079 ], [ -81.598011847999942, 7.933783270000049 ], [ -81.602080857999908, 7.940008856000077 ], [ -81.61587480399993, 7.952175197000088 ], [ -81.611236131999931, 7.95962148600006 ], [ -81.612945115999935, 7.974188544000071 ], [ -81.609120245999918, 7.986354885000083 ], [ -81.62132727799991, 7.981350002000056 ], [ -81.627105272999927, 7.982814846000053 ], [ -81.628895636999914, 7.981838283000059 ], [ -81.628936326999906, 7.969265041000085 ], [ -81.624134894999941, 7.95538971600007 ], [ -81.622588670999903, 7.947943427000041 ], [ -81.625884568999936, 7.944728908000059 ], [ -81.633290167999917, 7.945868231000077 ], [ -81.638457811999899, 7.949245510000083 ], [ -81.641590949999909, 7.954657294000071 ], [ -81.642608201999906, 7.962103583000044 ], [ -81.645904100999928, 7.973089911000045 ], [ -81.663574609280772, 7.997287569465755 ], [ -81.662555100937141, 7.99765167888188 ], [ -81.64247880735104, 8.0030001899068 ], [ -81.638008796368865, 8.011242580780447 ], [ -81.633771327584668, 8.022714749186321 ], [ -81.631755947778743, 8.034987901470458 ], [ -81.606124436693392, 8.134904283206083 ], [ -81.601886969707891, 8.145058701997471 ], [ -81.597907884241465, 8.152060859421113 ], [ -81.573180711620523, 8.176116238473639 ], [ -81.522951219123456, 8.239032294404865 ], [ -81.517137621004395, 8.243760687805491 ], [ -81.51550981302745, 8.246086126873251 ], [ -81.513106858694584, 8.251047065169928 ], [ -81.510471361264308, 8.281226100703975 ], [ -81.513210212381409, 8.310707506046526 ], [ -81.51933386886293, 8.341739203201655 ], [ -81.522486132029371, 8.379333808208685 ], [ -81.526671923070751, 8.429201565499852 ], [ -81.525715908662221, 8.443851833695135 ], [ -81.522511969551715, 8.460465807550975 ], [ -81.49930925212027, 8.516095486117763 ], [ -81.490317552413103, 8.555886338983328 ], [ -81.488612230070373, 8.596943263720618 ], [ -81.463161587037575, 8.583972480345665 ], [ -81.432362433879177, 8.576686102981228 ], [ -81.42122616225754, 8.571880195214817 ], [ -81.415231696085868, 8.568081976901681 ], [ -81.410529141106963, 8.558521837312924 ], [ -81.363477749298681, 8.554956162996518 ], [ -81.337484503906694, 8.560227158756334 ], [ -81.328518642621248, 8.558056749319519 ], [ -81.282345750855711, 8.52221914349866 ], [ -81.265550909846581, 8.511599635814548 ], [ -81.225139940256042, 8.500954291507355 ], [ -81.203254970640387, 8.492195135796862 ], [ -81.192041184652908, 8.489404608735697 ], [ -81.183617926625971, 8.489404608735697 ], [ -81.15607438762288, 8.495528266116594 ], [ -81.171603155860964, 8.510979519089517 ], [ -81.180258958783895, 8.526559963271666 ], [ -81.183824632200981, 8.535706691710459 ], [ -81.188320481604933, 8.544104112214995 ], [ -81.195916918231148, 8.552320665566242 ], [ -81.204546881833096, 8.565291448941196 ], [ -81.210541348004767, 8.586297919413425 ], [ -81.214520432571874, 8.62322072995272 ], [ -81.211238979994903, 8.683837185237905 ], [ -81.22273698592312, 8.757760321581543 ], [ -81.215915696552145, 8.782900906251825 ], [ -81.215941534973865, 8.788249417276745 ], [ -81.213072785999941, 8.791808601000071 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PA-3", "NAME_1": "Colón" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -80.57933726999994, 9.08068731700007 ], [ -80.506772714999897, 9.110891244000072 ], [ -80.408315861999938, 9.14226211600004 ], [ -80.292591925999943, 9.151353257000039 ], [ -80.277455206999946, 9.156398830000057 ], [ -80.24478105399993, 9.175116278000075 ], [ -80.234934048999946, 9.179266669000071 ], [ -80.199940558999913, 9.183172919000071 ], [ -80.162912563999896, 9.192938544000071 ], [ -80.129709438999896, 9.206203518000052 ], [ -80.100819464999915, 9.222316799000055 ], [ -80.065200701999913, 9.262480813000082 ], [ -80.026193813999896, 9.296616929000038 ], [ -80.000823381999908, 9.320515588000092 ], [ -79.99850467899995, 9.331796456000063 ], [ -79.978943743999935, 9.36335312600005 ], [ -79.953731057999903, 9.373433893000083 ], [ -79.947436411999945, 9.372848822000037 ], [ -79.943755662999934, 9.36359284100007 ], [ -79.945912238999938, 9.325873114000046 ], [ -79.943755662999934, 9.31586334800005 ], [ -79.938221808999913, 9.309149481000077 ], [ -79.929432745999918, 9.30414459800005 ], [ -79.919178839999915, 9.303168036000045 ], [ -79.909047003999945, 9.308417059000078 ], [ -79.901600714999915, 9.326646226000037 ], [ -79.900257941999939, 9.346828518000052 ], [ -79.894683397999927, 9.356431382000039 ], [ -79.874867316999939, 9.343166408000059 ], [ -79.877064581999946, 9.351629950000074 ], [ -79.879505988999938, 9.368801174000055 ], [ -79.881703253999945, 9.37726471600007 ], [ -79.879302537999934, 9.375433661000045 ], [ -79.874867316999939, 9.371079820000091 ], [ -79.868031378999945, 9.37726471600007 ], [ -79.880401583999912, 9.39464028000009 ], [ -79.871211531999904, 9.404204787000083 ], [ -79.85978611999991, 9.399083630000064 ], [ -79.840898126999946, 9.400709095000082 ], [ -79.818623143999901, 9.39103205400005 ], [ -79.800363735999952, 9.36078522300005 ], [ -79.792958136999914, 9.349351304000038 ], [ -79.796986456999946, 9.371283270000049 ], [ -79.802154100999928, 9.386664130000042 ], [ -79.802723761999914, 9.400580145000049 ], [ -79.792958136999914, 9.418198960000041 ], [ -79.778146938999896, 9.431586005000042 ], [ -79.74828040299991, 9.442531643000052 ], [ -79.731516079999949, 9.453029690000051 ], [ -79.729359503999945, 9.455959377000056 ], [ -79.726633266999897, 9.463364976000037 ], [ -79.724720831999946, 9.466701565000051 ], [ -79.721302863999938, 9.469224351000037 ], [ -79.714654536999944, 9.479844922000041 ], [ -79.705462690999923, 9.485459786000092 ], [ -79.690629719999947, 9.495799408000039 ], [ -79.6842831539999, 9.521478175000084 ], [ -79.677374585999928, 9.545607528000062 ], [ -79.6596830229999, 9.552373618000047 ], [ -79.651662453999904, 9.55969390000007 ], [ -79.656484815999931, 9.564962828000091 ], [ -79.66772035799994, 9.560802323000075 ], [ -79.676503058999913, 9.558417059000078 ], [ -79.682157668999935, 9.564526740000076 ], [ -79.675731972999927, 9.568706321000093 ], [ -79.66984326599993, 9.572886580000045 ], [ -79.664484856999934, 9.583370031000072 ], [ -79.650031054999943, 9.589606428000081 ], [ -79.638852935999921, 9.598508694000088 ], [ -79.630335196999908, 9.608473537000066 ], [ -79.612210227999924, 9.613666727000066 ], [ -79.596242733999929, 9.611521288000063 ], [ -79.576548929999944, 9.617789961000085 ], [ -79.550968549999936, 9.629292480000061 ], [ -79.532866990999935, 9.624335028000075 ], [ -79.52798417899993, 9.612453518000052 ], [ -79.522613084999932, 9.602850653000075 ], [ -79.522450324999909, 9.595282294000071 ], [ -79.532866990999935, 9.589544989000046 ], [ -79.532866990999935, 9.583319403000075 ], [ -79.523060675999943, 9.579046942000048 ], [ -79.522816535999937, 9.576727606000077 ], [ -79.519195115999935, 9.56907786700009 ], [ -79.51431230399993, 9.572495835000041 ], [ -79.510731574999909, 9.57453034100007 ], [ -79.507883266999897, 9.577378648000092 ], [ -79.504994269999941, 9.583319403000075 ], [ -79.498158331999946, 9.583319403000075 ], [ -79.492014126999948, 9.578680731000077 ], [ -79.483876105999911, 9.575018622000073 ], [ -79.463978644999941, 9.56907786700009 ], [ -79.463490363999938, 9.577704169000071 ], [ -79.456532355999911, 9.596380927000041 ], [ -79.451242641999897, 9.587388414000088 ], [ -79.444569464999915, 9.583807684000078 ], [ -79.437245245999918, 9.58470286700009 ], [ -79.429839647999927, 9.589544989000046 ], [ -79.391892219999932, 9.580501864000041 ], [ -79.336046023999927, 9.574359218000041 ], [ -79.272749655999917, 9.557021313000064 ], [ -79.2397089829999, 9.545515083000055 ], [ -79.193757228999914, 9.53960210200006 ], [ -79.175003644999947, 9.549403746000053 ], [ -79.156274363999898, 9.554955061000044 ], [ -79.133276086999899, 9.553404717000092 ], [ -79.116036741999949, 9.551889715000073 ], [ -79.098771641999917, 9.556032194000068 ], [ -79.080066530999943, 9.56157950000005 ], [ -79.074532601798481, 9.562041560085573 ], [ -79.074547696019351, 9.541278388187038 ], [ -79.074986944691716, 9.457278347417798 ], [ -79.078914354214078, 9.450999661305332 ], [ -79.087001716356099, 9.448751735704036 ], [ -79.095502488748821, 9.447744045351385 ], [ -79.102220425332348, 9.445883694277029 ], [ -79.11263322564281, 9.439449978533673 ], [ -79.120875617415777, 9.431517646022542 ], [ -79.132218593713105, 9.415239569850257 ], [ -79.135577561555181, 9.405524399731235 ], [ -79.137282883897967, 9.389943956448406 ], [ -79.139143235871643, 9.38351023980573 ], [ -79.142062954142034, 9.377851671317558 ], [ -79.148083258735369, 9.372012233877456 ], [ -79.157074958442536, 9.366586209386014 ], [ -79.176246913564171, 9.360152492743339 ], [ -79.192680020266721, 9.352685248225612 ], [ -79.220352748680398, 9.335554511331623 ], [ -79.239318000025662, 9.320490831087 ], [ -79.243477952645378, 9.320568346352104 ], [ -79.246991950118399, 9.330748603565212 ], [ -79.239808926440787, 9.339740302373059 ], [ -79.238672044878967, 9.344081122146065 ], [ -79.238103604098058, 9.34973969243282 ], [ -79.239343838447382, 9.356741848057823 ], [ -79.242728644711178, 9.363563137428855 ], [ -79.248077154836835, 9.368911648453775 ], [ -79.257068853644682, 9.372244777874187 ], [ -79.261616380791338, 9.375655422559703 ], [ -79.261513028003833, 9.380952256741239 ], [ -79.253761562645991, 9.391339220428677 ], [ -79.252082078724925, 9.396610216188492 ], [ -79.256707119338046, 9.402423814307554 ], [ -79.266939053394594, 9.407307237339126 ], [ -79.29016760924776, 9.415084540219368 ], [ -79.307789272556874, 9.414851996222637 ], [ -79.318176236244312, 9.412216497893041 ], [ -79.328614874976495, 9.403896593552929 ], [ -79.334893561988281, 9.402346299941769 ], [ -79.358793911409862, 9.402501329572715 ], [ -79.368147346322985, 9.400563463233254 ], [ -79.384477098439334, 9.394904892946442 ], [ -79.391427578120215, 9.393974717858953 ], [ -79.396130133998497, 9.395912584198413 ], [ -79.398791469850437, 9.40296641756612 ], [ -79.397267014660997, 9.409012558782536 ], [ -79.393753018087295, 9.414154364232502 ], [ -79.388352831118254, 9.417565008918018 ], [ -79.376028001990676, 9.422913519942995 ], [ -79.371402961377555, 9.425393987742325 ], [ -79.369697639034825, 9.428262030068595 ], [ -79.371247931746666, 9.432525336375136 ], [ -79.381195644963043, 9.445263577552055 ], [ -79.384606288749239, 9.45092214604017 ], [ -79.391220873444524, 9.459526272119774 ], [ -79.399721645837246, 9.46614085501642 ], [ -79.416128913218756, 9.472497057293367 ], [ -79.440778570574537, 9.479008287402507 ], [ -79.485194464952599, 9.469396470970366 ], [ -79.522504849119457, 9.454255276359902 ], [ -79.548498093612125, 9.365888577395935 ], [ -79.550590989582474, 9.355579128074282 ], [ -79.549893357592339, 9.348344428452606 ], [ -79.547180344896958, 9.344468695773685 ], [ -79.547542080102914, 9.333926703354678 ], [ -79.551908739196961, 9.318320420750808 ], [ -79.565060390624524, 9.284575710000979 ], [ -79.56999548960016, 9.26362091727151 ], [ -79.57193335593962, 9.248815619445281 ], [ -79.567515020901453, 9.230961412139436 ], [ -79.568781093672499, 9.22390757877173 ], [ -79.573716192648135, 9.218249010283557 ], [ -79.58774634501782, 9.212125352003397 ], [ -79.604747890702583, 9.20713857708364 ], [ -79.622292039645913, 9.198999538997498 ], [ -79.629345873013619, 9.193573512707417 ], [ -79.635159471132681, 9.189852810558762 ], [ -79.641567349353693, 9.16261932991813 ], [ -79.669756842604215, 9.128151150555141 ], [ -79.687921109171839, 9.115981350159188 ], [ -79.704741786803993, 9.110012722409181 ], [ -79.756237352072105, 9.10923757605326 ], [ -79.778225673575946, 9.114353543081563 ], [ -79.789542813250193, 9.126239121738081 ], [ -79.808559739640259, 9.158123481413497 ], [ -79.819050056115202, 9.167890326577322 ], [ -79.830005458784854, 9.173238836702922 ], [ -79.857988247359685, 9.179284979718034 ], [ -79.889252489410865, 9.193961086335037 ], [ -79.905943976733113, 9.190627956914682 ], [ -79.920671760193557, 9.175176703042382 ], [ -79.962684699339377, 9.083476873758684 ], [ -79.9573361883144, 9.066165268812085 ], [ -79.948990444653305, 9.050739854260826 ], [ -79.945502284702684, 9.039086818701719 ], [ -79.945192227239488, 9.023738918516244 ], [ -79.95061825173093, 9.007977607180806 ], [ -79.955940925233506, 8.996970526768393 ], [ -79.985396491255074, 8.977798569848119 ], [ -80.022241787428527, 8.966171372710676 ], [ -80.050172899159975, 8.96834178304681 ], [ -80.0926509262992, 8.983689683232285 ], [ -80.137454393405505, 8.949247341391697 ], [ -80.149779221633764, 8.954518337151512 ], [ -80.157479011047485, 8.959479275448189 ], [ -80.164248622675757, 8.965706284717271 ], [ -80.170501472165199, 8.976325792401383 ], [ -80.177322760636855, 9.010845649507132 ], [ -80.178227098202001, 9.021801052176784 ], [ -80.192231411250589, 9.047484239206256 ], [ -80.202385830042033, 9.02730459193333 ], [ -80.207605149857784, 8.998443305114449 ], [ -80.214581467960386, 8.985782579202635 ], [ -80.222074550899777, 8.978418687472413 ], [ -80.232823248893794, 8.973302721343487 ], [ -80.246517503579923, 8.9635358752804 ], [ -80.325530769429463, 8.888811754159121 ], [ -80.341731330336586, 8.876564439397328 ], [ -80.355477260966779, 8.871887721940823 ], [ -80.364753180614798, 8.874678249901308 ], [ -80.389687058810694, 8.878347276105899 ], [ -80.411442837217123, 8.884625963117685 ], [ -80.424516975178221, 8.892687485938723 ], [ -80.51564836278169, 8.926587226319441 ], [ -80.523942429599458, 8.924881903976654 ], [ -80.530970425444764, 8.916975408987923 ], [ -80.542184211432186, 8.880595200807875 ], [ -80.543424444882191, 8.870802517222387 ], [ -80.541409064176946, 8.866461697449381 ], [ -80.537920905125645, 8.861268215155974 ], [ -80.534691127593476, 8.852431545079753 ], [ -80.532675746888174, 8.821167303927893 ], [ -80.535853847577016, 8.80587107968654 ], [ -80.542468431372981, 8.790962429072806 ], [ -80.555077481340675, 8.781583157536659 ], [ -80.569391852751778, 8.774606838534737 ], [ -80.586135016917467, 8.769723416402542 ], [ -80.600811122635207, 8.769335841875602 ], [ -80.612024908622629, 8.770266017862411 ], [ -80.630421719186984, 8.773909207443978 ], [ -80.640188565250071, 8.772126369836087 ], [ -80.651686571178288, 8.767010402807841 ], [ -80.666982795419642, 8.752334296190782 ], [ -80.677498949416986, 8.738304144720473 ], [ -80.685327928241293, 8.715101427289028 ], [ -80.69491390715109, 8.693759060032562 ], [ -80.696102464657031, 8.675439764733369 ], [ -80.694836391885985, 8.66326996523668 ], [ -80.692588467184009, 8.652004503305193 ], [ -80.694991420617555, 8.641772569248644 ], [ -80.705688442667508, 8.629912828114527 ], [ -80.715791184615455, 8.613841458416573 ], [ -80.73940731499556, 8.615236721497467 ], [ -80.723904385179196, 8.64611338992097 ], [ -80.725790574675273, 8.653038031180188 ], [ -80.727935146589743, 8.658619086201838 ], [ -80.733361171980505, 8.66443268522022 ], [ -80.738115403802851, 8.672494208041257 ], [ -80.741965298060052, 8.690813503340507 ], [ -80.73863216774032, 8.70282827410557 ], [ -80.732921923308083, 8.714868883292297 ], [ -80.728193529008138, 8.730139268212668 ], [ -80.733542040033115, 8.74458283083294 ], [ -80.740440842870612, 8.755744940876298 ], [ -80.761524827708627, 8.779490261566309 ], [ -80.769017909748698, 8.784063626235366 ], [ -80.78025753415784, 8.788895372423497 ], [ -80.797827520623571, 8.794553940911612 ], [ -80.815087449626105, 8.802615465531289 ], [ -80.833432583347019, 8.814552721031248 ], [ -80.840693122289736, 8.820857245565435 ], [ -80.851183437865359, 8.832716986699552 ], [ -80.856842007252794, 8.844111639840321 ], [ -80.860330166304095, 8.853594265063293 ], [ -80.861725430284366, 8.874161485064462 ], [ -80.861983811803441, 8.876900336181563 ], [ -80.862597200663629, 8.885066039578389 ], [ -80.844856945999936, 8.884479757000065 ], [ -80.822417772999927, 8.890692450000074 ], [ -80.812899456999901, 8.902669580000065 ], [ -80.804292363999934, 8.912369333000072 ], [ -80.783558722999942, 8.939195054000038 ], [ -80.772572394999941, 8.95343659100007 ], [ -80.762521938999896, 8.959540106000077 ], [ -80.759144660999937, 8.962713934000078 ], [ -80.755848761999914, 8.969794012000079 ], [ -80.75064042899993, 8.97687409100007 ], [ -80.741688605999911, 8.980047919000071 ], [ -80.726826289999906, 8.997221549000074 ], [ -80.703484622999952, 9.008107912000071 ], [ -80.667103644999941, 9.029730536000045 ], [ -80.653228318999936, 9.035305080000057 ], [ -80.637117868999951, 9.051671743000043 ], [ -80.57933726999994, 9.08068731700007 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PA-NB", "NAME_1": "Ngöbe Buglé" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -82.006746764256462, 8.946581223250567 ], [ -81.997710740999935, 8.947455145000049 ], [ -81.985218878999945, 8.942328192000048 ], [ -81.974720831999946, 8.935207424000055 ], [ -81.958566860999952, 8.931626695000091 ], [ -81.943959113999938, 8.935126044000071 ], [ -81.929432745999918, 8.943833726000037 ], [ -81.920765753999945, 8.955145575000074 ], [ -81.923736131999931, 8.966376044000071 ], [ -81.912464972999942, 8.971096096000053 ], [ -81.903716600999928, 8.971136786000045 ], [ -81.889637824999909, 8.966376044000071 ], [ -81.887684699999909, 8.962591864000046 ], [ -81.878041144999941, 8.954250393000052 ], [ -81.867339647999927, 8.949286200000074 ], [ -81.862375454999949, 8.95579661700009 ], [ -81.852284308999913, 8.958319403000075 ], [ -81.793446417999917, 8.931626695000091 ], [ -81.775542772999927, 8.940252997000073 ], [ -81.770578579999949, 8.957464911000045 ], [ -81.774240688999896, 8.997463283000059 ], [ -81.841867641999897, 9.035305080000057 ], [ -81.877064581999946, 9.087307033000059 ], [ -81.886219855999911, 9.096136786000045 ], [ -81.899281378999945, 9.10187409100007 ], [ -81.917836066999939, 9.114976304000038 ], [ -81.933420376999948, 9.12921784100007 ], [ -81.937408006999931, 9.138332424000055 ], [ -81.922027147999927, 9.13812897300005 ], [ -81.896636522999927, 9.131781317000048 ], [ -81.872873501999948, 9.12954336100006 ], [ -81.862375454999949, 9.141750393000052 ], [ -81.89476477799991, 9.156927802000041 ], [ -81.910308397999927, 9.168117580000057 ], [ -81.903309699999909, 9.179266669000071 ], [ -81.882801886999914, 9.179510809000078 ], [ -81.86546790299991, 9.16665273600006 ], [ -81.841867641999897, 9.138332424000055 ], [ -81.818755662999934, 9.121079820000091 ], [ -81.814564581999946, 9.116603908000059 ], [ -81.816029425999943, 9.10805898600006 ], [ -81.824208136999914, 9.105454820000091 ], [ -81.834380662999934, 9.107001044000071 ], [ -81.841867641999897, 9.110419012000079 ], [ -81.841867641999897, 9.103583075000074 ], [ -81.833729620999918, 9.093817450000074 ], [ -81.825831389999905, 9.085286054000051 ], [ -81.820880853999938, 9.070647428000086 ], [ -81.813465567999913, 9.06780531000004 ], [ -81.800285577999944, 9.067811131000042 ], [ -81.776807034999933, 9.064972420000061 ], [ -81.761971321999908, 9.063750226000082 ], [ -81.736887173999946, 9.036932684000078 ], [ -81.721171869999921, 9.03202187100004 ], [ -81.706450975999928, 8.999172268000052 ], [ -81.701568162999934, 8.994330145000049 ], [ -81.687489386999914, 8.984198309000078 ], [ -81.627552863999938, 8.899115302000041 ], [ -81.587310350999928, 8.856350002000056 ], [ -81.567494269999941, 8.843491929000038 ], [ -81.561594204999949, 8.834377346000053 ], [ -81.550770636999914, 8.822821356000077 ], [ -81.539051886999914, 8.812933661000045 ], [ -81.530262824999909, 8.808742580000057 ], [ -81.521473761999914, 8.806789455000057 ], [ -81.503292085999931, 8.800959842000054 ], [ -81.491196938999906, 8.800984727000071 ], [ -81.473474338999949, 8.806593814000053 ], [ -81.421506346999934, 8.796426828000051 ], [ -81.40943074899991, 8.800099720000048 ], [ -81.381546644999901, 8.800120439000068 ], [ -81.357980923999946, 8.785101630000042 ], [ -81.304463159999898, 8.781882361000044 ], [ -81.266224148999925, 8.789234831000044 ], [ -81.213072785999941, 8.791808601000071 ], [ -81.215941534973865, 8.788249417276745 ], [ -81.215915696552145, 8.782900906251825 ], [ -81.22273698592312, 8.757760321581543 ], [ -81.211238979994903, 8.683837185237905 ], [ -81.214520432571874, 8.62322072995272 ], [ -81.210541348004767, 8.586297919413425 ], [ -81.204546881833096, 8.565291448941196 ], [ -81.195916918231148, 8.552320665566242 ], [ -81.188320481604933, 8.544104112214995 ], [ -81.183824632200981, 8.535706691710459 ], [ -81.180258958783895, 8.526559963271666 ], [ -81.171603155860964, 8.510979519089517 ], [ -81.15607438762288, 8.495528266116594 ], [ -81.183617926625971, 8.489404608735697 ], [ -81.192041184652908, 8.489404608735697 ], [ -81.203254970640387, 8.492195135796862 ], [ -81.225139940256042, 8.500954291507355 ], [ -81.265550909846581, 8.511599635814548 ], [ -81.282345750855711, 8.52221914349866 ], [ -81.328518642621248, 8.558056749319519 ], [ -81.337484503906694, 8.560227158756334 ], [ -81.363477749298681, 8.554956162996518 ], [ -81.410529141106963, 8.558521837312924 ], [ -81.415231696085868, 8.568081976901681 ], [ -81.42122616225754, 8.571880195214817 ], [ -81.432362433879177, 8.576686102981228 ], [ -81.463161587037575, 8.583972480345665 ], [ -81.488612230070373, 8.596943263720618 ], [ -81.490317552413103, 8.555886338983328 ], [ -81.49930925212027, 8.516095486117763 ], [ -81.522511969551715, 8.460465807550975 ], [ -81.525715908662221, 8.443851833695135 ], [ -81.526671923070751, 8.429201565499852 ], [ -81.522486132029371, 8.379333808208685 ], [ -81.547833422274607, 8.385690008686936 ], [ -81.592120123644747, 8.371866562791638 ], [ -81.609793463797303, 8.347811183739111 ], [ -81.624004483320221, 8.313730577104423 ], [ -81.633616298853099, 8.297090765726239 ], [ -81.655888841197054, 8.281846218328326 ], [ -81.680486822608771, 8.277376207346094 ], [ -81.689633551946827, 8.296858221729565 ], [ -81.704619716926402, 8.294997869755889 ], [ -81.715885178857889, 8.278099676858574 ], [ -81.732059903141987, 8.262157498369845 ], [ -81.784304776344356, 8.264043686966545 ], [ -81.813372768738247, 8.287478949294041 ], [ -81.830012580116488, 8.318407294560984 ], [ -81.856496751923544, 8.326856391009642 ], [ -81.949100917873068, 8.327786566996451 ], [ -81.99713416161228, 8.339982204914804 ], [ -82.01775305935621, 8.370910549282428 ], [ -82.021499599926585, 8.401864732071715 ], [ -82.036744147324498, 8.418039456355814 ], [ -82.053383958702739, 8.44684906723063 ], [ -82.064494391902656, 8.46149933542597 ], [ -82.074002854648029, 8.467493800698321 ], [ -82.083718023867675, 8.464341539330576 ], [ -82.10025448335773, 8.458114529162174 ], [ -82.132836473224643, 8.449200343820792 ], [ -82.16399736158894, 8.448735255827387 ], [ -82.180172084973719, 8.457881985165443 ], [ -82.175262824419804, 8.482479967476479 ], [ -82.142913377650245, 8.557255764541878 ], [ -82.152757738079117, 8.568727932048432 ], [ -82.15650427864955, 8.589811916886447 ], [ -82.149011196609422, 8.61937083569552 ], [ -82.139631924173955, 8.703732612569979 ], [ -82.153222826072522, 8.762617906191394 ], [ -82.154850633150204, 8.762592067769674 ], [ -82.196165941205209, 8.771583767476898 ], [ -82.203994920928835, 8.772436428198603 ], [ -82.218076748343265, 8.770343533127516 ], [ -82.223502773734026, 8.768948269147302 ], [ -82.250865444684507, 8.772281399466976 ], [ -82.281690437163945, 8.777009792867659 ], [ -82.299777187567145, 8.782125758996585 ], [ -82.317786423604559, 8.791117458703752 ], [ -82.36114295078653, 8.807963974757627 ], [ -82.362951625916764, 8.808790797956931 ], [ -82.355251838301683, 8.827497666883801 ], [ -82.347758755362236, 8.857495836163878 ], [ -82.338379482926769, 8.889354356518311 ], [ -82.330886399987378, 8.90436635991955 ], [ -82.334632940557753, 8.92498525586484 ], [ -82.347758755362236, 8.949376531701546 ], [ -82.370263840803602, 8.968109239050136 ], [ -82.407755093023127, 8.981235052955299 ], [ -82.4283998282894, 8.988753974316467 ], [ -82.439639451799223, 8.99999359782629 ], [ -82.426513637894061, 9.013119411731452 ], [ -82.392768928043552, 9.026245224737295 ], [ -82.379643114138389, 9.039371039541834 ], [ -82.353391486328007, 9.061876125882463 ], [ -82.351505296831988, 9.086241563297506 ], [ -82.338379482926769, 9.112493191107887 ], [ -82.32339331704793, 9.127505195408446 ], [ -82.314014044612463, 9.12561900501305 ], [ -82.310267504042088, 9.114379381503227 ], [ -82.315874395686819, 9.099367377202668 ], [ -82.308381313646692, 9.091874294263278 ], [ -82.287762416802082, 9.08438121222315 ], [ -82.280269334761954, 9.080608832331734 ], [ -82.289648607197421, 9.067483018426572 ], [ -82.30274858268092, 9.050610663051657 ], [ -82.317760586082159, 9.039371039541834 ], [ -82.32339331704793, 9.024359036140595 ], [ -82.321507127551854, 9.009372870261757 ], [ -82.300888230707244, 9.001879788221629 ], [ -82.280269334761954, 8.998107408330213 ], [ -82.272750414300162, 8.98686778392107 ], [ -82.26151078989102, 8.977488512384923 ], [ -82.225879889645171, 8.969995429445476 ], [ -82.201514452230185, 8.954983425144917 ], [ -82.195881721264413, 8.941883450560795 ], [ -82.199628261834789, 8.92498525586484 ], [ -82.210893723766333, 8.917492173824769 ], [ -82.209007534270256, 8.898733628953778 ], [ -82.195881721264413, 8.891240546014387 ], [ -82.192135178895398, 8.88186127447824 ], [ -82.186502447929627, 8.855609645768538 ], [ -82.179009365889499, 8.844370022258715 ], [ -82.169630092554712, 8.848116562829091 ], [ -82.16399736158894, 8.870621650069097 ], [ -82.150871547683778, 8.891240546014387 ], [ -82.132138841234507, 8.900619819349174 ], [ -82.10214067285375, 8.90248017042353 ], [ -82.06087704074281, 8.90248017042353 ], [ -82.034625413831748, 8.908112901389302 ], [ -82.015892707382534, 8.919378363320789 ], [ -82.008373786021366, 8.941857612139074 ], [ -82.006771817365461, 8.946508490274596 ], [ -82.006746764256462, 8.946581223250567 ] ] ], [ [ [ -81.568268647999901, 9.10824946200006 ], [ -81.565492825999911, 9.105496117000087 ], [ -81.559925119999946, 9.103965966000089 ], [ -81.55774703499992, 9.106106241000077 ], [ -81.553102241999909, 9.10579937600005 ], [ -81.547220925999909, 9.102740545000074 ], [ -81.541947594999897, 9.099070472000051 ], [ -81.537911337999901, 9.095094040000049 ], [ -81.53666944899993, 9.091423836000047 ], [ -81.533871900999941, 9.088669683000091 ], [ -81.53449179699993, 9.085917258000052 ], [ -81.538840968999921, 9.085920190000081 ], [ -81.543811262999952, 9.088369729000078 ], [ -81.552189354999939, 9.089596845000074 ], [ -81.56241366799992, 9.09082288400009 ], [ -81.567044062999912, 9.090822599000091 ], [ -81.571671307999907, 9.089598507000062 ], [ -81.572927660999937, 9.096020901000088 ], [ -81.575098658999934, 9.100606581000079 ], [ -81.577258588999939, 9.10458133800006 ], [ -81.575396136999927, 9.107638619000056 ], [ -81.568268647999901, 9.10824946200006 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PA-7", "NAME_1": "Los Santos" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -80.375509229307141, 7.997222803254876 ], [ -80.348866339999915, 7.989284572000088 ], [ -80.327748175999943, 7.953314520000049 ], [ -80.313343878999945, 7.911444403000075 ], [ -80.300038214999915, 7.883327541000085 ], [ -80.204457160999937, 7.807562567000048 ], [ -80.143788214999915, 7.752752997000073 ], [ -80.052398240999935, 7.637111721000053 ], [ -80.005767381999931, 7.55227285400008 ], [ -79.993519660999937, 7.522772528000075 ], [ -79.994658982999908, 7.50344472900008 ], [ -80.010039842999902, 7.465236721000053 ], [ -80.017852342999902, 7.456813869000086 ], [ -80.030059373999904, 7.453924872000073 ], [ -80.056792772999927, 7.452541408000059 ], [ -80.064971482999908, 7.450995184000078 ], [ -80.135528123999904, 7.424627997000073 ], [ -80.198516404999907, 7.424709377000056 ], [ -80.210682745999918, 7.417792059000078 ], [ -80.222808397999927, 7.42336660400008 ], [ -80.249663865999935, 7.429632880000042 ], [ -80.259063279999907, 7.438259182000081 ], [ -80.265899217999902, 7.438259182000081 ], [ -80.274810350999928, 7.433864651000079 ], [ -80.30687415299991, 7.424627997000073 ], [ -80.30687415299991, 7.417792059000078 ], [ -80.2939753899999, 7.419256903000075 ], [ -80.283558722999942, 7.421820380000042 ], [ -80.274525519999941, 7.425685940000051 ], [ -80.265899217999902, 7.430812893000052 ], [ -80.259063279999907, 7.424627997000073 ], [ -80.330962693999936, 7.401190497000073 ], [ -80.357574022999927, 7.382025458000044 ], [ -80.361480272999927, 7.355739651000079 ], [ -80.34439042899993, 7.327419338000084 ], [ -80.347564256999931, 7.318264065000051 ], [ -80.372344529999907, 7.31476471600007 ], [ -80.379261847999942, 7.312770901000079 ], [ -80.387115037999934, 7.30805084800005 ], [ -80.3935847649999, 7.302394924000055 ], [ -80.396270311999899, 7.297674872000073 ], [ -80.398833787999934, 7.28664785400008 ], [ -80.405384894999941, 7.282782294000071 ], [ -80.414418097999942, 7.280340887000079 ], [ -80.424183722999942, 7.27374909100007 ], [ -80.428496873999904, 7.265448309000078 ], [ -80.428130662999934, 7.258490302000041 ], [ -80.429107225999928, 7.252346096000053 ], [ -80.437245245999918, 7.246486721000053 ], [ -80.444813605999911, 7.245876369000086 ], [ -80.463734503999945, 7.251654364000046 ], [ -80.474476691999939, 7.253322658000059 ], [ -80.596831834999932, 7.238063869000086 ], [ -80.6040750717072, 7.236721022557106 ], [ -80.606779751284478, 7.271830349291179 ], [ -80.613290982292995, 7.285808823918103 ], [ -80.623497077028446, 7.297203477058815 ], [ -80.644245165082282, 7.312577216565273 ], [ -80.653366055099355, 7.318003241056715 ], [ -80.668068000138078, 7.322809149722445 ], [ -80.668765632128213, 7.327304999126397 ], [ -80.666595221792022, 7.337795314702021 ], [ -80.667137824151268, 7.352523098162465 ], [ -80.673468187107119, 7.37595836048996 ], [ -80.699254726924096, 7.410710760693064 ], [ -80.715067715102975, 7.458899034063165 ], [ -80.722069871627241, 7.50173879640829 ], [ -80.719692755716096, 7.529592392874633 ], [ -80.664605678609178, 7.583180854113095 ], [ -80.613936937439689, 7.663098455729141 ], [ -80.608097499999587, 7.668240261179108 ], [ -80.59528174535626, 7.669687201103443 ], [ -80.588150396723393, 7.672503567485649 ], [ -80.579882168327401, 7.678937283229004 ], [ -80.567350632725493, 7.690797024363178 ], [ -80.556782802784085, 7.708883774766377 ], [ -80.552855394161099, 7.722061265514981 ], [ -80.553113775680174, 7.733559272342518 ], [ -80.554276495663714, 7.741155707170151 ], [ -80.557583787561725, 7.748907172527993 ], [ -80.570528734313598, 7.766063747843702 ], [ -80.5732934229531, 7.773505153939709 ], [ -80.574817878142539, 7.782496852747556 ], [ -80.574507818880704, 7.789654038902768 ], [ -80.575386318923449, 7.805311998350021 ], [ -80.579959682693186, 7.811306464521692 ], [ -80.578771125187245, 7.815259711566398 ], [ -80.573784349368225, 7.82146088331308 ], [ -80.560658534563686, 7.829522406134117 ], [ -80.546240811264397, 7.84133047132417 ], [ -80.534536098861849, 7.855825709888563 ], [ -80.504202032797537, 7.911222846257317 ], [ -80.49141211567661, 7.92341848417567 ], [ -80.459010992962931, 7.932565211715144 ], [ -80.427514207814397, 7.931247462999977 ], [ -80.414750129115134, 7.933960475695358 ], [ -80.404466519114578, 7.941866969784826 ], [ -80.393071865973809, 7.956930650029449 ], [ -80.388679369357419, 7.975224106906978 ], [ -80.381961432773892, 7.983466497780626 ], [ -80.375509229307141, 7.997222803254876 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PA-6", "NAME_1": "Herrera" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -80.478464321999923, 8.091376044000071 ], [ -80.484405076999906, 8.082546291000085 ], [ -80.468169725999928, 8.07485586100006 ], [ -80.460926886999914, 8.055731512000079 ], [ -80.4560847649999, 8.036200262000079 ], [ -80.447173631999931, 8.027289130000042 ], [ -80.432403123999904, 8.024237372000073 ], [ -80.394276495999918, 8.007635809000078 ], [ -80.382598436999899, 7.999335028000075 ], [ -80.375509229307141, 7.997222803254876 ], [ -80.381961432773892, 7.983466497780626 ], [ -80.388679369357419, 7.975224106906978 ], [ -80.393071865973809, 7.956930650029449 ], [ -80.404466519114578, 7.941866969784826 ], [ -80.414750129115134, 7.933960475695358 ], [ -80.427514207814397, 7.931247462999977 ], [ -80.459010992962931, 7.932565211715144 ], [ -80.49141211567661, 7.92341848417567 ], [ -80.504202032797537, 7.911222846257317 ], [ -80.534536098861849, 7.855825709888563 ], [ -80.546240811264397, 7.84133047132417 ], [ -80.560658534563686, 7.829522406134117 ], [ -80.573784349368225, 7.82146088331308 ], [ -80.578771125187245, 7.815259711566398 ], [ -80.579959682693186, 7.811306464521692 ], [ -80.575386318923449, 7.805311998350021 ], [ -80.574507818880704, 7.789654038902768 ], [ -80.574817878142539, 7.782496852747556 ], [ -80.5732934229531, 7.773505153939709 ], [ -80.570528734313598, 7.766063747843702 ], [ -80.557583787561725, 7.748907172527993 ], [ -80.554276495663714, 7.741155707170151 ], [ -80.553113775680174, 7.733559272342518 ], [ -80.552855394161099, 7.722061265514981 ], [ -80.556782802784085, 7.708883774766377 ], [ -80.567350632725493, 7.690797024363178 ], [ -80.579882168327401, 7.678937283229004 ], [ -80.588150396723393, 7.672503567485649 ], [ -80.59528174535626, 7.669687201103443 ], [ -80.608097499999587, 7.668240261179108 ], [ -80.613936937439689, 7.663098455729141 ], [ -80.664605678609178, 7.583180854113095 ], [ -80.719692755716096, 7.529592392874633 ], [ -80.745737677951468, 7.55574066789751 ], [ -80.751861335332364, 7.559228826948811 ], [ -80.772299364124365, 7.563647161986921 ], [ -80.802064989407711, 7.58116547340785 ], [ -80.879217902384255, 7.695318712188794 ], [ -80.884928147715812, 7.708651230769647 ], [ -80.891671922721059, 7.737435004122119 ], [ -80.897563036105225, 7.753247992300999 ], [ -80.904771898204501, 7.76327321988316 ], [ -80.909474453183464, 7.767691554921328 ], [ -80.919499680765625, 7.771799832496242 ], [ -80.942754075939831, 7.765831203846972 ], [ -80.946991542925332, 7.788413805452763 ], [ -80.943425868608927, 7.90145600019423 ], [ -80.93774146169909, 7.911067817525748 ], [ -80.93290971461164, 7.915408637298754 ], [ -80.907407395634777, 7.92186819146383 ], [ -80.886349250117803, 7.944347439382796 ], [ -80.857772183239661, 7.969565538418863 ], [ -80.849943202616714, 7.980831000350349 ], [ -80.839194506421336, 8.00036469247658 ], [ -80.837980108695035, 8.015893459815288 ], [ -80.853560553776504, 8.059947618088074 ], [ -80.817025315965566, 8.073616034352483 ], [ -80.780955166147976, 8.087956244185307 ], [ -80.764702928397412, 8.102554836436525 ], [ -80.742042813325156, 8.129788316177837 ], [ -80.732379320049574, 8.133353990494243 ], [ -80.71876257972923, 8.132966416866623 ], [ -80.709745043399039, 8.130718492164647 ], [ -80.687007412162302, 8.132604682560043 ], [ -80.662745326635502, 8.12405223242456 ], [ -80.646415575418473, 8.125292466773885 ], [ -80.609725307976589, 8.137307237538948 ], [ -80.59122514462473, 8.13854747188833 ], [ -80.57732418526291, 8.132811388135053 ], [ -80.558488125126871, 8.112838446437138 ], [ -80.549470587897304, 8.106120509853611 ], [ -80.543553636091417, 8.106740627477961 ], [ -80.532184821372368, 8.115344753557508 ], [ -80.526448736719829, 8.11637828233188 ], [ -80.514563158063254, 8.110513007369377 ], [ -80.491437954098274, 8.095190944706303 ], [ -80.478464321999923, 8.091376044000071 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/papua new guinea.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/papua new guinea.geojson new file mode 100644 index 000000000000..ef69aa98e70c --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/papua new guinea.geojson @@ -0,0 +1,28 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "PG-NSB", "NAME_1": "Bougainville" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 155.832229614257812, -6.803332805633488 ], [ 155.835632324219091, -6.80604887008667 ], [ 155.834442138671875, -6.808332920074463 ], [ 155.830551147461165, -6.805276870727482 ], [ 155.832229614257812, -6.803332805633488 ] ] ], [ [ [ 155.828048706054688, -6.803888797759896 ], [ 155.824447631836165, -6.803332805633488 ], [ 155.824172973632926, -6.798056125640812 ], [ 155.828018188476562, -6.800387859344482 ], [ 155.828048706054688, -6.803888797759896 ] ] ], [ [ [ 155.978485107421989, -6.681222915649357 ], [ 155.983078002929688, -6.683187961578369 ], [ 155.973190307617188, -6.683783054351807 ], [ 155.975753784180142, -6.680797100067139 ], [ 155.978485107421989, -6.681222915649357 ] ] ], [ [ [ 155.973327636718864, -6.462777137756348 ], [ 155.970550537109602, -6.458333015441838 ], [ 155.97059631347679, -6.455799102783146 ], [ 155.974441528320312, -6.459444999694824 ], [ 155.973327636718864, -6.462777137756348 ] ] ], [ [ [ 155.850860595703239, -6.304103851318246 ], [ 155.849304199218864, -6.303813934326115 ], [ 155.847946166992415, -6.302528858184814 ], [ 155.850875854492301, -6.302317142486515 ], [ 155.850860595703239, -6.304103851318246 ] ] ], [ [ [ 155.826080322265739, -6.303907871246338 ], [ 155.826126098632812, -6.300658226013184 ], [ 155.829849243164176, -6.300699234008732 ], [ 155.829040527343864, -6.302470207214355 ], [ 155.826080322265739, -6.303907871246338 ] ] ], [ [ [ 155.840560913086051, -6.29999923706049 ], [ 155.836944580078239, -6.300833225250244 ], [ 155.833053588867415, -6.295555114746094 ], [ 155.835556030273665, -6.294167041778508 ], [ 155.840560913086051, -6.29999923706049 ] ] ], [ [ [ 155.122665405273779, -6.282333850860596 ], [ 155.123794555664176, -6.284900188445988 ], [ 155.120925903320426, -6.284873008728027 ], [ 155.120407104492188, -6.283178806304875 ], [ 155.122665405273779, -6.282333850860596 ] ] ], [ [ [ 155.121002197265625, -6.280416965484505 ], [ 155.121810913086165, -6.282083034515324 ], [ 155.119018554687614, -6.283497810363713 ], [ 155.118148803711165, -6.281528949737549 ], [ 155.121002197265625, -6.280416965484505 ] ] ], [ [ [ 155.705307006836051, -6.248538970947266 ], [ 155.706146240234375, -6.249424934387207 ], [ 155.705886840820312, -6.25002908706665 ], [ 155.704406738281591, -6.249456882476807 ], [ 155.705307006836051, -6.248538970947266 ] ] ], [ [ [ 155.030090332031705, -6.247611045837346 ], [ 155.026672363281364, -6.243054866790771 ], [ 155.02780151367233, -6.241722106933537 ], [ 155.031417846679915, -6.243780136108342 ], [ 155.030090332031705, -6.247611045837346 ] ] ], [ [ [ 155.66094970703125, -6.185554981231633 ], [ 155.67610168457054, -6.20822095870966 ], [ 155.66302490234375, -6.217484951019287 ], [ 155.647949218750341, -6.197558879852238 ], [ 155.66094970703125, -6.185554981231633 ] ] ], [ [ [ 155.676177978515966, -6.185339927673283 ], [ 155.666213989257812, -6.185338020324707 ], [ 155.667083740234602, -6.178548812866154 ], [ 155.67359924316429, -6.17946004867548 ], [ 155.676177978515966, -6.185339927673283 ] ] ], [ [ [ 155.634048461914062, -6.16484880447382 ], [ 155.632354736328125, -6.165112972259521 ], [ 155.629852294921875, -6.162644863128662 ], [ 155.635040283203352, -6.16192722320551 ], [ 155.634048461914062, -6.16484880447382 ] ] ], [ [ [ 155.57073974609375, -6.146265029907227 ], [ 155.56842041015625, -6.144521236419678 ], [ 155.568542480468864, -6.141465187072754 ], [ 155.56951904296875, -6.141465187072754 ], [ 155.57073974609375, -6.146265029907227 ] ] ], [ [ [ 155.575531005859602, -6.118831157684326 ], [ 155.572784423828239, -6.117499828338623 ], [ 155.573303222656705, -6.116157054901123 ], [ 155.575271606445426, -6.117499828338623 ], [ 155.575531005859602, -6.118831157684326 ] ] ], [ [ [ 155.520492553710938, -6.069722175598145 ], [ 155.523895263672102, -6.071665763854924 ], [ 155.523895263672102, -6.074789047241154 ], [ 155.52082824707054, -6.072778224944955 ], [ 155.520492553710938, -6.069722175598145 ] ] ], [ [ [ 155.511383056640966, -6.06333398818964 ], [ 155.508285522460938, -6.061902046203613 ], [ 155.508895874023551, -6.05805492401123 ], [ 155.510284423828125, -6.058888912200928 ], [ 155.511383056640966, -6.06333398818964 ] ] ], [ [ [ 155.280761718750114, -5.888261795043945 ], [ 155.280487060546989, -5.88951301574707 ], [ 155.279235839843864, -5.88861083984375 ], [ 155.279510498047102, -5.887497901916504 ], [ 155.280761718750114, -5.888261795043945 ] ] ], [ [ [ 154.605560302734489, -5.733611106872559 ], [ 154.601669311523665, -5.731389045715332 ], [ 154.604721069336165, -5.728332996368408 ], [ 154.607223510742415, -5.730833053588867 ], [ 154.605560302734489, -5.733611106872559 ] ] ], [ [ [ 154.5689697265625, -5.729403972625676 ], [ 154.567794799804801, -5.729125976562443 ], [ 154.566955566406477, -5.727250099182015 ], [ 154.567718505859602, -5.7271790504455 ], [ 154.5689697265625, -5.729403972625676 ] ] ], [ [ [ 154.644729614257812, -5.707499027252197 ], [ 154.647216796875, -5.710277080535889 ], [ 154.643051147461051, -5.713334083557129 ], [ 154.641387939453239, -5.709444999694767 ], [ 154.644729614257812, -5.707499027252197 ] ] ], [ [ [ 155.136108398437727, -5.69277811050415 ], [ 155.136947631836051, -5.694166183471623 ], [ 155.13478088378929, -5.695116996765137 ], [ 155.134399414062727, -5.694006919860783 ], [ 155.136108398437727, -5.69277811050415 ] ] ], [ [ [ 154.627777099609602, -5.608890056610107 ], [ 154.625488281250227, -5.607048034667912 ], [ 154.625976562500114, -5.605694770812988 ], [ 154.6282958984375, -5.606736183166504 ], [ 154.627777099609602, -5.608890056610107 ] ] ], [ [ [ 154.65888977050804, -5.60055494308466 ], [ 154.660003662109602, -5.603889942169189 ], [ 154.65583801269554, -5.604443073272705 ], [ 154.655548095703239, -5.602499008178654 ], [ 154.65888977050804, -5.60055494308466 ] ] ], [ [ [ 154.714172363281477, -5.593332767486572 ], [ 154.710830688476562, -5.599722862243652 ], [ 154.703887939453239, -5.593889236450195 ], [ 154.705276489257926, -5.591389179229736 ], [ 154.714172363281477, -5.593332767486572 ] ] ], [ [ [ 154.695831298828125, -5.593057155609074 ], [ 154.692504882812614, -5.589444160461312 ], [ 154.694442749023551, -5.58611011505127 ], [ 154.698608398437614, -5.589444160461312 ], [ 154.695831298828125, -5.593057155609074 ] ] ], [ [ [ 154.711914062500227, -5.585903167724609 ], [ 154.710830688476562, -5.583611965179387 ], [ 154.711669921875, -5.582499980926514 ], [ 154.712783813476562, -5.583333969116154 ], [ 154.711914062500227, -5.585903167724609 ] ] ], [ [ [ 154.639999389648551, -5.573610782623291 ], [ 154.642501831054915, -5.577498912811279 ], [ 154.6361083984375, -5.57916784286499 ], [ 154.63555908203125, -5.575832843780518 ], [ 154.639999389648551, -5.573610782623291 ] ] ], [ [ [ 154.708328247070426, -5.571945190429631 ], [ 154.706390380859602, -5.57916784286499 ], [ 154.701660156250114, -5.577220916748047 ], [ 154.70582580566429, -5.572501182556096 ], [ 154.708328247070426, -5.571945190429631 ] ] ], [ [ [ 154.703887939453239, -5.569723129272404 ], [ 154.705276489257926, -5.570833206176758 ], [ 154.704162597656364, -5.572501182556096 ], [ 154.702499389648438, -5.571111202239933 ], [ 154.703887939453239, -5.569723129272404 ] ] ], [ [ [ 155.074172973632812, -5.58027791976923 ], [ 155.0736083984375, -5.575276851654053 ], [ 155.083953857421875, -5.565625190734863 ], [ 155.082229614258154, -5.573332786560059 ], [ 155.074172973632812, -5.58027791976923 ] ] ], [ [ [ 154.71498107910179, -5.562897205352726 ], [ 154.714096069336051, -5.562082767486515 ], [ 154.714447021484375, -5.56006908416748 ], [ 154.715484619140625, -5.560833930969125 ], [ 154.71498107910179, -5.562897205352726 ] ] ], [ [ [ 154.711395263671875, -5.560833930969125 ], [ 154.710281372070426, -5.559721946716252 ], [ 154.710830688476562, -5.558333873748779 ], [ 154.712493896484602, -5.559443950653019 ], [ 154.711395263671875, -5.560833930969125 ] ] ], [ [ [ 154.654037475585938, -5.557012081146183 ], [ 154.653060913086051, -5.555760860443058 ], [ 154.65486145019554, -5.554510116577148 ], [ 154.655136108398438, -5.555482864379826 ], [ 154.654037475585938, -5.557012081146183 ] ] ], [ [ [ 154.5977783203125, -5.554443836212158 ], [ 154.600006103515625, -5.557221889495736 ], [ 154.599166870117415, -5.559165954589787 ], [ 154.59722900390625, -5.556111812591553 ], [ 154.5977783203125, -5.554443836212158 ] ] ], [ [ [ 154.704162597656364, -5.553890228271484 ], [ 154.709716796875114, -5.555277824401855 ], [ 154.705551147460938, -5.560833930969125 ], [ 154.701385498046875, -5.549720764160099 ], [ 154.704162597656364, -5.553890228271484 ] ] ], [ [ [ 154.643920898437841, -5.546597003936711 ], [ 154.649169921875227, -5.548055171966496 ], [ 154.649902343750227, -5.550209045410099 ], [ 154.647781372070312, -5.551390171051025 ], [ 154.643920898437841, -5.546597003936711 ] ] ], [ [ [ 154.611389160156364, -5.546111106872559 ], [ 154.613052368164062, -5.547777175903263 ], [ 154.611663818359489, -5.549720764160099 ], [ 154.610275268554915, -5.548055171966496 ], [ 154.611389160156364, -5.546111106872559 ] ] ], [ [ [ 154.700836181640739, -5.545833110809326 ], [ 154.702224731445426, -5.546945095062256 ], [ 154.700271606445426, -5.548333168029728 ], [ 154.699172973632926, -5.546945095062256 ], [ 154.700836181640739, -5.545833110809326 ] ] ], [ [ [ 154.695281982421875, -5.54999923706049 ], [ 154.692504882812614, -5.545277118682748 ], [ 154.693328857421875, -5.544167041778564 ], [ 154.695556640625114, -5.545833110809326 ], [ 154.695281982421875, -5.54999923706049 ] ] ], [ [ [ 154.736114501953352, -5.5436110496521 ], [ 154.734451293945767, -5.54222297668457 ], [ 154.735275268554801, -5.540555000305176 ], [ 154.737228393554688, -5.541944980621338 ], [ 154.736114501953352, -5.5436110496521 ] ] ], [ [ [ 154.716110229492415, -5.536109924316293 ], [ 154.7147216796875, -5.534999847412109 ], [ 154.715835571289062, -5.533333778381291 ], [ 154.716949462890739, -5.534721851348877 ], [ 154.716110229492415, -5.536109924316293 ] ] ], [ [ [ 154.640274047851676, -5.535553932189885 ], [ 154.638885498047102, -5.53388786315918 ], [ 154.641937255859602, -5.531943798065186 ], [ 154.642227172851562, -5.532777786254883 ], [ 154.640274047851676, -5.535553932189885 ] ] ], [ [ [ 154.606109619140625, -5.53388786315918 ], [ 154.604995727539176, -5.532221794128418 ], [ 154.60638427734375, -5.53083419799799 ], [ 154.607223510742415, -5.532777786254883 ], [ 154.606109619140625, -5.53388786315918 ] ] ], [ [ [ 154.70277404785179, -5.498611927032414 ], [ 154.705276489257926, -5.500833988189697 ], [ 154.705001831054688, -5.501666069030762 ], [ 154.702499389648438, -5.500833988189697 ], [ 154.70277404785179, -5.498611927032414 ] ] ], [ [ [ 154.645004272461051, -5.490554809570312 ], [ 154.67999267578125, -5.535553932189885 ], [ 154.662780761718864, -5.587222099304199 ], [ 154.657775878906705, -5.549168109893742 ], [ 154.636672973633154, -5.518610954284611 ], [ 154.645004272461051, -5.490554809570312 ] ] ], [ [ [ 154.707778930664062, -5.480834007263127 ], [ 154.709442138672102, -5.482501029968262 ], [ 154.70889282226608, -5.485001087188664 ], [ 154.705551147460938, -5.482501029968262 ], [ 154.707778930664062, -5.480834007263127 ] ] ], [ [ [ 154.693328857421875, -5.474165916442814 ], [ 154.689437866211392, -5.474721908569279 ], [ 154.686950683593977, -5.47222185134882 ], [ 154.692779541015625, -5.468332767486515 ], [ 154.693328857421875, -5.474165916442814 ] ] ], [ [ [ 154.637771606445312, -5.455554008483887 ], [ 154.640838623046989, -5.470833778381348 ], [ 154.624450683593864, -5.476943969726562 ], [ 154.628326416015625, -5.460833072662354 ], [ 154.637771606445312, -5.455554008483887 ] ] ], [ [ [ 154.672149658203466, -5.448887825012207 ], [ 154.67333984375, -5.450277805328369 ], [ 154.673614501953239, -5.451943874359131 ], [ 154.671386718750341, -5.449999809265137 ], [ 154.672149658203466, -5.448887825012207 ] ] ], [ [ [ 154.653060913086051, -5.450833797454834 ], [ 154.651672363281705, -5.448056221008301 ], [ 154.653884887695312, -5.44666576385498 ], [ 154.654998779296875, -5.448612213134766 ], [ 154.653060913086051, -5.450833797454834 ] ] ], [ [ [ 154.648605346679915, -5.44083309173584 ], [ 154.651672363281705, -5.443890094757023 ], [ 154.645828247070654, -5.445000171661377 ], [ 154.64649963378929, -5.441423892974854 ], [ 154.648605346679915, -5.44083309173584 ] ] ], [ [ [ 154.668609619140739, -5.450833797454834 ], [ 154.663055419922102, -5.443612098693791 ], [ 154.667770385742188, -5.439445018768311 ], [ 154.668884277343864, -5.444168090820256 ], [ 154.668609619140739, -5.450833797454834 ] ] ], [ [ [ 154.572784423828125, -5.431666851043644 ], [ 154.571670532226562, -5.429165840148926 ], [ 154.573608398437727, -5.424722194671574 ], [ 154.574447631835938, -5.426387786865234 ], [ 154.572784423828125, -5.431666851043644 ] ] ], [ [ [ 154.715835571289062, -5.407917976379395 ], [ 154.814010620117188, -5.506303787231388 ], [ 154.837600708007926, -5.496629238128605 ], [ 154.854171752929915, -5.527222156524601 ], [ 154.877914428710938, -5.528123855590763 ], [ 154.881942749023551, -5.547777175903263 ], [ 154.890853881836392, -5.528413772582951 ], [ 155.006668090820426, -5.533609867095947 ], [ 155.014999389648665, -5.558609962463322 ], [ 155.032119750976562, -5.53325700759882 ], [ 155.065826416015966, -5.541110992431641 ], [ 155.056945800781364, -5.566389083862191 ], [ 155.050552368164176, -5.560277938842717 ], [ 155.04583740234375, -5.561110019683838 ], [ 155.05194091796875, -5.575832843780518 ], [ 155.074310302734602, -5.583192825317383 ], [ 155.088058471679915, -5.635834217071533 ], [ 155.133056640625227, -5.706666946411076 ], [ 155.171386718750114, -5.725831985473576 ], [ 155.168334960937614, -5.794166088104248 ], [ 155.191665649414062, -5.823056221008301 ], [ 155.1925048828125, -5.855834007263127 ], [ 155.207504272460938, -5.86722278594965 ], [ 155.224136352539404, -5.85319709777832 ], [ 155.297500610352017, -5.911387920379639 ], [ 155.312774658203239, -5.948610782623234 ], [ 155.350555419921875, -5.94305515289301 ], [ 155.404449462890852, -5.988056182861214 ], [ 155.419723510742301, -6.094086170196476 ], [ 155.454727172851676, -6.146111965179387 ], [ 155.513717651367188, -6.177467823028451 ], [ 155.528335571289176, -6.17604207992548 ], [ 155.529159545898438, -6.155557155609017 ], [ 155.545013427734602, -6.188562870025578 ], [ 155.560836791992188, -6.19083309173584 ], [ 155.54833984375, -6.206943988800049 ], [ 155.583160400390852, -6.221658229827881 ], [ 155.593048095703125, -6.208056926727181 ], [ 155.624114990234375, -6.21884822845459 ], [ 155.611114501953239, -6.185554981231633 ], [ 155.628097534179801, -6.166141033172607 ], [ 155.634140014648665, -6.21688985824585 ], [ 155.659652709961165, -6.223333835601807 ], [ 155.666671752929688, -6.249999046325627 ], [ 155.710479736328239, -6.273983001708984 ], [ 155.754043579101562, -6.334819793701172 ], [ 155.819183349609375, -6.362801074981689 ], [ 155.864578247070312, -6.468948841094971 ], [ 155.924316406250114, -6.513771057128906 ], [ 155.921661376953125, -6.597498893737736 ], [ 155.965560913085938, -6.690000057220459 ], [ 155.952224731445312, -6.756389141082707 ], [ 155.915832519531477, -6.801387786865234 ], [ 155.901657104492188, -6.777536869049015 ], [ 155.921035766601562, -6.753324031829834 ], [ 155.913604736328125, -6.716944217681885 ], [ 155.875717163085938, -6.781445980071965 ], [ 155.863327026367188, -6.783332824707031 ], [ 155.85267639160179, -6.75471019744873 ], [ 155.820846557617415, -6.762929916381779 ], [ 155.73455810546875, -6.838260173797607 ], [ 155.708404541015739, -6.88042688369751 ], [ 155.654205322265625, -6.850604057311955 ], [ 155.603179931640625, -6.861822128295898 ], [ 155.522216796875, -6.839167118072453 ], [ 155.339996337890739, -6.728518009185734 ], [ 155.248886108398438, -6.634444236755371 ], [ 155.157211303710938, -6.520174980163517 ], [ 155.166671752929801, -6.511388778686523 ], [ 155.199707031250114, -6.527605056762695 ], [ 155.229995727539176, -6.443334102630615 ], [ 155.230880737304915, -6.420362949371338 ], [ 155.19610595703125, -6.394721984863281 ], [ 155.223892211914176, -6.348888874053955 ], [ 155.207687377929688, -6.308613777160645 ], [ 155.164352416992415, -6.275576114654541 ], [ 155.039718627929688, -6.248120784759521 ], [ 155.02491760253929, -6.222308158874512 ], [ 154.9697265625, -6.196668148040771 ], [ 154.966949462890852, -6.132777214050236 ], [ 154.947021484375, -6.09833383560175 ], [ 154.815826416015625, -6.022500991821232 ], [ 154.802505493164176, -5.984722137451172 ], [ 154.74110412597679, -5.934999942779541 ], [ 154.730834960937614, -5.888332843780518 ], [ 154.74749755859375, -5.848889827728271 ], [ 154.695007324218864, -5.744999885559082 ], [ 154.717498779296875, -5.707221031188965 ], [ 154.71368408203125, -5.645321846008244 ], [ 154.73805236816429, -5.601110935211125 ], [ 154.718887329101562, -5.563610076904297 ], [ 154.73638916015625, -5.560555934905949 ], [ 154.751388549804801, -5.584166049957275 ], [ 154.755004882812614, -5.547221183776799 ], [ 154.773056030273438, -5.546111106872559 ], [ 154.754714965820426, -5.537222862243596 ], [ 154.7469482421875, -5.497499942779541 ], [ 154.727783203125114, -5.496665000915471 ], [ 154.701950073242188, -5.457778930664006 ], [ 154.67083740234375, -5.441668033599854 ], [ 154.715835571289062, -5.407917976379395 ] ] ], [ [ [ 154.578887939453125, -5.384167194366398 ], [ 154.577499389648438, -5.392499923705998 ], [ 154.573883056640625, -5.394999980926514 ], [ 154.571945190430142, -5.384723186492863 ], [ 154.578887939453125, -5.384167194366398 ] ] ], [ [ [ 154.563613891601676, -5.341666221618652 ], [ 154.564727783203125, -5.354444980621338 ], [ 154.552505493164176, -5.320831775665283 ], [ 154.555831909179688, -5.323888778686523 ], [ 154.563613891601676, -5.341666221618652 ] ] ], [ [ [ 154.538604736328239, -5.29777717590332 ], [ 154.549728393554688, -5.304722785949707 ], [ 154.55055236816429, -5.309999942779541 ], [ 154.533340454101562, -5.304998874664193 ], [ 154.538604736328239, -5.29777717590332 ] ] ], [ [ [ 154.559997558594091, -5.29423713684082 ], [ 154.558471679687841, -5.2933349609375 ], [ 154.559722900390852, -5.291875839233398 ], [ 154.560562133789176, -5.293056964874268 ], [ 154.559997558594091, -5.29423713684082 ] ] ], [ [ [ 154.5594482421875, -5.291388034820557 ], [ 154.558334350585938, -5.291110038757324 ], [ 154.558609008789176, -5.289721965789795 ], [ 154.559722900390852, -5.289721965789795 ], [ 154.5594482421875, -5.291388034820557 ] ] ], [ [ [ 154.557495117187614, -5.283889770507812 ], [ 154.556945800781591, -5.287499904632512 ], [ 154.553680419921989, -5.285347938537598 ], [ 154.555831909179688, -5.28055477142334 ], [ 154.557495117187614, -5.283889770507812 ] ] ], [ [ [ 154.520828247070767, -5.194167137145939 ], [ 154.528335571289404, -5.19999885559082 ], [ 154.533050537109489, -5.21083402633667 ], [ 154.515548706054801, -5.206943988800049 ], [ 154.520828247070767, -5.194167137145939 ] ] ], [ [ [ 154.542221069335938, -5.171111106872502 ], [ 154.542221069335938, -5.175556182861328 ], [ 154.537216186523665, -5.173890113830566 ], [ 154.538330078125114, -5.171946048736515 ], [ 154.542221069335938, -5.171111106872502 ] ] ], [ [ [ 154.512466430664062, -5.166909217834473 ], [ 154.516113281250114, -5.169999122619572 ], [ 154.515655517578352, -5.174343109130859 ], [ 154.50917053222679, -5.166388988494873 ], [ 154.512466430664062, -5.166909217834473 ] ] ], [ [ [ 154.562774658203352, -5.151944160461426 ], [ 154.560760498047216, -5.151526927947998 ], [ 154.560836791992301, -5.15055608749384 ], [ 154.562774658203352, -5.150000095367375 ], [ 154.562774658203352, -5.151944160461426 ] ] ], [ [ [ 154.55055236816429, -5.123333930969238 ], [ 154.55194091796875, -5.125833988189697 ], [ 154.548339843750114, -5.128056049346924 ], [ 154.547775268554801, -5.125555992126465 ], [ 154.55055236816429, -5.123333930969238 ] ] ], [ [ [ 154.555557250976676, -5.122777938842773 ], [ 154.55360412597679, -5.121111869811955 ], [ 154.555831909179688, -5.119442939758244 ], [ 154.556671142578352, -5.122221946716309 ], [ 154.555557250976676, -5.122777938842773 ] ] ], [ [ [ 154.557785034179801, -5.112223148345947 ], [ 154.559997558594091, -5.114445209503174 ], [ 154.557785034179801, -5.118332862854004 ], [ 154.55610656738304, -5.114445209503174 ], [ 154.557785034179801, -5.112223148345947 ] ] ], [ [ [ 154.562225341796989, -5.106388092041016 ], [ 154.560531616210938, -5.10579776763916 ], [ 154.561737060546875, -5.104410171508732 ], [ 154.562225341796989, -5.104444026947021 ], [ 154.562225341796989, -5.106388092041016 ] ] ], [ [ [ 154.6219482421875, -5.002707958221322 ], [ 154.649032592773438, -5.015666961669865 ], [ 154.678924560547102, -5.085564136505127 ], [ 154.674072265625, -5.155706882476807 ], [ 154.712692260742415, -5.1843581199646 ], [ 154.681106567382926, -5.420759201049748 ], [ 154.654159545898551, -5.443890094757023 ], [ 154.648330688476562, -5.408332824707031 ], [ 154.618331909179801, -5.461111068725586 ], [ 154.598617553711165, -5.412981986999512 ], [ 154.613891601562727, -5.428331851959229 ], [ 154.615829467773551, -5.418056011199951 ], [ 154.577774047851562, -5.3561110496521 ], [ 154.555282592773438, -5.271944999694824 ], [ 154.550827026367301, -5.219723224639893 ], [ 154.571945190430142, -5.205555915832463 ], [ 154.556396484375, -5.136944770812988 ], [ 154.570281982421989, -5.109167098998967 ], [ 154.554443359375114, -5.09833383560175 ], [ 154.515838623047102, -5.124444007873535 ], [ 154.551116943359489, -5.065555095672494 ], [ 154.6219482421875, -5.002707958221322 ] ] ], [ [ [ 155.467224121093977, -4.815001010894662 ], [ 155.469955444335938, -4.817523956298828 ], [ 155.463333129882812, -4.817777156829834 ], [ 155.466110229492642, -4.813333034515324 ], [ 155.467224121093977, -4.815001010894662 ] ] ], [ [ [ 155.471084594726676, -4.777369976043701 ], [ 155.470840454101676, -4.781109809875375 ], [ 155.464447021484489, -4.786388874053955 ], [ 155.462493896484489, -4.77861213684082 ], [ 155.471084594726676, -4.777369976043701 ] ] ], [ [ [ 157.033340454101676, -4.767222881317082 ], [ 157.037506103515625, -4.775834083557072 ], [ 157.024444580078125, -4.780831813812199 ], [ 157.032226562500227, -4.76444482803339 ], [ 157.033340454101676, -4.767222881317082 ] ] ], [ [ [ 157.036972045898665, -4.765114784240723 ], [ 157.035034179687727, -4.764907836914062 ], [ 157.034820556640625, -4.76462984085083 ], [ 157.037506103515625, -4.763446807861328 ], [ 157.036972045898665, -4.765114784240723 ] ] ], [ [ [ 157.035293579101676, -4.756967067718449 ], [ 157.03765869140625, -4.758218765258732 ], [ 157.032501220703125, -4.758889198303109 ], [ 157.033432006836051, -4.755993843078556 ], [ 157.035293579101676, -4.756967067718449 ] ] ], [ [ [ 157.03315734863304, -4.754199981689453 ], [ 157.032821655273551, -4.753159046173096 ], [ 157.036911010742188, -4.751420021057072 ], [ 157.03620910644554, -4.753365993499699 ], [ 157.03315734863304, -4.754199981689453 ] ] ], [ [ [ 157.036560058593977, -4.750236988067627 ], [ 157.033645629882812, -4.752114772796574 ], [ 157.032196044921989, -4.750968933105469 ], [ 157.032821655273551, -4.750308036804199 ], [ 157.036560058593977, -4.750236988067627 ] ] ], [ [ [ 157.031433105468864, -4.74523210525507 ], [ 157.033645629882812, -4.743909835815373 ], [ 157.03413391113304, -4.74412012100214 ], [ 157.031906127929801, -4.746553897857666 ], [ 157.02996826171875, -4.744885921478271 ], [ 157.031433105468864, -4.74523210525507 ] ] ], [ [ [ 157.031845092773665, -4.740087985992432 ], [ 157.029006958007926, -4.741963863372803 ], [ 157.028381347656364, -4.741895198821965 ], [ 157.0284423828125, -4.740227222442627 ], [ 157.031845092773665, -4.740087985992432 ] ] ], [ [ [ 157.028717041015625, -4.737724781036377 ], [ 157.030319213867415, -4.736958980560246 ], [ 157.03108215332054, -4.737308025360107 ], [ 157.027618408203239, -4.739738941192627 ], [ 157.028717041015625, -4.737724781036377 ] ] ], [ [ [ 157.026855468750114, -4.736611843109131 ], [ 157.025680541992188, -4.735775947570744 ], [ 157.028930664062727, -4.733691215515137 ], [ 157.029205322265625, -4.734525203704834 ], [ 157.026855468750114, -4.736611843109131 ] ] ], [ [ [ 157.027206420898438, -4.733900070190373 ], [ 157.025741577148665, -4.735219955444336 ], [ 157.024841308593864, -4.73473405838007 ], [ 157.025253295898438, -4.733691215515137 ], [ 157.027206420898438, -4.733900070190373 ] ] ], [ [ [ 155.306671142578239, -4.723055839538517 ], [ 155.309722900390739, -4.725833892822209 ], [ 155.306396484375, -4.728056907653809 ], [ 155.304992675781364, -4.725555896759033 ], [ 155.306671142578239, -4.723055839538517 ] ] ], [ [ [ 155.43556213378929, -4.715555191040039 ], [ 155.43611145019554, -4.717220783233643 ], [ 155.43251037597679, -4.718550205230656 ], [ 155.432678222656477, -4.716455936431828 ], [ 155.43556213378929, -4.715555191040039 ] ] ], [ [ [ 155.429504394531364, -4.71290922164917 ], [ 155.428726196289517, -4.71260404586792 ], [ 155.426925659179688, -4.708103179931584 ], [ 155.43072509765625, -4.709121227264404 ], [ 155.429504394531364, -4.71290922164917 ] ] ], [ [ [ 156.93756103515625, -4.704438209533691 ], [ 156.936737060546989, -4.703533172607365 ], [ 156.939437866210938, -4.702221870422306 ], [ 156.9390869140625, -4.703671932220402 ], [ 156.93756103515625, -4.704438209533691 ] ] ], [ [ [ 155.336044311523551, -4.668369770049992 ], [ 155.334426879882812, -4.666180133819466 ], [ 155.33575439453125, -4.664566993713322 ], [ 155.33758544921875, -4.666116237640381 ], [ 155.336044311523551, -4.668369770049992 ] ] ], [ [ [ 154.203674316406364, -4.514444828033447 ], [ 154.202499389648551, -4.513887882232666 ], [ 154.203048706054915, -4.512292861938363 ], [ 154.204162597656364, -4.512777805328312 ], [ 154.203674316406364, -4.514444828033447 ] ] ], [ [ [ 154.168212890625114, -4.503141880035344 ], [ 154.165557861328466, -4.50083398818964 ], [ 154.165649414062727, -4.488195896148682 ], [ 154.168548583984489, -4.491462230682373 ], [ 154.168212890625114, -4.503141880035344 ] ] ], [ [ [ 154.166381835937727, -4.460834980010929 ], [ 154.163665771484375, -4.468417167663517 ], [ 154.1658935546875, -4.479289054870549 ], [ 154.159164428711165, -4.462501049041748 ], [ 154.166381835937727, -4.460834980010929 ] ] ], [ [ [ 154.183090209961051, -4.449097156524601 ], [ 154.229583740234489, -4.471593856811523 ], [ 154.249069213867301, -4.532028198242188 ], [ 154.236877441406364, -4.574854850768986 ], [ 154.205825805664062, -4.572776794433537 ], [ 154.164993286132812, -4.519166946411133 ], [ 154.169723510742301, -4.507778167724609 ], [ 154.201385498046989, -4.560555934906006 ], [ 154.197784423828239, -4.539721965789795 ], [ 154.233474731445312, -4.569056987762394 ], [ 154.216598510742415, -4.48359918594349 ], [ 154.165283203125227, -4.456943988799935 ], [ 154.183090209961051, -4.449097156524601 ] ] ], [ [ [ 154.108337402344091, -4.380279064178467 ], [ 154.105834960937614, -4.378888130187988 ], [ 154.106109619140852, -4.376944065093937 ], [ 154.108612060546989, -4.379166126251221 ], [ 154.108337402344091, -4.380279064178467 ] ] ], [ [ [ 154.100479125976562, -4.369361877441349 ], [ 154.102142333984602, -4.369917869567814 ], [ 154.102691650390739, -4.37325382232666 ], [ 154.099777221679688, -4.371098041534367 ], [ 154.100479125976562, -4.369361877441349 ] ] ], [ [ [ 154.135482788086165, -4.36123609542841 ], [ 154.148330688476676, -4.438333034515381 ], [ 154.14277648925804, -4.445555210113525 ], [ 154.126937866211165, -4.370833873748779 ], [ 154.10749816894554, -4.366942882537842 ], [ 154.135482788086165, -4.36123609542841 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-CPM", "NAME_1": "Central" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 149.580429077148551, -10.405835151672363 ], [ 149.579803466796989, -10.406524658203011 ], [ 149.576797485351676, -10.40562725067133 ], [ 149.57826232910179, -10.404490470886174 ], [ 149.580429077148551, -10.405835151672363 ] ] ], [ [ [ 149.363891601562614, -10.409167289733773 ], [ 149.360092163086165, -10.406002998352051 ], [ 149.362152099609602, -10.402752876281738 ], [ 149.363433837890625, -10.403489112853947 ], [ 149.363891601562614, -10.409167289733773 ] ] ], [ [ [ 149.460281372070312, -10.39333438873291 ], [ 149.455139160156364, -10.396478652954102 ], [ 149.451385498046875, -10.39333438873291 ], [ 149.457229614257812, -10.389445304870605 ], [ 149.460281372070312, -10.39333438873291 ] ] ], [ [ [ 149.358612060546875, -10.38273811340332 ], [ 149.361389160156477, -10.382779121398869 ], [ 149.359420776367529, -10.395148277282601 ], [ 149.35017395019554, -10.388641357421875 ], [ 149.358612060546875, -10.38273811340332 ] ] ], [ [ [ 149.601516723632812, -10.358221054077035 ], [ 149.602920532227017, -10.359270095825082 ], [ 149.604003906250227, -10.36297607421875 ], [ 149.598419189453125, -10.361594200134277 ], [ 149.601516723632812, -10.358221054077035 ] ] ], [ [ [ 149.346298217773438, -10.345357894897461 ], [ 149.34254455566429, -10.344498634338379 ], [ 149.341186523437614, -10.341830253601017 ], [ 149.346588134765739, -10.342035293579102 ], [ 149.346298217773438, -10.345357894897461 ] ] ], [ [ [ 149.326156616211165, -10.330224037170353 ], [ 149.319015502929688, -10.324614524841309 ], [ 149.320587158203239, -10.321827888488713 ], [ 149.324722290039062, -10.324275970458984 ], [ 149.326156616211165, -10.330224037170353 ] ] ], [ [ [ 149.393051147461165, -10.307223320007211 ], [ 149.39111328125, -10.305832862853947 ], [ 149.391387939453352, -10.304445266723633 ], [ 149.393890380859489, -10.305832862853947 ], [ 149.393051147461165, -10.307223320007211 ] ] ], [ [ [ 147.277496337890739, -9.538612365722656 ], [ 147.276107788086051, -9.537777900695801 ], [ 147.276107788086051, -9.535555839538574 ], [ 147.277496337890739, -9.535834312438965 ], [ 147.277496337890739, -9.538612365722656 ] ] ], [ [ [ 147.290557861328125, -9.533612251281738 ], [ 147.291381835937727, -9.53416633605957 ], [ 147.293060302734602, -9.543332099914551 ], [ 147.289718627929688, -9.538612365722656 ], [ 147.290557861328125, -9.533612251281738 ] ] ], [ [ [ 147.28334045410179, -9.521110534667912 ], [ 147.285827636718864, -9.522500991821232 ], [ 147.287216186523551, -9.528888702392578 ], [ 147.281951904296875, -9.522223472595158 ], [ 147.28334045410179, -9.521110534667912 ] ] ], [ [ [ 147.03999328613304, -9.452221870422363 ], [ 147.03083801269554, -9.449445724487248 ], [ 147.034729003906364, -9.433334350585938 ], [ 147.042221069335938, -9.442222595214844 ], [ 147.03999328613304, -9.452221870422363 ] ] ], [ [ [ 146.889160156250114, -9.425556182861271 ], [ 146.885833740234375, -9.428890228271428 ], [ 146.881942749023551, -9.427778244018555 ], [ 146.887771606445426, -9.42249870300293 ], [ 146.889160156250114, -9.425556182861271 ] ] ], [ [ [ 146.877853393554801, -9.240498542785645 ], [ 146.876449584960938, -9.243212699890137 ], [ 146.871414184570426, -9.242252349853459 ], [ 146.876312255859602, -9.23822021484375 ], [ 146.877853393554801, -9.240498542785645 ] ] ], [ [ [ 146.941375732422102, -9.127150535583496 ], [ 146.936660766601562, -9.129167556762695 ], [ 146.933258056640739, -9.127873420715332 ], [ 146.938507080078239, -9.126667976379395 ], [ 146.941375732422102, -9.127150535583496 ] ] ], [ [ [ 146.921951293945767, -9.120554924011174 ], [ 146.925277709960938, -9.122220993041992 ], [ 146.927215576171875, -9.124443054199219 ], [ 146.923049926757926, -9.124999046325684 ], [ 146.921951293945767, -9.120554924011174 ] ] ], [ [ [ 146.908523559570312, -9.120345115661564 ], [ 146.912200927734602, -9.121929168701172 ], [ 146.913360595703352, -9.123815536499023 ], [ 146.906112670898665, -9.120782852172852 ], [ 146.908523559570312, -9.120345115661564 ] ] ], [ [ [ 146.911346435546875, -9.108577728271484 ], [ 146.912200927734602, -9.109589576721191 ], [ 146.908050537109489, -9.11191463470459 ], [ 146.907501220703239, -9.109992980956974 ], [ 146.911346435546875, -9.108577728271484 ] ] ], [ [ [ 146.980834960937727, -9.046113967895508 ], [ 146.98274230957054, -9.05157470703125 ], [ 146.969497680664176, -9.055825233459416 ], [ 146.969390869140852, -9.050192832946777 ], [ 146.980834960937727, -9.046113967895508 ] ] ], [ [ [ 146.947525024414176, -9.010478973388672 ], [ 146.948120117187614, -9.011692047119141 ], [ 146.946929931640852, -9.012510299682617 ], [ 146.946701049804801, -9.010760307312012 ], [ 146.947525024414176, -9.010478973388672 ] ] ], [ [ [ 146.603469848632926, -8.815481185913086 ], [ 146.602783203125, -8.814652442932072 ], [ 146.604598999023438, -8.814282417297306 ], [ 146.604598999023438, -8.815112113952637 ], [ 146.603469848632926, -8.815481185913086 ] ] ], [ [ [ 146.595703125, -8.815732002258301 ], [ 146.595138549804688, -8.816007614135685 ], [ 146.600555419922102, -8.808611869811955 ], [ 146.600585937500114, -8.812926292419434 ], [ 146.595703125, -8.815732002258301 ] ] ], [ [ [ 146.529846191406364, -8.804290771484375 ], [ 146.548858642578352, -8.824715614318848 ], [ 146.541610717773665, -8.841582298278752 ], [ 146.511108398437955, -8.774444580078125 ], [ 146.529846191406364, -8.804290771484375 ] ] ], [ [ [ 146.555633544921875, -8.77422904968256 ], [ 146.554306030273438, -8.77395057678217 ], [ 146.554367065429801, -8.773053169250488 ], [ 146.555206298828239, -8.772913932800293 ], [ 146.555633544921875, -8.77422904968256 ] ] ], [ [ [ 146.723312377929688, -7.911736011505127 ], [ 146.739807128906364, -7.952634811401367 ], [ 146.784210205078352, -7.933434963226318 ], [ 146.820205688476562, -7.989436149597168 ], [ 146.863311767578125, -7.988033771514893 ], [ 146.903411865234489, -7.960034847259521 ], [ 146.974807739257812, -7.983933925628605 ], [ 147.366012573242188, -8.359833717346135 ], [ 147.461715698242415, -8.348434448242188 ], [ 147.64271545410179, -8.527835845947266 ], [ 147.649414062500455, -8.545034408569336 ], [ 147.633407592773551, -8.565534591674805 ], [ 147.445205688476904, -8.723333358764592 ], [ 147.46051025390625, -8.789134025573674 ], [ 147.500411987304801, -8.827235221862793 ], [ 147.501617431640625, -8.873633384704533 ], [ 147.542419433593864, -8.899934768676701 ], [ 147.553619384765739, -8.95063400268549 ], [ 147.635208129882812, -8.977034568786564 ], [ 147.693008422851562, -9.043934822082463 ], [ 147.747314453125114, -9.1651353836059 ], [ 147.827117919922102, -9.169335365295353 ], [ 147.873718261719205, -9.274435043334904 ], [ 147.90911865234375, -9.293135643005371 ], [ 147.955215454101676, -9.291033744812012 ], [ 147.986114501953239, -9.31363391876215 ], [ 147.983917236328239, -9.353534698486328 ], [ 148.033309936523665, -9.390434265136719 ], [ 148.053207397461051, -9.431235313415527 ], [ 148.052017211914176, -9.467233657836914 ], [ 148.026611328125, -9.511835098266488 ], [ 148.043319702148551, -9.556035995483398 ], [ 148.104415893554688, -9.610434532165471 ], [ 148.214508056640852, -9.664933204650879 ], [ 148.245117187500114, -9.746733665466252 ], [ 148.353713989257812, -9.753334045410099 ], [ 148.392608642578125, -9.741435050964355 ], [ 148.444305419921875, -9.757035255432129 ], [ 148.565719604492301, -9.875433921813965 ], [ 148.709014892578466, -9.936736106872559 ], [ 148.780319213867301, -9.944234848022461 ], [ 148.805419921875114, -9.97723388671875 ], [ 148.846710205078239, -9.940635681152287 ], [ 148.970214843750114, -9.905334472656193 ], [ 148.972106933593977, -9.867136001586914 ], [ 148.942916870117415, -9.807834625244141 ], [ 148.966705322265625, -9.744834899902287 ], [ 149.023513793945426, -9.800736427307129 ], [ 149.134918212890739, -9.758234024047795 ], [ 149.177505493164062, -9.795333862304688 ], [ 149.324615478515852, -9.856535911560059 ], [ 149.319915771484489, -9.935934066772347 ], [ 149.385116577148551, -9.943234443664494 ], [ 149.521011352539062, -10.028834342956486 ], [ 149.653106689453125, -10.038134574890137 ], [ 149.664520263672102, -10.073233604431152 ], [ 149.660919189453239, -10.33293437957758 ], [ 149.604446411133267, -10.351110458374023 ], [ 149.561218261719091, -10.346529006958008 ], [ 149.541885375977017, -10.364514350891113 ], [ 149.509368896484375, -10.346156120300293 ], [ 149.495010375976676, -10.358430862426758 ], [ 149.523895263672102, -10.367777824401742 ], [ 149.485290527343864, -10.365239143371525 ], [ 149.495407104492301, -10.345482826232853 ], [ 149.48428344726608, -10.331950187683105 ], [ 149.460296630859489, -10.335840225219727 ], [ 149.460556030273438, -10.359998703002873 ], [ 149.429992675781591, -10.354166984558105 ], [ 149.448226928711165, -10.333134651184082 ], [ 149.428237915039062, -10.311742782592717 ], [ 149.41499328613304, -10.328055381774902 ], [ 149.405197143555029, -10.292577743530217 ], [ 149.390014648437614, -10.30112361907959 ], [ 149.365798950195426, -10.276935577392578 ], [ 149.32441711425804, -10.314071655273438 ], [ 149.097091674805142, -10.23077201843256 ], [ 149.023864746093864, -10.247262001037541 ], [ 148.964675903320426, -10.288251876831055 ], [ 148.897415161132812, -10.237221717834473 ], [ 148.79611206054733, -10.248862266540527 ], [ 148.77204895019554, -10.229581832885742 ], [ 148.744293212890739, -10.236841201782227 ], [ 148.734329223632926, -10.200265884399357 ], [ 148.780426025390739, -10.205370903015023 ], [ 148.72088623046875, -10.191349983215332 ], [ 148.756591796875114, -10.164546966552678 ], [ 148.770767211914062, -10.164955139160099 ], [ 148.77789306640625, -10.161364555358887 ], [ 148.779006958007926, -10.163022041320801 ], [ 148.771041870117188, -10.17212963104248 ], [ 148.771316528320767, -10.175168037414494 ], [ 148.787902832031477, -10.178252220153752 ], [ 148.772140502929801, -10.17420768737793 ], [ 148.780319213867301, -10.163266181945687 ], [ 148.779754638671989, -10.160642623901367 ], [ 148.762237548828125, -10.163022041320801 ], [ 148.791961669921989, -10.140539169311523 ], [ 148.804397583007812, -10.148139953613224 ], [ 148.807327270507926, -10.14689826965332 ], [ 148.808166503906364, -10.145240783691406 ], [ 148.799728393554915, -10.138333320617676 ], [ 148.783615112304688, -10.141388893127441 ], [ 148.78083801269554, -10.123889923095703 ], [ 148.738906860351676, -10.167044639587402 ], [ 148.72222900390625, -10.143333435058594 ], [ 148.708053588867301, -10.147665977477971 ], [ 148.708023071289062, -10.131130218505859 ], [ 148.732559204101676, -10.127743721008301 ], [ 148.73785400390625, -10.122535705566406 ], [ 148.737228393554801, -10.121110916137638 ], [ 148.70916748046875, -10.129721641540471 ], [ 148.697235107421875, -10.111420631408691 ], [ 148.684371948242188, -10.114998817443791 ], [ 148.699722290039062, -10.116945266723633 ], [ 148.703613281250114, -10.136666297912598 ], [ 148.697784423828125, -10.139722824096623 ], [ 148.697784423828125, -10.133888244628906 ], [ 148.691665649414062, -10.133609771728516 ], [ 148.693328857421875, -10.130000114440861 ], [ 148.692504882812614, -10.126387596130314 ], [ 148.68777465820358, -10.129165649414006 ], [ 148.68580627441429, -10.12456226348877 ], [ 148.683990478515625, -10.126495361328068 ], [ 148.697219848632812, -10.140555381774902 ], [ 148.70472717285179, -10.138333320617676 ], [ 148.703338623046875, -10.144166946411133 ], [ 148.689727783203239, -10.153887748718262 ], [ 148.683349609375114, -10.141070365905705 ], [ 148.684188842773551, -10.149350166320801 ], [ 148.692184448242188, -10.15806770324707 ], [ 148.668334960937614, -10.171111106872502 ], [ 148.653320312500341, -10.160408020019531 ], [ 148.66523742675804, -10.177117347717285 ], [ 148.648818969726676, -10.192209243774414 ], [ 148.6138916015625, -10.178611755371094 ], [ 148.582443237304801, -10.187732696533146 ], [ 148.563217163086165, -10.1703844070434 ], [ 148.513168334960938, -10.197409629821777 ], [ 148.400848388672102, -10.208009719848576 ], [ 148.388351440429688, -10.188091278076172 ], [ 148.340270996093864, -10.175832748413086 ], [ 148.336105346679801, -10.138056755065918 ], [ 148.3553466796875, -10.17343807220459 ], [ 148.357376098632926, -10.175024032592773 ], [ 148.359542846679688, -10.174677848815918 ], [ 148.36463928222679, -10.169709205627441 ], [ 148.3477783203125, -10.158887863159123 ], [ 148.346939086914176, -10.133055686950627 ], [ 148.30110168457054, -10.126667976379395 ], [ 148.274230957031477, -10.139706611633244 ], [ 148.258010864257926, -10.111661911010685 ], [ 148.219451904296875, -10.094325065612793 ], [ 148.178634643554688, -10.101129531860352 ], [ 148.181076049804688, -10.070444107055664 ], [ 148.21186828613304, -10.056012153625488 ], [ 148.239959716796875, -10.02157020568842 ], [ 148.230392456055142, -10.01756572723383 ], [ 148.201950073242415, -10.020000457763558 ], [ 148.1683349609375, -10.077500343322697 ], [ 148.156387329102017, -10.070278167724609 ], [ 148.149291992187614, -10.072900772094727 ], [ 148.17138671875, -10.087223052978459 ], [ 148.125900268554688, -10.125826835632267 ], [ 148.028671264648438, -10.131134986877441 ], [ 148.004714965820426, -10.160555839538574 ], [ 147.971710205078239, -10.161417961120605 ], [ 147.967926025390852, -10.143471717834473 ], [ 147.944564819335938, -10.13502311706543 ], [ 147.959213256836051, -10.120000839233398 ], [ 147.93836975097679, -10.097546577453556 ], [ 147.855270385742301, -10.101389884948674 ], [ 147.887496948242301, -10.098055839538517 ], [ 147.899368286132812, -10.080287933349609 ], [ 147.880538940429801, -10.045149803161564 ], [ 147.889175415039176, -10.035595893859863 ], [ 147.860000610351676, -10.052778244018555 ], [ 147.85194396972679, -10.096945762634277 ], [ 147.8255615234375, -10.058333396911621 ], [ 147.784912109375, -10.049908638000488 ], [ 147.750000000000341, -10.065554618835392 ], [ 147.725006103515739, -10.103334426879883 ], [ 147.708053588867188, -10.017778396606445 ], [ 147.619445800781477, -9.983611106872502 ], [ 147.516662597656705, -9.873332977294922 ], [ 147.515838623047102, -9.810832023620549 ], [ 147.478607177734375, -9.739167213439828 ], [ 147.414169311523438, -9.684722900390625 ], [ 147.396392822265625, -9.641666412353459 ], [ 147.350830078125, -9.597222328186035 ], [ 147.362228393554801, -9.581110954284668 ], [ 147.31304931640625, -9.560556411743107 ], [ 147.324996948242188, -9.539166450500431 ], [ 147.285827636718864, -9.515277862548828 ], [ 147.286407470703239, -9.44273567199707 ], [ 147.271209716796875, -9.40423393249506 ], [ 147.169906616211392, -9.357535362243596 ], [ 147.095306396484602, -9.396434783935547 ], [ 147.081939697265739, -9.428055763244572 ], [ 147.0927734375, -9.446925163269043 ], [ 147.058334350586051, -9.446623802185002 ], [ 147.007217407226676, -9.376666069030762 ], [ 146.988327026367642, -9.293889999389592 ], [ 146.997772216796875, -9.278332710266056 ], [ 146.984161376953125, -9.287499427795353 ], [ 146.938613891601904, -9.266389846801758 ], [ 146.925003051758267, -9.282501220703068 ], [ 146.897994995117188, -9.26875114440918 ], [ 146.926177978515625, -9.248126983642578 ], [ 146.9022216796875, -9.222776412963754 ], [ 146.907501220703239, -9.164443969726506 ], [ 146.916946411132926, -9.159443855285645 ], [ 146.916946411132926, -9.146944999694824 ], [ 146.924972534179915, -9.155819892883301 ], [ 146.93695068359375, -9.153055191039982 ], [ 146.918334960937614, -9.144722938537541 ], [ 146.925003051758267, -9.138609886169434 ], [ 146.926391601562614, -9.133609771728516 ], [ 146.911117553711051, -9.154165267944336 ], [ 146.89031982421875, -9.124492645263615 ], [ 146.901107788086165, -9.119167327880859 ], [ 146.910781860351562, -9.125313758850098 ], [ 146.934722900390852, -9.131668090820312 ], [ 146.95472717285179, -9.132222175598088 ], [ 146.96527099609375, -9.126111030578556 ], [ 146.967773437500114, -9.128890037536621 ], [ 146.96527099609375, -9.125276565551701 ], [ 146.948883056640739, -9.130277633666992 ], [ 146.942779541015739, -9.126111030578556 ], [ 146.932495117187614, -9.125555038452148 ], [ 146.923614501953352, -9.119167327880859 ], [ 146.963272094726562, -9.098325729370117 ], [ 146.969451904296989, -9.07055473327631 ], [ 147.016113281250227, -9.082777976989689 ], [ 146.971115112304801, -9.063888549804688 ], [ 146.991668701171875, -9.049444198608398 ], [ 147.00471496582054, -9.059721946716195 ], [ 147.018325805664176, -9.050000190734863 ], [ 147.004165649414176, -9.058055877685547 ], [ 146.991744995117415, -9.043682098388672 ], [ 146.988891601562727, -9.048334121704045 ], [ 146.979446411132812, -9.044443130493164 ], [ 146.971786499023551, -9.048959732055664 ], [ 146.977157592773438, -9.030176162719727 ], [ 146.96980285644554, -9.00771522521967 ], [ 146.946395874023438, -9.007779121398869 ], [ 146.971115112304801, -9.030278205871525 ], [ 146.957504272460938, -9.046389579772949 ], [ 146.945007324218977, -9.040263175964299 ], [ 146.963058471679688, -9.059165954589787 ], [ 146.950836181640625, -9.085000038146973 ], [ 146.881988525390625, -9.114723205566406 ], [ 146.827499389648551, -9.091667175292912 ], [ 146.809173583984602, -9.062223434448242 ], [ 146.62971496582054, -9.026944160461369 ], [ 146.59138488769554, -8.996212005615178 ], [ 146.565612792968977, -8.94175910949707 ], [ 146.56983947753929, -8.91401290893549 ], [ 146.5478515625, -8.885414123535043 ], [ 146.563934326172102, -8.850235939025822 ], [ 146.590179443359375, -8.854366302490234 ], [ 146.619338989257812, -8.791317939758301 ], [ 146.603057861328239, -8.813887596130371 ], [ 146.60028076171875, -8.799445152282658 ], [ 146.58888244628929, -8.820279121398869 ], [ 146.562774658203352, -8.813610076904297 ], [ 146.571670532226562, -8.801667213439941 ], [ 146.572616577148438, -8.786442756652775 ], [ 146.547271728515625, -8.77027702331543 ], [ 146.559387207031364, -8.749047279357853 ], [ 146.544036865234375, -8.769742965698242 ], [ 146.531524658203239, -8.759805679321289 ], [ 146.523132324218864, -8.715496063232422 ], [ 146.435272216796875, -8.616095542907715 ], [ 146.382568359375114, -8.587371826171818 ], [ 146.386016845703125, -7.920834064483643 ], [ 146.486419677734375, -7.9082350730896 ], [ 146.541107177734489, -7.825333118438721 ], [ 146.652511596680029, -7.772534847259521 ], [ 146.735107421875, -7.829336166381779 ], [ 146.723312377929688, -7.911736011505127 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-CPK", "NAME_1": "Chimbu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 145.109817504882926, -5.804034233093205 ], [ 145.16461181640625, -5.876634120941162 ], [ 145.124114990234375, -5.991734981536865 ], [ 145.13140869140625, -6.079433917999268 ], [ 145.189605712890625, -6.128933906555119 ], [ 145.25032043457054, -6.127735137939396 ], [ 145.269515991210938, -6.284033775329533 ], [ 145.245208740234489, -6.32743501663208 ], [ 145.182617187500227, -6.352435111999512 ], [ 145.188217163086051, -6.399334907531738 ], [ 145.1715087890625, -6.420235157012939 ], [ 145.022109985351904, -6.398334980010929 ], [ 144.991607666015625, -6.439936161041203 ], [ 144.988113403320426, -6.511233806610107 ], [ 145.017318725586051, -6.542435169219914 ], [ 145.104217529297102, -6.57083606719965 ], [ 145.201110839843977, -6.679935932159367 ], [ 145.303909301757926, -6.684333801269418 ], [ 145.343109130859489, -6.716034889221191 ], [ 145.3502197265625, -6.733934879302979 ], [ 145.29512023925804, -6.868734836578312 ], [ 145.203414916992415, -6.813035011291504 ], [ 145.155319213867415, -6.838734149932804 ], [ 144.994216918945426, -6.796134948730469 ], [ 144.913619995117188, -6.725635051727295 ], [ 144.851806640625, -6.747634887695256 ], [ 144.761917114257926, -6.709134101867619 ], [ 144.697814941406364, -6.710334777831974 ], [ 144.557006835937727, -6.647833824157715 ], [ 144.557907104492188, -6.60433387756342 ], [ 144.539215087890625, -6.581234931945744 ], [ 144.442306518554688, -6.563635826110783 ], [ 144.422210693359375, -6.544333934783936 ], [ 144.438613891601562, -6.460936069488469 ], [ 144.542205810546989, -6.433334827423039 ], [ 144.559814453125, -6.36993408203125 ], [ 144.602111816406591, -6.387733936309758 ], [ 144.64491271972679, -6.30973577499384 ], [ 144.682113647461051, -6.300836086273193 ], [ 144.688110351562614, -6.268733978271484 ], [ 144.725814819336165, -6.243435859680176 ], [ 144.741714477539176, -6.164634227752629 ], [ 144.72991943359375, -6.11573600769043 ], [ 144.751312255859375, -6.093635082244873 ], [ 144.694213867187614, -6.036633968353158 ], [ 144.778610229492415, -5.970334053039494 ], [ 144.802505493164517, -5.931334972381592 ], [ 144.816314697265625, -5.895534992217961 ], [ 144.79200744628929, -5.835433959960881 ], [ 144.8297119140625, -5.783133983612061 ], [ 144.867813110351562, -5.808834075927678 ], [ 145.026412963867415, -5.775935173034554 ], [ 145.079910278320312, -5.782635211944523 ], [ 145.109817504882926, -5.804034233093205 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-EBR", "NAME_1": "East New Britain" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 150.916381835937614, -6.037499904632568 ], [ 150.917770385742188, -6.038055896759033 ], [ 150.925277709961165, -6.045556068420353 ], [ 150.917221069336165, -6.046110153198242 ], [ 150.916381835937614, -6.037499904632568 ] ] ], [ [ [ 150.898056030273551, -6.024445056915283 ], [ 150.896392822265625, -6.02555513381958 ], [ 150.894439697265739, -6.024167060852051 ], [ 150.897506713867529, -6.022500991821232 ], [ 150.898056030273551, -6.024445056915283 ] ] ], [ [ [ 151.46827697753929, -5.688774108886662 ], [ 151.469467163086051, -5.689190864562931 ], [ 151.470230102539176, -5.689957141876221 ], [ 151.466064453125114, -5.688634872436467 ], [ 151.46827697753929, -5.688774108886662 ] ] ], [ [ [ 151.491149902343864, -5.626969814300537 ], [ 151.491149902343864, -5.627283096313477 ], [ 151.487686157226562, -5.627499103546143 ], [ 151.488372802734489, -5.626553058624268 ], [ 151.491149902343864, -5.626969814300537 ] ] ], [ [ [ 151.748611450195312, -5.570555210113525 ], [ 151.750000000000227, -5.573888778686467 ], [ 151.745834350586051, -5.573888778686467 ], [ 151.744720458984489, -5.571667194366398 ], [ 151.748611450195312, -5.570555210113525 ] ] ], [ [ [ 151.744720458984489, -5.576389789581299 ], [ 151.739166259765739, -5.571667194366398 ], [ 151.740280151367415, -5.563056945800781 ], [ 151.74249267578125, -5.565555095672551 ], [ 151.744720458984489, -5.576389789581299 ] ] ], [ [ [ 151.64735412597679, -5.55215311050415 ], [ 151.645004272460938, -5.543333053588867 ], [ 151.64666748046875, -5.538610935211182 ], [ 151.651947021484489, -5.546389102935791 ], [ 151.64735412597679, -5.55215311050415 ] ] ], [ [ [ 152.347900390625, -4.267350196838322 ], [ 152.3499755859375, -4.270257949829102 ], [ 152.338378906250227, -4.271755218505859 ], [ 152.344467163085938, -4.266406059265137 ], [ 152.347900390625, -4.267350196838322 ] ] ], [ [ [ 152.416702270507926, -4.241387844085693 ], [ 152.423812866210938, -4.242096900939828 ], [ 152.41413879394554, -4.246724128723145 ], [ 152.408401489257926, -4.238293170928955 ], [ 152.416702270507926, -4.241387844085693 ] ] ], [ [ [ 152.397247314453239, -4.234067916870117 ], [ 152.40634155273483, -4.236446857452336 ], [ 152.388092041015739, -4.23773193359375 ], [ 152.389633178710938, -4.2343430519104 ], [ 152.397247314453239, -4.234067916870117 ] ] ], [ [ [ 152.438903808593977, -4.22888708114624 ], [ 152.442001342773665, -4.228431224822998 ], [ 152.44691467285179, -4.229754924774056 ], [ 152.441299438476676, -4.23443698883051 ], [ 152.438903808593977, -4.22888708114624 ] ] ], [ [ [ 152.461151123047216, -4.22442722320551 ], [ 152.466598510742415, -4.232007026672363 ], [ 152.449707031250341, -4.233882904052734 ], [ 152.454269409179801, -4.224957942962646 ], [ 152.461151123047216, -4.22442722320551 ] ] ], [ [ [ 152.464599609375, -4.217082977294808 ], [ 152.467926025390852, -4.217432022094727 ], [ 152.465560913085938, -4.220832824707031 ], [ 152.463134765625114, -4.220346927642822 ], [ 152.464599609375, -4.217082977294808 ] ] ], [ [ [ 151.810546875000114, -4.213358879089355 ], [ 151.808944702148665, -4.213150024414006 ], [ 151.808593750000114, -4.212386131286507 ], [ 151.810119628906364, -4.212594032287541 ], [ 151.810546875000114, -4.213358879089355 ] ] ], [ [ [ 151.73628234863304, -4.203595161437988 ], [ 151.735519409179915, -4.203247070312443 ], [ 151.735992431640625, -4.202065944671631 ], [ 151.736968994140625, -4.202691078185978 ], [ 151.73628234863304, -4.203595161437988 ] ] ], [ [ [ 152.414566040039062, -4.201935768127385 ], [ 152.43255615234375, -4.223141193389893 ], [ 152.432235717773551, -4.233559131622258 ], [ 152.396591186523665, -4.219143867492676 ], [ 152.414566040039062, -4.201935768127385 ] ] ], [ [ [ 152.42555236816429, -4.204720973968392 ], [ 152.424163818359375, -4.204720973968392 ], [ 152.421661376953239, -4.201388835906982 ], [ 152.424438476562727, -4.20111083984375 ], [ 152.42555236816429, -4.204720973968392 ] ] ], [ [ [ 151.795562744140739, -4.199722766876164 ], [ 151.794723510742529, -4.199722766876164 ], [ 151.79444885253929, -4.198054790496826 ], [ 151.796112060546875, -4.198332786560002 ], [ 151.795562744140739, -4.199722766876164 ] ] ], [ [ [ 151.940368652343977, -4.17858695983881 ], [ 151.946624755859489, -4.183596134185791 ], [ 151.944305419921875, -4.188353061676025 ], [ 151.9342041015625, -4.182775974273625 ], [ 151.940368652343977, -4.17858695983881 ] ] ], [ [ [ 151.573074340820426, -4.158741950988656 ], [ 151.576644897461392, -4.160048007965088 ], [ 151.577728271484602, -4.163647174835205 ], [ 151.567779541015625, -4.156112194061222 ], [ 151.573074340820426, -4.158741950988656 ] ] ], [ [ [ 151.568878173828239, -4.146534919738656 ], [ 151.567489624023892, -4.145700931549015 ], [ 151.567626953125227, -4.144588947296086 ], [ 151.569366455078352, -4.145840167999211 ], [ 151.568878173828239, -4.146534919738656 ] ] ], [ [ [ 152.194839477539062, -4.163527965545654 ], [ 152.234573364257812, -4.244133949279785 ], [ 152.208709716797102, -4.25089693069458 ], [ 152.196395874023551, -4.226666927337646 ], [ 152.184677124023665, -4.247994899749699 ], [ 152.177215576172102, -4.203888893127441 ], [ 152.160598754882812, -4.205523967742863 ], [ 152.148910522461051, -4.228633880615234 ], [ 152.172195434570312, -4.261407852172852 ], [ 152.156112670898551, -4.283269882202148 ], [ 152.168228149414062, -4.303809165954533 ], [ 152.212188720703239, -4.293382167816105 ], [ 152.278076171875, -4.342771053314209 ], [ 152.391662597656364, -4.321665763854924 ], [ 152.404769897461051, -4.336120128631592 ], [ 152.381942749023551, -4.397500038146973 ], [ 152.355407714843977, -4.416094779968262 ], [ 152.359741210937727, -4.440909862518311 ], [ 152.331497192382812, -4.496329784393311 ], [ 152.382431030273438, -4.615058898925781 ], [ 152.382751464843864, -4.67837381362915 ], [ 152.365386962890739, -4.768818855285645 ], [ 152.328186035156364, -4.818107128143311 ], [ 152.333801269531477, -4.83523511886591 ], [ 152.221466064453352, -4.96998405456543 ], [ 152.160568237304688, -4.97334623336792 ], [ 152.14324951171875, -4.989083766937199 ], [ 152.027770996093864, -4.965278148651123 ], [ 152.006057739258154, -4.98958683013916 ], [ 151.998214721679801, -4.971992015838566 ], [ 151.970550537109489, -4.969165802001953 ], [ 151.952758789062727, -4.990168094634953 ], [ 151.950439453125114, -5.022334098815861 ], [ 151.96832275390625, -5.043666839599609 ], [ 151.942810058593864, -5.097107887268066 ], [ 151.949813842773438, -5.141892910003605 ], [ 151.993896484375, -5.196389198303223 ], [ 152.020736694336051, -5.196723937988281 ], [ 152.055053710937614, -5.223379135131836 ], [ 152.13337707519554, -5.329991817474365 ], [ 152.133895874023438, -5.36583423614502 ], [ 152.085159301757926, -5.425864219665527 ], [ 152.086547851562841, -5.447021007537785 ], [ 152.056106567382926, -5.445257186889592 ], [ 152.010330200195426, -5.468760013580322 ], [ 151.959716796875, -5.518332958221379 ], [ 151.915832519531364, -5.525834083557015 ], [ 151.888336181640625, -5.54999923706049 ], [ 151.860549926757812, -5.542500972747746 ], [ 151.811950683593977, -5.587500095367432 ], [ 151.755554199219205, -5.560277938842717 ], [ 151.72138977050804, -5.515276908874455 ], [ 151.658340454101676, -5.512500762939453 ], [ 151.622222900390852, -5.567777156829777 ], [ 151.5836181640625, -5.528612136840763 ], [ 151.471115112304915, -5.521667003631535 ], [ 151.44476318359375, -5.571070194244328 ], [ 151.455307006836165, -5.629885196685734 ], [ 151.512771606445312, -5.635834217071533 ], [ 151.5130615234375, -5.671667098998967 ], [ 151.491394042968864, -5.69277811050415 ], [ 151.47860717773483, -5.69388818740839 ], [ 151.452499389648438, -5.685277938842717 ], [ 151.408615112304801, -5.703054904937687 ], [ 151.426391601562614, -5.710555076599121 ], [ 151.389450073242188, -5.735833168029671 ], [ 151.40167236328125, -5.750556945800724 ], [ 151.375000000000114, -5.808125019073486 ], [ 151.209716796875114, -5.901668071746826 ], [ 151.215560913086165, -5.923055171966553 ], [ 151.186325073242188, -5.956014156341496 ], [ 151.166107177734375, -5.960556030273381 ], [ 151.150558471679801, -5.940001010894775 ], [ 151.125839233398438, -5.963332176208382 ], [ 151.109024047851676, -5.955275058746281 ], [ 151.009262084961051, -6.033789157867375 ], [ 150.985488891601562, -6.007362842559814 ], [ 150.954650878906477, -6.019651889800969 ], [ 150.907226562500114, -6.010000228881836 ], [ 150.827774047851676, -6.046666145324707 ], [ 150.814163208007812, -6.022500991821232 ], [ 150.788391113281364, -6.022847175598145 ], [ 150.795272827148779, -6.017221927642822 ], [ 150.796112060546989, -6.014165878295898 ], [ 150.786117553711279, -6.00222110748291 ], [ 150.794479370117301, -6.016091823577881 ], [ 150.76861572265625, -6.038611888885498 ], [ 150.780181884765739, -6.07494401931757 ], [ 150.606811523437614, -5.919235229492188 ], [ 150.594207763671989, -5.73863410949707 ], [ 150.729217529296989, -5.732833862304631 ], [ 150.814514160156364, -5.748035907745361 ], [ 150.945816040039062, -5.702435016632023 ], [ 150.954818725586165, -5.673435211181584 ], [ 150.939010620117415, -5.626934051513672 ], [ 150.950515747070426, -5.599034786224365 ], [ 151.030319213867415, -5.609535217285099 ], [ 151.212509155273665, -5.474934101104736 ], [ 151.213607788085938, -5.432634830474854 ], [ 151.152908325195312, -5.421435832977238 ], [ 151.142211914062614, -5.39533519744873 ], [ 151.265213012695426, -5.150934219360295 ], [ 151.342208862304915, -5.039535045623779 ], [ 151.429611206054688, -4.981234073638916 ], [ 151.690017700195312, -4.97843599319458 ], [ 151.645706176757926, -4.934734821319466 ], [ 151.68550109863304, -4.867275238037053 ], [ 151.691390991210938, -4.797221183776855 ], [ 151.657501220703352, -4.765776157379094 ], [ 151.66717529296875, -4.674827098846379 ], [ 151.656875610351562, -4.612627029418945 ], [ 151.611312866211051, -4.564597129821777 ], [ 151.62158203125, -4.47567892074585 ], [ 151.558258056640625, -4.39619779586792 ], [ 151.533050537109375, -4.387845039367676 ], [ 151.534057617187727, -4.341302871703988 ], [ 151.508743286133267, -4.309707164764404 ], [ 151.520217895507812, -4.289424896240234 ], [ 151.490097045898551, -4.210516929626465 ], [ 151.52239990234375, -4.185382843017578 ], [ 151.55731201171875, -4.189073085784855 ], [ 151.571838378906364, -4.206385135650635 ], [ 151.633895874023438, -4.189722061157227 ], [ 151.634719848632812, -4.200078964233398 ], [ 151.706481933593977, -4.200108051299992 ], [ 151.719406127929688, -4.219678878784123 ], [ 151.765289306640739, -4.204090118408146 ], [ 151.833007812500114, -4.218915939330998 ], [ 151.853286743164062, -4.235957145690918 ], [ 151.839706420898551, -4.271603107452393 ], [ 151.8504638671875, -4.289158821105957 ], [ 151.946533203125114, -4.341112136840707 ], [ 151.988006591797102, -4.317158222198486 ], [ 152.031661987304688, -4.259168148040715 ], [ 151.983352661132926, -4.213062763214054 ], [ 151.98519897460983, -4.197357177734375 ], [ 152.124160766601562, -4.208333969116154 ], [ 152.166183471679915, -4.132823944091797 ], [ 152.194839477539062, -4.163527965545654 ] ] ], [ [ [ 152.450332641601562, -4.121941089630127 ], [ 152.496063232421875, -4.16053581237793 ], [ 152.470458984375, -4.215741157531681 ], [ 152.468093872070426, -4.213890075683594 ], [ 152.473007202148438, -4.203651905059701 ], [ 152.472213745117529, -4.191467761993408 ], [ 152.456130981445426, -4.21296501159668 ], [ 152.430648803710938, -4.212770938873291 ], [ 152.441024780273665, -4.181049823760873 ], [ 152.411041259765625, -4.164589881896973 ], [ 152.446670532226562, -4.144444942474308 ], [ 152.450332641601562, -4.121941089630127 ] ] ], [ [ [ 152.441940307617188, -4.116944789886475 ], [ 152.441390991211051, -4.117498874664307 ], [ 152.439361572265625, -4.114811897277832 ], [ 152.441406250000227, -4.115334033966008 ], [ 152.441940307617188, -4.116944789886475 ] ] ], [ [ [ 152.4381103515625, -4.113141059875431 ], [ 152.43695068359375, -4.114445209503117 ], [ 152.434570312500455, -4.112096786498967 ], [ 152.436996459961165, -4.112167835235539 ], [ 152.4381103515625, -4.113141059875431 ] ] ], [ [ [ 152.42312622070358, -4.117535114288216 ], [ 152.43055725097679, -4.121127128601074 ], [ 152.434112548828125, -4.131944179534855 ], [ 152.406753540039062, -4.115664005279484 ], [ 152.42312622070358, -4.117535114288216 ] ] ], [ [ [ 152.075378417968864, -4.088070869445744 ], [ 152.091201782226676, -4.106321811675969 ], [ 152.082427978515739, -4.131063938140869 ], [ 152.056396484375114, -4.120276927947884 ], [ 152.057220458984375, -4.096110820770207 ], [ 152.075378417968864, -4.088070869445744 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-ESW", "NAME_1": "East Sepik" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 144.50111389160179, -3.950553894042969 ], [ 144.509994506835938, -3.960555076599121 ], [ 144.504440307617301, -3.962498903274479 ], [ 144.496673583984375, -3.976109981536808 ], [ 144.488891601562727, -3.954722881317139 ], [ 144.50111389160179, -3.950553894042969 ] ] ], [ [ [ 144.509445190429688, -3.944721937179565 ], [ 144.52471923828125, -3.95194506645197 ], [ 144.5191650390625, -3.965555906295776 ], [ 144.502777099609375, -3.945833921432495 ], [ 144.509445190429688, -3.944721937179565 ] ] ], [ [ [ 144.481048583984375, -3.932004928588867 ], [ 144.494720458984489, -3.944999933242798 ], [ 144.485839843750227, -3.95194506645197 ], [ 144.475555419922102, -3.941112041473389 ], [ 144.481048583984375, -3.932004928588867 ] ] ], [ [ [ 144.251159667969091, -3.813108921051025 ], [ 144.260787963867415, -3.814095973968392 ], [ 144.264724731445312, -3.818054914474487 ], [ 144.25250244140625, -3.825555086135807 ], [ 144.251159667969091, -3.813108921051025 ] ] ], [ [ [ 144.21846008300804, -3.811835050582886 ], [ 144.244094848632926, -3.821944952011108 ], [ 144.237258911132812, -3.834621906280518 ], [ 144.220962524414176, -3.827138900756779 ], [ 144.21846008300804, -3.811835050582886 ] ] ], [ [ [ 144.126663208007812, -3.811666011810303 ], [ 144.125839233398551, -3.809999942779484 ], [ 144.12611389160179, -3.806665897369328 ], [ 144.126937866211051, -3.809165954589787 ], [ 144.126663208007812, -3.811666011810303 ] ] ], [ [ [ 144.35731506347679, -3.811985015869141 ], [ 144.35346984863304, -3.811358928680363 ], [ 144.352401733398438, -3.801898002624455 ], [ 144.355865478515739, -3.805584907531681 ], [ 144.35731506347679, -3.811985015869141 ] ] ], [ [ [ 144.363616943359602, -3.802500009536686 ], [ 144.361373901367301, -3.799837112426758 ], [ 144.366271972656477, -3.797255039215088 ], [ 144.366668701172102, -3.798610925674438 ], [ 144.363616943359602, -3.802500009536686 ] ] ], [ [ [ 144.352783203125, -3.797236919403019 ], [ 144.349716186523551, -3.803889989852848 ], [ 144.349716186523551, -3.809721946716252 ], [ 144.326660156250114, -3.821110963821411 ], [ 144.352783203125, -3.797236919403019 ] ] ], [ [ [ 144.368057250976676, -3.796667098999023 ], [ 144.366775512695312, -3.796875 ], [ 144.366500854492301, -3.794508934020996 ], [ 144.367782592773551, -3.794723033905029 ], [ 144.368057250976676, -3.796667098999023 ] ] ], [ [ [ 144.252777099609602, -3.789722919464054 ], [ 144.271667480468977, -3.800554990768433 ], [ 144.236404418945767, -3.817861080169678 ], [ 144.230560302734716, -3.80555605888361 ], [ 144.252777099609602, -3.789722919464054 ] ] ], [ [ [ 144.184570312500114, -3.791234016418457 ], [ 144.191665649414062, -3.798888921737671 ], [ 144.179992675781364, -3.8125 ], [ 144.182495117187841, -3.805278062820435 ], [ 144.177780151367188, -3.793333053588867 ], [ 144.184570312500114, -3.791234016418457 ] ] ], [ [ [ 144.167007446289062, -3.788674116134644 ], [ 144.180557250976676, -3.805278062820435 ], [ 144.175247192383154, -3.814479112625122 ], [ 144.158615112304688, -3.804166078567505 ], [ 144.167007446289062, -3.788674116134644 ] ] ], [ [ [ 144.252258300781364, -3.787079095840454 ], [ 144.242630004882812, -3.790278911590519 ], [ 144.235000610351562, -3.789166927337646 ], [ 144.238891601562614, -3.785136938095093 ], [ 144.252258300781364, -3.787079095840454 ] ] ], [ [ [ 144.1905517578125, -3.777499914169312 ], [ 144.267501831054801, -3.778889894485474 ], [ 144.271163940429801, -3.787463903427067 ], [ 144.231674194336051, -3.784166097640991 ], [ 144.224166870117415, -3.813055992126408 ], [ 144.218521118164176, -3.803728103637695 ], [ 144.190826416015739, -3.812777996063176 ], [ 144.195281982421875, -3.797498941421509 ], [ 144.185379028320312, -3.782743930816537 ], [ 144.1905517578125, -3.777499914169312 ] ] ], [ [ [ 144.5938720703125, -3.611123085021916 ], [ 144.583129882812727, -3.61213493347168 ], [ 144.584106445312727, -3.601794004440194 ], [ 144.591873168945312, -3.60235691070551 ], [ 144.5938720703125, -3.611123085021916 ] ] ], [ [ [ 144.820007324218977, -3.596944093704224 ], [ 144.83367919921875, -3.615334987640324 ], [ 144.81939697265625, -3.625736951828003 ], [ 144.803970336914062, -3.6146080493927 ], [ 144.820007324218977, -3.596944093704224 ] ] ], [ [ [ 144.588058471679688, -3.513334035873356 ], [ 144.585815429687727, -3.51067399978632 ], [ 144.586395263672102, -3.50888991355896 ], [ 144.588607788085938, -3.512778043746891 ], [ 144.588058471679688, -3.513334035873356 ] ] ], [ [ [ 143.604171752929801, -3.506942987442017 ], [ 143.601943969726562, -3.506390094757023 ], [ 143.603332519531477, -3.504167079925537 ], [ 143.605560302734375, -3.505554914474487 ], [ 143.604171752929801, -3.506942987442017 ] ] ], [ [ [ 144.604171752929688, -3.496388912200928 ], [ 144.62318420410179, -3.50957798957819 ], [ 144.61763000488304, -3.518471002578679 ], [ 144.589935302734375, -3.51294207572937 ], [ 144.604171752929688, -3.496388912200928 ] ] ], [ [ [ 143.49063110351608, -3.409612894058114 ], [ 143.482284545898551, -3.405694961547852 ], [ 143.485092163086165, -3.400899887084961 ], [ 143.490814208984602, -3.402834892272949 ], [ 143.49063110351608, -3.409612894058114 ] ] ], [ [ [ 143.44465637207054, -3.389448881149292 ], [ 143.453506469726904, -3.392023086547852 ], [ 143.461227416992415, -3.397479057312012 ], [ 143.436370849609375, -3.391844987869263 ], [ 143.44465637207054, -3.389448881149292 ] ] ], [ [ [ 144.413604736328239, -3.38277792930603 ], [ 144.424758911132812, -3.398967027664185 ], [ 144.383895874023551, -3.398612022399846 ], [ 144.398605346679688, -3.38388800621027 ], [ 144.413604736328239, -3.38277792930603 ] ] ], [ [ [ 143.553390502929801, -3.384227991104126 ], [ 143.594543457031364, -3.392268896102848 ], [ 143.636108398437727, -3.419203996658325 ], [ 143.56843566894554, -3.448012113571167 ], [ 143.545791625976676, -3.434252977371216 ], [ 143.559448242187614, -3.429444074630737 ], [ 143.550735473632926, -3.415019035339242 ], [ 143.574386596679801, -3.413183927536011 ], [ 143.536804199218864, -3.386810064315796 ], [ 143.553390502929801, -3.384227991104126 ] ] ], [ [ [ 143.121948242187614, -3.354166030883789 ], [ 143.201950073242188, -3.368055105209351 ], [ 143.236663818359375, -3.391944885253849 ], [ 143.420272827148551, -3.409722089767456 ], [ 143.46388244628929, -3.438610076904297 ], [ 143.51361083984375, -3.44166707992548 ], [ 143.557006835937955, -3.474510908126774 ], [ 143.574172973633267, -3.513056039810124 ], [ 143.596343994140739, -3.517442941665593 ], [ 143.593338012695312, -3.539443969726562 ], [ 143.61305236816429, -3.55666708946228 ], [ 143.632781982421989, -3.548332929611149 ], [ 143.631668090820312, -3.566112041473389 ], [ 143.676940917968864, -3.579998970031738 ], [ 143.703048706054688, -3.551110982894841 ], [ 143.695556640625, -3.585555076599121 ], [ 143.707504272461051, -3.599723100662231 ], [ 143.783050537109489, -3.620277881622258 ], [ 143.824722290039062, -3.647778034210205 ], [ 143.828613281250455, -3.675833940505981 ], [ 143.925277709961051, -3.715958118438721 ], [ 143.974716186523892, -3.789722919464054 ], [ 144.016281127929915, -3.79562592506403 ], [ 143.997955322265852, -3.797076940536499 ], [ 144.00250244140625, -3.819444894790649 ], [ 144.02333068847679, -3.819166898727417 ], [ 144.03277587890625, -3.795833110809212 ], [ 144.009170532226562, -3.798888921737671 ], [ 144.019638061523438, -3.794450044631958 ], [ 144.174728393554688, -3.778611898422241 ], [ 144.14971923828125, -3.798610925674438 ], [ 144.117156982421989, -3.799504995346069 ], [ 144.091384887695312, -3.813055992126408 ], [ 144.086669921875227, -3.826942920684758 ], [ 144.118057250976562, -3.802221059799137 ], [ 144.126388549804801, -3.824999094009343 ], [ 144.180831909179688, -3.846389055252018 ], [ 144.204162597656477, -3.814421892166138 ], [ 144.215270996093864, -3.853888988494816 ], [ 144.26300048828125, -3.868385076522827 ], [ 144.24305725097679, -3.841109991073608 ], [ 144.288116455078239, -3.816250085830688 ], [ 144.27583312988304, -3.798610925674438 ], [ 144.302505493164062, -3.805000066757202 ], [ 144.316680908203352, -3.830190896987915 ], [ 144.35652160644554, -3.814929962158203 ], [ 144.369766235351676, -3.827138900756779 ], [ 144.365585327148551, -3.831732034683228 ], [ 144.36476135253929, -3.838222980499268 ], [ 144.38330078125, -3.877825021743774 ], [ 144.339843750000114, -3.878259897232056 ], [ 144.360565185547102, -3.887468099594059 ], [ 144.385528564453352, -3.879344940185547 ], [ 144.367630004883267, -3.831814050674438 ], [ 144.411117553711392, -3.8247230052948 ], [ 144.432785034179688, -3.804444074630737 ], [ 144.43055725097679, -3.798888921737671 ], [ 144.408889770507926, -3.8247230052948 ], [ 144.366943359375, -3.823889017104989 ], [ 144.35749816894554, -3.808056116104126 ], [ 144.37249755859375, -3.8002769947052 ], [ 144.370834350586051, -3.794167041778564 ], [ 144.365615844726562, -3.793881893157845 ], [ 144.3558349609375, -3.80472207069397 ], [ 144.35382080078125, -3.796471118927002 ], [ 144.350311279296989, -3.794061899185181 ], [ 144.324172973632812, -3.816111087799015 ], [ 144.309448242187727, -3.802500009536686 ], [ 144.315551757812727, -3.786662101745549 ], [ 144.296112060546989, -3.799166917800903 ], [ 144.282501220703125, -3.780277967453003 ], [ 144.319442749023779, -3.784444093704167 ], [ 144.320678710937727, -3.792999982833862 ], [ 144.324707031250227, -3.797522068023625 ], [ 144.323059082031364, -3.785217046737671 ], [ 144.376388549804915, -3.784444093704167 ], [ 144.535888671875, -3.818093061447144 ], [ 144.52777099609375, -3.857414960861149 ], [ 144.545776367187955, -3.852014064788818 ], [ 144.562606811523551, -3.880758047103882 ], [ 144.547363281250114, -3.906836032867432 ], [ 144.542068481445312, -3.904804944992009 ], [ 144.555099487304915, -3.883447885513306 ], [ 144.556274414062614, -3.875654935836735 ], [ 144.548889160156364, -3.868887901306152 ], [ 144.55426025390625, -3.883099079132023 ], [ 144.514160156250114, -3.944165945053101 ], [ 144.479995727539176, -3.921387910842896 ], [ 144.466094970703239, -3.92430305480957 ], [ 144.480560302734489, -3.925278902053833 ], [ 144.474441528320767, -3.9375 ], [ 144.472778320312614, -3.953054904937687 ], [ 144.447494506836165, -3.941665887832642 ], [ 144.511199951172102, -3.994075059890747 ], [ 144.497772216796989, -3.976387977600041 ], [ 144.509445190429688, -3.967221975326538 ], [ 144.508926391601676, -3.964694023132267 ], [ 144.505981445312841, -3.962291955947819 ], [ 144.512222290039176, -3.962776899337712 ], [ 144.518051147460938, -3.968333959579468 ], [ 144.519729614257812, -3.975831985473576 ], [ 144.526947021484489, -3.983889102935791 ], [ 144.515655517578239, -4.004267215728703 ], [ 144.525695800781477, -4.008264064788705 ], [ 144.528610229492642, -3.985832929611206 ], [ 144.5191650390625, -3.970278024673348 ], [ 144.52777099609375, -3.95777702331543 ], [ 144.522506713867642, -3.941387891769409 ], [ 144.544860839843864, -3.907910108566284 ], [ 144.544250488281705, -3.959467887878361 ], [ 144.57588195800804, -3.997989892959595 ], [ 144.574218750000114, -4.58783483505249 ], [ 144.03211975097679, -4.993134021759033 ], [ 143.353912353515739, -5.136535167694092 ], [ 143.317810058593977, -5.158234119415283 ], [ 143.251617431640852, -5.120835781097412 ], [ 143.100311279296875, -5.10373592376709 ], [ 143.051818847656591, -5.105134963989258 ], [ 143.007507324218864, -5.128935813903752 ], [ 142.85101318359375, -5.029835224151611 ], [ 142.787017822265739, -5.026834964752197 ], [ 142.750717163086165, -5.042234897613469 ], [ 142.66511535644554, -4.982234954833984 ], [ 142.560806274414176, -4.991934776306152 ], [ 142.452117919921989, -4.96263408660883 ], [ 142.389816284179688, -4.993134021759033 ], [ 142.324310302734489, -4.941134929656982 ], [ 142.322616577148551, -4.636435031890869 ], [ 142.309616088867301, -4.613533973693791 ], [ 141.383010864258267, -4.613433837890625 ], [ 141.347610473632812, -4.602034091949406 ], [ 141.340118408203239, -4.259035110473633 ], [ 141.36660766601608, -4.235033988952637 ], [ 141.71630859375, -3.99073600769043 ], [ 141.762817382812614, -4.00083398818964 ], [ 141.772720336914176, -4.025834083557129 ], [ 141.834716796875114, -4.059733867645264 ], [ 142.528320312500227, -4.05703592300415 ], [ 142.539718627929688, -3.93013596534729 ], [ 142.616714477539062, -3.920536041259766 ], [ 142.628906250000114, -3.90603399276722 ], [ 142.638519287109375, -3.792335033416748 ], [ 142.609619140625227, -3.667733907699528 ], [ 142.615615844726562, -3.555334091186523 ], [ 142.642013549804801, -3.516834974288884 ], [ 142.619613647461279, -3.44013500213623 ], [ 142.695709228515739, -3.444534063339177 ], [ 142.772308349609602, -3.401532888412476 ], [ 142.856719970703125, -3.471934080123901 ], [ 142.958419799804688, -3.495135068893376 ], [ 143.039215087890739, -3.538434028625488 ], [ 143.0841064453125, -3.529634952545109 ], [ 143.08941650390625, -3.369136095046997 ], [ 143.121948242187614, -3.354166030883789 ] ] ], [ [ [ 144.20106506347679, -3.347440004348755 ], [ 144.214996337890852, -3.351111888885441 ], [ 144.221313476562727, -3.362726926803589 ], [ 144.195175170898665, -3.36004900932312 ], [ 144.20106506347679, -3.347440004348755 ] ] ], [ [ [ 143.537506103515852, -3.309722900390568 ], [ 143.606384277343977, -3.350833892822209 ], [ 143.61610412597679, -3.367777109146118 ], [ 143.570831298828125, -3.378887891769409 ], [ 143.510284423828239, -3.355556011199951 ], [ 143.50166320800804, -3.33250093460083 ], [ 143.51361083984375, -3.340832948684579 ], [ 143.521118164062727, -3.324166059494019 ], [ 143.509719848632926, -3.31722092628479 ], [ 143.537506103515852, -3.309722900390568 ] ] ], [ [ [ 143.337783813476562, -3.241666078567505 ], [ 143.335830688476562, -3.24222207069397 ], [ 143.334228515625455, -3.240693092346191 ], [ 143.336395263672216, -3.239722013473511 ], [ 143.337783813476562, -3.241666078567505 ] ] ], [ [ [ 143.297851562500114, -3.213730096817017 ], [ 143.317764282226562, -3.233092069625798 ], [ 143.333053588867415, -3.241666078567505 ], [ 143.303146362304801, -3.243773937225342 ], [ 143.273727416992301, -3.220746040344238 ], [ 143.297851562500114, -3.213730096817017 ] ] ], [ [ [ 143.254928588867301, -3.192914962768555 ], [ 143.269439697265739, -3.214999914169255 ], [ 143.255493164062614, -3.221096992492676 ], [ 143.246322631836051, -3.199819087982121 ], [ 143.254928588867301, -3.192914962768555 ] ] ], [ [ [ 144.089996337890625, -3.189166069030705 ], [ 144.133056640625, -3.228332996368408 ], [ 144.088912963867415, -3.253799915313721 ], [ 144.062500000000114, -3.21526908874506 ], [ 144.089996337890625, -3.189166069030705 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-EHG", "NAME_1": "Eastern Highlands" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 145.295211791992301, -5.884734153747502 ], [ 145.37481689453125, -5.861333847045842 ], [ 145.420318603515739, -5.934535026550293 ], [ 145.479812622070426, -5.978434085845947 ], [ 145.527114868164176, -5.973533153533879 ], [ 145.584518432617642, -5.905334949493408 ], [ 145.6588134765625, -5.921934127807617 ], [ 145.663818359375227, -5.981535911560002 ], [ 145.820617675781477, -5.975334167480469 ], [ 145.862106323242529, -5.996534824371338 ], [ 145.8878173828125, -6.048133850097599 ], [ 145.930908203125114, -6.084135055541935 ], [ 146.134017944336165, -6.206134796142521 ], [ 146.0294189453125, -6.689435005187988 ], [ 145.987411499023551, -6.740635871887207 ], [ 146.015609741210938, -6.841134071350041 ], [ 146.00660705566429, -6.886936187744141 ], [ 145.927413940429915, -6.984435081481934 ], [ 145.900909423828239, -7.098834037780762 ], [ 145.797119140625, -7.085134029388428 ], [ 145.74201965332054, -7.158435821533203 ], [ 145.693618774414517, -7.145033836364746 ], [ 145.29512023925804, -6.868734836578312 ], [ 145.3502197265625, -6.733934879302979 ], [ 145.327407836914517, -6.700533866882324 ], [ 145.303909301757926, -6.684333801269418 ], [ 145.201110839843977, -6.679935932159367 ], [ 145.104217529297102, -6.57083606719965 ], [ 144.990005493164176, -6.521335124969426 ], [ 144.990509033203125, -6.443735122680607 ], [ 145.022109985351904, -6.398334980010929 ], [ 145.1715087890625, -6.420235157012939 ], [ 145.188217163086051, -6.399334907531738 ], [ 145.182617187500227, -6.352435111999512 ], [ 145.262619018554801, -6.308835029602051 ], [ 145.25032043457054, -6.127735137939396 ], [ 145.189605712890625, -6.128933906555119 ], [ 145.13140869140625, -6.079433917999268 ], [ 145.124114990234375, -5.991734981536865 ], [ 145.16461181640625, -5.876634120941162 ], [ 145.230209350585938, -5.852434158325195 ], [ 145.26960754394554, -5.858233928680363 ], [ 145.295211791992301, -5.884734153747502 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-EPW", "NAME_1": "Enga" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 144.134613037109489, -5.148035049438477 ], [ 144.181320190429801, -5.191036224365178 ], [ 144.245819091797216, -5.218733787536621 ], [ 144.235519409180029, -5.340535163879281 ], [ 144.140518188476676, -5.351035118103027 ], [ 144.11811828613304, -5.380434036254883 ], [ 144.046112060546989, -5.413335800170898 ], [ 144.03211975097679, -5.454235076904297 ], [ 143.994415283203239, -5.478233814239388 ], [ 143.990417480468864, -5.558934211730957 ], [ 144.022216796875114, -5.594035148620549 ], [ 144.025619506836165, -5.665833950042668 ], [ 144.0537109375, -5.748233795166016 ], [ 143.954910278320312, -5.793735027313232 ], [ 143.910919189453125, -5.781233787536621 ], [ 143.867919921875114, -5.821033954620361 ], [ 143.80531311035179, -5.8211350440979 ], [ 143.770919799804688, -5.838435173034668 ], [ 143.830917358398551, -5.937035083770695 ], [ 143.709014892578352, -5.903035163879395 ], [ 143.517517089843977, -5.975135803222656 ], [ 143.355712890625, -5.877433776855469 ], [ 143.254608154296875, -5.751334190368652 ], [ 142.775115966796875, -5.594634056091252 ], [ 142.75190734863304, -5.573634147643986 ], [ 142.750717163086165, -5.042234897613469 ], [ 142.77131652832054, -5.029335021972656 ], [ 142.85101318359375, -5.029835224151611 ], [ 143.007507324218864, -5.128935813903752 ], [ 143.051818847656591, -5.105134963989258 ], [ 143.100311279296875, -5.10373592376709 ], [ 143.251617431640852, -5.120835781097412 ], [ 143.317810058593977, -5.158234119415283 ], [ 143.353912353515739, -5.136535167694092 ], [ 143.9691162109375, -5.010334014892521 ], [ 144.032913208007926, -5.066133975982666 ], [ 144.098312377930142, -5.078934192657471 ], [ 144.134613037109489, -5.148035049438477 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-GPK", "NAME_1": "Gulf" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 145.732772827148551, -7.94166707992548 ], [ 145.734725952148438, -7.943055152893066 ], [ 145.728881835937727, -7.945556163787728 ], [ 145.730270385742188, -7.943333148956299 ], [ 145.732772827148551, -7.94166707992548 ] ] ], [ [ [ 145.419128417968977, -7.941180229187012 ], [ 145.419403076171989, -7.939583778381234 ], [ 145.422058105468864, -7.940070152282715 ], [ 145.421920776367188, -7.940279006958008 ], [ 145.419128417968977, -7.941180229187012 ] ] ], [ [ [ 145.425277709961051, -7.942777156829834 ], [ 145.421951293945312, -7.94389009475708 ], [ 145.418502807617188, -7.942011833190861 ], [ 145.428329467773551, -7.938889026641789 ], [ 145.425277709961051, -7.942777156829834 ] ] ], [ [ [ 145.742584228515852, -7.935894012451172 ], [ 145.738983154297102, -7.938363075256348 ], [ 145.73591613769554, -7.938653945922738 ], [ 145.738403320312614, -7.936159133911076 ], [ 145.742584228515852, -7.935894012451172 ] ] ], [ [ [ 145.787445068359602, -7.926775932312012 ], [ 145.787506103515739, -7.925000190734863 ], [ 145.7904052734375, -7.923326969146729 ], [ 145.789993286132926, -7.925834178924561 ], [ 145.787445068359602, -7.926775932312012 ] ] ], [ [ [ 145.362777709960938, -7.878054141998291 ], [ 145.386383056640739, -7.899444103240967 ], [ 145.38667297363304, -7.906945228576603 ], [ 145.39222717285179, -7.914444923400879 ], [ 145.391387939453125, -7.918612003326359 ], [ 145.362777709960938, -7.878054141998291 ] ] ], [ [ [ 145.035003662109602, -7.82722282409668 ], [ 145.032775878906364, -7.82611083984375 ], [ 145.033340454101676, -7.823331832885685 ], [ 145.034439086914517, -7.825000762939396 ], [ 145.035003662109602, -7.82722282409668 ] ] ], [ [ [ 145.205825805664062, -7.82222223281849 ], [ 145.213607788086279, -7.827778816223088 ], [ 145.211669921875114, -7.835277080535832 ], [ 145.203887939453125, -7.825000762939396 ], [ 145.205825805664062, -7.82222223281849 ] ] ], [ [ [ 145.082778930664062, -7.816112041473332 ], [ 145.083053588867415, -7.818888187408447 ], [ 145.077987670898551, -7.821599960327148 ], [ 145.07916259765625, -7.818888187408447 ], [ 145.082778930664062, -7.816112041473332 ] ] ], [ [ [ 145.009735107421875, -7.819211959838867 ], [ 145.008285522461165, -7.823384761810303 ], [ 145.003936767578239, -7.821137905120793 ], [ 145.0089111328125, -7.815636157989502 ], [ 145.009735107421875, -7.819211959838867 ] ] ], [ [ [ 145.18110656738304, -7.821109771728459 ], [ 145.179443359375114, -7.815556049346924 ], [ 145.181945800781591, -7.809998989105225 ], [ 145.183883666992188, -7.814444065093994 ], [ 145.18110656738304, -7.821109771728459 ] ] ], [ [ [ 144.957504272460938, -7.812222003936711 ], [ 144.960281372070426, -7.815278053283691 ], [ 144.955001831054688, -7.813055992126408 ], [ 144.954437255859375, -7.806110858917236 ], [ 144.957504272460938, -7.812222003936711 ] ] ], [ [ [ 145.191665649414176, -7.799445152282715 ], [ 145.209716796875227, -7.844721794128361 ], [ 145.217224121093864, -7.850278854370117 ], [ 145.195281982421989, -7.86027717590332 ], [ 145.18110656738304, -7.827778816223088 ], [ 145.191665649414176, -7.799445152282715 ] ] ], [ [ [ 145.035827636718864, -7.829722881317139 ], [ 145.034439086914517, -7.843887805938664 ], [ 145.007873535156477, -7.837919235229435 ], [ 145.020828247070312, -7.838890075683594 ], [ 145.008895874023551, -7.828332901000977 ], [ 145.021667480468864, -7.797223091125488 ], [ 145.03179931640625, -7.827106952667179 ], [ 145.035827636718864, -7.829722881317139 ] ] ], [ [ [ 144.96534729003929, -7.79957723617548 ], [ 144.963699340820426, -7.798150062560978 ], [ 144.963897705078125, -7.796726226806641 ], [ 144.967300415039517, -7.798367023468018 ], [ 144.96534729003929, -7.79957723617548 ] ] ], [ [ [ 143.880828857422102, -7.85205602645874 ], [ 143.845046997070312, -7.801837921142521 ], [ 143.853713989257812, -7.779764175414982 ], [ 143.883041381836279, -7.831090927124023 ], [ 143.880828857422102, -7.85205602645874 ] ] ], [ [ [ 145.086624145507812, -7.779770851135254 ], [ 145.095535278320426, -7.786148071289062 ], [ 145.096923828125, -7.790279865264893 ], [ 145.08831787109375, -7.788116931915226 ], [ 145.086624145507812, -7.779770851135254 ] ] ], [ [ [ 144.204788208007926, -7.749704837799072 ], [ 144.249725341797102, -7.753055095672607 ], [ 144.272171020507812, -7.779123783111572 ], [ 144.248703002929688, -7.797749042510929 ], [ 144.194442749023892, -7.804166793823185 ], [ 144.185272216797102, -7.764999866485596 ], [ 144.191604614257926, -7.746205806732178 ], [ 144.204788208007926, -7.749704837799072 ] ] ], [ [ [ 144.868057250976562, -7.730834007263184 ], [ 144.875000000000114, -7.73305606842041 ], [ 144.874450683593864, -7.739721775054875 ], [ 144.866943359375227, -7.733612060546875 ], [ 144.868057250976562, -7.730834007263184 ] ] ], [ [ [ 144.85888671875, -7.728055000305119 ], [ 144.878326416015625, -7.758056163787785 ], [ 144.897781372070312, -7.76694393157959 ], [ 144.880828857421875, -7.78277683258051 ], [ 144.831939697265739, -7.743331909179688 ], [ 144.85888671875, -7.728055000305119 ] ] ], [ [ [ 144.399444580078239, -7.761943817138672 ], [ 144.415802001953125, -7.769712924957275 ], [ 144.365280151367188, -7.757474899291992 ], [ 144.361602783203125, -7.723396778106689 ], [ 144.399444580078239, -7.761943817138672 ] ] ], [ [ [ 143.908340454102017, -7.745697975158635 ], [ 143.973876953125, -7.786656856536865 ], [ 143.98976135253929, -7.836350917816162 ], [ 143.913955688476562, -7.799143791198674 ], [ 143.856781005859375, -7.721951961517277 ], [ 143.908340454102017, -7.745697975158635 ] ] ], [ [ [ 144.430068969726904, -7.684628963470459 ], [ 144.463607788086051, -7.713610172271729 ], [ 144.472778320312614, -7.749721050262451 ], [ 144.51690673828125, -7.803572177886963 ], [ 144.478607177734602, -7.80000114440918 ], [ 144.47528076171875, -7.780276775360051 ], [ 144.41450500488304, -7.71632719039917 ], [ 144.41424560546875, -7.685637950897217 ], [ 144.430068969726904, -7.684628963470459 ] ] ], [ [ [ 144.306945800781477, -7.647777080535889 ], [ 144.338058471679915, -7.707777976989689 ], [ 144.326110839843864, -7.717501163482609 ], [ 144.299728393555142, -7.711666107177734 ], [ 144.283340454101676, -7.663053989410287 ], [ 144.306945800781477, -7.647777080535889 ] ] ], [ [ [ 144.361801147460938, -7.637643814086857 ], [ 144.363494873046989, -7.63792181015009 ], [ 144.363769531250227, -7.638651847839242 ], [ 144.360458374023438, -7.638955116271916 ], [ 144.361801147460938, -7.637643814086857 ] ] ], [ [ [ 144.399993896484375, -7.605278015136662 ], [ 144.414993286132926, -7.632222175598145 ], [ 144.430282592773438, -7.638332843780518 ], [ 144.431671142578352, -7.652222156524601 ], [ 144.426940917968977, -7.68083381652832 ], [ 144.411941528320426, -7.685555934906006 ], [ 144.41082763671875, -7.718332767486515 ], [ 144.431671142578352, -7.736388206481877 ], [ 144.403335571289176, -7.756112098693848 ], [ 144.363052368164517, -7.703333854675293 ], [ 144.385833740234375, -7.659999847412109 ], [ 144.365005493164176, -7.625 ], [ 144.399993896484375, -7.605278015136662 ] ] ], [ [ [ 144.669998168945426, -7.605000019073429 ], [ 144.676361083984375, -7.64653491973877 ], [ 144.645004272461051, -7.651666164398137 ], [ 144.667495727539062, -7.637222766876164 ], [ 144.669998168945426, -7.605000019073429 ] ] ], [ [ [ 144.416671752929801, -7.603333950042725 ], [ 144.441116333007926, -7.611111164092961 ], [ 144.46583557128929, -7.656112194061222 ], [ 144.455276489257812, -7.699166774749699 ], [ 144.434173583984602, -7.683609962463322 ], [ 144.432785034179688, -7.637779235839844 ], [ 144.405273437500341, -7.606110095977783 ], [ 144.416671752929801, -7.603333950042725 ] ] ], [ [ [ 144.267776489257812, -7.593610763549748 ], [ 144.287506103515852, -7.63972282409668 ], [ 144.253616333007926, -7.653888225555363 ], [ 144.244720458984375, -7.610001087188721 ], [ 144.267776489257812, -7.593610763549748 ] ] ], [ [ [ 144.245834350585938, -7.592776775360051 ], [ 144.242492675781477, -7.61250114440918 ], [ 144.246948242187614, -7.650000095367432 ], [ 144.250534057617301, -7.655829906463509 ], [ 144.262771606445426, -7.659165859222412 ], [ 144.212493896484375, -7.671111106872559 ], [ 144.203048706054801, -7.657499790191594 ], [ 144.220840454101562, -7.633331775665226 ], [ 144.218338012695426, -7.613055229187012 ], [ 144.245834350585938, -7.592776775360051 ] ] ], [ [ [ 144.283050537109375, -7.590555191039982 ], [ 144.307220458984489, -7.607779026031494 ], [ 144.297500610351676, -7.64611101150507 ], [ 144.270965576171989, -7.591667175292969 ], [ 144.283050537109375, -7.590555191039982 ] ] ], [ [ [ 144.31648254394554, -7.57699012756342 ], [ 144.312774658203125, -7.575833797454777 ], [ 144.314437866211051, -7.572500228881836 ], [ 144.315917968750227, -7.574633121490422 ], [ 144.31648254394554, -7.57699012756342 ] ] ], [ [ [ 144.291671752929915, -7.572222232818604 ], [ 144.352493286132812, -7.599165916442814 ], [ 144.341659545898665, -7.632222175598145 ], [ 144.3780517578125, -7.655000209808293 ], [ 144.356384277343864, -7.684721946716309 ], [ 144.322784423828352, -7.645555019378605 ], [ 144.315002441406364, -7.605929851531926 ], [ 144.286666870117188, -7.584722995758 ], [ 144.291671752929915, -7.572222232818604 ] ] ], [ [ [ 144.386001586914176, -7.551719188690186 ], [ 144.398391723632926, -7.559063911437931 ], [ 144.415634155273438, -7.555460929870549 ], [ 144.433151245117188, -7.598157882690373 ], [ 144.4007568359375, -7.598989963531494 ], [ 144.399353027343864, -7.576255798339844 ], [ 144.386001586914176, -7.551719188690186 ] ] ], [ [ [ 143.747970581054801, -7.546935081481934 ], [ 143.766754150390625, -7.56040716171259 ], [ 143.787597656250227, -7.624787807464486 ], [ 143.752548217773551, -7.598413944244385 ], [ 143.747970581054801, -7.546935081481934 ] ] ], [ [ [ 144.381668090820312, -7.559444904327393 ], [ 144.378890991211051, -7.555278778076172 ], [ 144.380004882812727, -7.54666614532465 ], [ 144.381942749023551, -7.551109790801945 ], [ 144.381668090820312, -7.559444904327393 ] ] ], [ [ [ 144.709716796875, -7.535554885864258 ], [ 144.747772216796989, -7.554444789886475 ], [ 144.766662597656364, -7.586111068725586 ], [ 144.754165649414062, -7.629444122314453 ], [ 144.697219848633267, -7.582500934600773 ], [ 144.709716796875, -7.535554885864258 ] ] ], [ [ [ 144.542495727539176, -7.534722805023193 ], [ 144.571945190429801, -7.550556182861214 ], [ 144.586395263672102, -7.548888206481877 ], [ 144.586105346679688, -7.553331851959229 ], [ 144.593887329101676, -7.56472110748291 ], [ 144.601394653320312, -7.565277099609375 ], [ 144.576950073242188, -7.622777938842717 ], [ 144.542495727539176, -7.534722805023193 ] ] ], [ [ [ 144.651672363281364, -7.532498836517334 ], [ 144.632217407226676, -7.568056106567269 ], [ 144.653060913085938, -7.554165840148926 ], [ 144.66278076171875, -7.586389064788818 ], [ 144.651382446289062, -7.585833072662354 ], [ 144.640548706054915, -7.591942787170353 ], [ 144.661392211914062, -7.58916711807251 ], [ 144.667221069336165, -7.603888034820557 ], [ 144.654724121093864, -7.609445095062256 ], [ 144.654998779296875, -7.598889827728271 ], [ 144.651672363281364, -7.595555782318115 ], [ 144.643051147461392, -7.601109981536808 ], [ 144.639999389648892, -7.605556011199894 ], [ 144.652496337890625, -7.596943855285645 ], [ 144.652496337890625, -7.608889102935791 ], [ 144.658889770507926, -7.611945152282658 ], [ 144.666107177734602, -7.611389160156193 ], [ 144.666671752929915, -7.63555717468256 ], [ 144.641937255859375, -7.642776966094914 ], [ 144.636672973632812, -7.629166126251221 ], [ 144.633331298828239, -7.648890018463135 ], [ 144.604446411132812, -7.651944160461369 ], [ 144.599166870117415, -7.63555717468256 ], [ 144.57861328125, -7.63555717468256 ], [ 144.603607177734489, -7.578887939453125 ], [ 144.602783203125227, -7.564445018768254 ], [ 144.587219238281364, -7.547222137451172 ], [ 144.651672363281364, -7.532498836517334 ] ] ], [ [ [ 144.674163818359489, -7.527779102325439 ], [ 144.696670532226676, -7.5411119461059 ], [ 144.693603515625114, -7.560554981231633 ], [ 144.666946411132926, -7.558054924011174 ], [ 144.663055419922102, -7.53055477142334 ], [ 144.674163818359489, -7.527779102325439 ] ] ], [ [ [ 143.729751586914062, -7.513453960418701 ], [ 143.743377685546989, -7.515428066253662 ], [ 143.74983215332054, -7.521505832672062 ], [ 143.71510314941429, -7.520173072814941 ], [ 143.729751586914062, -7.513453960418701 ] ] ], [ [ [ 144.699172973632926, -7.495555877685547 ], [ 144.699172973632926, -7.529167175292912 ], [ 144.66278076171875, -7.497499942779541 ], [ 144.682495117187614, -7.492221832275391 ], [ 144.69000244140625, -7.480277061462402 ], [ 144.699172973632926, -7.495555877685547 ] ] ], [ [ [ 144.630310058593864, -7.458053112030029 ], [ 144.670562744140739, -7.526388168334961 ], [ 144.616668701171875, -7.536388874053955 ], [ 144.616394042968864, -7.516943931579533 ], [ 144.608337402344205, -7.50333309173584 ], [ 144.620559692382926, -7.478332996368408 ], [ 144.610275268554688, -7.469721794128361 ], [ 144.630310058593864, -7.458053112030029 ] ] ], [ [ [ 144.750839233398551, -7.453610897064209 ], [ 144.744171142578125, -7.47138786315918 ], [ 144.756942749023551, -7.510554790496769 ], [ 144.731643676757812, -7.503098011016846 ], [ 144.737930297851562, -7.485436916351262 ], [ 144.714172363281477, -7.534444808959961 ], [ 144.697784423828352, -7.466944217681828 ], [ 144.750839233398551, -7.453610897064209 ] ] ], [ [ [ 144.571105957031364, -7.443056106567383 ], [ 144.591461181640625, -7.475752830505314 ], [ 144.586395263672102, -7.503055095672607 ], [ 144.612777709961051, -7.517221927642765 ], [ 144.576950073242188, -7.549722194671574 ], [ 144.560562133789062, -7.538610935211182 ], [ 144.574447631836051, -7.530001163482609 ], [ 144.581115722656364, -7.519721984863224 ], [ 144.581390380859602, -7.516111850738525 ], [ 144.561111450195312, -7.535554885864258 ], [ 144.539443969726676, -7.529445171356144 ], [ 144.5655517578125, -7.479444980621281 ], [ 144.556671142578239, -7.452498912811222 ], [ 144.571105957031364, -7.443056106567383 ] ] ], [ [ [ 144.597229003906477, -7.433611869811898 ], [ 144.617782592773438, -7.456944942474365 ], [ 144.608673095703352, -7.471176147460881 ], [ 144.618331909179688, -7.479444980621281 ], [ 144.603332519531477, -7.508333206176701 ], [ 144.584442138672102, -7.451944828033447 ], [ 144.576660156250227, -7.44388818740839 ], [ 144.597229003906477, -7.433611869811898 ] ] ], [ [ [ 144.553329467773438, -7.410833835601807 ], [ 144.583892822265852, -7.435555934905949 ], [ 144.555831909179915, -7.451666831970215 ], [ 144.54499816894554, -7.44388818740839 ], [ 144.552505493164176, -7.435555934905949 ], [ 144.553329467773438, -7.410833835601807 ] ] ], [ [ [ 144.558609008789176, -7.399167060852051 ], [ 144.547775268554688, -7.404720783233586 ], [ 144.544448852539176, -7.411665916442814 ], [ 144.537780761718864, -7.397777080535889 ], [ 144.54804992675804, -7.393332004547062 ], [ 144.556106567382812, -7.386387825012207 ], [ 144.558609008789176, -7.399167060852051 ] ] ], [ [ [ 144.703109741211165, -6.712035179138127 ], [ 144.761917114257926, -6.709134101867619 ], [ 144.851806640625, -6.747634887695256 ], [ 144.913619995117188, -6.725635051727295 ], [ 144.982406616211051, -6.791234970092773 ], [ 145.142318725585938, -6.836434841156006 ], [ 145.207214355468977, -6.814233779907227 ], [ 145.693618774414517, -7.145033836364746 ], [ 145.74201965332054, -7.158435821533203 ], [ 146.054519653320312, -7.368636131286564 ], [ 146.075210571289062, -7.395433902740422 ], [ 146.079711914062614, -7.49693489074707 ], [ 146.117309570312841, -7.552834987640381 ], [ 146.412612915039062, -7.609135150909424 ], [ 146.652511596680029, -7.772534847259521 ], [ 146.541107177734489, -7.825333118438721 ], [ 146.486419677734375, -7.9082350730896 ], [ 146.395309448242415, -7.913435935974121 ], [ 146.383316040039517, -7.928234100341797 ], [ 146.382568359375114, -8.587371826171818 ], [ 146.269729614257812, -8.410278320312443 ], [ 146.267227172851904, -8.353887557983398 ], [ 146.278884887695312, -8.350000381469727 ], [ 146.248336791992301, -8.319167137145939 ], [ 146.234970092773551, -8.27141284942627 ], [ 146.246948242187614, -8.303888320922795 ], [ 146.253067016601676, -8.309855461120605 ], [ 146.249725341796875, -8.295277595519963 ], [ 146.281509399414176, -8.31196117401123 ], [ 146.289031982422102, -8.308637619018555 ], [ 146.251388549804801, -8.291945457458496 ], [ 146.231323242187614, -8.260352134704476 ], [ 146.197784423828239, -8.236666679382267 ], [ 146.155960083008267, -8.224585533142033 ], [ 146.168609619140739, -8.2124986648559 ], [ 146.171112060546875, -8.190834045410099 ], [ 146.16944885253929, -8.1875 ], [ 146.159439086914176, -8.184166908264103 ], [ 146.168060302734375, -8.180832862853947 ], [ 146.15777587890625, -8.182223320007267 ], [ 146.159439086914176, -8.1875 ], [ 146.169723510742188, -8.191665649414062 ], [ 146.15777587890625, -8.218609809875431 ], [ 146.112228393554915, -8.185555458068848 ], [ 146.092651367187614, -8.157453536987305 ], [ 146.082839965820312, -8.135579109191895 ], [ 146.11083984375, -8.164443969726562 ], [ 146.10292053222679, -8.129028320312443 ], [ 146.130889892578125, -8.136522293090763 ], [ 146.105834960937614, -8.124030113220215 ], [ 146.095230102539062, -8.135449409484806 ], [ 146.074996948242188, -8.117778778076115 ], [ 146.073059082031591, -8.098054885864258 ], [ 146.095367431640739, -8.10081672668457 ], [ 146.095932006836051, -8.091262817382756 ], [ 146.071105957031364, -8.094445228576603 ], [ 146.007171630859602, -8.059165954589844 ], [ 145.827774047851904, -8.030834197998047 ], [ 145.759445190429801, -7.961111068725586 ], [ 145.799728393554801, -7.960555076599121 ], [ 145.796112060547216, -7.975555896759033 ], [ 145.80860900878929, -7.986391067504883 ], [ 145.817214965820767, -7.985279083251953 ], [ 145.797500610351562, -7.974443912506104 ], [ 145.801940917968977, -7.959935188293457 ], [ 145.775283813476562, -7.939999103546143 ], [ 145.793884277343977, -7.926943778991642 ], [ 145.794174194336051, -7.91944408416748 ], [ 145.812774658203352, -7.905001163482552 ], [ 145.81304931640625, -7.900278091430664 ], [ 145.768890380859375, -7.94166707992548 ], [ 145.746109008789176, -7.932778835296631 ], [ 145.755554199218977, -7.925278186798096 ], [ 145.756393432617301, -7.911666870117188 ], [ 145.725708007812614, -7.9443039894104 ], [ 145.717102050781364, -7.946940898895264 ], [ 145.707504272461051, -7.938889026641789 ], [ 145.69561767578125, -7.940762996673584 ], [ 145.717391967773438, -7.948609828948975 ], [ 145.731109619140625, -7.946944236755314 ], [ 145.747222900390739, -7.938333034515324 ], [ 145.75917053222679, -7.946390151977539 ], [ 145.716110229492415, -7.958889007568303 ], [ 145.652221679687727, -7.956943988800049 ], [ 145.626113891601676, -7.936110973358097 ], [ 145.418243408203239, -7.950353145599308 ], [ 145.414718627929915, -7.946944236755314 ], [ 145.427780151367301, -7.942777156829834 ], [ 145.434753417968864, -7.932468891143799 ], [ 145.404449462890852, -7.945556163787728 ], [ 145.387771606445312, -7.899444103240967 ], [ 145.370285034179801, -7.88027715682972 ], [ 145.341949462890739, -7.863890171050969 ], [ 145.279449462890625, -7.85001897811884 ], [ 145.226394653320312, -7.858611106872559 ], [ 145.223541259765625, -7.842775821685791 ], [ 145.196945190430142, -7.801667213439885 ], [ 145.161392211914062, -7.783889770507756 ], [ 145.191116333007812, -7.767083168029785 ], [ 145.158050537109489, -7.776389122009277 ], [ 145.178482055664176, -7.849024772643986 ], [ 145.105270385742529, -7.820278167724609 ], [ 145.097778320312614, -7.783889770507756 ], [ 145.061950683593864, -7.766387939453125 ], [ 145.100280761718864, -7.800555229186955 ], [ 145.06111145019554, -7.826944828033447 ], [ 145.091949462890625, -7.809720993041992 ], [ 145.070556640625341, -7.836668014526367 ], [ 145.043212890625455, -7.844719886779785 ], [ 145.016403198242188, -7.769686222076416 ], [ 144.998062133789176, -7.755277156829834 ], [ 145.01972961425804, -7.788611888885498 ], [ 144.99972534179733, -7.820480823516846 ], [ 144.953826904297216, -7.781576156616154 ], [ 144.962219238281591, -7.745278835296631 ], [ 144.946395874023438, -7.773889064788818 ], [ 144.927215576172102, -7.765833854675293 ], [ 144.930282592773665, -7.736388206481877 ], [ 144.926116943359489, -7.713888168334961 ], [ 144.938613891601562, -7.703889846801758 ], [ 144.936386108398665, -7.702777862548828 ], [ 144.927780151367301, -7.707499980926457 ], [ 144.923049926758267, -7.718057155609017 ], [ 144.921951293945426, -7.756668090820312 ], [ 144.9281005859375, -7.769498825073242 ], [ 144.958892822265852, -7.798611164092961 ], [ 144.966629028320312, -7.800514221191293 ], [ 144.9561767578125, -7.804787158966008 ], [ 144.87648010253929, -7.75242805480957 ], [ 144.895202636719205, -7.721333980560303 ], [ 144.880340576171989, -7.727090835571289 ], [ 144.880477905273551, -7.715168952941838 ], [ 144.887023925781364, -7.707684993743896 ], [ 144.889801025390625, -7.701444149017277 ], [ 144.897171020507926, -7.672611236572209 ], [ 144.878677368164404, -7.715168952941838 ], [ 144.879516601562727, -7.728894233703556 ], [ 144.8619384765625, -7.723610877990723 ], [ 144.871383666992301, -7.706389904022217 ], [ 144.852218627929688, -7.655000209808293 ], [ 144.875000000000114, -7.656112194061222 ], [ 144.884994506835938, -7.650278091430664 ], [ 144.886947631836165, -7.638888835906982 ], [ 144.89166259765625, -7.642498970031681 ], [ 144.906661987304801, -7.63972282409668 ], [ 144.91499328613304, -7.631944179534912 ], [ 144.886672973632926, -7.636944770812988 ], [ 144.874725341796875, -7.65472221374506 ], [ 144.850601196289062, -7.652976036071777 ], [ 144.852218627929688, -7.630556106567383 ], [ 144.866104125976562, -7.630832195281926 ], [ 144.880828857421875, -7.626944065093994 ], [ 144.899444580078239, -7.616388797759953 ], [ 144.852783203125, -7.628888130187988 ], [ 144.84864807128929, -7.612771987914982 ], [ 144.876937866211051, -7.58055400848383 ], [ 144.885833740234602, -7.582778930664006 ], [ 144.889450073242415, -7.593332767486515 ], [ 144.89739990234375, -7.596041202545166 ], [ 144.886672973632926, -7.580278873443604 ], [ 144.873611450195426, -7.578609943389893 ], [ 144.874725341796875, -7.572222232818604 ], [ 144.871109008789062, -7.567221164703369 ], [ 144.890853881836051, -7.556663990020695 ], [ 144.881103515625114, -7.555553913116455 ], [ 144.863891601562727, -7.571944236755371 ], [ 144.85333251953125, -7.55916690826416 ], [ 144.845001220703239, -7.558332920074406 ], [ 144.8619384765625, -7.552499771118107 ], [ 144.84722900390625, -7.552499771118107 ], [ 144.84388732910179, -7.5602769851684 ], [ 144.862503051757812, -7.572778224945012 ], [ 144.873336791992529, -7.572778224945012 ], [ 144.851181030273551, -7.583497047424316 ], [ 144.813690185546875, -7.551013946533146 ], [ 144.84388732910179, -7.595409870147705 ], [ 144.833892822265625, -7.627222061157227 ], [ 144.828048706054915, -7.619166851043701 ], [ 144.811660766602017, -7.623055934905949 ], [ 144.813049316406364, -7.611389160156193 ], [ 144.80305480957054, -7.604722023010197 ], [ 144.811386108398438, -7.624444007873535 ], [ 144.836395263671875, -7.634165763854924 ], [ 144.81805419921875, -7.681387901306152 ], [ 144.778884887695312, -7.673611164093018 ], [ 144.796386718750227, -7.656112194061222 ], [ 144.756668090820312, -7.663053989410287 ], [ 144.770553588867188, -7.564445018768254 ], [ 144.784729003906364, -7.565277099609375 ], [ 144.796386718750227, -7.540833950042668 ], [ 144.794174194336051, -7.537776947021371 ], [ 144.790832519531364, -7.536666870117188 ], [ 144.78277587890625, -7.538888931274414 ], [ 144.794998168945312, -7.540833950042668 ], [ 144.781982421875, -7.544962882995605 ], [ 144.784439086914176, -7.563889026641789 ], [ 144.755828857421989, -7.541665077209473 ], [ 144.773056030273438, -7.528057098388672 ], [ 144.78582763671875, -7.497499942779541 ], [ 144.794723510742301, -7.498610019683781 ], [ 144.800827026367301, -7.492221832275391 ], [ 144.785003662109489, -7.496387958526554 ], [ 144.754714965820312, -7.540555000305119 ], [ 144.761276245117415, -7.569625854492131 ], [ 144.751480102539062, -7.553059101104736 ], [ 144.722503662109375, -7.534722805023193 ], [ 144.730560302734489, -7.507777214050236 ], [ 144.745285034180142, -7.515833854675293 ], [ 144.759719848632812, -7.510554790496769 ], [ 144.752548217773551, -7.441336154937744 ], [ 144.714050292968864, -7.441948890685978 ], [ 144.68861389160179, -7.469443798065186 ], [ 144.68305969238304, -7.46083402633667 ], [ 144.675277709961165, -7.459167957305908 ], [ 144.67388916015625, -7.453888893127441 ], [ 144.69305419921875, -7.449722766876221 ], [ 144.698257446289062, -7.443397998809814 ], [ 144.691238403320312, -7.432861804962101 ], [ 144.673583984375114, -7.423298835754395 ], [ 144.6795654296875, -7.407771110534668 ], [ 144.676635742187614, -7.399730205535889 ], [ 144.672195434570426, -7.422741889953613 ], [ 144.696395874023438, -7.444722175598031 ], [ 144.673049926757926, -7.452776908874455 ], [ 144.682220458984716, -7.487220764160099 ], [ 144.661392211914062, -7.490555763244629 ], [ 144.595932006836165, -7.414475917816105 ], [ 144.58917236328125, -7.434442996978703 ], [ 144.573883056640966, -7.423333168029728 ], [ 144.588882446289517, -7.404720783233586 ], [ 144.592498779297102, -7.377499103546143 ], [ 144.573745727539062, -7.349321842193604 ], [ 144.589447021484602, -7.379446029663086 ], [ 144.571105957031364, -7.422777175903263 ], [ 144.568328857421989, -7.400555133819466 ], [ 144.54804992675804, -7.40861177444458 ], [ 144.56027221679733, -7.400277137756291 ], [ 144.560562133789062, -7.378055095672607 ], [ 144.531951904296875, -7.398333072662354 ], [ 144.526107788086165, -7.387499809265137 ], [ 144.536117553711279, -7.38361215591425 ], [ 144.536239624023892, -7.354893207550049 ], [ 144.525558471680142, -7.361112117767334 ], [ 144.524993896484489, -7.389443874359131 ], [ 144.548919677734375, -7.431629180908146 ], [ 144.521392822265625, -7.434999942779484 ], [ 144.5574951171875, -7.475000858306885 ], [ 144.52955627441429, -7.50599479675293 ], [ 144.51277160644554, -7.503611087799072 ], [ 144.524444580078125, -7.575555801391545 ], [ 144.508605957031364, -7.620276927947998 ], [ 144.485549926757926, -7.592220783233586 ], [ 144.500549316406477, -7.571387767791748 ], [ 144.503936767578125, -7.54185676574707 ], [ 144.496139526367415, -7.537836074829102 ], [ 144.474746704101562, -7.532003879547062 ], [ 144.503448486328239, -7.54455995559681 ], [ 144.481674194336165, -7.549722194671574 ], [ 144.47027587890625, -7.561944961547795 ], [ 144.467773437500114, -7.559444904327393 ], [ 144.471389770508267, -7.551109790801945 ], [ 144.46888732910179, -7.538610935211182 ], [ 144.464447021484375, -7.536110877990723 ], [ 144.458328247070312, -7.537776947021371 ], [ 144.45166015625, -7.534166812896729 ], [ 144.458328247070312, -7.539166927337646 ], [ 144.467773437500114, -7.539445877075082 ], [ 144.470001220703352, -7.547778129577637 ], [ 144.46638488769554, -7.559444904327393 ], [ 144.468338012695767, -7.562499046325684 ], [ 144.496109008789062, -7.556666851043701 ], [ 144.498886108398438, -7.566946029663086 ], [ 144.48388671875, -7.585277080535889 ], [ 144.484161376953352, -7.596943855285645 ], [ 144.55389404296875, -7.679165840148926 ], [ 144.518890380859489, -7.684999942779541 ], [ 144.475830078125114, -7.603055953979379 ], [ 144.446670532226562, -7.581387996673527 ], [ 144.441116333007926, -7.53694486618042 ], [ 144.397216796875114, -7.553331851959229 ], [ 144.388885498046875, -7.537498950958195 ], [ 144.376937866211051, -7.539999008178654 ], [ 144.396667480468864, -7.575277805328369 ], [ 144.398895263672102, -7.602221965789738 ], [ 144.3619384765625, -7.559444904327393 ], [ 144.353881835937727, -7.560554981231633 ], [ 144.342498779296989, -7.568056106567269 ], [ 144.335281372070312, -7.568334102630615 ], [ 144.32833862304733, -7.561666965484562 ], [ 144.330001831054915, -7.558332920074406 ], [ 144.339172363281364, -7.563055038452148 ], [ 144.3427734375, -7.56138896942133 ], [ 144.3427734375, -7.557222843170166 ], [ 144.33749389648483, -7.548056125640869 ], [ 144.341659545898665, -7.560832977294865 ], [ 144.33111572265625, -7.556944847106934 ], [ 144.327774047851676, -7.558888912200814 ], [ 144.326110839843864, -7.564167022705021 ], [ 144.336944580078239, -7.570278167724553 ], [ 144.346664428711051, -7.568056106567269 ], [ 144.36083984375, -7.5602769851684 ], [ 144.383895874023551, -7.59944391250599 ], [ 144.354171752929688, -7.635831832885685 ], [ 144.343612670898551, -7.629444122314453 ], [ 144.355560302734602, -7.594442844390869 ], [ 144.321670532226676, -7.580832004547062 ], [ 144.316390991211279, -7.563611030578556 ], [ 144.303604125976676, -7.576387882232666 ], [ 144.28138732910179, -7.562499046325684 ], [ 144.279998779296875, -7.583333015441895 ], [ 144.255828857422102, -7.591667175292969 ], [ 144.2459716796875, -7.58882999420166 ], [ 144.242095947265852, -7.570213794708138 ], [ 144.233917236328352, -7.557511806488037 ], [ 144.227523803710938, -7.552799224853516 ], [ 144.24421691894554, -7.58828687667841 ], [ 144.220550537109602, -7.607501029968262 ], [ 144.215744018554688, -7.597115039825439 ], [ 144.206390380859375, -7.594168186187687 ], [ 144.218612670898665, -7.629444122314453 ], [ 144.197784423828125, -7.64611101150507 ], [ 144.17304992675804, -7.605000019073429 ], [ 144.191390991211392, -7.606110095977783 ], [ 144.195007324218977, -7.599721908569336 ], [ 144.187774658203239, -7.571944236755371 ], [ 144.176940917968864, -7.565277099609375 ], [ 144.193328857421875, -7.602221965789738 ], [ 144.173889160156364, -7.602221965789738 ], [ 144.162200927734602, -7.617351055145264 ], [ 144.172775268554688, -7.610001087188721 ], [ 144.206390380859375, -7.676390171050969 ], [ 144.256393432617301, -7.685277938842773 ], [ 144.258331298828352, -7.710278034210148 ], [ 144.2288818359375, -7.740277767181283 ], [ 144.20472717285179, -7.741387844085637 ], [ 144.153610229492415, -7.6875 ], [ 144.143890380859602, -7.695555210113469 ], [ 144.180557250976676, -7.741109848022461 ], [ 144.171356201172102, -7.763377189636174 ], [ 144.155838012695312, -7.741943836212101 ], [ 144.124160766601562, -7.726110935211182 ], [ 144.171356201172102, -7.768246173858643 ], [ 144.150054931640739, -7.79797887802124 ], [ 144.107833862304915, -7.778800010681152 ], [ 144.08123779296875, -7.722352981567326 ], [ 144.036392211914404, -7.717223167419377 ], [ 144.080551147461165, -7.731871128082275 ], [ 144.078887939453125, -7.771944999694767 ], [ 143.988815307617415, -7.726801872253418 ], [ 143.905380249023438, -7.712495803833008 ], [ 143.825836181640625, -7.65472221374506 ], [ 143.765548706055029, -7.526356220245361 ], [ 143.749542236328125, -7.514832973480225 ], [ 143.731185913086051, -7.510601043701172 ], [ 143.695510864257812, -7.515478134155217 ], [ 143.700607299804915, -7.533194065093994 ], [ 143.746063232421989, -7.543087959289551 ], [ 143.744232177734375, -7.591330051422062 ], [ 143.820358276367415, -7.713730812072697 ], [ 143.841812133789176, -7.770157814025879 ], [ 143.838973999023551, -7.812693119049072 ], [ 143.911911010742415, -7.952212810516301 ], [ 143.891220092773551, -7.944035053253117 ], [ 143.05610656738304, -7.083835124969482 ], [ 142.995513916015625, -6.999135017394963 ], [ 142.99472045898483, -6.822734832763672 ], [ 143.934707641601676, -6.822734832763672 ], [ 144.703109741211165, -6.712035179138127 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-HLA", "NAME_1": "Hela" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 142.389816284179688, -4.993134021759033 ], [ 142.452117919921989, -4.96263408660883 ], [ 142.560806274414176, -4.991934776306152 ], [ 142.66511535644554, -4.982234954833984 ], [ 142.706405639648438, -5.001235961914062 ], [ 142.750717163086165, -5.042234897613469 ], [ 142.755615234375, -5.581134796142578 ], [ 143.254608154296875, -5.751334190368652 ], [ 143.331207275390625, -5.85403394699091 ], [ 143.396316528320312, -5.909033775329533 ], [ 143.394012451171875, -6.070633888244572 ], [ 143.417007446289517, -6.093635082244873 ], [ 143.375808715820767, -6.094034194946232 ], [ 143.376007080078239, -6.155035018920898 ], [ 143.17181396484375, -6.165235996246338 ], [ 143.16120910644554, -6.293034076690617 ], [ 143.080413818359489, -6.30323600769043 ], [ 143.080215454101676, -6.358434200286865 ], [ 142.886520385742415, -6.242636203765812 ], [ 142.683517456054688, -6.18023490905756 ], [ 142.627212524414176, -6.179833889007568 ], [ 142.626007080078352, -5.903635025024414 ], [ 142.570114135742415, -5.882334232330265 ], [ 142.06697082519554, -5.469642162322998 ], [ 142.081817626953352, -5.412435054778996 ], [ 142.1815185546875, -5.32333517074585 ], [ 142.303115844727017, -5.325634002685433 ], [ 142.321105957031364, -5.186134815216064 ], [ 142.290512084961165, -5.109734058380013 ], [ 142.320816040039176, -5.069036006927377 ], [ 142.324310302734489, -4.941134929656982 ], [ 142.389816284179688, -4.993134021759033 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-JWK", "NAME_1": "Jiwaka" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 144.75701904296875, -5.494135856628418 ], [ 144.779510498046875, -5.536135196685734 ], [ 144.879608154296989, -5.601233959197884 ], [ 144.91731262207054, -5.650634765624943 ], [ 144.9840087890625, -5.661633968353215 ], [ 144.994720458984602, -5.719933986663818 ], [ 145.026412963867415, -5.775935173034554 ], [ 144.881820678711165, -5.809534072875977 ], [ 144.8297119140625, -5.783133983612061 ], [ 144.81031799316429, -5.805533885955811 ], [ 144.79200744628929, -5.835433959960881 ], [ 144.816314697265625, -5.895534992217961 ], [ 144.802505493164517, -5.931334972381592 ], [ 144.778610229492415, -5.970334053039494 ], [ 144.694213867187614, -6.036633968353158 ], [ 144.751312255859375, -6.093635082244873 ], [ 144.72991943359375, -6.11573600769043 ], [ 144.741714477539176, -6.164634227752629 ], [ 144.725814819336165, -6.243435859680176 ], [ 144.688110351562614, -6.268733978271484 ], [ 144.682113647461051, -6.300836086273193 ], [ 144.64491271972679, -6.30973577499384 ], [ 144.592910766601676, -6.389835834503117 ], [ 144.416809082031477, -6.279036045074463 ], [ 144.370315551757926, -6.232935905456429 ], [ 144.479705810546875, -6.161435127258244 ], [ 144.4757080078125, -6.003835201263428 ], [ 144.419113159179915, -5.993934154510441 ], [ 144.376510620117188, -6.023734092712402 ], [ 144.325408935546875, -6.023134231567383 ], [ 144.274505615234602, -5.921333789825439 ], [ 144.3004150390625, -5.860835075378418 ], [ 144.370010375976562, -5.811334133148193 ], [ 144.383209228515625, -5.75353479385376 ], [ 144.489013671875, -5.762633800506592 ], [ 144.513916015625227, -5.711733818054142 ], [ 144.50971984863304, -5.679834842681885 ], [ 144.469711303711051, -5.659835815429688 ], [ 144.462814331054801, -5.523235797882023 ], [ 144.298110961914062, -5.514035224914551 ], [ 144.302810668945312, -5.457933902740422 ], [ 144.375411987304801, -5.321434020996037 ], [ 144.282516479492415, -5.219533920288029 ], [ 144.506713867187614, -5.291035175323486 ], [ 144.581115722656364, -5.369033813476562 ], [ 144.75701904296875, -5.494135856628418 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-MPM", "NAME_1": "Madang" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 145.780838012695426, -5.299445152282658 ], [ 145.778610229492188, -5.298333168029785 ], [ 145.781387329101562, -5.295001029968262 ], [ 145.781951904296989, -5.296111106872502 ], [ 145.780838012695426, -5.299445152282658 ] ] ], [ [ [ 145.787658691406364, -5.254936218261662 ], [ 145.787826538086165, -5.257168769836369 ], [ 145.785400390625114, -5.258316040039062 ], [ 145.784713745117188, -5.256082057952881 ], [ 145.787658691406364, -5.254936218261662 ] ] ], [ [ [ 145.79119873046875, -5.244953155517464 ], [ 145.790313720703352, -5.246356964111271 ], [ 145.790863037109602, -5.243291854858398 ], [ 145.791748046875, -5.243835926055908 ], [ 145.79119873046875, -5.244953155517464 ] ] ], [ [ [ 145.797256469726904, -5.207542896270752 ], [ 145.796478271484489, -5.206942081451359 ], [ 145.7974853515625, -5.205537796020508 ], [ 145.798141479492642, -5.206971168518066 ], [ 145.797256469726904, -5.207542896270752 ] ] ], [ [ [ 147.093048095703239, -5.203889846801701 ], [ 147.134719848632812, -5.242500782012939 ], [ 147.188888549804688, -5.264165878295842 ], [ 147.179168701171875, -5.298333168029785 ], [ 147.21833801269554, -5.351666927337646 ], [ 147.200561523437727, -5.362220764160099 ], [ 147.217773437500227, -5.403611183166504 ], [ 147.164657592773438, -5.413952827453556 ], [ 147.134170532226562, -5.442221164703312 ], [ 146.994995117187727, -5.35027885437006 ], [ 146.997619628906477, -5.244856834411621 ], [ 147.031661987304801, -5.244166851043644 ], [ 147.093048095703239, -5.203889846801701 ] ] ], [ [ [ 145.807495117187614, -5.197220802307129 ], [ 145.80555725097679, -5.195001125335637 ], [ 145.806671142578352, -5.193889141082707 ], [ 145.807785034179688, -5.196389198303223 ], [ 145.807495117187614, -5.197220802307129 ] ] ], [ [ [ 145.82666015625, -5.195001125335637 ], [ 145.8175048828125, -5.207777976989746 ], [ 145.81304931640625, -5.205277919769287 ], [ 145.825836181640739, -5.187778949737549 ], [ 145.82666015625, -5.195001125335637 ] ] ], [ [ [ 145.806671142578352, -5.188333034515324 ], [ 145.804718017578125, -5.187222957611084 ], [ 145.80555725097679, -5.184443950653019 ], [ 145.807220458984375, -5.185834884643555 ], [ 145.806671142578352, -5.188333034515324 ] ] ], [ [ [ 145.829437255859489, -5.180555820465088 ], [ 145.827774047851904, -5.180277824401855 ], [ 145.830001831054801, -5.173890113830566 ], [ 145.83222961425804, -5.173055171966496 ], [ 145.829437255859489, -5.180555820465088 ] ] ], [ [ [ 145.839996337890625, -5.171946048736515 ], [ 145.83833312988304, -5.170833110809269 ], [ 145.840560913085938, -5.166944980621338 ], [ 145.842498779296875, -5.170833110809269 ], [ 145.839996337890625, -5.171946048736515 ] ] ], [ [ [ 145.791427612304801, -5.153297901153508 ], [ 145.790191650390739, -5.15262508392334 ], [ 145.791168212890625, -5.151315212249699 ], [ 145.792098999023551, -5.152629852294865 ], [ 145.791427612304801, -5.153297901153508 ] ] ], [ [ [ 145.80952453613304, -5.144303798675537 ], [ 145.808197021484602, -5.146958827972412 ], [ 145.807235717773665, -5.146684169769287 ], [ 145.806655883789062, -5.144676208496094 ], [ 145.80952453613304, -5.144303798675537 ] ] ], [ [ [ 145.813705444335938, -5.137173175811711 ], [ 145.81292724609375, -5.138031959533691 ], [ 145.811737060546989, -5.13754415512085 ], [ 145.813339233398665, -5.136598110198975 ], [ 145.813705444335938, -5.137173175811711 ] ] ], [ [ [ 145.822219848632926, -5.136944770812988 ], [ 145.820556640625, -5.135001182556152 ], [ 145.821395874023665, -5.133889198303223 ], [ 145.822784423828239, -5.135557174682617 ], [ 145.822219848632926, -5.136944770812988 ] ] ], [ [ [ 145.806076049804688, -5.13489818572998 ], [ 145.80555725097679, -5.135279178619385 ], [ 145.803466796875227, -5.133609771728516 ], [ 145.805038452148438, -5.133297920226994 ], [ 145.806076049804688, -5.13489818572998 ] ] ], [ [ [ 145.813690185546875, -5.131461143493652 ], [ 145.813995361328239, -5.133314132690373 ], [ 145.8114013671875, -5.131461143493652 ], [ 145.81195068359375, -5.130504131317139 ], [ 145.813690185546875, -5.131461143493652 ] ] ], [ [ [ 145.80548095703125, -5.132153987884465 ], [ 145.804229736328352, -5.131597995758 ], [ 145.80694580078125, -5.130138874053898 ], [ 145.806533813477017, -5.131388187408447 ], [ 145.80548095703125, -5.132153987884465 ] ] ], [ [ [ 145.80726623535179, -5.121312141418457 ], [ 145.80780029296875, -5.123844146728516 ], [ 145.804809570312727, -5.123874187469482 ], [ 145.8056640625, -5.121868133544922 ], [ 145.80726623535179, -5.121312141418457 ] ] ], [ [ [ 145.806854248047102, -5.112436771392765 ], [ 145.805679321289062, -5.113039016723633 ], [ 145.805603027343864, -5.111547946929932 ], [ 145.806976318359489, -5.11132097244257 ], [ 145.806854248047102, -5.112436771392765 ] ] ], [ [ [ 145.805252075195426, -5.098566055297852 ], [ 145.803741455078466, -5.098354816436711 ], [ 145.804367065429688, -5.096825122833195 ], [ 145.80538940429733, -5.097592830657959 ], [ 145.805252075195426, -5.098566055297852 ] ] ], [ [ [ 146.959350585937614, -5.091061115264893 ], [ 146.976348876953239, -5.110335826873779 ], [ 146.959396362304801, -5.133674144744873 ], [ 146.939834594726676, -5.113733768463135 ], [ 146.959350585937614, -5.091061115264893 ] ] ], [ [ [ 145.819168090820426, -5.075555801391602 ], [ 145.822784423828239, -5.083889007568359 ], [ 145.822494506836165, -5.1058349609375 ], [ 145.814727783203352, -5.078887939453068 ], [ 145.819168090820426, -5.075555801391602 ] ] ], [ [ [ 145.7965087890625, -5.010763168334904 ], [ 145.79560852050804, -5.010207176208439 ], [ 145.796096801757926, -5.009094238281193 ], [ 145.796661376953239, -5.00923299789423 ], [ 145.7965087890625, -5.010763168334904 ] ] ], [ [ [ 145.796310424804688, -5.008123874664307 ], [ 145.795471191406705, -5.008123874664307 ], [ 145.795333862304801, -5.006665229797363 ], [ 145.79623413085983, -5.0068039894104 ], [ 145.796310424804688, -5.008123874664307 ] ] ], [ [ [ 145.7947998046875, -4.988418102264404 ], [ 145.793960571289176, -4.987304210662842 ], [ 145.794662475586165, -4.985427856445256 ], [ 145.795074462890852, -4.986261844634953 ], [ 145.7947998046875, -4.988418102264404 ] ] ], [ [ [ 145.70361328125, -4.77027702331543 ], [ 145.701385498047102, -4.770555973052922 ], [ 145.699722290039517, -4.768610954284668 ], [ 145.703048706054688, -4.769167900085449 ], [ 145.70361328125, -4.77027702331543 ] ] ], [ [ [ 146.23883056640625, -4.762860774993896 ], [ 146.256912231445426, -4.80616903305048 ], [ 146.241928100586165, -4.822244167327881 ], [ 146.228012084961165, -4.80835485458374 ], [ 146.231887817382926, -4.828641891479492 ], [ 146.213562011719205, -4.82755708694458 ], [ 146.199401855468977, -4.781435966491642 ], [ 146.23883056640625, -4.762860774993896 ] ] ], [ [ [ 145.993835449219205, -4.521083831787053 ], [ 146.062225341796875, -4.582499980926457 ], [ 146.068328857421875, -4.650001049041748 ], [ 146.053894042968977, -4.705554962158089 ], [ 145.995178222656364, -4.743017196655273 ], [ 145.925384521484489, -4.753864765167236 ], [ 145.887466430664176, -4.72855281829834 ], [ 145.880661010742188, -4.644320964813232 ], [ 145.917785644531364, -4.567738056182804 ], [ 145.993835449219205, -4.521083831787053 ] ] ], [ [ [ 144.942535400390625, -4.23003101348877 ], [ 144.94174194335983, -4.228332996368351 ], [ 144.943054199218977, -4.227499008178654 ], [ 144.944808959961051, -4.228868961334172 ], [ 144.942535400390625, -4.23003101348877 ] ] ], [ [ [ 144.873474121093864, -4.175020217895508 ], [ 144.872558593750114, -4.173456192016488 ], [ 144.874343872070312, -4.169704914093018 ], [ 144.874069213867301, -4.174339771270695 ], [ 144.873474121093864, -4.175020217895508 ] ] ], [ [ [ 145.040481567382812, -4.033036231994572 ], [ 145.073745727539176, -4.050741195678711 ], [ 145.079284667968864, -4.084305763244629 ], [ 145.067626953125455, -4.112383842468262 ], [ 145.026138305664062, -4.124133110046387 ], [ 144.99972534179733, -4.111110210418644 ], [ 144.989440917968864, -4.065557003021183 ], [ 144.995590209961051, -4.04393291473383 ], [ 145.040481567382812, -4.033036231994572 ] ] ], [ [ [ 144.57861328125, -4.0 ], [ 144.661392211914062, -4.011666774749699 ], [ 144.662338256836051, -4.023490905761605 ], [ 144.85638427734375, -4.113333225250244 ], [ 144.868331909179801, -4.136943817138615 ], [ 144.844451904297102, -4.147221088409424 ], [ 144.851943969726676, -4.183055877685547 ], [ 144.884170532226562, -4.20111083984375 ], [ 144.91139221191429, -4.191666126251221 ], [ 144.93499755859375, -4.229721069335938 ], [ 144.975830078125227, -4.255833148956299 ], [ 144.970840454101562, -4.296666145324707 ], [ 144.991104125976676, -4.29555606842041 ], [ 145.032852172851562, -4.348848819732552 ], [ 145.103897094726562, -4.382452964782715 ], [ 145.168151855468864, -4.384764194488469 ], [ 145.185394287109375, -4.403883934020882 ], [ 145.22100830078125, -4.382352828979492 ], [ 145.322204589843977, -4.385091781616211 ], [ 145.365249633789062, -4.434384822845459 ], [ 145.358825683593977, -4.446434974670353 ], [ 145.414443969726676, -4.463684082031193 ], [ 145.420135498046875, -4.500501155853271 ], [ 145.453704833984375, -4.492603778839054 ], [ 145.528076171875114, -4.587175846099854 ], [ 145.546066284179688, -4.581357955932617 ], [ 145.597366333008154, -4.675765991210881 ], [ 145.670562744140739, -4.75579118728632 ], [ 145.805801391601562, -4.847601890563908 ], [ 145.77944946289108, -4.943713188171387 ], [ 145.814727783203352, -5.068334102630558 ], [ 145.774749755859716, -5.075568199157715 ], [ 145.806396484375114, -5.089445114135685 ], [ 145.7869873046875, -5.124404907226506 ], [ 145.806396484375114, -5.125833988189697 ], [ 145.799163818359716, -5.134167194366455 ], [ 145.802474975586165, -5.155960083007756 ], [ 145.790557861328239, -5.147500038146916 ], [ 145.788055419921989, -5.152222156524658 ], [ 145.80694580078125, -5.162222862243596 ], [ 145.791671752929801, -5.195555210113525 ], [ 145.806671142578352, -5.202499866485539 ], [ 145.798889160156477, -5.202221870422306 ], [ 145.792922973632812, -5.206943988800049 ], [ 145.791107177734489, -5.218332767486572 ], [ 145.810272216796875, -5.207221984863281 ], [ 145.815551757812614, -5.218610763549805 ], [ 145.777496337890852, -5.256112098693791 ], [ 145.743606567382926, -5.325554847717228 ], [ 145.755554199218977, -5.320831775665283 ], [ 145.760559082031477, -5.351388931274414 ], [ 145.73194885253929, -5.422500133514347 ], [ 145.760284423828125, -5.477777957916203 ], [ 145.795562744140625, -5.494444847106934 ], [ 145.851669311523438, -5.472499847411996 ], [ 145.869186401367188, -5.492032051086426 ], [ 145.91676330566429, -5.496956825256348 ], [ 145.932266235351676, -5.474729061126595 ], [ 145.983337402343977, -5.469442844390869 ], [ 146.000274658203352, -5.496942996978703 ], [ 146.07861328125, -5.506666183471623 ], [ 146.119171142578239, -5.541110992431641 ], [ 146.1602783203125, -5.531943798065186 ], [ 146.186386108398438, -5.560833930969125 ], [ 146.26666259765625, -5.573054790496826 ], [ 146.284729003906364, -5.595832824707031 ], [ 146.341110229492415, -5.573332786560059 ], [ 146.378326416015852, -5.614999771118107 ], [ 146.460830688476562, -5.606112003326416 ], [ 146.479446411133267, -5.645833015441895 ], [ 146.540069580078352, -5.666914939880314 ], [ 146.630554199218864, -5.761944770812931 ], [ 146.70027160644554, -5.772500038146973 ], [ 146.755889892578466, -5.808039188384953 ], [ 146.768112182617188, -5.840333938598633 ], [ 146.716812133789062, -5.884635925292969 ], [ 146.674011230468864, -5.891334056854191 ], [ 146.498611450195312, -5.993234157562199 ], [ 145.862106323242529, -5.996534824371338 ], [ 145.820617675781477, -5.975334167480469 ], [ 145.663818359375227, -5.981535911560002 ], [ 145.6588134765625, -5.921934127807617 ], [ 145.584518432617642, -5.905334949493408 ], [ 145.527114868164176, -5.973533153533879 ], [ 145.479812622070426, -5.978434085845947 ], [ 145.420318603515739, -5.934535026550293 ], [ 145.3712158203125, -5.859635829925537 ], [ 145.302719116210938, -5.884833812713566 ], [ 145.26960754394554, -5.858233928680363 ], [ 145.230209350585938, -5.852434158325195 ], [ 145.16461181640625, -5.876634120941162 ], [ 145.139007568359489, -5.829033851623535 ], [ 145.090606689453125, -5.78893518447876 ], [ 145.026412963867415, -5.775935173034554 ], [ 144.994720458984602, -5.719933986663818 ], [ 144.9840087890625, -5.661633968353215 ], [ 144.91731262207054, -5.650634765624943 ], [ 144.879608154296989, -5.601233959197884 ], [ 144.779510498046875, -5.536135196685734 ], [ 144.741714477539176, -5.478033065795898 ], [ 144.581115722656364, -5.369033813476562 ], [ 144.506713867187614, -5.291035175323486 ], [ 144.181320190429801, -5.191036224365178 ], [ 144.14100646972679, -5.158635139465275 ], [ 144.098312377930142, -5.078934192657471 ], [ 144.012115478515739, -5.054034233093262 ], [ 143.9691162109375, -5.010334014892521 ], [ 144.034820556640739, -4.991835117340088 ], [ 144.10491943359375, -4.943534851074219 ], [ 144.574218750000114, -4.58783483505249 ], [ 144.57861328125, -4.0 ] ] ], [ [ [ 144.96632385253929, -3.990691900253239 ], [ 144.970916748047102, -3.996014118194523 ], [ 144.967315673828239, -4.001597881317139 ], [ 144.956573486328352, -3.993212938308716 ], [ 144.96632385253929, -3.990691900253239 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-MRL", "NAME_1": "Manus" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 145.307220458984375, -0.756389021873474 ], [ 145.307220458984375, -0.760555028915405 ], [ 145.302505493164062, -0.756667017936707 ], [ 145.302993774414176, -0.755904018878937 ], [ 145.307220458984375, -0.756389021873474 ] ] ], [ [ [ 145.565826416015739, -0.87201398611063 ], [ 145.568328857421989, -0.877777993679047 ], [ 145.544097900390739, -0.901112020015603 ], [ 145.54888916015625, -0.881944000720978 ], [ 145.565826416015739, -0.87201398611063 ] ] ], [ [ [ 145.531112670898551, -0.908334970474243 ], [ 145.528884887695312, -0.907500028610229 ], [ 145.532226562500114, -0.904999971389771 ], [ 145.533050537109375, -0.906665980815831 ], [ 145.531112670898551, -0.908334970474243 ] ] ], [ [ [ 143.000274658203239, -1.000277042388859 ], [ 143.0, -1.000555038452092 ], [ 142.999725341796875, -1.000277042388859 ], [ 143.0, -0.999998986721039 ], [ 143.000274658203239, -1.000277042388859 ] ] ], [ [ [ 144.398605346679688, -1.079399943351632 ], [ 144.396392822265739, -1.075500011444092 ], [ 144.398193359375, -1.073758959770146 ], [ 144.399642944336051, -1.074872970580941 ], [ 144.398605346679688, -1.079399943351632 ] ] ], [ [ [ 144.401718139648665, -1.080724000930786 ], [ 144.404998779296989, -1.0938880443573 ], [ 144.396942138671875, -1.094092965125981 ], [ 144.39617919921875, -1.080862998962402 ], [ 144.401718139648665, -1.080724000930786 ] ] ], [ [ [ 144.417083740234375, -1.102753996849003 ], [ 144.412796020507926, -1.099246025085449 ], [ 144.412582397460938, -1.096670985221806 ], [ 144.415908813476676, -1.098273038864079 ], [ 144.417083740234375, -1.102753996849003 ] ] ], [ [ [ 144.41925048828125, -1.108623027801514 ], [ 144.418136596679801, -1.10869300365448 ], [ 144.416625976562614, -1.104096055030823 ], [ 144.418838500976562, -1.104861974716187 ], [ 144.41925048828125, -1.108623027801514 ] ] ], [ [ [ 144.49690246582054, -1.111690044403019 ], [ 144.499206542968864, -1.11868500709528 ], [ 144.481674194336051, -1.11489295959467 ], [ 144.487976074218864, -1.107790946960392 ], [ 144.49690246582054, -1.111690044403019 ] ] ], [ [ [ 144.42034912109375, -1.113361001014653 ], [ 144.418350219726676, -1.112733960151616 ], [ 144.419311523437614, -1.109390974044743 ], [ 144.4208984375, -1.111271023750248 ], [ 144.42034912109375, -1.113361001014653 ] ] ], [ [ [ 144.5035400390625, -1.114685058593636 ], [ 144.500778198242301, -1.114336013793888 ], [ 144.49932861328125, -1.110298037528992 ], [ 144.503265380859489, -1.111271023750248 ], [ 144.5035400390625, -1.114685058593636 ] ] ], [ [ [ 144.4197998046875, -1.122483968734684 ], [ 144.418960571289176, -1.122203946113586 ], [ 144.419586181640625, -1.114197015762329 ], [ 144.421661376953125, -1.11642396450037 ], [ 144.4197998046875, -1.122483968734684 ] ] ], [ [ [ 144.507415771484489, -1.117678046226388 ], [ 144.505477905273665, -1.116704940795842 ], [ 144.505767822265625, -1.115309953689575 ], [ 144.507705688476562, -1.115867972373962 ], [ 144.507415771484489, -1.117678046226388 ] ] ], [ [ [ 144.500228881835938, -1.141216993331909 ], [ 144.496826171875, -1.139613986015263 ], [ 144.504928588867301, -1.118792057037354 ], [ 144.509918212890739, -1.131744980812073 ], [ 144.500228881835938, -1.141216993331909 ] ] ], [ [ [ 144.476837158203125, -1.124781966209412 ], [ 144.474746704101562, -1.124503970146179 ], [ 144.476760864257812, -1.119696974754277 ], [ 144.477661132812614, -1.120046019554138 ], [ 144.476837158203125, -1.124781966209412 ] ] ], [ [ [ 144.403549194335938, -1.165765047073307 ], [ 144.399932861328125, -1.164335966110229 ], [ 144.4188232421875, -1.127218008041382 ], [ 144.420974731445312, -1.151383996009827 ], [ 144.403549194335938, -1.165765047073307 ] ] ], [ [ [ 144.480422973632812, -1.132509946823063 ], [ 144.496078491210938, -1.139474987983704 ], [ 144.495925903320312, -1.140938997268677 ], [ 144.481536865234375, -1.135365962982178 ], [ 144.478912353515625, -1.130839943885803 ], [ 144.480422973632812, -1.132509946823063 ] ] ], [ [ [ 144.395645141601676, -1.167677044868412 ], [ 144.391693115234375, -1.166424036025944 ], [ 144.399108886718864, -1.165169954299927 ], [ 144.398757934570312, -1.166982054710388 ], [ 144.395645141601676, -1.167677044868412 ] ] ], [ [ [ 144.380554199218977, -1.164168000221196 ], [ 144.381942749023551, -1.165555953979435 ], [ 144.380279541015625, -1.166668057441655 ], [ 144.379165649414062, -1.165555953979435 ], [ 144.380554199218977, -1.164168000221196 ] ] ], [ [ [ 144.385559082031364, -1.164721012115365 ], [ 144.388885498046875, -1.166668057441655 ], [ 144.390548706054688, -1.167222023010197 ], [ 144.382507324218864, -1.166668057441655 ], [ 144.385559082031364, -1.164721012115365 ] ] ], [ [ [ 144.370040893554688, -1.207509994506779 ], [ 144.369827270507812, -1.205490946769714 ], [ 144.374526977539062, -1.20173001289362 ], [ 144.373214721679688, -1.205003023147583 ], [ 144.370040893554688, -1.207509994506779 ] ] ], [ [ [ 144.271743774414062, -1.216632962226811 ], [ 144.275070190429915, -1.218026041984501 ], [ 144.275772094726562, -1.224920034408512 ], [ 144.26531982421875, -1.223108053207341 ], [ 144.271743774414062, -1.216632962226811 ] ] ], [ [ [ 144.225448608398438, -1.223873972892704 ], [ 144.220596313476676, -1.22484898567194 ], [ 144.217559814453125, -1.22331798076624 ], [ 144.230712890625, -1.218394994735604 ], [ 144.225448608398438, -1.223873972892704 ] ] ], [ [ [ 144.297576904297102, -1.220173001289311 ], [ 144.292373657226562, -1.223945021629333 ], [ 144.284210205078125, -1.221508026123047 ], [ 144.287261962890625, -1.219625949859562 ], [ 144.297576904297102, -1.220173001289311 ] ] ], [ [ [ 144.354049682617301, -1.227146983146667 ], [ 144.353012084960938, -1.22484898567194 ], [ 144.355224609375114, -1.223667025565987 ], [ 144.355712890625, -1.224781036376953 ], [ 144.354049682617301, -1.227146983146667 ] ] ], [ [ [ 144.316192626953125, -1.237107038497811 ], [ 144.31549072265625, -1.238847970962468 ], [ 144.313690185546875, -1.237941026687622 ], [ 144.314941406250227, -1.236757993698063 ], [ 144.316192626953125, -1.237107038497811 ] ] ], [ [ [ 144.357986450195312, -1.244905948638859 ], [ 144.354736328125, -1.244207978248596 ], [ 144.355148315429688, -1.242328047752324 ], [ 144.357299804687614, -1.242050051689091 ], [ 144.357986450195312, -1.244905948638859 ] ] ], [ [ [ 144.357818603515625, -1.267752051353398 ], [ 144.3568115234375, -1.266144990921021 ], [ 144.358871459961051, -1.25929403305048 ], [ 144.359649658203125, -1.264027953147831 ], [ 144.357818603515625, -1.267752051353398 ] ] ], [ [ [ 144.299362182617301, -1.265447974205017 ], [ 144.297286987304688, -1.265308976173287 ], [ 144.297500610351562, -1.263149976730347 ], [ 144.299789428710938, -1.263149976730347 ], [ 144.299362182617301, -1.265447974205017 ] ] ], [ [ [ 144.332931518554801, -1.27192497253418 ], [ 144.330856323242188, -1.272003054618779 ], [ 144.330795288086051, -1.270329952239933 ], [ 144.332382202148438, -1.269773960113525 ], [ 144.332931518554801, -1.27192497253418 ] ] ], [ [ [ 144.35418701171875, -1.278470993041935 ], [ 144.352523803711051, -1.278331995010376 ], [ 144.356323242187727, -1.270671963691711 ], [ 144.356674194335938, -1.275127053260803 ], [ 144.35418701171875, -1.278470993041935 ] ] ], [ [ [ 144.353179931640625, -1.283565044403019 ], [ 144.352493286132812, -1.28286695480341 ], [ 144.354080200195426, -1.279664993286133 ], [ 144.354278564453239, -1.282101035118046 ], [ 144.353179931640625, -1.283565044403019 ] ] ], [ [ [ 144.347061157226562, -1.286486029624939 ], [ 144.347961425781364, -1.30047595500946 ], [ 144.339370727539176, -1.314404010772705 ], [ 144.345947265625, -1.296298027038574 ], [ 144.347061157226562, -1.286486029624939 ] ] ], [ [ [ 144.263381958007812, -1.292538046836853 ], [ 144.262069702148438, -1.29222297668457 ], [ 144.260955810547102, -1.290518045425358 ], [ 144.263931274414062, -1.290725946426392 ], [ 144.263381958007812, -1.292538046836853 ] ] ], [ [ [ 143.583450317382812, -1.313063025474491 ], [ 143.578536987304801, -1.311254024505558 ], [ 143.578735351562614, -1.307492971420231 ], [ 143.583175659179688, -1.307353973388672 ], [ 143.583450317382812, -1.313063025474491 ] ] ], [ [ [ 144.28912353515625, -1.31275999546051 ], [ 144.28759765625, -1.312103986740112 ], [ 144.287429809570312, -1.310634016990662 ], [ 144.289810180664176, -1.310711026191711 ], [ 144.28912353515625, -1.31275999546051 ] ] ], [ [ [ 144.335464477539062, -1.324695944786072 ], [ 144.334640502929801, -1.32420802116394 ], [ 144.339126586914062, -1.316828966140747 ], [ 144.336715698242301, -1.323443055152893 ], [ 144.335464477539062, -1.324695944786072 ] ] ], [ [ [ 144.1522216796875, -1.318302989006042 ], [ 144.16731262207054, -1.327844023704415 ], [ 144.168350219726562, -1.331743001937866 ], [ 144.154983520507926, -1.326241016387939 ], [ 144.1522216796875, -1.318302989006042 ] ] ], [ [ [ 144.174438476562614, -1.365308046340942 ], [ 144.17359924316429, -1.362174034118652 ], [ 144.175537109375114, -1.357228994369507 ], [ 144.175964355468864, -1.358901023864632 ], [ 144.174438476562614, -1.365308046340942 ] ] ], [ [ [ 144.190567016601562, -1.408759951591435 ], [ 144.215560913086165, -1.40103101730341 ], [ 144.181015014648438, -1.412520051002502 ], [ 144.171463012695312, -1.398594975471497 ], [ 144.172744750976562, -1.386127948760986 ], [ 144.190567016601562, -1.408759951591435 ] ] ], [ [ [ 144.083068847656364, -1.391003012657166 ], [ 144.088821411132812, -1.39392697811121 ], [ 144.087158203125, -1.400056004524174 ], [ 144.082382202148438, -1.39330005645752 ], [ 144.083068847656364, -1.391003012657166 ] ] ], [ [ [ 144.082595825195312, -1.395320057868901 ], [ 144.082534790039062, -1.396088004112187 ], [ 144.07746887207054, -1.397549033164978 ], [ 144.079193115234602, -1.392117977142277 ], [ 144.082595825195312, -1.395320057868901 ] ] ], [ [ [ 144.519332885742188, -1.404304027557259 ], [ 144.51593017578125, -1.412312984466553 ], [ 144.505477905273665, -1.417812943458557 ], [ 144.506927490234375, -1.400666952133122 ], [ 144.519332885742188, -1.404304027557259 ] ] ], [ [ [ 144.052886962890739, -1.469380021095219 ], [ 144.060775756835938, -1.482959032058716 ], [ 144.05108642578125, -1.490479946136475 ], [ 144.041259765625114, -1.452386975288391 ], [ 144.052886962890739, -1.469380021095219 ] ] ], [ [ [ 143.055831909179688, -1.454167008399963 ], [ 143.072784423828125, -1.458333015441895 ], [ 143.082138061523438, -1.46402204036707 ], [ 143.049163818359375, -1.476667046546822 ], [ 143.055831909179688, -1.454167008399963 ] ] ], [ [ [ 145.124160766601562, -1.473055958747807 ], [ 145.126663208007812, -1.475278973579407 ], [ 145.123611450195312, -1.478610992431527 ], [ 145.121948242187614, -1.474166035652161 ], [ 145.124160766601562, -1.473055958747807 ] ] ], [ [ [ 145.016662597656364, -1.486945986747685 ], [ 145.014450073242188, -1.487776994705143 ], [ 145.009445190429801, -1.486111044883671 ], [ 145.016937255859375, -1.484722971916199 ], [ 145.016662597656364, -1.486945986747685 ] ] ], [ [ [ 145.004165649414062, -1.485972046852112 ], [ 145.00502014160179, -1.486013054847604 ], [ 145.006393432617301, -1.487776994705143 ], [ 145.003326416015739, -1.487498998641911 ], [ 145.004165649414062, -1.485972046852112 ] ] ], [ [ [ 145.078887939453239, -1.503054022788888 ], [ 145.077499389648665, -1.502223014831486 ], [ 145.078399658203125, -1.499444007873535 ], [ 145.079925537109375, -1.500764012336674 ], [ 145.078887939453239, -1.503054022788888 ] ] ], [ [ [ 145.083328247070312, -1.506389021873417 ], [ 145.095977783203125, -1.519029021263066 ], [ 145.078887939453239, -1.514999032020569 ], [ 145.067214965820426, -1.547222018241825 ], [ 145.04083251953125, -1.538054943084717 ], [ 145.083328247070312, -1.506389021873417 ] ] ], [ [ [ 145.004440307617415, -1.528331995010319 ], [ 145.00062561035179, -1.529306054115239 ], [ 144.998687744140625, -1.521309971809387 ], [ 145.002227783203239, -1.523609995841923 ], [ 145.004440307617415, -1.528331995010319 ] ] ], [ [ [ 145.031661987304688, -1.532222986221257 ], [ 145.0352783203125, -1.538054943084717 ], [ 145.016113281250114, -1.554721951484623 ], [ 145.015838623046875, -1.547500014305058 ], [ 145.031661987304688, -1.532222986221257 ] ] ], [ [ [ 145.004440307617415, -1.536388993263245 ], [ 145.014999389648551, -1.546388030052128 ], [ 145.013885498046875, -1.548056006431523 ], [ 145.000274658203239, -1.539167046546936 ], [ 145.004440307617415, -1.536388993263245 ] ] ], [ [ [ 144.969131469726562, -1.566066026687565 ], [ 144.970657348632812, -1.570659995079041 ], [ 144.974472045898438, -1.577206015586739 ], [ 144.969818115234375, -1.571913957595825 ], [ 144.966918945312614, -1.563698053359929 ], [ 144.969131469726562, -1.566066026687565 ] ] ], [ [ [ 144.987548828125, -1.58820998668665 ], [ 144.99737548828125, -1.591689944267159 ], [ 144.987823486328125, -1.590437054634037 ], [ 144.9752197265625, -1.578737974166813 ], [ 144.987548828125, -1.58820998668665 ] ] ], [ [ [ 144.027694702148665, -1.655588030815125 ], [ 144.023681640625227, -1.641453027725106 ], [ 144.025833129882926, -1.64068496227253 ], [ 144.032333374023551, -1.645979046821594 ], [ 144.027694702148665, -1.655588030815125 ] ] ], [ [ [ 144.017105102539062, -1.660045981407109 ], [ 144.021530151367188, -1.659209012985229 ], [ 144.022369384765739, -1.659765958786011 ], [ 144.017456054687614, -1.661856055259705 ], [ 144.013580322265852, -1.658514022827092 ], [ 144.017105102539062, -1.660045981407109 ] ] ], [ [ [ 142.845520019531477, -1.727622032165527 ], [ 142.881332397460938, -1.728561043739262 ], [ 142.873580932617301, -1.751757979393005 ], [ 142.84942626953125, -1.739964008331299 ], [ 142.828765869140739, -1.760316014289856 ], [ 142.83111572265625, -1.720000982284489 ], [ 142.845520019531477, -1.727622032165527 ] ] ], [ [ [ 146.580001831054688, -1.902500033378601 ], [ 146.58583068847679, -1.903609991073495 ], [ 146.586227416992301, -1.905336022376957 ], [ 146.579193115234489, -1.905472040176392 ], [ 146.580001831054688, -1.902500033378601 ] ] ], [ [ [ 146.875000000000114, -1.905557036399784 ], [ 146.897506713867301, -1.916946053504944 ], [ 146.898071289062614, -1.918071031570378 ], [ 146.88250732421875, -1.914723038673401 ], [ 146.875000000000114, -1.905557036399784 ] ] ], [ [ [ 146.601669311523551, -1.906388998031559 ], [ 146.605270385742188, -1.906110048294011 ], [ 146.607101440429688, -1.908709049224854 ], [ 146.598785400390625, -1.907050013542175 ], [ 146.601669311523551, -1.906388998031559 ] ] ], [ [ [ 146.662506103515852, -1.928609967231694 ], [ 146.668060302734489, -1.930835008621159 ], [ 146.673049926757926, -1.932222962379456 ], [ 146.662994384765625, -1.9322429895401 ], [ 146.662506103515852, -1.928609967231694 ] ] ], [ [ [ 146.998336791992188, -1.933889031410217 ], [ 147.006393432617415, -1.938333034515381 ], [ 147.006942749023438, -1.940276980400085 ], [ 147.001449584961051, -1.939445018768311 ], [ 146.998336791992188, -1.933889031410217 ] ] ], [ [ [ 146.599716186523438, -1.93416702747345 ], [ 146.604446411132812, -1.936944961547852 ], [ 146.603607177734489, -1.939998984336853 ], [ 146.596389770507926, -1.938055038452148 ], [ 146.599716186523438, -1.93416702747345 ] ] ], [ [ [ 147.019439697265625, -1.938333034515381 ], [ 147.020553588867301, -1.939723014831543 ], [ 147.017227172851562, -1.939167022705078 ], [ 147.017227172851562, -1.938611030578613 ], [ 147.019439697265625, -1.938333034515381 ] ] ], [ [ [ 147.103057861328125, -1.938611030578613 ], [ 147.104446411132926, -1.943333029747009 ], [ 147.097229003906364, -1.940554976463318 ], [ 147.099716186523551, -1.938889026641846 ], [ 147.103057861328125, -1.938611030578613 ] ] ], [ [ [ 147.132217407226562, -1.942221045493966 ], [ 147.136108398437614, -1.944442987442017 ], [ 147.136672973632926, -1.945834040641728 ], [ 147.129165649414062, -1.943055033683777 ], [ 147.132217407226562, -1.942221045493966 ] ] ], [ [ [ 146.6119384765625, -1.944167971610909 ], [ 146.626647949218977, -1.954033970832768 ], [ 146.623748779296875, -1.959864020347482 ], [ 146.6119384765625, -1.953888058662415 ], [ 146.6119384765625, -1.944167971610909 ] ] ], [ [ [ 146.494171142578125, -1.949444055557251 ], [ 146.493606567382812, -1.951388001441956 ], [ 146.491104125976676, -1.950834035873356 ], [ 146.49249267578125, -1.948609948158207 ], [ 146.494171142578125, -1.949444055557251 ] ] ], [ [ [ 147.189437866210938, -1.948609948158207 ], [ 147.19000244140625, -1.950278043746891 ], [ 147.187225341796989, -1.949722051620483 ], [ 147.187774658203125, -1.948609948158207 ], [ 147.189437866210938, -1.948609948158207 ] ] ], [ [ [ 146.839996337890625, -1.951110005378723 ], [ 146.97528076171875, -1.976943969726562 ], [ 147.109451293945426, -1.973611950874272 ], [ 147.140213012695312, -2.008317947387638 ], [ 147.153884887695426, -1.982777953147888 ], [ 147.266265869140625, -2.017549037933293 ], [ 147.318511962890625, -2.050409078597966 ], [ 147.334716796875114, -2.02594089508051 ], [ 147.346939086914062, -2.040556907653752 ], [ 147.337783813476562, -2.060277938842717 ], [ 147.29638671875, -2.061666011810303 ], [ 147.303604125976676, -2.07694506645197 ], [ 147.278060913086051, -2.10055494308466 ], [ 147.264724731445312, -2.093332052230778 ], [ 147.286117553710938, -2.077498912811222 ], [ 147.270004272461051, -2.078888893127441 ], [ 147.259994506835938, -2.100832939147892 ], [ 147.2611083984375, -2.106389999389648 ], [ 147.278335571289062, -2.115000009536629 ], [ 147.256805419921875, -2.151108026504517 ], [ 147.183609008789176, -2.208122968673649 ], [ 147.116256713867415, -2.174026966094914 ], [ 147.062500000000114, -2.205554962158203 ], [ 147.026947021484375, -2.208055019378662 ], [ 147.030548095703125, -2.194721937179565 ], [ 147.007217407226676, -2.192500114440861 ], [ 146.971939086914176, -2.214720964431763 ], [ 146.875549316406477, -2.203888893127385 ], [ 146.856948852539062, -2.184998989105168 ], [ 146.782867431640739, -2.180182933807316 ], [ 146.7388916015625, -2.15305495262146 ], [ 146.737503051757926, -2.127499103546029 ], [ 146.710281372070312, -2.141665935516301 ], [ 146.696105957031364, -2.123054981231689 ], [ 146.694442749023438, -2.14416599273676 ], [ 146.684722900390625, -2.126389026641846 ], [ 146.669998168945426, -2.132220983505249 ], [ 146.679412841796875, -2.154267072677612 ], [ 146.716659545898438, -2.170000076293945 ], [ 146.701385498046875, -2.197499990463257 ], [ 146.648330688476562, -2.208055019378662 ], [ 146.633895874023665, -2.184444904327393 ], [ 146.598892211914062, -2.183054924011174 ], [ 146.573059082031364, -2.218333959579468 ], [ 146.574066162109489, -2.248399972915593 ], [ 146.553604125976676, -2.255831956863403 ], [ 146.511108398437614, -2.214168071746712 ], [ 146.507781982421875, -2.17750096321106 ], [ 146.520828247070426, -2.166110038757324 ], [ 146.505554199218864, -2.154999017715397 ], [ 146.534500122070312, -2.134653091430607 ], [ 146.526809692382812, -2.117778062820378 ], [ 146.546951293945426, -2.131942987442017 ], [ 146.596389770507926, -2.12944507598877 ], [ 146.610275268554801, -2.113611936569214 ], [ 146.562591552734489, -2.042871952056885 ], [ 146.570281982421875, -1.985556960105896 ], [ 146.601394653320312, -2.025554895401001 ], [ 146.636672973632812, -1.969998955726567 ], [ 146.696670532226676, -1.999168038368225 ], [ 146.716949462890625, -1.985556960105896 ], [ 146.751663208007812, -1.996945023536625 ], [ 146.839996337890625, -1.951110005378723 ] ] ], [ [ [ 146.581665039062614, -1.953333973884526 ], [ 146.585281372070426, -1.959166049957275 ], [ 146.580825805664062, -1.961666941642761 ], [ 146.578048706054801, -1.957779049873352 ], [ 146.581665039062614, -1.953333973884526 ] ] ], [ [ [ 147.211669921875114, -1.954236984252873 ], [ 147.229446411132812, -1.963889002799988 ], [ 147.245559692382812, -1.963889002799988 ], [ 147.227218627929688, -1.967499017715397 ], [ 147.211669921875114, -1.954236984252873 ] ] ], [ [ [ 146.479095458984375, -1.959581017494145 ], [ 146.477783203125, -1.959792971610966 ], [ 146.478500366211051, -1.957587003707886 ], [ 146.479324340820312, -1.95807504653925 ], [ 146.479095458984375, -1.959581017494145 ] ] ], [ [ [ 147.288055419921875, -1.958610057830811 ], [ 147.291381835937614, -1.960832953453064 ], [ 147.279724121093864, -1.962501049041748 ], [ 147.283889770507812, -1.958888053894043 ], [ 147.288055419921875, -1.958610057830811 ] ] ], [ [ [ 147.318328857421875, -1.959166049957275 ], [ 147.336395263671989, -1.965276956558114 ], [ 147.34027099609375, -1.971390008926335 ], [ 147.322219848632812, -1.96722304821003 ], [ 147.318328857421875, -1.959166049957275 ] ] ], [ [ [ 146.799026489257812, -1.963564991950989 ], [ 146.798049926757812, -1.962242960929871 ], [ 146.79840087890625, -1.960572957992497 ], [ 146.799499511718864, -1.961964964866638 ], [ 146.799026489257812, -1.963564991950989 ] ] ], [ [ [ 146.906692504882926, -1.964421987533569 ], [ 146.906417846679688, -1.966122031211853 ], [ 146.905838012695312, -1.966109037399235 ], [ 146.905563354492301, -1.964714050292969 ], [ 146.906692504882926, -1.964421987533569 ] ] ], [ [ [ 146.477218627929688, -1.972777009010258 ], [ 146.476104736328125, -1.970201969146729 ], [ 146.477279663085938, -1.967442035674992 ], [ 146.47784423828125, -1.969799041748047 ], [ 146.477218627929688, -1.972777009010258 ] ] ], [ [ [ 147.34722900390625, -1.969720959663334 ], [ 147.3538818359375, -1.971390008926335 ], [ 147.355560302734375, -1.977221965789795 ], [ 147.342498779296989, -1.973333954811039 ], [ 147.34722900390625, -1.969720959663334 ] ] ], [ [ [ 146.655929565429688, -1.971367001533451 ], [ 146.655380249023438, -1.972522020339909 ], [ 146.654220581054688, -1.972509026527405 ], [ 146.653961181640739, -1.971631050109863 ], [ 146.655929565429688, -1.971367001533451 ] ] ], [ [ [ 148.07025146484375, -1.97438204288477 ], [ 148.068374633789062, -1.975842952728271 ], [ 148.064163208007812, -1.9734770059585 ], [ 148.068099975585938, -1.971526026725769 ], [ 148.07025146484375, -1.97438204288477 ] ] ], [ [ [ 147.377029418945426, -2.073939085006714 ], [ 147.410552978515625, -2.06555700302124 ], [ 147.41485595703125, -2.031692981719971 ], [ 147.402572631836051, -2.041889905929509 ], [ 147.405487060546875, -2.011459112167302 ], [ 147.366744995117301, -1.972844004631042 ], [ 147.419723510742301, -1.999721050262451 ], [ 147.439727783203125, -2.031666040420475 ], [ 147.419998168945312, -2.04222297668457 ], [ 147.423049926757812, -2.080276966094914 ], [ 147.314437866211051, -2.077776908874398 ], [ 147.345977783203125, -2.06555700302124 ], [ 147.351104736328239, -2.037777900695801 ], [ 147.4085693359375, -2.051376104354858 ], [ 147.377029418945426, -2.073939085006714 ] ] ], [ [ [ 148.032943725586051, -1.986081004142761 ], [ 148.028656005859375, -1.986081004142761 ], [ 148.026992797851562, -1.983641982078552 ], [ 148.032318115234375, -1.982597947120667 ], [ 148.032943725586051, -1.986081004142761 ] ] ], [ [ [ 146.695648193359375, -1.986929059028625 ], [ 146.696487426757926, -1.989449024200439 ], [ 146.693939208984375, -1.989433050155583 ], [ 146.693954467773438, -1.987514019012451 ], [ 146.695648193359375, -1.986929059028625 ] ] ], [ [ [ 146.608612060546875, -1.995833039283752 ], [ 146.606109619140739, -1.9911110401153 ], [ 146.609725952148551, -1.988888978958073 ], [ 146.611114501953125, -1.991667032241764 ], [ 146.608612060546875, -1.995833039283752 ] ] ], [ [ [ 147.930526733398551, -2.001473903656006 ], [ 147.928802490234489, -1.998886942863464 ], [ 147.929565429687614, -1.996940970420837 ], [ 147.931396484375, -1.999999046325684 ], [ 147.930526733398551, -2.001473903656006 ] ] ], [ [ [ 147.771209716796875, -2.034992933273315 ], [ 147.795562744140625, -2.049721002578622 ], [ 147.777770996093864, -2.06833291053772 ], [ 147.70953369140625, -2.052779912948608 ], [ 147.714996337890739, -2.041085004806519 ], [ 147.751312255859375, -2.049931049346867 ], [ 147.727493286132812, -2.027307987213078 ], [ 147.754089355468864, -2.04596304893488 ], [ 147.767791748046875, -2.036581993102914 ], [ 147.763442993164176, -2.003499984741211 ], [ 147.771209716796875, -2.034992933273315 ] ] ], [ [ [ 147.284729003906364, -2.015554904937687 ], [ 147.283889770507812, -2.015554904937687 ], [ 147.283615112304688, -2.013889074325562 ], [ 147.285278320312614, -2.014167070388794 ], [ 147.284729003906364, -2.015554904937687 ] ] ], [ [ [ 147.31298828125, -2.028194904327336 ], [ 147.311843872070312, -2.02827000617981 ], [ 147.311950683593977, -2.024442911148071 ], [ 147.313888549804801, -2.025832891464177 ], [ 147.31298828125, -2.028194904327336 ] ] ], [ [ [ 147.3094482421875, -2.031110048294067 ], [ 147.30999755859375, -2.032778024673405 ], [ 147.30694580078125, -2.034166097640991 ], [ 147.307357788085938, -2.031527042388916 ], [ 147.3094482421875, -2.031110048294067 ] ] ], [ [ [ 146.460556030273551, -2.05472207069397 ], [ 146.462493896484489, -2.056387901306096 ], [ 146.461105346679801, -2.059165954589844 ], [ 146.459030151367301, -2.05604100227356 ], [ 146.460556030273551, -2.05472207069397 ] ] ], [ [ [ 147.32049560546875, -2.064913988113403 ], [ 147.315933227539062, -2.067210912704468 ], [ 147.312606811523438, -2.065263032913151 ], [ 147.320571899414176, -2.063659906387329 ], [ 147.32049560546875, -2.064913988113403 ] ] ], [ [ [ 147.65692138671875, -2.066837072372437 ], [ 147.650375366211051, -2.088677883148137 ], [ 147.581390380859375, -2.091109991073608 ], [ 147.587493896484375, -2.083333969116211 ], [ 147.65692138671875, -2.066837072372437 ] ] ], [ [ [ 147.591888427734375, -2.080517053604069 ], [ 147.589736938476562, -2.080096960067692 ], [ 147.589462280273438, -2.078566074371338 ], [ 147.59222412109375, -2.078427076339665 ], [ 147.591888427734375, -2.080517053604069 ] ] ], [ [ [ 146.552780151367188, -2.084444046020508 ], [ 146.556671142578239, -2.087500095367432 ], [ 146.555557250976676, -2.093056917190552 ], [ 146.550277709960938, -2.088609933853149 ], [ 146.552780151367188, -2.084444046020508 ] ] ], [ [ [ 146.426391601562614, -2.087222099304086 ], [ 146.431396484375114, -2.096667051315251 ], [ 146.423889160156477, -2.10166692733759 ], [ 146.420272827148665, -2.091387987136841 ], [ 146.426391601562614, -2.087222099304086 ] ] ], [ [ [ 146.569824218750114, -2.095367908477783 ], [ 146.570831298828239, -2.096667051315251 ], [ 146.568893432617301, -2.098054885864201 ], [ 146.567779541015739, -2.096667051315251 ], [ 146.569824218750114, -2.095367908477783 ] ] ], [ [ [ 146.390838623046875, -2.100276947021428 ], [ 146.404449462890739, -2.10944390296936 ], [ 146.400833129882926, -2.118887901306152 ], [ 146.390838623046875, -2.115210056304875 ], [ 146.390838623046875, -2.100276947021428 ] ] ], [ [ [ 147.284713745117301, -2.103274106979313 ], [ 147.283187866211051, -2.102857112884521 ], [ 147.284027099609375, -2.100908041000366 ], [ 147.2847900390625, -2.101952075958252 ], [ 147.284713745117301, -2.103274106979313 ] ] ], [ [ [ 146.556671142578239, -2.118887901306152 ], [ 146.554992675781364, -2.11972188949585 ], [ 146.553054809570426, -2.117500066757145 ], [ 146.555770874023438, -2.117639064788818 ], [ 146.556671142578239, -2.118887901306152 ] ] ], [ [ [ 146.272872924804801, -2.159049034118652 ], [ 146.272109985351676, -2.159049034118652 ], [ 146.271209716796875, -2.157588005065861 ], [ 146.272872924804801, -2.158076047897339 ], [ 146.272872924804801, -2.159049034118652 ] ] ], [ [ [ 145.923553466796875, -2.160362005233765 ], [ 145.92529296875, -2.160571098327637 ], [ 145.925643920898438, -2.161756992340031 ], [ 145.923492431640625, -2.161336898803711 ], [ 145.923553466796875, -2.160362005233765 ] ] ], [ [ [ 146.293060302734489, -2.16416597366333 ], [ 146.290283203125, -2.164026975631657 ], [ 146.289581298828125, -2.162847995758057 ], [ 146.292221069335938, -2.162777900695744 ], [ 146.293060302734489, -2.16416597366333 ] ] ], [ [ [ 146.508605957031364, -2.162777900695744 ], [ 146.510284423828125, -2.164999961853027 ], [ 146.506103515625227, -2.167222023010254 ], [ 146.505004882812614, -2.164443969726562 ], [ 146.508605957031364, -2.162777900695744 ] ] ], [ [ [ 146.498611450195312, -2.166944026947021 ], [ 146.500000000000227, -2.170207977294865 ], [ 146.499160766601562, -2.170834064483643 ], [ 146.497772216796989, -2.168610095977783 ], [ 146.498611450195312, -2.166944026947021 ] ] ], [ [ [ 147.726943969726562, -2.18416690826416 ], [ 147.735549926757812, -2.191109895706177 ], [ 147.726943969726562, -2.201387882232666 ], [ 147.716949462890739, -2.196111917495728 ], [ 147.726943969726562, -2.18416690826416 ] ] ], [ [ [ 147.745285034179688, -2.189722061157227 ], [ 147.744171142578239, -2.18861198425293 ], [ 147.745895385742301, -2.186875104904061 ], [ 147.7469482421875, -2.18861198425293 ], [ 147.745285034179688, -2.189722061157227 ] ] ], [ [ [ 147.753326416015739, -2.190278053283691 ], [ 147.759445190429801, -2.197777986526489 ], [ 147.757781982421875, -2.204998970031738 ], [ 147.753326416015739, -2.199444055557194 ], [ 147.753326416015739, -2.190278053283691 ] ] ], [ [ [ 147.766113281250114, -2.194721937179565 ], [ 147.781951904296989, -2.205554962158203 ], [ 147.783340454101562, -2.228888988494873 ], [ 147.764724731445312, -2.202501058578434 ], [ 147.766113281250114, -2.194721937179565 ] ] ], [ [ [ 146.60882568359375, -2.197231054305973 ], [ 146.610015869140625, -2.199040889739933 ], [ 146.608474731445312, -2.200989961624089 ], [ 146.605712890625114, -2.198067903518677 ], [ 146.60882568359375, -2.197231054305973 ] ] ], [ [ [ 147.149581909179688, -2.200417995452881 ], [ 147.149444580078352, -2.198610067367497 ], [ 147.150283813476562, -2.198055982589722 ], [ 147.1507568359375, -2.199515104293823 ], [ 147.149581909179688, -2.200417995452881 ] ] ], [ [ [ 147.762161254882812, -2.202018022537231 ], [ 147.760894775390625, -2.201733112335205 ], [ 147.762771606445312, -2.199023008346501 ], [ 147.762710571289176, -2.199928045272827 ], [ 147.762161254882812, -2.202018022537231 ] ] ], [ [ [ 146.335006713867415, -2.202223062515259 ], [ 146.333953857421875, -2.201387882232666 ], [ 146.334716796875, -2.199444055557194 ], [ 146.335632324218864, -2.200692892074528 ], [ 146.335006713867415, -2.202223062515259 ] ] ], [ [ [ 147.151229858398551, -2.202239036560059 ], [ 147.150741577148438, -2.200778007507267 ], [ 147.153030395507812, -2.199594974517822 ], [ 147.153717041015625, -2.20042896270752 ], [ 147.151229858398551, -2.202239036560059 ] ] ], [ [ [ 147.743606567382926, -2.20055699348444 ], [ 147.7530517578125, -2.204444885253849 ], [ 147.756668090820312, -2.211389064788818 ], [ 147.743606567382926, -2.205832958221379 ], [ 147.743606567382926, -2.20055699348444 ] ] ], [ [ [ 147.1484375, -2.201191902160645 ], [ 147.14996337890625, -2.201749086379948 ], [ 147.149688720703239, -2.202583074569588 ], [ 147.147323608398438, -2.202166080474854 ], [ 147.1484375, -2.201191902160645 ] ] ], [ [ [ 146.23333740234375, -2.201041936874333 ], [ 146.236663818359489, -2.201109886169434 ], [ 146.237228393554801, -2.201667070388794 ], [ 146.23388671875, -2.202779054641667 ], [ 146.23333740234375, -2.201041936874333 ] ] ], [ [ [ 148.2005615234375, -2.204998970031738 ], [ 148.208328247070312, -2.21389007568348 ], [ 148.202499389648551, -2.222500085830632 ], [ 148.191390991210938, -2.211389064788818 ], [ 148.2005615234375, -2.204998970031738 ] ] ], [ [ [ 146.588470458984375, -2.206101894378605 ], [ 146.588165283203239, -2.207159042358342 ], [ 146.58648681640625, -2.206346035003662 ], [ 146.58648681640625, -2.206011056900024 ], [ 146.588470458984375, -2.206101894378605 ] ] ], [ [ [ 146.733337402343864, -2.210277080535889 ], [ 146.731674194335938, -2.212223052978516 ], [ 146.726669311523438, -2.209444999694767 ], [ 146.731948852539176, -2.207500934600773 ], [ 146.733337402343864, -2.210277080535889 ] ] ], [ [ [ 146.275833129882812, -2.208333015441895 ], [ 146.284439086914062, -2.211945056915283 ], [ 146.290283203125, -2.218055963516235 ], [ 146.270278930664062, -2.210555076599121 ], [ 146.275833129882812, -2.208333015441895 ] ] ], [ [ [ 147.234939575195426, -2.216041088104191 ], [ 147.2388916015625, -2.223056077957096 ], [ 147.224716186523438, -2.222500085830632 ], [ 147.229446411132812, -2.218055963516235 ], [ 147.234939575195426, -2.216041088104191 ] ] ], [ [ [ 147.217498779296875, -2.231667041778564 ], [ 147.214721679687614, -2.223887920379582 ], [ 147.224441528320426, -2.217777967453003 ], [ 147.217773437500114, -2.227778911590519 ], [ 147.217498779296875, -2.231667041778564 ] ] ], [ [ [ 146.980743408203125, -2.222743988037053 ], [ 146.980819702148438, -2.227406978607178 ], [ 146.98858642578125, -2.229495048522892 ], [ 146.981033325195426, -2.229703903198242 ], [ 146.978118896484375, -2.226640939712468 ], [ 146.980743408203125, -2.222743988037053 ] ] ], [ [ [ 147.798339843750114, -2.237498998641968 ], [ 147.796951293945312, -2.236944913864136 ], [ 147.794998168945312, -2.231667041778564 ], [ 147.798248291015625, -2.235630035400334 ], [ 147.798339843750114, -2.237498998641968 ] ] ], [ [ [ 147.737228393554688, -2.346667051315308 ], [ 147.704345703125114, -2.370276927947941 ], [ 147.726394653320312, -2.319998979568481 ], [ 147.736175537109489, -2.331880092620793 ], [ 147.782501220703239, -2.314445018768311 ], [ 147.787216186523438, -2.271389961242619 ], [ 147.811111450195426, -2.249166011810303 ], [ 147.801391601562614, -2.238054990768433 ], [ 147.878616333007812, -2.293055057525635 ], [ 147.869461059570312, -2.309807062149048 ], [ 147.847778320312614, -2.310278892517033 ], [ 147.858062744140739, -2.328612089157048 ], [ 147.849090576171989, -2.330564975738469 ], [ 147.83111572265625, -2.346389055251962 ], [ 147.737228393554688, -2.346667051315308 ] ] ], [ [ [ 146.574798583984489, -2.249098062515259 ], [ 146.577499389648551, -2.251110076904297 ], [ 146.578338623046875, -2.259444952011108 ], [ 146.573333740234375, -2.256944894790649 ], [ 146.574798583984489, -2.249098062515259 ] ] ], [ [ [ 146.829437255859489, -2.265554904937744 ], [ 146.831939697265739, -2.267498970031681 ], [ 146.830551147461051, -2.271389961242619 ], [ 146.824447631836051, -2.268054962158146 ], [ 146.829437255859489, -2.265554904937744 ] ] ], [ [ [ 147.557357788085938, -2.269375085830688 ], [ 147.55389404296875, -2.278609991073608 ], [ 147.544174194335938, -2.277777910232544 ], [ 147.551391601562614, -2.267498970031681 ], [ 147.557357788085938, -2.269375085830688 ] ] ], [ [ [ 146.798614501953125, -2.271111965179387 ], [ 146.799240112304688, -2.273890018463135 ], [ 146.79638671875, -2.273888111114388 ], [ 146.796112060546875, -2.27222204208374 ], [ 146.798614501953125, -2.271111965179387 ] ] ], [ [ [ 147.553039550781477, -2.280736923217773 ], [ 147.551803588867188, -2.28129506111145 ], [ 147.550750732422102, -2.280875921249333 ], [ 147.552627563476562, -2.279344081878605 ], [ 147.553039550781477, -2.280736923217773 ] ] ], [ [ [ 147.857437133789062, -2.281524896621647 ], [ 147.855422973632926, -2.282080888748112 ], [ 147.855010986328239, -2.280968904495239 ], [ 147.8568115234375, -2.280133008956852 ], [ 147.857437133789062, -2.281524896621647 ] ] ], [ [ [ 147.545761108398438, -2.281737089157104 ], [ 147.548049926757812, -2.282222986221257 ], [ 147.548049926757812, -2.282778978347665 ], [ 147.545837402343864, -2.284167051315251 ], [ 147.545761108398438, -2.281737089157104 ] ] ], [ [ [ 147.550598144531364, -2.297916889190617 ], [ 147.549804687500114, -2.298125982284489 ], [ 147.548065185546875, -2.296525955200082 ], [ 147.55035400390625, -2.297221899032593 ], [ 147.550598144531364, -2.297916889190617 ] ] ], [ [ [ 147.553604125976562, -2.301111936569214 ], [ 147.551940917968864, -2.299165964126587 ], [ 147.553054809570426, -2.297499895095825 ], [ 147.554855346679688, -2.298887968063354 ], [ 147.553604125976562, -2.301111936569214 ] ] ], [ [ [ 147.537261962890739, -2.312340974807739 ], [ 147.535598754882812, -2.30976390838623 ], [ 147.53961181640625, -2.309207916259766 ], [ 147.538772583007926, -2.311644077301025 ], [ 147.537261962890739, -2.312340974807739 ] ] ], [ [ [ 146.86083984375, -2.311944961547795 ], [ 146.863616943359375, -2.313889026641846 ], [ 146.8619384765625, -2.31583309173584 ], [ 146.859451293945312, -2.313611030578613 ], [ 146.86083984375, -2.311944961547795 ] ] ], [ [ [ 146.861801147460938, -2.336041927337646 ], [ 146.864715576171989, -2.33611011505127 ], [ 146.865280151367301, -2.337223052978516 ], [ 146.861114501953239, -2.337501049041748 ], [ 146.859939575195426, -2.333542108535767 ], [ 146.861801147460938, -2.336041927337646 ] ] ], [ [ [ 146.869445800781477, -2.339720964431763 ], [ 146.871383666992301, -2.34249901771534 ], [ 146.868331909179801, -2.347223997116032 ], [ 146.866668701171875, -2.343888998031616 ], [ 146.869445800781477, -2.339720964431763 ] ] ], [ [ [ 147.839508056640625, -2.343560934066716 ], [ 147.838638305664176, -2.343590974807739 ], [ 147.839218139648438, -2.341036081314087 ], [ 147.840072631835938, -2.341551065444946 ], [ 147.839508056640625, -2.343560934066716 ] ] ], [ [ [ 147.377426147461051, -2.372987031936646 ], [ 147.4215087890625, -2.383104085922241 ], [ 147.333190917968864, -2.407181024551392 ], [ 147.304443359375, -2.442779064178467 ], [ 147.317535400390739, -2.401335000991821 ], [ 147.288864135742188, -2.386131048202458 ], [ 147.309844970703125, -2.354249954223633 ], [ 147.333389282226562, -2.377151012420541 ], [ 147.33990478515625, -2.365575075149479 ], [ 147.360046386718864, -2.375159025192204 ], [ 147.359649658203239, -2.341298103332463 ], [ 147.378067016601562, -2.342271089553833 ], [ 147.377426147461051, -2.372987031936646 ] ] ], [ [ [ 147.467071533203239, -2.379534959793091 ], [ 147.461395263671875, -2.384824991226196 ], [ 147.430923461914062, -2.366168022155648 ], [ 147.45556640625, -2.345285892486572 ], [ 147.480224609375114, -2.351830005645752 ], [ 147.467071533203239, -2.379534959793091 ] ] ], [ [ [ 146.828887939453239, -2.364722967147827 ], [ 146.829727172851562, -2.37388896942133 ], [ 146.817779541015739, -2.378334045410156 ], [ 146.816665649414176, -2.376389980316162 ], [ 146.828887939453239, -2.364722967147827 ] ] ], [ [ [ 147.697219848632812, -2.37611198425293 ], [ 147.696670532226676, -2.373332977294865 ], [ 147.699996948242188, -2.370832920074349 ], [ 147.700836181640625, -2.373332977294865 ], [ 147.697219848632812, -2.37611198425293 ] ] ], [ [ [ 146.837295532226562, -2.377917051315251 ], [ 146.835830688476562, -2.377222061157227 ], [ 146.835830688476562, -2.37611198425293 ], [ 146.83778381347679, -2.376667976379395 ], [ 146.837295532226562, -2.377917051315251 ] ] ], [ [ [ 147.474029541015625, -2.381117105484009 ], [ 147.503387451171875, -2.404057979583683 ], [ 147.483169555664062, -2.423549890518132 ], [ 147.462661743164176, -2.391388893127385 ], [ 147.474029541015625, -2.381117105484009 ] ] ], [ [ [ 146.839172363281364, -2.381665945053101 ], [ 146.838333129882812, -2.379722118377572 ], [ 146.839447021484375, -2.378887891769409 ], [ 146.839935302734489, -2.379513978958073 ], [ 146.839172363281364, -2.381665945053101 ] ] ], [ [ [ 146.82611083984375, -2.381665945053101 ], [ 146.832504272461051, -2.385555982589722 ], [ 146.829727172851562, -2.39166688919056 ], [ 146.822494506835938, -2.387222051620483 ], [ 146.82611083984375, -2.381665945053101 ] ] ], [ [ [ 146.842498779296875, -2.388609886169434 ], [ 146.842224121093864, -2.386110067367497 ], [ 146.843826293945312, -2.385416984558049 ], [ 146.84388732910179, -2.38805699348444 ], [ 146.842498779296875, -2.388609886169434 ] ] ], [ [ [ 147.46405029296875, -2.398657083511353 ], [ 147.458999633789062, -2.402208089828434 ], [ 147.455261230468864, -2.40012001991272 ], [ 147.463363647460938, -2.396910905837956 ], [ 147.46405029296875, -2.398657083511353 ] ] ], [ [ [ 147.09027099609375, -2.43055605888361 ], [ 147.09027099609375, -2.434165954589787 ], [ 147.083892822265739, -2.432221889495736 ], [ 147.086944580078239, -2.430624008178711 ], [ 147.09027099609375, -2.43055605888361 ] ] ], [ [ [ 147.108261108398551, -2.435026884078979 ], [ 147.107315063476676, -2.434864997863713 ], [ 147.10786437988304, -2.432985067367554 ], [ 147.10870361328125, -2.43333196640009 ], [ 147.108261108398551, -2.435026884078979 ] ] ], [ [ [ 147.398330688476562, -2.452498912811279 ], [ 147.400283813476676, -2.454998970031681 ], [ 147.395278930664062, -2.456943035125676 ], [ 147.39472961425804, -2.454166889190674 ], [ 147.398330688476562, -2.452498912811279 ] ] ], [ [ [ 147.414443969726676, -2.456667900085392 ], [ 147.412216186523438, -2.456943035125676 ], [ 147.413055419921989, -2.454444885253906 ], [ 147.413894653320312, -2.455276966094857 ], [ 147.414443969726676, -2.456667900085392 ] ] ], [ [ [ 147.307785034179801, -2.45638990402216 ], [ 147.310272216796989, -2.458333969116154 ], [ 147.308609008789062, -2.46083402633667 ], [ 147.305557250976562, -2.458889961242619 ], [ 147.307785034179801, -2.45638990402216 ] ] ], [ [ [ 147.3397216796875, -2.498043060302734 ], [ 147.337493896484375, -2.494165897369385 ], [ 147.341384887695426, -2.492222070693913 ], [ 147.3427734375, -2.49472188949585 ], [ 147.3397216796875, -2.498043060302734 ] ] ], [ [ [ 147.331558227539062, -2.508435964584351 ], [ 147.327270507812614, -2.505791902542001 ], [ 147.333084106445312, -2.501823902130127 ], [ 147.334472656250114, -2.505165100097656 ], [ 147.331558227539062, -2.508435964584351 ] ] ], [ [ [ 147.267547607421989, -2.51173210144043 ], [ 147.277511596679688, -2.542484045028687 ], [ 147.302291870117301, -2.54192590713501 ], [ 147.286239624023551, -2.576314926147404 ], [ 147.262969970703239, -2.571304082870483 ], [ 147.265335083007812, -2.551964998245239 ], [ 147.23736572265625, -2.53651309013361 ], [ 147.267547607421989, -2.51173210144043 ] ] ], [ [ [ 147.305252075195312, -2.535933971404916 ], [ 147.303375244140739, -2.535865068435612 ], [ 147.306976318359375, -2.532453060150033 ], [ 147.307327270507812, -2.534679889678955 ], [ 147.305252075195312, -2.535933971404916 ] ] ], [ [ [ 147.295379638671989, -2.536148071289062 ], [ 147.295440673828125, -2.538444995880127 ], [ 147.29302978515625, -2.53587007522583 ], [ 147.29510498046875, -2.535660028457642 ], [ 147.295379638671989, -2.536148071289062 ] ] ], [ [ [ 147.347671508789176, -2.730638027191162 ], [ 147.349075317382812, -2.730671882629395 ], [ 147.349334716797102, -2.731477022171021 ], [ 147.3465576171875, -2.730916023254395 ], [ 147.347671508789176, -2.730638027191162 ] ] ], [ [ [ 146.236114501953125, -2.840833902358952 ], [ 146.238128662109489, -2.841665983200073 ], [ 146.235137939453239, -2.842916965484619 ], [ 146.234451293945312, -2.841387987136841 ], [ 146.236114501953125, -2.840833902358952 ] ] ], [ [ [ 146.23388671875, -2.848889112472477 ], [ 146.232498168945312, -2.851388931274414 ], [ 146.228057861328239, -2.84833288192749 ], [ 146.233062744140625, -2.846388101577759 ], [ 146.23388671875, -2.848889112472477 ] ] ], [ [ [ 146.457504272461051, -2.867500066757202 ], [ 146.45916748046875, -2.868334054946899 ], [ 146.466949462890625, -2.87388801574707 ], [ 146.456939697265739, -2.871665954589844 ], [ 146.457504272461051, -2.867500066757202 ] ] ], [ [ [ 147.0574951171875, -2.903888940811157 ], [ 147.056671142578125, -2.893333911895752 ], [ 147.06056213378929, -2.885833024978638 ], [ 147.062225341796875, -2.891665935516357 ], [ 147.0574951171875, -2.903888940811157 ] ] ], [ [ [ 146.402770996093864, -2.894999980926514 ], [ 146.405273437500114, -2.897222042083683 ], [ 146.403335571289176, -2.899722099304142 ], [ 146.400558471679688, -2.896666049957219 ], [ 146.402770996093864, -2.894999980926514 ] ] ], [ [ [ 146.357070922851562, -2.932179927825928 ], [ 146.359359741210938, -2.924243927001953 ], [ 146.362258911132812, -2.921946048736515 ], [ 146.357910156250114, -2.929743051528931 ], [ 146.357070922851562, -2.932179927825928 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-MBA", "NAME_1": "Milne Bay" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 153.51690673828125, -11.615481376647949 ], [ 153.508621215820312, -11.619959831237793 ], [ 153.506759643555029, -11.619292259216309 ], [ 153.515090942382926, -11.608474731445312 ], [ 153.51690673828125, -11.615481376647949 ] ] ], [ [ [ 153.571807861328125, -11.479016304016056 ], [ 153.57012939453125, -11.478189468383732 ], [ 153.570190429687727, -11.476605415344238 ], [ 153.572433471679915, -11.477639198303223 ], [ 153.571807861328125, -11.479016304016056 ] ] ], [ [ [ 153.165420532226676, -11.464864730834847 ], [ 153.162246704101562, -11.462795257568303 ], [ 153.161849975586051, -11.46163272857666 ], [ 153.168380737304801, -11.46356296539301 ], [ 153.165420532226676, -11.464864730834847 ] ] ], [ [ [ 154.39778137207054, -11.450555801391488 ], [ 154.39472961425804, -11.448612213134766 ], [ 154.397216796875227, -11.445278167724609 ], [ 154.399719238281364, -11.448056221008187 ], [ 154.39778137207054, -11.450555801391488 ] ] ], [ [ [ 153.230438232421875, -11.454758644104004 ], [ 153.228424072265739, -11.450098037719727 ], [ 153.238754272461051, -11.444993019103947 ], [ 153.238449096679688, -11.452369689941406 ], [ 153.230438232421875, -11.454758644104004 ] ] ], [ [ [ 154.285232543945426, -11.390815734863281 ], [ 154.283767700195312, -11.389302253723088 ], [ 154.284881591797102, -11.386754035949707 ], [ 154.286834716796989, -11.387578964233342 ], [ 154.285232543945426, -11.390815734863281 ] ] ], [ [ [ 153.336303710937727, -11.359085083007812 ], [ 153.3353271484375, -11.357193946838379 ], [ 153.336578369140625, -11.35493278503418 ], [ 153.339797973633267, -11.357372283935547 ], [ 153.336303710937727, -11.359085083007812 ] ] ], [ [ [ 153.203887939453125, -11.323422431945801 ], [ 153.263900756836051, -11.366751670837289 ], [ 153.289794921875227, -11.363666534423828 ], [ 153.496109008789062, -11.464443206787109 ], [ 153.692962646484375, -11.513125419616642 ], [ 153.708908081054801, -11.544005393981877 ], [ 153.746673583984489, -11.561665534973145 ], [ 153.775390625000114, -11.613405227661133 ], [ 153.763671875000114, -11.626899719238281 ], [ 153.724716186523551, -11.617778778076115 ], [ 153.698043823242301, -11.632749557495117 ], [ 153.673202514648892, -11.620876312255859 ], [ 153.670242309570312, -11.640362739562988 ], [ 153.634719848632926, -11.61805534362793 ], [ 153.586669921875114, -11.617263793945312 ], [ 153.550933837890852, -11.655380249023438 ], [ 153.526382446289176, -11.635556221008301 ], [ 153.556198120117188, -11.633316040039006 ], [ 153.555587768555029, -11.601767539978027 ], [ 153.532028198242415, -11.617211341857853 ], [ 153.505264282226562, -11.586693763732853 ], [ 153.450592041015852, -11.58806324005127 ], [ 153.471343994140852, -11.577095985412598 ], [ 153.456390380859489, -11.548890113830566 ], [ 153.439620971680029, -11.566054344177189 ], [ 153.411529541015739, -11.542951583862248 ], [ 153.415969848633154, -11.569561004638672 ], [ 153.358078002929915, -11.558357238769474 ], [ 153.34780883789108, -11.52137565612793 ], [ 153.359680175781364, -11.493135452270508 ], [ 153.306549072265852, -11.487515449523869 ], [ 153.268035888671989, -11.50407695770258 ], [ 153.300155639648438, -11.473365783691349 ], [ 153.263702392578239, -11.461607933044377 ], [ 153.245056152343864, -11.42835807800293 ], [ 153.224411010742301, -11.44100379943842 ], [ 153.205154418945426, -11.413942337036133 ], [ 153.214828491211051, -11.400161743164062 ], [ 153.185714721679688, -11.392017364501896 ], [ 153.1756591796875, -11.34536075592041 ], [ 153.203887939453125, -11.323422431945801 ] ] ], [ [ [ 153.116195678711165, -11.324403762817383 ], [ 153.114166259765739, -11.322786331176758 ], [ 153.116210937500114, -11.318444252014103 ], [ 153.119674682617415, -11.322150230407715 ], [ 153.116195678711165, -11.324403762817383 ] ] ], [ [ [ 153.406387329101562, -11.312432289123478 ], [ 153.441360473632812, -11.314120292663574 ], [ 153.480895996093864, -11.344844818115121 ], [ 153.416152954101676, -11.332935333251953 ], [ 153.406387329101562, -11.312432289123478 ] ] ], [ [ [ 152.30140686035179, -11.305086135864201 ], [ 152.299346923828239, -11.302654266357365 ], [ 152.30230712890625, -11.301813125610352 ], [ 152.303207397461051, -11.303462982177734 ], [ 152.30140686035179, -11.305086135864201 ] ] ], [ [ [ 154.031112670898438, -11.301667213439828 ], [ 154.027496337890625, -11.308055877685547 ], [ 154.008331298828239, -11.303333282470646 ], [ 154.011672973632812, -11.301944732666016 ], [ 154.031112670898438, -11.301667213439828 ] ] ], [ [ [ 153.257446289062614, -11.293543815612793 ], [ 153.244827270507926, -11.321766853332463 ], [ 153.233612060546989, -11.316219329833928 ], [ 153.247772216796875, -11.307626724243164 ], [ 153.242584228515739, -11.292795181274357 ], [ 153.257446289062614, -11.293543815612793 ] ] ], [ [ [ 154.211395263672102, -11.293332099914494 ], [ 154.262496948242188, -11.327501296997013 ], [ 154.28334045410179, -11.372221946716309 ], [ 154.285003662109375, -11.37944507598877 ], [ 154.283050537109716, -11.382223129272461 ], [ 154.284164428711051, -11.393888473510685 ], [ 154.250839233398438, -11.418334007263127 ], [ 154.149673461914176, -11.388504981994629 ], [ 154.150558471679915, -11.404444694519043 ], [ 154.129714965820312, -11.415555953979379 ], [ 154.112228393554801, -11.387778282165527 ], [ 154.103881835937955, -11.419721603393498 ], [ 154.050552368164062, -11.420277595519963 ], [ 154.016113281250227, -11.40916728973383 ], [ 153.996948242187841, -11.379166603088322 ], [ 153.9727783203125, -11.377498626708984 ], [ 153.979171752929688, -11.361944198608342 ], [ 154.009445190429915, -11.361390113830566 ], [ 154.011947631836392, -11.3397216796875 ], [ 154.042343139648779, -11.364945411682129 ], [ 154.047500610351562, -11.353055000305119 ], [ 154.122390747070426, -11.348893165588379 ], [ 154.06361389160179, -11.325277328491211 ], [ 154.08416748046875, -11.319723129272461 ], [ 154.057220458984716, -11.296667098999023 ], [ 154.114715576171989, -11.295832633972168 ], [ 154.123657226562727, -11.307975769042969 ], [ 154.135833740234375, -11.297779083251953 ], [ 154.128936767578466, -11.32658672332758 ], [ 154.150558471679915, -11.298054695129395 ], [ 154.211395263672102, -11.293332099914494 ] ] ], [ [ [ 152.371719360351562, -11.281917572021484 ], [ 152.370254516601676, -11.278404235839844 ], [ 152.378204345703125, -11.275468826293945 ], [ 152.3758544921875, -11.27993106842041 ], [ 152.371719360351562, -11.281917572021484 ] ] ], [ [ [ 152.355468750000114, -11.286123275756779 ], [ 152.353561401367301, -11.2815647125243 ], [ 152.358978271484602, -11.274042129516602 ], [ 152.360488891601562, -11.282597541809082 ], [ 152.355468750000114, -11.286123275756779 ] ] ], [ [ [ 152.38954162597679, -11.276680946349984 ], [ 152.381576538085938, -11.277310371398869 ], [ 152.381210327148551, -11.276213645935002 ], [ 152.392074584961051, -11.273681640624943 ], [ 152.38954162597679, -11.276680946349984 ] ] ], [ [ [ 152.139785766601562, -11.262415885925236 ], [ 152.134552001953239, -11.253896713256779 ], [ 152.137832641601676, -11.247124671936035 ], [ 152.140228271484489, -11.252057075500431 ], [ 152.139785766601562, -11.262415885925236 ] ] ], [ [ [ 153.100219726562727, -11.246892929077148 ], [ 153.105682373046875, -11.263183593749943 ], [ 153.09754943847679, -11.269082069396973 ], [ 153.0902099609375, -11.247257232665959 ], [ 153.100219726562727, -11.246892929077148 ] ] ], [ [ [ 153.100982666015852, -11.242345809936467 ], [ 153.10041809082054, -11.242345809936467 ], [ 153.098602294921875, -11.24041843414301 ], [ 153.101196289062614, -11.240107536315804 ], [ 153.100982666015852, -11.242345809936467 ] ] ], [ [ [ 152.176910400390625, -11.244659423828125 ], [ 152.174224853515739, -11.240923881530762 ], [ 152.174667358398779, -11.238726615905762 ], [ 152.17718505859375, -11.240617752075138 ], [ 152.176910400390625, -11.244659423828125 ] ] ], [ [ [ 153.107238769531477, -11.233877182006779 ], [ 153.105636596679801, -11.233395576477051 ], [ 153.105422973632926, -11.23236083984375 ], [ 153.107666015625227, -11.231947898864746 ], [ 153.107238769531477, -11.233877182006779 ] ] ], [ [ [ 153.094360351562614, -11.2127809524535 ], [ 153.089065551757812, -11.212388992309513 ], [ 153.09278869628929, -11.207466125488281 ], [ 153.095443725586165, -11.209506034851074 ], [ 153.094360351562614, -11.2127809524535 ] ] ], [ [ [ 152.027999877929688, -11.194232940673771 ], [ 152.027236938476562, -11.187260627746582 ], [ 152.030792236328239, -11.184272766113281 ], [ 152.033020019531477, -11.188847541808968 ], [ 152.027999877929688, -11.194232940673771 ] ] ], [ [ [ 152.017929077148438, -11.185661315917912 ], [ 152.011978149414062, -11.186302185058594 ], [ 152.011901855469205, -11.185118675231934 ], [ 152.01454162597679, -11.182561874389592 ], [ 152.017929077148438, -11.185661315917912 ] ] ], [ [ [ 151.997650146484489, -11.184823036193791 ], [ 151.99542236328125, -11.184426307678166 ], [ 151.99282836914108, -11.181384086608887 ], [ 151.99720764160179, -11.182584762573242 ], [ 151.997650146484489, -11.184823036193791 ] ] ], [ [ [ 153.097930908203352, -11.183327674865723 ], [ 153.115371704101904, -11.180298805236816 ], [ 153.241867065429688, -11.262625694274902 ], [ 153.188095092773438, -11.29368782043457 ], [ 153.16729736328125, -11.275593757629338 ], [ 153.185821533203352, -11.274263381958008 ], [ 153.167587280273438, -11.25283241271967 ], [ 153.13356018066429, -11.24848556518549 ], [ 153.116790771484489, -11.224056243896484 ], [ 153.103637695312727, -11.224120140075684 ], [ 153.106231689453125, -11.227713584899902 ], [ 153.10052490234375, -11.238697052001839 ], [ 153.102203369140739, -11.20953464508051 ], [ 153.0762939453125, -11.196754455566406 ], [ 153.097930908203352, -11.183327674865723 ] ] ], [ [ [ 151.343551635742415, -11.178819656372013 ], [ 151.34236145019554, -11.178334236144963 ], [ 151.344665527343864, -11.177374839782715 ], [ 151.3446044921875, -11.177854537963867 ], [ 151.343551635742415, -11.178819656372013 ] ] ], [ [ [ 153.08795166015625, -11.179651260375977 ], [ 153.086456298828239, -11.179018020629826 ], [ 153.084930419921989, -11.176289558410645 ], [ 153.089874267578352, -11.17839336395258 ], [ 153.08795166015625, -11.179651260375977 ] ] ], [ [ [ 151.95753479003929, -11.176881790161133 ], [ 151.95648193359375, -11.175960540771484 ], [ 151.957153320312727, -11.174347877502328 ], [ 151.958496093750455, -11.175285339355469 ], [ 151.95753479003929, -11.176881790161133 ] ] ], [ [ [ 151.816665649414062, -11.175833702087402 ], [ 151.816116333007812, -11.174167633056641 ], [ 151.817504882812614, -11.174167633056641 ], [ 151.818328857421875, -11.175000190734806 ], [ 151.816665649414062, -11.175833702087402 ] ] ], [ [ [ 152.950378417968864, -11.174949645996094 ], [ 152.952056884765625, -11.176125526428166 ], [ 152.949295043945312, -11.17693901062006 ], [ 152.949035644531364, -11.173984527587891 ], [ 152.950378417968864, -11.174949645996094 ] ] ], [ [ [ 151.974136352539517, -11.174698829650822 ], [ 151.97271728515625, -11.174429893493652 ], [ 151.97146606445358, -11.173337936401367 ], [ 151.974609375, -11.172109603881836 ], [ 151.974136352539517, -11.174698829650822 ] ] ], [ [ [ 152.970336914062727, -11.170845031738281 ], [ 152.969543457031364, -11.17523193359375 ], [ 152.963546752930029, -11.171751976013184 ], [ 152.966979980469091, -11.169511795043832 ], [ 152.970336914062727, -11.170845031738281 ] ] ], [ [ [ 152.945755004882926, -11.166730880737248 ], [ 152.950180053711051, -11.171998023986816 ], [ 152.930938720703125, -11.177534103393555 ], [ 152.937667846679915, -11.166921615600529 ], [ 152.945755004882926, -11.166730880737248 ] ] ], [ [ [ 152.918930053710938, -11.159298896789551 ], [ 152.927810668945767, -11.16389274597168 ], [ 152.923385620117301, -11.183581352233887 ], [ 152.902587890625114, -11.162406921386605 ], [ 152.918930053710938, -11.159298896789551 ] ] ], [ [ [ 152.89111328125, -11.159723281860352 ], [ 152.889617919921989, -11.158920288085938 ], [ 152.89166259765625, -11.157221794128361 ], [ 152.892227172851562, -11.158887863159123 ], [ 152.89111328125, -11.159723281860352 ] ] ], [ [ [ 152.901535034179801, -11.15955638885498 ], [ 152.898986816406477, -11.154461860656738 ], [ 152.902587890625114, -11.149806022644043 ], [ 152.903747558593977, -11.152422904968262 ], [ 152.901535034179801, -11.15955638885498 ] ] ], [ [ [ 153.020553588867301, -11.148612022399846 ], [ 153.044998168945312, -11.152777671813965 ], [ 153.023895263671989, -11.19194507598877 ], [ 153.03472900390625, -11.208332061767578 ], [ 152.969161987304801, -11.186944961547795 ], [ 152.99249267578125, -11.173055648803711 ], [ 152.995559692382926, -11.15110969543457 ], [ 153.020553588867301, -11.148612022399846 ] ] ], [ [ [ 152.790191650390625, -11.155496597290039 ], [ 152.773788452148438, -11.161986351013127 ], [ 152.768356323242642, -11.153643608093262 ], [ 152.787643432617188, -11.148552894592285 ], [ 152.790191650390625, -11.155496597290039 ] ] ], [ [ [ 152.692092895507812, -11.151041030883789 ], [ 152.691024780273438, -11.14951229095459 ], [ 152.69195556640625, -11.14723968505848 ], [ 152.692703247070654, -11.149612426757756 ], [ 152.692092895507812, -11.151041030883789 ] ] ], [ [ [ 152.82612609863304, -11.157267570495605 ], [ 152.820877075195654, -11.155904769897461 ], [ 152.83099365234375, -11.147067070007324 ], [ 152.831039428710938, -11.154582977294808 ], [ 152.82612609863304, -11.157267570495605 ] ] ], [ [ [ 153.078048706054915, -11.144998550414925 ], [ 153.090560913086051, -11.166666984558049 ], [ 153.051391601562727, -11.16833305358881 ], [ 153.051666259765966, -11.1522216796875 ], [ 153.078048706054915, -11.144998550414925 ] ] ], [ [ [ 151.256576538086165, -11.155081748962402 ], [ 151.253387451171989, -11.151568412780705 ], [ 151.256759643554915, -11.144887924194279 ], [ 151.259201049804915, -11.15173435211176 ], [ 151.256576538086165, -11.155081748962402 ] ] ], [ [ [ 152.869461059570426, -11.151424407958928 ], [ 152.875274658203125, -11.162152290344238 ], [ 152.868347167968864, -11.166685104370117 ], [ 152.860351562500114, -11.15449047088623 ], [ 152.869461059570426, -11.151424407958928 ] ] ], [ [ [ 152.789489746093864, -11.148160934448242 ], [ 152.78887939453125, -11.147862434387207 ], [ 152.791748046875, -11.141939163207951 ], [ 152.792999267578239, -11.143681526184082 ], [ 152.789489746093864, -11.148160934448242 ] ] ], [ [ [ 152.762908935546875, -11.142567634582463 ], [ 152.761749267578466, -11.141426086425668 ], [ 152.764968872070426, -11.140873908996468 ], [ 152.764602661132926, -11.141590118408146 ], [ 152.762908935546875, -11.142567634582463 ] ] ], [ [ [ 152.814056396484375, -11.145668983459473 ], [ 152.812744140625227, -11.145694732665959 ], [ 152.813140869140739, -11.139934539794922 ], [ 152.81549072265625, -11.144372940063477 ], [ 152.814056396484375, -11.145668983459473 ] ] ], [ [ [ 152.767913818359602, -11.140028953552189 ], [ 152.766204833984602, -11.138861656188965 ], [ 152.7681884765625, -11.13636589050293 ], [ 152.769638061523665, -11.138136863708439 ], [ 152.767913818359602, -11.140028953552189 ] ] ], [ [ [ 152.796279907226562, -11.143986701965275 ], [ 152.800338745117415, -11.135224342346135 ], [ 152.802291870117415, -11.134695053100529 ], [ 152.80134582519554, -11.142088890075684 ], [ 152.796279907226562, -11.143986701965275 ] ] ], [ [ [ 152.811203002929688, -11.132175445556527 ], [ 152.814239501953125, -11.136634826660099 ], [ 152.807434082031477, -11.137908935546875 ], [ 152.808685302734375, -11.132612228393555 ], [ 152.811203002929688, -11.132175445556527 ] ] ], [ [ [ 152.714096069335938, -11.138748168945256 ], [ 152.712707519531364, -11.137016296386662 ], [ 152.720779418945312, -11.131008148193303 ], [ 152.721893310546875, -11.134129524230957 ], [ 152.714096069335938, -11.138748168945256 ] ] ], [ [ [ 152.333160400390739, -11.132728576660099 ], [ 152.349349975586051, -11.135975837707463 ], [ 152.335144042968977, -11.139225959777775 ], [ 152.316970825195312, -11.127407073974496 ], [ 152.333160400390739, -11.132728576660099 ] ] ], [ [ [ 152.659866333007926, -11.140691757202092 ], [ 152.65289306640625, -11.134061813354492 ], [ 152.660171508789176, -11.122602462768555 ], [ 152.66421508789108, -11.128999710083008 ], [ 152.659866333007926, -11.140691757202092 ] ] ], [ [ [ 153.08534240722679, -11.122133255004883 ], [ 153.089538574218977, -11.123579978942871 ], [ 153.09010314941429, -11.124337196350098 ], [ 153.084014892578352, -11.121856689453068 ], [ 153.08534240722679, -11.122133255004883 ] ] ], [ [ [ 152.689636230468864, -11.11841964721674 ], [ 152.710754394531705, -11.13349437713623 ], [ 152.678756713867301, -11.150411605834904 ], [ 152.66761779785179, -11.137790679931584 ], [ 152.689636230468864, -11.11841964721674 ] ] ], [ [ [ 152.760742187500114, -11.126341819763184 ], [ 152.758163452148438, -11.12073802947998 ], [ 152.76374816894554, -11.117196083068791 ], [ 152.764099121093977, -11.117586135864258 ], [ 152.760742187500114, -11.126341819763184 ] ] ], [ [ [ 152.306671142578125, -11.123619079589844 ], [ 152.299209594726676, -11.123128890991154 ], [ 152.300460815429915, -11.117118835449219 ], [ 152.306594848632926, -11.120114326477051 ], [ 152.306671142578125, -11.123619079589844 ] ] ], [ [ [ 152.73699951171875, -11.121784210205078 ], [ 152.740234375, -11.132485389709359 ], [ 152.726409912109489, -11.137751579284611 ], [ 152.728164672851676, -11.114706993103027 ], [ 152.73699951171875, -11.121784210205078 ] ] ], [ [ [ 153.066970825195312, -11.108921051025391 ], [ 153.103271484375227, -11.120329856872559 ], [ 153.123992919921875, -11.14162635803217 ], [ 153.101135253906477, -11.123450279235783 ], [ 153.066970825195312, -11.108921051025391 ] ] ], [ [ [ 151.551818847656477, -11.108975410461426 ], [ 151.549743652343977, -11.108040809631291 ], [ 151.54879760742233, -11.104813575744572 ], [ 151.549987792968864, -11.104997634887695 ], [ 151.551818847656477, -11.108975410461426 ] ] ], [ [ [ 152.635955810547102, -11.111003875732308 ], [ 152.634902954101676, -11.10976409912098 ], [ 152.6400146484375, -11.104523658752385 ], [ 152.639053344726676, -11.108296394348145 ], [ 152.635955810547102, -11.111003875732308 ] ] ], [ [ [ 153.061203002930029, -11.104800224304199 ], [ 153.064208984375, -11.105487823486328 ], [ 153.0650634765625, -11.106864929199162 ], [ 153.058410644531477, -11.104867935180664 ], [ 153.061203002930029, -11.104800224304199 ] ] ], [ [ [ 152.497772216797216, -11.103335380554142 ], [ 152.505828857421875, -11.109167098999023 ], [ 152.507171630859375, -11.111943244934025 ], [ 152.493896484375114, -11.108888626098633 ], [ 152.497772216797216, -11.103335380554142 ] ] ], [ [ [ 152.607498168945312, -11.09666633605957 ], [ 152.609588623046875, -11.098213195800724 ], [ 152.606353759765625, -11.104190826416016 ], [ 152.603729248047102, -11.101359367370605 ], [ 152.607498168945312, -11.09666633605957 ] ] ], [ [ [ 151.13240051269554, -11.101332664489689 ], [ 151.12953186035179, -11.099334716796818 ], [ 151.133880615234375, -11.095384597778263 ], [ 151.135131835937614, -11.098570823669377 ], [ 151.13240051269554, -11.101332664489689 ] ] ], [ [ [ 151.148330688476562, -11.091389656066895 ], [ 151.146942138671875, -11.090555191040039 ], [ 151.147506713867301, -11.088889122009277 ], [ 151.148895263672216, -11.089999198913461 ], [ 151.148330688476562, -11.091389656066895 ] ] ], [ [ [ 152.313766479492188, -11.081418037414551 ], [ 152.313964843750227, -11.083211898803711 ], [ 152.311386108398438, -11.083279609680176 ], [ 152.311584472656364, -11.082521438598576 ], [ 152.313766479492188, -11.081418037414551 ] ] ], [ [ [ 152.542892456054915, -11.079569816589299 ], [ 152.53791809082054, -11.085189819335938 ], [ 152.532516479492188, -11.080642700195256 ], [ 152.533798217773551, -11.078838348388615 ], [ 152.542892456054915, -11.079569816589299 ] ] ], [ [ [ 152.355560302734489, -11.079002380371094 ], [ 152.358337402343864, -11.080833435058537 ], [ 152.352264404296875, -11.077898979187012 ], [ 152.353744506836051, -11.078106880187931 ], [ 152.355560302734489, -11.079002380371094 ] ] ], [ [ [ 152.562973022461051, -11.071619987487793 ], [ 152.58648681640625, -11.076393127441406 ], [ 152.59393310546875, -11.096032142639103 ], [ 152.563446044922102, -11.100720405578556 ], [ 152.547760009765625, -11.075252532958984 ], [ 152.562973022461051, -11.071619987487793 ] ] ], [ [ [ 151.541305541992415, -11.073799133300724 ], [ 151.540832519531364, -11.064998626708928 ], [ 151.53901672363304, -11.061341285705453 ], [ 151.542266845703239, -11.065647125244141 ], [ 151.541305541992415, -11.073799133300724 ] ] ], [ [ [ 152.53326416015625, -11.061375617980957 ], [ 152.538604736328125, -11.068333625793457 ], [ 152.533920288086165, -11.071903228759652 ], [ 152.528640747070426, -11.062574386596623 ], [ 152.53326416015625, -11.061375617980957 ] ] ], [ [ [ 152.5872802734375, -11.067964553833008 ], [ 152.58332824707054, -11.060555458068791 ], [ 152.584167480468864, -11.059445381164551 ], [ 152.586685180664062, -11.061875343322697 ], [ 152.5872802734375, -11.067964553833008 ] ] ], [ [ [ 151.532318115234375, -11.064202308654671 ], [ 151.530593872070312, -11.062620162963867 ], [ 151.531188964843977, -11.058502197265625 ], [ 151.534332275390625, -11.062815666198617 ], [ 151.532318115234375, -11.064202308654671 ] ] ], [ [ [ 152.51666259765625, -11.053056716918888 ], [ 152.514450073242301, -11.052779197692814 ], [ 152.515594482421989, -11.050244331359806 ], [ 152.517410278320426, -11.051898956298828 ], [ 152.51666259765625, -11.053056716918888 ] ] ], [ [ [ 152.49664306640625, -11.047778129577637 ], [ 152.499038696289517, -11.048514366149789 ], [ 152.4998779296875, -11.050462722778263 ], [ 152.495086669921989, -11.049216270446777 ], [ 152.49664306640625, -11.047778129577637 ] ] ], [ [ [ 152.452606201171875, -11.050754547119141 ], [ 152.447402954101676, -11.057464599609318 ], [ 152.434341430664176, -11.051135063171387 ], [ 152.459243774414404, -11.043445587158146 ], [ 152.452606201171875, -11.050754547119141 ] ] ], [ [ [ 152.403060913086051, -11.039164543151742 ], [ 152.405838012695654, -11.040834426879826 ], [ 152.401382446289517, -11.044721603393555 ], [ 152.401107788085938, -11.040555953979435 ], [ 152.403060913086051, -11.039164543151742 ] ] ], [ [ [ 152.490707397461051, -11.042763710021973 ], [ 152.491943359375114, -11.049145698547363 ], [ 152.47975158691429, -11.040452957153263 ], [ 152.481719970703239, -11.03866004943842 ], [ 152.490707397461051, -11.042763710021973 ] ] ], [ [ [ 152.559494018554915, -11.037996292114144 ], [ 152.560760498046875, -11.038265228271484 ], [ 152.560836791992642, -11.039443969726506 ], [ 152.558334350586165, -11.039509773254395 ], [ 152.559494018554915, -11.037996292114144 ] ] ], [ [ [ 152.383895874023551, -11.036667823791504 ], [ 152.384719848632812, -11.039164543151742 ], [ 152.381942749023551, -11.041943550109806 ], [ 152.381103515625227, -11.039164543151742 ], [ 152.383895874023551, -11.036667823791504 ] ] ], [ [ [ 152.516326904296875, -11.048215866088867 ], [ 152.508895874023665, -11.038612365722599 ], [ 152.511077880859375, -11.035482406616154 ], [ 152.517868041992415, -11.044021606445256 ], [ 152.516326904296875, -11.048215866088867 ] ] ], [ [ [ 152.545562744140852, -11.035277366638184 ], [ 152.544723510742188, -11.033611297607422 ], [ 152.546386718750114, -11.031389236450138 ], [ 152.546951293945426, -11.033332824707031 ], [ 152.545562744140852, -11.035277366638184 ] ] ], [ [ [ 151.319168090820426, -11.029998779296818 ], [ 151.316116333007926, -11.028332710266056 ], [ 151.317504882812841, -11.02500057220459 ], [ 151.32000732421875, -11.026389122009164 ], [ 151.319168090820426, -11.029998779296818 ] ] ], [ [ [ 152.79086303710983, -10.97815990447998 ], [ 152.789535522461051, -10.977084159850961 ], [ 152.79176330566429, -10.975627899169922 ], [ 152.79241943359375, -10.977051734924316 ], [ 152.79086303710983, -10.97815990447998 ] ] ], [ [ [ 151.083328247070312, -10.965556144714355 ], [ 151.082077026367301, -10.96507453918457 ], [ 151.081115722656705, -10.963890075683594 ], [ 151.083343505859602, -10.964160919189453 ], [ 151.083328247070312, -10.965556144714355 ] ] ], [ [ [ 152.700271606445426, -10.963334083557129 ], [ 152.701385498047102, -10.964165687561035 ], [ 152.70083618164108, -10.965277671813965 ], [ 152.698883056640739, -10.964165687561035 ], [ 152.700271606445426, -10.963334083557129 ] ] ], [ [ [ 152.6219482421875, -10.956942558288517 ], [ 152.624725341797102, -10.958889961242619 ], [ 152.621383666992188, -10.961943626403809 ], [ 152.6199951171875, -10.959721565246582 ], [ 152.6219482421875, -10.956942558288517 ] ] ], [ [ [ 152.716796875000227, -10.958929061889592 ], [ 152.716033935547102, -10.959550857543945 ], [ 152.715560913086051, -10.956667900085392 ], [ 152.71630859375, -10.957356452941838 ], [ 152.716796875000227, -10.958929061889592 ] ] ], [ [ [ 151.07557678222679, -10.954492568969727 ], [ 151.08753967285179, -10.957182884216309 ], [ 151.044998168945312, -10.961943626403809 ], [ 151.049438476562727, -10.958612442016602 ], [ 151.07557678222679, -10.954492568969727 ] ] ], [ [ [ 151.03582763671875, -10.952220916748047 ], [ 151.036666870117415, -10.954167366027832 ], [ 151.033615112304915, -10.954723358154297 ], [ 151.03285217285179, -10.952781677246037 ], [ 151.03582763671875, -10.952220916748047 ] ] ], [ [ [ 152.743087768554688, -10.954324722289982 ], [ 152.738143920898438, -10.956874847412053 ], [ 152.735687255859602, -10.955534934997559 ], [ 152.740524291992301, -10.950879096984806 ], [ 152.743087768554688, -10.954324722289982 ] ] ], [ [ [ 152.697494506835938, -10.954167366027832 ], [ 152.695831298828239, -10.953055381774902 ], [ 152.696945190429688, -10.950554847717285 ], [ 152.698333740234602, -10.951389312744141 ], [ 152.697494506835938, -10.954167366027832 ] ] ], [ [ [ 152.717987060547102, -10.946331977844238 ], [ 152.717010498046989, -10.944193840026855 ], [ 152.717926025390625, -10.943296432495004 ], [ 152.718856811523438, -10.94423866271967 ], [ 152.717987060547102, -10.946331977844238 ] ] ], [ [ [ 152.712783813476562, -10.943610191345101 ], [ 152.713333129882812, -10.945000648498535 ], [ 152.710052490234489, -10.9434814453125 ], [ 152.711380004882926, -10.942931175231877 ], [ 152.712783813476562, -10.943610191345101 ] ] ], [ [ [ 152.709197998047102, -10.942475318908635 ], [ 152.705490112304688, -10.946040153503418 ], [ 152.704330444336051, -10.945281028747559 ], [ 152.706039428711051, -10.941681861877441 ], [ 152.709197998047102, -10.942475318908635 ] ] ], [ [ [ 151.015670776367415, -10.942960739135742 ], [ 151.014480590820312, -10.941371917724609 ], [ 151.015258789062727, -10.93964672088623 ], [ 151.016372680664062, -10.942338943481388 ], [ 151.015670776367415, -10.942960739135742 ] ] ], [ [ [ 152.667495727539176, -10.924166679382324 ], [ 152.666381835937841, -10.922779083251953 ], [ 152.66888427734375, -10.921944618225098 ], [ 152.668655395507926, -10.923374176025391 ], [ 152.667495727539176, -10.924166679382324 ] ] ], [ [ [ 152.596817016601562, -10.922582626342717 ], [ 152.596038818359375, -10.922500610351562 ], [ 152.594772338867415, -10.920470237731934 ], [ 152.597229003906364, -10.921667098999023 ], [ 152.596817016601562, -10.922582626342717 ] ] ], [ [ [ 152.679992675781477, -10.91805362701416 ], [ 152.684234619140852, -10.919941902160645 ], [ 152.684585571289176, -10.922218322753906 ], [ 152.678894042968977, -10.920276641845703 ], [ 152.679992675781477, -10.91805362701416 ] ] ], [ [ [ 150.78890991210983, -10.922151565551758 ], [ 150.785324096679801, -10.92043399810791 ], [ 150.785171508789062, -10.917672157287598 ], [ 150.788146972656705, -10.91679859161377 ], [ 150.78890991210983, -10.922151565551758 ] ] ], [ [ [ 150.783065795898779, -10.912610054016113 ], [ 150.781463623047102, -10.9119615554809 ], [ 150.781173706054688, -10.910168647766056 ], [ 150.782623291015739, -10.910004615783691 ], [ 150.783065795898779, -10.912610054016113 ] ] ], [ [ [ 150.75794982910179, -10.905501365661621 ], [ 150.75666809082054, -10.904422760009709 ], [ 150.75811767578125, -10.902338027954102 ], [ 150.760162353515739, -10.904017448425236 ], [ 150.75794982910179, -10.905501365661621 ] ] ], [ [ [ 150.74639892578125, -10.90346622467041 ], [ 150.742660522460938, -10.897544860839787 ], [ 150.745666503906364, -10.895910263061523 ], [ 150.74932861328125, -10.899555206298771 ], [ 150.74639892578125, -10.90346622467041 ] ] ], [ [ [ 153.109191894531477, -10.893561363220215 ], [ 153.106597900390966, -10.892730712890625 ], [ 153.105422973632926, -10.891421318054142 ], [ 153.108139038085938, -10.891835212707463 ], [ 153.109191894531477, -10.893561363220215 ] ] ], [ [ [ 153.099411010742415, -10.890042304992619 ], [ 153.092224121094205, -10.890385627746582 ], [ 153.091094970703239, -10.88452243804926 ], [ 153.097671508789062, -10.886866569518929 ], [ 153.099411010742415, -10.890042304992619 ] ] ], [ [ [ 153.159408569336051, -10.884590148925724 ], [ 153.159164428711165, -10.883527755737305 ], [ 153.161148071289404, -10.882450103759766 ], [ 153.161300659179688, -10.88334846496582 ], [ 153.159408569336051, -10.884590148925724 ] ] ], [ [ [ 152.576950073242188, -10.879721641540527 ], [ 152.581665039062614, -10.883609771728459 ], [ 152.580551147461279, -10.884721755981388 ], [ 152.575836181640625, -10.881668090820312 ], [ 152.576950073242188, -10.879721641540527 ] ] ], [ [ [ 150.984283447265739, -10.876912117004395 ], [ 150.98512268066429, -10.877740859985352 ], [ 150.983367919921875, -10.877809524536133 ], [ 150.983230590820426, -10.876843452453613 ], [ 150.984283447265739, -10.876912117004395 ] ] ], [ [ [ 150.978057861328352, -10.878567695617676 ], [ 150.975006103515852, -10.878334045410156 ], [ 150.976470947265966, -10.87373161315918 ], [ 150.979263305664517, -10.876423835754281 ], [ 150.978057861328352, -10.878567695617676 ] ] ], [ [ [ 153.05195617675804, -10.86240291595459 ], [ 153.050415039062614, -10.86240291595459 ], [ 153.049377441406591, -10.861021041870117 ], [ 153.05181884765625, -10.859971046447754 ], [ 153.05195617675804, -10.86240291595459 ] ] ], [ [ [ 153.028427124023438, -10.859466552734375 ], [ 153.039886474609375, -10.860432624816895 ], [ 153.04219055175804, -10.861883163452148 ], [ 153.025344848633154, -10.861399650573617 ], [ 153.022064208984375, -10.857258796691895 ], [ 153.028427124023438, -10.859466552734375 ] ] ], [ [ [ 153.048049926757812, -10.854912757873535 ], [ 153.046905517578125, -10.85456657409668 ], [ 153.0484619140625, -10.852497100830078 ], [ 153.049377441406591, -10.853361129760685 ], [ 153.048049926757812, -10.854912757873535 ] ] ], [ [ [ 152.438522338867415, -10.844000816345215 ], [ 152.437408447265852, -10.843173027038517 ], [ 152.439880371093977, -10.843351364135629 ], [ 152.439804077148438, -10.843626976013127 ], [ 152.438522338867415, -10.844000816345215 ] ] ], [ [ [ 151.873336791992188, -10.834721565246525 ], [ 151.871948242187614, -10.83416557312006 ], [ 151.87689208984375, -10.833886146545296 ], [ 151.876129150390625, -10.834715843200684 ], [ 151.873336791992188, -10.834721565246525 ] ] ], [ [ [ 152.956939697265852, -10.832500457763615 ], [ 152.976943969726562, -10.839445114135629 ], [ 153.003936767578125, -10.857331275939885 ], [ 152.95916748046875, -10.841667175292912 ], [ 152.956939697265852, -10.832500457763615 ] ] ], [ [ [ 152.54833984375, -10.829722404479924 ], [ 152.552505493164176, -10.83166599273676 ], [ 152.553054809570426, -10.832221984863224 ], [ 152.547225952148438, -10.832221984863224 ], [ 152.54833984375, -10.829722404479924 ] ] ], [ [ [ 152.545272827148438, -10.828887939453068 ], [ 152.545562744140852, -10.830834388732796 ], [ 152.543060302734489, -10.829722404479924 ], [ 152.54388427734375, -10.828887939453068 ], [ 152.545272827148438, -10.828887939453068 ] ] ], [ [ [ 152.520553588867301, -10.829443931579533 ], [ 152.5191650390625, -10.829166412353459 ], [ 152.520278930664404, -10.825834274291992 ], [ 152.521118164062614, -10.826665878295785 ], [ 152.520553588867301, -10.829443931579533 ] ] ], [ [ [ 151.840545654296875, -10.825350761413461 ], [ 151.842498779297102, -10.825834274291992 ], [ 151.843048095703352, -10.826390266418457 ], [ 151.838058471679688, -10.824999809265137 ], [ 151.840545654296875, -10.825350761413461 ] ] ], [ [ [ 152.209869384765852, -10.824248313903809 ], [ 152.208160400390852, -10.822948455810547 ], [ 152.208648681640625, -10.82177734375 ], [ 152.209869384765852, -10.823351860046273 ], [ 152.209869384765852, -10.824248313903809 ] ] ], [ [ [ 151.8304443359375, -10.821330070495549 ], [ 151.827499389648551, -10.821260452270508 ], [ 151.827041625976676, -10.820076942443848 ], [ 151.829162597656477, -10.819998741149846 ], [ 151.8304443359375, -10.821330070495549 ] ] ], [ [ [ 152.498672485351676, -10.819450378417912 ], [ 152.506332397461051, -10.821736335754395 ], [ 152.489379882812841, -10.817655563354492 ], [ 152.491058349609375, -10.817033767700082 ], [ 152.498672485351676, -10.819450378417912 ] ] ], [ [ [ 152.995346069336051, -10.818563461303711 ], [ 152.994003295898551, -10.816892623901367 ], [ 152.995269775390852, -10.815395355224609 ], [ 152.996078491211165, -10.817466735839844 ], [ 152.995346069336051, -10.818563461303711 ] ] ], [ [ [ 152.216232299804801, -10.817817687988224 ], [ 152.217437744140625, -10.815359115600586 ], [ 152.218902587890739, -10.814739227294922 ], [ 152.218612670898551, -10.816110610961914 ], [ 152.216232299804801, -10.817817687988224 ] ] ], [ [ [ 152.180847167968864, -10.812683105468693 ], [ 152.190444946289176, -10.812406539916992 ], [ 152.191650390625, -10.813081741333008 ], [ 152.175338745117415, -10.814372062683049 ], [ 152.180847167968864, -10.812683105468693 ] ] ], [ [ [ 152.239624023437727, -10.813073158264103 ], [ 152.23849487304733, -10.813348770141602 ], [ 152.234466552734602, -10.805953025817871 ], [ 152.23695373535179, -10.807438850402775 ], [ 152.239624023437727, -10.813073158264103 ] ] ], [ [ [ 152.202499389648551, -10.806112289428711 ], [ 152.194473266601676, -10.810383796691895 ], [ 152.193557739257812, -10.810315132141056 ], [ 152.196563720703125, -10.807210922241097 ], [ 152.206634521484602, -10.804869651794434 ], [ 152.202499389648551, -10.806112289428711 ] ] ], [ [ [ 152.99110412597679, -10.805000305175781 ], [ 152.994445800781591, -10.808609962463322 ], [ 152.993896484375, -10.810278892517033 ], [ 152.988891601562614, -10.806112289428711 ], [ 152.99110412597679, -10.805000305175781 ] ] ], [ [ [ 152.232635498046989, -10.805113792419377 ], [ 152.221908569336051, -10.808675765991211 ], [ 152.212142944336165, -10.806303977966309 ], [ 152.229202270507926, -10.801856994628906 ], [ 152.232635498046989, -10.805113792419377 ] ] ], [ [ [ 151.92451477050804, -10.80997276306141 ], [ 151.920166015625114, -10.809878349304142 ], [ 151.918472290039062, -10.80142879486084 ], [ 151.929931640625114, -10.807079315185547 ], [ 151.92451477050804, -10.80997276306141 ] ] ], [ [ [ 151.908493041992415, -10.800902366638127 ], [ 151.908569335937614, -10.802194595336914 ], [ 151.898117065429688, -10.799725532531681 ], [ 151.900222778320312, -10.798160552978459 ], [ 151.908493041992415, -10.800902366638127 ] ] ], [ [ [ 152.488815307617188, -10.795564651489201 ], [ 152.487701416015625, -10.79175758361805 ], [ 152.488204956054801, -10.789877891540414 ], [ 152.4896240234375, -10.793834686279297 ], [ 152.488815307617188, -10.795564651489201 ] ] ], [ [ [ 152.395492553710938, -10.793891906738224 ], [ 152.389328002929801, -10.794111251830998 ], [ 152.387008666992188, -10.791601181030273 ], [ 152.392303466796875, -10.787932395935002 ], [ 152.395492553710938, -10.793891906738224 ] ] ], [ [ [ 152.001388549804915, -10.789723396301213 ], [ 151.998886108398551, -10.785000801086426 ], [ 152.007781982421875, -10.786666870117188 ], [ 152.005004882812727, -10.789167404174748 ], [ 152.001388549804915, -10.789723396301213 ] ] ], [ [ [ 150.426330566406364, -10.78477954864502 ], [ 150.425216674804801, -10.784296989440918 ], [ 150.425354003906477, -10.783398628234863 ], [ 150.426895141602017, -10.783742904663029 ], [ 150.426330566406364, -10.78477954864502 ] ] ], [ [ [ 151.829421997070426, -10.783334732055607 ], [ 151.827911376953466, -10.782997131347599 ], [ 151.826568603515739, -10.781081199645939 ], [ 151.830276489257926, -10.782113075256348 ], [ 151.829421997070426, -10.783334732055607 ] ] ], [ [ [ 151.881576538086165, -10.783147811889592 ], [ 151.878616333007926, -10.77944374084467 ], [ 151.879165649414176, -10.778610229492131 ], [ 151.882034301757812, -10.780209541320801 ], [ 151.881576538086165, -10.783147811889592 ] ] ], [ [ [ 150.430526733398551, -10.778154373168945 ], [ 150.43185424804733, -10.778085708618107 ], [ 150.431915283203239, -10.779741287231332 ], [ 150.429824829101904, -10.778429985046273 ], [ 150.430099487304801, -10.776775360107422 ], [ 150.430526733398551, -10.778154373168945 ] ] ], [ [ [ 150.426391601562841, -10.772506713867131 ], [ 150.4288330078125, -10.775068283080941 ], [ 150.428314208984375, -10.776176452636719 ], [ 150.42512512207054, -10.776060104370117 ], [ 150.426391601562841, -10.772506713867131 ] ] ], [ [ [ 151.870285034179688, -10.773056030273438 ], [ 151.871383666992301, -10.774443626403809 ], [ 151.860382080078125, -10.769924163818359 ], [ 151.866104125976562, -10.766432762145996 ], [ 151.870285034179688, -10.773056030273438 ] ] ], [ [ [ 151.688247680664062, -10.766947746276855 ], [ 151.699142456054801, -10.765865325927621 ], [ 151.706924438476676, -10.769707679748421 ], [ 151.677230834961279, -10.765849113464355 ], [ 151.688247680664062, -10.766947746276855 ] ] ], [ [ [ 150.676391601562614, -10.764445304870605 ], [ 150.681716918945767, -10.769774436950684 ], [ 150.681289672851676, -10.771875381469727 ], [ 150.676696777343977, -10.768825531005746 ], [ 150.676391601562614, -10.764445304870605 ] ] ], [ [ [ 151.7711181640625, -10.764720916747933 ], [ 151.770004272461051, -10.76361083984375 ], [ 151.77166748046875, -10.761944770812931 ], [ 151.771942138672102, -10.764166831970215 ], [ 151.7711181640625, -10.764720916747933 ] ] ], [ [ [ 152.445724487304688, -10.757413864135685 ], [ 152.443344116211392, -10.756851196289062 ], [ 152.44313049316429, -10.756022453307992 ], [ 152.444717407226676, -10.756110191345158 ], [ 152.445724487304688, -10.757413864135685 ] ] ], [ [ [ 150.420837402343864, -10.767498970031681 ], [ 150.411788940429801, -10.767759323120117 ], [ 150.409072875976562, -10.754356384277344 ], [ 150.420486450195312, -10.760547637939453 ], [ 150.420837402343864, -10.767498970031681 ] ] ], [ [ [ 152.40283203125, -10.755214691162109 ], [ 152.415756225586279, -10.782511711120549 ], [ 152.377395629882926, -10.776201248168888 ], [ 152.395477294921989, -10.75456523895258 ], [ 152.40283203125, -10.755214691162109 ] ] ], [ [ [ 151.833221435546989, -10.750859260559082 ], [ 151.829971313476562, -10.753874778747559 ], [ 151.828109741210938, -10.752780914306584 ], [ 151.829040527343864, -10.751151084899846 ], [ 151.833221435546989, -10.750859260559082 ] ] ], [ [ [ 150.39837646484375, -10.749794960021973 ], [ 150.384246826171875, -10.761762619018555 ], [ 150.359725952148665, -10.767498970031681 ], [ 150.383529663085938, -10.751941680908089 ], [ 150.39837646484375, -10.749794960021973 ] ] ], [ [ [ 151.314865112304688, -10.747644424438477 ], [ 151.317108154296989, -10.757694244384766 ], [ 151.304534912109716, -10.746354103088379 ], [ 151.306686401367188, -10.745083808898869 ], [ 151.314865112304688, -10.747644424438477 ] ] ], [ [ [ 151.721725463867188, -10.746328353881779 ], [ 151.72149658203125, -10.735962867736816 ], [ 151.730117797851562, -10.738742828369141 ], [ 151.728927612304688, -10.741061210632324 ], [ 151.721725463867188, -10.746328353881779 ] ] ], [ [ [ 151.819442749023665, -10.732222557067871 ], [ 151.83111572265625, -10.743612289428711 ], [ 151.829162597656477, -10.747777938842717 ], [ 151.816390991211165, -10.733332633972168 ], [ 151.819442749023665, -10.732222557067871 ] ] ], [ [ [ 150.684188842773665, -10.734716415405217 ], [ 150.682632446289176, -10.734365463256836 ], [ 150.682815551757926, -10.732028961181641 ], [ 150.684005737305142, -10.732753753662053 ], [ 150.684188842773665, -10.734716415405217 ] ] ], [ [ [ 151.737945556640852, -10.734025955200138 ], [ 151.737030029297102, -10.73367881774891 ], [ 151.743606567383154, -10.726710319518986 ], [ 151.743606567383154, -10.727469444274846 ], [ 151.737945556640852, -10.734025955200138 ] ] ], [ [ [ 150.233154296875114, -10.72817325592041 ], [ 150.23231506347679, -10.72822284698475 ], [ 150.230911254882812, -10.726343154907227 ], [ 150.233795166015625, -10.725497245788517 ], [ 150.233154296875114, -10.72817325592041 ] ] ], [ [ [ 150.755096435547102, -10.726433753967285 ], [ 150.753479003906364, -10.72544002532959 ], [ 150.756790161132812, -10.725411415100098 ], [ 150.756591796875, -10.725918769836369 ], [ 150.755096435547102, -10.726433753967285 ] ] ], [ [ [ 152.414733886719205, -10.729941368103027 ], [ 152.412109375000114, -10.727516174316349 ], [ 152.41400146484375, -10.722773551940918 ], [ 152.418792724609489, -10.72594165802002 ], [ 152.414733886719205, -10.729941368103027 ] ] ], [ [ [ 151.787506103515625, -10.721112251281738 ], [ 151.789169311523551, -10.7227783203125 ], [ 151.788894653320426, -10.723609924316349 ], [ 151.785278320312727, -10.721112251281738 ], [ 151.787506103515625, -10.721112251281738 ] ] ], [ [ [ 150.302719116211165, -10.722046852111816 ], [ 150.301971435546989, -10.73103141784668 ], [ 150.28096008300804, -10.729160308837891 ], [ 150.290740966796875, -10.720615386962891 ], [ 150.302719116211165, -10.722046852111816 ] ] ], [ [ [ 151.747222900390739, -10.723008155822754 ], [ 151.74806213378929, -10.719444274902344 ], [ 151.754241943359375, -10.718135833740234 ], [ 151.753906250000341, -10.71903133392334 ], [ 151.747222900390739, -10.723008155822754 ] ] ], [ [ [ 151.777374267578125, -10.718465805053711 ], [ 151.77113342285179, -10.719120025634709 ], [ 151.768234252929688, -10.717909812927246 ], [ 151.771102905273438, -10.715446472167969 ], [ 151.777374267578125, -10.718465805053711 ] ] ], [ [ [ 150.640518188477017, -10.717739105224609 ], [ 150.636962890625341, -10.717652320861816 ], [ 150.636032104492188, -10.713013648986816 ], [ 150.639144897461051, -10.714529991149846 ], [ 150.640518188477017, -10.717739105224609 ] ] ], [ [ [ 150.632369995117301, -10.710787773132267 ], [ 150.630966186523665, -10.714269638061523 ], [ 150.628479003906477, -10.713946342468205 ], [ 150.628707885742301, -10.711419105529728 ], [ 150.632369995117301, -10.710787773132267 ] ] ], [ [ [ 151.241668701171989, -10.709453582763672 ], [ 151.251617431640852, -10.713569641113224 ], [ 151.231338500976562, -10.714802742004395 ], [ 151.238723754882926, -10.709718704223576 ], [ 151.241668701171989, -10.709453582763672 ] ] ], [ [ [ 150.437698364257812, -10.702808380126896 ], [ 150.438339233398892, -10.70472335815424 ], [ 150.434722900390739, -10.70141410827631 ], [ 150.437149047851676, -10.700512886047363 ], [ 150.437698364257812, -10.702808380126896 ] ] ], [ [ [ 150.740234375000114, -10.704062461853027 ], [ 150.73738098144554, -10.704998970031738 ], [ 150.734481811523438, -10.699920654296875 ], [ 150.736770629882812, -10.699353218078613 ], [ 150.740234375000114, -10.704062461853027 ] ] ], [ [ [ 150.258300781250114, -10.697065353393555 ], [ 150.27593994140625, -10.709808349609375 ], [ 150.251678466797216, -10.705092430114632 ], [ 150.235931396484489, -10.722842216491699 ], [ 150.258300781250114, -10.697065353393555 ] ] ], [ [ [ 150.687011718750114, -10.695957183837834 ], [ 150.685943603515625, -10.695737838745117 ], [ 150.684936523437727, -10.694092750549316 ], [ 150.687728881835938, -10.694643974304199 ], [ 150.687011718750114, -10.695957183837834 ] ] ], [ [ [ 152.874099731445312, -10.690876960754395 ], [ 152.875839233398438, -10.69111156463623 ], [ 152.87611389160179, -10.691665649414006 ], [ 152.873672485351562, -10.691843032836914 ], [ 152.874099731445312, -10.690876960754395 ] ] ], [ [ [ 152.850555419922102, -10.691665649414006 ], [ 152.848327636718864, -10.690555572509766 ], [ 152.848617553711051, -10.689722061157227 ], [ 152.850830078125, -10.69111156463623 ], [ 152.850555419922102, -10.691665649414006 ] ] ], [ [ [ 150.434570312500114, -10.687351226806584 ], [ 150.441543579101676, -10.692892074584961 ], [ 150.436309814453466, -10.699261665344238 ], [ 150.432800292968977, -10.69437313079834 ], [ 150.434570312500114, -10.687351226806584 ] ] ], [ [ [ 150.732345581054688, -10.700045585632324 ], [ 150.711746215820312, -10.710320472717285 ], [ 150.697662353515625, -10.699466705322209 ], [ 150.719665527343977, -10.686760902404785 ], [ 150.732345581054688, -10.700045585632324 ] ] ], [ [ [ 152.88592529296875, -10.685381889343262 ], [ 152.888015747070654, -10.688828468322697 ], [ 152.883163452148665, -10.691328048705998 ], [ 152.881698608398551, -10.685076713562012 ], [ 152.88592529296875, -10.685381889343262 ] ] ], [ [ [ 150.676986694336051, -10.685057640075627 ], [ 150.681289672851676, -10.687148094177189 ], [ 150.682815551757926, -10.690632820129338 ], [ 150.67449951171875, -10.68828105926508 ], [ 150.676986694336051, -10.685057640075627 ] ] ], [ [ [ 150.313522338867188, -10.675083160400391 ], [ 150.3140869140625, -10.67619514465332 ], [ 150.312423706054915, -10.676470756530705 ], [ 150.312423706054915, -10.675639152526855 ], [ 150.313522338867188, -10.675083160400391 ] ] ], [ [ [ 151.123672485351562, -10.672902107238713 ], [ 151.120040893554801, -10.670166969299316 ], [ 151.120346069336165, -10.668662071227914 ], [ 151.12397766113304, -10.670660972595158 ], [ 151.123672485351562, -10.672902107238713 ] ] ], [ [ [ 151.111267089843864, -10.678222656249886 ], [ 151.10791015625, -10.676513671875 ], [ 151.109832763671875, -10.66776180267334 ], [ 151.115646362304801, -10.670987129211369 ], [ 151.111267089843864, -10.678222656249886 ] ] ], [ [ [ 151.066116333008154, -10.676944732666016 ], [ 151.06086730957054, -10.678214073181152 ], [ 151.056396484375, -10.670000076293945 ], [ 151.060714721679801, -10.668402671813965 ], [ 151.066116333008154, -10.676944732666016 ] ] ], [ [ [ 150.67599487304733, -10.670322418212891 ], [ 150.674331665039176, -10.669216156005859 ], [ 150.673828125, -10.667351722717228 ], [ 150.67599487304733, -10.669216156005859 ], [ 150.67599487304733, -10.670322418212891 ] ] ], [ [ [ 150.895660400390852, -10.666893959045353 ], [ 150.901046752929915, -10.673615455627441 ], [ 150.877166748047102, -10.6656236648559 ], [ 150.887512207031477, -10.661439895629883 ], [ 150.895660400390852, -10.666893959045353 ] ] ], [ [ [ 152.376358032226676, -10.661925315856934 ], [ 152.413391113281477, -10.691542625427189 ], [ 152.411071777343864, -10.724182128906193 ], [ 152.38507080078125, -10.700925827026367 ], [ 152.341690063476676, -10.707945823669377 ], [ 152.353195190430029, -10.667244911193791 ], [ 152.376358032226676, -10.661925315856934 ] ] ], [ [ [ 150.467773437500114, -10.659445762634277 ], [ 150.469299316406364, -10.660916328430176 ], [ 150.469421386718977, -10.662276268005257 ], [ 150.466659545898438, -10.661390304565316 ], [ 150.467773437500114, -10.659445762634277 ] ] ], [ [ [ 150.79959106445358, -10.659974098205566 ], [ 150.800079345703125, -10.661285400390625 ], [ 150.79841613769554, -10.659075736999512 ], [ 150.799041748046875, -10.659075736999512 ], [ 150.79959106445358, -10.659974098205566 ] ] ], [ [ [ 150.924118041992415, -10.659672737121582 ], [ 150.934158325195312, -10.670987129211369 ], [ 150.934234619140852, -10.681562423706055 ], [ 150.917236328125114, -10.673735618591309 ], [ 150.924118041992415, -10.659672737121582 ] ] ], [ [ [ 151.098007202148438, -10.658291816711369 ], [ 151.100936889648665, -10.672349929809513 ], [ 151.075561523437727, -10.664999961853027 ], [ 151.079513549804688, -10.657822608947697 ], [ 151.098007202148438, -10.658291816711369 ] ] ], [ [ [ 150.797821044922102, -10.65738487243641 ], [ 150.797286987304915, -10.657902717590275 ], [ 150.796310424804801, -10.654590606689453 ], [ 150.797286987304915, -10.655006408691406 ], [ 150.797821044922102, -10.65738487243641 ] ] ], [ [ [ 150.081512451171989, -10.653022766113224 ], [ 150.082550048828125, -10.653988838195744 ], [ 150.082000732421989, -10.655092239379826 ], [ 150.080398559570654, -10.653853416442814 ], [ 150.081512451171989, -10.653022766113224 ] ] ], [ [ [ 150.675003051757926, -10.648056983947754 ], [ 150.674438476562727, -10.649997711181527 ], [ 150.671951293945426, -10.64777946472168 ], [ 150.673614501953125, -10.646665573120117 ], [ 150.675003051757926, -10.648056983947754 ] ] ], [ [ [ 151.112991333007812, -10.649613380432072 ], [ 151.107223510742415, -10.649167060852051 ], [ 151.108459472656591, -10.642581939697266 ], [ 151.114257812500114, -10.647830963134766 ], [ 151.112991333007812, -10.649613380432072 ] ] ], [ [ [ 150.7430419921875, -10.641053199767953 ], [ 150.740798950195426, -10.640294075012093 ], [ 150.740737915039062, -10.639052391052246 ], [ 150.741363525390852, -10.638913154602051 ], [ 150.7430419921875, -10.641053199767953 ] ] ], [ [ [ 150.020614624023665, -10.63329029083252 ], [ 150.019729614257926, -10.63305473327631 ], [ 150.019500732421989, -10.631134033203125 ], [ 150.021179199218977, -10.631340980529785 ], [ 150.020614624023665, -10.63329029083252 ] ] ], [ [ [ 150.571823120117415, -10.629472732543945 ], [ 150.569671630859375, -10.631076812744084 ], [ 150.566604614257812, -10.626258850097656 ], [ 150.567626953125227, -10.625907897949219 ], [ 150.571823120117415, -10.629472732543945 ] ] ], [ [ [ 150.025894165039062, -10.625199317932072 ], [ 150.025833129882926, -10.626944541931152 ], [ 150.022781372070426, -10.626944541931152 ], [ 150.023605346679688, -10.625556945800724 ], [ 150.025894165039062, -10.625199317932072 ] ] ], [ [ [ 150.70668029785179, -10.626673698425236 ], [ 150.705062866210938, -10.625571250915527 ], [ 150.705551147461165, -10.624879837036133 ], [ 150.706954956054801, -10.625019073486328 ], [ 150.70668029785179, -10.626673698425236 ] ] ], [ [ [ 150.855865478515739, -10.623416900634766 ], [ 150.857803344726676, -10.625361442565861 ], [ 150.856689453125341, -10.626749038696232 ], [ 150.854476928711051, -10.624526977539006 ], [ 150.855865478515739, -10.623416900634766 ] ] ], [ [ [ 150.910903930664062, -10.622920036315918 ], [ 150.9095458984375, -10.622191429138127 ], [ 150.911361694336392, -10.620451927185059 ], [ 150.911804199218864, -10.621777534484806 ], [ 150.910903930664062, -10.622920036315918 ] ] ], [ [ [ 150.801773071289062, -10.622093200683594 ], [ 150.800567626953125, -10.622368812561035 ], [ 150.801513671875114, -10.618687629699707 ], [ 150.803085327148551, -10.620794296264648 ], [ 150.801773071289062, -10.622093200683594 ] ] ], [ [ [ 150.0167236328125, -10.617972373962402 ], [ 150.015396118164062, -10.618523597717228 ], [ 150.015045166015852, -10.617488861083984 ], [ 150.015884399414062, -10.617108345031681 ], [ 150.0167236328125, -10.617972373962402 ] ] ], [ [ [ 151.369003295898779, -10.619179725646916 ], [ 151.366912841796875, -10.6181383132934 ], [ 151.368881225586165, -10.616506576538086 ], [ 151.370193481445312, -10.617123603820801 ], [ 151.369003295898779, -10.619179725646916 ] ] ], [ [ [ 151.281997680664176, -10.618015289306584 ], [ 151.303833007812727, -10.619194030761605 ], [ 151.305267333984489, -10.626270294189453 ], [ 151.272277832031364, -10.620981216430664 ], [ 151.281997680664176, -10.618015289306584 ] ] ], [ [ [ 150.793807983398665, -10.619510650634766 ], [ 150.792633056640625, -10.618200302124023 ], [ 150.793960571289062, -10.616130828857365 ], [ 150.795074462890739, -10.618751525878906 ], [ 150.793807983398665, -10.619510650634766 ] ] ], [ [ [ 150.626113891601562, -10.616109848022461 ], [ 150.65625, -10.63227367401123 ], [ 150.672241210937614, -10.665988922119084 ], [ 150.634643554687614, -10.641925811767578 ], [ 150.626113891601562, -10.616109848022461 ] ] ], [ [ [ 150.020599365234602, -10.613869667053166 ], [ 150.019088745117415, -10.614353179931641 ], [ 150.018753051757812, -10.613799095153752 ], [ 150.019439697265739, -10.613249778747502 ], [ 150.020599365234602, -10.613869667053166 ] ] ], [ [ [ 150.893692016601904, -10.614143371582031 ], [ 150.893066406250114, -10.613315582275391 ], [ 150.894943237304915, -10.612900733947697 ], [ 150.895156860351676, -10.613452911376896 ], [ 150.893692016601904, -10.614143371582031 ] ] ], [ [ [ 150.62428283691429, -10.614242553710938 ], [ 150.62257385253929, -10.612709999084416 ], [ 150.62249755859375, -10.61139011383051 ], [ 150.625061035156477, -10.612216949462834 ], [ 150.62428283691429, -10.614242553710938 ] ] ], [ [ [ 150.0198974609375, -10.610015869140568 ], [ 150.019165039062614, -10.611577033996525 ], [ 150.017227172851562, -10.610834121704045 ], [ 150.017639160156364, -10.610138893127385 ], [ 150.0198974609375, -10.610015869140568 ] ] ], [ [ [ 152.792648315430029, -10.609356880187931 ], [ 152.878875732421875, -10.672062873840332 ], [ 152.83770751953125, -10.694956779479924 ], [ 152.768753051757926, -10.697096824645996 ], [ 152.759780883789176, -10.718280792236214 ], [ 152.682830810546875, -10.698370933532715 ], [ 152.648178100586165, -10.673517227172852 ], [ 152.623260498046989, -10.682223320007324 ], [ 152.518112182617642, -10.624959945678597 ], [ 152.542785644531591, -10.610224723815918 ], [ 152.684158325195312, -10.658238410949707 ], [ 152.792648315430029, -10.609356880187931 ] ] ], [ [ [ 150.665466308593864, -10.611691474914551 ], [ 150.666656494140739, -10.616314888000488 ], [ 150.660156250000227, -10.611759185791016 ], [ 150.661834716796989, -10.608725547790527 ], [ 150.665466308593864, -10.611691474914551 ] ] ], [ [ [ 150.633392333984375, -10.612928390502873 ], [ 150.638229370117642, -10.613651275634709 ], [ 150.63201904296875, -10.615758895874023 ], [ 150.627120971679801, -10.608771324157601 ], [ 150.633392333984375, -10.612928390502873 ] ] ], [ [ [ 150.011703491211051, -10.608379364013615 ], [ 150.010787963867188, -10.608102798461914 ], [ 150.010787963867188, -10.607136726379395 ], [ 150.012390136718864, -10.607688903808594 ], [ 150.011703491211051, -10.608379364013615 ] ] ], [ [ [ 150.653732299804801, -10.604721069335938 ], [ 150.652893066406477, -10.605411529541016 ], [ 150.652053833007812, -10.603894233703613 ], [ 150.652969360351676, -10.603754997253418 ], [ 150.653732299804801, -10.604721069335938 ] ] ], [ [ [ 150.01008605957054, -10.603820800781193 ], [ 150.011123657226562, -10.604651451110783 ], [ 150.009445190430029, -10.605685234069767 ], [ 150.009109497070312, -10.604442596435547 ], [ 150.01008605957054, -10.603820800781193 ] ] ], [ [ [ 151.380828857422216, -10.604124069213867 ], [ 151.37940979003929, -10.608025550842228 ], [ 151.371185302734489, -10.615691184997559 ], [ 151.373443603515625, -10.604434013366699 ], [ 151.380828857422216, -10.604124069213867 ] ] ], [ [ [ 151.369445800781477, -10.603333473205566 ], [ 151.368057250976562, -10.602223396301213 ], [ 151.368057250976562, -10.601111412048283 ], [ 151.369171142578239, -10.601111412048283 ], [ 151.369445800781477, -10.603333473205566 ] ] ], [ [ [ 151.305236816406364, -10.602390289306584 ], [ 151.303771972656591, -10.601185798644963 ], [ 151.30464172363304, -10.599866867065373 ], [ 151.306304931640625, -10.601056098937988 ], [ 151.305236816406364, -10.602390289306584 ] ] ], [ [ [ 151.226943969726562, -10.598054885864201 ], [ 151.245788574219091, -10.605570793151855 ], [ 151.256469726562841, -10.61878585815424 ], [ 151.230270385742642, -10.612500190734863 ], [ 151.226943969726562, -10.598054885864201 ] ] ], [ [ [ 149.935180664062955, -10.59576225280756 ], [ 149.934280395507926, -10.59451961517334 ], [ 149.935882568359602, -10.593484878539982 ], [ 149.93629455566429, -10.594244003295842 ], [ 149.935180664062955, -10.59576225280756 ] ] ], [ [ [ 150.68450927734375, -10.59691143035883 ], [ 150.682052612304801, -10.595598220825195 ], [ 150.682403564453125, -10.591595649719238 ], [ 150.68450927734375, -10.596287727355957 ], [ 150.68450927734375, -10.59691143035883 ] ] ], [ [ [ 150.022216796875114, -10.589165687560978 ], [ 150.022781372070426, -10.59083366394043 ], [ 150.019729614257926, -10.59416675567627 ], [ 150.019729614257926, -10.590554237365723 ], [ 150.022216796875114, -10.589165687560978 ] ] ], [ [ [ 151.041671752929801, -10.587571144104004 ], [ 151.039718627929915, -10.587778091430664 ], [ 151.039718627929915, -10.586668014526367 ], [ 151.042358398437614, -10.586112022399902 ], [ 151.041671752929801, -10.587571144104004 ] ] ], [ [ [ 150.64680480957054, -10.588855743408146 ], [ 150.641052246093864, -10.58641529083252 ], [ 150.640533447265739, -10.583245277404728 ], [ 150.642059326171989, -10.58348560333252 ], [ 150.64680480957054, -10.588855743408146 ] ] ], [ [ [ 150.734222412109489, -10.583434104919434 ], [ 150.736160278320312, -10.59121036529541 ], [ 150.727279663086165, -10.595657348632812 ], [ 150.728103637695426, -10.584821701049805 ], [ 150.734222412109489, -10.583434104919434 ] ] ], [ [ [ 151.367767333984602, -10.59458065032959 ], [ 151.361694335937614, -10.584076881408691 ], [ 151.362594604492301, -10.582939147949162 ], [ 151.371765136718977, -10.58728981018055 ], [ 151.367767333984602, -10.59458065032959 ] ] ], [ [ [ 151.20375061035179, -10.588580131530762 ], [ 151.211395263671989, -10.597500801086426 ], [ 151.185760498046875, -10.584987640380859 ], [ 151.194900512695312, -10.579777717590332 ], [ 151.20375061035179, -10.588580131530762 ] ] ], [ [ [ 151.280654907226562, -10.583161354064885 ], [ 151.280639648437614, -10.579925537109375 ], [ 151.28364562988304, -10.57895565032959 ], [ 151.282928466796989, -10.581884384155273 ], [ 151.280654907226562, -10.583161354064885 ] ] ], [ [ [ 149.917221069336165, -10.578888893127441 ], [ 149.916671752929915, -10.579721450805607 ], [ 149.913558959960938, -10.579463958740234 ], [ 149.913833618164176, -10.578634262084961 ], [ 149.917221069336165, -10.578888893127441 ] ] ], [ [ [ 150.620147705078239, -10.581191062927189 ], [ 150.61343383789108, -10.585082054138184 ], [ 150.611984252929688, -10.582346916198674 ], [ 150.6165771484375, -10.578380584716797 ], [ 150.620147705078239, -10.581191062927189 ] ] ], [ [ [ 151.027496337890852, -10.58552169799799 ], [ 151.041381835937727, -10.60916805267334 ], [ 151.06939697265625, -10.594119071960449 ], [ 151.073272705078352, -10.617301940917969 ], [ 151.049179077148438, -10.619464874267521 ], [ 151.037811279297102, -10.641597747802678 ], [ 151.069122314453125, -10.648754119872933 ], [ 151.042327880859375, -10.664096832275334 ], [ 151.051239013672216, -10.672992706298828 ], [ 151.010086059570312, -10.671465873718262 ], [ 150.987899780273551, -10.633910179138184 ], [ 150.971847534179688, -10.645620346069279 ], [ 150.934906005859375, -10.632609367370549 ], [ 150.905166625976562, -10.656510353088379 ], [ 150.900558471680029, -10.626388549804688 ], [ 150.919662475585938, -10.604207992553711 ], [ 151.027496337890852, -10.58552169799799 ] ] ], [ [ [ 149.933883666992301, -10.580555915832463 ], [ 149.933929443359375, -10.582989692687988 ], [ 149.929534912109375, -10.577153205871525 ], [ 149.931945800781364, -10.576389312744141 ], [ 149.933883666992301, -10.580555915832463 ] ] ], [ [ [ 150.90333557128929, -10.585277557373047 ], [ 150.893615722656477, -10.584444046020508 ], [ 150.908615112304688, -10.574444770812988 ], [ 150.907501220703239, -10.581386566162109 ], [ 150.90333557128929, -10.585277557373047 ] ] ], [ [ [ 150.706665039062614, -10.586321830749512 ], [ 150.724960327148665, -10.588102340698242 ], [ 150.716430664062955, -10.609092712402344 ], [ 150.754302978515625, -10.605063438415527 ], [ 150.73262023925804, -10.618071556091309 ], [ 150.758331298828352, -10.623332977294922 ], [ 150.757537841796875, -10.634099006652832 ], [ 150.685836791992188, -10.612221717834416 ], [ 150.701370239257926, -10.573434829711857 ], [ 150.706665039062614, -10.586321830749512 ] ] ], [ [ [ 151.198547363281477, -10.575897216796761 ], [ 151.197036743164176, -10.574296951293888 ], [ 151.198287963867301, -10.572450637817383 ], [ 151.199874877929688, -10.57413291931141 ], [ 151.198547363281477, -10.575897216796761 ] ] ], [ [ [ 150.71583557128929, -10.571389198303223 ], [ 150.717498779296875, -10.574444770812988 ], [ 150.713882446289062, -10.57722091674799 ], [ 150.713058471679801, -10.573055267333984 ], [ 150.71583557128929, -10.571389198303223 ] ] ], [ [ [ 150.730529785156477, -10.570308685302734 ], [ 150.72822570800804, -10.574397087097168 ], [ 150.725616455078125, -10.573884010314885 ], [ 150.725631713867301, -10.571235656738281 ], [ 150.730529785156477, -10.570308685302734 ] ] ], [ [ [ 150.802032470703239, -10.567609786987248 ], [ 150.800552368164176, -10.573326110839844 ], [ 150.794464111328125, -10.569803237914982 ], [ 150.795349121093864, -10.564590454101562 ], [ 150.802032470703239, -10.567609786987248 ] ] ], [ [ [ 151.259170532226562, -10.56385612487793 ], [ 151.256454467773551, -10.561788558959961 ], [ 151.258560180664176, -10.560076713562012 ], [ 151.260223388671989, -10.561945915222054 ], [ 151.259170532226562, -10.56385612487793 ] ] ], [ [ [ 151.902496337890625, -10.5625 ], [ 151.901107788085938, -10.560277938842717 ], [ 151.903060913086279, -10.559165954589844 ], [ 151.90388488769554, -10.561112403869572 ], [ 151.902496337890625, -10.5625 ] ] ], [ [ [ 150.775283813476562, -10.566665649414062 ], [ 150.773605346679801, -10.57166671752924 ], [ 150.75381469726608, -10.580500602722168 ], [ 150.75555419921875, -10.557222366332951 ], [ 150.775283813476562, -10.566665649414062 ] ] ], [ [ [ 150.722610473632812, -10.553103446960449 ], [ 150.728713989257812, -10.562019348144531 ], [ 150.725357055664176, -10.567648887634221 ], [ 150.71504211425804, -10.562680244445801 ], [ 150.722610473632812, -10.553103446960449 ] ] ], [ [ [ 150.710678100586165, -10.552695274352914 ], [ 150.712493896484716, -10.555069923400879 ], [ 150.709350585937727, -10.558423042297363 ], [ 150.706832885742415, -10.553869247436523 ], [ 150.710678100586165, -10.552695274352914 ] ] ], [ [ [ 151.121673583984375, -10.552221298217773 ], [ 151.120285034180029, -10.552221298217773 ], [ 151.120285034180029, -10.550555229187012 ], [ 151.122222900390625, -10.55111122131342 ], [ 151.121673583984375, -10.552221298217773 ] ] ], [ [ [ 151.828598022461165, -10.550030708312988 ], [ 151.828338623046875, -10.547875404357853 ], [ 151.829940795898892, -10.546094894409066 ], [ 151.829956054687614, -10.548439979553166 ], [ 151.828598022461165, -10.550030708312988 ] ] ], [ [ [ 151.213394165039062, -10.534917831420842 ], [ 151.211456298828466, -10.534189224243164 ], [ 151.212417602539062, -10.532272338867188 ], [ 151.214263916015739, -10.53344821929926 ], [ 151.213394165039062, -10.534917831420842 ] ] ], [ [ [ 149.853332519531477, -10.533887863159066 ], [ 149.85139465332054, -10.532777786254883 ], [ 149.852783203125455, -10.531665802001953 ], [ 149.853332519531477, -10.53209400177002 ], [ 149.853332519531477, -10.533887863159066 ] ] ], [ [ [ 151.246139526367301, -10.53944015502924 ], [ 151.243499755859716, -10.532595634460449 ], [ 151.245559692382812, -10.529765129089355 ], [ 151.247207641601676, -10.534392356872559 ], [ 151.246139526367301, -10.53944015502924 ] ] ], [ [ [ 150.864501953125114, -10.529520988464242 ], [ 150.901046752929915, -10.558303833007812 ], [ 150.883331298828239, -10.571110725402832 ], [ 150.896209716796875, -10.655139923095646 ], [ 150.813888549804915, -10.639444351196232 ], [ 150.794769287109602, -10.652419090270939 ], [ 150.784896850586165, -10.624303817749023 ], [ 150.760787963867188, -10.623269081115723 ], [ 150.764160156250114, -10.603660583496094 ], [ 150.835494995117301, -10.631745338439941 ], [ 150.838150024414062, -10.639469146728459 ], [ 150.872314453125114, -10.635919570922795 ], [ 150.860702514648438, -10.614056587219181 ], [ 150.828979492187614, -10.607134819030705 ], [ 150.834167480468864, -10.595834732055664 ], [ 150.789306640625114, -10.542819976806641 ], [ 150.807189941406477, -10.532607078552246 ], [ 150.839096069335938, -10.545596122741699 ], [ 150.845947265625114, -10.565773010253849 ], [ 150.849029541015739, -10.548953056335392 ], [ 150.865524291992415, -10.563913345336857 ], [ 150.864501953125114, -10.529520988464242 ] ] ], [ [ [ 151.086746215820312, -10.530268669128361 ], [ 151.085159301757926, -10.529281616210938 ], [ 151.085205078125, -10.526554107665959 ], [ 151.088531494140852, -10.528643608093205 ], [ 151.086746215820312, -10.530268669128361 ] ] ], [ [ [ 151.269195556640739, -10.532184600830021 ], [ 151.268325805664062, -10.526943206787053 ], [ 151.269805908203239, -10.525714874267521 ], [ 151.270828247070312, -10.530555725097656 ], [ 151.269195556640739, -10.532184600830021 ] ] ], [ [ [ 149.982131958007812, -10.5191650390625 ], [ 149.981155395507926, -10.517646789550781 ], [ 149.983673095703239, -10.518198013305664 ], [ 149.983673095703239, -10.518752098083496 ], [ 149.982131958007812, -10.5191650390625 ] ] ], [ [ [ 149.822448730468977, -10.516807556152344 ], [ 149.821914672851562, -10.52291202545166 ], [ 149.820404052734489, -10.523955345153752 ], [ 149.817794799804688, -10.516608238220215 ], [ 149.822448730468977, -10.516807556152344 ] ] ], [ [ [ 149.825149536132812, -10.482430458068791 ], [ 149.823425292968864, -10.480731964111328 ], [ 149.824340820312727, -10.479682922363281 ], [ 149.825469970703239, -10.480647087097168 ], [ 149.825149536132812, -10.482430458068791 ] ] ], [ [ [ 150.659439086914176, -10.480278015136719 ], [ 150.655654907226904, -10.480861663818359 ], [ 150.655273437500341, -10.477499961853027 ], [ 150.656387329101676, -10.477222442626953 ], [ 150.659439086914176, -10.480278015136719 ] ] ], [ [ [ 149.842498779296989, -10.478334426879883 ], [ 149.86468505859375, -10.49193096160883 ], [ 149.846954345703125, -10.524920463561955 ], [ 149.841751098632812, -10.505948066711426 ], [ 149.823944091796989, -10.507349967956543 ], [ 149.827255249023438, -10.478856086730957 ], [ 149.842498779296989, -10.478334426879883 ] ] ], [ [ [ 150.11250305175804, -10.458490371704102 ], [ 150.108337402343977, -10.457777976989689 ], [ 150.110549926757812, -10.451944351196232 ], [ 150.112426757812614, -10.45366001129139 ], [ 150.11250305175804, -10.458490371704102 ] ] ], [ [ [ 150.101104736328352, -10.445834159851074 ], [ 150.099716186523438, -10.464722633361703 ], [ 150.113327026367642, -10.470832824707031 ], [ 150.08721923828125, -10.475833892822209 ], [ 150.101104736328352, -10.445834159851074 ] ] ], [ [ [ 151.221298217773665, -10.432756423950195 ], [ 151.218368530273438, -10.430234909057617 ], [ 151.219879150390625, -10.428402900695801 ], [ 151.223052978515625, -10.429713249206543 ], [ 151.221298217773665, -10.432756423950195 ] ] ], [ [ [ 151.315826416015625, -10.424669265747013 ], [ 151.31721496582054, -10.42722225189209 ], [ 151.310836791992188, -10.427778244018555 ], [ 151.311752319336051, -10.422294616699219 ], [ 151.315826416015625, -10.424669265747013 ] ] ], [ [ [ 151.440277099609489, -10.407501220703125 ], [ 151.443328857421989, -10.409723281860352 ], [ 151.442779541015625, -10.410833358764592 ], [ 151.438888549804801, -10.408611297607365 ], [ 151.440277099609489, -10.407501220703125 ] ] ], [ [ [ 151.436660766601676, -10.406389236450195 ], [ 151.431015014648438, -10.402091979980469 ], [ 151.432327270508154, -10.399929046630803 ], [ 151.438705444336051, -10.402083396911564 ], [ 151.436660766601676, -10.406389236450195 ] ] ], [ [ [ 152.101028442382926, -10.390153884887638 ], [ 152.112686157226562, -10.38979434967041 ], [ 152.12080383300804, -10.392767906188851 ], [ 152.091888427734716, -10.401068687438965 ], [ 152.101028442382926, -10.390153884887638 ] ] ], [ [ [ 151.184509277343864, -10.394095420837346 ], [ 151.181106567382926, -10.390726089477482 ], [ 151.184326171875, -10.388174057006836 ], [ 151.186355590820426, -10.390334129333496 ], [ 151.184509277343864, -10.394095420837346 ] ] ], [ [ [ 151.421356201172102, -10.399979591369629 ], [ 151.411285400390739, -10.394040107726994 ], [ 151.412322998046875, -10.38630485534668 ], [ 151.421936035156477, -10.391058921813965 ], [ 151.421356201172102, -10.399979591369629 ] ] ], [ [ [ 150.359359741211165, -10.357138633728027 ], [ 150.360473632812614, -10.358250617980957 ], [ 150.358810424804801, -10.358804702758789 ], [ 150.358245849609489, -10.357417106628418 ], [ 150.359359741211165, -10.357138633728027 ] ] ], [ [ [ 150.626403808594205, -10.3560791015625 ], [ 150.625213623046989, -10.356425285339299 ], [ 150.623535156250227, -10.355941772460881 ], [ 150.625701904296989, -10.35428524017334 ], [ 150.626403808594205, -10.3560791015625 ] ] ], [ [ [ 151.413330078125114, -10.354166984558105 ], [ 151.416671752929801, -10.358055114746037 ], [ 151.415237426757926, -10.360127449035645 ], [ 151.41146850585983, -10.356123924255314 ], [ 151.413330078125114, -10.354166984558105 ] ] ], [ [ [ 150.617446899414176, -10.354652404785156 ], [ 150.617126464844091, -10.355549812316895 ], [ 150.616088867187727, -10.354375839233342 ], [ 150.616928100586051, -10.353963851928711 ], [ 150.617446899414176, -10.354652404785156 ] ] ], [ [ [ 150.362136840820312, -10.352999687194711 ], [ 150.36212158203125, -10.355469703674316 ], [ 150.35877990722679, -10.355221748351994 ], [ 150.35877990722679, -10.354616165161133 ], [ 150.362136840820312, -10.352999687194711 ] ] ], [ [ [ 151.385498046875227, -10.355413436889648 ], [ 151.384445190429801, -10.354998588561898 ], [ 151.384994506836051, -10.351944923400879 ], [ 151.386383056640625, -10.354166984558105 ], [ 151.385498046875227, -10.355413436889648 ] ] ], [ [ [ 150.662872314453239, -10.352069854736214 ], [ 150.662918090820312, -10.350551605224609 ], [ 150.664077758789062, -10.350241661071777 ], [ 150.66413879394554, -10.351172447204533 ], [ 150.662872314453239, -10.352069854736214 ] ] ], [ [ [ 150.377975463867188, -10.34908390045166 ], [ 150.377975463867188, -10.350193977355957 ], [ 150.376861572265852, -10.350472450256234 ], [ 150.376861572265852, -10.348806381225586 ], [ 150.377975463867188, -10.34908390045166 ] ] ], [ [ [ 150.647216796875, -10.352545738220215 ], [ 150.643051147461051, -10.355833053588754 ], [ 150.640975952148438, -10.355124473571777 ], [ 150.644912719726676, -10.346784591674805 ], [ 150.647216796875, -10.352545738220215 ] ] ], [ [ [ 150.367691040039062, -10.343500137329045 ], [ 150.36964416503929, -10.345722198486328 ], [ 150.367965698242301, -10.349057197570801 ], [ 150.366027832031477, -10.348501205444336 ], [ 150.367691040039062, -10.343500137329045 ] ] ], [ [ [ 151.125000000000114, -10.342499732971191 ], [ 151.126388549805029, -10.343890190124512 ], [ 151.125549316406477, -10.345556259155273 ], [ 151.123611450195426, -10.343609809875488 ], [ 151.125000000000114, -10.342499732971191 ] ] ], [ [ [ 150.671661376953239, -10.341943740844727 ], [ 150.677719116211051, -10.344259262084904 ], [ 150.67860412597679, -10.347222328185978 ], [ 150.67274475097679, -10.345300674438477 ], [ 150.671661376953239, -10.341943740844727 ] ] ], [ [ [ 150.6484375, -10.339856147766056 ], [ 150.648712158203352, -10.342063903808594 ], [ 150.648132324218977, -10.342616081237793 ], [ 150.646789550781477, -10.340408325195256 ], [ 150.6484375, -10.339856147766056 ] ] ], [ [ [ 150.654998779297102, -10.343609809875488 ], [ 150.653335571289176, -10.340000152587891 ], [ 150.661392211914062, -10.3397216796875 ], [ 150.661117553711392, -10.340833663940373 ], [ 150.654998779297102, -10.343609809875488 ] ] ], [ [ [ 151.877456665039062, -10.331171989440918 ], [ 151.883255004882812, -10.336991310119572 ], [ 151.868667602539176, -10.341943740844727 ], [ 151.874252319336051, -10.330698013305664 ], [ 151.877456665039062, -10.331171989440918 ] ] ], [ [ [ 150.962707519531364, -10.323500633239689 ], [ 150.96087646484375, -10.321776390075627 ], [ 150.961090087890852, -10.321294784545842 ], [ 150.96241760253929, -10.321706771850586 ], [ 150.962707519531364, -10.323500633239689 ] ] ], [ [ [ 150.378585815429915, -10.320674896240178 ], [ 150.379150390625227, -10.322123527526855 ], [ 150.376449584960938, -10.321086883544922 ], [ 150.377746582031364, -10.320535659789982 ], [ 150.378585815429915, -10.320674896240178 ] ] ], [ [ [ 150.923004150390739, -10.30702018737793 ], [ 150.918991088867642, -10.306977272033635 ], [ 150.921340942382926, -10.301156044006291 ], [ 150.924545288085938, -10.304686546325684 ], [ 150.923004150390739, -10.30702018737793 ] ] ], [ [ [ 151.04829406738304, -10.310020446777344 ], [ 151.046249389648551, -10.302463531494084 ], [ 151.04876708984375, -10.300399780273438 ], [ 151.05134582519554, -10.304727554321289 ], [ 151.04829406738304, -10.310020446777344 ] ] ], [ [ [ 150.928741455078125, -10.28538703918457 ], [ 150.928344726562614, -10.280267715454045 ], [ 150.932174682617188, -10.27955245971674 ], [ 150.933303833007926, -10.28354454040516 ], [ 150.928741455078125, -10.28538703918457 ] ] ], [ [ [ 151.050399780273665, -10.291072845458984 ], [ 151.047546386719205, -10.287182807922363 ], [ 151.045944213867188, -10.27911472320551 ], [ 151.050247192382812, -10.282271385192871 ], [ 151.050399780273665, -10.291072845458984 ] ] ], [ [ [ 151.033447265625114, -10.267210960388184 ], [ 151.037506103515966, -10.284998893737679 ], [ 151.015060424804915, -10.292841911315918 ], [ 151.018569946289176, -10.309117317199707 ], [ 151.016525268555029, -10.313353538513184 ], [ 150.997558593750227, -10.272750854492188 ], [ 151.033447265625114, -10.267210960388184 ] ] ], [ [ [ 151.850830078125, -10.255210876464844 ], [ 151.849716186523665, -10.255832672119084 ], [ 151.848052978515852, -10.254999160766545 ], [ 151.850204467773551, -10.253829956054631 ], [ 151.850830078125, -10.255210876464844 ] ] ], [ [ [ 151.858886718750114, -10.262222290039006 ], [ 151.853866577148438, -10.258005142211914 ], [ 151.86334228515625, -10.249504089355469 ], [ 151.866149902343977, -10.253306388854924 ], [ 151.858886718750114, -10.262222290039006 ] ] ], [ [ [ 151.860549926757812, -10.243610382080021 ], [ 151.860412597656364, -10.242232322692871 ], [ 151.862640380859375, -10.240921020507812 ], [ 151.862228393554801, -10.242160797119141 ], [ 151.860549926757812, -10.243610382080021 ] ] ], [ [ [ 151.863937377929801, -10.238774299621525 ], [ 151.862869262695312, -10.237629890441838 ], [ 151.864440917968977, -10.234999656677189 ], [ 151.865264892578239, -10.237280845642033 ], [ 151.863937377929801, -10.238774299621525 ] ] ], [ [ [ 150.608612060547102, -10.226667404174805 ], [ 150.60444641113304, -10.240278244018555 ], [ 150.588607788086165, -10.238333702087346 ], [ 150.597503662109375, -10.229446411132812 ], [ 150.608612060547102, -10.226667404174805 ] ] ], [ [ [ 151.866378784179801, -10.227946281433049 ], [ 151.865325927734375, -10.226245880126896 ], [ 151.86726379394554, -10.221774101257211 ], [ 151.869140625, -10.224384307861328 ], [ 151.866378784179801, -10.227946281433049 ] ] ], [ [ [ 150.885086059570426, -10.225601196289006 ], [ 150.87921142578125, -10.226257324218693 ], [ 150.878784179687614, -10.222438812255803 ], [ 150.885116577148438, -10.220906257629395 ], [ 150.885086059570426, -10.225601196289006 ] ] ], [ [ [ 150.905380249023438, -10.208294868469238 ], [ 150.907714843750227, -10.209472656249943 ], [ 150.903839111328125, -10.21099758148182 ], [ 150.903213500976676, -10.209329605102482 ], [ 150.905380249023438, -10.208294868469238 ] ] ], [ [ [ 151.213363647461279, -10.209275245666504 ], [ 151.21112060546875, -10.20770263671875 ], [ 151.210815429687955, -10.205044746398926 ], [ 151.213714599609489, -10.207069396972656 ], [ 151.213363647461279, -10.209275245666504 ] ] ], [ [ [ 151.20416259765625, -10.198055267333984 ], [ 151.206939697265852, -10.200277328491154 ], [ 151.206390380859489, -10.201666831970215 ], [ 151.20222473144554, -10.199723243713379 ], [ 151.20416259765625, -10.198055267333984 ] ] ], [ [ [ 150.910461425781364, -10.019832611083984 ], [ 150.90882873535179, -10.018486022949219 ], [ 150.90882873535179, -10.017107963561955 ], [ 150.910156250000227, -10.01779842376709 ], [ 150.910461425781364, -10.019832611083984 ] ] ], [ [ [ 150.956146240234489, -10.016216278076172 ], [ 150.955245971679801, -10.016491889953556 ], [ 150.954269409179915, -10.015597343444824 ], [ 150.955169677734602, -10.015458106994629 ], [ 150.956146240234489, -10.016216278076172 ] ] ], [ [ [ 150.915039062500114, -10.015381813049316 ], [ 150.913223266601676, -10.014966964721623 ], [ 150.916015625, -10.011448860168457 ], [ 150.917495727539062, -10.012690544128418 ], [ 150.915039062500114, -10.015381813049316 ] ] ], [ [ [ 150.94166564941429, -10.00694465637207 ], [ 150.94500732421875, -10.016665458679199 ], [ 150.93556213378929, -10.019167900085449 ], [ 150.938888549804801, -10.007779121398926 ], [ 150.94166564941429, -10.00694465637207 ] ] ], [ [ [ 151.14642333984375, -9.981095314025822 ], [ 151.146438598632812, -9.982809066772461 ], [ 151.145538330078239, -9.98282337188715 ], [ 151.145538330078239, -9.98137092590332 ], [ 151.14642333984375, -9.981095314025822 ] ] ], [ [ [ 150.849014282226562, -9.954789161682072 ], [ 150.851577758789062, -9.955390930175781 ], [ 150.846237182617188, -9.959400177001953 ], [ 150.846755981445426, -9.955481529235783 ], [ 150.849014282226562, -9.954789161682072 ] ] ], [ [ [ 150.935272216797216, -9.845696449279785 ], [ 150.934722900390625, -9.84486198425293 ], [ 150.934997558593977, -9.843474388122559 ], [ 150.935836791992301, -9.843751907348633 ], [ 150.935272216797216, -9.845696449279785 ] ] ], [ [ [ 150.931961059570767, -9.835042953491211 ], [ 150.933319091796875, -9.835375785827637 ], [ 150.933319091796875, -9.835859298705998 ], [ 150.932022094726676, -9.836441040039062 ], [ 150.931961059570767, -9.835042953491211 ] ] ], [ [ [ 150.805847167968864, -9.817644119262638 ], [ 150.804870605468977, -9.817644119262638 ], [ 150.804595947265739, -9.816815376281738 ], [ 150.8057861328125, -9.816678047180119 ], [ 150.805847167968864, -9.817644119262638 ] ] ], [ [ [ 150.801528930664062, -9.815367698669434 ], [ 150.803756713867415, -9.817720413208008 ], [ 150.798614501953352, -9.820279121398926 ], [ 150.79833984375, -9.817776679992676 ], [ 150.801528930664062, -9.815367698669434 ] ] ], [ [ [ 150.803863525390625, -9.814536094665471 ], [ 150.802719116210938, -9.814328193664551 ], [ 150.80264282226608, -9.81259822845459 ], [ 150.804534912109602, -9.813013076782227 ], [ 150.803863525390625, -9.814536094665471 ] ] ], [ [ [ 149.889633178711051, -9.772000312805176 ], [ 149.890304565429915, -9.77582931518549 ], [ 149.884765625000227, -9.778111457824707 ], [ 149.886978149414176, -9.770355224609375 ], [ 149.889633178711051, -9.772000312805176 ] ] ], [ [ [ 150.889190673828239, -9.76346492767334 ], [ 150.887603759765625, -9.76170825958252 ], [ 150.888778686523438, -9.760316848754883 ], [ 150.890472412109375, -9.761659622192383 ], [ 150.889190673828239, -9.76346492767334 ] ] ], [ [ [ 150.873291015625, -9.741457939147949 ], [ 150.886581420898551, -9.762958526611271 ], [ 150.859207153320312, -9.766087532043457 ], [ 150.851165771484375, -9.741927146911621 ], [ 150.873291015625, -9.741457939147949 ] ] ], [ [ [ 150.739822387695312, -9.730889320373535 ], [ 150.738922119140852, -9.7322998046875 ], [ 150.737854003906364, -9.732007980346623 ], [ 150.739547729492301, -9.729256629943848 ], [ 150.739822387695312, -9.730889320373535 ] ] ], [ [ [ 150.898345947265739, -9.73951339721674 ], [ 150.891860961914176, -9.736015319824219 ], [ 150.894638061523551, -9.726268768310433 ], [ 150.899978637695426, -9.728815078735352 ], [ 150.898345947265739, -9.73951339721674 ] ] ], [ [ [ 150.90467834472679, -9.728833198547306 ], [ 150.903366088867301, -9.725689888000431 ], [ 150.906097412109375, -9.718132972717285 ], [ 150.910720825195312, -9.721455574035645 ], [ 150.90467834472679, -9.728833198547306 ] ] ], [ [ [ 150.759628295898438, -9.711709976196232 ], [ 150.818664550781705, -9.735564231872502 ], [ 150.846115112304915, -9.796950340270996 ], [ 150.899627685546875, -9.813596725463867 ], [ 150.991943359375, -9.916666030883732 ], [ 151.051605224609489, -9.941926002502441 ], [ 151.057296752929688, -9.962929725646973 ], [ 151.032531738281364, -9.945015907287598 ], [ 151.031845092773665, -9.986293792724609 ], [ 151.108688354492188, -10.040748596191406 ], [ 151.144989013672102, -10.034247398376408 ], [ 151.147262573242301, -9.989227294921875 ], [ 151.182785034179801, -9.93751335144043 ], [ 151.273681640625, -9.917057991027832 ], [ 151.294387817382812, -9.981977462768498 ], [ 151.267578125, -10.069696426391602 ], [ 151.237823486328125, -10.109890937805176 ], [ 151.229217529296875, -10.139814376830998 ], [ 151.240829467773779, -10.1522216796875 ], [ 151.222976684570426, -10.150107383728027 ], [ 151.229156494140625, -10.166494369506836 ], [ 151.212310791015852, -10.169466018676701 ], [ 151.22108459472679, -10.191325187683049 ], [ 151.19416809082054, -10.15361213684082 ], [ 151.155914306640625, -10.154430389404297 ], [ 151.151184082031591, -10.140447616577148 ], [ 151.113861083984602, -10.139934539794922 ], [ 151.062271118164176, -10.11309623718256 ], [ 150.956878662109375, -10.100440025329533 ], [ 150.946990966796989, -10.014899253845158 ], [ 150.97052001953125, -10.011919975280762 ], [ 150.960556030273665, -10.025522232055664 ], [ 150.972198486328352, -10.032094955444336 ], [ 150.984909057617188, -9.998377799987793 ], [ 150.946807861328352, -9.96125316619873 ], [ 150.948287963867188, -10.003738403320312 ], [ 150.91250610351608, -10.007223129272461 ], [ 150.890014648437614, -9.990571975707951 ], [ 150.874221801757926, -9.883955955505314 ], [ 150.849227905273551, -9.841447830200195 ], [ 150.795242309570426, -9.797810554504338 ], [ 150.767776489257926, -9.801945686340332 ], [ 150.786407470703352, -9.803016662597599 ], [ 150.773895263671989, -9.812221527099609 ], [ 150.759445190429688, -9.80003833770752 ], [ 150.739837646484602, -9.73437595367426 ], [ 150.759628295898438, -9.711709976196232 ] ] ], [ [ [ 150.99383544921875, -9.670831680297852 ], [ 150.995162963867529, -9.66817569732666 ], [ 150.997406005859375, -9.669403076171818 ], [ 150.996765136718864, -9.670213699340763 ], [ 150.99383544921875, -9.670831680297852 ] ] ], [ [ [ 150.81170654296875, -9.665387153625488 ], [ 150.811431884765739, -9.666492462158203 ], [ 150.809494018554915, -9.665925025939828 ], [ 150.809494018554915, -9.665370941162109 ], [ 150.81170654296875, -9.665387153625488 ] ] ], [ [ [ 150.998336791992642, -9.647603034973088 ], [ 150.998336791992642, -9.648721694946289 ], [ 150.998886108398665, -9.64982891082758 ], [ 150.996948242187727, -9.648419380187988 ], [ 150.998336791992642, -9.647603034973088 ] ] ], [ [ [ 151.00103759765625, -9.640722274780273 ], [ 151.00299072265625, -9.642242431640568 ], [ 150.998611450195312, -9.643716812133732 ], [ 150.998321533203352, -9.641242027282658 ], [ 151.00103759765625, -9.640722274780273 ] ] ], [ [ [ 150.930969238281364, -9.637921333312988 ], [ 150.930221557617415, -9.636772155761719 ], [ 150.931411743164062, -9.636062622070312 ], [ 150.931823730468864, -9.637324333190918 ], [ 150.930969238281364, -9.637921333312988 ] ] ], [ [ [ 150.930023193359602, -9.630949020385629 ], [ 150.929473876953352, -9.633175849914551 ], [ 150.926956176757926, -9.633148193359375 ], [ 150.927810668945426, -9.630965232849064 ], [ 150.930023193359602, -9.630949020385629 ] ] ], [ [ [ 150.02166748046875, -9.631388664245605 ], [ 150.019729614257926, -9.630276679992676 ], [ 150.023056030273665, -9.628610610961914 ], [ 150.023895263671875, -9.62944507598877 ], [ 150.02166748046875, -9.631388664245605 ] ] ], [ [ [ 149.838928222656591, -9.615680694580078 ], [ 149.840301513671875, -9.61594295501709 ], [ 149.840576171875455, -9.617008209228516 ], [ 149.838668823242642, -9.616786956786996 ], [ 149.838928222656591, -9.615680694580078 ] ] ], [ [ [ 149.771240234375, -9.605398178100586 ], [ 149.770019531250114, -9.603186607360783 ], [ 149.77267456054733, -9.601107597351017 ], [ 149.773010253906364, -9.603609085083008 ], [ 149.771240234375, -9.605398178100586 ] ] ], [ [ [ 149.7838134765625, -9.601254463195744 ], [ 149.781875610351676, -9.600424766540471 ], [ 149.781723022460938, -9.599455833435059 ], [ 149.782699584960938, -9.599455833435059 ], [ 149.7838134765625, -9.601254463195744 ] ] ], [ [ [ 149.77552795410179, -9.601023674011174 ], [ 149.773437500000455, -9.599547386169434 ], [ 149.773910522460938, -9.598035812377873 ], [ 149.777130126953466, -9.598842620849553 ], [ 149.77552795410179, -9.601023674011174 ] ] ], [ [ [ 149.781112670898551, -9.590277671813965 ], [ 149.795272827148438, -9.619166374206543 ], [ 149.838333129882926, -9.611667633056641 ], [ 149.830551147460938, -9.620834350585938 ], [ 149.879867553711392, -9.643044471740723 ], [ 150.01222229003929, -9.629722595214787 ], [ 150.012298583984489, -9.665233612060433 ], [ 150.057220458984602, -9.683889389038086 ], [ 150.055831909179688, -9.72389030456543 ], [ 150.012344360351562, -9.726114273071232 ], [ 149.995559692382812, -9.746943473815918 ], [ 149.952499389648551, -9.746943473815918 ], [ 149.925033569336051, -9.769989967346191 ], [ 149.892623901367415, -9.758950233459473 ], [ 149.875305175781364, -9.775803565979004 ], [ 149.769439697265739, -9.784763336181641 ], [ 149.713668823242188, -9.809018135070801 ], [ 149.715698242187614, -9.848771095275879 ], [ 149.758056640625341, -9.899162292480412 ], [ 149.809997558593977, -9.912500381469727 ], [ 149.82795715332054, -9.958764076232853 ], [ 149.86270141601608, -9.99040508270258 ], [ 149.85945129394554, -10.01722240447998 ], [ 149.89430236816429, -10.01777458190918 ], [ 149.929336547851904, -10.059962272644043 ], [ 150.00091552734375, -10.085470199584847 ], [ 150.093002319335938, -10.08620643615717 ], [ 150.12237548828125, -10.119779586791935 ], [ 150.18011474609375, -10.091977119445801 ], [ 150.204833984375114, -10.131487846374512 ], [ 150.246383666992188, -10.13416576385498 ], [ 150.294815063476562, -10.18610954284668 ], [ 150.360183715820426, -10.202178001403809 ], [ 150.425994873046989, -10.21359920501709 ], [ 150.460662841796989, -10.199616432189941 ], [ 150.51899719238304, -10.231644630432015 ], [ 150.545761108398551, -10.205608367919922 ], [ 150.586944580078125, -10.208612442016602 ], [ 150.597793579102017, -10.218320846557617 ], [ 150.567291259765739, -10.247936248779297 ], [ 150.598327636718864, -10.252221107482853 ], [ 150.612319946289062, -10.284957885742188 ], [ 150.653579711914062, -10.283462524414006 ], [ 150.703048706054915, -10.25555515289301 ], [ 150.779724121093977, -10.269444465637207 ], [ 150.837326049804915, -10.228116989135685 ], [ 150.874877929687727, -10.225442886352482 ], [ 150.760955810546875, -10.301300048828068 ], [ 150.734725952148665, -10.296943664550668 ], [ 150.718017578125114, -10.316129684448185 ], [ 150.650283813476676, -10.333333015441895 ], [ 150.632431030273438, -10.351620674133301 ], [ 150.588333129882812, -10.354957580566406 ], [ 150.410003662109375, -10.297779083251896 ], [ 150.343139648437727, -10.334395408630314 ], [ 150.34315490722679, -10.397128105163517 ], [ 150.426269531250227, -10.406169891357422 ], [ 150.595977783203125, -10.470512390136605 ], [ 150.651016235351676, -10.476724624633732 ], [ 150.693603515625114, -10.563887596130371 ], [ 150.658798217773665, -10.585308074951115 ], [ 150.648590087890739, -10.579071998596191 ], [ 150.616104125977017, -10.577776908874398 ], [ 150.554916381836051, -10.630660057067871 ], [ 150.472915649414176, -10.619669914245605 ], [ 150.466033935546989, -10.657586097717285 ], [ 150.418624877929688, -10.664162635803223 ], [ 150.427505493164176, -10.692221641540414 ], [ 150.411621093750227, -10.678358078002873 ], [ 150.362289428711051, -10.68602466583252 ], [ 150.354995727539176, -10.659721374511605 ], [ 150.324172973632812, -10.647223472595215 ], [ 150.30520629882858, -10.681070327758789 ], [ 150.288055419921989, -10.674722671508732 ], [ 150.255569458007926, -10.693015098571777 ], [ 150.241455078125114, -10.668927192687988 ], [ 150.24604797363304, -10.686260223388672 ], [ 150.202499389648438, -10.702778816223145 ], [ 150.205551147460938, -10.684445381164437 ], [ 150.183609008789062, -10.691944122314396 ], [ 150.172836303711392, -10.679012298583984 ], [ 150.198593139648551, -10.661827087402344 ], [ 150.19111633300804, -10.649444580078125 ], [ 150.138900756836051, -10.650403976440373 ], [ 150.115753173828352, -10.673899650573674 ], [ 150.103607177734489, -10.641943931579533 ], [ 150.08222961425804, -10.640000343322697 ], [ 150.080062866210938, -10.652201652526855 ], [ 150.056671142578352, -10.621945381164494 ], [ 150.039718627929801, -10.636112213134766 ], [ 150.033294677734375, -10.618828773498478 ], [ 150.01466369628929, -10.626708030700684 ], [ 150.036117553711051, -10.593963623046875 ], [ 150.019165039062614, -10.573888778686523 ], [ 150.000549316406477, -10.602505683898869 ], [ 149.9791259765625, -10.597979545593205 ], [ 149.975509643554688, -10.579837799072266 ], [ 149.960403442382926, -10.596231460571232 ], [ 149.969390869140966, -10.549868583679199 ], [ 149.952346801758267, -10.583765029907113 ], [ 149.949447631836051, -10.55805587768549 ], [ 149.930282592773551, -10.559165954589844 ], [ 149.926940917968864, -10.578332901000977 ], [ 149.905670166015739, -10.542224884033146 ], [ 149.903335571289176, -10.564722061157227 ], [ 149.881103515625, -10.573055267333984 ], [ 149.876480102539176, -10.55362510681141 ], [ 149.854171752929801, -10.552777290344238 ], [ 149.904861450195426, -10.524171829223633 ], [ 149.86457824707054, -10.526106834411621 ], [ 149.879592895507812, -10.502943992614746 ], [ 149.915542602539176, -10.521060943603402 ], [ 149.956390380859489, -10.51143836975092 ], [ 149.977432250976562, -10.52383899688715 ], [ 150.032211303711165, -10.498688697814941 ], [ 150.035552978515739, -10.513889312744084 ], [ 150.042221069336051, -10.51722335815424 ], [ 150.053222656250227, -10.473479270935059 ], [ 150.087478637695312, -10.47990894317627 ], [ 150.11447143554733, -10.47413444519043 ], [ 150.11468505859375, -10.466132164001465 ], [ 150.102874755859489, -10.464761734008789 ], [ 150.113327026367642, -10.459723472595215 ], [ 150.118835449218977, -10.449790000915471 ], [ 150.102081298828239, -10.439267158508301 ], [ 150.116622924804801, -10.422975540161019 ], [ 150.064407348632812, -10.466349601745605 ], [ 150.023056030273665, -10.464722633361703 ], [ 149.952987670898779, -10.42241096496582 ], [ 149.936096191406364, -10.441153526306152 ], [ 149.932785034179688, -10.431943893432617 ], [ 149.925827026367415, -10.433332443237248 ], [ 149.930465698242301, -10.44793701171875 ], [ 149.942413330078352, -10.44521427154541 ], [ 149.928100585937727, -10.492142677307129 ], [ 149.914306640625, -10.496242523193303 ], [ 149.871902465820426, -10.410915374755859 ], [ 149.800811767578125, -10.367812156677246 ], [ 149.750549316406705, -10.345556259155273 ], [ 149.64144897460983, -10.344300270080566 ], [ 149.66261291503929, -10.317034721374455 ], [ 149.664520263672102, -10.073233604431152 ], [ 149.653106689453125, -10.038134574890137 ], [ 149.521011352539062, -10.028834342956486 ], [ 149.385116577148551, -9.943234443664494 ], [ 149.319915771484489, -9.935934066772347 ], [ 149.324615478515852, -9.856535911560059 ], [ 149.177505493164062, -9.795333862304688 ], [ 149.134918212890739, -9.758234024047795 ], [ 149.023513793945426, -9.800736427307129 ], [ 148.966705322265625, -9.744834899902287 ], [ 148.978118896484489, -9.71253490447998 ], [ 149.005020141601676, -9.696434974670353 ], [ 149.087219238281364, -9.707134246826172 ], [ 149.441925048828352, -9.597958564758301 ], [ 149.456970214843864, -9.613333702087402 ], [ 149.47969055175804, -9.597801208496037 ], [ 149.546951293945312, -9.597776412963867 ], [ 149.616485595703125, -9.622769355773926 ], [ 149.644287109375227, -9.603155136108398 ], [ 149.692749023437727, -9.615399360656738 ], [ 149.744720458984375, -9.592499732971191 ], [ 149.771942138671875, -9.595277786254826 ], [ 149.775115966796989, -9.618110656738224 ], [ 149.781112670898551, -9.590277671813965 ] ] ], [ [ [ 149.77357482910179, -9.594234466552734 ], [ 149.770202636718864, -9.591777801513615 ], [ 149.775680541992301, -9.58994102478016 ], [ 149.774993896484375, -9.593111038208008 ], [ 149.77357482910179, -9.594234466552734 ] ] ], [ [ [ 151.004180908203125, -9.57655143737793 ], [ 151.031829833984375, -9.590825080871582 ], [ 151.022781372070312, -9.595493316650334 ], [ 151.024765014648438, -9.60095310211176 ], [ 151.024658203125455, -9.595631599426213 ], [ 151.036926269531364, -9.596529960632267 ], [ 151.019729614257812, -9.628072738647404 ], [ 151.045043945312727, -9.654148101806584 ], [ 151.025177001953352, -9.669267654418888 ], [ 151.00711059570358, -9.668852806091309 ], [ 151.022109985351562, -9.661110877990723 ], [ 151.013671875, -9.645628929138127 ], [ 151.000625610352017, -9.654191970825138 ], [ 151.006896972656477, -9.642864227294922 ], [ 151.003311157226676, -9.634154319763184 ], [ 150.952468872070312, -9.612910270690918 ], [ 150.963180541992415, -9.583267211914062 ], [ 151.004180908203125, -9.57655143737793 ] ] ], [ [ [ 152.480560302734375, -9.562221527099553 ], [ 152.489868164062727, -9.567703247070312 ], [ 152.490829467773665, -9.569722175598145 ], [ 152.47833251953125, -9.563334465026799 ], [ 152.480560302734375, -9.562221527099553 ] ] ], [ [ [ 150.47027587890625, -9.566111564636174 ], [ 150.469451904296875, -9.566944122314453 ], [ 150.46417236328125, -9.566944122314453 ], [ 150.467773437500114, -9.561389923095703 ], [ 150.47027587890625, -9.566111564636174 ] ] ], [ [ [ 152.43505859375, -9.550742149352971 ], [ 152.445587158203239, -9.549315452575627 ], [ 152.473617553711165, -9.562221527099553 ], [ 152.415283203125227, -9.568054199218636 ], [ 152.43505859375, -9.550742149352971 ] ] ], [ [ [ 150.369720458984489, -9.490556716918888 ], [ 150.376937866211051, -9.498611450195256 ], [ 150.358062744140625, -9.503054618835392 ], [ 150.356674194336165, -9.4977769851684 ], [ 150.369720458984489, -9.490556716918888 ] ] ], [ [ [ 150.989959716796989, -9.466279029846191 ], [ 150.98304748535179, -9.474041938781681 ], [ 150.97222900390625, -9.469850540161076 ], [ 150.978317260742301, -9.46653938293457 ], [ 150.989959716796989, -9.466279029846191 ] ] ], [ [ [ 150.95416259765625, -9.453333854675293 ], [ 150.966110229492301, -9.459444046020451 ], [ 150.970550537109489, -9.469166755676213 ], [ 150.956954956054801, -9.462944984436035 ], [ 150.95416259765625, -9.453333854675293 ] ] ], [ [ [ 151.940551757812727, -9.390276908874512 ], [ 151.938888549804801, -9.389445304870605 ], [ 151.938125610351676, -9.385255813598576 ], [ 151.941421508789062, -9.387352943420353 ], [ 151.940551757812727, -9.390276908874512 ] ] ], [ [ [ 152.063613891601562, -9.383056640625 ], [ 152.062637329102017, -9.381662368774414 ], [ 152.064163208008267, -9.380558967590275 ], [ 152.064880371093864, -9.381864547729492 ], [ 152.063613891601562, -9.383056640625 ] ] ], [ [ [ 151.946670532227017, -9.382500648498535 ], [ 151.945068359375, -9.380096435546875 ], [ 151.948059082031364, -9.37891960144043 ], [ 151.948715209961165, -9.379836082458439 ], [ 151.946670532227017, -9.382500648498535 ] ] ], [ [ [ 150.392776489257812, -9.380398750305176 ], [ 150.391159057617188, -9.377589225769043 ], [ 150.398910522461051, -9.375408172607365 ], [ 150.396438598632926, -9.37885570526123 ], [ 150.392776489257812, -9.380398750305176 ] ] ], [ [ [ 150.40765380859375, -9.367671966552678 ], [ 150.406005859375, -9.371833801269531 ], [ 150.40240478515625, -9.373520851135197 ], [ 150.401535034179801, -9.371005058288574 ], [ 150.40765380859375, -9.367671966552678 ] ] ], [ [ [ 150.408355712890739, -9.366827011108398 ], [ 150.40850830078125, -9.367128372192326 ], [ 150.407958984375227, -9.367294311523381 ], [ 150.407913208007812, -9.366851806640625 ], [ 150.408355712890739, -9.366827011108398 ] ] ], [ [ [ 150.408355712890739, -9.366827011108398 ], [ 150.4090576171875, -9.365179061889648 ], [ 150.413192749023438, -9.362955093383732 ], [ 150.412658691406591, -9.365511894226074 ], [ 150.408355712890739, -9.366827011108398 ] ] ], [ [ [ 152.026260375976676, -9.346529006957951 ], [ 152.024444580078239, -9.34666633605957 ], [ 152.022781372070426, -9.344443321228027 ], [ 152.024932861328239, -9.343900680541992 ], [ 152.026260375976676, -9.346529006957951 ] ] ], [ [ [ 152.49456787109375, -9.340914726257324 ], [ 152.496597290039176, -9.34105396270752 ], [ 152.496948242187614, -9.341388702392578 ], [ 152.494995117187614, -9.343055725097599 ], [ 152.49456787109375, -9.340914726257324 ] ] ], [ [ [ 150.880310058593864, -9.333539962768555 ], [ 150.884231567382926, -9.334912300109863 ], [ 150.884201049804688, -9.335463523864746 ], [ 150.880615234375114, -9.336029052734375 ], [ 150.880310058593864, -9.333539962768555 ] ] ], [ [ [ 150.689865112304915, -9.333745002746525 ], [ 150.691574096679915, -9.337139129638615 ], [ 150.686141967773551, -9.337321281433049 ], [ 150.68695068359375, -9.332815170288029 ], [ 150.689865112304915, -9.333745002746525 ] ] ], [ [ [ 150.713363647461165, -9.335345268249512 ], [ 150.71144104003929, -9.33371639251709 ], [ 150.712982177734602, -9.332039833068791 ], [ 150.714248657226562, -9.332788467407227 ], [ 150.713363647461165, -9.335345268249512 ] ] ], [ [ [ 150.487442016601562, -9.327259063720703 ], [ 150.623336791992415, -9.387777328491211 ], [ 150.63722229003929, -9.419999122619629 ], [ 150.662368774414062, -9.430809020996037 ], [ 150.737533569335938, -9.425236701965332 ], [ 150.763885498046989, -9.399722099304199 ], [ 150.7979736328125, -9.414087295532227 ], [ 150.84222412109375, -9.487500190734863 ], [ 150.89222717285179, -9.5138902664184 ], [ 150.885559082031477, -9.566944122314453 ], [ 150.864715576171875, -9.58083343505848 ], [ 150.902770996093977, -9.594721794128361 ], [ 150.905624389648665, -9.63243293762207 ], [ 150.92274475097679, -9.628890991210881 ], [ 150.93719482421875, -9.650186538696232 ], [ 150.930145263671875, -9.678268432617131 ], [ 150.910400390625227, -9.694404602050724 ], [ 150.881134033203125, -9.678653717040959 ], [ 150.844665527343864, -9.721624374389592 ], [ 150.855468750000227, -9.666799545288029 ], [ 150.843795776367301, -9.656744003295898 ], [ 150.805221557617188, -9.661463737487736 ], [ 150.803436279296875, -9.677727699279728 ], [ 150.780548095703125, -9.683333396911621 ], [ 150.748947143554688, -9.660610198974609 ], [ 150.692428588867188, -9.671945571899357 ], [ 150.635833740234375, -9.659444808959904 ], [ 150.555145263671875, -9.623397827148438 ], [ 150.460800170898551, -9.642222404479924 ], [ 150.436813354492642, -9.631380081176758 ], [ 150.438690185547102, -9.595788955688477 ], [ 150.523056030273438, -9.552779197692871 ], [ 150.511383056640852, -9.505833625793457 ], [ 150.45887756347679, -9.479319572448674 ], [ 150.426132202148892, -9.417906761169377 ], [ 150.425628662109716, -9.370401382446232 ], [ 150.487442016601562, -9.327259063720703 ] ] ], [ [ [ 152.006988525390739, -9.320899963378906 ], [ 152.004440307617415, -9.319443702697697 ], [ 152.005996704101676, -9.31793022155756 ], [ 152.006973266601562, -9.319106101989689 ], [ 152.006988525390739, -9.320899963378906 ] ] ], [ [ [ 152.52949523925804, -9.314725875854492 ], [ 152.527221679687614, -9.315277099609375 ], [ 152.526382446289404, -9.313611030578556 ], [ 152.527618408203352, -9.313332557678166 ], [ 152.52949523925804, -9.314725875854492 ] ] ], [ [ [ 150.875198364257812, -9.319960594177189 ], [ 150.871093750000227, -9.317021369934082 ], [ 150.877487182617188, -9.312815666198674 ], [ 150.881500244140625, -9.317961692810002 ], [ 150.875198364257812, -9.319960594177189 ] ] ], [ [ [ 153.644027709961051, -9.309033393859806 ], [ 153.641937255859489, -9.306388854980469 ], [ 153.646942138671989, -9.303332328796387 ], [ 153.647506713867301, -9.305555343627816 ], [ 153.644027709961051, -9.309033393859806 ] ] ], [ [ [ 153.670379638671989, -9.305349349975529 ], [ 153.669174194336165, -9.305555343627816 ], [ 153.667770385742188, -9.303332328796387 ], [ 153.670700073242415, -9.303417205810547 ], [ 153.670379638671989, -9.305349349975529 ] ] ], [ [ [ 153.673339843750227, -9.305555343627816 ], [ 153.671951293945312, -9.305555343627816 ], [ 153.671539306640739, -9.302992820739689 ], [ 153.674102783203352, -9.303068161010685 ], [ 153.673339843750227, -9.305555343627816 ] ] ], [ [ [ 153.677505493164062, -9.305555343627816 ], [ 153.675460815429915, -9.302620887756348 ], [ 153.678390502929801, -9.301734924316406 ], [ 153.678329467773665, -9.304722785949707 ], [ 153.677505493164062, -9.305555343627816 ] ] ], [ [ [ 153.665283203125, -9.301110267639103 ], [ 153.664718627929688, -9.303332328796387 ], [ 153.654449462890852, -9.303332328796387 ], [ 153.658340454101676, -9.301943778991642 ], [ 153.665283203125, -9.301110267639103 ] ] ], [ [ [ 152.833053588867301, -9.29416561126709 ], [ 152.835830688476676, -9.295833587646484 ], [ 152.831665039062727, -9.297842025756836 ], [ 152.83088684082054, -9.29552173614502 ], [ 152.833053588867301, -9.29416561126709 ] ] ], [ [ [ 151.968460083007926, -9.295385360717773 ], [ 151.975723266601676, -9.300224304199219 ], [ 151.976104736328239, -9.301943778991642 ], [ 151.964172363281364, -9.29555606842041 ], [ 151.961395263671989, -9.288889884948617 ], [ 151.968460083007926, -9.295385360717773 ] ] ], [ [ [ 150.707626342773665, -9.302153587341309 ], [ 150.712295532226676, -9.31107234954834 ], [ 150.721054077148551, -9.311106681823674 ], [ 150.712677001953239, -9.315170288085938 ], [ 150.692901611328125, -9.295931816101017 ], [ 150.705612182617301, -9.287625312805176 ], [ 150.707626342773665, -9.302153587341309 ] ] ], [ [ [ 153.684997558593977, -9.28083324432373 ], [ 153.698608398437614, -9.287220954894906 ], [ 153.690002441406364, -9.302223205566406 ], [ 153.684722900390625, -9.296666145324707 ], [ 153.684997558593977, -9.28083324432373 ] ] ], [ [ [ 150.789215087890625, -9.279390335082951 ], [ 150.801193237304688, -9.293206214904728 ], [ 150.78065490722679, -9.304338455200195 ], [ 150.779235839843864, -9.286307334899846 ], [ 150.789215087890625, -9.279390335082951 ] ] ], [ [ [ 150.896728515625114, -9.264641761779785 ], [ 150.89759826660179, -9.265441894531193 ], [ 150.898162841796989, -9.268277168273926 ], [ 150.895339965820767, -9.265482902526855 ], [ 150.896728515625114, -9.264641761779785 ] ] ], [ [ [ 151.897506713867301, -9.262221336364746 ], [ 151.927764892578352, -9.284625053405762 ], [ 151.95166015625, -9.282007217407227 ], [ 151.959854125976562, -9.292307853698674 ], [ 151.927505493164062, -9.287776947021484 ], [ 151.906387329101676, -9.27500057220459 ], [ 151.871948242187614, -9.285277366638184 ], [ 151.897506713867301, -9.262221336364746 ] ] ], [ [ [ 150.757247924805142, -9.26175594329834 ], [ 150.772750854492301, -9.287153244018555 ], [ 150.757644653320426, -9.302758216857853 ], [ 150.73397827148483, -9.276068687438965 ], [ 150.757247924805142, -9.26175594329834 ] ] ], [ [ [ 152.90834045410179, -9.258889198303166 ], [ 152.907226562500114, -9.264444351196232 ], [ 152.901382446289062, -9.263334274291992 ], [ 152.903884887695312, -9.25999927520752 ], [ 152.90834045410179, -9.258889198303166 ] ] ], [ [ [ 153.675827026367301, -9.263055801391602 ], [ 153.688613891601676, -9.274443626403809 ], [ 153.687500000000227, -9.276389122009221 ], [ 153.666946411132926, -9.261945724487248 ], [ 153.675827026367301, -9.263055801391602 ] ] ], [ [ [ 152.943603515625114, -9.254166603088379 ], [ 152.941940307617301, -9.254722595214844 ], [ 152.939727783203125, -9.251667022705078 ], [ 152.94497680664108, -9.251173973083496 ], [ 152.943603515625114, -9.254166603088379 ] ] ], [ [ [ 152.557220458984489, -9.250832557678223 ], [ 152.55543518066429, -9.252223014831543 ], [ 152.553604125976676, -9.251529693603402 ], [ 152.556289672851562, -9.249760627746582 ], [ 152.557220458984489, -9.250832557678223 ] ] ], [ [ [ 150.755096435547102, -9.254584312438965 ], [ 150.753082275390625, -9.251585006713867 ], [ 150.754669189453125, -9.249073028564453 ], [ 150.75579833984375, -9.252767562866211 ], [ 150.755096435547102, -9.254584312438965 ] ] ], [ [ [ 150.783859252929688, -9.243362426757812 ], [ 150.782333374023438, -9.240362167358398 ], [ 150.78631591796875, -9.239147186279297 ], [ 150.786819458007926, -9.240578651428166 ], [ 150.783859252929688, -9.243362426757812 ] ] ], [ [ [ 150.754638671875114, -9.240829467773381 ], [ 150.753387451171989, -9.240241050720158 ], [ 150.753280639648551, -9.238263130187931 ], [ 150.755096435547102, -9.239059448242188 ], [ 150.754638671875114, -9.240829467773381 ] ] ], [ [ [ 150.789337158203239, -9.237543106079045 ], [ 150.788360595703125, -9.236264228820744 ], [ 150.79023742675804, -9.234034538268986 ], [ 150.791564941406477, -9.236318588256722 ], [ 150.789337158203239, -9.237543106079045 ] ] ], [ [ [ 152.931671142578239, -9.235834121704045 ], [ 152.930282592773665, -9.234721183776742 ], [ 152.930831909179915, -9.233888626098633 ], [ 152.932785034179801, -9.234721183776742 ], [ 152.931671142578239, -9.235834121704045 ] ] ], [ [ [ 152.765838623046989, -9.240555763244572 ], [ 152.75750732421875, -9.245555877685547 ], [ 152.754440307617301, -9.23972225189209 ], [ 152.764114379882926, -9.23254489898676 ], [ 152.765838623046989, -9.240555763244572 ] ] ], [ [ [ 150.907226562500114, -9.230513572692814 ], [ 150.921981811523665, -9.252113342285156 ], [ 150.89617919921875, -9.26408576965332 ], [ 150.896987915039062, -9.235447883605957 ], [ 150.907226562500114, -9.230513572692814 ] ] ], [ [ [ 150.788528442383267, -9.232643127441349 ], [ 150.787139892578352, -9.232008934020996 ], [ 150.786621093750455, -9.230355262756291 ], [ 150.788513183593977, -9.230098724365234 ], [ 150.788528442383267, -9.232643127441349 ] ] ], [ [ [ 153.1129150390625, -9.218753814697266 ], [ 153.110275268554688, -9.228610992431584 ], [ 153.105560302734602, -9.230554580688477 ], [ 153.100280761718864, -9.22166633605957 ], [ 153.1129150390625, -9.218753814697266 ] ] ], [ [ [ 150.859725952148551, -9.204167366027832 ], [ 150.86518859863304, -9.209839820861816 ], [ 150.884735107421875, -9.211820602416992 ], [ 150.867568969726562, -9.225518226623421 ], [ 150.859725952148551, -9.204167366027832 ] ] ], [ [ [ 150.823638916015739, -9.215794563293457 ], [ 150.8162841796875, -9.214593887329102 ], [ 150.815460205078239, -9.2021484375 ], [ 150.819580078125114, -9.204874038696289 ], [ 150.823638916015739, -9.215794563293457 ] ] ], [ [ [ 152.438049316406364, -9.204998970031681 ], [ 152.435836791992188, -9.204998970031681 ], [ 152.435562133789176, -9.200277328491211 ], [ 152.43695068359375, -9.200833320617676 ], [ 152.438049316406364, -9.204998970031681 ] ] ], [ [ [ 150.23194885253929, -9.195832252502385 ], [ 150.336944580078125, -9.271112442016545 ], [ 150.362503051757812, -9.369998931884766 ], [ 150.386672973632812, -9.386944770812931 ], [ 150.333328247070312, -9.46277904510498 ], [ 150.365554809570312, -9.472223281860295 ], [ 150.340835571289176, -9.521110534667912 ], [ 150.30999755859375, -9.521666526794377 ], [ 150.299728393554801, -9.501944541931152 ], [ 150.246109008789062, -9.483612060546875 ], [ 150.243057250976562, -9.452500343322754 ], [ 150.19721984863304, -9.453056335449219 ], [ 150.158050537109375, -9.425833702087346 ], [ 150.125274658203125, -9.372500419616642 ], [ 150.104995727539176, -9.370555877685547 ], [ 150.095001220703352, -9.3102769851684 ], [ 150.124160766601676, -9.249444961547795 ], [ 150.195007324218864, -9.199444770812988 ], [ 150.23194885253929, -9.195832252502385 ] ] ], [ [ [ 150.204010009765625, -9.175276756286564 ], [ 150.205505371093864, -9.183328628540039 ], [ 150.194290161132812, -9.17780876159668 ], [ 150.19992065429733, -9.17370700836176 ], [ 150.204010009765625, -9.175276756286564 ] ] ], [ [ [ 152.42333984375, -9.159166336059457 ], [ 152.422225952148551, -9.158056259155273 ], [ 152.424438476562727, -9.156111717224064 ], [ 152.42500305175804, -9.157221794128418 ], [ 152.42333984375, -9.159166336059457 ] ] ], [ [ [ 152.681976318359375, -9.09945011138916 ], [ 152.682098388671989, -9.10206413269043 ], [ 152.680130004882812, -9.102825164794865 ], [ 152.679244995117301, -9.09945011138916 ], [ 152.681976318359375, -9.09945011138916 ] ] ], [ [ [ 152.423614501953125, -9.112221717834359 ], [ 152.422225952148551, -9.10805606842041 ], [ 152.424163818359375, -9.096667289733887 ], [ 152.427780151367188, -9.092223167419377 ], [ 152.423614501953125, -9.112221717834359 ] ] ], [ [ [ 151.979873657226676, -8.951555252075195 ], [ 152.000411987304801, -8.969754219055176 ], [ 151.99128723144554, -8.989350318908691 ], [ 151.956939697265852, -8.966776847839355 ], [ 151.979873657226676, -8.951555252075195 ] ] ], [ [ [ 152.456619262695312, -8.946816444396973 ], [ 152.512771606445767, -8.993612289428711 ], [ 152.615829467773551, -8.983611106872502 ], [ 152.736938476562614, -9.025278091430664 ], [ 152.793029785156591, -9.003748893737793 ], [ 152.834442138671875, -9.032831192016602 ], [ 152.835556030273551, -9.071879386901855 ], [ 152.889739990234375, -9.085618019104004 ], [ 152.918334960937614, -9.067776679992619 ], [ 152.949447631835938, -9.083332061767578 ], [ 152.94805908203125, -9.125832557678166 ], [ 152.977783203125455, -9.120833396911564 ], [ 153.023605346679801, -9.16139030456543 ], [ 152.991668701171989, -9.16250038146967 ], [ 152.995559692382926, -9.183611869812012 ], [ 152.979721069335938, -9.199723243713379 ], [ 152.947494506836051, -9.174445152282658 ], [ 152.908050537109375, -9.195279121398869 ], [ 152.966659545898665, -9.225001335144043 ], [ 152.965560913086165, -9.256111145019531 ], [ 152.936386108398665, -9.225278854370117 ], [ 152.831665039062727, -9.26249885559082 ], [ 152.80917358398483, -9.255832672119141 ], [ 152.794448852539176, -9.228055000305176 ], [ 152.783340454101562, -9.236944198608398 ], [ 152.783889770507812, -9.211668014526367 ], [ 152.757781982421875, -9.223610877990609 ], [ 152.743896484375114, -9.179443359375 ], [ 152.734161376953352, -9.173054695129338 ], [ 152.727783203125114, -9.211387634277344 ], [ 152.751937866211165, -9.223610877990609 ], [ 152.735412597656364, -9.260133743286076 ], [ 152.718338012695426, -9.226388931274357 ], [ 152.655548095703125, -9.204998970031681 ], [ 152.642379760742188, -9.182324409484863 ], [ 152.662841796875114, -9.164228439331055 ], [ 152.651947021484602, -9.18194580078125 ], [ 152.670272827148551, -9.198332786560059 ], [ 152.710006713867301, -9.175832748413029 ], [ 152.693893432617188, -9.146666526794377 ], [ 152.664993286132926, -9.138888359069824 ], [ 152.700271606445426, -9.088056564331055 ], [ 152.683059692382926, -9.08861064910883 ], [ 152.65083312988304, -9.115276336669922 ], [ 152.529159545898665, -9.036110877990666 ], [ 152.471115112304688, -9.044722557067814 ], [ 152.509719848633267, -8.994999885559025 ], [ 152.447021484375114, -8.963109970092773 ], [ 152.437774658203239, -8.980001449584961 ], [ 152.422775268554688, -8.97389030456543 ], [ 152.429443359375, -9.010832786560059 ], [ 152.424728393554688, -9.084721565246525 ], [ 152.391937255859375, -8.988888740539494 ], [ 152.456619262695312, -8.946816444396973 ] ] ], [ [ [ 151.914718627929688, -8.901389122009221 ], [ 151.925277709961165, -8.916387557983398 ], [ 151.912780761718864, -8.928056716918888 ], [ 151.901947021484375, -8.912776947021428 ], [ 151.914718627929688, -8.901389122009221 ] ] ], [ [ [ 151.133056640625114, -8.799166679382267 ], [ 151.185272216796989, -8.84194374084467 ], [ 151.197494506835938, -8.870278358459473 ], [ 151.1119384765625, -8.875276565551758 ], [ 151.17333984375, -8.852223396301213 ], [ 151.133056640625114, -8.799166679382267 ] ] ], [ [ [ 151.920562744140625, -8.795832633972111 ], [ 151.92416381835983, -8.802498817443848 ], [ 151.912506103515852, -8.807499885559025 ], [ 151.912216186523779, -8.798054695129338 ], [ 151.920562744140625, -8.795832633972111 ] ] ], [ [ [ 151.031661987304915, -8.794445037841797 ], [ 151.02999877929733, -8.79305362701416 ], [ 151.030838012695312, -8.791666030883789 ], [ 151.03277587890625, -8.79333305358881 ], [ 151.031661987304915, -8.794445037841797 ] ] ], [ [ [ 150.96221923828125, -8.740556716918945 ], [ 150.963333129882812, -8.741945266723633 ], [ 150.959716796875, -8.743611335754338 ], [ 150.95916748046875, -8.742222785949707 ], [ 150.96221923828125, -8.740556716918945 ] ] ], [ [ [ 151.004165649414062, -8.75361156463623 ], [ 151.002777099609489, -8.737778663635197 ], [ 151.0302734375, -8.713054656982365 ], [ 151.019439697265625, -8.726112365722656 ], [ 151.004165649414062, -8.75361156463623 ] ] ], [ [ [ 151.676666259765625, -8.692222595214844 ], [ 151.684432983398438, -8.701464653015137 ], [ 151.671386718750227, -8.71250057220459 ], [ 151.6663818359375, -8.705555915832463 ], [ 151.676666259765625, -8.692222595214844 ] ] ], [ [ [ 150.881668090820426, -8.636944770812988 ], [ 150.887496948242415, -8.639445304870605 ], [ 150.868331909179688, -8.637777328491154 ], [ 150.87445068359375, -8.636944770812988 ], [ 150.881668090820426, -8.636944770812988 ] ] ], [ [ [ 151.305831909179688, -8.632779121398869 ], [ 151.303894042969205, -8.63055419921875 ], [ 151.304992675781364, -8.629165649414062 ], [ 151.306915283203352, -8.630839347839299 ], [ 151.305831909179688, -8.632779121398869 ] ] ], [ [ [ 150.78694152832054, -8.61944580078125 ], [ 150.783615112304801, -8.618056297302189 ], [ 150.789443969726676, -8.615554809570312 ], [ 150.790283203125114, -8.616943359374943 ], [ 150.78694152832054, -8.61944580078125 ] ] ], [ [ [ 150.741943359375114, -8.606389045715275 ], [ 150.740554809570312, -8.605278968811035 ], [ 150.742431640625114, -8.603889465331918 ], [ 150.74311828613304, -8.604997634887695 ], [ 150.741943359375114, -8.606389045715275 ] ] ], [ [ [ 151.356109619140739, -8.593055725097656 ], [ 151.352783203125114, -8.635001182556152 ], [ 151.322494506835938, -8.649168014526367 ], [ 151.309417724609602, -8.620500564575138 ], [ 151.356109619140739, -8.593055725097656 ] ] ], [ [ [ 150.848617553711051, -8.584166526794434 ], [ 150.87110900878929, -8.598334312438851 ], [ 150.87110900878929, -8.609723091125431 ], [ 150.848892211914062, -8.590556144714355 ], [ 150.845840454101562, -8.580000877380314 ], [ 150.848617553711051, -8.584166526794434 ] ] ], [ [ [ 150.844161987304915, -8.574166297912598 ], [ 150.845840454101562, -8.575556755065918 ], [ 150.844451904296989, -8.576945304870549 ], [ 150.843048095703352, -8.575556755065918 ], [ 150.844161987304915, -8.574166297912598 ] ] ], [ [ [ 151.091949462890739, -8.566944122314453 ], [ 151.1058349609375, -8.580000877380314 ], [ 151.100006103515739, -8.606389045715275 ], [ 151.093338012695426, -8.602500915527344 ], [ 151.091949462890739, -8.566944122314453 ] ] ], [ [ [ 150.832778930664517, -8.560555458068848 ], [ 150.840270996093864, -8.569443702697754 ], [ 150.83917236328125, -8.57166576385498 ], [ 150.832504272460938, -8.568887710571289 ], [ 150.832778930664517, -8.560555458068848 ] ] ], [ [ [ 150.28277587890625, -8.565278053283635 ], [ 150.278610229492188, -8.56389045715332 ], [ 150.281951904296989, -8.558889389038029 ], [ 150.2852783203125, -8.56389045715332 ], [ 150.28277587890625, -8.565278053283635 ] ] ], [ [ [ 150.326385498046989, -8.553333282470646 ], [ 150.322784423828125, -8.553333282470646 ], [ 150.321105957031591, -8.550554275512695 ], [ 150.324447631836165, -8.549165725707951 ], [ 150.326385498046989, -8.553333282470646 ] ] ], [ [ [ 150.823883056640966, -8.536667823791447 ], [ 150.817779541015966, -8.538056373596191 ], [ 150.816665649414062, -8.535834312438908 ], [ 150.823883056640966, -8.53055477142334 ], [ 150.823883056640966, -8.536667823791447 ] ] ], [ [ [ 150.296112060546989, -8.519444465637207 ], [ 150.302215576171989, -8.521388053894043 ], [ 150.300827026367301, -8.527776718139648 ], [ 150.294998168945312, -8.52722263336176 ], [ 150.296112060546989, -8.519444465637207 ] ] ], [ [ [ 150.957229614257812, -8.47722339630127 ], [ 150.975006103515852, -8.497501373291016 ], [ 150.97138977050804, -8.557777404785156 ], [ 150.92166137695358, -8.579167366027832 ], [ 150.935363769531477, -8.540044784545898 ], [ 150.924728393554801, -8.509167671203613 ], [ 150.957229614257812, -8.47722339630127 ] ] ], [ [ [ 150.882949829101676, -8.45768928527832 ], [ 150.886672973632812, -8.465554237365723 ], [ 150.884368896484375, -8.47381591796875 ], [ 150.876937866210938, -8.45694446563715 ], [ 150.882949829101676, -8.45768928527832 ] ] ], [ [ [ 150.440277099609375, -8.421388626098576 ], [ 150.438888549804915, -8.41833305358881 ], [ 150.443603515625, -8.41250038146967 ], [ 150.443054199218977, -8.41944503784174 ], [ 150.440277099609375, -8.421388626098576 ] ] ], [ [ [ 150.451660156250227, -8.41250038146967 ], [ 150.45582580566429, -8.416945457458382 ], [ 150.453887939453125, -8.419722557067871 ], [ 150.450836181640625, -8.416389465331974 ], [ 150.451660156250227, -8.41250038146967 ] ] ], [ [ [ 150.889724731445312, -8.409999847412053 ], [ 150.893325805664062, -8.416389465331974 ], [ 150.893325805664062, -8.42722129821766 ], [ 150.886383056640739, -8.403889656066895 ], [ 150.889724731445312, -8.409999847412053 ] ] ], [ [ [ 151.114334106445312, -8.400589942932015 ], [ 151.130279541015739, -8.41472339630127 ], [ 151.127777099609375, -8.487500190734863 ], [ 151.107772827148551, -8.50555515289301 ], [ 151.151672363281477, -8.566944122314453 ], [ 151.146942138671875, -8.600831985473633 ], [ 151.120559692382926, -8.632223129272461 ], [ 151.102493286132926, -8.748332977294922 ], [ 151.126663208007926, -8.799445152282658 ], [ 151.041946411132812, -8.724720954894963 ], [ 151.096389770507926, -8.667498588562012 ], [ 151.133331298828239, -8.589999198913574 ], [ 151.108337402343977, -8.577501296997013 ], [ 151.095550537109602, -8.547499656677189 ], [ 151.018051147461279, -8.550278663635254 ], [ 150.994171142578125, -8.531389236450195 ], [ 151.034164428711165, -8.43638801574707 ], [ 151.114334106445312, -8.400589942932015 ] ] ], [ [ [ 149.926467895507926, -8.390846252441406 ], [ 149.927932739258267, -8.391054153442326 ], [ 149.9278564453125, -8.39216136932373 ], [ 149.925628662109602, -8.39112377166748 ], [ 149.926467895507926, -8.390846252441406 ] ] ], [ [ [ 150.649078369140852, -8.388735771179199 ], [ 150.649932861328466, -8.393027305603027 ], [ 150.644210815430029, -8.394827842712402 ], [ 150.644561767578239, -8.390811920165959 ], [ 150.649078369140852, -8.388735771179199 ] ] ], [ [ [ 150.195556640625, -8.386387825012207 ], [ 150.197784423828239, -8.388609886169377 ], [ 150.196945190429688, -8.390001296997013 ], [ 150.19416809082054, -8.388056755065918 ], [ 150.195556640625, -8.386387825012207 ] ] ], [ [ [ 150.663650512695426, -8.370526313781681 ], [ 150.665161132812614, -8.373230934143066 ], [ 150.66181945800804, -8.373714447021484 ], [ 150.66314697265625, -8.370737075805607 ], [ 150.663650512695426, -8.370526313781681 ] ] ], [ [ [ 150.175003051758154, -8.364444732666016 ], [ 150.177291870117529, -8.366040229797306 ], [ 150.177505493164062, -8.367499351501465 ], [ 150.174163818359602, -8.365833282470646 ], [ 150.175003051758154, -8.364444732666016 ] ] ], [ [ [ 150.596389770507812, -8.350000381469727 ], [ 150.599441528320312, -8.352778434753418 ], [ 150.599166870117301, -8.353055953979492 ], [ 150.593887329101562, -8.350277900695801 ], [ 150.596389770507812, -8.350000381469727 ] ] ], [ [ [ 150.117660522461165, -8.345342636108398 ], [ 150.115570068359489, -8.344928741455078 ], [ 150.114868164062614, -8.343403816223145 ], [ 150.1177978515625, -8.344790458679199 ], [ 150.117660522461165, -8.345342636108398 ] ] ], [ [ [ 150.426666259765739, -8.341667175292969 ], [ 150.425003051757926, -8.341667175292969 ], [ 150.4244384765625, -8.340555191040039 ], [ 150.426666259765739, -8.340276718139648 ], [ 150.426666259765739, -8.341667175292969 ] ] ], [ [ [ 150.84527587890625, -8.325278282165471 ], [ 150.863327026367188, -8.341944694519043 ], [ 150.881668090820426, -8.385554313659611 ], [ 150.882217407226676, -8.396389007568359 ], [ 150.84527587890625, -8.325278282165471 ] ] ], [ [ [ 150.71888732910179, -8.32833194732666 ], [ 150.717773437500114, -8.325278282165471 ], [ 150.719451904297102, -8.323612213134766 ], [ 150.720550537109375, -8.326665878295898 ], [ 150.71888732910179, -8.32833194732666 ] ] ], [ [ [ 150.573883056640625, -8.323056221008187 ], [ 150.577774047851676, -8.325278282165471 ], [ 150.589447021484489, -8.337498664855957 ], [ 150.58416748046875, -8.337498664855957 ], [ 150.573883056640625, -8.323056221008187 ] ] ], [ [ [ 150.822219848632812, -8.316389083862248 ], [ 150.828338623047102, -8.319998741149902 ], [ 150.830215454101562, -8.323105812072754 ], [ 150.816116333007812, -8.318611145019474 ], [ 150.822219848632812, -8.316389083862248 ] ] ], [ [ [ 150.111114501953125, -8.306387901306096 ], [ 150.108886718750227, -8.306387901306096 ], [ 150.109725952148438, -8.301112174987793 ], [ 150.111938476562727, -8.303609848022404 ], [ 150.111114501953125, -8.306387901306096 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-MPL", "NAME_1": "Morobe" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 147.724838256835938, -7.922231197357121 ], [ 147.724777221679688, -7.923367977142277 ], [ 147.722915649414404, -7.923062801361027 ], [ 147.723159790039062, -7.921690940856877 ], [ 147.724838256835938, -7.922231197357121 ] ] ], [ [ [ 147.71148681640625, -7.879811763763428 ], [ 147.712600708007926, -7.883593082427979 ], [ 147.709793090820312, -7.885832786560002 ], [ 147.709259033203239, -7.879504203796387 ], [ 147.71148681640625, -7.879811763763428 ] ] ], [ [ [ 147.627410888671875, -7.746890068054142 ], [ 147.626281738281477, -7.746890068054142 ], [ 147.625839233398438, -7.745554924011174 ], [ 147.627838134765852, -7.746475219726562 ], [ 147.627410888671875, -7.746890068054142 ] ] ], [ [ [ 147.610015869140625, -7.733489036560059 ], [ 147.6129150390625, -7.738214015960693 ], [ 147.604232788085938, -7.7376708984375 ], [ 147.60614013671875, -7.731783866882324 ], [ 147.610015869140625, -7.733489036560059 ] ] ], [ [ [ 147.59461975097679, -7.726353168487549 ], [ 147.596618652343864, -7.726418972015324 ], [ 147.596786499023551, -7.727055072784424 ], [ 147.593109130859489, -7.72684288024891 ], [ 147.59461975097679, -7.726353168487549 ] ] ], [ [ [ 147.623657226562727, -7.722755908966064 ], [ 147.618606567382812, -7.724349975585938 ], [ 147.615890502929801, -7.722073078155518 ], [ 147.622116088867415, -7.719192028045654 ], [ 147.623657226562727, -7.722755908966064 ] ] ], [ [ [ 147.610977172851562, -7.720046997070312 ], [ 147.608993530273551, -7.719350814819336 ], [ 147.608047485351562, -7.717562198638916 ], [ 147.611053466797102, -7.717576026916504 ], [ 147.610977172851562, -7.720046997070312 ] ] ], [ [ [ 147.633026123046989, -7.717596054077148 ], [ 147.626800537109375, -7.718902111053467 ], [ 147.63970947265625, -7.706980228424072 ], [ 147.641616821289062, -7.709462165832406 ], [ 147.633026123046989, -7.717596054077148 ] ] ], [ [ [ 147.540451049804915, -7.696845054626465 ], [ 147.536254882812727, -7.697196006774846 ], [ 147.534896850585938, -7.696412086486816 ], [ 147.537948608398438, -7.69476413726801 ], [ 147.540451049804915, -7.696845054626465 ] ] ], [ [ [ 147.532073974609489, -7.693367004394531 ], [ 147.532867431640852, -7.701550960540715 ], [ 147.523788452148779, -7.695704936981201 ], [ 147.527755737304688, -7.693626880645752 ], [ 147.532073974609489, -7.693367004394531 ] ] ], [ [ [ 147.537948608398438, -7.642877101898137 ], [ 147.5291748046875, -7.643000125884953 ], [ 147.529495239257926, -7.637582778930664 ], [ 147.531738281250114, -7.636985778808594 ], [ 147.537948608398438, -7.642877101898137 ] ] ], [ [ [ 147.496368408203125, -7.604026794433537 ], [ 147.497406005859489, -7.604787826538086 ], [ 147.494171142578239, -7.603333950042725 ], [ 147.495285034179915, -7.603055953979379 ], [ 147.496368408203125, -7.604026794433537 ] ] ], [ [ [ 147.433883666992642, -7.565279960632267 ], [ 147.43305969238304, -7.565555095672607 ], [ 147.432495117187727, -7.565141201019287 ], [ 147.433883666992642, -7.563891887664738 ], [ 147.433883666992642, -7.565279960632267 ] ] ], [ [ [ 147.434249877929915, -7.562437057495117 ], [ 147.433746337890739, -7.562644958496037 ], [ 147.434310913086051, -7.560842037200928 ], [ 147.434722900390625, -7.561256885528564 ], [ 147.434249877929915, -7.562437057495117 ] ] ], [ [ [ 147.406082153320426, -7.55128288269043 ], [ 147.405136108398551, -7.549620151519775 ], [ 147.407058715820654, -7.548151969909668 ], [ 147.407760620117301, -7.549190998077393 ], [ 147.406082153320426, -7.55128288269043 ] ] ], [ [ [ 147.39688110351608, -7.511722087860051 ], [ 147.395904541015852, -7.51082181930542 ], [ 147.396957397460938, -7.509244918823242 ], [ 147.398559570312614, -7.510612010955811 ], [ 147.39688110351608, -7.511722087860051 ] ] ], [ [ [ 147.425704956054688, -7.508313179016056 ], [ 147.423248291015739, -7.508307933807373 ], [ 147.421768188476562, -7.507402896881047 ], [ 147.42567443847679, -7.506155967712346 ], [ 147.425704956054688, -7.508313179016056 ] ] ], [ [ [ 147.328262329101676, -7.495965957641602 ], [ 147.328002929687727, -7.502054214477482 ], [ 147.326568603515966, -7.504290103912354 ], [ 147.324645996093864, -7.4945969581604 ], [ 147.328262329101676, -7.495965957641602 ] ] ], [ [ [ 147.402099609375341, -7.493076801300049 ], [ 147.402938842773551, -7.493907928466683 ], [ 147.402801513671989, -7.495154857635498 ], [ 147.401062011718977, -7.49328422546381 ], [ 147.402099609375341, -7.493076801300049 ] ] ], [ [ [ 147.36573791503929, -7.467359066009521 ], [ 147.369064331054688, -7.472664833068734 ], [ 147.361007690429915, -7.472095012664795 ], [ 147.35963439941429, -7.469051837921143 ], [ 147.36573791503929, -7.467359066009521 ] ] ], [ [ [ 147.237350463867188, -7.463509082794189 ], [ 147.236282348633267, -7.46383810043335 ], [ 147.236175537109375, -7.463030815124512 ], [ 147.237365722656477, -7.462337970733586 ], [ 147.237350463867188, -7.463509082794189 ] ] ], [ [ [ 147.325592041015739, -7.443674087524357 ], [ 147.324203491211165, -7.443437099456787 ], [ 147.321426391601562, -7.438835144042969 ], [ 147.326614379882812, -7.441707134246769 ], [ 147.325592041015739, -7.443674087524357 ] ] ], [ [ [ 147.306442260742415, -7.438180923461914 ], [ 147.305145263671989, -7.437785148620549 ], [ 147.305282592773551, -7.436742782592773 ], [ 147.306396484375, -7.437089920043888 ], [ 147.306442260742415, -7.438180923461914 ] ] ], [ [ [ 147.302886962890739, -7.43434476852417 ], [ 147.300628662109716, -7.433004856109562 ], [ 147.301284790039176, -7.431357860565186 ], [ 147.305145263671989, -7.432765960693303 ], [ 147.302886962890739, -7.43434476852417 ] ] ], [ [ [ 147.348342895507812, -7.432319164276123 ], [ 147.350738525390739, -7.440162181854248 ], [ 147.340011596679915, -7.439334869384709 ], [ 147.340789794922102, -7.43341588973999 ], [ 147.348342895507812, -7.432319164276123 ] ] ], [ [ [ 147.270996093750455, -7.431931972503605 ], [ 147.267547607422102, -7.429931163787842 ], [ 147.270492553711279, -7.426266193389893 ], [ 147.272430419921875, -7.43062782287592 ], [ 147.270996093750455, -7.431931972503605 ] ] ], [ [ [ 147.253982543945426, -7.396389007568359 ], [ 147.247482299804915, -7.405550956726017 ], [ 147.275329589843977, -7.399630069732609 ], [ 147.279052734375114, -7.414384841918888 ], [ 147.256240844726562, -7.43360519409174 ], [ 147.23225402832054, -7.411275863647461 ], [ 147.253982543945426, -7.396389007568359 ] ] ], [ [ [ 147.249099731445426, -7.384912967681885 ], [ 147.256011962890625, -7.385453224182129 ], [ 147.256607055664062, -7.386868953704834 ], [ 147.24690246582054, -7.391276836395207 ], [ 147.249099731445426, -7.384912967681885 ] ] ], [ [ [ 147.223937988281364, -7.377755165100041 ], [ 147.220626831054915, -7.374780178070068 ], [ 147.22161865234375, -7.372243881225529 ], [ 147.225997924804801, -7.374950885772705 ], [ 147.223937988281364, -7.377755165100041 ] ] ], [ [ [ 147.224365234375, -7.34819221496582 ], [ 147.217346191406477, -7.35298490524292 ], [ 147.211105346680142, -7.353486061096191 ], [ 147.2169189453125, -7.348121166229248 ], [ 147.224365234375, -7.34819221496582 ] ] ], [ [ [ 147.205566406250227, -7.343903064727726 ], [ 147.206832885742188, -7.339312076568604 ], [ 147.210922241211051, -7.340589046478215 ], [ 147.210739135742301, -7.342764854431152 ], [ 147.205566406250227, -7.343903064727726 ] ] ], [ [ [ 147.160202026367188, -7.244668960571289 ], [ 147.154846191406364, -7.245639801025334 ], [ 147.153472900390852, -7.244720935821476 ], [ 147.156112670898665, -7.240979194641113 ], [ 147.160202026367188, -7.244668960571289 ] ] ], [ [ [ 147.910507202148665, -6.761181831359863 ], [ 147.911941528320312, -6.764791965484619 ], [ 147.910552978515625, -6.766111850738469 ], [ 147.906784057617529, -6.763659954070988 ], [ 147.910507202148665, -6.761181831359863 ] ] ], [ [ [ 147.903060913086165, -6.756872177124023 ], [ 147.904281616211051, -6.762835025787354 ], [ 147.89582824707054, -6.761202812194824 ], [ 147.899841308593977, -6.757160186767521 ], [ 147.903060913086165, -6.756872177124023 ] ] ], [ [ [ 147.918502807617301, -6.760283946990967 ], [ 147.915924072265739, -6.758854866027832 ], [ 147.916915893554688, -6.756567001342717 ], [ 147.918365478515739, -6.757481098174992 ], [ 147.918502807617301, -6.760283946990967 ] ] ], [ [ [ 147.794219970703239, -6.698039054870549 ], [ 147.793182373046989, -6.697761058807316 ], [ 147.793258666992188, -6.697068214416504 ], [ 147.79450988769554, -6.697206974029541 ], [ 147.794219970703239, -6.698039054870549 ] ] ], [ [ [ 147.860900878906364, -6.653679847717285 ], [ 147.86317443847679, -6.655407905578613 ], [ 147.86317443847679, -6.656239032745361 ], [ 147.858810424804915, -6.655901908874512 ], [ 147.860900878906364, -6.653679847717285 ] ] ], [ [ [ 147.859161376953352, -6.647221088409367 ], [ 147.858642578125227, -6.646913051605225 ], [ 147.859725952148438, -6.645555019378548 ], [ 147.860076904296875, -6.646317958831673 ], [ 147.859161376953352, -6.647221088409367 ] ] ], [ [ [ 147.863250732421875, -6.645360946655217 ], [ 147.8638916015625, -6.64770603179926 ], [ 147.862777709960938, -6.64874792098999 ], [ 147.861953735351676, -6.645571231841984 ], [ 147.863250732421875, -6.645360946655217 ] ] ], [ [ [ 147.866622924804801, -6.631700038909855 ], [ 147.867782592773665, -6.634160995483398 ], [ 147.862854003906364, -6.642653942108154 ], [ 147.863113403320312, -6.639460086822453 ], [ 147.866622924804801, -6.631700038909855 ] ] ], [ [ [ 147.863845825195426, -6.628026008605957 ], [ 147.862045288086051, -6.627779960632324 ], [ 147.861663818359489, -6.619722843170109 ], [ 147.86273193359375, -6.625662803649902 ], [ 147.863845825195426, -6.628026008605957 ] ] ], [ [ [ 147.60592651367233, -6.09333610534668 ], [ 147.603637695312955, -6.091877937316895 ], [ 147.603805541992415, -6.090384960174561 ], [ 147.605865478515852, -6.09201717376709 ], [ 147.60592651367233, -6.09333610534668 ] ] ], [ [ [ 147.59846496582054, -6.08316707611084 ], [ 147.594985961914062, -6.080252170562744 ], [ 147.595062255859489, -6.078378200530949 ], [ 147.596038818359375, -6.079101085662785 ], [ 147.59846496582054, -6.08316707611084 ] ] ], [ [ [ 148.117767333984375, -5.973957061767578 ], [ 148.116455078125, -5.974166870117188 ], [ 148.116394042968864, -5.97333288192749 ], [ 148.117492675781364, -5.972846984863281 ], [ 148.117767333984375, -5.973957061767578 ] ] ], [ [ [ 148.184097290039176, -5.97333288192749 ], [ 148.182785034179688, -5.97333288192749 ], [ 148.182296752929915, -5.972498893737793 ], [ 148.183197021484375, -5.971806049346924 ], [ 148.184097290039176, -5.97333288192749 ] ] ], [ [ [ 148.120559692382812, -5.960694789886418 ], [ 148.119232177734489, -5.960416793823185 ], [ 148.119445800781364, -5.959166049957275 ], [ 148.120071411132812, -5.959236145019474 ], [ 148.120559692382812, -5.960694789886418 ] ] ], [ [ [ 148.039093017578239, -5.946874141693058 ], [ 148.032424926757926, -5.950276851654053 ], [ 148.026855468750227, -5.963877201080265 ], [ 148.022750854492529, -5.956669807434025 ], [ 148.029861450195312, -5.948265075683537 ], [ 148.039093017578239, -5.946874141693058 ] ] ], [ [ [ 148.129791259765625, -5.915903091430607 ], [ 148.128540039062955, -5.915278911590462 ], [ 148.129165649414176, -5.91395902633667 ], [ 148.130493164062614, -5.914722919464054 ], [ 148.129791259765625, -5.915903091430607 ] ] ], [ [ [ 147.333053588867529, -5.915555000305176 ], [ 147.331939697265625, -5.911387920379639 ], [ 147.333618164062614, -5.910555839538574 ], [ 147.334716796875114, -5.912221908569336 ], [ 147.333053588867529, -5.915555000305176 ] ] ], [ [ [ 148.090759277343977, -5.911873817443791 ], [ 148.089447021484489, -5.911387920379639 ], [ 148.089233398437727, -5.910346984863281 ], [ 148.090347290039176, -5.910417079925537 ], [ 148.090759277343977, -5.911873817443791 ] ] ], [ [ [ 148.038330078125114, -5.908611774444523 ], [ 148.03778076171875, -5.909790992736816 ], [ 148.033813476562841, -5.90826416015625 ], [ 148.033950805664176, -5.907567977905273 ], [ 148.038330078125114, -5.908611774444523 ] ] ], [ [ [ 148.01333618164108, -5.904097080230599 ], [ 148.013885498047102, -5.901668071746826 ], [ 148.017700195312727, -5.901875019073486 ], [ 148.01673889160179, -5.903021812438965 ], [ 148.01333618164108, -5.904097080230599 ] ] ], [ [ [ 148.051116943359489, -5.895833015441838 ], [ 148.05104064941429, -5.896249771118107 ], [ 148.049377441406477, -5.895902156829834 ], [ 148.050765991211051, -5.895348072051945 ], [ 148.051116943359489, -5.895833015441838 ] ] ], [ [ [ 147.945297241211051, -5.895281791687012 ], [ 147.945144653320312, -5.899951934814453 ], [ 147.931976318359375, -5.898234844207764 ], [ 147.942352294922102, -5.890498161315918 ], [ 147.945297241211051, -5.895281791687012 ] ] ], [ [ [ 147.927322387695426, -5.846471786498967 ], [ 147.926147460937727, -5.845513820648137 ], [ 147.926773071289062, -5.844089984893799 ], [ 147.92823791503929, -5.845056056976318 ], [ 147.927322387695426, -5.846471786498967 ] ] ], [ [ [ 147.931671142578352, -5.840555191039982 ], [ 147.930557250977017, -5.839723110198975 ], [ 147.930557250977017, -5.838333129882812 ], [ 147.931945800781364, -5.838889122009277 ], [ 147.931671142578352, -5.840555191039982 ] ] ], [ [ [ 147.990280151367188, -5.839723110198975 ], [ 147.988616943359375, -5.838611125946045 ], [ 147.989440917968977, -5.837223052978516 ], [ 147.991394042968977, -5.838333129882812 ], [ 147.990280151367188, -5.839723110198975 ] ] ], [ [ [ 148.03472900390625, -5.834929943084717 ], [ 148.033843994140625, -5.833332061767578 ], [ 148.03472900390625, -5.832847118377629 ], [ 148.035278320312614, -5.833611011505127 ], [ 148.03472900390625, -5.834929943084717 ] ] ], [ [ [ 146.774505615234602, -5.843875885009766 ], [ 146.798614501953466, -5.858057022094727 ], [ 146.833694458007926, -5.83567476272583 ], [ 146.865280151367415, -5.836111068725586 ], [ 146.90249633789108, -5.855978012084961 ], [ 146.931671142578352, -5.90388822555542 ], [ 146.999450683593864, -5.938610076904297 ], [ 147.051177978515625, -5.910324096679631 ], [ 147.090698242187727, -5.959664821624699 ], [ 147.140930175781364, -5.948050022125187 ], [ 147.208465576171875, -5.962103843688965 ], [ 147.268890380859602, -5.915555000305176 ], [ 147.316207885742301, -5.937957763671818 ], [ 147.339080810547102, -5.918111801147461 ], [ 147.371948242187614, -5.958889961242619 ], [ 147.445327758789517, -5.966475009918213 ], [ 147.624481201171989, -6.109792232513428 ], [ 147.711883544921875, -6.271092891693115 ], [ 147.773635864257926, -6.291243076324463 ], [ 147.810974121093864, -6.324722766876221 ], [ 147.807907104492415, -6.354538917541504 ], [ 147.852951049804688, -6.431487083435002 ], [ 147.830825805664062, -6.525767803192139 ], [ 147.851104736328125, -6.575139045715275 ], [ 147.819091796875, -6.587868213653564 ], [ 147.855941772461051, -6.592597007751465 ], [ 147.85791015625, -6.624859809875488 ], [ 147.863616943359489, -6.629649162292424 ], [ 147.8104248046875, -6.692864894866943 ], [ 147.765777587890739, -6.697498798370304 ], [ 147.74781799316429, -6.70835018157959 ], [ 147.667602539062841, -6.6966872215271 ], [ 147.647552490234489, -6.711020946502629 ], [ 147.581558227539176, -6.708716869354191 ], [ 147.56867980957054, -6.730445861816406 ], [ 147.577133178711051, -6.74721097946167 ], [ 147.392562866211279, -6.718891143798828 ], [ 147.342987060546875, -6.747253894805851 ], [ 147.20173645019554, -6.737579822540283 ], [ 147.149536132812614, -6.703573226928711 ], [ 147.080490112304801, -6.706124782562256 ], [ 147.032714843750227, -6.736964225769043 ], [ 146.97833251953125, -6.737222194671631 ], [ 146.967330932617415, -6.742928981781006 ], [ 146.969223022461165, -6.747276782989445 ], [ 146.96333312988304, -6.746943950653019 ], [ 146.958618164062614, -6.755506992340031 ], [ 146.95391845703125, -6.755842208862305 ], [ 146.952804565429801, -6.758479118347111 ], [ 146.95440673828125, -6.756466865539551 ], [ 146.957839965820312, -6.756340980529728 ], [ 146.961639404296989, -6.753368854522648 ], [ 146.946685791015852, -6.965589046478215 ], [ 147.039962768554915, -7.058537006378117 ], [ 147.070281982422102, -7.013609886169377 ], [ 147.04591369628929, -7.06144189834589 ], [ 147.047332763672216, -7.076912879943848 ], [ 147.070953369140739, -7.081467151641846 ], [ 147.0736083984375, -7.113334178924561 ], [ 147.055313110351676, -7.146286010742131 ], [ 147.092330932617301, -7.167283058166447 ], [ 147.133941650390625, -7.220541954040471 ], [ 147.125091552734489, -7.299276828765869 ], [ 147.152221679687614, -7.305555820465088 ], [ 147.129028320312727, -7.327003002166634 ], [ 147.156372070312614, -7.34290885925293 ], [ 147.143371582031477, -7.377570152282715 ], [ 147.168609619140739, -7.385025024414062 ], [ 147.17958068847679, -7.426072120666504 ], [ 147.199920654297216, -7.428854942321777 ], [ 147.179931640625, -7.463823795318547 ], [ 147.224060058593977, -7.463366031646729 ], [ 147.221298217773438, -7.495037078857365 ], [ 147.265090942382926, -7.461441993713379 ], [ 147.261993408203239, -7.476381778717041 ], [ 147.292175292968864, -7.477549076080265 ], [ 147.266281127929801, -7.496270179748535 ], [ 147.283889770507812, -7.503849983215218 ], [ 147.300491333007812, -7.489425182342529 ], [ 147.303680419922216, -7.51445484161377 ], [ 147.364166259765625, -7.507777214050236 ], [ 147.345932006836165, -7.529497146606388 ], [ 147.375000000000114, -7.525379180908089 ], [ 147.388153076171989, -7.575813770294133 ], [ 147.413604736328352, -7.554444789886475 ], [ 147.433883666992642, -7.582778930664006 ], [ 147.466094970703352, -7.589176177978459 ], [ 147.444595336914062, -7.594101905822754 ], [ 147.44721984863304, -7.608057022094727 ], [ 147.434249877929915, -7.606465816497746 ], [ 147.434906005859716, -7.588719844818058 ], [ 147.433380126953466, -7.610879898071289 ], [ 147.471939086914062, -7.608889102935791 ], [ 147.508895874023551, -7.643603801727238 ], [ 147.516647338867415, -7.668172836303654 ], [ 147.487594604492188, -7.676030158996582 ], [ 147.504348754882812, -7.684124946594238 ], [ 147.498184204101562, -7.696485042571965 ], [ 147.577056884765625, -7.709963798522892 ], [ 147.591110229492301, -7.742778778076172 ], [ 147.573303222656477, -7.759106159210148 ], [ 147.59222412109375, -7.785417079925537 ], [ 147.595672607421989, -7.756218910217285 ], [ 147.608474731445654, -7.777159214019775 ], [ 147.664550781250341, -7.791488170623779 ], [ 147.678878784179688, -7.821646213531437 ], [ 147.663055419921875, -7.829998970031681 ], [ 147.687423706054801, -7.830358982086182 ], [ 147.69281005859375, -7.908874988555908 ], [ 147.714965820312727, -7.942296028137207 ], [ 147.76191711425804, -7.954988956451416 ], [ 147.786422729492301, -7.930871009826603 ], [ 147.832489013672102, -7.954973220825195 ], [ 147.866134643554801, -7.940064907073918 ], [ 147.961044311523665, -8.010536193847656 ], [ 147.264205932617188, -8.004534721374512 ], [ 147.203613281250227, -8.032334327697754 ], [ 147.161712646484489, -8.005234718322754 ], [ 147.004119873046989, -8.004434585571232 ], [ 146.911117553711051, -7.959935188293457 ], [ 146.863311767578125, -7.988033771514893 ], [ 146.820205688476562, -7.989436149597168 ], [ 146.784210205078352, -7.933434963226318 ], [ 146.73760986328125, -7.950435161590576 ], [ 146.721618652343977, -7.900935173034668 ], [ 146.731811523437614, -7.824034214019662 ], [ 146.490707397461051, -7.651533126831055 ], [ 146.409118652343864, -7.60783576965332 ], [ 146.111206054687841, -7.548233985900879 ], [ 146.07861328125, -7.493234157562256 ], [ 146.063018798828352, -7.376335144042969 ], [ 145.74201965332054, -7.158435821533203 ], [ 145.793411254882926, -7.086533069610596 ], [ 145.905319213867415, -7.095035076141301 ], [ 145.927413940429915, -6.984435081481934 ], [ 146.003509521484602, -6.896535873413086 ], [ 146.015609741210938, -6.841134071350041 ], [ 145.987411499023551, -6.740635871887207 ], [ 146.0294189453125, -6.689435005187988 ], [ 146.136215209960938, -6.220036029815674 ], [ 146.11091613769554, -6.182134151458683 ], [ 145.903717041015625, -6.064033031463566 ], [ 145.862106323242529, -5.996534824371338 ], [ 146.498611450195312, -5.993234157562199 ], [ 146.674011230468864, -5.891334056854191 ], [ 146.716812133789062, -5.884635925292969 ], [ 146.767868041992188, -5.832235813140869 ], [ 146.774505615234602, -5.843875885009766 ] ] ], [ [ [ 148.00416564941429, -5.831805229186955 ], [ 148.006668090820426, -5.832429885864201 ], [ 148.00721740722679, -5.833611011505127 ], [ 148.003753662109489, -5.834167003631592 ], [ 148.00416564941429, -5.831805229186955 ] ] ], [ [ [ 147.99000549316429, -5.833611011505127 ], [ 147.988616943359375, -5.832500934600773 ], [ 147.989715576171875, -5.830834865570068 ], [ 147.991104125976562, -5.832222938537541 ], [ 147.99000549316429, -5.833611011505127 ] ] ], [ [ [ 148.017761230468864, -5.8301100730896 ], [ 148.022262573242301, -5.830733776092529 ], [ 148.02203369140625, -5.832759857177734 ], [ 148.017227172851562, -5.833332061767578 ], [ 148.017761230468864, -5.8301100730896 ] ] ], [ [ [ 147.988143920898665, -5.827219963073674 ], [ 147.98309326171875, -5.82166576385498 ], [ 147.983367919922102, -5.810657024383488 ], [ 147.990264892578239, -5.821741104125977 ], [ 147.988143920898665, -5.827219963073674 ] ] ], [ [ [ 147.984756469726562, -5.804977893829346 ], [ 147.985321044921875, -5.806128978729248 ], [ 147.983871459960938, -5.806671142578125 ], [ 147.983871459960938, -5.804977893829346 ], [ 147.984756469726562, -5.804977893829346 ] ] ], [ [ [ 147.978820800781364, -5.80479097366333 ], [ 147.97651672363304, -5.803850173950138 ], [ 147.976394653320426, -5.801691055297852 ], [ 147.980224609375, -5.80401420593256 ], [ 147.978820800781364, -5.80479097366333 ] ] ], [ [ [ 148.040023803711165, -5.800036907196045 ], [ 148.039459228515852, -5.801437854766846 ], [ 148.038284301757926, -5.800868034362793 ], [ 148.039657592773892, -5.799204826354867 ], [ 148.040023803711165, -5.800036907196045 ] ] ], [ [ [ 147.972579956054801, -5.804257869720459 ], [ 147.969223022461165, -5.800342082977238 ], [ 147.969970703125, -5.79796314239502 ], [ 147.97357177734375, -5.802742004394474 ], [ 147.972579956054801, -5.804257869720459 ] ] ], [ [ [ 148.05194091796875, -5.798612117767334 ], [ 148.050491333007926, -5.797500133514291 ], [ 148.051330566406364, -5.796543121337834 ], [ 148.052154541015625, -5.796944141387883 ], [ 148.05194091796875, -5.798612117767334 ] ] ], [ [ [ 147.967224121093864, -5.797778129577637 ], [ 147.96638488769554, -5.797500133514291 ], [ 147.965560913085938, -5.794722080230713 ], [ 147.9677734375, -5.794722080230713 ], [ 147.967224121093864, -5.797778129577637 ] ] ], [ [ [ 147.944534301757926, -5.789875984191838 ], [ 147.943618774414062, -5.787825107574406 ], [ 147.94476318359375, -5.78673601150507 ], [ 147.946044921875114, -5.788413047790471 ], [ 147.944534301757926, -5.789875984191838 ] ] ], [ [ [ 148.113052368164176, -5.526390075683594 ], [ 148.108901977539176, -5.527567863464299 ], [ 148.114822387695426, -5.513453006744328 ], [ 148.116668701171989, -5.521083831787109 ], [ 148.113052368164176, -5.526390075683594 ] ] ], [ [ [ 147.79035949707054, -5.461064815521183 ], [ 147.843536376953239, -5.465350151062012 ], [ 147.898025512695312, -5.526619911193848 ], [ 147.99090576171875, -5.542810916900578 ], [ 148.048034667968977, -5.582787036895752 ], [ 148.084716796875114, -5.634444236755371 ], [ 148.058258056640625, -5.765340805053711 ], [ 148.034439086914062, -5.818333148956299 ], [ 148.017745971679688, -5.810713768005314 ], [ 148.020721435547102, -5.827950954437199 ], [ 147.99798583984375, -5.831352233886662 ], [ 147.97151184082054, -5.788788795471191 ], [ 147.861694335937727, -5.742736816406193 ], [ 147.858016967773665, -5.696619033813477 ], [ 147.79925537109375, -5.669793128967285 ], [ 147.759826660156477, -5.611560821533203 ], [ 147.749237060547216, -5.501802921295109 ], [ 147.771926879882926, -5.460289955139103 ], [ 147.79035949707054, -5.461064815521183 ] ] ], [ [ [ 147.744522094726562, -5.420785903930664 ], [ 147.744796752929801, -5.421619892120361 ], [ 147.74305725097679, -5.421759128570557 ], [ 147.743133544922216, -5.420993804931584 ], [ 147.744522094726562, -5.420785903930664 ] ] ], [ [ [ 148.080490112304801, -5.37388801574707 ], [ 148.104995727539062, -5.385276794433594 ], [ 148.11555480957054, -5.415555000305119 ], [ 148.087783813476676, -5.447778224945068 ], [ 148.051116943359489, -5.423888206481934 ], [ 148.058334350586165, -5.381667137145939 ], [ 148.080490112304801, -5.37388801574707 ] ] ], [ [ [ 147.543060302734375, -5.298333168029785 ], [ 147.5413818359375, -5.296945095062199 ], [ 147.542495727539062, -5.295557022094727 ], [ 147.543609619140739, -5.296945095062199 ], [ 147.543060302734375, -5.298333168029785 ] ] ], [ [ [ 147.591979980468977, -5.282991886138916 ], [ 147.613082885742188, -5.28488111495966 ], [ 147.628250122070426, -5.314393997192326 ], [ 147.604156494140852, -5.342862129211426 ], [ 147.579299926757812, -5.345884799957219 ], [ 147.55340576171875, -5.330926895141488 ], [ 147.555053710937614, -5.298227787017709 ], [ 147.591979980468977, -5.282991886138916 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-NCD", "NAME_1": "National Capital District" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 147.180282592773438, -9.492222785949707 ], [ 147.143890380859375, -9.48430347442627 ], [ 147.156143188476676, -9.460613250732422 ], [ 147.127227783203125, -9.419999122619629 ], [ 147.084594726562727, -9.422065734863281 ], [ 147.101119995117188, -9.390834808349553 ], [ 147.179519653320312, -9.356835365295353 ], [ 147.271209716796875, -9.40423393249506 ], [ 147.287414550781364, -9.462735176086426 ], [ 147.276947021484375, -9.510556221008244 ], [ 147.260833740234602, -9.484999656677246 ], [ 147.242782592773551, -9.486388206481877 ], [ 147.239715576171989, -9.504443168640137 ], [ 147.258895874023438, -9.521110534667912 ], [ 147.243331909179801, -9.540278434753304 ], [ 147.180282592773438, -9.492222785949707 ] ] ], [ [ [ 147.1246337890625, -9.43253231048584 ], [ 147.1295166015625, -9.436819076538086 ], [ 147.125885009765625, -9.441933631896973 ], [ 147.122116088867188, -9.436540603637695 ], [ 147.1246337890625, -9.43253231048584 ] ] ], [ [ [ 147.0927734375, -9.446925163269043 ], [ 147.110275268554688, -9.433055877685547 ], [ 147.112777709960938, -9.47611141204834 ], [ 147.093612670898551, -9.478886604309025 ], [ 147.092498779296875, -9.461943626403809 ], [ 147.07666015625, -9.46833324432373 ], [ 147.058334350586051, -9.446623802185002 ], [ 147.0927734375, -9.446925163269043 ] ] ], [ [ [ 147.118331909179688, -9.472498893737793 ], [ 147.118606567382926, -9.487777709960938 ], [ 147.117218017578239, -9.488333702087402 ], [ 147.113052368164176, -9.48305606842041 ], [ 147.118331909179688, -9.472498893737793 ] ] ], [ [ [ 147.11749267578125, -9.497501373291016 ], [ 147.11639404296875, -9.49555492401123 ], [ 147.119171142578239, -9.490832328796387 ], [ 147.120559692382812, -9.49305534362793 ], [ 147.11749267578125, -9.497501373291016 ] ] ], [ [ [ 147.047500610351562, -9.508055686950684 ], [ 147.06361389160179, -9.516387939453125 ], [ 147.081390380859489, -9.512778282165471 ], [ 147.063049316406364, -9.523056983947697 ], [ 147.038894653320312, -9.514165878295898 ], [ 147.047500610351562, -9.508055686950684 ] ] ], [ [ [ 147.178604125976562, -9.519166946411076 ], [ 147.17500305175804, -9.514165878295898 ], [ 147.177505493164176, -9.509444236755314 ], [ 147.179718017578125, -9.512222290039062 ], [ 147.178604125976562, -9.519166946411076 ] ] ], [ [ [ 147.091659545898551, -9.51249980926508 ], [ 147.095840454101562, -9.515556335449219 ], [ 147.086395263671875, -9.514721870422363 ], [ 147.086944580078239, -9.514165878295898 ], [ 147.091659545898551, -9.51249980926508 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-NIK", "NAME_1": "New Ireland" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 152.90943908691429, -4.833610057830754 ], [ 152.907226562500114, -4.83055591583252 ], [ 152.908889770507926, -4.826943874359131 ], [ 152.911666870117529, -4.829165935516357 ], [ 152.90943908691429, -4.833610057830754 ] ] ], [ [ [ 152.849700927734375, -4.824644088745117 ], [ 152.845611572265739, -4.822768211364746 ], [ 152.8453369140625, -4.820265769958496 ], [ 152.848129272461051, -4.821097850799504 ], [ 152.849700927734375, -4.824644088745117 ] ] ], [ [ [ 152.85772705078125, -4.799308776855469 ], [ 152.858398437500114, -4.813086032867375 ], [ 152.830230712890625, -4.801795959472656 ], [ 152.847991943359375, -4.78679704666132 ], [ 152.85772705078125, -4.799308776855469 ] ] ], [ [ [ 152.776000976562614, -4.725646972656193 ], [ 152.772949218750114, -4.722589015960693 ], [ 152.773025512695312, -4.717177867889291 ], [ 152.776916503906477, -4.720543861389103 ], [ 152.776000976562614, -4.725646972656193 ] ] ], [ [ [ 152.764495849609489, -4.686642169952393 ], [ 152.771469116211051, -4.693966865539551 ], [ 152.77102661132858, -4.710562229156437 ], [ 152.761184692382812, -4.697495937347412 ], [ 152.764495849609489, -4.686642169952393 ] ] ], [ [ [ 153.070831298828352, -4.209166049957275 ], [ 153.068893432617415, -4.208055973052922 ], [ 153.07000732421875, -4.206111907958928 ], [ 153.072494506835938, -4.207499980926457 ], [ 153.070831298828352, -4.209166049957275 ] ] ], [ [ [ 152.981674194335938, -4.069167137145996 ], [ 152.985839843750114, -4.072778224945068 ], [ 152.986114501953352, -4.074443817138672 ], [ 152.978332519531477, -4.070834159851017 ], [ 152.981674194335938, -4.069167137145996 ] ] ], [ [ [ 153.616668701171875, -4.025832176208439 ], [ 153.613052368164062, -4.025269031524658 ], [ 153.621017456054688, -4.022530078887883 ], [ 153.620391845703125, -4.024336814880371 ], [ 153.616668701171875, -4.025832176208439 ] ] ], [ [ [ 153.64471435546875, -4.011177062988224 ], [ 153.662796020507812, -4.104515075683537 ], [ 153.625274658203352, -4.139388084411621 ], [ 153.568893432617188, -4.086667060852051 ], [ 153.64471435546875, -4.011177062988224 ] ] ], [ [ [ 153.70611572265625, -3.998611927032357 ], [ 153.726104736328466, -3.999444007873478 ], [ 153.743057250976676, -4.030279159545842 ], [ 153.718338012695312, -4.043055057525635 ], [ 153.69374084472679, -4.020471096038705 ], [ 153.6553955078125, -4.024037837982178 ], [ 153.70611572265625, -3.998611927032357 ] ] ], [ [ [ 152.347381591797102, -3.699464082717896 ], [ 152.3470458984375, -3.698071956634521 ], [ 152.3486328125, -3.697864055633488 ], [ 152.348907470703352, -3.698837995529175 ], [ 152.347381591797102, -3.699464082717896 ] ] ], [ [ [ 153.193450927734602, -3.532619953155461 ], [ 153.208694458007812, -3.533318042755127 ], [ 153.210067749023665, -3.537769079208374 ], [ 153.198852539062614, -3.545283079147339 ], [ 153.193450927734602, -3.532619953155461 ] ] ], [ [ [ 153.188598632812614, -3.522742033004761 ], [ 153.1865234375, -3.521627902984505 ], [ 153.1865234375, -3.519959926605168 ], [ 153.189010620117188, -3.520098924636841 ], [ 153.188598632812614, -3.522742033004761 ] ] ], [ [ [ 153.20722961425804, -3.507009983062687 ], [ 153.210693359375, -3.508472919464111 ], [ 153.21200561523483, -3.510767936706429 ], [ 153.207244873046989, -3.51049900054926 ], [ 153.20722961425804, -3.507009983062687 ] ] ], [ [ [ 153.210342407226676, -3.506036043167114 ], [ 153.20895385742233, -3.505687952041569 ], [ 153.20895385742233, -3.504921913146973 ], [ 153.209655761718977, -3.5047829151153 ], [ 153.210342407226676, -3.506036043167114 ] ] ], [ [ [ 153.188735961914517, -3.503259897231999 ], [ 153.186248779297102, -3.514863014221191 ], [ 153.171005249023551, -3.504652976989689 ], [ 153.190124511718864, -3.49755597114563 ], [ 153.188735961914517, -3.503259897231999 ] ] ], [ [ [ 152.231674194336051, -3.454165935516357 ], [ 152.23500061035179, -3.457221984863281 ], [ 152.233612060546875, -3.459166049957162 ], [ 152.230560302734375, -3.45638990402216 ], [ 152.231674194336051, -3.454165935516357 ] ] ], [ [ [ 153.215011596679801, -3.430829048156738 ], [ 153.245681762695312, -3.47974705696106 ], [ 153.244812011719205, -3.498899936675969 ], [ 153.197463989257926, -3.492965936660767 ], [ 153.172531127929801, -3.458385944366455 ], [ 153.215011596679801, -3.430829048156738 ] ] ], [ [ [ 154.723236083984489, -3.383727073669377 ], [ 154.725463867187727, -3.383760929107666 ], [ 154.727157592773551, -3.387482881546021 ], [ 154.723800659179688, -3.387830972671509 ], [ 154.723236083984489, -3.383727073669377 ] ] ], [ [ [ 154.727401733398551, -3.376907110214177 ], [ 154.74568176269554, -3.416007995605469 ], [ 154.751708984375, -3.440010070800724 ], [ 154.731201171875227, -3.465682029724121 ], [ 154.74859619140625, -3.435281038284302 ], [ 154.726638793945426, -3.378577947616577 ], [ 154.721511840820312, -3.380527019500732 ], [ 154.722198486328239, -3.359028100967407 ], [ 154.727401733398551, -3.376907110214177 ] ] ], [ [ [ 153.296112060547102, -3.362222909927368 ], [ 153.341964721680029, -3.380572080612183 ], [ 153.330474853515625, -3.415044069290161 ], [ 153.29888916015625, -3.384166002273503 ], [ 153.280319213867188, -3.395842075347787 ], [ 153.242218017578125, -3.38611102104187 ], [ 153.247680664062614, -3.37062406539917 ], [ 153.296112060547102, -3.362222909927368 ] ] ], [ [ [ 151.808074951172216, -3.353410005569401 ], [ 151.8067626953125, -3.352714061737061 ], [ 151.807312011719091, -3.35174107551569 ], [ 151.808349609375114, -3.35174107551569 ], [ 151.808074951172216, -3.353410005569401 ] ] ], [ [ [ 154.695602416992301, -3.363759040832406 ], [ 154.687637329101562, -3.359445095062199 ], [ 154.687210083007926, -3.351651906967163 ], [ 154.697891235351676, -3.360487937927246 ], [ 154.695602416992301, -3.363759040832406 ] ] ], [ [ [ 154.722061157226676, -3.346506118774357 ], [ 154.721649169922102, -3.344208955764771 ], [ 154.722900390625, -3.343791961669865 ], [ 154.723861694335938, -3.344903945922738 ], [ 154.722061157226676, -3.346506118774357 ] ] ], [ [ [ 154.723373413086165, -3.343303918838501 ], [ 154.721237182617415, -3.34260892868042 ], [ 154.72137451171875, -3.34066009521473 ], [ 154.723724365234489, -3.341981887817383 ], [ 154.723373413086165, -3.343303918838501 ] ] ], [ [ [ 154.673568725586051, -3.340869903564453 ], [ 154.66920471191429, -3.339338064193726 ], [ 154.669067382812614, -3.334328889846745 ], [ 154.674530029297102, -3.335999011993295 ], [ 154.673568725586051, -3.340869903564453 ] ] ], [ [ [ 151.774307250976676, -3.330164909362793 ], [ 151.773483276367642, -3.329957008361816 ], [ 151.773498535156364, -3.328617095947209 ], [ 151.774856567382926, -3.329344034194946 ], [ 151.774307250976676, -3.330164909362793 ] ] ], [ [ [ 154.662689208984489, -3.326328992843628 ], [ 154.660537719726562, -3.322711944580021 ], [ 154.664138793945654, -3.319370985031128 ], [ 154.664764404296875, -3.321458101272526 ], [ 154.662689208984489, -3.326328992843628 ] ] ], [ [ [ 154.716171264648438, -3.322362899780217 ], [ 154.713150024414176, -3.325946092605591 ], [ 154.712432861328125, -3.318258047103882 ], [ 154.714233398437955, -3.319094896316528 ], [ 154.716171264648438, -3.322362899780217 ] ] ], [ [ [ 154.717483520507926, -3.315892934799194 ], [ 154.714782714843977, -3.316380023956299 ], [ 154.71437072753929, -3.315685033798161 ], [ 154.716384887695426, -3.31352710723877 ], [ 154.717483520507926, -3.315892934799194 ] ] ], [ [ [ 154.658187866210938, -3.317075967788639 ], [ 154.656036376953352, -3.316170930862427 ], [ 154.656036376953352, -3.312693119049072 ], [ 154.659851074218977, -3.31443190574646 ], [ 154.658187866210938, -3.317075967788639 ] ] ], [ [ [ 154.715057373046989, -3.305943965911808 ], [ 154.71652221679733, -3.307960987090951 ], [ 154.71284484863304, -3.311022043228149 ], [ 154.713882446289062, -3.305735111236572 ], [ 154.715057373046989, -3.305943965911808 ] ] ], [ [ [ 154.715057373046989, -3.302257061004639 ], [ 154.713958740234375, -3.301213026046696 ], [ 154.714645385742188, -3.297802925109863 ], [ 154.715484619140625, -3.299057006835881 ], [ 154.715057373046989, -3.302257061004639 ] ] ], [ [ [ 154.642257690429688, -3.282845020294133 ], [ 154.639694213867301, -3.27811598777771 ], [ 154.64031982421875, -3.276236057281437 ], [ 154.64155578613304, -3.276654958724919 ], [ 154.642257690429688, -3.282845020294133 ] ] ], [ [ [ 154.715408325195312, -3.291820049285775 ], [ 154.710693359375, -3.281455039978027 ], [ 154.71319580078125, -3.27386999130249 ], [ 154.718811035156705, -3.283611059188843 ], [ 154.715408325195312, -3.291820049285775 ] ] ], [ [ [ 154.706893920898438, -3.269208908081055 ], [ 154.708343505859375, -3.270462989807072 ], [ 154.707229614257926, -3.271713972091675 ], [ 154.705535888671875, -3.268723964691162 ], [ 154.706893920898438, -3.269208908081055 ] ] ], [ [ [ 154.517684936523438, -3.180712938308716 ], [ 154.514343261719205, -3.179532051086426 ], [ 154.522613525390966, -3.173757076263428 ], [ 154.521499633789062, -3.177999973297062 ], [ 154.517684936523438, -3.180712938308716 ] ] ], [ [ [ 154.509521484375227, -3.17577409744257 ], [ 154.506607055664062, -3.173965930938607 ], [ 154.50611877441429, -3.171912908554077 ], [ 154.51007080078125, -3.174940109252873 ], [ 154.509521484375227, -3.17577409744257 ] ] ], [ [ [ 154.46607971191429, -3.143491983413696 ], [ 154.464691162109602, -3.14314603805542 ], [ 154.463516235351562, -3.141125917434636 ], [ 154.46455383300804, -3.140986919403076 ], [ 154.46607971191429, -3.143491983413696 ] ] ], [ [ [ 154.508483886718864, -3.136465072631836 ], [ 154.506256103515625, -3.135214090347233 ], [ 154.5028076171875, -3.128706932067814 ], [ 154.50459289550804, -3.128395080566406 ], [ 154.508483886718864, -3.136465072631836 ] ] ], [ [ [ 154.497955322265739, -3.126029014587346 ], [ 154.496841430664176, -3.125195026397705 ], [ 154.497116088867415, -3.124428987502995 ], [ 154.498367309570426, -3.124778032302743 ], [ 154.497955322265739, -3.126029014587346 ] ] ], [ [ [ 154.484085083008154, -3.124289989471436 ], [ 154.483261108398551, -3.12387299537653 ], [ 154.484710693359375, -3.121925115585213 ], [ 154.485076904296875, -3.123802900314331 ], [ 154.484085083008154, -3.124289989471436 ] ] ], [ [ [ 154.460403442382926, -3.115314960479623 ], [ 154.460052490234716, -3.117611885070744 ], [ 154.456176757812614, -3.115453958511353 ], [ 154.458328247070426, -3.113646984100285 ], [ 154.460403442382926, -3.115314960479623 ] ] ], [ [ [ 154.442733764648438, -3.113785982131958 ], [ 154.443008422852017, -3.111836910247803 ], [ 154.444259643554688, -3.110862016677856 ], [ 154.444747924804688, -3.11155891418457 ], [ 154.442733764648438, -3.113785982131958 ] ] ], [ [ [ 154.440933227539062, -3.115036964416447 ], [ 154.443145751953352, -3.119489908218327 ], [ 154.433807373046989, -3.109610080718937 ], [ 154.440521240234602, -3.112114906311035 ], [ 154.440933227539062, -3.115036964416447 ] ] ], [ [ [ 154.44024658203125, -3.105295896530095 ], [ 154.445297241211392, -3.10710597038269 ], [ 154.44537353515625, -3.110166072845402 ], [ 154.438919067382812, -3.1088449954986 ], [ 154.44024658203125, -3.105295896530095 ] ] ], [ [ [ 151.637985229492188, -3.042984008789006 ], [ 151.637084960937727, -3.041943073272648 ], [ 151.638259887695426, -3.041316032409668 ], [ 151.638473510742188, -3.042289018630981 ], [ 151.637985229492188, -3.042984008789006 ] ] ], [ [ [ 152.627426147460938, -3.03159308433527 ], [ 152.641387939453239, -3.067776918411198 ], [ 152.633926391601676, -3.114866018295288 ], [ 152.658340454101676, -3.118611097335702 ], [ 152.662353515625114, -3.137846946716252 ], [ 152.644165039062727, -3.220000028610173 ], [ 152.625549316406364, -3.227500915527344 ], [ 152.583053588867188, -3.176944971084538 ], [ 152.552780151367301, -3.165555953979492 ], [ 152.561111450195312, -3.14083194732666 ], [ 152.521942138671989, -3.091944932937565 ], [ 152.554718017578352, -3.050833940505925 ], [ 152.627426147460938, -3.03159308433527 ] ] ], [ [ [ 152.658615112304688, -3.027777910232487 ], [ 152.663055419922102, -3.029443979263249 ], [ 152.664443969726676, -3.035001039505005 ], [ 152.656951904297102, -3.032778024673462 ], [ 152.658615112304688, -3.027777910232487 ] ] ], [ [ [ 152.678070068359375, -3.026635885238647 ], [ 152.692504882812614, -3.029721975326481 ], [ 152.693893432617188, -3.035001039505005 ], [ 152.668060302734375, -3.030555963516179 ], [ 152.678070068359375, -3.026635885238647 ] ] ], [ [ [ 150.735839843750114, -2.9788880348205 ], [ 150.731948852539404, -2.998611927032471 ], [ 150.719299316406364, -3.000966072082463 ], [ 150.730560302734489, -2.983333110809326 ], [ 150.735839843750114, -2.9788880348205 ] ] ], [ [ [ 150.837570190429688, -2.971412897109929 ], [ 150.83056640625, -2.969628095626774 ], [ 150.830886840820426, -2.965652942657414 ], [ 150.839370727539062, -2.965926885604858 ], [ 150.837570190429688, -2.971412897109929 ] ] ], [ [ [ 152.657775878906364, -2.933610916137695 ], [ 152.671951293945312, -2.954722881317139 ], [ 152.649169921875, -2.966110944747868 ], [ 152.642501831054688, -2.953609943389893 ], [ 152.657775878906364, -2.933610916137695 ] ] ], [ [ [ 151.132293701171989, -2.903542041778564 ], [ 151.134567260742301, -2.906466007232666 ], [ 151.130569458007926, -2.911243915557861 ], [ 151.127777099609375, -2.904166936874333 ], [ 151.132293701171989, -2.903542041778564 ] ] ], [ [ [ 150.881942749023551, -2.90305495262146 ], [ 150.938049316406477, -2.926388025283813 ], [ 150.95916748046875, -2.957777023315373 ], [ 151.003890991210938, -2.966667890548649 ], [ 150.982223510742188, -2.979166030883675 ], [ 150.962783813476562, -2.965276956558171 ], [ 150.90028381347679, -2.97777795791626 ], [ 150.895416259765625, -2.962842941284123 ], [ 150.852493286133154, -2.972222089767342 ], [ 150.85945129394554, -2.962223052978459 ], [ 150.820556640625227, -2.952222108840942 ], [ 150.823883056640966, -2.970556020736694 ], [ 150.744445800781477, -2.985279083251953 ], [ 150.773330688476676, -2.952500104904175 ], [ 150.79499816894554, -2.957777023315373 ], [ 150.811660766601676, -2.933888912200928 ], [ 150.881942749023551, -2.90305495262146 ] ] ], [ [ [ 152.6552734375, -2.76583194732666 ], [ 152.672225952148892, -2.785834074020386 ], [ 152.65155029296875, -2.799235105514526 ], [ 152.641937255859489, -2.777498960494938 ], [ 152.6552734375, -2.76583194732666 ] ] ], [ [ [ 150.787506103515625, -2.737221956252995 ], [ 150.786117553711279, -2.735555887222176 ], [ 150.787216186523438, -2.734165906906071 ], [ 150.788192749023551, -2.735555887222176 ], [ 150.787506103515625, -2.737221956252995 ] ] ], [ [ [ 150.714721679687614, -2.721111059188843 ], [ 150.713333129882926, -2.722498893737793 ], [ 150.711944580078125, -2.722223043441772 ], [ 150.713897705078352, -2.719238042831421 ], [ 150.714721679687614, -2.721111059188843 ] ] ], [ [ [ 150.631942749023551, -2.705277919769287 ], [ 150.678054809570426, -2.718055009841919 ], [ 150.714065551757812, -2.750716924667358 ], [ 150.653976440429688, -2.740343093872013 ], [ 150.628982543945312, -2.72143292427063 ], [ 150.631942749023551, -2.705277919769287 ] ] ], [ [ [ 151.920562744140625, -2.701666116714421 ], [ 151.977355957031477, -2.721179962158203 ], [ 152.006942749023892, -2.75527811050415 ], [ 151.993896484375, -2.766109943389893 ], [ 152.009719848632812, -2.776945114135742 ], [ 152.005279541015739, -2.797223091125488 ], [ 151.980026245117415, -2.803139925002995 ], [ 151.98500061035179, -2.817222118377686 ], [ 152.001388549804915, -2.802499055862427 ], [ 152.004165649414062, -2.818331956863346 ], [ 151.995834350586051, -2.831945896148682 ], [ 151.966110229492415, -2.830832958221436 ], [ 152.005859375000114, -2.893439054489136 ], [ 152.057785034179688, -2.908611059188843 ], [ 152.076385498046989, -2.930001020431519 ], [ 152.07208251953125, -2.973449945449715 ], [ 152.050003051757926, -2.998889923095703 ], [ 152.002502441406477, -2.964998960494938 ], [ 151.990554809570426, -2.905833005905151 ], [ 151.962493896484602, -2.905555009841919 ], [ 151.941940307617301, -2.884166955947819 ], [ 151.95960998535179, -2.841536045074406 ], [ 151.9410400390625, -2.850619077682495 ], [ 151.9122314453125, -2.821971893310547 ], [ 151.923400878906705, -2.810647010803223 ], [ 151.905563354492188, -2.789484977722111 ], [ 151.934173583984375, -2.754164934158268 ], [ 151.908615112304688, -2.711666107177734 ], [ 151.920562744140625, -2.701666116714421 ] ] ], [ [ [ 150.643615722656364, -2.693888902664128 ], [ 150.647506713867188, -2.699721097946167 ], [ 150.639450073242188, -2.704721927642822 ], [ 150.63722229003929, -2.699443101882935 ], [ 150.643615722656364, -2.693888902664128 ] ] ], [ [ [ 150.763351440430142, -2.695826053619328 ], [ 150.760284423828352, -2.690001010894719 ], [ 150.765518188476904, -2.685944080352726 ], [ 150.766967773437727, -2.691414117813054 ], [ 150.763351440430142, -2.695826053619328 ] ] ], [ [ [ 150.753890991210938, -2.684165954589844 ], [ 150.752777099609375, -2.683887958526611 ], [ 150.754440307617301, -2.682777881622314 ], [ 150.75471496582054, -2.683887958526611 ], [ 150.753890991210938, -2.684165954589844 ] ] ], [ [ [ 150.717773437500114, -2.675833940505981 ], [ 150.734161376953352, -2.698889970779419 ], [ 150.698333740234375, -2.725554943084717 ], [ 150.68695068359375, -2.688611030578613 ], [ 150.717773437500114, -2.675833940505981 ] ] ], [ [ [ 150.6319580078125, -2.674396038055363 ], [ 150.639511108398665, -2.675378084182739 ], [ 150.640762329101676, -2.681957960128784 ], [ 150.631820678710938, -2.68261194229126 ], [ 150.6319580078125, -2.674396038055363 ] ] ], [ [ [ 150.734451293945312, -2.67222094535822 ], [ 150.741104125976904, -2.679444074630624 ], [ 150.73333740234375, -2.685000896453857 ], [ 150.728057861328352, -2.674721956253052 ], [ 150.734451293945312, -2.67222094535822 ] ] ], [ [ [ 150.772537231445312, -2.677896022796631 ], [ 150.770828247070426, -2.673748016357365 ], [ 150.772323608398551, -2.67024302482605 ], [ 150.773574829101562, -2.672843933105469 ], [ 150.772537231445312, -2.677896022796631 ] ] ], [ [ [ 150.325363159179915, -2.673955917358342 ], [ 150.321380615234489, -2.674359083175602 ], [ 150.318450927734375, -2.671881914138794 ], [ 150.327178955078239, -2.669486045837402 ], [ 150.325363159179915, -2.673955917358342 ] ] ], [ [ [ 150.61648559570358, -2.677779912948552 ], [ 150.612533569336051, -2.675497055053654 ], [ 150.616333007812614, -2.669014930725098 ], [ 150.619842529296875, -2.673393011093083 ], [ 150.61648559570358, -2.677779912948552 ] ] ], [ [ [ 150.582504272461165, -2.664722919464111 ], [ 150.586669921875227, -2.66833305358881 ], [ 150.580825805664176, -2.675277948379517 ], [ 150.576950073242415, -2.668611049652043 ], [ 150.582504272461165, -2.664722919464111 ] ] ], [ [ [ 150.538330078125114, -2.664444923400879 ], [ 150.607391357421989, -2.683820009231511 ], [ 150.587265014648551, -2.730407953262329 ], [ 150.55877685546875, -2.691847085952702 ], [ 150.52362060546875, -2.680659055709839 ], [ 150.538330078125114, -2.664444923400879 ] ] ], [ [ [ 150.7342529296875, -2.665400028228703 ], [ 150.732559204101562, -2.665122032165471 ], [ 150.732421875000227, -2.66402792930603 ], [ 150.734771728515625, -2.663841009139958 ], [ 150.7342529296875, -2.665400028228703 ] ] ], [ [ [ 150.336944580078125, -2.672498941421452 ], [ 150.333312988281591, -2.670535087585449 ], [ 150.333206176757926, -2.662293910980225 ], [ 150.336441040039176, -2.664537906646672 ], [ 150.336944580078125, -2.672498941421452 ] ] ], [ [ [ 150.471115112304915, -2.660001039504891 ], [ 150.486389160156477, -2.668611049652043 ], [ 150.466384887695426, -2.677500009536743 ], [ 150.462493896484375, -2.661945104598942 ], [ 150.471115112304915, -2.660001039504891 ] ] ], [ [ [ 150.519882202148438, -2.65842604637146 ], [ 150.518646240234489, -2.658215999603215 ], [ 150.520858764648438, -2.655988931655827 ], [ 150.521057128906477, -2.657104015350342 ], [ 150.519882202148438, -2.65842604637146 ] ] ], [ [ [ 150.455551147461051, -2.654165983200073 ], [ 150.457504272460938, -2.66944503784174 ], [ 150.439437866211051, -2.669720888137761 ], [ 150.43499755859375, -2.658888101577759 ], [ 150.455551147461051, -2.654165983200073 ] ] ], [ [ [ 150.686386108398438, -2.664166927337646 ], [ 150.676940917968977, -2.664444923400879 ], [ 150.683700561523438, -2.651665925979614 ], [ 150.690551757812614, -2.656944036483765 ], [ 150.686386108398438, -2.664166927337646 ] ] ], [ [ [ 150.663909912109375, -2.659547090530396 ], [ 150.661575317382812, -2.655966997146606 ], [ 150.664382934570312, -2.651505947113037 ], [ 150.667221069336392, -2.655303001403752 ], [ 150.663909912109375, -2.659547090530396 ] ] ], [ [ [ 150.774993896484489, -2.651387929916382 ], [ 150.774169921875227, -2.650000095367432 ], [ 150.775558471680142, -2.649722099304199 ], [ 150.776107788086165, -2.650278091430664 ], [ 150.774993896484489, -2.651387929916382 ] ] ], [ [ [ 150.564422607421989, -2.651823043823242 ], [ 150.563140869140739, -2.650232076644897 ], [ 150.565414428711051, -2.649643898010197 ], [ 150.565567016601676, -2.651309967040959 ], [ 150.564422607421989, -2.651823043823242 ] ] ], [ [ [ 150.527221679687955, -2.651665925979614 ], [ 150.526947021484375, -2.649722099304199 ], [ 150.528823852539062, -2.648890018463078 ], [ 150.528610229492301, -2.650000095367432 ], [ 150.527221679687955, -2.651665925979614 ] ] ], [ [ [ 150.640838623047102, -2.647778034210205 ], [ 150.649169921875341, -2.659167051315251 ], [ 150.632507324219205, -2.668889045715275 ], [ 150.628890991211051, -2.654443979263306 ], [ 150.640838623047102, -2.647778034210205 ] ] ], [ [ [ 150.5755615234375, -2.643889904022103 ], [ 150.579162597656364, -2.649166107177734 ], [ 150.574172973632812, -2.657222032546997 ], [ 150.569717407226676, -2.650834083557129 ], [ 150.5755615234375, -2.643889904022103 ] ] ], [ [ [ 150.713058471679801, -2.641388893127441 ], [ 150.729919433593977, -2.642543077468872 ], [ 150.733016967773665, -2.650166034698486 ], [ 150.720321655273438, -2.651971101760807 ], [ 150.713058471679801, -2.641388893127441 ] ] ], [ [ [ 150.84492492675804, -2.640240907669011 ], [ 150.843887329101676, -2.638889074325448 ], [ 150.845993041992301, -2.638431072235051 ], [ 150.8458251953125, -2.639775991439762 ], [ 150.84492492675804, -2.640240907669011 ] ] ], [ [ [ 150.4954833984375, -2.636632919311523 ], [ 150.501342773437614, -2.659432888031006 ], [ 150.498641967773438, -2.663604021072388 ], [ 150.483337402343977, -2.648890018463078 ], [ 150.4954833984375, -2.636632919311523 ] ] ], [ [ [ 150.641693115234375, -2.639339923858529 ], [ 150.640090942382926, -2.637923002243042 ], [ 150.643127441406477, -2.636051893234139 ], [ 150.643173217773665, -2.637883901596012 ], [ 150.641693115234375, -2.639339923858529 ] ] ], [ [ [ 149.661392211914062, -2.631944894790649 ], [ 149.666244506836392, -2.633820056915283 ], [ 149.664718627930142, -2.640554904937744 ], [ 149.656112670898665, -2.63305401802063 ], [ 149.661392211914062, -2.631944894790649 ] ] ], [ [ [ 150.769714355469091, -2.641756057739144 ], [ 150.763092041015625, -2.637633085250854 ], [ 150.764556884765739, -2.631043910980168 ], [ 150.7701416015625, -2.63820290565485 ], [ 150.769714355469091, -2.641756057739144 ] ] ], [ [ [ 149.679718017578125, -2.623889923095703 ], [ 149.682983398437614, -2.625622034072819 ], [ 149.671035766601562, -2.633332967758179 ], [ 149.67195129394554, -2.627429962158203 ], [ 149.679718017578125, -2.623889923095703 ] ] ], [ [ [ 150.626449584961051, -2.637212038040047 ], [ 150.629440307617415, -2.624531030654907 ], [ 150.638671875000114, -2.619591951370239 ], [ 150.63874816894554, -2.621090888977051 ], [ 150.626449584961051, -2.637212038040047 ] ] ], [ [ [ 150.534774780273438, -2.637706041336003 ], [ 150.527847290039176, -2.625448942184448 ], [ 150.531372070312614, -2.619008064269963 ], [ 150.540496826171875, -2.627213001251164 ], [ 150.534774780273438, -2.637706041336003 ] ] ], [ [ [ 150.453781127929915, -2.632539033889657 ], [ 150.448333740234375, -2.624722003936711 ], [ 150.451553344726676, -2.615062952041512 ], [ 150.456558227539062, -2.625763893127441 ], [ 150.453781127929915, -2.632539033889657 ] ] ], [ [ [ 150.455184936523551, -2.618139982223454 ], [ 150.45429992675804, -2.616939067840576 ], [ 150.455596923828125, -2.614918947219849 ], [ 150.456954956054688, -2.616252899169922 ], [ 150.455184936523551, -2.618139982223454 ] ] ], [ [ [ 150.738052368164404, -2.616389036178589 ], [ 150.737228393554801, -2.616389036178589 ], [ 150.73638916015625, -2.614721059799194 ], [ 150.738052368164404, -2.615277051925659 ], [ 150.738052368164404, -2.616389036178589 ] ] ], [ [ [ 150.447052001953352, -2.616334915161133 ], [ 150.444549560546875, -2.616125106811523 ], [ 150.445037841796875, -2.614176034927368 ], [ 150.445724487304915, -2.613966941833496 ], [ 150.447052001953352, -2.616334915161133 ] ] ], [ [ [ 150.459991455078125, -2.619831085205078 ], [ 150.456817626953352, -2.618550062179565 ], [ 150.460311889648551, -2.613600015640259 ], [ 150.461273193359489, -2.618289947509766 ], [ 150.459991455078125, -2.619831085205078 ] ] ], [ [ [ 150.673461914062727, -2.621504068374634 ], [ 150.675964355468977, -2.615433931350651 ], [ 150.680984497070312, -2.613053083419743 ], [ 150.68055725097679, -2.61581110954279 ], [ 150.673461914062727, -2.621504068374634 ] ] ], [ [ [ 150.478790283203239, -2.620330095291138 ], [ 150.476959228515625, -2.616967916488591 ], [ 150.479644775390625, -2.61230993270874 ], [ 150.481597900390739, -2.617398977279663 ], [ 150.478790283203239, -2.620330095291138 ] ] ], [ [ [ 150.45033264160179, -2.611355066299438 ], [ 150.451873779297102, -2.614268064498901 ], [ 150.446395874023551, -2.613610982894897 ], [ 150.44667053222679, -2.611110925674438 ], [ 150.45033264160179, -2.611355066299438 ] ] ], [ [ [ 150.610855102539062, -2.640500068664551 ], [ 150.608322143554801, -2.658854007720947 ], [ 150.573333740234489, -2.625277996063176 ], [ 150.596435546875227, -2.606770992279053 ], [ 150.610855102539062, -2.640500068664551 ] ] ], [ [ [ 150.45062255859375, -2.607404947280884 ], [ 150.448501586914176, -2.605823040008488 ], [ 150.451263427734489, -2.604646921157837 ], [ 150.452026367187614, -2.606229066848755 ], [ 150.45062255859375, -2.607404947280884 ] ] ], [ [ [ 150.453338623046875, -2.605000972747746 ], [ 150.451950073242529, -2.6038880348205 ], [ 150.453048706054688, -2.602499961853027 ], [ 150.454162597656477, -2.603610038757267 ], [ 150.453338623046875, -2.605000972747746 ] ] ], [ [ [ 150.589172363281364, -2.601387977600041 ], [ 150.56721496582054, -2.631387948989811 ], [ 150.546951293945312, -2.636945009231567 ], [ 150.562774658203125, -2.631109952926579 ], [ 150.589172363281364, -2.601387977600041 ] ] ], [ [ [ 149.706939697265966, -2.600555896759033 ], [ 149.71638488769554, -2.608889102935791 ], [ 149.69610595703125, -2.623333930969238 ], [ 149.703887939453466, -2.600833892822266 ], [ 149.706939697265966, -2.600555896759033 ] ] ], [ [ [ 150.768325805664176, -2.606667041778564 ], [ 150.767257690429688, -2.603575944900456 ], [ 150.768890380859489, -2.599026918411198 ], [ 150.771118164062727, -2.604722976684513 ], [ 150.768325805664176, -2.606667041778564 ] ] ], [ [ [ 151.97944641113304, -2.591667890548706 ], [ 152.019165039062614, -2.608333110809326 ], [ 152.027221679687614, -2.636945009231567 ], [ 152.014999389648551, -2.660554885864258 ], [ 151.943603515625227, -2.658888101577759 ], [ 151.947769165039176, -2.624025106429997 ], [ 151.97944641113304, -2.591667890548706 ] ] ], [ [ [ 150.463668823242301, -2.590471029281559 ], [ 150.463638305664062, -2.59856200218195 ], [ 150.452362060546875, -2.596781969070435 ], [ 150.455352783203239, -2.591308116912785 ], [ 150.463668823242301, -2.590471029281559 ] ] ], [ [ [ 150.538604736328352, -2.580276966094914 ], [ 150.55024719238304, -2.592431068420296 ], [ 150.54351806640625, -2.610799074172974 ], [ 150.523880004882812, -2.603327989578247 ], [ 150.538604736328352, -2.580276966094914 ] ] ], [ [ [ 150.783050537109489, -2.566665887832642 ], [ 150.784729003906364, -2.572777986526489 ], [ 150.778884887695312, -2.586667060852051 ], [ 150.771942138671989, -2.581666946411076 ], [ 150.783050537109489, -2.566665887832642 ] ] ], [ [ [ 150.490539550781477, -2.566143989562988 ], [ 150.494049072265739, -2.574275970458928 ], [ 150.486968994140852, -2.588202953338623 ], [ 150.476730346679801, -2.57431697845459 ], [ 150.490539550781477, -2.566143989562988 ] ] ], [ [ [ 150.48695373535179, -2.564604997634888 ], [ 150.486480712890625, -2.562549114227295 ], [ 150.489578247070312, -2.563292026519775 ], [ 150.488510131836051, -2.564153909683171 ], [ 150.48695373535179, -2.564604997634888 ] ] ], [ [ [ 150.798828125000455, -2.553205013275146 ], [ 150.847885131836051, -2.607379913329964 ], [ 150.930633544921989, -2.651823043823242 ], [ 150.950836181640852, -2.683887958526611 ], [ 151.021392822265852, -2.687222957611027 ], [ 151.053894042968864, -2.74555492401123 ], [ 151.080535888672102, -2.74025106430048 ], [ 151.122772216796875, -2.779375076293832 ], [ 151.156661987304801, -2.776388883590585 ], [ 151.186386108398665, -2.80472111701954 ], [ 151.184448242187614, -2.852222919464111 ], [ 151.214340209960938, -2.873032093048096 ], [ 151.300277709961051, -2.866944074630737 ], [ 151.32916259765625, -2.876389026641789 ], [ 151.342498779296875, -2.90500092506403 ], [ 151.413604736328239, -2.900835037231388 ], [ 151.482452392578125, -2.973366022109985 ], [ 151.51055908203125, -2.970000028610229 ], [ 151.541107177734602, -2.997499942779541 ], [ 151.563049316406477, -2.993333101272583 ], [ 151.582138061523551, -3.021915912628117 ], [ 151.672500610351562, -3.045277118682861 ], [ 151.71296691894554, -3.117927074432316 ], [ 151.74580383300804, -3.140463113784733 ], [ 151.772018432617301, -3.128134965896606 ], [ 151.771835327148779, -3.159363985061646 ], [ 151.802688598632812, -3.191649913787785 ], [ 151.858245849609375, -3.18480396270752 ], [ 151.880416870117188, -3.200598001480103 ], [ 151.939010620117415, -3.202599048614502 ], [ 151.957260131835938, -3.238279104232788 ], [ 151.993423461914062, -3.22890305519104 ], [ 152.021408081054915, -3.247392892837411 ], [ 152.047897338867415, -3.24199199676508 ], [ 152.048080444336165, -3.279870986938477 ], [ 152.104827880859489, -3.31892204284668 ], [ 152.202117919921989, -3.45183610916132 ], [ 152.351150512695312, -3.533580064773503 ], [ 152.3499755859375, -3.584161043167114 ], [ 152.391342163086279, -3.599570035934391 ], [ 152.416305541992301, -3.671366930007935 ], [ 152.477233886718977, -3.63596510887146 ], [ 152.492324829101676, -3.640706062316781 ], [ 152.544174194335938, -3.743055105209351 ], [ 152.531951904296875, -3.782500028610173 ], [ 152.553604125976676, -3.811666011810303 ], [ 152.638229370117301, -3.821908950805607 ], [ 152.684768676757926, -3.872152090072632 ], [ 152.746917724609375, -3.890182018280029 ], [ 152.791900634765625, -3.855499029159546 ], [ 152.820968627929915, -3.863190889358521 ], [ 152.825637817382926, -3.936125040054264 ], [ 152.851119995117415, -3.976382017135563 ], [ 152.900421142578125, -3.997499942779484 ], [ 152.933914184570767, -3.977674007415771 ], [ 152.943603515625114, -4.037498950958195 ], [ 152.994445800781591, -4.095276832580566 ], [ 153.006393432617642, -4.097220897674561 ], [ 153.016326904296989, -4.140431880950871 ], [ 153.038894653320312, -4.155556201934758 ], [ 153.033615112304915, -4.189166069030762 ], [ 153.060180664062955, -4.21083402633667 ], [ 153.090301513672102, -4.219204902648812 ], [ 153.104644775390625, -4.242837905883789 ], [ 153.11604309082054, -4.273412227630615 ], [ 153.102218627929688, -4.340834140777474 ], [ 153.118896484375227, -4.375 ], [ 153.052780151367301, -4.427948951721135 ], [ 153.025100708007926, -4.477415084838867 ], [ 153.033172607421875, -4.509377956390381 ], [ 153.062744140625, -4.529520988464355 ], [ 153.060562133789517, -4.598054885864258 ], [ 153.017089843750114, -4.635731220245304 ], [ 153.015243530273438, -4.683358192443734 ], [ 152.990356445312727, -4.685588836669865 ], [ 152.966949462890739, -4.748333930969238 ], [ 152.922119140625, -4.781452178955021 ], [ 152.928329467773665, -4.798056125640869 ], [ 152.894058227539176, -4.788510799407959 ], [ 152.897872924804801, -4.829925060272217 ], [ 152.878616333007926, -4.851665019989014 ], [ 152.858413696289062, -4.770492076873779 ], [ 152.832885742187614, -4.770566940307617 ], [ 152.808288574219091, -4.735227108001652 ], [ 152.790283203125227, -4.737777233123666 ], [ 152.802215576171875, -4.725833892822209 ], [ 152.770065307617415, -4.679481029510441 ], [ 152.724731445312614, -4.667931079864502 ], [ 152.707992553710938, -4.572451114654484 ], [ 152.676864624023551, -4.552985191345215 ], [ 152.674407958984375, -4.497439861297551 ], [ 152.649917602539176, -4.453497886657715 ], [ 152.67445373535179, -4.426073074340763 ], [ 152.684692382812841, -4.374653816223031 ], [ 152.690185546875, -4.295265197753849 ], [ 152.67140197753929, -4.208229064941406 ], [ 152.685516357422102, -4.180573940277043 ], [ 152.614166259765625, -4.089723110198975 ], [ 152.612060546875, -4.034658908843994 ], [ 152.564727783203125, -3.95194506645197 ], [ 152.533828735351562, -3.928544998168888 ], [ 152.50250244140625, -3.856664896011296 ], [ 152.446487426757812, -3.82443189620966 ], [ 152.357299804687727, -3.711474895477295 ], [ 152.342025756836051, -3.687028884887695 ], [ 152.344451904296875, -3.643606901168823 ], [ 152.297058105468864, -3.617356061935368 ], [ 152.265823364257926, -3.566948890686035 ], [ 152.22950744628929, -3.555130958557072 ], [ 152.22430419921875, -3.533761978149414 ], [ 152.143508911133267, -3.482561111450195 ], [ 152.070236206054915, -3.479933023452759 ], [ 152.0, -3.443438053131104 ], [ 151.977874755859375, -3.459646940231323 ], [ 151.907348632812727, -3.433001041412297 ], [ 151.800460815429688, -3.341722011566105 ], [ 151.769485473632926, -3.323215961456185 ], [ 151.717529296875, -3.302552938461304 ], [ 151.623168945312727, -3.181358098983765 ], [ 151.466537475586165, -3.117628097534123 ], [ 151.426986694336279, -3.056335926055908 ], [ 151.342391967773665, -3.003879070281926 ], [ 151.292221069336051, -2.991389036178589 ], [ 151.170272827148438, -2.901109933853093 ], [ 151.142501831054915, -2.904444932937565 ], [ 151.096664428710938, -2.841871023178044 ], [ 151.026107788085938, -2.829720973968506 ], [ 150.979476928710938, -2.779498100280762 ], [ 150.9244384765625, -2.776110887527352 ], [ 150.903640747070312, -2.757556915283146 ], [ 150.908676147461165, -2.768289089202824 ], [ 150.81182861328125, -2.788510084152165 ], [ 150.719497680664176, -2.751703977584839 ], [ 150.70166015625, -2.731112003326359 ], [ 150.714004516601676, -2.725548982620239 ], [ 150.729095458984375, -2.707887887954655 ], [ 150.786621093750455, -2.738106966018563 ], [ 150.78889465332054, -2.736943960189762 ], [ 150.792221069336279, -2.730278015136662 ], [ 150.789718627929801, -2.717777013778687 ], [ 150.812805175781364, -2.713635921478215 ], [ 150.821350097656364, -2.69060301780695 ], [ 150.87416076660179, -2.700278043746891 ], [ 150.856384277343864, -2.692223072052002 ], [ 150.889724731445312, -2.680834054946899 ], [ 150.860549926757812, -2.670277118682861 ], [ 150.862777709961051, -2.684443950653076 ], [ 150.847503662109489, -2.691111087799072 ], [ 150.856521606445312, -2.682499885559082 ], [ 150.841384887695312, -2.663888931274414 ], [ 150.867218017578125, -2.655832052230835 ], [ 150.869720458984602, -2.640832901000977 ], [ 150.850830078125, -2.648612022399846 ], [ 150.848052978515739, -2.6372230052948 ], [ 150.844451904296989, -2.635277032852059 ], [ 150.822250366211051, -2.649701118469238 ], [ 150.776107788086165, -2.616667985916138 ], [ 150.798828125000455, -2.553205013275146 ] ] ], [ [ [ 149.944442749023438, -2.483125925064087 ], [ 149.943054199218864, -2.483334064483643 ], [ 149.940826416015625, -2.480277061462402 ], [ 149.942230224609602, -2.479861974716187 ], [ 149.944442749023438, -2.483125925064087 ] ] ], [ [ [ 150.513458251953352, -2.483141899108887 ], [ 150.544342041015739, -2.546983003616276 ], [ 150.545761108398551, -2.571979999542179 ], [ 150.48847961425804, -2.479717016220036 ], [ 150.513458251953352, -2.483141899108887 ] ] ], [ [ [ 150.490829467773551, -2.475001096725407 ], [ 150.478057861328239, -2.473889112472534 ], [ 150.48193359375, -2.461244106292725 ], [ 150.49305725097679, -2.465277910232487 ], [ 150.490829467773551, -2.475001096725407 ] ] ], [ [ [ 150.356674194336165, -2.436111927032357 ], [ 150.35861206054733, -2.438055992126408 ], [ 150.358062744140625, -2.439722061157227 ], [ 150.355331420898551, -2.43769192695612 ], [ 150.356674194336165, -2.436111927032357 ] ] ], [ [ [ 150.009246826171989, -2.429126977920532 ], [ 150.001235961914176, -2.435395956039372 ], [ 149.997497558593977, -2.432499885558968 ], [ 150.000839233398551, -2.428745985031128 ], [ 150.009246826171989, -2.429126977920532 ] ] ], [ [ [ 150.447219848632812, -2.433056116104126 ], [ 150.477218627929915, -2.453054904937744 ], [ 150.477081298828125, -2.469585895538216 ], [ 150.432785034179915, -2.425832986831665 ], [ 150.447219848632812, -2.433056116104126 ] ] ], [ [ [ 150.331939697265625, -2.426110982894897 ], [ 150.330551147461165, -2.424444913864079 ], [ 150.332916259765739, -2.42361307144165 ], [ 150.333343505859375, -2.424823999404907 ], [ 150.331939697265625, -2.426110982894897 ] ] ], [ [ [ 150.035278320312614, -2.422498941421509 ], [ 150.038604736328239, -2.425554990768433 ], [ 150.034439086914062, -2.427221059799081 ], [ 150.033340454101562, -2.424998998641968 ], [ 150.035278320312614, -2.422498941421509 ] ] ], [ [ [ 150.007781982421875, -2.422223091125488 ], [ 150.00917053222679, -2.423610925674438 ], [ 150.005004882812614, -2.42638897895813 ], [ 150.003890991211051, -2.423054933547974 ], [ 150.007781982421875, -2.422223091125488 ] ] ], [ [ [ 150.021926879882926, -2.419392108917179 ], [ 150.022033691406591, -2.413003921508789 ], [ 150.023956298828125, -2.412060022354126 ], [ 150.025161743164176, -2.414627075195256 ], [ 150.021926879882926, -2.419392108917179 ] ] ], [ [ [ 150.41749572753929, -2.411943912506104 ], [ 150.42860412597679, -2.420279026031494 ], [ 150.431594848632812, -2.428960084915161 ], [ 150.410827636718864, -2.418055057525635 ], [ 150.41749572753929, -2.411943912506104 ] ] ], [ [ [ 150.040802001953239, -2.406392097473145 ], [ 150.037261962890739, -2.402715921401921 ], [ 150.04365539550804, -2.398663997650146 ], [ 150.045074462890625, -2.400305032730046 ], [ 150.040802001953239, -2.406392097473145 ] ] ], [ [ [ 150.063613891601904, -2.393610954284611 ], [ 150.062088012695654, -2.392918109893799 ], [ 150.063903808593977, -2.391381978988647 ], [ 150.064727783203239, -2.39250111579895 ], [ 150.063613891601904, -2.393610954284611 ] ] ], [ [ [ 150.098968505859602, -2.385445117950383 ], [ 150.093536376953239, -2.381819009780827 ], [ 150.094406127929801, -2.37813496589655 ], [ 150.105102539062727, -2.380673885345459 ], [ 150.098968505859602, -2.385445117950383 ] ] ], [ [ [ 150.238250732422102, -2.378281116485539 ], [ 150.235504150390625, -2.374869108200016 ], [ 150.241775512695312, -2.372113943099976 ], [ 150.24371337890625, -2.375633001327515 ], [ 150.238250732422102, -2.378281116485539 ] ] ], [ [ [ 150.341110229492301, -2.366945028304997 ], [ 150.343612670898779, -2.369167089462223 ], [ 150.342773437500227, -2.370554924011117 ], [ 150.339447021484375, -2.368611097335759 ], [ 150.341110229492301, -2.366945028304997 ] ] ], [ [ [ 150.120635986328239, -2.363054037094116 ], [ 150.125625610351562, -2.366381883621159 ], [ 150.117752075195426, -2.370805978775024 ], [ 150.11427307128929, -2.365875959396249 ], [ 150.120635986328239, -2.363054037094116 ] ] ], [ [ [ 150.202499389648438, -2.366945028304997 ], [ 150.258346557617301, -2.392250061035156 ], [ 150.267669677734489, -2.412111043930054 ], [ 150.340637207031364, -2.43113899230957 ], [ 150.423736572265625, -2.481323003768864 ], [ 150.441345214843864, -2.477108955383244 ], [ 150.43939208984375, -2.558155059814396 ], [ 150.451934814453239, -2.527503013610783 ], [ 150.463516235352017, -2.540751934051514 ], [ 150.438552856445312, -2.61929988861084 ], [ 150.448059082031477, -2.65305590629572 ], [ 150.343399047851676, -2.68022608757019 ], [ 150.374588012695426, -2.66106104850769 ], [ 150.344802856445312, -2.670007944106999 ], [ 150.335586547851676, -2.652400016784668 ], [ 150.315628051757812, -2.672993898391724 ], [ 150.2618408203125, -2.658607959747314 ], [ 150.171951293945654, -2.681008100509644 ], [ 150.099716186523438, -2.61972188949585 ], [ 150.062103271484375, -2.532802104949951 ], [ 150.02166748046875, -2.501667022705078 ], [ 150.010772705078239, -2.513057947158813 ], [ 149.959716796875, -2.503055095672607 ], [ 149.946334838867188, -2.481288909912053 ], [ 149.959121704101562, -2.452316999435425 ], [ 149.970306396484375, -2.491887092590275 ], [ 149.998748779296989, -2.452547073364144 ], [ 150.048049926757926, -2.434443950653019 ], [ 150.068603515625, -2.403901100158691 ], [ 150.087570190429915, -2.417203903198242 ], [ 150.10638427734375, -2.39527702331543 ], [ 150.14349365234375, -2.40581107139576 ], [ 150.142776489257812, -2.381387948989868 ], [ 150.167953491210938, -2.390512943267822 ], [ 150.168121337890739, -2.368766069412175 ], [ 150.202499389648438, -2.366945028304997 ] ] ], [ [ [ 150.143585205078125, -2.352658987045288 ], [ 150.140701293945312, -2.34922194480896 ], [ 150.147109985351562, -2.348177909851074 ], [ 150.147216796875227, -2.350845098495427 ], [ 150.143585205078125, -2.352658987045288 ] ] ], [ [ [ 150.308883666992301, -2.340832948684692 ], [ 150.315277099609489, -2.346389055251962 ], [ 150.31166076660179, -2.357222080230713 ], [ 150.301666259765625, -2.347776889801025 ], [ 150.308883666992301, -2.340832948684692 ] ] ], [ [ [ 150.026672363281477, -1.681112051010132 ], [ 150.025711059570312, -1.679587006568909 ], [ 150.0302734375, -1.675554990768376 ], [ 150.03054809570358, -1.677220940589848 ], [ 150.026672363281477, -1.681112051010132 ] ] ], [ [ [ 149.942855834961051, -1.675209045410156 ], [ 149.94500732421875, -1.676390051841736 ], [ 149.943328857422102, -1.678056001663208 ], [ 149.941665649414517, -1.675832986831551 ], [ 149.942855834961051, -1.675209045410156 ] ] ], [ [ [ 149.905273437500114, -1.674792051315251 ], [ 149.909439086914176, -1.678889989852848 ], [ 149.904449462890852, -1.682778000831604 ], [ 149.901672363281364, -1.678123950958195 ], [ 149.905273437500114, -1.674792051315251 ] ] ], [ [ [ 149.945831298828352, -1.673784971237183 ], [ 149.935607910156364, -1.675181984901428 ], [ 149.938430786132926, -1.691898941993713 ], [ 149.911117553711165, -1.679165959358215 ], [ 149.919967651367301, -1.667919993400574 ], [ 149.907058715820312, -1.650210976600647 ], [ 149.945831298828352, -1.673784971237183 ] ] ], [ [ [ 150.673889160156477, -1.653056025505009 ], [ 150.670562744140625, -1.650833964347783 ], [ 150.671951293945426, -1.644999027252197 ], [ 150.676376342773892, -1.648064017295724 ], [ 150.673889160156477, -1.653056025505009 ] ] ], [ [ [ 149.945831298828352, -1.673784971237183 ], [ 149.955932617187614, -1.622807025909367 ], [ 149.978683471679801, -1.638296008110046 ], [ 149.982666015625227, -1.667070031166077 ], [ 150.026458740234375, -1.670377016067391 ], [ 150.006393432617529, -1.688133955001831 ], [ 149.945831298828352, -1.673784971237183 ] ] ], [ [ [ 149.61396789550804, -1.574331998825073 ], [ 149.612243652343977, -1.573912978172245 ], [ 149.614318847656364, -1.572103023528939 ], [ 149.615005493164404, -1.572939991950989 ], [ 149.61396789550804, -1.574331998825073 ] ] ], [ [ [ 149.573150634765852, -1.566715002059937 ], [ 149.601455688476676, -1.574934005737305 ], [ 149.59980773925804, -1.58482301235199 ], [ 149.58346557617233, -1.586493968963623 ], [ 149.573150634765852, -1.566715002059937 ] ] ], [ [ [ 149.589950561523892, -1.560682058334294 ], [ 149.588165283203125, -1.55747997760767 ], [ 149.594253540039062, -1.553442001342773 ], [ 149.596267700195312, -1.55594897270197 ], [ 149.589950561523892, -1.560682058334294 ] ] ], [ [ [ 149.622909545898551, -1.554275989532471 ], [ 149.638275146484716, -1.559429049491825 ], [ 149.661239624023551, -1.595152020454407 ], [ 149.602478027343977, -1.557618975639343 ], [ 149.622909545898551, -1.554275989532471 ] ] ], [ [ [ 149.659591674804688, -1.55692195892334 ], [ 149.655014038085938, -1.55594897270197 ], [ 149.656951904296989, -1.550237059593087 ], [ 149.661666870117642, -1.553509950637817 ], [ 149.659591674804688, -1.55692195892334 ] ] ], [ [ [ 149.645599365234489, -1.545642018318119 ], [ 149.638549804687614, -1.547868967056274 ], [ 149.654953002929801, -1.531016945838928 ], [ 149.656326293945767, -1.536241054534855 ], [ 149.645599365234489, -1.545642018318119 ] ] ], [ [ [ 149.66290283203125, -1.534500002861023 ], [ 149.659591674804688, -1.530042052268982 ], [ 149.662216186523665, -1.525864005088749 ], [ 149.66595458984375, -1.529207944869995 ], [ 149.66290283203125, -1.534500002861023 ] ] ], [ [ [ 149.586776733398779, -1.52642202377308 ], [ 149.587738037109375, -1.529485940933228 ], [ 149.57916259765625, -1.52642202377308 ], [ 149.581787109375114, -1.523776054382267 ], [ 149.586776733398779, -1.52642202377308 ] ] ], [ [ [ 149.657302856445312, -1.518831014633122 ], [ 149.657714843750114, -1.512217044830265 ], [ 149.662490844726676, -1.510822057723999 ], [ 149.660003662109489, -1.517508983611947 ], [ 149.657302856445312, -1.518831014633122 ] ] ], [ [ [ 149.604003906250227, -1.519286036491394 ], [ 149.596282958984489, -1.515979051589966 ], [ 149.593063354492301, -1.50988495349884 ], [ 149.603378295898438, -1.511904001235962 ], [ 149.604003906250227, -1.519286036491394 ] ] ], [ [ [ 149.585311889648665, -1.50347805023182 ], [ 149.581298828125, -1.502156019210815 ], [ 149.579849243164176, -1.499022960662842 ], [ 149.583236694336051, -1.49804699420929 ], [ 149.585311889648665, -1.50347805023182 ] ] ], [ [ [ 149.568923950195426, -1.319321990013066 ], [ 149.681243896484375, -1.387773990631047 ], [ 149.717376708984489, -1.492020964622498 ], [ 149.748519897461279, -1.526491045951786 ], [ 149.721603393554801, -1.535683035850468 ], [ 149.705474853515852, -1.521476984023991 ], [ 149.690383911132812, -1.542366981506348 ], [ 149.658172607422102, -1.495015978813115 ], [ 149.653839111328352, -1.517369985580444 ], [ 149.626296997070312, -1.521198987960759 ], [ 149.549392700195654, -1.451979041099548 ], [ 149.514022827148665, -1.440140962600651 ], [ 149.50537109375, -1.418346047401371 ], [ 149.546142578125114, -1.357691049575692 ], [ 149.54226684570358, -1.318972945213318 ], [ 149.568923950195426, -1.319321990013066 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-NPP", "NAME_1": "Oro" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 149.442687988281477, -9.587521553039494 ], [ 149.441848754882812, -9.588834762573242 ], [ 149.4403076171875, -9.586763381957951 ], [ 149.4417724609375, -9.58648490905756 ], [ 149.442687988281477, -9.587521553039494 ] ] ], [ [ [ 148.892501831055029, -9.0644273757934 ], [ 148.889999389648551, -9.063114166259766 ], [ 148.8936767578125, -9.059547424316349 ], [ 148.893814086914176, -9.06058406829834 ], [ 148.892501831055029, -9.0644273757934 ] ] ], [ [ [ 148.325134277343977, -8.6109361648559 ], [ 148.326553344726562, -8.615341186523438 ], [ 148.32594299316429, -8.616570472717228 ], [ 148.322753906250114, -8.611220359802246 ], [ 148.325134277343977, -8.6109361648559 ] ] ], [ [ [ 148.237091064453125, -8.485573768615723 ], [ 148.23583984375, -8.486109733581543 ], [ 148.234268188476676, -8.484086036682129 ], [ 148.237213134765739, -8.483443260192871 ], [ 148.237091064453125, -8.485573768615723 ] ] ], [ [ [ 148.235290527343977, -8.48278903961176 ], [ 148.235000610351562, -8.481403350830021 ], [ 148.236129760742301, -8.480833053588867 ], [ 148.23638916015625, -8.48277473449707 ], [ 148.235290527343977, -8.48278903961176 ] ] ], [ [ [ 148.009185791015739, -8.059800148010254 ], [ 148.004730224609602, -8.057711601257324 ], [ 148.003890991210938, -8.0543212890625 ], [ 148.008071899414062, -8.056467056274414 ], [ 148.009185791015739, -8.059800148010254 ] ] ], [ [ [ 147.999374389648551, -8.05192661285389 ], [ 148.000839233398438, -8.052242279052734 ], [ 148.002944946289062, -8.05631160736084 ], [ 147.99763488769554, -8.053241729736328 ], [ 147.999374389648551, -8.05192661285389 ] ] ], [ [ [ 147.281707763671875, -8.004035949707031 ], [ 147.939407348632812, -8.005334854125977 ], [ 147.961044311523665, -8.010536193847656 ], [ 147.994445800781477, -8.072220802307072 ], [ 147.994995117187727, -8.055277824401799 ], [ 148.011108398437614, -8.0625 ], [ 148.041946411133267, -8.05341625213623 ], [ 148.053329467773665, -8.062778472900391 ], [ 148.08082580566429, -8.055556297302246 ], [ 148.101943969726562, -8.06500053405756 ], [ 148.123886108398438, -8.056112289428654 ], [ 148.119445800781364, -8.077220916748047 ], [ 148.133056640625227, -8.078055381774902 ], [ 148.150558471679688, -8.134167671203613 ], [ 148.139999389648551, -8.148611068725586 ], [ 148.165496826171989, -8.175798416137638 ], [ 148.1663818359375, -8.222499847412053 ], [ 148.206115722656477, -8.305554389953613 ], [ 148.205001831054915, -8.391944885253906 ], [ 148.225006103515739, -8.428334236144963 ], [ 148.22389221191429, -8.476388931274414 ], [ 148.23611450195358, -8.488887786865234 ], [ 148.230560302734602, -8.513055801391602 ], [ 148.216659545898892, -8.514165878295842 ], [ 148.222778320312614, -8.556111335754338 ], [ 148.279449462890739, -8.611666679382267 ], [ 148.302215576171875, -8.61944580078125 ], [ 148.342773437500114, -8.618056297302189 ], [ 148.437225341796875, -8.680277824401855 ], [ 148.473052978515739, -8.741666793823242 ], [ 148.474716186523665, -8.823332786560059 ], [ 148.493057250976562, -8.87944507598877 ], [ 148.484161376953125, -8.896665573120117 ], [ 148.508895874023438, -8.898429870605469 ], [ 148.50555419921875, -8.919721603393555 ], [ 148.52333068847679, -8.914164543151799 ], [ 148.505966186523551, -8.94679069519043 ], [ 148.52777099609375, -8.956945419311523 ], [ 148.52603149414108, -9.002663612365723 ], [ 148.540557861328125, -9.024168014526367 ], [ 148.610000610351676, -9.08777904510498 ], [ 148.761947631836165, -9.112221717834359 ], [ 148.742218017578125, -9.113887786865178 ], [ 148.743331909179801, -9.117222785949707 ], [ 148.746948242187614, -9.117831230163574 ], [ 148.878326416015739, -9.079443931579533 ], [ 148.895004272460938, -9.088889122009221 ], [ 148.882217407226562, -9.06944465637207 ], [ 148.899993896484375, -9.067501068115234 ], [ 148.90138244628929, -9.047221183776799 ], [ 149.015609741211051, -9.061659812927246 ], [ 149.032562255859602, -9.048947334289551 ], [ 149.065719604492188, -9.055769920349121 ], [ 149.061676025390739, -9.042839050292912 ], [ 149.088058471679688, -9.062223434448242 ], [ 149.08082580566429, -9.022500038146973 ], [ 149.096389770507926, -9.034167289733887 ], [ 149.106399536132926, -9.00597953796381 ], [ 149.13812255859375, -8.989233016967773 ], [ 149.141937255859375, -9.031109809875488 ], [ 149.161117553711165, -9.013054847717285 ], [ 149.167221069336165, -9.031109809875488 ], [ 149.17608642578125, -9.011726379394531 ], [ 149.187973022460938, -9.027424812316838 ], [ 149.18367004394554, -9.009914398193359 ], [ 149.20440673828125, -9.003679275512695 ], [ 149.225280761718864, -9.014445304870605 ], [ 149.234222412109602, -9.002113342285099 ], [ 149.233978271484602, -9.010290145873967 ], [ 149.237503051757812, -9.01500129699707 ], [ 149.249862670898665, -8.997082710266056 ], [ 149.239410400390625, -9.038318634033203 ], [ 149.257766723632812, -9.010821342468262 ], [ 149.259445190429801, -9.02944374084467 ], [ 149.269027709960938, -9.007781028747559 ], [ 149.278610229492415, -9.012777328491097 ], [ 149.269439697265625, -9.037222862243652 ], [ 149.293807983398779, -9.014470100402718 ], [ 149.315750122070312, -9.038761138915959 ], [ 149.30305480957054, -9.048055648803654 ], [ 149.319442749023551, -9.055000305175781 ], [ 149.290695190429801, -9.081378936767521 ], [ 149.326065063476562, -9.062788009643555 ], [ 149.328887939453239, -9.078612327575684 ], [ 149.302169799804801, -9.084284782409668 ], [ 149.286941528320654, -9.093610763549805 ], [ 149.32281494140625, -9.085396766662541 ], [ 149.315750122070312, -9.106609344482422 ], [ 149.272506713867415, -9.111109733581486 ], [ 149.328048706054915, -9.112221717834359 ], [ 149.328964233398665, -9.134897232055664 ], [ 149.297225952148551, -9.13416576385498 ], [ 149.323455810546989, -9.142623901367188 ], [ 149.317413330078125, -9.156246185302678 ], [ 149.301666259765625, -9.14888858795166 ], [ 149.313049316406364, -9.165555953979379 ], [ 149.285675048828352, -9.154644012451172 ], [ 149.291625976562727, -9.176204681396484 ], [ 149.272216796875, -9.162825584411621 ], [ 149.260833740234375, -9.173054695129338 ], [ 149.223052978515625, -9.3102769851684 ], [ 149.180297851562614, -9.339536666870117 ], [ 149.182220458984489, -9.401665687561035 ], [ 149.2386474609375, -9.497957229614258 ], [ 149.357604980468977, -9.518432617187443 ], [ 149.380828857421875, -9.548054695129395 ], [ 149.436813354492188, -9.571563720703068 ], [ 149.441925048828352, -9.597958564758301 ], [ 149.087219238281364, -9.707134246826172 ], [ 148.991210937500227, -9.702835083007812 ], [ 148.943618774414404, -9.79483509063715 ], [ 148.972106933593977, -9.867136001586914 ], [ 148.970214843750114, -9.905334472656193 ], [ 148.846710205078239, -9.940635681152287 ], [ 148.809005737304688, -9.97723388671875 ], [ 148.780319213867301, -9.944234848022461 ], [ 148.709014892578466, -9.936736106872559 ], [ 148.565719604492301, -9.875433921813965 ], [ 148.444305419921875, -9.757035255432129 ], [ 148.392608642578125, -9.741435050964355 ], [ 148.353713989257812, -9.753334045410099 ], [ 148.245117187500114, -9.746733665466252 ], [ 148.214508056640852, -9.664933204650879 ], [ 148.104415893554688, -9.610434532165471 ], [ 148.043319702148551, -9.556035995483398 ], [ 148.026611328125, -9.511835098266488 ], [ 148.052017211914176, -9.467233657836914 ], [ 148.053207397461051, -9.431235313415527 ], [ 148.033309936523665, -9.390434265136719 ], [ 147.983917236328239, -9.353534698486328 ], [ 147.986114501953239, -9.31363391876215 ], [ 147.955215454101676, -9.291033744812012 ], [ 147.90911865234375, -9.293135643005371 ], [ 147.873718261719205, -9.274435043334904 ], [ 147.827117919922102, -9.169335365295353 ], [ 147.747314453125114, -9.1651353836059 ], [ 147.693008422851562, -9.043934822082463 ], [ 147.635208129882812, -8.977034568786564 ], [ 147.553619384765739, -8.95063400268549 ], [ 147.542419433593864, -8.899934768676701 ], [ 147.501617431640625, -8.873633384704533 ], [ 147.500411987304801, -8.827235221862793 ], [ 147.46051025390625, -8.789134025573674 ], [ 147.445205688476904, -8.723333358764592 ], [ 147.633407592773551, -8.565534591674805 ], [ 147.646713256836165, -8.532934188842773 ], [ 147.461715698242415, -8.348434448242188 ], [ 147.366012573242188, -8.359833717346135 ], [ 147.004119873046989, -8.004434585571232 ], [ 147.161712646484489, -8.005234718322754 ], [ 147.203613281250227, -8.032334327697754 ], [ 147.281707763671875, -8.004035949707031 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-SAN", "NAME_1": "Sandaun" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 142.489761352539062, -3.158368110656738 ], [ 142.490829467773438, -3.160964012145882 ], [ 142.486389160156477, -3.158890008926392 ], [ 142.486862182617529, -3.157700061798096 ], [ 142.489761352539062, -3.158368110656738 ] ] ], [ [ [ 142.487777709960938, -3.151667118072453 ], [ 142.480895996093864, -3.143654108047429 ], [ 142.489501953125114, -3.139763116836491 ], [ 142.490280151367301, -3.149445056915226 ], [ 142.487777709960938, -3.151667118072453 ] ] ], [ [ [ 142.474166870117301, -3.122776985168457 ], [ 142.474166870117301, -3.128055095672551 ], [ 142.463607788085938, -3.132499933242741 ], [ 142.470550537109602, -3.12166690826416 ], [ 142.474166870117301, -3.122776985168457 ] ] ], [ [ [ 142.398025512695312, -3.116327047347966 ], [ 142.401672363281477, -3.123610973358154 ], [ 142.396392822265739, -3.128055095672551 ], [ 142.393035888671875, -3.12077093124384 ], [ 142.398025512695312, -3.116327047347966 ] ] ], [ [ [ 142.081344604492301, -3.031605005264225 ], [ 142.079971313476676, -3.030895948410034 ], [ 142.082305908203239, -3.028857946395874 ], [ 142.082717895507812, -3.029721975326481 ], [ 142.081344604492301, -3.031605005264225 ] ] ], [ [ [ 142.085830688476676, -3.031666040420532 ], [ 142.082504272461279, -3.027777910232487 ], [ 142.086105346679801, -3.025000095367432 ], [ 142.086944580078125, -3.026112079620304 ], [ 142.085830688476676, -3.031666040420532 ] ] ], [ [ [ 142.076385498046989, -3.019444942474365 ], [ 142.083053588867301, -3.023890018463078 ], [ 142.080001831054801, -3.028333902358895 ], [ 142.076385498046989, -3.024444103240967 ], [ 142.076385498046989, -3.019444942474365 ] ] ], [ [ [ 141.328796386718977, -2.696196079254094 ], [ 141.329071044921989, -2.697295904159546 ], [ 141.327682495117415, -2.697902917861882 ], [ 141.327697753906705, -2.696474075317326 ], [ 141.328796386718977, -2.696196079254094 ] ] ], [ [ [ 141.038330078125227, -2.604703903198242 ], [ 141.155746459960938, -2.6372230052948 ], [ 141.204788208007812, -2.632430076599064 ], [ 141.232589721680029, -2.656791925430298 ], [ 141.278076171875227, -2.661278963088989 ], [ 141.269241333007812, -2.676496982574463 ], [ 141.287506103515739, -2.688056945800668 ], [ 141.30555725097679, -2.66833305358881 ], [ 141.307220458984375, -2.694444894790593 ], [ 141.33917236328125, -2.713263988494873 ], [ 141.44667053222679, -2.739166021347046 ], [ 141.439727783203466, -2.750555038452092 ], [ 141.448883056640966, -2.741667032241821 ], [ 141.635345458984602, -2.841320037841797 ], [ 141.824752807617642, -2.915026903152409 ], [ 141.875839233398665, -2.971874952316284 ], [ 141.98638916015625, -2.962013959884587 ], [ 142.011535644531364, -2.97252893447876 ], [ 142.080001831054801, -3.015554904937744 ], [ 142.058334350585938, -3.021943092346135 ], [ 142.074722290039062, -3.026112079620304 ], [ 142.067779541015625, -3.050002098083496 ], [ 142.083618164062614, -3.06805491447443 ], [ 142.134445190429688, -3.060208082199097 ], [ 142.092498779297102, -3.032222032546997 ], [ 142.085006713867188, -3.020833015441895 ], [ 142.173614501953239, -3.08916711807251 ], [ 142.345550537109375, -3.123332977294922 ], [ 142.354721069335938, -3.146389007568303 ], [ 142.532775878906364, -3.232223033905029 ], [ 142.625274658203239, -3.246943950653076 ], [ 142.861663818359375, -3.327778100967407 ], [ 143.041671752929688, -3.364166975021305 ], [ 143.096572875977017, -3.357927083969116 ], [ 143.0841064453125, -3.529634952545109 ], [ 143.039215087890739, -3.538434028625488 ], [ 142.958419799804688, -3.495135068893376 ], [ 142.856719970703125, -3.471934080123901 ], [ 142.772308349609602, -3.401532888412476 ], [ 142.695709228515739, -3.444534063339177 ], [ 142.619613647461279, -3.44013500213623 ], [ 142.642013549804801, -3.516834974288884 ], [ 142.615615844726562, -3.555334091186523 ], [ 142.609619140625227, -3.667733907699528 ], [ 142.638519287109375, -3.792335033416748 ], [ 142.628906250000114, -3.90603399276722 ], [ 142.616714477539062, -3.920536041259766 ], [ 142.539718627929688, -3.93013596534729 ], [ 142.528320312500227, -4.05703592300415 ], [ 141.834716796875114, -4.059733867645264 ], [ 141.772720336914176, -4.025834083557129 ], [ 141.762817382812614, -4.00083398818964 ], [ 141.71630859375, -3.99073600769043 ], [ 141.340118408203239, -4.259035110473633 ], [ 141.339218139648438, -4.574234962463322 ], [ 141.357315063476676, -4.609535217285156 ], [ 142.31640625, -4.617634773254338 ], [ 142.321914672851562, -5.052135944366455 ], [ 142.290512084961165, -5.109734058380013 ], [ 142.320816040039176, -5.198235034942513 ], [ 142.29450988769554, -5.332633972167969 ], [ 142.187911987305142, -5.320334911346436 ], [ 142.129913330078352, -5.370535850524902 ], [ 142.110641479492415, -5.378980159759408 ], [ 142.122573852539062, -5.370335102081299 ], [ 140.999710083007812, -4.993766784667969 ], [ 141.000167846679801, -2.606300115585327 ], [ 141.038330078125227, -2.604703903198242 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-SHM", "NAME_1": "Southern Highlands" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 143.884918212890739, -5.975834846496582 ], [ 143.883117675781477, -6.048635959625244 ], [ 144.005416870117415, -5.999034881591797 ], [ 144.559814453125, -6.36993408203125 ], [ 144.542205810546989, -6.433334827423039 ], [ 144.438613891601562, -6.460936069488469 ], [ 144.423812866210938, -6.489834785461426 ], [ 144.424713134765739, -6.552534103393555 ], [ 144.539215087890625, -6.581234931945744 ], [ 144.557907104492188, -6.60433387756342 ], [ 144.557006835937727, -6.647833824157715 ], [ 144.688110351562614, -6.705434799194279 ], [ 144.626510620117301, -6.729135036468506 ], [ 143.934707641601676, -6.822734832763672 ], [ 142.665008544922216, -6.823635101318303 ], [ 142.631607055664176, -6.809134960174504 ], [ 142.627212524414176, -6.179833889007568 ], [ 142.683517456054688, -6.18023490905756 ], [ 142.886520385742415, -6.242636203765812 ], [ 143.077011108398438, -6.359333992004338 ], [ 143.080413818359489, -6.30323600769043 ], [ 143.16120910644554, -6.293034076690617 ], [ 143.17181396484375, -6.165235996246338 ], [ 143.376007080078239, -6.155035018920898 ], [ 143.375808715820767, -6.094034194946232 ], [ 143.417007446289517, -6.093635082244873 ], [ 143.394012451171875, -6.070633888244572 ], [ 143.396316528320312, -5.909033775329533 ], [ 143.528015136719205, -5.975735187530461 ], [ 143.719818115234375, -5.90273380279541 ], [ 143.867706298828352, -5.950634956359863 ], [ 143.884918212890739, -5.975834846496582 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-WBK", "NAME_1": "West New Britain" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 149.502227783203239, -6.320833206176701 ], [ 149.504714965820312, -6.323332786560002 ], [ 149.500549316406364, -6.325832843780461 ], [ 149.49945068359375, -6.322776794433537 ], [ 149.502227783203239, -6.320833206176701 ] ] ], [ [ [ 149.873336791992301, -6.316666126251221 ], [ 149.878890991211165, -6.320833206176701 ], [ 149.8719482421875, -6.324722766876221 ], [ 149.86860656738304, -6.320833206176701 ], [ 149.873336791992301, -6.316666126251221 ] ] ], [ [ [ 149.809921264648551, -6.314436912536621 ], [ 149.813629150390852, -6.31879711151123 ], [ 149.812271118164062, -6.320236206054688 ], [ 149.806503295898779, -6.318531036376953 ], [ 149.809921264648551, -6.314436912536621 ] ] ], [ [ [ 149.890777587890739, -6.314414978027344 ], [ 149.88972473144554, -6.314102172851506 ], [ 149.890136718750227, -6.313061237335148 ], [ 149.891220092773438, -6.313406944274846 ], [ 149.890777587890739, -6.314414978027344 ] ] ], [ [ [ 149.790557861328239, -6.306389808654728 ], [ 149.797775268554688, -6.311388015747013 ], [ 149.79402160644554, -6.316894054412842 ], [ 149.783615112305029, -6.313888072967472 ], [ 149.790557861328239, -6.306389808654728 ] ] ], [ [ [ 149.504714965820312, -6.311944007873478 ], [ 149.503326416015852, -6.306667804717961 ], [ 149.5050048828125, -6.300833225250244 ], [ 149.507217407226676, -6.305277824401855 ], [ 149.504714965820312, -6.311944007873478 ] ] ], [ [ [ 149.744842529296989, -6.303383827209473 ], [ 149.743316650390739, -6.302134990692139 ], [ 149.744293212890739, -6.300397872924748 ], [ 149.745330810546875, -6.30310583114624 ], [ 149.744842529296989, -6.303383827209473 ] ] ], [ [ [ 149.824737548828352, -6.306299209594727 ], [ 149.824661254882812, -6.299953937530518 ], [ 149.828964233398438, -6.298850059509277 ], [ 149.830352783203125, -6.3032932281493 ], [ 149.824737548828352, -6.306299209594727 ] ] ], [ [ [ 149.882781982421989, -6.297704219818115 ], [ 149.883956909179688, -6.300412178039551 ], [ 149.88117980957054, -6.30082893371582 ], [ 149.880905151367188, -6.29749679565424 ], [ 149.882781982421989, -6.297704219818115 ] ] ], [ [ [ 150.307113647461392, -6.297177791595345 ], [ 150.309082031250114, -6.300496101379338 ], [ 150.319091796875114, -6.302050113677922 ], [ 150.307662963867415, -6.302923202514648 ], [ 150.307113647461392, -6.297177791595345 ] ] ], [ [ [ 149.904876708984375, -6.297369003295842 ], [ 149.91000366210983, -6.29999923706049 ], [ 149.901947021484489, -6.307499885559082 ], [ 149.901107788086279, -6.298333168029785 ], [ 149.904876708984375, -6.297369003295842 ] ] ], [ [ [ 149.926895141601562, -6.299164772033635 ], [ 149.926071166992301, -6.299718856811523 ], [ 149.923339843750227, -6.298333168029785 ], [ 149.926666259765966, -6.296111106872559 ], [ 149.926895141601562, -6.299164772033635 ] ] ], [ [ [ 149.74000549316429, -6.296249866485596 ], [ 149.742492675781364, -6.296667098999023 ], [ 149.74305725097679, -6.297501087188664 ], [ 149.738891601562727, -6.29888916015625 ], [ 149.74000549316429, -6.296249866485596 ] ] ], [ [ [ 150.0645751953125, -6.298061847686768 ], [ 150.062911987304915, -6.297505855560303 ], [ 150.062911987304915, -6.295980930328369 ], [ 150.064651489257926, -6.296257019042912 ], [ 150.0645751953125, -6.298061847686768 ] ] ], [ [ [ 149.732711791992188, -6.288541793823242 ], [ 149.73138427734375, -6.288887977600098 ], [ 149.731109619140739, -6.287197113037053 ], [ 149.732849121093864, -6.287154197692871 ], [ 149.732711791992188, -6.288541793823242 ] ] ], [ [ [ 150.073333740234489, -6.286665916442871 ], [ 150.080978393554688, -6.291454792022705 ], [ 150.078887939453125, -6.311944007873478 ], [ 150.067703247070426, -6.298132896423283 ], [ 150.073333740234489, -6.286665916442871 ] ] ], [ [ [ 150.300735473632812, -6.286299228668156 ], [ 150.299621582031477, -6.28715181350708 ], [ 150.298522949218977, -6.285764217376709 ], [ 150.299606323242188, -6.285764217376709 ], [ 150.300735473632812, -6.286299228668156 ] ] ], [ [ [ 150.329299926757926, -6.285346984863281 ], [ 150.32666015625, -6.29444503784174 ], [ 150.315490722656477, -6.293790817260742 ], [ 150.320281982421989, -6.285277843475285 ], [ 150.329299926757926, -6.285346984863281 ] ] ], [ [ [ 149.966659545898551, -6.283094882965088 ], [ 149.970275878906705, -6.28916597366333 ], [ 149.943603515625, -6.303334236144963 ], [ 149.946670532226676, -6.296945095062256 ], [ 149.966659545898551, -6.283094882965088 ] ] ], [ [ [ 150.310699462890739, -6.289976119995117 ], [ 150.30323791503929, -6.297701835632324 ], [ 150.282135009765739, -6.29046106338501 ], [ 150.311248779297102, -6.281607151031494 ], [ 150.310699462890739, -6.289976119995117 ] ] ], [ [ [ 150.294097900390739, -6.281302928924561 ], [ 150.296295166015739, -6.28272819519043 ], [ 150.29632568359375, -6.283266067504769 ], [ 150.293792724609375, -6.283266067504769 ], [ 150.294097900390739, -6.281302928924561 ] ] ], [ [ [ 149.979797363281477, -6.28113222122181 ], [ 149.977844238281477, -6.28029823303217 ], [ 149.977569580078239, -6.279326915740967 ], [ 149.979446411132926, -6.279883861541748 ], [ 149.979797363281477, -6.28113222122181 ] ] ], [ [ [ 149.879440307617301, -6.277221202850342 ], [ 149.884719848632812, -6.283055782318058 ], [ 149.869171142578352, -6.281112194061279 ], [ 149.874725341796989, -6.280000209808293 ], [ 149.879440307617301, -6.277221202850342 ] ] ], [ [ [ 150.281555175781705, -6.277139186859074 ], [ 150.284347534179688, -6.2777161598205 ], [ 150.283538818359375, -6.281045913696232 ], [ 150.279907226562841, -6.278785228729191 ], [ 150.281555175781705, -6.277139186859074 ] ] ], [ [ [ 150.276107788085938, -6.279444217681828 ], [ 150.281112670898665, -6.285151004791203 ], [ 150.281021118164176, -6.28715181350708 ], [ 150.26722717285179, -6.280834197997933 ], [ 150.276107788085938, -6.279444217681828 ] ] ], [ [ [ 150.39971923828125, -6.27972221374506 ], [ 150.393325805664517, -6.280556201934758 ], [ 150.405548095703239, -6.274445056915226 ], [ 150.404724121093864, -6.278056144714355 ], [ 150.39971923828125, -6.27972221374506 ] ] ], [ [ [ 150.312683105468864, -6.274098873138314 ], [ 150.316284179687614, -6.276856899261418 ], [ 150.316314697265739, -6.277688980102539 ], [ 150.313232421875114, -6.277966976165771 ], [ 150.312683105468864, -6.274098873138314 ] ] ], [ [ [ 150.403060913086051, -6.274721145629883 ], [ 150.398895263671989, -6.277221202850342 ], [ 150.39361572265625, -6.275833129882812 ], [ 150.401672363281364, -6.273055076599064 ], [ 150.403060913086051, -6.274721145629883 ] ] ], [ [ [ 149.930557250976676, -6.2754869461059 ], [ 149.929519653320426, -6.275140762329045 ], [ 149.928329467773551, -6.273197174072209 ], [ 149.929794311523551, -6.273475170135441 ], [ 149.930557250976676, -6.2754869461059 ] ] ], [ [ [ 150.409454345703125, -6.273609161376953 ], [ 150.410827636718864, -6.273333072662297 ], [ 150.41139221191429, -6.273889064788762 ], [ 150.409439086914062, -6.274999141693115 ], [ 150.409454345703125, -6.273609161376953 ] ] ], [ [ [ 149.926666259765966, -6.271667003631478 ], [ 149.929168701171875, -6.276525974273682 ], [ 149.92242431640625, -6.276803970336914 ], [ 149.924926757812614, -6.272572040557861 ], [ 149.926666259765966, -6.271667003631478 ] ] ], [ [ [ 150.401275634765852, -6.271615028381348 ], [ 150.400451660156591, -6.272994041442871 ], [ 150.397949218750114, -6.272690773010254 ], [ 150.398223876953352, -6.271596908569279 ], [ 150.401275634765852, -6.271615028381348 ] ] ], [ [ [ 150.298278808593977, -6.272731781005859 ], [ 150.296569824218977, -6.27102518081665 ], [ 150.296539306640625, -6.269637107849064 ], [ 150.297988891601562, -6.271010875701904 ], [ 150.298278808593977, -6.272731781005859 ] ] ], [ [ [ 150.029159545898665, -6.268610954284668 ], [ 150.030838012695312, -6.270277023315373 ], [ 150.028060913086165, -6.272221088409424 ], [ 150.026382446289062, -6.269722938537598 ], [ 150.029159545898665, -6.268610954284668 ] ] ], [ [ [ 149.964752197265739, -6.271276950836182 ], [ 149.963058471679688, -6.269722938537598 ], [ 149.963790893555142, -6.267808914184513 ], [ 149.965591430664062, -6.269279003143254 ], [ 149.964752197265739, -6.271276950836182 ] ] ], [ [ [ 150.305618286132812, -6.269581794738713 ], [ 150.30215454101608, -6.270275115966797 ], [ 150.299789428710938, -6.266528129577637 ], [ 150.301040649414062, -6.266042232513428 ], [ 150.305618286132812, -6.269581794738713 ] ] ], [ [ [ 150.419036865234489, -6.263833999633789 ], [ 150.416259765625114, -6.268287181854248 ], [ 150.41462707519554, -6.268270969390812 ], [ 150.415695190429801, -6.265494823455811 ], [ 150.419036865234489, -6.263833999633789 ] ] ], [ [ [ 150.324722290039176, -6.25972223281849 ], [ 150.328231811523665, -6.261139869689941 ], [ 150.325561523437727, -6.265554904937744 ], [ 150.322692871093977, -6.263428211212158 ], [ 150.324722290039176, -6.25972223281849 ] ] ], [ [ [ 150.429565429687955, -6.259695053100529 ], [ 150.42988586425804, -6.260779857635441 ], [ 150.436798095703352, -6.259915828704834 ], [ 150.437072753906591, -6.260779857635441 ], [ 150.424621582031364, -6.262712001800537 ], [ 150.429565429687955, -6.259695053100529 ] ] ], [ [ [ 150.447357177734489, -6.259389877319279 ], [ 150.446258544921875, -6.262184143066406 ], [ 150.441574096679915, -6.262444019317627 ], [ 150.44209289550804, -6.260221004486084 ], [ 150.447357177734489, -6.259389877319279 ] ] ], [ [ [ 150.492782592773438, -6.265000820159912 ], [ 150.488052368164062, -6.265832901000977 ], [ 150.490554809570426, -6.258887767791634 ], [ 150.491668701171875, -6.25972223281849 ], [ 150.492782592773438, -6.265000820159912 ] ] ], [ [ [ 149.552185058594205, -6.254168033599797 ], [ 149.562210083007812, -6.26439189910883 ], [ 149.562210083007812, -6.273344993591252 ], [ 149.549743652343864, -6.26226615905756 ], [ 149.552185058594205, -6.254168033599797 ] ] ], [ [ [ 150.475280761718977, -6.253612041473332 ], [ 150.467773437500114, -6.255556106567383 ], [ 150.466110229492188, -6.249443054199162 ], [ 150.472503662109375, -6.247776985168457 ], [ 150.475280761718977, -6.253612041473332 ] ] ], [ [ [ 149.542465209961051, -6.238900184631348 ], [ 149.549423217773438, -6.24778223037714 ], [ 149.546707153320426, -6.252501964569092 ], [ 149.539169311523551, -6.245041847229004 ], [ 149.542465209961051, -6.238900184631348 ] ] ], [ [ [ 149.538055419922102, -6.222588062286377 ], [ 149.544158935547102, -6.229252815246525 ], [ 149.540267944335938, -6.235361099243107 ], [ 149.534713745117188, -6.2305650711059 ], [ 149.538055419922102, -6.222588062286377 ] ] ], [ [ [ 148.913467407226676, -6.1806960105896 ], [ 148.912780761718977, -6.178055763244629 ], [ 148.918441772461279, -6.177105903625488 ], [ 148.915832519531477, -6.178194999694711 ], [ 148.913467407226676, -6.1806960105896 ] ] ], [ [ [ 148.928329467773551, -6.177639007568303 ], [ 148.926116943359375, -6.178334236144963 ], [ 148.924301147461051, -6.177221775054875 ], [ 148.928329467773551, -6.176805019378605 ], [ 148.928329467773551, -6.177639007568303 ] ] ], [ [ [ 148.954025268554915, -6.179027080535889 ], [ 148.945831298828352, -6.185554981231633 ], [ 148.929992675781477, -6.177221775054875 ], [ 148.956253051757812, -6.170278072357178 ], [ 148.954025268554915, -6.179027080535889 ] ] ], [ [ [ 149.043609619140625, -6.167221069335881 ], [ 149.049728393554915, -6.178055763244629 ], [ 149.048889160156364, -6.185000896453857 ], [ 149.038604736328466, -6.179443836212101 ], [ 149.043609619140625, -6.167221069335881 ] ] ], [ [ [ 150.559997558593977, -6.166388988494873 ], [ 150.562225341796875, -6.168055057525578 ], [ 150.560211181640852, -6.170070171356144 ], [ 150.558334350585938, -6.16833305358881 ], [ 150.559997558593977, -6.166388988494873 ] ] ], [ [ [ 149.014144897460938, -6.159199237823486 ], [ 149.028839111328125, -6.167216777801457 ], [ 149.02937316894554, -6.169651031494141 ], [ 149.01519775390625, -6.166903972625732 ], [ 149.014144897460938, -6.159199237823486 ] ] ], [ [ [ 149.003051757812727, -6.146389961242562 ], [ 149.008331298828125, -6.155279159545842 ], [ 148.996734619140852, -6.160000801086369 ], [ 148.993606567382812, -6.150556087493896 ], [ 149.003051757812727, -6.146389961242562 ] ] ], [ [ [ 149.02471923828125, -6.145555973052922 ], [ 149.022216796875, -6.143335819244385 ], [ 149.023895263671989, -6.139720916748047 ], [ 149.025283813476562, -6.140832901000977 ], [ 149.02471923828125, -6.145555973052922 ] ] ], [ [ [ 149.011016845703352, -6.139347076416016 ], [ 149.024444580078125, -6.14722204208374 ], [ 149.02166748046875, -6.153332233428898 ], [ 149.00166320800804, -6.14305591583252 ], [ 149.011016845703352, -6.139347076416016 ] ] ], [ [ [ 149.057739257812727, -6.134943962097168 ], [ 149.055114746093977, -6.138294219970703 ], [ 149.05262756347679, -6.134466171264592 ], [ 149.054229736328239, -6.13360595703125 ], [ 149.057739257812727, -6.134943962097168 ] ] ], [ [ [ 148.993896484375227, -6.137082099914551 ], [ 149.001129150390852, -6.143139839172306 ], [ 148.994445800781477, -6.148056030273381 ], [ 148.98944091796875, -6.133333206176701 ], [ 148.993896484375227, -6.137082099914551 ] ] ], [ [ [ 149.057998657226676, -6.130510807037354 ], [ 149.058334350586051, -6.13054084777832 ], [ 149.058395385742188, -6.130818843841553 ], [ 149.058059692383154, -6.13074779510498 ], [ 149.057998657226676, -6.130510807037354 ] ] ], [ [ [ 149.055831909179915, -6.13042497634882 ], [ 149.055755615234489, -6.13074779510498 ], [ 149.055557250976676, -6.130609035491943 ], [ 149.055831909179915, -6.13042497634882 ] ] ], [ [ [ 149.057998657226676, -6.130510807037354 ], [ 149.055831909179915, -6.13042497634882 ], [ 149.055557250976676, -6.129916191101017 ], [ 149.057434082031364, -6.129706859588623 ], [ 149.057998657226676, -6.130510807037354 ] ] ], [ [ [ 149.050003051757812, -6.129167079925537 ], [ 149.05389404296875, -6.130001068115234 ], [ 149.054443359375, -6.132917881011963 ], [ 149.050827026367188, -6.134167194366398 ], [ 149.050003051757812, -6.129167079925537 ] ] ], [ [ [ 148.953048706054801, -6.128057003021183 ], [ 148.971527099609602, -6.136388778686467 ], [ 148.958892822265625, -6.167359828948918 ], [ 148.965774536132812, -6.139653205871582 ], [ 148.953048706054801, -6.128057003021183 ] ] ], [ [ [ 150.708053588867301, -6.12722206115717 ], [ 150.711669921875114, -6.128334999084416 ], [ 150.710830688476562, -6.132501125335693 ], [ 150.706115722656477, -6.130833148956185 ], [ 150.708053588867301, -6.12722206115717 ] ] ], [ [ [ 148.998062133789176, -6.119167804717961 ], [ 149.006454467773551, -6.126485824584961 ], [ 149.007431030273665, -6.133772850036621 ], [ 148.99249267578125, -6.128334999084416 ], [ 148.998062133789176, -6.119167804717961 ] ] ], [ [ [ 149.007904052734375, -6.111886024475098 ], [ 149.011520385742529, -6.116187095642033 ], [ 149.011108398437614, -6.117646217346191 ], [ 149.006805419921875, -6.114106178283691 ], [ 149.007904052734375, -6.111886024475098 ] ] ], [ [ [ 149.029647827148438, -6.109457015991211 ], [ 149.029998779296989, -6.110983848571777 ], [ 149.028335571289062, -6.111398220062199 ], [ 149.028610229492415, -6.110013008117676 ], [ 149.029647827148438, -6.109457015991211 ] ] ], [ [ [ 148.988067626953125, -6.107157230377197 ], [ 148.990005493164062, -6.11333322525013 ], [ 148.985275268554801, -6.116943836212158 ], [ 148.981948852539176, -6.111667156219482 ], [ 148.988067626953125, -6.107157230377197 ] ] ], [ [ [ 148.982086181640739, -6.109445095062256 ], [ 148.979171752929801, -6.109167098999023 ], [ 148.979721069335938, -6.10694503784174 ], [ 148.980972290039176, -6.10736179351801 ], [ 148.982086181640739, -6.109445095062256 ] ] ], [ [ [ 148.959304809570312, -6.107068061828556 ], [ 148.958892822265625, -6.107915878295898 ], [ 148.957916259765739, -6.107223033904972 ], [ 148.958618164062955, -6.1061110496521 ], [ 148.959304809570312, -6.107068061828556 ] ] ], [ [ [ 149.029998779296989, -6.107165813446045 ], [ 149.02825927734375, -6.106542110443115 ], [ 149.029159545898665, -6.105014801025391 ], [ 149.030273437500227, -6.105848789215088 ], [ 149.029998779296989, -6.107165813446045 ] ] ], [ [ [ 149.011596679687614, -6.104680061340275 ], [ 149.0128173828125, -6.107523918151799 ], [ 149.011383056640625, -6.109885215759221 ], [ 149.007995605468977, -6.106553077697754 ], [ 149.011596679687614, -6.104680061340275 ] ] ], [ [ [ 149.038818359375, -6.104454040527344 ], [ 149.04437255859375, -6.109694004058781 ], [ 149.036666870117301, -6.114155769348031 ], [ 149.035003662109375, -6.107461929321289 ], [ 149.038818359375, -6.104454040527344 ] ] ], [ [ [ 148.998199462890625, -6.104444980621281 ], [ 148.999450683593864, -6.106389045715332 ], [ 148.997909545898892, -6.107501029968205 ], [ 148.996383666992642, -6.105833053588867 ], [ 148.998199462890625, -6.104444980621281 ] ] ], [ [ [ 149.033569335937727, -6.101908206939697 ], [ 149.036087036132812, -6.103321075439396 ], [ 149.034973144531364, -6.106917858123779 ], [ 149.032485961914176, -6.103011131286564 ], [ 149.033569335937727, -6.101908206939697 ] ] ], [ [ [ 149.455825805664176, -6.102778911590576 ], [ 149.454727172851676, -6.101109981536865 ], [ 149.456466674804688, -6.100831985473633 ], [ 149.457214355468864, -6.10208082199091 ], [ 149.455825805664176, -6.102778911590576 ] ] ], [ [ [ 149.01690673828125, -6.099437236785889 ], [ 149.016616821289176, -6.100757122039738 ], [ 149.013916015625227, -6.100212097167969 ], [ 149.014434814453125, -6.098580837249756 ], [ 149.01690673828125, -6.099437236785889 ] ] ], [ [ [ 149.020431518554801, -6.097891807556096 ], [ 149.027908325195426, -6.108553886413517 ], [ 149.018814086914062, -6.114729881286621 ], [ 149.015274047851676, -6.103369235992432 ], [ 149.020431518554801, -6.097891807556096 ] ] ], [ [ [ 149.415283203125114, -6.096943855285645 ], [ 149.416671752929688, -6.099443912506104 ], [ 149.413330078125455, -6.099443912506104 ], [ 149.41278076171875, -6.098609924316406 ], [ 149.415283203125114, -6.096943855285645 ] ] ], [ [ [ 148.960693359375227, -6.095417022705021 ], [ 148.966110229492301, -6.099721908569336 ], [ 148.960968017578239, -6.103474140167236 ], [ 148.956390380859489, -6.098609924316406 ], [ 148.960693359375227, -6.095417022705021 ] ] ], [ [ [ 148.94305419921875, -6.098055839538517 ], [ 148.941940307617188, -6.096111774444523 ], [ 148.943603515625114, -6.094861030578556 ], [ 148.944168090820426, -6.097221851348877 ], [ 148.94305419921875, -6.098055839538517 ] ] ], [ [ [ 148.9486083984375, -6.09597110748291 ], [ 148.952224731445312, -6.096527099609375 ], [ 148.94805908203125, -6.102778911590576 ], [ 148.945831298828352, -6.09833383560175 ], [ 148.9486083984375, -6.09597110748291 ] ] ], [ [ [ 148.972229003906591, -6.096943855285645 ], [ 148.97138977050804, -6.09638786315918 ], [ 148.972229003906591, -6.093612194061222 ], [ 148.973892211914176, -6.095277786254826 ], [ 148.972229003906591, -6.096943855285645 ] ] ], [ [ [ 149.444900512695312, -6.091944217681828 ], [ 149.453048706054801, -6.093887805938721 ], [ 149.456390380859489, -6.097361087799072 ], [ 149.446014404297216, -6.094320774078312 ], [ 149.444900512695312, -6.091944217681828 ] ] ], [ [ [ 148.988189697265739, -6.091666221618596 ], [ 148.990692138671875, -6.098749160766602 ], [ 148.980270385742188, -6.101387977600098 ], [ 148.978607177734489, -6.095277786254826 ], [ 148.988189697265739, -6.091666221618596 ] ] ], [ [ [ 149.047271728515739, -6.091963768005314 ], [ 149.044418334961165, -6.102403163909855 ], [ 149.034927368164176, -6.101222038268986 ], [ 149.04267883300804, -6.089425086975041 ], [ 149.047271728515739, -6.091963768005314 ] ] ], [ [ [ 149.44091796875, -6.090229988098145 ], [ 149.438980102539062, -6.09078407287592 ], [ 149.437026977539176, -6.090158939361459 ], [ 149.4378662109375, -6.089395999908334 ], [ 149.44091796875, -6.090229988098145 ] ] ], [ [ [ 148.999588012695426, -6.084473133087101 ], [ 149.004119873046875, -6.091364860534668 ], [ 149.000839233398779, -6.093605041503849 ], [ 148.996185302734602, -6.090164184570256 ], [ 148.999588012695426, -6.084473133087101 ] ] ], [ [ [ 148.994583129882812, -6.08805513381958 ], [ 148.989303588867415, -6.087915897369385 ], [ 148.991943359375227, -6.081110954284554 ], [ 148.993881225586165, -6.0813889503479 ], [ 148.994583129882812, -6.08805513381958 ] ] ], [ [ [ 149.020553588867415, -6.076388835906982 ], [ 149.037780761718864, -6.079722881317139 ], [ 149.043060302734602, -6.088612079620361 ], [ 149.007781982421989, -6.087499141693115 ], [ 149.020553588867415, -6.076388835906982 ] ] ], [ [ [ 148.950302124023438, -6.07305717468256 ], [ 148.955001831054801, -6.074443817138615 ], [ 148.955825805664404, -6.078125 ], [ 148.945968627929915, -6.074305057525578 ], [ 148.950302124023438, -6.07305717468256 ] ] ], [ [ [ 148.985549926757926, -6.071387767791691 ], [ 148.993606567382812, -6.076528072357178 ], [ 148.988754272461392, -6.082084178924561 ], [ 148.979446411132926, -6.076666831970215 ], [ 148.985549926757926, -6.071387767791691 ] ] ], [ [ [ 148.946945190429801, -6.061943054199162 ], [ 148.948745727539176, -6.063124179840088 ], [ 148.945693969726676, -6.066666126251221 ], [ 148.942779541015852, -6.062777996063176 ], [ 148.946945190429801, -6.061943054199162 ] ] ], [ [ [ 148.953964233398438, -6.061389923095646 ], [ 148.955413818359489, -6.062794208526611 ], [ 148.953338623046989, -6.063611984252873 ], [ 148.951950073242301, -6.061943054199162 ], [ 148.953964233398438, -6.061389923095646 ] ] ], [ [ [ 148.995422363281477, -6.060694217681885 ], [ 148.999160766601562, -6.061665058135929 ], [ 148.994445800781477, -6.068056106567383 ], [ 148.99249267578125, -6.065556049346924 ], [ 148.995422363281477, -6.060694217681885 ] ] ], [ [ [ 148.984451293945312, -6.057776927947998 ], [ 148.980270385742188, -6.056666851043701 ], [ 148.986251831054915, -6.05111122131342 ], [ 148.987716674804688, -6.054234981536865 ], [ 148.984451293945312, -6.057776927947998 ] ] ], [ [ [ 148.865280151367188, -6.02555513381958 ], [ 148.862503051757926, -6.023333072662354 ], [ 148.867919921875, -6.01805591583252 ], [ 148.868331909179688, -6.023889064788818 ], [ 148.865280151367188, -6.02555513381958 ] ] ], [ [ [ 148.868331909179688, -6.009722232818604 ], [ 148.871383666992188, -6.012777805328369 ], [ 148.865829467773438, -6.016387939453125 ], [ 148.864440917968864, -6.011665821075439 ], [ 148.868331909179688, -6.009722232818604 ] ] ], [ [ [ 148.858184814453125, -6.003606796264648 ], [ 148.856994628906364, -6.008845806121826 ], [ 148.852508544922102, -6.007771015167236 ], [ 148.852508544922102, -6.005652904510441 ], [ 148.858184814453125, -6.003606796264648 ] ] ], [ [ [ 148.876296997070312, -6.001349925994873 ], [ 148.88470458984375, -6.001905918121338 ], [ 148.884490966797216, -6.009192943572941 ], [ 148.873870849609602, -6.006694793701172 ], [ 148.876296997070312, -6.001349925994873 ] ] ], [ [ [ 148.869934082031364, -5.995347023010254 ], [ 148.873275756835938, -5.997222900390625 ], [ 148.873886108398551, -5.998332977294865 ], [ 148.869171142578239, -5.998332977294865 ], [ 148.869934082031364, -5.995347023010254 ] ] ], [ [ [ 148.871246337890852, -5.982638835906982 ], [ 148.883056640625227, -5.994166851043701 ], [ 148.881668090820312, -5.997500896453857 ], [ 148.865005493164176, -5.99027776718134 ], [ 148.871246337890852, -5.982638835906982 ] ] ], [ [ [ 148.713409423828125, -5.953402042388802 ], [ 148.711944580078352, -5.953333854675293 ], [ 148.712493896484375, -5.950832843780518 ], [ 148.713470458984602, -5.95111083984375 ], [ 148.713409423828125, -5.953402042388802 ] ] ], [ [ [ 148.696533203125227, -5.953333854675293 ], [ 148.694717407226562, -5.951666831970158 ], [ 148.698883056640739, -5.948888778686467 ], [ 148.699172973632926, -5.95111083984375 ], [ 148.696533203125227, -5.953333854675293 ] ] ], [ [ [ 148.734558105468864, -5.94838285446167 ], [ 148.733932495117642, -5.94817399978632 ], [ 148.733856201171875, -5.947203159332162 ], [ 148.735107421875, -5.947619915008545 ], [ 148.734558105468864, -5.94838285446167 ] ] ], [ [ [ 148.73211669921875, -5.94677019119257 ], [ 148.73066711425804, -5.944477081298828 ], [ 148.73309326171875, -5.942045211791992 ], [ 148.734024047851562, -5.942777156829777 ], [ 148.73211669921875, -5.94677019119257 ] ] ], [ [ [ 148.629760742187727, -5.837337017059269 ], [ 148.628936767578125, -5.837268829345646 ], [ 148.629058837890625, -5.8361558914184 ], [ 148.630187988281364, -5.836573123931828 ], [ 148.629760742187727, -5.837337017059269 ] ] ], [ [ [ 149.72222900390625, -5.548889160156136 ], [ 149.720550537109602, -5.547499179840031 ], [ 149.723327636718864, -5.546667098999023 ], [ 149.723617553711051, -5.547777175903263 ], [ 149.72222900390625, -5.548889160156136 ] ] ], [ [ [ 149.491836547851562, -5.526976108551025 ], [ 149.490829467773551, -5.525992870330811 ], [ 149.491882324218977, -5.524901866912842 ], [ 149.492675781250455, -5.5260910987854 ], [ 149.491836547851562, -5.526976108551025 ] ] ], [ [ [ 149.443450927734602, -5.514013767242375 ], [ 149.435791015625114, -5.523055076599121 ], [ 149.428161621093864, -5.515243053436279 ], [ 149.440689086914062, -5.512257099151554 ], [ 149.443450927734602, -5.514013767242375 ] ] ], [ [ [ 149.452743530273438, -5.51170110702509 ], [ 149.45375061035179, -5.514388084411621 ], [ 149.449462890625, -5.513545036315861 ], [ 149.449935913086165, -5.511956214904785 ], [ 149.452743530273438, -5.51170110702509 ] ] ], [ [ [ 149.713088989257812, -5.507778167724553 ], [ 149.710906982421875, -5.506526947021428 ], [ 149.716629028320312, -5.502354145049992 ], [ 149.715499877929801, -5.507041931152344 ], [ 149.713088989257812, -5.507778167724553 ] ] ], [ [ [ 150.104934692383267, -5.499934196472111 ], [ 150.105560302734489, -5.502222061157227 ], [ 150.102401733398665, -5.502586841583252 ], [ 150.103683471679688, -5.500279903411808 ], [ 150.104934692383267, -5.499934196472111 ] ] ], [ [ [ 149.761947631836051, -5.50111198425293 ], [ 149.76055908203125, -5.498889923095646 ], [ 149.761108398437841, -5.496111869811955 ], [ 149.762771606445426, -5.496942996978703 ], [ 149.761947631836051, -5.50111198425293 ] ] ], [ [ [ 149.084793090820312, -5.497220993041935 ], [ 149.084442138672102, -5.496111869811955 ], [ 149.086944580078239, -5.495554924011117 ], [ 149.086105346679688, -5.497220993041935 ], [ 149.084793090820312, -5.497220993041935 ] ] ], [ [ [ 149.621383666992301, -5.486945152282658 ], [ 149.620834350586165, -5.483057022094727 ], [ 149.623886108398665, -5.481110095977783 ], [ 149.62554931640625, -5.484723091125431 ], [ 149.621383666992301, -5.486945152282658 ] ] ], [ [ [ 150.862808227539062, -5.479138851165771 ], [ 150.862121582031477, -5.478860855102539 ], [ 150.862335205078352, -5.477748870849609 ], [ 150.863159179687614, -5.477955818176213 ], [ 150.862808227539062, -5.479138851165771 ] ] ], [ [ [ 149.090026855468977, -5.478994846343994 ], [ 149.089324951171989, -5.478371143341064 ], [ 149.090942382812614, -5.477714061737004 ], [ 149.090988159180142, -5.478507041931152 ], [ 149.090026855468977, -5.478994846343994 ] ] ], [ [ [ 150.855880737304688, -5.479000091552734 ], [ 150.855178833007812, -5.478929042816162 ], [ 150.855392456054688, -5.477191925048828 ], [ 150.856155395507812, -5.477610111236515 ], [ 150.855880737304688, -5.479000091552734 ] ] ], [ [ [ 148.883270263672102, -5.473055839538574 ], [ 148.881942749023892, -5.471943855285588 ], [ 148.883895874023551, -5.469998836517334 ], [ 148.883819580078352, -5.47222185134882 ], [ 148.883270263672102, -5.473055839538574 ] ] ], [ [ [ 148.499053955078125, -5.470859050750676 ], [ 148.498214721679688, -5.470581054687443 ], [ 148.498764038086051, -5.469192981719971 ], [ 148.499740600585938, -5.469677925109863 ], [ 148.499053955078125, -5.470859050750676 ] ] ], [ [ [ 149.688888549804915, -5.46527719497675 ], [ 149.696945190429915, -5.473988056182861 ], [ 149.695617675781705, -5.479425907134896 ], [ 149.688812255859489, -5.472446918487549 ], [ 149.688888549804915, -5.46527719497675 ] ] ], [ [ [ 148.882919311523438, -5.464445114135742 ], [ 148.881942749023892, -5.464583873748779 ], [ 148.881042480468864, -5.463857173919564 ], [ 148.882080078125227, -5.463055133819523 ], [ 148.882919311523438, -5.464445114135742 ] ] ], [ [ [ 149.710556030273551, -5.464723110198975 ], [ 149.709167480468864, -5.464999198913574 ], [ 149.708328247070312, -5.464445114135742 ], [ 149.711105346679801, -5.462777137756291 ], [ 149.710556030273551, -5.464723110198975 ] ] ], [ [ [ 148.942489624023438, -5.461503028869629 ], [ 148.94110107421875, -5.461835861205998 ], [ 148.94110107421875, -5.461000919341984 ], [ 148.942733764648665, -5.460696220397949 ], [ 148.942489624023438, -5.461503028869629 ] ] ], [ [ [ 149.682495117187614, -5.438333034515381 ], [ 149.681671142578352, -5.436666965484562 ], [ 149.683609008789176, -5.435000896453801 ], [ 149.68417358398483, -5.436388969421387 ], [ 149.682495117187614, -5.438333034515381 ] ] ], [ [ [ 150.791107177734375, -5.428887844085693 ], [ 150.79194641113304, -5.426943778991699 ], [ 150.794448852539176, -5.427499771118107 ], [ 150.793334960937614, -5.428609848022461 ], [ 150.791107177734375, -5.428887844085693 ] ] ], [ [ [ 148.972259521484375, -5.424708843231087 ], [ 148.971282958984375, -5.424081802368107 ], [ 148.97247314453125, -5.422623157501164 ], [ 148.973373413086279, -5.423317909240723 ], [ 148.972259521484375, -5.424708843231087 ] ] ], [ [ [ 150.80722045898483, -5.413332939147892 ], [ 150.808456420898438, -5.414467811584473 ], [ 150.807464599609489, -5.415753841400146 ], [ 150.806106567382812, -5.41416692733759 ], [ 150.80722045898483, -5.413332939147892 ] ] ], [ [ [ 150.060592651367188, -5.368010044097844 ], [ 150.059722900390852, -5.369721889495793 ], [ 150.05810546875, -5.367195129394474 ], [ 150.059555053711051, -5.367125988006592 ], [ 150.060592651367188, -5.368010044097844 ] ] ], [ [ [ 150.057785034179801, -5.359999179840031 ], [ 150.060073852539176, -5.361664772033691 ], [ 150.060073852539176, -5.362218856811523 ], [ 150.056594848632812, -5.361811161041203 ], [ 150.057785034179801, -5.359999179840031 ] ] ], [ [ [ 150.494720458984375, -5.343887805938721 ], [ 150.49444580078125, -5.355555057525635 ], [ 150.488327026367301, -5.359167098999023 ], [ 150.487258911132812, -5.344338893890324 ], [ 150.494720458984375, -5.343887805938721 ] ] ], [ [ [ 150.05360412597679, -5.339909076690674 ], [ 150.053680419921989, -5.341506004333439 ], [ 150.052429199218977, -5.341923236846867 ], [ 150.0523681640625, -5.340117931365853 ], [ 150.05360412597679, -5.339909076690674 ] ] ], [ [ [ 150.057800292968977, -5.32863187789917 ], [ 150.056900024414062, -5.32791614532465 ], [ 150.058395385742642, -5.326662063598633 ], [ 150.058609008789062, -5.327498912811222 ], [ 150.057800292968977, -5.32863187789917 ] ] ], [ [ [ 150.050003051758267, -5.318056106567383 ], [ 150.049163818359375, -5.318056106567383 ], [ 150.048538208007926, -5.316181182861271 ], [ 150.05055236816429, -5.316666126251164 ], [ 150.050003051758267, -5.318056106567383 ] ] ], [ [ [ 150.10467529296875, -5.295286178588867 ], [ 150.10369873046875, -5.294867992401123 ], [ 150.103561401367301, -5.293201923370304 ], [ 150.105575561523779, -5.29389476776123 ], [ 150.10467529296875, -5.295286178588867 ] ] ], [ [ [ 150.093505859375114, -5.295429229736328 ], [ 150.091232299804688, -5.293315887451172 ], [ 150.092773437500114, -5.292222023010254 ], [ 150.094970703125114, -5.293922901153564 ], [ 150.093505859375114, -5.295429229736328 ] ] ], [ [ [ 150.026779174804801, -5.288547992706185 ], [ 150.026214599609489, -5.289867877960148 ], [ 150.023239135742415, -5.288755893707219 ], [ 150.02400207519554, -5.287783145904541 ], [ 150.026779174804801, -5.288547992706185 ] ] ], [ [ [ 150.075836181640625, -5.286665916442814 ], [ 150.088027954101904, -5.302546977996826 ], [ 150.070724487304688, -5.318206787109375 ], [ 150.05476379394554, -5.305905818939152 ], [ 150.075836181640625, -5.286665916442814 ] ] ], [ [ [ 150.043548583984375, -5.284893035888615 ], [ 150.045288085937614, -5.28565597534174 ], [ 150.043487548828352, -5.287185192108097 ], [ 150.042160034179915, -5.285865783691293 ], [ 150.043548583984375, -5.284893035888615 ] ] ], [ [ [ 150.069122314453239, -5.275010108947697 ], [ 150.069122314453239, -5.275842189788818 ], [ 150.067810058594091, -5.27521800994873 ], [ 150.068023681640625, -5.274384021759033 ], [ 150.069122314453239, -5.275010108947697 ] ] ], [ [ [ 150.101425170898438, -5.234457969665527 ], [ 150.099334716796875, -5.23452615737915 ], [ 150.099411010742301, -5.233416080474854 ], [ 150.101837158203239, -5.232371807098389 ], [ 150.101425170898438, -5.234457969665527 ] ] ], [ [ [ 150.375549316406364, -5.209166049957275 ], [ 150.374374389648438, -5.204236030578556 ], [ 150.37646484375, -5.203165054321289 ], [ 150.37847900390625, -5.206638813018799 ], [ 150.375549316406364, -5.209166049957275 ] ] ], [ [ [ 150.202301025390625, -5.093002796173096 ], [ 150.200973510742188, -5.092517852783203 ], [ 150.201828002930142, -5.090435028076115 ], [ 150.202926635742301, -5.092030048370361 ], [ 150.202301025390625, -5.093002796173096 ] ] ], [ [ [ 150.193328857421875, -5.085000991821289 ], [ 150.196395874023438, -5.088055133819523 ], [ 150.194641113281364, -5.089914798736515 ], [ 150.192825317382926, -5.089294910430851 ], [ 150.193328857421875, -5.085000991821289 ] ] ], [ [ [ 151.210006713867301, -4.954995155334473 ], [ 151.210281372070426, -4.959447860717717 ], [ 151.206939697265852, -4.960281848907414 ], [ 151.206390380859489, -4.955560207366943 ], [ 151.210006713867301, -4.954995155334473 ] ] ], [ [ [ 151.3646240234375, -4.917444229125977 ], [ 151.475830078125, -4.950832843780461 ], [ 151.531448364257926, -4.923934936523381 ], [ 151.583587646484375, -4.965909004211369 ], [ 151.646469116211051, -4.932185173034611 ], [ 151.690017700195312, -4.97843599319458 ], [ 151.429611206054688, -4.981234073638916 ], [ 151.342208862304915, -5.039535045623779 ], [ 151.265213012695426, -5.150934219360295 ], [ 151.142211914062614, -5.39533519744873 ], [ 151.152908325195312, -5.421435832977238 ], [ 151.213607788085938, -5.432634830474854 ], [ 151.212509155273665, -5.474934101104736 ], [ 151.030319213867415, -5.609535217285099 ], [ 150.950515747070426, -5.599034786224365 ], [ 150.939010620117415, -5.626934051513672 ], [ 150.954818725586165, -5.673435211181584 ], [ 150.945816040039062, -5.702435016632023 ], [ 150.814514160156364, -5.748035907745361 ], [ 150.729217529296989, -5.732833862304631 ], [ 150.594207763671989, -5.73863410949707 ], [ 150.606811523437614, -5.919235229492188 ], [ 150.780181884765739, -6.075234889984074 ], [ 150.746673583984375, -6.126666069030705 ], [ 150.73388671875, -6.110555171966553 ], [ 150.623016357421989, -6.156857967376652 ], [ 150.626663208008154, -6.128610134124756 ], [ 150.61236572265625, -6.134583950042725 ], [ 150.605560302734602, -6.119999885559082 ], [ 150.605560302734602, -6.138610839843693 ], [ 150.586044311523438, -6.152778148651123 ], [ 150.570281982421989, -6.143611907958984 ], [ 150.575942993164062, -6.159893989562988 ], [ 150.559448242187727, -6.150556087493896 ], [ 150.463333129882926, -6.248054981231689 ], [ 150.421661376953125, -6.253890037536564 ], [ 150.383895874023438, -6.278056144714355 ], [ 150.350555419921989, -6.25666618347168 ], [ 150.324722290039176, -6.280000209808293 ], [ 150.319427490234375, -6.274406909942627 ], [ 150.330276489257812, -6.266287803649846 ], [ 150.328887939453125, -6.260831832885685 ], [ 150.325195312500114, -6.257500171661377 ], [ 150.31129455566429, -6.272411823272705 ], [ 150.308334350585938, -6.265000820159912 ], [ 150.288085937500114, -6.264412879943848 ], [ 150.289993286132926, -6.274721145629883 ], [ 150.226394653320426, -6.281387805938664 ], [ 150.225006103515625, -6.25083398818964 ], [ 150.207778930664176, -6.260831832885685 ], [ 150.189163208007812, -6.23375415802002 ], [ 150.16194152832054, -6.238057136535645 ], [ 150.1683349609375, -6.222776889801025 ], [ 150.167221069335938, -6.217501163482666 ], [ 150.153884887695312, -6.25083398818964 ], [ 150.083892822265852, -6.286943912506104 ], [ 150.06719970703125, -6.247820854187012 ], [ 150.047866821289176, -6.240231037139893 ], [ 150.035018920898438, -6.257638931274414 ], [ 150.050003051758267, -6.262500762939396 ], [ 150.021072387695426, -6.265933036804086 ], [ 150.01861572265625, -6.274445056915226 ], [ 150.038330078125114, -6.287777900695801 ], [ 149.998886108398892, -6.31694507598877 ], [ 150.011672973632926, -6.28916597366333 ], [ 150.002563476562614, -6.266452789306641 ], [ 150.004196166992415, -6.283618927001953 ], [ 149.991394042968977, -6.285555839538517 ], [ 149.953887939453239, -6.252778053283691 ], [ 149.938613891602017, -6.272499084472656 ], [ 149.933624267578352, -6.266425132751465 ], [ 149.913986206054915, -6.271990776062012 ], [ 149.899444580078125, -6.294723033904972 ], [ 149.888412475586051, -6.267380237579289 ], [ 149.86138916015625, -6.258056163787842 ], [ 149.851943969726562, -6.285555839538517 ], [ 149.74806213378929, -6.268332958221436 ], [ 149.703063964843864, -6.271527767181396 ], [ 149.669448852539176, -6.293055057525635 ], [ 149.659866333007812, -6.281390190124512 ], [ 149.607772827148438, -6.291388988494816 ], [ 149.553756713867301, -6.241651058196965 ], [ 149.539993286132926, -6.189723014831486 ], [ 149.533615112304688, -6.213889122009277 ], [ 149.49360656738304, -6.138054847717285 ], [ 149.469528198242188, -6.125061988830566 ], [ 149.469726562500227, -6.09333419799799 ], [ 149.333328247070312, -6.054444789886418 ], [ 149.252578735351676, -6.057149887084847 ], [ 149.228546142578239, -6.093471050262451 ], [ 149.181671142578125, -6.091944217681828 ], [ 149.181396484375455, -6.079034805297852 ], [ 149.15167236328125, -6.092500209808293 ], [ 149.153549194336392, -6.080416202545109 ], [ 149.141113281250114, -6.074443817138615 ], [ 149.149444580078125, -6.090556144714355 ], [ 149.121948242187614, -6.140832901000977 ], [ 149.102783203125227, -6.151666164398193 ], [ 149.068054199218864, -6.139720916748047 ], [ 149.038345336914517, -6.161616802215576 ], [ 149.030807495117188, -6.135561943054142 ], [ 149.045837402343864, -6.149188995361328 ], [ 149.061248779296989, -6.132773876190186 ], [ 149.059585571289404, -6.127500057220402 ], [ 149.038192749023551, -6.123610019683781 ], [ 149.059204101562841, -6.111837863922119 ], [ 149.046661376953125, -6.108333110809326 ], [ 149.052764892578125, -6.091372013091984 ], [ 149.030410766601562, -6.069028854370117 ], [ 149.005004882812614, -6.071527004241887 ], [ 149.033737182617415, -6.041240215301457 ], [ 149.0328369140625, -6.015212059020882 ], [ 149.009994506836279, -6.043056011199894 ], [ 149.008346557617415, -6.025833129882812 ], [ 148.913894653320312, -6.010278224945012 ], [ 148.865997314453125, -5.976455211639404 ], [ 148.846786499023665, -5.993813037872314 ], [ 148.842758178710938, -5.974356174468937 ], [ 148.866638183593864, -5.955499172210693 ], [ 148.813049316406364, -5.911387920379639 ], [ 148.774444580078125, -5.911943912506104 ], [ 148.775482177734602, -5.928472995758057 ], [ 148.746902465820767, -5.942441940307617 ], [ 148.767501831055142, -5.912221908569336 ], [ 148.749664306640625, -5.863173007965031 ], [ 148.71630859375, -5.872972965240422 ], [ 148.697311401367642, -5.851208209991398 ], [ 148.650024414062614, -5.852757930755558 ], [ 148.604263305664062, -5.804876804351807 ], [ 148.573028564453125, -5.816949844360352 ], [ 148.5689697265625, -5.838066101074219 ], [ 148.54872131347679, -5.834379196166992 ], [ 148.506912231445426, -5.796977996826172 ], [ 148.39784240722679, -5.77036714553833 ], [ 148.346343994140852, -5.730488777160588 ], [ 148.309997558594091, -5.658333778381348 ], [ 148.326934814453125, -5.600527763366642 ], [ 148.318603515625, -5.564723014831543 ], [ 148.348114013671989, -5.483745098114014 ], [ 148.415039062500114, -5.443070888519287 ], [ 148.492568969726562, -5.472900867462158 ], [ 148.519638061523438, -5.497378826141244 ], [ 148.521041870117415, -5.526931762695256 ], [ 148.557098388672102, -5.538535118102971 ], [ 148.650894165039062, -5.476984977722168 ], [ 148.731842041015739, -5.481948852539062 ], [ 148.797393798828352, -5.531920909881592 ], [ 148.84986877441429, -5.518847942352295 ], [ 148.876937866211051, -5.480278015136719 ], [ 148.897445678711051, -5.486854076385441 ], [ 148.976211547851676, -5.457078933715763 ], [ 149.048675537109375, -5.498382091522217 ], [ 149.070297241210938, -5.488365173339844 ], [ 149.085845947265739, -5.509693145751839 ], [ 149.115097045898438, -5.506971836090031 ], [ 149.180709838867188, -5.537470817565918 ], [ 149.178436279296875, -5.556922912597656 ], [ 149.199539184570312, -5.546717166900635 ], [ 149.210250854492301, -5.583265781402531 ], [ 149.263641357421989, -5.573348999023438 ], [ 149.258331298828466, -5.592223167419377 ], [ 149.292984008789176, -5.560628890991211 ], [ 149.330551147461392, -5.567777156829777 ], [ 149.361648559570426, -5.554773807525635 ], [ 149.375839233398438, -5.570555210113525 ], [ 149.406707763671989, -5.540073871612549 ], [ 149.424621582031364, -5.558008193969727 ], [ 149.440765380859602, -5.557107925414982 ], [ 149.44630432128929, -5.536186218261662 ], [ 149.487915039062614, -5.558201789855957 ], [ 149.504272460937614, -5.53067684173584 ], [ 149.527496337890625, -5.534721851348877 ], [ 149.516616821289062, -5.528069972991943 ], [ 149.57757568359375, -5.496207237243596 ], [ 149.603149414062614, -5.49037504196167 ], [ 149.60150146484375, -5.505498886108398 ], [ 149.6697998046875, -5.491849899291992 ], [ 149.66131591796875, -5.447894096374512 ], [ 149.685516357421989, -5.476587772369385 ], [ 149.673553466796989, -5.540067195892334 ], [ 149.728134155273438, -5.550938129425049 ], [ 149.729629516601676, -5.532049179077092 ], [ 149.775207519531364, -5.519064903259277 ], [ 149.781845092773551, -5.482657909393254 ], [ 149.875839233398665, -5.518332958221379 ], [ 149.940536499023551, -5.468136787414437 ], [ 149.96626281738304, -5.413581848144531 ], [ 149.963821411132812, -5.395048141479492 ], [ 149.928985595703125, -5.385315895080566 ], [ 149.901870727539404, -5.336665153503361 ], [ 149.952880859375114, -5.270842075347844 ], [ 150.000000000000227, -5.257222175598145 ], [ 150.026107788086165, -5.204167842864933 ], [ 149.997802734375114, -5.134904861450195 ], [ 150.029861450195312, -5.099583148956299 ], [ 150.027023315429688, -5.027993202209416 ], [ 150.039352416992188, -5.009679794311523 ], [ 150.093612670898438, -4.997499942779484 ], [ 150.163894653320312, -5.025279045104924 ], [ 150.19232177734375, -5.056291103363037 ], [ 150.180282592773551, -5.088055133819523 ], [ 150.072296142578352, -5.134239196777344 ], [ 150.058334350586165, -5.174446105956974 ], [ 150.080551147460938, -5.217501163482666 ], [ 150.069168090820312, -5.241666793823242 ], [ 150.080245971679688, -5.255968093871957 ], [ 150.018051147460938, -5.286943912506047 ], [ 150.046615600586051, -5.305016994476318 ], [ 150.04888916015625, -5.343887805938721 ], [ 150.057769775390852, -5.352013111114502 ], [ 150.046447753906591, -5.360977172851562 ], [ 150.080490112304915, -5.400086879730225 ], [ 150.102386474609375, -5.479787826538029 ], [ 150.093643188476676, -5.517468929290771 ], [ 150.153671264648438, -5.551902770996094 ], [ 150.226058959961051, -5.538910865783691 ], [ 150.287384033203125, -5.558839797973576 ], [ 150.413131713867415, -5.437722206115723 ], [ 150.452392578125227, -5.425284862518311 ], [ 150.520278930664062, -5.435554981231689 ], [ 150.578521728515852, -5.478977203369084 ], [ 150.598922729492415, -5.541502952575627 ], [ 150.680282592773438, -5.546667098999023 ], [ 150.721542358398551, -5.517461776733342 ], [ 150.748748779296875, -5.474999904632512 ], [ 150.7369384765625, -5.462501049041748 ], [ 150.757110595703239, -5.449818134307861 ], [ 150.81646728515625, -5.44478797912592 ], [ 150.835891723632926, -5.485200881957951 ], [ 150.873123168945312, -5.490647792816105 ], [ 150.90657043457054, -5.481588840484562 ], [ 150.909500122070426, -5.457063198089543 ], [ 150.953170776367301, -5.445977210998478 ], [ 151.008331298828125, -5.370833873748779 ], [ 151.007507324218864, -5.30388879776001 ], [ 151.08583068847679, -5.143332958221436 ], [ 151.165222167968977, -5.088570117950439 ], [ 151.262329101562614, -4.982932090759221 ], [ 151.3460693359375, -4.95359992980957 ], [ 151.346496582031591, -4.913833141326904 ], [ 151.3646240234375, -4.917444229125977 ] ] ], [ [ [ 151.37179565429733, -4.907692909240723 ], [ 151.367416381836051, -4.912841796875 ], [ 151.362106323242301, -4.911366939544621 ], [ 151.36891174316429, -4.901984214782658 ], [ 151.37179565429733, -4.907692909240723 ] ] ], [ [ [ 151.06976318359375, -4.901861190795842 ], [ 151.067810058593864, -4.900322914123535 ], [ 151.068695068359602, -4.899034976959229 ], [ 151.070495605468864, -4.900259017944336 ], [ 151.06976318359375, -4.901861190795842 ] ] ], [ [ [ 151.050521850585938, -4.902830123901367 ], [ 151.046310424804688, -4.902953147888184 ], [ 151.044036865234375, -4.897730827331543 ], [ 151.049682617187614, -4.896758079528809 ], [ 151.050521850585938, -4.902830123901367 ] ] ], [ [ [ 151.176742553711279, -4.883553028106689 ], [ 151.233764648437614, -4.920450210571232 ], [ 151.208206176757926, -4.948867797851562 ], [ 151.162216186523551, -4.958057880401611 ], [ 151.111663818359375, -4.925899028778076 ], [ 151.176742553711279, -4.883553028106689 ] ] ], [ [ [ 149.129241943359375, -4.867638111114502 ], [ 149.127288818359489, -4.869651794433537 ], [ 149.126663208007926, -4.868888854980412 ], [ 149.128326416015739, -4.866944789886418 ], [ 149.129241943359375, -4.867638111114502 ] ] ], [ [ [ 149.143890380859716, -4.860556125640812 ], [ 149.163055419922102, -4.864165782928467 ], [ 149.176116943359489, -4.89083194732666 ], [ 149.135833740234375, -4.923611164093018 ], [ 149.108337402343977, -4.888055801391602 ], [ 149.143890380859716, -4.860556125640812 ] ] ], [ [ [ 149.503616333008154, -4.679444789886418 ], [ 149.506164550781477, -4.680800914764404 ], [ 149.506149291992188, -4.682623863220158 ], [ 149.50152587890625, -4.680650234222412 ], [ 149.503616333008154, -4.679444789886418 ] ] ], [ [ [ 149.496368408203466, -4.641404151916504 ], [ 149.548049926757926, -4.673332214355469 ], [ 149.537368774414176, -4.715266227722168 ], [ 149.505828857422102, -4.702221870422306 ], [ 149.510986328125455, -4.668145179748535 ], [ 149.496566772460938, -4.656470775604248 ], [ 149.46882629394554, -4.669860839843693 ], [ 149.489898681640625, -4.70489597320551 ], [ 149.430282592773665, -4.691944122314453 ], [ 149.446105957031477, -4.659166812896672 ], [ 149.496368408203466, -4.641404151916504 ] ] ], [ [ [ 149.313888549804688, -4.638333797454777 ], [ 149.315826416015739, -4.64305591583252 ], [ 149.314437866210938, -4.644165992736816 ], [ 149.311111450195426, -4.642221927642822 ], [ 149.313888549804688, -4.638333797454777 ] ] ], [ [ [ 149.288330078125, -4.631667137145996 ], [ 149.297775268554688, -4.637221813201904 ], [ 149.29750061035179, -4.642499923706055 ], [ 149.290283203125227, -4.639999866485596 ], [ 149.288330078125, -4.631667137145996 ] ] ], [ [ [ 149.383895874023665, -4.618611812591496 ], [ 149.343338012695426, -4.633055210113525 ], [ 149.319168090820426, -4.626667022705021 ], [ 149.350555419922102, -4.616943836212101 ], [ 149.383895874023665, -4.618611812591496 ] ] ], [ [ [ 149.288604736328239, -4.613612174987793 ], [ 149.291107177734489, -4.615834236144963 ], [ 149.291107177734489, -4.618333816528263 ], [ 149.286941528320654, -4.614721775054875 ], [ 149.288604736328239, -4.613612174987793 ] ] ], [ [ [ 149.113800048828125, -4.546926975250244 ], [ 149.104766845703239, -4.542849063873291 ], [ 149.10755920410179, -4.535851955413818 ], [ 149.11634826660179, -4.540287971496525 ], [ 149.113800048828125, -4.546926975250244 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-WHM", "NAME_1": "Western Highlands" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 144.254913330078239, -5.221435070037842 ], [ 144.282516479492415, -5.219533920288029 ], [ 144.322509765625, -5.277634143829346 ], [ 144.374511718750114, -5.314033985137939 ], [ 144.302810668945312, -5.457933902740422 ], [ 144.298110961914062, -5.514035224914551 ], [ 144.462814331054801, -5.523235797882023 ], [ 144.469711303711051, -5.659835815429688 ], [ 144.513916015625227, -5.68683385848999 ], [ 144.51171875, -5.727735996246281 ], [ 144.489013671875, -5.762633800506592 ], [ 144.383209228515625, -5.75353479385376 ], [ 144.370010375976562, -5.811334133148193 ], [ 144.3004150390625, -5.860835075378418 ], [ 144.274505615234602, -5.921333789825439 ], [ 144.325408935546875, -6.023134231567383 ], [ 144.376510620117188, -6.023734092712402 ], [ 144.430908203125227, -5.992634773254338 ], [ 144.46601867675804, -5.996235847473145 ], [ 144.481719970703125, -6.01463508605957 ], [ 144.479705810546875, -6.161435127258244 ], [ 144.370315551757926, -6.232935905456429 ], [ 144.23211669921875, -6.159035205841008 ], [ 144.001510620117188, -5.997233867645264 ], [ 143.883117675781477, -6.048635959625244 ], [ 143.881805419922102, -5.964734077453613 ], [ 143.830917358398551, -5.937035083770695 ], [ 143.770919799804688, -5.838435173034668 ], [ 143.80531311035179, -5.8211350440979 ], [ 143.867919921875114, -5.821033954620361 ], [ 143.910919189453125, -5.781233787536621 ], [ 143.954910278320312, -5.793735027313232 ], [ 144.0537109375, -5.748233795166016 ], [ 144.025619506836165, -5.665833950042668 ], [ 144.022216796875114, -5.594035148620549 ], [ 143.990417480468864, -5.558934211730957 ], [ 143.994415283203239, -5.478233814239388 ], [ 144.03211975097679, -5.454235076904297 ], [ 144.046112060546989, -5.413335800170898 ], [ 144.11811828613304, -5.380434036254883 ], [ 144.140518188476676, -5.351035118103027 ], [ 144.233306884765852, -5.34393405914301 ], [ 144.24871826171875, -5.278436183929387 ], [ 144.241409301757926, -5.231833934783936 ], [ 144.254913330078239, -5.221435070037842 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PG-WPD", "NAME_1": "Western" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 141.569122314453352, -9.523050308227539 ], [ 141.568893432617188, -9.519166946411076 ], [ 141.573333740234602, -9.51249980926508 ], [ 141.574645996093977, -9.517151832580453 ], [ 141.569122314453352, -9.523050308227539 ] ] ], [ [ [ 142.661331176757926, -9.428422927856445 ], [ 142.658279418945426, -9.428867340087891 ], [ 142.653671264648665, -9.428190231323185 ], [ 142.662109375, -9.428190231323185 ], [ 142.661331176757926, -9.428422927856445 ] ] ], [ [ [ 142.744735717773779, -9.418585777282658 ], [ 142.74427795410179, -9.418885231018066 ], [ 142.747268676757812, -9.415566444396916 ], [ 142.746078491210938, -9.417434692382756 ], [ 142.744735717773779, -9.418585777282658 ] ] ], [ [ [ 142.533187866211051, -9.411385536193791 ], [ 142.538101196289517, -9.410627365112248 ], [ 142.543075561523551, -9.419412612914982 ], [ 142.552505493164062, -9.420276641845703 ], [ 142.548995971679801, -9.423785209655762 ], [ 142.53085327148483, -9.414399147033691 ], [ 142.528778076171989, -9.427544593811035 ], [ 142.527908325195312, -9.411348342895508 ], [ 142.533187866211051, -9.411385536193791 ] ] ], [ [ [ 142.599609375, -9.40929985046381 ], [ 142.596588134765625, -9.403185844421387 ], [ 142.600082397461165, -9.396608352661076 ], [ 142.597656250000114, -9.403989791870117 ], [ 142.599609375, -9.40929985046381 ] ] ], [ [ [ 142.631576538086051, -9.369168281555176 ], [ 142.629608154297102, -9.368770599365234 ], [ 142.629516601562614, -9.367729187011719 ], [ 142.633483886718864, -9.367620468139592 ], [ 142.631576538086051, -9.369168281555176 ] ] ], [ [ [ 142.654556274414062, -9.365497589111328 ], [ 142.670761108398438, -9.375241279601994 ], [ 142.706436157226562, -9.381782531738224 ], [ 142.743164062500114, -9.366120338439941 ], [ 142.794403076172102, -9.370869636535645 ], [ 142.799560546875114, -9.373188018798771 ], [ 142.801040649414062, -9.376838684081974 ], [ 142.744812011718977, -9.370169639587402 ], [ 142.703063964843977, -9.384859085083008 ], [ 142.646865844726676, -9.368320465087834 ], [ 142.600021362304688, -9.395412445068303 ], [ 142.60867309570358, -9.380365371704102 ], [ 142.654556274414062, -9.365497589111328 ] ] ], [ [ [ 142.666717529296989, -9.361317634582463 ], [ 142.670120239257812, -9.363975524902344 ], [ 142.66529846191429, -9.367181777954102 ], [ 142.66279602050804, -9.362628936767521 ], [ 142.666717529296989, -9.361317634582463 ] ] ], [ [ [ 142.690536499023551, -9.358120918273926 ], [ 142.71441650390625, -9.362845420837402 ], [ 142.724929809570312, -9.368817329406738 ], [ 142.66737365722679, -9.371517181396484 ], [ 142.690536499023551, -9.358120918273926 ] ] ], [ [ [ 142.721908569335938, -9.308305740356388 ], [ 142.725189208984602, -9.309160232543888 ], [ 142.717926025390739, -9.309996604919434 ], [ 142.720504760742301, -9.307789802551213 ], [ 142.721908569335938, -9.308305740356388 ] ] ], [ [ [ 142.23779296875, -9.2882080078125 ], [ 142.238906860351904, -9.28939056396473 ], [ 142.2364501953125, -9.288117408752441 ], [ 142.23779296875, -9.2882080078125 ] ] ], [ [ [ 142.23500061035179, -9.288332939147949 ], [ 142.2320556640625, -9.288612365722599 ], [ 142.2296142578125, -9.288076400756779 ], [ 142.23554992675804, -9.288052558898869 ], [ 142.23500061035179, -9.288332939147949 ] ] ], [ [ [ 142.774063110351676, -9.283808708190861 ], [ 142.77076721191429, -9.280080795288029 ], [ 142.772262573242188, -9.277545928955021 ], [ 142.775512695312727, -9.282045364379883 ], [ 142.774063110351676, -9.283808708190861 ] ] ], [ [ [ 142.74787902832054, -9.27794075012207 ], [ 142.748748779296875, -9.280659675598145 ], [ 142.743438720703125, -9.27924919128418 ], [ 142.74493408203125, -9.277373313903809 ], [ 142.74787902832054, -9.27794075012207 ] ] ], [ [ [ 142.742660522460938, -9.278395652770939 ], [ 142.740707397461051, -9.277074813842773 ], [ 142.741973876953352, -9.275590896606388 ], [ 142.743072509765625, -9.276479721069336 ], [ 142.742660522460938, -9.278395652770939 ] ] ], [ [ [ 142.292709350585938, -9.2714586257934 ], [ 142.292343139648438, -9.271853446960449 ], [ 142.292709350585938, -9.271047592163086 ], [ 142.292709350585938, -9.2714586257934 ] ] ], [ [ [ 142.12971496582054, -9.261389732360783 ], [ 142.1280517578125, -9.263611793518066 ], [ 142.125549316406364, -9.262778282165527 ], [ 142.126251220703352, -9.261863708496094 ], [ 142.12971496582054, -9.261389732360783 ] ] ], [ [ [ 142.138748168945426, -9.235529899597168 ], [ 142.137588500976562, -9.234212875366154 ], [ 142.138839721679915, -9.233358383178654 ], [ 142.139724731445654, -9.234807968139648 ], [ 142.138748168945426, -9.235529899597168 ] ] ], [ [ [ 142.223495483398438, -9.230155944824162 ], [ 142.244995117187614, -9.256111145019531 ], [ 142.26625061035179, -9.249738693237248 ], [ 142.276672363281591, -9.251388549804688 ], [ 142.293609619140625, -9.259443283081055 ], [ 142.29432678222679, -9.265646934509277 ], [ 142.243316650390625, -9.259199142455998 ], [ 142.22181701660179, -9.232499122619629 ], [ 142.130661010742415, -9.267311096191406 ], [ 142.223495483398438, -9.230155944824162 ] ] ], [ [ [ 142.151901245117301, -9.231920242309513 ], [ 142.148376464843977, -9.235749244689941 ], [ 142.14668273925804, -9.235516548156681 ], [ 142.152557373046875, -9.226446151733398 ], [ 142.151901245117301, -9.231920242309513 ] ] ], [ [ [ 142.151382446289062, -9.226710319518929 ], [ 142.14794921875, -9.231202125549316 ], [ 142.144134521484375, -9.231520652770996 ], [ 142.14460754394554, -9.225918769836426 ], [ 142.151382446289062, -9.226710319518929 ] ] ], [ [ [ 142.157241821289176, -9.228055000305176 ], [ 142.16157531738304, -9.226503372192383 ], [ 142.153930664062727, -9.238263130187931 ], [ 142.155532836914176, -9.224808692932129 ], [ 142.157241821289176, -9.228055000305176 ] ] ], [ [ [ 142.167831420898665, -9.223043441772404 ], [ 142.177444458007926, -9.223799705505371 ], [ 142.188613891601562, -9.232464790344181 ], [ 142.167190551758154, -9.225159645080566 ], [ 142.155334472656364, -9.247236251831055 ], [ 142.167831420898665, -9.223043441772404 ] ] ], [ [ [ 142.14785766601608, -9.225824356079045 ], [ 142.144760131836165, -9.223957061767521 ], [ 142.152206420898551, -9.2222642898559 ], [ 142.151672363281705, -9.225213050842228 ], [ 142.14785766601608, -9.225824356079045 ] ] ], [ [ [ 142.23941040039108, -9.220879554748535 ], [ 142.250946044921875, -9.228588104248047 ], [ 142.250762939453125, -9.233658790588379 ], [ 142.231918334961165, -9.223686218261719 ], [ 142.23941040039108, -9.220879554748535 ] ] ], [ [ [ 142.277770996093864, -9.195556640625 ], [ 142.30805969238304, -9.204998970031681 ], [ 142.316223144531477, -9.213686943054199 ], [ 142.30574035644554, -9.219354629516602 ], [ 142.277770996093864, -9.195556640625 ] ] ], [ [ [ 142.055313110351676, -9.180896759033203 ], [ 142.07244873046875, -9.18709659576416 ], [ 142.064666748047102, -9.201765060424748 ], [ 142.029312133789062, -9.19951343536377 ], [ 142.055313110351676, -9.180896759033203 ] ] ], [ [ [ 142.012939453125, -9.180007934570312 ], [ 142.021286010742188, -9.191593170166016 ], [ 141.965560913086051, -9.19999885559082 ], [ 141.974166870117529, -9.183055877685433 ], [ 142.012939453125, -9.180007934570312 ] ] ], [ [ [ 142.022811889648438, -9.17801570892334 ], [ 142.032684326171875, -9.181888580322209 ], [ 142.024810791015852, -9.189400672912598 ], [ 142.014205932617301, -9.179532051086369 ], [ 142.022811889648438, -9.17801570892334 ] ] ], [ [ [ 143.248062133789176, -9.093889236450195 ], [ 143.273681640625, -9.101122856140137 ], [ 143.263885498046989, -9.140831947326546 ], [ 143.19917297363304, -9.132778167724553 ], [ 143.248062133789176, -9.093889236450195 ] ] ], [ [ [ 143.210784912109489, -9.066450119018498 ], [ 143.236938476562727, -9.081944465637207 ], [ 143.192504882812727, -9.100555419921818 ], [ 143.182159423828352, -9.082289695739689 ], [ 143.210784912109489, -9.066450119018498 ] ] ], [ [ [ 143.436660766601676, -8.966665267944336 ], [ 143.451110839843864, -8.981666564941406 ], [ 143.436111450195312, -9.026390075683594 ], [ 143.416183471679688, -9.019030570983887 ], [ 143.401870727539062, -9.038821220397892 ], [ 143.376449584961279, -9.022190093994141 ], [ 143.391113281250114, -8.991666793823185 ], [ 143.436660766601676, -8.966665267944336 ] ] ], [ [ [ 143.541671752929688, -8.864962577819767 ], [ 143.546829223632812, -8.87147045135498 ], [ 143.545516967773665, -8.874100685119629 ], [ 143.540420532226676, -8.864406585693303 ], [ 143.541671752929688, -8.864962577819767 ] ] ], [ [ [ 143.654281616211392, -8.754575729370117 ], [ 143.652618408203239, -8.752361297607365 ], [ 143.652755737305142, -8.7509765625 ], [ 143.654556274414062, -8.753191947936955 ], [ 143.654281616211392, -8.754575729370117 ] ] ], [ [ [ 143.66000366210983, -8.748611450195312 ], [ 143.66583251953125, -8.756112098693791 ], [ 143.665557861328239, -8.757499694824162 ], [ 143.658615112304915, -8.752499580383301 ], [ 143.66000366210983, -8.748611450195312 ] ] ], [ [ [ 143.654449462890852, -8.744444847106934 ], [ 143.654998779297102, -8.746666908264103 ], [ 143.65083312988304, -8.746110916137638 ], [ 143.652496337890625, -8.744723320007211 ], [ 143.654449462890852, -8.744444847106934 ] ] ], [ [ [ 143.418060302734375, -8.710835456848145 ], [ 143.426391601562614, -8.718610763549805 ], [ 143.426666259765625, -8.731944084167367 ], [ 143.418884277343977, -8.724167823791447 ], [ 143.418060302734375, -8.710835456848145 ] ] ], [ [ [ 143.439437866210938, -8.702221870422306 ], [ 143.459442138671875, -8.734722137451115 ], [ 143.444442749023665, -8.774721145629826 ], [ 143.427215576171875, -8.706110000610352 ], [ 143.439437866210938, -8.702221870422306 ] ] ], [ [ [ 143.35194396972679, -8.670556068420353 ], [ 143.368057250976904, -8.682499885559082 ], [ 143.407501220703125, -8.702500343322697 ], [ 143.383895874023438, -8.706388473510742 ], [ 143.35194396972679, -8.670556068420353 ] ] ], [ [ [ 143.360275268554688, -8.650278091430607 ], [ 143.397506713867415, -8.657222747802734 ], [ 143.423339843750114, -8.690833091735783 ], [ 143.366668701171989, -8.663888931274357 ], [ 143.360275268554688, -8.650278091430607 ] ] ], [ [ [ 143.33193969726608, -8.650278091430607 ], [ 143.330001831054915, -8.650555610656738 ], [ 143.329437255859602, -8.645556449890137 ], [ 143.332778930664062, -8.648612022399902 ], [ 143.33193969726608, -8.650278091430607 ] ] ], [ [ [ 143.292221069336165, -8.60583305358881 ], [ 143.294723510742415, -8.606666564941406 ], [ 143.294723510742415, -8.610833168029785 ], [ 143.291381835937841, -8.608332633972111 ], [ 143.292221069336165, -8.60583305358881 ] ] ], [ [ [ 143.259719848633154, -8.520000457763672 ], [ 143.316940307617529, -8.547222137451115 ], [ 143.345275878906477, -8.603056907653809 ], [ 143.301116943359375, -8.574443817138672 ], [ 143.259719848633154, -8.520000457763672 ] ] ], [ [ [ 143.282226562500341, -8.507498741149902 ], [ 143.287506103515739, -8.509720802307129 ], [ 143.294174194336392, -8.517499923705998 ], [ 143.274169921875114, -8.51027774810791 ], [ 143.282226562500341, -8.507498741149902 ] ] ], [ [ [ 143.78089904785179, -8.50715255737299 ], [ 143.780624389648438, -8.505208969116154 ], [ 143.781738281250114, -8.503542900085449 ], [ 143.784515380859489, -8.502709388732853 ], [ 143.78089904785179, -8.50715255737299 ] ] ], [ [ [ 143.80389404296875, -8.491109848022404 ], [ 143.820007324218977, -8.521388053894043 ], [ 143.79902648925804, -8.541161537170296 ], [ 143.784164428711165, -8.513055801391602 ], [ 143.80389404296875, -8.491109848022404 ] ] ], [ [ [ 143.20222473144554, -8.467222213745117 ], [ 143.211669921875, -8.471111297607365 ], [ 143.229446411132812, -8.493331909179631 ], [ 143.210281372070312, -8.48639011383051 ], [ 143.20222473144554, -8.467222213745117 ] ] ], [ [ [ 143.63055419921875, -8.458612442016602 ], [ 143.6572265625, -8.468056678771973 ], [ 143.673889160156364, -8.501667022705078 ], [ 143.638061523437727, -8.536390304565373 ], [ 143.596389770507812, -8.498611450195312 ], [ 143.601669311523438, -8.467222213745117 ], [ 143.63055419921875, -8.458612442016602 ] ] ], [ [ [ 143.31361389160179, -8.454721450805664 ], [ 143.324996948242188, -8.461943626403752 ], [ 143.300277709961392, -8.45916557312006 ], [ 143.302215576171875, -8.45694446563715 ], [ 143.31361389160179, -8.454721450805664 ] ] ], [ [ [ 143.16273498535179, -8.462706565856877 ], [ 143.178329467773438, -8.467779159545898 ], [ 143.225555419921989, -8.518610000610352 ], [ 143.168609619140625, -8.487500190734863 ], [ 143.142776489257926, -8.451945304870492 ], [ 143.16273498535179, -8.462706565856877 ] ] ], [ [ [ 143.298339843750227, -8.446945190429688 ], [ 143.307785034180029, -8.451389312744084 ], [ 143.276107788086051, -8.450554847717228 ], [ 143.278060913085938, -8.449444770812988 ], [ 143.298339843750227, -8.446945190429688 ] ] ], [ [ [ 143.728607177734375, -8.434721946716309 ], [ 143.77667236328125, -8.453888893127385 ], [ 143.790557861328125, -8.481389999389535 ], [ 143.783050537109489, -8.500556945800781 ], [ 143.71833801269554, -8.462499618530217 ], [ 143.728607177734375, -8.434721946716309 ] ] ], [ [ [ 143.701873779296875, -8.4393053054809 ], [ 143.692703247070312, -8.438749313354435 ], [ 143.692703247070312, -8.437639236450195 ], [ 143.699371337890625, -8.434028625488224 ], [ 143.701873779296875, -8.4393053054809 ] ] ], [ [ [ 143.327224731445426, -8.414166450500488 ], [ 143.341384887695312, -8.422223091125431 ], [ 143.34027099609375, -8.435000419616699 ], [ 143.33193969726608, -8.43194580078125 ], [ 143.327224731445426, -8.414166450500488 ] ] ], [ [ [ 143.572494506836051, -8.404166221618539 ], [ 143.607772827148438, -8.446110725402832 ], [ 143.583343505859489, -8.490557670593205 ], [ 143.565826416015739, -8.482777595519963 ], [ 143.585556030273438, -8.494722366332951 ], [ 143.575836181640852, -8.509443283081055 ], [ 143.4403076171875, -8.432827949523926 ], [ 143.47833251953125, -8.41805458068842 ], [ 143.506683349609375, -8.436884880065918 ], [ 143.537506103515852, -8.441945075988713 ], [ 143.55694580078125, -8.43194580078125 ], [ 143.572494506836051, -8.404166221618539 ] ] ], [ [ [ 143.210067749023551, -8.402986526489201 ], [ 143.271942138671875, -8.459721565246582 ], [ 143.384994506835938, -8.481943130493107 ], [ 143.475006103515739, -8.524723052978459 ], [ 143.58917236328125, -8.624444007873535 ], [ 143.633056640625227, -8.64000129699707 ], [ 143.637771606445312, -8.689723014831543 ], [ 143.61610412597679, -8.702221870422306 ], [ 143.582778930664176, -8.659444808959961 ], [ 143.403335571289176, -8.580556869506779 ], [ 143.351669311523438, -8.520556449890137 ], [ 143.263061523437727, -8.484722137451172 ], [ 143.188339233398551, -8.426945686340332 ], [ 143.210067749023551, -8.402986526489201 ] ] ], [ [ [ 143.134445190429688, -8.407221794128418 ], [ 143.12666320800804, -8.399167060852051 ], [ 143.143325805664176, -8.396666526794434 ], [ 143.14111328125, -8.40333366394043 ], [ 143.134445190429688, -8.407221794128418 ] ] ], [ [ [ 143.156524658203239, -8.407777786254883 ], [ 143.152923583984375, -8.398611068725472 ], [ 143.16542053222679, -8.398332595825195 ], [ 143.16542053222679, -8.400277137756291 ], [ 143.156524658203239, -8.407777786254883 ] ] ], [ [ [ 143.288894653320426, -8.39527702331543 ], [ 143.320556640625114, -8.409999847412053 ], [ 143.33111572265625, -8.43388843536377 ], [ 143.295272827148665, -8.423333168029785 ], [ 143.288894653320426, -8.39527702331543 ] ] ], [ [ [ 143.665283203125, -8.393889427185059 ], [ 143.68611145019554, -8.414443969726562 ], [ 143.678054809570312, -8.424445152282658 ], [ 143.653060913085938, -8.428334236144963 ], [ 143.631942749023665, -8.411109924316406 ], [ 143.665283203125, -8.393889427185059 ] ] ], [ [ [ 143.260284423828239, -8.391388893127441 ], [ 143.274444580078125, -8.401667594909611 ], [ 143.298889160156477, -8.439443588256836 ], [ 143.253326416015852, -8.428611755371094 ], [ 143.241943359375, -8.398611068725472 ], [ 143.260284423828239, -8.391388893127441 ] ] ], [ [ [ 143.074172973632812, -8.382778167724609 ], [ 143.063613891601676, -8.402223587036076 ], [ 143.023056030273438, -8.408056259155273 ], [ 142.984451293945312, -8.403889656066895 ], [ 142.973388671875, -8.387309074401855 ], [ 143.074172973632812, -8.382778167724609 ] ] ], [ [ [ 143.575836181640852, -8.375555992126351 ], [ 143.605834960937955, -8.401111602783146 ], [ 143.625549316406591, -8.435277938842773 ], [ 143.571105957031477, -8.399721145629826 ], [ 143.575836181640852, -8.375555992126351 ] ] ], [ [ [ 143.114028930664062, -8.380000114440918 ], [ 143.109298706054915, -8.376943588256779 ], [ 143.130966186523551, -8.363888740539551 ], [ 143.14263916015625, -8.366110801696721 ], [ 143.114028930664062, -8.380000114440918 ] ] ], [ [ [ 143.103881835937614, -8.386361122131291 ], [ 143.091110229492529, -8.390542984008789 ], [ 143.094726562500114, -8.361666679382324 ], [ 143.102951049804688, -8.365121841430607 ], [ 143.103881835937614, -8.386361122131291 ] ] ], [ [ [ 143.089447021484375, -8.359722137451115 ], [ 143.082229614257926, -8.370833396911621 ], [ 143.062240600586392, -8.367996215820312 ], [ 143.062942504882812, -8.360795974731445 ], [ 143.089447021484375, -8.359722137451115 ] ] ], [ [ [ 143.036392211914062, -8.355555534362793 ], [ 143.044998168945312, -8.361388206481934 ], [ 143.019515991211392, -8.371945381164494 ], [ 143.023605346679688, -8.354999542236328 ], [ 143.036392211914062, -8.355555534362793 ] ] ], [ [ [ 143.334716796875, -8.345832824707031 ], [ 143.376937866211165, -8.367501258850098 ], [ 143.561386108398665, -8.35888767242426 ], [ 143.57000732421875, -8.400554656982365 ], [ 143.538894653320426, -8.439443588256836 ], [ 143.480560302734489, -8.416389465331974 ], [ 143.408615112305142, -8.424999237060547 ], [ 143.315277099609375, -8.369998931884766 ], [ 143.334716796875, -8.345832824707031 ] ] ], [ [ [ 142.94721984863304, -8.345276832580453 ], [ 142.954727172851676, -8.348055839538517 ], [ 142.936386108398438, -8.348334312438965 ], [ 142.941390991210938, -8.3455553054809 ], [ 142.94721984863304, -8.345276832580453 ] ] ], [ [ [ 142.930831909179801, -8.339166641235295 ], [ 142.935836791992301, -8.341944694519043 ], [ 142.929443359375227, -8.345832824707031 ], [ 142.927505493164062, -8.340276718139648 ], [ 142.930831909179801, -8.339166641235295 ] ] ], [ [ [ 143.357772827148438, -8.34416675567627 ], [ 143.355270385742301, -8.342498779296875 ], [ 143.35455322265625, -8.339207649230957 ], [ 143.358062744140852, -8.341388702392578 ], [ 143.357772827148438, -8.34416675567627 ] ] ], [ [ [ 143.309722900390625, -8.336944580078068 ], [ 143.320831298828352, -8.34305477142334 ], [ 143.306396484375114, -8.357500076293888 ], [ 143.300552368164062, -8.352499961853027 ], [ 143.309722900390625, -8.336944580078068 ] ] ], [ [ [ 143.387283325195312, -8.332839965820256 ], [ 143.437774658203352, -8.34305477142334 ], [ 143.446395874023551, -8.349444389343262 ], [ 143.361938476562614, -8.349167823791447 ], [ 143.359161376953352, -8.338889122009277 ], [ 143.387283325195312, -8.332839965820256 ] ] ], [ [ [ 143.32861328125, -8.328887939453125 ], [ 143.336395263672216, -8.333057403564453 ], [ 143.312500000000114, -8.334348678588867 ], [ 143.318054199218864, -8.330555915832463 ], [ 143.32861328125, -8.328887939453125 ] ] ], [ [ [ 143.57472229003929, -8.326944351196289 ], [ 143.640548706055142, -8.336944580078068 ], [ 143.663604736328352, -8.355832099914494 ], [ 143.671951293945312, -8.394445419311523 ], [ 143.657775878906364, -8.392223358154297 ], [ 143.651382446289176, -8.394166946411133 ], [ 143.628616333007812, -8.409166336059513 ], [ 143.574996948242301, -8.355555534362793 ], [ 143.528060913086051, -8.34000110626215 ], [ 143.57472229003929, -8.326944351196289 ] ] ], [ [ [ 142.899719238281477, -8.32499980926508 ], [ 142.9244384765625, -8.336667060851994 ], [ 142.926116943359489, -8.3455553054809 ], [ 142.88916015625, -8.327777862548771 ], [ 142.899719238281477, -8.32499980926508 ] ] ], [ [ [ 143.357772827148438, -8.32388973236084 ], [ 143.377227783203125, -8.32944393157959 ], [ 143.38166809082054, -8.332221984863281 ], [ 143.342773437500114, -8.329999923706055 ], [ 143.357772827148438, -8.32388973236084 ] ] ], [ [ [ 143.120605468750455, -8.33464527130127 ], [ 143.064437866210938, -8.355278015136719 ], [ 143.033813476562727, -8.345346450805664 ], [ 143.044525146484489, -8.329774856567383 ], [ 143.138336181640852, -8.321111679077148 ], [ 143.120605468750455, -8.33464527130127 ] ] ], [ [ [ 143.300842285156477, -8.323158264160156 ], [ 143.268188476562727, -8.356388092040959 ], [ 143.21417236328125, -8.365925788879395 ], [ 143.117919921875227, -8.346542358398438 ], [ 143.167083740234375, -8.328056335449162 ], [ 143.300842285156477, -8.323158264160156 ] ] ], [ [ [ 143.383331298828125, -8.303609848022404 ], [ 143.485000610351562, -8.308610916137695 ], [ 143.494995117187727, -8.318888664245549 ], [ 143.470840454101676, -8.333888053894043 ], [ 143.303329467773892, -8.317776679992619 ], [ 143.383331298828125, -8.303609848022404 ] ] ], [ [ [ 143.212783813476676, -8.301112174987793 ], [ 143.238327026367301, -8.30694389343256 ], [ 143.177780151367415, -8.306110382080078 ], [ 143.186660766601676, -8.301943778991699 ], [ 143.212783813476676, -8.301112174987793 ] ] ], [ [ [ 143.23500061035179, -8.291110992431641 ], [ 143.236114501953125, -8.295556068420353 ], [ 143.229995727539062, -8.293889999389592 ], [ 143.230834960937727, -8.291945457458496 ], [ 143.23500061035179, -8.291110992431641 ] ] ], [ [ [ 143.394729614257926, -8.28972339630127 ], [ 143.389160156250455, -8.293333053588867 ], [ 143.38166809082054, -8.291110992431641 ], [ 143.382507324218864, -8.28972339630127 ], [ 143.394729614257926, -8.28972339630127 ] ] ], [ [ [ 143.636688232422102, -8.088068008422795 ], [ 143.680480957031591, -8.111944198608398 ], [ 143.691040039062727, -8.144444465637207 ], [ 143.639648437500114, -8.174445152282715 ], [ 143.586318969726562, -8.130555152893066 ], [ 143.579376220703239, -8.104167938232422 ], [ 143.636688232422102, -8.088068008422795 ] ] ], [ [ [ 143.546600341796875, -8.064723014831486 ], [ 143.542984008789062, -8.056389808654728 ], [ 143.543533325195654, -8.050276756286621 ], [ 143.546600341796875, -8.053890228271428 ], [ 143.546600341796875, -8.064723014831486 ] ] ], [ [ [ 143.597778320312727, -8.012776374816895 ], [ 143.66680908203125, -8.041367530822754 ], [ 143.701385498047102, -8.095555305480957 ], [ 143.651382446289176, -8.074444770812988 ], [ 143.571105957031477, -8.07833290100092 ], [ 143.543609619140852, -8.0272216796875 ], [ 143.597778320312727, -8.012776374816895 ] ] ], [ [ [ 143.397109985351562, -7.984169006347599 ], [ 143.395736694335938, -7.984169006347599 ], [ 143.393524169922102, -7.985568046569767 ], [ 143.393798828125114, -7.983323097228947 ], [ 143.397109985351562, -7.984169006347599 ] ] ], [ [ [ 143.412139892578125, -7.931124210357609 ], [ 143.431808471679688, -7.935035228729191 ], [ 143.461029052734489, -8.013050079345703 ], [ 143.537246704101562, -8.039809226989746 ], [ 143.548248291015739, -8.078791618347168 ], [ 143.570358276367642, -8.110816001891976 ], [ 143.470840454101676, -8.074444770812988 ], [ 143.450271606445312, -8.022223472595215 ], [ 143.414443969726562, -8.01500129699707 ], [ 143.39404296875, -7.988327980041504 ], [ 143.409637451172216, -7.976107120513916 ], [ 143.384353637695426, -7.955300807952824 ], [ 143.388519287109375, -7.934464931488037 ], [ 143.412139892578125, -7.931124210357609 ] ] ], [ [ [ 141.002410888671875, -4.987235069274846 ], [ 142.122573852539062, -5.370335102081299 ], [ 142.078506469726562, -5.417335033416691 ], [ 142.06697082519554, -5.469642162322998 ], [ 142.570114135742415, -5.882334232330265 ], [ 142.626007080078352, -5.903635025024414 ], [ 142.631607055664176, -6.809134960174504 ], [ 142.665008544922216, -6.823635101318303 ], [ 142.99472045898483, -6.822734832763672 ], [ 142.995513916015625, -6.999135017394963 ], [ 143.049118041992301, -7.075735092163029 ], [ 143.696807861328352, -7.756535053253117 ], [ 143.868118286132926, -7.927834987640324 ], [ 143.91552734375, -7.9542942047118 ], [ 143.924163818359602, -7.988889217376652 ], [ 143.906112670898551, -8.003611564636174 ], [ 143.853195190429915, -7.953901767730656 ], [ 143.815063476562727, -7.959982872009277 ], [ 143.782501220703239, -7.935832977294865 ], [ 143.787216186523665, -7.904167175292912 ], [ 143.780914306640852, -7.888368129730168 ], [ 143.751663208007812, -7.896666049957275 ], [ 143.744171142578239, -7.906667232513371 ], [ 143.77874755859375, -7.890340805053711 ], [ 143.780593872070426, -7.94196796417225 ], [ 143.814422607421875, -7.96829891204834 ], [ 143.851913452148438, -7.963387966156006 ], [ 143.875000000000114, -8.018889427185059 ], [ 143.861114501953125, -8.04749870300293 ], [ 143.730560302734602, -8.04305458068842 ], [ 143.604537963867301, -7.988643169403019 ], [ 143.543334960937614, -8.007499694824219 ], [ 143.486389160156477, -8.000834465026799 ], [ 143.437103271484716, -7.910748958587646 ], [ 143.366455078125227, -7.907995223999023 ], [ 143.346801757812727, -7.83418083190918 ], [ 143.31927490234375, -7.837701797485352 ], [ 143.309234619140852, -7.879158020019474 ], [ 143.259460449219205, -7.879902839660645 ], [ 143.260147094726562, -7.793570995330811 ], [ 143.256729125976562, -7.88607215881342 ], [ 143.314025878906364, -7.886102199554443 ], [ 143.338119506835938, -7.8458251953125 ], [ 143.357772827148438, -7.925278186798096 ], [ 143.382629394531477, -7.934587955474854 ], [ 143.383377075195312, -7.958621978759709 ], [ 143.406631469726562, -7.97695779800415 ], [ 143.391159057617188, -7.983095169067269 ], [ 143.39027404785179, -7.994872093200684 ], [ 143.415283203125227, -8.022223472595215 ], [ 143.445007324218864, -8.026667594909611 ], [ 143.465270996093864, -8.08055591583252 ], [ 143.536117553710938, -8.105554580688477 ], [ 143.630828857421989, -8.185832977294922 ], [ 143.704437255859602, -8.17500114440918 ], [ 143.709167480468977, -8.216387748718148 ], [ 143.635833740234489, -8.238055229187012 ], [ 143.541107177734375, -8.238611221313477 ], [ 143.537780761718864, -8.226110458374023 ], [ 143.34944152832054, -8.243333816528263 ], [ 142.98583984375, -8.336388587951603 ], [ 142.899169921875114, -8.318888664245549 ], [ 142.859771728515625, -8.32088565826416 ], [ 142.845001220703239, -8.367780685424748 ], [ 142.923339843750227, -8.417778968811035 ], [ 143.117782592773551, -8.460556030273438 ], [ 143.2550048828125, -8.571390151977482 ], [ 143.39277648925804, -8.741389274597168 ], [ 143.420272827148551, -8.961944580078125 ], [ 143.372772216796989, -9.008056640624886 ], [ 143.330322265625, -9.02656078338623 ], [ 143.283050537109375, -9.016944885253906 ], [ 143.184982299804688, -9.037659645080566 ], [ 143.233337402343864, -9.015555381774846 ], [ 143.235549926757812, -9.00916671752924 ], [ 143.245834350585938, -8.999444007873535 ], [ 143.247772216797102, -8.99416542053217 ], [ 143.235275268554801, -9.007500648498478 ], [ 143.231384277343864, -9.015276908874455 ], [ 143.172210693359375, -9.039918899536133 ], [ 143.13861083984375, -9.071666717529183 ], [ 143.010284423828125, -9.1036119461059 ], [ 142.92730712890625, -9.175140380859261 ], [ 142.78118896484375, -9.263046264648381 ], [ 142.765716552734716, -9.259292602539062 ], [ 142.638916015625, -9.333086967468262 ], [ 142.568664550781364, -9.323000907897892 ], [ 142.479995727539404, -9.25000095367426 ], [ 142.41560363769554, -9.218884468078613 ], [ 142.297836303711051, -9.196345329284668 ], [ 142.20269775390625, -9.130989074707031 ], [ 142.170135498046989, -9.158251762390137 ], [ 142.080917358398551, -9.178321838378906 ], [ 141.959167480468977, -9.171111106872445 ], [ 141.9244384765625, -9.19666671752924 ], [ 141.884445190429915, -9.201666831970215 ], [ 141.771118164062614, -9.179999351501465 ], [ 141.625839233398551, -9.212222099304199 ], [ 141.521118164062614, -9.195000648498421 ], [ 141.4505615234375, -9.143889427185059 ], [ 141.348892211914176, -9.141944885253849 ], [ 141.340270996093977, -9.130000114440861 ], [ 141.233062744140852, -9.214444160461369 ], [ 141.138885498046989, -9.234721183776742 ], [ 141.020828247070426, -9.131943702697697 ], [ 141.026107788086051, -9.118055343627873 ], [ 141.006820678710938, -9.121541976928711 ], [ 141.011764526367188, -7.999898910522461 ], [ 140.982391357421875, -6.891974925994873 ], [ 140.951217651367188, -6.876529216766357 ], [ 140.936355590820426, -6.895720005035344 ], [ 140.925994873047102, -6.878479957580566 ], [ 140.936248779296875, -6.84686899185175 ], [ 140.923446655273438, -6.860859870910588 ], [ 140.897811889648438, -6.856439113616943 ], [ 140.8841552734375, -6.835978984832764 ], [ 140.902603149414176, -6.805129051208439 ], [ 140.858093261718977, -6.780619144439584 ], [ 140.885437011718864, -6.740618228912354 ], [ 140.836395263671875, -6.713048934936523 ], [ 140.8343505859375, -6.676589965820256 ], [ 140.864257812500114, -6.67130517959589 ], [ 140.856399536132926, -6.630125045776367 ], [ 140.893905639648438, -6.623135089874268 ], [ 140.894317626953352, -6.588254928588867 ], [ 140.918701171875, -6.551150798797607 ], [ 140.931884765625114, -6.553237915039062 ], [ 140.922027587890739, -6.488733768463135 ], [ 140.956970214843864, -6.476916790008545 ], [ 140.940017700195312, -6.439035892486572 ], [ 140.956451416015625, -6.363737106323185 ], [ 140.973236083984375, -6.35559606552124 ], [ 140.957015991210938, -6.341135025024357 ], [ 141.000213623046989, -6.313239097595215 ], [ 141.002410888671875, -4.987235069274846 ] ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/paraguay.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/paraguay.geojson new file mode 100644 index 000000000000..05b79bb85928 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/paraguay.geojson @@ -0,0 +1,24 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "PY-19", "NAME_1": "Boquerón" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -62.275599731999932, -22.513508401999985 ], [ -62.281387491999908, -22.512061463 ], [ -62.283816284999972, -22.504826761999936 ], [ -62.283609578999915, -22.493768005999925 ], [ -62.284539753999866, -22.488703714999943 ], [ -62.2872269289999, -22.483949482999961 ], [ -62.29451330599997, -22.479815368999937 ], [ -62.305727091999927, -22.476714781999902 ], [ -62.341356966999911, -22.472261048 ], [ -62.3487218839999, -22.471340433999927 ], [ -62.368255574999921, -22.464415791999954 ], [ -62.438070434999872, -22.419664000999902 ], [ -62.454968627999875, -22.403851013 ], [ -62.461944946999949, -22.388761493999894 ], [ -62.470574910999915, -22.381836852999911 ], [ -62.510727498999927, -22.370157978999941 ], [ -62.523388224999877, -22.364886982999906 ], [ -62.547624470999949, -22.335328063999967 ], [ -62.564677693999982, -22.321995543999947 ], [ -62.588293822999901, -22.316414488999939 ], [ -62.599610961999872, -22.315174254999903 ], [ -62.613150186999945, -22.31145355199989 ], [ -62.625294148999842, -22.305045674999946 ], [ -62.63268387899987, -22.295950622999968 ], [ -62.630823526999848, -22.28768239399993 ], [ -62.624208943999946, -22.278897398999945 ], [ -62.620281534999975, -22.268458760999906 ], [ -62.626431030999953, -22.255022887999957 ], [ -62.619609740999891, -22.255022887999957 ], [ -62.624829060999929, -22.247271422999944 ], [ -62.631805378999928, -22.240760192999886 ], [ -62.640383667999942, -22.236212666999862 ], [ -62.650357218999943, -22.234455667999967 ], [ -62.627516234999945, -22.184536233999907 ], [ -62.599404256999918, -22.089865010999887 ], [ -62.572842569999892, -22.000774840999966 ], [ -62.529227661999954, -21.865072529999907 ], [ -62.492795776999941, -21.751797789999927 ], [ -62.446183634999983, -21.60689707399986 ], [ -62.411973836999977, -21.500857034999939 ], [ -62.375490275999965, -21.384481709999932 ], [ -62.340401977999932, -21.272860615999903 ], [ -62.307897501999918, -21.169301045999958 ], [ -62.275703084999861, -21.06656829799995 ], [ -62.271879027999915, -21.000939229999915 ], [ -62.271885774109194, -21.00042365282934 ], [ -62.273791056999926, -20.854798277999905 ], [ -62.275031290999976, -20.758680115 ], [ -62.276168172999888, -20.670726826999982 ], [ -62.277305053999896, -20.579776305999886 ], [ -62.268830118999887, -20.553111266999935 ], [ -62.232398234999891, -20.501021422999983 ], [ -62.210573102366766, -20.471305463076646 ], [ -62.189661824999888, -20.442833760999875 ], [ -62.144961710999922, -20.382062275999957 ], [ -62.100209920999873, -20.321187438999928 ], [ -62.055509806999936, -20.26041595399991 ], [ -62.010809692999885, -20.199541116999882 ], [ -61.994169880999948, -20.175666604999975 ], [ -61.977581746999959, -20.151792093999902 ], [ -61.960941935999926, -20.128020934999938 ], [ -61.944250447999906, -20.104146422999946 ], [ -61.931383016999916, -20.078308206999935 ], [ -61.924739799402232, -20.065127638529702 ], [ -61.911486781789563, -20.076138604013352 ], [ -61.818701747787429, -20.131897474688685 ], [ -59.951037971125459, -20.651607353796351 ], [ -59.881765712917286, -20.679357599273771 ], [ -59.85546240916284, -20.698167820088827 ], [ -59.875848762010776, -20.776044202577907 ], [ -59.875667893958109, -20.780385024149552 ], [ -59.874350145243, -20.786379489421904 ], [ -59.870551926929863, -20.79227060280607 ], [ -59.849803839775404, -20.817850437048037 ], [ -59.837995774585295, -20.837797539424912 ], [ -59.832414719563644, -20.850975030173515 ], [ -59.826161871872898, -20.874436130023412 ], [ -59.825619268614332, -20.883737888093037 ], [ -59.826006843141272, -20.891954440545021 ], [ -59.829727546189304, -20.918309421142851 ], [ -59.829029914199168, -20.926474297650714 ], [ -59.826316900604468, -20.93391570374672 ], [ -59.805801358346002, -20.967970472859065 ], [ -59.752083705898315, -21.037888686213876 ], [ -59.746450974932543, -21.047190444283558 ], [ -59.736890835343786, -21.068687838472954 ], [ -59.695756395341391, -21.325364679136612 ], [ -59.69549801292294, -21.334873141881985 ], [ -59.696221483334796, -21.343451429539869 ], [ -59.697771776046636, -21.350272718910844 ], [ -59.699477098389366, -21.355440361883211 ], [ -59.701905891143952, -21.359729505712096 ], [ -59.705109829355138, -21.363140151296932 ], [ -59.710432501958394, -21.367377618282489 ], [ -59.811459926834175, -21.424583428882158 ], [ -59.826678635810367, -21.435848890813645 ], [ -59.841303067382626, -21.450731703005715 ], [ -59.847349208599098, -21.459671725869441 ], [ -59.851767543637209, -21.469645277507539 ], [ -59.941891241787346, -21.845332939763352 ], [ -59.955973070101095, -21.885123792628917 ], [ -59.95816931795963, -21.89809457780251 ], [ -59.95816931795963, -21.907706394234708 ], [ -59.941994594574851, -21.999742120302585 ], [ -59.940961065800536, -22.030231215098524 ], [ -59.938170538739371, -22.040463149155016 ], [ -59.929178839931524, -22.043822116997092 ], [ -59.836678025870185, -22.041548353873452 ], [ -59.781590948763267, -22.033538506996479 ], [ -59.420424364392886, -22.046509291270752 ], [ -59.391563075775309, -22.055139254872699 ], [ -59.342289597686772, -22.083044529081747 ], [ -59.307072110389583, -22.182056573252282 ], [ -59.304204068063257, -22.195647475150849 ], [ -59.307588874327053, -22.201435234848191 ], [ -59.322600877728291, -22.213785903296809 ], [ -59.384741787303653, -22.249390964221618 ], [ -59.408590460781113, -22.259932956640625 ], [ -59.413990647750211, -22.26039804463403 ], [ -59.420553554702792, -22.258537692660411 ], [ -59.428770108054039, -22.253990167312395 ], [ -59.436521571613241, -22.248719170653203 ], [ -59.445875007425627, -22.240347588570387 ], [ -59.45365231030587, -22.235128268754579 ], [ -59.464065110616332, -22.230219008200663 ], [ -59.477604335671572, -22.23326791768028 ], [ -59.491763679250369, -22.238073825446691 ], [ -59.59452226399128, -22.295641371252259 ], [ -59.607854784370772, -22.307526950808153 ], [ -59.616252203976046, -22.318534031220565 ], [ -59.621600715000966, -22.329696139465284 ], [ -59.623564418862827, -22.33538054817376 ], [ -59.625114711574668, -22.345664158174372 ], [ -59.624830491633872, -22.353157240214443 ], [ -59.622634242876018, -22.361115411147296 ], [ -59.609560105814239, -22.384938246203092 ], [ -59.608113165889904, -22.391294447580719 ], [ -59.609250046552404, -22.398890883307615 ], [ -59.61648474797272, -22.412016697212835 ], [ -59.627440152441068, -22.418217868959516 ], [ -59.642555507730492, -22.421266777539756 ], [ -59.700045539170276, -22.421473484014086 ], [ -59.716349452864961, -22.423902275869352 ], [ -59.731051397903684, -22.430930270815338 ], [ -59.737252569650366, -22.43925017695409 ], [ -59.739087084101641, -22.450567314829698 ], [ -59.732963425821424, -22.496921074647901 ], [ -59.732808397089855, -22.50110686568928 ], [ -59.7348237777951, -22.51635141398657 ], [ -59.740973272698341, -22.529012139898327 ], [ -59.934449835691339, -22.795765883188949 ], [ -59.943906623391968, -22.815454604046749 ], [ -59.947368944021548, -22.831681004274913 ], [ -59.947368944021548, -22.857312513561681 ], [ -59.949694383089309, -22.870541681153668 ], [ -59.959047818002375, -22.902219333455491 ], [ -59.960959845920172, -22.913639825017924 ], [ -59.9572133035511, -22.964127699034066 ], [ -59.959564581939901, -23.009809666183173 ], [ -59.952329881418905, -23.057248629820435 ], [ -59.954448614911655, -23.073836765254498 ], [ -59.95971961067147, -23.094403985255724 ], [ -59.987004767256224, -23.162616876267805 ], [ -59.986694708893708, -23.169128105477682 ], [ -59.984575975400958, -23.176156100423725 ], [ -59.976333583627991, -23.194087822994618 ], [ -59.973388027835199, -23.205198256194592 ], [ -59.976617805367425, -23.222199801879356 ], [ -59.987547369615413, -23.251293633594344 ], [ -60.032686734405274, -23.335836276722773 ], [ -60.045140753842702, -23.371699720965353 ], [ -60.054390835069, -23.410870457105887 ], [ -60.063615077873521, -23.499857272794884 ], [ -60.064157681132087, -23.500477389519915 ], [ -60.071960822433994, -23.505386650973151 ], [ -60.171541307385439, -23.554634290640024 ], [ -60.195209112810289, -23.563109225510345 ], [ -60.230168220387043, -23.569362074100468 ], [ -60.553998583068164, -23.586001885478652 ], [ -60.567615321589813, -23.588534031020743 ], [ -60.581206224387756, -23.593805026780558 ], [ -60.612470466438879, -23.609566339015316 ], [ -60.648153041729472, -23.623622328008025 ], [ -60.720086635789585, -23.634371026002043 ], [ -60.733806728897434, -23.638505141099358 ], [ -60.750498216219682, -23.646411635188826 ], [ -60.759412400661745, -23.654938246003269 ], [ -60.765070970049237, -23.66377491607949 ], [ -60.771969773785997, -23.69927662511617 ], [ -60.775819668043255, -23.710748792622667 ], [ -60.788919644426016, -23.731936130248243 ], [ -60.791891038640529, -23.738292331625814 ], [ -60.792666184996449, -23.745010268209342 ], [ -60.787782761964877, -23.873271172826378 ], [ -60.787776137999884, -23.873445156999935 ], [ -60.816851562999972, -23.874097187999965 ], [ -60.837625487999929, -23.871823424999945 ], [ -60.866357584999918, -23.855907083999924 ], [ -60.899947265999856, -23.830482279999927 ], [ -60.936663370999923, -23.813842467999905 ], [ -60.974826416999917, -23.82407440199998 ], [ -61.006349039999861, -23.805470885999924 ], [ -61.015805826999923, -23.796685892999932 ], [ -61.030223550999949, -23.774620055999947 ], [ -61.036243855999885, -23.768832295999871 ], [ -61.038052530999977, -23.755396422999922 ], [ -61.04998978699993, -23.734725850999908 ], [ -61.066216186999924, -23.715708922999937 ], [ -61.092519490999877, -23.701859638999878 ], [ -61.109650227999936, -23.675608011999941 ], [ -61.118848632999942, -23.666409606999935 ], [ -61.10975358099995, -23.649976500999884 ], [ -61.106239583999923, -23.627238871999907 ], [ -61.109856933999907, -23.606981709999985 ], [ -61.122233439999945, -23.598196715999904 ], [ -61.139493367999933, -23.592719013999925 ], [ -61.154453694999916, -23.580316670999949 ], [ -61.167812051999931, -23.566570738999914 ], [ -61.180240233999911, -23.557165628999954 ], [ -61.187733316999953, -23.556235453999903 ], [ -61.207680420999878, -23.557579040999968 ], [ -61.21439835599989, -23.557165628999954 ], [ -61.223570922999983, -23.55127451599995 ], [ -61.24292374699985, -23.533084411999923 ], [ -61.251941283999912, -23.529260354999877 ], [ -61.272611856999902, -23.52357594799993 ], [ -61.282947143999934, -23.509933369999928 ], [ -61.288967448999955, -23.494120380999931 ], [ -61.296951456999921, -23.481407979999886 ], [ -61.361779540999947, -23.454742940999935 ], [ -61.384853067999899, -23.453709411999952 ], [ -61.398676513999959, -23.450092061999968 ], [ -61.408727579999891, -23.443580830999906 ], [ -61.420509806999888, -23.433658955999903 ], [ -61.435702677999927, -23.423737080999913 ], [ -61.451929077999921, -23.417432555999895 ], [ -61.470300048999917, -23.414125264999896 ], [ -61.491849121999877, -23.413195088999942 ], [ -61.501073363999893, -23.407820739999892 ], [ -61.510375122999903, -23.384359638999911 ], [ -61.526343139999938, -23.374747823 ], [ -61.52546463999991, -23.364722594999961 ], [ -61.520787923999933, -23.353250426999949 ], [ -61.51605952999995, -23.344982197999911 ], [ -61.533965413999937, -23.344568785999897 ], [ -61.545773478999934, -23.342605082999867 ], [ -61.554635985999937, -23.33836761499991 ], [ -61.605149699999885, -23.289275003999961 ], [ -61.619619100999898, -23.282867125999928 ], [ -61.666851359999924, -23.282867125999928 ], [ -61.680313069999983, -23.279249775999943 ], [ -61.688762166999879, -23.274495543999947 ], [ -61.704420124999842, -23.258372497999886 ], [ -61.71852779199989, -23.249277444999905 ], [ -61.732997192999903, -23.243386331999901 ], [ -61.744262654999972, -23.234808043999877 ], [ -61.748810180999897, -23.217341410999921 ], [ -61.749481974999895, -23.198841246999905 ], [ -61.752272501999926, -23.187059020999897 ], [ -61.75847367399993, -23.177447204999893 ], [ -61.769274048999961, -23.165561624999953 ], [ -61.78002274699989, -23.156879984999904 ], [ -61.802657022999938, -23.144994404999878 ], [ -61.814284219999905, -23.135175882999903 ], [ -61.836970174999948, -23.104686787999924 ], [ -61.84498002199993, -23.097245381999898 ], [ -61.956446085999914, -23.034406839999917 ], [ -61.992051147999888, -22.998129984999963 ], [ -62.005900430999958, -22.978906351999939 ], [ -62.006055460999903, -22.974358824999911 ], [ -62.008949340999976, -22.969707945999943 ], [ -62.003781697999983, -22.946350198999895 ], [ -62.006055460999903, -22.93684173599992 ], [ -62.017165893999902, -22.921752217999909 ], [ -62.035821085999885, -22.884855244999898 ], [ -62.050445515999854, -22.864494730999951 ], [ -62.071632853999915, -22.843927510999961 ], [ -62.080831258999922, -22.832351988999918 ], [ -62.084603637999948, -22.820156350999909 ], [ -62.08935786999993, -22.819949645999955 ], [ -62.099228068999906, -22.81374847399988 ], [ -62.107858031999854, -22.80651377399991 ], [ -62.108788207999908, -22.80299977599995 ], [ -62.115867879999939, -22.799795836999877 ], [ -62.119743611999894, -22.792147724999907 ], [ -62.122534139999942, -22.783156026999862 ], [ -62.126151489999927, -22.775714619999931 ], [ -62.153488322999948, -22.747809345999954 ], [ -62.159741169999847, -22.737164000999954 ], [ -62.164081990999932, -22.725898538999985 ], [ -62.170799926999877, -22.717320250999961 ], [ -62.184184122999909, -22.713702900999891 ], [ -62.188266560999892, -22.70832855299993 ], [ -62.175915893999843, -22.684867451999949 ], [ -62.195036173999938, -22.67360198999998 ], [ -62.194622762999927, -22.660579528999861 ], [ -62.187646443999938, -22.638565368999963 ], [ -62.192969116999876, -22.628230081999959 ], [ -62.196586466999861, -22.626473083999983 ], [ -62.202529256999895, -22.627196552999891 ], [ -62.214931599999943, -22.624302672999903 ], [ -62.239736287999904, -22.613760680999931 ], [ -62.25281042499995, -22.603632100999974 ], [ -62.252965454999895, -22.59112640299989 ], [ -62.238857788999951, -22.573039651999878 ], [ -62.233225056999913, -22.556296487999916 ], [ -62.241183227999983, -22.538416442999861 ], [ -62.263352416999908, -22.51443857799994 ], [ -62.268830118999887, -22.512991638999949 ], [ -62.275599731999932, -22.513508401999985 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-15", "NAME_1": "Presidente Hayes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -60.689675862999934, -23.89363087999989 ], [ -60.699416870999869, -23.891253763999927 ], [ -60.719854898999927, -23.875027363999919 ], [ -60.729285848999979, -23.872133483999932 ], [ -60.787776137999884, -23.873445156999935 ], [ -60.787782761964877, -23.873271172826378 ], [ -60.792666184996449, -23.745010268209342 ], [ -60.791891038640529, -23.738292331625814 ], [ -60.788919644426016, -23.731936130248243 ], [ -60.775819668043255, -23.710748792622667 ], [ -60.771969773785997, -23.69927662511617 ], [ -60.765070970049237, -23.66377491607949 ], [ -60.759412400661745, -23.654938246003269 ], [ -60.750498216219682, -23.646411635188826 ], [ -60.733806728897434, -23.638505141099358 ], [ -60.720086635789585, -23.634371026002043 ], [ -60.648153041729472, -23.623622328008025 ], [ -60.612470466438879, -23.609566339015316 ], [ -60.581206224387756, -23.593805026780558 ], [ -60.567615321589813, -23.588534031020743 ], [ -60.553998583068164, -23.586001885478652 ], [ -60.230168220387043, -23.569362074100468 ], [ -60.195209112810289, -23.563109225510345 ], [ -60.171541307385439, -23.554634290640024 ], [ -60.071960822433994, -23.505386650973151 ], [ -60.064157681132087, -23.500477389519915 ], [ -60.063615077873521, -23.499857272794884 ], [ -60.054390835069, -23.410870457105887 ], [ -60.045140753842702, -23.371699720965353 ], [ -60.032686734405274, -23.335836276722773 ], [ -59.987547369615413, -23.251293633594344 ], [ -59.976617805367425, -23.222199801879356 ], [ -59.973388027835199, -23.205198256194592 ], [ -59.976333583627991, -23.194087822994618 ], [ -59.984575975400958, -23.176156100423725 ], [ -59.986694708893708, -23.169128105477682 ], [ -59.987004767256224, -23.162616876267805 ], [ -59.95971961067147, -23.094403985255724 ], [ -59.954448614911655, -23.073836765254498 ], [ -59.952329881418905, -23.057248629820435 ], [ -59.959564581939901, -23.009809666183173 ], [ -59.9572133035511, -22.964127699034066 ], [ -59.960959845920172, -22.913639825017924 ], [ -59.959047818002375, -22.902219333455491 ], [ -59.949694383089309, -22.870541681153668 ], [ -59.947368944021548, -22.857312513561681 ], [ -59.947368944021548, -22.831681004274913 ], [ -59.943906623391968, -22.815454604046749 ], [ -59.934449835691339, -22.795765883188949 ], [ -59.740973272698341, -22.529012139898327 ], [ -59.7348237777951, -22.51635141398657 ], [ -59.732808397089855, -22.50110686568928 ], [ -59.732963425821424, -22.496921074647901 ], [ -59.739087084101641, -22.450567314829698 ], [ -59.737252569650366, -22.43925017695409 ], [ -59.731051397903684, -22.430930270815338 ], [ -59.716349452864961, -22.423902275869352 ], [ -59.700045539170276, -22.421473484014086 ], [ -59.642555507730492, -22.421266777539756 ], [ -59.627440152441068, -22.418217868959516 ], [ -59.61648474797272, -22.412016697212835 ], [ -59.609250046552404, -22.398890883307615 ], [ -59.608113165889904, -22.391294447580719 ], [ -59.609560105814239, -22.384938246203092 ], [ -59.622634242876018, -22.361115411147296 ], [ -59.624830491633872, -22.353157240214443 ], [ -59.625114711574668, -22.345664158174372 ], [ -59.623564418862827, -22.33538054817376 ], [ -59.621600715000966, -22.329696139465284 ], [ -59.616252203976046, -22.318534031220565 ], [ -59.607854784370772, -22.307526950808153 ], [ -59.59452226399128, -22.295641371252259 ], [ -59.491763679250369, -22.238073825446691 ], [ -59.477604335671572, -22.23326791768028 ], [ -59.464065110616332, -22.230219008200663 ], [ -59.45365231030587, -22.235128268754579 ], [ -59.445875007425627, -22.240347588570387 ], [ -59.436521571613241, -22.248719170653203 ], [ -59.428770108054039, -22.253990167312395 ], [ -59.420553554702792, -22.258537692660411 ], [ -59.413990647750211, -22.26039804463403 ], [ -59.408590460781113, -22.259932956640625 ], [ -59.384741787303653, -22.249390964221618 ], [ -59.322600877728291, -22.213785903296809 ], [ -59.307588874327053, -22.201435234848191 ], [ -59.304204068063257, -22.195647475150849 ], [ -59.307072110389583, -22.182056573252282 ], [ -59.342289597686772, -22.083044529081747 ], [ -59.230151739611074, -22.14092213324983 ], [ -59.192402105872475, -22.155288180605055 ], [ -59.168811814813409, -22.161024265257652 ], [ -59.15261125300691, -22.162212822763536 ], [ -58.998434618262991, -22.156838474216215 ], [ -58.785062628837238, -22.17352996153852 ], [ -58.732972785265815, -22.168103936147759 ], [ -58.263234016236879, -22.198024591062051 ], [ -58.237654181994913, -22.204639173958697 ], [ -58.223494839315379, -22.214509372809289 ], [ -58.216363490682568, -22.262103366976817 ], [ -58.20830196786153, -22.272231948245803 ], [ -58.194090949237932, -22.280913587791872 ], [ -57.848969896143785, -22.423023776725927 ], [ -57.843414680443118, -22.446019788582362 ], [ -57.830573085579431, -22.559191175432431 ], [ -57.816103685436701, -22.589990329490092 ], [ -57.79065304240396, -22.617378838862351 ], [ -57.779671800413269, -22.634018650240534 ], [ -57.775150112587596, -22.655464368485809 ], [ -57.78471025307573, -22.665282892291657 ], [ -57.806905280154524, -22.665747978486422 ], [ -57.850235968914831, -22.658926690014709 ], [ -57.895814582377056, -22.664869480242317 ], [ -57.92922339544333, -22.686470229017857 ], [ -57.940204637434078, -22.716339207088765 ], [ -57.918526374292753, -22.747035006560282 ], [ -57.908862881017114, -22.751220797601718 ], [ -57.885970221948185, -22.756956882254315 ], [ -57.877546963021928, -22.761917819651671 ], [ -57.872043423265382, -22.771788017602944 ], [ -57.867030809024584, -22.795300795195544 ], [ -57.860803798856239, -22.806307874708637 ], [ -57.851760423204951, -22.810441989806009 ], [ -57.828867764136021, -22.809253432300068 ], [ -57.819514330122217, -22.813129164079669 ], [ -57.811943731917665, -22.821294040587532 ], [ -57.808920660859826, -22.826410006716458 ], [ -57.802435269172349, -22.843876642193266 ], [ -57.792358363847427, -22.856847425568219 ], [ -57.788379279280321, -22.866045830850396 ], [ -57.789412808054635, -22.877983087249675 ], [ -57.798068610078303, -22.887956637988452 ], [ -57.81127193924857, -22.896948336796299 ], [ -57.821038784412337, -22.905940036503466 ], [ -57.819514330122217, -22.915861912197499 ], [ -57.786002163369119, -22.944749036538781 ], [ -57.772928026307341, -22.960717055247926 ], [ -57.767682868069926, -22.981646009555675 ], [ -57.789412808054635, -23.021385185577856 ], [ -57.774374966231676, -23.034821058744853 ], [ -57.729881558387206, -23.054819837965169 ], [ -57.720528124373459, -23.066395359158491 ], [ -57.714068570208326, -23.085153904029426 ], [ -57.698178066764342, -23.090683282207692 ], [ -57.658464728264562, -23.090889987782703 ], [ -57.639861213024574, -23.098796481872171 ], [ -57.632058071722611, -23.111147148522093 ], [ -57.630636970219996, -23.127993665475287 ], [ -57.631127895735801, -23.148922620682413 ], [ -57.624616664727284, -23.165304049642202 ], [ -57.608596970973451, -23.179980157158525 ], [ -57.58849483896563, -23.192072442289373 ], [ -57.550926073279641, -23.208815605555742 ], [ -57.544363166327059, -23.213156427127387 ], [ -57.535552333773182, -23.220649509167515 ], [ -57.511161057936476, -23.250208428875908 ], [ -57.500567389573348, -23.257856540546925 ], [ -57.484030930982669, -23.273049412000773 ], [ -57.480310227934638, -23.278992200429684 ], [ -57.480181036725469, -23.30054127416048 ], [ -57.482093064643209, -23.306380710701262 ], [ -57.48713151730567, -23.316819349433445 ], [ -57.495528936910887, -23.330255221701123 ], [ -57.501445888716773, -23.336714775866199 ], [ -57.503667974997029, -23.343536065237231 ], [ -57.500799932670759, -23.35779876070427 ], [ -57.494779628976687, -23.367720635498927 ], [ -57.477183804089293, -23.382706800478445 ], [ -57.470388353139981, -23.393868909622483 ], [ -57.456719936875572, -23.403894138103965 ], [ -57.453619350552572, -23.409320163494726 ], [ -57.452740851409146, -23.417330011271019 ], [ -57.446177945355885, -23.447198988442551 ], [ -57.442457241408533, -23.45743092159978 ], [ -57.442173020568418, -23.46471729896416 ], [ -57.446177945355885, -23.474484145027247 ], [ -57.448245002005251, -23.485956312533801 ], [ -57.457029995238088, -23.504663180561352 ], [ -57.459820523198573, -23.515463556298073 ], [ -57.459639655145963, -23.527710870160547 ], [ -57.454859584901897, -23.548898206886747 ], [ -57.453619350552572, -23.559853610455775 ], [ -57.450415412341385, -23.573806247560299 ], [ -57.425688238821181, -23.617886244254748 ], [ -57.397989671086464, -23.645636488832906 ], [ -57.325875209873004, -23.682791842469555 ], [ -57.295334439133057, -23.707234796049022 ], [ -57.280348273254219, -23.723409518534481 ], [ -57.275826586327867, -23.731522719098223 ], [ -57.275490688644368, -23.742013034673789 ], [ -57.281175095554204, -23.751314792743472 ], [ -57.299003465337648, -23.757670994121099 ], [ -57.302801682751465, -23.765267428948675 ], [ -57.299416877386989, -23.774982599067698 ], [ -57.291923794447541, -23.782062269957805 ], [ -57.284430710608774, -23.787695000923577 ], [ -57.281071742766699, -23.793224379101844 ], [ -57.281588507603544, -23.800975843560309 ], [ -57.288513149762025, -23.830741468843712 ], [ -57.291303676823247, -23.861850681263945 ], [ -57.295334439133057, -23.871720880114538 ], [ -57.318149583836203, -23.885931898738136 ], [ -57.322051154037524, -23.889084161005201 ], [ -57.3254101218796, -23.894096775245998 ], [ -57.332903204819047, -23.901538180442685 ], [ -57.340396287758438, -23.911305026505772 ], [ -57.34375525560057, -23.923242282905051 ], [ -57.338561774206482, -23.930476982526727 ], [ -57.326443650653971, -23.932233981712898 ], [ -57.312749395967842, -23.932182305768777 ], [ -57.302801682751465, -23.933784274424738 ], [ -57.284482388351535, -23.954041436063449 ], [ -57.279883185260758, -23.978794448005374 ], [ -57.278048671708802, -24.00509775175982 ], [ -57.268049281649041, -24.030005791534052 ], [ -57.248360561690561, -24.023649591055801 ], [ -57.231772427155761, -24.033364760275447 ], [ -57.22389177058875, -24.050728041166167 ], [ -57.230480515963052, -24.06695444049501 ], [ -57.236733363653798, -24.075842786515409 ], [ -57.237870246114937, -24.086178074258726 ], [ -57.233581102286053, -24.094704685073168 ], [ -57.223659226592019, -24.098270358490254 ], [ -57.187924973558665, -24.096203301840887 ], [ -57.178649054810023, -24.098270358490254 ], [ -57.163016933784434, -24.117442314511209 ], [ -57.172189500644947, -24.137079359424888 ], [ -57.189681972744836, -24.156768080282689 ], [ -57.197821010830978, -24.173562921291762 ], [ -57.215907762133497, -24.192631523625892 ], [ -57.219731817969034, -24.197902520285083 ], [ -57.220713669899965, -24.202036634483079 ], [ -57.221101244426904, -24.207979424710686 ], [ -57.219809333234139, -24.22079518025339 ], [ -57.216863775642707, -24.229321791067832 ], [ -57.212548794291422, -24.236711521219718 ], [ -57.193402675792868, -24.255935154084113 ], [ -57.185599535390224, -24.26642546965968 ], [ -57.174850837396207, -24.285028984899725 ], [ -57.170949266295622, -24.297999770073318 ], [ -57.165239020064689, -24.359908135651949 ], [ -57.157410041240382, -24.389518731304406 ], [ -57.1466096673023, -24.460677179008599 ], [ -57.141958788267459, -24.474939873576318 ], [ -57.130538295805707, -24.500106295768944 ], [ -57.132191942204372, -24.509873141832031 ], [ -57.141183641012219, -24.541912530239074 ], [ -57.14565365289377, -24.58289194061058 ], [ -57.144904344060251, -24.602994072618344 ], [ -57.141080288224714, -24.616326592997893 ], [ -57.133974778912886, -24.628832289278705 ], [ -57.126610887182665, -24.641441339246398 ], [ -57.113175014914987, -24.64898609812991 ], [ -57.097517056367053, -24.66154347125422 ], [ -57.090669928574357, -24.677459812220548 ], [ -57.112141486140672, -24.717509046605244 ], [ -57.116663173966288, -24.736422621107067 ], [ -57.12232174335378, -24.752028903710936 ], [ -57.137695481960918, -24.762415866499055 ], [ -57.149374355941745, -24.763035984123348 ], [ -57.158081834808797, -24.759625338538569 ], [ -57.16681515209757, -24.757661634676708 ], [ -57.178649054810023, -24.762415866499055 ], [ -57.181904669864593, -24.769495538288481 ], [ -57.197149217262563, -24.826753024832215 ], [ -57.248670620053076, -24.891451917472011 ], [ -57.248438076056345, -24.897239678967992 ], [ -57.240092333294513, -24.906438084250169 ], [ -57.231178147953131, -24.907368258438396 ], [ -57.222522345929519, -24.901942233946954 ], [ -57.216011114921002, -24.901373793166044 ], [ -57.213427294334167, -24.916980075769857 ], [ -57.215623542192702, -24.928193861757336 ], [ -57.218956671613114, -24.937392267039513 ], [ -57.218698290093982, -24.946590670523051 ], [ -57.210016648749331, -24.957959487040682 ], [ -57.198492805298713, -24.969741712909752 ], [ -57.194797939773082, -24.978113294992568 ], [ -57.199526333173708, -24.984211113951744 ], [ -57.213427294334167, -24.988965345774091 ], [ -57.234666307004431, -24.986433201131319 ], [ -57.261873949223343, -24.980025322910308 ], [ -57.285386725017361, -24.982454115664893 ], [ -57.295334439133057, -25.006018569201615 ], [ -57.34375525560057, -25.064671318826299 ], [ -57.354116379966968, -25.07200937303412 ], [ -57.366131150732031, -25.078520603143318 ], [ -57.377965054343804, -25.083326510909728 ], [ -57.387835252295076, -25.085186862883404 ], [ -57.396206835277212, -25.089424329868905 ], [ -57.414862027360641, -25.10823455158328 ], [ -57.422277595034984, -25.112472018568781 ], [ -57.454988776111122, -25.112472018568781 ], [ -57.483720872620154, -25.112472018568781 ], [ -57.511781174661451, -25.106994317233955 ], [ -57.52377010790417, -25.109164726670826 ], [ -57.52873104530147, -25.122703952625329 ], [ -57.532270881196212, -25.148077081292286 ], [ -57.541520962422453, -25.175620618496737 ], [ -57.554595100383551, -25.201613864788044 ], [ -57.569684618150575, -25.222336113520839 ], [ -57.583456387202489, -25.234428398651687 ], [ -57.595884569117572, -25.240216160147668 ], [ -57.624306607264089, -25.248432712599595 ], [ -57.639163581034438, -25.256184177058117 ], [ -57.65053239575343, -25.265485935127799 ], [ -57.671975553999886, -25.289830980999923 ], [ -57.702338826999949, -25.270911152999901 ], [ -57.721769164999927, -25.246106465999958 ], [ -57.754066934999912, -25.18089080799993 ], [ -57.76600419199994, -25.167868346999896 ], [ -57.797320109999959, -25.153915709999907 ], [ -57.812409627999955, -25.143683776999922 ], [ -57.85648962399992, -25.096761575999977 ], [ -57.870700643999982, -25.085289407999952 ], [ -57.890492715999869, -25.078674824999965 ], [ -57.9697643639999, -25.078468119999911 ], [ -57.983768676999915, -25.074230651999954 ], [ -57.989866495999962, -25.064102070999908 ], [ -57.993638875999892, -25.052733255999911 ], [ -58.000460164999936, -25.044361673999944 ], [ -58.009813598999898, -25.042501322999939 ], [ -58.032137816999949, -25.045085143999941 ], [ -58.042059692999942, -25.044361673999944 ], [ -58.111512817999909, -25.012322285999929 ], [ -58.124018514999932, -25.012942402999911 ], [ -58.133888712999891, -24.997852884999901 ], [ -58.224064087999892, -24.941215514999911 ], [ -58.242512572999914, -24.94173227899995 ], [ -58.259152384999936, -24.952997741999923 ], [ -58.287264363999981, -24.979766133999888 ], [ -58.299304972999948, -24.987724303999954 ], [ -58.311965698999899, -24.993615416999944 ], [ -58.32328283699988, -24.995269064 ], [ -58.335995238999914, -24.991858418999882 ], [ -58.34131791199988, -24.986174010999932 ], [ -58.34436682099988, -24.978319193999894 ], [ -58.350567992999885, -24.968604023999958 ], [ -58.414801798999918, -24.903078307999948 ], [ -58.438521280999879, -24.872795918999927 ], [ -58.450768595999904, -24.861737161999926 ], [ -58.473402872999941, -24.851298522999883 ], [ -58.694216267999934, -24.812024434999913 ], [ -58.699383911999945, -24.807270202999916 ], [ -58.701916055999845, -24.79931203199996 ], [ -58.708117227999935, -24.795074564999908 ], [ -58.715972045999962, -24.791870625999934 ], [ -58.723258423999937, -24.786702982999927 ], [ -58.737469441999906, -24.782775572999967 ], [ -58.788474080999947, -24.781638691999959 ], [ -58.809196329999878, -24.776781106999934 ], [ -59.000915893999974, -24.644179381999905 ], [ -59.032696899999905, -24.637048034999879 ], [ -59.042412068999852, -24.630536803999902 ], [ -59.062462524999916, -24.612346699999961 ], [ -59.072177693999947, -24.606765644999939 ], [ -59.078327189999925, -24.605628762999928 ], [ -59.097189087999936, -24.605422057999888 ], [ -59.116981160999927, -24.598807474999973 ], [ -59.154394897999879, -24.57627654999996 ], [ -59.177907674999886, -24.568731790999905 ], [ -59.20648474199993, -24.550231628999981 ], [ -59.248084269999936, -24.537209167999947 ], [ -59.257644408999937, -24.530181172999932 ], [ -59.263122111999934, -24.523463235999913 ], [ -59.270460164999918, -24.518192239999877 ], [ -59.28560135999993, -24.516125182999915 ], [ -59.295058145999889, -24.512921244999944 ], [ -59.308080606999937, -24.498761901999984 ], [ -59.34097265699998, -24.487599792999958 ], [ -59.357405761999928, -24.468996276999917 ], [ -59.377766276999864, -24.43354624399997 ], [ -59.387093871999895, -24.423831074999939 ], [ -59.426032064999902, -24.392515156999934 ], [ -59.450268310999974, -24.382386575999888 ], [ -59.453808146999933, -24.374531758999936 ], [ -59.45628861499992, -24.365436705999883 ], [ -59.45972509799995, -24.358512064999985 ], [ -59.465900431999927, -24.353551126999946 ], [ -59.487656208999937, -24.344766132999951 ], [ -59.51041967799992, -24.33267384799997 ], [ -59.521142537999935, -24.325025736999891 ], [ -59.532020426999878, -24.314070332999918 ], [ -59.539978597999948, -24.308799335999893 ], [ -59.558427082999856, -24.305388691999951 ], [ -59.575402791999863, -24.295880228999877 ], [ -59.600517537999906, -24.292882994999957 ], [ -59.610516927999925, -24.289575703999958 ], [ -59.617725789999952, -24.283477884999911 ], [ -59.635321614999953, -24.261463724999928 ], [ -59.673639688999856, -24.225393574999927 ], [ -60.033669392999883, -24.007008971999895 ], [ -60.0517303069999, -24.002874857999956 ], [ -60.072375040999901, -24.004838561999904 ], [ -60.119297241999845, -24.020238138999972 ], [ -60.143249267999863, -24.025199075999922 ], [ -60.218128418999896, -24.027369486999916 ], [ -60.296418212999868, -24.016414082999944 ], [ -60.328018350999855, -24.017964375999952 ], [ -60.337371785999892, -24.016414082999944 ], [ -60.348042968999891, -24.010833027999922 ], [ -60.367576659999912, -23.994709980999943 ], [ -60.378351196999944, -23.988508809999956 ], [ -60.387420410999908, -23.987165221999902 ], [ -60.423051310999881, -23.988508809999956 ], [ -60.484882161999877, -23.977346699999927 ], [ -60.517722533999915, -23.955745951999958 ], [ -60.535964314999944, -23.947581074999931 ], [ -60.571750243999901, -23.946030781999923 ], [ -60.577538004999951, -23.944170430999918 ], [ -60.593583536999915, -23.912234394999928 ], [ -60.594617065999898, -23.906549987999895 ], [ -60.603841308999904, -23.904689635999972 ], [ -60.621152913999907, -23.895801289999966 ], [ -60.632159993999892, -23.89228729299991 ], [ -60.643709676999947, -23.891357116999956 ], [ -60.689675862999934, -23.89363087999989 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-11", "NAME_1": "Central" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -57.638776814999886, -25.615799661999901 ], [ -57.623067179999907, -25.61538625099989 ], [ -57.616297566999975, -25.609185078999914 ], [ -57.611646687999894, -25.585930683999976 ], [ -57.600691283999936, -25.578799336999865 ], [ -57.587152058999948, -25.575698750999905 ], [ -57.575318156999941, -25.56443328899995 ], [ -57.570047159999916, -25.54665659599992 ], [ -57.556921345999939, -25.459840189999923 ], [ -57.558109904999952, -25.443510436999901 ], [ -57.565292927999906, -25.430384622999924 ], [ -57.57872879999988, -25.416742044999921 ], [ -57.597541973109344, -25.403364485000488 ], [ -57.574018824309292, -25.383359189874739 ], [ -57.549115211897515, -25.358455577462905 ], [ -57.53915376693277, -25.318609797604097 ], [ -57.544134489415171, -25.281254378986375 ], [ -57.559076656862203, -25.256350766574599 ], [ -57.583456387202489, -25.234428398651687 ], [ -57.569684618150575, -25.222336113520839 ], [ -57.554595100383551, -25.201613864788044 ], [ -57.541520962422453, -25.175620618496737 ], [ -57.532270881196212, -25.148077081292286 ], [ -57.52873104530147, -25.122703952625329 ], [ -57.52377010790417, -25.109164726670826 ], [ -57.511781174661451, -25.106994317233955 ], [ -57.483720872620154, -25.112472018568781 ], [ -57.454988776111122, -25.112472018568781 ], [ -57.432251145773762, -25.143064467051488 ], [ -57.429021369140855, -25.145906670956094 ], [ -57.388791265804286, -25.169367770805991 ], [ -57.379153611849688, -25.178101088094763 ], [ -57.348509488322236, -25.225850111893124 ], [ -57.318227098201987, -25.255925794639722 ], [ -57.305669725077735, -25.273237399586321 ], [ -57.300243699686973, -25.286053155129025 ], [ -57.297479011047528, -25.301039321007863 ], [ -57.291303676823247, -25.320262952972882 ], [ -57.256628790985928, -25.377830498778508 ], [ -57.246629400926111, -25.39018116542843 ], [ -57.240144009238634, -25.394832044463271 ], [ -57.233090175870927, -25.397364190005362 ], [ -57.226217210555831, -25.397312514061298 ], [ -57.220093553174934, -25.395813897293522 ], [ -57.216295335761117, -25.393333428594872 ], [ -57.209344855180916, -25.387442315210706 ], [ -57.204099696943445, -25.384186700156079 ], [ -57.199681362804654, -25.383049818594259 ], [ -57.193402675792868, -25.38366993621861 ], [ -57.182111376338923, -25.395038750937601 ], [ -57.161750861013445, -25.425321140158474 ], [ -57.202626918597389, -25.448368828858349 ], [ -57.231643235946592, -25.47208831112664 ], [ -57.238335334108399, -25.479684746853593 ], [ -57.32256791887437, -25.602622978867373 ], [ -57.355072394375497, -25.636884453554671 ], [ -57.390703293722027, -25.66830372523674 ], [ -57.402640550121305, -25.683496595791269 ], [ -57.413518439324491, -25.703598727799033 ], [ -57.425998298082959, -25.738118584904782 ], [ -57.429796516396095, -25.767625827769734 ], [ -57.42832373715072, -25.789950046057754 ], [ -57.40504350355485, -25.858421318588967 ], [ -57.40310563811471, -25.876094658741522 ], [ -57.407007209215351, -25.897798761203887 ], [ -57.433775600963202, -25.943997490491768 ], [ -57.456694099353172, -25.970610853508106 ], [ -57.503590460631244, -26.011073499942086 ], [ -57.516716275435783, -25.982754814583018 ], [ -57.541960211994194, -25.952885838310806 ], [ -57.547515427694805, -25.943067314504958 ], [ -57.550486822808637, -25.934437350903011 ], [ -57.552037116419797, -25.923895358484003 ], [ -57.555344408317808, -25.917694186737322 ], [ -57.559607712825652, -25.913094984545921 ], [ -57.579942389729467, -25.905085137668948 ], [ -57.590458543726811, -25.899762465065692 ], [ -57.616865200268762, -25.879350273796092 ], [ -57.640222948230473, -25.865759372796845 ], [ -57.662237108156035, -25.848241062275179 ], [ -57.675724657267097, -25.835115247470696 ], [ -57.68926388232228, -25.818733818510907 ], [ -57.697196213934092, -25.81263599955173 ], [ -57.703836636151834, -25.80974211970306 ], [ -57.71008948384258, -25.809845472490565 ], [ -57.731225144624716, -25.814237970006332 ], [ -57.737426317270717, -25.814806409887922 ], [ -57.74424760574243, -25.81377288201287 ], [ -57.764246384962689, -25.807106622272784 ], [ -57.769362351990935, -25.806589857435995 ], [ -57.774064906969897, -25.807416680635299 ], [ -57.778121506802108, -25.8105172669583 ], [ -57.780524461134974, -25.814961439518811 ], [ -57.781299608390214, -25.823177991970738 ], [ -57.780111049984953, -25.840024508923932 ], [ -57.780421109246788, -25.847000827925854 ], [ -57.781583828331009, -25.851238294911411 ], [ -57.787139044930996, -25.85444223402186 ], [ -57.792255011959242, -25.856147555465327 ], [ -57.816336229433432, -25.85134164769886 ], [ -57.819661966426622, -25.849779220434698 ], [ -57.812823039999955, -25.845243021999948 ], [ -57.801867634999979, -25.831393737999889 ], [ -57.817060506999923, -25.797493997999965 ], [ -57.820626179999891, -25.778270364999941 ], [ -57.805588338999911, -25.769898782999874 ], [ -57.787243204999925, -25.764111022999899 ], [ -57.767916219999876, -25.75067514999995 ], [ -57.751069702999899, -25.734862161999956 ], [ -57.740372680999883, -25.722149759999908 ], [ -57.751121378999898, -25.719565937999903 ], [ -57.760578165999874, -25.715638528999932 ], [ -57.768484659999928, -25.709954121999985 ], [ -57.774582478999974, -25.701685891999944 ], [ -57.753705199999899, -25.672747089999888 ], [ -57.74125118099991, -25.66189503899993 ], [ -57.719908812999932, -25.653833516999939 ], [ -57.70869502799988, -25.652903340999984 ], [ -57.698204711999921, -25.653626810999882 ], [ -57.688334513999848, -25.652696634999927 ], [ -57.678981079999915, -25.647012226999976 ], [ -57.675260375999898, -25.639260762999882 ], [ -57.670041056999963, -25.616936543999913 ], [ -57.668077351999926, -25.612285664999945 ], [ -57.638776814999886, -25.615799661999901 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-ASU", "NAME_1": "Asunción" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -57.597541973109344, -25.403364485000488 ], [ -57.640792195999921, -25.372610371999926 ], [ -57.641205607999922, -25.360518086999946 ], [ -57.671487996999957, -25.290134785999925 ], [ -57.671975553999886, -25.289830980999923 ], [ -57.65053239575343, -25.265485935127799 ], [ -57.639163581034438, -25.256184177058117 ], [ -57.624306607264089, -25.248432712599595 ], [ -57.595884569117572, -25.240216160147668 ], [ -57.583456387202489, -25.234428398651687 ], [ -57.559076656862203, -25.256350766574599 ], [ -57.544134489415171, -25.281254378986375 ], [ -57.53915376693277, -25.318609797604097 ], [ -57.549115211897515, -25.358455577462905 ], [ -57.574018824309292, -25.383359189874739 ], [ -57.597541973109344, -25.403364485000488 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-10", "NAME_1": "Alto Paraná" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -54.60020261299988, -25.574944883999891 ], [ -54.602217976999924, -25.592441914999952 ], [ -54.58624995999989, -25.624688008999925 ], [ -54.583356078999913, -25.6448418169999 ], [ -54.598497273999925, -25.653833516999939 ], [ -54.633714762999972, -25.652076516999955 ], [ -54.642887329999979, -25.661584980999947 ], [ -54.643145710999931, -25.687939961999902 ], [ -54.624929768999891, -25.740236510999921 ], [ -54.622061726999931, -25.759976908999889 ], [ -54.617152465999879, -25.773516133999948 ], [ -54.594518188999928, -25.798734232999905 ], [ -54.587903604999923, -25.810826517999899 ], [ -54.589557250999889, -25.832944029999908 ], [ -54.599220743999922, -25.850720722999938 ], [ -54.610072794999951, -25.866533711999935 ], [ -54.615240437999972, -25.882863464999957 ], [ -54.607333943999919, -25.927925312999918 ], [ -54.60640376799995, -25.946632181999902 ], [ -54.615240437999972, -25.961721699999899 ], [ -54.623689533999965, -25.964305520999901 ], [ -54.647951619999873, -25.96564910899987 ], [ -54.656194010999883, -25.969163105999911 ], [ -54.662265990999941, -25.97991180399994 ], [ -54.66159419799996, -25.989937031999958 ], [ -54.658261067999945, -26.000375670999901 ], [ -54.653325968999923, -26.030761412999951 ], [ -54.642525594999967, -26.06280080199987 ], [ -54.643145710999931, -26.085228373999954 ], [ -54.66381628399995, -26.149203796999927 ], [ -54.65994055199991, -26.164396666999963 ], [ -54.641853800999911, -26.184033710999898 ], [ -54.638288126999925, -26.196952819999908 ], [ -54.644696004999872, -26.208218281999876 ], [ -54.656194010999883, -26.22299774199989 ], [ -54.664333048999907, -26.236226908999882 ], [ -54.664973817999908, -26.238863213999963 ], [ -54.665598314110923, -26.238863213566447 ], [ -54.667432826763559, -26.238863213566447 ], [ -54.724457770209938, -26.23467742252501 ], [ -54.735542364988135, -26.232300306613865 ], [ -54.741562668682207, -26.226099134867184 ], [ -54.743500535920987, -26.219639580702108 ], [ -54.743707240596677, -26.2132833802238 ], [ -54.742518683090736, -26.206307061221878 ], [ -54.742518683090736, -26.201346123824578 ], [ -54.743552211865051, -26.197160332783142 ], [ -54.745981003720317, -26.194111423303525 ], [ -54.749908413242679, -26.19059742583056 ], [ -54.755024380270925, -26.187341810775933 ], [ -54.77419633629188, -26.178453463856272 ], [ -54.788820766964818, -26.173492526458915 ], [ -54.807811855832483, -26.170081881773399 ], [ -54.823340624070511, -26.170288588247729 ], [ -54.831298794104043, -26.1724589976846 ], [ -54.839773728974421, -26.176593112781916 ], [ -54.853209601242099, -26.187031751514098 ], [ -54.859023200260481, -26.190442397098934 ], [ -54.864604255282131, -26.192509453748301 ], [ -54.872174851688044, -26.192716160222631 ], [ -54.879900478624165, -26.190442397098934 ], [ -54.889202236693848, -26.183621107727959 ], [ -54.89157935170573, -26.178453463856272 ], [ -54.890959234980699, -26.171632174485239 ], [ -54.886695929573477, -26.157317803973456 ], [ -54.886075811949183, -26.152150160101826 ], [ -54.886747606416918, -26.147550957910369 ], [ -54.888478766282049, -26.144760430849203 ], [ -54.891605191026713, -26.143468519656437 ], [ -54.896075202008944, -26.143313490924868 ], [ -54.902353889020731, -26.145690605936693 ], [ -54.907056443999693, -26.14894622189064 ], [ -54.912689174965465, -26.154992364006375 ], [ -54.919975552329845, -26.164655857282014 ], [ -54.935090907619269, -26.189512221112125 ], [ -54.939250861138305, -26.194266452934471 ], [ -54.946123827352721, -26.200260919106142 ], [ -54.952945115824434, -26.204136650885744 ], [ -54.959042934783611, -26.206513766796888 ], [ -54.972582159838794, -26.209407646645559 ], [ -55.005655077020208, -26.212198174606101 ], [ -55.012217983972789, -26.218554375983672 ], [ -55.016145391696455, -26.223205255018513 ], [ -55.01911678681023, -26.23028492590862 ], [ -55.020951301261562, -26.232610365875701 ], [ -55.023431769060892, -26.234522393793441 ], [ -55.027255824896372, -26.236951185648707 ], [ -55.03343115912071, -26.236331068923676 ], [ -55.041363490732522, -26.232920424238216 ], [ -55.056763067761381, -26.222378431819152 ], [ -55.067253384236267, -26.216849053640942 ], [ -55.09949947821832, -26.209407646645559 ], [ -55.124795090720852, -26.199640801481792 ], [ -55.134639452049043, -26.197160332783142 ], [ -55.142752651713522, -26.195765068802871 ], [ -55.162544725358771, -26.194834893715381 ], [ -55.23675208164326, -26.198245537501577 ], [ -55.257500168797719, -26.180313815829948 ], [ -55.291451585122559, -26.083317153264034 ], [ -55.23920671192019, -26.05546355589837 ], [ -55.230938482624879, -26.048228854478054 ], [ -55.226390957276863, -26.038875420464308 ], [ -55.226675178116977, -26.030503839280755 ], [ -55.232979701751844, -26.023114109128812 ], [ -55.239387579972856, -26.019703463544033 ], [ -55.246880662912247, -26.017894789313061 ], [ -55.266104294877323, -26.016499526232167 ], [ -55.274036628287774, -26.013864027902571 ], [ -55.280392828766026, -26.009368177599299 ], [ -55.285715502268602, -26.004045504996043 ], [ -55.289126146054798, -25.999911390798047 ], [ -55.293337774618578, -25.995673922913227 ], [ -55.29933224079025, -25.991591484659295 ], [ -55.305275031017857, -25.990661309571806 ], [ -55.337004361062384, -25.999291274073016 ], [ -55.354677700315619, -26.002391859496697 ], [ -55.383203091249641, -26.004045504996043 ], [ -55.407361823089673, -26.003167005852617 ], [ -55.41575924269489, -26.004407241101319 ], [ -55.429014247809278, -26.010298353586165 ], [ -55.436455654804604, -26.00905811923684 ], [ -55.444387987315736, -26.006267592175618 ], [ -55.45779802116175, -25.999704685223037 ], [ -55.499165005160876, -25.984563490612629 ], [ -55.503867560139781, -25.981359551502123 ], [ -55.509629483214098, -25.97355641020016 ], [ -55.513117642265399, -25.962756036262078 ], [ -55.509655320736442, -25.935264174102372 ], [ -55.509577806370658, -25.925910740088568 ], [ -55.516166550845639, -25.905705255293299 ], [ -55.516528286051539, -25.895938409230212 ], [ -55.513169318209464, -25.884879652873678 ], [ -55.516218227689023, -25.87506112996715 ], [ -55.521101650720595, -25.868859959119845 ], [ -55.526295132114626, -25.860746758556047 ], [ -55.526191779327121, -25.850256442980481 ], [ -55.51962887237454, -25.832324721308851 ], [ -55.499888474673355, -25.79258554528667 ], [ -55.496865403615459, -25.788813164495934 ], [ -55.475988125251774, -25.77274179479798 ], [ -55.469761115083372, -25.765662123008553 ], [ -55.465394456888646, -25.756308688994807 ], [ -55.449684820598009, -25.712125338613475 ], [ -55.446300015233533, -25.698327732039218 ], [ -55.444853075309197, -25.675745130433427 ], [ -55.43891028508159, -25.662205906277563 ], [ -55.431339687776358, -25.651870618534247 ], [ -55.405966559109402, -25.630941664226441 ], [ -55.400049608202835, -25.622983494192908 ], [ -55.39821509465088, -25.616265557609381 ], [ -55.399532844265366, -25.608875827457496 ], [ -55.403977016825877, -25.602209567717352 ], [ -55.416999477943534, -25.58660328511354 ], [ -55.421030239354081, -25.577249851099737 ], [ -55.422761400118532, -25.568826593072799 ], [ -55.422968105693542, -25.561333510133409 ], [ -55.425371060026407, -25.555339043961737 ], [ -55.430331997423707, -25.550481458452566 ], [ -55.444103765576301, -25.54707081466637 ], [ -55.453405523645984, -25.546347345153833 ], [ -55.489243130366162, -25.555597425480812 ], [ -55.25641496407934, -25.261300144086363 ], [ -55.226830206848547, -25.231276137283885 ], [ -55.215332200920329, -25.2315861956464 ], [ -55.196806200046069, -25.243471775202238 ], [ -55.171278041748224, -25.266726169477124 ], [ -55.160916918281146, -25.271945489292875 ], [ -55.137068243904309, -25.280007013013233 ], [ -55.124304165205047, -25.282797540074398 ], [ -55.113193732005129, -25.282074069662599 ], [ -55.114098069570275, -25.272410577286337 ], [ -55.1195499333827, -25.252618503641031 ], [ -55.120144211686011, -25.242128188065408 ], [ -55.113813848730103, -25.248277682968705 ], [ -55.104202033197282, -25.262385348804798 ], [ -55.098026698972944, -25.268896579813315 ], [ -55.090120204883533, -25.273805841266551 ], [ -55.082162034850001, -25.276337985909322 ], [ -55.065057136377732, -25.279283542601434 ], [ -55.051052822429824, -25.284709567992195 ], [ -55.043223842706198, -25.293442885280911 ], [ -55.039399786870661, -25.304760024055895 ], [ -55.037591111740426, -25.318402601898583 ], [ -55.024155238573371, -25.339899997886619 ], [ -54.998627082074165, -25.343310641672758 ], [ -54.972117071845389, -25.343982436140493 ], [ -54.949405279929692, -25.337729587550427 ], [ -54.949611986404022, -25.325327244057064 ], [ -54.950645515178394, -25.319849541822919 ], [ -54.952531703775094, -25.314888603526242 ], [ -54.955063849317185, -25.310496107809115 ], [ -54.961368373851371, -25.302331231301309 ], [ -54.964107224968473, -25.297938734684863 ], [ -54.966277635304607, -25.293236178806637 ], [ -54.967414516866427, -25.287810153415876 ], [ -54.967311164078978, -25.281712334456699 ], [ -54.965037400955282, -25.263625584053443 ], [ -54.966096768151317, -25.258406264237692 ], [ -54.969016486421708, -25.254323825983761 ], [ -54.973434820560499, -25.251533298023276 ], [ -55.000125697942622, -25.241921481591078 ], [ -55.005396694601757, -25.239130954529912 ], [ -55.009169073593853, -25.236288750625363 ], [ -55.012373012704359, -25.232568047577331 ], [ -55.014465907775389, -25.228330579692511 ], [ -55.014595098984614, -25.223214613563584 ], [ -55.008445604081373, -25.203784275124178 ], [ -55.007722133669517, -25.197686456165002 ], [ -55.008290575349747, -25.191950371512462 ], [ -55.011081102410913, -25.187919610101915 ], [ -55.015008511033955, -25.184508965416398 ], [ -55.098956874959811, -25.1294218892088 ], [ -55.179546271043591, -25.059968763847394 ], [ -55.185359870061973, -25.052062269757926 ], [ -55.188693000381647, -25.048548272284961 ], [ -55.193292201673785, -25.046636243467844 ], [ -55.198821580751371, -25.04679127399811 ], [ -55.204557665403911, -25.047463066667206 ], [ -55.210061205160457, -25.047463066667206 ], [ -55.214841275404524, -25.045757745223739 ], [ -55.218717007184125, -25.042657158900738 ], [ -55.222205166235426, -25.038936455852763 ], [ -55.226080898914347, -25.035577488010688 ], [ -55.230964321945919, -25.033510430462002 ], [ -55.23675208164326, -25.032580254475192 ], [ -55.254993862576669, -25.034905693542953 ], [ -55.26158260795097, -25.034957371285657 ], [ -55.268481410788468, -25.034440605549491 ], [ -55.274630906591085, -25.033045342468597 ], [ -55.280237800034456, -25.031081637707416 ], [ -55.284940355013362, -25.028291110646251 ], [ -55.289126146054798, -25.025293878010075 ], [ -55.296257493788289, -25.018214207119968 ], [ -55.29935808011129, -25.014338473541727 ], [ -55.302071091907351, -25.010152682500291 ], [ -55.306463589423117, -25.000075778974008 ], [ -55.310235969314533, -24.990929049635952 ], [ -55.315041877080944, -24.981989027671489 ], [ -55.327521734940092, -24.965917657074215 ], [ -55.329717983698004, -24.959664808484149 ], [ -55.330338101322297, -24.950156344839456 ], [ -55.326591558953282, -24.938012383764487 ], [ -55.326203986224982, -24.92995086004413 ], [ -55.326720751061828, -24.92364633551 ], [ -55.328426073404557, -24.918530368481697 ], [ -55.329614630910498, -24.912794284728477 ], [ -55.329769659642068, -24.906024672200886 ], [ -55.328296882195332, -24.890418389597016 ], [ -55.328581102136127, -24.884062188219389 ], [ -55.329769659642068, -24.878739515616132 ], [ -55.331733364403249, -24.873985283793843 ], [ -55.333542040432803, -24.867835788890545 ], [ -55.334110480314393, -24.860962822676129 ], [ -55.333180305226904, -24.850420831156441 ], [ -55.326565721430882, -24.843702894572914 ], [ -55.316204597064484, -24.829130140743416 ], [ -55.314654304352644, -24.820086765092128 ], [ -55.31519690581257, -24.811198419071786 ], [ -55.323930223101286, -24.78737558401599 ], [ -55.328451910926958, -24.768565362301615 ], [ -55.326359015855871, -24.757661634676708 ], [ -55.322405767911846, -24.751460462930027 ], [ -55.31480933308427, -24.746809583895185 ], [ -55.307703822873123, -24.741021824197844 ], [ -55.301037564032356, -24.729187920586071 ], [ -55.298892992117885, -24.717250665086112 ], [ -55.300210740832995, -24.676219577871223 ], [ -55.2961024641574, -24.666659438282466 ], [ -55.285431281428487, -24.649451186123372 ], [ -55.284320238288387, -24.64092457351029 ], [ -55.285586310160056, -24.630692641252381 ], [ -55.291606614753448, -24.608420098908425 ], [ -55.292976040311999, -24.593433933029587 ], [ -55.291580777231104, -24.583718763809884 ], [ -55.288531866852168, -24.575502210458637 ], [ -55.283803474350862, -24.568680921986982 ], [ -55.253443569864828, -24.535866388123338 ], [ -55.227527838838682, -24.50217335421695 ], [ -55.116759406321535, -24.467498467480311 ], [ -55.09531368717694, -24.472717787296062 ], [ -55.099551154162441, -24.509563083469516 ], [ -55.098388434178901, -24.520725192613554 ], [ -55.093685879199938, -24.532765801800338 ], [ -55.079035611004656, -24.545788262917995 ], [ -55.064592048384327, -24.551524346671272 ], [ -55.051517910423229, -24.553539726477197 ], [ -55.039296434083155, -24.551162611465372 ], [ -55.01568030460237, -24.542170911758149 ], [ -55.000745815566916, -24.53974211990294 ], [ -54.992322556640659, -24.539587091171313 ], [ -54.915712246023304, -24.562014662246895 ], [ -54.896462774737245, -24.571884861097487 ], [ -54.884835577599802, -24.582633559091505 ], [ -54.882923549682062, -24.591625257899352 ], [ -54.883336960832082, -24.598704928789459 ], [ -54.884706387289953, -24.60428598381111 ], [ -54.886902635148488, -24.609712009201871 ], [ -54.887316047197828, -24.614827976230117 ], [ -54.885404019280031, -24.620202324777495 ], [ -54.878815273905786, -24.626351820580055 ], [ -54.871012131704504, -24.628987318909651 ], [ -54.862563036155166, -24.630227553258976 ], [ -54.826234503919238, -24.631467786708981 ], [ -54.811971807552879, -24.633173109951088 ], [ -54.803910284731842, -24.636583753737227 ], [ -54.800241257627931, -24.639684340060228 ], [ -54.800292935370692, -24.644335219095069 ], [ -54.800964728039787, -24.65032968526674 ], [ -54.801016404883171, -24.659011325712129 ], [ -54.795667893858194, -24.666039320658115 ], [ -54.790603603673389, -24.668674818987711 ], [ -54.784479946292493, -24.668364759725876 ], [ -54.779338140842526, -24.666194350289061 ], [ -54.774067145082654, -24.66309376396606 ], [ -54.768925339632688, -24.658442884931219 ], [ -54.764403652706392, -24.653481947533862 ], [ -54.758047451328821, -24.644231866307564 ], [ -54.753267381084754, -24.639684340060228 ], [ -54.746032680563758, -24.634878432293817 ], [ -54.733992072276294, -24.633948256307008 ], [ -54.725155402200016, -24.635963637012253 ], [ -54.71388994026853, -24.641131279984563 ], [ -54.706371018907362, -24.64361174868327 ], [ -54.69807695208965, -24.644851983032595 ], [ -54.691643236346295, -24.643921807945105 ], [ -54.67704464409502, -24.639891045635238 ], [ -54.668363002750368, -24.638805840916802 ], [ -54.663634610249062, -24.640304456785259 ], [ -54.659422979886585, -24.644645277457585 ], [ -54.648829312422833, -24.669760023706147 ], [ -54.643067390247836, -24.678079928945579 ], [ -54.63619442403342, -24.685314629466575 ], [ -54.626530930757838, -24.689190362145496 ], [ -54.549972296983924, -24.699577324933614 ], [ -54.521085170843946, -24.707483819023025 ], [ -54.49323157437766, -24.718180841072979 ], [ -54.469744636106043, -24.722676689577554 ], [ -54.444836595432548, -24.72283172010782 ], [ -54.421401333105052, -24.720609632928245 ], [ -54.395666470131459, -24.720454604196618 ], [ -54.381610480239488, -24.722159925640085 ], [ -54.358976202689576, -24.731203302190636 ], [ -54.358429465247639, -24.73142174661632 ], [ -54.371120971999943, -24.766652526999891 ], [ -54.399749715999917, -24.804789733999939 ], [ -54.407294474999873, -24.821222838999915 ], [ -54.453286498999944, -25.002813821999951 ], [ -54.462278197999893, -25.0372303259999 ], [ -54.464190225999914, -25.055937194999984 ], [ -54.463311726999876, -25.072783711999961 ], [ -54.45519852699988, -25.09211069699991 ], [ -54.429722045999966, -25.130557962999958 ], [ -54.426621460999911, -25.149471537 ], [ -54.435664835999972, -25.16704152399997 ], [ -54.469409545999952, -25.195463561999901 ], [ -54.481450154999919, -25.213240253999928 ], [ -54.503567667999931, -25.278662617999899 ], [ -54.528475708999906, -25.314319355999899 ], [ -54.547079223999845, -25.336643574999954 ], [ -54.575656290999916, -25.360311380999889 ], [ -54.597980509999871, -25.397518411999982 ], [ -54.609814412999896, -25.432761738999972 ], [ -54.611829792999941, -25.444027200999926 ], [ -54.612449910999914, -25.46552459699997 ], [ -54.608522501999943, -25.487642109999882 ], [ -54.598497273999925, -25.505832213999923 ], [ -54.591469278999909, -25.524745788999965 ], [ -54.594156453999943, -25.548620300999943 ], [ -54.599944214999908, -25.572701516999899 ], [ -54.60020261299988, -25.574944883999891 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-7", "NAME_1": "Itapúa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -54.664973817999908, -26.238863213999963 ], [ -54.666141723999885, -26.243668314999908 ], [ -54.663661254999909, -26.263305358999929 ], [ -54.663661254999909, -26.308367207999979 ], [ -54.679060831999919, -26.33988983199994 ], [ -54.680430257999973, -26.34526418 ], [ -54.683401651999901, -26.350845234999923 ], [ -54.693065144999906, -26.411926777999923 ], [ -54.697664347999961, -26.428153177999931 ], [ -54.706475178999938, -26.441795755999934 ], [ -54.737170980999906, -26.473215026999881 ], [ -54.76530879799995, -26.494092305999942 ], [ -54.780346639999919, -26.510422057999889 ], [ -54.789829264999895, -26.528508808999987 ], [ -54.788769897999913, -26.542564798999919 ], [ -54.783498901999877, -26.55672414199995 ], [ -54.780346639999919, -26.575224303999889 ], [ -54.781276814999984, -26.598168639999926 ], [ -54.784945841999871, -26.622766621999901 ], [ -54.793059041999896, -26.644987487999941 ], [ -54.807011678999885, -26.661213886999946 ], [ -54.817321126999872, -26.665761413999888 ], [ -54.822824666999878, -26.663280944999912 ], [ -54.827423868999915, -26.658113301999904 ], [ -54.834968627999871, -26.654392598999905 ], [ -54.879358683999925, -26.654392598999905 ], [ -54.903336548999846, -26.659870299999895 ], [ -54.919898844999949, -26.674132995999869 ], [ -54.930725056999876, -26.693976744999944 ], [ -54.943876708999966, -26.739968770999951 ], [ -54.951137247999924, -26.757538756999921 ], [ -54.961007445999911, -26.772318216999935 ], [ -54.975270141999886, -26.787821145999942 ], [ -54.991780761999877, -26.794642435999904 ], [ -55.040744181999884, -26.798466491999946 ], [ -55.060897989999944, -26.805184427999876 ], [ -55.125777750999873, -26.863578795999928 ], [ -55.132676554999961, -26.880632018999876 ], [ -55.118878946999899, -26.920009460999964 ], [ -55.122315429999844, -26.941713561999876 ], [ -55.138360962999911, -26.953702493999927 ], [ -55.161563679999915, -26.957319844999901 ], [ -55.201199503999874, -26.955459492999907 ], [ -55.216650756999883, -26.95122202599994 ], [ -55.235176757999909, -26.942230326 ], [ -55.256544962999925, -26.934582213999931 ], [ -55.280600341999843, -26.934272155999935 ], [ -55.329408731999905, -26.958456725999909 ], [ -55.37622757999992, -26.963831074999874 ], [ -55.396329711999982, -26.969308776999952 ], [ -55.414003051999885, -26.979850768999924 ], [ -55.430849568999889, -26.996387226999914 ], [ -55.4427609869999, -27.01550750699991 ], [ -55.448832966999959, -27.035868021999946 ], [ -55.451313435999936, -27.082066751999903 ], [ -55.461855428999911, -27.097983092999925 ], [ -55.486401733999884, -27.100050149999973 ], [ -55.51399694899996, -27.097466328999886 ], [ -55.533840698999938, -27.099430033999923 ], [ -55.545364542999977, -27.115243021999916 ], [ -55.549524495999918, -27.135810241999906 ], [ -55.555338094999911, -27.153793639999975 ], [ -55.571745361999945, -27.161545104999902 ], [ -55.598281209999953, -27.167539570999921 ], [ -55.598978841999951, -27.182629089999921 ], [ -55.574871785999903, -27.223556823999942 ], [ -55.570582641999948, -27.235339049999936 ], [ -55.568670613999927, -27.245984394999937 ], [ -55.570711832999876, -27.256423034999969 ], [ -55.58407019099991, -27.276783549 ], [ -55.583243367999984, -27.283501484999931 ], [ -55.580762898999893, -27.29166636099994 ], [ -55.581641397999931, -27.305515645999918 ], [ -55.591330728999964, -27.328356627999923 ], [ -55.60747961499996, -27.345513203999886 ], [ -55.628718628999934, -27.356365254999929 ], [ -55.653626667999902, -27.360085957999942 ], [ -55.681712809999937, -27.379412943999895 ], [ -55.71749873899995, -27.417343444999901 ], [ -55.754731607999872, -27.443698424999951 ], [ -55.815167195999891, -27.414139505999927 ], [ -55.842090616999911, -27.407421569999897 ], [ -55.854157063999878, -27.401220397999921 ], [ -55.862787027999929, -27.391091816999875 ], [ -55.877850708999915, -27.353574726999881 ], [ -55.892836873999983, -27.334867858999885 ], [ -55.913094034999915, -27.327839863999969 ], [ -55.936374267999923, -27.32825327499998 ], [ -55.960662190999926, -27.331560566999897 ], [ -55.966094416224337, -27.331723069164298 ], [ -55.984846760999886, -27.332284036999894 ], [ -56.006893544999912, -27.328250904999962 ], [ -56.073756062999848, -27.304895527999946 ], [ -56.074245977999908, -27.304811111999882 ], [ -56.098948323999906, -27.300554706999961 ], [ -56.124553995999946, -27.298901061999914 ], [ -56.149978799999957, -27.311820169999919 ], [ -56.168892374999899, -27.324739277999939 ], [ -56.205427612999927, -27.362153014999905 ], [ -56.228010212999948, -27.371248066999968 ], [ -56.256768147999878, -27.378276061999969 ], [ -56.279841674999943, -27.389644876999881 ], [ -56.285319376999922, -27.411348977999879 ], [ -56.281469482999881, -27.438634134999887 ], [ -56.285319376999922, -27.460958352999938 ], [ -56.296998250999906, -27.480905456999963 ], [ -56.3164802659999, -27.50043914799997 ], [ -56.335988118999893, -27.525657246999927 ], [ -56.349656534999923, -27.556353047999963 ], [ -56.367536580999882, -27.580640970999966 ], [ -56.39973099799991, -27.586842142999942 ], [ -56.400298629999895, -27.586636240999965 ], [ -56.431356974999915, -27.575369976999937 ], [ -56.461484334999909, -27.553872577999897 ], [ -56.48732255099992, -27.527207538999861 ], [ -56.506210286999959, -27.500129088999898 ], [ -56.546440388999883, -27.455067240999938 ], [ -56.5469333449999, -27.455002941999865 ], [ -56.612999633999948, -27.446385598999896 ], [ -56.638015875432302, -27.45291157480932 ], [ -56.638037854863114, -27.452615009874819 ], [ -56.64322954031104, -27.382566012611392 ], [ -56.642299364324174, -27.37677825291405 ], [ -56.638216926070299, -27.368871758824639 ], [ -56.635245530956468, -27.364582614995697 ], [ -56.631912400636793, -27.358536471980585 ], [ -56.631628180695998, -27.353162122533945 ], [ -56.635400559688094, -27.345410658075423 ], [ -56.640206468353824, -27.339726251165587 ], [ -56.675320603762827, -27.309960625882184 ], [ -56.682296921865429, -27.302570895730241 ], [ -56.688472256089767, -27.293992608072415 ], [ -56.690255092798282, -27.277507825425801 ], [ -56.687309536106227, -27.25611378312459 ], [ -56.673873663838492, -27.215134372753084 ], [ -56.66477861224314, -27.199476414205151 ], [ -56.654960090235988, -27.189244480148659 ], [ -56.645167405751181, -27.184335218695367 ], [ -56.636640794037419, -27.177358900592765 ], [ -56.610725063910536, -27.151210625569888 ], [ -56.60137162899747, -27.146042982597578 ], [ -56.594136929375793, -27.143510837954807 ], [ -56.543338996097759, -27.13777475420153 ], [ -56.534114753293238, -27.120979913192457 ], [ -56.531970181378767, -27.086408380142643 ], [ -56.572251959760138, -26.722399590968337 ], [ -56.496907721913828, -26.737282403160407 ], [ -56.490422329327032, -26.740641371002482 ], [ -56.459235601641694, -26.763895766176688 ], [ -56.444352790349001, -26.77257740662202 ], [ -56.428720669323411, -26.775988051307536 ], [ -56.411667446795207, -26.775626316101636 ], [ -56.295679693562988, -26.734956964092646 ], [ -56.209922655406217, -26.69335743609679 ], [ -56.148970303336796, -26.675529067212665 ], [ -56.118352017331745, -26.671291598428525 ], [ -56.102383998622656, -26.665142103525284 ], [ -56.094865078160808, -26.657752374272661 ], [ -56.085589159412166, -26.626746514639933 ], [ -56.07933630992278, -26.617444756570251 ], [ -56.070913051895843, -26.608814792968303 ], [ -56.056495326797858, -26.59796274218678 ], [ -56.044868129660472, -26.585922133000054 ], [ -56.035230474806554, -26.572589613519824 ], [ -56.025954556057911, -26.548146660839734 ], [ -56.021071133026339, -26.538379814776647 ], [ -55.99895362031333, -26.508200779242543 ], [ -55.984070808121317, -26.498020522029492 ], [ -55.933918829989977, -26.483447768199937 ], [ -55.864620734259461, -26.471975599794121 ], [ -55.847050746894467, -26.464637545586243 ], [ -55.831108568405682, -26.4549740541093 ], [ -55.784548102113206, -26.410428968522069 ], [ -55.765737881298151, -26.396217949898471 ], [ -55.758916591927175, -26.388466484540629 ], [ -55.750415818635133, -26.36846770621969 ], [ -55.739873827115446, -26.356892185026311 ], [ -55.681066046960495, -26.334154554688951 ], [ -55.63876888697456, -26.322992445544912 ], [ -55.617865770189155, -26.320873712052162 ], [ -55.6001924300366, -26.321132093571237 ], [ -55.586136441043891, -26.324129327106789 ], [ -55.572468023880162, -26.323199151119923 ], [ -55.551668259882263, -26.319736829591022 ], [ -55.483791265654361, -26.296585789002961 ], [ -55.465704515251161, -26.287439059664848 ], [ -55.381601121694416, -26.227649427579024 ], [ -55.340130784907785, -26.19116586661147 ], [ -55.331991746821643, -26.182639254897708 ], [ -55.325971442228251, -26.173699232933245 ], [ -55.323180915167086, -26.165172621219483 ], [ -55.324162767098017, -26.117320244633561 ], [ -55.322560798442112, -26.109155369025075 ], [ -55.320312872840816, -26.102334079654042 ], [ -55.319331020909885, -26.096287936638987 ], [ -55.31938269685395, -26.089673353742285 ], [ -55.317754889776324, -26.081766859652873 ], [ -55.31558447944019, -26.078666274229192 ], [ -55.312096320388889, -26.077581068611437 ], [ -55.308220587709968, -26.078976331692331 ], [ -55.304370694352031, -26.080940036453512 ], [ -55.291451585122559, -26.083317153264034 ], [ -55.257500168797719, -26.180313815829948 ], [ -55.23675208164326, -26.198245537501577 ], [ -55.162544725358771, -26.194834893715381 ], [ -55.142752651713522, -26.195765068802871 ], [ -55.134639452049043, -26.197160332783142 ], [ -55.124795090720852, -26.199640801481792 ], [ -55.09949947821832, -26.209407646645559 ], [ -55.067253384236267, -26.216849053640942 ], [ -55.056763067761381, -26.222378431819152 ], [ -55.041363490732522, -26.232920424238216 ], [ -55.03343115912071, -26.236331068923676 ], [ -55.027255824896372, -26.236951185648707 ], [ -55.023431769060892, -26.234522393793441 ], [ -55.020951301261562, -26.232610365875701 ], [ -55.01911678681023, -26.23028492590862 ], [ -55.016145391696455, -26.223205255018513 ], [ -55.012217983972789, -26.218554375983672 ], [ -55.005655077020208, -26.212198174606101 ], [ -54.972582159838794, -26.209407646645559 ], [ -54.959042934783611, -26.206513766796888 ], [ -54.952945115824434, -26.204136650885744 ], [ -54.946123827352721, -26.200260919106142 ], [ -54.939250861138305, -26.194266452934471 ], [ -54.935090907619269, -26.189512221112125 ], [ -54.919975552329845, -26.164655857282014 ], [ -54.912689174965465, -26.154992364006375 ], [ -54.907056443999693, -26.14894622189064 ], [ -54.902353889020731, -26.145690605936693 ], [ -54.896075202008944, -26.143313490924868 ], [ -54.891605191026713, -26.143468519656437 ], [ -54.888478766282049, -26.144760430849203 ], [ -54.886747606416918, -26.147550957910369 ], [ -54.886075811949183, -26.152150160101826 ], [ -54.886695929573477, -26.157317803973456 ], [ -54.890959234980699, -26.171632174485239 ], [ -54.89157935170573, -26.178453463856272 ], [ -54.889202236693848, -26.183621107727959 ], [ -54.879900478624165, -26.190442397098934 ], [ -54.872174851688044, -26.192716160222631 ], [ -54.864604255282131, -26.192509453748301 ], [ -54.859023200260481, -26.190442397098934 ], [ -54.853209601242099, -26.187031751514098 ], [ -54.839773728974421, -26.176593112781916 ], [ -54.831298794104043, -26.1724589976846 ], [ -54.823340624070511, -26.170288588247729 ], [ -54.807811855832483, -26.170081881773399 ], [ -54.788820766964818, -26.173492526458915 ], [ -54.77419633629188, -26.178453463856272 ], [ -54.755024380270925, -26.187341810775933 ], [ -54.749908413242679, -26.19059742583056 ], [ -54.745981003720317, -26.194111423303525 ], [ -54.743552211865051, -26.197160332783142 ], [ -54.742518683090736, -26.201346123824578 ], [ -54.742518683090736, -26.206307061221878 ], [ -54.743707240596677, -26.2132833802238 ], [ -54.743500535920987, -26.219639580702108 ], [ -54.741562668682207, -26.226099134867184 ], [ -54.735542364988135, -26.232300306613865 ], [ -54.724457770209938, -26.23467742252501 ], [ -54.667432826763559, -26.238863213566447 ], [ -54.665598314110923, -26.238863213566447 ], [ -54.664973817999908, -26.238863213999963 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-12", "NAME_1": "Ñeembucú" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -58.124018514999932, -26.201913756999957 ], [ -58.115233520999936, -26.190958352999886 ], [ -58.1062934979999, -26.170287780999956 ], [ -58.096681680999893, -26.136698099999933 ], [ -58.08650142399992, -26.127189635999954 ], [ -58.021595825999981, -26.105692239999911 ], [ -57.988212849999911, -26.088535664999952 ], [ -57.872716023999942, -26.010297546 ], [ -57.859693562999894, -25.994277851999939 ], [ -57.859590210999954, -25.980945332999923 ], [ -57.905840617999843, -25.968646341999971 ], [ -57.898244181999871, -25.953556822999886 ], [ -57.863310913999982, -25.927615254999921 ], [ -57.857109741999892, -25.919863788999919 ], [ -57.851373656999925, -25.908391621999911 ], [ -57.852407185999908, -25.897952981999964 ], [ -57.875351521999875, -25.89020151799987 ], [ -57.878193725999921, -25.883173522999954 ], [ -57.875351521999875, -25.876145527999938 ], [ -57.854215860999915, -25.86891082699988 ], [ -57.8332352299999, -25.858782246999922 ], [ -57.819661966426622, -25.849779220434698 ], [ -57.816336229433432, -25.85134164769886 ], [ -57.792255011959242, -25.856147555465327 ], [ -57.787139044930996, -25.85444223402186 ], [ -57.781583828331009, -25.851238294911411 ], [ -57.780421109246788, -25.847000827925854 ], [ -57.780111049984953, -25.840024508923932 ], [ -57.781299608390214, -25.823177991970738 ], [ -57.780524461134974, -25.814961439518811 ], [ -57.778121506802108, -25.8105172669583 ], [ -57.774064906969897, -25.807416680635299 ], [ -57.769362351990935, -25.806589857435995 ], [ -57.764246384962689, -25.807106622272784 ], [ -57.74424760574243, -25.81377288201287 ], [ -57.737426317270717, -25.814806409887922 ], [ -57.731225144624716, -25.814237970006332 ], [ -57.71008948384258, -25.809845472490565 ], [ -57.703836636151834, -25.80974211970306 ], [ -57.697196213934092, -25.81263599955173 ], [ -57.68926388232228, -25.818733818510907 ], [ -57.675724657267097, -25.835115247470696 ], [ -57.662237108156035, -25.848241062275179 ], [ -57.640222948230473, -25.865759372796845 ], [ -57.616865200268762, -25.879350273796092 ], [ -57.590458543726811, -25.899762465065692 ], [ -57.579942389729467, -25.905085137668948 ], [ -57.559607712825652, -25.913094984545921 ], [ -57.555344408317808, -25.917694186737322 ], [ -57.552037116419797, -25.923895358484003 ], [ -57.550486822808637, -25.934437350903011 ], [ -57.547515427694805, -25.943067314504958 ], [ -57.541960211994194, -25.952885838310806 ], [ -57.516716275435783, -25.982754814583018 ], [ -57.503590460631244, -26.011073499942086 ], [ -57.475736864164958, -26.156852715980051 ], [ -57.476977097614963, -26.167188001924728 ], [ -57.481240403921504, -26.174319349658276 ], [ -57.614152187573382, -26.294105320304311 ], [ -57.652780321354726, -26.361698092792778 ], [ -57.664510871279674, -26.377304376295911 ], [ -57.685904913580885, -26.392187187588661 ], [ -57.70549028165118, -26.412496026070755 ], [ -57.634822761261432, -26.780845635917387 ], [ -57.628647427037095, -26.798363945539677 ], [ -57.619733241695712, -26.818000990453356 ], [ -57.536818407443548, -26.923730971207362 ], [ -57.421734991776418, -27.044292088209318 ], [ -57.414293585680412, -27.047857760727084 ], [ -57.232185838305782, -27.072714124557194 ], [ -57.203557094584255, -27.080000501921631 ], [ -57.195908982913238, -27.095658460469565 ], [ -57.202058477816479, -27.133847344679225 ], [ -57.291355352767312, -27.361533704616761 ], [ -57.309648809644841, -27.427989596442728 ], [ -57.310115750241664, -27.429207702073768 ], [ -57.326289429999889, -27.414862975999924 ], [ -57.33522945099989, -27.409488626999874 ], [ -57.356466096999952, -27.404342991999911 ], [ -57.360395874999938, -27.403390807999912 ], [ -57.386699177999901, -27.403494160999927 ], [ -57.487674926999915, -27.416413268999946 ], [ -57.513358113999914, -27.414139505999927 ], [ -57.519937904999949, -27.412098551999904 ], [ -57.535682332999954, -27.40721486399994 ], [ -57.69779130099991, -27.33352427199992 ], [ -57.698183455999953, -27.333398221999886 ], [ -57.709366821999964, -27.329803568999907 ], [ -57.811582803999926, -27.310683288999911 ], [ -57.811912929999977, -27.310582987999879 ], [ -57.854784301999871, -27.297557474999863 ], [ -57.855088470999902, -27.29749900199991 ], [ -57.89950352199989, -27.288960658999898 ], [ -57.913385375999979, -27.286292012999894 ], [ -57.944029500999903, -27.274613138999911 ], [ -57.944356433999872, -27.274551133999935 ], [ -58.003664133999933, -27.263303121999911 ], [ -58.02195755999989, -27.259833678999897 ], [ -58.022046212999953, -27.259831356999982 ], [ -58.053531860999954, -27.259006855999885 ], [ -58.113993285999896, -27.268928730999875 ], [ -58.128824422999912, -27.269652200999957 ], [ -58.238223428999845, -27.257043151999937 ], [ -58.510764932999905, -27.278437194999952 ], [ -58.600165160999893, -27.312957051999931 ], [ -58.604195923403154, -27.31626434282515 ], [ -58.604134633999877, -27.315548077999907 ], [ -58.599906779999912, -27.266138203999915 ], [ -58.601560424999974, -27.245674336999954 ], [ -58.614014444999953, -27.226657409999888 ], [ -58.63871577999987, -27.210120950999894 ], [ -58.652358357999873, -27.198028665999914 ], [ -58.658404499999904, -27.185109557999894 ], [ -58.653288533999927, -27.156274108999952 ], [ -58.638819132999885, -27.135913594999934 ], [ -58.616133178999917, -27.12382130999994 ], [ -58.565490274999974, -27.115966490999909 ], [ -58.560529337999924, -27.10552785299997 ], [ -58.562389689999918, -27.090128275999888 ], [ -58.562182982999872, -27.0721448769999 ], [ -58.559702514999913, -27.063359883999922 ], [ -58.556395223999914, -27.055505065999881 ], [ -58.55169266799993, -27.048167011999894 ], [ -58.545439819999928, -27.041035664999953 ], [ -58.536258596999915, -27.03629371399991 ], [ -58.536034708999864, -27.036178079999928 ], [ -58.530505330999858, -27.040518900999913 ], [ -58.528024861999882, -27.047753600999968 ], [ -58.528024861999882, -27.051681009999939 ], [ -58.527043009999915, -27.054161478999916 ], [ -58.520032093999902, -27.05836802799989 ], [ -58.519808308999956, -27.058502298999898 ], [ -58.511540079999918, -27.060155944999948 ], [ -58.50756099499992, -27.05509165499997 ], [ -58.506734171999909, -27.038451842999862 ], [ -58.504873819999915, -27.031527200999875 ], [ -58.501359822999945, -27.023672383999937 ], [ -58.49236812399991, -27.009719746999934 ], [ -58.474539754999853, -26.990082702999914 ], [ -58.466633260999913, -26.975923359999868 ], [ -58.48161942599998, -26.963831074999874 ], [ -58.483686482999929, -26.950601907999967 ], [ -58.475469930999907, -26.937992858999863 ], [ -58.459811970999851, -26.928174336999888 ], [ -58.415525268999914, -26.917528991999902 ], [ -58.39387284299994, -26.90967417399996 ], [ -58.384674438999951, -26.897065124999926 ], [ -58.374700886999932, -26.887556660999863 ], [ -58.351274896203968, -26.885811609526552 ], [ -58.3289155679999, -26.884146015999917 ], [ -58.315789753999923, -26.874120788999903 ], [ -58.322145955999957, -26.856757506999969 ], [ -58.340387736999901, -26.844458515999932 ], [ -58.352376667999863, -26.830505879999947 ], [ -58.340026001999917, -26.808595071999903 ], [ -58.323334512999878, -26.803840839999907 ], [ -58.305506143999935, -26.809111836999932 ], [ -58.288556274999934, -26.811488952999881 ], [ -58.274810343999889, -26.798363138999918 ], [ -58.2784793699999, -26.790198261999905 ], [ -58.28654089399987, -26.778726094999882 ], [ -58.287936157999951, -26.768597513999921 ], [ -58.271399698999858, -26.76425669399994 ], [ -58.259255736999961, -26.764463398999908 ], [ -58.251762654999936, -26.763223164999957 ], [ -58.24793859899998, -26.758158874999893 ], [ -58.245199747999948, -26.680230814999916 ], [ -58.240652221999909, -26.661213886999946 ], [ -58.235536254999914, -26.649845072999952 ], [ -58.232280639999942, -26.648604837999926 ], [ -58.227164672999947, -26.652015482999943 ], [ -58.195693725999888, -26.657493183999932 ], [ -58.183859822999892, -26.656769714999939 ], [ -58.178640502999968, -26.650671894999888 ], [ -58.181379353999915, -26.64157684299991 ], [ -58.18716711499988, -26.633618671999955 ], [ -58.192076375999903, -26.624626973999909 ], [ -58.192283081999875, -26.612844746999912 ], [ -58.188510701999945, -26.609744160999966 ], [ -58.17150915499991, -26.598582050999937 ], [ -58.164946248999939, -26.592277526999922 ], [ -58.170527302999858, -26.586799824999929 ], [ -58.179312296999939, -26.572640482999887 ], [ -58.1854101159999, -26.564992369999914 ], [ -58.207992716999939, -26.550212910999889 ], [ -58.213367065999904, -26.544528502999938 ], [ -58.217346150999873, -26.527578632999933 ], [ -58.214193888999915, -26.512385762999912 ], [ -58.208716186999936, -26.496882832999901 ], [ -58.205925659999878, -26.479416197999868 ], [ -58.202721719999914, -26.471561380999916 ], [ -58.188665730999901, -26.462052916999937 ], [ -58.1854101159999, -26.451717630999923 ], [ -58.209594686999964, -26.431253762999873 ], [ -58.213057006999918, -26.418644713999939 ], [ -58.206184041999848, -26.402728372999917 ], [ -58.172697713999952, -26.349294942999904 ], [ -58.16763342299987, -26.33503224699993 ], [ -58.164946248999939, -26.31859914099995 ], [ -58.170010538999918, -26.286559752999949 ], [ -58.169958862999891, -26.270333353999945 ], [ -58.161845662999895, -26.263305358999929 ], [ -58.145980997999885, -26.260101419999955 ], [ -58.123295043999917, -26.251523131999932 ], [ -58.105983438999914, -26.239534199999881 ], [ -58.106603556999886, -26.226098326999931 ], [ -58.121227986999969, -26.216693216999971 ], [ -58.137144327999891, -26.209458516999902 ], [ -58.148926554999889, -26.199329935999955 ], [ -58.151303669999919, -26.181449889999982 ], [ -58.141175089999876, -26.184757181999899 ], [ -58.133216918999921, -26.188994649999941 ], [ -58.127635864999917, -26.194679055999899 ], [ -58.124018514999932, -26.201913756999957 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-8", "NAME_1": "Misiones" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -57.108990030999934, -27.49062062599991 ], [ -57.148160766999865, -27.488966979999958 ], [ -57.156687377999901, -27.487726745999922 ], [ -57.180096801999952, -27.487313333999907 ], [ -57.180452506999899, -27.487214066999869 ], [ -57.191207234999865, -27.484212747999962 ], [ -57.200405639999872, -27.478941751999926 ], [ -57.227070678999922, -27.458684590999923 ], [ -57.23709590699994, -27.454240417999927 ], [ -57.237587623999843, -27.454120240999927 ], [ -57.283026316999894, -27.443014888999883 ], [ -57.292493041999904, -27.440701192999938 ], [ -57.302983357999949, -27.435533548999942 ], [ -57.310115750241664, -27.429207702073768 ], [ -57.309648809644841, -27.427989596442728 ], [ -57.291355352767312, -27.361533704616761 ], [ -57.202058477816479, -27.133847344679225 ], [ -57.195908982913238, -27.095658460469565 ], [ -57.203557094584255, -27.080000501921631 ], [ -57.232185838305782, -27.072714124557194 ], [ -57.414293585680412, -27.047857760727084 ], [ -57.421734991776418, -27.044292088209318 ], [ -57.536818407443548, -26.923730971207362 ], [ -57.619733241695712, -26.818000990453356 ], [ -57.628647427037095, -26.798363945539677 ], [ -57.634822761261432, -26.780845635917387 ], [ -57.70549028165118, -26.412496026070755 ], [ -57.671487189382276, -26.42820566146213 ], [ -57.654847378004092, -26.449237969456703 ], [ -57.64802608863306, -26.453578790129086 ], [ -57.636528082704842, -26.459366549826427 ], [ -57.630559454954891, -26.466291191984908 ], [ -57.62531429671742, -26.475747978786217 ], [ -57.618208788304912, -26.49352467172622 ], [ -57.614694789932628, -26.500500990728142 ], [ -57.60813188297999, -26.507477308830744 ], [ -57.582758755212353, -26.520758151467533 ], [ -57.575937465841378, -26.527372735263498 ], [ -57.569736294094696, -26.536106051652951 ], [ -57.562191535211184, -26.544167576272628 ], [ -57.54878150136517, -26.550627129538384 ], [ -57.476098599370857, -26.564993177792928 ], [ -57.462740240569644, -26.571349379170499 ], [ -57.455944789620332, -26.579720961253372 ], [ -57.445790370828945, -26.588816012848724 ], [ -57.431656866571132, -26.595482272588811 ], [ -57.404991827610729, -26.601890150809822 ], [ -57.38884294264767, -26.612173760810435 ], [ -57.367113002662961, -26.621010430886656 ], [ -57.340551317389384, -26.623232517166912 ], [ -57.252365484679387, -26.605714206645303 ], [ -57.200844081888874, -26.589436129573699 ], [ -57.187769944827096, -26.581632989171112 ], [ -57.181077846665289, -26.571866144007345 ], [ -57.179579229897513, -26.560342298758087 ], [ -57.179501716431048, -26.545046074516733 ], [ -57.178028937185672, -26.531765231879945 ], [ -57.172396206219958, -26.522618503441208 ], [ -57.163869595405515, -26.51662403726948 ], [ -57.149141811945071, -26.51145639429717 ], [ -57.142036301733924, -26.506185397637978 ], [ -57.138186408376043, -26.502051282540663 ], [ -57.136610277242482, -26.497400405304461 ], [ -57.133302985344471, -26.492491143851225 ], [ -57.128006151162936, -26.486134941574278 ], [ -57.117257453168918, -26.481484062539437 ], [ -57.112322354193282, -26.476006362103931 ], [ -57.108524135880145, -26.468771660683615 ], [ -57.10573360881898, -26.459469902613932 ], [ -57.100100876953888, -26.447377617483085 ], [ -57.090747442940142, -26.434406834108131 ], [ -57.079146084224419, -26.423399753695662 ], [ -57.063488124777109, -26.412289320495745 ], [ -57.057416144239653, -26.409343763803633 ], [ -57.049819709412077, -26.406449883954963 ], [ -57.039303555414733, -26.403969415256313 ], [ -57.029071621358241, -26.402832532795173 ], [ -57.019692348922774, -26.403039239269503 ], [ -57.010907354790561, -26.404537856037223 ], [ -57.0036209783255, -26.406863295104984 ], [ -56.944193081445519, -26.4349235980456 ], [ -56.922979906297655, -26.447997735107379 ], [ -56.889829474750456, -26.472750746150041 ], [ -56.871148444245307, -26.483189385781543 ], [ -56.852415737796036, -26.485308119274293 ], [ -56.840685186971768, -26.482259209794677 ], [ -56.828127813847516, -26.485979912842708 ], [ -56.819342820614679, -26.489803968678189 ], [ -56.783427700428035, -26.540756930687792 ], [ -56.754488898343993, -26.557138359647581 ], [ -56.748597784959827, -26.563649590656098 ], [ -56.73978695330527, -26.575896904518515 ], [ -56.731802944850017, -26.59010792404149 ], [ -56.713380295863942, -26.61703134452091 ], [ -56.696895515016024, -26.630777276050424 ], [ -56.654495002242527, -26.656460463079895 ], [ -56.639663865994635, -26.662558282039072 ], [ -56.625142788109201, -26.665297133156173 ], [ -56.593620165438267, -26.665762221149578 ], [ -56.576592780432463, -26.670361422441715 ], [ -56.567936978408795, -26.678629652636346 ], [ -56.565973272748352, -26.687311293081734 ], [ -56.568143683084486, -26.695941256683625 ], [ -56.572717047753542, -26.706586601890194 ], [ -56.573957282102867, -26.711547540186814 ], [ -56.574215663621999, -26.713872979254575 ], [ -56.572251959760138, -26.722399590968337 ], [ -56.531970181378767, -27.086408380142643 ], [ -56.534114753293238, -27.120979913192457 ], [ -56.543338996097759, -27.13777475420153 ], [ -56.594136929375793, -27.143510837954807 ], [ -56.60137162899747, -27.146042982597578 ], [ -56.610725063910536, -27.151210625569888 ], [ -56.636640794037419, -27.177358900592765 ], [ -56.645167405751181, -27.184335218695367 ], [ -56.654960090235988, -27.189244480148659 ], [ -56.66477861224314, -27.199476414205151 ], [ -56.673873663838492, -27.215134372753084 ], [ -56.687309536106227, -27.25611378312459 ], [ -56.690255092798282, -27.277507825425801 ], [ -56.688472256089767, -27.293992608072415 ], [ -56.682296921865429, -27.302570895730241 ], [ -56.675320603762827, -27.309960625882184 ], [ -56.640206468353824, -27.339726251165587 ], [ -56.635400559688094, -27.345410658075423 ], [ -56.631628180695998, -27.353162122533945 ], [ -56.631912400636793, -27.358536471980585 ], [ -56.635245530956468, -27.364582614995697 ], [ -56.638216926070299, -27.368871758824639 ], [ -56.642299364324174, -27.37677825291405 ], [ -56.64322954031104, -27.382566012611392 ], [ -56.638037854863114, -27.452615009874819 ], [ -56.638015875432302, -27.45291157480932 ], [ -56.683124552999914, -27.464679056999955 ], [ -56.734232543999894, -27.50043914799997 ], [ -56.771155354999934, -27.506743671999885 ], [ -56.771510649999925, -27.506548448999908 ], [ -56.807458048999905, -27.486796569999868 ], [ -56.869263061999902, -27.431502786999943 ], [ -56.904351358999918, -27.418687031999951 ], [ -56.90444715299995, -27.418695948999897 ], [ -56.940989949999874, -27.422097675999893 ], [ -56.977318481999959, -27.435326842999885 ], [ -57.076227173999939, -27.484006042999908 ], [ -57.108990030999934, -27.49062062599991 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-16", "NAME_1": "Alto Paraguay" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -58.158796752999962, -20.165124612999918 ], [ -58.158331664999935, -20.181144307999972 ], [ -58.152337198999902, -20.184658304999928 ], [ -58.144068969999864, -20.18352142399992 ], [ -58.137040974999962, -20.185588479999879 ], [ -58.129909626999932, -20.192513121999951 ], [ -58.120504516999858, -20.203881937999952 ], [ -58.118540812999925, -20.21442392999991 ], [ -58.155282755999906, -20.226412861999876 ], [ -58.162672485999934, -20.243156025999923 ], [ -58.156316284999889, -20.261656187999861 ], [ -58.137040974999962, -20.274368590999899 ], [ -58.130943155999915, -20.272818298999979 ], [ -58.126240600999921, -20.267030537999915 ], [ -58.120039428999945, -20.261346129999964 ], [ -58.109755818999929, -20.260726012999982 ], [ -58.103089559999944, -20.26444671599991 ], [ -58.095079712999876, -20.272198180999908 ], [ -58.090325480999866, -20.2817066449999 ], [ -58.099937296999968, -20.309198506999877 ], [ -58.097715209999876, -20.334623310999874 ], [ -58.090790568999893, -20.359427998999919 ], [ -58.082987427999882, -20.376171161999963 ], [ -58.067122762999958, -20.393534443999968 ], [ -58.045625366999928, -20.409347431999976 ], [ -58.023146118999904, -20.420716246999874 ], [ -58.004180867999963, -20.425160420999973 ], [ -57.989401407999935, -20.433118591999929 ], [ -57.992140258999882, -20.450895283999955 ], [ -58.007901570999962, -20.479834085999926 ], [ -58.010020304999955, -20.500091246999929 ], [ -58.008935099999945, -20.525722756999897 ], [ -58.004749308999919, -20.549803974999932 ], [ -57.993328816999906, -20.573781839999953 ], [ -57.992553670999911, -20.585047301999921 ], [ -57.993638875999892, -20.606751403999908 ], [ -57.990951700999858, -20.620600686999879 ], [ -57.977825887999899, -20.640134378999889 ], [ -57.973123331999915, -20.65119313599989 ], [ -57.973588419999942, -20.661941832999915 ], [ -57.981081502999899, -20.681165465999925 ], [ -57.980616414999957, -20.69274098699988 ], [ -57.974415242999953, -20.704006448999934 ], [ -57.965010131999918, -20.711034443999949 ], [ -57.956380167999953, -20.709897561999938 ], [ -57.947181762999975, -20.675067646999963 ], [ -57.934004272999886, -20.667419534999894 ], [ -57.918087930999974, -20.669796650999942 ], [ -57.90429032399993, -20.678995055999934 ], [ -57.900207885999919, -20.685196227999924 ], [ -57.894471801999941, -20.699975687999938 ], [ -57.8906477459999, -20.706383564999982 ], [ -57.884343221999899, -20.711964619999904 ], [ -57.868943644999916, -20.722196552999975 ], [ -57.860210326999947, -20.730258076999874 ], [ -57.857678182999848, -20.739869892999891 ], [ -57.865274617999916, -20.747414651999932 ], [ -57.877005167999897, -20.752375589999886 ], [ -57.898760945999925, -20.756613056999925 ], [ -57.906667439999865, -20.762194111999946 ], [ -57.917932902999922, -20.774079690999969 ], [ -57.933074096999945, -20.784621683999944 ], [ -57.940412150999919, -20.793613382999894 ], [ -57.93395259599987, -20.799711201999941 ], [ -57.90801102699993, -20.80198496499996 ], [ -57.887650512999898, -20.805912373999931 ], [ -57.870700643999982, -20.816454365999988 ], [ -57.859641885999878, -20.831647236999913 ], [ -57.857109741999892, -20.849733987999926 ], [ -57.867393351999908, -20.860069274999944 ], [ -57.9086828209999, -20.881566670999888 ], [ -57.917932902999922, -20.894382425999964 ], [ -57.914832315999973, -20.905647888999923 ], [ -57.90801102699993, -20.910505472999944 ], [ -57.901138061999859, -20.912365823999949 ], [ -57.898089151999926, -20.914846292999925 ], [ -57.893024861999947, -20.914846292999925 ], [ -57.869925495999979, -20.93272633899997 ], [ -57.847032836999858, -20.955980732999905 ], [ -57.840314900999942, -20.955980732999905 ], [ -57.836025756999874, -20.938514098999946 ], [ -57.817577269999873, -20.953603616999956 ], [ -57.81602697799994, -20.975411070999968 ], [ -57.825380411999873, -20.998562113999881 ], [ -57.852458862999924, -21.037836201999937 ], [ -57.851735391999938, -21.051995543999894 ], [ -57.836025756999874, -21.082484638999873 ], [ -57.829876261999914, -21.127029723999968 ], [ -57.833958699999897, -21.173848571999898 ], [ -57.847859660999887, -21.216223245999913 ], [ -57.870700643999982, -21.247642516999946 ], [ -57.89901932799998, -21.267176207999867 ], [ -57.90429032399993, -21.274927672999951 ], [ -57.904910441999903, -21.28743336999996 ], [ -57.899949503999949, -21.29508148099994 ], [ -57.89364497999992, -21.30035247799988 ], [ -57.8906477459999, -21.305933531999884 ], [ -57.882327840999949, -21.316372171999916 ], [ -57.866308145999909, -21.320919697999955 ], [ -57.85555944799998, -21.33073821999993 ], [ -57.863310913999982, -21.356886494999927 ], [ -57.929921834999874, -21.453108011999873 ], [ -57.945269734999954, -21.487214456999936 ], [ -57.949145467999898, -21.50829844099988 ], [ -57.948111938999915, -21.53051930799991 ], [ -57.939792032999947, -21.548192646999908 ], [ -57.921601928999934, -21.555427346999878 ], [ -57.912093464999941, -21.564005635999905 ], [ -57.9193281659999, -21.583952737999923 ], [ -57.932143920999891, -21.606690368999907 ], [ -57.939016886999951, -21.623743590999936 ], [ -57.934831095999925, -21.640693460999941 ], [ -57.924340779999881, -21.658676858999925 ], [ -57.911783406999859, -21.673042907999928 ], [ -57.901138061999859, -21.678934020999932 ], [ -57.895608682999864, -21.688442484999911 ], [ -57.939016886999951, -21.755311787999887 ], [ -57.93844844599991, -21.774638772999936 ], [ -57.934779419999899, -21.792932229999906 ], [ -57.935709594999963, -21.812052509999901 ], [ -57.948938760999852, -21.833859964999931 ], [ -57.955915079999954, -21.851119893999922 ], [ -57.946664998999921, -21.865485941999921 ], [ -57.932764037999874, -21.881919046999982 ], [ -57.925374308999949, -21.904966735999949 ], [ -57.929921834999874, -21.917369079999915 ], [ -57.95322790499992, -21.958193460999908 ], [ -57.96263301599987, -21.966978454999904 ], [ -57.964855102999877, -21.976693623999935 ], [ -57.986817585999944, -22.035294697999959 ], [ -57.98836787999997, -22.04904062899989 ], [ -57.988006144999957, -22.064130146999986 ], [ -57.986249145999892, -22.074465433999904 ], [ -57.973133663999874, -22.081048493999958 ], [ -57.973251716193715, -22.081184177108071 ], [ -57.981209886227248, -22.090330905546864 ], [ -57.974156052859541, -22.132188815961115 ], [ -57.966921353237865, -22.148363538446517 ], [ -57.977256639182542, -22.210633640130368 ], [ -57.973768480131241, -22.234353123297979 ], [ -57.965732794832604, -22.256832371216944 ], [ -57.956146816822127, -22.269131361922803 ], [ -57.940747239793268, -22.27429900489517 ], [ -57.915399950447352, -22.275332532770165 ], [ -57.896718919042883, -22.279259942292526 ], [ -57.88739132255148, -22.289801934711534 ], [ -57.877546963021928, -22.323133232512646 ], [ -57.831193203203782, -22.37718678174457 ], [ -57.826671516277429, -22.388607273307002 ], [ -57.845275030618154, -22.404471937429946 ], [ -57.851631231995725, -22.411861667581888 ], [ -57.848969896143785, -22.423023776725927 ], [ -58.194090949237932, -22.280913587791872 ], [ -58.20830196786153, -22.272231948245803 ], [ -58.216363490682568, -22.262103366976817 ], [ -58.223494839315379, -22.214509372809289 ], [ -58.237654181994913, -22.204639173958697 ], [ -58.263234016236879, -22.198024591062051 ], [ -58.732972785265815, -22.168103936147759 ], [ -58.785062628837238, -22.17352996153852 ], [ -58.998434618262991, -22.156838474216215 ], [ -59.15261125300691, -22.162212822763536 ], [ -59.168811814813409, -22.161024265257652 ], [ -59.192402105872475, -22.155288180605055 ], [ -59.230151739611074, -22.14092213324983 ], [ -59.342289597686772, -22.083044529081747 ], [ -59.391563075775309, -22.055139254872699 ], [ -59.420424364392886, -22.046509291270752 ], [ -59.781590948763267, -22.033538506996479 ], [ -59.836678025870185, -22.041548353873452 ], [ -59.929178839931524, -22.043822116997092 ], [ -59.938170538739371, -22.040463149155016 ], [ -59.940961065800536, -22.030231215098524 ], [ -59.941994594574851, -21.999742120302585 ], [ -59.95816931795963, -21.907706394234708 ], [ -59.95816931795963, -21.89809457780251 ], [ -59.955973070101095, -21.885123792628917 ], [ -59.941891241787346, -21.845332939763352 ], [ -59.851767543637209, -21.469645277507539 ], [ -59.847349208599098, -21.459671725869441 ], [ -59.841303067382626, -21.450731703005715 ], [ -59.826678635810367, -21.435848890813645 ], [ -59.811459926834175, -21.424583428882158 ], [ -59.710432501958394, -21.367377618282489 ], [ -59.705109829355138, -21.363140151296932 ], [ -59.701905891143952, -21.359729505712096 ], [ -59.699477098389366, -21.355440361883211 ], [ -59.697771776046636, -21.350272718910844 ], [ -59.696221483334796, -21.343451429539869 ], [ -59.69549801292294, -21.334873141881985 ], [ -59.695756395341391, -21.325364679136612 ], [ -59.736890835343786, -21.068687838472954 ], [ -59.746450974932543, -21.047190444283558 ], [ -59.752083705898315, -21.037888686213876 ], [ -59.805801358346002, -20.967970472859065 ], [ -59.826316900604468, -20.93391570374672 ], [ -59.829029914199168, -20.926474297650714 ], [ -59.829727546189304, -20.918309421142851 ], [ -59.826006843141272, -20.891954440545021 ], [ -59.825619268614332, -20.883737888093037 ], [ -59.826161871872898, -20.874436130023412 ], [ -59.832414719563644, -20.850975030173515 ], [ -59.837995774585295, -20.837797539424912 ], [ -59.849803839775404, -20.817850437048037 ], [ -59.870551926929863, -20.79227060280607 ], [ -59.874350145243, -20.786379489421904 ], [ -59.875667893958109, -20.780385024149552 ], [ -59.875848762010776, -20.776044202577907 ], [ -59.85546240916284, -20.698167820088827 ], [ -59.881765712917286, -20.679357599273771 ], [ -59.951037971125459, -20.651607353796351 ], [ -61.818701747787429, -20.131897474688685 ], [ -61.911486781789563, -20.076138604013352 ], [ -61.924739799402232, -20.065127638529702 ], [ -61.918412231999895, -20.052573343999939 ], [ -61.905544799999888, -20.026735127999913 ], [ -61.892574015999855, -20.000896910999899 ], [ -61.864410359999908, -19.927413024999936 ], [ -61.836298380999978, -19.853825784999941 ], [ -61.808186400999944, -19.780341897999875 ], [ -61.780074421999899, -19.706961363999937 ], [ -61.761212524999877, -19.657765400999963 ], [ -61.753202677999894, -19.645879821999941 ], [ -61.737234659999871, -19.639575296999922 ], [ -61.648222005999884, -19.626759541999945 ], [ -61.62672460999994, -19.623658954999897 ], [ -61.579544026999912, -19.616837666999942 ], [ -61.532285929999972, -19.610016377999983 ], [ -61.510840210999845, -19.606915790999949 ], [ -61.172359578999874, -19.537462666999971 ], [ -60.833930623999919, -19.467906188999891 ], [ -60.495475829999862, -19.398453063999909 ], [ -60.156995198999908, -19.328999938999942 ], [ -60.006384236999878, -19.298097431999935 ], [ -59.924322062999892, -19.29706390399987 ], [ -59.735858113999967, -19.294790140999936 ], [ -59.547497517999886, -19.292413024999902 ], [ -59.359085245999893, -19.290139261999883 ], [ -59.170724649999926, -19.287762145999935 ], [ -59.089540974999863, -19.286728616999952 ], [ -59.069645548999858, -19.291482848999948 ], [ -59.039673217999905, -19.311636657999927 ], [ -59.011096150999947, -19.330963643999965 ], [ -58.960659952999947, -19.3605225619999 ], [ -58.867435668999917, -19.415299580999985 ], [ -58.774108032999948, -19.470076598999881 ], [ -58.680832071999902, -19.52475026399992 ], [ -58.587504434999857, -19.579423929999891 ], [ -58.494280151999931, -19.634200947999958 ], [ -58.401004190999885, -19.688874612999925 ], [ -58.307779907999958, -19.74365163199991 ], [ -58.214452270999885, -19.798325296999863 ], [ -58.175281534999954, -19.821372984999925 ], [ -58.164429483999896, -19.83294850699987 ], [ -58.161173868999924, -19.84721120199994 ], [ -58.164222778999942, -19.880284117999921 ], [ -58.162207397999907, -19.912323506999925 ], [ -58.145154175999949, -19.969580992999894 ], [ -58.141846883999875, -20.000896910999899 ], [ -58.144482381999893, -20.023117777999929 ], [ -58.143138793999924, -20.065285746999891 ], [ -58.144740762999845, -20.086163024999877 ], [ -58.159520223999948, -20.139079691999939 ], [ -58.158796752999962, -20.165124612999918 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-1", "NAME_1": "Concepción" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -57.973133663999874, -22.081048493999958 ], [ -57.972864949999945, -22.08118336999992 ], [ -57.961392781999933, -22.09007171599994 ], [ -57.952452758999897, -22.105988056999962 ], [ -57.939998738999918, -22.118390400999928 ], [ -57.906254028999854, -22.128932392999985 ], [ -57.895505330999924, -22.128932392999985 ], [ -57.878193725999921, -22.122111103999941 ], [ -57.871372436999877, -22.121180928999891 ], [ -57.862845825999955, -22.125831806999955 ], [ -57.848686482999909, -22.140301207999897 ], [ -57.843880574999901, -22.143711852999914 ], [ -57.831788289999906, -22.141128030999909 ], [ -57.815768594999952, -22.128312276999935 ], [ -57.805484984999879, -22.128622334999918 ], [ -57.795304727999905, -22.130999450999951 ], [ -57.787501587999884, -22.129655863999901 ], [ -57.7754093019999, -22.12397145599995 ], [ -57.777786417999948, -22.122317809999899 ], [ -57.777424682999936, -22.117046813999963 ], [ -57.775616007999957, -22.111155699999969 ], [ -57.77365230299992, -22.107745055999942 ], [ -57.769931599999921, -22.107434996999956 ], [ -57.760268106999888, -22.110742288999958 ], [ -57.756185669999894, -22.11063893599993 ], [ -57.736341918999898, -22.103714293999943 ], [ -57.723267781999937, -22.104747822999926 ], [ -57.70993526299992, -22.108468525999939 ], [ -57.689626423999897, -22.109295348999964 ], [ -57.678515991999888, -22.106401468999977 ], [ -57.670816202999873, -22.102370706999892 ], [ -57.663684855999946, -22.100613709 ], [ -57.654486449999951, -22.104541116999968 ], [ -57.638931844999917, -22.144538675999939 ], [ -57.627201294999935, -22.165105895999929 ], [ -57.614075480999958, -22.176991474999866 ], [ -57.596712198999853, -22.181022236999951 ], [ -57.572734333999932, -22.177714944999948 ], [ -57.564001017999942, -22.17440765399995 ], [ -57.559970255999957, -22.171617125999902 ], [ -57.554699259999921, -22.170273538999936 ], [ -57.54229691599997, -22.171513772999958 ], [ -57.534597127999888, -22.17440765399995 ], [ -57.511187703999923, -22.188773701999949 ], [ -57.472482055999905, -22.180298766999954 ], [ -57.463955444999982, -22.180402119999982 ], [ -57.443181518999921, -22.187946878999938 ], [ -57.432277791999866, -22.188670348999935 ], [ -57.417860066999935, -22.193837991999928 ], [ -57.384993855999909, -22.213268330999909 ], [ -57.378637654999892, -22.213371683999938 ], [ -57.375020303999918, -22.207273864999891 ], [ -57.366648721999923, -22.2091342169999 ], [ -57.351249145999958, -22.217195738999891 ], [ -57.339932006999874, -22.216989033999923 ], [ -57.334816039999879, -22.211718037999987 ], [ -57.333059041999917, -22.205413512999968 ], [ -57.331767130999964, -22.202416279999866 ], [ -57.316315877999955, -22.203656513999903 ], [ -57.271667439999931, -22.213785094999949 ], [ -57.252443807999896, -22.210581156999893 ], [ -57.227484090999923, -22.191254170999926 ], [ -57.213789835999904, -22.188153584999981 ], [ -57.209449015999922, -22.192080992999948 ], [ -57.206400105999904, -22.207480569999944 ], [ -57.199527140999919, -22.212854919999899 ], [ -57.189967, -22.213578388999906 ], [ -57.183610799999911, -22.210891214999961 ], [ -57.177926391999875, -22.207377216999916 ], [ -57.17038163299992, -22.205723571999954 ], [ -57.154155232999898, -22.207997334999973 ], [ -57.124182901999859, -22.218539326999945 ], [ -57.115036173999954, -22.222880146999927 ], [ -57.114622761999954, -22.225050557999921 ], [ -57.113279174999889, -22.229391376999985 ], [ -57.10847326699988, -22.233525492999917 ], [ -57.090748250999866, -22.236419371999901 ], [ -57.085063842999915, -22.238073018999955 ], [ -57.079224405999952, -22.238589782999981 ], [ -57.07162796999998, -22.235695902999908 ], [ -57.059484008999874, -22.232698668999902 ], [ -57.027651326999916, -22.235075784999935 ], [ -57.011166544999952, -22.233835550999899 ], [ -56.986465210999938, -22.241380309999954 ], [ -56.975716512999924, -22.24169036899994 ], [ -56.96455440299988, -22.234869079999982 ], [ -56.965484578999934, -22.250888772999929 ], [ -56.96052364099998, -22.254816182 ], [ -56.952100382999902, -22.253575947999963 ], [ -56.942591918999909, -22.253989359999977 ], [ -56.92494441799991, -22.262360941999944 ], [ -56.914789998999964, -22.262877705999898 ], [ -56.903679565999937, -22.236936136999944 ], [ -56.892000691999954, -22.252232360999898 ], [ -56.881717081999881, -22.277243753999898 ], [ -56.87954667199989, -22.289956156999949 ], [ -56.85605973299991, -22.293160094999919 ], [ -56.842856404999907, -22.289025981 ], [ -56.834096441597467, -22.298276868682535 ], [ -56.622610642567111, -22.347162774042772 ], [ -56.582018805823225, -22.361993910290721 ], [ -56.58594621444621, -22.365146172557843 ], [ -56.609381475874386, -22.376721693751165 ], [ -56.614910854951972, -22.380442396799197 ], [ -56.657698941353033, -22.437028089774515 ], [ -56.664933640974766, -22.442919203158681 ], [ -56.697076382169314, -22.463073012009886 ], [ -56.702424893194234, -22.468188979038132 ], [ -56.706481493026502, -22.47377003316052 ], [ -56.709323696931051, -22.479609469701245 ], [ -56.710047167342907, -22.486585788703167 ], [ -56.70544796425213, -22.508238213422828 ], [ -56.706481493026502, -22.515886325993165 ], [ -56.709892136812641, -22.521415704171432 ], [ -56.71973649814089, -22.527875257437188 ], [ -56.722191128417819, -22.53314625409638 ], [ -56.721906907577704, -22.540329277773935 ], [ -56.716739264605394, -22.560534762569262 ], [ -56.716170823824427, -22.566322524065242 ], [ -56.717126838233014, -22.585184420824362 ], [ -56.714723883900092, -22.603994642538737 ], [ -56.715188971893554, -22.615363458157049 ], [ -56.716868455814563, -22.624613538484027 ], [ -56.71973649814089, -22.632675063103704 ], [ -56.721596849215189, -22.643785496303622 ], [ -56.719555630088223, -22.653087253473984 ], [ -56.714878912631718, -22.660373629939102 ], [ -56.705499641095571, -22.671690768714029 ], [ -56.70353593633439, -22.679132174810036 ], [ -56.70389767064097, -22.686160169756022 ], [ -56.707049932908092, -22.701249687523045 ], [ -56.704776169784395, -22.708174329681583 ], [ -56.700021938861369, -22.712670179984798 ], [ -56.694440883839718, -22.715874119095304 ], [ -56.689195725602247, -22.7196464980874 ], [ -56.68273617233649, -22.726622817089321 ], [ -56.674235399044449, -22.739438571732705 ], [ -56.666225552167475, -22.759282322221395 ], [ -56.658474086809633, -22.79964161496855 ], [ -56.652221239118887, -22.81757333664018 ], [ -56.653306443837323, -22.828063653115123 ], [ -56.657931485349764, -22.834781588799274 ], [ -56.68004899806283, -22.848114109178823 ], [ -56.686689419381196, -22.855193780068873 ], [ -56.692192959137742, -22.86304859821422 ], [ -56.694647590314048, -22.875192560188509 ], [ -56.693820767114687, -22.878551528030584 ], [ -56.690022548801551, -22.879688408693085 ], [ -56.683976405786495, -22.879326673487185 ], [ -56.670463019152976, -22.879533379961515 ], [ -56.651911179857052, -22.877828057618785 ], [ -56.646562668832075, -22.876122735275999 ], [ -56.6420668203275, -22.873487236946403 ], [ -56.634289517447257, -22.866510918843858 ], [ -56.629767828722322, -22.864288831664226 ], [ -56.623437465766415, -22.865425714125422 ], [ -56.616926235657218, -22.869456475535912 ], [ -56.608089565580997, -22.878138115981244 ], [ -56.601655849837584, -22.882995700591096 ], [ -56.595428839669182, -22.886716403639127 ], [ -56.589305183187662, -22.888266697250288 ], [ -56.582768113757425, -22.889041842706888 ], [ -56.576902838794979, -22.888266697250288 ], [ -56.571554327770002, -22.887026462001643 ], [ -56.552227342118158, -22.87886158549378 ], [ -56.540806850555725, -22.876432793638514 ], [ -56.536052618733379, -22.87405567772737 ], [ -56.532357754107068, -22.870386650623459 ], [ -56.52447709843932, -22.855452161588005 ], [ -56.513986781964434, -22.842946466206456 ], [ -56.511092902115706, -22.838140557540726 ], [ -56.509180874197966, -22.832301120999944 ], [ -56.505951096665797, -22.812922458504659 ], [ -56.504349128009835, -22.807031345120492 ], [ -56.50078345369343, -22.798194675044215 ], [ -56.499775764240098, -22.796282647126475 ], [ -56.498535528991454, -22.794577324783688 ], [ -56.492411871610557, -22.788634534556138 ], [ -56.48380774643033, -22.782743422071292 ], [ -56.47882096971199, -22.780417983003531 ], [ -56.473834194792232, -22.778557631029855 ], [ -56.420865851178064, -22.769772637797018 ], [ -56.415388149843238, -22.768274021029242 ], [ -56.405595466257751, -22.763778170726027 ], [ -56.40135799837293, -22.760832614933236 ], [ -56.397637295324898, -22.757111911885204 ], [ -56.390996874006532, -22.748843682589893 ], [ -56.379292161603985, -22.730291843293912 ], [ -56.376036545650038, -22.726106052252533 ], [ -56.372264166657942, -22.722385349204501 ], [ -56.367742478832326, -22.719594822143335 ], [ -56.362368130284949, -22.717579440538771 ], [ -56.350818446614028, -22.715098971840064 ], [ -56.345779994850886, -22.713135267978259 ], [ -56.341154955137085, -22.710551445592728 ], [ -56.315859340835914, -22.692361341502703 ], [ -56.311156785856952, -22.690087579278384 ], [ -56.305859950776096, -22.689002373660628 ], [ -56.300614794337264, -22.689105726448133 ], [ -56.294568651322209, -22.690552667271788 ], [ -56.279866706283485, -22.69597869176323 ], [ -56.275086636039418, -22.701404718053311 ], [ -56.271572638566397, -22.707089124963147 ], [ -56.128144700917233, -23.052494398897409 ], [ -56.127369553661993, -23.05869557064409 ], [ -56.129229905635611, -23.069806003844008 ], [ -56.130392625619152, -23.105566095299082 ], [ -56.131477831236907, -23.111302179052302 ], [ -56.133725755039563, -23.11610808681877 ], [ -56.137368943721754, -23.119622084291734 ], [ -56.14214901396582, -23.12168914184042 ], [ -56.148014288928266, -23.12184417057199 ], [ -56.153362799953243, -23.120397230647654 ], [ -56.16310380669529, -23.11610808681877 ], [ -56.168013068148582, -23.115642998825365 ], [ -56.171992153615008, -23.117813409161499 ], [ -56.174627651944547, -23.122102552990441 ], [ -56.175712856662983, -23.127683608012092 ], [ -56.175583666353134, -23.133884779758773 ], [ -56.173697475957738, -23.144530124965286 ], [ -56.174731003832733, -23.148870944738292 ], [ -56.178606737410973, -23.151558119012009 ], [ -56.18354183638661, -23.153676852504759 ], [ -56.187727627428046, -23.15677743882776 ], [ -56.190699021642502, -23.160859877081691 ], [ -56.192740240769467, -23.166027520054001 ], [ -56.194238858436563, -23.171453545444763 ], [ -56.195014003893164, -23.17832651075986 ], [ -56.194781459896433, -23.186698092842732 ], [ -56.190905728116832, -23.200857435522209 ], [ -56.190543992910932, -23.208918959242567 ], [ -56.192585212037898, -23.214396660577449 ], [ -56.19669348781423, -23.217342218168824 ], [ -56.235218267908749, -23.236617526977284 ], [ -56.243977423619185, -23.242353610730561 ], [ -56.247982346608012, -23.245505872997626 ], [ -56.251651373711923, -23.248968193627263 ], [ -56.254364387306623, -23.253464043930478 ], [ -56.25875688302375, -23.262972506675851 ], [ -56.262322557340156, -23.266693210623203 ], [ -56.271443447357228, -23.271809176752129 ], [ -56.275551724032823, -23.274961439918513 ], [ -56.279117398349229, -23.278527114234919 ], [ -56.28221798377291, -23.28260955158953 ], [ -56.284388394109101, -23.287518813042766 ], [ -56.285835334033436, -23.292996515276968 ], [ -56.289090949088006, -23.317542819845244 ], [ -56.291571417786713, -23.327309665908331 ], [ -56.292579108139307, -23.329945164237927 ], [ -56.294568651322209, -23.333459160811628 ], [ -56.296273972765619, -23.335939629510278 ], [ -56.301028204587965, -23.33966033255831 ], [ -56.333584356932533, -23.352114352895057 ], [ -56.346090054112722, -23.366170342787086 ], [ -56.354151576933702, -23.378831068698844 ], [ -56.367690802888262, -23.388391209186977 ], [ -56.38112667515594, -23.400225111899374 ], [ -56.404897834267615, -23.411387221043412 ], [ -56.412339240363622, -23.412265720186838 ], [ -56.41851457368864, -23.411800632193433 ], [ -56.424870775066211, -23.410767103419118 ], [ -56.433707445142488, -23.410405369112482 ], [ -56.473705002683744, -23.4204305966947 ], [ -56.518172573005813, -23.44120452227088 ], [ -56.52522640637352, -23.443633315025465 ], [ -56.534760708439933, -23.443633315025465 ], [ -56.549204271060262, -23.445028578106417 ], [ -56.5811661442022, -23.451746514689887 ], [ -56.596152310081038, -23.453245130558344 ], [ -56.605350715363215, -23.452314954571477 ], [ -56.612068651047423, -23.445183607737306 ], [ -56.620336880342734, -23.443013198300491 ], [ -56.632558355783488, -23.442031344570921 ], [ -56.658603278018859, -23.444718519743901 ], [ -56.671858283133247, -23.444770195687965 ], [ -56.68157345235295, -23.443840019701156 ], [ -56.705602992983756, -23.431747734570308 ], [ -56.715705735831023, -23.430249118701852 ], [ -56.730045945663846, -23.429629001976878 ], [ -56.788181932250382, -23.432574557769613 ], [ -56.838514776635634, -23.42172250698809 ], [ -56.862699347796649, -23.419035332714429 ], [ -56.871458502607823, -23.41981047907035 ], [ -56.877995572038003, -23.422032566249925 ], [ -56.886728889326776, -23.429473971446612 ], [ -56.893033412961643, -23.433814793018314 ], [ -56.89954464397016, -23.435675144092613 ], [ -56.908045417262201, -23.436295260817644 ], [ -56.933392706608117, -23.434744968105804 ], [ -56.943934699027125, -23.436140232086018 ], [ -56.957654792134917, -23.439344171196524 ], [ -56.977085129675004, -23.447509046805067 ], [ -56.984552375092051, -23.448955986729402 ], [ -56.991011929257127, -23.448645929266206 ], [ -56.998815069659713, -23.446113782824796 ], [ -57.006644050282659, -23.444460138224827 ], [ -57.016798469074104, -23.443374932607071 ], [ -57.024110683960885, -23.444150078962991 ], [ -57.030079311710836, -23.446165459668237 ], [ -57.034626837958172, -23.448904310785338 ], [ -57.038605923424598, -23.452159925839908 ], [ -57.045892299889715, -23.456087334462893 ], [ -57.089972296584222, -23.469109795580607 ], [ -57.161518317016714, -23.47939340558122 ], [ -57.208156296775655, -23.47897999353188 ], [ -57.218569098884814, -23.48016855193714 ], [ -57.226139696190046, -23.482493991904221 ], [ -57.24316708029653, -23.491072279562047 ], [ -57.263269212304294, -23.498151950452154 ], [ -57.274017910298312, -23.500270684844224 ], [ -57.281588507603544, -23.50078744878175 ], [ -57.28401730035813, -23.500322360788346 ], [ -57.35047319218404, -23.504766534248176 ], [ -57.357113614401783, -23.504146416623826 ], [ -57.368146532336596, -23.50171762476856 ], [ -57.372849087315501, -23.500115655213335 ], [ -57.398454759079868, -23.486989841308116 ], [ -57.40369991731734, -23.484871107815366 ], [ -57.408454149139686, -23.482390639116716 ], [ -57.420494758326413, -23.477739760081874 ], [ -57.446177945355885, -23.474484145027247 ], [ -57.442173020568418, -23.46471729896416 ], [ -57.442457241408533, -23.45743092159978 ], [ -57.446177945355885, -23.447198988442551 ], [ -57.452740851409146, -23.417330011271019 ], [ -57.453619350552572, -23.409320163494726 ], [ -57.456719936875572, -23.403894138103965 ], [ -57.470388353139981, -23.393868909622483 ], [ -57.477183804089293, -23.382706800478445 ], [ -57.494779628976687, -23.367720635498927 ], [ -57.500799932670759, -23.35779876070427 ], [ -57.503667974997029, -23.343536065237231 ], [ -57.501445888716773, -23.336714775866199 ], [ -57.495528936910887, -23.330255221701123 ], [ -57.48713151730567, -23.316819349433445 ], [ -57.482093064643209, -23.306380710701262 ], [ -57.480181036725469, -23.30054127416048 ], [ -57.480310227934638, -23.278992200429684 ], [ -57.484030930982669, -23.273049412000773 ], [ -57.500567389573348, -23.257856540546925 ], [ -57.511161057936476, -23.250208428875908 ], [ -57.535552333773182, -23.220649509167515 ], [ -57.544363166327059, -23.213156427127387 ], [ -57.550926073279641, -23.208815605555742 ], [ -57.58849483896563, -23.192072442289373 ], [ -57.608596970973451, -23.179980157158525 ], [ -57.624616664727284, -23.165304049642202 ], [ -57.631127895735801, -23.148922620682413 ], [ -57.630636970219996, -23.127993665475287 ], [ -57.632058071722611, -23.111147148522093 ], [ -57.639861213024574, -23.098796481872171 ], [ -57.658464728264562, -23.090889987782703 ], [ -57.698178066764342, -23.090683282207692 ], [ -57.714068570208326, -23.085153904029426 ], [ -57.720528124373459, -23.066395359158491 ], [ -57.729881558387206, -23.054819837965169 ], [ -57.774374966231676, -23.034821058744853 ], [ -57.789412808054635, -23.021385185577856 ], [ -57.767682868069926, -22.981646009555675 ], [ -57.772928026307341, -22.960717055247926 ], [ -57.786002163369119, -22.944749036538781 ], [ -57.819514330122217, -22.915861912197499 ], [ -57.821038784412337, -22.905940036503466 ], [ -57.81127193924857, -22.896948336796299 ], [ -57.798068610078303, -22.887956637988452 ], [ -57.789412808054635, -22.877983087249675 ], [ -57.788379279280321, -22.866045830850396 ], [ -57.792358363847427, -22.856847425568219 ], [ -57.802435269172349, -22.843876642193266 ], [ -57.808920660859826, -22.826410006716458 ], [ -57.811943731917665, -22.821294040587532 ], [ -57.819514330122217, -22.813129164079669 ], [ -57.828867764136021, -22.809253432300068 ], [ -57.851760423204951, -22.810441989806009 ], [ -57.860803798856239, -22.806307874708637 ], [ -57.867030809024584, -22.795300795195544 ], [ -57.872043423265382, -22.771788017602944 ], [ -57.877546963021928, -22.761917819651671 ], [ -57.885970221948185, -22.756956882254315 ], [ -57.908862881017114, -22.751220797601718 ], [ -57.918526374292753, -22.747035006560282 ], [ -57.940204637434078, -22.716339207088765 ], [ -57.92922339544333, -22.686470229017857 ], [ -57.895814582377056, -22.664869480242317 ], [ -57.850235968914831, -22.658926690014709 ], [ -57.806905280154524, -22.665747978486422 ], [ -57.78471025307573, -22.665282892291657 ], [ -57.775150112587596, -22.655464368485809 ], [ -57.779671800413269, -22.634018650240534 ], [ -57.79065304240396, -22.617378838862351 ], [ -57.816103685436701, -22.589990329490092 ], [ -57.830573085579431, -22.559191175432431 ], [ -57.843414680443118, -22.446019788582362 ], [ -57.848969896143785, -22.423023776725927 ], [ -57.851631231995725, -22.411861667581888 ], [ -57.845275030618154, -22.404471937429946 ], [ -57.826671516277429, -22.388607273307002 ], [ -57.831193203203782, -22.37718678174457 ], [ -57.877546963021928, -22.323133232512646 ], [ -57.88739132255148, -22.289801934711534 ], [ -57.896718919042883, -22.279259942292526 ], [ -57.915399950447352, -22.275332532770165 ], [ -57.940747239793268, -22.27429900489517 ], [ -57.956146816822127, -22.269131361922803 ], [ -57.965732794832604, -22.256832371216944 ], [ -57.973768480131241, -22.234353123297979 ], [ -57.977256639182542, -22.210633640130368 ], [ -57.966921353237865, -22.148363538446517 ], [ -57.974156052859541, -22.132188815961115 ], [ -57.981209886227248, -22.090330905546864 ], [ -57.973251716193715, -22.081184177108071 ], [ -57.973133663999874, -22.081048493999958 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-13", "NAME_1": "Amambay" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -56.421796834999924, -22.074465433999904 ], [ -56.407637491999964, -22.075809020999955 ], [ -56.397302205999949, -22.086247660999987 ], [ -56.370843872999956, -22.147329202999899 ], [ -56.347331095999976, -22.180402119999982 ], [ -56.316841999999895, -22.207687275999902 ], [ -56.26108313099985, -22.238589782999981 ], [ -56.231524210999908, -22.265358173999871 ], [ -56.21426428299992, -22.275383401999889 ], [ -56.196797647999887, -22.279310811999949 ], [ -56.024715128999929, -22.28737233399994 ], [ -56.011356770999896, -22.283858337999987 ], [ -55.998566853999932, -22.277243753999898 ], [ -55.985234334999916, -22.28323821999993 ], [ -55.970868286999888, -22.293883564999916 ], [ -55.955262003999877, -22.301324970999943 ], [ -55.892940225999922, -22.306802673999925 ], [ -55.874388386999982, -22.317344664999979 ], [ -55.872011270999934, -22.310213316999949 ], [ -55.861030029999938, -22.289542744999935 ], [ -55.810774698999893, -22.353104756999912 ], [ -55.770157023999872, -22.38142344099991 ], [ -55.760235147999964, -22.391965433999957 ], [ -55.751579345999914, -22.41625335699996 ], [ -55.748297892999915, -22.500899352999866 ], [ -55.741269897999928, -22.537176208999924 ], [ -55.723932453999907, -22.569629006999932 ], [ -55.697913371999931, -22.59557057699989 ], [ -55.66468542599992, -22.612727151999948 ], [ -55.644350748999983, -22.61954844199991 ], [ -55.631199096999921, -22.62678314199988 ], [ -55.623680175999965, -22.638668721999906 ], [ -55.620476237999895, -22.659339293999921 ], [ -55.621509765999889, -22.667090758999919 ], [ -55.627013305999867, -22.683627217999913 ], [ -55.62778845299988, -22.692102151999919 ], [ -55.625669718999916, -22.700783792999886 ], [ -55.619184325999953, -22.71690683999995 ], [ -55.618331665999904, -22.725691833999946 ], [ -55.628589436999903, -22.758971455999884 ], [ -55.645926879999905, -22.78791025799994 ], [ -55.659001017999856, -22.818296 ], [ -55.656572224999906, -22.85570973699997 ], [ -55.634299682999938, -22.932810973999921 ], [ -55.634351359999954, -22.950070901999908 ], [ -55.639984089999899, -22.98376393599996 ], [ -55.637813679999908, -23.000713805999879 ], [ -55.611458699999844, -23.029135843999896 ], [ -55.600684163999915, -23.044535419999974 ], [ -55.595232299999935, -23.064069111999885 ], [ -55.600141561999862, -23.100552672999896 ], [ -55.599392252999877, -23.11708913199989 ], [ -55.588669392999947, -23.130111591999921 ], [ -55.560867472999888, -23.145924579999928 ], [ -55.557146769999889, -23.154709574999913 ], [ -55.535235962999934, -23.229123635999926 ], [ -55.535649373999945, -23.245866800999877 ], [ -55.559007120999894, -23.291342060999938 ], [ -55.562159383999955, -23.307878519999932 ], [ -55.555596476999966, -23.330306090999926 ], [ -55.524874836999913, -23.360485126999919 ], [ -55.513867757999918, -23.379398701999961 ], [ -55.515547241999883, -23.410197855999925 ], [ -55.542470662999904, -23.465801696999932 ], [ -55.539912678999912, -23.500528259999967 ], [ -55.533795620999854, -23.530444136999861 ], [ -55.534330817413263, -23.530811455584228 ], [ -55.543968472267181, -23.537426038480874 ], [ -55.553838670218454, -23.552153822840637 ], [ -55.571692878423619, -23.596905613103559 ], [ -55.579909430875546, -23.635559583507984 ], [ -55.586653204981417, -23.645894871251301 ], [ -55.597841153446495, -23.655661715515748 ], [ -55.638898078183729, -23.677779229128134 ], [ -55.647450528319212, -23.680879814551815 ], [ -55.656571418336284, -23.683050225787269 ], [ -55.684580044433517, -23.683515312881411 ], [ -55.699204474207136, -23.689303073478072 ], [ -55.720624355829329, -23.701136977089845 ], [ -55.824158087825481, -23.771158543232161 ], [ -55.866842821439036, -23.793224379101844 ], [ -55.87697140180876, -23.802267754753075 ], [ -55.890975714857348, -23.825160413822061 ], [ -55.897099372238245, -23.831464939255568 ], [ -55.906581996561897, -23.837356051740414 ], [ -55.932265183591369, -23.846916192228491 ], [ -55.957173224264864, -23.852393893563317 ], [ -55.992907477298218, -23.855339451154748 ], [ -56.000813972287006, -23.858078302271849 ], [ -56.009082200682997, -23.86210906278302 ], [ -56.014404873286253, -23.864072767544201 ], [ -56.019908413042799, -23.865054619475131 ], [ -56.026316291263811, -23.864279474018531 ], [ -56.032439947745388, -23.862419122044855 ], [ -56.047141892784111, -23.856062920667284 ], [ -56.05907914918339, -23.848518161783716 ], [ -56.051327683825548, -23.847226250591007 ], [ -56.042025925755866, -23.843505547542975 ], [ -56.008307054327076, -23.820612887574725 ], [ -56.006110805569222, -23.818442478137854 ], [ -56.004198777651482, -23.815031833452338 ], [ -55.998876105048225, -23.798236992443265 ], [ -55.981461148213384, -23.768212985640787 ], [ -55.977172004384499, -23.758291110846073 ], [ -55.975673386717403, -23.752813408611928 ], [ -55.975001594048308, -23.74666391370863 ], [ -55.974639858842409, -23.720980726679215 ], [ -55.977533738691079, -23.696641126786574 ], [ -55.98236548487921, -23.681189873813651 ], [ -55.982830572872615, -23.676280613259678 ], [ -55.980892707432474, -23.672043144475538 ], [ -55.958620165088519, -23.644654636002656 ], [ -55.947948980561023, -23.633905938008638 ], [ -55.94190283934455, -23.625792739243536 ], [ -55.935107388395238, -23.611271660458783 ], [ -55.933763801258408, -23.605742283179836 ], [ -55.933092006790673, -23.59985116979567 ], [ -55.9367093570512, -23.56300587272284 ], [ -55.935830857907774, -23.550138442135392 ], [ -55.933479580418293, -23.538717949673639 ], [ -55.933634610049182, -23.533912041907229 ], [ -55.936244269057738, -23.530191338859197 ], [ -55.946243659117556, -23.528796074878983 ], [ -55.960041265691871, -23.529209486928266 ], [ -56.021148648291501, -23.540423272016369 ], [ -56.030036994311843, -23.543833916701885 ], [ -56.034119431666454, -23.546882826181502 ], [ -56.035230474806554, -23.552205498784758 ], [ -56.034791226134189, -23.566726575770872 ], [ -56.036005622061793, -23.575511569903028 ], [ -56.038382737972995, -23.581867771280599 ], [ -56.0419484122894, -23.586622003102946 ], [ -56.047296922415057, -23.590032646889142 ], [ -56.058562385245864, -23.595148613917388 ], [ -56.065538703348466, -23.599489434589714 ], [ -56.08086076511222, -23.611168307671278 ], [ -56.086441820133871, -23.613907158788322 ], [ -56.091557787162117, -23.614010511575827 ], [ -56.101686366632521, -23.607292575891677 ], [ -56.114140387868588, -23.594580173136478 ], [ -56.132020432696777, -23.565279635846537 ], [ -56.140133633260575, -23.548484795736726 ], [ -56.145172085023717, -23.535307305887443 ], [ -56.147497524990797, -23.526625664542792 ], [ -56.147755907409191, -23.519804376071079 ], [ -56.14424190903685, -23.514843437774459 ], [ -56.061533780359696, -23.452056573052403 ], [ -56.053162197377503, -23.443013198300491 ], [ -56.046521776059137, -23.433918144906443 ], [ -56.044144660147936, -23.428647149146627 ], [ -56.042956101742675, -23.423376152487435 ], [ -56.043214484161126, -23.41965544943946 ], [ -56.044738939350566, -23.414126072160514 ], [ -56.047917040039351, -23.407046401270406 ], [ -56.052102831080788, -23.400845228624405 ], [ -56.055978562860389, -23.396814467213915 ], [ -56.072825079813583, -23.383171888471907 ], [ -56.07739844358332, -23.37686736393772 ], [ -56.078819545985255, -23.372009780227188 ], [ -56.077320930116798, -23.366583753937107 ], [ -56.072204963088552, -23.356558525455569 ], [ -56.069724494389902, -23.350098972189812 ], [ -56.069440274449107, -23.344362887537216 ], [ -56.071584846363578, -23.337851657428075 ], [ -56.076390754129989, -23.330978692112978 ], [ -56.0842972482194, -23.32420907958533 ], [ -56.092927211821348, -23.31960987649461 ], [ -56.107344936919276, -23.316044203077524 ], [ -56.149487067274322, -23.313873792741333 ], [ -56.162638718701885, -23.311806736092024 ], [ -56.178425869358364, -23.307362562632136 ], [ -56.183464322020825, -23.307982680256487 ], [ -56.192662726403682, -23.312426852816998 ], [ -56.203747321181936, -23.315062351146594 ], [ -56.224650437967341, -23.3179045550512 ], [ -56.243589849991565, -23.322555434086041 ], [ -56.266895921109892, -23.334079277536659 ], [ -56.27803219273153, -23.341675714162875 ], [ -56.286222906761736, -23.345396417210907 ], [ -56.290486213068277, -23.346688327504296 ], [ -56.301028204587965, -23.33966033255831 ], [ -56.296273972765619, -23.335939629510278 ], [ -56.294568651322209, -23.333459160811628 ], [ -56.292579108139307, -23.329945164237927 ], [ -56.291571417786713, -23.327309665908331 ], [ -56.289090949088006, -23.317542819845244 ], [ -56.285835334033436, -23.292996515276968 ], [ -56.284388394109101, -23.287518813042766 ], [ -56.28221798377291, -23.28260955158953 ], [ -56.279117398349229, -23.278527114234919 ], [ -56.275551724032823, -23.274961439918513 ], [ -56.271443447357228, -23.271809176752129 ], [ -56.262322557340156, -23.266693210623203 ], [ -56.25875688302375, -23.262972506675851 ], [ -56.254364387306623, -23.253464043930478 ], [ -56.251651373711923, -23.248968193627263 ], [ -56.247982346608012, -23.245505872997626 ], [ -56.243977423619185, -23.242353610730561 ], [ -56.235218267908749, -23.236617526977284 ], [ -56.19669348781423, -23.217342218168824 ], [ -56.192585212037898, -23.214396660577449 ], [ -56.190543992910932, -23.208918959242567 ], [ -56.190905728116832, -23.200857435522209 ], [ -56.194781459896433, -23.186698092842732 ], [ -56.195014003893164, -23.17832651075986 ], [ -56.194238858436563, -23.171453545444763 ], [ -56.192740240769467, -23.166027520054001 ], [ -56.190699021642502, -23.160859877081691 ], [ -56.187727627428046, -23.15677743882776 ], [ -56.18354183638661, -23.153676852504759 ], [ -56.178606737410973, -23.151558119012009 ], [ -56.174731003832733, -23.148870944738292 ], [ -56.173697475957738, -23.144530124965286 ], [ -56.175583666353134, -23.133884779758773 ], [ -56.175712856662983, -23.127683608012092 ], [ -56.174627651944547, -23.122102552990441 ], [ -56.171992153615008, -23.117813409161499 ], [ -56.168013068148582, -23.115642998825365 ], [ -56.16310380669529, -23.11610808681877 ], [ -56.153362799953243, -23.120397230647654 ], [ -56.148014288928266, -23.12184417057199 ], [ -56.14214901396582, -23.12168914184042 ], [ -56.137368943721754, -23.119622084291734 ], [ -56.133725755039563, -23.11610808681877 ], [ -56.131477831236907, -23.111302179052302 ], [ -56.130392625619152, -23.105566095299082 ], [ -56.129229905635611, -23.069806003844008 ], [ -56.127369553661993, -23.05869557064409 ], [ -56.128144700917233, -23.052494398897409 ], [ -56.271572638566397, -22.707089124963147 ], [ -56.275086636039418, -22.701404718053311 ], [ -56.279866706283485, -22.69597869176323 ], [ -56.294568651322209, -22.690552667271788 ], [ -56.300614794337264, -22.689105726448133 ], [ -56.305859950776096, -22.689002373660628 ], [ -56.311156785856952, -22.690087579278384 ], [ -56.315859340835914, -22.692361341502703 ], [ -56.341154955137085, -22.710551445592728 ], [ -56.345779994850886, -22.713135267978259 ], [ -56.350818446614028, -22.715098971840064 ], [ -56.362368130284949, -22.717579440538771 ], [ -56.367742478832326, -22.719594822143335 ], [ -56.372264166657942, -22.722385349204501 ], [ -56.376036545650038, -22.726106052252533 ], [ -56.379292161603985, -22.730291843293912 ], [ -56.390996874006532, -22.748843682589893 ], [ -56.397637295324898, -22.757111911885204 ], [ -56.40135799837293, -22.760832614933236 ], [ -56.405595466257751, -22.763778170726027 ], [ -56.415388149843238, -22.768274021029242 ], [ -56.420865851178064, -22.769772637797018 ], [ -56.473834194792232, -22.778557631029855 ], [ -56.47882096971199, -22.780417983003531 ], [ -56.48380774643033, -22.782743422071292 ], [ -56.492411871610557, -22.788634534556138 ], [ -56.498535528991454, -22.794577324783688 ], [ -56.499775764240098, -22.796282647126475 ], [ -56.50078345369343, -22.798194675044215 ], [ -56.504349128009835, -22.807031345120492 ], [ -56.505951096665797, -22.812922458504659 ], [ -56.509180874197966, -22.832301120999944 ], [ -56.511092902115706, -22.838140557540726 ], [ -56.513986781964434, -22.842946466206456 ], [ -56.52447709843932, -22.855452161588005 ], [ -56.532357754107068, -22.870386650623459 ], [ -56.536052618733379, -22.87405567772737 ], [ -56.540806850555725, -22.876432793638514 ], [ -56.552227342118158, -22.87886158549378 ], [ -56.571554327770002, -22.887026462001643 ], [ -56.576902838794979, -22.888266697250288 ], [ -56.582768113757425, -22.889041842706888 ], [ -56.589305183187662, -22.888266697250288 ], [ -56.595428839669182, -22.886716403639127 ], [ -56.601655849837584, -22.882995700591096 ], [ -56.608089565580997, -22.878138115981244 ], [ -56.616926235657218, -22.869456475535912 ], [ -56.623437465766415, -22.865425714125422 ], [ -56.629767828722322, -22.864288831664226 ], [ -56.634289517447257, -22.866510918843858 ], [ -56.6420668203275, -22.873487236946403 ], [ -56.646562668832075, -22.876122735275999 ], [ -56.651911179857052, -22.877828057618785 ], [ -56.670463019152976, -22.879533379961515 ], [ -56.683976405786495, -22.879326673487185 ], [ -56.690022548801551, -22.879688408693085 ], [ -56.693820767114687, -22.878551528030584 ], [ -56.694647590314048, -22.875192560188509 ], [ -56.692192959137742, -22.86304859821422 ], [ -56.686689419381196, -22.855193780068873 ], [ -56.68004899806283, -22.848114109178823 ], [ -56.657931485349764, -22.834781588799274 ], [ -56.653306443837323, -22.828063653115123 ], [ -56.652221239118887, -22.81757333664018 ], [ -56.658474086809633, -22.79964161496855 ], [ -56.666225552167475, -22.759282322221395 ], [ -56.674235399044449, -22.739438571732705 ], [ -56.68273617233649, -22.726622817089321 ], [ -56.689195725602247, -22.7196464980874 ], [ -56.694440883839718, -22.715874119095304 ], [ -56.700021938861369, -22.712670179984798 ], [ -56.704776169784395, -22.708174329681583 ], [ -56.707049932908092, -22.701249687523045 ], [ -56.70389767064097, -22.686160169756022 ], [ -56.70353593633439, -22.679132174810036 ], [ -56.705499641095571, -22.671690768714029 ], [ -56.714878912631718, -22.660373629939102 ], [ -56.719555630088223, -22.653087253473984 ], [ -56.721596849215189, -22.643785496303622 ], [ -56.71973649814089, -22.632675063103704 ], [ -56.716868455814563, -22.624613538484027 ], [ -56.715188971893554, -22.615363458157049 ], [ -56.714723883900092, -22.603994642538737 ], [ -56.717126838233014, -22.585184420824362 ], [ -56.716170823824427, -22.566322524065242 ], [ -56.716739264605394, -22.560534762569262 ], [ -56.721906907577704, -22.540329277773935 ], [ -56.722191128417819, -22.53314625409638 ], [ -56.71973649814089, -22.527875257437188 ], [ -56.709892136812641, -22.521415704171432 ], [ -56.706481493026502, -22.515886325993165 ], [ -56.70544796425213, -22.508238213422828 ], [ -56.710047167342907, -22.486585788703167 ], [ -56.709323696931051, -22.479609469701245 ], [ -56.706481493026502, -22.47377003316052 ], [ -56.702424893194234, -22.468188979038132 ], [ -56.697076382169314, -22.463073012009886 ], [ -56.664933640974766, -22.442919203158681 ], [ -56.657698941353033, -22.437028089774515 ], [ -56.614910854951972, -22.380442396799197 ], [ -56.609381475874386, -22.376721693751165 ], [ -56.58594621444621, -22.365146172557843 ], [ -56.582018805823225, -22.361993910290721 ], [ -56.622610642567111, -22.347162774042772 ], [ -56.834096441597467, -22.298276868682535 ], [ -56.842856404999907, -22.289025981 ], [ -56.819653686999914, -22.265461526999985 ], [ -56.813142455999952, -22.256159769999968 ], [ -56.811902221999901, -22.249648538999907 ], [ -56.808284871999916, -22.247994893999945 ], [ -56.794564778999899, -22.252542419999983 ], [ -56.786994180999926, -22.251818948999897 ], [ -56.754360514999888, -22.242620543999891 ], [ -56.746789916999916, -22.243964130999956 ], [ -56.745601358999892, -22.248408304999955 ], [ -56.743534301999944, -22.250372008999904 ], [ -56.733199015999929, -22.244067484999974 ], [ -56.728548135999858, -22.237452900999884 ], [ -56.720538289999894, -22.2194695029999 ], [ -56.715370646999872, -22.215438741 ], [ -56.698601643999922, -22.223500263999895 ], [ -56.66457271299987, -22.25998382599991 ], [ -56.648811401999893, -22.263497822999867 ], [ -56.644134684999926, -22.255436299999971 ], [ -56.654702514999912, -22.237349547999955 ], [ -56.648346313999866, -22.231355081999922 ], [ -56.637184204999926, -22.228254495999892 ], [ -56.629174356999954, -22.224740497999932 ], [ -56.595739705999875, -22.201486103999912 ], [ -56.584965168999958, -22.190530700999929 ], [ -56.567911946999914, -22.16231536899997 ], [ -56.565302286999895, -22.159938252999922 ], [ -56.558015909999938, -22.156424254999962 ], [ -56.554605265999896, -22.15208343499998 ], [ -56.549075886999901, -22.136270446999987 ], [ -56.545975300999942, -22.130069274999911 ], [ -56.530679077999906, -22.109088643999911 ], [ -56.521635701999941, -22.099890237999915 ], [ -56.511300414999937, -22.091415303999909 ], [ -56.493833781999882, -22.086557718999885 ], [ -56.421796834999924, -22.074465433999904 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-14", "NAME_1": "Canindeyú" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -55.533795620999854, -23.530444136999861 ], [ -55.533065551999954, -23.534014586999959 ], [ -55.533892374999965, -23.569981383999945 ], [ -55.53053340699995, -23.60346771199994 ], [ -55.511309773999926, -23.629409280999894 ], [ -55.466971395999877, -23.673230896 ], [ -55.445318969999903, -23.735449319999901 ], [ -55.430177774999976, -23.928564147999879 ], [ -55.420669311999916, -23.954505715999915 ], [ -55.398035033999946, -23.976829935999973 ], [ -55.367184203999955, -23.989645690999879 ], [ -55.304345662999907, -23.994089863999974 ], [ -55.272719685999903, -24.000394388999979 ], [ -55.272668008999887, -24.000497741999922 ], [ -55.272564656999862, -24.000497741999922 ], [ -55.272409627999934, -24.000601094999936 ], [ -55.23683040399996, -24.012693379999931 ], [ -55.200863606999889, -24.019514667999971 ], [ -55.165439412999945, -24.016827493999955 ], [ -55.131281290999965, -24.000601094999936 ], [ -55.131203776999939, -24.000601094999936 ], [ -55.131074584999908, -24.000601094999936 ], [ -55.131074584999908, -24.000394388999979 ], [ -55.105572265999882, -23.988508809999956 ], [ -55.042294473999902, -23.989025573999896 ], [ -55.011495320999927, -23.980550638999901 ], [ -54.994571289999925, -23.973109232999974 ], [ -54.961059122999927, -23.971765644999905 ], [ -54.94364416499991, -23.969181823999904 ], [ -54.926745971999907, -23.959880065999883 ], [ -54.90488684099995, -23.933008320999889 ], [ -54.891916056999946, -23.920605976999909 ], [ -54.827423868999915, -23.887016296999974 ], [ -54.696837523999932, -23.845158385999909 ], [ -54.679784301999916, -23.836683450999914 ], [ -54.654592040999944, -23.811465351999956 ], [ -54.639218302999979, -23.804437356999941 ], [ -54.612553263999928, -23.81115529399996 ], [ -54.443157918999901, -23.899935403999891 ], [ -54.422900756999894, -23.913784688999954 ], [ -54.367606974999973, -23.984684753999915 ], [ -54.273607543999844, -24.03646453799989 ], [ -54.245749848376818, -24.050393385446398 ], [ -54.245288858999942, -24.050623880999936 ], [ -54.266217814999919, -24.06592010499989 ], [ -54.301047729999908, -24.08989796999991 ], [ -54.324767211999927, -24.118216653999909 ], [ -54.334637410999932, -24.148912454999945 ], [ -54.331846882999884, -24.165035501999924 ], [ -54.318979451999951, -24.196764830999939 ], [ -54.314121866999955, -24.234178567999905 ], [ -54.306267048999928, -24.246684264999914 ], [ -54.282650919999895, -24.275313008999973 ], [ -54.274331013999927, -24.298257344999925 ], [ -54.261050170999937, -24.329469909 ], [ -54.262187051999945, -24.358512064999985 ], [ -54.271695515999909, -24.38941457099989 ], [ -54.284097859999889, -24.411325377999944 ], [ -54.322906859999932, -24.464345397999949 ], [ -54.334534057999889, -24.496694843999933 ], [ -54.334792439999973, -24.527287292999944 ], [ -54.320684773999943, -24.595913593999896 ], [ -54.321304890999897, -24.628366393999912 ], [ -54.358429465247639, -24.73142174661632 ], [ -54.358976202689576, -24.731203302190636 ], [ -54.381610480239488, -24.722159925640085 ], [ -54.395666470131459, -24.720454604196618 ], [ -54.421401333105052, -24.720609632928245 ], [ -54.444836595432548, -24.72283172010782 ], [ -54.469744636106043, -24.722676689577554 ], [ -54.49323157437766, -24.718180841072979 ], [ -54.521085170843946, -24.707483819023025 ], [ -54.549972296983924, -24.699577324933614 ], [ -54.626530930757838, -24.689190362145496 ], [ -54.63619442403342, -24.685314629466575 ], [ -54.643067390247836, -24.678079928945579 ], [ -54.648829312422833, -24.669760023706147 ], [ -54.659422979886585, -24.644645277457585 ], [ -54.663634610249062, -24.640304456785259 ], [ -54.668363002750368, -24.638805840916802 ], [ -54.67704464409502, -24.639891045635238 ], [ -54.691643236346295, -24.643921807945105 ], [ -54.69807695208965, -24.644851983032595 ], [ -54.706371018907362, -24.64361174868327 ], [ -54.71388994026853, -24.641131279984563 ], [ -54.725155402200016, -24.635963637012253 ], [ -54.733992072276294, -24.633948256307008 ], [ -54.746032680563758, -24.634878432293817 ], [ -54.753267381084754, -24.639684340060228 ], [ -54.758047451328821, -24.644231866307564 ], [ -54.764403652706392, -24.653481947533862 ], [ -54.768925339632688, -24.658442884931219 ], [ -54.774067145082654, -24.66309376396606 ], [ -54.779338140842526, -24.666194350289061 ], [ -54.784479946292493, -24.668364759725876 ], [ -54.790603603673389, -24.668674818987711 ], [ -54.795667893858194, -24.666039320658115 ], [ -54.801016404883171, -24.659011325712129 ], [ -54.800964728039787, -24.65032968526674 ], [ -54.800292935370692, -24.644335219095069 ], [ -54.800241257627931, -24.639684340060228 ], [ -54.803910284731842, -24.636583753737227 ], [ -54.811971807552879, -24.633173109951088 ], [ -54.826234503919238, -24.631467786708981 ], [ -54.862563036155166, -24.630227553258976 ], [ -54.871012131704504, -24.628987318909651 ], [ -54.878815273905786, -24.626351820580055 ], [ -54.885404019280031, -24.620202324777495 ], [ -54.887316047197828, -24.614827976230117 ], [ -54.886902635148488, -24.609712009201871 ], [ -54.884706387289953, -24.60428598381111 ], [ -54.883336960832082, -24.598704928789459 ], [ -54.882923549682062, -24.591625257899352 ], [ -54.884835577599802, -24.582633559091505 ], [ -54.896462774737245, -24.571884861097487 ], [ -54.915712246023304, -24.562014662246895 ], [ -54.992322556640659, -24.539587091171313 ], [ -55.000745815566916, -24.53974211990294 ], [ -55.01568030460237, -24.542170911758149 ], [ -55.039296434083155, -24.551162611465372 ], [ -55.051517910423229, -24.553539726477197 ], [ -55.064592048384327, -24.551524346671272 ], [ -55.079035611004656, -24.545788262917995 ], [ -55.093685879199938, -24.532765801800338 ], [ -55.098388434178901, -24.520725192613554 ], [ -55.099551154162441, -24.509563083469516 ], [ -55.09531368717694, -24.472717787296062 ], [ -55.116759406321535, -24.467498467480311 ], [ -55.227527838838682, -24.50217335421695 ], [ -55.489682379937904, -24.542791030281819 ], [ -55.509784511945668, -24.548888849240996 ], [ -55.522806973063325, -24.555710137712708 ], [ -55.632361008753549, -24.663507175116024 ], [ -55.682151251678931, -24.698543796159242 ], [ -55.696310594358408, -24.713168226832181 ], [ -55.724474250086587, -24.753320814903702 ], [ -55.750829229785097, -24.782673028137765 ], [ -55.804262661392727, -24.753630873266218 ], [ -55.814236213030824, -24.745672703232685 ], [ -55.8206957671959, -24.735182386757742 ], [ -55.827930466817577, -24.720764661659814 ], [ -55.836818813737239, -24.697716973859258 ], [ -55.856119960967419, -24.678803398458058 ], [ -55.872888962655509, -24.666039320658115 ], [ -55.902447883263221, -24.64898609812991 ], [ -55.913609992407203, -24.635033461025387 ], [ -55.924203660770331, -24.613277682618957 ], [ -55.93862138496894, -24.571626478679036 ], [ -55.960092943434574, -24.531525566551636 ], [ -56.013112962093544, -24.463726087588896 ], [ -56.033809374203258, -24.419801120525278 ], [ -56.03846025233878, -24.413651624722718 ], [ -56.044299688879505, -24.408690688224681 ], [ -56.051870287084057, -24.405228366695781 ], [ -56.070654670376712, -24.399337254210934 ], [ -56.079853074759569, -24.395203139113562 ], [ -56.088017951267432, -24.389983819297811 ], [ -56.096441210193689, -24.38249073725774 ], [ -56.10339168987457, -24.374480889481447 ], [ -56.109024420840342, -24.364869073049306 ], [ -56.114372931865319, -24.352776787918458 ], [ -56.118507046063314, -24.337325534945478 ], [ -56.122822028313976, -24.304717705757525 ], [ -56.125431688221852, -24.293503919770103 ], [ -56.129565803319167, -24.284253838543805 ], [ -56.135043503754673, -24.278672783522154 ], [ -56.156592576586149, -24.26161956099395 ], [ -56.158478766082169, -24.248855483194006 ], [ -56.158504605403209, -24.229786879061237 ], [ -56.152613491119723, -24.18301970809307 ], [ -56.153543667106533, -24.160798841693179 ], [ -56.148841112127627, -24.14539926466432 ], [ -56.145792201748691, -24.140386650423579 ], [ -56.126361864208661, -24.116202081061203 ], [ -56.122124396323841, -24.113101494738203 ], [ -56.11768022286401, -24.110465997307927 ], [ -56.112590095156747, -24.108192234184287 ], [ -56.088224656842442, -24.103179619943489 ], [ -56.08313452823586, -24.101009209607355 ], [ -56.07912960524709, -24.097908624183674 ], [ -56.066313848805066, -24.0821989887923 ], [ -56.043576219367026, -24.061890151209525 ], [ -56.030915492555948, -24.046077162131326 ], [ -56.015877651632309, -24.032486261132021 ], [ -56.011459316594198, -24.030005791534052 ], [ -56.007299363974482, -24.028455498822211 ], [ -56.002906867358035, -24.028300470090642 ], [ -56.000400560237665, -24.028455498822211 ], [ -55.994147711647543, -24.029850762802482 ], [ -55.992364874939028, -24.022719415068934 ], [ -55.997532517911338, -23.999826755100685 ], [ -56.05907914918339, -23.848518161783716 ], [ -56.047141892784111, -23.856062920667284 ], [ -56.032439947745388, -23.862419122044855 ], [ -56.026316291263811, -23.864279474018531 ], [ -56.019908413042799, -23.865054619475131 ], [ -56.014404873286253, -23.864072767544201 ], [ -56.009082200682997, -23.86210906278302 ], [ -56.000813972287006, -23.858078302271849 ], [ -55.992907477298218, -23.855339451154748 ], [ -55.957173224264864, -23.852393893563317 ], [ -55.932265183591369, -23.846916192228491 ], [ -55.906581996561897, -23.837356051740414 ], [ -55.897099372238245, -23.831464939255568 ], [ -55.890975714857348, -23.825160413822061 ], [ -55.87697140180876, -23.802267754753075 ], [ -55.866842821439036, -23.793224379101844 ], [ -55.824158087825481, -23.771158543232161 ], [ -55.720624355829329, -23.701136977089845 ], [ -55.699204474207136, -23.689303073478072 ], [ -55.684580044433517, -23.683515312881411 ], [ -55.656571418336284, -23.683050225787269 ], [ -55.647450528319212, -23.680879814551815 ], [ -55.638898078183729, -23.677779229128134 ], [ -55.597841153446495, -23.655661715515748 ], [ -55.586653204981417, -23.645894871251301 ], [ -55.579909430875546, -23.635559583507984 ], [ -55.571692878423619, -23.596905613103559 ], [ -55.553838670218454, -23.552153822840637 ], [ -55.543968472267181, -23.537426038480874 ], [ -55.534330817413263, -23.530811455584228 ], [ -55.533795620999854, -23.530444136999861 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-2", "NAME_1": "San Pedro" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -55.750829229785097, -24.782673028137765 ], [ -55.868909878088402, -24.811508476534982 ], [ -55.949370082962957, -24.841945896286063 ], [ -55.969911465441783, -24.857087090896528 ], [ -55.984561733637065, -24.873468519856317 ], [ -56.028435024756561, -24.952791843169052 ], [ -56.03711666520195, -24.964367363463055 ], [ -56.045746628803897, -24.971498712095865 ], [ -56.054428270148549, -24.967881361835396 ], [ -56.1008853827542, -24.928193861757336 ], [ -56.134965990288208, -24.893002211083171 ], [ -56.14155473476319, -24.888092949629936 ], [ -56.147885097719097, -24.884785657731925 ], [ -56.193773770443158, -24.868920993608981 ], [ -56.20377315870428, -24.862564793130673 ], [ -56.210775316127922, -24.855691826916257 ], [ -56.213591681610808, -24.848405449551876 ], [ -56.214315152022664, -24.840240573943333 ], [ -56.213436651979919, -24.832954196578896 ], [ -56.209380052147708, -24.817606295494159 ], [ -56.210155199402948, -24.80685759929878 ], [ -56.214496019175954, -24.794713636425172 ], [ -56.227260097875217, -24.784274997692989 ], [ -56.236329311948168, -24.78334482170618 ], [ -56.247129685886307, -24.788667494309436 ], [ -56.256663987952663, -24.797814222748173 ], [ -56.264932217248031, -24.808097832748786 ], [ -56.271675991353902, -24.820448500298028 ], [ -56.276559414385474, -24.832489108585492 ], [ -56.285680305301867, -24.846235040115005 ], [ -56.298806118307709, -24.858534030820863 ], [ -56.342110968646296, -24.881736749151628 ], [ -56.352678798587704, -24.89026335996607 ], [ -56.358750780024479, -24.900288587548289 ], [ -56.363298306271815, -24.910623875291606 ], [ -56.370739712367822, -24.922147718742224 ], [ -56.380687424684879, -24.93150115275597 ], [ -56.411176520380081, -24.946849053840765 ], [ -56.421692674377425, -24.953360283949962 ], [ -56.494504766681644, -25.021728203693669 ], [ -56.531866827691942, -25.006587009083205 ], [ -56.536621060413609, -25.002917982878614 ], [ -56.54163367375503, -24.999972426186503 ], [ -56.578608161137709, -24.961835218820283 ], [ -56.595738898031698, -24.951344903244717 ], [ -56.689273240867351, -24.916980075769857 ], [ -56.704724493840331, -24.915274753427127 ], [ -56.772188076018892, -24.922406101160618 ], [ -56.826965094763295, -24.936823826258603 ], [ -56.984810756611125, -24.963747246738023 ], [ -56.998401659409069, -24.96777800904789 ], [ -57.006178962289255, -24.971447035252481 ], [ -57.015351529149768, -24.976873060643243 ], [ -57.018607144204339, -24.980283704429439 ], [ -57.02038998091291, -24.983746025958339 ], [ -57.021578539318114, -24.989533786555 ], [ -57.021966112046414, -24.994856459158257 ], [ -57.021552699997073, -24.998370456631278 ], [ -57.019873216076064, -25.004881686740475 ], [ -57.019769863288559, -25.008757419419396 ], [ -57.020312465647748, -25.013098240091722 ], [ -57.022172817621424, -25.018059176589702 ], [ -57.027702195799691, -25.02405364276143 ], [ -57.038605923424598, -25.031081637707416 ], [ -57.058708055432419, -25.037592868715933 ], [ -57.076872321100723, -25.038936455852763 ], [ -57.095605028449313, -25.037127780722528 ], [ -57.129763150349106, -25.027929375440351 ], [ -57.195030483769813, -25.000592542911534 ], [ -57.213427294334167, -24.988965345774091 ], [ -57.199526333173708, -24.984211113951744 ], [ -57.194797939773082, -24.978113294992568 ], [ -57.198492805298713, -24.969741712909752 ], [ -57.210016648749331, -24.957959487040682 ], [ -57.218698290093982, -24.946590670523051 ], [ -57.218956671613114, -24.937392267039513 ], [ -57.215623542192702, -24.928193861757336 ], [ -57.213427294334167, -24.916980075769857 ], [ -57.216011114921002, -24.901373793166044 ], [ -57.222522345929519, -24.901942233946954 ], [ -57.231178147953131, -24.907368258438396 ], [ -57.240092333294513, -24.906438084250169 ], [ -57.248438076056345, -24.897239678967992 ], [ -57.248670620053076, -24.891451917472011 ], [ -57.197149217262563, -24.826753024832215 ], [ -57.181904669864593, -24.769495538288481 ], [ -57.178649054810023, -24.762415866499055 ], [ -57.16681515209757, -24.757661634676708 ], [ -57.158081834808797, -24.759625338538569 ], [ -57.149374355941745, -24.763035984123348 ], [ -57.137695481960918, -24.762415866499055 ], [ -57.12232174335378, -24.752028903710936 ], [ -57.116663173966288, -24.736422621107067 ], [ -57.112141486140672, -24.717509046605244 ], [ -57.090669928574357, -24.677459812220548 ], [ -57.097517056367053, -24.66154347125422 ], [ -57.113175014914987, -24.64898609812991 ], [ -57.126610887182665, -24.641441339246398 ], [ -57.133974778912886, -24.628832289278705 ], [ -57.141080288224714, -24.616326592997893 ], [ -57.144904344060251, -24.602994072618344 ], [ -57.14565365289377, -24.58289194061058 ], [ -57.141183641012219, -24.541912530239074 ], [ -57.132191942204372, -24.509873141832031 ], [ -57.130538295805707, -24.500106295768944 ], [ -57.141958788267459, -24.474939873576318 ], [ -57.1466096673023, -24.460677179008599 ], [ -57.157410041240382, -24.389518731304406 ], [ -57.165239020064689, -24.359908135651949 ], [ -57.170949266295622, -24.297999770073318 ], [ -57.174850837396207, -24.285028984899725 ], [ -57.185599535390224, -24.26642546965968 ], [ -57.193402675792868, -24.255935154084113 ], [ -57.212548794291422, -24.236711521219718 ], [ -57.216863775642707, -24.229321791067832 ], [ -57.219809333234139, -24.22079518025339 ], [ -57.221101244426904, -24.207979424710686 ], [ -57.220713669899965, -24.202036634483079 ], [ -57.219731817969034, -24.197902520285083 ], [ -57.215907762133497, -24.192631523625892 ], [ -57.197821010830978, -24.173562921291762 ], [ -57.189681972744836, -24.156768080282689 ], [ -57.172189500644947, -24.137079359424888 ], [ -57.163016933784434, -24.117442314511209 ], [ -57.178649054810023, -24.098270358490254 ], [ -57.187924973558665, -24.096203301840887 ], [ -57.223659226592019, -24.098270358490254 ], [ -57.233581102286053, -24.094704685073168 ], [ -57.237870246114937, -24.086178074258726 ], [ -57.236733363653798, -24.075842786515409 ], [ -57.230480515963052, -24.06695444049501 ], [ -57.22389177058875, -24.050728041166167 ], [ -57.231772427155761, -24.033364760275447 ], [ -57.248360561690561, -24.023649591055801 ], [ -57.268049281649041, -24.030005791534052 ], [ -57.278048671708802, -24.00509775175982 ], [ -57.279883185260758, -23.978794448005374 ], [ -57.284482388351535, -23.954041436063449 ], [ -57.302801682751465, -23.933784274424738 ], [ -57.312749395967842, -23.932182305768777 ], [ -57.326443650653971, -23.932233981712898 ], [ -57.338561774206482, -23.930476982526727 ], [ -57.34375525560057, -23.923242282905051 ], [ -57.340396287758438, -23.911305026505772 ], [ -57.332903204819047, -23.901538180442685 ], [ -57.3254101218796, -23.894096775245998 ], [ -57.322051154037524, -23.889084161005201 ], [ -57.318149583836203, -23.885931898738136 ], [ -57.295334439133057, -23.871720880114538 ], [ -57.291303676823247, -23.861850681263945 ], [ -57.288513149762025, -23.830741468843712 ], [ -57.281588507603544, -23.800975843560309 ], [ -57.281071742766699, -23.793224379101844 ], [ -57.284430710608774, -23.787695000923577 ], [ -57.291923794447541, -23.782062269957805 ], [ -57.299416877386989, -23.774982599067698 ], [ -57.302801682751465, -23.765267428948675 ], [ -57.299003465337648, -23.757670994121099 ], [ -57.281175095554204, -23.751314792743472 ], [ -57.275490688644368, -23.742013034673789 ], [ -57.275826586327867, -23.731522719098223 ], [ -57.280348273254219, -23.723409518534481 ], [ -57.295334439133057, -23.707234796049022 ], [ -57.325875209873004, -23.682791842469555 ], [ -57.397989671086464, -23.645636488832906 ], [ -57.425688238821181, -23.617886244254748 ], [ -57.450415412341385, -23.573806247560299 ], [ -57.453619350552572, -23.559853610455775 ], [ -57.454859584901897, -23.548898206886747 ], [ -57.459639655145963, -23.527710870160547 ], [ -57.459820523198573, -23.515463556298073 ], [ -57.457029995238088, -23.504663180561352 ], [ -57.448245002005251, -23.485956312533801 ], [ -57.446177945355885, -23.474484145027247 ], [ -57.420494758326413, -23.477739760081874 ], [ -57.408454149139686, -23.482390639116716 ], [ -57.40369991731734, -23.484871107815366 ], [ -57.398454759079868, -23.486989841308116 ], [ -57.372849087315501, -23.500115655213335 ], [ -57.368146532336596, -23.50171762476856 ], [ -57.357113614401783, -23.504146416623826 ], [ -57.35047319218404, -23.504766534248176 ], [ -57.28401730035813, -23.500322360788346 ], [ -57.281588507603544, -23.50078744878175 ], [ -57.274017910298312, -23.500270684844224 ], [ -57.263269212304294, -23.498151950452154 ], [ -57.24316708029653, -23.491072279562047 ], [ -57.226139696190046, -23.482493991904221 ], [ -57.218569098884814, -23.48016855193714 ], [ -57.208156296775655, -23.47897999353188 ], [ -57.161518317016714, -23.47939340558122 ], [ -57.089972296584222, -23.469109795580607 ], [ -57.045892299889715, -23.456087334462893 ], [ -57.038605923424598, -23.452159925839908 ], [ -57.034626837958172, -23.448904310785338 ], [ -57.030079311710836, -23.446165459668237 ], [ -57.024110683960885, -23.444150078962991 ], [ -57.016798469074104, -23.443374932607071 ], [ -57.006644050282659, -23.444460138224827 ], [ -56.998815069659713, -23.446113782824796 ], [ -56.991011929257127, -23.448645929266206 ], [ -56.984552375092051, -23.448955986729402 ], [ -56.977085129675004, -23.447509046805067 ], [ -56.957654792134917, -23.439344171196524 ], [ -56.943934699027125, -23.436140232086018 ], [ -56.933392706608117, -23.434744968105804 ], [ -56.908045417262201, -23.436295260817644 ], [ -56.89954464397016, -23.435675144092613 ], [ -56.893033412961643, -23.433814793018314 ], [ -56.886728889326776, -23.429473971446612 ], [ -56.877995572038003, -23.422032566249925 ], [ -56.871458502607823, -23.41981047907035 ], [ -56.862699347796649, -23.419035332714429 ], [ -56.838514776635634, -23.42172250698809 ], [ -56.788181932250382, -23.432574557769613 ], [ -56.730045945663846, -23.429629001976878 ], [ -56.715705735831023, -23.430249118701852 ], [ -56.705602992983756, -23.431747734570308 ], [ -56.68157345235295, -23.443840019701156 ], [ -56.671858283133247, -23.444770195687965 ], [ -56.658603278018859, -23.444718519743901 ], [ -56.632558355783488, -23.442031344570921 ], [ -56.620336880342734, -23.443013198300491 ], [ -56.612068651047423, -23.445183607737306 ], [ -56.605350715363215, -23.452314954571477 ], [ -56.596152310081038, -23.453245130558344 ], [ -56.5811661442022, -23.451746514689887 ], [ -56.549204271060262, -23.445028578106417 ], [ -56.534760708439933, -23.443633315025465 ], [ -56.52522640637352, -23.443633315025465 ], [ -56.518172573005813, -23.44120452227088 ], [ -56.473705002683744, -23.4204305966947 ], [ -56.433707445142488, -23.410405369112482 ], [ -56.424870775066211, -23.410767103419118 ], [ -56.41851457368864, -23.411800632193433 ], [ -56.412339240363622, -23.412265720186838 ], [ -56.404897834267615, -23.411387221043412 ], [ -56.38112667515594, -23.400225111899374 ], [ -56.367690802888262, -23.388391209186977 ], [ -56.354151576933702, -23.378831068698844 ], [ -56.346090054112722, -23.366170342787086 ], [ -56.333584356932533, -23.352114352895057 ], [ -56.301028204587965, -23.33966033255831 ], [ -56.290486213068277, -23.346688327504296 ], [ -56.286222906761736, -23.345396417210907 ], [ -56.27803219273153, -23.341675714162875 ], [ -56.266895921109892, -23.334079277536659 ], [ -56.243589849991565, -23.322555434086041 ], [ -56.224650437967341, -23.3179045550512 ], [ -56.203747321181936, -23.315062351146594 ], [ -56.192662726403682, -23.312426852816998 ], [ -56.183464322020825, -23.307982680256487 ], [ -56.178425869358364, -23.307362562632136 ], [ -56.162638718701885, -23.311806736092024 ], [ -56.149487067274322, -23.313873792741333 ], [ -56.107344936919276, -23.316044203077524 ], [ -56.092927211821348, -23.31960987649461 ], [ -56.0842972482194, -23.32420907958533 ], [ -56.076390754129989, -23.330978692112978 ], [ -56.071584846363578, -23.337851657428075 ], [ -56.069440274449107, -23.344362887537216 ], [ -56.069724494389902, -23.350098972189812 ], [ -56.072204963088552, -23.356558525455569 ], [ -56.077320930116798, -23.366583753937107 ], [ -56.078819545985255, -23.372009780227188 ], [ -56.07739844358332, -23.37686736393772 ], [ -56.072825079813583, -23.383171888471907 ], [ -56.055978562860389, -23.396814467213915 ], [ -56.052102831080788, -23.400845228624405 ], [ -56.047917040039351, -23.407046401270406 ], [ -56.044738939350566, -23.414126072160514 ], [ -56.043214484161126, -23.41965544943946 ], [ -56.042956101742675, -23.423376152487435 ], [ -56.044144660147936, -23.428647149146627 ], [ -56.046521776059137, -23.433918144906443 ], [ -56.053162197377503, -23.443013198300491 ], [ -56.061533780359696, -23.452056573052403 ], [ -56.14424190903685, -23.514843437774459 ], [ -56.147755907409191, -23.519804376071079 ], [ -56.147497524990797, -23.526625664542792 ], [ -56.145172085023717, -23.535307305887443 ], [ -56.140133633260575, -23.548484795736726 ], [ -56.132020432696777, -23.565279635846537 ], [ -56.114140387868588, -23.594580173136478 ], [ -56.101686366632521, -23.607292575891677 ], [ -56.091557787162117, -23.614010511575827 ], [ -56.086441820133871, -23.613907158788322 ], [ -56.08086076511222, -23.611168307671278 ], [ -56.065538703348466, -23.599489434589714 ], [ -56.058562385245864, -23.595148613917388 ], [ -56.047296922415057, -23.590032646889142 ], [ -56.0419484122894, -23.586622003102946 ], [ -56.038382737972995, -23.581867771280599 ], [ -56.036005622061793, -23.575511569903028 ], [ -56.034791226134189, -23.566726575770872 ], [ -56.035230474806554, -23.552205498784758 ], [ -56.034119431666454, -23.546882826181502 ], [ -56.030036994311843, -23.543833916701885 ], [ -56.021148648291501, -23.540423272016369 ], [ -55.960041265691871, -23.529209486928266 ], [ -55.946243659117556, -23.528796074878983 ], [ -55.936244269057738, -23.530191338859197 ], [ -55.933634610049182, -23.533912041907229 ], [ -55.933479580418293, -23.538717949673639 ], [ -55.935830857907774, -23.550138442135392 ], [ -55.9367093570512, -23.56300587272284 ], [ -55.933092006790673, -23.59985116979567 ], [ -55.933763801258408, -23.605742283179836 ], [ -55.935107388395238, -23.611271660458783 ], [ -55.94190283934455, -23.625792739243536 ], [ -55.947948980561023, -23.633905938008638 ], [ -55.958620165088519, -23.644654636002656 ], [ -55.980892707432474, -23.672043144475538 ], [ -55.982830572872615, -23.676280613259678 ], [ -55.98236548487921, -23.681189873813651 ], [ -55.977533738691079, -23.696641126786574 ], [ -55.974639858842409, -23.720980726679215 ], [ -55.975001594048308, -23.74666391370863 ], [ -55.975673386717403, -23.752813408611928 ], [ -55.977172004384499, -23.758291110846073 ], [ -55.981461148213384, -23.768212985640787 ], [ -55.998876105048225, -23.798236992443265 ], [ -56.004198777651482, -23.815031833452338 ], [ -56.006110805569222, -23.818442478137854 ], [ -56.008307054327076, -23.820612887574725 ], [ -56.042025925755866, -23.843505547542975 ], [ -56.051327683825548, -23.847226250591007 ], [ -56.05907914918339, -23.848518161783716 ], [ -55.997532517911338, -23.999826755100685 ], [ -55.992364874939028, -24.022719415068934 ], [ -55.994147711647543, -24.029850762802482 ], [ -56.000400560237665, -24.028455498822211 ], [ -56.002906867358035, -24.028300470090642 ], [ -56.007299363974482, -24.028455498822211 ], [ -56.011459316594198, -24.030005791534052 ], [ -56.015877651632309, -24.032486261132021 ], [ -56.030915492555948, -24.046077162131326 ], [ -56.043576219367026, -24.061890151209525 ], [ -56.066313848805066, -24.0821989887923 ], [ -56.07912960524709, -24.097908624183674 ], [ -56.08313452823586, -24.101009209607355 ], [ -56.088224656842442, -24.103179619943489 ], [ -56.112590095156747, -24.108192234184287 ], [ -56.11768022286401, -24.110465997307927 ], [ -56.122124396323841, -24.113101494738203 ], [ -56.126361864208661, -24.116202081061203 ], [ -56.145792201748691, -24.140386650423579 ], [ -56.148841112127627, -24.14539926466432 ], [ -56.153543667106533, -24.160798841693179 ], [ -56.152613491119723, -24.18301970809307 ], [ -56.158504605403209, -24.229786879061237 ], [ -56.158478766082169, -24.248855483194006 ], [ -56.156592576586149, -24.26161956099395 ], [ -56.135043503754673, -24.278672783522154 ], [ -56.129565803319167, -24.284253838543805 ], [ -56.125431688221852, -24.293503919770103 ], [ -56.122822028313976, -24.304717705757525 ], [ -56.118507046063314, -24.337325534945478 ], [ -56.114372931865319, -24.352776787918458 ], [ -56.109024420840342, -24.364869073049306 ], [ -56.10339168987457, -24.374480889481447 ], [ -56.096441210193689, -24.38249073725774 ], [ -56.088017951267432, -24.389983819297811 ], [ -56.079853074759569, -24.395203139113562 ], [ -56.070654670376712, -24.399337254210934 ], [ -56.051870287084057, -24.405228366695781 ], [ -56.044299688879505, -24.408690688224681 ], [ -56.03846025233878, -24.413651624722718 ], [ -56.033809374203258, -24.419801120525278 ], [ -56.013112962093544, -24.463726087588896 ], [ -55.960092943434574, -24.531525566551636 ], [ -55.93862138496894, -24.571626478679036 ], [ -55.924203660770331, -24.613277682618957 ], [ -55.913609992407203, -24.635033461025387 ], [ -55.902447883263221, -24.64898609812991 ], [ -55.872888962655509, -24.666039320658115 ], [ -55.856119960967419, -24.678803398458058 ], [ -55.836818813737239, -24.697716973859258 ], [ -55.827930466817577, -24.720764661659814 ], [ -55.8206957671959, -24.735182386757742 ], [ -55.814236213030824, -24.745672703232685 ], [ -55.804262661392727, -24.753630873266218 ], [ -55.750829229785097, -24.782673028137765 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-5", "NAME_1": "Caaguazú" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -56.045746628803897, -24.971498712095865 ], [ -56.03711666520195, -24.964367363463055 ], [ -56.028435024756561, -24.952791843169052 ], [ -55.984561733637065, -24.873468519856317 ], [ -55.969911465441783, -24.857087090896528 ], [ -55.949370082962957, -24.841945896286063 ], [ -55.868909878088402, -24.811508476534982 ], [ -55.750829229785097, -24.782673028137765 ], [ -55.724474250086587, -24.753320814903702 ], [ -55.696310594358408, -24.713168226832181 ], [ -55.682151251678931, -24.698543796159242 ], [ -55.632361008753549, -24.663507175116024 ], [ -55.522806973063325, -24.555710137712708 ], [ -55.509784511945668, -24.548888849240996 ], [ -55.489682379937904, -24.542791030281819 ], [ -55.227527838838682, -24.50217335421695 ], [ -55.253443569864828, -24.535866388123338 ], [ -55.283803474350862, -24.568680921986982 ], [ -55.288531866852168, -24.575502210458637 ], [ -55.291580777231104, -24.583718763809884 ], [ -55.292976040311999, -24.593433933029587 ], [ -55.291606614753448, -24.608420098908425 ], [ -55.285586310160056, -24.630692641252381 ], [ -55.284320238288387, -24.64092457351029 ], [ -55.285431281428487, -24.649451186123372 ], [ -55.2961024641574, -24.666659438282466 ], [ -55.300210740832995, -24.676219577871223 ], [ -55.298892992117885, -24.717250665086112 ], [ -55.301037564032356, -24.729187920586071 ], [ -55.307703822873123, -24.741021824197844 ], [ -55.31480933308427, -24.746809583895185 ], [ -55.322405767911846, -24.751460462930027 ], [ -55.326359015855871, -24.757661634676708 ], [ -55.328451910926958, -24.768565362301615 ], [ -55.323930223101286, -24.78737558401599 ], [ -55.31519690581257, -24.811198419071786 ], [ -55.314654304352644, -24.820086765092128 ], [ -55.316204597064484, -24.829130140743416 ], [ -55.326565721430882, -24.843702894572914 ], [ -55.333180305226904, -24.850420831156441 ], [ -55.334110480314393, -24.860962822676129 ], [ -55.333542040432803, -24.867835788890545 ], [ -55.331733364403249, -24.873985283793843 ], [ -55.329769659642068, -24.878739515616132 ], [ -55.328581102136127, -24.884062188219389 ], [ -55.328296882195332, -24.890418389597016 ], [ -55.329769659642068, -24.906024672200886 ], [ -55.329614630910498, -24.912794284728477 ], [ -55.328426073404557, -24.918530368481697 ], [ -55.326720751061828, -24.92364633551 ], [ -55.326203986224982, -24.92995086004413 ], [ -55.326591558953282, -24.938012383764487 ], [ -55.330338101322297, -24.950156344839456 ], [ -55.329717983698004, -24.959664808484149 ], [ -55.327521734940092, -24.965917657074215 ], [ -55.315041877080944, -24.981989027671489 ], [ -55.310235969314533, -24.990929049635952 ], [ -55.306463589423117, -25.000075778974008 ], [ -55.302071091907351, -25.010152682500291 ], [ -55.29935808011129, -25.014338473541727 ], [ -55.296257493788289, -25.018214207119968 ], [ -55.289126146054798, -25.025293878010075 ], [ -55.284940355013362, -25.028291110646251 ], [ -55.280237800034456, -25.031081637707416 ], [ -55.274630906591085, -25.033045342468597 ], [ -55.268481410788468, -25.034440605549491 ], [ -55.26158260795097, -25.034957371285657 ], [ -55.254993862576669, -25.034905693542953 ], [ -55.23675208164326, -25.032580254475192 ], [ -55.230964321945919, -25.033510430462002 ], [ -55.226080898914347, -25.035577488010688 ], [ -55.222205166235426, -25.038936455852763 ], [ -55.218717007184125, -25.042657158900738 ], [ -55.214841275404524, -25.045757745223739 ], [ -55.210061205160457, -25.047463066667206 ], [ -55.204557665403911, -25.047463066667206 ], [ -55.198821580751371, -25.04679127399811 ], [ -55.193292201673785, -25.046636243467844 ], [ -55.188693000381647, -25.048548272284961 ], [ -55.185359870061973, -25.052062269757926 ], [ -55.179546271043591, -25.059968763847394 ], [ -55.098956874959811, -25.1294218892088 ], [ -55.015008511033955, -25.184508965416398 ], [ -55.011081102410913, -25.187919610101915 ], [ -55.008290575349747, -25.191950371512462 ], [ -55.007722133669517, -25.197686456165002 ], [ -55.008445604081373, -25.203784275124178 ], [ -55.014595098984614, -25.223214613563584 ], [ -55.014465907775389, -25.228330579692511 ], [ -55.012373012704359, -25.232568047577331 ], [ -55.009169073593853, -25.236288750625363 ], [ -55.005396694601757, -25.239130954529912 ], [ -55.000125697942622, -25.241921481591078 ], [ -54.973434820560499, -25.251533298023276 ], [ -54.969016486421708, -25.254323825983761 ], [ -54.966096768151317, -25.258406264237692 ], [ -54.965037400955282, -25.263625584053443 ], [ -54.967311164078978, -25.281712334456699 ], [ -54.967414516866427, -25.287810153415876 ], [ -54.966277635304607, -25.293236178806637 ], [ -54.964107224968473, -25.297938734684863 ], [ -54.961368373851371, -25.302331231301309 ], [ -54.955063849317185, -25.310496107809115 ], [ -54.952531703775094, -25.314888603526242 ], [ -54.950645515178394, -25.319849541822919 ], [ -54.949611986404022, -25.325327244057064 ], [ -54.949405279929692, -25.337729587550427 ], [ -54.972117071845389, -25.343982436140493 ], [ -54.998627082074165, -25.343310641672758 ], [ -55.024155238573371, -25.339899997886619 ], [ -55.037591111740426, -25.318402601898583 ], [ -55.039399786870661, -25.304760024055895 ], [ -55.043223842706198, -25.293442885280911 ], [ -55.051052822429824, -25.284709567992195 ], [ -55.065057136377732, -25.279283542601434 ], [ -55.082162034850001, -25.276337985909322 ], [ -55.090120204883533, -25.273805841266551 ], [ -55.098026698972944, -25.268896579813315 ], [ -55.104202033197282, -25.262385348804798 ], [ -55.113813848730103, -25.248277682968705 ], [ -55.120144211686011, -25.242128188065408 ], [ -55.1195499333827, -25.252618503641031 ], [ -55.114098069570275, -25.272410577286337 ], [ -55.113193732005129, -25.282074069662599 ], [ -55.124304165205047, -25.282797540074398 ], [ -55.137068243904309, -25.280007013013233 ], [ -55.160916918281146, -25.271945489292875 ], [ -55.171278041748224, -25.266726169477124 ], [ -55.196806200046069, -25.243471775202238 ], [ -55.215332200920329, -25.2315861956464 ], [ -55.226830206848547, -25.231276137283885 ], [ -55.25641496407934, -25.261300144086363 ], [ -55.489243130366162, -25.555597425480812 ], [ -55.505676236169336, -25.579006850285907 ], [ -55.507769131240423, -25.591357516935886 ], [ -55.507484911299628, -25.596008395970728 ], [ -55.509629483214098, -25.603294772435788 ], [ -55.514435390980509, -25.6100643858627 ], [ -55.52386634025936, -25.619986260657413 ], [ -55.529344041594243, -25.627169285234345 ], [ -55.538826666817215, -25.634403984856021 ], [ -55.550117967170422, -25.640398451027693 ], [ -55.59923641562807, -25.657606703186786 ], [ -55.624635382716747, -25.650320325822406 ], [ -55.636236742331789, -25.637349541548133 ], [ -55.641533575614005, -25.635489189574457 ], [ -55.650447760955387, -25.634972425636931 ], [ -55.710650804191232, -25.657761732817733 ], [ -55.771215582633033, -25.674659925714991 ], [ -55.80273820710255, -25.678483981550528 ], [ -55.828188849235971, -25.676830336051182 ], [ -55.841547207137864, -25.67000904668015 ], [ -55.854285448314783, -25.659777113522978 ], [ -55.875136888256804, -25.636832777610607 ], [ -55.886454027031732, -25.626342462034984 ], [ -55.899967413665195, -25.617505791958706 ], [ -55.920405443356515, -25.609961033075194 ], [ -55.938776414599829, -25.607118829170645 ], [ -56.046134203330837, -25.609806003444305 ], [ -56.061533780359696, -25.607118829170645 ], [ -56.073755255800393, -25.601641126936443 ], [ -56.082049322618161, -25.594044692108866 ], [ -56.093185594239799, -25.588463637087159 ], [ -56.174007534320253, -25.58562143318261 ], [ -56.203359747554316, -25.580815524516822 ], [ -56.218035855070639, -25.580247083735912 ], [ -56.246225349220481, -25.582520846859609 ], [ -56.359060838386995, -25.577766615936582 ], [ -56.378827073610523, -25.579471938279312 ], [ -56.395957811403889, -25.584277846045779 ], [ -56.42618852378132, -25.601744479723948 ], [ -56.437634853765474, -25.606240330027219 ], [ -56.450631475562147, -25.609650973813416 ], [ -56.481999071300095, -25.614611912110036 ], [ -56.49907813225002, -25.620296319019928 ], [ -56.512488166095977, -25.628099461221154 ], [ -56.559952969054279, -25.668768813230145 ], [ -56.569952359114097, -25.674453220139981 ], [ -56.62509111216508, -25.698482760770787 ], [ -56.646795212828806, -25.710368341225944 ], [ -56.678989630866738, -25.706492607647704 ], [ -56.68482906830684, -25.703908787060868 ], [ -56.693278163856178, -25.699257908026027 ], [ -56.714930588575783, -25.674298190509091 ], [ -56.746324021836131, -25.653472588988791 ], [ -56.749915533674937, -25.645721123630949 ], [ -56.750716519351897, -25.643395684563188 ], [ -56.808619961042382, -25.535030205479586 ], [ -56.813839280858133, -25.522317803623764 ], [ -56.814743618423222, -25.512964368710641 ], [ -56.809265917088396, -25.506143080238985 ], [ -56.56380286331148, -25.349253431900365 ], [ -56.5437782456695, -25.286983331115835 ], [ -56.494504766681644, -25.021728203693669 ], [ -56.421692674377425, -24.953360283949962 ], [ -56.411176520380081, -24.946849053840765 ], [ -56.380687424684879, -24.93150115275597 ], [ -56.370739712367822, -24.922147718742224 ], [ -56.363298306271815, -24.910623875291606 ], [ -56.358750780024479, -24.900288587548289 ], [ -56.352678798587704, -24.89026335996607 ], [ -56.342110968646296, -24.881736749151628 ], [ -56.298806118307709, -24.858534030820863 ], [ -56.285680305301867, -24.846235040115005 ], [ -56.276559414385474, -24.832489108585492 ], [ -56.271675991353902, -24.820448500298028 ], [ -56.264932217248031, -24.808097832748786 ], [ -56.256663987952663, -24.797814222748173 ], [ -56.247129685886307, -24.788667494309436 ], [ -56.236329311948168, -24.78334482170618 ], [ -56.227260097875217, -24.784274997692989 ], [ -56.214496019175954, -24.794713636425172 ], [ -56.210155199402948, -24.80685759929878 ], [ -56.209380052147708, -24.817606295494159 ], [ -56.213436651979919, -24.832954196578896 ], [ -56.214315152022664, -24.840240573943333 ], [ -56.213591681610808, -24.848405449551876 ], [ -56.210775316127922, -24.855691826916257 ], [ -56.20377315870428, -24.862564793130673 ], [ -56.193773770443158, -24.868920993608981 ], [ -56.147885097719097, -24.884785657731925 ], [ -56.14155473476319, -24.888092949629936 ], [ -56.134965990288208, -24.893002211083171 ], [ -56.1008853827542, -24.928193861757336 ], [ -56.054428270148549, -24.967881361835396 ], [ -56.045746628803897, -24.971498712095865 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-3", "NAME_1": "Cordillera" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -56.494504766681644, -25.021728203693669 ], [ -56.5437782456695, -25.286983331115835 ], [ -56.56380286331148, -25.349253431900365 ], [ -56.809265917088396, -25.506143080238985 ], [ -56.814743618423222, -25.512964368710641 ], [ -56.813839280858133, -25.522317803623764 ], [ -56.808619961042382, -25.535030205479586 ], [ -56.750716519351897, -25.643395684563188 ], [ -56.749915533674937, -25.645721123630949 ], [ -56.746324021836131, -25.653472588988791 ], [ -56.788078578563557, -25.638589775897458 ], [ -56.795494147137163, -25.637452895234901 ], [ -56.806010301134506, -25.637039483185617 ], [ -56.817069058390302, -25.642000420582974 ], [ -56.826525845191611, -25.647736505235514 ], [ -56.833631353604062, -25.653110853782891 ], [ -56.839961716559969, -25.656883232774987 ], [ -56.84709306519278, -25.660242200617063 ], [ -56.854508632867123, -25.662102552590738 ], [ -56.861459113447324, -25.662670994270968 ], [ -56.892103237874096, -25.660655612666403 ], [ -56.90031979032608, -25.658278496755202 ], [ -56.907451138059571, -25.654351088132216 ], [ -56.910319180385841, -25.647736505235514 ], [ -56.909595709974042, -25.643860771657273 ], [ -56.9060558740793, -25.640088392665177 ], [ -56.893498500955047, -25.630063165083016 ], [ -56.881354539880078, -25.617815851220541 ], [ -56.878460659132088, -25.612751560136417 ], [ -56.877323777570268, -25.608100681101575 ], [ -56.877504644723558, -25.603708184485129 ], [ -56.878874071181428, -25.599780775862143 ], [ -56.884997727663006, -25.587843519462865 ], [ -56.88776241720177, -25.580350436523418 ], [ -56.893059252282683, -25.554977308755781 ], [ -56.896702440065553, -25.54650237388546 ], [ -56.9025935525504, -25.539422702995353 ], [ -56.915486823358208, -25.536735527822373 ], [ -56.925796270881165, -25.536425469459857 ], [ -57.000210333639984, -25.540507907713788 ], [ -57.0085819157228, -25.539836114145373 ], [ -57.026358608662861, -25.536425469459857 ], [ -57.049483811728521, -25.529294121726366 ], [ -57.0614210681278, -25.527278741021064 ], [ -57.088163622353306, -25.52609018261586 ], [ -57.103511521639405, -25.516323337452036 ], [ -57.112606574134077, -25.508468520206065 ], [ -57.161750861013445, -25.425321140158474 ], [ -57.182111376338923, -25.395038750937601 ], [ -57.193402675792868, -25.38366993621861 ], [ -57.199681362804654, -25.383049818594259 ], [ -57.204099696943445, -25.384186700156079 ], [ -57.209344855180916, -25.387442315210706 ], [ -57.216295335761117, -25.393333428594872 ], [ -57.220093553174934, -25.395813897293522 ], [ -57.226217210555831, -25.397312514061298 ], [ -57.233090175870927, -25.397364190005362 ], [ -57.240144009238634, -25.394832044463271 ], [ -57.246629400926111, -25.39018116542843 ], [ -57.256628790985928, -25.377830498778508 ], [ -57.291303676823247, -25.320262952972882 ], [ -57.297479011047528, -25.301039321007863 ], [ -57.300243699686973, -25.286053155129025 ], [ -57.305669725077735, -25.273237399586321 ], [ -57.318227098201987, -25.255925794639722 ], [ -57.348509488322236, -25.225850111893124 ], [ -57.379153611849688, -25.178101088094763 ], [ -57.388791265804286, -25.169367770805991 ], [ -57.429021369140855, -25.145906670956094 ], [ -57.432251145773762, -25.143064467051488 ], [ -57.454988776111122, -25.112472018568781 ], [ -57.422277595034984, -25.112472018568781 ], [ -57.414862027360641, -25.10823455158328 ], [ -57.396206835277212, -25.089424329868905 ], [ -57.387835252295076, -25.085186862883404 ], [ -57.377965054343804, -25.083326510909728 ], [ -57.366131150732031, -25.078520603143318 ], [ -57.354116379966968, -25.07200937303412 ], [ -57.34375525560057, -25.064671318826299 ], [ -57.295334439133057, -25.006018569201615 ], [ -57.285386725017361, -24.982454115664893 ], [ -57.261873949223343, -24.980025322910308 ], [ -57.234666307004431, -24.986433201131319 ], [ -57.213427294334167, -24.988965345774091 ], [ -57.195030483769813, -25.000592542911534 ], [ -57.129763150349106, -25.027929375440351 ], [ -57.095605028449313, -25.037127780722528 ], [ -57.076872321100723, -25.038936455852763 ], [ -57.058708055432419, -25.037592868715933 ], [ -57.038605923424598, -25.031081637707416 ], [ -57.027702195799691, -25.02405364276143 ], [ -57.022172817621424, -25.018059176589702 ], [ -57.020312465647748, -25.013098240091722 ], [ -57.019769863288559, -25.008757419419396 ], [ -57.019873216076064, -25.004881686740475 ], [ -57.021552699997073, -24.998370456631278 ], [ -57.021966112046414, -24.994856459158257 ], [ -57.021578539318114, -24.989533786555 ], [ -57.02038998091291, -24.983746025958339 ], [ -57.018607144204339, -24.980283704429439 ], [ -57.015351529149768, -24.976873060643243 ], [ -57.006178962289255, -24.971447035252481 ], [ -56.998401659409069, -24.96777800904789 ], [ -56.984810756611125, -24.963747246738023 ], [ -56.826965094763295, -24.936823826258603 ], [ -56.772188076018892, -24.922406101160618 ], [ -56.704724493840331, -24.915274753427127 ], [ -56.689273240867351, -24.916980075769857 ], [ -56.595738898031698, -24.951344903244717 ], [ -56.578608161137709, -24.961835218820283 ], [ -56.54163367375503, -24.999972426186503 ], [ -56.536621060413609, -25.002917982878614 ], [ -56.531866827691942, -25.006587009083205 ], [ -56.494504766681644, -25.021728203693669 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-6", "NAME_1": "Caazapá" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -55.59923641562807, -25.657606703186786 ], [ -55.550117967170422, -25.640398451027693 ], [ -55.538826666817215, -25.634403984856021 ], [ -55.529344041594243, -25.627169285234345 ], [ -55.52386634025936, -25.619986260657413 ], [ -55.514435390980509, -25.6100643858627 ], [ -55.509629483214098, -25.603294772435788 ], [ -55.507484911299628, -25.596008395970728 ], [ -55.507769131240423, -25.591357516935886 ], [ -55.505676236169336, -25.579006850285907 ], [ -55.489243130366162, -25.555597425480812 ], [ -55.453405523645984, -25.546347345153833 ], [ -55.444103765576301, -25.54707081466637 ], [ -55.430331997423707, -25.550481458452566 ], [ -55.425371060026407, -25.555339043961737 ], [ -55.422968105693542, -25.561333510133409 ], [ -55.422761400118532, -25.568826593072799 ], [ -55.421030239354081, -25.577249851099737 ], [ -55.416999477943534, -25.58660328511354 ], [ -55.403977016825877, -25.602209567717352 ], [ -55.399532844265366, -25.608875827457496 ], [ -55.39821509465088, -25.616265557609381 ], [ -55.400049608202835, -25.622983494192908 ], [ -55.405966559109402, -25.630941664226441 ], [ -55.431339687776358, -25.651870618534247 ], [ -55.43891028508159, -25.662205906277563 ], [ -55.444853075309197, -25.675745130433427 ], [ -55.446300015233533, -25.698327732039218 ], [ -55.449684820598009, -25.712125338613475 ], [ -55.465394456888646, -25.756308688994807 ], [ -55.469761115083372, -25.765662123008553 ], [ -55.475988125251774, -25.77274179479798 ], [ -55.496865403615459, -25.788813164495934 ], [ -55.499888474673355, -25.79258554528667 ], [ -55.51962887237454, -25.832324721308851 ], [ -55.526191779327121, -25.850256442980481 ], [ -55.526295132114626, -25.860746758556047 ], [ -55.521101650720595, -25.868859959119845 ], [ -55.516218227689023, -25.87506112996715 ], [ -55.513169318209464, -25.884879652873678 ], [ -55.516528286051539, -25.895938409230212 ], [ -55.516166550845639, -25.905705255293299 ], [ -55.509577806370658, -25.925910740088568 ], [ -55.509655320736442, -25.935264174102372 ], [ -55.513117642265399, -25.962756036262078 ], [ -55.509629483214098, -25.97355641020016 ], [ -55.503867560139781, -25.981359551502123 ], [ -55.499165005160876, -25.984563490612629 ], [ -55.45779802116175, -25.999704685223037 ], [ -55.444387987315736, -26.006267592175618 ], [ -55.436455654804604, -26.00905811923684 ], [ -55.429014247809278, -26.010298353586165 ], [ -55.41575924269489, -26.004407241101319 ], [ -55.407361823089673, -26.003167005852617 ], [ -55.383203091249641, -26.004045504996043 ], [ -55.354677700315619, -26.002391859496697 ], [ -55.337004361062384, -25.999291274073016 ], [ -55.305275031017857, -25.990661309571806 ], [ -55.29933224079025, -25.991591484659295 ], [ -55.293337774618578, -25.995673922913227 ], [ -55.289126146054798, -25.999911390798047 ], [ -55.285715502268602, -26.004045504996043 ], [ -55.280392828766026, -26.009368177599299 ], [ -55.274036628287774, -26.013864027902571 ], [ -55.266104294877323, -26.016499526232167 ], [ -55.246880662912247, -26.017894789313061 ], [ -55.239387579972856, -26.019703463544033 ], [ -55.232979701751844, -26.023114109128812 ], [ -55.226675178116977, -26.030503839280755 ], [ -55.226390957276863, -26.038875420464308 ], [ -55.230938482624879, -26.048228854478054 ], [ -55.23920671192019, -26.05546355589837 ], [ -55.291451585122559, -26.083317153264034 ], [ -55.304370694352031, -26.080940036453512 ], [ -55.308220587709968, -26.078976331692331 ], [ -55.312096320388889, -26.077581068611437 ], [ -55.31558447944019, -26.078666274229192 ], [ -55.317754889776324, -26.081766859652873 ], [ -55.31938269685395, -26.089673353742285 ], [ -55.319331020909885, -26.096287936638987 ], [ -55.320312872840816, -26.102334079654042 ], [ -55.322560798442112, -26.109155369025075 ], [ -55.324162767098017, -26.117320244633561 ], [ -55.323180915167086, -26.165172621219483 ], [ -55.325971442228251, -26.173699232933245 ], [ -55.331991746821643, -26.182639254897708 ], [ -55.340130784907785, -26.19116586661147 ], [ -55.381601121694416, -26.227649427579024 ], [ -55.465704515251161, -26.287439059664848 ], [ -55.483791265654361, -26.296585789002961 ], [ -55.551668259882263, -26.319736829591022 ], [ -55.572468023880162, -26.323199151119923 ], [ -55.586136441043891, -26.324129327106789 ], [ -55.6001924300366, -26.321132093571237 ], [ -55.617865770189155, -26.320873712052162 ], [ -55.63876888697456, -26.322992445544912 ], [ -55.681066046960495, -26.334154554688951 ], [ -55.739873827115446, -26.356892185026311 ], [ -55.750415818635133, -26.36846770621969 ], [ -55.758916591927175, -26.388466484540629 ], [ -55.765737881298151, -26.396217949898471 ], [ -55.784548102113206, -26.410428968522069 ], [ -55.831108568405682, -26.4549740541093 ], [ -55.847050746894467, -26.464637545586243 ], [ -55.864620734259461, -26.471975599794121 ], [ -55.933918829989977, -26.483447768199937 ], [ -55.984070808121317, -26.498020522029492 ], [ -55.99895362031333, -26.508200779242543 ], [ -56.021071133026339, -26.538379814776647 ], [ -56.025954556057911, -26.548146660839734 ], [ -56.035230474806554, -26.572589613519824 ], [ -56.044868129660472, -26.585922133000054 ], [ -56.056495326797858, -26.59796274218678 ], [ -56.070913051895843, -26.608814792968303 ], [ -56.07933630992278, -26.617444756570251 ], [ -56.085589159412166, -26.626746514639933 ], [ -56.094865078160808, -26.657752374272661 ], [ -56.102383998622656, -26.665142103525284 ], [ -56.118352017331745, -26.671291598428525 ], [ -56.148970303336796, -26.675529067212665 ], [ -56.209922655406217, -26.69335743609679 ], [ -56.295679693562988, -26.734956964092646 ], [ -56.411667446795207, -26.775626316101636 ], [ -56.428720669323411, -26.775988051307536 ], [ -56.444352790349001, -26.77257740662202 ], [ -56.459235601641694, -26.763895766176688 ], [ -56.490422329327032, -26.740641371002482 ], [ -56.496907721913828, -26.737282403160407 ], [ -56.572251959760138, -26.722399590968337 ], [ -56.574215663621999, -26.713872979254575 ], [ -56.573957282102867, -26.711547540186814 ], [ -56.572717047753542, -26.706586601890194 ], [ -56.568143683084486, -26.695941256683625 ], [ -56.565973272748352, -26.687311293081734 ], [ -56.567936978408795, -26.678629652636346 ], [ -56.576592780432463, -26.670361422441715 ], [ -56.593620165438267, -26.665762221149578 ], [ -56.625142788109201, -26.665297133156173 ], [ -56.639663865994635, -26.662558282039072 ], [ -56.654495002242527, -26.656460463079895 ], [ -56.696895515016024, -26.630777276050424 ], [ -56.713380295863942, -26.61703134452091 ], [ -56.731802944850017, -26.59010792404149 ], [ -56.73978695330527, -26.575896904518515 ], [ -56.748597784959827, -26.563649590656098 ], [ -56.754488898343993, -26.557138359647581 ], [ -56.783427700428035, -26.540756930687792 ], [ -56.773428311267537, -26.518277682768826 ], [ -56.759449835741293, -26.507580661618249 ], [ -56.74746090429727, -26.500500990728142 ], [ -56.728237271432931, -26.485514824849304 ], [ -56.719607306931664, -26.473732598980234 ], [ -56.715188971893554, -26.461175225855982 ], [ -56.714103766275798, -26.449909763025119 ], [ -56.710202196074476, -26.438334241831797 ], [ -56.704052700271916, -26.430272719010759 ], [ -56.690771856735807, -26.417973728304901 ], [ -56.68617265544367, -26.407380059941829 ], [ -56.685164964191756, -26.397716566666247 ], [ -56.687542080102901, -26.388776543802464 ], [ -56.688162196827932, -26.379216404213707 ], [ -56.686301845753576, -26.373015231567706 ], [ -56.682581142705544, -26.367847588595339 ], [ -56.66193640833859, -26.354463393171045 ], [ -56.657130499672803, -26.346815280600708 ], [ -56.654598355030032, -26.337823581792861 ], [ -56.651084356657748, -26.301856784762833 ], [ -56.640826585978175, -26.264339695020908 ], [ -56.633385178982792, -26.25260914509596 ], [ -56.598865321877099, -26.216849053640942 ], [ -56.594033575688968, -26.207909030777159 ], [ -56.586514655227177, -26.175869643269436 ], [ -56.554320238088508, -26.176024672001006 ], [ -56.529076300630777, -26.178815199062171 ], [ -56.514916957951243, -26.17380258572075 ], [ -56.506597052711811, -26.165482679581999 ], [ -56.499775764240098, -26.121351006943428 ], [ -56.493316210075022, -26.104349461258607 ], [ -56.482567512081005, -26.087813001768609 ], [ -56.471999681240277, -26.080061537310087 ], [ -56.457762824194958, -26.076030775899596 ], [ -56.408876918834721, -26.074067071138415 ], [ -56.392469652352588, -26.068744398535159 ], [ -56.384330614266446, -26.061044610020758 ], [ -56.38037736722174, -26.049934176820784 ], [ -56.378749559244739, -26.037996920421563 ], [ -56.375183884928333, -26.026473076970944 ], [ -56.367148199629696, -26.013967379790756 ], [ -56.358905808756049, -26.010246676742725 ], [ -56.352368740225188, -26.01040170727299 ], [ -56.345857510115991, -26.013967379790756 ], [ -56.338829515170005, -26.015672703032806 ], [ -56.329476081156201, -26.015207615039401 ], [ -56.280280117433449, -25.995570571025041 ], [ -56.265733202025672, -25.9920565726527 ], [ -56.253821784048114, -25.991901543921131 ], [ -56.245579393174467, -25.995673922913227 ], [ -56.240928514139625, -25.998464450873712 ], [ -56.213488328823303, -26.018773288456487 ], [ -56.173800828745243, -26.042182713261582 ], [ -56.155248989449319, -26.043991387492554 ], [ -56.098895839571355, -26.018514906937412 ], [ -56.074116991006349, -26.003425388271069 ], [ -56.072437507085283, -26.001151625147372 ], [ -56.071429815833312, -25.999446302804643 ], [ -56.068355068831352, -25.991126396665891 ], [ -56.047374436780842, -25.91381845495772 ], [ -56.042413500282805, -25.904413344100533 ], [ -56.033499314941423, -25.894026381312472 ], [ -56.020941941817171, -25.888807060597344 ], [ -55.988179083897592, -25.880435478514528 ], [ -55.975415005198329, -25.873304131680356 ], [ -55.956630621905674, -25.858317965801461 ], [ -55.9447708807715, -25.853563734878492 ], [ -55.908881599006577, -25.846742445507459 ], [ -55.897719488963219, -25.842039889629177 ], [ -55.873069830708118, -25.824779961526019 ], [ -55.859685635283824, -25.817493585060902 ], [ -55.770156216336318, -25.784162285461093 ], [ -55.756978725587715, -25.777392672933502 ], [ -55.751888596981132, -25.771811618811171 ], [ -55.74144995824895, -25.752174573897491 ], [ -55.734111904940448, -25.743286227877093 ], [ -55.71933244463662, -25.731555677952201 ], [ -55.709178025845233, -25.729075209253494 ], [ -55.699772914988046, -25.729695325978525 ], [ -55.690858731445303, -25.732382501151505 ], [ -55.681582810898021, -25.733105970664042 ], [ -55.669438848923733, -25.730057061184425 ], [ -55.66034379732838, -25.721530449470663 ], [ -55.654090948738315, -25.711505221888501 ], [ -55.641068487620601, -25.679465833481459 ], [ -55.633420375949584, -25.665513198175574 ], [ -55.630526496100913, -25.661275730290697 ], [ -55.624635382716747, -25.650320325822406 ], [ -55.59923641562807, -25.657606703186786 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-9", "NAME_1": "Paraguarí" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -56.746324021836131, -25.653472588988791 ], [ -56.714930588575783, -25.674298190509091 ], [ -56.693278163856178, -25.699257908026027 ], [ -56.68482906830684, -25.703908787060868 ], [ -56.678989630866738, -25.706492607647704 ], [ -56.646795212828806, -25.710368341225944 ], [ -56.663538376994495, -25.724579359849599 ], [ -56.670618048783922, -25.742562757465294 ], [ -56.672478399858278, -25.759099216055972 ], [ -56.671289842352337, -25.776565850633517 ], [ -56.665424567389891, -25.807106622272784 ], [ -56.655218471755063, -25.838319186581202 ], [ -56.648345506439966, -25.853512058035051 ], [ -56.64090410034396, -25.864984225541605 ], [ -56.617132941232228, -25.892837822907211 ], [ -56.608606330417786, -25.907823988786049 ], [ -56.599046189929709, -25.93557423246483 ], [ -56.599020352407308, -25.950508721500285 ], [ -56.603852097696119, -25.960792331500897 ], [ -56.613748134968432, -25.965546562423924 ], [ -56.656510382947829, -25.975106702912001 ], [ -56.663099128322131, -25.978517347597517 ], [ -56.668835212075351, -25.98533863696855 ], [ -56.669997932058891, -25.991539808715174 ], [ -56.669507004744446, -25.996965834105936 ], [ -56.668757696810246, -25.999136243542807 ], [ -56.663331672318805, -26.037221774964962 ], [ -56.659145881277368, -26.051691176006955 ], [ -56.653203091049818, -26.064713637124669 ], [ -56.586514655227177, -26.175869643269436 ], [ -56.594033575688968, -26.207909030777159 ], [ -56.598865321877099, -26.216849053640942 ], [ -56.633385178982792, -26.25260914509596 ], [ -56.640826585978175, -26.264339695020908 ], [ -56.651084356657748, -26.301856784762833 ], [ -56.654598355030032, -26.337823581792861 ], [ -56.657130499672803, -26.346815280600708 ], [ -56.66193640833859, -26.354463393171045 ], [ -56.682581142705544, -26.367847588595339 ], [ -56.686301845753576, -26.373015231567706 ], [ -56.688162196827932, -26.379216404213707 ], [ -56.687542080102901, -26.388776543802464 ], [ -56.685164964191756, -26.397716566666247 ], [ -56.68617265544367, -26.407380059941829 ], [ -56.690771856735807, -26.417973728304901 ], [ -56.704052700271916, -26.430272719010759 ], [ -56.710202196074476, -26.438334241831797 ], [ -56.714103766275798, -26.449909763025119 ], [ -56.715188971893554, -26.461175225855982 ], [ -56.719607306931664, -26.473732598980234 ], [ -56.728237271432931, -26.485514824849304 ], [ -56.74746090429727, -26.500500990728142 ], [ -56.759449835741293, -26.507580661618249 ], [ -56.773428311267537, -26.518277682768826 ], [ -56.783427700428035, -26.540756930687792 ], [ -56.819342820614679, -26.489803968678189 ], [ -56.828127813847516, -26.485979912842708 ], [ -56.840685186971768, -26.482259209794677 ], [ -56.852415737796036, -26.485308119274293 ], [ -56.871148444245307, -26.483189385781543 ], [ -56.889829474750456, -26.472750746150041 ], [ -56.922979906297655, -26.447997735107379 ], [ -56.944193081445519, -26.4349235980456 ], [ -57.0036209783255, -26.406863295104984 ], [ -57.010907354790561, -26.404537856037223 ], [ -57.019692348922774, -26.403039239269503 ], [ -57.029071621358241, -26.402832532795173 ], [ -57.039303555414733, -26.403969415256313 ], [ -57.049819709412077, -26.406449883954963 ], [ -57.057416144239653, -26.409343763803633 ], [ -57.063488124777109, -26.412289320495745 ], [ -57.079146084224419, -26.423399753695662 ], [ -57.090747442940142, -26.434406834108131 ], [ -57.100100876953888, -26.447377617483085 ], [ -57.10573360881898, -26.459469902613932 ], [ -57.108524135880145, -26.468771660683615 ], [ -57.112322354193282, -26.476006362103931 ], [ -57.117257453168918, -26.481484062539437 ], [ -57.128006151162936, -26.486134941574278 ], [ -57.133302985344471, -26.492491143851225 ], [ -57.136610277242482, -26.497400405304461 ], [ -57.138186408376043, -26.502051282540663 ], [ -57.142036301733924, -26.506185397637978 ], [ -57.149141811945071, -26.51145639429717 ], [ -57.163869595405515, -26.51662403726948 ], [ -57.172396206219958, -26.522618503441208 ], [ -57.178028937185672, -26.531765231879945 ], [ -57.179501716431048, -26.545046074516733 ], [ -57.179579229897513, -26.560342298758087 ], [ -57.181077846665289, -26.571866144007345 ], [ -57.187769944827096, -26.581632989171112 ], [ -57.200844081888874, -26.589436129573699 ], [ -57.252365484679387, -26.605714206645303 ], [ -57.340551317389384, -26.623232517166912 ], [ -57.367113002662961, -26.621010430886656 ], [ -57.38884294264767, -26.612173760810435 ], [ -57.404991827610729, -26.601890150809822 ], [ -57.431656866571132, -26.595482272588811 ], [ -57.445790370828945, -26.588816012848724 ], [ -57.455944789620332, -26.579720961253372 ], [ -57.462740240569644, -26.571349379170499 ], [ -57.476098599370857, -26.564993177792928 ], [ -57.54878150136517, -26.550627129538384 ], [ -57.562191535211184, -26.544167576272628 ], [ -57.569736294094696, -26.536106051652951 ], [ -57.575937465841378, -26.527372735263498 ], [ -57.582758755212353, -26.520758151467533 ], [ -57.60813188297999, -26.507477308830744 ], [ -57.614694789932628, -26.500500990728142 ], [ -57.618208788304912, -26.49352467172622 ], [ -57.62531429671742, -26.475747978786217 ], [ -57.630559454954891, -26.466291191984908 ], [ -57.636528082704842, -26.459366549826427 ], [ -57.64802608863306, -26.453578790129086 ], [ -57.654847378004092, -26.449237969456703 ], [ -57.671487189382276, -26.42820566146213 ], [ -57.70549028165118, -26.412496026070755 ], [ -57.685904913580885, -26.392187187588661 ], [ -57.664510871279674, -26.377304376295911 ], [ -57.652780321354726, -26.361698092792778 ], [ -57.614152187573382, -26.294105320304311 ], [ -57.481240403921504, -26.174319349658276 ], [ -57.476977097614963, -26.167188001924728 ], [ -57.475736864164958, -26.156852715980051 ], [ -57.503590460631244, -26.011073499942086 ], [ -57.456694099353172, -25.970610853508106 ], [ -57.433775600963202, -25.943997490491768 ], [ -57.407007209215351, -25.897798761203887 ], [ -57.40310563811471, -25.876094658741522 ], [ -57.40504350355485, -25.858421318588967 ], [ -57.42832373715072, -25.789950046057754 ], [ -57.429796516396095, -25.767625827769734 ], [ -57.425998298082959, -25.738118584904782 ], [ -57.413518439324491, -25.703598727799033 ], [ -57.402640550121305, -25.683496595791269 ], [ -57.390703293722027, -25.66830372523674 ], [ -57.355072394375497, -25.636884453554671 ], [ -57.32256791887437, -25.602622978867373 ], [ -57.238335334108399, -25.479684746853593 ], [ -57.231643235946592, -25.47208831112664 ], [ -57.202626918597389, -25.448368828858349 ], [ -57.161750861013445, -25.425321140158474 ], [ -57.112606574134077, -25.508468520206065 ], [ -57.103511521639405, -25.516323337452036 ], [ -57.088163622353306, -25.52609018261586 ], [ -57.0614210681278, -25.527278741021064 ], [ -57.049483811728521, -25.529294121726366 ], [ -57.026358608662861, -25.536425469459857 ], [ -57.0085819157228, -25.539836114145373 ], [ -57.000210333639984, -25.540507907713788 ], [ -56.925796270881165, -25.536425469459857 ], [ -56.915486823358208, -25.536735527822373 ], [ -56.9025935525504, -25.539422702995353 ], [ -56.896702440065553, -25.54650237388546 ], [ -56.893059252282683, -25.554977308755781 ], [ -56.88776241720177, -25.580350436523418 ], [ -56.884997727663006, -25.587843519462865 ], [ -56.878874071181428, -25.599780775862143 ], [ -56.877504644723558, -25.603708184485129 ], [ -56.877323777570268, -25.608100681101575 ], [ -56.878460659132088, -25.612751560136417 ], [ -56.881354539880078, -25.617815851220541 ], [ -56.893498500955047, -25.630063165083016 ], [ -56.9060558740793, -25.640088392665177 ], [ -56.909595709974042, -25.643860771657273 ], [ -56.910319180385841, -25.647736505235514 ], [ -56.907451138059571, -25.654351088132216 ], [ -56.90031979032608, -25.658278496755202 ], [ -56.892103237874096, -25.660655612666403 ], [ -56.861459113447324, -25.662670994270968 ], [ -56.854508632867123, -25.662102552590738 ], [ -56.84709306519278, -25.660242200617063 ], [ -56.839961716559969, -25.656883232774987 ], [ -56.833631353604062, -25.653110853782891 ], [ -56.826525845191611, -25.647736505235514 ], [ -56.817069058390302, -25.642000420582974 ], [ -56.806010301134506, -25.637039483185617 ], [ -56.795494147137163, -25.637452895234901 ], [ -56.788078578563557, -25.638589775897458 ], [ -56.746324021836131, -25.653472588988791 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "PY-4", "NAME_1": "Guairá" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -56.359060838386995, -25.577766615936582 ], [ -56.246225349220481, -25.582520846859609 ], [ -56.218035855070639, -25.580247083735912 ], [ -56.203359747554316, -25.580815524516822 ], [ -56.174007534320253, -25.58562143318261 ], [ -56.093185594239799, -25.588463637087159 ], [ -56.082049322618161, -25.594044692108866 ], [ -56.073755255800393, -25.601641126936443 ], [ -56.061533780359696, -25.607118829170645 ], [ -56.046134203330837, -25.609806003444305 ], [ -55.938776414599829, -25.607118829170645 ], [ -55.920405443356515, -25.609961033075194 ], [ -55.899967413665195, -25.617505791958706 ], [ -55.886454027031732, -25.626342462034984 ], [ -55.875136888256804, -25.636832777610607 ], [ -55.854285448314783, -25.659777113522978 ], [ -55.841547207137864, -25.67000904668015 ], [ -55.828188849235971, -25.676830336051182 ], [ -55.80273820710255, -25.678483981550528 ], [ -55.771215582633033, -25.674659925714991 ], [ -55.710650804191232, -25.657761732817733 ], [ -55.650447760955387, -25.634972425636931 ], [ -55.641533575614005, -25.635489189574457 ], [ -55.636236742331789, -25.637349541548133 ], [ -55.624635382716747, -25.650320325822406 ], [ -55.630526496100913, -25.661275730290697 ], [ -55.633420375949584, -25.665513198175574 ], [ -55.641068487620601, -25.679465833481459 ], [ -55.654090948738315, -25.711505221888501 ], [ -55.66034379732838, -25.721530449470663 ], [ -55.669438848923733, -25.730057061184425 ], [ -55.681582810898021, -25.733105970664042 ], [ -55.690858731445303, -25.732382501151505 ], [ -55.699772914988046, -25.729695325978525 ], [ -55.709178025845233, -25.729075209253494 ], [ -55.71933244463662, -25.731555677952201 ], [ -55.734111904940448, -25.743286227877093 ], [ -55.74144995824895, -25.752174573897491 ], [ -55.751888596981132, -25.771811618811171 ], [ -55.756978725587715, -25.777392672933502 ], [ -55.770156216336318, -25.784162285461093 ], [ -55.859685635283824, -25.817493585060902 ], [ -55.873069830708118, -25.824779961526019 ], [ -55.897719488963219, -25.842039889629177 ], [ -55.908881599006577, -25.846742445507459 ], [ -55.9447708807715, -25.853563734878492 ], [ -55.956630621905674, -25.858317965801461 ], [ -55.975415005198329, -25.873304131680356 ], [ -55.988179083897592, -25.880435478514528 ], [ -56.020941941817171, -25.888807060597344 ], [ -56.033499314941423, -25.894026381312472 ], [ -56.042413500282805, -25.904413344100533 ], [ -56.047374436780842, -25.91381845495772 ], [ -56.068355068831352, -25.991126396665891 ], [ -56.071429815833312, -25.999446302804643 ], [ -56.072437507085283, -26.001151625147372 ], [ -56.074116991006349, -26.003425388271069 ], [ -56.098895839571355, -26.018514906937412 ], [ -56.155248989449319, -26.043991387492554 ], [ -56.173800828745243, -26.042182713261582 ], [ -56.213488328823303, -26.018773288456487 ], [ -56.240928514139625, -25.998464450873712 ], [ -56.245579393174467, -25.995673922913227 ], [ -56.253821784048114, -25.991901543921131 ], [ -56.265733202025672, -25.9920565726527 ], [ -56.280280117433449, -25.995570571025041 ], [ -56.329476081156201, -26.015207615039401 ], [ -56.338829515170005, -26.015672703032806 ], [ -56.345857510115991, -26.013967379790756 ], [ -56.352368740225188, -26.01040170727299 ], [ -56.358905808756049, -26.010246676742725 ], [ -56.367148199629696, -26.013967379790756 ], [ -56.375183884928333, -26.026473076970944 ], [ -56.378749559244739, -26.037996920421563 ], [ -56.38037736722174, -26.049934176820784 ], [ -56.384330614266446, -26.061044610020758 ], [ -56.392469652352588, -26.068744398535159 ], [ -56.408876918834721, -26.074067071138415 ], [ -56.457762824194958, -26.076030775899596 ], [ -56.471999681240277, -26.080061537310087 ], [ -56.482567512081005, -26.087813001768609 ], [ -56.493316210075022, -26.104349461258607 ], [ -56.499775764240098, -26.121351006943428 ], [ -56.506597052711811, -26.165482679581999 ], [ -56.514916957951243, -26.17380258572075 ], [ -56.529076300630777, -26.178815199062171 ], [ -56.554320238088508, -26.176024672001006 ], [ -56.586514655227177, -26.175869643269436 ], [ -56.653203091049818, -26.064713637124669 ], [ -56.659145881277368, -26.051691176006955 ], [ -56.663331672318805, -26.037221774964962 ], [ -56.668757696810246, -25.999136243542807 ], [ -56.669507004744446, -25.996965834105936 ], [ -56.669997932058891, -25.991539808715174 ], [ -56.668835212075351, -25.98533863696855 ], [ -56.663099128322131, -25.978517347597517 ], [ -56.656510382947829, -25.975106702912001 ], [ -56.613748134968432, -25.965546562423924 ], [ -56.603852097696119, -25.960792331500897 ], [ -56.599020352407308, -25.950508721500285 ], [ -56.599046189929709, -25.93557423246483 ], [ -56.608606330417786, -25.907823988786049 ], [ -56.617132941232228, -25.892837822907211 ], [ -56.64090410034396, -25.864984225541605 ], [ -56.648345506439966, -25.853512058035051 ], [ -56.655218471755063, -25.838319186581202 ], [ -56.665424567389891, -25.807106622272784 ], [ -56.671289842352337, -25.776565850633517 ], [ -56.672478399858278, -25.759099216055972 ], [ -56.670618048783922, -25.742562757465294 ], [ -56.663538376994495, -25.724579359849599 ], [ -56.646795212828806, -25.710368341225944 ], [ -56.62509111216508, -25.698482760770787 ], [ -56.569952359114097, -25.674453220139981 ], [ -56.559952969054279, -25.668768813230145 ], [ -56.512488166095977, -25.628099461221154 ], [ -56.49907813225002, -25.620296319019928 ], [ -56.481999071300095, -25.614611912110036 ], [ -56.450631475562147, -25.609650973813416 ], [ -56.437634853765474, -25.606240330027219 ], [ -56.42618852378132, -25.601744479723948 ], [ -56.395957811403889, -25.584277846045779 ], [ -56.378827073610523, -25.579471938279312 ], [ -56.359060838386995, -25.577766615936582 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/puerto rico.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/puerto rico.geojson new file mode 100644 index 000000000000..f4a0603c53f9 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/puerto rico.geojson @@ -0,0 +1,7 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "US-PR", "NAME_1": "Puerto Rico" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -67.855865037999934, 18.11469147300005 ], [ -67.844349738999938, 18.104559637000079 ], [ -67.844146287999934, 18.097560940000051 ], [ -67.849761522999927, 18.090643622000073 ], [ -67.859934048999946, 18.073146877000056 ], [ -67.864165818999936, 18.068752346000053 ], [ -67.867543097999942, 18.064195054000038 ], [ -67.868885870999918, 18.056341864000046 ], [ -67.873158331999946, 18.05345286700009 ], [ -67.882557745999918, 18.052557684000078 ], [ -67.891957160999937, 18.05345286700009 ], [ -67.896229620999918, 18.056341864000046 ], [ -67.902699347999942, 18.065415757000039 ], [ -67.931141730999911, 18.080511786000045 ], [ -67.93781490799995, 18.094224351000037 ], [ -67.931304490999935, 18.108710028000075 ], [ -67.919748501999948, 18.114488023000092 ], [ -67.861887173999946, 18.116115627000056 ], [ -67.855865037999934, 18.11469147300005 ] ] ], [ [ [ -65.347727016999954, 18.11469147300005 ], [ -65.356597459999932, 18.122870184000078 ], [ -65.371205206999946, 18.119533596000053 ], [ -65.390248175999943, 18.11196523600006 ], [ -65.468576626999948, 18.094427802000041 ], [ -65.484242316999939, 18.08734772300005 ], [ -65.504872199999909, 18.093654690000051 ], [ -65.536000128999945, 18.090073960000041 ], [ -65.56509355399993, 18.093939520000049 ], [ -65.580433722999942, 18.122137762000079 ], [ -65.564930792999917, 18.122626044000071 ], [ -65.559925910999937, 18.122137762000079 ], [ -65.540150519999941, 18.12376536700009 ], [ -65.520253058999913, 18.130926825000074 ], [ -65.50218665299991, 18.14126211100006 ], [ -65.487945115999935, 18.152289130000042 ], [ -65.478505011999914, 18.157049872000073 ], [ -65.398548956999946, 18.169338283000059 ], [ -65.385812954999949, 18.167181708000044 ], [ -65.351063605999911, 18.15570709800005 ], [ -65.298573370999918, 18.153713283000059 ], [ -65.285552537999934, 18.148871161000045 ], [ -65.275746222999942, 18.137152411000045 ], [ -65.283070441999939, 18.133490302000041 ], [ -65.309803839999915, 18.135199286000045 ], [ -65.316558397999927, 18.132798570000091 ], [ -65.335560675999943, 18.120266018000052 ], [ -65.340809699999909, 18.11469147300005 ], [ -65.347727016999954, 18.11469147300005 ] ] ], [ [ [ -65.278797980999911, 18.279201565000051 ], [ -65.292591925999943, 18.299953518000052 ], [ -65.334339972999942, 18.337103583000044 ], [ -65.334055141999954, 18.340643622000073 ], [ -65.309437628999945, 18.340765692000048 ], [ -65.280913865999935, 18.335272528000075 ], [ -65.256662563999953, 18.323919989000046 ], [ -65.244618292999917, 18.306545315000051 ], [ -65.247547980999911, 18.305853583000044 ], [ -65.258290167999917, 18.306545315000051 ], [ -65.251454230999911, 18.299709377000056 ], [ -65.262115037999934, 18.299221096000053 ], [ -65.270415818999936, 18.30141836100006 ], [ -65.27603105399993, 18.306341864000046 ], [ -65.278797980999911, 18.313950914000088 ], [ -65.285552537999934, 18.313950914000088 ], [ -65.276519334999932, 18.296942450000074 ], [ -65.274810350999928, 18.289007880000042 ], [ -65.278797980999911, 18.279201565000051 ] ] ], [ [ [ -65.628814256999931, 18.279201565000051 ], [ -65.632923956999946, 18.266913153000075 ], [ -65.625803188999953, 18.259833075000074 ], [ -65.617591109999921, 18.256343797000056 ], [ -65.603701908999938, 18.262860527000043 ], [ -65.606586998999944, 18.25360994600004 ], [ -65.60377320799995, 18.246339934000048 ], [ -65.5917638869999, 18.230884786000047 ], [ -65.602112122999927, 18.223753350000038 ], [ -65.603532549999954, 18.215270496000073 ], [ -65.612442619999911, 18.214503295000043 ], [ -65.622218243999953, 18.22926327600004 ], [ -65.633363362999944, 18.22918349400004 ], [ -65.636994766999919, 18.21857009900009 ], [ -65.62723464499993, 18.205928744000062 ], [ -65.63683059899995, 18.198096500000077 ], [ -65.648734771999898, 18.200131146000047 ], [ -65.665516730999911, 18.20844147300005 ], [ -65.682972785999937, 18.202826239000046 ], [ -65.701283331999946, 18.194240627000056 ], [ -65.72101803299995, 18.189846096000053 ], [ -65.737538214999915, 18.182684637000079 ], [ -65.754872199999909, 18.166245835000041 ], [ -65.790289178999899, 18.113972511000043 ], [ -65.793142091999925, 18.087630827000055 ], [ -65.806996222999942, 18.070298570000091 ], [ -65.812163865999935, 18.067287502000056 ], [ -65.835275844999899, 18.062486070000091 ], [ -65.84048417899993, 18.056341864000046 ], [ -65.830269476999945, 18.026906814000085 ], [ -65.849745717999951, 18.009711121000066 ], [ -65.887177814999916, 17.987726979000058 ], [ -65.939116990999935, 17.970526434000078 ], [ -65.961659308999913, 17.97101471600007 ], [ -65.984527147999927, 17.975653387000079 ], [ -66.004994269999941, 17.977525132000039 ], [ -66.017079230999911, 17.975083726000037 ], [ -66.046538865999935, 17.963853257000039 ], [ -66.053578253999945, 17.963120835000041 ], [ -66.084095831999946, 17.963853257000039 ], [ -66.104644334999932, 17.958929755000042 ], [ -66.163238084999932, 17.92914459800005 ], [ -66.175607876999948, 17.928208726000037 ], [ -66.186634894999941, 17.928615627000056 ], [ -66.196278449999909, 17.927720445000091 ], [ -66.204213019999941, 17.922919012000079 ], [ -66.208566860999952, 17.92914459800005 ], [ -66.209828253999945, 17.931870835000041 ], [ -66.210438605999911, 17.936590887000079 ], [ -66.199574347999942, 17.939601955000057 ], [ -66.197010870999918, 17.944403387000079 ], [ -66.201161261999914, 17.950506903000075 ], [ -66.210438605999911, 17.957098700000074 ], [ -66.229888475999928, 17.940415757000039 ], [ -66.241363084999932, 17.937323309000078 ], [ -66.255523240999935, 17.940659898000092 ], [ -66.283070441999939, 17.943426825000074 ], [ -66.292591925999943, 17.945746161000045 ], [ -66.297718878999945, 17.951402085000041 ], [ -66.301380988999938, 17.958197333000044 ], [ -66.306630011999914, 17.963853257000039 ], [ -66.319162563999953, 17.970363674000055 ], [ -66.328114386999914, 17.972316799000055 ], [ -66.344471808999913, 17.97134023600006 ], [ -66.367665167999917, 17.966009833000044 ], [ -66.396148240999935, 17.947251695000091 ], [ -66.416493292999917, 17.949611721000053 ], [ -66.435902472999942, 17.964016018000052 ], [ -66.452137824999909, 17.982163804000038 ], [ -66.469146287999934, 17.992661851000037 ], [ -66.487799859999939, 17.988853697000081 ], [ -66.501969120999945, 17.987115356000061 ], [ -66.512521938999953, 17.982001044000071 ], [ -66.527007615999935, 17.979315497000073 ], [ -66.559885219999899, 17.977525132000039 ], [ -66.570423956999946, 17.972357489000046 ], [ -66.580637173999946, 17.965806382000039 ], [ -66.592518683999913, 17.963568427000041 ], [ -66.608265753999945, 17.97134023600006 ], [ -66.615305141999954, 17.966742255000042 ], [ -66.622547980999911, 17.963853257000039 ], [ -66.629383917999917, 17.975165106000077 ], [ -66.646595831999946, 17.976629950000074 ], [ -66.687408006999931, 17.97134023600006 ], [ -66.694976365999935, 17.973089911000045 ], [ -66.724964972999942, 17.984361070000091 ], [ -66.76593990799995, 17.984361070000091 ], [ -66.765126105999911, 17.998032945000091 ], [ -66.774037238999938, 18.002183335000041 ], [ -66.787464972999942, 17.999335028000075 ], [ -66.800119594999899, 17.991848049000055 ], [ -66.800119594999899, 17.984361070000091 ], [ -66.786447719999899, 17.984361070000091 ], [ -66.797963019999941, 17.969305731000077 ], [ -66.817697719999899, 17.958970445000091 ], [ -66.840565558999913, 17.952704169000071 ], [ -66.861480272999927, 17.949611721000053 ], [ -66.892648891999954, 17.950669664000088 ], [ -66.907826300999943, 17.949204820000091 ], [ -66.919016079999949, 17.950140692000048 ], [ -66.924224412999934, 17.949611721000053 ], [ -66.928212042999917, 17.945542710000041 ], [ -66.92992102799991, 17.938625393000052 ], [ -66.930409308999913, 17.92914459800005 ], [ -66.949126756999931, 17.931219794000071 ], [ -66.963246222999942, 17.941066799000055 ], [ -66.985707160999937, 17.963853257000039 ], [ -67.005959401999917, 17.964910772000053 ], [ -67.028528302999916, 17.968537713000046 ], [ -67.052712969999902, 17.968166438000083 ], [ -67.067005988999938, 17.972560940000051 ], [ -67.080922003999945, 17.96124909100007 ], [ -67.097320115999935, 17.952866929000038 ], [ -67.11196855399993, 17.949611721000053 ], [ -67.124012824999909, 17.951157945000091 ], [ -67.15855980099991, 17.954568756000072 ], [ -67.1804672479999, 17.966118460000075 ], [ -67.191221363999944, 17.957993996000084 ], [ -67.184192353999947, 17.935072253000044 ], [ -67.195073253999908, 17.935682387000043 ], [ -67.209610209999937, 17.956889788000069 ], [ -67.2147711799999, 17.966335022000067 ], [ -67.214349170999924, 17.994143776000044 ], [ -67.190500454999949, 18.004828192000048 ], [ -67.183338995999918, 18.00853099200009 ], [ -67.174224412999934, 18.01117584800005 ], [ -67.166493292999917, 18.015041408000059 ], [ -67.163197394999941, 18.022528387000079 ], [ -67.167225714999915, 18.027899481000077 ], [ -67.176869269999941, 18.032700914000088 ], [ -67.190075598999954, 18.030314326000052 ], [ -67.202875123999945, 18.035716432000072 ], [ -67.202134046999902, 18.054357831000061 ], [ -67.195400258999939, 18.063768118000041 ], [ -67.185692598999935, 18.07042742100009 ], [ -67.189740674999939, 18.080609646000084 ], [ -67.193876796999916, 18.097302159000037 ], [ -67.183244559999935, 18.107688841000083 ], [ -67.183778284999903, 18.139945037000075 ], [ -67.173695441999939, 18.176174221000053 ], [ -67.165908946999934, 18.184074226000064 ], [ -67.157535861999918, 18.191734409000048 ], [ -67.151857830999916, 18.203392396000083 ], [ -67.158465121999939, 18.213957881000056 ], [ -67.171198295999943, 18.22487028200004 ], [ -67.187082485999952, 18.272772528000075 ], [ -67.196511528999906, 18.291338513000085 ], [ -67.218828784999914, 18.295573695000087 ], [ -67.236906282999939, 18.29986180800006 ], [ -67.252774233999901, 18.329337017000057 ], [ -67.262600709999901, 18.343812572000047 ], [ -67.270842180999921, 18.361826454000038 ], [ -67.268824856999913, 18.368899978000059 ], [ -67.240267343999903, 18.376812365000092 ], [ -67.217355923999946, 18.38617584800005 ], [ -67.198394334999932, 18.393703518000052 ], [ -67.184315558999913, 18.402085679000038 ], [ -67.159451107999928, 18.420910746000061 ], [ -67.158117998999899, 18.443110832000059 ], [ -67.168698741999947, 18.460604676000059 ], [ -67.170006635999925, 18.486019825000085 ], [ -67.151682094999899, 18.508937893000052 ], [ -67.101714647999927, 18.522772528000075 ], [ -67.048451300999943, 18.521144924000055 ], [ -67.01235917899993, 18.505764065000051 ], [ -66.907315639999922, 18.485324843000058 ], [ -66.803456183999913, 18.498277085000041 ], [ -66.789214647999927, 18.496527411000045 ], [ -66.751698370999918, 18.484035549000055 ], [ -66.736805792999917, 18.48314036700009 ], [ -66.697661912999934, 18.491441148000092 ], [ -66.64085852799991, 18.49640534100007 ], [ -66.614328579999949, 18.493231512000079 ], [ -66.587798631999931, 18.484035549000055 ], [ -66.571441209999932, 18.487005927000041 ], [ -66.507069464999915, 18.486395575000074 ], [ -66.46743730399993, 18.475287177000041 ], [ -66.382394985999952, 18.491441148000092 ], [ -66.303863084999932, 18.468817450000074 ], [ -66.25812740799995, 18.481512762000079 ], [ -66.205189581999946, 18.465399481000077 ], [ -66.193988621999949, 18.473586567000041 ], [ -66.180897589999915, 18.471502997000073 ], [ -66.173695441999939, 18.462958075000074 ], [ -66.170074022999927, 18.45734284100007 ], [ -66.161584084999902, 18.453298221000068 ], [ -66.152007595999919, 18.458723638000038 ], [ -66.144085162999943, 18.468702418000078 ], [ -66.134144660999937, 18.465887762000079 ], [ -66.137470201999918, 18.452755932000059 ], [ -66.118080620999933, 18.443026868000061 ], [ -66.114857550999943, 18.433172919000071 ], [ -66.108469204999949, 18.42064036700009 ], [ -66.093169725999928, 18.419826565000051 ], [ -66.060210740999935, 18.429388739000046 ], [ -66.060210740999935, 18.436835028000075 ], [ -66.076771613999938, 18.438869533000059 ], [ -66.094960089999915, 18.447699286000045 ], [ -66.109364386999914, 18.461411851000037 ], [ -66.121631156999911, 18.473470242000076 ], [ -66.055897589999915, 18.453802802000041 ], [ -66.03970292899993, 18.450506903000075 ], [ -66.028184650999947, 18.446870575000048 ], [ -66.012099753999905, 18.44396181500008 ], [ -65.997717399999942, 18.450184941000089 ], [ -65.988880988999938, 18.463080145000049 ], [ -65.966216600999928, 18.45844147300005 ], [ -65.920438427999954, 18.445889431000069 ], [ -65.90482604999994, 18.45592492600008 ], [ -65.89281165299991, 18.453599351000037 ], [ -65.880523240999935, 18.444810289000088 ], [ -65.84829667899993, 18.437892971000053 ], [ -65.830799933999913, 18.428697007000039 ], [ -65.81260562999995, 18.410405382000079 ], [ -65.801625815999898, 18.415443225000047 ], [ -65.794168806999949, 18.425405872000056 ], [ -65.788347260999899, 18.423249257000066 ], [ -65.78714832199995, 18.41830708100008 ], [ -65.792317702999924, 18.41276352400007 ], [ -65.796307176999903, 18.405028206000054 ], [ -65.788777103999905, 18.406737253000074 ], [ -65.778372095999941, 18.410669300000052 ], [ -65.772027141999899, 18.414570150000088 ], [ -65.755002426999908, 18.391041037000036 ], [ -65.738107160999903, 18.382365176000064 ], [ -65.72484854399994, 18.391266958000074 ], [ -65.698014782999905, 18.371110745000067 ], [ -65.663200287999928, 18.366413598000065 ], [ -65.645741339999915, 18.378404039000088 ], [ -65.637766079999949, 18.385687567000048 ], [ -65.629383917999917, 18.391058661000045 ], [ -65.62140865799995, 18.389064846000053 ], [ -65.621001756999931, 18.38226959800005 ], [ -65.630767381999931, 18.332831122000073 ], [ -65.632964647999927, 18.291001695000091 ], [ -65.628814256999931, 18.279201565000051 ] ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/saint barthelemy.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/saint barthelemy.geojson new file mode 100644 index 000000000000..d4ebeabfa1bf --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/saint barthelemy.geojson @@ -0,0 +1,7 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "BL-X00~", "NAME_1": "Saint Barthélemy" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -62.838856574999909, 17.881984768000052 ], [ -62.850941535999937, 17.890448309000078 ], [ -62.861317511999914, 17.905422268000052 ], [ -62.867339647999927, 17.920396226000037 ], [ -62.866118943999936, 17.92914459800005 ], [ -62.857411261999914, 17.925034898000092 ], [ -62.79165605399993, 17.91547272300005 ], [ -62.798939581999946, 17.904486395000049 ], [ -62.810129360999952, 17.892279364000046 ], [ -62.823841925999943, 17.883246161000045 ], [ -62.838856574999909, 17.881984768000052 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/saint martin.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/saint martin.geojson new file mode 100644 index 000000000000..6f23bfaee027 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/saint martin.geojson @@ -0,0 +1,7 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "MF-X00~", "NAME_1": "St. Martin" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -63.017568585288387, 18.033391472351283 ], [ -63.085886190999901, 18.058511251000098 ], [ -63.107004360999952, 18.062119859000063 ], [ -63.107004360999952, 18.066961981000077 ], [ -63.115305141999954, 18.065375067000048 ], [ -63.130523240999935, 18.060248114000046 ], [ -63.134348110999952, 18.059475002000056 ], [ -63.143869594999899, 18.064683335000041 ], [ -63.146839972999942, 18.070298570000091 ], [ -63.143625454999949, 18.074164130000042 ], [ -63.113758917999917, 18.074652411000045 ], [ -63.096099412999934, 18.078802802000041 ], [ -63.083811001999948, 18.087958075000074 ], [ -63.079090949999909, 18.104193427000041 ], [ -63.070871548999946, 18.11001211100006 ], [ -63.052113410999937, 18.116848049000055 ], [ -63.031402147999927, 18.121893622000073 ], [ -63.017648891999954, 18.122137762000079 ], [ -63.017933722999942, 18.100531317000048 ], [ -63.011097785999937, 18.070746161000045 ], [ -63.010731574999909, 18.040838934000078 ], [ -63.017568585288387, 18.033391472351283 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/turkey.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/turkey.geojson new file mode 100644 index 000000000000..8e0d83a404a2 --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/turkey.geojson @@ -0,0 +1,87 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "TR-01", "NAME_1": "Adana" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 35.279026031494084,36.64069366455101 ], [ 35.28180694580078,36.6390266418457 ], [ 35.282917022705135,36.636806488037166 ], [ 35.27819442749029,36.640140533447266 ], [ 35.279026031494084,36.64069366455101 ] ] ], [ [ [ 35.27152633666998,36.64485931396507 ], [ 35.274028778076456,36.64319610595709 ], [ 35.274028778076456,36.64208221435558 ], [ 35.27125167846697,36.64319610595709 ], [ 35.27152633666998,36.64485931396507 ] ] ], [ [ [ 35.20735931396513,36.65069580078119 ], [ 35.2093048095706,36.64986038208025 ], [ 35.20958328247099,36.64930725097685 ], [ 35.206249237060604,36.649028778076456 ], [ 35.20735931396513,36.65069580078119 ] ] ], [ [ [ 35.21180725097656,36.65541839599638 ], [ 35.212081909179744,36.65319442749046 ], [ 35.21152877807634,36.6529159545899 ], [ 35.20958328247099,36.65513992309582 ], [ 35.21180725097656,36.65541839599638 ] ] ], [ [ [ 35.21347045898466,36.659862518310774 ], [ 35.21402740478527,36.65874862670927 ], [ 35.21069335937517,36.65902709960943 ], [ 35.21097183227556,36.659862518310774 ], [ 35.21347045898466,36.659862518310774 ] ] ], [ [ [ 35.20958328247099,36.67874908447283 ], [ 35.212360382080135,36.677639007568644 ], [ 35.212360382080135,36.67680740356468 ], [ 35.20847320556646,36.6781959533692 ], [ 35.20958328247099,36.67874908447283 ] ] ], [ [ [ 35.5912513732913,36.704029083252124 ], [ 35.5915260314942,36.6995849609375 ], [ 35.59069442749018,36.6995849609375 ], [ 35.589862823486385,36.70319366455078 ], [ 35.5912513732913,36.704029083252124 ] ] ], [ [ [ 35.60680389404291,36.70541763305687 ], [ 35.60625076293951,36.700973510742415 ], [ 35.6012496948245,36.70019912719721 ], [ 35.60514068603533,36.70541763305687 ], [ 35.60680389404291,36.70541763305687 ] ] ], [ [ [ 35.68264007568365,36.716251373291016 ], [ 35.67958450317383,36.71263885498075 ], [ 35.67736053466825,36.7140274047851 ], [ 35.680973052978516,36.716251373291016 ], [ 35.68264007568365,36.716251373291016 ] ] ], [ [ [ 35.69708251953142,36.72735977172874 ], [ 35.70291519165045,36.724304199219034 ], [ 35.70291519165045,36.72347259521507 ], [ 35.69736099243181,36.72375106811546 ], [ 35.69708251953142,36.72735977172874 ] ] ], [ [ [ 36.329639434814624,37.92000961303711 ], [ 36.31517028808622,37.88559722900396 ], [ 36.31903839111345,37.83251953125 ], [ 36.36219787597662,37.75340270996094 ], [ 36.302368164062614,37.651248931884936 ], [ 36.153835296630916,37.63694381713884 ], [ 36.033290863037166,37.57089233398443 ], [ 35.88317108154325,37.35688018798834 ], [ 35.881771087646484,37.241584777832145 ], [ 35.904296875000114,37.20827102661144 ], [ 35.85282516479492,37.12870788574219 ], [ 35.87482452392595,37.121696472168026 ], [ 36.000972747802734,37.17415237426786 ], [ 36.03230667114258,37.15906143188488 ], [ 36.061447143554744,37.108856201171875 ], [ 36.04160690307617,37.025554656982536 ], [ 35.94699859619146,36.95690536499052 ], [ 35.91258621215826,36.90350723266613 ], [ 35.93404769897478,36.87985992431646 ], [ 35.84180450439453,36.795139312744254 ], [ 35.7945823669433,36.765693664551065 ], [ 35.666805267333984,36.76708221435547 ], [ 35.6270828247072,36.74569320678734 ], [ 35.60930633544939,36.71430587768549 ], [ 35.61291503906244,36.73208236694336 ], [ 35.60319519042969,36.727085113525334 ], [ 35.5995826721192,36.69985961914091 ], [ 35.5915260314942,36.71097183227562 ], [ 35.563194274902344,36.71263885498075 ], [ 35.55430603027372,36.6995849609375 ], [ 35.570137023926065,36.70652770996122 ], [ 35.584583282470646,36.67958450317394 ], [ 35.6295814514163,36.721527099609375 ], [ 35.62430572509794,36.733749389648665 ], [ 35.654304504394474,36.739860534668026 ], [ 35.64541625976568,36.70763778686518 ], [ 35.65680694580095,36.72902679443365 ], [ 35.65402603149414,36.70791625976557 ], [ 35.70652770996122,36.71319580078131 ], [ 35.704303741455135,36.72319412231468 ], [ 35.7234725952149,36.71263885498075 ], [ 35.64513778686529,36.66847229003906 ], [ 35.62180709838884,36.604305267334155 ], [ 35.581806182861385,36.59069442749052 ], [ 35.565971374512,36.56486129760748 ], [ 35.41819381713873,36.590137481689396 ], [ 35.339027404785156,36.538471221924 ], [ 35.329582214355526,36.56791687011713 ], [ 35.32208251953142,36.572360992431754 ], [ 35.34624862670904,36.60347366333036 ], [ 35.285137176513615,36.62680435180664 ], [ 35.28791809082048,36.64347076416033 ], [ 35.27097320556658,36.65208435058611 ], [ 35.2640266418457,36.639305114746264 ], [ 35.24902725219738,36.654026031494254 ], [ 35.27152633666998,36.66180419921875 ], [ 35.25097274780302,36.6781959533692 ], [ 35.18069458007841,36.69291687011719 ], [ 35.163471221924,36.67597198486351 ], [ 35.17597198486345,36.66152954101574 ], [ 35.273471832275675,36.60874938964861 ], [ 35.3245849609375,36.55875015258812 ], [ 34.997917175293026,36.713470458984546 ], [ 34.91521453857422,36.724861145019645 ], [ 34.949817657470646,36.7540168762207 ], [ 35.034801483154354,36.770996093750284 ], [ 35.06715011596697,36.81790924072271 ], [ 35.06958389282255,36.8526496887207 ], [ 35.05463027954107,36.97039413452154 ], [ 35.00078582763683,37.041458129882926 ], [ 34.92519378662115,37.0896911621096 ], [ 34.90010833740263,37.17629623413086 ], [ 34.78625869750982,37.379280090332145 ], [ 34.78827667236334,37.465160369873104 ], [ 34.860763549804744,37.525032043456974 ], [ 34.85847854614258,37.57877349853527 ], [ 34.81658554077154,37.65838241577154 ], [ 34.826660156250284,37.684917449951286 ], [ 34.86949157714844,37.71004486083979 ], [ 35.02579116821306,37.69889450073242 ], [ 35.08160018920927,37.718662261963004 ], [ 35.21365356445324,37.83214187622076 ], [ 35.20755767822294,37.91330337524414 ], [ 35.24167633056646,37.95356369018572 ], [ 35.45680999755865,37.91956710815424 ], [ 35.621017456054744,37.95576095581066 ], [ 35.680976867676065,38.05966186523432 ], [ 36.01338195800787,38.185642242431584 ], [ 36.161430358887,38.4135093688966 ], [ 36.30536651611334,38.463748931884766 ], [ 36.37761306762707,38.46636962890625 ], [ 36.42207336425781,38.442195892333984 ], [ 36.49144363403326,38.31632614135742 ], [ 36.42615890502947,38.25278854370117 ], [ 36.33535766601574,37.99667358398449 ], [ 36.329639434814624,37.92000961303711 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-02", "NAME_1": "Adıyaman" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 38.65533828735357,38.09172439575201 ], [ 38.85887527465832,38.09242630004883 ], [ 39.00511550903326,38.11749267578125 ], [ 39.074615478515796,38.14497375488281 ], [ 39.11173629760748,38.18469238281273 ], [ 39.160182952880916,38.17333602905296 ], [ 39.20501708984369,38.19129943847656 ], [ 39.24630737304693,38.16666030883812 ], [ 39.210086822509766,38.05253982543945 ], [ 39.073436737060604,37.99180603027361 ], [ 38.99199676513689,37.91375732421875 ], [ 38.976436614990234,37.88441848754894 ], [ 38.97814941406256,37.795402526855696 ], [ 38.95181274414068,37.74911117553711 ], [ 38.83071136474615,37.69311904907238 ], [ 38.83985519409174,37.658622741699276 ], [ 38.8294410705567,37.6424446105957 ], [ 38.615886688232536,37.57777023315424 ], [ 38.47832489013666,37.48891067504883 ], [ 38.330547332763786,37.48437881469732 ], [ 38.15669631958025,37.406925201416016 ], [ 38.06077194213867,37.4311904907226 ], [ 37.98249435424833,37.496170043945426 ], [ 37.7957878112793,37.5446510314942 ], [ 37.679069519043026,37.512031555175895 ], [ 37.62296295166021,37.51213455200224 ], [ 37.5731277465822,37.55051803588867 ], [ 37.45948791503912,37.58237457275396 ], [ 37.416450500488395,37.61639785766624 ], [ 37.422187805176065,37.703323364257926 ], [ 37.59421539306652,37.82491683959972 ], [ 37.73728942871122,37.83412933349632 ], [ 37.76950454711931,37.86634826660179 ], [ 37.83566284179693,37.882831573486385 ], [ 37.980312347412166,37.860988616943644 ], [ 38.18105316162115,37.91896057128906 ], [ 38.13481521606451,38.089435577392635 ], [ 38.39860153198248,38.19963455200201 ], [ 38.5370826721192,38.23062896728521 ], [ 38.634452819824276,38.19916915893566 ], [ 38.62433242797846,38.169216156006144 ], [ 38.562923431396484,38.12447357177746 ], [ 38.65533828735357,38.09172439575201 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-03", "NAME_1": "Afyon" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 31.362766265869197,39.16468429565424 ], [ 31.386358261108683,39.11867141723644 ], [ 31.4598522186281,39.088176727295206 ], [ 31.696891784668253,39.09305953979515 ], [ 31.708700180053995,38.95373535156273 ], [ 31.6233043670656,38.817733764648665 ], [ 31.58945655822771,38.72563552856445 ], [ 31.6107826232913,38.67497253417963 ], [ 31.679281234741325,38.63260269165045 ], [ 31.260772705078296,38.427665710449276 ], [ 31.20930480957037,38.439853668213004 ], [ 31.12550926208496,38.51361846923828 ], [ 31.088424682617244,38.5123291015625 ], [ 30.799964904785327,38.2902374267581 ], [ 30.640510559082202,38.245807647705135 ], [ 30.517358779907283,38.18640518188471 ], [ 30.366300582886026,38.07125473022461 ], [ 30.265552520752237,38.016117095947266 ], [ 30.22363090515165,37.98092269897472 ], [ 30.18260765075712,37.9011611938476 ], [ 30.19958305358915,37.84968566894531 ], [ 30.167104721069393,37.81391525268555 ], [ 30.09053611755371,37.776737213134766 ], [ 29.966999053955135,37.78396606445335 ], [ 29.845273971557788,37.76081848144531 ], [ 29.81536865234392,37.81905364990257 ], [ 29.72046852111822,37.852550506591854 ], [ 29.663770675659237,37.852550506591854 ], [ 29.665998458862475,37.98868942260748 ], [ 29.924520492553825,38.10348129272478 ], [ 30.020292282104776,38.17622375488281 ], [ 30.041278839111328,38.22135543823259 ], [ 30.03680038452154,38.251564025878906 ], [ 29.922199249267862,38.41290664672874 ], [ 29.755413055419922,38.45410919189453 ], [ 29.77183532714872,38.50595855712919 ], [ 29.87275886535673,38.64421844482433 ], [ 29.894367218017862,38.70968246459984 ], [ 30.074789047241268,38.78848648071295 ], [ 30.115364074706974,38.820873260498104 ], [ 30.27036857605009,39.08821105957054 ], [ 30.384635925293253,39.12631988525396 ], [ 30.43370437622076,39.16427230834972 ], [ 30.45332908630388,39.20599746704107 ], [ 30.50550842285162,39.189422607421875 ], [ 30.542961120605753,39.13069152832031 ], [ 30.6117458343507,39.07914733886719 ], [ 30.639776229858512,39.076957702636946 ], [ 30.766630172729776,39.12854385375999 ], [ 30.799478530883846,39.172389984130916 ], [ 30.885963439941577,39.21287155151373 ], [ 30.989156723022518,39.15921020507824 ], [ 31.141860961914347,39.218502044677734 ], [ 31.24177551269537,39.28451919555664 ], [ 31.30526924133318,39.273185729980526 ], [ 31.362766265869197,39.16468429565424 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-04", "NAME_1": "Ağrı" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 43.39566040039057,39.925796508789176 ], [ 43.39422988891596,39.79460525512701 ], [ 43.456417083740234,39.767475128173885 ], [ 43.47832870483427,39.766723632812614 ], [ 43.5319442749024,39.820419311523494 ], [ 43.62248992919939,39.82235717773443 ], [ 43.74055480957048,39.79948043823242 ], [ 43.999706268310604,39.68526458740246 ], [ 44.15977859497082,39.69419860839855 ], [ 44.23257827758795,39.671707153320426 ], [ 44.3003501892091,39.67086791992193 ], [ 44.380176544189624,39.69319534301769 ], [ 44.49647140502958,39.69598007202171 ], [ 44.489604949951456,39.630126953125114 ], [ 44.43618774414068,39.560661315918196 ], [ 44.45337677001959,39.50155639648449 ], [ 44.4333610534668,39.47306823730469 ], [ 44.441123962402514,39.435874938964844 ], [ 44.423660278320426,39.4098014831543 ], [ 44.30173492431646,39.3714714050293 ], [ 44.22431182861334,39.41028976440441 ], [ 44.17476272583025,39.40239334106445 ], [ 44.1518440246582,39.377182006835994 ], [ 44.138137817382926,39.37977981567394 ], [ 44.143608093261776,39.400177001953125 ], [ 44.069816589355526,39.40531921386719 ], [ 44.04974365234392,39.360752105712834 ], [ 44.03281784057617,39.37202072143555 ], [ 43.96207427978521,39.35651016235363 ], [ 43.716354370117244,39.37020492553734 ], [ 43.64554214477545,39.302429199218864 ], [ 43.5928192138673,39.287895202636946 ], [ 43.494350433349894,39.327377319336165 ], [ 43.42657852172857,39.38888549804682 ], [ 43.293762207031534,39.40276336669933 ], [ 43.19167327880865,39.32806777954107 ], [ 43.10197830200224,39.32246017456055 ], [ 43.07938003540056,39.30751419067394 ], [ 43.08466720581049,39.284191131592024 ], [ 43.166938781738565,39.23722457885742 ], [ 43.16763305664068,39.16597366333019 ], [ 43.14973449707037,39.139167785644645 ], [ 42.97164154052763,39.08096313476585 ], [ 42.827857971191406,39.06509017944347 ], [ 42.749843597412166,39.03714752197277 ], [ 42.72988891601568,39.159004211425895 ], [ 42.672210693359375,39.24966812133812 ], [ 42.62761688232439,39.27266311645508 ], [ 42.516819000244425,39.37535095214838 ], [ 42.466396331787166,39.46373367309599 ], [ 42.463413238525675,39.48609924316412 ], [ 42.523639678955135,39.56861877441406 ], [ 42.50621795654325,39.72973632812494 ], [ 42.474822998047046,39.76498413085949 ], [ 42.285240173340014,39.81406784057623 ], [ 42.25519943237322,39.861167907714844 ], [ 42.2776527404788,39.88196563720703 ], [ 42.40620422363287,39.873390197753906 ], [ 42.566364288330135,39.94755172729515 ], [ 42.638339996337834,39.91758728027372 ], [ 42.7108917236331,39.91766357421875 ], [ 43.10322189331072,40.00832748413086 ], [ 43.3728103637697,39.960422515869084 ], [ 43.39566040039057,39.925796508789176 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-68", "NAME_1": "Aksaray" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 34.2052116394043,38.84115219116222 ], [ 34.26256942749052,38.793670654296875 ], [ 34.205261230469034,38.67776489257818 ], [ 34.273029327392635,38.62049484252958 ], [ 34.348003387451286,38.473419189453125 ], [ 34.394397735595646,38.43891906738287 ], [ 34.36829757690447,38.36765289306652 ], [ 34.36320114135748,38.2909202575683 ], [ 34.39450073242182,38.24264526367193 ], [ 34.38952255249029,38.16189575195307 ], [ 34.32982254028326,38.13497161865246 ], [ 34.26839065551758,38.05600738525402 ], [ 34.18675994873075,38.070056915283146 ], [ 34.14690780639654,38.05195236206055 ], [ 34.12569427490246,38.01376342773443 ], [ 33.77833557128912,37.95623016357433 ], [ 33.495018005371264,37.93255615234381 ], [ 33.41340637207048,37.95118713378906 ], [ 33.3625679016115,38.00362014770519 ], [ 33.240116119384936,38.21535110473644 ], [ 33.242633819580135,38.25516128540062 ], [ 33.30143737792986,38.347045898437614 ], [ 33.318119049072436,38.42950057983421 ], [ 33.38059997558611,38.562381744384766 ], [ 33.465042114257756,38.63647079467779 ], [ 33.68149948120117,38.711006164550895 ], [ 33.82563781738287,38.714866638183594 ], [ 33.923976898193416,38.78068542480486 ], [ 33.94691085815458,38.829227447509936 ], [ 33.8883056640625,38.954170227050895 ], [ 33.9267005920413,39.008110046386776 ], [ 34.07765579223633,38.90355300903332 ], [ 34.17686462402338,38.88210296630854 ], [ 34.2052116394043,38.84115219116222 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-05", "NAME_1": "Amasya" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 35.7025527954101,40.877315521240234 ], [ 35.840560913085994,40.86432647705101 ], [ 35.955291748046875,40.87558364868164 ], [ 36.06103515625006,40.84314727783226 ], [ 36.18094253540045,40.90474319458019 ], [ 36.20392608642584,40.98003387451172 ], [ 36.25976181030302,40.979282379150504 ], [ 36.372375488281534,40.952079772949276 ], [ 36.37617874145525,40.90769958496105 ], [ 36.4480056762697,40.86983108520536 ], [ 36.41676330566412,40.82258224487305 ], [ 36.45636749267595,40.770137786865234 ], [ 36.472808837890625,40.707481384277344 ], [ 36.44152450561552,40.63232803344738 ], [ 36.32520294189459,40.523677825927734 ], [ 36.20240020751959,40.45898437500006 ], [ 36.1100692749024,40.44609451293945 ], [ 36.03977584838873,40.45986938476557 ], [ 35.95844650268555,40.50232696533209 ], [ 35.84466171264654,40.501518249511776 ], [ 35.71618652343756,40.32625579834007 ], [ 35.5763778686524,40.27421951293945 ], [ 35.529628753662394,40.235530853271484 ], [ 35.51206970214861,40.189777374267635 ], [ 35.37136840820318,40.195156097412166 ], [ 35.33233642578119,40.228908538818416 ], [ 35.343681335449276,40.35832595825195 ], [ 35.448406219482365,40.46772384643566 ], [ 35.46423721313471,40.5735321044923 ], [ 35.42771530151373,40.615207672119254 ], [ 35.25703811645519,40.666099548340014 ], [ 35.15071868896513,40.67067337036144 ], [ 35.082084655762,40.71263122558594 ], [ 35.02510070800798,40.843399047851676 ], [ 35.04604339599604,40.852909088134766 ], [ 35.04957199096674,40.95141220092779 ], [ 35.09133148193365,41.03227615356468 ], [ 35.093154907226506,41.09054183959961 ], [ 35.48538970947271,41.012321472168026 ], [ 35.643894195556925,40.92682647705078 ], [ 35.66569137573259,40.89455795288109 ], [ 35.7025527954101,40.877315521240234 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-06", "NAME_1": "Ankara" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 33.187957763672046,40.41364669799805 ], [ 33.22098541259771,40.351249694824446 ], [ 33.2674293518067,40.331134796142805 ], [ 33.330764770507756,40.33474349975609 ], [ 33.364143371581974,40.38593292236334 ], [ 33.40986251831072,40.38897705078125 ], [ 33.72912216186518,40.27840805053711 ], [ 33.652736663818416,40.201866149902344 ], [ 33.57646942138689,40.048053741455135 ], [ 33.61725234985357,39.966354370117415 ], [ 33.616443634033374,39.91255950927757 ], [ 33.59539413452177,39.884044647217024 ], [ 33.43414688110357,39.81398773193371 ], [ 33.356254577636776,39.751121520996094 ], [ 33.31986618041992,39.64878463745117 ], [ 33.317638397216854,39.574645996094034 ], [ 33.2855339050293,39.46186065673851 ], [ 33.23331832885748,39.37669372558594 ], [ 33.28668594360357,39.33038711547863 ], [ 33.36938476562506,39.317165374755916 ], [ 33.390270233154354,39.27744674682617 ], [ 33.36560821533209,39.22562789917015 ], [ 33.41689682006836,39.16110992431652 ], [ 33.52802276611345,39.2547988891601 ], [ 33.59801483154314,39.17142486572277 ], [ 33.942905426025675,39.03599166870117 ], [ 33.8883056640625,38.954170227050895 ], [ 33.946762084960994,38.81260299682617 ], [ 33.923976898193416,38.78068542480486 ], [ 33.82899475097673,38.716121673584155 ], [ 33.68149948120117,38.711006164550895 ], [ 33.465042114257756,38.63647079467779 ], [ 33.36212921142584,38.791782379150504 ], [ 33.37403869628935,39.037906646728516 ], [ 33.18780136108427,39.276828765869084 ], [ 33.115245819091854,39.22088241577154 ], [ 33.05522155761719,39.218933105468864 ], [ 33.021648406982706,39.15932846069347 ], [ 32.96263122558622,39.126510620117244 ], [ 32.89254760742193,39.154331207275504 ], [ 32.83474731445318,39.15232849121105 ], [ 32.742153167724666,39.082061767578125 ], [ 32.70268630981451,39.03284835815441 ], [ 32.5559196472168,39.04980850219738 ], [ 32.46858978271496,38.99460601806652 ], [ 32.2944526672365,39.06810379028326 ], [ 32.129978179931925,39.0306282043457 ], [ 32.083663940429744,39.04292297363281 ], [ 31.883207321167276,39.173801422119254 ], [ 31.99277877807623,39.22740173339844 ], [ 32.011322021484546,39.38178634643572 ], [ 31.99344062805193,39.50458908081055 ], [ 31.907976150512866,39.613700866699276 ], [ 31.849052429199276,39.730388641357536 ], [ 31.847255706787166,39.76829147338873 ], [ 31.88599014282238,39.808479309082145 ], [ 31.857683181762752,39.87451553344749 ], [ 31.797164916992244,39.8831901550293 ], [ 31.695951461791992,39.98823165893566 ], [ 31.617036819458292,40.01634979248058 ], [ 31.175989151001033,40.04402542114258 ], [ 31.02343177795416,40.019157409668026 ], [ 30.94405746459978,40.02215957641607 ], [ 30.919401168823356,40.035682678222656 ], [ 30.913637161254826,40.0991401672365 ], [ 30.873971939086914,40.14034652709961 ], [ 30.955003738403605,40.22293853759777 ], [ 31.047548294067383,40.2725639343264 ], [ 31.037288665771484,40.37631988525385 ], [ 31.06073379516596,40.41575241088867 ], [ 31.14426994323742,40.39905548095703 ], [ 31.26392936706543,40.346771240234375 ], [ 31.566928863525675,40.30855178833008 ], [ 31.705093383789347,40.34394454956066 ], [ 31.79364585876482,40.33181762695318 ], [ 31.9033527374267,40.34561157226557 ], [ 32.14555358886719,40.424667358398494 ], [ 32.37283325195318,40.4155387878418 ], [ 32.47593688964861,40.5302276611331 ], [ 32.430423736572266,40.65179443359392 ], [ 32.50134658813505,40.704257965088004 ], [ 32.65491485595709,40.702560424804744 ], [ 32.955661773681925,40.59830474853527 ], [ 33.187957763672046,40.41364669799805 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-07", "NAME_1": "Antalya" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 29.63902854919462,36.12125015258795 ], [ 29.645696640014933,36.11569595336937 ], [ 29.62791633605974,36.10763931274414 ], [ 29.62874984741228,36.11125183105497 ], [ 29.63902854919462,36.12125015258795 ] ] ], [ [ [ 29.662639617920206,36.1365318298341 ], [ 29.660417556762752,36.13013839721697 ], [ 29.654581069946573,36.132915496826286 ], [ 29.65486145019537,36.13430404663103 ], [ 29.662639617920206,36.1365318298341 ] ] ], [ [ [ 29.755695343017862,36.141250610351506 ], [ 29.76625061035162,36.13152694702171 ], [ 29.738750457763615,36.12263870239269 ], [ 29.740415573120174,36.127082824707315 ], [ 29.755695343017862,36.141250610351506 ] ] ], [ [ [ 29.655416488647745,36.144306182861555 ], [ 29.656250000000284,36.14291763305681 ], [ 29.65319442749029,36.141250610351506 ], [ 29.65319442749029,36.14347076416021 ], [ 29.655416488647745,36.144306182861555 ] ] ], [ [ [ 29.624584197998104,36.153472900390796 ], [ 29.62791633605974,36.15152740478544 ], [ 29.62180519104021,36.15069580078148 ], [ 29.62208366394043,36.15236282348644 ], [ 29.624584197998104,36.153472900390796 ] ] ], [ [ [ 29.632085800170955,36.153472900390796 ], [ 29.632360458374308,36.15208435058605 ], [ 29.62874984741228,36.15152740478544 ], [ 29.62902832031267,36.15236282348644 ], [ 29.632085800170955,36.153472900390796 ] ] ], [ [ [ 29.49208259582514,36.16041564941429 ], [ 29.494581222534237,36.15708160400385 ], [ 29.496528625488338,36.159584045410156 ], [ 29.51736068725603,36.15708160400385 ], [ 29.48624992370634,36.15069580078148 ], [ 29.49208259582514,36.16041564941429 ] ] ], [ [ [ 29.626806259155558,36.16263961791998 ], [ 29.627082824706974,36.16097259521507 ], [ 29.62486076354986,36.15986251831072 ], [ 29.624027252197322,36.162082672119425 ], [ 29.626806259155558,36.16263961791998 ] ] ], [ [ [ 29.629304885864315,36.16347122192377 ], [ 29.630138397216854,36.162361145019815 ], [ 29.629583358764705,36.16041564941429 ], [ 29.62791633605974,36.161529541015625 ], [ 29.629304885864315,36.16347122192377 ] ] ], [ [ [ 29.592914581298885,36.16652679443382 ], [ 29.589860916137752,36.149860382080135 ], [ 29.60708427429205,36.144584655761946 ], [ 29.559305191040096,36.120971679687784 ], [ 29.592914581298885,36.16652679443382 ] ] ], [ [ [ 29.872915267944506,36.1690292358399 ], [ 29.873472213745117,36.167640686035384 ], [ 29.870693206787394,36.16624832153343 ], [ 29.871250152587947,36.16875076293974 ], [ 29.872915267944506,36.1690292358399 ] ] ], [ [ [ 29.836805343628214,36.17124938964844 ], [ 29.838193893432788,36.168193817138786 ], [ 29.836250305175838,36.16708374023443 ], [ 29.83402633666998,36.1690292358399 ], [ 29.836805343628214,36.17124938964844 ] ] ], [ [ [ 29.833196640014933,36.16930389404314 ], [ 29.83263969421381,36.17124938964844 ], [ 29.836250305175838,36.17208480834961 ], [ 29.835971832275504,36.17124938964844 ], [ 29.833196640014933,36.16930389404314 ] ] ], [ [ [ 29.54847145080572,36.18708419799816 ], [ 29.551807403564737,36.18402862548828 ], [ 29.551807403564737,36.18291854858393 ], [ 29.545972824096623,36.18458175659208 ], [ 29.54847145080572,36.18708419799816 ] ] ], [ [ [ 29.91263961791998,36.19152832031256 ], [ 29.912361145019645,36.188194274902344 ], [ 29.910417556762866,36.188194274902344 ], [ 29.909860610961914,36.1893043518067 ], [ 29.91263961791998,36.19152832031256 ] ] ], [ [ [ 30.407638549804744,36.19208145141596 ], [ 30.409025192261026,36.179584503174055 ], [ 30.406806945800724,36.1754150390625 ], [ 30.402639389038143,36.190971374512 ], [ 30.407638549804744,36.19208145141596 ] ] ], [ [ [ 29.91486167907715,36.19763946533209 ], [ 29.881250381469727,36.1690292358399 ], [ 29.881805419921932,36.17680740356457 ], [ 29.84069442749029,36.1690292358399 ], [ 29.91486167907715,36.19763946533209 ] ] ], [ [ [ 30.405416488647404,36.202915191650504 ], [ 30.4029159545899,36.19680404663097 ], [ 30.399305343628214,36.19763946533209 ], [ 30.401805877685717,36.2023620605471 ], [ 30.405416488647404,36.202915191650504 ] ] ], [ [ [ 29.439306259155558,36.20458221435564 ], [ 29.437084197998104,36.199306488037394 ], [ 29.43541717529314,36.19902801513683 ], [ 29.434860229492358,36.203472137451456 ], [ 29.439306259155558,36.20458221435564 ] ] ], [ [ [ 29.899305343627987,36.20652770996111 ], [ 29.903747558593807,36.20375061035185 ], [ 29.90263938903803,36.20124816894554 ], [ 29.899026870727596,36.20264053344749 ], [ 29.899305343627987,36.20652770996111 ] ] ], [ [ [ 29.90736007690424,36.21291732788103 ], [ 29.90263938903803,36.20680618286133 ], [ 29.89486122131359,36.209304809570426 ], [ 29.897361755371094,36.211528778076115 ], [ 29.90736007690424,36.21291732788103 ] ] ], [ [ [ 29.36541748046892,36.218193054199446 ], [ 29.351528167724894,36.21014022827177 ], [ 29.3462505340579,36.208751678467024 ], [ 29.347360610962085,36.214027404785384 ], [ 29.36541748046892,36.218193054199446 ] ] ], [ [ [ 29.37402725219755,36.22458267211937 ], [ 29.37347030639677,36.219860076904354 ], [ 29.367639541626033,36.220695495605696 ], [ 29.36902809143095,36.22402954101557 ], [ 29.37402725219755,36.22458267211937 ] ] ], [ [ [ 30.472917556762752,36.240695953369425 ], [ 30.4809703826906,36.232082366943644 ], [ 30.479583740234432,36.23014068603533 ], [ 30.46986389160162,36.23680496215843 ], [ 30.472917556762752,36.240695953369425 ] ] ], [ [ [ 30.1443061828615,36.26541519165062 ], [ 30.14291572570818,36.26374816894548 ], [ 30.139862060546932,36.264862060547046 ], [ 30.139862060546932,36.26541519165062 ], [ 30.1443061828615,36.26541519165062 ] ] ], [ [ [ 30.55347251892107,36.460971832275504 ], [ 30.554027557373104,36.457359313964844 ], [ 30.547082901001147,36.457359313964844 ], [ 30.550693511963175,36.460971832275504 ], [ 30.55347251892107,36.460971832275504 ] ] ], [ [ [ 31.663749694824162,36.64764022827154 ], [ 31.664306640625284,36.645973205566406 ], [ 31.66124916076666,36.64708328247093 ], [ 31.66124916076666,36.64764022827154 ], [ 31.663749694824162,36.64764022827154 ] ] ], [ [ [ 30.589305877685547,36.80430603027344 ], [ 30.5904159545899,36.803195953369084 ], [ 30.5904159545899,36.800693511963175 ], [ 30.58791732788086,36.80208206176758 ], [ 30.589305877685547,36.80430603027344 ] ] ], [ [ [ 31.449348449707315,37.344013214111385 ], [ 31.727830886840934,37.32756423950195 ], [ 31.846702575683764,37.28829956054699 ], [ 32.23294830322283,37.00030899047857 ], [ 32.29104614257841,36.85093307495117 ], [ 32.42606353759777,36.82072830200207 ], [ 32.47058486938482,36.7511253356933 ], [ 32.45649719238298,36.674057006835994 ], [ 32.50381469726568,36.561042785644645 ], [ 32.55423355102556,36.5082168579101 ], [ 32.65814208984381,36.446079254150504 ], [ 32.63582229614252,36.38359451293945 ], [ 32.64662170410156,36.28344345092768 ], [ 32.58005905151373,36.11024856567377 ], [ 32.534862518310604,36.092082977295036 ], [ 32.48791503906244,36.109027862549055 ], [ 32.295417785644815,36.2343063354495 ], [ 32.274860382080135,36.28902816772461 ], [ 32.215972900390796,36.33569335937506 ], [ 32.165973663330135,36.417083740234375 ], [ 32.02958297729498,36.53819274902344 ], [ 32.00569534301775,36.542915344238565 ], [ 32.00041580200201,36.53041839599615 ], [ 31.985696792602653,36.52736282348644 ], [ 31.96875,36.55597305297863 ], [ 31.774583816528605,36.604026794433594 ], [ 31.7459716796875,36.63819503784191 ], [ 31.672082901001033,36.64402770996088 ], [ 31.561250686645565,36.71180725097679 ], [ 31.386249542236385,36.76402664184576 ], [ 31.38708305358915,36.780693054199446 ], [ 31.329584121704386,36.80930709838884 ], [ 31.00652694702177,36.85819625854498 ], [ 30.757360458374194,36.844860076904354 ], [ 30.700138092041072,36.88458251953125 ], [ 30.622360229492358,36.850692749023665 ], [ 30.574861526489542,36.794860839843864 ], [ 30.571250915527514,36.674861907958984 ], [ 30.554582595825252,36.645973205566406 ], [ 30.55985832214367,36.61152648925787 ], [ 30.591527938843058,36.589305877685604 ], [ 30.557916641235295,36.543472290039176 ], [ 30.56541633605957,36.53263854980463 ], [ 30.541528701782397,36.522361755371094 ], [ 30.507362365722827,36.46875000000017 ], [ 30.509580612182788,36.43986129760759 ], [ 30.481252670288143,36.434028625488224 ], [ 30.491807937622127,36.42152786254877 ], [ 30.476804733276538,36.39875030517595 ], [ 30.529584884643498,36.33430480957031 ], [ 30.467081069946573,36.314304351806754 ], [ 30.46819496154791,36.29902648925781 ], [ 30.488750457763842,36.2993049621582 ], [ 30.487638473510742,36.279026031494254 ], [ 30.40569305419939,36.209304809570426 ], [ 30.408193588256893,36.27541732788097 ], [ 30.3701362609865,36.26874923706049 ], [ 30.28125190734869,36.314582824707145 ], [ 30.20041656494169,36.31541824340826 ], [ 30.14958381652849,36.30097198486351 ], [ 30.151805877685604,36.27208328247076 ], [ 30.13819313049322,36.27791595459007 ], [ 30.116529464721737,36.24736022949219 ], [ 30.06152534484869,36.25958251953148 ], [ 29.98125076293951,36.21430969238298 ], [ 29.922361373901424,36.23402786254894 ], [ 29.890972137451172,36.211528778076115 ], [ 29.886804580688533,36.193748474121264 ], [ 29.845972061157283,36.196254730224894 ], [ 29.829027175903377,36.18902969360346 ], [ 29.85041618347185,36.19319534301769 ], [ 29.800693511963175,36.1654167175293 ], [ 29.829305648803768,36.1690292358399 ], [ 29.792638778686694,36.14291763305681 ], [ 29.75986289978033,36.14014053344755 ], [ 29.78347206115734,36.15791702270536 ], [ 29.722917556762866,36.16347122192377 ], [ 29.682638168335018,36.13041687011719 ], [ 29.678195953369197,36.152915954589844 ], [ 29.654581069946573,36.147083282470874 ], [ 29.630416870117244,36.16958236694353 ], [ 29.641805648803768,36.18375015258789 ], [ 29.650417327881144,36.173473358154354 ], [ 29.64486122131342,36.196254730224894 ], [ 29.58374977111822,36.18597412109398 ], [ 29.630416870117244,36.205417633056754 ], [ 29.45875167846674,36.2212486267091 ], [ 29.44152832031267,36.21041488647461 ], [ 29.455139160156307,36.22569274902372 ], [ 29.411806106567553,36.22430419921881 ], [ 29.40430641174345,36.244304656982536 ], [ 29.417085647583292,36.26069259643583 ], [ 29.392917633056925,36.2640266418457 ], [ 29.368473052978572,36.26263809204113 ], [ 29.374862670898494,36.24874877929693 ], [ 29.353197097778605,36.229583740234375 ], [ 29.31374931335455,36.246807098388786 ], [ 29.25625228881853,36.300140380859546 ], [ 29.29875755310087,36.31876373291044 ], [ 29.32847785949724,36.40187454223644 ], [ 29.32709121704113,36.44231796264643 ], [ 29.57402038574247,36.61486434936529 ], [ 29.604988098144702,36.779148101806754 ], [ 29.6735973358156,36.87476730346697 ], [ 29.684257507324503,36.919002532958984 ], [ 29.752204895019474,36.9354133605957 ], [ 29.809103012085018,36.99095535278326 ], [ 29.848285675049,37.12187194824219 ], [ 29.920265197754077,37.18822860717785 ], [ 30.04769325256342,37.237758636474666 ], [ 30.31538772583025,37.30717086791992 ], [ 30.361600875854663,37.29970932006836 ], [ 30.39347648620611,37.24317550659191 ], [ 30.44412612915056,37.22361755371122 ], [ 30.750419616699276,37.2364311218264 ], [ 30.805181503296183,37.22457885742199 ], [ 30.881935119628906,37.36235427856451 ], [ 30.93602561950712,37.37379455566406 ], [ 30.996772766113452,37.342758178710994 ], [ 31.17972755432146,37.389701843261946 ], [ 31.238805770874023,37.42179489135759 ], [ 31.323301315307617,37.42438888549816 ], [ 31.374643325805607,37.370304107666016 ], [ 31.449348449707315,37.344013214111385 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-75", "NAME_1": "Ardahan" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 42.7628822326663,41.58436965942383 ], [ 42.83630752563505,41.58284378051758 ], [ 42.82082748413097,41.53591918945318 ], [ 42.793460845947436,41.51644134521507 ], [ 42.809623718261776,41.49266052246105 ], [ 42.85192489624052,41.47278594970709 ], [ 42.86620330810564,41.4991073608399 ], [ 42.895412445068644,41.50369644165039 ], [ 42.90453720092779,41.48081207275402 ], [ 42.96959304809582,41.45151138305687 ], [ 43.024772644043026,41.378250122070256 ], [ 43.101520538330135,41.354579925537166 ], [ 43.1296119689942,41.317916870117244 ], [ 43.2023353576663,41.30036544799805 ], [ 43.12392044067411,41.25409317016624 ], [ 43.19209671020525,41.25211334228521 ], [ 43.23177719116228,41.19274902343756 ], [ 43.226543426513956,41.17605972290045 ], [ 43.28223037719755,41.181869506835994 ], [ 43.26377487182617,41.15536499023443 ], [ 43.26222610473661,41.09014511108393 ], [ 43.22616577148443,41.03093338012718 ], [ 43.17438125610357,41.00304412841808 ], [ 43.072074890136776,40.985820770263615 ], [ 42.91522598266607,40.92750167846697 ], [ 42.87519836425798,40.85858154296881 ], [ 42.869586944580135,40.77029800415039 ], [ 42.8360137939456,40.71354293823265 ], [ 42.704601287841854,40.68149566650385 ], [ 42.61116790771479,40.64011383056635 ], [ 42.54808425903349,40.64073181152361 ], [ 42.491706848144645,40.721416473388786 ], [ 42.37902069091825,40.83445358276373 ], [ 42.332916259765796,40.924530029296875 ], [ 42.33081436157232,40.982887268066406 ], [ 42.398357391357706,41.085273742675895 ], [ 42.48964691162138,41.1560173034668 ], [ 42.557403564453296,41.185615539550724 ], [ 42.583225250244084,41.22635269165039 ], [ 42.53187179565458,41.30082321167015 ], [ 42.472846984863565,41.439739227295036 ], [ 42.520328521728686,41.44004821777338 ], [ 42.51613616943388,41.479164123535156 ], [ 42.56949996948242,41.51092529296898 ], [ 42.57986831665045,41.566108703613565 ], [ 42.60232162475603,41.583797454833984 ], [ 42.70830154418974,41.59800720214844 ], [ 42.7628822326663,41.58436965942383 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-08", "NAME_1": "Artvin" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 41.58960723876953,41.51329803466791 ], [ 41.6549530029298,41.48361206054693 ], [ 41.708831787109546,41.497718811035156 ], [ 41.7156524658206,41.47513961791998 ], [ 41.78124237060575,41.4641685485841 ], [ 41.82311248779297,41.434616088867415 ], [ 41.95518493652372,41.524646759033146 ], [ 42.04813003540045,41.49452972412115 ], [ 42.087154388427905,41.51176452636713 ], [ 42.18389511108404,41.51451492309599 ], [ 42.203910827637,41.493595123291016 ], [ 42.281776428222656,41.495216369628906 ], [ 42.3340225219726,41.47102355957037 ], [ 42.40765380859369,41.466583251953125 ], [ 42.472846984863565,41.439739227295036 ], [ 42.53187179565458,41.30082321167015 ], [ 42.583225250244084,41.22635269165039 ], [ 42.557403564453296,41.185615539550724 ], [ 42.48964691162138,41.1560173034668 ], [ 42.398357391357706,41.085273742675895 ], [ 42.33081436157232,40.982887268066406 ], [ 42.273120880127124,40.9653129577639 ], [ 42.09929656982422,40.963840484619254 ], [ 42.01268005371111,40.93065643310547 ], [ 41.973175048828125,40.85636520385742 ], [ 41.90370178222685,40.640537261963004 ], [ 41.824424743652514,40.61821365356457 ], [ 41.71423721313471,40.66050338745123 ], [ 41.64821624755865,40.661705017089844 ], [ 41.428695678710994,40.563056945800724 ], [ 41.362621307373104,40.57928466796875 ], [ 41.33960342407255,40.6501579284668 ], [ 41.39697265625017,40.74471664428722 ], [ 41.3855819702149,40.77217483520536 ], [ 41.199081420898494,40.78024673461914 ], [ 41.12230682373047,40.80845260620117 ], [ 41.33703231811529,41.031253814697266 ], [ 41.407253265380916,41.06505966186529 ], [ 41.42398071289074,41.093452453613395 ], [ 41.40925979614258,41.11717605590832 ], [ 41.36881256103521,41.11997222900402 ], [ 41.3067703247072,41.155185699462834 ], [ 41.25561904907232,41.208522796630916 ], [ 41.24785232543974,41.25560760498041 ], [ 41.21147537231445,41.30291748046869 ], [ 41.27236175537138,41.344860076904354 ], [ 41.41069412231451,41.386528015136776 ], [ 41.474029541015796,41.46152877807617 ], [ 41.52180480957037,41.482639312744254 ], [ 41.54819488525385,41.526275634765625 ], [ 41.58960723876953,41.51329803466791 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-09", "NAME_1": "Aydın" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 27.329860687256087,37.331249237060774 ], [ 27.333749771118505,37.33013916015625 ], [ 27.331527709961392,37.3218040466308 ], [ 27.325416564941463,37.32541656494146 ], [ 27.329860687256087,37.331249237060774 ] ] ], [ [ [ 27.41152763366739,37.413471221923885 ], [ 27.410692214965877,37.40902709960949 ], [ 27.407917022705533,37.40902709960949 ], [ 27.408470153808935,37.41180419921898 ], [ 27.41152763366739,37.413471221923885 ] ] ], [ [ [ 27.181804656982422,37.563472747802905 ], [ 27.18291664123535,37.56124877929716 ], [ 27.182361602783374,37.560138702392805 ], [ 27.180416107177848,37.56124877929716 ], [ 27.181804656982422,37.563472747802905 ] ] ], [ [ [ 27.140417098998967,37.61375045776373 ], [ 27.142360687256257,37.60625076293945 ], [ 27.159860610962312,37.58680725097685 ], [ 27.13902854919479,37.60736083984381 ], [ 27.140417098998967,37.61375045776373 ] ] ], [ [ [ 27.005971908569677,37.65347290039085 ], [ 27.004583358764762,37.64930725097679 ], [ 26.999860763550146,37.64930725097679 ], [ 27.001249313354492,37.65208435058594 ], [ 27.005971908569677,37.65347290039085 ] ] ], [ [ [ 27.014862060547102,37.65513992309576 ], [ 27.014028549194336,37.6523628234865 ], [ 27.009304046630973,37.65263748168968 ], [ 27.010139465332486,37.654304504394645 ], [ 27.014862060547102,37.65513992309576 ] ] ], [ [ [ 27.01847267150896,37.69263839721697 ], [ 27.0181941986084,37.69041824340826 ], [ 27.015972137451456,37.6906929016115 ], [ 27.015693664550895,37.692359924316406 ], [ 27.01847267150896,37.69263839721697 ] ] ], [ [ [ 28.815587997436808,38.03673553466808 ], [ 28.869655609131087,37.982742309570426 ], [ 28.793079376220817,37.90647888183622 ], [ 28.76422882080078,37.84311676025402 ], [ 28.849018096923828,37.763168334961165 ], [ 28.87846755981451,37.691711425781534 ], [ 28.740436553955192,37.600101470947266 ], [ 28.614013671875057,37.610515594482536 ], [ 28.573816299438533,37.591552734375114 ], [ 28.550529479980753,37.570991516113224 ], [ 28.556762695312727,37.544166564941406 ], [ 28.604200363159407,37.47769927978527 ], [ 28.461118698120117,37.497226715088004 ], [ 28.294479370117188,37.586898803710994 ], [ 28.220544815063704,37.562210083007926 ], [ 28.14990234375,37.47454833984375 ], [ 27.884967803955192,37.4570426940918 ], [ 27.698598861694563,37.49717712402338 ], [ 27.506229400634936,37.574592590332145 ], [ 27.444992065429744,37.505565643310604 ], [ 27.414861679077262,37.41570281982433 ], [ 27.368749618530614,37.39958190917969 ], [ 27.359861373901424,37.372081756591854 ], [ 27.32930564880371,37.378471374511776 ], [ 27.330415725708065,37.342639923095874 ], [ 27.28541755676315,37.35625076293951 ], [ 27.253749847412507,37.335693359375 ], [ 27.191528320312955,37.35374832153343 ], [ 27.21791648864746,37.39236068725597 ], [ 27.20902824401901,37.398750305175895 ], [ 27.23069381713873,37.40569305419922 ], [ 27.218471527099837,37.41986083984381 ], [ 27.22763824462885,37.472362518310774 ], [ 27.22513961792032,37.48791503906273 ], [ 27.181804656982422,37.47402954101568 ], [ 27.202638626099088,37.489860534668026 ], [ 27.200971603393782,37.516250610351506 ], [ 27.194583892822266,37.53263854980497 ], [ 27.18986129760765,37.49124908447294 ], [ 27.18013954162643,37.48291778564453 ], [ 27.191528320312955,37.545696258545036 ], [ 27.16791725158697,37.536251068115234 ], [ 27.159585952758732,37.58541488647478 ], [ 27.17541885376022,37.56180572509777 ], [ 27.170974731445426,37.55902862548845 ], [ 27.171249389648835,37.54930496215832 ], [ 27.174583435058707,37.54763793945335 ], [ 27.217361450195483,37.59069442749035 ], [ 27.124305725097656,37.630973815918026 ], [ 27.002916336059627,37.6590270996096 ], [ 27.031248092651424,37.69013977050787 ], [ 27.099306106567496,37.680416107177734 ], [ 27.229305267333984,37.72069549560558 ], [ 27.2665252685548,37.78569412231445 ], [ 27.267639160156534,37.815692901611385 ], [ 27.235416412353516,37.83902740478533 ], [ 27.241249084472884,37.86013793945324 ], [ 27.263193130493164,37.86597061157221 ], [ 27.26513862609886,37.891803741455135 ], [ 27.35456848144537,37.891254425049055 ], [ 27.441749572753963,37.91611480712896 ], [ 27.494209289550838,37.943946838378906 ], [ 27.523767471313477,37.98232269287132 ], [ 27.72010993957548,37.985515594482536 ], [ 27.77575492858881,37.972328186035156 ], [ 27.923608779907283,37.99508666992193 ], [ 27.938676834106502,38.018360137939396 ], [ 27.95366859436035,38.006706237793026 ], [ 28.071899414062727,38.02942657470726 ], [ 28.249021530151367,38.01900100708008 ], [ 28.57966613769537,38.110542297363395 ], [ 28.696769714355526,38.1111297607423 ], [ 28.71974372863798,38.09927368164074 ], [ 28.71170043945341,38.077957153320426 ], [ 28.815587997436808,38.03673553466808 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-10", "NAME_1": "Balıkesir" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 26.59874916076666,39.30347061157232 ], [ 26.602916717529297,39.28319549560558 ], [ 26.577360153198185,39.27708435058605 ], [ 26.590972900390966,39.30180740356457 ], [ 26.59874916076666,39.30347061157232 ] ] ], [ [ [ 26.529584884643782,39.32097244262718 ], [ 26.52736282348667,39.3204154968264 ], [ 26.52486038208002,39.32125091552757 ], [ 26.53069686889654,39.322082519531534 ], [ 26.529584884643782,39.32097244262718 ] ] ], [ [ [ 26.65930557250988,39.324584960937614 ], [ 26.65930557250988,39.32291793823248 ], [ 26.656248092651424,39.32374954223627 ], [ 26.656248092651424,39.324584960937614 ], [ 26.65930557250988,39.324584960937614 ] ] ], [ [ [ 26.539304733276765,39.33180618286133 ], [ 26.543750762939396,39.325416564941406 ], [ 26.53069686889654,39.324584960937614 ], [ 26.531806945800895,39.33180618286133 ], [ 26.539304733276765,39.33180618286133 ] ] ], [ [ [ 26.606527328491325,39.34291839599604 ], [ 26.612638473510856,39.33319473266624 ], [ 26.5951385498048,39.336250305175724 ], [ 26.6020832061771,39.342639923095646 ], [ 26.606527328491325,39.34291839599604 ] ] ], [ [ [ 26.577638626098746,39.344860076904354 ], [ 26.579862594604833,39.339305877685774 ], [ 26.572917938232536,39.33319473266624 ], [ 26.57430648803711,39.34152603149414 ], [ 26.577638626098746,39.344860076904354 ] ] ], [ [ [ 26.695138931274528,39.34958267211937 ], [ 26.696805953979492,39.343193054199446 ], [ 26.683471679687443,39.344860076904354 ], [ 26.683471679687443,39.34680557250988 ], [ 26.695138931274528,39.34958267211937 ] ] ], [ [ [ 26.5951385498048,39.35041809082031 ], [ 26.601526260376147,39.34430694580095 ], [ 26.585695266723803,39.34291839599604 ], [ 26.585695266723803,39.348751068115405 ], [ 26.5951385498048,39.35041809082031 ] ] ], [ [ [ 26.672359466552734,39.354583740234375 ], [ 26.671527862548942,39.35235977172846 ], [ 26.664861679077603,39.35208511352562 ], [ 26.66625022888178,39.35347366333019 ], [ 26.672359466552734,39.354583740234375 ] ] ], [ [ [ 26.697082519531648,39.37236022949219 ], [ 26.698749542236385,39.369304656982536 ], [ 26.695693969726904,39.36736297607422 ], [ 26.694028854370174,39.371528625488224 ], [ 26.697082519531648,39.37236022949219 ] ] ], [ [ [ 26.727081298828182,39.37930679321306 ], [ 26.727363586425952,39.37680435180664 ], [ 26.724027633667106,39.3770828247072 ], [ 26.724306106567496,39.378471374511946 ], [ 26.727081298828182,39.37930679321306 ] ] ], [ [ [ 26.768474578857422,39.3795814514163 ], [ 26.768474578857422,39.374862670898494 ], [ 26.759860992431584,39.37263870239258 ], [ 26.761249542236328,39.37597274780285 ], [ 26.768474578857422,39.3795814514163 ] ] ], [ [ [ 26.707916259765625,39.38263702392578 ], [ 26.7095832824711,39.37374877929693 ], [ 26.703195571899414,39.37402725219749 ], [ 26.702917098999023,39.37985992431646 ], [ 26.707916259765625,39.38263702392578 ] ] ], [ [ [ 26.572360992431584,39.38513946533203 ], [ 26.575416564941463,39.380973815918196 ], [ 26.5695858001709,39.378192901611555 ], [ 26.56847381591831,39.38402938842768 ], [ 26.572360992431584,39.38513946533203 ] ] ], [ [ [ 26.614583969116552,39.395973205566406 ], [ 26.670139312744197,39.389862060547046 ], [ 26.623195648193416,39.37014007568388 ], [ 26.69069480896013,39.33347320556646 ], [ 26.622638702392635,39.32652664184593 ], [ 26.60791587829607,39.35180664062523 ], [ 26.623472213745572,39.356529235839844 ], [ 26.617359161377067,39.380416870117415 ], [ 26.59874916076666,39.38569259643583 ], [ 26.614583969116552,39.395973205566406 ] ] ], [ [ [ 26.59013938903803,39.39736175537132 ], [ 26.603195190429858,39.394859313964844 ], [ 26.588193893433072,39.36763763427757 ], [ 26.575695037842024,39.389862060547046 ], [ 26.59013938903803,39.39736175537132 ] ] ], [ [ [ 26.71236038208002,39.409862518310604 ], [ 26.711526870727653,39.40625 ], [ 26.705972671509244,39.40569305419939 ], [ 26.706806182861442,39.40819549560547 ], [ 26.71236038208002,39.409862518310604 ] ] ], [ [ [ 27.79013633728067,40.37819290161133 ], [ 27.78791427612299,40.3737487792971 ], [ 27.781805038452603,40.37291717529297 ], [ 27.781251907348633,40.37569427490263 ], [ 27.79013633728067,40.37819290161133 ] ] ], [ [ [ 28.09180641174322,40.45458221435547 ], [ 28.094028472900504,40.44958496093767 ], [ 28.085971832275447,40.45208358764677 ], [ 28.09041595459007,40.45541763305664 ], [ 28.09180641174322,40.45458221435547 ] ] ], [ [ [ 28.066804885864656,40.46291732788109 ], [ 28.074861526489315,40.46097183227539 ], [ 28.080415725708292,40.45180511474638 ], [ 28.062915802002237,40.45763778686535 ], [ 28.066804885864656,40.46291732788109 ] ] ], [ [ [ 27.66319465637207,40.46680450439476 ], [ 27.667085647583463,40.4462509155274 ], [ 27.65569686889677,40.445415496826456 ], [ 27.650693893432617,40.45291519165056 ], [ 27.66319465637207,40.46680450439476 ] ] ], [ [ [ 28.09874725341814,40.46930694580101 ], [ 28.105417251587028,40.46875000000023 ], [ 28.105417251587028,40.467918395996094 ], [ 28.098194122314908,40.46597290039057 ], [ 28.09874725341814,40.46930694580101 ] ] ], [ [ [ 27.565971374511832,40.46958160400402 ], [ 27.5668048858642,40.46736145019531 ], [ 27.56430625915567,40.465415954590014 ], [ 27.561807632446573,40.468471527099666 ], [ 27.565971374511832,40.46958160400402 ] ] ], [ [ [ 27.62125015258789,40.51124954223661 ], [ 27.623750686645565,40.497638702392805 ], [ 27.651527404785554,40.49319458007841 ], [ 27.632360458374023,40.47208404541033 ], [ 27.649583816528263,40.45208358764677 ], [ 27.577917098999478,40.462638854980696 ], [ 27.582639694213924,40.482639312744425 ], [ 27.60791587829584,40.48152923584007 ], [ 27.599304199218807,40.508750915527344 ], [ 27.62125015258789,40.51124954223661 ] ] ], [ [ [ 27.709583282470703,40.5259704589846 ], [ 27.710418701171875,40.52513885498047 ], [ 27.710136413574673,40.52265167236328 ], [ 27.708196640014933,40.52458190917969 ], [ 27.709583282470703,40.5259704589846 ] ] ], [ [ [ 27.583471298217887,40.52819442749052 ], [ 27.58625030517578,40.50569534301769 ], [ 27.580415725708008,40.494583129882756 ], [ 27.572360992431754,40.498195648193416 ], [ 27.583471298217887,40.52819442749052 ] ] ], [ [ [ 27.7537517547608,40.52847290039091 ], [ 27.77736091613781,40.52624893188499 ], [ 27.784860610961914,40.50597381591825 ], [ 27.794305801392056,40.51930618286133 ], [ 27.870695114136197,40.51708221435541 ], [ 28.031805038452546,40.48125076293951 ], [ 28.00597190856928,40.43986129760748 ], [ 27.89680480957071,40.39041519165062 ], [ 27.954584121704443,40.35291671752941 ], [ 28.060693740845124,40.38236236572271 ], [ 28.215667724609546,40.39819335937506 ], [ 28.139453887939794,40.31338882446312 ], [ 28.1234397888187,40.209861755371264 ], [ 28.123510360717773,40.11376953125006 ], [ 28.138450622558594,40.078830718994254 ], [ 28.21094131469738,40.03118896484398 ], [ 28.30317497253418,39.869155883789006 ], [ 28.33790016174345,39.86425018310564 ], [ 28.52121162414562,39.76625823974632 ], [ 28.67019081115734,39.755977630615234 ], [ 28.787443161010913,39.624740600586165 ], [ 28.909473419189453,39.62299346923834 ], [ 28.947071075439453,39.605796813964844 ], [ 28.96330642700218,39.58925628662132 ], [ 28.934938430786246,39.550872802734546 ], [ 28.940580368041935,39.519817352295036 ], [ 28.883300781250227,39.366607666015625 ], [ 28.793338775634766,39.283752441406364 ], [ 28.661375045776367,39.2337074279788 ], [ 28.66218757629406,39.163825988769474 ], [ 28.60289764404297,39.1800346374514 ], [ 28.466716766357536,39.12395095825201 ], [ 28.166194915771484,39.042678833007926 ], [ 28.112621307373274,39.062858581543026 ], [ 28.057016372680835,39.172363281250114 ], [ 27.99714279174816,39.22052001953142 ], [ 27.895751953125114,39.2360725402832 ], [ 27.8823184967041,39.26954650878906 ], [ 27.917137145996037,39.329010009765625 ], [ 27.896583557128906,39.35721206665045 ], [ 27.881540298462085,39.345581054687614 ], [ 27.79146385192871,39.35728836059582 ], [ 27.679256439208984,39.34687423706055 ], [ 27.612707138061694,39.36009979248047 ], [ 27.516485214233455,39.41384506225586 ], [ 27.407686233520792,39.38151550292969 ], [ 27.176755905151424,39.42146682739258 ], [ 26.957500457763672,39.259422302246094 ], [ 26.78491020202671,39.1717643737793 ], [ 26.739028930664062,39.20041656494152 ], [ 26.71819686889654,39.25902938842779 ], [ 26.60958480834978,39.272361755371264 ], [ 26.625415802002124,39.31152725219755 ], [ 26.65041732788086,39.32347106933588 ], [ 26.65680694580078,39.30374908447271 ], [ 26.630418777465877,39.29708480834961 ], [ 26.670972824097134,39.27902603149437 ], [ 26.663749694824276,39.30513763427763 ], [ 26.689029693603572,39.313194274902344 ], [ 26.70180320739786,39.34069442749035 ], [ 26.80569458007824,39.39208221435575 ], [ 26.79708480834961,39.43236160278343 ], [ 26.854860305786133,39.439861297607706 ], [ 26.858472824096964,39.477359771728516 ], [ 26.931249618530273,39.48541641235374 ], [ 26.95347023010254,39.55180740356451 ], [ 26.922639846802042,39.5837516784668 ], [ 26.88125038147001,39.58514022827154 ], [ 26.838472366333235,39.5579185485841 ], [ 26.774583816528548,39.571250915527344 ], [ 26.662944793701286,39.55847549438482 ], [ 26.6665878295899,39.650680541992415 ], [ 26.688920974731445,39.697902679443416 ], [ 26.738092422485522,39.718643188476676 ], [ 26.845289230346737,39.71005630493164 ], [ 26.980264663696403,39.78216171264654 ], [ 27.091777801513672,39.81017303466808 ], [ 27.15715980529785,39.81030654907238 ], [ 27.264280319214095,39.7708168029788 ], [ 27.423446655273494,39.829936981201286 ], [ 27.472572326660156,39.88761520385759 ], [ 27.492630004882812,39.93980789184599 ], [ 27.487668991088924,39.96401596069347 ], [ 27.450334548950195,39.98967361450195 ], [ 27.506595611572436,40.12036132812494 ], [ 27.472787857055835,40.20105743408203 ], [ 27.575317382812614,40.27116012573242 ], [ 27.587085723877124,40.31819534301769 ], [ 27.632917404174975,40.32680511474615 ], [ 27.659584045410213,40.306804656982365 ], [ 27.760972976684513,40.30625152587896 ], [ 27.87986183166504,40.374305725097884 ], [ 27.824306488037394,40.3995819091798 ], [ 27.795139312744254,40.38402938842802 ], [ 27.78319358825678,40.40902709960943 ], [ 27.74541664123575,40.430416107177905 ], [ 27.75180625915567,40.44930648803711 ], [ 27.686527252197664,40.47236251831049 ], [ 27.685140609741325,40.503192901611385 ], [ 27.7537517547608,40.52847290039091 ] ] ], [ [ [ 27.517639160156477,40.53791809082031 ], [ 27.552917480469148,40.5212516784668 ], [ 27.523471832275447,40.500415802002124 ], [ 27.537082672119254,40.488193511962834 ], [ 27.489582061767692,40.467918395996094 ], [ 27.47819328308117,40.4940261840822 ], [ 27.517639160156477,40.53791809082031 ] ] ], [ [ [ 27.501806259155728,40.553749084472656 ], [ 27.50652694702194,40.547637939453125 ], [ 27.465139389038313,40.53902816772484 ], [ 27.46708488464361,40.547637939453125 ], [ 27.501806259155728,40.553749084472656 ] ] ], [ [ [ 27.759582519531364,40.63347244262724 ], [ 27.7587509155274,40.63124847412132 ], [ 27.756526947021882,40.63180541992193 ], [ 27.756526947021882,40.632915496826286 ], [ 27.759582519531364,40.63347244262724 ] ] ], [ [ [ 27.48541641235346,40.647083282470874 ], [ 27.489860534668082,40.64625167846708 ], [ 27.488193511962947,40.63652801513672 ], [ 27.479585647583463,40.64152908325207 ], [ 27.48541641235346,40.647083282470874 ] ] ], [ [ [ 27.679027557373388,40.664028167724894 ], [ 27.68041419982916,40.66236114501959 ], [ 27.676805496216275,40.65847396850597 ], [ 27.676527023315884,40.661251068115234 ], [ 27.679027557373388,40.664028167724894 ] ] ], [ [ [ 27.635416030884244,40.668193817138956 ], [ 27.744028091430835,40.632637023925895 ], [ 27.608749389648608,40.57430648803734 ], [ 27.529306411743562,40.59680557250982 ], [ 27.53263854980503,40.64680480957048 ], [ 27.635416030884244,40.668193817138956 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-74", "NAME_1": "Bartın" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 32.38930511474604,41.755416870117415 ], [ 32.38986206054716,41.751804351806584 ], [ 32.38874816894548,41.75125122070335 ], [ 32.38708496093756,41.75374984741211 ], [ 32.38930511474604,41.755416870117415 ] ] ], [ [ [ 32.6841583251956,41.83443832397461 ], [ 32.761165618896655,41.7322998046875 ], [ 32.827293395996094,41.595649719238395 ], [ 32.92557525634771,41.553955078125 ], [ 32.8231658935548,41.51309204101574 ], [ 32.79067993164068,41.525810241699276 ], [ 32.7556343078615,41.489173889160384 ], [ 32.69793319702154,41.46401596069336 ], [ 32.6317977905274,41.35578155517578 ], [ 32.42853927612322,41.254291534424055 ], [ 32.35403823852545,41.23849105834972 ], [ 32.30512619018572,41.306194305420036 ], [ 32.02547073364252,41.548965454101506 ], [ 32.028751373291186,41.5745849609375 ], [ 32.06208419799833,41.570137023925724 ], [ 32.052082061767635,41.58152770996105 ], [ 32.149307250976676,41.60680389404314 ], [ 32.1798629760745,41.632083892822266 ], [ 32.17347335815458,41.640693664550895 ], [ 32.22874832153332,41.670696258545036 ], [ 32.224582672119425,41.68569564819359 ], [ 32.28319549560558,41.719581604004134 ], [ 32.34041595458996,41.722915649414006 ], [ 32.38208389282232,41.75374984741211 ], [ 32.415416717529354,41.73958206176786 ], [ 32.49874877929716,41.80152893066406 ], [ 32.57291793823259,41.810974121093864 ], [ 32.58013916015631,41.82736206054693 ], [ 32.6841583251956,41.83443832397461 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-72", "NAME_1": "Batman" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 41.58572387695324,38.54240417480463 ], [ 41.63222503662115,38.50775527954113 ], [ 41.66092300415045,38.426647186279524 ], [ 41.680023193359546,38.34867858886719 ], [ 41.67819213867193,38.20679855346691 ], [ 41.6461448669433,38.102352142333984 ], [ 41.60668945312506,38.038478851318416 ], [ 41.48127746582048,38.02124786376959 ], [ 41.480823516845874,37.986244201660156 ], [ 41.432540893554744,37.95641326904308 ], [ 41.4121208190918,37.91577911376959 ], [ 41.51866149902361,37.85847473144531 ], [ 41.73163986206072,37.85505676269531 ], [ 41.73792648315447,37.8255729675293 ], [ 41.70092010498058,37.77768707275396 ], [ 41.754611968994254,37.74295043945335 ], [ 41.838973999023494,37.76421737670921 ], [ 41.8682403564456,37.75908279418951 ], [ 41.8738899230957,37.74024581909191 ], [ 41.686473846435604,37.67586898803711 ], [ 41.573192596435604,37.57748413085932 ], [ 41.4461212158206,37.55442810058594 ], [ 41.18900680542009,37.556800842285384 ], [ 41.05128097534197,37.71851730346691 ], [ 41.051792144775675,37.73957443237305 ], [ 41.09960174560547,37.76951217651367 ], [ 41.11236953735357,37.80470275878906 ], [ 41.05167770385759,37.825115203857536 ], [ 41.033123016357365,37.85990142822277 ], [ 41.105842590332315,37.91629791259771 ], [ 41.21151351928728,38.105602264404354 ], [ 41.22935867309599,38.17604446411144 ], [ 41.21520614624029,38.21622085571289 ], [ 41.21492385864275,38.333042144775504 ], [ 41.232952117920036,38.39165115356445 ], [ 41.261119842529354,38.43730926513666 ], [ 41.35118865966797,38.471626281738565 ], [ 41.42137908935547,38.47715377807623 ], [ 41.434333801269474,38.49729156494146 ], [ 41.416931152344034,38.522247314453125 ], [ 41.43031311035185,38.53088378906273 ], [ 41.58572387695324,38.54240417480463 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-69", "NAME_1": "Bayburt" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 40.50198745727539,40.524814605712834 ], [ 40.52688598632818,40.48198318481451 ], [ 40.562980651855526,40.30159378051769 ], [ 40.631130218505916,40.24741744995123 ], [ 40.78762054443365,40.227943420410156 ], [ 40.79770660400408,40.20346832275402 ], [ 40.764133453369254,40.15393447875999 ], [ 40.64613723754883,40.11261749267584 ], [ 40.4773902893067,40.02457046508789 ], [ 40.37506103515631,40.02386474609375 ], [ 40.11088943481474,40.070037841796875 ], [ 39.879669189453125,40.00830078125023 ], [ 39.78475570678705,39.931087493896484 ], [ 39.70485687255865,39.975437164306754 ], [ 39.69057846069353,40.01388931274414 ], [ 39.74072265625006,40.07666397094732 ], [ 39.801929473876896,40.115879058837834 ], [ 39.817634582519815,40.15013122558594 ], [ 39.82343292236345,40.249820709228686 ], [ 39.85456085205084,40.3255500793457 ], [ 39.88367080688482,40.3472251892091 ], [ 39.988433837890625,40.36897277832037 ], [ 40.04511260986334,40.42015075683605 ], [ 40.09298324584955,40.512348175048885 ], [ 40.20972061157221,40.50019073486334 ], [ 40.48347854614275,40.535343170166016 ], [ 40.50198745727539,40.524814605712834 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-11", "NAME_1": "Bilecik" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 30.137876510620288,40.368118286132756 ], [ 30.30372619628912,40.402862548828125 ], [ 30.465574264526424,40.38898468017584 ], [ 30.62383460998541,40.335178375244254 ], [ 30.726753234863338,40.171913146972656 ], [ 30.571363449096623,40.14687728881859 ], [ 30.523212432861612,40.00673294067394 ], [ 30.464849472045955,39.95089340209955 ], [ 30.35621070861822,39.9370231628418 ], [ 30.248657226562784,39.85490798950207 ], [ 30.12443351745634,39.86803054809593 ], [ 30.058496475219783,39.84362411499029 ], [ 29.999553680419922,39.77170181274437 ], [ 30.002939224243164,39.72935867309593 ], [ 30.044765472412166,39.693233489990234 ], [ 29.952077865600756,39.68215942382835 ], [ 29.722852706909237,39.74099349975609 ], [ 29.68674087524431,39.82540512084961 ], [ 29.69292449951189,39.87970352172863 ], [ 29.67700767517084,39.90554428100603 ], [ 29.77089500427263,39.9065055847168 ], [ 29.78856849670416,39.93006134033203 ], [ 29.789287567138956,39.967704772949276 ], [ 29.72355651855497,40.00169372558605 ], [ 29.68801116943365,40.06284332275396 ], [ 29.73137855529791,40.190849304199446 ], [ 29.799266815185717,40.23756027221674 ], [ 29.83152389526373,40.285297393799 ], [ 29.805931091308707,40.34535980224615 ], [ 29.80528068542486,40.41008758544916 ], [ 29.838851928711108,40.472503662109546 ], [ 29.891553878784464,40.5150718688966 ], [ 29.941497802734432,40.53152847290039 ], [ 29.981578826904297,40.46556854248075 ], [ 30.137876510620288,40.368118286132756 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-12", "NAME_1": "Bingöl" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 40.94224929809576,39.514541625976676 ], [ 41.02952194213884,39.46599578857439 ], [ 41.1310348510745,39.45877838134771 ], [ 41.2186927795413,39.35533905029297 ], [ 41.18736267089861,39.332496643066406 ], [ 41.171733856201286,39.28934097290062 ], [ 41.204399108886776,39.16355514526367 ], [ 41.23756408691412,39.15412902832031 ], [ 41.274139404297046,39.11057281494152 ], [ 41.274494171142635,39.02955627441406 ], [ 41.15594863891596,38.90488433837896 ], [ 41.26630401611328,38.72560119628912 ], [ 40.91010284423834,38.59239578247093 ], [ 40.52542114257824,38.61225128173828 ], [ 40.49867248535162,38.59278869628906 ], [ 40.47573471069347,38.51073837280279 ], [ 40.44480895996094,38.478462219238395 ], [ 40.29214859008806,38.47479248046898 ], [ 40.297912597656534,38.549640655517635 ], [ 40.23947143554693,38.60807037353533 ], [ 40.24125289916992,38.645938873291016 ], [ 40.28793334960943,38.726707458496264 ], [ 40.35682296752947,38.725006103515625 ], [ 40.386886596679744,38.8065643310548 ], [ 40.35352325439459,38.86205291748058 ], [ 40.320285797119254,38.86981201171898 ], [ 40.286796569824276,38.94425582885742 ], [ 40.284648895263956,39.041481018066634 ], [ 40.39783859252947,39.15583801269531 ], [ 40.38748931884771,39.195796966552734 ], [ 40.354022979736385,39.22611618041992 ], [ 40.0097732543947,39.089889526367244 ], [ 40.04188919067383,39.13946533203125 ], [ 40.03049850463873,39.19946670532232 ], [ 40.064739227295206,39.26797866821312 ], [ 40.098674774170206,39.31428146362305 ], [ 40.20206451416021,39.28889083862305 ], [ 40.390830993652344,39.382858276367244 ], [ 40.33533477783203,39.427463531494254 ], [ 40.51652145385748,39.5039901733399 ], [ 40.54322814941406,39.54778289794922 ], [ 40.68346405029314,39.51169967651373 ], [ 40.862430572509766,39.565601348876896 ], [ 40.90938568115263,39.550853729248104 ], [ 40.94224929809576,39.514541625976676 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-13", "NAME_1": "Bitlis" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 43.13637161254883,38.92792129516613 ], [ 43.197910308838004,38.8801727294923 ], [ 43.196823120117244,38.828151702880916 ], [ 43.178493499756144,38.79753494262695 ], [ 43.056091308593864,38.72330474853521 ], [ 42.964450836181754,38.61788177490246 ], [ 42.9462432861331,38.614349365234375 ], [ 42.8891716003418,38.52491760253906 ], [ 42.72961044311529,38.45822143554693 ], [ 42.68778610229509,38.42295074462902 ], [ 42.739238739013615,38.277294158935774 ], [ 42.7185440063476,38.20607376098633 ], [ 42.75567626953131,38.175254821777344 ], [ 42.79895782470709,38.16839981079107 ], [ 42.777313232421875,38.127155303955135 ], [ 42.8357009887697,38.06550598144537 ], [ 42.73911666870117,38.013481140137 ], [ 42.49808883666998,38.109996795654354 ], [ 42.371692657470646,38.13842010498058 ], [ 42.298156738281534,38.18778610229509 ], [ 42.20790863037138,38.21693801879883 ], [ 42.095233917236385,38.20076751708996 ], [ 42.025947570801065,38.12945938110357 ], [ 41.97900390625006,38.15625381469738 ], [ 41.91657638549833,38.148315429687614 ], [ 41.67486572265625,38.19519042968773 ], [ 41.67907714843767,38.35854721069359 ], [ 41.63345336914057,38.50515365600586 ], [ 41.59266662597673,38.540195465088175 ], [ 41.52218246459961,38.541912078857706 ], [ 41.57016754150408,38.58500671386719 ], [ 41.62169647216797,38.59952545166021 ], [ 41.863296508789006,38.590469360351506 ], [ 41.940517425537166,38.61808013916027 ], [ 42.056205749511776,38.69475173950195 ], [ 42.054039001464844,38.728683471679744 ], [ 41.998836517334155,38.78861618041992 ], [ 42.002147674560604,38.814769744873104 ], [ 42.136615753173885,38.823856353759766 ], [ 42.13997268676758,38.87031555175781 ], [ 42.310134887695426,38.93563461303711 ], [ 42.4895858764649,38.9266815185548 ], [ 42.56119918823248,38.94335556030279 ], [ 42.68435287475603,38.926906585693416 ], [ 42.76899337768549,38.94040298461914 ], [ 42.749843597412166,39.03714752197277 ], [ 42.827857971191406,39.06509017944347 ], [ 43.02248382568365,39.09549331665056 ], [ 43.00571441650396,38.98618316650396 ], [ 43.13637161254883,38.92792129516613 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-14", "NAME_1": "Bolu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 31.912191390991495,41.01945114135742 ], [ 32.28520965576189,41.00830078125006 ], [ 32.28196716308611,40.94109725952171 ], [ 32.50800323486328,40.862258911132926 ], [ 32.540092468261776,40.80879592895536 ], [ 32.521430969238395,40.72862625122093 ], [ 32.430423736572266,40.65179443359392 ], [ 32.47593688964861,40.5302276611331 ], [ 32.38796997070307,40.423839569091854 ], [ 32.32307052612322,40.41284942626976 ], [ 32.14555358886719,40.424667358398494 ], [ 31.9033527374267,40.34561157226557 ], [ 31.79364585876482,40.33181762695318 ], [ 31.705093383789347,40.34394454956066 ], [ 31.566928863525675,40.30855178833008 ], [ 31.26392936706543,40.346771240234375 ], [ 31.14426994323742,40.39905548095703 ], [ 31.06073379516596,40.41575241088867 ], [ 31.037288665771484,40.37631988525385 ], [ 31.047548294067383,40.2725639343264 ], [ 30.955003738403605,40.22293853759777 ], [ 30.873971939086914,40.14034652709961 ], [ 30.726753234863338,40.171913146972656 ], [ 30.636177062988338,40.30845642089844 ], [ 30.62383460998541,40.335178375244254 ], [ 30.6464271545413,40.38548660278343 ], [ 30.59591865539568,40.44455718994152 ], [ 30.676174163818644,40.51831817626959 ], [ 30.82930183410673,40.51985549926752 ], [ 30.9108257293704,40.5385627746582 ], [ 30.946756362915096,40.57278442382807 ], [ 30.954557418823242,40.682250976562614 ], [ 31.026567459106445,40.65954208374029 ], [ 31.190750122070483,40.68179702758789 ], [ 31.264896392822322,40.646827697753906 ], [ 31.36094474792492,40.66146087646496 ], [ 31.42705917358404,40.70133590698265 ], [ 31.43151664733898,40.805057525634766 ], [ 31.469253540039233,40.87095642089844 ], [ 31.60422897338873,40.8813362121582 ], [ 31.690898895263956,40.91467666625971 ], [ 31.73953056335455,40.94845199584961 ], [ 31.757904052734432,40.987693786621094 ], [ 31.75791931152355,41.01557540893549 ], [ 31.736297607421932,41.042720794677734 ], [ 31.912191390991495,41.01945114135742 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-15", "NAME_1": "Burdur" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 30.54076385498047,37.703563690185774 ], [ 30.651264190674,37.700595855712834 ], [ 30.70260238647461,37.6779670715332 ], [ 30.76529884338396,37.52559661865229 ], [ 30.907865524292163,37.398216247558594 ], [ 30.915895462036417,37.37248611450207 ], [ 30.870082855224666,37.35358428955078 ], [ 30.805181503296183,37.22457885742199 ], [ 30.750419616699276,37.23643112182623 ], [ 30.44412612915056,37.22361755371105 ], [ 30.39347648620611,37.24317550659191 ], [ 30.356336593627987,37.302886962890625 ], [ 30.288280487060547,37.305519104003906 ], [ 30.04769325256342,37.237758636474666 ], [ 29.877441406250057,37.16139221191429 ], [ 29.84602165222185,37.11684417724621 ], [ 29.8244247436524,37.01425552368187 ], [ 29.737199783325195,36.92720031738287 ], [ 29.684257507324503,36.919002532958984 ], [ 29.62462997436529,36.99750900268566 ], [ 29.546728134155217,37.027606964111555 ], [ 29.511768341064737,37.024211883545036 ], [ 29.44611740112316,36.96438980102539 ], [ 29.394460678100643,36.952030181884766 ], [ 29.4083900451663,37.01031112670927 ], [ 29.387758255004826,37.076091766357536 ], [ 29.395507812500284,37.15217590332031 ], [ 29.44138145446783,37.23631668090832 ], [ 29.523260116577433,37.31515121459961 ], [ 29.579244613647518,37.41019439697277 ], [ 29.57953453063959,37.43535614013683 ], [ 29.530990600586108,37.46260452270508 ], [ 29.526779174804858,37.5913848876956 ], [ 29.865327835083292,37.77055358886736 ], [ 29.994150161743335,37.78136062622076 ], [ 30.03392410278326,37.71933364868164 ], [ 30.08116722106928,37.703464508056584 ], [ 30.32950592041027,37.83989715576183 ], [ 30.371025085449276,37.83028030395536 ], [ 30.438201904296932,37.754367828369425 ], [ 30.54076385498047,37.703563690185774 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-16", "NAME_1": "Bursa" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 28.539026260375977,40.56708145141607 ], [ 28.555141448974837,40.564861297607365 ], [ 28.53624916076666,40.54875183105463 ], [ 28.5454158782959,40.5259704589846 ], [ 28.524583816528377,40.51124954223661 ], [ 28.517915725708065,40.565139770507926 ], [ 28.539026260375977,40.56708145141607 ] ] ], [ [ [ 29.928827285766886,40.558509826660156 ], [ 29.941497802734432,40.53152847290039 ], [ 29.856920242309855,40.48979568481451 ], [ 29.809238433837947,40.42584228515631 ], [ 29.805931091308707,40.34535980224615 ], [ 29.833244323730753,40.29028701782232 ], [ 29.799266815185717,40.23756027221674 ], [ 29.73137855529791,40.190849304199446 ], [ 29.68801116943365,40.06284332275396 ], [ 29.72355651855497,40.00169372558605 ], [ 29.789287567138956,39.967704772949276 ], [ 29.782350540161417,39.91889572143572 ], [ 29.760942459106502,39.9033012390139 ], [ 29.615415573120117,39.891330718994254 ], [ 29.53948783874506,39.89305877685547 ], [ 29.45207023620617,39.92456817626976 ], [ 29.411384582519702,39.909908294677734 ], [ 29.336360931396655,39.77615356445318 ], [ 29.267078399658203,39.692760467529354 ], [ 29.247165679931697,39.5811576843264 ], [ 29.223285675048885,39.55531311035179 ], [ 29.092315673828125,39.543609619140625 ], [ 28.99761009216303,39.566928863525504 ], [ 28.909473419189453,39.62299346923834 ], [ 28.807842254638672,39.6169128417971 ], [ 28.77256011962902,39.63481521606457 ], [ 28.67019081115734,39.755977630615234 ], [ 28.52121162414562,39.76625823974632 ], [ 28.33790016174345,39.86425018310564 ], [ 28.30317497253418,39.869155883789006 ], [ 28.21094131469738,40.03118896484398 ], [ 28.138450622558594,40.078830718994254 ], [ 28.123510360717773,40.11376953125006 ], [ 28.14102172851591,40.319377899170036 ], [ 28.215667724609546,40.39819335937506 ], [ 28.510417938232365,40.395137786865234 ], [ 28.490692138672216,40.37958145141624 ], [ 28.482360839844148,40.36319351196295 ], [ 28.51597023010254,40.394859313964844 ], [ 28.650970458984602,40.35930633544933 ], [ 28.796806335449162,40.39430618286144 ], [ 28.871250152588175,40.38486099243181 ], [ 28.92597198486328,40.35597229003906 ], [ 28.98013877868675,40.35597229003906 ], [ 29.054027557373217,40.36319351196295 ], [ 29.085971832275447,40.41764068603521 ], [ 29.154306411743335,40.42541503906256 ], [ 29.09180641174339,40.4745826721192 ], [ 29.03236198425293,40.478588104248104 ], [ 29.010364532470874,40.497295379638786 ], [ 29.045017242431754,40.559192657470874 ], [ 29.26760673522955,40.55602264404297 ], [ 29.362733840942667,40.580024719238224 ], [ 29.45255661010748,40.555171966552734 ], [ 29.564767837524414,40.55538940429699 ], [ 29.78633308410656,40.613414764404524 ], [ 29.92487716674833,40.577526092529354 ], [ 29.928827285766886,40.558509826660156 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-17", "NAME_1": "Çanakkale" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 26.0534725189209,39.84736251831055 ], [ 26.075693130493164,39.8365287780764 ], [ 26.083751678466797,39.80125045776373 ], [ 26.06180572509811,39.78708267211914 ], [ 25.962083816528377,39.8370819091798 ], [ 26.0534725189209,39.84736251831055 ] ] ], [ [ [ 26.08652687072788,39.920417785644815 ], [ 26.087360382080078,39.917640686035156 ], [ 26.081247329712312,39.9181938171389 ], [ 26.08430480957037,39.920139312744254 ], [ 26.08652687072788,39.920417785644815 ] ] ], [ [ [ 26.053194046020508,39.931526184081974 ], [ 26.053747177124478,39.92986297607439 ], [ 26.050138473511026,39.92986297607439 ], [ 26.051250457763786,39.931526184081974 ], [ 26.053194046020508,39.931526184081974 ] ] ], [ [ [ 26.060972213745174,39.940692901611555 ], [ 26.072916030884244,39.93624877929716 ], [ 26.07847213745123,39.93847274780302 ], [ 26.079860687255973,39.937362670898665 ], [ 26.067640304565487,39.931251525879134 ], [ 26.060972213745174,39.940692901611555 ] ] ], [ [ [ 25.944583892822322,40.24124908447277 ], [ 25.977083206176758,40.216251373291186 ], [ 25.965972900390625,40.15013885498047 ], [ 25.988470077514876,40.14430618286133 ], [ 26.013748168945597,40.163749694824446 ], [ 25.993749618530444,40.131526947021484 ], [ 25.739027023315487,40.09069442749018 ], [ 25.665136337280273,40.12430572509777 ], [ 25.670694351196403,40.15375137329124 ], [ 25.78513717651373,40.210414886474666 ], [ 25.84291648864746,40.21125030517601 ], [ 25.944583892822322,40.24124908447277 ] ] ], [ [ [ 26.714027404785156,40.38874816894531 ], [ 26.715414047241666,40.38124847412121 ], [ 26.70541572570812,40.383193969726506 ], [ 26.707082748413427,40.385971069336165 ], [ 26.714027404785156,40.38874816894531 ] ] ], [ [ [ 27.286527633666935,40.47513961792015 ], [ 27.333749771118335,40.41125106811529 ], [ 27.304861068725756,40.400970458984375 ], [ 27.308750152588175,40.371807098388786 ], [ 27.49319648742693,40.307083129882756 ], [ 27.580728530883732,40.31188583374029 ], [ 27.575317382812614,40.27116012573242 ], [ 27.468250274658146,40.19468688964855 ], [ 27.50711631774908,40.125858306884766 ], [ 27.450334548950195,39.98967361450195 ], [ 27.487668991088924,39.96401596069347 ], [ 27.492630004882812,39.93980789184599 ], [ 27.472572326660156,39.88761520385759 ], [ 27.423446655273494,39.829936981201286 ], [ 27.264280319214095,39.7708168029788 ], [ 27.15715980529785,39.81030654907238 ], [ 27.091777801513672,39.81017303466808 ], [ 26.980264663696403,39.78216171264654 ], [ 26.845289230346737,39.71005630493164 ], [ 26.723983764648665,39.715759277343864 ], [ 26.688920974731445,39.697902679443416 ], [ 26.669155120849837,39.65981674194347 ], [ 26.66930580139166,39.55764007568371 ], [ 26.657917022705135,39.55180740356451 ], [ 26.459581375122013,39.521251678466854 ], [ 26.37624931335455,39.49652862548828 ], [ 26.368194580078296,39.480415344238395 ], [ 26.264862060546875,39.483196258545036 ], [ 26.24180793762207,39.46374893188471 ], [ 26.229858398437784,39.474582672119254 ], [ 26.131250381469783,39.45291519165039 ], [ 26.063194274902287,39.47819519042969 ], [ 26.105693817138672,39.58541488647472 ], [ 26.142360687255916,39.612640380859375 ], [ 26.163473129272404,39.659305572509936 ], [ 26.139862060546818,39.75708389282255 ], [ 26.158472061157227,39.776527404785156 ], [ 26.163751602172795,39.81791687011719 ], [ 26.137083053588924,39.840972900390625 ], [ 26.159305572509993,39.88291549682623 ], [ 26.149858474731616,39.91569519042963 ], [ 26.1773624420166,39.98903274536127 ], [ 26.198194503784123,40.00986099243164 ], [ 26.269582748413086,40.0006942749024 ], [ 26.333194732666186,40.02763748168951 ], [ 26.365972518920955,40.10013961792015 ], [ 26.409860610961914,40.119304656982365 ], [ 26.397361755371037,40.145694732666016 ], [ 26.40875053405756,40.1548614501956 ], [ 26.403194427490405,40.19680404663086 ], [ 26.449028015136832,40.1940269470216 ], [ 26.524583816528605,40.21764373779297 ], [ 26.572639465331974,40.2801399230957 ], [ 26.606527328491325,40.28125000000023 ], [ 26.693195343017635,40.35291671752941 ], [ 26.689861297607365,40.365695953369254 ], [ 26.752359390258903,40.40291595459007 ], [ 26.91319465637207,40.406528472900504 ], [ 26.953193664550952,40.38375091552746 ], [ 27.03319358825695,40.38958358764643 ], [ 27.089860916137923,40.442081451416186 ], [ 27.155138015747127,40.4520835876466 ], [ 27.20513916015642,40.4343070983889 ], [ 27.286527633666935,40.47513961792015 ] ] ], [ [ [ 27.04261207580595,40.74805068969732 ], [ 27.029438018799055,40.59069442749029 ], [ 26.996250152588118,40.55569458007818 ], [ 26.900138854980412,40.53625106811518 ], [ 26.699306488037166,40.45430374145508 ], [ 26.70013809204113,40.41986083984392 ], [ 26.64125061035162,40.40319442749029 ], [ 26.631248474121094,40.362361907958984 ], [ 26.591249465942383,40.321250915527514 ], [ 26.509859085083065,40.28819274902355 ], [ 26.424583435058878,40.22069549560547 ], [ 26.358194351196516,40.20319366455078 ], [ 26.38097381591814,40.143196105957145 ], [ 26.224304199218807,40.04958343505871 ], [ 26.16986083984375,40.045970916748274 ], [ 26.278472900390682,40.215694427490234 ], [ 26.278749465942496,40.25374984741222 ], [ 26.22930526733421,40.28874969482433 ], [ 26.24652862548828,40.29958343505865 ], [ 26.24264144897461,40.31375122070324 ], [ 26.21846961975109,40.31958389282221 ], [ 26.308471679687443,40.365970611572266 ], [ 26.331806182861612,40.3637504577639 ], [ 26.45569419860857,40.441528320312614 ], [ 26.625415802002124,40.50847244262695 ], [ 26.703750610351562,40.51041793823265 ], [ 26.74736022949213,40.559028625488565 ], [ 26.74875068664545,40.54624938964872 ], [ 26.769584655761776,40.54513931274437 ], [ 26.834863662719783,40.58124923706083 ], [ 26.81875038146967,40.6470832824707 ], [ 26.759315490722713,40.69137954711914 ], [ 26.783828735351562,40.74620056152344 ], [ 26.85856628417963,40.744842529296875 ], [ 26.987554550170955,40.80205917358421 ], [ 27.02488708496088,40.791057586670206 ], [ 27.04261207580595,40.74805068969732 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-18", "NAME_1": "Çankırı" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 33.78607177734375,40.96249008178722 ], [ 33.82974624633795,40.91614532470703 ], [ 34.03589248657232,40.85097122192377 ], [ 34.057151794433594,40.800819396972884 ], [ 34.04485702514654,40.680839538574446 ], [ 34.10348129272472,40.520450592041016 ], [ 34.15930557250982,40.431739807129134 ], [ 34.15694808959961,40.398799896240234 ], [ 34.1071968078615,40.32553863525402 ], [ 33.96546936035162,40.260776519775504 ], [ 33.718235015869425,40.28034591674805 ], [ 33.40986251831072,40.38897705078125 ], [ 33.364143371581974,40.38593292236334 ], [ 33.330764770507756,40.33474349975609 ], [ 33.2674293518067,40.331134796142805 ], [ 33.22098541259771,40.351249694824446 ], [ 33.17174530029314,40.434806823730526 ], [ 32.96144866943371,40.59566879272484 ], [ 32.65491485595709,40.702560424804744 ], [ 32.50134658813505,40.704257965088004 ], [ 32.539924621582145,40.79755020141613 ], [ 32.519256591796875,40.83922576904308 ], [ 32.587478637695256,40.89188003540062 ], [ 32.6919403076173,40.957851409912166 ], [ 33.027935028076456,41.01646423339844 ], [ 33.07714080810564,41.088871002197266 ], [ 33.18547439575207,41.07445526123047 ], [ 33.2963294982913,41.02467346191406 ], [ 33.349895477295206,40.97469711303722 ], [ 33.40762329101591,40.95941925048828 ], [ 33.8348770141601,41.09566879272472 ], [ 33.85814666748041,41.07776641845726 ], [ 33.86064910888672,41.05282211303711 ], [ 33.791225433349666,40.99592971801752 ], [ 33.78607177734375,40.96249008178722 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-19", "NAME_1": "Çorum" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 34.819057464599666,41.20172119140631 ], [ 34.85211944580095,41.19771957397455 ], [ 34.892101287841854,41.253662109375114 ], [ 34.94060516357439,41.20204162597656 ], [ 34.97922515869146,41.0832786560058 ], [ 35.01823425292986,41.07475662231445 ], [ 35.093154907226506,41.09054183959961 ], [ 35.09133148193365,41.03227615356468 ], [ 35.04957199096674,40.95141220092779 ], [ 35.04604339599604,40.852909088134766 ], [ 35.02510070800798,40.843399047851676 ], [ 35.09455871582031,40.695533752441634 ], [ 35.16113281250006,40.66824340820335 ], [ 35.25703811645519,40.666099548340014 ], [ 35.346443176269815,40.64120483398449 ], [ 35.42771530151373,40.615207672119254 ], [ 35.46203994750982,40.578224182129134 ], [ 35.448406219482365,40.46772384643566 ], [ 35.343681335449276,40.35832595825195 ], [ 35.33233642578119,40.228908538818416 ], [ 35.288646697998104,40.213741302490234 ], [ 35.16777420043957,40.2132301330567 ], [ 35.17874526977556,40.090763092041016 ], [ 35.05699539184599,40.02979278564453 ], [ 34.91966629028349,40.05079650878906 ], [ 34.78937911987333,39.99235153198248 ], [ 34.394672393798885,39.99183654785156 ], [ 34.32065582275419,39.947689056396484 ], [ 34.154014587402514,39.93353271484398 ], [ 34.05434417724615,39.90491104125988 ], [ 34.06595611572271,39.95508575439476 ], [ 34.1991729736331,40.03972244262707 ], [ 34.14983749389677,40.07336425781256 ], [ 34.105388641357536,40.131149291992415 ], [ 34.08119583129911,40.22275161743164 ], [ 33.96546936035162,40.260776519775504 ], [ 34.1071968078615,40.32553863525402 ], [ 34.161037445068416,40.41214370727539 ], [ 34.04485702514654,40.680839538574446 ], [ 34.057151794433594,40.800819396972884 ], [ 34.03589248657232,40.85097122192377 ], [ 34.27776718139654,40.92724227905302 ], [ 34.27907180786133,40.976325988769645 ], [ 34.22607040405279,41.00858306884777 ], [ 34.210571289062614,41.040046691894645 ], [ 34.29096221923845,41.16743850708008 ], [ 34.43107604980497,41.304927825927734 ], [ 34.466541290283374,41.30647277832037 ], [ 34.521492004394815,41.27654266357433 ], [ 34.819057464599666,41.20172119140631 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-20", "NAME_1": "Denizli" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 29.85498237609869,38.42560577392584 ], [ 29.928991317749194,38.406925201416016 ], [ 30.041721343994197,38.2337265014649 ], [ 30.020292282104776,38.17622375488281 ], [ 29.924520492553825,38.10348129272478 ], [ 29.665998458862475,37.98868942260748 ], [ 29.663770675659237,37.852550506591854 ], [ 29.72046852111822,37.852550506591854 ], [ 29.81536865234392,37.81905364990257 ], [ 29.845273971557788,37.76081848144531 ], [ 29.526779174804858,37.5913848876956 ], [ 29.530990600586108,37.46260452270508 ], [ 29.57953453063959,37.43535614013683 ], [ 29.579244613647518,37.41019439697277 ], [ 29.523260116577433,37.31515121459961 ], [ 29.411666870117244,37.18967819213867 ], [ 29.387758255004826,37.076091766357536 ], [ 29.334857940673885,37.035694122314396 ], [ 29.328029632568416,36.95631408691406 ], [ 29.262014389038256,36.88135910034191 ], [ 29.19094657897955,36.88718414306652 ], [ 29.081838607788143,36.99150466918945 ], [ 29.07584381103527,37.047645568847656 ], [ 29.05659675598173,37.07457733154297 ], [ 29.063364028930664,37.104351043701286 ], [ 29.0329914093017,37.144401550293026 ], [ 28.928304672241268,37.20682525634777 ], [ 28.786222457886026,37.24433517456066 ], [ 28.74400711059576,37.35529327392578 ], [ 28.614433288574332,37.39347839355469 ], [ 28.611564636230753,37.472900390625114 ], [ 28.550529479980753,37.570991516113224 ], [ 28.60674095153837,37.60981369018549 ], [ 28.740436553955192,37.600101470947266 ], [ 28.87957382202171,37.69700241088867 ], [ 28.849018096923828,37.763168334961165 ], [ 28.76422882080078,37.84311676025402 ], [ 28.793079376220817,37.90647888183622 ], [ 28.866380691528377,37.9932594299317 ], [ 28.799518585205362,38.0478324890139 ], [ 28.70470046997076,38.087642669677734 ], [ 28.789449691772518,38.14189910888672 ], [ 28.801586151123104,38.218879699707145 ], [ 28.92095375061041,38.265453338623104 ], [ 29.22126007080078,38.195537567138956 ], [ 29.42590332031267,38.26173400878912 ], [ 29.54411315917963,38.19533920288097 ], [ 29.57591819763178,38.19177246093756 ], [ 29.594125747680607,38.27232742309593 ], [ 29.64810752868658,38.34411239624035 ], [ 29.68351745605497,38.430995941162166 ], [ 29.755413055419922,38.45410919189453 ], [ 29.85498237609869,38.42560577392584 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-21", "NAME_1": "Diyarbakır" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 41.393245697021484,38.59392929077154 ], [ 41.381370544433594,38.54735183715826 ], [ 41.433452606201456,38.49269866943365 ], [ 41.41843032836931,38.47577667236334 ], [ 41.35118865966797,38.471626281738565 ], [ 41.247844696045206,38.426227569580135 ], [ 41.21492385864275,38.333042144775504 ], [ 41.21520614624029,38.21622085571289 ], [ 41.22935867309599,38.17604446411144 ], [ 41.21151351928728,38.105602264404354 ], [ 41.105842590332315,37.91629791259771 ], [ 41.03360366821295,37.86264419555687 ], [ 41.05167770385759,37.825115203857536 ], [ 41.11236953735357,37.80470275878906 ], [ 41.09494400024431,37.765148162841854 ], [ 41.051792144775675,37.73957443237305 ], [ 40.80224990844732,37.717403411865234 ], [ 40.752021789550895,37.730331420898494 ], [ 40.715831756591854,37.761577606201286 ], [ 40.64764404296881,37.76625823974621 ], [ 40.60204696655302,37.787681579589844 ], [ 40.54299545288086,37.733390808105526 ], [ 40.535087585449276,37.67518997192394 ], [ 40.5161018371582,37.650424957275504 ], [ 40.41819000244146,37.6458854675293 ], [ 40.27312088012701,37.56756973266624 ], [ 40.09448623657255,37.589130401611555 ], [ 40.01730346679699,37.5563125610351 ], [ 39.881374359130916,37.55633163452154 ], [ 39.86167144775402,37.60364151000982 ], [ 39.86046981811552,37.746318817138786 ], [ 39.82324218750017,37.787952423095646 ], [ 39.76156616210966,37.83341598510742 ], [ 39.66156768798834,37.84016799926769 ], [ 39.41362762451183,37.995002746581974 ], [ 39.25479507446295,37.99920654296875 ], [ 39.17874908447283,38.030654907226676 ], [ 39.22737503051769,38.07843399047863 ], [ 39.24422836303711,38.172023773193416 ], [ 39.20501708984369,38.19129943847656 ], [ 39.160182952880916,38.17333602905296 ], [ 39.11173629760748,38.18469238281273 ], [ 39.14226913452154,38.27321624755865 ], [ 39.119144439697436,38.33825683593756 ], [ 39.26699066162138,38.36811065673828 ], [ 39.33853530883795,38.33818817138672 ], [ 39.39870071411161,38.33542633056652 ], [ 39.57147216796892,38.36953735351568 ], [ 39.73397445678722,38.37126541137695 ], [ 39.81111526489275,38.4249267578125 ], [ 39.86201477050787,38.49816513061546 ], [ 40.05464172363287,38.475044250488395 ], [ 40.437953948974666,38.476139068603516 ], [ 40.466030120849894,38.492721557617415 ], [ 40.497112274170206,38.5901451110841 ], [ 40.52542114257824,38.61225128173828 ], [ 40.91010284423834,38.59239578247093 ], [ 41.26630401611328,38.72560119628912 ], [ 41.371963500976506,38.6430358886721 ], [ 41.393245697021484,38.59392929077154 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-81", "NAME_1": "Düzce" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 31.339487075805778,41.13582611083979 ], [ 31.43902778625494,41.05629730224604 ], [ 31.736297607421932,41.042720794677734 ], [ 31.75791931152355,41.01557540893549 ], [ 31.757904052734432,40.987693786621094 ], [ 31.735439300537166,40.94449996948248 ], [ 31.668218612671012,40.904876708984375 ], [ 31.60422897338873,40.8813362121582 ], [ 31.469253540039233,40.87095642089844 ], [ 31.43151664733898,40.805057525634766 ], [ 31.42705917358404,40.70133590698265 ], [ 31.36094474792492,40.66146087646496 ], [ 31.264896392822322,40.646827697753906 ], [ 31.190750122070483,40.68179702758789 ], [ 31.026567459106445,40.65954208374029 ], [ 30.954557418823242,40.682250976562614 ], [ 30.986114501953296,40.72135162353527 ], [ 30.89267539978033,40.77858734130854 ], [ 30.87307357788086,40.82920074462896 ], [ 30.906887054443416,40.897171020507926 ], [ 31.00865745544445,40.961486816406364 ], [ 31.03475379943842,41.00601959228521 ], [ 30.97593688964872,41.072639465332145 ], [ 31.217081069946573,41.09791564941406 ], [ 31.339487075805778,41.13582611083979 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-22", "NAME_1": "Edirne" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 26.738752365112646,40.61902618408209 ], [ 26.740417480468807,40.61264038085932 ], [ 26.730972290039404,40.614582061767635 ], [ 26.732084274292163,40.61680603027355 ], [ 26.738752365112646,40.61902618408209 ] ] ], [ [ [ 26.75652694702154,40.62208175659174 ], [ 26.758472442627408,40.6198616027832 ], [ 26.75430488586443,40.61875152587885 ], [ 26.754581451416016,40.62152862548851 ], [ 26.75652694702154,40.62208175659174 ] ] ], [ [ [ 26.03069496154785,40.75374984741211 ], [ 26.030689239502294,40.752361297607365 ], [ 26.031805038452205,40.749584197998104 ], [ 26.030139923095703,40.75152587890625 ], [ 26.03069496154785,40.75374984741211 ] ] ], [ [ [ 26.010969161987703,40.78958892822294 ], [ 26.021804809570256,40.779304504394645 ], [ 26.026807785034407,40.77236175537132 ], [ 26.02736091613781,40.76903152465843 ], [ 26.010969161987703,40.78958892822294 ] ] ], [ [ [ 26.97304725646967,41.972370147705135 ], [ 26.988868713378906,41.91792678833019 ], [ 26.953647613525334,41.73678207397461 ], [ 26.9095973968507,41.679828643798885 ], [ 26.921703338623104,41.65630340576183 ], [ 26.997392654419002,41.62268066406273 ], [ 26.99989509582548,41.55601119995123 ], [ 26.919303894043196,41.46986007690441 ], [ 26.87914657592796,41.388225555420036 ], [ 26.898347854614258,41.34303283691406 ], [ 26.89655685424833,41.294040679931584 ], [ 26.93860054016136,41.23728561401373 ], [ 26.93921089172369,41.195243835449446 ], [ 26.89196395874029,41.13861846923834 ], [ 26.772720336914176,41.10102081298851 ], [ 26.744598388671932,41.060417175293026 ], [ 26.74397468566889,41.03450775146496 ], [ 26.783018112182617,40.999576568603516 ], [ 26.730768203735806,40.902725219726676 ], [ 26.728576660156307,40.814212799072266 ], [ 26.783828735351562,40.74620056152344 ], [ 26.759315490722713,40.69137954711914 ], [ 26.79263877868658,40.65680694580101 ], [ 26.609861373901367,40.63680648803711 ], [ 26.533750534057617,40.591251373291016 ], [ 26.461250305175724,40.61680603027355 ], [ 26.414026260376318,40.59847259521513 ], [ 26.374305725097997,40.60819625854492 ], [ 26.304027557373217,40.5904159545899 ], [ 26.124584197998047,40.59097290039085 ], [ 26.088472366333008,40.60819625854492 ], [ 26.060972213745174,40.63763809204124 ], [ 26.06236076354992,40.68319320678734 ], [ 26.031528472900618,40.73390197753935 ], [ 26.125116348267,40.754512786865234 ], [ 26.157695770263615,40.814674377441406 ], [ 26.21730995178251,40.836658477783146 ], [ 26.201379776000977,40.85223388671875 ], [ 26.228288650512695,40.89812088012695 ], [ 26.24975585937517,40.891414642333984 ], [ 26.264711380004883,40.921726226806584 ], [ 26.29023361206066,40.899761199951286 ], [ 26.301431655884073,40.91019821167015 ], [ 26.28898620605497,40.93489837646507 ], [ 26.353076934814453,40.95466613769531 ], [ 26.323467254638842,40.98362731933588 ], [ 26.35173606872553,41.00104141235363 ], [ 26.35911369323759,41.02755355834972 ], [ 26.319107055664347,41.063545227050724 ], [ 26.327295303344954,41.11148834228521 ], [ 26.309978485107422,41.1176376342774 ], [ 26.33097839355463,41.14646530151384 ], [ 26.306446075439567,41.175109863281364 ], [ 26.331590652465934,41.254291534424055 ], [ 26.410427093505803,41.258857727050724 ], [ 26.528671264648665,41.346923828125114 ], [ 26.592201232910213,41.32866668701166 ], [ 26.63687133789091,41.356079101562614 ], [ 26.63391494751005,41.4283981323245 ], [ 26.60487937927246,41.491004943847656 ], [ 26.596136093139876,41.61547088623058 ], [ 26.536483764648665,41.62702560424816 ], [ 26.496963500976562,41.669059753418026 ], [ 26.368787765503157,41.71422958374018 ], [ 26.33962821960455,41.75893020629883 ], [ 26.377365112304858,41.83274078369152 ], [ 26.54617881774925,41.84154891967796 ], [ 26.581527709960994,41.87805175781256 ], [ 26.58583641052269,41.90520477294933 ], [ 26.569192886352596,41.92753219604492 ], [ 26.623439788818644,41.976928710937614 ], [ 26.751115798950423,41.95451354980486 ], [ 26.781169891357706,41.97798538208019 ], [ 26.838518142700252,41.969402313232536 ], [ 26.865001678466797,41.98744964599621 ], [ 26.97284698486328,42.00579452514654 ], [ 26.97304725646967,41.972370147705135 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-23", "NAME_1": "Elazığ" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 40.34999847412104,39.10704803466797 ], [ 40.28809738159208,39.05596542358393 ], [ 40.28541564941412,38.95002746582031 ], [ 40.320285797119254,38.86981201171898 ], [ 40.357448577880916,38.85798263549799 ], [ 40.38602828979498,38.80131912231457 ], [ 40.35682296752947,38.725006103515625 ], [ 40.28368759155302,38.723560333252124 ], [ 40.239067077636776,38.63198089599615 ], [ 40.23947143554693,38.60807037353533 ], [ 40.29603576660156,38.55552673339855 ], [ 40.29214859008806,38.47479248046898 ], [ 40.05464172363287,38.475044250488395 ], [ 39.86201477050787,38.49816513061546 ], [ 39.81111526489275,38.4249267578125 ], [ 39.73397445678722,38.37126541137695 ], [ 39.57147216796892,38.36953735351568 ], [ 39.39870071411161,38.33542633056652 ], [ 39.33853530883795,38.33818817138672 ], [ 39.26699066162138,38.36811065673828 ], [ 38.968620300293026,38.30895233154291 ], [ 38.8217391967774,38.40439605712896 ], [ 38.684249877929744,38.41202545166021 ], [ 38.525379180908374,38.46200180053722 ], [ 38.429889678955135,38.47502899169933 ], [ 38.37929534912138,38.512310028076286 ], [ 38.34922790527361,38.57312011718744 ], [ 38.38140487670904,38.64058303833008 ], [ 38.471988677978686,38.736061096191406 ], [ 38.62973022460966,38.75020980834955 ], [ 38.631317138672046,38.876541137695426 ], [ 38.58731842041021,38.97253036499046 ], [ 38.613189697265625,39.010799407958984 ], [ 38.68186950683611,39.00462722778332 ], [ 38.753204345703296,39.03481674194336 ], [ 38.783012390136776,38.987480163574276 ], [ 38.769435882568644,38.89875411987316 ], [ 38.808502197265625,38.87729644775402 ], [ 39.048492431640625,38.89308929443382 ], [ 39.49058151245123,38.749164581299055 ], [ 39.63027191162115,38.80181884765625 ], [ 39.727626800537166,38.803623199462834 ], [ 39.80643463134783,38.83753585815441 ], [ 39.891315460205135,38.9417343139649 ], [ 39.89322280883795,38.99279022216797 ], [ 39.86791610717768,39.045005798339844 ], [ 39.9225807189942,39.08842849731445 ], [ 40.028297424316406,39.094463348388786 ], [ 40.13597869873075,39.14826583862316 ], [ 40.359775543213004,39.226669311523665 ], [ 40.39783859252947,39.15583801269531 ], [ 40.34999847412104,39.10704803466797 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-24", "NAME_1": "Erzincan" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 40.26528167724638,39.90684127807617 ], [ 40.4804420471192,39.906944274902344 ], [ 40.509937286376896,39.89397811889654 ], [ 40.53995132446295,39.844947814941406 ], [ 40.530143737793026,39.79112625122076 ], [ 40.563358306884766,39.751308441162166 ], [ 40.69152832031256,39.690715789795036 ], [ 40.6196174621582,39.579704284668026 ], [ 40.62028884887701,39.52821731567377 ], [ 40.54322814941406,39.54778289794922 ], [ 40.142089843750284,39.5576286315918 ], [ 39.986354827881144,39.51869201660179 ], [ 39.88587951660162,39.54994583129911 ], [ 39.77057266235357,39.51818084716808 ], [ 39.69773864746111,39.45171737670927 ], [ 39.66516876220709,39.441463470458984 ], [ 39.618003845215014,39.444042205810604 ], [ 39.60741424560558,39.481758117676065 ], [ 39.585163116455135,39.48873519897455 ], [ 39.477455139160156,39.4769744873048 ], [ 39.31540298461931,39.49990081787104 ], [ 39.153591156006144,39.47578430175804 ], [ 39.097686767578296,39.46172332763683 ], [ 38.96605682373064,39.37565994262695 ], [ 38.819885253906534,39.31785202026367 ], [ 38.79290771484375,39.27995681762701 ], [ 38.833896636963004,39.257617950439624 ], [ 38.92637634277344,39.25006484985357 ], [ 38.917270660400675,39.22851943969738 ], [ 38.7714576721192,39.18029785156256 ], [ 38.72623825073259,39.113128662109375 ], [ 38.753204345703296,39.03481674194336 ], [ 38.68186950683611,39.00462722778332 ], [ 38.65647125244135,39.05071258544916 ], [ 38.617038726806925,39.079467773437614 ], [ 38.52343368530268,39.11494064331055 ], [ 38.416332244873104,39.11750030517578 ], [ 38.35454559326172,39.13976669311529 ], [ 38.39357757568371,39.213386535644645 ], [ 38.39641189575195,39.41117095947277 ], [ 38.34907150268583,39.5365562438966 ], [ 38.366264343261776,39.683441162109375 ], [ 38.413822174072266,39.746189117431754 ], [ 38.43944168090826,39.75685119628906 ], [ 38.450466156005916,39.7869110107423 ], [ 38.52255249023466,39.797157287597884 ], [ 38.554382324219034,39.826526641845646 ], [ 38.52223587036144,39.84823226928722 ], [ 38.402069091797046,39.82606506347656 ], [ 38.36834716796881,39.837001800537394 ], [ 38.38290023803728,39.89551925659191 ], [ 38.447406768798885,39.96938323974615 ], [ 38.72418212890619,39.956573486328125 ], [ 38.75243377685564,39.97180938720703 ], [ 38.77371978759777,40.04879760742199 ], [ 38.92853927612333,40.062679290771484 ], [ 39.11577224731451,40.01247024536144 ], [ 39.11574554443388,40.000827789306754 ], [ 39.384086608887,39.88770294189453 ], [ 39.47190856933611,39.87245178222673 ], [ 39.75101470947271,39.911785125732365 ], [ 39.879669189453125,40.00830078125023 ], [ 40.121814727783374,40.069835662841854 ], [ 40.28641510009771,40.039066314697266 ], [ 40.24314117431652,39.947322845458984 ], [ 40.26528167724638,39.90684127807617 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-25", "NAME_1": "Erzurum" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 42.33081436157232,40.982887268066406 ], [ 42.332916259765796,40.924530029296875 ], [ 42.37902069091825,40.83445358276373 ], [ 42.491706848144645,40.721416473388786 ], [ 42.567897796630916,40.614326477050895 ], [ 42.538536071777514,40.44420623779325 ], [ 42.509208679199276,40.40768432617193 ], [ 42.271778106689624,40.31632232666021 ], [ 42.14982986450224,40.28962326049816 ], [ 42.13726806640631,40.26054382324213 ], [ 42.205627441406534,40.16657257080078 ], [ 42.36748123168974,40.13149261474615 ], [ 42.498966217041186,40.041206359863224 ], [ 42.55170440673845,39.97406005859369 ], [ 42.566364288330135,39.94755172729515 ], [ 42.40620422363287,39.873390197753906 ], [ 42.2776527404788,39.88196563720703 ], [ 42.25519943237322,39.861167907714844 ], [ 42.285240173340014,39.81406784057623 ], [ 42.49176406860357,39.75294876098633 ], [ 42.50790786743181,39.72431564331055 ], [ 42.523639678955135,39.56861877441406 ], [ 42.47146987915039,39.488586425781364 ], [ 42.32644271850597,39.459419250488395 ], [ 42.21374511718756,39.40992355346691 ], [ 42.19287490844732,39.381523132324276 ], [ 42.22022247314453,39.34602355957048 ], [ 42.218486785888786,39.32173919677746 ], [ 42.074256896972656,39.222366333007926 ], [ 41.83882522583025,39.162235260009766 ], [ 41.72012329101568,39.17336654663109 ], [ 41.64963912963867,39.20930862426752 ], [ 41.515937805176065,39.33350372314459 ], [ 41.386318206787394,39.383571624755916 ], [ 41.2186927795413,39.35533905029297 ], [ 41.1310348510745,39.45877838134771 ], [ 41.02952194213884,39.46599578857439 ], [ 40.94934082031267,39.508766174316634 ], [ 40.90058135986334,39.55487060546875 ], [ 40.856491088867244,39.56525802612305 ], [ 40.68346405029314,39.51169967651373 ], [ 40.62548446655302,39.524215698242415 ], [ 40.6196174621582,39.579704284668026 ], [ 40.69152832031256,39.690715789795036 ], [ 40.563358306884766,39.751308441162166 ], [ 40.530143737793026,39.79112625122076 ], [ 40.53995132446295,39.844947814941406 ], [ 40.509937286376896,39.89397811889654 ], [ 40.4804420471192,39.906944274902344 ], [ 40.26528167724638,39.90684127807617 ], [ 40.244785308838175,39.93095779418968 ], [ 40.28641510009771,40.039066314697266 ], [ 40.48427581787104,40.026412963867244 ], [ 40.64613723754883,40.11261749267584 ], [ 40.75914382934576,40.15104293823248 ], [ 40.79587173461931,40.198104858398494 ], [ 40.78182983398432,40.23067092895519 ], [ 40.63780975341825,40.245708465576286 ], [ 40.59257507324247,40.26642990112305 ], [ 40.58805847167969,40.29078292846674 ], [ 40.559944152832145,40.30656433105486 ], [ 40.52688598632818,40.48198318481451 ], [ 40.4984970092774,40.535331726074276 ], [ 40.82793426513683,40.65369033813488 ], [ 41.12230682373047,40.80845260620117 ], [ 41.199081420898494,40.78024673461914 ], [ 41.3855819702149,40.77217483520536 ], [ 41.39697265625017,40.74471664428722 ], [ 41.33960342407255,40.6501579284668 ], [ 41.362621307373104,40.57928466796875 ], [ 41.428695678710994,40.563056945800724 ], [ 41.65904998779314,40.66276931762695 ], [ 41.71423721313471,40.66050338745123 ], [ 41.83464050292997,40.61849594116211 ], [ 41.90903854370117,40.646457672119254 ], [ 41.973175048828125,40.85636520385742 ], [ 42.01268005371111,40.93065643310547 ], [ 42.09929656982422,40.963840484619254 ], [ 42.273120880127124,40.9653129577639 ], [ 42.33081436157232,40.982887268066406 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-26", "NAME_1": "Eskişehir" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 30.972843170166186,40.018688201904354 ], [ 31.175989151001033,40.04402542114258 ], [ 31.617036819458292,40.01634979248058 ], [ 31.695951461791992,39.98823165893566 ], [ 31.797164916992244,39.8831901550293 ], [ 31.857683181762752,39.87451553344749 ], [ 31.88599014282238,39.808479309082145 ], [ 31.847255706787166,39.76829147338873 ], [ 31.849052429199276,39.730388641357536 ], [ 31.896219253540096,39.63234329223661 ], [ 31.995899200439737,39.49590301513672 ], [ 32.0114288330081,39.312587738037166 ], [ 31.991197586059627,39.22510147094738 ], [ 31.86066818237333,39.167995452880916 ], [ 31.838905334472656,39.106754302978516 ], [ 31.77247047424345,39.07804870605469 ], [ 31.6680526733399,39.0982398986817 ], [ 31.471307754516886,39.0867462158206 ], [ 31.386358261108683,39.11867141723644 ], [ 31.30526924133318,39.273185729980526 ], [ 31.24177551269537,39.28451919555664 ], [ 31.141860961914347,39.218502044677734 ], [ 30.989156723022518,39.15921020507824 ], [ 30.885963439941577,39.21287155151373 ], [ 30.799478530883846,39.172389984130916 ], [ 30.766630172729776,39.12854385375999 ], [ 30.618543624877987,39.07700729370117 ], [ 30.533037185669002,39.139522552490234 ], [ 30.50550842285162,39.189422607421875 ], [ 30.45332908630388,39.20599746704107 ], [ 30.41478919982916,39.28709411621094 ], [ 30.321493148803654,39.361034393310604 ], [ 30.314607620239315,39.483478546142635 ], [ 30.13921356201172,39.62137222290045 ], [ 30.18699836730957,39.69670867919933 ], [ 30.044765472412166,39.693233489990234 ], [ 30.000635147094897,39.73457717895536 ], [ 30.002716064453182,39.78552246093773 ], [ 30.0730113983156,39.852836608886776 ], [ 30.136020660400675,39.86830139160179 ], [ 30.248657226562784,39.85490798950207 ], [ 30.35621070861822,39.9370231628418 ], [ 30.427679061889762,39.9382896423341 ], [ 30.482061386108683,39.96120071411133 ], [ 30.523212432861612,40.00673294067394 ], [ 30.571363449096623,40.14687728881859 ], [ 30.726753234863338,40.171913146972656 ], [ 30.859945297241154,40.14501571655285 ], [ 30.913637161254826,40.0991401672365 ], [ 30.921283721924112,40.03337478637701 ], [ 30.972843170166186,40.018688201904354 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-27", "NAME_1": "Gaziantep" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 37.91703033447283,37.511512756347656 ], [ 37.991966247558594,37.491725921631144 ], [ 38.05150604248064,37.43758773803711 ], [ 37.98842239379877,37.43914031982433 ], [ 37.93680572509794,37.40411758422874 ], [ 37.84837341308611,37.312484741210994 ], [ 37.83034515380871,37.24394226074219 ], [ 37.880939483642635,37.057415008545036 ], [ 37.97619247436552,36.97856521606451 ], [ 38.01262283325224,36.92795562744146 ], [ 38.010631561279354,36.825210571289176 ], [ 37.908031463623104,36.785701751708984 ], [ 37.79120635986334,36.74859619140642 ], [ 37.65513992309576,36.731410980224666 ], [ 37.50850296020536,36.65539550781256 ], [ 37.435653686523494,36.78142929077177 ], [ 37.24035644531256,36.86549377441406 ], [ 37.19807815551758,36.965221405029524 ], [ 37.14458847045927,37.00689315795893 ], [ 37.01332473754894,37.010478973388786 ], [ 36.97225952148466,36.993789672851676 ], [ 36.90999221801786,36.902648925781364 ], [ 36.792087554931925,36.843338012695256 ], [ 36.7839546203615,36.806518554687614 ], [ 36.6755447387697,36.84560012817383 ], [ 36.62614440917986,36.84095001220709 ], [ 36.442592620849666,36.95328521728521 ], [ 36.539062500000114,37.113624572753906 ], [ 36.728641510009936,37.27605056762695 ], [ 36.89641189575207,37.365814208984546 ], [ 36.92829513549833,37.349662780761946 ], [ 36.9666366577149,37.230720520019474 ], [ 37.01084136962908,37.217384338378906 ], [ 37.04829406738287,37.23469924926758 ], [ 37.089210510253906,37.28264236450207 ], [ 37.18589782714838,37.332862854004134 ], [ 37.59473419189459,37.39747619628923 ], [ 37.621623992920206,37.43280792236351 ], [ 37.62296295166021,37.51213455200224 ], [ 37.679069519043026,37.512031555175895 ], [ 37.77766036987299,37.54558563232433 ], [ 37.91703033447283,37.511512756347656 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-28", "NAME_1": "Giresun" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 38.43736267089861,40.92986297607422 ], [ 38.43847274780279,40.928470611572266 ], [ 38.43513870239275,40.928749084472656 ], [ 38.4356956481933,40.93069458007835 ], [ 38.43736267089861,40.92986297607422 ] ] ], [ [ [ 39.163471221923885,41.07930374145508 ], [ 39.17869949340826,41.07402801513666 ], [ 39.14806747436552,41.03693771362299 ], [ 39.11791610717802,40.95093536376959 ], [ 39.1192893981933,40.8454208374024 ], [ 39.14960861206049,40.775512695312784 ], [ 39.10797882080095,40.758464813232365 ], [ 39.02652740478533,40.75756072998058 ], [ 38.952190399170206,40.711280822753906 ], [ 38.84720993041998,40.561927795410156 ], [ 38.85500335693388,40.46141433715826 ], [ 38.983440399170206,40.42817306518555 ], [ 39.0709877014163,40.364284515380916 ], [ 39.04844284057623,40.333206176757926 ], [ 38.961185455322266,40.29854965209972 ], [ 38.909038543701286,40.25615692138666 ], [ 38.90629959106445,40.14979553222656 ], [ 38.950401306152344,40.09682083129883 ], [ 38.93473052978544,40.06813430786144 ], [ 38.86236953735346,40.04825973510765 ], [ 38.77371978759777,40.04879760742199 ], [ 38.57074737548834,40.116062164306584 ], [ 38.45939254760759,40.09647750854492 ], [ 38.251918792724666,40.19630432128906 ], [ 38.228839874267635,40.32080459594732 ], [ 38.15539932250982,40.528263092041016 ], [ 38.11658096313505,40.6118354797365 ], [ 38.00863647460943,40.748332977295206 ], [ 38.123195648193416,40.95513916015631 ], [ 38.20041656494135,40.93791580200207 ], [ 38.28319549560541,40.94513702392578 ], [ 38.35625076293951,40.90902709960966 ], [ 38.389583587646655,40.92430496215843 ], [ 38.4298629760745,40.911251068115405 ], [ 38.52902603149414,40.916526794433594 ], [ 38.62347412109369,40.97319412231457 ], [ 38.67486190795927,40.949028015136776 ], [ 38.714862823486385,40.95069503784191 ], [ 38.81652832031267,41.01152801513672 ], [ 38.87152862548834,41.01124954223633 ], [ 38.93347167968767,41.04375076293957 ], [ 39.05291748046881,41.036804199218864 ], [ 39.163471221923885,41.07930374145508 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-29", "NAME_1": "Gümüşhane" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 39.17561721801758,40.76031875610363 ], [ 39.313480377197436,40.66615295410179 ], [ 39.65062713623064,40.5599250793457 ], [ 39.72409057617193,40.57740783691423 ], [ 39.766292572021655,40.67451095581066 ], [ 39.80594635009771,40.71657562255888 ], [ 39.84022521972673,40.69247055053705 ], [ 39.831077575683594,40.618892669677905 ], [ 39.89093780517595,40.61500549316412 ], [ 39.92637252807623,40.573833465576115 ], [ 39.96866989135759,40.560638427734375 ], [ 39.99657058715826,40.591430664062614 ], [ 39.97467422485363,40.63690185546875 ], [ 40.004878997802734,40.65853500366211 ], [ 40.10813140869169,40.57054519653332 ], [ 40.07474136352539,40.466796875 ], [ 40.04135513305681,40.4155731201173 ], [ 39.988433837890625,40.36897277832037 ], [ 39.88367080688482,40.3472251892091 ], [ 39.85456085205084,40.3255500793457 ], [ 39.82343292236345,40.249820709228686 ], [ 39.82063674926758,40.15822982788086 ], [ 39.80493545532255,40.120574951171875 ], [ 39.74072265625006,40.07666397094732 ], [ 39.69057846069353,40.01388931274414 ], [ 39.7164382934572,39.96063232421898 ], [ 39.78475570678705,39.931087493896484 ], [ 39.77601242065447,39.923477172851676 ], [ 39.6178817749024,39.88530349731445 ], [ 39.438926696777344,39.87340545654314 ], [ 39.26388931274431,39.934585571289006 ], [ 39.11574554443388,40.000827789306754 ], [ 39.11577224731451,40.01247024536144 ], [ 38.92853927612333,40.062679290771484 ], [ 38.950401306152344,40.09682083129883 ], [ 38.90629959106445,40.14979553222656 ], [ 38.909038543701286,40.25615692138666 ], [ 38.961185455322266,40.29854965209972 ], [ 39.04844284057623,40.333206176757926 ], [ 39.0709877014163,40.364284515380916 ], [ 38.983440399170206,40.42817306518555 ], [ 38.85500335693388,40.46141433715826 ], [ 38.84974288940458,40.57057571411144 ], [ 38.928970336914176,40.69153594970709 ], [ 39.02652740478533,40.75756072998058 ], [ 39.10797882080095,40.758464813232365 ], [ 39.14960861206049,40.775512695312784 ], [ 39.17561721801758,40.76031875610363 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-30", "NAME_1": "Hakkari" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 44.23672103881836,37.72581100463867 ], [ 44.24645996093756,37.6920623779298 ], [ 44.21875762939459,37.64070129394537 ], [ 44.24623870849615,37.62623977661133 ], [ 44.32952880859392,37.65622329711914 ], [ 44.428737640381144,37.64877700805664 ], [ 44.51017761230486,37.6978836059572 ], [ 44.57461929321295,37.767143249511776 ], [ 44.610614776611385,37.75423049926758 ], [ 44.63830184936529,37.716304779052734 ], [ 44.58086013793951,37.64654159545921 ], [ 44.63534164428705,37.608364105224666 ], [ 44.638813018799,37.57563018798828 ], [ 44.616718292236385,37.55250549316406 ], [ 44.62445068359381,37.48171997070324 ], [ 44.6026153564456,37.444278717041016 ], [ 44.662406921386776,37.427494049072266 ], [ 44.68934249877947,37.38499069213867 ], [ 44.73342895507841,37.37773895263683 ], [ 44.82329940795904,37.307567596435604 ], [ 44.83383941650408,37.27449417114252 ], [ 44.7782096862793,37.224006652832145 ], [ 44.80496597290039,37.148143768310774 ], [ 44.77106475830078,37.16749191284174 ], [ 44.63774108886719,37.186740875244425 ], [ 44.51138305664068,37.09354782104492 ], [ 44.3506813049317,37.04928588867199 ], [ 44.365116119384936,37.026351928711165 ], [ 44.31998062133795,36.96705627441412 ], [ 44.268787384033374,36.98297119140625 ], [ 44.24353790283203,37.026706695556754 ], [ 44.246902465820256,37.05009460449213 ], [ 44.20225143432623,37.098056793213004 ], [ 44.24228286743181,37.1566619873048 ], [ 44.26858520507818,37.155235290527344 ], [ 44.29009628295927,37.17499923706055 ], [ 44.278858184814396,37.23628234863281 ], [ 44.237377166748104,37.27907180786127 ], [ 44.14183807373064,37.315654754638786 ], [ 44.03302764892584,37.32502746582037 ], [ 43.970607757568644,37.286735534668026 ], [ 43.9512672424317,37.25539779663097 ], [ 43.896213531494425,37.23456192016607 ], [ 43.66655731201189,37.23086547851574 ], [ 43.5009841918947,37.26836013793957 ], [ 43.43782043457031,37.33258056640619 ], [ 43.436573028564396,37.52254486083979 ], [ 43.49570465087896,37.72740173339838 ], [ 43.67584609985357,37.715328216552734 ], [ 43.78456878662104,37.726203918457145 ], [ 43.892715454101506,37.700431823730526 ], [ 43.96967315673834,37.7267951965332 ], [ 44.0651931762697,37.71755218505865 ], [ 44.20137023925798,37.76893234252947 ], [ 44.23672103881836,37.72581100463867 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-31", "NAME_1": "Hatay" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 36.185138702392635,36.724304199219034 ], [ 36.188751220703125,36.72319412231468 ], [ 36.188751220703125,36.72263717651373 ], [ 36.18597412109381,36.72236251831055 ], [ 36.185138702392635,36.724304199219034 ] ] ], [ [ [ 36.06156921386736,37.023487091064396 ], [ 36.254726409912166,37.008663177490405 ], [ 36.34716796875006,36.95531463623064 ], [ 36.442592620849666,36.953285217285384 ], [ 36.62614440917986,36.84095001220709 ], [ 36.66854476928711,36.836769104004134 ], [ 36.678554534912166,36.81852340698248 ], [ 36.62707138061529,36.757701873779524 ], [ 36.63688278198242,36.705108642578296 ], [ 36.588047027587834,36.63603973388672 ], [ 36.59989166259771,36.56200408935541 ], [ 36.552886962890796,36.49698257446312 ], [ 36.58913803100597,36.397804260253906 ], [ 36.62255859375006,36.39120101928705 ], [ 36.627742767334155,36.354164123535156 ], [ 36.60783767700224,36.32987976074213 ], [ 36.666233062744425,36.33023071289074 ], [ 36.6710968017581,36.3023567199707 ], [ 36.70032882690441,36.29220581054693 ], [ 36.70477294921881,36.250331878662166 ], [ 36.6183509826663,36.2165908813476 ], [ 36.58386230468756,36.23211288452177 ], [ 36.495422363281534,36.23447036743181 ], [ 36.47106552124035,36.20180130004877 ], [ 36.39754867553728,36.2232398986817 ], [ 36.40058135986334,36.1914634704591 ], [ 36.37670516967768,36.16939544677757 ], [ 36.39784240722673,36.08376312255865 ], [ 36.378593444824276,36.00100326538086 ], [ 36.3441696166995,35.99237442016596 ], [ 36.31720352172846,36.004100799560604 ], [ 36.29788970947283,35.991699218750114 ], [ 36.30253219604492,35.957408905029354 ], [ 36.212722778320426,35.95149230957031 ], [ 36.180915832519474,35.90173721313488 ], [ 36.18305206298845,35.83557128906256 ], [ 36.16907119750982,35.815425872802905 ], [ 36.11644744873041,35.865512847900504 ], [ 36.01867675781256,35.881103515625 ], [ 36.02288818359381,35.92449951171881 ], [ 36.008483886719034,35.94030761718773 ], [ 35.935798645019815,35.91867446899437 ], [ 35.918472290039006,35.93233108520508 ], [ 35.97902679443365,36.01902770996094 ], [ 35.89680480957037,36.15791702270536 ], [ 35.780418395996264,36.2987518310548 ], [ 35.780971527099666,36.32236099243164 ], [ 35.815971374511776,36.36041641235374 ], [ 35.85347366333019,36.36902618408203 ], [ 35.860416412353686,36.39569473266624 ], [ 35.895973205566406,36.41541671752941 ], [ 35.90958404541021,36.44513702392595 ], [ 35.982639312744425,36.47430419921875 ], [ 36.03680419921881,36.533748626708984 ], [ 36.14875030517578,36.59069442749052 ], [ 36.194583892822436,36.59597396850609 ], [ 36.21569442749052,36.65930557250982 ], [ 36.19263839721708,36.70513916015648 ], [ 36.20208358764654,36.727085113525334 ], [ 36.18708419799833,36.72902679443365 ], [ 36.205970764160156,36.78236007690441 ], [ 36.14847183227545,36.85514068603527 ], [ 36.129585266113565,36.853195190429744 ], [ 36.14069366455095,36.862083435058764 ], [ 36.085693359375114,36.90513992309593 ], [ 36.01708221435541,36.930137634277344 ], [ 35.93763732910162,36.8865318298341 ], [ 35.94486236572271,36.874305725097656 ], [ 35.945693969726676,36.86430740356451 ], [ 35.913639068603686,36.8955192565918 ], [ 35.95418167114269,36.96366119384777 ], [ 36.04160690307617,37.025554656982536 ], [ 36.06156921386736,37.023487091064396 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-76", "NAME_1": "Iğdır" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 43.69572830200207,40.18729782104498 ], [ 43.71363067626953,40.166362762451286 ], [ 43.655036926269815,40.14826202392578 ], [ 43.655479431152514,40.11077117919933 ], [ 43.718761444091854,40.07968521118181 ], [ 43.769920349121264,40.0795211791995 ], [ 43.90547943115263,40.01846694946289 ], [ 44.282360076904354,40.04839324951183 ], [ 44.48470687866228,39.96729660034174 ], [ 44.557548522949276,39.903785705566634 ], [ 44.601554870605526,39.82548522949213 ], [ 44.62551116943354,39.828296661377124 ], [ 44.62156677246111,39.815410614013786 ], [ 44.67524337768572,39.787746429443416 ], [ 44.69823455810564,39.793563842773494 ], [ 44.7006912231447,39.767551422119254 ], [ 44.7176055908206,39.76768493652338 ], [ 44.812736511230526,39.6770133972168 ], [ 44.82022094726591,39.62520980834984 ], [ 44.72192764282221,39.70727539062517 ], [ 44.656444549560604,39.73276519775419 ], [ 44.623455047607536,39.77722167968744 ], [ 44.49647140502958,39.69598007202171 ], [ 44.25063323974615,39.67041397094749 ], [ 44.15977859497082,39.69419860839855 ], [ 43.99331665039068,39.686500549316406 ], [ 43.74055480957048,39.79948043823242 ], [ 43.62248992919939,39.82235717773443 ], [ 43.5319442749024,39.820419311523494 ], [ 43.47832870483427,39.766723632812614 ], [ 43.39422988891596,39.79460525512701 ], [ 43.39402008056646,39.93553543090843 ], [ 43.375995635986385,39.959014892578125 ], [ 43.35047149658203,39.9627571105957 ], [ 43.34629821777361,39.99917984008789 ], [ 43.293140411376896,40.06836318969755 ], [ 43.297000885009936,40.09724807739258 ], [ 43.315303802490405,40.11288452148449 ], [ 43.38040161132807,40.11241149902344 ], [ 43.393310546875114,40.13174819946289 ], [ 43.38365554809576,40.16720962524414 ], [ 43.411888122558594,40.18202590942394 ], [ 43.563655853271655,40.18433761596691 ], [ 43.66280746459978,40.218669891357536 ], [ 43.69572830200207,40.18729782104498 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-32", "NAME_1": "Isparta" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 31.45230293273943,37.852764129638786 ], [ 31.450740814209098,37.77799987792969 ], [ 31.336086273193416,37.43759536743164 ], [ 31.323301315307617,37.42438888549816 ], [ 31.231279373169002,37.420497894287166 ], [ 31.17972755432129,37.389701843261946 ], [ 30.996772766113452,37.342758178710994 ], [ 30.915895462036417,37.37248611450207 ], [ 30.889757156372355,37.42609786987316 ], [ 30.76529884338396,37.52559661865229 ], [ 30.70260238647461,37.6779670715332 ], [ 30.651264190674,37.700595855712834 ], [ 30.50423812866211,37.7170295715332 ], [ 30.41355323791521,37.77392959594732 ], [ 30.371025085449276,37.83028030395536 ], [ 30.32089614868164,37.837131500244254 ], [ 30.08116722106928,37.703464508056584 ], [ 30.04684448242216,37.70895004272472 ], [ 30.002939224243164,37.7548828125 ], [ 30.01048660278326,37.77233886718756 ], [ 30.084434509277628,37.774665832519645 ], [ 30.173227310180835,37.81985473632824 ], [ 30.20322036743181,37.85691070556635 ], [ 30.18260765075712,37.9011611938476 ], [ 30.22363090515165,37.98092269897472 ], [ 30.265552520752237,38.016117095947266 ], [ 30.366300582886026,38.07125473022461 ], [ 30.517358779907283,38.18640518188471 ], [ 30.640510559082202,38.245807647705135 ], [ 30.799964904785327,38.2902374267581 ], [ 30.877569198608455,38.36164474487316 ], [ 31.103597640991268,38.51663589477545 ], [ 31.13091659545927,38.510589599609375 ], [ 31.20930480957037,38.439853668213004 ], [ 31.250438690185604,38.42662429809576 ], [ 31.243375778198413,38.38523483276373 ], [ 31.262851715087947,38.360977172851676 ], [ 31.615524291992358,38.11956024169922 ], [ 31.61683845520048,38.0888214111331 ], [ 31.599279403686694,38.065040588378906 ], [ 31.474828720093058,38.020690917968864 ], [ 31.42659378051775,37.97075271606451 ], [ 31.423555374145565,37.90834808349621 ], [ 31.45230293273943,37.852764129638786 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-34", "NAME_1": "İstanbul" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 29.114028930664233,40.820693969726676 ], [ 29.11430549621582,40.81763839721697 ], [ 29.11041641235397,40.820137023925895 ], [ 29.110971450805778,40.820693969726676 ], [ 29.114028930664233,40.820693969726676 ] ] ], [ [ [ 29.143749237060774,40.85597229003935 ], [ 29.148193359375,40.849582672119425 ], [ 29.148473739623967,40.846248626709155 ], [ 29.140417098999478,40.85041809082037 ], [ 29.143749237060774,40.85597229003935 ] ] ], [ [ [ 28.995695114135685,40.866527557373274 ], [ 28.995695114135685,40.86347198486345 ], [ 28.991249084473054,40.86208343505871 ], [ 28.9901390075687,40.86597061157232 ], [ 28.995695114135685,40.866527557373274 ] ] ], [ [ [ 29.129583358764762,40.875694274902344 ], [ 29.13958358764654,40.869861602783374 ], [ 29.11291885375988,40.83847045898432 ], [ 29.106805801391545,40.860973358154354 ], [ 29.129583358764762,40.875694274902344 ] ] ], [ [ [ 28.973192214965877,40.87708282470726 ], [ 28.974584579467773,40.87402725219755 ], [ 28.969305038452205,40.87402725219755 ], [ 28.969583511352596,40.875972747802905 ], [ 28.973192214965877,40.87708282470726 ] ] ], [ [ [ 29.09708595275913,40.88541793823248 ], [ 29.10430526733404,40.872917175293196 ], [ 29.074861526489315,40.86791610717785 ], [ 29.07541656494186,40.87402725219755 ], [ 29.09708595275913,40.88541793823248 ] ] ], [ [ [ 29.077638626098974,40.88652801513683 ], [ 29.079860687255916,40.884029388427734 ], [ 29.07652854919462,40.881248474121264 ], [ 29.07597160339367,40.88513946533209 ], [ 29.077638626098974,40.88652801513683 ] ] ], [ [ [ 29.06013870239292,40.886806488037394 ], [ 29.068195343017578,40.88513946533209 ], [ 29.07236099243164,40.878749847412166 ], [ 29.052917480469205,40.87652587890648 ], [ 29.06013870239292,40.886806488037394 ] ] ], [ [ [ 29.051805496215877,40.91485977172846 ], [ 29.057916641235806,40.90625 ], [ 29.045139312744368,40.902084350586165 ], [ 29.039028167725007,40.91236114501976 ], [ 29.051805496215877,40.91485977172846 ] ] ], [ [ [ 29.256526947021598,41.23541641235357 ], [ 29.588193893432674,41.16986083984381 ], [ 29.60958290100092,41.18236160278326 ], [ 29.674583435058594,41.16152954101574 ], [ 29.862083435058594,41.14374923706049 ], [ 29.882982254028377,41.09217834472656 ], [ 29.848857879638842,41.06917572021507 ], [ 29.748725891113565,41.05318450927746 ], [ 29.644767761230582,41.00930404663086 ], [ 29.496175765991495,41.035736083984375 ], [ 29.481319427490405,41.0007019042971 ], [ 29.43189430236822,40.97430038452154 ], [ 29.419984817504826,40.92051315307623 ], [ 29.348457336425952,40.891124725342024 ], [ 29.322084426879996,40.85878372192377 ], [ 29.261529922485522,40.85514068603521 ], [ 29.24763870239275,40.87208175659191 ], [ 29.144582748413143,40.90069580078125 ], [ 29.09708595275896,40.95013809204113 ], [ 29.03152847290056,40.96625137329107 ], [ 29.037639617920092,40.97958374023449 ], [ 29.02180480957037,40.978195190429915 ], [ 29.00597190856945,41.00986099243164 ], [ 29.008750915527344,41.02597045898432 ], [ 29.051527023315884,41.048194885254134 ], [ 29.06597137451172,41.10291671752941 ], [ 29.096250534057617,41.11791610717796 ], [ 29.070972442627067,41.14319610595709 ], [ 29.087083816528377,41.1787490844726 ], [ 29.165416717529467,41.224582672119254 ], [ 29.256526947021598,41.23541641235357 ] ] ], [ [ [ 28.199028015136832,41.54597091674816 ], [ 28.272918701171875,41.49569320678711 ], [ 28.63097190856962,41.35013961791992 ], [ 28.684305191040153,41.347915649414176 ], [ 28.78430557250988,41.30208206176758 ], [ 28.81125259399414,41.30541610717779 ], [ 28.96597290039074,41.25319290161144 ], [ 29.07819366455078,41.254581451416016 ], [ 29.11180686950712,41.23819351196289 ], [ 29.10958480834961,41.210140228271484 ], [ 29.037359237671126,41.15597152709961 ], [ 29.07236099243164,41.124862670898665 ], [ 29.05708312988287,41.0818061828615 ], [ 29.033193588256893,41.0498619079591 ], [ 28.975973129272518,41.02152633666992 ], [ 28.94013977050804,41.048194885254134 ], [ 28.9487495422365,41.057640075683594 ], [ 28.944026947021484,41.06458282470709 ], [ 28.93625068664562,41.045417785644474 ], [ 28.963472366333065,41.02152633666992 ], [ 28.986803054809684,41.017082214355526 ], [ 28.984863281250114,41.004859924316406 ], [ 28.9368057250976,41.00125122070318 ], [ 28.875139236450423,40.96847152709961 ], [ 28.85014152526867,40.97430419921875 ], [ 28.82430458068859,40.95402908325195 ], [ 28.76430511474615,40.98152923583979 ], [ 28.620138168334904,40.96041488647472 ], [ 28.595138549804744,40.97347259521496 ], [ 28.588472366333235,41.01763916015625 ], [ 28.564027786254883,41.017082214355526 ], [ 28.54124832153326,40.984306335449446 ], [ 28.407083511352766,41.045417785644474 ], [ 28.259582519531648,41.06236267089855 ], [ 28.233472824097134,41.07764053344749 ], [ 28.123260498046932,41.05986022949247 ], [ 28.057348251342773,41.15075302124052 ], [ 28.087570190429744,41.21114730834984 ], [ 28.15098190307623,41.24227523803734 ], [ 28.199129104614258,41.363262176513956 ], [ 28.23168945312517,41.499076843261776 ], [ 28.179122924804744,41.52955627441423 ], [ 28.199028015136832,41.54597091674816 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-35", "NAME_1": "İzmir" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 26.881528854370174,38.02430725097662 ], [ 26.884859085083065,38.02264022827171 ], [ 26.8840274810791,38.020973205566406 ], [ 26.880416870117244,38.020694732666016 ], [ 26.881528854370174,38.02430725097662 ] ] ], [ [ [ 27.014028549194336,38.04569625854492 ], [ 27.01430511474615,38.04347229003906 ], [ 27.0123615264896,38.04347229003906 ], [ 27.011806488037223,38.04486083984398 ], [ 27.014028549194336,38.04569625854492 ] ] ], [ [ [ 26.85597229003946,38.046527862548885 ], [ 26.855417251586914,38.044303894043196 ], [ 26.85375022888178,38.04486083984398 ], [ 26.85402870178217,38.04624938964872 ], [ 26.85597229003946,38.046527862548885 ] ] ], [ [ [ 26.803749084472713,38.15319442749052 ], [ 26.804027557373104,38.152084350586165 ], [ 26.80208396911638,38.149307250976506 ], [ 26.80236053466797,38.152362823486555 ], [ 26.803749084472713,38.15319442749052 ] ] ], [ [ [ 26.80569458007824,38.16263961792015 ], [ 26.803194046020735,38.158195495605526 ], [ 26.800971984863622,38.15708160400402 ], [ 26.801528930664006,38.16180419921898 ], [ 26.80569458007824,38.16263961792015 ] ] ], [ [ [ 26.438194274902685,38.18847274780285 ], [ 26.440416336059798,38.18624877929716 ], [ 26.43958282470703,38.18264007568371 ], [ 26.435972213745174,38.185138702392805 ], [ 26.438194274902685,38.18847274780285 ] ] ], [ [ [ 26.433195114136083,38.19874954223661 ], [ 26.43402862548828,38.193195343017635 ], [ 26.42791748046875,38.19430541992199 ], [ 26.428194046020906,38.19569396972656 ], [ 26.433195114136083,38.19874954223661 ] ] ], [ [ [ 26.769306182861385,38.20097351074247 ], [ 26.772083282471044,38.19958496093756 ], [ 26.77180671691906,38.19819259643566 ], [ 26.769306182861385,38.19847106933605 ], [ 26.769306182861385,38.20097351074247 ] ] ], [ [ [ 26.45180511474649,38.20124816894531 ], [ 26.448194503784634,38.19597244262695 ], [ 26.441804885864713,38.19819259643566 ], [ 26.4429168701173,38.20041656494135 ], [ 26.45180511474649,38.20124816894531 ] ] ], [ [ [ 26.208471298217887,38.29791641235357 ], [ 26.210695266723974,38.29486083984375 ], [ 26.210695266723974,38.2904167175293 ], [ 26.20791625976608,38.292915344238395 ], [ 26.208471298217887,38.29791641235357 ] ] ], [ [ [ 26.67847251892124,38.333751678467024 ], [ 26.679307937622184,38.33013916015642 ], [ 26.674303054810025,38.32930374145508 ], [ 26.674028396606445,38.33208465576172 ], [ 26.67847251892124,38.333751678467024 ] ] ], [ [ [ 26.454027175903434,38.36847305297874 ], [ 26.457916259765852,38.360694885253906 ], [ 26.452915191650845,38.359027862549 ], [ 26.445970535278377,38.36486053466797 ], [ 26.454027175903434,38.36847305297874 ] ] ], [ [ [ 26.7895832061771,38.37781143188499 ], [ 26.792083740234602,38.374862670898665 ], [ 26.783195495605582,38.36736297607439 ], [ 26.784585952758903,38.37569427490246 ], [ 26.7895832061771,38.37781143188499 ] ] ], [ [ [ 26.466249465942496,38.38208389282238 ], [ 26.466806411743278,38.375415802001896 ], [ 26.46152687072771,38.37430572509771 ], [ 26.461250305175724,38.375415802001896 ], [ 26.466249465942496,38.38208389282238 ] ] ], [ [ [ 26.449306488037223,38.39041519165045 ], [ 26.450971603393555,38.387359619140796 ], [ 26.449028015136832,38.38569259643566 ], [ 26.447639465332088,38.389583587646655 ], [ 26.449306488037223,38.39041519165045 ] ] ], [ [ [ 26.44958305358881,38.39485931396507 ], [ 26.449028015136832,38.39180374145536 ], [ 26.44680595397972,38.3909721374514 ], [ 26.447916030884073,38.39430618286127 ], [ 26.44958305358881,38.39485931396507 ] ] ], [ [ [ 26.790138244628906,38.39986038208008 ], [ 26.79236030578619,38.395694732666016 ], [ 26.784860610961914,38.393196105957315 ], [ 26.784027099609375,38.39597320556658 ], [ 26.790138244628906,38.39986038208008 ] ] ], [ [ [ 26.469305038452546,38.39791488647472 ], [ 26.46902847290039,38.395416259765625 ], [ 26.468194961548193,38.40041732788103 ], [ 26.469583511352937,38.40041732788103 ], [ 26.469305038452546,38.39791488647472 ] ] ], [ [ [ 26.46458244323736,38.40263748168974 ], [ 26.46847152709961,38.39152908325201 ], [ 26.465417861938533,38.386806488037394 ], [ 26.46152687072771,38.395416259765625 ], [ 26.46458244323736,38.40263748168974 ] ] ], [ [ [ 26.491527557373047,38.40541839599621 ], [ 26.49291610717796,38.404304504394645 ], [ 26.490417480468864,38.40347290039085 ], [ 26.489860534667912,38.404861450195426 ], [ 26.491527557373047,38.40541839599621 ] ] ], [ [ [ 26.770139694213924,38.41069412231457 ], [ 26.77375030517578,38.407360076904354 ], [ 26.76986122131393,38.404304504394645 ], [ 26.76819229126022,38.410415649414006 ], [ 26.770139694213924,38.41069412231457 ] ] ], [ [ [ 26.795692443848054,38.41541671752958 ], [ 26.799306869506893,38.407360076904354 ], [ 26.793193817138956,38.40652847290056 ], [ 26.792083740234602,38.41069412231457 ], [ 26.795692443848054,38.41541671752958 ] ] ], [ [ [ 26.782917022705192,38.41819381713884 ], [ 26.785417556762695,38.416248321533374 ], [ 26.785139083862305,38.41458511352539 ], [ 26.780416488647518,38.415973663330135 ], [ 26.782917022705192,38.41819381713884 ] ] ], [ [ [ 26.308471679687443,38.42347335815441 ], [ 26.315139770507926,38.41791534423828 ], [ 26.31347274780279,38.41430664062523 ], [ 26.308471679687443,38.41736221313505 ], [ 26.308471679687443,38.42347335815441 ] ] ], [ [ [ 26.385972976684513,38.4362487792971 ], [ 26.38958358764694,38.422084808349666 ], [ 26.372915267944677,38.42708206176769 ], [ 26.37347221374506,38.43180465698248 ], [ 26.385972976684513,38.4362487792971 ] ] ], [ [ [ 26.369583129882812,38.43791580200201 ], [ 26.374027252197436,38.434028625488395 ], [ 26.368194580078466,38.42708206176769 ], [ 26.36736106872553,38.43736267089861 ], [ 26.369583129882812,38.43791580200201 ] ] ], [ [ [ 26.97402763366705,38.44097137451172 ], [ 26.972085952758903,38.434307098388956 ], [ 26.969028472900447,38.43513870239275 ], [ 26.971805572509766,38.44180679321306 ], [ 26.97402763366705,38.44097137451172 ] ] ], [ [ [ 26.923471450806005,38.448192596435774 ], [ 26.926805496215877,38.44680404663103 ], [ 26.927639007568416,38.444862365722884 ], [ 26.923749923705998,38.445693969726676 ], [ 26.923471450806005,38.448192596435774 ] ] ], [ [ [ 26.767362594604833,38.45541763305687 ], [ 26.776250839233853,38.44097137451172 ], [ 26.764305114746207,38.43486022949219 ], [ 26.759307861328182,38.45264053344738 ], [ 26.767362594604833,38.45541763305687 ] ] ], [ [ [ 26.359861373901424,38.45624923706066 ], [ 26.35736083984375,38.428195953369425 ], [ 26.33152770996105,38.422637939453296 ], [ 26.32513809204113,38.44124984741211 ], [ 26.359861373901424,38.45624923706066 ] ] ], [ [ [ 26.85041427612333,38.5345840454101 ], [ 26.854583740234546,38.533473968505916 ], [ 26.854583740234546,38.5326385498048 ], [ 26.849027633666992,38.53430557250971 ], [ 26.85041427612333,38.5345840454101 ] ] ], [ [ [ 26.859027862548942,38.53430557250971 ], [ 26.86125183105503,38.533748626709155 ], [ 26.8626384735108,38.5351371765139 ], [ 26.86347389221197,38.53319549560575 ], [ 26.857915878296012,38.533748626709155 ], [ 26.860137939453125,38.536529541015625 ], [ 26.859027862548942,38.53430557250971 ] ] ], [ [ [ 26.698749542236385,38.54735946655279 ], [ 26.729305267334098,38.52986145019531 ], [ 26.730972290039404,38.4968070983889 ], [ 26.749584197998217,38.48180389404314 ], [ 26.74236106872553,38.45875167846708 ], [ 26.69430541992199,38.47958374023443 ], [ 26.698749542236385,38.54735946655279 ] ] ], [ [ [ 26.818471908569677,38.545696258545206 ], [ 26.826250076293945,38.53819274902372 ], [ 26.825971603393953,38.53152847290045 ], [ 26.814027786254883,38.54430389404308 ], [ 26.818471908569677,38.545696258545206 ] ] ], [ [ [ 26.5220832824711,38.654026031494425 ], [ 26.52486038208002,38.65236282348627 ], [ 26.526805877685717,38.64986038208019 ], [ 26.522361755371094,38.65208435058588 ], [ 26.5220832824711,38.654026031494425 ] ] ], [ [ [ 26.51874923706066,38.66347122192383 ], [ 26.51958274841303,38.65763854980469 ], [ 26.510694503784578,38.657081604003906 ], [ 26.514862060546818,38.662639617920036 ], [ 26.51874923706066,38.66347122192383 ] ] ], [ [ [ 26.72569465637224,38.677082061767805 ], [ 26.729585647583065,38.67402648925798 ], [ 26.727916717529354,38.67013931274414 ], [ 26.723194122314737,38.67458343505854 ], [ 26.72569465637224,38.677082061767805 ] ] ], [ [ [ 26.71819686889654,38.67819595336937 ], [ 26.71819686889654,38.67597198486345 ], [ 26.711526870727653,38.67402648925798 ], [ 26.713470458984375,38.67680740356445 ], [ 26.71819686889654,38.67819595336937 ] ] ], [ [ [ 26.70930480957054,38.702915191650334 ], [ 26.72514152526901,38.69319534301775 ], [ 26.722917556762752,38.68680572509783 ], [ 26.708749771118164,38.691806793213004 ], [ 26.70930480957054,38.702915191650334 ] ] ], [ [ [ 26.709028244018555,38.71652603149437 ], [ 26.70986175537149,38.71347045898449 ], [ 26.707916259765625,38.71097183227556 ], [ 26.70763969421381,38.71347045898449 ], [ 26.709028244018555,38.71652603149437 ] ] ], [ [ [ 26.733749389648494,38.73402786254883 ], [ 26.734306335449276,38.73180389404291 ], [ 26.7318058013916,38.732639312744254 ], [ 26.73236083984375,38.73374938964844 ], [ 26.733749389648494,38.73402786254883 ] ] ], [ [ [ 26.883193969726733,38.85652923584013 ], [ 26.88763809204113,38.847637176513786 ], [ 26.876249313354435,38.84736251831055 ], [ 26.876249313354435,38.85208511352556 ], [ 26.883193969726733,38.85652923584013 ] ] ], [ [ [ 26.892917633056697,38.86652755737316 ], [ 26.89374923706049,38.864860534668196 ], [ 26.891805648803768,38.86208343505854 ], [ 26.89125061035196,38.86430740356445 ], [ 26.892917633056697,38.86652755737316 ] ] ], [ [ [ 27.04013824462885,38.8843040466308 ], [ 27.038196563720703,38.885139465332315 ], [ 27.041250228882177,38.88652801513672 ], [ 27.041250228882177,38.88458251953119 ], [ 27.04013824462885,38.8843040466308 ] ] ], [ [ [ 26.83402824401861,38.908748626708984 ], [ 26.83930778503418,38.90402603149437 ], [ 26.839027404785213,38.90097045898466 ], [ 26.83264160156284,38.90430450439476 ], [ 26.83402824401861,38.908748626708984 ] ] ], [ [ [ 26.810695648193416,38.92763900756836 ], [ 26.825696945190543,38.92291641235357 ], [ 26.8223628997805,38.910972595214844 ], [ 26.806249618530217,38.9170837402346 ], [ 26.810695648193416,38.92763900756836 ] ] ], [ [ [ 26.804306030273494,38.93763732910156 ], [ 26.806528091430778,38.935138702392805 ], [ 26.806528091430778,38.93402862548828 ], [ 26.803472518921296,38.935695648193416 ], [ 26.804306030273494,38.93763732910156 ] ] ], [ [ [ 26.79874992370611,39.011249542236555 ], [ 26.79680633544922,38.99791717529297 ], [ 26.79236030578619,38.996250152588004 ], [ 26.79291725158697,39.008472442626896 ], [ 26.79874992370611,39.011249542236555 ] ] ], [ [ [ 26.787361145019986,39.01235961914091 ], [ 26.788473129272745,39.005973815918196 ], [ 26.784027099609375,39.000137329101676 ], [ 26.780416488647518,39.00875091552729 ], [ 26.787361145019986,39.01235961914091 ] ] ], [ [ [ 27.470958709716797,39.1718826293947 ], [ 27.504394531249943,39.11765670776373 ], [ 27.50539588928217,39.01988601684582 ], [ 27.433935165405387,38.96704864501953 ], [ 27.387517929077205,38.95204162597662 ], [ 27.37003517150879,38.9268493652346 ], [ 27.168153762817496,38.89170837402344 ], [ 27.131971359253384,38.80689239501959 ], [ 27.124540328979947,38.77974319458019 ], [ 27.231248855591275,38.73934555053705 ], [ 27.279998779296932,38.572151184082145 ], [ 27.33832931518566,38.58828735351585 ], [ 27.457939147949446,38.56347656250006 ], [ 27.56540679931652,38.48628616333025 ], [ 27.742670059204045,38.446926116943644 ], [ 27.82133483886747,38.35077285766613 ], [ 27.853576660156534,38.33378982543957 ], [ 28.001060485839787,38.399547576904524 ], [ 28.117492675781477,38.40279769897484 ], [ 28.145027160644815,38.39204025268555 ], [ 28.16123199462919,38.360778808593864 ], [ 28.22292518615734,38.33587265014654 ], [ 28.433549880981445,38.295082092285156 ], [ 28.474098205566577,38.25453948974621 ], [ 28.527257919311467,38.13525772094738 ], [ 28.559946060180778,38.108661651611385 ], [ 28.249021530151367,38.01900100708008 ], [ 28.071899414062727,38.02942657470726 ], [ 27.95366859436035,38.006706237793026 ], [ 27.938676834106502,38.018360137939396 ], [ 27.923608779907283,37.99508666992193 ], [ 27.77575492858881,37.972328186035156 ], [ 27.72010993957548,37.985515594482536 ], [ 27.531816482544002,37.983718872070426 ], [ 27.441749572753963,37.91611480712896 ], [ 27.35456848144537,37.891254425049055 ], [ 27.278308868408203,37.891544342041016 ], [ 27.260694503784237,37.912639617920036 ], [ 27.27486038208025,37.944583892822266 ], [ 27.24847030639677,37.98125076293951 ], [ 27.217082977294922,37.99236297607422 ], [ 27.14291763305664,37.98374938964838 ], [ 27.099027633666935,38.01541519165062 ], [ 27.07541656494152,38.01263809204096 ], [ 27.048194885253906,38.050140380859546 ], [ 26.983474731445426,38.07430648803711 ], [ 26.8979167938233,38.061527252197266 ], [ 26.864305496215934,38.02847290039085 ], [ 26.824306488037223,38.158195495605526 ], [ 26.7954158782959,38.1734733581543 ], [ 26.774860382080135,38.161251068115234 ], [ 26.772083282471044,38.19680404663109 ], [ 26.790416717529297,38.199028015137 ], [ 26.75736045837408,38.222084045410384 ], [ 26.73291778564453,38.20680618286127 ], [ 26.63597488403326,38.20735931396507 ], [ 26.62430572509777,38.13847351074219 ], [ 26.603195190429858,38.143470764160384 ], [ 26.61486053466797,38.110973358154524 ], [ 26.591527938842773,38.102638244628906 ], [ 26.570972442627408,38.14263916015642 ], [ 26.560417175293082,38.117362976074446 ], [ 26.52986145019537,38.12791824340843 ], [ 26.51152992248535,38.1656951904298 ], [ 26.517915725708292,38.187084197998274 ], [ 26.505416870117244,38.17514038085943 ], [ 26.48708343505899,38.18291854858427 ], [ 26.490695953369254,38.19569396972656 ], [ 26.458194732666414,38.19152832031273 ], [ 26.441804885864713,38.21875000000017 ], [ 26.419584274292447,38.22124862670927 ], [ 26.429306030273665,38.208194732666186 ], [ 26.431251525878963,38.199028015137 ], [ 26.429859161377067,38.19819259643566 ], [ 26.38903045654297,38.222915649414176 ], [ 26.40180587768583,38.24486160278343 ], [ 26.39097023010254,38.260971069335994 ], [ 26.378469467163086,38.26291656494146 ], [ 26.387361526489258,38.24736022949236 ], [ 26.36680603027372,38.22708511352539 ], [ 26.334861755371094,38.225692749023665 ], [ 26.28541755676281,38.26514053344738 ], [ 26.231527328491495,38.26625061035156 ], [ 26.233472824096623,38.29430389404297 ], [ 26.271804809570767,38.290138244629134 ], [ 26.28097152709961,38.3237495422365 ], [ 26.302639007568473,38.32069396972679 ], [ 26.28513908386242,38.34208297729492 ], [ 26.28458404541061,38.37652587890625 ], [ 26.3001384735108,38.355140686035156 ], [ 26.31597137451172,38.37625122070324 ], [ 26.318750381469783,38.33013916015642 ], [ 26.344861984252873,38.334304809570426 ], [ 26.344861984252873,38.319305419921875 ], [ 26.378469467163086,38.30902862548851 ], [ 26.384304046630803,38.348751068115234 ], [ 26.40180587768583,38.32347106933594 ], [ 26.482360839843807,38.37597274780302 ], [ 26.475694656372468,38.401527404785384 ], [ 26.451250076293945,38.428195953369425 ], [ 26.490139007568473,38.40097045898443 ], [ 26.515972137451172,38.428195953369425 ], [ 26.437915802002294,38.47680664062517 ], [ 26.39291763305664,38.44652938842785 ], [ 26.412082672119197,38.49430465698242 ], [ 26.371528625488338,38.52986145019531 ], [ 26.37513732910179,38.541805267333984 ], [ 26.38069534301792,38.52347183227539 ], [ 26.38069534301792,38.54402923584007 ], [ 26.359861373901424,38.56708526611351 ], [ 26.352916717529524,38.63874816894548 ], [ 26.36069488525436,38.65986251831055 ], [ 26.41624832153326,38.68097305297846 ], [ 26.474306106567553,38.67514038085966 ], [ 26.523471832275447,38.650142669677734 ], [ 26.52319526672386,38.630695343017805 ], [ 26.562360763549805,38.60263824462902 ], [ 26.569305419922102,38.559581756592024 ], [ 26.62513923645014,38.53125000000023 ], [ 26.64125061035162,38.469306945801065 ], [ 26.587917327880916,38.47041702270525 ], [ 26.60486030578619,38.451526641845646 ], [ 26.584583282471044,38.42652893066412 ], [ 26.611528396606502,38.422359466552905 ], [ 26.64347267150913,38.37569427490246 ], [ 26.644306182861328,38.339862823486555 ], [ 26.67375183105503,38.31208419799816 ], [ 26.703195571899414,38.319862365722656 ], [ 26.6751384735108,38.34791564941406 ], [ 26.677917480468864,38.360416412353516 ], [ 26.684860229492188,38.35041809082054 ], [ 26.688192367553654,38.351806640625284 ], [ 26.674581527710018,38.38791656494135 ], [ 26.70736122131342,38.4345817565918 ], [ 26.73652839660656,38.42874908447283 ], [ 26.76652717590332,38.36680603027344 ], [ 26.808473587036303,38.35541534423834 ], [ 27.017084121704215,38.41819381713884 ], [ 27.086805343628043,38.398471832275504 ], [ 27.1187496185305,38.410415649414006 ], [ 27.148195266723633,38.44763946533203 ], [ 27.170692443847884,38.44124984741211 ], [ 27.1590251922608,38.46680450439459 ], [ 27.111804962158203,38.448749542236385 ], [ 27.079305648803768,38.46708297729515 ], [ 27.02680778503418,38.46763992309593 ], [ 26.97430610656744,38.45513916015631 ], [ 26.94847297668474,38.43180465698248 ], [ 26.951805114746207,38.44347381591797 ], [ 26.919584274291992,38.45319366455095 ], [ 26.922361373901822,38.46763992309593 ], [ 26.884582519531648,38.507637023926065 ], [ 26.835695266723746,38.52236175537138 ], [ 26.828193664551065,38.527084350585994 ], [ 26.88791656494152,38.51069259643555 ], [ 26.882638931274357,38.53486251831066 ], [ 26.848192214966218,38.54291534423834 ], [ 26.847082138061864,38.559581756592024 ], [ 26.842639923095646,38.55041503906244 ], [ 26.822914123535497,38.55041503906244 ], [ 26.84680557250988,38.560417175293196 ], [ 26.83958244323776,38.58763885498047 ], [ 26.830417633056754,38.57819366455084 ], [ 26.79986190795944,38.61097335815424 ], [ 26.7570858001709,38.615417480468864 ], [ 26.769584655761776,38.635971069336165 ], [ 26.72236061096197,38.65152740478533 ], [ 26.753751754761197,38.66513824462896 ], [ 26.73069572448742,38.67458343505854 ], [ 26.74097061157221,38.68097305297846 ], [ 26.72652816772461,38.721527099609546 ], [ 26.743194580078296,38.73152923584007 ], [ 26.74014091491739,38.741806030273665 ], [ 26.780416488647518,38.73708343505865 ], [ 26.824028015136832,38.762359619140625 ], [ 26.835973739624137,38.742084503174055 ], [ 26.858194351196403,38.753192901611385 ], [ 26.894582748413427,38.73374938964844 ], [ 26.90708351135271,38.76652908325218 ], [ 26.92930603027355,38.75597381591825 ], [ 26.93902778625494,38.76597213745123 ], [ 26.892639160156307,38.82514190673828 ], [ 26.91402816772461,38.817359924316634 ], [ 26.944303512573526,38.8365287780764 ], [ 26.942638397216797,38.812084197998274 ], [ 26.969028472900447,38.80402755737305 ], [ 26.98430633544922,38.82263946533203 ], [ 26.962360382080533,38.83097076416044 ], [ 26.97125053405796,38.84597396850603 ], [ 27.02569580078125,38.87263870239269 ], [ 27.019582748413313,38.86208343505854 ], [ 27.034582138061864,38.855972290039006 ], [ 27.066249847412507,38.87708282470709 ], [ 27.051525115966797,38.897083282470646 ], [ 27.03736114501976,38.893470764160384 ], [ 27.057083129882926,38.91319274902338 ], [ 27.04375076293968,38.940971374511776 ], [ 27.006250381469897,38.91902923584007 ], [ 27.017915725708008,38.91347122192394 ], [ 26.969581604004077,38.92680740356457 ], [ 26.957084655761776,38.93763732910156 ], [ 26.968471527099894,38.944305419921875 ], [ 26.936805725097656,38.93763732910156 ], [ 26.939582824707315,38.925693511962834 ], [ 26.919584274291992,38.93986129760742 ], [ 26.858194351196403,38.9137496948245 ], [ 26.84986114501993,38.93375015258806 ], [ 26.801250457763615,38.95069503784197 ], [ 26.797361373901765,38.996250152588004 ], [ 26.815971374512173,39.025970458984546 ], [ 26.79874992370611,39.01514053344721 ], [ 26.799028396606502,39.03236007690447 ], [ 26.88763809204113,39.075416564941634 ], [ 26.835695266723746,39.14208221435541 ], [ 26.76458358764677,39.17321395874052 ], [ 26.957500457763672,39.259422302246094 ], [ 27.176755905151424,39.42146682739258 ], [ 27.407686233520792,39.38151550292969 ], [ 27.45876693725586,39.29547119140625 ], [ 27.470958709716797,39.1718826293947 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-46", "NAME_1": "Kahramanmaraş" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 37.039100646972656,38.5945396423341 ], [ 37.05988693237333,38.578189849853516 ], [ 37.288425445556584,38.59590911865257 ], [ 37.274082183838175,38.554397583007926 ], [ 37.19495010376005,38.49284362792969 ], [ 37.1977615356447,38.46109771728527 ], [ 37.36172103881853,38.46540832519531 ], [ 37.45554351806652,38.45201492309593 ], [ 37.69929885864275,38.358089447021484 ], [ 37.773830413818644,38.31008911132807 ], [ 37.77216720581072,38.22153472900402 ], [ 37.634899139404354,37.91677093505871 ], [ 37.52582168579107,37.77268218994146 ], [ 37.41357421875006,37.68510437011736 ], [ 37.426506042480526,37.60475921630854 ], [ 37.5731277465822,37.55051803588867 ], [ 37.62296295166021,37.51213455200224 ], [ 37.61789703369169,37.425151824951286 ], [ 37.55552673339872,37.38273620605463 ], [ 37.18589782714838,37.332862854004134 ], [ 37.089210510253906,37.28264236450207 ], [ 37.04829406738287,37.23469924926758 ], [ 37.01084136962908,37.217384338378906 ], [ 36.96500015258789,37.23295974731445 ], [ 36.9305152893067,37.34512710571289 ], [ 36.90557479858427,37.366729736328125 ], [ 36.728641510009936,37.27605056762695 ], [ 36.65103912353544,37.32998657226568 ], [ 36.582782745361385,37.40520477294933 ], [ 36.48894882202154,37.368858337402344 ], [ 36.37861633300787,37.34900283813482 ], [ 36.25526428222685,37.36342620849621 ], [ 36.212810516357536,37.51700973510748 ], [ 36.2694740295413,37.582317352295036 ], [ 36.35985565185564,37.74528121948259 ], [ 36.36010360717802,37.77470779418968 ], [ 36.31903839111345,37.83251953125 ], [ 36.31517028808622,37.88559722900396 ], [ 36.33535766601574,37.99667358398449 ], [ 36.42892074584972,38.25798416137695 ], [ 36.58495712280302,38.394802093505916 ], [ 36.67869567871122,38.50409317016607 ], [ 36.714694976806584,38.585800170898665 ], [ 36.92048263549833,38.62846374511719 ], [ 37.039100646972656,38.5945396423341 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-78", "NAME_1": "Karabük" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 32.972885131835994,41.52023315429693 ], [ 33.044803619384936,41.41645050048845 ], [ 33.01094055175798,41.37084579467779 ], [ 32.9510574340822,41.333637237549055 ], [ 32.91890335083025,41.28511047363287 ], [ 32.91732788085943,41.21456909179699 ], [ 32.92760467529314,41.195224761963175 ], [ 33.01161956787121,41.15423583984398 ], [ 33.07714080810564,41.088871002197266 ], [ 33.027935028076456,41.01646423339844 ], [ 32.6919403076173,40.957851409912166 ], [ 32.519256591796875,40.83922576904308 ], [ 32.4848175048831,40.874618530273665 ], [ 32.28196716308611,40.94109725952171 ], [ 32.28520965576189,41.00830078125006 ], [ 32.09199523925798,41.01836776733404 ], [ 32.109592437744084,41.12506103515648 ], [ 32.13407135009794,41.15750503540039 ], [ 32.202606201172046,41.19816970825195 ], [ 32.30185699462896,41.23763275146496 ], [ 32.42853927612322,41.254291534424055 ], [ 32.60932159423834,41.33967208862305 ], [ 32.656684875488565,41.3779029846192 ], [ 32.69793319702154,41.46401596069336 ], [ 32.7556343078615,41.489173889160384 ], [ 32.793640136719034,41.527175903320426 ], [ 32.8231658935548,41.51309204101574 ], [ 32.92557525634771,41.553955078125 ], [ 32.972885131835994,41.52023315429693 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-70", "NAME_1": "Karaman" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 33.82967376708996,37.38158416748058 ], [ 33.905017852783374,37.32161712646507 ], [ 33.9332160949707,37.272449493408374 ], [ 34.09875869750971,37.24098968505871 ], [ 34.19761276245134,37.17826080322277 ], [ 34.09249877929693,37.131454467773665 ], [ 33.989757537841854,37.126686096191634 ], [ 33.867404937744084,37.06111907958996 ], [ 33.75038909912104,37.02802658081066 ], [ 33.632530212402344,37.04732131958019 ], [ 33.52960968017584,37.0029754638673 ], [ 33.388763427734375,36.9991340637207 ], [ 33.11583709716814,36.85238647460943 ], [ 32.9618453979495,36.809215545654524 ], [ 33.04000473022461,36.67696380615246 ], [ 33.096580505371264,36.63430023193354 ], [ 33.217575073242244,36.58370590209978 ], [ 33.23061370849638,36.55921173095703 ], [ 33.21320724487322,36.52260971069347 ], [ 33.05472183227556,36.468769073486385 ], [ 32.795829772949276,36.431247711181754 ], [ 32.65814208984381,36.446079254150504 ], [ 32.55423355102556,36.5082168579101 ], [ 32.50381469726568,36.561042785644645 ], [ 32.45649719238298,36.674057006835994 ], [ 32.47058486938482,36.7511253356933 ], [ 32.60804748535185,36.78462219238281 ], [ 32.748134613037394,36.850887298583984 ], [ 32.80971908569347,36.9109458923341 ], [ 32.616397857666186,36.94893264770508 ], [ 32.56579208374052,36.988525390625 ], [ 32.564231872558764,37.01300811767601 ], [ 32.647991180420206,37.09346008300781 ], [ 32.68590164184576,37.157508850097656 ], [ 32.69144058227545,37.21172714233427 ], [ 32.76886367797857,37.233978271484375 ], [ 32.8411598205567,37.21237945556652 ], [ 32.900009155273494,37.213756561279524 ], [ 32.86283111572271,37.28112030029297 ], [ 32.917613983154354,37.36951446533209 ], [ 33.05659866333008,37.38821792602539 ], [ 33.11162567138672,37.448928833007756 ], [ 33.14750671386736,37.4563179016115 ], [ 33.20130920410173,37.4533424377442 ], [ 33.296306610107706,37.37743377685547 ], [ 33.353820800781534,37.375347137451286 ], [ 33.38849639892584,37.39728927612316 ], [ 33.42147827148443,37.47786331176758 ], [ 33.48609542846708,37.54191970825195 ], [ 33.64541244506853,37.604286193847884 ], [ 33.726142883301065,37.60812377929693 ], [ 33.82967376708996,37.38158416748058 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-36", "NAME_1": "Kars" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 43.59941482543974,40.98562622070335 ], [ 43.6762428283692,40.92770004272461 ], [ 43.6761093139649,40.84443664550798 ], [ 43.713020324707315,40.81192016601574 ], [ 43.74869918823248,40.73593902587896 ], [ 43.7363014221192,40.70790100097662 ], [ 43.75005340576172,40.680580139160156 ], [ 43.67522430419933,40.57935714721674 ], [ 43.64200592041021,40.55900192260759 ], [ 43.64796829223633,40.53152084350586 ], [ 43.63185882568365,40.53734588623047 ], [ 43.626861572265796,40.519538879394645 ], [ 43.545551300048885,40.47705078125 ], [ 43.61880874633795,40.41806411743164 ], [ 43.5936927795413,40.3372802734375 ], [ 43.639865875244425,40.27662277221691 ], [ 43.68171310424822,40.25849914550798 ], [ 43.681953430175724,40.22991943359381 ], [ 43.57503128051786,40.186195373535156 ], [ 43.411888122558594,40.18202590942394 ], [ 43.38365554809576,40.16720962524414 ], [ 43.393310546875114,40.13174819946289 ], [ 43.38040161132807,40.11241149902344 ], [ 43.30694961547857,40.10919952392601 ], [ 43.29211807250982,40.07103347778349 ], [ 43.34629821777361,39.99917984008789 ], [ 43.35047149658203,39.9627571105957 ], [ 43.10322189331072,40.00832748413086 ], [ 42.7108917236331,39.91766357421875 ], [ 42.627677917480526,39.92008972167963 ], [ 42.566364288330135,39.94755172729515 ], [ 42.498966217041186,40.041206359863224 ], [ 42.36748123168974,40.13149261474615 ], [ 42.205627441406534,40.16657257080078 ], [ 42.138141632080135,40.25527572631847 ], [ 42.14982986450224,40.28962326049816 ], [ 42.271778106689624,40.31632232666021 ], [ 42.51459884643572,40.41061782836914 ], [ 42.538536071777514,40.44420623779325 ], [ 42.57029724121105,40.59017562866222 ], [ 42.54808425903349,40.64073181152361 ], [ 42.61116790771479,40.64011383056635 ], [ 42.704601287841854,40.68149566650385 ], [ 42.8360137939456,40.71354293823265 ], [ 42.869586944580135,40.77029800415039 ], [ 42.87327575683611,40.85266876220709 ], [ 42.9088897705081,40.921489715576286 ], [ 42.993515014648494,40.961849212646484 ], [ 43.11260986328119,40.9844589233399 ], [ 43.21897506713884,41.02573394775402 ], [ 43.26084136962908,41.08422470092785 ], [ 43.26377487182617,41.15536499023443 ], [ 43.280563354492244,41.18324279785179 ], [ 43.36536788940441,41.20235061645525 ], [ 43.43723297119135,41.1793785095216 ], [ 43.47128295898443,41.129795074463004 ], [ 43.44977951049822,41.09215164184593 ], [ 43.47216033935547,41.02798461914085 ], [ 43.59941482543974,40.98562622070335 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-37", "NAME_1": "Kastamonu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 33.338748931884766,42.02041625976574 ], [ 33.67847061157232,41.98041534423828 ], [ 34.04680633544922,41.98208236694336 ], [ 34.22653198242193,41.95513916015648 ], [ 34.225559234619425,41.87401580810547 ], [ 34.26716613769537,41.805038452148665 ], [ 34.269077301025675,41.739074707031364 ], [ 34.4930953979495,41.72483825683594 ], [ 34.59929656982433,41.668979644775504 ], [ 34.59622573852556,41.63491439819336 ], [ 34.56705856323259,41.59246063232422 ], [ 34.46514892578131,41.540878295898494 ], [ 34.47560119628923,41.30388641357422 ], [ 34.43436813354498,41.30613327026373 ], [ 34.394657135009766,41.2771186828615 ], [ 34.29096221923845,41.16743850708008 ], [ 34.210571289062614,41.040046691894645 ], [ 34.22607040405279,41.00858306884777 ], [ 34.27907180786133,40.976325988769645 ], [ 34.27776718139654,40.92724227905302 ], [ 34.03589248657232,40.85097122192377 ], [ 33.89286422729498,40.89155578613281 ], [ 33.82385253906267,40.91936874389654 ], [ 33.78824615478521,40.95132064819336 ], [ 33.791225433349666,40.99592971801752 ], [ 33.86064910888672,41.05282211303711 ], [ 33.85814666748041,41.07776641845726 ], [ 33.82796859741228,41.09726715087902 ], [ 33.44918823242216,40.9622535705567 ], [ 33.385791778564396,40.96100616455084 ], [ 33.215167999267635,41.062389373779354 ], [ 33.14824676513672,41.087013244628906 ], [ 33.07714080810564,41.088871002197266 ], [ 32.99153137207037,41.16962051391607 ], [ 32.92760467529314,41.195224761963175 ], [ 32.913772583007926,41.275463104248274 ], [ 32.9510574340822,41.333637237549055 ], [ 33.01094055175798,41.37084579467779 ], [ 33.044803619384936,41.41645050048845 ], [ 32.95254898071295,41.546436309814624 ], [ 32.827293395996094,41.595649719238395 ], [ 32.761165618896655,41.7322998046875 ], [ 32.68097305297863,41.834583282470646 ], [ 32.914028167724666,41.87347412109381 ], [ 33.02736282348661,41.92736053466825 ], [ 33.16902923583979,41.95541763305687 ], [ 33.338748931884766,42.02041625976574 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-38", "NAME_1": "Kayseri" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 35.94820404052763,39.20082855224604 ], [ 36.012729644775504,39.14810180664085 ], [ 36.06792068481445,39.129901885986385 ], [ 36.30744171142578,39.130260467529524 ], [ 36.37403869628912,39.15341186523443 ], [ 36.45937347412138,39.1303596496582 ], [ 36.60339355468744,39.17564010620123 ], [ 36.77732849121122,39.175086975097656 ], [ 36.88906860351574,39.13128662109381 ], [ 36.944854736328296,39.05715942382824 ], [ 36.758411407470874,38.674396514892805 ], [ 36.7323379516601,38.591064453125 ], [ 36.69913864135748,38.57224273681646 ], [ 36.67527389526367,38.49930191040062 ], [ 36.50911712646496,38.322906494140625 ], [ 36.49144363403326,38.31632614135742 ], [ 36.47338485717802,38.336627960205135 ], [ 36.4083328247072,38.45562362670921 ], [ 36.30536651611334,38.463748931884766 ], [ 36.146896362304744,38.40219116210949 ], [ 36.00793838500982,38.18138122558594 ], [ 35.680976867676065,38.05966186523432 ], [ 35.621017456054744,37.95576095581066 ], [ 35.43716430664068,37.91958236694336 ], [ 35.26578140258795,37.959201812744254 ], [ 35.312152862548885,38.040725708007926 ], [ 35.311183929443416,38.16899108886719 ], [ 35.27957916259771,38.22149658203148 ], [ 35.236129760742244,38.254776000976506 ], [ 35.12228393554699,38.25902938842785 ], [ 35.063629150390796,38.282264709472656 ], [ 34.99367523193365,38.42170715332031 ], [ 34.92252349853521,38.43228149414068 ], [ 34.90881347656256,38.46187591552746 ], [ 34.90801239013689,38.50479125976574 ], [ 34.92678451538103,38.538246154785156 ], [ 35.018016815185604,38.565429687500114 ], [ 35.070098876953125,38.613536834716854 ], [ 35.068992614746264,38.74825668334972 ], [ 34.95324707031256,38.798259735107706 ], [ 35.002136230469034,39.013160705566406 ], [ 35.037403106689624,39.03805160522461 ], [ 35.08006668090849,39.03767395019537 ], [ 35.2412185668947,39.00565338134777 ], [ 35.482967376709155,39.099575042724666 ], [ 35.463966369628906,39.156749725341854 ], [ 35.47180557250988,39.18677139282238 ], [ 35.67707824707037,39.203239440918026 ], [ 35.81264877319347,39.29944610595703 ], [ 35.885440826416016,39.27633666992216 ], [ 35.94820404052763,39.20082855224604 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-79", "NAME_1": "Kilis" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 37.435653686523494,36.78142929077177 ], [ 37.50850296020536,36.65539550781256 ], [ 37.48497772216791,36.64108657836914 ], [ 37.14474105834972,36.66322708129883 ], [ 37.12191772460943,36.65938949584961 ], [ 37.090995788574276,36.62364578247076 ], [ 37.028041839599894,36.66057586669933 ], [ 37.0560379028322,36.72425842285162 ], [ 36.94435119628912,36.781242370605526 ], [ 36.80418395996105,36.798564910888786 ], [ 36.78188705444353,36.823947906494254 ], [ 36.80578994750982,36.8526229858399 ], [ 36.90999221801786,36.902648925781364 ], [ 36.97225952148466,36.993789672851676 ], [ 37.01332473754894,37.010478973388786 ], [ 37.124984741210994,37.01027297973644 ], [ 37.18312835693365,36.98589706420927 ], [ 37.24035644531256,36.86549377441406 ], [ 37.435653686523494,36.78142929077177 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-71", "NAME_1": "Kırıkkale" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 33.91788101196295,40.26161193847679 ], [ 34.0790176391601,40.22452926635748 ], [ 34.105388641357536,40.131149291992415 ], [ 34.198616027831974,40.03731155395508 ], [ 34.059497833252124,39.94801712036144 ], [ 34.06889724731451,39.80836868286144 ], [ 33.91082000732439,39.705814361572266 ], [ 33.85577011108393,39.563274383545036 ], [ 33.801372528076456,39.514717102050895 ], [ 33.76018142700224,39.44463348388689 ], [ 33.679565429687614,39.44376754760742 ], [ 33.58490753173834,39.38108825683594 ], [ 33.52802276611345,39.2547988891601 ], [ 33.41689682006836,39.16110992431652 ], [ 33.36560821533209,39.22562789917015 ], [ 33.390270233154354,39.27744674682617 ], [ 33.36938476562506,39.317165374755916 ], [ 33.28668594360357,39.33038711547863 ], [ 33.23331832885748,39.37669372558594 ], [ 33.2855339050293,39.46186065673851 ], [ 33.33845520019548,39.71584701538097 ], [ 33.36276245117199,39.75877761840832 ], [ 33.42865371704113,39.81058883666998 ], [ 33.60328674316435,39.89190673828142 ], [ 33.619411468506144,39.9583435058596 ], [ 33.57646942138689,40.048053741455135 ], [ 33.622394561767635,40.1554412841798 ], [ 33.70774078369146,40.2587776184082 ], [ 33.769126892090014,40.28475952148449 ], [ 33.91788101196295,40.26161193847679 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-39", "NAME_1": "Kırklareli" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 27.254264831543026,42.1054115295413 ], [ 27.32935714721691,42.0840950012207 ], [ 27.33961677551281,42.06216812133789 ], [ 27.37686729431158,42.04953002929693 ], [ 27.415891647338867,41.990142822265625 ], [ 27.509033203125,41.950714111328125 ], [ 27.551439285278548,41.89959716796875 ], [ 27.56739425659191,41.90628051757818 ], [ 27.557416915893555,41.9135856628418 ], [ 27.568567276000977,41.936641693115234 ], [ 27.668466567993107,41.952606201172046 ], [ 27.69262123107916,41.97296524047874 ], [ 27.729068756103743,41.97274398803711 ], [ 27.802497863769645,41.935733795166016 ], [ 27.82743835449247,41.945426940918026 ], [ 27.813037872314737,41.9797821044923 ], [ 27.851890563964957,41.99657440185558 ], [ 27.902822494506836,41.968566894531364 ], [ 28.03134155273466,41.98703765869152 ], [ 28.05791854858404,41.88319396972656 ], [ 28.01041793823248,41.89402770996094 ], [ 27.995695114135913,41.887638092041016 ], [ 27.970417022705192,41.86236190795904 ], [ 27.995695114135913,41.79735946655285 ], [ 28.042083740234546,41.752639770507926 ], [ 28.040973663330362,41.73125076293945 ], [ 28.105693817138842,41.66930389404308 ], [ 28.090139389038086,41.66291809082037 ], [ 28.09124946594244,41.63847351074219 ], [ 28.149583816528548,41.58051681518566 ], [ 27.977830886840934,41.54333114624018 ], [ 27.86650657653837,41.50082015991211 ], [ 27.770309448242188,41.50877761840832 ], [ 27.730844497680607,41.49436187744152 ], [ 27.67464828491228,41.4577522277832 ], [ 27.673555374145565,41.40991210937494 ], [ 27.64314651489252,41.34899902343756 ], [ 27.55360603332548,41.23656463623047 ], [ 27.520938873291016,41.22114562988281 ], [ 27.472660064697436,41.22648620605469 ], [ 27.377403259277344,41.31006622314476 ], [ 27.262168884277514,41.34740066528332 ], [ 26.914499282836857,41.33306503295921 ], [ 26.88170051574724,41.364166259765625 ], [ 26.88294029235857,41.405998229980526 ], [ 27.00078773498558,41.564857482910156 ], [ 26.997392654419002,41.62268066406273 ], [ 26.921703338623104,41.65630340576183 ], [ 26.9095973968507,41.679828643798885 ], [ 26.951318740844897,41.73140716552757 ], [ 26.96990013122553,41.812602996826286 ], [ 26.988868713378906,41.91792678833019 ], [ 26.971960067749308,41.97768783569353 ], [ 26.98307037353544,42.033229827880916 ], [ 27.01955223083496,42.05057144165045 ], [ 27.028076171875284,42.08116912841797 ], [ 27.069709777831974,42.09228515625023 ], [ 27.20951843261713,42.06493759155285 ], [ 27.20800781250017,42.083984375 ], [ 27.254264831543026,42.1054115295413 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-40", "NAME_1": "Kırşehir" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 34.22672271728521,39.74172973632841 ], [ 34.35737991333036,39.74853515625023 ], [ 34.42567825317377,39.73305511474615 ], [ 34.468528747558764,39.67209625244152 ], [ 34.544994354248104,39.622127532958984 ], [ 34.52546310424822,39.55776214599615 ], [ 34.65660095214861,39.486606597900504 ], [ 34.61058425903326,39.380512237549055 ], [ 34.60924911499029,39.327224731445426 ], [ 34.66175842285173,39.31775283813499 ], [ 34.72655868530279,39.36091613769531 ], [ 34.754566192627124,39.35155868530285 ], [ 34.686729431152514,39.26987457275385 ], [ 34.69286346435564,39.22026062011747 ], [ 34.62529754638672,39.173606872558594 ], [ 34.636188507080135,39.097076416015625 ], [ 34.56758117675787,39.0790634155274 ], [ 34.57684707641607,39.03011703491234 ], [ 34.5208091735841,38.990596771240234 ], [ 34.475379943847656,38.917903900146484 ], [ 34.473014831543026,38.88665008544933 ], [ 34.427967071533146,38.87595748901384 ], [ 34.339496612549,38.88554382324213 ], [ 34.31090545654308,38.862415313720874 ], [ 34.30298995971691,38.81587600708025 ], [ 34.26256942749052,38.793670654296875 ], [ 34.22198104858393,38.815670013427734 ], [ 34.17686462402338,38.88210296630854 ], [ 34.07765579223633,38.90355300903332 ], [ 33.98173522949247,38.965106964111385 ], [ 33.9267005920413,39.008110046386776 ], [ 33.94088363647478,39.03778457641613 ], [ 33.59801483154314,39.17142486572277 ], [ 33.52802276611345,39.2547988891601 ], [ 33.58490753173834,39.38108825683594 ], [ 33.679565429687614,39.44376754760742 ], [ 33.76018142700224,39.44463348388689 ], [ 33.801372528076456,39.514717102050895 ], [ 33.85577011108393,39.563274383545036 ], [ 33.90729522705084,39.70091247558622 ], [ 33.96332550048834,39.74765014648449 ], [ 34.06889724731451,39.80836868286144 ], [ 34.22672271728521,39.74172973632841 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-41", "NAME_1": "Kocaeli" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 30.272916793823413,41.2120819091798 ], [ 30.349306106567553,41.19291687011719 ], [ 30.37742614746088,41.162662506103516 ], [ 30.371839523315714,41.1333122253418 ], [ 30.320560455322266,41.10097122192411 ], [ 30.288484573364315,41.02032470703148 ], [ 30.36289978027372,40.95032501220726 ], [ 30.377388000488565,40.86899185180687 ], [ 30.366508483887003,40.850341796875 ], [ 30.290256500244197,40.82116317749035 ], [ 30.2994384765625,40.75570297241234 ], [ 30.22859191894537,40.62846755981451 ], [ 30.153219223022575,40.621955871582145 ], [ 30.019073486328296,40.57857131958019 ], [ 29.90131950378418,40.579971313476676 ], [ 29.766637802124308,40.61340713500999 ], [ 29.5762557983399,40.55675125122076 ], [ 29.45255661010748,40.555171966552734 ], [ 29.43100166320812,40.560283660888615 ], [ 29.432935714721737,40.679412841796875 ], [ 29.514583587646598,40.74124908447283 ], [ 29.52152824401884,40.720695495605696 ], [ 29.50736045837408,40.717361450195256 ], [ 29.56263923645048,40.68652725219738 ], [ 29.811527252197322,40.7301406860351 ], [ 29.91680526733404,40.714027404785384 ], [ 29.93680572509794,40.719860076904354 ], [ 29.940139770507812,40.755695343017805 ], [ 29.78263664245634,40.740970611572266 ], [ 29.73125076293951,40.77180480957037 ], [ 29.615139007568644,40.78263854980486 ], [ 29.57069396972662,40.76597213745123 ], [ 29.489305496215877,40.78013992309576 ], [ 29.354583740234375,40.755138397217024 ], [ 29.331806182861385,40.81624984741205 ], [ 29.257085800170955,40.802639007568416 ], [ 29.254304885864258,40.814861297607536 ], [ 29.292638778686808,40.83319473266613 ], [ 29.270696640014933,40.831806182861555 ], [ 29.265417098999023,40.8426399230957 ], [ 29.27930641174322,40.83652877807617 ], [ 29.330535888672046,40.86297988891596 ], [ 29.348457336425952,40.891124725342024 ], [ 29.419984817504826,40.92051315307623 ], [ 29.43189430236822,40.97430038452154 ], [ 29.481319427490405,41.0007019042971 ], [ 29.496175765991495,41.035736083984375 ], [ 29.652343750000057,41.01049041748058 ], [ 29.748725891113565,41.05318450927746 ], [ 29.875808715820312,41.08005142211931 ], [ 29.882820129394815,41.103969573974666 ], [ 29.863510131835994,41.14208221435558 ], [ 30.1526393890382,41.13763809204096 ], [ 30.193195343017635,41.14736175537115 ], [ 30.192361831665096,41.16208267211914 ], [ 30.22597312927263,41.16180419921875 ], [ 30.22374725341814,41.186248779296875 ], [ 30.25097274780279,41.186527252197266 ], [ 30.272916793823413,41.2120819091798 ] ] ], [ [ [ 30.264030456543026,41.21763992309593 ], [ 30.25986099243181,41.21430587768566 ], [ 30.25569534301775,41.21513748168945 ], [ 30.257360458374308,41.21763992309593 ], [ 30.264030456543026,41.21763992309593 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-42", "NAME_1": "Konya" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 33.23051834106474,39.22212600708008 ], [ 33.37403869628935,39.037906646728516 ], [ 33.36212921142584,38.791782379150504 ], [ 33.465042114257756,38.63647079467779 ], [ 33.364070892333984,38.537345886230526 ], [ 33.30143737792986,38.347045898437614 ], [ 33.240203857422046,38.24726104736351 ], [ 33.24311447143583,38.201576232910156 ], [ 33.3625679016115,38.00362014770519 ], [ 33.41840744018549,37.947883605956974 ], [ 33.495018005371264,37.93255615234381 ], [ 33.78624725341791,37.95702743530279 ], [ 34.07424926757807,38.01273727417015 ], [ 34.147918701172046,38.00718688964872 ], [ 34.326908111572436,37.856449127197266 ], [ 34.45117568969732,37.700721740722656 ], [ 34.45323562622076,37.6476287841798 ], [ 34.397258758544865,37.55559158325207 ], [ 34.380016326904354,37.47288131713867 ], [ 34.384258270263956,37.45400238037115 ], [ 34.42032623291021,37.44654464721674 ], [ 34.482170104980526,37.39559936523443 ], [ 34.51411437988298,37.333137512207145 ], [ 34.49520874023432,37.31381988525396 ], [ 34.33284759521513,37.241931915283374 ], [ 34.31916809082031,37.22196960449219 ], [ 34.19761276245134,37.17826080322277 ], [ 34.09875869750971,37.24098968505871 ], [ 33.930988311767635,37.27407455444347 ], [ 33.905017852783374,37.32161712646507 ], [ 33.82967376708996,37.38158416748058 ], [ 33.726142883301065,37.60812377929693 ], [ 33.64541244506853,37.604286193847884 ], [ 33.47241973876959,37.53235626220709 ], [ 33.406707763672046,37.454486846923885 ], [ 33.38849639892584,37.39728927612316 ], [ 33.3600692749024,37.37762451171875 ], [ 33.296306610107706,37.37743377685547 ], [ 33.20130920410173,37.4533424377442 ], [ 33.12356185913103,37.45442581176758 ], [ 33.05659866333008,37.38821792602539 ], [ 32.95408630371094,37.383758544921875 ], [ 32.89720153808622,37.35276412963867 ], [ 32.86245727539074,37.27558135986328 ], [ 32.900009155273494,37.213756561279524 ], [ 32.8411598205567,37.21237945556652 ], [ 32.76886367797857,37.233978271484375 ], [ 32.686759948730526,37.208473205566406 ], [ 32.679237365722656,37.14281845092779 ], [ 32.63539123535173,37.07808303833008 ], [ 32.567897796631144,37.01802444458008 ], [ 32.564151763916186,36.9911346435548 ], [ 32.62294769287104,36.94621276855469 ], [ 32.80971908569347,36.9109458923341 ], [ 32.748134613037394,36.850887298583984 ], [ 32.60804748535185,36.78462219238281 ], [ 32.47058486938482,36.7511253356933 ], [ 32.4174423217774,36.827526092529524 ], [ 32.29104614257841,36.85093307495117 ], [ 32.23294830322283,37.00030899047857 ], [ 31.846702575683764,37.28829956054699 ], [ 31.727830886840934,37.32756423950195 ], [ 31.459989547729435,37.34154510498041 ], [ 31.374643325805607,37.370304107666016 ], [ 31.323301315307617,37.42438888549816 ], [ 31.357999801635913,37.48129272460949 ], [ 31.365823745727823,37.54992675781273 ], [ 31.450740814209098,37.77799987792969 ], [ 31.45230293273943,37.852764129638786 ], [ 31.425519943237475,37.90036773681652 ], [ 31.424312591552905,37.96568679809582 ], [ 31.474828720093058,38.020690917968864 ], [ 31.599279403686694,38.065040588378906 ], [ 31.61876678466814,38.105682373046875 ], [ 31.586572647094897,38.14508438110357 ], [ 31.255617141723576,38.36682128906256 ], [ 31.244230270386026,38.41173171997076 ], [ 31.250438690185604,38.42662429809576 ], [ 31.679281234741325,38.63260269165045 ], [ 31.6107826232913,38.67497253417963 ], [ 31.58945655822771,38.72563552856445 ], [ 31.6233043670656,38.817733764648665 ], [ 31.708700180053995,38.95373535156273 ], [ 31.696891784668253,39.09305953979515 ], [ 31.758911132812784,39.075538635253906 ], [ 31.829113006591854,39.100021362304915 ], [ 31.86066818237333,39.167995452880916 ], [ 31.883207321167276,39.173801422119254 ], [ 31.973306655883903,39.10435485839844 ], [ 32.11332321166998,39.03137207031273 ], [ 32.2944526672365,39.06810379028326 ], [ 32.47206878662138,38.994724273681754 ], [ 32.5559196472168,39.04980850219738 ], [ 32.70268630981451,39.03284835815441 ], [ 32.742153167724666,39.082061767578125 ], [ 32.837898254394815,39.153533935546875 ], [ 32.89254760742193,39.154331207275504 ], [ 32.96263122558622,39.126510620117244 ], [ 33.021648406982706,39.15932846069347 ], [ 33.05522155761719,39.218933105468864 ], [ 33.115245819091854,39.22088241577154 ], [ 33.18780136108427,39.276828765869084 ], [ 33.23051834106474,39.22212600708008 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-43", "NAME_1": "Kütahya" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 29.562942504882926,39.89121246337896 ], [ 29.67700767517084,39.90554428100603 ], [ 29.69292449951189,39.87970352172863 ], [ 29.68674087524431,39.82540512084961 ], [ 29.722852706909237,39.74099349975609 ], [ 29.952077865600756,39.68215942382835 ], [ 30.12015342712408,39.70448303222662 ], [ 30.18699836730957,39.69670867919933 ], [ 30.137981414794922,39.62377929687523 ], [ 30.314607620239315,39.483478546142635 ], [ 30.317146301269815,39.36787796020508 ], [ 30.41478919982916,39.28709411621094 ], [ 30.45332908630388,39.20599746704107 ], [ 30.44631385803251,39.18156051635765 ], [ 30.384635925293253,39.12631988525396 ], [ 30.260791778564396,39.07954406738281 ], [ 30.17113876342802,38.902561187744254 ], [ 30.10215759277372,38.80748748779308 ], [ 29.917819976806925,38.71689987182617 ], [ 29.894367218017862,38.70968246459984 ], [ 29.89125251770048,38.79011917114258 ], [ 29.862709045410213,38.855148315429744 ], [ 29.68840217590349,38.89050674438499 ], [ 29.593931198120174,38.8758544921875 ], [ 29.50399398803728,38.83562088012707 ], [ 29.305118560791072,38.78231811523449 ], [ 29.23378944397001,38.73334121704124 ], [ 29.090955734253157,38.739379882812614 ], [ 29.03648948669445,38.72769927978521 ], [ 29.032846450805664,38.8513298034668 ], [ 29.01067733764677,38.87325668334961 ], [ 28.98968505859375,38.956939697265625 ], [ 28.95732307434082,39.008655548095646 ], [ 28.886121749877987,39.0752220153808 ], [ 28.695968627929688,39.12071228027338 ], [ 28.66218757629406,39.163825988769474 ], [ 28.661375045776367,39.2337074279788 ], [ 28.793338775634766,39.283752441406364 ], [ 28.883300781250227,39.366607666015625 ], [ 28.940580368041935,39.519817352295036 ], [ 28.934938430786246,39.550872802734546 ], [ 28.96330642700218,39.58925628662132 ], [ 29.021434783935547,39.55774688720703 ], [ 29.092315673828125,39.543609619140625 ], [ 29.229446411132983,39.55765151977539 ], [ 29.247165679931697,39.5811576843264 ], [ 29.267078399658203,39.692760467529354 ], [ 29.336360931396655,39.77615356445318 ], [ 29.406822204590014,39.90652847290045 ], [ 29.45207023620617,39.92456817626976 ], [ 29.562942504882926,39.89121246337896 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-44", "NAME_1": "Malatya" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 38.42752075195318,39.1165504455567 ], [ 38.52343368530268,39.11494064331055 ], [ 38.617038726806925,39.079467773437614 ], [ 38.65647125244135,39.05071258544916 ], [ 38.68186950683611,39.00462722778332 ], [ 38.613189697265625,39.010799407958984 ], [ 38.587699890136776,38.97869491577177 ], [ 38.631317138672046,38.876541137695426 ], [ 38.62973022460966,38.75020980834955 ], [ 38.4956245422365,38.74408340454113 ], [ 38.462364196777344,38.72850799560558 ], [ 38.34734344482439,38.5861930847168 ], [ 38.37929534912138,38.512310028076286 ], [ 38.429889678955135,38.47502899169933 ], [ 38.525379180908374,38.46200180053722 ], [ 38.684249877929744,38.41202545166021 ], [ 38.82920074462896,38.40208816528332 ], [ 38.968620300293026,38.30895233154291 ], [ 39.119144439697436,38.33825683593756 ], [ 39.142196655273494,38.285404205322266 ], [ 39.12298965454107,38.197509765625114 ], [ 39.074615478515796,38.14497375488281 ], [ 39.00511550903326,38.11749267578125 ], [ 38.85887527465832,38.09242630004883 ], [ 38.65533828735357,38.09172439575201 ], [ 38.562923431396484,38.12447357177746 ], [ 38.62433242797846,38.169216156006144 ], [ 38.634452819824276,38.19916915893566 ], [ 38.545761108398494,38.230003356933594 ], [ 38.471187591552734,38.21823120117193 ], [ 38.13481521606451,38.089435577392635 ], [ 38.18105316162115,37.91896057128906 ], [ 37.97327423095703,37.86019515991222 ], [ 37.82437133789068,37.8814582824707 ], [ 37.76950454711931,37.86634826660179 ], [ 37.73728942871122,37.83412933349632 ], [ 37.66350555419916,37.835338592529354 ], [ 37.558151245117244,37.808689117431754 ], [ 37.69754028320318,38.03805160522461 ], [ 37.77407455444353,38.22705841064459 ], [ 37.773830413818644,38.31008911132807 ], [ 37.69929885864275,38.358089447021484 ], [ 37.46228408813482,38.45021438598633 ], [ 37.36172103881853,38.46540832519531 ], [ 37.20303344726591,38.458873748779524 ], [ 37.19495010376005,38.49284362792969 ], [ 37.274082183838175,38.554397583007926 ], [ 37.29307556152372,38.59968948364269 ], [ 37.48601150512724,38.70621490478527 ], [ 37.57392501831083,38.7763786315918 ], [ 37.596317291259936,38.836570739746264 ], [ 37.5527420043947,38.92592239379883 ], [ 37.55189514160185,38.95935440063499 ], [ 37.58811187744152,39.00992202758795 ], [ 37.780391693115234,39.001106262207315 ], [ 37.93951416015625,39.059078216552734 ], [ 38.17367935180681,39.07107162475586 ], [ 38.30748748779297,39.13846969604515 ], [ 38.42752075195318,39.1165504455567 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-45", "NAME_1": "Manisa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 27.679256439208984,39.34687423706055 ], [ 27.79146385192871,39.35728836059582 ], [ 27.881540298462085,39.345581054687614 ], [ 27.896583557128906,39.35721206665045 ], [ 27.917137145996037,39.329010009765625 ], [ 27.8823184967041,39.26954650878906 ], [ 27.895751953125114,39.2360725402832 ], [ 27.978343963623274,39.22848129272484 ], [ 28.010795593261662,39.210613250732536 ], [ 28.057016372680835,39.172363281250114 ], [ 28.112621307373274,39.062858581543026 ], [ 28.15238761901861,39.045005798339844 ], [ 28.466716766357536,39.12395095825201 ], [ 28.620576858520792,39.18162918090832 ], [ 28.66218757629406,39.163825988769474 ], [ 28.70793151855463,39.11395263671898 ], [ 28.855918884277457,39.08648300170893 ], [ 28.91626358032255,39.05462646484398 ], [ 28.987447738647745,38.961959838867244 ], [ 29.03646087646507,38.83010482788097 ], [ 29.03648948669445,38.72769927978521 ], [ 28.87877845764166,38.637416839599666 ], [ 28.84781837463379,38.57641983032238 ], [ 28.840629577637003,38.49005126953148 ], [ 28.856254577636776,38.39474105834961 ], [ 28.82542800903326,38.355316162109375 ], [ 28.92095375061041,38.265453338623104 ], [ 28.801586151123104,38.218879699707145 ], [ 28.789449691772518,38.14189910888672 ], [ 28.71974372863798,38.09927368164074 ], [ 28.68299102783203,38.11477661132807 ], [ 28.559946060180778,38.108661651611385 ], [ 28.527257919311467,38.13525772094738 ], [ 28.474098205566577,38.25453948974621 ], [ 28.433549880981445,38.295082092285156 ], [ 28.22292518615734,38.33587265014654 ], [ 28.16123199462919,38.360778808593864 ], [ 28.145027160644815,38.39204025268555 ], [ 28.117492675781477,38.40279769897484 ], [ 28.001060485839787,38.399547576904524 ], [ 27.853576660156534,38.33378982543957 ], [ 27.82133483886747,38.35077285766613 ], [ 27.742670059204045,38.446926116943644 ], [ 27.56540679931652,38.48628616333025 ], [ 27.457939147949446,38.56347656250006 ], [ 27.33832931518566,38.58828735351585 ], [ 27.279998779296932,38.572151184082145 ], [ 27.22967720031761,38.741630554199446 ], [ 27.124540328979776,38.77974319458019 ], [ 27.168153762817496,38.89170837402344 ], [ 27.37003517150879,38.9268493652346 ], [ 27.387517929077205,38.95204162597662 ], [ 27.433935165405387,38.96704864501953 ], [ 27.50539588928217,39.01988601684582 ], [ 27.504394531249943,39.11765670776373 ], [ 27.470958709716797,39.1718826293947 ], [ 27.45876693725586,39.29547119140625 ], [ 27.407686233520792,39.38151550292969 ], [ 27.516485214233455,39.41384506225586 ], [ 27.612707138061694,39.36009979248047 ], [ 27.679256439208984,39.34687423706055 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-47", "NAME_1": "Mardin" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 40.80224990844732,37.717403411865234 ], [ 41.051792144775675,37.73957443237305 ], [ 41.05427551269537,37.71387100219749 ], [ 41.13343429565458,37.63745117187506 ], [ 41.18900680542009,37.556800842285384 ], [ 41.4461212158206,37.55442810058594 ], [ 41.573192596435604,37.57748413085932 ], [ 41.686473846435604,37.67586898803711 ], [ 41.8738899230957,37.74024581909191 ], [ 41.95733642578125,37.63766860961914 ], [ 41.93354797363281,37.585899353027344 ], [ 41.94921875000006,37.52552032470726 ], [ 41.90201187133795,37.49835586547857 ], [ 41.763572692871264,37.47929763793957 ], [ 41.74073028564459,37.468338012695426 ], [ 41.73814773559576,37.4432373046875 ], [ 41.73899078369158,37.33707046508789 ], [ 41.75641632080084,37.296710968017635 ], [ 41.779117584228686,37.2880554199221 ], [ 41.848300933838175,37.30717849731445 ], [ 41.86858367919933,37.276142120361385 ], [ 41.887989044189396,37.209285736083984 ], [ 41.8692359924317,37.13902282714844 ], [ 41.55814361572283,37.085227966308594 ], [ 41.27106094360357,37.07924270629883 ], [ 41.218410491943416,37.063602447509766 ], [ 41.169742584228686,37.092239379882926 ], [ 40.94995498657221,37.12441253662115 ], [ 40.885929107666186,37.124263763427734 ], [ 40.850471496582315,37.1066246032716 ], [ 40.781726837158146,37.120582580566634 ], [ 40.54626846313482,37.026714324951456 ], [ 40.438137054443416,37.00880050659174 ], [ 40.25516510009794,36.916130065918026 ], [ 40.1816139221192,36.94679260253912 ], [ 40.13233947753935,37.02339935302729 ], [ 40.11487960815458,37.130916595458984 ], [ 39.94049453735357,37.414386749267635 ], [ 39.881374359130916,37.55633163452154 ], [ 40.01730346679699,37.5563125610351 ], [ 40.09448623657255,37.589130401611555 ], [ 40.20661544799816,37.566856384277344 ], [ 40.280414581298885,37.569232940674 ], [ 40.41819000244146,37.6458854675293 ], [ 40.5161018371582,37.650424957275504 ], [ 40.535087585449276,37.67518997192394 ], [ 40.54299545288086,37.733390808105526 ], [ 40.60204696655302,37.787681579589844 ], [ 40.64764404296881,37.76625823974621 ], [ 40.715831756591854,37.761577606201286 ], [ 40.752021789550895,37.730331420898494 ], [ 40.80224990844732,37.717403411865234 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-33", "NAME_1": "Mersin" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 33.53041839599638,36.129028320312614 ], [ 33.534862518310604,36.12152862548834 ], [ 33.52875137329107,36.11930465698248 ], [ 33.53152847290039,36.124027252197266 ], [ 33.53041839599638,36.129028320312614 ] ] ], [ [ [ 33.69486236572294,36.16125106811546 ], [ 33.69819259643583,36.16041564941429 ], [ 33.69819259643583,36.159305572509766 ], [ 33.69180679321295,36.16069412231451 ], [ 33.69486236572294,36.16125106811546 ] ] ], [ [ [ 33.77958297729498,36.20097351074219 ], [ 33.77708435058588,36.18430709838884 ], [ 33.75680541992193,36.182361602783374 ], [ 33.761806488037166,36.19013977050781 ], [ 33.77958297729498,36.20097351074219 ] ] ], [ [ [ 33.828193664551065,36.26930618286161 ], [ 33.82902908325224,36.26708221435575 ], [ 33.8262481689456,36.264583587646484 ], [ 33.8256950378418,36.267360687256144 ], [ 33.828193664551065,36.26930618286161 ] ] ], [ [ [ 34.914901733398494,37.12962722778326 ], [ 34.93461608886747,37.076961517333984 ], [ 35.00078582763683,37.041458129882926 ], [ 35.05463027954107,36.97039413452154 ], [ 35.0698127746582,36.833457946777344 ], [ 35.034801483154354,36.770996093750114 ], [ 34.949817657470646,36.7540168762207 ], [ 34.90958404541021,36.72375106811546 ], [ 34.853748321533374,36.7801399230957 ], [ 34.76291656494146,36.809581756592024 ], [ 34.65402603149431,36.80764007568371 ], [ 34.560695648193644,36.76847076416021 ], [ 34.54513931274431,36.74291610717768 ], [ 34.47263717651384,36.70847320556669 ], [ 34.429862976074276,36.663749694824276 ], [ 34.27847290039074,36.585693359375 ], [ 34.168472290039006,36.466804504394645 ], [ 34.121250152588175,36.45069503784208 ], [ 34.110416412353686,36.425415039062614 ], [ 34.07930374145502,36.41041564941406 ], [ 34.07263946533209,36.31791687011736 ], [ 34.04347229003912,36.29486083984398 ], [ 33.99708175659208,36.30402755737316 ], [ 33.97652816772478,36.275970458984375 ], [ 33.99791717529325,36.28569412231457 ], [ 33.999027252197436,36.284584045410384 ], [ 33.96263885498075,36.23180389404308 ], [ 33.93763732910185,36.28958511352539 ], [ 33.87014007568388,36.31624984741205 ], [ 33.83235931396513,36.285137176513956 ], [ 33.84097290039091,36.27513885498041 ], [ 33.81486129760748,36.273750305176065 ], [ 33.80902862548834,36.2401390075683 ], [ 33.69847106933622,36.173751831054915 ], [ 33.687362670898494,36.159305572509766 ], [ 33.699859619140796,36.14319610595703 ], [ 33.6895828247072,36.13458251953142 ], [ 33.67208480834955,36.14625167846708 ], [ 33.68347167968767,36.1576385498048 ], [ 33.65930557250971,36.1601371765139 ], [ 33.661251068115405,36.18680572509777 ], [ 33.64791488647478,36.193748474121264 ], [ 33.59291839599615,36.176528930664006 ], [ 33.56097030639654,36.12541580200218 ], [ 33.474029541015796,36.159305572509766 ], [ 33.394584655761776,36.12486267089844 ], [ 33.35235977172863,36.15430450439459 ], [ 33.28930664062506,36.129028320312614 ], [ 33.14652633666998,36.137916564941634 ], [ 33.12513732910185,36.13013839721697 ], [ 33.08152770996111,36.06958389282238 ], [ 33.05180740356474,36.0948600769043 ], [ 32.9501380920413,36.10374832153349 ], [ 32.86875152587902,36.07069396972656 ], [ 32.8031959533692,36.015415191650504 ], [ 32.679306030273494,36.038471221923885 ], [ 32.566024780273494,36.099861145019474 ], [ 32.60036849975586,36.1391334533692 ], [ 32.63268661499029,36.225891113281364 ], [ 32.646808624267635,36.28602600097656 ], [ 32.63582229614252,36.38359451293945 ], [ 32.65814208984381,36.446079254150504 ], [ 32.84065246582037,36.43311691284191 ], [ 33.05472183227556,36.468769073486385 ], [ 33.21320724487322,36.52260971069347 ], [ 33.23061370849638,36.55921173095703 ], [ 33.217575073242244,36.58370590209978 ], [ 33.096580505371264,36.63430023193354 ], [ 33.04000473022461,36.67696380615246 ], [ 32.9618453979495,36.809215545654524 ], [ 33.11583709716814,36.85238647460943 ], [ 33.328708648681754,36.976009368896484 ], [ 33.39587783813505,37.00056838989269 ], [ 33.52960968017584,37.0029754638673 ], [ 33.62107849121094,37.046009063720874 ], [ 33.67952346801752,37.04685974121088 ], [ 33.740608215332315,37.026695251464844 ], [ 33.836917877197436,37.05025863647461 ], [ 33.98369598388689,37.12459564209007 ], [ 34.137424468994254,37.14317321777338 ], [ 34.31916809082031,37.22196960449219 ], [ 34.33284759521513,37.241931915283374 ], [ 34.49090576171881,37.310096740722656 ], [ 34.51411437988298,37.333137512207145 ], [ 34.50988006591825,37.34932327270508 ], [ 34.59980010986334,37.351367950439396 ], [ 34.70718383789068,37.39586639404308 ], [ 34.78332519531256,37.39600372314476 ], [ 34.914901733398494,37.12962722778326 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-48", "NAME_1": "Muğla" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 29.059860229492358,36.5420837402346 ], [ 29.061805725097656,36.54069519042986 ], [ 29.06041717529331,36.53874969482439 ], [ 29.058750152588004,36.53985977172874 ], [ 29.059860229492358,36.5420837402346 ] ] ], [ [ [ 29.07208251953125,36.55541610717785 ], [ 29.07597160339367,36.55347061157255 ], [ 29.064027786255338,36.554306030273494 ], [ 29.065694808959904,36.55541610717785 ], [ 29.07208251953125,36.55541610717785 ] ] ], [ [ [ 28.035972595214787,36.55902862548851 ], [ 28.036527633666992,36.55541610717785 ], [ 28.03513908386242,36.554584503174055 ], [ 28.03430557251005,36.55708312988281 ], [ 28.035972595214787,36.55902862548851 ] ] ], [ [ [ 28.040693283080998,36.563472747802734 ], [ 28.03847312927286,36.56124877929682 ], [ 28.035694122314794,36.56097412109398 ], [ 28.036527633666992,36.562915802002124 ], [ 28.040693283080998,36.563472747802734 ] ] ], [ [ [ 28.127082824707486,36.60069274902355 ], [ 28.129028320312614,36.595695495605526 ], [ 28.121805191040323,36.59763717651367 ], [ 28.122638702392692,36.59930419921898 ], [ 28.127082824707486,36.60069274902355 ] ] ], [ [ [ 28.056804656982877,36.619026184082145 ], [ 28.05763626098667,36.61680603027344 ], [ 28.053195953369254,36.613193511963004 ], [ 28.055414199829556,36.619026184082145 ], [ 28.056804656982877,36.619026184082145 ] ] ], [ [ [ 28.052917480468864,36.62736129760742 ], [ 28.05347251892084,36.62597274780285 ], [ 28.053749084472656,36.62319564819336 ], [ 28.050693511963345,36.62430572509771 ], [ 28.052917480468864,36.62736129760742 ] ] ], [ [ [ 28.763750076294343,36.62874984741234 ], [ 28.765138626099088,36.62680435180664 ], [ 28.761528015136662,36.62597274780285 ], [ 28.76124954223667,36.62708282470703 ], [ 28.763750076294343,36.62874984741234 ] ] ], [ [ [ 28.054582595825195,36.65013885498064 ], [ 28.05985832214361,36.649028778076456 ], [ 28.060140609741154,36.64736175537132 ], [ 28.04875183105463,36.648193359375114 ], [ 28.054582595825195,36.65013885498064 ] ] ], [ [ [ 29.1059703826906,36.65319442749046 ], [ 29.099582672119254,36.645973205566406 ], [ 29.097362518310547,36.6462516784668 ], [ 29.098196029663484,36.65263748168951 ], [ 29.1059703826906,36.65319442749046 ] ] ], [ [ [ 27.510417938232763,36.66291809082048 ], [ 27.512083053588924,36.66097259521496 ], [ 27.50930786132841,36.654582977295036 ], [ 27.5076389312747,36.65930557250982 ], [ 27.510417938232763,36.66291809082048 ] ] ], [ [ [ 29.046527862549283,36.66458511352539 ], [ 29.054304122924805,36.660415649414176 ], [ 29.043195724487248,36.65180587768555 ], [ 29.04125022888195,36.66152954101574 ], [ 29.046527862549283,36.66458511352539 ] ] ], [ [ [ 28.014303207397518,36.67013931274437 ], [ 28.014303207397518,36.6668052673341 ], [ 28.012916564941577,36.66652679443354 ], [ 28.011528015136832,36.66958236694359 ], [ 28.014303207397518,36.67013931274437 ] ] ], [ [ [ 28.895971298217944,36.67041778564476 ], [ 28.90736389160162,36.6648597717288 ], [ 28.90791702270502,36.65124893188499 ], [ 28.888748168945256,36.665973663330305 ], [ 28.895971298217944,36.67041778564476 ] ] ], [ [ [ 28.0362491607666,36.67124938964872 ], [ 28.046247482299975,36.65625000000017 ], [ 28.04152870178234,36.64958190917969 ], [ 28.027639389038143,36.659862518310774 ], [ 28.0362491607666,36.67124938964872 ] ] ], [ [ [ 29.03013801574741,36.671806335449276 ], [ 29.035972595214957,36.66875076293945 ], [ 29.036527633667333,36.6668052673341 ], [ 29.029861450195426,36.66819381713867 ], [ 29.03013801574741,36.671806335449276 ] ] ], [ [ [ 28.042083740234716,36.67319488525402 ], [ 28.041805267334325,36.66875076293945 ], [ 28.04013824462902,36.66847229003906 ], [ 28.039304733276822,36.672084808349666 ], [ 28.042083740234716,36.67319488525402 ] ] ], [ [ [ 28.91680526733404,36.68180465698265 ], [ 28.939582824707088,36.6737518310548 ], [ 28.91486167907715,36.654304504394815 ], [ 28.909305572509766,36.672084808349666 ], [ 28.91680526733404,36.68180465698265 ] ] ], [ [ [ 28.043750762939453,36.68180465698265 ], [ 28.042638778686523,36.68291854858421 ], [ 28.04513740539562,36.683471679687614 ], [ 28.04513740539562,36.68264007568365 ], [ 28.043750762939453,36.68180465698265 ] ] ], [ [ [ 28.69819450378418,36.694862365722884 ], [ 28.69819450378418,36.692638397217024 ], [ 28.690416336059684,36.69208145141607 ], [ 28.692363739013786,36.69430541992193 ], [ 28.69819450378418,36.694862365722884 ] ] ], [ [ [ 28.93291664123535,36.69736099243164 ], [ 28.93402862548868,36.69458389282249 ], [ 28.932081222534407,36.69402694702154 ], [ 28.930971145630053,36.69625091552746 ], [ 28.93291664123535,36.69736099243164 ] ] ], [ [ [ 29.00597190856945,36.699028015136946 ], [ 29.013750076294116,36.69597244262707 ], [ 29.013193130493164,36.69347381591814 ], [ 29.00597190856945,36.69374847412138 ], [ 29.00597190856945,36.699028015136946 ] ] ], [ [ [ 28.928194046020565,36.7001380920413 ], [ 28.930416107177678,36.69680404663086 ], [ 28.92597198486328,36.69291687011719 ], [ 28.923196792602937,36.698749542236555 ], [ 28.928194046020565,36.7001380920413 ] ] ], [ [ [ 27.988193511962834,36.704860687255916 ], [ 27.990415573120515,36.70264053344738 ], [ 27.98986053466797,36.700973510742415 ], [ 27.98736190795904,36.70180511474621 ], [ 27.988193511962834,36.704860687255916 ] ] ], [ [ [ 28.93486022949247,36.70875167846691 ], [ 28.935695648193416,36.70375061035156 ], [ 28.932081222534407,36.698749542236555 ], [ 28.933473587036133,36.707359313965014 ], [ 28.93486022949247,36.70875167846691 ] ] ], [ [ [ 27.997083663940828,36.710140228271484 ], [ 27.99819374084518,36.70930480957048 ], [ 27.995695114136083,36.707084655761776 ], [ 27.994583129882756,36.70902633666992 ], [ 27.997083663940828,36.710140228271484 ] ] ], [ [ [ 28.933195114135742,36.7120819091798 ], [ 28.933195114135742,36.70791625976557 ], [ 28.931804656982422,36.707359313965014 ], [ 28.92958259582531,36.709861755371094 ], [ 28.933195114135742,36.7120819091798 ] ] ], [ [ [ 28.248472213745515,36.71458435058605 ], [ 28.24735832214361,36.7120819091798 ], [ 28.242639541625977,36.713748931884936 ], [ 28.244583129883267,36.71458435058605 ], [ 28.248472213745515,36.71458435058605 ] ] ], [ [ [ 28.00180435180704,36.72013854980486 ], [ 28.004304885864713,36.71791839599632 ], [ 28.004583358765103,36.71319580078131 ], [ 27.99986076354992,36.71791839599632 ], [ 28.00180435180704,36.72013854980486 ] ] ], [ [ [ 28.033750534057674,36.72652816772478 ], [ 28.031805038452546,36.71791839599632 ], [ 28.014862060546875,36.71180725097679 ], [ 28.01513862609869,36.72236251831055 ], [ 28.033750534057674,36.72652816772478 ] ] ], [ [ [ 28.05208206176752,36.73541641235357 ], [ 28.058195114136026,36.733470916748104 ], [ 28.064027786254996,36.73485946655302 ], [ 28.0665283203125,36.733749389648665 ], [ 28.060693740845124,36.72652816772478 ], [ 28.04513740539562,36.725139617920036 ], [ 28.05208206176752,36.73541641235357 ] ] ], [ [ [ 28.93986129760748,36.73708343505888 ], [ 28.950416564941406,36.7254180908206 ], [ 28.938472747802734,36.71763992309576 ], [ 28.933750152588118,36.72402954101568 ], [ 28.93986129760748,36.73708343505888 ] ] ], [ [ [ 27.40541648864746,36.74291610717768 ], [ 27.413473129272518,36.73875045776367 ], [ 27.414028167725064,36.73764038085949 ], [ 27.404306411743107,36.74124908447294 ], [ 27.40541648864746,36.74291610717768 ] ] ], [ [ [ 27.962360382080135,36.75291824340843 ], [ 27.966247558593977,36.75208282470726 ], [ 27.965694427490575,36.74958419799816 ], [ 27.962638854980526,36.75041580200195 ], [ 27.962360382080135,36.75291824340843 ] ] ], [ [ [ 27.791528701782227,36.75319290161144 ], [ 27.792083740234375,36.75236129760765 ], [ 27.790418624878043,36.751251220703125 ], [ 27.79013633728067,36.75236129760765 ], [ 27.791528701782227,36.75319290161144 ] ] ], [ [ [ 27.76458358764654,36.75347137451183 ], [ 27.762361526489258,36.75152587890631 ], [ 27.759027481079386,36.751251220703125 ], [ 27.759860992431754,36.75263977050787 ], [ 27.76458358764654,36.75347137451183 ] ] ], [ [ [ 27.775972366333065,36.756805419921875 ], [ 27.775972366333065,36.75347137451183 ], [ 27.77375030517578,36.75208282470726 ], [ 27.773193359375,36.75485992431658 ], [ 27.775972366333065,36.756805419921875 ] ] ], [ [ [ 27.80763816833513,36.76069259643555 ], [ 27.808195114136083,36.759304046631144 ], [ 27.804582595825252,36.75763702392584 ], [ 27.80541610717819,36.760417938232706 ], [ 27.80763816833513,36.76069259643555 ] ] ], [ [ [ 28.05958366394077,36.76180648803705 ], [ 28.058471679687443,36.759304046631144 ], [ 28.055973052978914,36.759582519531364 ], [ 28.057083129883267,36.76180648803705 ], [ 28.05958366394077,36.76180648803705 ] ] ], [ [ [ 28.03430557251005,36.76235961914085 ], [ 28.03736114501953,36.76097106933594 ], [ 28.03736114501953,36.759860992431754 ], [ 28.033472061157283,36.760139465332145 ], [ 28.03430557251005,36.76235961914085 ] ] ], [ [ [ 28.12375068664545,36.762916564941406 ], [ 28.127082824707486,36.76180648803705 ], [ 28.12680625915533,36.760417938232706 ], [ 28.124305725097827,36.76097106933594 ], [ 28.12375068664545,36.762916564941406 ] ] ], [ [ [ 27.46819686889694,36.77069473266607 ], [ 27.470138549805085,36.76930618286133 ], [ 27.470138549805085,36.768196105956974 ], [ 27.467361450195426,36.76958465576172 ], [ 27.46819686889694,36.77069473266607 ] ] ], [ [ [ 27.46069526672369,36.775138854980696 ], [ 27.46458244323736,36.77236175537121 ], [ 27.464305877685547,36.77069473266607 ], [ 27.45874977111839,36.773193359375 ], [ 27.46069526672369,36.775138854980696 ] ] ], [ [ [ 28.440971374512117,36.777084350585994 ], [ 28.442638397216854,36.771526336669865 ], [ 28.430973052978743,36.77041625976568 ], [ 28.436805725097713,36.777637481689396 ], [ 28.440971374512117,36.777084350585994 ] ] ], [ [ [ 28.599027633666992,36.79763793945335 ], [ 28.597639083862248,36.795417785644815 ], [ 28.595417022705135,36.795696258545206 ], [ 28.59652709960949,36.79735946655296 ], [ 28.599027633666992,36.79763793945335 ] ] ], [ [ [ 28.258750915527287,36.809860229492244 ], [ 28.259859085083065,36.797916412353516 ], [ 28.243194580078352,36.8079185485841 ], [ 28.25319480896013,36.80736160278332 ], [ 28.258750915527287,36.809860229492244 ] ] ], [ [ [ 28.28819465637224,36.821250915527344 ], [ 28.28791618347168,36.81902694702143 ], [ 28.27819442749046,36.81958389282238 ], [ 28.278472900391023,36.82069396972673 ], [ 28.28819465637224,36.821250915527344 ] ] ], [ [ [ 28.444860458373967,36.86486053466808 ], [ 28.445972442627294,36.86291503906256 ], [ 28.445972442627294,36.862083435058764 ], [ 28.444026947021598,36.86319351196312 ], [ 28.444860458373967,36.86486053466808 ] ] ], [ [ [ 28.0262508392334,36.868751525878906 ], [ 28.027639389038143,36.865970611572266 ], [ 28.01791572570835,36.867916107177734 ], [ 28.01791572570835,36.868473052978686 ], [ 28.0262508392334,36.868751525878906 ] ] ], [ [ [ 28.03736114501953,36.871528625488395 ], [ 28.03736114501953,36.87014007568382 ], [ 28.032083511352937,36.868194580078125 ], [ 28.03430557251005,36.870693206787394 ], [ 28.03736114501953,36.871528625488395 ] ] ], [ [ [ 28.042360305786133,36.87652587890619 ], [ 28.04513740539562,36.87625122070335 ], [ 28.045415878296183,36.87458419799805 ], [ 28.042360305786133,36.8731956481933 ], [ 28.042360305786133,36.87652587890619 ] ] ], [ [ [ 28.03458404541061,36.885692596435774 ], [ 28.0362491607666,36.88402938842785 ], [ 28.03430557251005,36.882637023925724 ], [ 28.033750534057674,36.88541793823259 ], [ 28.03458404541061,36.885692596435774 ] ] ], [ [ [ 28.15569496154808,36.93763732910179 ], [ 28.1576385498048,36.93458175659191 ], [ 28.154861450195312,36.93347167968773 ], [ 28.153194427490575,36.935699462890625 ], [ 28.15569496154808,36.93763732910179 ] ] ], [ [ [ 28.15458297729532,36.94597244262718 ], [ 28.156805038452433,36.945137023926065 ], [ 28.155971527099666,36.94374847412132 ], [ 28.15402984619135,36.94402694702171 ], [ 28.15458297729532,36.94597244262718 ] ] ], [ [ [ 27.30624961853067,36.9523620605471 ], [ 27.306528091431062,36.95097351074219 ], [ 27.304582595825195,36.94985961914068 ], [ 27.303472518921012,36.95180511474615 ], [ 27.30624961853067,36.9523620605471 ] ] ], [ [ [ 28.19847488403326,36.96374893188488 ], [ 28.200138092041016,36.958751678467024 ], [ 28.18930435180704,36.95791625976591 ], [ 28.193195343017692,36.96180725097673 ], [ 28.19847488403326,36.96374893188488 ] ] ], [ [ [ 27.579305648803654,36.977085113525675 ], [ 27.577917098999478,36.97819519042963 ], [ 27.581527709961335,36.97874832153343 ], [ 27.58097267150879,36.97763824462908 ], [ 27.579305648803654,36.977085113525675 ] ] ], [ [ [ 27.65569686889677,36.979862213134936 ], [ 27.65736198425293,36.97874832153343 ], [ 27.65736198425293,36.97763824462908 ], [ 27.655136108398438,36.97902679443382 ], [ 27.65569686889677,36.979862213134936 ] ] ], [ [ [ 27.58958244323742,36.980140686035156 ], [ 27.60013961791998,36.97541809082037 ], [ 27.60208320617687,36.96652603149414 ], [ 27.591806411743505,36.96847152709984 ], [ 27.58958244323742,36.980140686035156 ] ] ], [ [ [ 27.23180580139166,36.98708343505865 ], [ 27.232639312744595,36.9859733581543 ], [ 27.233194351196403,36.98152923584007 ], [ 27.229028701782568,36.983196258545206 ], [ 27.23180580139166,36.98708343505865 ] ] ], [ [ [ 27.197639465332486,36.993751525879134 ], [ 27.199306488037053,36.99291610717802 ], [ 27.199028015136662,36.991527557373274 ], [ 27.195692062378214,36.99236297607422 ], [ 27.197639465332486,36.993751525879134 ] ] ], [ [ [ 28.20624732971197,36.99569320678728 ], [ 28.20986175537155,36.990699768066634 ], [ 28.200416564941406,36.99097061157249 ], [ 28.20180511474632,36.99347305297857 ], [ 28.20624732971197,36.99569320678728 ] ] ], [ [ [ 27.428195953369084,36.997638702392635 ], [ 27.484029769897518,36.97763824462908 ], [ 27.492639541626147,36.96736145019531 ], [ 27.476528167725007,36.95791625976591 ], [ 27.445693969726562,36.96986007690441 ], [ 27.428195953369084,36.997638702392635 ] ] ], [ [ [ 28.208751678467195,36.999584197998104 ], [ 28.209583282471158,36.997081756592024 ], [ 28.204860687255803,36.997917175293196 ], [ 28.205137252807617,36.999584197998104 ], [ 28.208751678467195,36.999584197998104 ] ] ], [ [ [ 27.385139465332315,37.00180435180664 ], [ 27.386806488037053,36.997360229492415 ], [ 27.384027481079556,36.99013900756836 ], [ 27.379583358764762,36.99486160278349 ], [ 27.385139465332315,37.00180435180664 ] ] ], [ [ [ 28.241249084472656,37.003471374511946 ], [ 28.241804122925203,37.00152587890625 ], [ 28.23791694641119,37.0020828247072 ], [ 28.23791694641119,37.0029182434082 ], [ 28.241249084472656,37.003471374511946 ] ] ], [ [ [ 27.180971145630224,37.006248474121264 ], [ 27.183471679687727,37.00569534301786 ], [ 27.183471679687727,37.00485992431652 ], [ 27.180416107177848,37.00430679321312 ], [ 27.180971145630224,37.006248474121264 ] ] ], [ [ [ 27.36013793945358,37.01069259643583 ], [ 27.362361907959098,37.00763702392601 ], [ 27.359304428100643,37.005973815918026 ], [ 27.356805801391545,37.01013946533226 ], [ 27.36013793945358,37.01069259643583 ] ] ], [ [ [ 27.21986007690475,37.01347351074213 ], [ 27.224304199218807,37.00819396972656 ], [ 27.2048606872562,36.99625015258789 ], [ 27.203193664550895,36.99874877929699 ], [ 27.21986007690475,37.01347351074213 ] ] ], [ [ [ 27.203472137451286,37.05097198486351 ], [ 27.203472137451286,37.04597091674816 ], [ 27.198192596435717,37.04902648925804 ], [ 27.200416564941406,37.05097198486351 ], [ 27.203472137451286,37.05097198486351 ] ] ], [ [ [ 27.213472366333065,37.08986282348627 ], [ 27.213750839233626,37.08430480957031 ], [ 27.204027175903263,37.082359313964844 ], [ 27.207639694214265,37.08930587768572 ], [ 27.213472366333065,37.08986282348627 ] ] ], [ [ [ 27.236803054809684,37.090694427490234 ], [ 27.240695953369084,37.08902740478533 ], [ 27.241249084473054,37.08763885498058 ], [ 27.23208427429205,37.088748931884766 ], [ 27.236803054809684,37.090694427490234 ] ] ], [ [ [ 27.47486114501953,37.124027252197436 ], [ 27.47291755676315,37.11847305297846 ], [ 27.46958351135254,37.11819458007807 ], [ 27.46902847290073,37.11958312988281 ], [ 27.47486114501953,37.124027252197436 ] ] ], [ [ [ 27.481807708740575,37.13069534301775 ], [ 27.480695724487248,37.12513732910179 ], [ 27.47708129882824,37.12513732910179 ], [ 27.47791671752975,37.129028320312614 ], [ 27.481807708740575,37.13069534301775 ] ] ], [ [ [ 27.256528854370572,37.13375091552757 ], [ 27.257917404174748,37.132915496826456 ], [ 27.257917404174748,37.13097381591791 ], [ 27.255418777466218,37.1318054199221 ], [ 27.256528854370572,37.13375091552757 ] ] ], [ [ [ 27.394027709961335,37.140415191650334 ], [ 27.389028549194734,37.13624954223633 ], [ 27.385139465332315,37.13763809204107 ], [ 27.385414123535156,37.13958358764654 ], [ 27.394027709961335,37.140415191650334 ] ] ], [ [ [ 27.53236389160162,37.165138244628906 ], [ 27.52874946594261,37.14125061035185 ], [ 27.489860534668082,37.14125061035185 ], [ 27.49458312988287,37.15680694580084 ], [ 27.53236389160162,37.165138244628906 ] ] ], [ [ [ 27.36291885376005,37.1751403808596 ], [ 27.378194808960018,37.16764068603533 ], [ 27.379028320312955,37.16319274902355 ], [ 27.367359161377294,37.16236114501976 ], [ 27.36291885376005,37.1751403808596 ] ] ], [ [ [ 27.355972290039176,37.17708206176775 ], [ 27.35958480834961,37.176250457763956 ], [ 27.360414505004996,37.1740264892581 ], [ 27.354028701782624,37.17235946655296 ], [ 27.355972290039176,37.17708206176775 ] ] ], [ [ [ 27.521249771118335,37.19736099243187 ], [ 27.522918701172046,37.196529388427734 ], [ 27.522918701172046,37.19569396972656 ], [ 27.519027709961392,37.196804046630916 ], [ 27.521249771118335,37.19736099243187 ] ] ], [ [ [ 27.55013656616211,37.202640533447436 ], [ 27.55180549621582,37.20097351074213 ], [ 27.552360534668026,37.19791793823265 ], [ 27.55069351196289,37.19847106933622 ], [ 27.55013656616211,37.202640533447436 ] ] ], [ [ [ 27.55013656616211,37.25374984741211 ], [ 27.563747406006314,37.24708175659197 ], [ 27.563747406006314,37.24458312988287 ], [ 27.54874992370617,37.25069427490263 ], [ 27.55013656616211,37.25374984741211 ] ] ], [ [ [ 27.5598602294923,37.255138397217024 ], [ 27.56097221374523,37.25430679321289 ], [ 27.56125068664562,37.25319290161133 ], [ 27.558750152587947,37.2540283203125 ], [ 27.5598602294923,37.255138397217024 ] ] ], [ [ [ 27.369581222534407,37.28291702270508 ], [ 27.365417480469148,37.27986145019537 ], [ 27.36319351196289,37.28041839599632 ], [ 27.3665275573735,37.28486251831055 ], [ 27.369581222534407,37.28291702270508 ] ] ], [ [ [ 28.478357315063647,37.4941978454591 ], [ 28.60888862609869,37.4764137268067 ], [ 28.615867614746094,37.3905487060548 ], [ 28.74400711059576,37.35529327392578 ], [ 28.786222457886026,37.24433517456066 ], [ 28.928304672241268,37.20682525634794 ], [ 29.0329914093017,37.144401550293196 ], [ 29.063364028930664,37.104351043701286 ], [ 29.05659675598173,37.07457733154297 ], [ 29.07584381103527,37.047645568847656 ], [ 29.081838607788143,36.99150466918945 ], [ 29.19094657897955,36.88718414306652 ], [ 29.266778945923136,36.884883880615234 ], [ 29.329647064209155,36.95889282226574 ], [ 29.33764457702665,37.040996551513786 ], [ 29.387758255004826,37.076091766357536 ], [ 29.408311843872355,37.02462768554693 ], [ 29.39665603637701,36.950046539306754 ], [ 29.44611740112333,36.96438980102539 ], [ 29.511768341064737,37.024211883545036 ], [ 29.546728134155217,37.027606964111555 ], [ 29.62462997436529,36.99750900268566 ], [ 29.6769447326663,36.932643890381144 ], [ 29.6735973358156,36.87476730346697 ], [ 29.604988098144702,36.779148101806754 ], [ 29.57402038574247,36.61486434936529 ], [ 29.32302856445341,36.4380264282226 ], [ 29.32847785949724,36.40187454223644 ], [ 29.29306030273466,36.31244659423851 ], [ 29.262361526489315,36.3009681701663 ], [ 29.226249694824276,36.32875061035173 ], [ 29.164863586425838,36.340972900390625 ], [ 29.13819694519077,36.35985946655279 ], [ 29.14541625976608,36.37819290161144 ], [ 29.10124969482439,36.387084960937784 ], [ 29.102916717529695,36.40458297729492 ], [ 29.131526947021882,36.41569519042997 ], [ 29.117916107177678,36.425415039062614 ], [ 29.133474349975586,36.42791748046869 ], [ 29.124860763549805,36.461528778076456 ], [ 29.100696563721158,36.47458267211914 ], [ 29.125972747802734,36.496528625488565 ], [ 29.125694274902344,36.54236221313499 ], [ 29.11208534240768,36.554584503174055 ], [ 29.09708595275913,36.54513931274431 ], [ 29.086250305175838,36.56513977050804 ], [ 29.049304962158203,36.55847167968756 ], [ 29.053474426269588,36.53874969482439 ], [ 29.008472442626953,36.543472290039176 ], [ 29.046806335449673,36.55819320678734 ], [ 29.02236175537115,36.58597183227539 ], [ 29.04013824462936,36.61986160278332 ], [ 29.07541656494186,36.61430740356474 ], [ 29.07764053344738,36.6462516784668 ], [ 29.101804733276367,36.6409721374514 ], [ 29.089582443237305,36.61986160278332 ], [ 29.115972518920955,36.62652587890642 ], [ 29.12208557128946,36.64736175537132 ], [ 29.103195190429688,36.67124938964872 ], [ 29.054304122924805,36.68152618408209 ], [ 29.03319549560547,36.70791625976557 ], [ 29.013193130493164,36.704303741455305 ], [ 29.020416259765625,36.715415954589844 ], [ 28.9959716796875,36.70819473266613 ], [ 28.97097206115734,36.730972290039176 ], [ 28.964862823486385,36.72236251831055 ], [ 28.928750991821346,36.75513839721697 ], [ 28.929859161377294,36.73430633544922 ], [ 28.894306182861385,36.7120819091798 ], [ 28.909305572509766,36.70541763305687 ], [ 28.864582061767692,36.69708251953125 ], [ 28.869028091431062,36.67097091674816 ], [ 28.850971221924055,36.663471221923885 ], [ 28.866249084472997,36.654026031494254 ], [ 28.85014152526867,36.64319610595709 ], [ 28.87041664123541,36.63347244262695 ], [ 28.880416870117188,36.648750305175895 ], [ 28.906803131103516,36.639583587646484 ], [ 28.868473052978516,36.621807098388615 ], [ 28.8756942749024,36.60180664062506 ], [ 28.845693588256893,36.58819580078125 ], [ 28.824306488037166,36.62569427490263 ], [ 28.851249694824617,36.63763809204096 ], [ 28.830694198608512,36.63874816894531 ], [ 28.818195343017635,36.65930557250982 ], [ 28.794027328491268,36.6504173278808 ], [ 28.806526184082145,36.669029235840014 ], [ 28.79013824462885,36.685974121093864 ], [ 28.727916717529297,36.71180725097679 ], [ 28.67013931274454,36.69152832031267 ], [ 28.673749923706396,36.70597076416027 ], [ 28.6479167938233,36.721805572509766 ], [ 28.632917404174748,36.69985961914091 ], [ 28.61791610717779,36.70347213745117 ], [ 28.624305725097713,36.727638244629134 ], [ 28.60708427429205,36.733749389648665 ], [ 28.632917404174748,36.75485992431658 ], [ 28.61291694641119,36.759304046631144 ], [ 28.630138397216854,36.78152847290062 ], [ 28.58763885498047,36.815418243408374 ], [ 28.549306869506893,36.830417633056925 ], [ 28.54874992370651,36.81430435180681 ], [ 28.529029846191747,36.8070831298831 ], [ 28.53597259521507,36.785694122314624 ], [ 28.489583969116268,36.79902648925787 ], [ 28.498193740844897,36.81791687011747 ], [ 28.462083816528434,36.81124877929716 ], [ 28.45069503784191,36.84569549560547 ], [ 28.469306945800895,36.862361907958984 ], [ 28.455694198608512,36.87930679321306 ], [ 28.432916641235465,36.8576393127442 ], [ 28.407360076904354,36.85402679443354 ], [ 28.402914047241552,36.86652755737322 ], [ 28.379861831665494,36.847637176513615 ], [ 28.387916564941406,36.83514022827171 ], [ 28.426805496215934,36.835693359375284 ], [ 28.398195266723746,36.78458404541027 ], [ 28.31125068664545,36.81708145141613 ], [ 28.301527023315487,36.803749084472884 ], [ 28.314029693603516,36.794860839843864 ], [ 28.2859725952153,36.79042053222679 ], [ 28.26569366455118,36.81402587890625 ], [ 28.31263732910162,36.81791687011747 ], [ 28.315416336059684,36.826805114746094 ], [ 28.277639389038086,36.85235977172863 ], [ 28.25930786132824,36.84625244140642 ], [ 28.232915878296012,36.80430984497082 ], [ 28.256526947021598,36.791805267333984 ], [ 28.249027252197322,36.7726402282716 ], [ 28.26791572570812,36.765972137451286 ], [ 28.269304275513036,36.74708175659191 ], [ 28.291805267334098,36.74902725219721 ], [ 28.303472518921353,36.730140686035384 ], [ 28.28819465637224,36.71986007690447 ], [ 28.26152992248535,36.7329177856447 ], [ 28.225694656372298,36.70236206054699 ], [ 28.224306106567383,36.68819427490257 ], [ 28.163749694824332,36.684307098388956 ], [ 28.106250762939396,36.59208297729492 ], [ 28.088752746582486,36.58208465576189 ], [ 28.06624984741211,36.59513854980497 ], [ 28.02541732788086,36.56097412109398 ], [ 28.01097106933605,36.57624816894537 ], [ 28.01791572570835,36.56458282470726 ], [ 27.97874832153326,36.55374908447294 ], [ 27.965137481689624,36.57986068725603 ], [ 27.97874832153326,36.58625030517595 ], [ 27.956249237060604,36.6012496948245 ], [ 28.062362670898835,36.604862213134766 ], [ 28.095138549804688,36.6462516784668 ], [ 28.07208251953125,36.660415649414176 ], [ 28.072917938232422,36.65847396850603 ], [ 28.0665283203125,36.64208221435558 ], [ 28.057083129883267,36.63541793823265 ], [ 28.068195343017805,36.65569305419922 ], [ 28.052639007568473,36.657638549804915 ], [ 28.072359085083065,36.67541503906273 ], [ 28.05041694641119,36.67319488525402 ], [ 28.04125022888195,36.69291687011719 ], [ 28.04041671752941,36.67402648925781 ], [ 28.02402687072771,36.66791534423845 ], [ 27.963472366333065,36.684307098388956 ], [ 28.001527786254883,36.704303741455305 ], [ 28.042360305786133,36.70375061035156 ], [ 28.061250686645508,36.72319412231468 ], [ 28.097919464111328,36.72680664062494 ], [ 28.085418701171875,36.71763992309576 ], [ 28.099029541015682,36.70513916015648 ], [ 28.112640380859318,36.72819519042969 ], [ 28.1293048858646,36.72569274902344 ], [ 28.0845832824711,36.7434730529788 ], [ 28.112361907958928,36.774581909179915 ], [ 28.128469467163086,36.754306793213175 ], [ 28.133472442627408,36.757083892822436 ], [ 28.120138168335018,36.803199768066634 ], [ 28.08208274841303,36.79624938964861 ], [ 28.078750610351562,36.775138854980696 ], [ 28.05125045776373,36.759582519531364 ], [ 28.046247482299975,36.78486251831083 ], [ 28.014303207397518,36.75847244262718 ], [ 27.95597267150879,36.76097106933594 ], [ 27.930416107178075,36.742084503173885 ], [ 27.91986083984375,36.754581451416016 ], [ 27.89458274841303,36.756805419921875 ], [ 27.89902877807623,36.74242782592796 ], [ 27.89069366455078,36.74097061157238 ], [ 27.877639770507926,36.75791549682623 ], [ 27.858472824096737,36.74124908447294 ], [ 27.816249847412166,36.7631950378418 ], [ 27.730693817138615,36.7631950378418 ], [ 27.686527252197664,36.7254180908206 ], [ 27.696250915527457,36.71097183227562 ], [ 27.675970077514762,36.70041656494146 ], [ 27.678749084472827,36.657638549804915 ], [ 27.573474884033658,36.68486022949236 ], [ 27.56125068664562,36.672359466552905 ], [ 27.51402854919462,36.67736053466808 ], [ 27.47708129882824,36.64708328247093 ], [ 27.46847152709961,36.66152954101574 ], [ 27.404861450195312,36.66236114501953 ], [ 27.40236091613781,36.680416107177734 ], [ 27.36291885376005,36.6845817565918 ], [ 27.373195648193416,36.689582824707145 ], [ 27.36291885376005,36.709861755371094 ], [ 27.398193359375,36.70041656494146 ], [ 27.42124938964878,36.713470458984546 ], [ 27.428195953369084,36.748470306396655 ], [ 27.447916030883846,36.7448616027832 ], [ 27.464305877685547,36.76235961914085 ], [ 27.479585647583463,36.74986267089872 ], [ 27.609861373901367,36.76402664184576 ], [ 27.640415191650447,36.8109703063966 ], [ 27.69680786132824,36.78513717651367 ], [ 27.771804809570256,36.78847122192394 ], [ 27.827083587646484,36.81347274780302 ], [ 28.03291893005371,36.78763961791998 ], [ 28.06041717529297,36.800971984863395 ], [ 28.065139770507926,36.82097244262695 ], [ 28.055973052978914,36.8337516784668 ], [ 28.002361297607422,36.83514022827171 ], [ 28.029861450195256,36.83708572387724 ], [ 28.031248092651424,36.839027404785384 ], [ 28.00013923645031,36.853473663330135 ], [ 28.05903053283697,36.87874984741211 ], [ 28.04041671752941,36.88430404663103 ], [ 28.05041694641119,36.897083282470874 ], [ 28.014303207397518,36.9056930541995 ], [ 28.043750762939453,36.910137176513956 ], [ 28.020694732666414,36.92569351196306 ], [ 28.099582672119084,36.94041824340826 ], [ 28.13903045654297,36.93458175659191 ], [ 28.145971298217717,36.91875076293957 ], [ 28.159027099609375,36.926532745361385 ], [ 28.159582138061523,36.90791702270525 ], [ 28.16791725158697,36.906806945801065 ], [ 28.17069435119663,36.93958282470726 ], [ 28.158193588257177,36.94541549682623 ], [ 28.20569419860874,36.95208358764654 ], [ 28.200971603393555,36.96930694580101 ], [ 28.21597290039108,36.977359771728516 ], [ 28.197082519531705,36.982360839843864 ], [ 28.215139389038143,36.98513793945335 ], [ 28.21569442749052,36.99874877929699 ], [ 28.250694274902628,36.98986053466797 ], [ 28.2451362609865,37.003192901611555 ], [ 28.268194198608683,37.01652908325218 ], [ 28.330415725708065,37.032360076904524 ], [ 28.322914123535384,37.05152893066429 ], [ 28.163749694824332,37.02847290039068 ], [ 28.10097312927263,37.03458404541021 ], [ 28.115694046020792,37.01541519165045 ], [ 28.0998592376709,37.01180648803722 ], [ 28.08764076232916,37.02875137329124 ], [ 27.97819519043003,37.03180694580095 ], [ 27.94597244262701,37.0159721374514 ], [ 27.92569351196289,37.03097152709961 ], [ 27.843748092651595,37.018470764160156 ], [ 27.79958343505865,36.99486160278349 ], [ 27.786804199218807,37.005973815918026 ], [ 27.781251907348633,36.99236297607422 ], [ 27.685140609741325,37.003471374511946 ], [ 27.64736175537115,36.997917175293196 ], [ 27.636249542236442,36.97763824462908 ], [ 27.574026107788086,36.993751525879134 ], [ 27.564582824707088,36.97458267211937 ], [ 27.518472671508846,36.99514007568371 ], [ 27.48291778564493,36.98625183105486 ], [ 27.424303054809684,37.035694122314396 ], [ 27.41263961792015,37.01680374145519 ], [ 27.395971298217887,37.029304504394474 ], [ 27.37624931335489,36.99874877929699 ], [ 27.382638931274812,37.026527404785384 ], [ 27.330974578857422,37.014583587646484 ], [ 27.340415954589844,36.99847412109375 ], [ 27.300416946411133,36.9726371765139 ], [ 27.30402755737299,36.95735931396496 ], [ 27.263471603393725,36.96402740478544 ], [ 27.25013923645065,37.03125 ], [ 27.22541427612316,37.058471679687784 ], [ 27.238750457763956,37.08319473266596 ], [ 27.293472290039062,37.110973358154354 ], [ 27.254583358764705,37.11152648925798 ], [ 27.25513839721725,37.13097381591791 ], [ 27.264028549194677,37.120140075683594 ], [ 27.273471832275504,37.140693664550724 ], [ 27.311527252197266,37.11541748046881 ], [ 27.32319450378418,37.159305572509936 ], [ 27.343193054199332,37.150138854980696 ], [ 27.34513854980503,37.13041687011736 ], [ 27.364860534668196,37.15708160400419 ], [ 27.390417098999478,37.14485931396496 ], [ 27.376529693603686,37.13402938842796 ], [ 27.386526107788086,37.120418548583984 ], [ 27.43041610717779,37.128471374512 ], [ 27.470972061157283,37.08069610595726 ], [ 27.537361145019645,37.12874984741222 ], [ 27.581527709961335,37.13680648803728 ], [ 27.57513618469244,37.13930511474638 ], [ 27.557081222534237,37.13347244262701 ], [ 27.549861907959098,37.13569259643572 ], [ 27.56097221374523,37.15458297729492 ], [ 27.541528701782454,37.15402603149437 ], [ 27.546527862549226,37.18430709838867 ], [ 27.526250839233512,37.194026947021655 ], [ 27.5548610687257,37.1929168701173 ], [ 27.570692062378043,37.211528778076286 ], [ 27.593471527099666,37.19347381591825 ], [ 27.574583053588867,37.179027557373104 ], [ 27.599861145019588,37.196250915527514 ], [ 27.610137939453523,37.18708419799833 ], [ 27.615137100220124,37.18847274780268 ], [ 27.57541847229021,37.21402740478521 ], [ 27.612916946411588,37.27986145019537 ], [ 27.556804656982422,37.27763748168951 ], [ 27.540971755981502,37.2540283203125 ], [ 27.552360534668026,37.24486160278326 ], [ 27.53486061096197,37.25152587890642 ], [ 27.52680587768549,37.22847366333036 ], [ 27.51069450378418,37.22763824462902 ], [ 27.498750686645508,37.237361907958984 ], [ 27.522361755371094,37.25041580200224 ], [ 27.518472671508846,37.27680587768572 ], [ 27.45430755615274,37.255416870117244 ], [ 27.497360229492358,37.31597137451183 ], [ 27.47791671752975,37.34430694580101 ], [ 27.470693588256893,37.3193054199221 ], [ 27.443195343017635,37.302360534668196 ], [ 27.411804199218807,37.3048629760745 ], [ 27.385414123535156,37.328193664550724 ], [ 27.383192062378043,37.3570823669433 ], [ 27.413473129272518,37.383750915527344 ], [ 27.432638168335302,37.381248474121094 ], [ 27.416358947754134,37.42242813110374 ], [ 27.444992065429744,37.505565643310604 ], [ 27.488868713378963,37.56693649291992 ], [ 27.516687393188477,37.57382965087902 ], [ 27.698598861694563,37.49717712402338 ], [ 27.884967803955192,37.45704269409197 ], [ 28.14990234375,37.47454833984375 ], [ 28.220544815063704,37.562210083007926 ], [ 28.294479370117188,37.586898803710994 ], [ 28.478357315063647,37.4941978454591 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-49", "NAME_1": "Muş" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 42.72718811035173,39.16370010375988 ], [ 42.76899337768549,38.94040298461914 ], [ 42.68435287475603,38.926906585693416 ], [ 42.56119918823248,38.94335556030279 ], [ 42.4895858764649,38.9266815185548 ], [ 42.328445434570426,38.93886566162132 ], [ 42.13997268676758,38.87031555175781 ], [ 42.139369964599894,38.824989318847884 ], [ 42.023853302002124,38.8231315612793 ], [ 41.9985084533692,38.81031799316412 ], [ 42.00059890747076,38.785957336426065 ], [ 42.054039001464844,38.728683471679744 ], [ 42.056205749511776,38.69475173950195 ], [ 41.940517425537166,38.61808013916027 ], [ 41.863296508789006,38.590469360351506 ], [ 41.632709503173885,38.60134506225609 ], [ 41.57016754150408,38.58500671386719 ], [ 41.52218246459961,38.541912078857706 ], [ 41.40530395507841,38.52570343017584 ], [ 41.381370544433594,38.54735183715826 ], [ 41.394565582275334,38.60486221313488 ], [ 41.377975463867244,38.63625335693354 ], [ 41.279525756835994,38.705539703369254 ], [ 41.15648269653349,38.89936828613304 ], [ 41.161922454834155,38.920677185058594 ], [ 41.274494171142635,39.02955627441406 ], [ 41.274139404297046,39.11057281494152 ], [ 41.23756408691412,39.15412902832031 ], [ 41.204399108886776,39.16355514526367 ], [ 41.171733856201286,39.28934097290062 ], [ 41.19566345214855,39.34185791015631 ], [ 41.255546569824276,39.369392395019645 ], [ 41.386318206787394,39.383571624755916 ], [ 41.44354248046892,39.366619110107536 ], [ 41.53429412841797,39.32184219360346 ], [ 41.66228103637701,39.20041656494152 ], [ 41.71326828002958,39.17493057250988 ], [ 41.82796478271513,39.161075592041016 ], [ 42.074256896972656,39.222366333007926 ], [ 42.218486785888786,39.32173919677746 ], [ 42.22022247314453,39.34602355957048 ], [ 42.19287490844732,39.381523132324276 ], [ 42.227268218994425,39.41969680786127 ], [ 42.32644271850597,39.459419250488395 ], [ 42.463413238525675,39.48609924316412 ], [ 42.51290893554716,39.37992477417015 ], [ 42.62761688232439,39.27266311645508 ], [ 42.6687965393067,39.25415039062523 ], [ 42.72718811035173,39.16370010375988 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-50", "NAME_1": "Nevşehir" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 34.856098175048885,39.36425018310558 ], [ 34.92192459106457,39.33542633056652 ], [ 34.89593505859369,39.227462768554744 ], [ 34.99610900878923,39.140846252441634 ], [ 35.002208709716854,39.09674072265625 ], [ 35.037403106689624,39.03805160522461 ], [ 35.00083923339838,39.010292053222656 ], [ 34.95324707031256,38.798259735107706 ], [ 35.068992614746264,38.74825668334972 ], [ 35.070098876953125,38.613536834716854 ], [ 35.018016815185604,38.565429687500114 ], [ 34.92493057250982,38.53613662719732 ], [ 34.906982421875284,38.490486145019645 ], [ 34.91961669921892,38.398212432861555 ], [ 34.87619018554693,38.364654541015625 ], [ 34.79171752929693,38.35210037231457 ], [ 34.670738220215014,38.408721923828125 ], [ 34.53929519653326,38.37565231323242 ], [ 34.458038330078296,38.399730682373104 ], [ 34.348003387451286,38.473419189453125 ], [ 34.27626037597656,38.61580276489258 ], [ 34.219444274902514,38.65495300292969 ], [ 34.206523895263615,38.69076919555664 ], [ 34.26256942749052,38.793670654296875 ], [ 34.30298995971691,38.81587600708025 ], [ 34.314521789550895,38.8675231933596 ], [ 34.339496612549,38.88554382324213 ], [ 34.427967071533146,38.87595748901384 ], [ 34.473014831543026,38.88665008544933 ], [ 34.475379943847656,38.917903900146484 ], [ 34.5208091735841,38.990596771240234 ], [ 34.57684707641607,39.03011703491234 ], [ 34.56758117675787,39.0790634155274 ], [ 34.636188507080135,39.097076416015625 ], [ 34.62529754638672,39.173606872558594 ], [ 34.69286346435564,39.22026062011747 ], [ 34.686729431152514,39.26987457275385 ], [ 34.754566192627124,39.35155868530285 ], [ 34.72655868530279,39.36091613769531 ], [ 34.66175842285173,39.31775283813499 ], [ 34.60924911499029,39.327224731445426 ], [ 34.61058425903326,39.380512237549055 ], [ 34.65660095214861,39.486606597900504 ], [ 34.79120254516607,39.4306373596192 ], [ 34.7947616577149,39.38988113403332 ], [ 34.856098175048885,39.36425018310558 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-51", "NAME_1": "Niğde" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 34.52778244018572,38.37610244750999 ], [ 34.670738220215014,38.408721923828125 ], [ 34.785182952881144,38.35391235351574 ], [ 34.82062530517595,38.35119628906273 ], [ 34.90371322631853,38.37690734863281 ], [ 34.92252349853521,38.43228149414068 ], [ 34.98105621337908,38.429912567138786 ], [ 35.06126403808622,38.28385162353521 ], [ 35.12228393554699,38.25902938842785 ], [ 35.24277496337896,38.25186920166027 ], [ 35.27957916259771,38.22149658203148 ], [ 35.312156677246264,38.16281127929699 ], [ 35.31087112426786,38.03140640258795 ], [ 35.26578140258795,37.959201812744254 ], [ 35.23033142089861,37.94804000854492 ], [ 35.20941543579096,37.91901397705084 ], [ 35.218376159668026,37.84157562255865 ], [ 35.19812774658203,37.81408691406273 ], [ 35.04302597045904,37.7019309997558 ], [ 34.87720870971697,37.710834503173885 ], [ 34.834575653076456,37.69160461425781 ], [ 34.81658554077154,37.65838241577154 ], [ 34.85847854614258,37.57877349853527 ], [ 34.860763549804744,37.525032043456974 ], [ 34.78827667236334,37.465160369873104 ], [ 34.78332519531256,37.39600372314476 ], [ 34.69614410400396,37.393993377685774 ], [ 34.591953277588004,37.350292205810604 ], [ 34.50988006591825,37.34932327270508 ], [ 34.469276428222656,37.40861129760742 ], [ 34.414676666259936,37.449813842773494 ], [ 34.384258270263956,37.45400238037115 ], [ 34.38123703002924,37.50630950927746 ], [ 34.45323562622076,37.6476287841798 ], [ 34.453449249267635,37.69588470458996 ], [ 34.266948699951456,37.914951324463004 ], [ 34.12569427490246,38.01376342773443 ], [ 34.14690780639654,38.05195236206055 ], [ 34.18675994873075,38.070056915283146 ], [ 34.26839065551758,38.05600738525402 ], [ 34.32982254028326,38.13497161865246 ], [ 34.393146514892635,38.16622543334961 ], [ 34.39450073242182,38.24264526367193 ], [ 34.36320114135748,38.2909202575683 ], [ 34.36829757690447,38.36765289306652 ], [ 34.394397735595646,38.43891906738287 ], [ 34.52778244018572,38.37610244750999 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-52", "NAME_1": "Ordu" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 37.171527862549,41.148193359375114 ], [ 37.29291534423828,41.145694732666016 ], [ 37.293472290039006,41.12402725219732 ], [ 37.38791656494158,41.107360839843864 ], [ 37.536529541015796,41.02097320556652 ], [ 37.60902786254911,41.048202514648665 ], [ 37.682640075683594,41.136806488037166 ], [ 37.704582214355526,41.114028930664176 ], [ 37.786251068115234,41.11708450317383 ], [ 37.776805877685604,41.06208419799816 ], [ 37.80819320678711,41.025699615478516 ], [ 37.8656959533692,41.01569366455078 ], [ 37.87819290161133,40.987361907958984 ], [ 38.12208175659208,40.957359313964844 ], [ 38.00863647460943,40.748332977295206 ], [ 38.11658096313505,40.6118354797365 ], [ 38.15565490722673,40.50869369506859 ], [ 38.02550125122076,40.41411972045904 ], [ 37.90161514282255,40.395137786865234 ], [ 37.82976531982433,40.34440231323242 ], [ 37.750797271728686,40.3297233581543 ], [ 37.707328796387,40.35209655761713 ], [ 37.60409545898443,40.555461883545036 ], [ 37.466255187988565,40.563144683837834 ], [ 37.34712219238298,40.627052307129134 ], [ 37.31242370605469,40.627868652343864 ], [ 37.29387283325201,40.66733932495134 ], [ 37.18733215332037,40.704162597656364 ], [ 37.078315734863565,40.68880844116222 ], [ 36.97516632080095,40.70256423950207 ], [ 36.9319686889649,40.73946380615263 ], [ 36.851066589355526,40.75009155273443 ], [ 36.688777923584155,40.81615447998041 ], [ 36.69670104980486,40.84641647338867 ], [ 36.82196426391607,40.87958145141596 ], [ 36.904468536376896,40.924163818359546 ], [ 36.996006011963175,41.04626083374052 ], [ 37.15253448486328,41.11470413208019 ], [ 37.15065002441423,41.14789581298845 ], [ 37.171527862549,41.148193359375114 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-80", "NAME_1": "Osmaniye" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 36.327865600585994,37.348400115966854 ], [ 36.48894882202154,37.368858337402344 ], [ 36.582782745361385,37.40520477294933 ], [ 36.65103912353544,37.32998657226568 ], [ 36.728641510009936,37.27605056762695 ], [ 36.532501220703296,37.10746383667009 ], [ 36.442592620849666,36.95328521728521 ], [ 36.34716796875006,36.95531463623047 ], [ 36.254726409912166,37.008663177490405 ], [ 36.04160690307617,37.025554656982536 ], [ 36.059387207031534,37.12387084960949 ], [ 36.000972747802734,37.17415237426786 ], [ 35.87482452392595,37.121696472168026 ], [ 35.85282516479492,37.12870788574219 ], [ 35.904296875000114,37.20827102661144 ], [ 35.881771087646484,37.241584777832145 ], [ 35.884262084960994,37.359619140625114 ], [ 36.023311614990405,37.562290191650504 ], [ 36.15035247802746,37.635444641113565 ], [ 36.302368164062614,37.651248931884936 ], [ 36.2121200561524,37.50016021728521 ], [ 36.24630355834978,37.37089157104498 ], [ 36.327865600585994,37.348400115966854 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-53", "NAME_1": "Rize" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 41.219917297363565,41.29500198364252 ], [ 41.24785232543974,41.25560760498041 ], [ 41.25561904907232,41.208522796630916 ], [ 41.3067703247072,41.155185699462834 ], [ 41.36881256103521,41.11997222900402 ], [ 41.40925979614258,41.11717605590832 ], [ 41.42398071289074,41.093452453613395 ], [ 41.41150665283203,41.06899642944336 ], [ 41.34373474121088,41.03704833984375 ], [ 41.12230682373047,40.80845260620117 ], [ 41.046794891357536,40.76273727416998 ], [ 40.82793426513683,40.65369033813488 ], [ 40.48347854614275,40.535343170166016 ], [ 40.47890853881836,40.628585815429915 ], [ 40.51181793212896,40.69040298461914 ], [ 40.5118942260745,40.741134643554744 ], [ 40.46595764160185,40.871932983398494 ], [ 40.421428680419865,40.94190979003906 ], [ 40.33486175537115,40.99541473388683 ], [ 40.3884735107423,41.02652740478527 ], [ 40.497917175293026,41.04124832153326 ], [ 40.5484733581543,41.028472900390625 ], [ 40.720973968505916,41.08763885498047 ], [ 40.8031959533692,41.16263961791992 ], [ 40.99763870239252,41.19458389282249 ], [ 41.06735992431635,41.22013854980463 ], [ 41.1529159545899,41.2826385498048 ], [ 41.219917297363565,41.29500198364252 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-54", "NAME_1": "Sakarya" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 30.36929130554205,41.17901229858427 ], [ 30.65263748168951,41.1290283203125 ], [ 30.755695343017692,41.08625030517578 ], [ 30.97593688964872,41.072639465332145 ], [ 31.036275863647518,41.016273498535156 ], [ 31.00865745544445,40.961486816406364 ], [ 30.906887054443416,40.897171020507926 ], [ 30.873615264892862,40.83534622192383 ], [ 30.89267539978033,40.77858734130854 ], [ 30.987047195434855,40.719253540039176 ], [ 30.949708938598803,40.669773101806584 ], [ 30.944461822509822,40.56676101684582 ], [ 30.9108257293704,40.5385627746582 ], [ 30.84126853942871,40.52185058593744 ], [ 30.676174163818644,40.51831817626959 ], [ 30.59339523315458,40.44031524658226 ], [ 30.6464271545413,40.38548660278343 ], [ 30.62383460998541,40.335178375244254 ], [ 30.378683090210245,40.402488708496094 ], [ 30.12273216247587,40.37049865722662 ], [ 29.97472190856962,40.471775054931754 ], [ 29.928827285766886,40.558509826660156 ], [ 29.92487716674833,40.577526092529354 ], [ 30.026767730712834,40.579669952392635 ], [ 30.24206924438505,40.6360816955567 ], [ 30.2994384765625,40.75570297241234 ], [ 30.290256500244197,40.82116317749035 ], [ 30.376861572265568,40.86356735229492 ], [ 30.36289978027372,40.95032501220726 ], [ 30.288484573364315,41.02032470703148 ], [ 30.320560455322266,41.10097122192411 ], [ 30.375438690185547,41.1376838684082 ], [ 30.36929130554205,41.17901229858427 ] ] ], [ [ [ 30.36929130554205,41.17901229858427 ], [ 30.368911743164062,41.17930603027355 ], [ 30.369304656982706,41.17930603027355 ], [ 30.36929130554205,41.17901229858427 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-55", "NAME_1": "Samsun" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 37.032897949219034,41.19848632812523 ], [ 37.03131103515631,41.198730468750114 ], [ 37.03131103515631,41.19927978515631 ], [ 37.0333251953125,41.199096679687784 ], [ 37.032897949219034,41.19848632812523 ] ] ], [ [ [ 37.02709960937506,41.20068359374994 ], [ 37.02990722656267,41.200073242187614 ], [ 37.03070068359392,41.19927978515631 ], [ 37.02911376953119,41.198913574219034 ], [ 37.02709960937506,41.20068359374994 ] ] ], [ [ [ 36.65551757812517,41.37872314453131 ], [ 36.65991210937517,41.380493164062784 ], [ 36.66131591796881,41.37512207031273 ], [ 36.65832519531244,41.37512207031273 ], [ 36.65551757812517,41.37872314453131 ] ] ], [ [ [ 36.65551757812517,41.37872314453131 ], [ 36.657897949219034,41.36511230468767 ], [ 36.66168212890631,41.36492919921875 ], [ 36.66271972656244,41.376892089843864 ], [ 36.66070556640631,41.381286621094034 ], [ 36.86132812500017,41.34112548828125 ], [ 36.995727539062784,41.28411865234381 ], [ 37.023925781250284,41.257080078125284 ], [ 37.017272949219034,41.21368408203125 ], [ 37.031921386718864,41.187500000000284 ], [ 37.15065002441423,41.14789581298845 ], [ 37.15253448486328,41.11470413208036 ], [ 37.000690460205135,41.05016326904308 ], [ 36.904468536376896,40.924163818359546 ], [ 36.82196426391607,40.87958145141596 ], [ 36.69670104980486,40.84641647338867 ], [ 36.69994354248064,40.880859375 ], [ 36.657619476318644,40.898769378662166 ], [ 36.453960418701115,40.8676567077639 ], [ 36.37617874145525,40.90769958496105 ], [ 36.372375488281534,40.952079772949276 ], [ 36.23618698120134,40.981094360351676 ], [ 36.20392608642584,40.98003387451172 ], [ 36.18646621704107,40.91199111938488 ], [ 36.16328430175787,40.89022445678722 ], [ 36.04716110229509,40.84297561645508 ], [ 35.955291748046875,40.87558364868164 ], [ 35.840560913085994,40.86432647705101 ], [ 35.69504547119146,40.87898635864286 ], [ 35.643894195556925,40.92682647705078 ], [ 35.47882080078119,41.01443862915039 ], [ 35.093154907226506,41.09054183959961 ], [ 34.98682022094721,41.07823944091797 ], [ 34.96025466918957,41.113548278808594 ], [ 34.94060516357439,41.20204162597656 ], [ 34.892101287841854,41.253662109375114 ], [ 34.93707275390631,41.307632446289176 ], [ 35.112976074219034,41.37586212158209 ], [ 35.23078155517584,41.26348114013689 ], [ 35.33028793334972,41.249080657959155 ], [ 35.3814315795899,41.26378631591808 ], [ 35.42044830322294,41.29426193237305 ], [ 35.45225524902355,41.357505798339844 ], [ 35.41756439209013,41.469825744628906 ], [ 35.485122680664006,41.586826324462834 ], [ 35.498935699463175,41.6419563293457 ], [ 35.56549072265631,41.63128662109381 ], [ 35.653686523437784,41.640686035156534 ], [ 35.95367431640631,41.735290527344034 ], [ 36.05609130859381,41.6875 ], [ 36.11511230468744,41.62567138671875 ], [ 36.132080078125284,41.46130371093756 ], [ 36.241516113281364,41.353515625 ], [ 36.35571289062506,41.310485839843864 ], [ 36.341308593750284,41.3118896484375 ], [ 36.3375244140625,41.294128417968864 ], [ 36.381896972656364,41.27270507812506 ], [ 36.386474609375114,41.25512695312506 ], [ 36.439880371093864,41.244506835937614 ], [ 36.51470947265619,41.25952148437523 ], [ 36.567504882812784,41.28790283203125 ], [ 36.620727539062784,41.36749267578148 ], [ 36.65551757812517,41.37872314453131 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-63", "NAME_1": "Şanlıurfa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 39.26585769653326,37.998172760009766 ], [ 39.44062423706066,37.9846305847168 ], [ 39.66156768798834,37.84016799926769 ], [ 39.76156616210966,37.83341598510742 ], [ 39.85432052612316,37.7578582763673 ], [ 39.86167144775402,37.60364151000982 ], [ 39.88358306884771,37.52904891967796 ], [ 40.11487960815458,37.130916595458984 ], [ 40.134674072265625,37.01825714111328 ], [ 40.1816139221192,36.94679260253912 ], [ 40.25516510009794,36.916130065918026 ], [ 39.84182739257824,36.75532150268549 ], [ 39.22734832763672,36.664997100830135 ], [ 39.020233154297046,36.703311920166016 ], [ 38.73147201538097,36.70748519897461 ], [ 38.56340026855469,36.83882522583019 ], [ 38.39853668212902,36.89716339111328 ], [ 38.1943435668947,36.90692138671875 ], [ 38.010631561279354,36.825210571289176 ], [ 38.01078796386747,36.936237335205305 ], [ 37.880939483642635,37.057415008545036 ], [ 37.834709167480526,37.19113159179693 ], [ 37.83034515380871,37.24394226074219 ], [ 37.84837341308611,37.312484741210994 ], [ 37.93680572509794,37.40411758422874 ], [ 38.00278091430681,37.44073867797874 ], [ 38.16900634765642,37.407279968261776 ], [ 38.330547332763786,37.48437881469732 ], [ 38.47832489013666,37.48891067504883 ], [ 38.615886688232536,37.57777023315424 ], [ 38.82369232177746,37.639743804931754 ], [ 38.83985519409174,37.658622741699276 ], [ 38.83071136474615,37.69311904907238 ], [ 38.95743942260748,37.7553596496582 ], [ 38.97814941406256,37.795402526855696 ], [ 38.97775268554693,37.890113830566406 ], [ 39.05976867675787,37.98223876953125 ], [ 39.17874908447283,38.030654907226676 ], [ 39.26585769653326,37.998172760009766 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-56", "NAME_1": "Siirt" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 42.39585113525408,38.132087707519645 ], [ 42.49808883666998,38.109996795654354 ], [ 42.72762680053711,38.01245117187523 ], [ 42.8357009887697,38.06550598144537 ], [ 42.9546012878418,38.05150604248064 ], [ 42.98358917236334,38.02978134155285 ], [ 43.03906250000006,37.9368133544923 ], [ 42.98860931396513,37.854892730713004 ], [ 42.98530578613287,37.80927276611345 ], [ 42.76489257812494,37.8343200683596 ], [ 42.680290222168026,37.877780914306754 ], [ 42.60340881347656,37.878520965576286 ], [ 42.493461608887,37.83566284179693 ], [ 42.41053771972673,37.74816131591808 ], [ 42.326351165771655,37.69716262817377 ], [ 42.15908813476591,37.68182373046875 ], [ 41.968589782714844,37.69533538818388 ], [ 41.888881683349666,37.72859573364269 ], [ 41.856918334960994,37.763187408447266 ], [ 41.754611968994254,37.74295043945335 ], [ 41.70092010498058,37.77768707275396 ], [ 41.73792648315447,37.8255729675293 ], [ 41.73163986206072,37.85505676269531 ], [ 41.51866149902361,37.85847473144531 ], [ 41.45145416259794,37.88371658325195 ], [ 41.41131591796875,37.918457031250114 ], [ 41.432540893554744,37.95641326904308 ], [ 41.480823516845874,37.986244201660156 ], [ 41.48127746582048,38.02124786376959 ], [ 41.60668945312506,38.038478851318416 ], [ 41.6461448669433,38.102352142333984 ], [ 41.67486572265625,38.19519042968773 ], [ 41.91657638549833,38.148315429687614 ], [ 41.97900390625006,38.15625381469738 ], [ 42.025947570801065,38.12945938110357 ], [ 42.095233917236385,38.20076751708996 ], [ 42.20790863037138,38.21693801879883 ], [ 42.26993179321295,38.20078659057623 ], [ 42.39585113525408,38.132087707519645 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-57", "NAME_1": "Sinop" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 34.945415496826456,42.09791564941406 ], [ 35.01625061035185,42.09319305419922 ], [ 35.05180740356457,42.059860229492415 ], [ 35.04375076293951,42.04180526733404 ], [ 35.077640533447436,42.02680587768566 ], [ 35.19319534301752,42.040138244628906 ], [ 35.206527709960994,42.01263809204124 ], [ 35.14097213745134,42.02347183227539 ], [ 35.09569549560564,41.96569442749029 ], [ 35.09013748168951,41.92180633544933 ], [ 35.12958145141607,41.85874938964844 ], [ 35.20735931396496,41.80263900756859 ], [ 35.19347381591825,41.79208374023443 ], [ 35.20819473266607,41.76736068725609 ], [ 35.264862060547046,41.73819351196295 ], [ 35.27597045898443,41.71597290039068 ], [ 35.414306640625114,41.68375015258789 ], [ 35.498935699463175,41.6419563293457 ], [ 35.485122680664006,41.586826324462834 ], [ 35.41756439209013,41.469825744628906 ], [ 35.4532356262207,41.362899780273665 ], [ 35.40052795410162,41.27267456054693 ], [ 35.33028793334972,41.249080657959155 ], [ 35.23078155517584,41.26348114013689 ], [ 35.112976074219034,41.37586212158209 ], [ 34.93707275390631,41.307632446289176 ], [ 34.8448562622072,41.19581222534174 ], [ 34.521492004394815,41.27654266357433 ], [ 34.47560119628923,41.30388641357422 ], [ 34.46514892578131,41.540878295898494 ], [ 34.56705856323259,41.59246063232422 ], [ 34.59622573852556,41.63491439819336 ], [ 34.59929656982433,41.668979644775504 ], [ 34.4930953979495,41.72483825683594 ], [ 34.269077301025675,41.739074707031364 ], [ 34.26716613769537,41.805038452148665 ], [ 34.225559234619425,41.87401580810547 ], [ 34.22653198242193,41.95513916015648 ], [ 34.30986022949236,41.94097137451189 ], [ 34.490695953369425,41.976806640625 ], [ 34.50791549682634,41.958194732666016 ], [ 34.61791610717802,41.94208145141624 ], [ 34.79819488525396,41.954582214355526 ], [ 34.90763854980469,42.02402877807617 ], [ 34.94902801513672,42.07374954223661 ], [ 34.945415496826456,42.09791564941406 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-73", "NAME_1": "Şırnak" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 42.772178649902514,37.83314132690458 ], [ 42.98530578613287,37.80927276611345 ], [ 43.0542106628418,37.7635955810548 ], [ 43.15652084350597,37.761554718017805 ], [ 43.317729949951456,37.727920532226676 ], [ 43.49570465087896,37.72740173339838 ], [ 43.436573028564396,37.52254486083979 ], [ 43.4347877502442,37.349205017089844 ], [ 43.5009841918947,37.26836013793957 ], [ 43.3700408935548,37.328636169433594 ], [ 43.325466156005916,37.30364227294922 ], [ 43.16740417480486,37.37397766113281 ], [ 43.03809738159208,37.35547637939453 ], [ 42.973693847656364,37.316524505615234 ], [ 42.849826812744425,37.34685897827154 ], [ 42.83127975463873,37.37160110473633 ], [ 42.79906082153326,37.377475738525675 ], [ 42.730808258056925,37.34506225585943 ], [ 42.74326705932617,37.31804275512695 ], [ 42.69933319091814,37.30542755126959 ], [ 42.700664520263786,37.285415649414176 ], [ 42.66455459594732,37.26198577880888 ], [ 42.59164810180681,37.147251129150504 ], [ 42.53633880615246,37.14884567260742 ], [ 42.36370849609381,37.10926055908203 ], [ 42.33525466918974,37.18570327758795 ], [ 42.35742187500006,37.22752761840832 ], [ 42.294952392578296,37.28092956542969 ], [ 42.22082901000971,37.277477264404354 ], [ 42.232196807861385,37.317359924316406 ], [ 42.05733108520536,37.18888092041021 ], [ 41.8692359924317,37.13902282714844 ], [ 41.887989044189396,37.209285736083984 ], [ 41.857463836670206,37.301559448242244 ], [ 41.779117584228686,37.2880554199221 ], [ 41.75320816040039,37.301284790039176 ], [ 41.73899078369158,37.33707046508789 ], [ 41.74073028564459,37.468338012695426 ], [ 41.90201187133795,37.49835586547857 ], [ 41.94921875000006,37.52552032470726 ], [ 41.93354797363281,37.585899353027344 ], [ 41.95733642578125,37.63766860961914 ], [ 41.888881683349666,37.72859573364269 ], [ 42.02056884765631,37.68241500854498 ], [ 42.31177520751953,37.69374847412132 ], [ 42.41053771972673,37.74816131591808 ], [ 42.493461608887,37.83566284179693 ], [ 42.59617996215849,37.87704849243164 ], [ 42.680290222168026,37.877780914306754 ], [ 42.772178649902514,37.83314132690458 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-58", "NAME_1": "Sivas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 38.22033691406256,40.3379364013673 ], [ 38.24710083007824,40.20339965820318 ], [ 38.31576156616228,40.15777206420904 ], [ 38.452972412109375,40.09781646728527 ], [ 38.57074737548834,40.116062164306584 ], [ 38.77371978759777,40.04879760742199 ], [ 38.75243377685564,39.97180938720703 ], [ 38.72418212890619,39.956573486328125 ], [ 38.447406768798885,39.96938323974615 ], [ 38.41403198242216,39.944557189941406 ], [ 38.36586761474615,39.858364105224894 ], [ 38.384220123291186,39.82737731933605 ], [ 38.52223587036144,39.84823226928722 ], [ 38.554382324219034,39.826526641845646 ], [ 38.52255249023466,39.797157287597884 ], [ 38.445766448974894,39.78325271606445 ], [ 38.43944168090826,39.75685119628906 ], [ 38.413822174072266,39.746189117431754 ], [ 38.364730834960994,39.677970886230526 ], [ 38.34907150268583,39.5365562438966 ], [ 38.39641189575195,39.41117095947277 ], [ 38.389953613281364,39.18740081787115 ], [ 38.35454559326172,39.13976669311529 ], [ 38.27381896972685,39.12646484375 ], [ 38.181423187256144,39.07257843017584 ], [ 37.93951416015625,39.059078216552734 ], [ 37.780391693115234,39.001106262207315 ], [ 37.58811187744152,39.00992202758795 ], [ 37.55189514160185,38.95935440063499 ], [ 37.5527420043947,38.92592239379883 ], [ 37.596317291259936,38.836570739746264 ], [ 37.57392501831083,38.7763786315918 ], [ 37.32717132568365,38.60868072509771 ], [ 37.05988693237333,38.578189849853516 ], [ 36.99398040771513,38.61465454101574 ], [ 36.92048263549833,38.62846374511719 ], [ 36.7323379516601,38.591064453125 ], [ 36.758411407470874,38.674396514892805 ], [ 36.944854736328296,39.05715942382824 ], [ 36.91714477539091,39.10745239257818 ], [ 36.87818527221697,39.1377525329591 ], [ 36.77732849121122,39.175086975097656 ], [ 36.61505126953125,39.17627334594738 ], [ 36.45937347412138,39.1303596496582 ], [ 36.37403869628912,39.15341186523443 ], [ 36.30744171142578,39.130260467529524 ], [ 36.057857513427905,39.1307830810548 ], [ 35.96096420288103,39.18781661987305 ], [ 35.885440826416016,39.27633666992216 ], [ 35.81264877319347,39.29944610595703 ], [ 35.838054656982706,39.337776184081974 ], [ 35.97855758666998,39.42293548584007 ], [ 36.06618118286161,39.50249099731445 ], [ 36.069194793701286,39.53652572631859 ], [ 36.1566696166995,39.67705154418945 ], [ 36.12236404418951,39.69313049316406 ], [ 36.123931884765796,39.74603652954096 ], [ 36.07004928588884,39.78324508666992 ], [ 36.047111511230526,39.85269927978527 ], [ 35.965507507324276,39.89990997314453 ], [ 35.9857711791995,39.94587326049816 ], [ 36.11804580688505,39.94603347778343 ], [ 36.22705459594732,39.977584838867244 ], [ 36.30592727661161,39.95699310302757 ], [ 36.442497253418026,39.949581146240234 ], [ 36.60661315917997,39.993495941162166 ], [ 36.67920684814459,40.03599548339855 ], [ 36.7119712829591,40.0902671813966 ], [ 36.700984954834155,40.14154052734375 ], [ 36.77357864379894,40.223766326904354 ], [ 36.96790313720703,40.18217468261719 ], [ 37.07748031616211,40.22293472290039 ], [ 37.168788909912394,40.19018936157232 ], [ 37.43417358398443,40.153423309326286 ], [ 37.47169113159208,40.23818969726574 ], [ 37.56003570556646,40.276390075683594 ], [ 37.55509185791021,40.31818771362316 ], [ 37.58262252807623,40.34762954711914 ], [ 37.58802795410173,40.408416748047046 ], [ 37.6478652954101,40.45049285888683 ], [ 37.71109008789068,40.34790039062494 ], [ 37.772056579590014,40.32857894897461 ], [ 37.82976531982433,40.34440231323242 ], [ 37.90161514282255,40.395137786865234 ], [ 38.02550125122076,40.41411972045904 ], [ 38.15565490722673,40.50869369506859 ], [ 38.182529449463004,40.46619415283203 ], [ 38.22033691406256,40.3379364013673 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-59", "NAME_1": "Tekirdağ" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 28.149583816528548,41.58051681518566 ], [ 28.18263816833496,41.57180404663103 ], [ 28.199304580688647,41.54819488525385 ], [ 28.179122924804744,41.52955627441423 ], [ 28.23168945312517,41.499076843261776 ], [ 28.15378189086914,41.24697875976574 ], [ 28.087570190429744,41.211147308349666 ], [ 28.057348251342773,41.15075302124035 ], [ 28.123260498046932,41.0598602294923 ], [ 28.013750076293945,41.034305572509766 ], [ 27.985694885254134,41.012916564941634 ], [ 27.987083435058878,40.99125289917015 ], [ 27.956806182861555,40.97680664062517 ], [ 27.964307785034237,40.96569442749046 ], [ 27.87791633605974,40.96541595459007 ], [ 27.84069442749052,40.99236297607433 ], [ 27.76347160339361,41.01402664184599 ], [ 27.511249542236555,40.97430419921875 ], [ 27.46263885498064,40.89569473266624 ], [ 27.455417633056925,40.84541702270536 ], [ 27.34458541870123,40.76680374145519 ], [ 27.309305191040153,40.70236206054693 ], [ 27.178472518920955,40.62736129760748 ], [ 27.029861450195483,40.59069442749029 ], [ 27.028583526611442,40.69945907592779 ], [ 27.04261207580595,40.74805068969732 ], [ 27.020599365234432,40.79498672485374 ], [ 26.96979522705078,40.79952239990246 ], [ 26.865480422973576,40.74710464477545 ], [ 26.82361412048334,40.74297332763672 ], [ 26.783828735351562,40.74620056152344 ], [ 26.73179054260271,40.802635192871094 ], [ 26.730768203735636,40.902725219726676 ], [ 26.783018112182617,40.999576568603516 ], [ 26.74397468566889,41.03450775146496 ], [ 26.748094558715877,41.07102966308611 ], [ 26.772720336914176,41.10102081298851 ], [ 26.89196395874029,41.13861846923834 ], [ 26.937599182129134,41.18946838378906 ], [ 26.93860054016136,41.23728561401373 ], [ 26.89655685424833,41.294040679931584 ], [ 26.898347854614258,41.34303283691406 ], [ 26.95331382751459,41.325469970703296 ], [ 27.12053489685087,41.34813308715843 ], [ 27.262168884277514,41.34740066528332 ], [ 27.377403259277344,41.31006622314476 ], [ 27.472660064697436,41.22648620605469 ], [ 27.520938873291016,41.22114562988281 ], [ 27.55360603332548,41.23656463623047 ], [ 27.64314651489252,41.34899902343756 ], [ 27.673555374145565,41.40991210937494 ], [ 27.67464828491228,41.4577522277832 ], [ 27.730844497680607,41.49436187744152 ], [ 27.770309448242188,41.50877761840832 ], [ 27.86650657653837,41.50082015991211 ], [ 27.977830886840934,41.54333114624018 ], [ 28.149583816528548,41.58051681518566 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-60", "NAME_1": "Tokat" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 36.69994354248064,40.880859375 ], [ 36.68491363525396,40.826515197753906 ], [ 36.69797897338873,40.80878448486328 ], [ 36.851066589355526,40.75009155273443 ], [ 36.9319686889649,40.73946380615263 ], [ 36.97164916992199,40.703620910644474 ], [ 37.078315734863565,40.68880844116222 ], [ 37.18733215332037,40.704162597656364 ], [ 37.29387283325201,40.66733932495134 ], [ 37.31242370605469,40.627868652343864 ], [ 37.34712219238298,40.627052307129134 ], [ 37.466255187988565,40.563144683837834 ], [ 37.61163711547857,40.551143646240234 ], [ 37.6478652954101,40.45049285888683 ], [ 37.58802795410173,40.408416748047046 ], [ 37.58262252807623,40.34762954711914 ], [ 37.55509185791021,40.31818771362316 ], [ 37.56003570556646,40.276390075683594 ], [ 37.47169113159208,40.23818969726574 ], [ 37.43417358398443,40.153423309326286 ], [ 37.168788909912394,40.19018936157232 ], [ 37.07748031616211,40.22293472290039 ], [ 36.96790313720703,40.18217468261719 ], [ 36.77357864379894,40.223766326904354 ], [ 36.700984954834155,40.14154052734375 ], [ 36.71134185791044,40.08755493164057 ], [ 36.6641273498538,40.0172958374024 ], [ 36.442497253418026,39.949581146240234 ], [ 36.30592727661161,39.95699310302757 ], [ 36.22705459594732,39.977584838867244 ], [ 36.11804580688505,39.94603347778343 ], [ 35.9857711791995,39.94587326049816 ], [ 35.96333694458019,39.986537933349894 ], [ 35.961826324463175,40.043380737304744 ], [ 35.936515808105526,40.07973480224604 ], [ 35.633205413818644,40.08720397949219 ], [ 35.51206970214861,40.189777374267635 ], [ 35.529628753662394,40.235530853271484 ], [ 35.5763778686524,40.27421951293945 ], [ 35.71618652343756,40.32625579834007 ], [ 35.84466171264654,40.501518249511776 ], [ 35.95844650268555,40.50232696533209 ], [ 36.03977584838873,40.45986938476557 ], [ 36.15447616577177,40.44520568847656 ], [ 36.32520294189459,40.523677825927734 ], [ 36.45606231689459,40.65576934814453 ], [ 36.47220230102545,40.7211151123048 ], [ 36.41676330566412,40.82258224487305 ], [ 36.4480056762697,40.86983108520536 ], [ 36.49979400634794,40.86569976806652 ], [ 36.61869049072283,40.89941406250023 ], [ 36.69994354248064,40.880859375 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-61", "NAME_1": "Trabzon" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 39.419582366943416,41.107639312744254 ], [ 39.486251831054744,41.09208297729492 ], [ 39.565971374511776,41.02597045898432 ], [ 39.64041519165056,40.99986267089844 ], [ 39.71902847290045,41.0120849609375 ], [ 39.78013992309599,41.002639770507926 ], [ 39.87347412109381,40.95402908325195 ], [ 40.035137176513786,40.95958328247076 ], [ 40.12014007568388,40.9120826721192 ], [ 40.230693817138615,40.928470611572266 ], [ 40.33458328247076,40.99514007568365 ], [ 40.36624526977545,40.98522949218756 ], [ 40.417865753174,40.94629287719738 ], [ 40.46320343017584,40.876575469970874 ], [ 40.5118942260745,40.741134643554744 ], [ 40.51181793212896,40.69040298461914 ], [ 40.47890853881836,40.628585815429915 ], [ 40.48347854614275,40.535343170166016 ], [ 40.226131439208984,40.50077056884771 ], [ 40.09298324584955,40.512348175048885 ], [ 40.10813140869169,40.57054519653332 ], [ 40.040325164795206,40.638103485107365 ], [ 40.004878997802734,40.65853500366211 ], [ 39.98151016235357,40.64609527587896 ], [ 39.97420120239275,40.62319564819347 ], [ 39.99523925781244,40.5870056152346 ], [ 39.98057937622076,40.56537628173828 ], [ 39.95221710205084,40.562820434570426 ], [ 39.89093780517595,40.61500549316412 ], [ 39.8285293579101,40.62057876586914 ], [ 39.84022521972673,40.69247055053705 ], [ 39.80594635009771,40.71657562255888 ], [ 39.766292572021655,40.67451095581066 ], [ 39.72811889648443,40.581474304199446 ], [ 39.67606353759771,40.55933380126976 ], [ 39.30743789672857,40.6691055297851 ], [ 39.13891601562506,40.78902816772478 ], [ 39.1179466247558,40.853782653808764 ], [ 39.119213104248104,40.960250854492244 ], [ 39.17869949340826,41.07402801513666 ], [ 39.284305572509936,41.0498619079591 ], [ 39.419582366943416,41.107639312744254 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-62", "NAME_1": "Tunceli" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 40.271240234375,39.54582595825195 ], [ 40.54322814941406,39.54778289794922 ], [ 40.51652145385748,39.5039901733399 ], [ 40.33533477783203,39.427463531494254 ], [ 40.390830993652344,39.382858276367244 ], [ 40.33251953125,39.351543426513786 ], [ 40.20206451416021,39.28889083862305 ], [ 40.098674774170206,39.31428146362305 ], [ 40.0318336486817,39.204952239990234 ], [ 40.04388046264654,39.15027236938482 ], [ 40.029830932617244,39.115364074707145 ], [ 40.0097732543947,39.089889526367244 ], [ 39.9225807189942,39.08842849731445 ], [ 39.869342803955135,39.04762649536133 ], [ 39.89322280883795,38.99279022216797 ], [ 39.891315460205135,38.9417343139649 ], [ 39.8397102355957,38.86560821533226 ], [ 39.77879714965832,38.81803894042969 ], [ 39.63027191162115,38.80181884765625 ], [ 39.49058151245123,38.749164581299055 ], [ 39.048492431640625,38.89308929443382 ], [ 38.9420242309572,38.893768310546875 ], [ 38.84452056884794,38.871868133545036 ], [ 38.769435882568644,38.89875411987316 ], [ 38.78187942504877,38.99327850341808 ], [ 38.72687530517595,39.115749359130916 ], [ 38.77346038818365,39.182136535644474 ], [ 38.89364624023443,39.21349716186535 ], [ 38.92637634277344,39.25006484985357 ], [ 38.833896636963004,39.257617950439624 ], [ 38.79290771484375,39.27995681762701 ], [ 38.8339462280274,39.32938766479515 ], [ 38.96605682373064,39.37565994262695 ], [ 39.097686767578296,39.46172332763683 ], [ 39.32331466674816,39.499732971191406 ], [ 39.477455139160156,39.4769744873048 ], [ 39.596000671387,39.48797607421898 ], [ 39.61517333984381,39.445877075195426 ], [ 39.66516876220709,39.441463470458984 ], [ 39.69773864746111,39.45171737670927 ], [ 39.77057266235357,39.51818084716808 ], [ 39.85518646240246,39.54473114013672 ], [ 39.88587951660162,39.54994583129911 ], [ 39.986354827881144,39.51869201660179 ], [ 40.12992477416998,39.556602478027344 ], [ 40.271240234375,39.54582595825195 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-64", "NAME_1": "Uşak" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 29.89272689819353,38.77788162231445 ], [ 29.894367218017862,38.70968246459984 ], [ 29.87275886535673,38.64421844482433 ], [ 29.77183532714872,38.50595855712919 ], [ 29.755413055419922,38.45410919189453 ], [ 29.673618316650447,38.418857574463004 ], [ 29.64810752868658,38.34411239624035 ], [ 29.594125747680607,38.27232742309593 ], [ 29.57591819763178,38.19177246093756 ], [ 29.54411315917963,38.19533920288097 ], [ 29.42590332031267,38.26173400878912 ], [ 29.22126007080078,38.195537567138956 ], [ 29.096721649170036,38.2179908752442 ], [ 28.92095375061041,38.265453338623104 ], [ 28.82542800903326,38.355316162109375 ], [ 28.85549926757841,38.388626098632926 ], [ 28.8410701751709,38.52633666992199 ], [ 28.848800659179744,38.580696105957145 ], [ 28.87877845764166,38.637416839599666 ], [ 29.022827148437443,38.725307464599666 ], [ 29.090955734253157,38.739379882812614 ], [ 29.23378944397001,38.73334121704124 ], [ 29.305118560791072,38.78231811523449 ], [ 29.668746948242244,38.88996887207031 ], [ 29.862709045410213,38.855148315429744 ], [ 29.89272689819353,38.77788162231445 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-65", "NAME_1": "Van" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 43.34183883666992,39.39789199829113 ], [ 43.42657852172857,39.38888549804682 ], [ 43.48865509033209,39.330860137939624 ], [ 43.58568572998064,39.28785705566406 ], [ 43.64554214477545,39.302429199218864 ], [ 43.716354370117244,39.37020492553734 ], [ 43.96207427978521,39.35651016235363 ], [ 44.03281784057617,39.37202072143555 ], [ 44.08853530883806,39.32948303222679 ], [ 44.08794021606445,39.29744338989258 ], [ 44.1117019653322,39.286445617676065 ], [ 44.0981178283692,39.254219055175895 ], [ 44.1150856018067,39.23867416381847 ], [ 44.11330413818365,39.20209503173834 ], [ 44.218376159668026,39.138637542724666 ], [ 44.23231124877924,39.10028457641607 ], [ 44.18688583374052,39.116287231445426 ], [ 44.152053833007926,39.09199905395519 ], [ 44.20054244995123,39.06901168823248 ], [ 44.2188453674317,39.028751373291016 ], [ 44.18151473999029,38.99415969848627 ], [ 44.224102020263956,38.891876220703125 ], [ 44.25598144531256,38.855079650878906 ], [ 44.29030227661127,38.85530471801752 ], [ 44.31613159179716,38.83385848999046 ], [ 44.31856536865246,38.80030059814453 ], [ 44.27720260620117,38.71603012084972 ], [ 44.30116653442377,38.67173767089844 ], [ 44.285503387451456,38.64738845825224 ], [ 44.33678436279314,38.62283706665039 ], [ 44.32693099975586,38.5501136779788 ], [ 44.33952713012695,38.50283050537132 ], [ 44.31733322143566,38.44160842895502 ], [ 44.31766128540045,38.38542556762701 ], [ 44.38671112060541,38.363548278808764 ], [ 44.45695495605486,38.38514709472679 ], [ 44.501117706299,38.353702545166016 ], [ 44.509529113769815,38.32789230346691 ], [ 44.42692565917997,38.27817535400396 ], [ 44.40821456909197,38.25121688842785 ], [ 44.41706848144548,38.210250854492415 ], [ 44.404792785644815,38.14494705200201 ], [ 44.36408615112333,38.12714767456055 ], [ 44.37923431396513,38.097625732421875 ], [ 44.352626800537394,38.09918594360363 ], [ 44.32249832153349,38.069694519043026 ], [ 44.31347274780279,38.029933929443416 ], [ 44.25692749023443,37.95954132080078 ], [ 44.26597976684576,37.93852996826183 ], [ 44.23886108398466,37.88711547851568 ], [ 44.27629089355469,37.86631774902344 ], [ 44.33904266357422,37.87405776977545 ], [ 44.416442871094034,37.85408401489269 ], [ 44.413669586181925,37.82162857055687 ], [ 44.44305038452177,37.79836654663109 ], [ 44.47020721435558,37.797904968261776 ], [ 44.46298980712919,37.768390655517635 ], [ 44.57461929321295,37.767143249511776 ], [ 44.479644775390796,37.67538070678722 ], [ 44.42198181152372,37.646568298339844 ], [ 44.32952880859392,37.65622329711914 ], [ 44.237655639648494,37.62777709960949 ], [ 44.21875,37.64314651489269 ], [ 44.24557495117182,37.708969116210994 ], [ 44.22552108764654,37.75441741943365 ], [ 44.20137023925798,37.76893234252947 ], [ 44.0651931762697,37.71755218505865 ], [ 43.96967315673834,37.7267951965332 ], [ 43.892715454101506,37.700431823730526 ], [ 43.78456878662104,37.726203918457145 ], [ 43.67584609985357,37.715328216552734 ], [ 43.317729949951456,37.727920532226676 ], [ 43.15652084350597,37.761554718017805 ], [ 43.04656219482433,37.765319824218864 ], [ 42.98530578613287,37.80927276611345 ], [ 42.98860931396513,37.854892730713004 ], [ 43.03906250000006,37.9368133544923 ], [ 42.98358917236334,38.02978134155285 ], [ 42.9546012878418,38.05150604248064 ], [ 42.8357009887697,38.06550598144537 ], [ 42.777313232421875,38.127155303955135 ], [ 42.79895782470709,38.16839981079107 ], [ 42.75567626953131,38.175254821777344 ], [ 42.720058441162166,38.20351028442394 ], [ 42.739238739013615,38.277294158935774 ], [ 42.68788528442394,38.39511108398449 ], [ 42.69043731689459,38.42795944213873 ], [ 42.72961044311529,38.45822143554693 ], [ 42.8891716003418,38.52491760253906 ], [ 42.9462432861331,38.614349365234375 ], [ 42.964450836181754,38.61788177490246 ], [ 43.056091308593864,38.72330474853521 ], [ 43.17415237426775,38.79370498657221 ], [ 43.196823120117244,38.828151702880916 ], [ 43.197910308838004,38.8801727294923 ], [ 43.12784957885748,38.93337631225586 ], [ 43.00352096557623,38.99146652221691 ], [ 43.02248382568365,39.09549331665056 ], [ 43.144695281982536,39.13629150390631 ], [ 43.16763305664068,39.16597366333019 ], [ 43.165607452392635,39.23989868164074 ], [ 43.08466720581049,39.284191131592024 ], [ 43.07938003540056,39.30751419067394 ], [ 43.10197830200224,39.32246017456055 ], [ 43.19167327880865,39.32806777954107 ], [ 43.290340423583984,39.401798248291016 ], [ 43.34183883666992,39.39789199829113 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-77", "NAME_1": "Yalova" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 29.394861221313647,40.70208358764654 ], [ 29.442625045776538,40.69208145141596 ], [ 29.43100166320812,40.560283660888615 ], [ 29.362733840942667,40.580024719238224 ], [ 29.26760673522955,40.55602264404297 ], [ 29.045017242431754,40.559192657470874 ], [ 29.010364532470874,40.497295379638786 ], [ 29.03236198425293,40.47847366333008 ], [ 28.97513961792015,40.45569610595703 ], [ 28.883195877075252,40.47874832153343 ], [ 28.85375022888212,40.50597381591808 ], [ 28.780139923095874,40.51847076416033 ], [ 28.79319381713873,40.55236053466808 ], [ 28.931528091430835,40.6004180908206 ], [ 28.991249084472884,40.644584655761776 ], [ 29.282085418701286,40.6601371765139 ], [ 29.394861221313647,40.70208358764654 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-66", "NAME_1": "Yozgat" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 35.343200683594034,40.21666336059576 ], [ 35.38194656372076,40.19127655029308 ], [ 35.51206970214861,40.189777374267635 ], [ 35.633205413818644,40.08720397949219 ], [ 35.936515808105526,40.07973480224604 ], [ 35.961826324463175,40.043380737304744 ], [ 35.96333694458019,39.986537933349894 ], [ 35.9857711791995,39.94587326049816 ], [ 35.965507507324276,39.89990997314453 ], [ 36.047111511230526,39.85269927978527 ], [ 36.07004928588884,39.78324508666992 ], [ 36.123931884765796,39.74603652954096 ], [ 36.12236404418951,39.69313049316406 ], [ 36.1566696166995,39.67705154418945 ], [ 36.069194793701286,39.53652572631859 ], [ 36.06618118286161,39.50249099731445 ], [ 35.97855758666998,39.42293548584007 ], [ 35.838054656982706,39.337776184081974 ], [ 35.80165863037115,39.287456512451286 ], [ 35.723690032959155,39.22582626342796 ], [ 35.67081451416021,39.20149993896507 ], [ 35.55098342895536,39.202976226806754 ], [ 35.47180557250988,39.18677139282238 ], [ 35.463966369628906,39.156749725341854 ], [ 35.482967376709155,39.099575042724666 ], [ 35.2412185668947,39.00565338134777 ], [ 35.037403106689624,39.03805160522461 ], [ 35.002208709716854,39.09674072265625 ], [ 34.99610900878923,39.140846252441634 ], [ 34.89593505859369,39.227462768554744 ], [ 34.9202499389649,39.33756637573248 ], [ 34.796630859375,39.38809204101574 ], [ 34.79120254516607,39.4306373596192 ], [ 34.62562561035185,39.49412536621105 ], [ 34.53654098510759,39.54788589477539 ], [ 34.52186584472685,39.57050704956066 ], [ 34.544994354248104,39.622127532958984 ], [ 34.468528747558764,39.67209625244152 ], [ 34.42567825317377,39.73305511474615 ], [ 34.35737991333036,39.74853515625023 ], [ 34.234619140625284,39.73669052124018 ], [ 34.06889724731451,39.80836868286144 ], [ 34.05434417724615,39.90491104125988 ], [ 34.08631896972673,39.9203529357913 ], [ 34.27889251709013,39.93708801269531 ], [ 34.394672393798885,39.99183654785156 ], [ 34.80086135864252,39.993850708007926 ], [ 34.90447235107433,40.04970169067383 ], [ 35.05699539184599,40.02979278564453 ], [ 35.17874526977556,40.090763092041016 ], [ 35.16777420043957,40.2132301330567 ], [ 35.288646697998104,40.213741302490234 ], [ 35.33233642578119,40.228908538818416 ], [ 35.343200683594034,40.21666336059576 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "TR-67", "NAME_1": "Zonguldak" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 32.02097702026373,41.56291580200201 ], [ 32.0411911010745,41.523483276367244 ], [ 32.30512619018572,41.306194305420036 ], [ 32.35403823852545,41.23849105834972 ], [ 32.29877471923834,41.23664093017601 ], [ 32.13407135009794,41.15750503540039 ], [ 32.09339904785162,41.076122283935604 ], [ 32.09199523925798,41.01836776733404 ], [ 31.43902778625494,41.05629730224604 ], [ 31.338193893432674,41.1367378234865 ], [ 31.409025192261026,41.21263885498058 ], [ 31.402360916137695,41.271526336670036 ], [ 31.41736221313488,41.26319503784197 ], [ 31.420694351196346,41.27402877807617 ], [ 31.391252517700195,41.2940292358399 ], [ 31.39986038208002,41.315971374511776 ], [ 31.620138168335018,41.382637023925724 ], [ 31.74819564819353,41.43986129760765 ], [ 31.754304885864315,41.45513916015625 ], [ 31.785417556762752,41.45430374145508 ], [ 31.89430809020996,41.523750305175895 ], [ 32.02097702026373,41.56291580200201 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/venezuela.geojson b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/venezuela.geojson new file mode 100644 index 000000000000..beb432193c5f --- /dev/null +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/countries/venezuela.geojson @@ -0,0 +1,32 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "ISO": "VE-Y", "NAME_1": "Delta Amacuro" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -60.020985480999911, 8.558010158000059 ], [ -59.815594848999922, 8.287763977000026 ], [ -59.829289102999951, 8.245105083000041 ], [ -59.848461059999863, 8.227741801000107 ], [ -59.939721638999856, 8.208440654000071 ], [ -59.993310098999928, 8.168520609000026 ], [ -60.019458373999925, 8.060310161000118 ], [ -60.046485148999864, 8.032921652000084 ], [ -60.129219116999934, 8.02881337500007 ], [ -60.183091796999889, 7.982666321000124 ], [ -60.231125040999927, 7.964114482000085 ], [ -60.267998436999875, 7.921262469000098 ], [ -60.544412604158367, 7.915537828507979 ], [ -60.706805793152796, 7.818256944202574 ], [ -60.784630499697812, 7.751775213954943 ], [ -60.970975714957262, 7.946026923303862 ], [ -61.024460821609637, 7.940678412278885 ], [ -61.065724452821257, 7.906158556072512 ], [ -61.130423347259637, 7.897011826734399 ], [ -61.242922939641915, 7.838953355413025 ], [ -61.312634447421829, 7.820582384169654 ], [ -61.342425910227576, 7.831977037310423 ], [ -61.609205491939917, 8.118522854246294 ], [ -61.643389452261431, 8.207974757928696 ], [ -61.635198737331848, 8.287039699722357 ], [ -62.247176887403441, 8.313808092369527 ], [ -62.597646449723868, 8.447985947893187 ], [ -62.515300056252613, 8.519428616437494 ], [ -62.435899216775397, 8.513821722994123 ], [ -62.366368577947526, 8.54570608177022 ], [ -62.32324459476223, 8.589372667314706 ], [ -62.239528774833104, 8.598002630916653 ], [ -62.181832037818253, 8.680400702130669 ], [ -62.075197720398478, 8.734402574519208 ], [ -62.06424231593013, 8.799204819946453 ], [ -62.00507280056928, 8.872843736349353 ], [ -62.008638474885686, 8.895452175477487 ], [ -62.055560676384118, 8.90511566785375 ], [ -62.084189419206325, 8.94482900635353 ], [ -62.055173101857179, 9.063710639434476 ], [ -62.088633591766836, 9.071798001576497 ], [ -62.128734503894236, 9.056450100491759 ], [ -62.145270961585595, 9.097584540494154 ], [ -62.209737311127981, 9.072366441458087 ], [ -62.266297166580955, 9.131871852703853 ], [ -62.32133256684449, 9.140553494048504 ], [ -62.304692756365625, 9.196648261508074 ], [ -62.320531582066849, 9.357336127260453 ], [ -62.38685828268359, 9.417229112133782 ], [ -62.396056687965768, 9.481385403313709 ], [ -62.443599006189174, 9.509290675724117 ], [ -62.440240038347099, 9.541020005768644 ], [ -62.378667568653384, 9.615640774102417 ], [ -62.325365804088563, 9.718851386881965 ], [ -62.318714972999942, 9.706244208000044 ], [ -62.270497199999909, 9.766669012000079 ], [ -62.242990688999953, 9.842840887000079 ], [ -62.257232225999928, 9.974351304000038 ], [ -62.221994594999899, 9.938381252000056 ], [ -62.178700324999909, 9.846136786000045 ], [ -62.175892706999946, 9.704982815000051 ], [ -62.187611456999946, 9.662665106000077 ], [ -62.215687628999945, 9.637925523000092 ], [ -62.18187415299991, 9.648871161000045 ], [ -62.154286261999914, 9.726141669000071 ], [ -62.16047115799995, 9.85024648600006 ], [ -62.195179816999939, 9.932806708000044 ], [ -62.11945553299995, 9.921454169000071 ], [ -62.088449673999946, 9.879299221000053 ], [ -62.027333136999914, 9.874416408000059 ], [ -62.089019334999932, 9.898098049000055 ], [ -62.135609503999945, 9.940619208000044 ], [ -62.221424933999913, 9.95180898600006 ], [ -62.236805792999917, 9.966945705000057 ], [ -62.19647551199995, 10.019677793000085 ], [ -62.0253828459999, 9.957357139000067 ], [ -61.831450975999928, 9.791937567000048 ], [ -61.810373501999948, 9.748195705000057 ], [ -61.845773891999954, 9.65102773600006 ], [ -61.797352667999917, 9.760891018000052 ], [ -61.780100063999953, 9.75922272300005 ], [ -61.743316209999932, 9.699408270000049 ], [ -61.743316209999932, 9.596380927000041 ], [ -61.731027798999946, 9.694037177000041 ], [ -61.763172980999911, 9.760891018000052 ], [ -61.797352667999917, 9.774562893000052 ], [ -61.828171711999914, 9.827158454000084 ], [ -61.790099552999948, 9.830667120000044 ], [ -61.592518683999913, 9.78196849200009 ], [ -61.573801235999952, 9.794582424000055 ], [ -61.578114386999914, 9.808823960000041 ], [ -61.670965672999898, 9.896498654000084 ], [ -61.636734698999931, 9.898770728000045 ], [ -61.475700638999911, 9.80170127100007 ], [ -61.422265394999954, 9.736261109000054 ], [ -61.458042396999929, 9.812458040000081 ], [ -61.503098310999917, 9.839566517000037 ], [ -61.439167779999934, 9.818411300000037 ], [ -61.236507977999906, 9.632169292000071 ], [ -61.206044074999909, 9.577378648000092 ], [ -61.191965298999946, 9.583319403000075 ], [ -61.208322719999899, 9.60382721600007 ], [ -61.184193488999938, 9.604071356000077 ], [ -61.130116339999915, 9.572495835000041 ], [ -61.053212042999917, 9.581284898000092 ], [ -60.977040167999917, 9.549627997000073 ], [ -60.955067511999914, 9.521307684000078 ], [ -60.968658006999931, 9.534979559000078 ], [ -60.968658006999931, 9.493963934000078 ], [ -60.879017706999946, 9.468898830000057 ], [ -60.797434048999946, 9.384711005000042 ], [ -60.783802863999938, 9.33860911700009 ], [ -60.797434048999946, 9.294745184000078 ], [ -60.810414191999939, 9.31586334800005 ], [ -60.821888800999943, 9.272772528000075 ], [ -60.927113410999937, 9.233303127000056 ], [ -61.066761847999942, 9.132310289000088 ], [ -61.085438605999911, 9.102443752000056 ], [ -61.112049933999913, 9.041489976000037 ], [ -60.959136522999927, 9.182521877000056 ], [ -61.006581183999913, 9.048773505000042 ], [ -61.078521287999934, 8.997463283000059 ], [ -61.099680141999954, 8.960353908000059 ], [ -61.117746548999946, 8.903713283000059 ], [ -61.112049933999913, 8.857123114000046 ], [ -61.180083787999934, 8.735825914000088 ], [ -61.209462042999917, 8.609035549000055 ], [ -61.233306443999936, 8.58930084800005 ], [ -61.348540818999936, 8.61009349200009 ], [ -61.523060675999943, 8.596625067000048 ], [ -61.625355597999942, 8.630194403000075 ], [ -61.659047003999945, 8.616522528000075 ], [ -61.651966925999943, 8.585842190000051 ], [ -61.537261522999927, 8.527573960000041 ], [ -61.499663865999935, 8.534369208000044 ], [ -61.43423417899993, 8.47915273600006 ], [ -61.359120245999918, 8.486558335000041 ], [ -61.331776495999918, 8.438177802000041 ], [ -61.284047003999945, 8.39720286700009 ], [ -61.181019660999937, 8.493394273000092 ], [ -61.026600714999915, 8.500921942000048 ], [ -61.040150519999941, 8.472845770000049 ], [ -61.077992316999939, 8.466457424000055 ], [ -61.085764126999948, 8.415594794000071 ], [ -61.071888800999943, 8.403306382000039 ], [ -61.066558397999927, 8.456284898000092 ], [ -61.020375128999945, 8.468817450000074 ], [ -60.975575324999909, 8.575995184000078 ], [ -60.692453579999949, 8.604681708000044 ], [ -60.626088019999941, 8.555487372000073 ], [ -60.478911912999934, 8.532375393000052 ], [ -60.46157792899993, 8.534369208000044 ], [ -60.403716600999928, 8.62250397300005 ], [ -60.371896938999953, 8.63540273600006 ], [ -60.197824673999946, 8.623846747000073 ], [ -60.020985480999911, 8.558010158000059 ] ] ], [ [ [ -61.016468878999945, 8.61009349200009 ], [ -60.996001756999931, 8.602687893000052 ], [ -60.992543097999942, 8.576727606000077 ], [ -61.027699347999942, 8.543117580000057 ], [ -61.050648566999939, 8.555487372000073 ], [ -61.041574673999946, 8.518540757000039 ], [ -61.270375128999945, 8.514553127000056 ], [ -61.227609829999949, 8.571600653000075 ], [ -61.180246548999946, 8.569647528000075 ], [ -61.126372850999928, 8.534369208000044 ], [ -61.137847459999932, 8.559759833000044 ], [ -61.098459438999953, 8.602687893000052 ], [ -61.016468878999945, 8.61009349200009 ] ] ], [ [ [ -60.920277472999942, 9.028469143000052 ], [ -60.875477667999917, 9.02798086100006 ], [ -60.838368292999917, 9.000555731000077 ], [ -60.865712042999917, 8.994330145000049 ], [ -60.850819464999915, 8.970648505000042 ], [ -60.864979620999918, 8.941229559000078 ], [ -60.933583136999914, 8.883937893000052 ], [ -61.091623501999948, 8.822414455000057 ], [ -61.016713019999941, 8.88031647300005 ], [ -60.920277472999942, 9.028469143000052 ] ] ], [ [ [ -61.085438605999911, 8.890692450000074 ], [ -61.096587693999936, 8.900580145000049 ], [ -61.069325324999909, 8.97882721600007 ], [ -61.00226803299995, 9.000555731000077 ], [ -60.930816209999932, 9.07562897300005 ], [ -60.852040167999917, 9.096136786000045 ], [ -60.87564042899993, 9.043646552000041 ], [ -60.942982550999943, 9.025824286000045 ], [ -61.027088995999918, 8.94867584800005 ], [ -61.043812628999945, 8.911769924000055 ], [ -61.085438605999911, 8.890692450000074 ] ] ], [ [ [ -60.873158331999946, 9.116603908000059 ], [ -60.889719204999949, 9.098578192000048 ], [ -60.961293097999942, 9.069403387000079 ], [ -60.936756964999915, 9.164618231000077 ], [ -60.853342251999948, 9.194037177000041 ], [ -60.847482876999948, 9.163031317000048 ], [ -60.873158331999946, 9.116603908000059 ] ] ], [ [ [ -60.817860480999911, 9.206000067000048 ], [ -60.757923956999946, 9.230414130000042 ], [ -60.728505011999914, 9.192938544000071 ], [ -60.797434048999946, 9.171820380000042 ], [ -60.823801235999952, 9.122300523000092 ], [ -60.845204230999911, 9.116603908000059 ], [ -60.817860480999911, 9.206000067000048 ] ] ], [ [ [ -61.390271415999905, 8.580580853000072 ], [ -61.314602598999954, 8.571314151000081 ], [ -61.302737306999916, 8.514990475000047 ], [ -61.260264111999902, 8.486377083000093 ], [ -61.263688037999941, 8.456088496000064 ], [ -61.293437943999947, 8.456939487000056 ], [ -61.338444295999921, 8.50995247700007 ], [ -61.433687591999899, 8.514154007000059 ], [ -61.540116350999938, 8.565410528000086 ], [ -61.390271415999905, 8.580580853000072 ] ] ], [ [ [ -60.745023913999944, 8.719358815000078 ], [ -60.676055937999934, 8.762917274000074 ], [ -60.687225294999905, 8.709995234000075 ], [ -60.666022013999907, 8.686417940000069 ], [ -60.611610877999908, 8.683771178000086 ], [ -60.617677110999921, 8.636722733000056 ], [ -60.808134479999921, 8.632888276000074 ], [ -60.760332588999916, 8.717707751000091 ], [ -60.745023913999944, 8.719358815000078 ] ] ], [ [ [ -60.951361150999901, 8.827825132000044 ], [ -60.883289077999905, 8.84048914300007 ], [ -60.86169945599994, 8.87024514400008 ], [ -60.778106328999911, 8.870097702000066 ], [ -60.732365478999952, 8.892149504000088 ], [ -60.737598057999946, 8.866613498000049 ], [ -60.686042885999939, 8.789014680000037 ], [ -60.76973496699992, 8.741511392000064 ], [ -60.806895744999906, 8.672588730000086 ], [ -60.846576004999918, 8.63771526000005 ], [ -61.093874137999933, 8.63374413300005 ], [ -61.169914750999908, 8.595313593000071 ], [ -61.167108220999921, 8.699385415000052 ], [ -61.12643995399992, 8.756478098000059 ], [ -61.059968972999911, 8.798163462000048 ], [ -60.951361150999901, 8.827825132000044 ] ] ], [ [ [ -62.240834113999938, 10.05149974200009 ], [ -62.235340949999909, 10.013861395000049 ], [ -62.298003709999932, 9.983710028000075 ], [ -62.286366339999915, 10.024400132000039 ], [ -62.240834113999938, 10.05149974200009 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-F", "NAME_1": "Bolívar" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -60.267998436999875, 7.921262469000098 ], [ -60.374759684999873, 7.823606263000016 ], [ -60.525758219999886, 7.813374329000027 ], [ -60.586994791999928, 7.727126363000096 ], [ -60.601257486999913, 7.633850403000054 ], [ -60.631694905999979, 7.624600322000035 ], [ -60.671149861999908, 7.566050924000123 ], [ -60.716495931999901, 7.551581523000095 ], [ -60.730577758999942, 7.525433248000084 ], [ -60.70065710499992, 7.453499655000144 ], [ -60.660633707999921, 7.436136373000124 ], [ -60.653243977999921, 7.398464254000089 ], [ -60.628981892999946, 7.38435658800006 ], [ -60.601774251999927, 7.330148011000034 ], [ -60.602239339999869, 7.306531881000112 ], [ -60.643554646999888, 7.250669658000035 ], [ -60.628413452999979, 7.191138408000057 ], [ -60.54800492399994, 7.125509338000128 ], [ -60.475322021999887, 7.188502910000054 ], [ -60.372020833999926, 7.172276509000127 ], [ -60.299932210999941, 7.121013489000106 ], [ -60.291586466999945, 7.088302307000021 ], [ -60.303575398999925, 7.054144185000041 ], [ -60.359696003999971, 7.004896546000055 ], [ -60.37734350599996, 6.938544007000118 ], [ -60.420958414999916, 6.942213034000119 ], [ -60.548728393999937, 6.863096415000129 ], [ -60.63954972399992, 6.837723287000131 ], [ -60.700347046999923, 6.76708160400004 ], [ -60.721534382999977, 6.75969187400004 ], [ -60.793519652999947, 6.793824158000106 ], [ -60.837625487999929, 6.786356913000077 ], [ -60.90756953999994, 6.815244039000035 ], [ -60.899482177999943, 6.768554383000051 ], [ -60.933821166999877, 6.73173492500004 ], [ -61.129829874999928, 6.715844421000028 ], [ -61.190187947999931, 6.632877909000072 ], [ -61.211969563999844, 6.561435242000073 ], [ -61.139751749999903, 6.441261698000105 ], [ -61.160913248999861, 6.342353007000042 ], [ -61.146702229999903, 6.294216411000065 ], [ -61.114792032999929, 6.264011536000055 ], [ -61.121561644999872, 6.18665191600013 ], [ -61.161119954999918, 6.182879537000105 ], [ -61.194477090999982, 6.132856750000116 ], [ -61.269382080999947, 6.107225240000062 ], [ -61.3380858969999, 5.986793314000039 ], [ -61.396712808999922, 5.945581360000034 ], [ -61.37960791099988, 5.905299581000094 ], [ -60.739853678999879, 5.202138367000131 ], [ -60.664302734999922, 5.170254008000072 ], [ -60.598673665999911, 4.996879578000062 ], [ -60.591929891999968, 4.949724834000051 ], [ -60.6126263029999, 4.9005805460001 ], [ -60.718149576999878, 4.784282735000104 ], [ -60.8600272219999, 4.712426656000076 ], [ -60.895813151999931, 4.708525085000119 ], [ -60.947799642999968, 4.573597921000058 ], [ -60.977281046999877, 4.534969788000069 ], [ -61.168587198999944, 4.490243835000101 ], [ -61.238066162999928, 4.515875346000072 ], [ -61.315580810999904, 4.52078460700011 ], [ -61.322944702999905, 4.508847351000071 ], [ -61.293049885999949, 4.448050029000044 ], [ -61.333228312999978, 4.423865459000069 ], [ -61.458181925999924, 4.419137064000083 ], [ -61.501874348999905, 4.401851298000096 ], [ -61.526730712999949, 4.285501811000074 ], [ -61.567270874999878, 4.248527324000037 ], [ -61.737803100999912, 4.252067159000092 ], [ -61.866890828999885, 4.157034200000069 ], [ -61.931486369999931, 4.146414693000082 ], [ -61.990190795999894, 4.166413473000119 ], [ -62.03504593999989, 4.159876404000045 ], [ -62.153591674999888, 4.09029408800005 ], [ -62.428096883999871, 4.183182475000081 ], [ -62.462978474999943, 4.174707540000071 ], [ -62.483700724999977, 4.139179993000113 ], [ -62.536979125999949, 4.125408224000083 ], [ -62.56095699099987, 4.037790833000074 ], [ -62.744356648999911, 4.034018453000058 ], [ -62.766215779999925, 4.020711772000126 ], [ -62.766267455999952, 3.964694520000108 ], [ -62.788798380999964, 3.899401347000079 ], [ -62.74042924099993, 3.741943258000092 ], [ -62.74957596899992, 3.660372010000032 ], [ -62.786317912999891, 3.604406434000026 ], [ -62.889412394999908, 3.56081736200008 ], [ -62.951062377999875, 3.570170797000117 ], [ -62.997054402999964, 3.599135437000086 ], [ -63.251199096999898, 3.886559754000089 ], [ -63.351709757999913, 3.958725891000086 ], [ -63.425400349999848, 3.968363546000106 ], [ -63.468860229999848, 3.867232768000036 ], [ -63.510666463999911, 3.854546204000087 ], [ -63.622804321999894, 3.935213114000106 ], [ -63.671586873999928, 3.946246033000094 ], [ -63.771012329999849, 3.928805237000063 ], [ -63.875140340999934, 3.949811707000066 ], [ -63.996424926999907, 3.880797832000027 ], [ -64.037662719999901, 3.882503154000077 ], [ -64.063810994999898, 3.911596985000088 ], [ -64.125099242999852, 4.088485412000054 ], [ -64.172693236999891, 4.123392843000133 ], [ -64.364981241999942, 4.151866557000076 ], [ -64.608222208999933, 4.126493429000078 ], [ -64.648024188999869, 4.207904544000115 ], [ -64.626850754658562, 4.329968573091151 ], [ -64.667700974720219, 4.558326728395798 ], [ -64.702220831825912, 4.58765310320814 ], [ -64.941999477793672, 4.625196031371729 ], [ -65.085065681136257, 4.799216417503658 ], [ -65.184103562829137, 4.999772651386763 ], [ -65.222163254930251, 5.143924058548464 ], [ -65.282288783800311, 5.226012071399964 ], [ -65.274433966554284, 5.276758327834557 ], [ -65.159040493424015, 5.293682359153536 ], [ -65.117466803849879, 5.355435696000541 ], [ -65.120231493388701, 5.378405870334632 ], [ -65.183612637313331, 5.434035548901477 ], [ -65.144416062751077, 5.473051256310441 ], [ -65.135579392674799, 5.525967922181849 ], [ -65.241826138265651, 5.613171902061595 ], [ -65.264537930181348, 5.661747748160053 ], [ -65.226426561236792, 5.719547837962352 ], [ -65.224643723628958, 5.758563544471997 ], [ -65.265933194161562, 5.773937283079135 ], [ -65.437498949117185, 5.77517751742846 ], [ -65.475093553224895, 5.765488185731158 ], [ -65.551755540685633, 5.690531521512469 ], [ -65.582012092384161, 5.689368801528929 ], [ -65.608857997598477, 5.714896958927511 ], [ -65.63673743428518, 5.789207667999449 ], [ -65.638339402941085, 5.854319972688586 ], [ -65.580255093197991, 6.080636907966891 ], [ -65.590151129570984, 6.121202908087753 ], [ -65.614128994257669, 6.140607408105382 ], [ -65.760890062226565, 6.141537584092248 ], [ -65.827113410055802, 6.110195828574604 ], [ -65.97932634093786, 5.80930980090659 ], [ -66.027462938363897, 5.782231349896847 ], [ -66.123400234633095, 5.784634304229769 ], [ -66.195876431052454, 5.741045233950388 ], [ -66.243832160425825, 5.73334544543593 ], [ -66.274863857580954, 5.781456204440246 ], [ -66.299177619051875, 5.88969249141536 ], [ -66.340777147047675, 5.924212348521053 ], [ -66.552883062803119, 5.742750556293117 ], [ -66.694941575793052, 5.699058132326911 ], [ -66.817569750343694, 5.694252224560501 ], [ -67.00001339360324, 5.619063015445818 ], [ -67.035773485058257, 5.632266343716765 ], [ -67.054893765135148, 5.694329738926285 ], [ -67.076701218586379, 5.713966782940645 ], [ -67.171217414252283, 5.705026760076919 ], [ -67.204031949015246, 5.722803453016923 ], [ -67.20178402431327, 5.782153835531062 ], [ -67.14452653687016, 5.934315090469056 ], [ -67.177961188358154, 6.099783027364822 ], [ -67.195712042876494, 6.112986354736449 ], [ -67.28829037130356, 6.116629543418696 ], [ -67.331517707276362, 6.146265977492874 ], [ -67.384537725935274, 6.119962672839051 ], [ -67.456299400197167, 6.193223721097866 ], [ -67.412391324200257, 6.240575465785128 ], [ -67.336892055823682, 6.254192206105415 ], [ -67.28234758197533, 6.362195949983118 ], [ -67.137808601186009, 6.458624171768122 ], [ -67.148841519120822, 6.528542385122989 ], [ -67.128506843116327, 6.638251451343365 ], [ -67.103392096867765, 6.701451728114762 ], [ -67.049545254110171, 6.755272732450635 ], [ -67.041793788752329, 6.782557888136012 ], [ -67.042878994370085, 6.822012844217397 ], [ -67.061895920760151, 6.851494249559948 ], [ -67.034378221078043, 6.913066718354344 ], [ -67.08155880409555, 7.023240872568181 ], [ -67.089827033390861, 7.065667222864022 ], [ -67.074194912365328, 7.093830877692824 ], [ -66.995155808993388, 7.156824448889211 ], [ -66.931154548343727, 7.169743557219363 ], [ -66.794728767218828, 7.258962917804411 ], [ -66.614533046862618, 7.322938340931671 ], [ -66.427283494937342, 7.598451239033466 ], [ -66.370723640383687, 7.639792385510191 ], [ -66.236287400642993, 7.6361233593056 ], [ -66.130893316673223, 7.683820706260576 ], [ -65.959663459401099, 7.671495876233678 ], [ -65.833986376270218, 7.75714956340164 ], [ -65.768486497953518, 7.841072088905776 ], [ -65.648157924948293, 7.89990570748239 ], [ -65.542867193765971, 7.89995738432583 ], [ -65.446774867865827, 7.861458441753655 ], [ -65.278077155236531, 7.874274197296359 ], [ -65.103695033898703, 7.834379990743969 ], [ -64.99607886364862, 7.770688788456823 ], [ -64.873063117269055, 7.666069850842916 ], [ -64.838465745797521, 7.660204575880471 ], [ -64.63705685119271, 7.771748154753539 ], [ -64.550963915352384, 7.765288601487782 ], [ -64.495463426196125, 7.790790920464588 ], [ -64.478151822148845, 7.814691269886168 ], [ -64.481562465935042, 7.843500880761042 ], [ -64.546158005787333, 7.896650092427819 ], [ -64.552514208064224, 7.925252996828306 ], [ -64.537114631035365, 7.98393158577403 ], [ -64.506237961712543, 7.99917613407132 ], [ -64.450065680786508, 7.990623683935837 ], [ -64.35239722375286, 8.008968818556127 ], [ -64.312942267671531, 8.06545115784462 ], [ -64.283254156753912, 8.081419176553766 ], [ -64.231629401175894, 8.071445624016349 ], [ -64.125563523637709, 7.965870672893232 ], [ -64.065903082761054, 7.98127024992209 ], [ -63.970792608791839, 7.969462184732038 ], [ -63.885371467419304, 8.018193061360705 ], [ -63.839896205845207, 8.110409654581872 ], [ -63.811990933434799, 8.130976874583098 ], [ -63.760727912163418, 8.12118419009829 ], [ -63.66768449574289, 8.159760647036194 ], [ -63.473561977603197, 8.150200507447437 ], [ -63.400026414887122, 8.221927395033219 ], [ -63.33080583442171, 8.213891709734582 ], [ -63.249570482291915, 8.28554108295458 ], [ -63.174639654696307, 8.313446357163627 ], [ -62.976899787195407, 8.309518948540642 ], [ -62.936359626395642, 8.270270697134947 ], [ -62.879102138952533, 8.274120592291467 ], [ -62.770607468659762, 8.375251369954753 ], [ -62.696606817950283, 8.379979763355379 ], [ -62.597646449723868, 8.447985947893187 ], [ -62.247176887403441, 8.313808092369527 ], [ -61.635198737331848, 8.287039699722357 ], [ -61.643389452261431, 8.207974757928696 ], [ -61.609205491939917, 8.118522854246294 ], [ -61.394076504227257, 7.877529812350929 ], [ -61.31919735437441, 7.820582384169654 ], [ -61.208997361738852, 7.852544257311592 ], [ -61.130423347259637, 7.897011826734399 ], [ -61.065724452821257, 7.906158556072512 ], [ -61.019215664271485, 7.942616279517665 ], [ -60.970975714957262, 7.946026923303862 ], [ -60.784630499697812, 7.751775213954943 ], [ -60.706805793152796, 7.818256944202574 ], [ -60.544412604158367, 7.915537828507979 ], [ -60.267998436999875, 7.921262469000098 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-Z", "NAME_1": "Amazonas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -64.648024188999869, 4.207904544000115 ], [ -64.699870361999928, 4.264159444000086 ], [ -64.745939900999929, 4.287620545000053 ], [ -64.791621866999947, 4.284416606000079 ], [ -64.812912557999937, 4.252790629000089 ], [ -64.801259521999953, 4.188530985000043 ], [ -64.727103841999934, 4.140781962000062 ], [ -64.642897094999938, 3.972962748000057 ], [ -64.531431030999954, 3.853512675000104 ], [ -64.434537719999923, 3.77847849600002 ], [ -64.324156859999846, 3.724114889000049 ], [ -64.202975626999915, 3.594717102000089 ], [ -64.197859659999921, 3.51508372000005 ], [ -64.245608682999887, 3.418939717000029 ], [ -64.216308146999921, 3.251430562000024 ], [ -64.222922729999937, 3.123996481000091 ], [ -64.105953125999946, 2.947211405000061 ], [ -63.997561808999905, 2.714925842000042 ], [ -64.012186238999874, 2.603769837000044 ], [ -64.057816528999865, 2.510442200000085 ], [ -64.047972168999905, 2.471323140000052 ], [ -63.831318725999921, 2.428638408000054 ], [ -63.573815063999859, 2.434374491000113 ], [ -63.364887247999889, 2.413083802000131 ], [ -63.372638712999901, 2.266839498000095 ], [ -63.41175777199993, 2.149378967000075 ], [ -63.561981160999949, 2.126357117000026 ], [ -63.617533324999954, 2.101164856000082 ], [ -63.783207967999942, 1.974996847000099 ], [ -63.920822305999934, 1.974325053000115 ], [ -63.995029662999912, 1.958021139000081 ], [ -64.036629190999918, 1.927273661000129 ], [ -64.053604899999925, 1.893709819000108 ], [ -64.072544311999877, 1.684575297000094 ], [ -64.092956502999925, 1.622615255000056 ], [ -64.129724283999906, 1.578070170000061 ], [ -64.301522583999883, 1.446657003000055 ], [ -64.352940633999964, 1.365835063000091 ], [ -64.389579223999903, 1.369297384000035 ], [ -64.394772705999912, 1.392190044000046 ], [ -64.36459366899993, 1.497093201000055 ], [ -64.409009562999898, 1.507506002000085 ], [ -64.551197265999917, 1.419526876000077 ], [ -64.604217285999937, 1.3312893680001 ], [ -64.730876220999846, 1.247573548000062 ], [ -64.839293375999915, 1.270827942000068 ], [ -64.897403523999884, 1.219668274000071 ], [ -64.966469075999953, 1.200599670000088 ], [ -65.01744787599992, 1.162979228000069 ], [ -65.022486328999975, 1.139983216000118 ], [ -65.136768758999921, 1.126909078000068 ], [ -65.160178182999886, 1.080193584000071 ], [ -65.178988402999892, 0.955395 ], [ -65.203043782999941, 0.923820699000089 ], [ -65.327196410999875, 0.910281474000016 ], [ -65.400008503999857, 0.816540426000046 ], [ -65.413883625999915, 0.741609599000085 ], [ -65.45121984899987, 0.690139872000088 ], [ -65.497831990999941, 0.658720601000056 ], [ -65.54266129599992, 0.64931549100001 ], [ -65.58521683799998, 0.691483459000068 ], [ -65.587335571999859, 0.73912913 ], [ -65.533178670999945, 0.816333720000088 ], [ -65.518502563999846, 0.886510315000052 ], [ -65.559843709999882, 0.957978821000069 ], [ -65.608109496999901, 0.985263977000088 ], [ -65.745439615999913, 0.974153545000064 ], [ -65.89176143399996, 0.895605368000119 ], [ -65.974081990999935, 0.806980286000041 ], [ -66.079191853999902, 0.777576396000057 ], [ -66.134382283999884, 0.73111928400003 ], [ -66.208744669999902, 0.76310699500003 ], [ -66.285070760999929, 0.745847066000039 ], [ -66.346203979999927, 0.759386292000016 ], [ -66.87506058799994, 1.222510478000046 ], [ -66.900898803999951, 1.288966370000097 ], [ -66.883535521999931, 1.349944560000068 ], [ -66.932731485999909, 1.424642843000072 ], [ -66.933609985999851, 1.501692403000092 ], [ -66.97417598499996, 1.580033875000083 ], [ -66.980893920999904, 1.66594594300004 ], [ -67.087295694999909, 1.93882334400007 ], [ -67.132615925999914, 1.990809835000093 ], [ -67.111170206999901, 2.048842469000064 ], [ -67.11463252799993, 2.102999370000077 ], [ -67.177832804999895, 2.15449493400007 ], [ -67.217261921999921, 2.266064351000082 ], [ -67.217675333999921, 2.284512838000097 ], [ -67.173750365999894, 2.336447652000103 ], [ -67.189718383999917, 2.394376933000046 ], [ -67.325420694999906, 2.474630432000055 ], [ -67.340613565999917, 2.510493876000098 ], [ -67.470889852999932, 2.627127584000092 ], [ -67.500293741999911, 2.675341695000085 ], [ -67.57558630399987, 2.691103007000066 ], [ -67.594293172999954, 2.776110738000071 ], [ -67.62659094299994, 2.813421122000108 ], [ -67.690411336999972, 2.80634145100008 ], [ -67.751027790999842, 2.842101542000094 ], [ -67.823323120999902, 2.827322083000084 ], [ -67.855930948999941, 2.789753316000073 ], [ -67.85525915499997, 2.858172913000061 ], [ -67.838619344999927, 2.886129863000065 ], [ -67.452182983999933, 3.243679098000101 ], [ -67.395803995999927, 3.266571757000037 ], [ -67.309452677999872, 3.383928935000114 ], [ -67.304646768999959, 3.425709331000064 ], [ -67.403917195999924, 3.504464213000063 ], [ -67.471406616999872, 3.680060730000079 ], [ -67.499828654999902, 3.717913717000059 ], [ -67.537449096999921, 3.735509542000045 ], [ -67.594809936999894, 3.730910340000094 ], [ -67.631758585999933, 3.761864523000014 ], [ -67.644419311999883, 3.834624939000079 ], [ -67.693873657999916, 3.928598531000105 ], [ -67.720642048999878, 4.074972026000083 ], [ -67.786219441999918, 4.172976380000108 ], [ -67.804926310999889, 4.268474426000054 ], [ -67.77939815299996, 4.350794983000114 ], [ -67.799862019999921, 4.398905741000092 ], [ -67.793092406999875, 4.42898142500006 ], [ -67.813504598999913, 4.443269959000048 ], [ -67.829059203999947, 4.491432394000128 ], [ -67.875051228999951, 4.532644348000119 ], [ -67.855155802999946, 4.566156515000046 ], [ -67.845647338999953, 4.689740703000027 ], [ -67.82285803299996, 4.743587545000139 ], [ -67.813504598999913, 4.840506694000084 ], [ -67.826372029999902, 4.894844462000052 ], [ -67.793092406999875, 5.063335470000112 ], [ -67.82663041299989, 5.120386251000113 ], [ -67.813504598999913, 5.186557923000095 ], [ -67.843683634999906, 5.29724884000008 ], [ -67.834588582999942, 5.339313456000099 ], [ -67.772576863999888, 5.409670919000121 ], [ -67.752112996999927, 5.409670919000121 ], [ -67.647003133999874, 5.483361511000055 ], [ -67.614291951999888, 5.55366729800005 ], [ -67.6359960529999, 5.577593485000051 ], [ -67.649070190999936, 5.656089986000083 ], [ -67.625144002999946, 5.784505921000076 ], [ -67.485204223999915, 5.944082743000124 ], [ -67.422469034999978, 5.978240865000103 ], [ -67.428566853999939, 6.038469747000079 ], [ -67.491198689999948, 6.114485779000034 ], [ -67.486961221999906, 6.166782328000039 ], [ -67.456299400197167, 6.193223721097866 ], [ -67.384537725935274, 6.119962672839051 ], [ -67.331517707276362, 6.146265977492874 ], [ -67.275087043032613, 6.112908840370665 ], [ -67.183903977686384, 6.107095242251603 ], [ -67.149616664577422, 6.00994354915548 ], [ -67.14452653687016, 5.934315090469056 ], [ -67.20178402431327, 5.782153835531062 ], [ -67.204031949015246, 5.722803453016923 ], [ -67.171217414252283, 5.705026760076919 ], [ -67.076701218586379, 5.713966782940645 ], [ -67.054893765135148, 5.694329738926285 ], [ -67.035773485058257, 5.632266343716765 ], [ -67.00001339360324, 5.619063015445818 ], [ -66.817569750343694, 5.694252224560501 ], [ -66.694941575793052, 5.699058132326911 ], [ -66.552883062803119, 5.742750556293117 ], [ -66.340777147047675, 5.924212348521053 ], [ -66.299177619051875, 5.88969249141536 ], [ -66.274863857580954, 5.781456204440246 ], [ -66.243832160425825, 5.73334544543593 ], [ -66.195876431052454, 5.741045233950388 ], [ -66.123400234633095, 5.784634304229769 ], [ -66.027462938363897, 5.782231349896847 ], [ -65.97932634093786, 5.80930980090659 ], [ -65.827113410055802, 6.110195828574604 ], [ -65.760890062226565, 6.141537584092248 ], [ -65.614128994257669, 6.140607408105382 ], [ -65.590151129570984, 6.121202908087753 ], [ -65.580255093197991, 6.080636907966891 ], [ -65.638339402941085, 5.854319972688586 ], [ -65.63673743428518, 5.789207667999449 ], [ -65.608857997598477, 5.714896958927511 ], [ -65.582012092384161, 5.689368801528929 ], [ -65.551755540685633, 5.690531521512469 ], [ -65.475093553224895, 5.765488185731158 ], [ -65.437498949117185, 5.77517751742846 ], [ -65.265933194161562, 5.773937283079135 ], [ -65.224643723628958, 5.758563544471997 ], [ -65.226426561236792, 5.719547837962352 ], [ -65.264537930181348, 5.661747748160053 ], [ -65.241826138265651, 5.613171902061595 ], [ -65.135579392674799, 5.525967922181849 ], [ -65.144416062751077, 5.473051256310441 ], [ -65.183612637313331, 5.434035548901477 ], [ -65.120231493388701, 5.378405870334632 ], [ -65.117466803849879, 5.355435696000541 ], [ -65.159040493424015, 5.293682359153536 ], [ -65.274433966554284, 5.276758327834557 ], [ -65.282288783800311, 5.226012071399964 ], [ -65.222163254930251, 5.143924058548464 ], [ -65.184103562829137, 4.999772651386763 ], [ -65.085065681136257, 4.799216417503658 ], [ -64.941999477793672, 4.625196031371729 ], [ -64.702220831825912, 4.58765310320814 ], [ -64.667700974720219, 4.558326728395798 ], [ -64.626850754658562, 4.329968573091151 ], [ -64.648024188999869, 4.207904544000115 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-V", "NAME_1": "Zulia" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -71.357629353999897, 11.850802307000023 ], [ -71.327506533469858, 11.849997690578633 ], [ -71.343861456999946, 11.807521877000056 ], [ -71.336048956999946, 11.789252020000049 ], [ -71.371449347999942, 11.783107815000051 ], [ -71.378163214999915, 11.75844961100006 ], [ -71.507069464999915, 11.709784247000073 ], [ -71.674427863999938, 11.684719143000052 ], [ -71.90070553299995, 11.621323960000041 ], [ -71.960519985999952, 11.59125397300005 ], [ -71.970122850999928, 11.511379299000055 ], [ -71.939320441999939, 11.380764065000051 ], [ -71.856922980999911, 11.216986395000049 ], [ -71.76976477799991, 11.106350002000056 ], [ -71.626454230999911, 11.014960028000075 ], [ -71.624663865999935, 11.000962632000039 ], [ -71.679310675999943, 10.987982489000046 ], [ -71.675282355999911, 11.003607489000046 ], [ -71.697132941999939, 11.025580145000049 ], [ -71.744211391999897, 11.035956122000073 ], [ -71.768666144999941, 11.015285549000055 ], [ -71.715687628999945, 10.95774974200009 ], [ -71.710438605999911, 10.878607489000046 ], [ -71.67406165299991, 10.802394924000055 ], [ -71.576283331999946, 10.721096096000053 ], [ -71.610422329999949, 10.637884833000044 ], [ -71.605580206999946, 10.581854559000078 ], [ -71.630930141999897, 10.518459377000056 ], [ -71.62954667899993, 10.454006252000056 ], [ -71.754465298999946, 10.370998440000051 ], [ -71.897694464999915, 10.139227606000077 ], [ -71.96906490799995, 10.105698960000041 ], [ -72.043690558999913, 9.929592190000051 ], [ -72.124379035999937, 9.826076565000051 ], [ -72.090240037999934, 9.75462474200009 ], [ -71.998931443999936, 9.654730536000045 ], [ -71.946848110999952, 9.541164455000057 ], [ -71.964833136999914, 9.55109284100007 ], [ -71.987863735999952, 9.610052802000041 ], [ -71.987863735999952, 9.589544989000046 ], [ -72.008290167999917, 9.575873114000046 ], [ -71.977894660999937, 9.555894273000092 ], [ -71.960519985999952, 9.51788971600007 ], [ -71.967518683999913, 9.498236395000049 ], [ -71.983713344999899, 9.497463283000059 ], [ -72.015126105999911, 9.521307684000078 ], [ -71.995228644999941, 9.459214585000041 ], [ -71.936390753999945, 9.500189520000049 ], [ -71.918934699999909, 9.480292059000078 ], [ -71.918934699999909, 9.500189520000049 ], [ -71.84439042899993, 9.439357815000051 ], [ -71.900746222999942, 9.434556382000039 ], [ -71.913807745999918, 9.412583726000037 ], [ -71.905262824999909, 9.384711005000042 ], [ -71.891590949999909, 9.425726630000042 ], [ -71.833566860999952, 9.425726630000042 ], [ -71.760853644999941, 9.364732164000088 ], [ -71.734527147999927, 9.384711005000042 ], [ -71.728016730999911, 9.348089911000045 ], [ -71.748199022999927, 9.343166408000059 ], [ -71.739979620999918, 9.28937409100007 ], [ -71.816517706999946, 9.233303127000056 ], [ -71.744699673999946, 9.237616278000075 ], [ -71.749379035999937, 9.216294664000088 ], [ -71.734527147999927, 9.206000067000048 ], [ -71.753244594999899, 9.204250393000052 ], [ -71.751820441999939, 9.190741278000075 ], [ -71.734527147999927, 9.165025132000039 ], [ -71.761870897999927, 9.130845445000091 ], [ -71.708566860999952, 9.076727606000077 ], [ -71.60220292899993, 9.042303778000075 ], [ -71.514800584999932, 9.048976955000057 ], [ -71.273548956999946, 9.13507721600007 ], [ -71.218534513694877, 9.187001923563491 ], [ -71.147382981639282, 9.127815252871585 ], [ -71.148623215988607, 9.033479926157668 ], [ -71.187096320139062, 8.992526353308563 ], [ -71.225595261811861, 9.048388576771401 ], [ -71.29634029836609, 9.013610338146577 ], [ -71.673526577389623, 8.718796291915339 ], [ -71.726029833010386, 8.617226263781049 ], [ -71.758534309410834, 8.630197048055322 ], [ -71.808066169018446, 8.619629218113914 ], [ -71.808712124165197, 8.666034653876181 ], [ -71.856797044747793, 8.668127549846531 ], [ -71.937567307984864, 8.620869452463239 ], [ -71.993842942597723, 8.532115179871653 ], [ -72.042186244699394, 8.486820787249542 ], [ -72.129829475050201, 8.456796780447064 ], [ -72.172720913339447, 8.458037013897069 ], [ -72.235326910908213, 8.399435940216449 ], [ -72.253181118214002, 8.527309272105185 ], [ -72.281189745210554, 8.54167532035973 ], [ -72.341961229227309, 8.495502427694873 ], [ -72.352968308740458, 8.454006252486522 ], [ -72.369091356181116, 8.432276313401132 ], [ -72.388108282571181, 8.435454413190598 ], [ -72.415609207199168, 8.382691114103636 ], [ -72.45627030499989, 8.403932597000079 ], [ -72.675430053999946, 8.651514384000052 ], [ -72.783072062999878, 9.059939067000116 ], [ -72.800021932999897, 9.079446920000123 ], [ -72.791030232999844, 9.113940939000102 ], [ -72.826686971999919, 9.141691182000045 ], [ -72.955309611999979, 9.103993225000096 ], [ -72.973189656999949, 9.128436178000044 ], [ -72.980062622999895, 9.216518656000076 ], [ -73.009724894999863, 9.295376892000093 ], [ -73.032669230999915, 9.294601746000083 ], [ -73.212244832999886, 9.173446350000063 ], [ -73.377816121999871, 9.164687195000084 ], [ -73.390838582999919, 9.194504496000093 ], [ -73.324382690999954, 9.255921936000078 ], [ -73.178448445999919, 9.523037415000147 ], [ -73.107651733999973, 9.577995301000087 ], [ -72.985540323999885, 9.81216705300011 ], [ -72.977633829999945, 9.838056946000052 ], [ -72.996960814999909, 9.900714620000073 ], [ -72.987710733999876, 9.999416606000082 ], [ -72.935620890999928, 10.175193991000057 ], [ -72.914898640999894, 10.432904358000073 ], [ -72.843016723999966, 10.560596822000065 ], [ -72.754391641999888, 10.674853414000012 ], [ -72.682974812999902, 10.855617575000025 ], [ -72.576469685999939, 10.957368469000073 ], [ -72.49931677299989, 11.12079518700007 ], [ -72.341341918999944, 11.162110494000103 ], [ -72.267082885999884, 11.154901632000048 ], [ -72.007925578999874, 11.624614563000065 ], [ -71.971080281999946, 11.661924948000106 ], [ -71.449458373999931, 11.795456848000086 ], [ -71.357629353999897, 11.850802307000023 ] ] ], [ [ [ -71.062446101576569, 9.617403481272083 ], [ -71.035064256999931, 9.740383205000057 ], [ -71.08617102799991, 9.811997789000088 ], [ -71.090240037999934, 9.836615302000041 ], [ -71.072824673999946, 9.841620184000078 ], [ -71.072417772999927, 9.857855536000045 ], [ -71.162464972999942, 9.970933335000041 ], [ -71.206939256999931, 9.980617580000057 ], [ -71.26781165299991, 10.151922919000071 ], [ -71.363880988999938, 10.219956773000092 ], [ -71.422596808999913, 10.343166408000059 ], [ -71.469349738999938, 10.40180084800005 ], [ -71.466297980999911, 10.502142645000049 ], [ -71.541574673999946, 10.564886786000045 ], [ -71.537464972999942, 10.59796784100007 ], [ -71.500111456999946, 10.627997137000079 ], [ -71.532866990999935, 10.67649974200009 ], [ -71.531361456999946, 10.75267161700009 ], [ -71.583119269999941, 10.80923086100006 ], [ -71.50999915299991, 10.812648830000057 ], [ -71.445912238999938, 10.796210028000075 ], [ -71.435292120999918, 10.818915106000077 ], [ -71.45335852799991, 10.871893622000073 ], [ -71.412464972999942, 10.919094143000052 ], [ -71.447661912999934, 10.920396226000037 ], [ -71.501128709999932, 10.960028387000079 ], [ -71.458322719999899, 10.97492096600007 ], [ -71.282012498999904, 10.991441148000092 ], [ -71.246007453081461, 10.908352565818234 ], [ -71.08046200181991, 10.756759752560527 ], [ -71.081004605078476, 10.638575751469716 ], [ -71.039663458601694, 10.589560654900311 ], [ -71.014832933193304, 10.518867296088843 ], [ -70.95734290175352, 10.460292059930623 ], [ -70.903134324689347, 10.442902939718863 ], [ -70.778697475907791, 10.453625800190537 ], [ -70.745185310054012, 10.415126858517681 ], [ -70.729036424191634, 10.331979478470146 ], [ -70.658084682961714, 10.304771837150554 ], [ -70.710794644157488, 10.194158433364976 ], [ -70.824999558882553, 10.121320501739774 ], [ -70.858149991329014, 10.070031642945935 ], [ -70.85481686100934, 10.043547472038199 ], [ -70.806809454792472, 9.983938707105608 ], [ -70.661159430863052, 9.904512030106105 ], [ -70.636328904555285, 9.839942327776214 ], [ -70.641289841952641, 9.791960760880386 ], [ -70.694929979135225, 9.746743883523379 ], [ -70.737692227114565, 9.761704210081234 ], [ -70.761540899692761, 9.716461493403187 ], [ -70.75689002065792, 9.692431951873061 ], [ -70.794045376093209, 9.678608506877083 ], [ -70.851354540379702, 9.602204901834739 ], [ -71.062446101576569, 9.617403481272083 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-S", "NAME_1": "Táchira" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -72.350075235999924, 8.042585144000014 ], [ -72.33384883599993, 8.065477804000125 ], [ -72.335760864999941, 8.103899231000071 ], [ -72.390537882999922, 8.234330546000095 ], [ -72.386765502999907, 8.33861358700004 ], [ -72.415609207199168, 8.382691114103636 ], [ -72.388108282571181, 8.435454413190598 ], [ -72.369091356181116, 8.432276313401132 ], [ -72.352968308740458, 8.454006252486522 ], [ -72.341961229227309, 8.495502427694873 ], [ -72.281189745210554, 8.54167532035973 ], [ -72.257366909255438, 8.536998602903168 ], [ -72.235326910908213, 8.399435940216449 ], [ -72.172720913339447, 8.458037013897069 ], [ -72.129829475050201, 8.456796780447064 ], [ -72.042186244699394, 8.486820787249542 ], [ -71.993842942597723, 8.532115179871653 ], [ -71.944931199715086, 8.611412664762668 ], [ -71.823129849263125, 8.590302843301572 ], [ -71.802665982049405, 8.570691636809556 ], [ -71.772254400719987, 8.468966579943697 ], [ -71.829641079372323, 8.395405177906639 ], [ -71.810779181713826, 8.339232896081285 ], [ -71.818530646172348, 8.310371609262347 ], [ -71.886459317243691, 8.232107652246327 ], [ -71.897104661550884, 8.175470282427568 ], [ -71.821321174132891, 8.170483507507868 ], [ -71.711353726393327, 8.049069728884888 ], [ -71.680761277910619, 8.061162014015736 ], [ -71.588854743051911, 8.057286282236134 ], [ -71.507722743709621, 8.005403144239722 ], [ -71.499945440829435, 7.969927272725442 ], [ -71.522243821595055, 7.929903875863147 ], [ -71.506094936631996, 7.829961655705858 ], [ -71.532785814014119, 7.75828644496346 ], [ -71.491212124439983, 7.712656155557113 ], [ -71.490902066077467, 7.629792996349693 ], [ -71.377963223224185, 7.524037177173966 ], [ -71.317605150357394, 7.499594224493876 ], [ -71.36067745579993, 7.486184189748542 ], [ -71.692000902319762, 7.549332791475138 ], [ -71.826721361101932, 7.535922755830484 ], [ -71.845815802757102, 7.526130072245053 ], [ -71.839640469432084, 7.490680040051814 ], [ -71.875012987259538, 7.421485297108745 ], [ -72.010870326704207, 7.363375148943931 ], [ -72.068799607715732, 7.375002346081374 ], [ -72.188533902417646, 7.449803982467813 ], [ -72.319714525305073, 7.448408718487542 ], [ -72.39581243299989, 7.407491518000143 ], [ -72.414619099999868, 7.413812155000059 ], [ -72.478697875999899, 7.484453837000061 ], [ -72.463401651999931, 7.570753479000103 ], [ -72.483348754999952, 7.649353333000064 ], [ -72.451774454999878, 7.832804667000104 ], [ -72.45864741999992, 7.893524475000106 ], [ -72.491203572999979, 7.937501119000061 ], [ -72.430122029999978, 7.990521139000066 ], [ -72.40707434199993, 8.043773702000124 ], [ -72.350075235999924, 8.042585144000014 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-C", "NAME_1": "Apure" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -72.321808227999952, 7.390040995000106 ], [ -72.39581243299989, 7.407491518000143 ], [ -72.319714525305073, 7.448408718487542 ], [ -72.188533902417646, 7.449803982467813 ], [ -72.068799607715732, 7.375002346081374 ], [ -71.990277269180638, 7.365468044015017 ], [ -71.881162482162836, 7.41603343329632 ], [ -71.829873623368997, 7.49980093006883 ], [ -71.748767463347747, 7.47827769655845 ], [ -71.715849574897959, 7.442465929159312 ], [ -71.66034908664102, 7.432156479837658 ], [ -71.63957516106484, 7.432337347890268 ], [ -71.627560391199097, 7.453395494306619 ], [ -71.607199876772881, 7.438305976539596 ], [ -71.563119880078375, 7.452594509528979 ], [ -71.520926072879945, 7.438305976539596 ], [ -71.454418505109913, 7.463885809882186 ], [ -71.267685716222786, 7.445127265011251 ], [ -71.248849656986067, 7.454532375868439 ], [ -71.189163377687692, 7.404173692162146 ], [ -71.06136756016474, 7.378723049129405 ], [ -70.946775071812112, 7.307978014373873 ], [ -70.874169685082904, 7.287488307839112 ], [ -70.795337287285975, 7.314799302845529 ], [ -70.712861700806855, 7.289942939015418 ], [ -70.630851203220459, 7.294309597210145 ], [ -70.603540209113362, 7.328441880688217 ], [ -70.547833015281412, 7.333712877347409 ], [ -70.500523241054736, 7.383683987426082 ], [ -70.471842821389089, 7.381901149818191 ], [ -70.460241461774046, 7.423061428242306 ], [ -70.368334926915338, 7.450449936715188 ], [ -70.320895962378756, 7.516879991018754 ], [ -70.288882412393377, 7.603773912536042 ], [ -70.157185024669161, 7.615013536045865 ], [ -70.133517219244254, 7.629327908356288 ], [ -70.086595017745879, 7.710744126740053 ], [ -70.013886278229165, 7.754255683552913 ], [ -69.93549313000392, 7.757769680126614 ], [ -69.862991096062217, 7.811978258090107 ], [ -69.835137498696611, 7.807637437417782 ], [ -69.733696661771489, 7.844431056747851 ], [ -69.57703955832892, 7.951039537544602 ], [ -69.440949673088937, 8.071652330490622 ], [ -69.188691169262029, 8.070670478559748 ], [ -69.133449063423541, 8.041628322788881 ], [ -69.112649299425641, 8.006850084164057 ], [ -69.054306607264095, 7.980185045203655 ], [ -68.970280728073135, 7.99938283874701 ], [ -68.945062629037068, 7.931764227836823 ], [ -68.823467984160118, 7.902515367390265 ], [ -68.72983028763764, 7.915847886870495 ], [ -68.63386715384604, 7.969358831944533 ], [ -68.485142381115963, 7.938585517207855 ], [ -68.425895352288649, 7.97935822200435 ], [ -68.374709846282371, 7.991347154347693 ], [ -68.341740281888463, 7.965896511314952 ], [ -68.275594449324387, 7.970934963078093 ], [ -68.256577521135682, 7.956517238879485 ], [ -68.054367641753231, 8.048449612159857 ], [ -67.954425421595943, 8.054650783906538 ], [ -67.88481726840223, 8.026719672175091 ], [ -67.862570562681299, 8.034807034317168 ], [ -67.605299444613649, 7.99940867806805 ], [ -67.54618160699556, 7.962511705051156 ], [ -67.538120083275203, 7.917010605954715 ], [ -67.468124355554551, 7.903833116105432 ], [ -67.395829027187858, 7.911274522201438 ], [ -67.337899746176333, 7.889079495122587 ], [ -67.304542609054181, 7.842932440879451 ], [ -67.226485357613171, 7.798516547400709 ], [ -67.139694789782709, 7.772239081168664 ], [ -67.056754116209504, 7.797457180204674 ], [ -67.015697190572894, 7.769526069372603 ], [ -66.950791592358087, 7.788387966131722 ], [ -66.764782273882815, 7.755108344274674 ], [ -66.546087612753126, 7.795209255502755 ], [ -66.54554501039388, 7.811073920525018 ], [ -66.527509935035482, 7.816344916284834 ], [ -66.456532355383899, 7.746219998254276 ], [ -66.394804856958558, 7.727874864533362 ], [ -66.352611049760128, 7.735781357723454 ], [ -66.324602423662895, 7.687593085252672 ], [ -66.330519374569462, 7.648422349112082 ], [ -66.370723640383687, 7.639792385510191 ], [ -66.427283494937342, 7.598451239033466 ], [ -66.614533046862618, 7.322938340931671 ], [ -66.794728767218828, 7.258962917804411 ], [ -66.931154548343727, 7.169743557219363 ], [ -66.995155808993388, 7.156824448889211 ], [ -67.074194912365328, 7.093830877692824 ], [ -67.089827033390861, 7.065667222864022 ], [ -67.08155880409555, 7.023240872568181 ], [ -67.034378221078043, 6.913066718354344 ], [ -67.061895920760151, 6.851494249559948 ], [ -67.042878994370085, 6.822012844217397 ], [ -67.041793788752329, 6.782557888136012 ], [ -67.049545254110171, 6.755272732450635 ], [ -67.103392096867765, 6.701451728114762 ], [ -67.128506843116327, 6.638251451343365 ], [ -67.148841519120822, 6.528542385122989 ], [ -67.131142341445866, 6.475548203986421 ], [ -67.170235562321352, 6.429375312220884 ], [ -67.28234758197533, 6.362195949983118 ], [ -67.322345140415905, 6.272511501404665 ], [ -67.355857307169003, 6.243262640958108 ], [ -67.412391324200257, 6.240575465785128 ], [ -67.450972372177205, 6.19803546276637 ], [ -67.490475219999951, 6.201638082000017 ], [ -67.573984334999949, 6.266233622000058 ], [ -67.827198852999942, 6.313414205000072 ], [ -67.868126587999967, 6.279876201000064 ], [ -67.904300089999879, 6.275147807000081 ], [ -67.924143839999971, 6.234555970000144 ], [ -67.977990682999916, 6.217838644000011 ], [ -68.146507527999887, 6.223781433000028 ], [ -68.304172322999932, 6.176988424000101 ], [ -68.4490213629999, 6.194997661000102 ], [ -68.584723673999861, 6.170012106000115 ], [ -68.635314900999902, 6.135879822000049 ], [ -68.807862507999886, 6.184326477000099 ], [ -68.892921915999892, 6.184326477000099 ], [ -69.061128702999895, 6.217838644000011 ], [ -69.246104492999876, 6.08066355400004 ], [ -69.331396443999949, 6.15636952700001 ], [ -69.443637654999947, 6.122237244000132 ], [ -70.129203043999922, 6.972547099000067 ], [ -70.195012979999888, 6.977559713000034 ], [ -70.287617146999935, 6.936942037000094 ], [ -70.31906225599991, 6.938285624000059 ], [ -70.451663981999928, 7.007687073000113 ], [ -70.510704305999866, 7.009702454000063 ], [ -70.57860713799991, 7.085821838000044 ], [ -70.63927526899991, 7.073471171000094 ], [ -70.703302368999886, 7.099929504000073 ], [ -70.895538696999921, 7.06851023300004 ], [ -70.961322794999916, 7.009444072000093 ], [ -71.011268065999872, 6.99089223200005 ], [ -71.13604081299988, 6.99213246700009 ], [ -71.18404821799993, 6.962573547000062 ], [ -71.275515503999969, 6.984381002000077 ], [ -71.292517048999883, 7.025773824000041 ], [ -71.413904988999974, 7.030993144000135 ], [ -71.467700154999903, 7.012441304000106 ], [ -71.509919799999864, 7.034610494000034 ], [ -71.5947208259999, 7.030114645000111 ], [ -71.62040401299987, 7.052128805000095 ], [ -71.65430375199989, 7.053369039000117 ], [ -71.673527384999915, 7.044222310000052 ], [ -71.669599975999944, 7.027737529000063 ], [ -71.77403804599993, 7.028926086000084 ], [ -71.777758748999929, 7.007532044000072 ], [ -71.881008259999902, 6.986603089000084 ], [ -71.99381791199994, 7.012854716000021 ], [ -72.080996052999922, 7.066598206000023 ], [ -72.164143432999907, 7.22080068000011 ], [ -72.166313843999916, 7.334075419000101 ], [ -72.20620804899994, 7.381876119000083 ], [ -72.321808227999952, 7.390040995000106 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-L", "NAME_1": "Mérida" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.218534513694877, 9.187001923563491 ], [ -71.206410285999937, 9.232163804000038 ], [ -71.151722785999937, 9.28851959800005 ], [ -71.072824673999946, 9.313544012000079 ], [ -71.033178066914218, 9.352504381072322 ], [ -70.973595140403404, 9.351264145823677 ], [ -70.917732916940565, 9.302869167777885 ], [ -70.86305925188293, 9.139003201336664 ], [ -70.789058601173508, 9.091202500694862 ], [ -70.776630419258424, 9.066759548014716 ], [ -70.731491055367883, 9.053504542900328 ], [ -70.702474738018736, 8.991596178221016 ], [ -70.677256638982669, 8.985860094467796 ], [ -70.580027432420081, 9.040223700263539 ], [ -70.541864386632142, 9.005316270429546 ], [ -70.53468136295453, 8.955345160350873 ], [ -70.57746944935559, 8.856669012964574 ], [ -70.686945969780652, 8.82362193420488 ], [ -70.727692837054747, 8.764736640583465 ], [ -70.768568894638747, 8.781479803849834 ], [ -70.837711961637694, 8.725462550756106 ], [ -70.910058966847828, 8.624125068417186 ], [ -70.929954393280639, 8.629266872967776 ], [ -70.969667730881042, 8.591930650379197 ], [ -70.9804422681961, 8.506664536838912 ], [ -71.027364467895893, 8.465323391261506 ], [ -71.038371548308305, 8.424343979990681 ], [ -71.077542284448839, 8.376336575572509 ], [ -71.065139940056156, 8.307813626197856 ], [ -71.031498582993208, 8.278952338479598 ], [ -71.011835699657809, 8.219756984697085 ], [ -71.059946458662125, 8.110047919375972 ], [ -71.253784755961703, 7.922772529028975 ], [ -71.429665493167988, 7.802263087971141 ], [ -71.462144131146715, 7.769526069372603 ], [ -71.456692268233553, 7.702424221500621 ], [ -71.483564011869646, 7.684492498929671 ], [ -71.496483120199798, 7.724696763844577 ], [ -71.532785814014119, 7.75828644496346 ], [ -71.506094936631996, 7.829961655705858 ], [ -71.522243821595055, 7.929903875863147 ], [ -71.499945440829435, 7.969927272725442 ], [ -71.507722743709621, 8.005403144239722 ], [ -71.588854743051911, 8.057286282236134 ], [ -71.680761277910619, 8.061162014015736 ], [ -71.711353726393327, 8.049069728884888 ], [ -71.821321174132891, 8.170483507507868 ], [ -71.897104661550884, 8.175470282427568 ], [ -71.886459317243691, 8.232107652246327 ], [ -71.818530646172348, 8.310371609262347 ], [ -71.810779181713826, 8.339232896081285 ], [ -71.829641079372323, 8.395405177906639 ], [ -71.771065843214103, 8.480929673865319 ], [ -71.817135383091454, 8.587047227347625 ], [ -71.944931199715086, 8.611412664762668 ], [ -71.833310105576913, 8.673166002508992 ], [ -71.802640143627741, 8.658283189417659 ], [ -71.808066169018446, 8.619629218113914 ], [ -71.758534309410834, 8.630197048055322 ], [ -71.726029833010386, 8.617226263781049 ], [ -71.673526577389623, 8.718796291915339 ], [ -71.29634029836609, 9.013610338146577 ], [ -71.225595261811861, 9.048388576771401 ], [ -71.194563564656789, 8.996247057255857 ], [ -71.157304857333315, 9.011129869447927 ], [ -71.147382981639282, 9.127815252871585 ], [ -71.218534513694877, 9.187001923563491 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-T", "NAME_1": "Trujillo" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.058672448148286, 9.337930190416188 ], [ -71.090809699999909, 9.544094143000052 ], [ -71.062446101576569, 9.617403481272083 ], [ -70.851354540379702, 9.602204901834739 ], [ -70.794045376093209, 9.678608506877083 ], [ -70.75689002065792, 9.692431951873061 ], [ -70.761540899692761, 9.716461493403187 ], [ -70.737692227114565, 9.761704210081234 ], [ -70.694929979135225, 9.746743883523379 ], [ -70.656172655043974, 9.777077947789053 ], [ -70.636328904555285, 9.839942327776214 ], [ -70.661159430863052, 9.904512030106105 ], [ -70.662012091584756, 9.955826728220927 ], [ -70.608630336820568, 10.031558538795537 ], [ -70.566410692099737, 10.030318305345475 ], [ -70.56144975470238, 9.989338894074706 ], [ -70.5167496412829, 9.92851573321451 ], [ -70.454686245174059, 9.896243800810737 ], [ -70.351643438693714, 9.92603526541518 ], [ -70.329319221305013, 9.88632192601608 ], [ -70.279658168689537, 9.873893744100997 ], [ -70.247386237185083, 9.82673900040453 ], [ -70.213331468072795, 9.84580760273866 ], [ -70.160750698985566, 9.785294501140299 ], [ -70.09413977662939, 9.775837714339048 ], [ -70.01584998209097, 9.698943182881578 ], [ -70.032825690253389, 9.668454088085696 ], [ -70.074709439089304, 9.666051133752831 ], [ -70.13480913043702, 9.610731513548501 ], [ -70.109280972139118, 9.517145493869407 ], [ -70.062152065965051, 9.492650865245196 ], [ -70.032980719884279, 9.430329088516601 ], [ -70.064580857820317, 9.356328436907802 ], [ -70.137832200595597, 9.258014023828139 ], [ -70.092331102398418, 9.239229641434804 ], [ -70.065356005075557, 9.252277940074862 ], [ -70.059361538004566, 9.236826687101939 ], [ -70.062720505846642, 9.143654080371505 ], [ -70.124112108387067, 9.020069892311653 ], [ -70.182454799649292, 9.0078742543933 ], [ -70.271312425028384, 9.023403021732065 ], [ -70.426729295920268, 9.022472845745199 ], [ -70.496079067594906, 8.999270128313754 ], [ -70.53468136295453, 8.955345160350873 ], [ -70.541864386632142, 9.005316270429546 ], [ -70.580027432420081, 9.040223700263539 ], [ -70.695162523131899, 8.985059108790836 ], [ -70.731491055367883, 9.053504542900328 ], [ -70.776630419258424, 9.066759548014716 ], [ -70.789058601173508, 9.091202500694862 ], [ -70.86305925188293, 9.139003201336664 ], [ -70.927654791735222, 9.312791043471861 ], [ -70.973595140403404, 9.351264145823677 ], [ -71.033178066914218, 9.352504381072322 ], [ -71.058672448148286, 9.337930190416188 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-I", "NAME_1": "Falcón" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.282012498999904, 10.991441148000092 ], [ -70.869699673999946, 11.196275132000039 ], [ -70.685617641999897, 11.248032945000091 ], [ -70.629750128999945, 11.239203192000048 ], [ -70.51390540299991, 11.253159898000092 ], [ -70.480132615999935, 11.289007880000042 ], [ -70.507435675999943, 11.261664130000042 ], [ -70.510609503999945, 11.286363023000092 ], [ -70.486439581999946, 11.295111395000049 ], [ -70.433948348999934, 11.287597019000088 ], [ -70.287953253999945, 11.357082424000055 ], [ -70.231067497999902, 11.351587093000091 ], [ -70.159006313999953, 11.401434637000079 ], [ -70.14517167899993, 11.428941148000092 ], [ -70.146003777999908, 11.454411962000052 ], [ -70.164402948999907, 11.462932823000074 ], [ -70.154466002999925, 11.469974238000077 ], [ -70.099373864999905, 11.429547051000043 ], [ -70.079009568999936, 11.45734284100007 ], [ -70.036529100999928, 11.440904039000088 ], [ -70.053909272999931, 11.506482221000056 ], [ -70.119862433999913, 11.522406317000048 ], [ -70.096301319999952, 11.531066220000071 ], [ -70.161597534999942, 11.568545162000078 ], [ -70.02437386899993, 11.51407335500005 ], [ -69.975624951999919, 11.502896389000057 ], [ -69.945977997999933, 11.519773538000038 ], [ -69.925898823999944, 11.513060548000055 ], [ -69.844604512999922, 11.436231517000067 ], [ -69.814076300999943, 11.425604559000078 ], [ -69.75999915299991, 11.468085028000075 ], [ -69.743641730999911, 11.50336334800005 ], [ -69.816029425999943, 11.69367096600007 ], [ -69.825021938999953, 11.67523834800005 ], [ -69.849517381999931, 11.69367096600007 ], [ -69.927723761999914, 11.658433335000041 ], [ -69.950062628999945, 11.656683661000045 ], [ -69.945139126999948, 11.673244533000059 ], [ -70.186512824999909, 11.602687893000052 ], [ -70.229888475999928, 11.627875067000048 ], [ -70.233143683999913, 11.652736721000053 ], [ -70.212391730999911, 11.687201239000046 ], [ -70.233143683999913, 11.74835846600007 ], [ -70.205799933999913, 11.73468659100007 ], [ -70.205922003999945, 11.762518622000073 ], [ -70.223947719999899, 11.788397528000075 ], [ -70.240589972999942, 11.761948960000041 ], [ -70.284535285999937, 11.857326565000051 ], [ -70.301991339999915, 11.85814036700009 ], [ -70.283558722999942, 11.939642645000049 ], [ -70.213246222999942, 12.056789455000057 ], [ -70.205799933999913, 12.112005927000041 ], [ -70.144276495999918, 12.117987372000073 ], [ -70.064564581999946, 12.181463934000078 ], [ -70.017730272999927, 12.198919989000046 ], [ -69.925363735999952, 12.15961334800005 ], [ -69.835316535999937, 12.015204169000071 ], [ -69.808583136999914, 11.803615627000056 ], [ -69.747141079999949, 11.63226959800005 ], [ -69.665842251999948, 11.497748114000046 ], [ -69.623605923999946, 11.467759507000039 ], [ -69.588693813999953, 11.463039455000057 ], [ -69.500070766999897, 11.508734442000048 ], [ -69.376698370999918, 11.494045315000051 ], [ -69.270415818999936, 11.536037502000056 ], [ -69.109038865999935, 11.491359768000052 ], [ -69.061879035999937, 11.453517971000053 ], [ -68.84439042899993, 11.447414455000057 ], [ -68.754383917999917, 11.374090887000079 ], [ -68.655669725999928, 11.347886460000041 ], [ -68.615223761999914, 11.303412177000041 ], [ -68.517974412999934, 11.249335028000075 ], [ -68.483509894999941, 11.206935940000051 ], [ -68.417591925999943, 11.17914459800005 ], [ -68.403309699999909, 11.200262762000079 ], [ -68.388661261999914, 11.128241278000075 ], [ -68.278431769999941, 10.925482489000046 ], [ -68.287261522999927, 10.91282786700009 ], [ -68.335072394999941, 10.939601955000057 ], [ -68.376616990999935, 10.919094143000052 ], [ -68.262684699999909, 10.903143622000073 ], [ -68.238840298999946, 10.884955145000049 ], [ -68.266184048999946, 10.858099677000041 ], [ -68.326568162999934, 10.849269924000055 ], [ -68.331939256999931, 10.829575914000088 ], [ -68.318348761999914, 10.745184637000079 ], [ -68.27375240799995, 10.63422272300005 ], [ -68.519378018280918, 10.638575751469716 ], [ -68.591389125807495, 10.678314928391217 ], [ -68.596350064104172, 10.720508734690327 ], [ -68.633582933005925, 10.73293691750473 ], [ -68.76920773025256, 10.732471829511326 ], [ -68.80928280305892, 10.686221422480628 ], [ -68.885505540947918, 10.659530544199242 ], [ -68.924107836307599, 10.697331854781282 ], [ -69.126266038846609, 10.681260484184008 ], [ -69.426092699318588, 10.7119046095101 ], [ -69.498594733260347, 10.695135606023371 ], [ -69.537197027720651, 10.742006129779043 ], [ -69.663933478047568, 10.764666245750618 ], [ -69.789868943596844, 10.701440131456877 ], [ -69.821236538435471, 10.701750189819393 ], [ -69.806069505403343, 10.720353705059438 ], [ -69.823794522399282, 10.730301418275815 ], [ -69.866582607901023, 10.698003648349697 ], [ -69.969315355119534, 10.690484726988529 ], [ -70.047217576929597, 10.645267848732203 ], [ -70.15749508303162, 10.651701565374935 ], [ -70.247179531610072, 10.558373928114293 ], [ -70.330275234814223, 10.558063869751777 ], [ -70.414533657102595, 10.483804835724584 ], [ -70.49230668770349, 10.447424628443855 ], [ -70.535378994045345, 10.363011176524537 ], [ -70.613177863067904, 10.341462103693118 ], [ -70.658084682961714, 10.304771837150554 ], [ -70.729036424191634, 10.331979478470146 ], [ -70.745185310054012, 10.415126858517681 ], [ -70.778697475907791, 10.453625800190537 ], [ -70.903134324689347, 10.442902939718863 ], [ -70.95734290175352, 10.460292059930623 ], [ -71.014832933193304, 10.518867296088843 ], [ -71.039663458601694, 10.589560654900311 ], [ -71.081004605078476, 10.638575751469716 ], [ -71.08046200181991, 10.756759752560527 ], [ -71.246007453081461, 10.908352565818234 ], [ -71.282012498999904, 10.991441148000092 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-U", "NAME_1": "Yaracuy" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -68.27375240799995, 10.63422272300005 ], [ -68.251739062407808, 10.595119533539616 ], [ -68.281692268283564, 10.558580633689303 ], [ -68.314351773415581, 10.539434516090012 ], [ -68.362669237095588, 10.548581244528805 ], [ -68.389540981631001, 10.493494168321206 ], [ -68.394114346300057, 10.358179430336406 ], [ -68.361609869899553, 10.260898546031058 ], [ -68.423182338693948, 10.172919419795392 ], [ -68.415146654294631, 10.073907376524176 ], [ -68.370498215919895, 9.990036526064785 ], [ -68.522556118070383, 9.895856228082437 ], [ -68.542968309339983, 9.904382838896879 ], [ -68.52829220182366, 9.923012193457964 ], [ -68.582113207058853, 9.952106025172895 ], [ -68.582242398268079, 10.00502269104436 ], [ -68.629939745223055, 10.01037120206928 ], [ -68.66970475876758, 9.9687975124952 ], [ -68.804321865661564, 9.960865179984069 ], [ -68.851786668619866, 9.860018622261578 ], [ -68.885014615432169, 9.851078599397852 ], [ -68.977722134169142, 9.857279771144533 ], [ -68.924469570614178, 9.935026964223027 ], [ -68.958808559667261, 10.000216783277892 ], [ -68.979117398149413, 10.00982859881077 ], [ -69.071954108095611, 9.958152167288688 ], [ -69.079473028557402, 9.886011868552885 ], [ -69.105311245217763, 9.882032782187139 ], [ -69.139210984699162, 9.933399156246026 ], [ -69.141510586244522, 10.005332750306195 ], [ -69.22747433087568, 10.110132555073335 ], [ -69.237551236200602, 10.14708120403435 ], [ -69.219567836786212, 10.171834215076956 ], [ -69.162077806245748, 10.128064276744965 ], [ -69.117997809551241, 10.202710883500458 ], [ -69.014980842391935, 10.24841868727259 ], [ -69.027176480310288, 10.423059190129493 ], [ -69.060559454954898, 10.419260972715676 ], [ -69.072083299304836, 10.437942003220883 ], [ -69.020096809420181, 10.554782416275486 ], [ -68.964389614688969, 10.556875312245836 ], [ -68.901137661074188, 10.598009752248231 ], [ -68.885505540947918, 10.659530544199242 ], [ -68.80928280305892, 10.686221422480628 ], [ -68.76920773025256, 10.732471829511326 ], [ -68.613713344994892, 10.727975979208054 ], [ -68.596350064104172, 10.720508734690327 ], [ -68.591389125807495, 10.678314928391217 ], [ -68.519378018280918, 10.638575751469716 ], [ -68.27375240799995, 10.63422272300005 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-G", "NAME_1": "Carabobo" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -68.251739062407808, 10.595119533539616 ], [ -68.209584113999938, 10.537258205000057 ], [ -68.12954667899993, 10.48773834800005 ], [ -68.006459113999938, 10.488470770000049 ], [ -67.941232876999948, 10.466457424000055 ], [ -67.87328040299991, 10.476467190000051 ], [ -67.874223599139782, 10.379444281428448 ], [ -67.818748949304563, 10.322419337982069 ], [ -67.757641567604253, 10.343606676506909 ], [ -67.671962042913947, 10.324357205220849 ], [ -67.654107835608102, 10.299836738174918 ], [ -67.670050014996207, 10.244439601806164 ], [ -67.654495409235722, 10.103931383326653 ], [ -67.687361619942806, 10.063287868840064 ], [ -67.690177985425692, 10.024349676696204 ], [ -67.662169359328459, 10.032876288409966 ], [ -67.553235440363267, 9.993989773109547 ], [ -67.529025030780531, 9.906785793229744 ], [ -67.566697150153345, 9.916888536077067 ], [ -67.597263760214332, 9.860173651892524 ], [ -67.627339443860251, 9.871568305033236 ], [ -67.699066332345353, 9.842319443687359 ], [ -67.70441484157169, 9.882962958173948 ], [ -67.736583421187902, 9.892988185756167 ], [ -67.765367193641055, 9.926267808512534 ], [ -67.799189418756669, 9.930453599553971 ], [ -67.814072231848002, 9.917586168067203 ], [ -67.788828295289591, 9.827049057867725 ], [ -67.86724728103718, 9.819659329514423 ], [ -67.98788591240492, 9.835188096853187 ], [ -68.002846238962775, 9.853946640824802 ], [ -67.986568162790491, 9.878699652766727 ], [ -67.995327317601607, 9.88934499797324 ], [ -68.072092657849851, 9.856763007207007 ], [ -68.241668871421268, 9.987013455006945 ], [ -68.253502774133722, 10.021455796847533 ], [ -68.205211147976115, 10.062900295212444 ], [ -68.241668871421268, 10.128684394369316 ], [ -68.302724575378818, 10.069799098949261 ], [ -68.338923916405633, 10.003162339970004 ], [ -68.370498215919895, 9.990036526064785 ], [ -68.390548671983595, 10.006805527752874 ], [ -68.415146654294631, 10.073907376524176 ], [ -68.423182338693948, 10.172919419795392 ], [ -68.361609869899553, 10.260898546031058 ], [ -68.394114346300057, 10.358179430336406 ], [ -68.389540981631001, 10.493494168321206 ], [ -68.362669237095588, 10.548581244528805 ], [ -68.309597540693915, 10.540364692076878 ], [ -68.251739062407808, 10.595119533539616 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-D", "NAME_1": "Aragua" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.869214081264829, 10.461281869062987 ], [ -67.77757727799991, 10.495998440000051 ], [ -67.391753709999932, 10.543076890000066 ], [ -67.405130785257541, 10.515301621772437 ], [ -67.339605069418383, 10.395903224754022 ], [ -67.289453091287101, 10.428097641892634 ], [ -67.238655158009124, 10.430578111490661 ], [ -67.174317999675907, 10.354846300016732 ], [ -67.186461961650195, 10.313040066445922 ], [ -67.108740606993422, 10.264851793075763 ], [ -67.134165411604442, 10.154522610130357 ], [ -67.119101732259139, 10.111476142210165 ], [ -67.088276739779701, 10.082847398488639 ], [ -67.04161292159904, 10.053133450048676 ], [ -67.002933111873631, 10.074915065977507 ], [ -66.978645188824373, 10.071581936557095 ], [ -66.92371314224772, 10.009983629341036 ], [ -66.878522100614418, 9.999829210549592 ], [ -66.791421475320817, 10.012774156402202 ], [ -66.748168300926352, 9.99112173078322 ], [ -66.612750210154047, 9.966446235005719 ], [ -66.583759732125941, 9.798782050251418 ], [ -66.622749600213865, 9.754805406344417 ], [ -66.621070116292799, 9.720983181228803 ], [ -66.54306454079591, 9.622746283414244 ], [ -66.574199591637807, 9.527713323810815 ], [ -66.556577928328693, 9.470920925260486 ], [ -66.580555793015435, 9.401932887892428 ], [ -66.67969702839514, 9.393483792343147 ], [ -66.881648526258459, 9.459888007325674 ], [ -66.997326219329523, 9.452291570699401 ], [ -66.980505540798049, 9.5093165150451 ], [ -66.898985968727459, 9.536549993887093 ], [ -66.876377529599324, 9.56176809292316 ], [ -66.855861986441482, 9.60455617932422 ], [ -66.858730027868489, 9.672252306398832 ], [ -66.948543666756791, 9.691734320782246 ], [ -66.986215786129605, 9.749999498578006 ], [ -67.101609260159194, 9.799505519763898 ], [ -67.18134599462195, 9.919834092769179 ], [ -67.26384741862347, 9.91112661390207 ], [ -67.28557735860818, 9.93138377554078 ], [ -67.340612758871714, 9.92642283814348 ], [ -67.428126797113975, 9.987401027735245 ], [ -67.534115160286433, 9.951485907548602 ], [ -67.56584448943164, 10.001844591254894 ], [ -67.662169359328459, 10.032876288409966 ], [ -67.687309943099365, 10.021378282481749 ], [ -67.687361619942806, 10.063287868840064 ], [ -67.654495409235722, 10.103931383326653 ], [ -67.670050014996207, 10.244439601806164 ], [ -67.656278245944293, 10.306141261809785 ], [ -67.681186285718525, 10.329705715346449 ], [ -67.751466234279292, 10.343296617245073 ], [ -67.818748949304563, 10.322419337982069 ], [ -67.874223599139782, 10.379444281428448 ], [ -67.869214081264829, 10.461281869062987 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-X", "NAME_1": "Vargas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.391753709999932, 10.543076890000066 ], [ -67.170033331999946, 10.555975653000075 ], [ -67.01235917899993, 10.611232815000051 ], [ -66.541574673999946, 10.632717190000051 ], [ -66.333973761999914, 10.611232815000051 ], [ -66.313613633996283, 10.629491642220193 ], [ -66.307988450706432, 10.592816269954881 ], [ -66.311631639388622, 10.540287176811773 ], [ -66.3250675116563, 10.530675361278895 ], [ -66.354316372102858, 10.545325629474235 ], [ -66.439737515274089, 10.537109076122931 ], [ -66.577946133107559, 10.560466824084642 ], [ -66.602544115418596, 10.544162909490694 ], [ -66.949034593171916, 10.54927887651894 ], [ -67.006834682974215, 10.575117092279982 ], [ -67.015800544259719, 10.544317939121584 ], [ -67.053240118736483, 10.525456041463144 ], [ -67.053343472423308, 10.478766383961442 ], [ -67.220154994657264, 10.416677151229521 ], [ -67.238655158009124, 10.430578111490661 ], [ -67.289453091287101, 10.428097641892634 ], [ -67.339605069418383, 10.395903224754022 ], [ -67.405130785257541, 10.515301621772437 ], [ -67.391753709999932, 10.543076890000066 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-M", "NAME_1": "Miranda" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -66.313613633996283, 10.629491642220193 ], [ -66.29515540299991, 10.646714585000041 ], [ -66.251779751999948, 10.648586330000057 ], [ -66.104400193999936, 10.584418036000045 ], [ -66.046538865999935, 10.57648346600007 ], [ -66.076161261999914, 10.548895575000074 ], [ -66.121693488999938, 10.542954820000091 ], [ -66.122222459999932, 10.507025458000044 ], [ -65.952870245999918, 10.351629950000074 ], [ -65.882069464999915, 10.309556382000039 ], [ -65.92992102799991, 10.323187567000048 ], [ -65.944162563999953, 10.309556382000039 ], [ -65.923003709999932, 10.282212632000039 ], [ -65.896962042999917, 10.287990627000056 ], [ -65.802113410999937, 10.225653387000079 ], [ -65.717640753999945, 10.22016022300005 ], [ -65.847320115999935, 10.281398830000057 ], [ -65.868478969999899, 10.309556382000039 ], [ -65.580433722999942, 10.185451565000051 ], [ -65.425770636999914, 10.143418687000064 ], [ -65.43855831631322, 10.095327257247106 ], [ -65.633300951177944, 9.972208157180717 ], [ -65.664539353908026, 9.979417019279992 ], [ -65.745412970831921, 9.939238592786808 ], [ -65.86178829589312, 9.956834418573521 ], [ -65.971032274120148, 9.92890330684213 ], [ -66.0618277658387, 9.956446844945901 ], [ -66.111695523129868, 9.94776520450057 ], [ -66.132676154281057, 9.966601263737346 ], [ -66.190476244083413, 9.948695380487379 ], [ -66.392479417890797, 10.019440416142288 ], [ -66.450124478062207, 9.981975002344484 ], [ -66.527819994297261, 9.96838410134518 ], [ -66.665925259343226, 9.973215847533311 ], [ -66.791421475320817, 10.012774156402202 ], [ -66.878522100614418, 9.999829210549592 ], [ -66.929888474673362, 10.01308421476466 ], [ -66.978645188824373, 10.071581936557095 ], [ -67.002933111873631, 10.074915065977507 ], [ -67.04161292159904, 10.053133450048676 ], [ -67.119101732259139, 10.111476142210165 ], [ -67.134113735660378, 10.162119044957933 ], [ -67.108740606993422, 10.264851793075763 ], [ -67.186461961650195, 10.313040066445922 ], [ -67.174317999675907, 10.354846300016732 ], [ -67.220154994657264, 10.416677151229521 ], [ -67.153182338893828, 10.440732530282048 ], [ -67.051483119550312, 10.394507960773751 ], [ -66.943686083046259, 10.421431383051868 ], [ -66.897435676015618, 10.416212063236117 ], [ -66.881028407734846, 10.481401882291038 ], [ -66.854285855307978, 10.511503404358621 ], [ -66.873767869691449, 10.547030950917645 ], [ -66.863200038850721, 10.552844549936026 ], [ -66.602544115418596, 10.544162909490694 ], [ -66.577946133107559, 10.560466824084642 ], [ -66.439737515274089, 10.537109076122931 ], [ -66.354316372102858, 10.545325629474235 ], [ -66.3250675116563, 10.530675361278895 ], [ -66.311631639388622, 10.540287176811773 ], [ -66.313613633996283, 10.629491642220193 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-B", "NAME_1": "Anzoátegui" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -65.425770636999914, 10.143418687000064 ], [ -65.169545050999943, 10.097316799000055 ], [ -65.080189581999946, 10.062567450000074 ], [ -65.175689256999931, 10.083644924000055 ], [ -65.148915167999917, 10.058417059000078 ], [ -65.073353644999941, 10.048895575000074 ], [ -64.963490363999938, 10.097316799000055 ], [ -64.776600714999915, 10.090399481000077 ], [ -64.728627081999946, 10.136053778000075 ], [ -64.71703040299991, 10.227606512000079 ], [ -64.67609615799995, 10.213324286000045 ], [ -64.696603969999899, 10.199693101000037 ], [ -64.667632615999935, 10.187323309000078 ], [ -64.657622850999928, 10.196682033000059 ], [ -64.66860917899993, 10.207098700000074 ], [ -64.631418423999946, 10.248114325000074 ], [ -64.572417772999927, 10.261704820000091 ], [ -64.579904751999948, 10.248114325000074 ], [ -64.536081508999928, 10.252305406000062 ], [ -64.514738735903904, 10.223510647498358 ], [ -64.445750697636583, 10.193228258277486 ], [ -64.43582882284187, 10.146228543312588 ], [ -64.347307095146334, 10.094629625256971 ], [ -64.305707567150478, 10.101373399362899 ], [ -64.246951462939649, 10.070961818932801 ], [ -64.153830532153336, 10.079281724172233 ], [ -64.045310025237484, 10.128296820741696 ], [ -63.979164190874712, 10.115119329993092 ], [ -63.948830125709719, 10.082614854491908 ], [ -64.055748663969666, 10.053805242717772 ], [ -64.061665614876233, 9.968642482864254 ], [ -64.034173753615846, 9.935647080948002 ], [ -63.988388433679233, 9.935259508219701 ], [ -63.990067919398939, 9.916190904086932 ], [ -63.922552660376994, 9.869785468324665 ], [ -63.945574509755829, 9.840846666240623 ], [ -63.964462245835989, 9.762169298074639 ], [ -63.942990689168937, 9.702043769204579 ], [ -63.846639980850398, 9.550605983779121 ], [ -63.96908728734843, 9.4110279403871 ], [ -63.973221402445745, 9.323875637350795 ], [ -63.920356410719762, 9.26514537246095 ], [ -63.906300421727053, 9.205484931584294 ], [ -63.771890021307456, 9.236284084742692 ], [ -63.633629726630545, 9.167476915427301 ], [ -63.597585415234732, 9.117970893342033 ], [ -63.418061490245577, 9.008261827121601 ], [ -63.371345995221475, 8.918654892908989 ], [ -63.338453946092727, 8.805380154170791 ], [ -63.300936856350859, 8.777914130432748 ], [ -62.949278733826475, 8.793907985764918 ], [ -62.963257209352719, 8.759362291136824 ], [ -63.024261237366204, 8.76005992312696 ], [ -63.055396288208101, 8.709106960218037 ], [ -63.040720180691778, 8.595909735845623 ], [ -62.98832027875784, 8.552604885507037 ], [ -62.742753872193418, 8.473384914981807 ], [ -62.746939663234855, 8.432353826867597 ], [ -62.685832282433864, 8.385715847108656 ], [ -62.770607468659762, 8.375251369954753 ], [ -62.84553829625537, 8.293938503459174 ], [ -62.906929897896475, 8.266885890871151 ], [ -62.961706915741559, 8.284430039814481 ], [ -62.976899787195407, 8.309518948540642 ], [ -63.174639654696307, 8.313446357163627 ], [ -63.249570482291915, 8.28554108295458 ], [ -63.33080583442171, 8.213891709734582 ], [ -63.400026414887122, 8.221927395033219 ], [ -63.473561977603197, 8.150200507447437 ], [ -63.66768449574289, 8.159760647036194 ], [ -63.760727912163418, 8.12118419009829 ], [ -63.811990933434799, 8.130976874583098 ], [ -63.839896205845207, 8.110409654581872 ], [ -63.885371467419304, 8.018193061360705 ], [ -63.981127895635893, 7.967446804026793 ], [ -64.065903082761054, 7.98127024992209 ], [ -64.125563523637709, 7.965870672893232 ], [ -64.231629401175894, 8.071445624016349 ], [ -64.283254156753912, 8.081419176553766 ], [ -64.312942267671531, 8.06545115784462 ], [ -64.35239722375286, 8.008968818556127 ], [ -64.450065680786508, 7.990623683935837 ], [ -64.506237961712543, 7.99917613407132 ], [ -64.537114631035365, 7.98393158577403 ], [ -64.552514208064224, 7.925252996828306 ], [ -64.546158005787333, 7.896650092427819 ], [ -64.481562465935042, 7.843500880761042 ], [ -64.478151822148845, 7.814691269886168 ], [ -64.495463426196125, 7.790790920464588 ], [ -64.550963915352384, 7.765288601487782 ], [ -64.63705685119271, 7.771748154753539 ], [ -64.838465745797521, 7.660204575880471 ], [ -64.873063117269055, 7.666069850842916 ], [ -64.99607886364862, 7.770688788456823 ], [ -65.103695033898703, 7.834379990743969 ], [ -65.278077155236531, 7.874274197296359 ], [ -65.35665116971569, 7.869416611787187 ], [ -65.389207322959578, 7.920602117793464 ], [ -65.484498664082082, 7.930989081480902 ], [ -65.496074185275404, 7.979642441945145 ], [ -65.480467901772215, 8.023929145113925 ], [ -65.395098436343744, 8.112993476068027 ], [ -65.365927090262971, 8.184927070128197 ], [ -65.206634487591543, 8.369360256570587 ], [ -65.150100470560233, 8.556635646917584 ], [ -65.170771044248283, 8.646630153858496 ], [ -65.145501268368832, 8.731121121042861 ], [ -65.079949714108011, 8.756881822438118 ], [ -65.008842943247203, 8.738820909557319 ], [ -64.864071417561888, 8.74099131899419 ], [ -64.845958827837649, 8.773108221767018 ], [ -64.846268887099427, 8.829590561954831 ], [ -64.789941575643184, 8.878088893687504 ], [ -64.809604458079264, 8.914934189860958 ], [ -64.885749680703213, 8.982423611360559 ], [ -64.937348598758831, 9.003765976818386 ], [ -64.945151740060737, 9.06280630097001 ], [ -64.977604539617801, 9.111537176699358 ], [ -65.073154263158699, 9.173833115905552 ], [ -65.164879929964798, 9.178639024571339 ], [ -65.258285081591225, 9.277185980748413 ], [ -65.284588386244991, 9.376559760124792 ], [ -65.206737840379049, 9.434308173083707 ], [ -65.218210007885546, 9.50683604634645 ], [ -65.369570278945218, 9.554791774820558 ], [ -65.430600145380367, 9.650522366414066 ], [ -65.488839483855088, 9.569209499918486 ], [ -65.700376959728885, 9.685817368976359 ], [ -65.664952765957366, 9.773977363264692 ], [ -65.702624885330181, 9.846272690732064 ], [ -65.696604579837469, 9.953423773888062 ], [ -65.664539353908026, 9.979417019279992 ], [ -65.638287726097644, 9.970735377935341 ], [ -65.562194180317135, 10.006262926293005 ], [ -65.448945279101338, 10.079643460277453 ], [ -65.425770636999914, 10.143418687000064 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-R", "NAME_1": "Sucre" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -64.536081508999928, 10.252305406000062 ], [ -64.49054928299995, 10.240668036000045 ], [ -64.376698370999918, 10.300767320000091 ], [ -64.382232225999928, 10.316961981000077 ], [ -64.432769334999932, 10.305975653000075 ], [ -64.470041469999899, 10.323187567000048 ], [ -64.380604620999918, 10.343695380000042 ], [ -64.380604620999918, 10.370998440000051 ], [ -64.402414516999954, 10.370998440000051 ], [ -64.381255662999934, 10.386216539000088 ], [ -64.357411261999914, 10.338690497000073 ], [ -64.339182094999899, 10.390692450000074 ], [ -64.210560675999943, 10.439276434000078 ], [ -64.188547329999949, 10.477606512000079 ], [ -64.127674933999913, 10.477606512000079 ], [ -64.051828579999949, 10.447943427000041 ], [ -63.943023240999935, 10.46039459800005 ], [ -63.863636847999942, 10.446112372000073 ], [ -63.655018683999913, 10.494533596000053 ], [ -63.729725714999915, 10.49750397300005 ], [ -63.823150193999936, 10.549383856000077 ], [ -63.923736131999931, 10.560288804000038 ], [ -63.966664191999939, 10.581366278000075 ], [ -64.045480923999946, 10.570257880000042 ], [ -64.031849738999938, 10.590073960000041 ], [ -64.08617102799991, 10.56712474200009 ], [ -64.169056769999941, 10.570257880000042 ], [ -64.233876105999911, 10.515041408000059 ], [ -64.249134894999941, 10.520453192000048 ], [ -64.297678188999953, 10.61985911700009 ], [ -64.270741339999915, 10.672674872000073 ], [ -64.240793423999946, 10.646063544000071 ], [ -64.14476477799991, 10.617417710000041 ], [ -64.048898891999954, 10.652167059000078 ], [ -64.031849738999938, 10.637884833000044 ], [ -63.915109829999949, 10.631048895000049 ], [ -63.846831834999932, 10.652167059000078 ], [ -63.812123175999943, 10.71360911700009 ], [ -63.756947394999941, 10.665594794000071 ], [ -63.553334113999938, 10.629136460000041 ], [ -63.466175910999937, 10.667629299000055 ], [ -63.404896613999938, 10.665838934000078 ], [ -63.387562628999945, 10.699367580000057 ], [ -63.339751756999931, 10.672674872000073 ], [ -63.331532355999911, 10.685370184000078 ], [ -63.251291469999899, 10.680568752000056 ], [ -63.161610480999911, 10.73468659100007 ], [ -63.137440558999913, 10.706773179000038 ], [ -63.014230923999946, 10.721096096000053 ], [ -62.928212042999917, 10.699367580000057 ], [ -62.705677863999938, 10.76203034100007 ], [ -62.638050910999937, 10.742621161000045 ], [ -62.154204881999931, 10.686346747000073 ], [ -62.102406378999945, 10.71360911700009 ], [ -62.036244269999941, 10.714016018000052 ], [ -61.982329881999931, 10.73468659100007 ], [ -61.935170050999943, 10.721096096000053 ], [ -61.845773891999954, 10.74095286700009 ], [ -61.876861131999931, 10.722723700000074 ], [ -61.886708136999914, 10.680121161000045 ], [ -61.897694464999915, 10.690375067000048 ], [ -61.962473110999952, 10.652167059000078 ], [ -62.088937954999949, 10.631293036000045 ], [ -62.17446855399993, 10.642279364000046 ], [ -62.252674933999913, 10.632391669000071 ], [ -62.334950324999909, 10.530218817000048 ], [ -62.66234290299991, 10.56704336100006 ], [ -62.923329230999911, 10.530829169000071 ], [ -63.010812954999949, 10.453558661000045 ], [ -62.894113735999952, 10.529282945000091 ], [ -62.857004360999952, 10.53156159100007 ], [ -62.841175910999937, 10.511786200000074 ], [ -62.831125454999949, 10.406805731000077 ], [ -62.866118943999936, 10.391506252000056 ], [ -62.897816535999937, 10.412014065000051 ], [ -62.995187954999949, 10.407863674000055 ], [ -63.003977016999954, 10.384670315000051 ], [ -62.975982225999928, 10.398342190000051 ], [ -62.956166144999941, 10.357367255000042 ], [ -62.997141079999949, 10.323187567000048 ], [ -62.978586391999954, 10.310980536000045 ], [ -63.003977016999954, 10.275376695000091 ], [ -62.931630011999914, 10.285630601000037 ], [ -62.957102016999954, 10.383775132000039 ], [ -62.942494269999941, 10.405178127000056 ], [ -62.879790818999936, 10.370998440000051 ], [ -62.801625128999945, 10.405178127000056 ], [ -62.764475063999953, 10.395331122000073 ], [ -62.674956834999932, 10.293361721000053 ], [ -62.674956834999932, 10.213324286000045 ], [ -62.626576300999943, 10.130804755000042 ], [ -62.656605597999942, 10.082180080000057 ], [ -62.712554490999935, 10.069322007000039 ], [ -62.777455206999946, 10.086493231000077 ], [ -62.822743292999917, 10.042059637000079 ], [ -62.851389126999948, 10.08038971600007 ], [ -62.894113735999952, 10.069322007000039 ], [ -62.901519334999932, 10.103461005000042 ], [ -62.935129360999952, 10.083644924000055 ], [ -62.963002081999946, 10.110296942000048 ], [ -62.989328579999949, 10.096258856000077 ], [ -63.030488246635286, 10.105869248766794 ], [ -63.063535326294243, 10.187259630527535 ], [ -63.102421840695399, 10.184004015472908 ], [ -63.112757128438716, 10.218678901310227 ], [ -63.191977098064626, 10.167648424035519 ], [ -63.220605841786153, 10.193848375002517 ], [ -63.379820930091853, 10.244672145802895 ], [ -63.402765266004224, 10.257952989338946 ], [ -63.40770036497986, 10.283713690734203 ], [ -63.463381721289409, 10.314667874422867 ], [ -63.532343920235746, 10.281698310028958 ], [ -63.555029872830346, 10.229634303979935 ], [ -63.730238817367535, 10.205346380930735 ], [ -63.800777147447377, 10.127754218382449 ], [ -63.948830125709719, 10.082614854491908 ], [ -63.979164190874712, 10.115119329993092 ], [ -64.037351854304632, 10.12914948236272 ], [ -64.153830532153336, 10.079281724172233 ], [ -64.246951462939649, 10.070961818932801 ], [ -64.305707567150478, 10.101373399362899 ], [ -64.347307095146334, 10.094629625256971 ], [ -64.43582882284187, 10.146228543312588 ], [ -64.445750697636583, 10.193228258277486 ], [ -64.514738735903904, 10.223510647498358 ], [ -64.536081508999928, 10.252305406000062 ] ] ], [ [ [ -62.665150519999941, 10.366359768000052 ], [ -62.649403449999909, 10.344916083000044 ], [ -62.659820115999935, 10.31000397300005 ], [ -62.710316535999937, 10.372015692000048 ], [ -62.787587042999917, 10.430121161000045 ], [ -62.781117316999939, 10.49290599200009 ], [ -62.665150519999941, 10.366359768000052 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-N", "NAME_1": "Monagas" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -63.013091600999928, 10.097398179000038 ], [ -62.982167120999918, 10.06907786700009 ], [ -62.952992316999939, 10.088080145000049 ], [ -62.936024542999917, 10.008246161000045 ], [ -62.920765753999945, 10.007961330000057 ], [ -62.931711391999954, 10.065008856000077 ], [ -62.914621548999946, 10.083644924000055 ], [ -62.911203579999949, 10.052313544000071 ], [ -62.895578579999949, 10.044012762000079 ], [ -62.853138800999943, 10.055650132000039 ], [ -62.797922329999949, 10.028998114000046 ], [ -62.80109615799995, 9.995998440000051 ], [ -62.777414516999954, 10.018459377000056 ], [ -62.784982876999948, 10.06976959800005 ], [ -62.76431230399993, 10.076157945000091 ], [ -62.716704881999931, 10.048407294000071 ], [ -62.663563605999911, 10.06085846600007 ], [ -62.618519660999937, 10.091620184000078 ], [ -62.605946417999917, 10.133246161000045 ], [ -62.626576300999943, 10.196275132000039 ], [ -62.619536912999934, 10.224432684000078 ], [ -62.579945441999939, 10.224432684000078 ], [ -62.517567511999914, 10.184149481000077 ], [ -62.429432745999918, 9.980861721000053 ], [ -62.44163977799991, 9.932806708000044 ], [ -62.396962042999917, 9.911444403000075 ], [ -62.318714972999942, 9.76829661700009 ], [ -62.32363216838985, 9.702276313201253 ], [ -62.446131150831945, 9.525413723164775 ], [ -62.430860765012312, 9.496836656286632 ], [ -62.396056687965768, 9.481385403313709 ], [ -62.374352587302042, 9.399607448824668 ], [ -62.320531582066849, 9.357336127260453 ], [ -62.304692756365625, 9.196648261508074 ], [ -62.32133256684449, 9.140553494048504 ], [ -62.266297166580955, 9.131871852703853 ], [ -62.209737311127981, 9.072366441458087 ], [ -62.145270961585595, 9.097584540494154 ], [ -62.128734503894236, 9.056450100491759 ], [ -62.088633591766836, 9.071798001576497 ], [ -62.055173101857179, 9.063710639434476 ], [ -62.084189419206325, 8.94482900635353 ], [ -62.055560676384118, 8.90511566785375 ], [ -62.008638474885686, 8.895452175477487 ], [ -62.00755327016725, 8.863800360698065 ], [ -62.06424231593013, 8.799204819946453 ], [ -62.075197720398478, 8.734402574519208 ], [ -62.181832037818253, 8.680400702130669 ], [ -62.239528774833104, 8.598002630916653 ], [ -62.32324459476223, 8.589372667314706 ], [ -62.366368577947526, 8.54570608177022 ], [ -62.435899216775397, 8.513821722994123 ], [ -62.515300056252613, 8.519428616437494 ], [ -62.685832282433864, 8.385715847108656 ], [ -62.746939663234855, 8.432353826867597 ], [ -62.742753872193418, 8.473384914981807 ], [ -62.98832027875784, 8.552604885507037 ], [ -63.040720180691778, 8.595909735845623 ], [ -63.055396288208101, 8.709106960218037 ], [ -63.024261237366204, 8.76005992312696 ], [ -62.963257209352719, 8.759362291136824 ], [ -62.949278733826475, 8.793907985764918 ], [ -63.300936856350859, 8.777914130432748 ], [ -63.338453946092727, 8.805380154170791 ], [ -63.371345995221475, 8.918654892908989 ], [ -63.418061490245577, 9.008261827121601 ], [ -63.597585415234732, 9.117970893342033 ], [ -63.633629726630545, 9.167476915427301 ], [ -63.760133632960788, 9.231788235338797 ], [ -63.839663661848533, 9.230082912996011 ], [ -63.902579718679078, 9.20292694672122 ], [ -63.920356410719762, 9.26514537246095 ], [ -63.973221402445745, 9.323875637350795 ], [ -63.966632656172123, 9.416686509774593 ], [ -63.846639980850398, 9.550605983779121 ], [ -63.942990689168937, 9.702043769204579 ], [ -63.964462245835989, 9.762169298074639 ], [ -63.945574509755829, 9.840846666240623 ], [ -63.922552660376994, 9.869785468324665 ], [ -63.990067919398939, 9.916190904086932 ], [ -63.988388433679233, 9.935259508219701 ], [ -64.034173753615846, 9.935647080948002 ], [ -64.054534268042005, 9.95218353953868 ], [ -64.055748663969666, 10.053805242717772 ], [ -63.983117437919418, 10.063597927202579 ], [ -63.800777147447377, 10.127754218382449 ], [ -63.730238817367535, 10.205346380930735 ], [ -63.555029872830346, 10.229634303979935 ], [ -63.532343920235746, 10.281698310028958 ], [ -63.463381721289409, 10.314667874422867 ], [ -63.40770036497986, 10.283713690734203 ], [ -63.402765266004224, 10.257952989338946 ], [ -63.379820930091853, 10.244672145802895 ], [ -63.220605841786153, 10.193848375002517 ], [ -63.191977098064626, 10.167648424035519 ], [ -63.112757128438716, 10.218678901310227 ], [ -63.102421840695399, 10.184004015472908 ], [ -63.063535326294243, 10.187259630527535 ], [ -63.043769090171338, 10.119925237759503 ], [ -63.013091600999928, 10.097398179000038 ] ] ], [ [ [ -62.331125454999949, 9.92055898600006 ], [ -62.316395636999914, 9.885646877000056 ], [ -62.325754360999952, 9.844183661000045 ], [ -62.349354620999918, 9.872300523000092 ], [ -62.348784959999932, 9.913723049000055 ], [ -62.331125454999949, 9.92055898600006 ] ] ], [ [ [ -62.403309699999909, 10.006293036000045 ], [ -62.391102667999917, 9.993353583000044 ], [ -62.408924933999913, 9.972560940000051 ], [ -62.43618730399993, 10.046576239000046 ], [ -62.403309699999909, 10.006293036000045 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-O", "NAME_1": "Nueva Esparta" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -63.976551886999914, 10.80923086100006 ], [ -63.903635219999899, 10.777289130000042 ], [ -63.894642706999946, 10.754584052000041 ], [ -63.909169074999909, 10.735541083000044 ], [ -63.935536261999914, 10.733710028000075 ], [ -63.956776495999918, 10.744126695000091 ], [ -63.956125454999949, 10.76203034100007 ], [ -64.004505988999938, 10.77570221600007 ], [ -63.998890753999945, 10.799261786000045 ], [ -63.976551886999914, 10.80923086100006 ] ] ], [ [ [ -63.846831834999932, 11.13540273600006 ], [ -63.787668423999946, 10.973781643000052 ], [ -63.819569464999915, 10.980536200000074 ], [ -63.819569464999915, 10.953802802000041 ], [ -63.842925584999932, 10.967759507000039 ], [ -63.898060675999943, 10.884955145000049 ], [ -63.976551886999914, 10.891099351000037 ], [ -64.059722459999932, 10.857611395000049 ], [ -64.05687415299991, 10.887111721000053 ], [ -64.096099412999934, 10.89093659100007 ], [ -64.116363084999932, 10.928615627000056 ], [ -64.175852016999954, 10.967474677000041 ], [ -64.224354620999918, 10.939357815000051 ], [ -64.408558722999942, 10.967474677000041 ], [ -64.370594855999911, 11.062486070000091 ], [ -64.220082160999937, 11.091538804000038 ], [ -64.188832160999937, 11.073635158000059 ], [ -64.181630011999914, 11.034084377000056 ], [ -64.110707160999937, 11.000189520000049 ], [ -64.04906165299991, 10.990708726000037 ], [ -64.017567511999914, 11.015285549000055 ], [ -64.017567511999914, 11.056219794000071 ], [ -63.976551886999914, 11.118312893000052 ], [ -63.935617641999954, 11.125148830000057 ], [ -63.880970831999946, 11.17914459800005 ], [ -63.846831834999932, 11.13540273600006 ] ] ], [ [ [ -64.16860917899993, 10.827948309000078 ], [ -64.155873175999943, 10.81195709800005 ], [ -64.174794074999909, 10.799221096000053 ], [ -64.22093665299991, 10.806463934000078 ], [ -64.20343990799995, 10.827297268000052 ], [ -64.16860917899993, 10.827948309000078 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-W", "NAME_1": "Dependencias Federales" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -65.227609829999949, 10.953802802000041 ], [ -65.208241339999915, 10.949896552000041 ], [ -65.204945441999939, 10.904364325000074 ], [ -65.244618292999917, 10.884955145000049 ], [ -65.237863735999952, 10.898586330000057 ], [ -65.31663977799991, 10.891099351000037 ], [ -65.388050910999937, 10.905462958000044 ], [ -65.411773240999935, 10.924750067000048 ], [ -65.376698370999918, 10.966050523000092 ], [ -65.329904751999948, 10.977606512000079 ], [ -65.227609829999949, 10.953802802000041 ] ] ], [ [ [ -66.608265753999945, 11.783107815000051 ], [ -66.587798631999931, 11.783107815000051 ], [ -66.641835089999915, 11.761460679000038 ], [ -66.704497850999928, 11.783107815000051 ], [ -66.650868292999917, 11.780178127000056 ], [ -66.615101691999939, 11.824042059000078 ], [ -66.601389126999948, 11.806708075000074 ], [ -66.608265753999945, 11.783107815000051 ] ] ], [ [ [ -66.132191535999937, 11.824042059000078 ], [ -66.102935350999928, 11.819281317000048 ], [ -66.114003058999913, 11.77993398600006 ], [ -66.143137173999946, 11.781805731000077 ], [ -66.194325324999909, 11.817694403000075 ], [ -66.132191535999937, 11.824042059000078 ] ] ], [ [ [ -64.607167120999918, 11.899115302000041 ], [ -64.556792772999927, 11.857326565000051 ], [ -64.562855597999942, 11.816595770000049 ], [ -64.648793097999942, 11.830267645000049 ], [ -64.648793097999942, 11.851304429000038 ], [ -64.607167120999918, 11.899115302000041 ] ] ], [ [ [ -66.749989386999914, 11.777573960000041 ], [ -66.728016730999911, 11.782049872000073 ], [ -66.827788865999935, 11.746242580000057 ], [ -66.854603644999941, 11.751369533000059 ], [ -66.749989386999914, 11.777573960000041 ] ] ], [ [ [ -66.733387824999909, 11.869940497000073 ], [ -66.711781378999945, 11.86790599200009 ], [ -66.817860480999911, 11.871079820000091 ], [ -66.814808722999942, 11.873236395000049 ], [ -66.733387824999909, 11.869940497000073 ] ] ], [ [ [ -67.658029751999948, 11.984930731000077 ], [ -67.648996548999946, 11.983954169000071 ], [ -67.637603318999936, 11.980047919000071 ], [ -67.665882941999939, 11.982001044000071 ], [ -67.674875454999949, 11.989650783000059 ], [ -67.658029751999948, 11.984930731000077 ] ] ], [ [ [ -67.680409308999913, 12.025051174000055 ], [ -67.681548631999931, 12.025783596000053 ], [ -67.679066535999937, 12.028143622000073 ], [ -67.680409308999913, 12.025051174000055 ] ] ], [ [ [ -67.677601691999939, 12.027818101000037 ], [ -67.677235480999911, 12.03001536700009 ], [ -67.676665818999936, 12.026922919000071 ], [ -67.677601691999939, 12.027818101000037 ] ] ], [ [ [ -67.677235480999911, 12.05023834800005 ], [ -67.674672003999945, 12.048407294000071 ], [ -67.67609615799995, 12.044419664000088 ], [ -67.676991339999915, 12.04633209800005 ], [ -67.677235480999911, 12.05023834800005 ] ] ], [ [ [ -67.681385870999918, 12.063706773000092 ], [ -67.681019660999937, 12.061835028000075 ], [ -67.684437628999945, 12.063462632000039 ], [ -67.681385870999918, 12.063706773000092 ] ] ], [ [ [ -67.687326626999948, 12.065578518000052 ], [ -67.688832160999937, 12.06899648600006 ], [ -67.687082485999952, 12.067531643000052 ], [ -67.687326626999948, 12.065578518000052 ] ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-X01~", "NAME_1": null }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -63.639881964999915, 15.69603099200009 ], [ -63.643625454999949, 15.700588283000059 ], [ -63.634592251999948, 15.700588283000059 ], [ -63.635487433999913, 15.694037177000041 ], [ -63.639881964999915, 15.69603099200009 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-J", "NAME_1": "Guárico" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -65.696604579837469, 9.953423773888062 ], [ -65.702624885330181, 9.846272690732064 ], [ -65.664952765957366, 9.773977363264692 ], [ -65.700376959728885, 9.685817368976359 ], [ -65.488839483855088, 9.569209499918486 ], [ -65.430600145380367, 9.650522366414066 ], [ -65.369570278945218, 9.554791774820558 ], [ -65.218210007885546, 9.50683604634645 ], [ -65.206737840379049, 9.434308173083707 ], [ -65.284588386244991, 9.376559760124792 ], [ -65.258285081591225, 9.277185980748413 ], [ -65.164879929964798, 9.178639024571339 ], [ -65.073154263158699, 9.173833115905552 ], [ -64.977604539617801, 9.111537176699358 ], [ -64.945151740060737, 9.06280630097001 ], [ -64.937348598758831, 9.003765976818386 ], [ -64.885749680703213, 8.982423611360559 ], [ -64.809604458079264, 8.914934189860958 ], [ -64.789941575643184, 8.878088893687504 ], [ -64.846268887099427, 8.829590561954831 ], [ -64.845958827837649, 8.773108221767018 ], [ -64.864071417561888, 8.74099131899419 ], [ -65.008842943247203, 8.738820909557319 ], [ -65.079949714108011, 8.756881822438118 ], [ -65.149377001047753, 8.724687405299505 ], [ -65.170771044248283, 8.646630153858496 ], [ -65.150100470560233, 8.556635646917584 ], [ -65.206634487591543, 8.369360256570587 ], [ -65.365927090262971, 8.184927070128197 ], [ -65.395098436343744, 8.112993476068027 ], [ -65.494343023611634, 7.991657212710209 ], [ -65.484498664082082, 7.930989081480902 ], [ -65.389207322959578, 7.920602117793464 ], [ -65.35665116971569, 7.869416611787187 ], [ -65.446774867865827, 7.861458441753655 ], [ -65.542867193765971, 7.89995738432583 ], [ -65.648157924948293, 7.89990570748239 ], [ -65.768486497953518, 7.841072088905776 ], [ -65.833986376270218, 7.75714956340164 ], [ -65.93945797370651, 7.679169827225735 ], [ -65.983796352819411, 7.669506333950153 ], [ -66.130893316673223, 7.683820706260576 ], [ -66.236287400642993, 7.6361233593056 ], [ -66.330519374569462, 7.648422349112082 ], [ -66.324602423662895, 7.687593085252672 ], [ -66.352611049760128, 7.735781357723454 ], [ -66.394804856958558, 7.727874864533362 ], [ -66.456532355383899, 7.746219998254276 ], [ -66.527509935035482, 7.816344916284834 ], [ -66.54554501039388, 7.811073920525018 ], [ -66.546087612753126, 7.795209255502755 ], [ -66.764782273882815, 7.755108344274674 ], [ -66.950791592358087, 7.788387966131722 ], [ -67.015697190572894, 7.769526069372603 ], [ -67.056754116209504, 7.797457180204674 ], [ -67.139694789782709, 7.772239081168664 ], [ -67.226485357613171, 7.798516547400709 ], [ -67.304542609054181, 7.842932440879451 ], [ -67.337899746176333, 7.889079495122587 ], [ -67.395829027187858, 7.911274522201438 ], [ -67.468124355554551, 7.903833116105432 ], [ -67.538120083275203, 7.917010605954715 ], [ -67.544217902234379, 7.958765164480724 ], [ -67.516726040074673, 7.981296088343811 ], [ -67.533624233871308, 7.993207506321369 ], [ -67.552744513948142, 7.984680893708287 ], [ -67.595093349878198, 8.047312729698717 ], [ -67.574577805821093, 8.048449612159857 ], [ -67.574577805821093, 8.082581894738667 ], [ -67.622378505563574, 8.096250311902338 ], [ -67.677413906726429, 8.209525051539856 ], [ -67.7080580311532, 8.236939399333778 ], [ -67.767873500761425, 8.239083971248249 ], [ -67.780017462735714, 8.294868679445983 ], [ -67.793685879000122, 8.274378973810599 ], [ -67.821410285156503, 8.291535549126252 ], [ -67.820996874006539, 8.315358385081367 ], [ -67.862570562681299, 8.329000962924113 ], [ -67.855749274209643, 8.376801663565914 ], [ -67.88306026921606, 8.369980374194881 ], [ -67.910371263323157, 8.404112656773691 ], [ -67.944581061167014, 8.404345200770365 ], [ -67.979643520631953, 8.448941962301717 ], [ -67.974656744812933, 8.475632838784463 ], [ -68.036487596025722, 8.538497218771624 ], [ -67.996024949591742, 8.555472926934044 ], [ -68.013336555437661, 8.599862982890329 ], [ -67.998634610398938, 8.654640000735412 ], [ -68.012716436914047, 8.749595445073737 ], [ -67.966982794720195, 8.907802843026786 ], [ -67.903265754011329, 8.9673857695376 ], [ -67.854999966275386, 9.072573147033097 ], [ -67.871045497551677, 9.182592270716725 ], [ -67.942178106834149, 9.310000515511376 ], [ -67.919337123709283, 9.378600979251758 ], [ -67.916727463801408, 9.449733588534286 ], [ -67.931636115314461, 9.504200548016854 ], [ -67.964063075550484, 9.541820990546285 ], [ -67.93140357131773, 9.568589382294135 ], [ -67.930964321746046, 9.596365465293957 ], [ -67.899157477335677, 9.630110175144466 ], [ -67.84833370563598, 9.627164618452355 ], [ -67.756297979568103, 9.682716783552678 ], [ -67.807147589689521, 9.87164582029834 ], [ -67.80748348737302, 9.92541514689151 ], [ -67.765367193641055, 9.926267808512534 ], [ -67.736583421187902, 9.892988185756167 ], [ -67.70441484157169, 9.882962958173948 ], [ -67.699066332345353, 9.842319443687359 ], [ -67.627339443860251, 9.871568305033236 ], [ -67.597263760214332, 9.860173651892524 ], [ -67.566697150153345, 9.916888536077067 ], [ -67.529025030780531, 9.906785793229744 ], [ -67.534115160286433, 9.951485907548602 ], [ -67.442828742152699, 9.985850735023405 ], [ -67.340612758871714, 9.92642283814348 ], [ -67.28557735860818, 9.93138377554078 ], [ -67.26384741862347, 9.91112661390207 ], [ -67.18134599462195, 9.919834092769179 ], [ -67.101609260159194, 9.799505519763898 ], [ -66.986215786129605, 9.749999498578006 ], [ -66.948543666756791, 9.691734320782246 ], [ -66.858730027868489, 9.672252306398832 ], [ -66.855861986441482, 9.60455617932422 ], [ -66.876377529599324, 9.56176809292316 ], [ -66.898985968727459, 9.536549993887093 ], [ -66.980505540798049, 9.5093165150451 ], [ -66.997326219329523, 9.452291570699401 ], [ -66.859453498280288, 9.456942449734242 ], [ -66.685820684876717, 9.394801541058257 ], [ -66.623188849785606, 9.391623440369472 ], [ -66.575491502830573, 9.40947764677594 ], [ -66.556577928328693, 9.470920925260486 ], [ -66.574199591637807, 9.527713323810815 ], [ -66.54306454079591, 9.622746283414244 ], [ -66.621070116292799, 9.720983181228803 ], [ -66.622749600213865, 9.754805406344417 ], [ -66.583759732125941, 9.798782050251418 ], [ -66.612750210154047, 9.966446235005719 ], [ -66.450124478062207, 9.981975002344484 ], [ -66.392479417890797, 10.019440416142288 ], [ -66.190476244083413, 9.948695380487379 ], [ -66.132676154281057, 9.966601263737346 ], [ -66.111695523129868, 9.94776520450057 ], [ -66.0618277658387, 9.956446844945901 ], [ -65.971032274120148, 9.92890330684213 ], [ -65.870547450704294, 9.956059272217601 ], [ -65.766031866777212, 9.936732286565757 ], [ -65.696604579837469, 9.953423773888062 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-H", "NAME_1": "Cojedes" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.788828295289591, 9.827049057867725 ], [ -67.756297979568103, 9.682716783552678 ], [ -67.84833370563598, 9.627164618452355 ], [ -67.899157477335677, 9.630110175144466 ], [ -67.930964321746046, 9.596365465293957 ], [ -67.93140357131773, 9.568589382294135 ], [ -67.964063075550484, 9.541820990546285 ], [ -67.931636115314461, 9.504200548016854 ], [ -67.916727463801408, 9.449733588534286 ], [ -67.919337123709283, 9.378600979251758 ], [ -67.942178106834149, 9.310000515511376 ], [ -67.871045497551677, 9.182592270716725 ], [ -67.853966436601752, 9.08515635857907 ], [ -67.903265754011329, 8.9673857695376 ], [ -67.963442958825453, 8.915089220391224 ], [ -67.992717657693731, 8.831140855565991 ], [ -68.013724128165961, 8.736107895962618 ], [ -67.998634610398938, 8.654640000735412 ], [ -68.013336555437661, 8.599862982890329 ], [ -67.997885300666098, 8.550744534432681 ], [ -68.024395310894874, 8.532812811861788 ], [ -68.063359340561135, 8.575420030210239 ], [ -68.16539445668883, 8.608932196063961 ], [ -68.237948168373237, 8.599397894896924 ], [ -68.386698777726394, 8.617846381405343 ], [ -68.423053148384099, 8.60373871556925 ], [ -68.502324794853394, 8.612575384746208 ], [ -68.631722581931626, 8.669212755464287 ], [ -68.682804735150398, 8.714610500873903 ], [ -68.703992071876598, 8.769077460356471 ], [ -68.750319994172401, 8.792176825000467 ], [ -68.684535895015529, 8.812976588998367 ], [ -68.663684455073508, 8.804605006915551 ], [ -68.582397426999648, 8.852793280285653 ], [ -68.636192592913801, 8.897467556182733 ], [ -68.652108933880186, 8.94544912397788 ], [ -68.605238410124514, 9.225173652442095 ], [ -68.642161220663809, 9.277676907163539 ], [ -68.821039191405532, 9.419657903989048 ], [ -68.872121344624361, 9.439527492899458 ], [ -68.992398240786144, 9.728347072959025 ], [ -68.977722134169142, 9.857279771144533 ], [ -68.858892177931637, 9.853171495368201 ], [ -68.804321865661564, 9.960865179984069 ], [ -68.66970475876758, 9.9687975124952 ], [ -68.623015103064517, 10.011378892421931 ], [ -68.582242398268079, 10.00502269104436 ], [ -68.579400194363473, 9.947842718866355 ], [ -68.52829220182366, 9.923012193457964 ], [ -68.540642870272222, 9.900197047855443 ], [ -68.503952602830338, 9.900507107117278 ], [ -68.338923916405633, 10.003162339970004 ], [ -68.302724575378818, 10.069799098949261 ], [ -68.241668871421268, 10.128684394369316 ], [ -68.205211147976115, 10.062900295212444 ], [ -68.253502774133722, 10.021455796847533 ], [ -68.241668871421268, 9.987013455006945 ], [ -68.081187710344523, 9.862499090960284 ], [ -68.06534888374398, 9.855367743226736 ], [ -67.995327317601607, 9.88934499797324 ], [ -67.986568162790491, 9.878699652766727 ], [ -68.002846238962775, 9.853946640824802 ], [ -67.977576463083267, 9.831932480899241 ], [ -67.879804654161433, 9.819116726255913 ], [ -67.788828295289591, 9.827049057867725 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-A", "NAME_1": "Distrito Capital" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.00536190462816, 10.575194607545086 ], [ -66.951489224348222, 10.549511420515614 ], [ -66.873767869691449, 10.547030950917645 ], [ -66.853639899261907, 10.514603989782302 ], [ -66.881028407734846, 10.481401882291038 ], [ -66.897435676015618, 10.416212063236117 ], [ -66.943686083046259, 10.421431383051868 ], [ -67.029727342043202, 10.393035183327015 ], [ -67.151115282244461, 10.430500597124819 ], [ -67.126930711982766, 10.458819281584567 ], [ -67.053343472423308, 10.478766383961442 ], [ -67.053240118736483, 10.525456041463144 ], [ -67.015800544259719, 10.544317939121584 ], [ -67.00536190462816, 10.575194607545086 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-E", "NAME_1": "Barinas" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -68.036487596025722, 8.538497218771624 ], [ -67.974656744812933, 8.475632838784463 ], [ -67.979643520631953, 8.448941962301717 ], [ -67.944581061167014, 8.404345200770365 ], [ -67.910371263323157, 8.404112656773691 ], [ -67.88306026921606, 8.369980374194881 ], [ -67.855749274209643, 8.376801663565914 ], [ -67.862570562681299, 8.329000962924113 ], [ -67.820996874006539, 8.315358385081367 ], [ -67.817586229321023, 8.288047390075008 ], [ -67.793685879000122, 8.274378973810599 ], [ -67.780017462735714, 8.294868679445983 ], [ -67.767873500761425, 8.239083971248249 ], [ -67.715163539565708, 8.240246690332469 ], [ -67.677413906726429, 8.209525051539856 ], [ -67.622378505563574, 8.096250311902338 ], [ -67.574577805821093, 8.082581894738667 ], [ -67.574577805821093, 8.048449612159857 ], [ -67.596876186586712, 8.054547431119033 ], [ -67.563570726307944, 7.995197047705574 ], [ -67.533624233871308, 7.993207506321369 ], [ -67.518999803198369, 7.971606757545828 ], [ -67.544217902234379, 7.958765164480724 ], [ -67.605299444613649, 7.99940867806805 ], [ -67.862570562681299, 8.034807034317168 ], [ -67.88481726840223, 8.026719672175091 ], [ -67.954425421595943, 8.054650783906538 ], [ -68.054367641753231, 8.048449612159857 ], [ -68.256577521135682, 7.956517238879485 ], [ -68.275594449324387, 7.970934963078093 ], [ -68.341740281888463, 7.965896511314952 ], [ -68.374709846282371, 7.991347154347693 ], [ -68.425895352288649, 7.97935822200435 ], [ -68.485142381115963, 7.938585517207855 ], [ -68.63386715384604, 7.969358831944533 ], [ -68.72983028763764, 7.915847886870495 ], [ -68.823467984160118, 7.902515367390265 ], [ -68.945062629037068, 7.931764227836823 ], [ -68.970280728073135, 7.99938283874701 ], [ -69.054306607264095, 7.980185045203655 ], [ -69.112649299425641, 8.006850084164057 ], [ -69.133449063423541, 8.041628322788881 ], [ -69.188691169262029, 8.070670478559748 ], [ -69.440949673088937, 8.071652330490622 ], [ -69.57703955832892, 7.951039537544602 ], [ -69.733696661771489, 7.844431056747851 ], [ -69.835137498696611, 7.807637437417782 ], [ -69.862991096062217, 7.811978258090107 ], [ -69.93549313000392, 7.757769680126614 ], [ -70.013886278229165, 7.754255683552913 ], [ -70.086595017745879, 7.710744126740053 ], [ -70.133517219244254, 7.629327908356288 ], [ -70.157185024669161, 7.615013536045865 ], [ -70.288882412393377, 7.603773912536042 ], [ -70.320895962378756, 7.516879991018754 ], [ -70.368334926915338, 7.450449936715188 ], [ -70.460241461774046, 7.423061428242306 ], [ -70.480033535419295, 7.376242581330075 ], [ -70.500523241054736, 7.383683987426082 ], [ -70.547833015281412, 7.333712877347409 ], [ -70.603540209113362, 7.328441880688217 ], [ -70.630851203220459, 7.294309597210145 ], [ -70.666895514616272, 7.287410793473327 ], [ -70.795337287285975, 7.314799302845529 ], [ -70.874169685082904, 7.287488307839112 ], [ -70.946775071812112, 7.307978014373873 ], [ -71.06136756016474, 7.378723049129405 ], [ -71.189163377687692, 7.404173692162146 ], [ -71.248849656986067, 7.454532375868439 ], [ -71.267685716222786, 7.445127265011251 ], [ -71.454418505109913, 7.463885809882186 ], [ -71.520926072879945, 7.438305976539596 ], [ -71.563119880078375, 7.452594509528979 ], [ -71.607199876772881, 7.438305976539596 ], [ -71.627560391199097, 7.453395494306619 ], [ -71.63957516106484, 7.432337347890268 ], [ -71.66034908664102, 7.432156479837658 ], [ -71.715849574897959, 7.442465929159312 ], [ -71.748767463347747, 7.47827769655845 ], [ -71.84155249734988, 7.494762478305745 ], [ -71.847107713050491, 7.509309393713522 ], [ -71.837909308667633, 7.533209744034423 ], [ -71.692000902319762, 7.549332791475138 ], [ -71.36067745579993, 7.486184189748542 ], [ -71.319775559794209, 7.496416123805034 ], [ -71.377963223224185, 7.524037177173966 ], [ -71.490902066077467, 7.629792996349693 ], [ -71.483564011869646, 7.684492498929671 ], [ -71.456692268233553, 7.702424221500621 ], [ -71.462144131146715, 7.769526069372603 ], [ -71.253784755961703, 7.922772529028975 ], [ -71.059946458662125, 8.110047919375972 ], [ -71.011835699657809, 8.219756984697085 ], [ -71.031498582993208, 8.278952338479598 ], [ -71.065139940056156, 8.307813626197856 ], [ -71.077542284448839, 8.376336575572509 ], [ -71.038371548308305, 8.424343979990681 ], [ -71.027364467895893, 8.465323391261506 ], [ -70.9804422681961, 8.506664536838912 ], [ -70.962381354415982, 8.601413276501489 ], [ -70.929954393280639, 8.629266872967776 ], [ -70.910058966847828, 8.624125068417186 ], [ -70.837711961637694, 8.725462550756106 ], [ -70.768568894638747, 8.781479803849834 ], [ -70.727692837054747, 8.764736640583465 ], [ -70.686945969780652, 8.82362193420488 ], [ -70.57746944935559, 8.856669012964574 ], [ -70.555584478840615, 8.925631211910911 ], [ -70.512460496554638, 8.983663844810565 ], [ -70.443730841605031, 9.019604804318249 ], [ -70.271312425028384, 9.023403021732065 ], [ -70.182454799649292, 9.0078742543933 ], [ -70.004067756221957, 8.847057196532376 ], [ -69.819608731357846, 8.751300767416467 ], [ -69.771084561203509, 8.750060533067142 ], [ -69.705377977311798, 8.7238347445778 ], [ -69.623109097307008, 8.777914130432748 ], [ -69.602696906037352, 8.746572374015841 ], [ -69.466865404115083, 8.670375474548507 ], [ -69.29183732763056, 8.64321950917298 ], [ -69.258738572926802, 8.58425670028646 ], [ -69.175565355356866, 8.50046336509223 ], [ -69.162465378974048, 8.441733100202384 ], [ -69.114406296813115, 8.431888738874193 ], [ -69.139340175908387, 8.378817043371839 ], [ -69.127635464405159, 8.351040961271337 ], [ -69.076320767189657, 8.292853297841418 ], [ -68.986145393095399, 8.239394028711445 ], [ -68.948395759356799, 8.186012274846576 ], [ -68.853698697436926, 8.112295844077948 ], [ -68.821039191405532, 8.126739406698221 ], [ -68.828454759079875, 8.200533351832689 ], [ -68.792203742108995, 8.317141221789939 ], [ -68.654227668272256, 8.422871202543945 ], [ -68.603636440569289, 8.499843248367199 ], [ -68.573534919401027, 8.635390530348673 ], [ -68.423053148384099, 8.60373871556925 ], [ -68.395638800590177, 8.617768866140239 ], [ -68.326237352072155, 8.601955877961359 ], [ -68.16539445668883, 8.608932196063961 ], [ -68.063359340561135, 8.575420030210239 ], [ -68.036487596025722, 8.538497218771624 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-K", "NAME_1": "Lara" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -68.977722134169142, 9.857279771144533 ], [ -68.980796882070422, 9.782271430082403 ], [ -69.013792283986731, 9.749534410584545 ], [ -69.066786465123243, 9.70995026329399 ], [ -69.173989224223305, 9.686695868119784 ], [ -69.223211026367778, 9.692044379144761 ], [ -69.263983731164274, 9.729122219314945 ], [ -69.278556484993771, 9.844257310026819 ], [ -69.337183397096112, 9.768603013817994 ], [ -69.378421189886012, 9.657886257244968 ], [ -69.430562710300819, 9.630575263137871 ], [ -69.591948208043334, 9.618172918745188 ], [ -69.604350552436017, 9.605770575251825 ], [ -69.625227830799759, 9.568124294300731 ], [ -69.615641851889961, 9.510556749394482 ], [ -69.62794084259582, 9.426530870203464 ], [ -69.643753831673962, 9.414748643435132 ], [ -69.706876594079517, 9.395654201779962 ], [ -69.728063930805774, 9.431801865963337 ], [ -69.763410611110828, 9.417461656130513 ], [ -69.867331915835223, 9.415058701797648 ], [ -69.859115363383296, 9.461670844034188 ], [ -69.788680386090959, 9.558900051496153 ], [ -69.841080288024841, 9.56773672157243 ], [ -69.898983730614646, 9.552388821387012 ], [ -69.926527268718473, 9.574015408584216 ], [ -70.006754929596298, 9.497611803541872 ], [ -70.032980719884279, 9.430329088516601 ], [ -70.062152065965051, 9.492650865245196 ], [ -70.109280972139118, 9.517145493869407 ], [ -70.133982307237659, 9.598148302002528 ], [ -70.118944465414756, 9.635174465329271 ], [ -70.069386765586728, 9.668066515357395 ], [ -70.0372440252915, 9.6658185897561 ], [ -70.013059455029804, 9.690494086432921 ], [ -70.089876472121489, 9.773047187277882 ], [ -70.160750698985566, 9.785294501140299 ], [ -70.213331468072795, 9.84580760273866 ], [ -70.247386237185083, 9.82673900040453 ], [ -70.279658168689537, 9.873893744100997 ], [ -70.329319221305013, 9.88632192601608 ], [ -70.351643438693714, 9.92603526541518 ], [ -70.454686245174059, 9.896243800810737 ], [ -70.5167496412829, 9.92851573321451 ], [ -70.580079108364146, 10.036519477092156 ], [ -70.623513149911901, 10.022851059928485 ], [ -70.662012091584756, 9.955826728220927 ], [ -70.661159430863052, 9.904512030106105 ], [ -70.681003181351741, 9.907793484481715 ], [ -70.806809454792472, 9.983938707105608 ], [ -70.85481686100934, 10.043547472038199 ], [ -70.858149991329014, 10.070031642945935 ], [ -70.824999558882553, 10.121320501739774 ], [ -70.710794644157488, 10.194158433364976 ], [ -70.676042243055065, 10.278597723705957 ], [ -70.63798255095395, 10.326579291501105 ], [ -70.535378994045345, 10.363011176524537 ], [ -70.470835130137118, 10.463935247713493 ], [ -70.414533657102595, 10.483804835724584 ], [ -70.323066371815571, 10.562404690424103 ], [ -70.247179531610072, 10.558373928114293 ], [ -70.15749508303162, 10.651701565374935 ], [ -70.047217576929597, 10.645267848732203 ], [ -69.969315355119534, 10.690484726988529 ], [ -69.866582607901023, 10.698003648349697 ], [ -69.823794522399282, 10.730301418275815 ], [ -69.806069505403343, 10.720353705059438 ], [ -69.821236538435471, 10.701750189819393 ], [ -69.789868943596844, 10.701440131456877 ], [ -69.663933478047568, 10.764666245750618 ], [ -69.537197027720651, 10.742006129779043 ], [ -69.498594733260347, 10.695135606023371 ], [ -69.426092699318588, 10.7119046095101 ], [ -69.126266038846609, 10.681260484184008 ], [ -68.924107836307599, 10.697331854781282 ], [ -68.885505540947918, 10.659530544199242 ], [ -68.892456020628856, 10.606148790334373 ], [ -68.964389614688969, 10.556875312245836 ], [ -69.020096809420181, 10.554782416275486 ], [ -69.048570522611499, 10.477681179243007 ], [ -69.07022294823048, 10.461454779014844 ], [ -69.068414273100188, 10.424609482841333 ], [ -69.027176480310288, 10.423059190129493 ], [ -69.014980842391935, 10.24841868727259 ], [ -69.117997809551241, 10.202710883500458 ], [ -69.162077806245748, 10.128064276744965 ], [ -69.219567836786212, 10.171834215076956 ], [ -69.237551236200602, 10.14708120403435 ], [ -69.22747433087568, 10.110132555073335 ], [ -69.141510586244522, 10.005332750306195 ], [ -69.139210984699162, 9.933399156246026 ], [ -69.097818163177692, 9.876684272061482 ], [ -69.073426887340986, 9.899964503858769 ], [ -69.071954108095611, 9.958152167288688 ], [ -68.979117398149413, 10.00982859881077 ], [ -68.958808559667261, 10.000216783277892 ], [ -68.924882981764199, 9.930763657916486 ], [ -68.977722134169142, 9.857279771144533 ] ] ] } }, +{ "type": "Feature", "properties": { "ISO": "VE-P", "NAME_1": "Portuguesa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -68.980796882070422, 9.782271430082403 ], [ -68.992398240786144, 9.728347072959025 ], [ -68.872121344624361, 9.439527492899458 ], [ -68.821039191405532, 9.419657903989048 ], [ -68.642161220663809, 9.277676907163539 ], [ -68.605238410124514, 9.225173652442095 ], [ -68.652108933880186, 8.94544912397788 ], [ -68.636192592913801, 8.897467556182733 ], [ -68.582397426999648, 8.852793280285653 ], [ -68.663684455073508, 8.804605006915551 ], [ -68.684535895015529, 8.812976588998367 ], [ -68.750319994172401, 8.792176825000467 ], [ -68.703992071876598, 8.769077460356471 ], [ -68.682804735150398, 8.714610500873903 ], [ -68.648026495626254, 8.682106025372775 ], [ -68.573534919401027, 8.635390530348673 ], [ -68.574671800063527, 8.603506171572519 ], [ -68.603636440569289, 8.499843248367199 ], [ -68.654227668272256, 8.422871202543945 ], [ -68.792203742108995, 8.317141221789939 ], [ -68.828454759079875, 8.200533351832689 ], [ -68.816000738743071, 8.145032864475127 ], [ -68.841451381775812, 8.112450872809518 ], [ -68.869718391190816, 8.117799383834495 ], [ -68.889355435205175, 8.152577623358638 ], [ -68.941677822773272, 8.17996613183152 ], [ -68.986145393095399, 8.239394028711445 ], [ -69.076320767189657, 8.292853297841418 ], [ -69.127635464405159, 8.351040961271337 ], [ -69.139340175908387, 8.378817043371839 ], [ -69.114406296813115, 8.431888738874193 ], [ -69.162465378974048, 8.441733100202384 ], [ -69.175565355356866, 8.50046336509223 ], [ -69.258738572926802, 8.58425670028646 ], [ -69.29183732763056, 8.64321950917298 ], [ -69.466865404115083, 8.670375474548507 ], [ -69.602696906037352, 8.746572374015841 ], [ -69.623109097307008, 8.777914130432748 ], [ -69.705377977311798, 8.7238347445778 ], [ -69.771084561203509, 8.750060533067142 ], [ -69.819608731357846, 8.751300767416467 ], [ -70.004067756221957, 8.847057196532376 ], [ -70.182454799649292, 9.0078742543933 ], [ -70.118272670947022, 9.024100653722201 ], [ -70.062720505846642, 9.143654080371505 ], [ -70.065356005075557, 9.252277940074862 ], [ -70.092331102398418, 9.239229641434804 ], [ -70.13328467524758, 9.24933238428207 ], [ -70.135842658312015, 9.265636297976755 ], [ -70.054658983025661, 9.372994085808386 ], [ -70.006754929596298, 9.497611803541872 ], [ -69.934046190079584, 9.571612454251351 ], [ -69.898983730614646, 9.552388821387012 ], [ -69.841080288024841, 9.56773672157243 ], [ -69.788680386090959, 9.558900051496153 ], [ -69.859115363383296, 9.461670844034188 ], [ -69.867331915835223, 9.415058701797648 ], [ -69.763410611110828, 9.417461656130513 ], [ -69.728063930805774, 9.431801865963337 ], [ -69.706876594079517, 9.395654201779962 ], [ -69.62794084259582, 9.426530870203464 ], [ -69.615641851889961, 9.510556749394482 ], [ -69.625227830799759, 9.568124294300731 ], [ -69.604350552436017, 9.605770575251825 ], [ -69.591948208043334, 9.618172918745188 ], [ -69.430562710300819, 9.630575263137871 ], [ -69.378421189886012, 9.657886257244968 ], [ -69.337183397096112, 9.768603013817994 ], [ -69.278556484993771, 9.844257310026819 ], [ -69.261658291197193, 9.782038886085729 ], [ -69.267575243003023, 9.737338771766872 ], [ -69.212178106634326, 9.689228014561195 ], [ -69.066786465123243, 9.70995026329399 ], [ -68.980796882070422, 9.782271430082403 ] ] ] } } +] +} diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/images/exampleGermany.jpg b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/images/exampleGermany.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33855aa4e6df4835ebdd355614d98b989b3c727a GIT binary patch literal 31211 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�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 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/images/exampleUsa.jpg b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/images/exampleUsa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0937ad09260dc5efae2394c1c54a6c8137f2a4c4 GIT binary patch literal 85089 zcmdqI1y~%-wkSFYnqVQgCrAkHZXq}X_rXHY!QCZ+;1=8=xDEuF!686^;O_1)xI5g* z-Z%Ttf6hMV-TS?F-}}DT^L5Ya>guYss%vSjdYF1x0z8wIl#v8HdISJGg8u*yE03mR z#Ka7gR1_s;-bwuP!A}7EKx72~tZkeeRHWX%(9#CJ_*M4%Ff?+s`wjn_e|Wp+6Teyq z07jYq&GY}Oq9?{Cjz;iGhwziy0p2+rSzI`bYxYn0^)L9tKViXNu&a}u6TFVnFW5m% zMGOub!{OIvf50F9fQ{@Ne$@|$*AcX~a{krVuj3cS=q5Jms_=hQ_(=+I1gHR{0B`@I z-!>Zn;5`EX5Wf6X_8}Pns0jc72xtB(qy7p2V0{Jvpo4#v{WT_bh7N}C_ThsJKOdW# z0szMa004$I0Dv<D06f+C$20ilzrgJU{1GV}FI)J}3}6K?0lWan0Bit80A@JE4qyea z0k|J#0b+p1kA5A$u8)5mhzP%~NQj6Ch{#CD$p1J|o}eP5JV8N5Mnyw?^7PjMhtScU zqW`-2)yO|zeT;;Ffb<jv8RZ{U{<kg<-vQXDkINC45gt(j9%Da3z<%`b13><30wVoF z?>DsoR74~=DhQ7sJ%vBFd<J-gfbbaMF*5RVbTpJl$S98hj}Z`&u#r(vpTERmdxA?T zs%%K8X8$QB7LS04ik<hZx`w86bbLa^@W?1WH;;;zOI%iERqGfB*9TJvM<>^6$RRbS zn5tjfvJs8Ae`5Cd(Np4AQaO3>&Pd@{JVy8v7XTs>0y4_uN2u_p(%A5Ue2jpAg7Opr z6#;+%#~6N#jfnJ;O;j2AxuN~1=wTdOm6)uGRy=%4c1~4?k>x{<x0NUaR9qkYvX9i- zR;anfj2>nH=<s(RV<TV#L;wdXlrK<&KT=Wxf`cFbzXOH}*e5m+-`GGRQkVz|H@{kq zu@eXWkYcQL>l7su7<34U>{R(~n5Um@&0sZKQu8AsyhF9sa2~YKGs~|R@;r=iI$hO% zqQSsqoWLD;UEhP>t+c^|kaV4(klSWoghW#TGy5F3lnZ4I4jbP3KS~(7H}*54zmFQ) zk3rSdwj^cpuF4HA(pA#wE@pv~$hv*~p2<?KjFcf4Ro`(<>1{esw`HTnMe0gHcHS9* zxeMMvNKO&;qp|$<RS-j!q&@92)08mo1<ATm1OCk#4}mg!8G-VUOGP)@+y<oe`?Z#b zYe4zE4F$4q<5-Iy)~2SgP%Xvmy})Tli;GiP^)7=Icgn=bm@-?Lwf0&sl{*!$RRj@? zmG2{LH<F`R&_{sebBT$K<@8P6;FUxV`o*hGAU(N)f%?pa?BrtorlHSYO)I7bwPqf0 zu`KytO_E28UYQXM&tIoJ00v7BJ_}@qOd0(3d~{>^(CnsP?()UGb62inf_*yKV&T<U z`eBgckpS9>-6hA}M&9i+Uw*GSVe|)pdyy|9#X#+8$ngM2PQw|6a8>iOeIMHYx^rRe zPA6BNoXrW>HnPDVyDa_fOM@3FiHD-M+kZ5^IzrpaI}mv==5;-ADOPux9&lCbMRb3n za*ryKF8mi^x*p>HBql0TdlA)D1gC=2ha?iya)&ajAWDVkRdhus8R&&0&Zo_@68*Zv zQ#-L5kBOt2>*V^ZL<YQ(>_t0c?hohOZpKay$PL0u8=%&cG6~3lk^j^RDW)h&A;a@k z>PH>>u#X}S0BQq~4V)q^uTdNgrUsC0a8Yk5jMq&0wH_x_X#4b(EaCxh9q5L9cMiUN z>?>ncM$yP5$bQ5j<ymWOO>=HueY36Oz*S8a0xH~tcO|p&0C@Dun~*&I_K<FI$?&e& zrt3x{<2I4z1TW=-`Er2@cfI`XQh1#d(@C0(Au$&&;~12-o(X)bJn;Z9&7Z!rti9Dz z{0%6Z;OCsQa4(Z@u2>te7}YW#jKwYV%U4}b+FyRl_zh(D&<@<re)h}^zVak%b@j>3 zKew>XoM?#Z`1~6Pz*iP_-I$}AyOrvl+DB_Rqv5GiwYrDQ`7qM{23}W&{Lj9G^}Fo! z7K`YbQc}&%%2tmIg?<APaf<0zHK-RN*vIDre*1Sa^1EZRB4AgFuqVHPr;OQN2mQ5D zb(c|z6>|ixFj?E*<orPw&Zdubo6z77ucpYQh87i7PcH7k9lfrVwtoR(uQLTsY_Ruz zsMdE~k>;;sQm2cczQBDEe4O6^uD1BqVyaz~;}OOGj|WH9=YaO}=zAAh38`A*>%bE- zs9dhbd2>Q6#MhSEQM$DU%a!rD@l`N+d`Yuy4T8v~=91X8ES;O;eLS(jMUeFa;8R_h z7gH)i+R70juX=jfL4&_#lxVr>TxI{ER=h$=1lU`3<=O*t#%s|A*>|A)d(dg@#*H1v zy|WLZNN#OHsA7*>hF{g@xqBOV$&mo)#JiU00l?q#m|{dRb?^J&)%fMJ`<N9VExg*N zlN-ThEcMIu>Z|5CxFkt8_=L4h+kd`fb_=^j^_8(_!dVwod~<b|VHZ?<tMFfS8FHLK z`_=1ykXLNnht^v7Uu4Pr(YLOg_?05gkg%^=+Dljq4m6Wz_EY9b$>Ga8>OcBsrpfjy z2-%_#sTz28W)L#_2gZMqoA`WKSoOy#R_633sz>>cy@J0G{;O}f5c5pB6%Ulb-ILEk znk&BI%16u9?4zxk7-VhI#h~m$Kj{^u@<>UpT{~gFNrZ#)MKhO?JL|ezX(hQJCS~T@ z<xE@Wcf-hy+xa?c!VcznG2v#D-H2vzuGDszJW9*&JG?9!mE~5HC-0xVBoSNZe!sht zV;Tz-iqNxN>h|5;pD_T}h=e@(4Lp588Fo^|`Aa%@UG*m&!uf#a0Z`Qd@`29XQ!~+Y zygCM1ueZ!H&wQW{WKT#w>X`|?Qjh@=-gH=uDcd(@b*+9I$x@a|*{iT~U6JhAOqw%6 zk<2T-WX8OeNp97s^jF?P*N_?`P@5@mV&}Y*6PQA2ifXQT{8^CI*1O8&OkGd@Izjuj z%`+%p`m^rv>KII+2LO-$Cs{I{9~0fM;3=4py*$E#-IT=%$^DT|nN*5l1>sY>w2>4I zP?OWJ@R)U-uu)LC-)9rf{P>jSdeA<{nA-VHQ}F?Ttwn9CQtQH&31(MA<hoLM@3;S> zRuJ2%_#5MYSzEVO(M=ttZZs|8kM<2plJ9W`m|bfEGI;h}_0lKQalK|_6M#4BqU=iJ z)&1OjD?cA~eepX#Zv2SC&Hwr`O`Ns*>Uc`iG&!BL0BsXb)xI8RJ+|$~?0eX|JTNpf za3GU=89E#>>hKN$<2ulY>7|cwsN@&2XS4{gj|a?;-hp5K2yC_7nr04PAQNzSj$YNl zTp>bLpzJ?C=6se%szLFr{E6;+N3RC<AOS38;fSa@m}#%Nr94{wSpBLpjL;-+%;UqR zsZn9|xY~O;DZ5~S=aMI9EJ!(VSkzTXW=Wqai^|XGC-IdRwrQvuB~&Jj4)D%w8)uly z69h~Ko(8>Hn*Pil<Uk?X<uEYbJ?fWUesi?Pm9Vpa*K2vMkf}Pd3(aa^FPnc|J6o#u z<+1~7AjGjx!PEV=G*W|rHwG2ar2P}bhh^2_GKYMsLCQrwcFW&!h(e#hg=b~lsqw%i zVT^}N$1AUDd#kt@!~~TFg37qOlR=@CZ&A(H9sP~IlXjF*e;KMh>GX2cJm_fGtFp)& z9s^b;pv^-^X>?3C1GCcRp*q8P2UyHzo_c*)4qpdy=p@;f3mOb=__|o=)YAE#Nk*7* z!5xzOJEl+#Z}aij!H|=b&*E>eu>s=ZkFcL1ioe09?Nl7~u5USbb@KpVO*aX{S*6`> zo;SFN^?m>(DHOcF&#j;Qp>c!Wg6loXRiA#3Ofi$c>k9!LbUP@CDm(xXu=Z44L}scl z*6LW29su9QZ&~J~*EX*@go_>k;vq4?Vd-Rm|1~og^=?_@S`Fm8Kvr{)yis>pkM;Na znzWKzXrk(U5wY28pIM5wrd>+P3}rYGf6(&}5JlRJXPuPXdMTt9lv9_u$;a*$Uy68k z;t+_L&QBq%(GFbn>-O})tY&C1{rSOpgo1jl6Ul3EO*rZ>VCqyv*em@D1bteELU_=D zr`8uab1CTbMQ~{C^*<U%dH~qgFsNHY&ND6w${blmUwdwQs!%14pm{c(RiD|CrTY6+ zbz4<#!vu_DzCp$r<41TOv)Z8&3b$;WFcF8gW2Bn$$}-2(M@XD`vJ~&qD)m)NStz8_ zRc9V3kOjbmx+agt+(x<bhD7)t04*X!7aReQ^TY^i%RJZzs14wXN%YI4;>TCv9v)71 z`xi|NQj~^Oy6sO?GZk`RHrr?UtXBy<7^>+{nkSuZFhjQ@><f6X6vc`;!LH#d@?R#8 zm;3};$-k7rQ1>1H&#ot}o$zczM%f87)m3N$YvtBeqXd9+M&+uDo7xNAN2w)Xf+?^- zjsw@kb`(SLT<eVZicfI#g2>JUPa_N6@%4fN9$D^4bEbqa!ChIbL%Ty5f@U&NgA5oh z+TbNI+S$3423FTG^JFs}4uQof8bMNwESQMc(YM`RE!wB!l{y{gt9VSDOw2Lb8Suyg zI0iO3XD|<32QqTl)SOtmDx4@A4qt#?73N2!uV~331YPl6v$&gDcJNo1h-E6sl+n$T zgT@Lp1h+UR@e0L%4l+x=fngg9eU`9lf$cD-+cKF*3H~stK5}-ykV^9CIpJ$d)6L&a zI7dria<`kCmr*-ep(NHY>&A#mpE^r)5^-aIX3Sk%_|52v;k<X>qNhTs65cwnJ&Cf{ zP#QRHl<=i_8hTeGoPU15>s8M_X22$gdjvH%wwzi{s4I98CC#u6%zXR*kgwV`jQ!}# zZ|*@$%ph;dY#OzB6}K?Mpj$Z$14lt8$15py5TjdCUeztwyuV_*j{-Ym7^PN0JQzHn z*PGCWPag_uXZGU;LOnbZjLrI%HxWsni6TBjeQ~B-;pWTVUhi6=o^DdY-D?)ulsYaP zUwmkGQX0mxxR+bMD|rHw&uSDJOzCinNsnnEN?^$j*(7`9WMdS3Vutn%_%3^ymH<ME z3FaFvp?A~(RbNkx?7g3yIgqI<8=0Bdvu1qpZFXO!y*K>Af!C<<?zoC9VP!LTfxOtp z*;ArE5l!^~YqNH}V&GLQT>6Bh9FlvOv=@CJc!Q?PxD$96G%hH8fRSUtStUoN$0Oto zvW=FIog*@{-+u(&?*`OX8=DyC(a)V0)p$=(8`2x;Q)0LG$huZr&A57iCY(H5>wbV& zgER1KiFq_FyTnR4C%)n|pE*X1hV+X^I<drqTi3dsbiprHgaewMjtdjW&hv;?UehY< zH~Z)2&LhtiC(YcbhQ0L0Rap1x$gPFMn({y?73u8T(|dL|1RV3YEk>J0?M~V=vI}dr z^j_-8`All2GO`ppPpqSVgFZzN=*D=zd!tSKWJ9o@wDt??)pB}y5qQ<K_MMGhnhUWg zYI#(ATJBFrtb7rJ1OKjM{S^xZBFAuuuf|RN4U^>&|0~Ooa<Q0wJYZUUQJwyF18n>p zVrd{X&@dOA5gew+_wlzF|EC1};AMQrGh1?hY}<13WJ0S#nB6CJZyfH)@+@9`hPhzD z<iK7Mw%>Y>q~<wvilUdi=D{!X&pJz|b<WK5>MW%TO}@!<e2nx66(M?+C=8;u77ODT zN~#kM*+V8N2hz{Xnpp9WIO|rQ;T}V!Y5m@Ib)Kg|`t4w-FP=#$y&Y6ZqaU?P=uA0a zHM#75&-SG(e$SgXKgFkW*QL*I1h@>BI}&AXQY-ihblgwp>s_TO$c|&c6A`L?gd{>v zY~m+s-{%0+$yDT$D2(Yjl47C)M2?N7_-=ylisW1&Hr`$GpO-bB+PQ{lDrS8aSB?_> zhX(tP!vCLo?RP2mO`Gp&;m8A^QNZ>Vqu+7aiK5M8QXqiXMkBVjmV0Cub9sg5WoEO~ zqVA>6fcm|T99(UwMexLlSVt}EpJQVyzWz77{Mh1>jR%=wU>XL_E#=MVwlmpZSRr-K zN|TaT>bt<y?0UB(czYlmPc?>e=wsvL>G-2RW7fXNN~2$^3v`p3HuT0?EP1Mdc1z4c zTjAK(qs!Gqv2H0P#dTCoQk&YA$&-}7+TRbqCPNuwuC6nl3A`iT=OL{xPxvl+5V3N@ zrQexoco-ZSp75K@e<;C6vF2pUbMjS=ol#?ss+~vcZ&v$>&W<w<+_@GGZJ5`-%o`LH z6onKp6`&-rJpgiDZ+3_zXb0_m#C~2$^)0*FtVpG=G)Bd2Hrt{#;BohMOmr(*>|W4q zn=mr5tM+K^t1htPb&_>Xo-PHS<&Bp6aybsJ)AxjtGEC-!pK#Wbu(d%fEQVwC-c6;7 z{BWt7xl^RsZ!XK<LlW1G9aUGajl5km<L%P-C%1h&%P$ovFIB=NA)KB!+he$@>d?6{ z&iiE{w>C<N=pycePEbHU$sm(Hv?MIYclR`z{AT_N*;_*QJxA$)pOU)pXPfyE54#4< z@vVAo&)C%}`r2T_Wsw}uCY(_pu+Q{M8-eJevS&$@UYuF&NMpN#4*=BIC^xf-QtCwB zrU9A(KF2f%nbX)!aV7iY3;~K;cWAAZ-p_^oDRBt^-Z_)J+i0cfymC@V@Aew3%X7hK zhhm@#%vV-=aXe$z&`}(9k63n1buV*W-U|axqawZ!s4z*(>3nbfG*f|;e0=O4Ysy=p zb4{Y`^n7`~^tO5u0PC?I?QtC>6jBhnU%pv3!?(OEzEfPq@A-P`O@bxGF^^KHbC1H& zy1}}s9KUeZ<Xk=@^eR~^IMn_0xBUN?Y5u>hT>hp;;LWUx1cuqX8Wsdi!njAJUyMzJ zS}Y6XyeyCZ`eVcYOadG!c#Yr}Vp-}#)|68N)2Coet;2f_w}0KNSTa)!3kusw=RDSS zqwc@d@mB8+B*t{g73e<z#+GkOTN}yUH9z0S?9J}gs+<^cm#A$GqU^0YonL5ZTTRMa zyTl}%6*AYb;9U`!7qA$H^1QEY)&}YXKGvrOpjYEPn>ao61zG2hlbndzEvCB{?D2nS z$BhrfkaLKn_bARDdHLRGFae>l#;NNILM0|9BZ({oTq6&KTwFXm=Ii9$H!0glQ*Gf% z9T@I8_r$w)9?mz;c<Mbop6cDvR3JUXHv&9k5|R+wm}YP!-3v|8UUdgu=O;M1x?#Bp zOh_%KHp&&d#f{EDJ$O`Pw6o}ln9#qXd_PxIBE@_{xIvBn9FresA&=sDny8&6<c7v& zg~amACa%eb#^hbsyE!JsNZDY^MR_uYjN!3kws2D^$%KkJ(y2j~3l1l)`=cHDrq;Q6 zWo5TUO<v-ZnG7YpPahG02tbsquUIOnp>}P{g0txZ*7J7KP5tX~ue<N%j+@ncbWbNb z$QYqbI`Y#X@V=HZwi>b0{|&jHO&O=24mcFvM~*9+Ws<9UzC({)STN>GV-0kW)$hr6 zLwap>+(qX?k2NrTlJN2JhoWyBwP4J$y==Qr)3)XOtGrQ7k5uo@MU|dVVi;dKY4veM zYhQE}2&oM5F)9pI4`+#|4N3Kfy!&+jSy6Tnu<-<Rv&+h!A#jjBHq!Z>%0&9WD2aGl z68Po|XSZ0IiE2j+i`))P@v04(5XprdPk0zl7BG%AUO0RrdYL&g#BT1KL4fvEG%6EK z86j08E)Z1tZ*2a*i+y+n^UNn=qRZTQ3-%?}?GJ!6b!L~ckV~2Sxcbah=bG!{yn&9! zb%XWl`ph%w(K@N~pFVg8U&JK@zy2FGdpgghjPxp}W_;`?5vh8Guv9}G7z;78v3|64 zX2TM#ikwxV$4=@25WM~~e$v~J!GeoM-H4Qwo^-mdbx=e=tgdQvz%dh8Ffe`??F+l) zF!>2-SKo=Mm#DzTFVp$_cMpc32|8)lsKLHynd5aLvZYNpsK_V$QE=^)-1(d>E<L6} zICpIqnt@tUM(nR(UfOQOdEr^*fWC$@qLO(mb<fe2dxbExe`a%KvvYwi=N71Yhn+I3 zaD3oY&yndZcjBR>Q6wPzM1S69N5AAEWDrB<#6o5<i`J&bxm^7Q{!Qsq<E^-1ufsMn zG`et5#`(Gc-p6?^A){(DVsgqLnBhpqGxA-d<oSKq5?b0tplTqt?<9Xl_K8Pc4Kah0 zQS`8OQMP?@S3Vi3wGe=BXY=VB7D&!hT-*=)>m?&IOsNZ#u2T`Cv06Y&%p>{-fSiQ0 zHG$>KT`M*&mDxYXzInTt{xyt5Q$}DVK2wa^rj_Ds%K)`$v_vI*Y#W-g@F^M8KLA?K z9V=ZIYAfSD71`!=^~@<KWNdq~ToeGoJ>iyKVDGA!M)VLxQz+gc&uQ46ZjiH<Bvdd! zxURUrNV@J)uQ%~3nN}p)VF|q~TOEmpL~C<yG*lb(f{cZk)I40ClShiIWs1}dUB~a) zR2Pqek@&4SFLH*&CBFQxOuoPAWq`i3v)U==h=zI}Rp=`M=?hm*%;P3pk5v{gq~`EF z)09%O##J5}BUcTM2LQ{w$XWQ~Y@>>}Z-m+!MHQa<Ymyx+MN5arB|>2{mm~;QmodW) zStT$h=NP}Ds_)xquUya_*y@gt1-r<b&nnbVr|*XAtnsVDG<3F-RfE%Uhon~!QVv8< z9{`i3)=c(Y8b!4g-^_Io)iBnNH%cB$;cNmBqI?+)zB^<-VWi5S*GRDy&*-0^J9IxM z*RpY;)QCT)zIh_b<cy0`nc(p=nXzSQ)$1eQ{n7!$_!}~*`kR2_gJ=teg`(n^va|=l z^qS?Br-%~5ePfTb9ef#tANKlGzpli})rAN5jD;8Pjqm;g;PNKs_+ELb;xbW!mZ1LT zmO}Er3H?&=04=<1n|kHKz!zq-Ca&|y$!IJ1<Ig_^)3D*F0D7Qo-K4`~5$abUuiON2 zO|eX;GV{}->VCOv_absNlMQg%wjx4EV1rc#ya(UXZQqGuQ0-7qkE@?CnqVWw_97w+ z4}-gZGJC$+NAG;Pzn@n%<BXY6R$=hfs#@KtQbLm?P%Ot$+ODg%wrE*!S<KQ+X`#W{ z-@F{B7t}N(;iYjM;;AZ$_6_i*whnIn^3|UTDcI3fCCLxNb%wR)4F*o4nq?!RMH`zv zkb81ObK0yu@|Y`|asu<+AEf*SkwT7QPZw><Z@QZw0DZLDA383F^9u7;9so|Ms%S~Z za|}O*Pq4BhWvBJKuvAkvYAJYMDzx6oIG2Z<*G!pQ=Ikez4r9yG`<>V5+TeSBCa{$E z8iP1haa#b3L2}fAl3zBO%52bdQ4z7no;4~zwid`KCB;8_x6ka7Qlhp<_rYI%8x{<5 zR^!}z%pW=YxkGp2BLZSx3<{@{<&^!$^J?pWF0kJs_{VaM!`6kOH8XaX-n*_2Wf?V6 zn8megxQwCz@kTPG%Ok26eiL<hWtO`97}dhh@5yU;6hS?DTC;f#!1>}LFeJsI<Goi! zbEOoNjS(y6eJfhnr}o@U8|n6MPbN;@#pHQ3Yof<5OzlpFHm4ludZ(k%511R77fz(8 zYs_vBY%50LL9fB}wx{}#(`G6?E&>aRsh$nTnz|`!V-}iXS!Q<7J_|8u`m?wJ)~Em0 zGkBEUNc{ki)l)pGpS@F8+5E7T`8ji2uIQde$G5mxclQrJKp@W7Dri~%3Q=6O=ie<s zGZ%05?&+7#>QR+iZbfiTdehhx$0XGXRP_rGvr4(W%xWJD0(kh<snrKmCeHd4EMM3h zK<j=~h=?nx)GO%X&@f<-etZDr&<M=#bJF)M8vw2+yDny|_;9Ydj4llvE$(MslAlvD zNjLndl}fDeVRGp|+U<&B=-rA63eyie$?v7Jy~;2UKgyuLFkYom9k=P%p*QhPl+)f$ zn*6YEp~Q7O%K0Aa^=b4xyYAs?T6Dmxc+>&XtDc_o)hgR2m*xhK2f)*3n`-f~(|HT2 zzFwZz2IT1`7&t7%WlOy#r2cF~I{kvH4}d%Z&!8(QjGa^2{zAwpB+fyLvx5pe(X}M| z{T@_YF=y(AAe<o@7$qvC9=YmJtG8odUq30QDp<fS&lxaae-_h-Z$L+EnJS}G;CZNr z2B{>ovb49$tt*MVn5}bSo@fK;iUHXb?NF;S$T`*cM;+;2mNFe#JX&>x{BYOJMUHH` zSGJM*ioK~1Qgya?&GZ0(-k=le3Ld#7DF;q-hG13HKeN7{9|jf##T2_-cG!5{Xab~# zm)gBM1Cm}m`pT69!2C$rs$URayau&_0a*-ZUMm*_<q#`P<Hqcw23HXM;qN^Hgg>jq z5UQ<_W3`4yLCTWc=X~5+VIu1L6wMW<FR=Ye*>4B&64f_V5>h8NZ&u(o|Egumc~G?< z>QAbH7WLG(`tKV+Q&d*TDJk3?0#9J5geZ#$e44JkxHgv5@nFXRLbPvs`yQHl1-$Bh zX?mmM<b%25`rrR<-u<_e86L?+CTLED*v<%HbHOxGG~S`BJu@rGrOLWM@!eE%IdiLp zp@Ah}2Ws2J7AEZSR0A@!_urr>cpeMeC9W>3qN<vMa#pb&+f<<AH{Ypmn(PleOMqoY zJ%R&nb4EE7MaYvnQ;V%W`2iV5>!BU|a<JA}@PQ9Sp}0g@+$RHQv-Zn5ImQY>NZTqt z>H|QU;c2sV!M?xgO%B1SU#$O)p2&};4KJP<!-=L%QEY4%$HJs*$`|Z^C{bMCm(F<s z{q3}kZ_09g8{W@IgLu!%D2`lRS13Zj8~GWVRVn#$5h?8$_4IDLT+9jCsJXE*g`HH0 zPY^!+1UP-)dc1EO-Nk{f(mBc1j%gVvik7ZxbE)Pk@HvvIe3mEg6f><wbySM9Vvgae z!EKg-uYn*TwvQwux$7-5KmFVQ?xuvhOl{{ai=*1QH7SiQx;}kXfx`8){(-A=a^H2T zb6eyqd2KPycX6h)-Pq=CXE+OuYKcv5vMY;WCaco+?o|o>q9$OsjJ|o+R@;nWC1RaH zoG2b1u`{WGC5K6e2>X0%L0((r+#st{vP3mdD#R<FOvt5ak#6TJxY+fQ-XnNg5$iqq zuH>}VW?&+w=@+?FutEU$1E4+q`qYPfG;X}rkcRUcWb7bYp10?gsd&<H(|J0ji6GB} zOs}~N`1IPWUGO<SUsilxS;QVM(~C1i>~Iz?!qTbVN(NElhSWih>O%;e1s{RUyQ#1I z5RUL%ca2o;qBMP}eK!=RI`eMG%kHJ&I;eR%qb_zyDZA`0+`^y&cCZ$8+kHbg)?zfi z*iCU2)8|P0J&W+?1~0i6lKE<Pd_h>hvyS?^2{9e_qXw&r9`czKA|vCtsvykIG6*@b z<AYJ`-M&V|iMt*RS5yxG_PkZ#ti5UKjOBdKu*S66kg7_rLk4?i-xf2Z--?iGYdK`d z&oQI_@D%WPyH;RE8Rm->vTqmnjSEMkD!d^zqGjD@AXW_S#;C$45&qrb2aq<G2ywk+ z(L}4VyfI#lMFIb_^Y3)qG+qv*7v!@Q7_M%fDN?#ji1}upGDaoue$J6eZxzd{Ge?9b z&=GH(Q}UI3Wx*ueV0rb*;fo!>N0g?vOCu*wQk~#9|0cdyHzqT_zpxA|9d^g^N#F_f zT3YOaGPWZ}&VMl5|5{V|J?O*?ZHlLPV-EllaLYK{{a}W>AFby!>H>XSzZ?+A|Aqtd zI9(W1em-YnmPxb9dGuJ1Q@2t>snfFnI@ZVc^Q=piR>iYJj_s62)a1o2QB6sFO-Olk zoM9kZS$zGd=85aMRe`gZ{m$O|u;EeR<&NMy;wkr0&&e8#^Qr3Y;(E8scBlKWz3I8# zn<s6-VdC5$|5|5!yqfQO;GAjCEOMyINMwbE(Oeb-k0V(cvMN=M>!23LIaJCR7sPN& zj`)Oh43MGNbqhV7gxPW{w@bn%t<Qn{aOpg@D*NQLxu5GCQCur@scG+mAtJvB0<GUJ z+Au__Y<+1Nh$^%?@#rGakEN)#0ltdCycK^#)~F!_$|(eu6I`1vP?;GiD>8nUp-LT1 zLl_G}Cr@X$-_Us!W$d5A6NDwrrzC1jZ0qcbBZD7?SymbnPH4pvTOE$2YVbv9sj`0v z%<QzEIy0VPTO!|}pTGBM-8Z&?@B^sE#Im4d*Yif^Ybft_2Ai`tz=}UraYU09ARtZt z!M8N+<gw53T&i!Q2Z8-IB2=!#s1V>%t<Gy)deOK#!7gM;(xzb0ZlU+|V&4~SYKE0> zLN7@!Rn}L|fB3#Bkv-RdDTQD)MkDRQuy<Q3jur*PfS-j;@a6aXAV0rJ?;PhSW{Qvc zv~OsX*5?d5aee@NjpO*_npaxlxW-r<G3c0{_>3IOT_5eJJvlEoBd4#Fbvp7@_%<z1 zpTEN7sP$kC4?Uw~s`Kk?Nc*Z9hnyBs2=F`cg5fBiu+icWDZ@bGxD$Uy`anP+UCsjl z4Iw=SCCPsitwg!&{mx*rLblChrNy~WqMEqMe+VZ3H(CcT)}CuV$NDrvAKWB@t;+G! zEd4;JpB&ayc+l0H<D@bBDk0*BOQmqurK=RDJ8xHJ+0%gJ54T+iD)qB?1^OL(ltvZg zpwH>*b)GJi{4mS0`dFoj#e74{5_$s`Iu|)nJ_KPe%+LUA`|SbsSL;mWswuK6X=xb~ z*x2rZ0q(PPvx?=6Bel<kW!|z1*&^JiC+j)!?9B{bXk=b@mR@RFsS866I1EpJh=Dx^ z0<tOhXjT5cwoUm0Er^_;HZLm5+IXAFQLKX@Ntdlp069EL`lpDyE1A7&yN>FIqSgE@ z#;TKEywHe5?ASF00kO!IHNu-F`VwBvwlc^OXPLf)V6?z)$^|<OOJQEZ6CF-=z9=LA zr1LcV=sD37yyGw}-et&ToEN`8Q0D@eSh;)F;g@j1^L~y~gO||q4b1mujf<At55G}6 zFm3)0L;I_>r)Ptwr$a-lVT!>QS2X;uCe7KXrqLsEi0NQ1F&Z=TmGk9NN4Ye#G*pbz z!r0HDOVc1{@>SrqAIzOm4ew5HNt(Xs=1wqO2+24NPlitd?8)CtKNLuxQ}U$qcszfv zWER?My=V6A`>+|L@$HP06iv>1PO|1<d9)Dk3nd*o8%^M(GwHt9Q9ZxuDq$pY4Tahj zmiop%+hsz0R~HYkteA&_IRhG#;bs7Ha**8M^$4bF7;1Lsm$Pa}goS(c;X1`jE?yfs zFRT;nvKnh&EjCrRh~bUeUAk1yvqX1v3prP=+^92YBPKKhfs$OGE_v<4yZS%cVanvW z;-sX^PV>CAh6apAgw+m%UNcbBj?U^Ly~|l}GZ0MYx?Sk<#WHvL7Ck;*zZKSE;i5NU z%9ZaFSu&BxJ?-R@R6Acn%044!f*ac-RaA-y*ERhX=W=p;H;TQB&gQ3g<{;)#7Y~D& zL=7X91nH@BF@@FWH8~D)!Cf?pab3BC`>L-ogTC{#JB2jiT};q~y0Nix&;iJgT<d3- zV%Gll+&7c+v78Enaz)pWlb-k6-dc4nXXXvDEw>FAnZj#!CwT~~!z3&Qg=QdIGrNh4 z8YtDx3f*f@%0(q-asSbb^~(i1E}9f(@48t%lH3wWPXS0|-^GMD>Wgznbs3H<SKX6N z;L)cbq*7(?<0>6anDo`=WxyG6l#0wnp09P^;xxyPpu<n_B)JIZ%u+?;!RHihC_49C z6FwD&sLk%c=GX(as|}U|nuY(qYKBI6?oC(5hx=o_-Tu2+L1|x9GTX~Z?duM0=5?h5 zXnd@NTl&PLM~|cGD!-%FM7>UcX=br2mGRcaNv|9O;V|QyHGH;Rq<$u!MhO@ftYcxb zaMhkcMy6Y+2s*0Ae_sSE?W1x%_tn}>D8CD~B-~yw&5f*_cKDhK$*oiF&gd!5c!%kh z?(g^J1$_O;GG!xN+jfDnm@0Q!)rN_u^Zepzx|}z-N*d<hFJrZy6VkW7zaCS}mnMW6 z_|Dlg!B6!RButHNO{nz4(Xb--x~^Nm)8zp$BrZ;g#P0R%hOVgO;_2!Sy9vy%m0CuH zRpY>-t8|(bV6hA!@D1tE&zx6$b!lXYKL#|`2-r#JI+nucBa%nC$z-Z8=5_GOwJgHU zs1vrB6&&gIpS7cdLkV+51dLmcd)FGPy9Y^tx?a)#&tavU^IY!Q(>|%aWr~t<RTeh3 zCNmR@GAuch;OfQEihg5YP*@ok_s(ZedDF~2x&wg#8ba=Vwx0%gO(O{1%DVPF6V>h? z0G?9o$>>H`6Ef}O_e1t#70|m?e??Ic*xT!TXTCD>Yd1Qc9h8Sast+Nl3#!q`nuw3$ zaMC~oRDV}MAcwSxqXFGJpZ2+%mA}$#uiy7eIS$b)dwLFQ!K)sK##T@Md;0I6PUNqw z>c_+N)f2?vjD{Lz5Qzi~b)Qqwgbem6o;7GgBj{M5fECjYWkMtTi0s=vmZ$4wj^b6q z$-M2H&Ds6D#2qad9V#fyfGvk2%Ni>?c%7@f$s0OWqN?n2Epj7${>MwPKU~@`h4vO# zB1AUyUst-HbBvluWqj~vvEN$}FuWx{KRA-iJfRKV3p(_iZRsHP?Q2vPydm1I*i6cl zoAY#wobp9!YPeM{xb6O<J`1j*aHofr`v&dE1^EIMl%n;(<^g~Ug0uY}Z}fKH3|3^M zlDmhTHg(nf(M87J-Z&CJ*)_|D^ThwRNLAhWjn2G9gA8iTxY$Z-uhz_%eb(LMcc6Fo z1Wg%Q$w%k#z1+8_XfgzD+s?Lwzvx(>0+k~ozh6s^0jZ+MRY_SlWumeZlk>`H%Q>XC z0BECKAF^as<7S}=JIxCLOEq&<z4RJIJQ^z3&{27v>8YA?rVFN@!H|{rzkN=;&g3zm zOZ%(x`XTnb`G)sU6$Kwx&f4CEB~)f3WOkId`a=rrcy*eVIz|vKzl1ZRGRxJfS#3NM zNFS3IRc23evl(R2M`n<f+SsT#@pGs{9JIPDu`9n<$BWrGV2p;hq`KOGJeA2;E~)88 zc>%&@Ue=_^ZwASV=6O^a;$IhTzSSA^20)K1ajX)zJ`meLXU3<XpyFypNqOx4djg{c zAeWAF*FetaWegOwSlcm-W<PChc_th#*Lc}zhNd*&FT<`KfKvgr;|UeVIDMo;9w-!9 z2RoC48&O+TqvgD1R%I*aC8sX18UcK57t7Gzil@0cAnS<v%maIYnT@8bKD!qe&otq= zC~WGwuyemfrUBRP5E?7Y=pPw<(n}}?teq%@NZ-^fPRHpR$4)D~w?#rG4j~h?7*D%( z(qe0Xwc-+=2Yy?6NJ-Xm*4Ezd%8Sh+1&^UP!)<JnRHLzrk-JDi<r8&%o+c6dmMIRC zoJ-Z$qGUajw0(5zNrOzhj`84;@+Jz^irV4#Gq#TOAa@WK&bx|>r};d+w%2dG3F`T; zL;FDtbPU_Gni5LgMsCOYUB-B0tZuu^!ijNN4CNL(I#I55Tfw1PzlZL>mk5At9^zDg z(74Av8IMhV?{2A+>KKJUx_^(5!L6sirM+SEMLHNdvfa--O4hcHlScn@8wW)!>bO4Y znvjjMxf!~x!_>K|a#fJLKGOTL+a72}?+CQdJyg0LnA;D4FgHaNj$er;wW_*lS-Z4o z%sTH1Dr1{VX23^EQyz=7az{?=C1S%`9O8T5Gh(pij9+uvq#j0(pCj&}G<B%t1?2l0 zc?k_sv2zY>1?QksZk7tWX9_<Xs#}2HTe&(ZHsMTn@7K!}URpNz#SOEkOkHx^+e#Oo zxU3XkuCOf}3)DO9>|De}>G>l?wr}8ifeD<)CR&<N-nFf48G+no6%|SduPNz1$G-T@ z4sgVDSr4K5FB*<c%90gH0J$j%kI%iekIWZicaDz^m^b<QjpXL+0No5%JF6_JW0sf< z7te20Sp?EcO0uv99H#P}<f+C3(doT5G}=3bL=eR8hv-in>eVg>?z%5ihOzOX4y=Fq zTmOnOGUNvhPxiM>a5tgl7d2SiG<m7Th0`KrNFn<vCg<?c)&gYqH6SVG4O26BX_KB~ z-Je}i3#mr=?QhFAOsu<O+2PBor!;X&6U)<to~y!nF>!)<5;)xCY4qx{zUq3-xn(z2 z)!SS(_#{yU7bq_4HCq;+n3G1v*t9qsv%q9cWPC0b9*-unT?bVh$B6wnhAqV<KFm++ z=~q|a<*DfC+~o~HnLh@HEeFHbr}GCt9k_wV67|&E`(fMNLI)KMpcHoiMoclX^h{EU zXYb-8qwhkf`MfZXHWT|1;u>XhCQYkJ;<sDZB;br@;#q5BYosAXoc5_hQdC|?(N;uw zl-sC87OzM)?VRg_i%x{Q4>umzsoFBsLwMF|yJE&kYrlV=$>(r)AZEUyGYvm<Ug|?+ zW&J`Yei!N7LBv5s-T+gm7=<Mv^_Ono6Yb}lyeZGyHRI{56}lAUWnMu!Q(zungTqjN zvBhQmT=haaRLpgpzc_FjL;N5RL4)R%6c^aB;%ApDN==iFk2Z<i`DB%so+3=GcFA5f zG$t}C&n<*kbVfxEoOfU{j#siCUEN~s$<r}*pC|lRZOz5lBcCXUTZa2-6Yur#5pyBf zfH5NP#&Wuux!{cM_~(oPv?+B3=BtuPyK+ZiaYTBppXP0TnW&~wo*+4L2iaXDP`!@3 zGPY)!)$c!Y7AaEvXM>U6EDFNaUUJ0@n!QvYpP6&pu%bIzuS)L3y>ipb`pmI{?#mXb znMNt$!~zPSFwK97q3YVLLC&5&Ri@l%6qw>UEOh)&r2fR!hh_M@9D6WtyK5pU#96}P zPo)0DRfJ&cMl*PG<aBjM>PLMx<WHpj#5FVQ)Vt(|<F<$WS<Z^re$74)JO*u(eIGj! zs8i$MEF9Hn)wCclP*PYXdLjGTcNZMz(6U+Hx@qK-S0;QsBHKTjPLG?#R3rk6F5iq0 zln~&&kKFX#NCX6jwaWe$y?+E6krJ)X_w}l+l&5Us>~(hoecY|jFphIJsM3divTn`2 zIU!f^Y}E>7QA+!|-{S4{uG(_EeK1pg`u@~QQ?%KcELW=>q7m3X!~G;o`xUG1BAc*( zI6aN~9K~#U`<>l=u!f02$Y;<BE#a<wIjCAQ+)&?M2gm0yIPA$U7J;*Poen*b`6xl} zZiePvuu=y_-pQKrwLkI6eqf13X&rt<MXd`H&Bl>5ZTA+@^k9!vIp1Jo-g~&U@AFi# zj)R7Kbs%Og_b$9`7~B1I+uxEvsD06Av%Du*MRQgwM^%-knJT(CcimZ%9{_I$()k>S zR}}S|VN;$VwcHqWqg4hh&ekAw$_z|fX0z2Cpy1}QYsSaIbm&cD;d%4r&O|0#10<>{ z<4G%HblspXwx3{E|3zEL{N70Mytk;LSH=Q}1c~GW?uv~|kZ~d}DdueyPZC{BI&s=e zRaJ}*lV!u6i-yIla|5Jaeip6AZTUFT(zUc&6R6`jDv!Shj!Pt)nhT3)^Yn)_P2dQY zed$oNj}JFha0d?U0t7zl5Lob*)lD}ryjp>rIptuObaHQKb-5;>3`c40jKWj;*r8FF zIyA`3lPxMREnRCh2joif1ESa#imk}x)7U6Bv~~XR9hst@9m`D%a2I@k4}{JkT*FqC zf^d0bE@QT##I{AMCNMXy(trsVIf=2+tJS?-@ZL$~+v$s9$dSCfqLf09tTYj>ay2*a z)Ex4sIe>u$lBWEak36Uzo{_sKGrl^oQRXrf97gm%b8||nEYLF23%OjTf1;Fr$taDT zC(ktS$bI{WkX``?PX|Sx3j|F$F9XckH^qFDA*q}Mh@J+(7qi}$ba6Hz-cAcMPSj@d znXiis;B~tgkHrteb3U*Ct)iAjpe|u*H`tyb3dioJkxQ{Vz&B&1xDEl_bQl$B#1ozr z%g}T*JU$I0yE2&;%F;Qqf^P)*4bhOSGqxP$?65pDmaeF=vHnWRJ*vOFjUIKQUm?G| za$<UpC38REYFfE!0dZ@8!S!JQ_L16k$ZyJhj$^x%V9J#6Y0O4vsm`t3k0X^lepbiA z5jjf_nu-35P-d@bMU;zKi{;C51Gu=V%)mN;j<+A_x12H1rW^Vk3vHEOS<*fLx(jx? ze#Dt)Z}!I>`g%jlC_>L307Z(abW8U)*195iI}ZSr4CjEGpBGuj6N(RjSjEYxkQc5Z z&YT*9+paqpu1-h5*K3w&DQ%n2R{-r&steypqKIZSS2eaz=ikE_3>MC%`C4yHwU(`n ziK>Oy)AP=IO4%}Ef$r1*djd>n0O1L-bQ+gngjA2Sj|wwSuV}v*WQ@QBS?0vo3TIac z<wsXq(}?SJl1VDoQz$HUci-;l_BmdUF^m<6zRHemp53*roWUh5Q&rOrKfH7%z{4Gb zE*g#M00+-F_Lk;_MC-0IEPBCXV<V$u(o9R=coNw6lTMaad9`9FhuH97E0(fgDVKg1 zh($cCKK7SY+h+6+(+q)sxxP`SCZ$*4!1`<WfDU813qp$2P$rLR<b68s8hkg#fDtu_ zsf!h*a4^p?k`KPJ+m9Y;G_?fWNP8w_k7Sd9eKr7YI8c3AuM4x(QGR>$I{FF&1At;w z``*26j*laCw0#!kHFTYc0(gg!`m!(U?UWgr$*;R7^ub|YNuvLiXbi_EXG}#AKeId` z35Uvjo$VvLdmW}ox-YNJCv^k8au(+r1zX~j1C{FxJFx~ahOkO3-A#sTzVS%Lkx5#} zZLX5Mf7<(FyxRo}zG8Z33~vcNu~!MQ(|U{*0!*G^-OMPoFEX0emCZa~&K~lWp9kLu z5;^t4zkCQb-lM*^f0Jzg92*$wtD@w%v7veyYC9|Yirl&ZS^z+xr}oIQu*iwVufJ_R zA)9ARi{8LtlB1nUcbX-JBeugmML~jEgipvro<{TC`_cka8>ZP=X7CC^rBysX@eg{& z=z8uJ0$_5oj1-&YC(yHQy272IB;q-86CxN4wgX!)FE5I5-;5rS=Nx4AilU_%pe>?K zi&5JZ<omX1>$A!Px@vyjyQ6k4ArhvsC9@yB5gf**_FM5huL|&ea(7__U5T>b5wS5H zKcCh4;ljVg;ul%$7Z;<45SA6E&>5T5y2c0__%I+@_0@&sK68TDViJ5B;aLnO=(XZO z(-WKS*=%JHOYK`Ma)V9s^lj9-C*l&wG~%ZA8qIkJ=1!$XmOwj-IGZMl5_U|))8i^< zOdZXvzSgeT$gGuYuERR<jg630O|P8nImu-0nk1}K_4gNq0=K*8MzKSRHsbTVg#&xH z>u>baY{sjHVx+6NTH0J&)!UWFv`i-WGXha*9I2W#wm*RA-%z`RW6NH(E3hN1Sbmdy z!-t@`ZxHx+{{5V1dZxv>->~n<SYrinf093?-lBdoFvERr=x{=E(;Lww!p;0RQZH~= z^(V&@Xl|Ux`~x6=eg54ba}K6ciR2_SD(xo6)h7LOx5mvx^$-yF04Q)uD4!VPF3B%1 zO9_)x)_{s0%VxjoG{Dg(*6K3VN?920-}H*GbXW~Q%Un(#6QSHN*5#T)a(@6cDD3QM ze@YiFdl@8Bo-O$Ruo!97u`e&GEgU1(QN|#U%PSa(t7H#3PmMcpk3V_hskE8)tvc{{ zwFiZ|_UdKTVOoZL;R2;h=PZtEi-kD<)xC~vSUg`5Jn$uBpzaOSDYr?ro^qlJh1S(0 zC_=vbv2cC$-?$p*AC{wn9Pt@+xT2@H+8xZ;C+swl7nIfLrz3vs&{pdK@{y^M*a@&6 zG02!HO*+0`1sH`5Q2MvatJs{&cs|{o0n=X&(#bC{vsJ-yMh*Ukm-U}R@Q*Uh59TC~ zZY{n(00K)i;_Zjog=U2cUph7>Sm-F5ciB4&wTlc>xa%a=Ul%%iY13kZ`3-^|03i6v z3u^0sZV$eCj2Q5T0rRIZgGF>+pBZw~--36ZeAeP7E<yVJpL1K+v_{^2wr9sV1Bc0& zhtQ(<1?YGYfhxYS&(^a}uG@uw`TGSzn8Rs)aZz@mi5{8wmtK;(oCI3<_J|Qw7`_D_ z9(|$(tlzbSd}*aDuOh#pPafZ0Q{8leRZgndFfX^n#X!-mAREIj_C+*@5kfU+XZ?LG zDS4A<r!#j%!?r!{nL=Q8LXI$#o)oPhd-TGi?=Ra2CIM1e((%-*gZcYSC19JK=}`wH zFVgL<Oq78rvYmexjKEDX^uJ}(B8)`FWG`#uAyJzg4^kP0_`}i^05|LM-Z=S%PJ!`R zqtLCHscq0qU*KxeYDrXSTI>!z%i(ffWZ}H0TMV<gIbZR{PPl{jlS`9=1(k8*!mA|X zn(iBdFx%QK(#W<GbG08_B`$h$ww^xUgF}hx|FA|$(5&b^t=Xo0*VKLvHj6y~E*L`$ z8{|~%4I~xc7)3Y3cd3hBOc*y{YHIeHj1_b;G*6g8zQK1qdH+Ks{>x8<)6-0E0ovML zR9ELPisVid+UEtZ^c2?v3CYy8m44>DKhC83h_J};cpR8wEv5D$prcw@VDnw4fQm49 zaZ2d^ev2s5D5%$NAFR;P)Ut5s4bwBwF4TnqZOqN9hSLX9Cl1~`0B8@ck#YgZfbV3j z*baR@Mj?Hc?y}`YHhOO;Dg7P?XAmt6PPK#fUNMSPZt<ZA^UY5wu3cXnuimCz#Wg60 zwXJ5GLljZsFRtsWa8B1ZBAe4|c|8|t!``pnrUV&HhF?nrYK(MA-qPGL7ObPw2*y6k z*{Yc@;d>JtX3R?{uAR|uWm>z?JGxap&q230W>VH@V2MRT(@bgKPj$O5<Zfi6f6O|h zIhK|ly&q2>pPz-~(ydd<2<<0Pma5^mVVxCD&x(v3S`s}9mfpiq?s~gDPgNkYV?Xz} zA8Mn~V#~sMvexC1<H~a2o>jPWa14(keuqe?XXL|Xy!pE&>H|Yl{1(jkqK8yPNwMo5 z0PFaYBi_arrJF`GG{g1rk-TfAH9y(5ALq41ZywMCM~;(HzykSsbFnoQB;3y}+^g%# z6$@<g2rQkn8Jq~##MJ_l;2{P)iR?*D&wACF*Tm@K>`-3+NE9|+G7bC28}YjW$n>82 ziArkN)Wsy~#)jwI?lS;|$`IQIZ1-xcSd0Jc+etazsi9>vG`{|<jxvK7EXz@xI2^e! z`E7Cw3Qi0n=7yn3Bx=JpbPPPRjJCdFV8-?7#EfoOigu}v`S0U=*`0jK18nLli2@Em zJ%x&krD>Q+n;QH@K?nm2O?C=TzZHBjb*3deVRE%Dk-wf*&(Hm7e0kL`m1^1GY&#hk z7+0-T&U2k5Wda#gXGjBBVH3R1*j;T{)G;vR=5Q}^C5w^5)6c~1Bj?lF2v6!ptSBgx z=}MN-tDEjef!L3A<uXM^b>?A3kBX#!k7A`QB+rWj7qF~B7&)^vs%PQ5AtV-S=B#*` z6;-odj}>vRrJoMF-GqB%<Ih-`zWFO;f}mmF<dgZ%E})L!TDCxp>s4fV0!pPymm`$m z8A6bf4B=0M!I%S)&l}sSpd}sqf;<f7m{w}cO`>DtcCv%zE;N5My@AZjZ+a-N?}rM! zoCy!Zybn%MgNqcrek=1o_?8GcVD4!I0p7@{W&u-8FV}IfivBK7U=OH-$|@rIbCPkS zq)-f7x#g;-?ufvlE~Y?-{^Z_7c;4{Li7n%aR`vw9c8LWiSl+#e6PZ8xCC=N6+mnvG zwO4F(j;)bzbdP#gPn#~6imfr1LFx5L(w3ZoA0e|gD$=6;;$Uyj>7mR+ecqQl;e^ur zfaF?`Oh-Y5&#lb!M1e=D8D;TtPUGAMIkOdV@~Qfx?<gq;R6qYcxfuHqM=j6wJ9u`X z`=r5@bA_oK#?s<8N7&t_p6~iZM>3Nq$Bhn5f6dDAI_?30?){UJ@}t{-5;(!Z=&NG) zYrwF}Zu18~P#uFut-0@9n6fVs6UE^Ljjeu(w-#LcP_`Tv`B2>DVq+Up{YO0Dng^b; z{hYwg*Txm=to{0>cKqgFaGapo49ti2fcsW+#%$tl85`H}pD(~a1YT#mUDjhAj0Zpu zR1;G+lQ!x5?z8DB5wAAK(MFS|4xMP@JQcP40<y&h;h@H|C$+LW7el}^=BQ?nww4X& z^6821yyaKHLp3ZpiaBqiEOI+Mu<1mEgi|HtP^FJTkz4RXqzg(r>#0ys)`e$RQh>$e z1c`IqDM14l!`Iw;Res6Q#6(nM%ek(K+%u*vQjRf{kB;HV8U-4dP8ZgSE_>u>J_TiW zx$h+LpJL|GX3u2o&AOJH2{+{n!u8LedttwL5rYhoQnpJrqk0O{s}Biy3N4XkP=@3x z;CXg7<AHWJX58{wm7}%jz4EI>U2b2JMJ^coJvtiHl}=R*2==UYwS~zH9eUIr03)e8 z9xaxr!PyC-e`$GSF(?-$hJvAEy`t>-r|lPhB1w4PCQ3)}D5KPd6coMRnE4*Gn%%Ge z59+=%uBq%@H;M{M8&rBzKoAg+UIQvkKspIhBO<-`8ls?pROv{S4xxmW(7W^|y@cL- zhfw3qf9A}LGv}Ny_jkYCPg(h`UDn=vt+zby`#!6DOm(Ra!X7Q_$%U}Nvi(QPjH~|B z`naj;QazxPn+k#OaMDiUYb>q+JUT)2)0>8tiTlHpngXi50yj$I@djq%F0giL43YU| zui9dDKDuP(kH=A7Op+2VujH#~CrqMZi;atORy#sGp>*wi&}GHIDit0|2(7^gd}p>S z%^46F^b|MW9>>l5O>eS>&6m`G)RiZv1V1?|XC0JG$SMnHcJjFCQ?&KKj-Ma0n}4(O zKYXbG^n0;6j`r6W9r>Z?Q8Ud?&Fty<k!0uS_>fZ~o7X+RE>GO6ZtSs#D!7o&zcz0h zSwpLEK`Xiu7;Ge>5Ve&Ooi*mwop}WEW>xe;Wu;~0nPrQz88hyXXn5wi6$mB|X@crw zkgS~g{IzHsdpV|@tZ=qyK31d97JI&1s!1{F?o5MG$xhDG>(iY|nT3&e+#G!&5YYWE zngV8hQ{9r@Gu)_!Pw`p~SyXJO?PF_0bZmLj`Wp?EsT1_NVyBl!leLZi7g}&$PQT`J zWmbuCaw0}p*JZwb!G%#OGhC3K-_!36=`vm|sx<N7`m&zFME73zxen(O*EV@LWUwcX z%%>zgVm`#eDajr{%>qw9x|EF^7eat%T!?5~vnRM%hFT`eRjKjgio^gf*<!}=8wgz| zPFd6QM|dxzBGU=AxT8>KYpaPjYu|h9c^9Ol*vad8Gswp;zF8)iV6$<)LVK9_cR5t% zR=p5XKpRN83g+B7r-;+v*}gA)D?sx{`N+%WsQ?NLskUL&(fcgP6&sfT!)h8@|ER3| zpu8ROk?;pffaMm$W>t4=U;M6NqE2Z7vw2<)&bF^X=6Uc9zuGa2ND1x#_N2<0D1+lQ z5q?CzDY~|zsL+$Ro2z@26n_b>Q;|Qv{d58)EvIc6WT5GuY4dKloL94rErdan>Kej= zUe_ThToS6pCj;L9_|V4^+5NbUw=Nck(+sTry8<fEhbDQk+@|5y$hnvYoz=06Gx+@R zqWunjc|;#Rf`^%YnB<Zu<WnmWcqvjVza6`5Ys1|&X+3t^<yLUM6GstuYGeY1(tSs& z$)=QvzHU<9b~f%?N=Y{ebc?J&TCL?N!K(K@9}H2IcuZwbvwn+qUO>97E0>dzffN3t z_y1m_e>5rE8D>=&=AbifM^yD=zx>HI^7&5zez)djH7tx_J>fIiec#-Fn6NlQ@OE-j z!=M@EMIR2H>MjiCdu?~?CqN+yvMYvzQ@Bx2I;|#BCucP<%*Hra_|$mkIoW-@#{Xdy zW;Bc#reR2%lKdsGQ*Wf@pCbNPZ=)rDp_BY4;FHqcPr&vAoHV2R_fY-=S_PZiyFC>@ zGeh>~EL06m-H1NcDw7){>8VIe>{@&JdZrE={-RUyPL?d~<Wdp?W8c2>n&H$+%(j;S z+9+X%bh~dJTM3il<Vz++8{l*HM6T<~i(sk-mSWBhO3^<7B^*3K>YMVn!R0yqv4sur ziiYnlinWpX8U;Da;KI5jua{4QoGuGcKLJ~c!3$B#CKW#cZ?z!zOU~$ca(F;K#_c`l zv)(wq9U>-NxdJCw!^Pe7)66p+97oJ}3}q`@MDw}hvGxih|0eWc=jwmCSc*L1diMw< z-n+jL(_M4?pqah@ufeIt#LixQR`=HM_~V8~hmsYuIMyORf*cVv5I`aqmEQ3au+D)P zH;ukv%sTz{=f%#e7&W0L8`w+|!|JB+M7wRxxVsN)z;eLn14EUh_4Jso<kaF`_7f?k z{pXfG+$e*DL_66{WucUaQ8&qK^NwZf5Moh0yoQ=xQeGCbG{u0y5Eis$*E-kw_NpX} zbHsjaY+*p-ND_xrGD;Us<Lyb{9T@bm|8JnNe(s&4N}D1UTs0>;^C9JElA<69OlwWy z_2>~i@sb|M&uj_>0N`V-?5qiVu!Hs`h}8=FEV=OD)vA+%tPak}B>hEg;BUE*X2!%g zT;1onD?Dw{f5O#9U{Atek8}+$_f8nrItsTn4xKKTU8}%nIBUd=4j9lzYQZ(TvqY_< z%eQbfyY={$xQuL6#@g?5m1O7mUG*lKyjuDODOCUcd~Y_u|DuS6)cvk@%EG{~)@x!J zehI$YcsZXD4_>zXSn}Ba;(30j`90tb(X|yq{eGwFD$Nk~<{icLx@0t@nA)vdC}2}i zyV-12HP(i7)DrQrzpv!J?rh&y|3HA#Wn*`}PPvp0y#Ah)n0J}EPZ>@*__ze7d++pI zQMpO=5CvTzdiy3G)z3-`kj6XKYgg4Pk@`GU)e!SKd%XrAy7pe&mnpZWOdo9VxO((l z{O-gU@_k@X`5&gFx@vP>saHnrg|GtahqSDe@K=&ny@S*Y^8#rhPly9=eOaJ7qkH}! z<rPun^_XDN1(F3DamxIiw+utYLoVS<EA2uL-Cmu=_-ku-F1{`FaazID=zmBsvM}a5 zFSitmQZ<vyAsQez@bA^hMU?CMOf_!=ZB(w$nNvU7wYQR=eQ2Gi+HWB$&SYp2%E&Oh zZJLS}$)mk#lpeI6yEn+l<-NU4GnOi4Lbw=6vQnwA>cDmk!RTg!c3jiGhILCSYoVSn zeDKx2^<je;;MLWb#~bCs%Lf%QP?FJGm^}O}YaJGxXWrobqF)3WMH9KJg0EA){jxtJ zW}pE_@C7{nP|#vrH0;{z-le+{IB(Jxl>RwNaZ4~#ftslE@H$paHBt1ChYGg%s9oiX zsLDCoVHmx*`=gIyX|7#XPf%#C*SU6m9lnqjkiZ^jXMC@Jw`@3N>)QI}41b}3>*tzH zdJBbgb|zks)`%+)sog0bX-vdM6J~gEa=LWr0+eMm1f~KkUmM|1P5+8@yIXL^AFK8K z?d5{fS`((8KG7@mC*WbDN<CY5CzPrlb8f@K_u9I2RA~ND5uW%vtMAkCD=T<-2-q|D z0HwU}`#&9#f2f!{u^4CHPBVBd2v`^vn|x4P)kq|miAi+;amlvF#M!$r66l_{qV6Zx z&E%_S$rBNCuSR4AB$picdcEN9o?bT2-8D4hw$___i%=iP;P`CVS>sSTZl4NuyLM4n zM}u%Q5QyZ%<Z^62;7h8MIny_`z)*JqmxGwNXfzz7>^#ou3l%_l?A=y2^*H@EKleY# zX~M;DyBtz`$zAbtB8b&5e>9&qXc$;6nB-v%q}oZHdu0NHp8o}F{xN-Vuu<PX{DvpO zez43w9!xSWfi+H#;vI6Uf7>q4E25--L-Uds^B^$j+W#~LA=93<P#uKpkfzR&OOV$m zEjRS5L1~q#s**rkVr~rIN;uR27+SM^Qc~@$cDZSH%G%H_ws?h;uN<EQw5yTk%}+Ig zZP5vOv(jR$N}Uo64$%YOwencDMq&yxvs&r;PlR?WCfnBcr4MsTDxmeF!m2@x$<9p_ zj6D8Fj0FwsW>>SzvtCkWA9{WQjBPKV1-7a8rNq2w-O$^{&ZlW-W3R|0>S=%YlwM|B zG<4UW`1Ip_#kNhKT)du^eC*@=_vMS?nLNCOzg?M}$zxz~(5<T!eEzGyM!vpfGi!$o z9a;!jHFzp>aBBDby!#*=R|v;_F>xV5Vs`P@4Tr|j^|MyAIXFh4>NlU4_h$T#<CYnx zu?Cp36Zil1dG2-3*WqvSbV=1**6f;X?TIG2+svx*xwftD8y^;k&D$Z$N4u@7)s>Vr z@w!=k-MblS1KhcQ&kf${wtH7<py~HRK+|i}(vBf-#bXGFqZsR4pOY}8lkhqCI@ZJE zEfY9fk7^Ka!6zrbm0W&MPwQ*evQ=^}G@C^EoX{=H3Oft?1zTGG2-x&O+AP>Q^^Eqc z887!g6D6=;-voM|`zxq73KQRLUYi>@Ru{oY7;KOL7mknHB3)f5E9UB2WhGy%It7SU z%I?|BjwhTXVYTZ}xx+uKHpQK7Mvk-<ig=&PYP1_i9EdzM8yxEO6%S+~uXW34+D16H zT8|mzM;mf2Png^<y)`Tcq!zJyzuU=7k00%s$at$p7HCISj;iyL=c@J+ASt*{{v%e> z?8wSfoStthfK<fJ2W+Wj3YUX)L-R8XYHeyPv{fJW?44yj0lpTgV2Q4<namnN+=c2H z=lV~plIwkrDSoP`(5DaRhe(080&x|vqN2c67lOdrzvKXJsUh1b1j&!klpZd1OO$fd z-1H%Bo+8lYl95FFqXOMonW>}9%nt@~r+)r?e7r-FE~!MrR&6_IMDsbM%z~C$5wsV> z-fo>fxGgVE203mU-?XWz?0pV@!rwfewM71c&&cD@=(HUo56isy=Jl$I^Kx%wnTV{e zpt+WP9!0_w4!fwOYW}Y<%5{4SrNA1CMCcE?(^fi1Geq*YvyrB^7o3LZu;Fo5i+--s z$DPN>w4Af%F3Ksh$?Q|q#j&_6gAe#4TPxd)FVo|;H-CyariTxRBH#D9W>1b6A}P(n zxjnpuj&`hIqHMc2WAeeDGX%uIL3atbgUcUamX~TSKqIc+<Tw4BH8UGxSl;2x&OdVB zZ#IB5di8QRE%KUpT*QN)?TT!M!>BN$)y8OMym3c@4o<N;t9(I3!X53?X&m<0@@Ym% z^-N`lu@9<5kYZs8Hz`OGkhGv@Zn;HsTXe15N4uL)WT+gQWS1ko*kWcbiAyQ^m$WIi zWyQwX*j<8)uvy)ruX*mFER*G1VrzzmU9^f7Aelw?ds0x}WQk;tcJ0JxJOwjESug;_ zxc3(>JgtnL%nOJWB-dJlL(52MrDSp9?%he?Zb&>=T;NVjICEzh&8y+Mog)E)>Z_g1 zc`t=#@S<QJndLSy^K*$J+u8~eqxEY;*ZDUA=k}-o0&(_2XSwqF9~-*K{MYK&Kd(Ku z$`jm9Py5mHD9FBr4rJ?L?TbgoWx-s2<4mI4_9KU!MV6P(_N09X2|h*17su=)xA9|C zo@*Vq37-N>shEzT{_0)*Rk}#kBt&auYk9&-T5EK)fMzYxiSt;30)6<A9y{mevS1ZX z+~8$cE;H8^J9f+gMJ(7DkO&D@PN=9GKTrIk&xT?C9`8pT;Vv_mvxM20<yjIDZUNP0 zyTW!V^W&tOp;o|lv`v{eiqoW&UdJn(2%caWP&%P_>AO<g#QZMLeq-j%%2S4nBp1Up zKLk%fReo^w6~ySUm-D$3yy)#BXVEtI#l3a5UA%K9VjbhG+3o^IzS5$o){mqc;&R^G z2jP<R9rR;BgV~{iAl=Q6=$*)62?+~vR7lw4T=<iHNip}?9wV0PuN@V-ox(Cxk`;j9 zRs)`!FYZ4b2yxq(r8ub{b=|6uHlNGO+;vX0^0LxKmoqWND*uUI{gV#2cJr;Tr>GG; zM3U|MO2?r1q`W#NF8$JrmYI-&kM8LUyt9D?)}S%l1$+a&t>{AEAYx;uu&`T11PeC$ zX`y&Mc+Ut)^dMmdb(PyNN-w|6B8S*oOV5Pdb2_RGMsykV?zPfuyIgAJo_TErQ49Tj zB5R7VLIo@Z!<lsjOiXREe~#*J<2&&B=^}c)Ws0<>59>!c`OBaCJv_s4x~E?)VR5Sa zEz|t!OiW)ue=6cXeaZhvz}{`xT*6NP-DdcS9_$Eye?YCKNf0YK#<+#^r`EOD(~B1x zqVgB|rg0w3Pk=!Nc6Sp;ns9%@_rC{i0mY$X6L7AkN}XfDq7u|aYve)~+;V(@IwE;c zW^uOb<SuUUH60q6u9c}FG)dJ}XkWSH4k1*(3cAb}>uxH$JcyNZ>=@MHm-5`7k*b(_ zsKr5O^<9_)F8s#zQ&}0por_q?9p~E(=MRxlwIK$;D*bhkiQ*F!&JFn&dPOm<oy{dy z-KuF^gPzL`bJy?FnTUv#V%3sr*lVHpU+1cC(5c7gT_u7Rq<lR(NrsLH#6GGKyM5l( z#Zn>DPnRPa5;4*;ka~`7<qnnQ@KIC{zO1N=n$OUKhL>mc@r7`kC@b2pDvApg_0ll8 zm299-8l`+yHz}h|J<WKxkjuPw@%8@CpnLph;MStFeAGz2e>J}R6Wf;Y`C;;fv~J3t zsE|Ba!P5rb93}SdsIn~E33uFQ7(epqTbGLHN@>qHaZ|Vq0~M2bAC6xQ!<Ns&rC63{ z-L~UCBd)^bw|1h==<@qi7&fKroeFLG?6US=k<JitzGd>*^4X9&xNKS$b@~Z7yD(X> zN;O{Y-s+mzcfu9|!{d0$IL%u7&ygh&-iNIi2b}S?BIz9w=gBa(fQ!z*$s3}zdTyMb zAC|U9jc;>LpJwiz0~HAX^P5;WUpI&%DN{g*Lswgv<Q*{y#$g0p5Z~_oDyGmzJf{BE zen58a{JgTY0{0RbnH>LL(-l%~8XTt~)t+DV^~IPmb6ULLFzK_yd%L7BFVI&!vbh{) z@T!u2|I}!qr!PqzIydC?0r;wt;3j`6i!>Xcgt9T!52`ldYZ*VT&xlHWdEO>cD_1ef zIW^nF5Gnbd_*x+VAcji-a|hl4Piq$l)PE}J&lCJ~9*chds`+dqpN*^}lwN@)H^0({ z3d>O5`tD?#HXEV)VPHvK^M<lNrHJR!!|~(y(0yNf@b~$>jboMwLhATA``Z$-vb6i2 z^;zX{fw&x;BCAaVG53MN*9mjt^3q8Xhsm*5=S4=?K%yp0*Wqjtr~3!QsJ1e<Fn4{5 zuQ0M8C(}M0P?9;{=tPn;n9sRdNuxED;bA-A&_HYdIRBvKagL&9PG53@E~n+L4Qj5l zrcT0OtEfY>9w?iakzaZ19(~b=W`!h&h%b^K85PzyAx@jLeFfiw;6>kBZwv(7G53z0 z3x{vUd95;Jbz7{az}<$2d(K!QS_c)FKRbQiWl1@xHp_-t4MVniE`wk99B!Gi5%aK~ z1+814dX-?Nn+#RJRB+!W*fA)?xVLojxPEM+iM;Vv82CM4=NcKsH?-~6<gcRY_vOw- zIe&Lbb)1q2qsZYICkuk5h?|I7DRg*n$K?DVdJ=77Cwueq3GGL#V^kuVLr0(5E-kV? zFRdkJH)bkg$s=iiF6Ahwh3nI1)j4~E?@7(ceecZHvlJy=i;XcsSdFU71la(YE}aC< zqADdWL@R@8X-?1;o_rrh$T4EEtyIJ;a)aJ^^kFOI?^2!cSl*W$Bi%I?Dzxm=3OJCa zUkAa7`T0iHAYw$oUF7>n8OQfZ{3&$=5{2snCg1WD;UI&I+9=;J3isS6uab<Qy4tQ{ z0nMufy3GDS!JF`QubL^#*Mv1np-sDClsM0V?oHtMZMH{+)N87S`L<lon;Ix4-GXgu z6G7;0MrLjSK~}<;lA(YT)y4<qN8A=S-poNSKU5^GRM7R|vEi}R7WoA@8&Fk4v>j%i z@(}EOao6(@x3GzoQYSNg^zpx<G`A#ip_LDRql5TTm%@qAV$ZitSrtQi+ldG_cz$Y! z6Ft}ZFpo1UJ1ePELObO_RXiYs<j3*mSn^N66K?9C06#9+;@0f+n4vc(ov6k1={%3x zG@NVOWm9oL!KHKr;3Zeh8YjjZws*1|50ogtyq719MJD78exH71TFHYK;Wz?rTDd%J zlbFcF7U<cS?@Z}6tXYT0QsT&rn_?UGPwaNq51QvwPx;2MlD${cR?eUlus)^Zo*=0t zqFFLiioI0wwLXr`<d*JFK>I{PO-?tVKWwfWa(W?*aVZ>-D5&IKo|8ClAUOYWncZ<_ zWZ!>DZS@ntXo}rQ{q+e(D`XBz=W62KA8uSSZ%7{`GB1B>k=ipsTtX8ss=bRV&9Fqs zpMdZ(n49kOy{>NG9YehS{Jroz(yo6FchhGpocNN%c4a`XLM+3=c9>6FpJP3gR?xci z7J(ALjW@(h;%a>T6G`;eT+6yzF?6Qd=QWtfkg4zqy+YfVf}ZU9qef(xl}E1*{7bN+ z@c9>XU(k`Kd~w6aU1aO(e!A)pRU_E#S*zgwMVZuZs25yL%hs^Wy4R<ak}3hyEyLj- z3a>t0vO$Y@q(bld_<9kZs$A$B!f05oZkCcsg4@rPM#A48I7{v@WO@_ZZSl;DZ##Hg znnxYo8;3NzO)eas4zR6peffNVk{UED@Wziy!`L4)&so8Kxhvd__9ORQVQqc=3R0b| z@)1fU<nt7i>xSoe%j|ppu6F;h_ili)BM8_jzEwvR%eyCe`1p{{JBh1e1DBFE{bYEi zk%6FoK#(ys<|m*)^$qC_h<QSITh~v(C|7ClZnsWc&Q|z`#g6&<4Tek!V&$!CbHUs9 z)K4cM=ig5Nd$K2=b1$tCS8vgeQ@KnHQ%fcB{x1$yfHX?o5TJQ`>_bb)KWmLt0MXfw zR1k^wI?0jXn4Q@zVbON@sZC!~!-N?}*&#kxeMq}~Tf0qW^-x`no|4Fx7b?0nJNll1 zqLEq8HCHr!t6`laQXf&?8SWBTqMl2KN^FUwdMyL&mZ^`(6zp}8d7XDg$WdKzWB$SH zS^#e5=>6KA`gn#^%8y@)&Q_{GTR=71AtkQFos<h3==tR`t8AIJX?4%kY%#R``13*N z+~Fxd|9;!zd8?DmnLPEn7v=l^x}=G^g)(yBQgU*;MlVe+^;?vV{-cBt{Z;sC{Gd7> zn?xTswbg4;c~v$^$C8*hu+N+;V)0W8mg4hUP6`gkJdmQEuHhm#?@Xpa<T>wnBm`uu zdqYM&@E1w(ml?=&c@MIf?11gI!^XTw;GlH>6*2+SX&>MMv*;?upMcGB*z}bnE@YVa z^nZv2kda+eaJ2}cn0jlm&7Q<SK=0v`>$Tl~$Qi}ZNyQS{)N9|ZPx73w@x2^D2XNkF z{Y-}|@=MA5RQZ-wu~(q^4Msz)0FQYXVTEx`g|TW~s&GtTV8*|BQG*$#Y>ecy1h!@B zg+@mtC0{e+cXeXKYp-B@or;P1g5<MJc6MnDW+Fp=(I{puJCKQ>X+xfikfdu{+ojK` z8RtES3;8{e%0|Lx!kNQ3k+ZH-H3xEX-99DLovd^L_^|}iLNyqdOBIi^PYGuxUU713 z9feWfeKlHx*P{xWtH_G8I|^Q7-%K?56h+li^K$$eKK;CMvwD{BGKaVv7er|Wv&TAD z9NDTcF**7;!;Zzq>>Ho~baBFIb=13`CG{57@M@L@?9u#jX=%gqCt&D2ku5U9NY>{n zX!45R+d_4`5HTd&7PE?52!|8r;g6V_gRU;fk>{qTgQ+EYkZik9_9gpSkF6{D|D1ML zxTX0y+!f)7@UpW&b8tkNAq2LI@~Wg(zX6;&sGfRaPYW0-nhR?jtFry<tkvF2q%kl1 zz><uVQa~cg?OpP!t!K(_8#qe!fjXKo^6seA0WWa4gZS8D(x~sM2td4(<67^$%Ix7o z0bEE}FvW<ASUMT=eVehT1o&g|Fc3I2I70Jc(Y``=ouiK<*)-c*LxH-_c*QyFVNQR@ z-CO*=&(G*e``3rTYjsz7WE=-WY#(U@#8e%Th#BX&00t&hqP@#X8k(3npM8_tHH|KY zD|ALFJbFwpVB_p1HCM-txw#{~G#moG3DmAQ4@v}^=U;(JmtSHnJ*yRz^oQ1t{ibvs z3D%z9G215f_X1mNb975?Z+Fz`KOnZ^)*@%(p7>_WV;msw-1%TG(vxJl*5oUSB9=kG z63Sp%I-B#^k7GHTl#G(j?9_3zADl4VIy-(9Ap4p4X5RyVSY$>8c?#Kf{CpSt(ROxT zb+D#jy)4{cy^~DR;~h28q4S3QbHFE(%9K60E%s<YT*;=8^C&dsWn(T>;&Q}^QL6uz zIF4W!!t$HkOLap9mIQgFCt*%g3%@(x9*>}Ht0mzBEgPo|zWdB(bf}yg>u<<sGe?ty zVR}PpiOhkvPuwy-2TxS)2xWU@Se@lrAAM|BA`uT~_0DlSQ|Y7@X%x{NA+r+X(8?EP zuR%G%PlHb3MOhZ23cE%xar_g*+_+Wy^-536RfEm5!G*Bld<6y`2}4Xk77W*^^Pv7Y z3jx)pPcq3#Ke8FBskh2f_@gLVsf-npv2QXq9y{bcmMx_5*6=wx{ko@<BF^o2XmRK< zTHk9^X1UHH-+OP0wAc#L4wN)cnS=W2VnsK^(=V1G8H`{_TrG9d+3sxp^4!bt1hz`X zH=_+<p56n%#*16XOQ&HsnFGW?cs}E`!&Kk}W~%l!*`W*uZ;NJZzhCvQ!^756K<B*2 z#&eQRs|`LEaUYoey3zVyhpXeXc!QiIPQmqgV|Hg9_x_i0d1$Y-;}qsuf6CRxj^T}l z@jg+m^G%J;95>c5-;N2Um5jpuB$-u`6Oo$ARN?r!uuHs$%n^~rO0+Er^IznXxDB}j z?YF&ihQ%Lc+dc(Xr#1KAaJgIeJ&Kcx<}zx=;{#@t?$tw$;M|zZ!V;E(-NM-3?&IO< zDz=n`GBz=)01sIM;5Ni_jbBCvl)Xk?WJ`O(<E$)~HbtCUV!*kSR6I7SXYAc){OnrR zk{KSn`bny6N#W3bEeRq)Lp5hLjPc7&aYAqwjb=1`O7IL8KX)L@;LuW5uqi*GYq?SC zc7^a~#xmFVV7(6uN82G@nF2)lHrjpxA9Y9D*w6$Cucu7!1hn_=%pL0uP(UPGb*FaU z?n!jBcP*nn0zq@;kgr)yKLL{yKLH;fU2aIY%b&W=cYiEQtFRRcn5b4fhbOj}&)#g? zem&ko*Dn4*nv=xS<DmL_8YF;o-LUj0faWc>aKjLfT({_voQ<G`tzoeD9Z9w2ueP+0 z5a1XBb~$0yM0(&yIyBHG(=9trYu(j`JE2(LynJ{}iQeR<OXpzS(V;BMfH*2IR@gLJ zOT;8}qsjL+A&uTp<9<bK@D6+m=uyDKt2w@1tu_E27}oeqt!2g?wNX0MHR*PJ@TpAB zlw{&qi%<R-or1Pab`y?67Q8{tzGf5|mLjdfVDt{hEFPvy+ApyxvJANQ-Zp=3RYHJM z)^fTacDhzvMNgCS`vPBrNJr*WVrT}faDG|2wzT%pTRH7H_$->@$8Jah-?3$G)XAGQ z_J{dl`LSYdW#!Dtsi5B8A7_Dh^a}J+!{@qV@U@%donhU#o%saEpEy`hV_kZuclR8u z3_hZ-s2wIThCGRWI$jp}vBOHnnb(CyDBK8I45`HBMO-9{Z$uB!D$mo7h+R)<Lb&@D zkF)TW^yjCSx*qr4tb4s0M}Q7l%!JMxnnZq|x2Pt6FpUHwk)vbP+QRiJN_^e+yEg+f z*hMy~P{=HVAZoB0%7ZYfLj|4X*(Nx8*_J@Xi(KJnxf_hC?CvoIuG9}ZsGJf5$i{9g zvQdj_j85^}{{-l?j7Ap?Aum2V50_1G*4lb~nlbe7dhvtq+SRU#Uk^&LDtl?Js;dW` zixZ8Mf@XDwSX{7ZBKr4W(LdoboLge-$usGtWW$;{tXnLAHs3<t9StA~>ydLB>T5_^ z#-()Mu7fsDH?}P(*(C4RE8Sc8QtZN8>tE~jDbu&|8FFhwJCEQ<%I=B|aUq@G*Q%D) z%!Mg$IL77Kk+}YuXLnOv<mtKA6Gpe9)L8Nx!@t<#TKceYj$@vU&u$SghMYOv<Yw)V zk<Cpc__yuC;I=!p3H}M7SizPGQVoBrlHm~G&d&kv3?AF!UjcB24^sBnMS9DA8x!-j zVI=dMv6hMH=s#RSIFsk=KTI#N((&byL{3>#q@ne|$lylMM0R%N?E2#wW~d;i?jFY@ zBl|~T)YKb;g$*3^+Q*AZJ`$4+wRs>5P-1Y19$2rMkVuZ9PMi7#agntvD~6d;HrhMa z1u_=Ob$V!tJxKlKqyj@b$PZ{w_=<Z&O`H?2vyOaM0O-nna5h{BvCFZUd1^Yt<)!ne zL0ZSg4IcQl{|QC1x^12p?K)SO<FjK#y<OlDqZ3g2T38;pwS_``U<2ND*$U`~OI>L8 zrc~S@776^N?QtMjM>+NKj8+)uo#kyPH4eW-?G{S~tCmlj9h^f(bAD|{6t30J9|+mu zye!S(xDUAzHnVSF6sZ=~{mVxUg{r@{ne_&sElbw3KLHFmc|3UPOz8SXESKbvOKSHz zOgH7%wp>N}ML@?y0~V;NVR$S3e;=zvsGTf^G@=Z4>6wyQODq#?dx3XaexW=H<H@?R z^!lakK{FG)!^mukW0yPzD!9`^nqFc;4f5j|qz&X1zK}|fnh4+5*n@6S>}~mH4hvqS zecR-+AJfz<jk)YeO)Bs1;U!Fx6AkbYAI?5wrbJpveNj5+Y~%Q3@mQC~41b*;ai9@u zEh(#*{JOH!sob)E6WD{1oj;J{u^fdxh&$3;3Naihz&__$%T2NQjQbiwoEg)U0i9HJ z`8t=rkb&opIedI<^5R5c%SN%Wa@QS_OnUKpG<!>KL*g&utAPV#Mv{NR0Dl_u04>y( zrXk!yn!tJ=W%}NckAw~?vs}MJu95w<E_o%))R|{B6pK2D^HIw*nm*g}TDVG8n)5bk z#pO%>ku>oK>}CiWdEp;q+5WUr_Fjsv#3^<2F@(Q`{1s15a#Bx37Q!x*%$G7(B(KP| zcW%(F_jr{2P>H_UeEpjPFy2_=8*t`0P~SF=5UG$~1(vj+^Q>CsSVR=wj|CbSSf|@> zWyJf3%jfBg(i!N#$m7uPWGgYRiEGz<^?mfaN=B%HVLvXR&|mHk#5>a_;8Ix`i%XN1 zf5dDpwP0y?%yk*$%D5GEsg8MB(~0UYTL7gq9T@)pF0QrvJZ4SE2!xtEIS}2s`l1zP zMwf*DMJoOYv6;T|)zgIT(^k-x(QA$g9D2ZDU^nCA(ry)+f10&xL`K2%_)pnz|MLuD z`o%7`Ds==YZ^Go3k5Q}n2`Dl<wt;Y5#b6)pMDWFpTlzfq%6{7s_>HXjA7D12`QB=s zcvYHhfU<ewC(iBflG!N2Z<0L9_vGHiSJi6*%n!|2j;uZdHcl6vONCg8s=fpGS9MY{ zOeiK_=L?-jri%rSSXg_8Wi$8EbH3i2m!~aR76BGIhtZ41kNQ4iSxs}FvD+xD1JXC- z8O3Q8`WLSL78MkBv^7g`a#4i27iaAjXNP$^Wm)c@l>?7`awqVX4l`+H$(#tDpRXJV ziFhoyD$Zz_vX{pt=q$&!Yyi}_)vB)i&?<4Antl#LHYNWev#rBnk?1NcX-3z9wvVcN zM8HS7&aoIudam5DIrW1teK<|ArcNsT)OO3OI@M<}eVGo?@^)L5BATuJ3=&|Q%#w72 z><d^ugFws{S5a|!QM=RCY%M4-awITvA1SA(_*veJONaq-FZ@N1nP^8F|4^0LXs9^2 zLr<EL3xyZwYSeUm*Hd4i!{Sta3hZtjM{b~%r3C6jo;>QU9?LNZTG>@p4<7`=ckVk& zq!*<Xtl}!JPIo0&3q8D(k&JsTMn3@?<EuW;Kn7g4!Nr}-Z)-I8j0d$9z>Mte@sUb( z%kyqioPu-`u{rMB(tXTf4?LXKxp(leHP!hYj@pC-2u{#!dUy3|g~6<hchFhtlC&wp z>nFh7LP_dMwFQ=pBX1^fyNzyYW1Z4*?U!!1EpH)Sk8z{9C^UP$NMzr_9G;l8<Tuib zhhJwWt}-7;HEvs1XCu?ka+)l%WTq1Grl0?6rta!gM-Ww%j*8dPLN8^pobf8o8HDqS zurVy8`gJ(M9ao2Jl?@CrsFiXiV+(0U|5ygZNMu>Xb)h}kxv7C9cAMoz#f?Jg3)Z5B zVf?8LaY|{zMJqzR-@@aMuJ!jR^z(MM;k|>xTg^)4-j<`&--|3yC)%r4dv)c@dZ|P| zZhCR2lWMP0U-HgJ^MTL|`n!U?=fR)F`&I_V)+e`tW<y%fg5aJV5Rke-)UaT$lZ<qZ z2gxq|Ej}mc^E@ukx1Yvn%d*LMGo#4)mw*y8FM%LW9z~(5*rzL~o#Vy5x!1UIQS}{_ z$N<of0gxu21&g_VX^^f5ZP&sr9Zuc-2)|*HW7so1dCq45H$d=49TF(F!Ey0|i6`gB z?-AsGlW;wl4Pf-zPH^&{FBhs)R-*4abj>73opcSUZNRwIb`0OFls%oRxxruyfpbP! zD!Cg7#-@)Xxo_U#diIP$PD5{vxkKU$0rgXAdaPEzBvztJpirK-aJj^BZK!hIJHNfw z$4z~*i}5)O*$~>y^q3X(|Io}}bb*v#sb6YU!qk>2?`OcTayG&jvRcjq9#<COOfTbb zy;Jh4is3Bu?sGEA(mzb9KLB)g&|KQpnBA-c`id_d9%FciaoY6?L*FpO`G~9Zk`EgT zIncYr2Iyh<piE5p;<<kcu|Efo6Y1m)YHkBCRQMWD|L>+*3yiYl;_E&xWv-a<#Xm$C zPV{nER@|C0_wdKJ-Q^scsJ*tkdKRO&kI1yKVP5YJR-iVXw0}K6EaKU;QKlAc401w= z7ad!j7_PP#7s-B4VRAoN#Jt0x!P_#ma??rO<T%p&1l%4!4-Xm{Uh)0*ppiSIWcECk z@=!wrgC%q0X^MvAf_GViTwSDaoUsGnK-d93xS)xOvn3nF(4e^XMc6UZ9HRH-;_RvH zRKqQGpEOBJd4`{WX71%vzTjiR)sDT3{?ng;BV+7=Bdj`anz6?%kMf$W<XsYxq8Pc- z{J@J-ulF~kCuC+)mrCA~*49dz2hc*A<uzcB?bZ+t%tIIL8@SUwV3S}F^l?8{lI`ev z@EP_joz4b!n_l5Etsy;CKsppL&zvU}EsRs%o-p?-2sS)*2CR+20oUQ5uK?*-Z`&ld z{ZNmH(y@J7cyRobK)a(eRO-l>BW?oG+OQWqGV7mpxw+dhT)%(baK!*QiHU<K-rJQw zdRpk&prvLZ{-i>2!tbR8nE(d2J5Q<?HfWX77uK8xajF{F8~F~sIwl7pNo-Sxk4LDT z59(T{Kkhn}8Y&Qn<8`ggrngJvP0=nl@8@k?TF#k<mXT4BNMuYgLZ5%1muR_ExOzOT zm$g~(sSsg;nwr?FO>bJEw){SSY$sRIx(BOMQf{mFN_MWe6K8TLQ8f+w>YmO)-KQB9 zos1sNw&|SyC}XJl2Yz@zwD>3Bb6&%6#lhpHOqURfiM;1O0UZ`t6LHcL9qi+aOoJt~ z*~C6a1epiV9}{a4aS!&2wG_(>g1rXcDJx>d#w(j#zJ+6p3&^ei1ITk%>`I9()}yue zm1dfmp2(>EnL@%&UKi>lEVnZz;D_c<W4sdLQYsNR23<s`nxV83EH^*hw0Tsz(1x$@ z9Q5c(fq(YXIlX?mPly}Hapni_t_ztiXpc_2+}9RQ){h|<6tc2L-s?G7?ZBu%(_g(e z9I3#Ps@SQUT#ALBbaF3UDp6^wcRv!}PB0jV`)n*D3x4s>uzQWUGPhthqGH_*d|GD3 zfyXFi)@N*cn?;zJ4KVl4<?xecWkPzQjul6*tgPx2``(GthiY@{bmNQGM!U>uUVa|Q z;cy4=6;~d&n6%oUrPa%jVf7xC&@%q7VMoZ8J{&UIj(9=73t6}10Bde4vnw{etwJUT z`sX0`#lm`vViR6Pu80<`EU#{?0OnNn&B|iQb9daJ;8JM9Y~j7Ut0#nNlUW`vx&u&! z3LoS|NWrQRN>klVsLXd-)+Tx~FYB%$=kw)vYT@j?Bv%*j8}ZoKL>eEx>4Mn%)zb;B z14~dATza|78CA$Z_txJsoxBv1nTr>Bo-H^&#kVKEan#%!GoSm`K~eBsr0&Kx6r9>H zT-;&rE@As7<8wj?xVpS*5|M#mbf|k$u8CfM>z`segrfTB(2DnLYa)bfqho#OPWH>k zjb}&d$5*HHKIeVrCm8vTCT((wQa;mwrwLVnWuV+sIj>7>jAO=-uFr?c%(9{K#hYyp z^yLduvaFG%M6RrbtAXXNS>!f`2pIj&_U`buVkgZx+N#n((#^a=fnQ$5RG5hIJPiLZ zf0<+)H1cwSCnkb7RFrHe%*>k&fIlO-(UUM*k``hPAOhe&qufaJUD|>8MJB3fEX+1p z%-XB#Iv=OBk#=mbmh@3M7d`5Ct6m&qC|cGHL@-me>To_FBZK~BaQ`lBaTGxRU?`@W z-D^G-Lxz>tgZGWg1rDZ6Z8%}?P_HMx5;EJ~*uOT?hgVl`e@iSxDt_}EltN(n4J!Cb z+1pV7xn<vB4<z6WnW5w+SUWYEUaMeyK1gtsU7Q>HI&aa4=v%=#+johkBD#Ka`f>Mb zg~WuAUVBAh1j+2ZxPzgnk}U6bl5)HCqJ|ZN8n4p`Vlr~--oLEV9J5=Dil6*;j)xAK zza=CmQ9(H<NNdJayYB>tU)(gzx>Dyp;8`5LWW11>AP7X>Gy3P`XJW$J$v;VjO9jP| zZqTJKME|PM$om+#95!LsD}>IYYoKdPOeY$@I43tbYVS)`Z(r<)!?LwN8u?Aq7e%x6 zixua%{kTvNf5>1rRtc8+W7B6vHB$y;hD(oo|KAc&D>g{Zc}@nd@bi6}F$epO#oJpI zRzSUPdHz}c>^dRkU*uDV!QO(kMKw>ZdfIi<vlM!_bTQOSkDCrQrg_RZ5Wf8bs&U|T z=vR<8g-=jxfAhHpE^VK^-rfjE?Iocg8T8b<x<YBID}S!+NOO6l8e$59+)PbRy5z~i zRRI_s`rTgZo>)*gQuq72GnKn=@PZG1`sC{V>O7R)Gyjk@iAq(@u>Y=VdI;m+oo6n# zaT77xO=fF3QiSVD|0x8RYxd+jagT)FfAdRccfNCd54@gGN>=m~qG$-eY+1c^Zy>Jh zd(>J6{@<OF26|a1CZIi?bN2sw3`UWsDIs+!EUB_ozjXfn<SIUtgK_YNr)Nzck4(1q zS<e5L*W$ESA6*AJ3+N+a%iuBloL?*8O<}WAI6+u(Z&FF|v>s91ePc`ve#a4FpRr=C zde=XRq4%T0<Zntkx9#LGjzHIq)#~b#GrNR-Xamg#M{Y7Xh~7lPQC7m1%86lcN;K2? z0me6NXWO0Abyj~<*wUbI>O<yZPSIH%lLAzI5r;?E%Y8S&UM425@dG8X`F<+%@uxce zG=+k<RoA%=N~<?(#tM_rF&<h@`j)M4j7>+fD9xwOwd<;n^>~Uh@nzkoxJbRwKo1Xe z-OEwJPhso8n`ZA6j5C8?w2Nkbh>e``TfISU2DTB{>T`SCb=M)X3}<e&bo{=IY2%vq zbGSTnLVEFRYQ9763!9Dde)|bn7<$enBR_Rlre&8K5vkBAiVMw)*w0r+qm>#G#2q<j z^c2j7wPMIyGZ4X_by?dHWjyVLu8QvH`+cF|B<7Mz?M?yl;p+4t5*W3ZKvtEgmyMm1 z7#s5{e%!F{WR~0TU`16bZoNfW|26F+PVDx9Y!?Esfjc7Xj5vhi-XN?@{_3}EwF`ms z#hnPZD4SHX?|CvZf2vo=Z+%XfL%leWB+Jb&)WAm2OTa}psZPLesWmH=SP^~PQ)IsO zoUnq?7+7Dfhg=w_e#aF_QZW4$$<sF)Y2YZV7_AvUn<YG2iO=;P;e2^xYE##I9nWcI zrP@sO!&vOs)t(9=oVKRXfHvWN8lR;zek6QN&s<JJYx4MzUKXo>G&swa5FH3mkhe3E z^!EoV_^sqwP~Eu4BZxR1jM^baV6WelqF3rPQPY2y>IoyfCxJNS|JD%ERA0qjv9*#j z_|;rS_L=-&F9K(k2Cdo-$-(<sGixjfWfRc!FLTZwdR6fyu(NV;Z;k6aVs3@Kr6IX> zyG;(-oV3xMc+=G@M=?vs=}l4h+dd&f-&JRLQTY_tPSmSWxsKzTugZj|@@}b`sj+wv zTNgMy%BXAkTKTXQq-Grx)J-oq=IkanWRV6pX3GrwSY4W4l-wv<S`y*c)$X@cHFLUF zfJ;!&OI9~H5b7q(Ef7$BQa1T@sg&xXY6^cqaR*ZyslZkQxUQJJ7r8ouUR!q?YjP=s z!rM|9+;4LrkF4I=7M)I8nb=h5&UET->u?JUAGzILXXpG1y00l3p@k!)FB7<n*Jyv^ zy4c)%&tvVvoWX-lgP!8`*Sd>~6|aq9Jnm*9+{{zvkBm2D-9=F|iCVTFCkKl@42kt} ziCd_UP_5JLxE&q(3xqW^81h|8B`>BaTicBzeOg8}Ke}J`CEqW%GtA0AVg43-E~K~i z;9JOY@r&_E)g*yySHTlxF8o!0AVB|iBL1!7ZvG}A>?t<@oAa$vn<Cf`ra$pde^0sC z9ckLQMJg4+8Qq{x+oD}D>8HD=4Z-ag`HJ>UwdNRj@cY!~c~W9G;crjH%lpsn2=PJ) z1#Nor`qP&q7w&4G-^F+fCB2c6&1U>N^!xv}+G?zfy6Wa=m}JI|q!iEw=6>ZK1s{f| zdFhLtofnKlEnTIYn2pKzV#HD_LkI%%Ros7Z+x~3c3~-<=bQzu8J1!8$x3<~MZP48g zh2G2f*s&oe36|%2ZH~`MHMK4l240LmvcTsxj7Dk>XbHg+UW^qlF?Nw=lKlu5(Xe+( z3ut|jIWh>V7)50)MMdkX^kx^K@(c5`Y~*R};?OfWwOSkWN*?gaDNa-8k(iMYk_3w- zhwc<iZJg-$W0pw8EWNRCL+T=0%32WSiYs#^dq8_V5o84S=i6{+WcJ9)SivK5c61H3 zy4`O|wX;yJF};(LHx0b>RM8A+8Et-RqKFt(ZOF;ne#OK@=KH(L$-X(avDk-pL#plV z)>H1^Y);}!d^u}5<6&vMV{?C(t<%d>h%F_I%IJar;j>Ibj=>z=#2j@4shQ+Q{yJaZ z^3|%w<iN*AR~oz+7Aq0PiymQe6qR%om2Z3-?rZH?ID{M2>OwE>RSQ>WZ3GLl$96iv zzqrPUQ3yE6EO^$Nzwh&`+Fwd3sr(8qul2d}n&Yw!H{^XoPS}T$J@;ynEdi@RPst-p z&R~N<2ouvsg+D}7CN%L<RRP<}c=RHC(sC3%a*{B?Cj6xI{f>Inr-ykKXa(G+ZnwF@ zo;Ip_0E|>JDCs!uyklzaH5@ZxScBD*Dl9HeQUU{O<BWdK-Eu$#s!kv3!|1qS`x;Mx zrgSfSb`us)=W#ihK@moq?+Pz1T*?kp__tl8?qNR4yzZFCohExs#5b%s{@`=J*Az_~ zZxuJ&Hvq}O`!j6=(JZukCSq7PapX}#lj(ac2$Hz>G8%QN(8vwk^$L&dNFZEtiyVzC z;W}E#v8vRs9ohDe97Gj*6|i$_s9R3(I7gMDt*qaaS}K~!bF#!{AUj;1Et8$RHWTKx z5B0ig^;zF1q<<8pRvpxzV^g$>vQWCA>hGJPVyMZVuv&H4Bkw&}wY%}`fiw7sugX9S zp+ehF6=FzweKL>RdF-G_f)3>}x$7FXEmAWROmVRr)1tFZLlghRIodfkpP<m5zf)cT zk9{FlO-xAP1~emKCX|P(vz@nI?~+NvYI6JNq?&}uZeVDzvBP5V785ls4b5msStS6! zw!E4%bGvvHtKQCWSa>IlFR^9?g_zzFw(DhF3_g{|1sZ+=RM)r`=N1;tf|4f}?<uVj zcg_T7t#s=>_i!;lAtS`tUx9-<Ggj!5J>G?eVRY|5)F5qggAOLhht!aijh>hKc3PEB z@Hl~{xSayi-az4SvYrJ`m*_V{alg@AW8vXntrVos%2rJ<)$A?aa9QnLZNo$%tGX~X z$O4zHgnf^Kc+Ekz!EWZVZaUXo{lyO{bNw%xg<-fz#Hrgbc$&1{>yxx`one}Dxxnm$ ziKm%?W_L#d7o6tbeWWN}%)5~!KuJK~9`|woqR=kUtkSfoN>5-YMbC4%6kiiG^UN)Z z&IUi>j_rr<cUhvoxtrhgXPD&~>s574xyrK>bfejbJJcE-)2g<}a^;N!F2&IS_*B1Y zyy2^r6*=4&e23N(?d!S{9x2+~N7WdbbU!v?U7v@2kHnhJ3TKa&LERKDxFhZI_0>*6 zu6{;^t{p--C;U|vi3OU9Z_7rTCzakQn=eJW$*U}2MB==c#DvS`l!84HlQoMCX%C(2 z6M61=DVt?v!V5z*XO2v&N>Kj7BKWR9R42dc{_v=ZpSu(Y(~gQ^bf?HKn4G4s)R$3r zFD^<?%NP=awQUa!m$hv!^Q#<8Tr)CHPltbQ^d*23KL{Y-t&$KipT=e<>hE>GG0E5B zOCF(|F8#FQWT_-CfTZwUFkpU4I4!sEE(G7zRPH*pl}a*=nwF+rA!^nZjd3P3NijPO zlqP?Xt~?EQtsB`!Zn93=jw!QNRZNdyEaer)Hwr<nU0q^<IzVz8;7#$2JYTthcFvc$ z9Sn^V=Eo{Oon1Vvge?vD5c?fbyq^#DaqbHnx_~yz?au7VLxwCip>!jM179s#m7i_r ztv#}Lh=`QF|KpjV?h3x#oDv?NTU5g9g`p5XKff>KNqr)hB##j6+*Y>zNf=u+(oR^> zJ#W-E>D@W#IJmSHqF5I+J3-v?6Tlk0XU+I6wUjmht4ujJF7;fkFuX*ZO|LSpny?^J zS`b-Q2`)*|Oy}yuoAi7WLU+82*H`=|#UlJWhZbC+0-KY*SmD4%N(APB=iJ&I+vcLd zQ?l%B*~d&$+gfpzFIYxyTGNfQ;o(IgAi4udFU+mv8Ws{woVnM~5KWVU{KA|flm;*Y zc_^f&Phd-P?fb(e7cL9>Id=6L@ej|DlpD!--?p_>+<iq5ASW569It0BV!u73V(_UG zzx)y2%$B?3dfT<%z@pPfUf+C2SRr>g%c<Up#V$P}%#N4sVINzawX=ydA*4gBD09&V ziY_}>M@9|FX5cmn*)by}{@A3TP*o{X#nm^$oRyL&!0pxKRcT55qkhWPfoh48{jD{Q zJ@Agm)ay3by45pGtWYL4bsXa`+hUL!R7Y+XHUiIoycD)={pPIK`)Jo$)yZ=?tIue; zlMR5E68}T&!cv&g3Z9WUb}oq;J%crgrAs}$;(tFM8x=0(n14uji{q0vSfR2T#MO7{ z&JXJ4n=-i*{@YND=+z@}^I@d+-0^s~Pt=ewu}PkJc_I8|q9#Ob{EhR@!=&~a7Q7F; z+(CQBErqtNYrEw2GPDj~;>IXaB30)2!w+6hJ@r)OZDc6~Hj)wuZD!ppgSjNdL}*Ea zP0H0p-^;UjXWk}FS{20~2=UbF*OOu^?HA5jCD$JG5=*W_OxaFFb{bNICy#~?#f_{5 zS0FEZnYiMo{~NyhKgR5@k6nV-b(8H{z*U1<TBhk%{_zF=A~Lee%L5|D(JrD#T<<?# ze=7HU_ojEGMzDO)7m!6IFjTJ=YYAsx%}hQ*s!6iH^>`Q2F*wHCIOj|1fZtP3sUpF{ zKx|2acIgh<4k<fvDZab_>#%=a>Zf7=X}xg+R(7MO<|8H20uJdd;tK>{aT&g=VZ3*U zb%=iJXl<OP4MGBY9rpEbg=NcXzni5u1w?L78F0c~edrU@tAv0G=2c*@yiL4+eSHeJ zr1b}EMKn3FDqiB-?BnZrRYsn<<<mtd!YtrUt5a@zVdmE|4Y0<mwPk;~B;=OYOD_8d zzdi4G=$@zYJ9)4a?ZtrbwU9%O%afvnG6PCgm1MHP@45*8uqRs==N$sz`q)@>;U4vk zUaPm+4Zi`ppB)&(9d_Teu&{LyJ1mLozFhK`mlm)!9$%mvBl-=ur<-MEExkU=Hkao3 zDYjO-5uGOHVgZkyUcg*3-l{-&mf@<;Wd0S&g^u_P9n0@)%wI`I>uZGlin>&_T!jJc z=D;hn8gX`YH)IUE{(?$zpEOI`HvnVM0ByHB>I#B`+#kbS(3mOLpMX~d(Wu`kKwzDA zhv)QmQ=LbFK?OT$f2WRL`?L94{<qmG6Ik`^woY}ki2qeL=hY~VVXij-%VUh;ljPYd z+wfW7VPYy29sjqN@VoDDEqHf*Tf}}UNC)7p@*_@OjP3nOoKW&|QPcXDXE^Ww8vTnU z&&}Ag@0KF4DaAMTkP1xBby!DQf@;T<*Jeb%ZRfIgowLFvv2aZ4_l#kjpGqE)`zM%m z%eZA_L(4ksWF0yhfO=AD_%NkN%qgH-IYnoYq2l{$1wxe*zESQCwyy%3kkipgum5%t z%FJQ@9pf(_KgBn|ob2Cx>DK<x>ciTL#pWwxM&|Dh#Z`SGR?j-weq=1z$9uoivdqca zHnXXLcGPt_ZJdGFHAC)4xs9F!!_DZ$!{%jKG>2MslqDQnB$Q)s&wl|%mb7qr>E9-? zp#M%seqL-#EtHV)_S9!EQQOd95w&R^yFrJw)$N=zO@4n)g^6#6^R9D>>YDP!h*9MY zW$#2)ggedFZaj62z86_$VPNk%;tIUZ^tk<7VBnoAe)q^0pR8)!j_4Y`yH0(XT#uwJ z*Nx$3&LJcWr|P4fR<XyfImnh2izVWYLsF?jcCzP63tH+LPEM{4{&Al6_s_N6flw~- z`Z#ReGFD}EX}K9k9JdFIAam!&i3Gx~x`S3}fiGssB_d^bY$77-t6&>#IOqSN?ydi# z+WP)~6cH2wLFtqb0V(MgX%LVYI;0tfp?e4gr9<iF(9FPq#4t1h(%s!Xz|bxDopa88 zuFLDX@6R9b<rmgG)}FohthM94-tl~uxPKkhlp!XJ6i*6N_omoC<xp)iF@~i~k08F? z<x#nByn}+oCu>HD$ZN$K(q>#;fC8?|!vWBi=}Kdi-<KHzGk2?1z+OUZ6O8ZK6Ybet zXJ_x;h&pfC%qATtC8kE1QgLDPa{JST5YxT&l98#>5mBmCL6QxPaV#TjCA7uN1A=2R zF^YS4#KO45f1I*MUz%6gLEfIxD%cj3WkYQ^<yb5^V@2+}h6sEQ8pGayS#>N@cXU+Y z64W$ruyl2?Q~7PY(kKf*WjUYF4uj+|#1M~+V@?!UzN!=K96-Qol@%&li1@doNd=eh zh{dDxk~g<3%{E?A4B+#|$kZpo$8R5j{eYvqMsC4P+4Xas+);)FdHj7li_<+OXnXp_ z`)iNRPjq-PsKSI*#ZL0BGg1Z)#S;g3j_i0g^UA!MgDRWlLR-VN_nL#qHRsso_3KiP z@If((MQ~z|{c~fcS_6siwCU&3>)Aqsz|w2h+DVB!?$H*s{OxB~Df+#u+5@bW@fO)# zTh2owrL;?BIyxS}S#YWcgZYtfCw2&+xGjxruYLyUk=$P}?%XsFEb$0e7z0dbzj~<0 zM5i4q(E_(UjeUJSVVsN5`3|HGhD~_To+A|i)!dokmo9Z0Jfrv}Ri}?~pvWpp0(<8P z-dw`>ggnPf9k+?|&9TeoNV}--;mb#_QrmO(Uo~A_rab|lzA}Va<U>qWaP4i}{L=0l zZ4!Q1T1~gx<ZRPQkm3;V^b>n|bGuSeEn($UsM~#<|9qz2Zf;h;H~_kHVV_zLnrUjP z+cA|G+0<o`Q++#-nB$#kbV;|OlD^{eXCTJlP*$fS5mPwy=c}o7aL8aof~vpWKcZep zy;~1R=_j}?M-9X3{-oa9Wg6X3J0RZW6KTaUZPK1^BZdJwuI$fuRC7Kf#i6Yj>B?(D zQO~!EiuqNDFh2t2r@q1EWj^{b05t7E%L@mRX|-fd>A9QK)u0oXr~W7#5q&tflfM#M zmR3;)b9(tlwiDLz16V!Ja-_%G<jg1zbCBQmoJ32xbUp%SAe`D*zyh|4m@bJ=L|MGs z2&T*;W!5M^a*2L-es^i)H3JDDJ0e>Sgh;%2*%Y}2y9nOhw}qF^7&rD@*=Focq^X13 znzwqnQmgF!2Pd>u^4tc+W=%Czr&N4vx~SM4G%Fh$*5Q_Kou3O^Sg6sMsIkcz>Vr#y zR~?EIGjlR^y6+t*>Rl|1Cf1hHO8=#xZK4R<6wywLo6#SGvd3-OFD3p+{82~3Ex6Y@ zQ4J3u+a5+Ke=Rbv`xytGP<X)NZVH^CH15Om=0<sc#ARhzgNC#PeByrVfTQ9T^0;D_ zfBk!6xP*$5^2HX)b*MT=@EFf@PBxMtra_qRP6si3vBl;-vXotb#eHVai_Gs?Aw)!g zbT<3z+%#w5$HJ|AFWj<s!((elh^cjXiiEyYRX6m?etk)0k27UpJG)*$-r8xz)CID& zR|j3U>&E(S8Yj~$uOPW!1%Q_r>w=p&un%RXdF&G?O~LR*+ORUHn3;~nZDQ=Jc6gel zW`|k$8w(gqdjE!lf2cb)_CQr;L4CvxO1aK<ZtAtY_E+IkOH~@Uqj#tDdABBckPlVY ziDZ7|8&v_P(%tzPy7J~Y%I&S&c5H@VI{lv+q$lK}i$n{vz#k|PZD2$HG5N4Aa{oLV zb`e#hGrse_H!;bt6eeE>gRv=cxy7!QDtO(A!j^!HNgPBQ7N$A6NlbrkOc2=EdGsN( zVMIoDV|6?<Bg<Qrj)C8*LRCfrBUcUbDm|1PFzB)_=1RmxZhfPJRK|V$g>?|x^f*;- zeTst?l<K{G`q2UpeOFmGE-S)ufn(hk5Dfv0-CFLRjB_}RdWNa@h`PER((IvbJb-AF zP{4<suxrjXStDW7F;Wd_r)qT;zeusdNUg40Ae97{eKhkaEwe4w5){yG@?-JhbBMZa zozk?5T|wQ$`gX1P@q;SjX@0_5R$AZr8%PrIndoMn2Y9l=SWt6WLkYTELWs~F?V6xi z4C*s7UAymc>`Hzq-Y_@+s{XhdftciMuGF2||6+u)s{VlrzcPR1+8pmHQp5Z{{c>V4 zN!7y1AxbW16z+6`eksBdb!qw{k+8w=U6o^Pr^}8`<rb1;)x5&cZ9X-z&9=ajzv@f% z3r36A1hy1tT2ceXx+#Zk=8{0hXD9zF0Q8r;=s%z-fB9mtS8_5R*3hc}@G&IC#Kss( zLfi(@p20_+K^UuNk3XLJ=G&}4ibGCo%^H@6lwT#_55b8Gz7v}4gZS~@vTBv($Ep7N zbVWS`7j!24hC6q+`Z}s(HI%K0tN(dyE~m4b>vAch5RXVH0}ZYxDK%+G@bies`iJQ| z9NB5_S><yk?L6w$bLTE{FIVJJ?dIbr>H``%r~A7`5rP~a8x&Lo#QQgR%a4L_%RBR; zTDF#lmQ~PvKWU8!o%Sui4K;`RWbpc=3TGLrxaYd}7$h6{^iFA2NrW`t!)lf1;rj~H zY8{7C3KR-~=NmUk+AODb0qh7STbPIDrU0$Ue!kVB`Td+&gWQls-28=A<^IamoTl)M zD)8Z9k(-23jN792*4)IKp@m)kwdg_?;LY+dwR%o5l<lk-LRqq$Q1P%kII{?uYE$(A zizIGFV47K&=8~1c(xz`qEwvta%76QuM$On1AD2y;fLq=v$wkv~%B(2#+n2kH3{nQ0 zye+%Vgt!brW28L7?^h)woL2K@IZqop)%|F`%?Ma&9rWD(@rtU`Q&4(tCTO_ru3ED= z&n0<EE9v`X0k>aRemBg0WTMp%^H*UIoz1HQNc}+i#4unMmX}>x;L9hA)@S-!!^zPt zZ$er#8aOGfPz5=3hU|Ue{Wj$;He<?J{=uy3c!^x)t*A?8SwxL1AAx;Vac*MNE|IUJ zWx1e%_wpA>kyWQ&ON-erXTt7;_X5c(qrR)-UH0lp#4KI;-E4!aKpH<rj^Z;WP8%hO zmd+&W^VdSd8_xc5y<#ld|9>0f(T?h9(i(a+22hJB_JkUR8@n%L&2czM&9DE$y4BaL zeOld+v`dfn-%534zip&H_r1%=p{4P!2+VvY5p8+SJQrsbylxNMGP_EhWurpKqW5XZ ztByIk==(YycsJV;H@!+FakfH+y1T(^2A(Q!#w$1yataZl$|DvjpU9fnuox00KKD7@ zqY+*T3T$eho=f;xtQ;(up$t2WjPp~<$c8L3^~E@IId`)T=&no}2|CLm<}|h`%Ic`r zNd=a_92=ihonnm-HMn`c*s>0hlHriYV@ej7ww)@LX*VlgwyPO8IGnrETJXRut|kj$ zTAmS8m_^HCB?d!HaYjC-(aj$f{G40_eFu&WWv$^(@E#IOaTG0$jb+1kW)*P~#;`6n z>5lqC^4E(yXiRT1x24C5a*&np!T0AYrr!$SphBxl8qPQa#)y;$CkG54>BqjkkL+=c zIZimi6KO&3YoZ3TtVnI)<ogjb{jE_H?+UVMLm7{uC3(4b#@#i3&^V1UeIH!Z7L7gQ z6wIP7fEZokJ^mUfdOBDev#Y296|Aa&Ec6TR3^#PmDDT#?bM&Lb2h}zQ`D8zTYNtdQ z`7Rt)0W+)~6!K5Pa_B}Am6y|Fq+7qCIFjp)^NS-h->!&X;i}*Iou&*&Jw>T+E4WuH z9ULxH+fE0&=TiBuX<@v6bL_MLT{g&^Pi%t*sh@IOv5<&_zR6z(*MTo)!a21%)Iw)D zI$G^ATIXm<cIr=pQ)*0J%qjs^#+gS)m3YJA?$^gl#U=HCW@8^%gyMr<J_*|^Xmo5Q zGU&D8M;Ewf)@uT<QXkqKtWb3-wqjd;XRY)c62BAMDNG3S(AUuF)B?|N=3N+E6%M0k z<T^&(o!l962f$*iHlAR?ZDd&6?Q^e|KNkFm<*MpEkuKYf0;=xhqJy#IX2yojB_QT- zp<X7&uqaFCUIt6BjSN$_YZ%3F&rWHTTEQ$B=svp#w09?6=ypmCUsv43_0W<%>O?Yp zS^nZA%@Fxmk$tRAIXrM9-!i68uR)%b*tn;8!oVH@uj`pO+{O!S`ihB2aGaDTH|>Dc z9foJj=UJ?J_KZnsn-a;^M^%~HD8A!*b1^_rmUi&Iyy<f-r<+1Eq+JF}VO1`F`|YGN zA2s;M8qlq;^=_h*iEencLUAh}lzK41v*t<$cWw1ZDV@%MHXQP~ejf8oTXQVmD?z{C zOGf(|alMNh&xp5ZPvP)6OHf~XHY{8{ma_s9^@ud7SIy%7bU*<R$U||Q%DDW(@|Z}i zj1h9R)`gy)eesWo0iP8E!9JotuD{e8L5o0kb{jQ-Y9TqA*g-9(#a<f6uO(3paA2zL zW0fObSvgaYp1iW>mQYOq?P57|lBSLdCe`}L>!JOHgjepeqs@g~lP$r@<oFpVeFnJ} z|3zyiKV$q$GE-DZWXFgo8C`V8gF)waDZ0R71Z~JWjRglP|JWTI0U68GSrg00V^wq| z-ckJ?M4qurexNz#gt1s)vDks1T(Eu&G;yV&gv3+Tj{{*dHY!HxJS0e~k&`>0kzLcY zUjTys0jmc5z>iq|S}5MuSO&!AWFU^)GE@mB0MKsgsc1NsT9T4}J2C;siX~<2Q9S9~ z*&g%U+|Tsg8sI%A3ieCQpTB*`RZ#2z<Ju1bfG1#|bo|@VB+Ea`yGEu7_-mY_6-b6Q zG95Y5wuudo4;w2QoZ4vJ&USP{<{|`C@WJpBTd@6m5>v9*n=x2x7B3};AT--vZwcv% zq5(X69GDtBh<n7m<&5$yzlUgnZt@blg&Cfbd|s^Y;(F3smYLm*%&`&R%uQXoFq*d5 z7^4+p=V!&~{x%jPkk!`H&Bbs<=)16?Q!+P?98Qg0)T$QC&wJlEJYr0#HPuvFkQJLF zycQ`;k=aQcX2Rn`vq{^V9Vc)7`S5{J>&6$lw(;8I7=usO7#Rf48CC<6(pX~%zTC?K z<=%djhvum4rWh_?&qimoITmwt;lp~-?nIM@&HHH>N-d}`N9TMlA<e3)NXs2qJdesq zt=y^}sC+wnp|EVdYD#cVjQFiFKitCG@%)ufx~JD5VCW`rc2;eCPa^jX@FG%Y$B!p^ z{tnD{J`#J2f}SaT1q<CROe@|ieNdM3a;9Le|9izEeA3n-+K(j@Hm}(eN^^%1C^MsC z+}$H@phhTm<jf9aGt15k56`HHrkLr#-oSd#QL1j{?DlP-lyyhNyh4?0Kujrx>~1Di z1iUZOs78)cjO?Z`hmrGB)4yIr|DB%tzwJP*&`<)KAC8Z%S(;`X?Dl$w+yIEP8P7p* zU1$(Hl-ZVuF#4THvP;Lg&wUrs7fj2KXR$kw4-7n`ZYs*dmE0O>RRvJN9=PNE3Qq%t znv^KN7~|)<Mz|Q<`4VE2y`9nXIZ4c2u39&-ItTa1rceX!UA~_?Q69I?g!o!IfB4rf zcj_u|We<_+Di;{Lt(5`ypeQO@n!_4oUZ9XrN+ZPzjVS#Koejcx3t(9;C-u^~lsD8R z(@T^;o|hNFj*QGpgeeaY>;nyC-^iK5qEkHb%lsoqbB0je1m#GwDs92Lt6j`%EDg&w z_b^HPKA!A2Fod<UK9_weUTDbozp^FqAx`BT0v;oyoz?Xjw5p>DO>cn4c!aQut`(Im z^;nTyXAxiK59;wFlQwCxIsB=>;z9%o&lGG*xk)o^a%vK{Jz!z9;ERewjUk)k8FiyT z&$Lqr0%^2mxfz_F(!weEMH-aqv{6G=a~DtUp_kE0_4zl?2W}I8<fZQAqFqDg;4i;C zV9VPQcSx?!eUA0MYPo{{emw<fS^&zvn^ez2STds9#Z_&XCxNKgR>@SFPJb+o>ZbBd z>ev;DzV{f>;BSQC#I9&f(4m{6iONs*rtDQ|thoFnsAg)sN;5m_)?@+J@Bc{*z5YFg zI-gc|Pf9z0l#6~$M6TU6<eJ83@jJY~DW7Z62QRcS{&zp8av2U0y59dfdT~2}R2z2i z?sf;cU$b|cqR$3ST24B_lrzRIZk~uP*2ZlUlj{GUuJdov&zfB@oCEjfnM(Ih&IH$q zy4UdA@id~JCY@+YU(;!uv6~+zvT_El-~Kt@|5(pp)BKkaR=3kARim>MP~ZCt>t{v2 z3me#*drE5VW|)5gaN{F|zPKl=Q;_qURSKALJn!f9E*SH%J_b0}XuO@a-6?|6J{?jN z4dLBmsESeK$eF|Ql4e}&Nfr$7W(iKyr^q;ZwMPSvrk><*!2tI0P&_o~53k-n#y0+d zc6=EEbZ<zrsjIVbVayTW8ode*Uz>UFJd@07*^r5eHc6aD!>ROA{ncO%rj_|_w`XLR zk|5KUKMKiDsEyWZOC><A7q%Wz<oTAW!TE>fdHiDC7@2n5BHYPs6VMyz1I?mkPUvjS zj;e4yPemiFD0R{;@o2_&VQPj#WOg$7N@9Ok@1~&F)F)whn777SWa0e1ki@jULq>&Y zr{V=OY|oe}DAcyiaI}9@av!SFDz9ytlo&oRxv&RLGqnNo;i%ccpkQKeAyAk_jzH{@ zn23$7^JJs%uu(C5^uZR&sFO%~|J;wGg&b;e80YB<xoIYh`dlXI+1QhoF;cpxjjBVg zch=_C5WP0h1Zb<^1J^PJEcm)w(NTl`<f$(;e@w<Xrk@U@b(XF2>#*a~z~4e6?yUVb ztLud!Vjp)Jn*nki&!>UYHpn?fD?wy%cyfI^tA)2Y+>^_x^Bdm6>W4|*6z1;HwB9T2 z$*U~ct$9k9vHB?YoZRw}k=jW%G}m2X;v*F!qG4AOD(bPC8mtElT-;u=ZrqQkir)_J zPvXw%?TJ|Bj-Bd&wVqgi5!7dn7Ab=1s~K&K$}w0OzNTqj3N|2;8*;G+8(EWj%fUu& z6KdSxw>O=%>x0j?-u+Oge*+ZpW0Qf5v%WZSOxOb(K;qxZoj%nZ<ai$_B!L0GQnbXb zKt9m9#J0aAse7>MO4mu&7(>Cy)Ihw!KDWWzGv&**yH^iE2F9q^iPnWf2yjRNt6F0k zAFQpaqjATy@jmV+^hI_I9MCf<9Z7TWlpj!*!T8rh^g*0cL!u7TkV+Z%=Q~9z#cV)p zTVF1Bnzz13b@C#mwqY@}PMbU-781j$Ocpif1&t^$V&TE*Kw;xFGeRFWTVRQlGY|9- zNQjd{x~5-+{ID*JlvgpN8T9t@wg+FbwPscXH02!Q#IHOvA?4*!eo!z96s(?>|GDXx z%2kc9o2|VL)2}s1HlDW+o^{O4j}C6P%5&y1*kYvlHqxF2we4nY9B|F_EhKRslT%?6 zQQikix@IWVD$QeN`)?{Ltf<7ZKK^;ZybUaqXJwR`9}V&Ta4+)X;+Wq-$XMExO*+3b zk>~P`!Jtd*AnA_U0+d#|n15XVvVA0MDTMd?8tw-rQ29`-XoxUvmiJPbzFmfE{<&$8 zo#FVboE;>dWSWcL;TIMXIDM@X(xPqP`efPP`MHXU0g=eQsDcfc+S_lg*dc2^V(qM$ z)OEd}q)vvOHyg47Va({??(16TZS3Dp#3Yj=n+dhWEf2igJ$rV*C7u!O?$oAEMWcz3 zmf*N|?}CLNCa1ehQ|Y;M1}6pLbr@_w-6Z3+t;?v<Gg%nVNzOSZ!iT3YG$Mh^JubQ; z$is(22nZ@TOEW0+U)!#uO0&+)M(U_tS_Q@msxXIexdy#vzTQbSq2PM9<CU<`$hUMl zJt65c7<V$zG|^$C$4)06s$zJeYC$_IzWN8q$+ZvnwL9J3$hIUMNT^tAMBOnw<gMhU z{-emtb*Y!)Ys7J5-W|U4D6$LA272wQ#8vP?(7t3gJPCkezlvB-430MGq4Ll^{&{#o z=?$^;RL>^x=l$B}@yH;<1We&LJARd6Djv;B16_Jy4=q`I2rNFUpY}L~mY2`6<(-K+ zzBG99R+CK5s!~Q8m+#}c1=Sri7KviFGbM|)ZMeA-2b0++CbfsWIw}}FnQcruGse2W zcs%~w9KoiSmA(J^zq|0`Z>iM?5bz+Ef|WK^EzycLk7x?+K*3lP<%|e5Q*)Qox+C<v z=drhho_10%L6Vk%%{LUa5or}bBN@eJXF+5cC4t9q!ccTkBJQkhL<vY=*LF>R^zD=u zS=a)P>HOo?{;T_9tM1bBGW@52o!{gvK}|Ifa+`{5+USXp;0YF44JGfU`HCd)<dbPA zJ#cbyl3sf=?(C(s%>JT#VUu*==&hPUm^KW-QCxrttLFbJ3zTeVIX7%iwQU`3r_V;~ zF{;Z-6h}th-$k>;!}|FLU61u;Mx?Me*F6iWMq)8aTixPd7);9pbUss)n_rEOPMb(I zh%m7Q^>XPLMkwVMgS?G8BVA=UTp%KbUufF4?~#l=IDaP=V!|ZgNhAuNRMBQ!wJuwa zzAi+ua0b^so0D$YU3XBj{KG0QGa8gWsRm|&RRynY^{95urqvghAWC^R<bwz0gt6*U zvp-}G=mZjFlmZEXoD6UXPj5rGyX}qfPRRCXy~WDe&*xl;qFJI;O5hm6gm#EdXKh`T zEa2XUza~o()eOAKy?{F1X7_Nh0rQJFIMKBeLja|F!+M~sr$b!^8^T%*fp{o92AZox z{G*Y%#cIy$gNDVtQm4_pZ_b-Sh+W;~kx=h=+nx+b-_+T1*0y{qQnIT{po8Nq+0BKC z<A{1<;>Jz6<KpLy8<zbZvx}zn%kV7LPbcfBvOZgF!=3f~+Gcyh^JVX5B}oIrw6peR zfAX}GxWBgyiEH)w6DrTo&UyOV(X%)?`>)LxoALXvl-7BEn!5aK>t2=+!K9u4zYorQ zl<d!4>u<JpkeQCj?2dXE;on|Qoj~oh=jfbNHmp6CqIiyf^!k*$EOBGaFLCT<<JM|h z{qH386X<*704584<HPSc`{r4k{ax3b(Chx6J#9^p>3T9Qnp3Wv@}1czQa_2FnJx~t z=euhbrp)QzMQRvm9$kmaQ<}lXH`pY!n-hGvZ{#x7O>sW-Jqy!}uT9@JOikD$J3G#* zK~Zr%yyh0pzV<_9wUJ<0$tKP+XV>FW!OTB*2D{_^|16oJ_B@aIa2@8E+o)K>vD>f` zvUd&(c%*bWI_=#~G`p{TOA&Wm_&?hc?bF{mC)ro<`Rb(mdw0cgI6ZO!`jeM+Q$6m* z&FX2u75#!FHkxJOuOhSGyR9~#N;x)aU6`v6WIfmTyF^T?!54Q<rI8jT*JAoxe`fE% z3;#u*!h;`K8Io^v&tt}aVQmF?T@ckI`G}201UCKFFOih~?xyKfeK`z+iceA4r!W46 zHFSG;K<~_Tf+<_W@%ybG^4o}9zKU6p(*1>%eY3hGxnjJvulXM%=02@Pgf-s43BD~D zTRhwO?Ee)xXs8cZ?-nmBh#G*T{}p9Z(%X6eLL(0)8e?Y)aBRM+!~YqSK;e7au&r6J zvQk!T1g@Fs#ap31e_3{JcvH-N6Rp=&)pBS?nD#9*co?_+GgVsaXqH&UpTY=MaAg2c znMO;NU+z`2g=oNzgjD;zo5*bp4D93=*3+k^LVrsm2n?pVTrb+7WVE$7&iD#%D@T96 zQ=b~hx*AkJlont7A7zBuq=joKO{$y})A9_d)6A@uK>rSmk9fi-ApF6`g{j(~)eswV zP3O~BU&f#I{QEFZ{<X{hIUK#<`gzmfSa4B+?yimcjZNXjA6ftG(z}U#^shPyBzNPP zf1beqdE!s{51RhGS3>%0{q`$QpTXD?t|><`e2nee7p(v6GSl(%U-z;kxOd+#3re8z zw(OsuB=yf&9Q*#IAYpdwU<%p2QM3!U`u9)z_a4)h{r<d#iT)lWY0mANRwVY#f+<Ec zEP>;z%GIM)Sf@?y64D(7<owpj<Z-m$bH;O*Pl>^FFm>vvMl1N?5V+KJ23{xea-*TX zMg0ErC?Sq{p^Dkb53+LaZO#5k?7(De=m2-d<<rKViU!9DN*X-uf|*+eak?fSED;qy z)5x)xELcHD&ww3}-}b8`svP`-V3yVM(%3d1>U56Z962*{W206B_-JsQfyZVx>O*A5 z<Q!alxT{;ecPP)LE{$xKW_2A{a7n1$3*9n{YNfFe<M*1Fa4e&OxD(3X9({M7z*X#| zvHVu!$u&!N8)4GVbKy%1dn2@ogzU6zgY-d@m0DFUuDtmfW>%VRd(0y~Tl1xR74rt@ zu_|COfnRuzhdQ&S9EUWKMYIc%+9#g}x^8l+1|@c`no+SjXUOJ~X*0Z5@o|h#s}-~C z`>lrPjs%u$n#XHSh4w`XAKXuzOme>CI<WeTj(z6xX*j<F=n*>VkH$er-7CRk9&)S| z{Mq0H@XBQLUf#0&T#s1xrC1Rv0A1%Xuie6Q|ITK{4dgz}hX*(Vtlhvn?G4`+;ir=g zvS?NRbu>=*(HKBcj+4pqITZ!pn)DO(q4L~CRxT0dxPYW}uoPQpjJ9dx0cvp^sl86b z_F_GLo{B^b=@X+e?~jkzMl!8HBK_7^U?($C-X37ioK*8`hfHK_kAZ6-cGrMa+`VW| z%S*L&0^9^MDr^^o^~|L9*mhmGO^d1O%A|@_Pau1p*e9Bn4$AEfj6`h;)^fiv199LT zoqM`Hnh~l%2V9Qg$ab9{qQ_~jkbP*TK2iuIh^kOEE3dx;8mTMILku=It+KRKPg?Z2 zS5tjhmfs|CIv3Ta;9-K`^%NzA?e!+spS=eAyj`@k;q)&|lQp!ioh1A~iL(4S2>FJ^ z)#ZAC-x~uc9k%vL-Mg_tpW{USXg46)C?&1}Tukem76M(yuQ~ysJsFK+f&5$8rc1FC z--M2`$@%;Hh(<{2#D|Hh_xxCxKX_3DKDfR@JfE$*M{VzutSQmQzpi95vnuNA1_-W4 z=4lnxZC$5?7S&9_XkwE{n``eN&Bs3fS57KwubdaYotRp%$t`g8bt}US1fFhpcc@rk zkiR4zSuuOK^)oIK0v!Q_WPXmi)ZXS3WS-U29u^9M*cne`OaqsP$b<+eLErLmkS?eD zcc@4I;OcxM4fg=O^MVTojg!7~w;Jdqc<U@M774{pOG<VPjZibdGLy(+*dU2dr@zoV z7yEPrtpjUgu$j6e-Q3_pe>Ec-^Gc=Opl(Ww+9@?62G`djox`MNA?-KZhb%T7GpCYl zX=)l-0g*qC3Iz=WG~|Q|8m6aB?2Ng#r{{Lh&i4=)jUIdJ?3qh0EzJ>B+M_WCXhiNb z&2VBY-)39GCFMSDt;q>lWcl7iIKoy!K#o?RX;_++g_-y+HI2QkEw-dXL}EI#7q}*I zf_gi@deMvX$_3Wz*Q}tRp`qaDD?ogPei<pyp&)bz{hpTZgNu@gvH3k=T>e13tv5|= zleuAPPAJg=K&sW{53A5Nu&La<{vmpdkulcrpWLi}Wsv<lE$mKA4kI?hzdvLB(|kQh zcy{DK7cvbZoB={9ak2mtl4AWT>VtGs-wyFk1Qr4m@3|9l#HlnHxi~@cE(WK=JT|Tk zSx8%>18B;P%uzsC5Y3R$+=sI-oBUPhAv9#^!cMb39<Ii_Wb5;Sh0c5a9PSA9=^iSj zXq`;>*H0h&Iv)`a5zoD5_z1T?fx&JyZgg|DwnWIe4)nULIY>Ey-OO3{t4kwLSMI!) zvVi-czd2jT9KX$;!i57SWVE(zDsmFDb2!>F^E=zok8Q+buxq08%jmRd$GlrwiTzXy zEc12pABN`(Sy%Jr&brr#ig~%cH4H<JJH&<!66+4XJ+R}9`<mJDUZT~Ifu;<b>7EF@ zp384H`W$5Zd7^xWmiApIVt3a;XC^Wg@>ztTj?zG^r9+z5;I$LOheDGn2ertB`A73V zW~b8`qV~e~?J{4ZBHp5LiMv0DB=6EGy(aL&%{8Lw7_z4H<Q1*bNt+~07)A^3lD*0l z%}iAVo01N<JD|8<ghG|1pETDR&F48B4)n06ym$|bORCI<*0zw!RL&n4Hb}Ad@y2Ch zykf&}!wY9esL?5fS^&W4xIADU-T8B|CZJ6bVLns!wHs7{VvmTR#Rl$<ws6~y;9JEJ zmw)oVs9B}U@ol%u7v*(sZIR?&YQk{<<*^lx?jyfrVh+Cx4dO%{J~@HgHP=mK?Xc)G zc3gyA=^#w!LF%Wm&{|K-6RtTw1>+esFbxhEW~9wwM6&&_wHVjT!A<=vq`aOb-y=YO zQ3X9?*P;ZjX$p?jf5s<+&*W_pVPG^@we&^QJ8(r4rBi=Xiz$kmrN7h`Z!L>$_0vXA z%pUks2}vrh!qyiI5X@;;9EQ8To3*8QahbiUNms}E7n16Izcq90*ttbx<~wgqljm;T zH%uZSSsN@#6{A+S4HN!EamTFxZoWtj+tj$O!H8`g6J>ZO<<f0lhFR@aO$U?-WCgAL z?EZJN=Xs9zm_Hgr;BMPAvD)gay)`!+I#jPBXP*L(=_+^jYj9YEWilT2ZPMI{8*-O) zFV`j?!Z-_5q~?_acBl&9^sH0GYmaGqf>h8d5x%N%jD3fc86rI}<$n9-c8m{$()YK^ z8UwH@yC@k#Mh!0)8}AilW@fVA$mJJ<<2A<{`@>=f@pCLP4JIECZ3Zgd`<RYBS1WP+ zNVxu5Y<94Xw0UmQN`QtDLSTqDz~K7f^kdep-g}0~7}1K{7-&!{3tpkO3iv`HNWMJF z1;RA|dQ-q6xKdKG*RXcp$Fs7(yYDFV2t(a+RZli+Uz}c8@TY*^Zq&7g9c?fT#r$mM zl{uznII-H{i(BMri)hB=ME&G7yy=%T3n34%fp}k-Bd=3;9<uf($GrJ-ur>sxw|XaR zSet(D_iZEOx*a$>K4^D57npdep2SP{2}42;>9Y?SPAVBt|Gl68GML8rCSz}NIeZZf zDtVE`WiEmD*Mucc<K}Yfr)U1Y0q{S@K~EQh%j9oFW8H~W+PeF4pJYBk`1h|qUug@1 z&n|5OX5C6rDj=wk9l7?<<g`tqvbTtF&&6eaG~dA7x39e)m>o^>@D=dW1RPfI{j1P} z^9bs_r;{n`_UCxp*SfM(OR<_%iy{(PFOKi-X0Ed~@TA*<JFZRkAkPptpL>$t8s!z$ zE>6uMPM?*=eEYnp-4VF5`6z_Wh@Lsl_CRXuMhpNytzOruJu-fosP|&;TdI>jMKR<@ zT=g3w=BUTPSUg7EmM8^5LA?IfR4BlpXV0AjaXsbQQ)_K<`Sx24&=tyBrl}iSH(Oqu zqj6CCee$8NaDO490rAS%9g+Ir(fKwrY&T2%Yod4sjm!Nikv$tVdzx4^ysuI(RVhz* z16Y$zbl`G@E3Tr+wXB-Nqc#(mD<BEw_LA#41(l=<kuq=0y)3{&T_c9>l7IALILoB- z$U8vp9m+W1eQLV~Y2wwPwhV-BfQ`zvPkj9kPb*NB9&nYG%{BX8X59@ZYT+xRe!jO{ zF{jT@l@r6b;+#l@Be~M=oqWqc)_GwCw8=N8HiwsvC0do&Z@%Rm93~@w?l**O>Sd{( zS6m)-O$3<W9_cm9`P2TGkX>6)|DkZj-W9RZVLs6lyKga2E}6D(b>JXhaqo!-?iet4 z2P1G`5;eDHG--)JbI4~jr&w%7P==chTn`qLhGG6q$9C4$<wy6nb9818SsXoXnyokZ z;yJ8A@4<ST+CJ>()h9EvKM{AHyPs*^C}?FrKf6UQUagU(z+obFPP)~<So?8(8rppl zQu9)p*c=5P#;`Db^mYwy9i3D8ysQam3$n~S)2s77-jGH*;0zFSBSi-T{3bFJR*Av~ zi`a`)Lej}c8)FzQTZEYkc#6JS=cib_s2>GNhPL|>#dWOMDWtI(yK`f!j(JIX$-;_a z3sfIK2*0imU~BcrD-A+Y)fbtsFxO|M5yMU3q7<d&4NmQ_<)sDh$z(D8-O9cLQ+FaA z$@|H_Z=i3tL>+V;z#qVNiRSv+mb8|b2N%yQI3tl;+!=K0AX^4MEx<!rr{XcCnmr-` zj8%~JJ`;Wf^rjhL{(#lpjgPem->Ti?fL0a6q~e`EO3qx?5D<5z!n<A#<z4P45%*SL z;&kMajL7Q|PM@i0Snm&^vpWM8@0}SP8xkcg14YMya&iGVq9>dJ0cW-Z<5P5xt8N<` zw#DQJ7IK5<onpVJs+2IBafQuAbCR@k-ElQuP?y=zTkH|~9Dpb-{^=fb9osmE7C=TM z$StgkB<8?8`!(3GTpNGXc4Gh0&06clcHGBH2yV}7e&kCaSjv&5qZ!E<=g^x%K<*5> zls_mtLyQMRV+2`UOrxg;Nasd|tFOvy>174-^y&S>j5WNEf2xzBI=^?WuWxl?DBthT z#10T=yk)<zXo~`F;1bb4IsGCraI#K240#Zwdtxen{iNMf;rsD=)}LTioS>=w*2$@k z=ARzfzp%~_r~#@P)vww64l8dIcOEysQ=~?19LjIbuRlDAKy|Kom98)O0cu*gZ^|#2 z^&2C9Vu;wA4&2MiMCk5an`Q1_SYplr58nlN=*FA+{=y<2o{MQRk@BPmkWpS3FPmhy zjLpP3v0+iXgxK1NG<x3^ha^j)F3vcdTFzX{0`3p{ms`GQy1ennukp5nY%A2C^6r}> zAJN;0o*#h8cgQo;ABqd8P=M)Hc9Ln+lX@+4<B7MvXC$Ay?!UZtta8^`+EMX{$SJmb zVq|xZx0j*UK#|#I|9K=vOsj?pCPAK8b))Luqaf^+$4RrAv{l*nn&R~9WX?H_3A>U3 z+x#@JS^cS1q_G@16|wK8mF1}qFt_PMPtfy2f95<vf8~}jOOrv)qDvX9ofhnnUKswu zq$348B1LCYh$aIMx0KwrdM0O?D-7A<l@hC?*|sw7Xdxn#7t_T`XTK`E6M3F+UvRJ` zyM}y^aZg4CcKgOo#kj9qTB~cbMVI2vaBVGtn<LRZnse`&0+Rt9lWm|?xm}%yjB~8u zxLSvB4W(qD5y>5<j7GkNhqDzvUa4;D>)HJd13z`~olTz<9I11|Kjdrm3~z|&&kI@C z=p(H&uJ)TcoI=CbW?TQav-w{x=>IeJjj@OxQe3?EqV;@SuPGD(KAB4}7<{Xc*&5AY zRhBbg8F@}l7TK5!?c%gO>PhL{&|6IvlHtHkKKrs!WBC};+HMfZG2)ciA=9~JYpo}; zyu+Q#GT%}fe=3z)Sbo@0zQ^gRhR1Y|^rDV<S?)lGwzi=5kp3Hw?&L7Qh#5AfL)O9U z&TYH0*^g&C$l%<Y7S!{ADFNQPSvPt};gf8a-u(+}y2aI~m^|Km{^1T34GO>6A|`&% z@#eQ5+EeZ7?LN`Iqvt*lSZ3*p2xhNSP9z`IeZA}2B6f%7upYZW`W`MnqMwig#tp4P z$GD-ib2Zcm`|WMyJ&N7j)UIt!6Ui1uhVf{+_NztmH;by&&>J;N9$#vLru(o6u>z^i zYIDwN7ZGCRr5>jG(xo1^2S5%+vuNA71zWpp50Rymki4(;*qoA1cr93A^HpLk+2_ad z{(V)_PZ4hYw#~rp=NqZ>&%SRs_;h239a$dRBushwk(njtW!T}X?u00Btsvd)XTRy8 zye^zlXKGH$!sijd$`^kW^OFwg;-x(cw(g#8@aAg4#T_3uPlGyMQq~|-oyFFPN`3oc z)pJ}eCH`O?aax`{@_d<~?-`G{n(Nc^UPBBu>1J-z0L@w2_HPdS+VLOl2d8ew)R|`Q z(8Ya6wyMnJFGaZj!g6vCE<!5UH7&e7kUwjtjiB15q3)qM7swtFe)Pde3FXJ$7mA5* z745Tnj%bV(>r~Z_GtX{&V&uOvf48WAH^582TKLM|a2S-K5rtRX+H>`Lpg#qKF9P7) zZBkob35SUd<Nscl|7KW{Ya$l+dNyyTFq+%7c6AA*zpxy1rOrBU0fwnJU;SCo*8N}n zGLc3Sqns~75hH)cSMUo$ZtC=JQCh#S^u|S>{-<4=MpV&xs51Y=doAXG{j|(UR_@@x z?h#4WP<8AjPuD2}zXQaL)Wv<v_rV|DOo8sgLZuBguoZ^1yKq~DZ>_%Wd`glr+4lcr zuRP4RO#JlKzm}(@_lrh78qEqpZt%lO(ePCj770Tj$`pT|dd6UBn(5iDFe@RD5Vwc{ zc4D$Umca&XpN5BY#OYYN=N-Irdh+I&MX(*o{Qhk6>QZ4L*7FYf^ZE03dr!hK&8?`| z;dlBurA1)lE@`Gbz8e1W^g(Yf@!T|m0bIUN)M~~tv^ckVihakjX!nzoaL7rQ@G<s+ zpR!ax|2RpVPngkp!}=hkLg^&75YV||LICagc@6LB)?Y;0c$ZpJ7}evDQav@Jlt8iZ z*OMKu6O;0){WcwcH^~#wJMTv(5*OV)a&r-yikpHDKy+wegmWKL)W<>pSA0Dq_vLk{ zVKwnHU?F+S(F9Ve=<@Gp?>g04IK_z6DkNXiL2f_8cY@Z1vbEUWJCkZA#HvF)Mx&~m ze)PG6-u+RgV<+KgvR774eK&Xk6<k*Vo&Wq4tEsw9?W<PDeWP>X6I-k&<G}htiUjSM zX!@z@@Ir9(i#00%tsC6;H2?dD&9@Yfq??oo-qT8Vi)_P@_#OfS8xyHf>R!%;ps<4K z(G5`p=gbXxLfk6_E=d=4Kvc2v<HFB6g~baq#@!&R{l)K-&MA8eEHs=eiRYlEe)~G^ z(p#KkCr?}rv`KE9rk!$dQsSB0*zjG(g3u?uPr+A-ky-l8nCg=>ru0qW+5zUcSfzc_ z(54<WwcS6Un(o${LLO)T3jO{o1bFulc~!Ed>I|GP59(-=n`49?I!txW90`jhC1dxd zdoEpnR=lSF<f^buYo=S~R`{^`p-MXh4_4Fe^fF<(#i=WF%@T(OAwLiDqf}KjhVqZA z3JBOgN{y|Imwb?X7Q$bxL(=KS^oI!L&gVV22hte4UOnhJenvh#YPuz74AYg!Qzd_! z8Nv{4_QgqF`==x;eNbeA1j+c#)4f^=ozERav}x;K;%yh$_~%zL(uO6p5NA(3gBS7C z>gST(n~EoA)KaRWc&&w=%Q!G0KzBR`j&@zs`Ik=6sA{qnXIl3a6~z$;ze1&phO^nK zv2krD;l|-_g!VS5+SQ%;;raWnaf9&0CUm=n!>kD6DPs;8NTZ!FT!E>9dxC#;*M~Px z{Fp?7f}u3_z_~3loqtcvEunR-r#K3%5H*(<Rr5angNWfa76yCT*--79MIG5*bDZX^ zbeyIFK0#{U><SI2T6-s2E)P0rgeOT<A>xvTl};2YjXkL?X(Dqf_U4YXZF|VOS$RQp z-}e<kbHhKsbBs(y4gJ63w3t`tf8(itd)^VH{1IHhsx|gzn#rqe>MW2(;vU`U57UQ^ zMATu`4cZ_A{~IW*YFn&*Km_i|ZeVV^=9=@~dy|%8Q+e9BXP3l9Ui#kIp~B!pBS7o{ zXPGKNIQzNaWKxA*TRoX8Aut#cfg4YhjFhy(=V|LC4)OG;ZfY}Lm(*3~@5#%5p3W^` z<)`W6E*Ty4SuqrW{pmm5X{5&vp456^`ER+CJ|qWM98ph>X`-+YdlIzNGd>d0l!U-8 zhA)69^066Dg(5Y#jeK&9-zgiy)FjFm+RrC(tu!hac<A`C!j3?AbA7Ds4}r&)8_F)L zkvC5*gPXHKi$3${4rN-AcjwmG6HuxnbuDT;D~xK-93QGP#kKPdsNb~Opd!M^R_x?# z7T#nsl34o4s_@=pnUA0uX--!oe4_{V9xH0a67;9}2=>Z5e43yFx$f-7$>^%cJagk6 zYd6-M#ulmjCdT=NCsuFT;1xPrpeB-q-3h9bnPdQ;+~m|HEZw6`>{sUr7P_OMWB}wi z2v8O+rJ>p$RV8I)WDhL)&q*zBV)Rdd>z*5o-dGkh>n##XDNht%!-2OI03ohx160yU zr6m21%E90jvrLt&&icQe?*BXwamL`D*Dkfcu&SkwN)1Z$LCv!XgEtt1Jwa!q+0rx& zl2U0&Zv&qsa_d!Q<aDe1D~@n?8)I!dBnH&QV**kFYM*gVr1nMz&o#5II-o-ZZM)?^ zHP2-iyqSJJYy`~_6Z;At{AW@?%RU!j;{+L!{wxr~B3^z!>3BHqc&+sFqgBi_$^+6z z5mV%ap^N;68$5;;fyG(cr<^gmq{`=N>9GDcVtN8+x4PP$1UOA1hfhDFzkXblmFL}e z{~2MxSzaV~HV;MLU-zt^lvp!^lkf-x4dJrqT&e=I94CKTNJ(4$XiZSglFzA7;)d7y z)1vpQCd+GHs<A%asCF2e2(32l0lmHUZ(gOm!e3qIGrQW<KS;UaxZ5VT3#E5#C-zrq zck@i0C+oU=JLO+Hfzh@O9~TGh7^snW+(kmbqB_*)T|GTsF!(8we6&udpTis{#)1Yr zbrU;q2ygJ+Yr;VpuFU5-g%7{hZ~Nb;x?r!dBY^|*DGFw1b7m`cOXYCQ4<>&w-_QLF z^W>9!7o)E@NsM}){P8>-dRa~7dGSI!;PQi14clPc)cDWgegFH7M`tSMJL6gF&wE~| z9^3QpAG|C2g>{S-;G~{rS}=cN#0H2t5yHtmn#C+(rJ`5q&X*)jy8Ul_Du3op%ROiU zJEYt`#89km%`o`RS%634LBFlxL?Kdt-&aUy))uz299*%o2cd3%spbV*Ul%+(cBx9T zNVcI}ZS=itj#<UfM~ALy&Y#D}0w#;4dfry)&7b?Y$!9c80<RO}>K|-zSQjK!)cn|p zqwan6Ad;?T&@*dMyQzz|{`zTS0B6X_Q=ug7h{|}#;>TBdbB`=nP{pOq*j(BMSvp%8 z55NU=I~lUJ7A1-DnhK;$8?g?3{LOcAv1#^b6}u&K%Fhn(Ai11~M$W4PeQE%$D-vGo zl-J7^m?R0o05>y)jB|`uJ1sO0Z|Rd(WtCer&Hxw7)Yim}`q=f3B>5d2K~zmuVrnDO z=;fJFr!G%xM`XToo)MB20yb8+>esD@d<N9coHYZKw+-K3KGNv{s^82c<b~#TC^}G& zt!BHX`>tE4SoybC)6b;VU;1&QbjPTqEbOeU1O%G(l$fIlq6KwE$whuFVcnBZ(jf_l z3eJr$ntp@<vPDmgHg!0Weq{k>CF91iEq-H&Jp{0q)3_D-J#kb+OH?0^c1_@qgy$!n z_|(#t!4I#`QtPxQnz(>_Nn*X0(HYai_gZM=209*4erJxZ=^2D;lVwOLUi+t(56x_^ zGxXwAM12u_bN`Mf1J35eZUP;`NRUd6FJWdbsj=R0)&Zx3K29Lt#sJ9mK=7s-Sv@;U zzPha9w-GFolFN8sv8_+jgpHDkZ^M=Lg{yi|bjr?T&SlbP@KxAcq4crae)P8T;rT4v zLoLRLqt8V37@g<*r2YnE<n`n_Bfy4mc3tktMiR)8=#envLm7@3BezH0lIL}BPvfF_ z4$^x_!-bi}t!*<${&4{v;A%AQwrlzj*12}KN&M+6E!SXyX#20VF_w{ppw#6+JPD#V zkja|WgHk17{+f9y8v)Zsiu~?$>S+<K%>&sda*Y@88LGPL^?GAlFsq@4h6i88K0)>8 zBOcYqp<$u##Y?^7inbn@d3tlG_U9lH#7hJHSX?cpoHir_UrV1nHYgBvsc;^b&_dFx zT2LoVwydxy70>!%BCTaM&h~PrFEyo^vQve4cb!2~%Yh?eEp%2#<zN0@uQA+9zY_}y zWMHNV3KR>+7M(SDh77W?qf{sqpb1XQRA(P{jlt;Ih_N)L-3FDq_892Ct|pnbSjDyG zteXrFRO_RkmgF#Vd)6}iWI}O9Vc;^ft26JhHhZ;$DdB8Uuc|*L*zOqbSr4Hm?bx$e zb9Ff6!5S5od>4m}(~nXZ_q^Y0Lg6(#>*wfSy<0lAXSEUAYge6^imJ6(%L^C3pG0Tw zB=6@ZRvs(Zm+AEBGOi>aHz#`0ddHLYNt^)NC~O<>13DU8_5Rdzc!w-YaNeV-4z5~Q z+3;f5<hyaPJJ$kGLkR$&e~ADHV4^3L4Z*c*M~_Y!-n-F#PMH&U5xY1G>=AL`j<5aF zl!O!IM2mJ7#-4y}FUl3c?Ned1{rB3EWpp2lP;RNHL9RP90KAb=fx=T5OpySb0*kXC zL)0y|KTyfZfcl1=-|6HsJ|~y%fxahWgsMT)8$C8oHIPj9#~d{^wEsErer)kq^2!(g z1kV0>jbRGY{%QU<o9(wQ99Yfr$V`^uK~mX?e`J;R<UE&;d1-2Nbo_@)lZ$k0pD(<V zrOGo!4L$76&X7KLDEpX|>TWEkS?02|&H$~Wk|39Q?3fx`5o;p@P|+f`{L(cdlf01$ zcVY-6diUnQbl6?K!+zfQRuzEBwin^jtPxe7oV9o*9JzE%oF$?sf9OQeDt|4nwrmeC z(4Si}HkKg|ANwLcUt(0&X|fBWw5&u9XMNic2&n9P6XCW~aQ-}XAK2{t{gd(6dHTCT zxT$6GN|v+rR)cSiDU7ZR^MpiTc+R*45Np?<lysZH53f19Ig--#51=*a^ynY;x-~AN z+FdB?aYOV|hv%X&PmzAmH~)_dN*iVaMCpMv@6DYkBH1@p0PR!*j@>1L&kJBWN^OzG zBfhjF{=HNf9Rw!R-x3ENzHt(&lR)(3hNS)cu4QUR3n<udRk%srpun|>m8TS=Vv@Lk zJd>E4j<G9k@oxlz)}QB(CW#akZ?WrZDCnx)>b7y<xf+dbFnrJ*@Apx$m>pAWojmqI zsRPPO+4f9mXj4QqH1{@2$EmZbPSWCP4CttFW-6d11^m;|V*Mf(5ykpyKCL1_@(KfM z+$<ln^VsuCS8P=X04?>20#I)@gL745hv5^6ta@X83>WN?^l!NyzpvYM6o0pyU=GF@ zFD3W3wXf7f(sI^`Vu)=hyyx|Qnk*PP1k_;vY#qZOvkzD|LKrJf-pc@b-a9wi#GWG& z#xYE7{)I)#eah`BXdkqDTDOc&0m;ghCjEU1M*Il?2|`%4&Ug<~IQ1v)1T-2X`yuW; zettAHr>z*=U$?!J4tOVqTJgffO3HTMDOsj@*7?-im)=LJ>3rz?h4r~0sl?%QwJ(6@ z1c&Rhfxmk9psGU_{;b_{!Je)f24lfA@GP;rHP4X}3>g+AmJ7$IWzoT|9ZPCd)w;~m zNFRku>U2|w-XlisYwGkDSDhXuQiXFM_%b-CWX(O|V);I9pU1~M8w?SR+hnQk-oA1> zRL{BYz~yhX7T;$+a~`T?Wc;r8n=y_PIM>`Up0(%V56E~)vgBRr?r<{R`*V=#n#^z( zUlMW1wBipF|4RJk*}uMI$id=<;M%x~>yc>JHPw0VX!9gQ<kS<#5wql!P(tO^54F|r zWi*<O&&=t{FFx_m!3)i%2*h~uo?du5j*~S#epwxE7c8`v*pL_Q)pf7wx#oD6^Cks^ z2_-Qon%bKY@C%DaGQT)~q~0udb<oVvscu4L{fo$w6(8kj%}G&!$>Dy2^H=%HK;I|l zhAW_-u;MjuiO{4s#(UgheO0oC+233La=)S6_uqBH&8pBeUnm9&M-zK{)3*EoG<@Qa zK}csqkq&QL{%x+VQ(86hsxJHG*o060TQt2U5L9RnmMmAhaz<lSxI<T$`#SpF7Mo4O z5Gz)LC7as@CKZ|&pJd<l-7z`a1dMF?fgQ&as>^7j!_AM?XIx@c6bUi4EF&@@YG<D< z<xo!&M4$?GW9Q0wTjNoRU{!&MFb(sjDTI4UU7X6CDu8Le_nE7R<;RO|%cz~6eczyk z2Y`n>zzkz(71+CW8?r9<Xuy$U{$4VXV|H6@+nDr21>1hz`}M<PRMjL46SmjXK~&#| zX|=FO+-R{pWWJw>`#iOmr%DSdR#5>PiE1tT4O*R5`u6e}c!xXNjVkXs_;Cc-RMq4# zmU3d=dXlR}MW0;S#HNV6K%pk^dSe4@L)RiK&pUk0qJ?s?0<ac8N`V<4&Dg1)Y`?~j zAH86=@Ad~UB3`q_ghx{ZN!lvYI<gO{jW0#=^1YA62DS#(tgly#bgT5YSIf26{aryp z;KGS!KdMYS77XH0Yg=wl{Tu@u4b?5F!npRN?UdmhP}@iWw+fdU&uaM_l_`H{G_CY; zAl%N}p<rx#eqpqA*aHG|c-k+;SlUp_^JKEpU$l-9(g{)8pmQ?!_%?hMB8{So;)Zb! z6qFQr&~>_FoLR1lTN_`;h=&5<7B2vW>(44@vTzR|SLh_keivAZpPHL{!I>m2QQ_i3 zLOJo{qKDRdWkD{}bu*<w&c$WK8e6>?IhoL^DsD#4fvvQGA-p5%{v^m678YgG0q@dH z<%l8Yb$27#K4tO$$JtwlwY6{E!gLo(Tdb4<E!v{RrMQ+-yttL%#R-8R!Gg3<9D+lO z7KcF4AVEuUmjJ=t-L-VzoU_k)-+lDE-~A)cv&gfu)*>rw&heXb%rP?f1S`8V>7J>P z3^%`qF2KIgXR$UsC+A-bc=+B>U6sHhDyr>i=c0f&4sD-fuZ!F&>hjB8l}cCXjrd?} z&%BC4x0jKd_J%>>fnM``!wy~XA){30p&t0c8WCPozu{5$w7?-MJm30Q9ABc;mQF(o ztT!_ZCCf!h+T~Z;&Ty563*$@Hq-Z`W0dEhEG=Z@=R)iHDR8H!k1ODP5eYlvcB`hIi z{IRuRxZvs8^U!b^fqz_i{&RTzA9sq&!o3^(%Q9AAH&hBO(Kxx4=2h8ZPImu2I}Muk z<p$?d+^eHZ{<~X$ip_u9ykj{gm@+s-1X{<);dQ>W>nqxeU5o2p!rbY~Vl9(JH!NTP zhHiB+bH3^EdRqfu#Dulmz=Yvl#l?(nx|)K&^oO4FaN;%Ht%%ug%q8IfGaRFx>|kzd zqQ**j)+LCA%4`2Avk{1Rq5-Zh)j7sC8(Q=!DP>NZX*S-io5U4BGlD6-BlWSu<VBt0 zBpn+_WBMZJHQJa~HS<XcFjDuCO(VbFqxHZ~G4}`Yvm6qX<oTn8lsB)mqS(jM#fp@9 z?Ck`uCw}0V{KOHb*DoBfO7?<qF;`5ngpGW^qVir8dNa7RdJ*7F*W@iLecvC4vKjv@ zuZ9D1oPU;IrcpO+Z2z3l$5kN1mT7G(!$^cKZQcYwK7O{kNThOc2Xxs{^&UC6W#mXy zW57dH=NUzK`vvZ4v9bycNuch%@O?l$C<a57wy!0yD#4wRwNzM_0>Ub?fHZJI0y{`; zkE`K)%Mq6IQL&!7EBcdrfsDbg_p?lz`m<YRco<1RZS83lYMdbnV*i9)vpCFSHE*+z z7}xbJd(`CqtEmIMt<CMNJif8f@i&{RVT+5^17N&dx<hY-2Wc=OI8zAtea#?W6V}Ud zCGi%7W#t$Bnp(sT1ik+QlsP&Q3c)%`s}tKycYqFpHIl4^+EM{N6#DwgMr>wK7lN-} z))H6hYVZYaAEVjT4q0UkWUHyRue8;cRKN|>g<DLFIcs5wT1wHUfXkC#)y;{=THw#Q zwJf(OP$iU`1*aCsq*uLKuG((~vMaQ<eBw4n$>w;Gf*I54-|gWTn#UpjcxU*|M=Xtw zoS$LBicP6zZi+!GVRenw{Racj-v$Q%KstX$2LF#0l_=*Mw?^Nw!e14ANjpVUE9YCD zH$|Ga7KzrNbE}D_{wWudMZKMndMgAeMWgZmq(|=&jNS~KTHmQS>4D)Xzw8TONHb*| zPf=Y1q5xaZk~hc~u5}SW%q4qE%5fe5MG1A^Ho=^}1?kJQ-&>XS58rccQIQ}j+Ox{J zlU4d`=%onjL0tJ~t(@pixqP_P?>PSC!>7z`d|fh3aOIu_Aj@0Bt?ZSVNx|E}3gpqy zBUihI*IS~|uHaXg6S|)q^RXCjSA)q9V-%^8EUcY0hgQ#`r7Siz+?v+1f>x0pzj@<n z%R(CspC_fvKne?B4(|QIHUiRft=pB2Y7}aNL~aFs18%j|poU2YH<W>{s_WLAA*^=g zn#@TP*u;~!JJ2%c7+aHgEEttoiu>5OZ)<<(9lY?29A@yXAbg8pL5t)=X9M%(&y4F} zu`(AP?*?^%+nnpuZjiujyg0uf6qCg`Dt3Fa{o9<~xOZHap}HxsX{>{b=XN$siSQZj zN0N7z#2I<}5HM+`pliwsW_aQN*u0(+&#k8&1!VVtrTa=Z2e`8<r{2P%D#hRj?*_ZA zUt2pG?nkc4r4Bu5i1!$cL}%y4zLQPW2DGkq&wuGUQ1^r0{G8(}v*!`^Mlq$pceFXy zo+gf}Et^Q<v%-(q%-Qzhll3xgZ<DsHjTG1qk<&V6Yr8BR(auQuY|G<mL1w0sg7`Rv zuoQfuSD!FtsQE^L{hduoZI8kVgEL$ncz#U95#>kY9a`_`y{-8yai%zla~Dz6QxTDF zQ|tt9(ssVShEDUd9CwR2VKd}S@etN|9e<&!SnlTF1-IUKqmz=`&OU4X_nrD#_Ry2@ zzUbh!5}}(&U{GaZ%`L<hqG2Ixpsn(81(u;9{qv?zpvLiDeDjQ2R&L|>X|H_$M8+#G zBPEFf$u4}9;xTbPopSufc19}5&T$%%zvGsQCxOO;1srQ(0!Om<BbGDrGfFAOwECx> zE+sX=x;ggrmH9uXS(fyFBBlI}ee_MEJs1hT58iX$GKHsXyjlsBZ-e;+qWh~f^5MEl zyVKWk4d>4_RoPPXmE}dF-J!|79t<6ToMO$s3#;t&r_>GiLo4Wi!$R*w6ME45YphA) zh}hFkFHpVYS?evYs;W*!?AF$D&OtO_8@^%_T&3Sp<hfZll@mKC230de9N*1ks(+>X zDI<OS`RNu0omhVCF5Iq@d<~k%d@69+E{pGGroOe4^YOz~ek)g<rt#Md_n>KUcTB(| zgYsb7pv)EScHRKe`53s`VJbgSTjnuhm^tiWQ|39itXbUZTA1gHc0S*2C*VLLB&UU+ z@rBv$e2B!Eg-9k^Zb&(5Z*|8N8x6h~=wNeJnJV}`WzOyQIN{>N;f7jeGUlzE&R=vU zII$c7?ua+0tkv7ku!Oo11n6y)4PQZG?y)ND_?{6BzKK5B*hh-{5o62)9=B6_ua+vv z!HFw+8RIv#cAUA9y!?vmu=i_bKCgZpUapyM(_x5VSn)lc#DW@pNOtABy$8jmd*S0! z#!iJrQmQno8#D{r)YlvRv>|TCVY7)(PPBT>Gx#wid_QwWCGCkh2#WyV>$1s9=@9bi z<TtGrY!>C)CF1({H<K3^SYiIGxIaKLr>XmSTvwysJwxDz74v9p$g1kd_ho+Xb1jRa z&`jUYCnRuS<;MpicbP75YW@0liJFkS_DxoIk_>R-GNKmVjI48?Ui)3NxW<_|f7#W? z=7+P?DMylM1-~RzT*d<nbRM&3Q|;~EqU(?GAFPk{d+a|T_h?6*o}_hf9Cjk>9`j>F zze_fWiK1{l$m=e}7l%AS&^$@&%{_;NniZgr1H>zAZ;zJq{d0V}^$_ymI`iNRmR5B# z3k!LwPGKAp4T3E<PHEP|FWwbJgP_u4X!I8;1*=Jkw?MX@x`wIgxq2Tg8818otB&^6 zg3%WEbY$e4+Z|s94m9XbOXB~y`JY$`fByi1?~Jb94VJ%)@vP_1fPT(rXHmSrml>b} za1H=J==w%BTS~BO@9iDwe#rN;fNR56L@J|r59ht)6GOE5oarNwAYR{F)z=uRo*m<3 z`IPd;RTqlmW`<E>uTM@acZ~;DH}FL^$s1I+MFjCAP$A_-1&Jf$TBs{GHC$M8jPtyh z$2DbVsaIT6H8(r$rD7vxy?VH~vHUj3^2tOLMCG2PXY`}F_Y<cu4e<<K98cVjd;vHQ zKQJ8WC5jz_Q|cKl%0-O22sb}4dbZ4A?)eMp?~t#kEN}=+WYzX4nL5GaQfiW{mkxWe zqp~o%m_>!gq9@CT8@sd-pt_Hh`!y-wU>RH%jxn>0p=MNt1OQ8^fOW~70`>F@uYOv9 zBSS<RCQ-O<(V+A<FB5ZZ0#-lZOoycQKGv4-aU<4wWqw@tSZzxcwC5%9AuHDPcq94i zcN;ptGbtx;|97@z$B5yYr+YQ3()yZs%;J`AaVjrj!dMgcx3A~`vl$=nRe!@7rj#C= zp1$2frzvdRz~BKHP`~`@R@~{h01b?+j>%i6l23bg6U4L#vcY}ta)`l$jLS<}o(3-= z&3Q|;zark<)ymRJ^Q)@ba@KchPyn58a(9PTAO5`t^+(O=AKEc-oKB&cc|hIU2_&|f z$DW$(i-4$H8)TB4<z3p`K7KLHz~K_}FA#fMzV5c(L~2{d|NUAYWbA*DMQ@eR4gZeG zx&sRTkOR^-$3GDoVZ!~#qxmmK`Rl4Sc82oitKluSmY`UIvMpA40yV8n`GC$7EU88m zXM7&#)z(U`t#Yg6g`BRzOj-m;%p@xyKk59%YRUr2wCpvjQ=(7g{MnZWc1TjK5_k^_ zw2(Rpx@h|w(neC--*Hm#%jqWTf00P1OWD$Whkn?(l=uY+>F1NAL;Ad1;9AAv4-y0F zR*LAWZ_qn?5oL=fSLpRmyZANSErCND>b&iz-Xll!|FfUgoM8%h-)L#2EXywQe~)b< zz(d&}SziyMCC_&he1|9krV{|!B0=#9t`q^#xsPg+ayD&?6^}|%tE;D8*1~JTBu()e z&j=SdiUsfMML4}Jtrq$X+eXv)YXK4O$Iyd}lKhD@4@cGIB<rT~1?tyEKkl#R6@(|Y z6{LwhCMkhzH{^Tc{X9S7C^Q?Nl?UD$D9eOzAxf*AV{fK7m_2{la23R3+hxQh^%h6B z#L(NU@%6P+yQ6sD-UYG;Z{;e|68?HSh&C3NT7HHu@2E{%A$VK;bLyt@Y`cbxwPhv1 zRam;4(GP_Z5+R)dqm?NHc%WkLmJOvPzfr4huS}i#W$@xY`!jC*vTkEOj9%!j*yx^h z$UQM&<j9Zp3(-#-iEU$s0g`gsHoQ$D>Um|5X6EyIMn9Y9BQt--)t*+4g@%9Z{~HkB zr>#EKZ@7!Zn_k_}9}zvCp5enf535lpx1)b4aAZ*VbWHC57-ffdK^yEEnk3J=jIQnL z4RB-B>7hoF^Pjy!CGRuQ1T?jFz3<y@qCW_q4!d#`drzoURP6u^Kbo&sdKW=AecO{i zM?kLXx;LUZYs+K-EL!y9Yl^0OSAt)xzzfD|*T-Xezjy2EdOyyR0(#76K5?VcwZr88 zRi+B-cE<8Lv=V`wj+kFp7YB{=X?LjM+X;MMVeRM5H3!#4f~=GyomlIzO~CCTti6fJ zIi=&Kpjvhw%E-@`kT$onW1S}VUf@Ay<C|DB9Nv34`*$oFoNFmSbyd_5<X7f|5S_vO zi-sHgTW_51WaC~iX<xZ!o@HKv*vwqDkb@xko4Bazg$YtpgRlSXY5LPM_Wu>?u>j`b zEVcs}q0s}+%33W;Vd)asg?@_7sS~*yfR8ZJ#EyaB(jQKMYfCSx><ce!l#PnMDtrSa zCSsHU0Wv9^f`golQW`)bXgRc!AH`;i21IL!$F&vg0M!&bm>Ji$?<pS3oIp%Rxqi&a zxaY*px#qyKAILKW>){KwwP3sV>cn5rZU>KL3JTw^!(dj7cj$hRoA7YLSZWhC3}Gj# zgIDyjB3)j+#r+_TE$EEOp5E{;D9DK4ncjyGQfzjX&>v4zS*xn+LK7MNvg&RD!a4=m z+Sj>{u&}HIZ~213c6LR)=#5lt?egLIwb-@9rSW$7Q*$RyK5W}{V#$|Nv&Z%z{``^M z?>IIn@9VSN>yl=|Wuf##N#_+ms0Dnw9%wFs5~fBz7iOh>XLUQb@$AgXdcyw>>r<?K zcY{4GtzwtQu`x^R-VQ9M!ghaWzTsX3r%NQmjK{QULAMc%+G}(tIY5Cu=MW#*Czq0q zb*B}Hs2Y}0B3mnbGNI5bYKXZrnE36n#HtymjiY;+gU}naM-8Y$ZoWDDVoJf-wdwws zb#&)1XF})B`?juaG#iwUy{K^RitgwYkJhLH%?r_h@Pq*c-Dj3Z4+y+cWN>LbBI#B} z6lnVnL3S!JaSaX-iSsQIy^#sngw+0`>p+|@>%&^X-U{Nl_aX?`_4ajH!DBjL5A&M` zYYB1gcJrz|3#y`neJTsqqtpzO4Y5D+FF>DRzB}?my6@1R3_$m+>7~Im^IM&gKx0&? zMFidGeUay|wVa7IOq+VD9yd=O6$R^qupjDQO^A8&-v4|n_Zjx5>_Z{ku0C1~|Fr|~ zFG;kFpk8L(0*w1Z5YiLM`D+V6W369FHf^_de$Rf#c^m2;8a|u*cVL43wf?bLA6qKz zm>gZ7NIxO!G6!Ka@|)wKhp<bRxReYu_t#@ksoXL@AI^a<-c@HaU?Tp#vI~}Kf<2&M z0l8@nNc5*}^e^rr`!%E|{I<$&Xt~7y2%@6Tah<BK<J*m?Qm<97nhjv!!TrmJW+ce8 zg>pg-b%NP#zSzM{Ml_{g(2Kb$nYC`X)A(d6@SSkIE1R(>-Er?T1)R;{G1@cLj6Wa} z&+KJ3$1AfDBH;!Yy$X!nz(-l;yzDG7oN}=?Hp!r-S1vi1S8C23jAcM>8k;-J645(O zB-yT63HBydwfD?~l+&Hpd05iGzS4?47AvmIF2<T}im2F&yD>lOQ0Cs+#$F%(H>?&l zttvDR4RBd1+)1M*!h2HvN+b<ug10X1=99ljaf=bqq%#BSvhK#6U34g!@^H7?I_hVs zWpr+A<nsVtue4e6@49uXq&0Ybk(nr(svEgt?@Mo=Cz(){MN(4Zw8=lB%a+vOK9SHd z_;;L~+BX?$-bvFd6$`0D{U7Qy<Y<`c7R~zbBZi{i4bpn)3q5H%G_rr?R=zJk-s8fP zIQB&U2Gn#cLWowpgfm<F#6a1DPl#b)3&rlpWp1J9<R87_6U7L>WaGRVZDIDxtS#1s zC({S|(RR;ANbQ*x|6bi2x^!$oPYcrkwpW4AJhS7%%An=ApR12<){d%Mu9HsUL|?>o za1a=wLj>D!$;ouWrx12RsF}-xx-s`;0-bCaV&Bi0$p;mz;N2(tHB;Iu<G68|4L-)* zjPxx&of-GLH`g=kV1*x)H16KaQRU<n&r_J4<V8)$hdOX>1B}Ee_Xw!LipQU5jZazv zi#Jj8c71>qMlY99s{LQzE-Y_%5qmWaP=|m4*+N0?#N6Ox#{Rhb<%SqW#s=x3gJQy} zcu3WKwqB#jCMRHi?T#<ilyww_<Wr($s=H~6U6DJ~hC8KZ-?WI+rORQrJ5GNMwtnK0 zsk|@^d}kmKg-C)Dk(mbt_KVeBE1e{Q<%aoZiwP1(H1bO?YJtu3w0Pr$k`fYJbcdng z-GhI6{{H*se`!(vfgJx$d(%%cGB#NBDa|M^U@1ngWfn&1uI~o8f)Ga*z=~FWUCGb) zngrf0b{_VoXq8*eV~6An6g|P<7lk9J1ef}Y$(dV=vuPbo11&T)o^jN)=yn-A-JTW? zUG*>Pqm_JZc2oR%rzvB009oipg^`~a!H!q1NO9X<UwDDKpPiB=jtMS-YYa<~>v0>h zL~j+EMRSPh2MhU(Qoid?BraYH8V@aw6tAFYlRh}H3+Mmwch9QvZ?nz!gv3ox#tnB5 zDs{0fGP+4G!%R_5DJ9lX8O;NiM!JTkT-1&LL{9ShYm+R4WZL`&+orG03*h@^b!!pO z2h>iEll%Nmio1B6R}Jw#>2d7uIBN5IO&EcP?6<Oc5SF-7p*htL@Na2kq1)d$*IPT~ zp<N|zIuBu*3CwmJuME>z)ztX)fT385>@oJP{Qtz{GqVJ{dNIo?VNl{BAROKes?{50 zNea;D0T_~{jXuEj_!J9k&V#5uF4lY_ZW3fdO`=U18uZW~pvpXPD)^AQ?q};fh14L# z=J-pCjFi~{0d^Rm>gt{8w~}UsPB)KK{eGj1&%RE>t1f*t3N}uuM`epMQG))}hCADK z`6($X?Uj{m;w;Z-zJGwp4s>Hg2q9~dt{=TaPVhb7--wQ9_I|j<1CRRQ`q8>c71jc| zcu-U|No)3q@Y3L{svl5M3$Uvi!F|T(ZqEZ}<tZmuFRPgcmFKJhG$DhG0Pd0xD-g)w z#LUGb#&zI+*Nmx*KTp}O^~_hM?o!j&1XsTP7lI>njF*<;HjdU6XtJ-HM!x{vZTEML z)Zg4wSNA`_LH?LHx-79a4s`=+NBxd7XI+PQH`y5YAONwtt&Kr!%b9*HYoG`D;{9xH zxk>RE@SVH?Zt|?1VJUTEa5;jtluQqLr!dOZ#)kddvi9(nKb=|ND&?l)95Za%haD|K z73qW>52!ap*S7m4C;Ki`U&iYH$4h39l`<&0a6Z3`jypbRIB$8(W6(%#7)HJvXE?vP zX=j_N{j3<qe*Md)oksNg?>Lpjd8jVU{UXz%VureHm7pIPuP--BljJ1`@$n^M{L?kE zBO>})Bl5p3C#Ijabi@^Ev@LyGQWnB4uIKw^oDA=WetY&mS@Z9K^H2B?)2KDIuiaN5 zsPhEo+h`DUcl+yjNs+@z_Xm#y<L>i18=5weA-2vut)#dairg9_q?N0<vLT|zbK$}7 zI0FujK0MDhX{M+~N$SPJH0?~}?W>=T8LK0h4{MS61DhxIot3|wyp?ZL3U;xwok6d$ zvBSadS&i~mBXyAcbTLi*q%EA9dEG;#Qc4C>xlXH+K5X6uR@%I$*O-$7uhZ?2kyX1Y z$dK<M)U4%(&Vs3M4w%x+-CTi4yaERS+FCila|;8xcN6{R(TAh4Uzwz8#aS1=f5*WZ zOxkKgEX%A*>Y6j61oszQEmtQrX@)2^w71_3l=8T2qfPeKj^pBz7F5WIhy=i`gdarA z!#*LRzL^Q!8O9OAq0DB;NyrlwRhp|R!MZ&*WApy~g(Xmny7{61&J-K_%`<qaQ=U1| z&@0P2Z6WzH{AMZVE3s0>(lJkqmm5Wk`1<N(G9XD%sgjc9fZ(C<aUC}YVueM?YPeRt zDGhof1KJS4{EoBU0+%5r&&vKIv}$8ManTJlFTF|Cl%;W=72I2gm*!`4$0>pGJo5u6 z>E|!oA<<m>OuT7}AMm&%4p-oN(;Gp?O-+FLg<pL&I+MjqB<p;-+B(f|NMuem#?U?6 zd(QEZg<hZYXr9b^i<h?SAZvR$^YjeI-1ZW*&&46H*xt$&#lQJGuBu9pnf;0soX8)( z71wmludgR%dSbdX!$=TF(;7hI%-F?tuudyaL73MSsBJrA!0f)QGiL>Sf1-LUq%57@ zKN2u?H%%;N_oIRgW>8GMj~6?-HvaN-!7ugHYEUMq{lkgkn@AMGxYlwPVUsgcGnfB6 z&JvcifDq!q<E|>K9qRy>6c7`Z*ph^m($0R%&<+e7ySd%5%;ruGX&d=5qEjS4VnjTm zmS!g-FCM_a+4bLm-9LlIf3E=bzkAjG>Ju31k+r%KS6NYg=Eh*2bX9*%;;;5AWcXtp z!*5uEqztaxi%0)42?8K`K_k=iLFaph`GxzBx_QrazSG7YASh9O#Oak|`O15Ekiv?w z2BtTD(0fWl&fEB@cOS|zM1{64IXhR|vO#aoV~)K12<Yh?8B&r>=DVtCevLQcJKrhb zmXDh<58ivw1IrFKkGy*(v+zbe2cDC?=pVY>NtyomMQa!5I2UedaCW}Wmp-F1FNo=> z;Fb#yt82ZBN)RS!&<Bbq5_Llscx9nI$=2>PnMU77RZkptV!^e-eYPlNwffU)zLEHU z_tH)EXrwn%-QkLE-lS%U&4>J0F_qzZWr+a3HzZr->1&*$;oCBPE*BTg>T*pkdgRjF za9IqNl#QKwOKsPuGcn#IaN(9_a1}-4b{jbDPgr%rHGoB&hqlh<Z5QO;K!`BCl18gd zt(3Vgmtaq&XyXy;+wmt%5kcYoJajJ@31{oP0PNk8h?vN&UcP(B(b|_zk<wtO*N7Fo ze)X3UXI_&5C?$AYGU-IIXA5q@nZkBY_LHWmuZU8^rXthWG@TM~ueH5TweRb5ItRZ? zuO>-J)`tc>J&cwmZd&D{rMRM{&v3mTmiD_eve>A6HL$Od+`0H36!qQwXzZ$*q9Nnd zHNK(g$>(MNV9`RBRIvN`M{K)m`}%%r9C`z)kU4vD(;`RL{d_T!be@v4zj9XIAQWp} zT7W8>AFmtct7D&}8cbK~LVbR#yUP1-!tS3U@LxAcu!AF8?9X&nUgabS<0~){6DaOK zM<}%C$K{sqbf1yKzsM;R+IB!0V07=7zM%S3SYn5lcDcLW3CRaYY&ev7_<bmVPbsJX z&QC_R#mwKV+;{yH_v}U<-=n&ew4$s3o$A&Gg{aT|n$m&3G0+r(aSkC@)%&5w<1uOs z>@bE*4i|>zr4(W%(zX_XuQB$<D}lP|AF!gk0{lwMI+0hi+NhukSQ9~g9KL6#w;8$M znBJm3SU~F2sK*qfbY+HXucWS%4OE>-6t%}0-J4vrO*@Dc^}dvI^0$=lxUJ!o{%mlC ziL|CC)#KHOu;Vyy8R3}^(OK;;_cY3;Oi@#<buaTx^JKDCEMNHF51^+=EBrwbBuf;2 z5d40=j6j~BC-@h!XUSn-8QOefsVUDV%YTvDY#4B7jJeYq+J@ieI}Yn>st-(#Yb(-I zUl{?w3bFzBFWwwUu&|`j<Wa=&YnQz#MzW-C+9ei-=6qG0TJp4&B9Z*g+7H5dkX?@f z!&DkFNM|fDe)lf;lhUJHzvf$g3CT#SKvjy|)R{9*)XCTS#4d108(#b>c=2m^aRQ`l zWR~ofw@hj|BaED`_4N=NK&Ctvp>=Q8J%8dS$Y!bfB5%-j_RfnegflDtw|y<cb#`ah zbEPbQ;-T9)gI;jRM4T~*$E(nszp;xJUqX_VDZR8Vmgq_2Rd|}wZJe!XTh;G49_n9; zI)<iLf_{oiUqCkcG)`A`cpmEy>>lhh&%PDVI{EWKr9Ko;N?WE-9`0g65BiUNNl&2S zSTQbAA~&+YVmy}2MYMe1y9Mquuf{ohVx_+Rkx_3o5-u`tw-dLWWT5|_&&GIO9MrV9 zbP^Qd7(4f1_e_uqs-b(%Z@|7Fjz_L<eV$Co7nD~OCbJctQAO*Ly;7i-Pwf0T-hDC! zO6BBFq(XR4_3M%a08)rVr2>{-wzya^FmUO#|9urgPLc9--$M-QhPls1Ein)^uKPB0 z8F%Gt`){x5{37xjc|eVZHdRRxFI%V+qH}=@I#XUbqCIyq%tq2kq<D#)6CZk#k5D-o zIbj!BQArPXEI?%r6*^smZH)7s<rbq#B12hjdPyl6;VEKb?*kdaK2=mS4d9sJHMm$j z=+EJlUC7>@b}N0m_=NYkqp5NPG+A>Bk|ZSs$)EoH3jbro|A!s^gMNx!X<g#-<AJv3 z&tlm%pC`tLUIqt;m32vce$4OFmL+<6H!?PG83Ay!Lk&!E<+G0$nQtj06m0X{2ZFfd zB#13o(j(nqYmuVgDd}IICW6N5R}?mP9BQL9i(YQpWjP5{j_C+y<&1h?V}yh$BWRCj zBUUe<!8Pz~%bX;36}MoPH$$?DJDDbahnwXp%{gOYpO#h5u4_==SH&uej${1K9#@CY z7G+Vxb!K+Z?V}YEbw7S=2eEP!HSk1;QKKZxCQATPTo$!QfPDd19kG}2ePKPc0uPU{ zuuY5?3;@R0#uUgE0)5!Y599hwCb~2xPAwC4^Mxh66>Y)zWBl1NWu*}M?h8F-vkj8n zcOmg#e!J7<?w#4J9|v!DiKo>pP}w}1Jlm6_;7JnAvtyMx5x~4X+pIrg5?a1g6fV;r zsb9$3wB04`o|RH|o$i(F62Xx?)Qij+PySN<N>J`cGaUYHObC$NTq%zo1!c~ck6DUE zKVP-Uu3;!@x2W(eD$-4LpK5C`myH;BMF^1-JEKXNYIS!wr_R3Z+~26_xtBWQ-l94x z_uMC%e5j-_A$mcDR}`y`9xzza{DcS!L`PQZ?A<aOTROXhUq=LnL0f#*gZ=p<3Ud`i z`<GamHFw4xJAm9jEJYR4wNn#-lHTME<RuM{nTi`(QwM>#1Ec5W_Z<moVB5YDeNcyF zng&p*z)vlps-}X1+wPZbxZ_Z{1Gn^B(OmEb&S{_Tf)u_asZyIu2yd47zzGKbnvB;6 zF;G5E16S$gCRws566R+0^he$w@Y^$B<VT9}0u7S|t}sFV<c;EnxuiP#YYA9Rub!aG z*^`al68UXlQ<78id&HQ<{9wtJ>d`c<b8Mam1sVXDw-I9Rykf+RTaH0ag`YM+eH~s^ ziEISFUdnXimQmm=Z&V_LS%kQzfORia_mfs_FAY`l1v^HAStLYbTHhab#%^F|BIi#y zPf@z`zvJX#sqVmKrL4ZfU4%llbf76&Ng>K?kkMm83=MYNnumUv*E*n<oZs;HYE>^D zP0WP!0|<WBXL+oMW$M#WXDaZpClc$JS?;~;@$ih_a#`R^Lx?E3O-YB1G8yePdCFcU zHWJD~Yc;*_3fc=rT{EQ<HXsj&WV`6eklJ117yMo~{7ROmM@cPZY4@V9IhatY$*h*S zH<V#<M#x@94rbxWX3j0Gmln12PoPcA5(3b~Z`3;L0W2ley;K`FksdM^y|GZ*_U1XK z8+i6`8QgW#+%gfAfzK;%d?xzb^5Vj6v!ooAf&X+gPhf#48kH=<dBEAvl=CLr1)33! z+S?VPVqjatCeb_pN*}|P(XsE+!+<8EUC2jRM~o~2Y%0b-m$VX;&mE2z3Rqz=xz>_$ zebsUv=ku%5`+{paT!;rhxJ&C8vI4o8`raDarqQ9jt{XKnM5~m4Af|jKmDw^PmH|)y zSt-Btb7ibhCut=DWRVdN?Xox4hQzKEQ3JGl(r?rY%G8^6?2Iyn`{oT`iL}M`z9bhG z8SC$bKXr&fYf8U`hL?Z*he-Cvwf<w&qabP@%nn{C*u8Nj9DvBK3#-KAoAiDCgxr(# z7LVyZ=9^=ra6t}{qSb{i>`5j0A}UKBwG({W2#c+b?TKB7QemRC6O(>pdjk>PY}j9@ zpDT%qF5EJ+oR}Dc(#~8M7FA*UQ7<R{wp8UviXIgUF|qgNqR->1)H8A<3oXK`hZwC~ z;o!vie1F{B$*rXXvMGF{9T%xPGeR*w(v*fiH|DAa_;nTZ87q<JQz|eT^i3xtB}Ylu zxm_co5gqcz%ZJWR&FC%061xtr;|!Ln&Z502uMGbEpRe%0+(k2%d8o_VeOKEuEkz2e z=8x;fNg2L%NSUHlk}Lsl#2!I*db`{`pKc8*fNh^ue34M4;?L9K=5Ye(*I%CHc&?7K zU#Zz1Ue-JE7dA)uQcd3oUgRnw^$FAx#)P|lK8!o~l#r}#;NHoUS9*9lkUjPxXdEKw z7K1{p?=G-yN?biRd->icTChVlT`j&!zoGIXo%GGS;WWn)S<}|etu`qy!&;0NK3i8p zuc(Q1dX}?nP$`A5cEoLes=ZJ^T#8|?5TH2qr=wPPyM_SG<2$Xcb2JtM1J8TzGJ9aW z>f9%01}dpq9QIy~YPD!@0fXQVuh^e4f$Ou=4?|+mV*)KqB)kBER@%khvDth3?o|^r zWo5{YdH9M`c=&)|eie5xi<H7U6O38y7k33ZN7?zB-3YFZ(YBZRfzhMB6Y`0@bn5zp zt|dHTJUvWfDK)8kGga0nFhlLSl$~JJ<7!8u(s{OndgZeL$>tiVprg7jL5aXdeBlgX z3tW7fN3S`M4R@QoEkc{pD-PsgS@689rtcRIl_!24XS`o^)9O^*Je+#ENGB$O111JM zr~mBH`n5SpN}%||l&YjFMu0lXtFS?H7UYIEJTf*m)^yw|5Y@*3Bxoh^vR#v2jjNaY zL4OZWWhSJc;1H!FD5#3Axgf~1vo>Vbsp`?xn5>+z=Hn~_^50n{S{Lnkf8tYG!yV1f z+n5li9&~<g=wz<lBhet#YH{?`pabr_+>)|AAoXQ?Z&;UMrasylLIHQvnAz3Q^JIjk z-Gz%Qh@^QWT{X#gPm0(V<b*37T(Ic&K83z~;T-k(dM?2KtCo74L2}xan7i|7Mnr+C zY59W5!!oHp8#1-*AxJ0MWEWYfu9R!(;IKVav<=mamgYSn`9(oOOKwzkS>jgt3?F)z zSfLTlccsU}Q(B~Iazmvylx57(oP($QDv#q;kM=z0DOGr%VS!`jh4-~WD`TLGVeD!h ziHdRW($2%YT{kDbMl<AMG~lO(-B|iVIMCj|;paOpHkOoOG`SC>K9WqPPC(1UC2Z3& zS}JWN^<l6hnc#QUj%wX-nRVh6_soqD`oUT_TLzZae)Sh!t^8!x<06Nk2Gfp8DP1tC z9!#HBIVH0GozLhCzoe9jv~-cCQd{tGRf8h7AH7}bHuN)&hV6L-CS$}2;8bbC_Qk3v zt)hu0+5Ts)S<w{jZ0_$k1hvTuUZPjyZ1LBkJKG03f`-7lF;yPKFlC*rypdJ)yIB%- zy&^#KN`_}k>$`KT5cV?Vc;t`TGb*g2i~n^FE{ZD<%C6)g9q?k!IDhB05eFji(eX-Z zP0&Cmv?`{yGjvk5ynb)IG=I+_!@D7ffZeK2_WinImxN7XPBHKNK7#dm$&K!`eB~$x zD_m3p4sVVfsXkuYgQ>wRjxrj{h@_5xqR;Jp1q(pa_DSFR`+UislZiIwzrjz~wOrw5 z`jqj>I*B2YcQB8&*v=q#K`mtqJ!$=Y^$FNBOmsTe$gLhAe%LVA*Z}^7tcQXiw{n6+ z=h;Qc4;W&j;GYnD=L~N~lH&W7JWq(%ICRWsQX@cs<td|!<LX3*4bc-Dl+s$$u_46~ zb}6iq%7Q$&ta9t!(#ra*Q&cR^H3iu@aA07VB6#$FvHbi~h49}DU-Ql#&J%DCfX2~= zdg{1U8gFT78CQ20d)f>>x`;-<hE~3bf*lr(ofEB22fL#ru1Y29PAm%Q^MZcId9yjE ztt3gDg?=LFtb?p^A9#nJzPk_~nV9E6&^lCpU7BJbFd(Q4L$sqRN7YpBoCwEG**-fZ zgqL(?09o=rrzp?RO<eE(!lQ6fkW5P`Cue+;RFvm_O|8CYHz&KKGz$&7`wcw<ai|?5 zT^-^w+_;N%jpy)Zk8X&qPq}a}D;*QN&{Q|ojGwCBZ)3oxeL6DiL1OT|hr`-Q|2OI` zq>e6C08GRw2@W=9*1gXlFW`Y1NjtrGAeEP!6#w<ZD;plx2&dw=neLJ6s7?+kmt&DD zB{$pnEwsYk{ZM%L^MC){=4}L2{j?~S9+SCJ4z)M&<dE(ZtGazlpHQ3@_;VuD36)C8 zEInlB-*9cfPfF_MTJev$_MemSJ>f<Qchj2Q3kP3T(6r$ySM=!X-jAz~!1DJG2y(Q# zXh!Ovy{Ew-Lj*1!`SemA@l++wSe3GtX6JYzXPNj%`>9te+E>dng-u<rlD_u-Bv(e7 zhX&L~p|_#*2Vo`0@dRQCIRK9B&FjpAX`s$qqf7J~h7$BSM@B)Dw%v`SXi|QuCJiT@ zi_fpc1F7Y+`@Jrj;SErdipT=yr^Pjz*@-i*ttK&ONP_;HwtGf%HbwQZCJOQBJpI?@ z8RWuehjm<nZFjJ!7~(b!8LMn)Y0u|FW-8rn0tsBb_%awRrWKxy@9&K&myP$F(r$=T z57`dY2{)_?;3@zqIBdf&UVX{v9(0bDSI{jI30_Ldv40V8leb<}TGM^M$aSUXQ(IZ; zw)57{%dm*m37f!gJIVuGHK69E(5SHPqe*-2+>%jj@kv$_+X?Ok|H~Z<Kl$bcQEMJg zNRbb(h*1YDchjA(QZB}bcln7=DC-meO6*#VYpo`R+_nZw#u!THL#wbo@xJoWJ-qM% zt{?j>_4?JFrBN_kg=ldwzXHNM#YSP<*TQJV{Y%A|Uhjs*qfSNq31~p9>79tSWr@!# zr>7&pYE$QwQZiEc+PDP2WV}-JhRPOnzM@gVqFl4yI|SK~;34?UvhF${`eviB5Tdp_ zzklAHF)3kHE^mn|x=bNN=Rz`k;^OLZg{oNB9<ui|pI4PuaV>}|g$*%J2bPELkj*fi zejO5`T0iY(g4PYmIYhT|RKEDAUMh$i-Ia79B~f?nE$D#NNnG*i0SG0ePkRF}O5EoQ z=8Tj*vwf5SpV{OG8v4@qs@^8u?lmJ_2Pog1=?7R?l~TkLCydud_*wv<qIt2E6@y)B z*0FQ@X4hlp3v_pCPppgQuZ_jIvukWN^r<C?q0vS-o54mT?-pGNJrY;Q;w=tGHbmy! zfY&MK;_=Tq@6lYzrqy+sS}#~dF@<lr4PQ@m{~A2Y*-vnk9DvvMU^xJ10&K2rHiQyv zhVEj~V2}0v7bugqqAxcXJ5^eNGTeK7u&!4jo*rIn>vlMi=0D6hR@mz}<a_t8N%?1U z$iM2l<=9Rcqio||#IezKV5t_9l8g#<GteS-rwJwc9%If(JBXBD(3KfZl_W_TjrS4F z4I7kup~~Zh$4fskn~_ZAwy+<V*70MA?pJ#H<mJj)*&Gw0r1=QvcUOjFLAR&*OB;|a zkH=+7t?n?9bi&x4UyoVpBAdDENS>ZtL`Fu&RZnxe!3TqMwW#$9TSMA)e_*2Q9Y-VT z#qbakoHwfK`SdK2Bej5rw6WiD!~%-2o@t7HdHbw|XGrl`_FE*NMSh32qIkK=-3A>O z3gSsb3O#&9gVd}liACMgoy3OV;B<e-t^GQ?V2BR%BZFj;Vu2;7SyeW#2tI?isx^Mx zC%Q(w1|*4l-S>d|G}5NgK}2GOKD_;eMyC{M_}Isw-YPAB;OKHqwN<q`8^CnSS}TW@ z@Jz><Y8uF&Zz8k6K*5tQOJ3D|-STQp&&v&@4i=TC;oW_#G^Cq0TN*o4kQ;2PlB%yc z8FKfOo6GqbozL--MJj9Mw79vOfY@Ex8fQ6z+23()-sbJ|IQON;Z!x8LUz@q<H$*YZ zjov8TEt;LSXZ7sM9~$Wk5iFrwWXgn&)?Axt_jL980)e391&dsb<M}sIfY}?48LNw# zZ}6Nd0BBuX78FdkKwA#uy?b->{X+TJF&WKCLWoA<DDob%JzFC&RfD4_WcgN9K(!i3 z{_udOvVNcC9@)}+@>u?5HHK%=VoOavuf+Z2)L9!NhTl1z^y(QgE}a=)+QyuIyD62r zEyI5KsBk*HXVQ#E4&PFH=OGEl%=+`I@jOM);z;eB1t=IcphDP244mO;duJIV+bR`F zmw75UYe+6h<R3b}KPsg)TaywHuF%wV%W#)(OJa^vq#wl*{=UzgeDQ2NZ(wt4m)(A` zU`@Jh61ZMHD1orUQj#ft3>!YsF5ay$wLgd|2zOW(Qb?}FA4;sKIk7w4Ppswlp5b&t zcwX(~dnPB3iJAFJ8!eX9yvz>Zd%{;8MLPfl|5np`#r!4&-BB$JN||y$*nc(BDlayq zB@G;i9h;VDt_cgS4~6VyJ0*<#(m3%yE-&3b<C>j7<(1lE?e`SChi4XQLX?bE&&NrR z9@fTx6nl%6pYs>~9jD{<8a~UGd69$~sckdTlbd5X@_h-zXRkxvCvO2VCRmx$Gs3a} zy@6+KUl!Lh-)qGy%o##Q$0%i3MN<-k22bk<$u3$ot(-Dw&lnx2d8bzWhd{?kpMJ?~ zOJ_>^I;KUo7k;qUaN1$Q*xcR_5aR9$)3Nx4Mr2cb`cG@>f1f-5g~cETuZ@q`tC;dc z@th`$ZokXJez9SD>#eO4?Jm*a7(KCSJB`3}1<Tqha_>{{*qm~uX88O7ym6a->*dt6 z?zjS(bA}xqm2|qyUf*GgBkl6`wQn8TErDVfOyudh9^0H&(H3*_86jA2^agl4UZ-H} zg7Cd>A!<xS<ggUyJ&RG4_cgn_)tiGo-5n)qRxiQHOuLc~R~CsH5y$$e#$o43H^-AE zaXxa3)20P57fZHNT61)#Y})aD+Bf3dj9ubl-EDPzQ<9Ws(|C8DIEtEa@tW2AgyTp1 zb%Y+n#7*A`JzjET38wcsRqL{pAvH(Uwcq~o%t3@8qeVIuyLUF9pK3j(e@L+>IIxG* z%~~WKygN@2k~yofwei(ah{)o3Vn#UTe6lpJ*CCZZcfvxILy|lVxl{Wo1}KFu!2P9S zmR>jKfTiYTAV@X4QK3giA+1@ax2vHsFa{rd!bJ&MdKF4Az?3-Ager<Hku*R0((w9K zWbD9|b0YGL=X0O&Ho@ETk(#7nDa9k)s(vd{X<XOiB*KepnKOi7p-AAIuM(k@D7>Jc zFsO^X218|Ff}ZdC;w2mWnvt=<$Rp7-x;RG14y~>(_wr(n+yLRHtmo{OfK=aRCa?8f zfgX;|$-gQ(?YNO&uy-3Qs8LcdRXm&yw{!0Q@tUzNc2?$M{I?6#9JdF2i`ye2@(jWs zV^vu6byV^ahY-~sKYZta2d{J}b<k%nwbY(mH0`3lsVwh&26Fv|frs_uKcj|+e*$%d z!GFeksBY;2yYri`6)xI8&y#Oj^5S2RQYwf)`Y%->>@S#{dAq}AOoyb#l&gGPhEc_s zrXSZVlHN7D_^q9QP^_t!r|39EYDukcRqoODGb5vyDZ5Ifr-T>L*C&g1!13^-0*(b> z^Ne*~VdT=tyB{RK<4A39hId|&*`2Cw7}7hAQ-rQM(~B2bI5U!b2_Y`l>i1#`Y8TaM zld{Y>SUWPAⓈi_6`CLMy&S*AD}O??o8|~1}cu2To6}jOx&xR-n#qEBG{*v#??Di zS1kHdx|6D(C6)DsingOqhR#VtoMLLGxL@H)**i9png&pTP@ih6d4)!27e6m+ns9I8 zyo-7!9MO%Ej?DVPUKctgTXO(GwAtaa^;GCogy&gV(E~TPr!8NG)}DX~2C)SF`t;Mp zgxw^zd-OC>-QWw#?B@)oPkbbFY$F=ZV3AdsF=*je9XPBV3mB&8SN_kRovx^qMof%o z8QEE8l@>UZ_s$zIdUk^~;zRdp^JlP70%`c%^(CB&H4m>2N4zO#06jjJI3%hX*G7c( zZWtNm+O89Ba+CJTw?P@%`d>Y%5r!{~))NwuQltT8{vq_>L1*&qT@hR-wwr0&mo_Ay zVV}NvB-6hFgVoClbnUXUOX|k4xh6>|KXwxKGR0_vUgM$u;YiyGG9wn!W~6y<Vxpg! zml$S&^WCERfX>I;b)LkqF@h8EWra+&lW)Aov8Fwf{)US`jp&^tGhmx<yk-7GAg?B> zn-`-uqJXRUdU6{+r8asUhCd=CoVN7w(-?{3Acd+0T8~y3Kf-_uj7Hv)TKE(|hP3Cs z;oW~5EqUKb$QS8&SK-^8+2-W;l}&>omZYS<QlH<x)*3h99B;YkljFo{01gxYTVCn_ zs$^{ETnpAl>#I~pFox?k99#C!fnQ-64sQGOUdAInc7oPE&XMt|wuT^pf~o;>Tnbie zU^nHE_o=*9Zt5=e)A>c}xsTZ%pOdZJo)`jEwR5>#0o!|zdjP!vap(ZoYcJb)Zre8c zSs6)Uz72NsGO-i@U{Y1mO2DP_ARDHKFL2YL&|#hx*47(8j~K%$UD{b3y0-PnF@sVi zXNZ{*Ar4F8p$&r(j!V<$DI0=WhwdX|<*&XTT^rI1iw>m{^_+0W0Zj<&95A&kCOoOe zP9SZ2+@Xv(sh-gW(c?b9Nbl%3HAX_)Pr3H0<=%~`O+sH#h`Criz3DT~>PZ~*19&^u zcCN<<tupDXZ3sHHB&X)=)%*4}e)1zxtsbGl_F(20_6O$-Ik?X6=YT4=$c3%+Fe;4m zm;DIQtr(xKGJiRJ!-`quL)m(aDx@NbYGyEkto=FyYV}wupKQ1sN$hCm8ZfLz;5rbH zcRu8xH@^!Z?~RZ#q{XS9Whz0q&MW!Aq@3nI^5W3mqcB^q9^i77!8HpIAJ5~2a}cTV zyBE=~8+ua==pw6l4u58T1`C*L=^@lDS1d249LAaRGJg}_J@}mS;exv|S=}_JwA^^x z26j(NuPsSR|IsXd?Q>#_j}LIKC3@fT?Is2&&eLEBs|Q4Jy>&F^f5*AEm+5{HepFUc z>%}=%O&B1fewPaOjAnpev`Hei`~J|up!Z@Ri@?3`TF`o2_9z9s9v*6&z3MPt&7Guw zt&*{<bkQ3hm?U)!d%?jK<+MAi-e;BST0m%NVfiaEDQ#`Ex&rI=EK>cy<cq)XdfCO# zU<*ZDuck_4PTIr?jJN0lB+d00E=TSANgJGNew=;dh;~2=QqMvkCc!>?lYILf2a_Z6 zBZ<;bwf;(mxpGH&>RV!+j}z^-)c(Y@QtgF%ihjK^RoWLO@HTqG?ks3fRHkR)l{#7Q zHCAcAG}=S2H%*VS=T^jl4+~zra5;x81Z~k`6EE4Bhzd$+BXcu8#t&cDm+<+@aV#ZP zy~SEz;uQ?P`I@}E_NnttqkrO!aOuh%TRr4S(y}2#mwU_m){@giNzZseQeFj}Q5V^d z2Ut}AZoRh+s$ww+RW;(R;?jJF2Sps;LL;V5|Cs{try9(^Z2p<WpFIYM>&PuRu_wZI z_pnZ_jp(t#UA{n(o|jlR>PzekA!mki%$POUyLaO{F)?X(2WRj)f01l%N1s--==8j- zTEPcR8ScF;>N+*1tw@7D2s%lp*z;8n2fM5<XrZ*RLQ|<#UffB&-XHJbI}sR1yE0}M z$(^3c?F+g?HQyr($EclhxsvZNt2A0CadAC4acOAj?Na+0KxL%36-o2srZZ~%oWZi$ zjwA7|k_fpDzdU|%FF`4LM&*cI9ijg8*2Yd|=4%Y(;zw4$3%loav!-fSHbx$idTf#e zH0_1MxM#Q^2MTPU8@YOq_x)qk5bxN)?Vy_1lFJIZSH{ShR3LK9lpFAHM_onv7a+_! z8w!>By8b-!cxAhyZ^zgyAmgEJyTCBN5b=7&H<Ctj!Om8ThLDK#{0zTQDTS{LxTvPf zAwRK~{(|81UyLnU9L*oF)?S^7*Rcbtl}iME9)J`MSmsDse)bnKT1d}aq~rIYZw+Pd zXw261oow#cS6Lth=_*?6ZzPT4h9)O8v~+&Eq*Edy6201R9(pY=UQgo|cTe-pQ0(as zq5G3K!4kxJSM|h;*|nbwoZOdE9*5{_ju{p@xk28DY)#5q6@_)-McJN`4b7dg(yn=S ztUi@s`OP(Ijj5*AX+fKB<%%PDksn@d;iblY;W$^sB~E)#c`+9BG8EaCh7I5UTrIkz zGK6Py*`?=S7<iocXsq#2&p#4ka~&$prZ0+rg^*fs72;O*<s$3Qj9685lM<KK$cj z_}_n+1bRoRRfyT9$2*A9M~+D~V#+SOgpmiX{8$~R-*H+&%$I+ORp4%{{%{CcNM3jr zyCC@rv-O8E`3#1Hq5<1Mm!`i?4A2nYXDsA6vNk;U#v_LB!mZ=MZWC&6pDD<>R_B0l zUf)zu`?`Oye_A5w9H~d=Y4mn;$iYy7uT1{E_h<oE5tfDi{cqP@Nz^dh1$K0uwB4so z^oS5WeUxOWBjGFWI-DtVM;eL<erc6{n?@?S-ztH4h8_95T~waErVgo}+!B~*Dc@lo z9UIrK^e4}c$jDWS&yZQCL0xmFlN3C}uzlC<`k*gFb6HkW2BJ%`uQpU6Y{1thH&t|v zn=S)M2J`J2&r8S9SCSO~Cfigp3D${Xzj<{_N_q`a)_h)ab*oMvM^*tkh@N^30oOfU z`8L+pSicl`*;fs?p%akaHR))@F8pTERbr+9FRv>wExMFgp@7NCc(PNzmBxVxD34X4 z!jUBKh-RwHV>)03VP-ISH(#r{)z-F^b_&!MZ0cHtqC*f5kYmf<4>k3{T<wWxM0oR= zOjuUOd{71h7c7eEy|;b3NFF(gQfEs$2k$-yGuF|g*Yf}Jj#m#ot~&P?N}+pqo@h}D zEvM)NM1=M2s35N0Uyb3bvbGG9tp9@OX6Qt5W>+~~0S?g1X6+3c$(lu^q|QG=vBQv( zQ+q1hQSjiM6O4vV-=vW`l+jsArmNt1WzKM`6gW-S_1h@_eaZWpnR1eeEQW4X_m0=y z1-o)W?eG`&f5e_EzucSf20YE!5Mp;15Zz!}#G62gYWG@!ou`0?fdHx7rZNb^<FiM0 zc<x*M_LzUh>Hp>b{1YAUVT7h#12Lj%px}%PPBqP*bUdW0F=#E}eP6e*Ss<lK3j5*% zfTE_Z#Yxcu4bHZ(Pg4UNw$slrO=jAMzCiSJHtZHze|?tEHU-$S-$M$1Em#A)Lq#%Z zI%#5O@nzN}<u~NQ-+Pl)FC(Yw=Tx7ves0sLUPMlTsJ4MR2FSsLVl=u(QV)TeMPa4K zFz;w4JS;!r?4YlD8?!lQ2)Ewze6@r<?XPSUL_A|kTysTf0bVkrFiJg7IM<;qJA>bb zXwtNRv@!_dz!3np>{w6pZ24Q9;>KRnV-Xzj=+|9zC-LhV6_?uve)PRVCIk^2RYrrs z+MglYJ1FMrDwbu+=((Yh>Ah)Jxyi-a$~cP|1#nord&TJ*c-7BvV2wr`AFtppd-%<g z;@IfqS~j}D7Z=iwDxVlvkHJ^dM@2my@&gcym+R=(%{o$gPjTx5w&3<G9s=kwMU#t6 zCFgDZ@DaGpR3u#Khr7Ca3iryFi8VDRc66dxl)NE%eB~xut&MA};h^EVSX0+N0=8_N z11|ydU*`G5RNa+85LtZ0v0RyBZH%kf8O&<g7K_CO(8R=(dy6WDT31H+IowQe0bT7f z0OIP{36Y@dEE0}6j(5D?p21G(KmC_{iVbmpUbFqb)ac0=|4)108P(*Mej7x^28amK zEr4_Z=~YFFfCOm)5_*TwTOfcUDxJ_l=`EB1L3&3KB^2p|n$TMU0i;UPoBN-cyMC^j z|E&3Pzs-lN_2#T(t>k^rbIx;~y`R0M2h5cKQ4lxS^)XU$v298SPQX=HM85NIKED36 z%x9C_=XEMcABaBrq!4H*B*o6^$TZw-;gx~80k271UC($m_-+Src~O2y`xMBs-8K!e zS0{HZ_`l-pKQ?&;XXU25IsEv4J2hUEY6`Hozzgx|6uF6)3wvEI%x3b|-n|}(*Js4C zcrF*zUNB2<RwgT($>qn<MK3m-ELOBNvD9i`50rqwY(stntdo;c{qi|8>bo=G?7snK zfyZ9uJ5l%jlNod)e*<nPVmmta`NYa97fbj?%(VgxY0t6cm5+kqB&3^<?8_sKHK!6A z!4xT)h2m7v3~rz+xsAawx95Kp76z5ctj$}v7uquSE}88NrFx2I&}#fNo~1edLO{Ye z60Y!H;-5pq?2WZv41!kx+LF(tKX>c8ds{|)Q%YL4<$+F}_&Sc+cj&$gRCes1lp?=} zQ-A0PO)YJ3=z3Gbep5n10V%;9xc!E!9V47P$<8u1N2~ZuVdBaY$36ka5&d!m;zMR- zOnF*9RhkljnFyo;&JXejG4`NP{%(m9gYEii;X~q{RZMDwSvrHaVA=j=<Cg97`ENRu zB4Je;2el`N<j|atqnuiDlVr9jlKIO&_|gB#`VxCmGu3L^a40#*n5f(j>>D7?wZG{l z=u$vQ>N$Jp=+Ro%68FaI6F6I2`uFmU&o-$Pvkf1kyrNk#mig*uKu^!HSrwiN>*@^= zL$b<~%k*&!gW$u@zxo|;80$3?5yPGar<f-OC}FP|)YMp$p}(NTXY0T|%0Y%!PyQds zE5k87ent6{-n!~4>eCj=D&af&;B|SWc?R<j=$$72*r%sG&mCB+w^)D(lxp08GN(W1 zS|gkaz9SN}e`{=JejTJPnD<TZg{J9c8yB9&zTQx(bRi!67yJ=x%nCM(QQM8o8C9Dp z#~ID>gMqYV)6c@2F5CT68uG`X`OhMq^;&pv*Z+Kh>U-i-I)@ZcO)IX9##bgb2d;6f z4@;*etI$(AZYJU85i2q6-_X{rcMv%h(^>^!>%iv?*#7bBk5TD0LWh^vV?i$%9LV;8 z{M1@n#ZG0rDoFH;VMEW;1#q~Ws{NS4C5|sud0AQLTY3hMyRH2?7UOgK-1pzi<QH8x zVR3G?8E@_XWWxT;$#JreYn)1z5BK>=JlczltbXoz4G^)QDHz(^r+v$P{GpabbrEU{ zh%b++%O6BorYcmN4-Nukeb_DUs83Tfa-yzBbbLxVmYuGC|C6}#uFs2O{N;A=RaIGw zlT4-8Jeq9F8b}`7Hcicq!IJdc4?X()gT9E8{zodUY0zP>U*9@>>?*A*SkydfmJTY& zn}10b+GqwN^H~A`U2qhZVPY4HN9;$tq9<o0(~YzWgbhY(AF6h?Ch9(C8yCe-vXd0^ zH={!?CuKbIlYez0J?qQw6q^zE%6dn`1S1`Hb;2Yt5m7V}EFzm+=57AwFg#NQ9$EBa z!l8JM)Pd3(F2`gxuE#Uez*<(apY)7W8Uyb=+<B36G?U<h!52Xr2RtTe9^BZuxm}T+ zzuKwQIlTu3j{8hG8toMpqyxK4t*i9YZ61afpf_S|IN%p|{RbNH@dVI5uixT))>*E% z%Nrvj+-+#>P^9b>%M0b32%ft?>IWCxS8tfW?bp<G{6Th1G8P^j8YYY_a6{FFREgfA z<b~6>i9<quvt)0{$q70-rN28+2!68n)i&93EeZn?SZzY3)O+>Z1A!tVh|`AGvuhlm zM7o&^zid}G9?u-ztfy{7W<}<)y%#nR(~}vZPx$#g2s}pxd>N*Ik<l|7$`LoDhUgPX z0!Sy~g}e{DRkP{>D}mM092U5J5ALrtZrUH5W$e`CwSU(Bie@Cao~0`kPA7O;p`}g( z4HmVaQ1RJnd*Dort4b3IF)tPdGZ=DnZ7Lo;Y*2@~FcvmF=$lw$qv%y%$9}D6!l1i7 zaX=Q5<Xw(V(@n5sQ$2@_p0RU~^H7bAZ%~PcAeGF0#a8)s$_2(|PoJ#jY%dt4rlw=i zfjtX9bH@4TnD=ZgZ+C+q%BBRXOYdDdi<{T>IxIx<qps=^gse*9M?w1MXk@0?dvNq| z!_OX2G@iH5)s{y6co2FcMAJ7m(^Y=G5ZwfNy-?cX{ITJhpsu0jS~qYeF?lq3?4+F8 zYM2!Y9h=V9&KEjfNJFO}aa)bw=<^@k)~DpT#(lI4myJFY+H&7^Awp~1hY12n*PpP4 zLA@*9w`qi!hF$EO0aeDh>FlX|jnniPTSm691=Qy6JL^tLIqOa@3;mc%56IS*n_#;f z+wHNnw|_|M887J~RwgJ#W$YquC8e%0QGkwa&>InJX?%@0+Z{YcsKI;+AqgYNd}XEr zazF6xPA3PcAEfRV_rD#J4U^O&j~Lh6b{^sbOd{k;Khq$m6>f7IRAP@4){F=&C;m1f z9jw}B4mh^e4Er4SE%q~|!CU2GCE|E%q2nlRaz3i@`R81DL7;Yk`km|JfM;Etib!mJ zuA>vbBNT1eo3uNk=ga-2?4$ZPcRw}8Z0nKxp?XfMbLiOYR?>0Waz3xQ2Qp5PWdt~` zF-+s}eeT(o!i2yB;Y1^+K3U-pL$!XhH3P9ruC&)jIyAeddZrD{S@)|`ZUu19v>Wdz z9=W6?<i}Tt=!;a6&fC})6?d(Ve^)~4rTVsT$jX_`K9JI4aBqY_i{AGMxdh@1gp<GC zvV7|$?W6E5hhy{2Ro1$n0&JZ3el%0`6M7trMdXjx7J@Vo6+B){SSLCykEWl~I4Hx> z-3+Db7->E=uT|lg?2lnRe<@s7Ts;hFJ7Wq=^YSKSQNDyR7+mf}$ZygBeD)cZEvDLd zf69Ftd*tBl@M(ITFwd~B_jp_`v$5BRl587*csn<DXw%iZv*8PgiGh#KN|@U<>p>U` zTJm|n?*w)-m8tN2kJ;+0$to$2s2|f()-juGk#}`c;FIXpC!D;D&&{<-95;93ZJb$= z;!t+?3Na=0HieL*O)F)=TFubZddkHOJy(Ji|6x~^+fN;8Or<7K1P~9oyhMDw1@RGd z;g2zup0$?&Z-r=^+v|K9{Jy=PruBbEyj*{B?SHb(TIuTwzvNEic%E+X-Krr(?aAe0 zbZI10dwYU0rP?gNr4{@hhENZ2DU}c%s%e^;<{lKw7_2HO1e#@fY{j-!UHGA{X|2eo z3Sm-K**pH*{$||-dp`5X2Afu|gH3(@%Yl~weqtjMW+Q!D{q{cA=2@GBub|a*MD-M> z*IhE;89E_v0bn+~r4Hb5K7RDj#cqT^Dyq?PuF~W}7pG?VFK>D5Ui1IRs2fF_Zh87C zW#z%k-f4)>`_p7$zGa!xOboe7meCccudg?(M2sw%yy?vBoggidkLM0j<K(usjhH7( z-Ju=3IEQb(TtJn2uc3z~`2<!H`aIol{`iKl=Fv5JhI#%<WSv|lpRe~XsgOjOwv6iO zUu_jL!;MODJjU>H9cHy{nR^&uB=UBdExB(o)=A~Lg)A1fo?e17Q$>1%p~wxl5Xqf; z0!kMDG8?71*3g1%Xm6FMHiV>8a=#1B>?6a376VB^uTF(53SwDV^<Fmg(yUCI9T7_A z=nTG4{bY<SJydu!iKuM!bbT>TwA^*dST4vM*LZ~vlk0crM_9_0bClNHyH~*9JNBk* z#NB*Sy^QnzxPAwNNsPVNJXLZ0r{!~0Ezfq#2dY@<i&jPlMyCvo^ky97d`CLh(j)k$ zwoMj(1Ei!lpZx}4@mRHGUO(+Rh~V*!Zl9cDujK}_!XK3@G<1!@);MX1Id`(Ws;FKD z{fe3T7KEY60KY%6FUj^=sg7GoM?2l0r`37OY%xeQCMHBu{9=s-xjFEY&MkGRf2NZB z)yDWQj>dn#>^MwUep)J?u`fbK*PRPuvu;r$>=4MJVfkN&<#v}IbDp>1*aq?MIWF+_ zBw<IBvmJMIbfcb!FEJ*JU!$9$vzJ5G)(db{ZMf)v8?C?W_574gJaLcf<kLRZN@`lU zj<sMcE#m#r9hl&|%=Q_NbrTqS^1?QKc2ew6RPCVx5f9Z3MKX`Lt}DgUF?fUvtjx~Z zS32=JS^8cIFc}0=cmW?PZs}~5vYc7tSvw{c*hb=>5U-@Z{x(1v_0I1%K;RR2rWq90 z<mJ6mP=8}M%U6G-s!-&qjfL0KP?}3UCq{LBMA;avoDzQGjJY6JJLdqFaq;BRNiUyi zVT_SsK1=*0R~iwXe%=Oob8I_2>h6DD0{wsbo%aBLWZ=|Voo1Pd1{>dk(iBt_c<DYM za|@u?up~DfG7oQgf?a|C7U|Q)faV6+6>0mt$leQ%E8!+)&(FwoziNj8?MG6=Elpa2 z*R>H-jE~rHeN<O>zwxO&F1tB&(4G-u_N1?Owm0h(o@^$?`(<&x6A4)>cbon4jl(w1 zqS{0sYS<Pz1{@zhtimYlr@q0w@?P#~6A)tH9!4b43o__vb`e8Y*>a1dUuB<P<aoI) z+Lt#E)pZ5E|Kvm@2=MXkZB%u*=NILYoSH$EXliHMKCXQkcDb;kB28@7NWOS^B*`?W zdZL7Y+5|dQWZk#ufBgBu-X0*}wNhaEXMU7UYi*NTbCFW*j+B7G=;BLPGAm~+z<Ygk zB_(4X=C_XwQrj?89hb$QU(Q?gF8m?sX<vYF4ih@>L&&giC9hHiCEk*y*%~AGNfV-~ zXf1;%MVGD6h51$>_;M%kGR9pm@yp!?&>2I`C>##H649n<(8SS?XdUeo;q)LwF!Fs} z?UtQSIEQo2jd=y$r>Brm&BWE!cjO8LLd3uS1_*z)HDF{(UREftug(?loguyZ;0&xC zV!7&m=hJ%Mg%i$vXWRHef1Vq+q-d$#JHp!m-b900TR#Ileyg|;H8OUYk0jOuKKZ8U zK@ZrvWB*{^x)5%|Xa4c@2I)6|_E4wHr$4{2#biFFzi2foNeZxpVOCHlw?*Uem(IUC z6zr+oCw7)u_eH{*!7zok&BRUhc)JGFcEzP#tIVTe4SWP?4L|HcO2$RH3=X|;k`-d` ztW*koU%aWmAO*P04%qen<v}piaw%LHXYquxSA#%c{N48Qy4KeGAkN~uj%WA<_~=xm zsc?QhONUjE^6Ls8?7IPHON7_a#3a+2DA}2jT}{}Z!fu+<eq#@-K%8vcH7~Z0%|r*% z)oAu%E97Gwj@f*unLk5FvX$vOux3qA`8G^VA8E#59>4092Cf-zltYuGlUNMjvLi>P z+Sr4<Lh5$?-Zi-R%vA1X93j{=Rb>|e7Hk2{vI&uqv$Rozx+>@W2e?E-qfcJL^Ll~F z{2GIirmAp#-a#$BNW*azXq#}sy?b4@|EP>zp;kxMY*y5E+m0SM!HLFT2p0ognE0E) z*dT}Uo^5Z^MRaM(e!=?shR>E)0d0uq3iIVI51M|FAST7inSy(Q4BHKX`Ys@TQyUWy z6;({EWXnym{t8K1f4I4_#pJd*u_o-gAv|g<H8NtLdd3==pw{=`v5ov3hb}x@aPd<Q zPtFd$d;u$OV03RN;0Y|p_9nJc%{w8q{FmId8|TI;>EAq^lK%-yq5#|$N48D~rlrhs zliP-!LaNe0aX+0n$s4@I;c?_3>$eWqcT;vTT~nFqC5;2@&(ct{ZcU0zb5PX)Rb@7o zg^O@&Y!<4mj+I^`y|4%l*?Q?|LT~8SbTDIJC1TWb)0DS=4_4H_ifmW+N}sPf7(VG5 zuVJ|lRYi`byQ!$DJ*cVfX7>rL5sw%DC@nKex^Z#Ooy*4hPGSOpUu}CH)0R2zsa0^8 zrlIx7zsN5pp=+lL#hyVozQ#ri)H^-%DEGd&K_GRs>bQy>C>3VE&^4Row%rLaA_P$E zos-fQ`&<m;3>M<#Jp80o>UQ8#J1RFFG<<^q4Jy?i(qrBjN56m=9a-^oo_~C?_4|XB z_7$GgJJH_g_D(-PB_nuL8oq2qLmgi}OKxUe&vWz8N>wVP$&|6=M?;en9Le=#-c55Y zr-}eMF8tnoE%I_{a;*fJnV@>GoFF<$!x5)+qGKJ#ju{V>Zc224t-sJ2aIGl2d4QTA z-v6+-lkhlZ(@Vx5DC=*`PL;!_d9zZR-ab^dHP*q4V<c`aAY8zrW85eb<}?5g&?89V zIQXneywX;B1I;GdXy?BkE34c|`Adnw&k!P1FIk%^5XeAn*{l3RV(vCbsW!82F!Zz! zC|=G~5zC&bY1Qs3_mN6_#jwWAmZ{gN@khZyN~;wKh<_wKG^Dy70nqzkLJ9Vo@mkpp zSih8Q=)r6ogQ%D;b#Z^Nd>`>K^|mp<o8x#AdIbl$xH?LV(wcSKLPus+TP<tK=T`}y z9rEp-WVNj37>UwlOJy>vzhw0wfX=S@=$CuX+P2+)Vm10wY7!zGizN5KKk#??F-j%# z<^=9zXi!q0Z|`$K>zCH#5IA>F>WT)BZyDv<5!jt|g(ItV*54_pY_@N-nrP>xZ(x>N zoJv2`y-c4it!RBZvua=((Qo<sn=0a7y2+|TtzFuPsYF{-DV@_|ei*6*8)Y~#R{!(l zvQ<=1XdW2Fi?S>97EX|C9Q@S!HhS(P3TsOLPsOPGQAxPV6YJ6{>{krN0Jw%5ujec# zjNnavjULFxNEDYkGw8I&7L)|~1-L(>%EgpfoUG@To*&0alRyi&f>v{9S6iE$gXEjT zDYu%3H()5TsT5C^iz<f}lDG9l@L=Q96Yccn>hF%2_rpnk+cq33jrE*w6h416Sx#40 ze&GA-XZ4*Mh|I74<X(W?!*Uf^wW;$hW+5rmWk-~yFInkpE~K$jOsI2?+iBa;19$wP zV8Pv}jI-9LcBHwb5VHDC?zBS{N04cZ$y(JmWmS8{Cy(Hm=Mi`+co-Jr-FLU#6pBug zjNAu05Y;yweV?+gcf`U9-iakn6wiBsJrk?oiukPQ8&ys}I##ZG!WHDmQtb3_sVdNA zPIn=)6tw@BGf)tPDfi2`yac!H_-_*}_WfTVM*zcjV~D?6$Ny!1{+r7SG)R;W10t_V z=ALuBSQ@9u1?17rlYxS{0HO?WUBBk=N_t=atxl&U5}!3E+bQ0^>FgO%!Aa9#SkF*T z5m9xq_hwAT#E&?o&r%&~;5*Yrz0f)gYw<Gl?fc$056Ogjy-}3&;RQB3^ZQsFeZqS6 z89LnsO!q?^tD&7U^enuQLY2(2Yb6VcX6D&hMh8#TTVnd_SiT%wnQ`!4$t0JZx9Amh zHrZ%5jPppwChYQc(PmhtllYH1ASA<J$UVN!$A9Ed|Ef6tj}QD6cfLc#<t?q4tfs=P za$YF%$TvhC>Axgo5zVp1bx!@!DeBv@!IP(8Bd9~(`>($ozE_5M$_<O*f*fe||AA35 zayOo=)}B1ln2Pa7St0|o=Nuu+eZnx+k3JqmS(;YRRr|$sTQ?mX(|T!nwT?*2HyE@8 zce-b}>_>I}SS(o8BRRw`LqTSjTRi(}p2Tyz8_C){vhlieQ;iKo6oEHaf}vKlgJ~<U zf|_zxK*d9-vn_5~h{u>_+FU3VvS;v;pXkQoD8AXwy&SwNO|!U8h|h?jY=)c1nC^`- zNWiXW6isECF6@a6;+WYvJHnT#i6cDE+2Ut2C~#sAILOCxjJA1yA>KT0=hC7BGB-f$ zDFv68Oy8Yzb2zf1bH-|p0fWa;D1SaOtYD$e3yEyfJ!Cm^9+B+CdW*dGf1)6>1FF{` zdw^359wP*#QyTQYu?rEm*t<jQJ0=gj`=PWzV4zfC;Mayl9%)_ScffN?)9X>SX4|?` zn_`-j0avJ$%p5Zl{L^;S%r-L4iN?z4+Kt%O8WA9BPWA2DtQRToMvKEJ<@}zAPp2 zVhvE;qiHh-Fh5-H>!mSPT2m{5egh|=or$K@DEnk~2KKhhnwp!H9rQ0lrQfqqwcLcy zzGRlLE5ysjd>;vj@hd8Z8go}=CYzSIYvYV3tRGm1QczM-mdJdL)32v6Fw}X*OXU0k z6Zft93hsU=wsaeX$<!MpxG1=m{Fu_zS9&=#K*Gsnf8X5w?iolNuD#+HzH3)A-C_1+ zm;POTRAH`xDNj(jQ&S98t^AeAy_r1OS$$As+VLV+ZTokM=!ep&YHZ4KNfwJeUa@A4 zn~+sa2fT2e%gQ9uIcZNs2G?&ZZ<*V_)r~1j+)DOR*+H;`a>!44RPIv0`7$@(mw$ob zWQLB;p6gGL{Ce;lc#e!c^M+rV|0>x74dN?8H=Vc$+}0G5_yR^jgitf%-$0o9hgU*j z&sMLCZ0ueO9_rfzvEo%H);0SPv#nUP_@e_5gaq<)WT%b784r<)Q<FSXQg(vpd#;+u zFWx}qU2@6^5>mGO(e-7#=8)X(3En*H=qq%&s+A+YkNH+S*BZHF7g2HNvT~v165F|z z*CR~qxCW-zhL>=-d=z|=h|V0T{SAP-^Ow$%mj-G*^<C4cRUU7W&&W`o?;s+5(e~pH z&T@1D*zJ~!l%D#X+-9BdNp68m`fFtgpvuK=_Z6XlChzu+CiXY&orgr$NA@321|Wh` zL{+J;THev$e{i_!u%@m0PEhv1p8N0kM^?E>HhtWfsW1KH1d+CF+L^Q{MhrP|$N>); za}?F_p|YZbp7Ghao$!Ue;xfUp;kq;TQGHl;A}M0(BE+UYrzG#3ly9GyL`4AeWR2G? z8g$n(anQocT8)wT<ToJVRY66*wk`Hx+tCGH?p?Zqp^Z%jyPfKjB!bw?P{b|M$On99 zJa)CiRuX*yPbcP{FrVjmD~vt2k-poU&Qq||x`v-WOCiUBRob#k7LOv!osFFpby2R| zubyGStZ@M+Nfq-&LHvHfgJIxqq+OlzWHT8pmG}aa%E#gS-@Imb4>Fz1eD~eK3gs^c z2DR1^2C-xKN4f))8J3l`fssJ5T2lT<q!Xc(Q16=3SgAv2#Mu4^f^l2yDTA_bQI=$z z3=8-`+D4k=?e*gFG>FzDkevJ)(Tc*v-2t9KLB!Tuy#l!NVAhCo!!pTfchXe#b0X($ zH_fhNr8!lWfT(~j>8-=$m%)p-v`uArefnxgA7*8V(IzwR`s~5gHx0C9KkIe&UIm$S z3%E>dR^(64TG3<X7fpxKt4(|rM||!T)|iq~*S!s)3Q&GNGW@5f>dD5SQKu#0tu^&e z`<9UpXkv}sd2>Xc0G1`o>#k^CUpXP3Mt#p`?i@B$>sEaTa$3XIXVKPy*ROuiw#!OT z!bxhtLu9mzIDAkN_UF@jW>F=@d&$^Z#>pkX*mIHNSCHVXU#{Co4gMCOTJl2ba6ziZ z(8-nKBM{~FRN2cuj+>%=Wy5JvDg>r7*}OCM9+Zs977If0G1%jE@5*jj3>{dNpH2tT z98{tEMN}tJlk5<@_V@bQAGiEZ(CE*<ravBKz`Z%HP}n50hPo%{$Eon^Rluhi1KybX zuQ?>LdWdI2I)XK$z_J2Yld15F?z1~#A1uFKcUMXodCE?Hjvq3<2WXm&tWxD(k#_A2 zeHn^<sPk2`r09qw)^(f^(7L(Y@2}Q<EX{A`6{?;7s-RwAqh96L1(3j17LU~q%V^=T z+5vZK7Ihu~t?a2Wu-~ysOB+pafKELZ4b#|`Kh3{$TW1s8cJ->D>w}w|b-=H(?mqYP z>eHK@9Jz9**KOI#guLAw(T-bGnUls>V6b~6_mH9s43z?`=Rjm@q1J4r{}gik3y<ON zXSz1q5AjMz_=GX>#NP2nioLhN4}pL!Zs>{X$*_|Ku~(?{xnaA(wN|o;Pq<9gjbX^0 zYdk^&IZGBx*8rZ)+>9k((b!x3>gfV9fo5svSZ3aHNoQmnwGWg8>gpP*z3&k-RBgh| zi1~)OZ0<MN##XeL7QY`?f8to+T@ZFHR?wew7UQ=U{cA$1+Qf}9DRQ-T$^q=;RFbup zGx}V#3v*e<3$Y**n2Y$a%Dyf&+^kub#sNoV^5nUUJ_LQrD&N)v*uwNuZ_5zjrFg9- z1S(?e$l@H2)P*wnhQmvp3d<qazc$v(2)Jw7yZpKo1I!ZbYpMpphJ@1AHfPZIOG8Zp zZ_;g5cd=VEOEa5N;4c27HNMiUapjKJA;XH{lnD>1hG1Sawv`Xk*$eFBYwH}CH6c^W z`_-!Uan-#$6#iYVW*ao~i3H;qAvr$2NiF&;2<y`)@yq>+1O<&fvl7d-A?**Wruh9I z3PWEkKN60lk-pOeH-Cig@OqOGZp!l68egNa=6MozV4ov#2NE}|_E;h4F~%hN#$zsv z#bRaS2y*wyznR?>#Zt4j)3Bj>jVu0SUcnOP=dLl3D<L~qD1d_M&TUCq*uKJq;*d+- z)|3x7a2#qVi~8nWr>>Cj8^HRMr!e?p=;!B8GSjzThQB;1lzW@1!r|u!M3wla9iVA* zBJ`+$NFOjsqA-2@Vx2?<IG`)FC6J3KaB<4au`b^wrv%*wdV1l@TMd6@k=V?>TPcI% zl*=5hZ{Nf%xYzv#P&M-v`${?Fj>r}+5TGa?ALY>npaY>dLcVNGbT%<tF`zjVtAfa) zq}8Nf&M6~7T{XyNo7L286_=kfuZn;IXPh*;x$yV|$b_<rNaa835PwTUg=I0L7<IuU z4~bn#DW>;}!K>CeipP7(=kMZL)k|s>E6dBVUNYF{nM3dKcqXbG4x}aIc4QPcLplsf z&HNkCs?@#g8jvwR{;O5fY-k8%!q2MyM3ZZ{dCfZFUBBYCiM4n>h&dDN>8iV`;9LKB zNYp*U!z&5~+mbTB98m36sdYcNO<y4o?RjjBOuDqt@$#*GKTtn<Yg0$erNIfuZt5MW zS$lpAbwBP9`&?w<Q5Q${ubZf92xm3ektF*3h*kTlHFU}2f$znKo=sBsSKs@G6h*v= zM8vzPj)U;hTawWw3xU(=Aj!IZbRLq9@eA1t?w=`q|8{o#D|v>$EsoHj(|QnYscs}j zhTB%ryibss#IlIUl*i8o9*=dVIONznikDk^Qi&lhs(-#67~DpVN{2-fifA42rgcYN zJZR_R0xyP6Wh4bNm|cnIuw{^*KzIkpHAw827rxONRmCjTX@u?sE7&(MWV)E)#~g!< zhz_oK>N!+PNpaQP)^Ns7Hnk!8jK%MAC!Z&F$HxpK9Gxq7THj?Kpu)Q%`e3?7FUwwU z*&s@Xdu{V7b*{+XPfWd~DbQ~&Fc6RtxP;1};@R0~t4}FRPg$AiFOOQVM7~36m@L<n zDy#TC`*W`Rd!FLoO2(Bap^*`69PnV+P||@7vapi;ZNPo^94=ORmn=t>o;B4JIdzpL zy9||;{2hAfHQ5UV&|pI=GN2RpOf!FZC^;`5UEJo^;#T`Yuj}yjz#@I)>#W1OJV%k0 z>Xx|3(sW^ZB8zk;?N3?WYngAe+=Lr`=_`KF5U?#hu&`Nbi*mQ4F;^wXRIhw?$Lyj? zwHn8o%o&3^3yXJCeQUL8VCIsK*%hAAHZ>iy05FCIm`m~V@gF#-#A4l<w*>k%a}dN{ z!>;2zb7oky<T)$1;^yygn6SSiVb$xl_%;6++)%1GhaQ<G-8RUSRav(lWNjpVmS^cw zbN%P0fv$~~^yXI;^o6V}w?{gwT}E}UfP{5tUoh)8{HQZkO;K^9B5)#W=TPnetSzwJ zHoRrmV5?>Kd#qe$OPymTE3(GrcGsDZWnpd@SBf4cI>8fuc$g40jCP13sta(EUw6Wz z2>*Ev|6e>j>bqZKX{Sm}oT%0_g#`F-FKi$*=!Yg86u^PMRx3uUNRg9}2RH&T;9XE< z=&tw^tlpy@(Zm(E{9mp96TGD*%YOVu1gpi{MZ#p8hpx)@!O**7ngo&X$gfF%W()rk zxccAY=#TKbu;?yDq52yTul07+!q+M%uK!mf*$=bA=CLu+yJg%Sn~wk9&0s2KDL#nl znb`JZ6U%700VktRzWhrgbxz?Wi{<qgorSV%@Aj!_-2v7m3cmrFpgaJ;f!YB;G5Bw` zfq(r2|E4nqpqaa<Z6f@B5y5zAA*S4ciQ3^ag>j&3#q`6#hgnjFqz{VBkIm_fPX9ad a-@EbOneg8z_-_>a|BM3vynB?tC;tz%G+s&o literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js index eea98d132a13..79dd291f09a2 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js +++ b/superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js @@ -18,6 +18,8 @@ */ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from './transformProps'; +import exampleUsa from './images/exampleUsa.jpg'; +import exampleGermany from './images/exampleGermany.jpg'; import thumbnail from './images/thumbnail.png'; import controlPanel from './controlPanel'; @@ -25,8 +27,9 @@ const metadata = new ChartMetadata({ category: t('Map'), credits: ['https://bl.ocks.org/john-guerra'], description: t( - "Visualizes how a single metric varies across a country's principal subdivisions (states, provinces, etc) on a chloropleth map. Each subdivision's value is elevated when you hover over the corresponding geographic boundary.", + "Visualizes how a single metric varies across a country's principal subdivisions (states, provinces, etc) on a choropleth map. Each subdivision's value is elevated when you hover over the corresponding geographic boundary.", ), + exampleGallery: [{ url: exampleUsa }, { url: exampleGermany }], name: t('Country Map'), tags: [ t('2D'), diff --git a/superset-frontend/plugins/legacy-plugin-chart-event-flow/src/images/example.jpg b/superset-frontend/plugins/legacy-plugin-chart-event-flow/src/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e2cfb02229a40f8cf81694b74ee4de1158625857 GIT binary patch literal 85099 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 J69dEln*ixU$$kI; literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts b/superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts index fdf6fcf774f8..824f8f3dbacd 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts @@ -18,6 +18,7 @@ */ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import thumbnail from './images/thumbnail.png'; +import example from './images/example.jpg'; import controlPanel from './controlPanel'; const metadata = new ChartMetadata({ @@ -26,6 +27,7 @@ const metadata = new ChartMetadata({ description: t( 'Compares the lengths of time different activities take in a shared timeline view.', ), + exampleGallery: [{ url: example }], name: t('Event Flow'), tags: [t('Legacy'), t('Progressive')], thumbnail, diff --git a/superset-frontend/plugins/legacy-plugin-chart-event-flow/src/types/external.d.ts b/superset-frontend/plugins/legacy-plugin-chart-event-flow/src/types/external.d.ts index c7f1aac5b2d2..a9b451b3153f 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-event-flow/src/types/external.d.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-event-flow/src/types/external.d.ts @@ -18,4 +18,5 @@ */ declare module '*.png'; +declare module '*.jpg'; declare module '@data-ui/event-flow'; diff --git a/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/Heatmap.js b/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/Heatmap.js index b0b32aba4a1a..f2e3624f05f7 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/Heatmap.js +++ b/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/Heatmap.js @@ -177,7 +177,7 @@ function Heatmap(element, props) { domain[d[k]] = (domain[d[k]] || 0) + d.v; actualKeys[d[k]] = d[k]; }); - // Not usgin object.keys() as it converts to strings + // Not using object.keys() as it converts to strings const keys = Object.keys(actualKeys).map(s => actualKeys[s]); if (sortMethod === 'alpha_asc') { domain = keys.sort(cmp); diff --git a/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts b/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx similarity index 82% rename from superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts rename to superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx index ab3eb2a59fa1..3032654ba267 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ +import React from 'react'; import { FeatureFlag, isFeatureEnabled, @@ -26,10 +27,10 @@ import { columnChoices, ControlPanelConfig, ControlPanelState, - formatSelectOptions, formatSelectOptionsForRange, sections, - dndEntity, + sharedControls, + getStandardizedControls, } from '@superset-ui/chart-controls'; const sortAxisChoices = [ @@ -50,7 +51,7 @@ const allColumns = { }; const dndAllColumns = { - ...dndEntity, + ...sharedControls.entity, description: t('Columns to display'), }; @@ -70,7 +71,7 @@ const config: ControlPanelConfig = { name: 'all_columns_x', config: { ...columnsConfig, - label: 'X Axis', + label: t('X Axis'), }, }, ], @@ -79,7 +80,7 @@ const config: ControlPanelConfig = { name: 'all_columns_y', config: { ...columnsConfig, - label: 'Y Axis', + label: t('Y Axis'), }, }, ], @@ -146,8 +147,8 @@ const config: ControlPanelConfig = { label: t('Rendering'), renderTrigger: true, choices: [ - ['pixelated', 'pixelated (Sharp)'], - ['auto', 'auto (Smooth)'], + ['pixelated', t('pixelated (Sharp)')], + ['auto', t('auto (Smooth)')], ], default: 'pixelated', description: t( @@ -164,15 +165,28 @@ const config: ControlPanelConfig = { type: 'SelectControl', label: t('Normalize Across'), choices: [ - ['heatmap', 'heatmap'], - ['x', 'x'], - ['y', 'y'], + ['heatmap', t('heatmap')], + ['x', t('x')], + ['y', t('y')], ], default: 'heatmap', - description: t( - 'Color will be rendered based on a ratio ' + - 'of the cell against the sum of across this ' + - 'criteria', + description: ( + <> + <div> + {t( + 'Color will be shaded based the normalized (0% to 100%) value of a given cell against the other cells in the selected range: ', + )} + </div> + <ul> + <li>{t('x: values are normalized within each column')}</li> + <li>{t('y: values are normalized within each row')}</li> + <li> + {t( + 'heatmap: values are normalized across the entire heatmap', + )} + </li> + </ul> + </> ), }, }, @@ -185,15 +199,15 @@ const config: ControlPanelConfig = { freeForm: true, clearable: false, label: t('Left Margin'), - choices: formatSelectOptions([ - 'auto', - 50, - 75, - 100, - 125, - 150, - 200, - ]), + choices: [ + ['auto', t('auto')], + [50, '50'], + [75, '75'], + [100, '100'], + [125, '125'], + [150, '150'], + [200, '200'], + ], default: 'auto', renderTrigger: true, description: t( @@ -210,15 +224,15 @@ const config: ControlPanelConfig = { clearable: false, freeForm: true, label: t('Bottom Margin'), - choices: formatSelectOptions([ - 'auto', - 50, - 75, - 100, - 125, - 150, - 200, - ]), + choices: [ + ['auto', t('auto')], + [50, '50'], + [75, '75'], + [100, '100'], + [125, '125'], + [150, '150'], + [200, '200'], + ], default: 'auto', renderTrigger: true, description: t( @@ -329,6 +343,10 @@ const config: ControlPanelConfig = { label: t('Value Format'), }, }, + formDataOverrides: formData => ({ + ...formData, + metric: getStandardizedControls().shiftMetric(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx b/superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx index 2c0726774861..67d5f30f9022 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx +++ b/superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx @@ -111,7 +111,7 @@ class CustomHistogram extends React.PureComponent { renderTooltip={({ datum, color }) => ( <div> <strong style={{ color }}> - {datum.bin0} to {datum.bin1} + {datum.bin0} {t('to')} {datum.bin1} </strong> <div> <strong>{t('count')} </strong> diff --git a/superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts b/superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts index 26cec94749e6..08e315ba4058 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts @@ -16,43 +16,29 @@ * specific language governing permissions and limitations * under the License. */ -import { - FeatureFlag, - isFeatureEnabled, - t, - validateNonEmpty, -} from '@superset-ui/core'; +import { t, validateNonEmpty } from '@superset-ui/core'; import { columnChoices, ControlPanelConfig, ControlPanelState, formatSelectOptions, sections, - dndColumnsControl, + getStandardizedControls, + sharedControls, + ControlState, } from '@superset-ui/chart-controls'; -const allColumns = { - type: 'SelectControl', +const columnsConfig = { + ...sharedControls.columns, label: t('Columns'), - default: null, description: t('Select the numeric columns to draw the histogram'), - mapStateToProps: (state: ControlPanelState) => ({ + mapStateToProps: (state: ControlPanelState, controlState: ControlState) => ({ + ...(sharedControls.columns.mapStateToProps?.(state, controlState) || {}), choices: columnChoices(state.datasource), }), - multi: true, validators: [validateNonEmpty], }; -const dndAllColumns = { - ...dndColumnsControl, - description: t('Select the numeric columns to draw the histogram'), - validators: [validateNonEmpty], -}; - -const columnsConfig = isFeatureEnabled(FeatureFlag.ENABLE_EXPLORE_DRAG_AND_DROP) - ? dndAllColumns - : allColumns; - const config: ControlPanelConfig = { controlPanelSections: [ sections.legacyRegularTime, @@ -160,5 +146,9 @@ const config: ControlPanelConfig = { ], }, ], + formDataOverrides: formData => ({ + ...formData, + groupby: getStandardizedControls().popAllColumns(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts b/superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts index ca18b712b82f..c81e802b3dca 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts @@ -82,9 +82,9 @@ const config: ControlPanelConfig = { renderTrigger: true, label: t('Value Domain'), choices: [ - ['series', 'series'], - ['overall', 'overall'], - ['change', 'change'], + ['series', t('series')], + ['overall', t('overall')], + ['change', t('change')], ], default: 'series', description: t( diff --git a/superset-frontend/plugins/legacy-plugin-chart-map-box/package.json b/superset-frontend/plugins/legacy-plugin-chart-map-box/package.json index 60e5776eba19..5d739bfabd4a 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-map-box/package.json +++ b/superset-frontend/plugins/legacy-plugin-chart-map-box/package.json @@ -2,6 +2,19 @@ "name": "@superset-ui/legacy-plugin-chart-map-box", "version": "0.18.25", "description": "Superset Legacy Chart - MapBox", + "keywords": [ + "superset" + ], + "homepage": "https://superset.apache.org/", + "bugs": { + "url": "https://github.com/apache/superset/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/apache/superset.git" + }, + "license": "Apache-2.0", + "author": "Superset", "sideEffects": [ "*.css" ], @@ -11,32 +24,19 @@ "esm", "lib" ], - "repository": { - "type": "git", - "url": "git+https://github.com/apache-superset/superset-ui.git" - }, - "keywords": [ - "superset" - ], - "author": "Superset", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/apache-superset/superset-ui/issues" - }, - "homepage": "https://github.com/apache-superset/superset-ui#readme", - "publishConfig": { - "access": "public" - }, "dependencies": { "prop-types": "^15.6.2", - "react-map-gl": "^4.0.10", + "react-map-gl": "^6.1.19", "supercluster": "^4.1.1", "viewport-mercator-project": "^6.1.1" }, "peerDependencies": { "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", - "react": "^15 || ^16", - "mapbox-gl": "*" + "mapbox-gl": "*", + "react": "^15 || ^16" + }, + "publishConfig": { + "access": "public" } } diff --git a/superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts b/superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts index 8642e8946fe0..1dc75d96ef44 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts @@ -23,7 +23,8 @@ import { ControlPanelState, formatSelectOptions, sections, - dndEntity, + sharedControls, + getStandardizedControls, } from '@superset-ui/chart-controls'; const allColumns = { @@ -35,16 +36,16 @@ const allColumns = { }; const columnsConfig = isFeatureEnabled(FeatureFlag.ENABLE_EXPLORE_DRAG_AND_DROP) - ? dndEntity + ? sharedControls.entity : allColumns; const colorChoices = [ - ['rgb(0, 139, 139)', 'Dark Cyan'], - ['rgb(128, 0, 128)', 'Purple'], - ['rgb(255, 215, 0)', 'Gold'], - ['rgb(69, 69, 69)', 'Dim Gray'], - ['rgb(220, 20, 60)', 'Crimson'], - ['rgb(34, 139, 34)', 'Forest Green'], + ['rgb(0, 139, 139)', t('Dark Cyan')], + ['rgb(128, 0, 128)', t('Purple')], + ['rgb(255, 215, 0)', t('Gold')], + ['rgb(69, 69, 69)', t('Dim Gray')], + ['rgb(220, 20, 60)', t('Crimson')], + ['rgb(34, 139, 34)', t('Forest Green')], ]; const config: ControlPanelConfig = { @@ -123,9 +124,7 @@ const config: ControlPanelConfig = { ), mapStateToProps: state => { const datasourceChoices = columnChoices(state.datasource); - const choices: [string, string][] = formatSelectOptions([ - 'Auto', - ]); + const choices: [string, string][] = [['Auto', t('Auto')]]; return { choices: choices.concat(datasourceChoices), }; @@ -140,7 +139,11 @@ const config: ControlPanelConfig = { type: 'SelectControl', label: t('Point Radius Unit'), default: 'Pixels', - choices: formatSelectOptions(['Pixels', 'Miles', 'Kilometers']), + choices: [ + ['Pixels', t('Pixels')], + ['Miles', t('Miles')], + ['Kilometers', t('Kilometers')], + ], description: t( 'The unit of measure for the specified point radius', ), @@ -179,14 +182,14 @@ const config: ControlPanelConfig = { type: 'SelectControl', label: t('Cluster label aggregator'), clearable: false, - choices: formatSelectOptions([ - 'sum', - 'mean', - 'min', - 'max', - 'std', - 'var', - ]), + choices: [ + ['sum', t('sum')], + ['mean', t('mean')], + ['min', t('min')], + ['max', t('max')], + ['std', t('std')], + ['var', t('var')], + ], default: 'sum', description: t( 'Aggregate function applied to the list of points ' + @@ -222,15 +225,15 @@ const config: ControlPanelConfig = { clearable: false, renderTrigger: true, choices: [ - ['mapbox://styles/mapbox/streets-v9', 'Streets'], - ['mapbox://styles/mapbox/dark-v9', 'Dark'], - ['mapbox://styles/mapbox/light-v9', 'Light'], + ['mapbox://styles/mapbox/streets-v9', t('Streets')], + ['mapbox://styles/mapbox/dark-v9', t('Dark')], + ['mapbox://styles/mapbox/light-v9', t('Light')], [ 'mapbox://styles/mapbox/satellite-streets-v9', - 'Satellite Streets', + t('Satellite Streets'), ], - ['mapbox://styles/mapbox/satellite-v9', 'Satellite'], - ['mapbox://styles/mapbox/outdoors-v9', 'Outdoors'], + ['mapbox://styles/mapbox/satellite-v9', t('Satellite')], + ['mapbox://styles/mapbox/outdoors-v9', t('Outdoors')], ], default: 'mapbox://styles/mapbox/light-v9', description: t('Base layer map style'), @@ -328,6 +331,10 @@ const config: ControlPanelConfig = { ), }, }, + formDataOverrides: formData => ({ + ...formData, + groupby: getStandardizedControls().popAllColumns(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/ReactParallelCoordinates.jsx b/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/ReactParallelCoordinates.jsx index 712509e4eb0d..4a7675d555cd 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/ReactParallelCoordinates.jsx +++ b/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/ReactParallelCoordinates.jsx @@ -23,17 +23,17 @@ import Component from './ParallelCoordinates'; const ReactComponent = reactify(Component); -const ParallelCoordianes = ({ className, ...otherProps }) => ( +const ParallelCoordinates = ({ className, ...otherProps }) => ( <div className={className}> <ReactComponent {...otherProps} /> </div> ); -ParallelCoordianes.propTypes = { +ParallelCoordinates.propTypes = { className: PropTypes.string.isRequired, }; -export default styled(ParallelCoordianes)` +export default styled(ParallelCoordinates)` ${({ theme }) => ` .superset-legacy-chart-parallel-coordinates { div.grid { diff --git a/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/images/example1.jpg b/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/images/example1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d73037214c61d47d31c01bfd94a1daa397c91e6 GIT binary patch literal 62434 zcmeFYcUV(jv?d%x1VN;Of)J!D0)iApAR^L4M2d8Xh)5G6(gFmcA{|6PKtYItG%2BX zh;-?_g&HEgC6o|IVe-2(_s-0H=6-YM`}-cUpB%zD?7jBhXRY^r*UIVC=^}vrp^m-| zfR2t1@QL;VIGq7#0nX6T{qy=C2R#G*KgYSVXXzOj&oMIo)0ob)oM&QUW@2PyW@Tn( zxj;J@&tGI?y>RiL^MC%yKezvL7wvU{iIM4_EB@b()87CNCOX8~OZ0RifHNF)^c-}j z?EoMEK*vBE?LPzl9|zqT`m+q@XhULVp<PhLP8&Ww{TbR|8P1-iT^&sOJK!t_1LswF z&2wDF4vZpR+zRg!elUsNFKgj38ODj-dj979d1hX|OPBe@B_yS;T~}06R=IsgRqKJa zj;@~mLsPS-<`$M#){ZZnUOKzDx_SHf`uRfx0z*H9g-1k2MJFbGPEJYv@-;0h`)5vW zUVg!^@`}o;>YCcR`qsAgj?S(>-900tW8)K(Q`2b7687)%%Iezs27Yh<;E-@cJU;oy zE;<1He>dyjEc<tManS5KLtBHhjQ`k0cgCOA=sC_ZT$Mk^scFpU;Ke1P@Q#W5e!`Ek zmh+;wOmIBU-wZSJiYa2m@&B0iFP8o14153o%d&qn?0?#Y23(-0qb(ji2LJ@1kh7wt z0RPqgYYzTv5Bz8MKnF1n&!$T>SX2kM&tGk_yQ?+iA=cbnC*PR)NWS2uM?Q=EZ;TnQ zB;d?rDSEeP>>=o5^OaIC)1?wmUm)>uhEDVij~BHhlS_?Q`Rg|mZouXJe_y6A034{; zi@YCfHxG2whIz_4q(J`~T(h6!Rd^TL$K53$h;?f?2U8yMs|Ki*4-z^nYKdV%KYJJB z1<-4L8dpyNAMA~|{wS`DG|yUba6PxHS~O355PPSZrFQQ=d3?$hR0(d|4%uvfVoBU= zsi}Z!S{<$}P89$2;IMe@=tG|b5D<_stVIX2LW>ZkAwL+~j~g9%3uQWU<UZ!%&!#y| zM*3b>bS)CsyyWnrqd2Q6;*85*J?|AAx=)NRuUw~gX5PfHwY{Vb<L&xh8}3LadhmWz z)wr*qr=gWYQ$^jhY&uV(qI@qw>O+)(-ObsVH{82`6NnDwXQLois#2dUzr@BytnRWI zJNGR$P^ZRG?PguL)jP=n0jg#C-$=D@J2O>QDRwM`WTN*{oQg%`C=9+>tTWm+T3k}7 zUQ*|-82F-ZhWF02ZREF_9v+-Nwiq_E2oKG?PRVaHSn>$jn=!<d+e6D))>kTQI-;;b zz?7Ex5!dbSiR&r)Nt~7P*QR=IEt6-`;<qC3^h??wztkTh-ulpE;_f~i+7ceAl8&iW zGH~}W>DklIWpn5I^uRCZ`MU={tewx<dfx-;!PJQ97*tI2r5GC=B2v+aYi;yymmoDM zm}k2vHumY5zJNmFPj(%sXxeNE7Y5iSsP$Xp4l%C4-q2MX8PljKRQ&u?18?}%yy=;n zpLhWBiSt@}i8p(^6YuS;{l7YB`WWIV06(fn`4+-APefW*kINO`_!})=IV#i9u{`<* z!}B~|)N9piHOySS;8Vzuy<o6uyWgIHQl&lr@HSafee8#JQ~!r<=_341$2#34;a6e8 z$RB6-!IkhWd@*%MLjea3?Wjk5P?WpS?OmX+@ks{pq_)|md60RlzB-ehDcU`8+HNKm z+Ib$SoJ8QqTaz_#eBq}6%+*oPZ8bG#TxX51-<GEmf<@p%nv|v3LxkHj<g8(9C$G)> zyiZc}mGGIwfgpXkA`Ky!{<x2!0+YmK)m@vra?)+ZVjQ!Iw;oIycqt}mUssHA=O%f_ zrZ8wDq86%i!*EeBi(hU8{}G~NYud+zY+HNFuGL;b;XcQWC&_1+9BXS5W;yRyWS}J2 zfOt6J1u^aynmF1@<*pl%X_Uui7#~I+{(;&3A_iIEn%c|6-h9E9#i&FV<v!J^d#CRa z%k*TtYzaIaNL_u3fBJdE%8ux5H(4piX*;{2a`_gE<@RD@^yBm5KPuwhfvzc(ia9FM z%@eVN3>@k$ZMC&9hX<*;cKGCELbe-TB;Cd!NUuFnUo9;BciYvQ7nkCPu3aSntKwVx zEq+f5Nmdb47g-Rj*0#Zk!Pau@X!TgGSNm$YU-Zks&txjUVZS|ZzJ-ejA87coktrzz z8aV~jz^*#OQUXhm-`&hNd^qy#EL}M@1?Rr=k#fFui?)_`?mfOA@KxJ$m*7k^E{1vG z9}+taVs3*C@Hz?J1+FI<JB6}2E)&ZBJ-uQU6UvGAw+S-=qOqFXK?=QNynqwu7I39* z7|g@fOTo<#{W`)FHIijR`r_a|S^ko%n{B|q^GxdOo%7viN|hF75Q~I&7&}orcvJ{u z-LO)>8;A|<rd+>VL_oqeEblv6NL`ZZzP!k8WW6T{CIImI&BP@2l!l)u@{M)hNIA|u z*B8|8>dXLH8SC-J#@yAbp3g917p`cm;U#jTNHRp~$_SX<jaNe;w3CAvp*J=%0p_!J z^P8+DXgq71Q;OA*m{DuEKch1DWWak55Tw${_Av@qVKQ9V3uJ{xbXrrJB~u3Vhph+h z%wIZlIaki#3&Lc!FM3JAQ@nHh_U%<HrCN<X7uwu*A1|BRe0E$(U3G+tUg)@``Lp}( ztfAt0x0oC6G8fe@GUp42-!H<v%L^G>xZt}G6&Mm(4-Rb>BF@jZx=JSYwx=HP+Y-E! zXL!al4sO~iDhMlFn_+)0_9sC(8LkYUYU`}eYlHJ!x&_WB6u5^-5??oSyx-U$tSm3q zae@C7itXt*rHI+&KY28rVkFfd<@krOK?}e6dlJYl*C+{$B}-ASk1V>U&t3Kn^3Jz@ z@ayu=L{{o^DRUF6&lhg0Z(awZM=@r~s=mGCM?_dPx(T~Z;H-%(YPFyJ@zg~Ga*ItQ z^`7yY-=)|DdnLK89Q-XXu^19mI8O}0>W@^Zo9_)QD>ZyrU>HvxZ<J@%xT}ZJ)l!9g zT~5<w>bnG)k|M4W#PIpJ!3aePki=qIll0qMgK_fJGG1^Z9&+Yh3G#-7^qn;5!oX`s z4NVGKa1rsDeqHVyS+@!wAEjpSQ_R!`Ote3gk<Cs5s&+FQa_8%sy?_NN+}=)GE9}!? zhMpm5605Kj&z1ArMM!vsPq3On#^lXu8}`vX{Wb%&{PP<kjGr_$5ce3kjsJ5kV6Y<| zElTA<#R?B84l+U;y7+r7GfY-SHA(D20){K{x6&KF(C_#@;}qHPL!{;g^EZMBB}Anq zc(m#SLN;#k6c8~l`4K%}DTAysd~?)xG8wV@36opZTvd~4SoA|7>TjuhXwy47z+H7| zLgcV-4Dhn8u5<B&X2$C14T`LcTGR`x8;SV)I)86_3A{DG_u;ni$6ID0oYe8mOT-Q= z#lOuO7MPQnhoQ(lo{;1lx?$W82?As)$A#W}{`Q?P)?MN7!ufp<i$%7McqS`i`s1Nx zoO6tByA1z8m-U2illki7y3w7bGJ|WLCiBu(Da&?G9<uk+%_Yx;&(=}ZDdB3yZzgry zgoH;9dSkjh6kU-{3g?%H(haN1Q1Q#)l*M$X6p`~!*1igJO3_yk?MOaE2sSegV`$o1 zJ=vcF{dfwnj4F}C?maROw9&tE<o3(vjoNz-pm6dxd3px-AdK_2u{&O59Jvb<T{;CY z68$`GZkqEGs;jjgjoo-_zTY?{>qG+mS;NSFkTpx>{`^VuGH!ujHbG@~&%E3;5+0u+ zYKiB+A<yd~qqzO}WhQ;;){S8`<sS)p$B*7wF7huc#!ovhCFi6@!pnS+wBW)jRyQnJ zVE|-vx3CD*sS6ex){{-^3F3e}o6>Lgjb7gO+CP4OwUK_N5{yp&J%4jdO*Zoi{#@!( zuN?2Zo#pg~wcueBCDvqSrm6kCzT>BNAMW2&c%yUg%6Oa{A)Dx20=;X2=Sgh`pP3`V z+x8-r3?H+GOc<yuYrW+Rcn~J?Tn`he7JW=*o6_x^mv5YqRcg{T7#={u^JgCoZBC~3 zk5~Gu(v9+b7}exG;v_HM?~MK?_t;|{R4(~(mwcyiZZl9Wd>MZ!UcYj5LJsH#O_aX; z_p7);{?-q7U7b&rE?2(*zY0dz0D$*5QT$|;Z1R;x{C0DJa}m^j@^P@q-EC!``tUs- zli#fy51Y3fUcc7AGMNd@Ba9ebgt?581t5!Zmp6+<!P`w*1_rK}At#r`&kt~4&6nPA zLZ@RnG=|y)BA=DIp90RQdHo7$=kE%uD(sa3ckWrw+Wx3|vA6ogR;iu+^4TXhBF@}K zgRjf1dMBH7)`HM{gg3+pd^#Z-w-8Ofi&;45dXo}+Lqjg!tYNrO|3^D4g7=8Mi$!4B zf=i)wuZtxhHc>}8<rDoBS&n1_)oMRsY!BA!4bHQHNsq}XQherHMXwQF><hWzx?qp$ z(6cWJFPvd20k?vx)5v<bv(3Uoji5k>F&GB~Tg*%gd+c`hGdCg1=%*&FcRodSU1+<7 z{4uD6q_$^@j+6Zb+pSBYAm5>(_D%Kp;9MsKw|Xcl=}Bpn#yypy635RfJ<rpgusFCG z0YZAI3OK&E8ohC{!S0$wZ(yimN;GVy-(Q-y_FD=wEcu#8Y`$apBRNrF-~*y#yI=E7 z+ytV~vU_FPEoFFa26co@&?+En@&uMqg@~$b5g~vfGRUoufaXO&@>=`H6E96DN#cxc zxB<r6|G8$72#q21;gAt(7I=EyAoY+XET-v$bxNKXZ~pVz$X}HU&d;%Z?mkeoaf|VF zN3YvRtIwrz)c`P~i{o3Px|QbVL{}0sF}p?MCT($ifkJLV!s8MRV?Xg4QBWCBSsJUU zPimQUqo1o!%S+1(&jT!9MKE4@Mn6uy7BUucg=kzv3EvU4F|PHHR}!;RW%$;+GTY_h zekShs*Aj_OMUDbSsaIb<sVidHMN=vl7@#SuW;n^1M#&{Z=J|P>U@kk7#I|-x4oMxE z>gBB7UuS_}`mJZL_Wlo@$t*Y&{v5^Qf?)Q&EmzggyWeTf-<j@>nd#(gDlHumH_e@~ zP5iO9R(|=bCi+O$!f!am4PL?54vzGrs!uj*%H+lsZr-#s_(}Ba?M%x>{S@C$9+?;K z^jvy>7cP(eD0+o=?T1;}OPMghK_LPS?<OYrV>XQ#pp)RLVPx?^v9tY1@wU_GK|`Hm zw5CA2Cj<6Z(eN!b^F5LC3N|cP4K(B_NDU#V=|j9vDKt+De=cXy-LH0{G8kx5-7vQG z)bbkVJ+TWBUi7Oo{Q;+d4z{<Mck!sssl)zTZOwGULN+t!Cp(p`$5%3z1l(_1s{~1> zTYiTkyEwmd+7{Wo986($BFb@6+Yvk(S2gnM=YL?rQ%QVQBOXXlji<GAc7QMB#-nQE z=?;dh>#hC_`!B@9UnDVnq2FNAP=P9}E}6|=i0_!cl+?*PM9K0v?`wH6huf01srV@1 z-Rs|fOK$2GgD_p4a7MCYMN=&<KANnwR2Zz_?GYdwU(f<eNqm=dC0ycJ+(*A}{5U%~ z0toMc>=X!v)@u}CE;VWvK+}5mR@?ob`_?uXycG#nmq}&<S2n&hs`}Q+xYHsm=R^{R z@!*lIy>>4LJLGcEYaY(d4%zGG^|NT~l$gFqH#ObMgP~2wUsx|k;q#Qy*Zu7$EX|yh z(xOK2lDeYqBI?Qv)WEhuS=AyYx2956=ZCE2RWpO|hL3lcOZA;<^cI%e9I$ezeCh;( z`5>M}zr>D)UxGcd+WZucmCiS6zf383^F&Wr;j40#GW*P}Z&$E9e>M0hDO7PwL)<B# zb#!69-r_?D{~)K8dp#&t$;N&AW#@$e^Hl3cUb-$F<0f~6tX3~sT;u<GGfm?XC7tY# z^Zt!sd4XGwc;BdtBm&#~g|0M>9;%yTAD4cz4gQ+Bba`aLf0loN!J4D#1>~z<8z3kY zW`gTcy@u!gz;7^BId+bEqiL+HsLUol{j0sQg&C=@i0SN=NqQ`5CLI&;7N%e1@`hNU zJEo?U?V^$?nxtRW{NAQF#@#&mrR7lVoJgfYfo&}JD=edsTt2+zHrY7O6|G*KL?g$I zfsA3>FUoDcEI$BqPs^n`1yyN1pL;H$pkRAl7_d~2<Ot~uk*vm95M&d)Fr=~qvPv_~ zFV8o~U-3fCsAuZ-!x)z17_mJ)u=mv`GjF~3h8XiSNj5|-JDg&s=#ZLL7BTx_*_emo zoVg*;<UMX}&sHxXUQK6<JzFnq>|0oOOGls+YyqE5aL1qfnJHs%X<IV1GgA<E^dZaO zIcclEX>Qcc7SzMzs3)s(Z9qTX^PB}p?+KkY_y2dZ*C*M)RPd>tf^2OXg1F>?)Eq5| zs&hHNHUg6oGus|NDnTyM64h3ViC|^S)k_wD>vfJpD#gS1fZ{ME%Ev}c4{Urm3l_o( zb?jiH;rofD(Z>6Vo6zJNt5M<=?$8%$uHQNSbOIWtQ@2_w-sjd)R0vn`pm2?gL^h)# zn2ck#JMa93v0|7$!6rQ@Kn}U$p;)QV7nhm{EzXS@V0a(v^p*weM(gh~afSecaKJQ1 z4>H&Yuc~l^?{^OK>c-TR324^sK2I5CU4OyQdAL*CSB0FTN91$zXF4XQo4Lq5co?GG z;;ouY01XN8!Zh%*QMqXCe7kkvw116L_J_`iok{Z=<*l#6DRFdt?p5!XjVg@q2}zP9 zRHDgXTzF8EP3K8xRiP_Y63-huIY~%y*uj)d>=u1@{>bDI1@5kim5*cRJl|;;Xn|Pr zxD6X}O-o!Y@*Gmuh!8z2;Uh?%0uoh<P61OSEQs<@$@;Ko*vzj&|Euc5BSR$O;G++e zIDHD}q9zwi@5i;uDZ!QcZAW3=KivkaS?`Y{ZchzXRUF(_DmFU=vRS&V#}wYRd8>L} zgf)I3W4&n{h1|@qb1TlEz>!0>7qxi?RNADa9WyjmO-Iu2oC37#J${n1J;5WNT|>l1 z8FzdQ1hu`7JhvNbx=6#{;MmGH+S_ud6NhbyW+@8#6p*BPT{@E{Bo#g_Jq5(iF)zka zNc!du@wTtw4`Dz~#Z-@q#{|eXkGi<5RXlf7?1}V=8whf-WWGM+<slDi4p{}i^WG&F zZ1$|}prG)U9f4UY>+S#Ea(fkQa#x+S1r4q+1AKYn3dmYRK2H4;6}eg;f0USlQrtzb zSX3DH6!0{kQhH+jdmp|gQWeLXh?d(?@Llf;kZatMD!D;+{<uq3Q)J^@AQeZ&hCrg( zK9Wsg@FB8*f?V-3`3W`D>(@!u<NCl#ltM^_QEqcoMP*hk3bb_Y`<qgzk)bJCU$Wle z_$;tksgVaOqm>@d-{rz)RyrbL8_aKV3h0S{mfE4%d~_@!G)?(Zb0pWFU7c&FYSU@2 zYi2zDWs!NQtHr2_ws5C_XtE<5(U@mUQU$j1Jie|6a^7X?kT_O+2R#MMH`b-CAxOk+ zqr~WWqra&B@2kHE(Z{I0M-$^3l2C7L#%=4Jq>HNI^^d4l{Z9J$%{ED@I#Lp)k&=?w zPfq2j${}kERjLKY>x^uBjrLSM==v*de%B{rM?`Me>*0Zg4%IazR>tbk;P1l5$GcQM zE_--aM0lfqz>dcQ(Nh3WB)cBp6;o3DA_#O2k*v=#=f<Hka>YkbS7ViD)>yadJ(^_| zPNdsfIZ8hkKLwm6zLBGc1rm>c5>wlSM2Qgp#RcAD^vfT)QyZ$8>0Zt}#bIO>uXXc5 z_aLc#F?lYrks`OP-@IlIST=zSR9@I){6qm3#kGmft-$qcb`(QAT%CC`zbfarUg4!$ z*1bXczY>$(uJV7V+$DtR);zFN)<3If75S82Ea~mFAirvZ9dLnthx!a@dS4?3m)<cC zpcKL6FonBuK<-A19AZps;7XxlV7lv*n4lQxej%weQ2A6#i@|!^xmmW}SVx2t@FGmt zy`$!1m0eR<e_Z84Ne8I-wU8p7kcg^@Z_6gM?_qIr(b=xAVWnM9a2R@jBMd07I4G{E z-QSooYUF`uY@RSx>1IbwmMb|)HuoaBM<#d;i^2%u$5T&`9BVa*!~L9cu2TR^Uo*9f zVCR5qIx06%lsq)G%i)1r20w4!-78BiwG*SB0`}`VXu;45dl!5-&r|ssKHB{AC!*!E z@hN~s%OaEl4^<lPGUe)!+;iKO%0{;p@nNYBTX`c8S_l=5IR%8xxH9sosziCj2cx}9 zfzd195JHVNL6h^gRtSUiJK0osyJQ7DPH<!Nf^piNwWcLnmqfbWryk-*@RmEha<Npd zF#(!Dqd%BE`wOlhZ9mwd`ZD_zAaoKJd%V6pD+(7i2*SjvnA+M}S`Da+h1ncOcQp}j zVPv!@knjT&BRtCkbMo(gU~TZ^>?z<62-W~<f`1*QPtf+#B?RIUzqREKx&#T>kRs)2 z^PzVwZ_$SxabUy=?fK(pc^DvOOw?~Q{hLKdBB2&bSBq+*NvD8C(VDDUFI-!@G8n&# z-G<8LjOXNZZ7zqNjCO^S{hz^om*RMjhU{FHL6*zFo_NQLN#OWn#%hEmsEs@@5xvy6 z!0vJ9CQ;`gP%P=U(aNQeN_eXc)&O$Y%u(_AV(x;uDWWCWHQ4UJeHWY`?BHv(1OI_G zwgr=A1nn278ftt<WI@=E&mr-;WZ4-5IFUpnN-pr3(Tp-;i3`nVL{n274%33|nmj*_ zL}Q;54>2jXQ}%+4PKZ@0Y9a0xG9e03^TW4>@JHQSqYR*uYijCG8^N<mkv|EEq=B^P z!Aktg)L?3!NohK0wpNF#gVYu2sWZ707@F3dTcc#C9zkOu;oQdB0B&Qw9nt%J_ns)| ztI^$K(e}y|r+kN9#khx_MUPkYPn`l%-PPtE1y^?^S?OXWqtqUGVNmpLNjf3h6G(-1 zT*78(y%ufaC!#;kS5ugLMXLt&exa+YoWD<3bsUaYWz<vFos%6k55?Zu2TQ(f7J>eO zw_`iaLj<cm`Dfayg?n_HIy(2*>N~64btzvOfez3be}amT=onv;e~F!beveT;XCiGQ z(is~ivMi;}QLcLHZ#Cmn5tR$!Vqe;_n@#~yC3G_t`jtV+gFim8hEh-RQ5Xec)Y9NF z1JUO3&{fZ*O_lV&V3HFr+?;34+#1IJ>dal}^Y==ZSoj$L!3>7FYJ6?L#yc;L;9h%( zZAKhoi3Zg`4omLHcze|pcjRRkUg;c5*EH?S^t1fobxzJVM0vw8!&mEGr?1E)n{?C- zmIo&-IlqUG&$(nOR@sksQ8EH`$Gy3LE$(sz+7u?LWW%ROi-VMhioXtf9%gTVUe*hF z^KFafu8lA?8s}_ka3wXSPIMHbcK1Au`l5F#<v1*%nJu1`GcyJxXHxl0Px)1{rbtmg zv#pN#0}In}%NP6@m?lXXYGKjrJ|p0cWZj4xoT<E<Qkt$&#Pt_W<S)%5)hrWZ7VMpa zv;)drK%9+Cs5R?>B&?0%I&UFUS##Gji4Os<g3<B_YZ$!pfht#I<J0f%nU|98J{r{| z#FzvnC<dhpt#SwPQU!xSy{`#TFl(VW?UzLNPF0K8E$xA%{AstF92tcD8*hVOL&@$B z%Uz2v=j{Ia--GSH55BbDua)<dUUmML_)BM%+I)NDh5)A<?@SZV5pYy->;>ULk5_#A zmfNuHDS&)KO7?bT`PeR-N6NA$+2&0A_MG1lRsF#7yXkOA$y-s}6L<!=Jk^egfLljq z)eRZj?z`HHqJT}~MXz)zs@4$5z<pin-Frl6s;&w;w~Q7hkv`93PXWIj(bx90Ay<R+ zo3f8i0gtAdCu9^`s7byM$SJ^1jD@^;-6)Fxv0k`;g9BL^ulSXGuWQqE3d*Q6`uO>% z2R%F>DJaBQqDnOE>ZJ!yh2B1opDWp=InA4t%`Fsg?<Q>zHZ*|N(j<NetMi+bv5l?7 ztF+fNiHsEK7B)PBUyWb2W1!_7&{81-MoUR*U9>1p53|E=Tgf^QTd?uxZ6Y5SIexcv zS>k)v2kW2ov)~LDe%BV(8Y^{2qH8M%n_;m8-%7yMwAXJBqbA5&7*<KsG1*7%K(wqx zdAL5<4NzD&{gE4R>-U)^{>FF$fCjDDh%_kpoHy(gkh^yMO1iAPf#al9R<!niPB%4? zj<|f5V?&D0B`X?0yX{}v9%u?d)tj$41vu`~X7x~N+<j8|53LvYv1s5RCBFIADPS!7 zDbn`)ndoas;kY;LQil?61+|?wgl>!+{G9X7pT4JV?+ctL-EF=Def%3!)qBn8=Y^M` z#87LUIDMEr<gfGfF)UtRv?zbI>f^eXn5*!CQ@__LHYMW?Xh;#s<rX?Iqn`>{!RT%p zLZUQ8n?Y+rXUDDBbefxLs>q$Ikdexhs;Bieg$Dbgn~IqO)F{*+bOX^V+fKjHs<`p% z0LjnA2J}?qhsMRRBG6yp63h7I!PEf$Ik{1gG#oqrS*}@RL-JZ4RQD0h(b0fWy)T(p zk#RqdjR`tJqH4e#oL>q2vU1sArts@RmaVM~meR<l0I|N{t|DQobx8iGoo;(QgbZ^< z`(>dPD!;YTJc3sXka#Fceppp%yP=%+@#}z!?L9yEf<eN`gg^PZKuk6@eQA(;u3+Q+ zvasnXAY>SxaRW}Lrt)nN5)iyeD4c%Dh<llR1azhJk{8x^kpvJQ)!<MOg?UAMrq#H4 zq6ZH8$+$P*mb}mfW=2!ytOb(RJ>zH*vP&}u{FZt_8{4L;GP%`@7|5+8S~z9J6O(Q2 z*Fjq?5~kGSXWGCm)I1rq_>qX*p@MMCx>%>;Nix)>S$r%QLo;WEq|La*7X^W1dt3NO zK}y?X-c!JLS@^>dWqXNH(7642TH1+i>%?ySQ4$RS3jTmO!yQinS6S(wL?BRZy*>zg zCJ5Ot-g`?Mlzs|$E9*+BQ`!UL;J0K-s8=^6<)?|d23lzMsGT`DgBjy~Zr*#c2h7_a zYvb<ZS>TW@;<z?)_Y`n_zML45y`a$&e8t3BK=Pc#;P6`|<c0Oub-ETpzr0O027pd- zsmHUmqaO}eAgfgK+rv255)_uy5hB+#I1jG5!31YYfM;j`-`ex)%*i6evA+Ftvo)7b z0nJmBPTIN?zYda{6v;6sRkCHM64cj-T$mz`5Uo4yW2bPz=i0066Z1yiC+PS&?JMw| z?>sU*pYyK49*y6ZCq6OO<`Ms&kJVETBg?Ac;=UTwj<b#p)lwefev02R5?*FCG)A}5 z-xv`yMw<Km=6Me@$|pu{4{tT*vyq$U-$$JS0P(vj*mow=#EX0x&SQD$PwTFPf=((y zTi=hhowlzuGf;JPOP^4sYZAw4KJ9q(uXkGfwjib(QnjhBVllK*hpVc$+cfen&_1hr z<6=>_(twSR%hN0Gf1lx~TO4iXch?Xk?qc#AHFJp#I{1O48?gzqE;YlmuJ6V$pD%q) zj?TQeA{J=zo;nO>l=G3}B0tmM!^L$peMDjwE;f3vr`_$zT68=4aOCf$#Tj2Udryq- z9M9}X_4u>-mjcz4Pd8v%`7S7KC6=HjdxK)QCFya}5|A5ejn%JhPTFF>kJLz8LTg=- zyJVF7Z2#$PVJa@O=M*4-TBZa>Ox*GLS-d*AdkT;iWQ?Ve`cr@>Bpk=|oSlYf>6gk% zrDo!{*;olkty&_Sp)uD(b_J{VZJ!kSC7rT1*aLrv2eY}%tBrslZ1nI}k0m1}VniQ~ zFN)ehiNG|(0k?=_u)8Y(nZAb$U%%zfH7IYt+L=|R@I1Zlm9jR#v!O{UTII8!fN97V zOcig5QtgZA$Y{|&<nzVq0v*cyL>jrRi<=6jb+vhD`lpz=ZvrNox7p=G*jynbYv}W> zwWVcRbz%GuPXV_c2bvPc5x!LL-{CxM?+E=#n0kNQ-@qbzs@?A6X_|9>`2=)ul{i)n zXP1Ft&i&x&OnL*I_Ng@oZPoT5265Rl;y(|l4KW)dZU>a*Wz-yM4PtEgQ9GIb+J(Fy zjKZUZrr-Y6C;zYSFRIr;3lHE&sY;J`ThSgTOCB0M#%n{@sL3JGZicTUl4e&*s27Rm zB#LvyL5d`5`ZI8l=f2T2sWq%ZC_}vLu%;mmNMQ)`RjqDt`aYvLS>rd6Ak`i4lL>H= zwnPh+u1J=cB*@R^oTZ>rufHzUMgd7w;u(2jX-TA6JLny%>C59}wkn<@kwqfVnRdNU z+G@-VU5AUsqI5)!4IQFYu{FFa^<$$h@OynU`fo@Xb2p9sH!L~F&hUf7Dk02h6@v^v z(zeRkz?dLdzDB={{waW2&K!SrFpBJj+=yNXocJyK)lD~dYHt<qZ5?DCgH0p@j}x}O zQ<+d5+>KUCtlpR<2#T1DiNtrM=DR*DGNM!@8?D<mf-AxChj-3E{oDLB<X44!n{oy+ z&IK=jNhVj==U~9^=DBc=Q8yH&84!(oT`PU_%QKRoINy67m$-x7SfF`(279Lf`Cw~1 zvB`eaAUU3S%$FuvP$hnY*@#-L)x}56y>LoiphmbRx52TJCSO~D+!au)A~3S~`j<D_ z6WJH4zaO=;H+o^G3Xs8Bi5)qWoCm1m_zk4LGR1?cn+A37Z05(w)JD&=oHW1VC&X(z z(c|yAKL^Fn^GR~r4|>pm%C>ksFm2M=Foiqg^+t*MrI!`H*Hi+uDW?D&%adP~CSZRu zS9&$E7h}_^?0(`P`Tf>A@}~7<N4?!%=*1idS$KmgVpDrE%%^u*#6z{y_HgbDV%^FD z%%~;<^_F;-%NZ02pqhnXj=<hD2TrB<!2@Z#IV;*H<ITqsb+eT^#5tH3&Y~T{vvI-} z(Fn!_``hA3Uk(lL8jU}zs~@$LH<5_CRO$R$bcOztuCdup2p!ScQIQ{3T6;GC{f1t7 z@NG|N?C#XyqHGzkW0zTM63kVEDm{>SJo%)&d04J8U5>F=sgF~pIAaU{3;bhxImH6; z`kmAKyVBm2RDDnbmFf7`;lGeNpkc@ia8Ks|LIT2QF1$b|*}e`e6fyxm7a|LV-yenK z5zDeR>@U$s?K=#(VqJk~V(gbcFFqPp8&m=7=@+;({pBA0)-xUz80vv5O{()G%e_ts zQ5Zc1l#5Hg3jA=kH*XgH`=m4YTZm#1qa3Dz3im%|naMu|aM<k8Xl38dTK=|Yc2kX& zLxOl*=hNZxOF{gJr7Fy?5{ibCeJ>QZoPELX%T3o#OeX~3@}iJ&s|2r6r7Jsp=okG? zuh~k7e+ID$R=O=<4mB1DA0uu{Vs1;IB{6)Vw~l_;bCDi#v;-**wBz|zER)&%GwAkC zrP^Z1kOK7879J8-wQ!N6&GzT>lU|Kc?Qd*H$?l~%WPGL36`O#1okGX_Jh;fS_F!FO z>vqpeN?pXlMaeKVJ72=rgD)P)AiHV#s#<V%r)Ji{{KmrM;h1^ajA>a`<8-qC5!>S4 z&=zvj(42=<EhJjAKSpAStp0<-2_NX<XUuTlXRvaN?y6GYCU_paeWFb$C;N;Ua92lu zQ@0$l=ud56tgLA-3N+*i!>~oo1Mvq!FXM|W-GmCcf7c`KH)#??s&g`gZ5w{Encpr# zyH2O1xvd5BB+(GAsF9dKzI8aT6<LS6+W!>9zE}%d3k*TRcX<l5$qO!pX1OQqo2J&b zYf>dXn;N1h+S3=zKhSTa+t}C*#BtMr(+|_|m?f57B5}fFTXQ2NB{ZJMl>*8EIeVaK z7)?598-mL{1+WctX+DMcHmKjx&)k^5;=3SxsVD(=A`nVVh5xcA>A$&8HF#%U)X4hN zb?bs3?@R<<!4vc~$IadE?pTmm^9wGR-iUE^$K5%VoJK>rJ?<8)z)TA@>idR*bN1uz zGl;&V6Z5SnKUqF#Yp!K;pWOLg4Tc|trex29-<$&Oe%n-uR${BKS5C_#bsD77D$^dS z3Fgy8wB1NwK3ZUy=9~(7TeE4$%1tR;OFU+oLRQWkp91t+;xW}pD4!vHC<VRZ{29@= zRJm1oSLTivLr$X>CGvNnk6C?EP&xJ?2l0tdR`hk2e<fyW`-Gpw$pY#ioS_QE>l(tF z-jTRgU18trCWkGHmdc7+_D?jw(DFK6H}y)a)#x%y-DDUsj^s86<-=y=g*oD=5$f5t zt|=8VU6HKSHPFdE9;eb#>OkubQw>l-OECymfMZMX-T(`RT!y!95apIoOu;oI6)I=2 z#Hs-aoU|I8J`k0?Q1ND`a|`==Ks9;~4h(5OiI3HgaI^j_BrzmBR7KG;7(2YQ)2QfK zl`me(9+^mk1>4uF@kvZqt<N(nR`5J~aePlB6e&u13;NqeJx`Oj!+yZm>zUV@C8&Ks zRt=@iVYg-lV!$GVcf*gcG$P&au33f3ysdSMX?!{Ei?H(>?ki4HM@j?K-@rWwn(lZC z*t$Q2I+$Ys1TOz)3Q698fT+J8pp(?!Dhnq@;=W@~7*`qF>y!)~7lC0REJ~e4DTwn` zz>Awllet#6f^*|^+Si5@f36tz?EuA6R2_FP$7^a}{KiTz1{75pY_lYo+Q!0>Lrh%N zsjM2U?1hq@f+&T*w8ZmL#Tas4=oR<sx;fS+l*Ck|JagYY(Ye?Df<81MVdSmGC1M#q z#qK_cs9R+e1;oW~@Ou_uZ0vx)R|G^UP0#mT6V<7ck@Nbb$qd*ZCri_<zY2-SOt)P^ z9NwrEb)oC0C3K<-LqQ^t;I&bEuxrXEXpFHcA*<N+YSVj*WOlL3(W5W^+P+YJh&{OV zOzzu-cW=G=FZ?L`bn&8&?nA(_5tUg66z=Irye8Rxmgp{&AQ>g$-j1(Hri7Pgh#b77 zhVb2OUI`euJIRG#AmmiiO5tb^9nHnE!rU?N3zlp1LZKF;m4j^k*)~M?cIG1mX>Awe z*(1Jt0kRkTp0lU#jh<<9p7jZ%zbSU%V}zg-J!T;We1&YhwC#@74V7sY-<S++JYkF! zcvy~WM?Y;P!mPjVrC1vNT0q-=y1(M6X2K_-a)0>UL24-3XvqrY3}IRzGVivX0=PYQ zie;v&487Y~^0e~rJr^%w=!lEOH|$I)|CIX4d-t8KN<IT!)bH*MuZfhm8m}o)yCK5! zFs?E9k`0Dc!vbFugT}xsWo0KW$4B|z63Gsbzsv!CZGJuM?b%<e^b>>OY97JVh7Nv@ ze9uDHoIR9|Kd7e;{(m6NPIfsjQs>}(9m9rmHAgdhw<~a2CtEbC4sB>RE!aqCd>u;D z*`yQ;aH5+2{oP}`$K8A?dw<w4^$n`mC@+z^5JS+_VC&SUa69;|^wDNEBKTqO(3-Ui z#Nxvp8u6>JNl`T{`BGb5T~i|{&+Pz8w#=$X*6&^NSB$%@i!rBphwr8Tt`7VR%be<h zalA)6$D`&%VaTc#Cs}!<#`FE1SLr1lIWEU1^wINKzixf@d-3p_I9@bUh<`$HpBh!7 zFLDZav&Zup_$roPs|XtNh~}B&Bqk_9RmlSr^pt5D5&dDItqrcCzCaxQ)h(-OMN=Dh zyobpKqnNvpEYt|%cE@s|FpY<GS{xP!gKW#kv*+CXJzh7L{Si2Rn(}1xy#m`4cgZI> ziG+ggW&;*4$s;US2Bp-JeFUi|-ygRyqiwK#rL~eED!bJU6t>G^tQa-z&n5SFmRk7= zFPkx3*{=^rv(i()0&`>^5FEC}nx#;KRJKJQMGG~UmscK5Yu0)&E<>?D%O|Byy>GPs zv_wM*>UQnH`GOAh&2Qr0o>6k*Dc-jo4sY|^3Vpwl()oFnKXLgZ<>Rk>cYE<N+<{HW z4yOpzj5M%1Z1x6DXO-?d$mx463!T~XAoYR<$`@|kltsMXrS-Y@%1eV3(rBN5&jL=A zB7HHy00V{}!`lQy2EKtJcmJXWA${MK)ZN<`@arCw1Q+;n)6m@Ac!J{<IWiNK$N3RX zDI<9hEx9kZb8<W>(-bk}1AJTjOUf)|Z#-&A+|xQ_V~=7_W9T$eS}?$E&O$c9^#$hE zJ)ajDN;zs{7oRBege>j*e6h1iGzgpfl8}5Q{52hOyN}{RID%JA29IcyE{1~I)7YXb z{Stogp|!~t)g6<&a$f}$b_6@$NYRJl5oAO}8=S=6XmJY21F}w*SR@b!sYY!W6eZGL z`V=r4AHF&H-)rpiOSYC!Z#xuSZ+MK`y<s)b2BceOXTs^?G_)j=0=#l-z&C&jTr}zn z8s#2c3N~$9<u6GaZB?C{Vw2Zx&^?O4q^+$LH6?=SYnG1$K~|85h3We=_%*Ps4s7SO zCJQ-b^r^5cIKF9a_hsC)ke0N-nInn}R~2<wGDm;U+lJx=;rw|7!=QVo0OK3h9kr)` z6mP`!S3x%ysUjZ(x|YEHw8@XC$OB<|=8eb%(w2{zxex+Ny0(*o-ZIFUuhEm8>|LO4 z22YS#JztjGimi%KD0ukVFRj#A`x$X`DLz8u%FKD+Id6lJ&$0P+b!M)hIg>XFZ<Sn? zw_?-v?b63A((|@2%u8ZhGr91f$j_ACyejHIxx<EdE!q-ZUu-}@;BR$gA00Id;c^-- znoKA+*U~6rHR%a3D{XYD8)gl+s}V&@;x+<rBo<w(`*Qu`&u`4w#;2tFM3t6Fo%vn+ z%9Nw;6&0)jZ;bMi*_|oUN}!k9D(0`LBIC4-A(zG*lRbPQ{VCv8HX4;l1B$5kitw}O zV^y70hun@>p6YjwbBDiI@mXUNNAQTlBZd|7$7>;S(3*}_NI01xzm4T}&HU9`JJqYZ z%dGnxhuXBqrL_^i5M4LX=**kU^~R%8K%RF2qG~q)2S^XEWus>>`XQh%L3hcI7Auj{ zg{^)TB1?Nc9&gsJ9HWcd=Bk5V|IH^C)|8Ddj%=q0xQNt*g=~2VYXk4yF38XSyet>> zIs4Mq`)H{GssEMT{_FW3XvUGILdN~0LWY74rA7)TWQ!e}YoNJt;?bJnx^_Knv;2GT ze}B=W6n$6&(a;|g6JC!C&!&9-yW`IC)~PIg24Z%CTsCz<@r_JAF;r<M7-9Mi2d4Up z>qpjTd-+=P`YFJ-G`O%l;H;YgJ77b9ou*Ysk&Q9wGuLiZ-7Qw$xuzpDn;;J%GIdj= ze<=wXUYCU^p~%3my;9c$TWy<-AVi?(5A%z4jKT+^O)>!@TEB=I;9D&mn|y?TQ@|$= z@`dX5K;0W36hg8p59HzkKh_n+UEkFUZBy-Xw==;?K%ifBx*18u2)BY~%bqTGksX0q zj&WhzGQfF6_S8Z2EnDKS(#*o)N&6G}agXA+qWI@7G~yG?+NI);&X`u$vgI))%1U3< zEB*@^RH+O(1+1q{*3V_8rI*NVe-|p(<2#-(Lvbm-?s%5zzADH&GOxc+%ojZ@RJK1i zqIj&Ln`gZXZ0~MD-Ab}f=q!^MfAUKeaFapqe;2_SV-BUU)CkPx9%`W><*wJUQ~E&; z2QiHZ8*$}_f@Uo;B33Iyl820SEA2S>${|ZhWRz$>*@|?_1;s8)9WCk>OMUy-)+%ed zkH(IELng`)1eftf8M$;CfZ(2;??m}^wLhH1B~XSIi((GDPb^A@t#3RvE6V&pF;5!L z?%AS>Z2~Xe%oHcWy&;|%zMzZm3T%QZbk5Auf=ji>VM$vHoR2Jz=Tuum&m&-)M;I%= zeqe>pl&?lR^SbmmJfaoE3e)tGKxSLn*~-n;O_yWjM>%D$g!sz7PHiuy?E^+~ukq&) z;O5DJs;YE9?OP6p#L!k-BDhmERvtN5F+K)vIhghOCzj=dxX6x+EvEn;V5sDnN9ryZ z>Syf#Zo^~Y73yf<#GZz5Sx}20S4fmlg7%vbM&dHYC^A*XBWKe*5!}_Da*GQRz_D9@ z{>&c`Pf2;jXIs0UF(!tzG=j07!+%s~W3NjBz`G;JG=Eyga-X($eRwvL|H4Zd$zR|t zAQF3}97RR*o>1L?bpQY5bH)T}`zc^g=MX_7-Om4z?n3)ITA#G;x&<cSTfuk)HHW`A zaG929{3qG?e`zLnBZn&3f1T5p1eo)5eO#*l`eWorlG&FlyfKkaNGPLTC53N}bvdf0 zh}O7`j<H5xS9iaO>MX;Dhk-4xRA^u+pk8jttq#}xW9g!=`-&c$je&yWef7&!Jo%=y z`=b$$N*hgvpBy%=O`J-<^Bb3|V@{|jEqm)HM8vJV8Jf^2*Vw^tUa_PB@q|~%#FI;_ z?tF^Zl7zGt+d%1cs;lMUFVT7eyNYE|f`bK)iH5I?pE5}`dp7lLn19B0R|ff<0z&s` zV2fx@;GLc74$94JMPriTyGaQrCh+H*XgE1&V`wgZXYQT?e9<6&*^ZTGcspkjY??Zy zm7AG%<%le%I-dy|sRUQD?OF{8(6sYc{AR?jIqfYFe(WRfPB~$h2+D!Z!bCl@uBHgj zvr9ruqM^EqLU<A?S5_Yx4yLIy((F?k<|p4YoGNj%x|FqVx5*twmi`MD6>ZiV7fQ9x zF6>Xt+yt$Bp`}ULQ2!L!2>Ma(t)*&u^6lS-OnkIdM=a2S@10*VShz0LPva#eyZNlU zXeXE#gkc@pQB1ef(#Cac_UE~>h%8j9jvvlviNre?#3XUuQea<3KfO@gNWTUz?^uXb z)6XV9Xedj!-rGf*xo8OEBR+ggEdck(a2U)@N50BQyW~X2Uf#YFX{K@JPq59lhS+E` zr5TZrEPCt!`SbUmq&l3SA$QRKcyPQCp~SdUmp!ddR*k5RCRQF&i=Z_Tl@K9UU`@n3 z6h;{@`2nW20%f6X$LG{G++1fo0p_M5xUV*-da~O$VCp%S?pN*aDG(BkWW`&2Ja9+N zATWKs1=azsi$*-6e4ivneA!qR*<WieQgxc_jUrFDbu+BHaG!z8rdxScU+vME<lbH7 zwIVM3t^0yXOf!_Rm(=^8$PY*2XM+mhvsIsI{IQY}XSDpBaDe(6yh7m_qy@!}3XtEV zIXvexV$4Jz&ncz@*_v}?R?x3T15T23%Mi~92c!&Ep5?TKZ7)oQ2zk0okdPDdldXJ8 zM>coxhh?uLzQY0}s0LZ0A=)UmHg$8wSKA27hUj6h%~D=CEw@!{|7*TjM5D?m8`Ygz z^VB!)O>bMZjBmcZ_0){yeA?2}D87xpdq{B)`lY-W)Zc5rWaC&~KO0WDy&%|?A?!#D z<IzYaX-uIvt_25S+zsKzTDA7>X-OLj1&2b<uA^}5*PD?%czsxrT#*W{gEB~tld&K~ z;Sf=n#8LgKF*UaU2F1d2^`Yu_zPw{U*(q}IS%^~oe2m*cIAB;F;nJ$6n|~9cZiBxE z9!QDdFR&MRxt^#uy4?IF@k;6dAah$T>L*o32-K=mwEQsLUmx6bNM?12`jvX!bFMgV zDWDI*M%MOeC$6@Kh}6AZ^(S28tq#@5l3#g8oOHr%(p1_59ug$tAmeJT*h`#L<|2ZS z^Qt){w<@G-$(&ZbFek2&vI8f$b&gSaH~5QJ(cuLUhoDmch}XQ?EMjvXw(!vnSoN^S zwPYsb;X*{;@WT&PKIq^h@*J&nDPh*w_QJdnz9d?gY!qJXsk&A5@iLycY_x9bnp&Jc z8{<kgD43q3c{`!~7H-*)4<&4iZrndAbDZ~SYH7W%M?ceCfDL))<5Ki0Ei#--9vm#$ zjH7P-L3O*rG2qS+LLpLxf~uuj7T<9oFT9IaH(Dkeo=78Tq1rtUb<*vtk6IX$0Fjig z60Lry%vbo+a)B%6RFB7FBos~htoudFg3+MwqQI_jEUcZaAYXjq6^3+V-b+3B1uA|a z*^0WD?MxEsk0<Fj9FIpf3$5Lx%<&nJJ)WEb9?BRs(28QhHV9xi`HU;f>8Iw=p`8+F zzD|?kR*B+NWUAj(g<xLi9rM@lh56KKtfW6f?96<pCcDX~&a>5>y++-j)7>Gr9X0F7 zk!3(^nQ1u<r+~T?>iu_kkPf6yy&bV*{RmF5Ub|M_mx536Gcz75`^{~SaHb{Pf3rN@ zY2GDDu#s=LtANCF%jD`^X>vMV5rso!2hT~`K}g=B#|fr$P?BzClEat`Z9VF^0*a4i z-DqE<Z65t6lkl>@dkq#Z16S?<OCEveowtGe$V4tGmrcYez~cKRD|IjH6rlW*mQO&M zK^ibK3q)=_+va2H=;SVZ+_gF-yR5c$R(CNge#^rTM<rQ=PX*f8T%f)(+RJk(9w9BP zN%wCp%%-jg<Atgu=Z2V10VqGj&{K7T&cNKyb#>LlTU``2x2y0RTM*k~J#ansr0VEb zx8I)#>X~$H>rpkf?6vLsnMdVuC%b#^Af&Z@T_y2R+RnK7x9EflUOxF&N-WHuyJBrU zJztYk-hY$aiapFR;({*FRwq7~w}%}bjUj}5m1y{V^O_3*XQRnDz5$BPK88O!9wl^F z;;Xt^S+ACO9!S&T&WF{OMX}cn8LRE}&$JSC=}L|A&o#*(fO!i}0Y<fn1hu{DTg7#t zv{Qg}E2SFrH*Rf#ph3KK3NVSg-t;E1U5Q{Zs}g3k4QgC8pV6s)wNWooZX3KVJG?U# zB3w$54!Vao3a?n6vU7c{VkG0&x^UFpQu6-ShN^gGX}agOOo{Fz15VUFcg9n>=u-d` ztMg=nmxOvs)lPo4nea#L{oM(86j?l%IQU38E#sTYC!za)>ZF3r4jE^kvJuTyAF<Yt z+>N7!&L-#AIO<#MK{l1c!=#t0?z@>npJn$TF}@GrD$c!o*@~9*C^7YR8>NAL;6SGc z5!{Zr817?JJy}UBbW3Gf2f;5Le5A2m9rC74E09MK#XC={8}OmnU;XMs>ewscnx#KV zoqKZ~e78LX6ey@b49u?7-MhmRhZQgYUA7jpJ_<+fpPyrGzZBpxL;AC!b?wCb#EdFA zUkq<RF80Y{aCQNAXLi?#*>zcsS-?ou)V5A$NPMKvIJURZ)Fc1??VaB@5I;&5ej~UQ zjUp%d&~{sI`uR>a{qDZ}a0;l*(4EY2GG#GgN%x(dNV)!PL1v32NW*Zpt9t*-*FxyR zu;6eFA!3}T=%k_t$aLyvyqa(~A3TA&hwv4tGsS_-aL9g)5uZE1o1C;$ehncESt>C2 zC3|gr?Z7;tP^>tZ>2-|18kWkndxdxtYm3Wr_v<|>Ik?uQ|8BPBDkIKZsQ@DvPvypk z=PMGc%*w`zjD};zMM$~>j)y$yRQd$Fj2A@I?=-n~)|=CtX^%4s(fg4|nF%M;4Hf#( zojZB`jCkolIQXxul?-Cu-Pr!M2B07FgzbZxaS1ViYsbn^e(c7*1CBle8us<-8hJ;n zevTBnaA~~puH%w{@1}RQ(Q;34p8{MbdpZvX8a*MkWgw%3;<aC&Fm7{U>|RoCl*lb; zjUjfXH}FcI`>DHM!yv@-N;8F?m#>8W5p8;qEwwIYofyQT&21L@uT1ct_kZe7p0OR@ zJO#Xm6Rx^|Pdwi@z4<?sz(~>mQ~mO9r7Zu^`LSs$xCRjgA=4uToppv42f3`E`IhU~ zvn(nm6vHPcAE_|0gmbl@x8n0+-sZx-h^|^#2$`)vmn5^@zZ>4@;Eb6XHKz7Y{)`@) z+AN>aR;*#4xjuWjZL8*6L8ep!IqPZUb;EdGYFp+7Jo2p~kZs<u<ScG7Dn7bM&Y|A2 zWU0=b&<u?^iypdLrW0GxLpQK|@%jR_jbErtiBfeG4RZ*<OpA``eEr@n{-u0K92M<S zB2n#B%~i2g`%O60%2;iJ`8xwM-Pd0sXlpE#)Ow<gY-8h@wjyS?p43F9&{UAx(R-s4 z!{0eBXMMzf`}yAYm4t0T!u#*Xnf6CpNYc}O{I1@Jj4zUTvzZ6aup7PwyU(zJj<I`u zdF));On2?q33*8Y$-TdHsn-LPhKPBDHzQ=DBIrw^Tm5_nDBP#8i8Z8W;xBmGwu@8$ z!u$&(@{{|R?7b;P$BdlMQ^a5rXl;SDs-KhExoVo?LEm;0YBJ}XaM^x>*W3aoEMa2y z;yoWF;ocP=R2Az<$YjjoV1+9f7xBym32&lKDPcV!Va>NHdPu?pUI_WOgKn!`WN!CI zh=&FwcsPQqq{w-A8P8gY&rM{QNN2e|J16CiYjKcGPiXBSwZw@55{A0}MgAu`Dwm+K z(2zgG;i?6q9ttC?tc=2alKE55N2k4zgz9BJE1((xl57Hx{x|l{JF2NJ-}@*k79c83 zY7|fq1QaPsi->d)0qG?wAOr+NdX0jD^bP_-5Tr@(EfDDf0zxPfN+9%}NDFDc$C*2` z=04BNT{HLn_qrDAusji5XP>?IuYA7W4Y7tY!jw4ByYIJa=3VlL`s7x^O<nf=>Lz=P zy7l6G|B1_(JEtXI=9eEA-JVQutA(=W;Ahb_4bLYZ2CFAnm|jcnI<q>&CF&VgdVIoq z>0Z<DbT;EG#|5YQG_TFYJcr~=FoBT-^aa3->t<rKGT3ois*Bi68PAper`~4V-8Yi` zK5}&mnt!q$yPnlEWD?lrD-%U{?48-(p~PQN8;_HpZ05S<zF*bcpkZ|Brq)>A=Bbl! z<K^E(R@%9In@e8azk*NN4np3@>hmg7M7*g!69Y0qVFXP53!|ERzO~&TFZh|Ha^9f} zPEvS$#A6WCwcG}jRJS~u4dy~SbR^e?H_UZ%XO!ZO6@)-;Zh{^B2-b_%F~q|u?#0PW zQBM#C(5}|C#xMiWhAF`+cn*5TJMY3}^tQ*Q8k5phGyBLw_Cuaa2~Qg^#V^mj`^s6W zYeoe&jyWMN>7^2a1dh1`r+AvCy{_Z1uXqKPjRnOI<u+81c~o33&A+ytPC$k{4v?LL zv^z=!W0|BNXJF$Tbw+?f&GVs-4}XuV$i*)(PD5qusaHygM;5T<UY#Ij?}%AT>S9RK zC#)&f8{2sxQzvtvDadg{6X&Eetg&#cC`a_@h4Uu`*tTREn{&5G=|w(n)E;`cfR#4+ z!fNdS_QYP9+(}yiw?F8D2ORlDmkNMw_Z#r+5uQo`;(crUr{Oou#2?g21`d<VN#uUt zzr=BNpSo!u#Wz9L#}_K*e?Hd-AJqX-{MJbuLgha3Pk@cSkmi2)cs~WGXfX4PvJ=RN z!yha5r9SRVfCO*5<J{n;+v8A3I9tA5Cp#5hUaFoQ_C#pU!K&Xq9^^pkq=9o}SBgOZ z775-<V|8Yr5SoFo_j}MVkbJ-tpzGB-RuKJ)Vg%_7mttaLpuHl}7rO;0C4!U$U~6#S zl<&TW$))vF5&OW4_UI2xYExh}r+UiDzQIQOqyZep&1z^K@UnNEYB^nv*y_zEjmCO0 zi*Px*-9!H{6V8rp3l|2+zLLUq_C{$`x`)CGp`zNGyTxv}02Szk;cK;O@Wm}WYoy<2 zAR!XDtbYStSS&oCou2Pi(ctC7_O?k|A&k+nPrjCp;>bjSi5GWDIm#k8_roAwM`=O{ z#M1#OuW<3R77i&a4hMG@IP1e92i9O=s&2FM=QkE~bi8zh2a7ET#NI(#;2O8z;1+ZV z;3zYp$23cBC0HQ+C_E7+zv#T4qwweYfS5C^gzRU(dC3G9B@m^?ruTx5WU%r%>Q=Y4 zTvEQG;O-`R3+RFrfBn-=P?jiBA`N~8)SPIFI(TwBsk8>iq=jz(`8GticA9gGYfljA zrjXTpNu~ah>(9G!rK6`AAY^)q=THk5<piPYb+$e2Qi{c}f@v8yldS2>akGr}Y3++U zOQD;LZx<lQ1Z$^j9irAJayW!+-Yg_9*Lp8MsH>+U19^O6?;heg!Uw;-+8t4ljah=r z?X7G)dE+13fx36JMPpdOi;#|!*!(zaDvdbiEjvg3iid<H_aLn5$0#d6H7b-c=G|FS zsHV@4Im0`NkoSz5*+3oj0G*fFX7fgOnDu^euC8>=oj^F1<L*LcVn=}(T<RU_XHG5w z3Z&9Z-mLS6V^Wh>Z@y;fRY315Cqt6l;P@7(<)OdyoXc6qdojs&!5f}5tU~=Q(&-g{ zA$)K<AH%ZN_v%S?h3cY{Fbh)3?Wcixjn}UWBiVa@(E)6MnCv1IZV6J5ft;rp1^R7+ zytSq>@13p9ac3Y8)?SCtis|T1Ak@cf&Jz&^1cu1VYX*-{E|tMp_Mwf?9RsT<RX&XN z92!lk_Y+1%=!XD46F1wE?_#yl#qR4KtGp$R9l`jA$D!Hby_;+OGC%%tI7Mm;b1>^h zdE8Cj&QBGM?lFqMO3zQoYOF-8bswz~N4kE(@Nln~hT^-t5NN4Gp6Z&;O;+CRr)fl` z9c7>}E0ZJW3OaOe`i7^n#SEY_6$_2Ks$lBQ6;GrQE=m$JZSZqnDXLoj&UIkIdcK2K z;QEP9%H+{BOmegT4fYgUhkRmbsTY{Mc!cHwF-#2Pa9OWA<f8hr(D;{jw4u#`b<(@k z2Ux?p^OHI}gv`jOID_$X0r*m~QIjlW67pkQY)t3M)V=OCi*lDv2m0A&Z4C%P(htjO z9y8CO!<w^x_7XR~dpH6ZMi%@y<!#>}MWRthVuz~83_Sb}b~zJ>J+d~GH}ei?(R7<| z=7IG)rhZ`Q$vb<KR^Mre|CY%eug6;g{Q0`hT7LL4=1XMSs^L*aI=X!}*NiJ=y!Z1T zAT9Ir`)C({?&%wZ9+2_HIGtb5j8cd=OS2h%PT*Z3lMLTMHjo>T-E-z6hJN>IHDaF4 z{Cr05t+anYgGg^`b{{yknS=V(wkf_D4DFU&x9R&}`#lWuTMLds@a;-R&v3<RlDw}y zUt8uTbR7CEWc)#0g-*FLqv*;z*1#lbRwJ*5(#gN$l^0)pQ&UsdTh(b07sK{-r&eza z-rxW22{4ODi%xeURJG%t;Fk@E5uaDQ2Imd&)Wl>AE!aE$o`s`iL?~G^{%&ukzg}f! z!r6&>IuMXDI>i9+vMc~EGyaB`waP5Y(%_ERv;NwMd&5p1;8WgQ;{bms@g_-H-i3YI z!a?UGK`DKqp~^{GfVtz!0$KA^L;0}Nk(Oj&Y5cuB{`KpGjtg%aTim&kJ;sI;^;qt} z!Aw@dw+ID{ji+3sMLRsdqPp=7DKzF7m07*Uv)U+e{XzOtFf4T>=RtPOJw)L`zA6FU zHcy_`H6EAxwCce;QOXY`!B~Qu*4_k&7U1i`Yrrff)Ew<mDW|8G=aO>lFRQG4VX3Cx zDFr&tY!o3hQpIO~-Beu4@`-v6{PBzhN*(MmKJl6&n!kRokfLfggGEq4^^2rxAZKK1 z@<c5H)$Q$Tz(%6;8G!T#LV@(m0b`pOXaUqDBl3kP{sEuA9_(yR+@ZLJx9Re%&(J9u zhi$ywi^oel$w?aXRd)8MtQiZeT6#v6nh<jyn5T=rlMqAXbhW;<yCqyyzdEf5G0@QL z!AOo*nbBV76QkP=!7JmnXg|SMh~CmM=Z~{g2}8jt*nT_<MePz|utXmMa&r1bH{ZMS z2p#i@<GC^IFrbfQWRyqxF}BCP3Rx$uxeQs5Rxs31Qq;2<JZKJCO@|<|+QN6apqm-K zU%?QKx(0e;iFhNh9aw;t)vGqpG~@=~_#q(iS#%2wZ{<@8p{J$T7MhZKoHZ!p{3WK| zgIcJ^0;t+4_*(>w5+$VNXwGC9JiL_4Iufh(S5=LNGSFOQJ)&-fAIQKJG1QFglEu`< z9&m9Nu-i|r6`w5SpmBDMw@Y&RbC<5SfC4oDFG5)}SD~>nr?05}L0ex{HrGPol~nO_ zzEuOd?*jRW612NqG6}do!*!*kt2GVXNXhd+A)|56QIndZAnoQ^oAzN`iKoT7+I$T! zU26Va-ai!Yuq{$rl0C6L7Il2Hq<M<@bhVoruZB`rQKkeA>Z(v_4nbzl;N<JsH8KRF zx)$A^7l9ta_LfuNRi1JA_t8YC-WZa@-8|4e;)D6^%|^@}{JGsb0jptt1ku(D95RjI zsN!+@fohkH$qlb7vSKXYoU-9)4b)pI3I2tm0%UJ+XzI#{@sTHFb^B8<YcazPN*qlJ zK4vvlcN+E+5+T9HZchp(*J_Iti}6!!l;XHs9xfkw9%-GAUdff(SHSMK5>s*5U_=!* z45>G}4h2~_n4Lhl6@10?-T$u2dL5a6PPHcYnQ&p<w@A9hI^HJkeg#{y^|~WrYy0l7 zhXe@L2nq4vmDL)}9`V2Nc{+Dw+_m+_Kt6pyx^9~Ve^%OUS=6yCTZaP#5NR@B3%ucf zgTU}s`nGcx8mXDDn`hDE&|9U>GnDxBZBpWOM%N?(#i$p7a@3e=1P`$*;0`gN)66R2 zbHANislAMjy%gX*(dSrx_u%;E%v_*Jw$WLgvmQ|@M{lMI|Avr800`-{;}FbBk{CMc za>~Jr9k(T_=x9|_o~fZN8OC-w&g7%biwlgl7d-z7gyg&E1Kv3Di|z^-uS@F?JM)W9 z=les3(tjus{M#-Pzu(LScm;$K*K9}Y#&Z6mThsgeyF>p^dN=>gKj#Q18)KtC3zc{Y zeh|x*7B0@cWji=qa%CZd<dHf^l{{JmZ>t+Ntl~NU1-_cN^_~*tJY@8_|M^6Ej?Omg z<Cvp|>IZTyb)YN`^Dh)0E?uI!^n1{jzls2Jo8K+$o@HLix{^fs_bK&jdD<c5^1CfI zWxIM*hj(1tVQLSinZNJjwDb9Z<p)t%;GOR$2F-p}@g=VT(b#N8E<t@QEM9LM4`Gp& zB^{d}7kuyIi4UNAMm=r^Z!??^@Ki8cVfU0-F6o=zN(v>PlPpy#hM!)mb~$OX67N&d zxnu!uR>=1UibzML3$@eqiNlBR%(pMmq4-G`U`rE%cP+EzPL`&;6l(ci)6_R`z;a>h zB<V>x<cK*0U;aEBXYavny(;!07#w}WyxOpPBG;DN7k<CjxjJJ}o>WG(<^sRtlIjLy z&R*Shs|Eyk=Ii^i);DI%A;ZcB{V=v}($^gLK_XX<+Z>blX4Mshy>40JapNt@SL)g( zHDD=7qcXCPQBk>Hu0oLL^QofOyc)9CYoxmX1HF!y*yD;WVW^yD2gmiZhr++y{_Fvb zq0qk!Z&%_PnS(Tpm$oD*^B}%+F(KYLh4uvGPLZ`82#9{5NiA}lV@IN!5{%I<hR)HR zEwa6Fp{P0?R8Na9z|q`eDu+_uRG?A(rtD$eFFNSlriNeZHOUw%BX~H*hSIXjhf#Dn zxak?*&Zk%#3IAleHrDdf<g5BpR(O7iKMbEAQu3`axjBEe;&uFZybqYfC%i8$cZF{T zu_I8BjjRtGCU|$LFa$}Nqt2t0{cc7u-438koLC0$^>dY|;@3L^ZyzExah=t5fsOFc z@2z}_T%O;e_PCXj9z?`+=kNVsGn5E6$Rosbx`4co!*PzEF_RkJCSES7gITJ5EJR~q zO0psi=WQqFbWioT(9d(FyyL;#Jwm(uS~-chcWSRRqV*TuNs9ce`i|7J2u3vcpwz-A zp<z!_#)RfEtiKdA0Uf7=!W5@t<RWIBw!;%4kx1Rb^-mvalJY6qyM%6CG3NbWbg!EN zL@V&!LA!|K6A=NT530~OdhW;Xt^|JaDA5wJ)z=?N{K)oMA*KudGZ4)58!RM1X&?M$ zfA>b`A%_qU5S;8^@-F*D_dtoe%%T8*8d9&Vp6shE8^OH-tJ+!;Cp9Yr%HYmW^1I2& zpPbT12<0CDW@<I9c{%3{{HpH!B{P(r?Dzh$py8!Owh#%5vM<~#AGWW(?)uWkg}lfC z$cw-~d^=|WPIT<vojr4NTiwwJuE4=2=y+ChE{zpvbq;hbK0=N^uO_5!l>oIl-#elZ z+F5PW0cU54Z4gzu{&}Fv(GpXl_I>og(~4Sy^>UWOG_m6&5_%hPhO~>T#jf;&-qUZ9 zpeyi8;VQTQwRM`JyJ!_{^jqOkpz7`dXh80Y)6w}J(N>pY?;}y@lL6^cA7$(Dp^{+B zx=dVtA#K6s<vigs!>TqgCIOv8{WEo+b=E2*zaWUS40|OQ;r+6_*Bi#>D8z20i4u7A zddpG`OWi@fXCe>*bc|(`rn@}NQaPq~1pV}g!I1v4P?Lz%Ja6o8>CIaJ;AGu%Iyz_> zVLM%I5Z##)x2vdXQx_sF#<(@?ah?Fg@GajesBAP6t!7A1PsG)ks`Jsx)uO3%@R1vV zxB=S|7zJd|3koif=GQIppta-9W;3b*C*wKKKT_o6zKG5^R$%zbR^hCga<O*V5wo!S zW9M~pr}(@kWmpmJkgJr>a33&akb>g>Mdt?DLN&t?OU^?UtE19`Ab9t5w!>IE&3uBA zAPj_50>C@@3ei^W4rhmvRz+Q2<S8FyztF!&Dr{vPHL0`9;WzQg{Z?Z+hQecSs)Y-e zFy8%JSQ*O*E;BO|rUxpXe-2s&{#@t(gA>AE#hGWL+8JVf!xucZ-z5LUwtW0J-9NW! z7(Fjt8O+#COX~<U2FD$gwuIL|O60|T&A8QXrZHC%DCEF*HqHqN%`ZX78$YU=z8pET zNzns8`+871&_(0b8WpNbzC9OfYbC>2toW|*%3E=Mn>fRv5Ka@Db6cX3EkrF6FM7t? zh`8c)%}cQYD%tBs8-cg)S#XUXctC*g4739cOWD3uhXmx5@Yk3j3#$|YtUA4;oM0Hd z!cpwm{lffPd80x=j~{s7f_|^G_o|V7yTAz}&SN~mrUQu|30!TT?C{Z_Q_|Ryv+Fa* zX7p$yk4GCtSR9|G>8d^H!EfK6x_@r)*-R}OX+k;DDMf_pS3_3P_Pztq^%`piT&ILI zw#ODY764td+qg7jj@JG9g@aG9oV<^Dkd;#yZd~U^y#9nV9K#8?8=|G0^s&5J7c<mx zK$Tx)COg{wKzU=KHi3o$cXZVfXmKyeffGDB)CuKCT78MO-w)^U8`?atc16Anx!Ez{ za3(p4zH%Wnk5t!Lu`6Cv*M>Q0yMkTni{TJYav88<A4F79Am4sumxl%|RD)O2TJoJ4 zE}1Dy0&`*ZyOY1FEv<B28^xD!?>m^hstp1Hv*!1HnqoNTArlBbVJ%smDxusUBG&_x zyAR<vL}|UGsG!fjesRDq{y=8h90@JFK(*gDSSedA@U!>u+(Yk3yX>w982xB>J0^Qh z_E8djA%)4616vgnI^W=!!LFm*Ru}p5*-&Xzz2afy(iLD)yi__oXkInKaoy6qkGAk? zw0J2#ajy2QndG?JfI>`I=5dH1h9i2zIHR&`-zb|QZ?5qah;l+MZE`<qXv5hE+aY7t z{ialNvd*w(;tY8I+1;V*BxzqJbq^TZUX!YVUO!8uq+Ey*-|VPcCq;V;O=Fl9S8L%Q z{i18VH0)8N=sRRr*;v=~I^<sLS6*G5XdnC!U4TYK-F<KTbmwXl`eP%WN_dL3A9m*Y zp0M@V6VYKT`<Ei{1!{21slUVIVK1riIsN-FmH<Dm^*4V0UtJ{?4Ck9gTV>_$nPrSm zd>Sts*DmKXKp|cZ_3-ESGGmj4Za)X5lxmdt{)A%s?h%eJro7sNg1qe>5!`1k5NunD zfF-<+{e`7seQje{D$^AHo(9Yy_~NaBn~}z$f#Zl%6gRS#<CyOU=t++=e)Uq`lXsgM zVwBU3zDpl(h(mm9h~GD?(J!PgGAa5xahQAeGb{bt2r(sRY7Jsrlj(P8Y~aKXuQ2O- zS!>KMaqH72SKP@{bxX0I7r)zG%i1>n>Pq`+784RE<{h-GObp0h4b~?{35APGr%RXD z>F5tzp2tl&PhL#Tlux~IJ&xgKvgMZsUgM3oWHC$HAWZ}xFk1JvdYd`7yM5)Fg0Wcs z#OU_k`^-seiwixl#Ybd~^BL{OqNc*>_G^hfbBV;3mZNgjV0?;FqDMvk^MIvq+KWC- z6;<1WI?pX)w={aZmxVS6z92|k!LqXdqHCXbi8R{umvl!FQ!_3bkmdVmLu8lOvy;il zpUB9=P-ibUiw7yd7|v<O9D#)uP;TN!FaSLuEpMr%`J~dvZoDHlL&-RxJD|gH*~ehv zQ29NB&X0@Wm!oIO&MDjBL=|sjx5#po_bI%*oLJ@@!Fi{3>9loJG@-^aSc%(S-W&`p z<?Uj`+U5Pvp%$YGqJ=Y1-lu5&YC=-AnX;2om%M$_2H%<~ZRVZn<*1M0>|q_9bw{_1 zGSkUtiHLSEgFi$5iV}OpP)&r(2?wJVL9$qXGcsj-M<&gT^O;&-kAe|eb@^zkn&g+` zS)dyGvPg;(SxNR?3m8Uv5K5LYBiglk`J$)R__+O?PV6tqvZo6)MYnE4D(AkX>XY*V z=`Xx~y1ofHsl-IAf!ko|ysZGC>s35B3~<mL7A0p~TTMv;?1pmgY`QtQ(u-?c&bi~p zwfVR~{|ID57Z5DF0Ik&upt4O$bf{TR+7a5Y#!q&VTv{`9b_e;emO30!NJ~ZpW}p3M z2|7Q_LmFmrH%_D}))ZM|*vI=hht9W^5ZWQZh#<cAHr5%RV~UYgN1fABFH4ePm|J@I zykJMdQ~M`n!<UzB8Ag8SZLX8VPoQ@QWKL75F@{#e_woniKUqMusaVd$0bxh5ZuC~$ z7G{6!$@`_cB%7%2s;d{j-(P*e)nifxKxxka=*`@|XO=nd6?^0uQ+ITBW9lrxiW$|b zgxug!0dgFN2Z&cadGNNI1&;Z0C94`Slt#??uwAi(m{n6h^HnCe1agJcWH#!LLQK;< zuQ{~HR#!BV#p+Y^080skpW#d&jX*9U#u)<gubP;%I{_~mof?1+v!BuQCGe&uP)rN| zftHGJV*jB6J7z?PnN#fwY^iw`t*Jc^7vvkePCI`H{GgsdiElYM-Y@&^+!cEaxEwC8 zZSPt46piSa3C366NX!-Tkq4mrtMUI0jWcG!xnKZ4Ebu5+yRIq4Vk{vzZ}lAaWD;ca z&DWTGV-b<pqk)%*3-D|h$t$=ROEa6PM>cmsmeasux}#~;k8+#PBQf^1W|^=5tH@r_ ze*WmUpVti^%EjxvFveCtOMv_DTX9s4AngL9%1e{j*G-~bccvOljIm2Xm<$+MepN0K zH{Vg`8yexPJRr^K=A2J`&vB0Sc-+JK$%#~lSaTIN<c&x{fYH_4U^t4{nqMYLtZ#9& zPyj!uhA&JkIF9HCE_-6~ZS2q8_MM~xO1Jr<ZoUFa=#8i-dwX!zFS-zS$C{>wssNXV zR)OQ6HJld*3$U@MS8SLeZA_nSeirqEmv8C;9~)YH{5)*mY40t(tqAf;Dj6(RmbA?p z31pkkhcq9hO$6sMG^z<vE`IN%<?R@}+Mj&c4bJ?X!#pEN?3qok?4IYpMOAeg(#3qW z0&K>Tv3Cf}p@f5ZzVu>${qfCeb$nh@kp<Msikhj&ep}q*#?{)%TG5A>-k$v$&hy4d z+=hGo6E!7=P!=4>?j2zSXm|Gln77s}Rodmmt4gM(9i8mUFFv~IaQ<eFu82YyZ^wL} zX{@|@P~kf522m40IFsdS%HAp5nA?0gX;l;5Z4mkp{jotuZAQi}nlou6Ou)#?*68c; zAFq1~S}ypr<GosWui)BSGg<J1Z=O3Zk?-we#8ZyHG0=R~H1X7s@duqv<m_n+>M+P| zqN>f^CA>w9u)WzoYfwnJP5=iztHBF}b%>U%rP&mDb3erI<3f6uW~0)LFSRXyvurB= zK{__MegOBK*Qw%*>l&_G(g5fB97O)2Tc9X$|K9g-DC#YubMwn+zvr=XUel=c?;T1k z^#I*s*78x@_g!xXgfOHV@x|ASrx}Ie9`k}hQahjP>0$<RK-SDfdzY%wCA)haXH`z_ zMge(%NLsk4Jl0L8_Frw9|LyNT0!`y?EBZ~Np|9%)HuTI0HJ)&k>Xif|TeX)FNXt}! zsC(i-5|RrbO?N;RXAXpZ#=eA{g*_o`$Ru2ot3i_PeS5(b_}Fbz_z<oDcEIKVhAH>- zRgKjy*glC>AFkSW@(1n7><^_7tl`o*Kn~QtbnbptmW{24z{SF^QfsXVUt%XTY=)Q9 zwG(bnp8Iw!;5*^)X*#v0XvH6D63}w)7oFIK8g$KC;TIiNkSe?%<?px$vgU*{8~^l$ z{G>bx3jdh>y9cY$HL!F$^_Kep-_4a?AMm@Py=+)f4yT%)f29$?>KX|CnOOgeZN{I1 z_`g?=|5io*$LmRHUOB9Bm7gDA1{$On8m$UM+O4IxX<QCUOo{z-Ix1fy<kRmXuV@?Z zs~qG|Bo&M5v#Z~ls;JgEhq&c(t{rT>lmm74neM3$?=|`OD;CS1IzGW?IEa*_j`Mw4 z#x%~lJ*wGe{z1&w@l(7z#@z>#>lWDp>#YQ=C-O0mQ|NcReRs$YT778!BZ7hj0CtnJ zGQqc(TQ~^lg`E-bL+X-OAt+)78Z%9Ux&kcS;9I4uFq+`VgABR;Tt^K_Qo!uQRldTB z@oCM{w8{^c8DIkT4{jPq053&WR`!3LP4dZ>x&Go=-{6_#aJp|uyk|<F+vT?vkeNq7 zyEWJlHFqpzYH4gouUa5Wvrm}9E#07MRwzBvKODUB1a7_VX??&|ZSWeiG<6=%#vlB7 zeGIzpUgTJ@?&!{j5~2&NX;Ov2rX|+DTlHekIFfc6f)oOnnvVE9DKg32yqqHkB62xH z$Lhhqty3uPz5dQj{{?gYBU&x#>c@}!)FR~e8!U+r`dgOvA6!8K)G%N!My*2tItzH+ z^`ngb!ma?n{SO{~bT;2}zlrg@s}zWoEdTms1>k1NHb!Ur)|ZhrLueJ0YyV7?=qj3J z?fzvI_?OqETSX4OHMLPrOVheM=c2cM45G&pU=ICP2R>OA)_MJygU^`|o7#Qkgrdcr zbLfuOjcuM^v8FX%>83n@r9jX6yUhOJ(y?o+HOr{BTWT0~8P(wJiFQJf*xa%Bc<g$< zbCQj|05GMDA7=;LrOuNKN+@U8Mpl)Iq|%C4yo6KUSwl9u58x~brhaNPz_!9Ff{L3- z9>>?sAMl){mLqSwU3++8yIS*^Q;|&5^L_S))sAlpwLoTEQHs|5{*h3U=#`T8$*jLP z=jG+%;0>U1=bwNgNDue9@Zc|GoSV1B=%t9L=P8Q59YH;dIWY}YT#QcimoK=rw0*Ze zLHj+z=(;4p1-_=&oxsj}0o&9=QYTxk)ZB6tRqUsHx}(WPmdVE`{-_f`UzlM|-xvXJ zYa--_gi<t-&oPl&bmjrRUAG6Rw1_^J&R{N348?J-J<7bbuizfD0+nme_Uqoyh0~*j z11md@oI=DvPsJ1Avm1av0_ZenvY6J^ayz;LBQUy|Ifyv;@tl&@WGVZocI?_PZWwo_ z$mfKSi4Akqu0XIdOYSXyt&Uwi)f0bZ`fUNrST4xx;y`q<gQwYZMS2S@7N6aRK0-f? zF9CW1AW!a$s%o?19I1H(@!ZFAi|Q7L%a)VGEMUD_>rX9k)pps&((~|0J|3bMf9L15 zT7s1(?el;_pNA~D;)(^$a1b0~b&b%t+|eSM);7`I|6~sDq|6uf!tE;X>^DjizF<#L zZsResw2q;T4V%Oz(@|O78+$(H;>%P3wSQdawF|(s#A7oqwk`%4;ByMlc`F6TT*&Zd zdhS*|O|#4Q9f!m(x`1;UO2?<Yi?<2zFlilE^KFyK+m#h0*2pba+739^SB%xqsO9+M zeJ^6oO@E15s%Wd6*@QjGBRSPRgTMBzHMEfKWx%>txagHhuV?A@f1X;09P{E8I7ldj zJy6tCWgg6KVdmh;$12&cl)G3OdVIgi$I;{R=PZ-WTC=%(?>_#bb1xkjkR8vbob+ko z^p3!#gi58yuzI63@R7CX)iJNMj<me&s=jAe;ycB+^QXS)Ca*7lJIWn<CfnNn_%Avj z!0aLV11V$0nNB##6+i8}=)XR<9mX}-0iJCCg2iA#6w6s?B><$;jQ1D2Qe-FV033aK zks9)InOi1m=GkCNlb8QwVEF&I!vEuH|HtncrybjjxF`{qJL`AQTe_SRA^|*Zk5E+} zC1+@g&Itx@+{4!w6G3*o@N?$7M$U=mjYH{b$l*ob(m@h>;mM@;Pt5IP-n+M}3xCX> ziF-E%#JRvzq4|{5JYJ7|3A!sk!d3WMY67!%L#$D4kpDg9TLC9ToH_7)Sp?h$6jenr zq*f|ujb&aTSS4}1Q;={fgw3!up|>xgt2KtVR@v^~R4b?homEd7iL82lJo$z;Hkw3( zk53tI<<~XR_Gs|bZES5f(3Ic?ni41AYkIlHrN+Ie8blY0V{mR$LS>Z3N*rj{iNJy1 z@<Y#`X}+Q(XA{wZftlWOooW7V>Ph#iy-8AhPdD9V2(Y`zoVY|?Febp8fza<eSKydv zz$sF*I=+a+?QSGVQ63sJUqRCvMTK^b7Mm06w41<9BgIgqgfb%9@bSL=gSWp8^z4W9 z+C6x`P^aGgqT4E$zHFL2`MZ*M{9k-=T3y3GNSXIL;!-%#`Le)Etvl?J%eDaXBXY3C z9NJ$OPfov@-hnauMc3Ed{<irYyh=zNSb^NOEj!tYMYTke)|w#ex^amsUAn3E<QxW| z4tQ=C#ibBC*^9^CfxvBFgowTiEb!^BpP#8K0(Am4F{v`{lQTb$))_5dxBRjsn(nq1 z&#aEluX&P=W%XCYEt+@A>4WwN7qwSH$y!RLN;wRevWYf$yJrAm1)!^1Y}^LG9mba9 zYpA&aTzC&YKWcZ73nSI&F?`?pR<gj)zEivI3WcQbvEs`d9581W&a0x`kAVb*@ox~t zPwXT;E+(Rdk#c^7qCLkAWgc|R$;Xspjc-b-pPr44Q?35Gd7x%<C%w*}>?s58iorOV z;SrmsW_1~ej=E?G_sMBzUP!0$_|v=3+5OB@oi=ANUjjZN;{=?)YV0q%iJV)7v(q?D z{GSn>ioMMrC2ui7%<E*(zk751@yw4Z%Ne3)$LR^+eP*I1K^-R+8X*m4#Hi!Wh&hP) zn)kgpuT6gc(cWM{khib8>^^up|JH?zypRqoCU`EtRmWFMv<rHc!ZauL05@gXX;<Pn zR?E_J>X{z@r%F-QYti&aB6FC#8n8d;Y4;(s2<kgC4qAE^fB^i-Xn=07_fOWce=Vr~ zx0v>CpAqeWyEq~69Z(L1K?wjxdZY4adMV&rK=S>q{k<|qq6Z;j4)tX_6vJ0HtLQk( z5sJJua}~X*04?xlD;6lPtBS`gTtX$C_)#UB$o8YK=Ziw@9i{&476mjM2I8Y=jc!Q* z$0()ut&82fN3d#s^29dZOwRl5hR3to%GVQfFvctV3|m?X@9zo%fRTbS*>bHB6tc&F zU+%s@fz1t8dwV-riOZzjpKrfuxu)&n;n;|o78|GXq{<A$2ws>LV0$b~zvUo02Vn~w zpW#Ql7i?w`>&x&&N8_<%I7`&lYinxJB4(nG7lp~Magwf(8V_r{#fqAc3F5U8S}i+H z#Nx#3$hW=aP0{WM2Je(kOjJ^JWB80?!m6Bq_z*h`mn<(I^3?pvsYT&SKeo8<JU)&3 zW6v^wo$pfB_gL=KF-fe4ToaXUVf-zvUC$d~MdS#SK9aX`Q#J}|H6Hfl<@ltn(v?xh zFxE02pF0yrFw)oP<c)9fP3I7``cz|kc$_Y`2dpkx3zqF!_di>_vdMOkUSJT8oTj9# zkpeGEY+6D)cudX3Go0azxK+1Hd_`cOvjjg~kxRTX+_hjaU^^lKU&gK0l><v=z$jnu z@#lJXKb847wBmRho@|v#jBb<YaKB6Se_ORrx?H<B^5n*p3M-+!)%5IjffdJhqwr^C z3^SHBqsbW(p=Iebt7`c|_a4nXC2f&9%1N%Rg}5h?fE+FdFs4238hDYKrEvR`Rl2<9 z^0)`jCizOzsm27Q#Xv)f#^*?$T2+ys`PIexx}h_2_yRyH1c^eMyjEkM?2z++S<aUk zfJ($hh^B=a5SwuDBc{#WVMsxgb;R}z%<PR@2ScH$%q>dP?HY-9Gmr~a)x#9fV<MHh zN)F6Y|J?CO71-{45UWP+h>7ug95A2K!9wpkJ%grAE+p+G5QaQGdrSi|4YZ^#P;|G( zX>_#8MI;LaBJuN99TkOSDfpI*x$7`~FdScyU?%<H5(<-MSrOg*eq6`#$$VM3QG`?@ zEoIJ9{7Gz@u=!*iAHx2HwH2iCO(fnCg=nwkkm1K@b8Cuy!SLHZ$^zei+5jY~6YXvB zQ#GA$bH_usCTUhujy=!8N}tqP&1uI@=3p-4%TQ3_(S>}8uo|j=s$(1Y2=eCa`gUz@ zgo9k+Vh!&Dqvj^--$svuWkW9%i^}z?AHPsM?z4*Li1EMXmQ5U<G=1%BMvQo13g!#K zO?9Y`#;wi+$G=eITuZ&Ve%|BZ&R`};%qx*Es7uV1kG)J!Kt{21UMANf<_>@Co)!%s zhS=+#T1(+SC9Rxikq{%G7q+o5IDAL6ysA0$Vcq%GYi=D_kNL;F@N*hr1|I@1KLu#Y zpufE=|9EB0F!++j*C77spiw5tlhmKKN($D6@r2MOyf%aMm3IXAp4Y4O(g?)EXh+H| zqWK&mxP>F;9zG`29dc%+yh)QcB<=}YQsqsas+04E4>cD)xS0c1CI3X8FZz{Y2eiKD z@K{=h1RJ0T?r!&3PyA0XgFk)NP#RASavb~|A*x*1<6Il#eF>^KXY|aZZ{GFJw+`_a zXIN%R0k3m)@^g3(_Yi6$0B;BAMGbwI&HhP(EPSNow5*}Q9-G<x-AbTIZ*J#w#dj-A zcelu0AEwx=A3u7N&n1*3xGbbq!7%y+NDuYEp=QADTcq9O_M_cT%A0~<Yf@FO$fp!- zNt=A`g8}YjP<*fte61$nr3Be;2eNy81ci@sh($~jLw2Lv9KFGZ{Ap9!G1h#DbWrig zy4_j=W$2yMW+14ka1~JUjGJFEI4lCRRI<cyiP@p0eUP9HEu?lOXF@!R`ipLfZ@L-x z+l)DkT2iWhP#xj*i>}nmn)F(oB6u(aFBy^uE$vnZe=KPfUP#%2v;%$lzc?^I6QW${ z1CyrZ4I|b8HBy%U9ke>u@f`|V=SmfIj*SezZHL7(`&wEP0g6d7q1#s;aG$z64WDsB z4U{P3xX+aBdDX_yHhSSD5B4AS9DEFGDG({1VMjab4nDERn!E)ge}bl3*0<mbmeIC} zwx%Y2Jm?}W-B8TUOevy(QbkngF3=A<(Fz}J`FLb6oMhWQ*Tia-Z+igzK4vq>HyWVa znq~{}zpw)LDsgm$Pujq#OiT>z7$kI!qI?rR?xz80*p$zxE1*(-f@~S8f15Y=q$e72 z{Gh129JuU8yrxYj0xb&-c#?1ffk$YmdT1HEVbQ}0N#jz?cmG9Kc4wc1XoDEQW<>Rh zvXI?OBPk@lZKwzVv@@wrxjYV(Vv2`69sxRhy<c>@>{5OvhtzLMWlG89@xvsFIlf(o zVAwkyBd;_16x=v+4bfY#Te#9rO+IF1Ml9-3IwCK<u2&3ON9&izoEP3p=9^iRRDA0U zZ}V`vK;10OWgzbZ+L$5&y{2_Y0{~O5e|nDkW;E2LHdO^Hg8=cSMwiLyx}`T}f!aHO zyI4mp-&J(y7{Y^TN+@cm))R489&Bw~6f};Mp4&8|tZ^BYrZJcMT4FR<wKoOr7Gnd{ z0#1IaCRTXNNnRo-$Sm>9c~~kU`|Q^H^0e>4Z)_X)omy8j{<#hic%<(=WG#4C6cV7U zXf^U{A}uLJ=8m44u6C|W-_A1v6qPOHT@hRIWZK{3)IXy`KxiHJzco7g$LRMd5j{ss zAe_;usU9r}M7!9*oeDd$)nc4Fk$qCSNf$q8gun2<)q2cml$8#9)xWvP*nXuRm+_wy zNJhHh6rXG&SI5*kS8jCrNt$R_(#?${3y3E=SEgfSl8eW(k@GZ;XC?ER{$(e;4IYj> zQD8DK97umGZ>th4g}`6H!<!!fI!bMv#D$C*5rSp=-Kknc&ZSDArr_RkAK-zMlJYC- zx;77g(OKmM4g;=&4bAhQ$UrW<=({~$qvH+E=f}?4)yI;q*`HzAWgCQafVsUlHu2*j z0z=m(^Kx-Q!aw%3O?un_;@pO0Y&g3eVg`Ekv@0POgSkx}e)FwtYv5%!LAqI8ileP; zou&*^#7_Av!0AwP{IS|N?Af&$A^+u#g$Qjnk}}^BATeN9+QZoMT|gs6pVnfWqDmr9 zUq62`2sB(aWFQis9GQFUcNO*Tg|VY~WmyxB`(51Y@{V8Mb@kv(85UGs#}QR2A#Ym| z_kkn2+Q)?uvYN>Fk>zoRjC{h0re0yGw}2z1r@|iP-265p;|lG1<ybbf$*FAhO9c=k zG~87x;T~2eKs%LqE)Y0g?eXRWdt^=L<sUitanB8u6*>NKNI7r<5`C2hPKv&%0$7C$ zlun;<EmpDf`Vf#t<r;VlpGv$+6)mf6jQ)8^P+zdXSMvH}_&Gz5K_=MDm71R(+}zqL zjnC`f+JFm6@6PYL;VI`+-9ttd<RK49wi~g+kS&|C)jNTU2Y}-`?<U(aklBS2$?ede zj0B_fl8)w!V;eFJ;62RIPXSueYFG|`?YYoN9GGs6X0q<{QJ1ffVZ85993mWbWP_W? z1&8cZtRxzP=ddv?Ac7)xqGWGU!{uf$%$sXq0qmW7`WIcU$I$(%yaihi#nT_c8S_sm zW3<`}vcpgP4&oK&fnH^Bp}zz*lcG{=Kkj5(bT_v38NoavA|&2){@rEd{o+cCT55R? z;5L}UD6`Z6p3ub&G|0YD2y78=CIsfu&Wub8=s0Qw)6U;;5W9pps3p0JvTl4E_JKZ& zipc9c{4^yx*23>EKSUGtmfKMtcQV_#-*RS&Usv$FfB=Jfw8?}`^gRzFV>KhAhmV4e z6mJ7`!Epr$-r#<7?f2}Fi5k(E8Y{~+-<p}C0H2G7cWfIP<4q9`BA-KEvfZIO(n;q7 z3T=_G$6i4Fc0sk7@NPtt<-b@7?ZE34u70*RKUh=Zom`|g&VXgNcxS9O8!UfJHIPJ* z|AbxomwE8t*PVY{DgMd#f8OT-$Z@mcckfZ{cki(kK}v)f{)Zulz9hqii{OIX>{p^a zpD_Ign<bO$7o;C7xBBYf;;v-ax7J_mx(!fS7W@aQpR3Ged}eCMa<Etn>E)26g!Yt) zDWju0pO%MkU%}zA0c$16<t<zpPX0Q4`B?+z4pyxJ*J@cZgPC=|!Y5uR<u%LYG}c6u zrg3Rf$yZNs@_LDaUN{<V%p?iG2e*IGN#6e4ZD!!ump@HYlj7q__D<Gz@-z6+F48(5 zr$Kpyjt(pCrj=O$M3`l99BTJ`O^j?icNyaYX9dwfsf`acZ@);IYH!9ggGb>aDQd(L z9<SAW?~nmq&|0)-R%-C11;Qi`EE>SfjY(+jEE@JYY@&`+UR&p7d=^AxJ8su4!QLyV zGE6rPZNX>i;sr?Z2C4_|X2~Sagj)dOZ#<Cy^9I~(imBe_B}hfvgsjy6d+DRi0I7`u z1tNMOxI?bmiQIqmrTqKS?B{{Dj)SP*1jY9METa_3PMe+@aMQ<J^@Z*||D6;UyvqJ} z&J{<7?iUdoaEQ0S9FOkK8q8ZU3oN|0UO<e|$1g6SY(H(N+7CPWnSS&hyN@E>i!atY zG;y{u>usP`J;A5EaVJOgb1ir6nA^KLlJ<*cQ=Lk810-9&y_Qg!(q)amx6W93a+c*Q zyUYc6Vm)vMsg-R$ZIp|>DQ9wewK1@&AfO4_f?xdPDkw58YZPap)xn-99MxI%=BfI% z^q|PNg}_sQfb<O!(a|XJ$|H=%>YX*|UDn1iBZwTnmWQ?-5mOqJ&JHs&Zqar-qB*rG zw#-s@^13QrfPpG-yd*s4ArZRo4hO7^W=NK1y%R_X@7O~0{t~{MH|^G35Hdlvss0$r zn3G|%!DS8+l*tU7+Q`0aL@<8mampVe6PIl<@rAj_X<2N<RWrctn7PViub!FZMw4gA z?JST_Hd5V)S_YY8i|IUY1Huov1z+ZTN4xzq=H|RIPPZ?kXPc}QI~R97H#qtiQ?oB- zgvZqRc?j)S620>L+3?F9yndZDK77nu1w+R3u!EV4BPF{(a$(t$pUf9tgy@7XJ5+pC z6S(;7l_ca(PVQyz0h=Wd#<-mWaeNO%R4=_kNF1M$B6uu*UOBb@BR>Rse(j~IaH?+N zxuK+_h}oi}l1#p+R02!4&>OS@r%g98X0ptcq?W%^!Y1U{e2zJL!ojOCugvk|gkt|@ ze{%*>#jQ^vNJ@E4^Wy2*Pt@#Uit39o8fe%9df|RPtiC#;2mPHqt@%bE=FqOCcok9A z^>%-xc?@&VX%@uW=41v{JlCu*E&y$HYz$$o3)7c=bdTHc(PQD=e{56704=;X+TEG5 zoTGb_x=a{Za~)2Fo{H!wh2S#sXHoMu1igavoam4bU#5hI_`x`UMS_N~w<tF(16VUm z&H7Xqq#wvP-whWo?)#_Zp1+lS{_A=ZaOhW*=&a3DE6g`pyFSk?{@C<UAS2UDN!kGB za%ASSFt=jwmsUAsxx?Y>@b&cbh+MCchcGU5betU!Nw?i3FtkGnb2u>}tGB+YpC{hi z2+$fk)R!I&Lprz5dfUT0m1lKe0zBL$?Dt0bNgI|`)~lRl%Gp8GN;nTNxq(z12yiHY zc&|tor9Qi|AGyEi{6s6CZ*`Ax-tGBC7d>uO%wuy_y`UJ&;(b$tkef2G7a*ZKdXcs` z+W0MJwVuaV5L;E7kXyS+uQ!gAn%~NeBEJWMmQsCZ-LI#Qj#%{rkQz$hyKvbtYOc~{ z;?BMqQL%uSrs$?jIOe%yZfc&FpMSq>*<woF<=hiz?OPy`_=2YQjLaIPe*1804N?^h z2#Q$NAgsGzvt!zBe)SN8-X9X*efL~!m@V~FQzbI4RBZHN@{X*e9NoOj#iRR76eh^} zKzEk+pM2&-7p58ZSBSE}X=P|UU;bQ77>!}HxEhGlywkWF_{T1SZGBuQ3QtYxuZviy zUVZ3$=n}apy^X>TLz#cktpwnqH0DhdvGG{Jh@UF8+fmgO`o~+4xlb*;K%tpDi=yyO z!U^u6wLN&!zxi3f#sRSDAx8rz$)NuDbKvco{y;YO@t_q>lm|jp+zO~@lxBRuTf)}) z=X(G}5l;k?N|o&(U=j6l0=hxp!Nx_DvMqTtQ9$JIr@KJr!gLwGO$)^y2lP=}lfUR9 zvXsh<51~_@)y6>1|Hqp-G%oEqEEUvp2B7Sw>weL3+zGHM`-!UGv@aF?(>-;HR7yLF z1or0ujF6gKXyUI(&Co@-D*$gA|M6A~5hf7|-&G<4-5~}~EXDH3o-eAGHeZunU-rja z;6FZo`u}^{bR7T5(?*7Vfz-k$Xi6YvA_B+Ix~ZZwA~l(z+cV^hEL6C4-hOySG@?-4 zN<KN&?EX_xxA#16Z3n(vwf$wN{~27IgmN65G@l(0qn!J+!sXIg7Gf6C1dj0+Lg~~J zR3qzP3*IR@@y|OdQ~1o(1t4HyH6c2#1KmH4?6I!IMSR}xGnM|0nIQ3hqyC?b`v1+b z|71mTC@sq|bKD0x`nfQTB7>QD3OIFMBL2Aa{AuMEvU3*-DH#0#o$~S8%*gTHo<(hp z&NIR15E0#>i{GV+N;EqCo~3L=Ffz|MVJv&N*#V@`Bwl>_i?E>NqQ4rk8y7<~=VPs@ zAcWNAc&8g9D?|FeENfPhFH=7^^4{HA!fDJHMe*B-3bNc~LndOj$mS#d9t4*;NC)cp zS_|J81vc9>4YsIG?%K!F00V=axi~GkElqmyM{!9Pqq~sX-3TVQT}&8+CB2I)Ke8BJ zmv+YdSuz@@vzgS?`P}rQiVM@)9YgJg*84X+r$3}kVhZ6b+kdG&jdZVh<WO#*wB>=~ zQ?;T2&Sevn<$rlR8(pIV>6SHSF)!(DiI^?1Gk*n~1kB|qYHDrV%k%N^7dF8siJ4x1 zI(A4jg&?#E$1l%DXC)63a^~LbZv+{lJrL|aCZ~&S%9*&4S><0ZI)mGMaE)-H5MgkG z`?vm$7ubGuzCRi`Etl^u++a1VBjvlvs%M(`->}Jl;V$S3<p?~7rD&%-s2@hU%}X3z z<8pbQy{r;HI)=L~v!(gCDag-j@lnzHgM4|D6ECKibI1(#@%A@hX)X~+r;n!7uzZd2 zv0g{X8R1&kv(&NG+*&v8n^RNq`*|mh0!?TZyN01Ve2}^AA80jvcSnTf%khpDF&zor zv1j8O$lFU8CXwNvjy{i5$Judn!NtQe-5E(Hi+7_%;B>UFTpX{&s((BkL#o61Vm@Mt z&YjMmfL&j$qA~fZ!pFrg>Bx_#`ET0RF8jnqukED?(|@Drk*^RT-Ec+<=j`@bGg+YX zKKs#S5$5~hp{3ax%C6S_64}Cq)Aa7vdAg%9H_lc3d~LC}y>WTYNxroa73wck=#Y5? zzh4!2umj`bjZUS$Pv0Cq^;BCsLi6#tmd?beH-}B{&o#W>#|YDZF`%8o&glrQ>f5(m zBp8MHWLqe^+PWj2G<z$Q$noA1HgAF@T)7}1zkm3;&dI~bMyUypn5#)?-400uzpY-6 zm@MKwIv_861sP{kpLF)IROIKZimf|ftrh$KHTLkg-UzcF4$*E2!EL{msAkeB<*!Bl zSXZn%o;hYeZ5wXibBrPSp1MVlWX{FN;5a;V_6__bq_(tFK@|t$aBSgk(9Tdd8EfgS zGv>2+dMoFYBjZ_qesMaDl=zOt_X$(~y66Az);f;+=zc*>c)GmKlo;Cs<kItHEI^C8 zVSD@e-h21tXxQRomDH??@I_>`VYoCb{F6gbq{#ee!T<MT`P<|9*H;nwh=NUl>1$zJ z$*0eh)5YJRU(=)uus^Exhm_@?r!_gZfdArPLZ`2dl5prfr@K8K=@G`w;T_*l_VLGT z)f3e-I_c%EK7Y(k-)yfpJh$-o8LCfTZ=?VHh$`!=ElyUtYQ6iJb7GHuY(1iHjZ`)9 zh`jC*+-H@w_2ga&9eU(1kF$hyl8z@A<wDII%%0_+wwRcn)T(UvU@2X2_Yjn<j8$eh z#xuI+B(?DcAQSGe8r*-SG!^w@;O2k`lYmJz;Y5-PaPFdupREs9zl*EO#rUi9Pm(-r z1tnvZkMVHPRjKL`WW%brPk8$t7>{n3NHvS<yxwx&7SA<#ToZQ0E^hjrp&?zo<`??3 z@b)fWwL%={ZiJJ8ZvCi})6<r;0r@vDTwP*g=Z!mF$J}^cn_sxh%@BOY9koYwXxVx2 z7v3-Y=RU8}fO*(r^o5IR@tT5<3%Op$YbpTFn$jm;<IaHD>^;pgQ+=G^`3~1F_velx zgEUH?dN4*u-m<m57<B96(kt=5ihVhk{;6u~pAXOf03iHZ!~4Jd_mnTxTm^bTRE=yW zlm)~<lxaIj6Y;jwNyot&JqR2@qs3CmOgxS*3D3V7@nd19nT90J-RYnqhB9I31BcHU zs6*jCAj+&8TmUkorbPKNAWum>oSTJC!snIh=Am5NIxhFdD290^#7xsbUd_uzGxpmy zS7-x2H=op)f9<Qh!&zF&D}IceJ(<MT=UujsB!I)Dc}0~&aUQ5nOO77AOp#(&(OlGZ zY9?)`W5|3e%dkeHU9G6*1XkvR6|~>7eYf2JeQ8W;J>4|;(AZT<^1_1shoYm*yc)K* zgpQq6e=7Qlc#|wj)SiWgdGI=F0M&!ghhux%8t#WRyk5}eG3T*icCYYh!Nz1YjigVW zm`^sf=0a&EF4Lp=x7TudsXjhs2h(1}z<Xl{s{=QNdVvh^CrwjZhokwxUk5ihiN-l6 z<a)>N=n{y{gil6%QUUN*@I>-4%I(kxHOPbqEtpH>JJW(P5sjM*;q#k*IS;c=lR*25 z#ESW5?fuX(<W(Gs!@|3<Yx|2YDAH+W`9XEHlMHU(ynZ<dT-B8td~ouSmQAc%Dp$*g z)AV*cnfYVM;enfFrC|ZR(De8K>ZH}6x?Z8En6%5bD?BJ7Ms?e&r$kG*|Dt?|>QVN8 z#jv&j$!bu!iVvX++X_A=g=O?k=z2&T#?4z0uB2y8W6WlluCzWXJa1`X-jRjXu^oG; zl{0((2K1?(-mR+>ign}~XcQt1UDEevN_^}W-E#h7on2Ynp$}vej05az0*`)2K1;5P zrQ9W=<}{T+>oOm`Y7o)xlgZUJ@z86PL4DHmDU8N8r-GE(J`(chQrZS5*3AgrZ<GX9 zt=LDlkfL)XELucEJ6ym1{QbJjHql%24NfAsTSD$5Q9n}OPj-znV(kW4L%@0NZ|v}^ z#(E9Y8$dxc0$uYV*JZ24D&<O2)@X8sEdWE7_>n7OTzqbOR2(A6cVP!DH;Imf&k|g) zw6UmSV!~{9u)Zj-*3NIAb?&BI<g3A&`|+QCz82lIsJbL_^PwXN8_^=<Z$yM-d8gLA zpQolP_~dvy&~S!_3fiChrQ+H>)`)29AZJK~zQE`4RT~;FdaGtKKwq2twzRy4O<mCD zM+1d(8jrq)6Q@3Ro{eQbr8=l=e6?q$v5Z%7QPdszYyrh^nI_af+@+u2ujQUj%;^gp z4~nQO(j<vPZ~h!K0){G;qBine!Q2(lC3HWk8&wdJX?}8fu{2J4{OvaXSoJ!zO1h+4 z@Q!~3j&EkmFDzu_a*hx~Jt4m%22c+}@p^+SKQwVV+O%^4+7IwfF_8)Zu6DMUXHvLz ziUU%)j)y&t62D?o=NKbgEc{Y!>3sgm`-jaZ<cCMqv~C1#qB2Wp4`w`#8@~?+?i4z) z*8ZHNAWH&3gNV2A8jenA6qZH7aISBV&kWX>yI2?I<RNj|Oy@DC?#+DNj()G7-xC{W z{)Bfg4=VduaZUu`<3^2zdpbfmJIc9;w)k~8YYlhPnN6^!rE#aMOws3Vo(NYE!l~eL zR;Wj|Tun`vsmZ-cpGtP-<<0Ue8P}e*0GQ*gP7!C2(V;ZJ(xxo;6Fq>Uj(1+;Z3yKw zHmO<q2c?D>;PZ({?uMR0D&qGg&Uo_;_u)pqtKgua#z+5Od*2<^<ht&OogyF#f*_z& zr7BXCYM~<{(rZ+tgcu?{Kp-|iI)Z?J6zM%uLZn7Ih=34kfB->2dO{5(WY2f*%sJb$ z*4<~#+<VSlcV_mV;r)Ow&s(4O`4wu5(uPLx_VIuyIhOYXJd-IyMQfqdZP5E<OSC<u z1E|yp0NM{RFWx3lqC{h&>m~CjabyHlP3Y@*yI~$gsru@1tB-Mdb62g-#u3`D>xU^N zXCKoFO3Pv#JjQV73xii?<cEE)Qa`$&I1=QW)Gt{)?v}VDlCTDpt$M`w@zlkj5(+yp zG)iGTW(v5jb^+5o$#+ah3omJE#AOY3tFgQntb~MooA+J;%_D@{I^NR7@)d20&YGue z@7l(4=5vuMi5V|x=h$CwA1G;&j6&!FG+;&HtOejfT!Hd*#snF8zRqKlwVyUh`khjE z7C7cb5}Ls0lHVN2^(ZQUE*)d3Jbwtsbu~%&9!pM;n<@snw*Hk)uV%prSRn%d`HBai z;E~DsATz|X0T}RtQ&AQ0%9-{|8RCfgHNby>a?JwcA+=pxD%liQyZ68=adNHnuGI3o zNA-tq7G<0U+}mLIS48nvP{jUS>($p&96`q^?JdoC(|&nh#T4(?`?mU;NVuUwD+aY> zMx2dCTHeH8x#Y-}!x0O=uv-|F6&GG>>|TjqOU;{Gh9DAZCtZrvz11-m7}NaTr0o%q z@aCNz;!q<G;M`k5R-0UZjxb}zv>ZqS_Lo?$(%uYTPq)UWZw+Rmv`_1UbeV-2g}_HT zV4LlXWtD*L))3JO>6$9Y?n1vjD1^%+a|Uq@tDY;CN#$<~uBz3HKgjPgjlVD6J9_LJ zhNHFTou$osM#GjY+ajI2f7R<ivAyr!r}A6;Xmkn7NyVk>%x^M}34Ag8^1lYBg*`4s znp%p1S@<sJ;<jt6+r6+p+0X%f`ddAJ>#kzNdd;2<>Do>uC5E&-z1xI32^Ns<S3T$K zNZM?Ur@#yc7ph*$^4i|3b90cCE*Vj}=#vv<7vCnL^{VFK(usc1Q7lC8v@4Qy-_GGn z$_P*~o)L;(elP@G_2TCNS6ct{`E&tpxN@8at#acgA7W8}h<A#8dbxptdZ9qX9YCEP zy7~B-99*0q;-BERtY5q|ze*SP23E?ggOk}ti79#M6WBe8N-FSo*K0_y)f@SXba}GT zs^M=8OwM6z2uap=^fLn&2W{@9(1*MAINH3<&R?4388!4)0DOCXsy0yH9}_`zlQ3GK zC{QJP^VCV28la8Nx@;}pYM`<zX-OjFs?r6A6<k!W`T26jW<QVB6$_EC4ZqMe&n-F$ z3{rOt1(s!v(5xjtG3RI_@+~t~)up!jnAcQ?5p??p`Af@lVhb-MY@R=S<doM|ATO?^ z)({<%0f9O=IP<o^ps>?zoE!zsSrX5=Zt^gkWNuHGPD`&ve6R-7xmSGyRP45D^0O_> zA;Tnhn(VS;Z9~$6U`tF`IlW(_nwbVAYw||N%*b*fu93|X9CMbyKMq3maT$g-p$R<C z*1e^7^rqY2T6_%ZWG{jT5PerR#mYrj8*{U0M-z>>8op)7b0mA=Tx2xHS@{V}^cBMP zP9t`P%Fgw3gx9Cg0bB^)edF*MT^sBa;;m-(_Jz4X>jP^z>>h4AwN#sh<&rnc&)Jaq zrR!WypLKWrT-T1zv(!|-e5Q2XTfsO<$Tob~oF*yx8^fFpR%hz&+`6Ozh~f_o{Cbv} zVThDg=W(%KXzvTd_X4O0MoMLiI_JTs6*QD%yXW>=*GlfYY@?ZcOtea}c-U<DOJnNj z<8RTQyV_te0+ha;7K+Yn-<xJ!tKxoNb04!MLbcIQ`9>mLa?=kc8=f+F;q<v<RmSa6 zJQKRm`jmqkS-GM-1v)OplFM1O7V9}Vx#$s@iCSE|=T3~z+Uim&1{QLbFdVQ6-g`A$ zJau@9z<7}96*IQpBESnA#DrkMNl?EMI6Ei~qL*tdxF)lrRdGuohpaZt?;Hn{(IC92 zxjAr9t*{=_$Vr*<C8mba*k=PiSFv(b0p4}R-g%Vgw==8c;1B3$r5ux<O~h)&OS$rz z@@weZoz}IoysUlVnea<?+abF%H*qxSY&>}1J0U$Se^mRE^|;OLPc2WMKQiXH$(;F& zfu|_41UR=O5>Qr%#-YR%$k0Tx)uh*mkr_K(d%a;q3-twb3h*&So`!(Xjw2!R0M_02 zqpLEZaz@RjIprnztznMN@fbgO&k_#p-L6{5(~@28Lt^I8SO>Q2vSW2SRh0M{Stc4_ z3=<Q+rNM*;6F5kB1q8l(OQz~3wfpQUn&+*Vg{?Z)e}32_CAp*LaH{HJ?#Vo?@$;tr z?d%Y@R+OOrWp&N?k!fs(tkS}_-G=(DaudS1p(soejp`D?c2Z_{%nphH8J6{NSgSqb zNWC90T^;n?OXaQYqvgk{4vrJ>ivT?4%^kK}hwG8AHNe-}RNP!9ZyDQPrrw1JuzXi_ zBs(p)5d;Ph#^ikso)A)QNPgMGPr6Xx1)Xy^><oX3B>0EOrzTx92RZq9XWLWAyU)*w zH~=ToSCNsk_$-!$W+Qm9KecPBYZ0=X?che6Ol_!r3izj%uI3dAGEzEr;wXi=E#!#S zGjKX!!}=W|Nfu~nias8nZvdTPm4M3^mZ6p2mUiosSi+wBSvJ2k_v0Aib~=usy3)+Q zBhEkzUDV}}=ir`}WVce%Y%@WW*YI5zk*~PeQc!m&Ei>$q*Gr%!`J>s(`$sru754dc zi_y=HGfW@Cr(k5I>O?78dij%hLnWUN<0FZR_jc>Oh8i;n)v5AjW!0{iMauemVmO2P zHBJY~Ao%LY>|t~<2;uNR5Fcf;na(x>@b-F}n*~={tcKN`=z8Lqw_0@u?q|8M9_qb^ zPDTPbP)_wXfk{T#6|SR7f=bx)CO`9$K79ez`>wN`TQ-tyRkik$M+fE&pC&ZwRX6(h zz=|yfR)9qK&VQ?{@UI!?9?PtB-*dz@s>zaa)Ir~Knia7-3Zfr9u04oZBwQWfJNq+V z|8rMjfNjujSJ-K}9v@zZT1^nj^<8bx2a~j3)y^*4l^X)}#NeEFFK9AqeevFcc!Rc$ zG{99tIWV9dX9e6<;)70x476L2z}3|?0al43p{p16`p0$XaT_A-vmTd@-7F+m?nDZn z^ZHRo>T5H{sY-veh0D=*ZN9rn@e)QSTz%c`&&h~}>sB9&KD`uVcJ+D7v7yF#V0n4@ z?fhQ-{))zo0Wc9*GiW=2n;IYO@&F=QdfAzKGZIBvr3W0->S4MADU_u#iS8DIaTa;I zd+{?qg+#$4w7a4AtH}3q#iEEB;mYly-XGOUKUTPWvxxU28i}tShRGdWR7$FPJGYQx zH12CjHi~Mzyjbh|iY7>uJv%{Ds049pd)0NTz*o^e@dvD8O5CRs@4&c-%9*h%wI-N^ zK3oPVcI-EXJ{Zj%+Z;pDeF~&e82a_887q@l!4l7mEH44daV=b2lrqP%X#7tTaPNZv z{oTE;u7kx5thBFlHvzb4W~(8Wby`#KDu5hkN;4q#%C@+kufNLG{$ckpWL$5WJLKBt zl@x;Wn`6vmhPd({G*POl>y9C*y~B|FV9{4`C!M3bk@O=h*K%y>sw<O=Xd-?HieJ+* z`+VIcoxq4covD<#6!eWgRWX^Nl%70_Y>ru_N{?;&EvALiB;nWF4ae`fVBgtRZDN(C ztK{C<rugEe5mPeQJ=xhB|8SsO{d?#y0i6=kM-M>GM$x&BCAk!V{vZH1x&N!%Ag#cm zw(l4iU$4QwUHm>b1we|Dt6wHM=Er}1-c@K*{5irmX&(ADjCqZDE%W&bI|?Z7-vMCP zYFKhRP@&hDxd>3>)2Ar2$l&XZ*0F`OibyQ!Y+9pFxq?HVJ^+kOk&7Xu(3I58V%m7; zfoG4MBt@f86rFa(Ys$<1V)64GOyy`CZe{u&^EVHi@?P2aEyjm;&zuuq_W$D`a>Phr zfDE8`(^2io+|)j;YD)_*kwg<wL~a5l;`1<4HvKf8#@;Fb6i}j=9rF3({^0yiG|p#K z_e7Nfa#^cINEf?BpW3I~iDw9TMNbUn_K(&F=b-E1v$1UuiC5<<<m7}@<ez6gvK?7D zsXE0*SqhZvYxehj<%ZA&wfHo0*HG_8aeb~pTQzoHh?ak%B;?V4eMl8|>D-0NfY4vQ zSB}7i$|DD`zs#0<>`AG8zcHWz`Yp1!E^e3r8ks8ljX`F(LF>UU1CA5<Yk%Fe%PRc4 zAN<;Z4F8G7Jloqc58++jY`J>c5-sYlJ=i}N0b=C;?mXAtzcOx$fDko;8=3p-&&~1+ zS`8yE&cK)!1<wZc3&ZR50wH=0o>}8FG6btxGv`F3Yki;JttFfC59nU|Nk2yEAraU| z2WC_u;;-tJX3}Ku*48#w^p8+A?$r-uH6${wLszpsx}E*zLUnhqdw(9QHEhLv*J(Zb z1PS!kU)Dn8FT<9d64dwg^4>-hfay~aU(A1>_0G9(L43p06GJy#4p3{r0S6>zY>VW2 zD4l;0ZIco5i6%6RaBvSO{%M{xY+=tw>P}N~OvoJzOX=5pd)C>6ibD6M8Yp(S*|b4( zx@IOXz|%KpdO};e1I4XAlT6^_MoQJbH(fCxr;s*HQgG~8U__^v^p)2yPH(g~Qq(V0 z3jfa@zC}Kk44lodf0<loc1xksfXU-V=`O@;3Zk-P>*(l=T4-3Q6CXmX#iYrqGgGe3 zqS`@+3}joT*unG*{ZFgbdEhbk0r8*=%gW?atm<8BV|RNlr3kIGZB}<)CR%UAyqImK z3zA#i4=^)Zyyl@Z4N!F<N~+dS{wtfohlh0V+s`k&G?2_%8h|F?%{<-bV#~{6pMmt~ z_en2EinWT_gZ$e>GfAyO)XD~|BS}&zR6R&p&cN>D_{HurfLqFk#xHatnahGs!ZFjR zXoNv795&<oh9>Ll>ns*EZKo)$zC&Qi5+Hol%QWo26A0f3zH$HSO9h7-fsd4RlEzHZ z7tmO@CdsV?SXir2XUD<57;8^>+2FWKskghZq0bJZZir+|)%B}yS`2u(4(XGEntz=H zp{-|~=>WCjFDtMDx5B_O%#N#(PPevVOPxdS2aZqC`G)u3sq?t97ts_*+k>&LiUYQb zi39b@p|rqOYf(`r0Fe0VI&9}fDgKX_rCdEv!|s~2OCGoGRLJz3V*fr)f13-L6{}nZ zzbsJ3f45m2{<D#G>CYhW{TYP6EY*LGgnusxH@P7{P)t9$>DLa*=$8q0sEGAdga&ck zAV4X!-C`#t@U??3F8}Jm3vtUQCL(1kymCC9o+<mo^%(nuB-*($0A0{FqJD%FJQddS z)wZlsG2V5T{^X$)Y$0J&NuntDMkh1F;yq=3y7|_S3SGcv&Fo-Ir&d+T>fjSX=R|YH z@uliS`g!G!Fx4ygZ=|mCd6%52KB-SX8;i{d$clD~e8}2tI^oa;;-mS_@HKc4ZTc7| zEGcK#fvcVX*h<73H}6Fm^W$J?zSXAyXZM1L%kmB1u%u_bIwjzYO77QQHr>k+8iy(O z24+nY7U~oEC5Dyi-u}?D`*G1@Wk827&ci?`zVmqLat4DJ`x*F%5m_vEMuUAxKxn{J zI=ax);V35Y;pv;vPRDS^-jj4pmLH(Jrux=l8(=^DG`<q#yM17}xAz+ZB!&kLYndV? zx^lol7T;wQGETX~y5Q|{77K+Jv3RLCzL2zm+ue`Qv!}{%GSdrg!|NK($Z-2><oq`Z zEV7*V#Q__n^SG;`#jwA_Vlj0%R$lCej5C;lxuo)N`1qSq=FK6*)q}URt0ce!Z>VaD z4Gbl+EJt+Z4?9+2==}+9Wlw70Dc<+zuM9lAtl@p?{Hy|+MBND@?KYd%gP18gEd*XW z?OW2L10@$Kxn-_}Af;r8a?gwk^Z5lD0RLwJy7{P?6rEq;z>Aug?h6Qxa{1CZmizW* z0hxOg1*l3gZZFWtz@cY^=E9*LUiWuD05(YfO*$Od6_@GqhyI(k)+g;0R1ZpFXPAbb zZm;?p+Q81b?4X<-y>|iv+S2KaQ@!{josBlidye&$^>L9+%v24U@JPlcP|Xkok&9|E z&qEqc8c%_TF=0o^6Rnk5y26Qy?B~PTo_+ly_vyze#(aK>+sN)q*f=nHQ*-d1>B6zP z2#~+ao<-CCR9KZpOgc}7z@@=5;GBKVb>FG52uOhLWBiXzzIF$x8rzIXcbCZBe1wT2 z!_MTy-aR*pT@T7HX%L<kdo}YL1K$)prKLGtu!1a5kZ!kD40AZ@i-B~UzRTb%D6uWR z7IVvv{g=1RqA$h3miI>sAxfeLu7E`}A&j%27)y$=NA?NQ0+H=86djbtLJVCUJFClV zYBu%zN1b2(Oy+;AiH&_0)pmpwFyoV7*5T-0U_1UgWSDSCG!-#W+i}jFxAINP6`7`c zgD0Q4hi{@rg*%L9*+UwIUe31GPKB>~q0YEoF(`0-X2e-><eFTtmFd&SC#z9GmLtpz zU%0k@{hCF!AV65H{4_xMx3OkPPM?2tIOnmI?c9&2-cG7<erijPOO1QB4TG*Cv#HJg zZCYNwG~R>zUnSOm`Hq0!+TVux(7$r*CM%zN=xyOL_U`%8p-X|<9vaGk-s&&&2HC9U z_Zx#MlDz#J1FzC|_M|GwfI!(VSPrRrlUYH*sYN_{6rQoMr=&-qxTF%i6PakNcSz49 zu(fTN&*Ai1^K&7o&;bCtuY&{V=w4HTOZ#cXV`E)@1-5rkw&Rnd<2g|h+4e0$cjqrP zYj3Q7OXVq7iS`EuV^B{J7bWW9PUA(APB41h3WlsA@ax>Iu8mrwVI^0O+3CvdA;kcP zI!xqjxKA=wi2~9Z82;MVWY1kyVIYo6B=9TZuO|-u*yLsS=stH&-6O*bbG?W6^QAp4 z#OzTNR0$dCT;Jx=of`Or{vh6Gxq^nMCc&6!QZ=d5RYHL_9cPvW#2RYI$Kz)peQ$V! zqkbgLIYdkP)PwEGn)m%Yx_I?I8A|>*WpQq26-gGJac;pm6Op`j2+cvSf(zxCSC%Qm z;|7UL%#*H4<zJ{W#+FB6s@>;H-V_{408%9~%d~kI8Kxa`k8BaVC3||2tS=TlZdUPf zgERK<k=L<TSYK+pe>k&jnJ#<~i#RgNdi(3TIR!Qy_+Z%(9o^mw={eo&Ck>qy={Whc zQ(rsyeNp70_!m77d=mEU0=ujbJ4VHJCVYnNlTYb8xIJk+CfiUz9-p>Ic7WHQ*H4Lu zaT9q+Ul)ZfK10<?5M=hZJE!Q{vo1j+^L{~YL4ek!H9+=r&H%hbF4DgY)f*s*f~-q| zr&ToyY#RpEWs~mPT+U`3s2rWpgqGAtwF=)#cyL(%JUUPX$R^ou0Zh-Asy4uKoF5A0 zQxc~RK0q`cy`tXKimFqk`K7wID>-oKAsyFG<Yl8KV-CZ0?cinH)x-1jujoyMHyJ7b zDxfCWM*QLin_mg>!^7<1DXJ^T6Oz1K7qB#`<}^2%{~JTR(qfjYq+u4?Kx?zNY(FoG zWYel-&o`(FpaU4!!xb9D?~%T7(}n7j?hhTY6Y)KryWLu<mc#AplO6h1Xs^6%(afOA zAQ*VnM<rl;(ZPDZgX~O7-hv*k{#q`)jEq{B5qWv8v^42~)q|xuO^<WkdO{@zl6%>X zpC#98#aEK1VJ9ihCjDMhp+U^Jtw5-mHy;a>cR&(Cs=<pz-Isd)WcJzho;!s>9Z2@= z3|4Th^g;{h@Z`_^Yh7X)4vL}9qUeaOZ&93%%pYMyiQ@r7YJTwm=;8oHtg)*Nz>A{f z+m{Fy$bF0HwW^KDMW|p1uXcGRLh-v4;ufMdufaLrrm27+Yfu~<r5VR|g7DDj)<|Y4 z-sctR03n%$U#xXX2Iqr^uS%UAt}Z-(WxPF``AtNy*^%cAUy6~xuewDZ^YO7-R+hP1 zc7Hte-@f~!mHOr%uHk>SU}yh~!Jjes%X#L%-8cwmSX}O+v%nh{>7q1u`oN%@)2HtU zGZ=rx#JxVQNWoEF({FFsZj0@ScyKy+*0k&Ol~^1rqMf0D3joasE&^P#X+%KUD$b<T z;NzG5m}K79+SFT-T{UKAw<f>bKfz$^gK{fG8Jb{c=4#yI^d<#W;h3E)N-j}@ap^v| z7H|vijwsk-b=Db*33iiCC|TRKTqP)0CsKNZ-Z>sDm(~cwIbM3CCFHlQpPxWLMpXGS z?I=zi#`Pnp3-J#IS5Rm^IK3}t@!Fb!iGS)5h1OTy(VDkf9%cB&56Wx2m|~$_%Xanm zNt=#2ZVBF>5SubaW4>ob^HE|f=Wg+^)w3tOIPX>3AlqVpx?h2_zM_8%V(@t^S^Sle z?vDrk9cNB8c`!xu#O{~qDqlMMbk90sQsdyV!mgH0&(cs=BWCkAhViHLUEjG1)m^KD zd|7GaV-{qX#>4iyA{X;bYfI}pqJ60a6R)Fr9JG$>u(}H|Fi73{Y3PS-iou^~#XGmG z@--=I=NC=FLvU??$O$W`!<v5|WNX>u;28k(ldkH4s=nrlRC!<E2@_*?-wJMgJCkZC zXoMr;ygskUhejLlJ*hBejn~=b6&ZgmIa<K8st4fL9E`~){TteobB&7c%)MWKQf~g) zNJ?M0HQ1Lm%ddH}BTY=5>a?}+F1;7;CzdfqmR43@v_!H?{LCQW4A%OW1CfFs9v+kj z3BzH{iTjNx?$-*s+X069gaK9+-P#u`C@FM=-KD;ZkV4f_{xV)q9*!#4RMjqxVT(IC zv>-~Z9}#+_dG{*ZzQcT|UQgz|H>80X{wT3uzN1m9T4*mP+OEF}r26BO=5vQ1D989_ zb+)8?5WvM%vC74*6n`ZDVq}}w%-a33325>c@ChAZ>3B0$Zc^VDK{k1+q!ByZp+%Xi zEY)3fE=M^io~y#TPl)G7;*~dt>n=)IK1>if6Amt(1U!|e_SdUh^)#G0G0T9r-L9(h z47LNw3oq8HsrU}77o3^<eqnGsf{Hp_y1K<(E>>P(BL%)T8T!H)%AzNE&Rj$JO8L=4 zl1S}?JXNhC`uAG(<fr?Jh0|%iHjSh$kER?$m}u@$X=!W4;|-fw8Qr*HQz6Ow5gFSx zcQrC85i{&9G2B{tV#PD;OiSRbi7vnV(&31c&Fy|7n<9x9I(<~SHY;VA+>BHQhc!;t zAIgI-fjDg_4uI2YqTk((rT)dM(kpSCSCg(CC0KrxxaVOyn|o<YrMr(jPQra1S?Yj! zbO&l2L(QUkI<lN0|DYan=O0|tKL3}rjXVz;!U4`qQ#>@$=~W5*JXCpCbI3cn8s50u zyeKj}VAa6`DHegedhu+bTTuL)U4_H_!0umei!Id1!e1I0DP36|c@%65aDQ)}cCr!S zQ`?@zzjd|iWnHs=<j3mDle5<!s|=!juw_v}>>yK9J3#0<u+ahO+{dFuJ~D0e3f(C_ zxRy0k1u>{fHFm+TJtP&oC1jgLeOM5EdppkKIAd9JWhpvJ{VV?ZqbK2)-U$h5n;GBy z!f@z0L*cJgBgg}N6AwGx=<v2bF2R|etosL@!0;b$Y^C&{O%rdCHeKdD_=`mMn`|o> znnkh_tolr{SXrujv!mgbVShsG36*mo2pe+8_WO1q_e_0HA=0hM8Hto8#5j~r83q=D ztEITVh7-YKb6_U+i&p$88uB_BlOsB_SaymDF)2hw-slWiS?5g^q#{Z!r0`*qPbKHG zpVl`x3-Mn|<gQCF{xAix*I%4oe_hK5PUrf*C3|uabvdn6K21R?6U@j^quX!c&T!a0 z{Y365T*?7*8kv}eraPS;5*?c&VQ3oN<wM4QSTFe33`CraFgO#)Y?J?**<Rn}viN13 z{e4wp>gMR4QinD2jeN{l>g=bO4uYzZIt!U~Vi<$Px4A7y=8fGg7$^z}msQq||BBg& z7k_Ac?rMhaK{2fU77-iPc%0-G1#@@LUpC**otwQwOvSQYP9K8S7uc`$SWi1TCDW?f z*Dsw_F@3d^WGx=NUNvdn3%#bF(r4$B^x(ycS@t0RTjLZ*$uK5OEz!!@BIQF?>Jk)V z(t3w7>wH2f#i+TqF}Yxh|K8fbu678KCAC5^HB{$z>E$DQos-d9hJ;fwj$BKFk5Lq* zWe4S}&pzZ#uFY*2cF_xw=IZ_c$@Fr)BUR24Ue`jnNRC=-m{~vB<|kS}uBlAA9ek3C zwtD>PtDSD*i=Bv!Nn7b^?nizGR*jTbrAr#;(HUH>8slUaJbSb}mStSenYdhRp}Xc# z!EtHes3F*$GX@?d{0%W3*V$>&8KJ&OjCqA+t#?<Cl0i?eGcIkwz0ay$UiZ><R(@PI zP<+UxFY%Ds1(~Z={>+#{gepm_oXm!68wuhg&5eX_QE0_>u22c_LFxFDiaB$tZ9Kj_ ztTgD7>x@W|ry6QMA88(MZ`-@N0+xRCwJs<T)3v-|Eo}pcv&$APdD2vdv&hJBB3Zn3 z6m98E0a?WD^Q*-%edvOLug2lWN@X5g((ZgoqdsBlvAl?;!o~vh2Tj@uiktNsWcRID z8;iF&gVKG`XL}qzzn=#S+d#>Tm^WW_?+70=#OlF)zX%*B#YAo!aV)Cylh%@n{GRmN z%DH(-=arIZuc(V=N4h#s%!_9hhu$O=_V=b8B;+8S(YrgzXzJlTv30<gnX29Mc{8Y= zx=NXxN9;}ZaOPx9<Hy<#dUv$nrs(CN)<Hv7c^ResGbw(9G$yJ}8q%spc{r7b<g!~- zhW2KVxy@2ouMT%bJ~PbWvJqvLUf5)i>90BcFs)7eAnL*p;s{YqwuLU5ZU?a)K}ZW! zq|9ZsvYNE+`xFSn<G`90j~uEu1>l5h%n9Bya#>gSMoNSD;cOj5dHR*m7JI(XHjMG! zH3&FYvo^92Z2_@8y2*$yx?+>{V$^tAHq`zI#Vnw30@$j6vhZ9xS~jD=Aa~K&s$nbH zY3g#+A)oH6-B0FX3JbE=3JM{Puo|1q-PGkuBTwb@O+*8bUh>hcMK{eyR|@_cfkghR zK`DR!zkd%M^<NJT`m-PYU+RZ&hB^={!iv&Bgar$z0IsaJ0s&KSqht7`6S`)8odRbv zsK?t~WIjHfzy2h}$Lh+n=zd+r7=_|BYobC-uyRm=_s^W~RW+*!1L5jIzVX(sBDbhV z>i%!TJWq=_2L)-G{bVRvYU=$kon8?E3Pe-mw<hqxy3H1GjZ?3TfOMmy&l*6G5~(VD zY8E};ok{b_r9TO0YjKWMDRz(dZCWetc*!70VQAD@BdITQ*<q>Q_~>`3$cPM1Rd61S zdst|Mb~*RftPxii%nyA0m1_9Yq`TO6x7SAer0mCirnyh{lbU!8whkSn(G(FdXCjPp zho%G|D+Dqas?kHp%2oO}^wfior=P;in7=Wc;CZafiw+=}=nmFvfO96`5UmV-+<f%> z@K*y}YXaVK9N{7I1Zr-+_wGfk-}w>E`458w%P6|Re%@~kt7~>|`?OVKfA~{N5i0}K zvIb~i-(kuLvPF9>0BX^Imbm(xqcY)`Hg(Z~(yRch-rUE~vh}&Bl*RlfaaR)Oukr*d z9)9m}=ESv~w1aH7dJgIxaE0{*yiFb!T0U;Oe04F!aIQDWUsh!7nXFidShz-oRZP_j z$xGilCo9yG&=ezw$2(DM!Fjiz%81pWFT+l!g7c;p^xsp<=ucALdk`Fcq_yX0oGk6B z&Sl?G&zOVU?JE$E7Z~4h8CH~wjyuC!#6R}6fS;jc=biN;Wlv)<dSu}N9`tg9-sr22 zsG%&7g<AzwswxI#X{-+U5cSK0G->CZQnsZv8*_9BamFnzaYNyqoXz`hw@i}Q=O6kx z3xV+C#N%j3XT_N8#nU}`a9^Y0Z5!h}1G%L*TluD}5Km9uvHUe2sko9^+0KKp$*r`Q zW>ysg#rE-*eZ!iHnt*Yn1fFw4-0O*-$&oo99dD@{7vG<G36ZruNUj$rLMC|^9srdN z*qW;Ht%2McoOEvBwUa!4$KJgsec`~If9@Y{dN6c!yTW1<>`HfAoBDAB@{LNEQp(!< z3uz!#RmY67P7HJYG>qmPSd%YM^)C2XZO-du;j<fL_d)snq)3Ekg-`4)AYr$+yz%tv z*xX`96#ZJix*&duH{(sCKu-as2;UsYJaw-h=H^rlNfH#c$?aCdLsjph+-e?J3jK)j z09=*cso$GqzYD4)=oPd@z(W(fsJp$5ahPN=TSP~|lMP6E^+7y>!!gIT7NNmj&&L|w zAZNQ|PF_4)eD<S+`c|A7OQ<9A{k10{KRh)}^!vIusv2PdTj)}!4kbTNX<$GPq=GyK zCcOi4p3r-+r@fKkAXZ)~2vdz2mO`tn%KWrxy%>eZ&+Ga!w&EDO7@3Te4fBQF%l5NK z8O_~Bhg{sjDFR`6Kk-kGzF(EP5Kds+@OTy$d`^7`z%~6|Ep|<<Q9A%l2CDyfkOiO$ ze=Txp%m@H5<8%$m{%;IX7yrrE-o;%=*9hqCZu+S-^FI3#uc2zPQ;h45j|IpXQ*X6C z9YtHsRE?OcL?zmEt8`uZb_xYxN`HO3;$k=><a-<cP8tLrYsCM}Kw0GF4Tp#1&di0A zB}XLLZZU+r59El`DkAp8QbF>DnsfJ_*?dOt=Ea;LmA#PeTa}gCXR9NYKH!%zNF=Kb zt(B|dofb_~0~J~9rktZKEBO+`6})u6>-OTx)p52{K>5ZIc8p@wK0ry*C!KgzHO0{< zk2&pHouXBuRG}wxx6H|m&1zS1_CxjThxt0e-%GXzE4gDxz`yl|5ix%4>p#1i`wwcs zY_hYWd0`qYf#yh#Dc2OYi2R!)BfiQ(0I|e~)BW&|u+p69`&Za*y7`}ioY=7;Y3EMI zyiT0L<Cam#;t7KywK7!E#F8(s_1*F8s?9QyxI1$?<$MblK6_l@<67kH0E)Xa7jbyp zeOxK3)Gi@~FIdmvamhJ7^UltPj9V83h9JKbZ~OWAAgFCR=$RTcC}U&^phpNL`~wif z;eS=5oR{2}rLz9Y%ZCOJ-`|h?5#;^x*ZJV`ca<Mlrl5eU3H&8X;GO1E5V{PRzh|U% z7iTURbE+?YVo9+(8(6-y_fMn1yp4-HHU$q%zFH26sQCAsY2)3gq@FUGgD5?tyzJeF zDzEnq4XX_5dOQ7v?7JvxhuhQLDYsJ%?-NfFmMg!$Ys4AU2i)<rM+D|A+jEe1Q29%~ zw|6#%cbW-sx3$AXVL94I<(~^Nw4OeUQe`%PjV-q%`dgJpG|~COI~TE|?UV9U?>D1A zGAdS&2xwbjeWU8rZ)5?i_4^w!Q#`p8bY<gj3>SiDWnhZ*dv2h>^xZ|6!UifrhIWVh z3pR3R*gv$@h;fm?<g&K)8KtVXGimrlQBU%Y^k|}A;+6RuuOH9)h?qSVcHr`9ya6?8 z233iDB&O;64A-kRiVk?$z`d}7uCYDY=vMRZS%x{S#o&un&1K<|XuX&B7gTNw!oSlG zyQuS!R4C4dr2Nn=Kmn(-43#r(*~AqeD)RYC0i*9}z1a_&hK&aq^=d_kTh(M}-)n@5 zJF)l@tvJxhhQ)XA!rd$Q__y<yT0VbqizMWgD)gM)0g*JcV3Jdv!GhrjW>{`|V9W<} z9czG5J$WY#I2DLTc#pf#pt&ucOk{@gAq5scuW_(Qbwz5=3+b_(N8(9Gv=Xdt)B1Yd zg7e_r#Eg)VtpKoW$*Py&nI*E-qCd73av*6oD18xQ%&WE?mSU43=9i<xD!ejUmppc3 zKeZKfR36E_=${*1I+J$Bq+*0$WUzE?WhO=XR;)z!-4e#w0!@bMXB_U|&4U`Ka&Ut- zb;fd1Z~iol*;Snn$Ba&o_s$(RaBwj_rTW=QU+l;go+BaZ=x{@^IsoAgrPbJBTX&Xo zR>ir;$rP-T$P~r=K;4;qB7DtzQqqtT<%SPlf4K#8oYH{HTbkZbiFd%U%`#qaI*&(E zkI+#|0ueNo>cjW^F+^J$(pt;j5h$}umx#Le8-po%s5e0|n>}p6h`ldw^+RbEm^k;+ z=%_vb9_sIJO~l=ZhdiQ3jsV4PjgypO+kUi~NmKf{L2p^MU|zGy;WU{1{=)~%Z}{I; zSxV$Ug^%gv8ak5B+``oddJ^l9%<v#~PJ5jn6A+HkFPP0dPAK@xCeI_&hZqtnvlO;o z=mVu+rYnN?lzdv(W-smP1@^nsWHO4Z#S07nQT;Xcvatp7*PTi5_X6(oKihuavHy(A zzd@<~9238s;{Jag6P$-|Bi+0s9S4wUrH+^gjDPe;WXU2g;p6etnLxSu*{e3o9E;YT zT91wgt&j8m_+<RWMbxbfvgE%2taudr9a^_<F8ItuM}b)Wyx!wz;>Pt>J@+{5vblmO z`|isEhUxp55vS5!G^$8%ymwOOK|(yedW0_6xhFo&-5$e-P$sn{MifAbiLzYP2j`dZ zlWmi&$LB$u_M>4rm@_4g9HvjTMi-d4Q;IRLOo|Gzqm`XvRDWmYI!$Xv4`EOM|7v(c z!5~e2e!-wBeCp1p8u-Tws&%bO<uyMLxH<k>+-TDd^v=w}3k5qFdi!!q5MNEj(8D<V z4#7@BJbdG_s9#RB*5y!(L>(X2SgWxZk(AyViXf?R^Gkm7CS1I!f&$JnNE`s&eo>NQ zYNi?6GPg2ORP?btmXqyef=WB9f%#rNCMAv<2kG7M7Xr0U_~1xU83g(=xK7=jl(Z@f z&}UeLL1mfVrFZV570=GhrBIDRh_h|n)dtUmHaT)k4Z{ogS&l}lEnU&6utwY^`(UY8 z5jwTxqmaC1x?t5{>2zZ`2CA}pQL43kLgct#4(1`qZ8#zID(vWS2HyvO-P`$n(e@Pj zITCJhB(c=N-4%aVn`srV{r2ONF?6<^O3i~SR_|v;2I<@+*eeA4bo@*y_nq%s8Eo(3 zuH}v`b{$K$l6!KT>;7x?`N<BIXwQ`9Ty7}^eePk~oxqwLJYXVWvPYP5<kq)EXB)44 zaKpB6W)OyeQ|{QT`ia^>btVK8W(W#=zJNpABFf{WN^;3;*kVeL%$jJ&RXn=O@#$F+ z$<~I+AroOSBz~88EdRNbH(=7KmOc8@6T(7lFx;||okiR5^@-}CF<5Zv+gU5CToa#i z&WoYv_lIMsO0)~4wHF0oYh(+SVHBK#N!VF7fU()!Ikxa_oVdy1aA-&ATg?gZkB394 z*cTuc*w(7V0PF}{!p4vlZ>V_UJM^1>z%|M8U_`yPfkgRuWP-^c^UAxyqM8O2CP`~! zq{810Ty`Z!T7j)-ByblymG4usvW*koaUzRHs_M)l!@G%wo(4lzJ+f_3hpZ-Oo?1zw zA|R}cPIb_Aa=&yy>gddW=J`Q6%YV{y-zjybfxFc@vD`U-u{x!?LWnnbMG?Z^MhesK znD6BFO682L3&S%V;Q~NvztbcoWY^k!jP0xSls3^FoVa+H&lF)DmN+H!4+t@rIsX%! zwf{I34sh2hsajS!U^mqB7Ub?Kny9Ky5euF<@R-$2vS@r(C*lW97TuUJ^LgC&BkNjS zcEVkM<S#6~G9x0W85RoS6)#U}SLYyQM2O;!MmX*FMzB(?nH1MKl8vj~Mw8pGp*_Ew zc7cqR=N87c{I?|JDzN~{6fjyxy^$rdu(0#H;-@0e+vLz@Dyxv%#i!no2o-64pXzY! zM4L-#k3Vz!Lgjf91YeH}v>zQA8fqaRE>nC9mI3W;_Zbc5z5<H1=qs(-c<tc40bx*W z;+lz<#FZ<jo?o>C{qnM<qLNcX*!r(m(G91m5mjcgzc6+IUzop9E(@jp<7M1`_?w%k zad8m#d*fk3S%POEtZ>OXIxP=hn$~S?=!2WO#Zk@8{B@Y%QK{+1x%Nia?v~?yPhemc zuWGXjw$}<2%j6^l@sULm4ITxQ7?!FhpRpb{I{$dz30%fC47z^qO4q_3ycLq6MK(l* z(%fg38-%SZKMl(lQ@$ygTMWM>66V;=;FJ2Fc7%%IXIcP32Ai4AD&)yUWt~v3_g3jD z(sE5u>Hha?kA<Udztj`?;9;l?O9D!~RM6MH^?qr;FxR+M)B**X?;X&PWcUxt;QvBy zrZ(;-klSASYi{elCV~2;=YA#28aKWu-+)B};?t+Vf|W`gj|5}t;cf_SB414@42ce( z?6okgNH)$jW978>iV{zN&57Onk|pP$-bA(kxucAI{t;e=&_o!xKa&qUJg!Gp&&@8` z9pPbGU{QG!8OCEGxi<0Odam&Kh5FilRoTG2rD{)bis`Wba#ig+_Q$0HnJeLuxXZS> z`a+kbKLi_pXND$)A};4GX*|UYcm)Jts|^bF$fH7CJB23Qae+;q^R)<o5(q~fC4MNq z)O_0JQvUovBq(=fd+}q!_1-h@aFbmq$r^=aNY02^pwW49ObZyHHY<39;(Ut?i`mAW zTYLr%cT8=y06F5k#+{Ab{gAxaBzMt)oN^T2+)6Ydy1AG$M!+{pf#o-bLo_6bj?Hu> zTo~DE@H8HhT7$(zh+r#g>!XLsNxF7dt)Q74dJF<y;Q3-3&Ui7sCn!s@MiYB5U6I@j zPqiZHyxc~f)_#1s*#4*D=9KI^&$D9i?x@hU&5fNl8(a_%LZiP?$d=NGYbNlZ$&S;K z?xlBfG*ezrKW79t`-NU$@R)e6CgI#8zg>yI@9)qtYgI~7*|}v^Q{8}n7=K1RVx6i2 zPoIZM>Z{9;x!=&_gG4Cj>Ti0Rkq7aScjT<4;%n`03*nr5e%w~5f=TYi<y|{z_yFvS zpARbnbT$Xe>Mdq^l&S5!W@)W3BDLq<8tz^VI{9tZkVx!A$4+YMBepL~<aHIsO|Igf ztSmEvEg39bDD~7CL8irZVrF-#LUqJR9gCBepFZPX^>+F8(iQ^zQ)09!3M5=h;~^}m zEMt0#(UJl(d%Rn#));owhdc5aQ`{k*s4hGfE?BE3F+Y3RQ`B)hzoQ3c5YS*@ZyzC_ zV%}K0JTfykzm09!m>@wY3eY=Np)Gm^@Ts<RcG7PQZxkXJrQ~C{8#9P3Gn{8Vv@SNp zZ4e;ur5zL3P8@7ral**fbvyBDFac16sG!{)Z}M3bQRDPE+D)02vaQ*IVk<k%6vve? z)t91XpW}>Vm{hxz7)*JZ-2w@H#WWs@Gm-t!C>)@VHl?#SlG@)jtyD!su`xY;I_frm z-CFKVkkgMtyD^1jaV}MSsZq*S(ofUvE=E|YSic<BZ10cf7~eP@*|jk{2b3IyR!XR% z%PwP>`Q7CuiMJl+)~-`o^YfT2YcG54$v>urN*Mf0&`5twQvKI}PX7FVe^pBWh|_-~ z1pgW9zay0Y85ckp<)1Ys0D+6fYX_Ntmfdm&OVG%b?qeO1+${vgS~SkvvcxNOY%3xU zE50i0tLm;$?=&D@@j*U1*DP1Ct#2%$8Q`F?%Tvb#AGd9(T=qI}wMwB+mLz<{ZmL_I zERNJ`fJ49h0Hg{H^;WQgvf8M9NRfJX46>zfa4)8*QI-;#Ni!Lq3AG~)%`HR*U7U2e zZxonoub*O;R+g&pHLGoBvIOZ>blC5Xr|yrdPgzk%XphLqH!C6WGs{yfE*57uD6byW z){o5A4?aqfw0j)j7^P$<+<xVVO45@zauS-HMfnXar15*0x^SY};V$uz#r4^@Pfb;Q z+0TW|pK#NR;*&eOWcv04Zx>l-g*+q3w^*I%-}i#1QfzH$rxyr4HXn78JU*d2_alKT zHrUt6$?1IgW4#+6L5UnIaX~&Y(m*l7f6^!5lYfo+DwdX97f4u7{JBwp1RI?qAYlDc zB~y0>>xB!KHAc^%tCQtY1Kv7_Ho2_leAfKD_dV(pzGAia$;ljczmlUAmKiwBgCGt% z?sBI!x@p{u_bv!3b?Sn;PtV@y;RQ8Lw&xZG2dVA=lMJA2HL|MRc(8mBgxLdsw?km3 zu>;+6K{@iKQ)3vx&1M*Ny8o9)FUIzpAe|<VeN5Q(S2{b;4jL(yPLV&v%BA$T4}WXF zdFo&H@JJke=qx@siFQ%BG`*p0u^3A15g1xoDQoP5!7Hbl`1Zzc`f+zVgQPHtzH!Fy zFM=M@djK_w^fSn*<3&pZju`upOY2pw^}6EG^P=ga|BI-}c-`^gIZF@5qbAV_7d7VI zfx6`Jds(jH5}q$7+fWVih;`B`TH_cksH$;99O}V-4jylb^Xfjh)`8Fa2zBX?NOpK> zcXj9~k)s7Ba?iv)`iXIuNB5TFqeajWgwjX&&TgBzJ$t_t&8YBV^t#0>{csg(u8K#+ zJx&$&x7S4u+P1j*{}w+ztJ_!YxUi^2&g~C5wRHgIbY#0CBs`U>I7^2c{>Fgd)u?pS zSa?0P+my-ZQi%QQhwR@UVE8|L{70jlwM#rrX~>z(zf+j^v(}3>(AP7631j_)taD06 zHwCXdcZA``@r94aKOr5lM_uh1DSFU@QuW&1{f5@sZ2Z!GX>Y!JZcb0Fijgu=Pek1` zfTPiaB~<uOxqWa6TwmkV;wrcR92V%hQu2Mm#;?5G{A3Q`g2Z!JjqwE9>i0f+^K;w| ziQ1sPScYuTu@<{~|H8q96Tc(HR<z0|7t4QBl)a!=XTco#?*tPdTqds2FS%x%K%AMK z6h*Idx?*<iZ$OzlEE~h24-7Ah;8w*G=Mv=|wG45}+6Co)(Qml8KEG;0@+yb}^0Kg> z`09wlW&gGEIV*6yJz=t&Ept(HOA*&Qaz=*K%^BJLn2mXDfd^IKHO1JG-Qz2o_dXGY z)WEx?@I4Hfw<}6_h*fvOzp0D4ZpI(%*g=Ba3XzMLF}!Fxs-9>He*66CBt{K02~<^j zx{PX#L`<vj;eo=Ov{lZ=dEDl1`i}1XT}R})(ry>F$qG?xztDGoe3arjGZnRkI)!Y8 z9ekYO*PdEQ@ku40F|VPT4NY7vMORsjPuDs~MQ66C$Yo!5Z2r_CPL6L0lBUQ`r`<a{ zM1v7~Y?^{jgisA@aP>|kq|;LBTDn05CAZGX?NOpuq}GCH=VhqWBi|=_+o0F<qj2Xh z*8J7UA1O+=`>Vz!E0Hj;Lrxp)B=^x%PMVs`6%XHjKDpsnsA@toY9ZVppG_)(0GtqX zpp7Q-+P#K`f!WWWKRpfk_CPr?^2d>lx1A@@);_*lG_J;jpk?T%S;tx|O>K2CpST{# zeu~oM>HU$W2OQeNrMv@u76gO`wt75tRZT8dkrtCniBzV6S;r92^>3-^_Xj$5K3)(t z=JLZHrVl!_BCEy6QQk;So1Y^Be8Y*jmJWl4=t~ZjpQ|o=^uH&IwifRsohWK2YcqI^ z)1$ByrkOwsA}cn+4RJ1W0$wzD?3GoLZrC>C&0{yMzWTjlh`lm#SjT@dzS+2^q@|$o zeN=%>^A6dL@1aw;_@!Pzw3sW>Mfb$ftcA=h>0%q|)SkSb#l-er!{oSBsWYmDqH;hF zGI0Dzwtqp@cWo3)nicJ)#I$iN^P)n$iVu|ZsR}(sE)V)Veccjc&)wGHe63KVr#_R+ z(#iMqq1ca8l(^xw<z}TGVrMB7VfNGwq2xSUm_JmuGKUj=dlqN<xh8~YwDl&%_f=0+ z>odLQoj%whe11!yhAq9H>h{Xf_n_RhT8SPQ-nFyrJym_q1FP!rEuMMo$Tv522V0s( z<%t)i^-M~^*_418O;S%QamntYm!!LcNDI%~k7J*(N9Nn%0`Jml%96Aw8p{C(`=K<! zHXEZ1h|l<))PopRy<$qnbmW6&4p$CCNU>|8VmH!X)-AY%d$WZh@!2;~?=TL7^}seg z!rnxnc5*h{7;yWx0hmOtqn2ZupKQi$#`o?w@kUArT{>jSz`*eEF_5SKb(=C1_jQ+D zrZsB*!Jeku`OjH9{|}eiKOg@m?OA^Y^8da-UOG~i^}l0-`R6kX|DVL^$Zuo+17w>h ADgXcg literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/images/example2.jpg b/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/images/example2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5858bdc84c483c602d8d6bde0dadedbcf82a739 GIT binary patch literal 106374 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ÿ&+ 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 L2BxH7|NkZct<4&@ literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js b/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js index cc7975f97b42..0a6ff7bb5aac 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js +++ b/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js @@ -19,6 +19,8 @@ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; +import example1 from './images/example1.jpg'; +import example2 from './images/example2.jpg'; import controlPanel from './controlPanel'; const metadata = new ChartMetadata({ @@ -27,6 +29,7 @@ const metadata = new ChartMetadata({ description: t( 'Plots the individual metrics for each row in the data vertically and links them together as a line. This chart is useful for comparing multiple metrics across all of the samples or rows in the data.', ), + exampleGallery: [{ url: example1 }, { url: example2 }], name: t('Parallel Coordinates'), tags: [t('Coordinates'), t('Directional'), t('Legacy'), t('Relational')], thumbnail, diff --git a/superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx b/superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx index 93139f7ff7b8..f910a8bbfd4a 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx +++ b/superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx @@ -24,7 +24,7 @@ import { D3_FORMAT_DOCS, D3_FORMAT_OPTIONS, D3_TIME_FORMAT_OPTIONS, - formatSelectOptions, + getStandardizedControls, sections, } from '@superset-ui/chart-controls'; import OptionDescription from './OptionDescription'; @@ -39,7 +39,8 @@ const config: ControlPanelConfig = { ['metrics'], ['adhoc_filters'], ['groupby'], - ['limit', 'timeseries_limit_metric'], + ['limit'], + ['timeseries_limit_metric'], ['order_desc'], [ { @@ -52,7 +53,7 @@ const config: ControlPanelConfig = { }, }, ], - ['row_limit', null], + ['row_limit'], ], }, { @@ -248,13 +249,13 @@ const config: ControlPanelConfig = { type: 'SelectControl', label: t('Rolling Function'), default: 'None', - choices: formatSelectOptions([ - 'None', - 'mean', - 'sum', - 'std', - 'cumsum', - ]), + choices: [ + ['None', t('None')], + ['mean', t('mean')], + ['sum', t('sum')], + ['std', t('std')], + ['cumsum', t('cumsum')], + ], description: t( 'Defines a rolling window function to apply, works along ' + 'with the [Periods] text box', @@ -301,22 +302,22 @@ const config: ControlPanelConfig = { multi: true, freeForm: true, label: t('Time Shift'), - choices: formatSelectOptions([ - '1 day', - '1 week', - '28 days', - '30 days', - '52 weeks', - '1 year', - '104 weeks', - '2 years', - '156 weeks', - '3 years', - ]), + choices: [ + ['1 day', t('1 day')], + ['1 week', t('1 week')], + ['28 days', t('28 days')], + ['30 days', t('30 days')], + ['52 weeks', t('52 weeks')], + ['1 year', t('1 year')], + ['104 weeks', t('104 weeks')], + ['2 years', t('2 years')], + ['156 weeks', t('156 weeks')], + ['3 years', t('3 years')], + ], description: t( 'Overlay one or more timeseries from a ' + 'relative time period. Expects relative time deltas ' + - 'in natural language (example: 24 hours, 7 days, ' + + 'in natural language (example: 24 hours, 7 days, ' + '52 weeks, 365 days). Free text is supported.', ), }, @@ -328,10 +329,10 @@ const config: ControlPanelConfig = { label: t('Calculation type'), default: 'values', choices: [ - ['values', 'Actual Values'], - ['absolute', 'Difference'], - ['percentage', 'Percentage change'], - ['ratio', 'Ratio'], + ['values', t('Actual Values')], + ['absolute', t('Difference')], + ['percentage', t('Percentage change')], + ['ratio', t('Ratio')], ], description: t( 'How to display time shifts: as individual lines; as the ' + @@ -350,14 +351,14 @@ const config: ControlPanelConfig = { freeForm: true, label: t('Rule'), default: null, - choices: formatSelectOptions([ - '1T', - '1H', - '1D', - '7D', - '1M', - '1AS', - ]), + choices: [ + ['1T', t('1T')], + ['1H', t('1H')], + ['1D', t('1D')], + ['7D', t('7D')], + ['1M', t('1M')], + ['1AS', t('1AS')], + ], description: t('Pandas resample rule'), }, }, @@ -368,14 +369,14 @@ const config: ControlPanelConfig = { freeForm: true, label: t('Method'), default: null, - choices: formatSelectOptions([ - 'asfreq', - 'bfill', - 'ffill', - 'median', - 'mean', - 'sum', - ]), + choices: [ + ['asfreq', t('asfreq')], + ['bfill', t('bfill')], + ['ffill', t('ffill')], + ['median', t('median')], + ['mean', t('mean')], + ['sum', t('sum')], + ], description: t('Pandas resample method'), }, }, @@ -383,6 +384,11 @@ const config: ControlPanelConfig = { ], }, ], + formDataOverrides: formData => ({ + ...formData, + groupby: getStandardizedControls().popAllColumns(), + metrics: getStandardizedControls().popAllMetrics(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-plugin-chart-partition/src/images/example.jpg b/superset-frontend/plugins/legacy-plugin-chart-partition/src/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7799791a27ae98deaa7b74951784d22335cc1983 GIT binary patch literal 44054 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%0Dm`f~wAwc#KJ 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 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js b/superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js index 1094b21e9f38..866a18d0f00a 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js +++ b/superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js @@ -19,11 +19,13 @@ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; +import example from './images/example.jpg'; import controlPanel from './controlPanel'; const metadata = new ChartMetadata({ category: t('Part of a Whole'), description: t('Compare the same summarized metric across multiple groups.'), + exampleGallery: [{ url: example }], name: t('Partition Chart'), tags: [t('Categorical'), t('Comparison'), t('Legacy'), t('Proportional')], thumbnail, diff --git a/superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts b/superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts index e4c0b477c482..11daca1e9429 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts @@ -19,7 +19,6 @@ import { t } from '@superset-ui/core'; import { ControlPanelConfig, - formatSelectOptions, D3_FORMAT_DOCS, D3_FORMAT_OPTIONS, D3_TIME_FORMAT_OPTIONS, @@ -52,14 +51,14 @@ const config: ControlPanelConfig = { type: 'SelectControl', label: t('Aggregation function'), clearable: false, - choices: formatSelectOptions([ - 'sum', - 'mean', - 'min', - 'max', - 'std', - 'var', - ]), + choices: [ + ['sum', t('sum')], + ['mean', t('mean')], + ['min', t('min')], + ['max', t('max')], + ['std', t('std')], + ['var', t('var')], + ], default: 'sum', description: t( 'Aggregate function to apply when pivoting and ' + diff --git a/superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/images/example.jpg b/superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6258eeba7e349a66ef004b16b2b31e784ecd3be GIT binary patch literal 59676 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 Rg^S|<KmW6RBJi>4zW~I4<u?ET literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js b/superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js index a141ab60531c..9d45be221993 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js +++ b/superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js @@ -19,6 +19,7 @@ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; +import example from './images/example.jpg'; import controlPanel from './controlPanel'; const metadata = new ChartMetadata({ @@ -27,7 +28,8 @@ const metadata = new ChartMetadata({ t(`Used to summarize a set of data by grouping together multiple statistics along two axes. Examples: Sales numbers by region and month, tasks by status and assignee, active users by age and location. This chart is being deprecated and we recommend checking out Pivot Table V2 instead!`), - name: t('Pivot Table'), + exampleGallery: [{ url: example }], + name: t('Pivot Table (legacy)'), tags: [t('Legacy')], thumbnail, useLegacyApi: true, diff --git a/superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx b/superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx index e43da2de7237..11bb451d57f9 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx +++ b/superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx @@ -20,11 +20,11 @@ import React from 'react'; import { t } from '@superset-ui/core'; import { ControlPanelConfig, - formatSelectOptions, D3_FORMAT_DOCS, D3_FORMAT_OPTIONS, D3_TIME_FORMAT_OPTIONS, sections, + getStandardizedControls, } from '@superset-ui/chart-controls'; const config: ControlPanelConfig = { @@ -131,13 +131,13 @@ const config: ControlPanelConfig = { type: 'SelectControl', label: t('Rolling Function'), default: 'None', - choices: formatSelectOptions([ - 'None', - 'mean', - 'sum', - 'std', - 'cumsum', - ]), + choices: [ + ['None', t('None')], + ['mean', t('mean')], + ['sum', t('sum')], + ['std', t('std')], + ['cumsum', t('cumsum')], + ], description: t( 'Defines a rolling window function to apply, works along ' + 'with the [Periods] text box', @@ -184,18 +184,18 @@ const config: ControlPanelConfig = { multi: true, freeForm: true, label: t('Time Shift'), - choices: formatSelectOptions([ - '1 day', - '1 week', - '28 days', - '30 days', - '52 weeks', - '1 year', - '104 weeks', - '2 years', - '156 weeks', - '3 years', - ]), + choices: [ + ['1 day', t('1 day')], + ['1 week', t('1 week')], + ['28 days', t('28 days')], + ['30 days', t('30 days')], + ['52 weeks', t('52 weeks')], + ['1 year', t('1 year')], + ['104 weeks', t('104 weeks')], + ['2 years', t('2 years')], + ['156 weeks', t('156 weeks')], + ['3 years', t('3 years')], + ], description: t( 'Overlay one or more timeseries from a ' + 'relative time period. Expects relative time deltas ' + @@ -211,10 +211,10 @@ const config: ControlPanelConfig = { label: t('Calculation type'), default: 'values', choices: [ - ['values', 'Actual Values'], - ['absolute', 'Difference'], - ['percentage', 'Percentage change'], - ['ratio', 'Ratio'], + ['values', t('Actual Values')], + ['absolute', t('Difference')], + ['percentage', t('Percentage change')], + ['ratio', t('Ratio')], ], description: t( 'How to display time shifts: as individual lines; as the ' + @@ -233,14 +233,14 @@ const config: ControlPanelConfig = { freeForm: true, label: t('Rule'), default: null, - choices: formatSelectOptions([ - '1T', - '1H', - '1D', - '7D', - '1M', - '1AS', - ]), + choices: [ + ['1T', t('1T')], + ['1H', t('1H')], + ['1D', t('1D')], + ['7D', t('7D')], + ['1M', t('1M')], + ['1AS', t('1AS')], + ], description: t('Pandas resample rule'), }, }, @@ -251,14 +251,14 @@ const config: ControlPanelConfig = { freeForm: true, label: t('Method'), default: null, - choices: formatSelectOptions([ - 'asfreq', - 'bfill', - 'ffill', - 'median', - 'mean', - 'sum', - ]), + choices: [ + ['asfreq', t('asfreq')], + ['bfill', t('bfill')], + ['ffill', t('ffill')], + ['median', t('median')], + ['mean', t('mean')], + ['sum', t('sum')], + ], description: t('Pandas resample method'), }, }, @@ -266,6 +266,11 @@ const config: ControlPanelConfig = { ], }, ], + formDataOverrides: formData => ({ + ...formData, + groupby: getStandardizedControls().popAllColumns(), + metrics: getStandardizedControls().popAllMetrics(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-plugin-chart-rose/src/images/example1.jpg b/superset-frontend/plugins/legacy-plugin-chart-rose/src/images/example1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..732aa8dde50c272041c98892b6c8893ac3808f5c GIT binary patch literal 116296 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 z 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�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 ^(NButCaCe*7c$Xp_Ne9zG86$U65;n7|Y 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 b3K6PQpf4$_^8fcI_C4<a|3_oj|4REWO%KK3 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-plugin-chart-rose/src/images/example2.jpg b/superset-frontend/plugins/legacy-plugin-chart-rose/src/images/example2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0424e67660f3224999d70f55d68730e2a991b358 GIT binary patch literal 50161 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 J;Qn#&-vQRkHDv$* literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js b/superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js index 6c215aea0393..a46e0b753570 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js +++ b/superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js @@ -19,6 +19,8 @@ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; +import example1 from './images/example1.jpg'; +import example2 from './images/example2.jpg'; import controlPanel from './controlPanel'; const metadata = new ChartMetadata({ @@ -26,6 +28,7 @@ const metadata = new ChartMetadata({ description: t( 'A polar coordinate chart where the circle is broken into wedges of equal angle, and the value represented by any wedge is illustrated by its area, rather than its radius or sweep angle.', ), + exampleGallery: [{ url: example1 }, { url: example2 }], name: t('Nightingale Rose Chart'), tags: [ t('Legacy'), diff --git a/superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/SankeyLoop.js b/superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/SankeyLoop.js index 33a349015961..00f47ada2666 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/SankeyLoop.js +++ b/superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/SankeyLoop.js @@ -26,9 +26,9 @@ import { CategoricalColorNamespace, } from '@superset-ui/core'; -// a problem with 'd3-sankey-diagram' is that the sankey().extent() paramters, which +// a problem with 'd3-sankey-diagram' is that the sankey().extent() parameters, which // informs the layout of the bounding box of the sankey columns, does not account -// for labels and paths which happen to be layedout outside that rectangle. +// for labels and paths which happen to be layed out outside that rectangle. // for that reason i've selected relatively large default left/right margins, and have // made 'margin' a property. i have raised an issue in the chart repo: // diff --git a/superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts b/superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts index 6ee16465cff0..38f25f05b1a1 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts @@ -17,7 +17,11 @@ * under the License. */ import { t } from '@superset-ui/core'; -import { ControlPanelConfig, sections } from '@superset-ui/chart-controls'; +import { + ControlPanelConfig, + getStandardizedControls, + sections, +} from '@superset-ui/chart-controls'; const config: ControlPanelConfig = { controlPanelSections: [ @@ -67,6 +71,11 @@ const config: ControlPanelConfig = { controlSetRows: [['color_scheme']], }, ], + formDataOverrides: formData => ({ + ...formData, + groupby: getStandardizedControls().popAllColumns(), + metric: getStandardizedControls().shiftMetric(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-plugin-chart-sunburst/src/Sunburst.js b/superset-frontend/plugins/legacy-plugin-chart-sunburst/src/Sunburst.js index 4418f68bbd15..1389df111ccc 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-sunburst/src/Sunburst.js +++ b/superset-frontend/plugins/legacy-plugin-chart-sunburst/src/Sunburst.js @@ -24,6 +24,7 @@ import { NumberFormats, CategoricalColorNamespace, getSequentialSchemeRegistry, + t, } from '@superset-ui/core'; import wrapSvgText from './utils/wrapSvgText'; @@ -381,7 +382,10 @@ function Sunburst(element, props) { .append('text') .attr('class', 'path-abs-percent') .attr('y', yOffsets[offsetIndex]) - .text(`${absolutePercString} of total`); + // eslint-disable-next-line prefer-template + .text(absolutePercString + ' ' + t('of total')); + + const OF_PARENT_TEXT = t('of parent'); if (conditionalPercString) { offsetIndex += 1; @@ -389,7 +393,7 @@ function Sunburst(element, props) { .append('text') .attr('class', 'path-cond-percent') .attr('y', yOffsets[offsetIndex]) - .text(`${conditionalPercString} of parent`); + .text(`${conditionalPercString} ${OF_PARENT_TEXT}`); } offsetIndex += 1; diff --git a/superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts b/superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts index df50be9c4d16..32b56fb9e4af 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts @@ -20,6 +20,7 @@ import { t } from '@superset-ui/core'; import { ControlPanelConfig, ControlPanelsContainerProps, + getStandardizedControls, sections, } from '@superset-ui/chart-controls'; @@ -96,6 +97,12 @@ const config: ControlPanelConfig = { description: t('This defines the level of the hierarchy'), }, }, + formDataOverrides: formData => ({ + ...formData, + groupby: getStandardizedControls().popAllColumns(), + metric: getStandardizedControls().shiftMetric(), + secondary_metric: getStandardizedControls().shiftMetric(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js b/superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js index 0b517d6a2d6a..5603d7e30100 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js +++ b/superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js @@ -37,7 +37,7 @@ const metadata = new ChartMetadata({ { url: example3 }, { url: example4 }, ], - name: t('Treemap'), + name: t('Treemap (legacy)'), tags: [ t('Categorical'), t('Legacy'), diff --git a/superset-frontend/plugins/legacy-plugin-chart-world-map/src/WorldMap.js b/superset-frontend/plugins/legacy-plugin-chart-world-map/src/WorldMap.js index 1d51a7e84051..7b56d432eaaa 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-world-map/src/WorldMap.js +++ b/superset-frontend/plugins/legacy-plugin-chart-world-map/src/WorldMap.js @@ -24,6 +24,8 @@ import { getNumberFormatter, getSequentialSchemeRegistry, CategoricalColorNamespace, + logging, + t, } from '@superset-ui/core'; import Datamap from 'datamaps/dist/datamaps.world.min'; import { ColorBy } from './utils'; @@ -50,6 +52,8 @@ const formatter = getNumberFormatter(); function WorldMap(element, props) { const { + countryFieldtype, + entity, data, width, height, @@ -61,6 +65,8 @@ function WorldMap(element, props) { colorScheme, sliceId, theme, + onContextMenu, + inContextMenu, } = props; const div = d3.select(element); div.classed('superset-legacy-chart-world-map', true); @@ -102,6 +108,31 @@ function WorldMap(element, props) { mapData[d.country] = d; }); + const handleContextMenu = source => { + const pointerEvent = d3.event; + pointerEvent.preventDefault(); + const key = source.id || source.country; + const val = countryFieldtype === 'name' ? mapData[key]?.name : key; + if (val) { + const filters = [ + { + col: entity, + op: '==', + val, + formattedVal: val, + }, + ]; + onContextMenu(pointerEvent.clientX, pointerEvent.clientY, filters); + } else { + logging.warn( + t( + `Unable to process right-click on %s. Check you chart configuration.`, + ), + key, + ); + } + }; + const map = new Datamap({ element, width, @@ -111,8 +142,8 @@ function WorldMap(element, props) { defaultFill: theme.colors.grayscale.light2, }, geographyConfig: { - popupOnHover: true, - highlightOnHover: true, + popupOnHover: !inContextMenu, + highlightOnHover: !inContextMenu, borderWidth: 1, borderColor: theme.colors.grayscale.light5, highlightBorderColor: theme.colors.grayscale.light5, @@ -127,7 +158,7 @@ function WorldMap(element, props) { borderWidth: 1, borderOpacity: 1, borderColor: color, - popupOnHover: true, + popupOnHover: !inContextMenu, radius: null, popupTemplate: (geo, d) => `<div class="hoverinfo"><strong>${d.name}</strong><br>${formatter( @@ -135,7 +166,7 @@ function WorldMap(element, props) { )}</div>`, fillOpacity: 0.5, animate: true, - highlightOnHover: true, + highlightOnHover: !inContextMenu, highlightFillColor: color, highlightBorderColor: theme.colors.grayscale.dark2, highlightBorderWidth: 2, @@ -144,6 +175,11 @@ function WorldMap(element, props) { exitDelay: 100, key: JSON.stringify, }, + done: datamap => { + datamap.svg + .selectAll('.datamaps-subunit') + .on('contextmenu', handleContextMenu); + }, }); map.updateChoropleth(mapData); @@ -153,7 +189,8 @@ function WorldMap(element, props) { div .selectAll('circle.datamaps-bubble') .style('fill', color) - .style('stroke', color); + .style('stroke', color) + .on('contextmenu', handleContextMenu); } } diff --git a/superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts b/superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts index f9f7dfb09dc2..b0f3be22c50e 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts +++ b/superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts @@ -20,6 +20,7 @@ import { t } from '@superset-ui/core'; import { ControlPanelConfig, formatSelectOptions, + getStandardizedControls, sections, } from '@superset-ui/chart-controls'; import { ColorBy } from './utils'; @@ -40,10 +41,10 @@ const config: ControlPanelConfig = { label: t('Country Field Type'), default: 'cca2', choices: [ - ['name', 'Full name'], - ['cioc', 'code International Olympic Committee (cioc)'], - ['cca2', 'code ISO 3166-1 alpha-2 (cca2)'], - ['cca3', 'code ISO 3166-1 alpha-3 (cca3)'], + ['name', t('Full name')], + ['cioc', t('code International Olympic Committee (cioc)')], + ['cca2', t('code ISO 3166-1 alpha-2 (cca2)')], + ['cca3', t('code ISO 3166-1 alpha-3 (cca3)')], ], description: t( 'The country code standard that Superset should expect ' + @@ -152,9 +153,10 @@ const config: ControlPanelConfig = { Boolean(controls?.color_by.value === ColorBy.country), }, }, - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, + entity: getStandardizedControls().shiftColumn(), + metric: getStandardizedControls().shiftMetric(), }), }; diff --git a/superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js b/superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js index d97adfadf36c..6303caec08db 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js +++ b/superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; +import { t, ChartMetadata, ChartPlugin, Behavior } from '@superset-ui/core'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; import example1 from './images/WorldMap1.jpg'; @@ -45,6 +45,7 @@ const metadata = new ChartMetadata({ ], thumbnail, useLegacyApi: true, + behaviors: [Behavior.DRILL_TO_DETAIL], }); export default class WorldMapChartPlugin extends ChartPlugin { diff --git a/superset-frontend/plugins/legacy-plugin-chart-world-map/src/transformProps.js b/superset-frontend/plugins/legacy-plugin-chart-world-map/src/transformProps.js index fd5f109c0d40..6348874eaba0 100644 --- a/superset-frontend/plugins/legacy-plugin-chart-world-map/src/transformProps.js +++ b/superset-frontend/plugins/legacy-plugin-chart-world-map/src/transformProps.js @@ -19,8 +19,12 @@ import { rgb } from 'd3-color'; export default function transformProps(chartProps) { - const { width, height, formData, queriesData } = chartProps; + const { width, height, formData, queriesData, hooks, inContextMenu } = + chartProps; + const { onContextMenu } = hooks; const { + countryFieldtype, + entity, maxBubbleSize, showBubbles, linearColorScheme, @@ -32,6 +36,8 @@ export default function transformProps(chartProps) { const { r, g, b } = colorPicker; return { + countryFieldtype, + entity, data: queriesData[0].data, width, height, @@ -42,5 +48,7 @@ export default function transformProps(chartProps) { colorBy, colorScheme, sliceId, + onContextMenu, + inContextMenu, }; } diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/package.json b/superset-frontend/plugins/legacy-preset-chart-deckgl/package.json index 7b11af60566e..83a4a977324f 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/package.json +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/package.json @@ -5,13 +5,13 @@ "keywords": [ "superset" ], - "homepage": "https://github.com/apache-superset/superset-ui-plugins-deckgl#readme", + "homepage": "https://superset.apache.org/", "bugs": { - "url": "https://github.com/apache-superset/superset-ui-plugins-deckgl/issues" + "url": "https://github.com/apache/superset/issues" }, "repository": { "type": "git", - "url": "git+https://github.com/apache-superset/superset-ui-plugins-deckgl.git" + "url": "git+https://github.com/apache/superset.git" }, "license": "Apache-2.0", "author": "Superset", @@ -37,17 +37,17 @@ "mousetrap": "^1.6.1", "prop-types": "^15.6.0", "react-bootstrap-slider": "2.1.5", - "underscore": "^1.8.3", + "underscore": "^1.12.1", "urijs": "^1.19.8", "xss": "^1.0.10" }, "peerDependencies": { "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", + "mapbox-gl": "*", "react": "^16.13.1", "react-dom": "^16.13.1", - "react-map-gl": "^4.0.10", - "mapbox-gl": "*" + "react-map-gl": "^6.1.19" }, "publishConfig": { "access": "public" diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/components/PlaySlider.jsx b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/components/PlaySlider.jsx index eda7803f2175..1705b8f53384 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/components/PlaySlider.jsx +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/components/PlaySlider.jsx @@ -27,7 +27,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import Mousetrap from 'mousetrap'; import { t, styled } from '@superset-ui/core'; -import BootrapSliderWrapper from './BootstrapSliderWrapper'; +import BootstrapSliderWrapper from './BootstrapSliderWrapper'; const StyledSlider = styled.div` ${({ theme }) => ` @@ -210,7 +210,7 @@ export default class PlaySlider extends React.PureComponent { /> </div> <div className="play-slider-scrobbler padded"> - <BootrapSliderWrapper + <BootstrapSliderWrapper value={range ? values : values[0]} range={range} formatter={this.formatter} diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/Arc.jsx b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/Arc.jsx index a2c8e6143610..75cf8d09a18c 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/Arc.jsx +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/Arc.jsx @@ -37,11 +37,11 @@ function setTooltipContent(formData) { return o => ( <div className="deckgl-tooltip"> <TooltipRow - label={`${t('Start (Longitude, Latitude)')}: `} + label={t('Start (Longitude, Latitude): ')} value={`${o.object.sourcePosition[0]}, ${o.object.sourcePosition[1]}`} /> <TooltipRow - label={`${t('End (Longitude, Latitude)')}: `} + label={t('End (Longitude, Latitude): ')} value={`${o.object.targetPosition[0]}, ${o.object.targetPosition[1]}`} /> {formData.dimension && ( diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/Grid.jsx b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/Grid.jsx index a010d70c19d9..d19ef3edb161 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/Grid.jsx +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/Grid.jsx @@ -18,10 +18,11 @@ */ import { GridLayer } from 'deck.gl'; import React from 'react'; -import { t } from '@superset-ui/core'; +import { t, CategoricalColorNamespace } from '@superset-ui/core'; import { commonLayerProps, getAggFunc } from '../common'; import sandboxedEval from '../../utils/sandbox'; +import { hexToRGB } from '../../utils/colors'; import { createDeckGLComponent } from '../../factory'; import TooltipRow from '../../TooltipRow'; @@ -29,11 +30,13 @@ function setTooltipContent(o) { return ( <div className="deckgl-tooltip"> <TooltipRow - label={`${t('Longitude and Latitude')}: `} + // eslint-disable-next-line prefer-template + label={t('Longitude and Latitude') + ': '} value={`${o.coordinate[0]}, ${o.coordinate[1]}`} /> <TooltipRow - label={`${t('Height')}: `} + // eslint-disable-next-line prefer-template + label={t('Height') + ': '} value={`${o.object.elevationValue}`} /> </div> @@ -42,11 +45,9 @@ function setTooltipContent(o) { export function getLayer(formData, payload, onAddFilter, setTooltip) { const fd = formData; - const c = fd.color_picker; - let data = payload.data.features.map(d => ({ - ...d, - color: [c.r, c.g, c.b, 255 * c.a], - })); + const colorScale = CategoricalColorNamespace.getScale(fd.color_scheme); + const colorRange = colorScale.range().map(color => hexToRGB(color)); + let data = payload.data.features; if (fd.js_data_mutator) { // Applying user defined data mutator if defined @@ -61,9 +62,8 @@ export function getLayer(formData, payload, onAddFilter, setTooltip) { data, pickable: true, cellSize: fd.grid_size, - minColor: [0, 0, 0, 0], extruded: fd.extruded, - maxColor: [c.r, c.g, c.b, 255 * c.a], + colorRange, outline: false, getElevationValue: aggFunc, getColorValue: aggFunc, diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts index a96fe21dd68a..9b8e33d73981 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts @@ -16,7 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -import { ControlPanelConfig, sections } from '@superset-ui/chart-controls'; +import { + ControlPanelConfig, + getStandardizedControls, + sections, +} from '@superset-ui/chart-controls'; import { t, validateNonEmpty } from '@superset-ui/core'; import { filterNulls, @@ -50,8 +54,10 @@ const config: ControlPanelConfig = { label: t('Map'), controlSetRows: [ [mapboxStyle, viewport], - ['color_picker', autozoom], - [gridSize, extruded], + ['color_scheme'], + [autozoom], + [gridSize], + [extruded], ], }, { @@ -71,6 +77,10 @@ const config: ControlPanelConfig = { validators: [validateNonEmpty], }, }, + formDataOverrides: formData => ({ + ...formData, + size: getStandardizedControls().shiftMetric(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/Hex.jsx b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/Hex.jsx index 46b3c59974da..a3c430acb19f 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/Hex.jsx +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/Hex.jsx @@ -18,10 +18,11 @@ */ import { HexagonLayer } from 'deck.gl'; import React from 'react'; -import { t } from '@superset-ui/core'; +import { t, CategoricalColorNamespace } from '@superset-ui/core'; import { commonLayerProps, getAggFunc } from '../common'; import sandboxedEval from '../../utils/sandbox'; +import { hexToRGB } from '../../utils/colors'; import { createDeckGLComponent } from '../../factory'; import TooltipRow from '../../TooltipRow'; @@ -29,11 +30,12 @@ function setTooltipContent(o) { return ( <div className="deckgl-tooltip"> <TooltipRow - label={`${t('Centroid (Longitude and Latitude)')}: `} + label={t('Centroid (Longitude and Latitude): ')} value={`(${o.coordinate[0]}, ${o.coordinate[1]})`} /> <TooltipRow - label={`${t('Height')}: `} + // eslint-disable-next-line prefer-template + label={t('Height') + ': '} value={`${o.object.elevationValue}`} /> </div> @@ -42,11 +44,9 @@ function setTooltipContent(o) { export function getLayer(formData, payload, onAddFilter, setTooltip) { const fd = formData; - const c = fd.color_picker; - let data = payload.data.features.map(d => ({ - ...d, - color: [c.r, c.g, c.b, 255 * c.a], - })); + const colorScale = CategoricalColorNamespace.getScale(fd.color_scheme); + const colorRange = colorScale.range().map(color => hexToRGB(color)); + let data = payload.data.features; if (fd.js_data_mutator) { // Applying user defined data mutator if defined @@ -60,9 +60,8 @@ export function getLayer(formData, payload, onAddFilter, setTooltip) { data, pickable: true, radius: fd.grid_size, - minColor: [0, 0, 0, 0], extruded: fd.extruded, - maxColor: [c.r, c.g, c.b, 255 * c.a], + colorRange, outline: false, getElevationValue: aggFunc, getColorValue: aggFunc, diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts index 4db5e39b964a..2f9293c52182 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts @@ -16,9 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -import { ControlPanelConfig, sections } from '@superset-ui/chart-controls'; +import { + ControlPanelConfig, + getStandardizedControls, + sections, +} from '@superset-ui/chart-controls'; import { t } from '@superset-ui/core'; -import { formatSelectOptions } from '../../utilities/utils'; import { autozoom, extruded, @@ -51,7 +54,7 @@ const config: ControlPanelConfig = { label: t('Map'), controlSetRows: [ [mapboxStyle, viewport], - ['color_picker'], + ['color_scheme'], [autozoom], [gridSize], [extruded], @@ -67,20 +70,20 @@ const config: ControlPanelConfig = { default: 'sum', clearable: false, renderTrigger: true, - choices: formatSelectOptions([ - 'sum', - 'min', - 'max', - 'mean', - 'median', - 'count', - 'variance', - 'deviation', - 'p1', - 'p5', - 'p95', - 'p99', - ]), + choices: [ + ['sum', t('sum')], + ['min', t('min')], + ['max', t('max')], + ['mean', t('mean')], + ['median', t('median')], + ['count', t('count')], + ['variance', t('variance')], + ['deviation', t('deviation')], + ['p1', t('p1')], + ['p5', t('p5')], + ['p95', t('p95')], + ['p99', t('p99')], + ], }, }, ], @@ -96,6 +99,10 @@ const config: ControlPanelConfig = { ], }, ], + formDataOverrides: formData => ({ + ...formData, + size: getStandardizedControls().shiftMetric(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/controlPanel.ts index 99866115ab02..cdbb06746bc9 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/controlPanel.ts @@ -52,8 +52,8 @@ const config: ControlPanelConfig = { config: { ...lineType.config, choices: [ - ['polyline', 'Polyline'], - ['json', 'JSON'], + ['polyline', t('Polyline')], + ['json', t('JSON')], ], }, }, diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/Polygon.jsx b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/Polygon.jsx index bdd4f66bc116..81df4384f9da 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/Polygon.jsx +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/Polygon.jsx @@ -22,6 +22,7 @@ /* eslint no-underscore-dangle: ["error", { "allow": ["", "__timestamp"] }] */ import React from 'react'; +import { t } from '@superset-ui/core'; import PropTypes from 'prop-types'; import { PolygonLayer } from 'deck.gl'; @@ -39,7 +40,7 @@ import getPointsFromPolygon from '../../utils/getPointsFromPolygon'; // eslint-disable-next-line import/extensions import fitViewport from '../../utils/fitViewport'; -const DOUBLE_CLICK_TRESHOLD = 250; // milliseconds +const DOUBLE_CLICK_THRESHOLD = 250; // milliseconds function getElevation(d, colorScaler) { /* in deck.gl 5.3.4 (used in Superset as of 2018-10-24), if a polygon has @@ -57,7 +58,11 @@ function setTooltipContent(formData) { return ( <div className="deckgl-tooltip"> {o.object.name && ( - <TooltipRow label="name: " value={`${o.object.name}`} /> + <TooltipRow + // eslint-disable-next-line prefer-template + label={t('name') + ': '} + value={`${o.object.name}`} + /> )} {o.object[formData.line_column] && ( <TooltipRow @@ -223,7 +228,7 @@ class DeckGLPolygon extends React.Component { const { formData, onAddFilter } = this.props; const now = new Date(); - const doubleClick = now - this.state.lastClick <= DOUBLE_CLICK_TRESHOLD; + const doubleClick = now - this.state.lastClick <= DOUBLE_CLICK_THRESHOLD; // toggle selected polygons const selected = [...this.state.selected]; diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts index faea2336bb48..a226004c76f7 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts @@ -16,7 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -import { ControlPanelConfig, sections } from '@superset-ui/chart-controls'; +import { + ControlPanelConfig, + getStandardizedControls, + sections, +} from '@superset-ui/chart-controls'; import { FeatureFlag, isFeatureEnabled, t } from '@superset-ui/core'; import timeGrainSqlaAnimationOverrides from '../../utilities/controls'; import { formatSelectOptions } from '../../utilities/utils'; @@ -194,6 +198,10 @@ const config: ControlPanelConfig = { }, time_grain_sqla: timeGrainSqlaAnimationOverrides, }, + formDataOverrides: formData => ({ + ...formData, + metric: getStandardizedControls().shiftMetric(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/Scatter.jsx b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/Scatter.jsx index ca0162fa3a1c..3ad0dcea986b 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/Scatter.jsx +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/Scatter.jsx @@ -36,12 +36,14 @@ function setTooltipContent(formData, verboseMap) { return ( <div className="deckgl-tooltip"> <TooltipRow - label={`${t('Longitude and Latitude')}: `} + // eslint-disable-next-line prefer-template + label={t('Longitude and Latitude') + ': '} value={`${o.object.position[0]}, ${o.object.position[1]}`} /> {o.object.cat_color && ( <TooltipRow - label={`${t('Category')}: `} + // eslint-disable-next-line prefer-template + label={t('Category') + ': '} value={`${o.object.cat_color}`} /> )} diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts index 4932019bb7ad..ef3d45a95685 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts @@ -80,12 +80,12 @@ const config: ControlPanelConfig = { default: 'square_m', clearable: false, choices: [ - ['square_m', 'Square meters'], - ['square_km', 'Square kilometers'], - ['square_miles', 'Square miles'], - ['radius_m', 'Radius in meters'], - ['radius_km', 'Radius in kilometers'], - ['radius_miles', 'Radius in miles'], + ['square_m', t('Square meters')], + ['square_km', t('Square kilometers')], + ['square_miles', t('Square miles')], + ['radius_m', t('Radius in meters')], + ['radius_km', t('Radius in kilometers')], + ['radius_miles', t('Radius in miles')], ], description: t( 'The unit of measure for the specified point radius', @@ -119,7 +119,7 @@ const config: ControlPanelConfig = { renderTrigger: true, default: 250, description: t( - 'Maxium radius size of the circle, in pixels. As the zoom level changes, this ' + + 'Maximum radius size of the circle, in pixels. As the zoom level changes, this ' + 'insures that the circle respects this maximum radius.', ), }, diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/Screengrid.jsx b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/Screengrid.jsx index ca61ec0b81cc..7883dda17ed6 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/Screengrid.jsx +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/Screengrid.jsx @@ -40,10 +40,15 @@ function setTooltipContent(o) { return ( <div className="deckgl-tooltip"> <TooltipRow - label={`${t('Longitude and Latitude')}: `} + // eslint-disable-next-line prefer-template + label={t('Longitude and Latitude') + ': '} value={`${o.coordinate[0]}, ${o.coordinate[1]}`} /> - <TooltipRow label={`${t('Weight')}: `} value={`${o.object.cellWeight}`} /> + <TooltipRow + // eslint-disable-next-line prefer-template + label={t('Weight') + ': '} + value={`${o.object.cellWeight}`} + /> </div> ); } diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts index 733d12ca21b8..caf052581cbb 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts @@ -16,7 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -import { ControlPanelConfig, sections } from '@superset-ui/chart-controls'; +import { + ControlPanelConfig, + getStandardizedControls, + sections, +} from '@superset-ui/chart-controls'; import { t, validateNonEmpty } from '@superset-ui/core'; import timeGrainSqlaAnimationOverrides from '../../utilities/controls'; import { @@ -76,6 +80,10 @@ const config: ControlPanelConfig = { }, time_grain_sqla: timeGrainSqlaAnimationOverrides, }, + formDataOverrides: formData => ({ + ...formData, + size: getStandardizedControls().shiftMetric(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx index f665c118eacc..3ae47ac054e8 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx @@ -38,8 +38,8 @@ const DEFAULT_VIEWPORT = { }; const sandboxUrl = - 'https://github.com/apache/incubator-superset/' + - 'blob/master/superset-frontend/src/modules/sandbox.js'; + 'https://github.com/apache/superset/' + + 'blob/master/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/sandbox.js'; const jsFunctionInfo = ( <div> {t( @@ -121,7 +121,7 @@ export const jsColumns = { label: t('Extra data for JS'), default: [], description: t( - 'List of extra columns made available in Javascript functions', + 'List of extra columns made available in JavaScript functions', ), }, }; @@ -129,7 +129,7 @@ export const jsColumns = { export const jsDataMutator = { name: 'js_data_mutator', config: jsFunctionControl( - t('Javascript data interceptor'), + t('JavaScript data interceptor'), t( 'Define a javascript function that receives the data array used in the visualization ' + 'and is expected to return a modified version of that array. This can be used ' + @@ -141,7 +141,7 @@ export const jsDataMutator = { export const jsTooltip = { name: 'js_tooltip', config: jsFunctionControl( - t('Javascript tooltip generator'), + t('JavaScript tooltip generator'), t( 'Define a function that receives the input and outputs the content for a tooltip', ), @@ -151,7 +151,7 @@ export const jsTooltip = { export const jsOnclickHref = { name: 'js_onclick_href', config: jsFunctionControl( - t('Javascript onClick href'), + t('JavaScript onClick href'), t('Define a function that returns a URL to navigate to when user clicks'), ), }; @@ -179,11 +179,11 @@ export const legendPosition = { clearable: false, default: 'tr', choices: [ - [null, 'None'], - ['tl', 'Top left'], - ['tr', 'Top right'], - ['bl', 'Bottom left'], - ['br', 'Bottom right'], + [null, t('None')], + ['tl', t('Top left')], + ['tr', t('Top right')], + ['bl', t('Bottom left')], + ['br', t('Bottom right')], ], renderTrigger: true, }, @@ -270,7 +270,7 @@ export const extruded = { label: t('Extruded'), renderTrigger: true, default: true, - description: 'Whether to make the grid 3D', + description: t('Whether to make the grid 3D'), }, }; @@ -347,9 +347,9 @@ export const lineType = { default: 'json', description: t('The encoding format of the lines'), choices: [ - ['polyline', 'Polyline'], - ['json', 'JSON'], - ['geohash', 'geohash (square)'], + ['polyline', t('Polyline')], + ['json', t('JSON')], + ['geohash', t('geohash (square)')], ], }, }; @@ -371,12 +371,12 @@ export const mapboxStyle = { clearable: false, renderTrigger: true, choices: [ - ['mapbox://styles/mapbox/streets-v9', 'Streets'], - ['mapbox://styles/mapbox/dark-v9', 'Dark'], - ['mapbox://styles/mapbox/light-v9', 'Light'], - ['mapbox://styles/mapbox/satellite-streets-v9', 'Satellite Streets'], - ['mapbox://styles/mapbox/satellite-v9', 'Satellite'], - ['mapbox://styles/mapbox/outdoors-v9', 'Outdoors'], + ['mapbox://styles/mapbox/streets-v9', t('Streets')], + ['mapbox://styles/mapbox/dark-v9', t('Dark')], + ['mapbox://styles/mapbox/light-v9', t('Light')], + ['mapbox://styles/mapbox/satellite-streets-v9', t('Satellite Streets')], + ['mapbox://styles/mapbox/satellite-v9', t('Satellite')], + ['mapbox://styles/mapbox/outdoors-v9', t('Outdoors')], ], default: 'mapbox://styles/mapbox/light-v9', description: t('Base layer map style'), diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/sharedDndControls.jsx b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/sharedDndControls.jsx index 6027b87f1020..30ffd27287ad 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/sharedDndControls.jsx +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/sharedDndControls.jsx @@ -18,12 +18,12 @@ */ import { t } from '@superset-ui/core'; -import { dndEntity } from '@superset-ui/chart-controls'; +import { sharedControls } from '@superset-ui/chart-controls'; export const dndLineColumn = { name: 'line_column', config: { - ...dndEntity, + ...sharedControls.entity, label: t('Lines column'), description: t('The database columns that contains lines information'), }, @@ -32,7 +32,7 @@ export const dndLineColumn = { export const dndGeojsonColumn = { name: 'geojson', config: { - ...dndEntity, + ...sharedControls.entity, label: t('GeoJson Column'), description: t('Select the geojson column'), }, diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/explore.js b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/explore.js index 5714eb5da105..cf1d691ff916 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/explore.js +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/explore.js @@ -23,7 +23,7 @@ const MAX_URL_LENGTH = 8000; export function getURIDirectory(formData, endpointType = 'base') { // Building the directory part of the URI - let directory = '/superset/explore/'; + let directory = '/explore/'; if (['json', 'csv', 'query', 'results', 'samples'].includes(endpointType)) { directory = '/superset/explore_json/'; } diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/fitViewport.ts b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/fitViewport.ts index 5b5bbb6b478f..c8e2487b90c1 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/fitViewport.ts +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/fitViewport.ts @@ -21,7 +21,7 @@ import computeBoundsFromPoints from './computeBoundsFromPoints'; import { Point } from '../types'; export type Viewport = { - longtitude: number; + longitude: number; latitude: number; zoom: number; bearing?: number; diff --git a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/time.js b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/time.js index 83cb78b494c1..6554adb7a1dd 100644 --- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/time.js +++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utils/time.js @@ -20,7 +20,7 @@ import moment from 'moment'; // array with the minimum values of each part of a timestamp -- note that -// months are zero-indexed in Javascript +// months are zero-indexed in JavaScript const truncatePartTo = [ 1, // year 0, // month @@ -62,13 +62,13 @@ export function truncate(timestamp, step) { function getStepSeconds(step, start) { /* Return number of seconds in a step. * - * The step might be ambigous, eg, "1 month" has a variable number of + * The step might be ambiguous, eg, "1 month" has a variable number of * seconds, which is why we need to know the start time. */ - const startMillliseconds = parseInt(moment(start).format('x'), 10); + const startMilliseconds = parseInt(moment(start).format('x'), 10); const endMilliseconds = parseInt(moment(start).add(step).format('x'), 10); - return endMilliseconds - startMillliseconds; + return endMilliseconds - startMilliseconds; } export function getPlaySliderParams(timestamps, timeGrain) { diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts index c3c08a23c028..d06883a222f0 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts @@ -52,9 +52,9 @@ const config: ControlPanelConfig = { label: t('Stacked Style'), renderTrigger: true, choices: [ - ['stack', 'stack'], - ['stream', 'stream'], - ['expand', 'expand'], + ['stack', t('stack')], + ['stream', t('stream')], + ['expand', t('expand')], ], default: 'stack', description: '', diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js index 1b31acfd4468..c0208b8e9786 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js @@ -38,7 +38,7 @@ const metadata = new ChartMetadata({ { url: example3, caption: t('Video game consoles') }, { url: example4, caption: t('Vehicle Types') }, ], - name: t('Area Chart'), + name: t('Area Chart (legacy)'), supportedAnnotationTypes: [ANNOTATION_TYPES.INTERVAL, ANNOTATION_TYPES.EVENT], tags: [ t('Aesthetic'), diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts index 91af47f1f793..47fbbd442247 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts @@ -19,6 +19,7 @@ import { t } from '@superset-ui/core'; import { ControlPanelConfig, + getStandardizedControls, sections, sharedControls, } from '@superset-ui/chart-controls'; @@ -63,7 +64,7 @@ const config: ControlPanelConfig = { controlState, ) || {}; timeserieslimitProps.value = state.controls?.limit?.value - ? controlState.value + ? controlState?.value : []; return timeserieslimitProps; }, @@ -122,10 +123,10 @@ const config: ControlPanelConfig = { timeSeriesSection[1], sections.annotations, ], - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, - groupby: formData.standardizedFormData.standardizedState.columns, + metrics: getStandardizedControls().popAllMetrics(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js index 073d533d3819..35a345fdbbaa 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js @@ -32,7 +32,7 @@ const metadata = new ChartMetadata({ 'Visualize how a metric changes over time using bars. Add a group by column to visualize group level metrics and how they change over time.', ), exampleGallery: [{ url: example1 }, { url: example2 }, { url: example3 }], - name: t('Time-series Bar Chart'), + name: t('Time-series Bar Chart (legacy)'), supportedAnnotationTypes: [ANNOTATION_TYPES.INTERVAL, ANNOTATION_TYPES.EVENT], tags: [ t('Bar'), diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts index 33a4ea6bf02c..773caa0fd389 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts @@ -22,6 +22,7 @@ import { formatSelectOptions, D3_FORMAT_OPTIONS, sections, + getStandardizedControls, } from '@superset-ui/chart-controls'; import { showLegend, @@ -128,6 +129,14 @@ const config: ControlPanelConfig = { renderTrigger: false, }, }, + formDataOverrides: formData => ({ + ...formData, + series: getStandardizedControls().shiftColumn(), + entity: getStandardizedControls().shiftColumn(), + x: getStandardizedControls().shiftMetric(), + y: getStandardizedControls().shiftMetric(), + size: getStandardizedControls().shiftMetric(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/images/example.jpg b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b515822fa2c945135da16f4fd7de1462ccbd43a1 GIT binary patch literal 61529 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�Fi-UBU>h&liinIa(C#p-C&YO~@c>&T5M&0eFWV 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 ZVSgUYTg2rk1^9p6iTq!22il(p{}+DG5)1$U literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js index a97d9bd7b67d..4b5a032ee654 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js @@ -18,6 +18,7 @@ */ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from '../transformProps'; +import example from './images/example.jpg'; import thumbnail from './images/thumbnail.png'; import controlPanel from './controlPanel'; @@ -27,6 +28,7 @@ const metadata = new ChartMetadata({ description: t( 'Visualizes a metric across three dimensions of data in a single chart (X axis, Y axis, and bubble size). Bubbles from the same group can be showcased using bubble color.', ), + exampleGallery: [{ url: example }], name: t('Bubble Chart'), tags: [ t('Multi-Dimensions'), diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/images/example.jpg b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..360d255eb5e35402eea107c09ea6216408262fe6 GIT binary patch literal 23045 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 PIIw~LM{R(MHt|0I{|a^o literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js index 2626c42d2cdb..4160d9277094 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js @@ -18,6 +18,7 @@ */ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from '../transformProps'; +import example from './images/example.jpg'; import thumbnail from './images/thumbnail.png'; import controlPanel from './controlPanel'; @@ -27,6 +28,7 @@ const metadata = new ChartMetadata({ description: t( 'Showcases the progress of a single metric against a given target. The higher the fill, the closer the metric is to the target.', ), + exampleGallery: [{ url: example }], name: t('Bullet Chart'), tags: [t('Business'), t('Legacy'), t('Report'), t('nvd3')], thumbnail, diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts index db4a84fd476e..fcae6dd39793 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts @@ -17,7 +17,11 @@ * under the License. */ import { t } from '@superset-ui/core'; -import { ControlPanelConfig, sections } from '@superset-ui/chart-controls'; +import { + ControlPanelConfig, + getStandardizedControls, + sections, +} from '@superset-ui/chart-controls'; import { xAxisLabel, yAxisLabel, @@ -62,6 +66,11 @@ const config: ControlPanelConfig = { timeSeriesSection[1], sections.annotations, ], + formDataOverrides: formData => ({ + ...formData, + groupby: getStandardizedControls().popAllColumns(), + metrics: getStandardizedControls().popAllMetrics(), + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/images/example.jpg b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..375ef57a6aab9c58792cb2fbc32934be63bcd9f5 GIT binary patch literal 66360 zcmeEucU+T8(`W!eMJz}!HhM=&=tZRl2uKN`BOOBT9TY|BN|(?i^n@ZM^di!`l+cTG z>0O%0jqj23>Uq!m-S3v~{&9cb@=IoTW}kU>=b4?Iot@3u$k}JW4Fy?{EC2@w0Kmci z0nTP|MnF<hhL6=$WI;+Ye-PRL*mB`M0AOq9;-n_`=&qKw&fOo^&Wn+Wv%@+5HxSGB z>(CGG0Kfp}-_ZYOmoA%{Ih$ZBZDBtQPS}TI8%v7CNiF`sS$^Qgf8b(2aCa967i^u! zKX4}vH7P7^ip5zhe!-1@!A%^Te$)@c))BL{asBbEALU1jiOlRE>R5OQ`=JFm1JnR= zfJguAzdZr~5ZVU-@ZS9MnsEXEP#y>XP>%ic8pAsP;Q9*ypse?w*ZwIJ2O}pVEPt$! zu^(J>a{yo`8vwYf4FHgQ0sshg|3Slk{hPMk#gb^T?Xt)ISpaMRW`Mf@5Wo�^q`8 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 PcOF1Q>`-CV|Gx<U2p*sL literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js index e417e45e440b..91d6bbb4f774 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js @@ -19,6 +19,7 @@ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from '../transformProps'; import thumbnail from './images/thumbnail.png'; +import example from './images/example.jpg'; import controlPanel from './controlPanel'; const metadata = new ChartMetadata({ @@ -27,6 +28,7 @@ const metadata = new ChartMetadata({ description: t( 'Visualizes many different time-series objects in a single chart. This chart is being deprecated and we recommend using the Time-series Chart instead.', ), + exampleGallery: [{ url: example }], name: t('Time-series Percent Change'), tags: [ t('Legacy'), diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts index 5d526b43e38d..58033938f172 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts @@ -22,6 +22,7 @@ import { ControlPanelConfig, sections, sharedControls, + getStandardizedControls, } from '@superset-ui/chart-controls'; import { showLegend, @@ -133,14 +134,18 @@ const config: ControlPanelConfig = { rerender: ['groupby'], }, }, - denormalizeFormData: formData => { - const columns = - formData.standardizedFormData.standardizedState.columns.filter( - col => !ensureIsArray(formData.groupby).includes(col), + formDataOverrides: formData => { + const columns = getStandardizedControls().controls.columns.filter( + col => !ensureIsArray(formData.groupby).includes(col), + ); + getStandardizedControls().controls.columns = + getStandardizedControls().controls.columns.filter( + col => !columns.includes(col), ); + return { ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, + metrics: getStandardizedControls().popAllMetrics(), columns, }; }, diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js index 16b66c00b4c6..09d289d694e8 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js @@ -16,7 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; +import { + t, + ChartMetadata, + ChartPlugin, + hasGenericChartAxes, +} from '@superset-ui/core'; import transformProps from '../transformProps'; import thumbnail from './images/thumbnail.png'; import example1 from './images/Bar_Chart.jpg'; @@ -35,7 +40,7 @@ const metadata = new ChartMetadata({ { url: example2, caption: 'Grouped style' }, { url: example3 }, ], - name: t('Bar Chart'), + name: hasGenericChartAxes ? t('Bar Chart (legacy)') : t('Bar Chart'), tags: [ t('Additive'), t('Bar'), diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/images/example.jpg b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8a13f67e8203a2ab38bcc6104d2b0c9a933a394 GIT binary patch literal 121614 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 I349*?AB#whegFUf literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js index a314c4650795..218e45f9cd75 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js @@ -19,6 +19,7 @@ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from '../transformProps'; import thumbnail from './images/thumbnail.png'; +import example from './images/example.jpg'; import controlPanel from './controlPanel'; const metadata = new ChartMetadata({ @@ -27,6 +28,7 @@ const metadata = new ChartMetadata({ description: t( 'Visualizes 2 metrics as line plots using the same x-axis. This chart is useful for comparing metrics across the same time range.', ), + exampleGallery: [{ url: example }], name: t('Dual Line Chart'), tags: [t('Legacy'), t('nvd3')], thumbnail, diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts index fa4738ebfd2e..9662cc11d838 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts @@ -17,7 +17,11 @@ * under the License. */ import { t } from '@superset-ui/core'; -import { ControlPanelConfig, sections } from '@superset-ui/chart-controls'; +import { + ControlPanelConfig, + sections, + getStandardizedControls, +} from '@superset-ui/chart-controls'; import { lineInterpolation, showBrush, @@ -96,10 +100,10 @@ const config: ControlPanelConfig = { default: 50000, }, }, - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, - groupby: formData.standardizedFormData.standardizedState.columns, + metrics: getStandardizedControls().popAllMetrics(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js index 3ec8f2c7fd06..0d903ce3ca1b 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js @@ -35,7 +35,7 @@ const metadata = new ChartMetadata({ { url: example2 }, { url: battery, caption: t('Battery level over time') }, ], - name: t('Line Chart'), + name: t('Line Chart (legacy)'), supportedAnnotationTypes: [ ANNOTATION_TYPES.TIME_SERIES, ANNOTATION_TYPES.INTERVAL, diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/images/example.jpg b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ec8881c31b58596b86e7a689942ad109f778a07 GIT binary patch literal 223147 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≈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%0DRTJ=G(Yl;ZTpM3knDyY<k8?Sl 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 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js index 3adcd73a289b..ae7d194b90c9 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js @@ -19,6 +19,7 @@ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from '../transformProps'; import thumbnail from './images/thumbnail.png'; +import example from './images/example.jpg'; import controlPanel from './controlPanel'; const metadata = new ChartMetadata({ @@ -27,6 +28,7 @@ const metadata = new ChartMetadata({ description: t( 'Visualize two different time series using the same x-axis time range. This chart is being deprecated and we recommend using the Mixed Timeseries Chart instead!', ), + exampleGallery: [{ url: example }], name: t('Multiple Line Charts'), tags: [ t('Multi-Variables'), diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx index 3b53b2add08e..a466b337425a 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx @@ -23,7 +23,6 @@ import { t } from '@superset-ui/core'; import { ControlPanelSectionConfig, CustomControlItem, - formatSelectOptions, D3_TIME_FORMAT_OPTIONS, D3_FORMAT_DOCS, D3_FORMAT_OPTIONS, @@ -75,7 +74,15 @@ export const leftMargin: CustomControlItem = { freeForm: true, clearable: false, label: t('Left Margin'), - choices: formatSelectOptions(['auto', 50, 75, 100, 125, 150, 200]), + choices: [ + ['auto', t('auto')], + [50, '50'], + [75, '75'], + [100, '100'], + [125, '125'], + [150, '150'], + [200, '200'], + ], default: 'auto', renderTrigger: true, description: t( @@ -112,14 +119,14 @@ export const lineInterpolation: CustomControlItem = { type: 'SelectControl', label: t('Line Style'), renderTrigger: true, - choices: formatSelectOptions([ - 'linear', - 'basis', - 'cardinal', - 'monotone', - 'step-before', - 'step-after', - ]), + choices: [ + ['linear', t('linear')], + ['basis', t('basis')], + ['cardinal', t('cardinal')], + ['monotone', t('monotone')], + ['step-before', t('step-before')], + ['step-after', t('step-after')], + ], default: 'linear', description: t('Line interpolation as defined by d3.js'), }, @@ -134,9 +141,9 @@ export const showBrush: CustomControlItem = { clearable: false, default: 'auto', choices: [ - ['yes', 'Yes'], - ['no', 'No'], - ['auto', 'Auto'], + ['yes', t('Yes')], + ['no', t('No')], + ['auto', t('Auto')], ], description: t('Whether to display the time range interactive selector'), }, @@ -185,7 +192,15 @@ export const bottomMargin: CustomControlItem = { clearable: false, freeForm: true, label: t('Bottom Margin'), - choices: formatSelectOptions(['auto', 50, 75, 100, 125, 150, 200]), + choices: [ + ['auto', t('auto')], + [50, '50'], + [75, '75'], + [100, '100'], + [125, '125'], + [150, '150'], + [200, '200'], + ], default: 'auto', renderTrigger: true, description: t( @@ -199,7 +214,12 @@ export const xTicksLayout: CustomControlItem = { config: { type: 'SelectControl', label: t('X Tick Layout'), - choices: formatSelectOptions(['auto', 'flat', '45°', 'staggered']), + choices: [ + ['auto', t('auto')], + ['flat', t('flat')], + ['45°', '45°'], + ['staggered', t('staggered')], + ], default: 'auto', clearable: false, renderTrigger: true, @@ -378,13 +398,13 @@ export const timeSeriesSection: ControlPanelSectionConfig[] = [ type: 'SelectControl', label: t('Rolling Function'), default: 'None', - choices: formatSelectOptions([ - 'None', - 'mean', - 'sum', - 'std', - 'cumsum', - ]), + choices: [ + ['None', t('None')], + ['mean', t('mean')], + ['sum', t('sum')], + ['std', t('std')], + ['cumsum', t('cumsum')], + ], description: t( 'Defines a rolling window function to apply, works along ' + 'with the [Periods] text box', @@ -432,22 +452,22 @@ export const timeSeriesSection: ControlPanelSectionConfig[] = [ multi: true, freeForm: true, label: t('Time Shift'), - choices: formatSelectOptions([ - '1 day', - '1 week', - '28 days', - '30 days', - '52 weeks', - '1 year', - '104 weeks', - '2 years', - '156 weeks', - '3 years', - ]), + choices: [ + ['1 day', t('1 day')], + ['1 week', t('1 week')], + ['28 days', t('28 days')], + ['30 days', t('30 days')], + ['52 weeks', t('52 weeks')], + ['1 year', t('1 year')], + ['104 weeks', t('104 weeks')], + ['2 years', t('2 years')], + ['156 weeks', t('156 weeks')], + ['3 years', t('3 years')], + ], description: t( 'Overlay one or more timeseries from a ' + 'relative time period. Expects relative time deltas ' + - 'in natural language (example: 24 hours, 7 days, ' + + 'in natural language (example: 24 hours, 7 days, ' + '52 weeks, 365 days). Free text is supported.', ), }, @@ -461,10 +481,10 @@ export const timeSeriesSection: ControlPanelSectionConfig[] = [ label: t('Calculation type'), default: 'values', choices: [ - ['values', 'Actual Values'], - ['absolute', 'Difference'], - ['percentage', 'Percentage change'], - ['ratio', 'Ratio'], + ['values', t('Actual Values')], + ['absolute', t('Difference')], + ['percentage', t('Percentage change')], + ['ratio', t('Ratio')], ], description: t( 'How to display time shifts: as individual lines; as the ' + @@ -483,7 +503,14 @@ export const timeSeriesSection: ControlPanelSectionConfig[] = [ freeForm: true, label: t('Rule'), default: null, - choices: formatSelectOptions(['1T', '1H', '1D', '7D', '1M', '1AS']), + choices: [ + ['1T', t('1T')], + ['1H', t('1H')], + ['1D', t('1D')], + ['7D', t('7D')], + ['1M', t('1M')], + ['1AS', t('1AS')], + ], description: t('Pandas resample rule'), }, }, @@ -496,14 +523,14 @@ export const timeSeriesSection: ControlPanelSectionConfig[] = [ freeForm: true, label: t('Method'), default: null, - choices: formatSelectOptions([ - 'asfreq', - 'bfill', - 'ffill', - 'median', - 'mean', - 'sum', - ]), + choices: [ + ['asfreq', t('asfreq')], + ['bfill', t('bfill')], + ['ffill', t('ffill')], + ['median', t('median')], + ['mean', t('mean')], + ['sum', t('sum')], + ], description: t('Pandas resample method'), }, }, diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts index 9145d5a8429a..ca4bf66062ae 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts @@ -19,7 +19,9 @@ import { t } from '@superset-ui/core'; import { ControlPanelConfig, + D3_FORMAT_DOCS, D3_FORMAT_OPTIONS, + D3_NUMBER_FORMAT_DESCRIPTION_PERCENTAGE_TEXT, } from '@superset-ui/chart-controls'; import { showLegend } from '../NVD3Controls'; @@ -48,12 +50,12 @@ const config: ControlPanelConfig = { default: 'key', renderTrigger: true, choices: [ - ['key', 'Category Name'], - ['value', 'Value'], - ['percent', 'Percentage'], - ['key_value', 'Category and Value'], - ['key_percent', 'Category and Percentage'], - ['key_value_percent', 'Category, Value and Percentage'], + ['key', t('Category Name')], + ['value', t('Value')], + ['percent', t('Percentage')], + ['key_value', t('Category and Value')], + ['key_percent', t('Category and Percentage')], + ['key_value_percent', t('Category, Value and Percentage')], ], description: t('What should be shown on the label?'), }, @@ -67,11 +69,7 @@ const config: ControlPanelConfig = { renderTrigger: true, default: 'SMART_NUMBER', choices: D3_FORMAT_OPTIONS, - description: `${t( - 'D3 format syntax: https://github.com/d3/d3-format', - )} ${t( - 'Only applies when the "Label Type" is not set to a percentage.', - )}`, + description: `${D3_FORMAT_DOCS} ${D3_NUMBER_FORMAT_DESCRIPTION_PERCENTAGE_TEXT}`, }, }, ], @@ -97,7 +95,7 @@ const config: ControlPanelConfig = { renderTrigger: true, default: true, description: t( - 'Whether to display the labels. Note that the label only displays when the the 5% ' + + 'Whether to display the labels. Note that the label only displays when the 5% ' + 'threshold.', ), }, diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts index 2d1f765c31f9..595d5d4b7211 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts @@ -20,6 +20,7 @@ import { t } from '@superset-ui/core'; import { ControlPanelConfig, D3_FORMAT_OPTIONS, + getStandardizedControls, sections, } from '@superset-ui/chart-controls'; import { @@ -55,12 +56,12 @@ const config: ControlPanelConfig = { freeForm: true, clearable: false, choices: [ - ['AS', 'Year (freq=AS)'], - ['52W-MON', '52 weeks starting Monday (freq=52W-MON)'], - ['W-SUN', '1 week starting Sunday (freq=W-SUN)'], - ['W-MON', '1 week starting Monday (freq=W-MON)'], - ['D', 'Day (freq=D)'], - ['4W-MON', '4 weeks (freq=4W-MON)'], + ['AS', t('Year (freq=AS)')], + ['52W-MON', t('52 weeks starting Monday (freq=52W-MON)')], + ['W-SUN', t('1 week starting Sunday (freq=W-SUN)')], + ['W-MON', t('1 week starting Monday (freq=W-MON)')], + ['D', t('Day (freq=D)')], + ['4W-MON', t('4 weeks (freq=4W-MON)')], ], description: t( `The periodicity over which to pivot time. Users can provide @@ -123,6 +124,10 @@ const config: ControlPanelConfig = { clearable: false, }, }, + formDataOverrides: formData => ({ + ...formData, + metric: getStandardizedControls().shiftMetric, + }), }; export default config; diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/vendor/superset/AnnotationTypes.js b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/vendor/superset/AnnotationTypes.js index 384c29b3047f..6a91617c5afc 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/vendor/superset/AnnotationTypes.js +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/vendor/superset/AnnotationTypes.js @@ -16,6 +16,8 @@ * specific language governing permissions and limitations * under the License. */ +import { t } from '@superset-ui/core'; + function extractTypes(metadata) { return Object.keys(metadata).reduce((prev, key) => { const result = prev; @@ -28,21 +30,21 @@ function extractTypes(metadata) { export const ANNOTATION_TYPES_METADATA = { FORMULA: { value: 'FORMULA', - label: 'Formula', + label: t('Formula'), }, EVENT: { value: 'EVENT', - label: 'Event', + label: t('Event'), supportNativeSource: true, }, INTERVAL: { value: 'INTERVAL', - label: 'Interval', + label: t('Interval'), supportNativeSource: true, }, TIME_SERIES: { value: 'TIME_SERIES', - label: 'Time Series', + label: t('Time Series'), }, }; diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/vendor/superset/exploreUtils.js b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/vendor/superset/exploreUtils.js index cb2561efb866..c4c9c3264ec0 100644 --- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/vendor/superset/exploreUtils.js +++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/vendor/superset/exploreUtils.js @@ -24,7 +24,7 @@ const MAX_URL_LENGTH = 8000; export function getURIDirectory(formData, endpointType = 'base') { // Building the directory part of the URI - let directory = '/superset/explore/'; + let directory = '/explore/'; if (['json', 'csv', 'query', 'results', 'samples'].includes(endpointType)) { directory = '/superset/explore_json/'; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/package.json b/superset-frontend/plugins/plugin-chart-echarts/package.json index 0c5cbcf595ae..3326bad60ddc 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/package.json +++ b/superset-frontend/plugins/plugin-chart-echarts/package.json @@ -27,7 +27,7 @@ }, "dependencies": { "d3-array": "^1.2.0", - "echarts": "^5.3.2", + "echarts": "^5.4.1", "lodash": "^4.17.15", "moment": "^2.26.0" }, diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts index 94dd45830556..daacaa283ae2 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts @@ -21,13 +21,14 @@ import { ControlPanelConfig, D3_FORMAT_DOCS, D3_TIME_FORMAT_OPTIONS, + getStandardizedControls, sections, } from '@superset-ui/chart-controls'; import { headerFontSize, subheaderFontSize } from '../sharedControls'; export default { controlPanelSections: [ - sections.legacyTimeseriesTime, + sections.legacyRegularTime, { label: t('Query'), expanded: true, @@ -96,12 +97,8 @@ export default { label: t('Number format'), }, }, - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metric: formData.standardizedFormData.standardizedState.metrics[0], - }), - updateStandardizedState: (prevState, currState) => ({ - ...currState, - metrics: [currState.metrics[0], ...prevState.metrics.slice(1)], + metric: getStandardizedControls().shiftMetric(), }), } as ControlPanelConfig; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts index 3f45db74cfd9..75401411a8de 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; +import { t, ChartMetadata, ChartPlugin, Behavior } from '@superset-ui/core'; import controlPanel from './controlPanel'; import transformProps from './transformProps'; import buildQuery from './buildQuery'; @@ -46,6 +46,7 @@ const metadata = new ChartMetadata({ t('Description'), ], thumbnail, + behaviors: [Behavior.DRILL_TO_DETAIL], }); export default class BigNumberTotalChartPlugin extends ChartPlugin< diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.ts index 23126739346c..e690b1ef52bb 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.ts @@ -23,11 +23,15 @@ import { extractTimegrain, QueryFormData, } from '@superset-ui/core'; -import { BigNumberTotalChartProps } from '../types'; +import { BigNumberTotalChartProps, BigNumberVizProps } from '../types'; import { getDateFormatter, parseMetricValue } from '../utils'; +import { Refs } from '../../types'; -export default function transformProps(chartProps: BigNumberTotalChartProps) { - const { width, height, queriesData, formData, rawFormData } = chartProps; +export default function transformProps( + chartProps: BigNumberTotalChartProps, +): BigNumberVizProps { + const { width, height, queriesData, formData, rawFormData, hooks } = + chartProps; const { headerFontSize, metric = 'value', @@ -37,6 +41,7 @@ export default function transformProps(chartProps: BigNumberTotalChartProps) { timeFormat, yAxisFormat, } = formData; + const refs: Refs = {}; const { data = [], coltypes = [] } = queriesData[0]; const granularity = extractTimegrain(rawFormData as QueryFormData); const metricName = getMetricLabel(metric); @@ -45,7 +50,7 @@ export default function transformProps(chartProps: BigNumberTotalChartProps) { data.length === 0 ? null : parseMetricValue(data[0][metricName]); let metricEntry; - if (chartProps.datasource && chartProps.datasource.metrics) { + if (chartProps.datasource?.metrics) { metricEntry = chartProps.datasource.metrics.find( metricItem => metricItem.metric_name === metric, ); @@ -64,6 +69,8 @@ export default function transformProps(chartProps: BigNumberTotalChartProps) { ? formatTime : getNumberFormatter(yAxisFormat ?? metricEntry?.d3format ?? undefined); + const { onContextMenu } = hooks; + return { width, height, @@ -72,5 +79,7 @@ export default function transformProps(chartProps: BigNumberTotalChartProps) { headerFontSize, subheaderFontSize, subheader: formattedSubheader, + onContextMenu, + refs, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx index d14cc7dcefa2..669926d58ba8 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx @@ -16,20 +16,19 @@ * specific language governing permissions and limitations * under the License. */ -import React from 'react'; +import React, { MouseEvent } from 'react'; import { t, getNumberFormatter, - NumberFormatter, smartDateVerboseFormatter, - TimeFormatter, computeMaxFontSize, BRAND_COLOR, styled, + BinaryQueryObjectFilterClause, } from '@superset-ui/core'; -import { EChartsCoreOption } from 'echarts'; import Echart from '../components/Echart'; -import { TimeSeriesDatum } from './types'; +import { BigNumberVizProps } from './types'; +import { EventHandlers } from '../types'; const defaultNumberFormatter = getNumberFormatter(); @@ -42,29 +41,7 @@ const PROPORTION = { TRENDLINE: 0.3, }; -type BigNumberVisProps = { - className?: string; - width: number; - height: number; - bigNumber?: number | null; - bigNumberFallback?: TimeSeriesDatum; - headerFormatter: NumberFormatter | TimeFormatter; - formatTime: TimeFormatter; - headerFontSize: number; - kickerFontSize: number; - subheader: string; - subheaderFontSize: number; - showTimestamp?: boolean; - showTrendLine?: boolean; - startYAxisAtZero?: boolean; - timeRangeFixed?: boolean; - timestamp?: number; - trendLineData?: TimeSeriesDatum[]; - mainColor: string; - echartOptions: EChartsCoreOption; -}; - -class BigNumberVis extends React.PureComponent<BigNumberVisProps> { +class BigNumberVis extends React.PureComponent<BigNumberVizProps> { static defaultProps = { className: '', headerFormatter: defaultNumberFormatter, @@ -99,7 +76,7 @@ class BigNumberVis extends React.PureComponent<BigNumberVisProps> { renderFallbackWarning() { const { bigNumberFallback, formatTime, showTimestamp } = this.props; - if (!bigNumberFallback || showTimestamp) return null; + if (!formatTime || !bigNumberFallback || showTimestamp) return null; return ( <span className="alert alert-warning" @@ -116,7 +93,13 @@ class BigNumberVis extends React.PureComponent<BigNumberVisProps> { renderKicker(maxHeight: number) { const { timestamp, showTimestamp, formatTime, width } = this.props; - if (!showTimestamp) return null; + if ( + !formatTime || + !showTimestamp || + typeof timestamp === 'string' || + typeof timestamp === 'boolean' + ) + return null; const text = timestamp === null ? '' : formatTime(timestamp); @@ -146,6 +129,7 @@ class BigNumberVis extends React.PureComponent<BigNumberVisProps> { renderHeader(maxHeight: number) { const { bigNumber, headerFormatter, width } = this.props; + // @ts-ignore const text = bigNumber === null ? t('No data') : headerFormatter(bigNumber); const container = this.createTemporaryContainer(); @@ -159,6 +143,13 @@ class BigNumberVis extends React.PureComponent<BigNumberVisProps> { }); container.remove(); + const onContextMenu = (e: MouseEvent<HTMLDivElement>) => { + if (this.props.onContextMenu) { + e.preventDefault(); + this.props.onContextMenu(e.nativeEvent.clientX, e.nativeEvent.clientY); + } + }; + return ( <div className="header-line" @@ -166,6 +157,7 @@ class BigNumberVis extends React.PureComponent<BigNumberVisProps> { fontSize, height: maxHeight, }} + onContextMenu={onContextMenu} > {text} </div> @@ -214,19 +206,48 @@ class BigNumberVis extends React.PureComponent<BigNumberVisProps> { } renderTrendline(maxHeight: number) { - const { width, trendLineData, echartOptions } = this.props; + const { width, trendLineData, echartOptions, refs } = this.props; // if can't find any non-null values, no point rendering the trendline if (!trendLineData?.some(d => d[1] !== null)) { return null; } + const eventHandlers: EventHandlers = { + contextmenu: eventParams => { + if (this.props.onContextMenu) { + eventParams.event.stop(); + const { data } = eventParams; + if (data) { + const pointerEvent = eventParams.event.event; + const filters: BinaryQueryObjectFilterClause[] = []; + filters.push({ + col: this.props.formData?.granularitySqla, + grain: this.props.formData?.timeGrainSqla, + op: '==', + val: data[0], + formattedVal: this.props.xValueFormatter?.(data[0]), + }); + this.props.onContextMenu( + pointerEvent.clientX, + pointerEvent.clientY, + filters, + ); + } + } + }, + }; + return ( - <Echart - width={Math.floor(width)} - height={maxHeight} - echartOptions={echartOptions} - /> + echartOptions && ( + <Echart + refs={refs} + width={Math.floor(width)} + height={maxHeight} + echartOptions={echartOptions} + eventHandlers={eventHandlers} + /> + ) ); } @@ -249,7 +270,9 @@ class BigNumberVis extends React.PureComponent<BigNumberVisProps> { <div className="text-container" style={{ height: allTextHeight }}> {this.renderFallbackWarning()} {this.renderKicker( - Math.ceil(kickerFontSize * (1 - PROPORTION.TRENDLINE) * height), + Math.ceil( + (kickerFontSize || 0) * (1 - PROPORTION.TRENDLINE) * height, + ), )} {this.renderHeader( Math.ceil(headerFontSize * (1 - PROPORTION.TRENDLINE) * height), @@ -268,7 +291,7 @@ class BigNumberVis extends React.PureComponent<BigNumberVisProps> { return ( <div className={className} style={{ height }}> {this.renderFallbackWarning()} - {this.renderKicker(kickerFontSize * height)} + {this.renderKicker((kickerFontSize || 0) * height)} {this.renderHeader(Math.ceil(headerFontSize * height))} {this.renderSubheader(Math.ceil(subheaderFontSize * height))} </div> @@ -283,6 +306,7 @@ export default styled(BigNumberVis)` display: flex; flex-direction: column; justify-content: center; + align-items: flex-start; &.no-trendline .subheader-line { padding-bottom: 0.3em; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/buildQuery.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/buildQuery.ts index de75b50838ad..7a0ba462b88b 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/buildQuery.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/buildQuery.ts @@ -18,7 +18,9 @@ */ import { buildQueryContext, - DTTM_ALIAS, + ensureIsArray, + getXAxisColumn, + isXAxisSet, QueryFormData, } from '@superset-ui/core'; import { @@ -29,25 +31,21 @@ import { } from '@superset-ui/chart-controls'; export default function buildQuery(formData: QueryFormData) { - return buildQueryContext(formData, baseQueryObject => { - const { x_axis } = formData; - const is_timeseries = x_axis === DTTM_ALIAS || !x_axis; - - return [ - { - ...baseQueryObject, - is_timeseries: true, - post_processing: [ - pivotOperator(formData, { - ...baseQueryObject, - index: x_axis, - is_timeseries, - }), - rollingWindowOperator(formData, baseQueryObject), - resampleOperator(formData, baseQueryObject), - flattenOperator(formData, baseQueryObject), - ], - }, - ]; - }); + return buildQueryContext(formData, baseQueryObject => [ + { + ...baseQueryObject, + columns: [ + ...(isXAxisSet(formData) + ? ensureIsArray(getXAxisColumn(formData)) + : []), + ], + ...(isXAxisSet(formData) ? {} : { is_timeseries: true }), + post_processing: [ + pivotOperator(formData, baseQueryObject), + rollingWindowOperator(formData, baseQueryObject), + resampleOperator(formData, baseQueryObject), + flattenOperator(formData, baseQueryObject), + ], + }, + ]); } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx index 0ea0a96229e8..81e6d2012820 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx @@ -16,24 +16,30 @@ * specific language governing permissions and limitations * under the License. */ -import { smartDateFormatter, t } from '@superset-ui/core'; +import { hasGenericChartAxes, smartDateFormatter, t } from '@superset-ui/core'; import { ControlPanelConfig, D3_FORMAT_DOCS, D3_TIME_FORMAT_OPTIONS, - formatSelectOptions, + getStandardizedControls, sections, + temporalColumnMixin, } from '@superset-ui/chart-controls'; import React from 'react'; import { headerFontSize, subheaderFontSize } from '../sharedControls'; const config: ControlPanelConfig = { controlPanelSections: [ - sections.legacyTimeseriesTime, + sections.genericTime, { label: t('Query'), expanded: true, - controlSetRows: [['metric'], ['adhoc_filters']], + controlSetRows: [ + [hasGenericChartAxes ? 'x_axis' : null], + [hasGenericChartAxes ? 'time_grain_sqla' : null], + ['metric'], + ['adhoc_filters'], + ], }, { label: t('Options'), @@ -172,13 +178,13 @@ const config: ControlPanelConfig = { type: 'SelectControl', label: t('Rolling Function'), default: 'None', - choices: formatSelectOptions([ - 'None', - 'mean', - 'sum', - 'std', - 'cumsum', - ]), + choices: [ + ['None', t('None')], + ['mean', t('mean')], + ['sum', t('sum')], + ['std', t('std')], + ['cumsum', t('cumsum')], + ], description: t( 'Defines a rolling window function to apply, works along ' + 'with the [Periods] text box', @@ -227,14 +233,14 @@ const config: ControlPanelConfig = { label: t('Rule'), default: null, choices: [ - ['1T', '1 minutely frequency'], - ['1H', '1 hourly frequency'], - ['1D', '1 calendar day frequency'], - ['7D', '7 calendar day frequency'], - ['1MS', '1 month start frequency'], - ['1M', '1 month end frequency'], - ['1AS', '1 year start frequency'], - ['1A', '1 year end frequency'], + ['1T', t('1 minutely frequency')], + ['1H', t('1 hourly frequency')], + ['1D', t('1 calendar day frequency')], + ['7D', t('7 calendar day frequency')], + ['1MS', t('1 month start frequency')], + ['1M', t('1 month end frequency')], + ['1AS', t('1 year start frequency')], + ['1A', t('1 year end frequency')], ], description: t('Pandas resample rule'), }, @@ -249,14 +255,14 @@ const config: ControlPanelConfig = { label: t('Fill method'), default: null, choices: [ - ['asfreq', 'Null imputation'], - ['zerofill', 'Zero imputation'], - ['linear', 'Linear interpolation'], - ['ffill', 'Forward values'], - ['bfill', 'Backward values'], - ['median', 'Median values'], - ['mean', 'Mean values'], - ['sum', 'Sum values'], + ['asfreq', t('Null imputation')], + ['zerofill', t('Zero imputation')], + ['linear', t('Linear interpolation')], + ['ffill', t('Forward values')], + ['bfill', t('Backward values')], + ['median', t('Median values')], + ['mean', t('Mean values')], + ['sum', t('Sum values')], ], description: t('Pandas resample method'), }, @@ -269,14 +275,14 @@ const config: ControlPanelConfig = { y_axis_format: { label: t('Number format'), }, + x_axis: { + label: t('TEMPORAL X-AXIS'), + ...temporalColumnMixin, + }, }, - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metric: formData.standardizedFormData.standardizedState.metrics[0], - }), - updateStandardizedState: (prevState, currState) => ({ - ...currState, - metrics: [currState.metrics[0], ...prevState.metrics.slice(1)], + metric: getStandardizedControls().shiftMetric(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts index e774db4824e0..8cd1d2d2881e 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; +import { t, ChartMetadata, ChartPlugin, Behavior } from '@superset-ui/core'; import controlPanel from './controlPanel'; import transformProps from './transformProps'; import buildQuery from './buildQuery'; @@ -45,6 +45,7 @@ const metadata = new ChartMetadata({ t('Trend'), ], thumbnail, + behaviors: [Behavior.DRILL_TO_DETAIL], }); export default class BigNumberWithTrendlineChartPlugin extends ChartPlugin< diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/transformProps.ts index 07ca77547b4f..bd4553479e48 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/transformProps.ts @@ -17,25 +17,27 @@ * under the License. */ import { - DTTM_ALIAS, extractTimegrain, getNumberFormatter, NumberFormats, - QueryFormData, GenericDataType, getMetricLabel, t, smartDateVerboseFormatter, NumberFormatter, TimeFormatter, + getXAxisLabel, } from '@superset-ui/core'; import { EChartsCoreOption, graphic } from 'echarts'; import { + BigNumberVizProps, BigNumberDatum, BigNumberWithTrendlineChartProps, TimeSeriesDatum, } from '../types'; import { getDateFormatter, parseMetricValue } from '../utils'; +import { getDefaultTooltip } from '../../utils/tooltip'; +import { Refs } from '../../types'; const defaultNumberFormatter = getNumberFormatter(); export function renderTooltipFactory( @@ -61,9 +63,17 @@ const formatPercentChange = getNumberFormatter( export default function transformProps( chartProps: BigNumberWithTrendlineChartProps, -) { - const { width, height, queriesData, formData, rawFormData, theme } = - chartProps; +): BigNumberVizProps { + const { + width, + height, + queriesData, + formData, + rawFormData, + theme, + hooks, + inContextMenu, + } = chartProps; const { colorPicker, compareLag: compareLag_, @@ -80,7 +90,7 @@ export default function transformProps( yAxisFormat, timeRangeFixed, } = formData; - const granularity = extractTimegrain(rawFormData as QueryFormData); + const granularity = extractTimegrain(rawFormData); const { data = [], colnames = [], @@ -88,6 +98,7 @@ export default function transformProps( from_dttm: fromDatetime, to_dttm: toDatetime, } = queriesData[0]; + const refs: Refs = {}; const metricName = getMetricLabel(metric); const compareLag = Number(compareLag_) || 0; let formattedSubheader = subheader; @@ -95,10 +106,11 @@ export default function transformProps( const { r, g, b } = colorPicker; const mainColor = `rgb(${r}, ${g}, ${b})`; - let trendLineData; + const xAxisLabel = getXAxisLabel(rawFormData) as string; + let trendLineData: TimeSeriesDatum[] | undefined; let percentChange = 0; let bigNumber = data.length === 0 ? null : data[0][metricName]; - let timestamp = data.length === 0 ? null : data[0][DTTM_ALIAS]; + let timestamp = data.length === 0 ? null : data[0][xAxisLabel]; let bigNumberFallback; const metricColtypeIndex = colnames.findIndex(name => name === metricName); @@ -107,7 +119,7 @@ export default function transformProps( if (data.length > 0) { const sortedData = (data as BigNumberDatum[]) - .map(d => [d[DTTM_ALIAS], parseMetricValue(d[metricName])]) + .map(d => [d[xAxisLabel], parseMetricValue(d[metricName])]) // sort in time descending order .sort((a, b) => (a[0] !== null && b[0] !== null ? b[0] - a[0] : 0)); @@ -136,6 +148,7 @@ export default function transformProps( } } sortedData.reverse(); + // @ts-ignore trendLineData = showTrendLine ? sortedData : undefined; } @@ -147,7 +160,7 @@ export default function transformProps( } let metricEntry; - if (chartProps.datasource && chartProps.datasource.metrics) { + if (chartProps.datasource?.metrics) { metricEntry = chartProps.datasource.metrics.find( metricEntry => metricEntry.metric_name === metric, ); @@ -187,6 +200,7 @@ export default function transformProps( type: 'line', smooth: true, symbol: 'circle', + symbolSize: 10, showSymbol: false, color: mainColor, areaStyle: { @@ -220,10 +234,9 @@ export default function transformProps( bottom: 0, }, tooltip: { - appendToBody: true, - show: true, + ...getDefaultTooltip(refs), + show: !inContextMenu, trigger: 'axis', - confine: true, formatter: renderTooltipFactory(formatTime, headerFormatter), }, aria: { @@ -234,14 +247,19 @@ export default function transformProps( }, } : {}; + + const { onContextMenu } = hooks; + return { width, height, bigNumber, + // @ts-ignore bigNumberFallback, className, headerFormatter, formatTime, + formData, headerFontSize, subheaderFontSize, mainColor, @@ -252,5 +270,8 @@ export default function transformProps( timestamp, trendLineData, echartOptions, + onContextMenu, + xValueFormatter: formatTime, + refs, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/types.ts index 49f5ea2bfd98..90b852b01e4e 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/types.ts @@ -17,12 +17,17 @@ * under the License. */ +import { EChartsCoreOption } from 'echarts'; import { + BinaryQueryObjectFilterClause, ChartDataResponseResult, - ChartProps, + DataRecordValue, + NumberFormatter, QueryFormData, QueryFormMetric, + TimeFormatter, } from '@superset-ui/core'; +import { BaseChartProps, Refs } from '../types'; export interface BigNumberDatum { [key: string]: number | null; @@ -43,15 +48,50 @@ export type BigNumberWithTrendlineFormData = BigNumberTotalFormData & { compareLag?: string | number; }; -export type BigNumberTotalChartProps = ChartProps & { - formData: BigNumberTotalFormData; - queriesData: (ChartDataResponseResult & { - data?: BigNumberDatum[]; - })[]; -}; +export interface BigNumberTotalChartDataResponseResult + extends ChartDataResponseResult { + data: BigNumberDatum[]; +} -export type BigNumberWithTrendlineChartProps = BigNumberTotalChartProps & { - formData: BigNumberWithTrendlineFormData; -}; +export type BigNumberTotalChartProps = + BaseChartProps<BigNumberTotalFormData> & { + formData: BigNumberTotalFormData; + queriesData: BigNumberTotalChartDataResponseResult[]; + }; + +export type BigNumberWithTrendlineChartProps = + BaseChartProps<BigNumberWithTrendlineFormData> & { + formData: BigNumberWithTrendlineFormData; + }; export type TimeSeriesDatum = [number, number | null]; + +export type BigNumberVizProps = { + className?: string; + width: number; + height: number; + bigNumber?: DataRecordValue; + bigNumberFallback?: TimeSeriesDatum; + headerFormatter: NumberFormatter | TimeFormatter; + formatTime?: TimeFormatter; + headerFontSize: number; + kickerFontSize?: number; + subheader: string; + subheaderFontSize: number; + showTimestamp?: boolean; + showTrendLine?: boolean; + startYAxisAtZero?: boolean; + timeRangeFixed?: boolean; + timestamp?: DataRecordValue; + trendLineData?: TimeSeriesDatum[]; + mainColor?: string; + echartOptions?: EChartsCoreOption; + onContextMenu?: ( + clientX: number, + clientY: number, + filters?: BinaryQueryObjectFilterClause[], + ) => void; + xValueFormatter?: TimeFormatter; + formData?: BigNumberWithTrendlineFormData; + refs: Refs; +}; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/EchartsBoxPlot.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/EchartsBoxPlot.tsx index f13396d096bc..4c18f7f7d620 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/EchartsBoxPlot.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/EchartsBoxPlot.tsx @@ -18,22 +18,24 @@ */ import React, { useCallback } from 'react'; import Echart from '../components/Echart'; -import { EventHandlers } from '../types'; +import { allEventHandlers } from '../utils/eventHandlers'; import { BoxPlotChartTransformedProps } from './types'; -export default function EchartsBoxPlot({ - height, - width, - echartOptions, - setDataMask, - labelMap, - groupby, - selectedValues, - formData, -}: BoxPlotChartTransformedProps) { +export default function EchartsBoxPlot(props: BoxPlotChartTransformedProps) { + const { + height, + width, + echartOptions, + setDataMask, + labelMap, + groupby, + selectedValues, + refs, + emitCrossFilters, + } = props; const handleChange = useCallback( (values: string[]) => { - if (!formData.emitFilter) { + if (!emitCrossFilters) { return; } @@ -67,20 +69,11 @@ export default function EchartsBoxPlot({ [groupby, labelMap, setDataMask, selectedValues], ); - const eventHandlers: EventHandlers = { - click: props => { - const { name } = props; - const values = Object.values(selectedValues); - if (values.includes(name)) { - handleChange(values.filter(v => v !== name)); - } else { - handleChange([name]); - } - }, - }; + const eventHandlers = allEventHandlers(props, handleChange); return ( <Echart + refs={refs} height={height} width={width} echartOptions={echartOptions} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/buildQuery.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/buildQuery.ts index 14ce144d61ea..03b9058c8a3b 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/buildQuery.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/buildQuery.ts @@ -16,26 +16,44 @@ * specific language governing permissions and limitations * under the License. */ -import { buildQueryContext } from '@superset-ui/core'; +import { + AdhocColumn, + buildQueryContext, + ensureIsArray, + isPhysicalColumn, +} from '@superset-ui/core'; import { boxplotOperator } from '@superset-ui/chart-controls'; import { BoxPlotQueryFormData } from './types'; export default function buildQuery(formData: BoxPlotQueryFormData) { - const { columns = [], granularity_sqla, groupby = [] } = formData; - return buildQueryContext(formData, baseQueryObject => { - const distributionColumns: string[] = []; - // For now default to using the temporal column as distribution column. - // In the future this control should be made mandatory. - if (!columns.length && granularity_sqla) { - distributionColumns.push(granularity_sqla); - } - return [ - { - ...baseQueryObject, - columns: [...distributionColumns, ...columns, ...groupby], - series_columns: groupby, - post_processing: [boxplotOperator(formData, baseQueryObject)], - }, - ]; - }); + return buildQueryContext(formData, baseQueryObject => [ + { + ...baseQueryObject, + columns: [ + ...(ensureIsArray(formData.columns).length === 0 && + formData.granularity_sqla + ? [formData.granularity_sqla] // for backwards compatible: if columns control is empty and granularity_sqla was set, the time columns is default distributed column. + : ensureIsArray(formData.columns) + ).map(col => { + if ( + isPhysicalColumn(col) && + formData.time_grain_sqla && + formData?.temporal_columns_lookup?.[col] + ) { + return { + timeGrain: formData.time_grain_sqla, + columnType: 'BASE_AXIS', + sqlExpression: col, + label: col, + expressionType: 'SQL', + } as AdhocColumn; + } + return col; + }), + ...ensureIsArray(formData.groupby), + ], + series_columns: formData.groupby, + post_processing: [boxplotOperator(formData, baseQueryObject)], + }, + ]); } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts index b92c289bb43e..da21e3cfefe3 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts @@ -16,29 +16,67 @@ * specific language governing permissions and limitations * under the License. */ -import { ensureIsArray, t } from '@superset-ui/core'; +import { + ensureIsArray, + isAdhocColumn, + isPhysicalColumn, + t, + validateNonEmpty, +} from '@superset-ui/core'; import { D3_FORMAT_DOCS, + D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT, D3_FORMAT_OPTIONS, D3_TIME_FORMAT_OPTIONS, - formatSelectOptions, sections, - emitFilterControl, ControlPanelConfig, + getStandardizedControls, + ControlState, + ControlPanelState, + getTemporalColumns, + sharedControls, } from '@superset-ui/chart-controls'; const config: ControlPanelConfig = { controlPanelSections: [ - sections.legacyTimeseriesTime, + sections.legacyRegularTime, { label: t('Query'), expanded: true, controlSetRows: [ + ['columns'], + [ + { + name: 'time_grain_sqla', + config: { + ...sharedControls.time_grain_sqla, + visibility: ({ controls }) => { + const dttmLookup = Object.fromEntries( + ensureIsArray(controls?.columns?.options).map(option => [ + option.column_name, + option.is_dttm, + ]), + ); + + return ensureIsArray(controls?.columns.value) + .map(selection => { + if (isAdhocColumn(selection)) { + return true; + } + if (isPhysicalColumn(selection)) { + return !!dttmLookup[selection]; + } + return false; + }) + .some(Boolean); + }, + }, + }, + 'temporal_columns_lookup', + ], + ['groupby'], ['metrics'], ['adhoc_filters'], - emitFilterControl, - ['groupby'], - ['columns'], // TODO: this should be migrated to `series_columns` ['series_limit'], ['series_limit_metric'], [ @@ -53,12 +91,12 @@ const config: ControlPanelConfig = { description: t( 'Determines how whiskers and outliers are calculated.', ), - choices: formatSelectOptions([ - 'Tukey', - 'Min/max (no outliers)', - '2/98 percentiles', - '9/91 percentiles', - ]), + choices: [ + ['Tukey', t('Tukey')], + ['Min/max (no outliers)', t('Min/max (no outliers)')], + ['2/98 percentiles', t('2/98 percentiles')], + ['9/91 percentiles', t('9/91 percentiles')], + ], }, }, ], @@ -76,13 +114,13 @@ const config: ControlPanelConfig = { config: { type: 'SelectControl', label: t('X Tick Layout'), - choices: formatSelectOptions([ - 'auto', - 'flat', - '45°', - '90°', - 'staggered', - ]), + choices: [ + ['auto', t('auto')], + ['flat', t('flat')], + ['45°', '45°'], + ['90°', '90°'], + ['staggered', t('staggered')], + ], default: 'auto', clearable: false, renderTrigger: true, @@ -100,9 +138,7 @@ const config: ControlPanelConfig = { renderTrigger: true, default: 'SMART_NUMBER', choices: D3_FORMAT_OPTIONS, - description: `${t( - 'D3 format syntax: https://github.com/d3/d3-format', - )} ${t('Only applies when "Label Type" is set to show values.')}`, + description: `${D3_FORMAT_DOCS} ${D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT}`, }, }, ], @@ -131,19 +167,35 @@ const config: ControlPanelConfig = { columns: { label: t('Distribute across'), multi: true, - description: t( - 'Columns to calculate distribution across. Defaults to temporal column if left empty.', - ), + description: t('Columns to calculate distribution across.'), + initialValue: ( + control: ControlState, + state: ControlPanelState | null, + ) => { + if ( + state && + (!control?.value || + (Array.isArray(control?.value) && control.value.length === 0)) + ) { + return [getTemporalColumns(state.datasource).defaultTemporalColumn]; + } + return control.value; + }, + validators: [validateNonEmpty], }, }, - denormalizeFormData: formData => { - const groupby = - formData.standardizedFormData.standardizedState.columns.filter( - col => !ensureIsArray(formData.columns).includes(col), + formDataOverrides: formData => { + const groupby = getStandardizedControls().controls.columns.filter( + col => !ensureIsArray(formData.columns).includes(col), + ); + getStandardizedControls().controls.columns = + getStandardizedControls().controls.columns.filter( + col => !groupby.includes(col), ); + return { ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, + metrics: getStandardizedControls().popAllMetrics(), groupby, }; }, diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts index c97dffe5acf2..3c8620e9d86d 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts @@ -44,7 +44,7 @@ export default class EchartsBoxPlotChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('./EchartsBoxPlot'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Distribution'), credits: ['https://echarts.apache.org'], description: t( diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/transformProps.ts index 6f79ec6e274e..54a1cbfd205a 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/transformProps.ts @@ -18,7 +18,6 @@ */ import { CategoricalColorNamespace, - DataRecordValue, getColumnLabel, getMetricLabel, getNumberFormatter, @@ -37,17 +36,27 @@ import { sanitizeHtml, } from '../utils/series'; import { convertInteger } from '../utils/convertInteger'; -import { defaultGrid, defaultTooltip, defaultYAxis } from '../defaults'; +import { defaultGrid, defaultYAxis } from '../defaults'; import { getPadding } from '../Timeseries/transformers'; import { OpacityEnum } from '../constants'; +import { getDefaultTooltip } from '../utils/tooltip'; +import { Refs } from '../types'; export default function transformProps( chartProps: EchartsBoxPlotChartProps, ): BoxPlotChartTransformedProps { - const { width, height, formData, hooks, filterState, queriesData } = - chartProps; + const { + width, + height, + formData, + hooks, + filterState, + queriesData, + inContextMenu, + emitCrossFilters, + } = chartProps; const { data = [] } = queriesData[0]; - const { setDataMask = () => {} } = hooks; + const { setDataMask = () => {}, onContextMenu } = hooks; const coltypeMapping = getColtypesMapping(queriesData[0]); const { colorScheme, @@ -56,7 +65,6 @@ export default function transformProps( numberFormat, dateFormat, xTicksLayout, - emitFilter, legendOrientation = 'top', xAxisTitle, yAxisTitle, @@ -65,6 +73,7 @@ export default function transformProps( yAxisTitlePosition, sliceId, } = formData as BoxPlotQueryFormData; + const refs: Refs = {}; const colorFn = CategoricalColorNamespace.getScale(colorScheme as string); const numberFormatter = getNumberFormatter(numberFormat); const metricLabels = metrics.map(getMetricLabel); @@ -130,6 +139,7 @@ export default function transformProps( type: 'scatter', data: outlierDatum.map(val => [name, val]), tooltip: { + ...getDefaultTooltip(refs), formatter: (param: { data: [string, number] }) => { const [outlierName, stats] = param.data; const headline = groupbyLabels.length @@ -149,21 +159,18 @@ export default function transformProps( ) .flat(2); - const labelMap = data.reduce( - (acc: Record<string, DataRecordValue[]>, datum) => { - const label = extractGroupbyLabel({ - datum, - groupby: groupbyLabels, - coltypeMapping, - timeFormatter: getTimeFormatter(dateFormat), - }); - return { - ...acc, - [label]: groupbyLabels.map(col => datum[col]), - }; - }, - {}, - ); + const labelMap = data.reduce((acc: Record<string, string[]>, datum) => { + const label = extractGroupbyLabel({ + datum, + groupby: groupbyLabels, + coltypeMapping, + timeFormatter: getTimeFormatter(dateFormat), + }); + return { + ...acc, + [label]: groupbyLabels.map(col => datum[col] as string), + }; + }, {}); const selectedValues = (filterState.selectedValues || []).reduce( (acc: Record<string, number>, selectedValue: string) => { @@ -191,6 +198,7 @@ export default function transformProps( type: 'boxplot', data: transformedData, tooltip: { + ...getDefaultTooltip(refs), formatter: (param: CallbackDataParams) => { // @ts-ignore const { @@ -267,7 +275,8 @@ export default function transformProps( nameLocation: yAxisTitlePosition === 'Left' ? 'middle' : 'end', }, tooltip: { - ...defaultTooltip, + ...getDefaultTooltip(refs), + show: !inContextMenu, trigger: 'item', axisPointer: { type: 'shadow', @@ -282,9 +291,11 @@ export default function transformProps( height, echartOptions, setDataMask, - emitFilter, + emitCrossFilters, labelMap, groupby, selectedValues, + onContextMenu, + refs, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/types.ts index 005d2a79f0a2..6cdc57a26de0 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/types.ts @@ -16,23 +16,21 @@ * specific language governing permissions and limitations * under the License. */ +import { QueryFormData } from '@superset-ui/core'; import { - ChartDataResponseResult, - ChartProps, - DataRecordValue, - QueryFormColumn, - QueryFormData, - SetDataMaskHook, -} from '@superset-ui/core'; -import { EChartsCoreOption } from 'echarts'; -import { EchartsTitleFormData, DEFAULT_TITLE_FORM_DATA } from '../types'; + BaseChartProps, + BaseTransformedProps, + ContextMenuTransformedProps, + CrossFilterTransformedProps, + TitleFormData, +} from '../types'; +import { DEFAULT_TITLE_FORM_DATA } from '../constants'; export type BoxPlotQueryFormData = QueryFormData & { numberFormat?: string; whiskerOptions?: BoxPlotFormDataWhiskerOptions; xTickLayout?: BoxPlotFormXTickLayout; - emitFilter: boolean; -} & EchartsTitleFormData; +} & TitleFormData; export type BoxPlotFormDataWhiskerOptions = | 'Tukey' @@ -49,24 +47,15 @@ export type BoxPlotFormXTickLayout = // @ts-ignore export const DEFAULT_FORM_DATA: BoxPlotQueryFormData = { - emitFilter: false, ...DEFAULT_TITLE_FORM_DATA, }; export interface EchartsBoxPlotChartProps - extends ChartProps<BoxPlotQueryFormData> { + extends BaseChartProps<BoxPlotQueryFormData> { formData: BoxPlotQueryFormData; - queriesData: ChartDataResponseResult[]; } -export interface BoxPlotChartTransformedProps { - formData: BoxPlotQueryFormData; - height: number; - width: number; - echartOptions: EChartsCoreOption; - emitFilter: boolean; - setDataMask: SetDataMaskHook; - labelMap: Record<string, DataRecordValue[]>; - groupby: QueryFormColumn[]; - selectedValues: Record<number, string>; -} +export type BoxPlotChartTransformedProps = + BaseTransformedProps<BoxPlotQueryFormData> & + CrossFilterTransformedProps & + ContextMenuTransformedProps; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/EchartsFunnel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/EchartsFunnel.tsx index 7b157dc8e0f2..88ccae8ecc80 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/EchartsFunnel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/EchartsFunnel.tsx @@ -19,21 +19,23 @@ import React, { useCallback } from 'react'; import { FunnelChartTransformedProps } from './types'; import Echart from '../components/Echart'; -import { EventHandlers } from '../types'; +import { allEventHandlers } from '../utils/eventHandlers'; -export default function EchartsFunnel({ - height, - width, - echartOptions, - setDataMask, - labelMap, - groupby, - selectedValues, - formData, -}: FunnelChartTransformedProps) { +export default function EchartsFunnel(props: FunnelChartTransformedProps) { + const { + height, + width, + echartOptions, + setDataMask, + labelMap, + groupby, + selectedValues, + emitCrossFilters, + refs, + } = props; const handleChange = useCallback( (values: string[]) => { - if (!formData.emitFilter) { + if (!emitCrossFilters) { return; } @@ -67,20 +69,11 @@ export default function EchartsFunnel({ [groupby, labelMap, setDataMask, selectedValues], ); - const eventHandlers: EventHandlers = { - click: props => { - const { name } = props; - const values = Object.values(selectedValues); - if (values.includes(name)) { - handleChange(values.filter(v => v !== name)); - } else { - handleChange([name]); - } - }, - }; + const eventHandlers = allEventHandlers(props, handleChange); return ( <Echart + refs={refs} height={height} width={width} echartOptions={echartOptions} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx index b23cf2ed9793..203b86e219cc 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx @@ -21,10 +21,12 @@ import { t } from '@superset-ui/core'; import { ControlPanelConfig, D3_FORMAT_OPTIONS, + D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT, sections, sharedControls, ControlStateMapping, - emitFilterControl, + getStandardizedControls, + D3_FORMAT_DOCS, } from '@superset-ui/chart-controls'; import { DEFAULT_FORM_DATA, EchartsFunnelLabelTypeType } from './types'; import { legendSection } from '../controls'; @@ -44,7 +46,6 @@ const config: ControlPanelConfig = { ['groupby'], ['metric'], ['adhoc_filters'], - emitFilterControl, [ { name: 'row_limit', @@ -86,17 +87,17 @@ const config: ControlPanelConfig = { default: labelType, renderTrigger: true, choices: [ - [EchartsFunnelLabelTypeType.Key, 'Category Name'], - [EchartsFunnelLabelTypeType.Value, 'Value'], - [EchartsFunnelLabelTypeType.Percent, 'Percentage'], - [EchartsFunnelLabelTypeType.KeyValue, 'Category and Value'], + [EchartsFunnelLabelTypeType.Key, t('Category Name')], + [EchartsFunnelLabelTypeType.Value, t('Value')], + [EchartsFunnelLabelTypeType.Percent, t('Percentage')], + [EchartsFunnelLabelTypeType.KeyValue, t('Category and Value')], [ EchartsFunnelLabelTypeType.KeyPercent, - 'Category and Percentage', + t('Category and Percentage'), ], [ EchartsFunnelLabelTypeType.KeyValuePercent, - 'Category, Value and Percentage', + t('Category, Value and Percentage'), ], ], description: t('What should be shown on the label?'), @@ -113,9 +114,7 @@ const config: ControlPanelConfig = { renderTrigger: true, default: numberFormat, choices: D3_FORMAT_OPTIONS, - description: `${t( - 'D3 format syntax: https://github.com/d3/d3-format', - )} ${t('Only applies when "Label Type" is set to show values.')}`, + description: `${D3_FORMAT_DOCS} ${D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT}`, }, }, ], @@ -143,14 +142,10 @@ const config: ControlPanelConfig = { }, }; }, - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metric: formData.standardizedFormData.standardizedState.metrics[0], - groupby: formData.standardizedFormData.standardizedState.columns, - }), - updateStandardizedState: (prevState, currState) => ({ - ...currState, - metrics: [currState.metrics[0], ...prevState.metrics.slice(1)], + metric: getStandardizedControls().shiftMetric(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/images/example.jpg b/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43f648cbac6c543ae2a9e185b484f656ec67b5ee GIT binary patch literal 43090 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 B|5X40 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts index a483262419bb..742b92151a6d 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts @@ -21,6 +21,7 @@ import buildQuery from './buildQuery'; import controlPanel from './controlPanel'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; +import example from './images/example.jpg'; import { EchartsFunnelChartProps, EchartsFunnelFormData } from './types'; export default class EchartsFunnelChartPlugin extends ChartPlugin< @@ -43,12 +44,13 @@ export default class EchartsFunnelChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('./EchartsFunnel'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('KPI'), credits: ['https://echarts.apache.org'], description: t( 'Showcases how a metric changes as the funnel progresses. This classic chart is useful for visualizing drop-off between stages in a pipeline or lifecycle.', ), + exampleGallery: [{ url: example }], name: t('Funnel Chart'), tags: [ t('Business'), diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/transformProps.ts index 3d0b279cc12f..282bc42381ca 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/transformProps.ts @@ -18,7 +18,6 @@ */ import { CategoricalColorNamespace, - DataRecordValue, DataRecord, getMetricLabel, getNumberFormatter, @@ -35,15 +34,16 @@ import { EchartsFunnelLabelTypeType, FunnelChartTransformedProps, } from './types'; -import { DEFAULT_LEGEND_FORM_DATA } from '../types'; import { extractGroupbyLabel, getChartPadding, getLegendProps, sanitizeHtml, } from '../utils/series'; -import { defaultGrid, defaultTooltip } from '../defaults'; -import { OpacityEnum } from '../constants'; +import { defaultGrid } from '../defaults'; +import { OpacityEnum, DEFAULT_LEGEND_FORM_DATA } from '../constants'; +import { getDefaultTooltip } from '../utils/tooltip'; +import { Refs } from '../types'; const percentFormatter = getNumberFormatter(NumberFormats.PERCENT_2_POINT); @@ -83,8 +83,17 @@ export function formatFunnelLabel({ export default function transformProps( chartProps: EchartsFunnelChartProps, ): FunnelChartTransformedProps { - const { formData, height, hooks, filterState, queriesData, width, theme } = - chartProps; + const { + formData, + height, + hooks, + filterState, + queriesData, + width, + theme, + inContextMenu, + emitCrossFilters, + } = chartProps; const data: DataRecord[] = queriesData[0].data || []; const { @@ -102,34 +111,31 @@ export default function transformProps( numberFormat, showLabels, showLegend, - emitFilter, sliceId, }: EchartsFunnelFormData = { ...DEFAULT_LEGEND_FORM_DATA, ...DEFAULT_FUNNEL_FORM_DATA, ...formData, }; + const refs: Refs = {}; const metricLabel = getMetricLabel(metric); const groupbyLabels = groupby.map(getColumnLabel); const keys = data.map(datum => extractGroupbyLabel({ datum, groupby: groupbyLabels, coltypeMapping: {} }), ); - const labelMap = data.reduce( - (acc: Record<string, DataRecordValue[]>, datum) => { - const label = extractGroupbyLabel({ - datum, - groupby: groupbyLabels, - coltypeMapping: {}, - }); - return { - ...acc, - [label]: groupbyLabels.map(col => datum[col]), - }; - }, - {}, - ); + const labelMap = data.reduce((acc: Record<string, string[]>, datum) => { + const label = extractGroupbyLabel({ + datum, + groupby: groupbyLabels, + coltypeMapping: {}, + }); + return { + ...acc, + [label]: groupbyLabels.map(col => datum[col] as string), + }; + }, {}); - const { setDataMask = () => {} } = hooks; + const { setDataMask = () => {}, onContextMenu } = hooks; const colorFn = CategoricalColorNamespace.getScale(colorScheme as string); const numberFormatter = getNumberFormatter(numberFormat); @@ -209,7 +215,8 @@ export default function transformProps( ...defaultGrid, }, tooltip: { - ...defaultTooltip, + ...getDefaultTooltip(refs), + show: !inContextMenu, trigger: 'item', formatter: (params: any) => formatFunnelLabel({ @@ -231,9 +238,11 @@ export default function transformProps( height, echartOptions, setDataMask, - emitFilter, + emitCrossFilters, labelMap, groupby, selectedValues, + onContextMenu, + refs, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/types.ts index 398fa40d57fb..15adbc208041 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Funnel/types.ts @@ -16,24 +16,20 @@ * specific language governing permissions and limitations * under the License. */ -import { EChartsCoreOption } from 'echarts'; +import { QueryFormData } from '@superset-ui/core'; import { - ChartDataResponseResult, - ChartProps, - DataRecordValue, - QueryFormColumn, - QueryFormData, - SetDataMaskHook, -} from '@superset-ui/core'; -import { - DEFAULT_LEGEND_FORM_DATA, - EchartsLegendFormData, + BaseChartProps, + BaseTransformedProps, + ContextMenuTransformedProps, + CrossFilterTransformedProps, + LegendFormData, LegendOrientation, LegendType, } from '../types'; +import { DEFAULT_LEGEND_FORM_DATA } from '../constants'; export type EchartsFunnelFormData = QueryFormData & - EchartsLegendFormData & { + LegendFormData & { colorScheme?: string; groupby: QueryFormData[]; labelLine: boolean; @@ -44,7 +40,6 @@ export type EchartsFunnelFormData = QueryFormData & gap: number; sort: 'descending' | 'ascending' | 'none' | undefined; orient: 'vertical' | 'horizontal' | undefined; - emitFilter: boolean; }; export enum EchartsFunnelLabelTypeType { @@ -57,9 +52,8 @@ export enum EchartsFunnelLabelTypeType { } export interface EchartsFunnelChartProps - extends ChartProps<EchartsFunnelFormData> { + extends BaseChartProps<EchartsFunnelFormData> { formData: EchartsFunnelFormData; - queriesData: ChartDataResponseResult[]; } // @ts-ignore @@ -75,17 +69,9 @@ export const DEFAULT_FORM_DATA: EchartsFunnelFormData = { sort: 'descending', orient: 'vertical', gap: 0, - emitFilter: false, }; -export interface FunnelChartTransformedProps { - formData: EchartsFunnelFormData; - height: number; - width: number; - echartOptions: EChartsCoreOption; - emitFilter: boolean; - setDataMask: SetDataMaskHook; - labelMap: Record<string, DataRecordValue[]>; - groupby: QueryFormColumn[]; - selectedValues: Record<number, string>; -} +export type FunnelChartTransformedProps = + BaseTransformedProps<EchartsFunnelFormData> & + CrossFilterTransformedProps & + ContextMenuTransformedProps; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/EchartsGauge.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/EchartsGauge.tsx index 731aadded839..8c4ca420d90b 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/EchartsGauge.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/EchartsGauge.tsx @@ -19,21 +19,23 @@ import React, { useCallback } from 'react'; import { GaugeChartTransformedProps } from './types'; import Echart from '../components/Echart'; -import { EventHandlers } from '../types'; +import { allEventHandlers } from '../utils/eventHandlers'; -export default function EchartsGauge({ - height, - width, - echartOptions, - setDataMask, - labelMap, - groupby, - selectedValues, - formData: { emitFilter }, -}: GaugeChartTransformedProps) { +export default function EchartsGauge(props: GaugeChartTransformedProps) { + const { + height, + width, + echartOptions, + setDataMask, + labelMap, + groupby, + selectedValues, + emitCrossFilters, + refs, + } = props; const handleChange = useCallback( (values: string[]) => { - if (!emitFilter) { + if (!emitCrossFilters) { return; } @@ -67,20 +69,11 @@ export default function EchartsGauge({ [groupby, labelMap, setDataMask, selectedValues], ); - const eventHandlers: EventHandlers = { - click: props => { - const { name } = props; - const values = Object.values(selectedValues); - if (values.includes(name)) { - handleChange(values.filter(v => v !== name)); - } else { - handleChange([name]); - } - }, - }; + const eventHandlers = allEventHandlers(props, handleChange); return ( <Echart + refs={refs} height={height} width={width} echartOptions={echartOptions} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/buildQuery.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/buildQuery.ts index 7d070932f6ed..8b47fb5e725c 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/buildQuery.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/buildQuery.ts @@ -23,7 +23,6 @@ export default function buildQuery(formData: QueryFormData) { return buildQueryContext(formData, baseQueryObject => [ { ...baseQueryObject, - groupby: formData.groupby || [], ...(sort_by_metric && { orderby: [[metric, false]] }), }, ]); diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx index 28d358da99dc..1af718a989b1 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx @@ -23,7 +23,7 @@ import { ControlPanelConfig, D3_FORMAT_OPTIONS, sections, - emitFilterControl, + getStandardizedControls, } from '@superset-ui/chart-controls'; import { DEFAULT_FORM_DATA } from './types'; @@ -45,7 +45,6 @@ const config: ControlPanelConfig = { ], ['metric'], ['adhoc_filters'], - emitFilterControl, [ { name: 'row_limit', @@ -306,14 +305,10 @@ const config: ControlPanelConfig = { ], }, ], - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metric: formData.standardizedFormData.standardizedState.metrics[0], - groupby: formData.standardizedFormData.standardizedState.columns, - }), - updateStandardizedState: (prevState, currState) => ({ - ...currState, - metrics: [currState.metrics[0], ...prevState.metrics.slice(1)], + metric: getStandardizedControls().shiftMetric(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/images/example1.jpg b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/images/example1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ffad121c93c6958a6221a856a3c9a0373712631 GIT binary patch literal 56912 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 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/images/example2.jpg b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/images/example2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8414ea66ce45b80b75c2388c1af5a2d4c74cc2a6 GIT binary patch literal 37092 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 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts index 16a8b6a6cca5..15de1cd9bee3 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts @@ -20,6 +20,8 @@ import { t, ChartMetadata, ChartPlugin, Behavior } from '@superset-ui/core'; import controlPanel from './controlPanel'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; +import example1 from './images/example1.jpg'; +import example2 from './images/example2.jpg'; import buildQuery from './buildQuery'; import { EchartsGaugeChartProps, EchartsGaugeFormData } from './types'; @@ -33,12 +35,13 @@ export default class EchartsGaugeChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('./EchartsGauge'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('KPI'), credits: ['https://echarts.apache.org'], description: t( 'Uses a gauge to showcase progress of a metric towards a target. The position of the dial represents the progress and the terminal value in the gauge represents the target value.', ), + exampleGallery: [{ url: example1 }, { url: example2 }], name: t('Gauge Chart'), tags: [ t('Multi-Variables'), diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/transformProps.ts index 996164222fa3..b2e31c3cc188 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/transformProps.ts @@ -23,7 +23,6 @@ import { DataRecord, getNumberFormatter, getMetricLabel, - DataRecordValue, getColumnLabel, } from '@superset-ui/core'; import { EChartsCoreOption, GaugeSeriesOption } from 'echarts'; @@ -45,6 +44,8 @@ import { FONT_SIZE_MULTIPLIERS, } from './constants'; import { OpacityEnum } from '../constants'; +import { getDefaultTooltip } from '../utils/tooltip'; +import { Refs } from '../types'; const setIntervalBoundsAndColors = ( intervals: string, @@ -90,8 +91,16 @@ const calculateMax = (data: GaugeDataItemOption[]) => export default function transformProps( chartProps: EchartsGaugeChartProps, ): GaugeChartTransformedProps { - const { width, height, formData, queriesData, hooks, filterState, theme } = - chartProps; + const { + width, + height, + formData, + queriesData, + hooks, + filterState, + theme, + emitCrossFilters, + } = chartProps; const gaugeSeriesOptions = defaultGaugeSeriesOption(theme); @@ -116,9 +125,9 @@ export default function transformProps( intervals, intervalColorIndices, valueFormatter, - emitFilter, sliceId, }: EchartsGaugeFormData = { ...DEFAULT_GAUGE_FORM_DATA, ...formData }; + const refs: Refs = {}; const data = (queriesData[0]?.data || []) as DataRecord[]; const numberFormatter = getNumberFormatter(numberFormat); const colorFn = CategoricalColorNamespace.getScale(colorScheme as string); @@ -132,7 +141,7 @@ export default function transformProps( FONT_SIZE_MULTIPLIERS.titleOffsetFromTitle * fontSize; const detailOffsetFromTitle = FONT_SIZE_MULTIPLIERS.detailOffsetFromTitle * fontSize; - const columnsLabelMap = new Map<string, DataRecordValue[]>(); + const columnsLabelMap = new Map<string, string[]>(); const transformedData: GaugeDataItemOption[] = data.map( (data_point, index) => { @@ -141,7 +150,7 @@ export default function transformProps( .join(', '); columnsLabelMap.set( name, - groupbyLabels.map(col => data_point[col]), + groupbyLabels.map(col => data_point[col] as string), ); let item: GaugeDataItemOption = { value: data_point[getMetricLabel(metric as QueryFormMetric)] as number, @@ -190,7 +199,7 @@ export default function transformProps( }, ); - const { setDataMask = () => {} } = hooks; + const { setDataMask = () => {}, onContextMenu } = hooks; const min = minVal ?? calculateMin(transformedData); const max = maxVal ?? calculateMax(transformedData); @@ -259,6 +268,7 @@ export default function transformProps( color: gaugeSeriesOptions.detail?.color, }; const tooltip = { + ...getDefaultTooltip(refs), formatter: (params: CallbackDataParams) => { const { name, value } = params; return `${name} : ${formatValue(value as number)}`; @@ -301,6 +311,7 @@ export default function transformProps( axisTick, pointer, detail, + // @ts-ignore tooltip, radius: Math.min(width, height) / 2 - axisLabelDistance - axisTickDistance, @@ -311,7 +322,7 @@ export default function transformProps( const echartOptions: EChartsCoreOption = { tooltip: { - appendToBody: true, + ...getDefaultTooltip(refs), trigger: 'item', }, series, @@ -323,9 +334,11 @@ export default function transformProps( height, echartOptions, setDataMask, - emitFilter, + emitCrossFilters, labelMap: Object.fromEntries(columnsLabelMap), groupby, selectedValues: filterState.selectedValues || [], + onContextMenu, + refs, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/types.ts index d72bb283f99c..02cda2db7f64 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/types.ts @@ -16,13 +16,14 @@ * specific language governing permissions and limitations * under the License. */ +import { QueryFormColumn, QueryFormData } from '@superset-ui/core'; import { - ChartDataResponseResult, - ChartProps, - QueryFormColumn, - QueryFormData, -} from '@superset-ui/core'; -import { DEFAULT_LEGEND_FORM_DATA, EChartTransformedProps } from '../types'; + BaseChartProps, + BaseTransformedProps, + ContextMenuTransformedProps, + CrossFilterTransformedProps, +} from '../types'; +import { DEFAULT_LEGEND_FORM_DATA } from '../constants'; export type AxisTickLineStyle = { width: number; @@ -51,7 +52,6 @@ export type EchartsGaugeFormData = QueryFormData & { intervals: string; intervalColorIndices: string; valueFormatter: string; - emitFilter: boolean; }; export const DEFAULT_FORM_DATA: Partial<EchartsGaugeFormData> = { @@ -75,14 +75,14 @@ export const DEFAULT_FORM_DATA: Partial<EchartsGaugeFormData> = { intervals: '', intervalColorIndices: '', valueFormatter: '{value}', - emitFilter: false, }; export interface EchartsGaugeChartProps - extends ChartProps<EchartsGaugeFormData> { + extends BaseChartProps<EchartsGaugeFormData> { formData: EchartsGaugeFormData; - queriesData: ChartDataResponseResult[]; } export type GaugeChartTransformedProps = - EChartTransformedProps<EchartsGaugeFormData>; + BaseTransformedProps<EchartsGaugeFormData> & + ContextMenuTransformedProps & + CrossFilterTransformedProps; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Graph/EchartsGraph.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Graph/EchartsGraph.tsx index 9b42c6e55357..4f83d1bcaf57 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Graph/EchartsGraph.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Graph/EchartsGraph.tsx @@ -17,13 +17,63 @@ * under the License. */ import React from 'react'; -import { EchartsProps } from '../types'; +import { BinaryQueryObjectFilterClause } from '@superset-ui/core'; +import { EventHandlers } from '../types'; import Echart from '../components/Echart'; +import { GraphChartTransformedProps } from './types'; + +type Event = { + name: string; + event: { stop: () => void; event: PointerEvent }; + data: { source: string; target: string }; +}; export default function EchartsGraph({ height, width, echartOptions, -}: EchartsProps) { - return <Echart height={height} width={width} echartOptions={echartOptions} />; + formData, + onContextMenu, + refs, +}: GraphChartTransformedProps) { + const eventHandlers: EventHandlers = { + contextmenu: (e: Event) => { + if (onContextMenu) { + e.event.stop(); + const pointerEvent = e.event.event; + const data = (echartOptions as any).series[0].data as { + id: string; + name: string; + }[]; + const sourceValue = data.find(item => item.id === e.data.source)?.name; + const targetValue = data.find(item => item.id === e.data.target)?.name; + if (sourceValue && targetValue) { + const filters: BinaryQueryObjectFilterClause[] = [ + { + col: formData.source, + op: '==', + val: sourceValue, + formattedVal: sourceValue, + }, + { + col: formData.target, + op: '==', + val: targetValue, + formattedVal: targetValue, + }, + ]; + onContextMenu(pointerEvent.clientX, pointerEvent.clientY, filters); + } + } + }, + }; + return ( + <Echart + refs={refs} + height={height} + width={width} + echartOptions={echartOptions} + eventHandlers={eventHandlers} + /> + ); } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx index 218b1d0335ea..fef948f5a666 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx @@ -20,6 +20,7 @@ import React from 'react'; import { t } from '@superset-ui/core'; import { ControlPanelConfig, + getStandardizedControls, sections, sharedControls, } from '@superset-ui/chart-controls'; @@ -320,13 +321,9 @@ const controlPanel: ControlPanelConfig = { ], }, ], - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metric: formData.standardizedFormData.standardizedState.metrics[0], - }), - updateStandardizedState: (prevState, currState) => ({ - ...currState, - metrics: [currState.metrics[0], ...prevState.metrics.slice(1)], + metric: getStandardizedControls().popAllMetrics(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Graph/images/example.jpg b/superset-frontend/plugins/plugin-chart-echarts/src/Graph/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..53aa9cfafc57f58600511b502875b384bbefeefd GIT binary patch literal 57705 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 ZM)mJ^{eP{(zvK0Hy#9hY!2A2cKLEQPBrN~{ literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts index b354b61a2fac..621e063d84a3 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts @@ -16,10 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; +import { t, ChartMetadata, ChartPlugin, Behavior } from '@superset-ui/core'; import controlPanel from './controlPanel'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; +import example from './images/example.jpg'; import buildQuery from './buildQuery'; export default class EchartsGraphChartPlugin extends ChartPlugin { @@ -34,6 +35,7 @@ export default class EchartsGraphChartPlugin extends ChartPlugin { description: t( 'Displays connections between entities in a graph structure. Useful for mapping relationships and showing which nodes are important in a network. Graph charts can be configured to be force-directed or circulate. If your data has a geospatial component, try the deck.gl Arc chart.', ), + exampleGallery: [{ url: example }], name: t('Graph Chart'), tags: [ t('Aesthetic'), @@ -46,6 +48,7 @@ export default class EchartsGraphChartPlugin extends ChartPlugin { t('Transformable'), ], thumbnail, + behaviors: [Behavior.DRILL_TO_DETAIL], }), transformProps, }); diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Graph/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Graph/transformProps.ts index 905ecbfa8ebd..593b02907dfb 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Graph/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Graph/transformProps.ts @@ -18,7 +18,6 @@ */ import { CategoricalColorNamespace, - ChartProps, getMetricLabel, DataRecord, DataRecordValue, @@ -31,10 +30,13 @@ import { EChartGraphNode, DEFAULT_FORM_DATA as DEFAULT_GRAPH_FORM_DATA, EdgeSymbol, + GraphChartTransformedProps, + EchartsGraphChartProps, } from './types'; import { DEFAULT_GRAPH_SERIES_OPTION } from './constants'; -import { EchartsProps } from '../types'; import { getChartPadding, getLegendProps, sanitizeHtml } from '../utils/series'; +import { getDefaultTooltip } from '../utils/tooltip'; +import { Refs } from '../types'; type EdgeWithStyles = GraphEdgeItemOption & { lineStyle: Exclude<GraphEdgeItemOption['lineStyle'], undefined>; @@ -157,8 +159,11 @@ function getCategoryName(columnName: string, name?: DataRecordValue) { return String(name); } -export default function transformProps(chartProps: ChartProps): EchartsProps { - const { width, height, formData, queriesData } = chartProps; +export default function transformProps( + chartProps: EchartsGraphChartProps, +): GraphChartTransformedProps { + const { width, height, formData, queriesData, hooks, inContextMenu } = + chartProps; const data: DataRecord[] = queriesData[0].data || []; const { @@ -187,6 +192,7 @@ export default function transformProps(chartProps: ChartProps): EchartsProps { sliceId, }: EchartsGraphFormData = { ...DEFAULT_GRAPH_FORM_DATA, ...formData }; + const refs: Refs = {}; const metricLabel = getMetricLabel(metric); const colorFn = CategoricalColorNamespace.getScale(colorScheme as string); const nodes: { [name: string]: number } = {}; @@ -207,7 +213,10 @@ export default function transformProps(chartProps: ChartProps): EchartsProps { value: 0, category, select: DEFAULT_GRAPH_SERIES_OPTION.select, - tooltip: DEFAULT_GRAPH_SERIES_OPTION.tooltip, + tooltip: { + ...getDefaultTooltip(refs), + ...DEFAULT_GRAPH_SERIES_OPTION.tooltip, + }, }); } const node = echartNodes[nodes[name]]; @@ -295,6 +304,8 @@ export default function transformProps(chartProps: ChartProps): EchartsProps { animationDuration: DEFAULT_GRAPH_SERIES_OPTION.animationDuration, animationEasing: DEFAULT_GRAPH_SERIES_OPTION.animationEasing, tooltip: { + ...getDefaultTooltip(refs), + show: !inContextMenu, formatter: (params: any): string => edgeFormatter( params.data.source, @@ -309,9 +320,15 @@ export default function transformProps(chartProps: ChartProps): EchartsProps { }, series, }; + + const { onContextMenu } = hooks; + return { width, height, + formData, echartOptions, + onContextMenu, + refs, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Graph/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Graph/types.ts index 9cb35c130445..95dc386eb238 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Graph/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Graph/types.ts @@ -20,16 +20,19 @@ import { QueryFormData } from '@superset-ui/core'; import { GraphNodeItemOption } from 'echarts/types/src/chart/graph/GraphSeries'; import { SeriesTooltipOption } from 'echarts/types/src/util/types'; import { - DEFAULT_LEGEND_FORM_DATA, - EchartsLegendFormData, + BaseChartProps, + BaseTransformedProps, + ContextMenuTransformedProps, + LegendFormData, LegendOrientation, LegendType, } from '../types'; +import { DEFAULT_LEGEND_FORM_DATA } from '../constants'; export type EdgeSymbol = 'none' | 'circle' | 'arrow'; export type EchartsGraphFormData = QueryFormData & - EchartsLegendFormData & { + LegendFormData & { source: string; target: string; sourceCategory?: string; @@ -79,3 +82,11 @@ export const DEFAULT_FORM_DATA: EchartsGraphFormData = { export type tooltipFormatParams = { data: { [name: string]: string }; }; + +export interface EchartsGraphChartProps + extends BaseChartProps<EchartsGraphFormData> { + formData: EchartsGraphFormData; +} + +export type GraphChartTransformedProps = + BaseTransformedProps<EchartsGraphFormData> & ContextMenuTransformedProps; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/EchartsMixedTimeseries.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/EchartsMixedTimeseries.tsx index d8d4191b43da..b532c7d9da77 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/EchartsMixedTimeseries.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/EchartsMixedTimeseries.tsx @@ -17,6 +17,12 @@ * under the License. */ import React, { useCallback } from 'react'; +import { + AxisType, + DataRecordValue, + DTTM_ALIAS, + BinaryQueryObjectFilterClause, +} from '@superset-ui/core'; import { EchartsMixedTimeseriesChartTransformedProps } from './types'; import Echart from '../components/Echart'; import { EventHandlers } from '../types'; @@ -33,7 +39,12 @@ export default function EchartsMixedTimeseries({ groupbyB, selectedValues, formData, + emitCrossFilters, seriesBreakdown, + onContextMenu, + xValueFormatter, + xAxis, + refs, }: EchartsMixedTimeseriesChartTransformedProps) { const isFirstQuery = useCallback( (seriesIndex: number) => seriesIndex < seriesBreakdown, @@ -42,17 +53,14 @@ export default function EchartsMixedTimeseries({ const handleChange = useCallback( (values: string[], seriesIndex: number) => { - const emitFilter = isFirstQuery(seriesIndex) - ? formData.emitFilter - : formData.emitFilterB; - if (!emitFilter) { + if (!emitCrossFilters) { return; } const currentGroupBy = isFirstQuery(seriesIndex) ? groupby : groupbyB; const currentLabelMap = isFirstQuery(seriesIndex) ? labelMap : labelMapB; const groupbyValues = values - .map(value => currentLabelMap[value]) + .map(value => currentLabelMap?.[value]) .filter(value => !!value); setDataMask({ @@ -63,7 +71,9 @@ export default function EchartsMixedTimeseries({ ? [] : [ ...currentGroupBy.map((col, idx) => { - const val = groupbyValues.map(v => v[idx]); + const val: DataRecordValue[] = groupbyValues.map( + v => v[idx], + ); if (val === null || val === undefined) return { col, @@ -89,7 +99,7 @@ export default function EchartsMixedTimeseries({ const eventHandlers: EventHandlers = { click: props => { const { seriesName, seriesIndex } = props; - const values: string[] = Object.values(selectedValues); + const values: string[] = Object.values(selectedValues || {}); if (values.includes(seriesName)) { handleChange( values.filter(v => v !== seriesName), @@ -105,10 +115,53 @@ export default function EchartsMixedTimeseries({ mouseover: params => { currentSeries.name = params.seriesName; }, + contextmenu: eventParams => { + if (onContextMenu) { + eventParams.event.stop(); + const { data, seriesIndex } = eventParams; + if (data) { + const pointerEvent = eventParams.event.event; + const values = [ + ...(eventParams.name ? [eventParams.name] : []), + ...(isFirstQuery(seriesIndex) ? labelMap : labelMapB)[ + eventParams.seriesName + ], + ]; + const filters: BinaryQueryObjectFilterClause[] = []; + if (xAxis.type === AxisType.time) { + filters.push({ + col: + xAxis.label === DTTM_ALIAS + ? formData.granularitySqla + : xAxis.label, + grain: formData.timeGrainSqla, + op: '==', + val: data[0], + formattedVal: xValueFormatter(data[0]), + }); + } + [ + ...(xAxis.type === AxisType.category ? [xAxis.label] : []), + ...(isFirstQuery(seriesIndex) + ? formData.groupby + : formData.groupbyB), + ].forEach((dimension, i) => + filters.push({ + col: dimension, + op: '==', + val: values[i], + formattedVal: String(values[i]), + }), + ); + onContextMenu(pointerEvent.clientX, pointerEvent.clientY, filters); + } + } + }, }; return ( <Echart + refs={refs} height={height} width={width} echartOptions={echartOptions} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/buildQuery.ts b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/buildQuery.ts index 4bd4df0bcc26..2173dd99085b 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/buildQuery.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/buildQuery.ts @@ -18,12 +18,13 @@ */ import { buildQueryContext, - DTTM_ALIAS, ensureIsArray, normalizeOrderBy, PostProcessingPivot, QueryFormData, QueryObject, + isXAxisSet, + getXAxisColumn, } from '@superset-ui/core'; import { pivotOperator, @@ -41,11 +42,8 @@ import { } from '../utils/formDataSuffix'; export default function buildQuery(formData: QueryFormData) { - const { x_axis: index } = formData; - const is_timeseries = index === DTTM_ALIAS || !index; const baseFormData = { ...formData, - is_timeseries, }; const formData1 = removeFormDataSuffix(baseFormData, '_b'); @@ -55,9 +53,14 @@ export default function buildQuery(formData: QueryFormData) { buildQueryContext(fd, baseQueryObject => { const queryObject = { ...baseQueryObject, - columns: [...ensureIsArray(index), ...ensureIsArray(fd.groupby)], + columns: [ + ...(isXAxisSet(formData) + ? ensureIsArray(getXAxisColumn(formData)) + : []), + ...ensureIsArray(fd.groupby), + ], series_columns: fd.groupby, - is_timeseries, + ...(isXAxisSet(formData) ? {} : { is_timeseries: true }), }; const pivotOperatorInRuntime: PostProcessingPivot = isTimeComparison( @@ -65,12 +68,7 @@ export default function buildQuery(formData: QueryFormData) { queryObject, ) ? timeComparePivotOperator(fd, queryObject) - : pivotOperator(fd, { - ...queryObject, - columns: fd.groupby, - index, - is_timeseries, - }); + : pivotOperator(fd, queryObject); const tmpQueryObject = { ...queryObject, @@ -80,11 +78,7 @@ export default function buildQuery(formData: QueryFormData) { rollingWindowOperator(fd, queryObject), timeCompareOperator(fd, queryObject), resampleOperator(fd, queryObject), - renameOperator(fd, { - ...queryObject, - columns: fd.groupby, - is_timeseries, - }), + renameOperator(fd, queryObject), flattenOperator(fd, queryObject), ], } as QueryObject; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx index fb164f1a26e8..c1a300778588 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx @@ -17,26 +17,21 @@ * under the License. */ import React from 'react'; -import { - ensureIsArray, - FeatureFlag, - isFeatureEnabled, - t, -} from '@superset-ui/core'; +import { ensureIsArray, hasGenericChartAxes, t } from '@superset-ui/core'; import { cloneDeep } from 'lodash'; import { ControlPanelConfig, ControlPanelSectionConfig, ControlSetRow, CustomControlItem, - emitFilterControl, + getStandardizedControls, sections, sharedControls, } from '@superset-ui/chart-controls'; import { DEFAULT_FORM_DATA } from './types'; import { EchartsTimeseriesSeriesType } from '../Timeseries/types'; -import { legendSection, richTooltipSection, xAxisControl } from '../controls'; +import { legendSection, richTooltipSection } from '../controls'; const { area, @@ -83,14 +78,6 @@ function createQuerySection( config: sharedControls.adhoc_filters, }, ], - emitFilterControl.length > 0 - ? [ - { - ...emitFilterControl[0], - name: `emit_filter${controlSuffix}`, - }, - ] - : [], [ { name: `limit${controlSuffix}`, @@ -151,13 +138,13 @@ function createCustomizeSection( renderTrigger: true, default: seriesType, choices: [ - [EchartsTimeseriesSeriesType.Line, 'Line'], - [EchartsTimeseriesSeriesType.Scatter, 'Scatter'], - [EchartsTimeseriesSeriesType.Smooth, 'Smooth Line'], - [EchartsTimeseriesSeriesType.Bar, 'Bar'], - [EchartsTimeseriesSeriesType.Start, 'Step - start'], - [EchartsTimeseriesSeriesType.Middle, 'Step - middle'], - [EchartsTimeseriesSeriesType.End, 'Step - end'], + [EchartsTimeseriesSeriesType.Line, t('Line')], + [EchartsTimeseriesSeriesType.Scatter, t('Scatter')], + [EchartsTimeseriesSeriesType.Smooth, t('Smooth Line')], + [EchartsTimeseriesSeriesType.Bar, t('Bar')], + [EchartsTimeseriesSeriesType.Start, t('Step - start')], + [EchartsTimeseriesSeriesType.Middle, t('Step - middle')], + [EchartsTimeseriesSeriesType.End, t('Step - end')], ], description: t('Series chart type (line, bar etc)'), }, @@ -290,12 +277,12 @@ function createAdvancedAnalyticsSection( const config: ControlPanelConfig = { controlPanelSections: [ - sections.legacyTimeseriesTime, - isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + sections.genericTime, + hasGenericChartAxes ? { label: t('Shared query fields'), expanded: true, - controlSetRows: [[xAxisControl]], + controlSetRows: [['x_axis'], ['time_grain_sqla']], } : null, createQuerySection(t('Query A'), ''), @@ -449,15 +436,23 @@ const config: ControlPanelConfig = { ], }, ], - denormalizeFormData: formData => { - const groupby = - formData.standardizedFormData.standardizedState.columns.filter( - col => !ensureIsArray(formData.groupby_b).includes(col), + formDataOverrides: formData => { + const groupby = getStandardizedControls().controls.columns.filter( + col => !ensureIsArray(formData.groupby_b).includes(col), + ); + getStandardizedControls().controls.columns = + getStandardizedControls().controls.columns.filter( + col => !groupby.includes(col), ); - const metrics = - formData.standardizedFormData.standardizedState.metrics.filter( - metric => !ensureIsArray(formData.metrics_b).includes(metric), + + const metrics = getStandardizedControls().controls.metrics.filter( + metric => !ensureIsArray(formData.metrics_b).includes(metric), + ); + getStandardizedControls().controls.metrics = + getStandardizedControls().controls.metrics.filter( + col => !metrics.includes(col), ); + return { ...formData, metrics, diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/images/example.jpg b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a7edb3200fb494fc8c21e650a66a0073089fb9d GIT binary patch literal 65380 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 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts index a5bd7ddf95a3..eb1bef3c9b71 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts @@ -21,14 +21,14 @@ import { Behavior, ChartMetadata, ChartPlugin, - FeatureFlag, - isFeatureEnabled, + hasGenericChartAxes, t, } from '@superset-ui/core'; import buildQuery from './buildQuery'; import controlPanel from './controlPanel'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; +import example from './images/example.jpg'; import { EchartsMixedTimeseriesFormData, EchartsMixedTimeseriesProps, @@ -54,10 +54,10 @@ export default class EchartsTimeseriesChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('./EchartsMixedTimeseries'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Evolution'), credits: ['https://echarts.apache.org'], - description: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + description: hasGenericChartAxes ? t( 'Visualize two different series using the same x-axis. Note that both series can be visualized with a different chart type (e.g. 1 using bars and 1 using a line).', ) @@ -70,9 +70,8 @@ export default class EchartsTimeseriesChartPlugin extends ChartPlugin< AnnotationType.Interval, AnnotationType.Timeseries, ], - name: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) - ? t('Mixed Chart') - : t('Mixed Time-Series'), + exampleGallery: [{ url: example }], + name: hasGenericChartAxes ? t('Mixed Chart') : t('Mixed Time-Series'), thumbnail, tags: [ t('Advanced-Analytics'), @@ -84,6 +83,7 @@ export default class EchartsTimeseriesChartPlugin extends ChartPlugin< t('Time'), t('Transformable'), ], + queryObjectCount: 2, }), // @ts-ignore transformProps, diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts index f1232cb18e9f..98367daf9a84 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts @@ -20,16 +20,18 @@ import { AnnotationLayer, CategoricalColorNamespace, - DataRecordValue, - DTTM_ALIAS, GenericDataType, - getColumnLabel, getNumberFormatter, isEventAnnotationLayer, isFormulaAnnotationLayer, isIntervalAnnotationLayer, isTimeseriesAnnotationLayer, + QueryFormData, + TimeseriesChartDataResponseResult, TimeseriesDataRecord, + getXAxisLabel, + isPhysicalColumn, + isDefined, } from '@superset-ui/core'; import { EChartsCoreOption, SeriesOption } from 'echarts'; import { @@ -38,9 +40,14 @@ import { EchartsMixedTimeseriesChartTransformedProps, EchartsMixedTimeseriesProps, } from './types'; -import { ForecastSeriesEnum } from '../types'; +import { + EchartsTimeseriesSeriesType, + ForecastSeriesEnum, + Refs, +} from '../types'; import { parseYAxisBound } from '../utils/controls'; import { + getOverMaxHiddenFormatter, currentSeries, dedupSeries, extractSeries, @@ -61,7 +68,7 @@ import { rebaseForecastDatum, } from '../utils/forecast'; import { convertInteger } from '../utils/convertInteger'; -import { defaultGrid, defaultTooltip, defaultYAxis } from '../defaults'; +import { defaultGrid, defaultYAxis } from '../defaults'; import { getPadding, getTooltipTimeFormatter, @@ -73,6 +80,7 @@ import { transformTimeseriesAnnotation, } from '../Timeseries/transformers'; import { TIMESERIES_CONSTANTS, TIMEGRAIN_TO_TIMESTAMP } from '../constants'; +import { getDefaultTooltip } from '../utils/tooltip'; export default function transformProps( chartProps: EchartsMixedTimeseriesProps, @@ -86,8 +94,14 @@ export default function transformProps( filterState, datasource, theme, + inContextMenu, + emitCrossFilters, } = chartProps; const { verboseMap = {} } = datasource; + const { label_map: labelMap } = + queriesData[0] as TimeseriesChartDataResponseResult; + const { label_map: labelMapB } = + queriesData[1] as TimeseriesChartDataResponseResult; const data1 = (queriesData[0].data || []) as TimeseriesDataRecord[]; const data2 = (queriesData[1].data || []) as TimeseriesDataRecord[]; const annotationData = getAnnotationData(chartProps); @@ -131,8 +145,6 @@ export default function transformProps( xAxisLabelRotation, groupby, groupbyB, - emitFilter, - emitFilterB, xAxis: xAxisOrig, xAxisTitle, yAxisTitle, @@ -144,24 +156,32 @@ export default function transformProps( percentageThreshold, }: EchartsMixedTimeseriesFormData = { ...DEFAULT_FORM_DATA, ...formData }; + const refs: Refs = {}; const colorScale = CategoricalColorNamespace.getScale(colorScheme as string); - const xAxisCol = - verboseMap[xAxisOrig] || getColumnLabel(xAxisOrig || DTTM_ALIAS); + let xAxisLabel = getXAxisLabel( + chartProps.rawFormData as QueryFormData, + ) as string; + if ( + isPhysicalColumn(chartProps.rawFormData?.x_axis) && + isDefined(verboseMap[xAxisLabel]) + ) { + xAxisLabel = verboseMap[xAxisLabel]; + } const rebasedDataA = rebaseForecastDatum(data1, verboseMap); const rawSeriesA = extractSeries(rebasedDataA, { fillNeighborValue: stack ? 0 : undefined, - xAxis: xAxisCol, + xAxis: xAxisLabel, }); const rebasedDataB = rebaseForecastDatum(data2, verboseMap); const rawSeriesB = extractSeries(rebasedDataB, { fillNeighborValue: stackB ? 0 : undefined, - xAxis: xAxisCol, + xAxis: xAxisLabel, }); const dataTypes = getColtypesMapping(queriesData[0]); - const xAxisDataType = dataTypes?.[xAxisCol] ?? dataTypes?.[xAxisOrig]; + const xAxisDataType = dataTypes?.[xAxisLabel] ?? dataTypes?.[xAxisOrig]; const xAxisType = getAxisType(xAxisDataType); const series: SeriesOption[] = []; const formatter = getNumberFormatter(contributionMode ? ',.0%' : yAxisFormat); @@ -198,7 +218,7 @@ export default function transformProps( { stack, percentageThreshold, - xAxisCol, + xAxisCol: xAxisLabel, }, ); const { @@ -207,50 +227,7 @@ export default function transformProps( } = extractDataTotalValues(rebasedDataB, { stack: Boolean(stackB), percentageThreshold, - xAxisCol, - }); - rawSeriesA.forEach(entry => { - const transformedSeries = transformSeries(entry, colorScale, { - area, - markerEnabled, - markerSize, - areaOpacity: opacity, - seriesType, - showValue, - stack: Boolean(stack), - yAxisIndex, - filterState, - seriesKey: entry.name, - sliceId, - formatter, - showValueIndexes: showValueIndexesA, - totalStackedValues, - thresholdValues, - }); - if (transformedSeries) series.push(transformedSeries); - }); - - rawSeriesB.forEach(entry => { - const transformedSeries = transformSeries(entry, colorScale, { - area: areaB, - markerEnabled: markerEnabledB, - markerSize: markerSizeB, - areaOpacity: opacityB, - seriesType: seriesTypeB, - showValue: showValueB, - stack: Boolean(stackB), - yAxisIndex: yAxisIndexB, - filterState, - seriesKey: primarySeries.has(entry.name as string) - ? `${entry.name} (1)` - : entry.name, - sliceId, - formatter: formatterSecondary, - showValueIndexes: showValueIndexesB, - totalStackedValues: totalStackedValuesB, - thresholdValues: thresholdValuesB, - }); - if (transformedSeries) series.push(transformedSeries); + xAxisCol: xAxisLabel, }); annotationLayers @@ -258,7 +235,14 @@ export default function transformProps( .forEach((layer: AnnotationLayer) => { if (isFormulaAnnotationLayer(layer)) series.push( - transformFormulaAnnotation(layer, data1, colorScale, sliceId), + transformFormulaAnnotation( + layer, + data1, + xAxisLabel, + xAxisType, + colorScale, + sliceId, + ), ); else if (isIntervalAnnotationLayer(layer)) { series.push( @@ -299,6 +283,64 @@ export default function transformProps( // yAxisBounds need to be parsed to replace incompatible values with undefined let [min, max] = (yAxisBounds || []).map(parseYAxisBound); + const maxLabelFormatter = getOverMaxHiddenFormatter({ max, formatter }); + const maxLabelFormatterSecondary = getOverMaxHiddenFormatter({ + max, + formatter: formatterSecondary, + }); + + rawSeriesA.forEach(entry => { + const transformedSeries = transformSeries(entry, colorScale, { + area, + markerEnabled, + markerSize, + areaOpacity: opacity, + seriesType, + showValue, + stack: Boolean(stack), + yAxisIndex, + filterState, + seriesKey: entry.name, + sliceId, + queryIndex: 0, + formatter: + seriesType === EchartsTimeseriesSeriesType.Bar + ? maxLabelFormatter + : formatter, + showValueIndexes: showValueIndexesA, + totalStackedValues, + thresholdValues, + }); + if (transformedSeries) series.push(transformedSeries); + }); + + rawSeriesB.forEach(entry => { + const transformedSeries = transformSeries(entry, colorScale, { + area: areaB, + markerEnabled: markerEnabledB, + markerSize: markerSizeB, + areaOpacity: opacityB, + seriesType: seriesTypeB, + showValue: showValueB, + stack: Boolean(stackB), + yAxisIndex: yAxisIndexB, + filterState, + seriesKey: primarySeries.has(entry.name as string) + ? `${entry.name} (1)` + : entry.name, + sliceId, + queryIndex: 1, + formatter: + seriesTypeB === EchartsTimeseriesSeriesType.Bar + ? maxLabelFormatterSecondary + : formatterSecondary, + showValueIndexes: showValueIndexesB, + totalStackedValues: totalStackedValuesB, + thresholdValues: thresholdValuesB, + }); + if (transformedSeries) series.push(transformedSeries); + }); + // default to 0-100% range when doing row-level contribution chart if (contributionMode === 'row' && stack) { if (min === undefined) min = 0; @@ -328,23 +370,8 @@ export default function transformProps( convertInteger(yAxisTitleMargin), convertInteger(xAxisTitleMargin), ); - const labelMap = rawSeriesA.reduce((acc, datum) => { - const label = datum.name as string; - return { - ...acc, - [label]: label.split(', '), - }; - }, {}) as Record<string, DataRecordValue[]>; - - const labelMapB = rawSeriesB.reduce((acc, datum) => { - const label = datum.name as string; - return { - ...acc, - [label]: label.split(', '), - }; - }, {}) as Record<string, DataRecordValue[]>; - const { setDataMask = () => {} } = hooks; + const { setDataMask = () => {}, onContextMenu } = hooks; const alignTicks = yAxisIndex !== yAxisIndexB; const echartOptions: EChartsCoreOption = { @@ -397,8 +424,8 @@ export default function transformProps( }, ], tooltip: { - ...defaultTooltip, - appendToBody: true, + ...getDefaultTooltip(refs), + show: !inContextMenu, trigger: richTooltip ? 'axis' : 'item', formatter: (params: any) => { const xValue: number = richTooltip @@ -476,13 +503,19 @@ export default function transformProps( height, echartOptions, setDataMask, - emitFilter, - emitFilterB, + emitCrossFilters, labelMap, labelMapB, groupby, groupbyB, seriesBreakdown: rawSeriesA.length, selectedValues: filterState.selectedValues || [], + onContextMenu, + xValueFormatter: tooltipFormatter, + xAxis: { + label: xAxisLabel, + type: xAxisType, + }, + refs, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/types.ts index 51938436fbb0..3ec9b2a4b6d3 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/types.ts @@ -16,29 +16,30 @@ * specific language governing permissions and limitations * under the License. */ -import { EChartsCoreOption } from 'echarts'; import { AnnotationLayer, TimeGranularity, - DataRecordValue, - SetDataMaskHook, QueryFormData, - ChartProps, - ChartDataResponseResult, QueryFormColumn, + ContributionType, + TimeFormatter, + AxisType, } from '@superset-ui/core'; import { - DEFAULT_LEGEND_FORM_DATA, - EchartsLegendFormData, - EchartsTitleFormData, - DEFAULT_TITLE_FORM_DATA, + BaseChartProps, + BaseTransformedProps, + ContextMenuTransformedProps, + CrossFilterTransformedProps, + EchartsTimeseriesSeriesType, + LegendFormData, StackType, + TitleFormData, } from '../types'; import { + DEFAULT_LEGEND_FORM_DATA, + DEFAULT_TITLE_FORM_DATA, DEFAULT_FORM_DATA as TIMESERIES_DEFAULTS, - EchartsTimeseriesContributionType, - EchartsTimeseriesSeriesType, -} from '../Timeseries/types'; +} from '../constants'; export type EchartsMixedTimeseriesFormData = QueryFormData & { annotationLayers: AnnotationLayer[]; @@ -63,8 +64,8 @@ export type EchartsMixedTimeseriesFormData = QueryFormData & { // types specific to Query A and Query B area: boolean; areaB: boolean; - contributionMode?: EchartsTimeseriesContributionType; - contributionModeB?: EchartsTimeseriesContributionType; + contributionMode?: ContributionType; + contributionModeB?: ContributionType; markerEnabled: boolean; markerEnabledB: boolean; markerSize: number; @@ -85,9 +86,8 @@ export type EchartsMixedTimeseriesFormData = QueryFormData & { yAxisIndexB?: number; groupby: QueryFormColumn[]; groupbyB: QueryFormColumn[]; - emitFilter: boolean; -} & EchartsLegendFormData & - EchartsTitleFormData; +} & LegendFormData & + TitleFormData; // @ts-ignore export const DEFAULT_FORM_DATA: EchartsMixedTimeseriesFormData = { @@ -133,23 +133,21 @@ export const DEFAULT_FORM_DATA: EchartsMixedTimeseriesFormData = { ...DEFAULT_TITLE_FORM_DATA, }; -export interface EchartsMixedTimeseriesProps extends ChartProps { +export interface EchartsMixedTimeseriesProps + extends BaseChartProps<EchartsMixedTimeseriesFormData> { formData: EchartsMixedTimeseriesFormData; - queriesData: ChartDataResponseResult[]; } -export type EchartsMixedTimeseriesChartTransformedProps = { - formData: EchartsMixedTimeseriesFormData; - height: number; - width: number; - echartOptions: EChartsCoreOption; - emitFilter: boolean; - emitFilterB: boolean; - setDataMask: SetDataMaskHook; - groupby: QueryFormColumn[]; - groupbyB: QueryFormColumn[]; - labelMap: Record<string, DataRecordValue[]>; - labelMapB: Record<string, DataRecordValue[]>; - selectedValues: Record<number, string>; - seriesBreakdown: number; -}; +export type EchartsMixedTimeseriesChartTransformedProps = + BaseTransformedProps<EchartsMixedTimeseriesFormData> & + ContextMenuTransformedProps & + CrossFilterTransformedProps & { + groupbyB: QueryFormColumn[]; + labelMapB: Record<string, string[]>; + seriesBreakdown: number; + xValueFormatter: TimeFormatter | StringConstructor; + xAxis: { + label: string; + type: AxisType; + }; + }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Pie/EchartsPie.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Pie/EchartsPie.tsx index f508b17eebed..9fecfeac0ef7 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Pie/EchartsPie.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Pie/EchartsPie.tsx @@ -19,21 +19,23 @@ import React, { useCallback } from 'react'; import { PieChartTransformedProps } from './types'; import Echart from '../components/Echart'; -import { EventHandlers } from '../types'; +import { allEventHandlers } from '../utils/eventHandlers'; -export default function EchartsPie({ - height, - width, - echartOptions, - setDataMask, - labelMap, - groupby, - selectedValues, - formData, -}: PieChartTransformedProps) { +export default function EchartsPie(props: PieChartTransformedProps) { + const { + height, + width, + echartOptions, + setDataMask, + labelMap, + groupby, + selectedValues, + refs, + emitCrossFilters, + } = props; const handleChange = useCallback( (values: string[]) => { - if (!formData.emitFilter) { + if (!emitCrossFilters) { return; } @@ -67,20 +69,11 @@ export default function EchartsPie({ [groupby, labelMap, setDataMask, selectedValues], ); - const eventHandlers: EventHandlers = { - click: props => { - const { name } = props; - const values = Object.values(selectedValues); - if (values.includes(name)) { - handleChange(values.filter(v => v !== name)); - } else { - handleChange([name]); - } - }, - }; + const eventHandlers = allEventHandlers(props, handleChange); return ( <Echart + refs={refs} height={height} width={width} echartOptions={echartOptions} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx index 7b948208a457..952419e83b50 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx @@ -22,10 +22,11 @@ import { ControlPanelConfig, ControlPanelsContainerProps, D3_FORMAT_DOCS, + D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT, D3_FORMAT_OPTIONS, D3_TIME_FORMAT_OPTIONS, sections, - emitFilterControl, + getStandardizedControls, } from '@superset-ui/chart-controls'; import { DEFAULT_FORM_DATA } from './types'; import { legendSection } from '../controls'; @@ -51,7 +52,6 @@ const config: ControlPanelConfig = { ['groupby'], ['metric'], ['adhoc_filters'], - emitFilterControl, ['row_limit'], [ { @@ -100,12 +100,12 @@ const config: ControlPanelConfig = { default: labelType, renderTrigger: true, choices: [ - ['key', 'Category Name'], - ['value', 'Value'], - ['percent', 'Percentage'], - ['key_value', 'Category and Value'], - ['key_percent', 'Category and Percentage'], - ['key_value_percent', 'Category, Value and Percentage'], + ['key', t('Category Name')], + ['value', t('Value')], + ['percent', t('Percentage')], + ['key_value', t('Category and Value')], + ['key_percent', t('Category and Percentage')], + ['key_value_percent', t('Category, Value and Percentage')], ], description: t('What should be shown on the label?'), }, @@ -121,9 +121,8 @@ const config: ControlPanelConfig = { renderTrigger: true, default: numberFormat, choices: D3_FORMAT_OPTIONS, - description: `${t( - 'D3 format syntax: https://github.com/d3/d3-format', - )} ${t('Only applies when "Label Type" is set to show values.')}`, + description: `${D3_FORMAT_DOCS} ${D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT}`, + tokenSeparators: ['\n', '\t', ';'], }, }, ], @@ -253,17 +252,13 @@ const config: ControlPanelConfig = { default: 100, }, }, - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metric: formData.standardizedFormData.standardizedState.metrics[0], - groupby: formData.standardizedFormData.standardizedState.columns, + metric: getStandardizedControls().shiftMetric(), + groupby: getStandardizedControls().popAllColumns(), row_limit: ensureIsInt(formData.row_limit, 100) >= 100 ? 100 : formData.row_limit, }), - updateStandardizedState: (prevState, currState) => ({ - ...currState, - metrics: [currState.metrics[0], ...prevState.metrics.slice(1)], - }), }; export default config; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts index 873a6ac2343e..9f5d61474a37 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts @@ -47,7 +47,7 @@ export default class EchartsPieChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('./EchartsPie'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Part of a Whole'), credits: ['https://echarts.apache.org'], description: diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Pie/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Pie/transformProps.ts index c0466e6bba56..4db36e864e9d 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Pie/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Pie/transformProps.ts @@ -18,7 +18,6 @@ */ import { CategoricalColorNamespace, - DataRecordValue, getColumnLabel, getMetricLabel, getNumberFormatter, @@ -36,7 +35,7 @@ import { EchartsPieLabelType, PieChartTransformedProps, } from './types'; -import { DEFAULT_LEGEND_FORM_DATA } from '../types'; +import { DEFAULT_LEGEND_FORM_DATA, OpacityEnum } from '../constants'; import { extractGroupbyLabel, getChartPadding, @@ -44,9 +43,10 @@ import { getLegendProps, sanitizeHtml, } from '../utils/series'; -import { defaultGrid, defaultTooltip } from '../defaults'; -import { OpacityEnum } from '../constants'; +import { defaultGrid } from '../defaults'; import { convertInteger } from '../utils/convertInteger'; +import { getDefaultTooltip } from '../utils/tooltip'; +import { Refs } from '../types'; const percentFormatter = getNumberFormatter(NumberFormats.PERCENT_2_POINT); @@ -135,8 +135,17 @@ function getTotalValuePadding({ export default function transformProps( chartProps: EchartsPieChartProps, ): PieChartTransformedProps { - const { formData, height, hooks, filterState, queriesData, width, theme } = - chartProps; + const { + formData, + height, + hooks, + filterState, + queriesData, + width, + theme, + inContextMenu, + emitCrossFilters, + } = chartProps; const { data = [] } = queriesData[0]; const coltypeMapping = getColtypesMapping(queriesData[0]); @@ -158,7 +167,6 @@ export default function transformProps( showLabels, showLegend, showLabelsThreshold, - emitFilter, sliceId, showTotal, }: EchartsPieFormData = { @@ -166,6 +174,7 @@ export default function transformProps( ...DEFAULT_PIE_FORM_DATA, ...formData, }; + const refs: Refs = {}; const metricLabel = getMetricLabel(metric); const groupbyLabels = groupby.map(getColumnLabel); const minShowLabelAngle = (showLabelsThreshold || 0) * 3.6; @@ -178,23 +187,20 @@ export default function transformProps( timeFormatter: getTimeFormatter(dateFormat), }), ); - const labelMap = data.reduce( - (acc: Record<string, DataRecordValue[]>, datum) => { - const label = extractGroupbyLabel({ - datum, - groupby: groupbyLabels, - coltypeMapping, - timeFormatter: getTimeFormatter(dateFormat), - }); - return { - ...acc, - [label]: groupbyLabels.map(col => datum[col]), - }; - }, - {}, - ); + const labelMap = data.reduce((acc: Record<string, string[]>, datum) => { + const label = extractGroupbyLabel({ + datum, + groupby: groupbyLabels, + coltypeMapping, + timeFormatter: getTimeFormatter(dateFormat), + }); + return { + ...acc, + [label]: groupbyLabels.map(col => datum[col] as string), + }; + }, {}); - const { setDataMask = () => {} } = hooks; + const { setDataMask = () => {}, onContextMenu } = hooks; const colorFn = CategoricalColorNamespace.getScale(colorScheme as string); const numberFormatter = getNumberFormatter(numberFormat); @@ -297,7 +303,8 @@ export default function transformProps( ...defaultGrid, }, tooltip: { - ...defaultTooltip, + ...getDefaultTooltip(refs), + show: !inContextMenu, trigger: 'item', formatter: (params: any) => formatPieLabel({ @@ -332,9 +339,11 @@ export default function transformProps( height, echartOptions, setDataMask, - emitFilter, labelMap, groupby, selectedValues, + onContextMenu, + refs, + emitCrossFilters, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Pie/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Pie/types.ts index c97afd3a7c9b..d4acbb951710 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Pie/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Pie/types.ts @@ -16,24 +16,20 @@ * specific language governing permissions and limitations * under the License. */ -import { EChartsCoreOption } from 'echarts'; +import { QueryFormColumn, QueryFormData } from '@superset-ui/core'; import { - ChartDataResponseResult, - ChartProps, - DataRecordValue, - QueryFormColumn, - QueryFormData, - SetDataMaskHook, -} from '@superset-ui/core'; -import { - DEFAULT_LEGEND_FORM_DATA, - EchartsLegendFormData, + BaseChartProps, + BaseTransformedProps, + ContextMenuTransformedProps, + CrossFilterTransformedProps, + LegendFormData, LegendOrientation, LegendType, } from '../types'; +import { DEFAULT_LEGEND_FORM_DATA } from '../constants'; export type EchartsPieFormData = QueryFormData & - EchartsLegendFormData & { + LegendFormData & { colorScheme?: string; currentOwnValue?: string[] | null; donut: boolean; @@ -49,7 +45,6 @@ export type EchartsPieFormData = QueryFormData & numberFormat: string; dateFormat: string; showLabelsThreshold: number; - emitFilter: boolean; }; export enum EchartsPieLabelType { @@ -61,9 +56,9 @@ export enum EchartsPieLabelType { KeyValuePercent = 'key_value_percent', } -export interface EchartsPieChartProps extends ChartProps<EchartsPieFormData> { +export interface EchartsPieChartProps + extends BaseChartProps<EchartsPieFormData> { formData: EchartsPieFormData; - queriesData: ChartDataResponseResult[]; } // @ts-ignore @@ -81,18 +76,10 @@ export const DEFAULT_FORM_DATA: EchartsPieFormData = { showLabels: true, labelsOutside: true, showLabelsThreshold: 5, - emitFilter: false, dateFormat: 'smart_date', }; -export interface PieChartTransformedProps { - formData: EchartsPieFormData; - height: number; - width: number; - echartOptions: EChartsCoreOption; - emitFilter: boolean; - setDataMask: SetDataMaskHook; - labelMap: Record<string, DataRecordValue[]>; - groupby: QueryFormColumn[]; - selectedValues: Record<number, string>; -} +export type PieChartTransformedProps = + BaseTransformedProps<EchartsPieFormData> & + ContextMenuTransformedProps & + CrossFilterTransformedProps; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/EchartsRadar.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/EchartsRadar.tsx index 5757c2a95f59..169240e8a45d 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/EchartsRadar.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/EchartsRadar.tsx @@ -19,21 +19,23 @@ import React, { useCallback } from 'react'; import { RadarChartTransformedProps } from './types'; import Echart from '../components/Echart'; -import { EventHandlers } from '../types'; +import { allEventHandlers } from '../utils/eventHandlers'; -export default function EchartsRadar({ - height, - width, - echartOptions, - setDataMask, - labelMap, - groupby, - selectedValues, - formData, -}: RadarChartTransformedProps) { +export default function EchartsRadar(props: RadarChartTransformedProps) { + const { + height, + width, + echartOptions, + setDataMask, + labelMap, + groupby, + selectedValues, + emitCrossFilters, + refs, + } = props; const handleChange = useCallback( (values: string[]) => { - if (!formData.emitFilter) { + if (!emitCrossFilters) { return; } @@ -67,20 +69,11 @@ export default function EchartsRadar({ [groupby, labelMap, setDataMask, selectedValues], ); - const eventHandlers: EventHandlers = { - click: props => { - const { name } = props; - const values = Object.values(selectedValues); - if (values.includes(name)) { - handleChange(values.filter(v => v !== name)); - } else { - handleChange([name]); - } - }, - }; + const eventHandlers = allEventHandlers(props, handleChange); return ( <Echart + refs={refs} height={height} width={width} echartOptions={echartOptions} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/buildQuery.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/buildQuery.ts index c48f4293e1c4..604f7f2872e2 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/buildQuery.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/buildQuery.ts @@ -23,18 +23,18 @@ import { } from '@superset-ui/core'; export default function buildQuery(formData: QueryFormData) { - const { timeseries_limit_metric } = formData; - const sortByMetric = ensureIsArray(timeseries_limit_metric)[0]; + const { series_limit_metric } = formData; + const sortByMetric = ensureIsArray(series_limit_metric)[0]; return buildQueryContext(formData, baseQueryObject => { let { metrics, orderby = [] } = baseQueryObject; metrics = metrics || []; - // orverride orderby with timeseries metric + // override orderby with timeseries metric if (sortByMetric) { orderby = [[sortByMetric, false]]; } else if (metrics?.length > 0) { // default to ordering by first metric in descending order - // when no "sort by" metric is set (regargless if "SORT DESC" is set to true) + // when no "sort by" metric is set (regardless if "SORT DESC" is set to true) orderby = [[metrics[0], false]]; } return [ diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx index d78d935a7910..61ac18209a49 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx @@ -27,12 +27,13 @@ import { import { ControlPanelConfig, D3_FORMAT_DOCS, + D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT, D3_FORMAT_OPTIONS, D3_TIME_FORMAT_OPTIONS, sections, sharedControls, - emitFilterControl, ControlFormItemSpec, + getStandardizedControls, } from '@superset-ui/chart-controls'; import { DEFAULT_FORM_DATA } from './types'; import { LABEL_POSITION } from '../constants'; @@ -50,7 +51,7 @@ const radarMetricMaxValue: { name: string; config: ControlFormItemSpec } = { 'The maximum value of metrics. It is an optional configuration', ), width: 120, - placeholder: 'auto', + placeholder: t('auto'), debounceDelay: 400, validators: [validateNumber], }, @@ -67,7 +68,6 @@ const config: ControlPanelConfig = { ['metrics'], ['timeseries_limit_metric'], ['adhoc_filters'], - emitFilterControl, [ { name: 'row_limit', @@ -107,8 +107,8 @@ const config: ControlPanelConfig = { default: labelType, renderTrigger: true, choices: [ - ['value', 'Value'], - ['key_value', 'Category and Value'], + ['value', t('Value')], + ['key_value', t('Category and Value')], ], description: t('What should be shown on the label?'), }, @@ -138,9 +138,7 @@ const config: ControlPanelConfig = { renderTrigger: true, default: numberFormat, choices: D3_FORMAT_OPTIONS, - description: `${t( - 'D3 format syntax: https://github.com/d3/d3-format. ', - )} ${t('Only applies when "Label Type" is set to show values.')}`, + description: `${D3_FORMAT_DOCS} ${D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT}`, }, }, ], @@ -210,10 +208,10 @@ const config: ControlPanelConfig = { ], }, ], - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, - groupby: formData.standardizedFormData.standardizedState.columns, + metrics: getStandardizedControls().popAllMetrics(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/images/example1.jpg b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/images/example1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..056ada15086c52032a4d65083f4c5bf5c2433f64 GIT binary patch literal 68385 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ν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 G^#1_m>kX^` literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/images/example2.jpg b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/images/example2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8dd0854409c6da0cf254b7bf47c35b1c4007ce8d GIT binary patch literal 66606 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�li(v1glSBDtAdXB2zjC#T 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 X7wPq)h4P}0|JSJde;Dw~G3&np7drH} literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts index f57eccdafa58..69f1ee8dac5b 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts @@ -2,7 +2,7 @@ * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information - * regardin + * regarding * g copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance @@ -22,6 +22,8 @@ import buildQuery from './buildQuery'; import controlPanel from './controlPanel'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; +import example1 from './images/example1.jpg'; +import example2 from './images/example2.jpg'; import { EchartsRadarChartProps, EchartsRadarFormData } from './types'; export default class EchartsRadarChartPlugin extends ChartPlugin< @@ -44,12 +46,13 @@ export default class EchartsRadarChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('./EchartsRadar'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Ranking'), credits: ['https://echarts.apache.org'], description: t( 'Visualize a parallel set of metrics across multiple groups. Each group is visualized using its own line of points and each metric is represented as an edge in the chart.', ), + exampleGallery: [{ url: example1 }, { url: example2 }], name: t('Radar Chart'), tags: [ t('Business'), diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/transformProps.ts index 01a20b82b436..f185859f4eee 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/transformProps.ts @@ -18,7 +18,6 @@ */ import { CategoricalColorNamespace, - DataRecordValue, ensureIsInt, getColumnLabel, getMetricLabel, @@ -36,15 +35,16 @@ import { EchartsRadarLabelType, RadarChartTransformedProps, } from './types'; -import { DEFAULT_LEGEND_FORM_DATA } from '../types'; +import { DEFAULT_LEGEND_FORM_DATA, OpacityEnum } from '../constants'; import { extractGroupbyLabel, getChartPadding, getColtypesMapping, getLegendProps, } from '../utils/series'; -import { defaultGrid, defaultTooltip } from '../defaults'; -import { OpacityEnum } from '../constants'; +import { defaultGrid } from '../defaults'; +import { Refs } from '../types'; +import { getDefaultTooltip } from '../utils/tooltip'; export function formatLabel({ params, @@ -71,8 +71,18 @@ export function formatLabel({ export default function transformProps( chartProps: EchartsRadarChartProps, ): RadarChartTransformedProps { - const { formData, height, hooks, filterState, queriesData, width, theme } = - chartProps; + const { + formData, + height, + hooks, + filterState, + queriesData, + width, + theme, + inContextMenu, + emitCrossFilters, + } = chartProps; + const refs: Refs = {}; const { data = [] } = queriesData[0]; const coltypeMapping = getColtypesMapping(queriesData[0]); @@ -97,7 +107,7 @@ export default function transformProps( ...DEFAULT_RADAR_FORM_DATA, ...formData, }; - const { setDataMask = () => {} } = hooks; + const { setDataMask = () => {}, onContextMenu } = hooks; const colorFn = CategoricalColorNamespace.getScale(colorScheme as string); const numberFormatter = getNumberFormatter(numberFormat); @@ -112,7 +122,7 @@ export default function transformProps( const groupbyLabels = groupby.map(getColumnLabel); const metricLabelAndMaxValueMap = new Map<string, number>(); - const columnsLabelMap = new Map<string, DataRecordValue[]>(); + const columnsLabelMap = new Map<string, string[]>(); const transformedData: RadarSeriesDataItemOption[] = []; data.forEach(datum => { const joinedName = extractGroupbyLabel({ @@ -124,7 +134,7 @@ export default function transformProps( // map(joined_name: [columnLabel_1, columnLabel_2, ...]) columnsLabelMap.set( joinedName, - groupbyLabels.map(col => datum[col]), + groupbyLabels.map(col => datum[col] as string), ); // put max value of series into metricLabelAndMaxValueMap @@ -222,7 +232,8 @@ export default function transformProps( ...defaultGrid, }, tooltip: { - ...defaultTooltip, + ...getDefaultTooltip(refs), + show: !inContextMenu, trigger: 'item', }, legend: { @@ -241,9 +252,12 @@ export default function transformProps( width, height, echartOptions, + emitCrossFilters, setDataMask, labelMap: Object.fromEntries(columnsLabelMap), groupby, selectedValues, + onContextMenu, + refs, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/types.ts index 9b053b626455..ca7cdbd2c2db 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Radar/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Radar/types.ts @@ -16,28 +16,27 @@ * specific language governing permissions and limitations * under the License. */ -import { EChartsCoreOption } from 'echarts'; import { - ChartDataResponseResult, - ChartProps, - DataRecordValue, QueryFormColumn, QueryFormData, QueryFormMetric, - SetDataMaskHook, } from '@superset-ui/core'; import { - DEFAULT_LEGEND_FORM_DATA, - EchartsLegendFormData, + BaseChartProps, + BaseTransformedProps, + ContextMenuTransformedProps, + CrossFilterTransformedProps, + LegendFormData, LabelPositionEnum, LegendOrientation, LegendType, } from '../types'; +import { DEFAULT_LEGEND_FORM_DATA } from '../constants'; type RadarColumnConfig = Record<string, { radarMetricMaxValue?: number }>; export type EchartsRadarFormData = QueryFormData & - EchartsLegendFormData & { + LegendFormData & { colorScheme?: string; columnConfig?: RadarColumnConfig; currentOwnValue?: string[] | null; @@ -51,7 +50,6 @@ export type EchartsRadarFormData = QueryFormData & isCircle: boolean; numberFormat: string; dateFormat: string; - emitFilter: boolean; }; export enum EchartsRadarLabelType { @@ -59,9 +57,9 @@ export enum EchartsRadarLabelType { KeyValue = 'key_value', } -export interface EchartsRadarChartProps extends ChartProps { +export interface EchartsRadarChartProps + extends BaseChartProps<EchartsRadarFormData> { formData: EchartsRadarFormData; - queriesData: ChartDataResponseResult[]; } // @ts-ignore @@ -74,18 +72,11 @@ export const DEFAULT_FORM_DATA: EchartsRadarFormData = { legendType: LegendType.Scroll, numberFormat: 'SMART_NUMBER', showLabels: true, - emitFilter: false, dateFormat: 'smart_date', isCircle: false, }; -export interface RadarChartTransformedProps { - formData: EchartsRadarFormData; - height: number; - width: number; - echartOptions: EChartsCoreOption; - setDataMask: SetDataMaskHook; - labelMap: Record<string, DataRecordValue[]>; - groupby: QueryFormColumn[]; - selectedValues: Record<number, string>; -} +export type RadarChartTransformedProps = + BaseTransformedProps<EchartsRadarFormData> & + ContextMenuTransformedProps & + CrossFilterTransformedProps; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/EchartsSunburst.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/EchartsSunburst.tsx new file mode 100644 index 000000000000..390c830c4529 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/EchartsSunburst.tsx @@ -0,0 +1,127 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useCallback } from 'react'; +import { BinaryQueryObjectFilterClause } from '@superset-ui/core'; +import { SunburstTransformedProps } from './types'; +import Echart from '../components/Echart'; +import { EventHandlers, TreePathInfo } from '../types'; + +export const extractTreePathInfo = (treePathInfo: TreePathInfo[] | undefined) => + (treePathInfo ?? []) + .map(pathInfo => pathInfo?.name || '') + .filter(path => path !== ''); + +export default function EchartsSunburst(props: SunburstTransformedProps) { + const { + height, + width, + echartOptions, + setDataMask, + labelMap, + selectedValues, + formData, + onContextMenu, + refs, + emitCrossFilters, + } = props; + + const { columns } = formData; + + const handleChange = useCallback( + (values: string[]) => { + if (!emitCrossFilters) { + return; + } + + const labels = values.map(value => labelMap[value]); + + setDataMask({ + extraFormData: { + filters: + values.length === 0 || !columns + ? [] + : columns.map((col, idx) => { + const val = labels.map(v => v[idx]); + if (val === null || val === undefined) + return { + col, + op: 'IS NULL', + }; + return { + col, + op: 'IN', + val: val as (string | number | boolean)[], + }; + }), + }, + filterState: { + value: labels.length ? labels : null, + selectedValues: values.length ? values : null, + }, + }); + }, + [emitCrossFilters, setDataMask, columns, labelMap], + ); + + const eventHandlers: EventHandlers = { + click: props => { + const { treePathInfo } = props; + const treePath = extractTreePathInfo(treePathInfo); + const name = treePath.join(','); + const values = Object.values(selectedValues); + if (values.includes(name)) { + handleChange(values.filter(v => v !== name)); + } else { + handleChange([name]); + } + }, + contextmenu: eventParams => { + if (onContextMenu) { + eventParams.event.stop(); + const { data } = eventParams; + const { records } = data; + const treePath = extractTreePathInfo(eventParams.treePathInfo); + const pointerEvent = eventParams.event.event; + const filters: BinaryQueryObjectFilterClause[] = []; + if (columns?.length) { + treePath.forEach((path, i) => + filters.push({ + col: columns[i], + op: '==', + val: records[i], + formattedVal: path, + }), + ); + } + onContextMenu(pointerEvent.clientX, pointerEvent.clientY, filters); + } + }, + }; + + return ( + <Echart + refs={refs} + height={height} + width={width} + echartOptions={echartOptions} + eventHandlers={eventHandlers} + selectedValues={selectedValues} + /> + ); +} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/buildQuery.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/buildQuery.ts new file mode 100644 index 000000000000..8b47fb5e725c --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/buildQuery.ts @@ -0,0 +1,29 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { buildQueryContext, QueryFormData } from '@superset-ui/core'; + +export default function buildQuery(formData: QueryFormData) { + const { metric, sort_by_metric } = formData; + return buildQueryContext(formData, baseQueryObject => [ + { + ...baseQueryObject, + ...(sort_by_metric && { orderby: [[metric, false]] }), + }, + ]); +} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx new file mode 100644 index 000000000000..1187fee0a8d3 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx @@ -0,0 +1,205 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { t } from '@superset-ui/core'; +import { + ControlPanelConfig, + ControlPanelsContainerProps, + D3_FORMAT_DOCS, + D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT, + D3_FORMAT_OPTIONS, + D3_TIME_FORMAT_OPTIONS, + getStandardizedControls, + sections, +} from '@superset-ui/chart-controls'; +import { DEFAULT_FORM_DATA } from './types'; + +const { labelType, numberFormat, showLabels } = DEFAULT_FORM_DATA; + +const config: ControlPanelConfig = { + controlPanelSections: [ + sections.legacyRegularTime, + { + label: t('Query'), + expanded: true, + controlSetRows: [ + ['columns'], + ['metric'], + ['secondary_metric'], + ['adhoc_filters'], + ['row_limit'], + [ + { + name: 'sort_by_metric', + config: { + type: 'CheckboxControl', + label: t('Sort by metric'), + description: t( + 'Whether to sort results by the selected metric in descending order.', + ), + }, + }, + ], + ], + }, + { + label: t('Chart Options'), + expanded: true, + controlSetRows: [ + ['color_scheme'], + ['linear_color_scheme'], + [<div className="section-header">{t('Labels')}</div>], + [ + { + name: 'show_labels', + config: { + type: 'CheckboxControl', + label: t('Show Labels'), + renderTrigger: true, + default: showLabels, + description: t('Whether to display the labels.'), + }, + }, + ], + [ + { + name: 'show_labels_threshold', + config: { + type: 'TextControl', + label: t('Percentage threshold'), + renderTrigger: true, + isFloat: true, + default: 5, + description: t( + 'Minimum threshold in percentage points for showing labels.', + ), + }, + }, + ], + [ + { + name: 'show_total', + config: { + type: 'CheckboxControl', + label: t('Show Total'), + default: false, + renderTrigger: true, + description: t('Whether to display the aggregate count'), + }, + }, + ], + [ + { + name: 'label_type', + config: { + type: 'SelectControl', + label: t('Label Type'), + default: labelType, + renderTrigger: true, + choices: [ + ['key', t('Category Name')], + ['value', t('Value')], + ['key_value', t('Category and Value')], + ], + description: t('What should be shown on the label?'), + }, + }, + ], + [ + { + name: 'number_format', + config: { + type: 'SelectControl', + freeForm: true, + label: t('Number format'), + renderTrigger: true, + default: numberFormat, + choices: D3_FORMAT_OPTIONS, + description: `${D3_FORMAT_DOCS} ${D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT}`, + }, + }, + ], + [ + { + name: 'date_format', + config: { + type: 'SelectControl', + freeForm: true, + label: t('Date format'), + renderTrigger: true, + choices: D3_TIME_FORMAT_OPTIONS, + default: 'smart_date', + description: D3_FORMAT_DOCS, + }, + }, + ], + ], + }, + ], + controlOverrides: { + metric: { + label: t('Primary Metric'), + description: t( + 'The primary metric is used to define the arc segment sizes', + ), + }, + secondary_metric: { + label: t('Secondary Metric'), + default: null, + description: t( + '[optional] this secondary metric is used to ' + + 'define the color as a ratio against the primary metric. ' + + 'When omitted, the color is categorical and based on labels', + ), + }, + color_scheme: { + description: t( + 'When only a primary metric is provided, a categorical color scale is used.', + ), + visibility: ({ controls }: ControlPanelsContainerProps) => + Boolean( + !controls?.secondary_metric?.value || + controls?.secondary_metric?.value === controls?.metric.value, + ), + }, + linear_color_scheme: { + description: t( + 'When a secondary metric is provided, a linear color scale is used.', + ), + visibility: ({ controls }: ControlPanelsContainerProps) => + Boolean( + controls?.secondary_metric?.value && + controls?.secondary_metric?.value !== controls?.metric.value, + ), + }, + columns: { + label: t('Hierarchy'), + description: t(`Sets the hierarchy levels of the chart. Each level is + represented by one ring with the innermost circle as the top of the hierarchy.`), + }, + }, + formDataOverrides: formData => ({ + ...formData, + groupby: getStandardizedControls().popAllColumns(), + metric: getStandardizedControls().shiftMetric(), + secondary_metric: getStandardizedControls().shiftMetric(), + }), +}; + +export default config; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/images/Sunburst1.png b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/images/Sunburst1.png new file mode 100644 index 0000000000000000000000000000000000000000..87c140e7c3ed264b53a064f31ed66c3a66a6cc85 GIT binary patch literal 130270 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�*IpA*e6Mr&_$@CoO1y1P2Y<x<EE12Lnz*9r<cR&qM`P zDuEPhYNabsG5U=aazIS)kRk#ZeeU&)d0WFc75Mu6XrOFo?4SJs&;jW$^IcunlWbGw zt#-Bc+wG9nl!A7)IG@Jrv?tqtPA9wLKCW*vo-cdFsHIQ#%i#0t8)1_X_!Z|#(o({7 zV)xs!IpLA?;h;<(RSQ^3U3(NlHwoQ;7j;<c2{ZWp%}eRrv6=Y=2PHUo{Pd{c=jR%g z9gS(zQVDPpUfzl@b?K@+q7X({`_5}EDu&0c#na<e-;F;!sAb&VaQz8QGkdum8Cgqq z=;nBYrhl>*;fi%Fu=10GQ#Y~D06w~6J&9p)tvvDW0Y8n(WMETw5esC8xZcjgG&0|w zzs|T}G}=&dDgnKuuuYQpP%0NcabwFF3iSvbdDsSPplHyM-0L0KXDbRWJ4F~_{qcm2 zFE0A|SZjsfA#6t}!}-CA_j~|tN{u9rY3TcCvy$uX)7{M;8c|>K5#?ygqrmf(rI|1T zJBNiuW!ShdwkS0x!uKILy1DHxrcNfeX&cvjXZmKZFq6=JBJHGTY;j={d4wd)i1Y-m zA+-K74)FBt&CT!!O-<4ES6+N!wf4g5n%##{EWhwa@e1iN5$kVt4>r9+$w>B8tb1kt zDFLXBs+EWJy%j(~ry%wRJ>NrUT;<L#4#aN~<gc8#Xr_&C{wuba*kB6ap=T9;&aJ2# zaUHrGF$wc6GD!zHq3Z`i6#S$X<x%y%sVjiRVYjE&c{uf|gp;BEf>1b+LD+%zW2LoZ zHJkk~Rv3L}72|FG^f3T2nN<Ib1VJ;?pNijI>8us`%fp$>*><MX{w5HoOtlRV2_hId zhu-2sa}*|EMnC2mWIno4NYA|#o*b2<#kAC+IHINSAJFl-5k3%i2Nk!y(ZhL^P>0Mx zWZz1oa!*kis+$i|TtrvY_nj(?0(gc)yzzf2wty^0AH-S;6Ccxo+}xJjr_ggyg!s>z zTnNj~CjtSl>!@tW5Mm3%V!7T`CO-Pz5cpWpu|>c|lLINfIj`w4D5_Jp+qvBZG1j+; z(-!!Mvkoao^9&6WAIjllj?E}t{()Z(c@6V@!%R8eR5bEBoIaR@1<D^*xW&8Oec8p` zC8mfttCsN6%PeifdCh<V2kfls#O>X+D9Bs1<A&90RTI(R&XJK27~k~C&;2sFvOufO zzRYgmWEAwV5Z6$@>ejaDTRoW}&M>@kR1N-Rteqh=JplwA!nSs;Y=O6#e-Q&5iaKgt zYmvLv$X1}*AGfF{@8TP$8_u{?;T_pPzGTChzN>;v*3~5Ew>pCHm1|^P>iOg4EILOf zsr|gF#iSZGa)pf8VIq7U*|Y4EBaZE$!Wb#(C}DTqlCOu2rZ(Pcv}O#w*kYVyO?70* zM;P!#NgkFp79)#)NRTu(iRdO}jVg=(dTb`0>$<8dgj{io10AUNK#L_`B6vWK$ZvCP z3`Bu~<iev_Ho5S~)|uAHj0%&JP`cr8I_&r&^c;qw2hDue>anr4XKn|4nmILT?z`SR zP4r-6bJJos-s?eHQvvcI4&vUHPJA19dCTSG_horX&+shH+j3K5R%;$LcL$J#Yd#3) zYJR&Jya`4e&mwl}rMny5uikDi-9OUaN6I2&UIB71-wA)=PL!FYH9a!D)1-l|tueT! zma_Ak{*61GAdKBq;Bc}1qEV39DSj00<^Ni$wKNSY=|j;OLk<tOu^v)0Gz?HV=L$pM z$BOUc;{deqfS~&uV<&D;Kyda0Y?@9S1<RjO+P++Wqcncjwd7J_;&zJ=m$MXJ9eokf z<+K~0YR}Ldfd@=1#j2%CmmnFPE^Uuj-uT7w!OOes-!NDT(`~M{68MDLjvQ7PjpRpN zgwCHUr32kLE<@x|LV>#AuLLBoZ>!Q12pl$m$cauV$DwSxCOyKtY3)PKB9=M-WgKvt zW4?mYQW%XUPG=D@Y_i6xtG#Gn0W~Zt&bOs0EaA$%`T1E=1{NKJZ}c=n)*aoZfYxGy z2C`<GQFPQTfu}<v8p~Mf|D!uLn%}Z1gOIyHS-}Q%BEFNRxIJ#NyzWO7i5J5ajp6bl z5A9HI&_zt#eoS1r;gQbv)hQYB9&V_jsem$X-Q;J+wHi1WpfF~U-dKGS=H-f=x8|8^ z&EaDLoHQHpuTxQed)kugkkJf9g-A+POxbJ}tVc+>l*rjR6_T3;q0#|0bvwV&xQ!Da z-VP8nn*qtDH~jRW<k(aPek5x6RP6US)81co=E=U@(Or$CHdpfWEpM33Zmmbw>iNx_ zt~0jnH%G<p^L-)9ri|i`7hhJM?^(6vSszybtpf37_9xQ#q8VVged8N4M!8PVVPK$h z1hjxF#|l-X_53)&``NHSrWvy@q$(|3h_RhDkfD^I=*WYd8$;@*#LKpe7L}chxs=IS zF+)abQRO&@a3I8ghJc#gA2+7@U2bgaA3i5guq<b|po_5^?>(t3*e{Y1_o9n6Z~ZSO zTm}Q>a(WyAg~KPK-!ABe1Z6H+0@s8Px+4M+_K3;kckFfF$tlTn(aWR1A;NJD4Cqa; z#h5W(y<c@}XtzLGkR;Pd%Yr;s3d@i+t)}HiDppKUqfx0`g#p?>G9?>V5K`Uwt??07 zcsqXQq?iHSAM8bRJ?<PZ>vaE$1Bcj{&FgzOpz)XRVdy=#{M2~bTNSm;@{}&KjFF{t z*OlaI`apMndDk<)?8CveylWKO*1;Cs8qza4r_)xM9!bB0Ds<Is#+sRblk}y5;{qNK zG-RUqt(0k0$g!^@^PBSE(Hfiu3R3ZeMgFs?Z?BIHUGOHS>Qjo6af?-0eYxNw(~|~i zIlu7PIycZ8i!Y+oxtD3*BF!>y19dAp$nk{0*U#}&IZii)DjZRKUxQtv{ZpfU8q6{x zNQlr6S~5e{N^Gnr^h?rKv1WL+E-xEU$Fca38b<F>Oj}ckxhZ$1#x`Pwx4btgbTflw zv+Izd$mov{m4St7AEl2+xvWw-f`8~kKSBVK)Gm+TU7UBlS13H*jsg|k-?HHW@gIXh z31)go)>WF#ruTaX3?$?pz@(IEm={)2UZb6nNg`S+sRbkulw{=>LQH6X{*40e=3|WD z=mJeB0nh9?BA%TXu-Zx)DL%a<D``Rd7vPKl<;EBS#=w(A#ues*vv@Z-vYG-y)FNfk z#KBRCC_2Esxw&IgLu~#CB+<OrkDyvtfryM5Qe2pr+<=oY)gdWPm1C^7mdu1|#KE?m z^Eap2W!bxK>J}9Fb87}7TF0adX$|<>3R;vpA7uW;8S&?NA0T}3{O(MCZ&+w5e>#kY ziX$V#TQEOP^nN(^AlLi*?X7Y!M<)qvy`Xd7vDyW^QKAEi1XQO;J31LL9<*pyU8zt$ zi!Z`}{X15!kxV!~e(~ma4)1GDcjr(-5{Kh@C)9yRZUe_9It4a=<Q0;K)BxGTstx~p zuMC<<ch4mJkG1DtVd}G8dqdHwCw~+~h1lnj|E<plo0>xJgbAj~e0X8Oq96ZzQH2db zMvR=I87%U!3#-o6H%o|8MeACgr~*VWk;X-YWUP%yR0{YUp$zTsjat`)eh{jv<Y{kK zXH=~DI7Skqjr)E1d7Vp<gb*1cz|j@?cL(~a@%{7sRugfe2R(}67rzAioIT^CM6Yji ztMVm#C^Y~z9N@ov|3Y_g{tU~q|F~bU0YuU$&5yT(xr$5bA3xWUnneALT99QQ?fZ{* zhZ%BJNDw_MnnDcFPyuMs1hSH35>$0tpT&&&=~)95XTl;El~FWSliiPhiVj@Xa?NXD zVF8B$tnN0y_6f`7&+t<+1`AzvwXmHvmj&*T;<8G}AuRWl8x$J5!^>IRi3#+_;BM+O z>PM0BRlTDN;Yi;?;#eKkC?D2v_lDITLfSw;k5>DmS3D$=or8ny=D-_Y06!$J{aB~6 zCjh{s?rY>`v)7w*q|Y3DzaNK57m@1*_9!3qE1A5?Bh;t=nUGpFl#tY_POC7*afEe; zbq=`CC=tE;H$aK4M!L?L!*jM|3wn0_QoKw`EW(>L#Ac%41cTvjR8dnSG=hZ&lOuz0 z^|1+F=iQlqjP4G^Ng?x;tmv6%pYyLJF@fyv3r8T;ma}d6-aR}ZUZ#{+&?iKvtTv70 ze1LsA%~?rd<zFEsTGjugI<2Un)9ju}=|A{xLOVf%i5?)~te2eznzc`4dcvUNak{~t z_F8!c)aYNiq65NVku7LAb#qD*mDS~9s3<H#10yo-`(8&gpw1!S!YPBgxzLIX?+?N# zjlcQelF=D7-l{OFni@C!{^KW^9y0>L@9cc8OubpE()(Q>(G*X!q@=rm82t6Rnr=r< zmJyV`^h7y?8zhVB_RVAckbFGjeC?eiKwJq5O719tLP;<<g50o2RaqfTLIsUQ(7d^m zr^oDtI)mM~Nc#E-ZJZl{LuzbQCN=br{hs6^f4C$!`tDSS5ut;labs8#Ook1Zv=;*_ zLKojc6Rk<?=MswQ8;cg4Jnk3J+{kXQn1Uc}q=VAi7niy_gWCTgo@cuiKJLLb+*MLI z)~X_;sh~Bt7QxO;3;ahi=?U$h=?Mt4NAH7w!9@CwqD+MPf_kF$b;htIjYhw}r?Jau zrDwBiem^OS^a0hfZjjnn$Xq2dX7f472nZq7zT>)jG)_ge1u&9Apt|c)!hY0HMiVhu zbY*4uiINvA@86EnQdbCmbNtQ3%_i<TH$zHs$lHW_*$H2Ry6IJ(uP7~anqDeM_5ON* zPC@Z_)O;iw*8hOTtJu$<MbX{@8Ynn*h3Elu4I?s$aiXI1TqK`w8oY|v7Fr>5fQ~EQ z7Sato^l+S%b+f8Hmt`Aul)9$)_*gBAXInTdgp}(9VX7q2wM5Z1blaNAagQTfH?+Qr zqEfMX(VY$yH#Gf3|L$2ONJoOWCd$uQ$F~vVP}mTDzBeB%Wk2J>po|T@KdeV2zv=5X zD_{9BH7Wfn@(q$+^bFjVKDjrNaW*!{y(r(<5v=%!<S8SuQ5{Ln@XRvWI#*{>N7nAi zxXZP~9j|Y_B0C)op~=_eXL7EK<WqCXq(3!CZJkQ6vYU#;ho4L^yMM(+`a+<bJKFY} zosqz5#ibZP)8qMN`BW2+FYssD?3p3|@kVpKixiwkR*dEEo0TCtTl&k|ETh_I_0Z#* zIR8iDb}e0)&l4X=N(tsBTpPG6uVv7^IH2TFpmUqg|83`pTQ0ioEd2u$$}GL<mB0&j ztn?G1GCt4w0?y?DiMGO!jZ*yN5xLiSzX=$~i#CqUjWHj07APcR-~r2s=ndDJ>WO{+ zBx43Zn#<sc2pL93ef^$%0mCmbr>TTq>cR;r&0NmKg!U$JnnAhBFQuwE=+N@993*O_ zL)z2ks#*2*F0xfm1V;jyoyWHEN4KuJk-ozuijrbK=bz7Oh8O!`->>r@sqK6B-|mh< zE9`Bq@%v)Oi_0MsLzc8~m$fk5Wg8MB38aq7u^c~0!O?S~YZ}t9j_hZ0+7+6hq!KY1 z=&*z#yd;zoEH^MZH%&Vj@Z;aayVnLjV?jrMF-BYbDlV7|^1QiCs9nJVhreGgoZliM zI4A|I_$F&(P&X2s%C2N^QQKih30v)!MkY)Jg`b7IA!rOG=`<BElz|r{k8lZ$xsStB zkL4g>sbsTJY*KTnRH<kav#tfc*5QRl$Y}?lVK+7)>~JSpa)@O~-ebpsh!EF%VR{Q$ zNuZ*~g<9hUOv#bJkH(=|$hO&dC*V(TYSPy)8#PdHZLf(BW5Co#F$yTi@3-g0`9mHF zhrmm9I1pOPXjN-UuQ!*531x-I)ABuUhrb-iP2lrZ;r)dMEsjisNNf*?kpN7M=-%wm ztnqn*{mnR1{(h>9q|DBTTB2e(mW{VAgSG&qR~+I38bC>x+p)V_GRQH}1xOWIQt*x! z*{+n!<FRa6LNxl<($YJVLb9xtG@4I;NzW=VXO|3C6R*SrE3@0dhZ9mHTD|svvh;`M zm&k1O&#{w-!AOXA%#bh9fIa9woWQ+wer9^_<+>Ck{;$ZHHs)`pF%|&v5`X?&cyC?Q zS*0*#ph6-jC!qto#mC=}fTRSjHu2*`EQejkksDYp-b_jk(Jdj|F(R`G^DIM!)mMZ{ z?%xI8EGAYV*}y{-bJ?eMPBOh=kmuXxm04_DcrAs1%o-2b#5zbc8av7kOJ`~QPio&Y zux49C_{DdNGAZ8?@oNUi&d+7Z6H*PfVRSSK+;Lk40nuhsKQ7m1`dewNYK71bRI!fc zsO9F+!q9RPoE)wAt=&ely`K7HeHw+Tgs^vT%>Wf*P^7Oc%0m62hfxt>!oO2j&3A{M z0)h_uG%zEBd9#~H$&+Fgy14H4aL-Qm+sM!4_ahd>59Rca1rx)*!0Je-Om;RT;B<Ge zHVL>_x>T`=dO>cDLuf{Hp@6fj1AJHufzQ3zHD1?cYMS=^DxSJ;3e7D+%;L@A4AxkE zkn>Ce?iw3HxO<ud*#UFS1VwEqIQ1nC__Aef9m7`c1*J!@F98a>5-YK<sLV6<+24qv z%)~nrOS%5mN_`nFu=ZaMwCt}!8=`9&$jnL}D>F`OeJ$LMwb|@c9=9crPKmQ0=wyjp zb-Jp05`ZR9!F^C-68ct5_1eGxNNIqUu@5A~7O7zxCdm^<BBPyufkv5jUKv-D_Casa z?(h|h*Rtex4i6qw#+m@U-43n>YI$d>vr47VWMntA?4~8m>I`y?sjVQiohT8irwjdT zeGAhdgzcC7aoeP}cOs$)dcJ(XD*@&y&)BzrekZ{+kgAETwL4X&qce}EX$*J<w{{k| zpD{3;z;~V;WD_FLyvN5hj#Ch?Dp!9~c)_i?3DT$xDA`R_f%1)*N0=~en!OY^l9@}0 zRFZ^EokHE?lV~j2C|+zh<GsK`<rCMtN+*ho%beK0;Ee?immbc~^2{3(>fns7g#$1e zju<MEhR80rgeOEx`6q|^28vlJge-E@eVH{51ybAIry`m;>uIq|%3Cc4`?Z4{m3294 zIqA*#N{OhuznSMO$(1NJJs=l&=DEvuMqoen#I|~a;`mE-K^N~gDZWtwqF2BDSW!_q z?w-@KP7LhtI1YN}`;UyLE4?R%j}V#wvD6JsRviA|LkcE6`<tagMW886)s}EaIh0Ne z?!79ix|&PBD#Bz|LQGL>Jv6HLLGJmT5c9U^!Wjo*T7;N^g>ZT9#lStdM(myZ+k@y^ zucQ_xQkLz(fQ`i9M@qoVi^e@YS;Re|xq-9E0r1XH%(|xBL{%UKGa_ix&RL7)QD|4+ z6*11OqJE_jrW}5nqt(j8WI!R8AInWZgEAbpGzZ6>p@P#<m?@ycFKcTaLt^BH$s2=! z1C>ShD+l|0L@0draRD%oVYv-Uu2}Bc+Mo^_0*ZJ;)`($3Np8)vRLhqNKBYN+Urx*- z5kQ`{{?>-<CQQg;3`TP+!2opmMLl2bn-^3zk%60+0$#FrGzENg@uZ}HOy|?a!)es^ ze;yDiO7r2Igx>xJ^;5?m|I}Fyj_tK(uUa3qb|LYfO(1F-{^gv@HAsM~3}u{mwltN< zhg$+x!6O&+q2QNP+>yACmQ-#$_gd4O|LP}BYhjqS?~S*q*vQM8*lzC-4s^^4_`GtL z(TzNrea#LAHn<bsjlsbuSo=_Aznbl=TT5&r=5*uA%CFN#!><p7K-pw^B5UkmfQjvQ zl!{RC4dLy}u5rK#tsS`kaEh}4HZHnU0Ju=6g#yuynO+Jf(L>SA(}BIBY`m4IxV6ux z*t-O?Q7E2t@2gWm;(0%za;25Nv_Ox)_i(ZbZqy!~1=U6H2=<!W+W@Qo`#$T+;78%I z`<!>VCW{DhVK|v2Od&S>A?|Ju@NH7feL;!TL5D^zhaK<+lz}qPQVEjyLGl()eQt<u zXkr~6%e`7qDF1M0md#!NZ^vyM)#6({t6pF56n+D1+KX*WS*G;Nu4+~-PoK(Q_8ptK zajhxvR;{Av01)A8PP`%bV4Y{=D-f1)j}~{OLc1Zp#v#{pTD8{!ACoS+1|5bbD!0=C z&su!Z8HQ`i5LlIF|6^>%Kr(JJ1_Ngt8tIM=683+vXMOJECInCvW+v!8#!j@;?9M%7 zN2H1*7#1GkzGD$e6F%2x-ar&)en<p_m}`{WggiZtI1cdRew8A!TU`)TkX-o0a1}IT zDC>tqEe^Rg&3w_dF97DQ1iJ+)(Llm&gVPz_O%dMjo4Wb^(L59OCtx)_Xl^mRv00hT ze`IgC1;DX}l>E9LRMAU+r^G{O5JF=s)GDlkGoJbGV19u7_a;fhhPHE{a4*ibbBK^S zrnkE|IXQXN7BHZEw_GZ3X&e|3SKhRoNf+?FgigGcZBhRU$)2=(|F5fB^DC&`16Y!i z4zjMQ6=u!5$FyU71sn^*62U~*Pc@kE_eK5J%e$wMfzBM721qspI`==i!w#j>3_28C zV9Bg_h>kBJJf2UtC#lT({<jWb`8A(6uNAlbtd6wa62lY*P1qVZIYfB)o-j13FGQc* zwOSo%q-A6Z*}c5HE^e2>E^aSSaGy8o#`%BO7!Jl}WJLJ-e)x#{1++aFGngk9@fgXA zsN7}p7x(%6H<F}`j0l%la9~i7l%=-)Fhwe>@d%Ff?e(>&wRPp~BhOiTK!#1L)YIaO zeCOM_+ZS5`<!>JJR!C%e%AnEaOUirLz|=&!7yU^3&_#$xm?w2qw7OSUAy;{EK}Jxh z@akC%j^V^fDl1C_6~%JXn!5}V(#0ZBKd!E>=1)anK?}4vn8;nS4hjh&qo5FbYN<<T z^f2={`=$T;{Iu=N;BcnYn#t+NK}-zBWHi+;i^nC~ZY7h;p`Za;-E#Su=8IZNs@L<y zVDm}i^3s|KYtH=hJqv<Eo!kK7*T8qgLh}1}RUM*h+x!n_ZV+?WKlOx;p=V!8`>B6v z@czQ_9YrZY3kk@>8TsP4GaBD0O?vShF8Z;KHtjBVq=umi<`*T1mf~>@T}K14EY{lH z)LQHdoquRkm>}`r6R&w*$(=N_Wr39I4F^B>4cu1f=r}pCn~Y_KSuZzcnZsNAsHmXd zo~|NNQBhgvaI$b1G+x|Q$7c0({k|b2^?84*e9%RI+b|(WP~5%jpNSC-Fn=ifzsc+o z9ol;exhX^n>XH!K&*(&kotFP={epy6r<ximH~JO478ye1twzdPsS2S@VlvKmho9~J zXuhgH)q<Uok`gj9BHdxx8{u?)Fln<t5r*HsSZ8YZJNT3PRoIF!3L}j$E*>uKbye8; zFu3bQwR(Idbg^hwfS7H!WR3713a|@i$X1YShY^Z@FYJ-?@TC@JpB31SrBiYfGO5;6 z#O+(8AQ8#N{?Fco-<l!|k7i5q#pX6P;&O6wA$JuT4G2GUy&BdUp3b_6{GlCZ&=Uoy zpambxhF1+KL8D1ObixcCUt;6p{6<GdKj-q`vHTeu6E`y}AtXuvYMq|QM8&HL{HNx- zHIJLi{XSuzw-=Wt5nP|w2UB{rUxMTE7xMJFo%lLBI#W8L-f6_o>6Fka(g%N}ga*F+ z1$NTtBtXV+5j)_?&-y<7V&b#kumh%nUf(b07yBc?7MHbEBCD0tQio4=cV2*rKVgC; z5p0Bc0tIq~m1;G@2<6ia63-B?mw%X!oU<;p0(aq&MmB$k*d0uesKv4FhN6%a`1nhL zW`B=qD1@o=g?%ZQ8ei_~6W!V07YQ{5K|~%Ln1L=`i%iU7(iDH!liiHfv2TV+%kw)# zU!p1S`eEsMD)B@O^~gv{`sU>1G%Dzk+9E?sO%r-uE45!w$)v|<b0g$pYfn)?i-}6+ zyEdj%3S$9Rto2voU$gg%yKD}>_Ohu>pVj_=K&+!t&YbtVcLH+J43G&X+F=vazr{Q1 z8+wp)jD<#>F)%idX1<7Q^aIJ$NZ&M4=9$$`E|Wx?MN{q~qx{e3BD|MFWGBK0UpyR~ zos%zfZ8{%J<Wg>32MJvCPL>+tsT7duRxz=$sY?;Ux4Yh6%RQt>4TTpKt`V7(miJCi z8Qn?<T{j>^MeE0*4rp1*%gTDsy56cdI*1hv2cu_?c$PytNlku-Af<$+nsn^v_z?P6 zG+6htl|@9H+c+2F3knHAw0Cse6k!xpkbNI-%uVq3T~hp9SmYFx3QsZ8_;h}8(NiRs zfsAjZCUwZCIk&Okr;U3BB(Q<~2=YKvj;6+(lLY@o1Dggya2o+TM#tRLeB4WYM|WmO zQ(?XO6e=5Xh4|9?Y-Bc)G{&K1klT@T+g`fm`7l*Z_vECKM;qwuX*Wf;K8J_foNn~u zW?olD`NbMuNWxHTC=0ZWw#KtM_uYW9_jCVatK6}=<cv#k81odk^Py-JIhU6Porb-V zEhep7({-p%E1fcsZy*Y<_+i0xaJKx1;ps}t(u0ahor2`!5h~+Je_du~RO-vcAW`%4 z<)52dilKI5<9zWb?mx#~K5lQfpE%oHEY}rA*?_0(YlVz0U`<FGoI{rJl4(u`xUM%$ z%&n&{+cUqp(0;9q1N$oq>V`&OZ=>WKGKxHeXUX_tuADOS=*U5Hnd{h3-YPRHI+S;g z`_DbVasTW<EAT5qki@EqnL$xo<7o@AfIqakhH0NHD7d~7>z#v^9L-fG2ulXdD{Y{m zp^@z-I#GBk*EODAq?u;-03N0M1QptRz0*s%<S>~*lbn?Xl&9#yyPxS$&}zPvv7G5B zK6-n+NOmGsB4Ckz4h#(2&pEj*Ygt<#6!G}F4ODHOJaDpe0AL=)_N)1}PfDvH5V;)L z<RCr`Jk>@F^es3t3|c<2T2H@s@J8^9fPA*YL4o~dzDi+2+72j+9^Cg3t4BnT_yVuS z0F}OcZw49psu*^T4O(tQoyp($);^-AJm%VasE*2sp%h(jc%@9WXZ`BZey87`I0UaP z(-lGJQy2alp|*URUhZcdcjS<{EfV-*gy}X>3=ZTb!Y8)F@f1teEzQjvZD*aoo#wSe zND*?u%c2BqEJakx5508vz@{vV(eK00{}yMvmx(CT8@&Z#De+b}p2+sm^YLk?f1{SN zNFUOD`d6Goj+9<BJ~0^hvW(K?l$D#Zd-I-rk3{BlxwQHicJgEf^DSWG4dTOxw>LYe z*RcP6%==gy#ueQZ&08d~IUd@Ds>i<#y;w3L5i&^mr=;d%lgiI3m6A3^Y8Z_bie?#9 za>-ah$csQ^mxujj+riy<!DD-uwktk`=2fsjnwyK1jkC!b%WyF)892ni@ZziznQY#_ z|2;#mP0CzrL-6tTd}0^VSi|FL?=LpHg-R}0b=NC5|HDp#u-6tj6%|~iX43%hlxOGh z@$qeUhEVFwr^Q#PKFeou2d#B@kg>6STV)!^<Z<~tTlW3io%MPr0buSwav}nL{bHUe z`(Cc73;buq6CUqp*9!HzqKVX(r@MTgx7VOY)oPt6cr?nAr@ir<7yveOymY#}y;fSC zWW1`lL7zSaH5V<uJN|X=C%L-vl|eG`$nHk#<(Vry4x7lM`Rej<cBIbNN6UA&uxe~# z61=ja#d|zn6chwASFNiHt$9OAfgfrr#EVvDVq+71d~7vqUXycrddlhb_~me}QuDz5 z=5RJHE-v@<3Ak30Q_UuuRomSW45u#6djJub9ri|ry}o<d-}IViu5>k&HSNB<UtlQm z!Gr^{hRcDzC~As=3K|!-37mmJ%~$dQPtZ9%KmZk?A-C~nB)}XT0h0~%!Ha<VpfHsA zcF(cyiALmg9cPmA=n7cM6qbz>904ex@>{X|Vbv6_Nv|UMKxi2}lrVN!x?II-p$yhv zM$fxdmsAdLc58Kgu)4cDcVKSuB0!9wn3$OUR@oD!^fNzQPb*vu;DHmHQz9Y|PuDs$ zcUqZkf*_1cO@HiYND&0UAq||awncQ%M}E<_qM)F_XyLct84`xg!v1NU>h*New9srv z_8Fg3(d-qD$kVq!0t@SKdQj>-$$_)gql3S3kMBLA2j(=-dwpp4bjJ&;-^Kcd8NB$K zid}&S&me%nn*bQBQA{^m6kcvZU0u(CI_7U#SN6b~!o|S53iIirbnU}!fPm(E+?^ge z*qzVo`sf3DIP3)Wd<c&V*IVwiJ@9EbfijZyqELW~OWhE9#5xs2Llln6m}N9@^AaGo zSaHJGY|}+@A^?w}0B3aH^o5}X4Rkynmfs)OjU(Lf9gDi+H+)i-kdW{MC>%DM$;ZBn zPOql|4{Q_^B{Ld3rjXABWvA0$M=fSb{IDN+N*4o3njQA#|1x$Egy?hy1}r0b=-*I& z1djs13LEC@GVg7++)^zxqM9Z=+{?U-M-cGoTFmdij)j8c-1ExB%n+<QwM%=(6roSq z`%hFYt1K-wRnRq=o`K=Jb`XC*mdi=3=n3<1Ew%}1ferA()jB;}cHAOjVwmc6?WlHd zQZbrTjc=3snbER~0A5ftaqF-@#(*AA!?@Pwf<#KLjFtjC_^so`x}ZJ&V^M6~-tJi| z%lWE)fJo#n28o1x&Q-|a4|>#b|3~3@GyCI^-}<+#m(X@M5Tsll!h;JsHPwdLkC(5T zI{P<X-fs~Ih+@(p*72<;J@fNxSgsqLIdc9xB}`n;Jz?PBV5fk8{!U2!V;vAaNC(GB zn{4u-3<yfe?G%KabNs!X`KGX$<MXQIk~GKsXJo{GL6?n5reo*@>c@{Cef|9yhsgo@ zlppi$wg)h#=!l6w03?ELhDtsVg6bpJ_qy6zVG9e3+;;xihAsY}p1bWBfik8r{NBJo z=$n>3zosS*My=+br?{N9#DIO|^D{;11JhgpEV>8aVdm=E2^qr~v2FgPwEDzN_dS$^ zgyz1*jZ{5Bl<>#)TQJ5{!X&I)RhnGz%=lEty6%<T4Wb4?7>==^5yk-yTimNDa8Ndu z2b34KrD0@5ZZTJ(elTTO-2ofNR%lVkK3XqD)8{EfN@_pietS%VA`K8|DAIN5I`}*! zeX9};bB9rtZKoS`%$UW=d<hDI@3o+n>8UB=NX8S&YYc9S#^r05(t5&DB!OpSaK}xu zdu#U(9$sZ9CD%#lp3t(e*pZD5y;<`(e70E_{bLGB$};&v1r)-?YTd4PoaxPt{2s-5 zHVDEdg4BNeB*9iaHbCWyLy;V$-$+M`plP#ClYhvY3D{a<VD~TX2A0w3X+0Ijh{5CH z9PeHrFhUsiK3QV_Vm?)%m~*(ZGn{a+)KGq?^7wo;E>PG`{oU03Bin_sZs39W*G(Z* z@z4y|xbX91PIEW1UA<KJIZ6F%v#%&sC6(pPRRp(Y78bNPb`&_{>6YQ!#($FaAFux% z+6Xz@zdpOYUzYPiK65OLP-Gd#K8weGmJ7K;&Q~<Ea@9)m0r?)z(&~YV$VcJqJ7efb zIKNXUiF~{A+W|6LE{Y^zH)N~`%csBeRmV(yi&-GU1%Gnj7;g`AvL&hl!13#!xd%Hm zO~1$4|D)+D!{TU~Z9+C=aR~0PxVyWP;O_43?(UZ0?iSoNxLa`7;DO)-=ML}p-2eM* zPxthksycP5suLJG8HjKJ#5$DDGRT4EI95eW<EmBK5hLFzek`I4hJy3vOmTT#Pq2a) zrRztC6BQ0;D>PWZB<k~`!?|GmIolQK)L!$2%o0A`N9{!FQnhM=%gf6`sos{z{FK<+ zfn71n6h`;Itq13Ss=LZl=GezstD~M+6H1Dglj(IdOKJW08_PL=+CLCY5^SoWYh4h$ z#f*jEYn&%i9M)<)S6z`%K>!I|VON)ZDaPX+OqT%zAvgtgCPkXMhQ7I>9SAxdGfa(0 zH{Ka@4;R-!HZx2`8%$=zW6da4BR^JwaYR-@J&8%7*9k0EE9C5xmhXu2QI?S(unHA` ztwS-O4aWmMx?VU2N!sXipFOs5!!r6JSIJz)uQWdvR5gULL-_Ma1IUXy7;VL#ISmTS z)Af1Lve^=piY-@eHr}`c?VsKnE*k08X;&2V;2^uRjm~4H0VW;{x6NP)mG6y8tBj~F z<E9hoWR*0IyWFlP>ZKSNj4#0`RLA*81zG$J_-d2cb3+Rq6o5mG1q0<1Dks`GNEaiz zav4Ph*Jo`dO6oeZ`d>o48=M#{2xmqyz6d);V_~gw4cI2s%kaR7z;2QHh)iMw)^Kl9 z1uJRys$gQ`%UsqBePuj8&jwS>$j87g^J$25Ca1!v!spOX%Hs+f<cOP)o?^pLH0y-? z;&fNk=k(~%q6sFJLa13`iUbPPF5hS2(CBmSh)hO<^GJJ<?YueK7dppt5J`dQX(NF9 zJ6k<LmZ`xB6*_{Nt0Gj;QM`Nx$`N?{dU|>z=JT{N^6joRBc-1QQ_K0r8BvWuov)GT zG|GKNa?=!FsSgYAmm4uSf(YW%4n?3h-pm_3&?rAnPW%*lASIm1dSr||ix$3~P86Y& zhPJ~x{mT5!?4v>5oSdGghjK`6j;72rj!jKT986|8?2o50N6-tyhlEMA-#<P|Wuu<@ zI?xLr2fN8);RoL8w8I$X+OD^K!<5aC7G`q=Tu}8E`@CaiW=heGv~n0DiCudO4iT2| zVDFV(niXcN9Jw@RF>1QpWj&leX)Me97j2EdwXT12m#!2-)4&;M;zh-3Dp)JMHH+|W z^ND&XLtY&867GixI<`Gl0M`2_ken|qS)5nQ{u*v{Z@8;t9A^)a(3j)HHI4hZ&Krm# zPY-3gtKeQOV-@s1w<0tRSzCSvZfY<VpXX~)7?CHk-dYsN59IBHow3$)umwkw0r^8C zpU#TW0H$Zc8F`0eKtRCpSRm={rr)bdj#aghbZ8nS_W6=g9Qw$FB29?{5v*9XMm=<X zu)iq{0PusG9UiEio;SkoR4>IaK^J2TU9`d@uate#CnQ)zA&YYLjdq*5%&;Lt)zqsC zDgwm(#rD%D<!d?r3;{2;PeOmV1-n$CK6@KZQwYYyAk`*UK;LVG6VMdB#fV?PONu(x zQ!D5<FNv(Wi_d$2Lm}PkL>>tfRU;ylrl(!s)D(KI9)a8*27ET;uyS_Gbw$4zWq{R* z;TeP$8Q{?-$RpLGR<uYYV*7z8hz2_#eQ}@-QX<7_#6BMU)SE#j%>J<~vbf}nHmVF3 zOYahjI=b0X;sPV8RYWG6&{D0-p9Nv!#GQ0=$dFtOrzHz5hPF?`kaV=vmoEwGd}5Qi zrn8f3vmM1he!KYj2Fw-qvc9yfL@mB0Z-0yG-zn8^D;6X>!0JJlz3na!uU;q9NHuhI zQUv?`9<jb9l=s1J65IhXlq0|={=G90^{wP9)(60CPxb|o<dSm@6eMC4qW5AU6L4+6 zM>R(7%_v?DHandwQ&Qyr9utG0*<c><{sVNP1>wX^^o@G3Eo{&i_on_@B0a!!iwSOL z*D?`vLEA2DcRlUJH^j%Vj@fyM>;wr(Sy<fBP>ZOHzaE7BOArZVcvAxCgT4xHU5s39 zA1W3Uj@2Ed0BFy_4UH=-V&bHvjspDR7Xp+NkE_25dYHwLII3<EO8h6NR<33B`{&0? z`OyD5VP+9Cnyx@CadG~!_7Txg2LQIVrTs2!L-$Qx0Hj(Bz#V6&2x?MMVF=q+03yqW zfD6ee3{MI5l(%C$(BF`X1WInw9ettcc97CD%^0wt81eD`o7FlD-*<RZ-z;cY_m4`= zynvX-OEj|>?DrqUwrs6IP0v@~1HKL!zU5u>h!_oSacdgBy>8lRV3`VyjNILRjnCud zq5br>03{SlI=hfp<<2lPHFeYgm=Y?WMr*Og?rJmgS5lHOkT19dv=)E07+F&M`lA4> z;ITNm3;w*-3jFswl5<87G)mOg??y|0Yp~v%z=~Rw=zQD&gm+chi|;`LoD-ussJP>f zAVEpRh6>4NixjSpHhU=(BZsd9>B(L0?FSH$CKr!^?e9TxQl_X;@Gx#bU;Dz2>aUL; zG$Sj(GJ+w<rKXw)-w(Rf^4OwH>VSu6Skvy<A=IZ$t<MCWB9{V`Sy^$Or-sXSI=TAB zIj}=zsQJbPx0s*)PsJrJ7~>B%K+B8%Y7W4}<&o?JpN}}qzbKct4Z=ds*%bD*7)^XX zD(oIb3+@rsJXx7|FPGyrl-njLe?{SPzNAIW=8W=!8BxUNqoILgwNgf^%wQ9onzS*n zHC1(ix{!?&@2+cOBOmt^LBSgCWkhv5Cc8{ENjUgVvcd?3B%&`ghGA}K^;kpf{gxmv ze;458ps-YT8AiPn(M$;kHBx4AcelD19^FbKgDQ3q;Jq8wy!9`mJ%gn<j*uMNvYh|L z7~~w{pF4u-d=G4cX<V1bjbKDW<7<mqg%KGMvg0-Qb19`qpYOB&*@!W6(z~*0TBasl zzH7H?1J=vB+-QGo6y#PD$WU~K0rB|}k{`*TI3=%Ti~i_RkNI>Ve*%3f5jQ;nCjDl2 zc3%mK7l+Vgs!z>1mwQVqRx%WA%n5Rhlk;Gz8OE?|^$yy%7=v5aEwTQh63h~ke@swf z$aiitr2U&Mu>pj>!Gj+@VYKQV;a`_C2{0g$7Z)e}WMxoi2YFkz7-&8}m}K-90A76V z49dAc(<jU+ys~Q-kDf~sWT$@w7`}Hw#^H1tte=3s=#jL^shNRf0#%}-%6OXWHvS<~ za@5SBJXisvqTSO)&;&WWUCb%0OO3`xsXpHKu)T_k@EGP8<2A@j7soVU0Vn8nJx%}Q z0&$f{dk-$I7M~qXTLSLj<5)!dQYB26cISbjm_H6LIVy+s=1l2`1lm+y7mz)PT#OJV z`uw*ZW5DIo1BpH}D*&gqO+@54`to4M!#kpNJAylvLYaD&Fned#N1(2r`g@VAI*Buu zfe|Vxz(2}M20lmq@=6`s3u_bycvZ=|?V-3Z5ut%JV+LE`T~pKExtTg;MN@Jz;?uu6 z>Iw#iG@raum1&M|J{z%5qy^pm3F$IcUs~-e`l2NI@YrLvK<k|OVqJE-E7T^^9UU(4 zlML#=o^!y{Ej(X*RQ!H_*5rF8yuBXx_;F{^kG-HRiHzURir%`i5)P@w&-KccbK})A z&G~i+)2=(QKqzt`f`{f)01n$9!{L?#YBQz}dSdLM%W*wDE$$o}-P@)Y@Yn%Q9oqfc zt$}l?>Z~WLm~K>a7jq0<Tayu}!v&fi`K^uCA;eP2-Nl1Jcw|g=>kUWYaBWaS&<I<6 z1`x|8ySUv_$;_8MwSH~*#C>*LKn{(;@*xcrn*HkWLk8DfwRxr<t%HvwR~uBv!cucw z5|;?)A7Dv<fgRM`br++Kbv0e1OD9dh14cMT%L&U8CMB-DfGJfQ`!IhPqUI?Mty-}f zf>R}n#n;kYxZT-L+TXt(^dpKyoAO&QE{Qw==$O?y)R!cOeoDC@g9NwFT0;^%`3uw1 z_CZ1ri|I>(f@CbbgraEwGa)x(oG9Yn`}Ao{L#KRx7n>EVEVIeb))<*2IDEf97_u*S zA1)(CoR(&)3!g&*Zmg!VhYNl>(5M-XJ>3rj?6*^a__vf3-E)L+dof%&Io?iNzVh`F zSVTTwcpeN|f3A>WzE0nuT@59wM5$obSDEbS;CQX`lV2zWzE27+5dt^i-DqtkI@*~x zl<(~(z?8TFhvD)k4`*&BLHfBXb}K$u8Ls%MQj4X&HrJ;si1?iueaFNJ<ayf)?gvqu z+dIZ_CE|RcCTO42zG=okGKAx2uvdho$;DMLe>k069s?spiDvA_kV2t03VZ82gIR56 zQFI;!Y@HobB=ncDOs)Q|^%yWiw;W*x&@prfwrZ6KRj+;}3y*2%3H5&AT1#hRn7^BW zk0hI#Z`5f=_Iv_4*4I-${dyl0?lbN61ai4Ee45aI;&I3~)}G*X6vfYOaXe8c4O<TY z3$Ydm2=;Zo;LyipNUnx{x-%MEYyD;$l<XZE>hmD^+^*|~(2R&DIE2lzb+tAQfo$+P zBe!GH2iwTVNpG~Y4!is<^#nc4bh_8Mo|bQ>x&d$v<VAmA%KqMcsf-Q{fDlEeBk&+W zxNn6>zme^IcR9C=ec|KINAZ|#$ne`z@&0$932RjWFlxN4w(_5DtlCK^C@?9W7$7V( zxK)#g?nW<(hB5Wsx%!!%?g$n~*rF3TaSO)sjaKuZCia0aCCjsFpO>-C4135Hgn)2P z>9l8-pzmNXKybC{8o$a(?>BN&pyKEt<0>9O!20$!dT>yQ8d^XWoSqmsK`&K7yG<)9 zxu%4n`<BgWMviW2u^h(A%*^=vA}uu|@=({k_+{>VNlg!N4n38_pTc2DSX6jnSyggc za~-*}rW(?|vKCj1-_Ur)@_oV|)&3$??9E1W7)cpe8W4}1d*uYmM~!GTbuX-o;E;6~ zZ<ojgP?j-XbiHn=H|yrvuuo)%4A+}&KVOqNXT0V+pLS6x+5fXd_UyVR*W}ktlq8Lk zw0Obd6f|s2ciE+6VZjhq7NC%!EHo9GEq++ebbE8$@HQ?OY<1d)C9xQxdO6#iZvcrR zHwCtIZ?_`bc8I6zjy>nfYFS&&pRF$y%N=UmXVU;M%3{$!ucP8yT)Vxl7x{fPh<R>v z>rSKyEj=JBDcni%YubWfo32cZ&OkX8M+c~l4TjJc6&4ZG(FJulA(HJk`<zecfe~T) zq9aI%cDGGCz|Odguriu7BpliRMrD_pTetbFy614GN&24rskS$`v26LKa0|@c<x~Cv z_xc=Vq~}ZJQCV!g8hb1&8!{M%Vzo0}{WB0uOgl%J-1+<Z=sfKr(^#;qYJI60^Jf%B z9u66Cv)?{;0}e~_f-`AxKkCx+ATDw+;kuqLw(c$$>giNZP`t+(0m19N*_`#F?lI5Z z(NIgB1FEGw;>^<KYy1Q2D~x(AUWxDBdzUs>GP@OynIgX&UrosK;p6S9IlpzwzWvR` z<#t~@25!`s40eZgRyOJf9>$`Y^fPboYl?Sg<6ug>06$-MLau*KZs>?13Z)G2Ka51- z>;8r3tVAv3+RAi1&#*RLG&=UtAGMuF0tOPZ__|rM{yqz-_n%+o_i(YF9%o{P&JFRr zMtaY;4D{Nq?<qd<NaOH<v;Wddk`??}O1t9pKJIXri@cxB7HwZZ(k(7qA_?hX+rD^N z+V{d+wA~Odcxe1J{o|v@iQ~o9CT>FFw@{9KnSJ4<bdFwd+^6XDKwy+heoD0b6LSPD zZr_QdHJ+-{1~SJpB$v5~HloM=;V&N&Iyo6Pj$a%eag2xIy<-cTT^@no!Q2<?f*Q$b zOPAy5beqnRv7}Hh;${@jLZVwAtPt#l(-j#$v-Jjx@J??ST{*sxzYISM|6+df^?M0m z5#8OMD`g_D&?M7QiaC44z*g>qgD>~r^V>$-3z$DS3>q4FH*3p*q^Q1Q1-C6<&7Td4 zOE<SFkxdF0c%apd#vl>5luMZO`?HA2RaS;2WVKM-*m^`5uso688`Z1*=E(}qLy!p^ z@x3@IOIKt(nk69TH)pRv2d_YsxSL#L(J8~B1I6@S(@~+-x`R^ZXN^non~t-X&(I6^ zV~f+xT3*sVj^+vXy<=>4(~4!Uvm7}ouu5k<`(a%XjG|Z$IbCc>ld&NM1`D>Uai@>5 z1+o)3cU$vm$80Lky^k1Zc+~UCsF+@N?%RJmNwr&1@(F0*f8tb4rgGTOp0M^p?A9Yh z#l^|TCnkuZrENqMJKqr=;s>C}O$F3jT}%~jg#0jm4>&;g2?xKY{%B?c%8#fNFIFgG zi8%d(*B1(eOouI^ajD!D^ba$?e_t%d2e#=>ovi2#8#Q_Mx|7D|t;ZZkdnnPTwkeno z?0Z}xZ@WQHh{IDP_ca$uT{PS7Y{GoZW;|`|e<vjQS!z2JQdq|wq7>QWb&=6>)Q*Xt z?SqkJI{EFv_U@tA?E-Rn*GLq%=~yOrmBX3erzb_gjDpB@#fUCmq~;OEuN64<XR%=5 zaQg7-0XMy`$ViC#(usqa=*unt?z9z?A~sBgm_K7pEd5_L#v<Kqd6f^S2?GWoV?gEa zli@)3OD?$$yI#?b{$7LGe(?JzOUaxnBo#46jt#`P!T6s#jJ~_?EGjHt;HF|lyb#Wk zE%U4)Q=Wh4<%(wGHdABL*|hUuIjlE}v2{~l3N1??l-z%s{=!31z2AQ-6D3lVXuF+_ zL_qeipC66~_^n~D`sVtg2dl~9@o{mY5d8-NemWgD7gteXLuTKHT@|Vm1uPrC=Vp=9 zdsH}0R4NUvQ8O>g>+a7|pwf_?AZiKy-ik#7jn3nUopNo36?yhh4S7fApPiozk>EY# z5J0R5g$}!Ej>JeRUt~r<Jzgs*yE*i*@VH{&+~V%}?IGX%b!N__JtgR`i4szCvmSc+ zw?TtuizTevkX79QsbtC!#*F&GrfU9yn@gx7`e0aT(Rdgc-u)lnkt3_e8hiY~L}YZc z1&^DBTtFhjLRZe5fXgGIdV8Djo>)CO?DH3^#h&re@?RZ4c-#zM+s`C@PAyI+>vI^K zv*fOW{68eLd+(eU<xF^}i3|3CEA(#36hEV)Mf)3+zf8N0IXv&<Umvew%u)%Q7}y+D zTNR#*OnBF(RnrM!pm>*d7_3}54Kt#OC!0%QOb`c^bMMpXQY&0BxZCn}XkieRv)iHY zF<2a>K8~y3xnqhhbiB^zw0Q79*^2hPPL9n+VJW?ZA~Tx{l5@{F3hG6SC(?&vmhQ^5 z8wIVxveg(dz@%~bR$8EUWp`&k+6c?PmCTYc8P5DlmK-&_087*2RNk}oNCsn4n&Cl4 zxPsRPLcLv4LmvURz$Fo}a;DuV2Kg?tYGDY>*>sjtiG#%z`5K0GxG2}_ot!{V)^U(U z)7JB&zFdWetxQH)dp#9AB%0SGEMkC(j=VTtsKk(;m8`&gKQB;T;->#IBE8L8cwde$ zlp6#U`|3~iOsVr_$BS62S^fm4d${@Y52>N_S1=@wmYS09;os)=^dQ_aT7JuAMC~vU zl77^5!LP^p#W@h68<l`93lo>=Y}5y##!dHMMDX6PA13zh)Z@S%8*OaInwXtKo@f!x zrXb@OLF+mE6LqEYN7aQ$oIJ;pN!?yK8uqUhkpQRT9v^8HF+%0O_k2dotA8~zHXqQT zlYchQ+?5>K^=}lutSRkw&C2-NM|v<PC=21I?-`l)Pgl5{*N(5uzkYi71t`PGc*S!1 z-SnLSk>LA!ia7C<+mD;*`(2G_BZ&g+e~uImSMppEEFNRCdp7^L6`0IItKU75-rTTd z_(T-$qBZb2rzx-OX9z5OWkw+Ug&+q{<Np3f_V6c9k?w^J6r&PMQNtsdaOyR6z@+m% z$Tc3W-BSn0HdDg{n4o1-MkkskHt(&~5YMv~Xqxt?r{SS|X`FzNeny;MThVFTsYT+a zOfXTvGQxb(3HoI;gd(y*tKcRrzYNzW8H@r;GM>mwNDXlCLX%6))uM4}jPOo}fEKOg zFY@CKyP-jYt5cscgiwKPL`wpC|BlUSYb`ggT<f{a(BR~C<I$Yky=IP3NIFJqe==bg zRjk;m!8)S9#$Gf>;FA=D?IO>9q`<h;^Yh3sB?Ncd6blSrr2|J2!It=zRZ~WQdOzfY z;@;-WFjX!N*$@lyKd1INzhNFhH4)d16zb&p0xjLw)<|mi9gCv(-QpQ%FmChT?v>Hc zo4z&gOs@mkI9a3jU&!dl;E4^8EjWa_7#wFo24VVN(P*Rfp6WC&HR(K@VsGt_c*9=y zyUrKXK8O6I7FEPjsMmdzZhM({WJt&}(=x8o4@09(@F{&+Vfh_eR_%8+<oCJH*ulfz zY*MEOX>75;<F}`~&tKykJpNw{P;8b91Mv=`x5e?~xP7!)FIO*90)oWN6E*YN644R0 zDUttlBlE`rSR5_kun8nnU^Os@F%n||08n0NwfQ%i$L!46Mp85b5`!J<;X2$zDExq) zNSNdmMa4a)tTDJqR01VoSkj`Cxc^$cOG55Q{VJzV&pVc;KXNH4nyF_zRkHC+HK8O* zcNQJXJ&}Wa1!vTvUBYGZtEPlX^EeRy8iskRc7~KXxrXxE1<LBNZg>7zEZ|v@%Z7v~ zR8SO4szEqCzV%YHVnahUmQmhi(7_2C!HYnW15x5RpjH>30$WNMJ!mZYS4@6w?(JE* zeRUa9wgitpSYAU|GY&69Qlwc?LOK7XQIL{|XXe1Skk%4K{@#JlXt@K?YF<Vuk6Hg! zhW%o_DtsyHb2}@bD0IxQ=_@2nHv?75zS69WD-%rY`)?bH%9x3k89GYfF)30<YwJJ` z6C;g;`=?eD;tOWr@YOtK-zR6axaGEglnZtOl$8{hze8`&G%4YkBT65YsG!EaUv9Pl zJGjYc5I-~cjUbXr9WM-64gLVOf7fZ${?X0uXi#3^yd<fTticrJT(xLlUB*j8)9xCI zcxhE$7Eix_WWD9uMV}qN`uyjSK`V4t;1%Tbu(M{d4|J>LhuUXnKdw~c<^No!pn&z& z`QfGw{b@#rFB>c(Y@4TBt&8<=k9l0XBN*=omea)uK|>@-e{2(VV|egA5`)I8m6j=7 zV;pL8DdOVMy(eT6AP{ncFkRrNU8nS1oc-*%PkKcLBux-Pj~~DIcSyhA4i~PNEbLM# z?PZAR!S_R7rnkxypE}T}qNVlWKZxjmd33EQz=VFQa}{g`lMW6U&PLj~w8K>EQh~vC z3tWck@bGOK;iLt{VKghOR^b7=GEPN~tmVbb?xLxNhK|(S%~l~po{zbqQQvn1v|0_C z(PEb(_kT*?8y71tkP}m3zj~eVfQyHwC=a9=DJ(gX0#v$UDK>msx5N%xr51^>NUc2D zwhKZ&_Uo)%Desa_$zjut<hRk^K4eF;D-3J0!WkN$NP1X3dpYOkFE^_6-Oc(Vn@?B4 zao_lE-LMi(J3}I^;aLJEf0#`XC;hZ`nq`2Z@OyY~7BT&+%z#8XH{BG;>Qjn$Bn>Wm z_h8=#C3ZUnBpo5vhceL;J-n#A^Wx`~`jW)@`QJ%u)B7V(<RwzL3sM6`GKZKiOI<ID z2PF|}^nTp`9%D9YP|Aj8|8SHpLsTB&3k(-ss45g2NTj;@2mAoxj>lvhDovrQRMAtD zb^cQ0ziUA@r>jpXRPds~x|TTc<x%C#P%@#21O9FsDlS(g?}-=#c&j?s?oLbJufbvn z?Sr-Xy`anxPvcvYFO}pNN%p5VIi|;@+#?!KHf=baFEe+uzDiAXzZkuU`IoA#ij-5C ziYc&^lXn>O(vV-y?aO!x<1<rLN%Z$`pHBG&QCe4~>5(sCye_wdIc}xz6k-2XmO_8X zyxPZ9y!)-CY*wkzsToogfm&NK%!b-HrCjL{#I1bi$#}frtmbk7Jm0UpAtUqkT646- z_u<8;D8?qKKF$EWH=@)d(*@Qpw(k+i@rF-0yIBhe0^*J9JEjwLdHtvHB|kx%xu=C@ zq+kl0!<nMe#ZHMlHmJqQzUe8rov~HqO5eDTNZ*9rkXZ^!oyZSQLNF)O;cNf&pQPfs zN{oK_BX<&2-oaRVxIL8;A4VgVzgsONRx5_e<<Q&xdG28#!A~-%;U$6-muOxG)tDTW zs$*v1xrgD_J^xuxzz64&lHM0>UeU>JUEGR2=NL6W^*VaoW=%2&a=sDm4?$k)+9O<R z9XT0s>{y17D#Uw8;|kz)wl^d>P9ow7NF_cf)D*^x2<0$5R5pSe|B8wljl|I;d`pid z7Y*6$EWkXmu0+A~L&|W&7sBZT&66LicUmC15^~1`bb1#C&aJpd8ZJ3)JSiSyaM|BB zeVk_Z*roeXta8l_;YR!v`}iA-UN@Qh<fH`&dN{n%7}&40IO{u52@;&@k;^r3IxAlu zf9INzWN_<b&q%)(!|_f%iB5PaZFcEv<De)_RdFggce+@y#OuqaT09IaI$SD0n&UN% z7G#>==FFy|e5?r)t`@VVpr=OoMs8=pyEGQY0=>&g(Gh{@%h8I`(#G7Se_FSnCSU8n z!m22rn&_1vdeUi!a|2^{F=gB@RAX?%NJq6$H@e6_eEP;Q0fqAZeK-UPS)s3DH85q{ zr)wdd-gt{`EX<$lIq#*|DC|;ZU*j!lLJeY`QLOP@R@}8$mMS}EZW5y2@BbDqKu{c) zTZ37M$K>!276H}6B(UT62+DJ~`K}N)4tl^)zru%z+`_}n>s8|u7`cp)5H4Sx%XH6) zvtb@LfGsVK!9}c24w1U=ry$+FiSrXxbw$i3U;%&dd?-D*2mt24u)1>d9;1<cpRQJJ zTh&nwU0$hS#3R}luze6CqT+>rjm9Q{VG4B|Xec{xEK-`Da`V~#*pPMI;LLTsq)<k$ z!QZ+4c^A($JG=i-@?Y}gs&uCRUxtqGQ--c+9_4!JV2W6>W6wuTq@6w`BclW~lvwFV z1GfsboXeqOb33i00}BU-bDslz(Ywblp{YxP!Q2Z+GaqHb$-73nhp2tzbZZ=uQ`ak~ zI`HrSdRO<Y^d*wW{<q@0*n3;rnJN6iIRA4|zUFhK-F?NXrJYtqT@8;0SeU4OF=}|a zaPji*#0xdL6NVQ5F#TR=dLf3nh8A-hG=FsiMGxf0;{W}~jc>%N_dZ3ujQyyOh2qQ0 z)zNj!N@XXrTOC6pVsGAMD^}$c=8KHQb|c2gNky?P2%Jzrs(J+i%=FavzV>nyWG<bq zYanKLFyTAzi~E(@A%SG2HQbINtINJ^f%CX}Rzn<!JS{qX_+8*R+N+0yG_()e=K&dJ z*naNzs8E+arT2r_Qa*7bt6_q43qJM0D34Nh7Fn&VBMUF+<gnF3Y~;^rL}3xzCP`nr z5N$#Q^7;BXCdBsB*jEbG;&<<ph?OhTVSq-a2&tAKaH{OG`2?EE*1YK9wqOabcE}i< z$i+Pee+rPfby#Q=!5z=M=Bz>;c$L_sPr2L`eSa$34^Jg2DT*o`m*d?Ph=t7}uZZ6S z!F7;GB08U28(`${i%(G}%Q$vG)xb7YD{Y#06H>bYQ`l7s3l5|&c}(Ip<UB-|w=Yfo z;AtWW<~4?t{2<2G`&+4rNg!e1e}C^`$v)JJc^{2Ji3>F`jCJK|FDhY1v9uv)jA`eI z`dMjvNBcU?ds+2h`YlNjBe<KDu~hGy2I!#1Kmnyo?dr9*m>%Pf5o<<~Lgr-0<)?fn zVdsbH5iSn9f}R@EHm6O`OFz$AoVBx#Yv%1;@;9GHfHp^gn}sb8rZf645)9zfS-829 zeKeD<g(yaqhO!Fy`u4<@`vnhrW*xDqNs;DdRxkGXD_FrF6gh&`Y8d>^w0b~>Dn<}t zRKZ$=D;$5AM|E>hb4AuZdZ2%;Z~8Z8t?4uIU4vC%2t(XrBV`9aNiHWS_G~@;59SB7 z5)K;cR4_=9${z@VPcLt@T2fLWA+ihhPQqP(@fmZ&<cLir`{o3>6qkA04X+b1lL{Cu zsA>A7y{C6HO+zo9$QAfgKcYB+g%N?tF#O0hg~&<C#^H@5NE#9k%8l38w3%@5gP}4K z4%;(yD$UoeCkL;2#U)aC{Qnh2U6RCSV#U$<`AH-maP8>@o4sWbAt>jiv&cb%vPy}6 z>zK#;v%G$<eIzwCp*|+Bs{>B`{9V99qSMytA*siZc0{p8Lq~^qaIkofo8LQj8@{Tl zkt==Gp6ODQ_4B9b?UnyE!`KtudMXRzbTicBGP`00(x39oPzYM?1qZnlXdeSk;OnOX z1CfQLz5jEHxWJr>Ju?gcB6!nR(RU+IawtCkE!vt(qq#fSd=8J1@+KupPTp7VJV97m z;>|Vn-6bV>lZy{Ph}2y;s-FlVE@}sK4`hK=^g#rn{*<(Iu+lVTBa@7eS&{e9{ex6T z1a(z!`y_&5Y{*3xvx7~!$@>PA{4cFr6hD1TO}N%&$N`Vfp=f+b+M`^6Jci+Gk@kLw zI}}N-J;+v<D~zOlkp}Oh>YEsPG)l09Ut~JpX7N&%W7MOL<$r1n_ZEc>c#QP72Z#}r z!Nql7{}(%7%qu>986iu<%Z&I5Nw0eaK_XsARB+GcFI#5KPP5t=Pu2k-r;-qS@<SU4 z_-Csba323BawzCMP-+rzN&L%f2{dOlQ||pe#yJ@{u>$2?xA}=)m}hZMJ9TSdvn_G{ z2<XSQUk25AE@K<#i4woaehGVB{&Q#dECkw&ENAW5pTG$~5lOm9uA1ro9Rd`v5^?i_ z+817W)B&vpU{h>Cp)#o-)#6t6vhAW#P0UhtWMq3d)J6$@8b@=)nV5ohV+D;QK9%jO ze=6tNmmEwp&);9V!8KSq`V*#eT@ba<VPWHab&sb*J7L8P6)Cv2`$E^^xg8C0HX#EN zpMo4<UN$q7ak|8$D>|M&T4D-ZJLt^W3Dn*nZ})Bz#lE&YmVFl=m2C)Tc}4PZPr+PS zTN^4it0h?F6<<`*F@17Ry}=&h>0(!K<>UTAT+kL=NKT=DwYf=>f&FdI)k=d<Ja-hi z)Yd4<VX9Nr<Pm#R9C#z3nyaZyp(;wt|7x_Oq24<|{vwMKK%{HyqgcWhMJ%zgH8}k) z$l0y=Bb_j9Rm<pgywkTk2b6v|%WXuX#D4%HTW=Ki{Te)F1N=9yT@LI%XX`H{C%riP z_hD5vIdpjkE+Bkr_!nV$2MZ7jC&C7BH#GqSE-AXdYja)VKKM-i@YMXIDBb7}2jTZ{ zzORj`h|oSS(@y7>>w=$XuD(V40}Tu@F+(bU_y*>V0^R!F#4jEw=Er+MRnOwdZf(<( z--`^Iu2<OBB;B1SAO)RPv_ScFKX^$?JvWKyk|?O6v9q%<!rq>Ov~a6I4_UQpIWBbx z6!gpf+#gY$(XT>ixL24FYS6#iVKb)1m#P~})CBu~lG5`dJ`mli3yVIC3rRXHLj4{w zF(*3e58Qrt72sA;V!q)pYF=dierjV`S%bK%D}9wVI@^%!&UtOro~GL3cYa?x9PS32 z{69ACKH}YnDB&&m@S6yJ*qsCw?|{=dBn)_8P@Jpkv-f<O1Z;wj`Sa>o@X>3TAq>|0 z5Rxrh8y&&j?ZaSC_Jz+l5M?IjV|qmVR)4=m{QPvIW#|}1o-^^g>t{0rO>vA^V1Nn8 zwfYrR!L3C*hIkDw85n8e3L2F4!*05j9jp>h+e;}jaHZxa7_$SVV8a6vQbs6riSE&H z>2fae4kLUjZH0No(tY*rdt7Cw6XdE-5~Xc1J5G~Medl-Qf5nMu;6}iQ9|AIj4jhaZ zxqYlByxy+nI3UF^jU2h!NJ>*JQj!2(cvge6x8pQpU;bA&Eq62$eQ)qwi8qrS^B_0M zkNnx^bR!Rsd*k2`qvkVg>rI;uwixZq(~J3U8urx}-M?6W^7MaZfoc;HME0q;KSebz zVmV5-Mc!Azes4m&wR;?!AUCCyJoB#+IId(NKT_S>E45t&lOpVZa?$RQna`CYGz+np zL+Pu_U$mm+2io1f+du7!K`uGv$=HU<g%7racnn^y3d#*>HiA$XsX>!jYjIZ;NLWeZ zw6t&P7kVJlZW2Gs`;DL`i2s#bs!w|B=9}NUI!7lLFg^p2i$#5}M9sXA8C~0y$gvR8 zVN^{1QDumkO6>${9&fef2J2~RBc6<tu!9dhi<|X(k!=OqTk3g6@mtO9zo{{nq=WzA z2`!Xv)?=>D;>&>Ucdrs_gnG9R48-JoGJpTY-57z&;RDjy*_EB7cVoB;OkHR!^tSQa zeJF4q5i|Q%VkE9LohqpP&n<NbbNpEAshf8Au-+F4>c1}d*;8;1QyQBPzg=HW<U_7I z7*^}QHh8_Nb%}Ls<G!$n;#=!?Uqho(j6jJY{s?=K=yP~Z!OcMhn)ku|%4PdY$FGP) zkgpoAQ>HS6flP7#l#O~mMf)qF43}WCq)ZWnZEov)4e`GLdY`?=Ct~#8v2JNuoaq@2 z?J5NJaGIbXn&vlje)djk7>q>(6@!mom~ND%qpk1MwXcpC0<8zr7GuLBx3iTX_#v^) zQq<A8VPHniEI+x#YTkOd9gwGo3;LRJO4Gvq<SZgx@7s`}iN_)|^Z!;S34pM^HPAZk z5o3IuE?VZ~Yl2!+=yGGCvA0iJ9}V>$)wUQ~fWOtv@kh2HO6A&Z;GVT!i}R9m6NJS= z8=`v*i4tIQ=nr?tx?5~ug#ubYS}5$rgPyr2gmFHzGNu-Xd)nC3<y`)Q5C0j*(MbQs zO1|vO3rmfX5z`J}bJB*U+TG*Pbsq8>DC<P}LK`*vq7Iv}zTBt@VdX`|rt%ZD`W5T; zV6|$eT32-X^qe#L^ysQAO>@@^CX!q*sE))>XyG(4-K047Mqk$nTKcq2vdyfpXzN$3 z9|}4~KA2Yh3$S#lHi-9_wLiCZmfB5$L{p|IG_B=R6axstPtq4|`w5Uk0d%5^%_%7) zZgO(czLpk@Ib4*2&0!~|IKd=fz3x$N31ZsO(QGW0B95t#QU8FEg+j>#<w4~u+4V#o zess`dY-q|>%>~A2)O{yCUi7lsqh_!Fr~H%AT{vKqu>ur{evP-Iwq4^ZL?&F~L9F_s zVFY*Yf7Pk(iF9xD3YT*&WT&EQDKeQ)_p8w;IGyyDNvYRb=2%<Cei>Ei5h##w?mNNm z`=L*<5%`8kmkACY%#Pm+qR<EDCbQrhEErvAb6Y1z$KTR7D2}IwwZB{6WT;s0Z9v>N z*r6CUaJ=U$i;4F1|E-*O4z7<y5)o9!vJwwXE#+F6nEz-BG*LG(+1u(Z(pqY`p`5(a z^IQ7teTo7e&tQWh33c`9r~Ek%#u9+iXciE5-R+T}HvBt{y5G3p(_cZv%T0ZPkq|^H zVT-tk;X~@q3piYyP#+}Z#3npr(4zt?5bDRie7WO4EH|{Hr>W8gtyNYQ$%_%fs#M4n z66C``;%aKtPXydCUaJIXAJdIgJpKuI_;Igz(fmXDqGCAVb@VA9^X_!G<He<nquTUT zaHD>N(aA$Q{d>lDgsy^i6zAB!LMa3Yk}(J^yc>1u1&Q4iY4nN`0ZIec6g!dSiW$|P z@-$7g;^+Lt_^-eYqtnBZ4<5tHbW~IbCC@=bma!pXYXD_qMh4NhGm9bonI48?JNj&- z7-4^@2puZu>k2<pJudF+>6k{w;`B$b)yyeev#W}ggPvRaGTWrMB*la7Kj^;{?@s(V z#LIUEsPgW?r^Ys^FzadWc2VTs>9Ko)a5$IxGSt!AflI~nP(+?y%7x*4gV=P&9r7GD ziQ5@FnCtJB0eyGUcMvV4oSc9{Ne1P?T7|<Lq$ei3)~Yy3#Xa6%$4zS~>#q@0QW)iN zJ#*cA6vXLwDLCD;_Ew@FDb~F_fl5L?p-}N6?68b$D*Z11@Ib3+lt)V=j}03zN6NLe zl`(~8*}&3HNMUgw4foQYwVkAq-2CRwtK46>_UgVIy?5MD90Ko(zQ&BlqbJoxr8&Wk z@_7-=S7=H8A=`)wIUC%Ql=)hbc;oS=&}6g);jmf->52?uH-AP?)V&SGM)g-dhuJ=Y z4)UjB@?b65nF4G%(WQK2!?kqgn@_?{Fu0eyT5kI?hYAI^A2YZW!0)+|)ocQyMhfU? zkQ#2eq`ssQsHjViNaNbej>+$xV<{rLIto$zb+5$fWA9~R(*v|B2BgW5t@R>?71txP z!Wp&Lr8<uB)OUrB1ZcWqe&9JsTq@>XbOh8dHd;C|AyC2)T{%~iSv4WMoj{quw)=r0 ziu%Kmbc3Zr*OJxR2pH=F)cvwsf`<*iqmrQuq^iuwhxu1_LGN5v;f>OF)Ec`nffh{M zqVLb{3U8bC20<f}7}0%XVUFY>^?Li9;a>$HQtD{$wVa$9NIxT?lrKH_PB1Z1zv$K} zJ6Uth<4H+N({U$w!9xf5snG@&hzO;Y^?(Ng8KH_qiGHtK4R^W~Bo>TuRcNxQyCW8# z58hwf6cP#Cs{Zo8+i0xHgu8r;V;D_A+3EFI`xqY?a$_{&B8Ta{`lS8)Kt$*sqVBdT zkYD}N0hX~5@?vW0GbtF;b@fij?o^<RX8gVp7VVcj>N5$k+j8CY&lwAp89L>Vy9@1S z;&=}$6h}i@wX}D|t_1(!lrV!CO$tkPz}RLedED&qKcq!A-cXDn#6PGWS6s$pTcOX` zPY31gJrBQdv0HvzFP&7!y^M8nbQRM1^NDQ;(p$EV#Y9~NN%yiHj1U~#cL7|H<v}W5 zsY*#uUGGm(*E{;oL)*X8kG=-Sfpw?`%~gh*`$?V&Asm1jCZJp_*WrijA-}!!ysf2w zJ5?{E5ft(V?@KiLZy{x6%1#wQ-%+_|;>wE(3za5nf2eofzO&t&maz@9WO%8-0d;7h z#=J;K7wEB>U(urr5m9(@F)<!5BA1(<I(IR;yl=N~RV9}tSc=S0YdMh+`%5=v0)od6 zu>C+F@qGawK}R}ktOWe_Mx9^qE})A<bF;JXQ9R^J^E2S^!n33s@XC*zPBpPyPq<+= zKkQYb1JYIZR03rE-_l6ASIH*AL=?U}%+-E6#awN8*8BTTz?wD|8HeY{)Y6?$T+2yA z$YoOZ9yY+s1ULs0im9OQQC`dBBlZmt_<HGwo%Zf2z0l@36=rA<9%Vvf5?F;)b)dMZ z>DzF=wUxHD&_pfz>xqadhTk${sFwx`_Npga|2HI4Wn-A^G4LTMU~QLWxaFx>cA;uG zpImi86cGZeB$t>xGBF|4&7`M|$f=uP;_=p#1`7)+IdO)`AbI;4apseBBqI>G0C*8M zB-QGrIKsqQfIM((9DhRuK~e!~w*p>U|EPBzF`{?|m$%(35rdtrH$jA*EHcC^b?Jlt zg1+M5nMqvN(#kX`8d$qbnUJy!srZeUn0{Sq>8ymo@rJ?k=-TM$?gHe}FKG84BB*mR zpbjrpIMQGQl_k$h=uysVn#dtY6wXc#0qyfa=|*|P3QP4<gt*O@8M-<<cJNkiM{{^* zbm@lh`E}9E5<~(V=oY>O(ZW)wPH@bV;(coc-G4IW5*PzsB<ydObPM8hLf&M@-%!qv z*FK%L-7<Li2UbxI8V!PoU_Hx!sLvmpngT#f2t<~9Te%xLbJ#qtm!DOuHp1GK{Qy02 zu5hlzVzT?6n-Z0hrxCC+7t}r1zxaKDs?mRyhoQx?2qS_3Iy8MGeg6f<ZCh%iKC#~m zT_^qEt!5${`B1=;*>cgYyks50N^1ZM0AfRRq-?xGi$i@mwxP^l>+>JyBTN(;PS&)w zKeG)r5e{8^SKG}c|C37sdbqX@;?SiU&YGUa=%6J5oT^r;m*JLc&)UW4d?mEvDz1iH zMmE@EK3zE8Ak@butdKieQs9N6iR<rNMd=$@sI(~MnME><*HNBqlaaquI5g7ru>8*i z?8UeM0DNOzQ552Ib%lcNg87J)-8ahiNMpyM`{fo4f4GWK{nOZ67jAhI3!5etwV5ET zM_^1?M9E9;GFv9BOoZ@DPD3Io-dYn*t%5<_uec;Y9q;e|J>!$OZ2Aw7id0d7A&{zp zM)glTPTLaF1gB1~F7F#hM|c`#Q3A2h%nXae${F<n;Mi&9O#>#t7&IE(y%m68t51MA zPm5~K+oBCVtao>A1<~)3I!*l)trQ?+Z2WE-tPR(nhyR-7$PP>b#Cq=o`BmuR1t``u zb0AoA8<EW8zFjVG?`s{PT|TH|^@-(TD6D#Y7h1?tN6#8pVH>)1_zexj5<WQX{~TeU z`#QY_Ni;Tfb={x+P@^UEljkT=hC3R;Tudb~inlXhorytU?)-OyeO_&x?6ibXqn{b} z6saPkQbB}q2B7N@!NnJn>4uoNpG_PsKIkT?_;Kw~NgQ@KYcl!)@SommF?VYwm{qXM z<5|fL<f@$7dVhY4FimKD5(e0Ylxxn-KBAo4&c4g>Q5RGp@T9;&ylt{~u6Zvu)GIot z4NUJ<hJs4tz#uyKJMdL~<UED($8<!8nUjH`g3@Pp$Tjq>t!}^*?}OaHe?8z315m#2 z19pFQYj-9^5I6}%N5>k*t%{#D`#uO*0pziWhg-YSY(v`er!O2k6(@L^d~P2AUZCf` zTML?&FUm9;JXf|CdDfNwiAD-ebZG7SC{=1kMqa&~6Km;#K{R#kcqrfkAu?A@iT&j> z>5ONsts{1fk6?7dWmr$hJfY15>b@2kps`l)4Lz{li;>8$4<i1~)+#lJZ%9&0G$2p( z<2e6pI5XSeu;ug-vL&9h-}!eD@2Wz#8=5qn_wQOnPj;uTaXh{f5p{*53X#5zO$1@` zq?nAH8mYWSNF|Rf+Denl4`}m)`BHg8pw&>3Fp)sYT4nL@REG>HVN`quo=UleBcAd8 zOnQgeR9~UzdjvP>U7IpS7gyC}ym^x>AdnNumF?R<<Z%2pJyIzZfNqvr+2->}q9E}x z>}v|rccuy(p@v&JDm&?T_XZbd<*3ZeZ?Q%c^nl8v)*<59mtP;`9MFwPC=kYO>|Io3 zVmRCMd$@=hZl%(dj$_2jRHrjnzV+4x=-&EOn26(uvrf26SXWc{iwN4RouL7Y(-f0( zs%KlF6T!0{kC!1K{R6%NJah#miGC@#;dBLQBkK{T+}$%l${}?5z901Dc+;lay)SbU zCdlW-(@>CZ#J8qxP+7&597dxCYZ;5r=d0n@dodX)yfvXlk>fDu`v1KEa@~*^!sVCO zchh7fC8-qrym+kcoXy3v*)S)0Xi&(0`akM22LRT$c^GyR`Y6Bv=$oC&%?5FdPg729 z>zs3Ap#KV>b++c^tH6yhuxYIKSwLg`qNv_-puVc`WnZau1<u!Zi+3v@DQL|TkCqP3 zGPboP|1B=`C^V+syE@@R_DBD5J0fGUFw~8b`g|fEO|bmILs{(tAa7bwF_fqycmQfT zdE!r!B`uO7Ie=_tBb1NtTVe7>LAhv}8NZ~soTd!koDgrq7BqYK7YWxCLw2OMj#@x1 zLhx6Vn4EhY+Dcf<Ue*1T!H(p7c$WE?2iikw;cwrROP;7mK;<akbyzN=@8wGkF%4Cf z8>7dqGx<@2+5R9x?o<oQGX$^$s73VGQnTG%kCDSMMPJOSx4-^6Wj<YRQJ`~%oTZgn zG%`>8?zxm8;<;2~9%YaJU12U+@zluB9$I|MHsW<li(dSfOh)!gG{yd4l4Nuo-J>CI z5a1w<hWP)Guz}BD{Gsi%$NMEAbU8U3d;$xXa^<6vX`8*ke(vfj?1qWif;^UG9yt7a ze*$d1>4L-aFH-@JyrO2C=vSAV7Ogg;?B~PL`PFl{7FGIf%NB*atJ{gKou}MHkyebI zFXFNO=g(>dcy&auT2C0Q7kJrv*|?T}m-Q~Q(^6L?XRGyK-zc{|jmS4rL=YRr{O>wU z)?+N?Z`yk#wL$}o%x{ql3{J8MwE`PJFa%HuIwLF#y&JlfvHGn%?su8WPP8OJ%guA$ z=K;FN<_GKGoS&~14Q>FR2x|ae5swE@;pUr7FgP5vrL)R;1MYRxka*P2!00-*;i*Y> zO?-Hvb4zymUA_$Akg~9^JB20Wzt5{0!`u4E6ydjDYTz%$avzP1ezlnJ+*7N|PM}$& z!c<^n^M#?k1gTCAiFeK7a4liZ;gLX)SX3rzGqp3jkfRYYVu`lAYkWWMu44y0g6DoH zeb{8k`UD5Z;!;^R3MEm)-ej$d3Gmv~R$p|7;!%bRQl#f;<8x2~D{Ab}lo;E}Z6h>d z=mA?22dmUBrM2<X0sB)^WmWm92cfv21322})~}|~t2?%m^W9f@_1e&7B#uA_D*m4! z^_JCN$o5Tjfz72{`^S-*IDmIca%PAbLRGasJU0~TI+aKtmu2I^Ji6c8x8Ay>X_6Eo zcV+4_T`tB4*7S+o7<hI=Pio|?F0cb#j*yrd(tk-nt%ub>`B5gW5&E;}+ujTL{Hgvn z6|9l~)lo`PS}b7DiFQ}SG>*r<GC@5EcXz7t!TUOf0;cBB2i+?5G$ytuRNl0jdADRX z8p}%)Fr<?JX{KASpIZ9td_p>pr`3t1z@%L=6n~cY%|z?rh;~Gux>UtA+A=AkgJ_*q z3zw#W^mm2EckUVJK%a$RI@Wc69g`oh=~#v=`N>Xp9FF;mL>x@g+y{QnQT}OBi_g7t zF-0+uv$g&WnX!bDzSq9C`EWHe5Io%bGkTxtCMkiw&!d8c3Ka$zNeL1E7_=GVSGx_( zA@ZvW82F%sPaZ?oRB?dYoR8V%N(Z0OL@<z7@N}z)%D~Ug3&QBSMe}sEqMN5iC0Oq- zoTEmWneEfapT~5WYQYxx&+&<P!sWV1iPpm=neFcHg~ebS>K%W^{&Ja_X?=&k9P;Bp z4mXXQmYzi49So1n@d1!nvGDf53ql5POraj#pco+ReCzLQKSb%984%Co{Skj-`!N`e zVU%}vzSp?rbcycvP%^zS)tLvOzc04e3pGsub_+t=aZJ^c!CFP<@kf-?gaF;9g8W$0 zo&^d7yM%GYVn;&bi0v^FixV(@i7`Fb`bEgVGNb8RzJr3n`FaPQ#u1(@^%>99$`R~) zFEh31?92SBWR3?HbemK<B$$D+RIGxoh`|a$C0K<Mz%;kD@w@lsq-6!Myr^9e&f~Rv zW{u%sT|KL$pP*(R##ns+^rcnz<zQ6zM+NgmU0q##G>eLXrNUerPRJ)G7D14*hp~sn zaO~5E<>~ftn*?kVggx0b`Q6ag1AFFQ`(Gh@dwV;*Wg?t@$NqWY!;V0+_#i=+{E@R> z)_bxI1~FVyinEP@$gK>rz&=dpAb+i!V{^GdAY`|nE#-0zEA4MS;iQ_!pPiWOpeD)X z0TKLJM11wC^=I8;o~OQIFay59WcfLM)O$0R@Bsx@a&Vb-FilPNC{Y0!s8+)D8oFF2 zSv}yRM>#zTqf4odeCo>2um%}nZ+LH@)L7H;8-4R$Bldd@;$LoeqH{KDimKcy#mtfH z<BCp>=PS$gxsrsoz~GdbIW#&lRWZzlnNqIg%y0Dbc#nVV^a=|d%)?{tJ}^|1fVdm1 zqT@ER=qm|?8L(oNYgE(d`<<O!1fL%W%;l#(Bx8J}^=n%STcpK>l0H#j@3`hqmvkBD z`-IFj>`kpFpQY=(OLF-1C6m8J<Sf7T9Z=OtqW^_qe@NB~dq1&nq|zOP1`s-u{BUiN z@ua@1Do?)^E;b%+UC)WnfWxY3Arw!N8COlA-|SsM2;0WA@7&2ahmH0pKmk_QDOWKy zHT_DP_isyzD<O2P9JTT%<K*#dTvUA)aTK-I@}<*G0%|jM>xEZB#`yO2pnHLg&AL80 ztP&4Ga=)C+*X|daAIOBL7SYEw<I#diMDkr<tgZ>ze}27XUXVevOSJ(b4Q-r*jXM3H zshSIl$T}ia6p%gUYOCl+C>2+X40mds7O^Wd{Dz74O!Ke;>L6SCc68V#5N$?crjJ@w zXp5<uI@JDj@T>~pjEpK|cR{b53{Qeq2dxoGph78fY0LBpoZ9L}Ln&>ei%gB@y@wb3 zSJ&<-vKBhp9})R*#g8<->0-KP^io6dB6L~oGWl6jm&F!cL@@qmW3IfIf>Q;FPr0VJ zDSK>AM{pOA(*vOg0TalFVFIcJGGZ{4x44pe?Ky1t$eD<63VeZ@YxoA}8$N|BNs$&6 zdMK`o)p*o)lvbE#8aD&o2_hgtaw@nTqnx_pQb8&wt_d6acRBn#-U^zS5UvM|1q)S> z;{kIUi!{6eFGer&P2?gp%{}FQW!Xt`WRkt`(U7&yePv00g30XK-YMkyjn_tV^1Ctx zv0HNoK8LlcW=^k3V>C#EJDvwgozG@qH8i-E_Ox6YM@LDGu|H|a|4josS<7$Y+g8Pz zWKQ&bgeu?JxYs}#CKry&O#LukQyMSPH$I;Mc<uUz^YSxylM_TIo0oCI4Q6cE0bwLt z3hnQq`4r-#p3f6Tf0n!VNw2*S+Jb&7dUyOEPw(K^#}jT3H~yrtZ6}S@G&UOBXd2tL zZQHhO+i09LHX0}Ie($}%cmIN!-I<;9oaf9r^*MnorZ!f_(Hx}8aks<iri=K1`P)$T zyZ4jf^Ce5=urLCFpJ%?t%+!>B8W+`B`Q=il1{u>YQ?-5yq>!*<VWOsS<@)2(hU5}D z9-hpd-Aiy2DlHu=vI(akg=A;v@^4OtMTF75VMb2suHpTQP>=lFbPy$omLVWJAY+#r z$FEuEb)dt6h(cJNc5{u1EcKs=xS<ktNGi{1nAyROKwkI(0a<|bQoX&s-Q^oX<%<hZ zwKjqhAb5jEmiXBfQXBh4WTQ<&H;=8{&j^|uhO_Y=S19L_WwzFnmWREXu~-(DdT#m^ zg~EH5{rU3}IWM|j04+GZq=QvDG%Z>S4BX7j?E3C5!P}nN#&WkmXg(-%LMe1LAdEQi zB{TI0Cx!XD22;~bJaOn(xW506q=~j5DKB#Ln#b6inY>^VouU0}>MyHIWPzmftk(wm zI|a3h2ToXYbd6Mo(#USDS{hQ=q4Gncq2DdHoHI|OvlPi0?A3nIkbrxStPoRCCGZ#} z17W(t=H@(skCTC`>=`YDzCRwgM+t&SUl0gq!Qc+D4&t;CzXpA3{H+TQ?_bK!W+*+` zg_lFZ5<M)`X|)9do>tcz()fe~I9{p<EJm@cA5O%#;{Yq9bc~xr4F`r6&Ok#g%`2{` zjco+TnC-ZBTI+rFtuSJI10n#5&D&4cblwG&U>-iQZ}6qoz?mp3hEY#YU21%wR&kOY zkeY6W3t@C1$Aw_IjVaU9)1!q%XOHC2{R3j%WR|9KScHkQc#No!J}GdFWVHT?Uc6iw zn42?X>0NI}wjS$C?l<!po?NIYrJ3o~{{UKQLohb{WC%=)nnn~qYdYu%FAqe?gk=Kx zesGPm9x#9VCe6|xNaFndG7xoRFc55TFd8@5jvd41QyjFsnP9?0m+@n<OE0xOgZzFo z6$I2>#y>s@*t0uE<5eO34z0Kg9CCIsG=!KP)|fhcDq2KD^wrc`e_4Clg)cWZB>{vu z(Ct|Q_8`{*Nt^QpqG}DV?}GOvlM24I{TaaRgE(sl#P^MPXKOWPgiik+{@#7++m6dl z234H?J6`*A8w*f1jfI!PWxpSE(VL`zXu@5hjVRGH0%KXM-=lRpSp=8CUCQ6aSpm^0 zwYIhO=@#UA4!O*}f3>r-1C_AQmgfK#VZ<aPd5d@}<tlK1%Vjeg-`$JnZ6;KbI|EW8 zGx$B{(uOd4vA5q>B`v8rnE#`gaOkGWnZcnz_XIcSryS;ewu#_i9Fvy;j#TsnIkSJ{ zi`cp0;2J4Zhpej^N=>Y)RQWHhQU7E60d;}=<BcB=%IL&I(HpZ;ll{oQPyfY4*L!bE z!f!Nz3QO^*q$t?6qV0zViZE4w5X7A<o>?DZ8D}4V9`!8^Wq0Q)Rn=z=t5irkeU|Sz zOpX%P*46a`hG78{DU1saDhTZ6i@qHl9rrZRL3NaTI-_JYGnDoNfmG5)zGZx@tgLk3 zmg#Cb{V8SAi8*hGS^W9RuiZO+J&~E39758Llxd}T<rQgfbn*XLec+A3N()ftbW8${ z6#6QgxQ4}D@D36Fj@VNcp4#ZZgxQ#$Z%<VqsVL3vM;~jsmT=Fc+6?)ACzfeK&w0N- z>kaAoT=ivLtE+JOjAMfdp4#2c=3Jj%f5*={lSn7rc&D#tQJS+Eolx{n%l+(jdjIZU zLzpB%gv)sq<{s59KUIyd-O)%CmGPLb*9sLh_!qR)qBkknK-pBJX@u7zZ=l~FpmhV} z_k0)VHvxR0hLC2DoATdO3~I}~2iw@Y@aI3!y#PzP6dqgLg$Uls(NO_+_x2a@SM7s< zGWgnh*S_%0bCN8;XKtj`Za+3BBb=>A0SRX;B{AGL%>zk&F&hSr^~Rr+NR2VGZ|q$w z=_||`y&=%^u!_<Z=Bn&yY)M66MJPO&o>mXo(tK+DdWHShKQ-fLIvi=tpO%6;>wSZB z-d@LU+?W7TMA2z=<tHQBr(-{cu42g_Ip6PL;?WFe>;8y*RdXa}TvH|Af(xn2qFZky zDl`7gbJYSnhoUySYy$r`ojrj<_kX&d=-E`}Nf)bLxMMV#Xo~Yu&Ol}%&_R)qmR4p( zOJ-~4c{f(3QouGXCvtcpC}!zbhEC1Ho|?YzKTD9~i(8y*f52Q~HDt7KyKLJyQZ5J$ z@b6zVBv)BbM71*=@d*u!<zJ}SxS~IM{PO=eaU#d-Ibjt2fpb2dJpxxxW6Z4|J|B6$ zIDbTcj^ACk&y=rDUJCy5wzvQBj{v@x(dUwUMm)Q&Z0J_?i{HkE<)DaeP{L0g{D1F$ z{U`)G3tsWR1H+6Mvp2=ipZ#j<90bKQQI}4~#oopEOgHjv@?uAR9yt@g{c~ek7VB+r zKKm;1J5@=~^}`MxZ$qP8#rgOcDi95grUjsO%{P&^tZ+$Vv8@5S(bsqw+Jo^<x4YS5 z8N7p{C$jhXv#)dMOW%;djjJ!Nu!^gxWO|&~kwaWQ)Uu0Q5y|vzL6KP>ES48p@UjfT z7@-KPRor(F6z+QAJta#Po+Stb=W}aoQ2wLBqSEPE84*8IgsvY?yINhj7M~J-h0#U& zUQ=iCyp<fFpdAo$QuEY#9ogAB*%az>vvbLkJ|P>@S6NaFOsq9^zqFt3+|TvIAp;&0 zPW__^N*?Y){H6W3)ACjI6(YU^7rP*MQX36~+w>~H5f|{DbAQr@(!SX0;x3j>13xe# zUGgFKx`ktc+W2Q*VfxDm0WOBBl<DEO8A9KxtLGKv24c73CA%9bS+33hb-JPEzP}_7 zssA$>kUo<o2#Xpx)oN*UkJ?|Hn@1&}&g<qzadVaL4mRDZ5Ri7{S;FV`Lr5eVh(c*~ zm_Skk_bT#aHt>AFtM|1Z`<jh~@uM7BTrgof?+kLBzoM$0+-q2Dvv+O5qUb}G_iMKV zI<Ed8l`zcn&Jb4t1wx``MI}#*9Cm$v7vNB<7;50Q9J_!YhxZ8BCJG1Y8*e|OYM^u+ z6cV20lR-{qYV}qgO4CZ~AO``LL$kgr)y&RW1GIOp7Ua4U-j^ELE~k#LNmXDT`@!M1 z!;ZJK^o9L-ZhM0uO?I?gcDLbn#mm%|0f^wv`^ayZ-`#L}82<Qq43dw?w1Eakg5*K@ z8YKJUpM$s?QS`20b6r;s=*`EPAYuje^{Z8W38~0p#$-%WkuCO_^{PT<1Ck@#gi!&= zi~_mG5^C~#-MqG8&-tMeoGmRL6~$duQ}k%U9@EKF<+O8-WmW7uSENwwn*YrB#{aS3 zM;TA1f)NoB9TY*4@Y;6gMNHh{fWRpaF%vyF{Jp<QIMz3uJl^bPwPGII5Tn*(M+%%E zWAoW@Xm3~~Su@4NBkK=Tro!yDWVF~Oo3CNpSBSEYcv8Dm!l1aRD-oudavi+4;^0Rw ziP-tPp@;Be-@aGSu8|HfNTNTI##CD5;KavK{F|PX7`}n%A>-zTa4Pk6gafqoBIA_9 zVm<p6ahd2!2b%0ktga|1p_vl==^WKzHf5@5VPUZOqZ8*HITlG6Z8sE-Y{lzF{^S&F zZ0JNjZ+5T+i7T6V!Z4GWTnQ47_HoY1;j$(sG)R!kts4M+xXcJt1S_JNWR#@9xsjES zrSm@vQC{W$iPmb$FMc;5;TaEYNcDI;ULQT+4QbEWq#)GAHjx=tRz%R@uJV*}QS$ui zc+Bpr@9}z|Bfhe>1s%lhQhXIMDWob;)nRNj=a!~7RDQzHzTPIsAtmU5ol%?PVMaN{ z#&bew5e6rQXYYk%=Si0s&I~Gwa;G=sx3y~qAb`W}`EM$>)E2v{dX~-k?9D&9-a0N% zFE76~+ntQk>5lsHqccDzjYU{yYjHg!XB=ohMxVXUggDXMZ_E#wYjc^J!nop4{sLlB z2oR5#I@X_?^hkjslAQ$)kY@9ls@WNh5edg+c-w-%(1(%F3#mEr*!ol^J_TtE!+!^$ zF~_?-A5kQ~>bZ!7sX|P!Ild1IIBBASYqyBS8EbN<w#-s)sQ+AlMe&7#5|Vr`puqI{ z{EH8&ku%qX2IPU|U#jTThHm8U{es$X_+F05XnX8B?6Ej+m;Q6`zCT|>drr%f;N~0{ zZ8Erd2=XoKq6*@W4JtGAkqmrlrGB!0ib!=(dZ0kPngAt+`j(~90PWkjHSC`vr3Y}9 zsY$+5x3Th>;d42C`(h97KfaP8abkT}>TEOZ*N-G0zjVro);}WbK_x%3E+UPUV?>oc zM)0z`I2F|k+`2Cinq5BLa)DOfVvvc^ocf__x_Rj*Ue)S!u=@C+r8L)O$Xc$F9Cgtl zOG3de9BqCoO=Ymk$D7CBH8wK@*bh23$J8-wl&jEnUiZV1d-MHGiz@JJfHYJI`pfYJ za+24*zjN7>R{BC@XyeY7YX|ZznyD@lYy%fl5W??8S-G7PD`{Dv@IK_fX)FyDlD}a) zHU(C+pKz2gE^YmebOLY}rnB>@%%IlWfU@|>h+Ydx1dq{1VuUY<3Vk@q8SP=vKkTL3 zVWtdqsO#TDXD5CpPa`~yNDyP`4U}j%VDwf{j7zpM19d0%Q#8)O;jR}b{#;Ukt4#TN zInAL3og1PNm`OG$X)~zVB5LC>(_!yOX`DU@ZOxV0)hMOL`_fwtCHjZAt&J**LOh6; zT0wwOl8(*P87t7h$X$u0n#)a7D;vJe?FRwghS)JeCZBNMBku7x@q`{O0MVEiDUy== z>o-kAH~wnfu7JOEk2`Ne;Qu;>`ftMWkw>S-gl31jLL*?sTKHx#S*CBPj|2|lii)-Z zentf!&l-8wt&&rTDFE`yd9CGS-2jCSZ|;Xyi<Ez)<WG}cG3yNn3JofH31@wYCD8iw zPu_vze6j$jw9u}o)NW}Pel0d#t7Le4d%ON)W9f(vv-h7FxgP`!>a#f8Ja{&PH3)Dc zG7{^ZtTF_cuZbV?8)qqRb{j5AX)C+1kpf1f`c@_}%u0IxWod3k3>B$Ot4toFRl1^W zsNw~VchKWo{on+ntjk%UJm#uC^1`$n3<_UMG`s%o2$S#sloBQmfp0(qS}i3MQqrMT zUc&<D{+M|Y%lH4-Zgjtk^qCm^ZZy5aK4m+W|0Y5UA-za-CIy|{6qUdxyHKE7V<66E z!CSlfY=45!SIBxe!{GYI^F)dod|D?Z!d#_#Bs5QF_gFswaGWDBna(V`eUCC25R1Y! z0E*4{QXIjBxQtP#iKyLfoPbD5)#lpk!u~~eO3A(A63X4tON7u)0!#S4hDa8X+%^{z z$4hSQ;B=KJDa%w|$fKP^Wly)~TVb)pcSXG0NT)p8A?Ij-Gp24Cnz^F&{_w)vyQEC= zQpnB&L89(m?Z7W#q7A2%(qIzUC81hu&K9k(#((q)h9G-hd=H#kDtcsFU2RA2qo8BO z2>Iv9=r)C)X`ZhXLxW0JfSoGMK9NsWoompLt^8P-3n?52^?P=%$^owP&R9_4T#H1x z;v8~?wqn#u1tU3|*Q5E~QuQ}I*NoR$Rm*>Vh6fvef+j8W#x+!yWsm@Br;*hBJ+0Ju zQ*oX5{)Ga6qgxCq{yJGoTz@CkM83hAtY|>q`hAVb1Jbc3hdZXQGJGk!%*;?2Xe^c< zrovfHP8JeC#f@0e>US7#3gYviK7nYSSjgmkeZvQZGd1Qj=9fi$82hnA(GG}8q8Y>$ zh0xClcxkq!v2{ep1fmI^k~*ziinsurFEUWfTWCn}w(vjlZZ|MNC}0*(1TOZCL)Roa zvFYjIfLnLl9^ANV5a5+;I2ejDIwL8N{+YnCoT##Z1x|^X%=CyY`E0^Ufl|*hZ+F|P zy3szq&3x}9m)Kn6fFKv?TE1gbIqz8W&FjDU#Gm!|*YcCzq7;PdHj_eB^5Ph7j$&I# z1gDi#P?Q*K`!zg0$6S;%0KICdAOXvJ1a0_LT8tn}v`p>OT*DSg^O%(5pE7L`Xdxeg zqudsYmE7<5sGC9S2HQmB1q?JK@jQmc$LzMUd6`W@0Y;8{ho=IKPY$~h!-1vmBTeJ9 z-VR!9H6hU#={qkEXHR<(jI`akk!qzX6_{JzuU3)+lX!5k4k^4%EZv*#DpQMPBseBB z{fpHJ<l>M)?3bI3Lhf!QYJIK_Yh<&{7W}R*mvkPyPG!V^L8AaCDK7*Obn=Il5}G&+ zApWAmF)B}%VVlQd-0Z)aaNZl9s>gFHcY0D<1BLR``zl$?<tmtL5JQW_VJ$Zr=`Gr9 z6d^OYSU>Md<<|VJeRj-&6hHDGv}HcFo|Mtt=Vvq9(vq5VBHy2$-s+n5<jPJ>S51hl z4@Te_>kw`lZ?*-P;ntb=*JfcEBrMCddZ<4wcN4|p1~21uHMx=rl%p~~!XxRfc+J1- znLv(5`2tAdl35~unabMh;I~QNXDXxrbk?`Wbe=dA;6^T>Yx8T!I4TIfdH8H_A<$PK z(7FHe(`LRfG~XWs5<_00)@5#0%aZvYZi4CJYP|Zd$~onPRi!1<^R5Ew`H1{b2?co( z1^0K8U>`LUd4bi<N9V)W(e5nwD;!b}m&?pMXh>K6f6%stG7&;Taq%k6&2eebh#O;L z>RLhv2Gu%+T&fb#3(94mh&p}Vw*zqExh$aB*Wb!iQku7S4r>JUtET+J^AcD7P1gL) zBDQ~h9vFGtJdsdktXf+Uh)XP-Vx{Faz+;Geh_SM>sL&KnQXcV(?jjzXhUV>T$<F=O zfDN0<h!Q`ISy5sC@YB8LKlaP@wvd`vwHg{^S;wH$u74~~s-h6<=h#Dfi{sbUJB5J_ zjw{CTiB)_#`OPO2J4ET#g_twr6OX#KO4;4PV#&(4`h5hM`-EyIB}Xf9%a(#Q7RLDR zYV0Q=PjA>$;4fbG(W^|jxuQHO!|1?ET}_sH`<*kqXc_*G5b4{=|D9s)DIaXNBH;+r zp-9I1lvHNqX6r4CV*J%-&X<FLUx5UP2Lq3L&cBV4$rH@xEAb4h94jI<{PFL`D*cYP zhN3{kSh25}eXiHBFvu!(ahjUx*c_!0l2ubfkvOd7zoh1748%TkE4AC=pVJ&Ze;!ck zq5?rUf)oP2o^2&&YhaqqtY8Ra@u%4_@;z{%Tiz1LVLP-ze}Rl?ues4SYA@Aqd^G(? zgsDjo59mT4b)m7ov%kaxbF||4s}n~9z6vb}h4JL)qt?FGEVO#>b5!hq?t+vt{hm_4 zhy-R*Gru|Edf+<haDC!QDvSx~ysDZWuNJMQM&6?bJ`s`sCKf$uV3)R1=n>SSWYVcD z2;KH%D#r^(IvHFAuX#nQs^_*N{ioVpy|$*2=cPr(<N1U<kxZX(wFj;n1zk6l&Mqv7 zJ2wWOL!~d*dLkq&Fwl#SN=GZbnUeN#FNr#hzbZPKs~B|nwMA_Vd6s;T6=HZgxVk$p zUW1ay!Bt;%n)j8PA-j+^J+C>t+7gli`McdX(jVuX_@x_|=-v)u0lCpPug_n<@e?}- zdS~(Nm<1)IL-iLpEOrqr?A<Bp!)|s#u-`|w+FJ-<(HywV63&ytm5vU6mnxr<I(>BU zSut5D@&^k)O=0J&U{VYO@^^BB6INyP=XE16=ygZxbU1gt2GX(!19qNF#_*DlG?St) z2sZJ{>ba!Z4xC9)V3Jd+BB|~_78@;BQ&e00Yj$7Uyv3C@{)vY=uX5V?nZ)!7vFV&x z9{OoOwUBdjA_?{>Jl&)SyQV%h`WLvlL<^h%z#4S|yrd&=ao<4b`?^!Qz!p{*{{qUc zpm;1Y9(b5Y1gvn6JO8)A&o8hW)<WVdq4EbYMlSQZJU)=D5$;8d#o$fZgwg6eJrcI; zKMqMetAi_iS8ko`<b4>APs|Mg8+Z`X(Ni*(7cVa_5GoM-*7Hr!x?k*I@D6G4?@;t( z#Sh5Ev28e+3PE5d<QZ%i&q~_gUpV8@BJ}>0wqra?{}RhBcm%C-p_?6tt;xAP4MQ~8 z=Vl6b&rMQ14mBf(zwVd3PcZwt?1B=B{6cOF0u%R{$c}SQLMV-$O_%GbmqdR26cprZ zV{Jw-n;}Zc9h;#ji&UF__dl;>6N48Tk?%*IsaDD>Dx%5~GSbc9s187=C}Hv;qU7r{ zBbDp>xkM%q#!t<KfRTJy^a~`N$^-_)5>QV@iim-Fa@3gbU9ZYT1b!_?GI63Bm~ReS zt{-dlwK{s*s4(;$p>lx-vr9AUPg<6~f4awvZdN%z0_zGaG^J`atYXDRMIZ8N9L1Fz zJh3!j3!|W>k<Dy5E7qYk89P->wvRdw24NnT<3eIofakXt@XE!A^X6wJB`5^be#|l6 zk@wGC{Jto^)i*Npm$4`rSd~Dckz24mXss!4Wl-a{&|DOVskWAoks0cAd&^c9?E})W zh6*JUMr*-;Ln6<a2^mepi3=!zO3luY?E!rxZ(LezQXF)S5)85rqoM-kjT2O$z(TUs z?pAk-?>ALzB{zLlzxTFFqOc*o%hF!ZRuY*!A0#2wmf+4qz735Y)w8Qp@T*G=3Cr6z zLw(OI${c9tF-ey(-iGy|d15^R#zPYs8CZ^*j9~Y`MA9hJq>Cd>qow9ehUtH{&XplR z28HETXWRNR%H1H4ZW7?<2X-6ZOvZia!rU?Lg$4r0Ek=-V-*+XI))`#K!}5YNLAu?R z@w3e7pFHO}5LRC<uc&<(YGy*3q-`xgE3OgO_Oyo*zq!QsYav5M@r1v53<$k$z+Avt zSZ1bnirr4yzG34^MhR#<Vd}<~@h*c<F0^05+Mla$gIJ*Db{)jh(9kX^X>aaUdsJoO zWbFs6^uz9sX4F<#^0QqQOBJqfZ-oq;@mc(bBi7X}Gi{OO6HL3&i-UiR9gO;K4;6%d zJ)+s|UlV=SFgMV_>k64$@X;;*3PzZ!f;<Kh;(5Ja^H%Q+WuWwYdCwqwThJlVN+dmx zkRuoYsUs$aNxnIo0QC!<cs$$nZ@<l`v=8*p3`!B~cAv6VBctN_#gWbpOQD1-S<~B& z<aN0u+9Pi^Y#r{V-<n1yjF6~yF0zwKS+9)$13fuleH+RhXy&Fbj*mk%8jP7gSq6d& zh~L9Zz5YhSB7q_7uah^~!Lvnjv+SeoU+pgX5m1j#U}dvz?3oMa7MZxPIoy>uKdadN z0>*B;0u*D+rUxnKTF+k*|8A<F`)LcQT!|0n(%6lh1=Z92==c{<CrQ72|BZsso38_> z%-><cySCoR(+lJw2P;fEFx^|{W}~joPTdq!t{hFY5CBWCu=Ds5C9x45u7<IKu~*{f z#{hkAH3H6pn|h<@2B})94(8zCa6s`Hao)kN>P^ZQPbN<QLS})HnTQU=|4q5b20xk- z(gtdG$29mzsW4>cEBS(QEY~;z1aLu_w%w*rLNrL7Pr2~FhX{{UtNbD-$~OniD$)1Q zb=;6Xpupzh%g^K?+=q>t(4u%1mqjR(Ym&~1(bde6v(NeWp*fv_=iBJ{i73HXaeI%N zUjH13`ucN$uUs1#WCRUbCk~_m3NwgY5wla75gY;Ea&EYb`In)gAOxH)ZA>rVZ9Z3} z#VPc0lN#%bK9{WK&GFy(c|oSw%jErwWW>z$FD)EgG+-rTCmPPi#t+{{O)wzAAMm&b zDvpo^S82(~fPELX8Qzu?I@ZAPf1@81+wQHZRVpf`RIHD-NO5MO6!j8jZM<Oeo14N! zbqlsgY2J4;N0koKZ^T21J}e>!C*aAdwY5g!07^`9z9p4~z6l&BON%|gT6(p^#m0%g z0QGMD&z}i(`UYz`v5y7Qr0WcB8fi%KWWw3{G_k<4DiF6VSU&^<+0HGE!H<C|ZxhJ& zdm@BC?Fid$gnWW_0D4o!kFoF3YPF<$gLrPa`wJ~C%B|be3CG48m+gszy_A?2o01Zx zl~;02%z&P**>3B25|q9i_50$4G2ZT>pW}9f5h)74qj$PHsWOWHi>%B=t@YAx=pl%F z73W}!q_K;YUxTr-2Z?GBbZXUuK+E87bG15_W~VE&rIl6O=Q&$FsanL6%w>uMviu4w z<pHrUaUJ$BkCcpCWJAbD?_J3l=}l~h0wE+d9GQ{fLD4D7j-LhvbC)9p{Dj)4!q}W= zsya$8)o%``%rO`>`oq1peZ07ggfNCK{<t_#;GB$@^%edWHP>0p+d(CUgPlOQ@%wRT zaf!mR^1d-@`tOp}4>lDZD}@(sLqn_a#&P&Dosz^7#!yupIlAOuN}Dxo#07pD-rjsb zNS5m6MA_im*4EbXpA^ve5x@9LlpyUctBc|jNMcea*Nim{q?Eutec*j{QH$5=ewcer zuuqr>2NuKdK3kjS(e`pHiy`a_V~jCSp?(#%z)8%}O`a!QC;JvPPK<o;$VkW=DKfz^ zps(A&clYOL1GBKlwO@Af9)8j`WrHZ9%_B>G<L9WPx=B3rZ2Ut9njPk2es$lH;rGdJ zr(;YVIQHO861gVI1DdKO<48Z&(^o|r$Is2R?5kLy-bh!M>jg^wF}U6yz+y6Jmwtg8 zZ21ik=e57bP!HArZMp@50vF;VY*L0!;?kQ5xp+Nd-q6Q*3wtDniuOI?5|PPdL)z5f z!5|FLIyudu+xB(uq1Zx-%z>}5#=Y~rvURuGe0IP+*&7lL>xcXaAtBu=3F6Z%5L}p^ zZ1T1EWSTRPdW%bo8&AcFlBt}l6y-n0NgdxPp)yT0tJ8q9QD3p9tT;j%LQ#KT3Ne)( zjB03bxY>@QJ8yDD`l$YaV(VfRIE-L1u)R&B)ofWdU8HP&+2(N6-`58Q#aK<snoljE zMDwM!!Cy>Zpb;f+`SS}dboFFR>Yuz;+j}Cx*TE=8Jg_5Gg4ulfloJ}fJQs`I{|26t zoE-MZuPtL*;IL(Y$)~J=LQOqd6YI*_#fXXNnwn+ZWX2!e_HdxU20%vR8FTYfk(NsO zXET_WH*?tbZloAgn*z~_K3X}SPg;f=KA(R#@{X6YnPy2@TtvQw;xoEdhcos9JG@uT zOe~87K$|oeu#lfH5M5Hw2U2FRSpsV_Fn*J4#uT#O_M;$UgPR}Ri!9V*<t^v*eVdt< z9$9J#vHg^7?d91$?1lw%LU6kG@_{x_)$A<8v+;oWul7RRnakVu?jaJFd+FN$=Gn?Z z5}T7V!Pd_*uOwl<3qlnsOPc7+JZH<~uS<KlTC_kc=qrJsx%+jx02BEy8`@HH{blHI zLc%AU?#LUg%j9s)?W>{jw`ISczCk4SU$&qBq_?M5t}yd2DQ%U}eSMYH-ER*__b{MR ziN`5`6u~<4CE7zR*>kA_J{~G5{x+pOae;zh0!b@?0J=zPfMs?8HGRn5a95KOu5(%; z&Ro7RSULfgn3G#5n;CI+Po`UPSKr}?s-;1*UnY(=Y9bp0wjdfBZ0K2I>dE=sT|;KK zIT_gX@49M}<~CX^dC?D(|5<9UM~sNDy|{4X_~mhBYTlESm~&KCg@O)<Nx<E}N)ElS z?LsY?KYEd|@3W~Wqpqg1g$E3g(filrF>Wdh%zuUQ@oJIr@)7`4eI2PZ@<TeS@uUEd zZzdm07(U4qT~o@bbv~_NU|zv6n_psb>V9CO$MMFPBk&vaiK=z1wQaTY{g$ifxFKrR zOF{J&_|ZdgHylS;0rFENDApUAL?|$+J;5=a#U*wDxi;!0UW8hIn{$)jgo(KYX%_sZ zW+xb|8nlQyDYJh#$=M#~Z!<ws+dzGIdmBEl`|#=0^Np82$f>U4O6<jjo_#f8IxoB? zYn|KhgK8k{Z0?b;e<Y=3i2C%gx6Vwb(b29K$nC6kzR(m+BUyL)(_|6CY&eV@+@ak+ zeJnGN3ny|$=OWFHJj>Mh-@z5e<TQt65kt5!GUn4l#?L6n{slQLMYZXyU?dkw;!q0g zxl-}%NARe&N+~xFQw8|bOg7TsDS}72J|$le3yHv0#GHpAG=OxzzxsO0j#JS@mjD$< z|72lV$aM7;aIrCZ^4x^RuGQO(GcuBXu6V#zgV$?x(lz)sFfJ~-<Rrdvw$5oR44(pK zx9B@KgY3igRCrirJkUiM5kt9Zcd~}1`>BNg!x0pMM5G!Bo3E>+rj`QLi5dpkhSV)C zy8))~I+3MB0Gx2y2ltU6B@4~i9xpdgn>QiJ3PUO47t)(Xofa@#TT2>Lo5U3a0Q<~s zNvF4=JQ@<I%vpNk8VUG@1EHTZQ5tD85zO?!3d7s&8<7B9yI+?}1^54z{^<=!)0Vi` zE_K%6!}(KoBpxWMS`tXd)=Nk1lPOSLElIvkvF-+?uQh?6u`C_X-Ho_Hs}!#XI(e_3 z;s3-R8yl1QmDD;3q|1VDY;G!~I$`1TDGmO`e-tZ1kze5?IUrU}O^@A(jlX>&k-gd$ z?5>qoGt&;->x>J-c|i&HM2I5IQpsDT7vTohm1xJmm28LA=2vBmso@d@Xh_p9NiS@E zMZ}688|%@DS<!PIrUruII2e3Z1&?FtO~-ID^g8jEuD)TS4#A?~(nAs1)f_0X*}?10 zm;i*>yH=S1>C{sNyn4hbZ}0#?mtC66I|<;`)zztNW~hGoUvR*@Bvr{w-v0Jr?Fk9| znyZ&c)hyxr85RM$ABu_?8T?xa>ax2zjy$a54x45D>ktNGtkOs|Ca1`3_agTDx3St> zq$jQ@$@TXe#680RjoBhe+0NrGCaIUa3KRI4Xd+DRzu_^k0>7U$lG95IEF={1UIXg6 zf}sdWXu>bgw^H-pkWbsUD^tH<mApt7SbmZa9UR`ig2J~Z+?}d+Pj*9r9MEq%?aFh9 zq3-WM>_=a3?-#ciXR_BVM1|M!EF~GpMaTO*qa`BL2|IY-qnT{v&4!-XTWSS%Fa`S> zb_sWOUV7GYgW`ka@BtoRaqRM0f82aQB<j%(V!bUph!U90s%Z7P<00E+sxg}>y*Me; zSdYkGq{k!uI2RGg)uYD=>?LEnCg#%d7*)i(IPD-ktR{kwvgj`u2&r-YJ7XiL-&Zm) zH#d<6905O$Vn$+=wpsi+Cm{Ts$*C*k{2KtViQ!7M&aJwl(F%|Th~C-RDW96)8`*0| z8v)^>{RWbd&Jg&;N{IV1mDZqu;&;vUT=PVLl^TMOsXf<h;p3-4uk8S=j35szOq2jQ zOv|!<oM+`*5rOf+Qj$6Uj1gPxjKyCQ3m%3yj}W%32jm{x8(zfbnw+%8xJESL-Ck*L z+6J0hjd7<rPUp-SMVy#tliP{my@^O3h64O@!P`k^oG1kExr^SNiXVVDc$V<T56vea zEEpLVm(~YD*;EwBf16Bak8sPx;lqbAlT#k`xGXOx$t^CDxy*i`Jc(LJJ;O1Z*>yPm zLb!1xy)u5=F>843s=l_Ygy|q+1A{bK?izvR(?qahvr)aL@$7gjAmGk<?sUO&vYx2G z%<={g+ju`)y%2K1HYKo5?om`?kp~tc@nc`fo~Vi=y#r~_FAYAco+udpx<AmaOFd-v z+C!w`+<Gm`EkYYbUQKP_b)dc0*KHhKR)PfSTJ8VJ5MHj(^U|qX_4t}T6nScJT*`;= zz_KWwG=e$>PP@x%qOVP1jEIZ%7QWRGp^-3*_W!{&75IlWI6?KUj~v?UBsn!4NNNgR zUZ{rhzd+8!7RSht(l&FR36hY5jl}WgPdd)(x3I(mY_WfWqJ=-{95+V-+ve(37woIF z*73`gSBeVY4ySO2wYz^dj#t}Ou@tR))BQwqJUb6Rn#uVu##G8ELp=(I$Catw=`6Uv zlWO#uasCFaqGp3J+7}&+9RVTVV;Mn{BT!#L2WCwJr`3CxI^PERXUDY~7un95A@X?! zdQtkgn^}@hG>q|5?E@?SGh$1DE3PWLfYv2V4!=jQY;~zGtBj<h^Tp3mZt1P>TL8qQ zB)pKC$1d}AGz<DF`l`Dzou2;V(br0+`a}U&_HUKNt~QaL54)d}&-FFzG_s6<ZX%o? zrik)-nVC*tNXUOg(YR5jL{(i&%Lt$%Np;a^DIxi!kvl^@QFUmM5)>F14TdxY%B7Pr zO`>7Z{e$j{gSOhlt<LgxWG0S^u#W<h*psDl3s^oI8qjrbCA$1p)9LEi+3FK77L1n~ z{<hKER4iI3S!CEeDaqq7F6S9^#`^SpIckld_h&s?vpZtdT&~#>>cxCG92IAR&Fy?> zb_gZOBQ_E*gpwJWPt_N2Cvz>PDi*1s5AwfI(b=u4esi4_oyf-v07WSS&<oo>`#}2N zt)}YV6^;MDD8UDcl5!qG{4Yzw0t@B5Y-LPMgYa%5KS-~~%|sw|Rd|Wf59}hGb#~9U z1O+Q9F6)7#vbZbf;RGqP6HQO1;m&M3SYSRNLt0Myr&bOusj)G7-K)kro0!s3cG1?W zJ2IY7<5+a9??l4{y6IVBr?A*cm$Mm_ftjbYNTI{1Stf#}TePudq)kIuOOHrzuRsc< zk&?p1Fus{tT5jW0Cp8tgqQOZTs|hJp$eH<=MG6q{JJ({PNBjvjZv&sWQtwF+?W;(V zTWuqDnT=v#ekV9teK7bv^Ua0Z{<%kVsa-BTFwv-Yb!~QuvvS$#>44(Ds!CG2yzp?) zjK6Zbvq$Q1FF_gKFZ0|H0FGf$(z-e&ELF_7m2*N647AWz<_alYDIXy$bT65k{h{2Z zw1yKL!apIkgP@?kdw4>e<24JTwuu`H1{R&Mn@(KCOA3BFI$KXdo13g7T%dh@+@Z+F zP?MjI>&)OmVd9t<?%}f<<1?B_1^?UDO<QARXh^mYInnmWWlv;BgQ@c2CGWINfq6Mw z&W>Zg?o2&8BcA$6VejuOwq#Jo@rlRPQ6O{Vy~M$v(`xx&Ma#i)wQ)PwNo2>$a+!6s zi>8d|2cTPn7sJHDflNqw*v9}{x^p(PfMQlfFw+pqtla8q5-s2GpD@oChVYKb95Oq{ z^Kd{9Vp-Pgj?6!X#4l8?qs4=WUE1Q#S2|exnTRik6a3;2yP>8L)y#&#ZNkxCqDhZ& z3_mdhi-IHzvcchDe-@})QawoOweWxdh`h;1VdE#EXNGCDeLyV?Zr&a|TaPagSSHRo zk<IHC$O_{^M*mP2uR&|+u*kkR=W^h<NbEA{8pjU~EG)6flaOhrjE|~ejHg8#p&iv@ z$-%9=5FIa0Hv7}z_F}ZWV|}3D^7u&Y;$*5P9wff%>zx(iQ1O%|CKZZqc)WL<iZ@N3 z+c`Jzgk)jOj#FZRVY6W`9W+a~1pkny1Ye+Z-v<hmZ`ThuQN3NMAx8iHB7}?QDtTZ5 zHDm9|LP?#;4B-%7;V(?bi**d)V0f^v^>LR+Rll|zT)4oCfX(gTKlma{3g`|#lF^A- z29Z{#2^hLqYpR&QWi%TFD-gYCd7_a@asT@??BA2QCNgKdg$AouS^l^QKadb(L>Bj{ z{fQQx^l@zR_vaA_&Wei*D6RN8TWco1Sa!w0dMKz(oo}t9fB#%Bbt|BRuhobP?}RW` zvGmr44}vFJ1S5((>2rq;5hWvMYsW8e#S$fDvNtucKT;&n^LYo_eH|qdO3L<DK<08V zuM;1qH3DFG5Vlc4j=f<P-Ae~hsVA`=CSG}FykSelyguO(Bma=gaI=f<ze;0xFD}me zKaQF)l^dw;)_Dpn5%)qgl=sz5YRKlm^`=L8OjsTvEQJVI%R)~Rd?wS+){T541ywO> zMWT9%ARmh17D~b)v}bC%PDt>7{d$Y@lZ=;wZgeIfC<)?uWL#`Lt49^k3}$KVEUX=5 z_$cP*6YZQfg?^1Z)WPucZEmIvMm!hzAfo977#|D+aJ>X#0ZFyY%uM-MLD_R*69?(< z;P`%O0Jyg!23w~##cncenu{Z86#-|{r48{-=)ltc<5aVu&sQ#m3~cbE-ls!JK8<VE ze$vaHHZ+?mOvviY&!i&yc}Gz?(kJPFCR=;Ca}<(Gc_k$>v*^oF;>f6b$0$qyRNB{6 zasnu#64OK3PH_bjQN7KQ$Kkzi;5X0%DGX-<O&_f{vjeyXM=qPEuRrL`J0YKAc3}an zKs<q)J;*IEE3ObLP9O~{`iuAu1-LmXEE|1?@PaWeO7XIo@e7<buLsD^B?8o=`|m)` zMo2(hE@y*2LyFuta(gkVMTPahePHZ+a&IyQGq;5I5jP;^8McBF3eO$%I>#wr5e?Tt zCw6j8V^|PfjgsDU9~_oOfQKr_He(%kFLnZpd$GM*M#mQVfy0<24tNt#a8##36WG7> z1D)iU0#dPNdz(lx#AXl()C*wvN)XypIwTkY0YRl!3nJ?6F6-ki=E30Y!k3STJ``#M zFa$#_A$XQ}kP_A=O-zpqp2^1_6-_l=wXfh)ygvqtoJtfmU6XkJ`=hcK$fUg;k4=`q zwGgxM6sN20FZ4wB77YFYwRgubGtMuHXj+<c8va^9l|=cI?<l=~Cob}8$v?lKsBd)^ zN;%bzHjhML#_Cf=3@#RE{;rj;Vr*zM42(K7i^cJ3yM+KgY-<Auu-!R3tAM90t3*Jf zlm<l1++Q1h#iH;i7}=FFjKsW>=b3O%oTg{b(8)oL9?{EGL?7H+(xMb|kmwB>_kYgY zZ6LzMmSFg6P4t#Rw`p-CY5$!?%e?r-nhIlVzdq-H6>#&=-t)H+S5GWlz}gyfnrM4e z{Y%6=x<?$_kl6eoYR&U=o9jPvL}T`|6w`eS3}OBEm4w~Z!DzFj3tro>O_lOh_|6tm zl-RF7f#snQXMEiR3vO*~o%%fv`ghPM=sco7(=z%e261e5T1?qQ!1YyHiTZ09L@|7| z7F5G6O(GZ=0tB2yWw6k%<(#yHL}cN>vX;2lJsynK#&^4iQ!pyEnfY|rtW4mYr{RA| z$xffrx`*=@=4wd8CuVFOT!PcOA!UdCUz$>-j^m@)9a;T;O~SRw=~w?8)$|hy#b42f zZ-XYlhM1g+oUQPnv;Sm)0Me<;lG&dM0nV<N6&D+u`07S)H2S0JSAg3UDrh50ZY0!= z6B#9IVx0|k?sD!*tAAjqQAAIdL>rQvT}yZ(_^Z+irB94K%DD%k0Vf0ON}hS`#_A-v zm$)>A8Yf$Yfis_x=zq&Z6vZRt<A^axe`&pE%K)0Mkp;AY$RCy3;T@?`Ct5*j449)0 zj3grY;Uv7~+t?sEOSwIpfB$t!m25+NRm2AR&V{N0GVu@*6*U05r&5L~w0JD$i`1@e zZgC6sBKGF0<h2#!uALEABNC^3fkg%qGIZo-myFNK98)&FH}4Ub1U(aPo|X0hU@(y$ z6@(U2bRcIvA1i?Q-sFQ<&)SeUArGao(4N4F+tH{xd+NEi0*rd?EL3^n)gSx?MgSp) z{sTjhM7yUfU7x{eeMC|L)Y%-OoxLJdqU+Gg<XA?nBJ+1NkAV5#J8AhQalR6!)cv?C z3L*GrM{9q5F)Sj%kHCSDHroo8^W1_0G9WB<NO}yO$j`s=w-M7%d5&1RZS@BWa#gD+ zGCh1Sgi{H9v*Mr$Kb&jJybweFMhYJy$iJwZ&EWsBu%VZ0A@VC0LW*a1C@8K;8~oe~ zemH|GOOx}^K(wlXHfZloHkI(ES9<!@dDos=wfb3Ux}yA_y<6Lw$c!Zfcc0l`uCKsJ zU%^4Vbl^1uRK~0h$Qkd`n~+bsN6JG>kWNi<bX|I4X16pte2n9My+Ep|J`jH1nOHE| z-5|&ni5iMgX4dv(YepRX%434*VqqAH1hZ~1XktKISa<!t34z%30JVp}*--yq4-eHo z*89K&JcIPXjAfeO1FcMsP{mnFFveoV>I*);*4K5II-D5@R<6s^`$fyX`E6umN403W zyCP3U>w!Cyuv(h~N$<|@#43@#9Tvjh^jM;&(yxheOc((f32m^t^#Tqu<uF)a95W*$ z(n5(`%Aa=6ycRMh*K2*pv*jp>bY9Wm&)F8F9bRm3lsU#xFBYGTs2Rg6eq5sfC?XD_ z4(1eOjFgZX<Hey&1w?#$3?YDBC4rqD78r;vypG#n;NAsmwSV#bO7ca0xn6jNL=>!C zimUoy`nFdZ4A1dI3Ol*xLl}&%;xgWabb3#Bk^OsYZzUg41Kwlxb!W44c(Y<?YNA%F zs1}XV8rQ!(Sj|>DDUnlB{yLd23TO7O(WC``I9nMp$?+OqufLQQ_a47ce7zY@0iAQd ze_2r75OFsqxp!K+-p{ARULAt|>D?Okz>T&uFM)^E>@Jkw=YXx3UyLhf9(XRaP)=2_ z9Fk7SqFcB(KjssMU4l#Vbm8%x=kWXg^8!E+?Gl?(Hf(@8pg@{D=+t-)ELRa0Cdgs@ z6OQMnV6Us=l;V+$8nTi3P3X(KfRkV;^o)!-c5JTY*UE1)H>C7vFo@5}1GJt}ZlpVs zt88a$8oT33bgOlSAv`IE7D*6(K=S**@-pUgSxT(a*@S(h{1n6Uf$rnpmG!R$A|&iD zh)onvhD~(o%bX(eziEF&KN>z@wY2y<K#(m#hIvc@=X|v=cw^jb>0D4(j}I08QA}t? z>D2Hv*d}!3-ySfj&@V`n=#4adfmN3iH9l&<R@I0GAd5giJ!RA>F&#IS$D`iw$ER{* zW4?%dWb7Zc5RGF+8CTt}h<SN=;Vc0)TF~JC)81%d%tMtHZ`X?xQ^L_vY5wu7fjI1W z858kw0w17z5qW)vMXzs}8`k+I<QmlxILpnI$~}$wvxH4mBeQkChFIX3i=CePT`zS# zm5HNxfBl)P6^mxt2ZH<2i>T@1`RaoX80_6B1S^zfkn)P<T*{xFBOh@v%xelR@T=(F zc&LKeY8fSaEE=K_x#!)JhDMj1#F<=qNHz*wY`#J?xY`oww0wE3r@bOF!1^Kz2+yt? z&h&_gdmU}LkEYecv%SL+n?@4xROB;M*S<C&u+OQ?i?p)aoTmQvP6CYpOSZqX{ReFi zsXyg2Stv}{RDLAl2?bzC0|)J~QHm+`ykl>7ywUTPvD6L)2wo|V7h5EL2)uFA@*uhC z7x(gZ*wcgSRc=%Xz&*|5`;C(@IY{xlKAI2k^)7HHJQ^m@a>n(FZAOI)c-@N2$P{L- zFRK<Gua{9|^ZP^tO^dIVE>h`Q^76hL8`=j42b~WkK$?4PZ7nrd80zwDmz}LGapE)B zC_H1kLvf%n?O@@WUdT=hM2rM+QSf%Rt<a2fG7I<RU~!*eBI76+zwF1oG4sj&q$fVl zC$bMw%*ZpI+3H6U*^5ha^3)K~V3hA*y;U4jQ!+vubX=4#U5PE-aXNM8C5J7(<>_if zKNj<kKHy7SoyONV@2p2jKxy@*9Q`NDP#EAAmMS5{w#PEqeH`ak@8wm>DbioQ->t1H z3y|Z}k~E#L__~@gFXLi0_eBQp4+#$seg=mXZC3*7^2^f`F*|#c$hBx1#e~)m$75eW zEt=HQA@u6>zeNOzr9GEK&z5*zGxeXnwKk~KIu`7^F`Bfli=QtZ<yy;zrx@C><Glxc zs_KtrO0WxN>HBFGF*hr9uJ~;tsf-Pyxt~}NLiqOH7IbXYCe&4XHKgJKIyKO39vs-H z5eAbBBS?mJzqVBm62772VM_fIl;n3+&;?46;+?KMO}U?H=Zdu$o^H_s&&bD{n*<Fd zNcvee;uJgS+f%m)=z=w|`uvqTUC717n5(tVE(+P{b4v13$Mrxdl*#9%$<)zov)%pm zq{__HR6t27fho+qPM-k?V72<w9F(9mhIBR#5{klQuXTSgH`cU%gFYa~R}o`P8ZXxS zi0aF<$(R452(j{c@1K_~Vw|J5s$|cS?AujBMDnZwR<S}pWgXoP3LX7TW!Y%IEP+>< zxunby&0h))j(UfAaESweW-Af@dhNii)<FGj2Y<)zqgmM6#yYgZi}GJ=NRx^BC2Cdg zXh)1;cm8Fly%RE}q>$^aoc&l4!}V)>L_EW7aD6Il4NS#u*Tk52{O`zCydC=EjnDl| z?f$A#azZAPseOuH=)P+kY}#zJ`b9<p(WR0Q47iSSIU_MdWYpB5MIUaiuC+gKQzhXD z@Q{(eaB^}sTGHU>EdiWFy+A$F9VUyAvDD^nO%ZYIH8q^|fY&u?0rID{t(Z$px=7Er ztRk8ZhrK-M?MP$l7Q5x4+U(}@Mytbe`9Yph7!t+d`7)=Q8`BU)<0F-FU*Gg-LK2u0 zIoVl0{YyR>*})Ttj@UR=a&-nscwA(XlV%b5bgaK(0AnXr%kOeYxwAjxEhcOIykMQ! zYiaHOm1MSeE7&Ya62v6}l<MD|Z`;4RAwk0Em{5KDykPvLs8efNb^ON3&Mc6VZ55l9 z6$QvG!iIZRSJm<Py)&VVf&L1^u9}1d$kWSf_xwDP!)iUzRBidIoSa-FA#XY$mnM4` zv+18#cbqS%{6{-qO_HNM!klw-yfOZTmzRF+B-KYGd9sl5fsMJb1R>bD28!E)*ODJQ zLT+VCOchbzyfT_#B5Q7JQ+qjwzmx$SbzwMGJtiR7kM1kntsNauPs4f?)MJH-`0EZ( z_AUBvCn*2x0%*|q^V#Tax!o9_K)~{l9NC_=92SgKNw`==b)jE`qG|m0?vCkdA8B;# zCn-F9WUN>>2?4J)WxLarnoKC2@%pgHzuqn*;lZIHgXi17;mrBCszpL;Fi3<Vz}4H? z29p_7x{Y=xI4nk8NQzI>?QX9yXQQgz5<lSPCwY4+?x@U0c;>4QZAIDFrn6Q#RA?VX z7P6srZ35wTEdy6Zt+Z&It{e^%Cu(Ox?@7zzy#=3YXJG<5oiwDdF^yE&%UZ9yI;A>p z%X-8&!FvD-na3qGY|S=i!<S0NCa3$~iGL0!6p~Ky7(w<H$xyM`DBVWT7&WRaS^YQj zH|XE-HHUoZk7NJ}rU?_>fRFz2oFS~}@gJgy!ds@)G~!ylyAn+bpy1?$8Hv6es2lKz z&HnIzmear)@nk~F>Tr!XtkyU}ocfPe10?Nz{GV@R>0Yvul6_lU9tK86LEi6D&<k^O zbLV_I?=KI6lI(%Xl(LzlicD|~hH)tOd9l(d8C8iob^9SHcC0_J#9qu@YZ7pR6O=`3 zl8xons6Kn&dj_eDeht3ifjZNs%(t$rqHT`2g~cNdm_K?BVtcFp*1~=3sxv~f(%v|v zu-dDk4F&#^?c@S@Pzd{ogRep&+wj9hXs?NgunXzS$1<`LY;2=LlDdh6fF6lv4l|1n z%a<MRkv2|r16>73Og$>tohye0WKdG`SV~F@Dwy$;lkoUdVCy%Aud!(gfdN(*?%3a5 z;k7r{Vfh5`*gN6w43^4OLc_vPrua&Vigsi8KZpzIi?MlJZDD)%_V?}Xj}=ze*YjO$ z;!&w{g|3F?b|RA_1#E=o)zOtfqfl+B?wouCc`Z2&Y{P00^e1~**5rog`N(2#z~5GN z#;&(e(5Yx@NY{lhdf;?B|N4ltx;~-#7r_%=l8``Druxrs9mwWh`LCr0q0+a1H<K0s z4ck@o{LXCNqx_=Ps<hepZg3|KFxf5~qP8X}(UKnRCOp1w6nm`{#z7QnIKQ=pmjag< zRq2Xze>rSPyZw?jbUJr)=krnBOrCBc4UIH-zK(W8;DttD(g!(+pDcN;EG-T1eCQse zD}oivX1$mv?Bvkw?@ecM=T%f_IZ~am#}M*)h6;xuqToQ{xq5i?ESJC8tW;@<D_SDN zrgS2$x%eo02P94Q+xYZEP;74t^R?xhh|c4=)L6=b1f-2rjsK$SFPH1H*(gFR1TPyt z;AlM0F1Se&lbuZxDPsbvTnp4(gpk3;<B6=+juzX0@^e|gMg0|f>R3D7QOyu^Ap-ym zmuOi*YCW{K|IFWjG$3V+%PAg&jLljPw?(uZ<c5!oA9Njxjd9!US>5d#7hVwZ*;khE zNfLr=JgYd<jRK8?6Jb1k`8PvE(tWASFbwe`-LLqaUcFX8va%ePwX}N;xWzF=iTB-> zcrJ%db`Kc?BM8{-`GNt^#{kW=^o@2z130Xq7#SJS5BY?|dSC6eHCBJlp^yAuX+DWE zKHTb2L<c+V_&a)tGX8#e#+vv$3*J3B{ck;Pp_Uptiz6g_zZI0(##>UC8A?H!iLYD- z5!^iyBghyiPwt#;ooZB$`Cekuer0V<+ROV9fR!*n@ZjQCI3{m9<B#yux~7y!2_7V< z;DTLcS1~)BdRTfMWVveh*j3Csz<TXWh3aQ=IU&a+BuLO^a+$9!2bHLC+Uu1iPc{MF zl-=3B9@~G5BtpzN0UTD`2J4YQ_0A+bjU*@K2<H~e>ra3vPy<An@<+_9oRmP|<l5|I zyW;PB(a%=5J4($)Q!p171E|GCB%sp;yh-CH5PBg+&nck~0~A>L`uAU32qLi_CXMoa zCpG-`<b5j>+$JV9{KKt7c@mQJ#OWsHtM!X0Ufk+QEO<40AanqgY$tB;0;*g$g;U30 z{~uA;;FoFCZ6|BO<R;g|$((F^a+8~^$+r2{WV<HYwr$(C>pp$oy}$b(yq(T-_S$Q& zwe|~7>Oym^GX+PB`Pn2CT`AX)9$A~PGRX(6C|n)7C+U$cdvNU~_~J*Q%tD$G_@UNZ zs<ZOVLx6)~r@Dj#W?k84KrvIuF6>QVqw#x>_&!Cw_?_(S;FJfwTU0t~b~4C#Jbh!s zhi|g9->ssqOshm@asBhjKAeXKzQuYQzG}I)vZLLwA>pdf(17#Xi%W~Mg7A`H(&u0G zR-?iEwsv*`fOJ+1SSZ<K@6+1q(YU8lC;MHcM3=(HMNW?7`R=PBv)tjyC7u(UKz$Wl zB}|2>fI;}Tk?`{P+ve<wlYZ=c{)quuU%oaQAyO_s)#eN1$c|rMqSPAxHXEa5<r{#w zuky5_&ei>&pIaO>mF*cSD+Dt(V>mX&l)b6;Ih=LLjXQ>$@n%Do9$tN}9QR*;fS-p0 zs*<{ei(B+7<i;jRv$$6Hjk7eq3a;O=D>+j2ZU5A#L*0Yh{p<>mW9-}e6B*s$G-~g< zMuUl1OqX6}vwYq1N9?C+W(Q;7UaLPz$;u*8p1uN?J~&n2Ya>kJn6~MKNLX7NFBfgI z`=f24=@u|s7P&uLg*tGF9*mvI1&)StL`o#kOTrhelT$?|FlgOFK(-tFVt8uLWNkpL z4qnDO^~R9sjq5&q_V!d)T6Rby3XOTphyo&nPYD)`6(7Px9g*mMysyG$Py+5pqxE;& z!FKgob<R5+q-N;I*+$5W=Hw5KmKE%oZdx*gAJeNgEjOA9xq7_$p{Jjk9UOD7FC24y z1rQR~4r#BZ9UO?${9=LF+rjOpkN1KR>dr>CDjffLF(_uBYiJo(uJRV#;a$AYaw+A` zWDS*?+}Oq$keN<vKF5DgXEiV|&;j@fAq|^n77FAt^vBbArs{jOSy@>ZO|fSg0WASw zWBW~E!pX@gy<P%f+ROq|LE77++3uIe>!e3@r+iYrfcI7BW$nKZ%3Xp_Rr99{Ea9p9 zpkIuQ{-T6xOnG#?IHyF%LabwT_zlSI6~^HY2EVO;IXAR?gLC0P^V))q1?1O9upy%` z6BAAX0-khT1M49E3`H_76#*Hb3!iA4pP)_*kpoO$0Az=q8E!NZS7X`pd^6{8ySDmh zx&RqJQ0$=)@hy~9icgex?#`D3UY{NHhi;%ume2Bt_UUXx9YYxy$KITAa{Aw`-_IB7 zjk(O`3qiZZp887H<zu9=#>NFte@s;foq#MSAPRyMy*g}BLT<qG{naUcOl**cQYtGw zogh3sTy6DO0E<U2hr*nkoZNS{UjI`RI}lQ06#EV}UQTqqH#MK~_{>i9=Ru!@+~Z5+ z{$T(E<InE9^3=(^+5ihkL%kF3P8dCfUOA3~)tcIjAA`Q^i=W;)zEDDevC>+aXt)Ag zII5{~e|4;wf8!-`i?c@UyvkEVIv5)B@K2fzWkLQAblW7gGt50ff9?5n%Wy~7l%1<$ zTixT`kr39GS?gwyuk5(<z{>3vO$=R6ecGK|jzz?>1FcfNEP57-vC89;{5M=~FPxar z{djX2W4*fZ`s%9UqB=y}9UH`oTh~2xMMf;1ho#!lk-oYDEY1MoarpYdAX9hvI_dm9 zgCe^ynUi*?b)}s30-&IeuXOHn9Qu@}Q*19s_q~^x!CRln-z|6+^UMG~)#j|S2yI4V z(~NO8;p!&k>f;<08T^suKL{a%P!G=1wC)_G5|wW+h+-QuuqKH!6gxyYS$Y7Gb$(^T z#qz1mxOi`U4b!r@qfxn^opyXV7ViV^JVKN4x%}s8oXW{gbs}R=NTFbW+#A9E^wgP} zKc3!>-UZ7CxhEKx(tJCQ_`~ata&JtBDyMb5%>ivJo!1|<PbYSbS!!thb~XJ~v&k8? zc<v=sqxR(Yt)MG5Pxg0ar~g`q%-S23S&(jihrdn4ii8NS-20c5h##F|=`ak~>BkeX zOW=K@n|<X%cm9sCO8%(FkHu_}eEwPMl*FS-RS}<W9nZ(w%gZ}nrpCr51&jGmL6VKT z|A|4t?7e*{Tf20tQ`2F2bRUZiTsm>7hzk(<eP%`U$VGEpm!h~Mq1yD!!)Ioz<!@JD z7N@2g?A;Zq0LJ3dpME(V8~{7xuZh9bhGfuD!41~W1EYnw7-Os<*E&ak#l8CxeQRGg zIxdWXsWg8!VzJr^4+xtlPLkgpe|E+@Ib!RWqG!jzeLH>13vaaPJ)-?56D;Vj0*rSi z%Rw+4w4>cOhtmN@o`rW)HKJZ#UVQ`NgZ#MxYpgln2uD-cjj6(?Tp3#dn1qFdghVNh zENZk+pl@5M;n9c@6WHgVQ$+{8;vPuv*%Z)vticTbDujg^lCF-OidVDI+}t`6zbdxH zuv;u1ey$S(<xmCvaq}rYTv$<R5&k{7Ft}grxX`g8-xS9tdz&3@2*9|4@_WBOa&;1S zKroZ7Gac4DBE-K0dT%sKTG6u0QNrFFPeV^rVB~SFHsQnYy^CihYM(k9eNmVQ$dD1d z+7@o8CDG5?fp}HUsNR9J#NZIHiz$^G<mXLe#?)BiT)277@XaN2Bw8{g5bma-qJoo( zr-^<fp9$h}I_v1~4@&#nItYV|jI5B)<M_WbPlXiGr`t7aU+?-jAASJ=;$%cl&@=M& z<!V<T_Ix=KQ}wmp{5CgJ75wJCm^n+K^?>Ml(>=HqX<1f%!IwAn<)UyL7gn(iT38g! zuQJ1TKo`%!GhM^4BKlRrlH31T;fpoSLsb$J!%uS2D?YwQ1-HeH49Fk=3qn>IzU>Gb zY*tx<SH`Clj=(y*vh;2}<|KyLT!Pf#bC{ODBQFE3UMQ5xrXJXX(X2a8EvKQ0rT{Fj z{q0Q>$Dt{GMRaPs$QpdFw}8QbT=ZQEw?*j?>r%ZrbTenXbaS{_B3z@qQJ=^2-Ivos zaNG6qzfjtkn3&<z8Trgp)67Fd;^*0uf`^x<C;myE8gsljxVXcxnzq~QBov$C>RK)y zIIx;X?!M`Y5PHU?KF3})L2XtFX4^Bn0t*g5aB^BlFSoNvLc%fHh4p8xZ2+DYl1mjf zA*uE=rE_g6K)W$e)I14=Fx-BsvlSe{Pvxzs)>LU>HzGGnoTE|IS(9k|80*-c%P}6a zz26Wb5jLxoM79HlG)SNP2y+9TN$MPu!J9Xd*<r<A+q07|E1(d;_BT>J$*U`>ZW4@` zbPl&KG-evi;wFFU0#=A~dI)R82L{z!T@e@IG?Zp!0NZ3vp@H4VuL_L{j@ND&r*CiK z6)x9C{s94ud;w1xIbt9ZUS5L8$Vd}Fxs_xkuK>)%<+_31$`2Zmx;jH1*Jvyij)H;$ z-DpifbbuwRDT|>Qn7Zj*Q0yQijFB(YUKv)1)Q)Skdqsr&T<2KvsbDwrg;ywFK!wQA zvJA}=q#ki@tDr=Qnz4YQJ(dtoT#9^28x-u=MGOAis*rC@XUUoEl0s)#cMYxg@j-x{ zs_OrQ-*dlX{+Zr}5;eP`WGLW$q-?3igJF~(DBMp4@X*hcVWzgVq@Z9Vua`*^Zc_AK zmW88*LaZ`PUMc&Mno7rQq&sTX;Pmj*<z|R^5Bd#`##CBbd(8s6HEeO&p_|*VspMQs zL6_ONxt<9h{Ds1eSSm$-ea9q6K&ljz79WAbyjSYO#G@`HApv$;Tw1ENmnvv+adXpi zFnI%6?_I%sM?w!JXfLG4Cf1vm^B7fZA}<Es&d0@{eaS>Sa_lDs^u#ihSEr1I;ygy% zkGO*e2S#NKZjW7C!u&GxQLu{0zPWqPBb{Q%XWI{J>+<41Ep=%BW6L@b%Z`3^o@H0| z*z-y1aC}>Tr`z5y6@xNjWmla993o$el=tM<p+Dm1s^7D-Wquw!bqdS}LodqqthiD2 zEaw&?<d16z*OZ&ZRz&3Y10RNfnHjZIM0IT`0-B<p7j|{2p^xmTmUzb_UM!2?K)~Mw zi`Aw$(|AO@9~Y%%nm|}tbaeE=d^sUyN>(C#E862}{rcY-O~f6tQ+~%0E5=3&ES)}D zq>eR3s?3=OX0e%sQjYiKKkoPYLN^ozrp-DWGBFMtK!-#v`e8v^;dw?ma*Z4q9~QW{ z4TEj<6sVI7TI-gt&x$$W@j~GRS|hX#0?(#D2!h=PkR}}L>I$&HqzCh?EFw{5F)OD{ zTxwh?mP)ertQUde;&|NLkj)g01XQ-VE|k$G6e3<3U7{V1Y(<NkEs?_+989FNvE$b= zfxyF<(>d^bj^)w)Lhki3fddq``VSYI(*92}9svt%He13#@>doE1p$r^A?zenz|zZx z4d#j%!0VQx*on?}RTV}=$4A3}6cWCqB!b`|%=EX7$Cz;C9(lW<Y;7HxpP)E=pgE(^ zYTnXH2YFa|)CqxS{~ryYaX<f?Z>S?!Di=`b6Wfn$WA^T-rZy|E?|EKb0^`c#gJlDV zESSO0a?00fX|%N45VFASK`ENOu<lIeL`_b_gi`|)fxuKc`XcjSObLUYbl~vq(d|3Z z`#lAx{fR^{u@x~fZ{TBAPEOESD|Dt)M(4ydbJSzJ%+;&u1$p39c|A;c#O;Tw#c^Nq zfH#fX1(lJJ(V7P;hbkNf2~YPd5|{m~)D$Gx(>pth5krpQ5j+fg6ef7(HZ0YPk{SDW zK6=+by&u59CNHGT8<nmOE5yT^`dEvRjB3=kTxptEPxrZ?JTERWHFB|a2r6wQz@tjL zi%~m^0g^=;H|mq+=P&tILQJvOux<vNH=n~XjF5F2TtC47?S{r_wbeoka=+ZO>NBT1 zm>%gx=fPPfBy!CI)Jk9JfZE;2yP|)Gmf)7n(~N+0;tkxRcNy4v@xG1jI-PAYYCoqu zW?y<MOpbB64-L_?{vb`Zk6|E)_fhZyMKT}{Aa;E;ZO>&70)Fmha5+V;e3{YTA)K3= z+nKpGluwI`3-I@c?Bh?0j_#C=)u^+evacVm@dDT{np3v(L9pLq9y&&RYw~R1O6w;n zrS+HVjp!4_JeDcP+r_}j^a*=JJkoE(=i|sCNRK*VLih)ZW7q%znsl}(V(WU>&uAN@ z4DsX1LyBpv=0wC9a7u&2{*(ANQFGMkUzk<)%O|>}SROcrBzeapR;~<QHy=RXN?brF zr)|Dz%>ga~dvkx+F%#mkn3580)9~dZT;#f0;5<g_lEV+;{j4u17sevEtc>912JzzC z<CkfsoMa<Gx;-P&gV|P$>E~=3Pkkz&`4urS`8R?O_lTmHBZ?>rFDN&Z+q<%onpQID zScxh5Nic*T-YzEk3xi;Z)le^ek!60_8<X<M&knTD50of7O>|!uB`&T}u^Kp%(W?!I z+pyhR$U{SZKA+r>bS@8H_Htga<N3goWab-u;z@YL!0T;BfCBI<oMC}v<#pGte2M0@ zF%@l#<m?xd^)a}Naoj=OU@{FuEV_VyoZk$eGLn+OiVW_a(yCrw+%?<m;oqY_(Q<Hv zL=+J2B)B)?I2?1va%7-<O=hd}GY^9f4h!qP+8qwiwQaP_^-*_r{z1y>;t|!<#5v7w z=j4QC2)|wY1`yWhK(lM4oU}=*5Ow!3YxJfm0cjGo$Fu`}Mz+&gTZn{YWhV0zpH(WY zbo5^sY}im|-szdiWMV;T96V}y2?IE%OdHW*xaD_1$b|y^@gnu{#+mMpx8rxV!zjnx zwMfe=wR9F1;?I>PkH|ZxriN}8yeQ#C|2<PYdgj^jT>JoHGn6R`h+Hft@b`14lUYK@ zNl`5L5`J|D&C$V;Z4uCj$(d~)+kesEOY+SNFe~bq3<|xxUT+gRO1zpIZ+H#$^+~3t zr{NGxCts<l*<|E~C<TIxVllp}Fl1b3qzS0(%olAr);>unVh5q5F}nuQ{4U2DF*Av4 z)P7%VJ9%4-&x>HJO0Z0Nb%qejY=Jddy75*yl^b48yGJAX&l{WHYG%tO@h9W{k-ou! z>uuKTtt1<EK`lxD^@xh0P|tgxp6OzJ^E-8@@S+vPx0U_`DPz(Y&D8vW^z4Zn5mQFi z>W-eljIK$EmU~d{{jf@@MlURLZrio04e|d?+})cmzz^A>Lx(w_T&j11Qq<a+!LIuj z^#^0C+H<pdh|an_qUGL9FBcDy5&~a(qyYzgvLWkdbHRec^X$tYuAiL1Fa3^>B`^yO zDW=!?x74>P3HR46tbFH21RyZi8BaEkivy!KRMxCBfhP8807U}Z-C&4s0e%F&-U^!Z z+XJ+eR&MrGtgCa+a}3;Ne<qU=s#R^458czfWxwxap<)62d^Eh8>@*N0Y&&!-bZ!{3 zt5j;W+N4&Y3noPUJob4f@4_t~<Dr(SwwQ(C+0=$K{7A8RhPTG{wTzPHkr$dSqQ=HF z#ki8o%n)e{5zmL6D0A6@d6N12^RPGj=Uo|aL7<fdUn*fwdU{?ruDk|KTOV~T3rBW@ z8WMIytl$ojwv54mG(}vY3kEzrhR4%*d@b9p{8O4Kj67@np>)gdTwV@{=gPIZOs)?l zmb!Y6Cn}<+i?tx%HS5bTTDVjB2N`k+m!QtkZHSne(Guvis97IeZ-s9x+kjY^Q1NfU zVqRvKTfG&vwIZEi<^$nsH*EJV&%aO>Tz();$BXF;(=)$R)rcgu+Swv7Sd<a6jhF{E zv28tiP*3Zv$(O>KEFzLxgrgNXAo4caepIU6g&^um{Yk84ShA-y>ZC9^5*kR}G#=Ph z&Sq3eW55SV42w))TQ@f4_-DH*5B8$nmtN(?+x7Nq>|8)9o6$!9xe75u2bRiQ-Gk9; z-Op#Z+A7QA{EBjGKS25Wax*O_=#b;T%EAD6dsIW7RKHWYAmmMZ-HItHRxh{#xRWFz z^Yw^9fX~g%Eyr4?YfK|500_H?R}tXK)!nwchM#mFaOt7g-M%kR+gM!-RTq{JsIrC6 zEXd(>!p3O9pssESl<+uUc~LifQFah>(IwAb_vUg!yI9;>9|&;r{7I5+=~4WhF!IzV z3xcb{bN-d|iwoCTsew{$w-~c12`ej9yA|J6pFL~x6Px+dpBAET#Ov=ZSb>3Cjf719 z+OclzYb!mT9rF*#;@6>EsWHENQJ@)cW&M;heuJ(w8=99#*7kBGwdXk2N;cqOuRKfi z&(>@Fk<8$rpmSi1R=9c3H5`7Oj|3v($aH&0&N3^n(6!xI8Hp()ia1lW?Z=d59imxs zJl+=!0pMnlESn^E-Mz*Okz9v1D`J8}JlA&bAU{{^1^=qNKyJ}eQPq}1QEPlrTnUBk z`%B*jWvJ(_`1sgwy&-gPg+-$gMlPeZHlxg7nVkGp_)iO3wG-fX+mr3Y9!D%?0k_*9 z3jhSY@JwCNI8O?B`<oCtBpYb4zJ)pgM9C9-Qem}?oOPau;J^fEiuw%*37~+iIW6GV zr)z5-JBJJ%fVu9F_Q!2;ebxEl=5wqP^2a=^ab~g@2h&~S8=e~<9UN9j89u$W=muz& zZ~I}g)nugy=Nhx5F9k9%fi^wFZ8G}dtlvx5L}_~z4Iy_nxx&%$bOsd%2Pcu)IFi4_ zlbtz(&ufhG+QGp=z-z5$|Ge(+Rpi-H?f1aXIN<1e#ILUOyR1sO@sl^b*X(~UZ(QiY z5dqoeC>|;z-8b3_OC=3EGECYmEw9?CrGCU>f)B|qPXo36Tu&}~{8VD%jZ&85MQ<@O zm~nxtTD3mOuZ_uV;~#+c=a!Z{J4vTSyw|r8E%@Prx#rKUZp}kEf|R1u`FeX;UWOcL zvSGx);S%{I(ZtFk!6@GG7nwSf5^dTwz6TcU>)YGj?jYpov@|V?cS=P)AP*#|O|=sG zOFJVIQ&%#pd16o_9Bwq4mvGOT?feh$E`U{^56)#kjgVlK+2rcx`G*2LjKwILU5D=R zDEuYb@1Q@Q_u}Jm!Im}l)ZTA@W8)s$l~&p2+*Og1-99+J{uITswy^N^gjfp_Tb7N2 zHesP$uGvJ85A2gr<nt>~olo$CdYb`+fQczMn*-6LKb$WzJ6fq$UzY2ww}FD|pLSyy zs&2|dMe8}8Z!K#~Yndv4{Lu$WTKr7JhzQqB@1vga*l{d|2Iq{}6Uq_An*9^+rv4c~ z0vLWmn%15RwkYrTmlz3()MtofmJ1cGOh-%VK<1v)gH{7Bh7Yho0$M@>&H@t=5$<0F z3t5o3Bu&xv(S%>xzt(OhNp>Y_8kr9XTHC@9P}wV-&b2Y^mlqeafP^3mIS>I4JTQ@G zF`4+p@&^G4$;iX??qu-aPH&))>06EYJd#0QII&E?x3o$a7b==k-12SMKal9*-uVt# zCbLQ9y5AqJLO)*VP(f{^W24`{4c4-C{_LMYaFp~VM8SX;w_$_gNAZE?!$*jBU}Pw| zzsgr9C(0dGM#>FIMuzs_;DE`is*1@5n8Q72bBO(1(`HgXI>u$vJ6u~6QuFHMdiR0> z%omdd#^#QHSv;QXD;tzYK->KwQZ}}DC_NUfXw2lfhj|^Z&fZ?A(qHvP4geM34b&z; z?4u=2Hg4AYO6Xc|1(;95BUtE7DXI({LzeZ<@WuGO0fYV`f59LUn8uh)8TH5YRTif{ z<n{!suRI7ll{CX=FD8L?XEUbcbh40bJEZSPy7tL*f^%_U2ERWS+XQLxZ94wOri9`} z97*PA&Z-p?t0CqyGZVqO-QGGQPJ^`4(BQ17E0hr@>7jsKuJEDNXl5lZ@Rv}l`aPK9 zgJyCJsLdC7r(=i@*NhAe_4dcoPHskqho$xwfjBX>2{y+QwK!tPq#rgU2pR}>1SF(U z>FJkUUp8PV5y8J12o(%UnqW6jM@X!oJdy&X<<Wrd9>eL)2EP5>L-y?W3aS{%2X5O{ zf57|BqRZT~{tp**+Yvd|p)_y8xb85hSfWoQ>qLmtBR)PbB9+1Ah+A!@CSE1vsn#!n z`DkJ8cP{pFoh4dYIm^Wx(6s6r83hXXX-`QhdQ<~Sd5pWeyMw9S-L!}p3ON#Ta_H_r zM8C>PXZxeIn#vn=1?rfnFAG=!9GcfxGR~K5k-$Rai6WsYmJ*6VJBhY<RA7e1Otunx z#9-R_7Z57C*K_9Y*{Lvt19n6GEtu9t>P_}@QlbM{)^f_1!|iQ@3X99nJG*=OI|qf| z0!n#U#Hm$Hg86*?$|`R}o_x~sSv{W?B`1hvP7FU11b&M{tb5$!3kvm8mGX;JA4)71 zQyAInn06Q$82D+oYX9tgzaHmvzTAT90};|Atn|Kd@xT6R_vE>`y^X%#L8;2=>Hbj! z@7C{uP7g>d$S15i-o4PzkrLLKfgmKp?*jMXEogFQDX&AYq>!h<p*ZV}eh9qJ&e+$S z<ZN&W?mdq_O-1#$LFXz}8^^DV(-S%S-l)?-fe)L{GT%eeRliD0k5;<R$}zB@pBILt zr?Ww~s>b$F@Gw$=g~C$Hrv4DfMLMgFVRRKFrv;*c!1Kbr&Rg%*l$Dgw$I^L*DX)Rn zlkzklwH)A^pbc|rMx+D+y(ZgfsW*Q({Uy!J1tbz^5xsruf-(i^e>Db1|55-iUJS(& zytes!=kUW}eGYt`FTIX7WHQ%$|4})4#Tkfz4`?jjcJYg*UJoP|Zm9ee#Lu=~ABNiv z(*xzZK#1lEM3;KpoQ`LHmuS4Gv{rysD%;PP*-`N3uplFJZhU4&X`<O6R;yYjh0SE4 zg1DLQ4)9A=uR{z;JKvva^^J&o$+_O2l`@rtPstQW#}Rrc-884;@S;MQg7Rcu;z&Eb z$bSM~x>F=#^h)w9{e<@LSJMAuyluj~qc=2U{ni1M!QevEJMRnwc{Eek@uaLcKov>% zGsAdeBl`O}Ly8%qjHIh~qg`LNjUpC}X3bs1nBr(vFG7B1yrovj(_RAm9foaAvpFe? zl^QO)^;%C~1a82|&@W5m&!7D>G6;_W`Nc}R7asv19f9}6vr4R>4#qGb$z0TGd6_{N zXsXr3Al~4$g9K8@L-Js1jy(&}>;90&LVU~{`gsRNL;DBE8TP9)E`M++TbW-4PzQSZ zv?0x*l`?VJ4hbAy+@H0pRl+H?IC**!kcS@+V`F<QRGpWGyV)7Ff(obxA1wP7M9Jtx zAJ(p|5J-i19Fy&zZcG`Q)J7<h#}3ZVkr5CO<jF;;|D{Dmb$DVO%@jfy8yn96iAxLE z%C5}62T(pNHvx}_0}Ycpahm&Wwve&V9~y!K77`uUBJ=MNGAk&(9}h+Exz7si4<|-Q zo$_a?kB4G7sN<-dSJ=+jZD()SFF(V`c>hB!P9~%~xIc|zcaGHZjMzW1NjP+*<25ie z)Da5@p{qEI^j+23rBxmM+*D)zxto(&=bxv#wstz@3pEHWwopMx$S?2DPrRF(n;~gS z+HrUNL!sV!EIQ4BmBA)vh)1eueVd5q&MzpC;AR?2-za|}I`D`IEDT4)5`NrO!a2#> zsk8Pm-T4gT*dcPO&kXM|dIvLW0f1MQcOL}ACH$a?<KLJY)h*HBO;FgqCuI40e(Tjf zGhLxbfvi7&H+tb|4H<}ps}m9z>lJJ``W47ZL*(G#NaV1~zrqEU)+2y_4CU^R;iq1r zad>s;%&$Z~3^F8;HMk>zJu@lYfPcdWxPX%U*_;^WY;S(k`@Ty3dSv(ZR}b3Q4_<rR z>&NUi`&Pbxf0eB4z25fI|8RXEH2S^jia3z~sY9z#0|d&%Kv}%8mu&zK0Yi2$FlU7| zKVBL-l_x8;v(Uhz)xtv|Bm|YWJr(_}hILcp=l?`PLXsGt6ciLxkyc1@-1=XqUM3Ol zq2~*PK1SzI!6s}A1{m$K=R`?w`!~1m^3+Q{Fh<l(mouj$BX~5Lbr@gj^_8)qcK>(` ze4@9dFA_JPq9K9y=~NifOYA6ZaNdM;Jb&;R5dO^|XK#Na-`x}2GTu{NAg8wajfCm+ za8_m`J>Jr@evDSn&@>bXL)r#RE;P+K!M`YRV9B5Wxhentn22c_iDSKH*(8_a6h9Az z5tVJsk52hU@9i{T`0nl9)51}6I^WX$+5O+b2OGcO^g#Qz8Y0<|O<%vQZua!c^=j`( zFw?wXFY$R&p6#{uIi$fopxQ_U+MJp^?P7zM*rCFwtSsFkv>$|Kvoo=N(d>yspWZHw zSX)*1F_+kwtcxir$0ig79Sp5#)S6-F>+AO%Z2j_pM?&hWHJ=C4yZ{XIIQLdGr3Wz3 zG-|X14FMzaZ-{M0CtUZ6j32=~{*E~rnfZGEupu6bd_M-Jz6<$BK(NLK=aQ4Wo~ue< zWu38F+X$iJsbF7EbvUV*%Dw%5C(t4W2kChF0+ukAp-W*9dy*w0g?w|wjE(rUtwl}7 zq4-R6^|xtw^3GOmS{jd(0S#kPFf~9RP69k)W3`$$fJ;ILszVzE4Z(r9LCEjlzuy2M zANqbGE6q{~bl9A+?o>*NpqpcEU5rZ=yLkX-eU-?Xx2l2v`a}m`=TBdL@-gCDbP|`n zd#&Bat2^Z-E0}#?LicHMj2AApV7h_h@jSY=2l~i32t_zZq}O|jyO-A5nP}OuGHe!S zniKrw*d@9<$>%3FljSC=bY73p$7|(;4WCfS3=TW!{QM6=SH(ho>&hF>*RT4gOC+W3 zEB@91m~L1xa1jF>S(z`eCd+c9BvTMWeBSp;>K`Nbs$V)&m$xbRn?0tU`iiJYMdew^ zKabnf!+|J)ld|<S2&`hyFBpjcaSE2<aRp|enaboroXpuoM8krj>LE+Y(4iXWEfqHR zAvimlHK#0A3<z>0i2SEB|5ZRh;Nh~LP`PvWr$;!zUsW3P>+0)+7j5<qOF>d97R1D$ z!B?M?lA3f4L%;O^*hmQuT%#5kkvq!9jr3A{`EW&|y%QuXchis<NuQ?#1op?eeLh#? zfSd!81Avjfbg{*{kJP}ZGQMTu5HU2jJGQDXhk~mHTcZ5xJ!wf;dA!@b)%H3M7Yd%e zmdfeTTs)+SfkLyahk9BfU@SL5#>c0%Sgu2CYomuyW_;F6whjmg&}=VZ0le1$eqsbb z+?A5}6pmX|LKl<kmD$G;W&`Gv)XdY0tn6-QFN_Z{Ds{_aULyhiHA-09f)54NxRm*x zgR*yruUt@0P69I^({s6lCg77T^;PfX5z$=Xp-JY$i5%6yl#+Szm<Ro^IngQ6uCEoI zAQ#!OQi8k#Xh0ekZ{@<m!p-B_n)cF~FiM@;T2@ATU6{S)oxvE9LsF-s)i0S&Oh6$V zkxje)>qyLHwBIZ@WV`{u`%FDu*|RtgWY!QWF+Wmys}E>w^-rl_d$)M=;pli>xnGaN zmD53x@aB9uvebE31M*CiFKYX!OY7*S(9i$w%}rEapp{Zm1~059=<?yRIZmxwkBf%Z zymhj3Ia+U_*_f-Qrsm?XCC>Wfd!XpD2BvfgH^9FTdfY@~YZm<^yt=wdJYd6E^L*`J zSV)9Cn^SH|XOjE>F#{ZqPfqNjk`=BPKgtI!43rO9UuM;h@}cz6hvsv;WhuqK0HV&9 zy6uLai{I=G0ujwXmj<DU<0efe@~|Jdz3EfWzn||<{m<j<!quZAEvIIn*hzhHPG7wR za)w#8933%hY8{4VRR_{EP!volNaz5UUj(q}0%0)@evtqdH!L?d7qt@;vCTFl*Ovu0 zM>@_h4$#772?b?O_f<Uw7q$Tj)`?7p@OD(B74&cuRXsZd_W`6tPLMUna=tyj>&9_h z7bI#xU?|B#&ynrsGU46!0bKi0vUc9y=~^QcZ<5vxh(!kLmbl<=3t&t3_gBNreAH^D zM40&IAL{(#4+@dDk2X@>HNu?#2c*<=&-9>(MdEdK`oZ+>uHd#@US0|~KQzC-E0=5Y z*dLQ?PhL)Ke1KfN;90S?7@>j4B_$0k?S9~+0Z@!g3SgP$Nw~?qXPq7TPuOCMFmN&H zD>vlIiGf%z0PR`|>5AW&)4o`Wp!_jk{PaEEvm@{udEUm%Vs^7EMv~t>ZOErqr@Qkt z{EPeRXx6$vw;dPJF~VM6(t8)U1i4*P2$(edl9EHXuA#+L-@ZZCTdx~Y6|-30&Jwz6 z08Ee1S5~u306z9Enee$zi7w)r&lUyndOQUqB-T4KyWW^MySipGoZ~RPgtZB~4x_A% z06)DY(7UGwt_Jslo=w{?pdB#r1HJtxwW5VvPfb)zuSN(7P<mnZ^Z7}&2haBs0OPtg zEjh<0M+%8Gsw{H(JuN{3{bHvlY9<tvwgK(Y(UHmVBGfq|w#Zr9V$0kw)-{bp+#F+e zrwKPDV3MnfSTMXvHfy(BZHzoJI?DKGqXU(cfXCGz0tP7)@S+{8w|j*+GOAA8i~<7L z#KuINOI~<wZq(}L74}H}I8wl64~{Q+mu0H3Yj+K&3<H42!ZB^trD-54Qhza2D~_PN z2*Moun7Op-z1E3vLs|K7t>b-=gDMwA9NeD;Fw0D(D4CKFQBwL6=?jDsQN#bBrlw|+ zL04*79}&4JA`Q>+`<Iim6-@avmZUY{6C4$aU>C>XVEvpvD%>C(Rl&*C`gn}Q*qV9y zZP|L{{gu)AYuUenKb0!#1ia{mmyNU1y6fe9+r?hi9hIaox?kuOoz7O!a{6Tjg@t<s z2`M58f6iigtu`wnk`#~L68;eUW}?``*OM}1p_^83HBXMo)6^?O{#B0ewPwtCyXC@? z4R_7$oM)z7hcJd*rf9;($cTKdT&Mi(pG@kH$}XFnbG14PoUX1edHYMZ9Rdxrn?qYq z^gqeo2@mh=o|fqWWDTI{r{7|G=(_qwW5?Rt>RvB{m@SX(8S@X^%o!K^2?X-JSnxfh zS%jV~>MO03Ow3{t`)}i*bquGjH7Yldw4;1^x?1A%tkV~4^plGA9I?AFNK0Czll9Ui zH4#Df*R~+WKT&EqgWr}BA-IH83}ej`23bcMv@oN3`ErBW+xb4i+<bbi>bF;&)<pn} zmM_by;~?1ha95$X#WSkUWx>^_e6fiHFP~`(){c4KwbbyUksMdQqYbY_+tE{EMo7>q zxN-ab2$|t-wI*U#p4qSmlA}uv_j%<ktQ~55afKO68*kd<u((L+s88YT|K-)%LTQ{( z);d{zPn61+K~2CI)^qzB_%c@!nt_DBl5>_h$n;46dRZPE9$uPVTZtsoXaKuInr7=! z1n4qw%xxV~M|Iw=uxbJA%Kf@d7R4jd(o(HCam=IJd29X0nFmKi^a9&z3iFfP><L1d zkZ?SPQVF4sXf~$pVciWf{@L-Jc!U4+4#Dw4E~1s!)FfGBcSGQEsvL1sHnB4b?`&Y4 zFDC!x$?5G63Hb5i=4bn-rWG%CvSFf9Qv6KsN4hIE4a%*ud5w*A(0lpTzU*E(ZU1z{ zTyi=I-6ZYHa&Ql_JsnTw2st>|+r7hi6#66IT2*`1P+{Nu{q=6yniOy#)~`C^3JM7g zvjPoA7Yw0$=HI0u)Oy<p#3#MMzhp%Z5|??a1B>+Ehi!5`LE*uv2`+cE-<n4v+3`V{ z(E!KZ_j`|bv*aK3L$mQ5(PN2AQOoR3s9c)|L%tk-mh56PJ(!y(k9N%Tq6%zFwIfE` z+daj>S~cMw-<3rkxvfmK;W$12UcmKk<S!Z(=~g$SK&0lz6;EallgSpUr~6aylM@T> zy9EQIWY^lgCcSQGWsgd?`?Dw=RVxVz2{RWkbvDnTSSnQlrqOYLLF*i44}15Ngx6i> z9b&oO6Q+_^1d|e{dD#~Exu;d0Ur@yZg$K{TXeZtc5eez|;*KpBA{ntVgb<E5hYuP_ z$#f*ZavJnRcN%V(mFA~=;(G6t05+icy1p<_7pVszF)@#CFBa?*Z@V|SezWv;c9K@n zS*i3ukR``cIK`rI2TN<dDf?4~<9Ktnh<RC>ZS!!UH&9#H5Qi0YzB>5#sp?a(H2-f@ z@_N8!X0g)n1t34&bFFs<hQm4&_?90sfQQ*1OWRpMhUI;SnNs|9@*!sLGnKp$n3O!} zLvJ|>2KK13T2Y|1g*E~hxlt|uHdROd`$^xqY6(TJ7nG|5sQ+3jzgW&#k?G>LzI`Ge z6P!X8udiBeRK#8yf#&)3y?8<hNbuEGd!j^*Bn$+B==b=ZXv)yyzV4Dsb+<oVF)viR zaXp3JPZ;r;j2XXKw>A>`_H2h&HEjS=OvTQL6D~UKmSEt?#lG@jBCKR+ED@w+SMU7! zrpIqprPM}~WIcBZz(}!Tl~Vb?c93_inpT}9?J%iMyWrZlz6#~Hz*AeUyo=b70PcXI ztFHpXU7hi?h_zf{dkbC7oarzu{$jcakv)|{&%{ixx81Hrlvme|P9aCo{dav-bXeu| zVq_|Aw~301s`L1}PRE^P%4`}_Qmn(V=c88JRA3PDX>XVm77<Mgqe_W;xqZE9+w+4O z<6&K=S)1)EQ&Nd-G36hi+joCHtv{k$j1x1Q1bMzb36vcg?pY2*5jSi{ashvC@0N|| zwGuPyHS7LLF%?lL^<(`nBq{lMv-A!l^nXd8(5jPNDsPp+Z7s{%TW-sX?~?Zo)JzzD ztH0!b(W_X#z5pQt$zF7-?<<Wg+)oqe15Uk|e2*|SrptvT&G&ECtZgszVn^3$ipF|7 z|As*k@vJC(sXT7bVVEm^3r4h;T~gNCE(7R%Vr+=r6P;SKtC=p>drA6Zfclsw&1+}i z%VmG8bX>=f*h6+s&MawU?dde-{$M|s6rmrjxJJkeGj0SE>zE(71L}o!Gh}=en8T4D zg<>W(aA%YcFVt!w*M8k2uDPtIf}~qp+{uA`qk+D@f+g=Jc8fXkv%Us7l2C6iK@_vw z!MDfk9V?G=SpwaE-0N)c+n(>P2tNU4h5)y7uiPm+ucar#mdYa$`=b>I5WQ>R6r1Rp zi&p;+`!jSH^&b7hpL8e|JLacHje|XH2K|wggItKuR@b!n8)iCp<$Pf6bD)l|L%u(r znr)v#6GM{P$`XunUf1i}<wHV@AnXNn<>=G1i`EAXA=@6zxW<fsH|wHbJGeaAgKN9K zF={p`*_^Vg7uu}7kQJr67%~-WYlY%3x0P3ocpC2G7_LWTf0Ef2MVvKotvcaiho4c& z1pI-CydF)Qt94pR$rvD1yBu$IsF$s?pxS8XmIPcVP2fcv>FqE&T9ZbQA5U{(wj!8S z)ml6ES^>p`7?0W)YVpq7?f<;oJ02#+3W`s0udz9}NMUptf;ieA0v8wm5xSq@B95<d z+vf@i4W&9aGVy$t%q=}?y;x-^E-lS+qgl+%p*|vn`S@=%fyNVvv#me+Y%suP>vJ`) z?I!bbZzQ01)I7j7DA^L&GLbsN3gw<6<15$WF>lcijs7R_6B@HIWfh3Yhp+v~>BVij ztZH2JWpgZqedCO(dv@mT#TDG`K8<0Eg_V&){VN~GA^Mg^9Y(J*UO7fgj6wf&wu!ig zS(Wqs3EK*XLq7SIlQBvbq93E{Z)+Qa97rH-(RP0#8TUAd&{KXGY9{X?gys{I$pq2p z=x7?)Xd)v7kLwMJRC1c%Yr^0eUb2A#KN@)3q`?Lns}5Qv1FRh^10!?4gX1wx0{1&x z-6{9U9OEkMf()ta)+UU#ayLF#ba?49QiHikq+LKq{CPX3$X7vO_1C?H`(yftm+4z- zpBTftgtiOLlI+h-i**lklLxCgr5Zuzz-ZVg#k28osK?^{?bYykXO&P#XZ@=O6buaM zw{N*6$jomOc~V#-={&z=R@>Z4oY!gk!#}51OF)%GJa?4$UX!Qs6r554_doqF`$fZJ zHcDSk*m}>T!C+vrAz(1PSW$E;<{&Fb?Pp*A`aG7YLZ9yb`!b1QUkR4JMFEn)<Hbcm zz1$_hz-WPS<0;Z)jRxH9?xYjfx<xOLiYql|)d~yB1%3#X@$m;i{Sw^3QFxW4fnHz1 z0N0b*Dd(m-`b3g<o*v%I_Pdy|0<$LR$3b-|&urjTRh=gCc#(~zm8*3K_-$%4=RV9S zJX}{LZ4tVv{0^=i;@#FToM*99_DkdP?BL^b#VSAr6%rrKBJj6^bu-vZy(;sb9TYj& zOr7_@`EBeU`_-?xBJjQT)ZWzCYTXd@YdNh3yuCg{h^SYbmNW<ltnK$dQ2nX(cH)Pa zIlj3scDiPUS|I^$J?+RI-ZxqvG$+0biq(WDYjgr%zE&29FA+j|Xy$PqJ+(tDmk1uj z+junk0=nud>nFc-y$Sn3%`J6fBT0L1?PHU-<6~ngQZNJeXI<Uh#PihOSAq6&2A`Fl zzI;mSMLUGw-JKhgMlCaP2QM*n>tse!!v+f~oOpxm%}bKMUhWh9H4l<?`1gPB>I{t2 z@2oR7pJmfzyTj#4=sta7W{?mTPzrA>H{t9n@{KvqZ)te}t1(AIcnscK=X;X<mP~`I z6^8?A)FEQ4gM+?3_D@a4<9@m5K11gBBP9T`D}jVss{0_~$1$aH?N+54V6;+OqzR~I zi$mQ9oF;(XyhO$BfdK(o2V3_8JUzFU)T&$Bq_B|o@1L~i7)Yf9>?R6<uP;se2Ty>< z&H~QJugq~L?RaiRjMt|c)%S+ym-S^4y#OiKY~vF0F9&O^1gFb=B*esEK)4|LU<tk) zu&ok}(DNbd>3nW{9Jwm0|M7aC_&gFo=L#!^rR4<oE6q;jM?k1NIX1gh>Nb*$=T6<S zRrkeaHmao!oduT_TO)LVwUUqbm{&l87jup*=z1#T;}>aCwgyp24e`D0=s2)O1Q~%a zcKe_IC9=O)AcqwEw8!A{V+D02raWcp`4PF_EgC=Upj~1|4%Pz>+AUxKjexZD=RhR< zA_DbTiDOkAj{qRLMt`HjNAdtLUwv$GiHeT)QOFSu>0+EDPbhYOnz}43NdF0Q9m)F* z-UqLwh4}s_e*yR#etb9Tj8?%Uvjr&}aJ#2wXC5>?9}Yjox80QW<+R|f%}5BzH>sVM zwf0w9d->9B8Aa`(Rj9St?Dr6xZOL(8`b#p66v%t_0Y*3;Bm(YWU_&c09bMVU29Ui+ z6jSMT)(CUOXxIq&U?s_nReAT+9KpRP(SR8rTy}Q0yv1@vss||HbRQXgqS;&L_^~1| za`Kr4yIlY>F%f4+@W}9MhQ}qEO4;0<&W+gm0s``AqewIXPr83b-F11l>*FhvL8{DG z_MYIZRRtv_e-1lpI#OLxv`5dyz0nj#{T^5r>$R3}ewE@_5Pc*epEd?WG|cbpySL}_ zV#g|;`XMM$5J3dMnhBP$Auiu3#IbK_!yia@u-`d8uz2wQ=c`8m&gE)$_F(1h+*)UQ z6`9SHsp;6QzMHwdS*kbQ{tl1r)wrH~`?owgCC0%-8wZfQ8UWDxRsExqprqSo&HfXh zGorm;$gcU}c!CWG$ov5cLP!NS_7|X)WwThwJS!RGvRI+Uic+T4alaICV0hoD22f<y zRp5#gSQ_kuD9A@{#yw4Vm|^telc!PDFu2xy?Bly!Oju^cP+op8d3nrBs?Y#<+^C50 zwuSt{2kg&K)M(gD4G7uEfyMfmwusDD2~fXhdzp>L{xx$02^D6>hH%T}?Qfw#Ez1Tx znjae6$08K9hCjrBSTW>pszJqhnwE$ZLAG}tl)FJ+H^txf?xi-#z3|A8B#!cCa--Li zDyIsEWn!70sazX~5Bz7c@(;|SPSgEn5L2e7mx%HYtxsW0V3C<004uxNJf6#DS6KRY zbJD7?LrW$o*9l{G*9?{WfaG8WCDm4MKp0hM0C?h6$!XqfPIV%1ts209o){G|OmEq7 zyH-vY0p3Kuqki$*gYXKVX2C{<>OpnY-;|*n>RE>b!M&U<vOc)XGlC-MVeY;-4ZP9J zQJYV5LO(tRsL{_+Z+l@9w0^^DNd`w01h={V*H*-e6;B5uM=QhUawPixz4*mPl9$zd zPP!G;*PH*nvr%6a=w*TA{j59mZ>557IF{}7?ji>-(cqFmVOp(VOP551H&O8pNiw33 zZ~=Eal=JHLYI~nGK=ZsCY@VoB<*MC_c6VpI&K@<W{G$s$Bb=!`OnKY<9YKvots;}W z;A>N9%P(@mV;VX-mFrjx>|O9FRj<eAXHq66RA4yb-K)=76H-kM5RlyVCktQ59tSJV zo0ipAs|ev6G&|_6pi3gio80k`_<fpyvQ!*KFz%4tQ8bHtQ3$hkm`q<pABn1ry?eJB zuVZs$Uo^ef6G^#Y=EJ*%3|}f@>j*SBEiYHYWdyS9ulxJ^2B%B4CQCI`qLFxTzy`_H zp0Zp1=bOWvc-$zPrMfWcc=rR*<Am@_IIwmV<gTxdjY~`dl$nM=Vb*BlBoDJZefJ1y z_jpKKHsU!Q%SyEEmuFq0cZ)Q52P;$FV{=E^LHD`begcSWLV(T(inaT8EN{eAh^8** zw{OB2#SL?*J88ACvFHx>CmNQco|?R8k59+t#a!V5rspK|o0iovf8M@gU6{WHs}+Px zahtp_F}Az|4dHgVZ$9MP+ojQq!zmUW=x{H^)!?ke#w?Yz|8IpQ%sjOn2Pe#*BJcKg zdaHJa%p*l!ZSr$eo8lzzk}2nn4zK}-@g1#NuCs<5BmBggTVNy5M2;A8EP8s-tFiiL ze_W^<s*QCcMjAxAcQBQdFHF?%u~<O+v*wq<LUhrq%2lyd3(~@rXy-kx+zA<`e<vpk z11Jli_S1D6_0ypRN1FNLLOZI!B}tErv<x<DRXyojSkV0T2{pI0J*@%~{I`2T&<xMB z2CwsF4Hdl27YDaL5)yumthBk&NM6|%*?nD>?<fU-v&`@z%WePFzoU!(uNY`#n&7Y8 z6JRYCn+V70y~Ync>aB5$hqivvto_J{ju>y>(J+)1GYYc$azKq4cSebsAS)}|XE)BX zAJ16JIk2DMRW?Tx<J7XV9TsO<MHE~zLz#g7!|6;@JqFkTRvhqe*LQkW;%G>g<q`QR ztq+jSp&Pk}w&av2Yx+&kCwqH6W9h-Qy}UKd=^JpP|C96%QCH^V-c#`5X;1IiA~PR) z%hsCLB}rycLJ$uMn(Zg6R9Wl?TC1{L?sY$K(x7|coC}nXX6|9b51AV~WIt%F#iiO6 z&t@W1zyy$@G<sXGrMPNd0;?kiMn{$Ve?#>FuXzrz4#>T{Bvs{>Z=g900{Zi(&?>!U zj<zR?Dl(u2*jT>=RX{r0TvDE-gO`2L)!+N7dUy2AXB%!%?d9g{Z^Px|nVgIaP?I9& zI<+MClQPj9_3}vV(9yS{7#`X`^E-Of{y_Q-F(c#T^ro}@i(-N7W*B{&H%%Blp|Qnm z5yo#S_s6$|!5E6+w}$CV0f@NpTB}tJ{CkrLPD0JEya3x_hRFeQCTQarI%eE+5kVwh zJ}v1CQ^VY)^aCaaxUI~G0rS%}(^K@ilZx+QJF(#!L9I83rT|!`4Hdqv9e=w;qcfVN zoh)`B;*JKFMTv46+QDaTM0o;+*r^jaZ_QB>iJJ1905I$N{qaZxP6HwmlI$+VvwyAL zFFE{bYS^Jwbwu}>jf4fItt8|2@%;Sz?3=smQ|haggz(P7z-uM8z+oZ-b#li|<9-B8 zWVsvj3$~&g>$Ts+N`727pWkoXB;9<y??j`_B=d3H(i$Yt+E(ri1DJYKDi%;5$vUZ& zxOm58j#zYTtde8Fh*@n>E)6H=R|N$H>ZA*kOlTbUE`K;|M!^z8l~kDJNJi)+jDjpN zA8$JIja{sq{s|mrs38DoeDCi>*1!V(FFKXx=OJc6F88sU4R%|IMX%${pv{iXm|5Ng zM5;_>AD>sQEOlwLleJddV%73FvqXXjsWv%s!pqo@Wa+8jQz}is$U%<Ggh?Vs2N;Is z1wFJvgELKfJRKIy;<$(rq6Y9I&23n)<$2pdf;Y7y(`Sf|9fr5ccXWeGk8rz#{cs<J z`durkUVEvr+%W0Eu<uh@w78jLT;Z{wWuDfxjXn|3k-H2X=1^avR&9h>XK7$KX|7e{ z>kF=2t3YlBIDSQCWgoB3u2z|oG98X);Ho4^>yHp<)T@LSF_!O$jMsOa#)`bye*Mg} z0tZ{=^G~R~k}PpJPBK>PVE*_C+hYpHlok53d>6g*d|W4n9k=)wGuc!}4@tT9?#(Ws z?mBLMFdjHanE7s6gQvo%kCl-H6Rc?F8X8}JccMHx7#_ZS;EDLreHD)n#HY8?V1rUD z(_QzPf0Qv0kNz)*U$<P2I9;d2fSx-Id<j)oKfm<2)5MJE;(g9N(#vAu=Vo~1X-Xk{ zxVE<T4=-MXjCVJ;0JaqYuvYjQlQnd}2`rzt4uk=e&zqW%TQ#q0$L9`)MgmsmS!oMb zSYgcfC=vdhc&954^n8_<_CeP~7=xK;?|*Gy7q)dssIKP}CO*f3&!PbjCl5v4)V~h5 zW46t-`*yl8x+>Fu8pSj<dJJ@0L!JG&UX)yYgp|6FKHAw$CMk21N2`Uq!wI;0lBs@U zP{67USoO!MZ}&e=+|<aF_7fDRH-GtdZLDuX$n+0vP|9Ng<;Y=jyD=GM;o=bFyiK2x zo!(CWb~6QGf`Jvn4a_t6+NOowKl_4@p<{D3(F-2IY*ml*c2i`yZ;h16EGB5$^0)cL zXJjBZUewTh{;9F5a26I4BJk%=1(jtHm+2$y!N+Xy8g-#AggRn{aswR9+!^bk_9X|w z)hGddA`*c0r<w?&KVf{z+h0Xq4Qh?=*|rFkdlw$cO9#g2-hI9BoAwLQC;Yu>9*7aV z22MjL()mS2Pv`Fx)39H>?oO9sQbzOt(k1<l^Nb_c&&!a)*)a$QMkh+Ab7fk^j>x!d zpKWYx@?;)bQNfZ%+OCGaABhW0QSW4I5`L!E+bZLPedr4hlG{1qyy*Z8Q^>%9JT=IM zS0#gQfz}^DYQ@r+FB_s@IdH=N%TVE`aoFu)Te`|-j014}574ih-7f=6aX;fQ3Dd5; zj(fc+Dz)7R0A4-i*-kSj{i#4?o|`C*p5|}wG$+mZNlHG`jsf0YDZLde*hisdixf~S z6dgU%b_xDqvmzUUdt?@?b%guORmW3^<9XiXP-VyHL1XyaN@ShDq5q6wG^6@=x?EpO zLe<vR)^H_7uBqxt_o~i2G*IdY-s*PW*LuHJEL&%Z1!5j*|7(-Oj}O`6?ygYYZKmMN zSclYlp#*;*1w3kPWmq|-f!?F(VQI~gp_1l>vnHeD=o6rh3f!h_Q(^2ntJTmcvC|tg z9#Yn(4xs(dTAThZ?S||EXCA?;H8vgq9-sL~VQ1T#4$ntRkv|3aE^A!0u;b7mJr_Mb zKO?8x3(B4Nf-j*om|rnq3;?R9O0V}?EcJQOneZ+ea6riQp{SsWXKDWQJdQTXWH~lH z2tGIAcwyc;HP~9k1%Ds}{7T+3w49Q>j%Wkpit7Z@A|i3x<_%NeHt+)+r0D9xuimbJ zykakj(6F%KP|sM*=RY^Aze+$e?OyLkPGj-AkY&whoZLXgG|TW9|DnLUu6_1{PkuuK zoL43Y=vP9_S+{NAu|E*09z89E3U!qG9k=J217s4GWnS|`8h8_0ur<El8qZSj?IWFD zr!Q1f*g6`R*Zr!~5BG;ZwL$Uc$uhtegQe5OitLVI`u6bumi@q%oP_VJDi*yw=naw` z!w8<VXMVMl_^S9DV(^I{hu>IMZ)%(pXNfhqsGwrba%%1UMzL0I4b#JF9SSrSdcC0- zPZ?3TMi<@4e6c)NROf+ln2%BGyT&f;GISh7?Eu2XtD+{A+MfTP_O9|R>aJVE$cQvZ zNlK0*-61IwDh*0Whm?eLGlVE1LkUO=2$GMK5+Wl?DJh63DGVSWrG$WS);w{}bKZa8 zd^vv7xxDso@3r?{aj$!?wce?7UqVAz-oVH)CVW}ge=W&5R}J?@#h_Y$k5cHom9Dsr zUK-*mn2)N<w|gl04TLIV`+8VuPRn~d3ce|^MBBWcNo>FEpi*tq!8sfD?XEn^s>gh3 zaj~LQ8)cs?AoALOP{wN}36FQ2@*CBK^icJ}qa|f4)Kfslo7H;dy_pjljQgoNKbW4i zC5w-X{ILdr%f0oW6vTD#C$47-4g_bCu`7mM=67*Y_<js2B|>{@4!gY|(s9K1J~54q zRCbxHH*oORHZ~Id-gUIBqRn-1Z8}Uz_}UXnJ3BjcYcsOtc7fz+B4<lsV)qixt;Em@ z3y%+X{xv+kTsVqDAwr%qSNQ2vL_`sW37OL+^8y!<Zva*9pyHjIxcYQYqeBn%myb;p zkUIHf)o{)lo(1<TbhCMpBz&`-6fa9|-}d7rhq&>U{+J@K-d*2f)qIGj-^F9kteLBd zXto>kIiIay-ch9L_C!Q&OwW%z*R2kj+Gtr0BJE_%vP3ya$fr~ALu&H_<Av<9p+}F< z1cNppyZJfH@B|*?x-=MXB0T5R)cN$ovBz<<0<5n!dfO|NqqNT2N`TTqwaw*u21iAA z^6Z)|)Gb_Eq}ifJO7V%Uc3YpIsKG)G+YUOQvnKSPdceTQXt&UP_oBA;%i#wXM(Ulk z9d!C*8dBo#>kKD&gr+oXiqmLzK4{{Z<2Xe=yM#^TIjz)q^5jAhW(ij0x{)TvrGMf_ zs|s=3KIi_cVfJ*yRdO?-8So`&-)TN?OV7?Wa|-3Gwk(38fNyvE;n{t;j;Libk*Hz) z5v0<z2=9(JV?(Qi#eDD=r$VZl1&xeICiha`DPyVb!YR0W+vc0|+~Vj&Ha)%?J;w*D z(~EYLJ!F=<pB=rfa+(QAM82cKGKdpH(CM<;e^1#!(_PhY9>{UZ4sLPaVHUN16-UK( zMGd7rZ{wbxs0~T|Uls#F&sY%<ga@rWd~=KAtDf@h&N1P4a*4W0=s7lNa^(^1DTra{ zk$EBz?yr=7F&IKD4?5fR4Bh7H0PLHI<lGal<l6je=TR&a%pzlI7hB`cXLb@eu&=uW zHxmxNf6u6KWum1m+DPf!eFLPq*G-GJTgiH7O%KdmE^XYL*x$mE`;U&zet_)GCpJm? z@wj4IN?AzJT7c@S?0Thn{bVm=U_U;;LH#D_T{fhmuvn0-^DA}fPT*wMK_NaM-c)Tb zTGbP94nCb)XH>d`=LX#=DHqy}XW#V1&B$&{YBoC?Bo~trySs!M;vKl3g_TIr(Zm#C ztYP0)7B7qIJ*D_^ax-t8ezV|a3FZtEmAL<=dS0pFFC=s){mg|=6AX`1A$C)-4&S}% zuXp~dd#_6S1I^`zI%R+)JfrmSF^7}|hQ|Nx%RPI7OipmStFn2HXB;c=HlQeJFy)_k z-^~-q{hIzW=@NXg=_voDewHRY*x}TB_a1JP_Te8u-N?@qb-ehYsXRe32)doFrA0FB zS&imR%7>0-5P;Y1&-3hNtW!l5&48}#@PVDvH%+VyQCEHL^~8P1ur_dsF5H*qW2F<r z;hx)VNEP-Ms?1KEdY2b&ZOsWLNPr3Z)NbeV$Z9n_M<lc(?n&nGok+Y|{l^#totA;q z{?wCOssqT7-PK!18*TdeE|Vgh&I}qinpyO5tTQan>k>8Ib$Ku7CQBA$*pS)TEp)jT zR<6xuDfK-5jk^@CA3d^mxyWlX0NfqI<5MA<=a!~*p*&{6T81We8JmO`sdLE+8wPe^ zKX>2D-JB<ZRtMaPVZ92D;5iF?8tChL@u9()d$X+1V{7ik9W2&V<y&MPFW2ndj6Dd% zc||`7FZ;c=Zsg`lSoz*PMGZ9#8tG_CiZFvPnUx<1iLib0ymRTOjRFpO?D-GV3SwH4 z4{?wTFNyFbQvSJP+(cA=md;JgwWWI!Ak27(HA`$dBA{rR;iZo~rz5L5joB3fs$WXK zCcL4BS{W|^a)ofv*gfZ+t&2>Jn(B;rdf?z?a#7r`Z?6O_zNQqA2%WdvioZ{){WBtj zJh#qBbrcS;RCw^IJSIYr)7$1uc4o*;T(R4cmN+ufW-4M$RXP_+$6gS@^w+o%A2iQH zS9xy`N7a6g;~LNdKEXU*;i8U>0G=wK@Ewd6JW!9i=Gme#eYL7yoW|su>hq2>v(o9g ze;VP!$cajs0!=mxw%u5p1`Q0qdI_C`5cy|gg1!HPtz;a7d%#=%Zn~jUjp_IZZc)tg zg!sr^u^?4vg5n#@laI?S6hvJ)?46G#qo-wJDvN^>x1>-g<7$ngwn;mH%cA&v=~~yN zDZ!nuZ$x>;#At7^6moBV793p9Yj4rTy|Jgmis;2P^-X)Sr5`iI>A?E?{hH)W%PC3= z+wM$<V(Y~2j5>XIV0pztL_}Edgz^DCound8b%mp0(yN1micRK<bMOAQ=ZC9RK7k|b z{!Ol<s9lkdP{V{fG0NMw0Ao3%Q|lf#&pr{5<Zs>crOyMAIfvSc4?mSz#QE1ZZxFs2 z&?RqEPLXj(z@g)deDX0;{d4VJ0WQ{2bQju6E-l2ltxL4Tu{?FB$UxbFm^I4v@(Hoh zg2LuA0%1eJF8QR$!K2Swr^91Wx;eJ}+2ZdxlZ4&)hQT5TSvDKwr~7)dCNz9U2i+x7 znwt2C5Bc7uOdRBUiHydEoZ8D9^z!izTwcKu$w~ck`==L&>+27G#U72_l}|(a#Q_Xi z(FZO1F1Md?>c4+3(4=1I7p%U9Jctr}YS>{nBJ)(k8LISqtWJis2iYY;U%6%5rfVy$ zfglV04n(6A^-<2s%F3&9zk7la@TAIkPs99LO6ZpSvVVVpC2G!T7xrNW>Auh>!WP3} zj6rmOn{qS|tzuX-j`(`o&wAcwROVW(0Hu$F_`~t=ZFO=fa+(*tpOhG1_1~8yGddQf z6uM^%jL1sG(4e5^%3<{HBOPt+3jqNE=KA0ruXdORYpt((K;P9n$;r<{WL4f9&W&I5 z>VgMVT^84ok3CLb?U@N`twIWMj}))Y^FAi=@lY|n)(}aa0nmfsy}3YgIm5ZRPsWvE z7Yz;T=tG@MuhY4_f5H;t=TXCSDPm_t3mn(-0b_W)rajBd#AH&X9~`I?(dVcevAZ&Q zyGx~#-?TyVEA^7(kYb76YlXwdXp;Jl>l}}pCP~70j>jWQB1waS+dOor)rraP{Kmhs zIjMc(JTbYPjVjae4^7Kxqfv?cS@}?@MjY-}{;*IP8UCXM)It;6v9ywwHy@CYmcFV~ ziH^*qV9!EXn?_~@wzafq*#ev8PC|lOorkE;p0M{&5&OfB;H_&u)|@%!{_@j1<=a$e zRf(5D*uDk)p~b4msQLMm{>xu*4_=Y?G{+#4Njy)hocI-?YzEA}=Lbt{S_936;0rfz zce9B{{0Q2XbEpf-+t!@!^1@@nd9-k{hj!a%LZ92X;@A3HT(7}Be)0!RiR2wzpK-ld zuehVlYw_MBIVw}KF&b)uZmZgW^pG7MzZKYhb^Ocwp9m^eDcok{?@(#)h<PK1(y+~6 zTypmEKxd&0<8j6rb$GS>{Gm!r-fROy9}UPCUqXufd@6R4hax6>N46+r)N`a57&I#w zfEfDo6`qEisbfU?@ojxyz?NLCGC}t#5g&0fJ>4FAn4YL{q@GM~)1btN=y^zltcA!v zfboQi5$+v=l-f#!(#W#EldJa0xWn)EkVXxNr!QW<+zIKST{&d8PLu%hI5qp7v&LnQ zWS)40WmQ}jV&-U!eL_d}LCElCT}h&*?Nf##RS$ySsCjqUpePvu>o2guF5I}R$q_og zqDg;Bsh&oS?RbU%)A5>X&W$TKl^G1&duuFPj4m<owZ{RU;n6&bSkxx+yQW@jQ=gS5 zYwAk_3_==wX%l+kCl4{{NNNtHyT?fB-yJ&ZZRAX^7~tN&Pf$Qnnxu9>4ol8|HG|su zMao%k58{JtPf!^KX@!U*5fs^brm9d1Lh!9Q09mz$*1&E~v?_5H0O7u5f(j2+ccE&= zx9zoGB<#vQt%qmo9&#fg5#rE0Cz4W?4K26cr1;`X(OgJ~+TxEkJ8bMGo?vOOvbOkO zt0E+yts)cK9F6U$nBR%D7-A4POn{iIym>j-&*v>8ePLQjTRC(_XLQN(58CEhXs{QU z^b#yeo%g3s!Q?G1@>BY@P~FWfyrr{oKQ(JBa~t(2ip4y4hd!`xDW3eh9S`gMA3g)h zRF+I}s>HWJb+W(RB0?(idVl}Sl3J7>TRq=9V2QZk^*N#Uju-*=`g*!%3T^8c1?)6t z2#Pf?*`dCu%zEN0TEjgp(I40G>?sI60^Z4>8K6eIOg`cJ^|8&f(16ckv*JFr)lWim z0gt~)`hvoJy!r*0wMGu15(uS{gi6x4IYTb)+RrLc^9S#p+v^>Dh_OJQyWAXd6tAx_ z|Ar^f7uaKdT;S@EGRJf0m~v?-&!Atgo#8K(6pg-gos)?*$xwFBq#<9@nK~f>ukxtb z5I2E<ORWmY6LLvqt(g(V?t<z>=bl@|R+Rl4XXlQCqV`l>q6HWmBH^#w-Rf|oD%?#K zZAuUx^A6B2f(^g8cyC%`*yRyrB0`ToTQOMTI1MKy!!quPL-pvPw6PW}TE{fkSGpAd zml7MhLH&J1y;@;b7PI4S_s{w1hM0M3R@nuzowZ5gn*+K3WOHXo<ax=j@X#_d-v&6d zf>)lj{DIus4gQ+uH>nuuXOdw#Go+iCfaDx+6(qWd7v_1c)eL|uBQELn=#bw@SXtJ! z{ZHd{Kj|1gV}ZcQ0L6Qy#_@7&<X5;K-}oQ_HI5#j*GTc4VNVh=6|V@`y3$e<q5?bL z+PbWWM3fUDDM60?M9itiVp!FiH|qpMg`LB8g3>~si3{e6_OJbv<uc%NT+pybJ%!`6 z(0Pj@r10cIxoQ*Avt^Nq5U>{Kgc9GF)Vg}4C@Hf;eFJ^6e$v)MY9wiNIq$4(5KK6( z<5gY}9rE&Nul}o8SyTdoJ6<!d%ynr@2$Ji2Yb5uBpgQ5?p9DKDWR8qS0yG0KvBPtO zlH6L}uP8iF=^zU_IE;_Ikr8y`W}I0<|MJsgKjIM#Vi_Rm3s#Urs7AQ1z@{0?rDu4W zAgqSkw4Me*K0k41$4_y0%(%6HBBmU4MnS}(tGbp}$;1<8`6H&WG75(R-Wkz7R|z7M z1J3(irQ*xI=5Vu|;Pk&nLm<5)>itDME#$Y5U?Ns_b;WH)s+hU+<*Ea;K{sm)s3}l$ zu4eE~z}=za6|?Ik88Ib<7jh5v+XL;X*7#1=y8`Y%a&+YsY@C5E$l+bAy(IZ(4X%zN zgPQOF{AU)!5G5N?yIdK)#4ff#J@(?I4xh!#UuHXI8=3N&gOO@#YFoEeew-)9pHap} zXAG2e8LXvh^mcN-)N#kf8{?`84o=9Tyw^(#xLn?!dtG};YE=2$ry9@Fj+Ao8(X7-) z=fcA&nHa|_4Bjy~2dq*YsKgS!eUdMs{rj`g5IuZX*P*?oglajTdjWKy1@Lvtx~e*} z(R1oi+V+NS_ln{*DiaeD@+TzQeBxAlsD+1jTQeVjxDf<~Ie&!zs0bs1JWhFv@I<C^ z!ecUS&4;>)?BkmrQ$EMy$6Bv`VxHP~w9d&h6k+~Oo%^sdG-s+VX|PczwmEBQM5C(C z`HaTlfW^yuu9A-6VMDzS7hbgHd19Iq-wzM%p?<L&J{tc%HS(~K^G;{`g+p~p0}A!f z1I?B|+hk2*au=Yy-baa2#1v!JNF*fcZ<_Hr_q;miGNmZ$-4pv_Yq!ZB!up9u*YxFM z_9P7O${Pw}4!8I^XW+|m&(}m~H0M7)sIlYFP?O=9iORQ9pbdp<;l~f^#WXANg%K_o zv9c^Of9K+`9$%inb@`VHO#~GiiCw>L_?SFYIz90vz+|+Vj*E>=uSg5anJw-Rmy_ku z_Gr-MaobU5ii=sUPFxeWpg!wHRu+9Rh8|3pJaMX(f$9*V!j<_IM<X8}s_b(xYim+F z<YIT$-{~<ppT$kJ`1;F}9@iyyrl_`VXN8^(Xr0j0!DL?YZK2p5XEHawgpj1DrtN%A zmcke#4B`+7kY(7lSLm~IK2i9LZ^h9LC-n+1`5u_D&(*8W&a96Jh@1qHt68hxS#z*T z+}=Y<`$hVN%ILHGu|Jn5{XKZJXRp1~P-9ZIe*evO3wA6NX4=wozr;XQ7U7&WdNn#T zBTP?Ld`)_|uH=ZPG@>Zvsm^nU?z;#EqK{9#us}f(BtI&+rhX8XyJ05uz(ZX^Mo+Qc zrC>F!we2EhHiDIKx?Uu9rl5<EQO4z?V+t<7Ep4Pt{$#(kzu&d~l={jyNFd!0%8(lI z_Ql7d4XzQJKak?$BD%%$TWw|}%YE|h<WNIgARSgH`S!yIo2S?TVsNv50u=%%K6py> zoKY0X_Qrjoy26~ymA5zh$AfkJ94I-x^DSC!$E(e+=PEC2gNFgGd@Lc4j~<Nj=$R0h z3^^>y>OyD-olZ@eKCW%6rGNY7HjK+b7<aqN;WLAGIc_`Far@2!OP)gE;-DRsg2{W4 zn&CPtU&rg$?MI3=;_}a&(Tw_dqS0l9@IcX|e2M)TTbFrX(@OWlWl&y;J&dHC<s<4r z2eQ5^W?%9^dEEx(<!k9Ym<HBFPGDR`TP`>=aCjAc&fX<Z%5{piEpRigTCE49ix%Ai z<_r(?UeGXC;o6^TSfmNrN;hq{{T@rh9N4R_wnV@5;-Z`s5^XC5YDTlIIFAN7#g~$n z6GeZ<I3-Ac@zyO3Pu6#*UP8YhyVcSMZW4dn+$3@F!DxgY<Q)QpfN>%`E+H7}aipvF zr6s_sB5nVZY<${&I+sNKNB_<SI5S{UfTK;$&RGm@ov>}gqT2J@0Y+g~z0dsC=_e5I zGIy@qPU&8(Wrt4fpXUNCN(&D}mJ34l*83IqPLL063eMtm3k5QtiPG_gwz&FHUmzyW zz6AI8eyz;%WnyLuz5+c)G7DC{_{}MHibk(V%IUTzngCRAhJ5Dkp$d*gpqPVJE6Qo< z>0|6C|LFa&|LB^u+1HtxDfT1;11%`T@9r>9IV-M(PX0VaeokM8z!8yn1vg-2Q+}Bx z8?eve`in*-8ktgvR*jN~`t<Vl0&t_~3$<-0Wr}Zf2u2$4Z?YwlC%$O6lBYZ>BLeMx z9#YB3lN&`u$UJ_oS*3KW{OkSUX3mdZmGqu07)(gScc|e~2UyK4_0}1{tMXK#qSkhg z$}hw9H~L}3$g{Ke6gH}9W{9b5sn$ugC(MG5dgQCF?ZN5|iZo%?Zm+t!32rUYXjJ4* z4|`Wh^1Pl!M1-A3+sM!0-I!xyp8dOSob~MAZ&5J&shrWnAZi&1^?IO$yJ1==Voymj zUp52X=|Hv4mnLp#SNG}S^6r}g!j_GJb~G3M6vPV42#-ojJK1|V)~8_^U!lhRRV0Vy zy?Ubi2*b}qKd}Ac*M|zM!quOYVlE*M_cyU^8?D*{GfzB%@)-focpOX3WK%M?&U|h8 z*90*V#&#xzH<^4#4~T%g?|ts9)wD+Xr5v4^{>Qt25!O=+3aHH|02D$SG-0q<8tc$? z>35H~4yf>jznWL+1r!7}lW*-~q;HT2amNU{zX)dl2`duN#f2;ku>md*VLGGH7Bmt^ zlA70N&u#u8;6h9i=Lb??nLhSkGpV*}8z1&v#G~hgh=T)L;3+1$Pybf<`!Tn`(BO6P z)TCR<blTWkrbmi0rLc>0WN<kO43@J&&<_z3=55bV76NH$Lsvg)4k?6(*EBnH+DhNL zCunL9tk94GYKL;nBnhEa>wQVl4x8(fH+f$*;F5dx_Lu^DLK6PS{o_$}Z&MF@%=QUz z%ot&8i<Xl~F>qbaq}+4rVM)#7=P&2we|HKgQOxsF+|htpdgyJWV`i?D3Rqfdq{$!F zR9>lmjAg&6g3pX!ad9T|6iTZzEY9wc3o?%uU|)u}DPWO-*ip7C`06{z+p_mrDS#4f z&|dt0E91&k1%K_@1Omz*MORA^^u(j*IKW2;T|zS$tYd#Vw>-H&fuF9^Z0~wcVunz# znIR399XRSx`34&TS`)&O(V-^$Qqc6Yz|RogD1FFl&gU9ZwJP@|uGWQ>E)I$V&)+k( z{<I6?bK@GWwNfCEAXk&7UhXFv?O*8PkVq{GJ{T)vmVr1AU1S9^_}DI!1UIqy^4#la z?ym-iEs3i)dmK|AIaxOQU3Fg%&+|K?+N!g7>^Xhz#>d7>p~MnA<Su4hA|ljKct^w5 zc8<}IDZWtHG;9e=I1D?2V1+y0C#M2*VS1vp^!lA1j-e_oPSNWhYUPUWo_?ve<}h}* z{fgLEam@ocUcicRb(pY1of&@j+2`$toQ#Z%&Ei;)BZC+Q^zAWAb-gHpLWL~UkI2o^ z{0n;z^S+WQ?NsQ7QHJ<?#XxksYZ^&&>xJFfB3I&I*=i}4bTV_Ol5zE!>8$Yk9llfS zAiF3Fz%Huz+4Ug|X%yx9EgslXU-B$Hle$f5$l?5c$8%l_sYF#Hqm!8;R;zV#a$?9v z)bJz2l6prSl+&+YzXa4#4i;@jNw*OU-c2wqQwqRC41oTuq0v?8a&cuLxuxa6^X}Ss z?h!ZoQNcfE_Bs>1020>j{`kb>n&u0~>ZEAGNkS3cSal{2o;AjOK^!1&ty(oUoMn*< z6rpGC%5kloibnjrxi<03?GCd|7##$wK8xO8auGQUDP-Btcu^ftd8e%J6bl34Na(|| zzLhHXfX<WR<`O(tR@lZhezEP2U!7jgK*8Erb56Y0DbfTjmc?ldbWo9R@(R!-t|1>I zP#x?fxYIWi`?Qz{u_+uW2RIDL9zn4n`3j8C%R&)=v(<&Ag^vOA%|Gq)h%o2+$5%W+ zV}-^ImBu!T_YoFMC#a}|+XPXYNk}BpRo=22oI3+mV^EJ${_+5Bql=`Yis$Y9nT2)v z++AIn)r$j&ySn(L$-kA+wbOE%oQ9$sow;7m%}abgWD|y?rq+bfho1%e?pn=oq&sc= zH8%jW0X>*XawbTRDP^;~uZP39D@$h#KiyO*Q)OllQg3Ev;rX|XtaKZ6U>I)12-(cm zJH7Gg%kJt#7D$JW5Kcl78?3Um<qBm6f?>E=RZma(?W-f#3RfO;`b0}-YoU&2fA#dZ zQ_7`n<l(?2ny<UKZxS<B%;NACs|x9*5zsF63ij~A`jD(36`VL=cEfSVw-Srf2EX>& zT$<Uih4Mx=&&ejK?Ffr+OS&WAeFOKX3yQQiaVVBZwyQcimR^2^w-P@HvIknCj+Yt{ zL2YaR=&~f@noKaSMqHBLPO?g!fN%ma6LI7LZ$rj2sPh_SkoXXLcy8+QuJT@pVjVPx z_(+*yNZ38GD3}GkrK4Ud%qSBF9e+}?v+qF3n95CHmM|eT5}FwKO2kVs&*)L7bu(-r z`wyKp#qf&qX9*t<A^3ScRo&U(Ls^mc`u9T%bb-4{!os@zt`c_X6b5e`2RsAUJKx_s z-kBdqn}U>wT+nc%tMM*By?C%`(yeopH-qKL;4T-z-cyFy$qU0d_>J(HZV;rGzF+O+ z==eF(J}+vN1kW@0kZj`KtkVd!CqZ4Hi$q~V4qL60GGP@hup!AIBt|ILhc;ne1K&Fs zpwpaa+mXK$qC2oNDRN!@0(?UezR~YnBX9iY_cSy#oUkforKNKq;?=>NAD#{OL}$GW z5HEEE6%{S{ZB0=&UvH{Er?{T2-5(E&W$;FWz2c^#A^d%~10ysV=~Rr06#1Ek)qwgy zE0JmEa-za|v}b;%*+`JJog;3rs5zHIb%CHU!Gyw%^DRRifkTBZl8lOuj`oSSaD8i% z({I)6ecoB}t4{Na7cZR1vUFNu`(7*C9QYa-q&Oq+kN#S2Ff2ExL!B~(aOIXs99e$9 zb<~})6Z~l&G4$q5)fWHhDyi2?o0~QwFDeB-ecjuWdEF>aL)avStrXZ~nisxignwx= zqy)|hXiwmI@7-I^I;!=re*BpBE1e3kE_bbdeW@G*tk<b8`^Wu1O$SKI3Zyp0KX4P) z@aJd*;S(G$h(eZ#;@V*6|NV0_AtT>bDo_3Ae<FPSum4X9qp;(=W&h*nK!RhDCDj9t z#lOd&Q-x8Eo!TI{Wd9m}P6ULok+vlF_n`lLn4N&T5xt!LkDsR?u<N&a%MQx-?@9kT zAIvcrh1#|`_dkAaBLqR(ISc<Y=|9K!CZHz7l!0KE{ymI$76>))k}vx|llXh0)P$f9 z^U3o+e*V`r{rC7d!u=x^o6`MXLi~TB|G&`xPfq&QZ(<>ep(VqLyU|4O=aPn=daasm G^nU@du^Ghx literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/images/Sunburst2.png b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/images/Sunburst2.png new file mode 100644 index 0000000000000000000000000000000000000000..677b2a1966658f55832c9d74b567ee328d5e253c GIT binary patch literal 126313 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�cSE3`Gh&oplDj1DM05 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 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/images/thumbnail.png b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/images/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..87c140e7c3ed264b53a064f31ed66c3a66a6cc85 GIT binary patch literal 130270 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�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 G^nU@du^Ghx literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/index.ts new file mode 100644 index 000000000000..5ca8d5a8fc46 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/index.ts @@ -0,0 +1,53 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { t, ChartMetadata, ChartPlugin, Behavior } from '@superset-ui/core'; +import transformProps from './transformProps'; +import thumbnail from './images/thumbnail.png'; +import controlPanel from './controlPanel'; +import buildQuery from './buildQuery'; +import example1 from './images/Sunburst1.png'; +import example2 from './images/Sunburst2.png'; + +export default class EchartsSunburstChartPlugin extends ChartPlugin { + constructor() { + super({ + buildQuery, + controlPanel, + loadChart: () => import('./EchartsSunburst'), + metadata: new ChartMetadata({ + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], + category: t('Part of a Whole'), + credits: ['https://echarts.apache.org'], + description: t( + 'Uses circles to visualize the flow of data through different stages of a system. Hover over individual paths in the visualization to understand the stages a value took. Useful for multi-stage, multi-group visualizing funnels and pipelines.', + ), + exampleGallery: [{ url: example1 }, { url: example2 }], + name: t('Sunburst Chart v2'), + tags: [ + t('ECharts'), + t('Aesthetic'), + t('Multi-Levels'), + t('Proportional'), + ], + thumbnail, + }), + transformProps, + }); + } +} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/transformProps.ts new file mode 100644 index 000000000000..51e89f8c6c73 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/transformProps.ts @@ -0,0 +1,381 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { + CategoricalColorNamespace, + DataRecordValue, + getColumnLabel, + getMetricLabel, + getNumberFormatter, + getSequentialSchemeRegistry, + getTimeFormatter, + NumberFormats, + NumberFormatter, + SupersetTheme, + t, +} from '@superset-ui/core'; +import { EChartsCoreOption } from 'echarts'; +import { CallbackDataParams } from 'echarts/types/src/util/types'; +import { OpacityEnum } from '../constants'; +import { defaultGrid } from '../defaults'; +import { Refs } from '../types'; +import { formatSeriesName, getColtypesMapping } from '../utils/series'; +import { treeBuilder, TreeNode } from '../utils/treeBuilder'; +import { + EchartsSunburstChartProps, + EchartsSunburstLabelType, + NodeItemOption, + SunburstTransformedProps, +} from './types'; +import { getDefaultTooltip } from '../utils/tooltip'; + +export function getLinearDomain( + treeData: TreeNode[], + callback: (treeNode: TreeNode) => number, +) { + let min = 0; + let max = 0; + let temp = null; + function traverse(tree: TreeNode[]) { + tree.forEach(treeNode => { + if (treeNode.children?.length) { + traverse(treeNode.children); + } + temp = callback(treeNode); + if (temp !== null) { + if (min > temp) min = temp; + if (max < temp) max = temp; + } + }); + } + traverse(treeData); + return [min, max]; +} + +export function formatLabel({ + params, + labelType, + numberFormatter, +}: { + params: CallbackDataParams; + labelType: EchartsSunburstLabelType; + numberFormatter: NumberFormatter; +}): string { + const { name = '', value } = params; + const formattedValue = numberFormatter(value as number); + + switch (labelType) { + case EchartsSunburstLabelType.Key: + return name; + case EchartsSunburstLabelType.Value: + return formattedValue; + case EchartsSunburstLabelType.KeyValue: + return `${name}: ${formattedValue}`; + default: + return name; + } +} + +export function formatTooltip({ + params, + numberFormatter, + colorByCategory, + totalValue, + metricLabel, + secondaryMetricLabel, + theme, +}: { + params: CallbackDataParams & { + treePathInfo: { + name: string; + dataIndex: number; + value: number; + }[]; + }; + numberFormatter: NumberFormatter; + colorByCategory: boolean; + totalValue: number; + metricLabel: string; + secondaryMetricLabel?: string; + theme: SupersetTheme; +}): string { + const { data, treePathInfo = [] } = params; + const node = data as TreeNode; + const formattedValue = numberFormatter(node.value); + const formattedSecondaryValue = numberFormatter(node.secondaryValue); + + const percentFormatter = getNumberFormatter(NumberFormats.PERCENT_2_POINT); + const compareValuePercentage = percentFormatter( + node.secondaryValue / node.value, + ); + const absolutePercentage = percentFormatter(node.value / totalValue); + const parentNode = + treePathInfo.length > 2 ? treePathInfo[treePathInfo.length - 2] : undefined; + + const result = [ + `<div style=" + font-size: ${theme.typography.sizes.m}px; + color: ${theme.colors.grayscale.base}" + >`, + `<div style="font-weight: ${theme.typography.weights.bold}"> + ${node.name} + </div>`, + `<div"> + ${absolutePercentage} of total + </div>`, + ]; + if (parentNode) { + const conditionalPercentage = percentFormatter( + node.value / parentNode.value, + ); + result.push(` + <div> + ${conditionalPercentage} of ${parentNode.name} + </div>`); + } + result.push( + `<div> + ${metricLabel}: ${formattedValue}${ + colorByCategory + ? '' + : `, ${secondaryMetricLabel}: ${formattedSecondaryValue}` + } + </div>`, + colorByCategory + ? '' + : `<div>${metricLabel}/${secondaryMetricLabel}: ${compareValuePercentage}</div>`, + ); + result.push('</div>'); + return result.join('\n'); +} + +export default function transformProps( + chartProps: EchartsSunburstChartProps, +): SunburstTransformedProps { + const { + formData, + height, + hooks, + filterState, + queriesData, + width, + theme, + inContextMenu, + emitCrossFilters, + } = chartProps; + const { data = [] } = queriesData[0]; + const coltypeMapping = getColtypesMapping(queriesData[0]); + const { + groupby = [], + columns = [], + metric = '', + secondaryMetric = '', + colorScheme, + linearColorScheme, + labelType, + numberFormat, + dateFormat, + showLabels, + showLabelsThreshold, + showTotal, + sliceId, + } = formData; + const refs: Refs = {}; + const numberFormatter = getNumberFormatter(numberFormat); + const formatter = (params: CallbackDataParams) => + formatLabel({ + params, + numberFormatter, + labelType, + }); + const minShowLabelAngle = (showLabelsThreshold || 0) * 3.6; + const padding = { + top: theme.gridUnit * 3, + right: theme.gridUnit, + bottom: theme.gridUnit * 3, + left: theme.gridUnit, + }; + const containerWidth = width; + const containerHeight = height; + const visWidth = containerWidth - padding.left - padding.right; + const visHeight = containerHeight - padding.top - padding.bottom; + const radius = Math.min(visWidth, visHeight) / 2; + const { setDataMask = () => {}, onContextMenu } = hooks; + const columnsLabelMap = new Map<string, string[]>(); + const metricLabel = getMetricLabel(metric); + const secondaryMetricLabel = secondaryMetric + ? getMetricLabel(secondaryMetric) + : undefined; + const columnLabels = columns.map(getColumnLabel); + const treeData = treeBuilder( + data, + columnLabels, + metricLabel, + secondaryMetricLabel, + ); + const totalValue = treeData.reduce( + (result, treeNode) => result + treeNode.value, + 0, + ); + const totalSecondaryValue = treeData.reduce( + (result, treeNode) => result + treeNode.secondaryValue, + 0, + ); + + const categoricalColorScale = CategoricalColorNamespace.getScale( + colorScheme as string, + ); + let linearColorScale: any; + let colorByCategory = true; + if (secondaryMetric && metric !== secondaryMetric) { + const domain = getLinearDomain( + treeData, + node => node.secondaryValue / node.value, + ); + colorByCategory = false; + linearColorScale = getSequentialSchemeRegistry() + ?.get(linearColorScheme) + ?.createLinearScale(domain); + } + + // add a base color to keep feature parity + if (colorByCategory) { + categoricalColorScale(metricLabel, sliceId); + } else { + linearColorScale(totalSecondaryValue / totalValue); + } + + const traverse = ( + treeNodes: TreeNode[], + path: string[], + pathRecords?: DataRecordValue[], + ) => + treeNodes.map(treeNode => { + const { name: nodeName, value, secondaryValue, groupBy } = treeNode; + const records = [...(pathRecords || []), nodeName]; + let name = formatSeriesName(nodeName, { + numberFormatter, + timeFormatter: getTimeFormatter(dateFormat), + ...(coltypeMapping[groupBy] && { + coltype: coltypeMapping[groupBy], + }), + }); + const newPath = path.concat(name); + let item: NodeItemOption = { + records, + name, + value, + secondaryValue, + itemStyle: { + color: colorByCategory + ? categoricalColorScale(name, sliceId) + : linearColorScale(secondaryValue / value), + }, + }; + if (treeNode.children?.length) { + item.children = traverse(treeNode.children, newPath, records); + } else { + name = newPath.join(','); + } + columnsLabelMap.set(name, newPath); + if (filterState.selectedValues?.[0]?.includes(name) === false) { + item = { + ...item, + itemStyle: { + ...item.itemStyle, + opacity: OpacityEnum.SemiTransparent, + }, + label: { + color: `rgba(0, 0, 0, ${OpacityEnum.SemiTransparent})`, + }, + }; + } + return item; + }); + + const echartOptions: EChartsCoreOption = { + grid: { + ...defaultGrid, + }, + tooltip: { + ...getDefaultTooltip(refs), + show: !inContextMenu, + trigger: 'item', + formatter: (params: any) => + formatTooltip({ + params, + numberFormatter, + colorByCategory, + totalValue, + metricLabel, + secondaryMetricLabel, + theme, + }), + }, + series: [ + { + type: 'sunburst', + ...padding, + nodeClick: false, + emphasis: { + focus: 'ancestor', + label: { + show: showLabels, + }, + }, + label: { + width: (radius * 0.6) / (columns.length || 1), + show: showLabels, + formatter, + color: theme.colors.grayscale.dark2, + minAngle: minShowLabelAngle, + overflow: 'breakAll', + }, + radius: [radius * 0.3, radius], + data: traverse(treeData, []), + }, + ], + graphic: showTotal + ? { + type: 'text', + top: 'center', + left: 'center', + style: { + text: t('Total: %s', numberFormatter(totalValue)), + fontSize: 16, + fontWeight: 'bold', + }, + z: 10, + } + : null, + }; + + return { + formData, + width, + height, + echartOptions, + setDataMask, + emitCrossFilters, + labelMap: Object.fromEntries(columnsLabelMap), + groupby, + selectedValues: filterState.selectedValues || [], + onContextMenu, + refs, + }; +} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/types.ts new file mode 100644 index 000000000000..37844addea49 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/types.ts @@ -0,0 +1,71 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + ChartDataResponseResult, + ChartProps, + DataRecordValue, + QueryFormColumn, + QueryFormData, + QueryFormMetric, +} from '@superset-ui/core'; +import { SunburstSeriesNodeItemOption } from 'echarts/types/src/chart/sunburst/SunburstSeries'; +import { + BaseTransformedProps, + ContextMenuTransformedProps, + CrossFilterTransformedProps, +} from '../types'; + +export type EchartsSunburstFormData = QueryFormData & { + groupby: QueryFormColumn[]; + metric: QueryFormMetric; + secondaryMetric?: QueryFormMetric; + colorScheme?: string; + linearColorScheme?: string; +}; + +export enum EchartsSunburstLabelType { + Key = 'key', + Value = 'value', + KeyValue = 'key_value', +} + +export const DEFAULT_FORM_DATA: Partial<EchartsSunburstFormData> = { + groupby: [], + numberFormat: 'SMART_NUMBER', + labelType: EchartsSunburstLabelType.Key, + showLabels: false, + dateFormat: 'smart_date', +}; + +export interface EchartsSunburstChartProps + extends ChartProps<EchartsSunburstFormData> { + formData: EchartsSunburstFormData; + queriesData: ChartDataResponseResult[]; +} + +export type SunburstTransformedProps = + BaseTransformedProps<EchartsSunburstFormData> & + ContextMenuTransformedProps & + CrossFilterTransformedProps; + +export type NodeItemOption = SunburstSeriesNodeItemOption & { + records: DataRecordValue[]; + secondaryValue: number; +}; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx index c8922dd11e58..82ca0b585d67 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx @@ -17,32 +17,27 @@ * under the License. */ import React from 'react'; -import { FeatureFlag, isFeatureEnabled, t } from '@superset-ui/core'; +import { t } from '@superset-ui/core'; import { ControlPanelConfig, ControlPanelsContainerProps, D3_TIME_FORMAT_DOCS, - emitFilterControl, + getStandardizedControls, sections, sharedControls, } from '@superset-ui/chart-controls'; -import { - DEFAULT_FORM_DATA, - EchartsTimeseriesContributionType, - EchartsTimeseriesSeriesType, -} from '../types'; +import { EchartsTimeseriesSeriesType } from '../types'; +import { DEFAULT_FORM_DATA, TIME_SERIES_DESCRIPTION_TEXT } from '../constants'; import { legendSection, onlyTotalControl, showValueControl, richTooltipSection, - xAxisControl, } from '../../controls'; import { AreaChartExtraControlsOptions } from '../../constants'; const { - contributionMode, logAxis, markerEnabled, markerSize, @@ -57,39 +52,8 @@ const { } = DEFAULT_FORM_DATA; const config: ControlPanelConfig = { controlPanelSections: [ - sections.legacyTimeseriesTime, - { - label: t('Query'), - expanded: true, - controlSetRows: [ - isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) ? [xAxisControl] : [], - ['metrics'], - ['groupby'], - [ - { - name: 'contributionMode', - config: { - type: 'SelectControl', - label: t('Contribution Mode'), - default: contributionMode, - choices: [ - [null, 'None'], - [EchartsTimeseriesContributionType.Row, 'Row'], - [EchartsTimeseriesContributionType.Column, 'Series'], - ], - description: t('Calculate contribution per series or row'), - }, - }, - ], - ['adhoc_filters'], - emitFilterControl, - ['limit'], - ['timeseries_limit_metric'], - ['order_desc'], - ['row_limit'], - ['truncate_metric'], - ], - }, + sections.genericTime, + sections.echartsTimeSeriesQuery, sections.advancedAnalyticsControls, sections.annotationsAndLayersControls, sections.forecastIntervalControls, @@ -108,11 +72,11 @@ const config: ControlPanelConfig = { renderTrigger: true, default: seriesType, choices: [ - [EchartsTimeseriesSeriesType.Line, 'Line'], - [EchartsTimeseriesSeriesType.Smooth, 'Smooth Line'], - [EchartsTimeseriesSeriesType.Start, 'Step - start'], - [EchartsTimeseriesSeriesType.Middle, 'Step - middle'], - [EchartsTimeseriesSeriesType.End, 'Step - end'], + [EchartsTimeseriesSeriesType.Line, t('Line')], + [EchartsTimeseriesSeriesType.Smooth, t('Smooth Line')], + [EchartsTimeseriesSeriesType.Start, t('Step - start')], + [EchartsTimeseriesSeriesType.Middle, t('Step - middle')], + [EchartsTimeseriesSeriesType.End, t('Step - end')], ], description: t('Series chart type (line, bar etc)'), }, @@ -218,9 +182,7 @@ const config: ControlPanelConfig = { config: { ...sharedControls.x_axis_time_format, default: 'smart_date', - description: `${D3_TIME_FORMAT_DOCS}. ${t( - 'When using other than adaptive formatting, labels may overlap.', - )}`, + description: `${D3_TIME_FORMAT_DOCS}. ${TIME_SERIES_DESCRIPTION_TEXT}`, }, }, ], @@ -313,10 +275,10 @@ const config: ControlPanelConfig = { default: rowLimit, }, }, - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, - groupby: formData.standardizedFormData.standardizedState.columns, + metrics: getStandardizedControls().popAllMetrics(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts index ee7c89993cb7..b560cf0b4f79 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts @@ -22,8 +22,7 @@ import { ChartPlugin, AnnotationType, Behavior, - isFeatureEnabled, - FeatureFlag, + hasGenericChartAxes, } from '@superset-ui/core'; import buildQuery from '../buildQuery'; import controlPanel from './controlPanel'; @@ -51,10 +50,10 @@ export default class EchartsAreaChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('../EchartsTimeseries'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Evolution'), credits: ['https://echarts.apache.org'], - description: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + description: hasGenericChartAxes ? t( 'Area charts are similar to line charts in that they represent variables with the same scale, but area charts stack the metrics on top of each other.', ) @@ -68,8 +67,8 @@ export default class EchartsAreaChartPlugin extends ChartPlugin< AnnotationType.Interval, AnnotationType.Timeseries, ], - name: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) - ? t('Area Chart v2') + name: hasGenericChartAxes + ? t('Area Chart') : t('Time-series Area Chart'), tags: [ t('ECharts'), diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/EchartsTimeseries.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/EchartsTimeseries.tsx index a9947e0d5520..0cf7f3cf192c 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/EchartsTimeseries.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/EchartsTimeseries.tsx @@ -16,7 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -import React, { useCallback, useRef } from 'react'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { + DTTM_ALIAS, + BinaryQueryObjectFilterClause, + AxisType, +} from '@superset-ui/core'; import { ViewRootGroup } from 'echarts/types/src/util/types'; import GlobalModel from 'echarts/types/src/model/Global'; import ComponentModel from 'echarts/types/src/model/Component'; @@ -40,12 +45,25 @@ export default function EchartsTimeseries({ setDataMask, setControlValue, legendData = [], + onContextMenu, + xValueFormatter, + xAxis, + refs, + emitCrossFilters, }: TimeseriesChartTransformedProps) { - const { emitFilter, stack } = formData; + const { stack } = formData; const echartRef = useRef<EchartsHandler | null>(null); + // eslint-disable-next-line no-param-reassign + refs.echartRef = echartRef; const lastTimeRef = useRef(Date.now()); const lastSelectedLegend = useRef(''); const clickTimer = useRef<ReturnType<typeof setTimeout>>(); + const extraControlRef = useRef<HTMLDivElement>(null); + const [extraControlHeight, setExtraControlHeight] = useState(0); + useEffect(() => { + const updatedHeight = extraControlRef.current?.offsetHeight || 0; + setExtraControlHeight(updatedHeight); + }, [formData.showExtraControls]); const handleDoubleClickChange = useCallback( (name?: string) => { @@ -92,7 +110,7 @@ export default function EchartsTimeseries({ const handleChange = useCallback( (values: string[]) => { - if (!emitFilter) { + if (!emitCrossFilters) { return; } const groupbyValues = values.map(value => labelMap[value]); @@ -123,7 +141,7 @@ export default function EchartsTimeseries({ }, }); }, - [groupby, labelMap, setDataMask, emitFilter], + [groupby, labelMap, setDataMask, emitCrossFilters], ); const eventHandlers: EventHandlers = { @@ -167,6 +185,45 @@ export default function EchartsTimeseries({ handleDoubleClickChange(); } }, + contextmenu: eventParams => { + if (onContextMenu) { + eventParams.event.stop(); + const { data } = eventParams; + if (data) { + const pointerEvent = eventParams.event.event; + const values = [ + ...(eventParams.name ? [eventParams.name] : []), + ...labelMap[eventParams.seriesName], + ]; + const filters: BinaryQueryObjectFilterClause[] = []; + if (xAxis.type === AxisType.time) { + filters.push({ + col: + // if the xAxis is '__timestamp', granularity_sqla will be the column of filter + xAxis.label === DTTM_ALIAS + ? formData.granularitySqla + : xAxis.label, + grain: formData.timeGrainSqla, + op: '==', + val: data[0], + formattedVal: xValueFormatter(data[0]), + }); + } + [ + ...(xAxis.type === AxisType.category ? [xAxis.label] : []), + ...formData.groupby, + ].forEach((dimension, i) => + filters.push({ + col: dimension, + op: '==', + val: values[i], + formattedVal: String(values[i]), + }), + ); + onContextMenu(pointerEvent.clientX, pointerEvent.clientY, filters); + } + } + }, }; const zrEventHandlers: EventHandlers = { @@ -199,10 +256,12 @@ export default function EchartsTimeseries({ return ( <> - <ExtraControls formData={formData} setControlValue={setControlValue} /> + <div ref={extraControlRef}> + <ExtraControls formData={formData} setControlValue={setControlValue} /> + </div> <Echart - ref={echartRef} - height={height} + refs={refs} + height={height - extraControlHeight} width={width} echartOptions={echartOptions} eventHandlers={eventHandlers} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx index 1992f4a45609..509dc6c815f6 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx @@ -17,36 +17,33 @@ * under the License. */ import React from 'react'; -import { FeatureFlag, isFeatureEnabled, t } from '@superset-ui/core'; +import { t } from '@superset-ui/core'; import { ControlPanelConfig, ControlPanelsContainerProps, ControlSetRow, ControlStateMapping, D3_TIME_FORMAT_DOCS, - emitFilterControl, formatSelectOptions, + getStandardizedControls, sections, sharedControls, } from '@superset-ui/chart-controls'; +import { OrientationType } from '../../types'; import { DEFAULT_FORM_DATA, - EchartsTimeseriesContributionType, - OrientationType, -} from '../../types'; + TIME_SERIES_DESCRIPTION_TEXT, +} from '../../constants'; import { legendSection, richTooltipSection, showValueSection, - xAxisControl, } from '../../../controls'; const { - contributionMode, logAxis, minorSplitLine, - rowLimit, truncateYAxis, yAxisBounds, zoomable, @@ -58,7 +55,7 @@ function createAxisTitleControl(axis: 'x' | 'y'): ControlSetRow[] { const isXAxis = axis === 'x'; const isVertical = (controls: ControlStateMapping) => Boolean(controls?.orientation.value === OrientationType.vertical); - const isHorizental = (controls: ControlStateMapping) => + const isHorizontal = (controls: ControlStateMapping) => Boolean(controls?.orientation.value === OrientationType.horizontal); return [ [ @@ -71,7 +68,7 @@ function createAxisTitleControl(axis: 'x' | 'y'): ControlSetRow[] { default: '', description: t('Changing this control takes effect instantly'), visibility: ({ controls }: ControlPanelsContainerProps) => - isXAxis ? isVertical(controls) : isHorizental(controls), + isXAxis ? isVertical(controls) : isHorizontal(controls), }, }, ], @@ -88,7 +85,7 @@ function createAxisTitleControl(axis: 'x' | 'y'): ControlSetRow[] { choices: formatSelectOptions(sections.TITLE_MARGIN_OPTIONS), description: t('Changing this control takes effect instantly'), visibility: ({ controls }: ControlPanelsContainerProps) => - isXAxis ? isVertical(controls) : isHorizental(controls), + isXAxis ? isVertical(controls) : isHorizontal(controls), }, }, ], @@ -102,7 +99,7 @@ function createAxisTitleControl(axis: 'x' | 'y'): ControlSetRow[] { default: '', description: t('Changing this control takes effect instantly'), visibility: ({ controls }: ControlPanelsContainerProps) => - isXAxis ? isHorizental(controls) : isVertical(controls), + isXAxis ? isHorizontal(controls) : isVertical(controls), }, }, ], @@ -119,7 +116,7 @@ function createAxisTitleControl(axis: 'x' | 'y'): ControlSetRow[] { choices: formatSelectOptions(sections.TITLE_MARGIN_OPTIONS), description: t('Changing this control takes effect instantly'), visibility: ({ controls }: ControlPanelsContainerProps) => - isXAxis ? isHorizental(controls) : isVertical(controls), + isXAxis ? isHorizontal(controls) : isVertical(controls), }, }, ], @@ -132,11 +129,11 @@ function createAxisTitleControl(axis: 'x' | 'y'): ControlSetRow[] { clearable: false, label: t('AXIS TITLE POSITION'), renderTrigger: true, - default: sections.TITLE_POSITION_OPTIONS[0], - choices: formatSelectOptions(sections.TITLE_POSITION_OPTIONS), + default: sections.TITLE_POSITION_OPTIONS[0][0], + choices: sections.TITLE_POSITION_OPTIONS, description: t('Changing this control takes effect instantly'), visibility: ({ controls }: ControlPanelsContainerProps) => - isXAxis ? isHorizental(controls) : isVertical(controls), + isXAxis ? isHorizontal(controls) : isVertical(controls), }, }, ], @@ -147,7 +144,7 @@ function createAxisControl(axis: 'x' | 'y'): ControlSetRow[] { const isXAxis = axis === 'x'; const isVertical = (controls: ControlStateMapping) => Boolean(controls?.orientation.value === OrientationType.vertical); - const isHorizental = (controls: ControlStateMapping) => + const isHorizontal = (controls: ControlStateMapping) => Boolean(controls?.orientation.value === OrientationType.horizontal); return [ [ @@ -156,11 +153,9 @@ function createAxisControl(axis: 'x' | 'y'): ControlSetRow[] { config: { ...sharedControls.x_axis_time_format, default: 'smart_date', - description: `${D3_TIME_FORMAT_DOCS}. ${t( - 'When using other than adaptive formatting, labels may overlap.', - )}`, + description: `${D3_TIME_FORMAT_DOCS}. ${TIME_SERIES_DESCRIPTION_TEXT}`, visibility: ({ controls }: ControlPanelsContainerProps) => - isXAxis ? isVertical(controls) : isHorizental(controls), + isXAxis ? isVertical(controls) : isHorizontal(controls), }, }, ], @@ -182,7 +177,7 @@ function createAxisControl(axis: 'x' | 'y'): ControlSetRow[] { 'Input field supports custom rotation. e.g. 30 for 30°', ), visibility: ({ controls }: ControlPanelsContainerProps) => - isXAxis ? isVertical(controls) : isHorizental(controls), + isXAxis ? isVertical(controls) : isHorizontal(controls), }, }, ], @@ -193,7 +188,7 @@ function createAxisControl(axis: 'x' | 'y'): ControlSetRow[] { ...sharedControls.y_axis_format, label: t('Axis Format'), visibility: ({ controls }: ControlPanelsContainerProps) => - isXAxis ? isHorizental(controls) : isVertical(controls), + isXAxis ? isHorizontal(controls) : isVertical(controls), }, }, ], @@ -207,7 +202,7 @@ function createAxisControl(axis: 'x' | 'y'): ControlSetRow[] { default: logAxis, description: t('Logarithmic axis'), visibility: ({ controls }: ControlPanelsContainerProps) => - isXAxis ? isHorizental(controls) : isVertical(controls), + isXAxis ? isHorizontal(controls) : isVertical(controls), }, }, ], @@ -221,7 +216,7 @@ function createAxisControl(axis: 'x' | 'y'): ControlSetRow[] { default: minorSplitLine, description: t('Draw split lines for minor axis ticks'), visibility: ({ controls }: ControlPanelsContainerProps) => - isXAxis ? isHorizental(controls) : isVertical(controls), + isXAxis ? isHorizontal(controls) : isVertical(controls), }, }, ], @@ -235,7 +230,7 @@ function createAxisControl(axis: 'x' | 'y'): ControlSetRow[] { renderTrigger: true, description: t('It’s not recommended to truncate axis in Bar chart.'), visibility: ({ controls }: ControlPanelsContainerProps) => - isXAxis ? isHorizental(controls) : isVertical(controls), + isXAxis ? isHorizontal(controls) : isVertical(controls), }, }, ], @@ -255,7 +250,7 @@ function createAxisControl(axis: 'x' | 'y'): ControlSetRow[] { ), visibility: ({ controls }: ControlPanelsContainerProps) => Boolean(controls?.truncateYAxis?.value) && - (isXAxis ? isHorizental(controls) : isVertical(controls)), + (isXAxis ? isHorizontal(controls) : isVertical(controls)), }, }, ], @@ -264,39 +259,8 @@ function createAxisControl(axis: 'x' | 'y'): ControlSetRow[] { const config: ControlPanelConfig = { controlPanelSections: [ - sections.legacyTimeseriesTime, - { - label: t('Query'), - expanded: true, - controlSetRows: [ - isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) ? [xAxisControl] : [], - ['metrics'], - ['groupby'], - [ - { - name: 'contributionMode', - config: { - type: 'SelectControl', - label: t('Contribution Mode'), - default: contributionMode, - choices: [ - [null, 'None'], - [EchartsTimeseriesContributionType.Row, 'Row'], - [EchartsTimeseriesContributionType.Column, 'Series'], - ], - description: t('Calculate contribution per series or row'), - }, - }, - ], - ['adhoc_filters'], - emitFilterControl, - ['limit'], - ['timeseries_limit_metric'], - ['order_desc'], - ['row_limit'], - ['truncate_metric'], - ], - }, + sections.genericTime, + sections.echartsTimeSeriesQueryWithXAxisSort, sections.advancedAnalyticsControls, sections.annotationsAndLayersControls, sections.forecastIntervalControls, @@ -360,15 +324,10 @@ const config: ControlPanelConfig = { ], }, ], - controlOverrides: { - row_limit: { - default: rowLimit, - }, - }, - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, - groupby: formData.standardizedFormData.standardizedState.columns, + metrics: getStandardizedControls().popAllMetrics(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts index 0ffc09098c70..de0050edaa94 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts @@ -21,19 +21,18 @@ import { Behavior, ChartMetadata, ChartPlugin, - FeatureFlag, - isFeatureEnabled, + hasGenericChartAxes, t, } from '@superset-ui/core'; -import buildQuery from '../../buildQuery'; -import controlPanel from './controlPanel'; -import transformProps from '../../transformProps'; -import thumbnail from './images/thumbnail.png'; import { EchartsTimeseriesChartProps, EchartsTimeseriesFormData, EchartsTimeseriesSeriesType, } from '../../types'; +import buildQuery from '../../buildQuery'; +import controlPanel from './controlPanel'; +import transformProps from '../../transformProps'; +import thumbnail from './images/thumbnail.png'; import example1 from './images/Bar1.png'; import example2 from './images/Bar2.png'; import example3 from './images/Bar3.png'; @@ -57,10 +56,10 @@ export default class EchartsTimeseriesBarChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('../../EchartsTimeseries'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Evolution'), credits: ['https://echarts.apache.org'], - description: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + description: hasGenericChartAxes ? t('Bar Charts are used to show metrics as a series of bars.') : t( 'Time-series Bar Charts are used to show the changes in a metric over time as a series of bars.', @@ -76,9 +75,7 @@ export default class EchartsTimeseriesBarChartPlugin extends ChartPlugin< AnnotationType.Interval, AnnotationType.Timeseries, ], - name: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) - ? t('Bar Chart v2') - : t('Time-series Bar Chart v2'), + name: hasGenericChartAxes ? t('Bar Chart') : t('Time-series Bar Chart'), tags: [ t('ECharts'), t('Predictive'), diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx similarity index 78% rename from superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx rename to superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx index d039a059c590..0ceb518b8834 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx @@ -17,31 +17,29 @@ * under the License. */ import React from 'react'; -import { FeatureFlag, isFeatureEnabled, t } from '@superset-ui/core'; +import { t } from '@superset-ui/core'; import { ControlPanelConfig, ControlPanelsContainerProps, D3_TIME_FORMAT_DOCS, + getStandardizedControls, sections, sharedControls, - emitFilterControl, } from '@superset-ui/chart-controls'; +import { EchartsTimeseriesSeriesType } from '../../types'; import { DEFAULT_FORM_DATA, - EchartsTimeseriesContributionType, - EchartsTimeseriesSeriesType, -} from './types'; + TIME_SERIES_DESCRIPTION_TEXT, +} from '../../constants'; import { legendSection, richTooltipSection, showValueSection, - xAxisControl, -} from '../controls'; +} from '../../../controls'; const { area, - contributionMode, logAxis, markerEnabled, markerSize, @@ -56,39 +54,8 @@ const { } = DEFAULT_FORM_DATA; const config: ControlPanelConfig = { controlPanelSections: [ - sections.legacyTimeseriesTime, - { - label: t('Query'), - expanded: true, - controlSetRows: [ - isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) ? [xAxisControl] : [], - ['metrics'], - ['groupby'], - [ - { - name: 'contributionMode', - config: { - type: 'SelectControl', - label: t('Contribution Mode'), - default: contributionMode, - choices: [ - [null, 'None'], - [EchartsTimeseriesContributionType.Row, 'Row'], - [EchartsTimeseriesContributionType.Column, 'Series'], - ], - description: t('Calculate contribution per series or row'), - }, - }, - ], - ['adhoc_filters'], - emitFilterControl, - ['limit'], - ['timeseries_limit_metric'], - ['order_desc'], - ['row_limit'], - ['truncate_metric'], - ], - }, + sections.genericTime, + sections.echartsTimeSeriesQuery, sections.advancedAnalyticsControls, sections.annotationsAndLayersControls, sections.forecastIntervalControls, @@ -107,13 +74,13 @@ const config: ControlPanelConfig = { renderTrigger: true, default: seriesType, choices: [ - [EchartsTimeseriesSeriesType.Line, 'Line'], - [EchartsTimeseriesSeriesType.Scatter, 'Scatter'], - [EchartsTimeseriesSeriesType.Smooth, 'Smooth Line'], - [EchartsTimeseriesSeriesType.Bar, 'Bar'], - [EchartsTimeseriesSeriesType.Start, 'Step - start'], - [EchartsTimeseriesSeriesType.Middle, 'Step - middle'], - [EchartsTimeseriesSeriesType.End, 'Step - end'], + [EchartsTimeseriesSeriesType.Line, t('Line')], + [EchartsTimeseriesSeriesType.Scatter, t('Scatter')], + [EchartsTimeseriesSeriesType.Smooth, t('Smooth Line')], + [EchartsTimeseriesSeriesType.Bar, t('Bar')], + [EchartsTimeseriesSeriesType.Start, t('Step - start')], + [EchartsTimeseriesSeriesType.Middle, t('Step - middle')], + [EchartsTimeseriesSeriesType.End, t('Step - end')], ], description: t('Series chart type (line, bar etc)'), }, @@ -205,9 +172,7 @@ const config: ControlPanelConfig = { config: { ...sharedControls.x_axis_time_format, default: 'smart_date', - description: `${D3_TIME_FORMAT_DOCS}. ${t( - 'When using other than adaptive formatting, labels may overlap.', - )}`, + description: `${D3_TIME_FORMAT_DOCS}. ${TIME_SERIES_DESCRIPTION_TEXT}`, }, }, ], @@ -300,10 +265,10 @@ const config: ControlPanelConfig = { default: rowLimit, }, }, - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, - groupby: formData.standardizedFormData.standardizedState.columns, + metrics: getStandardizedControls().popAllMetrics(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts index 6f4a780c36fc..b6f7f1fceb2b 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts @@ -21,19 +21,18 @@ import { Behavior, ChartMetadata, ChartPlugin, - FeatureFlag, - isFeatureEnabled, + hasGenericChartAxes, t, } from '@superset-ui/core'; -import buildQuery from '../../buildQuery'; -import controlPanel from '../controlPanel'; -import transformProps from '../../transformProps'; -import thumbnail from './images/thumbnail.png'; import { EchartsTimeseriesChartProps, EchartsTimeseriesFormData, EchartsTimeseriesSeriesType, } from '../../types'; +import buildQuery from '../../buildQuery'; +import controlPanel from './controlPanel'; +import transformProps from '../../transformProps'; +import thumbnail from './images/thumbnail.png'; import example1 from './images/Line1.png'; import example2 from './images/Line2.png'; @@ -56,10 +55,10 @@ export default class EchartsTimeseriesLineChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('../../EchartsTimeseries'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Evolution'), credits: ['https://echarts.apache.org'], - description: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + description: hasGenericChartAxes ? t( 'Line chart is used to visualize measurements taken over a given category. Line chart is a type of chart which displays information as a series of data points connected by straight line segments. It is a basic type of chart common in many fields.', ) @@ -73,7 +72,7 @@ export default class EchartsTimeseriesLineChartPlugin extends ChartPlugin< AnnotationType.Interval, AnnotationType.Timeseries, ], - name: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + name: hasGenericChartAxes ? t('Line Chart') : t('Time-series Line Chart'), tags: [ diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx index fd2fa7965130..9e36db0d3b3a 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx @@ -17,22 +17,24 @@ * under the License. */ import React from 'react'; -import { FeatureFlag, isFeatureEnabled, t } from '@superset-ui/core'; +import { t } from '@superset-ui/core'; import { ControlPanelConfig, ControlPanelsContainerProps, D3_TIME_FORMAT_DOCS, - emitFilterControl, + getStandardizedControls, sections, sharedControls, } from '@superset-ui/chart-controls'; -import { DEFAULT_FORM_DATA } from '../../types'; +import { + DEFAULT_FORM_DATA, + TIME_SERIES_DESCRIPTION_TEXT, +} from '../../constants'; import { legendSection, richTooltipSection, showValueSection, - xAxisControl, } from '../../../controls'; const { @@ -48,23 +50,8 @@ const { } = DEFAULT_FORM_DATA; const config: ControlPanelConfig = { controlPanelSections: [ - sections.legacyTimeseriesTime, - { - label: t('Query'), - expanded: true, - controlSetRows: [ - isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) ? [xAxisControl] : [], - ['metrics'], - ['groupby'], - ['adhoc_filters'], - emitFilterControl, - ['limit'], - ['timeseries_limit_metric'], - ['order_desc'], - ['row_limit'], - ['truncate_metric'], - ], - }, + sections.genericTime, + sections.echartsTimeSeriesQuery, sections.advancedAnalyticsControls, sections.annotationsAndLayersControls, sections.forecastIntervalControls, @@ -128,9 +115,7 @@ const config: ControlPanelConfig = { config: { ...sharedControls.x_axis_time_format, default: 'smart_date', - description: `${D3_TIME_FORMAT_DOCS}. ${t( - 'When using other than adaptive formatting, labels may overlap.', - )}`, + description: `${D3_TIME_FORMAT_DOCS}. ${TIME_SERIES_DESCRIPTION_TEXT}`, }, }, ], @@ -224,10 +209,10 @@ const config: ControlPanelConfig = { default: rowLimit, }, }, - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, - groupby: formData.standardizedFormData.standardizedState.columns, + metrics: getStandardizedControls().popAllMetrics(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts index 7c77868a5845..489983cfa606 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts @@ -21,19 +21,18 @@ import { Behavior, ChartMetadata, ChartPlugin, - FeatureFlag, - isFeatureEnabled, + hasGenericChartAxes, t, } from '@superset-ui/core'; -import buildQuery from '../../buildQuery'; -import controlPanel from './controlPanel'; -import transformProps from '../../transformProps'; -import thumbnail from './images/thumbnail.png'; import { EchartsTimeseriesChartProps, EchartsTimeseriesFormData, EchartsTimeseriesSeriesType, } from '../../types'; +import buildQuery from '../../buildQuery'; +import controlPanel from './controlPanel'; +import transformProps from '../../transformProps'; +import thumbnail from './images/thumbnail.png'; import example1 from './images/Scatter1.png'; const scatterTransformProps = (chartProps: EchartsTimeseriesChartProps) => @@ -55,10 +54,10 @@ export default class EchartsTimeseriesScatterChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('../../EchartsTimeseries'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Evolution'), credits: ['https://echarts.apache.org'], - description: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + description: hasGenericChartAxes ? t( 'Scatter Plot has the horizontal axis in linear units, and the points are connected in order. It shows a statistical relationship between two variables.', ) @@ -72,7 +71,7 @@ export default class EchartsTimeseriesScatterChartPlugin extends ChartPlugin< AnnotationType.Interval, AnnotationType.Timeseries, ], - name: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + name: hasGenericChartAxes ? t('Scatter Plot') : t('Time-series Scatter Plot'), tags: [ diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx similarity index 79% rename from superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx rename to superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx index 8dc34861b133..bfb7671ddbf3 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx @@ -17,26 +17,27 @@ * under the License. */ import React from 'react'; -import { FeatureFlag, isFeatureEnabled, t } from '@superset-ui/core'; +import { t } from '@superset-ui/core'; import { ControlPanelConfig, ControlPanelsContainerProps, D3_TIME_FORMAT_DOCS, - emitFilterControl, + getStandardizedControls, sections, sharedControls, } from '@superset-ui/chart-controls'; -import { DEFAULT_FORM_DATA, EchartsTimeseriesContributionType } from '../types'; +import { + DEFAULT_FORM_DATA, + TIME_SERIES_DESCRIPTION_TEXT, +} from '../../constants'; import { legendSection, richTooltipSection, showValueSectionWithoutStack, - xAxisControl, -} from '../../controls'; +} from '../../../controls'; const { - contributionMode, logAxis, markerEnabled, markerSize, @@ -49,39 +50,8 @@ const { } = DEFAULT_FORM_DATA; const config: ControlPanelConfig = { controlPanelSections: [ - sections.legacyTimeseriesTime, - { - label: t('Query'), - expanded: true, - controlSetRows: [ - isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) ? [xAxisControl] : [], - ['metrics'], - ['groupby'], - [ - { - name: 'contributionMode', - config: { - type: 'SelectControl', - label: t('Contribution Mode'), - default: contributionMode, - choices: [ - [null, 'None'], - [EchartsTimeseriesContributionType.Row, 'Row'], - [EchartsTimeseriesContributionType.Column, 'Series'], - ], - description: t('Calculate contribution per series or row'), - }, - }, - ], - ['adhoc_filters'], - emitFilterControl, - ['limit'], - ['timeseries_limit_metric'], - ['order_desc'], - ['row_limit'], - ['truncate_metric'], - ], - }, + sections.genericTime, + sections.echartsTimeSeriesQuery, sections.advancedAnalyticsControls, sections.annotationsAndLayersControls, sections.forecastIntervalControls, @@ -144,9 +114,7 @@ const config: ControlPanelConfig = { config: { ...sharedControls.x_axis_time_format, default: 'smart_date', - description: `${D3_TIME_FORMAT_DOCS}. ${t( - 'When using other than adaptive formatting, labels may overlap.', - )}`, + description: `${D3_TIME_FORMAT_DOCS}. ${TIME_SERIES_DESCRIPTION_TEXT}`, }, }, ], @@ -241,10 +209,10 @@ const config: ControlPanelConfig = { default: rowLimit, }, }, - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, - groupby: formData.standardizedFormData.standardizedState.columns, + metrics: getStandardizedControls().popAllMetrics(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts index ee348b272cd4..ae6dc7ad30bc 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts @@ -21,19 +21,18 @@ import { Behavior, ChartMetadata, ChartPlugin, - FeatureFlag, - isFeatureEnabled, + hasGenericChartAxes, t, } from '@superset-ui/core'; -import buildQuery from '../../buildQuery'; -import controlPanel from '../controlPanel'; -import transformProps from '../../transformProps'; -import thumbnail from './images/thumbnail.png'; import { EchartsTimeseriesChartProps, EchartsTimeseriesFormData, EchartsTimeseriesSeriesType, } from '../../types'; +import buildQuery from '../../buildQuery'; +import controlPanel from './controlPanel'; +import transformProps from '../../transformProps'; +import thumbnail from './images/thumbnail.png'; import example1 from './images/SmoothLine1.png'; const smoothTransformProps = (chartProps: EchartsTimeseriesChartProps) => @@ -55,10 +54,10 @@ export default class EchartsTimeseriesSmoothLineChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('../../EchartsTimeseries'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Evolution'), credits: ['https://echarts.apache.org'], - description: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + description: hasGenericChartAxes ? t( 'Smooth-line is a variation of the line chart. Without angles and hard edges, Smooth-line sometimes looks smarter and more professional.', ) @@ -72,7 +71,7 @@ export default class EchartsTimeseriesSmoothLineChartPlugin extends ChartPlugin< AnnotationType.Interval, AnnotationType.Timeseries, ], - name: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + name: hasGenericChartAxes ? t('Smooth Line') : t('Time-series Smooth Line'), tags: [ diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx index 290293733386..6a8e6eef1778 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx @@ -17,31 +17,26 @@ * under the License. */ import React from 'react'; -import { FeatureFlag, isFeatureEnabled, t } from '@superset-ui/core'; +import { t } from '@superset-ui/core'; import { ControlPanelConfig, ControlPanelsContainerProps, D3_TIME_FORMAT_DOCS, + getStandardizedControls, sections, sharedControls, - emitFilterControl, } from '@superset-ui/chart-controls'; -import { - DEFAULT_FORM_DATA, - EchartsTimeseriesContributionType, - EchartsTimeseriesSeriesType, -} from '../types'; +import { EchartsTimeseriesSeriesType } from '../../types'; +import { DEFAULT_FORM_DATA, TIME_SERIES_DESCRIPTION_TEXT } from '../constants'; import { legendSection, richTooltipSection, showValueSection, - xAxisControl, } from '../../controls'; const { area, - contributionMode, logAxis, markerEnabled, markerSize, @@ -55,39 +50,8 @@ const { } = DEFAULT_FORM_DATA; const config: ControlPanelConfig = { controlPanelSections: [ - sections.legacyTimeseriesTime, - { - label: t('Query'), - expanded: true, - controlSetRows: [ - isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) ? [xAxisControl] : [], - ['metrics'], - ['groupby'], - [ - { - name: 'contributionMode', - config: { - type: 'SelectControl', - label: t('Contribution Mode'), - default: contributionMode, - choices: [ - [null, 'None'], - [EchartsTimeseriesContributionType.Row, 'Row'], - [EchartsTimeseriesContributionType.Column, 'Series'], - ], - description: t('Calculate contribution per series or row'), - }, - }, - ], - ['adhoc_filters'], - emitFilterControl, - ['limit'], - ['timeseries_limit_metric'], - ['order_desc'], - ['row_limit'], - ['truncate_metric'], - ], - }, + sections.genericTime, + sections.echartsTimeSeriesQuery, sections.advancedAnalyticsControls, sections.annotationsAndLayersControls, sections.forecastIntervalControls, @@ -106,9 +70,9 @@ const config: ControlPanelConfig = { renderTrigger: true, default: EchartsTimeseriesSeriesType.Start, choices: [ - [EchartsTimeseriesSeriesType.Start, 'Start'], - [EchartsTimeseriesSeriesType.Middle, 'Middle'], - [EchartsTimeseriesSeriesType.End, 'End'], + [EchartsTimeseriesSeriesType.Start, t('Start')], + [EchartsTimeseriesSeriesType.Middle, t('Middle')], + [EchartsTimeseriesSeriesType.End, t('End')], ], description: t( 'Defines whether the step should appear at the beginning, middle or end between two data points', @@ -202,9 +166,7 @@ const config: ControlPanelConfig = { config: { ...sharedControls.x_axis_time_format, default: 'smart_date', - description: `${D3_TIME_FORMAT_DOCS}. ${t( - 'When using other than adaptive formatting, labels may overlap.', - )}`, + description: `${D3_TIME_FORMAT_DOCS}. ${TIME_SERIES_DESCRIPTION_TEXT}`, }, }, ], @@ -297,10 +259,10 @@ const config: ControlPanelConfig = { default: rowLimit, }, }, - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, - groupby: formData.standardizedFormData.standardizedState.columns, + metrics: getStandardizedControls().popAllMetrics(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts index 2a24b708419e..3fdeb5aa832a 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts @@ -21,18 +21,17 @@ import { Behavior, ChartMetadata, ChartPlugin, - FeatureFlag, - isFeatureEnabled, + hasGenericChartAxes, t, } from '@superset-ui/core'; +import { + EchartsTimeseriesChartProps, + EchartsTimeseriesFormData, +} from '@superset-ui/plugin-chart-echarts'; import buildQuery from '../buildQuery'; import controlPanel from './controlPanel'; import transformProps from '../transformProps'; import thumbnail from './images/thumbnail.png'; -import { - EchartsTimeseriesChartProps, - EchartsTimeseriesFormData, -} from '../types'; import example1 from './images/Step1.png'; import example2 from './images/Step2.png'; @@ -46,10 +45,10 @@ export default class EchartsTimeseriesStepChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('../EchartsTimeseries'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Evolution'), credits: ['https://echarts.apache.org'], - description: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + description: hasGenericChartAxes ? t( 'Stepped-line graph (also called step chart) is a variation of line chart but with the line forming a series of steps between data points. A step chart can be useful when you want to show the changes that occur at irregular intervals.', ) @@ -63,7 +62,7 @@ export default class EchartsTimeseriesStepChartPlugin extends ChartPlugin< AnnotationType.Interval, AnnotationType.Timeseries, ], - name: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + name: hasGenericChartAxes ? t('Stepped Line') : t('Time-series Stepped Line'), tags: [ diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/buildQuery.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/buildQuery.ts index 085635209ac2..ad021f92b918 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/buildQuery.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/buildQuery.ts @@ -18,11 +18,12 @@ */ import { buildQueryContext, - DTTM_ALIAS, ensureIsArray, normalizeOrderBy, PostProcessingPivot, QueryFormData, + getXAxisColumn, + isXAxisSet, } from '@superset-ui/core'; import { rollingWindowOperator, @@ -35,11 +36,11 @@ import { prophetOperator, timeComparePivotOperator, flattenOperator, + sortOperator, } from '@superset-ui/chart-controls'; export default function buildQuery(formData: QueryFormData) { - const { x_axis, groupby } = formData; - const is_timeseries = x_axis === DTTM_ALIAS || !x_axis; + const { groupby } = formData; return buildQueryContext(formData, baseQueryObject => { /* the `pivotOperatorInRuntime` determines how to pivot the dataframe returned from the raw query. 1. If it's a time compared query, there will return a pivoted dataframe that append time compared metrics. for instance: @@ -66,18 +67,19 @@ export default function buildQuery(formData: QueryFormData) { baseQueryObject, ) ? timeComparePivotOperator(formData, baseQueryObject) - : pivotOperator(formData, { - ...baseQueryObject, - index: x_axis, - is_timeseries, - }); + : pivotOperator(formData, baseQueryObject); return [ { ...baseQueryObject, - columns: [...ensureIsArray(x_axis), ...ensureIsArray(groupby)], + columns: [ + ...(isXAxisSet(formData) + ? ensureIsArray(getXAxisColumn(formData)) + : []), + ...ensureIsArray(groupby), + ], series_columns: groupby, - is_timeseries, + ...(isXAxisSet(formData) ? {} : { is_timeseries: true }), // todo: move `normalizeOrderBy to extractQueryFields` orderby: normalizeOrderBy(baseQueryObject).orderby, time_offsets: isTimeComparison(formData, baseQueryObject) @@ -92,11 +94,9 @@ export default function buildQuery(formData: QueryFormData) { rollingWindowOperator(formData, baseQueryObject), timeCompareOperator(formData, baseQueryObject), resampleOperator(formData, baseQueryObject), - renameOperator(formData, { - ...baseQueryObject, - is_timeseries, - }), + renameOperator(formData, baseQueryObject), contributionOperator(formData, baseQueryObject), + sortOperator(formData, baseQueryObject), flattenOperator(formData, baseQueryObject), // todo: move prophet before flatten prophetOperator(formData, baseQueryObject), diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/constants.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/constants.ts new file mode 100644 index 000000000000..1d7b87194493 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/constants.ts @@ -0,0 +1,70 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { sections } from '@superset-ui/chart-controls'; +import { t } from '@superset-ui/core'; +import { + OrientationType, + EchartsTimeseriesSeriesType, + EchartsTimeseriesFormData, +} from './types'; +import { + DEFAULT_LEGEND_FORM_DATA, + DEFAULT_TITLE_FORM_DATA, +} from '../constants'; + +// @ts-ignore +export const DEFAULT_FORM_DATA: EchartsTimeseriesFormData = { + ...DEFAULT_LEGEND_FORM_DATA, + ...DEFAULT_TITLE_FORM_DATA, + annotationLayers: sections.annotationLayers, + area: false, + forecastEnabled: sections.FORECAST_DEFAULT_DATA.forecastEnabled, + forecastInterval: sections.FORECAST_DEFAULT_DATA.forecastInterval, + forecastPeriods: sections.FORECAST_DEFAULT_DATA.forecastPeriods, + forecastSeasonalityDaily: + sections.FORECAST_DEFAULT_DATA.forecastSeasonalityDaily, + forecastSeasonalityWeekly: + sections.FORECAST_DEFAULT_DATA.forecastSeasonalityWeekly, + forecastSeasonalityYearly: + sections.FORECAST_DEFAULT_DATA.forecastSeasonalityYearly, + logAxis: false, + markerEnabled: false, + markerSize: 6, + minorSplitLine: false, + opacity: 0.2, + orderDesc: true, + rowLimit: 10000, + seriesType: EchartsTimeseriesSeriesType.Line, + stack: false, + tooltipTimeFormat: 'smart_date', + truncateYAxis: false, + yAxisBounds: [null, null], + zoomable: false, + richTooltip: true, + xAxisLabelRotation: 0, + groupby: [], + showValue: false, + onlyTotal: false, + percentageThreshold: 0, + orientation: OrientationType.vertical, +}; + +export const TIME_SERIES_DESCRIPTION_TEXT: string = t( + 'When using other than adaptive formatting, labels may overlap', +); diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts index 062d741402ff..c8210cd98191 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts @@ -21,12 +21,11 @@ import { Behavior, ChartMetadata, ChartPlugin, - FeatureFlag, - isFeatureEnabled, + hasGenericChartAxes, t, } from '@superset-ui/core'; import buildQuery from './buildQuery'; -import controlPanel from './controlPanel'; +import controlPanel from './Regular/Line/controlPanel'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; import { @@ -45,15 +44,15 @@ export default class EchartsTimeseriesChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('./EchartsTimeseries'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Evolution'), credits: ['https://echarts.apache.org'], - description: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) + description: hasGenericChartAxes ? t( - 'Swiss army knife for visualizing data. Choose between step, line, scatter, and bar charts. This viz type has many customization options as well.', + 'Swiss army knife for visualizing data. Choose between step, line, scatter, and bar charts. This viz type has many customization options as well.', ) : t( - 'Swiss army knife for visualizing time series data. Choose between step, line, scatter, and bar charts. This viz type has many customization options as well.', + 'Swiss army knife for visualizing time series data. Choose between step, line, scatter, and bar charts. This viz type has many customization options as well.', ), exampleGallery: [{ url: example }], supportedAnnotationTypes: [ @@ -62,9 +61,7 @@ export default class EchartsTimeseriesChartPlugin extends ChartPlugin< AnnotationType.Interval, AnnotationType.Timeseries, ], - name: isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) - ? t('Generic Chart') - : t('Time-series Chart'), + name: hasGenericChartAxes ? t('Generic Chart') : t('Time-series Chart'), tags: [ t('Advanced-Analytics'), t('Aesthetic'), diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts index bf20dc516611..eadded44a9ac 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts @@ -20,10 +20,7 @@ import { AnnotationLayer, CategoricalColorNamespace, - DataRecordValue, - DTTM_ALIAS, GenericDataType, - getColumnLabel, getNumberFormatter, isEventAnnotationLayer, isFormulaAnnotationLayer, @@ -31,19 +28,23 @@ import { isTimeseriesAnnotationLayer, TimeseriesChartDataResponseResult, t, + AxisType, + getXAxisLabel, + isPhysicalColumn, + isDefined, } from '@superset-ui/core'; import { isDerivedSeries } from '@superset-ui/chart-controls'; import { EChartsCoreOption, SeriesOption } from 'echarts'; import { ZRLineType } from 'echarts/types/src/util/types'; import { - DEFAULT_FORM_DATA, EchartsTimeseriesChartProps, EchartsTimeseriesFormData, EchartsTimeseriesSeriesType, TimeseriesChartTransformedProps, OrientationType, } from './types'; -import { ForecastSeriesEnum, ForecastValue } from '../types'; +import { DEFAULT_FORM_DATA } from './constants'; +import { ForecastSeriesEnum, ForecastValue, Refs } from '../types'; import { parseYAxisBound } from '../utils/controls'; import { currentSeries, @@ -67,7 +68,7 @@ import { rebaseForecastDatum, } from '../utils/forecast'; import { convertInteger } from '../utils/convertInteger'; -import { defaultGrid, defaultTooltip, defaultYAxis } from '../defaults'; +import { defaultGrid, defaultYAxis } from '../defaults'; import { getPadding, getTooltipTimeFormatter, @@ -83,6 +84,7 @@ import { TIMESERIES_CONSTANTS, TIMEGRAIN_TO_TIMESTAMP, } from '../constants'; +import { getDefaultTooltip } from '../utils/tooltip'; export default function transformProps( chartProps: EchartsTimeseriesChartProps, @@ -96,10 +98,13 @@ export default function transformProps( queriesData, datasource, theme, + inContextMenu, + emitCrossFilters, } = chartProps; const { verboseMap = {} } = datasource; const [queryData] = queriesData; - const { data = [] } = queryData as TimeseriesChartDataResponseResult; + const { data = [], label_map: labelMap } = + queryData as TimeseriesChartDataResponseResult; const dataTypes = getColtypesMapping(queryData); const annotationData = getAnnotationData(chartProps); @@ -130,7 +135,6 @@ export default function transformProps( richTooltip, xAxis: xAxisOrig, xAxisLabelRotation, - emitFilter, groupby, showValue, onlyTotal, @@ -144,23 +148,29 @@ export default function transformProps( timeGrainSqla, orientation, }: EchartsTimeseriesFormData = { ...DEFAULT_FORM_DATA, ...formData }; + const refs: Refs = {}; const colorScale = CategoricalColorNamespace.getScale(colorScheme as string); const rebasedData = rebaseForecastDatum(data, verboseMap); - const xAxisCol = - verboseMap[xAxisOrig] || getColumnLabel(xAxisOrig || DTTM_ALIAS); + let xAxisLabel = getXAxisLabel(chartProps.rawFormData) as string; + if ( + isPhysicalColumn(chartProps.rawFormData?.x_axis) && + isDefined(verboseMap[xAxisLabel]) + ) { + xAxisLabel = verboseMap[xAxisLabel]; + } const isHorizontal = orientation === OrientationType.horizontal; const { totalStackedValues, thresholdValues } = extractDataTotalValues( rebasedData, { stack, percentageThreshold, - xAxisCol, + xAxisCol: xAxisLabel, }, ); const rawSeries = extractSeries(rebasedData, { fillNeighborValue: stack && !forecastEnabled ? 0 : undefined, - xAxis: xAxisCol, + xAxis: xAxisLabel, removeNulls: seriesType === EchartsTimeseriesSeriesType.Scatter, stack, totalStackedValues, @@ -175,7 +185,7 @@ export default function transformProps( Object.values(rawSeries).map(series => series.name as string), ); const isAreaExpand = stack === AreaChartExtraControlsValue.Expand; - const xAxisDataType = dataTypes?.[xAxisCol] ?? dataTypes?.[xAxisOrig]; + const xAxisDataType = dataTypes?.[xAxisLabel] ?? dataTypes?.[xAxisOrig]; const xAxisType = getAxisType(xAxisDataType); const series: SeriesOption[] = []; @@ -226,7 +236,14 @@ export default function transformProps( .forEach((layer: AnnotationLayer) => { if (isFormulaAnnotationLayer(layer)) series.push( - transformFormulaAnnotation(layer, data, colorScale, sliceId), + transformFormulaAnnotation( + layer, + data, + xAxisLabel, + xAxisType, + colorScale, + sliceId, + ), ); else if (isIntervalAnnotationLayer(layer)) { series.push( @@ -282,20 +299,10 @@ export default function transformProps( ? getXAxisFormatter(xAxisTimeFormat) : String; - const labelMap = series.reduce( - (acc: Record<string, DataRecordValue[]>, datum) => { - const name: string = datum.name as string; - return { - ...acc, - [name]: [name], - }; - }, - {}, - ); - const { setDataMask = () => {}, - setControlValue = (...args: unknown[]) => {}, + setControlValue = () => {}, + onContextMenu, } = hooks; const addYAxisLabelOffset = !!yAxisTitle; @@ -332,13 +339,23 @@ export default function transformProps( rotate: xAxisLabelRotation, }, minInterval: - xAxisType === 'time' && timeGrainSqla + xAxisType === AxisType.time && timeGrainSqla ? TIMEGRAIN_TO_TIMESTAMP[timeGrainSqla] : 0, }; + + if (xAxisType === AxisType.time) { + /** + * Overriding default behavior (false) for time axis regardless of the granilarity. + * Not including this in the initial declaration above so if echarts changes the default + * behavior for other axist types we won't unintentionally override it + */ + xAxis.axisLabel.showMaxLabel = null; + } + let yAxis: any = { ...defaultYAxis, - type: logAxis ? 'log' : 'value', + type: logAxis ? AxisType.log : AxisType.value, min, max, minorTick: { show: true }, @@ -364,8 +381,8 @@ export default function transformProps( xAxis, yAxis, tooltip: { - ...defaultTooltip, - appendToBody: true, + ...getDefaultTooltip(refs), + show: !inContextMenu, trigger: richTooltip ? 'axis' : 'item', formatter: (params: any) => { const [xIndex, yIndex] = isHorizontal ? [1, 0] : [0, 1]; @@ -431,7 +448,7 @@ export default function transformProps( return { echartOptions, - emitFilter, + emitCrossFilters, formData, groupby, height, @@ -441,5 +458,12 @@ export default function transformProps( setControlValue, width, legendData, + onContextMenu, + xValueFormatter: tooltipFormatter, + xAxis: { + label: xAxisLabel, + type: xAxisType, + }, + refs, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformers.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformers.ts index 420662647d9d..b49f9f546bd2 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformers.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformers.ts @@ -33,6 +33,7 @@ import { TimeFormatter, TimeseriesAnnotationLayer, TimeseriesDataRecord, + AxisType, } from '@superset-ui/core'; import { SeriesOption } from 'echarts'; import { @@ -92,6 +93,7 @@ export function transformSeries( sliceId?: number; isHorizontal?: boolean; lineStyle?: LineStyleOption; + queryIndex?: number; }, ): SeriesOption | undefined { const { name } = series; @@ -115,6 +117,7 @@ export function transformSeries( seriesKey, sliceId, isHorizontal = false, + queryIndex = 0, } = opts; const contexts = seriesContexts[name || ''] || []; const hasForecast = @@ -192,6 +195,7 @@ export function transformSeries( : { ...opts.lineStyle, opacity }; return { ...series, + queryIndex, yAxisIndex, name: forecastSeries.name, itemStyle, @@ -204,6 +208,7 @@ export function transformSeries( ? seriesType : undefined, stack: stackId, + stackStrategy: isConfidenceBand ? 'all' : 'samesign', lineStyle, areaStyle: area || forecastSeries.type === ForecastSeriesEnum.ForecastUpper @@ -253,6 +258,8 @@ export function transformSeries( export function transformFormulaAnnotation( layer: FormulaAnnotationLayer, data: TimeseriesDataRecord[], + xAxisCol: string, + xAxisType: AxisType, colorScale: CategoricalColorScale, sliceId?: number, ): SeriesOption { @@ -270,7 +277,7 @@ export function transformFormulaAnnotation( }, type: 'line', smooth: true, - data: evalFormula(layer, data), + data: evalFormula(layer, data, xAxisCol, xAxisType), symbolSize: 0, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/types.ts index d9b7708146df..56527ebd63bf 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/types.ts @@ -16,29 +16,26 @@ * specific language governing permissions and limitations * under the License. */ +import { OptionName } from 'echarts/types/src/util/types'; import { AnnotationLayer, - ChartDataResponseResult, - ChartProps, + AxisType, + ContributionType, QueryFormColumn, QueryFormData, + TimeFormatter, TimeGranularity, } from '@superset-ui/core'; -import { sections } from '@superset-ui/chart-controls'; import { - DEFAULT_LEGEND_FORM_DATA, - EchartsLegendFormData, - EChartTransformedProps, - EchartsTitleFormData, - DEFAULT_TITLE_FORM_DATA, + BaseChartProps, + BaseTransformedProps, + ContextMenuTransformedProps, + CrossFilterTransformedProps, + LegendFormData, StackType, + TitleFormData, } from '../types'; -export enum EchartsTimeseriesContributionType { - Row = 'row', - Column = 'column', -} - export enum OrientationType { vertical = 'vertical', horizontal = 'horizontal', @@ -58,7 +55,7 @@ export type EchartsTimeseriesFormData = QueryFormData & { annotationLayers: AnnotationLayer[]; area: boolean; colorScheme?: string; - contributionMode?: EchartsTimeseriesContributionType; + contributionMode?: ContributionType; forecastEnabled: boolean; forecastPeriods: number; forecastInterval: number; @@ -83,59 +80,28 @@ export type EchartsTimeseriesFormData = QueryFormData & { zoomable: boolean; richTooltip: boolean; xAxisLabelRotation: number; - emitFilter: boolean; groupby: QueryFormColumn[]; showValue: boolean; onlyTotal: boolean; showExtraControls: boolean; percentageThreshold: number; orientation?: OrientationType; -} & EchartsLegendFormData & - EchartsTitleFormData; - -// @ts-ignore -export const DEFAULT_FORM_DATA: EchartsTimeseriesFormData = { - ...DEFAULT_LEGEND_FORM_DATA, - annotationLayers: sections.annotationLayers, - area: false, - forecastEnabled: sections.FORECAST_DEFAULT_DATA.forecastEnabled, - forecastInterval: sections.FORECAST_DEFAULT_DATA.forecastInterval, - forecastPeriods: sections.FORECAST_DEFAULT_DATA.forecastPeriods, - forecastSeasonalityDaily: - sections.FORECAST_DEFAULT_DATA.forecastSeasonalityDaily, - forecastSeasonalityWeekly: - sections.FORECAST_DEFAULT_DATA.forecastSeasonalityWeekly, - forecastSeasonalityYearly: - sections.FORECAST_DEFAULT_DATA.forecastSeasonalityYearly, - logAxis: false, - markerEnabled: false, - markerSize: 6, - minorSplitLine: false, - opacity: 0.2, - orderDesc: true, - rowLimit: 10000, - seriesType: EchartsTimeseriesSeriesType.Line, - stack: false, - tooltipTimeFormat: 'smart_date', - truncateYAxis: false, - yAxisBounds: [null, null], - zoomable: false, - richTooltip: true, - xAxisLabelRotation: 0, - emitFilter: false, - groupby: [], - showValue: false, - onlyTotal: false, - percentageThreshold: 0, - orientation: OrientationType.vertical, - ...DEFAULT_TITLE_FORM_DATA, -}; +} & LegendFormData & + TitleFormData; export interface EchartsTimeseriesChartProps - extends ChartProps<EchartsTimeseriesFormData> { + extends BaseChartProps<EchartsTimeseriesFormData> { formData: EchartsTimeseriesFormData; - queriesData: ChartDataResponseResult[]; } export type TimeseriesChartTransformedProps = - EChartTransformedProps<EchartsTimeseriesFormData>; + BaseTransformedProps<EchartsTimeseriesFormData> & + ContextMenuTransformedProps & + CrossFilterTransformedProps & { + legendData?: OptionName[]; + xValueFormatter: TimeFormatter | StringConstructor; + xAxis: { + label: string; + type: AxisType; + }; + }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Tree/EchartsTree.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Tree/EchartsTree.tsx index 9b42c6e55357..b1b3f8e896e0 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Tree/EchartsTree.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Tree/EchartsTree.tsx @@ -21,9 +21,17 @@ import { EchartsProps } from '../types'; import Echart from '../components/Echart'; export default function EchartsGraph({ + echartOptions, height, + refs, width, - echartOptions, }: EchartsProps) { - return <Echart height={height} width={width} echartOptions={echartOptions} />; + return ( + <Echart + refs={refs} + height={height} + width={width} + echartOptions={echartOptions} + /> + ); } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Tree/constants.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Tree/constants.ts index 463835966cc7..35567c3fc593 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Tree/constants.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Tree/constants.ts @@ -17,6 +17,7 @@ * under the License. */ import { TreeSeriesOption } from 'echarts'; +import { EchartsTreeFormData } from './types'; export const DEFAULT_TREE_SERIES_OPTION: TreeSeriesOption = { label: { @@ -28,3 +29,18 @@ export const DEFAULT_TREE_SERIES_OPTION: TreeSeriesOption = { animationEasing: 'cubicOut', lineStyle: { color: 'source', width: 1.5 }, }; + +export const DEFAULT_FORM_DATA: Partial<EchartsTreeFormData> = { + id: '', + parent: '', + name: '', + rootNodeId: '', + layout: 'orthogonal', + orient: 'LR', + symbol: 'emptyCircle', + symbolSize: 7, + roam: true, + nodeLabelPosition: 'left', + childLabelPosition: 'bottom', + emphasis: 'descendant', +}; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx index c115f5c5c20d..a6ee81589a28 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx @@ -20,10 +20,11 @@ import React from 'react'; import { FeatureFlag, isFeatureEnabled, t } from '@superset-ui/core'; import { ControlPanelConfig, + getStandardizedControls, sections, sharedControls, } from '@superset-ui/chart-controls'; -import { DEFAULT_FORM_DATA } from './types'; +import { DEFAULT_FORM_DATA } from './constants'; const requiredEntity = { ...sharedControls.entity, @@ -160,7 +161,7 @@ const controlPanel: ControlPanelConfig = { ['right', t('right')], ['bottom', t('bottom')], ], - description: t('Position of intermidiate node label on tree'), + description: t('Position of intermediate node label on tree'), }, }, ], @@ -285,13 +286,9 @@ const controlPanel: ControlPanelConfig = { ], }, ], - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metric: formData.standardizedFormData.standardizedState.metrics[0], - }), - updateStandardizedState: (prevState, currState) => ({ - ...currState, - metrics: [currState.metrics[0], ...prevState.metrics.slice(1)], + metric: getStandardizedControls().shiftMetric(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Tree/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Tree/transformProps.ts index c89fbe8b3704..ca3a4a9341f8 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Tree/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Tree/transformProps.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { ChartProps, getMetricLabel, DataRecordValue } from '@superset-ui/core'; +import { getMetricLabel, DataRecordValue } from '@superset-ui/core'; import { EChartsCoreOption, TreeSeriesOption } from 'echarts'; import { TreeSeriesCallbackDataParams, @@ -24,12 +24,14 @@ import { } from 'echarts/types/src/chart/tree/TreeSeries'; import { OptionName } from 'echarts/types/src/util/types'; import { + EchartsTreeChartProps, EchartsTreeFormData, - DEFAULT_FORM_DATA as DEFAULT_GRAPH_FORM_DATA, TreeDataRecord, + TreeTransformedProps, } from './types'; -import { DEFAULT_TREE_SERIES_OPTION } from './constants'; -import { EchartsProps } from '../types'; +import { DEFAULT_FORM_DATA, DEFAULT_TREE_SERIES_OPTION } from './constants'; +import { Refs } from '../types'; +import { getDefaultTooltip } from '../utils/tooltip'; export function formatTooltip({ params, @@ -49,8 +51,11 @@ export function formatTooltip({ ].join(''); } -export default function transformProps(chartProps: ChartProps): EchartsProps { +export default function transformProps( + chartProps: EchartsTreeChartProps, +): TreeTransformedProps { const { width, height, formData, queriesData } = chartProps; + const refs: Refs = {}; const data: TreeDataRecord[] = queriesData[0].data || []; const { @@ -67,7 +72,7 @@ export default function transformProps(chartProps: ChartProps): EchartsProps { nodeLabelPosition, childLabelPosition, emphasis, - }: EchartsTreeFormData = { ...DEFAULT_GRAPH_FORM_DATA, ...formData }; + }: EchartsTreeFormData = { ...DEFAULT_FORM_DATA, ...formData }; const metricLabel = getMetricLabel(metric); const nameColumn = name || id; @@ -201,6 +206,7 @@ export default function transformProps(chartProps: ChartProps): EchartsProps { animationEasing: DEFAULT_TREE_SERIES_OPTION.animationEasing, series, tooltip: { + ...getDefaultTooltip(refs), trigger: 'item', triggerOn: 'mousemove', formatter: (params: any) => @@ -212,8 +218,10 @@ export default function transformProps(chartProps: ChartProps): EchartsProps { }; return { + formData, width, height, echartOptions, + refs, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Tree/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Tree/types.ts index 81db2d59508f..0fde0cde2a17 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Tree/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Tree/types.ts @@ -16,9 +16,12 @@ * specific language governing permissions and limitations * under the License. */ +import { OptionName } from 'echarts/types/src/util/types'; +import { ChartDataResponseResult, QueryFormData } from '@superset-ui/core'; import { TreeSeriesNodeItemOption } from 'echarts/types/src/chart/tree/TreeSeries'; +import { BaseChartProps, BaseTransformedProps } from '../types'; -export type EchartsTreeFormData = { +export type EchartsTreeFormData = QueryFormData & { id: string; parent: string; name: string; @@ -35,21 +38,18 @@ export type EchartsTreeFormData = { emphasis: 'none' | 'ancestor' | 'descendant'; }; -export const DEFAULT_FORM_DATA: EchartsTreeFormData = { - id: '', - parent: '', - name: '', - rootNodeId: '', - layout: 'orthogonal', - orient: 'LR', - symbol: 'emptyCircle', - symbolSize: 7, - roam: true, - nodeLabelPosition: 'left', - childLabelPosition: 'bottom', - emphasis: 'descendant', -}; +export interface TreeChartDataResponseResult extends ChartDataResponseResult { + data: TreeDataRecord[]; +} + +export interface EchartsTreeChartProps + extends BaseChartProps<EchartsTreeFormData> { + formData: EchartsTreeFormData; + queriesData: TreeChartDataResponseResult[]; +} -export type TreeDataRecord = Record<string, string | number> & { - children: TreeSeriesNodeItemOption[]; +export type TreeDataRecord = Record<string, OptionName> & { + children?: TreeSeriesNodeItemOption[]; }; + +export type TreeTransformedProps = BaseTransformedProps<EchartsTreeFormData>; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/EchartsTreemap.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/EchartsTreemap.tsx index 2932dc327ddc..0a2f01b4049c 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/EchartsTreemap.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/EchartsTreemap.tsx @@ -16,25 +16,32 @@ * specific language governing permissions and limitations * under the License. */ +import { + DataRecordValue, + BinaryQueryObjectFilterClause, +} from '@superset-ui/core'; import React, { useCallback } from 'react'; import Echart from '../components/Echart'; +import { NULL_STRING } from '../constants'; import { EventHandlers } from '../types'; import { extractTreePathInfo } from './constants'; import { TreemapTransformedProps } from './types'; export default function EchartsTreemap({ - height, - width, echartOptions, - setDataMask, - labelMap, + emitCrossFilters, groupby, + height, + labelMap, + onContextMenu, + refs, + setDataMask, selectedValues, - formData, + width, }: TreemapTransformedProps) { const handleChange = useCallback( (values: string[]) => { - if (!formData.emitFilter) { + if (!emitCrossFilters) { return; } @@ -46,7 +53,7 @@ export default function EchartsTreemap({ values.length === 0 ? [] : groupby.map((col, idx) => { - const val = groupbyValues.map(v => v[idx]); + const val: DataRecordValue[] = groupbyValues.map(v => v[idx]); if (val === null || val === undefined) return { col, @@ -71,7 +78,7 @@ export default function EchartsTreemap({ const eventHandlers: EventHandlers = { click: props => { const { data, treePathInfo } = props; - // do noting when clicking the parent node + // do nothing when clicking on the parent node if (data?.children) { return; } @@ -84,10 +91,30 @@ export default function EchartsTreemap({ handleChange([name]); } }, + contextmenu: eventParams => { + if (onContextMenu) { + eventParams.event.stop(); + const { treePath } = extractTreePathInfo(eventParams.treePathInfo); + if (treePath.length > 0) { + const pointerEvent = eventParams.event.event; + const filters: BinaryQueryObjectFilterClause[] = []; + treePath.forEach((path, i) => + filters.push({ + col: groupby[i], + op: '==', + val: path === 'null' ? NULL_STRING : path, + formattedVal: path, + }), + ); + onContextMenu(pointerEvent.clientX, pointerEvent.clientY, filters); + } + } + }, }; return ( <Echart + refs={refs} height={height} width={width} echartOptions={echartOptions} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/constants.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/constants.ts index 080565229ac2..2cc660f35f5a 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/constants.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/constants.ts @@ -17,7 +17,7 @@ * under the License. */ -import { TreePathInfo } from './types'; +import { TreePathInfo } from '../types'; export const COLOR_SATURATION = [0.7, 0.4]; export const LABEL_FONTSIZE = 11; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx index e7cca1af263d..e5f470470143 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx @@ -21,10 +21,11 @@ import { t } from '@superset-ui/core'; import { ControlPanelConfig, D3_FORMAT_DOCS, + D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT, D3_FORMAT_OPTIONS, D3_TIME_FORMAT_OPTIONS, sections, - emitFilterControl, + getStandardizedControls, } from '@superset-ui/chart-controls'; import { DEFAULT_FORM_DATA } from './types'; @@ -54,7 +55,6 @@ const config: ControlPanelConfig = { }, ], ['adhoc_filters'], - emitFilterControl, ], }, { @@ -96,9 +96,9 @@ const config: ControlPanelConfig = { default: labelType, renderTrigger: true, choices: [ - ['Key', 'Key'], - ['value', 'Value'], - ['key_value', 'Category and Value'], + ['Key', t('Key')], + ['value', t('Value')], + ['key_value', t('Category and Value')], ], description: t('What should be shown on the label?'), }, @@ -114,9 +114,7 @@ const config: ControlPanelConfig = { renderTrigger: true, default: numberFormat, choices: D3_FORMAT_OPTIONS, - description: `${t( - 'D3 format syntax: https://github.com/d3/d3-format. ', - )} ${t('Only applies when "Label Type" is set to show values.')}`, + description: `${D3_FORMAT_DOCS} ${D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT}`, }, }, ], @@ -137,14 +135,10 @@ const config: ControlPanelConfig = { ], }, ], - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metric: formData.standardizedFormData.standardizedState.metrics[0], - groupby: formData.standardizedFormData.standardizedState.columns, - }), - updateStandardizedState: (prevState, currState) => ({ - ...currState, - metrics: [currState.metrics[0], ...prevState.metrics.slice(1)], + metric: getStandardizedControls().shiftMetric(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts index 575bb41fb9ee..ec6d2d38230c 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts @@ -2,7 +2,7 @@ * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information - * regardin + * regarding * g copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance @@ -46,14 +46,14 @@ export default class EchartsTreemapChartPlugin extends ChartPlugin< controlPanel, loadChart: () => import('./EchartsTreemap'), metadata: new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Part of a Whole'), credits: ['https://echarts.apache.org'], description: t( - 'Show hierarchical relationships of data, with with the value represented by area, showing proportion and contribution to the whole.', + 'Show hierarchical relationships of data, with the value represented by area, showing proportion and contribution to the whole.', ), exampleGallery: [{ url: example1 }, { url: example2 }], - name: t('Treemap v2'), + name: t('Treemap'), tags: [ t('Aesthetic'), t('Categorical'), diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/transformProps.ts index 5dd7d55467f7..b220b55b3d3c 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/transformProps.ts @@ -18,8 +18,6 @@ */ import { CategoricalColorNamespace, - DataRecord, - DataRecordValue, getColumnLabel, getMetricLabel, getNumberFormatter, @@ -27,7 +25,6 @@ import { NumberFormats, NumberFormatter, } from '@superset-ui/core'; -import { groupBy, isNumber, transform } from 'lodash'; import { TreemapSeriesNodeItemOption } from 'echarts/types/src/chart/treemap/TreemapSeries'; import { EChartsCoreOption, TreemapSeriesOption } from 'echarts'; import { @@ -39,7 +36,6 @@ import { TreemapTransformedProps, } from './types'; import { formatSeriesName, getColtypesMapping } from '../utils/series'; -import { defaultTooltip } from '../defaults'; import { COLOR_SATURATION, BORDER_WIDTH, @@ -49,6 +45,9 @@ import { BORDER_COLOR, } from './constants'; import { OpacityEnum } from '../constants'; +import { getDefaultTooltip } from '../utils/tooltip'; +import { Refs } from '../types'; +import { treeBuilder, TreeNode } from '../utils/treeBuilder'; export function formatLabel({ params, @@ -109,10 +108,19 @@ export function formatTooltip({ export default function transformProps( chartProps: EchartsTreemapChartProps, ): TreemapTransformedProps { - const { formData, height, queriesData, width, hooks, filterState, theme } = - chartProps; + const { + formData, + height, + queriesData, + width, + hooks, + filterState, + theme, + inContextMenu, + emitCrossFilters, + } = chartProps; const { data = [] } = queriesData[0]; - const { setDataMask = () => {} } = hooks; + const { setDataMask = () => {}, onContextMenu } = hooks; const coltypeMapping = getColtypesMapping(queriesData[0]); const { @@ -126,13 +134,12 @@ export default function transformProps( showLabels, showUpperLabels, dashboardId, - emitFilter, sliceId, }: EchartsTreemapFormData = { ...DEFAULT_TREEMAP_FORM_DATA, ...formData, }; - + const refs: Refs = {}; const colorFn = CategoricalColorNamespace.getScale(colorScheme as string); const numberFormatter = getNumberFormatter(numberFormat); const formatter = (params: TreemapSeriesCallbackDataParams) => @@ -142,111 +149,73 @@ export default function transformProps( labelType, }); - const columnsLabelMap = new Map<string, DataRecordValue[]>(); - - const transformer = ( - data: DataRecord[], - groupbyLabels: string[], - metric: string, - depth: number, - path: string[], - ): TreemapSeriesNodeItemOption[] => { - const [currGroupby, ...restGroupby] = groupbyLabels; - const currGrouping = groupBy(data, currGroupby); - if (!restGroupby.length) { - return transform( - currGrouping, - (result, value, key) => { - (value ?? []).forEach(datum => { - const name = formatSeriesName(key, { - numberFormatter, - timeFormatter: getTimeFormatter(dateFormat), - ...(coltypeMapping[currGroupby] && { - coltype: coltypeMapping[currGroupby], - }), - }); - const item: TreemapSeriesNodeItemOption = { - name, - value: isNumber(datum[metric]) ? (datum[metric] as number) : 0, - }; - const joinedName = path.concat(name).join(','); - // map(joined_name: [columnLabel_1, columnLabel_2, ...]) - columnsLabelMap.set(joinedName, path.concat(name)); - if ( - filterState.selectedValues && - !filterState.selectedValues.includes(joinedName) - ) { - item.itemStyle = { - colorAlpha: OpacityEnum.SemiTransparent, - }; - item.label = { - color: `rgba(0, 0, 0, ${OpacityEnum.SemiTransparent})`, - }; - } - result.push(item); - }); - }, - [] as TreemapSeriesNodeItemOption[], - ); - } - const sortedData = transform( - currGrouping, - (result, value, key) => { - const name = formatSeriesName(key, { - numberFormatter, - timeFormatter: getTimeFormatter(dateFormat), - ...(coltypeMapping[currGroupby] && { - coltype: coltypeMapping[currGroupby], - }), - }); - const children = transformer( - value, - restGroupby, - metric, - depth + 1, - path.concat(name), - ); - result.push({ - name, - children, - value: children.reduce( - (prev, cur) => prev + (cur.value as number), - 0, - ), - }); - result.sort((a, b) => (b.value as number) - (a.value as number)); - }, - [] as TreemapSeriesNodeItemOption[], - ); - // sort according to the area and then take the color value in order - return sortedData.map(child => ({ - ...child, - colorSaturation: COLOR_SATURATION, - itemStyle: { - borderColor: BORDER_COLOR, - color: colorFn(`${child.name}`, sliceId), - borderWidth: BORDER_WIDTH, - gapWidth: GAP_WIDTH, - }, - })); - }; - + const columnsLabelMap = new Map<string, string[]>(); const metricLabel = getMetricLabel(metric); const groupbyLabels = groupby.map(getColumnLabel); - const initialDepth = 1; + const treeData = treeBuilder(data, groupbyLabels, metricLabel); + const traverse = (treeNodes: TreeNode[], path: string[]) => + treeNodes.map(treeNode => { + const { name: nodeName, value, groupBy } = treeNode; + const name = formatSeriesName(nodeName, { + numberFormatter, + timeFormatter: getTimeFormatter(dateFormat), + ...(coltypeMapping[groupBy] && { + coltype: coltypeMapping[groupBy], + }), + }); + const newPath = path.concat(name); + let item: TreemapSeriesNodeItemOption = { + name, + value, + }; + if (treeNode.children?.length) { + item = { + ...item, + children: traverse(treeNode.children, newPath), + colorSaturation: COLOR_SATURATION, + itemStyle: { + borderColor: BORDER_COLOR, + color: colorFn(name, sliceId), + borderWidth: BORDER_WIDTH, + gapWidth: GAP_WIDTH, + }, + }; + } else { + const joinedName = newPath.join(','); + // map(joined_name: [columnLabel_1, columnLabel_2, ...]) + columnsLabelMap.set(joinedName, newPath); + if ( + filterState.selectedValues && + !filterState.selectedValues.includes(joinedName) + ) { + item = { + ...item, + itemStyle: { + colorAlpha: OpacityEnum.SemiTransparent, + }, + label: { + color: `rgba(0, 0, 0, ${OpacityEnum.SemiTransparent})`, + }, + }; + } + } + return item; + }); + const transformedData: TreemapSeriesNodeItemOption[] = [ { name: metricLabel, colorSaturation: COLOR_SATURATION, itemStyle: { borderColor: BORDER_COLOR, + color: colorFn(`${metricLabel}`, sliceId), borderWidth: BORDER_WIDTH, gapWidth: GAP_WIDTH, }, upperLabel: { show: false, }, - children: transformer(data, groupbyLabels, metricLabel, initialDepth, []), + children: traverse(treeData, []), }, ]; @@ -301,7 +270,8 @@ export default function transformProps( const echartOptions: EChartsCoreOption = { tooltip: { - ...defaultTooltip, + ...getDefaultTooltip(refs), + show: !inContextMenu, trigger: 'item', formatter: (params: any) => formatTooltip({ @@ -318,9 +288,11 @@ export default function transformProps( height, echartOptions, setDataMask, - emitFilter, + emitCrossFilters, labelMap: Object.fromEntries(columnsLabelMap), groupby, selectedValues: filterState.selectedValues || [], + onContextMenu, + refs, }; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/types.ts index f4ed29cc7316..1d4298838918 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/Treemap/types.ts @@ -19,15 +19,18 @@ import { ChartDataResponseResult, ChartProps, - DataRecordValue, QueryFormColumn, QueryFormData, QueryFormMetric, - SetDataMaskHook, } from '@superset-ui/core'; -import { EChartsCoreOption } from 'echarts'; import { CallbackDataParams } from 'echarts/types/src/util/types'; -import { LabelPositionEnum } from '../types'; +import { + BaseTransformedProps, + ContextMenuTransformedProps, + CrossFilterTransformedProps, + LabelPositionEnum, + TreePathInfo, +} from '../types'; export type EchartsTreemapFormData = QueryFormData & { colorScheme?: string; @@ -40,7 +43,6 @@ export type EchartsTreemapFormData = QueryFormData & { numberFormat: string; dateFormat: string; dashboardId?: number; - emitFilter: boolean; }; export enum EchartsTreemapLabelType { @@ -63,26 +65,12 @@ export const DEFAULT_FORM_DATA: Partial<EchartsTreemapFormData> = { showLabels: true, showUpperLabels: true, dateFormat: 'smart_date', - emitFilter: false, }; - -export interface TreePathInfo { - name: string; - dataIndex: number; - value: number | number[]; -} export interface TreemapSeriesCallbackDataParams extends CallbackDataParams { treePathInfo?: TreePathInfo[]; } -export interface TreemapTransformedProps { - formData: EchartsTreemapFormData; - height: number; - width: number; - echartOptions: EChartsCoreOption; - emitFilter: boolean; - setDataMask: SetDataMaskHook; - labelMap: Record<string, DataRecordValue[]>; - groupby: QueryFormColumn[]; - selectedValues: Record<number, string>; -} +export type TreemapTransformedProps = + BaseTransformedProps<EchartsTreemapFormData> & + ContextMenuTransformedProps & + CrossFilterTransformedProps; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/components/Echart.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/components/Echart.tsx index 51ea5d579692..011d62abacec 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/components/Echart.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/components/Echart.tsx @@ -22,6 +22,8 @@ import React, { useMemo, forwardRef, useImperativeHandle, + useLayoutEffect, + useCallback, } from 'react'; import { styled } from '@superset-ui/core'; import { ECharts, init } from 'echarts'; @@ -40,10 +42,15 @@ function Echart( eventHandlers, zrEventHandlers, selectedValues = {}, + refs, }: EchartsProps, ref: React.Ref<EchartsHandler>, ) { const divRef = useRef<HTMLDivElement>(null); + if (refs) { + // eslint-disable-next-line no-param-reassign + refs.divRef = divRef; + } const chartRef = useRef<ECharts>(); const currentSelection = useMemo( () => Object.keys(selectedValues) || [], @@ -92,11 +99,24 @@ function Echart( previousSelection.current = currentSelection; }, [currentSelection]); + const handleSizeChange = useCallback( + ({ width, height }: { width: number; height: number }) => { + if (chartRef.current) { + chartRef.current.resize({ width, height }); + } + }, + [], + ); + + // did mount useEffect(() => { - if (chartRef.current) { - chartRef.current.resize({ width, height }); - } - }, [width, height]); + handleSizeChange({ width, height }); + return () => chartRef.current?.dispose(); + }, []); + + useLayoutEffect(() => { + handleSizeChange({ width, height }); + }, [width, height, handleSizeChange]); return <Styles ref={divRef} height={height} width={width} />; } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/constants.ts b/superset-frontend/plugins/plugin-chart-echarts/src/constants.ts index 513a0bebc184..1c20128b67c6 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/constants.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/constants.ts @@ -19,13 +19,19 @@ import { JsonValue, t, TimeGranularity } from '@superset-ui/core'; import { ReactNode } from 'react'; -import { LabelPositionEnum } from './types'; +import { + LegendFormData, + TitleFormData, + LabelPositionEnum, + LegendOrientation, + LegendType, +} from './types'; // eslint-disable-next-line import/prefer-default-export export const NULL_STRING = '<NULL>'; export const TIMESERIES_CONSTANTS = { - gridOffsetRight: 40, + gridOffsetRight: 20, gridOffsetLeft: 20, gridOffsetTop: 20, gridOffsetBottom: 20, @@ -84,3 +90,27 @@ export const TIMEGRAIN_TO_TIMESTAMP = { [TimeGranularity.QUARTER]: 3600 * 1000 * 24 * 31 * 3, [TimeGranularity.YEAR]: 3600 * 1000 * 24 * 31 * 12, }; + +export const DEFAULT_LEGEND_FORM_DATA: LegendFormData = { + legendMargin: null, + legendOrientation: LegendOrientation.Top, + legendType: LegendType.Scroll, + showLegend: true, +}; + +export const DEFAULT_TITLE_FORM_DATA: TitleFormData = { + xAxisTitle: '', + xAxisTitleMargin: 0, + yAxisTitle: '', + yAxisTitleMargin: 0, + yAxisTitlePosition: 'Top', +}; + +export { DEFAULT_FORM_DATA } from './Timeseries/constants'; + +// How far away from the mouse should the tooltip be +export const TOOLTIP_POINTER_MARGIN = 10; + +// If no satisfactory position can be found, how far away +// from the edge of the window should the tooltip be kept +export const TOOLTIP_OVERFLOW_MARGIN = 5; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx index b8d54fc09a41..ff74cd171d3d 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx @@ -17,22 +17,15 @@ * under the License. */ import React from 'react'; -import { - FeatureFlag, - isFeatureEnabled, - t, - validateNonEmpty, -} from '@superset-ui/core'; +import { t } from '@superset-ui/core'; import { ControlPanelsContainerProps, - ControlPanelState, ControlSetItem, ControlSetRow, - ControlState, sharedControls, } from '@superset-ui/chart-controls'; -import { DEFAULT_LEGEND_FORM_DATA } from './types'; -import { DEFAULT_FORM_DATA } from './Timeseries/types'; +import { DEFAULT_LEGEND_FORM_DATA } from './constants'; +import { DEFAULT_FORM_DATA } from './Timeseries/constants'; const { legendMargin, legendOrientation, legendType, showLegend } = DEFAULT_LEGEND_FORM_DATA; @@ -67,10 +60,10 @@ const legendTypeControl: ControlSetItem = { config: { type: 'SelectControl', freeForm: false, - label: 'Type', + label: t('Type'), choices: [ - ['scroll', 'Scroll'], - ['plain', 'Plain'], + ['scroll', t('Scroll')], + ['plain', t('Plain')], ], default: legendType, renderTrigger: true, @@ -85,16 +78,16 @@ const legendOrientationControl: ControlSetItem = { config: { type: 'SelectControl', freeForm: false, - label: 'Orientation', + label: t('Orientation'), choices: [ - ['top', 'Top'], - ['bottom', 'Bottom'], - ['left', 'Left'], - ['right', 'Right'], + ['top', t('Top')], + ['bottom', t('Bottom')], + ['left', t('Left')], + ['right', t('Right')], ], default: legendOrientation, renderTrigger: true, - description: t('Legend type'), + description: t('Legend Orientation'), visibility: ({ controls }: ControlPanelsContainerProps) => Boolean(controls?.show_legend?.value), }, @@ -145,33 +138,6 @@ export const onlyTotalControl: ControlSetItem = { }, }; -export const xAxisControl: ControlSetItem = { - name: 'x_axis', - config: { - ...sharedControls.groupby, - label: t('X-axis'), - default: ( - control: ControlState, - controlPanel: Partial<ControlPanelState>, - ) => { - // default to the chosen time column if x-axis is unset and the - // GENERIC_CHART_AXES feature flag is enabled - const { value } = control; - if (value) { - return value; - } - const timeColumn = controlPanel?.form_data?.granularity_sqla; - if (isFeatureEnabled(FeatureFlag.GENERIC_CHART_AXES) && timeColumn) { - return timeColumn; - } - return null; - }, - multi: false, - description: t('Dimension to use on x-axis.'), - validators: [validateNonEmpty], - }, -}; - const percentageThresholdControl: ControlSetItem = { name: 'percentage_threshold', config: { diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/defaults.ts b/superset-frontend/plugins/plugin-chart-echarts/src/defaults.ts index c74e3d78a043..c5ada14932eb 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/defaults.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/defaults.ts @@ -1,5 +1,3 @@ -import { LegendOrientation } from './types'; - /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -18,14 +16,12 @@ import { LegendOrientation } from './types'; * specific language governing permissions and limitations * under the License. */ +import { LegendOrientation } from './types'; + export const defaultGrid = { containLabel: true, }; -export const defaultTooltip = { - confine: true, -}; - export const defaultYAxis = { scale: true, }; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/index.ts b/superset-frontend/plugins/plugin-chart-echarts/src/index.ts index 84a1a3a3dcc3..0301f265b051 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/index.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/index.ts @@ -33,6 +33,7 @@ export { default as EchartsFunnelChartPlugin } from './Funnel'; export { default as EchartsTreeChartPlugin } from './Tree'; export { default as EchartsTreemapChartPlugin } from './Treemap'; export { BigNumberChartPlugin, BigNumberTotalChartPlugin } from './BigNumber'; +export { default as EchartsSunburstChartPlugin } from './Sunburst'; export { default as BoxPlotTransformProps } from './BoxPlot/transformProps'; export { default as FunnelTransformProps } from './Funnel/transformProps'; @@ -44,8 +45,9 @@ export { default as RadarTransformProps } from './Radar/transformProps'; export { default as TimeseriesTransformProps } from './Timeseries/transformProps'; export { default as TreeTransformProps } from './Tree/transformProps'; export { default as TreemapTransformProps } from './Treemap/transformProps'; +export { default as SunburstTransformProps } from './Sunburst/transformProps'; -export { DEFAULT_FORM_DATA as TimeseriesDefaultFormData } from './Timeseries/types'; +export { DEFAULT_FORM_DATA as TimeseriesDefaultFormData } from './Timeseries/constants'; export * from './types'; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/types.ts b/superset-frontend/plugins/plugin-chart-echarts/src/types.ts index d84b7079c479..c24e2d84f46d 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/types.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/types.ts @@ -16,15 +16,18 @@ * specific language governing permissions and limitations * under the License. */ +import React, { RefObject } from 'react'; import { - DataRecordValue, + BinaryQueryObjectFilterClause, + ChartDataResponseResult, + ChartProps, HandlerFunction, + PlainObject, QueryFormColumn, SetDataMaskHook, } from '@superset-ui/core'; import { EChartsCoreOption, ECharts } from 'echarts'; import { TooltipMarker } from 'echarts/types/src/util/format'; -import { OptionName } from 'echarts/types/src/util/types'; import { AreaChartExtraControlsValue } from './constants'; export type EchartsStylesProps = { @@ -32,6 +35,11 @@ export type EchartsStylesProps = { width: number; }; +export type Refs = { + echartRef?: React.Ref<EchartsHandler>; + divRef?: RefObject<HTMLDivElement>; +}; + export interface EchartsProps { height: number; width: number; @@ -40,6 +48,7 @@ export interface EchartsProps { zrEventHandlers?: EventHandlers; selectedValues?: Record<number, string>; forceClear?: boolean; + refs: Refs; } export interface EchartsHandler { @@ -78,20 +87,13 @@ export type ForecastValue = { forecastUpper?: number; }; -export type EchartsLegendFormData = { +export type LegendFormData = { legendMargin: number | null | string; legendOrientation: LegendOrientation; legendType: LegendType; showLegend: boolean; }; -export const DEFAULT_LEGEND_FORM_DATA: EchartsLegendFormData = { - legendMargin: null, - legendOrientation: LegendOrientation.Top, - legendType: LegendType.Scroll, - showLegend: true, -}; - export type EventHandlers = Record<string, { (props: any): void }>; export enum LabelPositionEnum { @@ -110,21 +112,41 @@ export enum LabelPositionEnum { InsideBottomRight = 'insideBottomRight', } -export interface EChartTransformedProps<F> { +export interface BaseChartProps<T extends PlainObject> extends ChartProps<T> { + queriesData: ChartDataResponseResult[]; +} + +export interface BaseTransformedProps<F> { + echartOptions: EChartsCoreOption; formData: F; height: number; + onContextMenu?: ( + clientX: number, + clientY: number, + filters?: BinaryQueryObjectFilterClause[], + ) => void; + refs: Refs; width: number; - echartOptions: EChartsCoreOption; - emitFilter: boolean; - setDataMask: SetDataMaskHook; - setControlValue?: HandlerFunction; - labelMap: Record<string, DataRecordValue[]>; +} + +export type CrossFilterTransformedProps = { groupby: QueryFormColumn[]; + labelMap: Record<string, string[]>; + setControlValue?: HandlerFunction; + setDataMask: SetDataMaskHook; selectedValues: Record<number, string>; - legendData?: OptionName[]; -} + emitCrossFilters?: boolean; +}; + +export type ContextMenuTransformedProps = { + onContextMenu?: ( + clientX: number, + clientY: number, + filters?: BinaryQueryObjectFilterClause[], + ) => void; +}; -export interface EchartsTitleFormData { +export interface TitleFormData { xAxisTitle: string; xAxisTitleMargin: number; yAxisTitle: string; @@ -132,14 +154,12 @@ export interface EchartsTitleFormData { yAxisTitlePosition: string; } -export const DEFAULT_TITLE_FORM_DATA: EchartsTitleFormData = { - xAxisTitle: '', - xAxisTitleMargin: 0, - yAxisTitle: '', - yAxisTitleMargin: 0, - yAxisTitlePosition: 'Top', -}; - export type StackType = boolean | null | Partial<AreaChartExtraControlsValue>; +export interface TreePathInfo { + name: string; + dataIndex: number; + value: number | number[]; +} + export * from './Timeseries/types'; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/utils/annotation.ts b/superset-frontend/plugins/plugin-chart-echarts/src/utils/annotation.ts index 3a9508286312..d3d858d9792a 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/utils/annotation.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/utils/annotation.ts @@ -25,26 +25,32 @@ import { AnnotationLayer, AnnotationOpacity, AnnotationType, + DataRecord, evalExpression, FormulaAnnotationLayer, isRecordAnnotationResult, isTableAnnotationLayer, isTimeseriesAnnotationResult, - TimeseriesDataRecord, + AxisType, } from '@superset-ui/core'; import { EchartsTimeseriesChartProps } from '../types'; import { EchartsMixedTimeseriesProps } from '../MixedTimeseries/types'; export function evalFormula( formula: FormulaAnnotationLayer, - data: TimeseriesDataRecord[], -): [number, number][] { + data: DataRecord[], + xAxis: string, + xAxisType: AxisType, +): [any, number][] { const { value: expression } = formula; - return data.map(row => [ - Number(row.__timestamp), - evalExpression(expression, row.__timestamp as number), - ]); + return data.map(row => { + let value = row[xAxis]; + if (xAxisType === 'time') { + value = new Date(value as string).getTime(); + } + return [value, evalExpression(expression, (value || 0) as number)]; + }); } export function parseAnnotationOpacity(opacity?: AnnotationOpacity): number { diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/utils/eventHandlers.ts b/superset-frontend/plugins/plugin-chart-echarts/src/utils/eventHandlers.ts new file mode 100644 index 000000000000..0d26b92d08df --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/utils/eventHandlers.ts @@ -0,0 +1,82 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { BinaryQueryObjectFilterClause } from '@superset-ui/core'; +import { + BaseTransformedProps, + CrossFilterTransformedProps, + EventHandlers, +} from '../types'; + +export type Event = { + name: string; + event: { stop: () => void; event: PointerEvent }; +}; + +export const clickEventHandler = + ( + selectedValues: Record<number, string>, + handleChange: (values: string[]) => void, + ) => + ({ name }: { name: string }) => { + const values = Object.values(selectedValues); + if (values.includes(name)) { + handleChange(values.filter(v => v !== name)); + } else { + handleChange([name]); + } + }; + +export const contextMenuEventHandler = + ( + groupby: (BaseTransformedProps<any> & + CrossFilterTransformedProps)['groupby'], + onContextMenu: BaseTransformedProps<any>['onContextMenu'], + labelMap: Record<string, string[]>, + ) => + (e: Event) => { + if (onContextMenu) { + e.event.stop(); + const pointerEvent = e.event.event; + const filters: BinaryQueryObjectFilterClause[] = []; + if (groupby.length > 0) { + const values = labelMap[e.name]; + groupby.forEach((dimension, i) => + filters.push({ + col: dimension, + op: '==', + val: values[i], + formattedVal: String(values[i]), + }), + ); + } + onContextMenu(pointerEvent.clientX, pointerEvent.clientY, filters); + } + }; + +export const allEventHandlers = ( + transformedProps: BaseTransformedProps<any> & CrossFilterTransformedProps, + handleChange: (values: string[]) => void, +) => { + const { groupby, selectedValues, onContextMenu, labelMap } = transformedProps; + const eventHandlers: EventHandlers = { + click: clickEventHandler(selectedValues, handleChange), + contextmenu: contextMenuEventHandler(groupby, onContextMenu, labelMap), + }; + return eventHandlers; +}; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/utils/series.ts b/superset-frontend/plugins/plugin-chart-echarts/src/utils/series.ts index 8d93ce3f3431..c1b61233b6c6 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/utils/series.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/utils/series.ts @@ -24,8 +24,10 @@ import { DTTM_ALIAS, ensureIsArray, GenericDataType, + NumberFormats, NumberFormatter, TimeFormatter, + AxisType, } from '@superset-ui/core'; import { format, LegendComponentOption, SeriesOption } from 'echarts'; import { @@ -320,14 +322,30 @@ export const currentSeries = { legend: '', }; -export function getAxisType( - dataType?: GenericDataType, -): 'time' | 'value' | 'category' { +export function getAxisType(dataType?: GenericDataType): AxisType { if (dataType === GenericDataType.TEMPORAL) { - return 'time'; + return AxisType.time; } - if (dataType === GenericDataType.NUMERIC) { - return 'value'; - } - return 'category'; + return AxisType.category; +} + +export function getOverMaxHiddenFormatter( + config: { + max?: number; + formatter?: NumberFormatter; + } = {}, +) { + const { max, formatter } = config; + // Only apply this logic if there's a MAX set in the controls + const shouldHideIfOverMax = !!max || max === 0; + + return new NumberFormatter({ + formatFunc: value => + `${ + shouldHideIfOverMax && value > max + ? '' + : formatter?.format(value) || value + }`, + id: NumberFormats.OVER_MAX_HIDDEN, + }); } diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/utils/tooltip.ts b/superset-frontend/plugins/plugin-chart-echarts/src/utils/tooltip.ts new file mode 100644 index 000000000000..c1fd7ac0a3f7 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/utils/tooltip.ts @@ -0,0 +1,79 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CallbackDataParams } from 'echarts/types/src/util/types'; +import { TOOLTIP_OVERFLOW_MARGIN, TOOLTIP_POINTER_MARGIN } from '../constants'; +import { Refs } from '../types'; + +export function getDefaultTooltip(refs: Refs) { + return { + appendToBody: true, + position: ( + canvasMousePos: [number, number], + params: CallbackDataParams, + tooltipDom: HTMLDivElement | null, + rect: any, + sizes: { contentSize: [number, number]; viewSize: [number, number] }, + ) => { + // algorithm partially based on this snippet: + // https://github.com/apache/echarts/issues/5004#issuecomment-559668309 + + // The chart canvas position + const divRect = refs.divRef?.current?.getBoundingClientRect(); + + // The mouse coordinates relative to the whole window + // The first parameter to the position function is the mouse position relative to the canvas + const mouseX = canvasMousePos[0] + (divRect?.x || 0); + const mouseY = canvasMousePos[1] + (divRect?.y || 0); + + // The width and height of the tooltip dom element + const tooltipWidth = sizes.contentSize[0]; + const tooltipHeight = sizes.contentSize[1]; + + // Start by placing the tooltip top and right relative to the mouse position + let xPos = mouseX + TOOLTIP_POINTER_MARGIN; + let yPos = mouseY - TOOLTIP_POINTER_MARGIN - tooltipHeight; + + // The tooltip is overflowing past the right edge of the window + if (xPos + tooltipWidth >= document.documentElement.clientWidth) { + // Attempt to place the tooltip to the left of the mouse position + xPos = mouseX - TOOLTIP_POINTER_MARGIN - tooltipWidth; + + // The tooltip is overflowing past the left edge of the window + if (xPos <= 0) + // Place the tooltip a fixed distance from the left edge of the window + xPos = TOOLTIP_OVERFLOW_MARGIN; + } + + // The tooltip is overflowing past the top edge of the window + if (yPos <= 0) { + // Attempt to place the tooltip to the bottom of the mouse position + yPos = mouseY + TOOLTIP_POINTER_MARGIN; + + // The tooltip is overflowing past the bottom edge of the window + if (yPos + tooltipHeight >= document.documentElement.clientHeight) + // Place the tooltip a fixed distance from the top edge of the window + yPos = TOOLTIP_OVERFLOW_MARGIN; + } + + // Return the position (converted back to a relative position on the canvas) + return [xPos - (divRect?.x || 0), yPos - (divRect?.y || 0)]; + }, + }; +} diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/utils/treeBuilder.ts b/superset-frontend/plugins/plugin-chart-echarts/src/utils/treeBuilder.ts new file mode 100644 index 000000000000..97916997d4d4 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/src/utils/treeBuilder.ts @@ -0,0 +1,88 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { DataRecord, DataRecordValue } from '@superset-ui/core'; +import _ from 'lodash'; + +export type TreeNode = { + name: DataRecordValue; + value: number; + secondaryValue: number; + groupBy: string; + children?: TreeNode[]; +}; + +function getMetricValue(datum: DataRecord, metric: string) { + return _.isNumber(datum[metric]) ? (datum[metric] as number) : 0; +} + +export function treeBuilder( + data: DataRecord[], + groupBy: string[], + metric: string, + secondaryMetric?: string, +): TreeNode[] { + const [curGroupBy, ...restGroupby] = groupBy; + const curData = _.groupBy(data, curGroupBy); + return _.transform( + curData, + (result, value, key) => { + const name = curData[key][0][curGroupBy]!; + if (!restGroupby.length) { + (value ?? []).forEach(datum => { + const metricValue = getMetricValue(datum, metric); + const secondaryValue = secondaryMetric + ? getMetricValue(datum, secondaryMetric) + : metricValue; + const item = { + name, + value: metricValue, + secondaryValue, + groupBy: curGroupBy, + }; + result.push(item); + }); + } else { + const children = treeBuilder( + value, + restGroupby, + metric, + secondaryMetric, + ); + const metricValue = children.reduce( + (prev, cur) => prev + (cur.value as number), + 0, + ); + const secondaryValue = secondaryMetric + ? children.reduce( + (prev, cur) => prev + (cur.secondaryValue as number), + 0, + ) + : metricValue; + result.push({ + name, + children, + value: metricValue, + secondaryValue, + groupBy: curGroupBy, + }); + } + }, + [] as TreeNode[], + ); +} diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/BigNumber/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/BigNumber/transformProps.test.ts index 6529c2dafabf..ce00bb71906f 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/BigNumber/transformProps.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/BigNumber/transformProps.test.ts @@ -25,6 +25,7 @@ import transformProps from '../../src/BigNumber/BigNumberWithTrendline/transform import { BigNumberDatum, BigNumberWithTrendlineChartProps, + BigNumberWithTrendlineFormData, } from '../../src/BigNumber/types'; const formData = { @@ -36,14 +37,17 @@ const formData = { a: 1, }, compareLag: 1, - timeGrainSqla: 'P3M' as TimeGranularity, + timeGrainSqla: TimeGranularity.QUARTER, + granularitySqla: 'ds', compareSuffix: 'over last quarter', viz_type: 'big_number', yAxisFormat: '.3s', datasource: 'test_datasource', }; -const rawFormData = { +const rawFormData: BigNumberWithTrendlineFormData = { + colorPicker: { b: 0, g: 0, r: 0 }, + datasource: '1__table', metric: 'value', color_picker: { r: 0, @@ -52,7 +56,8 @@ const rawFormData = { a: 1, }, compare_lag: 1, - time_grain_sqla: 'P3M' as TimeGranularity, + time_grain_sqla: TimeGranularity.QUARTER, + granularity_sqla: 'ds', compare_suffix: 'over last quarter', viz_type: 'big_number', y_axis_format: '.3s', @@ -126,7 +131,8 @@ describe('BigNumberWithTrendline', () => { expect(transformed.bigNumber).toStrictEqual(1.2345); expect(transformed.bigNumberFallback).not.toBeNull(); - // should successfully formatTime by ganularity + // should successfully formatTime by granularity + // @ts-ignore expect(transformed.formatTime(new Date('2020-01-01'))).toStrictEqual( '2020-01-01 00:00:00', ); @@ -147,6 +153,7 @@ describe('BigNumberWithTrendline', () => { }, }; const transformed = transformProps(propsWithDatasource); + // @ts-ignore expect(transformed.headerFormatter(transformed.bigNumber)).toStrictEqual( '1.23', ); diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/BoxPlot/buildQuery.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/BoxPlot/buildQuery.test.ts index 685924871344..0d0f2f838990 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/BoxPlot/buildQuery.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/BoxPlot/buildQuery.test.ts @@ -20,14 +20,13 @@ import { isPostProcessingBoxplot, PostProcessingBoxplot, } from '@superset-ui/core'; -import { DEFAULT_TITLE_FORM_DATA } from '../../src/types'; +import { DEFAULT_TITLE_FORM_DATA } from '../../src/constants'; import buildQuery from '../../src/BoxPlot/buildQuery'; import { BoxPlotQueryFormData } from '../../src/BoxPlot/types'; describe('BoxPlot buildQuery', () => { const formData: BoxPlotQueryFormData = { ...DEFAULT_TITLE_FORM_DATA, - emitFilter: false, columns: [], datasource: '5__table', granularity_sqla: 'ds', diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Gauge/buildQuery.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Gauge/buildQuery.test.ts index 77f1322f9be9..7eb975dafecd 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/Gauge/buildQuery.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Gauge/buildQuery.test.ts @@ -29,20 +29,20 @@ describe('Gauge buildQuery', () => { const formData = { ...baseFormData, groupby: undefined }; const queryContext = buildQuery(formData); const [query] = queryContext.queries; - expect(query.groupby).toEqual([]); + expect(query.columns).toEqual([]); }); it('should build query fields with single group by column', () => { const formData = { ...baseFormData, groupby: ['foo'] }; const queryContext = buildQuery(formData); const [query] = queryContext.queries; - expect(query.groupby).toEqual(['foo']); + expect(query.columns).toEqual(['foo']); }); it('should build query fields with multiple group by columns', () => { const formData = { ...baseFormData, groupby: ['foo', 'bar'] }; const queryContext = buildQuery(formData); const [query] = queryContext.queries; - expect(query.groupby).toEqual(['foo', 'bar']); + expect(query.columns).toEqual(['foo', 'bar']); }); }); diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Graph/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Graph/transformProps.test.ts index 480f4828f337..61adda8a98c7 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/Graph/transformProps.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Graph/transformProps.test.ts @@ -16,13 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -import { ChartProps, supersetTheme } from '@superset-ui/core'; +import { ChartProps, SqlaFormData, supersetTheme } from '@superset-ui/core'; import transformProps from '../../src/Graph/transformProps'; import { DEFAULT_GRAPH_SERIES_OPTION } from '../../src/Graph/constants'; +import { EchartsGraphChartProps } from '../../src/Graph/types'; describe('EchartsGraph transformProps', () => { it('should transform chart props for viz without category', () => { - const formData = { + const formData: SqlaFormData = { colorScheme: 'bnbColors', datasource: '3__table', granularity_sqla: 'ds', @@ -30,6 +31,7 @@ describe('EchartsGraph transformProps', () => { source: 'source_column', target: 'target_column', category: null, + viz_type: 'graph', }; const queriesData = [ { @@ -57,7 +59,7 @@ describe('EchartsGraph transformProps', () => { }; const chartProps = new ChartProps(chartPropsConfig); - expect(transformProps(chartProps)).toEqual( + expect(transformProps(chartProps as EchartsGraphChartProps)).toEqual( expect.objectContaining({ width: 800, height: 600, @@ -78,7 +80,11 @@ describe('EchartsGraph transformProps', () => { label: { fontWeight: 'bolder' }, }, symbolSize: 50, - tooltip: { formatter: '{b}: {c}' }, + tooltip: { + appendToBody: true, + formatter: '{b}: {c}', + position: expect.anything(), + }, value: 6, }, { @@ -91,7 +97,11 @@ describe('EchartsGraph transformProps', () => { label: { fontWeight: 'bolder' }, }, symbolSize: 50, - tooltip: { formatter: '{b}: {c}' }, + tooltip: { + appendToBody: true, + formatter: '{b}: {c}', + position: expect.anything(), + }, value: 6, }, { @@ -104,7 +114,11 @@ describe('EchartsGraph transformProps', () => { label: { fontWeight: 'bolder' }, }, symbolSize: 10, - tooltip: { formatter: '{b}: {c}' }, + tooltip: { + appendToBody: true, + formatter: '{b}: {c}', + position: expect.anything(), + }, value: 5, }, { @@ -117,7 +131,11 @@ describe('EchartsGraph transformProps', () => { label: { fontWeight: 'bolder' }, }, symbolSize: 10, - tooltip: { formatter: '{b}: {c}' }, + tooltip: { + appendToBody: true, + formatter: '{b}: {c}', + position: expect.anything(), + }, value: 5, }, ], @@ -151,7 +169,7 @@ describe('EchartsGraph transformProps', () => { }); it('should transform chart props for viz with category and falsey normalization', () => { - const formData = { + const formData: SqlaFormData = { colorScheme: 'bnbColors', datasource: '3__table', granularity_sqla: 'ds', @@ -160,6 +178,7 @@ describe('EchartsGraph transformProps', () => { target: 'target_column', sourceCategory: 'source_category_column', targetCategory: 'target_category_column', + viz_type: 'graph', }; const queriesData = [ { @@ -197,7 +216,7 @@ describe('EchartsGraph transformProps', () => { }; const chartProps = new ChartProps(chartPropsConfig); - expect(transformProps(chartProps)).toEqual( + expect(transformProps(chartProps as EchartsGraphChartProps)).toEqual( expect.objectContaining({ width: 800, height: 600, @@ -215,7 +234,11 @@ describe('EchartsGraph transformProps', () => { symbolSize: 10, category: 'category_value_1', select: DEFAULT_GRAPH_SERIES_OPTION.select, - tooltip: DEFAULT_GRAPH_SERIES_OPTION.tooltip, + tooltip: { + appendToBody: true, + formatter: '{b}: {c}', + position: expect.anything(), + }, label: { show: true }, }, { @@ -225,7 +248,11 @@ describe('EchartsGraph transformProps', () => { symbolSize: 10, category: 'category_value_2', select: DEFAULT_GRAPH_SERIES_OPTION.select, - tooltip: DEFAULT_GRAPH_SERIES_OPTION.tooltip, + tooltip: { + appendToBody: true, + formatter: '{b}: {c}', + position: expect.anything(), + }, label: { show: true }, }, ], diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/MixedTimeseries/buildQuery.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/MixedTimeseries/buildQuery.test.ts index 0b766c2dc4e4..15d9e2cbb6e1 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/MixedTimeseries/buildQuery.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/MixedTimeseries/buildQuery.test.ts @@ -17,7 +17,7 @@ * under the License. */ import { - ComparisionType, + ComparisonType, FreeFormAdhocFilter, RollingType, TimeGranularity, @@ -46,8 +46,8 @@ const formDataMixedChart = { row_limit: 10, timeseries_limit_metric: 'count', order_desc: true, - emit_filter: true, truncate_metric: true, + show_empty_columns: true, // -- query b groupby_b: [], metrics_b: ['count'], @@ -62,8 +62,8 @@ const formDataMixedChart = { row_limit_b: 100, timeseries_limit_metric_b: undefined, order_desc_b: false, - emit_filter_b: undefined, truncate_metric_b: true, + show_empty_columns_b: true, // chart configs show_value: false, show_valueB: undefined, @@ -72,14 +72,14 @@ const formDataMixedChartWithAA = { ...formDataMixedChart, rolling_type: RollingType.Cumsum, time_compare: ['1 years ago'], - comparison_type: ComparisionType.Values, + comparison_type: ComparisonType.Values, resample_rule: '1AS', resample_method: 'zerofill', rolling_type_b: RollingType.Sum, rolling_periods_b: 1, min_periods_b: 1, - comparison_type_b: ComparisionType.Difference, + comparison_type_b: ComparisonType.Difference, time_compare_b: ['3 years ago'], resample_rule_b: '1A', resample_method_b: 'asfreq', @@ -95,7 +95,6 @@ test('should compile query object A', () => { filters: [], extras: { having: '', - having_druid: [], time_grain_sqla: 'P1W', where: "(foo in ('a', 'b'))", }, @@ -106,9 +105,8 @@ test('should compile query object A', () => { row_limit: 10, row_offset: undefined, series_columns: ['foo'], - series_limit: undefined, + series_limit: 5, series_limit_metric: undefined, - timeseries_limit: 5, url_params: {}, custom_params: {}, custom_form_data: {}, @@ -125,9 +123,7 @@ test('should compile query object A', () => { }, columns: ['foo'], drop_missing_columns: false, - flatten_columns: false, index: ['__timestamp'], - reset_index: false, }, }, { @@ -158,7 +154,6 @@ test('should compile query object B', () => { filters: [], extras: { having: '', - having_druid: [], time_grain_sqla: 'P1W', where: "(name in ('c', 'd'))", }, @@ -169,9 +164,8 @@ test('should compile query object B', () => { row_limit: 100, row_offset: undefined, series_columns: [], - series_limit: undefined, + series_limit: 0, series_limit_metric: undefined, - timeseries_limit: 0, url_params: {}, custom_params: {}, custom_form_data: {}, @@ -188,9 +182,7 @@ test('should compile query object B', () => { }, columns: [], drop_missing_columns: false, - flatten_columns: false, index: ['__timestamp'], - reset_index: false, }, }, { @@ -206,6 +198,21 @@ test('should compile AA in query A', () => { // time comparison expect(query.time_offsets).toEqual(['1 years ago']); + // pivot + expect( + query.post_processing?.find(operator => operator?.operation === 'pivot'), + ).toEqual({ + operation: 'pivot', + options: { + index: ['__timestamp'], + columns: ['foo'], + drop_missing_columns: false, + aggregates: { + 'sum(sales)': { operator: 'mean' }, + 'sum(sales)__1 years ago': { operator: 'mean' }, + }, + }, + }); // cumsum expect( // prettier-ignore @@ -271,7 +278,22 @@ test('should compile AA in query B', () => { }); }); -test('should compile query objects with x-axis', () => { +test('should convert a queryObject with x-axis although FF is disabled', () => { + let windowSpy: any; + + beforeAll(() => { + // @ts-ignore + windowSpy = jest.spyOn(window, 'window', 'get').mockImplementation(() => ({ + featureFlags: { + GENERIC_CHART_AXES: false, + }, + })); + }); + + afterAll(() => { + windowSpy.mockRestore(); + }); + const { queries } = buildQuery({ ...formDataMixedChart, x_axis: 'my_index', @@ -284,24 +306,29 @@ test('should compile query objects with x-axis', () => { filters: [], extras: { having: '', - having_druid: [], - time_grain_sqla: 'P1W', where: "(foo in ('a', 'b'))", }, applied_time_extras: {}, - columns: ['my_index', 'foo'], + columns: [ + { + columnType: 'BASE_AXIS', + expressionType: 'SQL', + label: 'my_index', + sqlExpression: 'my_index', + timeGrain: 'P1W', + }, + 'foo', + ], metrics: ['sum(sales)'], annotation_layers: [], row_limit: 10, row_offset: undefined, series_columns: ['foo'], - series_limit: undefined, + series_limit: 5, series_limit_metric: undefined, - timeseries_limit: 5, url_params: {}, custom_params: {}, custom_form_data: {}, - is_timeseries: false, time_offsets: [], post_processing: [ { @@ -314,9 +341,7 @@ test('should compile query objects with x-axis', () => { }, columns: ['foo'], drop_missing_columns: false, - flatten_columns: false, index: ['my_index'], - reset_index: false, }, }, { @@ -339,8 +364,16 @@ test('should compile query objects with x-axis', () => { // check the main props on the second query expect(queries[1]).toEqual( expect.objectContaining({ - is_timeseries: false, - columns: ['my_index'], + columns: [ + { + columnType: 'BASE_AXIS', + expressionType: 'SQL', + label: 'my_index', + sqlExpression: 'my_index', + timeGrain: 'P1W', + }, + ], + granularity: 'ds', series_columns: [], metrics: ['count'], post_processing: [ @@ -354,9 +387,7 @@ test('should compile query objects with x-axis', () => { }, columns: [], drop_missing_columns: false, - flatten_columns: false, index: ['my_index'], - reset_index: false, }, }, { @@ -366,3 +397,120 @@ test('should compile query objects with x-axis', () => { }), ); }); + +test("shouldn't convert a queryObject with axis although FF is enabled", () => { + const windowSpy = jest + .spyOn(window, 'window', 'get') + // @ts-ignore + .mockImplementation(() => ({ + featureFlags: { + GENERIC_CHART_AXES: true, + }, + })); + + const { queries } = buildQuery(formDataMixedChart); + expect(queries[0]).toEqual( + expect.objectContaining({ + granularity: 'ds', + columns: ['foo'], + series_columns: ['foo'], + metrics: ['sum(sales)'], + is_timeseries: true, + extras: { + time_grain_sqla: 'P1W', + having: '', + where: "(foo in ('a', 'b'))", + }, + post_processing: [ + { + operation: 'pivot', + options: { + aggregates: { + 'sum(sales)': { + operator: 'mean', + }, + }, + columns: ['foo'], + drop_missing_columns: false, + index: ['__timestamp'], + }, + }, + { + operation: 'rename', + options: { columns: { 'sum(sales)': null }, inplace: true, level: 0 }, + }, + { + operation: 'flatten', + }, + ], + }), + ); + expect(queries[1]).toEqual( + expect.objectContaining({ + granularity: 'ds', + columns: [], + series_columns: [], + metrics: ['count'], + is_timeseries: true, + extras: { + time_grain_sqla: 'P1W', + having: '', + where: "(name in ('c', 'd'))", + }, + post_processing: [ + { + operation: 'pivot', + options: { + aggregates: { + count: { + operator: 'mean', + }, + }, + columns: [], + drop_missing_columns: false, + index: ['__timestamp'], + }, + }, + { + operation: 'flatten', + }, + ], + }), + ); + + windowSpy.mockRestore(); +}); + +test('ensure correct pivot columns with GENERIC_CHART_AXES enabled', () => { + const windowSpy = jest + .spyOn(window, 'window', 'get') + // @ts-ignore + .mockImplementation(() => ({ + featureFlags: { + GENERIC_CHART_AXES: true, + }, + })); + + const query = buildQuery({ ...formDataMixedChartWithAA, x_axis: 'ds' }) + .queries[0]; + + expect(query.time_offsets).toEqual(['1 years ago']); + + // pivot + expect( + query.post_processing?.find(operator => operator?.operation === 'pivot'), + ).toEqual({ + operation: 'pivot', + options: { + index: ['ds'], + columns: ['foo'], + drop_missing_columns: false, + aggregates: { + 'sum(sales)': { operator: 'mean' }, + 'sum(sales)__1 years ago': { operator: 'mean' }, + }, + }, + }); + + windowSpy.mockRestore(); +}); diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/buildQuery.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/buildQuery.test.ts index 7c0787dc0241..611f021af16f 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/buildQuery.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/buildQuery.test.ts @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ +import { SqlaFormData } from '@superset-ui/core'; import buildQuery from '../../src/Timeseries/buildQuery'; describe('Timeseries buildQuery', () => { @@ -40,7 +41,7 @@ describe('Timeseries buildQuery', () => { }); const [query] = queryContext.queries; expect(query.metrics).toEqual(['bar', 'baz']); - expect(query.timeseries_limit_metric).toEqual('bar'); + expect(query.series_limit_metric).toEqual('bar'); expect(query.order_desc).toEqual(true); expect(query.orderby).toEqual([['bar', false]]); }); @@ -54,8 +55,186 @@ describe('Timeseries buildQuery', () => { }); const [query] = queryContext.queries; expect(query.metrics).toEqual(['bar', 'baz']); - expect(query.timeseries_limit_metric).toEqual('bar'); + expect(query.series_limit_metric).toEqual('bar'); expect(query.order_desc).toEqual(true); expect(query.orderby).toEqual([['foo', true]]); }); }); + +describe('GENERIC_CHART_AXES is enabled', () => { + let windowSpy: any; + + beforeAll(() => { + // @ts-ignore + windowSpy = jest.spyOn(window, 'window', 'get').mockImplementation(() => ({ + featureFlags: { + GENERIC_CHART_AXES: true, + }, + })); + }); + + afterAll(() => { + windowSpy.mockRestore(); + }); + + const formData: SqlaFormData = { + datasource: '5__table', + viz_type: 'table', + granularity_sqla: 'time_column', + time_grain_sqla: 'P1Y', + time_range: '1 year ago : 2013', + groupby: ['col1'], + metrics: ['count(*)'], + }; + + it("shouldn't convert queryObject", () => { + const { queries } = buildQuery(formData); + expect(queries[0]).toEqual( + expect.objectContaining({ + granularity: 'time_column', + time_range: '1 year ago : 2013', + extras: { time_grain_sqla: 'P1Y', having: '', where: '' }, + columns: ['col1'], + series_columns: ['col1'], + metrics: ['count(*)'], + is_timeseries: true, + post_processing: [ + { + operation: 'pivot', + options: { + aggregates: { 'count(*)': { operator: 'mean' } }, + columns: ['col1'], + drop_missing_columns: true, + index: ['__timestamp'], + }, + }, + { operation: 'flatten' }, + ], + }), + ); + }); + + it('should convert queryObject', () => { + const { queries } = buildQuery({ ...formData, x_axis: 'time_column' }); + expect(queries[0]).toEqual( + expect.objectContaining({ + granularity: 'time_column', + time_range: '1 year ago : 2013', + extras: { having: '', where: '' }, + columns: [ + { + columnType: 'BASE_AXIS', + expressionType: 'SQL', + label: 'time_column', + sqlExpression: 'time_column', + timeGrain: 'P1Y', + }, + 'col1', + ], + series_columns: ['col1'], + metrics: ['count(*)'], + post_processing: [ + { + operation: 'pivot', + options: { + aggregates: { 'count(*)': { operator: 'mean' } }, + columns: ['col1'], + drop_missing_columns: true, + index: ['time_column'], + }, + }, + { operation: 'flatten' }, + ], + }), + ); + }); +}); + +describe('GENERIC_CHART_AXES is disabled', () => { + let windowSpy: any; + + beforeAll(() => { + // @ts-ignore + windowSpy = jest.spyOn(window, 'window', 'get').mockImplementation(() => ({ + featureFlags: { + GENERIC_CHART_AXES: false, + }, + })); + }); + + afterAll(() => { + windowSpy.mockRestore(); + }); + + const formData: SqlaFormData = { + datasource: '5__table', + viz_type: 'table', + granularity_sqla: 'time_column', + time_grain_sqla: 'P1Y', + time_range: '1 year ago : 2013', + groupby: ['col1'], + metrics: ['count(*)'], + }; + + it("shouldn't convert queryObject", () => { + const { queries } = buildQuery(formData); + expect(queries[0]).toEqual( + expect.objectContaining({ + granularity: 'time_column', + time_range: '1 year ago : 2013', + extras: { time_grain_sqla: 'P1Y', having: '', where: '' }, + columns: ['col1'], + series_columns: ['col1'], + metrics: ['count(*)'], + is_timeseries: true, + post_processing: [ + { + operation: 'pivot', + options: { + aggregates: { 'count(*)': { operator: 'mean' } }, + columns: ['col1'], + drop_missing_columns: true, + index: ['__timestamp'], + }, + }, + { operation: 'flatten' }, + ], + }), + ); + }); + + it('should convert queryObject', () => { + const { queries } = buildQuery({ ...formData, x_axis: 'time_column' }); + expect(queries[0]).toEqual( + expect.objectContaining({ + granularity: 'time_column', + time_range: '1 year ago : 2013', + extras: { having: '', where: '' }, + columns: [ + { + columnType: 'BASE_AXIS', + expressionType: 'SQL', + label: 'time_column', + sqlExpression: 'time_column', + timeGrain: 'P1Y', + }, + 'col1', + ], + series_columns: ['col1'], + metrics: ['count(*)'], + post_processing: [ + { + operation: 'pivot', + options: { + aggregates: { 'count(*)': { operator: 'mean' } }, + columns: ['col1'], + drop_missing_columns: true, + index: ['time_column'], + }, + }, + { operation: 'flatten' }, + ], + }), + ); + }); +}); diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Tree/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Tree/transformProps.test.ts index ad06455cb11f..6a56c997c22b 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/Tree/transformProps.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/Tree/transformProps.test.ts @@ -18,6 +18,7 @@ */ import { ChartProps, supersetTheme } from '@superset-ui/core'; import transformProps from '../../src/Tree/transformProps'; +import { EchartsTreeChartProps } from '../../src/Tree/types'; describe('EchartsTree transformProps', () => { const formData = { @@ -70,7 +71,7 @@ describe('EchartsTree transformProps', () => { ]; const chartProps = new ChartProps({ ...chartPropsConfig, queriesData }); - expect(transformProps(chartProps)).toEqual( + expect(transformProps(chartProps as EchartsTreeChartProps)).toEqual( expect.objectContaining({ width: 800, height: 600, @@ -137,7 +138,7 @@ describe('EchartsTree transformProps', () => { ]; const chartProps = new ChartProps({ ...chartPropsConfig, queriesData }); - expect(transformProps(chartProps)).toEqual( + expect(transformProps(chartProps as EchartsTreeChartProps)).toEqual( expect.objectContaining({ width: 800, height: 600, @@ -223,7 +224,7 @@ describe('EchartsTree transformProps', () => { ]; const chartProps = new ChartProps({ ...chartPropsConfig, queriesData }); - expect(transformProps(chartProps)).toEqual( + expect(transformProps(chartProps as EchartsTreeChartProps)).toEqual( expect.objectContaining({ width: 800, height: 600, @@ -299,7 +300,7 @@ describe('EchartsTree transformProps', () => { ]; const chartProps = new ChartProps({ ...chartPropsConfig, queriesData }); - expect(transformProps(chartProps)).toEqual( + expect(transformProps(chartProps as EchartsTreeChartProps)).toEqual( expect.objectContaining({ width: 800, height: 600, @@ -385,7 +386,7 @@ describe('EchartsTree transformProps', () => { ]; const chartProps = new ChartProps({ ...chartPropsConfig, queriesData }); - expect(transformProps(chartProps)).toEqual( + expect(transformProps(chartProps as EchartsTreeChartProps)).toEqual( expect.objectContaining({ width: 800, height: 600, diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/utils/annotation.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/utils/annotation.test.ts index 4d6b16492414..bef98483be20 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/utils/annotation.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/utils/annotation.test.ts @@ -17,12 +17,14 @@ * under the License. */ import { - AnnotationLayer, AnnotationData, + AnnotationLayer, AnnotationOpacity, AnnotationSourceType, AnnotationStyle, AnnotationType, + AxisType, + DataRecord, FormulaAnnotationLayer, TimeseriesDataRecord, } from '@superset-ui/core'; @@ -160,7 +162,7 @@ describe('evalFormula', () => { { __timestamp: 10 }, ]; - expect(evalFormula(layer, data)).toEqual([ + expect(evalFormula(layer, data, '__timestamp', AxisType.time)).toEqual([ [0, 1], [10, 11], ]); @@ -172,9 +174,32 @@ describe('evalFormula', () => { { __timestamp: 10 }, ]; - expect(evalFormula({ ...layer, value: 'y = x* 2 -1' }, data)).toEqual([ + expect( + evalFormula( + { ...layer, value: 'y = x* 2 -1' }, + data, + '__timestamp', + AxisType.time, + ), + ).toEqual([ [0, -1], [10, 19], ]); }); + + it('Should evaluate a formula if axis type is category', () => { + const data: DataRecord[] = [{ gender: 'boy' }, { gender: 'girl' }]; + + expect( + evalFormula( + { ...layer, value: 'y = 1000' }, + data, + 'gender', + AxisType.category, + ), + ).toEqual([ + ['boy', 1000], + ['girl', 1000], + ]); + }); }); diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts index 3f20e0d5f8a3..3bd949d8ad63 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts @@ -26,6 +26,7 @@ import { getLegendProps, sanitizeHtml, extractShowValueIndexes, + getOverMaxHiddenFormatter, } from '../../src/utils/series'; import { LegendOrientation, LegendType } from '../../src/types'; import { defaultLegendPadding } from '../../src/defaults'; @@ -536,4 +537,16 @@ describe('formatSeriesName', () => { expect(sanitizeHtml(NULL_STRING)).toEqual('<NULL>'); }); }); + + describe('getOverMaxHiddenFormatter', () => { + it('should hide value if greater than max', () => { + const formatter = getOverMaxHiddenFormatter({ max: 81000 }); + expect(formatter.format(84500)).toEqual(''); + }); + it('should show value if less or equal than max', () => { + const formatter = getOverMaxHiddenFormatter({ max: 81000 }); + expect(formatter.format(81000)).toEqual('81000'); + expect(formatter.format(50000)).toEqual('50000'); + }); + }); }); diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/utils/treeBuilder.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/utils/treeBuilder.test.ts new file mode 100644 index 000000000000..b91349a89535 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-echarts/test/utils/treeBuilder.test.ts @@ -0,0 +1,274 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { treeBuilder } from '../../src/utils/treeBuilder'; + +describe('test treeBuilder', () => { + const data = [ + { + foo: 'a-1', + bar: 'a', + count: 2, + count2: 3, + }, + { + foo: 'a-2', + bar: 'a', + count: 2, + count2: 3, + }, + { + foo: 'b-1', + bar: 'b', + count: 2, + count2: 3, + }, + { + foo: 'b-2', + bar: 'b', + count: 2, + count2: 3, + }, + { + foo: 'c-1', + bar: 'c', + count: 2, + count2: 3, + }, + { + foo: 'c-2', + bar: 'c', + count: 2, + count2: 3, + }, + { + foo: 'd-1', + bar: 'd', + count: 2, + count2: 3, + }, + ]; + it('should build tree as expected', () => { + const tree = treeBuilder(data, ['foo', 'bar'], 'count'); + expect(tree).toEqual([ + { + children: [ + { + groupBy: 'bar', + name: 'a', + secondaryValue: 2, + value: 2, + }, + ], + groupBy: 'foo', + name: 'a-1', + secondaryValue: 2, + value: 2, + }, + { + children: [ + { + groupBy: 'bar', + name: 'a', + secondaryValue: 2, + value: 2, + }, + ], + groupBy: 'foo', + name: 'a-2', + secondaryValue: 2, + value: 2, + }, + { + children: [ + { + groupBy: 'bar', + name: 'b', + secondaryValue: 2, + value: 2, + }, + ], + groupBy: 'foo', + name: 'b-1', + secondaryValue: 2, + value: 2, + }, + { + children: [ + { + groupBy: 'bar', + name: 'b', + secondaryValue: 2, + value: 2, + }, + ], + groupBy: 'foo', + name: 'b-2', + secondaryValue: 2, + value: 2, + }, + { + children: [ + { + groupBy: 'bar', + name: 'c', + secondaryValue: 2, + value: 2, + }, + ], + groupBy: 'foo', + name: 'c-1', + secondaryValue: 2, + value: 2, + }, + { + children: [ + { + groupBy: 'bar', + name: 'c', + secondaryValue: 2, + value: 2, + }, + ], + groupBy: 'foo', + name: 'c-2', + secondaryValue: 2, + value: 2, + }, + { + children: [ + { + groupBy: 'bar', + name: 'd', + secondaryValue: 2, + value: 2, + }, + ], + groupBy: 'foo', + name: 'd-1', + secondaryValue: 2, + value: 2, + }, + ]); + }); + + it('should build tree with secondaryValue as expected', () => { + const tree = treeBuilder(data, ['foo', 'bar'], 'count', 'count2'); + expect(tree).toEqual([ + { + children: [ + { + groupBy: 'bar', + name: 'a', + secondaryValue: 3, + value: 2, + }, + ], + groupBy: 'foo', + name: 'a-1', + secondaryValue: 3, + value: 2, + }, + { + children: [ + { + groupBy: 'bar', + name: 'a', + secondaryValue: 3, + value: 2, + }, + ], + groupBy: 'foo', + name: 'a-2', + secondaryValue: 3, + value: 2, + }, + { + children: [ + { + groupBy: 'bar', + name: 'b', + secondaryValue: 3, + value: 2, + }, + ], + groupBy: 'foo', + name: 'b-1', + secondaryValue: 3, + value: 2, + }, + { + children: [ + { + groupBy: 'bar', + name: 'b', + secondaryValue: 3, + value: 2, + }, + ], + groupBy: 'foo', + name: 'b-2', + secondaryValue: 3, + value: 2, + }, + { + children: [ + { + groupBy: 'bar', + name: 'c', + secondaryValue: 3, + value: 2, + }, + ], + groupBy: 'foo', + name: 'c-1', + secondaryValue: 3, + value: 2, + }, + { + children: [ + { + groupBy: 'bar', + name: 'c', + secondaryValue: 3, + value: 2, + }, + ], + groupBy: 'foo', + name: 'c-2', + secondaryValue: 3, + value: 2, + }, + { + children: [ + { + groupBy: 'bar', + name: 'd', + secondaryValue: 3, + value: 2, + }, + ], + groupBy: 'foo', + name: 'd-1', + secondaryValue: 3, + value: 2, + }, + ]); + }); +}); diff --git a/superset-frontend/plugins/plugin-chart-handlebars/package.json b/superset-frontend/plugins/plugin-chart-handlebars/package.json index da88ada90bae..0a14440b5bd7 100644 --- a/superset-frontend/plugins/plugin-chart-handlebars/package.json +++ b/superset-frontend/plugins/plugin-chart-handlebars/package.json @@ -1,6 +1,6 @@ { "name": "@superset-ui/plugin-chart-handlebars", - "version": "0.0.0", + "version": "0.18.25", "description": "Superset Chart - Write a handlebars template to render the data", "sideEffects": false, "main": "lib/index.js", @@ -26,7 +26,8 @@ "access": "public" }, "dependencies": { - "handlebars": "^4.7.7" + "handlebars": "^4.7.7", + "just-handlebars-helpers": "^1.0.19" }, "peerDependencies": { "@superset-ui/chart-controls": "*", @@ -35,12 +36,12 @@ "lodash": "^4.17.11", "moment": "^2.26.0", "react": "^16.13.1", - "react-ace": "^9.4.4", + "react-ace": "^10.1.0", "react-dom": "^16.13.1" }, "devDependencies": { - "@types/lodash": "^4.14.149", "@types/jest": "^26.0.0", + "@types/lodash": "^4.14.149", "jest": "^26.0.1" } } diff --git a/superset-frontend/plugins/plugin-chart-handlebars/src/components/Handlebars/HandlebarsViewer.tsx b/superset-frontend/plugins/plugin-chart-handlebars/src/components/Handlebars/HandlebarsViewer.tsx index b1ec9597ac26..371b4f48f91a 100644 --- a/superset-frontend/plugins/plugin-chart-handlebars/src/components/Handlebars/HandlebarsViewer.tsx +++ b/superset-frontend/plugins/plugin-chart-handlebars/src/components/Handlebars/HandlebarsViewer.tsx @@ -16,11 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -import { SafeMarkdown, styled } from '@superset-ui/core'; +import { SafeMarkdown, styled, t } from '@superset-ui/core'; import Handlebars from 'handlebars'; import moment from 'moment'; import React, { useMemo, useState } from 'react'; import { isPlainObject } from 'lodash'; +import Helpers from 'just-handlebars-helpers'; export interface HandlebarsViewerProps { templateSource: string; @@ -70,7 +71,7 @@ export const HandlebarsViewer = ({ /> ); } - return <p>Loading...</p>; + return <p>{t('Loading...')}</p>; }; // usage: {{dateFormat my_date format="MMMM YYYY"}} @@ -86,3 +87,5 @@ Handlebars.registerHelper('stringify', (obj: any, obj2: any) => { throw Error('Please call with an object. Example: `stringify myObj`'); return isPlainObject(obj) ? JSON.stringify(obj) : String(obj); }); + +Helpers.registerHelpers(Handlebars); diff --git a/superset-frontend/plugins/plugin-chart-handlebars/src/consts.ts b/superset-frontend/plugins/plugin-chart-handlebars/src/consts.ts index 562f654431b5..e566fd66b279 100644 --- a/superset-frontend/plugins/plugin-chart-handlebars/src/consts.ts +++ b/superset-frontend/plugins/plugin-chart-handlebars/src/consts.ts @@ -18,10 +18,7 @@ */ import { debounce } from 'lodash'; import { formatSelectOptions } from '@superset-ui/chart-controls'; -import { addLocaleData, SLOW_DEBOUNCE, t } from '@superset-ui/core'; -import i18n from './i18n'; - -addLocaleData(i18n); +import { SLOW_DEBOUNCE, t } from '@superset-ui/core'; export const PAGE_SIZE_OPTIONS = formatSelectOptions<number>([ [0, t('page_size.all')], diff --git a/superset-frontend/plugins/plugin-chart-handlebars/src/i18n.ts b/superset-frontend/plugins/plugin-chart-handlebars/src/i18n.ts deleted file mode 100644 index 5d015b566597..000000000000 --- a/superset-frontend/plugins/plugin-chart-handlebars/src/i18n.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { Locale } from '@superset-ui/core'; - -const en = { - 'Query Mode': [''], - Aggregate: [''], - 'Raw Records': [''], - 'Emit Filter Events': [''], - 'Show Cell Bars': [''], - 'page_size.show': ['Show'], - 'page_size.all': ['All'], - 'page_size.entries': ['entries'], - 'table.previous_page': ['Previous'], - 'table.next_page': ['Next'], - 'search.num_records': ['%s record', '%s records...'], -}; - -const translations: Partial<Record<Locale, typeof en>> = { - en, - fr: { - 'Query Mode': [''], - Aggregate: [''], - 'Raw Records': [''], - 'Emit Filter Events': [''], - 'Show Cell Bars': [''], - 'page_size.show': ['Afficher'], - 'page_size.all': ['tous'], - 'page_size.entries': ['entrées'], - 'table.previous_page': ['Précédent'], - 'table.next_page': ['Suivante'], - 'search.num_records': ['%s enregistrement', '%s enregistrements...'], - }, - zh: { - 'Query Mode': ['查询模式'], - Aggregate: ['分组聚合'], - 'Raw Records': ['原始数据'], - 'Emit Filter Events': ['关联看板过滤器'], - 'Show Cell Bars': ['为指标添加条状图背景'], - 'page_size.show': ['每页显示'], - 'page_size.all': ['全部'], - 'page_size.entries': ['条'], - 'table.previous_page': ['上一页'], - 'table.next_page': ['下一页'], - 'search.num_records': ['%s条记录...'], - }, -}; - -export default translations; diff --git a/superset-frontend/plugins/plugin-chart-handlebars/src/images/example1.jpg b/superset-frontend/plugins/plugin-chart-handlebars/src/images/example1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2307cec80d2d048010fa54d06663d51069fa0f7d GIT binary patch literal 97899 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 A?*IS* literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-handlebars/src/images/example2.jpg b/superset-frontend/plugins/plugin-chart-handlebars/src/images/example2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94dc10538511bdca4a7ce9596b7cde60d0b31853 GIT binary patch literal 294384 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 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/buildQuery.ts b/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/buildQuery.ts index 3dc7bf87a3a7..c741e6c46577 100644 --- a/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/buildQuery.ts +++ b/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/buildQuery.ts @@ -23,13 +23,10 @@ import { } from '@superset-ui/core'; export default function buildQuery(formData: QueryFormData) { - const { groupby } = formData; - return buildQueryContext(formData, baseQueryObject => [ { ...baseQueryObject, orderby: normalizeOrderBy(baseQueryObject).orderby, - ...(groupby && { groupby }), }, ]); } diff --git a/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controlPanel.tsx index aa4efe62122a..03904e54c83f 100644 --- a/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controlPanel.tsx @@ -18,11 +18,10 @@ */ import { ControlPanelConfig, - emitFilterControl, + getStandardizedControls, sections, } from '@superset-ui/chart-controls'; -import { addLocaleData, t } from '@superset-ui/core'; -import i18n from '../i18n'; +import { t } from '@superset-ui/core'; import { allColumnsControlSetItem } from './controls/columns'; import { groupByControlSetItem } from './controls/groupBy'; import { handlebarsTemplateControlSetItem } from './controls/handlebarTemplate'; @@ -47,11 +46,9 @@ import { import { queryModeControlSetItem } from './controls/queryMode'; import { styleControlSetItem } from './controls/style'; -addLocaleData(i18n); - const config: ControlPanelConfig = { controlPanelSections: [ - sections.legacyTimeseriesTime, + sections.genericTime, { label: t('Query'), expanded: true, @@ -67,7 +64,6 @@ const config: ControlPanelConfig = { [includeTimeControlSetItem], [showTotalsControlSetItem], ['adhoc_filters'], - emitFilterControl, ], }, { @@ -79,6 +75,11 @@ const config: ControlPanelConfig = { ], }, ], + formDataOverrides: formData => ({ + ...formData, + groupby: getStandardizedControls().popAllColumns(), + metrics: getStandardizedControls().popAllMetrics(), + }), }; export default config; diff --git a/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx b/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx index 3aec61dc4060..3c2434ac4063 100644 --- a/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx +++ b/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx @@ -49,7 +49,7 @@ const allColumns: typeof sharedControls.groupby = { options: datasource?.columns || [], queryMode: getQueryMode(controls), externalValidationErrors: - isRawMode({ controls }) && ensureIsArray(controlState.value).length === 0 + isRawMode({ controls }) && ensureIsArray(controlState?.value).length === 0 ? [t('must have a value')] : [], }), @@ -74,7 +74,7 @@ const dndAllColumns: typeof sharedControls.groupby = { } newState.queryMode = getQueryMode(controls); newState.externalValidationErrors = - isRawMode({ controls }) && ensureIsArray(controlState.value).length === 0 + isRawMode({ controls }) && ensureIsArray(controlState?.value).length === 0 ? [t('must have a value')] : []; return newState; diff --git a/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/metrics.tsx b/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/metrics.tsx index 96eab55f9297..c6aad5e320ba 100644 --- a/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/metrics.tsx +++ b/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/metrics.tsx @@ -46,7 +46,7 @@ const percentMetrics: typeof sharedControls.metrics = { externalValidationErrors: validateAggControlValues(controls, [ controls.groupby?.value, controls.metrics?.value, - controlState.value, + controlState?.value, ]), }), rerender: ['groupby', 'metrics'], diff --git a/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/index.ts b/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/index.ts index db5ad528f8f6..41249f2d7162 100644 --- a/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/index.ts +++ b/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/index.ts @@ -18,6 +18,8 @@ */ import { ChartMetadata, ChartPlugin, t } from '@superset-ui/core'; import thumbnail from '../images/thumbnail.png'; +import example1 from '../images/example1.jpg'; +import example2 from '../images/example2.jpg'; import buildQuery from './buildQuery'; import controlPanel from './controlPanel'; import transformProps from './transformProps'; @@ -35,9 +37,10 @@ export default class HandlebarsChartPlugin extends ChartPlugin { */ constructor() { const metadata = new ChartMetadata({ - description: 'Write a handlebars template to render the data', + description: t('Write a handlebars template to render the data'), name: t('Handlebars'), thumbnail, + exampleGallery: [{ url: example1 }, { url: example2 }], }); super({ diff --git a/superset-frontend/plugins/plugin-chart-handlebars/src/types.ts b/superset-frontend/plugins/plugin-chart-handlebars/src/types.ts index 2a363059fa7d..741d3b982c48 100644 --- a/superset-frontend/plugins/plugin-chart-handlebars/src/types.ts +++ b/superset-frontend/plugins/plugin-chart-handlebars/src/types.ts @@ -51,7 +51,6 @@ export type HandlebarsQueryFormData = QueryFormData & all_columns?: QueryFormMetric[] | null; order_desc?: boolean; table_timestamp_format?: string; - emit_filter?: boolean; granularitySqla?: string; time_grain_sqla?: TimeGranularity; column_config?: Record<string, ColumnConfig>; diff --git a/superset-frontend/plugins/plugin-chart-handlebars/test/plugin/buildQuery.test.ts b/superset-frontend/plugins/plugin-chart-handlebars/test/plugin/buildQuery.test.ts index 217ee50485f8..6f84b6afe4bc 100644 --- a/superset-frontend/plugins/plugin-chart-handlebars/test/plugin/buildQuery.test.ts +++ b/superset-frontend/plugins/plugin-chart-handlebars/test/plugin/buildQuery.test.ts @@ -32,6 +32,6 @@ describe('Handlebars buildQuery', () => { it('should build groupby with series in form data', () => { const queryContext = buildQuery(formData); const [query] = queryContext.queries; - expect(query.groupby).toEqual(['foo']); + expect(query.columns).toEqual(['foo']); }); }); diff --git a/superset-frontend/plugins/plugin-chart-handlebars/test/plugin/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-handlebars/test/plugin/transformProps.test.ts index 62903ad73f42..5910ea0f493e 100644 --- a/superset-frontend/plugins/plugin-chart-handlebars/test/plugin/transformProps.test.ts +++ b/superset-frontend/plugins/plugin-chart-handlebars/test/plugin/transformProps.test.ts @@ -20,7 +20,7 @@ import { ChartProps, QueryFormData, supersetTheme } from '@superset-ui/core'; import { HandlebarsQueryFormData } from '../../src/types'; import transformProps from '../../src/plugin/transformProps'; -describe('Handlebars tranformProps', () => { +describe('Handlebars transformProps', () => { const formData: HandlebarsQueryFormData = { colorScheme: 'bnbColors', datasource: '3__table', @@ -40,7 +40,7 @@ describe('Handlebars tranformProps', () => { theme: supersetTheme, }); - it('should tranform chart props for viz', () => { + it('should transform chart props for viz', () => { expect(transformProps(chartProps)).toEqual( expect.objectContaining({ width: 800, diff --git a/superset-frontend/plugins/plugin-chart-handlebars/types/external.d.ts b/superset-frontend/plugins/plugin-chart-handlebars/types/external.d.ts index 8f7985ceaf13..ae61945f0535 100644 --- a/superset-frontend/plugins/plugin-chart-handlebars/types/external.d.ts +++ b/superset-frontend/plugins/plugin-chart-handlebars/types/external.d.ts @@ -20,3 +20,5 @@ declare module '*.png' { const value: any; export default value; } +declare module '*.jpg'; +declare module 'just-handlebars-helpers'; diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/package.json b/superset-frontend/plugins/plugin-chart-pivot-table/package.json index a796b90836e9..bed12a2e7250 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/package.json +++ b/superset-frontend/plugins/plugin-chart-pivot-table/package.json @@ -32,7 +32,8 @@ "@ant-design/icons": "^4.2.2", "react": "^16.13.1", "react-dom": "^16.13.1", - "prop-types": "*" + "prop-types": "*", + "lodash": "^4.17.11" }, "devDependencies": { "@babel/types": "^7.13.12", diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/PivotTableChart.tsx b/superset-frontend/plugins/plugin-chart-pivot-table/src/PivotTableChart.tsx index 1cd079044d88..d9653686e11d 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/PivotTableChart.tsx +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/PivotTableChart.tsx @@ -27,8 +27,10 @@ import { NumberFormatter, styled, useTheme, + isAdhocColumn, + BinaryQueryObjectFilterClause, + t, } from '@superset-ui/core'; -import { isAdhocColumn } from '@superset-ui/chart-controls'; import { PivotTable, sortAs, aggregatorTemplates } from './react-pivottable'; import { FilterType, @@ -54,7 +56,7 @@ const PivotTableWrapper = styled.div` overflow: auto; `; -const METRIC_KEY = 'metric'; +const METRIC_KEY = t('metric'); const vals = ['value']; const StyledPlusSquareOutlined = styled(PlusSquareOutlined)` @@ -134,7 +136,7 @@ export default function PivotTableChart(props: PivotTableProps) { colTotals, rowTotals, valueFormat, - emitFilter, + emitCrossFilters, setDataMask, selectedFilters, verboseMap, @@ -142,6 +144,8 @@ export default function PivotTableChart(props: PivotTableProps) { metricsLayout, metricColorFormatters, dateFormatters, + onContextMenu, + timeGrainSqla, } = props; const theme = useTheme(); @@ -284,7 +288,7 @@ export default function PivotTableChart(props: PivotTableProps) { isSubtotal: boolean, isGrandTotal: boolean, ) => { - if (isSubtotal || isGrandTotal || !emitFilter) { + if (isSubtotal || isGrandTotal || !emitCrossFilters) { return; } @@ -324,7 +328,7 @@ export default function PivotTableChart(props: PivotTableProps) { } handleChange(updatedFilters); }, - [emitFilter, selectedFilters, handleChange], + [emitCrossFilters, selectedFilters, handleChange], ); const tableOptions = useMemo( @@ -333,7 +337,7 @@ export default function PivotTableChart(props: PivotTableProps) { clickColumnHeaderCallback: toggleFilter, colTotals, rowTotals, - highlightHeaderCellsOnHover: emitFilter, + highlightHeaderCellsOnHover: emitCrossFilters, highlightedHeaderCells: selectedFilters, omittedHighlightHeaderGroups: [METRIC_KEY], cellColorFormatters: { [METRIC_KEY]: metricColorFormatters }, @@ -342,7 +346,7 @@ export default function PivotTableChart(props: PivotTableProps) { [ colTotals, dateFormatters, - emitFilter, + emitCrossFilters, metricColorFormatters, rowTotals, selectedFilters, @@ -360,6 +364,52 @@ export default function PivotTableChart(props: PivotTableProps) { [colSubtotalPosition, rowSubtotalPosition], ); + const handleContextMenu = useCallback( + ( + e: MouseEvent, + colKey: (string | number | boolean)[] | undefined, + rowKey: (string | number | boolean)[] | undefined, + ) => { + if (onContextMenu) { + e.preventDefault(); + e.stopPropagation(); + const filters: BinaryQueryObjectFilterClause[] = []; + if (colKey && colKey.length > 1) { + colKey.forEach((val, i) => { + const col = cols[i]; + const formatter = dateFormatters[col]; + const formattedVal = formatter?.(val as number) || String(val); + if (i > 0) { + filters.push({ + col, + op: '==', + val, + formattedVal, + grain: formatter ? timeGrainSqla : undefined, + }); + } + }); + } + if (rowKey) { + rowKey.forEach((val, i) => { + const col = rows[i]; + const formatter = dateFormatters[col]; + const formattedVal = formatter?.(val as number) || String(val); + filters.push({ + col, + op: '==', + val, + formattedVal, + grain: formatter ? timeGrainSqla : undefined, + }); + }); + } + onContextMenu(e.clientX, e.clientY, filters); + } + }, + [cols, dateFormatters, onContextMenu, rows, timeGrainSqla], + ); + return ( <Styles height={height} width={width} margin={theme.gridUnit * 4}> <PivotTableWrapper> @@ -378,6 +428,7 @@ export default function PivotTableChart(props: PivotTableProps) { tableOptions={tableOptions} subtotalOptions={subtotalOptions} namesMapping={verboseMap} + onContextMenu={handleContextMenu} /> </PivotTableWrapper> </Styles> diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/images/example.jpg b/superset-frontend/plugins/plugin-chart-pivot-table/src/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4f534ed0a134ac664894cd55a515b00247dd549 GIT binary patch literal 66959 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 literal 0 HcmV?d00001 diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/buildQuery.ts b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/buildQuery.ts index 677902b79680..6e33b41cc790 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/buildQuery.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/buildQuery.ts @@ -16,9 +16,14 @@ * specific language governing permissions and limitations * under the License. */ +import omit from 'lodash/omit'; + import { + AdhocColumn, buildQueryContext, ensureIsArray, + hasGenericChartAxes, + isPhysicalColumn, QueryFormColumn, QueryFormOrderBy, } from '@superset-ui/core'; @@ -27,10 +32,29 @@ import { PivotTableQueryFormData } from '../types'; export default function buildQuery(formData: PivotTableQueryFormData) { const { groupbyColumns = [], groupbyRows = [] } = formData; // TODO: add deduping of AdhocColumns - const groupbySet = new Set([ - ...ensureIsArray<QueryFormColumn>(groupbyColumns), - ...ensureIsArray<QueryFormColumn>(groupbyRows), - ]); + const columns = Array.from( + new Set([ + ...ensureIsArray<QueryFormColumn>(groupbyColumns), + ...ensureIsArray<QueryFormColumn>(groupbyRows), + ]), + ).map(col => { + if ( + isPhysicalColumn(col) && + formData.time_grain_sqla && + hasGenericChartAxes && + formData?.temporal_columns_lookup?.[col] + ) { + return { + timeGrain: formData.time_grain_sqla, + columnType: 'BASE_AXIS', + sqlExpression: col, + label: col, + expressionType: 'SQL', + } as AdhocColumn; + } + return col; + }); + return buildQueryContext(formData, baseQueryObject => { const { series_limit_metric, metrics, order_desc } = baseQueryObject; let orderBy: QueryFormOrderBy[] | undefined; @@ -41,9 +65,11 @@ export default function buildQuery(formData: PivotTableQueryFormData) { } return [ { - ...baseQueryObject, + ...(hasGenericChartAxes + ? omit(baseQueryObject, ['extras.time_grain_sqla']) + : baseQueryObject), orderby: orderBy, - columns: [...groupbySet], + columns, }, ]; }); diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx index ce09ae1345ae..1b01e37a4c11 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx @@ -19,6 +19,9 @@ import React from 'react'; import { ensureIsArray, + hasGenericChartAxes, + isAdhocColumn, + isPhysicalColumn, QueryFormMetric, smartDateFormatter, t, @@ -27,17 +30,16 @@ import { import { ControlPanelConfig, D3_TIME_FORMAT_OPTIONS, - formatSelectOptions, sections, sharedControls, - emitFilterControl, Dataset, + getStandardizedControls, } from '@superset-ui/chart-controls'; import { MetricsLayoutEnum } from '../types'; const config: ControlPanelConfig = { controlPanelSections: [ - { ...sections.legacyTimeseriesTime, expanded: false }, + { ...sections.genericTime, expanded: false }, { label: t('Query'), expanded: true, @@ -62,6 +64,39 @@ const config: ControlPanelConfig = { }, }, ], + [ + hasGenericChartAxes + ? { + name: 'time_grain_sqla', + config: { + ...sharedControls.time_grain_sqla, + visibility: ({ controls }) => { + const dttmLookup = Object.fromEntries( + ensureIsArray(controls?.groupbyColumns?.options).map( + option => [option.column_name, option.is_dttm], + ), + ); + + return [ + ...ensureIsArray(controls?.groupbyColumns.value), + ...ensureIsArray(controls?.groupbyRows.value), + ] + .map(selection => { + if (isAdhocColumn(selection)) { + return true; + } + if (isPhysicalColumn(selection)) { + return !!dttmLookup[selection]; + } + return false; + }) + .some(Boolean); + }, + }, + } + : null, + hasGenericChartAxes ? 'temporal_columns_lookup' : null, + ], [ { name: 'metrics', @@ -91,7 +126,6 @@ const config: ControlPanelConfig = { }, ], ['adhoc_filters'], - emitFilterControl, ['series_limit'], [ { @@ -141,26 +175,29 @@ const config: ControlPanelConfig = { type: 'SelectControl', label: t('Aggregation function'), clearable: false, - choices: formatSelectOptions([ - 'Count', - 'Count Unique Values', - 'List Unique Values', - 'Sum', - 'Average', - 'Median', - 'Sample Variance', - 'Sample Standard Deviation', - 'Minimum', - 'Maximum', - 'First', - 'Last', - 'Sum as Fraction of Total', - 'Sum as Fraction of Rows', - 'Sum as Fraction of Columns', - 'Count as Fraction of Total', - 'Count as Fraction of Rows', - 'Count as Fraction of Columns', - ]), + choices: [ + ['Count', t('Count')], + ['Count Unique Values', t('Count Unique Values')], + ['List Unique Values', t('List Unique Values')], + ['Sum', t('Sum')], + ['Average', t('Average')], + ['Median', t('Median')], + ['Sample Variance', t('Sample Variance')], + ['Sample Standard Deviation', t('Sample Standard Deviation')], + ['Minimum', t('Minimum')], + ['Maximum', t('Maximum')], + ['First', t('First')], + ['Last', t('Last')], + ['Sum as Fraction of Total', t('Sum as Fraction of Total')], + ['Sum as Fraction of Rows', t('Sum as Fraction of Rows')], + ['Sum as Fraction of Columns', t('Sum as Fraction of Columns')], + ['Count as Fraction of Total', t('Count as Fraction of Total')], + ['Count as Fraction of Rows', t('Count as Fraction of Rows')], + [ + 'Count as Fraction of Columns', + t('Count as Fraction of Columns'), + ], + ], default: 'Sum', description: t( 'Aggregate function to apply when pivoting and computing the total rows and columns', @@ -373,14 +410,17 @@ const config: ControlPanelConfig = { ], }, ], - denormalizeFormData: formData => { - const groupbyColumns = - formData.standardizedFormData.standardizedState.columns.filter( - col => !ensureIsArray(formData.groupbyRows).includes(col), + formDataOverrides: formData => { + const groupbyColumns = getStandardizedControls().controls.columns.filter( + col => !ensureIsArray(formData.groupbyRows).includes(col), + ); + getStandardizedControls().controls.columns = + getStandardizedControls().controls.columns.filter( + col => !groupbyColumns.includes(col), ); return { ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, + metrics: getStandardizedControls().popAllMetrics(), groupbyColumns, }; }, diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts index 423ac596251b..b2d355f0fff2 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts @@ -28,6 +28,7 @@ import buildQuery from './buildQuery'; import controlPanel from './controlPanel'; import transformProps from './transformProps'; import thumbnail from '../images/thumbnail.png'; +import example from '../images/example.jpg'; import { PivotTableQueryFormData } from '../types'; export default class PivotTableChartPlugin extends ChartPlugin< @@ -46,12 +47,13 @@ export default class PivotTableChartPlugin extends ChartPlugin< */ constructor() { const metadata = new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Table'), description: t( 'Used to summarize a set of data by grouping together multiple statistics along two axes. Examples: Sales numbers by region and month, tasks by status and assignee, active users by age and location. Not the most visually stunning visualization, but highly informative and versatile.', ), - name: t('Pivot Table v2'), + exampleGallery: [{ url: example }], + name: t('Pivot Table'), tags: [t('Additive'), t('Report'), t('Tabular'), t('Popular')], thumbnail, }); diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts index 8666705b7a6a..43d73e6193ea 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts @@ -77,9 +77,10 @@ export default function transformProps(chartProps: ChartProps<QueryFormData>) { queriesData, formData, rawFormData, - hooks: { setDataMask = () => {} }, + hooks: { setDataMask = () => {}, onContextMenu }, filterState, datasource: { verboseMap = {}, columnFormats = {} }, + emitCrossFilters, } = chartProps; const { data, colnames, coltypes } = queriesData[0]; const { @@ -98,9 +99,9 @@ export default function transformProps(chartProps: ChartProps<QueryFormData>) { rowTotals, valueFormat, dateFormat, - emitFilter, metricsLayout, conditionalFormatting, + timeGrainSqla, } = formData; const { selectedFilters } = filterState; const granularity = extractTimegrain(rawFormData); @@ -156,7 +157,7 @@ export default function transformProps(chartProps: ChartProps<QueryFormData>) { colTotals, rowTotals, valueFormat, - emitFilter, + emitCrossFilters, setDataMask, selectedFilters, verboseMap, @@ -164,5 +165,7 @@ export default function transformProps(chartProps: ChartProps<QueryFormData>) { metricsLayout, metricColorFormatters, dateFormatters, + onContextMenu, + timeGrainSqla, }; } diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/PivotTable.jsx b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/PivotTable.jsx index bb79069d9019..610e80c0c3fe 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/PivotTable.jsx +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/PivotTable.jsx @@ -18,7 +18,6 @@ */ import React from 'react'; -import { PivotData } from './utilities'; import { TableRenderer } from './TableRenderers'; class PivotTable extends React.PureComponent { @@ -27,7 +26,7 @@ class PivotTable extends React.PureComponent { } } -PivotTable.propTypes = PivotData.propTypes; -PivotTable.defaultProps = PivotData.defaultProps; +PivotTable.propTypes = TableRenderer.propTypes; +PivotTable.defaultProps = TableRenderer.defaultProps; export default PivotTable; diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js index 1360e0dc921a..5393e4f610f0 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js @@ -20,9 +20,9 @@ import { css, styled } from '@superset-ui/core'; export const Styles = styled.div` - ${({ theme }) => css` + ${({ theme, isDashboardEditMode }) => css` table.pvtTable { - position: relative; + position: ${isDashboardEditMode ? 'inherit' : 'relative'}; font-size: ${theme.typography.sizes.s}px; text-align: left; margin: ${theme.gridUnit}px; @@ -32,7 +32,7 @@ export const Styles = styled.div` } table thead { - position: sticky; + position: ${isDashboardEditMode ? 'inherit' : 'sticky'}; top: 0; } @@ -51,7 +51,7 @@ export const Styles = styled.div` } table.pvtTable tbody tr.pvtRowTotals { - position: sticky; + position: ${isDashboardEditMode ? 'inherit' : 'sticky'}; bottom: 0; } diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx index fe0c2fb0d522..576325a21dde 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx @@ -18,6 +18,7 @@ */ import React from 'react'; +import { t } from '@superset-ui/core'; import PropTypes from 'prop-types'; import { PivotData, flatKey } from './utilities'; import { Styles } from './Styles'; @@ -462,7 +463,7 @@ export class TableRenderer extends React.Component { true, )} > - Subtotal + {t('Subtotal')} </th>, ); } @@ -486,7 +487,9 @@ export class TableRenderer extends React.Component { true, )} > - {`Total (${this.props.aggregatorName})`} + {t('Total (%(aggregatorName)s)', { + aggregatorName: t(this.props.aggregatorName), + })} </th> ) : null; @@ -549,7 +552,9 @@ export class TableRenderer extends React.Component { )} > {colAttrs.length === 0 - ? `Total (${this.props.aggregatorName})` + ? t('Total (%(aggregatorName)s)', { + aggregatorName: t(this.props.aggregatorName), + }) : null} </th> </tr> @@ -658,7 +663,7 @@ export class TableRenderer extends React.Component { true, )} > - Subtotal + {t('Subtotal')} </th> ) : null; @@ -700,6 +705,7 @@ export class TableRenderer extends React.Component { className="pvtVal" key={`pvtVal-${flatColKey}`} onClick={rowClickHandlers[flatColKey]} + onContextMenu={e => this.props.onContextMenu(e, colKey, rowKey)} style={style} > {agg.format(aggValue)} @@ -717,6 +723,7 @@ export class TableRenderer extends React.Component { key="total" className="pvtTotal" onClick={rowTotalCallbacks[flatRowKey]} + onContextMenu={e => this.props.onContextMenu(e, undefined, rowKey)} > {agg.format(aggValue)} </td> @@ -761,7 +768,9 @@ export class TableRenderer extends React.Component { true, )} > - {`Total (${this.props.aggregatorName})`} + {t('Total (%(aggregatorName)s)', { + aggregatorName: t(this.props.aggregatorName), + })} </th> ); @@ -776,6 +785,7 @@ export class TableRenderer extends React.Component { className="pvtTotal pvtRowTotal" key={`total-${flatColKey}`} onClick={colTotalCallbacks[flatColKey]} + onContextMenu={e => this.props.onContextMenu(e, colKey, undefined)} style={{ padding: '5px' }} > {agg.format(aggValue)} @@ -793,6 +803,7 @@ export class TableRenderer extends React.Component { key="total" className="pvtGrandTotal pvtRowTotal" onClick={grandTotalCallback} + onContextMenu={e => this.props.onContextMenu(e, undefined, undefined)} > {agg.format(aggValue)} </td> @@ -822,6 +833,10 @@ export class TableRenderer extends React.Component { ); } + isDashboardEditMode() { + return document.contains(document.querySelector('.dashboard--editing')); + } + render() { if (this.cachedProps !== this.props) { this.cachedProps = this.props; @@ -863,7 +878,7 @@ export class TableRenderer extends React.Component { }; return ( - <Styles> + <Styles isDashboardEditMode={this.isDashboardEditMode()}> <table className="pvtTable" role="grid"> <thead> {colAttrs.map((c, j) => @@ -886,5 +901,6 @@ export class TableRenderer extends React.Component { TableRenderer.propTypes = { ...PivotData.propTypes, tableOptions: PropTypes.object, + onContextMenu: PropTypes.func, }; TableRenderer.defaultProps = { ...PivotData.defaultProps, tableOptions: {} }; diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/utilities.js b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/utilities.js index 9ae588881977..9b47132936b4 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/utilities.js +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/utilities.js @@ -231,7 +231,7 @@ const baseAggregatorTemplates = { return { sum: 0, push(record) { - if (Number.isNaN(parseFloat(record[attr]))) { + if (Number.isNaN(Number(record[attr]))) { this.sum = record[attr]; } else { this.sum += parseFloat(record[attr]); @@ -259,7 +259,7 @@ const baseAggregatorTemplates = { push(record) { const x = record[attr]; if (['min', 'max'].includes(mode)) { - const coercedValue = parseFloat(x); + const coercedValue = Number(x); if (Number.isNaN(coercedValue)) { this.val = !this.val || @@ -308,7 +308,7 @@ const baseAggregatorTemplates = { strMap: {}, push(record) { const val = record[attr]; - const x = parseFloat(val); + const x = Number(val); if (Number.isNaN(x)) { this.strMap[val] = (this.strMap[val] || 0) + 1; @@ -354,7 +354,7 @@ const baseAggregatorTemplates = { s: 0.0, strValue: null, push(record) { - const x = parseFloat(record[attr]); + const x = Number(record[attr]); if (Number.isNaN(x)) { this.strValue = typeof record[attr] === 'string' ? record[attr] : this.strValue; @@ -405,10 +405,10 @@ const baseAggregatorTemplates = { sumNum: 0, sumDenom: 0, push(record) { - if (!Number.isNaN(parseFloat(record[num]))) { + if (!Number.isNaN(Number(record[num]))) { this.sumNum += parseFloat(record[num]); } - if (!Number.isNaN(parseFloat(record[denom]))) { + if (!Number.isNaN(Number(record[denom]))) { this.sumDenom += parseFloat(record[denom]); } }, diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/types.ts b/superset-frontend/plugins/plugin-chart-pivot-table/src/types.ts index 38d725e922b3..24d78e2dcaec 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/types.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/types.ts @@ -26,6 +26,8 @@ import { NumberFormatter, QueryFormMetric, QueryFormColumn, + BinaryQueryObjectFilterClause, + TimeGranularity, } from '@superset-ui/core'; import { ColorFormatters } from '@superset-ui/chart-controls'; @@ -63,7 +65,7 @@ interface PivotTableCustomizeProps { rowTotals: boolean; valueFormat: string; setDataMask: SetDataMaskHook; - emitFilter?: boolean; + emitCrossFilters?: boolean; selectedFilters?: SelectedFiltersType; verboseMap: JsonObject; columnFormats: JsonObject; @@ -72,6 +74,12 @@ interface PivotTableCustomizeProps { dateFormatters: Record<string, DateFormatter | undefined>; legacy_order_by: QueryFormMetric[] | QueryFormMetric | null; order_desc: boolean; + onContextMenu?: ( + clientX: number, + clientY: number, + filters?: BinaryQueryObjectFilterClause[], + ) => void; + timeGrainSqla?: TimeGranularity; } export type PivotTableQueryFormData = QueryFormData & diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts index 26c938e371bc..3edb4619afce 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts @@ -38,7 +38,6 @@ describe('PivotTableChart transformProps', () => { colTotals: true, rowTotals: true, valueFormat: 'SMART_NUMBER', - emitFilter: false, metricsLayout: MetricsLayoutEnum.COLUMNS, viz_type: '', datasource: '', @@ -83,13 +82,13 @@ describe('PivotTableChart transformProps', () => { rowTotals: true, valueFormat: 'SMART_NUMBER', data: [{ name: 'Hulk', sum__num: 1, __timestamp: 599616000000 }], - emitFilter: false, setDataMask, selectedFilters: {}, verboseMap: {}, metricsLayout: MetricsLayoutEnum.COLUMNS, metricColorFormatters: [], dateFormatters: {}, + emitCrossFilters: false, columnFormats: {}, }); }); diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/types/external.d.ts b/superset-frontend/plugins/plugin-chart-pivot-table/types/external.d.ts index a273f3a2ba3e..ecdf68a7452c 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/types/external.d.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/types/external.d.ts @@ -21,3 +21,5 @@ declare module '*.png' { const value: any; export default value; } + +declare module '*.jpg'; diff --git a/superset-frontend/plugins/plugin-chart-table/package.json b/superset-frontend/plugins/plugin-chart-table/package.json index 0577c731a6ba..293413805d13 100644 --- a/superset-frontend/plugins/plugin-chart-table/package.json +++ b/superset-frontend/plugins/plugin-chart-table/package.json @@ -28,8 +28,9 @@ "dependencies": { "@react-icons/all-files": "^4.1.0", "@types/d3-array": "^2.9.0", - "@types/react-table": "^7.0.29", "@types/enzyme": "^3.10.5", + "@types/react-table": "^7.0.29", + "classnames": "^2.3.2", "d3-array": "^2.4.0", "match-sorter": "^6.3.0", "memoize-one": "^5.1.1", @@ -37,10 +38,14 @@ "regenerator-runtime": "^0.13.7", "xss": "^1.0.10" }, + "devDependencies": { + "@testing-library/react": "^11.2.0" + }, "peerDependencies": { - "@types/react": "*", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", + "@types/classnames": "*", + "@types/react": "*", "react": "^16.13.1", "react-dom": "^16.13.1" } diff --git a/superset-frontend/plugins/plugin-chart-table/src/DataTable/DataTable.tsx b/superset-frontend/plugins/plugin-chart-table/src/DataTable/DataTable.tsx index 85580e7b63a3..941887afd196 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/DataTable/DataTable.tsx +++ b/superset-frontend/plugins/plugin-chart-table/src/DataTable/DataTable.tsx @@ -23,6 +23,7 @@ import React, { HTMLProps, MutableRefObject, CSSProperties, + MouseEvent, } from 'react'; import { useTable, @@ -66,6 +67,7 @@ export interface DataTableProps<D extends object> extends TableOptions<D> { rowCount: number; wrapperRef?: MutableRefObject<HTMLDivElement>; onColumnOrderChange: () => void; + onContextMenu?: (value: D, clientX: number, clientY: number) => void; } export interface RenderHTMLCellProps extends HTMLProps<HTMLTableCellElement> { @@ -98,6 +100,7 @@ export default typedMemo(function DataTable<D extends object>({ serverPagination, wrapperRef: userWrapperRef, onColumnOrderChange, + onContextMenu, ...moreUseTableOptions }: DataTableProps<D>): JSX.Element { const tableHooks: PluginHook<D>[] = [ @@ -270,7 +273,21 @@ export default typedMemo(function DataTable<D extends object>({ prepareRow(row); const { key: rowKey, ...rowProps } = row.getRowProps(); return ( - <tr key={rowKey || row.id} {...rowProps}> + <tr + key={rowKey || row.id} + {...rowProps} + onContextMenu={(e: MouseEvent) => { + if (onContextMenu) { + e.preventDefault(); + e.stopPropagation(); + onContextMenu( + row.original, + e.nativeEvent.clientX, + e.nativeEvent.clientY, + ); + } + }} + > {row.cells.map(cell => cell.render('Cell', { key: cell.column.id }), )} diff --git a/superset-frontend/plugins/plugin-chart-table/src/DataTable/components/SelectPageSize.tsx b/superset-frontend/plugins/plugin-chart-table/src/DataTable/components/SelectPageSize.tsx index 989b121a3352..48d4b9a66874 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/DataTable/components/SelectPageSize.tsx +++ b/superset-frontend/plugins/plugin-chart-table/src/DataTable/components/SelectPageSize.tsx @@ -17,6 +17,7 @@ * under the License. */ import React from 'react'; +import { t } from '@superset-ui/core'; import { formatSelectOptions } from '@superset-ui/chart-controls'; export type SizeOption = [number, string]; @@ -34,7 +35,7 @@ function DefaultSelectRenderer({ }: SelectPageSizeRendererProps) { return ( <span className="dt-select-page-size form-inline"> - Show{' '} + {t('Show')}{' '} <select className="form-control input-sm" value={current} @@ -54,7 +55,7 @@ function DefaultSelectRenderer({ ); })} </select>{' '} - entries + {t('entries')} </span> ); } diff --git a/superset-frontend/plugins/plugin-chart-table/src/DataTable/hooks/useSticky.tsx b/superset-frontend/plugins/plugin-chart-table/src/DataTable/hooks/useSticky.tsx index 6fd4d839ce66..067d071ee192 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/DataTable/hooks/useSticky.tsx +++ b/superset-frontend/plugins/plugin-chart-table/src/DataTable/hooks/useSticky.tsx @@ -237,7 +237,7 @@ function StickyWrap({ const colWidths = columnWidths?.slice(0, columnCount); if (colWidths && bodyHeight) { - const bodyColgroup = ( + const colgroup = ( <colgroup> {colWidths.map((w, i) => ( // eslint-disable-next-line react/no-array-index-key @@ -246,23 +246,6 @@ function StickyWrap({ </colgroup> ); - // header columns do not have vertical scroll bars, - // so we add scroll bar size to the last column - const headerColgroup = - sticky.hasVerticalScroll && scrollBarSize ? ( - <colgroup> - {colWidths.map((x, i) => ( - // eslint-disable-next-line react/no-array-index-key - <col - key={i} - width={x + (i === colWidths.length - 1 ? scrollBarSize : 0)} - /> - ))} - </colgroup> - ) : ( - bodyColgroup - ); - headerTable = ( <div key="header" @@ -274,7 +257,7 @@ function StickyWrap({ {React.cloneElement( table, mergeStyleProp(table, fixedTableLayout), - headerColgroup, + colgroup, thead, )} {headerTable} @@ -292,7 +275,7 @@ function StickyWrap({ {React.cloneElement( table, mergeStyleProp(table, fixedTableLayout), - headerColgroup, + colgroup, tfoot, )} {footerTable} @@ -320,7 +303,7 @@ function StickyWrap({ {React.cloneElement( table, mergeStyleProp(table, fixedTableLayout), - bodyColgroup, + colgroup, tbody, )} </div> diff --git a/superset-frontend/plugins/plugin-chart-table/src/Styles.tsx b/superset-frontend/plugins/plugin-chart-table/src/Styles.tsx index 59a40b20bbf8..9219b6f0030d 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/Styles.tsx +++ b/superset-frontend/plugins/plugin-chart-table/src/Styles.tsx @@ -82,6 +82,17 @@ export default styled.div` float: right; } + .dt-truncate-cell { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dt-truncate-cell:hover { + overflow: visible; + white-space: normal; + height: auto; + } + .dt-pagination { text-align: right; /* use padding instead of margin so clientHeight can capture it */ diff --git a/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx b/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx index 73a639df0136..e114a823d6df 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx +++ b/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx @@ -16,7 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -import React, { CSSProperties, useCallback, useMemo, useState } from 'react'; +import React, { + CSSProperties, + useCallback, + useLayoutEffect, + useMemo, + useState, +} from 'react'; import { ColumnInstance, ColumnWithLooseAccessor, @@ -26,6 +32,7 @@ import { extent as d3Extent, max as d3Max } from 'd3-array'; import { FaSort } from '@react-icons/all-files/fa/FaSort'; import { FaSortDown as FaSortDesc } from '@react-icons/all-files/fa/FaSortDown'; import { FaSortUp as FaSortAsc } from '@react-icons/all-files/fa/FaSortUp'; +import cx from 'classnames'; import { DataRecord, DataRecordValue, @@ -33,7 +40,9 @@ import { ensureIsArray, GenericDataType, getTimeFormatterForGranularity, + BinaryQueryObjectFilterClause, styled, + css, t, tn, } from '@superset-ui/core'; @@ -50,9 +59,15 @@ import Styles from './Styles'; import { formatColumnValue } from './utils/formatValue'; import { PAGE_SIZE_OPTIONS } from './consts'; import { updateExternalFormData } from './DataTable/utils/externalAPIs'; +import getScrollBarSize from './DataTable/utils/getScrollBarSize'; type ValueRange = [number, number]; +interface TableSize { + width: number; + height: number; +} + /** * Return sortType based on data type */ @@ -67,44 +82,64 @@ function getSortTypeByDataType(dataType: GenericDataType): DefaultSortTypes { } /** - * Cell background to render columns as horizontal bar chart + * Cell background width calculation for horizontal bar chart */ -function cellBar({ +function cellWidth({ value, valueRange, - colorPositiveNegative = false, alignPositiveNegative, }: { value: number; valueRange: ValueRange; - colorPositiveNegative: boolean; alignPositiveNegative: boolean; }) { const [minValue, maxValue] = valueRange; - const r = colorPositiveNegative && value < 0 ? 150 : 0; if (alignPositiveNegative) { const perc = Math.abs(Math.round((value / maxValue) * 100)); - // The 0.01 to 0.001 is a workaround for what appears to be a - // CSS rendering bug on flat, transparent colors - return ( - `linear-gradient(to right, rgba(${r},0,0,0.2), rgba(${r},0,0,0.2) ${perc}%, ` + - `rgba(0,0,0,0.01) ${perc}%, rgba(0,0,0,0.001) 100%)` - ); + return perc; } const posExtent = Math.abs(Math.max(maxValue, 0)); const negExtent = Math.abs(Math.min(minValue, 0)); const tot = posExtent + negExtent; - const perc1 = Math.round( - (Math.min(negExtent + value, negExtent) / tot) * 100, - ); const perc2 = Math.round((Math.abs(value) / tot) * 100); - // The 0.01 to 0.001 is a workaround for what appears to be a - // CSS rendering bug on flat, transparent colors - return ( - `linear-gradient(to right, rgba(0,0,0,0.01), rgba(0,0,0,0.001) ${perc1}%, ` + - `rgba(${r},0,0,0.2) ${perc1}%, rgba(${r},0,0,0.2) ${perc1 + perc2}%, ` + - `rgba(0,0,0,0.01) ${perc1 + perc2}%, rgba(0,0,0,0.001) 100%)` - ); + return perc2; +} + +/** + * Cell left margin (offset) calculation for horizontal bar chart elements + * when alignPositiveNegative is not set + */ +function cellOffset({ + value, + valueRange, + alignPositiveNegative, +}: { + value: number; + valueRange: ValueRange; + alignPositiveNegative: boolean; +}) { + if (alignPositiveNegative) { + return 0; + } + const [minValue, maxValue] = valueRange; + const posExtent = Math.abs(Math.max(maxValue, 0)); + const negExtent = Math.abs(Math.min(minValue, 0)); + const tot = posExtent + negExtent; + return Math.round((Math.min(negExtent + value, negExtent) / tot) * 100); +} + +/** + * Cell background color calculation for horizontal bar chart + */ +function cellBackground({ + value, + colorPositiveNegative = false, +}: { + value: number; + colorPositiveNegative: boolean; +}) { + const r = colorPositiveNegative && value < 0 ? 150 : 0; + return `rgba(${r},0,0,0.2)`; } function SortIcon<D extends object>({ column }: { column: ColumnInstance<D> }) { @@ -163,7 +198,7 @@ function SelectPageSize({ } const getNoResultsMessage = (filter: string) => - t(filter ? 'No matching records found' : 'No records found'); + filter ? t('No matching records found') : t('No records found'); export default function TableChart<D extends DataRecord = DataRecord>( props: TableChartTransformedProps<D> & { @@ -187,24 +222,28 @@ export default function TableChart<D extends DataRecord = DataRecord>( serverPaginationData, setDataMask, showCellBars = true, - emitFilter = false, sortDesc = false, filters, sticky = true, // whether to use sticky header columnColorFormatters, allowRearrangeColumns = false, + onContextMenu, + emitCrossFilters, } = props; const timestampFormatter = useCallback( value => getTimeFormatterForGranularity(timeGrain)(value), [timeGrain], ); - + const [tableSize, setTableSize] = useState<TableSize>({ + width: 0, + height: 0, + }); // keep track of whether column order changed, so that column widths can too const [columnOrderToggle, setColumnOrderToggle] = useState(false); const handleChange = useCallback( (filters: { [x: string]: DataRecordValue[] }) => { - if (!emitFilter) { + if (!emitCrossFilters) { return; } @@ -250,7 +289,7 @@ export default function TableChart<D extends DataRecord = DataRecord>( }, }); }, - [emitFilter, setDataMask], + [emitCrossFilters, setDataMask], ); // only take relevant page size options @@ -283,27 +322,21 @@ export default function TableChart<D extends DataRecord = DataRecord>( [filters], ); - function getEmitTarget(col: string) { - const meta = columnsMeta?.find(x => x.key === col); - return meta?.config?.emitTarget || col; - } - const toggleFilter = useCallback( function toggleFilter(key: string, val: DataRecordValue) { let updatedFilters = { ...(filters || {}) }; - const target = getEmitTarget(key); - if (filters && isActiveFilterValue(target, val)) { + if (filters && isActiveFilterValue(key, val)) { updatedFilters = {}; } else { updatedFilters = { - [target]: [val], + [key]: [val], }; } if ( - Array.isArray(updatedFilters[target]) && - updatedFilters[target].length === 0 + Array.isArray(updatedFilters[key]) && + updatedFilters[key].length === 0 ) { - delete updatedFilters[target]; + delete updatedFilters[key]; } handleChange(updatedFilters); }, @@ -341,6 +374,8 @@ export default function TableChart<D extends DataRecord = DataRecord>( ? defaultColorPN : config.colorPositiveNegative; + const { truncateLongCells } = config; + const hasColumnColorFormatters = isNumeric && Array.isArray(columnColorFormatters) && @@ -355,7 +390,7 @@ export default function TableChart<D extends DataRecord = DataRecord>( getValueRange(key, alignPositiveNegative); let className = ''; - if (emitFilter) { + if (emitCrossFilters) { className += ' dt-is-filter'; } @@ -374,9 +409,9 @@ export default function TableChart<D extends DataRecord = DataRecord>( columnColorFormatters! .filter(formatter => formatter.column === column.key) .forEach(formatter => { - const formatterResult = formatter.getColorFromValue( - value as number, - ); + const formatterResult = value + ? formatter.getColorFromValue(value as number) + : false; if (formatterResult) { backgroundColor = formatterResult; } @@ -385,23 +420,40 @@ export default function TableChart<D extends DataRecord = DataRecord>( const StyledCell = styled.td` text-align: ${sharedStyle.textAlign}; - background: ${backgroundColor || - (valueRange - ? cellBar({ + white-space: ${value instanceof Date ? 'nowrap' : undefined}; + position: relative; + background: ${backgroundColor || undefined}; + `; + + const cellBarStyles = css` + position: absolute; + height: 100%; + display: block; + top: 0; + ${valueRange && + ` + width: ${`${cellWidth({ value: value as number, valueRange, alignPositiveNegative, + })}%`}; + left: ${`${cellOffset({ + value: value as number, + valueRange, + alignPositiveNegative, + })}%`}; + background-color: ${cellBackground({ + value: value as number, colorPositiveNegative, - }) - : undefined)}; - white-space: ${value instanceof Date ? 'nowrap' : undefined}; + })}; + `} `; const cellProps = { // show raw number in title in case of numeric values title: typeof value === 'number' ? String(value) : undefined, onClick: - emitFilter && !valueRange + emitCrossFilters && !valueRange ? () => toggleFilter(key, value) : undefined, className: [ @@ -411,16 +463,51 @@ export default function TableChart<D extends DataRecord = DataRecord>( ].join(' '), }; if (html) { + if (truncateLongCells) { + // eslint-disable-next-line react/no-danger + return ( + <StyledCell {...cellProps}> + <div + className="dt-truncate-cell" + style={columnWidth ? { width: columnWidth } : undefined} + dangerouslySetInnerHTML={html} + /> + </StyledCell> + ); + } // eslint-disable-next-line react/no-danger return <StyledCell {...cellProps} dangerouslySetInnerHTML={html} />; } - // If cellProps renderes textContent already, then we don't have to + // If cellProps renders textContent already, then we don't have to // render `Cell`. This saves some time for large tables. - return <StyledCell {...cellProps}>{text}</StyledCell>; + return ( + <StyledCell {...cellProps}> + {valueRange && ( + <div + /* The following classes are added to support custom CSS styling */ + className={cx( + 'cell-bar', + value && value < 0 ? 'negative' : 'positive', + )} + css={cellBarStyles} + /> + )} + {truncateLongCells ? ( + <div + className="dt-truncate-cell" + style={columnWidth ? { width: columnWidth } : undefined} + > + {text} + </div> + ) : ( + text + )} + </StyledCell> + ); }, Header: ({ column: col, onClick, style, onDragStart, onDrop }) => ( <th - title="Shift + Click to sort by multiple columns" + title={t('Shift + Click to sort by multiple columns')} className={[className, col.isSorted ? 'is-sorted' : ''].join(' ')} style={{ ...sharedStyle, @@ -474,7 +561,7 @@ export default function TableChart<D extends DataRecord = DataRecord>( [ defaultAlignPN, defaultColorPN, - emitFilter, + emitCrossFilters, getValueRange, isActiveFilterValue, isRawRecords, @@ -499,6 +586,60 @@ export default function TableChart<D extends DataRecord = DataRecord>( [setDataMask], ); + const handleSizeChange = useCallback( + ({ width, height }: { width: number; height: number }) => { + setTableSize({ width, height }); + }, + [], + ); + + useLayoutEffect(() => { + // After initial load the table should resize only when the new sizes + // Are not only scrollbar updates, otherwise, the table would twicth + const scrollBarSize = getScrollBarSize(); + const { width: tableWidth, height: tableHeight } = tableSize; + // Table is increasing its original size + if ( + width - tableWidth > scrollBarSize || + height - tableHeight > scrollBarSize + ) { + handleSizeChange({ + width: width - scrollBarSize, + height: height - scrollBarSize, + }); + } else if ( + tableWidth - width > scrollBarSize || + tableHeight - height > scrollBarSize + ) { + // Table is decreasing its original size + handleSizeChange({ + width, + height, + }); + } + }, [width, height, handleSizeChange, tableSize]); + + const { width: widthFromState, height: heightFromState } = tableSize; + + const handleContextMenu = + onContextMenu && !isRawRecords + ? (value: D, clientX: number, clientY: number) => { + const filters: BinaryQueryObjectFilterClause[] = []; + columnsMeta.forEach(col => { + if (!col.isMetric) { + const dataRecordValue = value[col.key]; + filters.push({ + col: col.key, + op: '==', + val: dataRecordValue as string | number | boolean, + formattedVal: formatColumnValue(col, dataRecordValue)[1], + }); + } + }); + onContextMenu(clientX, clientY, filters); + } + : undefined; + return ( <Styles> <DataTable<D> @@ -509,8 +650,8 @@ export default function TableChart<D extends DataRecord = DataRecord>( pageSize={pageSize} serverPaginationData={serverPaginationData} pageSizeOptions={pageSizeOptions} - width={width} - height={height} + width={widthFromState} + height={heightFromState} serverPagination={serverPagination} onServerPaginationChange={handleServerPaginationChange} onColumnOrderChange={() => setColumnOrderToggle(!columnOrderToggle)} @@ -521,6 +662,7 @@ export default function TableChart<D extends DataRecord = DataRecord>( selectPageSize={pageSize !== null && SelectPageSize} // not in use in Superset, but needed for unit tests sticky={sticky} + onContextMenu={handleContextMenu} /> </Styles> ); diff --git a/superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts b/superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts index 99a0da8ca9ba..211070f8bcc4 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts +++ b/superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts @@ -17,9 +17,12 @@ * under the License. */ import { + AdhocColumn, buildQueryContext, ensureIsArray, getMetricLabel, + hasGenericChartAxes, + isPhysicalColumn, QueryMode, QueryObject, removeDuplicates, @@ -63,17 +66,17 @@ const buildQuery: BuildQuery<TableChartFormData> = ( } return buildQueryContext(formDataCopy, baseQueryObject => { - let { metrics, orderby = [] } = baseQueryObject; + let { metrics, orderby = [], columns = [] } = baseQueryObject; let postProcessing: PostProcessingRule[] = []; if (queryMode === QueryMode.aggregate) { metrics = metrics || []; - // orverride orderby with timeseries metric when in aggregation mode + // override orderby with timeseries metric when in aggregation mode if (sortByMetric) { orderby = [[sortByMetric, !orderDesc]]; } else if (metrics?.length > 0) { // default to ordering by first metric in descending order - // when no "sort by" metric is set (regargless if "SORT DESC" is set to true) + // when no "sort by" metric is set (regardless if "SORT DESC" is set to true) orderby = [[metrics[0], false]]; } // add postprocessing for percent metrics only when in aggregation mode @@ -95,6 +98,24 @@ const buildQuery: BuildQuery<TableChartFormData> = ( }, ]; } + + columns = columns.map(col => { + if ( + isPhysicalColumn(col) && + formData.time_grain_sqla && + hasGenericChartAxes && + formData?.temporal_columns_lookup?.[col] + ) { + return { + timeGrain: formData.time_grain_sqla, + columnType: 'BASE_AXIS', + sqlExpression: col, + label: col, + expressionType: 'SQL', + } as AdhocColumn; + } + return col; + }); } const moreProps: Partial<QueryObject> = {}; @@ -108,6 +129,7 @@ const buildQuery: BuildQuery<TableChartFormData> = ( let queryObject = { ...baseQueryObject, + columns, orderby, metrics, post_processing: postProcessing, diff --git a/superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx index ca097f5349c0..bb8b09e645d6 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx @@ -19,12 +19,14 @@ */ import React from 'react'; import { - addLocaleData, ChartDataResponseResult, ensureIsArray, FeatureFlag, GenericDataType, + hasGenericChartAxes, + isAdhocColumn, isFeatureEnabled, + isPhysicalColumn, QueryFormColumn, QueryMode, smartDateFormatter, @@ -41,19 +43,15 @@ import { sections, sharedControls, ControlPanelState, - ExtraControlProps, ControlState, - emitFilterControl, Dataset, ColumnMeta, defineSavedMetrics, + getStandardizedControls, } from '@superset-ui/chart-controls'; -import i18n from './i18n'; import { PAGE_SIZE_OPTIONS } from './consts'; -addLocaleData(i18n); - function getQueryMode(controls: ControlStateMapping): QueryMode { const mode = controls?.query_mode?.value; if (mode === QueryMode.aggregate || mode === QueryMode.raw) { @@ -99,15 +97,14 @@ const queryMode: ControlConfig<'RadioButtonControl'> = { rerender: ['all_columns', 'groupby', 'metrics', 'percent_metrics'], }; -const all_columns: typeof sharedControls.groupby = { - type: 'SelectControl', +const allColumnsControl: typeof sharedControls.groupby = { + ...sharedControls.groupby, label: t('Columns'), description: t('Columns to display'), multi: true, freeForm: true, allowAll: true, commaChoosesOption: false, - default: [], optionRenderer: c => <ColumnOption showType column={c} />, valueRenderer: c => <ColumnOption column={c} />, valueKey: 'column_name', @@ -115,7 +112,7 @@ const all_columns: typeof sharedControls.groupby = { options: datasource?.columns || [], queryMode: getQueryMode(controls), externalValidationErrors: - isRawMode({ controls }) && ensureIsArray(controlState.value).length === 0 + isRawMode({ controls }) && ensureIsArray(controlState?.value).length === 0 ? [t('must have a value')] : [], }), @@ -123,37 +120,12 @@ const all_columns: typeof sharedControls.groupby = { resetOnHide: false, }; -const dnd_all_columns: typeof sharedControls.groupby = { - type: 'DndColumnSelect', - label: t('Columns'), - description: t('Columns to display'), - default: [], - mapStateToProps({ datasource, controls }, controlState) { - const newState: ExtraControlProps = {}; - if (datasource?.columns[0]?.hasOwnProperty('column_name')) { - const options = (datasource as Dataset).columns; - newState.options = Object.fromEntries( - options.map((option: ColumnMeta) => [option.column_name, option]), - ); - } else newState.options = datasource?.columns; - newState.queryMode = getQueryMode(controls); - newState.externalValidationErrors = - isRawMode({ controls }) && ensureIsArray(controlState.value).length === 0 - ? [t('must have a value')] - : []; - return newState; - }, - visibility: isRawMode, - resetOnHide: false, -}; - -const percent_metrics: typeof sharedControls.metrics = { - type: 'MetricsControl', +const percentMetricsControl: typeof sharedControls.metrics = { + ...sharedControls.metrics, label: t('Percentage metrics'), description: t( 'Metrics for which percentage of total are to be displayed. Calculated from only data within the row limit.', ), - multi: true, visibility: isAggMode, resetOnHide: false, mapStateToProps: ({ datasource, controls }, controlState) => ({ @@ -165,7 +137,7 @@ const percent_metrics: typeof sharedControls.metrics = { externalValidationErrors: validateAggControlValues(controls, [ controls.groupby?.value, controls.metrics?.value, - controlState.value, + controlState?.value, ]), }), rerender: ['groupby', 'metrics'], @@ -173,14 +145,9 @@ const percent_metrics: typeof sharedControls.metrics = { validators: [], }; -const dnd_percent_metrics = { - ...percent_metrics, - type: 'DndMetricSelect', -}; - const config: ControlPanelConfig = { controlPanelSections: [ - sections.legacyTimeseriesTime, + sections.genericTime, { label: t('Query'), expanded: true, @@ -221,6 +188,37 @@ const config: ControlPanelConfig = { }, }, ], + [ + hasGenericChartAxes && isAggMode + ? { + name: 'time_grain_sqla', + config: { + ...sharedControls.time_grain_sqla, + visibility: ({ controls }) => { + const dttmLookup = Object.fromEntries( + ensureIsArray(controls?.groupby?.options).map(option => [ + option.column_name, + option.is_dttm, + ]), + ); + + return ensureIsArray(controls?.groupby.value) + .map(selection => { + if (isAdhocColumn(selection)) { + return true; + } + if (isPhysicalColumn(selection)) { + return !!dttmLookup[selection]; + } + return false; + }) + .some(Boolean); + }, + }, + } + : null, + hasGenericChartAxes && isAggMode ? 'temporal_columns_lookup' : null, + ], [ { name: 'metrics', @@ -254,19 +252,13 @@ const config: ControlPanelConfig = { }, { name: 'all_columns', - config: isFeatureEnabled(FeatureFlag.ENABLE_EXPLORE_DRAG_AND_DROP) - ? dnd_all_columns - : all_columns, + config: allColumnsControl, }, ], [ { name: 'percent_metrics', - config: { - ...(isFeatureEnabled(FeatureFlag.ENABLE_EXPLORE_DRAG_AND_DROP) - ? dnd_percent_metrics - : percent_metrics), - }, + config: percentMetricsControl, }, ], ['adhoc_filters'], @@ -316,6 +308,7 @@ const config: ControlPanelConfig = { { name: 'row_limit', override: { + default: 1000, visibility: ({ controls }: ControlPanelsContainerProps) => !controls?.server_pagination?.value, }, @@ -375,7 +368,6 @@ const config: ControlPanelConfig = { }, }, ], - emitFilterControl, ], }, { @@ -493,7 +485,6 @@ const config: ControlPanelConfig = { queryResponse: chart?.queriesResponse?.[0] as | ChartDataResponseResult | undefined, - emitFilter: explore?.controls?.table_filter?.value, }; }, }, @@ -543,10 +534,10 @@ const config: ControlPanelConfig = { ], }, ], - denormalizeFormData: formData => ({ + formDataOverrides: formData => ({ ...formData, - metrics: formData.standardizedFormData.standardizedState.metrics, - groupby: formData.standardizedFormData.standardizedState.columns, + metrics: getStandardizedControls().popAllMetrics(), + groupby: getStandardizedControls().popAllColumns(), }), }; diff --git a/superset-frontend/plugins/plugin-chart-table/src/index.ts b/superset-frontend/plugins/plugin-chart-table/src/index.ts index bce2112d922d..4e862fc5a55d 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/index.ts +++ b/superset-frontend/plugins/plugin-chart-table/src/index.ts @@ -31,7 +31,7 @@ export { default as __hack__ } from './types'; export * from './types'; const metadata = new ChartMetadata({ - behaviors: [Behavior.INTERACTIVE_CHART], + behaviors: [Behavior.INTERACTIVE_CHART, Behavior.DRILL_TO_DETAIL], category: t('Table'), canBeAnnotationTypes: ['EVENT', 'INTERVAL'], description: t( diff --git a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts index 5cf4fd1e83c4..2fae16c31c87 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts @@ -204,7 +204,12 @@ const transformProps = ( queriesData = [], filterState, ownState: serverPaginationData, - hooks: { onAddFilter: onChangeFilter, setDataMask = () => {} }, + hooks: { + onAddFilter: onChangeFilter, + setDataMask = () => {}, + onContextMenu, + }, + emitCrossFilters, } = chartProps; const { @@ -213,7 +218,6 @@ const transformProps = ( show_cell_bars: showCellBars = true, include_search: includeSearch = false, page_length: pageLength, - emit_filter: emitFilter, server_pagination: serverPagination = false, server_page_length: serverPageLength = 10, order_desc: sortDesc = false, @@ -269,11 +273,12 @@ const transformProps = ( ? serverPageLength : getPageSize(pageLength, data.length, columns.length), filters: filterState.filters, - emitFilter, + emitCrossFilters, onChangeFilter, columnColorFormatters, timeGrain, allowRearrangeColumns, + onContextMenu, }; }; diff --git a/superset-frontend/plugins/plugin-chart-table/src/types.ts b/superset-frontend/plugins/plugin-chart-table/src/types.ts index f5b83fa8bfd7..3a591e8682ed 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/types.ts +++ b/superset-frontend/plugins/plugin-chart-table/src/types.ts @@ -30,6 +30,7 @@ import { ChartDataResponseResult, QueryFormData, SetDataMaskHook, + BinaryQueryObjectFilterClause, } from '@superset-ui/core'; import { ColorFormatters, ColumnConfig } from '@superset-ui/chart-controls'; @@ -68,7 +69,6 @@ export type TableChartFormData = QueryFormData & { order_desc?: boolean; show_cell_bars?: boolean; table_timestamp_format?: string; - emit_filter?: boolean; time_grain_sqla?: TimeGranularity; column_config?: Record<string, ColumnConfig>; allow_rearrange_columns?: boolean; @@ -107,10 +107,15 @@ export interface TableChartTransformedProps<D extends DataRecord = DataRecord> { // These are dashboard filters, don't be confused with in-chart search filter // enabled by `includeSearch` filters?: DataRecordFilters; - emitFilter?: boolean; + emitCrossFilters?: boolean; onChangeFilter?: ChartProps['hooks']['onAddFilter']; columnColorFormatters?: ColorFormatters; allowRearrangeColumns?: boolean; + onContextMenu?: ( + clientX: number, + clientY: number, + filters?: BinaryQueryObjectFilterClause[], + ) => void; } export default {}; diff --git a/superset-frontend/plugins/plugin-chart-table/test/TableChart.test.tsx b/superset-frontend/plugins/plugin-chart-table/test/TableChart.test.tsx index 867b6e6799c3..d8d76b5c8f62 100644 --- a/superset-frontend/plugins/plugin-chart-table/test/TableChart.test.tsx +++ b/superset-frontend/plugins/plugin-chart-table/test/TableChart.test.tsx @@ -18,11 +18,12 @@ */ import React from 'react'; import { CommonWrapper } from 'enzyme'; +import { render, screen } from '@testing-library/react'; import TableChart from '../src/TableChart'; import transformProps from '../src/transformProps'; import DateWithFormatter from '../src/utils/DateWithFormatter'; import testData from './testData'; -import { mount } from './enzyme'; +import { mount, ProviderWrapper } from './enzyme'; describe('plugin-chart-table', () => { describe('transformProps', () => { @@ -105,5 +106,77 @@ describe('plugin-chart-table', () => { tree = wrap.render(); expect(tree.text()).toContain('No records found'); }); + + it('render color with column color formatter', () => { + render( + ProviderWrapper({ + children: ( + <TableChart + {...transformProps({ + ...testData.advanced, + rawFormData: { + ...testData.advanced.rawFormData, + conditional_formatting: [ + { + colorScheme: '#ACE1C4', + column: 'sum__num', + operator: '>', + targetValue: 2467, + }, + ], + }, + })} + /> + ), + }), + ); + + expect(getComputedStyle(screen.getByTitle('2467063')).background).toBe( + 'rgba(172, 225, 196, 1)', + ); + expect(getComputedStyle(screen.getByTitle('2467')).background).toBe(''); + }); + + it('render cell without color', () => { + const dataWithEmptyCell = testData.advanced.queriesData[0]; + dataWithEmptyCell.data.push({ + __timestamp: null, + name: 'Noah', + sum__num: null, + '%pct_nice': 0.643, + 'abc.com': 'bazzinga', + }); + + render( + ProviderWrapper({ + children: ( + <TableChart + {...transformProps({ + ...testData.advanced, + queriesData: [dataWithEmptyCell], + rawFormData: { + ...testData.advanced.rawFormData, + conditional_formatting: [ + { + colorScheme: '#ACE1C4', + column: 'sum__num', + operator: '<', + targetValue: 12342, + }, + ], + }, + })} + /> + ), + }), + ); + expect(getComputedStyle(screen.getByTitle('2467')).background).toBe( + 'rgba(172, 225, 196, 0.812)', + ); + expect(getComputedStyle(screen.getByTitle('2467063')).background).toBe( + '', + ); + expect(getComputedStyle(screen.getByText('N/A')).background).toBe(''); + }); }); }); diff --git a/superset-frontend/plugins/plugin-chart-word-cloud/package.json b/superset-frontend/plugins/plugin-chart-word-cloud/package.json index 35d514b79917..cdf87a66a424 100644 --- a/superset-frontend/plugins/plugin-chart-word-cloud/package.json +++ b/superset-frontend/plugins/plugin-chart-word-cloud/package.json @@ -36,6 +36,7 @@ }, "peerDependencies": { "@types/react": "*", + "@types/lodash": "*", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", "react": "^16.13.1" diff --git a/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx b/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx index 61f3e7977a1a..2cedd648aa23 100644 --- a/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx +++ b/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx @@ -31,6 +31,7 @@ import { seed, CategoricalColorScale, } from '@superset-ui/core'; +import { isEqual } from 'lodash'; const seedRandom = seed('superset-ui'); export const ROTATION = { @@ -134,8 +135,8 @@ class WordCloud extends React.PureComponent< const { data, encoding, width, height, rotation } = this.props; if ( - prevProps.data !== data || - prevProps.encoding !== encoding || + !isEqual(prevProps.data, data) || + !isEqual(prevProps.encoding, encoding) || prevProps.width !== width || prevProps.height !== height || prevProps.rotation !== rotation diff --git a/superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts b/superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts index fce23133830f..f40a9c19af5a 100644 --- a/superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts +++ b/superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts @@ -17,7 +17,11 @@ * under the License. */ import { t, validateNonEmpty } from '@superset-ui/core'; -import { ControlPanelConfig, sections } from '@superset-ui/chart-controls'; +import { + ControlPanelConfig, + getStandardizedControls, + sections, +} from '@superset-ui/chart-controls'; const config: ControlPanelConfig = { controlPanelSections: [ @@ -79,9 +83,9 @@ const config: ControlPanelConfig = { type: 'SelectControl', label: t('Word Rotation'), choices: [ - ['random', 'random'], - ['flat', 'flat'], - ['square', 'square'], + ['random', t('random')], + ['flat', t('flat')], + ['square', t('square')], ], renderTrigger: true, default: 'square', @@ -103,6 +107,11 @@ const config: ControlPanelConfig = { default: 100, }, }, + formDataOverrides: formData => ({ + ...formData, + series: getStandardizedControls().shiftColumn(), + metric: getStandardizedControls().shiftMetric(), + }), }; export default config; diff --git a/superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts b/superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts index 6d98bf19e581..10587b382f97 100644 --- a/superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts +++ b/superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts @@ -17,11 +17,7 @@ * under the License. */ import { t } from '@superset-ui/core'; -import { - ControlPanelConfig, - formatSelectOptions, - sections, -} from '@superset-ui/chart-controls'; +import { ControlPanelConfig, sections } from '@superset-ui/chart-controls'; const config: ControlPanelConfig = { controlPanelSections: [ @@ -47,12 +43,12 @@ const config: ControlPanelConfig = { description: t( 'Determines how whiskers and outliers are calculated.', ), - choices: formatSelectOptions([ - 'Tukey', - 'Min/max (no outliers)', - '2/98 percentiles', - '9/91 percentiles', - ]), + choices: [ + ['Tukey', t('Tukey')], + ['Min/max (no outliers)', t('Min/max (no outliers)')], + ['2/98 percentiles', t('2/98 percentiles')], + ['9/91 percentiles', t('9/91 percentiles')], + ], }, }, { @@ -60,12 +56,12 @@ const config: ControlPanelConfig = { config: { type: 'SelectControl', label: t('X Tick Layout'), - choices: formatSelectOptions([ - 'auto', - 'flat', - '45°', - 'staggered', - ]), + choices: [ + ['auto', t('auto')], + ['flat', t('flat')], + ['45°', '45°'], + ['staggered', t('staggered')], + ], default: 'auto', clearable: false, renderTrigger: true, diff --git a/superset-frontend/plugins/preset-chart-xy/src/utils/convertScaleToDataUIScaleShape.ts b/superset-frontend/plugins/preset-chart-xy/src/utils/convertScaleToDataUIScaleShape.ts index 4d756e138ba8..972f01f9092d 100644 --- a/superset-frontend/plugins/preset-chart-xy/src/utils/convertScaleToDataUIScaleShape.ts +++ b/superset-frontend/plugins/preset-chart-xy/src/utils/convertScaleToDataUIScaleShape.ts @@ -43,7 +43,7 @@ function isCompatibleDomainOrRange( } /** - * Convert encodeable scale object into @data-ui's scale config + * Convert encodable scale object into @data-ui's scale config * @param scale */ export default function convertScaleToDataUIScale<Output extends Value>( diff --git a/superset-frontend/spec/fixtures/mockChartQueries.js b/superset-frontend/spec/fixtures/mockChartQueries.js index e4fa224ad826..dc29d71abbf2 100644 --- a/superset-frontend/spec/fixtures/mockChartQueries.js +++ b/superset-frontend/spec/fixtures/mockChartQueries.js @@ -33,33 +33,17 @@ export default { triggerQuery: false, lastRendered: 0, form_data: { - slice_id: sliceId, - viz_type: 'pie', - row_limit: 50000, - metric: 'sum__num', - since: '100 years ago', - groupby: ['gender'], - metrics: ['sum__num'], - compare_lag: '10', - limit: '25', - until: 'now', - granularity: 'ds', - markup_type: 'markdown', - where: '', - compare_suffix: 'o10Y', - datasource: datasourceId, - }, - formData: { datasource: datasourceId, viz_type: 'pie', slice_id: sliceId, - granularity_sqla: null, - time_grain_sqla: null, + slice_name: 'Genders', + granularity_sqla: undefined, + time_grain_sqla: undefined, since: '100 years ago', until: 'now', metrics: ['sum__num'], groupby: ['gender'], - limit: '25', + limit: 25, pie_label_type: 'key', donut: false, show_legend: true, diff --git a/superset-frontend/spec/fixtures/mockCharts.ts b/superset-frontend/spec/fixtures/mockCharts.ts new file mode 100644 index 000000000000..570d52cdc061 --- /dev/null +++ b/superset-frontend/spec/fixtures/mockCharts.ts @@ -0,0 +1,55 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface ChartListChart { + id: number; + slice_name: string; + url: string; + last_saved_at: null | string; + last_saved_by: null | { id: number; first_name: string; last_name: string }; + owners: { + id: number; + first_name: string; + last_name: string; + username: string; + }[]; + dashboards: { id: number; dashboard_title: string }[]; +} + +const CHART_ID = 1; +const MOCK_CHART: ChartListChart = { + id: CHART_ID, + slice_name: 'Sample chart', + url: `/explore/?slice_id=${CHART_ID}`, + last_saved_at: null, + dashboards: [], + last_saved_by: null, + owners: [], +}; + +/** + * Get mock charts as would be returned by the /api/v1/chart list endpoint. + */ +export const getMockChart = ( + overrides: Partial<ChartListChart> = {}, +): ChartListChart => ({ + ...MOCK_CHART, + ...(overrides.id ? { url: `/explore/?slice_id=${overrides.id}` } : null), + ...overrides, +}); diff --git a/superset-frontend/spec/fixtures/mockDashboardInfo.js b/superset-frontend/spec/fixtures/mockDashboardInfo.js index c11ec7f88a35..b2f9f1183223 100644 --- a/superset-frontend/spec/fixtures/mockDashboardInfo.js +++ b/superset-frontend/spec/fixtures/mockDashboardInfo.js @@ -16,6 +16,8 @@ * specific language governing permissions and limitations * under the License. */ +import { FilterBarOrientation } from 'src/dashboard/types'; + export default { id: 1234, slug: 'dashboardSlug', @@ -36,4 +38,5 @@ export default { flash_messages: [], conf: { SUPERSET_WEBSERVER_TIMEOUT: 60 }, }, + filterBarOrientation: FilterBarOrientation.VERTICAL, }; diff --git a/superset-frontend/spec/fixtures/mockDashboardState.js b/superset-frontend/spec/fixtures/mockDashboardState.js index 49b71053710a..0895ccf38695 100644 --- a/superset-frontend/spec/fixtures/mockDashboardState.js +++ b/superset-frontend/spec/fixtures/mockDashboardState.js @@ -1,3 +1,4 @@ +/* eslint-disable theme-colors/no-literal-colors */ /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -30,3 +31,88 @@ export default { focusedFilterField: null, refreshFrequency: 0, }; + +export const overwriteConfirmMetadata = { + updatedAt: '2022-10-07T16:35:30.924212', + updatedBy: 'Superset Admin', + overwriteConfirmItems: [ + { + keyPath: 'css', + oldValue: '', + newValue: ` + .navbar { + transition: opacity 0.5s ease; + } +`, + }, + { + keyPath: 'json_metadata.filter_scopes', + oldValue: `{ + "122": { + "ethnic_minority": { + "scope": ["ROOT_ID"], + "immune": [] + }, + "gender": { + "scope": ["ROOT_ID"], + "immune": [] + }, + "developer_type": { + "scope": ["ROOT_ID"], + "immune": [] + }, + "lang_at_home": { + "scope": ["ROOT_ID"], + "immune": [] + }, + "country_live": { + "scope": ["ROOT_ID"], + "immune": [] + } + } +}`, + newValue: `{ + "122": { + "ethnic_minority": { + "scope": ["ROOT_ID"], + "immune": [ + 131, + 115, + 123, + 89, + 94, + 71 + ] + }, + "gender": { + "scope": ["ROOT_ID"], + "immune": [] + }, + "developer_type": { + "scope": ["ROOT_ID"], + "immune": [] + }, + "lang_at_home": { + "scope": ["ROOT_ID"], + "immune": [] + }, + "country_live": { + "scope": ["ROOT_ID"], + "immune": [] + } + } +}`, + }, + ], + dashboardId: 9, + data: { + certified_by: '', + certification_details: '', + css: ".navbar {\n transition: opacity 0.5s ease;\n opacity: 0.05;\n}\n.navbar:hover {\n opacity: 1;\n}\n.chart-header .header{\n font-weight: @font-weight-normal;\n font-size: 12px;\n}\n/*\nvar bnbColors = [\n //rausch hackb kazan babu lima beach tirol\n '#ff5a5f', '#7b0051', '#007A87', '#00d1c1', '#8ce071', '#ffb400', '#b4a76c',\n '#ff8083', '#cc0086', '#00a1b3', '#00ffeb', '#bbedab', '#ffd266', '#cbc29a',\n '#ff3339', '#ff1ab1', '#005c66', '#00b3a5', '#55d12e', '#b37e00', '#988b4e',\n ];\n*/\n", + dashboard_title: 'FCC New Coder Survey 2018', + slug: null, + owners: [], + json_metadata: + '{"timed_refresh_immune_slices":[],"expanded_slices":{},"refresh_frequency":0,"default_filters":"{}","color_scheme":"supersetColors","label_colors":{"0":"#FCC700","1":"#A868B7","15":"#3CCCCB","30":"#A38F79","45":"#8FD3E4","age":"#1FA8C9","Yes,":"#1FA8C9","Female":"#454E7C","Prefer":"#5AC189","No,":"#FF7F44","Male":"#666666","Prefer not to say":"#E04355","Ph.D.":"#FCC700","associate\'s degree":"#A868B7","bachelor\'s degree":"#3CCCCB","high school diploma or equivalent (GED)":"#A38F79","master\'s degree (non-professional)":"#8FD3E4","no high school (secondary school)":"#A1A6BD","professional degree (MBA, MD, JD, etc.)":"#ACE1C4","some college credit, no degree":"#FEC0A1","some high school":"#B2B2B2","trade, technical, or vocational training":"#EFA1AA","No, not an ethnic minority":"#1FA8C9","Yes, an ethnic minority":"#454E7C","<NULL>":"#5AC189","Yes":"#FF7F44","No":"#666666","last_yr_income":"#E04355","More":"#A1A6BD","Less":"#ACE1C4","I":"#FEC0A1","expected_earn":"#B2B2B2","Yes: Willing To":"#EFA1AA","No: Not Willing to":"#FDE380","No Answer":"#D3B3DA","In an Office (with Other Developers)":"#9EE5E5","No Preference":"#D1C6BC","From Home":"#1FA8C9"},"show_native_filters":true,"color_scheme_domain":["#1FA8C9","#454E7C","#5AC189","#FF7F44","#666666","#E04355","#FCC700","#A868B7","#3CCCCB","#A38F79","#8FD3E4","#A1A6BD","#ACE1C4","#FEC0A1","#B2B2B2","#EFA1AA","#FDE380","#D3B3DA","#9EE5E5","#D1C6BC"],"shared_label_colors":{"Male":"#5ac19e","Female":"#1f86c9","<NULL>":"#5AC189","Prefer not to say":"#47457c","No Answer":"#e05043","Yes, an ethnic minority":"#666666","No, not an ethnic minority":"#ffa444","age":"#1FA8C9"},"cross_filters_enabled":false,"filter_scopes":{},"chart_configuration":{},"positions":{}}', + }, +}; diff --git a/superset-frontend/spec/fixtures/mockDatasource.js b/superset-frontend/spec/fixtures/mockDatasource.js index 30513fc12674..21a5805519b6 100644 --- a/superset-frontend/spec/fixtures/mockDatasource.js +++ b/superset-frontend/spec/fixtures/mockDatasource.js @@ -171,7 +171,6 @@ export default { name: 'birth_names', owners: [{ first_name: 'joe', last_name: 'man', id: 1 }], database: { - allow_multi_schema_metadata_fetch: null, name: 'main', backend: 'sqlite', }, diff --git a/superset-frontend/spec/fixtures/mockNativeFilters.ts b/superset-frontend/spec/fixtures/mockNativeFilters.ts index 3cb4925e9089..dea5cfb8fd02 100644 --- a/superset-frontend/spec/fixtures/mockNativeFilters.ts +++ b/superset-frontend/spec/fixtures/mockNativeFilters.ts @@ -145,6 +145,7 @@ export const singleNativeFiltersState = { inverseSelection: false, allowsMultipleValues: false, isRequired: false, + chartsInScope: [230], }, }, }; diff --git a/superset-frontend/spec/fixtures/mockSliceEntities.js b/superset-frontend/spec/fixtures/mockSliceEntities.js index 69570c5c8f87..cb6d84ea347a 100644 --- a/superset-frontend/spec/fixtures/mockSliceEntities.js +++ b/superset-frontend/spec/fixtures/mockSliceEntities.js @@ -26,7 +26,7 @@ export const sliceEntitiesForChart = { slices: { [sliceId]: { slice_id: sliceId, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%2018%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%2018%7D', slice_name: 'Genders', form_data: { slice_id: sliceId, @@ -62,7 +62,7 @@ export const sliceEntitiesForDashboard = { slices: { [filterId]: { slice_id: filterId, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20127%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20127%7D', slice_name: 'Region Filter', form_data: { instant_filtering: true, @@ -86,7 +86,7 @@ export const sliceEntitiesForDashboard = { }, 128: { slice_id: 128, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20128%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20128%7D', slice_name: "World's Population", form_data: {}, viz_type: 'big_number', @@ -98,7 +98,7 @@ export const sliceEntitiesForDashboard = { }, 129: { slice_id: 129, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20129%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20129%7D', slice_name: 'Most Populated Countries', form_data: {}, viz_type: 'table', @@ -110,7 +110,7 @@ export const sliceEntitiesForDashboard = { }, 130: { slice_id: 130, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20130%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20130%7D', slice_name: 'Growth Rate', form_data: {}, viz_type: 'line', @@ -122,7 +122,7 @@ export const sliceEntitiesForDashboard = { }, 131: { slice_id: 131, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20131%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20131%7D', slice_name: '% Rural', form_data: {}, viz_type: 'world_map', @@ -134,7 +134,7 @@ export const sliceEntitiesForDashboard = { }, 132: { slice_id: 132, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20132%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20132%7D', slice_name: 'Life Expectancy VS Rural %', form_data: {}, viz_type: 'bubble', @@ -146,7 +146,7 @@ export const sliceEntitiesForDashboard = { }, 133: { slice_id: 133, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20133%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20133%7D', slice_name: 'Rural Breakdown', form_data: {}, viz_type: 'sunburst', @@ -158,7 +158,7 @@ export const sliceEntitiesForDashboard = { }, 134: { slice_id: 134, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20134%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20134%7D', slice_name: "World's Pop Growth", form_data: {}, viz_type: 'area', @@ -170,7 +170,7 @@ export const sliceEntitiesForDashboard = { }, 135: { slice_id: 135, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20135%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20135%7D', slice_name: 'Box plot', form_data: {}, viz_type: 'box_plot', @@ -182,7 +182,7 @@ export const sliceEntitiesForDashboard = { }, 136: { slice_id: 136, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20136%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20136%7D', slice_name: 'Treemap', form_data: {}, viz_type: 'treemap', diff --git a/superset-frontend/spec/fixtures/mockStore.js b/superset-frontend/spec/fixtures/mockStore.js index 5fe8f54022eb..119e19a0847d 100644 --- a/superset-frontend/spec/fixtures/mockStore.js +++ b/superset-frontend/spec/fixtures/mockStore.js @@ -20,6 +20,7 @@ import { createStore, applyMiddleware, compose } from 'redux'; import thunk from 'redux-thunk'; import { rootReducer } from 'src/views/store'; +import { FilterBarOrientation } from 'src/dashboard/types'; import mockState from './mockState'; import { @@ -71,60 +72,67 @@ export const mockStoreWithChartsInTabsAndRoot = export const sliceIdWithAppliedFilter = sliceId + 1; export const sliceIdWithRejectedFilter = sliceId + 2; +export const stateWithFilters = { + ...mockState, + dashboardFilters, + dataMask: dataMaskWith2Filters, + charts: { + ...mockState.charts, + [sliceIdWithAppliedFilter]: { + ...mockState.charts[sliceId], + queryResponse: { + status: 'success', + applied_filters: [{ column: 'region' }], + rejected_filters: [], + }, + }, + [sliceIdWithRejectedFilter]: { + ...mockState.charts[sliceId], + queryResponse: { + status: 'success', + applied_filters: [], + rejected_filters: [{ column: 'region', reason: 'not_in_datasource' }], + }, + }, + }, +}; + // has one chart with a filter that has been applied, // one chart with a filter that has been rejected, // and one chart with no filters set. export const getMockStoreWithFilters = () => - createStore(rootReducer, { - ...mockState, - dashboardFilters, - dataMask: dataMaskWith2Filters, - charts: { - ...mockState.charts, - [sliceIdWithAppliedFilter]: { - ...mockState.charts[sliceId], - queryResponse: { - status: 'success', - applied_filters: [{ column: 'region' }], - rejected_filters: [], - }, + createStore(rootReducer, stateWithFilters); + +export const stateWithNativeFilters = { + ...mockState, + nativeFilters, + dataMask: dataMaskWith2Filters, + charts: { + ...mockState.charts, + [sliceIdWithAppliedFilter]: { + ...mockState.charts[sliceId], + queryResponse: { + status: 'success', + applied_filters: [{ column: 'region' }], + rejected_filters: [], }, - [sliceIdWithRejectedFilter]: { - ...mockState.charts[sliceId], - queryResponse: { - status: 'success', - applied_filters: [], - rejected_filters: [{ column: 'region', reason: 'not_in_datasource' }], - }, + }, + [sliceIdWithRejectedFilter]: { + ...mockState.charts[sliceId], + queryResponse: { + status: 'success', + applied_filters: [], + rejected_filters: [{ column: 'region', reason: 'not_in_datasource' }], }, }, - }); + }, + dashboardInfo: { + filterBarOrientation: FilterBarOrientation.VERTICAL, + }, +}; export const getMockStoreWithNativeFilters = () => - createStore(rootReducer, { - ...mockState, - nativeFilters, - dataMask: dataMaskWith2Filters, - charts: { - ...mockState.charts, - [sliceIdWithAppliedFilter]: { - ...mockState.charts[sliceId], - queryResponse: { - status: 'success', - applied_filters: [{ column: 'region' }], - rejected_filters: [], - }, - }, - [sliceIdWithRejectedFilter]: { - ...mockState.charts[sliceId], - queryResponse: { - status: 'success', - applied_filters: [], - rejected_filters: [{ column: 'region', reason: 'not_in_datasource' }], - }, - }, - }, - }); + createStore(rootReducer, stateWithNativeFilters); export const stateWithoutNativeFilters = { ...mockState, @@ -149,6 +157,7 @@ export const stateWithoutNativeFilters = { }, dashboardInfo: { dash_edit_perm: true, + filterBarOrientation: FilterBarOrientation.VERTICAL, metadata: { native_filter_configuration: [], }, diff --git a/superset-frontend/spec/helpers/reducerIndex.ts b/superset-frontend/spec/helpers/reducerIndex.ts index 5599b38ddc2b..459a112e2201 100644 --- a/superset-frontend/spec/helpers/reducerIndex.ts +++ b/superset-frontend/spec/helpers/reducerIndex.ts @@ -31,12 +31,18 @@ import explore from 'src/explore/reducers/exploreReducer'; import sqlLab from 'src/SqlLab/reducers/sqlLab'; import localStorageUsageInKilobytes from 'src/SqlLab/reducers/localStorageUsage'; import reports from 'src/reports/reducers/reports'; +import getBootstrapData from 'src/utils/getBootstrapData'; const impressionId = (state = '') => state; -const container = document.getElementById('app'); -const bootstrap = JSON.parse(container?.getAttribute('data-bootstrap') ?? '{}'); -const common = { ...bootstrap.common }; +const bootstrapData = getBootstrapData(); +const common = { ...bootstrapData.common }; +const user = { ...bootstrapData.user }; + +const noopReducer = + (initialState: unknown) => + (state = initialState) => + state; export default { charts, @@ -55,5 +61,6 @@ export default { sqlLab, localStorageUsageInKilobytes, reports, - common: () => common, + common: noopReducer(common), + user: noopReducer(user), }; diff --git a/superset-frontend/spec/helpers/setup.ts b/superset-frontend/spec/helpers/setup.ts index c2c991f95621..281ab4ae4bb1 100644 --- a/superset-frontend/spec/helpers/setup.ts +++ b/superset-frontend/spec/helpers/setup.ts @@ -19,9 +19,11 @@ import 'jest-enzyme'; import './shim'; import { configure as configureTestingLibrary } from '@testing-library/react'; +import { matchers } from '@emotion/jest'; configureTestingLibrary({ testIdAttribute: 'data-test', }); -document.body.innerHTML = '<div id="app" data-bootstrap="{}"></div>'; +document.body.innerHTML = '<div id="app" data-bootstrap=""></div>'; +expect.extend(matchers); diff --git a/superset-frontend/spec/helpers/shim.tsx b/superset-frontend/spec/helpers/shim.tsx index 2f014fe7e1e1..152fcc370cfc 100644 --- a/superset-frontend/spec/helpers/shim.tsx +++ b/superset-frontend/spec/helpers/shim.tsx @@ -54,6 +54,7 @@ g.window.performance = { now: () => new Date().getTime() }; g.window.Worker = Worker; g.window.IntersectionObserver = IntersectionObserver; g.window.ResizeObserver = ResizeObserver; +g.window.featureFlags = {}; g.URL.createObjectURL = () => ''; g.caches = new CacheStorage(); @@ -88,4 +89,34 @@ jest.mock('react-markdown', () => (props: any) => <>{props.children}</>); jest.mock('rehype-sanitize', () => () => jest.fn()); jest.mock('rehype-raw', () => () => jest.fn()); +// Mocks the Icon component due to its async nature +// Tests should override this when needed +jest.mock('src/components/Icons/Icon', () => ({ + __esModule: true, + default: ({ + fileName, + role, + 'aria-label': ariaLabel, + ...rest + }: { + fileName: string; + role: string; + 'aria-label': React.AriaAttributes['aria-label']; + }) => ( + <span + role={role ?? 'img'} + aria-label={ariaLabel || fileName.replace('_', '-')} + {...rest} + /> + ), + StyledIcon: ({ + role, + 'aria-label': ariaLabel, + ...rest + }: { + role: string; + 'aria-label': React.AriaAttributes['aria-label']; + }) => <span role={role ?? 'img'} aria-label={ariaLabel} {...rest} />, +})); + process.env.WEBPACK_MODE = 'test'; diff --git a/superset-frontend/spec/helpers/testing-library.tsx b/superset-frontend/spec/helpers/testing-library.tsx index 56489cce8471..25b0324fe186 100644 --- a/superset-frontend/spec/helpers/testing-library.tsx +++ b/superset-frontend/spec/helpers/testing-library.tsx @@ -22,30 +22,41 @@ import { render, RenderOptions } from '@testing-library/react'; import { ThemeProvider, supersetTheme } from '@superset-ui/core'; import { BrowserRouter } from 'react-router-dom'; import { Provider } from 'react-redux'; -import { combineReducers, createStore, applyMiddleware, compose } from 'redux'; +import { + combineReducers, + createStore, + applyMiddleware, + compose, + Store, +} from 'redux'; import thunk from 'redux-thunk'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; import reducerIndex from 'spec/helpers/reducerIndex'; import { QueryParamProvider } from 'use-query-params'; +import QueryProvider from 'src/views/QueryProvider'; type Options = Omit<RenderOptions, 'queries'> & { useRedux?: boolean; useDnd?: boolean; useQueryParams?: boolean; useRouter?: boolean; + useQuery?: boolean; initialState?: {}; reducers?: {}; + store?: Store; }; -function createWrapper(options?: Options) { +export function createWrapper(options?: Options) { const { useDnd, useRedux, useQueryParams, + useQuery = true, useRouter, initialState, reducers, + store, } = options || {}; return ({ children }: { children?: ReactNode }) => { @@ -58,13 +69,15 @@ function createWrapper(options?: Options) { } if (useRedux) { - const store = createStore( - combineReducers(reducers || reducerIndex), - initialState || {}, - compose(applyMiddleware(thunk)), - ); + const mockStore = + store ?? + createStore( + combineReducers(reducers || reducerIndex), + initialState || {}, + compose(applyMiddleware(thunk)), + ); - result = <Provider store={store}>{result}</Provider>; + result = <Provider store={mockStore}>{result}</Provider>; } if (useQueryParams) { @@ -75,6 +88,10 @@ function createWrapper(options?: Options) { result = <BrowserRouter>{result}</BrowserRouter>; } + if (useQuery) { + result = <QueryProvider>{result}</QueryProvider>; + } + return result; }; } diff --git a/superset-frontend/src/GlobalStyles.tsx b/superset-frontend/src/GlobalStyles.tsx index 1e2cf449ff63..50f54ba88fa6 100644 --- a/superset-frontend/src/GlobalStyles.tsx +++ b/superset-frontend/src/GlobalStyles.tsx @@ -19,6 +19,7 @@ import React from 'react'; import { css } from '@superset-ui/core'; import { Global } from '@emotion/react'; +import { mix } from 'polished'; export const GlobalStyles = () => ( <Global @@ -33,6 +34,38 @@ export const GlobalStyles = () => ( th { font-weight: ${theme.typography.weights.bold}; } + // TODO: Remove when on Ant Design 5. + // Check src/components/Modal for more info. + .modal-functions-ok-button { + border-radius: ${theme.borderRadius}px; + background: ${theme.colors.primary.base}; + border: none; + text-transform: uppercase; + color: ${theme.colors.grayscale.light5}; + line-height: 1.5715; + font-size: ${theme.typography.sizes.s}px; + font-weight: ${theme.typography.weights.bold}; + &:hover { + background: ${theme.colors.primary.dark1}; + } + } + .modal-functions-cancel-button { + border-radius: ${theme.borderRadius}px; + background: ${theme.colors.primary.light4}; + border: none; + text-transform: uppercase; + color: ${theme.colors.primary.dark1}; + line-height: 1.5715; + font-size: ${theme.typography.sizes.s}px; + font-weight: ${theme.typography.weights.bold}; + &:hover { + background: ${mix( + 0.1, + theme.colors.primary.base, + theme.colors.primary.light4, + )}; + } + } `} /> ); diff --git a/superset-frontend/src/SqlLab/App.jsx b/superset-frontend/src/SqlLab/App.jsx index 02a4df2a6f8d..b75ea5c624bb 100644 --- a/superset-frontend/src/SqlLab/App.jsx +++ b/superset-frontend/src/SqlLab/App.jsx @@ -23,11 +23,15 @@ import thunkMiddleware from 'redux-thunk'; import { hot } from 'react-hot-loader/root'; import { ThemeProvider } from '@superset-ui/core'; import { GlobalStyles } from 'src/GlobalStyles'; +import QueryProvider from 'src/views/QueryProvider'; import { initFeatureFlags, isFeatureEnabled, FeatureFlag, } from 'src/featureFlags'; +import setupExtensions from 'src/setup/setupExtensions'; +import getBootstrapData from 'src/utils/getBootstrapData'; +import logger from 'src/middleware/loggerMiddleware'; import getInitialState from './reducers/getInitialState'; import rootReducer from './reducers/index'; import { initEnhancer } from '../reduxUtils'; @@ -39,14 +43,14 @@ import { import { BYTES_PER_CHAR, KB_STORAGE } from './constants'; import setupApp from '../setup/setupApp'; -import './main.less'; import '../assets/stylesheets/reactable-pagination.less'; import { theme } from '../preamble'; +import { SqlLabGlobalStyles } from './SqlLabGlobalStyles'; setupApp(); +setupExtensions(); -const appContainer = document.getElementById('app'); -const bootstrapData = JSON.parse(appContainer.getAttribute('data-bootstrap')); +const bootstrapData = getBootstrapData(); initFeatureFlags(bootstrapData.common.feature_flags); @@ -67,6 +71,9 @@ const sqlLabPersistStateConfig = { ...state[path], queries: emptyQueryResults(state[path].queries), queryEditors: clearQueryEditors(state[path].queryEditors), + unsavedQueryEditor: clearQueryEditors([ + state[path].unsavedQueryEditor, + ])[0], }; } }); @@ -91,6 +98,12 @@ const sqlLabPersistStateConfig = { const result = { ...initialState, ...persistedState, + sqlLab: { + ...(persistedState?.sqlLab || {}), + // Overwrite initialState over persistedState for sqlLab + // since a logic in getInitialState overrides the value from persistedState + ...initialState.sqlLab, + }, }; // Filter out any user data that may have been persisted in an older version. // Get user from bootstrap data instead, every time @@ -104,7 +117,7 @@ const store = createStore( rootReducer, initialState, compose( - applyMiddleware(thunkMiddleware), + applyMiddleware(thunkMiddleware, logger), initEnhancer( !isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE), sqlLabPersistStateConfig, @@ -125,12 +138,15 @@ if (sqlLabMenu) { } const Application = () => ( - <Provider store={store}> - <ThemeProvider theme={theme}> - <GlobalStyles /> - <App /> - </ThemeProvider> - </Provider> + <QueryProvider> + <Provider store={store}> + <ThemeProvider theme={theme}> + <GlobalStyles /> + <SqlLabGlobalStyles /> + <App /> + </ThemeProvider> + </Provider> + </QueryProvider> ); export default hot(Application); diff --git a/superset-frontend/src/SqlLab/SqlLabGlobalStyles.tsx b/superset-frontend/src/SqlLab/SqlLabGlobalStyles.tsx new file mode 100644 index 000000000000..f1398e3be9ac --- /dev/null +++ b/superset-frontend/src/SqlLab/SqlLabGlobalStyles.tsx @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { Global } from '@emotion/react'; +import { css } from '@superset-ui/core'; + +export const SqlLabGlobalStyles = () => ( + <Global + styles={theme => css` + body { + min-height: max( + 100vh, + ${theme.gridUnit * 125}px + ); // Set a min height so the gutter is always visible when resizing + overflow: hidden; + } + `} + /> +); diff --git a/superset-frontend/src/SqlLab/actions/sqlLab.js b/superset-frontend/src/SqlLab/actions/sqlLab.js index 04707d6ae67a..ab8abe0edca2 100644 --- a/superset-frontend/src/SqlLab/actions/sqlLab.js +++ b/superset-frontend/src/SqlLab/actions/sqlLab.js @@ -17,8 +17,8 @@ * under the License. */ import shortid from 'shortid'; -import JSONbig from 'json-bigint'; -import { t, SupersetClient } from '@superset-ui/core'; +import rison from 'rison'; +import { SupersetClient, t } from '@superset-ui/core'; import invert from 'lodash/invert'; import mapKeys from 'lodash/mapKeys'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; @@ -32,6 +32,7 @@ import { } from 'src/components/MessageToasts/actions'; import { getClientErrorObject } from 'src/utils/getClientErrorObject'; import COMMON_ERR_MESSAGES from 'src/utils/errorMessages'; +import { newQueryTabName } from '../utils/newQueryTabName'; export const RESET_STATE = 'RESET_STATE'; export const ADD_QUERY_EDITOR = 'ADD_QUERY_EDITOR'; @@ -40,7 +41,7 @@ export const QUERY_EDITOR_SAVED = 'QUERY_EDITOR_SAVED'; export const CLONE_QUERY_TO_NEW_TAB = 'CLONE_QUERY_TO_NEW_TAB'; export const REMOVE_QUERY_EDITOR = 'REMOVE_QUERY_EDITOR'; export const MERGE_TABLE = 'MERGE_TABLE'; -export const REMOVE_TABLE = 'REMOVE_TABLE'; +export const REMOVE_TABLES = 'REMOVE_TABLES'; export const END_QUERY = 'END_QUERY'; export const REMOVE_QUERY = 'REMOVE_QUERY'; export const EXPAND_TABLE = 'EXPAND_TABLE'; @@ -111,8 +112,8 @@ const ERR_MSG_CANT_LOAD_QUERY = t("The query couldn't be loaded"); const queryClientMapping = { id: 'remoteId', db_id: 'dbId', - client_id: 'id', - label: 'title', + label: 'name', + template_parameters: 'templateParams', }; const queryServerMapping = invert(queryClientMapping); @@ -120,8 +121,19 @@ const queryServerMapping = invert(queryClientMapping); const fieldConverter = mapping => obj => mapKeys(obj, (value, key) => (key in mapping ? mapping[key] : key)); -const convertQueryToServer = fieldConverter(queryServerMapping); -const convertQueryToClient = fieldConverter(queryClientMapping); +export const convertQueryToServer = fieldConverter(queryServerMapping); +export const convertQueryToClient = fieldConverter(queryClientMapping); + +export function getUpToDateQuery(rootState, queryEditor, key) { + const { + sqlLab: { unsavedQueryEditor }, + } = rootState; + const id = key ?? queryEditor.id; + return { + ...queryEditor, + ...(id === unsavedQueryEditor.id && unsavedQueryEditor), + }; +} export function resetState() { return { type: RESET_STATE }; @@ -167,24 +179,26 @@ export function scheduleQuery(query) { ); } -export function estimateQueryCost(query) { - const { dbId, schema, sql, templateParams } = query; - const endpoint = - schema === null - ? `/superset/estimate_query_cost/${dbId}/` - : `/superset/estimate_query_cost/${dbId}/${schema}/`; - return dispatch => - Promise.all([ - dispatch({ type: COST_ESTIMATE_STARTED, query }), +export function estimateQueryCost(queryEditor) { + return (dispatch, getState) => { + const { dbId, schema, sql, selectedText, templateParams } = + getUpToDateQuery(getState(), queryEditor); + const requestSql = selectedText || sql; + const endpoint = + schema === null + ? `/superset/estimate_query_cost/${dbId}/` + : `/superset/estimate_query_cost/${dbId}/${schema}/`; + return Promise.all([ + dispatch({ type: COST_ESTIMATE_STARTED, query: queryEditor }), SupersetClient.post({ endpoint, postPayload: { - sql, + sql: requestSql, templateParams: JSON.parse(templateParams || '{}'), }, }) .then(({ json }) => - dispatch({ type: COST_ESTIMATE_RETURNED, query, json }), + dispatch({ type: COST_ESTIMATE_RETURNED, query: queryEditor, json }), ) .catch(response => getClientErrorObject(response).then(error => { @@ -194,12 +208,13 @@ export function estimateQueryCost(query) { t('Failed at retrieving results'); return dispatch({ type: COST_ESTIMATE_FAILED, - query, + query: queryEditor, error: message, }); }), ), ]); + }; } export function startQuery(query) { @@ -215,11 +230,13 @@ export function startQuery(query) { export function querySuccess(query, results) { return function (dispatch) { + const sqlEditorId = results?.query?.sqlEditorId; const sync = + sqlEditorId && !query.isDataPreview && isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE) ? SupersetClient.put({ - endpoint: encodeURI(`/tabstateview/${results.query.sqlEditorId}`), + endpoint: encodeURI(`/tabstateview/${sqlEditorId}`), postPayload: { latest_query_id: query.id }, }) : Promise.resolve(); @@ -289,14 +306,16 @@ export function fetchQueryResults(query, displayLimit) { return function (dispatch) { dispatch(requestQueryResults(query)); + const queryParams = rison.encode({ + key: query.resultsKey, + rows: displayLimit || null, + }); + return SupersetClient.get({ - endpoint: `/superset/results/${query.resultsKey}/?rows=${displayLimit}`, - parseMethod: 'text', + endpoint: `/api/v1/sqllab/results/?q=${queryParams}`, + parseMethod: 'json-bigint', }) - .then(({ text = '{}' }) => { - const bigIntJson = JSONbig.parse(text); - return dispatch(querySuccess(query, bigIntJson)); - }) + .then(({ json }) => dispatch(querySuccess(query, json))) .catch(response => getClientErrorObject(response).then(error => { const message = @@ -334,20 +353,23 @@ export function runQuery(query) { const search = window.location.search || ''; return SupersetClient.post({ - endpoint: `/superset/sql_json/${search}`, + endpoint: `/api/v1/sqllab/execute/${search}`, body: JSON.stringify(postPayload), headers: { 'Content-Type': 'application/json' }, - parseMethod: 'text', + parseMethod: 'json-bigint', }) - .then(({ text = '{}' }) => { + .then(({ json }) => { if (!query.runAsync) { - const bigIntJson = JSONbig.parse(text); - dispatch(querySuccess(query, bigIntJson)); + dispatch(querySuccess(query, json)); } }) .catch(response => getClientErrorObject(response).then(error => { - let message = error.error || error.statusText || t('Unknown error'); + let message = + error.error || + error.message || + error.statusText || + t('Unknown error'); if (message.includes('CSRF token')) { message = t(COMMON_ERR_MESSAGES.SESSION_TIMED_OUT); } @@ -357,6 +379,34 @@ export function runQuery(query) { }; } +export function runQueryFromSqlEditor( + database, + queryEditor, + defaultQueryLimit, + tempTable, + ctas, + ctasMethod, +) { + return function (dispatch, getState) { + const qe = getUpToDateQuery(getState(), queryEditor, queryEditor.id); + const query = { + dbId: qe.dbId, + sql: qe.selectedText || qe.sql, + sqlEditorId: qe.id, + tab: qe.name, + schema: qe.schema, + tempTable, + templateParams: qe.templateParams, + queryLimit: qe.queryLimit || defaultQueryLimit, + runAsync: database ? database.allow_run_async : false, + ctas, + ctas_method: ctasMethod, + updateTabState: !qe.selectedText, + }; + dispatch(runQuery(query)); + }; +} + export function reRunQuery(query) { // run Query with a new id return function (dispatch) { @@ -364,8 +414,23 @@ export function reRunQuery(query) { }; } -export function validateQuery(query) { - return function (dispatch) { +export function validateQuery(queryEditor, sql) { + return function (dispatch, getState) { + const { + sqlLab: { unsavedQueryEditor }, + } = getState(); + const qe = { + ...queryEditor, + ...(queryEditor.id === unsavedQueryEditor.id && unsavedQueryEditor), + }; + + const query = { + dbId: qe.dbId, + sql, + sqlEditorId: qe.id, + schema: qe.schema, + templateParams: qe.templateParams, + }; dispatch(startQueryValidation(query)); const postPayload = { @@ -375,7 +440,7 @@ export function validateQuery(query) { }; return SupersetClient.post({ - endpoint: `/api/v1/database/${query.dbId}/validate_sql`, + endpoint: `/api/v1/database/${query.dbId}/validate_sql/`, body: JSON.stringify(postPayload), headers: { 'Content-Type': 'application/json' }, }) @@ -395,9 +460,9 @@ export function validateQuery(query) { export function postStopQuery(query) { return function (dispatch) { return SupersetClient.post({ - endpoint: '/superset/stop_query/', - postPayload: { client_id: query.id }, - stringify: false, + endpoint: '/api/v1/query/stop', + body: JSON.stringify({ client_id: query.id }), + headers: { 'Content-Type': 'application/json' }, }) .then(() => dispatch(stopQuery(query))) .then(() => dispatch(addSuccessToast(t('Query was stopped.')))) @@ -533,6 +598,50 @@ export function addQueryEditor(queryEditor) { }; } +export function addNewQueryEditor() { + return function (dispatch, getState) { + const { + sqlLab: { + queryEditors, + tabHistory, + unsavedQueryEditor, + defaultDbId, + databases, + }, + common, + } = getState(); + const activeQueryEditor = queryEditors.find( + qe => qe.id === tabHistory[tabHistory.length - 1], + ); + const dbIds = Object.values(databases).map(database => database.id); + const firstDbId = dbIds.length > 0 ? Math.min(...dbIds) : undefined; + const { dbId, schema, queryLimit, autorun } = { + ...queryEditors[0], + ...activeQueryEditor, + ...(unsavedQueryEditor.id === activeQueryEditor?.id && + unsavedQueryEditor), + }; + const warning = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE) + ? '' + : t( + '-- Note: Unless you save your query, these tabs will NOT persist if you clear your cookies or change browsers.\n\n', + ); + + const name = newQueryTabName(queryEditors || []); + + return dispatch( + addQueryEditor({ + dbId: dbId || defaultDbId || firstDbId, + schema: schema ?? null, + autorun: autorun ?? false, + sql: `${warning}SELECT ...`, + queryLimit: queryLimit || common.conf.DEFAULT_SQLLAB_LIMIT, + name, + }), + ); + }; +} + export function cloneQueryToNewTab(query, autorun) { return function (dispatch, getState) { const state = getState(); @@ -541,7 +650,7 @@ export function cloneQueryToNewTab(query, autorun) { qe => qe.id === tabHistory[tabHistory.length - 1], ); const queryEditor = { - title: t('Copy of %s', sourceQueryEditor.title), + name: t('Copy of %s', sourceQueryEditor.name), dbId: query.dbId ? query.dbId : null, schema: query.schema ? query.schema : null, autorun, @@ -620,6 +729,7 @@ export function switchQueryEditor(queryEditor, displayLimit) { return function (dispatch) { if ( isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE) && + queryEditor && !queryEditor.loaded ) { SupersetClient.get({ @@ -629,7 +739,7 @@ export function switchQueryEditor(queryEditor, displayLimit) { const loadedQueryEditor = { id: json.id.toString(), loaded: true, - title: json.label, + name: json.label, sql: json.sql, selectedText: null, latestQueryId: json.latest_query?.id, @@ -723,6 +833,17 @@ export function removeQueryEditor(queryEditor) { }; } +export function removeAllOtherQueryEditors(queryEditor) { + return function (dispatch, getState) { + const { sqlLab } = getState(); + sqlLab.queryEditors?.forEach(otherQueryEditor => { + if (otherQueryEditor.id !== queryEditor.id) { + dispatch(removeQueryEditor(otherQueryEditor)); + } + }); + }; +} + export function removeQuery(query) { return function (dispatch) { const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE) @@ -834,24 +955,28 @@ export function queryEditorSetAutorun(queryEditor, autorun) { }; } -export function queryEditorSetTitle(queryEditor, title) { +export function queryEditorSetTitle(queryEditor, name, id) { return function (dispatch) { const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE) ? SupersetClient.put({ - endpoint: encodeURI(`/tabstateview/${queryEditor.id}`), - postPayload: { label: title }, + endpoint: encodeURI(`/tabstateview/${id}`), + postPayload: { label: name }, }) : Promise.resolve(); return sync .then(() => - dispatch({ type: QUERY_EDITOR_SET_TITLE, queryEditor, title }), + dispatch({ + type: QUERY_EDITOR_SET_TITLE, + queryEditor: { ...queryEditor, id }, + name, + }), ) .catch(() => dispatch( addDangerToast( t( - 'An error occurred while setting the tab title. Please contact your administrator.', + 'An error occurred while setting the tab name. Please contact your administrator.', ), ), ), @@ -859,21 +984,26 @@ export function queryEditorSetTitle(queryEditor, title) { }; } -export function saveQuery(query) { +export function saveQuery(query, clientId) { + const { id, ...payload } = convertQueryToServer(query); + return dispatch => SupersetClient.post({ - endpoint: '/savedqueryviewapi/api/create', - postPayload: convertQueryToServer(query), - stringify: false, + endpoint: '/api/v1/saved_query/', + jsonPayload: convertQueryToServer(payload), }) .then(result => { - const savedQuery = convertQueryToClient(result.json.item); + const savedQuery = convertQueryToClient({ + id: result.json.id, + ...result.json.result, + }); dispatch({ type: QUERY_EDITOR_SAVED, query, + clientId, result: savedQuery, }); - dispatch(queryEditorSetTitle(query, query.title)); + dispatch(queryEditorSetTitle(query, query.name, clientId)); return savedQuery; }) .catch(() => @@ -899,20 +1029,24 @@ export const addSavedQueryToTabState = }); }; -export function updateSavedQuery(query) { +export function updateSavedQuery(query, clientId) { + const { id, ...payload } = convertQueryToServer(query); + return dispatch => SupersetClient.put({ - endpoint: `/savedqueryviewapi/api/update/${query.remoteId}`, - postPayload: convertQueryToServer(query), - stringify: false, + endpoint: `/api/v1/saved_query/${query.remoteId}`, + jsonPayload: convertQueryToServer(payload), }) .then(() => { dispatch(addSuccessToast(t('Your query was updated'))); - dispatch(queryEditorSetTitle(query, query.title)); + dispatch(queryEditorSetTitle(query, query.name, clientId)); + }) + .catch(e => { + const message = t('Your query could not be updated'); + // eslint-disable-next-line no-console + console.error(message, e); + dispatch(addDangerToast(message)); }) - .catch(() => - dispatch(addDangerToast(t('Your query could not be updated'))), - ) .then(() => dispatch(updateQueryEditor(query))); } @@ -920,8 +1054,9 @@ export function queryEditorSetSql(queryEditor, sql) { return { type: QUERY_EDITOR_SET_SQL, queryEditor, sql }; } -export function queryEditorSetAndSaveSql(queryEditor, sql) { - return function (dispatch) { +export function queryEditorSetAndSaveSql(targetQueryEditor, sql) { + return function (dispatch, getState) { + const queryEditor = getUpToDateQuery(getState(), targetQueryEditor); // saved query and set tab state use this action dispatch(queryEditorSetSql(queryEditor, sql)); if (isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE)) { @@ -965,7 +1100,7 @@ export function queryEditorSetQueryLimit(queryEditor, queryLimit) { dispatch( addDangerToast( t( - 'An error occurred while setting the tab title. Please contact your administrator.', + 'An error occurred while setting the tab name. Please contact your administrator.', ), ), ), @@ -1066,8 +1201,9 @@ function getTableExtendedMetadata(table, query, dispatch) { ); } -export function addTable(query, database, tableName, schemaName) { - return function (dispatch) { +export function addTable(queryEditor, database, tableName, schemaName) { + return function (dispatch, getState) { + const query = getUpToDateQuery(getState(), queryEditor, queryEditor.id); const table = { dbId: query.dbId, queryEditorId: query.id, @@ -1213,16 +1349,21 @@ export function collapseTable(table) { }; } -export function removeTable(table) { +export function removeTables(tables) { return function (dispatch) { + const tablesToRemove = tables?.filter(Boolean) ?? []; const sync = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE) - ? SupersetClient.delete({ - endpoint: encodeURI(`/tableschemaview/${table.id}`), - }) + ? Promise.all( + tablesToRemove.map(table => + SupersetClient.delete({ + endpoint: encodeURI(`/tableschemaview/${table.id}`), + }), + ), + ) : Promise.resolve(); return sync - .then(() => dispatch({ type: REMOVE_TABLE, table })) + .then(() => dispatch({ type: REMOVE_TABLES, tables: tablesToRemove })) .catch(() => dispatch( addDangerToast( @@ -1259,11 +1400,12 @@ export function popStoredQuery(urlId) { .then(({ json }) => dispatch( addQueryEditor({ - title: json.title ? json.title : t('Shared query'), + name: json.name ? json.name : t('Shared query'), dbId: json.dbId ? parseInt(json.dbId, 10) : null, schema: json.schema ? json.schema : null, autorun: json.autorun ? json.autorun : false, sql: json.sql ? json.sql : 'SELECT ...', + templateParams: json.templateParams, }), ), ) @@ -1273,11 +1415,12 @@ export function popStoredQuery(urlId) { export function popSavedQuery(saveQueryId) { return function (dispatch) { return SupersetClient.get({ - endpoint: `/savedqueryviewapi/api/get/${saveQueryId}`, + endpoint: `/api/v1/saved_query/${saveQueryId}`, }) .then(({ json }) => { const queryEditorProps = { ...convertQueryToClient(json.result), + dbId: json.result?.database?.id, loaded: true, autorun: false, }; @@ -1297,7 +1440,7 @@ export function popQuery(queryId) { dbId: queryData.database.id, schema: queryData.schema, sql: queryData.sql, - title: `Copy of ${queryData.tab_name}`, + name: t('Copy of %s', queryData.tab_name), autorun: false, }; return dispatch(addQueryEditor(queryEditorProps)); @@ -1307,17 +1450,19 @@ export function popQuery(queryId) { } export function popDatasourceQuery(datasourceKey, sql) { return function (dispatch) { + const QUERY_TEXT = t('Query'); + const datasetId = datasourceKey.split('__')[0]; return SupersetClient.get({ - endpoint: `/superset/fetch_datasource_metadata?datasourceKey=${datasourceKey}`, + endpoint: `/api/v1/dataset/${datasetId}?q=(keys:!(none))`, }) .then(({ json }) => dispatch( addQueryEditor({ - title: `Query ${json.name}`, - dbId: json.database.id, - schema: json.schema, + name: `${QUERY_TEXT} ${json.result.name}`, + dbId: json.result.database.id, + schema: json.result.schema, autorun: sql !== undefined, - sql: sql || json.select_star, + sql: sql || json.result.select_star, }), ), ) @@ -1349,7 +1494,10 @@ export function createDatasource(vizOptions) { return Promise.resolve(json); }) - .catch(() => { + .catch(error => { + getClientErrorObject(error).then(e => { + dispatch(addDangerToast(e.error)); + }); dispatch( createDatasourceFailed( t('An error occurred while creating the data source'), @@ -1365,13 +1513,13 @@ export function createCtasDatasource(vizOptions) { return dispatch => { dispatch(createDatasourceStarted()); return SupersetClient.post({ - endpoint: '/superset/get_or_create_table/', - postPayload: { data: vizOptions }, + endpoint: '/api/v1/dataset/get_or_create/', + jsonPayload: vizOptions, }) .then(({ json }) => { - dispatch(createDatasourceSuccess(json)); + dispatch(createDatasourceSuccess(json.result)); - return json; + return json.result; }) .catch(() => { const errorMsg = t('An error occurred while creating the data source'); diff --git a/superset-frontend/src/SqlLab/actions/sqlLab.test.js b/superset-frontend/src/SqlLab/actions/sqlLab.test.js index 440df74bf937..63711550b248 100644 --- a/superset-frontend/src/SqlLab/actions/sqlLab.test.js +++ b/superset-frontend/src/SqlLab/actions/sqlLab.test.js @@ -24,7 +24,13 @@ import thunk from 'redux-thunk'; import shortid from 'shortid'; import * as featureFlags from 'src/featureFlags'; import * as actions from 'src/SqlLab/actions/sqlLab'; -import { defaultQueryEditor, query } from '../fixtures'; +import { + defaultQueryEditor, + query, + initialState, + queryId, +} from 'src/SqlLab/fixtures'; +import { QueryState } from '@superset-ui/core'; const middlewares = [thunk]; const mockStore = configureMockStore(middlewares); @@ -32,13 +38,12 @@ const mockStore = configureMockStore(middlewares); describe('async actions', () => { const mockBigNumber = '9223372036854775807'; const queryEditor = { + ...defaultQueryEditor, id: 'abcd', autorun: false, - dbId: null, latestQueryId: null, - selectedText: null, sql: 'SELECT *\nFROM\nWHERE', - title: 'Untitled Query 1', + name: 'Untitled Query 1', schemaOptions: [{ value: 'main', label: 'main', title: 'main' }], }; @@ -50,40 +55,42 @@ describe('async actions', () => { afterEach(fetchMock.resetHistory); - const fetchQueryEndpoint = 'glob:*/superset/results/*'; + const fetchQueryEndpoint = 'glob:*/api/v1/sqllab/results/*'; fetchMock.get( fetchQueryEndpoint, JSON.stringify({ data: mockBigNumber, query: { sqlEditorId: 'dfsadfs' } }), ); - const runQueryEndpoint = 'glob:*/superset/sql_json/'; + const runQueryEndpoint = 'glob:*/api/v1/sqllab/execute/'; fetchMock.post(runQueryEndpoint, `{ "data": ${mockBigNumber} }`); describe('saveQuery', () => { - const saveQueryEndpoint = 'glob:*/savedqueryviewapi/api/create'; + const saveQueryEndpoint = 'glob:*/api/v1/saved_query/'; fetchMock.post(saveQueryEndpoint, { results: { json: {} } }); const makeRequest = () => { - const request = actions.saveQuery(query); - return request(dispatch); + const request = actions.saveQuery(query, queryId); + return request(dispatch, () => initialState); }; it('posts to the correct url', () => { expect.assertions(1); - const store = mockStore({}); - return store.dispatch(actions.saveQuery(query)).then(() => { + const store = mockStore(initialState); + return store.dispatch(actions.saveQuery(query, queryId)).then(() => { expect(fetchMock.calls(saveQueryEndpoint)).toHaveLength(1); }); }); it('posts the correct query object', () => { - const store = mockStore({}); - return store.dispatch(actions.saveQuery(query)).then(() => { + const store = mockStore(initialState); + return store.dispatch(actions.saveQuery(query, queryId)).then(() => { const call = fetchMock.calls(saveQueryEndpoint)[0]; - const formData = call[1].body; - Object.keys(query).forEach(key => { - expect(formData.get(key)).toBeDefined(); + const formData = JSON.parse(call[1].body); + const mappedQueryToServer = actions.convertQueryToServer(query); + + Object.keys(mappedQueryToServer).forEach(key => { + expect(formData[key]).toBeDefined(); }); }); }); @@ -107,7 +114,7 @@ describe('async actions', () => { it('onSave calls QUERY_EDITOR_SAVED and QUERY_EDITOR_SET_TITLE', () => { expect.assertions(1); - const store = mockStore({}); + const store = mockStore(initialState); const expectedActionTypes = [ actions.QUERY_EDITOR_SAVED, actions.QUERY_EDITOR_SET_TITLE, @@ -191,7 +198,7 @@ describe('async actions', () => { describe('runQuery without query params', () => { const makeRequest = () => { const request = actions.runQuery(query); - return request(dispatch); + return request(dispatch, () => initialState); }; it('makes the fetch request', () => { @@ -224,7 +231,9 @@ describe('async actions', () => { const store = mockStore({}); const expectedActionTypes = [actions.START_QUERY, actions.QUERY_SUCCESS]; - return store.dispatch(actions.runQuery(query)).then(() => { + const { dispatch } = store; + const request = actions.runQuery(query); + return request(dispatch, () => initialState).then(() => { expect(store.getActions().map(a => a.type)).toEqual( expectedActionTypes, ); @@ -242,7 +251,9 @@ describe('async actions', () => { const store = mockStore({}); const expectedActionTypes = [actions.START_QUERY, actions.QUERY_FAILED]; - return store.dispatch(actions.runQuery(query)).then(() => { + const { dispatch } = store; + const request = actions.runQuery(query); + return request(dispatch, () => initialState).then(() => { expect(store.getActions().map(a => a.type)).toEqual( expectedActionTypes, ); @@ -265,15 +276,20 @@ describe('async actions', () => { const makeRequest = () => { const request = actions.runQuery(query); - return request(dispatch); + return request(dispatch, () => initialState); }; - it('makes the fetch request', () => - makeRequest().then(() => { - expect( - fetchMock.calls('glob:*/superset/sql_json/?foo=bar'), - ).toHaveLength(1); - })); + it('makes the fetch request', async () => { + const runQueryEndpointWithParams = + 'glob:*/api/v1/sqllab/execute/?foo=bar'; + fetchMock.post( + runQueryEndpointWithParams, + `{ "data": ${mockBigNumber} }`, + ); + await makeRequest().then(() => { + expect(fetchMock.calls(runQueryEndpointWithParams)).toHaveLength(1); + }); + }); }); describe('reRunQuery', () => { @@ -290,21 +306,27 @@ describe('async actions', () => { const state = { sqlLab: { tabHistory: [id], - queryEditors: [{ id, title: 'Dummy query editor' }], + queryEditors: [{ id, name: 'Dummy query editor' }], + unsavedQueryEditor: {}, }, }; const store = mockStore(state); - store.dispatch(actions.reRunQuery(query)); + const request = actions.reRunQuery(query); + request(store.dispatch, store.getState); expect(store.getActions()[0].query.id).toEqual('abcd'); }); }); describe('postStopQuery', () => { - const stopQueryEndpoint = 'glob:*/superset/stop_query/*'; + const stopQueryEndpoint = 'glob:*/api/v1/query/stop'; fetchMock.post(stopQueryEndpoint, {}); + const baseQuery = { + ...query, + id: 'test_foo', + }; const makeRequest = () => { - const request = actions.postStopQuery(query); + const request = actions.postStopQuery(baseQuery); return request(dispatch); }; @@ -329,7 +351,8 @@ describe('async actions', () => { return makeRequest().then(() => { const call = fetchMock.calls(stopQueryEndpoint)[0]; - expect(call[1].body.get('client_id')).toBe(query.id); + const body = JSON.parse(call[1].body); + expect(body.client_id).toBe(baseQuery.id); }); }); }); @@ -350,7 +373,8 @@ describe('async actions', () => { const state = { sqlLab: { tabHistory: [id], - queryEditors: [{ id, title: 'Dummy query editor' }], + queryEditors: [{ id, name: 'Dummy query editor' }], + unsavedQueryEditor: {}, }, }; const store = mockStore(state); @@ -358,22 +382,22 @@ describe('async actions', () => { { type: actions.ADD_QUERY_EDITOR, queryEditor: { - title: 'Copy of Dummy query editor', + name: 'Copy of Dummy query editor', dbId: 1, - schema: null, + schema: query.schema, autorun: true, sql: 'SELECT * FROM something', queryLimit: undefined, maxRow: undefined, id: 'abcd', + templateParams: undefined, }, }, ]; - return store - .dispatch(actions.cloneQueryToNewTab(query, true)) - .then(() => { - expect(store.getActions()).toEqual(expectedActions); - }); + const request = actions.cloneQueryToNewTab(query, true); + return request(store.dispatch, store.getState).then(() => { + expect(store.getActions()).toEqual(expectedActions); + }); }); }); @@ -389,18 +413,45 @@ describe('async actions', () => { it('creates new query editor', () => { expect.assertions(1); - const store = mockStore({}); + const store = mockStore(initialState); const expectedActions = [ { type: actions.ADD_QUERY_EDITOR, queryEditor, }, ]; - return store - .dispatch(actions.addQueryEditor(defaultQueryEditor)) - .then(() => { + const request = actions.addQueryEditor(defaultQueryEditor); + return request(store.dispatch, store.getState).then(() => { + expect(store.getActions()).toEqual(expectedActions); + }); + }); + + describe('addNewQueryEditor', () => { + it('creates new query editor with new tab name', () => { + const store = mockStore(initialState); + const expectedActions = [ + { + type: actions.ADD_QUERY_EDITOR, + queryEditor: { + id: 'abcd', + sql: expect.stringContaining('SELECT ...'), + name: `Untitled Query ${ + store.getState().sqlLab.queryEditors.length + 1 + }`, + dbId: defaultQueryEditor.dbId, + schema: defaultQueryEditor.schema, + autorun: false, + queryLimit: + defaultQueryEditor.queryLimit || + initialState.common.conf.DEFAULT_SQLLAB_LIMIT, + }, + }, + ]; + const request = actions.addNewQueryEditor(); + return request(store.dispatch, store.getState).then(() => { expect(store.getActions()).toEqual(expectedActions); }); + }); }); }); @@ -464,6 +515,7 @@ describe('async actions', () => { const results = { data: mockBigNumber, query: { sqlEditorId: 'abcd' }, + status: QueryState.SUCCESS, query_id: 'efgh', }; fetchMock.get(fetchQueryEndpoint, JSON.stringify(results), { @@ -487,6 +539,35 @@ describe('async actions', () => { expect(fetchMock.calls(updateTabStateEndpoint)).toHaveLength(1); }); }); + + it("doesn't update the tab state in the backend on stoppped query", () => { + expect.assertions(2); + + const results = { + status: QueryState.STOPPED, + query_id: 'efgh', + }; + fetchMock.get(fetchQueryEndpoint, JSON.stringify(results), { + overwriteRoutes: true, + }); + const store = mockStore({}); + const expectedActions = [ + { + type: actions.REQUEST_QUERY_RESULTS, + query, + }, + // missing below + { + type: actions.QUERY_SUCCESS, + query, + results, + }, + ]; + return store.dispatch(actions.fetchQueryResults(query)).then(() => { + expect(store.getActions()).toEqual(expectedActions); + expect(fetchMock.calls(updateTabStateEndpoint)).toHaveLength(0); + }); + }); }); describe('addQueryEditor', () => { @@ -617,17 +698,19 @@ describe('async actions', () => { it('updates the tab state in the backend', () => { expect.assertions(2); - const title = 'title'; + const name = 'name'; const store = mockStore({}); const expectedActions = [ { type: actions.QUERY_EDITOR_SET_TITLE, queryEditor, - title, + name, }, ]; return store - .dispatch(actions.queryEditorSetTitle(queryEditor, title)) + .dispatch( + actions.queryEditorSetTitle(queryEditor, name, queryEditor.id), + ) .then(() => { expect(store.getActions()).toEqual(expectedActions); expect(fetchMock.calls(updateTabStateEndpoint)).toHaveLength(1); @@ -648,14 +731,12 @@ describe('async actions', () => { it('updates the tab state in the backend', () => { expect.assertions(2); - const store = mockStore({}); - - return store - .dispatch(actions.queryEditorSetAndSaveSql(queryEditor, sql)) - .then(() => { - expect(store.getActions()).toEqual(expectedActions); - expect(fetchMock.calls(updateTabStateEndpoint)).toHaveLength(1); - }); + const store = mockStore(initialState); + const request = actions.queryEditorSetAndSaveSql(queryEditor, sql); + return request(store.dispatch, store.getState).then(() => { + expect(store.getActions()).toEqual(expectedActions); + expect(fetchMock.calls(updateTabStateEndpoint)).toHaveLength(1); + }); }); }); describe('with backend persistence flag off', () => { @@ -666,9 +747,9 @@ describe('async actions', () => { feature => !(feature === 'SQLLAB_BACKEND_PERSISTENCE'), ); - const store = mockStore({}); - - store.dispatch(actions.queryEditorSetAndSaveSql(queryEditor, sql)); + const store = mockStore(initialState); + const request = actions.queryEditorSetAndSaveSql(queryEditor, sql); + request(store.dispatch, store.getState); expect(store.getActions()).toEqual(expectedActions); expect(fetchMock.calls(updateTabStateEndpoint)).toHaveLength(0); @@ -730,29 +811,71 @@ describe('async actions', () => { const database = { disable_data_preview: true }; const tableName = 'table'; const schemaName = 'schema'; - const store = mockStore({}); + const store = mockStore(initialState); const expectedActionTypes = [ actions.MERGE_TABLE, // addTable actions.MERGE_TABLE, // getTableMetadata actions.MERGE_TABLE, // getTableExtendedMetadata actions.MERGE_TABLE, // addTable ]; - return store - .dispatch(actions.addTable(query, database, tableName, schemaName)) - .then(() => { - expect(store.getActions().map(a => a.type)).toEqual( - expectedActionTypes, - ); - expect(store.getActions()[0].prepend).toBeTruthy(); - expect(fetchMock.calls(updateTableSchemaEndpoint)).toHaveLength(1); - expect(fetchMock.calls(getTableMetadataEndpoint)).toHaveLength(1); - expect(fetchMock.calls(getExtraTableMetadataEndpoint)).toHaveLength( - 1, - ); + const request = actions.addTable( + query, + database, + tableName, + schemaName, + ); + return request(store.dispatch, store.getState).then(() => { + expect(store.getActions().map(a => a.type)).toEqual( + expectedActionTypes, + ); + expect(store.getActions()[0].prepend).toBeTruthy(); + expect(fetchMock.calls(updateTableSchemaEndpoint)).toHaveLength(1); + expect(fetchMock.calls(getTableMetadataEndpoint)).toHaveLength(1); + expect(fetchMock.calls(getExtraTableMetadataEndpoint)).toHaveLength( + 1, + ); - // tab state is not updated, since no query was run - expect(fetchMock.calls(updateTabStateEndpoint)).toHaveLength(0); - }); + // tab state is not updated, since no query was run + expect(fetchMock.calls(updateTabStateEndpoint)).toHaveLength(0); + }); + }); + + it('fetches table schema state from unsaved change', () => { + const database = { disable_data_preview: true }; + const tableName = 'table'; + const schemaName = 'schema'; + const expectedDbId = 473892; + const store = mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: query.id, + dbId: expectedDbId, + }, + }, + }); + const request = actions.addTable( + query, + database, + tableName, + schemaName, + ); + return request(store.dispatch, store.getState).then(() => { + expect( + fetchMock.calls( + `glob:**/api/v1/database/${expectedDbId}/table/*/*/`, + ), + ).toHaveLength(1); + expect( + fetchMock.calls( + `glob:**/api/v1/database/${expectedDbId}/table_extra/*/*/`, + ), + ).toHaveLength(1); + + // tab state is not updated, since no query was run + expect(fetchMock.calls(updateTabStateEndpoint)).toHaveLength(0); + }); }); it('updates and runs data preview query when configured', () => { @@ -770,7 +893,7 @@ describe('async actions', () => { const database = { disable_data_preview: false, id: 1 }; const tableName = 'table'; const schemaName = 'schema'; - const store = mockStore({}); + const store = mockStore(initialState); const expectedActionTypes = [ actions.MERGE_TABLE, // addTable actions.MERGE_TABLE, // getTableMetadata @@ -780,20 +903,24 @@ describe('async actions', () => { actions.MERGE_TABLE, // addTable actions.QUERY_SUCCESS, // querySuccess ]; - return store - .dispatch(actions.addTable(query, database, tableName, schemaName)) - .then(() => { - expect(store.getActions().map(a => a.type)).toEqual( - expectedActionTypes, - ); - expect(fetchMock.calls(updateTableSchemaEndpoint)).toHaveLength(1); - expect(fetchMock.calls(getTableMetadataEndpoint)).toHaveLength(1); - expect(fetchMock.calls(getExtraTableMetadataEndpoint)).toHaveLength( - 1, - ); - // tab state is not updated, since the query is a data preview - expect(fetchMock.calls(updateTabStateEndpoint)).toHaveLength(0); - }); + const request = actions.addTable( + query, + database, + tableName, + schemaName, + ); + return request(store.dispatch, store.getState).then(() => { + expect(store.getActions().map(a => a.type)).toEqual( + expectedActionTypes, + ); + expect(fetchMock.calls(updateTableSchemaEndpoint)).toHaveLength(1); + expect(fetchMock.calls(getTableMetadataEndpoint)).toHaveLength(1); + expect(fetchMock.calls(getExtraTableMetadataEndpoint)).toHaveLength( + 1, + ); + // tab state is not updated, since the query is a data preview + expect(fetchMock.calls(updateTabStateEndpoint)).toHaveLength(0); + }); }); }); @@ -835,7 +962,7 @@ describe('async actions', () => { }); }); - describe('removeTable', () => { + describe('removeTables', () => { it('updates the table schema state in the backend', () => { expect.assertions(2); @@ -843,15 +970,32 @@ describe('async actions', () => { const store = mockStore({}); const expectedActions = [ { - type: actions.REMOVE_TABLE, - table, + type: actions.REMOVE_TABLES, + tables: [table], }, ]; - return store.dispatch(actions.removeTable(table)).then(() => { + return store.dispatch(actions.removeTables([table])).then(() => { expect(store.getActions()).toEqual(expectedActions); expect(fetchMock.calls(updateTableSchemaEndpoint)).toHaveLength(1); }); }); + + it('deletes multiple tables and updates the table schema state in the backend', () => { + expect.assertions(2); + + const tables = [{ id: 1 }, { id: 2 }]; + const store = mockStore({}); + const expectedActions = [ + { + type: actions.REMOVE_TABLES, + tables, + }, + ]; + return store.dispatch(actions.removeTables(tables)).then(() => { + expect(store.getActions()).toEqual(expectedActions); + expect(fetchMock.calls(updateTableSchemaEndpoint)).toHaveLength(2); + }); + }); }); describe('migrateQueryEditorFromLocalStorage', () => { diff --git a/superset-frontend/src/SqlLab/components/AceEditorWrapper/AceEditorWrapper.test.tsx b/superset-frontend/src/SqlLab/components/AceEditorWrapper/AceEditorWrapper.test.tsx new file mode 100644 index 000000000000..7638003e9025 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/AceEditorWrapper/AceEditorWrapper.test.tsx @@ -0,0 +1,98 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import configureStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import { render, waitFor } from 'spec/helpers/testing-library'; +import { QueryEditor } from 'src/SqlLab/types'; +import { Store } from 'redux'; +import { initialState, defaultQueryEditor } from 'src/SqlLab/fixtures'; +import AceEditorWrapper from 'src/SqlLab/components/AceEditorWrapper'; +import { AsyncAceEditorProps } from 'src/components/AsyncAceEditor'; + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); + +jest.mock('src/components/DeprecatedSelect', () => () => ( + <div data-test="mock-deprecated-select" /> +)); +jest.mock('src/components/Select/Select', () => () => ( + <div data-test="mock-deprecated-select-select" /> +)); +jest.mock('src/components/Select/AsyncSelect', () => () => ( + <div data-test="mock-deprecated-async-select" /> +)); + +jest.mock('src/components/AsyncAceEditor', () => ({ + FullSQLEditor: (props: AsyncAceEditorProps) => ( + <div data-test="react-ace">{JSON.stringify(props)}</div> + ), +})); + +const setup = (queryEditor: QueryEditor, store?: Store) => + render( + <AceEditorWrapper + queryEditorId={queryEditor.id} + height="100px" + hotkeys={[]} + database={{}} + onChange={jest.fn()} + onBlur={jest.fn()} + autocomplete + />, + { + useRedux: true, + ...(store && { store }), + }, + ); + +describe('AceEditorWrapper', () => { + it('renders ace editor including sql value', async () => { + const { getByTestId } = setup(defaultQueryEditor, mockStore(initialState)); + await waitFor(() => expect(getByTestId('react-ace')).toBeInTheDocument()); + + expect(getByTestId('react-ace')).toHaveTextContent( + JSON.stringify({ value: defaultQueryEditor.sql }).slice(1, -1), + ); + }); + + it('renders current sql for unrelated unsaved changes', () => { + const expectedSql = 'SELECT updated_column\nFROM updated_table\nWHERE'; + const { getByTestId } = setup( + defaultQueryEditor, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: `${defaultQueryEditor.id}-other`, + sql: expectedSql, + }, + }, + }), + ); + + expect(getByTestId('react-ace')).not.toHaveTextContent( + JSON.stringify({ value: expectedSql }).slice(1, -1), + ); + expect(getByTestId('react-ace')).toHaveTextContent( + JSON.stringify({ value: defaultQueryEditor.sql }).slice(1, -1), + ); + }); +}); diff --git a/superset-frontend/src/SqlLab/components/AceEditorWrapper/index.tsx b/superset-frontend/src/SqlLab/components/AceEditorWrapper/index.tsx index 53ec3f808a62..0dd3385ea57e 100644 --- a/superset-frontend/src/SqlLab/components/AceEditorWrapper/index.tsx +++ b/superset-frontend/src/SqlLab/components/AceEditorWrapper/index.tsx @@ -16,9 +16,18 @@ * specific language governing permissions and limitations * under the License. */ -import React from 'react'; +import React, { useState, useEffect, useRef } from 'react'; +import { useDispatch } from 'react-redux'; +import { css, styled } from '@superset-ui/core'; + +import { usePrevious } from 'src/hooks/usePrevious'; import { areArraysShallowEqual } from 'src/reduxUtils'; import sqlKeywords from 'src/SqlLab/utils/sqlKeywords'; +import { + queryEditorSetSelectedText, + queryEditorSetFunctionNames, + addTable, +} from 'src/SqlLab/actions/sqlLab'; import { SCHEMA_AUTOCOMPLETE_SCORE, TABLE_AUTOCOMPLETE_SCORE, @@ -30,7 +39,7 @@ import { AceCompleterKeyword, FullSQLEditor as AceEditor, } from 'src/components/AsyncAceEditor'; -import { QueryEditor } from 'src/SqlLab/types'; +import useQueryEditor from 'src/SqlLab/hooks/useQueryEditor'; type HotKey = { key: string; @@ -39,109 +48,123 @@ type HotKey = { func: () => void; }; -interface Props { - actions: { - queryEditorSetSelectedText: (edit: any, text: null | string) => void; - queryEditorSetFunctionNames: (queryEditor: object, dbId: number) => void; - addTable: ( - queryEditor: any, - database: any, - value: any, - schema: any, - ) => void; - }; +type AceEditorWrapperProps = { autocomplete: boolean; onBlur: (sql: string) => void; - sql: string; + onChange: (sql: string) => void; + queryEditorId: string; database: any; - schemas: any[]; - tables: any[]; - functionNames: string[]; - extendedTables: Array<{ name: string; columns: any[] }>; - queryEditor: QueryEditor; + extendedTables?: Array<{ name: string; columns: any[] }>; height: string; hotkeys: HotKey[]; - onChange: (sql: string) => void; -} - -interface State { - sql: string; - words: AceCompleterKeyword[]; -} - -class AceEditorWrapper extends React.PureComponent<Props, State> { - static defaultProps = { - onBlur: () => {}, - onChange: () => {}, - schemas: [], - tables: [], - functionNames: [], - extendedTables: [], - }; +}; - private currentSelectionCache; +const StyledAceEditor = styled(AceEditor)` + ${({ theme }) => css` + && { + // double class is better than !important + border: 1px solid ${theme.colors.grayscale.light2}; + font-feature-settings: 'liga' off, 'calt' off; + // Fira Code causes problem with Ace under Firefox + font-family: 'Menlo', 'Consolas', 'Courier New', 'Ubuntu Mono', + 'source-code-pro', 'Lucida Console', monospace; - constructor(props: Props) { - super(props); - this.state = { - sql: props.sql, - words: [], - }; + &.ace_autocomplete { + // Use !important because Ace Editor applies extra CSS at the last second + // when opening the autocomplete. + width: ${theme.gridUnit * 130}px !important; + } + + .ace_scroller { + background-color: ${theme.colors.grayscale.light4}; + } + } + `} +`; +const AceEditorWrapper = ({ + autocomplete, + onBlur = () => {}, + onChange = () => {}, + queryEditorId, + database, + extendedTables = [], + height, + hotkeys, +}: AceEditorWrapperProps) => { + const dispatch = useDispatch(); + + const queryEditor = useQueryEditor(queryEditorId, [ + 'id', + 'dbId', + 'sql', + 'functionNames', + 'schemaOptions', + 'tableOptions', + 'validationResult', + 'schema', + ]); + const currentSql = queryEditor.sql ?? ''; + const functionNames = queryEditor.functionNames ?? []; + const schemas = queryEditor.schemaOptions ?? []; + const tables = queryEditor.tableOptions ?? []; - // The editor changeSelection is called multiple times in a row, - // faster than React reconciliation process, so the selected text - // needs to be stored out of the state to ensure changes to it - // get saved immediately - this.currentSelectionCache = ''; - this.onChange = this.onChange.bind(this); - } + const [sql, setSql] = useState(currentSql); + const [words, setWords] = useState<AceCompleterKeyword[]>([]); - componentDidMount() { + // The editor changeSelection is called multiple times in a row, + // faster than React reconciliation process, so the selected text + // needs to be stored out of the state to ensure changes to it + // get saved immediately + const currentSelectionCache = useRef(''); + + useEffect(() => { // Making sure no text is selected from previous mount - this.props.actions.queryEditorSetSelectedText(this.props.queryEditor, null); - if (this.props.queryEditor.dbId) { - this.props.actions.queryEditorSetFunctionNames( - this.props.queryEditor, - this.props.queryEditor.dbId, - ); + dispatch(queryEditorSetSelectedText(queryEditor, null)); + if (queryEditor.dbId) { + dispatch(queryEditorSetFunctionNames(queryEditor, queryEditor.dbId)); } - this.setAutoCompleter(this.props); - } + setAutoCompleter(); + }, []); + + const prevTables = usePrevious(tables) ?? []; + const prevSchemas = usePrevious(schemas) ?? []; + const prevExtendedTables = usePrevious(extendedTables) ?? []; + const prevSql = usePrevious(currentSql); - UNSAFE_componentWillReceiveProps(nextProps: Props) { + useEffect(() => { if ( - !areArraysShallowEqual(this.props.tables, nextProps.tables) || - !areArraysShallowEqual(this.props.schemas, nextProps.schemas) || - !areArraysShallowEqual( - this.props.extendedTables, - nextProps.extendedTables, - ) + !areArraysShallowEqual(tables, prevTables) || + !areArraysShallowEqual(schemas, prevSchemas) || + !areArraysShallowEqual(extendedTables, prevExtendedTables) ) { - this.setAutoCompleter(nextProps); + setAutoCompleter(); } - if (nextProps.sql !== this.props.sql) { - this.setState({ sql: nextProps.sql }); + }, [tables, schemas, extendedTables]); + + useEffect(() => { + if (currentSql !== prevSql) { + setSql(currentSql); } - } + }, [currentSql]); - onBlur() { - this.props.onBlur(this.state.sql); - } + const onBlurSql = () => { + onBlur(sql); + }; - onAltEnter() { - this.props.onBlur(this.state.sql); - } + const onAltEnter = () => { + onBlur(sql); + }; - onEditorLoad(editor: any) { + const onEditorLoad = (editor: any) => { editor.commands.addCommand({ name: 'runQuery', bindKey: { win: 'Alt-enter', mac: 'Alt-enter' }, exec: () => { - this.onAltEnter(); + onAltEnter(); }, }); - this.props.hotkeys.forEach(keyConfig => { + hotkeys.forEach(keyConfig => { editor.commands.addCommand({ name: keyConfig.name, bindKey: { win: keyConfig.key, mac: keyConfig.key }, @@ -155,27 +178,23 @@ class AceEditorWrapper extends React.PureComponent<Props, State> { // Backspace trigger 1 character selection, ignoring if ( - selectedText !== this.currentSelectionCache && + selectedText !== currentSelectionCache.current && selectedText.length !== 1 ) { - this.props.actions.queryEditorSetSelectedText( - this.props.queryEditor, - selectedText, - ); + dispatch(queryEditorSetSelectedText(queryEditor, selectedText)); } - this.currentSelectionCache = selectedText; + currentSelectionCache.current = selectedText; }); - } + }; - onChange(text: string) { - this.setState({ sql: text }); - this.props.onChange(text); - } + const onChangeText = (text: string) => { + setSql(text); + onChange(text); + }; - setAutoCompleter(props: Props) { + const setAutoCompleter = () => { // Loading schema, table and column names as auto-completable words - const schemas = props.schemas || []; const schemaWords = schemas.map(s => ({ name: s.label, value: s.value, @@ -184,13 +203,10 @@ class AceEditorWrapper extends React.PureComponent<Props, State> { })); const columns = {}; - const tables = props.tables || []; - const extendedTables = props.extendedTables || []; - const tableWords = tables.map(t => { const tableName = t.value; const extendedTable = extendedTables.find(et => et.name === tableName); - const cols = (extendedTable && extendedTable.columns) || []; + const cols = extendedTable?.columns || []; cols.forEach(col => { columns[col.name] = null; // using an object as a unique set }); @@ -210,7 +226,7 @@ class AceEditorWrapper extends React.PureComponent<Props, State> { meta: 'column', })); - const functionWords = props.functionNames.map(func => ({ + const functionWords = functionNames.map(func => ({ name: func, value: func, score: SQL_FUNCTIONS_AUTOCOMPLETE_SCORE, @@ -220,11 +236,8 @@ class AceEditorWrapper extends React.PureComponent<Props, State> { const completer = { insertMatch: (editor: Editor, data: any) => { if (data.meta === 'table') { - this.props.actions.addTable( - this.props.queryEditor, - this.props.database, - data.value, - this.props.queryEditor.schema, + dispatch( + addTable(queryEditor, database, data.value, queryEditor.schema), ); } @@ -250,11 +263,11 @@ class AceEditorWrapper extends React.PureComponent<Props, State> { completer, })); - this.setState({ words }); - } + setWords(words); + }; - getAceAnnotations() { - const { validationResult } = this.props.queryEditor; + const getAceAnnotations = () => { + const { validationResult } = queryEditor; const resultIsReady = validationResult?.completed; if (resultIsReady && validationResult?.errors?.length) { const errors = validationResult.errors.map((err: any) => ({ @@ -266,24 +279,22 @@ class AceEditorWrapper extends React.PureComponent<Props, State> { return errors; } return []; - } - - render() { - return ( - <AceEditor - keywords={this.state.words} - onLoad={this.onEditorLoad.bind(this)} - onBlur={this.onBlur.bind(this)} - height={this.props.height} - onChange={this.onChange} - width="100%" - editorProps={{ $blockScrolling: true }} - enableLiveAutocompletion={this.props.autocomplete} - value={this.state.sql} - annotations={this.getAceAnnotations()} - /> - ); - } -} + }; + + return ( + <StyledAceEditor + keywords={words} + onLoad={onEditorLoad} + onBlur={onBlurSql} + height={height} + onChange={onChangeText} + width="100%" + editorProps={{ $blockScrolling: true }} + enableLiveAutocompletion={autocomplete} + value={sql} + annotations={getAceAnnotations()} + /> + ); +}; export default AceEditorWrapper; diff --git a/superset-frontend/src/SqlLab/components/App/App.test.jsx b/superset-frontend/src/SqlLab/components/App/App.test.jsx index 0629de27d5d6..c06262915637 100644 --- a/superset-frontend/src/SqlLab/components/App/App.test.jsx +++ b/superset-frontend/src/SqlLab/components/App/App.test.jsx @@ -19,21 +19,29 @@ import React from 'react'; import configureStore from 'redux-mock-store'; import thunk from 'redux-thunk'; - -import { shallow } from 'enzyme'; +import { render } from 'spec/helpers/testing-library'; import App from 'src/SqlLab/components/App'; -import TabbedSqlEditors from 'src/SqlLab/components/TabbedSqlEditors'; import sqlLabReducer from 'src/SqlLab/reducers/index'; +import { LOCALSTORAGE_MAX_USAGE_KB } from 'src/SqlLab/constants'; +import { LOG_EVENT } from 'src/logger/actions'; + +jest.mock('src/SqlLab/components/TabbedSqlEditors', () => () => ( + <div data-test="mock-tabbed-sql-editors" /> +)); +jest.mock('src/SqlLab/components/QueryAutoRefresh', () => () => ( + <div data-test="mock-query-auto-refresh" /> +)); describe('SqlLab App', () => { const middlewares = [thunk]; const mockStore = configureStore(middlewares); const store = mockStore(sqlLabReducer(undefined, {}), {}); - let wrapper; - beforeEach(() => { - wrapper = shallow(<App store={store} />).dive(); + jest.useFakeTimers(); + }); + afterEach(() => { + jest.useRealTimers(); }); it('is valid', () => { @@ -41,8 +49,31 @@ describe('SqlLab App', () => { }); it('should render', () => { - const inner = wrapper.dive(); - expect(inner.find('.SqlLab')).toHaveLength(1); - expect(inner.find(TabbedSqlEditors)).toHaveLength(1); + const { getByTestId } = render(<App />, { useRedux: true, store }); + expect(getByTestId('SqlLabApp')).toBeInTheDocument(); + expect(getByTestId('mock-tabbed-sql-editors')).toBeInTheDocument(); + }); + + it('logs current usage warning', async () => { + const localStorageUsageInKilobytes = LOCALSTORAGE_MAX_USAGE_KB + 10; + const storeExceedLocalStorage = mockStore( + sqlLabReducer( + { + localStorageUsageInKilobytes, + }, + {}, + ), + ); + + const { rerender } = render(<App />, { + useRedux: true, + store: storeExceedLocalStorage, + }); + rerender(<App updated />); + expect(storeExceedLocalStorage.getActions()).toContainEqual( + expect.objectContaining({ + type: LOG_EVENT, + }), + ); }); }); diff --git a/superset-frontend/src/SqlLab/components/App/index.jsx b/superset-frontend/src/SqlLab/components/App/index.jsx index 8a0ade9509ac..4689f8ec2191 100644 --- a/superset-frontend/src/SqlLab/components/App/index.jsx +++ b/superset-frontend/src/SqlLab/components/App/index.jsx @@ -20,7 +20,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { t } from '@superset-ui/core'; +import { css, styled, t } from '@superset-ui/core'; import throttle from 'lodash/throttle'; import ToastContainer from 'src/components/MessageToasts/ToastContainer'; import { @@ -29,9 +29,74 @@ import { LOCALSTORAGE_WARNING_MESSAGE_THROTTLE_MS, } from 'src/SqlLab/constants'; import * as Actions from 'src/SqlLab/actions/sqlLab'; +import { logEvent } from 'src/logger/actions'; +import { LOG_ACTIONS_SQLLAB_WARN_LOCAL_STORAGE_USAGE } from 'src/logger/LogUtils'; import TabbedSqlEditors from '../TabbedSqlEditors'; import QueryAutoRefresh from '../QueryAutoRefresh'; +const SqlLabStyles = styled.div` + ${({ theme }) => css` + &.SqlLab { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0 ${theme.gridUnit * 2}px; + + pre { + padding: 0 !important; + margin: 0; + border: none; + font-size: ${theme.typography.sizes.s}px; + background: transparent !important; + } + + .north-pane { + display: flex; + flex-direction: column; + } + + .ace_editor { + flex-grow: 1; + } + + .ace_content { + height: 100%; + } + + .ant-tabs-content-holder { + /* This is needed for Safari */ + height: 100%; + } + + .ant-tabs-content { + height: 100%; + position: relative; + background-color: ${theme.colors.grayscale.light5}; + overflow-x: auto; + overflow-y: auto; + + > .ant-tabs-tabpane { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + } + } + + .ResultsModal .ant-modal-body { + min-height: ${theme.gridUnit * 140}px; + } + + .ant-modal-body { + overflow: auto; + } + } + `}; +`; + class App extends React.PureComponent { constructor(props) { super(props); @@ -62,6 +127,7 @@ class App extends React.PureComponent { ) { this.showLocalStorageUsageWarning( this.props.localStorageUsageInKilobytes, + this.props.queries?.lenghth || 0, ); } } @@ -77,7 +143,7 @@ class App extends React.PureComponent { this.setState({ hash: window.location.hash }); } - showLocalStorageUsageWarning(currentUsage) { + showLocalStorageUsageWarning(currentUsage, queryCount) { this.props.actions.addDangerToast( t( "SQL Lab uses your browser's local storage to store queries and results." + @@ -91,18 +157,31 @@ class App extends React.PureComponent { }, ), ); + const eventData = { + current_usage: currentUsage, + query_count: queryCount, + }; + this.props.actions.logEvent( + LOG_ACTIONS_SQLLAB_WARN_LOCAL_STORAGE_USAGE, + eventData, + ); } render() { + const { queries, actions, queriesLastUpdate } = this.props; if (this.state.hash && this.state.hash === '#search') { return window.location.replace('/superset/sqllab/history/'); } return ( - <div className="App SqlLab"> - <QueryAutoRefresh /> + <SqlLabStyles data-test="SqlLabApp" className="App SqlLab"> + <QueryAutoRefresh + queries={queries} + refreshQueries={actions?.refreshQueries} + queriesLastUpdate={queriesLastUpdate} + /> <TabbedSqlEditors /> <ToastContainer /> - </div> + </SqlLabStyles> ); } } @@ -114,16 +193,18 @@ App.propTypes = { }; function mapStateToProps(state) { - const { common, localStorageUsageInKilobytes } = state; + const { common, localStorageUsageInKilobytes, sqlLab } = state; return { common, localStorageUsageInKilobytes, + queries: sqlLab?.queries, + queriesLastUpdate: sqlLab?.queriesLastUpdate, }; } function mapDispatchToProps(dispatch) { return { - actions: bindActionCreators(Actions, dispatch), + actions: bindActionCreators({ ...Actions, logEvent }, dispatch), }; } diff --git a/superset-frontend/src/SqlLab/components/ColumnElement/index.tsx b/superset-frontend/src/SqlLab/components/ColumnElement/index.tsx index 481c1067f13f..2b341b0bd17e 100644 --- a/superset-frontend/src/SqlLab/components/ColumnElement/index.tsx +++ b/superset-frontend/src/SqlLab/components/ColumnElement/index.tsx @@ -18,7 +18,7 @@ */ import React from 'react'; import { ClassNames } from '@emotion/react'; -import { styled, useTheme } from '@superset-ui/core'; +import { styled, useTheme, t } from '@superset-ui/core'; import { Tooltip } from 'src/components/Tooltip'; const StyledTooltip = (props: any) => { @@ -60,9 +60,9 @@ const iconMap = { }; const tooltipTitleMap = { - pk: 'Primary key', - fk: 'Foreign key', - index: 'Index', + pk: t('Primary key'), + fk: t('Foreign key'), + index: t('Index'), }; export type ColumnKeyTypeType = keyof typeof tooltipTitleMap; diff --git a/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/EstimateQueryCostButton.test.tsx b/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/EstimateQueryCostButton.test.tsx new file mode 100644 index 000000000000..5b2cae174166 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/EstimateQueryCostButton.test.tsx @@ -0,0 +1,93 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import configureStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import { render } from 'spec/helpers/testing-library'; +import { Store } from 'redux'; +import { + initialState, + defaultQueryEditor, + extraQueryEditor1, +} from 'src/SqlLab/fixtures'; + +import EstimateQueryCostButton, { + EstimateQueryCostButtonProps, +} from 'src/SqlLab/components/EstimateQueryCostButton'; + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); + +jest.mock('src/components/DeprecatedSelect', () => () => ( + <div data-test="mock-deprecated-select" /> +)); +jest.mock('src/components/Select/Select', () => () => ( + <div data-test="mock-deprecated-select-select" /> +)); +jest.mock('src/components/Select/AsyncSelect', () => () => ( + <div data-test="mock-deprecated-async-select" /> +)); + +const setup = (props: Partial<EstimateQueryCostButtonProps>, store?: Store) => + render( + <EstimateQueryCostButton + queryEditorId={defaultQueryEditor.id} + getEstimate={jest.fn()} + {...props} + />, + { + useRedux: true, + ...(store && { store }), + }, + ); + +describe('EstimateQueryCostButton', () => { + it('renders EstimateQueryCostButton', async () => { + const { queryByText } = setup({}, mockStore(initialState)); + + expect(queryByText('Estimate cost')).toBeTruthy(); + }); + + it('renders label for selected query', async () => { + const { queryByText } = setup( + { queryEditorId: extraQueryEditor1.id }, + mockStore(initialState), + ); + + expect(queryByText('Estimate selected query cost')).toBeTruthy(); + }); + + it('renders label for selected query from unsaved', async () => { + const { queryByText } = setup( + {}, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + selectedText: 'SELECT', + }, + }, + }), + ); + + expect(queryByText('Estimate selected query cost')).toBeTruthy(); + }); +}); diff --git a/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx b/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx index d7f2d7dd6dd4..4dd5c489582a 100644 --- a/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx +++ b/superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx @@ -17,30 +17,44 @@ * under the License. */ import React, { useMemo } from 'react'; +import { useSelector } from 'react-redux'; +import { css, styled, t } from '@superset-ui/core'; + import Alert from 'src/components/Alert'; -import { t } from '@superset-ui/core'; import TableView from 'src/components/TableView'; import Button from 'src/components/Button'; import Loading from 'src/components/Loading'; import ModalTrigger from 'src/components/ModalTrigger'; import { EmptyWrapperType } from 'src/components/TableView/TableView'; +import useQueryEditor from 'src/SqlLab/hooks/useQueryEditor'; +import { SqlLabRootState, QueryCostEstimate } from 'src/SqlLab/types'; -interface EstimateQueryCostButtonProps { +export interface EstimateQueryCostButtonProps { getEstimate: Function; - queryCostEstimate: Record<string, any>; - selectedText?: string; + queryEditorId: string; tooltip?: string; disabled?: boolean; } +const CostEstimateModalStyles = styled.div` + ${({ theme }) => css` + font-size: ${theme.typography.sizes.s}; + `} +`; + const EstimateQueryCostButton = ({ getEstimate, - queryCostEstimate = {}, - selectedText, + queryEditorId, tooltip = '', disabled = false, }: EstimateQueryCostButtonProps) => { - const { cost } = queryCostEstimate; + const queryCostEstimate = useSelector< + SqlLabRootState, + QueryCostEstimate | undefined + >(state => state.sqlLab.queryCostEstimates?.[queryEditorId]); + + const { selectedText } = useQueryEditor(queryEditorId, ['selectedText']); + const { cost } = queryCostEstimate || {}; const tableData = useMemo(() => (Array.isArray(cost) ? cost : []), [cost]); const columns = useMemo( () => @@ -57,24 +71,25 @@ const EstimateQueryCostButton = ({ }; const renderModalBody = () => { - if (queryCostEstimate.error !== null) { + if (queryCostEstimate?.error) { return ( <Alert key="query-estimate-error" type="error" - message={queryCostEstimate.error} + message={queryCostEstimate?.error} /> ); } - if (queryCostEstimate.completed) { + if (queryCostEstimate?.completed) { return ( - <TableView - columns={columns} - data={tableData} - withPagination={false} - emptyWrapperType={EmptyWrapperType.Small} - className="cost-estimate" - /> + <CostEstimateModalStyles> + <TableView + columns={columns} + data={tableData} + withPagination={false} + emptyWrapperType={EmptyWrapperType.Small} + /> + </CostEstimateModalStyles> ); } return <Loading position="normal" />; diff --git a/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx b/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx index fbcdc15bc5a3..a4c71139c0d3 100644 --- a/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx +++ b/superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx @@ -17,19 +17,19 @@ * under the License. */ import React from 'react'; -import { useSelector } from 'react-redux'; -import { t } from '@superset-ui/core'; +import { useSelector, useDispatch } from 'react-redux'; +import { t, JsonObject } from '@superset-ui/core'; +import { + createCtasDatasource, + addInfoToast, + addDangerToast, +} from 'src/SqlLab/actions/sqlLab'; import { InfoTooltipWithTrigger } from '@superset-ui/chart-controls'; import Button from 'src/components/Button'; import { exploreChart } from 'src/explore/exploreUtils'; import { SqlLabRootState } from 'src/SqlLab/types'; interface ExploreCtasResultsButtonProps { - actions: { - createCtasDatasource: Function; - addInfoToast: Function; - addDangerToast: Function; - }; table: string; schema?: string | null; dbId: number; @@ -37,26 +37,25 @@ interface ExploreCtasResultsButtonProps { } const ExploreCtasResultsButton = ({ - actions, table, schema, dbId, templateParams, }: ExploreCtasResultsButtonProps) => { - const { createCtasDatasource, addInfoToast, addDangerToast } = actions; const errorMessage = useSelector( (state: SqlLabRootState) => state.sqlLab.errorMessage, ); + const dispatch = useDispatch<(dispatch: any) => Promise<JsonObject>>(); const buildVizOptions = { - datasourceName: table, + table_name: table, schema, - dbId, - templateParams, + database_id: dbId, + template_params: templateParams, }; const visualize = () => { - createCtasDatasource(buildVizOptions) + dispatch(createCtasDatasource(buildVizOptions)) .then((data: { table_id: number }) => { const formData = { datasource: `${data.table_id}__table`, @@ -67,12 +66,14 @@ const ExploreCtasResultsButton = ({ all_columns: [], row_limit: 1000, }; - addInfoToast(t('Creating a data source and creating a new tab')); + dispatch( + addInfoToast(t('Creating a data source and creating a new tab')), + ); // open new window for data visualization exploreChart(formData); }) .catch(() => { - addDangerToast(errorMessage || t('An error occurred')); + dispatch(addDangerToast(errorMessage || t('An error occurred'))); }); }; @@ -85,7 +86,7 @@ const ExploreCtasResultsButton = ({ <InfoTooltipWithTrigger icon="line-chart" placement="top" - label="explore" + label={t('explore')} />{' '} {t('Explore')} </Button> diff --git a/superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx b/superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx index 24d5e8686f71..b3ee748218e6 100644 --- a/superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx +++ b/superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx @@ -39,11 +39,12 @@ const ExploreResultsButton = ({ onClick={onClick} disabled={!allowsSubquery} tooltip={t('Explore the result set in the data exploration view')} + data-test="explore-results-button" > <InfoTooltipWithTrigger icon="line-chart" placement="top" - label="explore" + label={t('explore')} />{' '} {t('Create Chart')} </Button> diff --git a/superset-frontend/src/SqlLab/components/QueryAutoRefresh/QueryAutoRefresh.test.jsx b/superset-frontend/src/SqlLab/components/QueryAutoRefresh/QueryAutoRefresh.test.jsx deleted file mode 100644 index 06bf187e1185..000000000000 --- a/superset-frontend/src/SqlLab/components/QueryAutoRefresh/QueryAutoRefresh.test.jsx +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import { shallow } from 'enzyme'; -import sinon from 'sinon'; -import thunk from 'redux-thunk'; -import configureStore from 'redux-mock-store'; -import QueryAutoRefresh from 'src/SqlLab/components/QueryAutoRefresh'; -import { initialState, runningQuery } from 'src/SqlLab/fixtures'; - -describe('QueryAutoRefresh', () => { - const middlewares = [thunk]; - const mockStore = configureStore(middlewares); - const sqlLab = { - ...initialState.sqlLab, - queries: { - ryhMUZCGb: runningQuery, - }, - }; - const state = { - ...initialState, - sqlLab, - }; - const store = mockStore(state); - const getWrapper = () => - shallow(<QueryAutoRefresh store={store} />) - .dive() - .dive(); - let wrapper; - - it('shouldCheckForQueries', () => { - wrapper = getWrapper(); - expect(wrapper.instance().shouldCheckForQueries()).toBe(true); - }); - - it('setUserOffline', () => { - wrapper = getWrapper(); - const spy = sinon.spy(wrapper.instance().props.actions, 'setUserOffline'); - - // state not changed - wrapper.setState({ - offline: false, - }); - expect(spy.called).toBe(false); - - // state is changed - wrapper.setState({ - offline: true, - }); - expect(spy.callCount).toBe(1); - }); -}); diff --git a/superset-frontend/src/SqlLab/components/QueryAutoRefresh/QueryAutoRefresh.test.tsx b/superset-frontend/src/SqlLab/components/QueryAutoRefresh/QueryAutoRefresh.test.tsx new file mode 100644 index 000000000000..32bf401f2213 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/QueryAutoRefresh/QueryAutoRefresh.test.tsx @@ -0,0 +1,133 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render } from '@testing-library/react'; +import QueryAutoRefresh, { + isQueryRunning, + shouldCheckForQueries, +} from 'src/SqlLab/components/QueryAutoRefresh'; +import { successfulQuery, runningQuery } from 'src/SqlLab/fixtures'; +import { QueryDictionary } from 'src/SqlLab/types'; + +// NOTE: The uses of @ts-ignore in this file is to enable testing of bad inputs to verify the +// function / component handles bad data elegantly +describe('QueryAutoRefresh', () => { + const runningQueries: QueryDictionary = {}; + runningQueries[runningQuery.id] = runningQuery; + + const successfulQueries: QueryDictionary = {}; + successfulQueries[successfulQuery.id] = successfulQuery; + + const refreshQueries = jest.fn(); + + const queriesLastUpdate = Date.now(); + + it('isQueryRunning returns true for valid running query', () => { + const running = isQueryRunning(runningQuery); + expect(running).toBe(true); + }); + + it('isQueryRunning returns false for valid not-running query', () => { + const running = isQueryRunning(successfulQuery); + expect(running).toBe(false); + }); + + it('isQueryRunning returns false for invalid query', () => { + // @ts-ignore + let running = isQueryRunning(null); + expect(running).toBe(false); + // @ts-ignore + running = isQueryRunning(undefined); + expect(running).toBe(false); + // @ts-ignore + running = isQueryRunning('I Should Be An Object'); + expect(running).toBe(false); + // @ts-ignore + running = isQueryRunning({ state: { badFormat: true } }); + expect(running).toBe(false); + }); + + it('shouldCheckForQueries is true for valid running query', () => { + expect(shouldCheckForQueries(runningQueries)).toBe(true); + }); + + it('shouldCheckForQueries is false for valid completed query', () => { + expect(shouldCheckForQueries(successfulQueries)).toBe(false); + }); + + it('shouldCheckForQueries is false for invalid inputs', () => { + // @ts-ignore + expect(shouldCheckForQueries(null)).toBe(false); + // @ts-ignore + expect(shouldCheckForQueries(undefined)).toBe(false); + expect( + // @ts-ignore + shouldCheckForQueries({ + // @ts-ignore + '1234': null, + // @ts-ignore + '23425': 'hello world', + // @ts-ignore + '345': [], + // @ts-ignore + '57346': undefined, + }), + ).toBe(false); + }); + + it('Attempts to refresh when given pending query', () => { + render( + <QueryAutoRefresh + queries={runningQueries} + refreshQueries={refreshQueries} + queriesLastUpdate={queriesLastUpdate} + />, + ); + setTimeout(() => { + expect(refreshQueries).toHaveBeenCalled(); + }, 1000); + }); + + it('Does not fail and attempts to refresh when given pending query and invlaid query', () => { + render( + <QueryAutoRefresh + // @ts-ignore + queries={{ ...runningQueries, g324t: null }} + refreshQueries={refreshQueries} + queriesLastUpdate={queriesLastUpdate} + />, + ); + setTimeout(() => { + expect(refreshQueries).toHaveBeenCalled(); + }, 1000); + }); + + it('Does NOT Attempt to refresh when given only completed queries', () => { + render( + <QueryAutoRefresh + queries={successfulQueries} + refreshQueries={refreshQueries} + queriesLastUpdate={queriesLastUpdate} + />, + ); + setTimeout(() => { + expect(refreshQueries).not.toHaveBeenCalled(); + }, 1000); + }); +}); diff --git a/superset-frontend/src/SqlLab/components/QueryAutoRefresh/index.jsx b/superset-frontend/src/SqlLab/components/QueryAutoRefresh/index.jsx deleted file mode 100644 index b54936b691ef..000000000000 --- a/superset-frontend/src/SqlLab/components/QueryAutoRefresh/index.jsx +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import PropTypes from 'prop-types'; -import { bindActionCreators } from 'redux'; -import { connect } from 'react-redux'; -import { SupersetClient } from '@superset-ui/core'; -import * as Actions from 'src/SqlLab/actions/sqlLab'; - -const QUERY_UPDATE_FREQ = 2000; -const QUERY_UPDATE_BUFFER_MS = 5000; -const MAX_QUERY_AGE_TO_POLL = 21600000; -const QUERY_TIMEOUT_LIMIT = 10000; - -class QueryAutoRefresh extends React.PureComponent { - constructor(props) { - super(props); - this.state = { - offline: props.offline, - }; - } - - UNSAFE_componentWillMount() { - this.startTimer(); - } - - componentDidUpdate(prevProps) { - if (prevProps.offline !== this.state.offline) { - this.props.actions.setUserOffline(this.state.offline); - } - } - - componentWillUnmount() { - this.stopTimer(); - } - - shouldCheckForQueries() { - // if there are started or running queries, this method should return true - const { queries } = this.props; - const now = new Date().getTime(); - const isQueryRunning = q => - ['running', 'started', 'pending', 'fetching'].indexOf(q.state) >= 0; - - return Object.values(queries).some( - q => isQueryRunning(q) && now - q.startDttm < MAX_QUERY_AGE_TO_POLL, - ); - } - - startTimer() { - if (!this.timer) { - this.timer = setInterval(this.stopwatch.bind(this), QUERY_UPDATE_FREQ); - } - } - - stopTimer() { - clearInterval(this.timer); - this.timer = null; - } - - stopwatch() { - // only poll /superset/queries/ if there are started or running queries - if (this.shouldCheckForQueries()) { - SupersetClient.get({ - endpoint: `/superset/queries/${ - this.props.queriesLastUpdate - QUERY_UPDATE_BUFFER_MS - }`, - timeout: QUERY_TIMEOUT_LIMIT, - }) - .then(({ json }) => { - if (Object.keys(json).length > 0) { - this.props.actions.refreshQueries(json); - } - this.setState({ offline: false }); - }) - .catch(() => { - this.setState({ offline: true }); - }); - } else { - this.setState({ offline: false }); - } - } - - render() { - return null; - } -} -QueryAutoRefresh.propTypes = { - offline: PropTypes.bool.isRequired, - queries: PropTypes.object.isRequired, - actions: PropTypes.object.isRequired, - queriesLastUpdate: PropTypes.number.isRequired, -}; - -function mapStateToProps({ sqlLab }) { - return { - offline: sqlLab.offline, - queries: sqlLab.queries, - queriesLastUpdate: sqlLab.queriesLastUpdate, - }; -} - -function mapDispatchToProps(dispatch) { - return { - actions: bindActionCreators(Actions, dispatch), - }; -} - -export default connect(mapStateToProps, mapDispatchToProps)(QueryAutoRefresh); diff --git a/superset-frontend/src/SqlLab/components/QueryAutoRefresh/index.tsx b/superset-frontend/src/SqlLab/components/QueryAutoRefresh/index.tsx new file mode 100644 index 000000000000..2d01e724e247 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/QueryAutoRefresh/index.tsx @@ -0,0 +1,110 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { useState } from 'react'; +import { isObject } from 'lodash'; +import rison from 'rison'; +import { + SupersetClient, + Query, + runningQueryStateList, + QueryResponse, +} from '@superset-ui/core'; +import { QueryDictionary } from 'src/SqlLab/types'; +import useInterval from 'src/SqlLab/utils/useInterval'; + +const QUERY_UPDATE_FREQ = 2000; +const QUERY_UPDATE_BUFFER_MS = 5000; +const MAX_QUERY_AGE_TO_POLL = 21600000; +const QUERY_TIMEOUT_LIMIT = 10000; + +interface RefreshQueriesFunc { + (alteredQueries: any): any; +} + +export interface QueryAutoRefreshProps { + queries: QueryDictionary; + refreshQueries: RefreshQueriesFunc; + queriesLastUpdate: number; +} + +// returns true if the Query.state matches one of the specifc values indicating the query is still processing on server +export const isQueryRunning = (q: Query): boolean => + runningQueryStateList.includes(q?.state); + +// returns true if at least one query is running and within the max age to poll timeframe +export const shouldCheckForQueries = (queryList: QueryDictionary): boolean => { + let shouldCheck = false; + const now = Date.now(); + if (isObject(queryList)) { + shouldCheck = Object.values(queryList).some( + q => isQueryRunning(q) && now - q?.startDttm < MAX_QUERY_AGE_TO_POLL, + ); + } + return shouldCheck; +}; + +function QueryAutoRefresh({ + queries, + refreshQueries, + queriesLastUpdate, +}: QueryAutoRefreshProps) { + // We do not want to spam requests in the case of slow connections and potentially receive responses out of order + // pendingRequest check ensures we only have one active http call to check for query statuses + const [pendingRequest, setPendingRequest] = useState(false); + + const checkForRefresh = () => { + if (!pendingRequest && shouldCheckForQueries(queries)) { + const params = rison.encode({ + last_updated_ms: queriesLastUpdate - QUERY_UPDATE_BUFFER_MS, + }); + + setPendingRequest(true); + SupersetClient.get({ + endpoint: `/api/v1/query/updated_since?q=${params}`, + timeout: QUERY_TIMEOUT_LIMIT, + }) + .then(({ json }) => { + if (json) { + const jsonPayload = json as { result?: QueryResponse[] }; + const queries = + jsonPayload?.result?.reduce((acc, current) => { + acc[current.id] = current; + return acc; + }, {}) ?? {}; + refreshQueries?.(queries); + } + }) + .catch(() => {}) + .finally(() => { + setPendingRequest(false); + }); + } + }; + + // Solves issue where direct usage of setInterval in function components + // uses stale props / state from closure + // See comments in the useInterval.ts file for more information + useInterval(() => { + checkForRefresh(); + }, QUERY_UPDATE_FREQ); + + return null; +} + +export default QueryAutoRefresh; diff --git a/superset-frontend/src/SqlLab/components/QueryHistory/QueryHistory.test.tsx b/superset-frontend/src/SqlLab/components/QueryHistory/QueryHistory.test.tsx index 8d25fca91012..6fd84a0d2a29 100644 --- a/superset-frontend/src/SqlLab/components/QueryHistory/QueryHistory.test.tsx +++ b/superset-frontend/src/SqlLab/components/QueryHistory/QueryHistory.test.tsx @@ -20,16 +20,8 @@ import React from 'react'; import { render, screen } from 'spec/helpers/testing-library'; import QueryHistory from 'src/SqlLab/components/QueryHistory'; -const NOOP = () => {}; const mockedProps = { queries: [], - actions: { - queryEditorSetAndSaveSql: NOOP, - cloneQueryToNewTab: NOOP, - fetchQueryResults: NOOP, - clearQueryResults: NOOP, - removeQuery: NOOP, - }, displayLimit: 1000, latestQueryId: 'yhMUZCGb', }; diff --git a/superset-frontend/src/SqlLab/components/QueryHistory/index.tsx b/superset-frontend/src/SqlLab/components/QueryHistory/index.tsx index 86f28069209d..cab1160144a3 100644 --- a/superset-frontend/src/SqlLab/components/QueryHistory/index.tsx +++ b/superset-frontend/src/SqlLab/components/QueryHistory/index.tsx @@ -23,13 +23,6 @@ import QueryTable from 'src/SqlLab/components/QueryTable'; interface QueryHistoryProps { queries: QueryResponse[]; - actions: { - queryEditorSetAndSaveSql: Function; - cloneQueryToNewTab: Function; - fetchQueryResults: Function; - clearQueryResults: Function; - removeQuery: Function; - }; displayLimit: number; latestQueryId: string | undefined; } @@ -47,7 +40,6 @@ const StyledEmptyStateWrapper = styled.div` const QueryHistory = ({ queries, - actions, displayLimit, latestQueryId, }: QueryHistoryProps) => @@ -64,7 +56,6 @@ const QueryHistory = ({ 'actions', ]} queries={queries} - actions={actions} displayLimit={displayLimit} latestQueryId={latestQueryId} /> diff --git a/superset-frontend/src/SqlLab/components/QueryLimitSelect/QueryLimitSelect.test.tsx b/superset-frontend/src/SqlLab/components/QueryLimitSelect/QueryLimitSelect.test.tsx new file mode 100644 index 000000000000..adf0780e3204 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/QueryLimitSelect/QueryLimitSelect.test.tsx @@ -0,0 +1,144 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import configureStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import { Store } from 'redux'; + +import { render, fireEvent, waitFor } from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; +import { initialState, defaultQueryEditor } from 'src/SqlLab/fixtures'; +import QueryLimitSelect, { + LIMIT_DROPDOWN, + QueryLimitSelectProps, + convertToNumWithSpaces, +} from 'src/SqlLab/components/QueryLimitSelect'; + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); + +jest.mock('src/components/DeprecatedSelect', () => () => ( + <div data-test="mock-deprecated-select" /> +)); +jest.mock('src/components/Select/Select', () => () => ( + <div data-test="mock-deprecated-select-select" /> +)); +jest.mock('src/components/Select/AsyncSelect', () => () => ( + <div data-test="mock-deprecated-async-select" /> +)); + +const defaultQueryLimit = 100; + +const setup = (props?: Partial<QueryLimitSelectProps>, store?: Store) => + render( + <QueryLimitSelect + queryEditorId={defaultQueryEditor.id} + maxRow={100000} + defaultQueryLimit={defaultQueryLimit} + {...props} + />, + { + useRedux: true, + ...(store && { store }), + }, + ); + +describe('QueryLimitSelect', () => { + it('renders current query limit size', () => { + const queryLimit = 10; + const { getByText } = setup( + { + queryEditorId: defaultQueryEditor.id, + }, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + queryEditors: [ + { + ...defaultQueryEditor, + queryLimit, + }, + ], + }, + }), + ); + expect(getByText(queryLimit)).toBeInTheDocument(); + }); + + it('renders default query limit for initial queryEditor', () => { + const { getByText } = setup({}, mockStore(initialState)); + expect(getByText(defaultQueryLimit)).toBeInTheDocument(); + }); + + it('renders queryLimit from unsavedQueryEditor', () => { + const queryLimit = 10000; + const { getByText } = setup( + {}, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + queryLimit, + }, + }, + }), + ); + expect(getByText(convertToNumWithSpaces(queryLimit))).toBeInTheDocument(); + }); + + it('renders dropdown select', async () => { + const { baseElement, getByRole } = setup({}, mockStore(initialState)); + const dropdown = baseElement.getElementsByClassName( + 'ant-dropdown-trigger', + )[0]; + + userEvent.click(dropdown); + await waitFor(() => expect(getByRole('menu')).toBeInTheDocument()); + }); + + it('dispatches QUERY_EDITOR_SET_QUERY_LIMIT action on dropdown menu click', async () => { + const store = mockStore(initialState); + const expectedIndex = 1; + const { baseElement, getAllByRole, getByRole } = setup({}, store); + const dropdown = baseElement.getElementsByClassName( + 'ant-dropdown-trigger', + )[0]; + + userEvent.click(dropdown); + await waitFor(() => expect(getByRole('menu')).toBeInTheDocument()); + + const menu = getAllByRole('menuitem')[expectedIndex]; + expect(store.getActions()).toEqual([]); + fireEvent.click(menu); + await waitFor(() => + expect(store.getActions()).toEqual([ + { + type: 'QUERY_EDITOR_SET_QUERY_LIMIT', + queryLimit: LIMIT_DROPDOWN[expectedIndex], + queryEditor: { + id: defaultQueryEditor.id, + }, + }, + ]), + ); + }); +}); diff --git a/superset-frontend/src/SqlLab/components/QueryLimitSelect/index.tsx b/superset-frontend/src/SqlLab/components/QueryLimitSelect/index.tsx new file mode 100644 index 000000000000..44e180bb274a --- /dev/null +++ b/superset-frontend/src/SqlLab/components/QueryLimitSelect/index.tsx @@ -0,0 +1,112 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { useDispatch } from 'react-redux'; +import { styled, useTheme, t } from '@superset-ui/core'; +import { AntdDropdown } from 'src/components'; +import { Menu } from 'src/components/Menu'; +import Icons from 'src/components/Icons'; +import { queryEditorSetQueryLimit } from 'src/SqlLab/actions/sqlLab'; +import useQueryEditor from 'src/SqlLab/hooks/useQueryEditor'; + +export interface QueryLimitSelectProps { + queryEditorId: string; + maxRow: number; + defaultQueryLimit: number; +} + +export const LIMIT_DROPDOWN = [10, 100, 1000, 10000, 100000]; + +export function convertToNumWithSpaces(num: number) { + return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1 '); +} + +const LimitSelectStyled = styled.span` + ${({ theme }) => ` + .ant-dropdown-trigger { + align-items: center; + color: ${theme.colors.grayscale.dark2}; + display: flex; + font-size: 12px; + margin-right: ${theme.gridUnit * 2}px; + text-decoration: none; + border: 0; + background: transparent; + span { + display: inline-block; + margin-right: ${theme.gridUnit * 2}px; + &:last-of-type: { + margin-right: ${theme.gridUnit * 4}px; + } + } + } + `} +`; + +function renderQueryLimit( + maxRow: number, + setQueryLimit: (limit: number) => void, +) { + // Adding SQL_MAX_ROW value to dropdown + LIMIT_DROPDOWN.push(maxRow); + + return ( + <Menu> + {[...new Set(LIMIT_DROPDOWN)].map(limit => ( + <Menu.Item key={`${limit}`} onClick={() => setQueryLimit(limit)}> + {/* // eslint-disable-line no-use-before-define */} + <a role="button">{convertToNumWithSpaces(limit)}</a>{' '} + </Menu.Item> + ))} + </Menu> + ); +} + +const QueryLimitSelect = ({ + queryEditorId, + maxRow, + defaultQueryLimit, +}: QueryLimitSelectProps) => { + const theme = useTheme(); + const dispatch = useDispatch(); + + const queryEditor = useQueryEditor(queryEditorId, ['id', 'queryLimit']); + const queryLimit = queryEditor.queryLimit || defaultQueryLimit; + const setQueryLimit = (updatedQueryLimit: number) => + dispatch(queryEditorSetQueryLimit(queryEditor, updatedQueryLimit)); + + return ( + <LimitSelectStyled> + <AntdDropdown + overlay={renderQueryLimit(maxRow, setQueryLimit)} + trigger={['click']} + > + <button type="button" onClick={e => e.preventDefault()}> + <span>{t('LIMIT')}:</span> + <span className="limitDropdown"> + {convertToNumWithSpaces(queryLimit)} + </span> + <Icons.TriangleDown iconColor={theme.colors.grayscale.base} /> + </button> + </AntdDropdown> + </LimitSelectStyled> + ); +}; + +export default QueryLimitSelect; diff --git a/superset-frontend/src/SqlLab/components/QuerySearch/QuerySearch.test.jsx b/superset-frontend/src/SqlLab/components/QuerySearch/QuerySearch.test.jsx deleted file mode 100644 index a1efdc06c02e..000000000000 --- a/superset-frontend/src/SqlLab/components/QuerySearch/QuerySearch.test.jsx +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import thunk from 'redux-thunk'; -import configureStore from 'redux-mock-store'; -import fetchMock from 'fetch-mock'; -import QuerySearch from 'src/SqlLab/components/QuerySearch'; -import { Provider } from 'react-redux'; -import { supersetTheme, ThemeProvider } from '@superset-ui/core'; -import { fireEvent, render, screen, act } from '@testing-library/react'; -import '@testing-library/jest-dom/extend-expect'; -import userEvent from '@testing-library/user-event'; -import { user } from 'src/SqlLab/fixtures'; - -const mockStore = configureStore([thunk]); -const store = mockStore({ - sqlLab: user, -}); - -const SEARCH_ENDPOINT = 'glob:*/superset/search_queries?*'; -const USER_ENDPOINT = 'glob:*/api/v1/query/related/user'; -const DATABASE_ENDPOINT = 'glob:*/api/v1/database/?*'; - -fetchMock.get(SEARCH_ENDPOINT, []); -fetchMock.get(USER_ENDPOINT, []); -fetchMock.get(DATABASE_ENDPOINT, []); - -describe('QuerySearch', () => { - const mockedProps = { - actions: { addDangerToast: jest.fn() }, - displayLimit: 50, - }; - - it('is valid', () => { - expect( - React.isValidElement( - <ThemeProvider theme={supersetTheme}> - <Provider store={store}> - <QuerySearch {...mockedProps} /> - </Provider> - </ThemeProvider>, - ), - ).toBe(true); - }); - - beforeEach(async () => { - // You need this await function in order to change state in the app. In fact you need it everytime you re-render. - await act(async () => { - render( - <ThemeProvider theme={supersetTheme}> - <Provider store={store}> - <QuerySearch {...mockedProps} /> - </Provider> - </ThemeProvider>, - ); - }); - }); - - it('should have three Selects', () => { - expect(screen.getByText(/28 days ago/i)).toBeInTheDocument(); - expect(screen.getByText(/now/i)).toBeInTheDocument(); - expect(screen.getByText(/success/i)).toBeInTheDocument(); - }); - - it('updates fromTime on user selects from time', () => { - const role = screen.getByText(/28 days ago/i); - fireEvent.keyDown(role, { key: 'ArrowDown', keyCode: 40 }); - userEvent.click(screen.getByText(/1 hour ago/i)); - expect(screen.getByText(/1 hour ago/i)).toBeInTheDocument(); - }); - - it('updates toTime on user selects on time', () => { - const role = screen.getByText(/now/i); - fireEvent.keyDown(role, { key: 'ArrowDown', keyCode: 40 }); - userEvent.click(screen.getByText(/1 hour ago/i)); - expect(screen.getByText(/1 hour ago/i)).toBeInTheDocument(); - }); - - it('updates status on user selects status', () => { - const role = screen.getByText(/success/i); - fireEvent.keyDown(role, { key: 'ArrowDown', keyCode: 40 }); - userEvent.click(screen.getByText(/failed/i)); - expect(screen.getByText(/failed/i)).toBeInTheDocument(); - }); - - it('should have one input for searchText', () => { - expect( - screen.getByPlaceholderText(/Query search string/i), - ).toBeInTheDocument(); - }); - - it('updates search text on user inputs search text', () => { - const search = screen.getByPlaceholderText(/Query search string/i); - userEvent.type(search, 'text'); - expect(search.value).toBe('text'); - }); - - it('should have one Button', () => { - const button = screen.getAllByRole('button'); - expect(button.length).toEqual(1); - }); - - it('should call API when search button is pressed', async () => { - fetchMock.resetHistory(); - const button = screen.getByRole('button'); - await act(async () => { - userEvent.click(button); - }); - expect(fetchMock.calls(SEARCH_ENDPOINT)).toHaveLength(1); - }); - - it('should call API when (only)enter key is pressed', async () => { - fetchMock.resetHistory(); - const search = screen.getByPlaceholderText(/Query search string/i); - await act(async () => { - userEvent.type(search, 'a'); - }); - expect(fetchMock.calls(SEARCH_ENDPOINT)).toHaveLength(0); - await act(async () => { - userEvent.type(search, '{enter}'); - }); - expect(fetchMock.calls(SEARCH_ENDPOINT)).toHaveLength(1); - }); -}); diff --git a/superset-frontend/src/SqlLab/components/QuerySearch/index.tsx b/superset-frontend/src/SqlLab/components/QuerySearch/index.tsx deleted file mode 100644 index 635603e255f1..000000000000 --- a/superset-frontend/src/SqlLab/components/QuerySearch/index.tsx +++ /dev/null @@ -1,292 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React, { useState, useEffect } from 'react'; -import Button from 'src/components/Button'; -import Select from 'src/components/Select'; -import { styled, t, SupersetClient, QueryResponse } from '@superset-ui/core'; -import { debounce } from 'lodash'; -import Loading from 'src/components/Loading'; -import { - now, - epochTimeXHoursAgo, - epochTimeXDaysAgo, - epochTimeXYearsAgo, -} from 'src/utils/dates'; -import AsyncSelect from 'src/components/AsyncSelect'; -import { STATUS_OPTIONS, TIME_OPTIONS } from 'src/SqlLab/constants'; -import QueryTable from '../QueryTable'; - -interface QuerySearchProps { - actions: { - addDangerToast: (msg: string) => void; - setDatabases: (data: Record<string, any>) => Record<string, any>; - queryEditorSetAndSaveSql: Function; - cloneQueryToNewTab: Function; - fetchQueryResults: Function; - clearQueryResults: Function; - removeQuery: Function; - }; - displayLimit: number; -} - -interface UserMutatorProps { - value: number; - text: string; -} - -interface DbMutatorProps { - id: number; - database_name: string; -} - -const TableWrapper = styled.div` - display: flex; - flex-direction: column; - flex: 1; - height: 100%; -`; - -const TableStyles = styled.div` - table { - background-color: ${({ theme }) => theme.colors.grayscale.light4}; - } - - .table > thead > tr > th { - border-bottom: ${({ theme }) => theme.gridUnit / 2}px solid - ${({ theme }) => theme.colors.grayscale.light2}; - background: ${({ theme }) => theme.colors.grayscale.light4}; - } -`; - -const StyledTableStylesContainer = styled.div` - overflow: auto; -`; -function QuerySearch({ actions, displayLimit }: QuerySearchProps) { - const [databaseId, setDatabaseId] = useState<string>(''); - const [userId, setUserId] = useState<string>(''); - const [searchText, setSearchText] = useState<string>(''); - const [from, setFrom] = useState<string>('28 days ago'); - const [to, setTo] = useState<string>('now'); - const [status, setStatus] = useState<string>('success'); - const [queriesArray, setQueriesArray] = useState<QueryResponse[]>([]); - const [queriesLoading, setQueriesLoading] = useState<boolean>(true); - - const getTimeFromSelection = (selection: string) => { - switch (selection) { - case 'now': - return now(); - case '1 hour ago': - return epochTimeXHoursAgo(1); - case '1 day ago': - return epochTimeXDaysAgo(1); - case '7 days ago': - return epochTimeXDaysAgo(7); - case '28 days ago': - return epochTimeXDaysAgo(28); - case '90 days ago': - return epochTimeXDaysAgo(90); - case '1 year ago': - return epochTimeXYearsAgo(1); - default: - return null; - } - }; - - const insertParams = (baseUrl: string, params: string[]) => { - const validParams = params.filter(function (p) { - return p !== ''; - }); - return `${baseUrl}?${validParams.join('&')}`; - }; - - const refreshQueries = async () => { - setQueriesLoading(true); - const params = [ - userId && `user_id=${userId}`, - databaseId && `database_id=${databaseId}`, - searchText && `search_text=${searchText}`, - status && `status=${status}`, - from && `from=${getTimeFromSelection(from)}`, - to && `to=${getTimeFromSelection(to)}`, - ]; - - try { - const response = await SupersetClient.get({ - endpoint: insertParams('/superset/search_queries', params), - }); - const queries = Object.values(response.json); - setQueriesArray(queries); - } catch (err) { - actions.addDangerToast(t('An error occurred when refreshing queries')); - } finally { - setQueriesLoading(false); - } - }; - useEffect(() => { - refreshQueries(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const onUserClicked = (userId: string) => { - setUserId(userId); - refreshQueries(); - }; - - const onDbClicked = (dbId: string) => { - setDatabaseId(dbId); - refreshQueries(); - }; - - const onKeyDown = (event: React.KeyboardEvent) => { - if (event.keyCode === 13) { - refreshQueries(); - } - }; - - const onChange = (e: React.ChangeEvent) => { - e.persist(); - const handleChange = debounce(e => { - setSearchText(e.target.value); - }, 200); - handleChange(e); - }; - - const userMutator = ({ result }: { result: UserMutatorProps[] }) => - result.map(({ value, text }: UserMutatorProps) => ({ - label: text, - value, - })); - - const dbMutator = ({ result }: { result: DbMutatorProps[] }) => { - const options = result.map(({ id, database_name }: DbMutatorProps) => ({ - value: id, - label: database_name, - })); - actions.setDatabases(result); - if (result.length === 0) { - actions.addDangerToast( - t("It seems you don't have access to any database"), - ); - } - return options; - }; - - return ( - <TableWrapper> - <div id="search-header" className="row space-1"> - <div className="col-sm-2"> - <AsyncSelect - dataEndpoint="api/v1/query/related/user" - mutator={userMutator} - value={userId} - onChange={(selected: any) => setUserId(selected?.value)} - placeholder={t('Filter by user')} - /> - </div> - <div className="col-sm-2"> - <AsyncSelect - onChange={(db: any) => setDatabaseId(db?.value)} - dataEndpoint="/api/v1/database/?q=(filters:!((col:expose_in_sqllab,opr:eq,value:!t)))" - value={databaseId} - mutator={dbMutator} - placeholder={t('Filter by database')} - /> - </div> - <div className="col-sm-4"> - <input - type="text" - onChange={onChange} - onKeyDown={onKeyDown} - className="form-control input-sm" - placeholder={t('Query search string')} - /> - </div> - <div className="col-sm-4 search-date-filter-container"> - <Select - name="select-from" - placeholder={t('[From]-')} - options={TIME_OPTIONS.slice(1, TIME_OPTIONS.length).map(xt => ({ - value: xt, - label: xt, - }))} - value={{ value: from, label: from }} - autosize={false} - onChange={(selected: any) => setFrom(selected?.value)} - /> - - <Select - name="select-to" - placeholder={t('[To]-')} - options={TIME_OPTIONS.map(xt => ({ value: xt, label: xt }))} - value={{ value: to, label: to }} - autosize={false} - onChange={(selected: any) => setTo(selected?.value)} - /> - - <Select - name="select-status" - placeholder={t('Filter by status')} - options={Object.keys(STATUS_OPTIONS).map(s => ({ - value: s, - label: s, - }))} - value={{ value: status, label: status }} - isLoading={false} - autosize={false} - onChange={(selected: any) => setStatus(selected?.value)} - /> - - <Button - buttonSize="small" - buttonStyle="success" - onClick={refreshQueries} - > - {t('Search')} - </Button> - </div> - </div> - <StyledTableStylesContainer> - {queriesLoading ? ( - <Loading /> - ) : ( - <TableStyles> - <QueryTable - columns={[ - 'state', - 'db', - 'user', - 'time', - 'progress', - 'rows', - 'sql', - 'querylink', - ]} - onUserClicked={onUserClicked} - onDbClicked={onDbClicked} - queries={queriesArray} - actions={actions} - displayLimit={displayLimit} - /> - </TableStyles> - )} - </StyledTableStylesContainer> - </TableWrapper> - ); -} -export default QuerySearch; diff --git a/superset-frontend/src/SqlLab/components/QueryStateLabel/QueryStateLabel.test.jsx b/superset-frontend/src/SqlLab/components/QueryStateLabel/QueryStateLabel.test.jsx index a53225d96abc..a14e08a9fe72 100644 --- a/superset-frontend/src/SqlLab/components/QueryStateLabel/QueryStateLabel.test.jsx +++ b/superset-frontend/src/SqlLab/components/QueryStateLabel/QueryStateLabel.test.jsx @@ -17,8 +17,7 @@ * under the License. */ import React from 'react'; -import { shallow } from 'enzyme'; - +import { styledMount as mount } from 'spec/helpers/theming'; import Label from 'src/components/Label'; import QueryStateLabel from 'src/SqlLab/components/QueryStateLabel'; @@ -34,7 +33,7 @@ describe('SavedQuery', () => { ); }); it('has an Overlay and a Popover', () => { - const wrapper = shallow(<QueryStateLabel {...mockedProps} />); + const wrapper = mount(<QueryStateLabel {...mockedProps} />); expect(wrapper.find(Label)).toExist(); }); }); diff --git a/superset-frontend/src/SqlLab/components/QueryStateLabel/index.tsx b/superset-frontend/src/SqlLab/components/QueryStateLabel/index.tsx index 6168a2af713a..0ae092ef5efe 100644 --- a/superset-frontend/src/SqlLab/components/QueryStateLabel/index.tsx +++ b/superset-frontend/src/SqlLab/components/QueryStateLabel/index.tsx @@ -18,17 +18,21 @@ */ import React from 'react'; import Label from 'src/components/Label'; -import { STATE_TYPE_MAP } from 'src/SqlLab/constants'; -import { Query } from '@superset-ui/core'; +import { STATE_TYPE_MAP, STATE_TYPE_MAP_LOCALIZED } from 'src/SqlLab/constants'; +import { styled, Query } from '@superset-ui/core'; interface QueryStateLabelProps { query: Query; } +const StyledLabel = styled(Label)` + margin-right: ${({ theme }) => theme.gridUnit}px; +`; + export default function QueryStateLabel({ query }: QueryStateLabelProps) { return ( - <Label className="m-r-3" type={STATE_TYPE_MAP[query.state]}> - {query.state} - </Label> + <StyledLabel type={STATE_TYPE_MAP[query.state]}> + {STATE_TYPE_MAP_LOCALIZED[query.state]} + </StyledLabel> ); } diff --git a/superset-frontend/src/SqlLab/components/QueryTable/QueryTable.test.jsx b/superset-frontend/src/SqlLab/components/QueryTable/QueryTable.test.jsx index f77e631ae2f5..76784695a814 100644 --- a/superset-frontend/src/SqlLab/components/QueryTable/QueryTable.test.jsx +++ b/superset-frontend/src/SqlLab/components/QueryTable/QueryTable.test.jsx @@ -25,13 +25,11 @@ import TableView from 'src/components/TableView'; import TableCollection from 'src/components/TableCollection'; import { Provider } from 'react-redux'; import { queries, user } from 'src/SqlLab/fixtures'; -import * as actions from 'src/SqlLab/actions/sqlLab'; describe('QueryTable', () => { const mockedProps = { queries, displayLimit: 100, - actions, latestQueryId: 'ryhMUZCGb', }; it('is valid', () => { diff --git a/superset-frontend/src/SqlLab/components/QueryTable/index.tsx b/superset-frontend/src/SqlLab/components/QueryTable/index.tsx index 54edb7f97e8d..96e1f4568da6 100644 --- a/superset-frontend/src/SqlLab/components/QueryTable/index.tsx +++ b/superset-frontend/src/SqlLab/components/QueryTable/index.tsx @@ -22,7 +22,15 @@ import Card from 'src/components/Card'; import ProgressBar from 'src/components/ProgressBar'; import Label from 'src/components/Label'; import { t, useTheme, QueryResponse } from '@superset-ui/core'; -import { useSelector } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; + +import { + queryEditorSetAndSaveSql, + cloneQueryToNewTab, + fetchQueryResults, + clearQueryResults, + removeQuery, +} from 'src/SqlLab/actions/sqlLab'; import TableView from 'src/components/TableView'; import Button from 'src/components/Button'; import { fDuration } from 'src/utils/dates'; @@ -45,13 +53,6 @@ interface QueryTableQuery interface QueryTableProps { columns?: string[]; - actions: { - queryEditorSetAndSaveSql: Function; - cloneQueryToNewTab: Function; - fetchQueryResults: Function; - clearQueryResults: Function; - removeQuery: Function; - }; queries?: QueryResponse[]; onUserClicked?: Function; onDbClicked?: Function; @@ -66,7 +67,6 @@ const openQuery = (id: number) => { const QueryTable = ({ columns = ['started', 'duration', 'rows'], - actions, queries = [], onUserClicked = () => undefined, onDbClicked = () => undefined, @@ -74,6 +74,18 @@ const QueryTable = ({ latestQueryId, }: QueryTableProps) => { const theme = useTheme(); + const dispatch = useDispatch(); + + const QUERY_HISTORY_TABLE_HEADERS_LOCALIZED = { + state: t('State'), + started: t('Started'), + duration: t('Duration'), + progress: t('Progress'), + rows: t('Rows'), + sql: t('SQL'), + results: t('Results'), + actions: t('Actions'), + }; const setHeaders = (column: string) => { if (column === 'sql') { @@ -81,11 +93,13 @@ const QueryTable = ({ } return column.charAt(0).toUpperCase().concat(column.slice(1)); }; + const columnsOfTable = useMemo( () => columns.map(column => ({ accessor: column, - Header: () => setHeaders(column), + Header: + QUERY_HISTORY_TABLE_HEADERS_LOCALIZED[column] || setHeaders(column), disableSortBy: true, })), [columns], @@ -93,25 +107,17 @@ const QueryTable = ({ const user = useSelector<SqlLabRootState, User>(state => state.sqlLab.user); - const { - queryEditorSetAndSaveSql, - cloneQueryToNewTab, - fetchQueryResults, - clearQueryResults, - removeQuery, - } = actions; - const data = useMemo(() => { const restoreSql = (query: QueryResponse) => { - queryEditorSetAndSaveSql({ id: query.sqlEditorId }, query.sql); + dispatch(queryEditorSetAndSaveSql({ id: query.sqlEditorId }, query.sql)); }; const openQueryInNewTab = (query: QueryResponse) => { - cloneQueryToNewTab(query, true); + dispatch(cloneQueryToNewTab(query, true)); }; const openAsyncResults = (query: QueryResponse, displayLimit: number) => { - fetchQueryResults(query, displayLimit); + dispatch(fetchQueryResults(query, displayLimit)); }; const statusAttributes = { @@ -239,13 +245,12 @@ const QueryTable = ({ } modalTitle={t('Data preview')} beforeOpen={() => openAsyncResults(query, displayLimit)} - onExit={() => clearQueryResults(query)} + onExit={() => dispatch(clearQueryResults(query))} modalBody={ <ResultSet showSql user={user} query={query} - actions={actions} height={400} displayLimit={displayLimit} defaultQueryLimit={1000} @@ -294,7 +299,7 @@ const QueryTable = ({ {q.id !== latestQueryId && ( <StyledTooltip tooltip={t('Remove query from log')} - onClick={() => removeQuery(query)} + onClick={() => dispatch(removeQuery(query))} > <Icons.Trash iconSize="xl" /> </StyledTooltip> @@ -304,19 +309,7 @@ const QueryTable = ({ return q; }) .reverse(); - }, [ - queries, - onUserClicked, - onDbClicked, - user, - displayLimit, - actions, - clearQueryResults, - cloneQueryToNewTab, - fetchQueryResults, - queryEditorSetAndSaveSql, - removeQuery, - ]); + }, [queries, onUserClicked, onDbClicked, user, displayLimit]); return ( <div className="QueryTable"> diff --git a/superset-frontend/src/SqlLab/components/ResultSet/ResultSet.test.jsx b/superset-frontend/src/SqlLab/components/ResultSet/ResultSet.test.jsx deleted file mode 100644 index c04e236133b7..000000000000 --- a/superset-frontend/src/SqlLab/components/ResultSet/ResultSet.test.jsx +++ /dev/null @@ -1,219 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import { shallow } from 'enzyme'; -import { styledMount } from 'spec/helpers/theming'; -import { render, screen } from 'spec/helpers/testing-library'; -import { Provider } from 'react-redux'; -import sinon from 'sinon'; -import Alert from 'src/components/Alert'; -import ProgressBar from 'src/components/ProgressBar'; -import Loading from 'src/components/Loading'; -import configureStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; -import fetchMock from 'fetch-mock'; -import FilterableTable from 'src/components/FilterableTable'; -import ExploreResultsButton from 'src/SqlLab/components/ExploreResultsButton'; -import ResultSet from 'src/SqlLab/components/ResultSet'; -import ErrorMessageWithStackTrace from 'src/components/ErrorMessage/ErrorMessageWithStackTrace'; -import { - cachedQuery, - failedQueryWithErrorMessage, - failedQueryWithErrors, - queries, - runningQuery, - stoppedQuery, - initialState, - user, - queryWithNoQueryLimit, -} from 'src/SqlLab/fixtures'; - -const mockStore = configureStore([thunk]); -const store = mockStore(initialState); -const clearQuerySpy = sinon.spy(); -const fetchQuerySpy = sinon.spy(); -const reRunQuerySpy = sinon.spy(); -const mockedProps = { - actions: { - clearQueryResults: clearQuerySpy, - fetchQueryResults: fetchQuerySpy, - reRunQuery: reRunQuerySpy, - }, - cache: true, - query: queries[0], - height: 140, - database: { allows_virtual_table_explore: true }, - user, - defaultQueryLimit: 1000, -}; -const stoppedQueryProps = { ...mockedProps, query: stoppedQuery }; -const runningQueryProps = { ...mockedProps, query: runningQuery }; -const fetchingQueryProps = { - ...mockedProps, - query: { - dbId: 1, - cached: false, - ctas: false, - id: 'ryhHUZCGb', - progress: 100, - state: 'fetching', - startDttm: Date.now() - 500, - }, -}; -const cachedQueryProps = { ...mockedProps, query: cachedQuery }; -const failedQueryWithErrorMessageProps = { - ...mockedProps, - query: failedQueryWithErrorMessage, -}; -const failedQueryWithErrorsProps = { - ...mockedProps, - query: failedQueryWithErrors, -}; -const newProps = { - query: { - cached: false, - resultsKey: 'new key', - results: { - data: [{ a: 1 }], - }, - }, -}; -fetchMock.get('glob:*/api/v1/dataset?*', { result: [] }); - -test('is valid', () => { - expect(React.isValidElement(<ResultSet {...mockedProps} />)).toBe(true); -}); - -test('renders a Table', () => { - const wrapper = shallow(<ResultSet {...mockedProps} />); - expect(wrapper.find(FilterableTable)).toExist(); -}); - -describe('componentDidMount', () => { - const propsWithError = { - ...mockedProps, - query: { ...queries[0], errorMessage: 'Your session timed out' }, - }; - let spy; - beforeEach(() => { - reRunQuerySpy.resetHistory(); - spy = sinon.spy(ResultSet.prototype, 'componentDidMount'); - }); - afterEach(() => { - spy.restore(); - }); - it('should call reRunQuery if timed out', () => { - shallow(<ResultSet {...propsWithError} />); - expect(reRunQuerySpy.callCount).toBe(1); - }); - - it('should not call reRunQuery if no error', () => { - shallow(<ResultSet {...mockedProps} />); - expect(reRunQuerySpy.callCount).toBe(0); - }); -}); - -describe('UNSAFE_componentWillReceiveProps', () => { - const wrapper = shallow(<ResultSet {...mockedProps} />); - let spy; - beforeEach(() => { - clearQuerySpy.resetHistory(); - fetchQuerySpy.resetHistory(); - spy = sinon.spy(ResultSet.prototype, 'UNSAFE_componentWillReceiveProps'); - }); - afterEach(() => { - spy.restore(); - }); - it('should update cached data', () => { - wrapper.setProps(newProps); - - expect(wrapper.state().data).toEqual(newProps.query.results.data); - expect(clearQuerySpy.callCount).toBe(1); - expect(clearQuerySpy.getCall(0).args[0]).toEqual(newProps.query); - expect(fetchQuerySpy.callCount).toBe(1); - expect(fetchQuerySpy.getCall(0).args[0]).toEqual(newProps.query); - }); -}); - -test('should render success query', () => { - const wrapper = shallow(<ResultSet {...mockedProps} />); - const filterableTable = wrapper.find(FilterableTable); - expect(filterableTable.props().data).toBe(mockedProps.query.results.data); - expect(wrapper.find(ExploreResultsButton)).toExist(); -}); -test('should render empty results', () => { - const props = { - ...mockedProps, - query: { ...mockedProps.query, results: { data: [] } }, - }; - const wrapper = styledMount( - <Provider store={store}> - <ResultSet {...props} /> - </Provider>, - ); - expect(wrapper.find(FilterableTable)).not.toExist(); - expect(wrapper.find(Alert)).toExist(); - expect(wrapper.find(Alert).render().text()).toBe( - 'The query returned no data', - ); -}); - -test('should render cached query', () => { - const wrapper = shallow(<ResultSet {...cachedQueryProps} />); - const cachedData = [{ col1: 'a', col2: 'b' }]; - wrapper.setState({ data: cachedData }); - const filterableTable = wrapper.find(FilterableTable); - expect(filterableTable.props().data).toBe(cachedData); -}); - -test('should render stopped query', () => { - const wrapper = shallow(<ResultSet {...stoppedQueryProps} />); - expect(wrapper.find(Alert)).toExist(); -}); - -test('should render running/pending/fetching query', () => { - const wrapper = shallow(<ResultSet {...runningQueryProps} />); - expect(wrapper.find(ProgressBar)).toExist(); -}); - -test('should render fetching w/ 100 progress query', () => { - const wrapper = shallow(<ResultSet {...fetchingQueryProps} />); - expect(wrapper.find(Loading)).toExist(); -}); - -test('should render a failed query with an error message', () => { - const wrapper = shallow(<ResultSet {...failedQueryWithErrorMessageProps} />); - expect(wrapper.find(ErrorMessageWithStackTrace)).toExist(); -}); - -test('should render a failed query with an errors object', () => { - const wrapper = shallow(<ResultSet {...failedQueryWithErrorsProps} />); - expect(wrapper.find(ErrorMessageWithStackTrace)).toExist(); -}); - -test('renders if there is no limit in query.results but has queryLimit', () => { - render(<ResultSet {...mockedProps} />, { useRedux: true }); - expect(screen.getByRole('grid')).toBeInTheDocument(); -}); - -test('renders if there is a limit in query.results but not queryLimit', () => { - const props = { ...mockedProps, query: queryWithNoQueryLimit }; - render(<ResultSet {...props} />, { useRedux: true }); - expect(screen.getByRole('grid')).toBeInTheDocument(); -}); diff --git a/superset-frontend/src/SqlLab/components/ResultSet/ResultSet.test.tsx b/superset-frontend/src/SqlLab/components/ResultSet/ResultSet.test.tsx new file mode 100644 index 000000000000..7869a87ab1b6 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/ResultSet/ResultSet.test.tsx @@ -0,0 +1,271 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import configureStore from 'redux-mock-store'; +import { Store } from 'redux'; +import thunk from 'redux-thunk'; +import fetchMock from 'fetch-mock'; +import ResultSet from 'src/SqlLab/components/ResultSet'; +import { + cachedQuery, + failedQueryWithErrorMessage, + failedQueryWithErrors, + queries, + runningQuery, + stoppedQuery, + initialState, + user, + queryWithNoQueryLimit, +} from 'src/SqlLab/fixtures'; + +const mockedProps = { + cache: true, + query: queries[0], + height: 140, + database: { allows_virtual_table_explore: true }, + user, + defaultQueryLimit: 1000, +}; +const stoppedQueryProps = { ...mockedProps, query: stoppedQuery }; +const runningQueryProps = { ...mockedProps, query: runningQuery }; +const fetchingQueryProps = { + ...mockedProps, + query: { + dbId: 1, + cached: false, + ctas: false, + id: 'ryhHUZCGb', + progress: 100, + state: 'fetching', + startDttm: Date.now() - 500, + }, +}; +const cachedQueryProps = { ...mockedProps, query: cachedQuery }; +const failedQueryWithErrorMessageProps = { + ...mockedProps, + query: failedQueryWithErrorMessage, +}; +const failedQueryWithErrorsProps = { + ...mockedProps, + query: failedQueryWithErrors, +}; +const newProps = { + query: { + cached: false, + resultsKey: 'new key', + results: { + data: [{ a: 1 }], + }, + }, +}; +const asyncQueryProps = { + ...mockedProps, + database: { allow_run_async: true }, +}; +const asyncRefetchDataPreviewProps = { + ...asyncQueryProps, + query: { + state: 'success', + results: undefined, + isDataPreview: true, + }, +}; +const asyncRefetchResultsTableProps = { + ...asyncQueryProps, + query: { + state: 'success', + results: undefined, + resultsKey: 'async results key', + }, +}; +fetchMock.get('glob:*/api/v1/dataset?*', { result: [] }); + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); +const setup = (props?: any, store?: Store) => + render(<ResultSet {...props} />, { + useRedux: true, + ...(store && { store }), + }); + +describe('ResultSet', () => { + test('renders a Table', async () => { + const { getByTestId } = setup(mockedProps, mockStore(initialState)); + const table = getByTestId('table-container'); + expect(table).toBeInTheDocument(); + }); + + test('should render success query', async () => { + const { queryAllByText, getByTestId } = setup( + mockedProps, + mockStore(initialState), + ); + + const table = getByTestId('table-container'); + expect(table).toBeInTheDocument(); + + const firstColumn = queryAllByText( + mockedProps.query.results?.columns[0].name ?? '', + )[0]; + const secondColumn = queryAllByText( + mockedProps.query.results?.columns[1].name ?? '', + )[0]; + expect(firstColumn).toBeInTheDocument(); + expect(secondColumn).toBeInTheDocument(); + + const exploreButton = getByTestId('explore-results-button'); + expect(exploreButton).toBeInTheDocument(); + }); + + test('should render empty results', async () => { + const props = { + ...mockedProps, + query: { ...mockedProps.query, results: { data: [] } }, + }; + await waitFor(() => { + setup(props, mockStore(initialState)); + }); + + const alert = screen.getByRole('alert'); + expect(alert).toBeInTheDocument(); + expect(alert).toHaveTextContent('The query returned no data'); + }); + + test('should call reRunQuery if timed out', async () => { + const store = mockStore(initialState); + const propsWithError = { + ...mockedProps, + query: { ...queries[0], errorMessage: 'Your session timed out' }, + }; + + setup(propsWithError, store); + expect(store.getActions()).toHaveLength(1); + expect(store.getActions()[0].query.errorMessage).toEqual( + 'Your session timed out', + ); + expect(store.getActions()[0].type).toEqual('START_QUERY'); + }); + + test('should not call reRunQuery if no error', async () => { + const store = mockStore(initialState); + setup(mockedProps, store); + expect(store.getActions()).toEqual([]); + }); + + test('should render cached query', async () => { + const store = mockStore(initialState); + const { rerender } = setup(cachedQueryProps, store); + + // @ts-ignore + rerender(<ResultSet {...newProps} />); + expect(store.getActions()).toHaveLength(2); + expect(store.getActions()[0].query.results).toEqual( + cachedQueryProps.query.results, + ); + expect(store.getActions()[0].type).toEqual('CLEAR_QUERY_RESULTS'); + }); + + test('should render stopped query', async () => { + await waitFor(() => { + setup(stoppedQueryProps, mockStore(initialState)); + }); + + const alert = screen.getByRole('alert'); + expect(alert).toBeInTheDocument(); + }); + + test('should render running/pending/fetching query', async () => { + const { getByTestId } = setup(runningQueryProps, mockStore(initialState)); + const progressBar = getByTestId('progress-bar'); + expect(progressBar).toBeInTheDocument(); + }); + + test('should render fetching w/ 100 progress query', async () => { + const { getByRole, getByText } = setup( + fetchingQueryProps, + mockStore(initialState), + ); + const loading = getByRole('status'); + expect(loading).toBeInTheDocument(); + expect(getByText('fetching')).toBeInTheDocument(); + }); + + test('should render a failed query with an error message', async () => { + await waitFor(() => { + setup(failedQueryWithErrorMessageProps, mockStore(initialState)); + }); + + expect(screen.getByText('Database error')).toBeInTheDocument(); + expect(screen.getByText('Something went wrong')).toBeInTheDocument(); + }); + + test('should render a failed query with an errors object', async () => { + await waitFor(() => { + setup(failedQueryWithErrorsProps, mockStore(initialState)); + }); + expect(screen.getByText('Database error')).toBeInTheDocument(); + }); + + test('renders if there is no limit in query.results but has queryLimit', async () => { + const { getByRole } = setup(mockedProps, mockStore(initialState)); + expect(getByRole('grid')).toBeInTheDocument(); + }); + + test('renders if there is a limit in query.results but not queryLimit', async () => { + const props = { ...mockedProps, query: queryWithNoQueryLimit }; + const { getByRole } = setup(props, mockStore(initialState)); + expect(getByRole('grid')).toBeInTheDocument(); + }); + + test('Async queries - renders "Fetch data preview" button when data preview has no results', () => { + setup(asyncRefetchDataPreviewProps, mockStore(initialState)); + expect( + screen.getByRole('button', { + name: /fetch data preview/i, + }), + ).toBeVisible(); + expect(screen.queryByRole('grid')).toBe(null); + }); + + test('Async queries - renders "Refetch results" button when a query has no results', () => { + setup(asyncRefetchResultsTableProps, mockStore(initialState)); + expect( + screen.getByRole('button', { + name: /refetch results/i, + }), + ).toBeVisible(); + expect(screen.queryByRole('grid')).toBe(null); + }); + + test('Async queries - renders on the first call', () => { + setup(asyncQueryProps, mockStore(initialState)); + expect(screen.getByRole('grid')).toBeVisible(); + expect( + screen.queryByRole('button', { + name: /fetch data preview/i, + }), + ).toBe(null); + expect( + screen.queryByRole('button', { + name: /refetch results/i, + }), + ).toBe(null); + }); +}); diff --git a/superset-frontend/src/SqlLab/components/ResultSet/index.tsx b/superset-frontend/src/SqlLab/components/ResultSet/index.tsx index 339303ba5792..fad6c98bc94b 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet/index.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet/index.tsx @@ -16,23 +16,47 @@ * specific language governing permissions and limitations * under the License. */ -import React, { CSSProperties } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; +import { useDispatch } from 'react-redux'; import ButtonGroup from 'src/components/ButtonGroup'; import Alert from 'src/components/Alert'; import Button from 'src/components/Button'; import shortid from 'shortid'; -import { styled, t, QueryResponse } from '@superset-ui/core'; +import { + QueryResponse, + QueryState, + styled, + t, + useTheme, +} from '@superset-ui/core'; +import { usePrevious } from 'src/hooks/usePrevious'; import ErrorMessageWithStackTrace from 'src/components/ErrorMessage/ErrorMessageWithStackTrace'; -import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; +import { + ISaveableDatasource, + ISimpleColumn, + SaveDatasetModal, +} from 'src/SqlLab/components/SaveDatasetModal'; import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; +import { EXPLORE_CHART_DEFAULT } from 'src/SqlLab/types'; +import { mountExploreUrl } from 'src/explore/exploreUtils'; +import { postFormData } from 'src/explore/exploreUtils/formData'; import ProgressBar from 'src/components/ProgressBar'; import Loading from 'src/components/Loading'; import FilterableTable, { MAX_COLUMNS_FOR_TABLE, } from 'src/components/FilterableTable'; import CopyToClipboard from 'src/components/CopyToClipboard'; +import { addDangerToast } from 'src/components/MessageToasts/actions'; import { prepareCopyToClipboardTabularData } from 'src/utils/common'; -import { CtasEnum } from 'src/SqlLab/actions/sqlLab'; +import { + addQueryEditor, + clearQueryResults, + CtasEnum, + fetchQueryResults, + reFetchQueryResults, + reRunQuery, +} from 'src/SqlLab/actions/sqlLab'; +import { URL_PARAMS } from 'src/constants'; import ExploreCtasResultsButton from '../ExploreCtasResultsButton'; import ExploreResultsButton from '../ExploreResultsButton'; import HighlightedSql from '../HighlightedSql'; @@ -45,11 +69,7 @@ enum LIMITING_FACTOR { NOT_LIMITED = 'NOT_LIMITED', } -const LOADING_STYLES: CSSProperties = { position: 'relative', minHeight: 100 }; - -interface ResultSetProps { - showControls?: boolean; - actions: Record<string, any>; +export interface ResultSetProps { cache?: boolean; csv?: boolean; database?: Record<string, any>; @@ -63,13 +83,16 @@ interface ResultSetProps { defaultQueryLimit: number; } -interface ResultSetState { - searchText: string; - showExploreResultsButton: boolean; - data: Record<string, any>[]; - showSaveDatasetModal: boolean; - alertIsOpen: boolean; -} +const ResultlessStyles = styled.div` + position: relative; + min-height: ${({ theme }) => theme.gridUnit * 25}px; + [role='alert'] { + margin-top: ${({ theme }) => theme.gridUnit * 2}px; + } + .sql-result-track-job { + margin-top: ${({ theme }) => theme.gridUnit * 2}px; + } +`; // Making text render line breaks/tabs as is as monospace, // but wrapping text too so text doesn't overflow @@ -82,8 +105,8 @@ const MonospaceDiv = styled.div` `; const ReturnedRows = styled.div` - font-size: 13px; - line-height: 24px; + font-size: ${({ theme }) => theme.typography.sizes.s}px; + line-height: ${({ theme }) => theme.gridUnit * 6}px; `; const ResultSetControls = styled.div` @@ -98,150 +121,146 @@ const ResultSetButtons = styled.div` padding-right: ${({ theme }) => 2 * theme.gridUnit}px; `; -const ResultSetErrorMessage = styled.div` - padding-top: ${({ theme }) => 4 * theme.gridUnit}px; +const LimitMessage = styled.span` + color: ${({ theme }) => theme.colors.secondary.light1}; + margin-left: ${({ theme }) => theme.gridUnit * 2}px; `; -export default class ResultSet extends React.PureComponent< - ResultSetProps, - ResultSetState -> { - static defaultProps = { - cache: false, - csv: true, - database: {}, - search: true, - showSql: false, - visualize: true, - }; - - constructor(props: ResultSetProps) { - super(props); - this.state = { - searchText: '', - showExploreResultsButton: false, - data: [], - showSaveDatasetModal: false, - alertIsOpen: false, - }; - this.changeSearch = this.changeSearch.bind(this); - this.fetchResults = this.fetchResults.bind(this); - this.popSelectStar = this.popSelectStar.bind(this); - this.reFetchQueryResults = this.reFetchQueryResults.bind(this); - this.toggleExploreResultsButton = - this.toggleExploreResultsButton.bind(this); - } +const ResultSet = ({ + cache = false, + csv = true, + database = {}, + displayLimit, + height, + query, + search = true, + showSql = false, + visualize = true, + user, + defaultQueryLimit, +}: ResultSetProps) => { + const theme = useTheme(); + const [searchText, setSearchText] = useState(''); + const [cachedData, setCachedData] = useState<Record<string, unknown>[]>([]); + const [showSaveDatasetModal, setShowSaveDatasetModal] = useState(false); + const [alertIsOpen, setAlertIsOpen] = useState(false); + + const dispatch = useDispatch(); + + const reRunQueryIfSessionTimeoutErrorOnMount = useCallback(() => { + if ( + query.errorMessage && + query.errorMessage.indexOf('session timed out') > 0 + ) { + dispatch(reRunQuery(query)); + } + }, []); - async componentDidMount() { + useEffect(() => { // only do this the first time the component is rendered/mounted - this.reRunQueryIfSessionTimeoutErrorOnMount(); - } + reRunQueryIfSessionTimeoutErrorOnMount(); + }, [reRunQueryIfSessionTimeoutErrorOnMount]); - UNSAFE_componentWillReceiveProps(nextProps: ResultSetProps) { - // when new results comes in, save them locally and clear in store - if ( - this.props.cache && - !nextProps.query.cached && - nextProps.query.results && - nextProps.query.results.data && - nextProps.query.results.data.length > 0 - ) { - this.setState({ data: nextProps.query.results.data }, () => - this.clearQueryResults(nextProps.query), - ); + const fetchResults = (query: QueryResponse) => { + dispatch(fetchQueryResults(query, displayLimit)); + }; + + const prevQuery = usePrevious(query); + useEffect(() => { + if (cache && query.cached && query?.results?.data?.length > 0) { + setCachedData(query.results.data); + dispatch(clearQueryResults(query)); } - if ( - nextProps.query.resultsKey && - nextProps.query.resultsKey !== this.props.query.resultsKey - ) { - this.fetchResults(nextProps.query); + if (query.resultsKey && query.resultsKey !== prevQuery?.resultsKey) { + fetchResults(query); } - } + }, [query, cache]); - calculateAlertRefHeight = (alertElement: HTMLElement | null) => { + const calculateAlertRefHeight = (alertElement: HTMLElement | null) => { if (alertElement) { - this.setState({ alertIsOpen: true }); + setAlertIsOpen(true); } else { - this.setState({ alertIsOpen: false }); + setAlertIsOpen(false); } }; - clearQueryResults(query: QueryResponse) { - this.props.actions.clearQueryResults(query); - } - - popSelectStar(tempSchema: string | null, tempTable: string) { + const popSelectStar = (tempSchema: string | null, tempTable: string) => { const qe = { id: shortid.generate(), - title: tempTable, + name: tempTable, autorun: false, - dbId: this.props.query.dbId, + dbId: query.dbId, sql: `SELECT * FROM ${tempSchema ? `${tempSchema}.` : ''}${tempTable}`, }; - this.props.actions.addQueryEditor(qe); - } - - toggleExploreResultsButton() { - this.setState(prevState => ({ - showExploreResultsButton: !prevState.showExploreResultsButton, - })); - } - - changeSearch(event: React.ChangeEvent<HTMLInputElement>) { - this.setState({ searchText: event.target.value }); - } - - fetchResults(query: QueryResponse) { - this.props.actions.fetchQueryResults(query, this.props.displayLimit); - } + dispatch(addQueryEditor(qe)); + }; - reFetchQueryResults(query: QueryResponse) { - this.props.actions.reFetchQueryResults(query); - } + const changeSearch = (event: React.ChangeEvent<HTMLInputElement>) => { + setSearchText(event.target.value); + }; - reRunQueryIfSessionTimeoutErrorOnMount() { - const { query } = this.props; - if ( - query.errorMessage && - query.errorMessage.indexOf('session timed out') > 0 - ) { - this.props.actions.reRunQuery(query); + const createExploreResultsOnClick = async () => { + const { results } = query; + + if (results?.query_id) { + const key = await postFormData(results.query_id, 'query', { + ...EXPLORE_CHART_DEFAULT, + datasource: `${results.query_id}__query`, + ...{ + all_columns: results.columns.map(column => column.name), + }, + }); + const url = mountExploreUrl(null, { + [URL_PARAMS.formDataKey.name]: key, + }); + window.open(url, '_blank', 'noreferrer'); + } else { + addDangerToast(t('Unable to create chart without a query id.')); } - } + }; - renderControls() { - if (this.props.search || this.props.visualize || this.props.csv) { - let { data } = this.props.query.results; - if (this.props.cache && this.props.query.cached) { - ({ data } = this.state); + const getExportCsvUrl = (clientId: string) => + `/api/v1/sqllab/export/${clientId}/`; + + const renderControls = () => { + if (search || visualize || csv) { + let { data } = query.results; + if (cache && query.cached) { + data = cachedData; } - const { columns } = this.props.query.results; + const { columns } = query.results; // Added compute logic to stop user from being able to Save & Explore - const { showSaveDatasetModal } = this.state; - const { query } = this.props; + + const datasource: ISaveableDatasource = { + columns: query.results.columns as ISimpleColumn[], + name: query?.tab || 'Untitled', + dbId: query?.dbId, + sql: query?.sql, + templateParams: query?.templateParams, + schema: query?.schema, + }; return ( <ResultSetControls> <SaveDatasetModal visible={showSaveDatasetModal} - onHide={() => this.setState({ showSaveDatasetModal: false })} + onHide={() => setShowSaveDatasetModal(false)} buttonTextOnSave={t('Save & Explore')} buttonTextOnOverwrite={t('Overwrite & Explore')} modalDescription={t( 'Save this query as a virtual dataset to continue exploring', )} - datasource={query} + datasource={datasource} /> <ResultSetButtons> - {this.props.visualize && - this.props.database?.allows_virtual_table_explore && ( - <ExploreResultsButton - database={this.props.database} - onClick={() => this.setState({ showSaveDatasetModal: true })} - /> - )} - {this.props.csv && ( - <Button buttonSize="small" href={`/superset/csv/${query.id}`}> + {visualize && database?.allows_virtual_table_explore && ( + <ExploreResultsButton + database={database} + onClick={createExploreResultsOnClick} + /> + )} + {csv && ( + <Button buttonSize="small" href={getExportCsvUrl(query.id)}> <i className="fa fa-file-text-o" /> {t('Download to CSV')} </Button> )} @@ -257,11 +276,11 @@ export default class ResultSet extends React.PureComponent< hideTooltip /> </ResultSetButtons> - {this.props.search && ( + {search && ( <input type="text" - onChange={this.changeSearch} - value={this.state.searchText} + onChange={changeSearch} + value={searchText} className="form-control input-sm" disabled={columns.length > MAX_COLUMNS_FOR_TABLE} placeholder={ @@ -275,14 +294,14 @@ export default class ResultSet extends React.PureComponent< ); } return <div />; - } + }; - renderRowsReturned() { - const { results, rows, queryLimit, limitingFactor } = this.props.query; + const renderRowsReturned = () => { + const { results, rows, queryLimit, limitingFactor } = query; let limitMessage; const limitReached = results?.displayLimitReached; const limit = queryLimit || results.query.limit; - const isAdmin = !!this.props.user?.roles?.Admin; + const isAdmin = !!user?.roles?.Admin; const rowsCount = Math.min(rows || 0, results?.data?.length || 0); const displayMaxRowsReachedMessage = { @@ -300,10 +319,10 @@ export default class ResultSet extends React.PureComponent< ), }; const shouldUseDefaultDropdownAlert = - limit === this.props.defaultQueryLimit && + limit === defaultQueryLimit && limitingFactor === LIMITING_FACTOR.DROPDOWN; - if (limitingFactor === LIMITING_FACTOR.QUERY && this.props.csv) { + if (limitingFactor === LIMITING_FACTOR.QUERY && csv) { limitMessage = t( 'The number of rows displayed is limited to %(rows)d by the query', { rows }, @@ -334,27 +353,27 @@ export default class ResultSet extends React.PureComponent< {!limitReached && !shouldUseDefaultDropdownAlert && ( <span title={tooltipText}> {rowsReturnedMessage} - <span>{limitMessage}</span> + <LimitMessage>{limitMessage}</LimitMessage> </span> )} {!limitReached && shouldUseDefaultDropdownAlert && ( - <div ref={this.calculateAlertRefHeight}> + <div ref={calculateAlertRefHeight}> <Alert type="warning" message={t('%(rows)d rows returned', { rows })} - onClose={() => this.setState({ alertIsOpen: false })} + onClose={() => setAlertIsOpen(false)} description={t( - 'The number of rows displayed is limited to %s by the dropdown.', - rows, + 'The number of rows displayed is limited to %(rows)d by the dropdown.', + { rows }, )} /> </div> )} {limitReached && ( - <div ref={this.calculateAlertRefHeight}> + <div ref={calculateAlertRefHeight}> <Alert type="warning" - onClose={() => this.setState({ alertIsOpen: false })} + onClose={() => setAlertIsOpen(false)} message={t('%(rows)d rows returned', { rows: rowsCount })} description={ isAdmin @@ -366,186 +385,193 @@ export default class ResultSet extends React.PureComponent< )} </ReturnedRows> ); + }; + + const limitReached = query?.results?.displayLimitReached; + let sql; + let exploreDBId = query.dbId; + if (database?.explore_database_id) { + exploreDBId = database.explore_database_id; } - render() { - const { query } = this.props; - const limitReached = query?.results?.displayLimitReached; - let sql; - let exploreDBId = query.dbId; - if (this.props.database && this.props.database.explore_database_id) { - exploreDBId = this.props.database.explore_database_id; - } + let trackingUrl; + if ( + query.trackingUrl && + query.state !== QueryState.SUCCESS && + query.state !== QueryState.FETCHING + ) { + trackingUrl = ( + <Button + className="sql-result-track-job" + buttonSize="small" + href={query.trackingUrl} + target="_blank" + > + {query.state === QueryState.RUNNING + ? t('Track job') + : t('See query details')} + </Button> + ); + } - if (this.props.showSql) sql = <HighlightedSql sql={query.sql} />; + if (showSql) { + sql = <HighlightedSql sql={query.sql} />; + } + + if (query.state === QueryState.STOPPED) { + return <Alert type="warning" message={t('Query was stopped')} />; + } + + if (query.state === QueryState.FAILED) { + return ( + <ResultlessStyles> + <ErrorMessageWithStackTrace + title={t('Database error')} + error={query?.errors?.[0]} + subtitle={<MonospaceDiv>{query.errorMessage}</MonospaceDiv>} + copyText={query.errorMessage || undefined} + link={query.link} + source="sqllab" + /> + {trackingUrl} + </ResultlessStyles> + ); + } - if (query.state === 'stopped') { - return <Alert type="warning" message={t('Query was stopped')} />; + if (query.state === QueryState.SUCCESS && query.ctas) { + const { tempSchema, tempTable } = query; + let object = 'Table'; + if (query.ctas_method === CtasEnum.VIEW) { + object = 'View'; } - if (query.state === 'failed') { - return ( - <ResultSetErrorMessage> - <ErrorMessageWithStackTrace - title={t('Database error')} - error={query?.errors?.[0]} - subtitle={<MonospaceDiv>{query.errorMessage}</MonospaceDiv>} - copyText={query.errorMessage || undefined} - link={query.link} - source="sqllab" - /> - </ResultSetErrorMessage> - ); + return ( + <div> + <Alert + type="info" + message={ + <> + {t(object)} [ + <strong> + {tempSchema ? `${tempSchema}.` : ''} + {tempTable} + </strong> + ] {t('was created')}   + <ButtonGroup> + <Button + buttonSize="small" + css={{ marginRight: theme.gridUnit }} + onClick={() => popSelectStar(tempSchema, tempTable)} + > + {t('Query in a new tab')} + </Button> + <ExploreCtasResultsButton + table={tempTable} + schema={tempSchema} + dbId={exploreDBId} + /> + </ButtonGroup> + </> + } + /> + </div> + ); + } + + if (query.state === QueryState.SUCCESS && query.results) { + const { results } = query; + // Accounts for offset needed for height of ResultSetRowsReturned component if !limitReached + const rowMessageHeight = !limitReached ? 32 : 0; + // Accounts for offset needed for height of Alert if this.state.alertIsOpen + const alertContainerHeight = 70; + // We need to calculate the height of this.renderRowsReturned() + // if we want results panel to be proper height because the + // FilterTable component needs an explicit height to render + // react-virtualized Table component + const rowsHeight = alertIsOpen + ? height - alertContainerHeight + : height - rowMessageHeight; + let data; + if (cache && query.cached) { + data = cachedData; + } else if (results?.data) { + ({ data } = results); } - if (query.state === 'success' && query.ctas) { - const { tempSchema, tempTable } = query; - let object = 'Table'; - if (query.ctas_method === CtasEnum.VIEW) { - object = 'View'; - } + if (data && data.length > 0) { + const expandedColumns = results.expanded_columns + ? results.expanded_columns.map(col => col.name) + : []; return ( - <div> - <Alert - type="info" - message={ - <> - {t(object)} [ - <strong> - {tempSchema ? `${tempSchema}.` : ''} - {tempTable} - </strong> - ] {t('was created')}   - <ButtonGroup> - <Button - buttonSize="small" - className="m-r-5" - onClick={() => this.popSelectStar(tempSchema, tempTable)} - > - {t('Query in a new tab')} - </Button> - <ExploreCtasResultsButton - // @ts-ignore Redux types are difficult to work with, ignoring for now - actions={this.props.actions} - table={tempTable} - schema={tempSchema} - dbId={exploreDBId} - /> - </ButtonGroup> - </> - } + <> + {renderControls()} + {renderRowsReturned()} + {sql} + <FilterableTable + data={data} + orderedColumnKeys={results.columns.map(col => col.name)} + height={rowsHeight} + filterText={searchText} + expandedColumns={expandedColumns} /> - </div> + </> ); } - if (query.state === 'success' && query.results) { - const { results } = query; - // Accounts for offset needed for height of ResultSetRowsReturned component if !limitReached - const rowMessageHeight = !limitReached ? 32 : 0; - // Accounts for offset needed for height of Alert if this.state.alertIsOpen - const alertContainerHeight = 70; - // We need to calculate the height of this.renderRowsReturned() - // if we want results panel to be propper height because the - // FilterTable component nedds an explcit height to render - // react-virtualized Table component - const height = this.state.alertIsOpen - ? this.props.height - alertContainerHeight - : this.props.height - rowMessageHeight; - let data; - if (this.props.cache && query.cached) { - ({ data } = this.state); - } else if (results && results.data) { - ({ data } = results); - } - if (data && data.length > 0) { - const expandedColumns = results.expanded_columns - ? results.expanded_columns.map(col => col.name) - : []; - return ( - <> - {this.renderControls()} - {this.renderRowsReturned()} - {sql} - <FilterableTable - data={data} - orderedColumnKeys={results.columns.map(col => col.name)} - height={height} - filterText={this.state.searchText} - expandedColumns={expandedColumns} - /> - </> - ); - } - if (data && data.length === 0) { - return ( - <Alert type="warning" message={t('The query returned no data')} /> - ); - } + if (data && data.length === 0) { + return <Alert type="warning" message={t('The query returned no data')} />; } - if (query.cached || (query.state === 'success' && !query.results)) { - if (query.isDataPreview) { - return ( - <Button - buttonSize="small" - buttonStyle="primary" - onClick={() => - this.reFetchQueryResults({ + } + + if (query.cached || (query.state === QueryState.SUCCESS && !query.results)) { + if (query.isDataPreview) { + return ( + <Button + buttonSize="small" + buttonStyle="primary" + onClick={() => + dispatch( + reFetchQueryResults({ ...query, isDataPreview: true, - }) - } - > - {t('Fetch data preview')} - </Button> - ); - } - if (query.resultsKey) { - return ( - <Button - buttonSize="small" - buttonStyle="primary" - onClick={() => this.fetchResults(query)} - > - {t('Refetch results')} - </Button> - ); - } - } - let trackingUrl; - let progressBar; - if (query.progress > 0) { - progressBar = ( - <ProgressBar - percent={parseInt(query.progress.toFixed(0), 10)} - striped - /> + }), + ) + } + > + {t('Fetch data preview')} + </Button> ); } - if (query.trackingUrl) { - trackingUrl = ( + if (query.resultsKey) { + return ( <Button buttonSize="small" - onClick={() => query.trackingUrl && window.open(query.trackingUrl)} + buttonStyle="primary" + onClick={() => fetchResults(query)} > - {t('Track job')} + {t('Refetch results')} </Button> ); } - const progressMsg = - query && query.extra && query.extra.progress - ? query.extra.progress - : null; + } - return ( - <div style={LOADING_STYLES}> - <div>{!progressBar && <Loading position="normal" />}</div> - {/* show loading bar whenever progress bar is completed but needs time to render */} - <div>{query.progress === 100 && <Loading position="normal" />}</div> - <QueryStateLabel query={query} /> - <div> - {progressMsg && <Alert type="success" message={progressMsg} />} - </div> - <div>{query.progress !== 100 && progressBar}</div> - <div>{trackingUrl}</div> - </div> + let progressBar; + if (query.progress > 0) { + progressBar = ( + <ProgressBar percent={parseInt(query.progress.toFixed(0), 10)} striped /> ); } -} + + const progressMsg = query?.extra?.progress ?? null; + + return ( + <ResultlessStyles> + <div>{!progressBar && <Loading position="normal" />}</div> + {/* show loading bar whenever progress bar is completed but needs time to render */} + <div>{query.progress === 100 && <Loading position="normal" />}</div> + <QueryStateLabel query={query} /> + <div>{progressMsg && <Alert type="success" message={progressMsg} />}</div> + <div>{query.progress !== 100 && progressBar}</div> + {trackingUrl && <div>{trackingUrl}</div>} + </ResultlessStyles> + ); +}; + +export default ResultSet; diff --git a/superset-frontend/src/SqlLab/components/RunQueryActionButton/RunQueryActionButton.test.jsx b/superset-frontend/src/SqlLab/components/RunQueryActionButton/RunQueryActionButton.test.jsx deleted file mode 100644 index 823f10741ac0..000000000000 --- a/superset-frontend/src/SqlLab/components/RunQueryActionButton/RunQueryActionButton.test.jsx +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import { mount } from 'enzyme'; -import { supersetTheme, ThemeProvider } from '@superset-ui/core'; -import RunQueryActionButton from 'src/SqlLab/components/RunQueryActionButton'; -import Button from 'src/components/Button'; - -describe('RunQueryActionButton', () => { - let wrapper; - const defaultProps = { - allowAsync: false, - dbId: 1, - queryState: 'pending', - runQuery: () => {}, // eslint-disable-line - selectedText: null, - stopQuery: () => {}, // eslint-disable-line - sql: '', - }; - - beforeEach(() => { - wrapper = mount(<RunQueryActionButton {...defaultProps} />, { - wrappingComponent: ThemeProvider, - wrappingComponentProps: { theme: supersetTheme }, - }); - }); - - it('is a valid react element', () => { - expect( - React.isValidElement(<RunQueryActionButton {...defaultProps} />), - ).toBe(true); - }); - - it('renders a single Button', () => { - expect(wrapper.find(Button)).toExist(); - }); -}); diff --git a/superset-frontend/src/SqlLab/components/RunQueryActionButton/RunQueryActionButton.test.tsx b/superset-frontend/src/SqlLab/components/RunQueryActionButton/RunQueryActionButton.test.tsx new file mode 100644 index 000000000000..276f9b7d1967 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/RunQueryActionButton/RunQueryActionButton.test.tsx @@ -0,0 +1,160 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import configureStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import { Store } from 'redux'; + +import { render, fireEvent, waitFor } from 'spec/helpers/testing-library'; +import { initialState, defaultQueryEditor } from 'src/SqlLab/fixtures'; +import RunQueryActionButton, { + RunQueryActionButtonProps, +} from 'src/SqlLab/components/RunQueryActionButton'; + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); + +jest.mock('src/components/DeprecatedSelect', () => () => ( + <div data-test="mock-deprecated-select" /> +)); +jest.mock('src/components/Select/Select', () => () => ( + <div data-test="mock-deprecated-select-select" /> +)); +jest.mock('src/components/Select/AsyncSelect', () => () => ( + <div data-test="mock-deprecated-async-select" /> +)); + +const defaultProps = { + queryEditorId: defaultQueryEditor.id, + allowAsync: false, + dbId: 1, + queryState: 'ready', + runQuery: () => {}, + selectedText: null, + stopQuery: () => {}, + overlayCreateAsMenu: null, +}; + +const setup = (props?: Partial<RunQueryActionButtonProps>, store?: Store) => + render(<RunQueryActionButton {...defaultProps} {...props} />, { + useRedux: true, + ...(store && { store }), + }); + +it('renders a single Button', () => { + const { getByRole } = setup({}, mockStore(initialState)); + expect(getByRole('button')).toBeInTheDocument(); +}); + +it('renders a label for Run Query', () => { + const { getByText } = setup({}, mockStore(initialState)); + expect(getByText('Run')).toBeInTheDocument(); +}); + +it('renders a label for Selected Query', () => { + const { getByText } = setup( + {}, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + selectedText: 'select * from\n-- this is comment\nwhere', + }, + }, + }), + ); + expect(getByText('Run selection')).toBeInTheDocument(); +}); + +it('disable button when sql from unsaved changes is empty', () => { + const { getByRole } = setup( + {}, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + sql: '', + }, + }, + }), + ); + const button = getByRole('button'); + expect(button).toBeDisabled(); +}); + +it('disable button when selectedText only contains blank contents', () => { + const { getByRole } = setup( + {}, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + selectedText: '-- this is comment\n\n \t', + }, + }, + }), + ); + const button = getByRole('button'); + expect(button).toBeDisabled(); +}); + +it('enable default button for unrelated unsaved changes', () => { + const { getByRole } = setup( + {}, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: `${defaultQueryEditor.id}-other`, + sql: '', + }, + }, + }), + ); + const button = getByRole('button'); + expect(button).toBeEnabled(); +}); + +it('dispatch runQuery on click', async () => { + const runQuery = jest.fn(); + const { getByRole } = setup({ runQuery }, mockStore(initialState)); + const button = getByRole('button'); + expect(runQuery).toHaveBeenCalledTimes(0); + fireEvent.click(button); + await waitFor(() => expect(runQuery).toHaveBeenCalledTimes(1)); +}); + +it('dispatch stopQuery on click while running state', async () => { + const stopQuery = jest.fn(); + const { getByRole } = setup( + { queryState: 'running', stopQuery }, + mockStore(initialState), + ); + const button = getByRole('button'); + expect(stopQuery).toHaveBeenCalledTimes(0); + fireEvent.click(button); + await waitFor(() => expect(stopQuery).toHaveBeenCalledTimes(1)); +}); diff --git a/superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx b/superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx index 9da467685b49..9a94fb81c3c9 100644 --- a/superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx +++ b/superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx @@ -20,26 +20,22 @@ import React, { useMemo } from 'react'; import { t, styled, useTheme } from '@superset-ui/core'; import { Menu } from 'src/components/Menu'; -import Button, { ButtonProps } from 'src/components/Button'; +import Button from 'src/components/Button'; import Icons from 'src/components/Icons'; -import { - DropdownButton, - DropdownButtonProps, -} from 'src/components/DropdownButton'; +import { DropdownButton } from 'src/components/DropdownButton'; import { detectOS } from 'src/utils/common'; +import { QueryButtonProps } from 'src/SqlLab/types'; +import useQueryEditor from 'src/SqlLab/hooks/useQueryEditor'; -interface Props { +export interface RunQueryActionButtonProps { + queryEditorId: string; allowAsync: boolean; queryState?: string; runQuery: (c?: boolean) => void; - selectedText?: string; stopQuery: () => void; - sql: string; overlayCreateAsMenu: typeof Menu | null; } -type QueryButtonProps = DropdownButtonProps | ButtonProps; - const buildText = ( shouldShowStopButton: boolean, selectedText: string | undefined, @@ -80,24 +76,27 @@ const StyledButton = styled.span` } span[name='caret-down'] { display: flex; - margin-right: ${({ theme }) => theme.gridUnit * -2}px; + margin-left: ${({ theme }) => theme.gridUnit * 1}px; } } `; const RunQueryActionButton = ({ allowAsync = false, + queryEditorId, queryState, - selectedText, - sql = '', overlayCreateAsMenu, runQuery, stopQuery, -}: Props) => { +}: RunQueryActionButtonProps) => { const theme = useTheme(); - const userOS = detectOS(); + const { selectedText, sql } = useQueryEditor(queryEditorId, [ + 'selectedText', + 'sql', + ]); + const shouldShowStopBtn = !!queryState && ['running', 'pending'].indexOf(queryState) > -1; @@ -105,7 +104,10 @@ const RunQueryActionButton = ({ ? (DropdownButton as React.FC) : Button; - const isDisabled = !sql.trim(); + const sqlContent = selectedText || sql || ''; + const isDisabled = + !sqlContent || + !sqlContent.replace(/(\/\*[^*]*\*\/)|(\/\/[^*]*)|(--[^.].*)/gm, '').trim(); const stopButtonTooltipText = useMemo( () => @@ -118,6 +120,7 @@ const RunQueryActionButton = ({ return ( <StyledButton> <ButtonComponent + data-test="run-query-action" onClick={() => onClick(shouldShowStopBtn, allowAsync, runQuery, stopQuery) } diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetActionButton/SaveDatasetActionButton.test.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetActionButton/SaveDatasetActionButton.test.tsx new file mode 100644 index 000000000000..316404e3e4f3 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/SaveDatasetActionButton/SaveDatasetActionButton.test.tsx @@ -0,0 +1,68 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; +import { Menu } from 'src/components/Menu'; +import SaveDatasetActionButton from 'src/SqlLab/components/SaveDatasetActionButton'; + +const overlayMenu = ( + <Menu> + <Menu.Item>Save dataset</Menu.Item> + </Menu> +); + +describe('SaveDatasetActionButton', () => { + test('renders a split save button', async () => { + render( + <SaveDatasetActionButton + setShowSave={() => true} + overlayMenu={overlayMenu} + />, + ); + + const saveBtn = screen.getByRole('button', { name: /save/i }); + const caretBtn = screen.getByRole('button', { name: /caret-down/i }); + + expect( + await screen.findByRole('button', { name: /save/i }), + ).toBeInTheDocument(); + expect(saveBtn).toBeVisible(); + expect(caretBtn).toBeVisible(); + }); + + test('renders a "save dataset" dropdown menu item when user clicks caret button', async () => { + render( + <SaveDatasetActionButton + setShowSave={() => true} + overlayMenu={overlayMenu} + />, + ); + + const caretBtn = screen.getByRole('button', { name: /caret-down/i }); + expect( + await screen.findByRole('button', { name: /caret-down/i }), + ).toBeInTheDocument(); + userEvent.click(caretBtn); + + const saveDatasetMenuItem = screen.getByText(/save dataset/i); + + expect(saveDatasetMenuItem).toBeInTheDocument(); + }); +}); diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetActionButton/index.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetActionButton/index.tsx new file mode 100644 index 000000000000..dbb25b138a58 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/SaveDatasetActionButton/index.tsx @@ -0,0 +1,85 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { t, useTheme, styled } from '@superset-ui/core'; +import Icons from 'src/components/Icons'; +import { DropdownButton } from 'src/components/DropdownButton'; +import Button from 'src/components/Button'; +import { DropdownButtonProps } from 'antd/lib/dropdown'; + +interface SaveDatasetActionButtonProps { + setShowSave: (arg0: boolean) => void; + overlayMenu: JSX.Element | null; +} + +const SaveDatasetActionButton = ({ + setShowSave, + overlayMenu, +}: SaveDatasetActionButtonProps) => { + const theme = useTheme(); + + const StyledDropdownButton = styled( + DropdownButton as React.FC<DropdownButtonProps>, + )` + &.ant-dropdown-button button.ant-btn.ant-btn-default { + &:first-of-type { + width: ${theme.gridUnit * 16}px; + } + font-weight: ${theme.gridUnit * 150}; + background-color: ${theme.colors.primary.light4}; + color: ${theme.colors.primary.dark1}; + &:nth-child(2) { + &:before, + &:hover:before { + border-left: 2px solid ${theme.colors.primary.dark2}; + } + } + } + span[name='caret-down'] { + margin-left: ${theme.gridUnit * 1}px; + color: ${theme.colors.primary.dark2}; + } + `; + + return !overlayMenu ? ( + <Button + onClick={() => setShowSave(true)} + buttonStyle="primary" + css={{ width: theme.gridUnit * 25 }} + > + {t('Save')} + </Button> + ) : ( + <StyledDropdownButton + onClick={() => setShowSave(true)} + overlay={overlayMenu} + icon={ + <Icons.CaretDown + iconColor={theme.colors.grayscale.light5} + name="caret-down" + /> + } + trigger={['click']} + > + {t('Save')} + </StyledDropdownButton> + ); +}; + +export default SaveDatasetActionButton; diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal/SaveDatasetModal.test.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal/SaveDatasetModal.test.tsx index c35b5eb2b602..f707998d1df6 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal/SaveDatasetModal.test.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal/SaveDatasetModal.test.tsx @@ -17,25 +17,43 @@ * under the License. */ import React from 'react'; -import { QueryResponse, testQuery } from '@superset-ui/core'; +import * as reactRedux from 'react-redux'; +import { render, screen, cleanup, waitFor } from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; +import fetchMock from 'fetch-mock'; import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; -import { render, screen } from 'spec/helpers/testing-library'; +import { user, testQuery, mockdatasets } from 'src/SqlLab/fixtures'; const mockedProps = { visible: true, onHide: () => {}, buttonTextOnSave: 'Save', buttonTextOnOverwrite: 'Overwrite', - datasource: testQuery as QueryResponse, + datasource: testQuery, }; -describe('SaveDatasetModal RTL', () => { +fetchMock.get('glob:*/api/v1/dataset?*', { + result: mockdatasets, + dataset_count: 3, +}); + +jest.useFakeTimers(); + +// Mock the user +const useSelectorMock = jest.spyOn(reactRedux, 'useSelector'); +beforeEach(() => { + useSelectorMock.mockClear(); + cleanup(); +}); + +describe('SaveDatasetModal', () => { it('renders a "Save as new" field', () => { render(<SaveDatasetModal {...mockedProps} />, { useRedux: true }); const saveRadioBtn = screen.getByRole('radio', { name: /save as new unimportant/i, }); + const fieldLabel = screen.getByText(/save as new/i); const inputField = screen.getByRole('textbox'); const inputFieldText = screen.getByDisplayValue(/unimportant/i); @@ -50,7 +68,7 @@ describe('SaveDatasetModal RTL', () => { render(<SaveDatasetModal {...mockedProps} />, { useRedux: true }); const overwriteRadioBtn = screen.getByRole('radio', { - name: /overwrite existing select or type dataset name/i, + name: /overwrite existing/i, }); const fieldLabel = screen.getByText(/overwrite existing/i); const inputField = screen.getByRole('combobox'); @@ -62,15 +80,99 @@ describe('SaveDatasetModal RTL', () => { expect(placeholderText).toBeVisible(); }); - it('renders a save button', () => { + it('renders a close button', () => { + render(<SaveDatasetModal {...mockedProps} />, { useRedux: true }); + + expect(screen.getByRole('button', { name: /close/i })).toBeVisible(); + }); + + it('renders a save button when "Save as new" is selected', () => { render(<SaveDatasetModal {...mockedProps} />, { useRedux: true }); + // "Save as new" is selected when the modal opens by default expect(screen.getByRole('button', { name: /save/i })).toBeVisible(); }); - it('renders a close button', () => { + it('renders an overwrite button when "Overwrite existing" is selected', () => { + render(<SaveDatasetModal {...mockedProps} />, { useRedux: true }); + + // Click the overwrite radio button to reveal the overwrite confirmation and back buttons + const overwriteRadioBtn = screen.getByRole('radio', { + name: /overwrite existing/i, + }); + userEvent.click(overwriteRadioBtn); + + expect(screen.getByRole('button', { name: /overwrite/i })).toBeVisible(); + }); + + it('renders the overwrite button as disabled until an existing dataset is selected', async () => { + useSelectorMock.mockReturnValue({ ...user }); render(<SaveDatasetModal {...mockedProps} />, { useRedux: true }); + // Click the overwrite radio button + const overwriteRadioBtn = screen.getByRole('radio', { + name: /overwrite existing/i, + }); + userEvent.click(overwriteRadioBtn); + + // Overwrite confirmation button should be disabled at this point + const overwriteConfirmationBtn = screen.getByRole('button', { + name: /overwrite/i, + }); + expect(overwriteConfirmationBtn).toBeDisabled(); + + // Click the overwrite select component + const select = screen.getByRole('combobox', { name: /existing dataset/i })!; + userEvent.click(select); + + await waitFor(() => + expect(screen.queryByText('Loading...')).not.toBeVisible(), + ); + + // Select the first "existing dataset" from the listbox + const option = screen.getAllByText('coolest table 0')[1]; + userEvent.click(option); + + // Overwrite button should now be enabled + expect(overwriteConfirmationBtn).toBeEnabled(); + }); + + it('renders a confirm overwrite screen when overwrite is clicked', async () => { + useSelectorMock.mockReturnValue({ ...user }); + render(<SaveDatasetModal {...mockedProps} />, { useRedux: true }); + + // Click the overwrite radio button + const overwriteRadioBtn = screen.getByRole('radio', { + name: /overwrite existing/i, + }); + userEvent.click(overwriteRadioBtn); + + // Click the overwrite select component + const select = screen.getByRole('combobox', { name: /existing dataset/i }); + userEvent.click(select); + + await waitFor(() => + expect(screen.queryByText('Loading...')).not.toBeVisible(), + ); + + // Select the first "existing dataset" from the listbox + const option = screen.getAllByText('coolest table 0')[1]; + userEvent.click(option); + + // Click the overwrite button to access the confirmation screen + const overwriteConfirmationBtn = screen.getByRole('button', { + name: /overwrite/i, + }); + userEvent.click(overwriteConfirmationBtn); + + // Overwrite screen text + expect(screen.getByText(/save or overwrite dataset/i)).toBeVisible(); + expect( + screen.getByText(/are you sure you want to overwrite this dataset\?/i), + ).toBeVisible(); + // Overwrite screen buttons expect(screen.getByRole('button', { name: /close/i })).toBeVisible(); + expect(screen.getByRole('button', { name: /back/i })).toBeVisible(); + expect(screen.getByRole('button', { name: /overwrite/i })).toBeVisible(); }); }); diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx index 94b67a6fb309..949323b9aa75 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx @@ -17,9 +17,9 @@ * under the License. */ -import React, { FunctionComponent, useState } from 'react'; +import React, { useCallback, useState } from 'react'; import { Radio } from 'src/components/Radio'; -import { AutoComplete, RadioChangeEvent } from 'src/components'; +import { RadioChangeEvent, AsyncSelect } from 'src/components'; import { Input } from 'src/components/Input'; import StyledModal from 'src/components/Modal'; import Button from 'src/components/Button'; @@ -27,10 +27,10 @@ import { styled, t, SupersetClient, - makeApi, JsonResponse, JsonObject, QueryResponse, + QueryFormData, } from '@superset-ui/core'; import { useSelector, useDispatch } from 'react-redux'; import moment from 'moment'; @@ -42,12 +42,45 @@ import { DatasetRadioState, EXPLORE_CHART_DEFAULT, DatasetOwner, - DatasetOptionAutocomplete, SqlLabExploreRootState, getInitialState, - ExploreDatasource, + SqlLabRootState, } from 'src/SqlLab/types'; -import { exploreChart } from 'src/explore/exploreUtils'; +import { mountExploreUrl } from 'src/explore/exploreUtils'; +import { postFormData } from 'src/explore/exploreUtils/formData'; +import { URL_PARAMS } from 'src/constants'; +import { SelectValue } from 'antd/lib/select'; +import { isEmpty, isString } from 'lodash'; + +interface QueryDatabase { + id?: number; +} + +export type ExploreQuery = QueryResponse & { + database?: QueryDatabase | null | undefined; +}; + +export interface ISimpleColumn { + name?: string | null; + type?: string | null; + is_dttm?: boolean | null; +} + +export type Database = { + backend: string; + id: number; + parameter: object; +}; + +export interface ISaveableDatasource { + columns: ISimpleColumn[]; + name: string; + dbId: number; + sql: string; + templateParams?: string | object | null; + schema?: string | null; + database?: Database; +} interface SaveDatasetModalProps { visible: boolean; @@ -55,7 +88,9 @@ interface SaveDatasetModalProps { buttonTextOnSave: string; buttonTextOnOverwrite: string; modalDescription?: string; - datasource: ExploreDatasource; + datasource: ISaveableDatasource; + openWindow?: boolean; + formData?: Omit<QueryFormData, 'datasource'>; } const Styles = styled.div` @@ -67,8 +102,8 @@ const Styles = styled.div` width: 401px; } .sdm-autocomplete { - margin-left: 8px; width: 401px; + align-self: center; } .sdm-radio { display: block; @@ -79,6 +114,10 @@ const Styles = styled.div` .sdm-overwrite-msg { margin: 7px; } + .sdm-overwrite-container { + flex: 1 1 auto; + display: flex; + } `; const updateDataset = async ( @@ -106,76 +145,101 @@ const updateDataset = async ( return data.json.result; }; -// eslint-disable-next-line no-empty-pattern -export const SaveDatasetModal: FunctionComponent<SaveDatasetModalProps> = ({ +const UNTITLED = t('Untitled Dataset'); + +export const SaveDatasetModal = ({ visible, onHide, buttonTextOnSave, buttonTextOnOverwrite, modalDescription, datasource, -}) => { - const query = datasource as QueryResponse; + openWindow = true, + formData = {}, +}: SaveDatasetModalProps) => { + const defaultVizType = useSelector<SqlLabRootState, string>( + state => state.common?.conf?.DEFAULT_VIZ_TYPE || 'table', + ); + const getDefaultDatasetName = () => - `${query.tab} ${moment().format('MM/DD/YYYY HH:mm:ss')}`; + `${datasource?.name || UNTITLED} ${moment().format('MM/DD/YYYY HH:mm:ss')}`; const [datasetName, setDatasetName] = useState(getDefaultDatasetName()); const [newOrOverwrite, setNewOrOverwrite] = useState( DatasetRadioState.SAVE_NEW, ); const [shouldOverwriteDataset, setShouldOverwriteDataset] = useState(false); - const [userDatasetOptions, setUserDatasetOptions] = useState< - DatasetOptionAutocomplete[] - >([]); const [datasetToOverwrite, setDatasetToOverwrite] = useState< Record<string, any> >({}); - const [autocompleteValue, setAutocompleteValue] = useState(''); + const [selectedDatasetToOverwrite, setSelectedDatasetToOverwrite] = useState< + SelectValue | undefined + >(undefined); const user = useSelector<SqlLabExploreRootState, User>(user => getInitialState(user), ); const dispatch = useDispatch<(dispatch: any) => Promise<JsonObject>>(); + const createWindow = (url: string) => { + if (openWindow) { + window.open(url, '_blank', 'noreferrer'); + } else { + window.location.href = url; + } + }; + const formDataWithDefaults = { + ...EXPLORE_CHART_DEFAULT, + ...(formData || {}), + }; const handleOverwriteDataset = async () => { - await updateDataset( - query.dbId, - datasetToOverwrite.datasetId, - query.sql, - query.results.selected_columns.map( - (d: { name: string; type: string; is_dttm: boolean }) => ({ - column_name: d.name, - type: d.type, - is_dttm: d.is_dttm, - }), + // if user wants to overwrite a dataset we need to prompt them + if (!shouldOverwriteDataset) { + setShouldOverwriteDataset(true); + return; + } + const [, key] = await Promise.all([ + updateDataset( + datasource?.dbId, + datasetToOverwrite?.datasetid, + datasource?.sql, + datasource?.columns?.map( + (d: { name: string; type: string; is_dttm: boolean }) => ({ + column_name: d.name, + type: d.type, + is_dttm: d.is_dttm, + }), + ), + datasetToOverwrite?.owners?.map((o: DatasetOwner) => o.id), + true, ), - datasetToOverwrite.owners.map((o: DatasetOwner) => o.id), - true, - ); + postFormData(datasetToOverwrite.datasetid, 'table', { + ...formDataWithDefaults, + datasource: `${datasetToOverwrite.datasetid}__table`, + ...(defaultVizType === 'table' && { + all_columns: datasource?.columns?.map(column => column.name), + }), + }), + ]); + + const url = mountExploreUrl(null, { + [URL_PARAMS.formDataKey.name]: key, + }); + createWindow(url); setShouldOverwriteDataset(false); - setDatasetToOverwrite({}); setDatasetName(getDefaultDatasetName()); - - exploreChart({ - ...EXPLORE_CHART_DEFAULT, - datasource: `${datasetToOverwrite.datasetId}__table`, - all_columns: query.results.selected_columns.map( - (d: { name: string; type: string; is_dttm: boolean }) => d.name, - ), - }); + onHide(); }; - const getUserDatasets = async (searchText = '') => { - // Making sure that autocomplete input has a value before rendering the dropdown - // Transforming the userDatasetsOwned data for SaveModalComponent) - const { userId } = user; - if (userId) { + const loadDatasetOverwriteOptions = useCallback( + async (input = '') => { + const { userId } = user; const queryParams = rison.encode({ filters: [ { col: 'table_name', opr: 'ct', - value: searchText, + value: input, }, { col: 'owners', @@ -187,85 +251,78 @@ export const SaveDatasetModal: FunctionComponent<SaveDatasetModalProps> = ({ order_direction: 'desc', }); - const response = await makeApi({ - method: 'GET', - endpoint: '/api/v1/dataset', - })(`q=${queryParams}`); - - return response.result.map( - (r: { table_name: string; id: number; owners: [DatasetOwner] }) => ({ - value: r.table_name, - datasetId: r.id, - owners: r.owners, - }), - ); - } - - return null; - }; + return SupersetClient.get({ + endpoint: `/api/v1/dataset?q=${queryParams}`, + }).then(response => ({ + data: response.json.result.map( + (r: { table_name: string; id: number; owners: [DatasetOwner] }) => ({ + value: r.table_name, + label: r.table_name, + datasetid: r.id, + owners: r.owners, + }), + ), + totalCount: response.json.count, + })); + }, + [user], + ); const handleSaveInDataset = () => { - // if user wants to overwrite a dataset we need to prompt them - if (newOrOverwrite === DatasetRadioState.OVERWRITE_DATASET) { - setShouldOverwriteDataset(true); - return; - } - - const selectedColumns = query.results.selected_columns || []; + const selectedColumns = datasource?.columns ?? []; // The filters param is only used to test jinja templates. // Remove the special filters entry from the templateParams // before saving the dataset. - if (query.templateParams) { - const p = JSON.parse(query.templateParams); + let templateParams; + if (isString(datasource?.templateParams)) { + const p = JSON.parse(datasource.templateParams); /* eslint-disable-next-line no-underscore-dangle */ if (p._filters) { /* eslint-disable-next-line no-underscore-dangle */ delete p._filters; // eslint-disable-next-line no-param-reassign - query.templateParams = JSON.stringify(p); + templateParams = JSON.stringify(p); } } dispatch( createDatasource({ - schema: query.schema, - sql: query.sql, - dbId: query.dbId, - templateParams: query.templateParams, + schema: datasource.schema, + sql: datasource.sql, + dbId: datasource.dbId || datasource?.database?.id, + templateParams, datasourceName: datasetName, columns: selectedColumns, }), ) - .then((data: { table_id: number }) => { - exploreChart({ + .then((data: { table_id: number }) => + postFormData(data.table_id, 'table', { + ...formDataWithDefaults, datasource: `${data.table_id}__table`, - metrics: [], - groupby: [], - time_range: 'No filter', - viz_type: 'table', - all_columns: selectedColumns.map(c => c.name), - row_limit: 1000, + ...(defaultVizType === 'table' && { + all_columns: selectedColumns.map(column => column.name), + }), + }), + ) + .then((key: string) => { + const url = mountExploreUrl(null, { + [URL_PARAMS.formDataKey.name]: key, }); + createWindow(url); + setDatasetName(getDefaultDatasetName()); + onHide(); }) .catch(() => { addDangerToast(t('An error occurred saving dataset')); }); - - setDatasetName(getDefaultDatasetName()); - onHide(); }; - const handleSaveDatasetModalSearch = async (searchText: string) => { - const userDatasetsOwned = await getUserDatasets(searchText); - setUserDatasetOptions(userDatasetsOwned); + const handleOverwriteDatasetOption = (value: SelectValue, option: any) => { + setDatasetToOverwrite(option); + setSelectedDatasetToOverwrite(value); }; - const handleOverwriteDatasetOption = ( - _data: string, - option: Record<string, any>, - ) => setDatasetToOverwrite(option); - const handleDatasetNameChange = (e: React.FormEvent<HTMLInputElement>) => { // @ts-expect-error setDatasetName(e.target.value); @@ -280,12 +337,11 @@ export const SaveDatasetModal: FunctionComponent<SaveDatasetModalProps> = ({ (newOrOverwrite === DatasetRadioState.SAVE_NEW && datasetName.length === 0) || (newOrOverwrite === DatasetRadioState.OVERWRITE_DATASET && - Object.keys(datasetToOverwrite).length === 0 && - autocompleteValue.length === 0); + isEmpty(selectedDatasetToOverwrite)); const filterAutocompleteOption = ( inputValue: string, - option: { value: string; datasetId: number }, + option: { value: string; datasetid: number }, ) => option.value.toLowerCase().includes(inputValue.toLowerCase()); return ( @@ -295,7 +351,7 @@ export const SaveDatasetModal: FunctionComponent<SaveDatasetModalProps> = ({ onHide={onHide} footer={ <> - {!shouldOverwriteDataset && ( + {newOrOverwrite === DatasetRadioState.SAVE_NEW && ( <Button disabled={disableSaveAndExploreBtn} buttonStyle="primary" @@ -304,9 +360,11 @@ export const SaveDatasetModal: FunctionComponent<SaveDatasetModalProps> = ({ {buttonTextOnSave} </Button> )} - {shouldOverwriteDataset && ( + {newOrOverwrite === DatasetRadioState.OVERWRITE_DATASET && ( <> - <Button onClick={handleOverwriteCancel}>Back</Button> + {shouldOverwriteDataset && ( + <Button onClick={handleOverwriteCancel}>{t('Back')}</Button> + )} <Button className="md" buttonStyle="primary" @@ -336,28 +394,30 @@ export const SaveDatasetModal: FunctionComponent<SaveDatasetModalProps> = ({ {t('Save as new')} <Input className="sdm-input" - defaultValue={datasetName} + value={datasetName} onChange={handleDatasetNameChange} disabled={newOrOverwrite !== 1} /> </Radio> - <Radio className="sdm-radio" value={2}> - {t('Overwrite existing')} - <AutoComplete - className="sdm-autocomplete" - options={userDatasetOptions} - onSelect={handleOverwriteDatasetOption} - onSearch={handleSaveDatasetModalSearch} - onChange={value => { - setDatasetToOverwrite({}); - setAutocompleteValue(value); - }} - placeholder={t('Select or type dataset name')} - filterOption={filterAutocompleteOption} - disabled={newOrOverwrite !== 2} - value={autocompleteValue} - /> - </Radio> + <div className="sdm-overwrite-container"> + <Radio className="sdm-radio" value={2}> + {t('Overwrite existing')} + </Radio> + <div className="sdm-autocomplete"> + <AsyncSelect + allowClear + showSearch + placeholder={t('Select or type dataset name')} + ariaLabel={t('Existing dataset')} + onChange={handleOverwriteDatasetOption} + options={input => loadDatasetOverwriteOptions(input)} + value={selectedDatasetToOverwrite} + filterOption={filterAutocompleteOption} + disabled={newOrOverwrite !== 2} + getPopupContainer={() => document.body} + /> + </div> + </div> </Radio.Group> </div> )} diff --git a/superset-frontend/src/SqlLab/components/SaveQuery/SaveQuery.test.jsx b/superset-frontend/src/SqlLab/components/SaveQuery/SaveQuery.test.jsx deleted file mode 100644 index 76f6ca8260a6..000000000000 --- a/superset-frontend/src/SqlLab/components/SaveQuery/SaveQuery.test.jsx +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import { shallow } from 'enzyme'; -import * as sinon from 'sinon'; -import SaveQuery from 'src/SqlLab/components/SaveQuery'; -import Modal from 'src/components/Modal'; -import Button from 'src/components/Button'; -import { FormItem } from 'src/components/Form'; - -describe('SavedQuery', () => { - const mockedProps = { - query: { - dbId: 1, - schema: 'main', - sql: 'SELECT * FROM t', - }, - defaultLabel: 'untitled', - animation: false, - }; - it('is valid', () => { - expect(React.isValidElement(<SaveQuery />)).toBe(true); - }); - it('is valid with props', () => { - expect(React.isValidElement(<SaveQuery {...mockedProps} />)).toBe(true); - }); - it('has a Modal', () => { - const wrapper = shallow(<SaveQuery {...mockedProps} />); - expect(wrapper.find(Modal)).toExist(); - }); - // TODO: eschutho convert test to RTL - // eslint-disable-next-line jest/no-disabled-tests - it.skip('has a cancel button', () => { - const wrapper = shallow(<SaveQuery {...mockedProps} />); - const modal = wrapper.find(Modal); - - expect(modal.find('[data-test="cancel-query"]')).toHaveLength(1); - }); - it('has 2 FormItem', () => { - const wrapper = shallow(<SaveQuery {...mockedProps} />); - const modal = wrapper.find(Modal); - - expect(modal.find(FormItem)).toHaveLength(2); - }); - // eslint-disable-next-line jest/no-disabled-tests - it.skip('has a save button if this is a new query', () => { - const saveSpy = sinon.spy(); - const wrapper = shallow(<SaveQuery {...mockedProps} onSave={saveSpy} />); - const modal = wrapper.find(Modal); - - expect(modal.find(Button)).toHaveLength(2); - modal.find(Button).at(0).simulate('click'); - expect(saveSpy.calledOnce).toBe(true); - }); - // eslint-disable-next-line jest/no-disabled-tests - it.skip('has an update button if this is an existing query', () => { - const updateSpy = sinon.spy(); - const props = { - ...mockedProps, - query: { - ...mockedProps.query, - remoteId: '42', - }, - }; - const wrapper = shallow(<SaveQuery {...props} onUpdate={updateSpy} />); - const modal = wrapper.find(Modal); - - expect(modal.find(Button)).toHaveLength(3); - modal.find(Button).at(0).simulate('click'); - expect(updateSpy.calledOnce).toBe(true); - }); -}); diff --git a/superset-frontend/src/SqlLab/components/SaveQuery/SaveQuery.test.tsx b/superset-frontend/src/SqlLab/components/SaveQuery/SaveQuery.test.tsx new file mode 100644 index 000000000000..f321a54ec4db --- /dev/null +++ b/superset-frontend/src/SqlLab/components/SaveQuery/SaveQuery.test.tsx @@ -0,0 +1,225 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import configureStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; +import SaveQuery from 'src/SqlLab/components/SaveQuery'; +import { initialState, databases } from 'src/SqlLab/fixtures'; + +const mockedProps = { + queryEditorId: '123', + animation: false, + database: databases.result[0], + onUpdate: () => {}, + onSave: () => {}, + saveQueryWarning: null, + columns: [], +}; + +const mockState = { + ...initialState, + sqlLab: { + ...initialState.sqlLab, + queryEditors: [ + { + id: mockedProps.queryEditorId, + dbId: 1, + schema: 'main', + sql: 'SELECT * FROM t', + }, + ], + }, +}; + +const splitSaveBtnProps = { + ...mockedProps, + database: { + ...mockedProps.database, + allows_virtual_table_explore: true, + }, +}; + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); + +describe('SavedQuery', () => { + it('renders a non-split save button when allows_virtual_table_explore is not enabled', () => { + render(<SaveQuery {...mockedProps} />, { + useRedux: true, + store: mockStore(mockState), + }); + + const saveBtn = screen.getByRole('button', { name: /save/i }); + + expect(saveBtn).toBeVisible(); + }); + + it('renders a save query modal when user clicks save button', () => { + render(<SaveQuery {...mockedProps} />, { + useRedux: true, + store: mockStore(mockState), + }); + + const saveBtn = screen.getByRole('button', { name: /save/i }); + userEvent.click(saveBtn); + + const saveQueryModalHeader = screen.getByRole('heading', { + name: /save query/i, + }); + + expect(saveQueryModalHeader).toBeVisible(); + }); + + it('renders the save query modal UI', () => { + render(<SaveQuery {...mockedProps} />, { + useRedux: true, + store: mockStore(mockState), + }); + + const saveBtn = screen.getByRole('button', { name: /save/i }); + userEvent.click(saveBtn); + + const closeBtn = screen.getByRole('button', { name: /close/i }); + const saveQueryModalHeader = screen.getByRole('heading', { + name: /save query/i, + }); + const nameLabel = screen.getByText(/name/i); + const descriptionLabel = screen.getByText(/description/i); + const textBoxes = screen.getAllByRole('textbox'); + const nameTextbox = textBoxes[0]; + const descriptionTextbox = textBoxes[1]; + // There are now two save buttons, the initial save button and the modal save button + const saveBtns = screen.getAllByRole('button', { name: /save/i }); + const cancelBtn = screen.getByRole('button', { name: /cancel/i }); + + expect(closeBtn).toBeVisible(); + expect(saveQueryModalHeader).toBeVisible(); + expect(nameLabel).toBeVisible(); + expect(descriptionLabel).toBeVisible(); + expect(textBoxes.length).toBe(2); + expect(nameTextbox).toBeVisible(); + expect(descriptionTextbox).toBeVisible(); + expect(saveBtns.length).toBe(2); + expect(saveBtns[0]).toBeVisible(); + expect(saveBtns[1]).toBeVisible(); + expect(cancelBtn).toBeVisible(); + }); + + it('renders a "save as new" and "update" button if query already exists', () => { + render(<SaveQuery {...mockedProps} />, { + useRedux: true, + store: mockStore({ + ...mockState, + sqlLab: { + ...mockState.sqlLab, + unsavedQueryEditor: { + id: mockedProps.queryEditorId, + remoteId: '42', + }, + }, + }), + }); + + const saveBtn = screen.getByRole('button', { name: /save/i }); + userEvent.click(saveBtn); + + const saveAsNewBtn = screen.getByRole('button', { name: /save as new/i }); + const updateBtn = screen.getByRole('button', { name: /update/i }); + + expect(saveAsNewBtn).toBeVisible(); + expect(updateBtn).toBeVisible(); + }); + + it('renders a split save button when allows_virtual_table_explore is enabled', async () => { + render(<SaveQuery {...splitSaveBtnProps} />, { + useRedux: true, + store: mockStore(mockState), + }); + + await waitFor(() => { + const saveBtn = screen.getByRole('button', { name: /save/i }); + const caretBtn = screen.getByRole('button', { name: /caret-down/i }); + + expect(saveBtn).toBeVisible(); + expect(caretBtn).toBeVisible(); + }); + }); + + it('renders a save dataset modal when user clicks "save dataset" menu item', async () => { + render(<SaveQuery {...splitSaveBtnProps} />, { + useRedux: true, + store: mockStore(mockState), + }); + + await waitFor(() => { + const caretBtn = screen.getByRole('button', { name: /caret-down/i }); + userEvent.click(caretBtn); + + const saveDatasetMenuItem = screen.getByText(/save dataset/i); + userEvent.click(saveDatasetMenuItem); + }); + + const saveDatasetHeader = screen.getByText(/save or overwrite dataset/i); + + expect(saveDatasetHeader).toBeVisible(); + }); + + it('renders the save dataset modal UI', async () => { + render(<SaveQuery {...splitSaveBtnProps} />, { + useRedux: true, + store: mockStore(mockState), + }); + + await waitFor(() => { + const caretBtn = screen.getByRole('button', { name: /caret-down/i }); + userEvent.click(caretBtn); + + const saveDatasetMenuItem = screen.getByText(/save dataset/i); + userEvent.click(saveDatasetMenuItem); + }); + + const closeBtn = screen.getByRole('button', { name: /close/i }); + const saveDatasetHeader = screen.getByText(/save or overwrite dataset/i); + const saveRadio = screen.getByRole('radio', { + name: /save as new untitled/i, + }); + const saveLabel = screen.getByText(/save as new/i); + const saveTextbox = screen.getByRole('textbox'); + const overwriteRadio = screen.getByRole('radio', { + name: /overwrite existing/i, + }); + const overwriteLabel = screen.getByText(/overwrite existing/i); + const overwriteCombobox = screen.getByRole('combobox'); + const overwritePlaceholderText = screen.getByText( + /select or type dataset name/i, + ); + + expect(saveDatasetHeader).toBeVisible(); + expect(closeBtn).toBeVisible(); + expect(saveRadio).toBeVisible(); + expect(saveLabel).toBeVisible(); + expect(saveTextbox).toBeVisible(); + expect(overwriteRadio).toBeVisible(); + expect(overwriteLabel).toBeVisible(); + expect(overwriteCombobox).toBeVisible(); + expect(overwritePlaceholderText).toBeVisible(); + }); +}); diff --git a/superset-frontend/src/SqlLab/components/SaveQuery/index.tsx b/superset-frontend/src/SqlLab/components/SaveQuery/index.tsx index 2b57ce0cdcc5..684c4ed39c42 100644 --- a/superset-frontend/src/SqlLab/components/SaveQuery/index.tsx +++ b/superset-frontend/src/SqlLab/components/SaveQuery/index.tsx @@ -16,14 +16,38 @@ * specific language governing permissions and limitations * under the License. */ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useMemo } from 'react'; import { Row, Col } from 'src/components'; import { Input, TextArea } from 'src/components/Input'; import { t, styled } from '@superset-ui/core'; import Button from 'src/components/Button'; +import { Menu } from 'src/components/Menu'; import { Form, FormItem } from 'src/components/Form'; import Modal from 'src/components/Modal'; -import Icons from 'src/components/Icons'; +import SaveDatasetActionButton from 'src/SqlLab/components/SaveDatasetActionButton'; +import { + SaveDatasetModal, + ISaveableDatasource, +} from 'src/SqlLab/components/SaveDatasetModal'; +import { getDatasourceAsSaveableDataset } from 'src/utils/datasourceUtils'; +import useQueryEditor from 'src/SqlLab/hooks/useQueryEditor'; +import { QueryEditor } from 'src/SqlLab/types'; + +interface SaveQueryProps { + queryEditorId: string; + columns: ISaveableDatasource['columns']; + onSave: (arg0: QueryPayload, id: string) => void; + onUpdate: (arg0: QueryPayload, id: string) => void; + saveQueryWarning: string | null; + database: Record<string, any>; +} + +type QueryPayload = { + name: string; + description?: string; + id?: string; + remoteId?: number; +} & Pick<QueryEditor, 'dbId' | 'schema' | 'sql'>; const Styles = styled.span` span[role='img'] { @@ -37,76 +61,77 @@ const Styles = styled.span` } `; -interface SaveQueryProps { - query: any; - defaultLabel: string; - onSave: (arg0: QueryPayload) => void; - onUpdate: (arg0: QueryPayload) => void; - saveQueryWarning: string | null; -} - -type QueryPayload = { - autorun: boolean; - dbId: number; - description?: string; - id?: string; - latestQueryId: string; - queryLimit: number; - remoteId: number; - schema: string; - schemaOptions: Array<{ - label: string; - title: string; - value: string; - }>; - selectedText: string | null; - sql: string; - tableOptions: Array<{ - label: string; - schema: string; - title: string; - type: string; - value: string; - }>; - title: string; -}; - -export default function SaveQuery({ - query, - defaultLabel = t('Undefined'), +const SaveQuery = ({ + queryEditorId, onSave = () => {}, onUpdate, saveQueryWarning = null, -}: SaveQueryProps) { + database, + columns, +}: SaveQueryProps) => { + const queryEditor = useQueryEditor(queryEditorId, [ + 'autorun', + 'name', + 'description', + 'remoteId', + 'dbId', + 'latestQueryId', + 'queryLimit', + 'schema', + 'schemaOptions', + 'selectedText', + 'sql', + 'tableOptions', + 'templateParams', + ]); + const query = useMemo( + () => ({ + ...queryEditor, + columns, + }), + [queryEditor, columns], + ); + const defaultLabel = query.name || query.description || t('Undefined'); const [description, setDescription] = useState<string>( query.description || '', ); const [label, setLabel] = useState<string>(defaultLabel); const [showSave, setShowSave] = useState<boolean>(false); + const [showSaveDatasetModal, setShowSaveDatasetModal] = useState(false); const isSaved = !!query.remoteId; + const canExploreDatabase = !!database?.allows_virtual_table_explore; + + const overlayMenu = ( + <Menu> + <Menu.Item onClick={() => setShowSaveDatasetModal(true)}> + {t('Save dataset')} + </Menu.Item> + </Menu> + ); const queryPayload = () => ({ - ...query, - title: label, + name: label, description, + dbId: query.dbId ?? 0, + sql: query.sql, + schema: query.schema, + templateParams: query.templateParams, + remoteId: query?.remoteId || undefined, }); useEffect(() => { - if (!isSaved) { - setLabel(defaultLabel); - } + if (!isSaved) setLabel(defaultLabel); }, [defaultLabel]); - const close = () => { - setShowSave(false); - }; + + const close = () => setShowSave(false); const onSaveWrapper = () => { - onSave(queryPayload()); + onSave(queryPayload(), query.id); close(); }; const onUpdateWrapper = () => { - onUpdate(queryPayload()); + onUpdate(queryPayload(), query.id); close(); }; @@ -118,10 +143,6 @@ export default function SaveQuery({ setDescription(e.target.value); }; - const toggleSave = () => { - setShowSave(!showSave); - }; - const renderModalBody = () => ( <Form layout="vertical"> <Row> @@ -161,10 +182,17 @@ export default function SaveQuery({ return ( <Styles className="SaveQuery"> - <Button buttonSize="small" onClick={toggleSave}> - <Icons.Save iconSize="xl" /> - {isSaved ? t('Save') : t('Save as')} - </Button> + <SaveDatasetActionButton + setShowSave={setShowSave} + overlayMenu={canExploreDatabase ? overlayMenu : null} + /> + <SaveDatasetModal + visible={showSaveDatasetModal} + onHide={() => setShowSaveDatasetModal(false)} + buttonTextOnSave={t('Save & Explore')} + buttonTextOnOverwrite={t('Overwrite & Explore')} + datasource={getDatasourceAsSaveableDataset(query)} + /> <Modal className="save-query-modal" onHandledPrimaryAction={onSaveWrapper} @@ -173,7 +201,7 @@ export default function SaveQuery({ width="620px" show={showSave} title={<h4>{t('Save query')}</h4>} - footer={[ + footer={ <> <Button onClick={close} data-test="cancel-query" cta> {t('Cancel')} @@ -196,11 +224,13 @@ export default function SaveQuery({ {t('Update')} </Button> )} - </>, - ]} + </> + } > {renderModalBody()} </Modal> </Styles> ); -} +}; + +export default SaveQuery; diff --git a/superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx b/superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx index facb23461c35..d0a381638d9a 100644 --- a/superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx +++ b/superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx @@ -16,20 +16,18 @@ * specific language governing permissions and limitations * under the License. */ -import React, { FunctionComponent, useState } from 'react'; +import React, { FunctionComponent, useState, useRef } from 'react'; import SchemaForm, { FormProps, FormValidation } from 'react-jsonschema-form'; import { Row, Col } from 'src/components'; import { Input, TextArea } from 'src/components/Input'; import { t, styled } from '@superset-ui/core'; import * as chrono from 'chrono-node'; -import ModalTrigger from 'src/components/ModalTrigger'; +import ModalTrigger, { ModalTriggerRef } from 'src/components/ModalTrigger'; import { Form, FormItem } from 'src/components/Form'; import Button from 'src/components/Button'; +import getBootstrapData from 'src/utils/getBootstrapData'; -const appContainer = document.getElementById('app'); -const bootstrapData = JSON.parse( - appContainer?.getAttribute('data-bootstrap') || '{}', -); +const bootstrapData = getBootstrapData(); const scheduledQueriesConf = bootstrapData?.common?.conf?.SCHEDULED_QUERIES; const validators = { @@ -101,7 +99,9 @@ export const StyledButtonComponent = styled(Button)` color: ${theme.colors.grayscale.dark2}; font-size: 14px; font-weight: ${theme.typography.weights.normal}; + margin-left: 0; &:disabled { + margin-left: 0; background: none; color: ${theme.colors.grayscale.dark2}; &:hover { @@ -143,7 +143,7 @@ const ScheduleQueryButton: FunctionComponent<ScheduleQueryButtonProps> = ({ const [description, setDescription] = useState(''); const [label, setLabel] = useState(defaultLabel); const [showSchedule, setShowSchedule] = useState(false); - let saveModal: ModalTrigger | null; + const saveModal: ModalTriggerRef | null = useRef() as ModalTriggerRef; const onScheduleSubmit = ({ formData, @@ -159,7 +159,7 @@ const ScheduleQueryButton: FunctionComponent<ScheduleQueryButtonProps> = ({ extra_json: JSON.stringify({ schedule_info: formData }), }; onSchedule(query); - saveModal?.close(); + saveModal?.current?.close(); }; const renderModalBody = () => ( @@ -197,7 +197,7 @@ const ScheduleQueryButton: FunctionComponent<ScheduleQueryButtonProps> = ({ <StyledJsonSchema> <SchemaForm schema={getJSONSchema()} - uiSchema={getUISchema} + uiSchema={getUISchema()} onSubmit={onScheduleSubmit} validate={getValidator()} > @@ -206,7 +206,7 @@ const ScheduleQueryButton: FunctionComponent<ScheduleQueryButtonProps> = ({ htmlType="submit" css={{ float: 'right' }} > - Submit + {t('Submit')} </Button> </SchemaForm> </StyledJsonSchema> @@ -225,9 +225,7 @@ const ScheduleQueryButton: FunctionComponent<ScheduleQueryButtonProps> = ({ return ( <span className="ScheduleQueryButton"> <ModalTrigger - ref={ref => { - saveModal = ref; - }} + ref={saveModal} modalTitle={t('Schedule query')} modalBody={renderModalBody()} triggerNode={ diff --git a/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/ShareSqlLabQuery.test.jsx b/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/ShareSqlLabQuery.test.tsx similarity index 65% rename from superset-frontend/src/SqlLab/components/ShareSqlLabQuery/ShareSqlLabQuery.test.jsx rename to superset-frontend/src/SqlLab/components/ShareSqlLabQuery/ShareSqlLabQuery.test.tsx index 8a68d386a56a..6e9775c3a5ba 100644 --- a/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/ShareSqlLabQuery.test.jsx +++ b/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/ShareSqlLabQuery.test.tsx @@ -28,29 +28,69 @@ import '@testing-library/jest-dom/extend-expect'; import userEvent from '@testing-library/user-event'; import * as utils from 'src/utils/common'; import ShareSqlLabQuery from 'src/SqlLab/components/ShareSqlLabQuery'; +import { initialState } from 'src/SqlLab/fixtures'; const mockStore = configureStore([thunk]); -const store = mockStore({}); -let isFeatureEnabledMock; +const defaultProps = { + queryEditorId: 'qe1', + addDangerToast: jest.fn(), +}; +const mockQueryEditor = { + id: defaultProps.queryEditorId, + dbId: 0, + name: 'query title', + schema: 'query_schema', + autorun: false, + sql: 'SELECT * FROM ...', + remoteId: 999, +}; +const disabled = { + id: 'disabledEditorId', + remoteId: undefined, +}; + +const mockState = { + ...initialState, + sqlLab: { + ...initialState.sqlLab, + queryEditors: [mockQueryEditor, disabled], + }, +}; +const store = mockStore(mockState); +let isFeatureEnabledMock: jest.SpyInstance; -const standardProvider = ({ children }) => ( +const standardProvider: React.FC = ({ children }) => ( <ThemeProvider theme={supersetTheme}> <Provider store={store}>{children}</Provider> </ThemeProvider> ); -const defaultProps = { - queryEditor: { - dbId: 0, - title: 'query title', - schema: 'query_schema', - autorun: false, - sql: 'SELECT * FROM ...', - remoteId: 999, - }, - addDangerToast: jest.fn(), +const unsavedQueryEditor = { + id: defaultProps.queryEditorId, + dbId: 9888, + name: 'query title changed', + schema: 'query_schema_updated', + sql: 'SELECT * FROM Updated Limit 100', + autorun: true, + templateParams: '{ "my_value": "foo" }', }; +const standardProviderWithUnsaved: React.FC = ({ children }) => ( + <ThemeProvider theme={supersetTheme}> + <Provider + store={mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor, + }, + })} + > + {children} + </Provider> + </ThemeProvider> +); + describe('ShareSqlLabQuery', () => { const storeQueryUrl = 'glob:*/kv/store/'; const storeQueryMockId = '123'; @@ -73,7 +113,7 @@ describe('ShareSqlLabQuery', () => { }); afterAll(() => { - isFeatureEnabledMock.restore(); + isFeatureEnabledMock.mockReset(); }); it('calls storeQuery() with the query when getCopyUrl() is called', async () => { @@ -83,9 +123,26 @@ describe('ShareSqlLabQuery', () => { }); }); const button = screen.getByRole('button'); + const { id, remoteId, ...expected } = mockQueryEditor; + const storeQuerySpy = jest.spyOn(utils, 'storeQuery'); + userEvent.click(button); + expect(storeQuerySpy.mock.calls).toHaveLength(1); + expect(storeQuerySpy).toBeCalledWith(expected); + storeQuerySpy.mockRestore(); + }); + + it('calls storeQuery() with unsaved changes', async () => { + await act(async () => { + render(<ShareSqlLabQuery {...defaultProps} />, { + wrapper: standardProviderWithUnsaved, + }); + }); + const button = screen.getByRole('button'); + const { id, ...expected } = unsavedQueryEditor; const storeQuerySpy = jest.spyOn(utils, 'storeQuery'); userEvent.click(button); expect(storeQuerySpy.mock.calls).toHaveLength(1); + expect(storeQuerySpy).toBeCalledWith(expected); storeQuerySpy.mockRestore(); }); }); @@ -98,7 +155,7 @@ describe('ShareSqlLabQuery', () => { }); afterAll(() => { - isFeatureEnabledMock.restore(); + isFeatureEnabledMock.mockReset(); }); it('does not call storeQuery() with the query when getCopyUrl() is called and feature is not enabled', async () => { @@ -116,10 +173,7 @@ describe('ShareSqlLabQuery', () => { it('button is disabled and there is a request to save the query', async () => { const updatedProps = { - queryEditor: { - ...defaultProps.queryEditor, - remoteId: undefined, - }, + queryEditorId: disabled.id, }; render(<ShareSqlLabQuery {...updatedProps} />, { diff --git a/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx b/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx index 5f473c642fd3..73a774964678 100644 --- a/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx +++ b/superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx @@ -25,10 +25,10 @@ import CopyToClipboard from 'src/components/CopyToClipboard'; import { storeQuery } from 'src/utils/common'; import { getClientErrorObject } from 'src/utils/getClientErrorObject'; import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; -import { QueryEditor } from 'src/SqlLab/types'; +import useQueryEditor from 'src/SqlLab/hooks/useQueryEditor'; -interface ShareSqlLabQueryPropTypes { - queryEditor: QueryEditor; +interface ShareSqlLabQueryProps { + queryEditorId: string; addDangerToast: (msg: string) => void; } @@ -42,15 +42,25 @@ const StyledIcon = styled(Icons.Link)` } `; -function ShareSqlLabQuery({ - queryEditor, +const ShareSqlLabQuery = ({ + queryEditorId, addDangerToast, -}: ShareSqlLabQueryPropTypes) { +}: ShareSqlLabQueryProps) => { const theme = useTheme(); + const { dbId, name, schema, autorun, sql, remoteId, templateParams } = + useQueryEditor(queryEditorId, [ + 'dbId', + 'name', + 'schema', + 'autorun', + 'sql', + 'remoteId', + 'templateParams', + ]); + const getCopyUrlForKvStore = (callback: Function) => { - const { dbId, title, schema, autorun, sql } = queryEditor; - const sharedQuery = { dbId, title, schema, autorun, sql }; + const sharedQuery = { dbId, name, schema, autorun, sql, templateParams }; return storeQuery(sharedQuery) .then(shortUrl => { @@ -66,10 +76,10 @@ function ShareSqlLabQuery({ const getCopyUrlForSavedQuery = (callback: Function) => { let savedQueryToastContent; - if (queryEditor.remoteId) { + if (remoteId) { savedQueryToastContent = `${ window.location.origin + window.location.pathname - }?savedQueryId=${queryEditor.remoteId}`; + }?savedQueryId=${remoteId}`; callback(savedQueryToastContent); } else { savedQueryToastContent = t('Please save the query to enable sharing'); @@ -101,8 +111,7 @@ function ShareSqlLabQuery({ }; const canShare = - !!queryEditor.remoteId || - isFeatureEnabled(FeatureFlag.SHARE_QUERIES_VIA_KV_STORE); + !!remoteId || isFeatureEnabled(FeatureFlag.SHARE_QUERIES_VIA_KV_STORE); return ( <> @@ -117,6 +126,6 @@ function ShareSqlLabQuery({ )} </> ); -} +}; export default withToasts(ShareSqlLabQuery); diff --git a/superset-frontend/src/SqlLab/components/SouthPane/SouthPane.test.jsx b/superset-frontend/src/SqlLab/components/SouthPane/SouthPane.test.jsx index 6dfca33dbc06..519e729c4184 100644 --- a/superset-frontend/src/SqlLab/components/SouthPane/SouthPane.test.jsx +++ b/superset-frontend/src/SqlLab/components/SouthPane/SouthPane.test.jsx @@ -19,123 +19,120 @@ import React from 'react'; import configureStore from 'redux-mock-store'; import thunk from 'redux-thunk'; -import { styledShallow as shallow } from 'spec/helpers/theming'; -import { render, screen, act } from 'spec/helpers/testing-library'; -import SouthPaneContainer from 'src/SqlLab/components/SouthPane/state'; -import ResultSet from 'src/SqlLab/components/ResultSet'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import SouthPane from 'src/SqlLab/components/SouthPane'; import '@testing-library/jest-dom/extend-expect'; import { STATUS_OPTIONS } from 'src/SqlLab/constants'; -import { initialState } from 'src/SqlLab/fixtures'; -import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; - -const NOOP = () => {}; +import { initialState, table, defaultQueryEditor } from 'src/SqlLab/fixtures'; const mockedProps = { - editorQueries: [ - { - cached: false, - changedOn: Date.now(), - db: 'main', - dbId: 1, - id: 'LCly_kkIN', - startDttm: Date.now(), - }, - { - cached: false, - changedOn: 1559238500401, - db: 'main', - dbId: 1, - id: 'lXJa7F9_r', - startDttm: 1559238500401, - }, - { - cached: false, - changedOn: 1559238506925, - db: 'main', - dbId: 1, - id: '2g2_iRFMl', - startDttm: 1559238506925, - }, - { - cached: false, - changedOn: 1559238516395, - db: 'main', - dbId: 1, - id: 'erWdqEWPm', - startDttm: 1559238516395, - }, - ], + queryEditorId: defaultQueryEditor.id, latestQueryId: 'LCly_kkIN', - dataPreviewQueries: [], - actions: {}, - activeSouthPaneTab: '', height: 1, displayLimit: 1, - databases: {}, - offline: false, + defaultQueryLimit: 100, }; const mockedEmptyProps = { - editorQueries: [], + queryEditorId: 'random_id', latestQueryId: '', - dataPreviewQueries: [], - actions: { - queryEditorSetAndSaveSql: NOOP, - cloneQueryToNewTab: NOOP, - fetchQueryResults: NOOP, - clearQueryResults: NOOP, - removeQuery: NOOP, - setActiveSouthPaneTab: NOOP, - }, - activeSouthPaneTab: '', height: 100, - databases: '', - offline: false, displayLimit: 100, - user: UserWithPermissionsAndRoles, defaultQueryLimit: 100, }; +const latestQueryProgressMsg = 'LATEST QUERY MESSAGE - LCly_kkIN'; + const middlewares = [thunk]; const mockStore = configureStore(middlewares); -const store = mockStore(initialState); -const setup = (overrides = {}) => ( - <SouthPaneContainer store={store} {...mockedProps} {...overrides} /> -); - -describe('SouthPane - Enzyme', () => { - const getWrapper = () => shallow(setup()).dive(); +const store = mockStore({ + ...initialState, + sqlLab: { + ...initialState, + offline: false, + tables: [ + { + ...table, + dataPreviewQueryId: '2g2_iRFMl', + queryEditorId: defaultQueryEditor.id, + }, + ], + databases: {}, + queries: { + LCly_kkIN: { + cached: false, + changedOn: Date.now(), + db: 'main', + dbId: 1, + id: 'LCly_kkIN', + startDttm: Date.now(), + sqlEditorId: defaultQueryEditor.id, + extra: { progress: latestQueryProgressMsg }, + }, + lXJa7F9_r: { + cached: false, + changedOn: 1559238500401, + db: 'main', + dbId: 1, + id: 'lXJa7F9_r', + startDttm: 1559238500401, + sqlEditorId: defaultQueryEditor.id, + }, + '2g2_iRFMl': { + cached: false, + changedOn: 1559238506925, + db: 'main', + dbId: 1, + id: '2g2_iRFMl', + startDttm: 1559238506925, + sqlEditorId: defaultQueryEditor.id, + }, + erWdqEWPm: { + cached: false, + changedOn: 1559238516395, + db: 'main', + dbId: 1, + id: 'erWdqEWPm', + startDttm: 1559238516395, + sqlEditorId: defaultQueryEditor.id, + }, + }, + }, +}); +const setup = (props, store) => + render(<SouthPane {...props} />, { + useRedux: true, + ...(store && { store }), + }); - let wrapper; +describe('SouthPane', () => { + const renderAndWait = (props, store) => + waitFor(async () => setup(props, store)); - it('should render offline when the state is offline', () => { - wrapper = getWrapper().dive(); - wrapper.setProps({ offline: true }); - expect(wrapper.childAt(0).text()).toBe(STATUS_OPTIONS.offline); + it('Renders an empty state for results', async () => { + await renderAndWait(mockedEmptyProps, store); + const emptyStateText = screen.getByText(/run a query to display results/i); + expect(emptyStateText).toBeVisible(); }); - it('should pass latest query down to ResultSet component', () => { - wrapper = getWrapper().dive(); - expect(wrapper.find(ResultSet)).toExist(); - expect(wrapper.find(ResultSet).props().query.id).toEqual( - mockedProps.latestQueryId, + it('should render offline when the state is offline', async () => { + await renderAndWait( + mockedEmptyProps, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + offline: true, + }, + }), ); - }); -}); -describe('SouthPane - RTL', () => { - const renderAndWait = overrides => { - const mounted = act(async () => { - render(setup(overrides)); - }); + expect(screen.getByText(STATUS_OPTIONS.offline)).toBeVisible(); + }); - return mounted; - }; - it('Renders an empty state for results', async () => { - await renderAndWait(mockedEmptyProps); + it('should pass latest query down to ResultSet component', async () => { + await renderAndWait(mockedProps, store); - const emptyStateText = screen.getByText(/run a query to display results/i); - - expect(emptyStateText).toBeVisible(); + expect(screen.getByText(latestQueryProgressMsg)).toBeVisible(); }); }); diff --git a/superset-frontend/src/SqlLab/components/SouthPane/index.tsx b/superset-frontend/src/SqlLab/components/SouthPane/index.tsx index ddcd972f9828..0b389dfb3983 100644 --- a/superset-frontend/src/SqlLab/components/SouthPane/index.tsx +++ b/superset-frontend/src/SqlLab/components/SouthPane/index.tsx @@ -17,48 +17,38 @@ * under the License. */ import React, { createRef } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; import shortid from 'shortid'; import Alert from 'src/components/Alert'; import Tabs from 'src/components/Tabs'; import { EmptyStateMedium } from 'src/components/EmptyState'; import { t, styled } from '@superset-ui/core'; +import { setActiveSouthPaneTab } from 'src/SqlLab/actions/sqlLab'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; import Label from 'src/components/Label'; -import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; +import { SqlLabRootState } from 'src/SqlLab/types'; import QueryHistory from '../QueryHistory'; import ResultSet from '../ResultSet'; import { STATUS_OPTIONS, STATE_TYPE_MAP, LOCALSTORAGE_MAX_QUERY_AGE_MS, + STATUS_OPTIONS_LOCALIZED, } from '../../constants'; const TAB_HEIGHT = 140; /* editorQueries are queries executed by users passed from SqlEditor component - dataPrebiewQueries are all queries executed for preview of table data (from SqlEditorLeft) + dataPreviewQueries are all queries executed for preview of table data (from SqlEditorLeft) */ -interface SouthPanePropTypes { - editorQueries: any[]; +export interface SouthPaneProps { + queryEditorId: string; latestQueryId?: string; - dataPreviewQueries: any[]; - actions: { - queryEditorSetAndSaveSql: Function; - cloneQueryToNewTab: Function; - fetchQueryResults: Function; - clearQueryResults: Function; - removeQuery: Function; - setActiveSouthPaneTab: Function; - }; - activeSouthPaneTab?: string; height: number; - databases: Record<string, any>; - offline?: boolean; displayLimit: number; - user: UserWithPermissionsAndRoles; defaultQueryLimit: number; } @@ -110,27 +100,53 @@ const StyledEmptyStateWrapper = styled.div` } `; -export default function SouthPane({ - editorQueries, +const SouthPane = ({ + queryEditorId, latestQueryId, - dataPreviewQueries, - actions, - activeSouthPaneTab = 'Results', height, - databases, - offline = false, displayLimit, - user, defaultQueryLimit, -}: SouthPanePropTypes) { +}: SouthPaneProps) => { + const dispatch = useDispatch(); + + const { editorQueries, dataPreviewQueries, databases, offline, user } = + useSelector(({ sqlLab }: SqlLabRootState) => { + const { databases, offline, user, queries, tables } = sqlLab; + const dataPreviewQueries = tables + .filter( + ({ dataPreviewQueryId, queryEditorId: qeId }) => + dataPreviewQueryId && + queryEditorId === qeId && + queries[dataPreviewQueryId], + ) + .map(({ name, dataPreviewQueryId }) => ({ + ...queries[dataPreviewQueryId], + tableName: name, + })); + const editorQueries = Object.values(queries).filter( + ({ sqlEditorId }) => sqlEditorId === queryEditorId, + ); + return { + editorQueries, + dataPreviewQueries, + databases, + offline: offline ?? false, + user, + }; + }); + + const activeSouthPaneTab = + useSelector<SqlLabRootState, string>( + state => state.sqlLab.activeSouthPaneTab as string, + ) ?? 'Results'; const innerTabContentHeight = height - TAB_HEIGHT; const southPaneRef = createRef<HTMLDivElement>(); const switchTab = (id: string) => { - actions.setActiveSouthPaneTab(id); + dispatch(setActiveSouthPaneTab(id)); }; const renderOfflineStatus = () => ( <Label className="m-r-3" type={STATE_TYPE_MAP[STATUS_OPTIONS.offline]}> - {STATUS_OPTIONS.offline} + {STATUS_OPTIONS_LOCALIZED.offline} </Label> ); @@ -164,10 +180,8 @@ export default function SouthPane({ if (Date.now() - latestQuery.startDttm <= LOCALSTORAGE_MAX_QUERY_AGE_MS) { results = ( <ResultSet - showControls search query={latestQuery} - actions={actions} user={user} height={innerTabContentHeight + EXTRA_HEIGHT_RESULTS} database={databases[latestQuery.dbId]} @@ -199,7 +213,6 @@ export default function SouthPane({ query={query} visualize={false} csv={false} - actions={actions} cache user={user} height={innerTabContentHeight} @@ -211,7 +224,12 @@ export default function SouthPane({ return offline ? ( renderOfflineStatus() ) : ( - <StyledPane className="SouthPane" height={height} ref={southPaneRef}> + <StyledPane + data-test="south-pane" + className="SouthPane" + height={height} + ref={southPaneRef} + > <Tabs activeKey={activeSouthPaneTab} className="SouthPaneTabs" @@ -226,7 +244,6 @@ export default function SouthPane({ <Tabs.TabPane tab={t('Query history')} key="History"> <QueryHistory queries={editorQueries} - actions={actions} displayLimit={displayLimit} latestQueryId={latestQueryId} /> @@ -235,4 +252,6 @@ export default function SouthPane({ </Tabs> </StyledPane> ); -} +}; + +export default SouthPane; diff --git a/superset-frontend/src/SqlLab/components/SqlEditor/SqlEditor.test.jsx b/superset-frontend/src/SqlLab/components/SqlEditor/SqlEditor.test.jsx index d946c675cc8c..9dcc37fdd188 100644 --- a/superset-frontend/src/SqlLab/components/SqlEditor/SqlEditor.test.jsx +++ b/superset-frontend/src/SqlLab/components/SqlEditor/SqlEditor.test.jsx @@ -18,6 +18,7 @@ */ import React from 'react'; import { mount } from 'enzyme'; +import { fireEvent, render, waitFor } from 'spec/helpers/testing-library'; import { supersetTheme, ThemeProvider } from '@superset-ui/core'; import { Provider } from 'react-redux'; import thunk from 'redux-thunk'; @@ -29,49 +30,69 @@ import { SQL_TOOLBAR_HEIGHT, } from 'src/SqlLab/constants'; import AceEditorWrapper from 'src/SqlLab/components/AceEditorWrapper'; -import ConnectedSouthPane from 'src/SqlLab/components/SouthPane/state'; +import SouthPane from 'src/SqlLab/components/SouthPane'; import SqlEditor from 'src/SqlLab/components/SqlEditor'; -import SqlEditorLeftBar from 'src/SqlLab/components/SqlEditorLeftBar'; -import { AntdDropdown } from 'src/components'; -import { - queryEditorSetFunctionNames, - queryEditorSetSelectedText, - queryEditorSetSchemaOptions, -} from 'src/SqlLab/actions/sqlLab'; -import { EmptyStateBig } from 'src/components/EmptyState'; +import QueryProvider from 'src/views/QueryProvider'; import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint'; -import { initialState, queries, table } from 'src/SqlLab/fixtures'; +import { + initialState, + queries, + table, + defaultQueryEditor, +} from 'src/SqlLab/fixtures'; + +jest.mock('src/components/AsyncAceEditor', () => ({ + ...jest.requireActual('src/components/AsyncAceEditor'), + FullSQLEditor: props => ( + <div data-test="react-ace">{JSON.stringify(props)}</div> + ), +})); +jest.mock('src/SqlLab/components/SqlEditorLeftBar', () => () => ( + <div data-test="mock-sql-editor-left-bar" /> +)); const MOCKED_SQL_EDITOR_HEIGHT = 500; fetchMock.get('glob:*/api/v1/database/*', { result: [] }); +fetchMock.get('glob:*/api/v1/database/*/tables/*', { options: [] }); +fetchMock.post('glob:*/sqllab/execute/*', { result: [] }); const middlewares = [thunk]; const mockStore = configureStore(middlewares); -const store = mockStore(initialState); +const store = mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + databases: { + dbid1: { + allow_ctas: false, + allow_cvas: false, + allow_dml: false, + allow_file_upload: false, + allow_run_async: false, + backend: 'postgresql', + database_name: 'examples', + expose_in_sqllab: true, + force_ctas_schema: null, + id: 1, + }, + }, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + dbId: 'dbid1', + }, + }, +}); + +const setup = (props = {}, store) => + render(<SqlEditor {...props} />, { + useRedux: true, + ...(store && { store }), + }); describe('SqlEditor', () => { const mockedProps = { - actions: { - queryEditorSetFunctionNames, - queryEditorSetSelectedText, - queryEditorSetSchemaOptions, - addDangerToast: jest.fn(), - }, - database: { - allow_ctas: false, - allow_cvas: false, - allow_dml: false, - allow_file_upload: false, - allow_multi_schema_metadata_fetch: false, - allow_run_async: false, - backend: 'postgresql', - database_name: 'examples', - expose_in_sqllab: true, - force_ctas_schema: null, - id: 1, - }, - queryEditorId: initialState.sqlLab.queryEditors[0].id, + queryEditor: initialState.sqlLab.queryEditors[0], latestQuery: queries[0], tables: [table], getHeight: () => '100px', @@ -84,36 +105,120 @@ describe('SqlEditor', () => { const buildWrapper = (props = {}) => mount( - <Provider store={store}> - <SqlEditor {...mockedProps} {...props} /> - </Provider>, + <QueryProvider> + <Provider store={store}> + <SqlEditor {...mockedProps} {...props} /> + </Provider> + </QueryProvider>, { wrappingComponent: ThemeProvider, wrappingComponentProps: { theme: supersetTheme }, }, ); - it('does not render SqlEditor if no db selected', () => { - const database = {}; - const updatedProps = { ...mockedProps, database }; - const wrapper = buildWrapper(updatedProps); - expect(wrapper.find(EmptyStateBig)).toExist(); + it('does not render SqlEditor if no db selected', async () => { + const queryEditor = initialState.sqlLab.queryEditors[1]; + const { findByText } = setup({ ...mockedProps, queryEditor }, store); + expect( + await findByText('Select a database to write a query'), + ).toBeInTheDocument(); }); + it('render a SqlEditorLeftBar', async () => { - const wrapper = buildWrapper(); - await waitForComponentToPaint(wrapper); - expect(wrapper.find(SqlEditorLeftBar)).toExist(); + const { getByTestId } = setup(mockedProps, store); + await waitFor(() => + expect(getByTestId('mock-sql-editor-left-bar')).toBeInTheDocument(), + ); }); + it('render an AceEditorWrapper', async () => { - const wrapper = buildWrapper(); - await waitForComponentToPaint(wrapper); - expect(wrapper.find(AceEditorWrapper)).toExist(); + const { findByTestId } = setup(mockedProps, store); + expect(await findByTestId('react-ace')).toBeInTheDocument(); }); + + it('renders sql from unsaved change', async () => { + const expectedSql = 'SELECT updated_column\nFROM updated_table\nWHERE'; + const { findByTestId } = setup( + mockedProps, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + databases: { + dbid1: { + allow_ctas: false, + allow_cvas: false, + allow_dml: false, + allow_file_upload: false, + allow_run_async: false, + backend: 'postgresql', + database_name: 'examples', + expose_in_sqllab: true, + force_ctas_schema: null, + id: 1, + }, + }, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + dbId: 'dbid1', + sql: expectedSql, + }, + }, + }), + ); + + expect(await findByTestId('react-ace')).toHaveTextContent( + JSON.stringify({ value: expectedSql }).slice(1, -1), + ); + }); + it('render a SouthPane', async () => { - const wrapper = buildWrapper(); - await waitForComponentToPaint(wrapper); - expect(wrapper.find(ConnectedSouthPane)).toExist(); + const { findByText } = setup(mockedProps, store); + expect( + await findByText(/run a query to display results/i), + ).toBeInTheDocument(); }); + + it('runs query action with ctas false', async () => { + const expectedStore = mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + databases: { + 5667: { + allow_ctas: false, + allow_cvas: false, + allow_dml: false, + allow_file_upload: false, + allow_run_async: true, + backend: 'postgresql', + database_name: 'examples', + expose_in_sqllab: true, + force_ctas_schema: null, + id: 1, + }, + }, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + dbId: 5667, + sql: 'expectedSql', + }, + }, + }); + const { findByTestId } = setup(mockedProps, expectedStore); + const runButton = await findByTestId('run-query-action'); + fireEvent.click(runButton); + await waitFor(() => + expect(expectedStore.getActions()).toContainEqual({ + type: 'START_QUERY', + query: expect.objectContaining({ + ctas: false, + sqlEditorId: defaultQueryEditor.id, + }), + }), + ); + }); + // TODO eschutho convert tests to RTL // eslint-disable-next-line jest/no-disabled-tests it.skip('does not overflow the editor window', async () => { @@ -121,12 +226,13 @@ describe('SqlEditor', () => { await waitForComponentToPaint(wrapper); const totalSize = parseFloat(wrapper.find(AceEditorWrapper).props().height) + - wrapper.find(ConnectedSouthPane).props().height + + wrapper.find(SouthPane).props().height + SQL_TOOLBAR_HEIGHT + SQL_EDITOR_GUTTER_MARGIN * 2 + SQL_EDITOR_GUTTER_HEIGHT; expect(totalSize).toEqual(MOCKED_SQL_EDITOR_HEIGHT); }); + // eslint-disable-next-line jest/no-disabled-tests it.skip('does not overflow the editor window after resizing', async () => { const wrapper = buildWrapper(); @@ -134,17 +240,18 @@ describe('SqlEditor', () => { await waitForComponentToPaint(wrapper); const totalSize = parseFloat(wrapper.find(AceEditorWrapper).props().height) + - wrapper.find(ConnectedSouthPane).props().height + + wrapper.find(SouthPane).props().height + SQL_TOOLBAR_HEIGHT + SQL_EDITOR_GUTTER_MARGIN * 2 + SQL_EDITOR_GUTTER_HEIGHT; expect(totalSize).toEqual(450); }); + it('render a Limit Dropdown', async () => { const defaultQueryLimit = 101; const updatedProps = { ...mockedProps, defaultQueryLimit }; - const wrapper = buildWrapper(updatedProps); - await waitForComponentToPaint(wrapper); - expect(wrapper.find(AntdDropdown)).toExist(); + const { findByText } = setup(updatedProps, store); + fireEvent.click(await findByText('LIMIT:')); + expect(await findByText('10 000')).toBeInTheDocument(); }); }); diff --git a/superset-frontend/src/SqlLab/components/SqlEditor/index.jsx b/superset-frontend/src/SqlLab/components/SqlEditor/index.jsx index d40ca65f2f66..2a93cad2706e 100644 --- a/superset-frontend/src/SqlLab/components/SqlEditor/index.jsx +++ b/superset-frontend/src/SqlLab/components/SqlEditor/index.jsx @@ -18,36 +18,41 @@ */ /* eslint-disable jsx-a11y/anchor-is-valid */ /* eslint-disable jsx-a11y/no-static-element-interactions */ -import React from 'react'; +import React, { + useState, + useEffect, + useMemo, + useRef, + useCallback, +} from 'react'; import { CSSTransition } from 'react-transition-group'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; +import { useDispatch, useSelector } from 'react-redux'; import PropTypes from 'prop-types'; import Split from 'react-split'; -import { t, styled, withTheme } from '@superset-ui/core'; +import { css, t, styled, useTheme } from '@superset-ui/core'; import debounce from 'lodash/debounce'; import throttle from 'lodash/throttle'; -import StyledModal from 'src/components/Modal'; +import Modal from 'src/components/Modal'; import Mousetrap from 'mousetrap'; import Button from 'src/components/Button'; import Timer from 'src/components/Timer'; +import ResizableSidebar from 'src/components/ResizableSidebar'; import { AntdDropdown, AntdSwitch } from 'src/components'; import { Input } from 'src/components/Input'; import { Menu } from 'src/components/Menu'; import Icons from 'src/components/Icons'; import { detectOS } from 'src/utils/common'; import { - addQueryEditor, + addNewQueryEditor, CtasEnum, estimateQueryCost, persistEditorHeight, postStopQuery, queryEditorSetAutorun, - queryEditorSetQueryLimit, queryEditorSetSql, queryEditorSetAndSaveSql, queryEditorSetTemplateParams, - runQuery, + runQueryFromSqlEditor, saveQuery, addSavedQueryToTabState, scheduleQuery, @@ -60,6 +65,13 @@ import { SQL_EDITOR_GUTTER_HEIGHT, SQL_EDITOR_GUTTER_MARGIN, SQL_TOOLBAR_HEIGHT, + SQL_EDITOR_LEFTBAR_WIDTH, + SQL_EDITOR_PADDING, + INITIAL_NORTH_PERCENT, + INITIAL_SOUTH_PERCENT, + SET_QUERY_EDITOR_SQL_DEBOUNCE_MS, + VALIDATION_DEBOUNCE_MS, + WINDOW_RESIZE_THROTTLE_MS, } from 'src/SqlLab/constants'; import { getItem, @@ -68,9 +80,10 @@ import { } from 'src/utils/localStorageHelpers'; import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; import { EmptyStateBig } from 'src/components/EmptyState'; +import getBootstrapData from 'src/utils/getBootstrapData'; import { isEmpty } from 'lodash'; import TemplateParamsEditor from '../TemplateParamsEditor'; -import ConnectedSouthPane from '../SouthPane/state'; +import SouthPane from '../SouthPane'; import SaveQuery from '../SaveQuery'; import ScheduleQueryButton from '../ScheduleQueryButton'; import EstimateQueryCostButton from '../EstimateQueryCostButton'; @@ -78,44 +91,13 @@ import ShareSqlLabQuery from '../ShareSqlLabQuery'; import SqlEditorLeftBar from '../SqlEditorLeftBar'; import AceEditorWrapper from '../AceEditorWrapper'; import RunQueryActionButton from '../RunQueryActionButton'; -import { newQueryTabName } from '../../utils/newQueryTabName'; - -const LIMIT_DROPDOWN = [10, 100, 1000, 10000, 100000]; -const SQL_EDITOR_PADDING = 10; -const INITIAL_NORTH_PERCENT = 30; -const INITIAL_SOUTH_PERCENT = 70; -const SET_QUERY_EDITOR_SQL_DEBOUNCE_MS = 2000; -const VALIDATION_DEBOUNCE_MS = 600; -const WINDOW_RESIZE_THROTTLE_MS = 100; - -const appContainer = document.getElementById('app'); -const bootstrapData = JSON.parse( - appContainer.getAttribute('data-bootstrap') || '{}', -); +import QueryLimitSelect from '../QueryLimitSelect'; + +const bootstrapData = getBootstrapData(); const validatorMap = bootstrapData?.common?.conf?.SQL_VALIDATORS_BY_ENGINE || {}; const scheduledQueriesConf = bootstrapData?.common?.conf?.SCHEDULED_QUERIES; -const LimitSelectStyled = styled.span` - ${({ theme }) => ` - .ant-dropdown-trigger { - align-items: center; - color: ${theme.colors.grayscale.dark2}; - display: flex; - font-size: 12px; - margin-right: ${theme.gridUnit * 2}px; - text-decoration: none; - span { - display: inline-block; - margin-right: ${theme.gridUnit * 2}px; - &:last-of-type: { - margin-right: ${theme.gridUnit * 4}px; - } - } - } - `} -`; - const StyledToolbar = styled.div` padding: ${({ theme }) => theme.gridUnit * 2}px; background: ${({ theme }) => theme.colors.grayscale.light5}; @@ -147,186 +129,187 @@ const StyledToolbar = styled.div` } `; -const propTypes = { - actions: PropTypes.object.isRequired, - database: PropTypes.object, - latestQuery: PropTypes.object, - tables: PropTypes.array.isRequired, - editorQueries: PropTypes.array.isRequired, - dataPreviewQueries: PropTypes.array.isRequired, - queryEditorId: PropTypes.string.isRequired, - hideLeftBar: PropTypes.bool, - defaultQueryLimit: PropTypes.number.isRequired, - maxRow: PropTypes.number.isRequired, - displayLimit: PropTypes.number.isRequired, - saveQueryWarning: PropTypes.string, - scheduleQueryWarning: PropTypes.string, -}; +const StyledSidebar = styled.div` + flex: 0 0 ${({ width }) => width}px; + width: ${({ width }) => width}px; + padding: ${({ theme, hide }) => (hide ? 0 : theme.gridUnit * 2.5)}px; + border-right: 1px solid + ${({ theme, hide }) => + hide ? 'transparent' : theme.colors.grayscale.light2}; +`; -const defaultProps = { - database: null, - latestQuery: null, - hideLeftBar: false, - scheduleQueryWarning: null, -}; +const StyledSqlEditor = styled.div` + ${({ theme }) => css` + display: flex; + flex-direction: row; + height: 100%; -class SqlEditor extends React.PureComponent { - constructor(props) { - super(props); - this.state = { - autorun: props.queryEditor.autorun, - ctas: '', - northPercent: props.queryEditor.northPercent || INITIAL_NORTH_PERCENT, - southPercent: props.queryEditor.southPercent || INITIAL_SOUTH_PERCENT, - autocompleteEnabled: getItem( - LocalStorageKeys.sqllab__is_autocomplete_enabled, - true, - ), - showCreateAsModal: false, - createAs: '', - showEmptyState: false, - }; - this.sqlEditorRef = React.createRef(); - this.northPaneRef = React.createRef(); - - this.elementStyle = this.elementStyle.bind(this); - this.onResizeStart = this.onResizeStart.bind(this); - this.onResizeEnd = this.onResizeEnd.bind(this); - this.canValidateQuery = this.canValidateQuery.bind(this); - this.runQuery = this.runQuery.bind(this); - this.setEmptyState = this.setEmptyState.bind(this); - this.stopQuery = this.stopQuery.bind(this); - this.saveQuery = this.saveQuery.bind(this); - this.onSqlChanged = this.onSqlChanged.bind(this); - this.setQueryEditorAndSaveSql = this.setQueryEditorAndSaveSql.bind(this); - this.setQueryEditorAndSaveSqlWithDebounce = debounce( - this.setQueryEditorAndSaveSql.bind(this), - SET_QUERY_EDITOR_SQL_DEBOUNCE_MS, - ); - this.queryPane = this.queryPane.bind(this); - this.getHotkeyConfig = this.getHotkeyConfig.bind(this); - this.renderQueryLimit = this.renderQueryLimit.bind(this); - this.getAceEditorAndSouthPaneHeights = - this.getAceEditorAndSouthPaneHeights.bind(this); - this.getSqlEditorHeight = this.getSqlEditorHeight.bind(this); - this.requestValidation = debounce( - this.requestValidation.bind(this), - VALIDATION_DEBOUNCE_MS, - ); - this.getQueryCostEstimate = this.getQueryCostEstimate.bind(this); - this.handleWindowResize = throttle( - this.handleWindowResize.bind(this), - WINDOW_RESIZE_THROTTLE_MS, - ); + .schemaPane { + transition: transform ${theme.transitionTiming}s ease-in-out; + } - this.onBeforeUnload = this.onBeforeUnload.bind(this); - this.renderDropdown = this.renderDropdown.bind(this); - } + .queryPane { + flex: 1 1 auto; + padding: ${theme.gridUnit * 2}px; + overflow-y: auto; + overflow-x: scroll; + } - UNSAFE_componentWillMount() { - if (this.state.autorun) { - this.setState({ autorun: false }); - this.props.queryEditorSetAutorun(this.props.queryEditor, false); - this.startQuery(); + .schemaPane-enter-done, + .schemaPane-exit { + transform: translateX(0); + z-index: 7; } - } - componentDidMount() { - // We need to measure the height of the sql editor post render to figure the height of - // the south pane so it gets rendered properly - // eslint-disable-next-line react/no-did-mount-set-state - const db = this.props.database; - this.setState({ height: this.getSqlEditorHeight() }); - if (!db || isEmpty(db)) { - this.setEmptyState(true); + .schemaPane-exit-active { + transform: translateX(-120%); + } + + .schemaPane-enter-active { + transform: translateX(0); + max-width: ${theme.gridUnit * 75}px; } - window.addEventListener('resize', this.handleWindowResize); - window.addEventListener('beforeunload', this.onBeforeUnload); + .schemaPane-enter, + .schemaPane-exit-done { + max-width: 0; + transform: translateX(-120%); + overflow: hidden; + } - // setup hotkeys - const hotkeys = this.getHotkeyConfig(); - hotkeys.forEach(keyConfig => { - Mousetrap.bind([keyConfig.key], keyConfig.func); - }); - } + .schemaPane-exit-done + .queryPane { + margin-left: 0; + } - componentWillUnmount() { - window.removeEventListener('resize', this.handleWindowResize); - window.removeEventListener('beforeunload', this.onBeforeUnload); - } + .gutter { + border-top: 1px solid ${theme.colors.grayscale.light2}; + border-bottom: 1px solid ${theme.colors.grayscale.light2}; + width: 3%; + margin: ${SQL_EDITOR_GUTTER_MARGIN}px 47%; + } - onResizeStart() { - // Set the heights on the ace editor and the ace content area after drag starts - // to smooth out the visual transition to the new heights when drag ends - document.getElementsByClassName('ace_content')[0].style.height = '100%'; - } + .gutter.gutter-vertical { + cursor: row-resize; + } + `} +`; + +const propTypes = { + tables: PropTypes.array.isRequired, + queryEditor: PropTypes.object.isRequired, + defaultQueryLimit: PropTypes.number.isRequired, + maxRow: PropTypes.number.isRequired, + displayLimit: PropTypes.number.isRequired, + saveQueryWarning: PropTypes.string, + scheduleQueryWarning: PropTypes.string, +}; + +const SqlEditor = ({ + tables, + queryEditor, + defaultQueryLimit, + maxRow, + displayLimit, + saveQueryWarning, + scheduleQueryWarning = null, +}) => { + const theme = useTheme(); + const dispatch = useDispatch(); + + const { database, latestQuery, hideLeftBar } = useSelector( + ({ sqlLab: { unsavedQueryEditor, databases, queries } }) => { + let { dbId, latestQueryId, hideLeftBar } = queryEditor; + if (unsavedQueryEditor.id === queryEditor.id) { + dbId = unsavedQueryEditor.dbId || dbId; + latestQueryId = unsavedQueryEditor.latestQueryId || latestQueryId; + hideLeftBar = unsavedQueryEditor.hideLeftBar || hideLeftBar; + } + return { + database: databases[dbId], + latestQuery: queries[latestQueryId], + hideLeftBar, + }; + }, + ); + + const [height, setHeight] = useState(0); + const [autorun, setAutorun] = useState(queryEditor.autorun); + const [ctas, setCtas] = useState(''); + const [northPercent, setNorthPercent] = useState( + queryEditor.northPercent || INITIAL_NORTH_PERCENT, + ); + const [southPercent, setSouthPercent] = useState( + queryEditor.southPercent || INITIAL_SOUTH_PERCENT, + ); + const [autocompleteEnabled, setAutocompleteEnabled] = useState( + getItem(LocalStorageKeys.sqllab__is_autocomplete_enabled, true), + ); + const [showCreateAsModal, setShowCreateAsModal] = useState(false); + const [createAs, setCreateAs] = useState(''); + const [showEmptyState, setShowEmptyState] = useState(false); - onResizeEnd([northPercent, southPercent]) { - this.setState({ northPercent, southPercent }); + const sqlEditorRef = useRef(null); + const northPaneRef = useRef(null); - if (this.northPaneRef.current && this.northPaneRef.current.clientHeight) { - this.props.persistEditorHeight( - this.props.queryEditor, - northPercent, - southPercent, + const startQuery = useCallback( + (ctasArg = false, ctas_method = CtasEnum.TABLE) => { + if (!database) { + return; + } + + dispatch( + runQueryFromSqlEditor( + database, + queryEditor, + defaultQueryLimit, + ctasArg ? ctas : '', + ctasArg, + ctas_method, + ), ); + dispatch(setActiveSouthPaneTab('Results')); + }, + [ctas, database, defaultQueryLimit, dispatch, queryEditor], + ); + + const stopQuery = useCallback(() => { + if (latestQuery && ['running', 'pending'].indexOf(latestQuery.state) >= 0) { + dispatch(postStopQuery(latestQuery)); } - } + return false; + }, [dispatch, latestQuery]); - onBeforeUnload(event) { - if ( - this.props.database?.extra_json?.cancel_query_on_windows_unload && - this.props.latestQuery?.state === 'running' - ) { - event.preventDefault(); - this.stopQuery(); + const runQuery = () => { + if (database) { + startQuery(); } - } + }; - onSqlChanged(sql) { - this.props.queryEditorSetSql(this.props.queryEditor, sql); - this.setQueryEditorAndSaveSqlWithDebounce(sql); - // Request server-side validation of the query text - if (this.canValidateQuery()) { - // NB. requestValidation is debounced - this.requestValidation(sql); + useEffect(() => { + if (autorun) { + setAutorun(false); + dispatch(queryEditorSetAutorun(queryEditor, false)); + startQuery(); } - } + }, [autorun, dispatch, queryEditor, startQuery]); // One layer of abstraction for easy spying in unit tests - getSqlEditorHeight() { - return this.sqlEditorRef.current - ? this.sqlEditorRef.current.clientHeight - SQL_EDITOR_PADDING * 2 + const getSqlEditorHeight = () => + sqlEditorRef.current + ? sqlEditorRef.current.clientHeight - SQL_EDITOR_PADDING * 2 : 0; - } - - // Return the heights for the ace editor and the south pane as an object - // given the height of the sql editor, north pane percent and south pane percent. - getAceEditorAndSouthPaneHeights(height, northPercent, southPercent) { - return { - aceEditorHeight: - (height * northPercent) / 100 - - (SQL_EDITOR_GUTTER_HEIGHT / 2 + SQL_EDITOR_GUTTER_MARGIN) - - SQL_TOOLBAR_HEIGHT, - southPaneHeight: - (height * southPercent) / 100 - - (SQL_EDITOR_GUTTER_HEIGHT / 2 + SQL_EDITOR_GUTTER_MARGIN), - }; - } - getHotkeyConfig() { + const getHotkeyConfig = useCallback(() => { // Get the user's OS const userOS = detectOS(); - const base = [ { name: 'runQuery1', key: 'ctrl+r', descr: t('Run query'), func: () => { - if (this.props.queryEditor.sql.trim() !== '') { - this.runQuery(); + if (queryEditor.sql.trim() !== '') { + startQuery(); } }, }, @@ -335,8 +318,8 @@ class SqlEditor extends React.PureComponent { key: 'ctrl+enter', descr: t('Run query'), func: () => { - if (this.props.queryEditor.sql.trim() !== '') { - this.runQuery(); + if (queryEditor.sql.trim() !== '') { + startQuery(); } }, }, @@ -345,18 +328,14 @@ class SqlEditor extends React.PureComponent { key: userOS === 'Windows' ? 'ctrl+q' : 'ctrl+t', descr: t('New tab'), func: () => { - const title = newQueryTabName(this.props.queryEditors || []); - this.props.addQueryEditor({ - ...this.props.queryEditor, - title, - }); + dispatch(addNewQueryEditor()); }, }, { name: 'stopQuery', key: userOS === 'MacOS' ? 'ctrl+x' : 'ctrl+e', descr: t('Stop query'), - func: this.stopQuery, + func: stopQuery, }, ]; @@ -372,201 +351,186 @@ class SqlEditor extends React.PureComponent { } return base; - } + }, [dispatch, queryEditor.sql, startQuery, stopQuery]); - setEmptyState(bool) { - this.setState({ showEmptyState: bool }); - } + const handleWindowResize = useCallback(() => { + setHeight(getSqlEditorHeight()); + }, []); - setQueryEditorAndSaveSql(sql) { - this.props.queryEditorSetAndSaveSql(this.props.queryEditor, sql); - } + const handleWindowResizeWithThrottle = useMemo( + () => throttle(handleWindowResize, WINDOW_RESIZE_THROTTLE_MS), + [handleWindowResize], + ); - setQueryLimit(queryLimit) { - this.props.queryEditorSetQueryLimit(this.props.queryEditor, queryLimit); - } + const onBeforeUnload = useCallback( + event => { + if ( + database?.extra_json?.cancel_query_on_windows_unload && + latestQuery?.state === 'running' + ) { + event.preventDefault(); + stopQuery(); + } + }, + [ + database?.extra_json?.cancel_query_on_windows_unload, + latestQuery?.state, + stopQuery, + ], + ); - getQueryCostEstimate() { - if (this.props.database) { - const qe = this.props.queryEditor; - const query = { - dbId: qe.dbId, - sql: qe.selectedText ? qe.selectedText : this.props.queryEditor.sql, - sqlEditorId: qe.id, - schema: qe.schema, - templateParams: qe.templateParams, - }; - this.props.estimateQueryCost(query); + useEffect(() => { + // We need to measure the height of the sql editor post render to figure the height of + // the south pane so it gets rendered properly + setHeight(getSqlEditorHeight()); + if (!database || isEmpty(database)) { + setShowEmptyState(true); } - } - handleToggleAutocompleteEnabled = () => { - this.setState(prevState => { - setItem( - LocalStorageKeys.sqllab__is_autocomplete_enabled, - !prevState.autocompleteEnabled, - ); - return { - autocompleteEnabled: !prevState.autocompleteEnabled, - }; + window.addEventListener('resize', handleWindowResizeWithThrottle); + window.addEventListener('beforeunload', onBeforeUnload); + + return () => { + window.removeEventListener('resize', handleWindowResizeWithThrottle); + window.removeEventListener('beforeunload', onBeforeUnload); + }; + }, [database, handleWindowResizeWithThrottle, onBeforeUnload]); + + useEffect(() => { + // setup hotkeys + Mousetrap.reset(); + const hotkeys = getHotkeyConfig(); + hotkeys.forEach(keyConfig => { + Mousetrap.bind([keyConfig.key], keyConfig.func); }); - }; + }, [getHotkeyConfig, latestQuery]); - handleWindowResize() { - this.setState({ height: this.getSqlEditorHeight() }); - } + const onResizeStart = () => { + // Set the heights on the ace editor and the ace content area after drag starts + // to smooth out the visual transition to the new heights when drag ends + document.getElementsByClassName('ace_content')[0].style.height = '100%'; + }; - elementStyle(dimension, elementSize, gutterSize) { - return { - [dimension]: `calc(${elementSize}% - ${ - gutterSize + SQL_EDITOR_GUTTER_MARGIN - }px)`, - }; - } + const onResizeEnd = ([northPercent, southPercent]) => { + setNorthPercent(northPercent); + setSouthPercent(southPercent); - requestValidation(sql) { - if (this.props.database) { - const qe = this.props.queryEditor; - const query = { - dbId: qe.dbId, - sql, - sqlEditorId: qe.id, - schema: qe.schema, - templateParams: qe.templateParams, - }; - this.props.validateQuery(query); + if (northPaneRef.current?.clientHeight) { + dispatch(persistEditorHeight(queryEditor, northPercent, southPercent)); } - } + }; - canValidateQuery() { + const setQueryEditorAndSaveSql = useCallback( + sql => { + dispatch(queryEditorSetAndSaveSql(queryEditor, sql)); + }, + [dispatch, queryEditor], + ); + + const setQueryEditorAndSaveSqlWithDebounce = useMemo( + () => debounce(setQueryEditorAndSaveSql, SET_QUERY_EDITOR_SQL_DEBOUNCE_MS), + [setQueryEditorAndSaveSql], + ); + + const canValidateQuery = () => { // Check whether or not we can validate the current query based on whether // or not the backend has a validator configured for it. - if (this.props.database) { - return validatorMap.hasOwnProperty(this.props.database.backend); + if (database) { + return validatorMap.hasOwnProperty(database.backend); } return false; - } + }; - runQuery() { - if (this.props.database) { - this.startQuery(); - } - } + const requestValidation = useCallback( + sql => { + if (database) { + dispatch(validateQuery(queryEditor, sql)); + } + }, + [database, dispatch, queryEditor], + ); - convertToNumWithSpaces(num) { - return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1 '); - } + const requestValidationWithDebounce = useMemo( + () => debounce(requestValidation, VALIDATION_DEBOUNCE_MS), + [requestValidation], + ); - startQuery(ctas = false, ctas_method = CtasEnum.TABLE) { - const qe = this.props.queryEditor; - const query = { - dbId: qe.dbId, - sql: qe.selectedText ? qe.selectedText : qe.sql, - sqlEditorId: qe.id, - tab: qe.title, - schema: qe.schema, - tempTable: ctas ? this.state.ctas : '', - templateParams: qe.templateParams, - queryLimit: qe.queryLimit || this.props.defaultQueryLimit, - runAsync: this.props.database - ? this.props.database.allow_run_async - : false, - ctas, - ctas_method, - updateTabState: !qe.selectedText, - }; - this.props.runQuery(query); - this.props.setActiveSouthPaneTab('Results'); - } + const onSqlChanged = sql => { + dispatch(queryEditorSetSql(queryEditor, sql)); + setQueryEditorAndSaveSqlWithDebounce(sql); + // Request server-side validation of the query text + if (canValidateQuery()) { + // NB. requestValidation is debounced + requestValidationWithDebounce(sql); + } + }; - stopQuery() { - if ( - this.props.latestQuery && - ['running', 'pending'].indexOf(this.props.latestQuery.state) >= 0 - ) { - this.props.postStopQuery(this.props.latestQuery); + // Return the heights for the ace editor and the south pane as an object + // given the height of the sql editor, north pane percent and south pane percent. + const getAceEditorAndSouthPaneHeights = ( + height, + northPercent, + southPercent, + ) => ({ + aceEditorHeight: + (height * northPercent) / (theme.gridUnit * 25) - + (SQL_EDITOR_GUTTER_HEIGHT / 2 + SQL_EDITOR_GUTTER_MARGIN) - + SQL_TOOLBAR_HEIGHT, + southPaneHeight: + (height * southPercent) / (theme.gridUnit * 25) - + (SQL_EDITOR_GUTTER_HEIGHT / 2 + SQL_EDITOR_GUTTER_MARGIN), + }); + + const getQueryCostEstimate = () => { + if (database) { + dispatch(estimateQueryCost(queryEditor)); } - } + }; - createTableAs() { - this.startQuery(true, CtasEnum.TABLE); - this.setState({ showCreateAsModal: false, ctas: '' }); - } + const handleToggleAutocompleteEnabled = () => { + setItem( + LocalStorageKeys.sqllab__is_autocomplete_enabled, + !autocompleteEnabled, + ); + setAutocompleteEnabled(!autocompleteEnabled); + }; - createViewAs() { - this.startQuery(true, CtasEnum.VIEW); - this.setState({ showCreateAsModal: false, ctas: '' }); - } + const elementStyle = (dimension, elementSize, gutterSize) => ({ + [dimension]: `calc(${elementSize}% - ${ + gutterSize + SQL_EDITOR_GUTTER_MARGIN + }px)`, + }); - ctasChanged(event) { - this.setState({ ctas: event.target.value }); - } + const createTableAs = () => { + startQuery(true, CtasEnum.TABLE); + setShowCreateAsModal(false); + setCtas(''); + }; - queryPane() { - const hotkeys = this.getHotkeyConfig(); - const { aceEditorHeight, southPaneHeight } = - this.getAceEditorAndSouthPaneHeights( - this.state.height, - this.state.northPercent, - this.state.southPercent, - ); - return ( - <Split - expandToMin - className="queryPane" - sizes={[this.state.northPercent, this.state.southPercent]} - elementStyle={this.elementStyle} - minSize={200} - direction="vertical" - gutterSize={SQL_EDITOR_GUTTER_HEIGHT} - onDragStart={this.onResizeStart} - onDragEnd={this.onResizeEnd} - > - <div ref={this.northPaneRef} className="north-pane"> - <AceEditorWrapper - actions={this.props.actions} - autocomplete={this.state.autocompleteEnabled} - onBlur={this.setQueryEditorSql} - onChange={this.onSqlChanged} - queryEditor={this.props.queryEditor} - sql={this.props.queryEditor.sql} - database={this.props.database} - schemas={this.props.queryEditor.schemaOptions} - tables={this.props.queryEditor.tableOptions} - functionNames={this.props.queryEditor.functionNames} - extendedTables={this.props.tables} - height={`${aceEditorHeight}px`} - hotkeys={hotkeys} - /> - {this.renderEditorBottomBar(hotkeys)} - </div> - <ConnectedSouthPane - editorQueries={this.props.editorQueries} - latestQueryId={this.props.latestQuery && this.props.latestQuery.id} - dataPreviewQueries={this.props.dataPreviewQueries} - actions={this.props.actions} - height={southPaneHeight} - displayLimit={this.props.displayLimit} - defaultQueryLimit={this.props.defaultQueryLimit} - /> - </Split> - ); - } + const createViewAs = () => { + startQuery(true, CtasEnum.VIEW); + setShowCreateAsModal(false); + setCtas(''); + }; - renderDropdown() { - const qe = this.props.queryEditor; - const successful = this.props.latestQuery?.state === 'success'; + const ctasChanged = event => { + setCtas(event.target.value); + }; + + const renderDropdown = () => { + const qe = queryEditor; + const successful = latestQuery?.state === 'success'; const scheduleToolTip = successful ? t('Schedule the query periodically') : t('You must run the query successfully first'); return ( - <Menu onClick={this.handleMenuClick} style={{ width: 176 }}> - <Menu.Item style={{ display: 'flex', justifyContent: 'space-between' }}> + <Menu css={{ width: theme.gridUnit * 44 }}> + <Menu.Item css={{ display: 'flex', justifyContent: 'space-between' }}> {' '} <span>{t('Autocomplete')}</span>{' '} <AntdSwitch - checked={this.state.autocompleteEnabled} - onChange={this.handleToggleAutocompleteEnabled} + checked={autocompleteEnabled} + onChange={handleToggleAutocompleteEnabled} name="autocomplete-switch" />{' '} </Menu.Item> @@ -575,21 +539,21 @@ class SqlEditor extends React.PureComponent { <TemplateParamsEditor language="json" onChange={params => { - this.props.actions.queryEditorSetTemplateParams(qe, params); + dispatch(queryEditorSetTemplateParams(qe, params)); }} - code={qe.templateParams} + queryEditorId={qe.id} /> </Menu.Item> )} {scheduledQueriesConf && ( <Menu.Item> <ScheduleQueryButton - defaultLabel={qe.title} + defaultLabel={qe.name} sql={qe.sql} - onSchedule={this.props.actions.scheduleQuery} + onSchedule={query => dispatch(scheduleQuery(query))} schema={qe.schema} dbId={qe.dbId} - scheduleQueryWarning={this.props.scheduleQueryWarning} + scheduleQueryWarning={scheduleQueryWarning} tooltip={scheduleToolTip} disabled={!successful} /> @@ -597,50 +561,24 @@ class SqlEditor extends React.PureComponent { )} </Menu> ); - } - - renderQueryLimit() { - // Adding SQL_MAX_ROW value to dropdown - const { maxRow } = this.props; - LIMIT_DROPDOWN.push(maxRow); - - return ( - <Menu> - {[...new Set(LIMIT_DROPDOWN)].map(limit => ( - <Menu.Item key={`${limit}`} onClick={() => this.setQueryLimit(limit)}> - {/* // eslint-disable-line no-use-before-define */} - <a role="button" styling="link"> - {this.convertToNumWithSpaces(limit)} - </a>{' '} - </Menu.Item> - ))} - </Menu> - ); - } - - async saveQuery(query) { - const { queryEditor: qe, actions } = this.props; - const savedQuery = await actions.saveQuery(query); - actions.addSavedQueryToTabState(qe, savedQuery); - } + }; - renderEditorBottomBar() { - const { queryEditor: qe } = this.props; + const onSaveQuery = async (query, clientId) => { + const savedQuery = await dispatch(saveQuery(query, clientId)); + dispatch(addSavedQueryToTabState(queryEditor, savedQuery)); + }; - const { allow_ctas: allowCTAS, allow_cvas: allowCVAS } = - this.props.database || {}; + const renderEditorBottomBar = () => { + const { allow_ctas: allowCTAS, allow_cvas: allowCVAS } = database || {}; const showMenu = allowCTAS || allowCVAS; - const { theme } = this.props; const runMenuBtn = ( <Menu> {allowCTAS && ( <Menu.Item onClick={() => { - this.setState({ - showCreateAsModal: true, - createAs: CtasEnum.TABLE, - }); + setShowCreateAsModal(true); + setCreateAs(CtasEnum.TABLE); }} key="1" > @@ -650,10 +588,8 @@ class SqlEditor extends React.PureComponent { {allowCVAS && ( <Menu.Item onClick={() => { - this.setState({ - showCreateAsModal: true, - createAs: CtasEnum.VIEW, - }); + setShowCreateAsModal(true); + setCreateAs(CtasEnum.VIEW); }} key="2" > @@ -668,197 +604,188 @@ class SqlEditor extends React.PureComponent { <div className="leftItems"> <span> <RunQueryActionButton - allowAsync={ - this.props.database - ? this.props.database.allow_run_async - : false - } - queryState={this.props.latestQuery?.state} - runQuery={this.runQuery} - selectedText={qe.selectedText} - stopQuery={this.stopQuery} - sql={this.props.queryEditor.sql} + allowAsync={database ? database.allow_run_async : false} + queryEditorId={queryEditor.id} + queryState={latestQuery?.state} + runQuery={runQuery} + stopQuery={stopQuery} overlayCreateAsMenu={showMenu ? runMenuBtn : null} /> </span> {isFeatureEnabled(FeatureFlag.ESTIMATE_QUERY_COST) && - this.props.database && - this.props.database.allows_cost_estimate && ( + database?.allows_cost_estimate && ( <span> <EstimateQueryCostButton - getEstimate={this.getQueryCostEstimate} - queryCostEstimate={qe.queryCostEstimate} - selectedText={qe.selectedText} + getEstimate={getQueryCostEstimate} + queryEditorId={queryEditor.id} tooltip={t('Estimate the cost before running a query')} /> </span> )} <span> - <LimitSelectStyled> - <AntdDropdown overlay={this.renderQueryLimit()} trigger="click"> - <a onClick={e => e.preventDefault()}> - <span>LIMIT:</span> - <span className="limitDropdown"> - {this.convertToNumWithSpaces( - this.props.queryEditor.queryLimit || - this.props.defaultQueryLimit, - )} - </span> - <Icons.TriangleDown iconColor={theme.colors.grayscale.base} /> - </a> - </AntdDropdown> - </LimitSelectStyled> + <QueryLimitSelect + queryEditorId={queryEditor.id} + maxRow={maxRow} + defaultQueryLimit={defaultQueryLimit} + /> </span> - {this.props.latestQuery && ( + {latestQuery && ( <Timer - startTime={this.props.latestQuery.startDttm} - endTime={this.props.latestQuery.endDttm} - state={STATE_TYPE_MAP[this.props.latestQuery.state]} - isRunning={this.props.latestQuery.state === 'running'} + startTime={latestQuery.startDttm} + endTime={latestQuery.endDttm} + state={STATE_TYPE_MAP[latestQuery.state]} + isRunning={latestQuery.state === 'running'} /> )} </div> <div className="rightItems"> <span> <SaveQuery - query={qe} - defaultLabel={qe.title || qe.description} - onSave={this.saveQuery} - onUpdate={this.props.actions.updateSavedQuery} - saveQueryWarning={this.props.saveQueryWarning} + queryEditorId={queryEditor.id} + columns={latestQuery?.results?.columns || []} + onSave={onSaveQuery} + onUpdate={(query, remoteId, id) => + dispatch(updateSavedQuery(query, remoteId, id)) + } + saveQueryWarning={saveQueryWarning} + database={database} /> </span> <span> - <ShareSqlLabQuery queryEditor={qe} /> + <ShareSqlLabQuery queryEditorId={queryEditor.id} /> </span> - <AntdDropdown overlay={this.renderDropdown()} trigger="click"> + <AntdDropdown overlay={renderDropdown()} trigger="click"> <Icons.MoreHoriz iconColor={theme.colors.grayscale.base} /> </AntdDropdown> </div> </StyledToolbar> ); - } - - render() { - const createViewModalTitle = - this.state.createAs === CtasEnum.VIEW - ? 'CREATE VIEW AS' - : 'CREATE TABLE AS'; - - const createModalPlaceHolder = - this.state.createAs === CtasEnum.VIEW - ? 'Specify name to CREATE VIEW AS schema in: public' - : 'Specify name to CREATE TABLE AS schema in: public'; + }; - const leftBarStateClass = this.props.hideLeftBar - ? 'schemaPane-exit-done' - : 'schemaPane-enter-done'; + const queryPane = () => { + const hotkeys = getHotkeyConfig(); + const { aceEditorHeight, southPaneHeight } = + getAceEditorAndSouthPaneHeights(height, northPercent, southPercent); return ( - <div ref={this.sqlEditorRef} className="SqlEditor"> - <CSSTransition - classNames="schemaPane" - in={!this.props.hideLeftBar} - timeout={300} + <Split + expandToMin + className="queryPane" + sizes={[northPercent, southPercent]} + elementStyle={elementStyle} + minSize={200} + direction="vertical" + gutterSize={SQL_EDITOR_GUTTER_HEIGHT} + onDragStart={onResizeStart} + onDragEnd={onResizeEnd} + > + <div ref={northPaneRef} className="north-pane"> + <AceEditorWrapper + autocomplete={autocompleteEnabled} + onBlur={setQueryEditorAndSaveSql} + onChange={onSqlChanged} + queryEditorId={queryEditor.id} + database={database} + extendedTables={tables} + height={`${aceEditorHeight}px`} + hotkeys={hotkeys} + /> + {renderEditorBottomBar(hotkeys)} + </div> + <SouthPane + queryEditorId={queryEditor.id} + latestQueryId={latestQuery?.id} + height={southPaneHeight} + displayLimit={displayLimit} + defaultQueryLimit={defaultQueryLimit} + /> + </Split> + ); + }; + + const createViewModalTitle = + createAs === CtasEnum.VIEW ? 'CREATE VIEW AS' : 'CREATE TABLE AS'; + + const createModalPlaceHolder = + createAs === CtasEnum.VIEW + ? t('Specify name to CREATE VIEW AS schema in: public') + : t('Specify name to CREATE TABLE AS schema in: public'); + + const leftBarStateClass = hideLeftBar + ? 'schemaPane-exit-done' + : 'schemaPane-enter-done'; + return ( + <StyledSqlEditor ref={sqlEditorRef} className="SqlEditor"> + <CSSTransition classNames="schemaPane" in={!hideLeftBar} timeout={300}> + <ResizableSidebar + id={`sqllab:${queryEditor.id}`} + minWidth={SQL_EDITOR_LEFTBAR_WIDTH} + initialWidth={SQL_EDITOR_LEFTBAR_WIDTH} + enable={!hideLeftBar} > - <div className={`schemaPane ${leftBarStateClass}`}> - <SqlEditorLeftBar - database={this.props.database} - queryEditor={this.props.queryEditor} - tables={this.props.tables} - actions={this.props.actions} - setEmptyState={this.setEmptyState} - /> - </div> - </CSSTransition> - {this.state.showEmptyState ? ( - <EmptyStateBig - image="vector.svg" - title={t('Select a database to write a query')} - description={t( - 'Choose one of the available databases from the panel on the left.', + {adjustedWidth => ( + <StyledSidebar + className={`schemaPane ${leftBarStateClass}`} + width={adjustedWidth} + hide={hideLeftBar} + > + <SqlEditorLeftBar + database={database} + queryEditorId={queryEditor.id} + tables={tables} + setEmptyState={bool => setShowEmptyState(bool)} + /> + </StyledSidebar> + )} + </ResizableSidebar> + </CSSTransition> + {showEmptyState ? ( + <EmptyStateBig + image="vector.svg" + title={t('Select a database to write a query')} + description={t( + 'Choose one of the available databases from the panel on the left.', + )} + /> + ) : ( + queryPane() + )} + <Modal + visible={showCreateAsModal} + title={t(createViewModalTitle)} + onHide={() => setShowCreateAsModal(false)} + footer={ + <> + <Button onClick={() => setShowCreateAsModal(false)}> + {t('Cancel')} + </Button> + {createAs === CtasEnum.TABLE && ( + <Button + buttonStyle="primary" + disabled={ctas.length === 0} + onClick={createTableAs} + > + {t('Create')} + </Button> )} - /> - ) : ( - this.queryPane() - )} - <StyledModal - visible={this.state.showCreateAsModal} - title={t(createViewModalTitle)} - onHide={() => { - this.setState({ showCreateAsModal: false }); - }} - footer={ - <> + {createAs === CtasEnum.VIEW && ( <Button - onClick={() => this.setState({ showCreateAsModal: false })} + buttonStyle="primary" + disabled={ctas.length === 0} + onClick={createViewAs} > - Cancel + {t('Create')} </Button> - {this.state.createAs === CtasEnum.TABLE && ( - <Button - buttonStyle="primary" - disabled={this.state.ctas.length === 0} - onClick={this.createTableAs.bind(this)} - > - Create - </Button> - )} - {this.state.createAs === CtasEnum.VIEW && ( - <Button - buttonStyle="primary" - disabled={this.state.ctas.length === 0} - onClick={this.createViewAs.bind(this)} - > - Create - </Button> - )} - </> - } - > - <span>Name</span> - <Input - placeholder={createModalPlaceHolder} - onChange={this.ctasChanged.bind(this)} - /> - </StyledModal> - </div> - ); - } -} -SqlEditor.defaultProps = defaultProps; -SqlEditor.propTypes = propTypes; - -function mapStateToProps({ sqlLab }, props) { - const queryEditor = sqlLab.queryEditors.find( - editor => editor.id === props.queryEditorId, + )} + </> + } + > + <span>{t('Name')}</span> + <Input placeholder={createModalPlaceHolder} onChange={ctasChanged} /> + </Modal> + </StyledSqlEditor> ); +}; - return { sqlLab, ...props, queryEditor, queryEditors: sqlLab.queryEditors }; -} - -function mapDispatchToProps(dispatch) { - return bindActionCreators( - { - addQueryEditor, - estimateQueryCost, - persistEditorHeight, - postStopQuery, - queryEditorSetAutorun, - queryEditorSetQueryLimit, - queryEditorSetSql, - queryEditorSetAndSaveSql, - queryEditorSetTemplateParams, - runQuery, - saveQuery, - addSavedQueryToTabState, - scheduleQuery, - setActiveSouthPaneTab, - updateSavedQuery, - validateQuery, - }, - dispatch, - ); -} +SqlEditor.propTypes = propTypes; -const themedSqlEditor = withTheme(SqlEditor); -export default connect(mapStateToProps, mapDispatchToProps)(themedSqlEditor); +export default SqlEditor; diff --git a/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.jsx b/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.jsx index 5e1e368b1c69..2c816d0e8447 100644 --- a/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.jsx +++ b/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.jsx @@ -19,101 +19,176 @@ import React from 'react'; import configureStore from 'redux-mock-store'; import fetchMock from 'fetch-mock'; -import { shallow } from 'enzyme'; -import { render, screen } from 'spec/helpers/testing-library'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; import { Provider } from 'react-redux'; import '@testing-library/jest-dom/extend-expect'; import thunk from 'redux-thunk'; import SqlEditorLeftBar from 'src/SqlLab/components/SqlEditorLeftBar'; -import TableElement from 'src/SqlLab/components/TableElement'; -import { supersetTheme, ThemeProvider } from '@superset-ui/core'; -import { - table, - initialState, - databases, - defaultQueryEditor, - mockedActions, -} from 'src/SqlLab/fixtures'; +import { table, initialState, defaultQueryEditor } from 'src/SqlLab/fixtures'; const mockedProps = { - actions: mockedActions, tables: [table], - queryEditor: defaultQueryEditor, - database: databases, + queryEditorId: defaultQueryEditor.id, + database: { + id: 1, + database_name: 'main', + backend: 'mysql', + }, height: 0, }; const middlewares = [thunk]; const mockStore = configureStore(middlewares); const store = mockStore(initialState); -fetchMock.get('glob:*/api/v1/database/*/schemas/?*', { result: [] }); -describe('SqlEditorLeftBar', () => { - let wrapper; - - beforeEach(() => { - wrapper = shallow(<SqlEditorLeftBar {...mockedProps} />, { - context: { store }, - }); - }); - afterEach(() => { - wrapper.unmount(); +beforeEach(() => { + fetchMock.get('glob:*/api/v1/database/?*', { result: [] }); + fetchMock.get('glob:*/api/v1/database/*/schemas/?*', { + count: 2, + result: ['main', 'new_schema'], }); - - it('is valid', () => { - expect(React.isValidElement(<SqlEditorLeftBar {...mockedProps} />)).toBe( - true, - ); + fetchMock.get('glob:*/api/v1/database/*/tables/*', { + count: 1, + result: [ + { + label: 'ab_user', + value: 'ab_user', + }, + ], }); +}); - it('renders a TableElement', () => { - expect(wrapper.find(TableElement)).toExist(); - }); +afterEach(() => { + fetchMock.restore(); }); -describe('Left Panel Expansion', () => { - it('table should be visible when expanded is true', () => { - const { container } = render( - <ThemeProvider theme={supersetTheme}> - <Provider store={store}> - <SqlEditorLeftBar {...mockedProps} /> - </Provider> - </ThemeProvider>, - ); - const dbSelect = screen.getByRole('combobox', { - name: 'Select database or type database name', - }); - const schemaSelect = screen.getByRole('combobox', { - name: 'Select schema or type schema name', - }); - const dropdown = screen.getByText(/Select table or type table name/i); - const abUser = screen.getByText(/ab_user/i); +const renderAndWait = (props, store) => + waitFor(() => + render(<SqlEditorLeftBar {...props} />, { + useRedux: true, + ...(store && { store }), + }), + ); + +test('is valid', () => { + expect( + React.isValidElement( + <Provider store={store}> + <SqlEditorLeftBar {...mockedProps} /> + </Provider>, + ), + ).toBe(true); +}); + +test('renders a TableElement', async () => { + await renderAndWait(mockedProps, store); + expect(await screen.findByText(/Database/i)).toBeInTheDocument(); + const tableElement = screen.getAllByTestId('table-element'); + expect(tableElement.length).toBeGreaterThanOrEqual(1); +}); + +test('table should be visible when expanded is true', async () => { + const { container } = await renderAndWait(mockedProps, store); + + const dbSelect = screen.getByRole('combobox', { + name: 'Select database or type database name', + }); + const schemaSelect = screen.getByRole('combobox', { + name: 'Select schema or type schema name', + }); + const dropdown = screen.getByText(/Table/i); + const abUser = screen.queryAllByText(/ab_user/i); + + await waitFor(() => { + expect(screen.getByText(/Database/i)).toBeInTheDocument(); expect(dbSelect).toBeInTheDocument(); expect(schemaSelect).toBeInTheDocument(); expect(dropdown).toBeInTheDocument(); - expect(abUser).toBeInTheDocument(); + expect(abUser).toHaveLength(2); expect( container.querySelector('.ant-collapse-content-active'), ).toBeInTheDocument(); }); +}); - it('should toggle the table when the header is clicked', async () => { - const collapseMock = jest.fn(); - render( - <ThemeProvider theme={supersetTheme}> - <Provider store={store}> - <SqlEditorLeftBar - actions={{ ...mockedActions, collapseTable: collapseMock }} - tables={[table]} - queryEditor={defaultQueryEditor} - database={databases} - height={0} - /> - </Provider> - </ThemeProvider>, +test('should toggle the table when the header is clicked', async () => { + const store = mockStore(initialState); + await renderAndWait(mockedProps, store); + + const header = (await screen.findAllByText(/ab_user/))[1]; + expect(header).toBeInTheDocument(); + userEvent.click(header); + + await waitFor(() => { + expect(store.getActions()[store.getActions().length - 1].type).toEqual( + 'COLLAPSE_TABLE', ); - const header = screen.getByText(/ab_user/); - userEvent.click(header); - expect(collapseMock).toHaveBeenCalled(); }); }); + +test('When changing database the table list must be updated', async () => { + const { rerender } = await renderAndWait(mockedProps, store); + + expect(screen.getAllByText(/main/i)[0]).toBeInTheDocument(); + expect(screen.getAllByText(/ab_user/i)[0]).toBeInTheDocument(); + + rerender( + <SqlEditorLeftBar + {...mockedProps} + database={{ + id: 2, + database_name: 'new_db', + backend: 'postgresql', + }} + queryEditorId={defaultQueryEditor.id} + tables={[{ ...mockedProps.tables[0], dbId: 2, name: 'new_table' }]} + />, + { + useRedux: true, + store: mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + schema: 'new_schema', + }, + }, + }), + }, + ); + expect(await screen.findByText(/new_db/i)).toBeInTheDocument(); + expect(await screen.findByText(/new_table/i)).toBeInTheDocument(); +}); + +test('ignore schema api when current schema is deprecated', async () => { + const invalidSchemaName = 'None'; + const { rerender } = await renderAndWait( + mockedProps, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + schema: invalidSchemaName, + }, + }, + }), + ); + + expect(await screen.findByText(/Database/i)).toBeInTheDocument(); + expect(screen.queryByText(/None/i)).toBeInTheDocument(); + expect(fetchMock.calls()).not.toContainEqual( + expect.arrayContaining([ + expect.stringContaining( + `/tables/${mockedProps.database.id}/${invalidSchemaName}/`, + ), + ]), + ); + rerender(); + // Deselect the deprecated schema selection + await waitFor(() => + expect(screen.queryByText(/None/i)).not.toBeInTheDocument(), + ); +}); diff --git a/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx b/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx index f74249465456..e241e3c2e2c9 100644 --- a/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx +++ b/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx @@ -18,53 +18,55 @@ */ import React, { useEffect, - useRef, useCallback, useMemo, useState, Dispatch, SetStateAction, } from 'react'; +import { useDispatch } from 'react-redux'; +import querystring from 'query-string'; + +import { + queryEditorSetDb, + queryEditorSetFunctionNames, + addTable, + removeTables, + collapseTable, + expandTable, + queryEditorSetSchema, + queryEditorSetTableOptions, + queryEditorSetSchemaOptions, + setDatabases, + addDangerToast, + resetState, +} from 'src/SqlLab/actions/sqlLab'; import Button from 'src/components/Button'; import { t, styled, css, SupersetTheme } from '@superset-ui/core'; import Collapse from 'src/components/Collapse'; import Icons from 'src/components/Icons'; import { TableSelectorMultiple } from 'src/components/TableSelector'; import { IconTooltip } from 'src/components/IconTooltip'; -import { QueryEditor } from 'src/SqlLab/types'; +import useQueryEditor from 'src/SqlLab/hooks/useQueryEditor'; import { DatabaseObject } from 'src/components/DatabaseSelector'; -import { EmptyStateSmall } from 'src/components/EmptyState'; -import TableElement, { Table, TableElementProps } from '../TableElement'; +import { emptyStateComponent } from 'src/components/EmptyState'; +import { + getItem, + LocalStorageKeys, + setItem, +} from 'src/utils/localStorageHelpers'; +import TableElement, { Table } from '../TableElement'; interface ExtendedTable extends Table { expanded: boolean; } -interface actionsTypes { - queryEditorSetDb: (queryEditor: QueryEditor, dbId: number) => void; - queryEditorSetFunctionNames: (queryEditor: QueryEditor, dbId: number) => void; - collapseTable: (table: Table) => void; - expandTable: (table: Table) => void; - addTable: (queryEditor: any, database: any, value: any, schema: any) => void; - setDatabases: (arg0: any) => {}; - addDangerToast: (msg: string) => void; - queryEditorSetSchema: (queryEditor: QueryEditor, schema?: string) => void; - queryEditorSetSchemaOptions: () => void; - queryEditorSetTableOptions: ( - queryEditor: QueryEditor, - options: Array<any>, - ) => void; - resetState: () => void; -} - interface SqlEditorLeftBarProps { - queryEditor: QueryEditor; + queryEditorId: string; height?: number; tables?: ExtendedTable[]; - actions: actionsTypes & TableElementProps['actions']; database: DatabaseObject; setEmptyState: Dispatch<SetStateAction<boolean>>; - showDisabled: boolean; } const StyledScrollbarContainer = styled.div` @@ -87,28 +89,53 @@ const collapseStyles = (theme: SupersetTheme) => css` .ant-collapse-arrow { top: ${theme.gridUnit * 2}px !important; color: ${theme.colors.primary.dark1} !important; - &: hover { + &:hover { color: ${theme.colors.primary.dark2} !important; } } `; -export default function SqlEditorLeftBar({ - actions, +const LeftBarStyles = styled.div` + ${({ theme }) => css` + height: 100%; + display: flex; + flex-direction: column; + + .divider { + border-bottom: 1px solid ${theme.colors.grayscale.light4}; + margin: ${theme.gridUnit * 4}px 0; + } + `} +`; + +const SqlEditorLeftBar = ({ database, - queryEditor, + queryEditorId, tables = [], height = 500, setEmptyState, -}: SqlEditorLeftBarProps) { - // Ref needed to avoid infinite rerenders on handlers - // that require and modify the queryEditor - const queryEditorRef = useRef<QueryEditor>(queryEditor); +}: SqlEditorLeftBarProps) => { + const dispatch = useDispatch(); + const queryEditor = useQueryEditor(queryEditorId, ['dbId', 'schema']); + const [emptyResultsWithSearch, setEmptyResultsWithSearch] = useState(false); + const [userSelectedDb, setUserSelected] = useState<DatabaseObject | null>( + null, + ); + const { schema } = queryEditor; useEffect(() => { - queryEditorRef.current = queryEditor; - }, [queryEditor]); + const bool = querystring.parse(window.location.search).db; + const userSelected = getItem( + LocalStorageKeys.db, + null, + ) as DatabaseObject | null; + + if (bool && userSelected) { + setUserSelected(userSelected); + setItem(LocalStorageKeys.db, null); + } else setUserSelected(database); + }, [database]); const onEmptyResults = (searchText?: string) => { setEmptyResultsWithSearch(!!searchText); @@ -116,8 +143,8 @@ export default function SqlEditorLeftBar({ const onDbChange = ({ id: dbId }: { id: number }) => { setEmptyState(false); - actions.queryEditorSetDb(queryEditor, dbId); - actions.queryEditorSetFunctionNames(queryEditor, dbId); + dispatch(queryEditorSetDb(queryEditor, dbId)); + dispatch(queryEditorSetFunctionNames(queryEditor, dbId)); }; const selectedTableNames = useMemo( @@ -142,21 +169,21 @@ export default function SqlEditorLeftBar({ }); tablesToAdd.forEach(tableName => - actions.addTable(queryEditor, database, tableName, schemaName), + dispatch(addTable(queryEditor, database, tableName, schemaName)), ); - currentTables.forEach(table => actions.removeTable(table)); + dispatch(removeTables(currentTables)); }; const onToggleTable = (updatedTables: string[]) => { tables.forEach((table: ExtendedTable) => { if (!updatedTables.includes(table.id.toString()) && table.expanded) { - actions.collapseTable(table); + dispatch(collapseTable(table)); } else if ( updatedTables.includes(table.id.toString()) && !table.expanded ) { - actions.expandTable(table); + dispatch(expandTable(table)); } }); }; @@ -183,54 +210,65 @@ export default function SqlEditorLeftBar({ const shouldShowReset = window.location.search === '?reset=1'; const tableMetaDataHeight = height - 130; // 130 is the height of the selects above - const emptyStateComponent = ( - <EmptyStateSmall - image="empty.svg" - title={ - emptyResultsWithSearch - ? t('No databases match your search') - : t('There are no databases available') - } - description={ - <p> - {t('Manage your databases')}{' '} - <a href="/databaseview/list">{t('here')}</a> - </p> - } - /> - ); const handleSchemaChange = useCallback( (schema: string) => { - if (queryEditorRef.current) { - actions.queryEditorSetSchema(queryEditorRef.current, schema); + if (queryEditor) { + dispatch(queryEditorSetSchema(queryEditor, schema)); } }, - [actions], + [dispatch, queryEditor], ); - const handleTablesLoad = React.useCallback( + const handleTablesLoad = useCallback( (options: Array<any>) => { - if (queryEditorRef.current) { - actions.queryEditorSetTableOptions(queryEditorRef.current, options); + if (queryEditor) { + dispatch(queryEditorSetTableOptions(queryEditor, options)); } }, - [actions], + [dispatch, queryEditor], ); + const handleSchemasLoad = useCallback( + (options: Array<any>) => { + if (queryEditor) { + dispatch(queryEditorSetSchemaOptions(queryEditor, options)); + } + }, + [dispatch, queryEditor], + ); + + const handleDbList = useCallback( + (result: DatabaseObject) => { + dispatch(setDatabases(result)); + }, + [dispatch], + ); + + const handleError = useCallback( + (message: string) => { + dispatch(addDangerToast(message)); + }, + [dispatch], + ); + + const handleResetState = useCallback(() => { + dispatch(resetState()); + }, [dispatch]); + return ( - <div className="SqlEditorLeftBar"> + <LeftBarStyles data-test="sql-editor-left-bar"> <TableSelectorMultiple onEmptyResults={onEmptyResults} - emptyState={emptyStateComponent} - database={database} - getDbList={actions.setDatabases} - handleError={actions.addDangerToast} + emptyState={emptyStateComponent(emptyResultsWithSearch)} + database={userSelectedDb} + getDbList={handleDbList} + handleError={handleError} onDbChange={onDbChange} onSchemaChange={handleSchemaChange} - onSchemasLoad={actions.queryEditorSetSchemaOptions} + onSchemasLoad={handleSchemasLoad} onTableSelectChange={onTablesChange} onTablesLoad={handleTablesLoad} - schema={queryEditor.schema} + schema={schema} tableValue={selectedTableNames} sqlLabMode /> @@ -252,7 +290,7 @@ export default function SqlEditorLeftBar({ expandIcon={renderExpandIconWithTooltip} > {tables.map(table => ( - <TableElement table={table} key={table.id} actions={actions} /> + <TableElement table={table} key={table.id} /> ))} </Collapse> </div> @@ -261,11 +299,13 @@ export default function SqlEditorLeftBar({ <Button buttonSize="small" buttonStyle="danger" - onClick={actions.resetState} + onClick={handleResetState} > <i className="fa fa-bomb" /> {t('Reset state')} </Button> )} - </div> + </LeftBarStyles> ); -} +}; + +export default SqlEditorLeftBar; diff --git a/superset-frontend/src/SqlLab/components/SqlEditorTabHeader/SqlEditorTabHeader.test.tsx b/superset-frontend/src/SqlLab/components/SqlEditorTabHeader/SqlEditorTabHeader.test.tsx new file mode 100644 index 000000000000..6c231401c705 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/SqlEditorTabHeader/SqlEditorTabHeader.test.tsx @@ -0,0 +1,220 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import configureStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import { + fireEvent, + screen, + render, + waitFor, +} from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; +import { QueryEditor } from 'src/SqlLab/types'; +import { + initialState, + defaultQueryEditor, + extraQueryEditor1, + extraQueryEditor2, +} from 'src/SqlLab/fixtures'; +import { Store } from 'redux'; +import { + REMOVE_QUERY_EDITOR, + QUERY_EDITOR_SET_TITLE, + ADD_QUERY_EDITOR, + QUERY_EDITOR_TOGGLE_LEFT_BAR, +} from 'src/SqlLab/actions/sqlLab'; +import SqlEditorTabHeader from 'src/SqlLab/components/SqlEditorTabHeader'; + +jest.mock('src/components/DeprecatedSelect', () => () => ( + <div data-test="mock-deprecated-select" /> +)); +jest.mock('src/components/Select/Select', () => () => ( + <div data-test="mock-deprecated-select-select" /> +)); +jest.mock('src/components/Select/AsyncSelect', () => () => ( + <div data-test="mock-async-select" /> +)); + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); +const setup = (queryEditor: QueryEditor, store?: Store) => + render(<SqlEditorTabHeader queryEditor={queryEditor} />, { + useRedux: true, + ...(store && { store }), + }); + +describe('SqlEditorTabHeader', () => { + it('renders name', () => { + const { queryByText } = setup(defaultQueryEditor, mockStore(initialState)); + expect(queryByText(defaultQueryEditor.name)).toBeTruthy(); + expect(queryByText(extraQueryEditor1.name)).toBeFalsy(); + expect(queryByText(extraQueryEditor2.name)).toBeFalsy(); + }); + + it('renders name from unsaved changes', () => { + const expectedTitle = 'updated title'; + const { queryByText } = setup( + defaultQueryEditor, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + name: expectedTitle, + }, + }, + }), + ); + expect(queryByText(expectedTitle)).toBeTruthy(); + expect(queryByText(defaultQueryEditor.name)).toBeFalsy(); + expect(queryByText(extraQueryEditor1.name)).toBeFalsy(); + expect(queryByText(extraQueryEditor2.name)).toBeFalsy(); + }); + + it('renders current name for unrelated unsaved changes', () => { + const unrelatedTitle = 'updated title'; + const { queryByText } = setup( + defaultQueryEditor, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: `${defaultQueryEditor.id}-other`, + name: unrelatedTitle, + }, + }, + }), + ); + expect(queryByText(defaultQueryEditor.name)).toBeTruthy(); + expect(queryByText(unrelatedTitle)).toBeFalsy(); + expect(queryByText(extraQueryEditor1.name)).toBeFalsy(); + expect(queryByText(extraQueryEditor2.name)).toBeFalsy(); + }); + + describe('with dropdown menus', () => { + let store = mockStore(); + beforeEach(async () => { + store = mockStore(initialState); + const { getByTestId } = setup(defaultQueryEditor, store); + const dropdown = getByTestId('dropdown-trigger'); + + userEvent.click(dropdown); + }); + + it('should dispatch removeQueryEditor action', async () => { + await waitFor(() => + expect(screen.getByTestId('close-tab-menu-option')).toBeInTheDocument(), + ); + + fireEvent.click(screen.getByTestId('close-tab-menu-option')); + + const actions = store.getActions(); + await waitFor(() => + expect(actions[0]).toEqual({ + type: REMOVE_QUERY_EDITOR, + queryEditor: defaultQueryEditor, + }), + ); + }); + + it('should dispatch queryEditorSetTitle action', async () => { + await waitFor(() => + expect(screen.getByTestId('close-tab-menu-option')).toBeInTheDocument(), + ); + const expectedTitle = 'typed text'; + const mockPrompt = jest + .spyOn(window, 'prompt') + .mockImplementation(() => expectedTitle); + fireEvent.click(screen.getByTestId('rename-tab-menu-option')); + + const actions = store.getActions(); + await waitFor(() => + expect(actions[0]).toEqual({ + type: QUERY_EDITOR_SET_TITLE, + name: expectedTitle, + queryEditor: expect.objectContaining({ + id: defaultQueryEditor.id, + }), + }), + ); + mockPrompt.mockClear(); + }); + + it('should dispatch toggleLeftBar action', async () => { + await waitFor(() => + expect(screen.getByTestId('close-tab-menu-option')).toBeInTheDocument(), + ); + fireEvent.click(screen.getByTestId('toggle-menu-option')); + + const actions = store.getActions(); + await waitFor(() => + expect(actions[0]).toEqual({ + type: QUERY_EDITOR_TOGGLE_LEFT_BAR, + hideLeftBar: !defaultQueryEditor.hideLeftBar, + queryEditor: expect.objectContaining({ + id: defaultQueryEditor.id, + }), + }), + ); + }); + + it('should dispatch removeAllOtherQueryEditors action', async () => { + await waitFor(() => + expect(screen.getByTestId('close-tab-menu-option')).toBeInTheDocument(), + ); + fireEvent.click(screen.getByTestId('close-all-other-menu-option')); + + const actions = store.getActions(); + await waitFor(() => + expect(actions).toEqual([ + { + type: REMOVE_QUERY_EDITOR, + queryEditor: initialState.sqlLab.queryEditors[1], + }, + { + type: REMOVE_QUERY_EDITOR, + queryEditor: initialState.sqlLab.queryEditors[2], + }, + ]), + ); + }); + + it('should dispatch cloneQueryToNewTab action', async () => { + await waitFor(() => + expect(screen.getByTestId('close-tab-menu-option')).toBeInTheDocument(), + ); + fireEvent.click(screen.getByTestId('clone-tab-menu-option')); + + const actions = store.getActions(); + await waitFor(() => + expect(actions[0]).toEqual({ + type: ADD_QUERY_EDITOR, + queryEditor: expect.objectContaining({ + name: `Copy of ${defaultQueryEditor.name}`, + sql: defaultQueryEditor.sql, + autorun: false, + }), + }), + ); + }); + }); +}); diff --git a/superset-frontend/src/SqlLab/components/SqlEditorTabHeader/index.tsx b/superset-frontend/src/SqlLab/components/SqlEditorTabHeader/index.tsx new file mode 100644 index 000000000000..1e1b22a81d24 --- /dev/null +++ b/superset-frontend/src/SqlLab/components/SqlEditorTabHeader/index.tsx @@ -0,0 +1,153 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useMemo } from 'react'; +import { bindActionCreators } from 'redux'; +import { useSelector, useDispatch, shallowEqual } from 'react-redux'; +import { Dropdown } from 'src/components/Dropdown'; +import { Menu } from 'src/components/Menu'; +import { styled, t, QueryState } from '@superset-ui/core'; +import { + removeQueryEditor, + removeAllOtherQueryEditors, + queryEditorSetTitle, + cloneQueryToNewTab, + toggleLeftBar, +} from 'src/SqlLab/actions/sqlLab'; +import { QueryEditor, SqlLabRootState } from 'src/SqlLab/types'; +import TabStatusIcon from '../TabStatusIcon'; + +const TabTitleWrapper = styled.div` + display: flex; + align-items: center; +`; +const TabTitle = styled.span` + margin-right: ${({ theme }) => theme.gridUnit * 2}px; + text-transform: none; +`; + +const IconContainer = styled.div` + display: inline-block; + width: ${({ theme }) => theme.gridUnit * 8}px; + text-align: center; +`; + +interface Props { + queryEditor: QueryEditor; +} + +const SqlEditorTabHeader: React.FC<Props> = ({ queryEditor }) => { + const qe = useSelector<SqlLabRootState, QueryEditor>( + ({ sqlLab: { unsavedQueryEditor } }) => ({ + ...queryEditor, + ...(queryEditor.id === unsavedQueryEditor.id && unsavedQueryEditor), + }), + shallowEqual, + ); + const queryState = useSelector<SqlLabRootState, QueryState>( + ({ sqlLab }) => sqlLab.queries[qe.latestQueryId || '']?.state || '', + ); + const dispatch = useDispatch(); + const actions = useMemo( + () => + bindActionCreators( + { + removeQueryEditor, + removeAllOtherQueryEditors, + queryEditorSetTitle, + cloneQueryToNewTab, + toggleLeftBar, + }, + dispatch, + ), + [dispatch], + ); + + function renameTab() { + const newTitle = prompt(t('Enter a new title for the tab')); + if (newTitle) { + actions.queryEditorSetTitle(qe, newTitle, qe.id); + } + } + + return ( + <TabTitleWrapper> + <Dropdown + trigger={['click']} + overlay={ + <Menu style={{ width: 176 }}> + <Menu.Item + className="close-btn" + key="1" + onClick={() => actions.removeQueryEditor(qe)} + data-test="close-tab-menu-option" + > + <IconContainer> + <i className="fa fa-close" /> + </IconContainer> + {t('Close tab')} + </Menu.Item> + <Menu.Item + key="2" + onClick={renameTab} + data-test="rename-tab-menu-option" + > + <IconContainer> + <i className="fa fa-i-cursor" /> + </IconContainer> + {t('Rename tab')} + </Menu.Item> + <Menu.Item + key="3" + onClick={() => actions.toggleLeftBar(qe)} + data-test="toggle-menu-option" + > + <IconContainer> + <i className="fa fa-cogs" /> + </IconContainer> + {qe.hideLeftBar ? t('Expand tool bar') : t('Hide tool bar')} + </Menu.Item> + <Menu.Item + key="4" + onClick={() => actions.removeAllOtherQueryEditors(qe)} + data-test="close-all-other-menu-option" + > + <IconContainer> + <i className="fa fa-times-circle-o" /> + </IconContainer> + {t('Close all other tabs')} + </Menu.Item> + <Menu.Item + key="5" + onClick={() => actions.cloneQueryToNewTab(qe, false)} + data-test="clone-tab-menu-option" + > + <IconContainer> + <i className="fa fa-files-o" /> + </IconContainer> + {t('Duplicate tab')} + </Menu.Item> + </Menu> + } + /> + <TabTitle>{qe.name}</TabTitle> <TabStatusIcon tabState={queryState} />{' '} + </TabTitleWrapper> + ); +}; + +export default SqlEditorTabHeader; diff --git a/superset-frontend/src/SqlLab/components/TabStatusIcon/TabStatusIcon.test.jsx b/superset-frontend/src/SqlLab/components/TabStatusIcon/TabStatusIcon.test.tsx similarity index 72% rename from superset-frontend/src/SqlLab/components/TabStatusIcon/TabStatusIcon.test.jsx rename to superset-frontend/src/SqlLab/components/TabStatusIcon/TabStatusIcon.test.tsx index 08923c5d9e9e..fb8ee5599230 100644 --- a/superset-frontend/src/SqlLab/components/TabStatusIcon/TabStatusIcon.test.jsx +++ b/superset-frontend/src/SqlLab/components/TabStatusIcon/TabStatusIcon.test.tsx @@ -16,24 +16,22 @@ * specific language governing permissions and limitations * under the License. */ +import { QueryState } from '@superset-ui/core'; import React from 'react'; -import sinon from 'sinon'; -import { shallow } from 'enzyme'; +import { render } from 'spec/helpers/testing-library'; import TabStatusIcon from 'src/SqlLab/components/TabStatusIcon'; function setup() { - const onClose = sinon.spy(); - const wrapper = shallow( - <TabStatusIcon onClose={onClose} tabState="running" />, - ); - return { wrapper, onClose }; + return render(<TabStatusIcon tabState={'running' as QueryState} />); } describe('TabStatusIcon', () => { it('renders a circle without an x when hovered', () => { - const { wrapper } = setup(); - expect(wrapper.find('div.circle')).toExist(); - expect(wrapper.text()).toBe(''); + const { container } = setup(); + expect(container.getElementsByClassName('circle')[0]).toBeInTheDocument(); + expect( + container.getElementsByClassName('circle')[0]?.textContent ?? 'undefined', + ).toBe(''); }); }); diff --git a/superset-frontend/src/SqlLab/components/TabStatusIcon/index.tsx b/superset-frontend/src/SqlLab/components/TabStatusIcon/index.tsx index 799124fb9c09..f40e94686658 100644 --- a/superset-frontend/src/SqlLab/components/TabStatusIcon/index.tsx +++ b/superset-frontend/src/SqlLab/components/TabStatusIcon/index.tsx @@ -17,12 +17,62 @@ * under the License. */ import React from 'react'; -import { QueryState } from '@superset-ui/core'; +import { css, QueryState, styled } from '@superset-ui/core'; +import Icons, { IconType } from 'src/components/Icons'; + +const IconContainer = styled.span` + position: absolute; + top: -6px; + left: 1px; +`; + +const Circle = styled.div` + ${({ theme }) => css` + border-radius: 50%; + width: ${theme.gridUnit * 3}px; + height: ${theme.gridUnit * 3}px; + + display: inline-block; + background-color: ${theme.colors.grayscale.light2}; + text-align: center; + vertical-align: middle; + font-size: ${theme.typography.sizes.m}px; + font-weight: ${theme.typography.weights.bold}; + color: ${theme.colors.grayscale.light5}; + position: relative; + + &.running { + background-color: ${theme.colors.info.base}; + } + + &.success { + background-color: ${theme.colors.success.base}; + } + + &.failed { + background-color: ${theme.colors.error.base}; + } + `} +`; interface TabStatusIconProps { tabState: QueryState; } +const STATE_ICONS: Record<string, React.FC<IconType>> = { + success: Icons.Check, + failed: Icons.CancelX, +}; + export default function TabStatusIcon({ tabState }: TabStatusIconProps) { - return <div className={`circle ${tabState}`} />; + const StatusIcon = STATE_ICONS[tabState]; + return ( + <Circle className={`circle ${tabState}`}> + {StatusIcon && ( + <IconContainer> + <StatusIcon iconSize="xs" /> + </IconContainer> + )} + </Circle> + ); } diff --git a/superset-frontend/src/SqlLab/components/TabbedSqlEditors/TabbedSqlEditors.test.jsx b/superset-frontend/src/SqlLab/components/TabbedSqlEditors/TabbedSqlEditors.test.jsx index 9f8e5bcf1ae2..105751a4d0eb 100644 --- a/superset-frontend/src/SqlLab/components/TabbedSqlEditors/TabbedSqlEditors.test.jsx +++ b/superset-frontend/src/SqlLab/components/TabbedSqlEditors/TabbedSqlEditors.test.jsx @@ -22,6 +22,7 @@ import thunk from 'redux-thunk'; import URI from 'urijs'; import { Provider } from 'react-redux'; import { shallow, mount } from 'enzyme'; +import { fireEvent, render, waitFor } from 'spec/helpers/testing-library'; import sinon from 'sinon'; import { act } from 'react-dom/test-utils'; import fetchMock from 'fetch-mock'; @@ -29,7 +30,9 @@ import { supersetTheme, ThemeProvider } from '@superset-ui/core'; import { EditableTabs } from 'src/components/Tabs'; import TabbedSqlEditors from 'src/SqlLab/components/TabbedSqlEditors'; import SqlEditor from 'src/SqlLab/components/SqlEditor'; -import { table, initialState } from 'src/SqlLab/fixtures'; +import { initialState } from 'src/SqlLab/fixtures'; +import { newQueryTabName } from 'src/SqlLab/utils/newQueryTabName'; +import QueryProvider from 'src/views/QueryProvider'; fetchMock.get('glob:*/api/v1/database/*', {}); fetchMock.get('glob:*/savedqueryviewapi/api/get/*', {}); @@ -40,12 +43,6 @@ describe('TabbedSqlEditors', () => { const mockStore = configureStore(middlewares); const store = mockStore(initialState); - const tabHistory = ['dfsadfs', 'newEditorId']; - - const tables = [ - { ...table, dataPreviewQueryId: 'B1-VQU1zW', queryEditorId: 'newEditorId' }, - ]; - const queryEditors = [ { autorun: false, @@ -55,17 +52,9 @@ describe('TabbedSqlEditors', () => { schema: null, selectedText: null, sql: 'SELECT ds...', - title: 'Untitled Query', + name: 'Untitled Query', }, ]; - const queries = { - 'B1-VQU1zW': { - id: 'B1-VQU1zW', - sqlEditorId: 'newEditorId', - tableName: 'ab_user', - state: 'success', - }, - }; const mockedProps = { actions: {}, databases: {}, @@ -88,15 +77,22 @@ describe('TabbedSqlEditors', () => { const mountWithAct = async () => act(async () => { mount( - <Provider store={store}> - <TabbedSqlEditors {...mockedProps} /> - </Provider>, + <QueryProvider> + <Provider store={store}> + <TabbedSqlEditors {...mockedProps} /> + </Provider> + </QueryProvider>, { wrappingComponent: ThemeProvider, wrappingComponentProps: { theme: supersetTheme }, }, ); }); + const setup = (props = {}, overridesStore) => + render(<TabbedSqlEditors {...props} />, { + useRedux: true, + store: overridesStore || store, + }); let wrapper; it('is valid', () => { @@ -136,32 +132,6 @@ describe('TabbedSqlEditors', () => { ); }); }); - describe('UNSAFE_componentWillReceiveProps', () => { - beforeEach(() => { - wrapper = getWrapper(); - wrapper.setProps({ queryEditors, queries, tabHistory, tables }); - }); - it('should update queriesArray and dataPreviewQueries', () => { - expect(wrapper.state().queriesArray.slice(-1)[0]).toBe( - queries['B1-VQU1zW'], - ); - expect(wrapper.state().dataPreviewQueries.slice(-1)[0]).toEqual( - queries['B1-VQU1zW'], - ); - }); - }); - it('should rename Tab', () => { - global.prompt = () => 'new title'; - wrapper = getWrapper(); - sinon.stub(wrapper.instance().props.actions, 'queryEditorSetTitle'); - - wrapper.instance().renameTab(queryEditors[0]); - expect( - wrapper.instance().props.actions.queryEditorSetTitle.getCall(0).args[1], - ).toBe('new title'); - - delete global.prompt; - }); it('should removeQueryEditor', () => { wrapper = getWrapper(); sinon.stub(wrapper.instance().props.actions, 'removeQueryEditor'); @@ -171,23 +141,32 @@ describe('TabbedSqlEditors', () => { wrapper.instance().props.actions.removeQueryEditor.getCall(0).args[0], ).toBe(queryEditors[0]); }); - it('should add new query editor', () => { - wrapper = getWrapper(); - sinon.stub(wrapper.instance().props.actions, 'addQueryEditor'); - - wrapper.instance().newQueryEditor(); - expect( - wrapper.instance().props.actions.addQueryEditor.getCall(0).args[0].title, - ).toContain('Untitled Query'); + it('should add new query editor', async () => { + const { getAllByLabelText } = setup(mockedProps); + fireEvent.click(getAllByLabelText('Add tab')[0]); + const actions = store.getActions(); + await waitFor(() => + expect(actions).toContainEqual({ + type: 'ADD_QUERY_EDITOR', + queryEditor: expect.objectContaining({ + name: expect.stringMatching(/Untitled Query (\d+)+/), + }), + }), + ); }); - it('should properly increment query tab name', () => { - wrapper = getWrapper(); - sinon.stub(wrapper.instance().props.actions, 'addQueryEditor'); - - wrapper.instance().newQueryEditor(); - expect( - wrapper.instance().props.actions.addQueryEditor.getCall(0).args[0].title, - ).toContain('Untitled Query 2'); + it('should properly increment query tab name', async () => { + const { getAllByLabelText } = setup(mockedProps); + const newTitle = newQueryTabName(store.getState().sqlLab.queryEditors); + fireEvent.click(getAllByLabelText('Add tab')[0]); + const actions = store.getActions(); + await waitFor(() => + expect(actions).toContainEqual({ + type: 'ADD_QUERY_EDITOR', + queryEditor: expect.objectContaining({ + name: newTitle, + }), + }), + ); }); it('should duplicate query editor', () => { wrapper = getWrapper(); @@ -233,9 +212,9 @@ describe('TabbedSqlEditors', () => { }); it('should disable new tab when offline', () => { wrapper = getWrapper(); - expect(wrapper.find(EditableTabs).props().hideAdd).toBe(false); + expect(wrapper.find('#a11y-query-editor-tabs').props().hideAdd).toBe(false); wrapper.setProps({ offline: true }); - expect(wrapper.find(EditableTabs).props().hideAdd).toBe(true); + expect(wrapper.find('#a11y-query-editor-tabs').props().hideAdd).toBe(true); }); it('should have an empty state when query editors is empty', () => { wrapper = getWrapper(); diff --git a/superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx b/superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx index 494ef9cba0ef..1b3e3a999d77 100644 --- a/superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx +++ b/superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx @@ -18,22 +18,19 @@ */ import React from 'react'; import PropTypes from 'prop-types'; -import { Dropdown } from 'src/components/Dropdown'; import { EditableTabs } from 'src/components/Tabs'; -import { Menu } from 'src/components/Menu'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import URI from 'urijs'; import { styled, t } from '@superset-ui/core'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; -import { areArraysShallowEqual } from 'src/reduxUtils'; import { Tooltip } from 'src/components/Tooltip'; import { detectOS } from 'src/utils/common'; import * as Actions from 'src/SqlLab/actions/sqlLab'; import { EmptyStateBig } from 'src/components/EmptyState'; -import { newQueryTabName } from '../../utils/newQueryTabName'; +import getBootstrapData from 'src/utils/getBootstrapData'; import SqlEditor from '../SqlEditor'; -import TabStatusIcon from '../TabStatusIcon'; +import SqlEditorTabHeader from '../SqlEditorTabHeader'; const propTypes = { actions: PropTypes.object.isRequired, @@ -44,7 +41,6 @@ const propTypes = { databases: PropTypes.object.isRequired, queries: PropTypes.object.isRequired, queryEditors: PropTypes.array, - requestedQuery: PropTypes.object, tabHistory: PropTypes.array.isRequired, tables: PropTypes.array.isRequired, offline: PropTypes.bool, @@ -54,14 +50,14 @@ const propTypes = { const defaultProps = { queryEditors: [], offline: false, - requestedQuery: null, saveQueryWarning: null, scheduleQueryWarning: null, }; -const TabTitleWrapper = styled.div` +const StyledEditableTabs = styled(EditableTabs)` + height: 100%; display: flex; - align-items: center; + flex-direction: column; `; const StyledTab = styled.span` @@ -82,14 +78,8 @@ class TabbedSqlEditors extends React.PureComponent { const sqlLabUrl = '/superset/sqllab'; this.state = { sqlLabUrl, - queriesArray: [], - dataPreviewQueries: [], }; this.removeQueryEditor = this.removeQueryEditor.bind(this); - this.renameTab = this.renameTab.bind(this); - this.toggleLeftBar = this.toggleLeftBar.bind(this); - this.removeAllOtherQueryEditors = - this.removeAllOtherQueryEditors.bind(this); this.duplicateQueryEditor = this.duplicateQueryEditor.bind(this); this.handleSelect = this.handleSelect.bind(this); this.handleEdit = this.handleEdit.bind(this); @@ -123,13 +113,10 @@ class TabbedSqlEditors extends React.PureComponent { } // merge post form data with GET search params - // Hack: this data should be comming from getInitialState + // Hack: this data should be coming from getInitialState // but for some reason this data isn't being passed properly through // the reducer. - const appContainer = document.getElementById('app'); - const bootstrapData = JSON.parse( - appContainer?.getAttribute('data-bootstrap') || '{}', - ); + const bootstrapData = getBootstrapData(); const query = { ...bootstrapData.requested_query, ...URI(window.location).search(true), @@ -167,7 +154,7 @@ class TabbedSqlEditors extends React.PureComponent { } } const newQueryEditor = { - title: query.title, + name: query.name, dbId, schema: query.schema, autorun: query.autorun, @@ -200,50 +187,11 @@ class TabbedSqlEditors extends React.PureComponent { } } - UNSAFE_componentWillReceiveProps(nextProps) { - const nextActiveQeId = - nextProps.tabHistory[nextProps.tabHistory.length - 1]; - const queriesArray = Object.values(nextProps.queries).filter( - query => query.sqlEditorId === nextActiveQeId, - ); - if (!areArraysShallowEqual(queriesArray, this.state.queriesArray)) { - this.setState({ queriesArray }); - } - - const dataPreviewQueries = []; - nextProps.tables.forEach(table => { - const queryId = table.dataPreviewQueryId; - if ( - queryId && - nextProps.queries[queryId] && - table.queryEditorId === nextActiveQeId - ) { - dataPreviewQueries.push({ - ...nextProps.queries[queryId], - tableName: table.name, - }); - } - }); - if ( - !areArraysShallowEqual(dataPreviewQueries, this.state.dataPreviewQueries) - ) { - this.setState({ dataPreviewQueries }); - } - } - popNewTab() { // Clean the url in browser history window.history.replaceState({}, document.title, this.state.sqlLabUrl); } - renameTab(qe) { - /* eslint no-alert: 0 */ - const newTitle = prompt(t('Enter a new title for the tab')); - if (newTitle) { - this.props.actions.queryEditorSetTitle(qe, newTitle); - } - } - activeQueryEditor() { if (this.props.tabHistory.length === 0) { return this.props.queryEditors[0]; @@ -253,36 +201,16 @@ class TabbedSqlEditors extends React.PureComponent { } newQueryEditor() { - const activeQueryEditor = this.activeQueryEditor(); - const firstDbId = Math.min( - ...Object.values(this.props.databases).map(database => database.id), - ); - const warning = isFeatureEnabled(FeatureFlag.SQLLAB_BACKEND_PERSISTENCE) - ? '' - : t( - '-- Note: Unless you save your query, these tabs will NOT persist if you clear your cookies or change browsers.\n\n', - ); - - const newTitle = newQueryTabName(this.props.queryEditors || []); - - const qe = { - title: newTitle, - dbId: - activeQueryEditor && activeQueryEditor.dbId - ? activeQueryEditor.dbId - : this.props.defaultDbId || firstDbId, - schema: activeQueryEditor ? activeQueryEditor.schema : null, - autorun: false, - sql: `${warning}SELECT ...`, - queryLimit: this.props.defaultQueryLimit, - }; - this.props.actions.addQueryEditor(qe); + this.props.actions.addNewQueryEditor(); } handleSelect(key) { const qeid = this.props.tabHistory[this.props.tabHistory.length - 1]; if (key !== qeid) { const queryEditor = this.props.queryEditors.find(qe => qe.id === key); + if (!queryEditor) { + return; + } this.props.actions.switchQueryEditor( queryEditor, this.props.displayLimit, @@ -304,106 +232,30 @@ class TabbedSqlEditors extends React.PureComponent { this.props.actions.removeQueryEditor(qe); } - removeAllOtherQueryEditors(cqe) { - this.props.queryEditors.forEach( - qe => qe !== cqe && this.removeQueryEditor(qe), - ); - } - duplicateQueryEditor(qe) { this.props.actions.cloneQueryToNewTab(qe, false); } - toggleLeftBar(qe) { - this.props.actions.toggleLeftBar(qe); - } - render() { const noQueryEditors = this.props.queryEditors?.length === 0; - const editors = this.props.queryEditors.map(qe => { - let latestQuery; - if (qe.latestQueryId) { - latestQuery = this.props.queries[qe.latestQueryId]; - } - let database; - if (qe.dbId) { - database = this.props.databases[qe.dbId]; - } - const state = latestQuery ? latestQuery.state : ''; - - const menu = ( - <Menu style={{ width: 176 }}> - <Menu.Item - className="close-btn" - key="1" - onClick={() => this.removeQueryEditor(qe)} - data-test="close-tab-menu-option" - > - <div className="icon-container"> - <i className="fa fa-close" /> - </div> - {t('Close tab')} - </Menu.Item> - <Menu.Item key="2" onClick={() => this.renameTab(qe)}> - <div className="icon-container"> - <i className="fa fa-i-cursor" /> - </div> - {t('Rename tab')} - </Menu.Item> - <Menu.Item key="3" onClick={() => this.toggleLeftBar(qe)}> - <div className="icon-container"> - <i className="fa fa-cogs" /> - </div> - {qe.hideLeftBar ? t('Expand tool bar') : t('Hide tool bar')} - </Menu.Item> - <Menu.Item - key="4" - onClick={() => this.removeAllOtherQueryEditors(qe)} - > - <div className="icon-container"> - <i className="fa fa-times-circle-o" /> - </div> - {t('Close all other tabs')} - </Menu.Item> - <Menu.Item key="5" onClick={() => this.duplicateQueryEditor(qe)}> - <div className="icon-container"> - <i className="fa fa-files-o" /> - </div> - {t('Duplicate tab')} - </Menu.Item> - </Menu> - ); - const tabHeader = ( - <TabTitleWrapper> - <Dropdown overlay={menu} trigger={['click']} /> - <TabTitle>{qe.title}</TabTitle> <TabStatusIcon tabState={state} />{' '} - </TabTitleWrapper> - ); - return ( - <EditableTabs.TabPane - key={qe.id} - tab={tabHeader} - // for tests - key prop isn't handled by enzyme well bcs it's a react keyword - data-key={qe.id} - > - <SqlEditor - tables={this.props.tables.filter(xt => xt.queryEditorId === qe.id)} - queryEditorId={qe.id} - editorQueries={this.state.queriesArray} - dataPreviewQueries={this.state.dataPreviewQueries} - latestQuery={latestQuery} - database={database} - actions={this.props.actions} - hideLeftBar={qe.hideLeftBar} - defaultQueryLimit={this.props.defaultQueryLimit} - maxRow={this.props.maxRow} - displayLimit={this.props.displayLimit} - saveQueryWarning={this.props.saveQueryWarning} - scheduleQueryWarning={this.props.scheduleQueryWarning} - /> - </EditableTabs.TabPane> - ); - }); + const editors = this.props.queryEditors?.map(qe => ( + <EditableTabs.TabPane + key={qe.id} + tab={<SqlEditorTabHeader queryEditor={qe} />} + // for tests - key prop isn't handled by enzyme well bcs it's a react keyword + data-key={qe.id} + > + <SqlEditor + tables={this.props.tables.filter(xt => xt.queryEditorId === qe.id)} + queryEditor={qe} + defaultQueryLimit={this.props.defaultQueryLimit} + maxRow={this.props.maxRow} + displayLimit={this.props.displayLimit} + saveQueryWarning={this.props.saveQueryWarning} + scheduleQueryWarning={this.props.scheduleQueryWarning} + /> + </EditableTabs.TabPane> + )); const emptyTab = ( <StyledTab> @@ -437,7 +289,7 @@ class TabbedSqlEditors extends React.PureComponent { ); return ( - <EditableTabs + <StyledEditableTabs destroyInactiveTabPane activeKey={this.props.tabHistory[this.props.tabHistory.length - 1]} id="a11y-query-editor-tabs" @@ -465,14 +317,14 @@ class TabbedSqlEditors extends React.PureComponent { > {editors} {noQueryEditors && emptyTabState} - </EditableTabs> + </StyledEditableTabs> ); } } TabbedSqlEditors.propTypes = propTypes; TabbedSqlEditors.defaultProps = defaultProps; -function mapStateToProps({ sqlLab, common, requestedQuery }) { +function mapStateToProps({ sqlLab, common }) { return { databases: sqlLab.databases, queryEditors: sqlLab.queryEditors, @@ -486,7 +338,6 @@ function mapStateToProps({ sqlLab, common, requestedQuery }) { maxRow: common.conf.SQL_MAX_ROW, saveQueryWarning: common.conf.SQLLAB_SAVE_WARNING_MESSAGE, scheduleQueryWarning: common.conf.SQLLAB_SCHEDULE_WARNING_MESSAGE, - requestedQuery, }; } function mapDispatchToProps(dispatch) { diff --git a/superset-frontend/src/SqlLab/components/TableElement/TableElement.test.jsx b/superset-frontend/src/SqlLab/components/TableElement/TableElement.test.jsx index 91bddc57fb2b..60efa3a59677 100644 --- a/superset-frontend/src/SqlLab/components/TableElement/TableElement.test.jsx +++ b/superset-frontend/src/SqlLab/components/TableElement/TableElement.test.jsx @@ -17,22 +17,24 @@ * under the License. */ import React from 'react'; -import { mount, shallow } from 'enzyme'; +import { mount } from 'enzyme'; import { Provider } from 'react-redux'; import configureStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; import { supersetTheme, ThemeProvider } from '@superset-ui/core'; import Collapse from 'src/components/Collapse'; import { IconTooltip } from 'src/components/IconTooltip'; import TableElement from 'src/SqlLab/components/TableElement'; import ColumnElement from 'src/SqlLab/components/ColumnElement'; import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint'; -import { mockedActions, table } from 'src/SqlLab/fixtures'; +import { initialState, table } from 'src/SqlLab/fixtures'; + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); describe('TableElement', () => { - const mockStore = configureStore([]); - const store = mockStore({}); + const store = mockStore(initialState); const mockedProps = { - actions: mockedActions, table, timeout: 0, }; @@ -57,7 +59,17 @@ describe('TableElement', () => { expect(wrapper.find(IconTooltip)).toHaveLength(4); }); it('has 14 columns', () => { - const wrapper = shallow(<TableElement {...mockedProps} />); + const wrapper = mount( + <Provider store={store}> + <TableElement {...mockedProps} /> + </Provider>, + { + wrappingComponent: ThemeProvider, + wrappingComponentProps: { + theme: supersetTheme, + }, + }, + ); expect(wrapper.find(ColumnElement)).toHaveLength(14); }); it('mounts', () => { @@ -143,6 +155,7 @@ describe('TableElement', () => { }, ); wrapper.find('.table-remove').hostNodes().simulate('click'); - expect(mockedActions.removeDataPreview.called).toBe(true); + expect(store.getActions()).toHaveLength(1); + expect(store.getActions()[0].type).toEqual('REMOVE_DATA_PREVIEW'); }); }); diff --git a/superset-frontend/src/SqlLab/components/TableElement/index.tsx b/superset-frontend/src/SqlLab/components/TableElement/index.tsx index 6e5b18d28c4d..0f1140f9e87c 100644 --- a/superset-frontend/src/SqlLab/components/TableElement/index.tsx +++ b/superset-frontend/src/SqlLab/components/TableElement/index.tsx @@ -17,12 +17,14 @@ * under the License. */ import React, { useState, useRef } from 'react'; +import { useDispatch } from 'react-redux'; import Collapse from 'src/components/Collapse'; import Card from 'src/components/Card'; import ButtonGroup from 'src/components/ButtonGroup'; -import { t, styled } from '@superset-ui/core'; +import { css, t, styled } from '@superset-ui/core'; import { debounce } from 'lodash'; +import { removeDataPreview, removeTables } from 'src/SqlLab/actions/sqlLab'; import { Tooltip } from 'src/components/Tooltip'; import CopyToClipboard from 'src/components/CopyToClipboard'; import { IconTooltip } from 'src/components/IconTooltip'; @@ -55,15 +57,11 @@ export interface Table { export interface TableElementProps { table: Table; - actions: { - removeDataPreview: (table: Table) => void; - removeTable: (table: Table) => void; - }; } const StyledSpan = styled.span` color: ${({ theme }) => theme.colors.primary.dark1}; - &: hover { + &:hover { color: ${({ theme }) => theme.colors.primary.dark2}; } cursor: pointer; @@ -74,7 +72,42 @@ const Fade = styled.div` opacity: ${(props: { hovered: boolean }) => (props.hovered ? 1 : 0)}; `; -const TableElement = ({ table, actions, ...props }: TableElementProps) => { +const StyledCollapsePanel = styled(Collapse.Panel)` + ${({ theme }) => css` + & { + .ws-el-controls { + margin-right: ${-theme.gridUnit}px; + display: flex; + } + + .header-container { + display: flex; + flex: 1; + align-items: center; + width: 100%; + + .table-name { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: ${theme.typography.sizes.l}px; + flex: 1; + } + + .header-right-side { + margin-left: auto; + display: flex; + align-items: center; + margin-right: ${theme.gridUnit * 8}px; + } + } + } + `} +`; + +const TableElement = ({ table, ...props }: TableElementProps) => { + const dispatch = useDispatch(); + const [sortColumns, setSortColumns] = useState(false); const [hovered, setHovered] = useState(false); const tableNameRef = useRef<HTMLInputElement>(null); @@ -84,8 +117,8 @@ const TableElement = ({ table, actions, ...props }: TableElementProps) => { }; const removeTable = () => { - actions.removeDataPreview(table); - actions.removeTable(table); + dispatch(removeDataPreview(table)); + dispatch(removeTables([table])); }; const toggleSortColumns = () => { @@ -149,14 +182,11 @@ const TableElement = ({ table, actions, ...props }: TableElementProps) => { const renderControls = () => { let keyLink; + const KEYS_FOR_TABLE_TEXT = t('Keys for table'); if (table?.indexes?.length) { keyLink = ( <ModalTrigger - modalTitle={ - <div> - {t('Keys for table')} <strong>{table.name}</strong> - </div> - } + modalTitle={`${KEYS_FOR_TABLE_TEXT} ${table.name}`} modalBody={table.indexes.map((ix, i) => ( <pre key={i}>{JSON.stringify(ix, null, ' ')}</pre> ))} @@ -274,6 +304,7 @@ const TableElement = ({ table, actions, ...props }: TableElementProps) => { const metadata = ( <div + data-test="table-element" onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)} css={{ paddingTop: 6 }} @@ -290,7 +321,7 @@ const TableElement = ({ table, actions, ...props }: TableElementProps) => { }; return ( - <Collapse.Panel + <StyledCollapsePanel {...props} key={table.id} header={renderHeader()} @@ -298,7 +329,7 @@ const TableElement = ({ table, actions, ...props }: TableElementProps) => { forceRender > {renderBody()} - </Collapse.Panel> + </StyledCollapsePanel> ); }; diff --git a/superset-frontend/src/SqlLab/components/TemplateParamsEditor/TemplateParamsEditor.test.tsx b/superset-frontend/src/SqlLab/components/TemplateParamsEditor/TemplateParamsEditor.test.tsx index bc04030d28c8..fdf8fd3b53f5 100644 --- a/superset-frontend/src/SqlLab/components/TemplateParamsEditor/TemplateParamsEditor.test.tsx +++ b/superset-frontend/src/SqlLab/components/TemplateParamsEditor/TemplateParamsEditor.test.tsx @@ -17,38 +17,103 @@ * under the License. */ -import React, { ReactNode } from 'react'; +import React from 'react'; +import configureStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import { Store } from 'redux'; import { render, fireEvent, getByText, waitFor, } from 'spec/helpers/testing-library'; -import { ThemeProvider, supersetTheme } from '@superset-ui/core'; +import { initialState, defaultQueryEditor } from 'src/SqlLab/fixtures'; -import TemplateParamsEditor from 'src/SqlLab/components/TemplateParamsEditor'; +import TemplateParamsEditor, { + TemplateParamsEditorProps, +} from 'src/SqlLab/components/TemplateParamsEditor'; -const ThemeWrapper = ({ children }: { children: ReactNode }) => ( - <ThemeProvider theme={supersetTheme}>{children}</ThemeProvider> -); +jest.mock('src/components/DeprecatedSelect', () => () => ( + <div data-test="mock-deprecated-select" /> +)); +jest.mock('src/components/Select/Select', () => () => ( + <div data-test="mock-deprecated-select-select" /> +)); +jest.mock('src/components/Select/AsyncSelect', () => () => ( + <div data-test="mock-async-select" /> +)); +jest.mock('src/components/AsyncAceEditor', () => ({ + ConfigEditor: ({ value }: { value: string }) => ( + <div data-test="mock-async-ace-editor">{value}</div> + ), +})); + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); +const setup = ( + otherProps: Partial<TemplateParamsEditorProps> = {}, + store?: Store, +) => + render( + <TemplateParamsEditor + language="json" + onChange={() => {}} + queryEditorId={defaultQueryEditor.id} + {...otherProps} + />, + { + useRedux: true, + store: mockStore(initialState), + ...(store && { store }), + }, + ); describe('TemplateParamsEditor', () => { it('should render with a title', () => { - const { container } = render( - <TemplateParamsEditor code="FOO" language="json" onChange={() => {}} />, - { wrapper: ThemeWrapper }, - ); + const { container } = setup(); expect(container.querySelector('div[role="button"]')).toBeInTheDocument(); }); it('should open a modal with the ace editor', async () => { - const { container, baseElement } = render( - <TemplateParamsEditor code="FOO" language="json" onChange={() => {}} />, - { wrapper: ThemeWrapper }, + const { container, getByTestId } = setup(); + fireEvent.click(getByText(container, 'Parameters')); + await waitFor(() => { + expect(getByTestId('mock-async-ace-editor')).toBeInTheDocument(); + }); + }); + + it('renders templateParams', async () => { + const { container, getByTestId } = setup(); + fireEvent.click(getByText(container, 'Parameters')); + await waitFor(() => { + expect(getByTestId('mock-async-ace-editor')).toBeInTheDocument(); + }); + expect(getByTestId('mock-async-ace-editor')).toHaveTextContent( + defaultQueryEditor.templateParams, + ); + }); + + it('renders code from unsaved changes', async () => { + const expectedCode = 'custom code value'; + const { container, getByTestId } = setup( + {}, + mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + templateParams: expectedCode, + }, + }, + }), ); fireEvent.click(getByText(container, 'Parameters')); await waitFor(() => { - expect(baseElement.querySelector('#ace-editor')).toBeInTheDocument(); + expect(getByTestId('mock-async-ace-editor')).toBeInTheDocument(); }); + expect(getByTestId('mock-async-ace-editor')).toHaveTextContent( + expectedCode, + ); }); }); diff --git a/superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx b/superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx index 62d0a7209de1..a862fd326aac 100644 --- a/superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx +++ b/superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx @@ -17,15 +17,16 @@ * under the License. */ import React, { useState, useEffect } from 'react'; -import Badge from 'src/components/Badge'; import { t, styled } from '@superset-ui/core'; import { InfoTooltipWithTrigger } from '@superset-ui/chart-controls'; import { debounce } from 'lodash'; +import Badge from 'src/components/Badge'; import ModalTrigger from 'src/components/ModalTrigger'; import { ConfigEditor } from 'src/components/AsyncAceEditor'; import { FAST_DEBOUNCE } from 'src/constants'; import { Tooltip } from 'src/components/Tooltip'; +import useQueryEditor from 'src/SqlLab/hooks/useQueryEditor'; const StyledConfigEditor = styled(ConfigEditor)` &.ace_editor { @@ -33,18 +34,23 @@ const StyledConfigEditor = styled(ConfigEditor)` } `; -function TemplateParamsEditor({ - code = '{}', - language, - onChange = () => {}, -}: { - code: string; +export type TemplateParamsEditorProps = { + queryEditorId: string; language: 'yaml' | 'json'; onChange: () => void; -}) { +}; + +const TemplateParamsEditor = ({ + queryEditorId, + language, + onChange = () => {}, +}: TemplateParamsEditorProps) => { const [parsedJSON, setParsedJSON] = useState({}); const [isValid, setIsValid] = useState(true); + const { templateParams } = useQueryEditor(queryEditorId, ['templateParams']); + const code = templateParams ?? '{}'; + useEffect(() => { try { setParsedJSON(JSON.parse(code)); @@ -58,20 +64,20 @@ function TemplateParamsEditor({ const modalBody = ( <div> <p> - Assign a set of parameters as + {t('Assign a set of parameters as')} <code>JSON</code> - below (example: + {t('below (example:')} <code>{'{"my_table": "foo"}'}</code> - ), and they become available in your SQL (example: - <code>SELECT * FROM {'{{ my_table }}'} </code>) by using  + {t('), and they become available in your SQL (example:')} + <code>SELECT * FROM {'{{ my_table }}'} </code>) {t('by using')}  <a href="https://superset.apache.org/sqllab.html#templating-with-jinja" target="_blank" rel="noopener noreferrer" > - Jinja templating + {t('Jinja templating')} </a>{' '} - syntax. + {t('syntax.')} </p> <StyledConfigEditor mode={language} @@ -115,6 +121,6 @@ function TemplateParamsEditor({ modalBody={modalBody} /> ); -} +}; export default TemplateParamsEditor; diff --git a/superset-frontend/src/SqlLab/constants.ts b/superset-frontend/src/SqlLab/constants.ts index 7d0ea09c1826..108ce895618a 100644 --- a/superset-frontend/src/SqlLab/constants.ts +++ b/superset-frontend/src/SqlLab/constants.ts @@ -16,6 +16,8 @@ * specific language governing permissions and limitations * under the License. */ +import { t } from '@superset-ui/core'; + export const STATE_TYPE_MAP = { offline: 'danger', failed: 'danger', @@ -26,6 +28,16 @@ export const STATE_TYPE_MAP = { success: 'success', }; +export const STATE_TYPE_MAP_LOCALIZED = { + offline: t('offline'), + failed: t('failed'), + pending: t('pending'), + fetching: t('fetching'), + running: t('running'), + stopped: t('stopped'), + success: t('success'), +}; + export const STATUS_OPTIONS = { success: 'success', failed: 'failed', @@ -34,6 +46,14 @@ export const STATUS_OPTIONS = { pending: 'pending', }; +export const STATUS_OPTIONS_LOCALIZED = { + success: t('success'), + failed: t('failed'), + running: t('running'), + offline: t('offline'), + pending: t('pending'), +}; + export const TIME_OPTIONS = [ 'now', '1 hour ago', @@ -48,6 +68,13 @@ export const TIME_OPTIONS = [ export const SQL_EDITOR_GUTTER_HEIGHT = 5; export const SQL_EDITOR_GUTTER_MARGIN = 3; export const SQL_TOOLBAR_HEIGHT = 51; +export const SQL_EDITOR_LEFTBAR_WIDTH = 400; +export const SQL_EDITOR_PADDING = 10; +export const INITIAL_NORTH_PERCENT = 30; +export const INITIAL_SOUTH_PERCENT = 70; +export const SET_QUERY_EDITOR_SQL_DEBOUNCE_MS = 2000; +export const VALIDATION_DEBOUNCE_MS = 600; +export const WINDOW_RESIZE_THROTTLE_MS = 100; // kilobyte storage export const KB_STORAGE = 1024; diff --git a/superset-frontend/src/SqlLab/fixtures.ts b/superset-frontend/src/SqlLab/fixtures.ts index 5b12ee29213e..456a83a3faf1 100644 --- a/superset-frontend/src/SqlLab/fixtures.ts +++ b/superset-frontend/src/SqlLab/fixtures.ts @@ -19,6 +19,8 @@ import sinon from 'sinon'; import * as actions from 'src/SqlLab/actions/sqlLab'; import { ColumnKeyTypeType } from 'src/SqlLab/components/ColumnElement'; +import { DatasourceType, QueryResponse, QueryState } from '@superset-ui/core'; +import { ISaveableDatasource } from 'src/SqlLab/components/SaveDatasetModal'; export const mockedActions = sinon.stub({ ...actions }); @@ -176,11 +178,16 @@ export const table = { export const defaultQueryEditor = { id: 'dfsadfs', autorun: false, - dbId: null, + dbId: undefined, latestQueryId: null, - selectedText: null, + selectedText: undefined, sql: 'SELECT *\nFROM\nWHERE', - title: 'Untitled Query 1', + name: 'Untitled Query 1', + schema: 'main', + remoteId: null, + tableOptions: [], + functionNames: [], + hideLeftBar: false, schemaOptions: [ { value: 'main', @@ -188,7 +195,24 @@ export const defaultQueryEditor = { title: 'main', }, ], + templateParams: '{}', +}; + +export const extraQueryEditor1 = { + ...defaultQueryEditor, + id: 'diekd23', + sql: 'SELECT *\nFROM\nWHERE\nLIMIT', + name: 'Untitled Query 2', + selectedText: 'SELECT', }; + +export const extraQueryEditor2 = { + ...defaultQueryEditor, + id: 'owkdi998', + sql: 'SELECT *\nFROM\nWHERE\nGROUP BY', + name: 'Untitled Query 3', +}; + export const queries = [ { dbId: 1, @@ -201,7 +225,7 @@ export const queries = [ id: 'BkA1CLrJg', progress: 100, startDttm: 1476910566092.96, - state: 'success', + state: QueryState.SUCCESS, changedOn: 1476910566000, tempTable: null, userId: 1, @@ -260,7 +284,7 @@ export const queries = [ id: 'S1zeAISkx', progress: 100, startDttm: 1476910570802.2, - state: 'success', + state: QueryState.SUCCESS, changedOn: 1476910572000, tempTable: null, userId: 1, @@ -294,7 +318,7 @@ export const queryWithNoQueryLimit = { id: 'BkA1CLrJg', progress: 100, startDttm: 1476910566092.96, - state: 'success', + state: QueryState.SUCCESS, changedOn: 1476910566000, tempTable: null, userId: 1, @@ -344,6 +368,7 @@ export const queryWithNoQueryLimit = { }, }, }; + export const queryWithBadColumns = { ...queries[0], results: { @@ -407,6 +432,7 @@ export const queryWithBadColumns = { ], }, }; + export const databases = { result: [ { @@ -429,6 +455,7 @@ export const databases = { }, ], }; + export const tables = { options: [ { @@ -464,7 +491,7 @@ export const stoppedQuery = { sql: 'SELECT ...', sqlEditorId: 'rJaf5u9WZ', startDttm: 1497400851936, - state: 'stopped', + state: QueryState.STOPPED, tab: 'Untitled Query 2', tempTable: '', }; @@ -482,7 +509,7 @@ export const failedQueryWithErrorMessage = { sql: 'SELECT ...', sqlEditorId: 'rJaf5u9WZ', startDttm: 1497400851936, - state: 'failed', + state: QueryState.FAILED, tab: 'Untitled Query 2', tempTable: '', }; @@ -507,20 +534,113 @@ export const failedQueryWithErrors = { sql: 'SELECT ...', sqlEditorId: 'rJaf5u9WZ', startDttm: 1497400851936, - state: 'failed', + state: QueryState.FAILED, tab: 'Untitled Query 2', tempTable: '', }; -export const runningQuery = { +const baseQuery: QueryResponse = { + queryId: 567, + dbId: 1, + sql: 'SELECT * FROM superset.slices', + sqlEditorId: 'SJ8YO72R', + tab: 'Demo', + ctas: false, + cached: false, + id: 'BkA1CLrJg', + progress: 100, + startDttm: 1476910566092.96, + state: QueryState.SUCCESS, + tempSchema: null, + tempTable: 'temp', + userId: 1, + executedSql: 'SELECT * FROM superset.slices', + rows: 42, + started: 'started', + queryLimit: 100, + endDttm: 1476910566798, + schema: 'test_schema', + errorMessage: null, + db: { key: 'main' }, + user: { key: 'admin' }, + isDataPreview: false, + resultsKey: null, + trackingUrl: null, + templateParams: null, + limitingFactor: 'capacity', + duration: '2334645675467', + time: { key: 'value' }, + querylink: { key: 'value' }, + output: { key: 'value' }, + actions: { key: 'value' }, + extra: { + progress: null, + }, + columns: [], + type: DatasourceType.Query, + results: { + displayLimitReached: false, + query: { limit: 6 }, + columns: [ + { + is_dttm: true, + name: 'ds', + type: 'STRING', + }, + { + is_dttm: false, + name: 'gender', + type: 'STRING', + }, + ], + selected_columns: [ + { + is_dttm: true, + name: 'ds', + type: 'STRING', + }, + { + is_dttm: false, + name: 'gender', + type: 'STRING', + }, + ], + expanded_columns: [ + { + is_dttm: true, + name: 'ds', + type: 'STRING', + }, + ], + data: [ + { col1: '0', col2: '1' }, + { col1: '2', col2: '3' }, + ], + }, +}; + +export const runningQuery: QueryResponse = { + ...baseQuery, dbId: 1, cached: false, ctas: false, id: 'ryhMUZCGb', progress: 90, - state: 'running', + state: QueryState.RUNNING, startDttm: Date.now() - 500, }; + +export const successfulQuery: QueryResponse = { + ...baseQuery, + dbId: 1, + cached: false, + ctas: false, + id: 'ryhMUZCGb', + progress: 100, + state: QueryState.SUCCESS, + startDttm: Date.now() - 500, +}; + export const cachedQuery = { ...queries[0], cached: true }; export const user = { @@ -541,13 +661,14 @@ export const initialState = { alerts: [], queries: {}, databases: {}, - queryEditors: [defaultQueryEditor], + queryEditors: [defaultQueryEditor, extraQueryEditor1, extraQueryEditor2], tabHistory: [defaultQueryEditor.id], tables: [], workspaceQueries: [], queriesLastUpdate: 0, activeSouthPaneTab: 'Results', user: { user }, + unsavedQueryEditor: {}, }, messageToasts: [], common: { @@ -562,13 +683,49 @@ export const initialState = { }; export const query = { - id: 'clientId2353', + name: 'test query', dbId: 1, sql: 'SELECT * FROM something', - sqlEditorId: defaultQueryEditor.id, - tab: 'unimportant', - tempTable: null, - runAsync: false, - ctas: false, - cached: false, + description: 'test description', + schema: 'test schema', + resultsKey: 'test', }; + +export const queryId = 'clientId2353'; + +export const testQuery: ISaveableDatasource = { + name: 'unimportant', + dbId: 1, + sql: 'SELECT *', + columns: [ + { + name: 'Column 1', + type: DatasourceType.Query, + is_dttm: false, + }, + { + name: 'Column 3', + type: DatasourceType.Query, + is_dttm: false, + }, + { + name: 'Column 2', + type: DatasourceType.Query, + is_dttm: true, + }, + ], +}; + +export const mockdatasets = [...new Array(3)].map((_, i) => ({ + changed_by_name: 'user', + kind: i === 0 ? 'virtual' : 'physical', // ensure there is 1 virtual + changed_by_url: 'changed_by_url', + changed_by: 'user', + changed_on: new Date().toISOString(), + database_name: `db ${i}`, + explore_url: `/explore/?datasource_type=table&datasource_id=${i}`, + id: i, + schema: `schema ${i}`, + table_name: `coolest table ${i}`, + owners: [{ username: 'admin', userId: 1 }], +})); diff --git a/superset-frontend/src/SqlLab/hooks/useQueryEditor/index.ts b/superset-frontend/src/SqlLab/hooks/useQueryEditor/index.ts new file mode 100644 index 000000000000..7044e77798fd --- /dev/null +++ b/superset-frontend/src/SqlLab/hooks/useQueryEditor/index.ts @@ -0,0 +1,38 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import pick from 'lodash/pick'; +import { shallowEqual, useSelector } from 'react-redux'; +import { SqlLabRootState, QueryEditor } from 'src/SqlLab/types'; + +export default function useQueryEditor<T extends keyof QueryEditor>( + sqlEditorId: string, + attributes: ReadonlyArray<T>, +) { + return useSelector<SqlLabRootState, Pick<QueryEditor, T | 'id'>>( + ({ sqlLab: { unsavedQueryEditor, queryEditors } }) => + pick( + { + ...queryEditors.find(({ id }) => id === sqlEditorId), + ...(sqlEditorId === unsavedQueryEditor.id && unsavedQueryEditor), + }, + ['id'].concat(attributes), + ) as Pick<QueryEditor, T | 'id'>, + shallowEqual, + ); +} diff --git a/superset-frontend/src/SqlLab/hooks/useQueryEditor/useQueryEditor.test.ts b/superset-frontend/src/SqlLab/hooks/useQueryEditor/useQueryEditor.test.ts new file mode 100644 index 000000000000..23de4d68226c --- /dev/null +++ b/superset-frontend/src/SqlLab/hooks/useQueryEditor/useQueryEditor.test.ts @@ -0,0 +1,92 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import configureStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import { initialState, defaultQueryEditor } from 'src/SqlLab/fixtures'; +import { renderHook } from '@testing-library/react-hooks'; +import { createWrapper } from 'spec/helpers/testing-library'; + +import useQueryEditor from '.'; + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); + +test('returns selected queryEditor values', () => { + const { result } = renderHook( + () => + useQueryEditor(defaultQueryEditor.id, [ + 'id', + 'name', + 'dbId', + 'schemaOptions', + ]), + { + wrapper: createWrapper({ + useRedux: true, + store: mockStore(initialState), + }), + }, + ); + expect(result.current).toEqual({ + id: defaultQueryEditor.id, + name: defaultQueryEditor.name, + dbId: defaultQueryEditor.dbId, + schemaOptions: defaultQueryEditor.schemaOptions, + }); +}); + +test('includes id implicitly', () => { + const { result } = renderHook( + () => useQueryEditor(defaultQueryEditor.id, ['name']), + { + wrapper: createWrapper({ + useRedux: true, + store: mockStore(initialState), + }), + }, + ); + expect(result.current).toEqual({ + id: defaultQueryEditor.id, + name: defaultQueryEditor.name, + }); +}); + +test('returns updated values from unsaved change', () => { + const expectedSql = 'SELECT updated_column\nFROM updated_table\nWHERE'; + const { result } = renderHook( + () => useQueryEditor(defaultQueryEditor.id, ['id', 'sql']), + { + wrapper: createWrapper({ + useRedux: true, + store: mockStore({ + ...initialState, + sqlLab: { + ...initialState.sqlLab, + unsavedQueryEditor: { + id: defaultQueryEditor.id, + sql: expectedSql, + }, + }, + }), + }), + }, + ); + expect(result.current.id).toEqual(defaultQueryEditor.id); + expect(result.current.sql).toEqual(expectedSql); +}); diff --git a/superset-frontend/src/SqlLab/main.less b/superset-frontend/src/SqlLab/main.less deleted file mode 100644 index 652c7a60b218..000000000000 --- a/superset-frontend/src/SqlLab/main.less +++ /dev/null @@ -1,493 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -@import '../assets/stylesheets/less/variables.less'; - -body { - min-height: ~'max(100vh, 500px)'; // Set a min height so the gutter is always visible when resizing - overflow: hidden; -} - -.inlineBlock { - display: inline-block; -} - -.valignTop { - vertical-align: top; -} - -.inline { - display: inline; -} - -.nopadding { - padding: 0px; -} - -.pane-cell { - padding: 10px; - overflow: auto; - width: 100%; - height: 100%; -} - -.ant-tabs-content-holder { - /* This is needed for Safari */ - height: 100%; -} - -.ant-tabs-content { - height: 100%; - position: relative; - background-color: @lightest; - overflow-x: auto; - overflow-y: auto; - - > .ant-tabs-tabpane { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - } -} - -.Workspace .btn-sm { - box-shadow: 1px 1px 2px fade(@darkest, @opacity-light); - margin-top: 2px; - padding: 4px; -} - -.Workspace hr { - margin-top: 10px; - margin-bottom: 10px; -} - -div.Workspace { - height: 100%; - margin: 0px; -} - -.padded { - padding: 10px; -} - -.p-t-10 { - padding-top: 10px; -} - -.p-t-5 { - padding-top: 5px; -} - -.m-r-5 { - margin-right: 5px; -} - -.m-r-3 { - margin-right: 3px; -} - -.m-l-1 { - margin-left: 1px; -} - -.m-l-2 { - margin-left: 2px; -} - -.m-r-10 { - margin-right: 10px; -} - -.m-l-10 { - margin-left: 10px; -} - -.m-l-5 { - margin-left: 5px; -} - -.m-b-10 { - margin-bottom: 10px; -} - -.m-t-5 { - margin-top: 5px; -} - -.m-t-10 { - margin-top: 10px; -} - -.p-t-10 { - padding-top: 10px; -} - -.no-shadow { - box-shadow: none; - background-color: transparent; -} - -.pane-west { - height: 100%; - overflow: auto; -} - -.circle { - @circle-diameter: 10px; - border-radius: (@circle-diameter / 2); - width: @circle-diameter; - height: @circle-diameter; - - display: inline-block; - background-color: @gray-light; - text-align: center; - vertical-align: middle; - font-size: @font-size-m; - font-weight: @font-weight-bold; -} - -.running { - background-color: fade(@success, @opacity-heavy); - color: @darkest; -} - -.success { - background-color: @success; -} - -.failed { - background-color: @danger; -} - -.handle { - cursor: move; -} - -#a11y-query-editor-tabs { - height: 100%; - display: flex; - flex-direction: column; -} - -.SqlLab { - position: absolute; - top: 0px; - right: 0px; - bottom: 0px; - left: 0px; - padding: 0 10px; - - pre { - padding: 0px !important; - margin: 0px; - border: none; - font-size: @font-size-s; - background-color: transparent !important; - } - - .north-pane { - display: flex; - flex-direction: column; - } - - #ace-editor { - height: calc(100% - 51px); - flex-grow: 1; - } - - .ace_content { - height: 100%; - } -} - -.SqlEditorTabs li { - a:focus { - outline: 0; - } - - .ddbtn-tab { - font-size: inherit; - color: black; - - &:active { - background: none; - } - - svg { - vertical-align: middle; - } - } - - .dropdown.btn-group.btn-group-sm { - width: 3px; - height: 3px; - border-radius: 1.5px; - background: #bababa; - margin-right: 8px; - font-weight: @font-weight-normal; - display: inline-flex; - - &:hover { - background-color: @primary-color; - - &:before, - &:after { - background-color: @primary-color; - } - } - - &:before, - &:after { - position: absolute; - content: ' '; - width: 3px; - height: 3px; - border-radius: 1.5px; - background-color: #bababa; - } - &:before { - transform: translateY(-5px); - } - &:after { - transform: translateY(5px); - } - } - - ul.dropdown-menu { - margin-top: 10px; - } - - .dropdown-toggle { - padding-top: 2px; - } -} - -.SqlEditor { - display: flex; - flex-direction: row; - height: 100%; - padding: 10px; - - .schemaPane { - flex: 0 0 400px; - max-width: 400px; - transition: transform @timing-normal ease-in-out; - } - - .queryPane { - flex: 1 1 auto; - padding-left: 10px; - overflow-y: none; - overflow-x: scroll; - } - - .schemaPane-enter-done, - .schemaPane-exit { - transform: translateX(0); - z-index: 7; - } - - .schemaPane-exit-active { - transform: translateX(-120%); - } - - .schemaPane-enter-active { - transform: translateX(0); - max-width: 300px; - } - - .schemaPane-enter, - .schemaPane-exit-done { - max-width: 0; - transform: translateX(-120%); - overflow: hidden; - } - - .schemaPane-exit-done + .queryPane { - margin-left: 0; - } - - .gutter { - border-top: 1px solid @gray-light; - border-bottom: 1px solid @gray-light; - width: 3%; - margin: 3px 47%; - } - - .gutter.gutter-vertical { - cursor: row-resize; - } -} - -.SqlEditorLeftBar { - height: 100%; - display: flex; - flex-direction: column; - - .divider { - border-bottom: 1px solid @gray-bg; - margin: 15px 0; - } -} - -.popover { - max-width: 400px; -} - -.table-label { - margin-top: 5px; - margin-right: 10px; - float: left; -} - -div.tablePopover { - opacity: 0.7 !important; - - &:hover { - opacity: 1 !important; - } -} - -.ace_editor.ace_editor { - //double class is better than !important - border: 1px solid @gray-light; - font-feature-settings: @font-feature-settings; - // Fira Code causes problem with Ace under Firefox - font-family: 'Menlo', 'Consolas', 'Courier New', 'Ubuntu Mono', - 'source-code-pro', 'Lucida Console', monospace; - - &.ace_autocomplete { - // Use !important because Ace Editor applies extra CSS at the last second - // when opening the autocomplete. - width: 520px !important; - } -} - -.Select__menu-outer { - min-width: 100%; - width: inherit; - z-index: @z-index-dropdown; -} - -.Select__clear-indicator { - margin-top: -2px; -} - -.Select__arrow { - margin-top: 5px; -} - -.ace_scroller { - background-color: @gray-bg; -} - -.TableElement { - .well { - margin-top: 5px; - margin-bottom: 5px; - padding: 5px 10px; - } - - .ws-el-controls { - margin-right: -0.3em; - display: flex; - } - - .header-container { - display: flex; - flex: 1; - align-items: center; - width: 100%; - - .table-name { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - font-size: 16px; - flex: 1; - } - - .header-right-side { - margin-left: auto; - display: flex; - align-items: center; - margin-right: 33px; - } - } -} - -.QueryTable .label { - display: inline-block; -} - -.QueryTable .ant-btn { - position: static; -} - -.ResultsModal .ant-modal-body { - min-height: 560px; -} - -.ant-modal-body { - overflow: auto; -} - -a.Link { - cursor: pointer; -} - -.QueryTable .well { - padding: 3px 5px; - margin: 3px 5px; -} - -.nav-tabs .ddbtn-tab { - padding: 0; - border: none; - background: none; - position: relative; - top: 2px; - - &:focus { - outline: 0; - } - - &:active { - box-shadow: none; - } -} - -.icon-container { - display: inline-block; - width: 30px; - text-align: center; -} - -.search-date-filter-container { - display: flex; - - .Select { - margin-right: 3px; - } -} - -.cost-estimate { - font-size: @font-size-s; -} diff --git a/superset-frontend/src/SqlLab/reducers/getInitialState.js b/superset-frontend/src/SqlLab/reducers/getInitialState.js index d5f02029d0cc..2d00d3e0d68b 100644 --- a/superset-frontend/src/SqlLab/reducers/getInitialState.js +++ b/superset-frontend/src/SqlLab/reducers/getInitialState.js @@ -37,11 +37,11 @@ export default function getInitialState({ * To allow for a transparent migration, the initial state is a combination * of the backend state (if any) with the browser state (if any). */ - const queryEditors = []; + let queryEditors = {}; const defaultQueryEditor = { id: null, loaded: true, - title: t('Untitled query'), + name: t('Untitled query'), sql: 'SELECT *\nFROM\nWHERE', selectedText: null, latestQueryId: null, @@ -55,13 +55,9 @@ export default function getInitialState({ errors: [], completed: false, }, - queryCostEstimate: { - cost: null, - completed: false, - error: null, - }, hideLeftBar: false, }; + let unsavedQueryEditor = {}; /** * Load state from the backend. This will be empty if the feature flag @@ -73,7 +69,7 @@ export default function getInitialState({ queryEditor = { id: id.toString(), loaded: true, - title: activeTab.label, + name: activeTab.label, sql: activeTab.sql || undefined, selectedText: undefined, latestQueryId: activeTab.latest_query @@ -99,10 +95,13 @@ export default function getInitialState({ ...defaultQueryEditor, id: id.toString(), loaded: false, - title: label, + name: label, }; } - queryEditors.push(queryEditor); + queryEditors = { + ...queryEditors, + [queryEditor.id]: queryEditor, + }; }); const tabHistory = activeTab ? [activeTab.id.toString()] : []; @@ -160,15 +159,22 @@ export default function getInitialState({ // migration was successful localStorage.removeItem('redux'); } else { + unsavedQueryEditor = sqlLab.unsavedQueryEditor || {}; // add query editors and tables to state with a special flag so they can // be migrated if the `SQLLAB_BACKEND_PERSISTENCE` feature flag is on - sqlLab.queryEditors.forEach(qe => - queryEditors.push({ - ...qe, - inLocalStorage: true, - loaded: true, - }), - ); + sqlLab.queryEditors.forEach(qe => { + queryEditors = { + ...queryEditors, + [qe.id]: { + ...queryEditors[qe.id], + ...qe, + name: qe.title || qe.name, + ...(unsavedQueryEditor.id === qe.id && unsavedQueryEditor), + inLocalStorage: true, + loaded: true, + }, + }; + }); sqlLab.tables.forEach(table => tables.push({ ...table, inLocalStorage: true }), ); @@ -186,11 +192,13 @@ export default function getInitialState({ databases, offline: false, queries, - queryEditors, + queryEditors: Object.values(queryEditors), tabHistory, tables, queriesLastUpdate: Date.now(), user, + unsavedQueryEditor, + queryCostEstimates: {}, }, requestedQuery, messageToasts: getToastsFromPyFlashMessages( diff --git a/superset-frontend/src/SqlLab/reducers/sqlLab.js b/superset-frontend/src/SqlLab/reducers/sqlLab.js index d20d34420575..e3bb196fbcef 100644 --- a/superset-frontend/src/SqlLab/reducers/sqlLab.js +++ b/superset-frontend/src/SqlLab/reducers/sqlLab.js @@ -16,8 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { t } from '@superset-ui/core'; - +import { QueryState, t } from '@superset-ui/core'; import getInitialState from './getInitialState'; import * as actions from '../actions/sqlLab'; import { now } from '../../utils/dates'; @@ -31,24 +30,53 @@ import { extendArr, } from '../../reduxUtils'; +function alterUnsavedQueryEditorState(state, updatedState, id) { + if (state.tabHistory[state.tabHistory.length - 1] !== id) { + const { queryEditors } = alterInArr( + state, + 'queryEditors', + { id }, + updatedState, + ); + return { + queryEditors, + }; + } + return { + unsavedQueryEditor: { + ...(state.unsavedQueryEditor.id === id && state.unsavedQueryEditor), + ...(id ? { id, ...updatedState } : state.unsavedQueryEditor), + }, + }; +} + export default function sqlLabReducer(state = {}, action) { const actionHandlers = { [actions.ADD_QUERY_EDITOR]() { - const tabHistory = state.tabHistory.slice(); - tabHistory.push(action.queryEditor.id); - const newState = { ...state, tabHistory }; + const mergeUnsavedState = alterInArr( + state, + 'queryEditors', + state.unsavedQueryEditor, + { + ...state.unsavedQueryEditor, + }, + ); + const newState = { + ...mergeUnsavedState, + tabHistory: [...state.tabHistory, action.queryEditor.id], + }; return addToArr(newState, 'queryEditors', action.queryEditor); }, [actions.QUERY_EDITOR_SAVED]() { - const { query, result } = action; - const existing = state.queryEditors.find(qe => qe.id === query.id); + const { query, result, clientId } = action; + const existing = state.queryEditors.find(qe => qe.id === clientId); return alterInArr( state, 'queryEditors', existing, { remoteId: result.remoteId, - title: query.title, + name: query.name, }, 'id', ); @@ -66,12 +94,17 @@ export default function sqlLabReducer(state = {}, action) { ); }, [actions.CLONE_QUERY_TO_NEW_TAB]() { - const progenitor = state.queryEditors.find( + const queryEditor = state.queryEditors.find( qe => qe.id === state.tabHistory[state.tabHistory.length - 1], ); + const progenitor = { + ...queryEditor, + ...(state.unsavedQueryEditor.id === queryEditor.id && + state.unsavedQueryEditor), + }; const qe = { remoteId: progenitor.remoteId, - title: t('Copy of %s', progenitor.title), + name: t('Copy of %s', progenitor.name), dbId: action.query.dbId ? action.query.dbId : null, schema: action.query.schema ? action.query.schema : null, autorun: true, @@ -79,10 +112,22 @@ export default function sqlLabReducer(state = {}, action) { queryLimit: action.query.queryLimit, maxRow: action.query.maxRow, }; - return sqlLabReducer(state, actions.addQueryEditor(qe)); + const stateWithoutUnsavedState = { + ...state, + unsavedQueryEditor: {}, + }; + return sqlLabReducer( + stateWithoutUnsavedState, + actions.addQueryEditor(qe), + ); }, [actions.REMOVE_QUERY_EDITOR]() { - let newState = removeFromArr(state, 'queryEditors', action.queryEditor); + const queryEditor = { + ...action.queryEditor, + ...(action.queryEditor.id === state.unsavedQueryEditor.id && + state.unsavedQueryEditor), + }; + let newState = removeFromArr(state, 'queryEditors', queryEditor); // List of remaining queryEditor ids const qeIds = newState.queryEditors.map(qe => qe.id); @@ -99,10 +144,19 @@ export default function sqlLabReducer(state = {}, action) { // Remove associated table schemas const tables = state.tables.filter( - table => table.queryEditorId !== action.queryEditor.id, + table => table.queryEditorId !== queryEditor.id, ); - newState = { ...newState, tabHistory, tables, queries }; + newState = { + ...newState, + tabHistory, + tables, + queries, + unsavedQueryEditor: { + ...(action.queryEditor.id !== state.unsavedQueryEditor.id && + state.unsavedQueryEditor), + }, + }; return newState; }, [actions.REMOVE_QUERY]() { @@ -175,20 +229,28 @@ export default function sqlLabReducer(state = {}, action) { [actions.COLLAPSE_TABLE]() { return alterInArr(state, 'tables', action.table, { expanded: false }); }, - [actions.REMOVE_TABLE]() { - return removeFromArr(state, 'tables', action.table); + [actions.REMOVE_TABLES]() { + const tableIds = action.tables.map(table => table.id); + return { + ...state, + tables: state.tables.filter(table => !tableIds.includes(table.id)), + }; }, [actions.START_QUERY_VALIDATION]() { - let newState = { ...state }; - const sqlEditor = { id: action.query.sqlEditorId }; - newState = alterInArr(newState, 'queryEditors', sqlEditor, { - validationResult: { - id: action.query.id, - errors: [], - completed: false, - }, - }); - return newState; + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + validationResult: { + id: action.query.id, + errors: [], + completed: false, + }, + }, + action.query.sqlEditorId, + ), + }; }, [actions.QUERY_VALIDATION_RETURNED]() { // If the server is very slow about answering us, we might get validation @@ -198,21 +260,29 @@ export default function sqlLabReducer(state = {}, action) { // We don't care about any but the most recent because validations are // only valid for the SQL text they correspond to -- once the SQL has // changed, the old validation doesn't tell us anything useful anymore. - const qe = getFromArr(state.queryEditors, action.query.sqlEditorId); + const qe = { + ...getFromArr(state.queryEditors, action.query.sqlEditorId), + ...(state.unsavedQueryEditor.id === action.query.sqlEditorId && + state.unsavedQueryEditor), + }; if (qe.validationResult.id !== action.query.id) { return state; } // Otherwise, persist the results on the queryEditor state - let newState = { ...state }; - const sqlEditor = { id: action.query.sqlEditorId }; - newState = alterInArr(newState, 'queryEditors', sqlEditor, { - validationResult: { - id: action.query.id, - errors: action.results, - completed: true, - }, - }); - return newState; + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + validationResult: { + id: action.query.id, + errors: action.results, + completed: true, + }, + }, + action.query.sqlEditorId, + ), + }; }, [actions.QUERY_VALIDATION_FAILED]() { // If the server is very slow about answering us, we might get validation @@ -246,45 +316,52 @@ export default function sqlLabReducer(state = {}, action) { return newState; }, [actions.COST_ESTIMATE_STARTED]() { - let newState = { ...state }; - const sqlEditor = { id: action.query.sqlEditorId }; - newState = alterInArr(newState, 'queryEditors', sqlEditor, { - queryCostEstimate: { - completed: false, - cost: null, - error: null, + return { + ...state, + queryCostEstimates: { + ...state.queryCostEstimates, + [action.query.id]: { + completed: false, + cost: null, + error: null, + }, }, - }); - return newState; + }; }, [actions.COST_ESTIMATE_RETURNED]() { - let newState = { ...state }; - const sqlEditor = { id: action.query.sqlEditorId }; - newState = alterInArr(newState, 'queryEditors', sqlEditor, { - queryCostEstimate: { - completed: true, - cost: action.json, - error: null, + return { + ...state, + queryCostEstimates: { + ...state.queryCostEstimates, + [action.query.id]: { + completed: true, + cost: action.json, + error: null, + }, }, - }); - return newState; + }; }, [actions.COST_ESTIMATE_FAILED]() { - let newState = { ...state }; - const sqlEditor = { id: action.query.sqlEditorId }; - newState = alterInArr(newState, 'queryEditors', sqlEditor, { - queryCostEstimate: { - completed: false, - cost: null, - error: action.error, + return { + ...state, + queryCostEstimates: { + ...state.queryCostEstimates, + [action.query.id]: { + completed: false, + cost: null, + error: action.error, + }, }, - }); - return newState; + }; }, [actions.START_QUERY]() { let newState = { ...state }; if (action.query.sqlEditorId) { - const qe = getFromArr(state.queryEditors, action.query.sqlEditorId); + const qe = { + ...getFromArr(state.queryEditors, action.query.sqlEditorId), + ...(action.query.sqlEditorId === state.unsavedQueryEditor.id && + state.unsavedQueryEditor), + }; if (qe.latestQueryId && state.queries[qe.latestQueryId]) { const newResults = { ...state.queries[qe.latestQueryId].results, @@ -299,14 +376,21 @@ export default function sqlLabReducer(state = {}, action) { newState.activeSouthPaneTab = action.query.id; } newState = addToObject(newState, 'queries', action.query); - const sqlEditor = { id: action.query.sqlEditorId }; - return alterInArr(newState, 'queryEditors', sqlEditor, { - latestQueryId: action.query.id, - }); + + return { + ...newState, + ...alterUnsavedQueryEditorState( + state, + { + latestQueryId: action.query.id, + }, + action.query.sqlEditorId, + ), + }; }, [actions.STOP_QUERY]() { return alterInObject(state, 'queries', action.query, { - state: 'stopped', + state: QueryState.STOPPED, results: [], }); }, @@ -320,12 +404,16 @@ export default function sqlLabReducer(state = {}, action) { }, [actions.REQUEST_QUERY_RESULTS]() { return alterInObject(state, 'queries', action.query, { - state: 'fetching', + state: QueryState.FETCHING, }); }, [actions.QUERY_SUCCESS]() { - // prevent race condition were query succeeds shortly after being canceled - if (action.query.state === 'stopped') { + // prevent race condition where query succeeds shortly after being canceled + // or the final result was unsuccessful + if ( + action.query.state === QueryState.STOPPED || + action.results.status !== QueryState.SUCCESS + ) { return state; } const alts = { @@ -333,7 +421,7 @@ export default function sqlLabReducer(state = {}, action) { progress: 100, results: action.results, rows: action?.results?.query?.rows || 0, - state: 'success', + state: QueryState.SUCCESS, limitingFactor: action?.results?.query?.limitingFactor, tempSchema: action?.results?.query?.tempSchema, tempTable: action?.results?.query?.tempTable, @@ -349,11 +437,11 @@ export default function sqlLabReducer(state = {}, action) { return alterInObject(state, 'queries', action.query, alts); }, [actions.QUERY_FAILED]() { - if (action.query.state === 'stopped') { + if (action.query.state === QueryState.STOPPED) { return state; } const alts = { - state: 'failed', + state: QueryState.FAILED, errors: action.errors, errorMessage: action.msg, endDttm: now(), @@ -367,14 +455,41 @@ export default function sqlLabReducer(state = {}, action) { qeIds.indexOf(action.queryEditor?.id) > -1 && state.tabHistory[state.tabHistory.length - 1] !== action.queryEditor.id ) { - const tabHistory = state.tabHistory.slice(); - tabHistory.push(action.queryEditor.id); - return { ...state, tabHistory }; + const mergeUnsavedState = alterInArr( + state, + 'queryEditors', + state.unsavedQueryEditor, + { + ...state.unsavedQueryEditor, + }, + ); + return { + ...(action.queryEditor.id === state.unsavedQueryEditor.id + ? alterInArr( + mergeUnsavedState, + 'queryEditors', + action.queryEditor, + { + ...action.queryEditor, + ...state.unsavedQueryEditor, + }, + ) + : mergeUnsavedState), + tabHistory: [...state.tabHistory, action.queryEditor.id], + }; } return state; }, [actions.LOAD_QUERY_EDITOR]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { + const mergeUnsavedState = alterInArr( + state, + 'queryEditors', + state.unsavedQueryEditor, + { + ...state.unsavedQueryEditor, + }, + ); + return alterInArr(mergeUnsavedState, 'queryEditors', action.queryEditor, { ...action.queryEditor, }); }, @@ -437,70 +552,161 @@ export default function sqlLabReducer(state = {}, action) { return { ...state, queries }; }, [actions.QUERY_EDITOR_SETDB]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - dbId: action.dbId, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + dbId: action.dbId, + }, + action.queryEditor.id, + ), + }; }, [actions.QUERY_EDITOR_SET_FUNCTION_NAMES]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - functionNames: action.functionNames, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + functionNames: action.functionNames, + }, + action.queryEditor.id, + ), + }; }, [actions.QUERY_EDITOR_SET_SCHEMA]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - schema: action.schema, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + schema: action.schema, + }, + action.queryEditor.id, + ), + }; }, [actions.QUERY_EDITOR_SET_SCHEMA_OPTIONS]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - schemaOptions: action.options, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + schemaOptions: action.options, + }, + action.queryEditor.id, + ), + }; }, [actions.QUERY_EDITOR_SET_TABLE_OPTIONS]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - tableOptions: action.options, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + tableOptions: action.options, + }, + action.queryEditor.id, + ), + }; }, [actions.QUERY_EDITOR_SET_TITLE]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - title: action.title, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + name: action.name, + }, + action.queryEditor.id, + ), + }; }, [actions.QUERY_EDITOR_SET_SQL]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - sql: action.sql, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + sql: action.sql, + }, + action.queryEditor.id, + ), + }; }, [actions.QUERY_EDITOR_SET_QUERY_LIMIT]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - queryLimit: action.queryLimit, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + queryLimit: action.queryLimit, + }, + action.queryEditor.id, + ), + }; }, [actions.QUERY_EDITOR_SET_TEMPLATE_PARAMS]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - templateParams: action.templateParams, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + templateParams: action.templateParams, + }, + action.queryEditor.id, + ), + }; }, [actions.QUERY_EDITOR_SET_SELECTED_TEXT]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - selectedText: action.sql, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + selectedText: action.sql, + }, + action.queryEditor.id, + ), + }; }, [actions.QUERY_EDITOR_SET_AUTORUN]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - autorun: action.autorun, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + autorun: action.autorun, + }, + action.queryEditor.id, + ), + }; }, [actions.QUERY_EDITOR_PERSIST_HEIGHT]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - northPercent: action.northPercent, - southPercent: action.southPercent, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + northPercent: action.northPercent, + southPercent: action.southPercent, + }, + action.queryEditor.id, + ), + }; }, [actions.QUERY_EDITOR_TOGGLE_LEFT_BAR]() { - return alterInArr(state, 'queryEditors', action.queryEditor, { - hideLeftBar: action.hideLeftBar, - }); + return { + ...state, + ...alterUnsavedQueryEditorState( + state, + { + hideLeftBar: action.hideLeftBar, + }, + action.queryEditor.id, + ), + }; }, [actions.SET_DATABASES]() { const databases = {}; @@ -520,8 +726,8 @@ export default function sqlLabReducer(state = {}, action) { Object.entries(action.alteredQueries).forEach(([id, changedQuery]) => { if ( !state.queries.hasOwnProperty(id) || - (state.queries[id].state !== 'stopped' && - state.queries[id].state !== 'failed') + (state.queries[id].state !== QueryState.STOPPED && + state.queries[id].state !== QueryState.FAILED) ) { if (changedQuery.changedOn > queriesLastUpdate) { queriesLastUpdate = changedQuery.changedOn; @@ -535,8 +741,8 @@ export default function sqlLabReducer(state = {}, action) { // because of async behavior, sql lab may still poll a couple of seconds // when it started fetching or finished rendering results state: - currentState === 'success' && - ['fetching', 'success'].includes(prevState) + currentState === QueryState.SUCCESS && + [QueryState.FETCHING, QueryState.SUCCESS].includes(prevState) ? prevState : currentState, }; diff --git a/superset-frontend/src/SqlLab/reducers/sqlLab.test.js b/superset-frontend/src/SqlLab/reducers/sqlLab.test.js index 067cba3070ac..dd4c0be4b4ce 100644 --- a/superset-frontend/src/SqlLab/reducers/sqlLab.test.js +++ b/superset-frontend/src/SqlLab/reducers/sqlLab.test.js @@ -39,23 +39,77 @@ describe('sqlLabReducer', () => { qe = newState.queryEditors.find(e => e.id === 'abcd'); }); it('should add a query editor', () => { - expect(newState.queryEditors).toHaveLength(2); + expect(newState.queryEditors).toHaveLength( + initialState.queryEditors.length + 1, + ); + }); + it('should merge the current unsaved changes when adding a query editor', () => { + const expectedTitle = 'new updated title'; + const updateAction = { + type: actions.QUERY_EDITOR_SET_TITLE, + queryEditor: initialState.queryEditors[0], + name: expectedTitle, + }; + newState = sqlLabReducer(newState, updateAction); + const addAction = { + type: actions.ADD_QUERY_EDITOR, + queryEditor: { ...initialState.queryEditors[0], id: 'efgh' }, + }; + newState = sqlLabReducer(newState, addAction); + + expect(newState.queryEditors[0].name).toEqual(expectedTitle); + expect( + newState.queryEditors[newState.queryEditors.length - 1].id, + ).toEqual('efgh'); }); it('should remove a query editor', () => { - expect(newState.queryEditors).toHaveLength(2); + expect(newState.queryEditors).toHaveLength( + initialState.queryEditors.length + 1, + ); const action = { type: actions.REMOVE_QUERY_EDITOR, queryEditor: qe, }; newState = sqlLabReducer(newState, action); - expect(newState.queryEditors).toHaveLength(1); + expect(newState.queryEditors).toHaveLength( + initialState.queryEditors.length, + ); + }); + it('should remove a query editor including unsaved changes', () => { + expect(newState.queryEditors).toHaveLength( + initialState.queryEditors.length + 1, + ); + let action = { + type: actions.QUERY_EDITOR_SETDB, + queryEditor: qe, + dbId: 123, + }; + newState = sqlLabReducer(newState, action); + expect(newState.unsavedQueryEditor.dbId).toEqual(action.dbId); + action = { + type: actions.REMOVE_QUERY_EDITOR, + queryEditor: qe, + }; + newState = sqlLabReducer(newState, action); + expect(newState.queryEditors).toHaveLength( + initialState.queryEditors.length, + ); + expect(newState.unsavedQueryEditor.dbId).toBeUndefined(); + expect(newState.unsavedQueryEditor.id).toBeUndefined(); }); it('should set q query editor active', () => { + const expectedTitle = 'new updated title'; const addQueryEditorAction = { type: actions.ADD_QUERY_EDITOR, queryEditor: { ...initialState.queryEditors[0], id: 'abcd' }, }; newState = sqlLabReducer(newState, addQueryEditorAction); + const updateAction = { + type: actions.QUERY_EDITOR_SET_TITLE, + queryEditor: initialState.queryEditors[1], + name: expectedTitle, + }; + newState = sqlLabReducer(newState, updateAction); const setActiveQueryEditorAction = { type: actions.SET_ACTIVE_QUERY_EDITOR, queryEditor: defaultQueryEditor, @@ -64,6 +118,7 @@ describe('sqlLabReducer', () => { expect(newState.tabHistory[newState.tabHistory.length - 1]).toBe( defaultQueryEditor.id, ); + expect(newState.queryEditors[1].name).toEqual(expectedTitle); }); it('should not fail while setting DB', () => { const dbId = 9; @@ -73,7 +128,8 @@ describe('sqlLabReducer', () => { dbId, }; newState = sqlLabReducer(newState, action); - expect(newState.queryEditors[1].dbId).toBe(dbId); + expect(newState.unsavedQueryEditor.dbId).toBe(dbId); + expect(newState.unsavedQueryEditor.id).toBe(qe.id); }); it('should not fail while setting schema', () => { const schema = 'foo'; @@ -83,7 +139,8 @@ describe('sqlLabReducer', () => { schema, }; newState = sqlLabReducer(newState, action); - expect(newState.queryEditors[1].schema).toBe(schema); + expect(newState.unsavedQueryEditor.schema).toBe(schema); + expect(newState.unsavedQueryEditor.id).toBe(qe.id); }); it('should not fail while setting autorun', () => { const action = { @@ -91,19 +148,22 @@ describe('sqlLabReducer', () => { queryEditor: qe, }; newState = sqlLabReducer(newState, { ...action, autorun: false }); - expect(newState.queryEditors[1].autorun).toBe(false); + expect(newState.unsavedQueryEditor.autorun).toBe(false); + expect(newState.unsavedQueryEditor.id).toBe(qe.id); newState = sqlLabReducer(newState, { ...action, autorun: true }); - expect(newState.queryEditors[1].autorun).toBe(true); + expect(newState.unsavedQueryEditor.autorun).toBe(true); + expect(newState.unsavedQueryEditor.id).toBe(qe.id); }); it('should not fail while setting title', () => { - const title = 'a new title'; + const title = 'Untitled Query 1'; const action = { type: actions.QUERY_EDITOR_SET_TITLE, queryEditor: qe, - title, + name: title, }; newState = sqlLabReducer(newState, action); - expect(newState.queryEditors[1].title).toBe(title); + expect(newState.unsavedQueryEditor.name).toBe(title); + expect(newState.unsavedQueryEditor.id).toBe(qe.id); }); it('should not fail while setting Sql', () => { const sql = 'SELECT nothing from dev_null'; @@ -113,7 +173,8 @@ describe('sqlLabReducer', () => { sql, }; newState = sqlLabReducer(newState, action); - expect(newState.queryEditors[1].sql).toBe(sql); + expect(newState.unsavedQueryEditor.sql).toBe(sql); + expect(newState.unsavedQueryEditor.id).toBe(qe.id); }); it('should not fail while setting queryLimit', () => { const queryLimit = 101; @@ -123,18 +184,40 @@ describe('sqlLabReducer', () => { queryLimit, }; newState = sqlLabReducer(newState, action); - expect(newState.queryEditors[1].queryLimit).toEqual(queryLimit); + expect(newState.unsavedQueryEditor.queryLimit).toBe(queryLimit); + expect(newState.unsavedQueryEditor.id).toBe(qe.id); }); it('should set selectedText', () => { const selectedText = 'TEST'; const action = { type: actions.QUERY_EDITOR_SET_SELECTED_TEXT, - queryEditor: newState.queryEditors[0], + queryEditor: qe, sql: selectedText, }; - expect(newState.queryEditors[0].selectedText).toBeNull(); + expect(qe.selectedText).toBeFalsy(); newState = sqlLabReducer(newState, action); - expect(newState.queryEditors[0].selectedText).toBe(selectedText); + expect(newState.unsavedQueryEditor.selectedText).toBe(selectedText); + expect(newState.unsavedQueryEditor.id).toBe(qe.id); + }); + it('should not wiped out unsaved changes while delayed async call intercepted', () => { + const expectedSql = 'Updated SQL WORKING IN PROGRESS--'; + const action = { + type: actions.QUERY_EDITOR_SET_SQL, + queryEditor: qe, + sql: expectedSql, + }; + newState = sqlLabReducer(newState, action); + expect(newState.unsavedQueryEditor.sql).toBe(expectedSql); + const interceptedAction = { + type: actions.QUERY_EDITOR_SET_FUNCTION_NAMES, + queryEditor: newState.queryEditors[0], + functionNames: ['func1', 'func2'], + }; + newState = sqlLabReducer(newState, interceptedAction); + expect(newState.unsavedQueryEditor.sql).toBe(expectedSql); + expect(newState.queryEditors[0].functionNames).toBe( + interceptedAction.functionNames, + ); }); }); describe('Tables', () => { @@ -181,8 +264,8 @@ describe('sqlLabReducer', () => { }); it('should remove a table', () => { const action = { - type: actions.REMOVE_TABLE, - table: newTable, + type: actions.REMOVE_TABLES, + tables: [newTable], }; newState = sqlLabReducer(newState, action); expect(newState.tables).toHaveLength(0); diff --git a/superset-frontend/src/SqlLab/types.ts b/superset-frontend/src/SqlLab/types.ts index fb3993fe84f6..7317ef0789d5 100644 --- a/superset-frontend/src/SqlLab/types.ts +++ b/superset-frontend/src/SqlLab/types.ts @@ -16,26 +16,42 @@ * specific language governing permissions and limitations * under the License. */ +import { JsonObject, QueryResponse } from '@superset-ui/core'; import { SupersetError } from 'src/components/ErrorMessage/types'; import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; import { ToastType } from 'src/components/MessageToasts/types'; -import { Dataset } from '@superset-ui/chart-controls'; -import { Query, QueryResponse } from '@superset-ui/core'; -import { ExploreRootState } from 'src/explore/types'; +import { RootState } from 'src/dashboard/types'; +import { DropdownButtonProps } from 'src/components/DropdownButton'; +import { ButtonProps } from 'src/components/Button'; -export type ExploreDatasource = Dataset | QueryResponse; +export type QueryButtonProps = DropdownButtonProps | ButtonProps; + +// Object as Dictionary (associative array) with Query id as the key and type Query as the value +export type QueryDictionary = { + [id: string]: QueryResponse; +}; export interface QueryEditor { + id: string; dbId?: number; - title: string; + name: string; schema: string; autorun: boolean; sql: string; remoteId: number | null; + tableOptions: any[]; + schemaOptions?: SchemaOption[]; + functionNames: string[]; validationResult?: { completed: boolean; errors: SupersetError[]; }; + hideLeftBar?: boolean; + latestQueryId?: string | null; + templateParams?: string; + selectedText?: string; + queryLimit?: number; + description?: string; } export type toastState = { @@ -53,20 +69,25 @@ export type SqlLabRootState = { databases: Record<string, any>; dbConnect: boolean; offline: boolean; - queries: Query[]; + queries: Record<string, QueryResponse>; queryEditors: QueryEditor[]; tabHistory: string[]; // default is activeTab ? [activeTab.id.toString()] : [] tables: Record<string, any>[]; queriesLastUpdate: number; user: UserWithPermissionsAndRoles; errorMessage: string | null; + unsavedQueryEditor: Partial<QueryEditor>; + queryCostEstimates?: Record<string, QueryCostEstimate>; }; localStorageUsageInKilobytes: number; messageToasts: toastState[]; - common: {}; + common: { + flash_messages: string[]; + conf: JsonObject; + }; }; -export type SqlLabExploreRootState = SqlLabRootState | ExploreRootState; +export type SqlLabExploreRootState = SqlLabRootState | RootState; export const getInitialState = (state: SqlLabExploreRootState) => { if (state.hasOwnProperty('sqlLab')) { @@ -76,10 +97,8 @@ export const getInitialState = (state: SqlLabExploreRootState) => { return user; } - const { - explore: { user }, - } = state as ExploreRootState; - return user; + const { user } = state as RootState; + return user as UserWithPermissionsAndRoles; }; export enum DatasetRadioState { @@ -91,7 +110,7 @@ export const EXPLORE_CHART_DEFAULT = { metrics: [], groupby: [], time_range: 'No filter', - viz_type: 'table', + row_limit: 1000, }; export interface DatasetOwner { @@ -106,3 +125,15 @@ export interface DatasetOptionAutocomplete { datasetId: number; owners: [DatasetOwner]; } + +export interface SchemaOption { + value: string; + label: string; + title: string; +} + +export interface QueryCostEstimate { + completed: string; + cost: Record<string, any>[]; + error: string; +} diff --git a/superset-frontend/src/SqlLab/utils/newQueryTabName.test.ts b/superset-frontend/src/SqlLab/utils/newQueryTabName.test.ts index d0d98c3cd5e2..33eec7378161 100644 --- a/superset-frontend/src/SqlLab/utils/newQueryTabName.test.ts +++ b/superset-frontend/src/SqlLab/utils/newQueryTabName.test.ts @@ -17,9 +17,11 @@ * under the License. */ +import { defaultQueryEditor } from 'src/SqlLab/fixtures'; import { newQueryTabName } from './newQueryTabName'; const emptyEditor = { + ...defaultQueryEditor, title: '', schema: '', autorun: false, @@ -36,8 +38,8 @@ describe('newQueryTabName', () => { it('should return next available number if there are unsaved editors', () => { const untitledQueryText = 'Untitled Query'; const unsavedEditors = [ - { ...emptyEditor, title: `${untitledQueryText} 1` }, - { ...emptyEditor, title: `${untitledQueryText} 2` }, + { ...emptyEditor, name: `${untitledQueryText} 1` }, + { ...emptyEditor, name: `${untitledQueryText} 2` }, ]; const nextTitle = newQueryTabName(unsavedEditors); diff --git a/superset-frontend/src/SqlLab/utils/newQueryTabName.ts b/superset-frontend/src/SqlLab/utils/newQueryTabName.ts index 3815226cd4ba..ac0728339c93 100644 --- a/superset-frontend/src/SqlLab/utils/newQueryTabName.ts +++ b/superset-frontend/src/SqlLab/utils/newQueryTabName.ts @@ -31,10 +31,10 @@ export const newQueryTabName = ( if (queryEditors.length > 0) { const mappedUntitled = queryEditors.filter(qe => - qe.title.match(untitledQueryRegex), + qe.name?.match(untitledQueryRegex), ); const untitledQueryNumbers = mappedUntitled.map( - qe => +qe.title.replace(untitledQuery, ''), + qe => +qe.name.replace(untitledQuery, ''), ); if (untitledQueryNumbers.length > 0) { // When there are query tabs open, and at least one is called "Untitled Query #" diff --git a/superset-frontend/src/SqlLab/utils/reduxStateToLocalStorageHelper.js b/superset-frontend/src/SqlLab/utils/reduxStateToLocalStorageHelper.js index 3a4288180dbf..66e33b07c5f4 100644 --- a/superset-frontend/src/SqlLab/utils/reduxStateToLocalStorageHelper.js +++ b/superset-frontend/src/SqlLab/utils/reduxStateToLocalStorageHelper.js @@ -32,7 +32,7 @@ const PERSISTENT_QUERY_EDITOR_KEYS = new Set([ 'southPercent', 'sql', 'templateParams', - 'title', + 'name', 'hideLeftBar', ]); diff --git a/superset-frontend/src/SqlLab/utils/useInterval.ts b/superset-frontend/src/SqlLab/utils/useInterval.ts new file mode 100644 index 000000000000..731e6c85cf74 --- /dev/null +++ b/superset-frontend/src/SqlLab/utils/useInterval.ts @@ -0,0 +1,47 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { useEffect, useRef } from 'react'; + +/* + * Functional components and setTimeout with useState do not play well + * and the setTimeout callback typically has stale state from a closure + * The useInterval function solves this issue. + * more info: https://overreacted.io/making-setinterval-declarative-with-react-hooks/ + */ +function useInterval(callback: Function, delay: number | null): void { + const savedCallback = useRef<Function>(callback); + // Remember the latest function. + useEffect(() => { + savedCallback.current = callback; + }, [callback]); + + // Set up the interval. + useEffect(() => { + function tick() { + savedCallback?.current?.(); + } + if (delay !== null) { + const id = setInterval(tick, delay); + return () => clearInterval(id); + } + return () => {}; + }, [delay]); +} + +export default useInterval; diff --git a/superset-frontend/src/addSlice/AddSliceContainer.test.tsx b/superset-frontend/src/addSlice/AddSliceContainer.test.tsx deleted file mode 100644 index 00e7276a5864..000000000000 --- a/superset-frontend/src/addSlice/AddSliceContainer.test.tsx +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import { ReactWrapper } from 'enzyme'; -import Button from 'src/components/Button'; -import { Select } from 'src/components'; -import AddSliceContainer, { - AddSliceContainerProps, - AddSliceContainerState, -} from 'src/addSlice/AddSliceContainer'; -import VizTypeGallery from 'src/explore/components/controls/VizTypeControl/VizTypeGallery'; -import { styledMount as mount } from 'spec/helpers/theming'; -import { act } from 'spec/helpers/testing-library'; - -const datasource = { - value: '1', - label: 'table', -}; - -describe('AddSliceContainer', () => { - let wrapper: ReactWrapper< - AddSliceContainerProps, - AddSliceContainerState, - AddSliceContainer - >; - - beforeEach(async () => { - wrapper = mount(<AddSliceContainer />) as ReactWrapper< - AddSliceContainerProps, - AddSliceContainerState, - AddSliceContainer - >; - // suppress a warning caused by some unusual async behavior in Icon - await act(() => new Promise(resolve => setTimeout(resolve, 0))); - }); - - it('renders a select and a VizTypeControl', () => { - expect(wrapper.find(Select)).toExist(); - expect(wrapper.find(VizTypeGallery)).toExist(); - }); - - it('renders a button', () => { - expect(wrapper.find(Button)).toExist(); - }); - - it('renders a disabled button if no datasource is selected', () => { - expect( - wrapper.find(Button).find({ disabled: true }).hostNodes(), - ).toHaveLength(1); - }); - - it('renders an enabled button if datasource and viz type is selected', () => { - wrapper.setState({ - datasource, - visType: 'table', - }); - expect( - wrapper.find(Button).find({ disabled: true }).hostNodes(), - ).toHaveLength(0); - }); - - it('formats explore url', () => { - wrapper.setState({ - datasource, - visType: 'table', - }); - const formattedUrl = - '/superset/explore/?form_data=%7B%22viz_type%22%3A%22table%22%2C%22datasource%22%3A%221%22%7D'; - expect(wrapper.instance().exploreUrl()).toBe(formattedUrl); - }); -}); diff --git a/superset-frontend/src/addSlice/App.tsx b/superset-frontend/src/addSlice/App.tsx deleted file mode 100644 index dac830308364..000000000000 --- a/superset-frontend/src/addSlice/App.tsx +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import { hot } from 'react-hot-loader/root'; -import { ThemeProvider } from '@superset-ui/core'; -import { GlobalStyles } from 'src/GlobalStyles'; -import setupApp from '../setup/setupApp'; -import setupPlugins from '../setup/setupPlugins'; -import { DynamicPluginProvider } from '../components/DynamicPlugins'; -import AddSliceContainer from './AddSliceContainer'; -import { initFeatureFlags } from '../featureFlags'; -import { theme } from '../preamble'; - -setupApp(); -setupPlugins(); - -const addSliceContainer = document.getElementById('app'); -const bootstrapData = JSON.parse( - addSliceContainer?.getAttribute('data-bootstrap') || '{}', -); - -initFeatureFlags(bootstrapData.common.feature_flags); - -const App = () => ( - <ThemeProvider theme={theme}> - <GlobalStyles /> - <DynamicPluginProvider> - <AddSliceContainer /> - </DynamicPluginProvider> - </ThemeProvider> -); - -export default hot(App); diff --git a/superset-frontend/src/assets/images/apache-kylin.png b/superset-frontend/src/assets/images/apache-kylin.png index 4b0fdab01d91d7071f64f4c5c7b6ae9ba28e3ebc..d69914cf56d15370b5ac758bfae34413b0c6c184 100644 GIT binary patch literal 9780 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 UkBmnC;{gCrQP7kxm$eA~Z&hp1PXGV_ literal 13694 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 diff --git a/superset-frontend/src/assets/images/clickhouse.png b/superset-frontend/src/assets/images/clickhouse.png index fae469d52bde0b36a692203091135e1129f1063b..0e75d77ed6851f0fb199df2aa3b4adcb10c671ac 100644 GIT binary patch literal 9841 zcmdUVcQl;syY(Q^B1j}6qPK`TM(@2wi4xHnW-!_?MvpE8QKAMxkPuO$22m2xBBJx^ zq6E=<=iKs^b<VfWcfRlZ*7@hmT4NsOe(ri*``UXy!XIcVUnQm{hCm=!RaF#pAP}5b zaQ%u97yK;hDGCA~M9wOPt`Nu-ii<Z6B=sc~1afHyrDuRO&`=k%LOb%n5ok*!kEf$E zXbpi#NP9ZNt?ZFl21}$3%1M%Gy{?go0fmrcdL*a;)o_+a+M-mvF-To+O+71bdn-`{ zle83rgr^wjz!8asGk7{WIJt^>N;3WKR}5TV{F#@D;dc|Py(E+D#efV38V?xc(HJCy zFb|B|3JQfX2#fLv3JD=CtpqIvxENqi7>pMx$O{$ahKh*61jPge8UA`PfdMfHYcU-K zrN4#)zezILVzJI*yu2PB9y}iWJZOv!FQ2HWC@&Po3xjck7Tm60PFT1nx05UL-#sWG zU9B)EXDkZs#Bk9g+!F1Em1F{w{c{zL&i{1l<oef6fj#5(ggf){@jx$D^}8X$>YsMb zZWxE(gCneXkq$^lq!ZQ^wB`G!t+Oo}i*~g||6jWP=j;D40N7m(jeo}YPv_$3_|Fio zSVecRjK4PIKW*)*=jDv#)j_(V-7r>2MRzbw=8M%hi^*e<a4Z_5hekX6eO3?to-zZB zpGSa!T?1}~a=KW=y?=KLQUQ)dN-}|S<Ku?%bHn)c_=Ln@LSllVoZtYV&_A1Mpb;o* zuYa1tz~OT9LG}2cVlZJbe%OC#3gQL<$HM=gjS*I2)@Y0)94r~-2)9A<Iy>1gG5oWU zV)AGQGzJU|X2<_~78)92s!pz0xRVu9RY8&oteOXfLWo&It@z-=mPl@>kRX&>z!D1M z78S8Va6@5GYfGdxLKG?>`1kz^Xe+miv;F&i#DDXCEer~z7u?}r?&l)uE`mZ#1?38k z%j>V4&_%lZb>)C!_#FpgaI1^>mSnQJI9Mct>90Sd{^cF`vs({aB<S?NIPO22xuUJH z9&ij&)&}g>|3^Uag6Z>K<l>(z;r%}s`TM(nm$!d62Vih<`413*U;cqIq!Yj|3;-&J z*kC;fgppZQK~~T6<?4iwfu7qL!A7^J4bQj4z`!4*Oi!6Eg)4d8Gr?}h>03KW)>Q8q z3VS$Kulz!n7gps}7A85>4M`Q7epJkTllYd?48~%3$xzWL2nxmhJ`HV#Ci5@6oT8s{ zbf@Nt4*23CUD76P@xt}HN2}=i;pF%I2SE%FIl^$9Q~6sE#*m;VfltV<UnSuRiM6$` zU<^^f!@I)BLQQ2r$k^M|1lr-_Q_86bKugKxvIGAYHDx@^y5cPQQ~1+I(mx_)4kcCa zLY@UbO_uc`fKZew>dI?{%qde>T_2x1$HRM7b9<*GXy(W-ZdCu$EkC^R%hQeLAGoe( zpOcP`9o<VSCoZ(lTHti{_rHVxu`I!C0;fodad9}Dy!IoXd2{v-#BBQG^d|1|e)j}X z{W<>kA&)E3d4W2Yq%wDd#;z1zvUNKz8Fj^xaNpRQ_=;PMKIXksgeyx#$FpHT$E$2l zyVk^_NO-mXMG0IrClFLnLO(KMNDu_~N>KHAk?m!|si`?>W7WX8-Np|8y^(eOj5FaZ zs#l4pXgO8Sz+e8HAw3VG4yh^8VNFWZvN$ayCVpAxVfhV9TT`c318`$WA1C;A;zJ}_ zZ^|({eIuY0q*N1;X=Myi8a8-}7eY=<{6BcYR(>to*qel({q+yB-*y)AQ=RZDlZ!6) zM2l45k}W*76@XiuYLQ?1w7k0|v5pm!q|?&UBJ18JX?{Csm#D`2T!ktW{-Q~7al)y( z17T@M31MPpb`vvgy0^OPEgH?77Na6sZ-##K=#h<0o*qZk)2BU4*iY*z3y1fUc?^s6 zGZwruhL^DT!9U7w&+U5in$`|XOlW8)DCH1cxe~8NU}Qmgx&bXMb_rrA<+6vRMAJ)8 zj*mOQQdZpSntx1tNwKgf<n%7?9)*O2bj06Xn44>#$ArQk-}UnF*spRNi>4K4OH^BL zJU@GLKUt0C{Im({=63VetxRcuDQ4!`A!9V{^KWG%4o`l+yz9>zj@Qzp{rzlhZDYs0 z>nGp6dlw^pcJTSh6#)%i<EoY7y0uyd3sIWr<}kALk@7aX%GTD_Vw0M!+U4Rqd&@G9 zuHX+<KAZiJo11%jyq}zu<afMU9TgR2hL)~g1xptmcWy2;EO)AzPg+@7DJ_L=iD>k* z#iQ0I>mg87-)r&pkNvj{f*4lDYqpE3Ct=i4hK7dW;o-M$-)`o0Mx)omDeg9$9og5I zNV&{>87a3Rpf`Y62&FY1%tTgI3BA#&asKhyLTJ;wzNn~3++z(ZLZhv%9eInlwTZeD z?4u!1azRDK&guTt`CPn~w~r4_KsI~00#kg)Yn^+F+GZugvzyK|HkC$XG$PK6Jz2)+ z`rX5Y%uFFi>JhwVD5mD+Nuf^ui9M%N^>Hwn)Z2IOa09H`qG?4jERvGxxnbg=^8Hv9 z6+#GM&?}w%V%xAAiuZ01C#qeBNOW^1eziDy-G0q0g8;JiouqQbR=~o-G|eDM61&** zYp_5y7ZRYEm&Rw+8YMjWc6j+AM<N5Eq@*O|fw{T=${+9h^R&vjI?K33-H6Ny+?%?; zgb-1D{rXjcPD@2a#nO_gd%Ky8D<ZpH(>9gv^W@_v2&!CkAc1VOqV|owx)>KKgJFi` z&WEO^r+-+*q)YlFNyH^5S7YYC?(FQ$%^`FM7(FxAS5_Px9VIby?LWKH@-)*^U%sUI z#yE#LOck`pikTvjNI$<b4dIEosrn~94}<8->>s$f?b?^r>+9;`L0~BklOMghrH%_r zvKC@;mll7&?&;>Lr;8;b4bwGmePd*gP}9^jt8;fmqtONiRH!yaY$e>n)LtZ7+<nCW z4rfGBbb-OZ8_>{TbPH77%#1E&nS3sgJ)+O9k~)g5y~<ciD`t3^)sZJ68vz?}w){Tq zjij>P;q-WYsNP?p&UVL7{y=S0VjWW>5>0U_Fq=ITeuG#sHp)<zynTQ&BKwl;E0j@@ ze$3f@Di}$jeN>C(JuWVmoWS1RUNWfz3r$T;Xr{_mFWDA*5Q70%Qf;kR$uMVpM{(oX zQD9%&JZ8i}D5uxJ%*^k{=gWOsuXXZubaeXq`Yf%i2JLolYJ^XFHB?nq)z_yZM@mae z2L|+}N`DUi#MBh(7l2z+)b$Gz)hQ#x!+V!^eedR93u5>%u?B({HfTTo!38gIXm%6p z;W4)A9<Gqxza&7dF-1GN>K@r*2}?;$OA{9tm!yl4%X<3ssfwCfL}a9HzMfH$`zsf` zBqXod$3J>|wI4nl?CX<j=>FW?49<|6f+9XP7OE4!RLntAsLdA8gZGih;O@p5<L6*? zQmjOeT|n0UF>%lXQ&UqTBQ?LS?(R%}o9}~f14_A!&CMI#SB>I35?;PM`7XZB!pgeq zn>uI*B18oahd+Gy@X@2>38%32&}}eSe_vm&R_0lJ<_SxCG(QAvLw2_1>S!f5H+Ow~ zJ*R%5imK}Ej$1;I=-F@9+r2r;WONb+=H^qAlWUk7mh0g<`Ojivx;r`yD{Qr`t#jqF z2>*CM9`f_&&s%1mKX#V-)!txse+_z!yC^q?+1lHWRXG|fDn8NUFs;QdWh+KLmajla z)6&v{w3qPSv2}DT>au1o_kW{vFGVZ)#fulIsYj9KCjg&w(AI8lZob=H!kNB%hF}pk zHZ~p}!d@nCbQG19^IpG}I9kj}NlCG*^q!k6FTlmK#}b*9(q0}j$Kio!;N5P&4v~S# z;$&$B{%n&WtIwLl)M#c%bhyw!+UK`wTo*#a!eZ1r8e?WZ?CtH9m6ffnIYqY2V8!q< z7zl%UZO1E6{dt*wMy9435p!1MBVuA=-!mkA=Gvc6`y5@CeOppuUT&?St$hvhErs9a zRmz)30t%jnW+l~NH)mU;2*~Ih92|D&RW1jB?9a~5o|&0BUaMQr@LA)dBEeyG5lg>$ z^QKLA#>0ZaTRbLIi|qOZZc`1u$}x0r*zG=t5N-eL+9oT!a*O9=p4We*4B08;18^)( zg~i3iB|kqOClCosne;zD<u<O;d-Uj-4nY;Va0u2A-+}!#kPkvbVym6G5!~E%@P(A5 zu$R^IlP@lf;`EQeT}eV2Ja(KLyO466P$~f9Sa<g$C46RPW`2JDl0Fg1d{$KDDCjCm zsefPBNht07Y`?K_>nkT+3<0DyhQ1Mi_v_az;R;~0#zsf?)~BX=ddR_Q0Q}F%g5tPS z-FUj%lO_MVRtQgeTE&jMyB^N+Vpy|w72k`kd;6|d#^bZY1%Tc%#X4U*I{}(1VX;^M z7%i5dTEw93RFsw5W@Ds_2kr3G<a7r8&5X@Snr#KBArJEPaC~*RIw>hB8@9iTYv#pg zzg;eA^jjORxpwUuBO@bSOdA4r5jBa4iF7exCbsj9#>t(#y~^}O=8cnfm2t{2e*QeI zOu9RF?B5%Z(u!e!e!Cq#`>vqC+;?{npzLja>u2*k+#m^+IRo_Z{%9E9%7Mt>Cpd_# z%7Sc}v=zXGC~D8)X&fQL9!}#N?2UVzlZMSUlSx0GjS`lii&4t)T6y30^IHl9J-t>d z1>hVlmWQY7{^ojmuk|>rtgHw|8_!EL^IW?#Btgw@7+Z~g_ROTw&)3`gNCuh1&hbi9 zxV>O;pY@=ky1H?*_0I9$>Z}Nll$0OHQgE;Xc9r<SS=H6UtL`O6mG54?n%*5YuQn>W zBjoTx!fPvz^*%mv?xzAj7O`VZCVLcWq`|kYe<`5@!TG58@xhO<+o8QnSWL}F(1Yds zLeN8Hr5h-Ypl6bUEfK$ygEVx5Y99w69x?tWR(^g`hm=3O{0_I~GyTsF3rZU7%13_v z`XzNR9Xv2F0E&mjWG($A{Gr7=9Ybo6n701ONm9rSML<=Sc8_{9iS7}~X=rq{M%`I; zuT#nysdcmW^K0-=l;uf|7gIqXSlV3h+~kgv$Ct2l5}q5~{%5Wp9@TPLo?9Jvx3{+m z@(BU%O8V@*=&}xl<E!$7!rNP9oT}4Ks7tl-`VIB;b_O4ryU^tIFI72=V896+eQqD7 z_WhY+b4k_{gh7|JtE{Z7l2R+QWSz*?O-M*6L)t$h`z<(W*852Z9=Ae6L*p!CTP>Pm zGe;cG4rXIC*eFoeQpYRhk(Asz9EoS*TB@qg)!x_-7w>vXu(Gl$N7K~oPx^%E9uyGc zEsx6LzgB4z(&*31%93vX5Hq&Q!@=>csOWM)=IM$}xlK2zi2P&xC3EKBwFYxePR=XD z#9;Rl)aF6JoJ<FkkydDZUf%WFY`N9a(vr;0owBKAM-#+wNzYN8t$%NItRr9=B)@f6 z>L6MTOjYW1ryn3SD8uZavwQba1W<h{Zumq&J!50{dF})9hPRrOyVMZ1jBY&L+xXE8 zd8NmZ={XZ#x86{PK77bA7<BoH`|7CM%on1Z-VeUV?j&3SYL{d;d`080;43$hfVc!O zB+;#`q{IVwuD_-4236?u4g><DbpL)QV1BL#8}Nv1z&!Q~%ugeBc1gbfa2BD7W~3Q4 zH#QyvSO{T&!L|Yk=&0sSNyx|msXg{s8}HaYX*}C4Iow{@7k8j$ImdgxCYPfA(^(`n zHI<ZJ$^l9R01|(Rl=+gZh}RZESC>Lj8&HxIA;(b}w?4p|L0anR>x-p-r?{(0Qu9X+ z<YMc!6G|!-@$+zvD06aZYHG5wa3FDUan~s*!YES_OT`%(bg<8rKKoA5vp>5t&%bh( zT;h)jgui(G`t^$!R64rL)eBF*5pH|e-{LiMu(O--lA1P>OG0+1i!0;HfI7*h`BLP- zUR6^wIx>=<ItrAduCA`l%}x1&AH+fArEojDU!dSM9{nm98XCHKN9cum?oxkV4862j zPOojHQKeDQpxtrk^UirYM@Lo)ljhH#xhOk<0O;sHnIg~E`{gVGxNS!rU%SXpgMdJ{ z)mQ9lMf%DL3J}Qc_wF?&IVSjJ5p<#*y1Key63Kw4Y;9rc&87whDjdgz>LxOtKi~8} z-}eXA<_a5*yqp}J=X4+t5OSGk4D@~V6C)#D8`Gb5mxuTF_VDLM!8gy8m{HtpfE}b; z-IOWPZ~O9vDylUpDGAJ;69@)pK;b)+c}w#1QJ{9AP+sfx`&CX8?*{EaVJI&vgTY{c zLxEaGf*)KG8^rL(s(VhaO20t&Ho#imhJ$Q%w&k=50S%w}N!Nw%hoddbIzJ08;Vq{! z5q>_{oQ;f(yetb%>q0zC>7B!h`8F@$2g|a>Uv-oQaDMY9t)%zBJmxvwrZSxui?Fcp zfodrzD8VGmN4Axtt*uIB#$|f>>sp$5<#lywvm*I=-Xr(9R0)`Fn==>nUX$2nz20$h zxb5TZZRWFDxxLUWP7_`H`vtDoC+Z&M^(!hV0h)5QlP8@nXis?<$1uoRH}QR2A_Y4- zI4J0Oc$2v0DOZilL%?)(N${KJI^sLJ0aH=R;ggi~P4Fo@QJxQVwe5SyI$@xbzcXIr z3i#5eM<XvaZJ@eha&mGeJi{`T&^}F;V<PKQADuT$x33{YgKu2Fj_H=%|MpVU71VT) z<Ql;4l$1o6J!!FA`t{4s!GVjH*Z;?pTa-K|i_4QtT_C%_HkXx`8z#}dwwUX%dR!)s zKP0Hg^gOoVVa7sTZLOM`nss-E@5toHHJ11e0qU!woMPhQ$KM0U;uM%VIy;YhWBe{y z01$U$t9t-vdMu!Y2JdIeH29g?y$o(BUQOWD$=55=KR&AAsiRL(w}z!aWU?NZM9p)~ zVZ1PyEqOA@3cJB~;1~gStgfoc5OvKhEG&HgzIPszF6HYDVs5rAru*wxrbxlKYh<Bt zN-l$q0bMPC`d;;uftZ)MOP_24pIxRh$ce;-kiKf{4w=3T|KK|(paIh3Lex&3p9w=& zrW(&Deb#peYl`Wnh!_&p1gWp0h(I`2RaUaHv5`7vR*z#kzb10hlC}ZuRqZ$iW;*G+ zKS4yn_AOId`b8*wqu>_F&Rw8d?%cVbdrd%Ccz<W-k~*Ah+F3-!;x<WWdwV;lqjA0- zM@*aR$h+GqRY~dT=}AdH-RnAn-me284Js4ZQXtvST5g%EXGj=wB)-$*FmG$@U(#d0 z0S>w>p1bv+*4nDJ-kUo+KnIV4xPs<I?D}~>gjR0?URtlKhd|7g_@CNu*()lx0AK_Z zNMOa%JoFrul#q}R3m#nT?(PDrM?0#*+UDY2pJ76?-y=`fmBJsEyL5DPv;auqmvD;H zVs+`61T`cE151(X1%kxbSiIfEl;@G6;$@=3ii!%L|IB0R&c&fB5qu=Bioq<zPvk(| z+dTrK%y%YFIX7Rup=ek%l$*=8HI=2uaaSYt5`?DB7l?bH2|ukr{`R?v8maSOg7{jD z>^Ele;{*S*7D-aRf~F0Yw>A*L@t<kxY;~u5V|UeG$Y>{wtxi^;bhWj6kv1%cYj{Ex z!AAu8dU|?5>NP__1lPH*g5afjI|Nm6lw*2sP^8~Ckr5xiJ?`3#w6WQiFgG(h%acCM z&&{>Q8u3uDsWX(b^O$`!Ffah}hp&g<-rnA0<quiE3_hz+v=o7&woZOR$SptzDxZr+ zi~Am7U0wNi9trPcnho;?e~L{_RqL-{AOzx`=1KNj5R8k9wwPW|7nk>F3B)T{Y~bhj zBtQdblZ2>;_9)9Xk}{po?XR=;oL-x|EfdwWvj~bvvbkT1-qq2uvEgFVV?YVhfr;`e zetda%XkcJvvOeu4RDRk&T9qXZfMxU@VN%H1VYk22Xhl8%lJzXZBu9XYj*hFsRV>$u z+FTHv`Fdh*zXqmG*E|r`k6m0gL$BTenyDwkTk-n!>mWtBpQ}jFbt}{RVyBw|{c@&k z1^fU3d-LWEP1}>OFs(G9uHi66Cl8gQ34<g->L_3S$b~~t5UVG>3-a^BC9ZE|03#?d zIhm|4W@vO&jZKF=@oP`dgDHPyclSN+>Tz6%dz~-fZfU}3x<%h|qoOb}dMUu*Hf+Ys z9)f_42nD{^m{Xl&OT^8~moL-B<TW&$rPySE^)&1b8B<VDbZD>-*a_A|w^_aixdRLy zAMn<aI-HBR$r&o`!!9oF1H=b!{Z3rx{L!-cIY3Icg>(-#78dp!#F#Chf8#qU&{GY- zKN$B~NcX*aHMRxn+xQhxc0o7*Cwld&Y1JJ)QpU>3X%BjmPgA0oNKtnOrNs|0yurai zfUwKMCHtNdfPg*&&fD@XX;`y$d5U_jX`Q?8#wUW;OZDEnzkugq{^MQ*jEaPhj}J1v z>8W=A{(Utyr-no8sWgZ35kTOlfQ_Y_r<p(a3l#p;T)eG%AiGwpr@nV}oo>eXtFPG> zJYa7>g3iq>Ow@TKCngdF#m2@uUvS15n3$M%M;t2wDGjJlSFc`O9x7U1Tx{>|j){s& z?3|x7{<MSzI#FL=|6=2omX_k#G-^lJe>q>6L%`p#ijmCK$v5*q-37v_eB>j%ITTnd zE5L9|gCQf#N*)yqA~JdbI|A6P&PHKq?6o=5^2sCqm;)C_5I0e+(qW_w*l|V1fXEMN zqzSD~)Cu3cYXhtXyUJ1PazOzBy@wCMo+w6Af?Pf<nO?C!K3IDtzlg29$*DguI0&>s zr(I<OaM<vJ;Xgh<In~^y{$zL=uqBgfrwO#*b{d#IV4isy-gZYjOBb6R5m9DT1hyY& zPD!_4H&FH8K^y^|k25R^&To8te08k4oXh9rU^6HvC^|YCaHdeWgV0#MZXPf#hkANS z9Y$c+XK*BuK@2a&+#(+5T&TKo>n>_xr<Y1O+8l{oo$gp{LUQu@SarAM`v*5FZF{qU zz&mcd3reBS(Nf-pw6B|(1c2`}QA;cCjzA)x=a&L{&!wtoYU)@%vf_R`Z0-*b-y>$A zPI%_R90WEjNZtCi+GS#5Vh{zuXz2ygFbZLG&x=%1o2xT!eH(a|!JlL_C4#<%FiG#z zHdz`DS(oDkbXi|{do4Cx8U#23z|c^UF^~s;zJMKgTjXwiCy<aJYR~e&xX_^DO1bVk zX{|Pn0m67U!!x_McnyesrJT(-$!5f4WSOF_Z23j8P9m^JNwXhhTh~v4odxPjfx8IJ z8E@t*)KS%#lMje=FwP?#9m`6i{j~|7=_VYVPmGF}13+aO10<cy|3JP`S3Q}_5Cg2t zba9VblVaY+ld{*ZLr9oGFzoHQR~ps(ogRJs_|gAlmL8}<=JM{7sZ|hYp>O~%z-$E? z`i)M$Tvlx7JkY<^<<A59?J7Mc+=hY3pefDH(l0m#KsGrsQSW=amzql5cLGQr;H8M8 z$aU7v`7OXnV>XY&K`eI;*zL}=MC$73L_|aYUs@k{;*~}neYJCsfgJ}pE4EfOo{ih6 z!WJm*vq8>KxTU2fpzaB3tTjB{`*+Kz6#!lCKrlJh2gvi2#HXax0PO;%t|fh%Q26cs zXBDRBR3xEub92CgnRM-zM4?a(MF^N7$O|2vIHep_a1d0MdF&jZl2;C!`JC<!r=_KF zQ{D%@2e6yag9It+l=Sq#<p=cIgon)9I#_`zJR$<PEM*2<z#N?WoC^UqxIw8*$uPjO zW1xY6%RDhL0g{mEIWXSq&7=WD0*l-pq#$0=Dlppjw>o*-+S+d2yy=F;ill4ynZDKI z0IuB8*woqH+41^<mz0FWOTF|H^s21(0N5Wu6@fEmZ)fN2?M*`(*1yEEZCYvMsG#tr zOL*#WKQLci+GtOUL#gQK&OoW3UswQr(@Oh&tgIXa$8+x*@IxddObQ0Ak;r*KN*5OL za&yi0G>&n!nGL)eIBGrQkJX&3a2KkpXs<H#%N;P2ZxX~V;#JwcU5?Tj&tH;)_$o_$ zrj!{MXIMtdnr*W|i*U2Voud;JNVQ|+2O>`$W>7)Jw?3WVe5hG3s#6X&_Q+AJ<rLy! zTO9Us8*!)tPc{Yt(Hb5G?Cz*RuY+m`@ZE)PDLFd%xON0i)fd=ZR1`I*Vq)@go$LCg zPhi@e3V`JT6@Z_b@oUo)P)<<7!5$bH85tzKVdnr2#iyXlz=pxW`BdfrzH)UfH{qcd zb}~UA5K|~wP=0D^fVW!CRnTkuxY})6q!^SVFzlQ=S%0p^m7i;OXxiM|-GM-FsIE@V zT`DZ(s+ZcJnD?;;1}5--IXT6B_6j@av)R@1`X>P00Y(_82EiVuvCCGPnNq$hfAHzZ zg)77*Cc1&RiBD6+&^$6SI+{;5w-ZPOz;jV?g>52cMF8fEj2N1l`hqA1&mE3Jw`XQ& z0T2Mu2NGcV{#xv9W48GG`ubBq^Fc9M@TxI!f>MF1&IY*A3}&NxnIJ51H{D*Wl(1xY z*;xemKK{CqCa{Th8&mR2eM8K*a!D3A_%YnYo%2kY!Zjvzb63d;l;1@(urYR)0f3{K ziEv_8GGnVTIV|JtU&6*!K_O6*oI$(bMns%R;Iz*pyh*RVFU%e{e^rOJmlaMp?W3Up zmIJJJk<VjrP%3d~E?AcIf#gX*sp^6Bm+B9mu`1ja3ZxoNmLdo0n~WRM+8r%?@^#~> z3TCm*ImAzx+B<`fvQf2D`ga-QJMa%VAu4bBeoQ@_Q<KKGBL3d|uRN7)J$WN~<1z`P z2J!jaNDjZ5GV5H_N~+Y8QiR$QLf7CC$ft!P4XYkhBn)qPK~_j7JV0o%teZ*vyeWj7 zFsJQ|Q-&}qfzQ8oc)Rpw(~fCD>@-fr4X!tEn#(yJ@ee|J$Q-^AB=M6(>sqXAe@J?g zU*8nHR5!pBqLjogR(x!1`G8z?<eD6_&9}@Qt}Ca-;a?vxWXZ5}vVay}z<9DuD2I~O zXXMl_U{d6Ai{jveCGL#VFbHx&{>}go%|x=}0q+UT3lNkHQR;d@&${E;G&0sb8w7b- zeI9U4W||gqgV0Y_o(O_VNJsdQGkTrKj9db81F}0+uY<e6<!O3~W+H5=Yw&6C-`Q^R zxl95JQ5t<g#`XOQ3PnDObG>oL#fL$Rm`x+(%*l)?x&Ijxh0NjUJtJHw-2)BU4b}o3 zMl2EGt$>{KG^_x`GcbDDpF$0nap_gcRTv$6qnG8gF#Xq0R6;Swlp#F~t&c786JisI zl0*m(i;3m6d-|{Ny^j^THg`JisYxftzeQqU8My1C2Z{BRmBM+8W1XrtE1O34@!Chf z4i#O753;F$oU>Js%%PfmWbtJV2TN^}k`%wnc(ayJFk-!|&XnE}GVY}FO)W)}%T0ay jU;Lc@zxbbm1OKMT_U^Cqx0f#dDNI#SQ=wSSBIw@$e?2kF literal 7651 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 R7asrs002ovPDHLkV1g1VmgE2c diff --git a/superset-frontend/src/assets/images/databricks.png b/superset-frontend/src/assets/images/databricks.png new file mode 100644 index 0000000000000000000000000000000000000000..be4935236c732b3f955d13d056e75c826d22e6aa GIT binary patch literal 11073 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 literal 0 HcmV?d00001 diff --git a/superset-frontend/src/assets/images/db2.png b/superset-frontend/src/assets/images/db2.png index 7deb9368289e84ef50c9a22e496c39c52ec4f9aa..d3d001b52124521f35100e126cbb20d60df35cae 100644 GIT binary patch literal 7493 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 literal 9010 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 Y2a5h@&FjA3U;qFB07*qoM6N<$f~l+kX#fBK diff --git a/superset-frontend/src/assets/images/druid.png b/superset-frontend/src/assets/images/druid.png index 6860d78bbfba69f513681b71d2b091a9f37f2121..7bc0ea5195c455a22a5387604fe4b46a47996e41 100644 GIT binary patch literal 11845 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 C@*C3t literal 12839 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 FV1ne!&W8X1 diff --git a/superset-frontend/src/assets/images/empty-dataset.svg b/superset-frontend/src/assets/images/empty-dataset.svg new file mode 100644 index 000000000000..5ce1752545b2 --- /dev/null +++ b/superset-frontend/src/assets/images/empty-dataset.svg @@ -0,0 +1,38 @@ +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<svg width="152" height="152" viewBox="0 0 152 152" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M44.5 1C45.0523 1 45.5 1.44772 45.5 2V45C45.5 45.5523 45.0523 46 44.5 46H1.5C0.947716 46 0.5 45.5523 0.5 45V2C0.5 1.44772 0.947716 1 1.5 1L44.5 1Z" fill="white"/> +<path d="M97.5 1C98.0523 1 98.5 1.44772 98.5 2V45C98.5 45.5523 98.0523 46 97.5 46H54.5C53.9477 46 53.5 45.5523 53.5 45V2C53.5 1.44772 53.9477 1 54.5 1L97.5 1Z" fill="white"/> +<path d="M150.5 1C151.052 1 151.5 1.44772 151.5 2V45C151.5 45.5523 151.052 46 150.5 46H107.5C106.948 46 106.5 45.5523 106.5 45V2C106.5 1.44772 106.948 1 107.5 1L150.5 1Z" fill="white"/> +<path d="M44.5 54C45.0523 54 45.5 54.4477 45.5 55V98C45.5 98.5523 45.0523 99 44.5 99H1.5C0.947716 99 0.5 98.5523 0.5 98V55C0.5 54.4477 0.947716 54 1.5 54H44.5Z" fill="white"/> +<path d="M97.5 54C98.0523 54 98.5 54.4477 98.5 55V98C98.5 98.5523 98.0523 99 97.5 99H54.5C53.9477 99 53.5 98.5523 53.5 98V55C53.5 54.4477 53.9477 54 54.5 54H97.5Z" fill="white"/> +<path d="M150.5 54C151.052 54 151.5 54.4477 151.5 55V98C151.5 98.5523 151.052 99 150.5 99H107.5C106.948 99 106.5 98.5523 106.5 98V55C106.5 54.4477 106.948 54 107.5 54H150.5Z" fill="white"/> +<path d="M44.5 106C45.0523 106 45.5 106.448 45.5 107V150C45.5 150.552 45.0523 151 44.5 151H1.5C0.947716 151 0.5 150.552 0.5 150V107C0.5 106.448 0.947716 106 1.5 106H44.5Z" fill="white"/> +<path d="M97.5 106C98.0523 106 98.5 106.448 98.5 107V150C98.5 150.552 98.0523 151 97.5 151H54.5C53.9477 151 53.5 150.552 53.5 150V107C53.5 106.448 53.9477 106 54.5 106H97.5Z" fill="white"/> +<path d="M150.5 106C151.052 106 151.5 106.448 151.5 107V150C151.5 150.552 151.052 151 150.5 151H107.5C106.948 151 106.5 150.552 106.5 150V107C106.5 106.448 106.948 106 107.5 106H150.5Z" fill="white"/> +<path d="M44.5 1C45.0523 1 45.5 1.44772 45.5 2V45C45.5 45.5523 45.0523 46 44.5 46H1.5C0.947716 46 0.5 45.5523 0.5 45V2C0.5 1.44772 0.947716 1 1.5 1L44.5 1Z" stroke="#E0E0E0"/> +<path d="M97.5 1C98.0523 1 98.5 1.44772 98.5 2V45C98.5 45.5523 98.0523 46 97.5 46H54.5C53.9477 46 53.5 45.5523 53.5 45V2C53.5 1.44772 53.9477 1 54.5 1L97.5 1Z" stroke="#E0E0E0"/> +<path d="M150.5 1C151.052 1 151.5 1.44772 151.5 2V45C151.5 45.5523 151.052 46 150.5 46H107.5C106.948 46 106.5 45.5523 106.5 45V2C106.5 1.44772 106.948 1 107.5 1L150.5 1Z" stroke="#E0E0E0"/> +<path d="M44.5 54C45.0523 54 45.5 54.4477 45.5 55V98C45.5 98.5523 45.0523 99 44.5 99H1.5C0.947716 99 0.5 98.5523 0.5 98V55C0.5 54.4477 0.947716 54 1.5 54H44.5Z" stroke="#E0E0E0"/> +<path d="M97.5 54C98.0523 54 98.5 54.4477 98.5 55V98C98.5 98.5523 98.0523 99 97.5 99H54.5C53.9477 99 53.5 98.5523 53.5 98V55C53.5 54.4477 53.9477 54 54.5 54H97.5Z" stroke="#E0E0E0"/> +<path d="M150.5 54C151.052 54 151.5 54.4477 151.5 55V98C151.5 98.5523 151.052 99 150.5 99H107.5C106.948 99 106.5 98.5523 106.5 98V55C106.5 54.4477 106.948 54 107.5 54H150.5Z" stroke="#E0E0E0"/> +<path d="M44.5 106C45.0523 106 45.5 106.448 45.5 107V150C45.5 150.552 45.0523 151 44.5 151H1.5C0.947716 151 0.5 150.552 0.5 150V107C0.5 106.448 0.947716 106 1.5 106H44.5Z" stroke="#E0E0E0"/> +<path d="M97.5 106C98.0523 106 98.5 106.448 98.5 107V150C98.5 150.552 98.0523 151 97.5 151H54.5C53.9477 151 53.5 150.552 53.5 150V107C53.5 106.448 53.9477 106 54.5 106H97.5Z" stroke="#E0E0E0"/> +<path d="M150.5 106C151.052 106 151.5 106.448 151.5 107V150C151.5 150.552 151.052 151 150.5 151H107.5C106.948 151 106.5 150.552 106.5 150V107C106.5 106.448 106.948 106 107.5 106H150.5Z" stroke="#E0E0E0"/> +</svg> diff --git a/superset-frontend/src/assets/images/empty-table.svg b/superset-frontend/src/assets/images/empty-table.svg new file mode 100644 index 000000000000..c1062502f39d --- /dev/null +++ b/superset-frontend/src/assets/images/empty-table.svg @@ -0,0 +1,22 @@ +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<svg width="81" height="82" viewBox="0 0 81 82" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M76.5 1H4.5C2.29086 1 0.5 2.79086 0.5 5V77C0.5 79.2091 2.29086 81 4.5 81H76.5C78.7091 81 80.5 79.2091 80.5 77V5C80.5 2.79086 78.7091 1 76.5 1ZM36.5 73H8.5V57H36.5V73ZM36.5 49H8.5V33H36.5V49ZM72.5 73H44.5V57H72.5V73ZM72.5 49H44.5V33H72.5V49ZM72.5 25H8.5V9H72.5V25Z" fill="#F7F7F7"/> +<path d="M36.5 73V73.5H37V73H36.5ZM8.5 73H8V73.5H8.5V73ZM8.5 57V56.5H8V57H8.5ZM36.5 57H37V56.5H36.5V57ZM36.5 49V49.5H37V49H36.5ZM8.5 49H8V49.5H8.5V49ZM8.5 33V32.5H8V33H8.5ZM36.5 33H37V32.5H36.5V33ZM72.5 73V73.5H73V73H72.5ZM44.5 73H44V73.5H44.5V73ZM44.5 57V56.5H44V57H44.5ZM72.5 57H73V56.5H72.5V57ZM72.5 49V49.5H73V49H72.5ZM44.5 49H44V49.5H44.5V49ZM44.5 33V32.5H44V33H44.5ZM72.5 33H73V32.5H72.5V33ZM72.5 25V25.5H73V25H72.5ZM8.5 25H8V25.5H8.5V25ZM8.5 9V8.5H8V9H8.5ZM72.5 9H73V8.5H72.5V9ZM76.5 0.5H4.5V1.5H76.5V0.5ZM4.5 0.5C2.01472 0.5 0 2.51472 0 5H1C1 3.067 2.567 1.5 4.5 1.5V0.5ZM0 5V77H1V5H0ZM0 77C0 79.4853 2.01472 81.5 4.5 81.5V80.5C2.567 80.5 1 78.933 1 77H0ZM4.5 81.5H76.5V80.5H4.5V81.5ZM76.5 81.5C78.9853 81.5 81 79.4853 81 77H80C80 78.933 78.433 80.5 76.5 80.5V81.5ZM81 77V5H80V77H81ZM81 5C81 2.51472 78.9853 0.5 76.5 0.5V1.5C78.433 1.5 80 3.067 80 5H81ZM36.5 72.5H8.5V73.5H36.5V72.5ZM9 73V57H8V73H9ZM8.5 57.5H36.5V56.5H8.5V57.5ZM36 57V73H37V57H36ZM36.5 48.5H8.5V49.5H36.5V48.5ZM9 49V33H8V49H9ZM8.5 33.5H36.5V32.5H8.5V33.5ZM36 33V49H37V33H36ZM72.5 72.5H44.5V73.5H72.5V72.5ZM45 73V57H44V73H45ZM44.5 57.5H72.5V56.5H44.5V57.5ZM72 57V73H73V57H72ZM72.5 48.5H44.5V49.5H72.5V48.5ZM45 49V33H44V49H45ZM44.5 33.5H72.5V32.5H44.5V33.5ZM72 33V49H73V33H72ZM72.5 24.5H8.5V25.5H72.5V24.5ZM9 25V9H8V25H9ZM8.5 9.5H72.5V8.5H8.5V9.5ZM72 9V25H73V9H72Z" fill="#E0E0E0"/> +</svg> diff --git a/superset-frontend/src/assets/images/exasol.png b/superset-frontend/src/assets/images/exasol.png index 46260f8d4fcebf7fd7faa14e29afdd568f92cfc9..fff47b00a003c33350f108d485b0b1c4ec06a6ac 100644 GIT binary patch literal 8965 zcmeHtcT`i~mv3kmx(X;r2_Q`ZgbtxM6{JX!-ja~e69^^r4ho1MRXT!zN|oLsO}cbx zA|eW*gY*s)zirKL*1UN$^Y43EE4k<1`#HOxefQZnk&m?RQ;{=~0{{Rj^#`hY002=O zVVrY?nDARNR1!isTy=S1;syXv-1z+^0;FZ!0su&N?G23GjkPo(aI~`^)CLVh2zoiY z5YPaCtb&&d6z+&{2f`4x_9!`y&BkU9puLS8hmp7zSj$BPVQ2rq2ZPY}(KdklIKriE zI27c8vR)7Z0cV6e6zJvbgmQy;$#MKa7eW~SzAVH6`~%|dD954nn<3Cx>k&`|jX?k< z1w{nlU@#acDJ>{2A%TFw#bII~pa@t*L<lS{1eO*6OF=}$A>!h|zdjrUh8P<pL{IhJ zU+f5HavXN<?k*4^AuJXvh!qt?V{C<lrKP2Xz#>8-A_4@2fSWhU9qJ{3a^w7)f-1rd zj<I)fw@0IZzbQgtXb*Qe4uY_MYT@ki4_TDkUzQ@+OvnrBA|xyb{;ky?KpXf!I2R9$ z(;v)j;6ex|gfjx=?nb~0|ATe0L%XBh?9l%Q(*NB47X}3DYH9t$<3E+f+4&z9ZtiNH z1U3FL$bX7<Gw^mn2<ai*&>k2#Ld}yPCg*Q$Tp%hK1k@dkF+ii8{`S?QzeNU$hzg1U zd9|Q$d(>|w`2O7#geue>A;&@Ro3H>_R6s=3Kv)7IA^{PX<|jB14E__Ug|@LrdjA6z zAvjk+7;GR6hKPY7;!^(tCB%&l)E)YN1>3+ONHoS7N>JI}8ET6VazWX00RJ&0L<Q}H z#t;}2q!ax^3N0;&I?Bx*ih?85RpmGcS_|6S+dw45g{7rLg>3{7(!!DgV&WoF0x*QI zsDP-AsI<5k0t}TBLHs>m6%F_J?c2ZS+x!pb>tO5&%M0rCzozqh(ftkz$OC&fg1fx` zS`+#R*S|(i_P{^l00M>oj&C^*_;1G|Y&ib9Z2!Nuz@KEXb_fE||H9pW!rahEcPtcx zP_iXh>%S3DLIm-Jey_zpH4*xcO8#;0->uuf;e=%Hd-zWxBAon_$`B|*{=yIv)pY0` zX8?euR$W!ez$;^Y2J1(sc5(UF=6K^n%rcp>@>QVtE{b;~{b>*|H$*J(3Xv-0%7{|K zE(Zq(krJgE>Fc}VRkXm}IO1jYuta_{{K5T435~cuuHZ$e|A$SZ^WK?(HP(6>(Mr)u zI(AZ8<p)$t7yDO%VR3oja$4ng!NK9QdQ_C4us8>6YxXb$5)umb*G#vJudt7`v?yPB zd+8E`@&obzN1@gi(>yuUSk{j0=TBcV;t})@f_^biH>&XC5=Q&(-oT;sL_`j<WhoR* zaLPVSdj;7kU4e5M2Gk^d?1h4A&ktb?OI1Q8swPN_Of$)M(ZPE{o{|y)hac;$&n`0V zJf5j$B`G2WmovACP}+&-j5SqVN0<~2KT6!Yz%9*&7T6Ct(2+zJxQZ3r`K7P&ufBjA z=X3WdKDhe)I@dCN29@#!@|JP_!s`0lF*`t1iis+>-~eQQp+7-!DUj%r;qrrR{L~Fo z$#-U-nuq~8ye^(2xDYqxB`XS&qN-hOh>>l^!|<U%V(NyJWb+UrP}rl$Kck^BY{|ox zA<R5fmzFCF;b9sRv1qBQmU}0aOexVO`IU6?g7K+mljpDOd2x<w>KxZq_+}xm`3mYN zytkimFWkKH;>xg$?EJ-&y58rRmnT~~@gt(o?o|TSzipI0CO%s=EHamS6H+;L{bAk| zs1MVs)*MFr9N|4M++2J3`t!~U$wA9TZyD}$R|g+$RF+A+SF*>5{TWWKi1b*pM4$6D zG;<}XSH?I;Ao49^3hG-uExrG$l9RcfhIW=xyiLTbYNnX7CuY@A!Tqaa4!X^rW7`WF zCf9uUz~z>lmxR&K`CXoRSCI46Q=qCRER$y<eRGrfyS4r817`CksLY&k-wZJ?Emfy3 z$?R=~^0Kq**GEM>Ss|<er<(IKPo_);l@hmUE(3r7x(=!3kkhk<8V8B*>(nuhMi(b7 zIt4;eb)L~b&g;oxBK|{_I~hZ*YFYcseG?NA;THiL800<fZV|B9kk}(S0GVP?obLfl zyJrMn?!qJKzk1K($?nGZ&k}|XXR1`Ptpm4|nsph>ww{ft>7}RFhXNm~E)43j4_ElD z3`XCsxma7<`10CwFTmo<{`%L>_QzJmQA2&<!Fx=ubGv9GFZ7S_xm?gt;=-?76A7UY z@^I*AHB-To7N_91Iyuzb%GWjK9E#crUO?Vkwdl@vA8e(Ym)`NHxJ<y*_D-3)PJA#l z2od}<sPdVvdi+M0yrs8-)69VXCe~RJy*30;U;{kW(Tt3Yd=la>8OqLg_V&zepxZ~@ zemSDVmqwji^cS<8*YxHB061uOy#8@&Ry)ga_{~6wYj%x;aaX`m;I!}Bpjvw1v!~B4 zsS{`EH&umTs5%oC1v6!DytjEc`7-u|dVTb9-?X&kF8N%}$!h*vboU$6gka)iJSZT; zc#-05VKZ(=>qYo$TO?Ih4X>okO)pmCf*~4qL|@7@BrrZby0WDGAR97~d-2qJ)=68V z50J^=MQwLGQ#Xn@nJ9A{q(1G*W_L9AW;CUY1kesn-m3t?v4J6V9}~6Px&2OlT3!WI zF}c`?l0*?x(a2&qM)n3&I!nH6J$!LrR$F~jW~1m^Uco){MlxozXHj0PRcV)9V^wSg zQ3_sPJ8suT%ah}XZyA?m$|osoFidvwG8S8nfWMSqHhV57Z?ou<8aG5%l$*C1y!Ty< z9n@Z&exx?GEpd`W(M+`}?qKSqe0|BC{3Lf$SvP02vy*3^^=zTO+sxEAhLdcn-usMa zpdPb#NoqNV)NI4fOT`nlGHSa&>#;X*wjbKH{w<JBN_(!|m9#I!&`pA);w)#dc0)!l z{`#Y3Yipb*Z_v<pKJl5=G(;b}8#!-O$buwtcCg||;k0*MVUtp!xM?D%M|Q6=c(ZA& zZT!8y5h|;~E=Ki=lq|&Z${@nVhB~7L%q~s!5_W3ue>PLPvsgy=ULiO02o-No3j4l9 zgj-|w7hdtKolDsG7R%>zvy+2o-2RX`6uR^|+|e`Q=9czu1=Ko;K|cds5W1VOI)A(~ z<1G|vEEtF6-A|Q<&sEz`;X$h;I;!UBHSVF9ueUTUWUA66)>O=r1W%xYA=PHVi%$FT zHjJc1n%rQfRy*QK#^MR|&ezcUSFx}k%;?N~8ynPD{}%kyBw)z!A*{)YmH^7Truu%! zl(!OG5vapPBWd>d>+{G}Ieg!IqF8!$x5&#+)?&fD#A?BJf`>`(CA5*@;kT}KzntRt zWQJ@EspY1SUY>dQq@YX4a&x(Whk5{;GGE5??2Qpl;|02S#n9jB*RHe?4=vDOZrV?_ zBr?F$f3HL>VRcaGP+1xCrJOOE>Rw(OZ3WPv)YP^8laP}ZNXnZJ(;L6nQqe0XqC~1b z;_Ka{%ML7mR#uq)&4z)s@U@)g1HX)yl)0p`2ZO;Kn!of@IP??rlJY)+#NOz`6%Y2S z-x*@Y9kLhkT=@v|29JZavD=cH3d9MFUaU6t<{d$=YBt$r2Yb$3woiF<;**Miq?$-9 zdN7$PR7MPKP^}#FZK}swL{42x!GHO9i^Ax~&n!S6@4S%K!+0^wcm*NbO1{ypHcok_ zK}k~N&RfUqO<^-Nd=L#g9y+J~P^+SNaAHy$Sl4XXXRQ5lM5H0qwK3GZXs<{Xd?6`) zseLFl8qV6uxAqg%rwy5@b>qHt=*@4K=m>s(;!`qZN4lDB6&BRPY+m%`*9SD#d8|0M z*{T)iFPd#@RmX}$O?<G@v5F&mZ^P2_^foq8L9x=irO`s-(`g$lYa-6lA_ln=-n~>U z(|*7#r-h;7oUNT`N^4y1Dl*DbEEHSTOq9xEk$xSx^aK}5+-uq-Rery)&}0yM>f<-i zu&J*<N-xhG;hlWs^tlPGjWXF^DX7d10heo(7|-fO2#zDasl0n4?-y|3*UPv1mJ-zO z+<+^7=eT!CUW@2^t%4xy*%{3v^9X^bZalFLGjB>uOl#H^m>9hu3NIU{Wzj*rM&izW z^5f;q_bf~$)<-IqUnvMh3|L&-;ceY8Cq<~+Gm`g1lrt>$D)0Hj<oM|URkE`M>Np9l z6&Cp$@BOAXl;mWl@1Ay^y&O|GrDV$QKO`HT?mIgP*Ke$GLaw^#NKWXoHBHyphsN>@ zHe$|_m8F^bkD`qNWxbqS$^<3KXmPSq5qqYi;4kVPi<jyQ=n$<xxYBZC;<r{;tqK_R z069O?W6Ww%)Z_ZoRGsIWo{T$CwAtf%MlHfB<#+eCNws|$<HkL}BBv@`Lca2)VtH#b zS@NCLZB1lXX)&Nfo0r|Rq^8>>EmI|p*|hmhacyCVBxts#>zAw<)Id94R_^P5X__rh z$+=-ACfwf<KT%>q@+tX(&@G_E`JJ$amZ*^}<+ru?%p5_IQVp<zgLXEsDfACJK|vn; z>Z&N|)EfRr6Jp?F%l3jI?S=P~DQ0GK_}=G7U-r#|6$GuCJr-Xn%jhODXy4k3T<?qy zk2*)}gR<!j-pW3O4Q~qOWR#_}#Ym?Gq-DL|DkM>3McMioDPv3zBSoWP<TbeY3uEl3 zfRl3xyWbkDql(fkUmf(iO6F~{G`e)O=038wwtlOql8sa;ilw&+?~G0!&Qh1JSr~8t zTp{OegpPY<En51$z0=d)?!S84lZ7hvB%k#?)uAnBqULsMG}P*v%;dE$32C0)=F3|P z%gaT2INp6edLtsW1~xhwUX&1>#)0me6TK;_KSG~o#O>B4At1jrUTT~_R%9r>n<w8J z1JXTS_&61xdFL(zWwD+pg%B!OW}j0=UfD{qxi=JYdA~|L-MuSRtMGa(v0_RbcV#Cf znG&h8B6nY5#Fyq^1Vh-)i(%_}+Snmx8IPr)>#{OszN>hFba8;2FeJh`{WA@S?HBBa zvJxE^N%5&fvHGlzZRz<2%1PN(2d}F78Wxy<OdV8MvG{6D7BuJI(CF)XSG;1<Z34xl zF~oAOBP?_yUnNIn6(3;9`mt3mo@;8>=*TeBUra5wWC!82-`;3a>(%gx?Fq5Qr3#RP zp_+eE)NxK^_HK03j<u2TVfWxA>b2pXfcNUlIzQv}K)0nr42s5Yvr}VJ$g_F&wx(Hh zvg_v$*;z}EUD*zf{KiGBOFD;n$*a=B=08vIO9;%?G!hgd`L;1sV^5MvqH=;%Y6>_A zR!+?|;NvaNZ>ON4xN9|Di^yxZ{5+##4Jo2Ys1^P6Gzb+U7cYY}H6f?jcy~UHRau!h zr!iRQt=B3g6gc%t(y*Ei1~JMG<V(FptIVe2j#|NtfR6bW8$OHS@F(;p_=LpWjIXkN z$fvv!pUc({4Z#eipNsOx8gFTFcio)w+YcC2C{;bfe8)cex)lLc?6O(JhljIK%N+V< zt~`#w9e6eiqK~}lrujtAObj*d6(|QjqPsor)&BN1%@(yit>5=wSNmr55``z?;xeLw z_ufHM%Bwz&lPH#by1gOZMXGZ-r}(zJY)SnKZ^U{@8G<8aYuj7_o)JwlZ6Vh;z<%V` zNKs@M<zLWy?B(rSM-N9a0S4dC_Gf<1duY}z8swB$l6EnPO^#_e1G?km@A*dvP452O z`6_FMKrZ4Di%fJpng;K2i4_kBRl9&>OE=HMw>tFWtT`zZBo7e~vi+sUTO^gQU2a(P zEd@l*ychCJ`I(>EAEK=IC@~Yq9QAti7fNtI!maC)<jqBkhql^`a$&Zq9Qb=KAUpA` zNIw0WCH7~-c4oDUn#k7iZIb&wi8WqzD@g~Xaq6W?(6DPb^IOJu;j}wH++cS37U~EN znabmBL3$RU7^Gc?#M8G@d3X(5<(xxbK|Ar&Q(=`@C(DrrZxvcqaO!%A3X*Zio)bN@ ze!l#A3_3SnHqEFnnfzl#!*h@n2O<!zoZH{td0Qx5B%n_8^ufnL2W`8hQRX$L=jJaH zVyIqe$R+>)nC)k&gO#lgB+8eo?aenQlM!={i&)2-xpPwBTh675mjGF!k+7xW{Gwu! zz8>|WIqC53JPi+z9!4D{y<Sk7=R{*-o$)-75+p9o%y#bfNuq=0eoXv(N9!_ds5~I( zjju4vlV{NnHTWtNt#oKQkIl67Cs4COTk4%Wgz5!3^>t^E2-My*Dlz}PA^c|B_;VJC zmf69}&$z>TU`KXLcF2(lM^19|yTt|k$};{PtudwBPHWzEg^cy%nOhxm(ou`VXMP%n z+!*Fd$qru!8+Q6j$mrDc4QB)@oyhl{z!0yyWCn)X8$*oIgXfIGet12&u4w3~e^b*} z3xTe5sg2XUC60sk$_3Sr;_O{31MtYtMV5%8*Ds6?oJ<wam^0I{RuHdFo~@mV_J+}F z4gE8Ag0rI*dU>k`jQ2ZnFE4NDXt>Dd@)FXi8uVQlsIhUS@8l#YN7I1dgOxY|8-Y3r zuD%TWGfkGr2dqs8^FBL!8T{-vYq{bnf>xI$&xUW<B8!g(0^VD0l!}Mm4Kk1-vxA5W zBMx4Sa!KhVm>dRN=vrIhXOjr~@IwDt`9^sEe!ggE?`2+^9>>EQH%q@pM)DsvO0JIS zEq%~6_*Pl$d=i`dU31{xw`WlwY{dr|6zLp|N(?&t@<<W6u+|nmqSS8wT>Q5H281wz zZkvr$rF-)GvQp_|BJ2KvUnPzEp@tNIoH5W0^Zux=Z@r4HL1O_G-G?zyBjIUX^$9jx zIP3Y{?sLrae)jSs5eSt+j_*mrY?<A7x%R8Q_#@ul#7tlLcaO@--5%V~*opvlIiK1G zt|iRFGK22)xJjZ?K7}a%)QyKopbd({iJqf!BFNiY^n&GR0uKe)zxo(~0ATe3ns=1W zY(rFl^ExJRM32w+$(t7UqT;VIiu)dA-rw>h-`p~!u-tT#9&Z<+VUuOTeNTtY&^2OC z&Jz*0qu$@}BdWjjGc@cY$E@LpXPa$X7hT5KUO-UX{n!NZ^IVh6G!F-Z$G1*lFRSLO zgei=oJtKBXK+`oRlgm5g58onw%x{br!ueNKj3Zvr>1)OlIwCA(OlMRis~%VZIoQuk zghnk{>mA1QlNv@-xESE0ygI9_hpslt@>OF1C?Ppb-tJ58nrym$SV)nf!*ubhwiSgE zr0wC0VG6_4l5|mxQq|d2Q6Has_mDlrjy(qoxGC)6z-%%13$v|*eV8~?2O|x>jXyzL zRx;O$W+C0jwEvuw=l*~NpK%$~pyFszWi;8@V2P4AsONK$3V+A_1_!S!q)E7b(maLk z@bk~nAZzQS>s&pUtXAVTw!GnhiSO#D(-22}t@z;|!r`Qf@!`FtV}#B?`>-rPwd*67 zthT}7J^RDxYcJq8i))f(=+v~BzFPg9CpDa&2#T<(^w6ojmM~!62nDC9>Q+dZnIvn4 z#HFQHV@|RL+B>^Cd6J4nz3?kBT<HOt{>M!hH!FQ3v}N4Zky)+0PjfqPvdT|;Kx?vo zZ8q>nvlD$YKO{*Ss?j5Fo^LZyG$DWP<2IjVV3zSLc|9PLYA%GbCX!uH*n6$*arS^Y zsJo(#j@D#<e<#%eUg#$zX>>EwkiA?ijqQL<+IKIa)lMX>pSxpJMZ-k^x;zAik1+^g zeNSp9Rf7;Olk}DOC+iv$Iq@Kz{E50HNXKjd4y-7K@4-V0PawF-$=Zhx5{8ugjhw!) zZyCn=jBlHHvc0jYTzMKGM~5YpymbR7Gt<r|%fMk5!!AtM`O`XD#+kgC^qFa~GNY2H zvXsII_*Hgk?})?s&p#IhH&53;#!S-$zX}%W$<{aY+_?F0e8FZhID$lZpGE%cq@Le7 zeSC9D@U^Q8RUn&CrXdL+EUv3(S%!wqs>=1U%Xo~G@|JnYT_uKQ57&`?R`J7`7o(K9 zQy7O^WH}3gGTs~J^CdJ5)vKfLwPJedcLfKICeYxtAMtwB7v8RY-&BN!ujc6bNpV8C zyiel}97*}gY_>hIdwaXxy*{WTVy*lFTigu@?qN{@0w-Gy>Hny6+$cqV=4Y-t_dT0a z;^K6*Tzw}on-;+kU5(mc3kyn)K3-`2{w}H5D)DKZywBAB<=fTc_G&>vvhVii4?^Sx z4^PZP-ybZB#%4*~7c)%d>ha-OKlg|xH0Fw=W`XQnCGFo`vG5;32v95;AT`JYknDQk z!oT=4AM1LZRG4$sTkng$zNa8qbB>gqoa@%Jc7>HnC|;_sFL8k^J@6E>)o@di{QQG* zC4ep;ixpU0U09#nC?1vX8}N_&CB?bG=TfZf`9SXogDBhh_I;tWy#B;!^+WbWKSOXn zz4lsJ5j>+R7~w~J+GLTD@hRlx%QS}U#N?DDDv;yP0-je|umkN9tUxMsQTo|tOg7GT z_FDLQ;l;a~s>3D4o1s>LziMy-a>uu82zw^genMHV?3JZ&uB5Cee?I?9ho;uSzE8oO z7)YxhOMZ52aNPZa%Qn+<@AGgb{01vtVJRONF)%Q2TiSMcPU|7zVO8Qtxw|tZW(#W; z7L6ClB8KmE6z~mg1Ac+{Po_pe-B#Wz!!1pR{;fA`>?4qNl|bG?6{u0}rodFyjl;H- z)QbnUL2DUJGJ|f40i^R~g_@3ZjTvDKAC)#e4K?`zFD0B5m0`U!jWpy!A&=))?x;t_ z=tRZ%pTaDpRY+9KEM^qMMM6Hm(Os{$3P4@FeNX6rz&3+t5goLH7Y1C0g>!FHgq_y| ziJn7o&o^vm%-r0Fh^Bs&$p$Xnoy?oN7|X~x<gv{6t49~adU%fTQa;#na^G!tjUNB< z#kLd?`n{imJ7sVC^&Lhh=S?;J7U7o4miH~DWh!@`nXD1QUa4PF(ZvpY(w+LSv)EQK z7!xB#1|pHY%tY;#A3+ZQydo8@L-p&P%~n6A=&C3xh++JC!9qn8=loesw`D|VWyGaL zL<0ZeI-o5Q(}$#LXBY%6t|Bgo8*80RarfviD^MBSp)8)zE;w2q>1JdsFo?MO*^?6x z_8^OCb8z*O%TH%dwuT6?)a_+OLt%IKG`Y)xR_A9Zv)Y};2(g)Zm|;u~c?OV(T>}2F zHM-0-J+8p9Aa-oaZ+KAW5+LY3+a4nuWU}9+>%q|&y<<=afYvneZZgfJh;K+Hk3UgR zf?*}{c+o0`1^)^Qv-FedV4-9OgvBe}7iQbvXs}%{O6pDG+rEW0I{S2uq}u%a!<f{m zp6M-PYR+F1R!4m&?~e^BD$2L;BX2(OgYwx)$<F~VOrp+;@vj{=#MiTz!*q^uGjFL7 z4D=53b@h(TGMJ5uk`DJ0rg7;iSJ&pO%uH`8{uj-#zVV5Zj)zsM8Fom;GC>7_^tsh# zL5=u@E<_#xSBXL`#m(^Jo2K48f1aC~>lhY-a8RueSYJ^PIC)3#&{`ljpar};|B5ZF zENiyFM1?2KwYW6!UEUQt#GA+UZ4J^tn=?g+`}&933qNFj`E&%UONc1ExZ2yc2YW6} z*;UT0{Pa_A{PwdfJvxoaw%YaJFa`4Io6XUA-i)A?crM^s$R+IE*}U!$@8@So4ZGdY z$(O#uA2H9lxaOJe`Bm?B7j%e++~sApY@OYF60T3<;n)bBI3G32eP$xfp{7m;czhVG z7DQ}~Xxs8TgFL=Zy);wSXLh85sQ~S$62Da(Q>|#o4Rp8r_N)K6n$S1doB1{?cz;%O zaXylc%WUG%2uH~d3aX7gxWDPnEcqt;tR^YkFlObvAwZX~Z%)Uu$+FQ4;F(m(??ma9 zQUoOjvxohh(g-GE!;NkwSX%hY&9IaS&K@eAg%I}&e5pFaub+hQ_9|YB@_A22^MZ>b z#ac4!Ldz><h@FSC)R}VnK7Z_CG95c*`@n6vJLR9EAD^4xiv_TT3sF;)Lkt&pNo}wL zZZ0v8Sj;|h5?}0hCB317&b5HYtu75)JIuaY22aOgFQymLvF$n;(*DwS_ti%#7o{tJ zv?c|1QLtN<eU}dp#ftat4SKS(n2HJ3E&pn;ID!Anru%v~>xy1wL@Vw~ZIx9fFzT8l zYEvcvPpEn)Uw^hWnW~rqH7~VXkAm4zE#lvm848!fcOq~y)upCUI2AJ8hFkRhOR*HT zoM?HUjEvMI0SY9?HDwz@KlK$~^6;`dA+0h^lzx+btzOjW!Hj;)=aZFyJ^a)`C`)BE zG}Ze*^$Ont1d%kryf4bj3R94yA1_#L8Nad1y~9<2By^aydc2TeCUM!#<&_`n%et?M z%T|ky(js#cUuM0C%ScO1dy$-~W<#uKzBfQ%#eaN4mb@j<dc)sooJ+mOp0J(Pj~^8w zGzOVsxRc?T9t|Q{8|MMv2vGWLc?*sDOL@R60L9^|<i#!Z1M0RvUj0!waQ^=ng8!uj bwl1zjm2PO=ADjODM-_E7ZPij`>yUo~VIy0h literal 8582 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 L%F>mRCV~GC{^4b8 diff --git a/superset-frontend/src/assets/images/firebird.png b/superset-frontend/src/assets/images/firebird.png index 19e862c03be25c2ead838291d436777f230a0829..386562354d293775743ca042e20c357d879a7714 100644 GIT binary patch literal 7953 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 WLxu5a-?M&iT5GB4sg^3+g#HWdqdi>! literal 10895 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 diff --git a/superset-frontend/src/assets/images/firebolt.png b/superset-frontend/src/assets/images/firebolt.png index f9ffc947e220180c9f8353ed8878de14c078e308..3e36f92c80816bece656a8bc42ef7a434e45edac 100644 GIT binary patch literal 9061 zcmeHtcUV(Tw{8d^K@<>BkfI?-FQG*tv;dJFy3!R0p+hL48zM!dNf87Tklw3EZw6^9 zC>>Oqf(Qf<=^bzUwdXtc`OdlLp1)6?l-YaUS>;`8*4{HaQTn>-=g+dA1pol&H8qfi z002b-xt$FHlD{hkD?-UXv>qB}-sJv?-yaGUfpmWWfNI;x*c4}q(t)F~ZelieSX+#k zzncdc4FJe1`Fq%)T`)MXEylsgT>-M*@(KcWvQvPVz)<2S4^@n#lSZHy#wbwN7#-+> zmbHT@DT3ww;bZ}B7@Q5*-_6zC8}6?F`9m(8-2QzU3IYEC!MP|vlz%G(o1*l=s#q@! z_=cFIC|X=x9DGAo40ioG#ug2;l@<X@ic3mD#bHo!Sy6ErxFie?gMt5gLC6Zd?Cjx& zNVUJzk&hH0jyRkL918XG^Aq!v62p2qKqX{lWufAdP)SKqGD6flz#V7fFY4~i^S1;f z#vASB<biX-x`Tg9w6Vqd;1nQaWB>HR&Ep@j?%sbfMdl3ZZ{q=#5EK9H)gM4R^glQc zA1~KGl-r@97*~uN#vSKP#!CEy^>D=Eu-=Z?|3vgZ-Ty%WnOzj>A07YJ7B{zlRCwcV z`jXxFi;#bd_BIaiz(5T#-dG<mH0Gu+*-W0_-gv-Oy)ZU7td}ts>-u-B^#3*)EGZ=> z4HiJzpq<=*J0bWlLoi4i97X~1J8tBNiAsnYOGv=Q#o^LY!sGyoi~k8lVeOpk1O6RU zN)j$5{U4y@ys@*v+5A7jc4)Xg*2~R??6Q-ajROYi;qCwd|3f5P73+%iA}c0aC-sLF zC=^`N-5Y1)j>c#r6(D4<#hje%;Ih~4Wib*q_M&KeTWL{gX**j{o8R6@OTu8%wlG^6 z8(G-j<B?dj&+pj&J>KsBbG)9H6M1^sxc-mj{GN2blLD^c<V_A&z+ZF12;=!z%hd_| zM;^d!(7*Fr0fPP=Sd1OyuhUNdV+Q^d>*t6e3;i#`{U^*DYmf7@@xmxOklFfgBovfv zKJ@oo{L>TY|Lx=-eg86V|Av!`!SCijg@}CcPbtH=lk1lkxlj#Q_0s_WS6DTX%EtZ~ zYtsQZmWfR0&)M}EQi{2-IRf|+#NB1@E6!Hk(c{aR-o3%(+S>b8=5jB;6mwR8tJGp< zYm}5M)+;0Sq(_%;X1?qCb!HAU@eK6-4cFbVNR;bifTrV0N?=Lz-ri{f)#K*CCxDBG zczS}tScAJ?S-X|bikJqH$cEMhi}_Hqp+)X+n#M}>ej(b%%ATRQgzlG+sb)jRb%b=Y zd7q;f=}AL-SWEP9hEc{yd}sS#=pPJ-lbH)l9!De}_dNh0(|_?hA5Bn0BHu*mQJL?V za?MS=XW%|eA7(c{-e6TjMuH+J1b_T!uk!cD8=Kv9_@KXLR$5sYai&^C2i4swFTw_p zm6a)Ge0YvRFlaM7QSqlt{BR~zSeNx{(koN3GUC~jZ=Ta1lc!Qu6{}V@dcU2Y@H>$k zF~@Hd9E^^nrHnffDv-{l8v}Zgp6E5LtrEZ6#TVDZCNmMdj6(~dt0JD=V9zmJhRlU6 zFQy=lkoyN^vrCjT9Sd5k4*&oJ3e}TK-J{BYaE@N1KTO&g7bX<)VS$VHR?@ZfdNVjP z<PAPNi{j;ZTx`LDBh{YTOSw%K?*0gqg4vm6!xAFA4Zw{0_ZidXdgi{`8kaP>SF#a! z?d)({gNHAn<*9dazT1n#3118wPbZ*VX%b+bB7$mIu=mrZd({4hoij`n7wqltPoBm^ zMu0@<l7RrjvqwALuQu<!ez1Kz^_KNAR||1nZ<9vbrL>ZwqUCvX3U$!{G0}_UHLaX~ zA*a2gU3w%R-MjoH2T7O$QRq8%68B8P_^tZW(Z^quIi&?=Qfa~tCr@zu8jqDq%}1h` zt)C?VV|25I7Suadw6k@PKtKri+P$48fy);q>}y*IC20!6PuYD-)*}W+Th^Bqj)?0; z2!Kk?(vgw36zn>w?a1T(!-P!H%BOBqCwLL|6dd)EYun5Vy4oLyAv_2x1;nV5T0?ro zxr_6?A#&7=+)`ZAYbE?t8meylvAb6_T6L+eFxX>4YKS!&CE?mj-Q*Cfa0^7WRI@#R zI06CbM{<xzHoA}Xs*<e7>>@Eh3P(p{;h7>)i$|}5kW+!$z>B(@jTJQUhbr8*tBjR( ze9;IeanvTPtm^u57|jAXnhaM%Vz;lAH3gKJ@7B+}NFuQlC7JyThO<LiKq~k!xKYK8 zdwketO+|m`_XR#9hAf6!pcd(a80^-a8+!eXXBm}+Ki65Te^yNyyM#yHPeYagwFE0O zdF*wHE-4AnNl7wSnnHcesBhQyq{<*$1)^#xBtAdTiI?WwKRNVhIvABw!-usl{&3u5 z-7prsGIaOR3*X3x!??npz<D=#(D=?4AvE|?RGU0w?df)_`O7%nTOp*G^`u!ne&KQq zcKLn!qpJ##?*lJqA8BA`OKw+$SOcn0gcHt4OD|=%tX1XC9YDhGZ%gawQ33`(-`jG7 z8`7I+9YvND$VTlUk%5!G_<fBPEAGZ=ueX_+$s=-BcS3xg=91V~9+-&pSWVUM8%`7~ zO5Z4hUA1<u->CY<@++p8lpJ^{>oR}lC$G1pdTG?m%ZcN)bvw)x&jG9Y_k__=ji9~6 z0YAkE#<yo}+*3rjlwoy;KNH=@xLI<ewMrExD^$##P_R0Eqe;q}JBpm9aR_4zm-cN3 zlMN3Eo7V-EIs>%NoX3P@oq#ies`4#H0Zj)-4m*cCthr*w203^9X^-Fc@Gyi89ke1? znEAiFlBY=VQLK(cfPTV8-fFes<v0b`$F~$y`*xsu#n}4SLwU}Vz96b3D2cN(0j<{2 z)wjeDL0QHl`95YNR@Urr$+OM2fK8E85^7h5d~<D>by-4&0ybtr2%3apFXb0?e>_;y zT-keN#PO=h!zZs9zLWYY`{x_=6kn%1#3{@EI;U^Lckva9hiRo{L0^_cgB{%qdkUXx z3IoJZrDeU=3{S@8wjU9_S|k+ChsS29BXbz-F+MLZiiky~C6X&%^|(te0;~n)ry9N+ zT!C#=?tk{Q-?N~ryx;U{Xw=D}4byZoBe&>zDJf+$s~dtheRd4)l*T8oR7`eFx#T{% zYf<$4SJ~%%-kzj_r^{(cF`qsqJf#(*Jf?7T&OJO+T0vd#`HB`2@knuJvn-cDKjZ7N zN=Y&Jf;sRg&VM&n+2!Q@rIQ_dP((E$c%nijbXE_A+O0x)q67KZa#xNZ*?iEok7JZ$ zE3iYP_1oo<F45Vj;7S#7fkM>USFs1a)!B%dcD9G~%j~B49qSVqnw_GRwE+(Z{xEi? z2G&G;eWAN2Y%dclRWApi3bVDN&5!V*i+=QNO4jT2_$LuEk}oxOIIrhKxcmu!`fY3Z z5r-W0Z8Xo=SQsWG+4`xmk2#@r$b63isV6Mh)#xeX*(z`)?&L_-o!;IdtdCk$)OZ%* zu(Gr*__-x(cXjN^tqXFTj)ODiTLaMM-q>)1f)}$5{1+|7#F+zhobCn)vfeY%c}k^{ zoovOi`e5{E&!P$%h9G_~@ctgz<Sl+|!2{`2nXiHOLd$M2)9SK8u@<-zm!UIsbl>Kv zW&EqxZfoZE#JzYPkiyR4c3t=;hK9IK6VE?1ADyEbbgW8zt+JYmGDrKSSk~%WO34jB z4?Hy986}h|9JxLpp$Ww;c}yA|k7wR+t-W1Ik;QP1GL##?DN|eTt4&D^289TSUi4m! z<XD{ComU|2(u9()4ckRorO@`=2(^~0;y@LA<Lkgv%>1uom(`Z_AKTz%4UoiqsiT~w z1ZdVw**Ao@P%qK%UKI`L3l$zxon5eCIFU^`lFx_zc4{GzI;DxhjJF881vf-xmqf)~ z?H$TnyNjy8>$&L{FHTB!g$sMmQ8_yGOv!UfUYiR>+P<^HpZIv>Pwg&0ci&YNpc3Q? zEMsRnM;U&9RYbyC2ozEgmJ&%W2{U)cb37Q0iW-A=*>uyHT6#(Z=L!$V@BPmlq@5c( zZ<BU28EOlBR}=VkbFGf8*cGer3^MUFlEd6=p~=V|W0~8tAQ1;{COTFkjf)#ry7)!Z zhf(BN5ikPyn$4;_C|WV_+)1!Fs{egQPS^{_VthgSbk*MK*h6}CkvGzBuM&5OOfjrY ztXZ$vMlBjv+K#}C097Cb8`B5sOS!Fqg&Qk(ZEciQV5tlu-5H!)4210Hce=`8-tUXb zzV!l^KUF;BKq3^TA2vN<Nt?YI6GJovQ(a<>`t<Th!<>TV_Ifxa-Jm$gHS}RJP`KQt zrPG%R?>T%Hurz4n{D`}g=sDk2UgqX!H0fJvayLw$QA#rBuF}uL;*ye)Ocn^}h)(sS zC;j`#fI-ac_ha?0MBd6@{!E*jkBeJP_pMB-yN|1sd`TzCq>jrY3mKn48c%K|%=LtJ z<uY1|^?v|zH^+&sR_+d{Ylw(Fj=7{FKn0ZGr-6lxv(5(?K#3t^!mx(>!@H@PVt%!1 zp0PM}e;XUMW>g+lZvJ`8xAR*|`?PSQM}mURCu(iGJS4`Jv}d996<$6*q_$h5!?u&U z;bvw%^Mou*^ExKK85`FbOz=L1W7%4#`|k3SvYmHhZZN`6#d%gGy=){>L?l7`$LnpJ zf%!AL$nYCmw4RDpC?o8l8usw}l-k66{M)1TknL+Uva)n!-c<AJ*Rw(M{u2BgH0NXY z4Uwb=-cgN~GS>G4H!iNU-EvEMfos)3hEG{eo-PC)(Ywt`(_6FIer5?cX?4GintEl- zDPJ6){E4saFz{uLF>oL*DmzCRJ0lVu(;@!>+#+3cs)b3u)h6M{h#?ouKvX!ouTY zq?Hh!r#d`RBC_^K_2=9}gWmZI%ILh)J`Tnjf??djfsC}*mhbj_52xnj`vGpl15r^@ zJfY?`!TQMf%J9g~cb>ZoYf~r~Y;k2g<V~N{m0*E`()!MgyzXKqyuj;xP@Ti_(u?r# zo!nLNibsZo-Gauz!p1<gTrSKuYkEIFLDk3S`sC-UavzTgSws9l?Fx&c_^Ya&m>@L+ zforUy2@~&8rN0d3YU4)lQ06e=E$kJy$`ymBPQS6L#0sG*U$U)z;y8Smg%1DV$a2=k zCgcT<HjeYD&euCxJL6t$XovkU;Ms`c)(qXuxKT6OBTS#m+L5aMt&3Eu06+w{mik<E zj&;NvLx_@|NaIERJ5Q0fI-|-8W8PcfP<8J`8*7S7g`U#3=KAVAy8YBl%JS8T-%lDi zwKP!RW)9;MuG-T>wRoQge%Xo_OmU=hnU!(=Ylv$R^o38Qa%*32gYo;3JFkA7Kg9Sw zx>m5{$~88Mh*288MrCRaDb&&Z(MT@I9Iql<pNh-He1DG;t40XIy^vfA_TDM=zUk4p z-Lp~iJy9=wO-!{6@IemJ++ZkcOiXq+^ekPM&z8p^@k)z;m|$T>u=S1Bh~!YCq9l>) zO(cw6WLcr#>XUJ;_0JW-d(xRQmzRfI;+L31E*{;E6q}Q-$w?5CvnCj^;cHlO7RE+A zRccZ%TA9bW`YnBUn2lpfYKwgQwK7ZLOvE${?Jc!GY2l`0g#Dz}vKKo3#VbnhMsx5M zR^K%3o?8yguJ7%l(RyV*GymG2gs7F-#kIJyBO~*NFWW-tsfv$HyM|=(YO|p7G%+t# zpShPciTXWhpEm2|nA5#wx&0|Vv<c)V8}V@{1)Y2NNpD}XgE1prGzkO@@jhwY$>|In zP#kI_<}&lE=p9Slx~&ZUIPT9He7P7lrj}WB6TDQcM5$1~%Fy>JO{O{nk<Di2EPtxX znRsm1E&=9_ia8`|x^P-WC-L8$;U1o92N@z7__>LpzzIEq%Fg+OXQ4k>&OQLMxyHD5 zX1_Bcy~ljpsfXqIeA~15wQkntL(_P!v>fPTko(P6k(JafQyr*)3|KHd_^9XcJ)dr$ zUmKLmZ_kYS5}AKJn0%$}Q@>I(tE_f9ZwznxBqOJ(&3t3}<L#MuW6tl*2b<k=O}L4Z zI;Q{-t&<H`S2%z>1Rx@+rR6xTlMoumnKvEOY*FxSy8t{-1Oo2Q$TFuO`roC@HYv~4 zgZN`#4XWqqe}PO-XUNUH)!I5>?O1rsFvZb+(a5L+bF`<)0wQjJDs(mVweZJLr*qor zs4EP+3@gh&eEW`4-gVPaB<g4rjw()fCv_>gp*7#Xhx32-D_3MP9X%~`+-nn}c6uIZ zbzV%s^==s?mQ5e*o)K??dLmW0_c0c)avziqD|s@$<m=a<9?z0JX%7W+SNn)Q6?jFJ z-!b7T8pKicj883|)I2tS;kn4scst^LT(VzTDOd56GN*OLBew_^%Fgd&h^~+a;?;}* z$3?NWIXr&VG?s>)6$qi{fT%rsP0K81-DeLSA(sH%bRqY4TJhIS&SvDBn3KT-I%QD* zTc`A^d`m?yeRfrUQL!oc1DH5RIH>8Nk||<QX`juN1K}yj*USQ=E$(<fN|S9nQRdD` z_@+q>(bu|Kl`U$q-Jx3F=V5T`Nih29{us2yJps7MBhpt~2lpJ7@o9#^a`W=kD{iDD z%@(H1oTW&)nMJUfHDCrj2=5r8S3Y7`;*vv;e+@-+1)o&gQPB(468ZyWNz5S+Mhf2q zrC5^8Ydc;84^HGf{VxCz+AmM-+7A6y_p6nytSV;B#e$FXo;Obrzuxp(o>nkSMtxmg zp6gjz2-S5-G%#WYL$V#6hNus=Upv8F8s3CDEsIVPSL&J)I3><W4!b$z=X`$Y{2qSr zhVq55iHY81eaHld?}-Ky;p8NfYicQ>aaF<DJA0Hxq&_P&7o~NUt%tX<6$q$Ueq(Se z=+e<*=ODMHPU3eY`8Fre<ZeqSFklNMlfR}$856xdBMHZsuDDa>yb|*sNaL$)7CM!y zb8M(%J<KP`tnx7q5-e=++k#*KB)>4XtKKDJTvsi#<?-WzqWbm6-itUvL*1w4CY9s$ zbl>(*oY&w1y>n@0;a?kHR2F49r_)#SKr}Qds`ReP75c69keo?gV8QBQ5Y4&BjUFg{ zCkR^yu3~My12>wUUigraho!oWb=FrOxwd{ld)yUiJ0I8m-J1YdYOax{q9lze%~#uU zvhB&{(Yh^iw}aqUQ>f}Iu+g9#MosR;exRU5p4L@)WN%#7>?i5vFUlY~5zZU8&vBK< zb2Y4S7xcXwb?N&yPhg#wFmrb98cJ2nstXRg^D;$9s94rDrMFgEmN3H`e5MFS1<aO~ zzHX48m64nrbLhYKn8Xn>mR?ZQ$5CnGqByMH*D}K<RM38Cey`qaCfGZC5o1&BW3#U< z3cEG)^4jrrOYE#B4Lty`|LoR7A`nuY$v8IO;binRU352Zu~zbKuvx5dcfbUnMEhfQ z_A!EjL;H>r8~4|nciJ-u_}uPY5jftQ&>Z6Iyu4%piXUx%NLj|pra0yQ<?G<D6JDy$ zW-X?YhM7xAS`yEx$>|1uJ9Fr=!eILAAa-V^Ia0eQ7QvEWuaudTCZ!$Rth_emc0=m| z@!W&poqTOY!9qPPSC!)Cz^#JRoym2imaxZV+jrlt+*?Y_e<xJu%f(d%=p-icMuH;k zo*5fBDeZJG#F6!TT$XWomL{)BXscM^dvr*2Z?g##VZWreB1eIAebYSHaDAxHM62!9 zGa;c>2VPvu%@w1_pN87n-BT`O?UF~@;(*c$hLd^b$}B~pOEb~3C$5WQr0N^WV8oMK zq)$rA@ruzkc>?Tw>v!2Jiqmojcvu`Rj}$fC4Jz;nXLOs@yaR2t9Q<h4_99lOtl6xQ z+0%OGtV}U+=L>_1MSaqH8HU<Bc&^^Ki{AFV^jx`bP^N6_&c-VBKKr_W&~a<CM0mh5 zw!W10ZlT6XQBi=$R9fU%(}H~yKJ{>JD{`7gm11jeAaaKzHfX)WOloMJf*a6%(CC;c zp+ep!x?MJ2JdtXESFQC+O5v+ak16oPZ89dR_iNA=(!$62qdx99A@=DFhZ8pkp;_VI z-S^i0Wa!IhfW2`{H>R@{s}DXE74n^Yg-bZIoLkDm9T@u(kK>CFYGxT15H1PBjloyc z?s^HedQ_QI93<$POrG1IJF_#C7r0pY=A}#yr#$14`aKu_Zg9ZFTJy2^t>@8(0c~g# z$6hf`dDB>~Fdl8>vc^&t1F&PgDCvo@FCsP7=o5u=wS`iJlx#rg#+yzFKT3eJYt66A zU_<Du!iVQ6cs6Ntsh)Wt2m$NU371^Hx&WkOX9g7moXEVg2Q+OyZy9?Q?~3Iq-<ycs znD3tU<F%5%Wm2}V-u04ycf|n-5{Z^xt8yZ($<?}PGXwNTpE_)MZH!w$+^GQo&o$SH zkeeM!t@l}+khr59A>pwSqv~Kvkn3GoO196_h@~+{xyOv15$y4&AW2C$ix!!XL!4@n zt5;Jt$+)*^tVRDWHWUkSSD>Mz>w2{HLSVdl*Rc<<$IWTlb|zOq)Mxqx?|tBv9(1)} zw6spf2@)4qwWDC!e^C8l+3Vr(^<Fw4P+D3|elh7810B_y3+Qj65<t3hs`AI#Exe3@ zYd*EPGas2k3>Oy*G#Tl+oaHy-Wjs|<C4CMg%<C;1b`*KRj#k4UBSVit1c<7*J;x<m z;5=h5jjdc<U11M-8)v)y#0~Avn3EI2-w7m#nwQ6Frlrfg?z8VL;X1#DeUAzqc=ep$ z4|XBO!S!<SUq{s0<IF6@FSrjBqp!qs5_rEYhB{F|81>Q2_Jx=CX0J}v1eTO+CO$mZ zpnbBTx0b4_aPA?!ufhg{?e3Trj|E6}k6ogfMTAcNdHuo#3c&q)iULZ7H{5D&m+N>v zzdTaAd_?k%DHnOy|9X@K0D!z1C|Wkk@wpiEDy!bTsQJ*2e$j)>9WCS>7lh#PYG;)& z=?X)wgw@%8HqMY*0Z!zdba^*<ZeQD&UI)~|tkG&`?DOj$W$*frMhxtjq|dqar2;p- zJ->jfMQT*o#JkJQY=4OK55zazIjMO>v(9|bG(IwrIFP!36djAuP3I#V7N^M%oywxs z;Pxz(fN&LKBgzg&wlf+f6IkQ2aRk~3C@V(Qc#e@tWB#HE+n#9mYBllQ8<zM}eX4<~ zOw}<MsjsRyhr&`UA(QnMEtP-$8DH{pX!FRgWN%!*`|ZzHDy8K$Gxz~mGs~RP+oYl3 z2fWmAPzg2pz|&e;4}JVGZEY>!tOn}AO9$pOg|YRCyI6__4xOY{l-Kc-&B{q;t3sBS zHQ&}|J99cmSFk1LIf4ow`UOV3_(tF4e<6jXcgm#dV354_f?F^E5gN{pfZTBN)M^4j zVvpUk8v%NdO>Sap-VX{3HlL%-B{`Gl_vRshB2@Wj{bF6Rso}YjRCllRn3c`5<r@5Y zero1*iWlN*1rO=gekt|5>rYEx3Ea;atRlFLV4^he2T$&;<1Z{<z8%UR-xf#S9>N`; zO!VrJe6kWICazQ13nU|45{KQAAYe8+)~I#St_z(>C3m!<)9|o65}?Ho<1UKi<vhQU zMp>=2XQxjO>c-sY+q5Sa2ZTMQ*aFs>em2zlr6+)`+}zBOhd;Sb8vOE75qGL)nqug$ z0EfZnPZs#d%hvdsaXXHxRG~6+sD1aoaChzlYe4|9A1ARwVrv@^<00>#`*7w>EdN3s z-PD{9{rEY9<&GqG-RaQBE6hNOqj$Abt8#k2;7d~?CWQQY_Zq>DiSiWD-sO?iqHR^G ztg4n&t_$NH)BtD4Y|=9g3$zC60#9`JlX;JKcAh&r{e7q!P5^+IYoj(KuHXq=n^Gn3 zl0CON988oMP6AL!NqY9PN!TZ+NnhZP(_0c^P>)OIx^yYG?Wo-3SE-A0$J!Z4y7KB* zbMvJyIa>sZ$R4y(+&pn^swFRpf2U_aQxL3jO+<vaY=p*rZ??3&jWs;oSN}XQx`E?` zP)S!V!%MFxs_^PQ6Zl~@%=;oz<ISjsUf$4r;@09ytn}&>?fu%6PV!@``|;B88!y#u zPBhM*X~yw@AsPd*(geyt`OVWH+)ZADVOx0=g3Y#PTVt|&yJRzmhRK4Jfr8gIn1W@O zRrSpLo5xoyjjdv@Q0J*DCz)J@BYX7*LsXmVQ=YZHo+ziJs8-QHsANw*y2605kIo2| zu?EMn$8~p`N|)1oZ`1aSc}?M{;n6}~zgkjE^lMt{hulufdg$3tdeHfhBmRVn^dVH5 zSOaEsJPJlJAN8Mr0hTo{PFR7rjP)1eVk#IKkim-K4K6)*%V+g&6*XI4y1;n0fz8<Q zSGcx|<7VmSXFrKdpFX9fvIbSV3*?vShLApA2muW)Fa<Pa!q56lecg5<=@J|TC7=vE z?>$K_;|?G07cj9eg+&ls@4e}7taf2Z=i^e!5f)m~Isd$ZAInTl2|^4b;%Qz=aVuS= zq3_~Wt@c2~pEo{xX4#diwzd|Z6D4+0nd<pyqu7Q{5{Z=Ev~YYZzvl6U*gg{BV@7=m ty}IekP1s;Vm#cgJ@6*HoJ_E;uyVs>jKTWz*e*Y0h^QJDcQpGy-{{ZviU^@T+ literal 27249 zcmZ^KbyQUE_w_{t6hx4eMi@#`IwTYjhLjMH?ha{bP$@x>p+UL?q;r57kd*E&0g0iz z<9FxtuJ4~OE|zNzYwq*hbI)_mK6~#Q{#Hc}AD0pr004Zbyo@>kU`qf1#=QsF;3q1L zr550S*rtkdGQb`BUnZg;7X0Ml2l@A|;5R1GzZkDsQ$K<q;<!PTWpVyJdO*Y`%$s9b z0RZ#>ROXfD$C>SUuOIsF((dlg*0s3b&A-QByqaMyEHW&zA&cpt4-5O0O>FU2UykI0 z?eZN7jXSmb+qn+X57f@Gj9eUF?-7xhJ9tBj#2!9TdvD%<udrd<z+JLglE{ig{sC0G zU~^&e=-`hTErDFD=$`AY`1)AEt~e36pa0*_Tk<#e|NC2J`ULk&^L4>@9#OjXi7h#4 z2EPY(Ypd91WGmAk{V%%BZJj6kl<%q{lSg3HC`r2*O@UFfyK~P*yKlWcK`-5GzNPl8 zAqVDY-H+syely0%M(d2zDQJ5%EbbaojxYj1J5?~je=C*u`wnL(?BB|rsYje@#LcJ% z?G?yh_4-OeuM`AT)rWZKrjEZi?(&U_yEJxjUdEDK4~t)#b;(>t*Ip)^96twu{%@@~ z|6S^%ZfQqhczR>HMzPjapXPVX@6-3-rz4#OFP48Fe`g>SAJX|-+h<@FpRide(wk6X zLIMCo9HSSD<UDv}efpCV6R#oNygut`bX9qZ#TB}ddtN%0^K)IJ#}EC2cc>#A97w6C zIb!Y$`rxl0@l9a8VuyZkk{?MTK<vCt+-sM&=6LnjV*Jxv*vr-NpJXKj3?+rt7rMxw z_iGQ*g?NT^xh|yW_dJij$v!UBQ<pQ9esR;S|2bw$kdI0!^!JX(<X_P@cpg*kMID9i z;_Q|crS}61l4{v6ZuR?baF|b?$T7r2ZnQ1!&*v<i{-nG%QSpAgnCR9-iF&bVg-qg7 zJndF;-dJ&_akIk>7C}M%R7=T)+>MyJR$vnfx-2#&&@;JwA5xSd-~9TTr<Sh6_}tP` zjZFL_ld~2K+HrqYl<|oCCa(IV+&i%v*VQ3EsErHL>@3aueJW_<3m|3WGuJ%#q*4F2 zVfWp3P??ffdA2ffaf!|kdIm@ux9*tw<?N+|;&{|Mb2*(%#?=&MUezrw=;WWBH_%C| z&d^&WNYdjx`z1fi%dp%5OXSHPxBh?Tn`7^bvFY-)Gnjt`1x+Xvo{}XRGLB*}*TmrN zf7xo+gk9Ig)|`6kiD=i$jy!9JeF%yg;Gi>{8H@EV-Sdq_Fbeva4!=lV-f%L5OZAc? ztxK!w_f6MdLD}^sOf5Zg&816F#(mg0EaA+CJ#eHQL@WeCG_Wm~ygbAPwQ)>hzwXOR z96hMejCU*ObE^A;og-CeHDR$^?&J8J7~k}!LrP*%D|{yEu!X$)#Mj~am9$v5ecij= z2GIxGLObIl?zJwfW-_1H7BxJ{)2(70BL^GQ7yC#;7hexL9;Ayi9@iQv_(N;}Jy*R0 zMLl!M@5FDGoiYVzIBaY*2(0UZgwu3aDnB!IRPLLUVw5)Mq_EhecSpe#1>m-;x`jWs z8lhy@Dr?P(q0x)x#oF3oMW{VhOll%*ILl^u#-Ezz7yBzkvg%rn?}gGVxq_>D;$4s* zs`M2}r`=Hle+ftqpWxW}c(2vU6_WR!R1Uc}^;sSGwZx@5<zMXjTPF1=CAbEs&beFs zy*)bq8uPCGb0MLO$M>#{W%qUHVF9uCtQDI#F!&c~>R}(D&z2pCHF3StvMi9$&xxGO zXY0Ube<2DHd$Zg1C$HS0Geo`ggR=3Z1wTsL;}<17F)ZbP$Z`jOMq;+>UF93KNE!v* z$-(vY^ajohR&lwCt1rtwA{bMkUM40+c-s(dH<<0IZwHF-uygV`ij|LM)p9-FHQ2d3 z;7RgLb(OF$)q$~|ELmRP%2C9lQ*ymE1R~8uz#GwC_93vO`9o7076D)^>Yj4U>xt;o zRWd>H{FGlT!7h<ZQES?9YR3euWtjV8X4#k}nZ&ac*!1dW%oRsyeya+{k$$tjxehXz z(aqMFzu`|7yy5-9-A5^<RcZfMwBQH(wVI{mqn8c2e)hTY{D7cUcEXI@AwLutd=!d{ z33xp9#IHw1uqiKS^qd%xt@)_Bajs2D0D*5N9P<-<u9wU8uk6^2&Q0sfog^xZL(7T} zFKY3pTYDAZt%G`cwr363io7&3y!cxHJb)F($!&qh2p$uIt#yL!*Bn5)HN!g}on-_? z3!m%~CNKnux#ubQXZw73pVWLbxaxZsItdnPt4|mJe|=h?djd{v_7CoB=Ivdd!lNp0 zr7HaC1x!Ua@<`eVA;fdjmzxN+WlUZ($v5Ql%c{xqZ~{+&aNil?&jk{@g_%!IjxKJ? z8wR9PFslPnX3jg$&Z29ui38Xy@Qfb%c%QP608*d%;D#G92DEEeay`?xlNZ^tO<GUg z^|{y{93fc1d@9Do!&W|h41LKtbUmZ5yX~kQ3~x=#^Ig1}Ts;zdf)_|n+BBal0Ku?7 zIc$<a-_uXgKDYcyb@rYM<ldKgOdP_8K;{zs?9cV`epXGd;=ErOJ)sh6e^b;=i*502 zm&ZtFhgP2%rK28Ra?`(~;jnO-=u*136`vjyEOQT{eRU|-NqXVRbXAiZCKFg-R(HS- z0i<&5;%9AkYqS$x{1%g{Hv<N^$mp2J04Zr#PM$i&-sx7lmw8oU2?TdRZ_7)1@Vw8e z68@%TX)l;NR>?!uM45c_G>g+{Ew2I$@vb$}I+kX`u;kOxhXxj9BpG0wm{2=&ooPv< zQEhD#p_GO{`nHM;o^Ewmr(m16UV&d!xj{?<qKE$Me)B#1vx!lK3*-@Rk^k?n9S=>x zXU9K!#4+;Cq_o_;lIil!GAc?!o^?uhH8|LhbSji7Agyt#nMLpKTG<2rGS>CW(s#xg zf50-Rz#(<mrz>z?o*Qbm&_@>nzs>G#R*7Dr@a~&e*?UTb3<@R&G7IbZC+8&Iola;d zULfn-NaP%uNC7G0KBEY|;@=e}$PX$$&gTrVKQzll@)j1v-_=wxNgAl9$m|bpKa~~D z|G_@TdPHFLm2ooWVPJjXRD1MnQ+%r&^~CQ|H9mZWlwXUwv+O~$U%R1tysjrh(y;T6 z2S6sY&L`in`<8GG&&W|#macMm7(e$OV7;N7!LMD4*Q#&gT*%~Y*0r%Ap8F}__~Y$g z1I&!`z<2Hq<|Hro-5w{-I`zVl#SEy=X=aSlGWY1YW^yJlgj}q>Ei?W^;`^D)U2lYf zZ9mfsuFi#E|AocP?oMvldo_vyC@)WCQbs0J`dPU}Mqh^s|NXB{oM-wT8jNTns%W}R zx^PCESM`^~3{ME$(S=IMbYTV8WBK>1G0)->W9i$!UYxIlZ(P;KC}m>k{;g%?u%s9Y zAh`T?qr69w!A0pG7gyf&)l~o3yOVDaKDLQvcnv<n)3H3br3X|*`{Sz_=EdLecir!L zP7$KNW~`WYpp;XOgK~v*A`nGCwyx|&M_tnKA18z{mBxk*vfLk&PTG;2P~O8|jZl}E z-mMvXd`=P*$s)d-y;>0!t^!@95qNPAAjBzgxie2<*GJYCSaCT6KuS9*t4`l&b9W(v z6~?4L)R_5WtGTC->xnFZQrhEg38IjicdPbyTVag;zQ&o-BN5Ph8WP;Ac<b<saagmw zx>&gJ^Xi&0u0t$5%iXYmR2DElon2r1aJt)Bm<+PdXmjYjp#}mwtp;mY-M2z^Z;8bc z3FcL357w>-`narY?@*<DOjfE<qWJtf&yFH`;jP7-@(4bJ?|$?bA_5b*M{RC0B#4bh z`=T{@*P9M%yjj4Ac&U^}$6<k2{3+8vG*uBM=iQ!bRGYZ2Z|up9|K1z}SpLb5s~+&6 z@#<Cp;rkDF836btW(C50ZIbpR1q`SgB3~}E^_`_Z^*(v+IvdZ=qpb3wjK-jcR02lf zGeEASXe%?))B|5&WbzAy@WeM27mK_3MMB<oxjW7%Aq@9oB?M`iUG(!@cWjV%Eialj zaREYYzL%95!56J484SRhD2?mRMr8KRGCPcXF~HaZ1RgEo^-9?rK`7e5o}}Ysh24Q! zp?{Z`4|7H0EB#m$f0Hhg$|RYZ_^cm6c4Uac`m5I|SqpMh-=2dY_kBbo*Mq8?3<g|4 z%5{4z4t61HQu~3-q+L2`&qpn(lrynC`bGI?C+_F>D^nHVtv&|J8-MdRsyYf?kb7b3 zrTeaYjhZ7I>aS?9XK23!*1xzgHFU=U!tO)|u5V0gjZg<!uJT|7edHq`<d+r4snd17 zPad8FoutFWq*--2iQPSYe89v<Dc1<ic<Aca<+PtLD%yp!r)o=xKI)%sH|M!lnN$V- z%Kdmhk%rgj@K}g&%yZm?)5TP3`(-LR*PqORE0um%h{n%QrUU|+jV&*IMU1AtvpqJF zq3*Yku03lh*Vi+xyn$lkdq;>cm(LiBOa|y$+HcIX8|2_!de#*YH24}ypAlh_0<{!n z4fg;@h~ggSIxZd4LqIB)2WrH<iW?E0?G;ybQ-;TJj(~inwRUTS`n$7Do-xrqwN_Sd z`y3abG4e75jOe+c>U|*a%SE($?LL<&m>pQ!J-K@c4S0i$k=T1he&l(*7p=0q%{uBh z;hE5+?gfejJE1S);^C|l!C-5V7fmn43H+F|j{(Rp@9w&qAkSoA;8nssB90?+ec7fX zTZ8?M+6LU~dQO~jgP7gJYzt@G?C&a^ovbyBX(0;?SU`mw*tEX?xfm2b_qQ-nB~U{j zMJ_dg6TZQ9D?(Yb!hg8jM=g%AVq3WU0*Px47iF!!OUF7w{CQAsDquMp9o0h1H?KA; zyS#n8>bQYSwxmKKO+1`5q3=9;!t5~r=Qd<E^vt?*?yt}xm|WJRrV>Vt=fRjaY=JN# zTsj~SGFz8NslRDpu!BxoT*rdAqhKMz_Q$)}oGS4yenu{%<kQ-WQA(!+JawD6d!qav zvWV%9<s6uV0yk!Wk?y&-x)gPV6ea+ff3jMeoWX<*NR58*%NyY<|4#4m_8P32t8;0I zDcfneK_9DD+D^l%dM<(xD-)G{Q~NCQC;m{X4J(L2(OR)QhV$5K@R77Tq5fHc9mpuZ zE5u(Gohd^U<F<<)oDy@@xo@aP*AK3LH-?ON_bQ1d@qd4?E3Uq?h7U(3x<!3^)KO?d zv(lDfI6La9rpM|2E7#9_fxqmO7i)*C(5$$DXaBtmLVo1-k@d^?(}UsFRbP`leLQ(g zXWd#g@RUjMCI+|~NGw*NhCKm*ay|>(`QAj*M_cC<Fr}{kumrFpU&<VAC%_CEpBa5r zvvNMK6&A1`sI;(yaEANfcuOpjd2hwTqAY}0*t){D+L&*WAcTxUM@8%aAUJ~%w_Rz` z0mH*H+SR%ngejkW3*sI>bCqGt@YRtysfLCzgO9W}{7b%S94bjz8H^9@Rl273i4p^n zA%v+mz1gbj;3og>@#S2wD@@;N$ln8oAbJf-B(g^IVVBRjIkwr4^0GHDc15Z<N1S>t z7RU+T@Oc<jv$Gj1@|rPP!7oH$&%spG5;*d-{F>982j*^zB+pTq#Kf#vGz0*YUpRHE zKB@{Pmd}=G#X{i4jo`yhnee4xV{8Om1XVXpyoKR$hrw-3exD%as{+AIIl?aKbutFL zS6^~xA>vZJ)-Atv1#S8zZ)4mNl@<$=AFGhdAsL+OMF2pxT0>Fbygs*%2n)!h_?S6( zl`Y#`0ZzxcFWjGtW8&rL?&!ijSn&U5xYb{fnjk%$8-%?@oVTBv)b76)@{<{P9V_U= z)2Qg+;tqRSdwGwJ1|c^RDs(e_eaV>NRIJnMynD(CPnUK1DS1__>7xvOI|n*EdQ<1M zj0ps?^yhiI=3TWIenKDg$xr)1HBR(lg~X@F+jQf$&GD?>K<e<WqvTqRw%7*kxcG;_ zR3m28188GCzo%;eSVw-2*1~mu$aB-dTN!;=Y>aginrPF~D5!33CP>5~;6VajcGwqb zl8Edn;Q;*6QgkQc1iggqr+OfwBac>Zj;p2uXE#$Dul*x1SN$uK)^-#$#T6>~p_wlx z=!Xry1llCK-<!YcOXvb0abYbnHyQ-PFo8^we9j%UWYSxzSN2wsAiH31S7N|4d2a-$ z?dg;9ut3i|*+~*>7_tQXe-5QBM^KO;6vYRR5XIV>JNE%FVT@f}i*Pbdf`W?eKYW1k zgKUzdQ}^OZ1esr2l|=1}W^i0Cr{;{g0&IZ6KaRL=CuRmWgQ;-ujc3b1iXQs<dB?ud z$M#srY3}6y@h3e|F<T$h+xSIlVB8$6irVn&3YP0TX3UGU9V(B88IYDyKm*h%*oBFX z&$nDBV(@`K+}7~7o;QU`LcUscGU2st1}L5~fVTkER!lWoLLj)yL0H$0!Jh#Zvh^CR z9Xl?>Yc9Une{XoKe+i`8NsR=GcYLPf(wM3^Me^u<l=k*Lw?+4_mISNuGqJLe`(WXf zx}{bBxYnw_2zL?t1_|78k<X*_9jp<SC6RKS{!TMhl1DkWT&cZD(WLOeTB@<}!h(v7 zR=9;6Oiue4&R^zu+{`$D6yJx*mJr`1W7w2;p8jGn#77beXnY`m85(vkUc83^DfW|g zHD!u3i4elrCuxsAZLFYg_G1ISer6RE17v|d$vZs@F3~_qluw#35;Z$w<vZ?dduxl# z4ialh#j;vmoxMOoU{Zb5P_Xz17R)117kS%3gG>(qDGi>RVow^;2>M!k1Bqr05?RUk zF(_q==3?meR=mDZI(;DX)NXz@#sMbKKKKZoboTuV{n?(e_khgzg5D-RtLCOtFTpCG zTIXvtf{}|cCTj(`D%_LgNo5UulR<*{l{Sp&zptewmKlBgGtdrzCBIbrN$c9XN>Bec zl`GJDKZ`Ho-F8w3xVwWo1u5n^G``Uj3USH+(8@oP;5znd;H0@6595O1O2H`Xa55_p zAHcniZkrycWuIGtGeCahM_84!CX+bpq@SZlbFw7;S&>)y0H=#kNqlZgjg}=BG{(0S zlKjcz$U331pLdixafjog6y_0MO+38&k?TfLWbw?AR8B&bQp#*oN5I7ioO!=Otzxj3 ztBl5_NhIi#CuCopxO@VGH(d``Ar2-mUOCC!xXK0it0x3&(jll>nS%fj1DPfwWr#){ zTMgJb_Fup`UC$0!%O#;D0b3jkr<u^<xIqoD>%}Jw_?b^IRbevNAfY1NSC9jeJ$~N0 zBXES&<Lii_lE<`GO1A3va=OT>DOvMQ{U}YiTw!waS|5*&81@EIl9QO>LGtS{hr9pP z;c5UAo^c~7)BK|S7FDdMehRydC)B}hg^b3~aH!G9a&;pkjKPC>m2x=WDBko)2|3Wu zHAo_dl%}lskdx|2z<`&!iYXT~$gdrdD?+u-H7j?B*yt&k+ehe-NZe|J*uJg5nM3<4 z|K`iX+!sOy+|&4MRZF!7mh(1>iCP8jNL@q&gUxup<ehojr`vgrlHs7;Q+-)c{ru06 z{>-h-d|5|wABjb)j^!2bto@}7SP{SM`|xV-LM;LT3H#*LomB4Y#7EPN5{r4dJI_xI zcYI_X4nOnGgjQ{wp;j52!_AgfXp3dL^0lK%|J7m{rzq+EEkhT@>_V1M*$Ca|1SN~w zT6!BXj}y1Cc=7jFTZkv{ISVHhE``<FZEcS0q(p1|d~@Z=<R|d^2S6m4Mi*N9YX_B_ zT3Y)^UUUL8jsA?*TZb1FjI>tkbqiRU``~$jMq)H}5<7>Ue<;Y^dDjl@NH#8YpI-Z~ zZDxg1UbK0XQa7lM_`yoguSDywhi0Vv!M;zfAgb9!>07izS9CH8TTmg9TA4Zav&}|o z%!8$XvwTJwb{amddv~;BCcP)X<at8e7(O>Qkhg(hoZ|E{k>6)n`f}0e<FAF|bzG=! z^Zxg=*-zb*GKWIRV{%rCE|Rh&63gxn+0V_drU+#TAUl?)b;nct7tS{QKP-AD<QptU zGhCnJ`FPvD+IM31smdK_Kdt1iL+_4hK56WcpxYT8$s4<7hsu|eHzb1@`L8^0#%zc4 z`jI$`)sK<RqZxPl=tcE3h`HS-yDddkN*{?!FbU<=1yA2*<adRZK6?aw%XanMzg0)> z`MO@|M+(AgPBnKJp<Leb2fkLbY5J8w{)HCh?A5?8(mDwkEtP1qnSDKd-MZqb&!ryR z#oyS;)OZKrKQa8Xy&zmy=GReaK?9-$<u?vjNhrRV^XGHsr|$pcSSseh*-ru-a~og% ztCP>(c;TMVxQ+N)ZPXy_`_|H4I6?B|kDBEPIo^(?2(iu(qjatU558#%mwA;lr#sH> z{$`Xx=m0pk;4`T=O>~yJ3yL;8L(TV?2mpa4FbcX$0}$b}x*{|y%`@;wWVy{{0I8K! z^aV#cmd@V)6NfGS_(Ry2o*0+kK=Nh!)~rq6B)o4g?pXJ<NyGGYDV@TwT5`owdQ?T$ zpoP|>#k3^Fjnd!lsERBn^UhELm1I(Ve`Ky41=*~9Mmge81cdryR1s1@3m=S@4#_J% zJi$3#M@04M!a4FjV4V%O>-bZ2+ys|Pne~F&H7bUBDV_PH57xb_M9i=1FWU8@sU>*p zjiY~!;vGX_d`$EFZp<`J5$CXB^1+e@pIJ_Lz+qj9F#pI4K^LtCek+1*)!6o8-nyO6 z<29auzX$g*fS)Xnx9$Ni&Ct37Y(am3+%aLRSYaU%udALUiR1+(NP4W5e%srZEcmfQ z7kd%FV!>@b@*`Z|NXv|I^cKqj1Tyv{U^AlQ3C6b-nB+)Y3n>*hPo1Er)|H6geKA@v z!yX+ls#R7>*roBPtuZkKhFl*Z=z+Jg_iwkk>^(~^i5{BgK3-VhC<7^@F+5N}X%Xxt z3FXE;@(XaD9whSESQ*IkHIV|zsi#=Lkh$yR`H-gq968kIPp|#_p+l58mhutzDEt4z zZCX&i{9|qpTWWWi-zyZnY$IsQ%Eh^UrJ8URs=UdVT+)zqhHLj52jUmT0RSg0#ial+ z%Va=(Q3FS)KNJ(5_{S~(p|0TR1(5Q-YwAxlQ(8=tNbi_f+FiQhn%a&}%4Rmsrp4#f zjM(&#P3#8Lx6fsx9o~~a-(-DkkU~MV>v^VO{z42==O~01pz8H%&mSFQ9Q1UvlR!&# z8L#A|G=@F7({kTaWKS7q=op=;Fc-u4Mpe6|oFC%*Z$0sOdQwd6H*n#rVqY28)%KG< zon-x^Sz(k^D9FZw-D*6%G8qztB-GNMymtZf2NNB!xIZMJ0mk{<%s;!aylJGWT#%8m zkUTxxy*M|kd$oQSsCn}@IJ^y%3%0RoLoXzJO)Y&l2HRiM*t@w&gW5~ZD?)0HNjiCR zyrY;4_SRkG3W(=<PV7K+FkjwB^h6>yglJ@rYjE8w7$<P;Uqck3pudQX<({%s=-v|8 zxJHGVB3W=KKl0S06j38T(vPQx%EEF6>{eDiBf$a@%`>XUB(B1cN)Z?1H$cw0{74tv zayAJ0lXwM%g(;E{YU%<HU9G2eeNgVe38JFNawMhjk`YCl=*MJ`a^&1P&kC|6N+WyA z5?1eYMbDB;1Nt;#o1uSnGpFaA*0^_BA2;`cV2`NFZN76AwY(p!74g``=8H_ay60+^ zfD<D&xKcD>kc=!1z>_!gRT@o3-{VW8IIG1LAcYtj0hwG1Fcnp8+PjB)^JS7klCyJ; z3FZ|J<_cF(T>+Xq%`UK^a#~$UuvHQ8HBg#IDmMRAp3<`{rS%Wv_lP|18IDKpWv_>% z*-3IwQa}#Byx2T_M)$P71r%wZm_Y5UxJ(N%m;(*=r5blk8X~7V{Cin-7-Oh6-i~1W zuSmr6<>Z|IX>~h>oqYfLNxa}_Q87CDI<#?t#YUXb9*1{aU$oK8{(O~Bn?UV&YIxrH zY=lRH+P^WCGr@)?{5sZ3HO`KO5ED=ePYnx1b6)O4A`%}1*o^9ja;r>{e)Fjd*l#mt zBV4EUkF9PE;8BszSLxy<cR&77(%nXS(s;khb6Ec1x!CsU@^+ugr61;H+mM5AF4hQ+ zkf%=Nh5>yHH+Gi3=L%f=og-@0m(VG3o_~f{dAS#mN)%-R9V?0)f&t7HSn9sUMT5|j zOQIHaBabqK#tVOku*TEe0*tXxM90wuonD3TE3#2W`*GOumkjRrq6v&W$G>O}_ezl# zh}<c<?42vFOZlk^kHTDOs+_iy0{X8iwsdp`1LN~aBfU6x_5QalOC_A+y-Yq_;qs1x zsU(1L<6i#c0Bh8vSoB$tq7iakwO{g1ChMsAW;ydY9s4bdT=0S@wdECe#3$>1&6~WS z>Q@3c%m`C+(kFLS@U}Lvkha#iARq~P#*;6-;Zb&<z&ZsMSS*;p>!p<h+YXf<aPK&6 zJ%M_(u6G&~WY)7fL!d0mhVr^Uk`{>zOmPvv+Fop`IAQe#fXy=|sZ6?tuDbnaHdb^` zH_CtiR#(3qs}UyMRGA=XIsVh&H8GdJPnkes&9J>I_5x%Cg=DV3c(GT0P3@|7UQQf4 zF*@I7TU=UM4>^{(QWO-o`E2=A@bhPoGtvG6A2*7>E_oQmpf1o5@&pWd#h4JH1|h5t z`T9+Gjv9C?R8wS-rMy_x@s8<uo_M?v(-Z6K!B%hJ7waR|kCHF0t3Z%-uZ|Uov(+HF zu_`LtXsxEmHtShAH@Hxd(e9t>7#>xyG3*PHj>#2Sb;+|{-ThLDXpm*j4_4;Fl<i+i z&gW=Ud)~neWIBp!Kc3g_A$_B~8DU2yemKumqGFkZJ@h{>fKow77PRD%W9G%4VIxyk ze6;(CB>Q-g*{2pO2MJs}23ZjypEP~c)2^7Gt)ZaaN_6Wmzl3}JA@*^C4Y%ix>Buj( z3`#ovSrf}0vHA|}yh$rVle0O^wcClNkrnB6kO4?u^Y&>?L3%UTihX_p*7BBP7TME~ z<MW}t2P+w9CS}a)@dW2r=cTrPd>a;k^-HQs1P=CEb3%1*!lJ}K-uHbOs&VECVXbn7 zjXvBFx&sgB^slh7W*p22wgRq%^5?G`-E4NdJqAa<vo~K@d~Mr%a1>18g5Y|le4B<d zJ~=>1<^N>?C$MCV`J4RhH;;FBU7ZocGKc2qW8j`1<({fk&{g9V(<H8T^S&@?=HoJ^ z)Mr)ki|fdt&x(+p*OUPS9U2vm3oTM|I;9BJ(lcle<fm0cyynhoawD5}doVOc(rzG? zo#0pM(pp)V4IkZix6o8Sc8%@JWE<$WbR5D-rmwk1$%Q}vWba%?+$&3&{TzdmP<|t1 zq4jM}u}SX@INQB73M%{Fbs--{|2{Z+Gd;hyCejYTFUg+JU=k07q*otASp}Ru;&{|M zo&l}pIaS@gW*kMRZ+;Q!4VmO=GMlIYF+HMqYYY@bNnueApQ2x)*4A}M^mT0t9S<Ut zr|m4i++8cwJ`<&uiY%~|WE2;4!GLZ*{VxQoY|XPp2b{h-e^D~-)-|oa*MJn`!-Exw zqc)Uq?aGj3+*UHdUJHDN66JrtoUVQjFd=Do`v&)Rw=j^n+Z1#{D39FY-@G?4>W=*8 zn{J317|<kAG-pT+2T8pjfe*l96GuUVP|cr`Ksq|wcvAqB5xu;*`y>_ZN^C~LbMyX1 zqSQJI8-5gU!$stElv;>;Q$MJa;eYyT4yB^JPS?w=1O7sVx+c1Od@^JS#U7)ph(R(* zH<eFStzSg)m$ZX}?T7xa@iQsr6z;25a;bb{<KCF({$RjW$Y?`jGqNt)6&f(`T_xlc z>~{^*dXzqIFYSDX85UUY0e8Rh@=`8M(7Ba8^@>IcBo!}@)P0R!nGlC>_H;v6Jc$8H z1NT<s#K@XcB7Zc$V87OgbjAC3@?`nj42f&Z<tzb<5>BT${GCZEu&CuBf;Rodz}|(? zOuB;&kUA2IcL}D$%0JQYC}~uEqh?#}+ClR<@*bevVCxkm%NfA7j(Y~h-MZw4)7G_c zDHhmfpj9h#RWK=d#8Z!_XazRO#NXWAlQK&NX_hSY)0V{KaewCNQV0VawNzit)JJZ} zGWp`+b|+4DiVB(}i`@8UlOc5W16(|``?#r7e|L*M_OVOGOf&xj22gPzAMIH3<iiE{ zE9STSsRW_B2op}7ZG%u+(_*Lh8OK9xV2#X|w$i5}`vZG-{&So;kDe&n53v3~v*J0o z4YEpQ)#irlhtjLHvs#Xnbttw^f5uJKwc7@~Xroyq^ecx>kdP=FJ~0H^&Y?fwZ4TyU z8y3RpFu_>9R3^>rUuo6zc^tzj@KHOzd9BptIg$=SwniP@w~l4L>Lba}=uc>kZNRmZ zBl6&?j&XV=d?t=0f_POwiy6deDNE@!p#1@cY(S~rtT)}@SZa@q-+4^4Q#ncqM$0bc z!1lycO7-uB9ubUmWcAh;#d0EC+$`88?@VF?1a0b$Sic%Fp(H7=oOeu`LkI&4n{tnd z)Xx7Z;sH{A@npw)`A^Abyv9j^zX3wYp7^E3Iwx+)w)piJQN6@;WzdC|5$W-VKIGa@ zA#8kt$5>DyNZG1CE@F}Y>{lh!u68ZjJiz@Tady%|Lg7P8TnhC5%L5Q$o;6HXtNxfx ztRz9h!Ml`rl~5D7<u{>cKBLVH-8k5~?5i`1;wEN27FK=w;>U#A<dE)M)?c!B2~FCD z)2#|f$w@<MN;4AvU+*0Kb@PQ?8lg{|fvI7zS^;ktITd=y+u?rkw!NQ^c>yVyKJIgq zon}hs4AOTR>?!^OC7RJ54zm;-{f*y8;%Pdv6yXi~(If0~+6t%Lxiw-gMoN1^hd0kf zb3l@oU6ug&_6ZG9PCVozXHTclBjIauOsOMRwg*+gLTvjveVjLaclQ*7*Th}K3x;Pv zFeps@bw}We{C#$ag}{dZNo|&N1#g4Ps-<81oUpz4OtBNT<sZ@D-x@<n0DdAg+P>rp z%#&WeRKWGT38%#l{P^?Vr6l9UU2JNt%|c~o+K#^MrFL6A$(J>j=da=k5(5yR5#rBy zctO+ZoT~;L)H4aXk@1;Y+`s-^9_o|hdk-p1H|mRyLRj#DZ-MCiairbaNn3w+(&f2_ z_Ao5d_mQQq9D26bhj*;)<=iqt76sVMM)GRLZF{@wMJt$46&H(aR(rmQ$=<OeYx1X+ z!gHgh-YcSveWchuBLa@dTee#&VwZWn)CZ+2a}2;}5PB8=Sfz2p?57zlq@eT`sI%W9 z$y_%vRXZrKu<cOZqIwFs37I<SM#GY|&33XfJkG-4LS&VAr4h@|;V!6X;)0V-sJv*q z?~&?yO|=)v8eVfb{mJiBi_h#~kMOG+*G=-yPo9Hqb93Weg`+`kBgz!8c8p%f!-98s zBXQLiuFD!+Xc99`F07f8t|_%yYTtNY{BeR@Ihayzi}oE|P#pWZsw(b^iWH4wgN_XC zCpeTr@8g()pDx&k0l-@V^tcY|xKjMuauG}f@W0sGv~_a6QSCdEH9Xkd>7NViYHZBl zWP=*X|8N4SApNW<UCYzt`vP?(L^To_hS9-~WBs`MPU#d$regk6Kz)Ru?F4AOZOjIT z453{4F(4*))4`1&;4f3qTMvM1hMoD^_gaxhL<_nStE=@^C=3*?Q85=6mbthuC(D!X z)j#he4KWLloQ2>XzlLg$990Z$u907)hpuj?r}nfDH~r@ktTjITyt}|@mrWO!bPBWc z|1?1n{u<p#6J?|Moh|!Py{xJNV(tS_vb8H!m$UoV4TDbBm&{3YoT{B?Pnhqpt$d7A zOWo?YLBEHLK1(V2$Vx?}lW_5|0(6n_D>LHm(IdAntKp0AIJ<^Jj4tnXO7uM`!E49b zubBEHz4*LlFo6_Jw1h5xsYY}vO&j5PH;YHa%P*u^vQq`di40}DOq9H<Ebr=yRy|QC z!WApsnO^a2GjNy-B<PJay29t7rIWdnfhq2Oi@K3nVCYNgk^P;T<E?A=$U|$#nvu;( ze)j;*jd|758=@D&{YajikF$&Q3Khz21v)?W<=0vA5wV3is1u!&jRo_eAHIvSHgH2# zB5N6RYuBjTh`FbVb;nsKzU%OfAsx(6OO1ikW|bf#rb0dn&f3(q#{^{#yEJysDO7!u zZsSU;{X&XKW@{vr-*G2sDz_us+#ZP27Cb(A^o+kCJUM#DZiE^pCC$Yc4gfswTJ@J0 zVUJa%G=$8HqUT>lV@kR1`})5DDOs9iBMxm-q`vc6ui4O7Y2u-Gv4&NXQ=57dt~I7U zeLBc%45&6sRta;#J_diFbtM_>9wjNdFvfuuh8W@}OhLtI-~d|BHrxSgdoC=rq2RTX z0aM*5Y{J)-)8<lS(w=_phNRogyX$LKYQ5<T0dl0D&@<(oqta3jZ|bQEUiOf^1Wm|8 z{_KSF63QC9d0b$$xVrp~N2pomA=}T!S<++g$V&|*F&n+JQkAKn0qCuKU4!IxOXKvC z$nvby<7I!d>v-sIk2l|FHV2JSavC5BZSGfosKHdlb#wH=!z)d{%4}im)Wydt12Qm= z>2YpvY4v=+n5l*cn-aQ>%;Y`d^ED2{!w2%AY(9ToIaixu{Cv-pPvw7eqb_tr=E*s2 zpJ7A3+C{q{g|w_#e)X<<;=0~&bFJgv5qodlxcKR*OB5Q|<N6OB+dZ<|iXS5z<?<ft zQ_b86VrxF#gBNm44#I{eq<$P>@PF$2nzco`Aq*{+$NUC~O1;i$b=iq>DcvXLo6o2h z|K-DWm|!OcO7K=6F@M&nBkzp*aw1kY<=<90t<X|6*GOOduBl5rx=BpB9?lK<8xvoW z=WXUaUD^1Q2#PxXOTOy6q?o@!CR^xI<-48Y`^H#el62dA&2@D~ZseIuzo*DeLxpSG zS7ra^X}y@Q*%*l(rJjAqRl0GaRj!dI_csMPKheSEoWgF>qFQl=czAn56C2_{(&sVn zq%WUc<=%rPPMB!M>1|P_@~#|IG{Mlx*ZIcXtS;A4^&hf}M90C8ZPG`-Yifh@ku%`_ zp2*F;MtjD}w{Lzh!SwuFd%{6=sHR#Ut(jn<>aJh-ZO@p#p`voa;Z4~d>*Jg6Cg~6O z{#|-%)4xB8yfq$uXXm1}KDCW?6Fc2uI!f*`??C^iI8wgUZf+-sV&F(Bt)|SbS>lHQ zS8sgySw7^{3c%>EE%>TQ4S)CWBbI@Pwy^dH&c=!5ln}k6B@~04F0g^sg22~tN^s?| zCqlKG-J6w1ua)(0apzMzfiu-7m_z@BY(|BahoYWR+anDR?U?+AK5rsH29Vr2OeBAG z2ELwOIadarqsEU0Y=JbD6Szf2EWw>!_n&A4*{G@mJn_%r$R?lt7j+xvOyz$ooZWLI ztE2J1y`Us?^&!R>8goRkK3<%<)+ptO<NkFdS=D216#g$DwbCzX``}Nu+%HRleC<bf z9l2r8!fAfbmAZ@`yl}GATXnKKC11w{l1_c>iy}xU>A(Xx<v1+i?2x?I$ZD{w?^)Ts z_!J%$<5ihK!hgrSLIVs9X~fIkk%oH2t)J~U7Hv_O5@@Q|tPi}ewa3rFu4p2!&h_7^ z(Y>ZhIm80#Bjc3w7Ad=@TG8KUgL8+^!Qs2*)QMe%(}LjIvg@2iNazLv`eC-!^92|G z$tBHJWKGaolu{g5Ky3UPIs%j)0f8ZDT?RR*ieYxsiU!-N^|7P(5BY9_vT>Gw`Az@* z>QeflF4u2mZs5;nEErco7lwTq&!P`#Q%ujrn&~?rG=b;mB7qzVaLNqaS?$pwoPRq& z>d!K{`K_Qtuw&g(NTWc}6_WAHX7O!}0VX-|g+?Xa%*F;bNZaujNnK`ktWxKvG;G4D zowYMO-D_qy$4TEjUT#z#{@KyAZ<3F7%pbV(4s=5GGG0~W^4qlIfDueeF_2Xl8Rn&# zf7$pY;M(%b>#ou8dj~1(fD~inGjR!D3w=tnO0F^|e5<>1hc)hA_^m7FyPMJ4Tc(}W zs8EL!&MgXm>mfW;dQ#l$x@rPFc{$7}|H98qIU7&-&_(^D_oO=)T|?SaP@H}4BD?qP zT?EHw(H#NbH5Sb9Z_SwC9lnX4?5b}T$0WkVfIO+xzBjkD_V;h1HX^ZGUUjQ`{)_w> z>DcA-wzjKhnFqv#7@*)@XLlS;3@U@p>ud%?F9f|6f25FfH>9k!HSoe3%)J#MH!nFR zZ`FIq22Me(nn$?e^B%szL+jP5ml;kuRTzLO+EN+F>3s7{gBl)14{mKUNa5|(*;7Z& zGsorV=Bi`~nt|tK&)2V_jKfUjSo`;8rAM+JS{DT?>?uTJ0_mpW4?){QV=U|jhYhq- z#4GM4RoPFc=+v-fIJw%WJW8o7nDeKyyc#slHJzC(=REab`ggKc`W)RfV$rTA<D=Q1 zsiP~>lixud{8{pyC+LQN)e98=Q0R{}J<8wF61vk(+6th;BpbD0SX^X5A)q!+Jq|+N zG{F9U&2s9R|Kb@h_~d_%qioN2g$4Uq1h_pMU>QaOXEgogvWVd6R#)5I=I?PyuH5<q zXtt0g3+;-~cyXl$$`ZP0yFg|aX0%FeJUd;4*^2tB-lnI5#qS&!55cAs!o8UXV{htH zZceOLh0W|Nhog61^I!B2lT_dAJp;`!m@bJ6V-gY#FKh85eGTmm-A)EiIqN);1|#H8 zJCiE6m@+cdqGk+jgPPe~5Io6jPgTKLE&U4!L;+RM6CyEEVf)Vz2JT~y+Tu1SYWWW= zsm?jQquOE3J44Zkm(7&lOz}Shh3yV?a;2q$ct@})*P?*ij_q2|%VEz>c;r){g&0lB z{H06g>^1*XMsy#@9In6arRj({GL<Cl^-M6;yPT@|u_dl!mQ%-*T_LiHg}9Pc+p$cx zRHULi@-7m)C&;w4Ne}An#Lk`I#saL0yp)}4e*cEHf*YHnKI!k9`tv^Ay6C;=f`JVS zPiBSet9{Ok&TO38we&0%kkWo>Bg%9S%m!z_Y_pCbWssn^{)y^7u5oidFG={G@v+gT z36GA}jjyOe1ns`%<zxuA`hp%<RM7|!fbtq-(E1E?Jp?T;I@e}29ZP(%?#wbx8Rs94 zydv%FRZ6sWn1Zb$|NBNO1*nWC(S9xRC<4hE9x!pU87^k|%orCH^m`3<D#Vw~%rK`z z&8qGlRW?3p=WF}#xepe~0D!!(kgU_LzK9zg=*6OJzuEnrEkh;_d7tUlr>A2PX68Cm z9G?fHWeK-}c&Yl{A2{;@_TB0f7ytm0nvuvAWvKEP2*f@p$0}qL>)fjsso<;XLhir# z&C_Km*VPjr-F<u~zf3X5mwWoJX8H={1x)dx2dDdc9PSq0_P3!A!29FTh(-CJKuSi* z19yS!2wR1Bq=G4Vd0!T0$R5rDtFwicwZD{IRew8hf>5gz8ae{XEt>R5fbT>2u=(Ni zB1DR-H~@TuxR^!fXFm7(<&!MYIochGAFz0I!DL}4{>RoM5Gy@=b)3*9Dp@7Yt=;2V z0KYk%0CZ)a{an?DpV^5aBk=OPV3uKx4}h1PWaFSqOxK_$Au(4jRFDvKbHpTFpHPAB z=S^xV3I$tiF6H(s>-EfUF;OKAbl^}AyDdkl{wTW`1a&edm|@K~p@9(pWitoWLH)A4 z(pX=oHv)jt%GU^xMe3e;wP`q>y<$n?bVX$XhI|P0wD_^j1}L})6{__Ow(NU^i0nuA zy29aH3#W=j6?k+zYMT)-(67@{UB(7_@1m|g(YxFKC#{3AYq3nZAOQWNSm}c-yC~o+ ziSBj>Y+5g0LHZY??!4N_Bz%8=N`{e*wgEghXyO>Q%)O>NhP3~Hr3R>0K_{0<*Z};c z<F_S>bX%JNTCFoQd##~1WYSbq*5Ll<KzH~z%gc5TeGPoQ^Q7`xztx_hQSeg2E1;3@ zzGu%)FleNdB*rQy#oo1@%v89K!4FKDa60&F)R*slL7TiE+PL=_x#y)lotkp4Bf$bS zkzD$H?cUFAOaZmIG-u}T9TX@9rhj_LO;j5Gka-M<-AC7h<=q5ZMK_s{Y;ZjFqWK$i z<1bxWCi(E2dzC_8s&E&RnT}b5^1rJqP~)QsLRq<p$sQuA86#*ltPFDe%lpoUGWz-d zY+weW(2hewy|vTP<IBEbv`Zg?4_YTvttuB2To9q1{<nfg<VVc4zqU}xZQncHp08g< z7s3~<)s5z6)+*(wE{?|g7MN`?a|nTaa<EQIQN!VBlM)iuQ@ij&CD7w5%wrQpqEC9Z z94hB6yz7^IFoAeFoWzy4yNggl%BWkt-1~Mb&lrFlSe34uRFac#2pWC>jE3@oC*Aod z?EU`C@f3~r6D)w<Q7MHH&tE)dFTh{V*&34Iz%Nd6=I=Isn!w)^*6H>jdyHH^g=+RH z+fF$rpp&9w$pk8w(9n2RX}fi6X*)mADDPvwITbZ@%3mi0-CV=PAk;>8T4$Fu?VIYp zBC%a2&`E0#x18)N<FL9S0Ilv?WarYf9oG*cQ+E2LI^CwqGXp#mGpM)pOpWbQR;xTX zjBd4|0S;kvr!TjumbUlF;AbE5fH21Ye6(#IEN+umqh@Vg;2SGh8(?C#j1`ER-zx5b z?;6adXcc>H8@Yonlc()T30Y(ttR2^lbQ;wm=?fuqVB|QW{ofD)%U{v#!}R>q`-PZd zouQHr>M~$N?{~+~K3_aZ+S&S)DR3H0kjQO*Zt7jivKM`KGBy>OD)i9<OC9tcqaDaY zzi0(Vo9oC!xp}+8!Hkq)P9s^vr5m2wms=UhKMqMI2%)iCS#W;;hCBar<C#K5fIGFS zujKEU^mNX26s&NDw)C$uSDK9O|MsHE<Y!lza(RX(JD48>!0{5#YyjxK+DH-R?*zra z5O`~fFkL6dq{PDPtW8c1)l=lpBT~}4wqj*Z7DS@oUC^{i!>I?9MR8Nxp?C4D<K`(7 z@ckpm#ASNP!2FG4*7?lZoIuwF$e-<O&0Q~_9N~C`D@Q1Kb|3~@Q%?BY)KpXbPnxaz zQbm$!_ZnEbZ}fXk)AXT}w-A&*6eogC1hb{HgA8O-C{qfVtLU%}7eHUB-3a>|tta67 zma3ILdUiXl_57U%0g*nTaJL6-WG8W_fB)X+KPt;-s>wZdPU8OIXqnh~`A`IydV@}p zZ?>Ov@k-X<;5%?}rxh^_F#u5RwJQpb+wpN%(j`7)kuawUNX8#i)~ve!WASf*!nP$y zc~9k)v7Lt211+^^0AXF---|0GX~k<h%fcskt(CqHqM5B^RD`PMPX|{H9F9{}-#<HE zkvd}zAKht0dzH$f{G^F}k#dBnQJ1`@JHY<f$2~eA^U2G<l}s*I{%B-P3^v}`9uJ2y ztaSy^oWj&6GM?RLcVY-c8|WoP%XEM0J2dfTThHWc6}PD<-!o*Kv##TuCQPOe%H!;h z`F?tYCKk&X3rtbG-BHTX;#Se1XTtOCF}StoQz(#t3eI<Y9j74kqQ$NzhoUUWcGY+B z3CxfF$>jHoH0bsUYY`2rp);28kx<vx12j`+9NOP@sSbj&US2clN#+Zw*C44?F{lV1 za9G36?P}bO(NvH!LIf^-Ej<2+eEWSi52j1(TvdD_Pjn?hYE7F%(?Sfd)*2yTM(oh! z{w^+E-sYA8GPB6H$b2J60z;0=v2l9a0e%E|;t_)T4~bmBY$V-6b*`4y;!pFzZ|>a5 zhW{eSYNkf=-i2_~YO`tU*pJA<ELrlpci72)CA^89oQ}yeAIQXkwYxj#j^UsU>nxEa zV81^&w(h@KX$RL@x1Zbvonucml=BHv+EpmSx;*w6`~6fav+lc%s4Pj_MVbFH^@$@p zrPJym;}Sx39kzppPa6u=C`|dV#?is_BPSB^^yDOogC(KHS=G-{Td;|&7`y&lWkaz> z9pAVm{LHMqF<QTtJfkBlcFOkpT)Je`?LWg<2@0LfHMDraM-3Z0xcq$YTQ{k|_`2X= zl3u4lV{dgv?)*ky!S>>MB4|n9(vi3hWp?=embanXkU8AbdGdD%)=gtChsRl{ro!Oi zpA3s2x{XpZracvF@@SqO42Ze1C!K1jgzEvjZ&Ilextt2G!1NkE09*g*QhPT}N!Rd& zwfysZLi)#Rc|AnKYZ7@P*R*6>x?5e2(@&rt@JMe2r+bGdIV#rei$0t8dv)`5dC@{P zNpH@2#s}FD{Ro!EV@Ll-yzV{o!Ln<YzZwbJUubzkYf*R1KD3}Ip8lE8OB(f_6WSSY z^1w5(M<kqo!)*Kx_AmZ!@!4$d^IOd3%0}$T7;KNHlffk7-=zYg6o;i@_NzTz)d%E9 zlTcC5|6Zk2A6}Nf734c%_Q}}hM!z|x%B|<2UFCNgwRyQ}G8+l)xck0_0FCuAlysLg zb@@AW&-6aR^(CFZW>k=4f#(_WCW5UV`GZrRVN^jVpl1(>NuXfaP>T@ee`EfF!?&Kn z@Zdh6+~!e|TTGX5Y*^V6r6+dIm>YP%fo0%ZYK`r_3DhX@_{7E2B!<CHf8@!-ovjwT z-+B<gOqA9`kj?^)hDlJr10$jfJBZr()Pe}2u8!{)>UH|LLaX5G8l{?-3WNYru0j5! zlfK~8+G(web`4lc9J<c`M8jyGhNfb+jCm=I7`UGwN&OP~S?Q?-I*lID0aD`T2?X5z zk@$2rK^d&5!EUAB3;!;B^)&olj%JC6rAJH`J=Id!J+3qv#B@uoVr1^gP|h4z(*b`o zYLccy!=BZmFMZ6_*zfiRd@U>68<8r~M`pMYl<-GDEaal*&8vOV#Hh9T2_VoLiuN@h zUF2ERq+6BNvHZF?dTuLbIAYOX*MnP{c#*oY@QSM+pKpsy@sdk>%j4fuwPSf)zLke; zz*N(GINJMQ{9GT#_1H*fkb7rzrA@o{=C0#o-Q6{hws3sb82?NdXsoR?JvfM3-cQ~= zErSU{3U_vIi}J7M3cK^VDKdv=;R<!GO-UsT!C&;bT+o=96YW)*ZTx+R64B%q7d&)` z4Ke-k&kC_M^gfbxf&h5yM6)8D_$ND-Xkt6ocd(6Dc~ZMK@$TISUF@*z>D*m2LM%Eu zr}Pfz)_c&tQqDW~ZO=1$IcwNFbK@+Khf9eJWcc(~HNv0t?LL5Y?Skv_`JT&zo-Ed% zIx-#4A87vLQ2UK5FyCJ>oy++)lQk{}I=kJ+EOvBzGtBVT``?VY=h}(y%gvQ6g4`=F zge2e5MW59g-_6OlDz7h5`ogh>9N+VlT94+M^e#xu=ozw0mcHRJWUCFTEkz9)VQS<5 zSY4v`?7=xotdfq$a)iE-vEcq;V|3rTE;{9<h*6qYu2Pq->ZRo;uFm9_qH;opAtuy# zf0^=^R$nVxDx6h0@jhT+n4$Dv`5g8$@{8CgC)|43A0z72^om57hbcwue_jAT`h=z` z-dJ0+8bySrjEsdpgPm<rIj5DFWX-huw`fcqoe=FbGQj8rnk?Zo&cyZDvq1Zhl_vSE z)t0MYg-#_AsTIZ{o7(*N(K=ty(y$YTBND+?2WMc&c35e}d7_s5;?a@4ds-XDeS}a% z5K7AF-CuhDjiy|@yg(johUbe_IvN_m7Nn)*e;!HJ=w;He_j;37%icr6ckhpVufq5- z!07%j-;&n}quzRj&ihKo*75Np<N~=Xi4brpxhnPyMy3@T7FH|r)AYWK%qr8^^yLp4 z#cLT-tB=*;bhTTtU5u$IgSLsRPgW~Qo_q`09j2~iL|9>*^91%B-1I&v=PWR!7rW%S zOxF5kbM_&>=2tDoR}MR$j<21K7==gO7N_htHQmL<-s*R2)1Nx4oocE{fNC4Fm4ZX8 z6$`BVcoRPC){7pw_sU?j$+&z8pTs|#{ZRTqbnO7BJzM*wRAvw>|B{C@ZP%hkkuXs_ z%v!U6FpTECD;<5PYM(&o`i0#R5Vv$jAoCC7-PpxH`iE4^To@m42cK%jtrQ{<lH|%w zkk$JAEbAE3!Cw}n;bGQ#=gzJS*}R(b!xeAnwLjK}i(%s&<7zd0Dfl5H!x&el>TA|Y zCjJ1sJV4~uaWY2oVq5)+w2@09Ry^TrR)Cg^5r*mN`E17!&ihvk43xOYgI6+|`Jedm zZ>J3BeRu<ZlFza*EN(}42D~31PcW@fjOu+5W=+EKJ@z6#Gd$<}P0xX6Xrsp9)Np$M zu)UoMZwM*|d=n4}Z%hr$RwAW-+rO=!rD7PTQfV=5Se}R|X30|8!zr};u=F`BEJQd7 z%#2D1CnuIz!gW;9!d^G_b0y3}4Xnq63)U<Qhn<B8xQKDtu7f!dv8~qoC?8<*(@S8Z z8!2K)pHZ<D8yZqs*fs57lX}BMR$LAFkX!Ep32akq83=q$KUB9k9*=*A@Qr?0En8Vg z{@ww7e~#|5GMb&QlgBU#U#=}N?^?;N7@6jUhc(GKSn_1m>WNj^c#GVAc+%|PiS@Hy z$c_W_dnxK|GYYuo>s0(>s@3{MqJ8_|ugu5eepWTVKvEWl?5ySgGMn$&`s=?R>w;b8 zXBuwmtp2aCuMBJQeZzh>M(1b{0Vg0Kog&Q;6-Ee*kP?uPMnKxpW0d?5q*DRuPLYyS zN>V^TLK>t~cpv<~$MJrA_hp}U@4osv&+FPAa0<^Ig~2{>-?O#j;a-As30FW9Gz<go zBa+O{Ie<+6QG;~{-Hc9CwbUmH#b-<Un|&7|1*Q~i4tOht-tv5!NThOSC?#lG{p3eA z5TE?;)O!C`mih1jwdeo+1h<HUA|6o<WACuzUP6j3scBS=Hw_b8Ku?vygkCnCG`{<N zBV~Q^<(i}Y#?jm?j%z!3^(NqX@TjV(u<>1O<rxwww&YECn;pUX8ec~c6P}5o?c`}N z@OzDJgcU#SuDkY4r5^`w9YPee?44p<VYtMt=qK>>ofh1q9*?y9bo=T@rj_f|zPgNf zk@!+mHY+8k#d2^sIib9h2I#)=)6@D-4<qbvon)w{+G6?Yc!k2*q%+NH`4#YAvgc?M zdkQ!b3N^KScCEcdO&9m@<KG7pow|(Dg@m17R6=o^e69IfO4BgrH<czQMAlQRRk^+I zAV2$U!uwh7*De@a{qfIG^phbg(%j4qq6eBz3V%TfgHObLf$J+U$YHTE2rIp-)|i6; z@>W7w>0du4N;T6$9L^}vzR>0UpvPcv4o?>J)e7R5k8W<Sk->E#!aL^VO|TKBXX> zHyUaJjOUy19vn6`7%c3>sh`<p$X?_N(obv9k^ZVvp#)rZkyeJ&e4F^7CRt|IaoC>Q zR?j2JcTZ42o4CD=1j?o+0$Y#<dsT3W4@0jRYpU&#r#}1Z*O?BChMVxP<C@MbDz?0I zPa`EH33<i;_yVGT?+ru1WSNsAV*Y1py|<AX9%mCGvNi|(v!{cZ)`QLLRD7o?DCcVd zgH%kt;p(6tgV5z|QPopkPP5@oHQnCb9T@j3SK`~z9a#3~Y-!wKR-o9m+n)$)|LqT6 zRJYny`!4$9P<&Fzu}cvj0znB^c=;mj_QE9|XZ5=iMoP8MiIEbQBHza@$@t_TB;MB< zjJzXE_Vh63NuvO%*lOTzt03gwQ0AhnY+nr5=g887P?`2mgE-F5S%o&I5<sWy_o)<1 zP4=9UOkQ(?ij&U^%rzFaUaME~KL*gUtU=s52dvkJdaH9Z9b}^Kp86I94CJE3$b_Br zzNOwam@i*IB6aVA)rke70XIiZvvE^tnY;D=WYOYz>+7f#)7(lC;*7B<)NERLRcxEX zH<R!=RkiTdVK?=;qH9y^Z7sZQ)Fv^qdTiIo#I4kEbx=i{QhT*rqC=Np^_ib+BDN=z zMV3u#x=NH?MMti2v*_*tY|<6u>_-(R&ow;!MFvueS6&Ald9X*wSr6h&i-)fpCRBZV z#v@vsiAb|vfieZk7&Z6C^p^@t_<fUEn4@*q7Mh;zomD_S{VvbfP?mHC!}#PWre0@- zIKt4T5k8e@Hg6whSi=hwlp7)1H;tUa4a|OiiZE556U5X`sC7O5-&+_(w&U+q?4;+p zyBx6w&W8H&Gm2w>MKMgD<tU40dajSRtoON1`;1F5b&CzmEIp|~PTL?}I&`6_BZVFE zqEoO~oKo}oQdYakPN*j`v8EZ?$>uk!na|v+?CIc1PHE(95dTnDA9g4RSf9z@mfIZ8 z1UKQx>Y9B{45cXX6!kyLygfK5rkNLs)jZPd8{=H5oLVf%u~5K>lLcWv`FjUKvc{_{ zVXdNUB%Y{-Kv}fs6A!kk8_Y)*^vfl6+0Tr;sA7w9dXJlp4!9u3M<j@;{~oI$ZiI;= zQ@g=zhM*+%?Ei#^xM})1hKayQ`<tlYmTO8#Z7l_FdCViKxOdAryHXgQ496_h+D0g* zaA33rxQK41_bsrLNsr~sjmnWJdBjl|9CJ#<0J4_$!KXuhU7%`c)*dyl@0tkMzODbG zh+KLWgikS__G?*!*WL4Tz-e#sQT@WmE9BDFM*h6H^B{CtJQnrhbi6w(qba^<o95J3 zrt5B>+G|I*ck_S|u-Og%>aDI1XEQEBfS6j>qjb@8;g8QMiGoL9d%m_OAE^MWdnecx z-woy)Hsw=`iFG0{#NLsehTO&)L7~jfhu^xMAK0ka`!h&^%6L5QK3pfIHU07}Hnj)j zI#;(8((C|WoT6v`Fe(rmhDftJ&n5}@#$o#sdTrHnvJshSkF*Xz*Q>&xM4goOTM@)B zbd2>~YXc}*#`D1!Q%_A+0KqzKGRqJ7Q+NgZZalg>Hk1Ugg0Q|0wEv#{F9+N-enPo1 z=>J7$0A@{nvBfDZrT0@OBi6RS60rK7Z*<t}3&>Ig`M^WM<vSA|7oh2O^U;vWIJz5V z#wYBEy+CtS`&XrMyQ1*4^`GeV2=G{a@Yr*|SmjCZk}_XiHA1~kl#`)%7{92Q+M~JS zeOhr{SHwM#%`X7vF?QBYg{CIE)L-C7`Cpy{>ia1&D%tWdDl2B^%#3m_+f+#rVgz$( z^fBb|nW=&R{hXQZHeNX?pM+ff7#%!LlZ-j|9q?ywL<fpjXZuo=;V?3mlnuG`$iHIJ zllLU0dvLz!eT~OZ?#OiHWTYh14G6>J;a4^@d3*Xy5&i^am)PHL=pyH`hcYpdtf>@2 zW$#v=o+rWJ-r5`^M|ZPUgd<#8m_(om#OowbEgxFPW;6Khlmk5GBn`F@H0sZZkV`6x zC7-BTIh@V-c7ya&>9-%tLV6HKOUEX4si-=OM^5MkWim^PA2rc6rw?~53S4~0k9}`* z1WO7NAodP84ZleywV(XDP5`kXlImQEz75eNe@$Qej|>!hYAaI+gYJ^zC&sF?x|Sgy z8tLiP=r3?G-u*lN2a5J}RZaw-IDL^7>!PfC&}7Al-3w+lx`#q>{nqZ$Rw5h8pd3ds z`Z_ea9+$C?qS%}Wm5@uf|LY}NvgqBxuCvL^eB&WV1AQj>x;MFnLZ+thI($97hauUa zB#7!XbuxW_zeb7yH6z$My!j*5(>)0g=&|pFpEick1pT~ulkCHZTXb~ORLm|ZH-#nh z(`tlF`K2`&V>CX=GagP-@|>@rqmwVcUHx3psJRsmEqL~QF&wlGQjVtg{iUr6&1<|r z@Ii?uE<xgat~T|eKihFM@Zs7e{uN%}<;4(MIm)Ja_5pnVsn&`R06*G3)?v>MYY=0I zzLMIUWO$@GD4q8tBrP=+?{vaPa|~Jv2!%#CEGOxu-Qq(pfx@FE@7)J`J(CS*%qA&M z*B$=QTbf_$-@&Qir?I56c$kglQySx$92APKSON}rjMmG%z(H3|aw>u*l+#NFy_=JN zsc)zOrO$U}3o#0xpQrvBxIFtJ9Az0b$T!>-yg6~6SU4X(pVM6{L)({k^$iRf#1A3L z5OXuGU;O`qBfGG)mKN4><Rxl}9=Mk<#)Zh??^UHyRX&htsn$1<S$tO;<~B9~cx5#E zrFu%jjtwi2Y64SI;jU3JCJdQ&o&UAqMYSl^1V%WVi`~VEGUCBe7mSZQ%}HiEu2W=- z=_KJH6!>fEluJ~)T87$ge*tPR&+V{xu&EV#VtZ}|xm-)FEp@2q)Cy2=@4-{{(>1?a zo4YH&WZBD&$MpNuYP|SovB83;I0xR?V4!abS<T{4#=g9FqJ#(pFTr(|Kh?eNU4YVK zFVQ<U@=QCfzhRnIsMuhS8s2;(;3Vm^sXk9;A^#{$dYYbhN%83H7EP#Mm)=&nWrXi3 zK~L?q>!ZcIQ|o_=aDOHVQ1xJJCNB$l@4^`jf>(?Gxqj$)SQ%vLd938V6d%2O(zT*4 zr<Mdf#V&0MOt(84h6*3r6pp>3F|BeTfYJM2{jt#L%*XGNFR``Ie(k@&=;-vD{O_v@ zi{0RthY^HhVvT?-(;F%sCRUF__g<@UQDRV<DNNY4>E9I_IVc`b?+g|%SqH49VS8F= z_toz+%Nwfq18(*5f@fY@z~R#><(oGLiy}$AXrm_E!sg|CJ$BSQ{rAq%CKi+}1j7uG zjyB!YW_7s{w7T>W^AG=I^brlJ`si~^d$Ro#Ye6Li+q0sSeBj4@xx8!Lb@%IE`XUr^ zNsxrG!C<e-)7?8<$%!Uws?3lmitu9U$VI}RhCR{?8Pzwy>%*#ET%Hr5;(2%XutqdB z&-aq$`=miaB&U38B-eJ?C~iV`R|lVZlOk7|srf%i<AB%Uv(x-!0Sw{TE><&rPQ>2d z8NAXDZWPF;pMGjIi%E)JHbu`#-0}$zOePETTg5YVGIp}Qz!O>~tqpX>u4mkp9LL|c z&pbFZP>rI2<ln@71kcVAg0K|hg885WC1|nJ5Ud=LFdKzOt=vjP@P`W52j)X3Z=tHw z__DfLGhHvpeBZR5yzo%<A<t#pI?*E+Z0^X%$%2Y)gNAo<=2Wy_d#h6Y{X_lxiS?Rv znMW?7cOrQvASX~hjU6uDl_S-~ShPpYha`g29#&5=@5cpv9;pn>xgeHWQa*yL_Zb7K zz$7K+#Mv^RA3r3t(n4i+!ZIBUPxM_^0*qOua@6u)*x!0yISLPR6&gO;Jt4B=M;_3~ zqRNshp6~|;5@PD44S~UcEF;dEKMM}E>{wj!Bl3?LRCyKBm?-y+y$kX9N3UfQgHvX# zK+^*ou}nb_YNC^{UA9?DNF=P)WgyU!6~eyyLxSXT0w+ETAE<uWMCvn${7PkLp-Qtw z@~KxU%-{STw64lrY67*s=@;$&mNNA63y$kEchKv$gvth<ZDwghT_tFGPU`@0R2etN zB;c&&bjrLl+eU?P;quSFiDD^f6;{vXegX4gHok}Y5=f`^3FsVw8s;px)9+b#FVTIR zxO4DHU(^O?V%Ldp{Un<h-#RjwAk^)~pM}^CGopLrKgcYi&MFbxHANXp1GW0cH$k6y zLh!~WAv~3BoYYFOfbWnYPq7+ujeCe%!(v}g4KJ0D$bOx^t+Z(E_~P+H`wjLYjhz&p zBoYp$FFox#J>95@i}&NB92b|m-b~V3bc9NMD<6l+<@HWQx`$*L`l{u786_CW>hBPe zbcF-o%$ZeMWHyP-HA7hm#i<H(4TitGP`J;&2W1y*>wF9d;_N<AfBQx5{kg_j_x1Ds zG@jG>d9sO4cWhOY!cmyHV8JH-s;R^t8;s2RoUDEMyQ>ax09#u#?B;&pj6!Jh<842i z-E3=21)6r5<rlP1BN`0cOgZAu@J86L`)GJ`q~6Cla`Jf?V0vlre6;VL4YWRy?hdos z6B~T4L4xumL#hM{d?y;0^i{`e<T-uVD_EFK>3m^|A6>?TVF`*RO>&;A)0+sq2`x5g z4_rVg%u&Y$c*KRX*X?EwFky;X-$!4SJwiOm#<63zAnJ8-Wf&-;_5Rh~)g>Wn()-~+ ztkri-;fM-2>rf<ZyYt`>J%yAkD*$S|^*RiE-r23Wm)%5}W)G!)n$dt8zZko-Lu{iX zSh<e0>=ydTqaIlBo=ghzO3u=&OiSXho(^S9HqV=<Z6R^@K|f#>#yh*O&}2TcOd9AW zn@jc>civ(0@kY{@$?^@FaGpQ>T#8SVH#DA;AaAVXgB=)lmS4(pT@$d9nf*qDJnaHi z<ej<@do8*s_L$V;LyO>$ya;hljuC5Zzu<03RmC&a_)M)fHb7U1{Qr`1@aFL9YT7SD z`~E|tmRpmX9fqz5#2&W?>X**=Q|29j*?p4+VwFswtxX~F70z;hYNwWJ$Sie+lR<5! za3~Zw@#KdOQ@LK_NS{nCn`xyYxm|7;+rHa<y`QPod3k|smRtx#8N4mCP+I58g8FH1 zLB378$@Gbxc(hGhY6Q}9>qflDn)}DA9>2Rx9vGj3#L?h31h%!aROpX(K>#i8u_q5A z=ht;HfjcHX>q#zsk=k8GcRraAKLB+R=hHwUS#x5DTFiuD*%?O}#{PR&@W14<`zl~_ z$rCt3)%QL?@B5uc3Y)fj6#9o8Ji~1D$&}Mn@L{2U;CHInoNElfQxFtCvbgaJYq1ol zMEtoU#*Bv&hxfS!tf`TfE|(B`Sksf0#Iv1hi(OGbHiGUp0>C``!`i^`wT}pkwN)db z+g1U_eLf|_g%5ntsUYzX<m?-zAeH+0Nw%aYanA6Y7Q&ZfcZlW_4<5P2{-)9uc-D+v zbqupG%bRa&ylz9M{_EY^0z0<3jV;|Co6WN?@awB2$PSzBJI2Nlzp6>U#d{1I6W&YF z(<)q9*(q?ymO^>V%Ap{x_5e9G!&08JyGZN9Jo1P2n&8FO^1dzlJPa})H(OaVSpN_O zy!RCo<PGm-hQo*Hi#>j}dPhC8g1LB@tV;Rf4!JRS$wb3%C^IJTyYjEO)r5{g4^;YH z0r@p$UF!WmQ&YX3>~6fqvLr$2UFSP>W;;Kb-U#viLR~jQIVFRZ=-NrJ`a!k-Mt7$g zS%&)#61Z>{fwp<>-A~_KURZP}uWmuhRBGf<QZjv&L~{Fzmfb@=#5Q%jA!awCaQg#a z-!kEig*-YgK2@={VuO+GTIpD24>t8tqxY2*rd=hapq5kHlSg*|nXTZWg;2EPVg{%n z$HyU*WZDtO+CAURt$%AKeOX1V1stIYT%|A!$ppjb62cixw1=Q0e?HsI^;Iv^z;i>n zoQPbE0_ia@8E&Ul@sEP6eFW&$+jMLUDs#76FiV2;!-3N^taEwtfOEh@PlN8R3uEUb z5g5oy-(mr;7&|IQv^*IL-S&$s-+PxQN^KXsv{&X#5nN$(jx%g;@RDG3G?~V?!OlCv zy++=$bKzKFdEeA2AKE>67@-+fxh7w=j(l6@oVH9KHGLh7yn4`P;WU#oO)lZu_T=$* zZdKMd?>d>oG0a>_2WIyer9@_uop>e))D6ea!X(7Sr|%u_Tdd~mRTMoum0>A<1A;g5 zUA8iU@|#Wk38RxLQ9e$hDxF=|If?lUm>zxkfjtvSwd;Og(r@*G80?J-V6lTK_jERK z7l%SFA-1lADkQp%3UoU8|9y4^44L1yktQKsk<$0g2E-*;@8T~$a@h?g0^F!%MP`1C zKRH?%93NK%UO8SYZsmaV0PZ7c)(Oxgl+bgs%)i`6NXJyy2y(jFnwMZIf}F%rrZm=> zj2%0o(+aA&+0oAf<X~pO3wR{ze81UThJzoQX{awog6KsEw-EE1<)ajl0>cP<OXf>< zA1kSmBaU3|s(pi3FDeQ%IywA=Owk7k9Xn+7Zki<JVRX3`|4IY7+Czde=pQyVGN!@0 zYa*gE;&Hehn>-qmn+zL%5F{FOv*agP&I#A^#82zeZjALOikF9Z%u-R2tk3;=sXh(R z`f0D|_bt3SIw;m@vjfb|vljlP9CByOf4#-w^G^mPb>Zml`UJW=ydNUc(pqV;m%iy| zj#BZT(-osK3o}Mr_VZq{1G6WbnI@Rspl2zB52Qyf7`+-yMN(3Db)!X-L)gLy8*_{U z?4{x_qp`kX7`kE>I=pKd57|NA_x^Q8ESIMCszdDH9z~sHv}&lx7A06WIE53YNvXON z7KbMs08P@RlK;-1=SZ->ru6vmdO$k5Wj!WFoH_EQQ|^K%cRiz8z#oS;_t=z~4AXw@ z$FU&NAdb@nD)$pFnI?vMYqwYs3j8$ta(KV-mOY%a|0?3sQ+)aFaNXh^G0QW(#wVW~ zoygn7COWkdQvWr(U;K}sM*$PmE5-%8ArsSuFRnqA=0kh?n1nkif2sy=e8Y78LL5Vl z7w26h4iOz${ho2^)(U}w)5Bj#0Rf1<Rd3Ov`TV8J<V8?*-aQHdMfBZWPQ43S1sD4! zd}2xJy<w^ciD4pY`fulU!VvN6LC1CR7s()Sha{Ah*Tqm?Q}xK()C1LmPdb&@#5`V2 z^QLv<XcAiAKRjT~Q&8El;gw&?A#|+D1emuUn-R1{04J{Ad#s&XznI1{mpkM?*!erO zq-Xiuz_5>Gy%NwEcutnRq*>bXjNpHWRctR3yODusK16uCXMeNtL>--GYk@B+`Wia# z%B8519#g1cO(LfIOZ`lr>X-(YwP0R?<3Uf+QmL1XVC7^~jTq>#npehzB*B{P2hND< zYz2Z{xj5QryD0w!0i5)(`gkd4cN*r_*qzF(8<z_4OVhiP(z?b%FU4D-Ips8u!1~d& z9;t`ohK2{ebuPrJh&T?4kTK(2^8B@(#*0I2=UKUbi@<p;i$+^l+S7RgzI^(^RQhe1 z0(~IBcazvJSvV>K`h8+ZOZK-UEkXZBgp?B9JJIFce?XEs0W#7owwh!HD^JhA!Fyr= zf~urKhcnG$>0uZvF8LdPQKQ`#sM|=~`Q6U=u9LFEJr8T2v?#Sj&1h7_y8@j|PhiuZ zj_eafi|wWn`E+|!mbgHyM!Ait*Eao<KX9|f4Gg@iX*j)oI&t<nKWC1h<y>)j<xw~H z#m@VIfeA(xyQgf^&UePzXp&%#2Vu_`RYUH-`_#w%pc^EN9ryyM+;J|>9g|b<yb27i zc{^n86L5^h#Sm%6!z=&C=P7wxY<0!1u$}Xc&2j`+qIqDjQ!%Xkdq=<Dw?a)hBG;yd z^v;mUr+2Kw8Z+wy@8P`3LEi7H)`OJ~<kQgfIkU`@e4+pz1#z8hk*pjyN1>-LZw=o2 z@Q<c^-eyaG^Amk58J7}}5t_6glwKkzj2o`75#K5)eR<!jY(~dG9ZaD$LL_yQ1ycB} za;(nl+qIS%l=BwobZpo1MGC4JWIG&z-$LYO9|tG+r*Hf;=;H3v)RXvor%5i(6`vG_ z6@~LYbH*}uhl6N@?0r%fk>T)(E5;a_MbPOt{S`9DdD~oB(jXVd782FA!4c1Dj>ugp zOr@Q@bIcMjlZM4UkpI(XMWA~qV<v_^oc46I<Od7uV)peE0+X!XZZn~0jw<IZ$31!r z_LR*spCn}TZ`A=V$wUdWZ|F%)R2Q<peGgCW>iJReBOFhJ?FK8bSP7$h=`s&^8PToa zJH8wQA?k7$zq#Gr`qH%u`jThb4gY~rXUXxOW78n6D-&3vij}N+g4fj#$aNLcoDQBD zR(X<Pb?IL3={;-pu-9|_2pviKR939lBV*^-FO1vcDx!Z1Xbkp0zChEqV1g($w20l+ z4~YM4x#*wSkXgD{{~PH2y;nc4_*80K*W+{ccXGT?I3@8dXXx2FJ3*CBlZdmh0kZ|6 zUmVlFEY$Vpwp+|c+t7(QZe5l{5HMd8O+Dacl&=Z3Fsb9V&a~ar&ET)o+?NMAzob?1 zo9;_9hQ2~dk6aCztZ?neZ>fz9z049yCPBSvDOd}TotYhw?CVmvj26Gb>k&{7l9-Ss z>yTle9G>duwnY@wlO{v|1+cIfPrL?R(oT3SZs9?6Cs)NfGJr|!zJBoBkE|S1gYwBZ z9A5qEui-tgxe2ZOxIY#b3|J)-MT4smny@?JP2W|K^{c|xy34`pffBEKvLho|#o|`{ zx<{LsVAoL1HmV`Um?&$GP$&JTLrFb2P2B6fP&^5=;9a1@cT*z@?vEEyGkwlHOTVVU zPqAER6FF}L1gnSO0{%iT=jl0^`&{gcDy+HDqWDu69yfi<(tn7hKN^Ci9}A{|GVaq{ z)2Z-iuzHTRl-Mpv1Mg0=8f;c<`akncHoVnzqV`TJ5(;^$IXwB4a{lc@eVpdH5E~49 zl)%*WGXj=RvBeG*kTjc#JKLD~$N0a6>3D;Ru^CK#)w1o}xLlEWIVXmwF~C}geCo^F zKFm4RB(olt_k)~?`%L3wFk-{IDpl9jzMjvYFMbkpO%aOyR<iGyn9?bZ2R644Ph&Qu zCGn)*>VZ7vGat0Etla3&+9>T4_fKz8f`l%`bST!GLP=~^+{YnCFEv_ySk?Iq!eCw~ zW+CqAD4<EsHHTyypUMhx;6##6-lkMfAw-esNdkZ*i%oS_W&}9452gDvO-!6vkj6HU z=VZaSGmq8>FL5+6qZi3vV7wVW&iY?uSM2jKaEy*6fEcr;X#agC;6nw3G(FJ_saoUE z{S0&2U|~LOP|243kuZ7xE$Rvz$+~#^ElPfggd%7`8xWw$CYDfDZ-@~->3az^-l2cb zHQK2Xi`tC_`!C+_9PA$NZlcl%%;n4K^w{Nx3^s3p#8uTE5?Q^xf&V?`mRZrd`d?C$ zZ^5%8lEzj#`x6}0lp%ym7NO@T1ts;cuvWTNf0u)H7foNvMaI{9$p_Q`+eAuAmg57@ zxW@?#nWDUWq`^kw8Czl~o5n&viq?o?pGRg|)MVLjSBrAG=ma=ENPEs5k(j%fXHj{1 z?BPZ?zIoZ-gTvu;Hqf$rcsAI`e2EKv&1vyiTqGo|yAR|6t&4SrzbYjs`;ny9zA%#h zNjksj5gk1NBiTa%HqfMYD_c=xJ(>3|f+gVe^f?Qs(3N2Yf^r@o<oV!yDM0;+b{~!F z_O{OBJ1-_=Dhqw>_~MfoWf-y80$W7-+H0Z%Q~7E=I-BJUW@ZBq5IY_(D`N0p&|1W) zPm>!TWM!w!%zl;z=Xwt1=G)}+ZumaQB#uiY<*h>f1{|q!I538`86@Tf)dOuGj=vnX zv~ay%CBS`kZy{&j2~H$1?)aqAeC0_B&VeKDy5YZ6GFh{{ot`czO356-^VMjM=+y^7 z();7vygqW6x+I)4xzd4vYmMA!f}F&40(fW}RO-z3i~y-D!XwGId#g*x^<Nax=@sNI zdf!i}Hw=8~H#8FqZUd~uJ^GuN0In&N*dS;4l#`DLnee0OKvsirp1GvtZv`EZzn-oJ zL@2)Zq}?6}fCxL2+8CKxuvGJO%7~gx>nuJre<FOvdV5|2-6@=NhRV|r`?66NdH%BE zWDFyd8}p3ec*o5&`r45{wgg`Xkgj`M;QXttzKdOOlz-9s;O7nZvb^x6({VX;2DV3^ zl|i|T)T36mkGsHjF^Zg&T@qS93=W@Y6P$Tm$S@>%ixozsMv#lUlMJ8L(EPPYM2?Rk zAipZ=aQBL0bg~Webf#r!xo8V{TgXH=001m#PZ`Bw=(`n@A%3~nTR{icb8c*x<wEU3 zat-37RMV(QM^3js2@K)AP#H{<iAQR?$y!JKs^TI~nw>8%sMPT|TwPt8QLk>_tTZ4m zszRNu?lY&w^;cBDXDAWe8cE1;!=t?qk`hpW`?vH^%an)fXF8H=j(S*%*!rk}Tp?e+ zi+S($sbSR(L(p9YeN0sb1<87xew7}$UepVr-aks_EPEj0I1$o#^iddNiCi`%@~Zk| zOvD0c;^vp$So*WiB*-Oeu79sxvhI=x=8d@&kvq9bg<JwQRR5F5QKPQ4Lfkcj<Z?57 zqiCbCj`t57@^%aqs@;RkUe`UlzU#tV;t)2tql>fTcmEXt9B-7q>^S}SH=NgsRrit& z!^@@n#2AQFsc3bzQq<F2pNk3!`_P_5sy91wJEvb~v4bq|UjmE)S1Odz{tMbfa=(Lr zv)ZaG?hlO}`GVFfaA<yyBP7>hBO<`ld<^n+x3k^Y!CGn%N(hlDK%w%Nw%U{>1cLks z6heqmNdf@r7x&-c($X0=EMiZ>>T7vh>J^bs7mh@O$w}Gpy=);!ld9Irv$yTL-`~~h zYX5OB`839w@hVL8VYqKC-vefnkqt+>1WVvz);C;;MWf1gf6=~UcN@~5f9`Kl!h1=e z%z$rxcfnJ1DPlz5-kxHzo~TlPWDPy^H-v}+??4M^63x!>QNyTE$>f#FP!HspT5*Wc z2L&IQ@r%yzDTt3`p$5+IzL|5pH174akKsG6EWAN4lL47em@pd;`*}(Bb$ulMZ6IgP z$r~FD?J$Ae&F2OcNPI$YbWV`?hlr(%U3MBABQDnAx#5nx(+qz1S`#NKxH9^RI=XSz z5)yvsZweQc2LI{WMzfdnjovUiQ06I+Q8Ja?sAFVwqJZc9%68Aso((hSc!AfH{Y<d_ zceWM_$-EYRp6~~49&8qQsSL&ZuKAY}zB$_59G0)LvKwy0C%u>%^6lSBJFIa<=NvkW z#QRLGhLq<25i;*PfGE=%1*zDeIp=n{10&4(B=7lIiFS_c`ABR<@ntnvTmc0|j~`q% z=UXPn4xx)4Soaca1i$!-qiU1}{NR3--|TBl>GYA6Ya3oLiYm&{ag71O_Le7|!_Nb@ zeo*UUe1o6utKG<~JfOY4uSZl9<Q}FuS%P(}tdKEZMdYKrPfch;SC>h2&~6r#c)ZE4 zbOcijA07it-2&eM{==A30Q$q+dWQi<%F>0b-c_FknW5R$pJv7^1gj7#yC4fft}49^ z;61Dn#;ZvX-PZD$t16>ns6JXVC;BC@2!;G6(&|O}`B4x$aMOoHwN-hsGBXtkoN8lD z@fAzn{_rRH=|Z{i96x}qPj8N!@2LZtcE^G2ebWH>G3qHBZ}$WBn~dBK!3kbsJfLuF zOL2$_5H&7sdHq85r%{V~`_~rqP5;VY9U)@h<+QpcGD?o3#p4|eYbN*n{xaVvI@7(^ zws-F8kRlDP#~rHqZiR(4r?rvD!A&fnc}6d29RNmJL-}4;AI|t+Xi8-6C`d(il1ZTo zAH?&fd}(E26AUAR8pM!0N62y(YU+FTZ~lhz!r|I>3-mvc|9gpX92Ms^o74?)Sd1!q zuqoIBKL}foSnU>kAc=Se*{viB@9raboI+K>Ol$fNko@~x?)T{-p^|oSd)SlP3gq+K zcnOryB#Jf)Ep=7mnP9CfeOQ^|ZWwT-ZGJC{FRP2Bo9J%pTf;rxqDSC4m;dh^l@Cca zM}vJDWiI_|rMK=E<lbi{@YG6JLl70^_$<mBaVl`aAbRSvCoL$r_sTS;aEcVm`$Z(H z7ALJ`ND4qr^51;oHDwr<ME+@nERMB7O=DpMv-1*O|5v>K@0%FO728$ox6Ii1w9V@W O7d=wZK$a?*2mK!i7Z;)c diff --git a/superset-frontend/src/assets/images/google-biquery.png b/superset-frontend/src/assets/images/google-biquery.png index da6960ac9b32ffbf147578c05f46367037520277..fbc852386659549f0e6a76fc74bacdc50808d55e 100644 GIT binary patch literal 15539 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 Tkp%tyS@A1rWvL1Y<KX`WPAF(f literal 16418 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 diff --git a/superset-frontend/src/assets/images/greenplum.png b/superset-frontend/src/assets/images/greenplum.png index 70f82ea18ce617c1828dd3e29169a5b22efbb59d..16e89f47f6ea24d14a73260fc938f1a8951d02da 100644 GIT binary patch literal 18956 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 literal 17811 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 diff --git a/superset-frontend/src/assets/images/hologres.png b/superset-frontend/src/assets/images/hologres.png index 612b41d04ee5f182cf14f384dc4a8797bda8f270..60400df3c901fb25ac27536f5868339c54fd6cbd 100644 GIT binary patch literal 4529 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 EAH18QEdT%j literal 23843 zcmcG#WpG?UkS5q-2Fqfym@Q^zW@c<LGgFH!X0(`@!9ojcF*B3J%xFp1o|)U-xVS&F zx7Qv0x~d*jR%O+T{PN3;R92KiLBvM{001a5(&DNB0K^aQF99AB+@hwn`xE>JZ7HH4 z0su6`BmFgj0oO^)q*WCF03Rv<ASe_7cmX#B9RUFD%mBcNF#y1u0RZ4QWp}9XgHOPk z%1Ma>KK_04yUUWnEeKB1I<DY<>Hqjij@Sx<3!ZKg+HR^Qo+M5#juzH-<|J<3PUa-s zrq=cV#D7OblK=RyGb6Hbv$L}EumhRd!QcPo^FP~JIsRue3p0?N1;}j%<l(kpW;SJI zW;f^IW@hH$;YKt!vj9Je%N(&(Z6FRT0_Fd!2-Z$+W&p&0$Nv(6gc-4S@vj8{pqncr zE~4(Wdfx3FM0u#O`Nm)7uw_`<X}Q%B!@f#6mSnyn+3(dBwrtnyF^&((f{W4r2!nw^ z*pJbO-Y-?Zk}ga#NMUUH2W9Psu`Y>WWK}Xr>Qp+*ph=0zJ@+#Hv8Kbl({YL@*5der zM`--WW23{p>O@n(z4fsxCG>YNU@?#z7%LP4Gnp%OeaSU|I5P~%pp4uL&sHDQVhp1l zL`84)RU4@Wa#3@p5UW1TE~o}#84#5gg<UDMfM49gF>S%}tx(t&{WpoOJ(hi|?k0Zo z1AG*x?f@>XXjNFS38p=AO#XtTFZ}Q6NTLLaBuJ9Px7zty+s;TR4@9Nc?5*#QAHM`U z(XDfiiMVOGjmbzzKYU;xI>Yr@XJPcje;)2iTsSQ`uLnR%AMmxaLf^opGRAc29)`&; z+|-_r>ndW3uC#3Sl0=!He(mc;hlOR~jxvQ0k((wKXZcpZf{bkDg#548H;t=Hj;r7A z@#0A+CdbY_THuU%&Vv?tjBa6@JTY68nf|6vEf4s9d9UwykTf}Xn+u;qpny)0r>*a~ zu!}AWl|ZS4p2OUGQ$uR<aCrhs6xJO1eSfEyqKrN+e{nJ#CVz!@BEnje{GKXIRwt$u zIJxR0C7^(A`4wljG*tDtvVz0Y26AqW_k{saA2fQ$L)|;MxCd0-02zYPnB;h@FHl?I zc(|h;euSqxIaP$GSvk#zr<;1=g%5EwLWaosd(ld!nL1^Yk1=<pkdMI>!7nnVnCo#E zJsdk2cl6U&xJSxIkit_MTYH~J$dJKvI-o#QQ!Z0R9TT&vlTB6^mn}~Ud}e?wxVs}5 zkuJ8(lA+Yu(+fGa0YJ<&vEw%pWijR`k9fyd2aQ(yfZ+R(4L1fgqw_n*lOzxT7SJS? zvm8wfMJ}MqHpw!*S%YHxL;#X^WN{O#SyJ&HV<!?Uyd+aM0NTrXaMqlCx~irCQyU%< zu|xW{c=$NlK$5qV%FhL~{xw(<7!e_vT6-tlwyNrZK*bx8ZVTj*O1B15hNqhVd4@Di zt#~AtoZMg}m#lzzQcI>l9SlW4P_QtD5{TwRt-3l^kt}D-tp~!5pEKPm=N7ik4O@m1 zrzE}=K6LiRQT=%Xa=6eo6=<e-aroJDXQZ>`+;-W6dh=z7|1#@+r@&ZHct(yzFM4<f z%M*V`y+cUl)NJl#e3GjPCf!`7(0ptx83U6w;xp9`V;D-261=A2S(y6J5Y1sZU5NAy zj{y;G?H}ndBpoB!4lBk`a#VPnKj6i77!cr+76A+I)U<W)VVzNQ%G1p$5ODeAzTRGS z9$K8{jliZ%I6$)~jrCxn2ChL3C4Idciqw*sAIH#=tsTmcrkS6>;F5`P!U_-DCwXdi zf+CWn$&Q<3IFge(5E4}%JUQ>=Qz458cCfOh5YT5_xAlW^hWcvx-0N=4>x?t-hI8$` zo;p5+vG?!rxB~PoHVaRE3n<~rPpSWSp^4R8%7S<4KB*L0X7t@!cc=-4rhj_G*{8>< zQUQ;_zD)R-Mp`6+8cKmKHmpki0x9vUEU8|KtPd=XY~jroy(_LVDwQ^;H6<QWy?kZ5 z-_eP8@2C%3zPgAsU864pEuIf;;R!17dY>3y;!jv%R7~}{$O0C|jUaOZmY&=(F5~BR z?MBTpE|-;dZ6DN|bbQ;PF7GYeV4sNUml^CSgBIM-#vU1~y<Dk=`)IGb==B#$yH2$^ zHEW_V2N1rH0lhyWa+8Zm0;HeJ8AT?4g{7AICjrrf3Cb4PhgF}=IIVyvt*zgKS}94N zE@&#x(P6n^8qr4&mdq`A%#-nrQet#6)$Wrhj^gfU>b{z$sNbZ_#*tnsb!1RhP^i_D zAOQoIr}?%rV>Go=59PmK0893E6W_QyjHdX5E+S$9StiFk`p(2@dC}&FF2B9Cof$Rl zb}NyXxfgY6_(as-JXt~+a6*)KE9(9fOx+OV{T|3$=&_uZRya81>TsZ7pBO?PfdPdA z#|l~rPx&&-=WzV3f&H&_13Ft_bRSDCIkLcH3-?P8`v&)Olg%EB07rjuEByXcgp7Vj zU_4w%WwS=3wr`#o=q48~k84-6%H!~B1oW9dq3;(*;%I0#Q#VRY{U8k-r-d+WZ&FQz zZCj=m^Fz+o?rjZ>GAWvcidE}b?@6o0fwD?g*9ZPFy6a!(UQf4PSFX!1Iz+1>`g@6D z_r?M0C)z(%5Yb?eLIfpzZ;J?@aQVC;eYt&YhdeA!$KP2NXBz6f9+b85ENC24RU;?} zm&2esua>p=)&R`Rd$vrC8tGOWl=|K*i$>w@TE<>@Svq%rXi0KTX)5W`6?tsxe4i;K z=M^KAC!KkD@i~jq<etel=qgl|HVYyIEz$gR<NdHB9!o~KM>7K7F^jY^zKJ-6XXb7v zKOT+vPM2%#Kk?dmK`a>+x@);^nDam4BgZY}l~-nsT2Oh^g8r(*h3UsJm*MA%Q*uw# zKI%hR5H_yPktj>)|2S9Vf1>5Tv*!1sN4=D}iA-Y0mA~ReH_P}UDS@7SKOYRkAzHZF z2K6db3n%En)289_8;1MQCdajgv#WQq8=HQLI$HfIf^Iz%>9e-m_XzJF(ukee;pDsq zqM3H)c;9@OW0W;G`i1AwP|tl~9|J?t{6zHxYv1^)z5>Ha2#~a7Ni+wjRi7C}X+w+y z5+E%@#i(xG4x#eD%-c?cB>#2;Ne9_oKwA=-Du9U8?eEZwfBTdlxC(%NwiY{~}| zC4J6>Y?>NK6e3nkS1y&kWT&H&z!siWAFA?)L|ZSc3&hnE>?>;<c7g5`^vEI?5R#`E zDg5l9RDvbL;tQ(-BH^|#PAHf|b{QEbrI>@I%23OnQL8C6w$7$OBHRpl6}ouz=g$<- z_eSO18b&gTi#D7@(Snd~xo)94uqn3lTBP%qO*$)^xL2gbm-GHLsdBy*?kg12DFpiZ zW#HEgg{#A$dWv5BFHzD|8h{k*fF<?kWYgT*0R&J!7p;-H1_!<QtPDjbd~THFZ+-MU zemP<D%D-hQ#~%-ZBWoXRTMtXHHdeGu9T49ge}!$0BN>trP^1dXWqRz<$~5M=6jYNT z8J3jEQ{;Bwc)oqT_zTGUA&|GoPJ#H0S=5<L)<#Mb>!htY(!5{Gf}8jo74$5|s!w<O zd(OyJn=R+NR)r+{QgBJZvB#dy`kTqdtqA}Zcdw+b4~y$MYRTl@eBn?|T_;~{C;VSm z4@=TZe?0$8e#G)^m7VL|cpnp6rWLaa+4`hHFO8`sKE)7vQv24<ecnL<k8Xl=%fMge zV0+nI$)>uX0wF*kno7&y8@=No7T2Fyt-=LGU7e~uJVrF$9!<Ac={~l{KUJ4~=a;`H zBjWuHPsr+eB0SG3o0UgMxSQAs%(B;C6HyALYipjyJFhc6&5Y4;{E>|Au=Q`LVydf` z<oQ1ynyJZB6jIM>R-lcSKiC~!>3^OFUN`UsDX#Jo?vcPNGG=Ah!wJT{3da3>m(h3r zT<iP2_8qlVYOZq;7hTs~8nUu{`#O{(uSt0l*J3~sZkjzRZ<hV?Ie+VAsOy8AMu3Yb z(dvTIl}HI4x^E;TbRA&qgXsAoaPjVoiu&h-Yp3IKDYXt}O`a@MYQBmk!~Ef?mzdwO zAX^~3(nij5{S{vDL+bDB$8?Wn<$=33&CjHa1B(*Nmuy&(`X}iUR^bIJYg3H24@dud z0sTfuuAU9YClx*SPpWA@DrKtIkf(TbJ9gXkQd(3yjA^4$1g{YM4%(a_;WnD^=^n*A zJ{!y1H>j2^bnt0{<&z1n*dhXCW^OY=swqPdE!%#1n|g>e8rrWLpnq?#{SjF#J_-zq zfqwPgqBd3`v#n3u4-LEzT>bh%q_o9^z)D})STT=UX%iz4-)>Zy81T2-5JUq1GE4h; zJV!tw2#dmi3U1rs(O>@Y9g3?5z3yYlZ${5pBKMwT$@9zDnn1&@{J{LD&71EpzmcAB zglfw!s<NazDf%*fqbe`RQhmhBti_leeY&AV>ba%g_SHEQ$+DdaLJysc1bigcE@nTT z1pl7=emXIN$k)ouH5-J^>r_@G>L2=G3%K^{zBF>VWD|JQu25_~NrY3M8Ii2<`ll2S z#gTh0w*<XRrB(?i;M@y3@ZJCE{`Bsu4Bv&_Qo4TaUa<6<Ht(P&@Eh7&6sp~nT*q4U zq%)u!JNI}FAG*)fG(4F%{czQ8h!!G#qi@THqxQ|A>wW{*C=hv|;WgGQCbj4F?Fmim z+2~DOiV{cS&n^l4q^kDB%4^Hxj#lkF&bw8b#L6*j-dbc?Ai?Tk3qqB_)|F?sV&Ije z-Il0meY0*<!k}><2|PBLOQiIi)9!G<+y2^H{8mh)e?>OS)Fdp$Jv&L~koUVw$-6~` z$sVTQL*7%B)@qtkv4UDfUv`;NRW2PTJjht2Z!pMO>2tIHx&IRrQ{RJcrqsd@a)pJI z((4+*igjU}P_sj*r+b2{ccbY$ab2QeHCQccFE-CmG-BvJ(Qt}bZ-;zK;$MN?pY$AI z02vw^+gZu8#qSo1eLtTppOlyu|FpFSQ)DU(`TQ+_?w^}CP!Ry%2ohgV4=+*gTuz3& z;&T*sDau3{30E#v#4h<$x7GLauZjX8q;amTzlHp&&O{+zD-azT2`h^xC}qEoN9L5> z8UE)7k=KpweU{EKKgVb`caY~#&Ait)#TJ!D8p{QNgXYfuG-QzRP9pv*jk}DessV=( zh5rrB`;o7+m7}idLg2TesgpLNeLcYt2epPn8hp->R1t6=QIlr~7)NX;^tb#8onQKV z0~o%_gO0LzqqYLNiQlqxa!;=0zet1E2wsrJ))&v?$;TanJQ2#2L7~?G0q2O365I$P z=)M)X4F|4|NB<AHboiaypLLz@iiQWWH#Tv(B=Df7SUWnprKhLGx|<4L6gbb_HzB5U zyty+2(Gh045E5>^PXJzsB+28+pDcbm@o!gxO_OKK6KMos@hs6|+uiaz4yV(U@Etyc z7S5LMn>$RDU`3ob`zs$*K(te?MgB^y^{1r8^(FMHc`zbQX=W8$6!fP_zk15#&nb`3 zJ4PJ9((A~X{WalOv~ZgLaRd6xnRU)$YG(?5KJ5z7jg-<c&5>0<;4=VG(j%)>qR$(A z;tS?cjv+RWiR(xe3fEs;X*iN-c13VI8yRr;jpjBqZaR9)M!P3*$*-+1^hW*?tgpVz zvR2B8Z}blR?M$oypIb*Wzx&M1Ht-C12Om)!3(xF6{-ttF&o3dkD!PQxoASK<rvO64 zisp3`uQ^BKjeXe_d&nP8seZSP66BlU4dOz$(2UCTYSML6Mw(zp^M^iQwCD2C8rBUq zlq*sm{5p+JmK32dx!84goO%2(c_BD*n64rSoDY0r;$ar&sWOSb*DO?U1YZYR$@UO_ zm2#|DGx^;3r9Zw4j<8&-l^-QkRdD^RqwU!8XOR2%K9IGZMzR}~FFSaf>=adsIA)=X zhGx^~`pwnd!hPu1^D~xZh0O@NQ6x;d*8cw4lfx9i22et{Vc(u9s`%FpbRmGQtP_(+ zy8~b74WawskiYG6Vs2b^Lkz2=GWBv=_3h8kU8R6w&Fm0WiVaF_?GzDo2Gndyz%*$x z1lQl7O>Z>D03L)QBw>M1o?5Kb?u99{YtT;n6HlIxJEeJZz4dr75fKu2;5QBl-=bpe z>bJZn^nfcSyAi}*XlaUVjawvBNde^(*%fv+xS=b9pOZ!b=u967wrxcLH1MF`16Mz~ zkA=3kgobg}p-GNOtE^qCXL`Hzo^CK>nmD<7J~=)cbl(Q_+`UfTCBlfH^BZX+Ut@j5 z{Jdi}{BTr3Hc3M$zgQZwC&kcrCk=RFdO~`<`t4|D3y3`)wFr=6f)mJoAc4=NZsI7* z-L?%s8|S#jStIvb_=x_f$8z*em((&twI<`GA`d<kv~wOveM)@X?seRC{TVU!LHZ!T z_UCP$ko)yx+*jXncP26v7A%33esf$<f;-3Fxaj4o<HIQN-pzf-&d_~S-foh{GkI)a z{6u8TC3f%3!jI?l>u{rOqQHo$cTf8_Q##H@h6Id)(KXL$emF@1NAN=2<|$&YKtYH! zK5o?ErKUy_CPOS>$7Aw}{CQI5eg0T)mACwu`%M``djE)K)$96k_odBcE$3-A@0R}Z z8j3HW*dVP$KlgnL`jcb_ePs;T3}k^;hTJxWh)ju2HHQr<Reuh--tT(1_c<1Na5b`` zOQG81<drS7(#}322=$v3r7d~JH(-V|72)PI47qHV+<GJMxRi2U^L2WB<#49aNsuj2 zE`XL#({%}z0c$yO24S~PPFsZ+QMGUz8ln}}d7t2_@ym<`*W9YSD}AX~eu<k$@I`3r z3(xkH4$XHuo%3cHnO+60%@}&egFBV=TanFc!S%<Po8cyyZE;fW9M<3bpGDBK(J2fH z8Dgs#x9Nse9eR6%3|@4*j=t=KIsUq`()b0XeqfL}w0npCyNB^2@;;y4gRI#4GWw(h zs&o;(&cCVFpKWYpw@=UM@YU<_)&Ikx-+IIe^*bv(=un<mKpRgF)F2Q;@6cG)^O@<d z2XdWs>yA89BDC^dz*KzM(_!fMdwgC8uO$}^+P{Rqy8h}pKeyf32lfs*&Ix?!@BZ@J z%t&C)k`EpfhB!Cfr-5@)`Q7{8bGuNhFtLynP-5L%ZEJF$X90s6^oJqQ&(L7PcTr_h zKjnVSX;aQ?Guru<=}#}}`s=67M-%=h8KPwvoh_L!x14ci3hGrQ<Jy~)B8h^CAT{yF z*p>GCgC8cA>+uza%F>W<2%!j@?SWMwQB<a(lDhtX25sFyW%TK$P?IdZGx9SZ3nlmc zoRHgjIz;a>e$QRRb>kP<UVBf|G3xq#HLt6=3~v1|&Mp%Q2^<Xjxk9jj%%iivuoblW zhk9a^A=~N+mlF;g<EB!*G;kSY?!uIbrcz?JS*)yD=t+PsS68&y>%w%`+qUf+tv}f~ z!7v@&hjVikhvVbPMLy+wgSPe8_<{F7**ygw%mx4I`2W!q^s9<HQ?Nu+6k8O8&=k^3 z!pfO+*|}%hhkd!m%LQ*9q47i)+70_*VchMTS>y{tG|>?*!OR=X3VnSH6j9O<8VLQ? zPdJ-F6Lq~3Tuy%$+U+mwv|iX<PQp~t@eAZ3pm#8AtER+t`V_dfK?F~{@b%!qp5k0h zA71~mUw&pLl4g5XZgE!hk`30ewq9hH2~Xqxy6+N1vy2Q<i$H9wd}1r=99RAHL$1DX zf8Q-hx-Lc-ho+>`#uKYzuR~x|Vaat)&i&n;_rqMjm8H%mR2Ci7z=!Z>WsP6K-bXR| z)ZiY$0XeT3Xe>ve)31Q}yV5s;({Lbm>1ba_Mp)|csDbaSp>BJoZrQBuc*TBX5EIGU znjthPF6EiYe|7nJV%Agpp5|2VD;9L$b%H`3YdmGJN(GlrMSq4G-Q1j}a?)q2y(AkD z4SVZ6XAj`82lLQy;<k3^WTKqTl6N${O~-hV`DmW7O^We3#Tj4UQOSU5u3~J_JatEg zPPaGdErL!fbu3<1%7jpVG}@?0&QJn7$;mh(w<||!D`LoTVD51@6OQLAmh~heCNOKY zf0jX*87f<c{@-#aCP84$ut^;s%d|`%soTfoW-jMQzsas@zqYaep-ND9FpE<0o>lQH zLVg#(eX_XgRO-^7UHPD|o;;9Wrb49@t*lE<0HxXES^Go0m4e=^DIgmcfL*a%j_$hU zk%Vg$P4584OovJ-Qg0QnXOW#Pe;@>1g<7{9JBbsO%JBV@eH9DBWMTVcLW;M`;f%OG z^9}sb_N84i2yRI?-oVlh4AV4}wlztUORxF;S86sayGjJrjq_F0?fuvB=+1mLc61|o z;6m@vq|R_z8THUUEsmJSMYPjoG;e@E&&WBN^DFk*k1uPNZA54$OPUv3pYd`@xOIwW z76|dd6RhpZqG>R^@V&u@ZBak``u>Qq(E*wFOpFtE?$m5G=3d*TS24uho0nnq;55@e zHqP5^C@`RNk!E$-iIP))<^Fw7<jhaIlen)oqW$#K*$eC{dD;7NNb;0ub(BDZzhG{7 zX!|x*_eD!TOLc6nZ)%TI=@~Mz%d@w3J0AVyK&67Vcd(|z?kEyV>j5rbAQ|<^k2d9Q zTk5|CQ;}?H#BMJ$y%-K%ys7x=uD7sAG5TLPtIA}tktR;0zbV3eq1zy(wftZ~wQ~zl zNX0I<IFtKrqnMP!SLLCj@kx*EP<dmr*jDmy1S)l$GwFl+2wp^HN-g7exywarV0dSm z8kvT=^B}Jsis><rc2C;a<j_s5wufL^%|N4TgX!nNC66!Z)k^_PyTIcWvXlysZ|-<n z$r68W8Oa)jf2iXyYptgE4vs%*<gj0Ef=EI-5lawG`JkjRQ0~vli;*>)<)TJ)Y|c$9 z0QJlOI->goxUtW#eG@isvuEhZ)wUyNWGCvFvk7ug#>c)@MGAUT_Jb}foVSO<!`2H0 z(zv?)C8z8?#D8pgdLYbBf4GqkE}0(dGHiUC;gDusJ*^n9$T13VJfJz2@FU295v2_( zj|w}1L0PsA#~fFqQ9p<uadnx}2SJOKQEFKJ&`UhAzZFdfu>JU+DR!qW1`E173$0wS zC-tuxAw-pH@W4)5Uso2UjJ>cPRl`Lr0CEyS_}Fx3J;YMz8)_&v%{+hc?pN2YM83<W zqcX`w<JSXS<c=bK)#w%(Em|56+QGs#C@5GUGzf0M!q<zR*(WrJZ@?lnsA|w4)T>)W zPd!y2ETKJjRe9B}gc~e=*7@!!nWIqd6El@D;O^YC9M<?!@>MD@ERJt+q&`A+Qcs;y zZ32RR-GB<RmK6o1bY^FSJ9%!u8o5FdM-&bvh;L%gA%B|@{}>XftUO#|q`wQ3)YUaa zCJ7-fse&Sb624s(j|re9({CU%VnW3<LF3){J3$Cu6C=|DDplfpTpz=+b#O2QO1!fb zUV8QXbcW<$J1`8Tws-hPc$y0kMpAQi*(J7mHwg<@SGP>0@fR0+?HKE@*eZ}lye>*+ zmd>z+iA}?2wP-1><OwRi>2h+{xB;m|g{}&+h&RvTD#P2;Bq7=X2Cux4({#9lqacIM z4MMrX8*xIQLNcmP2Y*FFxg^FdN)gm<*wHL027u5^(`j8_=O4-ZEbrh&mnqpwg8(If z<`=}%1<1#M8n8ie@tTK|v~!AtO*b}92_d(NFYgW=FthvGmsDaEZ(|iBW(MBU+vRBS zdcMfyf9S$(&P%K3@Tj5#HC$*)YGd5*f=A}K$b7enzBgpKk>EVeH)?B?YHJjxe_;@& ztZvaA6_%#tTZmim=IaiNEzA7Pn8Ie$0syFv+?888YYJfD(A+y7p2<#nJwgM7_xY%u zA*36vf~oLzp~!TQgJ7Z|u<fzJw6$5jX%a|8bAH1HiZSR~q3D7+v>@FOO=N51pc;`@ zSQTV1+htvQ<mP2v&;vSbnv*enjY%`y3UObr(+s|(uXGKmZdG!6PU2L~AHd8H>`uC9 z0tq*b31>zgAd$Y6L&80;BKC+*c)~uDr*8e^L#Kb`N@BU<#|mK~19P-Qb<#KDj=ui< z?7=3bAZR3X*&1tY_<SrfRROl@piHZJh<a{>whL#f7oTd6q%XZgtBGb8K<any^xvMM zBjZh9q3}iVphc!5u6RSh4iohMte}sAtyaNMWw0fDM;Zz?u=3GJ!I%NsAHDz?L~<ks zZ;lQv@<o*9zi|t;Y+v4%2iPftO%4gDDs3#Tl=!CD1GWikit&<o0}nIjcG{)7QY;Jj zs&u>HM9|rXo0?1pfBj~hPAyf8PXKoaQF+W*^;6#3W0(DvkAM9FjMOX|VH-KW&aodw zcxtg3`rQ2bqym<FQnP~^n+lNhn~CU6K#}lQ`;xISLMVHYxi~FYVCd^@MgQ$XogOHF zofl!<U+b=ikG`uYwr<CN$QK<B88Yr{kosNk`Pg&im&gkr19c}v9K&xEp<1mEB*qQp zK&u1!!=YSzB4a~RRWT9tar#CYBDDdMAUKch&mSml?+~b$P$Z!D<Z_{7&?h^T?T)r> zETNEFBV={C;2tCJ#4$5D_YyYh_S$^4{gwr|@I!C=TN-#B=;VW8gPSNrGbc;+d2TVA zV$z$`!LPG6kRT$hgeh5Cm2RX^PNY*NEVG~z+^ZNxLOFCzQq|YC?YYa@jX*R!g$vfA z&Pt5i(R(VL4n#Rw1dU8bROFqPww>@Vb1+=<{pl_T#aZ|UpA<dOp>Lz&G}4Eb)W_bY zn;!Os25JH;%Pyy6X@bI(Eoh+u%9lZ(#}`Dxir69O#3?&xCHiTN-%`Dv<98^9%6H6z zK4FS*0~PV0bqq1UE2fV>pFCOthi@eTEf6E`*?;pbkcFcpyyei;#3@q1z%hx2a*Uvw zOAa!>7?@bOaInwy?C!X~u+{fKlWW#W4F*Wfe=6!=AnZCn8$Hu+TpONwX9J_yM-g~| z?CHW7j8i9YZU`j_K#p$dTF-|mg8uaP6k{<tr-ini-;Q(pT+YTv@_FCDOE%MuVKir} zm+11h*1PHyzq0MddfsTElnC<-pXiDofiT-2wV#S#P8pPt<8NWMB5i+4rFV0#WCT4% z8Gx61wr2C6fX(N?>z2pk>opp{#sNv+I;(wJwfh`p%2ax=i2ehw;Tu)g)mlB!p8PRq zZa-r`-E;kK0BWb|MfsdCn;SPgHva}!BbTES;h}(_9MWF0*OMj~53Jt@oO>M=pB>6z zjdpz>)C@*43a{GwHntgrqBZF+zR<rCvHD6#ITA0gg3h1~T~B|Xjjse0t8D5rGq~T- z?e`2ExOm0A_~33`FD!bU<19&@`?0%+WZq~EX4)kg*8V+--Y9--E2yAk!c`?NU-7(5 zwl{0!HMbG>0Eo`OopoVG7oX@d7KwK{UkA;M_3*>^tn%zrcFFlxaD-q8oMYcx-kpJ- z+GixzC81n##VlnDbMZx~h$G1#mGfOXNMK`q%rHXEs78S)yk*6JI6m9{#0Mq++U{DX z)-#0+rcX5A7I@2Ue6NsWR16@KZOowmo!HiJD`NN7*t$6yA#^#lZcC!?K!W6xxkT@R zGBvUb)J*|i0Af_@MQOgTP*&PBDlTuMGyZ_U`H6_rP59m6Dmcwuw^IYIOn)u%?&=7> zP^y>}9-AiiM9gy<9~;QZeyT1h0EzxNqW)gaYnRjR4THE_1I|OPo_#sYEger8GKe5S z(hSN&^?nD4SOU$KR$IvId3ffj15b(n#u$5N+RGW(<k&Ma`9WpiB#>SWnLzyMm?9h> zw$HT4RjU&y{xy#gmkP~vZNu-cBLB6yT{jBf#gzMcu`(jFs$y0bbd~o{muvFa_LBpk zVun}JS6L2Nr9$;asM7><Ee(sxTg-7@2(6?ZpQfA-Qv)xkslbZK?(juT4FJBO2Regn z^Ch03dphyYoVAPo&z>erTzhj<)<_exd1`&M!#-0DbC}uEMW6$^Cp(J@ih6->v0ArX zr}fuit6m&jhOrM;zbHeDNmaSNP4Afq`sd~L;3#d4mG#t8U+(tgWDNkaE3k&xu`Drt z9=|dO1t>-;=aNaAE?8vWirW3aKQs)9)iV2CI{3Otw3YqV7}Aj>A>uT6bTM;9D6}R- zx1a%Jdwij-;2&Ds81t=mKYQcuB3NsCiu?L7j?M4-1<c?05=$JHO}_A9G2j+d$4(q5 zyR}NyKd4rB%iA*TcZ~fjwqrsKu<7>7kY!Y%oP;4!+&%j_6dRLH4~S*ySPb)*a&N(m zvvk+S@4XggKFE*p$=z@mmB_?9BeC;QdT8-Zt?N}}=}?&)cnHR9=ry>~=dKjy=rzAV zoNaOVBD*cUGeBd<D3j%wR@G+k9_f5RNPx`Mc1B&)kL18HS%A^?hR|~8uZ(7HhE`0d zSZ-O%&MxcmtGUeJpkklDWhhue+n^n=O|zVuuL~C-O-(6@7K&d@C>b<LDVvwh`kP-F zj9sDF10hY+9hO8Bq>7Q}j|leE<_<N#vVdRNoo%K=T=jvS#?pB9RFqUM2<WOWlo8vL zcai?J;2Al?b0}95aOr$-gFsK3qfpYMltE#dJ3+ErkkIxP)HKYGHtciP%04!OWF8xy zfYChCf0=j=vuuf~6y#NE5#)xwFJH%d_#<!brcqUFf=|+ENd&+@M>(Cby~r=g)VPg` z74ngfnl{UVCfc0nR(fhuT5D2D^UY&;;4c-3cY6H1{2I!hle^n)Lnz!aL*u0=JaAO| zx7v|{`lj2j@$+0+3JiHl<e78Xp#dvNj_k^<e$o_1?&#ued}=N0m<J62&TEe8iZ9Sy z@SEIH>gq8wnh1b_M<CT_@li_4T?97+DXrE>c}1cYo6~OaZeWRHjn!#YWe?7(3`Mj} z%s{}jr1659^EON9rW%!h0*bHxk#_56&THO5(^|bJ!Gq(#<`6Sa#b}cJMAw{WLi<$P z!lKNEi+nQ~pFN!k%r^A48>BHrDk!sS<(J+29Pb?86`}MeS%{S0yJ<|?&o@_8>E&cY z&VYPoSwkEO9+BXRpH6k-Q^#f36XE(;058=CzdUtLi#A!#!GJJXM)9n8uEtMhBRIf; z*=9^#OcC?4iiK}{vl3%u87Jv;6FVMGXsBm<eFogkL~yO?ubx=1d3^;$-1Sg!9;P43 zygtxDN$pzpOkv_O2PW>~B5BGZrR(SvGBEN^nB^Cxtm!X2&>2XuOfs(X6ZYNXAvic$ zkKGBOv(SCgyt16Rb|BSl)zrBBIW9Hf`)M{(gd=40Z0esGC)Nw3W&*do7L@tR^l4uh z7!IPcad}5FE)MgON4B$jgDqJa(BK|lX1YC|0H~LZV!lpJ@u&`m1p>TXauJWq!2%w4 zIx^mN4S>QU#?{m1bQBzIQTOkAufu={#J*&gMHoLfzzwiG?KnS4OPmBNplmoJqq{c@ zH%Fd<qCh=L@W9d{b>#R0HObY6l{4^lv`B<{k>@9fJYeag<!2yu#1Kbw%D^8&;-M?n zW+~=o%n&oHcw;MMu|I@_Gt;WAupHc@4;aYEn$F`G43l>v&{Gge8N8s#kPPmiNU;q5 zZ{)B3yXf&3e`cV#JJ6&aPp1VH&ju2~l`m3{J6DE;n`4m!WE4f#9*)@^d^+9yzFXZl zlgB;MMS!a6o$(ZQ`uLw^C>fBY8*rKn%$jW(hoMQ+kqFx6UE_6YSGeFYh(C1kjlb_} zXFj<)kOm%%OHqGc-h&YEcXW>#Dpa&V$Zuh0{uewJlP^&CzzjFU%v|_D0vo<UywD53 zR)mZDtM?mh1UECN?-Mw_%ozUsQ#0%Wv4t%zlo&4VU@vpj1EE6tp-N+UrJi7SsSHo# zF+xgmR+g|grdk9GPw+8<yn@q7eJM4E`+RAf=}CTRoXZV76`Ji0I(5A93Akjk>*P}~ zGLXG|`8mQ1_;JQ`%>8pB<h&i@E%Y^Fg4<Q~Qj%}TH6Z>_>Zn1nLjWgE*0c}7JpTad zXLg#B*{*UobZW41{T`mT=gKOwYK#y{@08psIWBJh0m1d3FILrFk{YVL^CBBB)au8~ z1MK?BnF7C5jVmyMI(-YQQz$8{5HF@N^=ahFLuH@Y$7oaHZfNwUQ%b2StQCk#f{ta% zf6c3;l$4^m+F%Gq9?LwrEd@0=e76n%v~+g8z`s)+PA!L2HO~tWrNLpOHC>A#MJGXg zoHfn?NN9MkO6=cDC&?DFnKw|OneEb`I^-E~-3I48eb19=|DhWXDCQ}kN#<ENVh0Cu z?6u>Tuv9BpL(+0hcTPqROe}Nf$)4Ba*C0&Wf6=K+>Sh1ZJbQc@^%hBW42-KnQY5(j zorf5QgQo%jAla1OlBEnno>9DLREW&YsFZxtkfT;wQ;%x<uFd(iknNo86A#vzCYqnC zQfX$0o2x4niDgMrxlgyK9rPspbT?4fR09tchD(lGZg{4%LpM=FzJ{$sq}@{lQFTw& zP<yphE}tumI~}7m2RT(gC{&q|{b)t)0Yg(-Mx57vM*wA@T(j0+7^}L>l?$_7G?_*P zf13^>C=5#(0W;P*`mj%eEF~QB4x|x;l!n$N&w2>bN&EwUpy5jg0{V;Y4bIbJJ!3-B zD03UTl(A5MBVyG_q^C&|ErrB4Z%CejR`RfX!R8KPMKgy8TFrXQ9vx=8+oAACK~Y4y z4*9CCj(Ig3lmGd`5X-e5-Cwe{2!B?kJ&&fl(Jrc%E^$^3!E*G_%HrWnUPRqLUv0u@ zwh`DudCS`}=cz^qYN(_^PT14L`|XC8Y%Vn$RScrclsxvPYfT04j<MFH$q!Vw=2XZe zU*||>6;9S*dN-p?XRPr=TDc76ATh*$A_;YYD4Ioy)y#c1(&8~wELkCyMQkBBM$e4U zP)8{}?b_?2HLp`=I#<$CJK~4xhAOXm;LU>!IwKK-#S;)>PP(m~93aQ3&KR$5CE8(} z(y%tX6yCIJ3Jz>x)=SA*UE<g6JpuD|g6Vw-=p)%M@>6=XEATvZi`6W(rEIy~iG~{F zw@0Olndt0e*Swusk3zA-Svg--#N_#$#U=&)q$-OXvV}PJ><>PdFCDXZ+-w8s9&_Cp zs2x3ex9`wJ+n2c?h`j!0hI*GI4GGp}Vg!zQ{N-MVeOp9J)prU#CHe<_|C?y{jtrI@ zP9y|<G#@95R8M3Y43Ljt%BJqXbTdC0xEuys8PL5G0w)4*KK;G1gL4-V0rUd}wD~LS z6Ex9o0Q~<Zfc}4A?mH0woG%#1eFMt@=K@D^EPpADK8^&&<eAdOD$-<lx_HoFv~D2= zc|ife>~}@-uR<;n!wTQ=uY^H{2hH}skLJNci?#xf2L;?8F->hWi4{7RIP+(SJ3F;- z^Z)GF41|mc&78st558pOTRs2;C`?vH2m2HRRF2Hh+5f-v{a?-pV(A%Va(Lc<k7SNU z0+)Whq2KjxOx-d5rzSEYq1og%J)gEkg3w2eIVmU-p%dOwKuy`;8kH(o2)9rFx4Xlb z%0vOS5Bb04(fA(<$rXRhCpiMUPVPj1XKsd&WJrNU>NfT+eI$WD_yl&GFsZBmhZz4Z z39YP+{UHh>aR|w$jzSgvkLB}!!oTuAr1}5Ni{tZejftX<lmF9s{kQ*`@bORzS)3qd z`VfFHcu|C?;?f*JLZCGugTRxF&1$@A0-f*yp7Zbj=KOAYh~x;oMKU6H3*kWyySe}S zdto~H=-+k%i;|0J=>rEcCI;(rTog7101%q%#DKp2kN(}P08YK4VA;S*aO5^HAaD+Y z7FmZCaop{P2cbF(LH~z;%cX!6YC2n?HGp=1f6BU6=Rscw)`S?Ari91Ci?r9U1==9u zvq178{q+C?`w?I`j%qQPGr_x^XiFTGg7(|<eT?HLmMum!1lZ4qer-PH&w)d(7#;Bf zBWWEU+1|4jHCz0_kmWWlgMta_wUkFM`7szNxvsaDBbXEiOF8I-LKel3)8hTbg02%5 zJPGSTZfJ5X(=?7{r&DY(B)AAO3n{JP7?~_pXaXN~u8L8U4f9`QT6yxrVHiCGe1Q`F z9VBwpqut~#ldFSMdMqN$C7)N9Bk*o@sM>K7EIQdCpv_7PpJn0q`$NTPvBG?NL~NfE zyca=?kL$C(&r>Ii69+o90E^HVR*yB)Y&2b&3_iJ{f$S0}24PSxY96ZR0<7Mg7&W5$ zWxaENc%2f4jQc!#!lzJqLr5nmn5@odn%RL!z)@)zQK2;5p|vBhJm8ZLD|O9kKqF@+ z=883RHVL+qy2;FE(RPvoISCP_iAML|K)ggZa>654P6Q?iM`^K_Z)yPX<ZZ?*{_kc6 zZD*P6ZghXNV4I6UbjrdEa%mujFBT%4qCpmJ7ME)pJ^{?Q09U#2T!j0dPUg0ZD?x5> zB3#(V<ch-+$fC!T3D7DBp$M2ZZL0vfKnYfQb0?f5ag~)U44@<eRm6=_Nj=RWJ!uLO z#;2Rv6=#B`YshJST2O~8FO2!fcm)@vwhPKJ#W>Bro(5`fo|@_rI6PVwJCCBBgr@*R zmn1<;BSp~lFihE>+%0n;Mn%ZV6;X{k8AXz5#1+SNtd%4*Ga>RLodS_QG+g4idbew( znTw-4fUL@URd;S8ef$WToSo<LUzP;CVnVU)eI5^EW>K=>8oP7Q1c5f7Nev-r5u9*Q z7#nQTx~kpqsooodl{|7r<01Y7Qf68@4Yf|3nkXe5K+{J=qrs~oDyh&{24U?J#b}&V zvOQ<0n3;ZMouYPSou)=thCG*%E6Ee<f-$Fd$Jz}xTdiU8`hTgUe9ji6^F(A-Ed*!; z$L@K~9baL3$X`QHwO_`m%i7^4HEF>gAb@8GC3BmEn|ZvC1(|VX8W(IZ6HEBwLV@k( zzHNB8aF!p?Py=A6JjeJ0xHdzq>Pzuee8z%h7;IuoPTPdQB&8Np2&_=;^M4xaW9iz1 z!w-CI$RT~uGab546r_J@E~RF1$DNa65vZsr%FgYb|D*smr<qIRjCbo5zV!Vfl_%=k z+qq++Mm4#qr$W0uf{-WtH7_Dh*#8TB0LhvDqCKQWlBY>^wD_#r-|CW6yqd{ddu|mF z7Q)Ux7`tROg3+38=0zy>2iGwC0T-Ng0R(4^u&~$el-R{vJN*LF3Qp`Y1aV@R+>d$! zR_ZVlIH_lSnP_-3x>jw|#3O-=WATSg<xKmiS^UG11Kf>YlHr_yU*gUNegzP2#*@FY zdnZUe>>h~_24G9&{@&?6Hc}v#9M#X6|59nT>;bAFNpxTtg`U3CkKIb{$tz2Sp-Oq? zpZi{+?U{H*_l=QSffhg=qPp`tW@}_Qb)I|f3dZpl(q_i`4kKS}N6yKb4e^<s6NYqF zvSG<bqd?RH&ER5wMd8B2+G%orsneAX@kX>5IL-_Q^_&*%yjjfG8wf_R{RJD`%>;0d zN829q3i%x{vnaEF(_R*b>E{u(f7>uDsFa*+=<*VjBES@DC&V~WYcIWU{v@MyEcuD_ z4Td^J9iKG`$q=x&l_5SVR2&@ys0PSlkn8}Lnr2*A#{4jH-JpP}@=9(#8fG{Qbd3b! z4}Yy`;mI-?g9iCfODn_GA^7qe7I5_@762sq87k0v9~{oYa2{8^9>mKdP<&2KaHxU< zZ=Ee4cxS#*udQIE7O<OPopAPMIuNP_1dK^*MH!C$!dMU}9(4Xzk)iIEKRjrST5+ga zsgK+l1lforLnGs(F{q-Q-uV@R-E~A9Q<N5x?slL_MRN!!JL^)j=7%ug?K3G`ed<43 z!ZU_@!5nY;t<N>$S+|<K!I~dKoldkqrG~nZM@l$0AKrDMql8tyth#4W0|S8cgPnWu z0bbL7^0FK{CPg@e@Ymj_vp{^`yo2Dfh7aotUs>P0UrkC^D`oYM2zgoc?8O`#&Wt*l zwX$P4jQXam6hw5=y?Vm5W)LH(C$+}8exCD>Hz4Cac=P+1iNKDrn9(>6D;V{TK4>W! zkOQ->%4C35CJ7tG?Z=bkYYr?jPYzimPoC_8*;z-|jh!;P`s|_DG9!0DR=9T3(B5t3 zwJX~aRWF@U(Tj28t8Al{;jhB))we9zBmAL}h1%?rouvRS1%NeRm0Y_;r;4*kt1C6a z)9e!L41&(}pMBtu+lY6XN?z~Qm~zk(Ni+A!hjL1_3!Y2rlg-cfMbMO_k;TgYeuN}V z2{9cA4zBCJzO)@Eq{uW&%t`c=^upJk!DHlXB&^~z*?;c&>!;^Vs+k>;ietL}jH|o4 ze)IRrzVlbDtlmV7N?`;k9$kA7Pq?1)&xL&@q^3g2T*SkbAG!(r`YgUbD2nmwh)Ue= zkEKtmY?kemGpS)r?*E4OQIf^_{GR`Gu^uH5Z~SPse9!D5P%5C;erqDH0GzpWR?g{~ zhBPHbpsXA#!plD+9GP|3b!E{q0&#qAIbf~rfu^4t*j{F7JIt}&MJAqE=M^9?-)eWo z_tfIvM#6(T<9P$6`U;qt<Ro3Fd%Ab8y~a-pj<@V_+keYE>3&2wTL$HznY@N9_rUOd z>8%~w%VCeJWKltqV8qE#CiBJ!5!3dkooq*}V(MF!Yk4uPZU0dbsS#E47{9K~&x8oO z;Ps@XbW<yUMvMI764h1MwPN?3o$_A$K*Htuy9t@RlJOzb@;iE~W8d84aYbjlf3%Xq z*Ob#2AX15)NALo&S*O}DEBSe<-yt3XA4CmAb-Or0?cNK$|C>hZj!ktBfT4dM85AZt zpm{Ijum!Sz+^*=n-dk!ocMy0L_lZU^W81gj8>`W()u-CaKV->%Is9{<2P~+TQ_T^O zoKZpVkS#yiX}A{!fgK+_OU85VyobEGzF!v&f(x;-aG|3^+pD)i_!`bV_#Zg<1NewL z#e9i_8O+Onsc%u!cSaSdZ9-<~U?s)YtIw}gknmrFijy5xJSe7iG@Oxm!_;$p7Wvb( z!_#)Ua8A2Uy*BT;FLkRsA%P2c)m7s3fswL}(jU3=-Dsd~^%*8mirYXC=4dGD#m*n2 zezUfn>$>g4H8&?X3sgFm;!kgj)^1MKL|()*k;$|vE7G-5mul8MM?6{wIU`CkPIg$F z8$lCXyZw&+&rHdQi>eE|5-Xw}y+;*TxRoxM;rBfWa1t<mIuib#o*eb2<oU;-hDoH7 zmonK6{Z8VYMW!QyHk;E!`?YSeb(2L($d(D|*^<>gcHxPmE!U-3wS@7J-*5|0B_{~R z7TWC)>0PkjjUuBRdn=<=mRQ^l$LICQMrHvLRjc-q>W4AlfOzzBT?Xe;YaI<Y;Bf|v zMN@7~u{8$qMnr^Ad`;U)f!@>dQdc%BW)S^UXraEPfGzSqg6*Kp=g|YFnLz-Qi&wkR zi)`l|N5`FpzN`0uQSDr3OW2XZ0D-jHH|>CWH${i3lYB6B3fbK(n^S;25qcS8XJ6Do zv*0${2l*N9YMR>pgW7Ft$nH?AeVmO_JnPSdx%GDAt$6bdm}bdwYsCW-D_R@Xa)x8K zMxk+U{H}H~b%_-fEoi=4zW0J5U_LRB*Yk~`VsxXlDILYBRop`|Wy=5ca^nE)Z^*_Y zTEK^tH}GTJGf#>wF8Ra<E&k8V()Gz@e=3(5aDQa&Vm<Vc2pTEkK)VR9WgJBjgh!G0 zYoP5W_vg^Ym+48z;;@MV|EW}-u*Qoyw$As4CdDXRMuQ039vr5>j0S&QR<}n4w!!?} zAvo0od`B-)U=j7DJd#Da>H}k~yt#~ZSgG>jZiZIXK;A@Qo=^1H;&s;LVvFO!L3)UU zloWX=E*S9v521d%`TuyUyPFrV7HMkitm0vzwbc6UsYatQA)75Z43t|ytYF8CO9Dt~ z?XGg2{&t*rfgk@GYoY=x!Ym}s6PMx|aB>O`;@<{`U0Sxe<A*FtaKttUa||`p<Y?}- zIyYn2cIj;0iFKXuDL3CD-YXMwXXixaz!QP*cTDJIU-`bjDJ|PX#(%}~^Iqxv^zw1U z8nZD;ai8jn;s}$F#BLI|L><euwiBAG3ySFtBBs`5U*^yjsc{a6DUj~b6a#GFqJpD4 zUDeJ0RyqsCW+tFr?&Eww=e-G>ukxOX)!+3oMzgk6(dQ>E_9OM6)crl|cv@%&65Bn* z)%<p0yk!{&)87XuaTE>!7n4FZG&7Z4uBXlTtEQjPuYz>cCG(L2uYYuC=AJUy)dsI{ z9sS^p-lpp9%;HJR3|_SF^YgfxXu+6hTvXZYC8m9l$pg8w?6Pm@9jWKRP+oCqBC6x- zC>Ft0Wnd)12Q6&+cxptZIko0Ss&Dn0KrI_Md|A*LxlYUX%VAjnQr>F_JGB$GY;6}h z*Bi+20Sd@h{1qIQo>pu66w-Npy)|vQDe>0N^R#F*&-DhsQdzn#Fz1U8rpM8S3)?@e zU-mwsHdo<NlCR=Iiv&#)iUShFQZ+tvl{i?ycO!$gtBWnSX8~F#{Nl3E{MG+xe_eda z-C;H(Bmv8lNXTJugRCl3v<1RUb*bYDgkzj3ICOzKTKX$fRe*KNf>lcx!rm~@YZJ`- zc9+`-*TyY)?cQ?zqk$>Kx1#=!$3Oh9_<R~nXgI+p{8}I8)&{^E^F-P|e#5Y$05S(d zM|VXbhxNg?DC1fgLx?i;f-H=YB;+*fnHylRshdRZvzyAER?MOqF7SYpvxD8oQU>cn z=VYXB(w$$fjk*#xq9JhkaG2-psE;`;4VMK1P75Wl$+VFR7bIsuEy~U6$oU-7m{u(_ zm76vwl?$aUEX>~uOBT_=20O8+Zw8c{@mJ)yLXOZrk!Hzhd~sXc^G_(qrp6giAvW># z9NPZZ&T?hEt{6_WMMnd6B^L~tEgVY8^`$G?w-}iuNvJwz?lKfrHDBKk`*bW-N~6gY zmcGB&1l$-K_A^9fcWXOUydQUEeU2*b9G)NDf~GcEV4u*Dm+_%h2)V037!^ln?2AcC zv4muvRx#k*^uI3l+_1KWR0FVP={K@p%jSk6O6#(+S3Y2%#uo@g{mTlswTcNb13T-d zxx)wjjF-cQ7VvkbX}~GSUW5Z<^+2B0A`()S5t~}2h_XzzIdUlG3TOraYH3+X-fSJf zt$Y=w^k@(UO>Y;`Y=R}IVzL4mT0~~iKVH2pCWlhjdl7+hu0%owJ$B>;e$GWuZL4)* zj3KPP8ZAhf%39Vj^Als)Cq=w%N)utJ$-Uzieb{fg7w#A`z(lRugQO&Aazg1wGexd; zB=%HD1lMmDx$G!G(xbGz5KwQ!BE$ma{(KM=&y#SbDP!8W-5A`7;x7y`Y|TR~UC88e z9Q>0z`?xyciTk+vQ3WO746C9sj*h6Js(K)$lxC@Gic$`8xXo;}TMG`fa2X;{js-6o zRogu&*$t5yhc5N3AacRF;kW<i9Cy(QH`~Zc`H<QQ+K^|NfpWLLgy!+@YT*_|Q|6MM z!OWgq<V3=xu0B4Dpc@-VTDA@#jjT5WPosp6{XF1DHgqE8G|&MxVvYvh0eT}_5zAu4 z;A?PkJF7@NhJ(%lk;ZiXrXHJY2_GVM$>`r2D#RpqgU0nSF<)~Xy}3=Dj_|~<;Dr2M z0CQs!c@;-1XrPL{CyCsaxd)NF%HI#19{w+7T5E3A>Sd13wO31eOlLyUYUNbbWnj*g z&f2^qlF%Yr;2`jyD*U>D)ROH#0(ZjVgMeJ6TVob~4M#VfJ!%msq8n2Pl2E<@*+!w^ zb5avSvCzjrcd|BoXo|ciNaB+1P^@i9G$h_Rm|%L~+p*r*9ReF<0(=KVCGiMk(!@x$ z$g^B5`Y0%cqCW|{ERaH5q=SO_v>M1fh0_G25iVzN{>KmwJ^)G8sJKPiR{PD7is&2c zLYNH9%uXBJpwb+EJ>kdH9nRk48pQ|q?ae1knD4Q6?i^(&VUE@}kxV#)<!_|ch{z-p z=J~1e0F-IOT#h8L(3T_RWl9QXpW_4J=iSI|!^@4)E3rxOG^tb!dd}P?w{X_rQ-s7V zyvVp2uwu73EaK>rQ=5t-lI@)@s1?&42i&|FkcBq3RySpp`Bxzu7mVxb>-<WZ#ZK;# z!I=BgKlZj39m4k%nnmU9&w#5pl6q(cPTqDV*0P(uac$rAtL{RV)8vqkQOpmVaeYA8 z4<=f^C*clKVA9xkr|-J-Mj~Ry-)}kIJ(_fWd?)PC%xGZkY~6Y*EaFH1`&5U-$w^lA z0AYUFVxCW(dbZk)sTt;akptJkxb&jFw?{EPzhc)4ICTf$mH>AiIAJ8Vw;c%AV}~w| z807!2I?g&Os^I_oyQE7hqQHWHE=bqXv9ur{-7Ug`iwH`WbVy0Jgru~9beD8VNrQC5 z!qV}(e$V-R&-0w;Jb&CX_w3BvbMEZS-1*GBU++6A%2hyhiuPoepkNa;$KdKUQ5A9i ziisay7Bu!@xBfPF%nTg-8%MtG?)Y;<yz5HoQN7&*2Axm3*pDf_GlXl|)0#^@5_*?8 zhK@~ZCxj)JS5{}(v~HYK8Rt2|EvTJO!kxHl#AzusAI@BGJBy2DgTiE1^c)`Om<CiO zz8TEbbD)|u@%vUz>oLnLu{}=d6i@q&&2$`DzK-?$tFz!C9|5u^BwfsRMQp)S+JpLn z6EybFbsfC#sx~~=y+>-+-Q@00n9n47ly?G>5S<I47n&Gg*F@CQMK1bwAM^+s6e9GR zAH3sipXo2ZWwimc)ujMCGKkJri5MMdsEC$1aPQxaOj|d+IDzEWAHR`Ja~gUYXN^0I zYs$iGQM^N=8K;25VzcO%zt2%Kk5rxOvf3ZpFDdvO&TNzm=1V9QIpnH!bN&o`)p~Q5 zY#wFBTgWXo44xtY+6-H3jj?~yY)@P047d4~wbUCtTn8-yD_DRX?RN&ReFI7vJeWk> z4Z6_dgh;2>%Hles1UBCUe->ey7x*}o;RTf7Sp1{aw13i<kJL5uJF1I=1*nlQM{$Mv zObx#BS8Mj{+T{9d`ngID4*+c*Q<%t~nfF02;n<n=bBcV6H65pme!;e8@Rwl%0w!G% zQ)XjTLK{%qMm+3}>DO-xr>r<}m662}ZBM1;B~`KWJF+bDPpgC(`t4Ca+#qbA2MM9V z7D?jm-OYtewj0@|9kHfeU+|lX3q^{>BOUu1p^fjgNc{al1oim_hPpRC@V~`06;wF+ zIQp!3-yfc6&&*3EQrkliIotcrB1k-lI3lEbzt!C3kPuHq?{&vo<DuNwGcsdG*pyKp zt7r1gf!Tc@4Q{`st>gQuO=<#|^3&$ytydGx?7y?$9GEv_!m2TZ?z>^0*PI2fN?k4k z%I|~Yihtz;N0Z`=`r4kUcQ}oG289N$Geb7_*}V!y##D3=cWe{`jipSzjJYaF)LV>i z3)&0ljfB-VT+!kPCyDDw&}+wJ&PHE~Mk0!)nAB4FQMn;a@{2t22>(b`rSJ-P^1Fiu z5wWxUgPLIR>|pV>64TMj+3i|?Y?d5mU8hr}dz?{OGA~GHKLi=>g?;)dd4B+(j}3eI zeu(?|Lk&oNp)a<^d&0hc>ua%97P;g(>+?3m^(8(ALyGm<;~vGFPnc<2m}v;1Nl;eF znBka9Utq;HN{8YjxPi7kL3O1~b*oMF&El#1`TO@yS<tLdeGF9rB_+A#6!vhIEr$%b zLqa94)Zz6Kjnbb_9y-4)U5wQ$V+zWp<EMw-qM55b$qdCIpuGnsXloMyUUq$=W2_OW zA(7kd`d6C8QMY`kTmw!k?1V!)@8@v~KJ(IRs2&nmPBA>NwAF~%80V3gV5TOCC-NIp zDVsgk)83yTsDtzxy`r5&(2XPL_@s)4HYOHBC_M8`Pwd(7JWA$EzEx`Ubr<|#qK|VM z+pVr~@D8y&cqn<5v1&}$dP6sHbLZ2G3N|c^B1jYhA`Pj@4CBZx&4b_h3xVHwj4)4X zPnB!`KL06C&9)9Ebc^~uAnRuAG%nAhD#=^|jo&W5L9#@~DI$-rXwO7%hxX5@#V-Tr zCc*=>$OER*QUGDA3eLn6Q1~nJH71h3r!DB&1@pb9Mi@DxI~}8oJ!W>MK}|??bkleg zXVMc<en;t2m-x@NwXHbcWJHhR&(No5OVMRe7G<{hKh$d$VJ3N{y0mp0z*C6|tV5F# zCt5os&oN(<Ist9tlY_M$ji$|#+U1PH>%^Gi?#giveg}ab2hG3cOd}bp@O;+9Glc~V z*z+jzqLpb0X=}8tAf~DG$d^@#Jm+f~_&cC<9ggM`5yM#G6+Kth+Ga|OAJ(Fs(e*qf z#au|75bMrF*lj3zgJjrPGp6q06ZhGN4ee4ixzYC0L|<ie<}XHY-B6t#koAd0gzyl* zR>TEA&+_?-yO!C8Fu>qQeQ57d%dv(rGg;Z=Hx^pObPVcM)p~E6++=vSo!wD4t_B}& zXDp{E9aBp3S@~_j6aW-H2C#SVLbv>_Zc!J;P2OaAIkTCUxI;G|2URzmVapp$`8qw! z1t>*@?l+B!R#wghVx{FM^S>0EqDG;Ah@V|K@6avv2_6z3bOs8p6Cc*fMM$`OYdn*= z?)2_RP({f_424&_V^RzAciz%ie+RfxCRrHoZ~kotWgl&><h|<k&#MT!E(F~gvaGG< z_8I48!n#1@(?q};f|@OMSKssJ+QakNjEU-odgp2r#>Oq+pMh1r<M7Zi6`*h~<fp5} zC7o+8vYkx5Wt%cikRx$MCDF$XJnR+>s7SF1WBD_U(H{1E;(b=;bRa);k_-W6Z3uHj zL*qtA<AM3*I^BlLEi@<*ix;X%j=8L&cc1S`&(V_h@wu5jTBuo(Fp1TIqbC4t6YC}S zT2DX9>(m9qmbfz1BDGHd85j}K4&3q)?yC<?W0&1@Xz@2~zL#;OsX92!?Sa<_#4>@3 z=o;g{&G|Qx3*i7ltg<_dIvMvBDoezJ6{hUKhi}$_J;Ftd!8JyLEs~bJk54zcH%nO` zU`ze^OapOv`v|Zuw>=KuO>KwFg0l@Pi)7Q;OL+zpj&D_WBuumMZF|*~^ld#o=033j zBVk?GjnfI+NDTsl?|ve0x!|~*G3{^Ug?Oa@X5VOd+A48jd%d76REu9g$K>#W?2`Bh zXbwF|izixNB%f<^G2WeAonJ^u?UO-33A34PQXBZ*54^9qv{b-pp&!}`If51e`1$WQ z0x5xYXVr&pbt_F0U%2juXGDr~#}Bt$c3>?ts8k*85MGfR0NAJ8T80VY9WQZtlaqde zy5-4$d?Zd-8V{^?;yWCHKyp_${)|0iGUFEZWG0Y3F4$!@qw&R<w$Sm(5IZdpj(Tqr zS&=(_ptxI>kj@2<;NPW@>=p*u1ZV#vutV9Y!{85e5-xWSfNf!-Ve#JK8z~c5Ndcwr zLx6vVGzm~SSX)_>nckS@aa~6z5*upB$pwc2!Kr)k_6x_m?(nlu#p!Zn_oe{w5cJmB z-*eroqq^bv_ndViDC-R%y{}9r_tJu<xLTC8F^#JIs^<kbX#lK77dz0{yC$1$$!X2= z0Bt^GU-)2l`a2(ic@c49Bf)0C^DfG<|1jc{63M*E98Ya)XFlA_Lf_q|HLnNo?;?e< zSg9y#knyQO2V>brZkftKeCdzpKu*6pCl1!84KcdUj(6m!sikYu=W`Zx?a2Zl8@GB| zmufIp(0u!z($L(;tb_0{Z_%e%fVty}#BYh6K`DcW)Pf!Fus%aRe{hD)JEiRWh;Npp zJqu`Nb~z1b`)9#xu}PEA(%yzeH0Q#(vzF#2pTuMBO`u~dx<doW7?$QJ{^q&lF-Bap z>n&Z~`jlNwCu28hk}COVi=F@-`Gq9n(h@IVx`N-eJ6P=}7-U<JXqS$W`t5QfvUr~H zw&crmMN}xy2+SFfrT?W@{<}mnM5aU%x&4H$4IMFo#mlf#NxP}M>?Cn;cP&Gy4^AeO zT?Q#@g)cz-UPnjaFHjnDD?OD5E&VaL8OV3t=TB!cb{ywXgrkan>&Z2oV_Y|k8#jae z9ODbb=CjMyfD!UJE|TSCT?jW!*K}3Fg>9&AQc5$$b#z2w9T22{zbre7xJ*`EZtxn! z3#Nzd#Qk%A@RQdztLx;uduDPHd3ap&vFo`8o*zr-^bh9BRFmPxq(aV;z^Oax>sb%i zX*QS$@G4nS+XF;$LbI^*=EV*Px5%J`m=}rMI*)S&Mb%GVV=S*vIL>_~>;eP;!r?Ku zlLI}-we26ijZR(sQn#VaN0YtDl$yrr3+!H9t_7d(we)=(6^>9s9(-jUI&lN$Rh#_b zIa9e(Av!x?f?ko)D~EK`M7s{iItz$$sFICBf7LWUY&jwJ=n@^b&Mung`c8Aru*K|Q z!*0zD^qC0PT=lBkf|LbcrKv5BgLW=N4~3WNMDCd$6!VqUiw5*-a;fCtSDCn<?p=75 z{BaF5EsCMdIOxr(u3Q|jaikfXouXLHYVmWGqdx}B<RfQT?`wC>b-q?|osc0t8Wi;` zs(Zn8N6)TMn99}aBc!q%bDe%iYIi<$THvxg)>4!`oU(*tM&9|mNROqV+A1m-P@%Lb z<kK6Iv<(<r+7D|A3*pr6el0pl$>_q^$&3!w7sjxI4&K3OHJL+xLZomQv7YJQQ(S?{ zPaTPR5eqiOn%+8iuDhI%BQhJ>XmAZ<{7V^DK1@380pCt0YL^FiB8rsrkalBcJiMd! zgH!4|2-hbLQJsvo7e(3?kvi3vpFH>-^S4?bqEWoq_i7E^dmXDTrF#33ewvXu=4{wG zNYl(i-N!0seNXyt=xfSrC=f7jk|B+}6+W&=OelGO?qE~6&somvlm*exin^Vc(?1Xn zgnL_liA<@AlF1RCfca3g{O0sxB-#DJbtl|>X!Xa74xG;eVMGJdi(f3sa$S(;^o8?{ z;m3Kyk3&@;Yc@de$}w)OUb)XPpzv<ru0$J7of~1_-<Y$H?zh~xv>`URa&X-nJ{m3i z8|K|Jd#59R`Wt*)iukv2rV!P+J=l2JaF``%KBi>VObGg+)#Sgx>SlBKi+L15+t^Jp zkgU1rh!8N2thpvRxT3VZGX>V0A5WG(?!~<lvK*2RqI9LjIZm3^d4P+ljMWo#(n2&J z>P<c>2_&=|nOOW%wD7r#BBQ=zi#pqLL62JZlc>qzUXn<AnYW}%GwInUa{1FUBV9jm zmWvz(<PGeG(}(_v51Yg@Kl&uQk)*F9o*N=&1yrOO`Ly_d8q1<Lf^b{EPJ)U)KU1(% z`BZ!Q#sm#DzI8W36A+ax?cQ7N)d|+*io-0B5UsqhTMJttig({UKEK3wJ;1NJF^h_W zAQdA8p%Bfjx7vtci{cGBQeZiH5&BxE-cUs;Dj+0BNw#p(xA&fIU+aC@6lrQ%u!H}q z9BVETr^bl_HP-KVRP^Cu$7Z_D=V6{!SZtqtiZx0sJu72n1BkgEbruiP(;J~#P0*~L z&g|^3u)T&CkN3~acM?n35tv54`hJaA5+>_hi@tRK04l~Okvw!bZK$9Rk2ucxUgylk zawN-g7{>9r$j9(z&mr-Izr)?)bjU?ESZA*}Y7ga%P6nZd@-a?*44>4q>GQL3{GtdL zRH6AY%sbbr3D?`8mv83Rs`u@iPEC(SOy<v|8a8BH4`XLq#`Nyxey!LI(iFB+0qFmz zT#bUU5BH?*(~wr}NoU{@IX+G0mlU{G?6s#dj}bkykgS^q)c#u{qId4^-OGm>@Mz=| zS*M~E^|xQC=xOhDBzFmmUF<zq@mH&tg<JJ%zkq2dYgW`q0j7XucT!E~_@Kk&hMQZ} zY5$DB9T{WMO;Mx2DV57qs<AT_I0FFBiQ}M|4o%i1)T^f}(#vrLAX$pGNuNohQU{Z_ z8%Ej3rk%$oIlhb*(Vl7rIrN`jp;K{_v>%X^*lRh=<ewU;=8dHZtx4;5lf_>)my7#s zGau6rT$6z&TSg{Z?w8$CeeaBQvF~R(8p*#n+_>5F%3ATk4t<kNpESiyfvd<&&`~&O z<RJ{u-^7XLH}QHdkoP}?C+mvnI0>~T#Nu^B<&Z*b$dmP2N<O{~2K&Cin89%VNX_*k zd@RCrk0(P-BxN_k-+y-7cKBy>3O4(6w}jt_s$$adr9QkF@s0ji+(iD4bA3jse4VVc zj%J7J#k;q^Qk3)Sk_VD*Y{y={!h1;VZ=I4M{OELStKXfjXmDo0#eIu~(57BIF@|8~ zn0WS*5pl^Vc8L^sBYhs3*)yi#{3d0W+$?tuEtVZfu8^4-R_|BFb&>UKjcId?ra|D4 z5_@a?T#}PbC3pnZQNXGrB#*8vBJ7}f(U%tOH2BCO)4_&A#~3i8yX+&Zb?4Q6|7%8x zySh{)%3QeJ_*<7g(^}Go*_Zd}Db!bv3=S%Qp`LI+$y|7Rs@u&O_Q<%pZ9{*J*C=gM zeB>N(;Jo^wLXvW|Fu(Q(pOmn9z=$7A`?r3!54*C1pB56nbGFMOSOpcxEkqMHXjQ1^ z3V6U+n$-4)AO)N!=GsMnZPv|>xh--<lJ>t;Y)OisqJI7`98WP2&>R!xcVOwC=J>pI z&8N6yNwYp+!oSPor-EvqJaQ=iD^@Io5Ae;Q$3M}YoD!r(T(TYvnD`&bFsxWv&Y)>S ziUc(gROOxn36a^D()%$?>o91f4Ke3TT|FPcbkGR^Io*#{;!Pfv6Gja;1_sQ8ldi+C zR^izm>C*~W1nm%aPUC%@$H#LCKVXva2?{S$E8?IwLWn1iO2wb$FBRgovatBk=Ny^8 zdaw6xet>lvRgc>$%d|<3v?bAw)q225j=QWS)AQ1O<*g-iHbd6^J_9$#JTquTdttBf z?}eCsl!}hvs^#bOhdC;|YXc#gj?^?A=LVb-_)35cqg;d?U`GOYFecg_=I-bd<)xKc z{!z3wfFx=8;o47Cj5mj4MmAoI{PZvbCb2Z#r-mU~^{{&i3ElQzI6HF70GA1T5O^&> z0^{U?Ch<nwdTiT@xlxcF1UFt>1u70XBq<)U^7Pdd<`dFKoNsOtsJHfy@2ldK$yVwp zz*|nKZZu+7zpWU!L&$AeGc|f-Xk)69a+pxekl;4NC!K(AA6zt4K<S0W9PvN3L#^ag z1L3)qQ6A6)yq><3x<0seVZRPC1gaE|LQ;f3)0&>j1&K6{DY82ag14YXzmDQ5^}}+D z_^Q9GP;)oqt-SkT!O=bSaSLz?)P3>UQE=zgZ-WiBB>AQhHqtVX7zM}r!k0Q6ZWmv@ zb5_Wb>k9nXSC~$D;uWH*A=l>gtj8NNQmG31f!x3ndK3@XZdskdZo?>?g4}9j%u@q8 z*dqBu0&&=gaz)1|qis&8Eaf)qm0xC!UNFw;lPev|ZGii}+U6v3J3kjeRtq1W(l8fd zNoryID{O>g0vl!brYhC8bXNP?Exhu4S*Oe7pR#mO`8w)TNGH2AAXZ^TLKWmNHlYd{ zSU*oa0j!_DLNS}o#-=K=xMFkyYCPXVc=lPz@$ryXLvtl-Y@OS$6c;4SrGb*DHzm+Q zy&^dgbxl@B(4uJ_f4wQzSTG9e1^Zj{3kY<MKAz^P*DL4CoQMmTGCy?~eU)n9T*R|y zVqpp^v*T^x$ZU|e7GN5~U7Z%p>ljoHRGW;rHvlYlbJf15xU?ogyYqZd-`E#1v?6Al z>NuJ3Ps|bn+U-klHUc`zif<o@Bgzqd(Ycf~m~Xk1v|Wb;M3J*2aAJ<NKla359Nzvj zv~B!~z4vos^))yuCg^d&dZ#^q7DyVojhik9TKBFjOHfLk2q~S!Fr|@wy-e?89Gy=w zu(EqRji`zWfNOR^MZfTdS!ii|$P44=DD&uY>but?M%FUfZONj;ZKr@cz_O5+W8Kt) zqVliHZFTHx%6w4$P9-WPkl&OvErQ`|W~yEmIu7z#nCDHgWeJp0_FX4n8_eyu%xF_J zL0j<#f`>N>DAr{6%-%)5c^iPeVoh3sC~RY-F=(H>ho5+UC=~pw1QF`H?D$B4KX1dS zcb_625-or3BzK@a5mI$y+=PU4FH)tIzQ)ies!$&$dqfu#XKL;tt`<<Ybuage17UHM zax6~j(@B#zzvjec&wBEcGYHq8FtqvUv=SH)%Kh-6D#m?WfyJ(u^e2ldREpek5|8kw z!OzEfnQy=G2Rv&MAeUhVtd=E5<pANF&m?_l_3xc5HJ(miDH5VKJOEyq{85EBYMqS; z$cmWc2HpqS+4>=}DeY=_8Z%K9MWbpqQmk+VedH?5sy!svT0B_Z9qev%m(*ZZ>71p6 zpIYjYQf~QCFX2w2UA<*qwq48@u(p;(>M2+%D}z{p`+Fd8FbaeN+<}1$3S1x%b|x5v z4W!_Izhz?mZ!Wkt6Z^mSQU3~#`H_7GlK)s`TbMZ_Ma=DyKmvku!+AKkc{t#_T5xU= zetr=?ZZ>Wq5pHh0SFq*(tHOIb3zVhX|G$FEgH&Un!h?Ti+(=iHrHG83jh(&b2Qzad zh=(*4O999v`)}q8poFTWr32Ct1Q*bx&O!pYl>g0DL%AYt^kh-*k+u#fJ6jMRA2&n1 eyx;#@M*sgP!_7T^YJLcm0V%vtku8;e?e{;ox`rPB diff --git a/superset-frontend/src/assets/images/mariadb.png b/superset-frontend/src/assets/images/mariadb.png index bd1687931fba8b0b686c6764ce99482e6d552b54..fbc301a1309c8d911a0a5f3d2619bf3240c73bd9 100644 GIT binary patch literal 9663 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 MnTBGCg1P^H00Vffw*UYD literal 16770 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 diff --git a/superset-frontend/src/assets/images/monet-db.png b/superset-frontend/src/assets/images/monet-db.png index 3b0dcc2b0e8ba3e564d127cb447ed8eadec1a081..0500ed155b82cf77d4533b5fdb08c4521ddeeb57 100644 GIT binary patch literal 14327 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 literal 21830 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 FV1n8T^??8Y diff --git a/superset-frontend/src/assets/images/mssql-server.png b/superset-frontend/src/assets/images/mssql-server.png index f4f0d6f9950c56570af568636d7749256871ae60..bf8bffe34bfbb9bc8bc6c5635a30b9260d52410b 100644 GIT binary patch literal 10710 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 J|D<Y-{coDDr=<V@ literal 21970 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 diff --git a/superset-frontend/src/assets/images/mysql.png b/superset-frontend/src/assets/images/mysql.png index b68620c289f13af6853ef52d854353f54aca990d..02526578256e8d13b63b88b12a8044a58f6bf9ac 100644 GIT binary patch literal 9362 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 Yxh==`P_VA>_rHd;)b-VhRUQZZ4`Id6HUIzs literal 14453 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 Hu0mjf5%wat diff --git a/superset-frontend/src/assets/images/netezza.png b/superset-frontend/src/assets/images/netezza.png index 2658d8629bf1e642c22e6ae604f7e19dd3abc0cd..c8a47a6fa13c7bbb529095aee40bc231beab8a74 100644 GIT binary patch literal 8460 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 literal 54596 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 diff --git a/superset-frontend/src/assets/images/no-columns.svg b/superset-frontend/src/assets/images/no-columns.svg new file mode 100644 index 000000000000..2fc8fe0661bf --- /dev/null +++ b/superset-frontend/src/assets/images/no-columns.svg @@ -0,0 +1,22 @@ +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<svg width="152" height="152" viewBox="0 0 152 152" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M143.5 1H8.5C4.35786 1 1 4.35786 1 8.5V143.5C1 147.642 4.35786 151 8.5 151H143.5C147.642 151 151 147.642 151 143.5V8.5C151 4.35786 147.642 1 143.5 1ZM68.5 136H16V106H68.5V136ZM68.5 91H16V61H68.5V91ZM136 136H83.5V106H136V136ZM136 91H83.5V61H136V91ZM136 46H16V16H136V46Z" fill="#F7F7F7"/> +<path d="M68.5 136V136.5H69V136H68.5ZM16 136H15.5V136.5H16V136ZM16 106V105.5H15.5V106H16ZM68.5 106H69V105.5H68.5V106ZM68.5 91V91.5H69V91H68.5ZM16 91H15.5V91.5H16V91ZM16 61V60.5H15.5V61H16ZM68.5 61H69V60.5H68.5V61ZM136 136V136.5H136.5V136H136ZM83.5 136H83V136.5H83.5V136ZM83.5 106V105.5H83V106H83.5ZM136 106H136.5V105.5H136V106ZM136 91V91.5H136.5V91H136ZM83.5 91H83V91.5H83.5V91ZM83.5 61V60.5H83V61H83.5ZM136 61H136.5V60.5H136V61ZM136 46V46.5H136.5V46H136ZM16 46H15.5V46.5H16V46ZM16 16V15.5H15.5V16H16ZM136 16H136.5V15.5H136V16ZM143.5 0.5H8.5V1.5H143.5V0.5ZM8.5 0.5C4.08172 0.5 0.5 4.08172 0.5 8.5H1.5C1.5 4.63401 4.63401 1.5 8.5 1.5V0.5ZM0.5 8.5V143.5H1.5V8.5H0.5ZM0.5 143.5C0.5 147.918 4.08172 151.5 8.5 151.5V150.5C4.63401 150.5 1.5 147.366 1.5 143.5H0.5ZM8.5 151.5H143.5V150.5H8.5V151.5ZM143.5 151.5C147.918 151.5 151.5 147.918 151.5 143.5H150.5C150.5 147.366 147.366 150.5 143.5 150.5V151.5ZM151.5 143.5V8.5H150.5V143.5H151.5ZM151.5 8.5C151.5 4.08172 147.918 0.5 143.5 0.5V1.5C147.366 1.5 150.5 4.63401 150.5 8.5H151.5ZM68.5 135.5H16V136.5H68.5V135.5ZM16.5 136V106H15.5V136H16.5ZM16 106.5H68.5V105.5H16V106.5ZM68 106V136H69V106H68ZM68.5 90.5H16V91.5H68.5V90.5ZM16.5 91V61H15.5V91H16.5ZM16 61.5H68.5V60.5H16V61.5ZM68 61V91H69V61H68ZM136 135.5H83.5V136.5H136V135.5ZM84 136V106H83V136H84ZM83.5 106.5H136V105.5H83.5V106.5ZM135.5 106V136H136.5V106H135.5ZM136 90.5H83.5V91.5H136V90.5ZM84 91V61H83V91H84ZM83.5 61.5H136V60.5H83.5V61.5ZM135.5 61V91H136.5V61H135.5ZM136 45.5H16V46.5H136V45.5ZM16.5 46V16H15.5V46H16.5ZM16 16.5H136V15.5H16V16.5ZM135.5 16V46H136.5V16H135.5Z" fill="#E0E0E0"/> +</svg> diff --git a/superset-frontend/src/assets/images/oracle.png b/superset-frontend/src/assets/images/oracle.png index e923094c7ec427f28447962367d647197dcb7d84..40507d220a62993d5a8934a6946a872174138640 100644 GIT binary patch literal 8577 zcmeHtcT`i|n{H@=^d=z95DN-~gih#Pq=qH}B7_hiKnNtEcTfbBE*$|WA|2_{6#-F- zD7^#)1f+^osT057_qk^7ntSiuS@+M$TFKexoM*rNebzo_Ckk$GlYy3-761S++|t%C z1^~$7N#k4^a?)@4$MP`J;k>)H1s(vPWBdIj17u`z0RWUcXwy4{JNkNZNGwJaVUM*# ziTYsNNoW8-LD|P0fpkF;fOaTHw3{Mmv$-7vMB6KZ%%$|9`tIr|C$zR74rStJV2bo} zLBi}o%1S^5A32f$42pmN`e0n$@NzzipugnGk;cC-LqNd4AOsghkm_%Rz&rYIpgI<Z z0?LSrgON}u6et4|m6Dc5*&(IuBt?MYP;qexR0;xxfuXW;;!<)_Qoz4IAd*6yy@Q;w zhSuNeNN0*5Cj!A;4g&G^_7?S)5XIsgA!0BX3<4F0h>L?s2r%B)jezh0yWubYBS8a& zN8-@#1T@wS_*){v4(mx!1d)vWmlqiKKVseRe@BWGGl&nu9U>+Q{q5CXKzrmLoVzE^ z^)Kc2NC?Umg+aLy@Fc9*AFR6*mVm`OVgEOx|J?o$3P{n_*Z-sAKeYve`J)0)(DWj? z@pnM}Q#9Vx*Bu2hM&YrZI3!Bbi)7~I-`=>(spC)x0v2bA#k&5JEBHSq1H~moC4txV z5lFP#Zzpd2yD2CQ1OcT8BIQjC43z+jOPGpD%ZW?NNx_6k34}ub1=YveqaA$zK*dSP z1&cvV#h`MMP&qNl{{SV`jXi>Z_`ibfk#Y`L90oyh8I3_Wq9E>Wjv(NlK+36OU9mWl zVv=<de_5fgFL%ogPe8aKQMWV{K_st5(P(=)afFP$m>5hF43$Pof+b-vSunz0+5s#L z6_Z5SJHTX-NQZysYhaO{zjOP~eEa{$`Gz<&sl5=c|7|(Ho9=f}$Z4bTq;&cI-4iA# zkH1H*Xy9LUAcsKyu5U#U@^@lU_MpEnqyO6x_?K93ClpEO{~_J~g5j|a1aAZmrRqqE z)_<X(ASCl4zkBgto<ROrC;z(l@A~#1IEf5?5C0Gm>EsWUq1;IPg(DHwCz%(f006JV zEe%yupRDy6-vHBZt;#<(_k9P%lX`Vnfg;tHLxDo2D&^I$j66ys*<D9O_ea+ctDRj6 z-O9&YT5p%P?~U!z)<?fL?xIT7wSJ#R^R7fdgKXj!&^~iLYg=LVs7Eg?L?!W72mf|p z`}4}wg7g~HfMfOvkcABS_*dvb6H|y-cg7=%M`DXSymuap&3@^yd;IGhH3za!Mz)Fz z+4efLi))*KQKUN!>uxL79T5IM(Em~dxNP>xj&*U??z}kbkKEc6bpdpdwp>nJwidP- z{l3&Aqha&40fs%Z&FC;p_!CTx{$T#3<%`O(*vmK^P=YP|b^U}mfH`ztMZrLa4E+&( z*8>28>eD~ykW_Vv))L^L&~c;HXA>9C_|@Qa0rW$Gq>1l`=}$rQYd8&~&4Tv*IS+U1 zDv`eT&Na%Vv+lN1Y8na9;W7Wr4=ph~yQAez)vR+K0P>DSEEV8&y=G9`@{Dc@y)-p_ zNSO%z0~OwO1)jK`Y`^!`t+e{3b&jEw5m#yHzU8WRe?(M!S4tlQ^w<%bJYO!Iu9V-U zs<`a8R}E>O&Jd@<<E{K_byQ``nD`0imA5lxR%e=vpPzf;{8h@(O^05D@vekEBe#a9 z=hg$dnTA=Npb4Ms>!OT$nb&l6Ed4tK6#&s%#m_A<H_USapVzw;QY5oKqWI2{L&rix zf4nf;Cx+~(eo--CaU9X$1@@uE<H~eJ#dLH!oOf?_J(R8D*2wo8%s$A|9B`>DuI@Lr zVbTbp8GjRJNzTF?%FIRE8+20s2vRTFYMSlEeP6BTG_Y{GE=LyIG9=xV@|IZmL{oF| z0q2B-BUcxN0JApUrDC<hg6~(CA~9pc$r7l7o!Y?MsT39plbIzalke|$X7KbRF7}hO z$?2vn4=M`^GTsN~b~VTVoUY<<>otQM)=dBaELI5YN%ZAmCnIl+H8N4>)YI99XNH1U zS}~d1qgESMSii!|;tG!1bCeymme#yuY0!In8&9u;<>)wG@X0e%c?oq)Pmga8Ivy|I z%(H1{3#1BC_pl{nhVMQ*5Qg+*2U%h!!qh_0c9RYJMt5(P+g!3}7)?J*^gM|Pb*Xqg zJ&g<=&|?c%t^M437N==$`ZoL5CGTI=U!HnTq~0Y*7YHN}UtU)7k8N-RJJ??dzJA`> z8M%EgKAhSr=~^Lv$|rlWO;Ks{>e8=Q&P$AvSG3tEzDG!r0WZ!Aj;C5j`1%3>kxtsR z<SMj)TQs$0NuK_~g{37~sW!37@;$;ck1azHd6+`BW(J<O15d-fkM#)O$s-Rt$SPZ= zPdB{h2M1W(IGj+~p3j^8>PE_W_&1L>GfQWvITDC9f<H57W${boA6a0@ZlBd@LAd~3 zV924J3t_aCm?8Dde}hHQUwU;B-A@Jt0JWoxSAGs&Zf|*5%Xl})SC_|wR4ajJir!mx z3VGyVz!0xBuf@KEaOw{g)>dAwTa674`a9n3_|z5(Ah$JMr|1=PWNpfcK|_&VLRS~M zrQPg_aZWJ5@7#IsAy8z55x1@6aNCVv?I{A}Aszd{w%LJRb8(t=bs+XPaP6_-5<dBG z<zMI1uO+918Do6-gNBF{x|>AnvrA`R+g@>nzcyWuqhW^YsOi=0-dtS}Hmalqe5M3> ze+_GjK1n}2X<VCXh<bkwl;)6e!MG5P2F+BtgbNAJ#~l|9m8OaX_&lo5S3Z%Hc8rbH zf~FG~^mQY1?>deM!Mxpmj9OWJ%$}3oxOqvF->1XsM9eZY!kC6kfL4{2>}q66R^2rg zddt+ib^%9IMNQEKwL-#=6x`dlH~e2HLb==MX#nR7?n^2uXA3@LXlUP8?CaAzR$=Eb z7J1%w{D~KLZo%`TlvJ(1%-;9#>4*^`+|%=5$-5aVYGCHY`hfdGqIGk0BI`tD`}KF! zLvIGNZkw8YBlU2m^opWCkb@$`9-oFTL48=+Y!hDnekLgAt#q1@usnR@$ELD=5yDJ( zvSHSuPN&?4I>Eh~L6fEq@3_Mh{7&cwI;ac2N#x7iPi#Q5J%5ji4CxJvXNH^1w;X#T zhp*$;#vM?lOTIkP8kd5`ty*c<HC{)D0N|0wjCqDwBL%qEYD9WESlhW=3^K?iXS%Q? zvk%5-tWRDHJU}d+?88eJ9$qmjsRj?#Ws14SFHf1XvtLOnO;;F{UE(z|B^-d$o`QQ~ zcZt7jU^}i8%?&m7=QTmE(Vuhmt(cDU_^4A>yRw5OeZM7N{zR)vQ0~w6D);>Lt=cf> zHYP_KGrQ4t=)Bg&xx;Bwknw{-y><WI&Q^~)lY;y4U{-faO9xXhjh1CF5Y${EblT9~ zmF<`4?5skgLJ6u1NZ;-i98DAJpVXFJtGKh#a!h;e5t#D2Mi7}7*qBEq>>7Y_*!d`R zYog{`2w7fLRd4<$dGGGCpN{*TOgtGYG&CKITvx-%WoBF-^MmCG+DifL9ADkn41;k> z2LMG#@@-aBrP64!xkZxT2c^JCXZ8nyuc-_SVlA77kJd~k@{0n$7v6!#JA9v7n#9`r zx+q7TY%vw%q*$0QE<Nt``Jsw@7cV_dmbW&dOAM%iA=D0@QMU$*+(M;18KA@Wd(4;7 ziOOzFoxjfARaUm+1^&5BAu|nld1qnhW);Gxs-k?C7}#JDT39Cpi5tu=FJ-z4VPUa% zv>MZsY7e}(z}XHjEVR{DAv5T+Zc}KpRsGS;V;B%@9N2pF`e>lE@)`QdAe>^+J~K&> z8r!D1x1KqW9%LOkcXse_dy$9vyo`bHc8f>o6jo+Xp{Bow_fEdn>la3tW_@L6@0q+? z*_?rgXlv`I&UWzkvW|qsOJ~7T1tSQxcdFslr$-*hIjZ3o$xq&VUCue9OwhL4Sk+ET zN85NNuTAhMFaeGDL0H|3PBRPsyQe2x?GS>w)ML8K<Y+GSh;a!AZuN*epNo(k2DfvJ z;3KMzrwZ842sVt^(3EU&8{@+yus&tl#cI)Jg?XZdlCCg7j_}U9F@A4Dmjh1|@&tx3 zUT!<;``S6RL{n^%|MXmnx#f!Jui0TP@<NT&ii>BvHhH>3z2kgd8@x@MLB4*$?ramG z!29=JeX^)qv0tk|R7U#xRtL97<Z6HzsF{rO^w%lv#P;Xoo^sl#si<h1PHUu!?$x5J z%^`jLb&!^ivcY$8HBs*!e0|r_9SQpVThg}@A{&BQEt@&OY=96N`c5vGxcdiiUT$uT z!NIVH^5MIgDzdwR7w_owCMJFXH$(=VOgieXKS39TertOrJJCo102DkqnZLv%SZTs* zw714`u%Ba`e+r4dKhr>zv+#Evhj2SM`_Ym!OIo}!wh8#EAb)dxHfQab;2ZcmUS(p_ z!Q5L&WQBEkx`cgdMQ^sJ0Fc{rHh9pwcG)LzokT5Qo9CThBS7a7O9Oku#nm_Cq+vrQ zIxgN_v~s4&YtXAIQ?*5d@f7E3r!Gnq={37{f^ex|-8x6%tIb|@m2HO$8^e<8w>aM# zY*y-i=#T`ksQ8qct4d}J_zXCdRPNVf)zN?}aw=2{_A+A9QoLUGf@iD`2TeaG$KyJ_ z@Aa)3x3bk^o_f}2_<64N3MS3-G8b2iD|uIlxu)^T{wTF7Tye&Je!g&`NBJDh!6Z2# z->yHn$3A3c)>KAsH>7cp_|x7a%E*{J`=*&0riQ7rqfA7!EYQrKUZkXAbgCZFnJVzA zf>%t9utKQbe*}Xq!jN{EO8WJ3mp^7JHsz^h6&Py;1|Ekq5hhYP)i2(n%{QE7lZp}k zmYmwNq{I}Rc!>cdavfTk?M%-f@b(ouhoy<=_U$rv^Pu|?=Oc6L%n#9P6OQUN4t$Cf zz1usX6t&(q)tw16;$d@-C60#$$0Lc&=9{zBLa;stmg48qhr=etDp)?8^>$eex$*(o z!a{BDx%OL=NZaq~4+);0&hgJi9eTg8wdKcX-=JpDIblm!S;@F?Cwr_6GS%6h&ptBN zENtG*A54FjGqDvH@+_WL@sN@yH=G(7d|ESkdUY~tE?G<7Hipl|#-q!8|LW1s%gUoR zp&7lehZ?24_b(4jVK3%uO{N;a@^A~jhwuvzR+GZtL_#my@2rgMTs+bJl$<QbO7$s( z6`-Qi>QXe>R?hHT3lK8OMVroPGp+Q{LaJEt9LIysFHOb4m+g{}k&~2p?*@Ciy{nDc z8D+LA4yzh4!f*NFZ%WC|nO`dv0FWgpxp!DK4O>7BH)qD+*&q!8Y9?tz=yL%MypqqX zMI&@Vl#vpsF{`xLx2j<mMl_PAdq7&Amg%;$`ES7VhAUanoA;I`+PNLGuktJ<7&FHt z{4}O^v;26N%-<$DblqozrN*t`Z9TdbgiBULMg)F+@ZIqCnU+gj=!2-xCo%B(W4U4l z$nI?K_aOZp|7EAQzQ4X5Y!8MeEhjn4;_l}cja>^;%K#ZgYq8ceCY^DTaS*C1+f{iX z*J^K1HQdYzNSqs5fS=R<C@`3TOZPnfs+_0Gd6a=Bmc*G^z_?hMRed)OJ-3!lGdz}N zip9z8I)|=p;y`k9#s_pD5WjVX4tDX2kphaHliKYVkukqH8M?=HC;ll_{nI8yq|^R} z$xEB^kv7EwQ`~bpvODJ-WQGg`Xz9Wmro-y_j^;1DXnJl@S_$MA8+uGrBVL|9Ho<94 zXz?a39gZg)M<N({ula(i^jr?yT~>zKb^~tRpk}OnJ{Wm=IQHdLZ#2UC>GsNM_d9&q zdA7t|w;KY&beKn=mkUunNWvEtHpeZ9usn}Q>6SM??G=H~_nr#eqM)SM)0gRW7>L29 zk}5N*g|WH{J~Dbup0<!MR?Z;g`RS-Yaq!3<lg}g<m8CHB5}CBwIX(TQUq-zrc57Ct zWPhD{sKu-)kwTtj`{!Ev7!|g4w~;N7x94Oz|6qD4Nvip6N2%LPxl57ED^`ld#Ys-< zg}}yX-))SfeO_LP_Xc6HPx@RkiMRj&dUdaNJ!QNlOoG=&jU?xiQ>Ti)WaLm*S25Sr z7^lzOSeqTpCXg*IHI!V`6&4Yp*Gqqs{F=>)l>7AbyvA{1VcqE*rwr$Q?mFLX7VsP< zR(qXTu4Ea-V11-b)9NqdJ#Me1^<&ZnrK-B{ntFJ&Jc?M%w#mqFJ_Q{8h+=HkmefZc zpQ9taHlvk(6;xCha8ydFdey_wi7-D&v)j@aW4Y)_q+l+rY~Y0ghAqins!W8mGPitp zs1k{1-QL!W`#fCnG%f8sZ&Zor>ToRIr-%BRcTBG|6HGFdFvAzs_7-|^<51CyPhHo= zssJ5w!CBkyg?oc(o-y%7_h<7R_G1m^3Zk{IoX$OR-mmCPmQt(IigSB?d}pd&w1ruo z5P7^}?tIcT{6>laDonTilNnGDQpP(}6es0X2J@JUN_hatot#{L1o0JC)`=Mur=Nc; zv9=jB=6eKQdhm);|H3l!4Gs$DC(qPWJnL%QpNZKOz#Qm-(bIS5%W7u6ePC;6(kcE4 z9>{zYu6#UHe8;g>KWfd@!kGL+s+uPQFic=1WpExV%9!Of83mDYY4zg1)BQH8+DfK1 zI5<xyEagJZQ40(aCWTPTpu3Wlw%SyByKAY>VD~CZ)El*J%A}mQUdeu=eDNF~P{3>; zQF)d+P{X0O!g?)dhO`8V7Z4LZYFuBv$)DB`6d154kv19IZJ@a~ViJ@1nmKCaeK_&Z zQ{RS7L&0uWl(dkW+B?Xaz;ytO;32-gxE-fob94`N5rpOV8rwFHJvjcreb$UV1{<i` z)}%c$tfp=tzrENi;5eCdO_e96+pcHWK(~ry`)aiCclYLIX66{JjpOv@pGYTMiM4K* z9Z@jne()*Y+ANuSCB{}S%c;QVe6lekZ`!YM<l+VMP=sW*<9u>TSMYx0{<qZX+$syS zrpD3!&ET^q#D+?NM4F+h0r}ac9piZ8lqciLr!TKxSNWher8KnqPRj|PExJ%eun737 zMtb9b!GBSiw_4&Cqu8qXG@c*lmnmI0F&}1dVZKiyCLtesIW3?gPGBTk@nz2??^MV` z_eRV)`<KXs{Tc7su|RqorlE$)qrEA@ixqdnl!}s{DM2AmAK4qR=uDimIf_*u85wBa z)Y@pX!rX9ac@ncc3Z8#vQ{>EC!4vG6APP~QUIWw0O@1!A<j>6jT3ooZl%>AaC<MlE zZ2&?F_SbfAi#$9gpQv$6`p{_-80dPcumlOdbs?5U!zlGjnMJjuAwXq{gHI0L6@=~V zPEpYP`U4<#-|2}E6Bmiaqobi*1-9_O#;}!@M15<WVrzNyw!_-61!3jBalIK2vnGi6 zP`IUTHBq;~8QknG)9zUzyIw0jp~QV|ana9Z^kZmvuUg6zzd<+bXRW>g7Ah*IsUOKh z5@oxS9=6{WZ0}_sZ6tQ;7hS(<HrBY=QeKbgvIS76{!nn|jqI{Kj@J0nL53aaNtiuT z+Iu@++n$Gzyar%77al6VQN^>!N>K}~B5j&Th?lWk7GVC!BLkPr;9b5#IWp|?AvKg) zYfFWmGS+|adZDyi^gvUpv$M&!HkFRHjib<F6BGaQsOaN>x*$H%t0@$zAWm3WubVy2 z%ixaIj1faZ*%M#ATJR;VjO2RSp`lkk$$K^Fp51z{E+1lijUS#iAQjgI<WL91C*}=Z zrg&sOCfZ$v0JQ_x!A19mt_xjl_7)r)$&@w@l=av$(y=!B3brn3pC&WT!-S8bgMwHg zJut1Ix<Ga3!7lT>cj`=CL1(5vPtgYgUGrRh%&q>t#8%CR#~hq>PmCXy?9^lYR&PgZ ze3Ueyq6SIQZ#S)~?JK)$aA|_-WbST?-kXNf>-3U^S93z#`~V0^?!a%!2c1l-ivFxg z@odz9dW?;tlur*|-izh59z*~Ah+tpCfYamd!5OI5<9Ej&&Ui;~dS9y=Jo1Uvg|M;E z+EICLIY`?J?@gW4w$brd`0g3yh9Z568@qe!2{-vYPTK&+OskjS8o8Q?n-k5c%byq| z#6R6|W_gC;S$gUi%X4#g_hnBIkH3T0Trn(H%4^Mu{vt?@vraXzAK#VkNF~}#PagX2 z^4a&619CoRNhJdpoHYyWSG3~ed#%8B3U2hSP-84FoHq?dfx}t(cgzCUYljrii}@@) zU3fb`s6eshgM+~}=qXi%TVLsso@_F5umW&xsJ&2fB!GrOb$g}wna%WPhq!IpbK&Oq zZjjiQ^z2VGPH`nqVZAGJIz2nw)_So$3$?T9P1tn2GACj&*Rp3h-^oTrwP$#`UV3tu zw2lH>Y$OT^sg#bh85VHhUc87L3?y<%n=)SKQ1r8(4wCoHK00*y@(MuCtO_DG{zit~ zR01UvYw#*AFcLR=fF?OcWR9V#G?O-8MS|D}r8$!M7Zw*B=y@3HW75-KTVW{*pHgjq zhf4vk(!O$<T4*x8%>g-KC**fJy`EssaQHDatG0Tn?5O`!8wDKzBfnF6q`8!L@Y!&c zBKaY;6*(wPtJAKnT%8hdosxsyQu!e0N0Ch3H+3ReM|IiOyk=0)0nvXXV<aZ$Y^816 zpdb$fT{RzlVO0Dz($e21fF*F{25u%oY@ad(bys}C4PE)|r7hx_=Xdta9Nn3b(vQ$Y zI+*Jud*-(5GSOdvo%Q7KfkS_^*V?jZS|yVi8QB#r18qulp~abzC1Hgt%`ZmGOC(oY z$+moJ9Df5|f4C?JSfBV@QFqNik3C3JRrN<jvqq7@R{M$B=5#XsTMeTzN$AYcqq}2G zKTA3;n7il98%<()ZbvgOMzY|R;nrrF7cTVr4q@(?aH!ckeh@>3)i_W+H|#+&%Hw7Z z^2`aoFrD)%xwqIkCO@~2O^2m1=iwdk3)*$~RASqS`<MV|rPaUX!iSf+@V(^(C+27G z-;XC5Hf^@d_#DQr1^ab}GfAHSqZU=(!f9Nsz*grB6fSDTmNKnzS~v5Y9ECHdB_SCv ziTdr2QZv1IrvAk@eo_5A8%;s2Xu9iQT0#~~r9ek_q{$G-ja`47-u)!eF^i?;#A~8G zc%@i6Gz4aMp9@aEyL<RWmB5!fst-2JUYn3O_^4ielZijdkDamX%0zjlqHndx4YJOV z#?L>@qJYfzoqp+tp`!ZqhFY6FPJe}3VLvpkOXmll&2JDrk=T|B<=N<z^J)Ovp_loJ z7)v_m*vLF}YW$9qwRQRX_W-i{fEy|qrdCUVjpP*dBK(nn4eCp8`Tf}`!z5X2&Y*&V z?nmpRzcBS#{FW*2dWVkoN(YrFK5O5L*Jdv*{kA*=5~K!vtdAk1SUb=5(j2Ry`W0%F zr!(@?g%LQ&#oG8)3prlZNgWdLY=5m#v6;I*z5CMEJ5Er9I7I`|A=`gri0RzTCyM^u z^F2Hi)TB54OJT;n=_}|p%Z$*R8ARNrLE*jtvm-ZxGGnWEWdrKb=^UM$dx+i3lwdOu zC3zmuW@qi{(SGVolhg_0Sj=GNQZh!XQ~S1nycg}=;6QGDYg2R1;O|#k@s7@XG$0`0 zvt;`=Uk!G4+@-Q4Ci7!8tIN=pPLIXDdduLA9~XTyW#lVG$qlc5kj((Hi}%DxJY-Zn zOy%pDs@4p=XVC1mIyq?{TAEG+7~+!dQ`n#GWV%EJ02)u#zxt5!9nwzeeE5n-f3wG= z+TYv%J-fozj$!!-v9+Wns~&5foXq^F&UMrB5#z7D#}|Fdt_E`bwT;vm(f2<)NdJE$ baLROZ=b;NeWb*3oKS|uuG|;F}vkm(<+z^2y literal 8231 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 diff --git a/superset-frontend/src/assets/images/pinot.png b/superset-frontend/src/assets/images/pinot.png index 61f8cb6f57c399bc1b364dd3511f00308f260fba..0e92bb46625d061ca6ca1d93fb9b7da995d073ee 100644 GIT binary patch literal 7127 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 literal 68618 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 diff --git a/superset-frontend/src/assets/images/postgresql.png b/superset-frontend/src/assets/images/postgresql.png index 7befee8eff0b1b518674fa78aba30eec1b9ed26b..8d3530a24e77688e6b25684cbeba4b34eed97ec5 100644 GIT binary patch literal 16942 zcmdtJby(Ej7cTk%Mja#^KnXz@I;6WxT0o?vq>+^F7KbirX=xED=@O6<5fDk~knV1{ zo9{24bMA9)oj>pA(P0?&>|SfX>s{{-RZ*73x%==g1VK3Ra#E@gg!T@+{{Tk^uf@NL z1HcbVdpT_<2*M(``Hu#rq!B|9?7&i8%UMfFQP9NhHLH=Sov|6K`)hkp8iIty-0h7_ ztj(N}#%AW0wjxy94b4<YOH&c57d%SrO7>68EG*?b9nI7{mDNo=txW_>sl-H)!tR2g zg4brwMo9P9HnvWJ?jltG)GG+y-+atQh5V<8v$Y77#7%=pEhQD?6FWyUBp)j$iwQeB zJCaX;m4}zt%-Dp-n41~N$<E2i#?HgWF2KUhFUZLw$isvD_d^95bToY>s46A%@8-a7 zB2*U6&h~<AY;JCDtZrPac8=z390CFYZ0wwDoSZD61dEf0t+SCki>(v&e`=62b24$X zw0E|&vqj$2Xk={X;w(Z1I{U9tyte;uwYE<Go+&VAZ0<((Y#glYH>3KepsC4!%h|g) z+WgbFsR^5zjoE86TW2RwmgB!=?Jew_?VK#^{x7Qj@1Ost2EgnpDgC#N|7BlZzy5C% zPR`P<U>N_NkpE?ACv^{dGd5K-Cp#BM6EkU7&`s)_(bx+<aWpe>wsTasv$OfnTB-b} z%ScWxR&FGNl97p}?ad$<|A()bNf|ktiBN%c<6vRuV&UXc=in9O<Q3!*cnlVho&8@$ zmF!F{UwQnuC?{B477liG4t7CqZb44=|EVb0H>O6;M*ok6O-%$}**U&80z<ZZZDel7 zW^Zdwh5YYC3O=#3v2z3sgWhrd(+edfL3vvzXCqq^GkGZyDllqROG{HhUUq&?<5!%o zSh#rjOjx*0x!GCxd5z3ixQtEtz`o=a;Nju<&-bP5Ok8f(_CMb@{r~v=XO5P@yo_xA zx9hnvx|>ZQC}-&emdoScHlb$b@b7mvmdJnhfuNDe&HfglGPzk;GgGR6e{A``Jp=!$ z*3H5URQi9j-2W=(WcSM1&B)PA!W_)j|BDU92D;C7V~hV93ETg9kpKMcf3VyC6bH`W z=IwtS5%}f5uFT99_%BD`s32a<NZ{jU<)tLl-P1Ow+`J!XOpEO}y;|y<oPO%LogmJD ziLMHR4M`_<RfTV!vaFRHYP(>4sejD$87C>Jq&_4hOs?vA?rrur2uaUvk(y(n#fz)j z6lpkREtS60G~2bxwy93+v%WNeWiO;8+>kgZ5Pe=D6ACgKvzTl7#?EXy`~T}#l^18Q zGCNAt+1c4=&7vvW8ZBn!g180#Seg#wa?PUQRp*D1ou-^IG#+{V_uEQ{$+X%CV6BUe z+RTKhy-ThQ0#O)HNQZHxOwNEsyK%W99d$^|cmY|LHgn?0$jH@|Z)QIc90rqk*KO)p zr&lx_6db&M=oywRC?wSL<A=i2r=$-bo}Hh+eQs7W(WKAT^Myv96FWzpsY<6<r<nI) zq_(zp9R0Jt-d>($MX}-Dma<H&5Jdg&<sGhh*9KBj((r$t^|iH0+nTP0-Sf);Bm`Nc z5QcZC7RDRBkBEq<tgJ+#PzMJGJ3ID;>JM$scZ6p~MqFoG-eBCp9U2|IgArn;ow0mN z0<66eaiRJrbtVFQe1@=3MMc(jc6_P5PnN|IFq8^YLYPz~5>6hSx==fd2@4DkmX($5 zPv$b;o$vVb=MQ$<#R1>lwh}m**31_z=8lez?Z$m&OUu>S*$+L7=nw)%86#(rf*S<y z-zV!jy}S}fLX`1xG+<U(le)UP`rmVyjC|Hs$aCz9dPK@+yRo@hHL(dnh3ZTR3YIB! z@|^BP9vSyw=&iT!_k7`2T0cAkWBUC0b8T(y$%%V{Dr2IYg^m;gCjNbWUx2Kyq@-kP zYm3XgFHO{^zM)}a)0F^*_vn$&l*=gi_p+|8?tUO?&lnp8F0()4)926LSEtL(7kf`r zdu3ux6%`e=w8l`F1hKKPRMga9b=8?@;or88wTpSfJARLjz5tJbffzfxA#W-RAr?xd zU=TCFuu2ExjeobP!n0>=%*;Q3{)`9@$HL+Y?J)L7`2Sko*JV!Z>x&v0sRkVbtMcue zWL$SUdxV@+xK!IRE*l(7i;pN+I8Dv!*AvyC>H2!X0Ob7qe1`jcXx`JLHRt-wlM$n_ zXEvYj5ccn%A8mRa{V|Uw7hxg{cXD(rsar}p-Cv6A=}nN!gG)k42q6xkoos1R`okbZ zm*dN+m&3z6d3kwYP6|s(Y;A4n<Q+Q?R-0db^<Mf}w8$v{srVzHmi>?gJbB4j|8}?Y z00?i!C3`~e>QmyhenrpRq1T0;{{tkN9QqI9AGwJ|i^e%RwnN<-oVTHtavN#0#ULEg zqm4gmFJJbu|NNczl)~>~cXD#_u@eQy20ceUM)*SQ=0wf)BAZ`fVPW@=A39%5yC1nt zX1sg%efRtP0k)RjC1KL=YIz;HuRanIhrYK{<*C!evEPnVWF&e_W1Or-W5mEZd!7Hc z{j1OUU(P>vzWb>kS1cNOW~?2m54Gy=q+{S_wk_PVCzHo_3>tY%tCQFMF-DqL-KtKD z)<o+5AFh>?1Mv>}JJxGnHo|NnQZu(nlwur%RC;LWnuLFU{PC21kuF%4bjY*nK4ibs z^2V=3*A19TYisMbZ{Hp~*8G_vLfS0f?pxUDZ20=mm&MjQ6dUX7sXW#r<5kv!gM(<$ zqswX$TAXub-WnW!VbPIw6Ayg^gbo*n%fscvK1k=j$LsD;{45cZZm1Z^)gELyXo3TS zK~Mp`ir&=jpYjv}oF><T{$+D*a!MEy238S?N%;iNn4?%dWRPm;)}Qhhi|rkOg^aNu zZPqRg{T8DZsy;`@g-RnNQHW>+8`97J-VVAF!YYrSt+morMn=LlLWgxu>nM&z_v)yo zSwllZT1u+%bSX8Qkfr_$A7LA7Tsf)M)YKFfAu|ITTYq=Ac7y9?rR5+DZIjW~{kZ7M z-jZn4A{y#GCSxoT6CE9N2@Z#2!X1R?VKh7FXjvgtWN1f0--edAlZ!Rw#yyL-eKqTg zY6rIVC?Sh5#B&%X<;77M`-w2)j-)>kKdyv7u}=K`tYkh82MHr9?^?PROrh{k1~WRp z$F0@mE#$n<^T3QqMiB}7;!=KiH;6?~J5ymOX&g@om6`Wvh+WLxD|nXK*WYgdI{LRe zuJo5rM_EsZ_foQX$$@|#Ns(spc=hX4JywG%tKn?va4r3@o#EAGzDI@Y+~IPnKSJ86 z!l*DE8LS{^c0wjGgsS~MWj<pV4Ku6XXZih;-vRN&J}-k$>yB}^F7hc`_Edvnf5(Tw zj{?vRro<o!4&m9DhRTIe31n<n)rVWxEAzRgs{d|hcqx;{A)+uk^xAgSEyOaGcpL*A zhQh~_evazu(yYWDsyvVlF3iFH(f-e)R-l}alvGn$shBDHvRL!_!0kaBYf(9|mT*7# zQ26w3+^Y(Y?pWGqVwc>g_N7a6O&=B0<FjGTpnUkw%UV6T9W}8Y>x9?@H|5OqO!W!T zlY{1?M@4JzIO9=tl>Qd&=`gWCD1;#(Uk*~~`mpdl8MlV*-2-#Eh~JC!!K2RDBW@Fa zxdXpm2O=ODDSVjCW<~nv^(d?tU4fSP1Oz6=#$jP$%9)~%C@92yFWe`S124Ztbkw1g z3-;69rY)_l2d%1_FE{NhQ%Y>t{a&AA7O;JY;eh$)cq=U3YQOs}`&+!gsl0EZ?)fSo zZPiQ8&=9)Nr=ESdwu)-Gl9CgXU;S(tuNH*Py>4&Ha|CG|_a(<Z<XFLdXaBww9}gud zS#vz0+2}R<Jy{cK`4)(^{4*H?8mn_!o}HbgO@jpm27sv=9v%k%jI2v3nUhw`54|7D zfRL}!d4k)KL!8J`E4{bPF?3+OVQKL<ch#~~TNc+QXG%8ae6Y)1DhTO+H&m`wCH3C$ z#px7Ax=(ek#brfLi88jD;N|4$3=<4O%Sy|dINM<JRZ$=OeUCDYpTmGE<~|XTn~Tfk z2ZGkJ%u>*U;CmEX>+2ZMr29f7erRRZp!be*(ffP`cT7uKxSSMzMP~=S)S4%ApW9c4 ziaH<spfffDBP5I%&q#$mGl{$S<hV6MLRLm{?1vc_W5ABXMcE7sIy$3Ly6x)BsnR0| zDI_FBN7uQ$f2$O)%~!tD*wE*2_{HYtCU%?Rdv-KPWnl8fDDQ{F-xql(oE|K?^!a=e z63Bn51E;F^E$33#D!U~79U|ra{IhUU&DWw!N4H-^gd2P{{ox<H_|AShhf*ARN0W<u zJ~L@o?L{!ZKm}q+R8v!v$<YJ$qo+KC7)4*c{I;rk7%7vk+(qqNUpF&vCO?0{K#Ylw zWa&gu6mkg(H+;3M1Vf8i>G~0D=;s}vd2}_Ju)QsWfoycq?Cc#>^?E&R6b(`4${9MG zrIBaqm%d<1fS}C&<ApSwpi7&Gj+VP4Vcq@xFBty5Dk`X&V9t?Fs=Px^8B0Z|qzFOr z>MlbyI12BdPPBcDqWWMF=)PIdVRksBleaNq?P#K8Rng<uCx?X~<3sbGAlkXbpAsWS z6H9Sv%D%B|$b4H<MMfq_k*PvJc&f>j<jLJ{v`u3esvIC@!lksY{8TZzp(3B$vwIPU z+;N=z6diqfvC&@nv14$M5<=7GXZr$)zq{VTMxqdsK}NIe6GmEa(uOw=9z9~owoDzh zbM;`1ZOkp3yTwhZU#g+t)f<&^BmrOuDk-M{j?O?A5<6aUe3TeR)9CW56ZMz9VAStw z0u2@uLL)B+p<ojJ2rKTC9(x&LSK7#_7X0uI2uc;2-T9LJ)G|aIE=<Np%XJs}HO4VE z$?-9f)0}7wW7arFSr!uw4n4u6!RMv;ytY--CB1Uj$=DsOe8$d{5`x5;NLcXHL`x^u z4<+F^x7(r}@QIJOI9)NG(%_>(=*&b2n0@Fo<uqs^#~Jcp67?$WWieuaL+Bv{h@O4s zu6;NjBGMJM=7B_qL1g%3`qlk&Ztm!2hfSo%8tBlM1*L~|sD;1^E<8*)<%j2TfAM!e z{IMz5`s-MykauPz+f|lXT&|nXIX3qeLb7s{AkZCy!Z-?Vp&jZ>`X&Y=_%FzM_BrwL z5;>^w$ESQN!s9q-p1d4yqk|yymb(FiM8CQ_>I!e?=u?_lL=idP<><oFb_j~#Z|kmS zC8wNk&`k7y=l?;UTCIC!<P5FiPg;CDiUPCTAfudI%NWlkbb$n-N5)CosL1=ERd=m9 zJIb-<FGoeErjSw)<>QW^%DpazSuS;PH8g6H^SF7=zS_ax^z=OB`7)!QDdwZsC_$a@ ziz<u;iFOO^ISpQ6TvuRG^r$n=gU@KKW3=Lx&!rJ%6%7T=&3+dryREG_#79rT+&<=4 zl&8yYr&2|<tfXo;`VVmiQDGJY4=YIZ&o~ShJ9VuNai&n+l7QQT6Z8$$z8dwivcg%H zY?r8r9+-W{c3Rf}1f={7$*6O@JW=qhC-ey<pyykfd3dMRa8n%f$#WWqD=QH>an6*m zUymW^@bJ*JL4=1#gD&pnZyex`n!z#t^5sjiE~eZFWmea-y8SzRI9TW{SOKa`0q=e> z&_0_KeDW<sOPRQ`?x9dG&!eS2v^!7m1dENWWK3Np#|GULw`&^i#aDgIB_c6}&~{D) z5>(Ip_#P<tggVvwcqu$AO0B<RGfkda<Mzu|T|TqcM@B;P=P5Ni3`NELMeFTD=-1Q~ z4yB@kLbl~u@H8nlVD3=w{2>S-Ij=e~H!}y|f-veG4JLXt=V@tVM@wwaqH;k+b@j-? z?kBU~a!uKlbq2I~vV+pNl(V;JlGqUtp1e53lzNVvP(xm7!}e*z6fG^5#7tcwEcHy` z@dUY^>bq1j-<g2jf`^_yzM2Zr+=K6AAxUm}Ax|CUwElk4^Xb+j-}5i09s-!1pGK~( zb!%#-=HEa_lsDSZgy25l4-x2T{!|fbaydGPn;`K0`}gtj@f6FiB00##CPY?NYHDx4 zCT|d$UC^RICco!pprtEj{{3;J(3B|hQEBFS1;60=h6rKJ@Z#Z_Hsr5BhdJ6!h4ab2 zNwOdw_dHNk%(~nQiCLvULj5i8O%Mn0r)6b3J9BLSz#O>?>qN40>b+DS%?V0U@z#)% zi1pVOJKud1<|g{MXq`A$iiWL4I&R+J`ckqGg$6YqpB6?Mr1ypJE#*nm1r<I{IhXa_ z`s<OA`w^3509)x1v$cNn@lUlH#nkl7@4Eq0k9Hiq!{i_2C;Um*FBo(?;>QL~4D7EW zwWnaHDJdzOoSfM?IoGMW+_!fFRP_Grn#nJ82W?GD6tpcaz+iZPW5f|EogtN0mX4La znzldFF5>N*yvNc{E;d#>Gko%T>DTKg>R<CFjrL>GNZgeZhclWv=jtci&r6RX6*AG& z%blAXt<@;@Ve@wX$v`Bwm-?-p;c~Hg<rf#2i4Pw>WMyT2`t)PbIVdnN+4%>=_cM1M z52gjf%=T;9-R=j`@wpl`Hw{{vXvvqU#`V-7kJC^ZOf89ztHdiS6|_=ojs(~biZSF6 zvw>b;5D-j)xbiL}?$xZO_<Y;PrM{_0L3L*~nYZXMqC^d4xmes3rC))CZ~xJmlMPv= z7*Cjo0de#293CHEuf1pn$J})<%R_6esA~(q4r|@;^@-l+w-@6hKDNt6K4&qpz{7_H zPs|7yifPYO<b2#RwA`QDI|}v{p{3{8NK1D<_`|!!GUJe2oj01Vsz6^5WZprFV<qrJ z4W5P8(9krhsWVftDc8H)wN}y>-rzTYvRuILvn@T;*3*q1>9WjoGvK?TZ@T&gHpycy zF13Qea^{JNiPZQsvO*1okI$1PpZNQ~TXaVuP;x9p>k0U9v>s}bC&|SnM7$3kvDrO= zd|po9hGi9xW*`c~qle1j94qr}(=Zwcl0*OA5kIv!;aYhc9A+qWN%>sk^7pH5wRh6U z(Iw{_1`5g8-dBFwa3_F1)YfV-6Gj8bH|C<@kwHO5c5v$5TAho8KZ*P?YejTly4#eq zSkue5`HGDMUAjOw<9f&9Y4j!^*Ka?s%l3GNVo5r>!mMD<zegutKT9qPQm*Uv|3)pi zC`VrxUpMG8p7*Eq1|78yr$+mDe$=5fN$jO?n;NQYheztO<OI0}yldOsBzGn+-WaPr z{@J&H!?XGJ*_7bs=nHe4O)2K=>;uPi1<A<5b3aCag=lGMZ;>JkdU~)5l$GEwWY$cT z*}7DSN}K2*alBufSUZj4gH*}tWV0u;vW@=t@jK^^d^A;~5mNByuoZ402;!L2iA7Np z-9aI!&~S9pAShju%1jCdqmieEkm$S=MXCxAMCjJChWT!GLYgDs{AUDLyX-0%Zr9dS z0|5cSTQjG=WoJPH&(%BvdS!O(w*5vVywzhCf>4P5edeAYi+gElX$@QT))yz`d$Q9@ zdrdXVieAw^t?lg(dP<_Ogqj`hnyEU(s*@3waD2?|_fb*To4A}NGP}pZg6->FpLKp3 zDeIbP^OfoGSr#c^f<jau_oe#bW~s7j{K)Gb2wJUkSZ`+bTHpWD{M9YQ<n%f@?umCz zE<PI)jp$Z=8GxvQ>8yNwZas-C0IPmI&hVQ5HiU^+Z!(;2tP>%_aqFSv3f2ys5??ax zLcbFe-rYf^FAmOO^rD^_J0}cCk*QEe^1P9`)?Stgjk14#Q$!OImqc~u#_>77&!Zvn zW|K$zfEa}Q#r+rDxev@!mt*u4h)ku_XdIS)CIjwj+G9EW`Sa&(<N*t{pFVwR3%)0I z@au`CrKNtU+e(h1;h)W;pr9b7RNi!9kG()5{r9}D$ECMB{oXF{OCY4E1`^V9r?^%= z+VVZ7$+o7a!%ot?mU#ZR^pz<&|J0te{9saEuN%vEweK{x2D5LQ%thHO(-I#w>}@3z zs8Y*{0v@1y;7n}N@j?Io_GYoSi?w{N1kY=|$!HJxW<3**GUA|QPP4F9Lw=t#=a%i! z!oPHHsam4zN!J^-z0I*$Z3r%ipf??JI7ih%jCrp`&*5IQn8dTFwQ7l?wp8N0aI8^{ zDqICb074S}%dP8gU{(h>oBbD_SL%rJ2oXZ|Cp$)^qe32ge`i1E7y&A%T&vMyAX~s` zDeXE|0s$);t~Y86qR((QK3p5_?(Q}+T0R=O&~ne1Y4mV%a@rR;o+KbA_f3xCe8^kV z)#adC&Y<YEn^leYcJX)TQHPRdL8*C5);oCxYr$sL*P&dWeBDg0qzA1+R9QV{I|J5u zo#bC0cls=PFwQwL?$5mJde2Tskw6mE{r&r|RcFHRyoLhVpCPer+}Nm`685(ic$jRw ztt5ava<2Cg6?<%C5g1QWm(7S0M~G__<Yje9;<wkraw4+6rmEuLNv0t-rUT6HSs>x> zGL7#JKK}V?zxC}MGfr(8na&W|Q`>|m0my!8{Ll!Qg<ifHVawmS+1c4(Peg46T_6IG z8#B#*muH8XMTdKj%(#ievf)%M`{V|O+!N;QsfqXL`hSMfF*3F6HH4?8czxcdqf_dQ zYRFxXNmZ}u?M+mW%5xFv(0DzIf154(C0I%%YHn^WCME`8ioa5rXcCg|!?GADx}ui` zq!0*c1Oi<`T)5xBf(r&=QugdI_k=S@DyR{yri%OL!-EHpm83}_!>e|bMI6)4)D<4o zIwx!#MAfXDAS*6Mll^L$9v%7$Xp=8rzJMsSv%OvK0AGf@C2QCUoaMGP6M%zdtuLZr z)~bB0g}Hn)Aa15Y#UK2WZ{iN8$k_Cp&nM%*n{OxYA8c|FP*oLACE8gvU|ao3!*o#i zL(3QQD(aac?r6%RjGPDQVk?tfX~1+PM)jO<P=JQQfc))q6lk(A$nLQn$wvA6FWw4_ zpp*Z-Y|etqCSuIOf>J3nxX5lx!-FD14o)%7pH&^|>T%4CJ75~^G;r#|C4#%|Kq}#u zdGGIv678WYV2>(xhb?;e9&b&#HuwMv_xkd_WJ><qehb^0^R#Gh(ahdg6@P5ZkNt3Z zwvUC#aEpemD*gnqj3^>t5(ugoi!q`U2r3=5uK2Uz+Ay=-ydpr25+;vso7-_0Uf%9n zb*|Sd$>PIaX8&kPFpm=vGO0UqHt^LkX_+dR;5kb1$M-yLR9Ruq<fKVx^sij0bw6>e z?hmp02_&m#r}ef)6YC8_f>S2Hv^LuArU<%x(qk?C_!0ZWhpw1Pk@mH-{@*0_5F&p~ zMq2oH$HxAyFa~tJ53K<Rq%=$#4^4TeLbz5-4INExQ2piT?Cy^v(tPttU!|j~!D4bd ze-tEX>UO4;sMbRg8R6golFwpY*Pc4{sC?j`zFwWJV-nEazkgqE&4+ji-DBFg907AU zvS|m9X`w5ckDFVoSW^O_&ZHqJ`3<m7TwGlJ@@Yp$M__BOtyvWecJB+LRI*fP=;@!O z^0F{8VnQunHVV}WbaZqC1qHPdr<(ozTwJQ;XqXrnepzq_Ak{TB$;EsdtEz@=YcL>Z z!Iz$%XFrp<+S=OgJrewT=xN@YB0cCVE#1-5(gGU1bNluU$EvHl?pXKx_iu8agMnEM zP)A}y0^macvp#G2_wQfD3}FGzJueX@M@FB)&l_QhU%86k_WP+g*B6!|MVNRMALYMT z(csjP(qFN|k^E@gGG~95jiXS!cBgj|#ZIYu2WeF8Re$#AzW&LPai^_eUVc7P!VkcM z{`m2u^5>+3!&xFLRu>j^|3hjJH|wFEV^SWJH}<R(#n_J(z~K-ZGEbe^$f9Aw%*BIE zXXGAbZv3y8griXlhZXyAUt+%%m`ZI43`nWMl*BVf?Ht^PILnn8Eh(JOJVf=VQw`ps zL-4D<=7Zl)b2ggDJ>Dlw*@}6elu2e0r_5BitdEQu_%#(5vxtg{GBZaYL-O<U9|^fK zB>b4LZ2+{and4~<b@NjNg$$pgKYM$78yg$nzsm&~@ka?cE&WVn(Vh0YzPw>`-*dcO zsBQ8(-kPi%G%j~<ng-`kIWs8<NpeccC)L7{QiJOeUAx1B11V`~X&D*S`@<t6M~g`Y zp#1)}-}Sk5Y17Eml!(ikdP=_A#+U;L2phJ)dX1L6^g7yjUZ_qL^L^0~4Vtt)1|Of# z1yh_|UR73d7i;!>vGMRYy+h&sE+gaWWFh)lrs(CywuXe}0flXHweRsN!C}+7Tjn2a zb)u5E;ME71Mk!ivsW=pfNJ|Ea{yK(+h+21Iv%xWxOT}7N?_(=nwtOC7prN|!*@RXx z^#q^jVj=hz;1hmZa08z4@?h{;^!-PV#3=o|W&T#r%Ooz)Mp(4>(S65c;Q!INwKpM* z#zFm%Hv|N0;xbhMNO;lU=<-g~D_<T-amuV{%}NR;J8i9ZXA|pm-ahpYDBmFArF^sY zr)|!Td3xATS?#5pfsk@R?9uTt$Xu{+ayo(uy7uvV*RwcYZqgM)ElbF(g|I1oJym~L z-bKzuj9v7iG=twEyVcMifs2bfGCbULIHLRbMah9@(><{ZcBMhy)YrW!JYW{Jn>-Jd z_@?ep;zK}mQRa7j6-?oK0;Y1h+(g#d`5>0|DV=iKNuSVmd_n??!PiMccEJ98{P+=v zlvns@%mfn?v$SzfL0LI!z#^C7$EvfYy837BidTz264KMt$)o9sYZ2f2`udU#e6{J~ zn!t_&A`AeJks;#9oxL8mQk^QRfo$oXB)0zk{v?Gw$RDJZM7)lKuP^qGr@gj2BT4C% zQk+NJ9`vQhrxE6e4gXRb7<2mcwI;hqXU6(`N%4-nWOBs7Co@b>jaQA7Y&^muBZw?D zbT|V2E7XsM%#;3mYV8yqrNByu#G5^ZdO}Gab`5_AHWx!9;I=i{o646I9}hvC^WPFU z%LnHYBIcjzl?5dxnKk(;(~(~VD?;LQ`PmT)kof3_wt3tT*<CIcWNs{bq|XtHtW|+| zml+Leie12C@C_5m6OW6uiLM_sm5Pc&J~p)q)$TgCp${KdR_5A*!G4}GfAuPA=^JJM z11swi|5n;p%BTfl@@EbXyY!jfoVJs-T@-$LrK4`n&cer&P7foO-rf_HQ&uJ)=LexA zSoUuy%;Ooq>l7aAlKQnzAZ60o*$II0q+<`uJ&}W7f4q2!vH7N))igAQEBZyfPIl&i z!Lo?lJU+l^U=qOZ!VK<%psZM@N+D;!W~^*(!y3?e73TeY-@n&_O;S`;6g=+3l<+Al zi;|k!1Z)xjD9FcePBJ#IdW|0YBgMLIt`FM2fB$aQli1PKH3M4ryIeQmvl+ARgXO<x zS5kbxl!A$Qsrjt5ci7sM*X4bGCGODi*jX`1i}k$7Q(_9FVN<>qb8=i#QZ$uPFPpfV zb)C(?i-IW8(cx^ImBbh(0%Z`CoSbY`RbO6SUeUxdV)~G%NKAd8kD6Oji1q}dV^0|J z&u5T>$Up2`CrU!zzM_l@>7;fLq|SYafFd2gVnwT<H0zryPgSJXvjc`2N_r=>f3NJr z5dLsTLL4q$)N_4J7#WQ-$WImp+|ugdSw}cgT+RyG8$>Kko$uutFqEA%w?KH-EO8&0 z>VgbUCSo+*8rx!!%{-oR>sKzKWJ*{IrO)7ZUir1un~H^n1v038+YWVlPws_2S?bR; z(AO6|Q1&<bBaUp@_uiqzg?9d!XI52Lf8FgQZKJbucR%@&@EB0<`<bL2`)|YzfgzX| zB=j#&eDx86W(Q;`9#t=`4Zkq(nejOm0R~Z^oG$2P_rz4yp;4WTqVN{v;r)4{OR(|k z$aXzBe|kRX>sfVc_NTr*SEuMd<s0L>jzM&2_NVB~Y$5$KqYV6$qG*&dQt~8W4-i`} z6o201e$LI!1z_3xbTR4t9$DjMlu*G^=cA7sh8{+!`c619h31^u7V?*%4IN^-{Zceg z%efE1ik1b<)8|UlNw42|lyO-w4oT)P*99U#7N@P}>)GlqCgU7qdC=nM^7V}FIUP;v zkYjnzg55^>Upf-Ilw_9d?`-$TFE%Rrua5n$-QuS<;gk}Ht)}DY#>PgcPE&C>Eq>^L zMMPNG-Oey192^W_2LLbI^b40>@%_8R#A@??@~8z>Rn@y#SbVR?VNflAjSKVh>P!#h zW4V>o?(+a397)O-rINQkR&H`P&=`12qH)8up+exSo(Qb(pUy8VG#{JZ5jQX}015yj zBO^V%wBA=jev_e6RLNjIgti-<fbkTSem#@iW_Vj8#gw0CJpLh(Hpm*w$vCOpTQ~YJ zvbe(_-NyGge6ZUnWyqpfPvLl6SYNE*M1opO=<G9^{yPQBVx19@*~XRBWDZ-!JBgB6 z??rviZcJQX-}eqodsik$a>M>qw)U|cq`;w}KSMB!VlSq8++A7qQG(G3I@9m>@+bH< z^rdcr03N`vF*y9&jy?cmM0WJ=vb$;g(;um~MTK<yW)4rW=;{4VTy9Z)Cyx8{C9k<* z#`pZ9@h@@H#HLPzYjLaL%?!y7Hr}20@co@DU-7E9ekD=40A!eCq@{12`v={k#Kyw1 zwy<DN?WK!b-R+_{KK0J@yYlexsM9H?lUFU)EXd8Jp`|r5HO(z3;QD#Xuc%nFNWYZA z=z&%M(%9JeMq_c^?T{v!rBXC(ZntpgDMJ3tz+k5Bo|qz{{gk>79$?=v^+vqKhPT4T zKlfvlXlfVHFQz=1-W_R^0Ajq3kdGVfWiywajvh{#9jhXG0}gFNrf)T;C#|<D_#;!E z`ab{e=&dw?M0+Ps9sR3l{9Gml>&+VuaxKKS$w|E`otJ95Jx(?{m7;8nHqR`%-m+>1 zK0-s{#n3-IpYZ&76UYlV2u1UpXh+e7X0-=EWz3lmP2P*L>LY#;%?x=q`sSIc-$L&f zjo0jJyj&~{3}ob>8~&ZF%_8C&OVyKdW)iV>iy)2xeQUC5d1WBS4H#rRqZ+H_D05HL z5si$uIBvG(LrG$rp1+HWO<=YGeH{7EQ&m+}TwMI%!2=q3PvH#da6%D~dZdf99J^Gx z|G-<0Y|b=IdHI*$?Pbc0IDdGSIP$}=6}@sAzq95tQr;0DQF(d!`|=*%8<`^%%!R9Z zo*HLiW)&ZwA8_S&1?Ndw;l8N%+9Yq%$-uJ{)*4sU8BItwtRG6rZh9L<;L^mI@*`{@ zJlW1X%b1#Y@XakqPEj!pFaV(h^lNKtT%24^v2Dj`R(S8kzhNEmNkIG=GcJ`|12e?0 zBA>laC%Sggep)MY`+BgA_7^sfoun|0q4bmEfpKy;r92{u8_NI^XQpak&WJur5Iak? zd|HrK=gr)OMP6h6TtdOPvTynD>(RKiVEWe8`F3;eQ`|l$^4>)JP$|}=n(FG?=+wR1 z9I3tBO81JH@<)Mg#|Ky<60vjYO&)D-Z(r8bbh%kG<9m5H%JZ-{?wP2-##<wRNC4c~ za6J#i@7;7A9U1BD>dL$n>+e<zGBV}VHa4Dra!-UNMlPsH6>hW>CdJ)*s@>2wF=S-9 z_GJhCSq#y2q(79b&Z#M`-)vCy?k71>Lrv~(h26ttMY%A}m*c;!yp*}CamJ_*_r7g} z_djcC(IQ_Z&mCO{uD~j_*Y#kG18QlH4`FBuSd>v9g!#wkSCbXK-r|-e(YQCo&%vX> zw{n2Hh}VyGyUIpFf(e?fnD5L$D@e=oYmq#Hqa~omy>m;<TR?&`PikG)(<UM$jZYvs z|GQtQf!}<4XsX>;0U@FD-^aqA;<79SSy+mJl%u$KQ*y%D%?%{3P0h@@O}~J+1mLN< z!a~cHo&*ImEiElg&5?jxSem8!>4}L)-SnB**w|@J!CCEqeYq=XG4s`jNN{Aj$*Z5j z+Yh%%KQlgF{pCv$ettN_@As8PK2|o0OuNcTV@Fs%Rt|U6;=w#?QIS^*N6JJ1Y<BO2 z5}ih#$@E}jH<Un)>R!6-AJ^J(3SwXO%d)kJ+tV|;t&SG2Y&TGq1AQsv3!R>Zw+zAn zn%^2LZ(BZ$c#7MvjE!Ya-LG~VhIVH&15lG5jc>kf)HYA^P}5JZ9F(Ie&)#}NAZ}!Z z(xiP<CK#>ZvJ-&J_MMeHqCve1Ht#I}NjsGP@RmX(M<=RKNKkMZWP``X#sIwExwGkB zNywr@6W0x}ViQ(x^q*P>6La%rz=vQ%{N5)!InknL-~`2K0KUsqOY8m2HiZtYE&`UZ z9IT(A@3mP4q)K3I*9LNA`>*!^X-}l@K9@}p9j~y+GpaW@J^d9xZX-T>elh@`^_o0g z?D3;RX!ZuFotZ363e04mZ+;iLw^mVW)leJ}62iqqDM2T*O86jO<$j&(i`B%p8aXyi zN4jZ6VoaZGDbms&R)bS{Il`gq(KZq12nH4e0u)iRAMqgc&14qo_%$^AheLs}Et(&b z5FJT1xAi+QN$j$d!q9w)zG-i^>S=y{VctB%c7pbvixCe}an5h5uQOoHmwkE1_&vsR z#1_Bi@!Yf{TtYQoRE#<W2X?g^?Kd<sGVOCbb^C4Ws`L2f(bd%z2*d%zzF0T7_T2B~ zdj?`z8(EDVmbsNwFSUHdI)J-t>}Iakib{2u6SF>}K_GHFTpw-T`|<cj@g?Rb3f-Kh z;9Mr<wE>|3zuyZ3ze^W@I)@6?-sa#0IGF`Js10~l2<#c?D}b!+2Azt5z5vx#b#*mB z_`v(z_|UC}Z6Lnu?d}%v%52l`0l`K|^VJ!Vfwx0j5YDn9i!%`Qy(ks6pKURT7D-G^ zB^8bYjI6+Jr?|hD-*NIwS?d!#J7xa`vB?+HqO(IqxlViY0bW{;E}gNKmb^*ZbxP89 zo6J>F{9Ra->Qj@)1%5u49`b`IsX+?6)C_!+ll}q-3L#hz==7u@gv42s`T@3H=#0z+ zfvv_1rF1^V)yvYy>*IH1Gpr@>VDlIT<aS!z92|T+oIE3C^IO_Hn;5+>6MY-J95o~S zReYi&bL9e2M`!3%VJAjyzbs=9yfEziJOud$;$slEp_9LH#oNu-qW$|oTEoQ33Mi&m z6$0tX0mw#uI|GBvwz-g~sH^jt>l>$+Sy3}<SoBoO_6d#W#co%+@-nGiV>t-Wz#(!= zHuD}fHkp9q-(Oiz;^>qBL7o&q!VMw_08_0%>;?ShIgozEq@^*($Y~|IG)w_yQYxRF zvYedzN>*^dlS;W*W@hHeFJ?Uef`*5MDbfvsFtE~oPO?z_tl#fyzqn@l3`EYf_?Yss zzRj5nwSOwi#rD2a1L&LCVT_qUDj$pZw(q2!GjOqK=jXN8O@Dnh+DtCsXbN<ObaC<s z6wu)T4dlk3isc%hWC4aKI228o_2R0TbnpE2R=w-~pxt(<4SB7tl@3b3FN7iXqWb+k zHe}SYuGi}cTn#_Rk12RDK%J!27lyM%`TN6J8_SDOORI^2`Xo^S-|Q0W?udw8Mmz<^ zCou>~bV?dzE5)qW&pr|Qht=eTuh**aXnrbjnst&kA5Xo3_1s;IY!W4OAS!w!q4u}^ zp!|^81M_LeMF1dmdNV|HOGoXd>Uk(B=MJAm6;HT?(X_zXe6;jc6jtw)WS$g}B*SK{ ztgMW)b0YHDAw<s}6&@}8<HUR=zc77~5HH0i%gu7m`ySmnHVDI8lpK;y>l>dv)Kt0e zGD3!f`AWc3N!ZzyPHfV_zgchtrQylR31Cgi%F4#a#{u60I>Dk<HVeW%{`2DIDO<nw z;u_$K64?xVmDS8laf3~OY!fWs*5)QoR3=hhwRE&UQ_K$#i{?b9`{$RyfB&hpR8vzU z=-;Q2zbzZ5koOzJEV{OJv^+d67A6IQbs$)qY5<oZ+yIoj01`n=To0f=1rl~8B_-Ze zB_Oy}%m>P;p&`Jvlme|I;G%M5qd`6CLT-TjnsS|Z9U2<CoLMn!H3dkAl9vshUS4Pr zobn$HrETq8kRh}0HE&M#UbV}_vv{7vGxRh~#-6Z&PHBswyByN7a^koJHC6rk(}IRB zp3VxZrFT`yYaJBqqlOTvgAE=t$<er@2iSs0)PRhJem2MC2Sm*Mo_*Gu=B6&!PcCIM zOX_kf4C!C`*IwPas@B$a(-#ueD}_NDthVlkn=gcW3QdjC0>Y!bU-YcDl}>Y=Z7;Av zxXch_U#Hi6KDB+rNxjhbSbTGbe1)uRW^Zx?Ej&Cw$j@}i;|+eyb%Xu4OFl&!`C6m4 zbHB5}%vV3(m(Pw{E77SrDmbdEb3^Y4V6pxI{>sB{H>#q1<qA}tA<M71d#HB`lpYJM zr*++P(~y{jQ<15$3=G}3d1B!e1~W>f<Q+k-91XsFyW)=Y)l(2cFN<9Z@E_Ci^152s z!6`HQ>EQud%;cA~#gw?gInB*8tIkxYc!j)wR6K3CGso`2|LCM|qobh^N`pWtR4|xs za5rJuBf4v0|CAvto8ePop?sbyPSYK1&7Ox=$+ywpq@|H1C>(+_5H@qLE8Nfi6Rrlg z;njWiEP8Mig|Mp9dE3e^$)*+k$9L9rf8bMJzJBV|-0>b6o4;WzW*7=vX*J=?2Jw_j zAmb^?fU)QM0)oVaRH5GUr>W7SZZ(JF#jF%v)cWEyXmFr>K&diC{bqa>9iE;>Qgvx@ zdG6JdzSZ)rTmBw%ax96Ru=eO-XOt>yODKaR0u@du6#H~#ltP<-kGGlqBnAONe;rSO zmK8*D2LQKB+PC3=bk?Yng5I$-iH|-71<aoSMjmjToak^pFHeJ-sIl_{N<={Q^4d<` z@Kj5Si-62v5)|yTar5&odnjSQAMsg!b)cuDSGW8M61O;rWQO}kFWRN1@w4(cwyaG% zf5@(_=Mtl}S*nG_X)>yjz~L}7fhM%n;f38l*%6=MO`KZ%>NNODDctg<*VE&!t>qhH zC#;MKKb{j##46-bNAQRM?{_y4L^}{PJ~5H$z1Iyy-~f^d@Yk=U(Ez>k#>xr<0|Q)U z%p$QGtlx43^CO8`WtaU)2fn_aYbzC1uDW{UBcz5tzU27gtav1qU)te5@0BU*?akkW zP^m3MbaMnvT-rR*^?MpUJa=@iok4}kp;Wl2SSkOAC@bM9ae#j_*5JdTSU$J(v(LEz zcczlqeOJ2c_4-r~hCs^j2sqfV*utQeH#{_AVt#Yq0s(Vzd9mLQj-RW%3P;yWtJm9A z8BKazXm2tJ_#wOZu@?=raq@7$^PG2yU6tqM-GV--Fo0tLEKUI-VSVG9<F8C!a|?C| zabx(F4!@Ctj_Iq)l25&gYDqilD+>c@7c{VzB>IQfCr7?9A%Yr%P0Lah@};UzNdlnH z$P=wx!Z-r_h}JHkdkpIryVheS><1n#zHpbzh%*^%0>CQ~vFZUV`%#4<VE+|NV#l)y zP>46Q88sEv4MEW3hKrEoU{Q$TrI96N{d#x{0gHdS(pdSiv2yMO24-xCbPu7TiUKYD zTEnuUB03Z%r%KaBTP_nofqA_!+xix;+CDZm8%xom3jIGXK7Twa=R214r=e015AkPj z!P1Pr&L>%Yyp>Xz`1B@EafjUfLqmfQ6Vnevc0HG2jn*0NsD<mgioX=8;k4Xy2W1ue z#s(f1Xwvw8zFsrtGu%HqvY$^o!2LVAD10_c;OXAO`PoD>LTO|<E~nZQJr%-K@&QIt z&vpK22$W;x=MtJqp+i4<dNP6j9FXL!y45y-Zfonix)dn-`0?a&+s}?Sb-6D+H6x>B zzygWVFRjVTGXq#2$dLL$<`OJS>4D|dcdbN%Q2Rk6^_|ye(eiP0EV|VjRipY|=TmM5 z-n$*vbo4X7$1X?A&EOIOPdv4!H}?8TD2`WtOIGQrK7U^Bx;YL`q8oOLhlf^>>Bs$7 z*$m@0ZrjYCUe>I~zo!z=M}!w9d+aJCk1g$e$@xg+iyH=2hR|Rdx8~BcJCL*W+?A75 zdw477MNhU;N<4!PN&*c6a2X(+GvMnyHpa>?E-q#+x7;X`G$DV`79YUx01Yrbe*Bn) z1t&@eDIaU}9*{o?k6-9-C3Ka*(=>B}b+u+dE+H9ka^NBe!0;AV7pEAS$NLmy<Bqu_ z3(In`wSx3Z$wKD2UCAJIr1@Fvxr&PYLL}eqa|3snmF}6<_?@sHy2nXX9_VREI81ud z@AdRvN8Ddkhvtr|`5A+4kw2Vggo*x;Qp~x*%ltE27Ywn-JMb7-YucgSpPA7Yda7T* zsSD6QxNHJ0LICUb82iSU6=3!UAn2<r-=rQ|cz_=3=&Ccwi&875b#}tZHfQ4E;`YB& zM+={=<N)aF41x|<*CUGU_c6qUk4x6&v0uz^K7K5qv+dddx@=UgwFRzmK;o84qa!9& zy%>ENqPlL)ZCkq%=)Y-_$@3akQ#N#8Eruk|Dt)aK!$v@f%O=iu!%$>ByxhD1m9Knc zh^6rsZSJ+*USD6g*#1~@6D^83%uBhs@j-?lpk!;@`3ACGeiyp?1R(NmMSt_+OsXvN z5t-I<{d!3QxFRzOvM@K06YM=e_}pX8@J{Wae=tZDW-piyhHx-p*DPW;-DpUQk(b8t z$?TH1Mwybgn<P{#cl5ieal~MS@$Y$T$iJ^oxk+CZ(OOj}GqnIj=nHKwoMALxo((Tb zF07@c1NBRT5x1Yd6(qw=?R~|Y+UoX}y%Z=nKp$-5U1T|!@6WXeCIL}-xv{jG+90?+ z1M*1K-luz~`^&3UIyHm3zDqyrUDm&z%wuIN1Hh^e_V!{=61|KSg`V)AWfPGrkQ9qW zwqrl|y!fg@M-1E^I9MHgCUTmqRd{@-b|9KG5Q4eif0UoiU~Fh;xINv}O1S{8mz<~q z-7#Rb=;`ST^6~(0$O>dHf`VsvB1*oMAp$V0i5(mq>>77F0XWlARRst*`m;7cLVWzt z%*@Q>WLio}J?JId*AtMSGzQ2U0JVnA>WSF6IA@(=DJr~hDdB#h;;SgaiR7>_Ks0ZH zto+%*Dz_4~z2$nAIOM}jk^dqNA(#$wz@EUYZ_xC<JIM70XEOvD-M@RQ4d`AXw0H^H zd<Ayyo$Y+7sNe%9-`RTU_EbYnMa4egI0e&f!4<P;k)yGb-35@(tg@Y|2XPj_Z(9>J z&j5RupARwxKNcOMySUidRWvjfT^lr*5&#^P$H#}EL1?YCho-x55*}5^f7t2?9Na!4 zjqD8feGqgRFxOK5VP$0n#AM~b3UYJXH(jGi`AW*lRG0}dprt+l54R>k*8WK_F38@2 z`0~x0Hy~vI$gbJ@@4zh`aE0m9@ES-ejjbP2q2yu_gG01DUl8aI1F<25-ZN)zj0TR4 zB%C`V(ttVxPvk|+%=R{rU~g@?HcY`O-?qMc_wIu_)7wYSL^Gewo@Ple%gT$(Dd5Qz zV^d}o6a*vT>B`3@dWfJvb}}t7^dKW+6O;aoS7bDBbO{7=&u#i${J$3Fz7mi(8AVPU z5a2ZTj}8sxY8Lg+hy_LRnAq<9eHNN;nUe1#O2G!dj|Q$5m{Er#KXmnX1Q+H-d|y81 z<KY46fr_G9!?7_G#yaQS+k{;XatL@VBJ}%n*ZL>W1#{^rBQ5sg@u{w^ZritSJK_r1 zZEsviIIyV+!!h1KY&+c2?3HrFE-oZ&J)~84IanO)fD?ZSLUO~CxkC*0jU==?BW8fN z%2h4wSv1xL5`^sU1Ea3yw<sk`k(gsMGZb(b4SqK<voFeMxuqE+39pSEKeT<(5!`8l zT2_L2cF<#=OQDo;p_Ppl?2=J??Pm|#B++p{_sD^~vMFa$&!Tf31Sv2o#Sl?!lY2`O z7bdL!#fQY7Ji%yV2XY~?R!ozzezKb{uqNHHzI%sAYm_nfJ`LMLEf@-yjg+*6$I=w~ zu$BT4sMFCn4l(a5urnh5I(pcn9e@2Q3i&HDW=X5mj)hC2O9t~HNV7Ps7JW01!S3WQ zV`qkg;YlH+>`6lQ_8go0DPF7g03M?!dM5)Rxq?~7#34e<qVO%`N54AYxvZ;ngstwk zL7+1%w6uXV-C!f@FfY~GyLf({?#HB7S6JfD>e^!Y9-17N1VLksrvw?xUC|WRZG=W0 zWd`6DVbTjAN*}QJ47dr0JsPDLK4m4YPkH1N!C(1W&?r&vKqefJYUYHmc+B>bYjv@= zR|(+Cq;AvZtHaXLv0H{?{g|Nf$JEr+92^4+yEfyM-NxlV)6=}SzX|8XAC(Dr?J{>c zrL{Op`V*iF|7N6lT43I2Kl8cnR2~E45(s1UfDeo0o7MtnQeG)Wn=j#a^9+wAh0Hd# zWJNllWfAl|u<-KoQdb|!4JG(Juc&itVgHslTE?AsS@JmwDG!TNlZk4aUybxuRK(>R zzD!Rq8vT4a+I*D|6SE7lrXW^(?DL5DsKWn6Z{5b)`g#(Jt}8fcfxQhE8Kj857Nm~h zbxQ{KD{!MTsW9K_d{R@0)JfJ;oG2av346Ee%k6(9^Z_Kg>;$~R?-%|?VnqC9zIVYy zT<>RI>uGBz$HqEtiySlS)&4T%X1K2qfOMCb)f!oJ#KldS7}o)25AI4BXcv!wR&Q<% zfx1Lk2cwLh*c)En2NElA%?{k!ihd+ShaU>kxGz*x5CjBI2B{LwUb4D@!GqL}lM`2$ z10EjUO@0St@IfiJyk}%>zWSgFXQs!GM~ih|sH*-R8(VP%ySFv)8$3XzP`wr3A8;Ok zsnJwc#$^qOFj{VVa~QYh*#z9jjaumSYZrbp2rAe5tXc@XGA9=oxN^C}NkGhtPNwxj z(LR7uY0&+aD>f-DnHIQ_i!E$_zpd=u8w{-fU%u{MqaBm12MhDOJ_mwqNM2f5szlN- G;Qs)3TLI+& literal 18364 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 BNiF~Y diff --git a/superset-frontend/src/assets/images/presto.png b/superset-frontend/src/assets/images/presto.png index a2e187f27d748bc5f9953496679d85a0693a27c6..5d4bbb6d4f4e96a96aa822bffb9e1844a077f1ed 100644 GIT binary patch literal 10865 zcmdsdXH-;Mmu*Q<vWjFR6;V==LjfW=g9OQ`fFc%EWQq)uK`(*=N)7@d86<;%fD!~H zC^-s}gCJSpZSQyQ9o;?pz1Q78`;4KSs@i9#wbop7&3$6;YpakF(Gfu)5K=W&MLh`Q z$`f#(Lx2PRFZ*2f5d0x@Q#J7fzmNU?cSW8n9Secr{d6)g_A=Jegxg|V`4M&)8zev0 z)eW?UK%`}{ZU|c!q!+Ud(!mKW1KnwEgEBkW$v}-nwFI=>6p)Tis{S5GeSd8OTYnc@ zNjs?QU1n)49CYA{^g=LWT~TOHI93MwXTNZ8|NCngl=;slUM@0Fx!(ga8*ANXR={{5 znZ@~q_-q9P1enDo`9;OVkT$lWHX^*tLIOfUFac4RfFz%Q1YAfIE-K3W*98Rwdf3^+ z^%Rx=8V-DtfjWA5xxryDUteE-UtxZXhXYJdQc@BoAOsT<;sY)CJpIsK2rM7kllAW& z6p@~`9!_pvP8c-v?;a607;i5bD46WOR^jUQPq%2#zjg}j84QbXg9-8r{9e_c4ef0I zY3Jtcf%<cBJ6jkMg>*%ty*xo%!GGGiIbyspo{pIROV|JW{O<+;yQ`)3&lvydTwGoM z8N$;`$p<XsuMPQ6TYDP#xglYCNKcHnhb>ac2TYUo_iEhW3LZ#=7skT?gF*dmtNVXX znOR7fUxb-U3t{Vo{=JAh|K<^-BEkzP0|j;y<P#9)6B0HM6oU(i!9^u`fB^*r{?$|q zW9MY=_fJzHU|c>y0Ruq+xQHlRSn%I91%6|P@Iw558{65!?J*v%2(V-)SA+u+=7x5F zGXJxYa0Lts;{gT+vlISv7Ft?xHMFM}0&R;_Q<Q;%Rr5PJ*}(;b#Rcqy>}~kO#l;YO zBKAlLK7^2<IG=!|fSsfSLP9`74Egu-iWpn(-?shxdAtAS^Ew_*AiNN$|8YORgYLIe zz*U_*fw}ztiV1zB`(Jk`C+0u>0FJQz?cXv`+uw#o+Cl&N+UbA11OMvQ*AWRi{ePJI zU(Gx*_FldS52Ty}*scG9L&3oGVZUSXUn_zA$3_16+rNq1zncRv_<j2i5P=W>Kp7GZ z@XG@L)i{X`z(#gfHAOiCY{u4%U*Ij|#kJiX%|Gg#(h83fE#LfvINd4ofK}gK3?nkW z;TF_b%8Nrpu(92AjH@Ia3>&q;r}hqUc|bw^L_@AI<>9?MzG3p$Cx_3pJw=|n*awFw zZU{7Tu!lOm-J!m;gMV65TMHE0|LA#xw;xBI-~?w6Z3JP7h<MiyK9G>`Mm+h{{=ee( z#@rSWvsbjENLr1<r>N-YmG9sEP3ztf1&DrrFCTJ8nm5{7=k03$hUQ$h?pW;$HYk+O z@bvSmS6q=jBSg&fB)m)1gIO}ofhT*z!^89Q^R&YDEqi@D9UUDw{aH2b)rJiSND4&o z%7;5xVRc9Q2Vc^~wp~$MmE)F%;(D$WC(*q(`>a2fX0@BikDlpL)Y|nX<*Ou!iHjQ< z8ooV0oSLe0y=7b%AEvc+U+ann1Y&G5UKZ^NmqXH09U87mrD?UHpuO?SY5T}`eXLS6 z#;=Z=gU?SRiK!dR{<tk^BlIF;Gx!!RG4+;@v<t=0xBkK-ljy5^-)kO4Mv)Qs6Txv7 zJKE)2v-OIf_1aDI2?`2A6LZpq2(PF&*RW|C>#IZL6rZc{^zPR6<0#^>tP;dr!zDfl zCL|=(NaasfWvfeFTU*n)d-Bqlm&;pT^?5;qlST%OeII@+CiGcPABhbcTSsFS5eeJQ z8mp%zL8E*n)-~=Iq*K5u_++`t_QNyv<>^Mxnwpx(RMF}ubA$muKlk2CqxjB)(0npq zZRoS%bdc}?-b6zM$&+VG_=A{9{N6$xvj+h#F^k+fZ;k_t;pRNqkZ2mBVvM%LOv~nG zA|umt8V0uj?p11m${X@`anBGeOZX(Ak@$k4J^Nq1;*+;Ft4$pVh^g@Lt!t`zXp9N2 zKt#mFsi~>W%D#r-UVH!HLx90y6Qz&KLK>}s4OW#b99QPf6l(Is_AFT)ci<tn`RNp* zuWEwDhMWlskE)L#==kyNgHfrmuCXxz1os+Q;6_<JhfWr6B`Wb|inu~1C5ki291o-T zj`bZQt6_cG>`9^S45I2lo!vNx-EOvP*9o`Ne^2li<SNykua=h9NTC)FH~0E%QdZVm z%-q{IZ$#>mk9nmha8|rz55ntX*%qc0V?2G2<b^j2F=j+C7urD!<|{WC6iYKwY3ToO z-6xwT72fkzQc|LZSuUaPz+m+ju8rQAQAD^Qw)Ed}JX>V?x}JTZrwJCvu2zyi(4u15 z*^U;de9~rXl2W;W)lPb-O?vg7=B$_Bfxdh05g*y)Yl4*SGe(EsZRo{N<4;%=8q7RA zJg#16<b8>fz4>x-=2R)3#jO3@Jm=X*RRZSYZ$8Y@iW#@VkHY^zShIvsGcjFGx>S(f zmJncLQ{+!|KqAX5n#F{L^;Jy-ukf(m>+a<(ATW%O%TT;$a`Q)fYhSy-osM4~GVIV; zcU*-BiFygLQ6cThz7Y^eT6#J$5s_mWqm)mndcoc+R4ifL`g{{URB8A5?e|zAy<PeE zwfWf;`l~z&HHeO+DoK`G(cD$~;ljYyGf2a<GL(=>87eTs;LeBGb93PStJ;;-%+TAl zRn2^=HArvevJN^%=%DHi>Gh`6cUjv6jbmTG*13$87Zw&yPfy>`FC@s&=>J|#cy}wp zg^HQ5LFa0l(Y;6W!$!_p0YsC|a7}w2dS(_q8ytr}9;?P4%yIa&yp!*F{Ov;m%(yZq zFYldA6&^mm%x*g_Q}8ju&hF)t>JMDUp2VXjS0JJI%+^@QFAT{`0>|XGVVl$WbdJ`^ zE)Rc;E-rSSte6DiqY*>DK=qg>Jit{nQg|CZmg9QuY-kEgN?ZU~lo*zg?`h51N0Kt! zSGoL^27ySpMucpH`dIcwA;y`=>ek@{n*%{zX;ORvaUwFu%&oXrspQKksHn1JL$d0B zw1?q(dwZk%Q_SWwXxsTG{?Prr#9u`>$tOzp;e4iIHiyJswp9?Mfu7{AUk%S5b383> zZJlwQ;HT2`IhQxV;UYHPs@tczljbgT_XDbqP74hi^5+Bz!<<&YI`q6f^VO?YZ-dU7 z_~`k<xCC$bP%HFa$#L`j9;u=s#{#9jW~7Jcu#5Sq6Ci7Cotsr@S_WpLlE7G2UjBB< zyRkKjjG@W8181A6*q|x!#G`TgoJ8onYxhZp?C|}rc3VV_7q!GfSYGan+=z1lrO>MI zckD9HIV+9Y(WE`NWo2cUmLKnHUB>9>>CMc{4*btg4>m$B&*tW~{AZNOW0%V6XZ4B= zPEJlt%fw`4g4Tu$5@atLa;ouKXs#+#)j5UPUx6&KwcNNmf{X9n<8KoqKQroGSX$B? zl+89Tj;rutCF1ALkz?u2uc6ZS&CLVnf{t`4zO*7iNPoI}wrNp1%#i=Z*&A+QVDQXf z-6R!<YQBXq?(vO#?X7Z8xN{T~#N(4?3`=>q$DDs^8pk-=wLQ6c6cO_adsh#*5F@i% z(pZk|+}jbeI}}8bd7S;8HzDD;)|LB%SyWVXW%qCuV~$<T$OYXmt-H^|DMdQrAMezL zm7@iVzofK7gao;n1z)EgeFD~7HB3%Tz1;1*o}8SltE+o77joHpG|SVnNy~~FlCPrW zC3zW(a3;_szH)YzKibLr@M`Ubfy%NsE-2O18;`{$<F4(HZglgQSX;ArX^=5WA1}tk zsHmx@EIBwh%1vw6uZJ9m1GoNISxrb6vYmI|DNI56l^r57l&6vBOH{}fYM9oMIe0y3 zvbcU*VhAl%<M)lVtM$!;w__ZF^1khl>BX}`E>5=J;Dk<2P8MjSUL1c*K=(U4V$1O9 z%EVpmjE{}zDZCo*loUPRi5oR#9Y_)%Fja@R&zn0qmCd{vXvGI;8hYN<aWN9L{P_<C zsdCHKz9~lmn!Ww~nG_k92%-FNwIovBO<!t>GP?d+)4qj-QW7)sFD|$xW3%Mdyi+np z_2+8HT2pU$rgHw;>T0DiZ&+AZZf<U!;e)F2@Hw@k=1SfT6qQ>P;-`P>7iUsJ!bH_+ zX{Zg2a?!}z!Rg?jc3d7!RAR4PTsC2b<FuubQEG>ErOb*D-DAiN8XB(Deg%1X99&$a z(2JTl_mIaBW~z9<Hq9#I&0V>gvS;lQHO9Q~Ozol(r&`mvJVmIkn_Hz`F$ozN8R5wT z*>`R3-=aFVfc?<@UriV^uVO~jaY@NctDDyDOrqRR1KSj)T+TX<Cfg@Lo^AA8L9N}o zaibFZ!)7Y`t#*-=_xk9?`B?&kl%cNf(CjR_KW%q+_syF(g0}B9v!wl&dJ=_RoSCrl zQT2ad3Yi`qRZM!>ZPPn2ka;%<F0SwF?96Y`WMFKJJ^kraW_b3V9`lG^d~jl@si|o& zQ>s4X@&dqJYI1Vzn>WV1RFE67ionfiX=wqu0ln{m4Dv8MJo1vU+`Q4_cy|GOo$~D2 z=-AkX7d#3931w4jG-qUB$b9zfS!Sk;*Xrkv@M}dcU%JUk^jBvGpE^Bwki4Z3tC;ux zy>iXON0|%pxj=n0GmVj7!V!gQ85tQbgdLj7EnQqTCTbi)ju)bza_Sfw8v1y7jgwK* z(9ke3WxseKY5(zg>@CjkfbsoQ^7zoz)g>{_Z+GXb<4PEXa+5j_<cXRp;SH)YL>!PN zR=aB;)vcpH*G3wd_Se6Z@b)uGdf1)*Tq|!oBz%b7>*b7(kDqxPsa>R@rnbf}Vbc|p zl0r3=z;D@dyk1g4Mkn&>tcXnwJ^7}0A~!BB&i+%@R$X|4BDA-^pNE&1Vvl}xbJM)p z$5mebVS5{1vibpd$|K?4$j{HY3iwp@;+R?KF;T#kR=Q$u%`mDI8}OSq><$-b$lpC+ zFf=tyd;YwqL_qGw??9faE~D}pB^4`P{2sE5%2xNup4FPrW<6hFc-$6H>ou5;^qif) zl(JeVZ~3%d8+On<cV2#WU6nhT5$?6R|4B9>E{+^qjkL474fpCfFk3zF-*)CPF){h_ z<%@E@`%IHJ;CzQ6T@@{Rah=}+FHTktLw@qVGI*^cdp_zt1Bb(>Eoa8lrF{91m`OSb z2q~fo9%9cA#xfu16pip%y_FXD94<N|EF@HincF_qpQE%2Irm1PP`)zk<h_%%E>3Aw zdWX^cbyn=Mm4@{-9PfiB^1VkNj`cN!iTYYhw2WzpZ#xT_;5|FiYJ1<0s>pXb{bFP# z6LQgFSVC$1va}R6+u|2+w9O#lmJ>f?tiAtOyNHL2YrGyam%?Xudwb1od<NW5@teOI z+whyp&(H7d?7WiG+L|ejxEB<3o~IPAnv@}q$?7x}B&k8qG?kgvH@#|<dC1J6mDW{K z)5~V9bYDd^$$&eVEJRUvbg?@=QbfZOMB+fU?3_*2((>{_sd|0yEgk7ZK;b-B27$ew zKYw1VU!?t9K+gKx3>z&fF7k3CLRdNH$}pRN)|HxNX3G2iUV%AS(~otx7zUh)$5R@q zZ?(~uX2?LzxwmU|<bSbO5)lzKS#eXu>E<f~eB>7ueUN+qKE;Cv54`8w!_Lo+Jg02v z=;*-G>U?)B!>Doi`1oKgyYdbWMV;B?cthjkJ+m$LE5L;;u?zTU(_Xu3Nzd;evt*<| zLuO_Oge#7lhvy6cc^!Jj*#&kjw7k4Lna9W;i6o^L`*_hB7auQsJdZouoB*nv;g@Po zPEG(0Avt3k^mKIG+}yw;LDDN7StEEzBVY}wFvz|e1SW(M#<_)u5TSE%c1D$1i&a%s zArOdZK8SU#DJ7ATv-9gttL`*W7p#-gjV|EqOo6){j~<Z}=&6l(d3t&x5DUI@L1W|N z<E`nYWx?BxD|&i*((5n$u947*aEXhj=5ZApte2Jz9M0G?+1Wm{z7KgbbPqQo@dkSA zR1sIiOioMTB|%<SoAekb0Zn3Ak7|lVNkN*_N4c=P(WRVG0w)*~b&yfT4w`kF4<Q~Y zUuE6#us;=+K43q4VPE6-;SYvsu{)3_s%-ppSpeuamc<Ak-setkY-}W^;yngwNkd(| zp_}w-XQ@d|!<mYT%FbkM|H4ef7w4H4znZPI5;IH7EX$po+QsEmtMA(!RPl4cXRc3s z?b<lCMgV<kYC8RvAPd-6u!939=3011&e@9&Yc6i?MVUXam*+>MSHmqU#@roiO{c<j z&wPI!PGS76Ul?$I;mi({*L`-b0<2_NX?+ETqx_f-*|uL{;^efpQPFlWZkw>YynMc& zeYuHVrO4~)y2wprFzzn2aPZ`rP%7JeaAC#YUyZ70#eMS)7N&GV5sfaND*XKL;ls*G z0d&VrR%Hn(8FM^CW8?ANg-)X~(*rP1xF%5wGJ#R1FX$x~ReU{aVzJ2|uviw~6Wl~q zuce-wvv)~4r$a8!r~9OTepZ-;cY^J~h8^^BW)r~5zc?3ZzIeySNKNf~yo;b#qKP^I z)BD&ekf_RbdHg{ZeUgtYRB(~>SKHsZbI`rvpI{nuxHI>udHA-J56a1@_(^s2Pt@Q5 zpLy@{W{mS;2CTa_^+dzEps>)gE!aY}18_SJ;;5)7c)VnESaMq0>1NHR?b+5TYk`K~ ze1|N*C~6+`hVsbI)uH^x0xCY!uI490YhEBPO$W{TtuU}Kna6;__6N>Je!^XH%fL@r zGSmI+U~+8!UT_B3_b3wDydg*Qf+x1H{L7ou8hY7U*9xAqww-h>d$|`6OikB!-(uHC zi{Y7r-V<UxXH#^|4l$G{J^V9A2AADzm)Geh8ahV}4H6Do+|misdj$17q00G^9!oLp zzO>@#X(OwkTBni1Xr^EZuAVRC9$Q;mXNOzg&^LujDAbYwzKZzv1NJPEmY%|v!=+v{ z;$A;aSGEm*+WW?3jKAa{HJ58*VnY6ItvSC{gBy!DSA}J(KLCd*Jq;;)p5_h30KfB3 zt)B=ayevHzUk@U4vp2!!Ag&JwogHSvz5Bc;n3{5idntNTwcK8h`5=8et#JBns@!xa zsfC1v{al-<`OW7KQoK0C#eo4A<PW7iziaC2>mT*^^r(&vAZFe_qV0VA?)B@}dwU+U zcUw|swhK?2O9~1i(}nQlqz}h!<>9M1?J+l58!{(Ju6BZ~-fE?!!gWjE6th&urmMGw zH6}@&K)v<ZO6z2*;&qYDi7xtzW5{VSK^v;aY4UXg7@LqYS^ex_<HL-e)$a@TvUJFi zg2vThFasfJ0R@bn(~U%3Q&SV*#F0h{QbR+dQ3}*sKkRo}z1EW2E8mv&_4PI2n!MCo ziy*v(m-09+ZV~?!0Nto_t@y?Yo|=5lap6b=L>}s0AB6`|OX6P~KfsrOG+6S8zA};} z^tyuEAGWk)hxWt<1OzB3g!|4d_9gR7r{1}9r%sy$9oubV3DdVc;%_t`+?aWb>`$@% z@W(-A-fU;)Fa!dHLcvx>QtymaFdg+(f#7}py3ZxqlV9S#NM2h;`gInep;rOZbIAB^ zo9Ik!$UXj4&*s}wBFqpw?LlqYE8)Mqd;LjxuYrCVz8%1&q^2e(Td;vC$i|s?2(z^G z^j3o-eG;4BzUAbY>*jdXbZTa1W{v%T|4!=>u*>$>f|M`L%QH;u92|R$Jxzsr#SKg? zjg1o<b5OEGJWX0Ev4h!4t^zg@<7X5MyQ7%=GftwWr<p>?xXy{WRDO%ewvdo9<Olpt z0?y)}p|`68PP+26Pn16B>fA|If1&wx#>-WJ21`0sACt#5``QPvJ{(+-ePew09R+sj ztsMr^4z`<jJT|6>hpSN&)gX~+XGpk%fCK~s#33VT-diORt$hx$nE3d8$Gun}wKba0 zp68NW4ezAH#YEq`BN-65bR3pT7yf{fCHWd5gXwKb%7a0v9Xvd|+Y)Z=hpkC~0H&rM z4Qs#}nZ(uG=b#;3?Fms<g*hyc!k&c!w^a53QLuwJI5^l$$}NQj!}}E7^lSzoj{;C) zLGn=%SI9jc>%R>FhPqq{xo|kyTW;9`SPCwBakQqIT5oSJt&m+0KoO800<Lk$Thm01 zEm6?Xtq+--3cYybJ2pKuw2;|Hc#EDtmh{N(3Lylds;zwi&<G^)a;r9es(2uJG0bx6 zQ6Q^~v15b9HpeO?n}Y4ML?VVUH#&Qmv0US8WqGpg?H>1dsrKLgYTW3WhR1imb4j18 zM)qgP1VlVTni%%P^mNBl*VonpjxxBQQ}XBKyEDrGxbxGe`>O!P4o3Csy}#c{EA-2S z?Z#E78*nfCq~V8_^ZV|5T)<<x7YT21NCdod`?1)aaQF08L&NjJwU;knf)xMpxnTZT z(M>28j%VMW8-E3#u+{fb&V3qVvY2k0*~W#LLMAh6iS3l~a{isHVDebIfizK&7G1uU zE{N`W0_J~P8oLYj2-MTCwqJX1oJLxVuknM4v?=IN_a~{cwOmq61tMl`>Z-*}HF=3+ z6Nedj7eAL*iTIj!E-#J~Tz`lK@CQVWHS}jtG%U@w2Iyo-pL{jLxWfW)2?$nOh0Xo& zaQm--K95XV^p~j!v*Yv$91z@8@c<6|K=#}jud?0$KCm*FDNI8`<|~#yP^6QcCF=4O zaCoC~^NDYMS{9X;J%^qbjrNz>i{1WTMbgEY(0rI22r~=RdOPCPBgI_(xk}#6w=ZP^ z8?+pdifoenDuT8sY|d!V45%ub+!o|5H8Qk|0*+>U0Txp8nU02EAKpM%O9F=Dw-Qy9 zid+606KWDQIc|+d4rgsJ%G|tpbARPiHc0yJ?(TAO9f_<e>gwu1+S-y5q<#F}$kI<K z_dc(AL#2bLyBx58aCDX>)5K*F!6w0?A$514d(M`+1@#p?h&d+juIzXn${*Dr|9Qf_ z(7bKy%>J<G^$^gjqp!v@HR-G!@~l~1o~CxLT;=V*SdqQ-Ta4w5(3$%#D^Ph`;Du%j zPa<PctO8Jgk0Q|DKfVCFRWm@kGn8wb@}Ss2{_rDk_TFBTYCE-nfHS~hfvo(yVgquy z$B|(A0Osw<cTkc5J8kHSPD9m_#N~U$7|o883x^z+kQp^6b<z)XF{P*rqyXfKB2xH) zsmkM3*el(gB_v<KzHP!SquQrY+&FA#{%Y+k>9tK25M-2;lr+YNV0xb&MW(52VikvL z*h4a_$|~Du$f>D0Tc(cq;$mW+!$A#OtPi+no$J)$_jHVhROFY@(ZC<w)Fnn0hui5% zY`y6h(<9o1&b4W0*--LWC@X8Lp15$QF-_DwuayGCm^OFrw*71tFQUMSWloB}T(Hcr zq^SO5@Vf-2C-AY^*}+T$onixJMMdn7V`w559G=z;sK)zd8P159gajZ^tc+DyeLC|3 zK6SXQult)Nwm9XxxVXrq4ZbNZjy=PQNK0oNNo`h*j^9Iv;6IF9y|3n+@mZ`?E(k+M z&`rMi#2|8XW|<PQw6r8~rVCP*hevfg(J>{!CubLz#sT)k#KdW}=GKSe-ilgU12c4a z(jdNipK^NE1Jyd9Rj2UWtB{nGR8&;-UBZ16lU`DZWcBWJ*QyUtibc+lTa@(N_z-Kk za*9tGH)xqy-hA=cgmiax^lc|ET{|Mp@~9Xddbbz&NqYZLjeWy4roj8h>ny?e7{U|B zwC|5!t~?e$jFSt$>TXtAZqW=ZioF##ON%E*0tBCaSli~Tyzc1M>Y|8sI|M*~5R01b z=-Nn;pT4i8ZIv-7eS2nxi*%S^mf<9tPm8~^nU{zPh`i*y)*b2ZW~tiMl|h(zbdWk$ z_Z+HFU=kZ9&v+B3y(f{?DqySjL5ZPz_;a>iz=l9Q^YN3>EAOinmB#=&gD-yhZKnY3 zA|QyOzY@{eFjwyC>e_N^PdlmC&UgN&s;cVz;FN8xsqfY#dnHOujqvCMBym>dN4w}u zR?57gqliZXgg>~-P+d@{Fw1IvcygnYP?!_4#-=-NAYD8GlvaX*x&?a6OG~9dq?VPP zGy8PQpDBcp_bdx<kb;8ZS#q*>8wnB7qSoFTC16g=q(jHQ_CK{=@Z(I_?`#II`L`l< zvTc2ciHQSNbE6x~$e8YaJVU$LkCj_Y=f;2n2vmYwCZfR)2p&Ga8*~bSpNs+i^ZaNo zTf%)27IM;G5m>d++;4?bQd6Vf^SLH1E$v`q%(EWA@=vVmU1~ORLQG=0Ou!*Q+u|;? zX2RUqxMzl(o_=F9%-`C2zKp~)4erfd?^M{@dX5P>OFt)fkjBTy2f1qrO)DGxOXg^r z^;b}{_iE|Yr)R~bxAS;4)9Y4n8AU9<^7pNo6%`d-rxBRfCQ~`my&yLR0V(V-xHO>t zQQyd@9-!TJAeK$-E+BKW{(*!0J*)|C4n#oZiKm9mwuQ8{FM^W?DW6R@Y#lhmx_dP3 z3F@7)C!7iCVy=q=v%Sq0%S6P)-)72o-woD2di3aIf5o$YbE+OQl&8f1R^#Gq?h;6) zH3I_!)9_zwIw9m2g<_(7g`~~tvlFwG!7iP?MWb)#Er}uRmAgT)+adL$Z<|{eTDKk- zcxTDTyBeC^ofvBg4(L2}C7rwNvg2+8-OX0^jqm;qTEx`+k7xvK080gelQs})-l~;W zR9pf=B8HysaZy#*(h34WjnPlGv9YlPM^vC#_Q4dFl+^I4OMr|rJ#B93OhXa{RIa_f zy^$gvYAPzAdiL8@hhMwC_njI)G%qjjy6i8v{uI8T)1S0=1CN7_X2h-ALn9(0VqyrU zRP1RAYikeomiw)O4!(?8g$%gb=xA&ERM~kM8ynl(bNDvJWJ>v7obQBW0|jC$HtdVD zD+W^mXku|Ot*Em>V4!rpgj&)knWNjj%AP4mS+G^$XhH^L`KKIO>S}6Lq;X%JYrDI< z&FazTKtsYN@LC1_P@-nQxxN0`<nqMTQ>$Ocb!z#5Lhgos6rq30HHZq#rG68Gd?dmO zMT?|6Pigkscd;uHtUFYQem;qwjOTe%Cu!5SekVNA&m-_zd%dzW@Cq?NF@U^111LO@ zF&Dpm13C&jd8}y};In!qUs`A>6rn@(n3j%>?NtjuKflPx$Y~`VKvri#aR@3Ig91Hv zcJ|2V=%;K>>9U|i09Uu8$mD6v)FB3idK1zVve-okxnJ_dx%L$3UY8d~ZMZl%@(K!_ z@7^tWNcLA-SXemMHs$AsABj9+>%}LgvO^*zO9a%CfB^)2Ic~@08J3%$%m(aqcXh=m zLR&58hK6#79D(k*zrXJnh7SSUbYrX{TiAiDUhDO%SF68H_JN)O!jpxCMMMjbs@l4` zJ;M=5C=d}VjH}+w>?H5l#g<EzK|&FTOOu0F0rK+UGuLl!2?<3H`k3;O{A#)9R5R)E z#`tInD;MTnTwT&&PMooV%L&_1p37H_{V~`84FR<_J5_wM%G7gBj;Fm#{^UcUp`n0~ zxN)Aktx_==#C9(NzsSsc_3KyQwl#C6Ho!4a2MrpxiE`RTvr<DIj5FWV3fL8J@sk0~ zMEH|*jmNV3*v@g+EgjT!Lt^t@WVcP#fKg{jRL!6{5Q`=O^<ug_Rzcs4?;ig8_4}zT zI}C>Dj3Skxksn8o9ljL({OrX|a$`fD{E;8=CHUg@-abRqZ=ke>w#Zuh7M@L(5U0-d zxwcCUSSy>`xP_kHFetOE{MXp)1NPFMpj-<54FrL5g6NF$-uMa(>1S{Q0$hSNYJrqc zjP5a@_E~k!>}+hMpd1CmqO%LYF>A<f$2Guy%6;>>`WA?c#DGRS3yRzD>vy@_3>wu7 zPB*MB)3UR7hD!Tp^u8U_Qd9Gj-V}3pya%CWU{alKan|-I{ruTLNmVIhN;W0*)eU!p zm^O1RY-Z0!{`+8dpY7>h*C%}+KTfy!?SsP&dI}0V0h)}Ur$<{;zJTZaCN6*;uOIR` zrrmX$hiHv}RJ*XS;L#We#BZQpA9?Z9RT)b=kG=xuyDEx`pGC@s9L*n@5E2t_fV}|3 zHrs!_c)34yDtlkA*b8j3LNu9{rY1N^C+YO^_MZ5p?hGXNC!qdHO|7>dNCRL(RO)AH zItj9tsi`TD#%`0vfU`_6$H4ipYaX7SnG9_F{Ai#m1Moo5DCZAJ1o|_R$5z+WFopd3 zF=iRCwN{k9{o~^+K|~TqZNb~EBD0Gp_lBlpb$f^28J^#`$&xs{G4|6!wxUT?KoooW zoS@z|-Sr(Md0&@hMG<Pu<ci+V&%_1EpccuL*$S+*OlSr6bgc-)L$eh~QojI^tGiVV zP61xNTmmI6@GvlWJUIYfUESSCa5?<Ghy#hE5I`zC@NeC!w6Brm;7~5mo9PR(QBY6- zkq(-Hqe&H&Yf8EzT2rPufOS1hN&<jNPEMZm^l4;7ymEf=>(|aGREzsJWqtjpre)jf z>oz7|eeNZzCue2N0-=`CeELeLc2P~O3=o~yyx>5BN$qEaLV;7=0=*<9fjwef!s)XX zFmLiIE-fvsuC6XCdz{BLB~Sn3#}D9eK%;Jvi;>9}AC6={UFWd9pW}Gn)a}ylQ%Yv> zYw;}Zu?-S08?W{t6OV%F@Kuqt7y8QvO0KEKnoB<umkaT2!vhjdbgda=gENjOUB%K} zNw>&jyUd>Q_}%Ojs8h>PgeDf<B9fBI>9#?bd^Nka#F)ZN5Uc1B|Jc7SR*mrC?lzv? z46mUf@3tQ$pP}LKh)G<Th(;3L-P<in!9g&-WOd9)>;fg5nt#1No7(Ij=7)<2C1|2A zr|<Hb`}DNGdlf-VAMvk(AqJLFVsOY75qK4x)Al(0$J?kjJSuI8`1`QWF1YdHl+Tp& z8_h)J2>diEwj|P?J{_5!Mx`@8MNWXX2wHmNd&UkXb0rCKXN$lY7c|13>3`9iJb%8A d^yu>1qJsI}qt)XZzh4SfQ_@x}m$!cSe*h0bQ>Xv{ literal 18505 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%0Ad;vh9l_txSq+sFZ+l{T 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 Vikiqh8Q`Hm44$rjF6*2UngBdfTN3~P diff --git a/superset-frontend/src/assets/images/redshift.png b/superset-frontend/src/assets/images/redshift.png index 73d79b8bf4a88ae558030a4be5cd785c92097c03..f3fcd10dbabc1dddc32202d6ec567f01b2580139 100644 GIT binary patch literal 10885 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 literal 9168 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 af&T~6O%;-)lOA&b0000<MNUMnLSTa0A&wCM diff --git a/superset-frontend/src/assets/images/rockset.png b/superset-frontend/src/assets/images/rockset.png index d7e301c6170735fc53759938cb99f53f1ffc761e..b94b9e040fd7a1e85a44f8a93dfab97c02a20b11 100644 GIT binary patch literal 8570 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 literal 23189 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 Cz}7(k diff --git a/superset-frontend/src/assets/images/snowflake.png b/superset-frontend/src/assets/images/snowflake.png index adc3443fdda773ebdf1aff4da29ebe1ae699d2e2..e096a5dad19b2b3c9fcd30baddae4b10f3314378 100644 GIT binary patch literal 15635 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 literal 21654 zcmV)HK)t_-P)<h;3K|Lk000e1NJLTq00A%n003MF1^@s6>ALA=00001b5ch_0Itp) z=>Pyg07*naRCodHoe6+lMV0r@+j~#Clg_>p5(rCxu!Thy*>zM96*op)$K9FX8&OAb z#u;@SM;%9JbaWII21ij)6p$T61VNU71hSHS>Fm9~{rml^-tG5Zr@PY~l1Rg?q~E*m z-dk0tPMtb+&Z$$UB1MvgDa1gCfe-_u4+ED+M<2`~#32Sk41^f)7zi0yNC_bZLJW*r z41^49)OKA6c!+@z10e$oX&}Tvh=EayfslcX+O7)$4>1s8AY@=64TKm7F)(T|@MmOT z`{KQ!JVCzx-=nq<Lcl`|gc#UI48->_--xmmVLB1Z!+QdL86m$I5Z}5SGVz{V)m#?6 zPigw8Z}LU<Uciv0hYv#xgcumT7&s^lEK<x{F(MWgf$8M<j9QG(0{>!M?=9uX6@yz* zN*^zaQKl7RX3@QJz`Ye8J`XVvVqlbF;Gi%tF`l-bf<3&u)3)@ctR>ZJr;Ux<#AM0| zW$?Bk5)TUzTictpKkUxgj%>uHrE+${n54DV*svJj5QT@2LJWi$7{wSkpbV@iwUPAj zj<j9*Y}TIcj$3y$YmK>x9nsKjpPQGpb0;)d5e5}OlB(om1?h?W<sx~zWowsxc3Hum z?@n14LRTG<+rs)T`{LoXc4~`fa27$Pt1Ms?cS;C)h=C9T!^1%2K<$MrIEArbYrArG z;U9bKxlD~E;&H1fW-SwmTPB~k`H2qu*>UxDSbeQiF=G+0P8P9m6$+Bu%>J~y$1Z)M z+g25tECKUM!ql=-M{_wlrZ#Oi9$RNK>SE+a8RgF#%ZAtZ@U0L7AqGY@1`gm}NEl7T z5_VHtuPy5p^D1KP$~e21S=KBbwUya1cEg6eMPss#VIPwO#h)x?=#5y*qV|8A4dzvE z$tZTSBKKf!S^$WVe@Sn`e$|Fe%}H;i%%i$LLf}ITgcukJ2KH`2A4zEy??#+7m9wXI zBN<Uk42Bkk_hc=}LSob!3RxId)|PbVoH4#2rX}8_#B)hh1sK*dodt3fkghV0$%(!3 zl=38PrEE!;7?+j=^c|)U10e=pP8c|FHZU<Gm{<<xBB?3n_>0(#))Wm{OskN5!`Q@o zw3t}Qf};FFk+giFfXbMJiRnG%RAMy}+gP3qxq^5we|l6|fL;qzh=C9TFKG;nPy!1W z$lh_{d5M>n^tKer>fA$c8y<Oyiu~BSl-HNxzWS9_U8;X0{0uP=V&LU~fniEu-f7e$ zq%7)GvK29zAz0F%1(y=;lmwTvua&NKPc3@!K`h9^6k;I6z;H1zEC!~*E_F|C4L!NM zZA<eDb#6jU1mk)F+ZIw1za=fbIG6(P0&4^tn$*l*RxG!rixvmImJ}<Yu{ce^u7+{$ z#R2bdyDNO}&x3)ol<%kS7u!_*=fTR0q1ItBFo`cktX2=SW$kP0)Amez-Z_vS-4L;N zO|P+6;!&D{fyp>8XRM&RbydC|X>$iBlJXNzPLi>_M5Q`(&$Hb2e9>;(l(y?OWbN6W zh{XW!^d_?p&q~;_W9qzDf4Q)c0vNvklEpxYY6J3uzI-a(U~-g1A8{Xg!hKyUxv##A z{@%g-bXDsEkobx)9$(67SPU!@DcJ3sdhCj)%yvcUttgiWkn{Xbv)gy(><!~P?IW|} zcGQ?!OS+DAUFz_5AkgQ#N5u#7ljK8RlN7^l7}p<m^xD@~<?XKB5$lbnSWjS`6NCTC z9YuR&cgDW6plGL!t9LMlA0Y;W0nwGCA}+*_vi!>BwBgM&EDe@aX|*Y!wp^iT2={Kv ztl?SQmEfPM%!8f;H^U)~h7p5#)$sRcgyw)Ze+UNV)kY~<U3B6<t}58JMAGW%&K%6Z z^)Os4gRj>Qx99Ed?KykLv`%~PtdvcuNxHp@5mpK{3+!(U_H_ssZsIGlvWfJU=I{BA zwEgGmv|Ya?Vmoogs7WLsDz}@`;JY~N7i~>8X<uI5YbQ0=SwaLErVs;QpeW~QG>J4D zNLKY^?5-_Yd$hf1>$4CJli!i`1^ei%T05+%#xXlYFeb_#``#M-8(|plnwhlIT56rt z6V=N2L6m-+2Et(I$rtRG2piXLOxsaSF?-MSIy<Bx@sjP|AsJY}yO(wqZCQ8Bl8Gp8 z4WJ4{1;akdJe7z?Y<nSLpI;ZTUvBNSkIhQkn<m5TaDNaRj1;IwBAd&l?-!PW5}+Sa zj(_#GHIt#!y6nH#nXT-Ffu@Sy^#ad-iP0_^2A^{2NCNNT&bV#t$=S^M<O>5P%>5F< zfTZ}mVI8qwZtS*yU0Jl{xtQgnac#wghNC!SXKi*}+A%O0Ewaqc_wS0>O*<2~`s8f- zj)EQCRJ1XSlYrU}3UY$VfOAuC-hQ*aXusN-wB^{U7mUq$1{S<?Pyjl3l?=|n9FtPd zVFZ^*N|#7IE1*tlc9CE$wjjJjaVpK@^HrD3*>e!UhnB?b=h&V;aY&l`Y}h7`Ql(AI z-Pp$uKyt=;Egp0uU;S$HF8k_Avqw8{d95v4BE<_1ei4$OE`P=$#0*S~J>hI;+D8Dw zY%f6!M6Cy!xr?10f4?ebTewa|*`fwhixc@I3C+(;6zqt4KV+m?=ucbT*c9Rd4luWK zPd7Dg^mnk(q>8DF`trb?V{r<;Yk8b6v8KGF)8GuOLi|0Hs1MVU>}$+}7}P?1=jqNs z3Jbp34n)T#A_>dY6zn%0ar?v5MXQhH+#bf@t^I*b^@+mk6k`RuYX>vtwy1T(L=&|I zOXa=eY!EL@jLdoYlZQ(u2o_<svvB0sDr%TQ40sF_Z37WguG^5YE!h}!8@1!>dhIQf z%x2ZsSd!lpQxTh2Vqi|H7Y)i$n@{$YIL$<pyW5f*aFm0AUZ-J{IaL%Uib%m9qpnzD zxRClwk=h4mU=@g;P@Aw1O^et+Jl~5!yapzwU5cLR>oqT7sS`b$l4O*EL3HxF1K~@X ze#+=oju)PMc@e`VPtU--)H~Fh!9M3MT@^e;`V&-oO)<$N435Kc_rV!vW0J#azAGvG zcxhumo<U35*7i^r6LCCgN7QERD~GXK-OTLmC`wd3Knl15lcJ|FN&HH|g8}j!kXu20 z-gYha<-;LxU&A1Hd_d~{^A$S05sV1^K8*9-xwL(EbFXd5C9r9#yVOlyJ=0YsQ`0m3 zKG3Ou9fBudSn4_T8?@=ZlYo3kGGiZ@8nrh}Nibu=-28NTpur5wf01LL2mNn#Pt-bc zNo$DbZDB*yj%Z3ao3Es;C^Mg@CO=8P$eROretf?8;e25b4vT?lV|6XA2%kDEWoNZy z?3-({c4r5jEitv2!XD)onoAvAMx2;O`PU$TmR{I@6NG1}S|QTnfut@ih>wSby{@HT zADCHVM-fa>E)_4?X=xBthqnjEfLsrDAcp0j#}raL?v1F83MimF)zhM%4t-gA?Ed(0 zH0<8@&%)0GkAYz^FgNFvB$ZQJYi(h3%x>PCwr{PA+7m1{C$Nq6#=XH)YFxm$WY5%( z($|2k@tsZ{chUcq;HH=If?xgLs{E~YG*d=#sbKkl_+c44xxwtOrpN63iM6;*_$6f| z{uh553UM!f=tmWV3L4POE|V;J1A9v_FGyt+k$8^esd^9!^so5#4)V%DLq;%=+&Ba< zzf^zFsz2Bj4U2(Q0R>mm>dc#_)!NzP^Y)_+-S&emL`%g0nk{Y336x6Dyu?lh=~a+C z*dvd4DSti<QbO?9ee0cI%+~_vp>;WX@1%%bI;GZ{@vxPz4x$%zjt1^UV}{e{Dh%xJ z9|1P^SGhrX!T0_u_l1`uh$MaKoCTbPnEXoA#Jw`Py!haL;VmECC6pMLI)=W};HLWu z()ry$_ajJ5T;XdpqO`staY?>ltyt=>oD;EEwdU-<)@AHhTMM=wX)FtaljTWLP>y#! z1M_w8pqyOsVkW4dyc<j&dclX3=EBj;z!I3_e`2Uy^vWTXcVo<<(^;K-1FJ{xo2F>3 zNL)Pk<)IR|8424L_q@3i=tQBEqxu~V1j`5=Ts@e+jlz^xY4fy8^(vHOjCx~&13YS_ z%1Mcp4OXK|$*r1t-G%psM_>g;*<sWcR~PT94DSh|oe{Fr_<Q~hUZ76y2E`8RTV)ri zyBH-9l3T$7OO&JK_yTpP%UoNy@XI5-?=tZ$>H||&T0ebTSkl+x3gAaeFdgtME`nFs z0cJ=N{P;dmZ-|c7FFF2tSveP$+TmV~!htW!J%xGNnN=?eZer4Lzoz6?;UoVJ3!Qts zBsU8OgCjOUqNJm4JRWu1;n>~PmEh%`dl6V&|BG_v&cuCwD}(oSbT7I0NAv+qt`HBI z`&56+e^(<pUh?4#A||`CT|3mfq6tqIx-Sl*zdX;K?T~BF4SXMXn&hTy&_2RT_8`H) zKqr8zD4`@>$XEy7yq(0YuchWO@dO>mQ##cRN(Nw@!Q?@v)1i*}O)2~LBV+c)ty%lV z+PwXCSJpbQnaRwQ#F5krNtl|tNVNpW0x^`CDot<d62F(ygXWOpdXqeYPgz}Fed{Ue zAubac>d?w#9ayW6W$mId5!A&RJHCYnl$~cccMN|RK`i9uAVxVQiZO_gWW4RjW!Zj# z%Li(315%_ySIcYPfvf6<k@B=totdRgU73RIruR2zv$g~L=>9|soCZS2vRqmVE`Z9x z=ZkiYE7hX@04`MD)dX|wK&?5tDNbMDP{|u23=O(Y%5TGEe3!Pm0Ba*{Y-OW*GyJ-S z(B0Zb5~Z!;YQC?A(Fk5CuwYZrDl_)OPTE97aNCL_;3kYj-L$0^9JWx$1SYSsIBeEZ zFSqC);C9u4=~7<_zoM-?J0;e2=4~^McXL_MZoz$J<f8xZ;1Ax?0M{y9n!a7zlQ;Z3 zZEhoYgq{V|PB!@8)7E3Z-7PkN2?UydrW-dLXlWOJH*PUo+|eceN1F?FYNOeOlWTF# z=6#LGeMrKGgGz;htPCC3MIY^iURWDr#op8PSSH|!H8J|q<2OMM29uK}#SOG)9k5Qq zPB*<S&I)||h2hh87%dWm%)`73_B03RJhC%`3rW;YZBAMvV<TWX8adKtlueV8uH{?V z#U!weK5k31<<QR^)}po~qXbciGCmDh6<L{fmd5=)ps^|o!^)3Tz_Iph+J3^u=U?E= zw=oyDN$~>GRj*w-vBofc!MJeeWAMAW)dv)%L8Yh<lFZI%joAs!MZ0lhuYG4jk1g(& zmwU{56*3yBrp$o2)Gt~;vyl?8uN5`eDAOes4Ed?kX5mw2?PZGb9N)i|q1>bf6^!eo zF$H@M-v1X)N<oA;^N~#wVBmOL9>h`*P<I)e>pF|})3&_bv#o#!cFd;KciNj<6ZX1E zwJ<V~je5w}wYN`UU=u`j=hn2{ibwWx%5Gy4$iYC<AZ#pcor{z0MH3?S>Io^E4Pn#` zSh!~6ye%dFyZ_W{yCI0r&P}mRD`mU5eilaXo6Q-!mw~qiqjLw2lxipRZqwpyj~WxB z{Ft3IHepQ=j{M~YtY&})IkeM`UU2bzM}~If?fxAZTi#{Xor%HF;+BtRt(m{+sf4|v zA!Zj%jI%Kw;)Lsqkx9bx6?!R0+jE|0$HUc2d+m|-sJ&-u(f)1@z?Qpo07zc=E%jXi zG2&5N>p%Wn+OiC&j~|+`w@hht{lAngXIHN@Tb2>L{Lx2>PNK=Whd#TnJz{sTjmSNM zvE0WtqM7w+JF!LEh$^XYgs@U%4kob{TKOHgy&GD2ioV{AXLUFD75bWxWGCYkek{Qf z&Kno8lUw38naNLszpXdNB3iFqx4B^Fx5RK3kJ$W1*`M7MJwjmid|gu4@3v>yYKI`Q zJz|T-=It|#ud{$dj9z`~WLB7vD7BlhzYf=v2eh4VXVI2)Mr{*=4}R=uuZGD$Z8@SL zZWpv9?Mz^v1k<fy67hU<m;-E2P~DxlL}`i1^0xo%(r)|jji_17;5j<-Pd!Pyt36{s z+tg_vnwi1~9<wH%33Me+1aazw8YX&_Bv8l7&D&?x+c^`m_MLUT_T#pqtxIb=2DQ*T zQWYt{;t<L7c#pk-!7M6K2dGrn96rDc9agZ{PKw!2x8<z8h}#2Y=();KNa++|sSm5k zGq@x6*2(qQxp41**d+eC@j-q`c`8f{TJ4mQvk7XxWlP$=vlik>OQB=S6Enq<ZMAen z*4Fp**x%0avzofB1eLq0`k?)Sxd-O^z_wod!m5Hj)Xr`I2u<ZBAjAath|-DMsbe!U z=Yy*w_7kSt4@{FQM=i!;)ga<?E$3SBMr}n`24aY_?I~rC?u^*kEx@}bZP&8LlT8km zBVQ6JNzRH2&D}+wO)!~9H|M~4&i-Ot-adLr(vF15Xc`fmbg3_2UlmESuBbroY-WJ` zcvHrHxGrx?5N{(9zqc=*&^y3dNLd>a_12DvJ<^%6A8kw9>&8cDPYOw#=Mc8~M*|V` zbIl&wjM-D1NVSQ{?{)^o#gp=OB=3SgSFge_?f;awoe;w9+luzbu9S_#hvsP{+RLB- ztw7hotfnxqw&FG+fk<eVbPJzzw3Vd)8eChDm60GP)UaVK1`Rrlj|^Vtolj2TWjm7W zU0XBueH>;VW+lIi@?yBnt8ZdxH|m3(&^l<fCm57J-<GvA*belrX-Sv}IAqdV*&DTO z`2^n)Ti;u>BN~-Ue<Op73@&*pW?wV?bswGe<>zzuyH4m9Z9(MeXpFK06N2i}Fm9vn z8#ZU{N9?;4uh5$XX3U5Su>~%9r<WHI<m~C~?9tq2wy2?(w#4k*@wGM{sZ66j%6Qq= zge32W_U&!m_U%m&InJF@RvZIB!cm7k*js0dpDoyhh}<8V5wl}a85@z^^j2JZ7DyTZ zWiTQ(xh8?+5VzM)WOFqG?+!fXcV}xY&7e*(D^F&x;-_cE?07cDO8APp(dAL;Is&Oo z`u!O#_4dgb9ro|*v#7RWK}lAL%vzJ(c5y2+`t+0?QqLXjw-gKk5UwwonLwyh8)0I* z$bUbZZ@;xJXTRTpWC(LeL8xkptCJ#nDgWO$r0tCHJ$B02TGwfQ;PXnqB(^9o>{~bY z*k3QpGC=DrnaWxnb>nKrtb^KuRHXcPo)FRpsi`M!Phng6yX6skwquulVr~<I3u&*f z5&<r(OEq8@gBTNx?{Ai7*k{Tt%s#0ExSPP{uBo*Vo5X6Fq}!dG^0Xf2vlYDU21D0x z%iGgkY5U@wyq(1);TgK`tLkPrE<$NJTg6QJx#it<^Hv6GjDu7X8Ea(lPG^V1Oi;`u zigXe~ML>;#c((xKHhTR>aMZ_lr|s`&C+xxrlGMexAZOYXXQG(`yvGy9XgO-xYG&sL zkUS1=f?*bb-ElexT{T!Q@Ru;Su_ud)s6%7$qGuvGbqse!SJ-ssH`Lfy<{_c&7Ob*? z73?0~y&I-7p7&opwqPeUN?IqP1K=%eO4?zKOinOGnIt^J*gKF;m4z{CdRX0+wePQE zz%$M^;eM2WHk)bxB>c|U2hL<B`j0qCdp+D_D?0*uiZyoYE~&R!d;ip&9fcY!-$hM$ zl6GZ}^S+FNX(Y+l<#GU@qF3C5_VA_ES^GWAOHDkwCTmwrj@pSx^AY+{ZE>6nd@XHH z+rJVJ;TPLt))lD(C$t3`nhcG!(hdztP0Ss+jBSMBZqBh=20Y&1m9!_8r|qvgyX<|_ zYdPZ;N=MTZE8CY84}uWh(T4p7yOmrIRIwPF2DQ+lL0*6}{G9MP_wC5p+a~Ai-P4mW z4%sqb5@hK=iDuzSGJYNfgZi(dlJ+2C>1|tcFp-?oiC;G{h3bLCq*;zSbm)hOMN*u` zvPfF~XGyjqePm9(9X}>(cOa(jqGKo46d5Qr9B!-5l%0#&lbN0^+~g{!fE{+hxSl~J z`fs?%&1^eL)0PzW1&IjdR*H1gTG_;E>|WqKwV8q$WP3Euy(Rbxs9FX4%yMi*#X1{9 z{$@Jz?X3}eGmf%{%04060Vxa9UW=#qO`CG|gEqu&%DrYw(#E7R_V;sz?@|W}{Vw^7 zG{k*dH`heasAFK&$I^B#1M97*ZpT1avMp#L>1H$gpSttx3+=UEwk2!>6!>gU!mfg` zeiH&Yh0sANQ7x=asJUQ%1=7hUmSybD9Y_P%(#BekoecwiJreLK7`<9i855M5M|$a? zuBSV*L_NsZFSbW*V=QUUV2`^JT{F&3jSJ|Tn5Jk3SP{Z+fq}ge<J`?#WwVRe1G|cL z8M?|CBvYww2O`O)wFK4d84i7^hhfcY$TJX;_MtaP@(J!8Gp@!Kj#K>+4qS#dbKQ2w zF6@a+vS+oJUCsdWNzw&UFXTXWQ9Qpqt+)q6eUL$nMt%Q{H97kcOk6uunyKUHx}se? zA!_HLR?UD`YD=`zjeTwv@86C#@N1;$XOUhvX5;pa^*LMAn8tpmGT{&cW*?KNUCj_< zWiGP2kqZ9}$?FfD3AbRe0MpIi!c|{0DS@5Zw^(mSIM?-=_N;vhTDh+yg{EfK0tKFk zihVJ3e>$`>y%z023m)`sH{*RJ6Y#y*$A5wLu#|D$jTHaQbp?W>rtM?1lQv6s$$d-+ zTM!YQsX^{p31Cu*cK~&5v=~I2rxQ@gF>ogA>l<<$Hk+{zPtV)yr_^B3#aPb(1g+!) z8~k^S5k?{LStY+>e4IZXz#@HO;8C^eVaz*m|7p0oq^xlaxFg5ZKuA*gL|_H%Yc>3d z-H_bi;I0hkT<fP4TgOTDSp7<w-PFASLik_oaX(<zTbDs4V|LKsl8&yD%SkJR5Ggel zc;22BQjyMR4}x_0wZ1DDF7Mq&^o?bx$TjR0O<|n>+#zOfn<~N=5CTa`2~sWXoWnl4 zzdkgIRGG6cuFlvayQ0omn#1^scH&bBcKr~xWK7RNG!k?t#4>i}^av_5kv<aK-~~Y^ z9M=)T=xl6kr@|=CYtGtdo-f$q3<QJ3^tqJ<`+j}SreHvKOdSNdYTO65Iw<&yD|!iu zgj!CylOw%s9gEt#r`1>kjLX479YU;DAX`${GHOz`s3mLX6LRLCpYO59dTOzKG%zb? zk*;(23L>pQH)8S)41i;ru!FGD@>q9*0SU9+U4S0+j+mIMVvi56da2JnT?Ma+&IU_r zpGa^UW`f_s0NSzTPKAM<j1hhU(yGi0uJsfVMaRiQ`zlwxgpllLBMU+1VZ6ew)JnD6 zjR)EyDjyVJp7c+ejJLtuuicolpKN7;2Rqk<xMJuP?0qv(y9srpGO5MG#ruu)!7<n} zk4EY{e_Y1CwHA9M6Yut1%6<dh;z&!*kRwp`HPJ2!9X%lA4rutx(BmIrUUAyKpf+cJ zHzSTM6>Z0@ym}mIe5~&&+Lu;j?Lo{NIq)%!w!C*TW}~S|M_+Dr8GLyozg(^ob^==6 z3AE=g@K*RHO#BzvR(HUFufdEnF4<%6n~8+%h8R5~phl1w1tL%mnQcm2bcaYo#GwxJ zhIbVw-CYRIh}m!zgAi6icvr2++f7?~?1Qr+b}lnn6Y;_VmxO?Ul{>pyI&wo##6vl4 z*_?feLGUBg#9V=uo<y&Gct!@h8`mJPd|+*fa7%5B66r$8{iIX1f|k>a&i7V`=GR;D z_Wd>35_)I@NK7bf039c_PpQNX-L+#@QbU;;lN{l8l=LMh(Us~fy%l^(y=9WOB@k2r zDiy(>%?jvSCfAknc_5vN<RDaeBD}brI4))1#wh!13>|Z8xdYL-f#+M|st|;#S)?5U zt})SWyK;uv2WN7UIX04jiK~{%K2P%F+)2!UiL`xiNzT^5L>|Eie***PqjNN&sE36s z{mDjQ_R}qLf#E*roX9Z#Bu4gkP9fN1g+3nC;alZEWM)p<dCbtQHBq|~L;1rnr^Q6R z{SIo<zoJ7h{(#^2`y@;XC&O6(h{U=PTit`Gk*6X74Q2nz1Ebtpx)8Cq(4TearW243 z696+%KFRQERF?LwL!x>J^-zNLghbKK#Q9pPqrySO89Ztad==<|7J+GSAx0+L3jcy$ z$<cBtgTL=?5Bj0u?rqEJaa1!H=}l-KJ7A_0n4GVeX!ib@b*xHj?D;wZD14!%dwgku z<P-E;U6dGiNU*zMfLUnVt?7fCy(R~+K14}=9Ba`{Ouien`BnsxufS9uN6M4xe*)%$ zD`&;+d@(N&BxdiK5;ijW;YYYj-A$l|ZtyV`9`PC8y@b`-CN13uiE^r4O{g0ho{z@# zPlso0%&N5g@0Ofx;okpj%wiAC+Jy)=HE0;Jrn?CyC~Gg@(HxzM!NcAJ3p|`~Au*6# zK=O%GxNE!n^c=XaEFL65Vv(8nw-_4Vv!rMreI{!U5e2mqq=@0E>w?bd%U5+lD`5g{ zy#J*YJs7B2{fRVMCl05(3Jvz<Rc7B@NqMMVyg6j@&tXi=2pt$nZ-;UH)ncTTr3HJE znYaMa3%#O2HAi2;pS$5o=MIdkmiC{B>U6<)a!7p~qIQu(hnlKs7NVHL%3>6TTSA;G zwK~6NNveBdUDDn?qY0@JX-%t7rMH7G{Z`RpwsG3^D%9<FPHP0KupjUiFyY|+^0z0r zMW`honTf;+rDuWfMh4J!Y*&tig#$OU#%(2bukWsB85}Xbo`L(`DQ54OTEkMhnj{GN zLsqWIor6G$3)q_Vk8^8m8aC5jV7mtc|D710EAzI%NlqIZv+>Eia~F7!ciPh0{;xU) zPLfPIkWPQFuE$>cc(48Ka~XRc)m7*oC^>1I;^YSOICi6zEJD;`{y3_>h$#ac^GpU~ z$BPCkU>NrXsk$ns>hbRtY&B~A?HI6E^v0QtBlZ_;XS-rr!lu^fTn1%xA65B-A1XtP za27_m_h7O)50gfW@!)*Hq<-&pj0Gi?zZI!M_AEs$z6F1WFF&8RN3lzZc`d5X+f}n; zm}fY~P~2VRLwhdKsK<8Z?M7ma?WB+Ef#YK{qW0R!DHisIg%#%+&<vydo7pwA1<9O( zH?pt#|6pPp(sC^t3G4D;Ip0W5ShP8avR^%dCE2<Tljnk%kcg|Y$TFB99b#Ab9L(01 zgLD4hwz$3Nshs@_c92yadGy>sa@n(k{5-%a2F&IQE4u94>#@HjrB7??4~&TKPNcan zu@d(0t9lIEs!Pf@aA`0S2HRqsPd@crm%ZyxX}hf*0%65eiwtrzh=X*wPiR#vNLp1> z`&6nVDl`o{p|RV(a9E60CtL<}e}Ec;{2B-dAC3kkyFSjK+>z1zujFB^f|noq?b;!D z)K+dd#!5}q$=58^r3E|S<<sy-qCJwBB}oL>t<K}iR}*Uy-Cu=U%Y0PFG{Gj9X;llC zf;jyub3hT*Qij{xuuVM2!a_2hvE#85y_?nM2!2ITO>F%^>Q|Y63<l}z<6&a&nMS$v zLmR73zd~B*Lb7%cQIGtqjzon%8mjH(9o7o$5mbqx>JWomfeXeDw-h<WJ>hI;KcR3* zW<sQ2e5nSCt~Sh<c0Yryhr(OXd(Ideu|~88^^1DkV@W-6U=m#mlW_prWB5cqx?53R zqjpqX-Y&(aI0xxebAzXlp^+@<N2}WN8x!_=7Om#h5Mz&j&VhA=;L9{5ymi9hf5}$B zFTuQ?>?LY3^mTee&OSLCw~g_VPJxfI^(P@iNpZ%0jjFkhRr@@1(?#Qo&OS!Bm->)` zhe#?$W37PpAb-X8!o=rbYETIJ-(q)MjLVAXail34M@@)9u#%_GZ*8!j9ouLhz(_wM z${t4;l#|0ipl4{lcnxdEnGqo+^*F+i<ODPO+Pa9n;mK}Pw|1gK_Be0eTtILjP--4a zIj98KPF8dfK^3oO>?|_krzl9PM3|G@?=FnPUt3eOudQmwCdFVNpUbaaAc>Ikl(&-A zwy*Qfn-}-mHJfqrWbnpWC6!@cOh_t|2CbK;JX?0|9JE6OEsND$Ru4Zu)9l&>O@x}p zLlB(Az|Bw&cd`d9Ky6H6sFb$#K)d{%I&66d{#!UuYW1@yI~{O4bx4FqUFt{?raYVD zj#&t@$|RdliGXOsEI6xHe${Nh@`R*E{(+M2$K<*}*|Jrg$lxtv6iy>eE(bm(=g13# z(#qR!Sgq7)Ck^2IvWW?nwzY|deh03h+8)#`FjQAP($^)-+=5jrmCvxX?3oV9iHaZR zh8*#<qIMQGx&(I4tyq8M@a){Mg2JlC0FoLL+(X;()nfHl3kaQ1;{&MdYjH6tvN~EQ z@K-_f!ieU&RV;cuf*)53;AT+gX)Q7}cvFOLlinNvf2zL(gJ&-M=DjMgbZe-@%Z{-^ z8@qsiF$)Q+@$sqwKc}HW9Xm#57P(HS4+oou$`y!0MJLL0;@BGevXXA0O?|{oUgWP5 zK*o_u^-uH;5A_OolKkBcE!?=Ni`B-AJ((s*1N3z^%<HPzaaOBqm>gx~@O>)yG`7Wz zw<94vg1XTOPmmOS2^!lZRuJ`E6R{*kKOQwE_xuw+{faa1kx2`1XO2ZeM!gp;JiJp5 zy%aXWRE5DJz|E+O*%#;6+jU3d0)e>O1c-44pth=bhYOFK{`E*Sm88S6p{>r;*~ga` z?E}xGZ6nM@Ug1KdzQp`=TF@6(bfdZ;g)qqEt0kM;Sd7%irMfWQONzmd3Q@NQ)#fW} z%)W-2iC{-=3UPnFW1ilXv3Eb!YoB{Qh7p<7FY1p2M^(crfR$h&WNLO#z+5I_c)tSu z`^QHou{G2iKCE<DMTQ|RrTD#;L3=EI6JpW@X0GpSirMR*?6of~@4=_6mnGyJonB(x z;z}b)AWYj@X5x%fPrINlau2r*1(!5CjM-jNZJx4l5hMA*pkcWY_w?tm4~l_LMzlX? zoXQ?%<5g52EZ~!wbt1I02zLqf-VPQJp2F$YPZ2N=uEt=4JO!K1bXJkuY0KldEUe+3 zfm6gba$3fn_;K}=dQ+#cukDW7Jve_B=}47b1uuQd0vUdDs3tIt2JB78H56@5T|f=P z#ofRV4eKs=4*qS*Xax@V8K6_?jH6jd7%#`F5hq{bWVC`~SV?Pfiwt5N`r9+92OW*O zPueUd&-jvg=LS}ezr2Q3`D}{C6;_Aoud5EJu`|cPSQ$4?vLlPHQQwpXlUpa(8Kkc) zV|PA_MN_ch_P`f*v6{RKy4r~<q3@yoIRA&|a%bWjx;|lyV)M!0GipzD=-EhU&$nC5 zwl7g8jn$kf-;WymA6ysihJb#&krf@dZyUguEmEqiOc1&%Ad0HtIXrhQR%<uoa#6Rk z$F4aljw^<je|95DeR5eB@#{eiYGXp&0)MCZh+UtW9RrcIb`#?5zplow$uTTc9ekg@ zj^kf@vD2<Tv;lt^)y6E26!-s@XY9c)W@uDSd1a{siohW|LI31n<U@PAX40Xr#3u6= zR@+WtCXf^=FJ#ArX+IPG&`As#gw4X1^>0Vy?Vncl+T+*~3alV4MX&#t^%?sv{$z7t zZi^aoc*e&tRu-IU+6*ykw}7u=kcu1^)ubTxM>dL)6TXNqPCGN2@oAfO8;G>EXA$9m zEjIY(Ve^Y&Cz^+yXtMNSN9_G2!XZ!re45!+R}J+nAdXh7jY*2~>3Z&Zi9pmM+tnPN zpNairH4e^eaKyY9WB#F-FBtcw<S#lQ_CKNqJ`97?9>lT0)dg5>xD(vA&Fs|^<&NVQ zae|zZGPKR+?wvXZA#PLfV>^%4?<Ae6`unN~G8~X^;X;Y=0t05D%}M`a+Orw-BVA>y z1Tl^pJ`;MHLS)ztY1J|?O$6<PMEh9$CK&1UjG^yt1o!xtN%A_sncWFUUJJ1gN<Z;T zPk8dQDV#}~R1eGduZuGRq-r3%+10pF$Sj~qL@loLT&RS(eC?r9Pq@B-ZbT#7(V$|{ zq^(85+kuM|EN1UxuUx2;7W;mRz?iooG?64s0m8X(Vu95o!Zzcq`IF6@!h&B7i(0%_ zogAT}ruaREFbM#Y*nbDhzw4Rl=V&7o>0t~M*K9=kiJ__htX3hXAd-H1cET>1q7^)| zD`seQrqe#PGRLyBW^a5|Ajt2tT6Xb-G|TVxuAwU+?%!i~s^yu~6o*K1`dD8=Q$<qS zxHS%>pN8l1o3TZlkI3Apl}TCyE<uLx5cgt5)`2hSG^qhRJat^1eH{trT2^T8p;tJh z#&$CzJ8)KfOtu~n*36ljhu5+4hRP}Tfur$|pThVH9D%Dg$~tIDwF=QNA(7I^lHL~~ z%9ba?uVD4}Tzg@VJJ8=U+?R*gblgi4sFISx%gkgLH3FYorGp?PWwpS-lSt56`fWG< zV)=ZERaW2kB3?-#XW}b#6CU4Nsr&b+4wp^N;yS<pa^Pt&u-gFX<@O!yB}M9*hB@F2 zm_NIb?8)wk^Y4<%aq%R)=&2`2vaLPmb}(q;HNIakjT1||0|4zHrzo~2Ehs>hv}-Ir zUR5h~`vgtQ?M-fCE0+R_I($JZpvxuqMdwKnk#nw_%)!Y<n9sE^um6F0t%Z3>jn){S zgu3q~Lj5Ka_e({UpcDOgCfQ3na%d}ZLE3<HyB6l`j57T8<E1+1;LTHcj5YyJeL59P zv17G;Yd6x_3u0gb*Z&t#r8<~Zn<4Hu;oCH$rpG?Ef`dDHu`$srqPNNvFfWzkY-S*( zlUW}vkDb=Ofw&E!FQ-iV7;EH*gJ^I##;<cx#e7dNka+b~>}mY=`VM;<v8aYtVQaKF z+dejxj3%mkD~vHi!=u0_HPme==DuuSt^s`ZB{E1)KN3UgRkM<uVOfJ+LNIx_d^h=a z2lx8&4tn7*=1Mr6=$-#?c+4(Ehq(*m^dl_cKhLbUgQe%4w6lY5de||uqR9|_CXDQI zwm>Z!t8)WngH($=EamESFZe6p9p077QeKiH&fvF~M$~&UEW6T+X>hLR{CPyUY{UI< zWKUL=ph?TI6mTuJtEo`QHxG9J9v;Qsy~CKR9_>WU#65cn;?^mwnu>VoB<ywC^O?oo zB?cd3-z8>(DKWc~ZAjWTD6`$|tcIO4uFy9Dsg9kjI{uy*<69ZgQ?ad_hNG_*V<?gV zsy7ZsQbnE?rH@FP@e`{=0*{Lq0!4z!EWy?>+4Ma1RhOn3JYxfuFuC<GuOF}&_C1)_ zMkJ_4hX^+2^WLwKWTz&x98Mi|k!7k&QY)a665g}`rgo?a5;(@Ao|oBOfZSoW&ll4N zsD|r2d<3VlBSm&)Pf7iu8TfaV3K_g2;#N7LX&oK45myOGPTB&o9_FP=Tw{U^?z@am zHC(?Cu8?@JZJ`1MX)5AxQ#=ikrkp<uj^?%m?({39tJkpCvXLd(Z7{7HH)d=tj;GqW zE;oQAR5+G!(9^J)DQTRw64jti+tC?_I;+wTO(D}?>AlLN&d{E`uddGHDc@rY$D~l3 zv~5CpUPzLSiw;GCS;zvwLYUGHHeRn}3VsUJTN{d>LULG-4PiH4)LU?yxB)kVCy>mp zoRPLS60@v9Hm-_PCWRLYTScMn(i4bO8Gl?L9l#`|s0g0$sc&DZr2SIc6%-H?J5n)y z#-E0nl5ii;#S~Q4vshes1iObeG5;2u)=2~baP>pY*!Jyy_P=g|A&p7o>|~^<6Pr_P ztI65*NV1!ltR838YH>#v&u@=6O-|ZM^*fw{MH|y`2|7bdWYnt``&J8*1D$+r`V^%m zX^%Y8Gax{F4Sm{oXwppB>AZ$5*mM*1z}=<stCjg1p|dUc-ECz1+C-T8B7z<W&kwen zlccUgtD2C=+8d{GkO|sIc?<=x`fqQ-P#+cSB1`~pVyupV-i6;Fsa1PRjz95|Y|yS# z_y8hzmh5;;Ln9rERSZmXrW)ti6W`kq<DZ65uEPd)E7RUq2A)>(VeES(wL?tHuUly5 zk=-R@7ho8kj_x0j&?0uE|K*enQ7>|~4fk_t-s=%-uU>_^!S#u(PTYmh(m${E8@T-r zELPNbdif;7L)qIsG?C10NZKp#@P3d1kYy0c-V=c4uPU(16aA9$@F&dDze7^G6wm%k zr^MY+S<N)exmbVzuNsa-6cOTO(pL?_o>l-+r&wJ*k>%#gkiu3{pCUWlxg&~N$=*ez zuH|^}fByNjO{`7ZMXg>^@MTa;RZ_W?ZK-;=mmdS?6Ju$GpzE2<b5?`2n6Ykr=ISN> zj;JmO5Q#}@ZWj93h%G}uQ`j^oXhx-@BmoI8!K!961LZXQ+FDsv&^e3`!F0ATNy-K% zJLDQx5%1-^#Uj$zWEj!;&2bn!E(9>LQ!)Jhl<iCFQ77+VQau?dODwC4rLD!RP%cH{ zsH6NN@WVY!Q5xt^(QDbEcrWPM50BMc)jNjCxCx0=s@!(Q(l(g2B&U(#Hvq_$YCGs7 z8O&9tX9ffJuf_+aK(rrl00V7dqJK3K>xc0T%)$h}!uYy{aj+bX=7*cIhHo_+tQ9&7 zCZ<2v20v=`qX8t!%ABQMjqN$?C7q5F_Q3QSz&zA99Z$anN%#^Y8)<pv5-7<do>*WY z`pMlH`v%s!_u<X`!!~R>5R-%it%~Wr{z+B4I6pi<7-C;w&d$K+=gOI^g1K5eq7_%@ zv#j=Af;Vy#3@!t5<@~u8M1KbL^pnrwhqanc!jV=DR6xYBIGDZ-=JoMe^=_6Zp%wi- z!j^{wUh`QHjI|UPq`GSB)1E}4`UN9KW|+q&A}V}~g@lhhgH3LIw>{U{<F-|3#l>-P z-X2L3;(ZJGb{8H7Ii04c?--W9KYU27ePcc+JWVQCE23uvM71$9Ub|k)(^`OVEpXNP zvPJ^I$ljF+U>bYYCTP|}cUy){Ln~$_;D=q9qZ#2H`)4;y<Y^8;*1p+B?#<QmCJhNl zGbl7c-G^cWJP9U~hMtyT3V3X{KY&<U+8%-tEkR;cD3&8xMLeMyTvE|Qc2k@;p0dfW zQ`aAa@vTAX5{KFf=er+=!7loq?S=LVJntKrlr)+6juE5>A(a@5`clWRO+iZ#Gg*t| zy^?JY(r8KmjSv`x`H}w|8WBt<usa50p|UX1jz(#bii`9`GdC`2iNL%Rog`rk@F{y2 z6Zc8rR>1-uWApYk8}jx9ONeC$>42U!vS|zL7{i1o`dAE}w_xAQ;XWi+mXRh+X!0vl z-cH<&I#}4#-f7usgIb4MrbbyQL1u`D3JrbjMxstUn{&&pYay_No0S>(RH^~41}W)V zh|;&ZMW++9o@8^dNxfrA+WzBkm<uzcc&&SZFS$o3P}`^H*4djTVB92tqCx@2@ZD;| z4dPcEPTLN1k)Mnt?p72MZN0dP!zr~4FCUX2skvvgrtGVS*RZ#Y9sL-O<&4^k+A1gm z_=5NKEh$S<pR*v)t|c(*&#%NgnD*Yt$=>T}zn2*FwpyjXfz#km%I|AdiBX{Q5(hgo zks3cbJ7w>NAx9zV95z60I^Ia+K+SDZg*;}<WgLhriSQHg<2e=wFvt*sOxPXR<`kuL z_=&!UCM0vp`FI)87XFC;mG;HTPI4436E3+XmCMx(KLP)&GZ<9z|C1lk?~tO?3{bgF z+<^^I18E%n{Yun8g<X+3LhC@sVQV~w2`h^fvYaRf_v7U*kXOSvAA#{H-1%&5s@fAO zCtyAEHCK@O@EbVtH^sRe;SptmL4P<d2MSQwhC2Kt+KlKcfM}$JuO^1r<JbkYAzn;d z!*QVG+si9d)eKF&4mY6>u-bS8%u8F|v<u@D+$P?M+IR%;sknP6_lGbsZR%Hl3P#b0 ztAdKAAstU=aMjQjnS35&Lw*kvmj3zo2ZChadm7m?VaT`aW`Ym=bVHY|BXY>dOQMZ= zxS*Ut^T_>wVAbcUB|Uc4a<1{tE+RT<Jy3{H(w9d+&C==ve=d|U?TtfW*aGc!%`m>h z*&IA~jLpMPE&_4_X$jeKj*}~fY)_w^TW@a^6O&USWf!R^#SH2MDBfu$^1?f?4}B8X ziLuPSx?grg6hxk5pTw%xR}XKnf1b-ez_B@-1mbl7Z-CgKLzP3x-FK3f;7(W<jl82P zPBeug;beO3PaQqrM6(OsqmeT}60)T_$ywFyD|F?m&g%D_2b4pXR2lDiUx#FH{`eH? zS_X#7YMoZ>5cj?0CPWFs62b<kdw<+g$Z&;3x(KyF>y(m&Z$c$o)~PetSq*|NB-RU- z!IFDiYVR%v=+D>^B3nxXO!)+)??YWo6-gj6EtK1%auLAX2H#n%6t*LEJqZ(E1`~f4 zXWKtw8;ilb=CLK@Y(<L@Vvr_8^wUsVE<oK*GFjrKWB0Hcxt@GafI#*<BcXF7S|h%5 zNS9)+<aR35U~M>1_f>a2tFOo5qA(Xmrq$jDVXzPG?6n>u^@?UZeusuY@94mhPE^PH z8J~ZE!T9~Y%2)22;7V8yFr8u?T!0DVL$h$<VQ;S{b+_8cJ1Oi}=M%j1ipde1jljXY zVYlM8qJw=mz)WQ8a)0Ded1F{5J{=Xl8OGUzw0#p%GL~twmqrGRLH)csU=po32Upr6 z$JZXrDnBDK%ipgk*x%p^bvrvZdRT=VX~OLZ04ZFXU$4Zs<K~@^Gm?oSQ|i9f8a$^5 zNHGRi1H%gjpz5TuwLmmy<C^f9L(Kl;NcK6gzb|kLDBFfSXhMhcEaqDhz}53=?Xp(X zNhC4V*9#MiAhEO}m%RsF;1h=urbat*Nyvcw1>GaMrZfhg7-=0|`xg@+@IU9*;8D*E z%%;?FDv<wDL#q=vN&3{jPZ3*+j_JY?^*Tb){Nu{3n;rDrzp1yYlNh%rKn-@WGf91d zh4(5lscN@u4eSMGz9?;Dys|pWOLE);cC|w;D>9~gTaD_fD5SdT{qW26g6re6#z~a} zb_i-Io3Z~B=diY3t#Szh!O$Of?vej+k1*WRraRbI_tVW7t)ZKl1etsdAxdgx<W-N+ zN2;-$JY$)uaK*$0(?qZepRiky0Plw(F^&l5gBsXWv{~3sMfjTdluKc(Psf{m4pJE| zUraVdb`uc8itQ*Fo@?XwX|zecUsUYuIg+*yUQ%8BY5V}sG1zoZWl?7=6Dqsn?B^KG zpTzK|sH}VIV_{!?km22jS<3$<OZd1KvNB8Y;s}EzK_J>3j}7i@Tz15~^t#~jW5!FS zI(g}Jlj1}nCaxS7n>Hkb8(<_i;_SK|hN&ESUvx=xoSpVCLIBk=Rvsj}?hV+^w8|+` zcH5K&fk(GBJ{-dU5S=%0KZ`Nn0~Z@v%!?9&Np)yZLR!e)@KRX~J5y*D(EXBV1&`tx zoq*H2{dTT4y;_z9gcv0uRR|hGrz}KV|0w$Ow~vb1UlNO6VP5i%D~ouQgy<k=@LTtM z852R`)pJw$0u^m4{w*_^wPvx}_>QSX`}iFEv>;foRw>UQiQ=6^gv&-NtCSy{RcGIx z&t~Z<MIyH5tdRlYX9?dHkrrL(pbA>2P}z>?X#d?9+JDPz7o(%Zs0K<78W^O!*&o=R zwzaqdWbh6ZLwB5bfJ`w4qWp8Vr`geuv?JFFl{1r&BwCp(zzBRAxXuBJ9MP?ybm88S z3CwdU5{)(rk7H%H2YLJFn`8Fvb!p<)Bi;b-P)RsdgwfmGzPg;Xv5=v7Xs^cpv<Sm{ zxxVUB)J{!?<LKK{aK*00@wknZ<ev~H?M_q^t$58uDmWKOD=sDooB=EfOLPc~?`*AF zQtW#4pC4>uLo%DDHLwnad7kK0SK-jVQ(gPP`=zlz8T!5myWIlznPynzxOaC92j@Kd zc5`k|=upt81-(cmkM2s_f3HsyB^6-;_1jUq3a?02zw`qf>Qy;rOYCrcA+1Bn{m}RW zKB9!Ybz0nBi<+sv)5`y~FqS)+OcbpmC|4`Ya({U<K@O%8AwUZ@Kf;Fmzl4u}o?we^ z+uR=bb`|+LDM^rbv61q=?cMg}wOQiTX`ga|jolG^1Bqti;-TrSpw?2>A->?zs-$2~ z5Z_1ANDk3F2?KIss&A?L6uz|DlSZ{d>L)^H#4c(n()bka2&$0$r2(kf(vyzVEIre3 z5%6-$V2cn$*@!N!{arG0Ph_?3ALc3?4SNWAX97&{ETp)4pmSwH?E0s@doun}H5;30 zCjB8+q?uNX$n`B(BKUd4a``NJ%DIGA{xJ@ww=-jGlDdb=r~y)B^{tOz09%&A<d>EP zE}adyxIIS5XNsb1wV;2Jq@?^mUEjliFX9G}vo{gM@K{ua767b6Ds_@3?G=VaL_HWi zHDldLD3NQ4X<j58kQOq|A$Z<6)b(;r0b5ng%B>W9`(OL=8MMQFg989S^5j&h2?gSF z<?UO{ireXvZ>=M$N4m$}LbThNFxDo*No%`@C_tE&3ZPZL^@O;&3+d;-)(~xh-3L0G z;1x(zmrqI3Kczu40HEq84GpPS3)ulMAExsdcv;rVK``K}5k|C-EiT7mY<Bdi>Axb0 z@tuSF#EnP`3JLu<{!In!p5u|aP6Pisa74`2OMVp@M{uc@21zX+EO}h&srrXs;tIjF zTFI?NNQ`fufLA_~!U|TNZzM2h2ej~)lM8HuPdJ-!3Z%GZ(kGg*d%=S|({-@MHJnp% zA0ceyv^x>H(r9X{Bwl`(lNgg|t~4h2mJ}ti1SF{o9hllS<VO`-t+0(<F_qBY7}IY> z0$#%2(`)b>Ylcys$plm5`X03&7~eqnq@_&SKZk}lBQSiE1*mOI$d}TV!zqWwWz>7g zyn;cn2pgOl2E00i=3YVzeG3nSr+SdQ7;`7q<?Mq9K68;0J^h#QUT)LiSL6~`Mg@y# z6;Bd}R{oSh_kCghCt^86yOm|_Q-~h<wrS?<ILW?9e3Vkz(?IT|WXjjU6wA=7pTLNz z@F*<E;UP_kURI&B#Yj@gc)0JSQ!$)WBn=dGYA2oj47&g0`2Dowaxob-VL?;O4#CdR zp#0=<&3E<lAt?w#h@qC9K?f+N(kt*Y`!Oocla$dxN2ZxU6#GjER{NAS>(oh?)fp=t zC=Nfa``ypJk5b1-ZQo8=H(-RmpUul><JKYL^kEGt)E%64sX!{DmcEzc7xo+cn=}h| zvQUv?z#oqU`$j^N$YE3XcaShi9EhaSl|)c(fR_5J8Qgzx7ID}K|9dkIq8(uKzqUl} zAvUG|1+FFw3B^1Kmk6oZ3V@>%mzL0%w_$|3myK;*NN!E^;W5l?A7j<|5c(#MULn7@ zfsz=Di~)jV3VnD6!S0@<Z#1ODh{VhlU#`w+1Es-NQIJ-(=M$B7Q6uUOVRM`}H;tQ$ z>xO*4G;wI68=%)JO4)yxq96S^{OY1FX`)nkWh5L1_>Me*HSup;!;1UOgfw4*v+ns! zu%`m^Z0uxpnwd%3Mzykw(A)Sy+(jgdHAqD%#^nOcB09Wg30|o8v4AmPqTNo`f$kjh zr%1=F^j!g)uDxo_TQEGoGAY+7)KzSdir4==7$<8Xb{zd9Ur85TmoVlZKw|F|t#F9P z4x)s7Z<Ee~$k3K7%$o7Z1X2f|kib)f4t4;Od?FQ5`Cj&^?qIP_QJxnNjpF~YGAbLk zZ@Q-mkIeyFx5rIFO@Vf}#OX*=*WrJa#!FuIEfu2nYBo?~#}l1mJ|_sh6|w%caN!n~ z-<@hFF6B6M1$M|M#?Zw;TunsO-@vV}=k%ZDM0}K<8-qv}V0XE4MwE~*b<TTRzABCa zf?@;~h@~IxmmHq^mGA(bg8%>&L`g(JQ~^{JtLt?{C1C%T>a3$P=W{r~TZq?vKJZLa zGz<CLIEd9o3Q;+fA!SKNj=hB#SK5Q812t~q6r$yby}K|*irFb2ufj<66J`o>Ph)?i zOKL~}lfUCXX@}yQzMZhc8<>G^VM$*z(vR_%yAftKG10?p$t(s}msxxxv%)4eICmkb zNCK?~2S>oX{+boZ!&q69#GraSB!b&l3OFQv2*QykpNmibf6oG_Ky^$Z)XhK6!6Tbs zlE2`5&kY<J@%!$SJ+WHHsIhl6+3QZrY3JoOCXp?)MG-D^AVn+Ari%#Mb0sb<r*LXd z4x-g&Yk#)rAOj76)W&AG(dnoU*F$@445<{8!4b8DcVRE?P-!9|Sv2_XfPr;WPCb7M zm=KS`=H!Hv!TN2eLLHuYL3xAgA>Q}6^*s|@@9{bh&>L`9i6Z4FKqnD`k-nE=^IHL9 zTD7rg|A#?*5|dpsiz+H-2dlChh!oL*E0K)uW0_c`g1&1i`#X_{*RDYd6G>=bx{CFo z8~k)%!AS7s?X4+N52L96r=tnTB+yRzPr)GX+8IR!&N^2c1$mGfFL#+k+0Xj%*$5(- zKD6I?JuCUouu*j}E*|5t(@n+{B+nNu0LsGv4IkSbTk9BL3Qye#-7mtl^I_=abXG(C zj+meYz8$VH!}uUf7Lo`({wiYBU&7$iN(2m;(%_%mmoE+;3@pVG3!lA;vp6VL0**J_ zNjYRLXD~Y^z<nV@OW+%NG00*^`XRQphfv1~s7nfct(c^F)VD|2M)GL_7S3egENo0s z4(<l(5R%Xis@(Ns=>MNy#cp`^)VT>6=G6&I53vR1sa2>j*q<(+Qm_-o;s}XhSBGH; zKuK;+hy@-kB#1#wB`U$k4rw4*VVYy9U^;A6Ukg*r(J5K#*81o;z7^B{l$KhzFHofn zoRA@C?=<W&pPwJKlQwnR&zWKV#K!U+sHvNgxYi-52p^IyG~315J~b9X9!Ko0(}Crk z(^=VRO*)&Q96o&#F?ug<_%3b+<x`@)TBN7JySg4csb92OS3?<spaHxoiK%00@}-m* zxR}jU`r=cp3?JUqgDosejQzM%>9<07o4|LJ$<09r^Hp@z@!)1Av*@dlIN!qHoK1dB zFj6(tgG0mV2N_*v^N7-L0zOH%z>LN-bDx8KOJ^PqnjawQz}E>#E(_{1_7FH9kIn2A zm@=AVGo|X`VMulOBsQA_Kk6q9yhKTzaOITfvh-@-m!9ds+Z4Ey$^>t5bmx1}PmBUY z5|FSizc6jvnOC3XG#^&_S%BEg#MX}KVk>H!v$l{~Obfx3i6f6YN|DvS2sUEI3GH3V zNl-eyNYbUG79aB2PkX9G{(Xw(rE98l<Cn`J@!<}Xp$#>t{TD)y+p_q8uID&BnAqdE z#VkXLm?Z`V&ZUm3k7we@`td_K`VEHlGyb$kbq5ppE|{-&S3r7dIIR|ckfy~!J`^z- zDft2z<=fc^e5gzWa_ex|<9*6?iv|LCm<ckZ0tj*pZVF$Vm$GSa-`}%Jf-M!!&#Z>j z^>#KsAJ<$D(ohXhzqAUXY9$`ac!!|j8YKhvHuUz#SPK7Nj#|2N2N4iBsYl0(#axSo zNZ2tQDvfDXI%PK^5iP{sLQGVhtky~j5<##o$w2^FTSF{xCR}%4CtK@z5(3LI2*q$8 z>*~QCmuE{34x<bP`I)IG`CiHIOExe4(@hDCM-W@<YG#r1$7Y!Qinf$6$L+vA4kP9{ z5XpOpIiJM&G=lM8M??*pm`%h~bpGPoXEd_<nz7#@_CJDJwG7Yl?GUHDo~01#a1zb1 z^J&P*7`e}3bx5B2vibNEnaZ_j_#c98=q&6&^0ir{B{}dR3_%OSP9o-`Ssgxm3=0hO z*qNw;t^|#6p`(->4LB(pk85!7_Gz^o<Cf!ytzLVWrT>-KZQ8Ljr9qyI=sMhXMk)`k zaV+JiucJ7vN6x{T2!d0bhpoWTms2owzi}eY%M6@(?3q1}K_pK-rGeTjL$<;q&m<)C z+t>(RKrK5K1M|7e=FXS^d?OtQ4G{H0+H-te+Ig7IV`5V6Zncl{27*M3JPTmFuV|8t z6(PR@Ns8`x+X3#GSRX9FTnBzHVBhaT`a}U8A7r3Ci+>jaC|jjO_w)gMJqgBjBru$g zCU7hZB4ZQKA+)bWfs^USHtbNRLc=p$_$M(e@I~fvaJ7?Qcsh$yyAckp^;_>MfTD)# z<UlR;zmEC4n7-(gJq$_wSX@%3`pqx2$@huEMT<4bJK&9+o1j%+NB10t`y5i3=spdf zQ26c`W1j#T2p62}#K9kDj>Arjp-iqs4q#V#i5xxBs)5_fFEmKW2(kr%JPMFM*a{FT zyA`%an~lVUw&=pI$ZjDfr5RSJ)-22Ta>TS7zoBKF21DZT0+`OmOs!)&l4_8a9XW~& zf~0G${9W9_*^$R_*eKJFf*Gn4^bFRBp3Thjc&FXcf&EPq3J(BNuaG<h`jLc5D4L@N z)!Qdg=7cyihK$4>NnW}UTL5CmC{=-MG@OuvD5>MFSj2M1_u2KhVX7)eOyudS&sAFe z;TlA#?tO@eZzb6jWPshu-bXPYiP81oOt!yP2t+61h-oOhW?k7GD~VjO#Q?|o<8(2b z&BNZK*;bJy<ODk0q=A$zsqr}~I!uES_0_FBJAxGiC7>NN^gl7u1eBZ|CBZ5FQyXnj zdoo-nrT!us!ee0Eq5;|gP9<fiEuuj!;tV&*`9$Kp&emLy)Lw^8Rdz9jDv}LNy}W1A zLW1u4c=_v*5SoEylH1zi2iL&)_AIG<he-_Affd+twDNfbHd+Py6b|W8+O=n!B+2Ro zA+1Dfg49;18tjRp9sTaVeM$7^4tb$W;YoeYFoSV}U!--dII6h~;8%=D6QhI$=QG9w z#}1i96j!T_2~uI1#xo&`lKj}=WdK&ls?9vt-o}aG#BJ2C?CNr(_qcLWK6Pvdmd*Hi z$tbT=!X>aob+U{SWjXBz`fx(MLye~ucFVaKVG8RF2u{#Y854kI3?iX+!Z>Y9xTVa2 zde>Jntk27F-w-MI&XH*7VobYYeT&tB0#;u5vTFpPYMetH548z+H3s_Ma5%tq=<`n@ z3d?vdu~a(`#4obsgIB2C6#$EwMC>(98T<JOO)!CKV%16A-TYnl$1b}C^`(Z+R{kIb zWjSe0Z~>n)`ZEAeWafFt6jn8vk*7jbT4@6U*GdtCXi@Frl8y(3zWKgr9w_*qpefzp zs`7;Zg7UY+k;)~DCTlt5iYfUb1Zg?H>-Z8Ab!YmiRj#UXeR7^vdvw;G9%`jlOi?%= zXdsm#>32nTsp77$c%%UoaOA;A#~*U5cEFIxBYx@M6)YYe_bogDmta@xeA()EcZ)m2 zOe#k;slD{0lE$%;qa%M=_35E-HM)Ael;mlx`Y?&AY<vA7hi-4iploqt*KO*TL9ykS ziwgFu(!skWiV;CnCHj@VcbMc+@YK<od)K!=$f7qzTl)4m79IF&jW3arf3C@23{$_w z7Dy1Hd&WCDaeTN*`2~gOSQD7K!u_Vy^2Ed)-6RQ3{_F(t4iAHWqEDYwEp_Emo+c&+ z2Y0+QSAKV&t}chAmK)~@y}Do_#oeJru3Ll{n$=0vfk&`e+>Y#fJ4>%C*`VADq7tY{ zC6UD0!sLcfqD%5uCzT}W&!?cVrJtpj#WbaIN?ol?dhGA0qx>&PKoL&Lc?dCf@$!Nl zjT(C)_L*}DYIht?k&+(#(z+M{xn*RkF4py&$AHRI3cmfXfj%9MG;);$gK%2Prs6A0 zaKu_hdB3N=0CzBmE=x)6lB1tb{Yxy}9_WjFUUl{l-7u^KW`I0W6U6R8P!)-(r+iii zjBAw8SDA!|5hquV@Kw$nsG)<E<=^!1l-r~MR4!w%yhGg=6Hvn(hO7E$uw2yc@a3O- ze3a;MKv3v?HMOd^{{2~gs;kN-IcHHf8T$e}T~rmu`$2xeR-M24&4GU@e+dI*c5<Z0 zN7d^p*xztya)4C5Q1PP-k5hAph1ZJgd$}yhgnN0*J@$Y|f_aL_3b$kMzl}ewJY;YQ zkR1o}d>=FMB|7pNq;MgD&UVH2p{(LvU!VU}C-?8@5)R!9dghauqSUP%hWp2HJkxfE zhuCKF>ef8ILvbP$p!-x5RT3hC?0l=ha(NXG_UY2YzfW2J44DGN^oKfNU;XcwK^*)^ z`JKV9eD0w3!QUI;NmZt*9|OF+w_AcEXzSkI_0P-g4(j%dW8mDuJC#q%CG>HH%Ex`z z<So5A&}iv<ZNFSlk*n*4)>HympqDQ93wRZU43mM0EpYlYhQT{o^8E#F2oJJ4vBNE+ zOVme>LOkrla76{fx^&W2{}%GQ@0Kpq`Fl@-R1%Qj6<qDCa@<Yqqd#FM`2*WAUf0SQ zfp`<k*GMyrla}@<wy)wnp8WZ597xy(D|@i}`xhJKTFO^@t)cJLzKgwP8Ty5NEoV6S zhV#x~&{gKGydLcR{d0f6)U;m;8Mr;eVqnsx*TB4V#M!NEvr*_9?C;oUC=?M!%xhm^ z93ER582EwjYSsw;!JbO2e-mox4RUkn;8bYBV!v;Cf~9&^Klc^zfh!O1h8PGja1b#t zECwdy_%&?x|1SIFGT6DaWyz_sCEJsjP=7w4ds-gQn$UreAA|a|@F4c7h6L)M1Ul*R z-WKeQ>stNLsX@=O;<JgZ49&PTe0Vm}+JTa74`L^VRfQOMxnf{gCN&-Fem&m9X_%K* zX-bPk;7pQ^XI?(umCSTVWV{f^R;GPUhsa~!y|w>Qth#4Y{t;}k(2}C+l~O44vs=pM z1;MKKWN#C%(%(+h%Aat0_inf2UJt_*Vj#r8XvDza3`}}siSg)6xQ%QD&@#7H4Fl;% zZ}@9*2E8pNQm|S0Ph3HquYWiMCr1LN5virGEM4ul1ON-!n|1Z<h`kZp7V+6!IAgc8 zE5HO6j7w1aBnZg_7h6Z%DxJy`rVs-m21YLihNVI(DnuQ=P3`Pcb1{1u_Zs?Mjns-C zzi{4}fJ^?VY=U|XTXD|DLwh=#zOUcVTfso~AEH#h{G$|<?-GvJQt07RIe+mMB6L2& zPJ(Sble8#lOnyRTHw@SrVp$XUQnV{fAqGMWj9v^3&A`MZ7~`|?pw;nTx3T+N$7acH zBmvDckpd?>bJ_`hRu{2N;G9;XKeGKms-!YIx4RdzLOBR-J?oKlg%@<OhUgE#i3j(w z?1|K&Ah#0rVKJd^vxsAI@sJScoL=SIf|Pg~+c8>EKf@GaAjH7v#lYYU3?>yM9ggrp z!d`48p3$>x+U#)*jHs<BWOGsBE+k~ls|ZhfJbPto-1ZNc8*aj`1gF9UCGGET)qxx+ zSmCBAwxKLyBk*Cw0Xv?Jy^_Z6W93l?&GKI&8*%j&pQ&i?B#4{#Q-&$TK!}0Si-Exz zSVfz(y7x-9<*=8O(~@(zRA`GqgeVo9GR;QQ(}~^G%w}-sW$xJ)JVo-El0>zAafl1@ z`%?OU`sD+a?isD5D}PD&5td2MW5evxO?d*`v0;`C*6Y~fr^YG<*{g{Ie-eS@N?H3C z9sUk65Mp4IU|?7bOl{E#ju#Lm^_a07l*tJIVjR<mg)*MtWlE0SR7h>^ChvIm;(zVm z&!A-099)-b74w9lP32VP%cklmdxiM$3~VxL=6C|km092Zg(@s9#6XCFgNK1(F)+s- zU{2yslWUUvaUmm^V_04m^2%5>BRP1@=wDM{z!z)dh%Xishz?B(;M<ew^)Dg(9bzEF zz>6OP!(w0>_<IUh0W%m_$_iM7XKw?)(}$km<-QwSsCe${(Qs0A5qqhxkC6?h<nWyk z10e=ptQa_eR&22puWE{&s3QFZHY+Kf;!%Cpv0z!#v8*!ZQeH*9uX@+z)02RSawAM3 z20{$H>@aWu8JKXXRX-eG@w;+ce(;v}tjx15g~?GQOugV3n=|}-rlhl16#7QN-Ne)M z+!^Y1C4)VGdQ%ZZ71+8jW{;{3Q;2~O11}2<95@E%_)e5F`Uw9l1_d+HUtA~dz;kp6 zX^H@HClkV1!TNj>OCpIU@u85&$2ZIP?qWDPIZUiip7shAT^q?5u@HHc{G~j~8Kw{e zAqHL^7&u@IOj43I?p!jt#@;`Lxb%eH&F119?g_6U@PBO~ZGSm2W0w)!zrbMt)!Lw> zEd^66+U1<Y@>UKMv3$nm%M-#!M|Rb5lK1;3nZ1TH2n&S9aQv&fke5dfhOG=S@G`~# zK^|p%+TTe<N}BRT>x814IKBC94z=9EL8Rk2q2%0g5e^SX+RQrKVR<bGd*kzzBrzDE zpj*+IwwpMb?E#LDS3K~^$vl2(Y+0I+uxYhAzDD&NFkVdAVG1!2V&FxH0mZ~W5Dcuk zsYT+{b5Ie7LliBI^u)m`oW9NJ+&G--fRG^*yeWsO*-oelop_W+f2?I+W-Ixd*dZ{I zLoSA_Cwv%UAjH6E!+>JqANZto#755hYto4=B}<m~oDU?eAz<JYvAAZ8{rdCCJEE4Q zykV3xL>1wq5Cb6wMkfXi3Imf9nG5I-pAj?jD~`iQm_KPoYN8mGzJnApt^gC^cZh+P zBL)r*1M6p8-#4}s<m&(Za_qLS%^?Ot3<v{(P8MP##6XCF5CfwQ10e$&bzK$$9AY5E zK!Aaefd!Zdze5a!7#MXJ2pQO@>#`8w5Cb6w0t|!<EWkwg9bzEFz^KDO$iPNjmxTa_ z7zi;CU?5~*0Vcxl5Cb6wMjZx11~%%tECe{jK!||=10e$oFcE%-7zi;i>M$Tr{5Om` ls6&8541^d6F<|!S{|EUgPMkK4aBTnp002ovPDHLkV1k`vt1<up diff --git a/superset-frontend/src/assets/images/sqlite.png b/superset-frontend/src/assets/images/sqlite.png index f7112cf7094d89a214df1497e0dbc443d2e3d2c8..d0098a79363c9cecaba1464d51bc8324ed930ab1 100644 GIT binary patch literal 10972 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 PDxj*UrBEto_58m9xPVvN literal 11330 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 Eg5T;GO#lD@ diff --git a/superset-frontend/src/assets/images/sybase.png b/superset-frontend/src/assets/images/sybase.png index c5c8bca7e9b64c981a0cf2d872520b976388c3bf..1437756a0b2a99ba19560b953e51f38d9a90185a 100644 GIT binary patch literal 18309 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 YIQamvs^eG0KnLY`y85}Sb4q9e0DU(mJ^%m! literal 11992 zcmd6tWmg<Lw}xks!QI`9dvP1w9g2I=;!?D@78@LjyA~+!4#gb`6d2syowv{V73WKm zm9>&D+51ki?<-18MHUU27#RQnpvlWgX#fDge?x#VBIsW`9yF@`uLHVi$VvdJCrJ+h z0JcPVDRC_?;HeS3pSC4Q0K_3Cc815iXh-f)CPAZ3u?OblN$CbhDhLBk3SJ9>S)6jF zf>pF^N+a_pGJ)jp#`8P0-A$nV*ILn6@_=jONs;~7{f_gwsq2z<6iirDR6;_zBtkE0 z<;j)wh9Dp;EHW$z$blam6!b9$7y>BTOmk9N>j@MG#PFD!QleS(Py%cpc1bk(I7~4C z7HI!g_Y-m;f{Fbfhvv~x3E_HlVL_l-4iG8~B;2Hn(*qV3BN;&ZVLc%<R4M}6mo4O( z-3HwZk0n7vEmB8)XyH1)xJbHM_~S<ViZeNbAwvf3%BGAFnM`BP6xMDno3B!r_>MP5 zqsl+M_|u@-a_#B0&VAWY;M-BbgXKjdF)VE6Trm#Og{3T`{>OOcIqn=z4u}=U1~#z8 z?=if}uvK=p)H4e(FgO^Un_DwqZKSc%RL*vLoR;wNSZ7gh-mDLZ3hi<@^))pG*{)aB zC9`U(mArL{e^552nVI=B0EPZp4VD3jdUc0A{<s|M2@C@MC3KDg2wzGGj)2dO0l>V- zDdmyazco%4n1LE2GOkDSbjyuG3SZBo5({Og#==l^7E0di!1VdwISw+#iuq|nk@1k3 z3)H&|sTj2w(){jh4G!mjrTPgtms9~buckIi`MYHR_E@Q($w=NgI805!hSY$#typT` zU*_Js+wuB}WBA(R@kZ_Bm9&wM*UckMrxCkbgJ10GHPI+tqT0#W|G211m=~NZyD6cQ z^3z=t*rz2Fz7&6&NSv)P!6`SYEW%~a(fOd_r3}KzV7B<p8WP%jsH=#(7Z=M80->VP z_6O=90%AQbFOg=ujL;s>3CL(Y&sZun9ghyVc}J3=i}F$fL>{r3sk5QvXRED+TClDz zCeRxztX%BgQEgw#{vqeXwaR?Ihulxtm=N)<hmOwA;|KIKGHh^Ia`7do)Oo*4FaO1q z2&z{Wz&Xiv`|iCeyJNAY9D8h8zyTx~KA9r&92cGIsQH&9{pYcL+LLH(l*JHRlCvC0 z%<nyMXEa0a?OI%sPF^XiK?V!fV2b3=|HW|}@b^!zk=*)6c1M2`6AB{E7kKYip1D2x zKkp~kwzJR0oY<gqaR7f~JVtB7F<1gT*=;r9e>it<9TnADPW;>vAXIKx9=RHRWA^Wy zVPVTHdMw}q&BgfchOtD7zdiq`*x&wLSp1AqxSMA3iD_-UsIXL&LG~OG@j~;chrnb~ zO+(x?ulwd4N{$^K|I}P~N_bC1C|5~%fe6go&0Y<lWV!#T|4F+gCX%0Z%{L~MH9(fZ zQMvjQ4Kb9K!)*^=ulB-ZK{z%<nOFzX!Y_$@0qTn7rC>+(3Iz-dt*7dk*wTu${n1<! z@O!Ab@o|ZfA{V3~dVTGP`{kZK=vhcGHj(L4QA56V%)FidM~GLDgX1F7qQ?OStYT1a zg=CpP&sI=aqX6~q9!{Xyuc~@p@57URtF6VUv%583kY1=5On#m*cqKX|CiF7o*uV$o ztyAFcu!n%YeoFPM0OtDhD#PC%6keYp)EyA%HrPZQeRmuj&){B<cZ?N9MHQYUbRI(^ zjJ`0Ixep5uXP|xI^~fGKs8v3ExhG*36&0-`U>hRg+X|)XUk~@fY<K%pJvK<vyhE&& z#}CK)NX5l9J*Dbug$yx#7(*Nx0Q{2<ZjhmI{?1*Pge%ipE>6t%HcDt5m@=*uU&KEA zB*aG~DMBNp9U`NW)xoeo^;<51x>d7%tr%M9w3?iP5I36m8ew_-OVjnnJZ3d6WDU5j z1rhBm3ZbV({2JdOo>64jWvJ0^BW|l(P@6oGsrj<%9?<sDW}6BYmeI7w5(d21ZSbcp zkwz9`=RbcS?RsX2+R|+u<BxP1rBR{;#FJ6dmV^yQ`RhhMJF`*#*7)||y>+Gi=<@nC zqs}8fOMry+5Qf{_Z9g@2S5Xe#FJ88*fB6gF&h(=qw##OsVQed#4i%A9mMFVh(<zS0 zJE{hk=T}?p{35^Qs+<RYh-Cgb^uf`z$KXG~ahBX0Ns<=)%JKNz-={JPGjL=*o-SPU zCtJKeeq0<ln<rlO{rS&|xqolT1i~rknF~Ce#9=n(_~_S5+;~~PH%tvH_%T66H6?-G z%`%Oi#W1rOGq7QMfauYCPUUesw=<El%mcD6yOmFVBINR^04%p&VWRA6VGJT9^dkIE zP$MPV9AS&D_ap_`&5q8GcUKy9<6TWCLQ&2mETPHDUOHg}^)+j9=tnEBLi0d5aviV- zmG2#;Uh`J~YSI}AV7q4l`sx-IV|0z-fmN<i5vk;zpOPHT;Dk|jt+}&rQd&By02RX@ zMJhuweLP}kqY`H`?6$=O_#%F+hI*p5NCAc)e^7O%IbY85=r#HA8TzyFSbFwVQCt{a zkM1RJcQ?xf53eR>34}nNjw`8AZZR~uOk;zD<)dVupjodfuu$eX{1GP-OvBI#1JbQG zlbWx|FnY>IaWtnq?3zlcT{Fr#B;3jc1?-a8a_pCsS*7OH^2?^rQUeK1vA(FNUdXU) ztw6W^$*PJ+XH0`8sp0auv~iLJP1wR+)k?lvf60~x2R^0S-7ozR8G<}9R44ZCo0y}V zoIu62>UQDeAVogY>;B?MVp!U*G%I{x?XJI&&0X*{>X0Cf0~!Z#*%;LcYHY+vazP++ ze$YSB4@24i#0!Ya$xOoca_S33s>Ho-rn7W5S?lmNc)IicRPl+iB>eKv>d!tKDIL@P zO&l)w<qtt4#%d671s*fQR0`{vg62`iinQ6Vy}qm|qt?5qgl*4%X@&IP_T!!Oo+bX1 z!DMGv_r>8T-|w63Kp$vVvBIhDkCwp=*rxQG$fUPx)JyAGQ~XL`vfwwAKN4E;e0cZ+ z-3Dpwww5P~4jrl8-E(;r$t>wQaHnLPv;f5$!gv3`{{q%#yEy&Z3dvUYqWCO*Ct5`w zLkmMEEG^;-3i>3IWY^(`cajyOVk*s>fb)=%J}!&umX$>^K{gWV0;vXF5M}}sRWE*_ z%Uf<no<hgHyGJpIv>n&tGm~Jv#5NMUSr6;j8vMX3Hx$}OvUi!!)yWSG7kGNF|BM77 z@a5CujV#S&D~$<0fmjZ%`v%li84&EbibD?H&(hi<b^{phSZ!f7H8ndEStB&phg#(^ zsHp3C=E&89YpLUrXdFE~Jt0GZ25=jrDVYpIE@Spp*YlsvEw*=%$_O)?Nwt<kQ`B|} z-AY&X_9D;^9p6-(dVladf8NMju5*GSdC|NiD}yP7KX(a)vHx<OQGfsadE7Ih_R%Y{ z&2l7NyzLWG$|iGD*|b>*AbsZKCXGaGrg}9d<weEIGV5$$3mEQ~8;-Dl^;5SM?Zak- zM<Q#F2`6IsH?fL;l8h+Mz;S%}3sOo?MXnzB@n9|3zng#;gbna@-Wm3eiWH_fU0H;% zWgjzG2;JLrOp-Z+RE%0b{HDs0+*I{p$*yyO82BQ$QS+KET`6<npAFU_;xwVs)}6=- zpr37B;BL_H8(7)K=!PbnZgxpx$3{x6d?utftNGS6mJWw460oDjA+@~Td2)_UE*E+< z_^#`eK)CfPdO(Ais1z3%lSuEDw=;%K+jUPh>cZjNf?Tmu;^|w$?-;j6#*Z3u8WYg} zd9w>q!1=7eaL`9dN(nKxzhQq`F<FQ~O@VT>-uM#JyGcvE9L_*BmG&?$$SmMYG_Odf zqDWX)(!eNndrOEaN10#cjhS<j=jXQ%?|6MoLmJg!W5zF7g^7{J2w2$)hpoDkRTnaP zvWIQb0Nq+{dWoR948GXiX~Xw>yOKNeMX41pFW?C<HUU+Zmw=S>r+O(`k~L<RuOj!` zFK)^gbmI*w78unf;L_)?msU$~G^p;gQxU3Bs~&bWw9VRS1I?#Lv44loAXQ0&$(r{N z@sNrKruKXsUJvW5TwE|jdS(&e2rqSDz{6_XQ6tgYTJ$-GRHCn$f@;haMF8!`spLBx zzWP(lTOtC=8pU}gN(w0lNMpqVjweV#!tyGK(z#z^xnAy+8or1}B8MbM_i<y*n|S!O z)IyWIw{P9!Dod-xWuYGv%~8y2S%#?Hu{}}huQn5F&7T^kusTci<CED5gSyuxTl=$+ zI*i<X_TR%YJCT0%ULo`BMp~b`X0#`=NiHZ}y0#yPmZLp!Bteo$N$tzn&a8-uQa&Wz zoQcWTGOhO4&x&`(mwyphNk(fIr_v2}N&Tg9zhFt#fXudQ#QY3%R7T}Fp`q-DriR<8 zE=asIw9V3$`Q$o4Lt>>_$t*ON7C+m7a@}9G{mMUkQ0#?$DpuV0A_A9kJaQA|*9_9x zy^j<J9;3Ou9<4G$Yt8T&%bW<=JFI?T5-pZsQDeBteRbBg4pfhkWj9VeU$jrk<+V?1 zUy*?mFEqFw+q*3S;=|GqjCkB-cTt+KE>qT<!OHXE#}xYYnr6JZ3XRmX2rbZP`GH*8 z&{wC6M|K$Y<fIZKYbjWKu&dit@e{>aiJ2x3#+NkPJ=b#(ZAHGeDfIXtoGm0ckQCoV zYIZyITb+tn=A1+bE>&1b6NM2%`Y7$2Hmv+QUOHS#Z*sdqB=fY4d%+V79RVgOGz9^B z!jZdK*_&4*9Shi!=9ShzyiEG1RcnZM#Q{}Odk!5Dm6R>?;#Hp1MSe3~a(ZY;i0o4h z#+PhQAFJ551^Ku=A4ObsB*b@`WwJFi6oRTUEQR*&fH5;qMITY_O#RpM*@1HHmLdR$ zIe{BUn$zsiR+WAM#9Ti8m-t@LD21)Q&UcB>E867YY{?J7wQ3(pyT6jOl(EIbkW`^d zDGXt@zz|W+ri~_Pc7-=^T3DwWg7_#)9W|;$$Gyt4^`tES;_i+~a%HSkHj={3EWyWF zHiejy;-T!Qdt*GgJOoF>n|8GJ{<6cJWOtgcp*CS(qwS|!kn<Ub^;&i2Q1~JB$|mOS z$i}`<l^3x3^BhOqem*$lBbTpE%S*E!*$6VyAP(4Z4Q60h7|~#^BA;t}ut~yjB?Lei z1+~>x&Iv`HwtcZ5EM_F)T+Ng>_o1wQ3d&F`IOX;LV%B^i7|4@JcuC}*?qUtXCcIW9 z4z8UoY%p~Sy~$|OoiuE%;3s#$AyzYL5A`(eR1?jJcs3V*AdwV767mHyp70e>&dZ}! zjl|wX!{)BOl#C0fg&`vNw2C!PLnJG^^$qpYmPmC1YvT#37OTBp-1u9Cjbi7Sc>wCV zVQ9Fjjz^%ZRv#nBU?C2pR;eywE}~Y{AO3dBECfE!-;2+SdFj_ShBJ3Tq>Fn*kEDrV z8b}W;k@OCzuMmu1-&aRroeyB>;%GiF!jl}*&Ib<4P29mb&wb4mCfIt>9)Yv9mTDhj zboBq0i;7FKa;F#8{+B}`cc-KQ_LM0#(QsqvyYKN?zSb^k1AsI4*45WCWb;QSYGE0u z;r#*j{WmAU3Ys6dR@GF=5G8eBmK6rVqnP(ug3g$)0nuR`<0a{-^80P6ZZQI-D?ZmV zh;6N``{>vCDr9~wQJ%%iOi10y6rP}+go9wqm6RXYU-}y?OiLh-MA(+4^ilcHilqA+ zdP0Xxl*D}`5icV~<Rct4*D2_%?_(JQpN;4A;Ybn{mTm`UTH7P?IUhDJeA61@YTd^Z znn^HpC8Zd6C8idOzqvkrdkX$42MWtiW7Zy-6p1q~34Ksc5~LK4a)rkZB**v(rnHjS zEkhb9uslervw5c~2So)oGTr?515wQx5r~R<s=l2N6NJK2&59b;)k>5sl>MT57Yb<f z``%zGgW^LxEUvG^27650;(@&iFH2bG7d`fB6wzyQC5D;Cx$Yk+<p&ZBu!GRx41DUe z`LP0v->u2xg)+po^6%*d)Ao8GkE<4Bw+Wgqc>8_#ZNvazW<cSs)Mskyh7d<B=r#*& zSGFT;u{Bzf&w_VddqaH$%@p4EkgJVp9RWSGF?ur9x+Nf0U$F-54wh%~a1oa(8<~T) ztpjN>X*w&@(q!nOZNxIgjHm%sv;8*)ZJEe;lf_+`27aO49jJxz7#=QTo|17P1VUaj zKDM`WO1t`(Hy;s1Oic8GCYTU;C&NQzciERH4TA){*sx`C=_RkkRjc>aaOQ2-ZV%=o zPN|tIs5170a)=BYABW{5hD^^t5O<>Y;SuQbLq*P_?y*rO@7w9jYX3xLA75{#w1Tu% z<?(GaYiRy@5A5xNrl*+k*=aZT3mo36jZk~qZ*e(tiumkVW-b`kB$~>}uOzk#&)$V; z1I;gJmtoQn0T?eEj9sDAbyTKYsX{}abTHm|h#T6pnA2i#GG&#i0|}Z5Nh<FyqPRW} zTJ0ipzn|@;&2p^FEELh9*-oGZ3mugVMlbl+-^;W2c$Qf}(51fcSM4ls7P!ILK(x-Z z_>8T|?cX3L^Daq>3bO32Y4DF@d)XJw`w$ADkJ^Giy+t8{RwsxA3c}TWKZeUb+l5um zm7>IhreLkvna;m=UQT1$Ojw?*Wk21b*RD-x7V^QByd@u^ry+vfZ+J-0Y_SiSbl6}d z^Ck-pZKf~|zeyU1uu5YUS@2rv#o<T=ZY|Q+rzysobywu&FuNan0oEft_(I!CtuTW_ z8}|<wGg|Pr%5gX-QlZ%!>11|VYEQX^@fx9?o-P`=pBxoYuylxM$jBlGzbWNgoxm}3 za&GJ~9@JSCGDa?9CEFUHdloT+Q_kc*M&b<p1Z<bIPiP;YYCB?furp#|?dr)Lg6M^; zg@5PmlgNEgs8I=4gxlcdpIr<<FRzvu!%yz;t{3IC19QBz%=t89J-JOpk7Jh?ZGi89 z2RSvp#hRx9I6GgQ?Lg2L*s2dNjIn|~XHm)mxR)>u8bUBPM4Ey~!4I;HeMB4hax0)o zVJnZC@1O?VjZ{a@$_R}X4hLC6W9b5CH>@@)1}37oT3cIGcX*p`d|0JL86nZk6z$Bh zn?zmxceOWvkq>5md_?$ZOR)O#xo6>T?KKC}jNZSOf6={omS}LG&FfSuD-O2X_uiG` zu9QE^y}rl(`ilE^r?gZ88_$1;_Nt!x_h_jiLmgM%r&6xwA(vM}<HdDQv_h?^qunCp zShXMG2&89l!Qov-oeLGd1_U;bP@v<3agzS0H(!H$-zVZfp|0}kma_n8CBbOT>sYyJ z1vd`X%qId+m4<wNwF6T!q{?|A;}jK=ObEe^3a*+AX6MB)va(7bb@+)a#)68dfb#ES zYl?W$_4<2vi8JX}p)Jl7ypJ%8Tum5cF~!L<4OD!%667IDCxpPuhy)B__cy$4)<83U zv`A1yN&NL_BA(?d;S~ED#!~l495XmM(EnaM@&HBLbV>-VqS(FikH5t%s%DPuM{NMQ z0i_P_zzBg$`P8l4Oq{UyCm+e|89C&_l^?Uaps7F@%=ApPF+%DSmg%$n82^=LX#?T& zt=J4jVY_XYuZH)>{{J$s@Hd-D7uA==AFEuqB*`f-@UFtVc7fr3GRCa_ozbXZh@#b# zDkEB8|1$hh0wo-35?QxnCN&&1uMJaDCOfDklHLi(iEW;8$hq-+bW3tYXFj0`L)?Ey z9qIu<jI`{LRhaU=YL1mv8HWEnk>Oz%d6p~w(?uJeu-h_i>n>G0!)IDov9A)?#jO%} zCSjeAwbo4x+~|kEya~8V2*%{nSl9FkU0}kzzL~J-@26fS&CQxkx9V{rMbKZZ2X*}* zv+Hr2U=~TGzv41}i?;HxoI~g==5E219@0Vr@>a=HN2W}v={@M}5T1yJ>3Y+fg0I`k zz5tFpWt=w(GT}YbL|&6WIlI0qT-<XXUx)+H>}bj=ATqA2gmYsMse|~h@LuHoFrVid zrMXm8qNi6t9H3Oh$!}Ap$Q~@D{3Qb$EbgHWR6_k0w@m~c_jr-50Z;9Wb=YT15ok>^ z*{N6;H)_(Z2!<a3TCiVF_^I2!QfR(<o@x*b3UY0AmiADs5go$%r$*s@M6dpK4}S<a zOA31G4#Do-8{Vdb=^ojt?MI&~ka!cmGH10XjV%l+;lOKr@AKd-Jo?a!_!Y5$Yy16n zgdE-TAc$lnftOZqJHhh9IaP$Y((e)`Xiv(XHC5v2Vyv!r(CRu&di3-!*TbD4gPtj; zzjykp8Bby;62%WKF030X=G;Mup)~3h%kcrj(HwVNbPr}hVb3&4efYH;tAI2l0BZ)z z7>~mbMyaOHBYv}0wsi9cZYrxD7AF`x>MI~C>U^uY=gysCAMFhv7cftcL|Y&@DXx25 zgDN8q{RM|*bah;6jvwa))_}SIb2H5^VeWvJFu!W5k3#9THwmJV4fshx4E0gUp%1~j zQY_PA(0x0alkbv74X(Te9!xyo&3G4MJ@h+&G62_rL7mBPFBeO^dtiQ)h75NwZ;nFi zf*7g?CGe<MYTh~TZ!`3Ut_~;kP8`NTd7Ne3G~?*BFYn(WoJ5yiu<3We4uLfpte~Q? zbcm%_Tnw8o5v7nG?ykSrb+`QlyV@+|+*GxEE^?@RriMpRv3(uiWCIynC_YwXtdb$& zg_gG~u`dLc=ayof$v5Z98Yxj;&GWSO(s-Td%~JgC#;0o8<~@U`biXk!gsXrzV_s*w zeBkvStoR=9w{?o};*{MG2nAXws0KtTQZ*Mm?Hjd08hS=$Fjk(d_8e)Do4#Z->!8ph zosKE=^pKR#X+^V~b55&2ern(ZnL7CASn80uH94(2T}c(a(OTd>DaqnfniB}CJN5od zm-<j!iw_Mo(HZLjX3y*SujL`fkTstKWnpFsJ_!dP;Mn*d%^I$UQltv<^99calvC@% z;4cqW{@L+pLDtE$fg4jO27No$N{!kG-Bi*7@)c}GJBmL&$x<dk5MuqJ&(|=Al<tdV zfr%&rM}lP>#I@#Vx0AY7xtvcbM55}LaDq=BI|J{&C#V&u#j-wMfLX~Wex~0SF<Ql@ zv`zr8P;#}0Q)5=GPZBzOutWXRrYmHm3C817n<&xEZ*dJapB{)nS?eX=5lGXiqA;D` z+^{k^Jg3C*?4F5S0fc!wTzPAo%*~WUto3UE>Q5ztXj@G<#~U#9Xs!6dfVSn<MdIQ> zB5pp#d&k=%sVGzL?c0)n=8lS{r7;HDY-7S2wA6+sJ?_PY9O>>YYu6Qbm1}uxCLGpc z{po^6;`I}JgUz2)zq%h|IvXda2_dE+mQfdHlrF?VT3A!_Uuqdq`!0d6`HXd=gk<Fk z+Um9a)zM+qe)#5hK&g$HqbdFG1RGBV-#KjGe&v7}v;1$k><QU7<B=FA0n!hxLKwr` z&bN3GD4cX&)h9`b1ee6tt&BE#gL*LrR01bK;*dtvEO-T&m>pmI3S5+L_AxOMIOz@k ztVx)(SmC=YlR%nHX3BZL$>l9pJ3pIqRZ{9Naezi18#?W6c!;g3a{7XV!M&i%#J}o1 z<A%aG8WE>!Pz=d)#m;Dop6FvsY{%V`*C1k4Wdodp8hZ4R_&IcM%&y3Emc$gkXC(dh zy<(VG^Wf(K*$7+1;4<9L9;E%5sfjRzqIH<&Q?5&Pf$yY`qQg`SQT*QVu=r#sCS3L7 z#8-0M_S2qNUE}5%-Mws_Fr1kCL^9FJ0}LY=l!r>8B<BWN?Y6;1xUy!G)v&Itdlfel zAOkz_Ie5%fb#zL&KVcy&=<mbQ-(d_yw|^DBSI%<VTOpCpyoQxDI`6E1)%0XpZ4^66 z&S`*N#L=xzAgZj@`bMVLlE&?6`W%Xx@>VStn+Q`gsAijac2FbM@8q}KGQ?oXpQT<n z9DAY{y47LPZz*(&o)ts-%@rjT53_RV_*8Ig#bPF>l(DrO6QBG<sC$Z=D8x={|6N6| zI#Ua2fX-f&tU!8n=wPt5LRoVUmM?mAkpGQ6>+*xY6P$`!;hdYe3j9_xMOMo~`k_QX z7Y$g4dhq?l`I57A4a*e2lpX1(m5&6}Z9~+Z{yp$@cK2_wg5G##+Ia6W#3MsvLKuxz zL6d~Em9*u`Q3^wpZx5rzFTYv<c4=G-s(bo-kHU_n0W4$EEvQ<~Bwe_vr#>*8A$qcU zj0F>TSb6CeHoHo|Mv07i;r;$qqswpDf`}yVL;C2u?tukUi?~Y}=mJXDO@i1S3rB73 zx-&+#-!779HV&#O!e^FTG3}Y{2dGLI=0?YAlz!gy4aF#MBi)0Z--lHQYujzVkYs(O zM-9xE8{WF-;ovQ~`_0nQ!LSr{)l#xY6(l7AvnkG=16Z+Jq2~B9@t3`)eMa4mYF7tK zU_z+S1IBg(_j{0g_D2FF3x@tZxas3fhMSN!b$EKU<Lh^_Z;Mx=&DwyU;zRJHqJAnM z)GRt^yubV|Vhr(&L7O{Cc>$>Nn_oI_T*P4#o|i6D<!MWX)m{;W3BS9Ibsiq=cgD=G ztG;kqG{u6h_l_L_P_MUMxOu@U0s8{v*iSMN&Ke)CJ9xfiOvnDvAbVvr*xVWz(gzvz zaYaJWfdZJf@3ftUBCsmT7L*IPsz7csy~`GF8y8%OHD(hQLuPBjyQ*^nXusOa4oNcG zJHCv*6M#-)2#ji2H*>ltA_L&Z&LQI8pZZxgWFVD2PeQD(7LIYu`0e=>t{iE%SUh8n zxFM9#;CKXc8E%a=g9<5<e~cPe1>6)vq>N&8A45akc6RrC)d)wMD9R8hKu9uR4+|s^ zK@XO_e4}aOb?EWl*k(U?|9IpP$eHrIqMm2zkIY1wq1Y~|WAeR+nV4C`qb-RSUjdH& zPXz-D;0hZibdg(wg9z(FJ16sAt^AKcM4GT>L8Jnv+x@F=G5}M&3p~IV@}68EeLXyf zCRr@Mjm-7g+4FHKLKD1n9;_yGt<RGz)|Tro?IF=K`T>us)NO6!$%C*m3#dHkv6q41 z;pC~cK!(&$h?A@}OpFj5%T2P5u_#iz+y930_H5I_FXnJx<@f3bTN<H~b|BGE!%MTc zEFF&Bukemc!_*15Q5!%1Bfs*>W$<ZcqY?{v^Nna|+Oq6WPBoS<kZIE%uBe<8k5BM| zUvUp)-5Kb)p3TtiQh|}L`CFgsppvZ?XCst|Se=|Y&$5v&STGCkcXoyZE3T80>YrHh zKos(Z%N7_#OM)rbzoEve;c&yI)CNerES3|_R^$@1)iBukh5+pB&w-5(zrSYPBO3am z*c@lf7Z&eWFMGWj&TLw>&~(DP>nsM5^(5#fCJ$}6!1PR(o!8r`<%)`BFe7wM7mBJ} zp62^+|JuSpnMV5^f<HuAF=5aHh_7N9E1u$)wC>Fa=~&o>bxOm(F&EhASLL;q6G60T z4IGzI+{nj!Cl&mFhxs(-hHM!0;R1}CC$9B362jj^snR<$tf=#}!(H{^m8yes<mCZ! zF|Y1c&Fhn!bBzq#Sn@XR;haZ5x!oc}!r)WyW6S<Bw!~Q@w^$W)fi6rc0Q+&C^U{jT zZn9kXD?6nq<|7R1LF;}gmxqMn{WhwA8X0{?JMs#}LXR#9YT(l|nH0gSmARsbGn}eY zkQHh8vSzR{A%YW%1xyE8jP7_fyGC%Ah<9~S^UygDOb^g{c!Ne=eZN?Ciee|%VLAbz zoT-&;8_+?MpHFp!Yr?KzUC}-NCQH`IV(9TFj~(5!_DIFfLH`Y1eqQT~YLXP^A!==E zJ>uauYQqnD*zvyv3q@Ska^ysEX+#(^N*KYH!Yn6efY-aj+g=?Aj4lQAlM>(*_SK5T zrBvv;o`p^ae<uFE2vFvgDlWO#-uXP3A+oCt(_^cF&F{9Ccyn?a^1?$fqaWzH^uk@z z&1}>@uZ|!qY?A_ZF(-8X07hF1+8|bijn?8w9J5CaQH%*=?ZocfKkRLvA+KK?ce4`G z&1mI<@8im0)T?AM_rY%pnuQG5thyppP_q?azm02vHI#bn25@v?it8>RFRP53B~D2Z zW9bVRa)PLc?ND%yEH|l>Oh_5ch6hZK_%yfkt4~$O?OhGm=L17a+Rs=C>NLJ1_s~v; z-rnWJB4DhvAeZ~pT0g(Pewh>1-(w@(3+E3E{R!$9#p%3~vunDfF~;><kaFHT(~G2| zTKiRSVU8fBBs+ZIg|>7>ZI?dQn(oK91UJ#>wtzF@#xhZND{<Tj^qya4EJqs{(JpmA zsxcI5(4?v3=mRTq$kQ<`Q92&+Gl)jrckN?{JpgAYzzu#vSTIKKusTXUwjX;!g7y5x zN@FF}^}auCrw^}McYRJEH+2lGo6;@5Rlp;+8T`=LEd!ze>KU^t42lw$sF920LH91@ zQ$2EQeco0#>nGI${MS8u3*Iy9=d-7jMk|c%yctCNY16<skXkd#_A{f4gE(p@WmcAq zuqyaV5jDcmDTY@~4ARDOu#YKN1Idf2go@WJDH9>B)~E!989=_=-MPK$ZQnvy_L+Gs zTIDU%8u%8Ng;<fwlD>s_upUR#-0q1%lTOIe;AoWI;2>r=6mL>o1XKY0=lEHv1Yk%@ zGch$Qv+&07t?@l&Oe;*S`da=9U+2Zt_S};cyTRqSRt4gNqSer4-Se2s>s(@fHRr{R zk6+_nyogGFzR3Al+o;<J)p*JZ8Ys^6!2=LQqmAJbjIH=@^PMMp5gxh1yr-b-DVNJf z1Z*?%Gl}SM^O}naYfjhcV-~~b6l4W9%8X2<X7|jf$n)a`^*&psJ2TTdFAK#+l-}xB z$S@iA%}k!G-t!b-)KKFt8w2qS;@5Ow^3ZyqP@QVSR;t(T^bgtXaf!+doGNAdjV($q zw;qH@(9~4c%8FnbKBsjV-28p~R$kC6{qb9Q44;M-3%+BhF+byC%9HEU*T?MgI%ZvD zRKrM=ZJOkfEf?kLp25uN@>^00i&$~e4tQnfV%ysoJ4K45xVsv4R~KwA{Iz(7?{;y1 zaH7`|VpiT9<e~+@^UPKYv7%6S4Pp;G4P>mv9G9E=PD?W2MgX!_EMc^y;pp66AhfAh z=3*qcF^<>C!-Tddx|Vz2MI`$(=>8m9)U+V70<XF3eroa%`rQ?&cxpB1R@XX-_Y@at zm{MEfN?>&!mI^>hrVV3-<+zMZWz-&<_y<bL{(MKK16yNMnfxML9nX?}|EuGD{aT~L zi$hD0bOT`CLrLRADqYeN-;~7BG`3-Uib>fp5GClJs=FU;_2MgxqPS7Rrx5uq$~?Ea zuh%UN3~*Pq*shgOQmXQemi?lh4Jo8=vUw-uWxVy44f20W3oxPGr;KB|q)3Uq?o$=T zk<~LO!NV|U)MopgKI*x=of>!d#hU`7Z@e#rtHBf5ks<~6dsVm2AgP+Ncy{<qWz%q3 z;|IycH*(po_`eS|@>{?l@;(}9(j-T%Un*$RVnA7NZLyzljZ>;lP^;TE`WN389Z8%O zN-<xb_;hSvFTJoIiBVXnfZJQ@qC><8iIWN>AW?<PJi9ku)Sgul{~Hr`Nhkez$C}|k zNB%<w*Q13P9Ye4)3h8&LAPty8RCxwND$Iq$#JS_j4Xqily#ekP;ph>^Q|u-HUB$x8 zGmAs^t9my){WlcS&C<yUqdS*txXeLRzT(Jo;E*pmiMzH`^4Gzis`x*YKKv+n4Y4k; zOba>u$wIbBES0q2j>q<k@>p_3@9`@}C5~rW-{RF+_-V<7o(<__xO6G6y8Z^r(a$SC zK$bs;iZk*bynB}DSmL}%6}W_cKWJ{Fp|*j-&u_2iis~Dd<N9*KfvS+E340OWT6oz` zvVGu(r~Al8UW|n>Lv?Y&o%y@{4D2DnFkNfmMd3z^jav)FcRFxDZ^Ajfs&TSjeKWx1 z-d$QYr`{980XBww2ee*)pFSSeesSJSlPu1pnp0KAOG*ikvIlANP^=V${YOJ3Jl&4U zEpx%s1$5an)iQ8QQ(%YHxC&iW^`W1tt8w$Ka-qZ2FO^6*b)rXij+*wTKa9NGq%3*4 z(_AjmxA|x=xsPmMfO0xG{+V_BgmkT#)Plr=<f0CSf8i^;Z7<R&p8~j?Vp+fiF?v;t zdtn}94O^q|Aqz_lW0QWaaV%<ABB*knHz+v#a&Y-{z_M^e5d(Q1CHb|8(N>yEd#G(R zZPsRu?zFU-?kj0ZjLbHN>eDcfsmYu=?<t-f5|diE6hQzzc=-D^(b3Li>ecMZVgOrz zNfsc1AN|Xy(mY3QrW)|mR%fzggW2YZp85rC;ddN<Sy(D9@lnCbK6H7)NU1OwZ%yH; zK%aM9T!}-0Lw33$497qGgQH6AYLmwc|Bx7g#-W=~;cTf8v)U;xZ#T1SOC>CX8Hfsz zl`!ghwC8>mL~@*IaOv>LKEh&dKA+L&bI}FaLM9IpV^}+j|JL5gv~4K%Hmm>Du$Ta~ zs|Wf|aL|cHjU!QtmR75)y0**kC;E=unJ^a@B&H@x>q*L8{|1km&M)H#>43uds%$gY zEb9)<8+bDf6b4(W6qy@i8t2AR(^@6~n`H9>n*CGKMZ06PAnVw#ivpEwyzU;rVcd7# z+`wysX19;^oh}#f^)P6+qYezDeHJy7S6Y<5L3E@f_+VvH#v$qq_b>P|GDaTu`o4~h zouyM_#<<5zz{y_DbLjxP99q9r@F4<R;+8Ao)tNUfk5O@zyB{usC;4xRHLsY6QusDB z^T%9CaQyn(Z|VX?aXCF=quW8zmPZ~r{qS9my{F-3>$ibx%V<T+Cs(+#l3IVUpRXip z2pdp~bk$j*dY_!H=o@w9NBFhzLh0Ao1Jw4R^ppul#J}MsQs~_Brc-+k24<JiGq@hi z<JZ*nvJ8T1%4-?zrA=;~k7gi?u~jinACb>M{`VF}4ia)#Oqe-ROZIY<4lt3dmxkCH zNSEUpcAt4ae$s&HKxT)nWG4f5S>!#H>moS%on~)}O!(JVYPRCCVFgZPV#q~*lH|k? z!ucg2M9=O@X8x{Tw7*v}5jYEebfwbxsqa!AnrvZ3x;KnfgbaD2>>Jkv$F&o)f1#4n zBfhk$QZPN>8Y*yCzy?tpZKoQl8QME{)&daShD>_)JbB8(hJN=la8zVKTcQp{<dEc8 zGO!h!DKScDtqW&jHKJKf(cW1P=&_=sU7our-Fch39@Sli*!qNQa#0c;OIB?%$#Flt z)iNO6dMRk6_E<v$Swk)R{C-`Y+ztxV#(QlfU6aAbjTThK0X&XHr$bb?jMRV7PBQ4N zz;bt)7TScg1o4^WngJ7A%Ot_UV-`!*bJ4)9YDAd5-G~X98ae8VETowjH1+a*?a1c| zu#`O+NRT*uTDl!wL6}xvfkzmRpXV^Vg*qXhFWiFm;ynxLoxua=U3G(f`NX+~!ueS; z;sbWpZq7iMtOne_O8Hoz>Z3z8vDEjUzBjT~*f0WyJ7CP{1gkOpvPhVPkYN5FF#~}K z5pdY3s(@Ji2=S5ozCOh``J*x6w@OU947mZCn(tuNynjYLf@z}SY^7;WVKh(yhxQ49 zD)IW;^}Mx@obFTh<7;y5D2*K_J8h^e**~T#{;5cW)87@wHGQ6;jsA&ig@a>*^*<`w zAf0E0hvNd#w1?aEiiShoBJw}fR`)-gdXb;A`X5Hk{U1jC!+T*!3hn>-{DW9D<Acy| Tfn<sQz;$_P6{%_o)8PLB<x_BZ diff --git a/superset-frontend/src/assets/images/teradata.png b/superset-frontend/src/assets/images/teradata.png index 9b6e006117540796453666d2fc3893b3776b2c05..133747767756b77acc58a745842add47008f3421 100644 GIT binary patch literal 9993 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�|$PA@%Kb>@u8udfEQl;$;NXg-_C6Qv_p5RrXd7*>%U z<*xVJ3pLKF6`jwTUV-n+3&30@@5<}z%am={F`w`yJ={o#xY$SOj{{@#cg{MA*`5nm z9S1=ccUACpCS(OOo5g*~x_a<wj|G%X2J|%Q@s532eNJ_0R%O-)qoKh(J4Z+HaU<gt z-zNCgHd(ml(;QP*SWJ0s<%f59@<W5~My;)rh<_E4hT8B0p3r!gs%3{aZsI=Y{jZNG z)bBHR+joiCaG37*;S0|D%8dvV5y3vo|1UxRXA4|NlgX+CIS9sn`1NNsWr&7+v8-9Z Fe*pa4EL#8o literal 93361 zcmeFZc{~*Q|35mdIz@C6QxZo)md22M%Mltv_D0sm5MwF(7)wV<F%*)WvSt~|k}!jk zv4$*T9~Bz=WS#8yJ#;?5@9+2c-TS-u{{20VM<-+6>uX=0@1ESy*Je9<<|qULVMAQI zY6O9>bV4BeA09ajeq+P;N)7z=$K7j4PYC4LN#>t@kfanS1agSq$>gTjO}*=iD0kOO zcJ}VK(U<&O?}E_~h_agBT{{#8?Ztl^?dasDB0#UM72tQWR}nCm(Ua7>tAW1bbj{xb zZS1dag7U|p6zm1mRQZ+t6u|<nXfHc{KUWtwPenf!f!%c#!OzTJ!vy$uhj?LB1k{-u z^54|E!LQ-&f##RFBrAb}UzX&TQ@8||mAoti7w4Cfgv-GsWnhxB5|VI5NqI#nIREee z1i)?{_6~|hSG9ic1wN?=-0||ds|bVn`ubk-mA>Te;Ru5(C@8=rrC?H05@3XcC)Ul& z&QHS4^ZdUnTt$1LJe=-&Ik~&>Ggq{`?e6WRA^=XhcLmqG|5?_}^Ea6Q!C-!NcVX~L zlFTdZ4zx%8XWU(H50~A|?NKna3)&U!=H&^-!v8b&?j3h8ch5WS|2Iqj=j;Dz13+3m zz5nd-zdehq>wmWJ^wRVJ*Z574|Ltf`6YO0y%n0r2?(Km>Yx;m=o@d_XuA+tq+Rn?} z!^GX)<zGhK`1i>C8X8Q-$n%Tn*`b`=nD@B&UuL1N+IgW>1ehZvB;_UGk|uD#Hz~!- zQWBDKijtChL-pM4ogA?L+o1}8%m33*AUF1QUUvV-!S*Oc2X_xwJ8)|!S35^E?5>-m z0RMkzsi@)Z;_d-92B(w$ufIoVXx#8{cW`n6Uw9g6|ILrk)R2WM$jVAcU4ri(S5Hq7 z;pXXO=Y~QfuBr$C3SDw?vR9OZqwEz>m+d5OUzUbTTz0TmkWi4ZbC6K5yNr@@K*`ym zZtq<e%)jc6@@C4xzw_<?Kh8JsZ~}U0=kou19j10N1xWFllP6#;_P72RqwoFx$;F9( zS7sFLP)uD=5kN780BtYu``1qYzbUY{tnVE(SoHrvF7}3bx;uFJ+IgVW9Raoe-w7WK z+yKT@-M!1e{?~i%e)nJ0{NLfgb})bZkI@1j{$uvgZot-g0Hap;UQ7+L&ruF>Ro%od zWp>0j#eM)ex<glxGn<?qj&)or@`*DO6BK;)kb}QO@Y%C#hfy)=LeTREg#KV9-~U7H zq>GEB5K8K>pyah993m1r*9u1Be9B`{9bT{R)+^Mi<>%)*c6%|rd`-;*sT)asE(X4) zsYQ3`l{AHpB`BS=YmWE+2le&oJn&yW+d?_6u>6nDR}OaW`yZd4U4`)ek53T9e}4)2 zZz3=S;=d)~zlpGC82(!l{#z3MTN3st@PCv9Bl*dFkj(Fu>D$<&nRhzt`+cZ5)0va& zKdVPyb*KMI_+BP8`Il9E;Ye4_dAaF!T0poW;m2TYZf{b1s(emx5N#;VB)?j<h}cbO z+t#RBC~_2`m!<!t5j~HNU3DtIbUKezl|dXa<9L)WE7a>G8&`ho=-5p=PO%Qf@bBaK zwe|95)G3khF)GTJGxt=3Q@(z|1)2`Rh{Ma^1lmvpe;!LW{Sg`>`P_3NZo}ZuIP4{w z&H%qjib;>PmD%&0kw!!eb?m}odtQ@gc5gnBF<q7v{{5;tG_Tva<z}WlV&VdtKpE_7 zS2&F_;R+2`Hnt!%D^$341RLc|FAJ;Y2y}Q)zEFBzeyfC%-|aj-{6yPpIV!g$Zep-c z+pSjDj&thU(|{Y@$5=QU-s-C@K69(xP*B|d8hG^MHFc=7_f&}+cD;1@3vM(oP}{Ai zWkQo+S(DW~aOm{;ICP#!l=nj0MZN2vuf@E8S@n$1hS&>Y2!(83-<I#m<j}@1NWiQ+ zXSX$CvX12%yrv{{^=zu9s;oZaiW<%;Z9LZ%J(QmBTQl+0tIyL$1Oa%mtq=P(Yd(YG zBbp2I`QL~sqfhEpEe&+U3kHspc3w(9RW6%i1VuY0C8YIkXUgR@ExG#36s3#lW|t>T z$99WG-0rL&@Ihqf>(bgM|6!1{?<Kjd1+@s6TM%a6IjU%DrcHGXNL$EzJTSW?k#CfK zBe&Ni4XuNbK^Wn@P49ID5|!!KVlqUc1<}Y`PT8X7FFe}wRAn-KJT;L8*=1(tIB!iS zLJ_5<M2N;!=CzO#!f#Rz&u*o4Fc;%&v>*i_WRIBS$&Hh`r@PQdp4W<BZXm~{C`FO5 zBm1#*x#j9JLnG4bUs<RH#E}<lA#5Y<I2h)D-e*|TV5C|aLth>0v|6X$jH$1vkCi6p zH%UvRDG>t0+)a?yYXLZVT-K@7pz*&<h0o+ugvV2iQ*x^Oew2k5W>#uw+Y?CZ7*x66 zYT05T;ep)ft1)(J?)v!i4EZk&(!$=8l-$XW&12>@J9S|)aOvDKvv^qQcO6ZdzH$ct zkyGSovrASc99l_Aepksit&~0gM&@o{^Gq-;B~dxFRj0Ks&2lsI%L+=cQKj@lcCW+K zHq}+;4#6l-o{kiIHu4!}tG-H3_o?_O^1?GaL-5P@MC0{O+S^FOm}}(OY0OuWImf~9 z?|v`oGmW@OfmW}dKW@q3zCKf3_`*H|cmjAZ;@8*hy@+DJ7IU2Hk$f&-6zBEx#n6O5 zoexDAEGV!b5noS#%F4KG8tvWT{&}LcWoQJ8v?R1#b0!pu6q#HurN3le0fR;gy~)?R z?gWGv=mP<sC)I&|aHUARZ`+6J<R4VquDtjRu+PMvSH}E>jPKVs;R1c&w9aj97xPSj zKqC$r7B(j;Odz$%7T!q(&PC#w?XM@$sqa3Dn0c<nM5+0uyKn$@@eYxrJ@pOGCTCWt ztz4jP)KfPsyXJ%L`#hWS$mPRMy0<E;4XDxWPT~y{9m8Y7xsLP2!Of`dqbuZ>e)LnC zZ(neAi0O-l$BgHXF~$OIrmX=_UYMjOMf;9m^*phN_EY%=?IInD&IEBMXSZ~-OE%M6 z8)b{)#y|>tpFA>)zl3piQx}VeHQzjsc`z@7+M)BC<PMl{9A@gr0*h*)r*PCo{C9N~ zt7=h9h4;`%dRE?ApgBPgzn|w|i=wN94e`x4EaT0zH9M#$b+lM)B&-?iRMmF7xJ~=A zW!@C#3%a4p-QhZ|l3sqxzoj%iH!+Y!dp=P5T296G$w$#HP-~fiGK%Po*Eq>I#f<V} zo{Bq#^i}zc3-0Zc(n41ElC&P*2CB4Zeb2%)w>+O8Z;v;Ob_~zBilt&d*4B#{BJE4a z`Qo~V>_krIwMCROQhfE%(Z!^Az&U86XbE+c<Q**%-s4n(#!nGoWSs(;iPR{?xg5OR z_8abzjdvBS{zvMX1nwVa`h&W2#$1)6D~QkYYK2R}Pn$oPImFAE&cgr6a*tmgh*=G? zUv}0qx;WJvqkr5_92X<zfyBs=-ndKD9Rss%15WJaWwz{#MLnC}GD|4avkL~mMwf)8 zS!TGs!Mf*ORaF(E_{nxaE3M;_*B)rcQKm%~T{<)OgZYxSmdM>a?+uH0Yv_+86~CLM zEbIkM9)nuSm4;DxMeowiw|^8hT|iw9e*9Gd%(yRh<mKKBZ7kiyK9TGA=*!T0xz|l4 z(UT*rvm&VRmcPjs5@)N_o#OtN31QJsj=LOBq=8i+X{`Ian14f7<)yy-!^XdK7W`ay z_;;3Rd+^zl<H`zB9n37#<>2q3S_cy+>&AW$75aDRLon1bvJI3RA&_MCy-f7}2@N4d z{@>I8_;)%-;w049K8<<${-gURnG+y*5vecm7fs5{<n}J_@2g3EY`WU`{;$0=t?>V5 z)Z_Cfc~SrDZ8UTrqPROBb^p2-Uh(%%EdMV02Us*_Z_ziA|1PQp7JdDDQJ<qMD!cO` zZ>lMd8Mk;QKTeGu4Y?9?db#s{q_kF16S}Z>^F!wE({kDG(OmKok<p@*xXMd1j7-E% zARRk3_REIu9ZBh*e~;9H6Q&ct3&z=xw-}M1g+~3Q-LXp@rN{q{Xp75s;kdK&B^h04 z8clm}?$4iDzfT+c?`eNnBAMRr+pTl~451~1|0HjH*xp9f|K9yZnzu=ELeHyP^UvTp z+zEn@qrR#C*p-oyE59oO*J4TvGl2y>KC;dkY9~%_QD^_-Hv@})D*%Ktj?_NcT{`Gn z|5<d=lDYwgprU?n_2l=7--nAGJ!B}t^U&i0auUk1M{ichZ_fUNYQAuq?>qs#IxsyC z&K)On>`B?-e`(^!O4kXs%hIS&1y%?VGTE=PM_DL8U>P~e*R4~7$&OV>ra%W8?*+mS z6M`JDwx>~tRV4B9U_VwiI*STW8A-^umn;zcGdV;Rrt?9+dM*Fd4x2wmUv@>O;{)5e z15AlsJ&eM)WIThLY194knYK5nHU8AYFE7I$8QSA5qg!tl05xn@<~vD-#-U%8h;ueP z+5B}-JlL`;^1-=J$JZG#=guzk7lkous$YB}!yypz@qJ#l8$|0a0`q(SuvIU}hzLeT zMyA$4j=FMvB6am8%R#X5>}k!kJVkh(4(U}Zcl)1L8l&EeE~R{3>lcamJI+GGDLbb` zgzVJ4QTyz&+@$*K%k-{u$6w-T_JX}RIcP$5(q9k=>d~L`b*l;rllx}hWUI5=w&D#b zZq6P))&{}bx~FpUT1w6?zXn^~SIJC%l6LXP-=AldvIIINR6ZPZ5iaHrFT3(HU>0yR zasbQweo7Xd+Ws=EG&zdhAEM;aQIpWF&<xcBUMtEt1lR%mUx55tmU2r09zN;@xNTiD zbGPn_6JUdWary+QZ}^|gB$ZCKi~~a-p%ciQskN<qef<;4e9~m-DQr%enK8=2OtbjU zeUeAE+LoS7oz}dUQ6hd=MUcrTP=~@7c_-33emyrZ<v84;c#vsN?h_WNc}+uuzT-l3 zN&zR;y<Co=@E{r~5pU=n^jmBPSK=j&T|%NvJX}6NlogkTPXOy+>jDg|WX7JB_=GU5 zW6WKhEsDgQo<5vG;fbE2CD+Lb)Qw|fO{YSM@j2Yby`(#_Fk9|uEU@yF^Y@S2E<a=b z2$>b3lNR-FF{9VUCoKYwHIWi<ifD&a9Qp(9&hY6>WejE~vf_@j+dngYvuBusUYE(- z`u6XwABgGp=H@U1WKJ!3;$*)vYTPPM0K@Jt2o(TY;Nhcx&%zMN(e$ZZfN8&!&oL>? zva1etMJ=}^WE^O{39053C-2rv2Y7ns0@IpLh2rg=9JNAHD4&)Kk5dDxOY|K(>pvVh zzq`PRB7F${$galSw{pY-C&%$H-(*I##HI86N9(tg4dQteGVS9jGLt{Q84_Kpz%sO} z!$0lc|Gn=GW0wpNRy@O+Y{5&MI^HXkd*p9h4T^s{_n{Al%8z{Y)j6god3~GDWJ-0g zs0iYBRlKeo82LAizb9KDIi)C*of5vwQfrf8QNrqUPnY{*N3k$H*x5<9lAl4H8Xu4B z8kb#<f#cr0^bJXJQ(QJ49{$~g8n;Mg^S=o-GG9^64NyvZ3~woYw>s(<k;A<z)*+RD z>TA_5lVrmSI3YOBz4>pNm3Vv47=swo<j{rq1;5F_C_T|7%ibq{fB?Y2`<TlK<~UpF z_eS8Jdpu^9py|vh`Dd>3);!@?JokV~>n|*6I+c6MlqXj7Xh>SW@-AN;0AJrU{+=RD zCyi$h_LQ}h%%a!eHep~J0$dB5n|VNvngIkm&ZX^x(C*lGArQs;qzAhe($?T7Rg7K+ z0s<SSY$3WxHLHI*YK90qbs_JJwC8N&hex}_dlz1C3W7VhcOh$|7uiCN+-3Af$tIjw zIceUp2rBLUC9PC5W8<Y`Afznlb_u_xn8wN+{?-3(!+zUedn}km6p3&?j1J+?dcKj6 z$xtXtk7rnKxW7j_#kFwx-DaB9`!kvl-nwVIq66t~4Hxeo{%}4i$?68Ov)WJm%f{KE ztTqq5&-Ct3ZQ?vL3-5QOdI*^5``<Koea9ObmiF8PlceTlf{t!glAHX?E}l7!3@uMC zNV4wFeUf(??JA4@dUThDKHu^W)jiu4bqMrSk+>;mW&X+|;$*0*8K9u68CPhGj_FdE z+cSps;#uP>%q{w@Eh`~V)jbDrKDW*DGp}Mk$P~?@javdOJHcL`p_%&C*@1GyuR-Wp z$bFwl>Nj)1GeV{IW@Wa%R#lLowOIS`FKtF^(LHBh3bghlq#7IL`N-X|72hS7&wk*Z z>VNYo3rm0Q==xcF*4!wsx!MDW>hTPQf{zhp>W+tle(47Lmt%p~_of{+he00w=9T<i zbRKy&WR;JE(2VxQK~c-#d`g8jErH)A^_<(<qeE34c1fu8L<|afpuI~%Nwb!W8yr`U zX8Lt%d^r9JZ1aGT9do(&(=wju3%sMxAG;Ep%QP#tdlwpe-6Z{)SH5e`#?q)IFbix_ zO%~~py5MB$RG!1sNd8&LU3$BLXvp^No-HCL?B+)%T3UZ*4{IMHb-W!SMmtANQ4JrW znqTkoWR|PwHiY%ap5VQ2RdkifaRgrLrSc4`zkL7kWz|N=`w|oHj8{(*k^ZlqitO$2 zUFUG!{GJG1d0K8}7^7n?+8Qzwq7p@=K@ZYXKFU+J&&##oq&l_PcCS*w)TGwEQ{B~^ z(mAC55~xkSi2hVq4O4m!^f;AYhAZWg+fo!i=Lk|xYwg>e#{qcyZz$k*79EZ8a8r+! z_G}r{lZt1E09ATJ94D=g-YxBN)}y{X?O42fDAuFq(vUqOf<X4MVH*1A#~bD3=gP=Q z96PB4ey~NkuV*vljOUW*BL1^H4!XP7v-cVM-Yoq-BO4VLdM~5$fVK%IQf`R@cNk3L z1io+TwNZhXzL@Az05GmxyXt;85-10+)?Q#0xzL^`;?aAi8^nsckrEHEf~+TOUVz$1 zIoYI`O|dbW^pGj9lB~?TDeSSgU(lR0X(ae2$Y>I2mTI&60O4=Iwb01dg9#?jvs^w6 zXzU)WKBV9bL}_<E1aixk=@!c@fKcaW@vYwl3jYYG5vUa;CzvF5o7uv4jV<fRA{U5@ z8k2Jnh-H{^M^8eMA<9P`S&jIKc?^hO-=dH^ef5F$Bo4Amh<>I~|NNT}fq1xR_}}VK z5NpN=9}AQR<24G0j;WXs;0W0AU%S_aY5`B~!ne1B%Sn1Fs1AU*Ks20~{Oa+mzX1Vc zKq2V@sWWVk(l_sUAFxf{v#Yi^EX{<o(mC=XlINM4;&osYRO)crVCh|R19h<c26-R! zn@WEbHOZ9Hp8;k^8O>`j&9)dYBmsM*i2`hxxw^-O)G?Ad^bxb{P$Vu=uguC^^`Z4- z{cb4!hMRdo@84@)usbUT(pmNcK;2iN{;$~Cc4gf9#BqNRDCVyu(qJGbsCF2+-I!8E zdz+ty_3l1mN#7|jxVv;L=7r#e7>k&8ot8*A%?i0*B64o&+-kckqZrWoXBLssmAPM; zimNPn4i|cM`9faKe1J%d$?A6P>Oo&DvMVF&%1GpL1SwcLru_^`ht|?~IF87df5kZ3 z`?BxX$Dsao1LLi!&cW(`ZR`oS?E|9ki1_joghZM`wj|=5XG+6f5HWj!$$+#emX7K~ z8u?G<#+8{%oW+5Oud5{kGP8IDN4}EO><d-SHZ&J9YJ{9>iw<@QSNwY8C^&)44Gg;N z;MSnzE7YOrD3}_v{0D;lu-&hhRqBi=hP7tek~PS@hTH<(-7&5sH>+*Bx-X2(lGOfe zX#VzODlt)@!yyuGJbk#;vEtWVy_Nlw<b+bqG#O0fl&3n!B^>>!uHwZhJJcK;Gglw; zqIbmWbt79DoeOrz?xl!+ueH_O_Jf4@Iaw5;#7y_X0IeUjPU<v=*%+mHb3PQ0nCGIU z;NhU~V0!&0h?QpdwQ=rq`7@E$uS#m@yGY-1Rp%HM$D~b@Y8!Ang(8UKy7`JUictg} zUSjt?HR9cdV4iq*y;C_wLUZ8QGbI}5g}htx{!2R1w8ls{A8W`@jg`D9_UaO%8a^Ye zMZjjICi#_q4oDpPA8#u=SZS@{8Qbky7Nh~Fr$Mx%L4ltB=mjUm4#hYsyVwzp(0hfA z1qr2xOs(?zOKZh-fib35moI=C52D;!u*(SSA~<6HVnRE%Z1EL8s{!JNDt&k@=!Sho z$TYH=KyE7xk?aZW7Upbt?lo!(H2&O=RwKK!1(bxI>|>4%LMbD=*;;=D(@;ELQR!$_ zZqy>&x*-$8B}nST?R1IgyUCG<=SkJ@S&1NP%!0Qtmt!OxgS2_-uQtTb%0sQJCNg|O z?`<|Lg}L8|Mq?>c%9nkAHXT4%kSfF%Yma>VxkXNxnBRhi8kWtCfdmEDv0mtk!WWiz zQ#WW=?=7AN^vOMiUFD<?vw;-Q1I?fnmXCZ?p826d#jUy31vZj@B?MQ<Uhcv(g2>RN zHh~UP%=K1WuJX)T-TZQvjLTbh5^40el<ic!f)M@IOzD(wNV%C^%;VN)BaV1O>Xa8Q z-S}@l+~+Fm$pSH5(Ixx}e$STn7cj5=a$fTS;5Xjw%@CbE<Y#5f{5$oZr|)qn*DJ{V zh4@hAvS>G5TuEJT^PrPj+#dOxa5c=8lb7e(<I>Ngw(Dy$<<jTMZUv{CVca8PmZ_AM z#Zh1BPc97AN6QRQXBcvK4H`=c&$tm|M!(eZJx#e)H50D1BZX=s!nF{b1oZP_c18Bj z#3mepuX+7SweS2jXrnfMxume$EYLZ}6|e9ub)y!My?z`)XS4_Q@F0%9Tk-XvwqBD0 z6{w@3hL@E)21I~i)`E~aeV_X3%O2S^R=7Vw=+Ou2R@Ie63(WNxY?Sagi4L<o(>yFr zx8ZGQj)-h4&6HQ@gn4gI4$Yc^JXDjq6O4LbYeR7+`QLV!?<HCL?|?Xr-mF9zt+4y$ zbMoNljHZh#$02pEr_1l(8@d0FcM-8v>WiP1;W#X+dphE8^CW?es(}d-wp$<loPN0b zSk9`WCuOh)7aZ|+HCZ^vu|{F0EZM1iwTK^29dIhztYHgb;Ao2N3ZX-tzVDl)Wpb(| zzQ%(B<B`1W(r#c=4b@@GskGEsJTfgIao6?EBHB3iSsK6azKr|Y`Jp*+?KJ9oO8JmO z@ug*zCpWv$i1@=xKZ6Wd%y3Gr^b*-$tn?Q1MyEwYOx{h5|FKUvhVPIFJq2IxfzB%t zc}|(`kRmG=l$R{ZY#bl`wIGiOuC++tY}GGai$@#&k{qO1&mZ^#gAcJEWF5HoO2`Qm z;+)*ozC1mZhby$GqACqW&_9sm9b91415nv5hCQg6#*QDyv^nOKKj}NA>GPB=M6d+p zr`LbFtsWh9oe3_szPRoTZG_2?iI<B^YE@V>H*OV()y8El3`G<!z1tr4E$Gljz6dWc z4OK7H<!%?@*tg7!#s?tiODdSFPnB+I0*dsKWXpijQUFFWu|&K}{i#!!pLZYAPq6uk zgH$9LL_<Hb)>Y<@Q@w^5el+Sc@4*ETt&U#O<eCg(RQZ{<oR7hre{D&p6W91w{6V`- z1=%++DYD=QJyCmW*sn65wE%uJWAcYUM-2%s&6qRftc5)u+o=dx*epJ1_X|`kC^{AM z<uozY^Mp%QX4RGX@_DZ((c|n-ier`o&x}CUcZ8={iWpI|&m5m(Y2%T-RYDb~Fs_<i z>WHP7Ro(n+iUJp-$NhI~a3R$Jv03c1lP`<qMW)1hN1DEH6_oItx+W^9QaFFxzHpxQ zYb?eCk;oRJ?XT87y)~C5)=0hAUl#i9D=A(~SJTjFp=fi~nY7S*FRA7#*`&4P+1n3; z0k)TOI}F?cA631T6>0t6o@KPQkLO_wgU*`qO9EN2R*NrZcg=QOA9Pgx`P^gl5Hokx zMjJNGyU>@+5&n5uaj5~%PH^T||FxM=bZ}+e<`!x$BddElO?rc7fS6G&7+W5A#l0Q{ zss-Vw<^&sW^p}{+)BBcj7Xn{Yc~VAxUWiE(cEZM=b2qs<eU8N-A2$cRW?{mRKb=?o z$M=+~#>RIPQre8@rTq|c6ZHuN0)>Jagn07v%L?DQ<5*Z0UXGk|iT=UPYlvjUB1@^7 z8XS+(g{DmJ#ef<Ro{f#0(;y?+4h>pl;bL*sk#Bwba&va{o@couE4>!_#8%en4yit; zwHDG^j=xoZS=deKYFJ8Axtql^el~5PV`UqkA39U{mI2I#X?l|N3|dKK<|z+V3G03V zbsR@?KQ`t^h2r9UCn96ON4NYQVc>;N(F2L0VH>CBtRY*EtM+a1MoQsN&`F-^(5l3> zEkcPnu`0q!48$smhA$c#$}E)5Jz4-h^fV$K4;N1HY<06rbZIw#e{N<}O&v--M{X{d ziIujo;%XouWTM4VdqzKf*q99uGVr6DjwgN;T(d{D2{$^e~6J@IWQrlnHST_%>M ztnzdSf6-G*^l_7NVRPs$(W6SUGBMV*-Rx4A@Nl%@xDY|lo}3WHsF9d@SoKduY)reN zdD<Ui<L}u*mPo-$u&F}d`M1?5?aB9AK$j*+@x)QN$$PUgJmuBN=vt$$T>AI1$f}P@ zj$?vz*ILE{cYeJWoO;gK4q*#9x%lHf(PlP~o|4sVX$+~m1L`^u^TPSn17}bm!zkYY z8Fd~g8xFX!e@j|FmZ;^>b@+pMnB6Z;p(AOvHRH<MY&@P9q)8?m5AP+?(#_qk2U=&V zF8m|Vu~Sy*wdR=05C)kWls)*g5uNl=gwpl>P;ai|sfK1r61Ntq<_@MnZq|&exi=xv z^tsvL#U$?o6C=*2D1%6Z!BRU(M8Ck72j%9WdG8ZWE<MW>VO=CbDe2shIPmUHYsV1R z^O#Hd$rqo_IQER-Ir{k@`_unvE_XkZsm#n=Z>4MYwUo|YEmyraY>sh^P!5(4A7k9Y z@V%h~nRMmDbG+J{=f0`-^s5w!R}*wYzQ(o+>{RjNt(D+1Rx`E1?_xAnqKc+d-LA{v zGhpx3Cn89F)tMsOq>S!uK2R5<R<oH-HZNU2*)3fn+nE=}_e@Vq=F2^oXV@CjeuNYy zXHnIZF<i;jbD8{l@?HA0`wO3#b{<qaFr;JDjnWuZ!KqBC9~$Jr?wBN_il@J<wP9W^ zu`_Oja)f=Fd+|0)ZP$kM#i_eH$sn^Lp)}m}jjky=;uTJinL-FhFc4KXUD`b(!$apX z%1=P*xZu(U@9z_h`1@Xx^J?7*EF!2$RFC1GJSv(9`{U!!8CQ<8lQ949>xC=2bC;^r z&J%jlqO;=UZt`q;Smtd8c%rAyt3ySPJlZgE1>GT<g*EXd=y=}99T7SrGY*(&l;`Z> z_Nw}4B_@n_RL!R?%x=?#=U|5qdb>m?@OvyC&PGf5`2JSthw73cOnG`k<-AIH7?%Li zrx-tW6Pv-P8#^c|hBh2NBiu|FF(QPP_}uD!qIGe~C>qUY%t?~gk73-zoVy2Ng1Cu` zwU>;!Ce26hF}vI8Jh{E@Ao6Nm(ieWFRjl2_zg*fCt23uSt)`g>of*CT;47`fXM;OJ zS&i2+)ABtt3v3#^LOx8QR<~)cN?y9`^D#E1`<!>6;{^#QitD=|)<W%?HCJVfpp*Xv zM=NAN6Ljh6y%=TwsUZ4R7||D#-Lu-Y7Hd7(pDC|DU!u+1_cww?koQQ)-8mc?s)?wY zCaF1OF<8`po<p?-PM;H|=YBi{nN_JLiLyh^7m0gFoUKHZH(x9_H-B{dZE^La2%<{j zafZ7bnP@F_@*t;=e(<-OMu8qa+ibE&YRF0q;g#m8^!InyKPiQgw5!<u1`Ye3@ix%# z;C*L3>G!;FgaX2{e9$fS6h1fbwsE0`N0QFlcl@yWa#ESaMvuUZvQnN2yKanFc!5+) zAD4UB*PD;O*y53`&!o-sp$B6eNQ_eK3l%wnK~vLfQk6#)T#4~YBwTHpv~!H-;LaVq zg6^aBUmoa-?pgAA%Ed;>zvR?8YpHRX?pvPn9nCmXM(N-PWUSQ#;2CNz>U6o^ZQs(N zI&E>&w-jhC!lO6ul)XD~tZoH&{ZS>{6x9|<-QbCYrzcZ{OvV$R#*S-H8yQ%dD*u!O zW$@`Wi-D7;r<ea`xyyUbF)~MJ>LPU`_o3lt0~M!0H>;N<8dx)M^wGbjiUn1~^JEG! z%8>h)K*?8<pQ;3U!UJ0@&wUj&?!B5%jV=E$C;MiU<I$HsM822s^7Uz7T_l%ixH6$f z*!twdZw2)t>nlJuwSjch*k0ofeNb*aNqh8`Taj`x;_ui}PXIy4G=td;Zjb3#^t}>n zKK#K|ol~V_@M}4U>5S-BD%by9D<S^L&-Xp@FR0bbsOO9>0!L@$_6`Qohg(UWqw*@X z!3uOQDz9*Jx&?+hlY+|?(`|uA{j)tRjQ?I8>pYhXEXGk3LE=c^Y?AfYxhqi39aa3t z;^%E0nuv9qC4I+*C#nyylrMnYEdqTFrMaBOExi3fGpfN<g=QSML^ryvJJqxJEhQ*8 zTlF3pw?hLi)2fR^-C!qJ=^y{5@Z5S5;`4DZpkX7a{6pylm7(gz6~h!SLEa^5t-_Iz z+SooEiNSu{qY!exQ5!U|4%;U9r!#OVx{91vzW|l1ZG#%0zalBWCH0BWJ7Ig<c~vYw zvbm2FyIq^ys;f3j49)^^`In!|*Z3B#CvP_5azSP5f|F)z{3VxeQc`)^5AvW%SAivx zsQBiCSco%W-tyu}FWu=DTuCdutVnd9JIIbsVkuapMY<mnrm=NCa$wE3!D+pbT3K<; zA&#+hXDZ&A{o~I^0<fBFMflq1B5_bvPZK?O;LFDKc>~OfTmxbqHbnT*aRw9oF>Yea z;4%?(QO;Xb60cqKwUt|z)38q5V3GRqGP*{Q&|6#8RI02WQ(LP3GpewAO$9Z_LSlsa z>K_fGEg@iD5Tz-@ne$JwZbiaJIkgt#u(bGkk)U|SHtfPyS{4h^VBh_3w#-&0RJ*=w zV;JB<9#pY~(7n-X2I?FEse&OijgQcR5^;NbQK#%x@9w1ys)|g-&(t`7718k9uS0rr z`fU8L3n3XIXY${^Drl1ipqLnEQzYe!&x)@X`jsT!U6vf+n_@<d&x#uriTEBtWUP2s z&sR*my+6{!UIT(l%Zs!YrEZHY8z?HcSUh}#xY^OX(Xrfq0h67JEv6$u71^Rd9#Q*B zRblHKX0GD7rkkH$*aKhvRI?>=nbFqU_3`DQ43QuwB<ItMaH|*D`H_z@$~@2-toKLC zi)5bqUOM{mr*UNYC~w1p(pcHLK4KIEFVdFCB05R+Mol$Vr<`o>9^UqrudaQGs;hMp zTs-OR4>iqui~C?Z@!%7QIB$RMDC7aCj6)8;6!&0u%m&AwFY4p^_-d2AFEuB?3VLQ3 zht+=`pl)D=X!Uuc=Skw>q0Iwpd}#?Ol@)EJeMn3-sXI)tI)C&SX~ab|98{E8%on6& zZv=Wc@Z26Smug3Q`C1}^^Na{1JX#Cv3bgtDs4x5LU#BxwAO7Qw?}VH^;YV`8$yf$O zICrN&tkv-h#+0k!Wmq`dG-Kq_qUFj|Wk*UvB1taKB)C0p;%s7Ty%;`&Tex@d)=X@7 z?K3lH?FfO|5^TdY%`~w$BQ3(X3>In07XQ=JBu~e2E383^pc+@h0?CeJ)6|F%l*$Ow z@lQ#csa9?ef-Q?61~^!3%?V0BOz?0Rd*&}1+RGi<5PXSl14|Tbya4GB1T`kxc(y7= zrLQ$PsX9}BP0f&VCqHW_;W3@JNW8o%V9hBqv2rv;$!}aP)_Fz9rs`D_^+?DS%`~T} z@0D)thd+e9`qp9uuuf%WwexsobFQNylc5NUtr2+wQS8Xa;>9k(#uIqZ=sP9cYz6p& zGRmvPdH8($Y?ngRH|ig8`AEBc6HBiywy{jqDJV}*9r6A8S!)%kna1va=lx;Ow=2vX zygD``<oILzuke_@Td3l7BEZ67t~U?fS2nV3@}p0L3jp7XzL&K9cecgGW8x0eQ}!vy zz46RtM%%lUQ*O&v2sDA}uyXlGh&dD!bRM6<p1|*ynU!li!UpkS2dR6%CK-yJd*{I5 zyOB+OHrmh?L$anBa)gd1n_(DdGGWs@N~`Bk_!ylP@6ux|bcw}wITnr1lYxP-W&LWz z=$F5~lfHZ!FT;;~?CF^Na++2P<^}UyXy*2(36yL|wpX2Q(?=s)Zk`Oa+e|d}JXV|N ztH|)T2{Pb#XiQa7Sa)RS<vA!C@x2_8?e7jE)Z!)aSWlupPIIR;o;L6yuQGHr!McBE zqrFmN%hSkkJZT{KniJt&!ICS4r|gon6=hzI5@Zgv_O!WZFjQ;7QRhMPH9F((r`_Q? zvL^eWZ@g!`D?lch{!zZB@6os7<{8bW>#7i27En38Z*}=Kl}1%Kjj`s)of>+;zqt=1 zuA;(tza3&saWV)sTsA%y=Drz0?8fRKIS*KE=5nw9yts57LCDWC8`=E(C1Ww$oP(?# zb9rmPn!LuXb0$2WrS8Up^_FcVV|xmlyOi@JZ-Bjrr+f6oh34yNj%QDXT|qt<RZO*T zy*=$H*1PWRYw<Z*K5fpGiaU+5kx`J|>5H5i=wOh{j@fZy02*u2g(0T8um2&n^2@2v z{g_&Qg2`x#nRD=|hu_3}mCmOEAM?o6*Q(=@)DK+(+qMus!={v?YD0}E1gt&HlymMm zAG#-<L<|5%l|9UGlVJx{>0o~&e$M9++-z~Xn^4YZ=TlrSju1DFc06!PJcoN-a%xpI zJt5@<BN?YAPZPw9r*1IrogL-LjSJQzE4+bkjkzPav_)5*@TI0$y|17otOuR%{bQUh zN=z5@e66ERFbs#()!KLJlAxuQ{9N;uNR)fAjL^<&@m9JtX!Z;yB@N}0mkYy{d6q$q zMYp)*A;Vgoqefi6TkWw}T<x*UU!E75E3IA&sRO@IU&tpeCna>G=JJtxU%<&=7Y^cU zo~yKkLy#dRXk#{JWIk}76f3iuXvewbosu((_!>~AK;zUh%mxt?vU!K{X}s-&I@%I6 zzWiMB7?q4gYhY+Y<D9qLGX&S7m0N$v2SIL)wHPgKKN8Wealh@q%9nY0%N%WZ=UJe2 zW2C1(FhfT^?nqYed`-W_GfXYul$?BJ#{(2{ywZM?(ZQ>{m`mwj6G51yCQKiu`c?j; zQs2su?ozuzFxe3#=xzFNT=k`swe<a89q2z<<$4BPxRt>lzAdC9wo{KAA#ZX)-t8*m zq3VGRqRpVvk$U%Q`Mth8iQH2EoMWfrK+S-<0jrstrwuCsAz7RIk>4UP+IvM2bRrt# zsI-4%&nQT$cit`fwE+Cg5dRSyV(IyVWNjp8iTbY|{eqPUAXXK*anr4Z6CN&&*y1t^ z6)6QJ#s)HX>j4$#pZfH@01V(zRF(25+ZQnvY9#Svhtvg&^<LcGCwX&5sw;AN5cmk( znEaL@ePmf*?J}uz-|VRxo@*c=4fN*FWE?j9l}g=6@V)|i9EJUmx=Z~8pjx=osC-2E zDv#`uV14q{>q(6U(X^vue(7u<)xx`5g0Er9tzcF<u;mZcRgATAn_yasB{ImvqM&x< z%!Yew$?#j$Dam(4P<=UMx12$48@A~c&J8Z<cGLT_b7WtQ(vIlj<^V7%?s@vxYx2dz z)t?@%u7jSZ>BMOUy>3zrPBOz3m&=+U$191BYzO-vSR$LCsPC7zqRK3A@nWs!>%47R zx!j<|ozr)o<o4ia*jU+O1$mGgYp@{$d4JAQc|W*EB$Y<`x)ve2vW^3iM^);Zi+uPN zg^w1~EjNn?7J2*YoUa<a!j)sbLy33JVaFMCUb=qZ(#?4y>G8|Qu{+mwO!q4_LNiNv zj@+O)1?yT6MnEdNQHjhQVFwM7$G9|r>Py5pjQ#^^TE}U_sV+uPwGq|H)H@z-+ZB%N zXMYuu+lat^)#a$#vP<Qpqc0*Vbhg<=%b$#TwoA-5t*|k<p=mB^q$-F1Ucq9xxJ2D} zj)Fp5*q9dHuKLRcu{z;vjfj3XFoj+;{dsaD)sA2apw|Qwo0(LcuB-F9P^O!$om}U! zz`L@88^a2@B~6S*!~_F#GIo?ktgy5^P+gB3Ex2J^IRIS}w&UE1e{b}pDW)c<NE{U6 zf3oX;hHV-lIiJ5d>qr)%dtFwjpsTg>%5NHD)8v>SnZDe<C3AI7(qQ%C+`X8fBF5k< zzZ~<}rdyP#docllz(b=WE5p_#Aui{br&d>@ZV)Susp)so<Ka7vI2$`7{K|S_)Ld_z z<JqdURmSil-Z9uN&3k-Uww9ZZh1AL7c%IZ@Whg?>BMOAa;#viQ;}{vvhu*Z};Q%4t z?JSx{sag3+Fj&*ZJaFX3)?kuTwe*l&&C4JEQA?rvepR!dOU+w<Kx*(kk6EM!m-<f7 z*!-0t@501%2l(HEynOpp^<vmMt!IwatNR#loi(MvWGzIHK$K>!clT*GHaq~4Wum}l zU#2n*QZYHM1$NbGJ<#KN$bul=Ft<|Cb28^vFr#VCV9Q+dos!CzsnD8@qF$i!+fv|c zt{y(C29a=<s(%!%d2Das%K_5IFokOTV#3D6`DFS4%se9UV(Z`S8;MdKJN)6XFxvzB zDb+^niJt@NUV|@UcIKNa*VIbXC96}DDN~`xZHt$vtvn~S5bMV39NYQjLSN5-BR<+Y z;%wl2YI0O}OS-Vr#7tV@Rq0L|$sF|PwB2iGxY<YjX-|Jtb6y1=&uw}|HQhf2XhGpw z6g~jCO#`{@AD9C(?-Yz#>L^guxMiMxfr7N}*Un`25swYVbEKBg`r+}^D1Zym7A+qf z^|l~%3`UBILGFJ8QPaJYpzZPDO|_N;ZkHjlH!z9NL!_8_**7*XOq_!q?dQMx9ftI2 zfe6;8DQZ<!&f*y(*p3hgkF|Eus^B&QMY&a8Z0?qHi5az$*NQcRdwm{TLZuan*cV2E zcqvGut5z%`MDvR6k<*}5Rsmqtoyk9*4*!z2P7{w7j`mf|H_#s;?U0j4Z`;p%xyVEA zF8~akfH}v*3LXCl-)-XxOsoQsO#D$g$%R81MljpCPF7CEutNMim=2X?)`Y%99beT~ z*wLqN3Bv~(%s?R#ye<$3)=2aY0`0W1megCj=USlNxjk)2>cAnvD}>Og(5>Ke<b|0$ zi+!w0#h`dFKKzlVkZt=}%-g3hx|d0ElK<*I$?j`n<}Z9-pqmvAL&&DZD^J8)tD>ov z=_%_v<}Zdy?3ih#7D$_fj=1RqUnwV*-i$sBQHFy|{LKNM3=q?1f0Pe0OUZJ-S43Q> zqH~}+pqZ5E7H+<px%SaiC9liQ#YM9>IY8*3<W68<SEhGqhtJcKnB5tX3|A$HH>K=b zJ!;Mcigcb4$~&&8>yncTtg*^74rzSv7ha5dYbqEsqxpjn=%4MC?<onJ6QF?#yEn07 zZe=kOs;V$B^tz#(^**UpDVHBFlp%;MjSud9*?0g_AI_A$`*ZVw)YM^eho0C<#c5QO zOFhRv#E8pL%xnQYV0CHR&tY_5X{`FP8*EvVa0zyiHIo;MUnnnPV0TukW3WLpKw&FD za3&z-aGwP1sz8U$t?@O!GxZb6J#1-xXE2F0xfp<e^D6^AJV3V<;JJcLUxc>I<h}2m z3AN6Xvwv{^a~))rxP7k;x3girEpxUH^7ZY_fA-yXeMcg7RBz=!kn}gRAZ$gC^IUg+ zn~G<mw=4~7zDMEG7}e4n$H`*xmqa^CT-mky`EO923Yt6zB!?**=X{^`Z4l$J)C7zE z9h@C!An5ScQG1VN1iK~DYUfB9_tK6nOLe3(0Rdkv!j;XvGZrF@OP7ixV@;@)Gw&<r zE9G>IuyQptJIHx5?vU&+8_FOpYDoq#n2D}?^BL44Hea3B!JHiG+!z))GFIK?yyY6R zDxKJ%FG&_{Ra|T*ty3I_my|mE7jkEQO8APjDw62Qb8F`>h6@m^tvNpo&v~2Dm)z)$ z)*VX+g3oAukp_Ld)tVros`Ax%(y;g8eXBXvKh|CWRLdf*orx2A|4yLwGF)XT8MIJ4 zM8gAG`}nE2Lxx%FJ^1(HERv!`h7`pN)cs%p8cpP@Wh#mQQ&D)lxhsyDI(r|oE1Lk; zBj{?r{&k70-a+?RY*Z?x<0^w1{NY2g+eTvZ0QMBpXO71$hHbx0{H21*k}Uq0sdS&4 zGlA9x`E8yG=Bv^j!Ezu&EJ5yr@?t55+0<WM59FxpWaU<J{zDgvTRt@*P3>;IM6Jz> z2~{TSf#)`UQNPgw6D-DBpIbd6AN(9!RAymlL3qrT5A=r#E;-{=zFt61cyh0b47o3? z0SwMNL%>T_h3xg7wv`oChBb9#i_-6lrKgj}PgQ?_iqTVEaKnhNyc!I65bbd>@8G|j z@jA3JuW!RX)S3Qi$B&nD9LG~ZZLP38$y)v=&$2R$7Ko~o)B@_+`G{+jzRH;*FX>G{ zFtYOwTZI`{6!n*5wpjWMvz6)+BBmQ^IGixx`%|v4+_*iiFZ#))-dqPz4Z7)Se?W4O z=qaUsSKBCWD_VwZ<a_`Ey2^F$7Dxe00|&I9o8*hO66RePF<-879ITzT#Mb*no#=lI z8ZzU{v$d7rWmW)+;>HM>91;#kftMY<mPj+s#v%XFu|{1fCSVZ<>LEgoj4fxVX1c}? z1<9(x&!*LP$H_Zp=_ysE-Of(8<P_O>`XtQN6qI&qNsM$RK*hEjZ;0d!&zN-TKDM!w zTmIq25CKa&b-`(;V2<ZJg!N{{8HZnahAEq6na`CV%#>^Hd#h2Lzeec>y9lPD;>GC+ z5^+gKw0!5(g{jslm51uhrPsCHs+Vf1i_4CrcOw?26gOAQyYy(UwN2y%R-fye+3Cy@ z5!2L!XMYq5=1x@xs-4kXhzDYdm!*?R%nINj7@-Tsd4Xb6wDJpoy2*=B0J+?;G~~2l z9{8(2C$=cd2<x3~7L0n^z=ovakQh_f>&;3`@M?soJ_u)xp_(>-$FV`i01gM@5-ZRl z6a4c{hzP~(z$g``=`^vCDIZwwd$0p8PsM>!ve#Ggt>Eod$AGRmCbqo2Pz^&+oHMJK z{p-UsiG?B)XhXi9{z|LSwyyb$(QjvgMR?6jf}~BSBXa@#H&2a2>&v@ynPHkpPS7~} zB_>4Uu6ZTi4?PHZug^rrf!9o<<^%)fU`*UQq6>$J{-1FZ6x|O8>TXOQ`aG7k7)zc! zl0Cc+FU>R%dWGdji!;xb!*m-E6Bq#32pqDK;^_yj%tEYHT04EQtXA1$C{=stbDV4I zrZoArxGurECQFiaitqg)bhKEJ38#5Jcyoh|Ej_j~g6mk3kQBnho#o6;-LKc$IR|}P zDp{Qeeay(QawcSy0A9S<$X4(C3~n8q;|;zJsq+IU(IfRbfzH$MmPmcK2_nEne!py* zZ5GS(fz1U%P6oK#!B7#MAlFXRzWeG-Wd0C8rUKZP+~&%_7NumH@fE5rMO6(Sn=bt9 zvE6O_m+6UyOb~DySr9;GQX$;>5sIakdo2(b#ben*W@<a$en-2$=4UlYz0=m##`o)# z`HOvVV)qwr6HGDQNa<rN!CwBO+ggV9N;?VFcZs0<q|V6;hHhD;IZl<k1JpD56t+kb zpVpO-xbcqAmQM0yz9Hmjf$toa3?X`kcP}@{vevZ33$8(+2Eed=Rm9Q({suhLdr8O& z@~7G3xj-mxBS*fu-xewhaI~Pb-8~=Bp1XN1CC6jPYk^ZUdaytYxLpx^hHGWVy>BEr z!xR8Rdmg=|LTeei7{-pzr3!4Pda^v-oYaqhDM_C7>*WC8LlN09x0<bZ&><38OdaI} zwNJHng<c+Gch=0w$_a;Jcc6XG^RHj#)H=~y2Ehx`QZhu=?(rOyGnzhLC(op9Uo#Gd z!h=-(GYeNWI{LYpa8SeH4|=!eQjgCHq6mtF9Prj_d+W<k`g-VG+=S~NJ*zFk`Q2{b zIL4owBOIVrtlTl?Y#QsiQF9?YBR=Xj9R=aB#}5)rO=lvD0W=_RT|ZuFbc$b{;)L<p z`M{Uo!;_xqIPk9g_&$iO3Z0Z977OyWr-$s`Of3Q4BeF$N1i}5f5Ur;m<>&nT@ZO?E zq4|EO_AXtaC=)Nmq@>YY{_ygFKeA^Wkb#a+tzrQFt8W8A4D($fcMy8MGdg*wVCdx4 z3W_s&A;c2-r{I7j%zQm;Ofb;F_4cB$2+to^Vp;?Y99DUMMcal+fAR$=te%9ltyvw? zf>o+d#L|9<t#)OJi4mdZy#*!!Ss|4&(8EVprint%6RO=#2j;QW(@Nd`upMTateG1x zLci;n0`7RhUdp|-9g(O!Q!5!BONZ%}Xu~&K1mdIfMz#xS+uy-s&YVfFq8<In==dHt z8DzlVOP>N${r1lzf#dITH$5nB1Eez|2i^o$#a)!@JrkSWoshV-NxB)AA$}BOwlv1b z-BttKnk$BTKcw!Yl$Pd;i-g{7SB}Hqa*Ajq@Z>8gAt_qy57B*4LsEV+(21`v!}dd} z0c;b%A&E>NkJd__(?qJ?^Xn_Xc}<DrZ9aOdPV_u~@ZD3m8StANS}>)6nbe(&9f}_F z>-*0FG(u{W8O$mx_^TFH7&F)R&~Uj>o&8XqBs?bGVU_P!8p%wDg3B#w18BvsJ0%pV zj_IF}I=89vxT<QSWIqk0TM;O6SWcv7@}9aMJ&|Gz)k^1j_>G&HAIbj(1n|~4z%MrB z_e_h*4rF%g>WKF4*t_2SWa9|=vtJJ&t<B9%^7?95a&lFd5{pE<N!&MNSwU3=faqk8 zymQLRY&%HB=}!4To>H7DOb7-+U7wa`X>(q%W!JIlf5O%@<N}bK!s)554jKXg1XYJC zE|Xm#s6)-RghXG;n~UO6p$LJZnSJ=nD9(ppYFDVC4?ul<mWydCHK|Gil3m09Xe^>H zmVVe7Cl<2R2<mhdkGOPr+1`APJ;zI2TeSgwj;X@#%A)HZBw5R=ypW*u@=;`vY`DMf z*To1+5DNxqb3BT(E1tFk%4i?{eK`ue98uHN<$=`kzgITr)Yi@~Cu8JF5xu8EyDY4n z2$w2YhH@cwTHdjbGid#i0VkNb#<9HvDf9{nq3vbU?$40$<&lDfO?mXwcVTZ+S`L3u z$OVC;f46b^8d+Y?bbRdvy}(@7Fx5vF{kF2?33x0=S@}EI4&|_VVQA!7VD*7TG*a~O z?a!dJ$Jd&1hZR>BTs#mZ_3L>TizFBGDV7eVyqG<+$>mpoJ@ZjXM8H!S&|=Z6>N>W? z*2WG_q~iv9*OeKan;*`Hcjqh4{UE!IrGVnef@Jvd=gA^$VV6+&5J{7uZ2O=B@o-bj z92~)pu!#230bo$=zWp#ky=#ghd4Ema2e3^wiNwM6M%#VCs1p5KfM&#d+nv#)*k9-Q zh!wI5qzR9CiUmR3x^sM%h%YA|hP**zNS(Fc7ehVWsYSRIDhT3SRSc?1I(vpcz=~ys zYTs0rh_~jvmzZ(aT54ah;iIM8f@^ULE<Mib2I!<HU5gi-2=fM<4k9m0!y*~Bb}Mx$ zmh43X&yUA-7_XD})lI&ks5V+`oS_ZVU6y63*j}FQmLb<Q>-&E|v<!>6*SR_0ExFJ) zafl#@<TNwV;sS|oiZRv6DKp|RRRKT|!zJ}=9(`RSLopLpdHnc^R1oR$-6;|eE>ryS z>t(d+ppy(;C3x}I!1;>N0nx?J*;jZ_*9|#)r8*qDomYHl!`(y%<9!JcbT_;4aAWJL z`E6=un?=EoF7#aOw-@Pdgu;O7Y){8<$*2k+M{<*{b43z()_gMwSfoy%40$p&wxCr# z35M`JiLt*m-*@;aHTj))O*KRg)R&eHq?$#1T@zZ7lL9#klJjWD*BbqTHCv8{e4qo@ zE~0;~1~j%0IF(bc=lA|_&~-h7(W@RP^frrkbYMSQBh#VCC`&Hrc>I0*G5m)c=D|f! zL-rkMfw#p&X77<u`Fb;vFk-;BHu^)ul2<6EX}6f-ed>ug_#A@21Vf@86nk9?F8=1n zV*3ez#O{mb$gV%YzQ}_s6@ym>i{e9*p8@JKc)0%x^~9B6fsq=Ww?r`@)>HC&JEN5+ zpKh*w>S+sH^xqjkrHi-+l1qDFx;WkmCsLMabFq&9)vg^+@akVNU+=P;bA^TPX_PgG z)`A#Gj4nwzytVKxyhPlTU_ku&^>an=()R&lwZG^UCLtrxOk($!>FfyS>m9F+Iqlsc zb>5O>lY04WBZOLs6{9khc7;v?PpUSraWu%CT6;t@LUkPe$I`F~xAT~>O=#7Pr&=VZ zY||vech){m#S*5kYB-hOx|uuF=-XPH7{3|r>89Cro;+A<UE^mBLSoMB-eiz6DEB`4 zcC289Oyk7*Xme;qGpvim6@m}+ms%o42`05Kjq^sHmk+VKdW|J`Ug&!=<{AY4NhF^L zxE6rJRf#XsqrIFu$M)S%1^@a{oeY+K>OylpwK6P1xj1Sv<0k(Um2Jzuxc1I-K>(lX zu|U@R`1=)1_t3p%J$0yZ?+N8#%dNV~=qQ*?)h{`a!l|j^HowWyl|06bz$<F-=t4dZ z#3cn>!tbhC{ORQZuf-$6Lijhk1v;pLbo%j(NpEVUL8;v@FKowt#8bG|=eSegHFQAZ za?OESP{~>7-U{9LTw?cHpd+r_qD1}WXNT5(Ja3YPB@5gX>}~r_qpDnGe=vdpFzlEb zl1mdeBt@*SJD0$$!|17D9Clt6yU3Zpv%8TwW0?4Zuf^iC?;*Qi$*mC)JDmxMR&$q= z^9?>1Zndo|O!+Xb&=1Gp3)#+1m)&B|?p@z;y=1d(P2aR~B5h9#v|6W`U^*D+fn(GI zxBg`Fhd^y=#7~)h7d(<_uF$s$<6(P=qc?bO_u}C(aQafaRg6jZ<m%25!N8lzn_GBz zpJy8N_JG{ibu5kZ;kOTxcxww#R&Zk^orSQT1ok=21m;&1%dYY>2cSW1iVXC{X3836 zOFuy~m1jf{1xZ7}*VeSsBIZMWL>i_9$*K1h5N4dL$%w^1$0(J}T1N(-e`{!WBLEm= z1POs8W9Xd7Xj8v`1cevXrnDrE%Y_RqcRAu{+nOK+6HaWxaXr3JEY-mc-r%n3#kZ%f z4H8zjkJaBOXw|i_vhL~`-gL-Uvc2vtN4@IN?&?+F;CAks4nhyX7C9gC&F#JO#Gr+) zty?BBo~@oc)b7{!lK+dNvw(`~X~Q@Q0uq9P0wSe?l%#ZnpoFA=w7B%rOE*$ViqxNO z5Mk-=kX&KOr9rw`dTGAlJ4cR3kL&K<J9lQ@=Xu`WFkgQW*|pQ_b8_``PA-@XqC-@; zylt82)+G#9WJP?DHEgLXZ#=q)JO5(@k}iMqF*|5ntMExw`FZlwbYc^@rrNR&r5sw% zp#D-Ex`P1%UV{6{rj_@Bv#HMZ(sAb#r<VrWXMx;nV`8p`XaC$mkLI#Mc}_{MZrp9r z<^3Ul4BQ2w;A4TW<J2P{$V6Xp5wemADFRA#k0)kDKKFz{+qTYXrpIx>0GUz^-!)H_ z-$%K@!@eJturwv~J&)nW2^9D<1$6R|09stE?U&%T6thH<83;PJr}~^i>eq5hR8#W$ zrk1GQa)wD8Q*Ny0iz`MX>NxB6L(RT`8><POr+zyWn~gb3;tKy5-?_OGwsvFh=&_p* z(gv8mTv^aI)R4G-MKdXLAifomZ*O|mZJKsf*4Q!~yf97)X`Z3v<sJxA15Kei?|^gz z<bI!d&QuBKMY<6yn-M~%*?aDVT+jFM4Z48ATOan+m{WBwBG%}K69axnSbtn@g)wD< zF?s6#T)MWvi;lwSBxCv6v*Mkrt4xDu*WN$HRn(t9si|%+XgKx#q;4==$-Vj>Wjjy$ zcE|_hcYZ!7A^C;jbsky)z=%NLh3>6%)7GLn7njcoo>M|gJbCq8Uwp|sA3dVb-Xu%s zA4uj&S0eB1D<8N5ZlrIy%OM3*o>`=8QsHmqH>kU-9S4oa-M|T;l<U)l*VH7l*}3L= zf=1U}qg9<XU?}eH(jpkYWO*i|HI1hhT<4?Y&-t7MvWyQEoZ0?8)5Ki5w|?@htZRHj z_i958vh$D{hxb5T=Sexran~!>@KIZ8*MBM}b1g9Jnjge>K{iEEG~wqtj3<AkGc1!> zy3--+C;fR6S7=qEn;}rtn8T}Mm9FVtUWLC*8-@2W_Ja)s3vv6NJ<NThwCqGu7f#0! zb{WqV%DSaD;zaf;7_!SplmY|tgNA-Ir`sCx0ivD;%Ua-eQ1pVGpzuQjVOKf2(~Fu- zOQi325Zh`|Ix-X*y%LxyDhToh;0QZrH`|WANubo-qk?JU7?0}IyIrp(BNBX@M=WP0 z8tgL~1||HI4*PW}MtzMEP3PBFe20S<Fmh@KD_4^9f(Jj#m8WN1Ft2X%UAEwy1^{s4 zpgVbV^$A+#wcq$tA@1|Ue;argCO}_K;Lh9WTg)mu2~bP%+FMMFA^B)^JmR2x6^PmW zin*31e+7>rk;v%X5R%=m1g$ewCwcr+PjOUM4X$puyDXgD<;gTg%8dm%H-g7ja;Jx_ zjwib&koE(!#_)&;Zq|*CMyBvZWI3u?ZG42N!8Nkl*v(*v??6;T9gaGotK0Y><c%CZ z;vHCFq=NZ2)SbtGv1s%f;m8*n<8PW|hdSp0J4XFCQhQ54uK5F&%#uRoH*=o@_Ra!m zUsM;Tn^FfF3uKhSU?(9SzNH_mDK`NX1oS2S(b^(=$B`=L9TL%=ucU-*rnjpxVuGy7 z@QjWh@qbs!t2$=`ERLoTYx>-jN4rs`MRAQ$@tkSnfBqI_2|i9-*FNGMtZ{Sk&A{MI z(}$9!3c^~l1hpV$9IQN^V7`21`=EWVxVJ7SfkJ03CZbHkn7okPF){}Fw<z2@_v1B2 zDhdb7rO*By3l>rIF3$czP{sM6MB|4!&rVBWezJFv@B<e`;1LSjADIDO33am#W%oQJ z{C;)r_D0$mu`r(TuS%_(Cc^y4dD#9;ft^iF66TeqDY7{V7%-`xr9Fow76RHv93>c{ z3tT@S?$s6XaZdUkt*Rt&>#-g~Z#y5R`k5I|`3}zS4A2uj#%WW?pFN*G+3dRkWjYk( zTUXCCy3wUld!h71HwGZj*+QXn(%tnRMp2lfV2q?*!_3aBXlu!PfbuY{X!iPp{Ji1v z*(<&TPKoYM7gwn+7jP7AmQyA0GCo3;X8DCge6{B`^ygCz?C!hH_fIFLB;F+OtnzD@ zew(A{{N4vz)(j2K;#Ut=Jj<0YC{kdBZM67F5)WafwEqsDU-ajOQ5a5uf3XQ{oIOEg z+{qiX=~qc(FYhsSF05G;6;GESHBLJC&Nt7YH9kzr!{ezE-iummGZcXE<5R_szzZm? z$#nmVOz+YKSvmc+nXU()x_U5r1QBPjnzS-4!{LKPS<sKwp!4KsaRZ)kbu^mhg$-$s zXF8s-n-O@Hk$qXG`-*GG#xMIblOn^qS78YpX&27DDfsR0D-X74US*%&OWTyjlB3iv z#^PsGF0A)jND<$|*lFs-hQ{pUXPKu~4^IW!dau4>2`97pMegbP=$guy+_$aPJl#{9 zwX|(MMZ*2^p6siO=h{!`s=HY6JH&3Txw}C6R44yfJ5_m0$TZD2nY)@VlA;5pd)w{{ zls5@wrT&k7udCVD4QnGY=4P>pb7oJ`O|EmP%!q?Ejui2;Aj>Kr<mT`q_`E3>+8{HO zm2+XBQ}kZ@2_Js_zoGg&&M(~4doM_0-A}Ol;}D#L+3P|4_&$H*I!z%qB{Z#b;`7#V z+)VeEPU8Y-Lom6+3f`IGd{=fLV!kbbyb@mo<f^*HqjYVK*K;HKI_H*<zg7}qo*!|f znAcJ&q)rugRyW1qak=O!snYlKrs#dp6wsivzSJb-hThZ;UAKD!Gp#d$UoCa=<~O%{ z`XX~-`9=w@!gd=2<5^{5uD_>?|7pOh1Z<bPZ++4+z-RdqFfnE=KxTlTK(ZmG%AZ|u zFQ1R6Nm2f0cNEf2Bkovt<wz4dHU&GFqoUl-L!;E3G1ns>x7KW$S_%(zKCT!()&$E^ zlhvKigpG>|&P6;!O|Bs848tP<EgJwEBGb^<1Y`QPC=jvr;OM&D{->6%JL)X5;+6RR zFmR<LmQ!77h&H~7aiVm4<w5bp0~Ij(X+Ak039-*ee)vq(d|{8c<nI*x10Z2k^$F7$ zi2Evg3LQSs=I!eFR7ek&@RfH!+HCok;yDx)^D6C2_*vKL@Gu(jA6^mhxyX%Y4Rs5W zv{<I3Q;t*d3LQXy8VROPbCaD_UyiUws_;*$jxT_{GiB5N7wxO73%63GJ_mmW@o`>W zBU^ZrGkpLh52zaZ4$xZh98KGoz3=8MWISCsV=d=dK><v!in0PV6UWVG*v7$OU-@Z= z0|-aD&jIoVmvV7oDt2)9xs@b8etd=UMGXZq&8KtaaLv$gc{07b*G=mg^P#?Fk`^#= z5?65VF3!af#Jn~B*`v{S#SIWHhNj^L(ANn$nn15df*&6c@ui@Gwmko~==*FM19Mfj z4<r66GVvbk^T#sQ`=1XR=?aycwBv<6rVXZikC?!whxm0f#v|QV3hXFFe<Kl9P8HGG z*Q?v#-=&c;_C`I{$+IUp5^UkfYY<c=KWnIP+3NHszD5Yfn<2mz*_Jp;jj1@y8?mxI zKbb{_8zI8m=A0NCcw%A2sjk8;&Kuhs+U{s{o!j}Sz$fU<TwJGu#EaB0+ie`k&WrxI z6#+AywKV!jUk6dPb~oUmzeCM&{d&0Uo@WIg`X!Lp!iemu0j^%HML0{g;8j{&ZYPB) zd{xh;M4|mx!|;pQK1$e4kVdx=pmvQ?$T>KAU9GYZ34n$L!FXbsuj|>sA~Sv|Zv`*D z96MM%LmC=3?oB;M0zrMh$HuQYe$II--)?>4?R^aNIT?-Ttge{{X`koX&&q?s1kM!i zYp}=}C4c-)N78OlG!O>T{Kmh44BYwbLF=!lSA`&vYC^;_6rt8o^;;LB5MtXTlWed@ zymU&ubuJMZ#}%px7w|cmz@|Gp;_arrtqI?W*k3bWS?jIMwAjEoe1oF*mrA+jw8`tT zm_5!xQoPB7t!dDP6vQJyJI&J->qa$-R|N+}SKrH-eTqQp5OcfgBB$UIl~RKb+IPQB z3VL&J38Hjm)sBWv`VPjc^$Lxi<Zrl-=>4Ig7^s^@h_*lq!_K=XgNB|co_TOW!<o$2 zT0kSn0&!Ivl~mV%wx~K7NgCLjt`xKTFyptE?eJNLN5gVK?i$0HDsuR93=!5s5uBN` z@5yoU3~kEZH25xYLlbsC>l5H+UC~kF0Pq_8#<qLgZKeJ-VVaa?(GI{J$;p!jTfsTD z4i<xqynu$|C8e|M`yXmEfEHDJFozJr97sih`jwzC9;@2+5ATqH&TsY9!Ru^+!k+R7 z^vj)H1#bt+&U9hhMB6S(#<<Pgktoq4S<^J{7#K&56qlA%=rMQ%MN*9nbefN(A%9;i zm4E+iz<DHKn@izA8GKv(Y##h<{~;UK^u=4{1NFob__W?zV6TAIX?EHd0oCiTTPG)C zXCEs-yIx(2^wI-mJ3C@q+{~viT;?X>QX%skjBfjB`tx#^3g<=ds;*J$t}0C3Mis@k zm?Ht;j(Em%q<B(O|EW*@)y}LAb>3J471&i4$afA=x|a`y&@~NqzvZ0f35^-kAo1Pa zQWih@2OYM83q6r?f}DHzM+K@m@pk9@|8fPPHFw^#YNm=^4<_Dz)!%^kcioVqPLs?U z2u7XSr4q!Z#|x{K`Dx1-A=b3D6Yo%ki{eGpTn-4;Ynr4I&kq16J#=1>pLf-{omtpn z+ds-{^_BQR+k6aP6Hh7x^G3fD*Z-jCFmfzc(de@YN2KDv481&*xcU50vZ2;;a^c)y z102YfnM1}6R1osuOt3SUILHl~cRss3%dbf;lvwFI_##nZ0+f16QAoHF=`Z$B$eN1y z!EfdKW2o`Z@INUly4Ius*ypwiE}Ad^XRwwW9n?f_InXO>yiOClk|{(av;g^Z#joF3 zyNq9zRF*aDKq6gazh{jSf-GzM+ymlw+c;`DWONtn=rs4`Ok`M$lO=oP+HCoDND2%& zv;HB4t^13iLlc<#-tQZ#{bUV)A$EkkIa=zbJ?)|RxJlOUAgJtt20N@2?$r~isCyt^ z?^d*kJ)x5w|J^oRcqg7|ZI!R8)M!Tw){(o}hyk62yCBiviM+nn8${T8+Udk%o_YRz zfd&vtRQcYdxlIQ9R-@g@!D3kW-;Sk6ZxeEum0N7sH1Uh7bb*579{<pd=F61<X6}Mr znN4Cs->`lS>@Ow06g2^b;FDR>mmYUcK#DSTKihsm;_W_Xc@xE~-1R(w2Py0-vbMcT zr{VnugwS!JJ9DYjh9NKEwTJo2jk|x#LRz}H1U$gVw6ff9PftIcxWeE_?V+Ti@KhoV z*OxkV3z;LG&KIJtobzWdmzm{};j&Ei<e#AF<<WFU1BG+{X;F4U+?%J_0shOXh?qQI z(|bDrbG<J^cin2PX+?%uDve)gO8<G(8$gSPwT+|2cgH$rsP`>rc_f%4oVP}H)hOjy z1vGX?LHe}?6{%)7W>~$4*Z$Hym;1z;{1uKU-8)ho*7AW6ZBEW+M}3~5>HfUDRSHAF zrcw|;)PiZ$@OAx~)z{RChm1iTIJvu+@v%XBb$*z+if<pNsapi#ACWOqUz=KkqZ?tu zux${%tvI0z_h9nSAy*jgTd34cp0d`9*oro%8Dq*57lWhHlbrbt`^`W8vCOS-+x=UJ zr14#@>EJT)ar$6robqc-U!0=^NsxWo|LCz&@DuR-MOMxBN7H$uMbILyi_znGV^b?? zY5ACGGEF8XJ4fnY{}!9He`<}wGq~$vp*wHE#1&EIpY;+Yb932TL+82I>>I7M1#uAE zo0}J1=f-MPro0;S#A-0d0h<^M0EFS$*2+4lt3^BWH(QLqHg$uM%9T(j%&pD-bKjd2 zlsEj6vjlN4wWk55EJ7G<RM&X=<ps>=C}7>tG_Ct0a_&;onB3<46KP;3GfbqhuUwQS zf2^dzY4>QYIvIgxxFG5nz<AW*8Z!&Mq7HT}9^H6HdmdUe>tP=oC7^>+v-#oy8iHJ9 zqHT)dUGYFo!RG_kyR&KCMbkLmYk9UaFyV=>9lfBt$mWVH=qXcc!bIdKlXs`v!LRJP zK7C!62{l}Y^ofW$-bl1ujdsvogffTXi6zmP!<*EGgB8B1wtF9fXN`GX+mssx_Qrq= zdU3On>T7?HiPu~uJT%B$^6)7H<c2?_9ZO=p_*Uo!CMUF67Uq>_h+Ulw;E+tg$3B=h z<EkAc(TC<?+R+U(S%TM~PH!H@U0{U3*R|bknv{-w4VxNI<K)b8C;}t6XG0(G!qRyg zZUz@VXu`NaPuTBSeVUCm3r+wQ0a?-2Fmq)u1(fX#hHJCh`k!-qX@ykA>cP(>gyLqx z@Pn`Ki<z|t(#6j>tx31lP24e5Ab*xvU+y(!CQ*1hnO1HfYhk&YF&apD=y5`<EVowo zH;`wcNENy6F$yvk)oQtLA?RSX<KXnZ3gUg`!=cOuKsB@^VChTe4)xR-yMpRd2ZBUI z)XWXicgD8(`inX|;s}=jeYJDoV>`G+X=;)M;jBQpOb@0=)WioutTX6|oWUjY{mqV$ z2wi+QXKe!Zg@VkBN?3BFc>JI>pTsQ7727-UEB&ZHwe8&S-5)Rx;`VjtZ2hj{lA4aA zJKFULCaEX;MYHO2mTYt#2SqA>C=Uav3F;HqcO(pe+-8$K$2O-}&MzqF`EM`5bO#k2 zfd79A7I@Mcbna8u`kd@`j=XB=h+8oS4PCoeyK!G}tAF3jeHaeqNE0sr3yzED$vN9R zVtU85$k6cenpuAN>OG#n?NkIFch|2T7_c8({!o6{?SecAdkH6R`g<tBba;7A1$AB} zqr2%kd=+`MmZKi`=KOHGDcEp5yP(0HH9i`kZ*SBPVHD(@y;B%?RcO|yeDVD<-<X<d zI<D--=&An#x~3APNFbxp-y@rTgOn8gXm7~wEhn}s_$SauG=b`~-hsYu@TFngNK{Mf zI8vys7y`)31uNRt2a|e<>jOfJaldVAmpJ6*s5cy3;%t2@DV{>nsBfIls30E;RP@EK zdb*7c=W3c(hA(b*OOCHwd<(BPc6@V5nhtjW@^+eM=pxMi>a$$SA0G+)i}jM4Bg!Zb z729slQ4q;xAGPF5=c4YIQk6wr_dZAXc#l%x9W-Wx7<i8G5PqoW{N7HzSoH>#2w>*u z7NmUw54lh`?d4t+RiYs-X9;nz5h>V^=nikLAPBOT%W{K(^;=o#wr{?C)eWcVhd82V z-qcXTxV7Vf^{Go5Tr%08wiWOs|1luf9#(;d()78!52@lOd(@n1!utrRH%aM8u?WNU z7cBTPz#Odvjw6Lis%rkEml8CWOTp>-PuWRbOq7>ht`=SIqfXN_whtrBa8$m4<_AJO zX(r*5M^J1aw1E|~RF_RLbi~ST$;7pIr%7ACz+(SzK@2EC&f5f)gIzv2QEw+ya;-~Y zwYuCw<JPu=l$;<Y;bWV_jNm`uy&x%M=BNF)wG}6DHB3(wvW1zxqxNiz4CB2XCUMf{ z>(Sz>46+W5BWfs118rOn3B3<<K$ro!`@rZN+r(BM7esqB^+)nfNb_8g?Tt&J#jNb# zF(V_LBmOR@n|{x;x%5{TV)bqNN?;81dCoWGznks)Z&#*>{k4xxqIp!fW3VpDwh(kg z9s%fQV`YzkHp8Tlz|SxT&mi=17T@snqQWt)cD%1yc+anAQnQc*nqJs{zyw65=psaY zMb*eb<hM9Y%whXohv3x8!`(((%_zX?#USlGWFY9vnp=P&F#nZv=LBQXTFB!&gxQ}c zRMIbZN20v86M98keAH5yl{G+x0f7U&$=OJE3kN~A1U@S6XO}(YwBdRaD^s?X|6d?9 zYK^QMnmcdIPyyInG3!F}?yEShLSf&{Q#w$!-FTVky{3Et*}2RJ;pXUhOZQsO=H8oa zfc_b{rRbXKh#KE}0=fHGHcx}D<z_8_`LyR(Dkn<*rCI?tco2Sr2Z4GH+?w#BGLS+% zFuZ@@NZ1B*#x8>ylee@-*vH3V4CBrNwGtA1_S#4;NA%9alKAmW0wkqK4SPie<bcCN z?{-OiZ<gLkfJ^sD9gwxcq=A+QI=XBeb?1aYQ>+@`DqsIo%N?t~Wz;0avmvTl4R5yK z>*j)(?unavc913#P~;BJs$yUFNq43GB(z3LrX&E;Lj-ZM91Z?yd$(eDQvXV>U1j-; znp2cHToXLwu#m{cEcHUW(_@0{_n_pmJU(Cy8d|?s8JvnS1RrZfkphG{Ux{D$afKok zW<R{6Y%F||SuE`0bTL$HbE$(lT$R7O41DY@r)v1u9%c8V;G|<CjBicV2Q}kgJV>XF z86DZ)C6lz0TS$@|C`oQypr&Wo9oM4PAWa3#Ql<{U2mHJwyeL}^%IyZEcWhos!yGHO zXMlD}PM`3Ogveo!jKt;J#I>t?%Uq$sUuZ>(&by0&G_`)&yQFJSKbq>R!v+cP+Mn3~ zM%Mh}w?l6CtU_jKH-nn54=uxWJdsooI?o-)2&}p?t^O58cWtX*g$GB)YV|Gopg}-L z+mKIt-R=oLid9)1;DqVdX859XZt>*So9zW;H_qh9RA{4w@H#^{8P5=2zOQ~P=BodN zcC$JB>)s}$z3T2VKYpc`rJAV@(N0QfOXO0Y;|>Px``U76Vp5`o3gWadD(}5cH<uUX zyXURI#wVYb>~{U1gdxCh66Pz{cOI@?w^+f&|1)yLJDaO}9==#$oQ{pvYF2ia;PV=> zF;jh+7Fd6q>WdmjqPg3SO$l@^f_ThsP9p42ailU_V8=+>x|@!9YR2gLriN5n@1V~` z(QE|X|IqV*A&z8Ku3vf9K*3Pg2m^zwWM=F#lRDOU3Yc@cf?fgElvXY`#-O~Lx))E} zUe$`ESE%(wKR)&l!IjDoly7J|7Stle;b}_e*6OQ>1QJ*Wq@4c;tn<dEM(eteW~DU; zM$oaY*e)nO!D(4tmK^Obj(_#f{Z>Dny=iuB5#OrhjB>I=FjR~4HquchV6^cfQ}qa6 z0zN#TmFwigOA~Bn;d{{lL0`1zz?ys1GOzD`i6$XLH(8NIR2{ZWjW<E^tF*7Hr7})7 ze<!gasOM9FQr}oRqi=Y=!YnVhJ29e1G_#gEZSO7%vfz{_9$j|Z-V5FZZ{V|ljBpkE z92x9V<|J|?a457k=ejVuKaQhz6nNOn73zF4(IM=)ZOk7e_Wk<qaTy+ZB!KSxRjP!$ zk})Ox>f!~)_oc}G{)L1@Y1=z&{ue}X##=$Qf8+X#wy>AB1RPJ+5~WB%LegoYT}Rfz zYfP>Pv>>m9c9UG{Z(Ve>KMn%fCRNH{aN(HD)<CbHdNT-T5Z|5T`Uu-7A4nH21}i>@ zaTy*yo%Aeu317b~fY@!l(Y`Sb3|POw74vhDVLBh!#B09Lq`L5TSo5H^E{bzio<-f8 zmGl6R6@Z7f^kzBWA_Cvz)kl*kiM0k4CPXUD`Ar4d?`g$h-_#D95%O=rU)VkVbsOeT zMo6Wjr5fF3NXyV!Ot(jO5A@1#Hsi7&YW_xVpdlp0qhsut0h^|^hiW0t1FOT-jb{i5 z!jFT5`^^L{CjZ+?Y5`@P?7n$~V}bHo3IO|EE_b7Ex&Q@VE9Ip}7QKb5f5qtc5L#8J zsk~YW*sAVmX^?5~vKnLp*goK2#;iVgrlnp`u>D#X&biPm-Y|W^)|M%yW7KX?4%OKJ z6S=~p+_5ARYffy_itr>hMG4g>X9a2oPL6W`nHB)Rk}K}XENjywv|lhqglR1sfR4Yl z<z4c;BSRtp()M2=k600yHr2s`M^B__LK7#ONgq0@-^{*t%lZZU`&8wIge&85AKR<_ zWnHRO&&)ti-`!FlGR+hh0m~q@9EB!or4qjSIC+q`n}TcEb&PjSaD7ZO_l<R(a_36w zUP{X8ADfspxsS<W28;~PI&QP&3;HSgAK^p2A+)Dcxt)al?=X0VfRld<AppwDoSd{s zC1G#Cpct;f*<V?Q;ptL0=O3bQR8^(h!ry&7^hJW4*?OT_c-)<1X|!+TIn{5e!PIOD z**q7RCJ3%-0ZwoxIE-L_n+1Fu!4J-7?K&WQeTxJPwcc4n?Oxn|kDR~;S7ks`2c<td z0l0#Tm02KCJaa9>(`8|{;0N+Q<gb8{JJ^7loOm|#sjzX@7U)fvB;eqPQP}q_Ni1)y zp0_RHSJ2Sw`Ku@HQWNm<8n2Bk5cMEW)Jk}wSup0jFna%1)RnI)KG_T%pz-}ApY;AG zzyXfsb{0m)jQ4TP6Ee;qvQz=Ou~JuC#{_BwESrKl@1!K7+u;B@Gzb5--vQQ6pU7)j zhx&ziws44npts{b@TYu9BX;Hb>ZC}pu&SxqhOu0be!N2$gjlI&8h}AMYrSEk<J4e) z@)>ZM87d7O`M9P+bAzhrme{vfFEE7BH0hmlMwiKfn%45{K=$>sW+{;Ac-$#p^3g*; z5o%|afA;R)DNrLpEe#TGp^LTCc+dd!j%^~BXY+`aPZU+}aUNTi;MF5)oMeKo+SfJ; zty*As`HsIsd#_=DDb6J?=gi=gQQXJeau5YjuRE&>u5B%K&pGo~H_I0Vbr9?|#;1W) z>jx_O?cNjE%hda)j57_4OylMm6o5&rs|m5vDrT>jsPTt=xE02lFYQ6)Bum*Tvd=~| z^_9P_wrUa+UWE!YKHdB<YeBMUZor=q-|V^3e&&i{+Z6?^rhR(FnuAnTta#%cLix|< zdvF_UdoORz8OX{(uAL%lm6)$SHKWKR;jHJp4fW$-?E&*9$7PhRfv~UKPp6Gb9d~qG z%`{L;q~=6kr%7Zp@6wLYabg>6Ryj_A;ViZ!uTWcpl;kYe$Fr-~e21>xQdr$!^1(bu zT=$67h-OX3jRE$ve)RWdhpR_hJaWe51>33G7t~N>y4%}1k=q$_Aa1rLOj@U5vY%ar zl@)R6z&kiTe`BUli@v9=P))(pRSfOdF0yF`r%^Zo-mKa2(OS#L5IgTsP@WQN)4gE= z`0(3}b4^awRQxpQ10nvWcPNEG;&i*b%_Iw)s_1D7&pS|Vp#D4&eBY;J9C_HzMHG_x zaY4CsHY}&bZ4VoLHd!>=Xf~+^GUhIds9<4_3xoQN0$1>~{1(WIbry#Do6m1Ch_jxT z_{Qdd3@p^Ul;6YHBpf6gE|DNf!~J`VXzDg>yP7Tm8j{}T&rS{6e5D@*W&n8g__*1f z@yaKnMuz7bpaM6L03ms`pON0Hb!>=kQM@Y`at|l;VD|`;)#zg6_2Ia|uYr%t?ymlY z%%l1`Kg&Q6`$aF?mQ%gWbK3mC3o?u(oza#NAsU>&0rGMkx9~{0*+<pXby4*A-ubiF zh=;_sT8uWVVotnN&7h|ppe3q7Z1S>bWO94rB>eize&33sFKl<TjBZz3dIBE;sO*C> zbZ36R=fM0v4+n|j#g}87xw2xXnV#dn9~mg7XgQz!>5!PzuRlt5_~}&m*m%!l?YG73 zst6=JWlQTGizhtcd<}I>tv;@|)mFI6{j24E(TLUWs`8?uS$O@U?(ZBaLX)#j)#cBD zoX=6n-q4ob&9-puCN|hTId(`{B8sfEU&ozwKpuXCzKN|$qOMN|Q`Y`=?**rkpsP{& zcgP~Gqs1ULr8$rS=TZrmZ`0OBMpHAMzyzt{!_khPE#Hi)$oq`?t>s+81`Gr?0=T|m ztZS}rAsf{H0M;#$S>97s?gSbF;Nb8R_Ry-I%i0RH4OLhNOUIIQ@2(C%-UzWA=%>19 z+@jWPJ-aG23j{pw3y%vYxCN;dfoL5NUlDX9OVKmGMCR<CV7>T`P3<>ZlbpET6z2bY z>sLiN;Dw|5Y;38aEfyEM)~A7L+mRA`3+UUAs+`vNG99K2$~pKLIEex|1V_3>0uh7Y zt8Gh@!>0^ZggTELn1{h%Dg2(D?Hr%_Y#hG40;<;*n2BemD}^RWm;8BO|4cX$;Mg^3 z>lPLQBT+*9e9reY{yDNs{IId*6X<j33y$_eOF$x4Nodv7;eBzPnmWi?djA+U#O_&M zLLCEI(<D(C9$)UFG4~jx;8R^(HMCoZvS7BeU;dMO4)OYYUJ}FxjE^_I>)*op99OC; zHj2u?0<b5(7MlA|)J{mATKpH#jBJ13)Wu+~VQ^wON6pd_>La+*6Hs}^yTF_k!w|DX zM~>S_hbyAbXn`dEIa8aA#+VIIS?*CIvPA2qO*=rpWHh%n{~Wna-qfGiU9Vk2KHp{B z$2utZdsBGPPBm}O)ay9eX05vuak=_BeUya=aK;QXL2gw&z{U(O*752Z>{fsOS&Z}F z`P#70eOK!US7lipa14smhz9zWJ+51**z{MaV7hB-|GLPu?t1nc?u?rT@dUF;7DnI? z2%27IW_z6EH%o`uH8mw${7V6O2TP=9^wSC$5C+wL_Tc(2Rt_V6a5PZ&d!(0vGgRP1 zw>99xvcv6+bz9Ot4jM@JddpAb@%kW?O$<5qdSSr9aVrG|&L|T0x-jrSg&7rhZ8uK! z$3YDtf8=jX0d^x%&+}P%;h(avZJ!=tVSR3hST1_fYFJ7L22uD|5Ho}Ft#~w8)<j^+ zQ5<j8E@vM0tAl`trRl~nTJ+T4a~|3u>CwK1bPAB^e@s)q@<8lRmQx#m>-%#Rp%hR^ zr)Qig3w1Ea2?FV)2X}!_u}YVk88KytJlwXEE6dO4meVOL2zntPRw6t!@zzCrQcC1? z_!qF{a6@3Dea8jj23Tkh{~r46HH!0rHmTTi!j3ETh2sJifDkS3;o}y&-5;eVX_3l? zX1xb`q5{15IU9Ih!7(v~vsMaCSkai`1X&;F0_V9kk=6@CAxu3OiqQaUWgx;UjNd^r zL4P>`2xjW?Bgu7b!RgrO$AQtq3dcdF?mN~uP3+-cz~$Zc1&bKKv?N1WT3qOie}Nqd zuznxQiD(>n{CCWY<V=^yzb#L~V+uVojFPp<yZa8k_J`|uZ}>yA$~>-vlVF>)*!63b z;5>x<$2$@p6#&}nE?+ZysLwc7Zxtc`0WFdNn$k3>HGYpWnRKYKDJFoqhJ`O7A=W%m ze`q$=?6$hruWAd2tv%Q?bkBbcDFPZ*0We+75?fi3!YWVc3BIa=lK0BnS7yJ5OKwi6 zCi*ZF<FhRwx0BP9_MKKP+H1pUlZ@my&(PqI$Sz3pHM6~bQZxn{;?zh3K|Xb}c&$+q zc0saHkbcPm8ZFdfUp7?*NdhB22iT3bm_615B_O?lf=gle_b4>6ruj&?+6bKQ(?vOZ zoT4%WPLrzA)=G1l+ipsz@&`Sk7<@y>`(d{P&8fRDSTO3-RD7vU`~t!;I#)N_SFS16 zlR9)BH(C>!E<weEbt>tiuvI0&7`~r!_e~|~v3V$8+z%YOw}7>pWJ2BY;6D>sTf4m! zuG9T4O443>uAik5FUjSeb`CAa$gHV4ggl;;aM4T`FDq<d+toGlK7V1E*I?!BJT?b~ zn~NbUD2Gm4rZ0JjvOR;LdB&7-<@yQVeb5L);%SHJT?QwSKvD~=XtV&uO_7Ls7t56u z>Ca_x321_f1P1wf+Sb;}P^34?Q$}`g%US8~0A%;{zR961bM8_^#Y>x%ZGSC-r~6Vk z(;qUm=H8N@XT;8~iYb%wZ%UZ%muWM6Pki8T(>Kn_qCjs_HA|<Vu=_i_bVwY|SAMog zNRjRfvW{a4Kl&mKUTcIDioG-7Y#M72=q<)YhV?8T>LuDtfB&V^PBVToi&ALoH!+^% z*GI~@+Yraw$nYuhK2nhSsBbm2{`z5%y*h0k39YO%j3(|_b5PHOr7Hy8e!O`;RcD=f z`j0P{FNCg*<Gglv^^i89rAFC=FgM{Fvs%d{AAT;W+Ud;Z;)?H`dgQzs)B;X=E{=Lq zLN6ii-k+KD5^9=O(|mH^V|kou)abVA`g+<&#>eqo<Vtr8hv57>>3f!k_q5qmY&aL@ z>iH{q2A9I$Q-`2^u#yYIEIzV2JYmY!^RCwu>v^{T<9`4Cu$9V~C`2W#y{qrhfatON zH!eTZ`9_6@YtIk~$W#uc{?YpkhR?6f0wp^ilNNF96`*uyH$BEYB+MP}eMD(X{T<F_ z(}nH!O%arLK4PDaU?U<f)jFwBC!jF$da6clo+4m124y?8ByKUB-)x%g15xndzjweZ zB_$u;yTeKi&4`s&xZm}<)Xb&M(sCHw`M3Tg2nPowq~uRU`WX&N`-v1w(@wok=sNHF z)%o5OS}QUs{U_UBB)K5aaGj?QhTJYb`n}Qo_Ga>2yo2i;finm~D-}@QAr-M}-HGC` z!Ff;8R8?F?X&mB~$&T+%rl`!SU>lK==kP~O_p_>kmue?I8M@tUw&(H+Y$0=!6Yt0G zEVk0PF0>Ajy*GvJZSlq2aiU>lWX|0y7s7E4W+uu=N)8x@o=D#)E(EKnB0S_D&FjUM zH}ISdUr{R(`bN<3*WJ&>55P)hL;NRdPx{=r<lX$k*6P_l@E&&eJ2G4<($>Nqa3X{` zQhgq*RIR`t705ezub%aPT@$!SgkF0V1~$wPEWYIXA!uzv-d1iyo^K|J-?qAW(69LE z(OoK8{HMnikR`G!Dr?s&Z-&|aHbyw#Of2RRd`w?GpjCk-r|}I4*xiskClJtO%)tbx z5->=AWB!WH`<GYoy?NlS!~K!|s>h>j$)&=B*lFs)Rk<Jv9LLn`?`ZgbYR2+EQU!*m z#1^?pnAT(?JYBKD<iw_Lcj?setxF7zSxJfgR_F88;Lr7#7uK6d{&jMCKTxCen;syB z$-(&qYf$(M6nADO)1_R~v<Rw~!nwN$q`yr+!-^zH6}BZ<!I{IxyPrv}!156_{^ND* z=jjKyb?3x2>=tl`jiZWRnuz!2Fp+B|sKFy`KGh%3t+edJFtxgqm{s9P^FVqcFMC8+ zZ-Qv#ah$B^MWPD5H7=^8MOn8xLJ=w9>0s?ut_=7*ouNZgr0HB1@4uG6{H*Hct+tpN z!w@O-P#+=vT~<{=CPt91_t|~E@N3?588Bo@WW<K#E9UFMrNKR^{MrA{-Sr8%?iP_> zg3C(VMFc4q!d74C@Uo;k@%gxIhSB`i<sTW&drQxJs=j<(tI3EB^~_%D`q8)AN*TsG zdVH*NrPnm*%kjNwunJX5LqP_^n<qbwsHV6yGoGZ0U-<$EQg#=M^Vi2QV-bATB)FFF zr3lq&Ia6<9qto>ehm{$^^|!4Sqz1|EhSqFuwnS9Yi&!7XGr71UF8_?ao(?CKmZWMB z>_httk`DWD8t39T=I$p98yqRo@yGAbTfY&ns4G7zOeJz8lQtIOKt17<=@HywFDPLk zogaxK6{)VaOfVJs6(_)vpsjuFtd3Ue@KYsVeE!WubB7Dd4=dB?9g|V}&;{+?T=oIw zma}>HJFSFbw8pLv@8*&Z>7r`|c^PLs%_%*ypzt=gnZBK2LS%;FWT4Hi#`lrmf0?sL zmv~{dYh~JB9p;LH-ItuzLw`Mh$Deb3%vPcNj;P=a!Fi`2<m+7;X(aUUpX=`ZJx$qr zS&s>xls;0^pVUh7&g|#x;HvNTYA5QTB)!=BPHQfFM=CowLoJN#X}wM}H;1JcMds1& zOWbe+&WNf`1f9M?<H2KrxURA7XuTuh`I!j<QtFyaz8unjGtx{(flIlWvGti>rDh1l zPCt|5uEl(+77e}osrst?=o77aWdh4*{x2d*(Ao{6OONA(0rA7!n}wX=8lnk(qjnms zX9D;7K7F|>>ItOu-~`lD^|w6<Og}h3NQSO!`J!P>w9^@r{h~@NaX;0LHeVXSsUQ>j z2IqBLdu<jW0-II1H8g<{!e8ZRQuI>2L25pZ-$k7koWmzcdP=ipP*@dgD)Pxl$4#R0 zJS&m+C<<T3BChm$9FW~6Ea;Ot7r_JONBT&cw&A*gnV7PM^?u4b%bDLfUxx$&=E$z5 z{vP)Kp?%B$MHhNH#(F@eA$YdFlo9xx=#qN(d*CpSq?}JGHvv9Yfj^;m8@Kj?5iP-< z2nH8Sn1LlU37;s)3m;1Ty6<Ib%M;A~O$lq3E4;0&Tghoy)cx5Ts~>9k(iY<ZHvP0( zB!@WW_(A?RhYGgSSTAs-nnLv*o?%)Jjs@*6aVm#N)lB$%T?&rV9Moyc&+h(bDu5_6 zI5aTL9i=<=ahjz#7kAA4-k>;Af!EQB#@Nd}GA7ELKV4n{J^ksX(*icH>_^gHkW1r> z9!{!clvgKx`#>M#E}rCcD5>G|Wz!{beeLrJ_tf*Zfl9^p`N;!m;q9gK9UGywx!-Pv z`r|q!{#DapD97rvjZ*Y}6~Qwan+c>@COBBJh<K#&XJSLx)(ro&pN;g_d72}N$h!WG zTg8n9A#RcwxA)pqEwoO*wGSR;sFa&Ad3Y50iO_kmfMr{X@>DOxAI#!bd_{(JrJv`s zRO*eLrs&PG=GhNL?{6_>69=}IbW0t18hRj<jz}f5RbIUD2qgQgfmQf$ugf7wqGi6@ zbM+px-^#Z|1<8!c4VW!uz(A2T7}H!0y>DOjtIOZ@pZ9xoH}Hf*Pn+dfQ+|e=9_NR; z*Ja-%g@nzdOQ8wP=E{fVS9$hpGEtdaLf8yAqgWU!YA5)?MEp)GBGP}_B_(3kOXZ>T zL;g))q6jWaJo5K5DrMwvo|ahTf0daLNd2mA#lI*l$#RdAH@NfAyv6fuSf~wtA^^i@ zP*wl3-%fQJ@l<_sM%6qk`S0P7%c0Uyp_G{Px0rA1rX<WP#v%m?(~*iR#CYw&>FTVz zmJQVh*UUsRQ%xt5|Kf=s27fZB#c44N`1#1>n_fMsG(+y&Y%N)52+c}WoLLlRpg9=F zfpi6Yog3x@>h!8-HQ7;iGqjnNiQcxX>Wp+!>lgM-Z&uNbcp8WANQ1;HwZKjw@Q&3= zM89%%9anfNkuFm`IJwLjM{1`!as8oRr}%@x_2*wtaZU({3FPp7t~lsg9PIGr?hgpy zOUGE+Qp%XRX)gvFztje{vBRDyf%NI|)0|lP@J_N}Ti-kM;kmUo5<e>?6=%|?I@%{G zt~2WEp77X8;fPa01o!`epFzd8I#Z8S*B`Nu0w1|ea=X=)!LbSZ#dU8)tVbmhDh=27 z&Bwc!FEcM@omPV%os2J~WNWd2UjfPewcZsp6x0a98xQA&VG08~&#>SVQt5wryneW8 z?u$!cU=pq5{Q#4QA2sh#=F;_FdOvlA4P`z{<yyhkLZiG`rR79ygahfD%{769glkWg zui&_|ljGcbI6lN4JvEbG<%kOj6F%pw|BIikg4(21*%>=89H?~Kbu9SI1_y0;i+kWR zd~3&&%J#2=xEi0V-w%``r91sD5fY!MLDj^MpSaF+I5SZWV>-8z2r+khS2%ulFa4jV zIkwkcCaE1e%jrWYoj*Do!Nx=hCObXU!O`>ry>DG-%m%BeM5FG$jV4i$M+!jk88EzE z<}uaW8F62C>Z?3*FD0_MzFkZ`{3=50Mvk{Dcwc(*gQp<XMRxKXm_S@`Lcfja87rJV z_q4+W0VN@0!2#QBvFfD>5${N52);L6Ci=y9u?5cpokyqNVMw2i{Pqn0rue#uLj3pa zX%YdgB^~naGLOCZ!D%2aaHS*t=D>}Bcg77YlF*L`YDFKoE_G)F5{1hJ&DM<2B8c2t z?dp1^^49oA57tvgoMbk|7AjnyCIKCr{TY;l#xGmz47I{m$JxvzUrRWc<@cbPA5o}( zIgM%0noUx&8_UkktNJ6N64iH`ARg&aOz_89gWZ2KA^!<E6(xSRUDc4gIT9h8HA$l$ zueSliljuDq!M`jO`=032UXgn~m!JF~X@6wX>3MReh#?k?cJJo6!k25s$qW=e*%IhN z-)6S#9GRi>8FaT2Ea4hrzKa|c8nmeRVlOjq%LU83U(c3Y7p}D%X(74tqiocw>MtE3 zUZfUqhFq)~Ym<X}f`(7Aq{wmUl)gyx3c?t@*oiK&MVj)J?qdcPX4DDS3@=~#G(FjF z5HRH>6C=8-FXa2w>;2uw;KtWd!TDl;{;Ll9KIxt_O!ZbO<4Bp2hX~8>=cbSJ`s@|$ zyBZ6)He##rMhw7trnl}f;6Mozz|10}arF*L-2K7WX5kS>x_5K_9U^J`x8!GW$5lqo z>a<D^zjN?5A>V<$o-yg?llAXrO!X}gXO@ojJRcJ<t-zMzixF@0Q)Ff)$Yv=WW3lqR zziLywxjy)ajTUDvB~`T!#`$|$Kn(en_&Cy-5_{K*>0BfIocgqi^)30I<Tu^~;G{3e z_S{RePhc+(hFik10@ZD~Ql>%DfiQXaW|M1;(Nl)yUY}s2690pLf!8DIZ&hBtCNzK& zcb&RbbNQ$;mKyESJF3%O>K@;STx=&u$Wx);$5S%kJSS2!)bo!y_`D;)JZ}TiF4cdb zcY2ubGLSFv9=><q;A4r=`Pmp#iL!4x;+Fogf%#PL&;6i9>*^P36LICnsoF()CXPyY zvM^p)n$kA+!%j0Iw4D@0Q8Nr#vd5c#2(95`-(VYOJG31c?{bV>%*=@RgSsT2gf{3~ zdy<aG)2q=fr6a+^XW*@${LM@%Ok8)BI42<OqtE&^hgPGycy|Yf!0or(e*M>WyOhw+ zYF{ISrSv7nxWbLiwPL`7+HA&j-gWT&31>>@QRa&u(nofJgW-B7G=V?f+Wbc<tvWq{ zA0T(tfoVR9tK<?=y!5asY^)s;(Peor{V!)YBV2v}9>rQfyMw6}mWL7}s=2-Q*0aIq zzqB(Wes^;4qoLA%;izSKM(!1f38_M~g1P<4B&SRu0|A-Fe%_d$O{@hxGw^MmU{d0m zL+~;2IE=vW&igy`vFaqP41b{BLACy+I9!CEv(8##uCgB9WxSUe&c{UZEJ;m4Nc!y+ z?U<y70=@QA2?e1LqOU$A`Ps4Rd&4Y6`gME$8AE<cCz+>%)kW1~YzaSJ$4l1n{TSzz z#<w2tY;R`-#Z2to;)LC^Pj#l*jn(RK@>f1K)?W^cLVU9GkrJ$OSr~WTj%%hdI!Y`& zzcFh-k(9h6`R$aJ_09y=gS&fJM|S&DFTiwy-K}!&Z{*2-MBVFcL@DFXKmH=F>aj@} z<ELsuMv*JE@bT>k-N&Gm6&7FT|I&77wvv!MyCt-^_0l{=<Ii|6`{LG%q??^Pg2R_L z0Rm+kIbauI{6%5*xCin04ehW;DGJfGYk!wL7-va;fg<YS^aAGB;TOj6gBp(TGk%$L zKZ81$`{iQYk)KKQUn@9z6GJcj0ZI&i9I8=qBg7l8?USt>lKau(xg|022kTdlt>Aev zwY9@fzqS9nb{X%B<*s;GgQpAq6d87KzUe#n$*{4#!Tys!cjR#=+Yj|t7aEgKmi7wu zWOt>RnHk@&5dvFl`5v<5%mBYqeNZ=mbdlkKj|y)WlTCM`hPpB~B_7x0r2-UA@~OI` z&Xo6|tl=RH<)Iq!P@k8Xp;ZuX%#TNBy(X9M7y07C%K<9NHT+8tA%d?ry%(Z*x#4Xk z<88G;`o><WtAF(H7qRiwvLkhKiKZP|Dba|kYUg=9qvnIPMCpZh_zbpL#b?+#V;3oZ zq?R+uN_^ie1`H7#ST+2<kHxE7z`~iF{4%!xuE(R+H-17`R9G?U-@GiXo&>6ELrq_Z zd*S}UD2F~QJpWZ?MO*Y&`fYTb>r?M{%t7h|amRcngp3o_*pvSB!VEZn%ad%h7F`%4 ztf*Wh9!xpMpvIqtq7<Y;;mDIaSTPEH8`jM~%){x1b?LBvbc}V#Xgm*f)Ch_Es-C2- z;1GWFG=P4O`u&>Y59yasG2t)Fcb-V!4Y}K5&(n@LWWb`1@bgR3OE-Sm_igqU*x8u{ zau2pmqzDDNX)ro4L-;F-x-UK8^D^8?u?qI?Ft{X3Lktgy<Jwj9%CX4i>M)5~j?vXe zkP?g^52T+Rtocg4eVD?5Q@!*#2s^p<lc+ClxL(hy;=1b)PnS^T@ZOf@=`rh!6RyHH zACkfs)tF<(*gVOeH-7J8AGy|V9LY<sr;vWZ-Onsxud%kD_9tD8r=E&cKb*8;Fxldx z9mA4rK;Kiaj8;GYoDecX5x<mCUA9jVR~2WPPm(w~KKL|ptGz_iVgJmWi(mXs-vwDl zGc5zoOu1T#byj)V9fSkkBJ4%rY0;y_fQ%#R7|;V$5?qZr<D*)MRZq%|O^a2ZvuT(U zJNxPUhM+@8x`)V*iV=rRNm*uY^&gF?^+gNyw@xbw%Ut>o_jn<GPW)u4t@63_LEqS3 z8j6M;^gY7QwO5~$oQc5%yeZiUcK~%R^Gf)kXa;&zL2TP&BW9`M5H!#JC6ivgqlC}E zCFHwaeP_Y#LwsYPUz3IDHgyNvfGA!$`DsbMwCE4*TGc$}I<7WY$9sA*NdY1Vb6|7S z@DY0`*$BROi`~+og8%dhgRRau4(HE5?AGCi`&YOJF)<Zn;7!6PkOs{Lmip3QcoVBD z*dyw7SUxO0u^w;hq)0z2I5>Cgmv<ImlZHloWD2VaLXb**v$o8_P|FAUJt82bw=k2& zjd&WX?x1x^%3)PgzLb=>g0*VX-IPG;sIIVIyJf2U@Uzz2Xgmx1>B&vZ+*B({7rVc^ zZuXE;PEjP}i7feZZAv;tQ%6uml2LG}Nz+@5UjHP1-|GbD`_GhNj~W#3(XV3{J-^Ty zVYF83$RBD^l=$&H5XM4dE3innWR53L+*ob?i?%!3s`}F;aq(T1V94SRJPnuMuegTi zZ*t;FJZiJ~Ba`P>)pJ$yz!FNf4|DhF>CTD!>WHUZ82(iM-O##^nHED}=~EMR)HYq2 zW!WJG=RfJTE_PN-e9{Rdzq@~KB}n2{bK+AOiC$9Zi%sYkYprt@CAbU$TjRLM1aaC^ zDO{|TYV7G_`m92@$kcuOWHF`}EV_wn{C9koK7PXsB}nGu(Ooekg8captKOJWCZL*U z@WS`gVY3fOE7v220ZF?2a5{ffg6p}9M!Po#>=rM(5{gqi7X<L}J;=nE1_ys>3Jm?y zb~s&TVV+D@Ab^J-W~j-))#cU&u<oi#OP$#>2HBu>lv!RYuo&*TZ3t*6sC?%V-7qa* z`mOmpb=W3Ep$Ekjch*ShDT{x{j<+FE{hU7c&1``2amQ3w-!KK<Z_(our6Y<oSz!U( z;rtI5TfE4su2vd*GUL-V-7R9QGjS3|Zd`z_txj7BR1G8Lu@l+VJIw9v&f;o($Kq~h z{N<^-yv1v&<hC0vHa3<ItChwt$L4s3?BX4o8y~B##m~l+xsHMthwBw<ZPq3$w3vFi zTxaT5c^Mfyo^VLMAbLt4>;JP5N~mGnPH8#~D&`At=?Dp`gryo@-zV;%RA%zCrR*BC zFeN4Oi@Bl&YYMhMYD!Igrm*VTt>s<J8(ru`aR?z&{8&+qbkuV)CQ6-vO7@pPpT$SE zQtO7oOiu+CN{Gd1p&r$m?uP%?!^R3hMSYfgU1tF^<>>5i-=>7#W`2T>uPcIjH`hrK zg>AJ0Pw$WHrYJ(azeui{({xgX7!~@+L629YrkQO`v%<Jq&kr8wz=S~Q>M0%xuGl0! z%^R%GlMndE<2hHm^Tp%(R_4g>T@`+bdlN8v(dc{?tuCo3-)Oyij73{zfVPR>Nl{gB zH)N`b)A8ZkauVc~Bkq`JaN!-A?iHkCf@9T^Ka3@XOnU8eTU`AvIP0(*X?@uDU+O?z z|K9_Y)Xb@0ah>whu871nk|*T9i62q;^Uyu)cwcEet@(ziV_g9E-}@FkW6JNDe3WZ3 zPM;CJ56T4f{&`WJw~Qs^=aVb52IYpCtNoX<amv(ydK$~4+V@XjbMFfGQrDSn>6uq8 zfAu03jZh!^7EN)2Pl{i2o1%GU4o<FvuV##nEzwh&8Un%CN=y#wX}k>tL{MJI%#+x3 z?_hq|<|Ky%;*?g``YAPkGmJ}m73eq3e<?>Zc3kEESJX~TLF(Hc=bgrad5C<V)Rwn0 zmO^57tOvV<_%VPVMMkKIk|r38JNP>0(i`(I5qEr>6(<uDqFP&?Qi7?-pG|$Q3z%1C z@w5Qr=NI`yth*MbJP6_?e%p9=!{gr4)NF1dNYt&wLzHcx8^9A^VV(bD^m;9LNHLH! z&_Aj`rn^f(E1vY8l%AMt#7Qj+Nmc(brsTC@@uaQqSBXINZ_Iz<V4PpBBOC6_CPq+6 z<Fg}z$sgvB;$zc=bF1>d)tJ^&fhj2JZjEyd%rE3t*o`XWTX)+WL+^b)FMNv4`rzNA zaYdD0+A7QS$8cw_)Us5S6Hj&#<CJW}xmKVA1?T}EW$S>qYdm)lQ`TIG)i=><nr7Gi znz}G7K>}?GQ=7q_)>pw~&o?3Uc0R=Z#M<-2?+|#BZ{89>>c|t<E2-fA0qJ;%;U`)$ zD@MMpv8ImYAr)SxTI&yYfb+G}OB#RKbbudG=dF@>hu}V_GkmI!|Bc!DO429<N*S=L zmAKa7D9=R%xe2yN7y`f3Kg0g9g`p>U!M%v}mnL?Y+)u70B!){7tPPh;9;l1U)x{#q zh?Ow&Xeu^(J@%dB=*4Z40fsEnu>;)AxDTWXpSdYI%I}N{`{m};P9G27Q25!A8oQ}( zndPOR`sd(gnzlsza6ap48pIRD5r<yna-;d{X*syMA-o9gV?|ls&;BZ?Z<F;u8;G^n z=4Mq+M<uHC8D3$ScB$jW-C9#(>(w(C-GWzCODb>GP7i#dO#dSW=aWi*+ws_FiFqB_ z!b@~nqNe@`<<(+Gl0qG9ylvvi<Y8&{0Eo`|!iUfL3fW{59F&vBr0{d;!|Rp%JUxva zSHa}<eLPrdkewIKko9X`hA%wRm<LJRf%X5P1F4C`?m6-#4UT@PTac~0_1sVKidIpb z3(*C<iF6xw&a~C|vH3RAy92M^SUnysG|f45->#<<Vd&>sC8#>U{k`(xe>`1vSd(wq z9X-jRAR|OVWTPddyQfGg=xA|(bcuAg1B?M89Rq80DkUH&T@unDT`Dm`;CuLe-}PPB z{KG$X@$P+}=ef^)&biO4VFTgXGFG7dvSTumu~}OJ;ofF6+|}zY&)8J#(JRcj;aoW~ zgzEfL&=A794C<UHcqLl=f}i^D&yU?FqF-KowtUBS>6?d4@z8h?7r-Vtk<Cj0Iq*gp zwggZ`LX6_Ui(?Ms7w}fD;UABOCZ?DFgo*R<K`fv_XJ(#X{}3TE%vTGabvF!&VS~7F z;RexBUPWcTr;>o7O<cBd;Ca;Jyo2~XS5Uv|?Ybdf{&ld%>D^Z6(lh8ktsS}X?J%}> z_Zw-;(KeO;)vWd{4sx-B&r#7g%$Fb=a25W@*B7^43{X6osAoWsI9WG@HR};&Llb3u zy9qM2UW>alh&w&uX8XPA)94QT_=PAVHuevKT)0r9PlQLmt+%07;=RHXr=P*&kj8A# zy??Ovb5~OOqIKb6GJ-7>Gm%|{i?^ZfHEi#H>pb7Ny6iFA`|1jf`z5tzxH?m`%-N(d zpny!|M}L#3Kvh>p%Npx{5C6OJ)Q!R-!D7v3d&lHDeuOROk+XB)-($#$2xD~2g@iL7 zBk0akN!ol~xb1zjPvK&_a|IIWh7T6sV7*Y+JKBpHlgvgw!<Qw*9XXjK6np4w^=~iL z*}x~#{wv#RZWL@sa@2&PBSp$q9X7%flt%882?{0d=SD3hqqCTDGEVVLQP*)OTa_q9 z@WR3*=g0C0tk<w0#(hG|!|t*?ro*_MJF*$*k2s?o9DNUWyv%}mOZld$=fojP#*Q?j zT25rFF%KOt30N8sp9e+{e?LYJyfsl$rez%&U8s)eY-bxuEpA?GQw(hjJH+oSgK#h? zSFxu!SY;oeLKBBf+>(Rnnczm7$-5=~*-n5?3C;Zbarge8V~N9m%GbDJ3Z6rDpEqm+ z2=AS;nPW1o0(||O1(Zs@)1N4#8yWZ)6N<cSXVQgnjWIAeUd>172k>?!Mu^kP7M`Dg z3yLObeq_i78aZgLb$ye4u%u)yX1TjC-NrldybM$T#%ejL_KE&YHE5og2F8WL8%oC3 z@JL<+T=u`UpMRO}`^4Nj*m^a><|>zf_9N?4JbdghTbQ<j^#UA&7Kur*xdz5du~*}2 z_-vhPN_v&hv1-R&@TiY*NUKbUF^~%{WU=e2A=%f7a5=)0eoT<x9LMU;q*saas3yjR zd9muASl6_dKERJMHQaen!0f0Z$rf4%h=KC1<A@T1f|+1R3GGiXmAhL=^vlrGMMh!U zp8BPAFN@ceWgDt-#*?YF?qx~P+CpKZ_-i*!Q=@rrYC-t;DouoxZyb^VjVrtRGU`l= z`UY=aKZlq&mi{;Mtm-@&gNAS0e>dnq2o6Oc=L!^Vb1H;SP>lJ9-AIx6!qB?HL6Cwk ze7oFELnt4qc?e8>LP`#>;S|x#vr^k4N>5%*Kuvhgj=l%i$+gQqL9fFY3Ioip!1{+A ztg0?aFO}e{QxhC62e%~Dad-hgTqHDcdYP}SpCTPQaJk03)Q1+Qi+rB_8g84x@T<zs z3i?j0-86cyq6@CgME=&r)p~Kz&jIiA@xVi(dVz<U%v|=E2STgax07yj-qPMwZ}NCI zL**HB?*q|KdPEfs1bJ)OUS8V;<B(O1=NaCRFr81CbM)E<{{1Uln@}Hz_Pd0o+iy^H ziYm427zSBeeVnqVHzxE>gt#9~KgwX&S~h?Pc9LG!UkI+DWK3(|Zxy?J;c2T_G<ohx zp9)oTIvxciY%YS722*eP8vPX&WMr%oSKe<~2w8e5K6lRl@!b)V(ogOe5|_iwE+g=7 zO}p+le&kvZ+Oo5DRS98~thkpP&cs;nywBd?yk!r?cT^v3ydhS-u-5HXar*?FHEN<N zGetY~+x<xN_ag(YikLLsr=cFxCJgRs2$`DFvdYjOUvGsbR@71*q66i7M%9fvvj)-1 zgWG>-lSTHGMp3E)7kUYKu`O47mpVdp;>Chf=~m~M!B3zfDXsfNj{n8AAvJ|Fp*Dm! z?}=0GTpCioY4YX(oHx**nO$jVEPWoi%oNu_^#i(#<i6FU9HP4ccLAXlKBu4t;Oxo( z*#OxT#q;g+`kU){!r5Fpga$nD{W{;dki)8<&Gzd~1i%4*v}}ysixRwF7szPH)LeeW z0k4X@^6#Swoem%?`X=5Di`uuxUxjdY6u|6^yWkhl>*^<*>P1q5`9d(Y;@tqD%w`uV zz$cpa)`PV?c85qwYM@o-xk#EKnoX7eF|9#qc61@rfv)|K)$8r!r%-&)#!hby7dN)$ z&tS>71pU*ions7fh}iAph~RC|Vy-->j_|L-`d2Bq3zvl2-9qpI0d}yi%x%~xh({vj ztT@Lo#%S=P1Z{qV3|}qWpkAcpHw{tqwI}lZU|>6KYwUj~s@5?Fq}5P+Of0%DESSN1 zg^`pnYy>|F8Qjj@h#p}Jn`!<z$c#WPsPw=-npTY%pu;^+M_Sr;U!`mY*WgIe$clFu z>`RTFX8<rbv$KD=^(=RrO7~F6tU6+CiS0eRQz-{AWu~Z#a^Z5GSo6;ojJqqH%lQ7f zVQ*Qr_hS7;dHY%Rvf^DOesUv?*cRB(j&`trpxtRc5AC*8$fZ^>f4lyG>`SD4d{AzY znhj!7AIE{pth8MZiAC#5qNddxvn^@UNhu_@-4o)zV+ejMlJ$d4s~C0~uuBu$s&Fke z{IO!F&2pgv&NNlItlAwj<>PjRi}f1XDHH~*4nX7RN6`h3_`Nc^Xp4`#>M@k2OzEzX z#u?eZqD%4`EDE`V8;JlZUFI3q{rR@qg=PH~&0FV>VKY1viDs88jn0Xa&^zbv*@j}? znsz=zcQ&S0vR%*I2)Y9e!}9o!m#Oz3^$AU!a1)rL8$X4C-V^gYAX^a6l?Q#b6SJl4 z{;y4YE&1=$*Ufb{-c%$x7g`Ui<mi+2TfdK~z*D`XX<HpwKc<D-z}u}Q<Q1X^6yrJ{ zZm=*?UInV!eak!NRwAH+s($Zv?thwYbkV3Y&be{d3W;%h4kBZoal=2`c*CgxpUfpk zc+e7*@cb8fQkWfb3(=B1)MvXtmib#;_8cdjX4YX;kx^ZuO3%<3FRoiZx1Nnyr&L`~ zBX!7JBf3*sviN5|lkq(@5tZLxM}2>&V08mDI0RMjJKy|}73zql&3~HM$Kjg|Ro6yc zQjo^FazO$qoCRhTcSy(m$u;2dDBozCU6XPj3R<AJcYQ6@z|-0uFdc!XqXi9%Z8@5c zs>rU{n5(@VhX4)Wx8(MP>G$d?)E7E*r*f-K1=|nV=euQF;SVmV^lz(r$IWb$c$58S z<yhR^0e613x`J6@6un?%6tQgTLV6$k;%L<l|7_`7jJLSKfkst}IlHl3kI?&Z8Q3ta zxxlgtNBsUG({ZJU^N^VHOIodI?zJUoQWRedKJRXCs#9O+NYsMmT({^H!={Uqc!O27 zug4`~>Im0bPMZol$zf8{2ocWvy&BAbzk+rG0OPt<D9#hnS^W&5CXgBIV&k|pgnmbL zdnv<)i^{ruCSv8~&IzZAbem$YU&iC$BUwp-bRE2e0c!5t)sVF@D+?Kh+&xx|RULgd zy&MSx?x+R)4W)ot`+xqM_W0NwoVY4C*b;6KaP4Yb;gHGdh5*ihMK=r$K1AePrxwR* zERf$fzMS#H>wv1_iI6sJqb!RXyj}P|0I79MiOIykbtMlNhe`0~W~BR#?ptv=mMplk zV20KGH;M)owiLc;9MRmcD^z_FGnN@|P9%iyS<>mY*V}lf(Qtts<*l0+@ez<8U%l*0 z%RWU$d5K<E+^NUYTIbJ1z$uTnz_QO1gWzdnwj0l+>o>+2P>g9{Wy6CcVjKGKOr;$B zPv>(xf<<46HZ~Z3c(Yz$<IPA?dL6lB#H8IOVA9Db$!%9LDuy*<!?H$zMei;~0-RQq zi6hkA<xDC{60~0&ST#${SzND^apwgy*lY8|&lV2NJjlp8krKv#&yc`=U<xf5vGD=h z-t}jv#^}XVD_{D^mxj<RvSzl>#bAbqIZtwkvX3eISZlt$2-pf~TF1|@O0F$UKZa{r z(V1`W)OsJ!ndk2EqZjVxqi>Arwyua<k#Jr+oh3<_p@W-{YfdJ2iqS4C-KGRgQZ%?m z*utb%zDWb1h)$y)m^8&y@Dilzo$0Y&D<ljD(h_|$7H{5wt7HBZngo7XV!w_rr9TZf z(`5CH-^sV+V!m8soE&Kk$ad>eQ1<LQX<GDOb(02MqS%p3|2cw$5KuhWQyJ=3<3hC< z8}F+{<QSQL8qtT-?`-wN#CFO6Qlhf^<8Xc{(Kp(FXt9=j%j$tyt<hfj_?J!oJ5UWc z@K1q{n#RENt=4@NiJgD)@k15c5}>)bVH60lKT?FYu2h}uE6t?%_0D&DZBN|(Jt>B5 zWY0NYhdPX3JTt;a4oY9n2YV$*VyEx#GEa*OKc}Wh5uhFp+yy68#JRR`eluugC!S>I zVCh_cbA-OUh%@vZpHxY@G}fsQ;^pDEWC|ELJFhM=t>`r(gf{<b<p|6MLg0f=VeW-H zN%WmP1CPQc9CSRi;kCp=t+Vqz+E4sayU3}$_ifvtlM`0>DcNS1e3@f8wez)}@SOF4 zs^*)+I2-up4ZcabRxxn2MBmNWWPZ5XQkV2sb!G7>4cZBYGR$~GQL`y?9H=5C(YGyp zr|&e&q|>C6ypPV7oUf|pv&|$2cj!oL3p8>gI9*5gLYI%nuPmz5gmu4d@$&~k`E`GK zIp{+$UWzSQyw+u5tHbi}86bsv4B@->LeV!op*Kn6p7v=XZp1CZX6@o1!nM->Yhu9_ z+1_U)MSeBH*luo!?Uq(KvpX78)TJ+8F<!m>PEzVP0R8^ss-G(y82AzUpxZs?NH&(U zSccbMD+TV#S4915qGn6@Qr`!(8_!xyzKNxFeiEQ1sN(pS=;whq>?HTL$XR9r`iD6` zT|N~Qf+=!88e~?;6R{P46%OBc2u@wv*I)GRiGzCsKCZW%=v*hPN;#H24N8a&B{KvE z!VA`}2=SYx4Q*8;{YC@kWxD~m{#P%4nlao5w=;`uRxGq>bw|cuEs`6WZ%sB$S)k5z zJMPphJ{*EZ!ahAypdpP+prke)VzB=kWwqlZ<+UwIYnub*&bfCca)L%WsJV~wik`{w zebrB&t+UxpED4o24>RR}$ru}dTl&_#l?K-B>;K<P&mU&wSC^e)7%BHur($2IHS77o z*|Xs*v)Gpxfe}%;v+m?4g8EpIqZLkBaG0zS*8~O9V1Y)lBuV>$O3la$*M~!lvpOOQ ztM&~sX#o}@loy+zZ^w{XyDXiv*H}IV7K&V)K|F#Qz(?BlW3N^INR>$L!McAp7^9mm zQ-pyAM=Qx4We}b4`|o3gtYTiS>q*06*eQwsEdq4GL62I&8XjS*UU<0pH;Uy1?J}A^ z-Jl_xR3S=vBNS{nCa~LrU2a+(c_8)HZCf2)xd!tY8ij~LLPw~95}fhoOPKstOZSTf zU_+sPv72y$gm|5Bws9E+eCr)XscJD6(sQ0Z>0D71kAHc33h1<N2<{w>Gmt}*pXl8f z`k6C$yhM<XpVCwK5&S~cieNp)e4b7-tVoc$`?eu%>sZ8>smD^F!&FE(=eKDW1n3}u z2r#9T@-42StPm>jvNa%klU!IpZmY13@oaJid#+3n1Nm^msgZi^=C}7%(Xl*C_I8FD zY3c?gU%GyYJ>AgAK&Eco-o0k3H^#08E}Lnq*d;DH+UTNJ$JW2g6M7B84w4X1_-Sob z90)cKZg#GJh|SA!qe@7|y_WOcjbXJdK^>g@5Tm5#W=c<hYQMMlcyFE0)5Gyq4BNok zJq2F+i~UkboAVQ(wrCp&1R7=JsjGXqtI|&PCjD<D1V`sc!a(PcBcphnjj*LUO3Qr+ zS4WT<0EqUfpdWw%b-|s$hx=UD?HIs9tpvLnV(CNc)v=8NDKL!9kD91%xZ~oRehv%h zI)7em1zlu_;hUW2zy=WQMN`#z{k+BdNW`RH;08Voj{5b+)Lu@d{RM#7y;T?#*tG`T zNrz*jdH`Mf4rlm-R^bKc62$z!Og4bk^wYl39Beb%Q9T<kKR=trPCUiLlOx3pb_aYj zykqR(8Uj!DpwU7%?ylU)la$RyV``i7Wm?;(@X#-x54=N1<kH&&w!|+Y?)2r!NYF59 zj+&?Di>b)TS0~4bT=LD)aZ)778Q%7wy?EZ!V{g^g_%Yzrn#(P^uQV+bMPgAAz9Hbg zR~oj%DCjhD8Af6v>J8y7p5}6Xv;BQqHqAY3;8Kh75L<$BGVe!AS)moLoZ#(^|Az`3 zW4n^s05-GA2n*&GNl^0rpvFf&>CI+&v!-bJ{ZwI9^h<%v-o-Q9rVen+-_y@JH&G4H z;mS#MJX1Q)E!0UZ!;(O1ceKlz@wG?<_uZA2DshGarV{&Tud)!!Y`w4IS~?L>$;23M zJY<zBh->7d4i`xPMbvg1O_V`B=wtZfNFX72{2l0M>hPFMjiDR5&@bj64HFvXslSum zVa8Bc%Jk-OwhjE)wwMPLn#~Cn^LD^5+d>=++Ow_<&qixy;BUTe=##1(1c$|eHqaAr zEx2qctRhTj?2DQjw53_w#?!I;i7}bqfqe~H5mf)@f{E(7eiPQ=v1<3LpLO47oGj<g zD~-wD<V5md^?Mf6Fbt10alu^YPO(Q!)l*mRJ5jiPb_F)U87aqm#xKXjuwm*5O{OTI zQc<p}ANnvxfhU+?56~DeyEX1vNn;JwAv&FNCBhG%JZ8MtqqpkQDz@J<`SpCs0B_5~ zYv07MjC@hP#WS|G%$@Lh=ga;OGJ|u8T_PLY@OMT_<*xAK(!q16i+84uynL*fcru7q z6};d&@mkiC%6U}1(pDv-nYa$@;v8}wqEOvC`re&m--DBEa$w~jngqGYbGP#)6?gPA z?yjAx);EDF4e{U;`jKRE4fL0*>e?Z+=)T=xNc4?Q*Fv#9swN^TvHg|yppoMJ&!ah~ z@{KEFl0Z^B{NJ{Op%^KZF84JYDAarmW>}^~A!{w!ic>l3Y450U@sfz9pKyoXNxQAl zT5A}fDn-{h=6F%MsB&Z{G;5tGv#;)yfS|ph^b~d&hZO7O!UXV*U*Lw>Kt<Ch*5Z^l z(pJz;2z=sR07ry|VATgpq7hW4I924f-kGiJ^B)*cyddo|H%(F)H}gJe6#+XT^{Wc) zj`)R{#nE-eAlFtnhP;^~dw!2^)@(_(IP&9+x;QN__Yr3TD18ncuF}4rq-Y^Of*HWP zW&XSCQSfhnzoU`9<3b4b`lt_B9vLJU7sWJb>l%NW5-Zk*hQS_oh>zktai*ptch$;Y zmE`VaFwOUiU8V0wJ$&fHd8vXbx4^kK|0(fULlq(_A6>V=-z<Dw7&H_^ffv$4HV9_* zvU8E6ks3B*`^%>B(66g$+aC41Vg1C<3M$~Vn;Jq#7>)d!X=t#2O!y*9H58L{V$7(S zRW}22uMenYtZ4$5ZK8C@1_S?rRtxqYt2GPuxa8V>xe&?>qUg}eP%i2Sw0IY@<8zA? z4@oS&;BEj!eMLOiyJ04xR@KYclKMvIgce(*0dN-*fzTyh0uK6+_X!(DY6#%ak%-IY zZGju5ZTu=dbv2xA{Zo$U=~dU5YxED+wh0A0;*wVkj6x~8Y*Uko@>`NVwrJ;TTt5Ri z*}}@w>q07shZ<lvD5^HN`ey@t@*K#fCzN^3+lQ)_=X;?i3y8ge0Zf#3ZePXxHJu!~ zqH2OUV=@HZ$8Y}q_7)&#!k_=@Q~nh+g9fGC^WlqIk!q;JCgHANLnjQK`F9NOsscoQ z|L+L8hIyEkn+5U_V5CuFfC-A`3WrWs6@A&!PGar!pDmBJb%$7b#9SYz@=Y>V-nlIa zoGqQQ)R%_%1wIHiLrey1nF&$_vDQTjOxKIJG|Aidn|_%ZsR>36b}O*`pazuuWcfbx z>uo92cs_2>JcH4p_ynj`su03(A`zS);n7KHtsT>g1x6j=TKU@fK;9d>(ktxjER<vN zAZEe8;j_NQX3!}^&Xa0seMdMYM64rfY)r*(jwgp9BJFXO4gAU@(iKo7;=)$K=piiU z?FpFLx!l`$V86JRoUI5<p<s*yMQ<|O1@{08gSz7u!;k2onl?VtO~J^)FekxW9O=Sk zp$Szcax&(E5mf8nj3$PJahcGE)3>6_^q)aSAXs7m*A=`}Wb77awIDfn=qnVr@{I`R z+}NCf6&>)(u}J6(L2SN^R78b-$OSbG>+Y6WEA0#3|A>K*>z=`M<IX=yhr-hAw!N4N z3!8d&l|WH>{xt?8i@+#aNKgg?>NVzXo!aVVf`8AXGi|>8yuMk`9}e+gvf1my7`T>w z+J|`XP`At>Fp?E3;X{!!j^(nhqU@N>S{e5aU3W*-$m{Aua9XsJO!2d_`L=KNxg8~% z)VF{G;;&Ox*qQ_<)xL1SU|Ox?w@?e^N-a6Xl(Rc(NF02VI6wy_v86TAs1<3iJZ}H4 zn^Tp8H6+*|`Se(O%|6pwljzdqkmcaA@^DKe&bxjHd7enX-@aDxB`;2mw))^RXQ>OL zR06Jbup%EmnY#$R245x%Dg}#VV$b09>&6M(a6>$d6ovfhm#V{P^KUk+M$Yo+ZiD&F z#fh57Ce>jhM@M~Olw3E$iTY~qa&Ty#__v4ktPMrSBaUr8Q%(BF%&-x%8p<_kwQoI3 z)Vy`@A+%Fhbrn;%6QPG4lMS_veV^_iWZ8EAI<sj60OBkE8AV#hGM6uKJE7O#1v3=9 z0tOIZ2IRL(<gmBTK7DC!Q5%_0REli*B^mC|%v(#erG<e)hETKdq{K?ZBG!n{j}ko+ zf3_bLLdj$-Kh3n(QRXsLuhW~WXi}4iz6y%kEJ%!VFBM-1AXLR^B7n^j^-YTKgC;@i z<mIcsy^jf2<OY<b<kqYZpzuOpWA16fIZaR}oHZ_P_XBL6vU5LrAzsauw=x}^gny+r zqb--3-IJitF>~MY9~L8j!Z|4X6*EBrU;f72G4S@@Xa5sAwkJ5dB~Vuv{#EF!Qr|G3 zsw)QEAD_%zp+r*Jq536Y1#gcL@~LGJ;Ik<j{HA~Ve3d0_XQSRNt*fZSDzQ_3*};`* zqE;Wb{pb{kWnlRs_AtOT(ts|(5lC&S(#eO3!4%>N0~!cTI5`-l+Pc4&?Bjs9{)|)t zGrR2JT2maujz7_Eu)kQQdCA;eYVKctZR^k2LMsSvn-g3CcUnD+%gf6|>M$qJnvZUr zl~Owf18m(M2C_ujyVt1jj_+*X7bJ{c`GMm(h?^Y!j)E~t%5|KKh2v+cFYgMX=3@ZD z)@s-3p2ALA(!#I&q<qOBNN@uslBWVLdBhXX1IppJn#Zq-KC?<dpWWkZ)0`h!`U|1F zi&zGJJNOYknNJ%E9GPH*iN$Gg?~I%G&p4R0F%Bm9y9W7@RK#pY;_}%a@kB~m<wI#$ zdM&>v>4PQwC$E2-*iT8%O>VQIom}-J+1Z05u5;@L8}3GNm4BVdn#2ib?<P#G*_p<e ziXQw(Kv6z9)2#xORP$unrCQ%3Rw&~aw*I=Zmlqd?yckFyRnOS6G6C>r17VDEnff4G zv-L0|WDimEG!LhSq`(i0FOS5WXl;fdk&Q0}aar#_mbi`~84}akzV)e;z)&_5^mml^ z{2U0q9LjqLwknk87ESx}l_1Jbu{_-~enfR3D!Qyl`yWk4JTgl;d^vIy!9%U=Jl;za z`CL@XroYsg%Def)h<Eac`w;6#5%YE$s{`7tpu-P+7u9mB#%IO^muh1>*};w>or|a; zTEn%(|5pSRaUiT4by9R)*S;k6CrSFIxZ!Me<cL+J1%qLK^G<dMX@V^?ScBH`B6-bM zS3m0IGgMNBX%*imt#OVFbGteJknPXvNm$-_yGZXk;c<aTl3PVuv!QNzomk5>pkvt~ z)S+rnqTC^K*6L6An_g)da>t49#J_?L!rkMXNj^2<69*%07k2(AV&jEj#SO5I-jer> zjL@plgg&}9JL+V=bIDj|xQs>()R@sOg=WHD^^pcqeMS0tc1Co1Z>R@7GGNG6#fgrQ z91!Md<|M&{k&QSd-}F=zb%FS}sd4-BkJ78BZ81?k!6mU`Et3OvrV_m<k7r2(YRIS& zHbdAy=EZ+aBVFtvZ?fM^J!d9ije@M0NTnKTL8CCAYdyCpgff&9>hhm{%2&u1J1UxT zGULw{r6vOipyoz9)%GJV21&BzC&)Ic3w&q7)GbM4#TCdXl@H;4Z>@Mq==d|g0GDs$ z-?k2G51PsH$>1c%TB(3+(ToUMQdrm4jxTMi&ifbjb>|{K75A^z;H2CkXxuUS&Q-a6 zBk9bjmyERwYN$ASWg=4H_!mES6yzyoiBQE0XF~AIc;E#d>Yn*y0Saq8z$a;{!rLfh zkOY2LrKw{;5bb2pse+)uZ=4NxExMtt(7ta!)&0rG{wcyUy%eYXxiKZTHa{!d0WR-m z3JW)0#pk1eXMH7q9w0u~pZOHmM8ZHXp#L)fF%4t5Ve-cJLdC&w&Pg!ZDHai#`Pble zMzqO$VoVBDbyoU$@1pzf-p?ciF3M6gBW7{{)nMo}6m9d_=j;y7$bI5;M1;Y97F-W9 zA-wr4*}v*<&dl3}IN0BG)H^y!hT*n*p_J=C`xzpQ#u6hyh5NcV)Ysx;Zmc!Bk}h*x z|1`Tx?Dq{NFUYw0sjzDPbj9)&@}5@eC#;&vEKy(7d8p4sxPLK_G>jh+DFNLkN}r{? z_dQ9?V#<`g!T9l&;k6)3t9t0t&q5+#PAzQhssL`dK-Vq<Uk~}tulB7%*PK>|k^7Zs zLyE!60d&XWEo4+Gdn>pxS*P6{Bm`idK32SIs{vDkX)=l*UW7}lHm(mtJ`w|9(*0}^ zV}fYixZSZaLFknPqM;z1gYvY_-*4fwz`9_`1-2^XyGFxk);!(%q|F~cx_2;OsYiIw z;KUL5NE1}jn$wRvUDzen1W_1Db5O~w2m3z2Ty*Cf*NLl~h$zG8jzPv7)tgouW?vZw zyN7`@CasKAs4EPfv&L&P%bPCRC~1t~qz)R2&ee398VR^g9SHE4{gCY;RRp8|iOwYN zss4%o$v}?fF(<2LcG2X|qo-QWD3>pDjJ5(#&}?TN3y`@WbV#1ZmV)`C@C8r=wBY25 z@@?ELFrUtVwAAlcm>){gn_s-xRE>H!!(`}-(wJjF@MTL;*}E<|E*%c(2XdeU#}a8A z^hlUMCSdN54RE(VL7Ah>wspa=?<!^r2ecPBFFuwCJq*Gyrc5;rDn!Ddj6u547vJcZ zP^<5N#=c!|XRPNWV@bJK#T+<id$m1^B`f;XU&@<Z!#easz_9~HjIcjgmp?=>4U^0Z z6{t=sa7W%T=$z@__Shxm{xj3;Gi9~E{v)Q-=|htif?^?%>+I%<PtcO=Lg4X9P^pr& zVnLObycfWjce~cX?1|C(^1qMl=T#-DY_QE%9F9HRB6NF!8~*xD*q}dTE6L;fCu!^R zCTcA4+5B$z#3Lp;OP9l7P{xoNbG`S1&Ry6|Y2qoZ5YEJP1VI%+u{^TadGu4-wOF`` zIWo{ja44{O$t<Xd1Yjazx7j*=<v1|OWi3yiL(*|8Us58Qru9p$D_cH3m30M;ED)E) z0>MWw-|`7U@01X2M9CUubvgG;fHi7{epYk0*7>x*R%FMVnq=KkQ=8tpxQ~|uJrR&y zLto1pZR7oHToVx22(ex;_u()sV4Xp9<MPmI!SLZxXa);{RILjyfPZh;rGH3f;9~r% z!daRQ9+>-{3cA<R*1Fh6F3<%1SU+`Dd}^`nHBN+lnVp@CwkkQ?L)A@>uFpLwfPunN zyV|X?r<|(BmHd5rx%M4WmK0yhx?J^@#(u`o!YU+b!QaUn5^#|rJ{^-~_0%F${lk}O zsN*uHI;;BZXlg5$uLtbdYC9FnBj(!hRk!GI)3&-<+VU!`=hq7c?YUIHre$K!?>7up zXd!x1s0v+SU_)Jiei3eh&~1(BV9G_4Z6XT@0oBh&Rp?u^7I>3;_DbUOekXZX-2Ut# z!R8|n1?(ifiYJ=R#Z_C`-s@Gjm;d5b-_Wq-=ci_yfqQ`Y1LpU~5cM+`@Gzc#C+Mnw zX#B2r&zH%GI?R&aI=f8hqfCX(v~~Y%hW_AKU<!D&<pa)&WV`DcRvju(S#79abqUa& zaxB$vS_SSLY>-5Lslv0Fr70Arwnr^zx3ef6+2BS^W_?*-B@bY5g9JS!<c}&nzPh{@ z$~~Jxq0+(XHOY2#+ZZhAk#mE`6U-Brxz6}=_}81VNw`X>`>$@G<m!H3+nqPrClcuO zjug?1<4wlI<7!My_s->4tmP54k@9<W7{#=<G!>@kZ@=0(b&?VkFGs1)w0r0+9sb%4 zz4Mup|57H5l#voHc&9!Q=C9pH^&Em0lzF%73uJ>i#P_r|bZfbbhRyF&{H<k6(Y)Vv zW|IuGvtU2B3)~4=)zv}H`mQ=PX(CPI-&$L$=cm3A#;62L7RMR+XlM+uzx)^Mc4g8Y zcUn|B7gB-qlwDna-!LfWs+iWh2n>Mk72P{2q@npiY)b}Uzz7&3q`W%7>eL1z90L31 ztVGoIIZyazAwafdvHXQWv;}S#)fy*D__wb!M(fz`6iwou8bxxu?h{>8q}$HvcjB+2 z(z1G}o6uFNp6*{&`A}|atSTzZA9KkFYS2C_BhvYy>%PS&+6g^XRNPv-95k*=a<r2j zW;1!5@Q0mjo$&FEUC3yy{V+uMNN;;*!pV*sjok_JcR|<!@yju%v))mx-Fkeh)kC-A z*L+IQz+Qb5u;;`-NQujyp~TQmmb;~bw`upI(-R0cVQO=uPF4eCd*j>KgJ7nM6MLtL znDL;xCChBTUU&>=|N3}U+KQhHl0i*F@oEh2B3PIJl*<2rOz~4`nuT$yakcy|h|N2G z$p&}C+|pJ(Xv9BTZZsC8a7BHYzQ|2}r&AqcOIOtN4*){z@!p=1kXK@1-1&Iz(OEl9 z4)WkD4euMT<-sJhlV&jT#nSiJvwOKCA?SR=52u2JJ>n%)4@th+<LenZd>*HDC9{Wp zK}U9J%Y>7Ax11CQItJ+Z!90@~R!Phh@R+X8VBuo4VgbJnxcL`V-znh=dB}O<#cp^( zhNzO%1nFEK0CIYLTJ$ay(C}HD1<m)041j~}UipF-Rg*~ach#A-Z9VAZ?aOK!zWd+x z=g0Y#SySD5A5jUw<Ub<t;LE5ue>}Fc9hh)8*B(AGqm;9y<)JPMJXAm|mb$QfFckq~ z8U{wL$IJ94CFU9iC1D<odpkHI1Txg_2~{V2zWL*)H{;U_#80b1(<!JXs#1#zpe~Ga zP$FY5Cv_?P!jwNnaKH2m;sKUIQ<D1Y)UBdgxlId6SaD!nTYCcFTg2a=orLoji{l2# z6gj62@^Ja}pZ?}K=Gz~Yaz}Det7DU|PqzpuO_xAEt>b}znDwPsyvKF_>sA`UfqA0D zNCfTk9%jxvz#1D%>ZLa+(%Z|h(A4FkRDy!y3hlS&GR$<%cbvNv&N6}jxXDbHwMJ8C ze*2UDA8zw$XTS2;A*&;f^9eq$)^%p8=)A{-y*MShQ8<D;r;`7fY`YBG4{`8;uUqKa zw-Y)7_8$eQAhnsInwXAGn<Pd%%m6p;X|BWld&6EiY*~r;SjTUu+bb4vu6SrWcRV>R z%a-lFy?rimemRfO7<<7)S~sYnWO<F~AFd73Q$S~EbK0f|eB%&FnVQ)G1=#aO@&P<9 zd$sElF_Z~_n!y=fT!HIn9mlNFAE^2Hoj#Bap%}M^7o5F-xH>I5A<@hJL*RWn`)~HW zTA}?X{HrBBT>R3H-Wanf_wJ>w0<Wa5p9kgfJf^_QPsl<pNsB-Y24aWT-<k@}PBwz) zClvKms^5F>aK21ZVyp&Jy`2UgXK_z3!>m7gouo@C35mah#M589;ai+LSBtEx_C2)d zQ~2|TCHthC|Mxu0!prxC#KVMI46t>Tmb)`1peb<W>GoNIKpOBGpFbdBOmwG-`_S|J zX^txEF=_5@U2)PohBw5YpDjdpjx4Dns?H@0+l5zTnSQ|yc0SB9HDVsKu$JcS2i8Vp zvl*>-{I=s-La`gm#G3_7@~4WGM!!7|k6-zUKJIy}K63`LQg*gSP*P^xHfK9y1p{)u z;xX-MMM_B$`aztbjrW#haWB99qS0)Jv%b8ftd$Dva<%l6cLgS%kqz)r1N_`}|M5j0 z>d&Wvgm^(7>TSI>sR(gOMv9Qt(e<<E2JxNka(QC#S|5uOVBc6M%)zysBdhgW&vY=J zAO&Yv4jHKeCL)tC<82(MF}nYD@Tu5S#nzRKHqH<yJAtu3g*FT<RDh>h2c*nwV`>9s z^}1T83@;i?1i&|NqqHOY)dlk0zuZVZ?rvNNz<TV@wrzY#r3zlCPS^2h7mrE3(z>)J z-uQcfVWDM5zjbfW!+lB!`qOg=yW>w+Fy7@-^6c-#o>r3*nZ>)>`umt5=JhU`Qj40j zaiDYbxX6Q<a%?{_7uVdmNRxvl<1#Q(5u{Li{I3?(zF39kTS)$yGTzu4O#lyGWT&Mv z&d8tiLcO*i{`p^V@YUT*%h@NLX9j3)YBEqID!81fM)b;CwGv0Ta6o&Jbi4=F)y&67 zwln)3xR*~ap%RG>II<WRDIfXIK7r9?oKc@okabZ1`(C5h8GcVoNY&0kCNS9nX`Zm- z*ct<au;Eu9xOc7T>U#_GO?od)xBMEG=Ku7RsI;;B1_nep5IDrJYp2lwCQ52D{rz0_ zuEuh`9dg+j^5vBGjUhSy`e*RD(d=%jQcS`RO)=LgA0^Sq=C+Mo)4xhp^<tECB#559 z`85B`FiuJ()DV?X)Zni_{rZ;pOMrC4rG8lKdHNUxvrs(gX_D?5@Vy%I;PO8-v%c~l z4`(6KmOb&B;@Ki8nPmf1W7{?Ajl|U;SGZQwd7JLti*BOo$5gDi>~h%TCzcIf+X@<Y znm78}7}67+Wb`N6uCvQ|Pjpk)4h9$@%S6(%+ZXj`s*k$#!5f6{jCQGLZ0;5h&sNiQ zbj`NxSbceB^-pN+2leFLpU&pf?TM_*7J-|^+hNm3Gq^IDE|&ni014wFlj%?xccsbO z<b`gZi6^Drhot}fnG;jB{9Gu22Nf_-W({L?F1!xIz|IR|3Tm9k5(Cunq(jGnrWaXY zTa<jvgSLmfx<Xx@GBHf^tI1s~XNpe2u1MP)T-c51ghfrz546WPXdTGimW?s_^x(+? zbq@0iJu7e+)FQXZNs#*vugP=;e~i?}8^kvg!Hbf2&5ambA{!Y16{mOI$``TWsr!2* zBh@Q$_dZE+YN8o|7Rg6$w0e8;(v;qlDt>=+Pi63Gv?Ghia_7-3#9RTB`_Q;Yhu#(3 zL*JQznwHwAgk(JNXm5>0xMTcid9vI9%*t6#V+9=(em6)ITViayTv(U0PA`I>BX^(s zql{`m6=ym~+I4^1o-_1m_*v2F69#W2dA<3mjzDJS<-B9o?FOw2nk&c3#W=JBVZ0>x zG@YRGMtDYx*_NX^y#>#b-MW0bqz=rm&ARsPpN*4LXKm-3xy6;F0^IuF5?xDMd(TPY z{G@K?4l%i9pbPe6j3M<|3PaW1JH|;N%y4@!mAv%Ii$KyArozAYm46-|nc_j|JlZ%< zx0rP8$rsqL(>E-0<Kv_L7p<R>VOq$jSAX5-qKf`RB?XZ?b(uB`vt!NTCJkmjxMDJ% z4w+EO$LXinkgiL2siYdUcp8CyNDE>i7Vw4-tXcu^D(IlD_1ve(2wLjm0xxHz=$yB% z6Km*ux&UmbVnBx71@kxqbU?Qc^7}J0a?^xt;z`Nj(-h3YJdOSWuwk_c!?h&S6U}Z` z4&HxI8=D;Utj7@^*ny?MGnYpVw&JdD&weegv}n1~Q+)Fm_%HGIE2i)z@H&I0Oh<u$ zLMgC64!<Kg>WHefmXxXuN|Q0x(6E`eyst#Ltln&_?IEbi3cL>GL5dDh!=}G#SyzrR z`djk#q$01VI5C?NTXUZW3Z|B3hu_nCYLbo2V&crGZfVm2R(HYr&p+04SZOHi*6cIX z^BPvSXv##1xZV4xB5F`^O348yrXCpP)|G3i_`-w@y;p36Wf}-FiZ3gm*ts7F2VT~_ zpQ07%=42PRp@AVE<bHh{=s}r8&UPDHHK!FdLSPrqDkgdvYWDRwttaIkzt61f`|sIi zzkHG^jXg!}TbQr6qTb!E$&P+*vUJ!cEYasCUQ2L(FrgRbN$)B}Rz3A|7TaYMg3^_p zOn+0Of{d{GP{7Z?;b$+9IrT(LBDpslHoMBNlvtE~AOnp%8-KfQ-|i<p^^xk+h`?4_ zBOy{A!-0JO492y;|C#>Yc$M9fTp`+ynNVb4Qz@3AcYOfrY47E8!(dL8h$G?7ZUDy> z7E`suwx2EdGn;Yg>Mn<5_ooe#KvM}t(0*~TcPP2>861sxT2OlhX;|h)-<LYq5L$J6 zE+!*cHA}9(Nd3SIB&&#ame%HyN#}|uV^yg40cn%cb~|6S9~CW!^azN(fsD_~fB|Xu zdhdtmw6@Kh`Io!rs@T!gYFsf+!^86^+qm6GAS`XDK@A%Aa{jH+AgblKL=#ET<zpb| zcKVSiFEEJj+N|SoK5*-<wF_v#6Yn-z^$N?lQk(WR#0oB3MlKXK`%Th2^7GJwS&-49 z!PUBJCL&_{I_q_o3JI}1AVOix^*z60f0Yr;(3?wlRL9zh6BMoxlE}%w5q)s=6)K<{ zIY;^%UQ(O269>C>)+=O(+uZ+;EchOwngrb;yi*=E&&xwSRnYMCQ^$YLwMomK&l;Ej zU?~1t4F2<pLhcN397G$J_)cwtN2>+~!<hi|vMZlWBunu17+O^UBhEbWO8k-cZ>_bN z0_;CN)8q0P+VFX(jNpuM9lvkZ7%m#P!P_&vlJ;UFK?%#cJeBvP-tX~)n{0amy}^q# zzDGk>JMb)7QK{c~UWuwyPI)~opquP0ORkdALEtH1azoo5-Y<=)T{~Nk{<f5i+>~~F z6l2YYrv*u8faf8{f2VP_%pZ3Re{i|eN$|c*2-snbwoN;mc?h-6TiKoxX|D_!Zdy}W zd>(xWXcOttlE~l_+mxx(bwx1gv-+>CTY19&9{R!2@rk2S%BKJ8rUh5`2|)MqZ(ELS z!~wfw*rt!G65PI3O6<w(w{>b`2{(qdD)ygk@Xsl=Yr>P|v(ju%Rez7De0qgOL7qr* zPr=j2ttN#*0-35Hd+&Ud0_2F0O?dn~<#>z-&jR4shEBI(?X`YYDj{M3WJ&{}_;YhP zmKb)eeVKml;9bnZ?Oi*3rEB10{9Iwh>o>{@)#)eiZB!5uv28<!OhKiYePv7_ya#gY zfX(*!bfh!+mhVzrQ<T+*@CPOnqw<7nwHVvA{uiT>s?XmN^`z6LfqQN@J?#gZ)-tWR zSiUh12UNyv<>1lGazgM}fC@B^t5+*c(Vt4F%aM2I-%>Sd%Mc)6o4PF%Eob|f+ad-i z<?#WkD_kfr%PBAKbudOeN@&j#CqTK~jUNwxV9p3$(*^&&zgSDi8piG<a*<;_3dA2c z7Yo~h)Q(zNJ%vi|zy|nRqaq_HAhg5R{gG)oDu@LR9_mz(m->&_dKtoBBLvdVZl+u= z^*mJAz_FZVzN|h}0SXi^wfaY4%P&hm#cMI!TZ-c!^IibA2nfO;+~&jj2==$JKQjmT zPhD3;mz7e<D6M-!{IKODQ^=5mLP^}#uY1PhqFSVZcpcSu9871q9aIl-YI*RcEs#!N z{;Pxk>>iV5V8OEKm7J<@ro7jcL@rxeRQybmTF8@S6f1e8k-Mv{*ArGF4Uglzf&nm1 zqkbzYYRBGv?y#t=uDYJ!V*HsQUlp2p+rDGkxxDYGaM|8gGS0oeo4i73nxI~dcG5w< z=v`DrYE~Px0QhXvy8RPv<}}rLElYp$*aE4;dP2hesN)obW|&-8((uX_d%U<2c0lx= zWRjH3I^FH~vs<K0PX`iEHXVzv<5jL($v_iIw&&enef>|2g}fF_0^rIK)LFeqqZZ-y z#w`V3^Xj0$eJ*;ACYr;z#|H@~_ETUq0UGrR6(LLideNC;R9?cFlrdVL7Tu2Fj|wKk zuaccP%r}3@8?$9-8zCLq69?z*kLeYx8CWSVNA?N#TEJw#c<)5NfRxK;B)MuR;3s^g zkGt3`a+B5M(m(%HvQ;ra-O?FToA5CQ<dL$;_<f6}M&e<QBw2b+j}J9~TVRBS?8%so z)f=iMG~WbEZ?>wR3%>5K>9do|PL%*~g^oVsf*<O=sdcV%IF`^uYWqD|+(E_qzufjR zg5JD&WA9bwM${c78D1!j<kR|B#kbt~P;lX;LhNByGab2{;r(toVmJ00s+SuC#2ZqH znoblGdigT4#@Lo$kG_39iRS~^PG?`oM3x02a|{W2mdFm`Wz;1vXwNw$p5KtLY8fwT z8m9H#Dqi6Ls@mk)KdH#U&z~fRuie`FZ=Yt8xa&)Ent@(Krrw(pI8%_h$t{15uWGpl zlByD-T{oo=cymTg3Ees^QipqS@1h&eid@btd#ZI+VIUZftL0H;*5h0pII93A0F7Y{ zz!T)I<JN&SPL^~8$)&`Zy`Jg?JGsosS9ky8`6H|=pGMK<SBU)g_f=p~b3rP{iwYBb z;Sk`LnLI8x{o-SOkl;v_%`39bN#$|HU0y_U^qtD5m-Fi6V`h*1pdd~r-+L|b`07bV zCE2(yVS1%6aLMgYGN`$LuTf>CsBtl9uQ}Z^Q>==Ca(fh_oaQ(s+1|Q-Y;}{Ad+9M9 z*w;wXY<fxUIu7@ILVS3))c&8;aZ}2u37A#T-N;S%j=0}q;S^Mm*_hed?m5}?5Vt7@ z0ej5pS*pkCSNlt^;(CQ>*v`8tFeO6*nGfC$$f*opC~P!w%HXIDFsRvZRVw@<b0)O- zZ&mg4Wp5Nm<g@3!OO0}`1piH)>>}K%$<$zy25%H06CT`}sRD|0Tm&YgRY{|9j`&v+ z0rV(p#ymjul#0pj*s3<zp|od!-pxbH)iRrcud5mX{eoyZ`>nfn_z?*AvU<~>@u^_D z#~F2rfE57Ang~XlqJ3n9h*D`Q*vwcjV1WQ(sRiO`ib3@F*x3Rjc(&qi7xa2=w(0H{ zK-=`+L+d->Ikyg41t>_vZ|6b*-6Tc!k|$mT@imU>>eu^^NmcVl2=F6#=(}PC&umGC zJ6R;Zf4PRF7*XS;)_!=J(|N8i<hB#lM!RO`Y5L~9uAaa;*98GD4MX`@94h~2e=Xw< zI~;72U#oJ=4lc3*DNw*g1CKsQw1Y=n8^|tdE&<-HfRNyaZ?prtH5ys*Ot_aa-ph*a z#+*De+jrVcy>94V0HH$Q8BCVf92IWsa{NB7g|-&G^6vDJS3|alg>Dv}j(6wgYyS({ zUvS<_G(v^Ja_XzGi?^1`JP%2MkXGHOuS>$mSBv?I@iQCe3{tPAAl96m_R#U*ujPqF zUL>`Fb5WC3`Y#)yh(TN$y1;r?QpvGgQfYLRmh8-HTx~Uk`Fdf96m|GExqG}vmP>+u zyaR%4E#;i}FnC~f>yFRI0gzBuK>t=|_VT%3)_#>!n(=-Gb^Fg2KFRmY!0d)g8!1Tp z!_xxoN)^qs6qc^=C1$a{CBY`Q&*-L8ZDQ|#CYH+342YVJn4Eo*>Oj2*HZreY2l|Ee zx9v)H9&+>C?z!4NJUMremDykSOPG<g$uK7M``qvE$123<10~7fSRN4Fd&X0<xoVSf zOv^*K3(N^GaC>@ACx)VK3cUD0o6)9J(6@(+$NN{2Hkl-hB3gAi2-Z-(`}OYh=XD(f zfR#=SXZ5kiBU%o+|Fv4m9arVftZevdw~hxh<d}I^NF}D<nHl&l8#cnm2221X)e9<} zA7X-_+%Q#0r_7fB0UiK-*znql8j~WGb>R@hPkkI1hd<-P<9>GSWy45e@d#SRXjScf zRe#`1X_pzSQ@ClG^5-xq7|LShYq!qzH<;dTqWJhSY8Cl<W2btTK$PXazr(A6vQn0+ zfs`(>bUa~UPM&>|WP_FS3Ow(~E{3v&PW@0|zsN%i7#$e^F9UEmt5D6-?C-qX<c4q+ z-8f!;eQq-j?R=BXqorI|$^kR{YnAzpBfFBODP_w*$gC&=&+zT$aU?x2{*m3<>_Et8 z_tS294W_Wo8}65~9TU;p{8;9WGVfJ|O3HHEb1p4r{ueD^Mq7aIHLo9df8LJ1w@#t! z0?9lPAaW8iS)PmA&?$W_DUnli7Lt>ENXRK5#n2i-?^n|`8O{i>Yo`bG){w5DTlM^4 z3XxVN;bkXNt{1`<{HOJeQQT3X7a#WisRxlSPI-ubR4JR0uXeOY3YfBU!-IG-yF$K{ zZ-P*tWqfSj$fTu{RR05R;HON90>~RQaCBg%Y%C%IOyOvQh^WPfF1A5w{feC8<0)~) zQev`C#Tr@Y|5CDWbB(Q)vDpVZSO@tr?sZ<5^!74#+6Lpa*QNJgzxq23J36&);#4dw zaNdTob3eC<>?bOJ6JDok<*F;mzew8VleoxV7`*!z<o<ni4ZfKLSRcbs=Q46u&HHBP zF=Bu(oKbCFJysP$s-nRS#g{r45ssT+jCS-_jzzkj%v?N57?6+bSG0uyGmZv7u>2h) z@FB_HHjMVMk<<v`Mn|p3Jp|u}DTP*VPV2Hx$oW>6m7kB|@cd@?V3-NwFamMWo)%!d zt#Qb0`1LzT8Na$eTfXA8tfxwElON`IpRr#@gBUaEWYU@|Z__vDVBrX;wJiM|g#$!Z zz~2i1%SlgkJfYPjC4xX^tDnn#>c}W9DJ6$TvLY*%qe6-rP!bFW?&5G~I@lhRsl5tG zT6o&gTiYcsb6%ECF%>dgIqS_CfNvbP=Q!*um1G1^3Q&K^$ec*oyi5Y?^u2oHCEI!< z1o4N5JE>`2<<xz8Zbxl30P+a7jr;|P?73<WVS|W}-sdN`zoI4TFv~%bWrB8dxK>7= zWrHnjo7$kuPa09xff6pUsuW>!4NK&VcVajv?pq#&;~rXFn(KG7b`HEa9>{oUCnl7W zav!}oQ8nUj&ak-0JbZJ+@J&|47-seMMJma&BG|n4tBkVCfQ4A>m;oN51L;1c6FdXn ztIp!A4$2MY%3i;gkNp#{1adi`K_MSz_!lmR+l_#USD-=8ZP2_{@@4u!!}22gHKi>r zh+uyh=*o!|7qXN~^7f&1m1|h$^8a93_wu1rYjstf9yAOy5t|3$VJfv?v4J)FOcLHx z5;`1$EOy3lTc2@nais5VZ)M9Ow=v=u&B8=}D3lHa-bwdRA|(6Yf*-jdd%D#Hfssd1 z`9{F+2gt9>wO_Leup!X~pYA{zQ79d5N|9RCb9;lq_<c<f2ct{h3|D-yN`%NIz&xWL zjJ*75pFLx8;Q;8L5Qp0wG71Lxqzm|-gb)=ZNy5SJ^qIG+w<y3q-8_K(Xgt;eXAm5O z5-6KqP@=72L4!C(YxzwINsxkODHu|0C~Q^fysVOkQgH(&=&`rF$~X2Rc;ZiqgI~R_ zdK$f}j%Wl=g;A3`++Q(R!7Do=R_*pxIgpkL667eF^g;{=yDhV`l>e=?{macJ>d6k@ zxm5c}Hv@WZ1KGEb!h$vV8^~6$7on+L5#>{+`YX{gLs?{Umbb!S4sEQ<pmu-LX=Y~! zdFZT8G^WqLv#5-VOnh-xhlXuSgL#EEWXG*0Ugu%?W156SV2@I%d7LnM5tRh-wXsTy zs67c?uPx1Ff+BW>)$S5*dvD3e{P}I`drFi2<!F$n_Uk~dfb0WE)QQqJuE$&U<{NDb zp)d`@NHiYn?doj3B>U&|_GC(gM<RlD;kI9AX|?YK%bN_`<XLAe_Ot$vYgbQ%`7Urf z46n<06W@&%RMffsUI(etiLU!fMUmF6Nidy+8!@kR-pMCjHgY@JqO!Y6befCfdfCym z{)J2kN<r$Oe))*bd*_D4&6q(p(xclym-Njd1G6Aa+My+ggtuoE<iJYq=<f3!%!WKB zbfMpANQ>aqxXj=obfv_P{U(PG2vSRlnW5{L*-?R@3GW;%xEhbGx+2KR)K%(Ovb5|W zR1gIjlkbWoigoRWUN>jM&NBZp!vsiHtikjb-~cTL<WAeA-yYA?ceh<IDwRjuH-f7o z0|bvhmzUA2A>qpaId%kb5bL;x&{mgjH?rML?FsRDc5$mF!~g~vZz2D<j_RsX6v3+? z8zy{=l;7h%ZQh!eQ|T9&E5>=k7l?L$qud73C%&^(S2Hr?55m)X0|ltViE>%Q-n-Y2 zQGAOUAASW0E_^OY4~<lb0I-FcF{+T|Q<;@6HrkT1^wYLB_kTT`&7T%obEO>x#De1Y z@P;}6_j@M48}DryMv}BNQ{^xMi0k5duGyi!5S<{Q&W#Y{*T#|uMkvsRI05g<j|kt= zw=+IF{*uf0(v4!3b^h(iZ`rsmqAoRc3JZ=pPI&@vQYC!}hK3I$|6i-~A8^%00wXQ2 zDZFEop}Z}IL%6FGBoKuNQnzYwT5eU`fP4*R$fJ=Pbb4bz?fL+?8}2uFUO;J-?q~dH ze6~F0BkbA(UN^e<=e0A4o+NEzyn3|9K4$(v&BcohB$u#NQ3EF^AVGHLY{7hJ!29MA z9!>I&9fLP%$2NSJ>Pt-vZwJs3W+t-Vcj)=}I7X|0xqt42(`eWze1aZiNWUZZ>E3p> z%QJ3wU+E11_SSHWd~A5mCFWbu(6-@u*Ub<e?h*OD;DX8ry$yzLy*r<em1a;5{c@Je zl1;CfYhb@pDERo^r>`5JKo%RN>v$;#OBYL@jV<Ova>Bjay;s|9-Tujm^};9<f<Dr` z*<tSZ3Svvol=0VY-|>`}n>o&asR$(aUn?`G`8{~pV&ibqaQ5rP;hEy{c=rFWbe3UF zzi%7oCrXzJN{5PcOP8Rc3_(HZ5=X-bDXF1S3ImjsmY66hog<~YMsLz3j2<vx&+Y$s zUciCAfWf}^bzgB_pL1~fERPFZ(}B!A*AWZ`C||(-a!hbDY`z*kTrxaFRD$mEF(Wgp zSWcQ)T2PQwpLbR?IZGP;G&!9WdIkR~#G9)9G({!J@&SLFEpDoUu2r#IG-)SJ9Uedh z&p}UI)A+ZG8^(Caa3CG?f>IIUV5~8m$%n#a$6qT>Y9#zg_aUn4GVoZCRNPQk4Eprs z)%IFCh{uPHHqV&I7p}S87^2yGQ{aIbcJ1P9($qMysJIbX-~V^aB=~uU6clNRM105Z zU5uDKc&NLNANqz^r9jdHUUdv;!@4rwwY&IkAQDu3&*P8Stmi2)K|Mebd2q+3uYPyc zzw<y{R)PQ1u)updm&x|!SQx-Pe*|-eU$s><=)aGi3d|XLvkq<O!(pK}#{c3AUz!Dm zNrnNcA&Dt*Yhv?<eh(lZ#Y=!8b!9~7n9^UgBYCTQjO+vaeIeSPclwz+gD#oy)gd-A zq@_MhU&W@v0QUYuor>q0vKW~OIf`xo>%MnWxVI4|%|0!xJs=nUv9)p5lH7RnbJ52I zXK^GWSdw8reh!f?Pyuci?#7dCe9uss?%wJlgn|yhGx^^Z)$kRLqUJ6UwnImj<wNPQ zf&`~&)yfak{>8u0eRr|&s7aF`S^7nzs;IqbDs?R2b#XiYo49~pX!GvKuAK(e69F}W zNG|%z+%$Zg0hE#_w^%EuGe|$p_+<tatOqvArg;dP%T*8M2P9g@kGRea4r&QB!`P+* ztPKDAaqL!mpZPNXQ=P>nEzTIye1d9o;tx6IsSR_^V$VI)69FI#rfB1K;q&SD*v=95 z+h=7ddBOOuMm<x{eTJuqu>wuO>IIB%VmxKS50@W-9~9YhN)^KJFUwC{B(d*bmE*T@ zzaq>4B%~55QZe>1`!q!WJW_+VDS@W~WLk%HW_8{uYEXd3sNnH))|wzmLKhn@B>-y* zKJDG_IC&I4Y-o(AdH?dq=~ezYu))er_q{WD{Z~AiK3C+FOQ0o=Gq1^2cTb;n`rxT7 zg6B0@3K*96Vt7*v_QUTMNeg$f^e$0bVtWkcqU8Qi^>LuCyC?*I)8+UWddq?Atytr+ zu;Vgq&Ci2kJ_ksIDzE$V+ocpdU{DUM42V0Ef%FXubOy5*UJ=hEsVi<!-=b0+DGB(> zkGxL-v(2tI%?#!U(xC#nsAq1SaN|4(Rkh!@YDlw?z_;8qt<^o(m8yMZwVVqg2!5GD z+5-W+2W&yj%!Kz(8+W`Q-HN8E^hKervc%{a|12#Y@&yGenxapj{GqPfdk+#UI4X>K zQ27cArBPzkFXQjts>#3gAR+yKGi#JJ-uWSEI^BnVB+e65YHVC9cfe%Gai=jkimpOt zs`z{y_!p!zvWrETWz~2Y{Rm_=5du3{jlE@CNuM|*KR!+{a5S7av-RD2c1^uWj>0CY z9x&jK%4&Ud`Z&+>vV!)t(LnUjv*gzKK&<6=pHlWv!-UIY2<42sgo<+b?z%is{9Pq` zvbx8wJ-E<ZdR^7VA2ZX+EslCv|KQgAW{Qqg-zA>Qn~{bf(Q_yHZY-@8(vm@cdJUpm z62It0%JV7>YO^aDuSao-%c&QjO&vhw4xzY8_TQx@x?cB%2Tn7BFXrT8&^v5i&o#aX zB?4r1>>I=I<#>ia(QOf<QmUJvnf=+MndW*AGnmiW2!w9j*End_(`((8EV+wFpX_b8 zPxaq`{9iP|6lcSczlat>3IKiGeZ~|StLmZQo5=C&=2V}WU7a~%ACzDEV<9mBUKvP` zfb4Bc0rZwaqL!C!6M6*`Mbk*L7{?E#0m2x-VbpTSz<`EZr_Ub6Rc%>Ni3TBL-HbC? z{i-g5dc+);AEVXB-DJ{rpebyktt#7znsEdfyO?=ML~CIGE<ewY&}&J8Dz*{pio}+m zQ<m@vlvHMo)M{hB*%7s#(?iGuFZZ7#e)h=!kX8~A)kyjCO+^2NV$Krs?nf8qwiYuK zZH|Y`e`af7OS8XZTpY-94Q&hG9q0Pi$33A{=O2OkKJDXpIP`;lEX+`-`~>JbuaeQa z)uSvj`?<o<r_ft8s?t=EzxZj~4>HK%n}0s}+p>+%aD4#3M(D0Un%~*@pR~@Yu-o}e z6yO>`0q+!N*+YX~Z}@Ys+8}3;KRD$?>1{mkpwkp+`eb@Er~~={KjZhh`Ds+lQ!>t7 zT?Ef_Ox7nP2DD@eCpysu<J71Jfg6b7d*itOXsDYk9ylD4>;a5t@Z0N+7C*n0HP)?` zZ5JU%K$~FTWL!IBQ*!7(Gk}bgZEX%;^aV?KG$CuYru2W09|^pVy_5*$;t<k4%UutI zdxS869bRwUX_ZE?kYy9!#TZzp_E}3U`n;!i`6AQI;Y`GR^F3Ro<dDFo{Wa%XpZG(P zx);`z>HmNa?(}}Zw-T3-jakg&yny$51<5)8%`428$W~DNdAEr0F}QT(;j9n4yMg;A z3F{nm-MB{{op^)0%G@8=A(9U%rD;^>mscoSqD@-7l|i>8qI@d#efN<)zx`7#rPF6H zzC%Y3;%vR`qe?0sYZMl`ewV{gvadb^-(T<Bv}Sw5?ye<JbI`r}>#F*mAq38m9Kb0c z7MX5Rg1A=1Bs>!ao2k_)sb6dg3Lv?4LFn|qHLPN?3kWrp?Lzz|#m(O4v%;k25fngR zcx~IgL&0@ZVQP92I0S*yXcgcso4j@zq6zdtf5E}jdKX72WHcnru^y=N?zx~@;qhC0 z(N3(F<BBC}{rEV}C#eB<1F{c6NhPoN4-3xg+;8+%vI%UpItVmbd?f_^=PYqgZdj;| z87@r{2@2?H%BwAhBQbsKwTt5<(+cNWfL2D}fBMww^)`cJLjU{OorS94{&Aazon=0r zhnK4&Y3YkVqpeAbDi5-Fy*BCu$bI4cZ`eaFik`V@@qC8ZN%$;9vq6rd0f4N*4a%<5 zQ@@NCK)#aS4p2xUK4LgHlXg11?|OxhnpZTc_wn&)?HM*Fjd*$StnE5EovIk}_#@-O zD%dwytles0zi*&PDR6}%%ajG@|JpB$EgcY`NY_5Nlhj5l>6NoS0%~=ks727r0$VO! zws%dcAvM?`(m>0mOTc?73m0rkR~EWka8B>~;GeY-DEfmeAQBQi_&koS>=6G=LIN6? zgj|>lgs_JiutOmCoj|I;m{fkU(4AVzXwUI&#&l)Y-od62csLa&s4tOY^-B!kI^9R~ zp3MGlpxrUnPki=T9x{K>3j;)3fVHSg?m&ZgvHBG2kMs(_S*Oi|Js7|Zyf!RCM*{PI zeO$@<CUiH4JQ{P7qX=&rj`q6a(dZ{qH1D@wEj6&^y<%1*{nJKqN3!-UZ1O#+??2|P z8ra6jwpvKh?teh{DlJb@p3gwgrD^H=sO-zQ4Kqp~)ZyESgZsE<Od8{@fro=P8LsdE z*s-s9)7&IeHg_{HkO{DnNg}#5S<K+&G#-QlY{omO2t}%&;TO0ht_xMyCZ84T%ZZKk zu;-usd;<IHk<!uekFZ<DOVAs<Sdy>3U#w{Immd4k<RnqZ&*6AH*^rEY#SIjNXOT}E zFAKN^eQp}}v0qtppWSWNT9DKZu5<q(%`O|-pJ3xGECLV(Fjv3dfh_HrPXs0u#^d}y zpByT%%O0)}EO+%)`(bP#tv5l<fGxu)6KNIQ*}tgO38&i}O0L6@_ogyH&1UfKG$p7+ zy29YfMDLkAe>z)kA!;jm<&G$?G0Dy}KTTuPJ!Jx0ani-xp&zQrB8<dBafx#e-J!QP zZO$07#$XAEr24K`m!FDx=G>0`I_$yV&JY+>q4B%`(4&|$)4}euf@mE3mNHvzX2?Hf zG$_UWMmINUv0PzKVwRgGdY2k?G<0J$<P{2QWOw$}a*k9*{9T!7!ZZtPqGBCgw%0zX z_9B?>x+HvZ`D?*=87x_!DTt*K5{}(kcg%AT7ZLO}UC?xsn13`0A>by{yerA@0M1p) zPL7b^7f8`xaXC_OI0hOX&#-443VZM-U9ptIIqiF-s5)bqU8ifFXQ(k6ncI{I5pZ*v zTld2#P8%;)<yY4VfZ*rE1vF+f50)Z$<$m6)kYQppNeRC}=l!=d{=;IOo7qjYi=YzS z=dI*5Fem|6Lglx#2L-9P;0_plf!x~(R9xq_@6JT_P6ug1NB>qeUY_@IK@>&hn|GOk za~!J2aV088EV|T|7WBMBd5C>eo{vGOm5G3X`5>b=MR<pzWPwfKr^0ul%h|TZQ#4j< zmBzT8Xh4++YqDC|8J4vWS@+!v$*tA=Pn{y-h16G7I3P(;{yu+1?zHztc}Cl6{_Nj| z6Ipfo5uD$G-}0K(@t5sr7jeM-k=^K8iB$F6n@>VH9qn*{4O`HV{dsa545se@?)?z# zh``BPEjW)cvGz-zCHBfSmCPV#@J{}&j|3i;KTVO_&TS|;l&r<!oyILQ)6$6%n>LLM zS6YI6^f355$*Gb=J$BL|wEKdA*g?;!VCySf;GL*1i8XOIO*V}MvUktfGbj4{5T&04 zz|NK|_=yy3QAK4DZ9ft|HKJl_KeiS<P@Q@7J_cle_Qm2C*R!zV6NwzZk;ggauz)Jb z;7d)rSPd%|_DEUd1Vr=zXZ>PK*~#m9+vK&5ZGK*WjlLL|9aapw8S>m_B@y*2B1GTd zg<h-si^t5X{)1Gm03ZVNS)fq`>E<w%q9x^BeA5=4)bjiNgMNsfp=F+2K}NQma^!8i z(hg3t_N?IO1zf(nA{Gb|w&fIyL;vlLGoWSAgWKOv=YGYiH|rpSK8q)!=4S5;fQ0qq z(?*7BjkO&mb+up#>Z#XPbt?!MwDzaMv8+m!N?hl2_d}9SEub148hU^ouq!BA7*@Q` zU+*BDWw5N>>;BK5z`yOAd*@o;d%Ob|YLIf__!y%68(LmlVS6AOlQ^RKfMnz|YcS_$ zG)eAAm;B#3hsbl@98V3p<FB;Pv9EKt+SWeX#&kXMii?`QLlwaF4>|Guo-+B>(Eg2# zCC8~dzm2B=0hnNMp}#XCKi0$cV0ZeTRN3&C+r_;aST(BjA404ZueR9|9pFvDbNSHm ziiOMH2~OWR!zLS0wF1kRr8cqlwi5XDm6*(@zr*yzez$mhdTIL?<)W}J(pD$mkl-MC z<vs=fB4^gYfcQ?6yea>M89ZPw7!olk;eu+IYqw^vp$yymT_?eCE#Z_E-&64dkk7;M zeq9<uq5L0ZeWKI-n3K&o-(x4uKW+avF};?l;>qZuKsy{zWMbpRN5{^}l_|eN7-E*1 zNZigsKs{_u=pQk|y=B>~+MG@Ao-TSkes&hs{ScceSHsxIXUc#6pUrICo5A;VP@jB~ z9&kP9F{pDt4Dl>>>nhvYMOok%FY2hKUQ<?W-52=s<HP}M4BUX!?6)Mn(}Qa_YYAN` zl8&Au?kED<;NvsD{(u{<YSKarz);IOrQj-Le!>yV9_M4XYCid?&OI%EdQ3U7f3duE zL`jk5&Xy(0>Go2O+mN4U+2&}P+WZpp_KzK}c;K9dAA_6VGzD5Xs9glF%(yRXKDmUM zC^|7WYvp)H2Ew*lPUE36V1dk5xf6vf@ubC@fsvLa*wg=_oc`v4G0f#vnZSU<QoSR5 z(_t39@x!JZGuo>^Tlgn1bWt^`3Oq}PivpY7jCo>L9gkII!@e-)l*U;xqtv^2fAbw( zf2P4BSH0b|pOtj>s-SS#8({aA-nW6ybI9H)q?~W>SD(eb*_W)~5)p0Op<#w{!#G9J z&EX00nH(utugry}z$c(v!v(DR3;}zL;TRO}ls-_qqQ3o?3V5i?G@(<m@)7ghBF?p< zW`!)qEZl_Ca+FwQs!dirAeBY=f8%?#3p<$oH}ups34Rm(QU-rImuTXuANd@@lhB_f zr%ZjxEUq-2(cMY?gR>R;tamZzN(3p1i*4aCwgMd<>xtS5og08HeA727aV`u5YKtE{ zgDQ?#gS)4w{-+1-ai1C$cde8tk>fETRy$gH8o~odtWhV2B)|Tv`8VQ_Ud;yF#F)R! zs|oRcs-iqyXijzozD;GyYntpIvT4;^2YaewvPXV^&+}Sx(B~K7+V-ni6U}MDdg6k` z8ZkuD4|~Mz=cL^y!uHei2BfDL-k~r=jrtH$88KoK>;X?>cr%y*w-5k36UN@<yuaP< zUitgb>54iF7*zl}lN?iG!0T;p9hK8#Z2xlPzgo>)nIu-&e=`u%qoi6r)tnlWAQ^Ou z=el@@9P9lM##|Ax1&fp#JUqy?Bl<>^C#7=NS<#SrNXsGy>L}DR0DR8x{qqQMidTx; zF<dIX8ws}}s&rnFMJap(OFcZIak6P_-$V4w<b7DPuq4%6={Mc_+utyfsmhw9Qe9Td zv5En}$K8XLHhQY-a;`H#O^Nf6N)8eVo$Or*v<LfLz>1FO4x8Vr+p4G*W3xL&v^lOy z*)z-5{UhO+tjPitu4P<intS%I^FKao1kgtOXV(TCBIPh+kYkjiKcx@AA;f~s?I10x zT|ZtVCCT3pXjb*V7vgtp*q0B-u?L&ud;ACLuC=1q&&!ho=B+$_x!Dy3t3<B?gRpZh zfTZI~C4O%rWmAqM0g?rV^jts|`kFehY&mh%vb{2`6G0L3e2Hq&eWms(&<k!|y&T2b zare6pCyH>PIs~a*x$k6{rq)`P4DPZk8p)}kOuA`nY<fL-i)9r>p;VQhwv}_U?h?b+ zvH1fHr*v{2*Qu>R0f80~>f~9YGvf6Cdp)85dgQm^-9qkoEelHEM9EOIiYz%zDQ!It zDl!zZjVh(~-wJF@@P${zpO^b6?HSUX(k`1&C=?ER{4Srf?F$GPDOXu?KP^)eQ*&j` zX$GqZIpy&Nj#;1;!x6<#v2~(|yV!!_mA@u`P3;8T*sqG-e9oPr6v4LZ)$?i1&wEJh z)BKNw`mgsWCSAJ~udXpn{H&hFiOk5?d-x|Y{U6OO=r@eu^-s81fgUp9Nf<c)n0f?P zSx^4#F0NKAX0C)+tV(tCU(|Ktz#GX@hrgHo#&+dXq>(1iAHQ|uUTu_G1<QR`bIS-R z5770BnY9yajD85dB0`GgE@TpRHeuC&kwLsrU~*S;=g|QHQ7VdX{0y_n=1NlzI2#21 zR}*)9ANV#^pg-%qoAGuBw?@!kn{wjQ?fIcFcmKMmJ_mLCDEG#U3PK2)YQ3~|!oBy6 zHCyr*2$i@Ck12EKLCbBRtGLQ5YT?b+|L5d*DGQ2MImRMmp>JZgpa`((5$t~9+cUYG z8@S@~2vi`)(9rI6%PRJpk`Z7g^JU<szu$dcQGupai#0Y9Q6D?&z-(y>8#i{mc71Zm zJ*kNnVQOoxWo$V4e-+Vj;b$P&lKy+zu7(CNkTu$@h}8e;#H^;p%I%-oQwE*F=!4#A z9+p9*FKc%>i7h<!ELk&Y(x#CAdK?pPMN>2UX`5Mt{vP35rp`sku3!<<nd9=Gv)wo@ z_@8lC_9mQ7Nk?!A{5EipRS!D$S9#-N<>5t{mwBqhkK7W?-?&8+gqne}-3b|~K{TPm za~ZhwOqwe7%bZ@GW^8K|JWNkw@h?g3KC>PH-VA_{elzmsKtpw1E!<aDE#3v+B&A^Y z=h6cJ?>N21b5D1fD1Zd*AU%HVvj@HIPZT}qIz(!cg*zZ|J5C9lh&OKb9Cq}H-&f&I zh4&7FlJ%xh$W*3JAdut6S=r7xpOsWf4huj>0cUQ|h7q2LW`*!JUHa`}kGxOv<R@my z4-;qM{kI4Niw~<DH-b1}ZkuTRK#DAib5>yT<!n?H_v8K(MvY%E!b1haGeua!4K(Y| zr)1!If0dZ<qxN@n7dV!~|N03|yvu=-H2rpEu*>gUHdSY<O6%Nwe>T*WIoE&MNOLpo z-vo}3NY&hgjhPfzF4WNGlUD?dA|~g~z$hEzm<m+YZB`vYCc^;Mio;h)pTr+J*lrKk za|O0rs&B?~j%=i!tHan@rmwMTZQ)h&F3VXS?f&t+5p={6b5VWAI>R!C<TLBHc=rCO zvyxo&ly1rg=8kU?iX&me4j}<Qu@Bbd)j>}#Mqd_9l(Qcj1q8G^2^y7ij6eeVPnhog zLJ=NR&UYrJb=4fw<1|$KHctC`lLcY%r3~R2^CCsC-)jst$JN0AW!dy|4!(rKjMeJw z$`8vm%Nmt?Dp$i`<g^bNd6W|$1N(#5EUIncl3~*;WWPyZ#WJQ*g_Ku6+!5Z_*SHFJ z?y`1~i<V4RF0?H@)G16vq``F|R~C8;cr`42@YWM#1S%L_Q+|{(RT%M=Wm5&j3CDZ; zt6tc~N(Ugs9hNY!exmBC%$ribuR(F%G3e2Isx7-5wJwVH;kW@Hc_eY<bVPf>xbt3( zB5!`p&5!T1rTL-X5Ob2u>{vzhF`;E?v@O?&6%ZFPlKpG;el)!?EW0T(-GF|i`_9b$ z62f#QKR=4%gY8bh9_HU64cCjvx#bvi;qrSL)hPA<?Ls>_u5<%F67G<9sRL&fTfW$d zl8q;z1fNj@5^IqeV%l{G&=QH>-BJOhxU3MlVgjjRU`hP7c!}Hwnx&8W+%F+&0FYSK zv;um~fy~Ws>l0cK1^m@Kq+Def3*ZSrV#)smxf>Y689-k?i4`*Z0GQmC&jg|h`*jfV zXR4`s+hN11|BOV^@$w`9PnSKBlBdme)9UytiN~#ol&Ozxs$Y0Q-swe*f<2|w0<Axa z=?H{>QE`Mgd#S~m$mRF{WXeaGI*m)anPqc~(*kjFR268F7F0;=v&o-h)q=d&(|s`u zxg$Sd#YD_X&xj4*a^<;4ktF^uX`md937Nt&J8<%&JoiJ*UEgZELqp15OBidyzk$jY z9bXIO>FCG<{O(KtIl!Ye{(K-M0b4=p5&WrQ+86DU$GP1~xIEh%N5Fz$P&~2l-Rw44 z5d8qCmGf`c`H&wkw$~CWW3FBc(x}t}@7!a7bJeNW>wGWkQ9q-UoeDw}k+0Ikctyl7 z-z(pN5t!CX&+t!t7qe7(FH^;h@*|$b7<8P-NL~YVAZqtGke*l+y9bZ+ZIs<Aw)EV8 z6}eT%#hUJG5{Kpv0TuRHgUyU;@u}Od|BcFZ(=ycD{m7~nzWVhKKBsCjXaPLko1n!w zYbE!SQMmKmpks0Z;~bcm8dTjk$t>L4s!e~Jmyu`JEE*_}0t&7zJp1Ma?(Ceg*3#<~ zSqxFEti4J1(@nYl&gck!V}+cxrsDjTW-R^IP>0K`%v#%<#s5(tzxbRedPE=2y$(@v z3X^ye>z^QjP#K0O3x(E*M?^kVr-;{!35D-`F)Q`tLf#YAmH$IcRmAj3OJwfUwL^qj z5AyH&95UH9N^F>-K0nv{7^<80L{^LDHgF<oBgfSc#MH5>%%N%vH<DnZ{cr4DHfF%U zmPerdr*4mR7UBd<C5Zt!CTcTNPfda)$Yc{ZYnlt)JxG19qpTq#`s!;ZYEAT8k39BQ zkbta%tNYGag#L%962C8~81_;jQn&sB!qTdVq;rT;T~2HAjW4dAtD2Y?DdQLuWXn9< z99OO4$ZN}C<-DU}4M4eyDG)ojSUMYFQ1{QxLkb%g2jE;mkq9$Q4%qDk+e0zHb3h-K zFec--ZU%B`5fe@8H=#joU!{er5}bh(m=L8{YH(7&TGai7A0qt^M1YmG>5>0RbmlR2 z(Mz;-1}-WV$W|z4y@zx(?fy3>c%~(wv3-b!wEGK%oKg3z5m**$;e9g|FG1$k0%LOz zl?&_@Q-3GE1NL7`pP3-(0AX^7bw_e4GbbK1Bnr`_jH+=~v?(mYztwwaMd309j7Oow z*lVYXdQ>V9r^4u4?gf!Q%7)SNr0Vaqn7B$5_3jYYX!$UPGxj^W$?_1|w>Qq|(_%?i zwrrVEvVOW8ZEKAb&3u4T3<sO2&STF2b`EO?L`Ot=A>J<TE1#>iU8sjnO_`xwR(+>< zg!><v>qOhCOP89W+ap(7rh9G8fT0nFj>ezAvIix|i|v#1-)r8j#}p^D^1J+IfOJ&q zHCfAVyT0i79>?5Q&+@OmtigEPRQ7iM;Dt_)lj6rbU}QYgb)!?8WNtFXi)0WW!RGD@ zJj$_X|2=!=Zx=J?EBIsL+f_RZSI{5brHDleR_U&*y=yNaExjv^@YgOE<tF(PU#a-h zfmCGD?$dbxcmnZ0g~T!m1NqZz?&EN8!9#0>q@W3Y_5+YKk-SO^TI?HE%<xpgVFd*M zrZdUCNbYu`>N9}?J_&K|5E7{K>(|>uVs0}q&ZE1#JcF<;K@A5~Hu6JKzwx3JIsC5u zSdgZZ_G8$^kVE~?Z|(A(Bj9M}h&M<^l+=P-9U|@$2yC$5#y&r#MR7i041MCuvP6Zf zq8kK?1(8k9Yb9Tr(FzxIGwyIrY5EiMex<>-GUu)zsy286Kz8%nzmu>~I9clrf)?I8 z!DSCUwZjLChn+55;pg#w`ux(n=Z<f0w9%suhUj0H?|zGQw00SVI7}j}l_ODxh-SYQ zakBnD4=ZVIYf_xNZ3-VUyi8I7FlVaLfT-jOPFobDyQZR6FR=TG>(NTaH$-3#8Kx6P z@Ks;Og}o<E?@p0oB~%nMsm@MeT*2?|M^J#q>1>s^Xb>}AJtz|}bwop;tPlYT9tb&3 z?!<JloE$#qJ{s;>?rb;WQ1l<N5%Xp)<{AW>Gj4yVXfyjkug>qZH<KVQuw2}m0)xF` z?NE6Rv3#no_$8Hx`(rl$3oy1Z-<C@r!mA0i{hn2m%b4i<#zMQhQb2+{z~1c0BR&)| z*Sj4*J|h(JS(*GL^CGZzxv0`Dx;U~wQg1Sty=e|k9S`WU`uPbH4IvQ|cVGiQD#Hw@ zAXG+G`%kK#p910iG08js+oNKh+!7u06M|x7a47GmsRVaQ48!aKRu1(4GncA>g|2wu znj8i4cB#hHNFl}5(2LUUlQyE1Val=E)lgDPH5cZ;E1ckYU6!+}wFz>L$3>Y4y!#BT zN<9S`AzYuzJ=?H^90)NPfdrEr8qm4<4$X=%6_f1f)jUt71RJ>+{A3kjdy8C;L-tC? zv{0?`-->8_Ie$*qQY8KLKW#rfkJ8n0T<Dm$t}nCe+K>uPpER@bG@IORl}-C9cW_*~ z%SE}7Ghy=ZNfe^Jkq5S4BAqZxn^XOd?WlkNtEj)@AV0s<XSsscNbvwrF4UdQ|KnW- zQVZOx8$Og!2HnZZ{!cJ!=9|rPtf!goy%*OR_U=>{(le-IqKHBMcn&*b12lnHkJjOP zxiNd)&+ihA{Nxj|M~rtUKOR4jaJzCl!UAQB@=I{~vvBx^iInW+@4hQn8M?Uv0_4s1 zthu>-nu2?HB|Iq2!_O~ly?A3gzxaiIW_5|*$?LlOf&B78jQ`eQ;i_*g#~jY93~g~E z34(2mCDBTYe`)#kMWB_1yPg7G7K^1mk1{<e=l0U#UGe>%t9SmMBgxzynt@d1=y3mR zH}%~#cMpT-x|?~8Z<)Sp4He5-JJ4ow(_L@mZ0u*XPNtIgJ;Y#%b%}>g+l-H3#G(k7 zbxWue`bX(Y#f7<*{_LJ<kt@1qKf+b#yNOpdhBJh>_%|z-BVLbQ^xJKa59G+f9ewSW zRQK<lFJHW#FgPZNN#js^XO{-^EW{2%r+#9i7IOP{*AqN_icK%ZzOFL)UQik`W_~_s zg=;QH1<?PsOY21Tybx^5!4=ZP1jr*64d0fCctlNqY?U*Bc{~2pO;zR0Ts?yU@bKKb z&%{S;msN#*LsQ+#n~l9>{d#@#lnu@Ip^_^as}ZhmtkX*(U7l@eNGQYqqWdRb5CRS+ z$jo#bL}?b;a&iy6ac3_E&Z?#TVV3*?3DQ;mxH6mW#oXMfPuKB%gE}11TD^tTu$LIE zjvoq=d*SZvO}Um#1F(c#lH0Yn40V^Li61-9ryIjnPpOMKMy^LHEh^MfnSIehJ6`Et z6---dn0Th@MReu=HKUN~MCtyhA$N$C_VGN<@8lJ#lhm2_^3Z$fKWX)y{z3MrP6-Mf z)up$@zKS`&&SgW@vz3~c7h4-$YaZFT_hR$tX>xsTUL6dQ#Po_|MWGq5ga7!WJY1=B z*1mJoxE>6k<S9NRK~{Rmi7wDWg`z~!`ctctXe}F&q@o*_vlNQH+v=pRU7Sg(;idet zu<}okf5ntN6i5X?+az4~j8I=PNle}w>hhW7ex6~I`kK7lN9TPdJ@w)ezE$o5QF`=9 z()Ps}Y_-?(=3Tx#9rp9!Tr*`HzF9s`ueQ#{yV~_eaMjmW2;FHHu04$F^u5Q>q7iSc z<*a!-3;bk>e-iBn#|*no<w9vY#JX*W5nG4mNm7GHX7s{Hxx>k?BT?J`6eF%zZd4Lh z?sj51HG~|)%e@Y^y)d<_HQC2LNvm9f`uSqzXpQrWKWwjCrU@?Iff+&(u{Y^swvLms zhD!&h#LqH>wFw?ahn&laRkN!<3|r0B7y^AC1gwaDme4Ss9^RQeQvFF6bN*7-IqJ=C zjH2%<Bj564#P;m@U_IXayi-&Rjl><;qUZXm%OG;+gRgU{+&q{|eT_Ek-jXM9Q^3FR zM+~w+RX96#H}7!lpa^}w7p=?wUjE%oI`yJ6c^h3u)rYgjm#u!-!m{k86Qjed0^rc8 z`wc#OdU_n3frgBoVqT`X(y@4*E!!9VN0$4ChGzJWF^}C3*!EOrC8gUYj6TPYC1*Uh z^HXn;{G@q~Srw~=PqbyY^+y|u_RCsVuUU1a8(vH4G-&;UyyCFd%v&B>HF+s1y0U5| zVu2bx?KI&pOqwG*Oq0EKdaD=iFxco6q&d=JZfN1<uP2DzNUPV~3lA1ovM$o*^*X2& znAg!8A=Et`sf;b&$EXS-766>OIH~VK{B(M6W7V%&FhYI&%ka&uxu7|zXpGn9YR~w5 zxr&)DjwuO}lFmF4jY<*_pzjv5yj7i^w_eg=bxceobQHBt-VYVZkST+%)-UL-hpmh( zn3`n}Ju+;jI!qeYRU6p4HwDzL5o;t?W}+n8Onu)^%I9tDe7qaOb&`M#t$lGb7G+(u zrShx%T}4*S_TAV+&JI!|C)XVemrRG!YgA{M0Ybu2mQ9eJR@I4kn+tEub{U&#w=QB; zL3#7QkEPx?F<<iDo+R6(Y=`E$yK#!eOJ8?0g$^T;r_U~8Hg?t`5v7J=_1{qA2P$p8 zi7HJmf2v@~T3|917pOVsvnbjRifJBiil4tCTh(pEHldk?T>BDq(;B`@N*=)y=D+0K z@D;`JKI=HSzk?A%EV`_KZ?@xX_66%k8D1sYfTzmox{KU1jktw%i8?=YVOeiU=`AF~ zr9~(iGI!keO}Xe>i#AtHvNJ|@dB_wLmu;^KqKCR<MEVE2F82my6w+Epoxjz!?nG1? znt!mOYmmwyC586Mwj+CFYh5<u*p|-CG4*Uwr9Mv-?j#FnifGny)<iGyb{m;is>unT z6x^A+?XaC?Sxz`xPok{B%d+w!d!k~4*4v4d!393rPs73<Us#sw5(RMQTqXFg=vcgk zW^J8o=XP(9i*@IK?2<#iPJKVSEfb3quhTMBwX>~V6aHjSWjTK$+`&TM^#mqVZqUTN zuDq#C_o{$7Ezjju+%6^vGEy)Bh{fNz*hTi9VhEcWRa*_k{Ci1$t78s6WvB_ILI*^$ z_ah13^}e!u8hRTjEJw&Nr{*X8_JKh=Hwb>O(u11&d*$s!XM(nz_@X(_%rcM)hE1x_ z!m^5@sZTGaiCvxfb8<eE|E?0BdL^O{+hws^-29prdwSC@f;tdOF5Yg%<?|pRv)w9w z0hHL_$nL0OFZsdw2Iu2?A&L*KW#|k0_&eBFFb0N$gjR9AL>pOcPQ^3BUXcNnc%|N# z92_saJPS?JNk|8obCk5ljm(B7x0Ojp>l^)1+fQYZZqP?NV-G(nZKdH?-E+h{__r#+ zNqDvsN^rBWUy}CC2<%dn{WUSXzpB3!nl0yBS9xTIkSGD9Kwk}kb}gi0Ubjurc<7OY zEL!l{=sI}TWw$2%moqC;yr%w}c`HRxcW(6Jitd3Cv=18h<|MCG{NinS>B07${Mpa8 z>8WX(WXK6SjMX-7kyFF)vF7?uHO9u*)_|a?uo~7o&T}YR_3GDUwVJ=HcPSod$8f2> zWZ{IdKzmYsU1ng~U%JU!N}{$fgf;F63vgTxzSsI3395(aGV&&D6bOxHSq_vRoC<Fh z;=5!d#MmxFAWY*1$MO+cpTN~o=!*4kFUpzmu^4xdo_LF3d#3u0<8sS{)~O%v9Dkbq zoRLqYyE<JcS}T9^{pOParch16aVKy6{BfOn^DlVU&z@-RUmiM0h<-nET3(iQihF3} ztnX%+MkjjLBEaFmq(5YNV~C3dn(-%%AfUN*$T{J-ZZOdOlF@hEAAkKlE!^AQ+1ajX zLf#`;-x^_-C}?W(nKmhtDCYGBwWsS}rMf?zUa~zl)%9GiBuhNNQOE<kfKsVz2L!fQ z?ss&B>Gb)EzFa1__cVggzTlqMC;Sv`y1uF#sG!M{v*O4=BL~?{R?eA=K!3a?;XBj^ z>y4|uw5BI}UryFnuU@oX54rJqpq6CV|0{?*s)n4b@WxV^StDb#Qzvsl_8RP(>}j33 zq1j=c#)_=>U(_B{vv!ZZ<Lk3YZu`QZk^?Ep{-~*Sl)nXYr<i2fV5yZG5_dSw8(Hix zniw7~?Y=Z5CN`i`-?P(oB^}V+9i6I`C%=-F26*H4@ea_fNKxwtof@zGl;dXlJ2K1- zw~6$)S<}_LyKr#oEpeshzbt-w<4}mc^4^3VG3M(HlansBFK$$#haWk=DOdY8J$sNz z=Q^_+sGFvgGkFO{F8X_&b3GP88=Ku_X(VW9X&>C|zdkzu#8WH7CbJ9;H<2vw_&ST1 z95dW+SgU%<KbDDm!n#-d_9Y`9_QvHIx~>#Eg!4>oQCB(Uy8)jijfE+_XOXAHN_xFC zMVpwd!>YWKVs^`)2s0$)FhQ45Rb;Co=n=XRisY>!|AL=Gc!+V)gV$pT8Q)-A&^syh zO_A(uygZN>;&13fmz0-I<Xdldk}mH5!&7W!(;d$XQ=A!Oc6x@5gCuM$rW_*6F*#{M z_sRnEZrFZb9&}fwZF_S4G5uWa{$9cNLWz1=4-#{~X2L}q_<d(g2p*VP`oh((29ZAP zJ4ecf4aH_0r={LGa1>t0cjaqm;eXJ=J?|G$pK>I7i|S2sGz`|HV`d2Ef}#Ej(y*z$ ztw0MsW@g$)^94>0N5jk05tnM-{!85!(iJV1PV8Fw{aS1@pOkz*q>43R`!Q$#+yBUX z-|}uW=PA=Fl`&h|At6}&W&PAp-*3&Wri)<{m#GQn+m?(zOAe>uy0vGc1&XKr-%`I| zME2M5G*PgiN}u)uA4}iEQhtHJZ<0!TU-)&lcL(M&?55U9CQWP&{BVRTlO^IEDxwr^ zokmWXnRmKhL}oM7e%QH?xUW~zt`=(#-y2g+tHBM>-%Z%?B_FI;X1N~qcT!s1xX-9o z&CL22T2O2B*{ZRihel;=e<7RaK2_@)pN7vi+{H}v+#<s!sB-wido|4rBv}itRUmBs zG&`qbVKHRf8=zlWg$b>>yz3JcbW)<YgxpHp*!O5EJ1-Mb(OYt;S>BWoUG+rr<|zq1 z{TFMk8+pKc|N8Ar^dqRJWrmF<&Eit8424c@ww&O4u7qtjQ@gJ@VOy-*<&Hy=P(+~S z&wx<cY(B=~x3TyO0pE-*${c=i&Fou){@D6jshz4DIkyHkK@c%VIv&cKLUqtU@!&me z2yS}UR&hVI45VwU=e}QzGjiZBEr-S~6F7%uU$zv3o?=uDBzqJ%w$qb_PL4LB7mVUM z>4V%oJBzg~Pv&DcIjGq#Q{}Ar$=lg%O`RTTN($-=I*N`DC@8M05E46b<Squ4v@L6G zp<Lo~7YFk>4F?z82#kUCI+q*{H_4EcIJ$g-iV%*oE*=~?nDH?$CFU*UdM4jl_7yCr zoOw%g4O-aBAKR<2Iy+<W%)`98sIb&=FQV{^%SzzRYCE$)*@|x{9*X`NddNxtYwGHK zax@yN<=5gze@SR`GxXvVMJOS}<@n6`y{@%b)2z+jy^R-$fSP+BwvD;S44C&QQ^b2s zH#rvix-;@k(7*n^!o8NzkaXvYuBSdI{;I&ifcGgTtr+{YZ3hx!7=7Unm@nhWtlp-U zdYjDcS>24i^?F=n*WgRv*W3bL^F>sXOvK`2=5@i<Sub>0{f9rE>ynx`Ee~ILNK$3L zy%_sKfEVkUzVv;&^g%}MfbipW@NQ%3oYhuYpuQL{TbQHlhEHx=+hfT1mx4(0mnu_z zbw~;rgHqk7b7P?M>NXcbYq{xQ1S`L);BudERnhPXrdQs_3#o9B&yBF)Z0{aT^I1*q z4pm!08OF!olX72(Q)4`D={ibR9d(fIjxfuTk{adhHc<otTrUIp43r0wl0EwkHVFA- zaJ3ChRwZ*&m|_UQv1xT4-*aLWHU@&<XcF#3`Qpsk`RJ*uU?t#Bkt|{BlVN9Q@VKhG zS4cHSxE`N@Sz(L!uu$k^>}M|U&M9u6S|5zwo<7Vu3=I{TaBK;i_eokf)_;`IG)LBA z$~&j@anSXALrOzKjX?uL$g?#*4b+Wq2msikxnh3K9aN2HVdZKdX35ykFvE^$8@!`0 z_!VDx1$Ss|TyHrtAAaFe!oTgZRxCEqO-7$?WL2nNUmE|6Q*|%2x47;oVauWxSM-f5 zgf4sSF`|;#&eU#McZ&$stoA9;piP8R-&##Cq>arr^Tlin;e%Y!E~wv3zS4+A3!8_f zbQ0W!U%sa%TU>O_O>oq}C*p4E2=mj($>>!h{Mo+>^;+!|R=DA+O_%CO3vXUpYi3>7 z9#U~CgpsQ~zcpEP^{xDB$G=qUnGU=1@qX{2dQu(BOQ}2^#|b6^lg2Pa(l!<3vewM) zL>{P&uH|&)aR0Un$McwA@qmt<$tpW*htmz6`kXmJu?s77#Y{IX{+{Sh9tYhKO0VF> zK%KcO3k74af+2(I-!m4tKwgRu1;Nc41GN!jGx~G>&$lz{+4DX2F$I$M3a8IzasAJ< z(}WGfMc1^!|Cw=Yh|27KcjcdJ?BG~-c-%4FGG#qN`*)CB?O4JW<$?<L==LpXmDdl` z$e3^N*O+!Zch(anCi`p$4>0-oG%cS=<{Ef7$NJe!Q~Tmdv?0rO{y0km7S0m`w#!Vu z0)y-BD)tTdp7N)<?3QD8okj)VIUvfH!8!|^nJv`xlc+~k$>{k{T%H<_v_)jUHPS2g zBoZLe`m*Iut=KaMgmFo3xF#|g87Sg|_+J}rx;b+@WTuE{FPplr#_TflX4S6xT5!Ta zaPdxw1p2}$EgmzEB7XHK9zRb!to8B3JtH63zo-9G;h;~cH$(nj-PSm$Q&eD;Pkq8K zuL6+B-qYo*s|n#6V`e5V88mt?5VV&n*=S`07bfjW{Fb1W<0kp;{pL2s{ESJl^SLh@ z^G6*yRZQK?V)uj-6zB4{oCdw12vDGdIBK_$8(*1n*!8uX*x28t$Ona8Ga>kKg_P{? z1>FprS6wwe)ipQz&?ZRx_kHq8F@Lrm^7H_-C1j(wX7}eXOfjs}Rp$ran?-zrOrK$T zL%vk>X@pknuxhI-Tj6&`15r}foDZkB>~<_7NOQVUR;xTvnbl-Qrr-jt^m;P#m=|S@ zBL9%EeyC0y1~D$Mx3u1s%~JFoCm(Mmt29T$mWJ}#?z33M-ZuTrQiDesLHvVds!_2^ zk2&gl2DO4(8tXs*VG6No_qY6lH?%l&4f<2)@#;em+e3!S8x^LR?5duFsff~>@qx2q z)Mgwr#r&G_UJ6d)dW8ut-+dlzX*?J&h4qT|SwcEkr4t=3nWGja(qUJfrKCF22J*Wi z26FP-ZWB9=2&U-<n=jnc&gv_Vg3;5^j<1FMd*ud}#<X)8-%warn0|*+4^#VoK^t^1 z{-CdCXU$$!v9alE`@-%D)1y*_{*JTXrENqn+=Ua7cdKH;|4FKjYL~Z4moWCX-}vin zIrx3)_u<z%N^gA6v-P$p#l2{oscLE%b+%}IPj>?sXpJ}-*c;mMx$y{YX!G`13q$ZR zc2X6Bt~B8DWG{+8Ssdl!I8@m#*O%Q3JOyDA>sYA#9Av2}z56c9$)l;v@<9_bq1NBD z^iryb<BE7wN!z!yVU^1)&}F2ZA5PV)3fH~=bbKC`Pv`ogUf-}Oa3+{{Isb-TUZb3> zl&@W_!oji9oM1xnz>sU8T|9I01exxcN%!n)=N)6*Ts`mpBTX%*TC3_zD;L<%+_4?Z z8Zng-FElvgwXBaF`!SwT1|3|ENf=&t41aSVXGwpTW?aEN)2v>=BbrutYj%BJQSfw^ zlt9NA<uPbjb!$R7p|RcbdZ>{R8Jgig&sVgEcio9DMZE7C)eii!=y6j%{e#cgl@BbF zHbXHYIQ@~4vqF#x-YbJ9?b-B@vN^?jnKW6G68h0$^p?H%+ig2_=3D-xjSfx9aMW!T zs4DoLx#@DudAA^E7T?s)&^u`zOwU?#nzaVLV}{08&Tz#_bS};5Zz^XTj`iR1iuGXf zCAQw%YWSrfiQdCt$6cgVjf?593}L&v-LqS1skM`Oxbt_l65j=Jcycv2^RzpL;NWN{ zWX<!jB=_zM)5hr;4>0AC2Aaa++B8Pz;&r=jgnr<z`Lno;GGu<_h`xatcR>>cMfKs_ zTI<8qg_Q|u<rx1^_gsU(b>;E-FG(fmKgcpYLJ<-%h=rvu1GTsk1fsu2nBdG1mMPtV z*+wZ^Yr9SQV|NG4hr;wU=_$TyO)sX`f0tBxQ<Tg1d%5RDb!YdYVo^txUdh5}GOE8e zh>i}2s$;uu2!Fbur|EG$FB;e2eCh#;Jh)R{rI&1RA=7GFEB|SjFa?}Yh<(8b>0x@L zo4cY1N0az5ggFX}@@pyLxL9UNrAgQ57t&rZgvH=3Vv<T#L2vr{K<(fp_i-+wX~I9~ z$p}x-Rcb4Gs;{X^y~RIhV$9es&nFm9`@RMtt|3>ic0f^fcJQ9v9PIw&{q>QCfQ;U> z+g9DIKQmUAYYmPLh9@(knR5!<EFQSmG`%=37;WV+!|jr!vVbRJ>pVS|$m4)lh#?gk z1Bnt86ma;}$GEz~BM)$AZ4drUR`E5vt!U`>HR{VgJZt<%Q?cZ|)65Q&OD&T_3%R+q z-7lKN1NV;SkUgOZE=jpcz4w%qvNyVZC=}iJFP^r?MA5CY_~u_ljEjtl9t*3ld4@OH z_s4{~jmm4K=tSN?bM$(^++_6Jn*jk>b+lnvcxQS+MpwC~`W(DlDmEoHS_?8hw~H}6 zxWG%tzSf*+z!O^eF_tV;-YdTF+6F9_hWoYlPkX{~m3VTCb=SsFmfI{jyKVT3S^Wvs zl@lvQOLqlDisrg9wQsebUSwiR@jaB9{uBO6!P%CY?I!h7gXKx>n(M&N_l|Gx>V;cc zyw0&)hMO<kY$Uf%<on7vOrB}&{rY@uuCAux6UZI&`MtBft$O@6Wt&?y9^NDt(OZqf z6x<T4!*5|akQd*})lz-3dKL4szQ7<eTcbAkqzSQp?8$XaY#kap8<FM#5ghOInl2JD z%g7A)u{ctMNX%EL($<RHpIe;?KUTq^V)cwi`J&I;cGiw8F%b#HoIRvi(((y^JaCY; zm^zoOwnoS^ws&jd&MR``VxylpYNo{9L%Jw7N?~`Nj&OS69#|!M7f&{>mZ89`XVjYz zp)~lvf0|?by{5HU*t$}_H935BTH@ZdkU=Dh#4a@4iw&tSl8#wM_}Lq<emP*){8yko zB;hcEVro-_B7!Jdck;eIab>g^s68$_pSbAwJsezOrYUw%^AbIBhS=CIXPv8koNjxb z*1`fs1n34RJX3W2)VoaV;Ui^Bs5DSx3|!gSk|p9Q<_z>iEhn?pN>&~91T(j5Bck$V zsDBmZni=D=ls<mJho)4v`y};@Pk3p`zFFQ<EDw6qG*<5cw@iya>i(Li@>_o0&(iLq z6ONiBkB3oyxNpUrzm{a9n&Tt1pB+_%^<Gr(8C5Z22m=|z)bwm0JvfzE0+=n_B`Lg$ zOKX+W{kq&Us#E=@&)BnMd>i8pT|Wo45P7*xPot|eeNCoU@Ao8gT_pvIw#Nm82K*np zRx?XBnH|5O=`<gmg!!wr*=rZu7FEm1C6O%?w8aM2!QTvJ{A^Zrm>;DmxG%-cfKI}r z4kh@IpdyS6!<2NAeSDW?f1o@lW^`yxhBnIOMUIS^f1<D_v}hyJ1JCNDlC3^yTCV2m zW@lC%X47~5gLpuzaj{LW1z)5RxU6z#7Q~*}Ad~~6?sa5rzmJY`%8FaRnR&6+`}lEe zmPXW#XY}npO`Lq|9vd#6<iE&7;gzJ#@`n&=RDaRiP6;x#lAEVKe?i2TwG--pc~1k> zZ3T0My%{-4gX^yJmyqe`!SCruorC&!IhkK}FoSN^>~U7T<&4W%q@1Q`KB9#75-n`T zJt)Z9S+2tbT=G5T&VROj)fj)yIl_gtW~wjiR$$s#-k$5>>;&dr#?60I4IFO}apZD2 zAp{e87PhZ=3thdD*`?#AL7lX-O7SK3D`f8_3>@l_$uIaWLj6~J(lEkDL%g$G0l2?d zRjxCw0pa;*T96=&rd~G`q_`yQ7#aD3FB+w&0|}rrNX1Kbq<}2y-XVIOb3-fkgZK!T zO?arxFgqnw&ZJL$+HDfi&j*2WNM2<E{1FMfv-N`lAu=*K7G$S6QPR%-s^miEuw2-` z{;SlYD5=>c3_;O6BghZc`97gs=6QKzt`OJJN7=2qfXp%-)7~v+`o)L)FXB>^yp1%G zf<?|LhD#2sm9dVOZ~hv7sF}U{0DrMCT<=mp5!Ui3;kWmIfIvb$^>yKEFnjd0e)kh| zFAV6O>Lhw!d<lK>%Ihu8(5vk!Ls$x@>Zzjf^vUbAc!Oo1OK<IkP&Ye}Wsc=iTt#Ai z*!cKfCndpGQtK`ZI*^2Y>JM!HTB?r1sM`>Tm!E7&qYG2zacv{N#=v2q=pd8Em)JKa zp1mRDn=T3>_k0ijkdNrtIo583k|f&QL59veIylSn)qF3_8qvm~Y3~Dc9Pj#_NepG* z_va<GA1Vq@x(Yw~QlND2EH@B@O}hq<kvH_k7$F^q$=8&jv$2o`J+G<z-%1UN`J<~? zwXlP$q->#h9bI;z!F^R#cWinP=c7-eRS_SO?$vozXY=3ceSMvItdANR#TpqIWVp0` zCpGb13lyQx@UR^`2?c2$j|qYB{|ZHMsBF3IL|4le`IR&eP!LV=GPC}2c#C7wC=Ju7 z@)Ek17QWq)u-+Ec9vY<CGcL_Kk6w;Yw_;Wi6iwoS7enJ#lk;<CUgpyY4UUw<E%l1+ zt!y1#9Nf2Ewb;d8Rhm^|NSQqiSS3d${bEQb`zXGVCPm=64lr2o%r^J1K*x;o9h_H- zEvFh+_j+fFR?1im)R+Yar8pY53iA7Pgb;DdmYpWc#-|wJtutG<#72{5Zpv1p4l-G; zy2FmlHv`=kOQM8-&2JWcUwb2CzoSq}8kN!BuMWbZg+CJ7k+ukZ-K9>GsMGp3{zS5S zL-fv!9n2u5&9^xPZLL7}i?yZUU{x1uvOSYa&SYxL#m5b_InT@UI<SlBP5x2g!28@n z?~9$C(0UMfW%=VjoczuvXKLt+!A0>wJf61IRdJ#N3;(&3Yo^PfVK?VCHWwfN!`Sp} zKf5c{N!sOAB#Q}HK~)e##wz^piNF1h&g>S(A54zftQ%nBb0fJkc;z!)Vzs1FnKMxm zhXNsT+QDgIjVJWHFWP3(h2eZ+U&((E(#T~b*1>G-WV?N`k<{q#{kowtR{NIF)v)=9 z0VbM8c-0!Dd|Fi6sVJp#8n<dZU8>uFY5Pw`35wVgHXVPu%dhh?HS_#_fd%0(_vKw` z4kJ<wfhp7UE(IvV(u~rQFM4zJSSBG-&EMR8i}k#WkQ=|u8uu*LF#f#AGTV-rz}mSV zL@Bj{aYM$??A(JgZkj<~5zpeGwWIX1mf9vU#I1CNH`uv!gZ;rv(Kmmw8o-BV>%2AV zUZcqWbG9vfNt*OgLZg@;sDSH3xlcQ+z_``HX@bcR^@ezx6VKsLk2)K0$0fuUIF7A& z?KRdj72RpJM>Kdi$|f~-GPN60+<DCaW_P@wTIEh!G+-A4asuX_?<(pEszW<R=7IxI zUCQ8sYMv*)(=1)uSMO59uTBMm3K8p}N@mb`Vv8<%2x@pm3BX21PFr?re&Sa6)q{{Q zaVW94eY@Mqdtpg2@>XU}r`Rt^3{ynhLtXaX+VJhHK$#8`<W^N`vfM5Kxxv6@Xkc9Z z8}5lh_#R1O`B`%GPG(cX>pBaN>v5eJlYF{Lc?%NJ_v(68m|zl_@)pza%Q6zTnI2_~ zQU?aFC%&;915-yLHa*E)J~2<IAQ~EczY~Xg5!Xp4Bw(0mek_gd@voeYLgL(f)q*T& z7;&hcaUSU#H-mP!*;I%Y(7*YYADipidlE!>c|Y7v4W)emD(6bJs7O&<(_Oz*nG~%` ztk|CC`~Pe2OaGy4!~R>TBq~A@cNE!|?8~I0?Ah0-?0a@&GAhZ9LDtEhE!nfj7*k}j z&SYm8WE=a$U~FT4XV3HE`4@gKZl6ytrozm1o#%0WkK?;s?qV-Cnwu;GOQCApRue9V zf6$Qhdg~nie=n5XAUlFno2^_yh~wtXA&v!uA*WAa^7>{)CoX<j;_}<ShI$Wk0EelX z&tVL>e#(iy(7J~Wbpa%{lmZiId*cGfBuv9Fuj&bGK42aCh_gLi3BLO@zkYY*n#6P- z^Yru9Z)wOo=)a#|2Fzs&0pF2Lw>M<VdG;M{f4f>&ozvEbHljM;i?v{f-ddXY`HQnu z^1Q4J{2nwrK&B7Ll*i3aruFHgHiYrQQVc(qrlFp{CDxCYIi~KY!foK}`@|hsS9_sv z!%s2Zz25IIE_W2#6mZAReJc@g>rz8He@O1hQhq$el;uTGI81{C#(gaf10L4|SJ*8y zaGe&Y8AXeRONM2DmGh?R2W_Y@l_5mVF~_ex<`mpKI$X$9=PVxZaB(`^&BzyWt$FaJ zsjLo6nCJhu+FKF~1A-q6{l4f(di42B{-ZUg`^JLtXvOFxjco7NG1awyOP*%5Kp*mg z#eIO|bb2gAkR*C96jNfUWMK`KQ&t?<Kj8<wdtb@D{U%;%aKO|U=MydZL*<DdMfK_u zCmqrF_M$Ro+h=0vnlDFr3Vr>p6A#yS`<?A_ii*41_)CpS<h!L)O707rMkYI(WD#@` zb#9_V$<AZnCRakxzos&sm!!Z|;3#T1{#e7XY*}&2lX4Lt{0k!s&Y((PkYH6gX7;e* zrB9h;G`^H01XXoMSq6R>2EYWC|CAhyeGe4*0@*}zEw&npf{~j&XLfU^Bv_b@yF%F; z^B!|P{7c|zR47n4HWIOc>j`zvQ~rahw)d3+N6I6y@z)M}yZ)T{$@KMw;0WwkI8G}- zLadCc@TwPaOzF#oW~!Yp^r!)p!%T_FvVp#%hbjxbBWep#%F#FM>fa&(U@0zZA9Drl zW<h~bO6p!(3#k6?+0GEf&))?-n1`*n+}D--S7N7(=Pa)v#aqbGoP?2%9iHf!2i;;8 zPwl0!LhcRbA&u4?MBBxs=QXwmy(u1ECti5bN^ZDcoW79v2%0)+WcL9Uz}CL{^@Ldz z^{DxcvZm%RgA(*lc9^zxIUS)>D0_|Pi=}_5%+132@usX;<`a5Z3Ofrb-TH6;$uKvI zq1p~xwWo9iNi?W83;CKp#DX)(xJp+#0{llF<*j;AJ@S0;aS~o9`lK@C%gwdnv;-4{ z%8+!tzwg7dK~I_g4#{6jX=)fA)>7ea=$~&WvuI<~*eGm>|2hRsOaATGM~yQQKGcM1 zMFS;_u7Mjo#K@;OWc{O&L`>;`+h^iu8fY}&>AL=9jP{5;fkqL}h8)n%Uubn1I>Fx} zl$_iJIKf;M9Y#4FE)MM0zN*|x-MXwV>$Wu6&95eGtW4}BAL2RT%(0Wg=lScn19;E} z^(?~+pX{z8wF~@?mwtm)3dNzQ%PCH|)}?&sWL4oag0Z^cFhOALbz_MVzMoGtd%^K% z;xe+Uq!%aJV_<No4Rs0DlPmQ!)i4wiPs!od?7NKHYYCBXKN-6=QL}pecY#gc%&Lif zpzmRka2qHXFD?0pl=jvpq0bjd(*^ksA5Xfw-!;GUTI}1wm`XPs3`1X2NH+hN&q;he zin62EXcbrI^$+|nMrhhDwMx%1wGnr39MrWhM^u5Hqrt)Tfa7f5tdTVKvk6bSa=_Lv z>cq~TK`)!eKlbI#)Y8oqQscV@vJvY$Q6Ueb3Zdj6rE?6;7_^ioD0cWqEvjF>!=Hx# znJn#~m`<_Hqmj%fG<?dIHfHHn3Nkc%pW^0{%HtlUpo)FNKd{P7Yiew)-TL&|B(dm$ z)C+yw{JH$cK1PX{Z$|4{g#eodVeH`{Goglwf6mugH6s(=CHig$bU*1fBQT+1&F}nY zCY2!y%Ftzr=W!e_Y_W-tFb8{Wf*kHyfw$+lXt^KOM?w=9hGC-LoUrU?ECjKfjVfW0 ze(O^fU#5bU*6IUo>&d;S%I5tv%OdouxbI*1kl+`wj+z%C^6mSkEhai35VFg)>E6r! zRt|ZyiIUjQHazJHaB>!2#eZB+zCvS4&c3{r$>K{p_Tt-I@FT5a->n|wUEzyP4z!~7 z80a0gMx45MY@*WKQET!*wpjEz!W7he75E%};g$h9d$aGG#-^>breX7@+M*HFMjpHP zhesY$)ltLEkJFe2Bpeuc8`_lk*Zh)r#e726T{cT8<WHnd$}&Q#jKBPr`x>?T1F<`F zN;@Q1hd4X*S<L0|mny`#<UG&s;Nv3TDH1t>xG5cm{ri4KI{jIRi;-u_{#l>=21Z#W z9h4DN-Umx^)%2l-JNQnwskZBTBg*0^-yl>=?aSM8WcK!`<{%~TK}&k|L=fivEZtlC zXOp7h>PGM?5a{kCk{3-G{;TtOBb|i1siO>3ImJrSB`P}R+d=j(Kuc4|0}d(W4(|45 zb1*cL&j@=TNFe75pLpT3Z>l*QEv5O4(-j;PIifwfbd|KlZ|zdUT@2r$Q(#JBlp1(P zUTWjMVdmh7OYpaar-<kq=9$S3;g7q?1z~3<OHIn%TmzkEcF{pcZZ_Ixp&zVMM9yhw zNnaH#<PB_Zv^S*LE~fl8bX-!*c0`*uDiwe^eqla!;^=;%TfoOs-{Z))Qk&5F)tkSd zu0j{w$GiJTa|+(qMZain-+`pDuj77Iw;!|6IoX_k)`NMn5u8sLY&Ca4+wEu@bxxJl zDg)Tg6#46__B=`G_s|Ibfq}A^-Zj;NFH?Rm6rCONin4|cYQX85JHqJq_f4u%rpxVU z&uxU=hvYrBLVm`skB0u!tvUKA<n@wSeuYXmLo*(ofB>KQ=sxIE40(=!eF3mGwB-}G zA!5xb&wy8X(@DDTb<Av*F{>sxP@A=@U;yxmfX;3a8<ihv$AR6r8h2@Qx7n{G4$(PE znfl_3Szp)(9bU5-z6NuC)?#wt-ZSv55;k*Th*w$TVdlf4k;K)_Qr=I?iyv%!;`G9? zLT66!G|!9hW~l`3nv1mYTg5DUebf9+u_;6!IO-Jo*`l;_htM^8w7%G%nCGP=^PA2h zi|sv---S#ft|y+h|NHION)IPLDLM>KSrrTCvH2FxWuII>o;V^8nOVu+oQkay5&5}* zPV_a6CA`s}42lO+xRldBP%Pa5`ikM^E9Hl!!+(@)fcwj(WR;Nv+xxBT)hHsKVpiWc ztHQ343x;zg{Q1JEW5oE_N^8}8VsAa?pGaHx^5`2mp5jBc9B=!cvRoNGHk`+?pN5b+ zmp72MICc4Ep~tUEnQwPDZLtjJX6N4E#w4R<;o!8=A1}vfb<MxVOr2c$sUwY6TjaR@ zpzfIvx%t8ryxV}Ad*b?A4_iy-Nkt9AW_j%{NcF_V?M<6oUkEj1H!gcT*M!WlFi_lF zQ{J-1HL?t_@K~pdu(5b2G0*zpIA*@NR3)t}6c=*$JWgbH$jxy=B(vM5QF#B^yJi6c z@aFha0Y}Sy8K55O`4=^%`Mk`Ouq33djcKGO#M4^J20%3e;n6PPcLgs@mS3h43l+4? zvZK5Z&D5~xWwb!9+0o$FF~8B~tZxB-{i(o2ZF=)C2Ae*FS0Q7v3;K9a$ThCW-tV0J z=4@_qsSd4=af*Ak!&pA}>1Uq_hdmEDNT0&^ZX{j!`qZ7sMB7@~lI|;t<JmiiNb5vu zY9&?+F=s-^S$PV}6<ygRMTas|Rt>P;<`|#+R=fD%;`e{1{{h|Zg9J@%pv{*3W7hWc z9F;o%KdIa;c&h=6`mAeaWhNCzZ-cz3is3WZ&mA%vT3Y<$LAMQ*NttAU`RJ=LlqQ-^ z4m9QL8|ztHcgWLjDNS*FD(z5NVy)!C{_gL_%E@5-7P7SMrZDHusbL|pLtPOGHTTAy zlkRcHlq6XZ2q`su|40b=)0uz0?$}xu<<r0fz@Rd8bwu?a&$?vNQZ*A6YtgQyHT&>_ z+hNCdO2-2-y&3wKF8$b1Q(V`<hFusDLtC1mh7Lbak8V~wRiL!&J=F{VP<3>9l#=_8 zqlgRi6#&YWPUW|dr0VYkj~)wEO}R653d$7u?e>U<OAi>uC#<OV$Se2;LM%4y0l;=x zLc463;nSpZ;vYGh1i&c2J+1g~@kv8i5bHa}HlgSF0)JSeMNN&0fm*S-dO5&(9<*jx zbz<z8XXok+b<HSlFEn!b&NY~8YKDc3xqm<+kN_yAGT)yc8;dWZ+WIu+?G<lCpfH;e zBWx8e<F8T;N7I{w0BfnQiCZbNyYKTkoFXQ6M~NI?A~g_wom4QmXTXR>R8lQomB0Fz z>5KNE#!-#{SDHOETh*ZdP+R(gltOcmn{2AEx!USQa#+8g-B)k_1O39Rooa}4nQ5i~ zu(&)SA)_j6or<Wuu0tz~Hij?Lo{$uHCt)e2_e&&t=tHXVp-T}JLi!a;3p^n?-j?cY zx7{0ttgI4=$1*~}UTl5LG>}9uua~6aUcnc?oo-}9|H8i%<35$x_cKobS|YV@1!kz~ z^jZuH3Mc!`&eKQDY=6;_p279T*?RL)zD$A3Ji#tlAk6DtIg)$G@y8L7u+gt758uei z(20SVmt63{m7gGG0;P}vgW=YP`ANK}4m+}oK>hMCa9lmBG&Gh9K)<Zt=BPP`bCF$I za@XmL>K?L_$`OUpB`|8YL`|Pu5TF`9LNKm}<Q1lJ{o4+`H3t`hWhpb{&rg|bu7+cx z&wAV>`XU<&TuCWd7d;)@=i5+nO8vO`Ix(mhl~-_$-LgK<K3FPk5$(G!sN9Qfc(gA# zK%2IivwPEv<IER|t5cAtbO%lT*&De6O^xUyI1%~}UNWtulzPae&TT%wKQWGws($uC z9H&crOz;X-<h$?SzF~{C(9oKRl~Ro9<8UsA<>qw4Dkaa8Z9incv_x6bgV}y2KWbkx zJ7Ji4SW{q7K@Da|3DQ?*6Zv<BX&rwJ*$pn^l<yX9yhZ*@+l916>-SP3ldLVKjW<UA zEC!D8ef<nemeQP5?9EiFIPf~!B+I(Tc#D~qp6Zh@qtZ$R3cJW(9Z$T(a?V?pbp84) zj#&sf{fsZD!ubi=G5>L)@Ak?2_Tw!w|2~f!xl(&kE~SzS{JllrpAR-Ihuaco%hkes zH(V?i?1FEQ#i^enAam$2d`SH1QQ`VO?A)BXXm}Mbz8^=W9(C_uI0Hm6`Gmt&V{z1S zdYG=T>9}iy*_8*F4qbmOS^J)#dCMK;O|Sc>KEGIklG)zoI;`3lRlLOiNC?Lalt|px z)^<Od)+bZSdpYyV1`KNqSKtit-<&_fcw{}vw1!j9{+zwiP|pBHPztGYEMRF3n>%OW zepq=+5_-f<CAJvRpQ}YxeK)67@jA+Dkl3VZM4jkk?`O~0K#wr>@^Dhw?xt%dbhA;z z=cPLO*UhZ7sG~mqpotw{?zghieGM1v%ggG*)}m+P0rU*-0e!%20E<4|z)N_YY?cyc zi51c@ChpDSTXMmq%U!xpB0EUmuz1VUr*U&L#Y3p8Kki+Fr+I)sN-1kcF^1^@c)TSU zrDI1MjGP)MlW589*&rA-Wr$bH>+BC~U+)gtz-a*qNp~d_JM7k!uuNY6u!{+_27-~{ zNly3JKBH8+*Y9R~C9rt^o;ZWn9*5(1)?TutEpi*A2G)8~C(TvXU8i;#<<5YU+C4jJ zk_OEO-9sbMrTJd}owP-TBmmShA4vyYL$9QI<NCMAvqnpar(~8wFK8K6a)cz1q)$#U zp-VC9KxQi9!8$RGqWgq0M%2xs0ghvRn<Pj^9l!uZdz6FhvR2Y@V7Do;U35N|Z(*6< zbORsO1EVsSvq3pEkpAZ_!f5?RTE&Mlo9iTZzk%xEbqlf&v-A||!aEMGt#!vd`p-UP zZyJsd(eYsF1VTz0dq`>Bnq$$urWzb%RKd!oA|k=%>f)c#Dw&8GUAFl<1@^7@MU;pC z{+UtN9{)ZH?z2yR;^@Chb?6z@p6sq27>-j#x(EA5R^L%wk-5+M*6Ksr;BM}LKi(X3 zI1E6e`~#0Wgi9e>(qSs_#q1os(%R)=FNE{VkeNS0J8%s+<13>bt?aO`4U1mvhfDCH zp0#AdCB-$Y>u)}N8cS$|OyY=;Q>n6Nr;VP;p5c6q*4@GgUJjj=!hW{2>+h)NfgJsC zhEu#53=4D;qQnDq)E!;-vv1%paJo<aTwr=c#GA5eZsIVs?2MMJ!N#bKjJ(}TjwbyF z*HpR70mx|{xyShqUx$79qvK1JXN|PxX4BqcR)Y$vMS<S#3CO-A!=5(_?TyLkUw{$< zRHBgnpxfY-5_I*CADYs@_)j};!#VzZQ5`{0LnY*~hdGT)S~pX)1)|iXNi*m{_iaBP z49Wl2eq{WFPj|NmtN7!RV9L2!3vl>BK1+zd99jLL<(P$IPxgT{+~{UQij*J_U5zmq z(d`-nMbv%r?^3S?OFalI^|&DY;SVcaL%9uQ4kzCS=|5w01#L%efr(jmAqy>ZQY8Aa zspii?o06r$gm7;$W@e1$CDlH8se$s<O(s9%BKS+V+dXx*wI^h$azXC5iGEfUF%gu0 zQ~sNw^Co({jrKDm-Kcj>be|YEhdu6C-B9$;;~qDATwWj7ytR*YL>Sgo6#z-#(ZOua zQ6_K8AV_Iq5VXn0)DF1O-c=1##>W0<T=nAj+;^1S-=R)`E9yzS&b&_jhkInd%=+Vh z3opZOBZ4dXvu#EgM_O5i4!y>r#Dwm*Jl99+)r*_5=Hf{bScX^T>5MU<D>L-COXcJb zmiCsSNKo>myLjy#S-JDvr=q*(tvNmwwbV75z`XP80UAS;F)REL`EnK9rjWEnkWEG^ zpSu3`w?NurMvN4gt^m^g@Hwh+%UH)x2JQ;i*D9P*z;#P%YNWclIAnORR^a?+k94<o z{;u`*tp}Lk3L%s0SD|_z1SD>oJ=PP%O9RkXm4%w$oS7h_so*qz#@1<d5GNF8$8}3< zobbxNK5DDvcWsu4?SQL1edKWNZFOxv-}wfAF<&Gp`rS{5{CSZZ3pjV@o5Pjx<!SSl z;PGO})$7{z6N;BO^X~-ZxX-WS&n_HCULjqRoW^xL2umoil<t#{lacP5+WEW2SHu-A z)24~l92V;e_<nkV^U?rC1x2*bS^5pmd_gYCMe@Y!zmybUT@7El)`TsF#>sg8uw7(v z*lbVhG#^@U4qHhy_4$^*?4?vAEw`I5bX!#(-@hazetXqcM4rIt|Fm33VoPR}?|t3Q z;OdWJqy#X2Jg^ZCSd3{=jPS|ZZ=K+UlCp2?Wt21DQTDl4@pX$^L9QugIbt#>?AE?u z{3LY6SRmBa;g<Ia+hGeXdybpv&tN0nvM)>DZeOP`n$5jN|Ee*CnnCz4qo*#@SUMkI z6af2V!W9BzeK*qRD8~*uo<IVjh2*<77F1V#=SiR9Z?v(EFl}Wk${ycaz4Ki`UjZq1 z+`fEMMR{)XklTZ`B_C9RiMiVvTCUwWNi9MqV>JeH=gqe)D>YxQXSpvosKFLVvSw;- zCs7-zm&D)KX+}`n{gr76a3<Dc$O{JI-xz*b`yW0{543eFIC~{b?(Ze1&urj>aV*yE zLvDk3k;}BXQ0iwx>&HeF+0+xMb!L-$5}(#~WS%6@y~_t$WyR57O|&VZ2V=#TA7=An zJAZ${oC!JGcW{lx_2dq~woa@MD&&+YrGV=9{-XZgPmlN&Ai6h_8EQUTKhx_Xa?a#` z2CfKgZE3mpMH@d#tl~k5m&SG}7X_B?J;X9heQ;hvw*DI{nem-=^I$e2qBv@#S1)`2 zELR<H-L*Hm4snp!1?RV~FTAU^0$X6l*OFpf6bGi5n|Zzgix3y^Ea}tF3Tg-Twb63) zm)xg#&$m9xGBeIH)A`PjF<xG2x*h@FADINVB)by6A&3M^MH*p0d|do-!yQ<&yNkyG za2%1!dVXgn`9(ylj8t@24uU@>*-j!&aiI2&MJ456NTqg13wa$F*0&dbdYqIQ?rNL~ zUkjl%;!qNT^VJK22DkA>aixRS<9EP*Ff&=hLMuhy>FobV*junx^B>_ZNwN5TCCcrz zrklfhEN)4z+nMp}Tzy9&!{}}ZjUR&K7&~sx#{0ar&Sy)eFH#dbxijYt--xMbIx^H& zUQ3~YQTeO|P_qMX9vhZqSJJ`BZ{PDgfdm<MmCKneq&L6EoCHt1%NNp5E?h!63u0N` z8g61@M6Gka|2nwlT$KPKiP3x^oGz~L_434)J`2B5PSo+5rG^UlmtKb7%(fw$J-Zu_ z6ao7afQ8^|*{yEhwOZ+8qUB;)-z8*<v?xHg{>TgjQW`v1%j`^eIoe@iO>V|0z_9Jl zw7xEk7;6}pOqL?@*=B#TR_k7QQwCD?1~3Na-rSu;oi=Bau=$X^Uv4U59jlWc)N)$= zv#8#b92n4X0r6fjwXAr-NN;kWV(Ddhpu|=S{8mV*;mBOo{jd+oBEZ<Fe@dih=f_E4 zuVmGjlDtz-ix=3=_U=8|(o88iAOBferQ`-arLZ{AuF(!vIf1Fx^(UK_TyT9BvgzUp z-%$jpK@iIz&HV@J+Pz|SDb(KGbx9*J?ww&?W9M0*Ar*EwnO5L66!FEz6gtB0oAq3y z^ZM(Qd+yuZbm*VZI?a9e6gSa^&VyV=tV?cI*vH{cIDhSr<FB^AJ>eX^+r(0|W0LAD z(Lp(+vp$$o05-IS^sD2I2PglEj`ApH-QM{W5GHED*uc2K+~~!#%fO788I;qdltr3@ z?zqdHS$_FWE}rlFd?9~t$XcYwQ;faqvz@@pqXDq#PgF&mTR3PTfnS5~48+{dW;a#8 zbR(O|v+lLd=Z4*!WB}iLkNUv9BLUFq2L?cI?z$G;CWTVfbRIkRmOTWhm8tbHG<5-R z&32x{S1|vGr?hmO*v4Ldm)q>OtzWvm55xsXc4(l&vZvgd^Y@SjAF|Afrz}`7i6OM= zSSh7|xk)=uak0M|!{E%j`wYL_gJ!Za$|P`M1_ZYw7sI*Yy4S5jW(2R|0XN|@dE3{Q zur*iy9#($oLbq=l41}q|@jO%Mq%mZtM~ft&^?_Lu7;PD-tn2|VB`6Sm?L;cEOW8FL z4mzVS3DZa=rW)f)2z)9Fa_Q8wa@5iXd$~n`=+s|$XFE!WS8t8%Q!bLu@wCuxv0L5} z{xX4|FMd-{@G-HY@}qVNwg2%op&;8zIJw-r$5BmMg{|AOU-5xUtPv?*!he%jfO5?O zQg-PW_j@U$>;U*JJjGictJ^mc@&(YK*s3>tLO|b0-v>Q;)_J^OMw^aLaY@9|?I9;; ze_O}_ADYq8J2uolfrD{V^Z@2A#`25XhE;Q~|8Rnytq5KH*4i^?_tvmX5-}`$>;V7< z-B@zOq$2{z2O~inUwLMBw+KzG+rEAoCyuZ$T-#9vV96Xbbo2*)#r40u`JaYA)}i>h ziHiv%&KxUC*<O#B9I3qbOQdoSYW}rI){Uu>rS%1l@apL#b|Zd3FrLRnb~)^MxhZ{A z!za%v)R0N$@;RY_us*Xwj(sj&30AgK-ywC&+b4A>GW5jcZsM?UCM>)dl{Qm3pijD6 z)3Qrd=j^l+v5)Q7f4JQa<&vHiAGO-L7xsk@0m#F{xc$S!fmx$H`c)L1yIfw{j;$mv zj;3xSjOkJRacjftEcHPC8kCHKTt@$VbQKaz&Via=doRVC+uAn0Y(CS`za=p@aU4n~ z(<lnUDYDS5_f|Tx8a_Rt>*vMwQaq;0H`hhxHdAhLS!yYFC8)h1BU;w7<eRJC?~Qic z>V7~?EKA57@hDFU(|Ou+N~iwY{<Hd19*>C1Mbve>7!^7Lpa8Xx`Tz3gcvoHr_?*J> zVdbKq@esew-2`5jA*7cYU00)$58)7QYBeaUiDRc;fgY&>)o$VB0XOv3qzl4>wZw#H zpW4{DQ6$!*d*o3xlo_A2*#t=jC!9$2Yk=yC?Qpdnl!jU$5aGmbIDZvnxiTP@|M>=< z?zS`7>D+6Oy&vXtJAt{0`(>GwaI|h+<Cy6RHKxXz4B&}VnQ6AOaP_JISX4Rv7FLHf zLRzCX3Ll$H1%#=!*1aQx3#1n1?tWM}-&e@=Ak!93FHXe0Vd>|~1Tz#zNRE^yAZ6BS z1%dT(pKi6iAFoW}XcMwZn*K*zw^DTw@VVP3vz%rbTP3f_*P9b_k)Fx{oByURI7@uh zzFHs)w2vQ00GnFqR`<EL_i!YMkqkGr5$0W~ka*l5TKH0;rdg?eEz2-bCFo|#u(;6W zCy59{&Y$O!=B5WX`0@CfE#!>R?VFcFzi`^m&yzc<x0L$>S0V+nDz-S^<^l_5@$5sG z7)CLW1&rbKAEpq^yEHeVD>Q5qDg8%%)km|_9&3eR)D&~}*JzlGV_qb-qvMXV)sl!6 z)Q9C@;MKN9?Wxgky7Fg2f(+-T*3VJ%Cl8EuJBID#XH^oUKK)(WQjmb<6>y+oDh;g< zpJN_w^NHdzY;ObZvRPuqKigz(FR1f_@&U?ODtMhd&fQ^k@EzPt@2;BFc8!Fv_MIy? zMrbt}WWTasn&gP1r|8pl8O?rpFL`cn$zfc@!QR&hC>b{9V<x@8l$c#7sk&{YHNbMz z%;hc%Q7zU-1vGg}599d$?g+SKCDG+t86Ho2gt82CN-gA-#FkAiXxJpLAO6JEac|qL z)TT3@;BIb%QDxPY?GZ|A?|^cf?bgjWV!PEESPi>F#QyqctR+<n^q+$3D9WpXAh*ko z37!sr)eytHg|4Jm%x^I87hH4&{n|T_(!I_NuTD3c<htdEqsNGXF`z7i?hJ06{M%rO zm`65_WHFL6=V-rxwIwVzY3?jbO4N}o#P1>?sFI!2T7~wApthg1BpfveIpt4<$Y38~ zYnhPrz@jk)KJpatz`F<|c;<eup8n@X6JwhhrM<^54TY{=HFd<N2osi~<+*~%bz!vy zEZ5VsLOZ7>|L8^ZJd_K$6#}8y^#3rCf!T@#(Y2=hp3*!IhqRw|%SdBOgsL0B6vhEc zmtRrMD_=U!Mbd!GzFeNG;&mHYv5QLb`ZUg`Hn$~%e`0uOoc-x<73CsLs5%s|T;lHp z<Yr1ymVr1<ALHV+KNv&k-50FUM_Jzry{l%urS>!0GZBEtWk!Y=l`wadZCDd^UE&Sj zwGR|Okt+3%qHCER!)}l#85vMB&h{MDP+m1kaIge75KVeE-ViJ%UAp@A@0KiI+j&SX z$Z;3NVG2O^sfHxkUC0lf#x|L5$u-{rP?utcKH35r>sZSo;u)ND<+@qspCS?6>6!8n zaGc6$s$Ub)8IN2L6a){-sSI_7x-1U&erfc&zih^{>t8hX(yNHLA9X{IgxDiEGuxND z`N<F`Nn2a!V0Vz?^p7pjqzsmfILC+{Bs6!}{c^4Iiq%=M>-5O~gX@GrfFEI}5^P9M zJ(<2C)hXSlb$8@pDCX7f^lidQGc{6?I;>8%TFiubCpa63_iveJQh4mI*Q$?Luv?Y@ z-E#CL?S`Bu)X?HpVkMuYrNq{eK~_Q(e7P`;o<e>UyEpn+*6eA|yUY`s!yPa`hmth4 zh7^t*{@@Ge8L}U}(rfE@BnWN|@&-O<Df57hDHMt2;v#LE<sT^n*nMG323P2XABvT< zTzAZFpr{-`ED4H_=l0?|KOA&CvV%~aGp)VLY193OtA0fW*Xf_Ye4E9}o&8<kx9y62 zfM$L=Ek(dT!2{x3*@4q+_x_sGtR=vJA2FS7GKaC@D_gK}QPUF4fZLr5qP_T*b}PSO zQ$73gysrg9x9!sZxz|6vbq~VLeM;IE(9%J2+&TuXK*=Q7-7k@t0AJb?UcaMUzQ8MY zh2ugk_cm{;zX8=MB-Q>YBGYfPecBT@dLES3{gb<1C}C388=;rxHMWq)m10L_%;EXO zV;6t=m2XwHq5T$gZk@4xuKS01l09b;@47YJWQ5+cMh!jY^h7ulW2cS4o1oOa;WIH3 zFO`#_<&GKuWDynXp#>)=e`@-fWZ#r&dux9P3_jH^3wFjx2wYY*P!_>IAbYA^$hTlJ zzU-Z&2CxFSNR^Dw6nZr=bt9PTO)7Mk>_YtQ=+*f|uYvnz$N*~_f%J^b$ECL8zt+0M zBk~5!?nr;y%uWG#P&q3K{vvP*b+q(}gfD8h?k;@%%tgM(z9E5)Gv8@p(iFdWvbXtb z(zK$a0)zVy&o>PjqDCwpbht^*V^poCh^Vcri+YLSl17~E)PnM1Z~b`Qu+_m%d(1?| zh&R_9f-=8_op_<KQ3Op_Q^Qw}T+!IjII)B@V|^Q)WTfmVONaUd?sJoh4A7rV?e^b_ z_(m8OsM|a$pel-Y+*$&KmbT((IG5uozbxS@&rQ$qTbGd&;18|ivTur^Vuw9ho7)+_ zUq(n_Ji?!LF}%hFqVEiYgASEeBFbjx8$QfLbKkn6jT$=NkMS18L24|mUp`3y8+G>R zo-Aq8ZMnhreeDP5u^f;OA}G6}14(ntLZSR}{Eqw^QuGWx(yxCAcPJ0Zg?s=fD66oi zECo9=L9dYLf&8=L4}Y@xP*k<vJcoL&4cOA<i`I5n8Zu&?Ps#1RBB!iFG9=@`AZ#wW z*HGQ%g-tZ586g@|=)k7Djuj?K*fqhzlfw)ck^3TfDT|JIjKC{Ij??aBDJwWUN=sW* z2C*M`LO6HhX28Z2m+6-_N<vikGAIL=4cz6q!+xW^6B1hX_g9`y9)Lc3IEY>2NX7iC zfvUpnA)I*Nm_SPBg7lT%><HM*1RPO_9prK-n5#q;)*t-Lz)t;f&r#V8y>;$ZcR~u! zA6T-i(bHJ#)j5pHRA<Y;RT<v%yB}VczXNh0uI*dFfSIo8pq#7_YBBHcrG>Rc$Y6yK z&l~fE5X@>)(3y_X7!_qnzvUm5@@_E?3uBXfS~4fY?}^~6F`JXBz3lBwo1(BvsZYK4 zI+rQvo($W)(YBbH0Xn*>Hu&RE8O9CnHZw46b-HibF*8S#>}T__7u>e*`(ehZpXmLr zvN>7x))HcyhxrZ#cA4;xy$r9TRqW2cnGR}|RC((8XCQIidMPycS%@|?`{FSR#_&-l znnwuNk_N#GjUKWH(JpP-0+Ip94{S^f2}X&WymnwwG;~OgZQnb&w%;G$v4_H?`M}>v zB7pv|BCw|AHu>g?7c(q3Y)xnHK>mg@#=<U>-W!ote6qZ-J%^?Bj|(04;&)jck*ate zk`qX%^a5lRVQnFY+ixdYtSD^QqAoRc(Cd!E$ndwq)d={l0rzJ!Xl2*7X(V{Ztf#(L z!pIzNBn$St6agJNo7?B<%`&^&@T9U8rx^AL83i938gUIC*9XEv_P5=hY|0c8ikr7g zY7@r`6fK9jwwn9&v#l?(5nC}MESV(B9Yb?AyhQYjt7ZC8Qq@i-xm=d$H@{v9*IF}s zVt9{CN%{KAb}<wOTdTlo-zcT;jol}&`fr}(A<-+?t}?fOzq_qTT|R>5%DT<3+i#aC z{OX9FI(yz)?3MZt5023vAxTZG%G4l@Y{(dlo;BHMP(k@3_u)V%W+#wxy;7ow22Ci$ zXDY$x8p}i0c&qhM7d1ED^(xru)4%7wXpf8*g+a3&4PM}Axy=~LD$1+Mh<3idzyz0i zW#NcuanRIQY#g7FlXjR>9zw$j>DOM=Hdi9u0VS&I&$lf#y94&g?UXX=F|*!Vs{p?2 zAE(^FPmOpD=8SmBwG1gz#ko&qyDxPGKzMBp6M=!xI-`yN-j%NE4aBTnsy|u#WI9j` zszHjJ(4QogR_0r^ODb?3j9qsN1(}~qY()-sKVo@v7fRS8?YAB>S@rJAYie!EV+p5E zXpxG-dh!*_iiUOpb<1pc4WhK-f8<P9x(3Mb<|_v10_@C7`6TiLq#^A<)}s9P9(n=& z3-fO2^x9>|tewODnTZT{znb{?#C|-tearK3xCZjOB^$3ljnq^-aP*k<?UYw}s2RbP z9!|lP&s}voSt_a{3*XJ2BrChmf9zFYsa!NtdH<vffR%yJUVAJ9hD)$eu=eV<JeaJh z`b6EG9t$Qlk&rzSV|>9m%x@yag0fZ{3?3yWE)?Awa+Sk})x0EUt~(Y?0T8+;18PS+ zD597(G=_iCluBTwl)dgN?O2?E0H~FDqdVLD>kPk0F-Yz*HxYJqg_{93HF~DM5%;^7 zq7sIQ`TA%JmTOn|#U@b#hXEaOqO2xLq)M}NV|UzJbsJ3&oLcQR5D#dPl(sT*>ACAr z5IOw$#nFqR7m(^-I85P-CdH2q%939g+%`@DLvU&U9w9{*-aLGw8S<`bCk0C&BWvw@ zL&iLx0=o2>C}<@EQJ0b0ycNB;!&xA)jHIY!jKPLvyJ}3Hv9Wk*{t=eJZgEJHJNt14 znua!A131bX$-@iwJt6|kIpX;-e#@zJmXtzQVKN2`4Ip=rSJadsG6AqmflXZJPK$GX za}G|C*?TIN@64R|^fPB>Q7tPQvU*vr-gW~Ru?8u*iHf<oc#Pk?ZP{px>v%-}LOp7m z*WQjQcbY8(?mKXnRYA_2Xw<p%Vbo$j2BBeiCtqRjg?sVN$acgY3mY^$Qp?wN<1)FB z?+n|6KHsq?jRihh{2cQ8uLpqYd}|w)JI<$&b+Pf{=p=MGdIl0MxsTT`h3b{s((8YF zj@uc}?OhI+tgU!);|sOUgS8_-gyotaj^>COIC=zx;>`%dV(CG#jIfrR)An<lHpA&D z4nJ@%NyPj3Y5%i0vXEAjAKJ0&Wo0T{vuVzB4k~u$jeLdxl(MxO<;@N9NO<JVU<MfK zZ;;KaUq5$WLI>d#E#2dtvT)-yWt0{bd`o(Aq(DGvqe4S9wdcd#Uc#Hd^ZGLZaqc#H z8Dy0V6Y4c<KVT%((gFwtz)P_j{WYd$YV^#Ug{RlT$fjuM0C+Z%odxhd|5nk%NFkC& z*}3zhdkW{Wl9=BhK^%qqohux+vuJYWO8Ov6HHXG0tdSl^Q*nJxf;f3T3sR>bvnPUU zoVs?ExU+VDygn>w*cHPUty4wyn)R@0ey~rD2-3$Als8rA+~#a_w*nZVu1NlN*#kB~ zs}I?Oq4HrG&)CGMeoTayBb{S0d%wLTw$`)*S4}B%7f%<)xRcG!o<!4I(x~v?gEO!k z7!ik5aU^%(V=Y3%WzFgWgC>J-a|RUYL?Fxjy_JK!J?GbX%&fj({~cA790hI(YlM_$ zi;$Xg87<Rqy<wgfH1-XifuLQ{3S436M<c3=I9yu46o4omgIn`mVdA*nLwnA5K_L=# z%Q{!Dj*AytFZ9^8R=b54aOiq-XdJchotr`iDq&dL`?@m+V#;Ol(ziz8YN0W5%J$_i z4Y#BN&ml=;&V*j9^BbYV$T8#Dp!Md}=sY<{k%GRy^E;0pflQz&2s%rvDrl&r@(us` z<StFlG$y!ur=89k07s%vQa2?7lsIy`&(djNuMy{di@)&ZMWtUv{qik&dqnfPoyDDD zxLRCNye?22jf@A{1%4g!=xDshF|pFe82}T`k%4V|F8KLml<9o!LI}$=NMllO3Mv~- zOM9e|&5Ikr@eXp3j=q{ys403DLO37v8HY=T=wcrJ(LCgq7)}cdswB2PaV_00<U3EV zZ;_<#<yNi52G;z;{gxwa&Cb$b-=?3%#ji5FY-w)|ZT_pYDPRdQuz(n;a~ncVn)7hM z>>921W3l}+)DUux9WWuAC6J10)EhRT&WMz%^dJzIgc=GCW7Qx_ZN{qTvHz$NcL|S| z(pJt&X|AN}^wU-89GoutMzsEBlOX&1MirmyaXG)?8CA7JH!zwZ0~OPxtV$DY!xg=g zE)@MgV@@?ZW!=M#DcifB7R8{E&C?*a>yTX-MnYqx{>>9L7+^oTfKn2>2uegwPWobU z<U6{LkJB>mlLSbh!$HMJ!P>B2X}&!p-~`OFa~>_Xm?wh70&tnDg`&eGaiJ!gJmzd@ z(p$>qx4CYVn&sMzlJl{m)XAfF1yhaR`dCV0x(g&VTRKo<q|z?}Ph)HIFBPY-D=Aop z(W@GV83R+>yrDgDUGZu!@f`!n3&;^dqqgD43B_`!6zb9CPqIeq$%-V%vx1=7b5yU+ z+9rCv?6B&qST7lf!U=_p1MhyB$;Jkyy#~TJmGA8B#=v1$M?G4($sEA3R@j@VI?#J6 zF4?)*22?kJMpt;qCT~)~R->lphDdDtX`r{#$QIV_;uhxLHToJ>HDJ*70n)9s28q$> zJW^Rx5joRF;<C3Da5WG5?!Ka8LJfMAVSBdaM)xg1@%s(T3Lbd|`>&QtH$g)VKm65v zu%jnYfHw4;DH{*?)pzT>w6{|c?2Wh7C-W-=c8vi}%DQIg60t3RT-;qY)s_{hjhCs$ zBM&dQ%ZE9I&<RUuWH+TA(a3*3KTJ6KutuE~K72|&C_hew?Nsh&jA$t44J>hBq5J&z ztCCp%lRq>PxVc}#U7hwR_9*HPP_{WzOYh?orKWD@(}=H9iGyQy#AEJ4<g84;VyOi+ z@&s&oo8Szh>I{H4!wP&)V5Kvfx^~HK{3>#@T`vFo2mHYR_vcmxwdOnW2iUJR@O+1C z)48RZ68`ZPetiGWtM=OJoPpy^%s;+@zJd6(6p;|5k7FMId4kPg2=K+G99}|nyVhA# zd*JaLHS#eADzPd}3xg5R5;lBf+Fe!dKv=;;utut1qaBxjY|!gTB`bf8GZO$u;=ic> z2~Di1Q)ji}7Q*-I!E#pUPbxAz;lc*WypnRe@*oXUV)OZ}GbiRX>MKSvk200c+$+qg zZxw3td=@f83gKFx`VgQrrBH1@Qd(Ub8p?)jEq|YO^ih`*rGkgJ#6rD)PmoO6j6a#v zu%ju?nUK*m^1-?F6fx$<rk{JeV7D)n)u-^Yg8%`d>~_M|Z)Hfe#ja{n-Hu<&_C=JP z0%jDherfc{FihDbT40aT^_a}q73;5bhFoY#qB#>9=`Idyg4}5+PlXF}0uh?h8GhO) zJhV^!I{rvHktz=}pIFVJ0r)2Y@bWya(OD;?S!$t=JIuL+oYE%kTk-y{m$r1kV`ALK z>Tr2S6&berBNwK2>1Su(4G9~xYUNiG!vyC<|L=vh_35?{a=u0aFLT}>GH?UJ*d8(p z9C+f`<H7D$vhVqPM<~XdgM6Ij*I)UiB1yk4BX-=zaH7_8WZmFe(`+i9Obpt-S7U1o zc7~1c?K3Fl^agFFW5-CtnAEK+pA3Mo&F<#>rkyPEN)RXsnA<wa5_Rgq=(?R^=>`Ac z4$T$_xBXnEaRVejfqLXnYKX~|zH=DSI95zeE^T9+T~qcWg}jcp<)Z5Jy<z*xT7;kF zdoQI<aFv_1=DG^^_Vn5riLCd8l_Z2gCtV>`CKW0~7%#g<kUoJ}*|dS1J=!K6T^di^ zIC@kx)Ld**{IVFx1dfaX7PBSKD`z>$b9eX0vzM;=pRN)z1N<8>UFH-6k)5rf!^qmG z-(HM6lOH~6b}s7KH8MEOh)d2WW++`HUs?}CR0kcjFOFziVgjjEkf$Xq|LL$va9p;t zSD5-@wNKLjANnYkaQHK_VQqJ}2TTJRJV8Rk#w4bhXdB||>awea{g9PtGH2P4bHFfl zCZuUu*Kp!#IZZpknb%ii!-rfq>dF6H_TNrHDqim%7zu!KV+{7Pn@`}fo;aRY9xTuX zaD@l7=euS-SZ&Pw$IG^a#l2STZ*9}zQ-K;AruJ**F?qZ1ebz5e9u($r>)Mh3nYpy+ z{4)Mlt~j?gcwjhTuGs9zKmxA4lmn;dQ_o}erC_`Vi^Tf|7*F4&s$s%P1<|(g20of6 z5u3U<B<p@Bg9ARHljQT%3wMs5=43Wu6x)`j|C^0b>B*-ol+>3E*1L=^FbBM4KVzlB zRyPmhV@;pu&)tTmsuHXY&fE9M2s{xl?x!VufAW>Qvl=}goi|k^o#cPxOuj@Aq1Rwg z5K9KA0N(ba@BTK?+*Zt-O?VUdvAl~tmg-(;I_+mVs4a(X^oi=3UccHR=U#VR%su<k zyS@<^Ia?_0$ucpXVUHr9Dp{j~ul5@L?5DE{R{?ox4p}&olc4_f3F@DRL^Y7&@&Fk7 zs3`~YAvgP5C1;K^e~b3#_zmV-HQ3Q0*%c--5O)`MP>O(4<6=r~g5W%K;~JURhLAGV zDyr$Ssq|mtTSC&-Qor^%B3yyKKT5k$0@Ol~Ik{Ahsu-mY0e=5eo6s_mY2w{^;S*2L zAFHK&D_pMHt0e>|<+uzZK{D!3fDtNri7gZ^kke3sfWDRbM5ufu^{?eqXQxyu$qm=o zB&Bp+bHmwcn}CcK#kh}WqZ{ygS?Q1`b;TosC|(7|VQt8JukgFjR8R*{;gZcT;NzfD zZK}dZGd)|cLDpS9z#a8|?Z!9Pq_IC}{UEbPc#v;-=Qf$4y4jD}zULX4_A_I<kUO%$ z6N4W5JoVTiO_)DF(XS}nE_|Q*)Nc_PBu{L7GH!8@0+`a2z0R|$hfxNT^6<HqpKqUS zy#+!SOyPi+YM+(z0-B{wG7-t!0m~||b;sCFj~<v{b%V)}bnuDAOe4KOSd4t2i1TT5 z;Ms7hd}ePNS3hvmwMsTU16B9kjqbX&g!nPoVYYIPWRv~KY@5Q-!VNsHv*(wGo3E?P z!fh<4{~1njOI+Wa3=_upOMnn#PiT>kb5M5OMjW@9`FeAS*5}+-9bD;fC(^eF&v?I+ zG(}koFA+#M8b9*n*YWFJ(<F!$zrS<C6-G9%y{T8qjm%++O)Dq0-}_x?#HqdMyUftN z<bA>8C8)KTPlE1^C2YBZ!{S0&Xa==nHTt<XXS>1HBm@j|+G6X>wVUn{zwKXTR43yF z!d}F$!M`;Noomc<IrS{~IS>ZCNKRhoxyplb1;$3ZPRi;e&`f_CD;oh0*S<v@@m&7y z)~R$|N}YX^>Zc3r8a^Gt6gW3>(5?0zh^i^5`Yt0t|Mv#IvVPe1wtYqF9pBq0mWy<t zsy|jZ?H$@4L({uBjlmSg0X3!oQu6+82Ic743_xM-fgE5ab6e`afgljCzx8m*sDju& zJ6Yj${ns&@SB#FIfFE0;Fbju#rx}i^!vUVM5e;I5E1B9B@1_P`cSN9X{F_&b7O9Yw zQ*gf<T31m?oZ=7F!^TRT^Z2+vDO<z(_IGhDQ3+(-R@!hiDX!H*WFRuo!;(nV>V!Z- z7s1og9hQco^+(yrS1E4cF-M1d_?mGrNM186KFkIRElEUDH^?sC-PbSO8_etAO-=3s zU8GNJUEr$6@$DhiNZwu8{_98l#fxSrms9GJL#_>R4C*iX8NNR;ycP!a+8hLltV;6D z<^7!lCYI^iXpJ2i*pHJ)LK?f(8@}YTZ_*Zw*4jYYWn{hpyn8Sz|Gr_e4ayVmXaGWk zvuzy4+H{6;OP?67ZcoOaekKH+q8~!0soJHreftRA&6a_oYauB-0<ql(ZLURr!iYR& z5Yf`wKe1YFSgZnqkkSK{sB|=~e>F46f{~^-gY_4w9{YCP8w3*n^jU&{uthyUNBKD% zOo~)Wm<k&J%nn3`m5;ho!0)uVNsbH`N)_3xRBb>cK>w}FVY*g$UHJYX;^3(;Ii92u zB6+42<;gk$W~Sc%<}H4#Qs>7H3`}9T*1esbKEX(ih%5`M4;h?eRTMDpr}cvA#C`K8 z^u>okgta1)D`~@$(3mH!5~7ztGAHnT&J_FDQZmx%hoEhd<rge~&pfs&5+N1D<?g*+ zn{Ib5-v!5M4YKO?o#onm+LmKZjx+l!SN>KoQ9LI=a$olPp-?@6hXr_}ohxopv`)&g zoLD?&Hiw9E(&>Mu73tUm+f*^;Y?sEaCe-3#VPHs&0vmc5hB5C?NeukV{nS7pMIa!f z>k%m<dd9IVNFzbVEsf8m>%czI2~91^Q&5zK9{vfvpFjQyxUGQyTVMA&q<;cBmU5L? zRg)2AI{|^NGva()RsVc%AGt~7TVk+Bfc{(I_G#>BX>8v-__U&D@<Xwsv_y;z5kDZV zr7Xa!bIY*d;abE5-j~ZhOGIf?JC@lh5mMoW8TYa8G0Fb)lS5EHj@<Ne%E6HBvQM$U z@BWV}C*Xvt4t*$5+LN_zFhX|3k<NXyTB1gipEygCCV)7&oS9xu{9w$gaa9}{#NIeI z;x;JJ@EQ%Q7dF;x?T*W~_o<HvE159}DfWPzZ3zL{+V>8bA_UD_Nm2vL>pya&vDZX4 z4<C8@?Ee_WsSe=SAA(O0DAFNZfBn0k^+1b+qV>Sg)}E{{)_$b+u@q3{zRpcH&fYo` z=j=*S?JZ0%InbQ9IY<{>vjIAIBuMx4(aSD0=d$0?B8cpjW>IK<7D{x#uTvHy%A|BG zr=Y7%e{un^;0Ri86B6=-;x5D@aC1=j4Mbism^L!aFaN8Zvfdpi^PINiVGc_`r@WRO z=x$nNL}vK~kS4^`Stk<fGr~}{l9i$3^~mwwg-OZiN|1O!u6_13EZE}!M5gWJKz5W! zfm+dss+*m5yE6Y$v9PH-ShmDC?exvboO5k20G{VLm+t_6>E%RhmS0luexhardGYAB zbFxXjNqy_9WpCRhJULpWQmg5o=p=5e^SUwHO<)SW4oHN*VQ`8v@RuZzw`Km;&|lA+ zXX%{QINA>hBbQgHYiw$As5z%JuXKFS?Jp?s;gVU(QU=Ej6<gSUTY_f;$73+QX65Me zl^&USbTdPBtQCm)m(AGz;K145<j~?!Ml%9M@^J9B>Z%W_)RR=<A%FD%C`(XO8=oOr zSHhSxq7lU9blUumer};zRi)maF_A--TG1D8qGO8JH<T;ZeUw4yGEinbWj%EnOGv_g zn6*sDX&Q=BSckmMq@O${&T!oS7{@%KbFrWR#PKj!2o-pRkskMdE{K+Ls_m$`D}C@r z^6K`aV`9ZJ4Yu(ZbI^k{3_1}isioaMx4|Eq*AZ`1Pj3=ktK}HXG8uUz>90en5l#`2 z9?Cu7Jr?qsLAr<0j!ZFmq$ITTG=X&P%@<5)jj-z=r?FUco{_^?MS;!ad}jB}HRFa% zqm~|>-~f4_%w&JzxTOA`;>*BqXF#58fZ&y~P6u>L4I!i~4d;N%1O%Ixnr@v`Et2V` zE%hE#Nj`2N;q389=}E;94C0B%0wa!Cb+%4GLgXz@B}JCkwE-6WiwO^b_muh!y7Ezz z6|r>9_qJMY0T-DTY$F^YBN%Ux{O+A|cZyq^;>ddwWKUv{e))c4{TfI|zt7m!7<d9r z`G|}nu#{03I3r_JAQP^#vh{uqo4Sd2oXU9gt;;>v%<`K(M<(5?YiAKsD1j%R=1J<g z1@8*(V>yl4G=@L-@^TYfL;`R_0z)@t!}(n1TpwDdc6yDAZ|~>s$aM2c20lHhBy*q0 zIqq&SZJl@l#E5+*mWk+I0*YM~ok#)GHlgd;8P_Tq3~T=;Xm;1=7v+1s_l|Ee9mfUS z+sbi{XMASiF1!3%B>Fx`DUTD0h6do#H@Qz)5|%nfy((u~7*BO6lD{0^mKo$_voN?x zboO{*7wTg>)aMyJV=;M9U2xIev(VJ;s%44TTjUyMhfqtrfRMVWHBtgo6Kk*+Nv;*J zzktg7Vo6Xl6=o3&CND2LrHXeR1ZEdSn>K}&W!e*a=rR?`SgX^|1jwOnoPI&sf$M;X zTiK+IXuCdKPHngzofz!DIohXizAZ~x0^@5ya3w9<3I=Iw2du9Ym;wU#hn2O1YY`YM zf)KF?KQDFS%3L1ec68pjUkiBduhX$tb<aDtj{V=)^y@XQ|9f?8v>MF({_iy(I1v8t z>(Px@7yj?nD}n$1@z{SC0W66BF2a8o;eYGGe=Fg?mGIw6_}?q=-%9vzCH%J%{zHt% f{(peYOLRuJIzjQtV?QPTu1PHo{Rb8Ip1%2i85I{Q diff --git a/superset-frontend/src/assets/images/timescale.png b/superset-frontend/src/assets/images/timescale.png index 86706ec445db437746c075fba4d49ad02ca482e6..b68fc324bac30678a1641f0ce5bcf50d6dd7729a 100644 GIT binary patch literal 15319 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 E02WZng#Z8m literal 16120 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 QM0J3Qf~I_}tYz^30P0B!<^TWy diff --git a/superset-frontend/src/assets/images/trino.png b/superset-frontend/src/assets/images/trino.png index 904db40bb56c51ad324331776f2d6193dbab5c37..4fda6f84dbb0eead612f8e0e5bcbf1f8c57999af 100644 GIT binary patch literal 10322 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 delta 23237 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 Ms%fj%!fYb`4=&#tiU0rr diff --git a/superset-frontend/src/assets/images/vertica.png b/superset-frontend/src/assets/images/vertica.png index 0bd39498c6e66a1713821ec0c3f1af70e2dfe60c..cf8f0a60b114c86d1f11a46c23d9724fafa1c7b1 100644 GIT binary patch literal 11479 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 D6QdV$ literal 6800 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 YC$-Tnb!*Gae+?&9B~8Ujd5h5h0kx26!T<mO diff --git a/superset-frontend/src/assets/images/yugabyte.png b/superset-frontend/src/assets/images/yugabyte.png index 576dd3848d2990e35472497768862724bb4b0143..89acadb9a92669576a157e02501914f66e1a61d1 100644 GIT binary patch literal 12123 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 VRmMY;g+JThl@&DPE95M~{taiU@7DkT literal 6460 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®Ua^a*~1c79w!A><e{79l^O%*fclpKp&bTw)A9+o`W z;C{fBWW<HX2UxcN6+f*55LZAz@Me^#G!@S-ja2g5j21QFPEMHBe}WTf7zr|Ht% z$wL+$%_$VOiIDd@Ny?}ViQs_hxWv-*O)NN4>nQicg<pexGitjz+(1pGWnr?aq1NJ- zA8K8<ZTlg;r#b<0Xo@PbdrXWCRUsA!YLu}D`=lN-e$ekdK-23jTYx;yXj<#_AF{x| zBh-;_fF?muQ9=Azb#FhGpijI-sNBoRXYZZYAG8~BSFjXWj=!4Np0nEhQdVUTOK$-8 z%hw%oA3@5f;-%h$i5!RyP-gGEJx7=vvUViL!$;o%v8p9&VM0s|fZY`drk@qJ3zmN< zG;BO%JN*cXhAbXOV-H(?CA8XTso0y9;htu_=kM224-KFnaUak(g*=%)YiPvdlg-*d zUpVAQGqjKG(OmmgvdZL0jz<7;W=E9NwpUw?=o9S5k`1CZ$<1Q(5{!#_ruB{DCq=gR z&Xql)1Ug)yU~|@RAf|?dlpejbn);rtVkT;#Q(*Te{{9YG*{AaKi2DoAVY_%Ph8wI? z0FV@A9A(@r^3p`i7-hQ1;fKAdA;0=s0f(kjkGLnOYvi~-%biWSeo7mt+CnrLW)0s+ zl@()K&kSf=?gBdg$r2DPj#}lh0Q<9GTH654f9xSrMuRv5tg%AhZe&hJ!+tVnV9gdA zg`Op<wK6w>9P!}LA<w(&D-Qt8%{*0o3@|_ZQ<!Cl%&xR-*FDc23<j>}^~M{;2;RVl zy<ev`J96VOVL=oE$)_M~lDXH)9xM@3>HAqpQ^z6B4E{$`p<hS?u<FsKtB0J7JR$|d zP1or<t?_KPxnRvl8ZkfsE35+azrjDyY^{&R=p%&H@dh0$UnA&)xk~o?l1gsCYVUvy zRYfzkt#`CV|KCIJ&&RbE#2Uqi)77Sv<+^^*W`ZLg5p3P+bOv=FUZ-O<k9O!|#s2{W W4{mmvD;Z<}0000<MNUMnLSTZj*?|-Q diff --git a/superset-frontend/src/assets/stylesheets/superset.less b/superset-frontend/src/assets/stylesheets/superset.less index 5808d0144bc7..7bf8c27fff60 100644 --- a/superset-frontend/src/assets/stylesheets/superset.less +++ b/superset-frontend/src/assets/stylesheets/superset.less @@ -42,10 +42,6 @@ input.form-control { background-color: @lightest; } -.chart-header a.danger { - color: @danger; -} - .disabledButton { pointer-events: none; } @@ -165,16 +161,6 @@ img.viz-thumb-option { max-height: 700px; } -.chart-header .header-text { - font-size: @font-size-xl; - line-height: 22px; - padding-bottom: 8px; - border-bottom: 1px solid @gray; - margin-top: 10px; - margin-left: 10px; - margin-right: 10px; -} - #is_cached { display: none; } @@ -327,6 +313,10 @@ table.table-no-hover tr:hover { margin-bottom: 10px; } +.m-l-2 { + margin-left: 2px; +} + .m-l-4 { margin-left: 4px; } @@ -355,22 +345,6 @@ table.table-no-hover tr:hover { padding-right: 2; } -/** not found record **/ -.panel b { - display: inline-block; - width: 98%; - padding: 2rem; - margin: 0 1% 20px 1%; - background: @gray-bg; -} - -/** table on both sides of the gap **/ -@media screen and (max-width: 767px) { - .panel .table-responsive { - width: 98%; - } -} - .list-container { position: relative; } diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/Buttons.css b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/Buttons.css new file mode 100644 index 000000000000..3d4c353a0cd3 --- /dev/null +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/Buttons.css @@ -0,0 +1,31 @@ +.Button { + background-color: transparent; + border: solid rgb(137, 137, 137); + border-width: 0 2px 2px 0; + display: inline-block; + padding-right: 3px; + padding-left: 3px; + padding-top: 3px; + padding-bottom: 3px; + vertical-align: middle; + margin-right: 10px; + margin-left: 5px; +} + +.Expand { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); +} + +.Collapse { + transform: rotate(45deg); + -webkit-transform: rotate(45deg); +} + +.Row-Expand { + background-color: transparent; + text-decoration: underline; + vertical-align: middle; + border: none; + color: rgb(31, 167, 201); +} diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/CccsGrid.tsx b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/CccsGrid.tsx index 67167ad1860f..29ebf2ef1499 100644 --- a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/CccsGrid.tsx +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/CccsGrid.tsx @@ -42,6 +42,7 @@ import Ipv4ValueRenderer from './Ipv4ValueRenderer'; import Ipv6ValueRenderer from './Ipv6ValueRenderer'; import DomainValueRenderer from './DomainValueRenderer'; import JsonValueRenderer from './JsonValueRenderer'; +import ExpandAllValueRenderer from './ExpandAllValueRenderer'; import CustomTooltip from './CustomTooltip'; /// / jcc @@ -90,9 +91,11 @@ export default function CccsGrid({ const crossFilterValue = useSelector<RootState, any>( state => state.dataMask[formData.slice_id]?.filterState?.value, ); - - const [selectedDataByColumnName, setSelectedDataColumnName] = useState<{[key: string]: string[] }>(initialFilters); - const [selectedDataByAdvancedType, setselectedDataByAdvancedType] = useState<{[key: string]: string[]}>(initialFilters); + + const [selectedDataByColumnName, setSelectedDataColumnName] = + useState<{ [key: string]: string[] }>(initialFilters); + const [selectedDataByAdvancedType, setselectedDataByAdvancedType] = + useState<{ [key: string]: string[] }>(initialFilters); const [principalColumnFilters, setPrincipalColumnFilters] = useState({}); const [searchValue, setSearchValue] = useState(''); @@ -134,120 +137,125 @@ export default function CccsGrid({ [emitFilter, setDataMask, selectedDataByColumnName, principalColumnFilters], ); // only take relevant page size options - const generateNativeFilterUrlString = (nativefilterID: string, urlSelectedData: any[], column: string = "" ) =>{ - const stringSelectedData = urlSelectedData.map( e => { - return `${e.toString()}` - }) + const generateNativeFilterUrlString = ( + nativefilterID: string, + urlSelectedData: any[], + column: string = '', + ) => { + const stringSelectedData = urlSelectedData.map(e => { + return `${e.toString()}`; + }); const navtiveFilter = { extraFormData: { - filters: [ - {col: column, - op: "IN", - val: stringSelectedData} - ] + filters: [{ col: column, op: 'IN', val: stringSelectedData }], }, filterState: { label: stringSelectedData, validateStatus: false, - value: stringSelectedData + value: stringSelectedData, }, id: nativefilterID, - ownState: {} - } - return navtiveFilter - } - const getJumpToDashboardContextMenuItems = (selectedData: {[key: string]: string[] }, disableOveride: boolean): (string | MenuItemDef)[] => { - - let sub_menu: any = [] + ownState: {}, + }; + return navtiveFilter; + }; + const getJumpToDashboardContextMenuItems = ( + selectedData: { [key: string]: string[] }, + disableOveride: boolean, + ): (string | MenuItemDef)[] => { + let sub_menu: any = []; for (let key in jumpActionConfigs) { - let advancedDataTypeNativeFilters = jumpActionConfigs[key]; let nativeFilterUrls: any = {}; - let jumpActionName: string = "" + let jumpActionName: string = ''; advancedDataTypeNativeFilters.forEach((element: any) => { - jumpActionName = element.name + jumpActionName = element.name; let advancedDataType = element['advancedDataType']; - let nativefilters: any[] = element["nativefilters"]; + let nativefilters: any[] = element['nativefilters']; let selectedDataForUrl = selectedData[advancedDataType]; - + if (selectedDataForUrl && nativefilters) { - nativefilters.forEach( filter => { - nativeFilterUrls[filter["value"]] = generateNativeFilterUrlString(filter["value"], selectedDataForUrl, filter["column"]) + nativefilters.forEach(filter => { + nativeFilterUrls[filter['value']] = generateNativeFilterUrlString( + filter['value'], + selectedDataForUrl, + filter['column'], + ); }); } - }); - - if (Object.keys(nativeFilterUrls).length !== 0){ - + + if (Object.keys(nativeFilterUrls).length !== 0) { let action = () => { - let baseUrl = location.protocol + '//' + location.host; - let url = `${baseUrl}/superset/dashboard/${key}/?native_filters=${rison.encode(nativeFilterUrls)}` + let baseUrl = location.protocol + '//' + location.host; + let url = `${baseUrl}/superset/dashboard/${key}/?native_filters=${rison.encode( + nativeFilterUrls, + )}`; window.open(url, '_blank'); - } - + }; + let DashboardMenuItem = { name: jumpActionName, - action - } - - sub_menu.push(DashboardMenuItem) + action, + }; + + sub_menu.push(DashboardMenuItem); } - } - - const menu = {name: "Jump to dashboard", subMenu: sub_menu, disabled: disableOveride || sub_menu.length < 1, icon: '<span class="ag-icon ag-icon-pivot" unselectable="on" role="presentation"></span>' } - return [ menu ] - } + + const menu = { + name: 'Jump to dashboard', + subMenu: sub_menu, + disabled: disableOveride || sub_menu.length < 1, + icon: '<span class="ag-icon ag-icon-pivot" unselectable="on" role="presentation"></span>', + }; + return [menu]; + }; const getContextMenuItems = useCallback( (params: GetContextMenuItemsParams): (string | MenuItemDef)[] => { - let result: (string | MenuItemDef)[] = []; - result = ['copy', 'copyWithHeaders', 'paste',]; - - if(emitFilter) { - result = result.concat( - [ - 'separator', - { - name: 'Emit Filter(s)', - disabled: params.value === null, - action: () => handleChange(selectedDataByColumnName), - // eslint-disable-next-line theme-colors/no-literal-colors - icon: '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" class=""><path fill-rule="evenodd" clip-rule="evenodd" d="M18.1573 17.864C21.2763 14.745 21.2763 9.66935 18.1573 6.5503C15.0382 3.43125 9.96264 3.43125 6.84359 6.5503L5.42938 5.13609C9.32836 1.2371 15.6725 1.2371 19.5715 5.13609C23.4705 9.03507 23.4705 15.3792 19.5715 19.2782C15.6725 23.1772 9.32836 23.1772 5.42938 19.2782L6.84359 17.864C9.96264 20.9831 15.0375 20.9838 18.1573 17.864ZM2.00035 11.5C2.00035 11.2239 2.2242 11 2.50035 11H5.00035L5.00035 10C5.00035 9.58798 5.47073 9.35279 5.80035 9.60001L9.00035 12C9.17125 12.1032 6.98685 13.637 5.77613 14.4703C5.44613 14.6975 5.00035 14.4601 5.00035 14.0595V13L2.50035 13C2.22421 13 2.00035 12.7761 2.00035 12.5L2.00035 11.5ZM9.67202 9.37873C11.2319 7.81885 13.7697 7.81956 15.3289 9.37873C16.888 10.9379 16.8887 13.4757 15.3289 15.0356C13.769 16.5955 11.2312 16.5948 9.67202 15.0356L8.2578 16.4498C10.5976 18.7896 14.4033 18.7896 16.7431 16.4498C19.0829 14.11 19.0829 10.3043 16.7431 7.96451C14.4033 5.6247 10.5976 5.6247 8.2578 7.96451L9.67202 9.37873Z" fill="#20A7C9"></path></svg>', - }, - { - name: 'Emit Principal Column Filter(s)', - disabled: - ensureIsArray(principalColumns).length === 0 || - Object.keys(principalColumnFilters).some(column => - principalColumnFilters[column].some((val: any) => val === null), - ) || - params.node === null, - action: () => handleChange(principalColumnFilters), - // eslint-disable-next-line theme-colors/no-literal-colors - icon: '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" class=""><path fill-rule="evenodd" clip-rule="evenodd" d="M18.1573 17.864C21.2763 14.745 21.2763 9.66935 18.1573 6.5503C15.0382 3.43125 9.96264 3.43125 6.84359 6.5503L5.42938 5.13609C9.32836 1.2371 15.6725 1.2371 19.5715 5.13609C23.4705 9.03507 23.4705 15.3792 19.5715 19.2782C15.6725 23.1772 9.32836 23.1772 5.42938 19.2782L6.84359 17.864C9.96264 20.9831 15.0375 20.9838 18.1573 17.864ZM2.00035 11.5C2.00035 11.2239 2.2242 11 2.50035 11H5.00035L5.00035 10C5.00035 9.58798 5.47073 9.35279 5.80035 9.60001L9.00035 12C9.17125 12.1032 6.98685 13.637 5.77613 14.4703C5.44613 14.6975 5.00035 14.4601 5.00035 14.0595V13L2.50035 13C2.22421 13 2.00035 12.7761 2.00035 12.5L2.00035 11.5ZM9.67202 9.37873C11.2319 7.81885 13.7697 7.81956 15.3289 9.37873C16.888 10.9379 16.8887 13.4757 15.3289 15.0356C13.769 16.5955 11.2312 16.5948 9.67202 15.0356L8.2578 16.4498C10.5976 18.7896 14.4033 18.7896 16.7431 16.4498C19.0829 14.11 19.0829 10.3043 16.7431 7.96451C14.4033 5.6247 10.5976 5.6247 8.2578 7.96451L9.67202 9.37873Z" fill="#20A7C9"></path></svg>', - }, - { - name: 'Clear Emitted Filter(s)', - disabled: crossFilterValue === undefined, - action: () => dispatch(clearDataMask(formData.slice_id)), - icon: '<span class="ag-icon ag-icon-cross" unselectable="on" role="presentation"></span>', - }, - ] - ) - } - result = result.concat( - getJumpToDashboardContextMenuItems(selectedDataByAdvancedType, (params.value === null)) - ) - result = result.concat( - [ + result = ['copy', 'copyWithHeaders', 'paste']; + + if (emitFilter) { + result = result.concat([ 'separator', - 'export' - ] - ) - + { + name: 'Emit Filter(s)', + disabled: + params.value === null || 'undefined' in selectedDataByColumnName, + action: () => handleChange(selectedDataByColumnName), + // eslint-disable-next-line theme-colors/no-literal-colors + icon: '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" class=""><path fill-rule="evenodd" clip-rule="evenodd" d="M18.1573 17.864C21.2763 14.745 21.2763 9.66935 18.1573 6.5503C15.0382 3.43125 9.96264 3.43125 6.84359 6.5503L5.42938 5.13609C9.32836 1.2371 15.6725 1.2371 19.5715 5.13609C23.4705 9.03507 23.4705 15.3792 19.5715 19.2782C15.6725 23.1772 9.32836 23.1772 5.42938 19.2782L6.84359 17.864C9.96264 20.9831 15.0375 20.9838 18.1573 17.864ZM2.00035 11.5C2.00035 11.2239 2.2242 11 2.50035 11H5.00035L5.00035 10C5.00035 9.58798 5.47073 9.35279 5.80035 9.60001L9.00035 12C9.17125 12.1032 6.98685 13.637 5.77613 14.4703C5.44613 14.6975 5.00035 14.4601 5.00035 14.0595V13L2.50035 13C2.22421 13 2.00035 12.7761 2.00035 12.5L2.00035 11.5ZM9.67202 9.37873C11.2319 7.81885 13.7697 7.81956 15.3289 9.37873C16.888 10.9379 16.8887 13.4757 15.3289 15.0356C13.769 16.5955 11.2312 16.5948 9.67202 15.0356L8.2578 16.4498C10.5976 18.7896 14.4033 18.7896 16.7431 16.4498C19.0829 14.11 19.0829 10.3043 16.7431 7.96451C14.4033 5.6247 10.5976 5.6247 8.2578 7.96451L9.67202 9.37873Z" fill="#20A7C9"></path></svg>', + }, + { + name: 'Emit Principal Column Filter(s)', + disabled: + ensureIsArray(principalColumns).length === 0 || + Object.keys(principalColumnFilters).some(column => + principalColumnFilters[column].some((val: any) => val === null), + ) || + params.node === null, + action: () => handleChange(principalColumnFilters), + // eslint-disable-next-line theme-colors/no-literal-colors + icon: '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" class=""><path fill-rule="evenodd" clip-rule="evenodd" d="M18.1573 17.864C21.2763 14.745 21.2763 9.66935 18.1573 6.5503C15.0382 3.43125 9.96264 3.43125 6.84359 6.5503L5.42938 5.13609C9.32836 1.2371 15.6725 1.2371 19.5715 5.13609C23.4705 9.03507 23.4705 15.3792 19.5715 19.2782C15.6725 23.1772 9.32836 23.1772 5.42938 19.2782L6.84359 17.864C9.96264 20.9831 15.0375 20.9838 18.1573 17.864ZM2.00035 11.5C2.00035 11.2239 2.2242 11 2.50035 11H5.00035L5.00035 10C5.00035 9.58798 5.47073 9.35279 5.80035 9.60001L9.00035 12C9.17125 12.1032 6.98685 13.637 5.77613 14.4703C5.44613 14.6975 5.00035 14.4601 5.00035 14.0595V13L2.50035 13C2.22421 13 2.00035 12.7761 2.00035 12.5L2.00035 11.5ZM9.67202 9.37873C11.2319 7.81885 13.7697 7.81956 15.3289 9.37873C16.888 10.9379 16.8887 13.4757 15.3289 15.0356C13.769 16.5955 11.2312 16.5948 9.67202 15.0356L8.2578 16.4498C10.5976 18.7896 14.4033 18.7896 16.7431 16.4498C19.0829 14.11 19.0829 10.3043 16.7431 7.96451C14.4033 5.6247 10.5976 5.6247 8.2578 7.96451L9.67202 9.37873Z" fill="#20A7C9"></path></svg>', + }, + { + name: 'Clear Emitted Filter(s)', + disabled: crossFilterValue === undefined, + action: () => dispatch(clearDataMask(formData.slice_id)), + icon: '<span class="ag-icon ag-icon-cross" unselectable="on" role="presentation"></span>', + }, + ]); + } + result = result.concat( + getJumpToDashboardContextMenuItems( + selectedDataByAdvancedType, + params.value === null, + ), + ); + result = result.concat(['separator', 'export']); + return result; }, [ @@ -262,12 +270,67 @@ export default function CccsGrid({ ], ); + const getMainMenuItems = useCallback(params => { + // If the column currently selected has either JSON data, or the + // expand all button for the row, add extra options + if ( + params.column.colDef.cellRenderer === 'jsonValueRenderer' || + params.column.colDef.cellRenderer === 'expandAllValueRenderer' + ) { + // Get the default menu items so we can add to them + const jsonMenuItems = params.defaultItems.slice(0); + + // Get all of the cell renderers and the current column ID + const instances = params.api.getCellRendererInstances(); + const columnID = params.column.colId; + + // Only keep cells which belong to the current column + const newInstances = instances.filter( + (instance: any) => instance.params.column.colId === columnID, + ); + + // Add an expand all button which will send an update to each cell renderer + jsonMenuItems.push({ + name: + params.column.colDef.cellRenderer === 'jsonValueRenderer' + ? 'Expand Column' + : 'Expand All', + action: () => { + newInstances.map((instance: any) => + instance.componentInstance.updateState(true), + ); + }, + }); + + // Add a collapse all button which will send an update to each cell renderer + jsonMenuItems.push({ + name: + params.column.colDef.cellRenderer === 'jsonValueRenderer' + ? 'Collapse Column' + : 'Collapse All', + action: () => { + newInstances.map((instance: any) => + instance.componentInstance.updateState(false), + ); + }, + }); + + // Return the default menu with added options (expand/collapse) + return jsonMenuItems; + } + + // If the column currently selected has neither JSON data, nor the + // expand all button for the row, use the regular menu + return params.defaultItems; + }, []); + const frameworkComponents = { countryValueRenderer: CountryValueRenderer, ipv4ValueRenderer: Ipv4ValueRenderer, ipv6ValueRenderer: Ipv6ValueRenderer, domainValueRenderer: DomainValueRenderer, jsonValueRenderer: JsonValueRenderer, + expandAllValueRenderer: ExpandAllValueRenderer, customTooltip: CustomTooltip, }; @@ -284,6 +347,21 @@ export default function CccsGrid({ } }; + const onFirstDataRendered = (params: any) => { + // Get all of the columns in the grid + const instances = params.columnApi.getAllColumns(); + + // Filter on columns that have JSON data + const newInstances = instances.filter( + (instance: any) => instance.colDef?.cellRenderer === 'jsonValueRenderer', + ); + + // Set the columns which have JSON data to be 350 pixels wide + newInstances.map((instance: any) => + params.columnApi.setColumnWidth(instance.colId, 350), + ); + }; + const onSelectionChanged = (params: any) => { const gridApi = params.api; const selectedRows = gridApi.getSelectedRows(); @@ -298,22 +376,24 @@ export default function CccsGrid({ const gridApi = params.api; const cellRanges = gridApi.getCellRanges(); - - const updatedSelectedData: {[key: string]: string[] } = {}; - const newSelectedbyAdvancedType: {[key: string]: string[] } = {}; - const updatedPrincipalColumnFilters = {}; + const updatedSelectedData: { [key: string]: string[] } = {}; + const newSelectedbyAdvancedType: { [key: string]: string[] } = {}; + const updatedPrincipalColumnFilters = {}; cellRanges.forEach((range: any) => { range.columns.forEach((column: any) => { const col = getEmitTarget(column.colDef?.field); - let advancedDataType = datasetColumns.find( (column) => { return column.column_name == col })?.advanced_data_type || "" - + let advancedDataType = + datasetColumns.find(column => { + return column.column_name == col; + })?.advanced_data_type || ''; updatedSelectedData[col] = updatedSelectedData[col] || []; - - newSelectedbyAdvancedType[advancedDataType] = newSelectedbyAdvancedType[advancedDataType] || [] - + + newSelectedbyAdvancedType[advancedDataType] = + newSelectedbyAdvancedType[advancedDataType] || []; + const startRow = Math.min( range.startRow.rowIndex, range.endRow.rowIndex, @@ -321,27 +401,35 @@ export default function CccsGrid({ const endRow = Math.max(range.startRow.rowIndex, range.endRow.rowIndex); for (let rowIndex = startRow; rowIndex <= endRow; rowIndex++) { + const rowNode = gridApi.getModel().getRow(rowIndex); + const value = gridApi.getValue(column, rowNode); + + const valueRendererName = column.colDef.cellRenderer; + let valueRendererObjt = null; + let renderedValue = null; - const rowNode = gridApi.getModel().getRow(rowIndex) - const value = gridApi.getValue( - column, - rowNode, - ); - - const valueRendererName = column.colDef.cellRenderer - let valueRendererObjt = null - let renderedValue = null - if (valueRendererName) { - const valueRenderer = valueRendererName ? frameworkComponents[valueRendererName] : undefined - valueRendererObjt = new valueRenderer({value, valueFormatted: null}) + const valueRenderer = valueRendererName + ? frameworkComponents[valueRendererName] + : undefined; + valueRendererObjt = new valueRenderer({ + value, + valueFormatted: null, + }); } - renderedValue = valueRendererObjt ? valueRendererObjt.render() : value + renderedValue = valueRendererObjt + ? valueRendererObjt.render() + : value; if (!updatedSelectedData[col].includes(value)) { updatedSelectedData[col].push(value); } - if (!newSelectedbyAdvancedType[advancedDataType].includes(renderedValue) && renderedValue) { + if ( + !newSelectedbyAdvancedType[advancedDataType].includes( + renderedValue, + ) && + renderedValue + ) { newSelectedbyAdvancedType[advancedDataType].push(renderedValue); } } @@ -479,7 +567,9 @@ export default function CccsGrid({ gridOptions={gridOptions} onGridColumnsChanged={autoSizeFirst100Columns} getContextMenuItems={getContextMenuItems} + getMainMenuItems={getMainMenuItems} onGridReady={onGridReady} + onFirstDataRendered={onFirstDataRendered} onRangeSelectionChanged={onRangeSelectionChanged} onSelectionChanged={onSelectionChanged} rowData={rowData} diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/ExpandAllValueRenderer.tsx b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/ExpandAllValueRenderer.tsx new file mode 100644 index 000000000000..faf7265ea24f --- /dev/null +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/ExpandAllValueRenderer.tsx @@ -0,0 +1,118 @@ +import { GroupCellRenderer } from '@ag-grid-enterprise/all-modules'; +import React, { Component } from 'react'; +import './Buttons.css'; + +// Show a button to collapse all of the JSON blobs in the row +function collapseJSON(this: any, reverseState: any) { + return ( + <button className="Row-Expand" type="button" onClick={reverseState}> + Collapse Row + </button> + ); +} + +// Show a button to expand all of the JSON blobs in the row +function expandJSON(this: any, reverseState: any) { + return ( + <> + <button className="Row-Expand" type="button" onClick={reverseState}> + Expand Row + </button> + </> + ); +} + +export default class ExpandAllValueRenderer extends Component< + {}, + { api: any; expanded: boolean; rowIndex: number } +> { + constructor(props: any) { + super(props); + + this.state = { + api: props.api, + expanded: false, + rowIndex: props.rowIndex, + }; + } + + // Get all of the cells in the AG Grid and only keep the ones that + // are in the same row as the current expand all button, and make + // sure that they have a JSON blob + getJSONCells = () => { + const instances = this.state.api.getCellRendererInstances(); + + // Make sure row grouping is not enabled, but if it is, don't + // try to find all of the JSON blobs in the row + if ( + instances.filter((instance: any) => instance instanceof GroupCellRenderer) + .length === 0 + ) { + const newInstances = instances.filter( + (instance: any) => + instance.params.rowIndex === this.state.rowIndex && + instance.params.column.colDef.cellRenderer === 'jsonValueRenderer', + ); + + return newInstances; + } + return []; + }; + + // Set the current `expanded` field to the opposite of what it currently is + // as well as go through each cell renderer and if it's in the same row & + // it's a cell with a JSON blob, update whether it is expanded or not + reverseState = () => { + this.setState(prevState => ({ + ...prevState, + expanded: !prevState.expanded, + })); + + const newInstances = this.getJSONCells(); + + newInstances.map((instance: any) => + instance.componentInstance.updateState(!this.state.expanded), + ); + }; + + // Set the current `expanded` field to be equal to the boolean being passed in + // as well as go through each cell renderer and if it's in the same row & + // it's a cell with a JSON blob, update whether it is expanded or not + updateState = (newFlag: any) => { + this.setState(prevState => ({ ...prevState, expanded: newFlag })); + + const newInstances = this.getJSONCells(); + + newInstances.map((instance: any) => + instance.componentInstance.updateState(newFlag), + ); + }; + + // Get all of the cells in the AG Grid and only keep the ones + // that are in the same row as the current expand all button and + // make sure that they have a JSON blob (and see whether they are + // expanded or not) + checkState = () => { + const newInstances = this.getJSONCells(); + + const jsonCellExpandedValues = newInstances.map((instance: any) => + instance.componentInstance.getExpandedValue(), + ); + + // If there is at least one cell that can expand, the expand all + // button for the row should show 'Expand' + this.setState(prevState => ({ + ...prevState, + expanded: !jsonCellExpandedValues.includes(false), + })); + }; + + // Show either the expand or collapse button dependent + // on the value of the `expanded` field + render() { + if (this.state.expanded === false) { + return expandJSON(this.reverseState); + } + return collapseJSON(this.reverseState); + } +} diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/JsonValueRenderer.tsx b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/JsonValueRenderer.tsx index 3eb8342010e9..c5f34ad72c7f 100644 --- a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/JsonValueRenderer.tsx +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/JsonValueRenderer.tsx @@ -1,28 +1,8 @@ +import { GroupCellRenderer } from '@ag-grid-enterprise/all-modules'; import React, { Component } from 'react'; -import ModalTrigger from 'src/components/ModalTrigger'; -import JSONTree from 'react-json-tree'; -import Button from 'src/components/Button'; -import CopyToClipboard from 'src/components/CopyToClipboard'; +import { JSONTree } from 'react-json-tree'; -const JSON_TREE_THEME = { - scheme: 'monokai', - base00: '#272822', - base01: '#383830', - base02: '#49483e', - base03: '#75715e', - base04: '#a59f85', - base05: '#f8f8f2', - base06: '#f5f4f1', - base07: '#f9f8f5', - base08: '#f92672', - base09: '#fd971f', - base0A: '#f4bf75', - base0B: '#a6e22e', - base0C: '#a1efe4', - base0D: '#66d9ef', - base0E: '#ae81ff', - base0F: '#cc6633', -}; +import './Buttons.css'; function safeJsonObjectParse( data: unknown, @@ -48,34 +28,60 @@ function safeJsonObjectParse( } } -function addJsonModal( - node: React.ReactNode, - jsonObject: Record<string, unknown> | unknown[], - jsonString: String, -) { +// JSX which shows the JSON tree inline, and a button to collapse it +function collapseJSON(this: any, reverseState: any, jsonObject: any) { return ( - <ModalTrigger - modalBody={<JSONTree data={jsonObject} theme={JSON_TREE_THEME} />} - modalFooter={ - <Button> - <CopyToClipboard shouldShowText={false} text={jsonString} /> - </Button> - } - modalTitle="Cell content as JSON" - triggerNode={node} - /> + <> + <div style={{ float: 'left' }}> + <button + className="Button Collapse" + type="button" + title="Collapse" + onClick={reverseState} + > + {' '} + </button> + </div> + <div style={{ float: 'left' }}> + <JSONTree + data={jsonObject} + theme="default" + shouldExpandNode={() => true} + /> + </div> + </> + ); +} + +// JSX which shows the JSON data on one line, and a button to open the JSON tree +function expandJSON(this: any, reverseState: any, cellData: any) { + return ( + <> + <button + className="Button Expand" + type="button" + title="Expand" + onClick={reverseState} + > + {' '} + </button> + {cellData} + </> ); } export default class JsonValueRenderer extends Component< {}, - { cellValue: any } + { api: any; cellValue: any; expanded: boolean; rowIndex: number } > { constructor(props: any) { super(props); this.state = { + api: props.api, cellValue: JsonValueRenderer.getValueToDisplay(props), + expanded: false, + rowIndex: props.rowIndex, }; } @@ -86,14 +92,56 @@ export default class JsonValueRenderer extends Component< }; } + // Set the current `expanded` field to the opposite of what it currently is + // and trigger the 'checkState` function in the expand all button for the row + reverseState = () => { + this.setState( + prevState => ({ ...prevState, expanded: !prevState.expanded }), + () => { + const instances = this.state.api.getCellRendererInstances(); + + // Make sure row grouping is not enabled, but if it is, don't + // trigger the 'checkState` function in the expand all button for the row + if ( + instances.filter( + (instance: any) => instance instanceof GroupCellRenderer, + ).length === 0 + ) { + instances + .filter( + (instance: any) => + instance.params.rowIndex === this.state.rowIndex && + instance.params.column.colDef.cellRenderer === + 'expandAllValueRenderer', + ) + .map((instance: any) => instance.componentInstance.checkState()); + } + }, + ); + }; + + // Take the boolean value passed in and set the `expanded` field equal to it + updateState = (newFlag: any) => { + this.setState(prevState => ({ ...prevState, expanded: newFlag })); + }; + + // Return whether 'expanded' is set to true or false + getExpandedValue = () => this.state.expanded; + render() { const cellData = this.state.cellValue; const jsonObject = safeJsonObjectParse(this.state.cellValue); - const cellNode = <div>{cellData}</div>; + + // If there is a JSON object, either show it expanded or collapsed based + // on the value which the `expanded` field is set to if (jsonObject) { - return addJsonModal(cellNode, jsonObject, cellData); + if (this.state.expanded === false) { + return expandJSON(this.reverseState, cellData); + } + return collapseJSON(this.reverseState, jsonObject); } - return cellData ?? null; + // If the cellData is set to 'null' or undefined, return null + return cellData !== 'null' && cellData !== undefined ? cellData : null; } static getValueToDisplay(params: { valueFormatted: any; value: any }) { diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/components/controls/JumpActionConfigControll/JumpActionConfig.tsx b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/components/controls/JumpActionConfigControll/JumpActionConfig.tsx index 30221152c8e2..14c348152cf1 100644 --- a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/components/controls/JumpActionConfigControll/JumpActionConfig.tsx +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/components/controls/JumpActionConfigControll/JumpActionConfig.tsx @@ -1,202 +1,204 @@ -import React, { useState, useCallback, useEffect } from "react"; +import React, { useState, useCallback, useEffect } from 'react'; import SelectControl from 'src/explore/components/controls/SelectControl'; import { bootstrapData } from 'src/preamble'; import Button from 'src/components/Button'; import { - t, - SupersetClient, - validateNonEmpty, - withTheme, - SupersetTheme - } from '@superset-ui/core'; - - - + t, + SupersetClient, + validateNonEmpty, + withTheme, + SupersetTheme, +} from '@superset-ui/core'; interface Props { - dashboardID: number; - filters: any[]; - advancedDataType: string; - error: string; - visiblePopoverIndex: number; - close: () => void; - addDrillActionConfig: (drillactionConfig: any) => boolean; - removeDrillActionConfig: () => boolean + dashboardID: number; + filters: any[]; + advancedDataType: string; + error: string; + visiblePopoverIndex: number; + close: () => void; + addDrillActionConfig: (drillactionConfig: any) => boolean; + removeDrillActionConfig: () => boolean; } const useDashboardState = () => { - - const [dashboardList, setDashboardList] = useState([]); - - const [filterList, setFilterList] = useState([]); - - const fetchDashboardList = useCallback(() => { - const endpoint = `/api/v1/dashboard`; - SupersetClient.get({ endpoint }).then( - ({json}) => { - const dashboards = json.result.filter( (e: any) => { - return JSON.parse((e.json_metadata))?.native_filter_configuration - }) - .map( (e: any) => { - return {value: e.id, label: e.dashboard_title } - }) - setDashboardList(dashboards) - } - ).catch(error => {}); - }, []) - - const fetchFilterList = useCallback((dashboardId: number) => { - const endpoint = `/api/v1/dashboard/${dashboardId}`; - if(dashboardId < 0 ) - return - SupersetClient.get({ endpoint }).then( - ({json}) => { - const metadata = JSON.parse((json.result.json_metadata)) - - setFilterList(metadata?.native_filter_configuration.map( (e: any) => { - return {value: e.id, label: e.name, column: e?.targets[0].column?.name || "" } - })) - - } - ).catch(error => {}); - }, []) - - return { - dashboardList, - filterList, - fetchDashboardList, - fetchFilterList, - } -} - -const DrillActionConfig: React.FC<Props> = (props : Props) => { - const {dashboardID, filters, advancedDataType, visiblePopoverIndex } = props - - const {dashboardList, filterList, fetchDashboardList, fetchFilterList} = useDashboardState() - - const [selectedDashboardID, setSelectedDashboardID] = useState<number>(dashboardID) - - const [selectedFilters, setSelectedFilters] = useState(filters?.map( (filter: any) => filter.value) || []) - - - const [advancedDataTypeName, setAdvancedDataTypeName] = useState<string>(advancedDataType) - - const [state, setState] = useState({ - isNew: !props.dashboardID, - }) - - useEffect (()=> { - setSelectedFilters(filters?.map( (filter: any) => filter.value) || []) - setSelectedDashboardID(dashboardID) - setAdvancedDataTypeName(advancedDataType) - }, [dashboardID, filters, advancedDataType, visiblePopoverIndex] - - ) - useEffect(() => { - fetchDashboardList() - },[fetchDashboardList] ) - - useEffect(() => { - fetchFilterList(selectedDashboardID) - }, [fetchFilterList, selectedDashboardID]) - - - const isValidForm = () => { - const errors = [ - validateNonEmpty(selectedDashboardID), - validateNonEmpty(selectedFilters), - validateNonEmpty(advancedDataTypeName), - ]; - return !errors.filter(x => x).length; - } - const applyDrillActionConfig = () => { - - if (isValidForm()) { - const element: any = (dashboardList || []).find( - (e: any) => e.value === selectedDashboardID - ) - const advancedDataTypeNameLabel = bootstrapData?.common?.advanced_data_types.find( (e: { id: string; }) => e.id === advancedDataTypeName)?.verbose_name || advancedDataTypeName - const selectedFiltersWithColumn = filterList.filter( (filter: any) => selectedFilters.includes(filter.value) ) - const name = `${ element?.label } | ${ advancedDataTypeNameLabel }` - const newDrillActionConfig = { - dashboardID: selectedDashboardID, - filters: selectedFiltersWithColumn, - dashBoardName: element?.label || "", - advancedDataType: advancedDataTypeName, - name - } - props.addDrillActionConfig(newDrillActionConfig) - setState({...state, isNew: false}) - props.close() - } + const [dashboardList, setDashboardList] = useState([]); + + const [filterList, setFilterList] = useState([]); + + const fetchDashboardList = useCallback(() => { + const endpoint = `/api/v1/dashboard`; + SupersetClient.get({ endpoint }) + .then(({ json }) => { + const dashboards = json.result + .filter( + (e: any) => + JSON.parse(e.json_metadata)?.native_filter_configuration, + ) + .map((e: any) => ({ value: e.id, label: e.dashboard_title })); + setDashboardList(dashboards); + }) + .catch(error => {}); + }, []); + + const fetchFilterList = useCallback((dashboardId: number) => { + const endpoint = `/api/v1/dashboard/${dashboardId}`; + if (dashboardId < 0) return; + SupersetClient.get({ endpoint }) + .then(({ json }) => { + const metadata = JSON.parse(json.result.json_metadata); + + setFilterList( + metadata?.native_filter_configuration.map((e: any) => ({ + value: e.id, + label: e.name, + column: e?.targets[0].column?.name || '', + })), + ); + }) + .catch(error => {}); + }, []); + + return { + dashboardList, + filterList, + fetchDashboardList, + fetchFilterList, + }; +}; + +const DrillActionConfig: React.FC<Props> = (props: Props) => { + const { dashboardID, filters, advancedDataType, visiblePopoverIndex } = props; + + const { dashboardList, filterList, fetchDashboardList, fetchFilterList } = + useDashboardState(); + + const [selectedDashboardID, setSelectedDashboardID] = + useState<number>(dashboardID); + + const [selectedFilters, setSelectedFilters] = useState( + filters?.map((filter: any) => filter.value) || [], + ); + + const [advancedDataTypeName, setAdvancedDataTypeName] = + useState<string>(advancedDataType); + + const [state, setState] = useState({ + isNew: !props.dashboardID, + }); + + useEffect(() => { + setSelectedFilters(filters?.map((filter: any) => filter.value) || []); + setSelectedDashboardID(dashboardID); + setAdvancedDataTypeName(advancedDataType); + }, [dashboardID, filters, advancedDataType, visiblePopoverIndex]); + useEffect(() => { + fetchDashboardList(); + }, [fetchDashboardList]); + + useEffect(() => { + fetchFilterList(selectedDashboardID); + }, [fetchFilterList, selectedDashboardID]); + + const isValidForm = () => { + const errors = [ + validateNonEmpty(selectedDashboardID), + validateNonEmpty(selectedFilters), + validateNonEmpty(advancedDataTypeName), + ]; + return !errors.filter(x => x).length; + }; + const applyDrillActionConfig = () => { + if (isValidForm()) { + const element: any = (dashboardList || []).find( + (e: any) => e.value === selectedDashboardID, + ); + const advancedDataTypeNameLabel = + bootstrapData?.common?.advanced_data_types.find( + (e: { id: string }) => e.id === advancedDataTypeName, + )?.verbose_name || advancedDataTypeName; + const selectedFiltersWithColumn = filterList.filter((filter: any) => + selectedFilters.includes(filter.value), + ); + const name = `${element?.label} | ${advancedDataTypeNameLabel}`; + const newDrillActionConfig = { + dashboardID: selectedDashboardID, + filters: selectedFiltersWithColumn, + dashBoardName: element?.label || '', + advancedDataType: advancedDataTypeName, + name, + }; + props.addDrillActionConfig(newDrillActionConfig); + setState({ ...state, isNew: false }); + props.close(); } - - const onDashboardChange = (v: any) => { - setSelectedDashboardID(v) - setSelectedFilters([]) - } - return( - <div style={{ width: 400 }}> - <div style={{ width: '9000', paddingBottom: 25 }}> - <SelectControl - css={(theme: SupersetTheme) => ({ marginBottom: theme.gridUnit * 4 })} - ariaLabel={t('Annotation layer value')} - name="annotation-layer-value" - label={t('DashBoard')} - showHeader - hovered - placeholder="" - options={dashboardList} - value={selectedDashboardID} - onChange={onDashboardChange} - /> - <SelectControl - style = {{length: '100%'}} - ariaLabel={'Advanced Data Type'} - name="advanced-data-type-value" - label={'Advanced Data Type'} - showHeader - hovered - freeForm - placeholder="" - options={ bootstrapData?.common?.advanced_data_types.map( - ( v: { id: any; verbose_name: any; }) => ({ - value: v.id, - label: v.verbose_name, - }))} - value={advancedDataTypeName} - onChange={setAdvancedDataTypeName} - /> - <SelectControl - ariaLabel={t('Annotation layer value')} - name="annotation-layer-value" - label={t('Filters')} - showHeader - hovered - multi - placeholder="" - options={filterList} - value={selectedFilters} - onChange={setSelectedFilters} - /> - </div> - <div style={{ display: 'flex', justifyContent: 'space-between' }}> - <Button buttonSize="small" onClick={() => props.close()}> - {t('Cancel')} - </Button> - <div> - - <Button - buttonSize="small" - buttonStyle="primary" - disabled={!isValidForm()} - onClick={applyDrillActionConfig} - > - {t('OK')} - </Button> - </div> + }; + + const onDashboardChange = (v: any) => { + setSelectedDashboardID(v); + setSelectedFilters([]); + }; + return ( + <div style={{ width: 400 }}> + <div style={{ width: '9000', paddingBottom: 25 }}> + <SelectControl + css={(theme: SupersetTheme) => ({ marginBottom: theme.gridUnit * 4 })} + ariaLabel={t('Annotation layer value')} + name="annotation-layer-value" + label={t('DashBoard')} + showHeader + hovered + placeholder="" + options={dashboardList} + value={selectedDashboardID} + onChange={onDashboardChange} + /> + <SelectControl + style={{ length: '100%' }} + ariaLabel="Advanced Data Type" + name="advanced-data-type-value" + label="Advanced Data Type" + showHeader + hovered + freeForm + placeholder="" + options={bootstrapData?.common?.advanced_data_types.map( + (v: { id: any; verbose_name: any }) => ({ + value: v.id, + label: v.verbose_name, + }), + )} + value={advancedDataTypeName} + onChange={setAdvancedDataTypeName} + /> + <SelectControl + ariaLabel={t('Annotation layer value')} + name="annotation-layer-value" + label={t('Filters')} + showHeader + hovered + multi + placeholder="" + options={filterList} + value={selectedFilters} + onChange={setSelectedFilters} + /> + </div> + <div style={{ display: 'flex', justifyContent: 'space-between' }}> + <Button buttonSize="small" onClick={() => props.close()}> + {t('Cancel')} + </Button> + <div> + <Button + buttonSize="small" + buttonStyle="primary" + disabled={!isValidForm()} + onClick={applyDrillActionConfig} + > + {t('OK')} + </Button> </div> - </div> - ); - -} -export default withTheme(DrillActionConfig); \ No newline at end of file + </div> + </div> + ); +}; +export default withTheme(DrillActionConfig); diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/components/controls/JumpActionConfigControll/index.tsx b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/components/controls/JumpActionConfigControll/index.tsx index 018c354bf46f..3cd912603080 100644 --- a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/components/controls/JumpActionConfigControll/index.tsx +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/components/controls/JumpActionConfigControll/index.tsx @@ -22,27 +22,27 @@ import CustomListItem from 'src/explore/components/controls/CustomListItem'; import { t, withTheme } from '@superset-ui/core'; import AsyncEsmComponent from 'src/components/AsyncEsmComponent'; import { List } from 'src/components'; -import ControlPopover from 'src/explore/components/controls/ControlPopover/ControlPopover' +import ControlPopover from 'src/explore/components/controls/ControlPopover/ControlPopover'; import { connect } from 'react-redux'; import { HeaderContainer, LabelsContainer, -} from 'src/explore/components/controls/OptionControls' +} from 'src/explore/components/controls/OptionControls'; import ControlHeader from 'src/explore/components/ControlHeader'; export interface Props { - colorScheme: string; - annotationError: object; - annotationQuery: object; - vizType: string; - theme: any; - validationErrors: string[]; - name: string; - actions: object; - label: string; - value?: object[]; - onChange: (a: any) => void, -}; + colorScheme: string; + annotationError: object; + annotationQuery: object; + vizType: string; + theme: any; + validationErrors: string[]; + name: string; + actions: object; + label: string; + value?: object[]; + onChange: (a: any) => void; +} const DrillActionConfig = AsyncEsmComponent( () => import('./JumpActionConfig'), @@ -50,143 +50,147 @@ const DrillActionConfig = AsyncEsmComponent( () => <div style={{ width: 450, height: 368 }} />, ); - - const DrillActionConfigControl: React.FC<Props> = ( - { - colorScheme, - annotationError, - annotationQuery, - vizType, - theme, - validationErrors, - name, - actions, - onChange, - value = [], - ...props - } - ) => - { - // Need to bind function - // Need to preload - const [state, setState] = useState({ - handleVisibleChange: {}, - addedDrillActionConfigIndex: -1, - }); - - const [visiblePopoverIndex, setVisiblePopoverindex] = useState<string | number>(-1) - - const addDrillActionConfig = (originalDrillActionConfig: any, newDrillActionConfig: any) => - { - let drillActionConfigs = value; - if (drillActionConfigs.includes(originalDrillActionConfig)) { - drillActionConfigs = drillActionConfigs.map(anno => - anno === originalDrillActionConfig ? newDrillActionConfig : anno, - ); - } else { - drillActionConfigs = [...drillActionConfigs, newDrillActionConfig]; - setState({...state, addedDrillActionConfigIndex: drillActionConfigs.length - 1 }); - } - onChange(drillActionConfigs); - } - - - const handleVisibleChange = (visible: any, popoverKey: string | number) => { - setVisiblePopoverindex(visible ? popoverKey: -1) - } - - const removeDrillActionConfig = (drillActionConfig: any) => { - const annotations = value.filter(anno => anno !== drillActionConfig); - onChange(annotations); - } - const renderPopover = (popoverKey: string | number, drillActionConfig: any, error: string = "") => { - const id = drillActionConfig?.name || '_new'; - - return ( - <div id={`annotation-pop-${id}`} data-test="popover-content"> - <DrillActionConfig - {...drillActionConfig} - error={error} - visiblePopoverIndex={visiblePopoverIndex} - addDrillActionConfig={(newAnnotation: any) => - addDrillActionConfig(drillActionConfig, newAnnotation) - } - removeDrillActionConfig={() => removeDrillActionConfig(drillActionConfig)} - close={() => { - handleVisibleChange(false, popoverKey); - setState({...state, addedDrillActionConfigIndex: -1 }); - }} - visi - /> - </div> +const DrillActionConfigControl: React.FC<Props> = ({ + colorScheme, + annotationError, + annotationQuery, + vizType, + theme, + validationErrors, + name, + actions, + onChange, + value = [], + ...props +}) => { + // Need to bind function + // Need to preload + const [state, setState] = useState({ + handleVisibleChange: {}, + addedDrillActionConfigIndex: -1, + }); + + const [visiblePopoverIndex, setVisiblePopoverindex] = useState< + string | number + >(-1); + + const addDrillActionConfig = ( + originalDrillActionConfig: any, + newDrillActionConfig: any, + ) => { + let drillActionConfigs = value; + if (drillActionConfigs.includes(originalDrillActionConfig)) { + drillActionConfigs = drillActionConfigs.map(anno => + anno === originalDrillActionConfig ? newDrillActionConfig : anno, ); + } else { + drillActionConfigs = [...drillActionConfigs, newDrillActionConfig]; + setState({ + ...state, + addedDrillActionConfigIndex: drillActionConfigs.length - 1, + }); } + onChange(drillActionConfigs); + }; - const { addedDrillActionConfigIndex } = state; - const addedDrillActionConfig = value[addedDrillActionConfigIndex]; + const handleVisibleChange = (visible: any, popoverKey: string | number) => { + setVisiblePopoverindex(visible ? popoverKey : -1); + }; - const drillactionConfigs = value.map((anno: any, i) => ( - <ControlPopover - key={i} - trigger="click" - title={t('Edit Jump Action')} - css={theme => ({ - '&:hover': { - cursor: 'pointer', - backgroundColor: theme.colors.grayscale.light4, - }, - })} - content={renderPopover( - i, - anno, - )} - visible={visiblePopoverIndex === i} - onVisibleChange={visible => handleVisibleChange(visible, i)} - > - <CustomListItem selectable style={{fontSize: 12}}> - <i - onClick={() => removeDrillActionConfig(anno)} - data-test="add-annotation-layer-button" - className="fa fa-times" - />{' '} -   {anno.name} - </CustomListItem> - </ControlPopover> - )); + const removeDrillActionConfig = (drillActionConfig: any) => { + const annotations = value.filter(anno => anno !== drillActionConfig); + onChange(annotations); + }; + const renderPopover = ( + popoverKey: string | number, + drillActionConfig: any, + error: string = '', + ) => { + const id = drillActionConfig?.name || '_new'; - const addLayerPopoverKey = 'add'; return ( - <> - <HeaderContainer> - <ControlHeader {...props} /> - </HeaderContainer> - <LabelsContainer> - <List bordered css={theme => ({ borderRadius: theme.gridUnit })}> - {drillactionConfigs} - <ControlPopover - trigger="click" - content={renderPopover(addLayerPopoverKey, addedDrillActionConfig)} - title={t('Add Jump Action')} - visible={visiblePopoverIndex === addLayerPopoverKey} - destroyTooltipOnHide - onVisibleChange={visible => - handleVisibleChange(visible, addLayerPopoverKey) - } - > - <CustomListItem selectable style={{fontSize: 12}}> - <i - data-test="add-annotation-layer-button" - className="fa fa-plus" - />{' '} -   {t('Add Jump Action')} - </CustomListItem> - </ControlPopover> - </List> - </LabelsContainer> - </> + <div id={`annotation-pop-${id}`} data-test="popover-content"> + <DrillActionConfig + {...drillActionConfig} + error={error} + visiblePopoverIndex={visiblePopoverIndex} + addDrillActionConfig={(newAnnotation: any) => + addDrillActionConfig(drillActionConfig, newAnnotation) + } + removeDrillActionConfig={() => + removeDrillActionConfig(drillActionConfig) + } + close={() => { + handleVisibleChange(false, popoverKey); + setState({ ...state, addedDrillActionConfigIndex: -1 }); + }} + visi + /> + </div> ); - } + }; + const { addedDrillActionConfigIndex } = state; + const addedDrillActionConfig = value[addedDrillActionConfigIndex]; + + const drillactionConfigs = value.map((anno: any, i) => ( + <ControlPopover + key={i} + trigger="click" + title={t('Edit Jump Action')} + css={theme => ({ + '&:hover': { + cursor: 'pointer', + backgroundColor: theme.colors.grayscale.light4, + }, + })} + content={renderPopover(i, anno)} + visible={visiblePopoverIndex === i} + onVisibleChange={visible => handleVisibleChange(visible, i)} + > + <CustomListItem selectable style={{ fontSize: 12 }}> + <i + onClick={() => removeDrillActionConfig(anno)} + data-test="add-annotation-layer-button" + className="fa fa-times" + />{' '} +   {anno.name} + </CustomListItem> + </ControlPopover> + )); + + const addLayerPopoverKey = 'add'; + return ( + <> + <HeaderContainer> + <ControlHeader {...props} /> + </HeaderContainer> + <LabelsContainer> + <List bordered css={theme => ({ borderRadius: theme.gridUnit })}> + {drillactionConfigs} + <ControlPopover + trigger="click" + content={renderPopover(addLayerPopoverKey, addedDrillActionConfig)} + title={t('Add Jump Action')} + visible={visiblePopoverIndex === addLayerPopoverKey} + destroyTooltipOnHide + onVisibleChange={visible => + handleVisibleChange(visible, addLayerPopoverKey) + } + > + <CustomListItem selectable style={{ fontSize: 12 }}> + <i + data-test="add-annotation-layer-button" + className="fa fa-plus" + />{' '} +   {t('Add Jump Action')} + </CustomListItem> + </ControlPopover> + </List> + </LabelsContainer> + </> + ); +}; // Tried to hook this up through stores/control.jsx instead of using redux // directly, could not figure out how to get access to the color_scheme @@ -198,10 +202,6 @@ function mapStateToProps({ charts, explore }: any) { }; } - - const themedDrillActionConfigControl = withTheme(DrillActionConfigControl); -export default connect( - mapStateToProps, -)(themedDrillActionConfigControl); +export default connect(mapStateToProps)(themedDrillActionConfigControl); diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/plugin/controlPanel.tsx b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/plugin/controlPanel.tsx index d69a73c51061..991a7ca8f4b5 100644 --- a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/plugin/controlPanel.tsx +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/plugin/controlPanel.tsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import React from 'react' +import React from 'react'; import { t, @@ -48,7 +48,6 @@ import { StyledColumnOption } from 'src/explore/components/optionRenderers'; import DrillActionConfig from '../components/controls/JumpActionConfigControll'; - export const PAGE_SIZE_OPTIONS = formatSelectOptions<number>([ [0, t('page_size.all')], 10, @@ -104,7 +103,6 @@ const validateAggControlValues = ( : []; }; - // function isIP(v: unknown) { // if (typeof v === 'string' && v.trim().length > 0) { // //console.log(v.trim()); @@ -229,7 +227,7 @@ const config: ControlPanelConfig = { return newState; }, - rerender: ['metrics', 'percent_metrics', ], + rerender: ['metrics', 'percent_metrics', 'default_group_by'], }, }, ], @@ -329,10 +327,10 @@ const config: ControlPanelConfig = { : []; return newState; }, - rerender: ['principalColumns'], + rerender: ['principalColumns', 'default_group_by'], visibility: isRawMode, canCopy: true, - } + }, }, ], [ @@ -422,9 +420,9 @@ const config: ControlPanelConfig = { controlState: ControlState, ) => { const { controls } = state; - const originalMapStateToProps = isRawMode({ controls }) ? - sharedControls?.columns?.mapStateToProps : - sharedControls?.groupby?.mapStateToProps; + const originalMapStateToProps = isRawMode({ controls }) + ? sharedControls?.columns?.mapStateToProps + : sharedControls?.groupby?.mapStateToProps; const newState = originalMapStateToProps?.(state, controlState) ?? {}; const choices = isRawMode({ controls }) @@ -454,7 +452,6 @@ const config: ControlPanelConfig = { return newState; }, visibility: ({ controls }) => - // TODO properly emsure is Bool Boolean(controls?.emitFilter?.value), canCopy: true, }, @@ -590,8 +587,73 @@ config.controlPanelSections.push({ renderTrigger: true, default: false, description: t( - 'Whether to enable row grouping (this will only take affect after a save)', + 'Whether to enable row grouping (this will only take affect after a save). NOTE: "JSON Row Expand" and "Row Grouping" are mutually exclusive. If "Row Grouping" is selected, "JSON Row Expand" will not be visible.', + ), + visibility: ({ controls }) => + Boolean(!controls?.enable_json_expand?.value), + }, + }, + ], + [ + { + name: 'default_group_by', + config: { + type: 'SelectControl', + label: t('Default columns for row grouping'), + description: t( + 'Preselect a set of columns for row grouping in the grid.', + ), + multi: true, + freeForm: true, + allowAll: true, + default: [], + canSelectAll: true, + renderTrigger: true, + optionRenderer: (c: ColumnMeta) => ( + // eslint-disable-next-line react/react-in-jsx-scope + <StyledColumnOption showType column={c} /> + ), + // eslint-disable-next-line react/react-in-jsx-scope + valueRenderer: (c: ColumnMeta) => ( + // eslint-disable-next-line react/react-in-jsx-scope + <StyledColumnOption column={c} /> ), + valueKey: 'column_name', + mapStateToProps: ( + state: ControlPanelState, + controlState: ControlState, + ) => { + const { controls } = state; + const originalMapStateToProps = isRawMode({ controls }) + ? sharedControls?.columns?.mapStateToProps + : sharedControls?.groupby?.mapStateToProps; + const newState = + originalMapStateToProps?.(state, controlState) ?? {}; + const choices = isRawMode({ controls }) + ? controls?.columns?.value + : controls?.groupby?.value; + newState.options = newState.options.filter( + (o: { column_name: string }) => + ensureIsArray(choices).includes(o.column_name), + ); + const invalidOptions = ensureIsArray(controlState.value).filter( + c => !ensureIsArray(choices).includes(c), + ); + newState.externalValidationErrors = + invalidOptions.length > 0 + ? invalidOptions.length > 1 + ? [ + `'${invalidOptions.join(', ')}'${t( + ' are not valid options', + )}`, + ] + : [`'${invalidOptions}'${t(' is not a valid option')}`] + : []; + return newState; + }, + visibility: ({ controls }) => + Boolean(controls?.enable_grouping?.value), + canCopy: true, }, }, ], @@ -607,6 +669,22 @@ config.controlPanelSections.push({ }, }, ], + [ + { + name: 'enable_json_expand', + config: { + type: 'CheckboxControl', + label: t('JSON Row Expand'), + renderTrigger: true, + default: false, + description: t( + 'Whether to enable row level JSON expand buttons. NOTE: "JSON Row Expand" and "Row Grouping" are mutually exclusive. If "JSON Row Expand" is selected, "Row Grouping" will not be visible.', + ), + visibility: ({ controls }) => + Boolean(!controls?.enable_grouping?.value), + }, + }, + ], [ { name: 'page_length', diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/plugin/transformProps.ts b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/plugin/transformProps.ts index f6362c356d78..04e3faa2e0e2 100644 --- a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/plugin/transformProps.ts +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/plugin/transformProps.ts @@ -83,7 +83,9 @@ export default function transformProps(chartProps: CccsGridChartProps) { enable_grouping, column_state, enable_row_numbers, + enable_json_expand, jump_action_configs, + default_group_by, }: CccsGridQueryFormData = { ...DEFAULT_FORM_DATA, ...formData }; const data = queriesData[0].data as TimeseriesDataRecord[]; const agGridLicenseKey = queriesData[0].agGridLicenseKey as String; @@ -232,6 +234,12 @@ export default function transformProps(chartProps: CccsGridChartProps) { const isSortable = true; const enableRowGroup = true; const columnDescription = columnDescriptionMap[column]; + const autoHeight = true; + const rowGroupIndex = default_group_by.findIndex((element: any) => { + return element === column; + }); + const rowGroup = rowGroupIndex >= 0; + const hide = rowGroup; return { field: column, headerName: columnHeader, @@ -240,8 +248,12 @@ export default function transformProps(chartProps: CccsGridChartProps) { sort: sortDirection, sortIndex, enableRowGroup, + rowGroup, + hide, + rowGroupIndex, getQuickFilterText: (params: any) => valueFormatter(params), headerTooltip: columnDescription, + autoHeight, }; }); } else { @@ -261,14 +273,26 @@ export default function transformProps(chartProps: CccsGridChartProps) { const isSortable = true; const enableRowGroup = true; const columnDescription = columnDescriptionMap[column]; + const autoHeight = true; + const rowGroupIndex = default_group_by.findIndex( + (element: any) => element === column, + ); + const initialRowGroupIndex = rowGroupIndex; + const rowGroup = rowGroupIndex >= 0; + const hide = rowGroup; return { field: column, headerName: columnHeader, cellRenderer, sortable: isSortable, enableRowGroup, + rowGroup, + rowGroupIndex, + initialRowGroupIndex, + hide, getQuickFilterText: (params: any) => valueFormatter(params), headerTooltip: columnDescription, + autoHeight, }; }); columnDefs = columnDefs.concat(groupByColumnDefs); @@ -314,29 +338,45 @@ export default function transformProps(chartProps: CccsGridChartProps) { headerName: '#', colId: 'rowNum', pinned: 'left', + lockVisible: true, valueGetter: (params: any) => params.node ? params.node.rowIndex + 1 : null, } as any); } - let parsed_jump_action_configs = {} - jump_action_configs?.forEach( (e: any) => - { + const parsed_jump_action_configs = {}; + jump_action_configs?.forEach((e: any) => { if (e.dashboardID in parsed_jump_action_configs) { - parsed_jump_action_configs[e.dashboardID] = parsed_jump_action_configs[e.dashboardID].concat({ + parsed_jump_action_configs[e.dashboardID] = parsed_jump_action_configs[ + e.dashboardID + ].concat({ advancedDataType: e.advancedDataType, nativefilters: e.filters, - name: e.dashBoardName - }) - } - else { - parsed_jump_action_configs[e.dashboardID] = [{ - advancedDataType: e.advancedDataType, - nativefilters: e.filters, - name: e.dashBoardName - }] + name: e.dashBoardName, + }); + } else { + parsed_jump_action_configs[e.dashboardID] = [ + { + advancedDataType: e.advancedDataType, + nativefilters: e.filters, + name: e.dashBoardName, + }, + ]; } }); + // If the flag is set to true, add a column which will contain + // a button to expand all JSON blobs in the row + if (enable_json_expand) { + columnDefs.splice(1, 0, { + colId: 'jsonExpand', + pinned: 'left', + cellRenderer: 'expandAllValueRenderer', + autoHeight: true, + minWidth: 105, + lockVisible: true, + } as any); + } + return { formData, setDataMask, @@ -357,6 +397,6 @@ export default function transformProps(chartProps: CccsGridChartProps) { column_state, agGridLicenseKey, datasetColumns: columns, - jumpActionConfigs: parsed_jump_action_configs + jumpActionConfigs: parsed_jump_action_configs, }; } diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/types.ts b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/types.ts index a4754380c79d..4dc11b0fd7fe 100644 --- a/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/types.ts +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-cccs-grid/src/types.ts @@ -88,7 +88,7 @@ export interface CccsGridTransformedProps extends CccsGridStylesProps { // add typing here for the props you pass in from transformProps.ts! agGridLicenseKey: string; datasetColumns: Column[]; - jumpActionConfigs?: any[] + jumpActionConfigs?: any[]; } export type EventHandlers = Record<string, { (props: any): void }>; diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/IFrameVisualization.tsx b/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/IFrameVisualization.tsx index fa1cec2d7442..9fb1f9c05a14 100644 --- a/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/IFrameVisualization.tsx +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/IFrameVisualization.tsx @@ -1,17 +1,35 @@ import React from 'react'; import { IFrameVisualizationProps } from './types'; - export default function IFrameVisualization(props: IFrameVisualizationProps) { - const { url, url_parameter_value, parameter_name, parameter_prefix, errorMessage} = props - - const parserdUrlParameterName = parameter_name.includes('=') ? parameter_name : `${parameter_name}=${parameter_prefix}` + const { + url, + url_parameter_value, + parameter_name, + parameter_prefix, + errorMessage, + } = props; + + const parserdUrlParameterName = parameter_name.includes('=') + ? parameter_name + : `${parameter_name}=${parameter_prefix}`; return ( <> - { errorMessage ? - <>{errorMessage}</> : - <iframe src={`${url}?${parserdUrlParameterName}${url_parameter_value}`} style={{ position: 'absolute', left:0, top: '50px', width:'95%', height:'100%' }}></iframe> } + {errorMessage ? ( + <>{errorMessage}</> + ) : ( + <iframe + src={`${url}?${parserdUrlParameterName}${url_parameter_value}`} + style={{ + position: 'absolute', + left: 0, + top: '50px', + width: '95%', + height: '100%', + }} + ></iframe> + )} </> ); } diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/buildQuery.ts b/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/buildQuery.ts index 22405e6d1202..245655da2c1c 100644 --- a/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/buildQuery.ts +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/buildQuery.ts @@ -16,42 +16,41 @@ * specific language governing permissions and limitations * under the License. */ - import { buildQueryContext, QueryFormData } from '@superset-ui/core'; +import { buildQueryContext, QueryFormData } from '@superset-ui/core'; - /** - * The buildQuery function is used to create an instance of QueryContext that's - * sent to the chart data endpoint. In addition to containing information of which - * datasource to use, it specifies the type (e.g. full payload, samples, query) and - * format (e.g. CSV or JSON) of the result and whether or not to force refresh the data from - * the datasource as opposed to using a cached copy of the data, if available. - * - * More importantly though, QueryContext contains a property `queries`, which is an array of - * QueryObjects specifying individual data requests to be made. A QueryObject specifies which - * columns, metrics and filters, among others, to use during the query. Usually it will be enough - * to specify just one query based on the baseQueryObject, but for some more advanced use cases - * it is possible to define post processing operations in the QueryObject, or multiple queries - * if a viz needs multiple different result sets. - */ - export default function buildQuery(formData: QueryFormData) { - /* +/** + * The buildQuery function is used to create an instance of QueryContext that's + * sent to the chart data endpoint. In addition to containing information of which + * datasource to use, it specifies the type (e.g. full payload, samples, query) and + * format (e.g. CSV or JSON) of the result and whether or not to force refresh the data from + * the datasource as opposed to using a cached copy of the data, if available. + * + * More importantly though, QueryContext contains a property `queries`, which is an array of + * QueryObjects specifying individual data requests to be made. A QueryObject specifies which + * columns, metrics and filters, among others, to use during the query. Usually it will be enough + * to specify just one query based on the baseQueryObject, but for some more advanced use cases + * it is possible to define post processing operations in the QueryObject, or multiple queries + * if a viz needs multiple different result sets. + */ +export default function buildQuery(formData: QueryFormData) { + /* We receive an ip as a filter, our job is to find everthing there is to know about that ip We fire multiple queries to multiple data sets and collect the results here. */ - - const formDataCopy = { - ...formData, - result_type: 'post_processed', - }; - - return buildQueryContext(formDataCopy, baseQueryObject => { - // RAW mode (not aggregated) - // eslint-disable-next-line no-param-reassign - return [ - { - ...baseQueryObject, - row_limit: 10, - }, - ]; - }); - } - \ No newline at end of file + + const formDataCopy = { + ...formData, + result_type: 'post_processed', + }; + + return buildQueryContext(formDataCopy, baseQueryObject => { + // RAW mode (not aggregated) + // eslint-disable-next-line no-param-reassign + return [ + { + ...baseQueryObject, + row_limit: 10, + }, + ]; + }); +} diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/controlPanel.ts b/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/controlPanel.ts index 5c7a9df66fbc..3b35503b6e30 100644 --- a/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/controlPanel.ts +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/controlPanel.ts @@ -25,7 +25,6 @@ import { } from '@superset-ui/chart-controls'; const config: ControlPanelConfig = { - /** * The control panel is split into two tabs: "Query" and * "Chart Options". The controls that define the inputs to @@ -99,7 +98,7 @@ const config: ControlPanelConfig = { * - validateInteger: must be an integer value * - validateNumber: must be an intger or decimal value */ - + // For control input types, see: superset-frontend/src/explore/components/controls/index.js controlPanelSections: [ { @@ -121,7 +120,9 @@ const config: ControlPanelConfig = { sharedControls?.groupby?.mapStateToProps; const newState = originalMapStateToProps?.(state, controlState) ?? {}; - newState.externalValidationErrors = controlState.value ? [] : ["Please add a value for URL."] + newState.externalValidationErrors = controlState.value + ? [] + : ['Please add a value for URL.']; return newState; }, renderTrigger: true, @@ -135,7 +136,8 @@ const config: ControlPanelConfig = { name: 'groupby', override: { label: t('Parameter Column Name'), - description: "The name of the column that will populate the url parameter value.", + description: + 'The name of the column that will populate the url parameter value.', multi: false, allowAll: false, default: [], @@ -148,7 +150,10 @@ const config: ControlPanelConfig = { sharedControls?.groupby?.mapStateToProps; const newState = originalMapStateToProps?.(state, controlState) ?? {}; - newState.externalValidationErrors = ensureIsArray(controlState.value).length > 0 ? [] : ["Please add a value for Parameter Column Name."] + newState.externalValidationErrors = + ensureIsArray(controlState.value).length > 0 + ? [] + : ['Please add a value for Parameter Column Name.']; return newState; }, }, @@ -168,7 +173,9 @@ const config: ControlPanelConfig = { sharedControls?.groupby?.mapStateToProps; const newState = originalMapStateToProps?.(state, controlState) ?? {}; - newState.externalValidationErrors = controlState.value ? [] : ["Please add a value for Parameter Name."] + newState.externalValidationErrors = controlState.value + ? [] + : ['Please add a value for Parameter Name.']; return newState; }, default: '', @@ -183,10 +190,12 @@ const config: ControlPanelConfig = { type: 'TextControl', label: t('Parameter Prefix'), default: '', - description: t('A value that will be prefix the parameter value.'), + description: t( + 'A value that will be prefix the parameter value.', + ), }, }, - ] + ], ], }, ], diff --git a/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/transformProps.ts b/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/transformProps.ts index ee67ef9d2aff..08a54a5b0f61 100644 --- a/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/transformProps.ts +++ b/superset-frontend/src/cccs-viz/plugins/plugin-chart-iframe/src/plugin/transformProps.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { ChartProps, TimeseriesDataRecord, } from '@superset-ui/core'; +import { ChartProps, TimeseriesDataRecord } from '@superset-ui/core'; export default function transformProps(chartProps: ChartProps) { /** @@ -51,25 +51,26 @@ export default function transformProps(chartProps: ChartProps) { const formData = chartProps.formData; const queriesData = chartProps.queriesData; - const { url, parameterName, parameterPrefix, groupby } = formData + const { url, parameterName, parameterPrefix, groupby } = formData; const data = queriesData[0]?.data as TimeseriesDataRecord[]; - let value: string | number | true | Date = "" - let errorMessage = ""; + let value: string | number | true | Date = ''; + let errorMessage = ''; - if(Array.isArray(data) && data.length > 1) { - errorMessage = "The query returned too many rows when only one was expected." + if (Array.isArray(data) && data.length > 1) { + errorMessage = + 'The query returned too many rows when only one was expected.'; } - - if(Array.isArray(data) && data.length === 0) { - errorMessage = "The query returned no rows." + + if (Array.isArray(data) && data.length === 0) { + errorMessage = 'The query returned no rows.'; } - if(Array.isArray(data) && data.length === 1) { - value = data[0][groupby] || "" + if (Array.isArray(data) && data.length === 1) { + value = data[0][groupby] || ''; } - + return { url_parameter_value: value, parameter_name: parameterName, diff --git a/superset-frontend/src/components/Alert/Alert.test.tsx b/superset-frontend/src/components/Alert/Alert.test.tsx index 8a59469180d1..9d921d030147 100644 --- a/superset-frontend/src/components/Alert/Alert.test.tsx +++ b/superset-frontend/src/components/Alert/Alert.test.tsx @@ -64,13 +64,14 @@ test('renders without icon', async () => { }); }); -test('renders message', () => { +test('renders message', async () => { render(<Alert message="Message" />); - expect(screen.getByRole('alert')).toHaveTextContent('Message'); + expect(await screen.findByRole('alert')).toHaveTextContent('Message'); }); -test('renders message and description', () => { +test('renders message and description', async () => { render(<Alert message="Message" description="Description" />); - expect(screen.getByRole('alert')).toHaveTextContent('Message'); - expect(screen.getByRole('alert')).toHaveTextContent('Description'); + const alert = await screen.findByRole('alert'); + expect(alert).toHaveTextContent('Message'); + expect(alert).toHaveTextContent('Description'); }); diff --git a/superset-frontend/src/components/AlteredSliceTag/index.jsx b/superset-frontend/src/components/AlteredSliceTag/index.jsx index dd5dfb3c8786..5c9b04949bb8 100644 --- a/superset-frontend/src/components/AlteredSliceTag/index.jsx +++ b/superset-frontend/src/components/AlteredSliceTag/index.jsx @@ -171,15 +171,15 @@ export default class AlteredSliceTag extends React.Component { const columns = [ { accessor: 'control', - Header: 'Control', + Header: t('Control'), }, { accessor: 'before', - Header: 'Before', + Header: t('Before'), }, { accessor: 'after', - Header: 'After', + Header: t('After'), }, ]; // set the wrap text in the specific columns. diff --git a/superset-frontend/src/components/AsyncSelect/AsyncSelect.test.jsx b/superset-frontend/src/components/AsyncSelect/AsyncSelect.test.jsx index 0f11fe2709b8..f3bce1271330 100644 --- a/superset-frontend/src/components/AsyncSelect/AsyncSelect.test.jsx +++ b/superset-frontend/src/components/AsyncSelect/AsyncSelect.test.jsx @@ -19,7 +19,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import fetchMock from 'fetch-mock'; -import Select from 'src/components/Select'; +import Select from 'src/components/DeprecatedSelect'; import AsyncSelect from 'src/components/AsyncSelect'; describe('AsyncSelect', () => { diff --git a/superset-frontend/src/components/AsyncSelect/index.jsx b/superset-frontend/src/components/AsyncSelect/index.jsx index 1f2fb66e53b0..69799eadeae4 100644 --- a/superset-frontend/src/components/AsyncSelect/index.jsx +++ b/superset-frontend/src/components/AsyncSelect/index.jsx @@ -19,7 +19,7 @@ import React from 'react'; import PropTypes from 'prop-types'; // TODO: refactor this with `import { AsyncSelect } from src/components/Select` -import { Select } from 'src/components/Select'; +import { Select } from 'src/components/DeprecatedSelect'; import { t, SupersetClient } from '@superset-ui/core'; import { getClientErrorObject } from '../../utils/getClientErrorObject'; diff --git a/superset-frontend/src/components/Badge/index.tsx b/superset-frontend/src/components/Badge/index.tsx index f33d9808e4db..01c03f3fcf8f 100644 --- a/superset-frontend/src/components/Badge/index.tsx +++ b/superset-frontend/src/components/Badge/index.tsx @@ -28,8 +28,8 @@ export interface BadgeProps extends AntdBadgeProps { const Badge = styled( ( // eslint-disable-next-line @typescript-eslint/no-unused-vars - { textColor, ...props }: BadgeProps, - ) => <AntdBadge {...props} />, + { textColor, color, text, ...props }: BadgeProps, + ) => <AntdBadge text={text} color={text ? color : undefined} {...props} />, )` & > sup { padding: 0 ${({ theme }) => theme.gridUnit * 2}px; diff --git a/superset-frontend/src/components/Button/index.tsx b/superset-frontend/src/components/Button/index.tsx index b8e428d6ca3a..05a1a3ad7988 100644 --- a/superset-frontend/src/components/Button/index.tsx +++ b/superset-frontend/src/components/Button/index.tsx @@ -16,13 +16,15 @@ * specific language governing permissions and limitations * under the License. */ -import React, { CSSProperties, Children, ReactElement } from 'react'; +import React, { Children, ReactElement } from 'react'; import { kebabCase } from 'lodash'; import { mix } from 'polished'; import cx from 'classnames'; import { AntdButton } from 'src/components'; import { useTheme } from '@superset-ui/core'; import { Tooltip } from 'src/components/Tooltip'; +import { ButtonProps as AntdButtonProps } from 'antd/lib/button'; +import { TooltipProps } from 'antd/lib/tooltip'; export type OnClickHandler = React.MouseEventHandler<HTMLElement>; @@ -37,45 +39,17 @@ export type ButtonStyle = | 'link' | 'dashed'; -export interface ButtonProps { - id?: string; - className?: string; - tooltip?: string; - ghost?: boolean; - placement?: - | 'bottom' - | 'left' - | 'right' - | 'top' - | 'topLeft' - | 'topRight' - | 'bottomLeft' - | 'bottomRight' - | 'leftTop' - | 'leftBottom' - | 'rightTop' - | 'rightBottom'; - onClick?: OnClickHandler; - onMouseDown?: OnClickHandler; - disabled?: boolean; - buttonStyle?: ButtonStyle; - buttonSize?: 'default' | 'small' | 'xsmall'; - style?: CSSProperties; - children?: React.ReactNode; - href?: string; - htmlType?: 'button' | 'submit' | 'reset'; - cta?: boolean; - loading?: boolean | { delay?: number | undefined } | undefined; - showMarginRight?: boolean; - type?: - | 'default' - | 'text' - | 'link' - | 'primary' - | 'dashed' - | 'ghost' - | undefined; -} +export type ButtonSize = 'default' | 'small' | 'xsmall'; + +export type ButtonProps = Omit<AntdButtonProps, 'css'> & + Pick<TooltipProps, 'placement'> & { + tooltip?: string; + className?: string; + buttonSize?: ButtonSize; + buttonStyle?: ButtonStyle; + cta?: boolean; + showMarginRight?: boolean; + }; export default function Button(props: ButtonProps) { const { @@ -119,8 +93,8 @@ export default function Button(props: ButtonProps) { let borderColorDisabled = 'transparent'; if (buttonStyle === 'primary') { - backgroundColor = primary.dark1; - backgroundColorHover = mix(0.1, grayscale.light5, primary.dark1); + backgroundColor = primary.base; + backgroundColorHover = primary.dark1; backgroundColorActive = mix(0.2, grayscale.dark2, primary.dark1); color = grayscale.light5; colorHover = color; diff --git a/superset-frontend/src/components/CertifiedBadge/CertifiedBadge.test.tsx b/superset-frontend/src/components/CertifiedBadge/CertifiedBadge.test.tsx index eb593be1607b..03d01e78c92f 100644 --- a/superset-frontend/src/components/CertifiedBadge/CertifiedBadge.test.tsx +++ b/superset-frontend/src/components/CertifiedBadge/CertifiedBadge.test.tsx @@ -17,24 +17,29 @@ * under the License. */ import React from 'react'; -import { render, screen } from 'spec/helpers/testing-library'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; -import CertifiedBadge from 'src/components/CertifiedBadge'; +import CertifiedBadge, { + CertifiedBadgeProps, +} from 'src/components/CertifiedBadge'; -test('renders with default props', () => { - render(<CertifiedBadge />); +const asyncRender = (props?: CertifiedBadgeProps) => + waitFor(() => render(<CertifiedBadge {...props} />)); + +test('renders with default props', async () => { + await asyncRender(); expect(screen.getByRole('img')).toBeInTheDocument(); }); test('renders a tooltip when hovered', async () => { - render(<CertifiedBadge />); + await asyncRender(); userEvent.hover(screen.getByRole('img')); expect(await screen.findByRole('tooltip')).toBeInTheDocument(); }); test('renders with certified by', async () => { const certifiedBy = 'Trusted Authority'; - render(<CertifiedBadge certifiedBy={certifiedBy} />); + await asyncRender({ certifiedBy }); userEvent.hover(screen.getByRole('img')); expect(await screen.findByRole('tooltip')).toHaveTextContent(certifiedBy); }); @@ -50,7 +55,7 @@ test('renders with multiple certified by values', async () => { test('renders with details', async () => { const details = 'All requirements have been met.'; - render(<CertifiedBadge details={details} />); + await asyncRender({ details }); userEvent.hover(screen.getByRole('img')); expect(await screen.findByRole('tooltip')).toHaveTextContent(details); }); diff --git a/superset-frontend/src/components/Chart/Chart.jsx b/superset-frontend/src/components/Chart/Chart.jsx index d5bdea70ac91..4e6de07b7fbb 100644 --- a/superset-frontend/src/components/Chart/Chart.jsx +++ b/superset-frontend/src/components/Chart/Chart.jsx @@ -28,6 +28,8 @@ import ErrorBoundary from 'src/components/ErrorBoundary'; import { Logger, LOG_ACTIONS_RENDER_CHART } from 'src/logger/LogUtils'; import { URL_PARAMS } from 'src/constants'; import { getUrlParam } from 'src/utils/urlUtils'; +import { isCurrentUserBot } from 'src/utils/isBot'; +import { ChartSource } from 'src/types/ChartSource'; import { ResourceStatus } from 'src/hooks/apiResources/apiResources'; import ChartRenderer from './ChartRenderer'; import { ChartErrorMessage } from './ChartErrorMessage'; @@ -74,6 +76,8 @@ const propTypes = { ownState: PropTypes.object, postTransformProps: PropTypes.func, datasetsStatus: PropTypes.oneOf(['loading', 'error', 'complete']), + isInView: PropTypes.bool, + emitCrossFilters: PropTypes.bool, }; const BLANK = {}; @@ -92,6 +96,7 @@ const defaultProps = { chartStackTrace: null, isDeactivatedViz: false, force: false, + isInView: true, }; const Styles = styled.div` @@ -109,6 +114,10 @@ const Styles = styled.div` .pivot_table tbody tr { font-feature-settings: 'tnum' 1; } + + .alert { + margin: ${({ theme }) => theme.gridUnit * 2}px; + } } `; @@ -204,7 +213,6 @@ class Chart extends React.PureComponent { height, datasetsStatus, } = this.props; - const error = queryResponse?.errors?.[0]; const message = chartAlert || queryResponse?.message; @@ -236,7 +244,7 @@ class Chart extends React.PureComponent { subtitle={<MonospaceDiv>{message}</MonospaceDiv>} copyText={message} link={queryResponse ? queryResponse.link : null} - source={dashboardId ? 'dashboard' : 'explore'} + source={dashboardId ? ChartSource.Dashboard : ChartSource.Explore} stackTrace={chartStackTrace} /> ); @@ -309,11 +317,17 @@ class Chart extends React.PureComponent { width={width} > <div className="slice_container" data-test="slice-container"> - <ChartRenderer - {...this.props} - source={this.props.dashboardId ? 'dashboard' : 'explore'} - data-test={this.props.vizType} - /> + {this.props.isInView || + !isFeatureEnabled(FeatureFlag.DASHBOARD_VIRTUALIZATION) || + isCurrentUserBot() ? ( + <ChartRenderer + {...this.props} + source={this.props.dashboardId ? 'dashboard' : 'explore'} + data-test={this.props.vizType} + /> + ) : ( + <Loading /> + )} </div> {isLoading && !isDeactivatedViz && <Loading />} </Styles> diff --git a/superset-frontend/src/components/Chart/ChartContextMenu.tsx b/superset-frontend/src/components/Chart/ChartContextMenu.tsx new file mode 100644 index 000000000000..c202d9ee9dd6 --- /dev/null +++ b/superset-frontend/src/components/Chart/ChartContextMenu.tsx @@ -0,0 +1,152 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { + forwardRef, + RefObject, + useCallback, + useImperativeHandle, + useState, +} from 'react'; +import ReactDOM from 'react-dom'; +import { useSelector } from 'react-redux'; +import { + BinaryQueryObjectFilterClause, + FeatureFlag, + isFeatureEnabled, + QueryFormData, +} from '@superset-ui/core'; +import { RootState } from 'src/dashboard/types'; +import { findPermission } from 'src/utils/findPermission'; +import { Menu } from 'src/components/Menu'; +import { AntdDropdown as Dropdown } from 'src/components'; +import { DrillDetailMenuItems } from './DrillDetail'; +import { getMenuAdjustedY } from './utils'; + +export interface ChartContextMenuProps { + id: number; + formData: QueryFormData; + onSelection: () => void; + onClose: () => void; +} + +export interface Ref { + open: ( + clientX: number, + clientY: number, + filters?: BinaryQueryObjectFilterClause[], + ) => void; +} + +const ChartContextMenu = ( + { id, formData, onSelection, onClose }: ChartContextMenuProps, + ref: RefObject<Ref>, +) => { + const canExplore = useSelector((state: RootState) => + findPermission('can_explore', 'Superset', state.user?.roles), + ); + + const [{ filters, clientX, clientY }, setState] = useState<{ + clientX: number; + clientY: number; + filters?: BinaryQueryObjectFilterClause[]; + }>({ clientX: 0, clientY: 0 }); + + const menuItems = []; + const showDrillToDetail = + isFeatureEnabled(FeatureFlag.DRILL_TO_DETAIL) && canExplore; + + if (showDrillToDetail) { + menuItems.push( + <DrillDetailMenuItems + chartId={id} + formData={formData} + filters={filters} + isContextMenu + contextMenuY={clientY} + onSelection={onSelection} + />, + ); + } + + const open = useCallback( + ( + clientX: number, + clientY: number, + filters?: BinaryQueryObjectFilterClause[], + ) => { + const itemsCount = + [ + showDrillToDetail ? 2 : 0, // Drill to detail always has 2 top-level menu items + ].reduce((a, b) => a + b, 0) || 1; // "No actions" appears if no actions in menu + + const adjustedY = getMenuAdjustedY(clientY, itemsCount); + setState({ + clientX, + clientY: adjustedY, + filters, + }); + + // Since Ant Design's Dropdown does not offer an imperative API + // and we can't attach event triggers to charts SVG elements, we + // use a hidden span that gets clicked on when receiving click events + // from the charts. + document.getElementById(`hidden-span-${id}`)?.click(); + }, + [id, showDrillToDetail], + ); + + useImperativeHandle( + ref, + () => ({ + open, + }), + [open], + ); + + return ReactDOM.createPortal( + <Dropdown + overlay={ + <Menu> + {menuItems.length ? ( + menuItems + ) : ( + <Menu.Item disabled>No actions</Menu.Item> + )} + </Menu> + } + trigger={['click']} + onVisibleChange={value => !value && onClose()} + > + <span + id={`hidden-span-${id}`} + css={{ + visibility: 'hidden', + position: 'fixed', + top: clientY, + left: clientX, + width: 1, + height: 1, + }} + /> + </Dropdown>, + document.body, + ); +}; + +export default forwardRef(ChartContextMenu); diff --git a/superset-frontend/src/components/Chart/ChartRenderer.jsx b/superset-frontend/src/components/Chart/ChartRenderer.jsx index ed330ab7afc9..588e2b4e4dfb 100644 --- a/superset-frontend/src/components/Chart/ChartRenderer.jsx +++ b/superset-frontend/src/components/Chart/ChartRenderer.jsx @@ -19,9 +19,19 @@ import { snakeCase, isEqual } from 'lodash'; import PropTypes from 'prop-types'; import React from 'react'; -import { SuperChart, logging, Behavior, t } from '@superset-ui/core'; +import { + SuperChart, + logging, + Behavior, + t, + isFeatureEnabled, + FeatureFlag, + getChartMetadataRegistry, +} from '@superset-ui/core'; import { Logger, LOG_ACTIONS_RENDER_CHART } from 'src/logger/LogUtils'; import { EmptyStateBig, EmptyStateSmall } from 'src/components/EmptyState'; +import { ChartSource } from 'src/types/ChartSource'; +import ChartContextMenu from './ChartContextMenu'; const propTypes = { annotationData: PropTypes.object, @@ -51,7 +61,8 @@ const propTypes = { onFilterMenuClose: PropTypes.func, ownState: PropTypes.object, postTransformProps: PropTypes.func, - source: PropTypes.oneOf(['dashboard', 'explore']), + source: PropTypes.oneOf([ChartSource.Dashboard, ChartSource.Explore]), + emitCrossFilters: PropTypes.bool, }; const BLANK = {}; @@ -73,15 +84,30 @@ const defaultProps = { class ChartRenderer extends React.Component { constructor(props) { super(props); + this.state = { + showContextMenu: + props.source === ChartSource.Dashboard && + isFeatureEnabled(FeatureFlag.DRILL_TO_DETAIL), + inContextMenu: false, + }; this.hasQueryResponseChange = false; + this.contextMenuRef = React.createRef(); + this.handleAddFilter = this.handleAddFilter.bind(this); this.handleRenderSuccess = this.handleRenderSuccess.bind(this); this.handleRenderFailure = this.handleRenderFailure.bind(this); this.handleSetControlValue = this.handleSetControlValue.bind(this); + this.handleOnContextMenu = this.handleOnContextMenu.bind(this); + this.handleContextMenuSelected = this.handleContextMenuSelected.bind(this); + this.handleContextMenuClosed = this.handleContextMenuClosed.bind(this); + this.onContextMenuFallback = this.onContextMenuFallback.bind(this); this.hooks = { onAddFilter: this.handleAddFilter, + onContextMenu: this.state.showContextMenu + ? this.handleOnContextMenu + : undefined, onError: this.handleRenderFailure, setControlValue: this.handleSetControlValue, onFilterMenuOpen: this.props.onFilterMenuOpen, @@ -92,13 +118,16 @@ class ChartRenderer extends React.Component { }; } - shouldComponentUpdate(nextProps) { + shouldComponentUpdate(nextProps, nextState) { const resultsReady = nextProps.queriesResponse && ['success', 'rendered'].indexOf(nextProps.chartStatus) > -1 && !nextProps.queriesResponse?.[0]?.error; if (resultsReady) { + if (!isEqual(this.state, nextState)) { + return true; + } this.hasQueryResponseChange = nextProps.queriesResponse !== this.props.queriesResponse; return ( @@ -114,7 +143,8 @@ class ChartRenderer extends React.Component { nextProps.sharedLabelColors !== this.props.sharedLabelColors || nextProps.formData.color_scheme !== this.props.formData.color_scheme || nextProps.formData.stack !== this.props.formData.stack || - nextProps.cacheBusterProp !== this.props.cacheBusterProp + nextProps.cacheBusterProp !== this.props.cacheBusterProp || + nextProps.emitCrossFilters !== this.props.emitCrossFilters ); } return false; @@ -172,8 +202,30 @@ class ChartRenderer extends React.Component { } } + handleOnContextMenu(offsetX, offsetY, filters) { + this.contextMenuRef.current.open(offsetX, offsetY, filters); + this.setState({ inContextMenu: true }); + } + + handleContextMenuSelected() { + this.setState({ inContextMenu: false }); + } + + handleContextMenuClosed() { + this.setState({ inContextMenu: false }); + } + + // When viz plugins don't handle `contextmenu` event, fallback handler + // calls `handleOnContextMenu` with no `filters` param. + onContextMenuFallback(event) { + if (!this.state.inContextMenu) { + event.preventDefault(); + this.handleOnContextMenu(event.clientX, event.clientY); + } + } + render() { - const { chartAlert, chartStatus, chartId } = this.props; + const { chartAlert, chartStatus, chartId, emitCrossFilters } = this.props; // Skip chart rendering if (chartStatus === 'loading' || !!chartAlert || chartStatus === null) { @@ -226,7 +278,7 @@ class ChartRenderer extends React.Component { let noResultsComponent; const noResultTitle = t('No results were returned for this query'); const noResultDescription = - this.props.source === 'explore' + this.props.source === ChartSource.Explore ? t( 'Make sure that the controls are configured properly and the datasource contains data for the selected time range', ) @@ -246,29 +298,56 @@ class ChartRenderer extends React.Component { ); } + // Check for Behavior.DRILL_TO_DETAIL to tell if chart can receive Drill to + // Detail props or if it'll cause side-effects (e.g. excessive re-renders). + const drillToDetailProps = getChartMetadataRegistry() + .get(formData.viz_type) + ?.behaviors.find(behavior => behavior === Behavior.DRILL_TO_DETAIL) + ? { inContextMenu: this.state.inContextMenu } + : {}; + return ( - <SuperChart - disableErrorBoundary - key={`${chartId}${webpackHash}`} - id={`chart-id-${chartId}`} - className={chartClassName} - chartType={vizType} - width={width} - height={height} - annotationData={annotationData} - datasource={datasource} - initialValues={initialValues} - formData={currentFormData} - ownState={ownState} - filterState={filterState} - hooks={this.hooks} - behaviors={behaviors} - queriesData={queriesResponse} - onRenderSuccess={this.handleRenderSuccess} - onRenderFailure={this.handleRenderFailure} - noResults={noResultsComponent} - postTransformProps={postTransformProps} - /> + <> + {this.state.showContextMenu && ( + <ChartContextMenu + ref={this.contextMenuRef} + id={chartId} + formData={currentFormData} + onSelection={this.handleContextMenuSelected} + onClose={this.handleContextMenuClosed} + /> + )} + <div + onContextMenu={ + this.state.showContextMenu ? this.onContextMenuFallback : undefined + } + > + <SuperChart + disableErrorBoundary + key={`${chartId}${webpackHash}`} + id={`chart-id-${chartId}`} + className={chartClassName} + chartType={vizType} + width={width} + height={height} + annotationData={annotationData} + datasource={datasource} + initialValues={initialValues} + formData={currentFormData} + ownState={ownState} + filterState={filterState} + hooks={this.hooks} + behaviors={behaviors} + queriesData={queriesResponse} + onRenderSuccess={this.handleRenderSuccess} + onRenderFailure={this.handleRenderFailure} + noResults={noResultsComponent} + postTransformProps={postTransformProps} + emitCrossFilters={emitCrossFilters} + {...drillToDetailProps} + /> + </div> + </> ); } } diff --git a/superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.test.tsx b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.test.tsx new file mode 100644 index 000000000000..8a0f8dbfc5cd --- /dev/null +++ b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.test.tsx @@ -0,0 +1,345 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import userEvent from '@testing-library/user-event'; +import { render, screen, within } from 'spec/helpers/testing-library'; +import { getMockStoreWithNativeFilters } from 'spec/fixtures/mockStore'; +import chartQueries, { sliceId } from 'spec/fixtures/mockChartQueries'; +import { BinaryQueryObjectFilterClause } from '@superset-ui/core'; +import { Menu } from 'src/components/Menu'; +import DrillDetailMenuItems, { + DrillDetailMenuItemsProps, +} from './DrillDetailMenuItems'; + +/* eslint jest/expect-expect: ["warn", { "assertFunctionNames": ["expect*"] }] */ + +jest.mock( + './DrillDetailPane', + () => + ({ initialFilters }: { initialFilters: BinaryQueryObjectFilterClause[] }) => + <pre data-test="modal-filters">{JSON.stringify(initialFilters)}</pre>, +); + +const { id: defaultChartId, form_data: defaultFormData } = + chartQueries[sliceId]; + +const { slice_name: chartName } = defaultFormData; +const unsupportedChartFormData = { + ...defaultFormData, + viz_type: 'dist_bar', +}; + +const noDimensionsFormData = { + ...defaultFormData, + viz_type: 'table', + query_mode: 'raw', +}; + +const filterA: BinaryQueryObjectFilterClause = { + col: 'sample_column', + op: '==', + val: 1234567890, + formattedVal: 'Yesterday', +}; + +const filterB: BinaryQueryObjectFilterClause = { + col: 'sample_column_2', + op: '==', + val: 987654321, + formattedVal: 'Two days ago', +}; + +const renderMenu = ({ + chartId, + formData, + isContextMenu, + filters, +}: Partial<DrillDetailMenuItemsProps>) => { + const store = getMockStoreWithNativeFilters(); + return render( + <Menu> + <DrillDetailMenuItems + chartId={chartId ?? defaultChartId} + formData={formData ?? defaultFormData} + filters={filters} + isContextMenu={isContextMenu} + /> + </Menu>, + { useRouter: true, useRedux: true, store }, + ); +}; + +/** + * Drill to Detail modal should appear with correct initial filters + */ +const expectDrillToDetailModal = async ( + buttonName: string, + filters: BinaryQueryObjectFilterClause[] = [], +) => { + const button = screen.getByRole('menuitem', { name: buttonName }); + userEvent.click(button); + const modal = await screen.findByRole('dialog', { + name: `Drill to detail: ${chartName}`, + }); + + expect(modal).toBeVisible(); + expect(screen.getByTestId('modal-filters')).toHaveTextContent( + JSON.stringify(filters), + ); +}; + +/** + * Menu item should be enabled without explanatory tooltip + */ +const expectMenuItemEnabled = async (menuItem: HTMLElement) => { + expect(menuItem).toBeInTheDocument(); + expect(menuItem).not.toHaveAttribute('aria-disabled'); + const tooltipTrigger = within(menuItem).queryByTestId('tooltip-trigger'); + expect(tooltipTrigger).not.toBeInTheDocument(); +}; + +/** + * Menu item should be disabled, optionally with an explanatory tooltip + */ +const expectMenuItemDisabled = async ( + menuItem: HTMLElement, + tooltipContent?: string, +) => { + expect(menuItem).toBeVisible(); + expect(menuItem).toHaveAttribute('aria-disabled', 'true'); + const tooltipTrigger = within(menuItem).queryByTestId('tooltip-trigger'); + if (tooltipContent) { + userEvent.hover(tooltipTrigger as HTMLElement); + const tooltip = await screen.findByRole('tooltip', { + name: tooltipContent, + }); + + expect(tooltip).toBeInTheDocument(); + } else { + expect(tooltipTrigger).not.toBeInTheDocument(); + } +}; + +/** + * "Drill to detail" item should be enabled and open the correct modal + */ +const expectDrillToDetailEnabled = async () => { + const drillToDetailMenuItem = screen.getByRole('menuitem', { + name: 'Drill to detail', + }); + + await expectMenuItemEnabled(drillToDetailMenuItem); + await expectDrillToDetailModal('Drill to detail'); +}; + +/** + * "Drill to detail" item should be present and disabled + */ +const expectDrillToDetailDisabled = async (tooltipContent?: string) => { + const drillToDetailMenuItem = screen.getByRole('menuitem', { + name: 'Drill to detail', + }); + + await expectMenuItemDisabled(drillToDetailMenuItem, tooltipContent); +}; + +/** + * "Drill to detail by" item should not be present + */ +const expectNoDrillToDetailBy = async () => { + const drillToDetailBy = screen.queryByRole('menuitem', { + name: 'Drill to detail by', + }); + + expect(drillToDetailBy).not.toBeInTheDocument(); +}; + +/** + * "Drill to detail by" submenu should be present and enabled + */ +const expectDrillToDetailByEnabled = async () => { + const drillToDetailBy = screen.getByRole('menuitem', { + name: 'Drill to detail by', + }); + + await expectMenuItemEnabled(drillToDetailBy); + userEvent.hover( + within(drillToDetailBy).getByRole('button', { name: 'Drill to detail by' }), + ); + + expect( + await screen.findByTestId('drill-to-detail-by-submenu'), + ).toBeInTheDocument(); +}; + +/** + * "Drill to detail by" submenu should be present and disabled + */ +const expectDrillToDetailByDisabled = async (tooltipContent?: string) => { + const drillToDetailBySubmenuItem = screen.getByRole('menuitem', { + name: 'Drill to detail by', + }); + + await expectMenuItemDisabled(drillToDetailBySubmenuItem, tooltipContent); +}; + +/** + * "Drill to detail by {dimension}" submenu item should exist and open the correct modal + */ +const expectDrillToDetailByDimension = async ( + filter: BinaryQueryObjectFilterClause, +) => { + userEvent.hover(screen.getByRole('button', { name: 'Drill to detail by' })); + const drillToDetailBySubMenu = await screen.findByTestId( + 'drill-to-detail-by-submenu', + ); + + const menuItemName = `Drill to detail by ${filter.formattedVal}`; + const drillToDetailBySubmenuItem = within(drillToDetailBySubMenu).getByRole( + 'menuitem', + { name: menuItemName }, + ); + + await expectMenuItemEnabled(drillToDetailBySubmenuItem); + await expectDrillToDetailModal(menuItemName, [filter]); +}; + +/** + * "Drill to detail by all" submenu item should exist and open the correct modal + */ +const expectDrillToDetailByAll = async ( + filters: BinaryQueryObjectFilterClause[], +) => { + userEvent.hover(screen.getByRole('button', { name: 'Drill to detail by' })); + const drillToDetailBySubMenu = await screen.findByTestId( + 'drill-to-detail-by-submenu', + ); + + const menuItemName = 'Drill to detail by all'; + const drillToDetailBySubmenuItem = within(drillToDetailBySubMenu).getByRole( + 'menuitem', + { name: menuItemName }, + ); + + await expectMenuItemEnabled(drillToDetailBySubmenuItem); + await expectDrillToDetailModal(menuItemName, filters); +}; + +test('dropdown menu for unsupported chart', async () => { + renderMenu({ formData: unsupportedChartFormData }); + await expectDrillToDetailEnabled(); + await expectNoDrillToDetailBy(); +}); + +test('context menu for unsupported chart', async () => { + renderMenu({ + formData: unsupportedChartFormData, + isContextMenu: true, + }); + + await expectDrillToDetailEnabled(); + await expectDrillToDetailByDisabled( + 'Drill to detail by value is not yet supported for this chart type.', + ); +}); + +test('dropdown menu for supported chart, no dimensions', async () => { + renderMenu({ + formData: noDimensionsFormData, + }); + + await expectDrillToDetailDisabled( + 'Drill to detail is disabled because this chart does not group data by dimension value.', + ); + + await expectNoDrillToDetailBy(); +}); + +test('context menu for supported chart, no dimensions, no filters', async () => { + renderMenu({ + formData: noDimensionsFormData, + isContextMenu: true, + }); + + await expectDrillToDetailDisabled( + 'Drill to detail is disabled because this chart does not group data by dimension value.', + ); + + await expectDrillToDetailByDisabled(); +}); + +test('context menu for supported chart, no dimensions, 1 filter', async () => { + renderMenu({ + formData: noDimensionsFormData, + isContextMenu: true, + filters: [filterA], + }); + + await expectDrillToDetailDisabled( + 'Drill to detail is disabled because this chart does not group data by dimension value.', + ); + + await expectDrillToDetailByDisabled(); +}); + +test('dropdown menu for supported chart, dimensions', async () => { + renderMenu({ formData: defaultFormData }); + await expectDrillToDetailEnabled(); + await expectNoDrillToDetailBy(); +}); + +test('context menu for supported chart, dimensions, no filters', async () => { + renderMenu({ + formData: defaultFormData, + isContextMenu: true, + }); + + await expectDrillToDetailEnabled(); + await expectDrillToDetailByDisabled( + 'Right-click on a dimension value to drill to detail by that value.', + ); +}); + +test('context menu for supported chart, dimensions, 1 filter', async () => { + const filters = [filterA]; + renderMenu({ + formData: defaultFormData, + isContextMenu: true, + filters, + }); + + await expectDrillToDetailEnabled(); + await expectDrillToDetailByEnabled(); + await expectDrillToDetailByDimension(filterA); +}); + +test('context menu for supported chart, dimensions, 2 filters', async () => { + const filters = [filterA, filterB]; + renderMenu({ + formData: defaultFormData, + isContextMenu: true, + filters, + }); + + await expectDrillToDetailEnabled(); + await expectDrillToDetailByEnabled(); + await expectDrillToDetailByDimension(filterA); + await expectDrillToDetailByDimension(filterB); + await expectDrillToDetailByAll(filters); +}); diff --git a/superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx new file mode 100644 index 000000000000..6159e212e34f --- /dev/null +++ b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx @@ -0,0 +1,255 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { ReactNode, useCallback, useMemo, useState } from 'react'; +import { isEmpty } from 'lodash'; +import { + Behavior, + BinaryQueryObjectFilterClause, + css, + extractQueryFields, + getChartMetadataRegistry, + QueryFormData, + styled, + SupersetTheme, + t, +} from '@superset-ui/core'; +import { Menu } from 'src/components/Menu'; +import Icons from 'src/components/Icons'; +import { Tooltip } from 'src/components/Tooltip'; +import DrillDetailModal from './DrillDetailModal'; +import { getMenuAdjustedY, MENU_ITEM_HEIGHT } from '../utils'; + +const MENU_PADDING = 4; +const DRILL_TO_DETAIL_TEXT = t('Drill to detail by'); + +const DisabledMenuItemTooltip = ({ title }: { title: ReactNode }) => ( + <Tooltip title={title} placement="top"> + <Icons.InfoCircleOutlined + data-test="tooltip-trigger" + css={(theme: SupersetTheme) => css` + color: ${theme.colors.text.label}; + margin-left: ${theme.gridUnit * 2}px; + &.anticon { + font-size: unset; + .anticon { + line-height: unset; + vertical-align: unset; + } + } + `} + /> + </Tooltip> +); + +const DisabledMenuItem = ({ children, ...props }: { children: ReactNode }) => ( + <Menu.Item disabled {...props}> + <div + css={css` + white-space: normal; + max-width: 160px; + `} + > + {children} + </div> + </Menu.Item> +); + +const Filter = styled.span` + ${({ theme }) => ` + font-weight: ${theme.typography.weights.bold}; + color: ${theme.colors.primary.base}; + `} +`; + +export type DrillDetailMenuItemsProps = { + chartId: number; + formData: QueryFormData; + filters?: BinaryQueryObjectFilterClause[]; + isContextMenu?: boolean; + contextMenuY?: number; + onSelection?: () => void; + onClick?: (event: MouseEvent) => void; +}; + +const DrillDetailMenuItems = ({ + chartId, + formData, + filters = [], + isContextMenu = false, + contextMenuY = 0, + onSelection = () => null, + onClick = () => null, + ...props +}: DrillDetailMenuItemsProps) => { + const [modalFilters, setFilters] = useState<BinaryQueryObjectFilterClause[]>( + [], + ); + + const [showModal, setShowModal] = useState(false); + const openModal = useCallback( + (filters, event) => { + onClick(event); + onSelection(); + setFilters(filters); + setShowModal(true); + }, + [onClick, onSelection], + ); + + const closeModal = useCallback(() => { + setShowModal(false); + }, []); + + // Check for Behavior.DRILL_TO_DETAIL to tell if plugin handles the `contextmenu` + // event for dimensions. If it doesn't, tell the user that drill to detail by + // dimension is not supported. If it does, and the `contextmenu` handler didn't + // pass any filters, tell the user that they didn't select a dimension. + const handlesDimensionContextMenu = useMemo( + () => + getChartMetadataRegistry() + .get(formData.viz_type) + ?.behaviors.find(behavior => behavior === Behavior.DRILL_TO_DETAIL), + [formData.viz_type], + ); + + // Check metrics to see if chart's current configuration lacks + // aggregations, in which case Drill to Detail should be disabled. + const noAggregations = useMemo(() => { + const { metrics } = extractQueryFields(formData); + return isEmpty(metrics); + }, [formData]); + + let drillToDetailMenuItem; + if (handlesDimensionContextMenu && noAggregations) { + drillToDetailMenuItem = ( + <DisabledMenuItem {...props} key="drill-detail-no-aggregations"> + {t('Drill to detail')} + <DisabledMenuItemTooltip + title={t( + 'Drill to detail is disabled because this chart does not group data by dimension value.', + )} + /> + </DisabledMenuItem> + ); + } else { + drillToDetailMenuItem = ( + <Menu.Item + {...props} + key="drill-detail-no-filters" + onClick={openModal.bind(null, [])} + > + {t('Drill to detail')} + </Menu.Item> + ); + } + + let drillToDetailByMenuItem; + if (!handlesDimensionContextMenu) { + drillToDetailByMenuItem = ( + <DisabledMenuItem {...props} key="drill-detail-by-chart-not-supported"> + {DRILL_TO_DETAIL_TEXT} + <DisabledMenuItemTooltip + title={t( + 'Drill to detail by value is not yet supported for this chart type.', + )} + /> + </DisabledMenuItem> + ); + } + + if (handlesDimensionContextMenu && noAggregations) { + drillToDetailByMenuItem = ( + <DisabledMenuItem {...props} key="drill-detail-by-no-aggregations"> + {DRILL_TO_DETAIL_TEXT} + </DisabledMenuItem> + ); + } + + // Ensure submenu doesn't appear offscreen + const submenuYOffset = useMemo(() => { + const itemsCount = filters.length > 1 ? filters.length + 1 : filters.length; + const submenuY = + contextMenuY + MENU_PADDING + MENU_ITEM_HEIGHT + MENU_PADDING; + + return getMenuAdjustedY(submenuY, itemsCount) - submenuY; + }, [contextMenuY, filters.length]); + + if (handlesDimensionContextMenu && !noAggregations && filters?.length) { + drillToDetailByMenuItem = ( + <Menu.SubMenu + {...props} + popupOffset={[0, submenuYOffset]} + title={DRILL_TO_DETAIL_TEXT} + > + <div data-test="drill-to-detail-by-submenu"> + {filters.map((filter, i) => ( + <Menu.Item + {...props} + key={`drill-detail-filter-${i}`} + onClick={openModal.bind(null, [filter])} + > + {`${DRILL_TO_DETAIL_TEXT} `} + <Filter>{filter.formattedVal}</Filter> + </Menu.Item> + ))} + {filters.length > 1 && ( + <Menu.Item + {...props} + key="drill-detail-filter-all" + onClick={openModal.bind(null, filters)} + > + {`${DRILL_TO_DETAIL_TEXT} `} + <Filter>{t('all')}</Filter> + </Menu.Item> + )} + </div> + </Menu.SubMenu> + ); + } + + if (handlesDimensionContextMenu && !noAggregations && !filters?.length) { + drillToDetailByMenuItem = ( + <DisabledMenuItem {...props} key="drill-detail-by-select-aggregation"> + {DRILL_TO_DETAIL_TEXT} + <DisabledMenuItemTooltip + title={t( + 'Right-click on a dimension value to drill to detail by that value.', + )} + /> + </DisabledMenuItem> + ); + } + + return ( + <> + {drillToDetailMenuItem} + {isContextMenu && drillToDetailByMenuItem} + <DrillDetailModal + chartId={chartId} + formData={formData} + initialFilters={modalFilters} + showModal={showModal} + onHideModal={closeModal} + /> + </> + ); +}; + +export default DrillDetailMenuItems; diff --git a/superset-frontend/src/components/Chart/DrillDetail/DrillDetailModal.test.tsx b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailModal.test.tsx new file mode 100644 index 000000000000..038541d39076 --- /dev/null +++ b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailModal.test.tsx @@ -0,0 +1,95 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState } from 'react'; +import userEvent from '@testing-library/user-event'; +import { render, screen } from 'spec/helpers/testing-library'; +import { getMockStoreWithNativeFilters } from 'spec/fixtures/mockStore'; +import chartQueries, { sliceId } from 'spec/fixtures/mockChartQueries'; +import DrillDetailModal from './DrillDetailModal'; + +jest.mock('./DrillDetailPane', () => () => null); +const mockHistoryPush = jest.fn(); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), +})); + +const { id: chartId, form_data: formData } = chartQueries[sliceId]; +const { slice_name: chartName } = formData; + +const renderModal = async () => { + const store = getMockStoreWithNativeFilters(); + const DrillDetailModalWrapper = () => { + const [showModal, setShowModal] = useState(false); + return ( + <> + <button type="button" onClick={() => setShowModal(true)}> + Show modal + </button> + <DrillDetailModal + chartId={chartId} + formData={formData} + initialFilters={[]} + showModal={showModal} + onHideModal={() => setShowModal(false)} + /> + </> + ); + }; + + render(<DrillDetailModalWrapper />, { + useRouter: true, + useRedux: true, + store, + }); + + userEvent.click(screen.getByRole('button', { name: 'Show modal' })); + await screen.findByRole('dialog', { name: `Drill to detail: ${chartName}` }); +}; + +test('should render the title', async () => { + await renderModal(); + expect(screen.getByText(`Drill to detail: ${chartName}`)).toBeInTheDocument(); +}); + +test('should render the button', async () => { + await renderModal(); + expect( + screen.getByRole('button', { name: 'Edit chart' }), + ).toBeInTheDocument(); + expect(screen.getAllByRole('button', { name: 'Close' })).toHaveLength(2); +}); + +test('should close the modal', async () => { + await renderModal(); + expect(screen.getByRole('dialog')).toBeInTheDocument(); + userEvent.click(screen.getAllByRole('button', { name: 'Close' })[1]); + expect(screen.queryByRole('dialog')).not.toBeInTheDocument(); +}); + +test('should forward to Explore', async () => { + await renderModal(); + userEvent.click(screen.getByRole('button', { name: 'Edit chart' })); + expect(mockHistoryPush).toHaveBeenCalledWith( + `/explore/?dashboard_page_id=&slice_id=${sliceId}`, + ); +}); diff --git a/superset-frontend/src/components/Chart/DrillDetail/DrillDetailModal.tsx b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailModal.tsx new file mode 100644 index 000000000000..e1207f8aac5f --- /dev/null +++ b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailModal.tsx @@ -0,0 +1,118 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useCallback, useContext, useMemo } from 'react'; +import { useHistory } from 'react-router-dom'; +import { + BinaryQueryObjectFilterClause, + css, + QueryFormData, + t, + useTheme, +} from '@superset-ui/core'; +import Modal from 'src/components/Modal'; +import Button from 'src/components/Button'; +import { useSelector } from 'react-redux'; +import { DashboardPageIdContext } from 'src/dashboard/containers/DashboardPage'; +import { Slice } from 'src/types/Chart'; +import DrillDetailPane from './DrillDetailPane'; + +interface ModalFooterProps { + exploreChart: () => void; + closeModal?: () => void; +} + +const ModalFooter = ({ exploreChart, closeModal }: ModalFooterProps) => ( + <> + <Button buttonStyle="secondary" buttonSize="small" onClick={exploreChart}> + {t('Edit chart')} + </Button> + <Button + buttonStyle="primary" + buttonSize="small" + onClick={closeModal} + data-test="close-drilltodetail-modal" + > + {t('Close')} + </Button> + </> +); + +interface DrillDetailModalProps { + chartId: number; + formData: QueryFormData; + initialFilters: BinaryQueryObjectFilterClause[]; + showModal: boolean; + onHideModal: () => void; +} + +export default function DrillDetailModal({ + chartId, + formData, + initialFilters, + showModal, + onHideModal, +}: DrillDetailModalProps) { + const theme = useTheme(); + const history = useHistory(); + const dashboardPageId = useContext(DashboardPageIdContext); + const { slice_name: chartName } = useSelector( + (state: { sliceEntities: { slices: Record<number, Slice> } }) => + state.sliceEntities.slices[chartId], + ); + + const exploreUrl = useMemo( + () => `/explore/?dashboard_page_id=${dashboardPageId}&slice_id=${chartId}`, + [chartId, dashboardPageId], + ); + + const exploreChart = useCallback(() => { + history.push(exploreUrl); + }, [exploreUrl, history]); + + return ( + <Modal + show={showModal} + onHide={onHideModal ?? (() => null)} + css={css` + .ant-modal-body { + display: flex; + flex-direction: column; + } + `} + title={t('Drill to detail: %s', chartName)} + footer={<ModalFooter exploreChart={exploreChart} />} + responsive + resizable + resizableConfig={{ + minHeight: theme.gridUnit * 128, + minWidth: theme.gridUnit * 128, + defaultSize: { + width: 'auto', + height: '75vh', + }, + }} + draggable + destroyOnClose + maskClosable={false} + > + <DrillDetailPane formData={formData} initialFilters={initialFilters} /> + </Modal> + ); +} diff --git a/superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.test.tsx b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.test.tsx new file mode 100644 index 000000000000..a6c8fd06b07f --- /dev/null +++ b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.test.tsx @@ -0,0 +1,200 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import { getMockStoreWithNativeFilters } from 'spec/fixtures/mockStore'; +import chartQueries, { sliceId } from 'spec/fixtures/mockChartQueries'; +import { QueryFormData, SupersetClient } from '@superset-ui/core'; +import fetchMock from 'fetch-mock'; +import DrillDetailPane from './DrillDetailPane'; + +const chart = chartQueries[sliceId]; +const setup = (overrides: Record<string, any> = {}) => { + const store = getMockStoreWithNativeFilters(); + const props = { + initialFilters: [], + formData: chart.form_data as unknown as QueryFormData, + ...overrides, + }; + return render(<DrillDetailPane {...props} />, { + useRedux: true, + store, + }); +}; + +const waitForRender = (overrides: Record<string, any> = {}) => + waitFor(() => setup(overrides)); + +const SAMPLES_ENDPOINT = + 'end:/datasource/samples?force=false&datasource_type=table&datasource_id=7&per_page=50&page=1'; + +const DATASET_ENDPOINT = 'glob:*/api/v1/dataset/*'; + +const MOCKED_DATASET = { + changed_on_humanized: '2 days ago', + created_on_humanized: 'a week ago', + description: 'Simple description', + table_name: 'test_table', + changed_by: { + first_name: 'John', + last_name: 'Doe', + }, + created_by: { + first_name: 'John', + last_name: 'Doe', + }, + owners: [ + { + first_name: 'John', + last_name: 'Doe', + }, + ], +}; + +const setupDatasetEndpoint = () => { + fetchMock.get(DATASET_ENDPOINT, { + status: 'complete', + result: MOCKED_DATASET, + }); +}; + +const fetchWithNoData = () => { + setupDatasetEndpoint(); + fetchMock.post(SAMPLES_ENDPOINT, { + result: { + total_count: 0, + data: [], + colnames: [], + coltypes: [], + }, + }); +}; + +const fetchWithData = () => { + setupDatasetEndpoint(); + fetchMock.post(SAMPLES_ENDPOINT, { + result: { + total_count: 3, + data: [ + { + year: 1996, + na_sales: 11.27, + eu_sales: 8.89, + }, + { + year: 1989, + na_sales: 23.2, + eu_sales: 2.26, + }, + { + year: 1999, + na_sales: 9, + eu_sales: 6.18, + }, + ], + colnames: ['year', 'na_sales', 'eu_sales'], + coltypes: [0, 0, 0], + }, + }); +}; + +afterEach(fetchMock.restore); + +test('should render', async () => { + fetchWithNoData(); + const { container } = await waitForRender(); + expect(container).toBeInTheDocument(); +}); + +test('should render loading indicator', async () => { + fetchWithData(); + setup(); + await waitFor(() => + expect(screen.getByLabelText('Loading')).toBeInTheDocument(), + ); +}); + +test('should render the table with results', async () => { + fetchWithData(); + await waitForRender(); + expect(screen.getByRole('table')).toBeInTheDocument(); + expect(screen.getByText('1996')).toBeInTheDocument(); + expect(screen.getByText('11.27')).toBeInTheDocument(); + expect(screen.getByText('1989')).toBeInTheDocument(); + expect(screen.getByText('23.2')).toBeInTheDocument(); + expect(screen.getByText('1999')).toBeInTheDocument(); + expect(screen.getByText('9')).toBeInTheDocument(); + expect( + screen.getByRole('columnheader', { name: 'year' }), + ).toBeInTheDocument(); + expect( + screen.getByRole('columnheader', { name: 'na_sales' }), + ).toBeInTheDocument(); + expect( + screen.getByRole('columnheader', { name: 'eu_sales' }), + ).toBeInTheDocument(); +}); + +test('should render the "No results" components', async () => { + fetchWithNoData(); + setup(); + expect( + await screen.findByText('No rows were returned for this dataset'), + ).toBeInTheDocument(); +}); + +test('should render the metadata bar', async () => { + fetchWithNoData(); + setup(); + expect( + await screen.findByText(MOCKED_DATASET.table_name), + ).toBeInTheDocument(); + expect( + await screen.findByText(MOCKED_DATASET.description), + ).toBeInTheDocument(); + expect( + await screen.findByText( + `${MOCKED_DATASET.created_by.first_name} ${MOCKED_DATASET.created_by.last_name}`, + ), + ).toBeInTheDocument(); + expect( + await screen.findByText(MOCKED_DATASET.changed_on_humanized), + ).toBeInTheDocument(); +}); + +test('should render an error message when fails to load the metadata', async () => { + fetchWithNoData(); + fetchMock.get( + DATASET_ENDPOINT, + { status: 'error', error: 'Some error' }, + { overwriteRoutes: true }, + ); + setup(); + expect( + await screen.findByText('There was an error loading the dataset metadata'), + ).toBeInTheDocument(); +}); + +test('should render the error', async () => { + jest + .spyOn(SupersetClient, 'post') + .mockRejectedValue(new Error('Something went wrong')); + await waitForRender(); + expect(screen.getByText('Error: Something went wrong')).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.tsx b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.tsx new file mode 100644 index 000000000000..cf387b4e7e82 --- /dev/null +++ b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.tsx @@ -0,0 +1,397 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { + useState, + useEffect, + useMemo, + useCallback, + useRef, + ReactElement, +} from 'react'; +import { useSelector } from 'react-redux'; +import { + BinaryQueryObjectFilterClause, + css, + ensureIsArray, + t, + useTheme, + QueryFormData, + JsonObject, + GenericDataType, +} from '@superset-ui/core'; +import { useResizeDetector } from 'react-resize-detector'; +import Loading from 'src/components/Loading'; +import BooleanCell from 'src/components/Table/cell-renderers/BooleanCell'; +import NullCell from 'src/components/Table/cell-renderers/NullCell'; +import TimeCell from 'src/components/Table/cell-renderers/TimeCell'; +import { EmptyStateMedium } from 'src/components/EmptyState'; +import { getDatasourceSamples } from 'src/components/Chart/chartAction'; +import Table, { + ColumnsType, + TablePaginationConfig, + TableSize, +} from 'src/components/Table'; +import MetadataBar, { + ContentType, + MetadataType, +} from 'src/components/MetadataBar'; +import Alert from 'src/components/Alert'; +import { useApiV1Resource } from 'src/hooks/apiResources'; +import HeaderWithRadioGroup from 'src/components/Table/header-renderers/HeaderWithRadioGroup'; +import TableControls from './DrillDetailTableControls'; +import { getDrillPayload } from './utils'; +import { Dataset, ResultsPage } from './types'; + +const PAGE_SIZE = 50; + +interface DataType { + [key: string]: any; +} + +// Must be outside of the main component due to problems in +// react-resize-detector with conditional rendering +// https://github.com/maslianok/react-resize-detector/issues/178 +function Resizable({ children }: { children: ReactElement }) { + const { ref, height } = useResizeDetector(); + return ( + <div ref={ref} css={{ flex: 1 }}> + {React.cloneElement(children, { height })} + </div> + ); +} + +enum TimeFormatting { + Original, + Formatted, +} + +export default function DrillDetailPane({ + formData, + initialFilters, +}: { + formData: QueryFormData; + initialFilters: BinaryQueryObjectFilterClause[]; +}) { + const theme = useTheme(); + const [pageIndex, setPageIndex] = useState(0); + const lastPageIndex = useRef(pageIndex); + const [filters, setFilters] = useState(initialFilters); + const [isLoading, setIsLoading] = useState(false); + const [responseError, setResponseError] = useState(''); + const [resultsPages, setResultsPages] = useState<Map<number, ResultsPage>>( + new Map(), + ); + const [timeFormatting, setTimeFormatting] = useState({}); + + const SAMPLES_ROW_LIMIT = useSelector( + (state: { common: { conf: JsonObject } }) => + state.common.conf.SAMPLES_ROW_LIMIT, + ); + + // Extract datasource ID/type from string ID + const [datasourceId, datasourceType] = useMemo( + () => formData.datasource.split('__'), + [formData.datasource], + ); + + // Get page of results + const resultsPage = useMemo(() => { + const nextResultsPage = resultsPages.get(pageIndex); + if (nextResultsPage) { + lastPageIndex.current = pageIndex; + return nextResultsPage; + } + + return resultsPages.get(lastPageIndex.current); + }, [pageIndex, resultsPages]); + + const mappedColumns: ColumnsType<DataType> = useMemo( + () => + resultsPage?.colNames.map((column, index) => ({ + key: column, + dataIndex: column, + title: + resultsPage?.colTypes[index] === GenericDataType.TEMPORAL ? ( + <HeaderWithRadioGroup + headerTitle={column} + groupTitle={t('Formatting')} + groupOptions={[ + { label: t('Original value'), value: TimeFormatting.Original }, + { + label: t('Formatted value'), + value: TimeFormatting.Formatted, + }, + ]} + value={ + timeFormatting[column] === TimeFormatting.Original + ? TimeFormatting.Original + : TimeFormatting.Formatted + } + onChange={value => + setTimeFormatting(state => ({ ...state, [column]: value })) + } + /> + ) : ( + column + ), + render: value => { + if (value === true || value === false) { + return <BooleanCell value={value} />; + } + if (value === null) { + return <NullCell />; + } + if ( + resultsPage?.colTypes[index] === GenericDataType.TEMPORAL && + timeFormatting[column] !== TimeFormatting.Original && + (typeof value === 'number' || value instanceof Date) + ) { + return <TimeCell value={value} />; + } + return String(value); + }, + width: 150, + })) || [], + [resultsPage?.colNames, resultsPage?.colTypes, timeFormatting], + ); + + const data: DataType[] = useMemo( + () => + resultsPage?.data.map((row, index) => + resultsPage?.colNames.reduce( + (acc, curr) => ({ ...acc, [curr]: row[curr] }), + { + key: index, + }, + ), + ) || [], + [resultsPage?.colNames, resultsPage?.data], + ); + + // Clear cache on reload button click + const handleReload = useCallback(() => { + setResponseError(''); + setResultsPages(new Map()); + setPageIndex(0); + }, []); + + // Clear cache and reset page index if filters change + useEffect(() => { + setResponseError(''); + setResultsPages(new Map()); + setPageIndex(0); + }, [filters]); + + // Update cache order if page in cache + useEffect(() => { + if ( + resultsPages.has(pageIndex) && + [...resultsPages.keys()].at(-1) !== pageIndex + ) { + const nextResultsPages = new Map(resultsPages); + nextResultsPages.delete(pageIndex); + setResultsPages( + nextResultsPages.set( + pageIndex, + resultsPages.get(pageIndex) as ResultsPage, + ), + ); + } + }, [pageIndex, resultsPages]); + + // Download page of results & trim cache if page not in cache + useEffect(() => { + if (!responseError && !isLoading && !resultsPages.has(pageIndex)) { + setIsLoading(true); + const jsonPayload = getDrillPayload(formData, filters) ?? {}; + const cachePageLimit = Math.ceil(SAMPLES_ROW_LIMIT / PAGE_SIZE); + getDatasourceSamples( + datasourceType, + datasourceId, + false, + jsonPayload, + PAGE_SIZE, + pageIndex + 1, + ) + .then(response => { + setResultsPages( + new Map([ + ...[...resultsPages.entries()].slice(-cachePageLimit + 1), + [ + pageIndex, + { + total: response.total_count, + data: response.data, + colNames: ensureIsArray(response.colnames), + colTypes: ensureIsArray(response.coltypes), + }, + ], + ]), + ); + setResponseError(''); + }) + .catch(error => { + setResponseError(`${error.name}: ${error.message}`); + }) + .finally(() => { + setIsLoading(false); + }); + } + }, [ + SAMPLES_ROW_LIMIT, + datasourceId, + datasourceType, + filters, + formData, + isLoading, + pageIndex, + responseError, + resultsPages, + ]); + + // Get datasource metadata + const response = useApiV1Resource<Dataset>(`/api/v1/dataset/${datasourceId}`); + + const bootstrapping = + (!responseError && !resultsPages.size) || response.status === 'loading'; + + let tableContent = null; + if (responseError) { + // Render error if page download failed + tableContent = ( + <pre + css={css` + margin-top: ${theme.gridUnit * 4}px; + `} + > + {responseError} + </pre> + ); + } else if (bootstrapping) { + // Render loading if first page hasn't loaded + tableContent = <Loading />; + } else if (resultsPage?.total === 0) { + // Render empty state if no results are returned for page + const title = t('No rows were returned for this dataset'); + tableContent = <EmptyStateMedium image="document.svg" title={title} />; + } else { + // Render table if at least one page has successfully loaded + tableContent = ( + <Resizable> + <Table + data={data} + columns={mappedColumns} + size={TableSize.SMALL} + defaultPageSize={PAGE_SIZE} + recordCount={resultsPage?.total} + usePagination + loading={isLoading} + onChange={(pagination: TablePaginationConfig) => + setPageIndex(pagination.current ? pagination.current - 1 : 0) + } + resizable + virtualize + /> + </Resizable> + ); + } + + const metadata = useMemo(() => { + const { status, result } = response; + const items: ContentType[] = []; + if (result) { + const { + changed_on_humanized, + created_on_humanized, + description, + table_name, + changed_by, + created_by, + owners, + } = result; + const notAvailable = t('Not available'); + const createdBy = + `${created_by?.first_name ?? ''} ${ + created_by?.last_name ?? '' + }`.trim() || notAvailable; + const modifiedBy = changed_by + ? `${changed_by.first_name} ${changed_by.last_name}` + : notAvailable; + const formattedOwners = + owners.length > 0 + ? owners.map(owner => `${owner.first_name} ${owner.last_name}`) + : [notAvailable]; + items.push({ + type: MetadataType.TABLE, + title: table_name, + }); + items.push({ + type: MetadataType.LAST_MODIFIED, + value: changed_on_humanized, + modifiedBy, + }); + items.push({ + type: MetadataType.OWNER, + createdBy, + owners: formattedOwners, + createdOn: created_on_humanized, + }); + if (description) { + items.push({ + type: MetadataType.DESCRIPTION, + value: description, + }); + } + } + return ( + <div + css={css` + display: flex; + margin-bottom: ${theme.gridUnit * 4}px; + `} + > + {status === 'complete' && ( + <MetadataBar items={items} tooltipPlacement="bottom" /> + )} + {status === 'error' && ( + <Alert + type="error" + message={t('There was an error loading the dataset metadata')} + /> + )} + </div> + ); + }, [response, theme.gridUnit]); + + return ( + <> + {!bootstrapping && metadata} + {!bootstrapping && ( + <TableControls + filters={filters} + setFilters={setFilters} + totalCount={resultsPage?.total} + loading={isLoading} + onReload={handleReload} + /> + )} + {tableContent} + </> + ); +} diff --git a/superset-frontend/src/components/Chart/DrillDetail/DrillDetailTableControls.test.tsx b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailTableControls.test.tsx new file mode 100644 index 000000000000..179fc8ee3576 --- /dev/null +++ b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailTableControls.test.tsx @@ -0,0 +1,109 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; +import TableControls from './DrillDetailTableControls'; + +const setFilters = jest.fn(); +const onReload = jest.fn(); +const setup = (overrides: Record<string, any> = {}) => { + const props = { + filters: [], + setFilters, + onReload, + loading: false, + totalCount: 0, + ...overrides, + }; + return render(<TableControls {...props} />); +}; +test('should render', () => { + const { container } = setup(); + expect(container).toBeInTheDocument(); +}); + +test('should show 0 rows', () => { + setup(); + expect(screen.getByText('0 rows')).toBeInTheDocument(); +}); + +test('should show the correct amount of rows', () => { + setup({ + totalCount: 10, + }); + expect(screen.getByText('10 rows')).toBeInTheDocument(); +}); + +test('should render the reload button', () => { + setup(); + expect(screen.getByRole('button', { name: 'Reload' })).toBeInTheDocument(); +}); + +test('should show the loading indicator', () => { + setup({ + loading: true, + }); + expect(screen.getByText('Loading...')).toBeInTheDocument(); +}); + +test('should call onreload', () => { + setup(); + userEvent.click(screen.getByRole('button', { name: 'Reload' })); + expect(onReload).toHaveBeenCalledTimes(1); +}); + +test('should render with filters', () => { + setup({ + filters: [ + { + col: 'platform', + op: '==', + val: 'GB', + }, + { + col: 'lang', + op: '==', + val: 'IT', + }, + ], + }); + expect(screen.getByText('platform')).toBeInTheDocument(); + expect(screen.getByText('GB')).toBeInTheDocument(); + expect(screen.getByText('lang')).toBeInTheDocument(); + expect(screen.getByText('IT')).toBeInTheDocument(); +}); + +test('should remove the filters on close', () => { + setup({ + filters: [ + { + col: 'platform', + op: '==', + val: 'GB', + }, + ], + }); + expect(screen.getByText('platform')).toBeInTheDocument(); + expect(screen.getByText('GB')).toBeInTheDocument(); + + userEvent.click(screen.getByRole('img', { name: 'close' })); + + expect(setFilters).toHaveBeenCalledWith([]); +}); diff --git a/superset-frontend/src/components/Chart/DrillDetail/DrillDetailTableControls.tsx b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailTableControls.tsx new file mode 100644 index 000000000000..523cbaff3e45 --- /dev/null +++ b/superset-frontend/src/components/Chart/DrillDetail/DrillDetailTableControls.tsx @@ -0,0 +1,140 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useCallback, useMemo } from 'react'; +import { Tag } from 'antd'; +import { + BinaryQueryObjectFilterClause, + css, + isAdhocColumn, + t, + useTheme, +} from '@superset-ui/core'; +import RowCountLabel from 'src/explore/components/RowCountLabel'; +import Icons from 'src/components/Icons'; + +export default function TableControls({ + filters, + setFilters, + totalCount, + loading, + onReload, +}: { + filters: BinaryQueryObjectFilterClause[]; + setFilters: (filters: BinaryQueryObjectFilterClause[]) => void; + totalCount?: number; + loading: boolean; + onReload: () => void; +}) { + const theme = useTheme(); + const filterMap: Record<string, BinaryQueryObjectFilterClause> = useMemo( + () => + Object.assign( + {}, + ...filters.map(filter => ({ + [isAdhocColumn(filter.col) + ? (filter.col.label as string) + : filter.col]: filter, + })), + ), + [filters], + ); + + const removeFilter = useCallback( + colName => { + const updatedFilterMap = { ...filterMap }; + delete updatedFilterMap[colName]; + setFilters([...Object.values(updatedFilterMap)]); + }, + [filterMap, setFilters], + ); + + const filterTags = useMemo( + () => + Object.entries(filterMap) + .map(([colName, { val, formattedVal }]) => ({ + colName, + val: formattedVal ?? val, + })) + .sort((a, b) => a.colName.localeCompare(b.colName)), + [filterMap], + ); + + return ( + <div + css={css` + display: flex; + justify-content: space-between; + padding: ${theme.gridUnit / 2}px 0; + margin-bottom: ${theme.gridUnit * 2}px; + `} + > + <div + css={css` + display: flex; + flex-wrap: wrap; + margin-bottom: -${theme.gridUnit * 4}px; + `} + > + {filterTags.map(({ colName, val }) => ( + <Tag + closable + onClose={removeFilter.bind(null, colName)} + key={colName} + css={css` + height: ${theme.gridUnit * 6}px; + display: flex; + align-items: center; + padding: ${theme.gridUnit / 2}px ${theme.gridUnit * 2}px; + margin-right: ${theme.gridUnit * 4}px; + margin-bottom: ${theme.gridUnit * 4}px; + line-height: 1.2; + `} + data-test="filter-col" + > + <span + css={css` + margin-right: ${theme.gridUnit}px; + `} + > + {colName} + </span> + <strong data-test="filter-val">{val}</strong> + </Tag> + ))} + </div> + <div + css={css` + display: flex; + align-items: center; + height: min-content; + `} + > + <RowCountLabel loading={loading && !totalCount} rowcount={totalCount} /> + <Icons.ReloadOutlined + iconColor={theme.colors.grayscale.light1} + iconSize="l" + aria-label={t('Reload')} + role="button" + onClick={onReload} + /> + </div> + </div> + ); +} diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard_list/dashboard_list.helper.ts b/superset-frontend/src/components/Chart/DrillDetail/index.ts similarity index 91% rename from superset-frontend/cypress-base/cypress/integration/dashboard_list/dashboard_list.helper.ts rename to superset-frontend/src/components/Chart/DrillDetail/index.ts index 5ccb39432cd8..cf154680becb 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard_list/dashboard_list.helper.ts +++ b/superset-frontend/src/components/Chart/DrillDetail/index.ts @@ -16,4 +16,5 @@ * specific language governing permissions and limitations * under the License. */ -export const DASHBOARD_LIST = '/dashboard/list/'; + +export { default as DrillDetailMenuItems } from './DrillDetailMenuItems'; diff --git a/superset-frontend/src/views/CRUD/chart/types.ts b/superset-frontend/src/components/Chart/DrillDetail/types.ts similarity index 60% rename from superset-frontend/src/views/CRUD/chart/types.ts rename to superset-frontend/src/components/Chart/DrillDetail/types.ts index e16b42a23f18..ea49c22ce3f1 100644 --- a/superset-frontend/src/views/CRUD/chart/types.ts +++ b/superset-frontend/src/components/Chart/DrillDetail/types.ts @@ -16,13 +16,30 @@ * specific language governing permissions and limitations * under the License. */ -export type ChartObject = { - slice_name?: string; - description?: string; - viz_type?: string; - params?: string; - cache_timeout?: number; - datasource_id?: number; - datasource_type?: number; - is_managed_externally: boolean; +import { GenericDataType } from '@superset-ui/core'; + +export type ResultsPage = { + total: number; + data: Record<string, any>[]; + colNames: string[]; + colTypes: GenericDataType[]; +}; + +export type Dataset = { + changed_by?: { + first_name: string; + last_name: string; + }; + created_by?: { + first_name: string; + last_name: string; + }; + changed_on_humanized: string; + created_on_humanized: string; + description: string; + table_name: string; + owners: { + first_name: string; + last_name: string; + }[]; }; diff --git a/superset-frontend/src/components/Chart/DrillDetail/utils.ts b/superset-frontend/src/components/Chart/DrillDetail/utils.ts new file mode 100644 index 000000000000..03494024a985 --- /dev/null +++ b/superset-frontend/src/components/Chart/DrillDetail/utils.ts @@ -0,0 +1,46 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { omit } from 'lodash'; +import { + ensureIsArray, + QueryFormData, + BinaryQueryObjectFilterClause, + buildQueryObject, +} from '@superset-ui/core'; + +export function getDrillPayload( + queryFormData?: QueryFormData, + drillFilters?: BinaryQueryObjectFilterClause[], +) { + if (!queryFormData) { + return undefined; + } + const queryObject = buildQueryObject(queryFormData); + const extras = omit(queryObject.extras, 'having'); + const filters = [ + ...ensureIsArray(queryObject.filters), + ...ensureIsArray(drillFilters).map(f => omit(f, 'formattedVal')), + ]; + return { + granularity: queryObject.granularity, + time_range: queryObject.time_range, + filters, + extras, + }; +} diff --git a/superset-frontend/src/components/Chart/chartAction.js b/superset-frontend/src/components/Chart/chartAction.js index b9aeffec4a4b..7418a8f8b72c 100644 --- a/superset-frontend/src/components/Chart/chartAction.js +++ b/superset-frontend/src/components/Chart/chartAction.js @@ -19,7 +19,7 @@ /* eslint no-undef: 'error' */ /* eslint no-param-reassign: ["error", { "props": false }] */ import moment from 'moment'; -import { t, SupersetClient } from '@superset-ui/core'; +import { t, SupersetClient, isDefined } from '@superset-ui/core'; import { getControlsState } from 'src/explore/store'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; import { @@ -30,10 +30,7 @@ import { shouldUseLegacyApi, getChartDataUri, } from 'src/explore/exploreUtils'; -import { - requiresQuery, - ANNOTATION_SOURCE_TYPES, -} from 'src/modules/AnnotationTypes'; +import { requiresQuery } from 'src/modules/AnnotationTypes'; import { addDangerToast } from 'src/components/MessageToasts/actions'; import { logEvent } from 'src/logger/actions'; @@ -139,6 +136,7 @@ const legacyChartDataRequest = async ( ...requestParams, url, postPayload: { form_data: formData }, + parseMethod: 'json-bigint', }; const clientMethod = @@ -196,6 +194,7 @@ const v1ChartDataRequest = async ( url, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), + parseMethod: 'json-bigint', }; return SupersetClient.post(querySettings); @@ -288,26 +287,35 @@ export function runAnnotationQuery({ : undefined; } - const isNative = annotation.sourceType === ANNOTATION_SOURCE_TYPES.NATIVE; - const url = getAnnotationJsonUrl( - annotation.value, - sliceFormData, - isNative, - force, - ); + const url = getAnnotationJsonUrl(annotation.value, force); const controller = new AbortController(); const { signal } = controller; dispatch(annotationQueryStarted(annotation, controller, sliceKey)); - return SupersetClient.get({ + const annotationIndex = fd?.annotation_layers?.findIndex( + it => it.name === annotation.name, + ); + if (annotationIndex >= 0) { + fd.annotation_layers[annotationIndex].overrides = sliceFormData; + } + + return SupersetClient.post({ url, signal, timeout: timeout * 1000, + headers: { 'Content-Type': 'application/json' }, + jsonPayload: buildV1ChartDataPayload({ + formData: fd, + force, + resultFormat: 'json', + resultType: 'full', + }), }) - .then(({ json }) => - dispatch(annotationQuerySuccess(annotation, json, sliceKey)), - ) + .then(({ json }) => { + const data = json?.result?.[0]?.annotation_data?.[annotation.name]; + return dispatch(annotationQuerySuccess(annotation, { data }, sliceKey)); + }) .catch(response => getClientErrorObject(response).then(err => { if (err.statusText === 'timeout') { @@ -598,10 +606,32 @@ export function refreshChart(chartKey, force, dashboardId) { }; } -export const getDatasetSamples = async (datasetId, force) => { - const endpoint = `/api/v1/dataset/${datasetId}/samples?force=${force}`; +export const getDatasourceSamples = async ( + datasourceType, + datasourceId, + force, + jsonPayload, + perPage, + page, +) => { try { - const response = await SupersetClient.get({ endpoint }); + const searchParams = { + force, + datasource_type: datasourceType, + datasource_id: datasourceId, + }; + + if (isDefined(perPage) && isDefined(page)) { + searchParams.per_page = perPage; + searchParams.page = page; + } + + const response = await SupersetClient.post({ + endpoint: '/datasource/samples', + jsonPayload, + searchParams, + }); + return response.json.result; } catch (err) { const clientError = await getClientErrorObject(err); diff --git a/superset-frontend/src/components/Chart/chartActions.test.js b/superset-frontend/src/components/Chart/chartActions.test.js index 7c7af00a4b2e..65b008de62f5 100644 --- a/superset-frontend/src/components/Chart/chartActions.test.js +++ b/superset-frontend/src/components/Chart/chartActions.test.js @@ -94,6 +94,25 @@ describe('chart actions', () => { ); expect(dispatch.args[0][0].type).toBe(actions.CHART_UPDATE_STARTED); }); + + it('should handle the bigint without regression', async () => { + getChartDataUriStub.restore(); + const mockBigIntUrl = '/mock/chart/data/bigint'; + const expectedBigNumber = '9223372036854775807'; + fetchMock.post(mockBigIntUrl, `{ "value": ${expectedBigNumber} }`, { + overwriteRoutes: true, + }); + getChartDataUriStub = sinon + .stub(exploreUtils, 'getChartDataUri') + .callsFake(() => URI(mockBigIntUrl)); + + const { json } = await actions.getChartDataRequest({ + formData: fakeMetadata, + }); + + expect(fetchMock.calls(mockBigIntUrl)).toHaveLength(1); + expect(json.value.toString()).toEqual(expectedBigNumber); + }); }); describe('legacy API', () => { @@ -194,5 +213,24 @@ describe('chart actions', () => { setupDefaultFetchMock(); }); }); + + it('should handle the bigint without regression', async () => { + getExploreUrlStub.restore(); + const mockBigIntUrl = '/mock/chart/data/bigint'; + const expectedBigNumber = '9223372036854775807'; + fetchMock.post(mockBigIntUrl, `{ "value": ${expectedBigNumber} }`, { + overwriteRoutes: true, + }); + getExploreUrlStub = sinon + .stub(exploreUtils, 'getExploreUrl') + .callsFake(() => mockBigIntUrl); + + const { json } = await actions.getChartDataRequest({ + formData: fakeMetadata, + }); + + expect(fetchMock.calls(mockBigIntUrl)).toHaveLength(1); + expect(json.result[0].value.toString()).toEqual(expectedBigNumber); + }); }); }); diff --git a/superset-frontend/src/components/Chart/chartReducer.ts b/superset-frontend/src/components/Chart/chartReducer.ts index 010140584c2b..1d1ae60ea614 100644 --- a/superset-frontend/src/components/Chart/chartReducer.ts +++ b/superset-frontend/src/components/Chart/chartReducer.ts @@ -22,6 +22,7 @@ import { HYDRATE_DASHBOARD } from 'src/dashboard/actions/hydrate'; import { DatasourcesAction } from 'src/dashboard/actions/datasources'; import { ChartState } from 'src/explore/types'; import { getFormDataFromControls } from 'src/explore/controlUtils'; +import { HYDRATE_EXPLORE } from 'src/explore/actions/hydrateExplore'; import { now } from 'src/utils/dates'; import * as actions from './chartAction'; @@ -129,10 +130,7 @@ export default function chartReducer( return { ...state, latestQueryFormData: action.value }; }, [actions.ANNOTATION_QUERY_STARTED](state) { - if ( - state.annotationQuery && - state.annotationQuery[action.annotation.name] - ) { + if (state.annotationQuery?.[action.annotation.name]) { state.annotationQuery[action.annotation.name].abort(); } const annotationQuery = { @@ -194,7 +192,7 @@ export default function chartReducer( delete charts[key]; return charts; } - if (action.type === HYDRATE_DASHBOARD) { + if (action.type === HYDRATE_DASHBOARD || action.type === HYDRATE_EXPLORE) { return { ...action.data.charts }; } if (action.type === DatasourcesAction.SET_DATASOURCES) { diff --git a/superset-frontend/src/components/Chart/utils.test.ts b/superset-frontend/src/components/Chart/utils.test.ts new file mode 100644 index 000000000000..b8de155a2afc --- /dev/null +++ b/superset-frontend/src/components/Chart/utils.test.ts @@ -0,0 +1,42 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getMenuAdjustedY } from './utils'; + +const originalInnerHeight = window.innerHeight; + +beforeEach(() => { + window.innerHeight = 500; +}); + +afterEach(() => { + window.innerHeight = originalInnerHeight; +}); + +test('correctly positions at upper edge of screen', () => { + expect(getMenuAdjustedY(75, 1)).toEqual(75); // No adjustment + expect(getMenuAdjustedY(75, 2)).toEqual(75); // No adjustment + expect(getMenuAdjustedY(75, 3)).toEqual(75); // No adjustment +}); + +test('correctly positions at lower edge of screen', () => { + expect(getMenuAdjustedY(425, 1)).toEqual(425); // No adjustment + expect(getMenuAdjustedY(425, 2)).toEqual(404); // Adjustment + expect(getMenuAdjustedY(425, 3)).toEqual(372); // Adjustment +}); diff --git a/superset-frontend/src/components/Chart/utils.ts b/superset-frontend/src/components/Chart/utils.ts new file mode 100644 index 000000000000..54fc5e892699 --- /dev/null +++ b/superset-frontend/src/components/Chart/utils.ts @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export const MENU_ITEM_HEIGHT = 32; +const MENU_VERTICAL_SPACING = 32; + +/** + * Calculates an adjusted Y-offset for a menu or submenu to prevent that + * menu from appearing offscreen + * + * @param clientY The original Y-offset + * @param itemsCount The number of menu items + */ +export function getMenuAdjustedY(clientY: number, itemsCount: number) { + // Viewport height + const vh = Math.max( + document.documentElement.clientHeight || 0, + window.innerHeight || 0, + ); + + const menuHeight = MENU_ITEM_HEIGHT * itemsCount + MENU_VERTICAL_SPACING; + // Always show the context menu inside the viewport + return vh - clientY < menuHeight ? vh - menuHeight : clientY; +} diff --git a/superset-frontend/src/components/Checkbox/Checkbox.tsx b/superset-frontend/src/components/Checkbox/Checkbox.tsx index 7162929a967f..249fca01841e 100644 --- a/superset-frontend/src/components/Checkbox/Checkbox.tsx +++ b/superset-frontend/src/components/Checkbox/Checkbox.tsx @@ -24,6 +24,7 @@ export interface CheckboxProps { checked: boolean; onChange: (val?: boolean) => void; style?: React.CSSProperties; + className?: string; } const Styles = styled.span` @@ -33,7 +34,12 @@ const Styles = styled.span` } `; -export default function Checkbox({ checked, onChange, style }: CheckboxProps) { +export default function Checkbox({ + checked, + onChange, + style, + className, +}: CheckboxProps) { return ( <Styles style={style} @@ -44,6 +50,7 @@ export default function Checkbox({ checked, onChange, style }: CheckboxProps) { tabIndex={0} aria-checked={checked} aria-label="Checkbox" + className={className || ''} > {checked ? <CheckboxChecked /> : <CheckboxUnchecked />} </Styles> diff --git a/superset-frontend/src/components/ConfirmStatusChange/index.tsx b/superset-frontend/src/components/ConfirmStatusChange/index.tsx index a11bc0eeab47..09c374bdb5c0 100644 --- a/superset-frontend/src/components/ConfirmStatusChange/index.tsx +++ b/superset-frontend/src/components/ConfirmStatusChange/index.tsx @@ -69,7 +69,7 @@ export default function ConfirmStatusChange({ return ( <> - {children && children(showConfirm)} + {children?.(showConfirm)} <DeleteModal description={description} onConfirm={confirm} diff --git a/superset-frontend/src/components/CopyToClipboard/index.jsx b/superset-frontend/src/components/CopyToClipboard/index.jsx index 95b6cdfdc0f7..d4f74904dbca 100644 --- a/superset-frontend/src/components/CopyToClipboard/index.jsx +++ b/superset-frontend/src/components/CopyToClipboard/index.jsx @@ -37,7 +37,7 @@ const propTypes = { }; const defaultProps = { - copyNode: <span>Copy</span>, + copyNode: <span>{t('Copy')}</span>, onCopyEnd: () => {}, shouldShowText: true, wrapped: true, diff --git a/superset-frontend/src/components/CronPicker/CronPicker.tsx b/superset-frontend/src/components/CronPicker/CronPicker.tsx index 631f7f24b430..385062e0cec8 100644 --- a/superset-frontend/src/components/CronPicker/CronPicker.tsx +++ b/superset-frontend/src/components/CronPicker/CronPicker.tsx @@ -110,6 +110,9 @@ export const CronPicker = styled((props: CronProps) => ( <ReactCronPicker locale={LOCALE} {...props} /> </ConfigProvider> ))` + .react-js-cron-field { + margin-bottom: 0px; + } .react-js-cron-select:not(.react-js-cron-custom-select) > div:first-of-type, .react-js-cron-custom-select { border-radius: ${({ theme }) => theme.gridUnit}px; @@ -119,4 +122,10 @@ export const CronPicker = styled((props: CronProps) => ( .react-js-cron-custom-select > div:first-of-type { border-radius: ${({ theme }) => theme.gridUnit}px; } + .react-js-cron-custom-select .ant-select-selection-placeholder { + flex: auto; + } + .react-js-cron-custom-select .ant-select-selection-overflow-item { + align-self: center; + } `; diff --git a/superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx b/superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx index 272249b54960..57b6a539ae18 100644 --- a/superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx +++ b/superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx @@ -18,25 +18,23 @@ */ import React from 'react'; +import fetchMock from 'fetch-mock'; import { render, screen, waitFor } from 'spec/helpers/testing-library'; -import { SupersetClient } from '@superset-ui/core'; +import { queryClient } from 'src/views/QueryProvider'; import userEvent from '@testing-library/user-event'; import DatabaseSelector, { DatabaseSelectorProps } from '.'; import { EmptyStateSmall } from '../EmptyState'; -const SupersetClientGet = jest.spyOn(SupersetClient, 'get'); - const createProps = (): DatabaseSelectorProps => ({ db: { id: 1, database_name: 'test', backend: 'test-postgresql', - allow_multi_schema_metadata_fetch: false, }, formMode: false, isDatabaseSelectEnabled: true, readOnly: false, - schema: undefined, + schema: 'public', sqlLabMode: true, getDbList: jest.fn(), handleError: jest.fn(), @@ -45,129 +43,133 @@ const createProps = (): DatabaseSelectorProps => ({ onSchemasLoad: jest.fn(), }); -beforeEach(() => { - jest.resetAllMocks(); - SupersetClientGet.mockImplementation( - async ({ endpoint }: { endpoint: string }) => { - if (endpoint.includes('schemas')) { - return { - json: { result: ['information_schema', 'public'] }, - } as any; - } - if (endpoint.includes('/function_names')) { - return { - json: { function_names: [] }, - } as any; - } - return { - json: { - count: 2, - description_columns: {}, - ids: [1, 2], - label_columns: { - allow_file_upload: 'Allow Csv Upload', - allow_ctas: 'Allow Ctas', - allow_cvas: 'Allow Cvas', - allow_dml: 'Allow Dml', - allow_multi_schema_metadata_fetch: - 'Allow Multi Schema Metadata Fetch', - allow_run_async: 'Allow Run Async', - allows_cost_estimate: 'Allows Cost Estimate', - allows_subquery: 'Allows Subquery', - allows_virtual_table_explore: 'Allows Virtual Table Explore', - disable_data_preview: 'Disables SQL Lab Data Preview', - backend: 'Backend', - changed_on: 'Changed On', - changed_on_delta_humanized: 'Changed On Delta Humanized', - 'created_by.first_name': 'Created By First Name', - 'created_by.last_name': 'Created By Last Name', - database_name: 'Database Name', - explore_database_id: 'Explore Database Id', - expose_in_sqllab: 'Expose In Sqllab', - force_ctas_schema: 'Force Ctas Schema', - id: 'Id', - }, - list_columns: [ - 'allow_file_upload', - 'allow_ctas', - 'allow_cvas', - 'allow_dml', - 'allow_multi_schema_metadata_fetch', - 'allow_run_async', - 'allows_cost_estimate', - 'allows_subquery', - 'allows_virtual_table_explore', - 'disable_data_preview', - 'backend', - 'changed_on', - 'changed_on_delta_humanized', - 'created_by.first_name', - 'created_by.last_name', - 'database_name', - 'explore_database_id', - 'expose_in_sqllab', - 'force_ctas_schema', - 'id', - ], - list_title: 'List Database', - order_columns: [ - 'allow_file_upload', - 'allow_dml', - 'allow_run_async', - 'changed_on', - 'changed_on_delta_humanized', - 'created_by.first_name', - 'database_name', - 'expose_in_sqllab', - ], - result: [ - { - allow_file_upload: false, - allow_ctas: false, - allow_cvas: false, - allow_dml: false, - allow_multi_schema_metadata_fetch: false, - allow_run_async: false, - allows_cost_estimate: null, - allows_subquery: true, - allows_virtual_table_explore: true, - disable_data_preview: false, - backend: 'postgresql', - changed_on: '2021-03-09T19:02:07.141095', - changed_on_delta_humanized: 'a day ago', - created_by: null, - database_name: 'test-postgres', - explore_database_id: 1, - expose_in_sqllab: true, - force_ctas_schema: null, - id: 1, - }, - { - allow_csv_upload: false, - allow_ctas: false, - allow_cvas: false, - allow_dml: false, - allow_multi_schema_metadata_fetch: false, - allow_run_async: false, - allows_cost_estimate: null, - allows_subquery: true, - allows_virtual_table_explore: true, - disable_data_preview: false, - backend: 'mysql', - changed_on: '2021-03-09T19:02:07.141095', - changed_on_delta_humanized: 'a day ago', - created_by: null, - database_name: 'test-mysql', - explore_database_id: 1, - expose_in_sqllab: true, - force_ctas_schema: null, - id: 2, - }, - ], - }, - } as any; +const fakeDatabaseApiResult = { + count: 2, + description_columns: {}, + ids: [1, 2], + label_columns: { + allow_file_upload: 'Allow Csv Upload', + allow_ctas: 'Allow Ctas', + allow_cvas: 'Allow Cvas', + allow_dml: 'Allow Dml', + allow_run_async: 'Allow Run Async', + allows_cost_estimate: 'Allows Cost Estimate', + allows_subquery: 'Allows Subquery', + allows_virtual_table_explore: 'Allows Virtual Table Explore', + disable_data_preview: 'Disables SQL Lab Data Preview', + backend: 'Backend', + changed_on: 'Changed On', + changed_on_delta_humanized: 'Changed On Delta Humanized', + 'created_by.first_name': 'Created By First Name', + 'created_by.last_name': 'Created By Last Name', + database_name: 'Database Name', + explore_database_id: 'Explore Database Id', + expose_in_sqllab: 'Expose In Sqllab', + force_ctas_schema: 'Force Ctas Schema', + id: 'Id', + }, + list_columns: [ + 'allow_file_upload', + 'allow_ctas', + 'allow_cvas', + 'allow_dml', + 'allow_run_async', + 'allows_cost_estimate', + 'allows_subquery', + 'allows_virtual_table_explore', + 'disable_data_preview', + 'backend', + 'changed_on', + 'changed_on_delta_humanized', + 'created_by.first_name', + 'created_by.last_name', + 'database_name', + 'explore_database_id', + 'expose_in_sqllab', + 'force_ctas_schema', + 'id', + ], + list_title: 'List Database', + order_columns: [ + 'allow_file_upload', + 'allow_dml', + 'allow_run_async', + 'changed_on', + 'changed_on_delta_humanized', + 'created_by.first_name', + 'database_name', + 'expose_in_sqllab', + ], + result: [ + { + allow_file_upload: false, + allow_ctas: false, + allow_cvas: false, + allow_dml: false, + allow_run_async: false, + allows_cost_estimate: null, + allows_subquery: true, + allows_virtual_table_explore: true, + disable_data_preview: false, + backend: 'postgresql', + changed_on: '2021-03-09T19:02:07.141095', + changed_on_delta_humanized: 'a day ago', + created_by: null, + database_name: 'test-postgres', + explore_database_id: 1, + expose_in_sqllab: true, + force_ctas_schema: null, + id: 1, }, - ); + { + allow_csv_upload: false, + allow_ctas: false, + allow_cvas: false, + allow_dml: false, + allow_run_async: false, + allows_cost_estimate: null, + allows_subquery: true, + allows_virtual_table_explore: true, + disable_data_preview: false, + backend: 'mysql', + changed_on: '2021-03-09T19:02:07.141095', + changed_on_delta_humanized: 'a day ago', + created_by: null, + database_name: 'test-mysql', + explore_database_id: 1, + expose_in_sqllab: true, + force_ctas_schema: null, + id: 2, + }, + ], +}; + +const fakeSchemaApiResult = { + count: 2, + result: ['information_schema', 'public'], +}; + +const fakeFunctionNamesApiResult = { + function_names: [], +}; + +const databaseApiRoute = 'glob:*/api/v1/database/?*'; +const schemaApiRoute = 'glob:*/api/v1/database/*/schemas/?*'; +const tablesApiRoute = 'glob:*/api/v1/database/*/tables/*'; + +function setupFetchMock() { + fetchMock.get(databaseApiRoute, fakeDatabaseApiResult); + fetchMock.get(schemaApiRoute, fakeSchemaApiResult); + fetchMock.get(tablesApiRoute, fakeFunctionNamesApiResult); +} + +beforeEach(() => { + queryClient.clear(); + setupFetchMock(); +}); + +afterEach(() => { + fetchMock.reset(); }); test('Should render', async () => { @@ -181,6 +183,8 @@ test('Refresh should work', async () => { render(<DatabaseSelector {...props} />, { useRedux: true }); + expect(fetchMock.calls(schemaApiRoute).length).toBe(0); + const select = screen.getByRole('combobox', { name: 'Select schema or type schema name', }); @@ -188,23 +192,22 @@ test('Refresh should work', async () => { userEvent.click(select); await waitFor(() => { - expect(SupersetClientGet).toBeCalledTimes(2); - expect(props.getDbList).toBeCalledTimes(0); + expect(fetchMock.calls(databaseApiRoute).length).toBe(1); + expect(fetchMock.calls(schemaApiRoute).length).toBe(1); expect(props.handleError).toBeCalledTimes(0); expect(props.onDbChange).toBeCalledTimes(0); expect(props.onSchemaChange).toBeCalledTimes(0); - expect(props.onSchemasLoad).toBeCalledTimes(0); }); + // click schema reload userEvent.click(screen.getByRole('button', { name: 'refresh' })); await waitFor(() => { - expect(SupersetClientGet).toBeCalledTimes(3); - expect(props.getDbList).toBeCalledTimes(1); + expect(fetchMock.calls(databaseApiRoute).length).toBe(1); + expect(fetchMock.calls(schemaApiRoute).length).toBe(2); expect(props.handleError).toBeCalledTimes(0); expect(props.onDbChange).toBeCalledTimes(0); expect(props.onSchemaChange).toBeCalledTimes(0); - expect(props.onSchemasLoad).toBeCalledTimes(2); }); }); @@ -220,9 +223,10 @@ test('Should database select display options', async () => { }); test('should show empty state if there are no options', async () => { - SupersetClientGet.mockImplementation( - async () => ({ json: { result: [] } } as any), - ); + fetchMock.reset(); + fetchMock.get(databaseApiRoute, { result: [] }); + fetchMock.get(schemaApiRoute, { result: [] }); + fetchMock.get(tablesApiRoute, { result: [] }); const props = createProps(); render( <DatabaseSelector @@ -272,7 +276,6 @@ test('Sends the correct db when changing the database', async () => { id: 2, database_name: 'test-mysql', backend: 'mysql', - allow_multi_schema_metadata_fetch: false, }), ), ); diff --git a/superset-frontend/src/components/DatabaseSelector/index.tsx b/superset-frontend/src/components/DatabaseSelector/index.tsx index 718177a13956..d78a94bde60f 100644 --- a/superset-frontend/src/components/DatabaseSelector/index.tsx +++ b/superset-frontend/src/components/DatabaseSelector/index.tsx @@ -19,11 +19,12 @@ import React, { ReactNode, useState, useMemo, useEffect } from 'react'; import { styled, SupersetClient, t } from '@superset-ui/core'; import rison from 'rison'; -import { Select } from 'src/components'; +import { AsyncSelect, Select } from 'src/components'; import Label from 'src/components/Label'; import { FormLabel } from 'src/components/Form'; import RefreshLabel from 'src/components/RefreshLabel'; import { useToasts } from 'src/components/MessageToasts/withToasts'; +import { useSchemas, SchemaOption } from 'src/hooks/apiResources'; const DatabaseSelectorWrapper = styled.div` ${({ theme }) => ` @@ -74,23 +75,19 @@ type DatabaseValue = { id: number; database_name: string; backend: string; - allow_multi_schema_metadata_fetch: boolean; }; export type DatabaseObject = { id: number; database_name: string; backend: string; - allow_multi_schema_metadata_fetch: boolean; }; -type SchemaValue = { label: string; value: string }; - export interface DatabaseSelectorProps { - db?: DatabaseObject; + db?: DatabaseObject | null; emptyState?: ReactNode; formMode?: boolean; - getDbList?: (arg0: any) => {}; + getDbList?: (arg0: any) => void; handleError: (msg: string) => void; isDatabaseSelectEnabled?: boolean; onDbChange?: (db: DatabaseObject) => void; @@ -117,6 +114,8 @@ const SelectLabel = ({ </LabelStyle> ); +const EMPTY_SCHEMA_OPTIONS: SchemaOption[] = []; + export default function DatabaseSelector({ db, formMode = false, @@ -132,23 +131,10 @@ export default function DatabaseSelector({ schema, sqlLabMode = false, }: DatabaseSelectorProps) { - const [loadingSchemas, setLoadingSchemas] = useState(false); - const [schemaOptions, setSchemaOptions] = useState<SchemaValue[]>([]); - const [currentDb, setCurrentDb] = useState<DatabaseValue | undefined>( - db - ? { - label: ( - <SelectLabel backend={db.backend} databaseName={db.database_name} /> - ), - value: db.id, - ...db, - } - : undefined, - ); - const [currentSchema, setCurrentSchema] = useState<SchemaValue | undefined>( - schema ? { label: schema, value: schema } : undefined, + const [currentDb, setCurrentDb] = useState<DatabaseValue | undefined>(); + const [currentSchema, setCurrentSchema] = useState<SchemaOption | undefined>( + schema ? { label: schema, value: schema, title: schema } : undefined, ); - const [refresh, setRefresh] = useState(0); const { addSuccessToast } = useToasts(); const loadDatabases = useMemo( @@ -199,8 +185,6 @@ export default function DatabaseSelector({ id: row.id, database_name: row.database_name, backend: row.backend, - allow_multi_schema_metadata_fetch: - row.allow_multi_schema_metadata_fetch, })); return { @@ -213,32 +197,55 @@ export default function DatabaseSelector({ ); useEffect(() => { - if (currentDb) { - setLoadingSchemas(true); - const queryParams = rison.encode({ force: refresh > 0 }); - const endpoint = `/api/v1/database/${currentDb.value}/schemas/?q=${queryParams}`; + setCurrentDb(current => + current?.id !== db?.id + ? db + ? { + label: ( + <SelectLabel + backend={db.backend} + databaseName={db.database_name} + /> + ), + value: db.id, + ...db, + } + : undefined + : current, + ); + }, [db]); - // TODO: Would be nice to add pagination in a follow-up. Needs endpoint changes. - SupersetClient.get({ endpoint }) - .then(({ json }) => { - const options = json.result.map((s: string) => ({ - value: s, - label: s, - title: s, - })); - if (onSchemasLoad) { - onSchemasLoad(options); - } - setSchemaOptions(options); - setLoadingSchemas(false); - if (refresh > 0) addSuccessToast('List refreshed'); - }) - .catch(() => { - setLoadingSchemas(false); - handleError(t('There was an error loading the schemas')); - }); + function changeSchema(schema: SchemaOption | undefined) { + setCurrentSchema(schema); + if (onSchemaChange) { + onSchemaChange(schema?.value); } - }, [currentDb, onSchemasLoad, refresh]); + } + + const { + data, + isFetching: loadingSchemas, + isFetched, + refetch, + } = useSchemas({ + dbId: currentDb?.value, + onSuccess: data => { + onSchemasLoad?.(data); + + if (data.length === 1) { + changeSchema(data[0]); + } else if (!data.find(schemaOption => schema === schemaOption.value)) { + changeSchema(undefined); + } + + if (isFetched) { + addSuccessToast('List refreshed'); + } + }, + onError: () => handleError(t('There was an error loading the schemas')), + }); + + const schemaOptions = data || EMPTY_SCHEMA_OPTIONS; function changeDataBase( value: { label: string; value: number }, @@ -254,13 +261,6 @@ export default function DatabaseSelector({ } } - function changeSchema(schema: SchemaValue) { - setCurrentSchema(schema); - if (onSchemaChange) { - onSchemaChange(schema.value); - } - } - function renderSelectRow(select: ReactNode, refreshBtn: ReactNode) { return ( <div className="section"> @@ -272,7 +272,7 @@ export default function DatabaseSelector({ function renderDatabaseSelect() { return renderSelectRow( - <Select + <AsyncSelect ariaLabel={t('Select database or type database name')} optionFilterProps={['database_name', 'value']} data-test="select-database" @@ -290,9 +290,9 @@ export default function DatabaseSelector({ } function renderSchemaSelect() { - const refreshIcon = !formMode && !readOnly && ( + const refreshIcon = !readOnly && ( <RefreshLabel - onClick={() => setRefresh(refresh + 1)} + onClick={() => refetch()} tooltipContent={t('Force refresh schema list')} /> ); @@ -302,11 +302,11 @@ export default function DatabaseSelector({ disabled={!currentDb || readOnly} header={<FormLabel>{t('Schema')}</FormLabel>} labelInValue - lazyLoading={false} loading={loadingSchemas} name="select-schema" + notFoundContent={t('No compatible schema found')} placeholder={t('Select schema or type schema name')} - onChange={item => changeSchema(item as SchemaValue)} + onChange={item => changeSchema(item as SchemaOption)} options={schemaOptions} showSearch value={currentSchema} diff --git a/superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx b/superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx index a7c29c51d91f..5ec5926808da 100644 --- a/superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx +++ b/superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx @@ -190,7 +190,7 @@ const ChangeDatasourceModal: FunctionComponent<ChangeDatasourceModalProps> = ({ ); }); onHide(); - addSuccessToast('Successfully changed dataset!'); + addSuccessToast(t('Successfully changed dataset!')); }; const handlerCancelConfirm = () => { @@ -251,7 +251,7 @@ const ChangeDatasourceModal: FunctionComponent<ChangeDatasourceModalProps> = ({ show={show} onHide={onHide} responsive - title={t('Change dataset')} + title={t('Swap dataset')} width={confirmChange ? '432px' : ''} height={confirmChange ? 'auto' : '540px'} hideFooter={!confirmChange} @@ -260,13 +260,13 @@ const ChangeDatasourceModal: FunctionComponent<ChangeDatasourceModalProps> = ({ {confirmChange && ( <ConfirmModalStyled> <div className="btn-container"> - <Button onClick={handlerCancelConfirm}>Cancel</Button> + <Button onClick={handlerCancelConfirm}>{t('Cancel')}</Button> <Button className="proceed-btn" buttonStyle="primary" onClick={handleChangeConfirm} > - Proceed + {t('Proceed')} </Button> </div> </ConfirmModalStyled> diff --git a/superset-frontend/src/components/Datasource/CollectionTable.tsx b/superset-frontend/src/components/Datasource/CollectionTable.tsx index 194d3765792c..baa53264c719 100644 --- a/superset-frontend/src/components/Datasource/CollectionTable.tsx +++ b/superset-frontend/src/components/Datasource/CollectionTable.tsx @@ -33,6 +33,14 @@ interface CRUDCollectionProps { expandFieldset?: ReactNode; extraButtons?: ReactNode; itemGenerator?: () => any; + itemCellProps?: (( + val: unknown, + label: string, + record: any, + ) => React.DetailedHTMLProps< + React.TdHTMLAttributes<HTMLTableCellElement>, + HTMLTableCellElement + >)[]; itemRenderers?: (( val: unknown, onChange: () => void, @@ -206,7 +214,7 @@ export default class CRUDCollection extends React.PureComponent< getLabel(col: any) { const { columnLabels } = this.props; - let label = columnLabels && columnLabels[col] ? columnLabels[col] : col; + let label = columnLabels?.[col] ? columnLabels[col] : col; if (label.startsWith('__')) { // special label-free columns (ie: caret for expand, delete cross) label = ''; @@ -335,8 +343,14 @@ export default class CRUDCollection extends React.PureComponent< ); } + getCellProps(record: any, col: any) { + const cellPropsFn = this.props.itemCellProps?.[col]; + const val = record[col]; + return cellPropsFn ? cellPropsFn(val, this.getLabel(col), record) : {}; + } + renderCell(record: any, col: any) { - const renderer = this.props.itemRenderers && this.props.itemRenderers[col]; + const renderer = this.props.itemRenderers?.[col]; const val = record[col]; const onChange = this.onCellChange.bind(this, record.id, col); return renderer ? renderer(val, onChange, this.getLabel(col), record) : val; @@ -366,7 +380,9 @@ export default class CRUDCollection extends React.PureComponent< } tds = tds.concat( tableColumns.map(col => ( - <td key={col}>{this.renderCell(record, col)}</td> + <td {...this.getCellProps(record, col)} key={col}> + {this.renderCell(record, col)} + </td> )), ); if (allowAddItem) { diff --git a/superset-frontend/src/components/Datasource/DatasourceEditor.jsx b/superset-frontend/src/components/Datasource/DatasourceEditor.jsx index cfc826da6aa7..9e453dba3d85 100644 --- a/superset-frontend/src/components/Datasource/DatasourceEditor.jsx +++ b/superset-frontend/src/components/Datasource/DatasourceEditor.jsx @@ -25,7 +25,7 @@ import Alert from 'src/components/Alert'; import Badge from 'src/components/Badge'; import shortid from 'shortid'; import { styled, SupersetClient, t, withTheme } from '@superset-ui/core'; -import { Select, Row, Col } from 'src/components'; +import { Select, AsyncSelect, Row, Col } from 'src/components'; import { FormLabel } from 'src/components/Form'; import Button from 'src/components/Button'; import Tabs from 'src/components/Tabs'; @@ -135,10 +135,10 @@ const checkboxGenerator = (d, onChange) => ( <CheckboxControl value={d} onChange={onChange} /> ); const DATA_TYPES = [ - { value: 'STRING', label: 'STRING' }, - { value: 'NUMERIC', label: 'NUMERIC' }, - { value: 'DATETIME', label: 'DATETIME' }, - { value: 'BOOLEAN', label: 'BOOLEAN' }, + { value: 'STRING', label: t('STRING') }, + { value: 'NUMERIC', label: t('NUMERIC') }, + { value: 'DATETIME', label: t('DATETIME') }, + { value: 'BOOLEAN', label: t('BOOLEAN') }, ]; const DATASOURCE_TYPES_ARR = [ @@ -236,6 +236,7 @@ function ColumnCollectionTable({ <TextAreaControl language="markdown" offerEditInModal={false} + resize="vertical" /> } /> @@ -499,7 +500,7 @@ ColumnCollectionTable.defaultProps = { allowAddItem: false, allowEditDataType: false, itemGenerator: () => ({ - column_name: '<new column>', + column_name: t('<new column>'), filterable: true, groupby: true, }), @@ -548,16 +549,18 @@ function OwnersSelector({ datasource, onChange }) { return SupersetClient.get({ endpoint: `/api/v1/dataset/related/owners?q=${query}`, }).then(response => ({ - data: response.json.result.map(item => ({ - value: item.value, - label: item.text, - })), + data: response.json.result + .filter(item => item.extra.active) + .map(item => ({ + value: item.value, + label: item.text, + })), totalCount: response.json.count, })); }, []); return ( - <Select + <AsyncSelect ariaLabel={t('Select owners')} mode="multiple" name="owners" @@ -598,9 +601,6 @@ class DatasourceEditor extends React.PureComponent { }), }, errors: [], - isDruid: - props.datasource.type === 'druid' || - props.datasource.datasource_type === 'druid', isSqla: props.datasource.datasource_type === 'table' || props.datasource.type === 'table', @@ -752,7 +752,9 @@ class DatasourceEditor extends React.PureComponent { database_name: datasource.database.database_name || datasource.database.name, schema_name: datasource.schema, - table_name: datasource.table_name, + table_name: datasource.table_name + ? encodeURIComponent(datasource.table_name) + : datasource.table_name, }; Object.entries(params).forEach(([key, value]) => { // rison can't encode the undefined value @@ -860,7 +862,11 @@ class DatasourceEditor extends React.PureComponent { fieldKey="description" label={t('Description')} control={ - <TextAreaControl language="markdown" offerEditInModal={false} /> + <TextAreaControl + language="markdown" + offerEditInModal={false} + resize="vertical" + /> } /> <Field @@ -894,6 +900,7 @@ class DatasourceEditor extends React.PureComponent { language="sql" controlId="fetch_values_predicate" minLines={5} + resize="vertical" /> } /> @@ -913,6 +920,7 @@ class DatasourceEditor extends React.PureComponent { controlId="extra" language="json" offerEditInModal={false} + resize="vertical" /> } /> @@ -977,8 +985,8 @@ class DatasourceEditor extends React.PureComponent { tableColumns={['name', 'config']} onChange={this.onDatasourcePropChange.bind(this, 'spatials')} itemGenerator={() => ({ - name: '<new spatial>', - type: '<no type>', + name: t('<new spatial>'), + type: t('<no type>'), config: null, })} collection={spatials} @@ -1093,25 +1101,12 @@ class DatasourceEditor extends React.PureComponent { minLines={20} maxLines={20} readOnly={!this.state.isEditMode} + resize="both" /> } /> </> )} - {this.state.isDruid && ( - <Field - fieldKey="json" - label={t('JSON')} - description={ - <div> - {t('The JSON metric or post aggregation definition.')} - </div> - } - control={ - <TextAreaControl language="json" offerEditInModal={false} /> - } - /> - )} </div> )} {this.state.datasourceType === DATASOURCE_TYPES.physical.key && ( @@ -1259,6 +1254,7 @@ class DatasourceEditor extends React.PureComponent { controlId="warning_markdown" language="markdown" offerEditInModal={false} + resize="vertical" /> } /> @@ -1269,10 +1265,15 @@ class DatasourceEditor extends React.PureComponent { allowAddItem onChange={this.onDatasourcePropChange.bind(this, 'metrics')} itemGenerator={() => ({ - metric_name: '<new metric>', + metric_name: t('<new metric>'), verbose_name: '', expression: '', })} + itemCellProps={{ + expression: () => ({ + width: '240px', + }), + }} itemRenderers={{ metric_name: (v, onChange, _, record) => ( <FlexRowContainer> @@ -1302,6 +1303,8 @@ class DatasourceEditor extends React.PureComponent { language="sql" offerEditInModal={false} minLines={5} + textAreaStyles={{ minWidth: '200px', maxWidth: '450px' }} + resize="both" /> ), description: (v, onChange, label) => ( @@ -1424,10 +1427,10 @@ class DatasourceEditor extends React.PureComponent { allowAddItem allowEditDataType itemGenerator={() => ({ - column_name: '<new column>', + column_name: t('<new column>'), filterable: true, groupby: true, - expression: '<enter SQL expression here>', + expression: t('<enter SQL expression here>'), __expanded: true, })} /> diff --git a/superset-frontend/src/components/Datasource/DatasourceEditor.test.jsx b/superset-frontend/src/components/Datasource/DatasourceEditor.test.jsx index 7ad7b9f9a842..1046c69f846e 100644 --- a/superset-frontend/src/components/Datasource/DatasourceEditor.test.jsx +++ b/superset-frontend/src/components/Datasource/DatasourceEditor.test.jsx @@ -19,7 +19,7 @@ import React from 'react'; import fetchMock from 'fetch-mock'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'spec/helpers/testing-library'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; import DatasourceEditor from 'src/components/Datasource/DatasourceEditor'; import mockDatasource from 'spec/fixtures/mockDatasource'; import * as featureFlags from 'src/featureFlags'; @@ -32,26 +32,26 @@ const props = { }; const DATASOURCE_ENDPOINT = 'glob:*/datasource/external_metadata_by_name/*'; +const asyncRender = props => + waitFor(() => render(<DatasourceEditor {...props} />, { useRedux: true })); + describe('DatasourceEditor', () => { fetchMock.get(DATASOURCE_ENDPOINT, []); - let el; let isFeatureEnabledMock; - beforeEach(() => { - el = <DatasourceEditor {...props} />; - render(el, { useRedux: true }); - }); - - it('is valid', () => { - expect(React.isValidElement(el)).toBe(true); + beforeEach(async () => { + await asyncRender({ + ...props, + datasource: { ...props.datasource, table_name: 'Vehicle Sales +' }, + }); }); it('renders Tabs', () => { expect(screen.getByTestId('edit-dataset-tabs')).toBeInTheDocument(); }); - it('makes an async request', () => + it('can sync columns from source', () => new Promise(done => { const columnsTab = screen.getByTestId('collection-tab-Columns'); @@ -63,6 +63,9 @@ describe('DatasourceEditor', () => { setTimeout(() => { expect(fetchMock.calls(DATASOURCE_ENDPOINT)).toHaveLength(1); + expect(fetchMock.calls(DATASOURCE_ENDPOINT)[0][0]).toContain( + 'Vehicle%20Sales%20%2B%27', + ); fetchMock.reset(); done(); }, 0); @@ -185,11 +188,8 @@ describe('DatasourceEditor', () => { .mockImplementation(() => true); }); - beforeEach(() => { - render(el, { useRedux: true }); - }); - - it('disable edit Source tab', () => { + it('disable edit Source tab', async () => { + await asyncRender(props); expect( screen.queryByRole('img', { name: /lock-locked/i }), ).not.toBeInTheDocument(); @@ -200,7 +200,7 @@ describe('DatasourceEditor', () => { describe('DatasourceEditor RTL', () => { it('properly renders the metric information', async () => { - render(<DatasourceEditor {...props} />, { useRedux: true }); + await asyncRender(props); const metricButton = screen.getByTestId('collection-tab-Metrics'); userEvent.click(metricButton); const expandToggle = await screen.findAllByLabelText(/toggle expand/i); @@ -213,9 +213,7 @@ describe('DatasourceEditor RTL', () => { expect(warningMarkdown.value).toEqual('someone'); }); it('properly updates the metric information', async () => { - render(<DatasourceEditor {...props} />, { - useRedux: true, - }); + await asyncRender(props); const metricButton = screen.getByTestId('collection-tab-Metrics'); userEvent.click(metricButton); const expandToggle = await screen.findAllByLabelText(/toggle expand/i); @@ -230,26 +228,22 @@ describe('DatasourceEditor RTL', () => { expect(certificationDetails.value).toEqual('I am typing something new'); }); it('shows the default datetime column', async () => { - render(<DatasourceEditor {...props} />, { useRedux: true }); + await asyncRender(props); const metricButton = screen.getByTestId('collection-tab-Columns'); userEvent.click(metricButton); - const dsDefaultDatetimeRadio = screen.getByTestId('radio-default-dttm-ds'); expect(dsDefaultDatetimeRadio).toBeChecked(); - const genderDefaultDatetimeRadio = screen.getByTestId( 'radio-default-dttm-gender', ); expect(genderDefaultDatetimeRadio).not.toBeChecked(); }); it('allows choosing only temporal columns as the default datetime', async () => { - render(<DatasourceEditor {...props} />, { useRedux: true }); + await asyncRender(props); const metricButton = screen.getByTestId('collection-tab-Columns'); userEvent.click(metricButton); - const dsDefaultDatetimeRadio = screen.getByTestId('radio-default-dttm-ds'); expect(dsDefaultDatetimeRadio).toBeEnabled(); - const genderDefaultDatetimeRadio = screen.getByTestId( 'radio-default-dttm-gender', ); diff --git a/superset-frontend/src/components/Datasource/DatasourceModal.test.jsx b/superset-frontend/src/components/Datasource/DatasourceModal.test.jsx index 9743e3a325f3..12be35052151 100644 --- a/superset-frontend/src/components/Datasource/DatasourceModal.test.jsx +++ b/superset-frontend/src/components/Datasource/DatasourceModal.test.jsx @@ -32,6 +32,7 @@ import { DatasourceModal } from 'src/components/Datasource'; import DatasourceEditor from 'src/components/Datasource/DatasourceEditor'; import * as featureFlags from 'src/featureFlags'; import mockDatasource from 'spec/fixtures/mockDatasource'; +import QueryProvider from 'src/views/QueryProvider'; const mockStore = configureStore([thunk]); const store = mockStore({}); @@ -53,9 +54,11 @@ const mockedProps = { async function mountAndWait(props = mockedProps) { const mounted = mount( - <Provider store={store}> - <DatasourceModal {...props} /> - </Provider>, + <QueryProvider> + <Provider store={store}> + <DatasourceModal {...props} /> + </Provider> + </QueryProvider>, { wrappingComponent: ThemeProvider, wrappingComponentProps: { theme: supersetTheme }, diff --git a/superset-frontend/src/components/Datasource/DatasourceModal.tsx b/superset-frontend/src/components/Datasource/DatasourceModal.tsx index 98f2e561db83..b0a0bb9c42f5 100644 --- a/superset-frontend/src/components/Datasource/DatasourceModal.tsx +++ b/superset-frontend/src/components/Datasource/DatasourceModal.tsx @@ -133,7 +133,7 @@ const DatasourceModal: FunctionComponent<DatasourceModalProps> = ({ setIsSaving(false); getClientErrorObject(response).then(({ error }) => { modal.error({ - title: 'Error', + title: t('Error'), content: error || t('An error has occurred'), okButtonProps: { danger: true, className: 'btn-danger' }, }); @@ -177,6 +177,8 @@ const DatasourceModal: FunctionComponent<DatasourceModalProps> = ({ content: renderSaveDialog(), onOk: onConfirmSave, icon: null, + okText: t('OK'), + cancelText: t('Cancel'), }); }; diff --git a/superset-frontend/src/components/Select/DeprecatedSelect.stories.tsx b/superset-frontend/src/components/DeprecatedSelect/DeprecatedSelect.stories.tsx similarity index 100% rename from superset-frontend/src/components/Select/DeprecatedSelect.stories.tsx rename to superset-frontend/src/components/DeprecatedSelect/DeprecatedSelect.stories.tsx diff --git a/superset-frontend/src/components/Select/DeprecatedSelect.tsx b/superset-frontend/src/components/DeprecatedSelect/DeprecatedSelect.tsx similarity index 99% rename from superset-frontend/src/components/Select/DeprecatedSelect.tsx rename to superset-frontend/src/components/DeprecatedSelect/DeprecatedSelect.tsx index 690f6379aaee..2e2c1e9546f4 100644 --- a/superset-frontend/src/components/Select/DeprecatedSelect.tsx +++ b/superset-frontend/src/components/DeprecatedSelect/DeprecatedSelect.tsx @@ -40,6 +40,7 @@ import { } from 'react-sortable-hoc'; import arrayMove from 'array-move'; import { useTheme } from '@superset-ui/core'; +import { findValue } from './utils'; import { WindowedSelectComponentType, WindowedSelectProps, @@ -59,7 +60,6 @@ import { InputProps, defaultTheme, } from './styles'; -import { findValue } from './utils'; type AnyReactSelect<OptionType extends OptionTypeBase> = | BasicSelect<OptionType> @@ -90,7 +90,7 @@ export type SupersetStyledSelectProps< // callback for paste event onPaste?: (e: SyntheticEvent) => void; forceOverflow?: boolean; - // for simplier theme overrides + // for simpler theme overrides themeConfig?: PartialThemeConfig; stylesConfig?: PartialStylesConfig; }; @@ -185,7 +185,7 @@ function styled< // `value` may be rendered values (strings), we want option objects const value: OptionType[] = findValue(value_, options || [], valueKey); - // Add backward compability to v1 API + // Add backward compatibility to v1 API const isMulti = isMulti_ === undefined ? multi : isMulti_; const isClearable = isClearable_ === undefined ? clearable : isClearable_; diff --git a/superset-frontend/src/components/Select/NativeSelect.tsx b/superset-frontend/src/components/DeprecatedSelect/NativeSelect.tsx similarity index 100% rename from superset-frontend/src/components/Select/NativeSelect.tsx rename to superset-frontend/src/components/DeprecatedSelect/NativeSelect.tsx diff --git a/superset-frontend/src/components/Select/OnPasteSelect.jsx b/superset-frontend/src/components/DeprecatedSelect/OnPasteSelect.jsx similarity index 98% rename from superset-frontend/src/components/Select/OnPasteSelect.jsx rename to superset-frontend/src/components/DeprecatedSelect/OnPasteSelect.jsx index e178a0a4c067..bffa5428a60d 100644 --- a/superset-frontend/src/components/Select/OnPasteSelect.jsx +++ b/superset-frontend/src/components/DeprecatedSelect/OnPasteSelect.jsx @@ -18,7 +18,7 @@ */ import React from 'react'; import PropTypes from 'prop-types'; -import { Select } from 'src/components/Select'; +import { Select } from 'src/components/DeprecatedSelect'; export default class OnPasteSelect extends React.Component { constructor(props) { diff --git a/superset-frontend/src/components/Select/OnPasteSelect.test.jsx b/superset-frontend/src/components/DeprecatedSelect/OnPasteSelect.test.jsx similarity index 97% rename from superset-frontend/src/components/Select/OnPasteSelect.test.jsx rename to superset-frontend/src/components/DeprecatedSelect/OnPasteSelect.test.jsx index 9c6af28d7a10..95d01cc28b9a 100644 --- a/superset-frontend/src/components/Select/OnPasteSelect.test.jsx +++ b/superset-frontend/src/components/DeprecatedSelect/OnPasteSelect.test.jsx @@ -20,7 +20,11 @@ import React from 'react'; import sinon from 'sinon'; import { shallow } from 'enzyme'; -import { Select, OnPasteSelect, CreatableSelect } from 'src/components/Select'; +import { + Select, + OnPasteSelect, + CreatableSelect, +} from 'src/components/DeprecatedSelect'; const defaultProps = { onChange: sinon.spy(), @@ -41,7 +45,7 @@ const defaultProps = { const defaultEvt = { preventDefault: sinon.spy(), clipboardData: { - getData: sinon.spy(() => ' United States, China , India, Canada, '), + getData: sinon.spy(() => ' United States, China, India, Canada, '), }, }; diff --git a/superset-frontend/src/components/Select/WindowedSelect/WindowedMenuList.tsx b/superset-frontend/src/components/DeprecatedSelect/WindowedSelect/WindowedMenuList.tsx similarity index 98% rename from superset-frontend/src/components/Select/WindowedSelect/WindowedMenuList.tsx rename to superset-frontend/src/components/DeprecatedSelect/WindowedSelect/WindowedMenuList.tsx index 8eb94b55d392..f29466b33988 100644 --- a/superset-frontend/src/components/Select/WindowedSelect/WindowedMenuList.tsx +++ b/superset-frontend/src/components/DeprecatedSelect/WindowedSelect/WindowedMenuList.tsx @@ -55,7 +55,7 @@ export type WindowedMenuListProps = { * grouped options just yet. */ -type MenuListPropsChildren<OptionType> = +type MenuListPropsChildren<OptionType extends OptionTypeBase> = | Component<OptionProps<OptionType>>[] | ReactElement[]; diff --git a/superset-frontend/src/components/Select/WindowedSelect/index.tsx b/superset-frontend/src/components/DeprecatedSelect/WindowedSelect/index.tsx similarity index 100% rename from superset-frontend/src/components/Select/WindowedSelect/index.tsx rename to superset-frontend/src/components/DeprecatedSelect/WindowedSelect/index.tsx diff --git a/superset-frontend/src/components/Select/WindowedSelect/windowed.tsx b/superset-frontend/src/components/DeprecatedSelect/WindowedSelect/windowed.tsx similarity index 85% rename from superset-frontend/src/components/Select/WindowedSelect/windowed.tsx rename to superset-frontend/src/components/DeprecatedSelect/WindowedSelect/windowed.tsx index 4c2f64aa13d7..a611cf36c96d 100644 --- a/superset-frontend/src/components/Select/WindowedSelect/windowed.tsx +++ b/superset-frontend/src/components/DeprecatedSelect/WindowedSelect/windowed.tsx @@ -68,13 +68,17 @@ export function MenuList<OptionType extends OptionTypeBase>({ export default function windowed<OptionType extends OptionTypeBase>( SelectComponent: ComponentType<SelectProps<OptionType>>, ): WindowedSelectComponentType<OptionType> { - function WindowedSelect( - props: WindowedSelectProps<OptionType>, - ref: React.RefObject<Select<OptionType>>, - ) { - const { components: components_ = {}, ...restProps } = props; - const components = { ...components_, MenuList }; - return <SelectComponent components={components} ref={ref} {...restProps} />; - } - return forwardRef(WindowedSelect); + const WindowedSelect = forwardRef( + ( + props: WindowedSelectProps<OptionType>, + ref: React.RefObject<Select<OptionType>>, + ) => { + const { components: components_ = {}, ...restProps } = props; + const components = { ...components_, MenuList }; + return ( + <SelectComponent components={components} ref={ref} {...restProps} /> + ); + }, + ); + return WindowedSelect; } diff --git a/superset-frontend/src/components/Select/index.ts b/superset-frontend/src/components/DeprecatedSelect/index.ts similarity index 100% rename from superset-frontend/src/components/Select/index.ts rename to superset-frontend/src/components/DeprecatedSelect/index.ts diff --git a/superset-frontend/src/components/DeprecatedSelect/styles.tsx b/superset-frontend/src/components/DeprecatedSelect/styles.tsx new file mode 100644 index 000000000000..f04cfbdba9ed --- /dev/null +++ b/superset-frontend/src/components/DeprecatedSelect/styles.tsx @@ -0,0 +1,406 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// Deprecated component +/* eslint-disable theme-colors/no-literal-colors */ + +import React, { CSSProperties, ComponentType, ReactNode } from 'react'; +import { SerializedStyles } from '@emotion/react'; +import { SupersetTheme, css } from '@superset-ui/core'; +import { + Styles, + Theme, + SelectComponentsConfig, + components as defaultComponents, + InputProps as ReactSelectInputProps, + Props as SelectProps, +} from 'react-select'; +import type { colors as reactSelectColors } from 'react-select/src/theme'; +import type { DeepNonNullable } from 'react-select/src/components'; +import { OptionType } from 'antd/lib/select'; +import { SupersetStyledSelectProps } from './DeprecatedSelect'; + +export const DEFAULT_CLASS_NAME = 'Select'; +export const DEFAULT_CLASS_NAME_PREFIX = 'Select'; + +type RecursivePartial<T> = { + [P in keyof T]?: RecursivePartial<T[P]>; +}; + +const colors = (theme: SupersetTheme) => ({ + primary: theme.colors.success.base, + danger: theme.colors.error.base, + warning: theme.colors.warning.base, + indicator: theme.colors.info.base, + almostBlack: theme.colors.grayscale.dark1, + grayDark: theme.colors.grayscale.dark1, + grayLight: theme.colors.grayscale.light2, + gray: theme.colors.grayscale.light1, + grayBg: theme.colors.grayscale.light4, + grayBgDarker: theme.colors.grayscale.light3, + grayBgDarkest: theme.colors.grayscale.light2, + grayHeading: theme.colors.grayscale.light1, + menuHover: theme.colors.grayscale.light3, + lightest: theme.colors.grayscale.light5, + darkest: theme.colors.grayscale.dark2, + grayBorder: theme.colors.grayscale.light2, + grayBorderLight: theme.colors.grayscale.light3, + grayBorderDark: theme.colors.grayscale.light1, + textDefault: theme.colors.grayscale.dark1, + textDarkest: theme.colors.grayscale.dark2, + dangerLight: theme.colors.error.light1, +}); + +export type ThemeConfig = { + borderRadius: number; + // z-index for menu dropdown + // (the same as `@z-index-above-dashboard-charts + 1` in variables.less) + zIndex: number; + colors: { + // add known colors + [key in keyof typeof reactSelectColors]: string; + } & { + [key in keyof ReturnType<typeof colors>]: string; + } & { + [key: string]: string; // any other colors + }; + spacing: Theme['spacing'] & { + // line height and font size must be pixels for easier computation + // of option item height in WindowedMenuList + lineHeight: number; + fontSize: number; + // other relative size must be string + minWidth: string; + }; +}; + +export type PartialThemeConfig = RecursivePartial<ThemeConfig>; + +export const defaultTheme: (theme: SupersetTheme) => PartialThemeConfig = + theme => ({ + borderRadius: theme.borderRadius, + zIndex: 11, + colors: colors(theme), + spacing: { + baseUnit: 3, + menuGutter: 0, + controlHeight: 34, + lineHeight: 19, + fontSize: 14, + minWidth: '6.5em', + }, + weights: theme.typography.weights, + }); + +// let styles accept serialized CSS, too +type CSSStyles = CSSProperties | SerializedStyles; +type styleFnWithSerializedStyles = ( + base: CSSProperties, + state: any, +) => CSSStyles | CSSStyles[]; + +export type StylesConfig = { + [key in keyof Styles]: styleFnWithSerializedStyles; +}; +export type PartialStylesConfig = Partial<StylesConfig>; + +export const DEFAULT_STYLES: PartialStylesConfig = { + container: ( + provider, + { + theme: { + spacing: { minWidth }, + }, + }, + ) => [ + provider, + css` + min-width: ${minWidth}; + `, + ], + placeholder: provider => [ + provider, + css` + white-space: nowrap; + `, + ], + indicatorSeparator: () => css` + display: none; + `, + indicatorsContainer: provider => [ + provider, + css` + i { + width: 1em; + display: inline-block; + } + `, + ], + clearIndicator: provider => [ + provider, + css` + padding: 4px 0 4px 6px; + `, + ], + control: ( + provider, + { isFocused, menuIsOpen, theme: { borderRadius, colors } }, + ) => { + const isPseudoFocused = isFocused && !menuIsOpen; + let borderColor = colors.grayBorder; + if (isPseudoFocused || menuIsOpen) { + borderColor = colors.grayBorderDark; + } + return [ + provider, + css` + border-color: ${borderColor}; + box-shadow: ${isPseudoFocused + ? 'inset 0 1px 1px rgba(0,0,0,.075), 0 0 0 3px rgba(0,0,0,.1)' + : 'none'}; + border-radius: ${menuIsOpen + ? `${borderRadius}px ${borderRadius}px 0 0` + : `${borderRadius}px`}; + &:hover { + border-color: ${borderColor}; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06); + } + flex-wrap: nowrap; + padding-left: 1px; + `, + ]; + }, + menu: (provider, { theme: { zIndex } }) => [ + provider, + css` + padding-bottom: 2em; + z-index: ${zIndex}; /* override at least multi-page pagination */ + width: auto; + min-width: 100%; + max-width: 80vw; + background: none; + box-shadow: none; + border: 0; + `, + ], + menuList: (provider, { theme: { borderRadius, colors } }) => [ + provider, + css` + background: ${colors.lightest}; + border-radius: 0 0 ${borderRadius}px ${borderRadius}px; + border: 1px solid ${colors.grayBorderDark}; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06); + margin-top: -1px; + border-top-color: ${colors.grayBorderLight}; + min-width: 100%; + width: auto; + border-radius: 0 0 ${borderRadius}px ${borderRadius}px; + padding-top: 0; + padding-bottom: 0; + `, + ], + option: ( + provider, + { + isDisabled, + isFocused, + isSelected, + theme: { + colors, + spacing: { lineHeight, fontSize }, + weights, + }, + }, + ) => { + let color = colors.textDefault; + let backgroundColor = colors.lightest; + if (isFocused) { + backgroundColor = colors.grayBgDarker; + } else if (isDisabled) { + color = '#ccc'; + } + return [ + provider, + css` + cursor: pointer; + line-height: ${lineHeight}px; + font-size: ${fontSize}px; + background-color: ${backgroundColor}; + color: ${color}; + font-weight: ${isSelected ? weights.bold : weights.normal}; + white-space: nowrap; + &:hover:active { + background-color: ${colors.grayBg}; + } + `, + ]; + }, + valueContainer: ( + provider, + { + isMulti, + hasValue, + theme: { + spacing: { baseUnit }, + }, + }, + ) => [ + provider, + css` + padding-left: ${isMulti && hasValue ? 1 : baseUnit * 3}px; + `, + ], + multiValueLabel: ( + provider, + { + theme: { + spacing: { baseUnit }, + }, + }, + ) => ({ + ...provider, + paddingLeft: baseUnit * 1.2, + paddingRight: baseUnit * 1.2, + }), + input: (provider, { selectProps }) => [ + provider, + css` + margin-left: 0; + vertical-align: middle; + ${selectProps?.isMulti && selectProps?.value?.length + ? 'padding: 0 6px; width: 100%' + : 'padding: 0; flex: 1 1 auto;'}; + `, + ], + menuPortal: base => ({ + ...base, + zIndex: 1030, // must be same or higher of antd popover + }), +}; + +const INPUT_TAG_BASE_STYLES = { + background: 'none', + border: 'none', + outline: 'none', + padding: 0, +}; + +export type SelectComponentsType = Omit< + SelectComponentsConfig<any>, + 'Input' +> & { + Input: ComponentType<InputProps>; +}; + +// react-select is missing selectProps from their props type +// so overwriting it here to avoid errors +export type InputProps = ReactSelectInputProps & { + placeholder?: ReactNode; + selectProps: SelectProps; + autoComplete?: string; + onPaste?: SupersetStyledSelectProps<OptionType>['onPaste']; + inputStyle?: object; +}; + +const { ClearIndicator, DropdownIndicator, Option, Input, SelectContainer } = + defaultComponents as Required<DeepNonNullable<SelectComponentsType>>; + +export const DEFAULT_COMPONENTS: SelectComponentsType = { + SelectContainer: ({ children, ...props }) => { + const { + selectProps: { assistiveText }, + } = props; + return ( + <div> + <SelectContainer {...props}>{children}</SelectContainer> + {assistiveText && ( + <span + css={(theme: SupersetTheme) => ({ + marginLeft: 3, + fontSize: theme.typography.sizes.s, + color: theme.colors.grayscale.light1, + })} + > + {assistiveText} + </span> + )} + </div> + ); + }, + Option: ({ children, innerProps, data, ...props }) => ( + <Option + {...props} + data={data} + css={data?.style ? data.style : null} + innerProps={innerProps} + > + {children} + </Option> + ), + ClearIndicator: props => ( + <ClearIndicator {...props}> + <i className="fa">×</i> + </ClearIndicator> + ), + DropdownIndicator: props => ( + <DropdownIndicator {...props}> + <i + className={`fa fa-caret-${ + props.selectProps.menuIsOpen ? 'up' : 'down' + }`} + /> + </DropdownIndicator> + ), + Input: (props: InputProps) => { + const { getStyles } = props; + return ( + <Input + {...props} + css={getStyles('input', props)} + autoComplete="chrome-off" + inputStyle={INPUT_TAG_BASE_STYLES} + /> + ); + }, +}; + +export const VALUE_LABELED_STYLES: PartialStylesConfig = { + valueContainer: ( + provider, + { + getValue, + theme: { + spacing: { baseUnit }, + }, + isMulti, + }, + ) => ({ + ...provider, + paddingLeft: getValue().length > 0 ? 1 : baseUnit * 3, + overflow: isMulti && getValue().length > 0 ? 'visible' : 'hidden', + }), + // render single value as is they are multi-value + singleValue: (provider, props) => { + const { getStyles } = props; + return { + ...getStyles('multiValue', props), + '.metric-option': getStyles('multiValueLabel', props), + }; + }, +}; diff --git a/superset-frontend/src/components/Select/utils.ts b/superset-frontend/src/components/DeprecatedSelect/utils.ts similarity index 66% rename from superset-frontend/src/components/Select/utils.ts rename to superset-frontend/src/components/DeprecatedSelect/utils.ts index 9836b9ddd2ea..497791b62d75 100644 --- a/superset-frontend/src/components/Select/utils.ts +++ b/superset-frontend/src/components/DeprecatedSelect/utils.ts @@ -16,23 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -import { ReactNode } from 'react'; -import { ensureIsArray } from '@superset-ui/core'; import { OptionTypeBase, ValueType, OptionsType, GroupedOptionsType, } from 'react-select'; -import { LabeledValue as AntdLabeledValue } from 'antd/lib/select'; - -export function isObject(value: unknown): value is Record<string, unknown> { - return ( - value !== null && - typeof value === 'object' && - Array.isArray(value) === false - ); -} /** * Find Option value that matches a possibly string value. @@ -68,32 +57,3 @@ export function findValue<OptionType extends OptionTypeBase>( // empty: https://github.com/JedWatson/react-select/blob/32ad5c040bdd96cd1ca71010c2558842d684629c/packages/react-select/src/utils.js#L64 return (Array.isArray(value) ? value : [value]).map(find); } - -export function isLabeledValue(value: unknown): value is AntdLabeledValue { - return isObject(value) && 'value' in value && 'label' in value; -} - -export function getValue( - option: string | number | AntdLabeledValue | null | undefined, -) { - return isLabeledValue(option) ? option.value : option; -} - -type LabeledValue<V> = { label?: ReactNode; value?: V }; - -export function hasOption<V>( - value: V, - options?: V | LabeledValue<V> | (V | LabeledValue<V>)[], - checkLabel = false, -): boolean { - const optionsArray = ensureIsArray(options); - return ( - optionsArray.find( - x => - x === value || - (isObject(x) && - (('value' in x && x.value === value) || - (checkLabel && 'label' in x && x.label === value))), - ) !== undefined - ); -} diff --git a/superset-frontend/src/components/DesignSystem.stories.mdx b/superset-frontend/src/components/DesignSystem.stories.mdx new file mode 100644 index 000000000000..e00612c5be40 --- /dev/null +++ b/superset-frontend/src/components/DesignSystem.stories.mdx @@ -0,0 +1,25 @@ +import { Meta, Source } from '@storybook/addon-docs'; +import AtomicDesign from './atomic-design.png'; + +<Meta title="Design System/Introduction" /> + +# Superset Design System + +A design system is a complete set of standards intended to manage design at scale using reusable components and patterns. + +You can get an overview of Atomic Design concepts and a link to the full book on the topic here: + +<a href="https://bradfrost.com/blog/post/atomic-web-design/" target="_blank"> + Intro to Atomic Design +</a> + +While the Superset Design System will use Atomic Design principles, we choose a different language to describe the elements. + +| Atomic Design | Atoms | Molecules | Organisms | Templates | Pages / Screens | +| :-------------- | :---------: | :--------: | :-------: | :-------: | :-------------: | +| Superset Design | Foundations | Components | Patterns | Templates | Features | + +<img + src={AtomicDesign} + alt="Atoms = Foundations, Molecules = Components, Organisms = Patterns, Templates = Templates, Pages / Screens = Features" +/> diff --git a/superset-frontend/src/components/Dropdown/index.tsx b/superset-frontend/src/components/Dropdown/index.tsx index e5d5f9f8526c..c40f479579d2 100644 --- a/superset-frontend/src/components/Dropdown/index.tsx +++ b/superset-frontend/src/components/Dropdown/index.tsx @@ -20,6 +20,7 @@ import React, { RefObject } from 'react'; import { AntdDropdown } from 'src/components'; import { DropDownProps } from 'antd/lib/dropdown'; import { styled } from '@superset-ui/core'; +import Icons from 'src/components/Icons'; const MenuDots = styled.div` width: ${({ theme }) => theme.gridUnit * 0.75}px; @@ -66,14 +67,35 @@ const MenuDotsWrapper = styled.div` padding-left: ${({ theme }) => theme.gridUnit}px; `; -export interface DropdownProps { +export enum IconOrientation { + VERTICAL = 'vertical', + HORIZONTAL = 'horizontal', +} +export interface DropdownProps extends DropDownProps { overlay: React.ReactElement; + iconOrientation?: IconOrientation; } -export const Dropdown = ({ overlay, ...rest }: DropdownProps) => ( +const RenderIcon = ( + iconOrientation: IconOrientation = IconOrientation.VERTICAL, +) => { + const component = + iconOrientation === IconOrientation.HORIZONTAL ? ( + <Icons.MoreHoriz iconSize="xl" /> + ) : ( + <MenuDots /> + ); + return component; +}; + +export const Dropdown = ({ + overlay, + iconOrientation = IconOrientation.VERTICAL, + ...rest +}: DropdownProps) => ( <AntdDropdown overlay={overlay} {...rest}> <MenuDotsWrapper data-test="dropdown-trigger"> - <MenuDots /> + {RenderIcon(iconOrientation)} </MenuDotsWrapper> </AntdDropdown> ); diff --git a/superset-frontend/src/components/DropdownButton/index.tsx b/superset-frontend/src/components/DropdownButton/index.tsx index f2a223a49fd8..c6293f66a3fb 100644 --- a/superset-frontend/src/components/DropdownButton/index.tsx +++ b/superset-frontend/src/components/DropdownButton/index.tsx @@ -52,10 +52,9 @@ const StyledDropdownButton = styled.div` border-left: 1px solid ${({ theme }) => theme.colors.grayscale.light5}; content: ''; display: block; - height: 23px; + height: ${({ theme }) => theme.gridUnit * 8}px; margin: 0; position: absolute; - top: ${({ theme }) => theme.gridUnit * 0.75}px; width: ${({ theme }) => theme.gridUnit * 0.25}px; } diff --git a/superset-frontend/src/components/DropdownContainer/DropdownContainer.stories.tsx b/superset-frontend/src/components/DropdownContainer/DropdownContainer.stories.tsx new file mode 100644 index 000000000000..4aeaa03a16f3 --- /dev/null +++ b/superset-frontend/src/components/DropdownContainer/DropdownContainer.stories.tsx @@ -0,0 +1,109 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useCallback, useState } from 'react'; +import { isEqual } from 'lodash'; +import { css } from '@superset-ui/core'; +import Select from '../Select/Select'; +import Button from '../Button'; +import DropdownContainer, { DropdownContainerProps, Ref } from '.'; + +export default { + title: 'Design System/Components/DropdownContainer', + component: DropdownContainer, +}; + +const ITEMS_COUNT = 6; +const ITEM_OPTIONS = 10; +const MIN_WIDTH = 700; +const MAX_WIDTH = 1300; +const HEIGHT = 400; + +const itemsOptions = Array.from({ length: ITEM_OPTIONS }).map((_, i) => ({ + label: `Option ${i}`, + value: `option-${i}`, +})); + +type ItemsType = Pick<DropdownContainerProps, 'items'>['items']; + +type OverflowingState = { notOverflowed: string[]; overflowed: string[] }; + +const generateItems = (overflowingState?: OverflowingState) => + Array.from({ length: ITEMS_COUNT }).map((_, i) => ({ + id: `el-${i}`, + element: ( + <div style={{ minWidth: 150 }}> + <Select + options={itemsOptions} + header={`Label ${i}`} + headerPosition={ + overflowingState?.overflowed.includes(`el-${i}`) ? 'top' : 'left' + } + /> + </div> + ), + })); + +export const Component = (props: DropdownContainerProps) => { + const [items, setItems] = useState<ItemsType>([]); + const [overflowingState, setOverflowingState] = useState<OverflowingState>(); + const containerRef = React.useRef<Ref>(null); + const onOverflowingStateChange = useCallback( + value => { + if (!isEqual(overflowingState, value)) { + setItems(generateItems(value)); + setOverflowingState(value); + } + }, + [overflowingState], + ); + + return ( + <div> + <div + css={css` + overflow: auto; + min-width: ${MIN_WIDTH}px; + width: ${MIN_WIDTH}px; + max-width: ${MAX_WIDTH}px; + height: ${HEIGHT}px; + border: 1px solid lightgray; + resize: horizontal; + padding: 24px; + margin-bottom: 12px; + `} + > + <DropdownContainer + {...props} + items={items} + onOverflowingStateChange={onOverflowingStateChange} + ref={containerRef} + /> + </div> + <Button onClick={() => containerRef.current?.open()}>Open</Button> + <span + css={css` + margin-left: ${MIN_WIDTH - 340}px; + color: gray; + `} + > + Use the drag icon to resize the container + </span> + </div> + ); +}; diff --git a/superset-frontend/src/components/DropdownContainer/DropdownContainer.test.tsx b/superset-frontend/src/components/DropdownContainer/DropdownContainer.test.tsx new file mode 100644 index 000000000000..4a0fd9906226 --- /dev/null +++ b/superset-frontend/src/components/DropdownContainer/DropdownContainer.test.tsx @@ -0,0 +1,156 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import userEvent from '@testing-library/user-event'; +import { screen, render } from 'spec/helpers/testing-library'; +import Button from '../Button'; +import Icons from '../Icons'; +import DropdownContainer from '.'; + +const generateItems = (n: number) => + Array.from({ length: n }).map((_, i) => ({ + id: `el-${i + 1}`, + element: <Button>{`Element ${i + 1}`}</Button>, + })); + +const ITEMS = generateItems(10); + +const mockOverflowingIndex = async ( + overflowingIndex: number, + func: Function, +) => { + const spy = jest.spyOn(React, 'useState'); + spy.mockImplementation(() => [overflowingIndex, jest.fn()]); + await func(); + spy.mockRestore(); +}; + +test('renders children', () => { + render(<DropdownContainer items={generateItems(3)} />); + expect(screen.getByText('Element 1')).toBeInTheDocument(); + expect(screen.getByText('Element 2')).toBeInTheDocument(); + expect(screen.getByText('Element 3')).toBeInTheDocument(); +}); + +test('renders children with custom horizontal spacing', () => { + render(<DropdownContainer items={ITEMS} style={{ gap: 20 }} />); + expect(screen.getByTestId('container')).toHaveStyle('gap: 20px'); +}); + +test('renders a dropdown trigger when overflowing', async () => { + await mockOverflowingIndex(3, () => { + render(<DropdownContainer items={ITEMS} />); + expect(screen.getByText('More')).toBeInTheDocument(); + }); +}); + +test('renders a dropdown trigger with custom icon', async () => { + await mockOverflowingIndex(3, async () => { + render( + <DropdownContainer items={ITEMS} dropdownTriggerIcon={<Icons.Link />} />, + ); + expect( + await screen.findByRole('img', { name: 'link' }), + ).toBeInTheDocument(); + }); +}); + +test('renders a dropdown trigger with custom text', async () => { + await mockOverflowingIndex(3, () => { + const customText = 'Custom text'; + render( + <DropdownContainer items={ITEMS} dropdownTriggerText={customText} />, + ); + expect(screen.getByText(customText)).toBeInTheDocument(); + }); +}); + +test('renders a dropdown trigger with custom count', async () => { + await mockOverflowingIndex(3, () => { + const customCount = 99; + render( + <DropdownContainer items={ITEMS} dropdownTriggerCount={customCount} />, + ); + expect(screen.getByTitle(customCount)).toBeInTheDocument(); + }); +}); + +test('does not render a dropdown button when not overflowing', () => { + render(<DropdownContainer items={generateItems(3)} />); + expect(screen.queryByText('More')).not.toBeInTheDocument(); +}); + +test('renders a dropdown when overflowing', async () => { + await mockOverflowingIndex(3, () => { + render(<DropdownContainer items={ITEMS} />); + userEvent.click(screen.getByText('More')); + expect(screen.getByTestId('dropdown-content')).toBeInTheDocument(); + }); +}); + +test('renders children with custom vertical spacing', async () => { + await mockOverflowingIndex(3, () => { + render(<DropdownContainer items={ITEMS} dropdownStyle={{ gap: 20 }} />); + userEvent.click(screen.getByText('More')); + expect(screen.getByTestId('dropdown-content')).toHaveStyle('gap: 20px'); + }); +}); + +test('fires event when overflowing state changes', async () => { + await mockOverflowingIndex(3, () => { + const onOverflowingStateChange = jest.fn(); + render( + <DropdownContainer + items={generateItems(5)} + onOverflowingStateChange={onOverflowingStateChange} + />, + ); + expect(onOverflowingStateChange).toHaveBeenCalledWith({ + notOverflowed: ['el-1', 'el-2', 'el-3'], + overflowed: ['el-4', 'el-5'], + }); + }); +}); + +test('renders a dropdown with custom content', async () => { + await mockOverflowingIndex(3, () => { + const customDropdownContent = <div>Custom content</div>; + render( + <DropdownContainer + items={ITEMS} + dropdownContent={() => customDropdownContent} + />, + ); + userEvent.click(screen.getByText('More')); + expect(screen.getByText('Custom content')).toBeInTheDocument(); + }); +}); + +test('Shows tooltip on dropdown trigger hover', async () => { + await mockOverflowingIndex(3, async () => { + render( + <DropdownContainer + items={generateItems(5)} + dropdownTriggerTooltip="Test tooltip" + />, + ); + userEvent.hover(screen.getByText('More')); + expect(await screen.findByText('Test tooltip')).toBeInTheDocument(); + }); +}); diff --git a/superset-frontend/src/components/DropdownContainer/Overview.stories.mdx b/superset-frontend/src/components/DropdownContainer/Overview.stories.mdx new file mode 100644 index 000000000000..691dfeac7318 --- /dev/null +++ b/superset-frontend/src/components/DropdownContainer/Overview.stories.mdx @@ -0,0 +1,17 @@ +import { Meta, Source } from '@storybook/addon-docs'; + +<Meta title="Design System/Components/DropdownContainer/Overview" /> + +# Usage + +The dropdown container is used to display elements horizontally in a responsive way. If the elements don't fit in +the available width, they are displayed vertically in a dropdown. Some of the common applications in Superset are: + +- Display chart filters in the CRUD views +- Horizontally display native filters in a dashboard + +# Variations + +The component accepts any React element which ensures a high level of variability in Superset. + +To check the component in detail and its interactions, check the [DropdownContainer](/story/design-system-components-dropdowncontainer--component) page. diff --git a/superset-frontend/src/components/DropdownContainer/index.tsx b/superset-frontend/src/components/DropdownContainer/index.tsx new file mode 100644 index 000000000000..c90372973efb --- /dev/null +++ b/superset-frontend/src/components/DropdownContainer/index.tsx @@ -0,0 +1,408 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { + CSSProperties, + forwardRef, + ReactElement, + RefObject, + useEffect, + useImperativeHandle, + useLayoutEffect, + useMemo, + useState, + useRef, + ReactNode, +} from 'react'; +import { Global } from '@emotion/react'; +import { css, t, useTheme } from '@superset-ui/core'; +import { useResizeDetector } from 'react-resize-detector'; +import { usePrevious } from 'src/hooks/usePrevious'; +import Badge from '../Badge'; +import Icons from '../Icons'; +import Button from '../Button'; +import Popover from '../Popover'; +import { Tooltip } from '../Tooltip'; + +const MAX_HEIGHT = 500; + +/** + * Container item. + */ +export interface Item { + /** + * String that uniquely identifies the item. + */ + id: string; + /** + * The element to be rendered. + */ + element: ReactElement; +} + +/** + * Horizontal container that displays overflowed items in a dropdown. + * It shows an indicator of how many items are currently overflowing. + */ +export interface DropdownContainerProps { + /** + * Array of items. The id property is used to uniquely identify + * the elements when rendering or dealing with event handlers. + */ + items: Item[]; + /** + * Event handler called every time an element moves between + * main container and dropdown. + */ + onOverflowingStateChange?: (overflowingState: { + notOverflowed: string[]; + overflowed: string[]; + }) => void; + /** + * Option to customize the content of the dropdown. + */ + dropdownContent?: (overflowedItems: Item[]) => ReactElement; + /** + * Dropdown ref. + */ + dropdownRef?: RefObject<HTMLDivElement>; + /** + * Dropdown additional style properties. + */ + dropdownStyle?: CSSProperties; + /** + * Displayed count in the dropdown trigger. + */ + dropdownTriggerCount?: number; + /** + * Icon of the dropdown trigger. + */ + dropdownTriggerIcon?: ReactElement; + /** + * Text of the dropdown trigger. + */ + dropdownTriggerText?: string; + /** + * Text of the dropdown trigger tooltip + */ + dropdownTriggerTooltip?: ReactNode | null; + /** + * Main container additional style properties. + */ + style?: CSSProperties; +} + +export type Ref = HTMLDivElement & { open: () => void }; + +const DropdownContainer = forwardRef( + ( + { + items, + onOverflowingStateChange, + dropdownContent, + dropdownRef, + dropdownStyle = {}, + dropdownTriggerCount, + dropdownTriggerIcon, + dropdownTriggerText = t('More'), + dropdownTriggerTooltip = null, + style, + }: DropdownContainerProps, + outerRef: RefObject<Ref>, + ) => { + const theme = useTheme(); + const { ref, width = 0 } = useResizeDetector<HTMLDivElement>(); + const previousWidth = usePrevious(width) || 0; + const { current } = ref; + const [itemsWidth, setItemsWidth] = useState<number[]>([]); + const [popoverVisible, setPopoverVisible] = useState(false); + + // We use React.useState to be able to mock the state in Jest + const [overflowingIndex, setOverflowingIndex] = React.useState<number>(-1); + + let targetRef = useRef<HTMLDivElement>(null); + if (dropdownRef) { + targetRef = dropdownRef; + } + + const [showOverflow, setShowOverflow] = useState(false); + + const reduceItems = (items: Item[]): [Item[], string[]] => + items.reduce( + ([items, ids], item) => { + items.push({ + id: item.id, + element: React.cloneElement(item.element, { key: item.id }), + }); + ids.push(item.id); + return [items, ids]; + }, + [[], []] as [Item[], string[]], + ); + + const [notOverflowedItems, notOverflowedIds] = useMemo( + () => + reduceItems( + items.slice( + 0, + overflowingIndex !== -1 ? overflowingIndex : items.length, + ), + ), + [items, overflowingIndex], + ); + + const [overflowedItems, overflowedIds] = useMemo( + () => + overflowingIndex !== -1 + ? reduceItems(items.slice(overflowingIndex)) + : [[], []], + [items, overflowingIndex], + ); + + useLayoutEffect(() => { + const container = current?.children.item(0); + if (container) { + const { children } = container; + const childrenArray = Array.from(children); + + // If items length change, add all items to the container + // and recalculate the widths + if (itemsWidth.length !== items.length) { + if (childrenArray.length === items.length) { + setItemsWidth( + childrenArray.map(child => child.getBoundingClientRect().width), + ); + } else { + setOverflowingIndex(-1); + return; + } + } + + // Calculates the index of the first overflowed element + // +1 is to give at least one pixel of difference and avoid flakiness + const index = childrenArray.findIndex( + child => + child.getBoundingClientRect().right > + container.getBoundingClientRect().right + 1, + ); + + // If elements fit (-1) and there's overflowed items + // then preserve the overflow index. We can't use overflowIndex + // directly because the items may have been modified + let newOverflowingIndex = + index === -1 && overflowedItems.length > 0 + ? items.length - overflowedItems.length + : index; + + if (width > previousWidth) { + // Calculates remaining space in the container + const button = current?.children.item(1); + const buttonRight = button?.getBoundingClientRect().right || 0; + const containerRight = current?.getBoundingClientRect().right || 0; + const remainingSpace = containerRight - buttonRight; + + // Checks if some elements in the dropdown fits in the remaining space + let sum = 0; + for (let i = childrenArray.length; i < items.length; i += 1) { + sum += itemsWidth[i]; + if (sum <= remainingSpace) { + newOverflowingIndex = i + 1; + } else { + break; + } + } + } + + setOverflowingIndex(newOverflowingIndex); + } + }, [ + current, + items.length, + itemsWidth, + overflowedItems.length, + previousWidth, + width, + ]); + + useEffect(() => { + if (onOverflowingStateChange) { + onOverflowingStateChange({ + notOverflowed: notOverflowedIds, + overflowed: overflowedIds, + }); + } + }, [notOverflowedIds, onOverflowingStateChange, overflowedIds]); + + const overflowingCount = + overflowingIndex !== -1 ? items.length - overflowingIndex : 0; + + const popoverContent = useMemo( + () => + dropdownContent || overflowingCount ? ( + <div + css={css` + display: flex; + flex-direction: column; + gap: ${theme.gridUnit * 4}px; + `} + data-test="dropdown-content" + style={dropdownStyle} + ref={targetRef} + > + {dropdownContent + ? dropdownContent(overflowedItems) + : overflowedItems.map(item => item.element)} + </div> + ) : null, + [ + dropdownContent, + overflowingCount, + theme.gridUnit, + dropdownStyle, + overflowedItems, + ], + ); + + useLayoutEffect(() => { + if (popoverVisible) { + // Measures scroll height after rendering the elements + setTimeout(() => { + if (targetRef.current) { + // We only set overflow when there's enough space to display + // Select's popovers because they are restrained by the overflow property. + setShowOverflow(targetRef.current.scrollHeight > MAX_HEIGHT); + } + }, 100); + } + }, [popoverVisible]); + + useImperativeHandle( + outerRef, + () => ({ + ...(ref.current as HTMLDivElement), + open: () => setPopoverVisible(true), + }), + [ref], + ); + + // Closes the popover when scrolling on the document + useEffect(() => { + document.onscroll = popoverVisible + ? () => setPopoverVisible(false) + : null; + return () => { + document.onscroll = null; + }; + }, [popoverVisible]); + + return ( + <div + ref={ref} + css={css` + display: flex; + align-items: center; + `} + > + <div + css={css` + display: flex; + align-items: center; + gap: ${theme.gridUnit * 4}px; + margin-right: ${theme.gridUnit * 4}px; + min-width: 0px; + `} + data-test="container" + style={style} + > + {notOverflowedItems.map(item => item.element)} + </div> + {popoverContent && ( + <> + <Global + styles={css` + .ant-popover-inner-content { + max-height: ${MAX_HEIGHT}px; + overflow: ${showOverflow ? 'auto' : 'visible'}; + padding: ${theme.gridUnit * 3}px ${theme.gridUnit * 4}px; + + // Some OS versions only show the scroll when hovering. + // These settings will make the scroll always visible. + ::-webkit-scrollbar { + -webkit-appearance: none; + width: 14px; + } + ::-webkit-scrollbar-thumb { + border-radius: 9px; + background-color: ${theme.colors.grayscale.light1}; + border: 3px solid transparent; + background-clip: content-box; + } + ::-webkit-scrollbar-track { + background-color: ${theme.colors.grayscale.light4}; + border-left: 1px solid ${theme.colors.grayscale.light2}; + } + } + `} + /> + <Popover + content={popoverContent} + trigger="click" + visible={popoverVisible} + onVisibleChange={visible => setPopoverVisible(visible)} + placement="bottom" + destroyTooltipOnHide + > + <Tooltip title={dropdownTriggerTooltip}> + <Button + buttonStyle="secondary" + data-test="dropdown-container-btn" + > + {dropdownTriggerIcon} + {dropdownTriggerText} + <Badge + count={dropdownTriggerCount ?? overflowingCount} + color={ + (dropdownTriggerCount ?? overflowingCount) > 0 + ? theme.colors.primary.base + : theme.colors.grayscale.light1 + } + showZero + css={css` + margin-left: ${theme.gridUnit * 2}px; + `} + /> + <Icons.DownOutlined + iconSize="m" + iconColor={theme.colors.grayscale.light1} + css={css` + .anticon { + display: flex; + } + `} + /> + </Button> + </Tooltip> + </Popover> + </> + )} + </div> + ); + }, +); + +export default DropdownContainer; diff --git a/superset-frontend/src/components/DropdownSelectableIcon/DropdownSelectableIcon.stories.tsx b/superset-frontend/src/components/DropdownSelectableIcon/DropdownSelectableIcon.stories.tsx new file mode 100644 index 000000000000..1b5bfbc520ac --- /dev/null +++ b/superset-frontend/src/components/DropdownSelectableIcon/DropdownSelectableIcon.stories.tsx @@ -0,0 +1,65 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import Icons from 'src/components/Icons'; +import DropdownSelectableIcon, { DropDownSelectableProps } from '.'; + +export default { + title: 'DropdownSelectableIcon', + component: DropdownSelectableIcon, +}; + +export const Component = (props: DropDownSelectableProps) => ( + <DropdownSelectableIcon + {...props} + icon={<Icons.Gear name="gear" iconColor="#000000" />} + /> +); + +Component.story = { + parameters: { + knobs: { + disable: true, + }, + }, +}; + +Component.args = { + info: 'Info go here', + selectedKeys: ['vertical'], + menuItems: [ + { + key: 'vertical', + label: 'Vertical', + }, + { + key: 'horizontal', + label: 'Horizontal', + }, + ], +}; + +Component.argTypes = { + onSelect: { + action: 'onSelect', + table: { + disable: true, + }, + }, +}; diff --git a/superset-frontend/src/components/DropdownSelectableIcon/DropdownSelectableIcon.test.tsx b/superset-frontend/src/components/DropdownSelectableIcon/DropdownSelectableIcon.test.tsx new file mode 100644 index 000000000000..51007d96ff56 --- /dev/null +++ b/superset-frontend/src/components/DropdownSelectableIcon/DropdownSelectableIcon.test.tsx @@ -0,0 +1,99 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import Icons from 'src/components/Icons'; +import userEvent from '@testing-library/user-event'; +import DropdownSelectableIcon, { DropDownSelectableProps } from '.'; + +const mockedProps = { + menuItems: [ + { + key: 'vertical', + label: 'vertical', + }, + { + key: 'horizontal', + label: 'horizontal', + }, + ], + selectedKeys: [], + icon: <Icons.Gear name="gear" />, +}; + +const asyncRender = (props: DropDownSelectableProps) => + waitFor(() => render(<DropdownSelectableIcon {...props} />)); + +const openMenu = () => { + userEvent.click(screen.getByRole('img', { name: 'gear' })); +}; + +test('should render', async () => { + const { container } = await asyncRender(mockedProps); + expect(container).toBeInTheDocument(); +}); + +test('should render the icon', async () => { + await asyncRender(mockedProps); + expect(screen.getByRole('img', { name: 'gear' })).toBeInTheDocument(); +}); + +test('should not render the info', async () => { + await asyncRender(mockedProps); + openMenu(); + expect( + screen.queryByTestId('dropdown-selectable-info'), + ).not.toBeInTheDocument(); +}); + +test('should render the info', async () => { + const infoProps = { + ...mockedProps, + info: 'Test', + }; + await asyncRender(infoProps); + openMenu(); + expect(screen.getByTestId('dropdown-selectable-info')).toBeInTheDocument(); + expect(screen.getByText('Test')).toBeInTheDocument(); +}); + +test('should render the menu items', async () => { + await asyncRender(mockedProps); + openMenu(); + expect(screen.getAllByRole('menuitem')).toHaveLength(2); + expect(screen.getByText('vertical')).toBeInTheDocument(); + expect(screen.getByText('horizontal')).toBeInTheDocument(); +}); + +test('should not render any selected menu item', async () => { + await asyncRender(mockedProps); + openMenu(); + expect(screen.getAllByRole('menuitem')).toHaveLength(2); + expect(screen.queryByRole('img', { name: 'check' })).not.toBeInTheDocument(); +}); + +test('should render the selected menu items', async () => { + const selectedProps = { + ...mockedProps, + selectedKeys: ['vertical'], + }; + await asyncRender(selectedProps); + openMenu(); + expect(screen.getByRole('img', { name: 'check' })).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/components/DropdownSelectableIcon/index.tsx b/superset-frontend/src/components/DropdownSelectableIcon/index.tsx new file mode 100644 index 000000000000..85c4284439f1 --- /dev/null +++ b/superset-frontend/src/components/DropdownSelectableIcon/index.tsx @@ -0,0 +1,154 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { styled, useTheme } from '@superset-ui/core'; +import React, { RefObject, useMemo } from 'react'; +import Icons from 'src/components/Icons'; +import { DropdownButton } from 'src/components/DropdownButton'; +import { DropdownButtonProps } from 'antd/lib/dropdown'; +import { Menu, MenuProps } from 'src/components/Menu'; + +const { SubMenu } = Menu; + +type SubMenuItemProps = { key: string; label: string | React.ReactNode }; + +export interface DropDownSelectableProps extends Pick<MenuProps, 'onSelect'> { + ref?: RefObject<HTMLDivElement>; + icon: React.ReactNode; + info?: string; + menuItems: { + key: string; + label: string | React.ReactNode; + children?: SubMenuItemProps[]; + divider?: boolean; + }[]; + selectedKeys?: string[]; +} + +const StyledDropdownButton = styled( + DropdownButton as React.FC<DropdownButtonProps>, +)` + button.ant-btn:first-of-type { + display: none; + } + > button.ant-btn:nth-child(2) { + display: inline-flex; + background-color: transparent !important; + height: unset; + padding: 0; + border: none; + width: auto !important; + + .anticon { + line-height: 0; + } + &:after { + box-shadow: none !important; + } + } +`; + +const StyledMenu = styled(Menu)` + ${({ theme }) => ` + .info { + font-size: ${theme.typography.sizes.s}px; + color: ${theme.colors.grayscale.base}; + padding: ${theme.gridUnit}px ${theme.gridUnit * 3}px ${ + theme.gridUnit + }px ${theme.gridUnit * 3}px; + } + .ant-dropdown-menu-item-selected { + color: ${theme.colors.grayscale.dark1}; + background-color: ${theme.colors.primary.light5}; + } + `} +`; + +const StyleMenuItem = styled(Menu.Item)<{ divider?: boolean }>` + display: flex; + justify-content: space-between; + > span { + width: 100%; + } + border-bottom: ${({ divider, theme }) => + divider ? `1px solid ${theme.colors.grayscale.light3};` : 'none;'}; +`; + +const StyleSubmenuItem = styled.div` + display: flex; + justify-content: space-between; + > span { + width: 100%; + } +`; + +export default (props: DropDownSelectableProps) => { + const theme = useTheme(); + const { icon, info, menuItems, selectedKeys, onSelect } = props; + const menuItem = ( + label: string | React.ReactNode, + key: string, + divider?: boolean, + ) => ( + <StyleMenuItem key={key} divider={divider}> + <StyleSubmenuItem> + <span>{label}</span> + {selectedKeys?.includes(key) && ( + <Icons.Check + iconColor={theme.colors.primary.base} + className="tick-menu-item" + iconSize="xl" + /> + )} + </StyleSubmenuItem> + </StyleMenuItem> + ); + const overlayMenu = useMemo( + () => ( + <StyledMenu selectedKeys={selectedKeys} onSelect={onSelect} selectable> + {info && ( + <div className="info" data-test="dropdown-selectable-info"> + {info} + </div> + )} + {menuItems.map(m => + m.children?.length ? ( + <SubMenu + title={m.label} + key={m.key} + data-test="dropdown-selectable-icon-submenu" + > + {m.children.map(s => menuItem(s.label, s.key))} + </SubMenu> + ) : ( + menuItem(m.label, m.key, m.divider) + ), + )} + </StyledMenu> + ), + [info, menuItems], + ); + + return ( + <StyledDropdownButton + overlay={overlayMenu} + trigger={['click']} + icon={icon} + /> + ); +}; diff --git a/superset-frontend/src/components/DynamicEditableTitle/index.tsx b/superset-frontend/src/components/DynamicEditableTitle/index.tsx index d9e706633013..86205bebc267 100644 --- a/superset-frontend/src/components/DynamicEditableTitle/index.tsx +++ b/superset-frontend/src/components/DynamicEditableTitle/index.tsx @@ -197,7 +197,7 @@ export const DynamicEditableTitle = ({ ${inputWidth && inputWidth > 0 && css` - width: ${inputWidth}px; + width: ${inputWidth + 1}px; `} `} /> diff --git a/superset-frontend/src/components/EditableTitle/index.tsx b/superset-frontend/src/components/EditableTitle/index.tsx index 131e9731c0dc..eebb0c714cfa 100644 --- a/superset-frontend/src/components/EditableTitle/index.tsx +++ b/superset-frontend/src/components/EditableTitle/index.tsx @@ -17,8 +17,9 @@ * under the License. */ import React, { useEffect, useState, useRef } from 'react'; +import { Link } from 'react-router-dom'; import cx from 'classnames'; -import { css, styled, t } from '@superset-ui/core'; +import { css, styled, SupersetTheme, t } from '@superset-ui/core'; import { Tooltip } from 'src/components/Tooltip'; import CertifiedBadge from '../CertifiedBadge'; @@ -37,7 +38,7 @@ export interface EditableTitleProps { placeholder?: string; certifiedBy?: string; certificationDetails?: string; - onClickTitle?: () => void; + url?: string; } const StyledCertifiedBadge = styled(CertifiedBadge)` @@ -58,7 +59,7 @@ export default function EditableTitle({ placeholder = '', certifiedBy, certificationDetails, - onClickTitle, + url, // rest is related to title tooltip ...rest }: EditableTitleProps) { @@ -218,20 +219,20 @@ export default function EditableTitle({ } if (!canEdit) { // don't actually want an input in this case - titleComponent = onClickTitle ? ( - <span - role="button" - onClick={onClickTitle} - tabIndex={0} + titleComponent = url ? ( + <Link + to={url} data-test="editable-title-input" - css={css` + css={(theme: SupersetTheme) => css` + color: ${theme.colors.grayscale.dark1}; + text-decoration: none; :hover { text-decoration: underline; } `} > {value} - </span> + </Link> ) : ( <span data-test="editable-title-input">{value}</span> ); diff --git a/superset-frontend/src/components/EmptyState/index.tsx b/superset-frontend/src/components/EmptyState/index.tsx index 7ee69d7eea5e..b8230c8fcf24 100644 --- a/superset-frontend/src/components/EmptyState/index.tsx +++ b/superset-frontend/src/components/EmptyState/index.tsx @@ -18,7 +18,7 @@ */ import React, { ReactNode, SyntheticEvent } from 'react'; -import { styled, css, SupersetTheme } from '@superset-ui/core'; +import { styled, css, SupersetTheme, t } from '@superset-ui/core'; import { Empty } from 'src/components'; import Button from 'src/components/Button'; @@ -31,12 +31,13 @@ export enum EmptyStateSize { export interface EmptyStateSmallProps { title: ReactNode; description?: ReactNode; - image: ReactNode; + image?: ReactNode; } export interface EmptyStateProps extends EmptyStateSmallProps { buttonText?: ReactNode; buttonAction?: React.MouseEventHandler<HTMLElement>; + className?: string; } export interface ImageContainerProps { @@ -152,9 +153,10 @@ export const EmptyStateBig = ({ description, buttonAction, buttonText, + className, }: EmptyStateProps) => ( - <EmptyStateContainer> - <ImageContainer image={image} size={EmptyStateSize.Big} /> + <EmptyStateContainer className={className}> + {image && <ImageContainer image={image} size={EmptyStateSize.Big} />} <TextContainer css={(theme: SupersetTheme) => css` @@ -185,7 +187,7 @@ export const EmptyStateMedium = ({ buttonText, }: EmptyStateProps) => ( <EmptyStateContainer> - <ImageContainer image={image} size={EmptyStateSize.Medium} /> + {image && <ImageContainer image={image} size={EmptyStateSize.Medium} />} <TextContainer css={(theme: SupersetTheme) => css` @@ -214,7 +216,7 @@ export const EmptyStateSmall = ({ description, }: EmptyStateSmallProps) => ( <EmptyStateContainer> - <ImageContainer image={image} size={EmptyStateSize.Small} /> + {image && <ImageContainer image={image} size={EmptyStateSize.Small} />} <TextContainer css={(theme: SupersetTheme) => css` @@ -227,3 +229,27 @@ export const EmptyStateSmall = ({ </TextContainer> </EmptyStateContainer> ); + +const TRANSLATIONS = { + NO_DATABASES_MATCH_TITLE: t('No databases match your search'), + NO_DATABASES_AVAILABLE_TITLE: t('There are no databases available'), + MANAGE_YOUR_DATABASES_TEXT: t('Manage your databases'), + HERE_TEXT: t('here'), +}; + +export const emptyStateComponent = (emptyResultsWithSearch: boolean) => ( + <EmptyStateSmall + image="empty.svg" + title={ + emptyResultsWithSearch + ? TRANSLATIONS.NO_DATABASES_MATCH_TITLE + : TRANSLATIONS.NO_DATABASES_AVAILABLE_TITLE + } + description={ + <p> + {TRANSLATIONS.MANAGE_YOUR_DATABASES_TEXT}{' '} + <a href="/databaseview/list">{TRANSLATIONS.HERE_TEXT}</a> + </p> + } + /> +); diff --git a/superset-frontend/src/components/ErrorMessage/BasicErrorAlert.test.tsx b/superset-frontend/src/components/ErrorMessage/BasicErrorAlert.test.tsx index b6be9a1b9f8c..dd2187c9315e 100644 --- a/superset-frontend/src/components/ErrorMessage/BasicErrorAlert.test.tsx +++ b/superset-frontend/src/components/ErrorMessage/BasicErrorAlert.test.tsx @@ -23,6 +23,13 @@ import { supersetTheme } from '@superset-ui/core'; import BasicErrorAlert from './BasicErrorAlert'; import { ErrorLevel } from './types'; +jest.mock( + 'src/components/Icons/Icon', + () => + ({ fileName }: { fileName: string }) => + <span role="img" aria-label={fileName.replace('_', '-')} />, +); + const mockedProps = { body: 'Error body', level: 'warning' as ErrorLevel, diff --git a/superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.test.tsx b/superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.test.tsx index 6959c5351a7e..c8dbe8ba345f 100644 --- a/superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.test.tsx +++ b/superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.test.tsx @@ -23,6 +23,13 @@ import userEvent from '@testing-library/user-event'; import DatabaseErrorMessage from './DatabaseErrorMessage'; import { ErrorLevel, ErrorSource, ErrorTypeEnum } from './types'; +jest.mock( + 'src/components/Icons/Icon', + () => + ({ fileName }: { fileName: string }) => + <span role="img" aria-label={fileName.replace('_', '-')} />, +); + const mockedProps = { error: { error_type: ErrorTypeEnum.DATABASE_SECURITY_ACCESS_ERROR, diff --git a/superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx b/superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx index 612abcaf75d1..a7a0a4199f5d 100644 --- a/superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx +++ b/superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx @@ -75,19 +75,18 @@ function DatabaseErrorMessage({ </> ); - const copyText = - extra && extra.issue_codes - ? t('%(message)s\nThis may be triggered by: \n%(issues)s', { - message, - issues: extra.issue_codes - .map(issueCode => issueCode.message) - .join('\n'), - }) - : message; + const copyText = extra?.issue_codes + ? t('%(message)s\nThis may be triggered by: \n%(issues)s', { + message, + issues: extra.issue_codes + .map(issueCode => issueCode.message) + .join('\n'), + }) + : message; return ( <ErrorAlert - title={t('%s Error', (extra && extra.engine_name) || t('DB engine'))} + title={t('%s Error', extra?.engine_name || t('DB engine'))} subtitle={subtitle} level={level} source={source} diff --git a/superset-frontend/src/components/ErrorMessage/DatasetNotFoundErrorMessage.test.tsx b/superset-frontend/src/components/ErrorMessage/DatasetNotFoundErrorMessage.test.tsx index 087b08fa8f86..e73d2eb93b6a 100644 --- a/superset-frontend/src/components/ErrorMessage/DatasetNotFoundErrorMessage.test.tsx +++ b/superset-frontend/src/components/ErrorMessage/DatasetNotFoundErrorMessage.test.tsx @@ -22,6 +22,13 @@ import { render, screen } from 'spec/helpers/testing-library'; import DatasetNotFoundErrorMessage from './DatasetNotFoundErrorMessage'; import { ErrorLevel, ErrorSource, ErrorTypeEnum } from './types'; +jest.mock( + 'src/components/Icons/Icon', + () => + ({ fileName }: { fileName: string }) => + <span role="img" aria-label={fileName.replace('_', '-')} />, +); + const mockedProps = { error: { error_type: ErrorTypeEnum.FAILED_FETCHING_DATASOURCE_INFO_ERROR, diff --git a/superset-frontend/src/components/ErrorMessage/ErrorAlert.test.tsx b/superset-frontend/src/components/ErrorMessage/ErrorAlert.test.tsx index 7133f25c9e5e..38006c2ec409 100644 --- a/superset-frontend/src/components/ErrorMessage/ErrorAlert.test.tsx +++ b/superset-frontend/src/components/ErrorMessage/ErrorAlert.test.tsx @@ -24,6 +24,13 @@ import { supersetTheme } from '@superset-ui/core'; import ErrorAlert from './ErrorAlert'; import { ErrorLevel, ErrorSource } from './types'; +jest.mock( + 'src/components/Icons/Icon', + () => + ({ fileName }: { fileName: string }) => + <span role="img" aria-label={fileName.replace('_', '-')} />, +); + const mockedProps = { body: 'Error body', level: 'warning' as ErrorLevel, @@ -31,6 +38,7 @@ const mockedProps = { subtitle: 'Error subtitle', title: 'Error title', source: 'dashboard' as ErrorSource, + description: 'we are unable to connect db.', }; test('should render', () => { @@ -63,6 +71,11 @@ test('should render the error title', () => { expect(screen.getByText('Error title')).toBeInTheDocument(); }); +test('should render the error description', () => { + render(<ErrorAlert {...mockedProps} />, { useRedux: true }); + expect(screen.getByText('we are unable to connect db.')).toBeInTheDocument(); +}); + test('should render the error subtitle', () => { render(<ErrorAlert {...mockedProps} />, { useRedux: true }); const button = screen.getByText('See more'); diff --git a/superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx b/superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx index 3340c8ad6d3e..cf2522b4e43c 100644 --- a/superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx +++ b/superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx @@ -87,6 +87,7 @@ interface ErrorAlertProps { source?: ErrorSource; subtitle: ReactNode; title: ReactNode; + description?: string; } export default function ErrorAlert({ @@ -96,6 +97,7 @@ export default function ErrorAlert({ source = 'dashboard', subtitle, title, + description, }: ErrorAlertProps) { const theme = useTheme(); @@ -116,7 +118,7 @@ export default function ErrorAlert({ )} <strong>{title}</strong> </LeftSideContent> - {!isExpandable && ( + {!isExpandable && !description && ( <span role="button" tabIndex={0} @@ -127,6 +129,21 @@ export default function ErrorAlert({ </span> )} </div> + {description && ( + <div className="error-body"> + <p>{description}</p> + {!isExpandable && ( + <span + role="button" + tabIndex={0} + className="link" + onClick={() => setIsModalOpen(true)} + > + {t('See more')} + </span> + )} + </div> + )} {isExpandable ? ( <div className="error-body"> <p>{subtitle}</p> @@ -196,7 +213,10 @@ export default function ErrorAlert({ > <> <p>{subtitle}</p> - <br /> + {/* This break was in the original design of the modal but + the spacing looks really off if there is only + subtitle or a body */} + {subtitle && body && <br />} {body} </> </ErrorModal> diff --git a/superset-frontend/src/components/ErrorMessage/ErrorMessageWithStackTrace.test.tsx b/superset-frontend/src/components/ErrorMessage/ErrorMessageWithStackTrace.test.tsx index 6e343eba7ff2..ae30e5cb991b 100644 --- a/superset-frontend/src/components/ErrorMessage/ErrorMessageWithStackTrace.test.tsx +++ b/superset-frontend/src/components/ErrorMessage/ErrorMessageWithStackTrace.test.tsx @@ -23,6 +23,13 @@ import userEvent from '@testing-library/user-event'; import ErrorMessageWithStackTrace from './ErrorMessageWithStackTrace'; import { ErrorLevel, ErrorSource } from './types'; +jest.mock( + 'src/components/Icons/Icon', + () => + ({ fileName }: { fileName: string }) => + <span role="img" aria-label={fileName.replace('_', '-')} />, +); + const mockedProps = { level: 'warning' as ErrorLevel, link: 'https://sample.com', diff --git a/superset-frontend/src/components/ErrorMessage/ErrorMessageWithStackTrace.tsx b/superset-frontend/src/components/ErrorMessage/ErrorMessageWithStackTrace.tsx index c073cf0461b4..b54277b4ac2d 100644 --- a/superset-frontend/src/components/ErrorMessage/ErrorMessageWithStackTrace.tsx +++ b/superset-frontend/src/components/ErrorMessage/ErrorMessageWithStackTrace.tsx @@ -18,7 +18,6 @@ */ import React from 'react'; import { t } from '@superset-ui/core'; - import getErrorMessageComponentRegistry from './getErrorMessageComponentRegistry'; import { SupersetError, ErrorSource } from './types'; import ErrorAlert from './ErrorAlert'; @@ -33,6 +32,8 @@ type Props = { copyText?: string; stackTrace?: string; source?: ErrorSource; + description?: string; + errorMitigationFunction?: () => void; }; export default function ErrorMessageWithStackTrace({ @@ -43,6 +44,7 @@ export default function ErrorMessageWithStackTrace({ link, stackTrace, source, + description, }: Props) { // Check if a custom error message component was registered for this message if (error) { @@ -66,6 +68,7 @@ export default function ErrorMessageWithStackTrace({ title={title} subtitle={subtitle} copyText={copyText} + description={description} source={source} body={ link || stackTrace ? ( diff --git a/superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.test.tsx b/superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.test.tsx index 17f38c4d23c5..e8be71b7e307 100644 --- a/superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.test.tsx +++ b/superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.test.tsx @@ -23,6 +23,13 @@ import { render, screen } from 'spec/helpers/testing-library'; import ParameterErrorMessage from './ParameterErrorMessage'; import { ErrorLevel, ErrorSource, ErrorTypeEnum } from './types'; +jest.mock( + 'src/components/Icons/Icon', + () => + ({ fileName }: { fileName: string }) => + <span role="img" aria-label={fileName.replace('_', '-')} />, +); + const mockedProps = { error: { error_type: ErrorTypeEnum.MISSING_TEMPLATE_PARAMS_ERROR, diff --git a/superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.test.tsx b/superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.test.tsx index e41308f5381b..cc3a8a9a599e 100644 --- a/superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.test.tsx +++ b/superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.test.tsx @@ -23,6 +23,13 @@ import { render, screen } from 'spec/helpers/testing-library'; import TimeoutErrorMessage from './TimeoutErrorMessage'; import { ErrorLevel, ErrorSource, ErrorTypeEnum } from './types'; +jest.mock( + 'src/components/Icons/Icon', + () => + ({ fileName }: { fileName: string }) => + <span role="img" aria-label={fileName.replace('_', '-')} />, +); + const mockedProps = { error: { error_type: ErrorTypeEnum.FRONTEND_TIMEOUT_ERROR, diff --git a/superset-frontend/src/components/FacePile/index.tsx b/superset-frontend/src/components/FacePile/index.tsx index 730d162e2d14..44cc62ce1d62 100644 --- a/superset-frontend/src/components/FacePile/index.tsx +++ b/superset-frontend/src/components/FacePile/index.tsx @@ -67,8 +67,8 @@ export default function FacePile({ users, maxCount = 4 }: FacePileProps) { borderColor: color, }} > - {first_name && first_name[0]?.toLocaleUpperCase()} - {last_name && last_name[0]?.toLocaleUpperCase()} + {first_name?.[0]?.toLocaleUpperCase()} + {last_name?.[0]?.toLocaleUpperCase()} </StyledAvatar> </Tooltip> ); diff --git a/superset-frontend/src/components/FaveStar/FaveStar.test.tsx b/superset-frontend/src/components/FaveStar/FaveStar.test.tsx index 68433db96ea4..ab2fa9fa0ed1 100644 --- a/superset-frontend/src/components/FaveStar/FaveStar.test.tsx +++ b/superset-frontend/src/components/FaveStar/FaveStar.test.tsx @@ -26,13 +26,13 @@ jest.mock('src/components/Tooltip', () => ({ Tooltip: (props: any) => <div data-test="tooltip" {...props} />, })); -test('render right content', () => { +test('render right content', async () => { const props = { itemId: 3, saveFaveStar: jest.fn(), }; - const { rerender } = render(<FaveStar {...props} isStarred />); + const { rerender, findByRole } = render(<FaveStar {...props} isStarred />); expect(screen.getByRole('button')).toBeInTheDocument(); expect( screen.getByRole('img', { name: 'favorite-selected' }), @@ -45,7 +45,7 @@ test('render right content', () => { rerender(<FaveStar {...props} />); expect( - screen.getByRole('img', { name: 'favorite-unselected' }), + await findByRole('img', { name: 'favorite-unselected' }), ).toBeInTheDocument(); expect(props.saveFaveStar).toBeCalledTimes(1); @@ -54,7 +54,7 @@ test('render right content', () => { expect(props.saveFaveStar).toBeCalledWith(props.itemId, false); }); -test('render content on tooltip', () => { +test('render content on tooltip', async () => { const props = { itemId: 3, showTooltip: true, @@ -63,7 +63,7 @@ test('render content on tooltip', () => { render(<FaveStar {...props} />); - expect(screen.getByTestId('tooltip')).toBeInTheDocument(); + expect(await screen.findByTestId('tooltip')).toBeInTheDocument(); expect(screen.getByTestId('tooltip')).toHaveAttribute( 'id', 'fave-unfave-tooltip', @@ -75,7 +75,7 @@ test('render content on tooltip', () => { expect(screen.getByRole('button')).toBeInTheDocument(); }); -test('Call fetchFaveStar only on the first render', () => { +test('Call fetchFaveStar only on the first render', async () => { const props = { itemId: 3, fetchFaveStar: jest.fn(), @@ -84,7 +84,10 @@ test('Call fetchFaveStar only on the first render', () => { showTooltip: false, }; - const { rerender } = render(<FaveStar {...props} />); + const { rerender, findByRole } = render(<FaveStar {...props} />); + expect( + await findByRole('img', { name: 'favorite-unselected' }), + ).toBeInTheDocument(); expect(props.fetchFaveStar).toBeCalledTimes(1); expect(props.fetchFaveStar).toBeCalledWith(props.itemId); diff --git a/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx b/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx index 494af6033072..8cef35078dd0 100644 --- a/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx +++ b/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx @@ -21,6 +21,7 @@ import { ReactWrapper } from 'enzyme'; import { styledMount as mount } from 'spec/helpers/theming'; import FilterableTable, { MAX_COLUMNS_FOR_TABLE, + convertBigIntStrToNumber, } from 'src/components/FilterableTable'; import { render, screen } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; @@ -331,3 +332,19 @@ describe('FilterableTable sorting - RTL', () => { expect(gridCells[6]).toHaveTextContent('2022-01-02'); }); }); + +test('renders bigInt value in a number format', () => { + expect(convertBigIntStrToNumber('123')).toBe('123'); + expect(convertBigIntStrToNumber('some string value')).toBe( + 'some string value', + ); + expect(convertBigIntStrToNumber('{ a: 123 }')).toBe('{ a: 123 }'); + expect(convertBigIntStrToNumber('"Not a Number"')).toBe('"Not a Number"'); + // trim quotes for bigint string format + expect(convertBigIntStrToNumber('"-12345678901234567890"')).toBe( + '-12345678901234567890', + ); + expect(convertBigIntStrToNumber('"12345678901234567890"')).toBe( + '12345678901234567890', + ); +}); diff --git a/superset-frontend/src/components/FilterableTable/index.tsx b/superset-frontend/src/components/FilterableTable/index.tsx index 621565b154c3..e7e8f3ebf4c6 100644 --- a/superset-frontend/src/components/FilterableTable/index.tsx +++ b/superset-frontend/src/components/FilterableTable/index.tsx @@ -17,8 +17,8 @@ * under the License. */ import JSONbig from 'json-bigint'; -import React, { PureComponent } from 'react'; -import JSONTree from 'react-json-tree'; +import React, { useEffect, useRef, useState } from 'react'; +import { JSONTree } from 'react-json-tree'; import { AutoSizer, Column, @@ -33,8 +33,7 @@ import { getMultipleTextDimensions, t, styled, - SupersetTheme, - withTheme, + useTheme, } from '@superset-ui/core'; import Button from '../Button'; import CopyToClipboard from '../CopyToClipboard'; @@ -54,7 +53,7 @@ function safeJsonObjectParse( // We know `data` is a string starting with '{' or '[', so try to parse it as a valid object try { - const jsonData = JSON.parse(data); + const jsonData = JSONbig({ storeAsString: true }).parse(data); if (jsonData && typeof jsonData === 'object') { return jsonData; } @@ -64,6 +63,17 @@ function safeJsonObjectParse( } } +export function convertBigIntStrToNumber(value: string | number) { + if (typeof value === 'string' && /^"-?\d+"$/.test(value)) { + return value.substring(1, value.length - 1); + } + return value; +} + +function renderBigIntStrToNumber(value: string | number) { + return <>{convertBigIntStrToNumber(value)}</>; +} + const GRID_POSITION_ADJUSTMENT = 4; const SCROLL_BAR_HEIGHT = 15; // This regex handles all possible number formats in javascript, including ints, floats, @@ -188,98 +198,65 @@ export interface FilterableTableProps { orderedColumnKeys: string[]; data: Record<string, unknown>[]; height: number; - filterText: string; - headerHeight: number; - overscanColumnCount: number; - overscanRowCount: number; - rowHeight: number; - striped: boolean; - expandedColumns: string[]; - theme: SupersetTheme; -} - -interface FilterableTableState { - sortBy?: string; - sortDirection?: SortDirectionType; - fitted: boolean; - displayedList: Datum[]; + filterText?: string; + headerHeight?: number; + overscanColumnCount?: number; + overscanRowCount?: number; + rowHeight?: number; + striped?: boolean; + expandedColumns?: string[]; } -class FilterableTable extends PureComponent< - FilterableTableProps, - FilterableTableState -> { - static defaultProps = { - filterText: '', - headerHeight: 32, - overscanColumnCount: 10, - overscanRowCount: 10, - rowHeight: 32, - striped: true, - expandedColumns: [], - }; - - list: Datum[]; - - complexColumns: Record<string, boolean>; - - widthsForColumnsByKey: Record<string, number>; - - totalTableWidth: number; - - totalTableHeight: number; - - container: React.RefObject<HTMLDivElement>; - - jsonTreeTheme: Record<string, string>; - - constructor(props: FilterableTableProps) { - super(props); - this.list = this.formatTableData(props.data); - this.addJsonModal = this.addJsonModal.bind(this); - this.getCellContent = this.getCellContent.bind(this); - this.renderGridCell = this.renderGridCell.bind(this); - this.renderGridCellHeader = this.renderGridCellHeader.bind(this); - this.renderGrid = this.renderGrid.bind(this); - this.renderTableCell = this.renderTableCell.bind(this); - this.renderTableHeader = this.renderTableHeader.bind(this); - this.sortResults = this.sortResults.bind(this); - this.renderTable = this.renderTable.bind(this); - this.rowClassName = this.rowClassName.bind(this); - this.sort = this.sort.bind(this); - this.getJsonTreeTheme = this.getJsonTreeTheme.bind(this); +const FilterableTable = ({ + orderedColumnKeys, + data, + height, + filterText = '', + headerHeight = 32, + overscanColumnCount = 10, + overscanRowCount = 10, + rowHeight = 32, + striped = true, + expandedColumns = [], +}: FilterableTableProps) => { + const formatTableData = (data: Record<string, unknown>[]): Datum[] => + data.map(row => { + const newRow = {}; + Object.entries(row).forEach(([key, val]) => { + if (['string', 'number'].indexOf(typeof val) >= 0) { + newRow[key] = val; + } else { + newRow[key] = val === null ? null : JSONbig.stringify(val); + } + }); + return newRow; + }); - // columns that have complex type and were expanded into sub columns - this.complexColumns = props.orderedColumnKeys.reduce( + const [sortByState, setSortByState] = useState<string | undefined>(undefined); + const [sortDirectionState, setSortDirectionState] = useState< + SortDirectionType | undefined + >(undefined); + const [fitted, setFitted] = useState(false); + const [list] = useState<Datum[]>(() => formatTableData(data)); + const [displayedList, setDisplayedList] = useState<Datum[]>(list); + + // columns that have complex type and were expanded into sub columns + const [complexColumns] = useState<Record<string, boolean>>( + orderedColumnKeys.reduce( (obj, key) => ({ ...obj, - [key]: props.expandedColumns.some(name => name.startsWith(`${key}.`)), + [key]: expandedColumns.some(name => name.startsWith(`${key}.`)), }), {}, - ); - - this.widthsForColumnsByKey = this.getWidthsForColumns(); - this.totalTableWidth = props.orderedColumnKeys - .map(key => this.widthsForColumnsByKey[key]) - .reduce((curr, next) => curr + next); - this.totalTableHeight = props.height; - - this.state = { - fitted: false, - displayedList: [...this.list], - }; + ), + ); - this.container = React.createRef(); - } - - componentDidMount() { - this.fitTableToWidthIfNeeded(); - } + const theme = useTheme(); + const [jsonTreeTheme, setJsonTreeTheme] = useState<Record<string, string>>(); - getJsonTreeTheme() { - if (!this.jsonTreeTheme) { - const { theme } = this.props; - this.jsonTreeTheme = { + const getJsonTreeTheme = () => { + if (!jsonTreeTheme) { + setJsonTreeTheme({ base00: theme.colors.grayscale.dark2, base01: theme.colors.grayscale.dark1, base02: theme.colors.grayscale.base, @@ -296,22 +273,20 @@ class FilterableTable extends PureComponent< base0D: theme.colors.primary.base, base0E: theme.colors.primary.dark1, base0F: theme.colors.error.dark1, - }; + }); } - return this.jsonTreeTheme; - } + return jsonTreeTheme; + }; - getDatum(list: Datum[], index: number) { - return list[index % list.length]; - } + const getDatum = (list: Datum[], index: number) => list[index % list.length]; - getWidthsForColumns() { + const getWidthsForColumns = () => { const PADDING = 50; // accounts for cell padding and width of sorting icon const widthsByColumnKey = {}; const cellContent = ([] as string[]).concat( - ...this.props.orderedColumnKeys.map(key => { - const cellContentList = this.list.map((data: Datum) => - this.getCellContent({ cellData: data[key], columnKey: key }), + ...orderedColumnKeys.map(key => { + const cellContentList = list.map((data: Datum) => + getCellContent({ cellData: data[key], columnKey: key }), ); cellContentList.push(key); return cellContentList; @@ -323,30 +298,26 @@ class FilterableTable extends PureComponent< texts: cellContent, }).map(dimension => dimension.width); - this.props.orderedColumnKeys.forEach((key, index) => { + orderedColumnKeys.forEach((key, index) => { // we can't use Math.max(...colWidths.slice(...)) here since the number // of elements might be bigger than the number of allowed arguments in a - // Javascript function - const value = (widthsByColumnKey[key] = + // JavaScript function + widthsByColumnKey[key] = colWidths - .slice( - index * (this.list.length + 1), - (index + 1) * (this.list.length + 1), - ) - .reduce((a, b) => Math.max(a, b)) + PADDING); - widthsByColumnKey[key] = value; + .slice(index * (list.length + 1), (index + 1) * (list.length + 1)) + .reduce((a, b) => Math.max(a, b)) + PADDING; }); return widthsByColumnKey; - } + }; - getCellContent({ + const getCellContent = ({ cellData, columnKey, }: { cellData: CellDataType; columnKey: string; - }) { + }) => { if (cellData === null) { return 'NULL'; } @@ -360,24 +331,34 @@ class FilterableTable extends PureComponent< } else { truncated = ''; } - return this.complexColumns[columnKey] ? truncated : content; - } + return complexColumns[columnKey] ? truncated : content; + }; - formatTableData(data: Record<string, unknown>[]): Datum[] { - return data.map(row => { - const newRow = {}; - Object.entries(row).forEach(([key, val]) => { - if (['string', 'number'].indexOf(typeof val) >= 0) { - newRow[key] = val; - } else { - newRow[key] = val === null ? null : JSONbig.stringify(val); - } - }); - return newRow; - }); - } + const [widthsForColumnsByKey] = useState<Record<string, number>>(() => + getWidthsForColumns(), + ); + + const totalTableWidth = useRef( + orderedColumnKeys + .map(key => widthsForColumnsByKey[key]) + .reduce((curr, next) => curr + next), + ); + const container = useRef<HTMLDivElement>(null); + + const fitTableToWidthIfNeeded = () => { + const containerWidth = container.current?.clientWidth ?? 0; + if (totalTableWidth.current < containerWidth) { + // fit table width if content doesn't fill the width of the container + totalTableWidth.current = containerWidth; + } + setFitted(true); + }; - hasMatch(text: string, row: Datum) { + useEffect(() => { + fitTableToWidthIfNeeded(); + }, []); + + const hasMatch = (text: string, row: Datum) => { const values: string[] = []; Object.keys(row).forEach(key => { if (row.hasOwnProperty(key)) { @@ -394,82 +375,66 @@ class FilterableTable extends PureComponent< }); const lowerCaseText = text.toLowerCase(); return values.some(v => v.includes(lowerCaseText)); - } + }; - rowClassName({ index }: { index: number }) { + const rowClassName = ({ index }: { index: number }) => { let className = ''; - if (this.props.striped) { + if (striped) { className = index % 2 === 0 ? 'even-row' : 'odd-row'; } return className; - } + }; - sort({ + const sort = ({ sortBy, sortDirection, }: { sortBy: string; sortDirection: SortDirectionType; - }) { - let updatedState: FilterableTableState; - + }) => { const shouldClearSort = - this.state.sortDirection === SortDirection.DESC && - this.state.sortBy === sortBy; + sortDirectionState === SortDirection.DESC && sortByState === sortBy; if (shouldClearSort) { - updatedState = { - ...this.state, - sortBy: undefined, - sortDirection: undefined, - displayedList: [...this.list], - }; + setSortByState(undefined); + setSortDirectionState(undefined); + setDisplayedList([...list]); } else { - updatedState = { - ...this.state, - sortBy, - sortDirection, - displayedList: [...this.list].sort( - this.sortResults(sortBy, sortDirection === SortDirection.DESC), + setSortByState(sortBy); + setSortDirectionState(sortDirection); + setDisplayedList( + [...list].sort( + sortResults(sortBy, sortDirection === SortDirection.DESC), ), - }; - } - - this.setState(updatedState); - } - - fitTableToWidthIfNeeded() { - const containerWidth = this.container.current?.clientWidth ?? 0; - if (this.totalTableWidth < containerWidth) { - // fit table width if content doesn't fill the width of the container - this.totalTableWidth = containerWidth; + ); } - this.setState({ fitted: true }); - } + }; - addJsonModal( + const addJsonModal = ( node: React.ReactNode, jsonObject: Record<string, unknown> | unknown[], jsonString: CellDataType, - ) { - return ( - <ModalTrigger - modalBody={ - <JSONTree data={jsonObject} theme={this.getJsonTreeTheme()} /> - } - modalFooter={ - <Button> - <CopyToClipboard shouldShowText={false} text={jsonString} /> - </Button> - } - modalTitle={t('Cell content')} - triggerNode={node} - /> - ); - } + ) => ( + <ModalTrigger + modalBody={ + <JSONTree + data={jsonObject} + theme={getJsonTreeTheme()} + valueRenderer={renderBigIntStrToNumber} + /> + } + modalFooter={ + <Button> + <CopyToClipboard shouldShowText={false} text={jsonString} /> + </Button> + } + modalTitle={t('Cell content')} + triggerNode={node} + /> + ); // Parse any numbers from strings so they'll sort correctly - parseNumberFromString = (value: string | number | null) => { + const parseNumberFromString = (value: string | number | null) => { if (typeof value === 'string') { if (ONLY_NUMBER_REGEX.test(value)) { return parseFloat(value); @@ -479,10 +444,10 @@ class FilterableTable extends PureComponent< return value; }; - sortResults(sortBy: string, descending: boolean) { - return (a: Datum, b: Datum) => { - const aValue = this.parseNumberFromString(a[sortBy]); - const bValue = this.parseNumberFromString(b[sortBy]); + const sortResults = + (sortBy: string, descending: boolean) => (a: Datum, b: Datum) => { + const aValue = parseNumberFromString(a[sortBy]); + const bValue = parseNumberFromString(b[sortBy]); // equal items sort equally if (aValue === bValue) { @@ -502,20 +467,18 @@ class FilterableTable extends PureComponent< } return aValue < bValue ? -1 : 1; }; - } - sortGrid = (label: string) => { - this.sort({ + const sortGrid = (label: string) => { + sort({ sortBy: label, sortDirection: - this.state.sortDirection === SortDirection.DESC || - this.state.sortBy !== label + sortDirectionState === SortDirection.DESC || sortByState !== label ? SortDirection.ASC : SortDirection.DESC, }); }; - renderTableHeader({ + const renderTableHeader = ({ dataKey, label, sortBy, @@ -525,9 +488,9 @@ class FilterableTable extends PureComponent< label: string; sortBy: string; sortDirection: SortDirectionType; - }) { + }) => { const className = - this.props.expandedColumns.indexOf(label) > -1 + expandedColumns.indexOf(label) > -1 ? 'header-style-disabled' : 'header-style'; @@ -537,9 +500,9 @@ class FilterableTable extends PureComponent< {sortBy === dataKey && <SortIndicator sortDirection={sortDirection} />} </div> ); - } + }; - renderGridCellHeader({ + const renderGridCellHeader = ({ columnIndex, key, style, @@ -547,10 +510,10 @@ class FilterableTable extends PureComponent< columnIndex: number; key: string; style: React.CSSProperties; - }) { - const label = this.props.orderedColumnKeys[columnIndex]; + }) => { + const label = orderedColumnKeys[columnIndex]; const className = - this.props.expandedColumns.indexOf(label) > -1 + expandedColumns.indexOf(label) > -1 ? 'header-style-disabled' : 'header-style'; return ( @@ -566,17 +529,17 @@ class FilterableTable extends PureComponent< className={`${className} grid-cell grid-header-cell`} role="columnheader" tabIndex={columnIndex} - onClick={() => this.sortGrid(label)} + onClick={() => sortGrid(label)} > {label} - {this.state.sortBy === label && ( - <SortIndicator sortDirection={this.state.sortDirection} /> + {sortByState === label && ( + <SortIndicator sortDirection={sortDirectionState} /> )} </div> ); - } + }; - renderGridCell({ + const renderGridCell = ({ columnIndex, key, rowIndex, @@ -586,10 +549,10 @@ class FilterableTable extends PureComponent< key: string; rowIndex: number; style: React.CSSProperties; - }) { - const columnKey = this.props.orderedColumnKeys[columnIndex]; - const cellData = this.state.displayedList[rowIndex][columnKey]; - const cellText = this.getCellContent({ cellData, columnKey }); + }) => { + const columnKey = orderedColumnKeys[columnIndex]; + const cellData = displayedList[rowIndex][columnKey]; + const cellText = getCellContent({ cellData, columnKey }); const content = cellData === null ? <i className="text-muted">{cellText}</i> : cellText; const cellNode = ( @@ -602,7 +565,7 @@ class FilterableTable extends PureComponent< ? style.top - GRID_POSITION_ADJUSTMENT : style.top, }} - className={`grid-cell ${this.rowClassName({ index: rowIndex })}`} + className={`grid-cell ${rowClassName({ index: rowIndex })}`} > <div css={{ width: 'inherit' }}>{content}</div> </div> @@ -610,37 +573,26 @@ class FilterableTable extends PureComponent< const jsonObject = safeJsonObjectParse(cellData); if (jsonObject) { - return this.addJsonModal(cellNode, jsonObject, cellData); + return addJsonModal(cellNode, jsonObject, cellData); } return cellNode; - } + }; - renderGrid() { - const { - orderedColumnKeys, - overscanColumnCount, - overscanRowCount, - rowHeight, - } = this.props; - - let { height } = this.props; - let totalTableHeight = height; - if ( - this.container.current && - this.totalTableWidth > this.container.current.clientWidth - ) { - // exclude the height of the horizontal scroll bar from the height of the table - // and the height of the table container if the content overflows - height -= SCROLL_BAR_HEIGHT; - totalTableHeight -= SCROLL_BAR_HEIGHT; - } + const renderGrid = () => { + // exclude the height of the horizontal scroll bar from the height of the table + // and the height of the table container if the content overflows + const totalTableHeight = + container.current && + totalTableWidth.current > container.current.clientWidth + ? height - SCROLL_BAR_HEIGHT + : height; const getColumnWidth = ({ index }: { index: number }) => - this.widthsForColumnsByKey[orderedColumnKeys[index]]; + widthsForColumnsByKey[orderedColumnKeys[index]]; // fix height of filterable table return ( - <StyledFilterableTable> + <StyledFilterableTable data-test="grid-container"> <ScrollSync> {({ onScroll, scrollLeft }) => ( <> @@ -648,7 +600,7 @@ class FilterableTable extends PureComponent< {({ width }) => ( <div> <Grid - cellRenderer={this.renderGridCellHeader} + cellRenderer={renderGridCellHeader} columnCount={orderedColumnKeys.length} columnWidth={getColumnWidth} height={rowHeight} @@ -659,14 +611,14 @@ class FilterableTable extends PureComponent< style={{ overflow: 'hidden' }} /> <Grid - cellRenderer={this.renderGridCell} + cellRenderer={renderGridCell} columnCount={orderedColumnKeys.length} columnWidth={getColumnWidth} height={totalTableHeight - rowHeight} onScroll={onScroll} overscanColumnCount={overscanColumnCount} overscanRowCount={overscanRowCount} - rowCount={this.list.length} + rowCount={list.length} rowHeight={rowHeight} width={width} /> @@ -678,86 +630,73 @@ class FilterableTable extends PureComponent< </ScrollSync> </StyledFilterableTable> ); - } + }; - renderTableCell({ + const renderTableCell = ({ cellData, columnKey, }: { cellData: CellDataType; columnKey: string; - }) { - const cellNode = this.getCellContent({ cellData, columnKey }); + }) => { + const cellNode = getCellContent({ cellData, columnKey }); const content = cellData === null ? <i className="text-muted">{cellNode}</i> : cellNode; const jsonObject = safeJsonObjectParse(cellData); if (jsonObject) { - return this.addJsonModal(cellNode, jsonObject, cellData); + return addJsonModal(cellNode, jsonObject, cellData); } return content; - } + }; - renderTable() { - const { sortBy, sortDirection } = this.state; - const { - filterText, - headerHeight, - orderedColumnKeys, - overscanRowCount, - rowHeight, - } = this.props; - - let sortedAndFilteredList = this.state.displayedList; + const renderTable = () => { + let sortedAndFilteredList = displayedList; // filter list if (filterText) { sortedAndFilteredList = sortedAndFilteredList.filter((row: Datum) => - this.hasMatch(filterText, row), + hasMatch(filterText, row), ); } - let { height } = this.props; - let totalTableHeight = height; - if ( - this.container.current && - this.totalTableWidth > this.container.current.clientWidth - ) { - // exclude the height of the horizontal scroll bar from the height of the table - // and the height of the table container if the content overflows - height -= SCROLL_BAR_HEIGHT; - totalTableHeight -= SCROLL_BAR_HEIGHT; - } + // exclude the height of the horizontal scroll bar from the height of the table + // and the height of the table container if the content overflows + const totalTableHeight = + container.current && + totalTableWidth.current > container.current.clientWidth + ? height - SCROLL_BAR_HEIGHT + : height; const rowGetter = ({ index }: { index: number }) => - this.getDatum(sortedAndFilteredList, index); + getDatum(sortedAndFilteredList, index); return ( <StyledFilterableTable className="filterable-table-container" - ref={this.container} + data-test="table-container" + ref={container} > - {this.state.fitted && ( + {fitted && ( <Table - ref="Table" headerHeight={headerHeight} height={totalTableHeight} overscanRowCount={overscanRowCount} - rowClassName={this.rowClassName} + rowClassName={rowClassName} rowHeight={rowHeight} rowGetter={rowGetter} rowCount={sortedAndFilteredList.length} - sort={this.sort} - sortBy={sortBy} - sortDirection={sortDirection} - width={this.totalTableWidth} + sort={sort} + sortBy={sortByState} + sortDirection={sortDirectionState} + width={totalTableWidth.current} > {orderedColumnKeys.map(columnKey => ( <Column cellRenderer={({ cellData }) => - this.renderTableCell({ cellData, columnKey }) + renderTableCell({ cellData, columnKey }) } dataKey={columnKey} disableSort={false} - headerRenderer={this.renderTableHeader} - width={this.widthsForColumnsByKey[columnKey]} + headerRenderer={renderTableHeader} + width={widthsForColumnsByKey[columnKey]} label={columnKey} key={columnKey} /> @@ -766,14 +705,12 @@ class FilterableTable extends PureComponent< )} </StyledFilterableTable> ); - } + }; - render() { - if (this.props.orderedColumnKeys.length > MAX_COLUMNS_FOR_TABLE) { - return this.renderGrid(); - } - return this.renderTable(); + if (orderedColumnKeys.length > MAX_COLUMNS_FOR_TABLE) { + return renderGrid(); } -} + return renderTable(); +}; -export default withTheme(FilterableTable); +export default FilterableTable; diff --git a/superset-frontend/src/components/Form/LabeledErrorBoundInput.test.jsx b/superset-frontend/src/components/Form/LabeledErrorBoundInput.test.jsx index a49b2713d07a..5324f1bef097 100644 --- a/superset-frontend/src/components/Form/LabeledErrorBoundInput.test.jsx +++ b/superset-frontend/src/components/Form/LabeledErrorBoundInput.test.jsx @@ -75,4 +75,18 @@ describe('LabeledErrorBoundInput', () => { expect(textboxInput).toBeVisible(); expect(await screen.findByText('This is a tooltip')).toBeInTheDocument(); }); + + it('becomes a password input if visibilityToggle prop is passed in', async () => { + defaultProps.visibilityToggle = true; + render(<LabeledErrorBoundInput {...defaultProps} />); + + expect(await screen.findByTestId('icon-eye')).toBeVisible(); + }); + + it('becomes a password input if props.name === password (backwards compatibility)', async () => { + defaultProps.name = 'password'; + render(<LabeledErrorBoundInput {...defaultProps} />); + + expect(await screen.findByTestId('icon-eye')).toBeVisible(); + }); }); diff --git a/superset-frontend/src/components/Form/LabeledErrorBoundInput.tsx b/superset-frontend/src/components/Form/LabeledErrorBoundInput.tsx index ebbb1c023622..51cf104b271c 100644 --- a/superset-frontend/src/components/Form/LabeledErrorBoundInput.tsx +++ b/superset-frontend/src/components/Form/LabeledErrorBoundInput.tsx @@ -18,9 +18,9 @@ */ import React from 'react'; import { Input, Tooltip } from 'antd'; -import { EyeInvisibleOutlined, EyeOutlined } from '@ant-design/icons'; -import { styled, css, SupersetTheme } from '@superset-ui/core'; +import { styled, css, SupersetTheme, t } from '@superset-ui/core'; import InfoTooltip from 'src/components/InfoTooltip'; +import Icons from 'src/components/Icons'; import errorIcon from 'src/assets/images/icons/error.svg'; import FormItem from './FormItem'; import FormLabel from './FormLabel'; @@ -37,6 +37,7 @@ export interface LabeledErrorBoundInputProps { tooltipText?: string | null; id?: string; classname?: string; + visibilityToggle?: boolean; [x: string]: any; } @@ -91,6 +92,12 @@ const StyledFormLabel = styled(FormLabel)` margin-bottom: 0; `; +const iconReset = css` + &.anticon > * { + line-height: 0; + } +`; + const LabeledErrorBoundInput = ({ label, validationMethods, @@ -101,6 +108,7 @@ const LabeledErrorBoundInput = ({ tooltipText, id, className, + visibilityToggle, ...props }: LabeledErrorBoundInputProps) => ( <StyledFormGroup className={className}> @@ -119,18 +127,22 @@ const LabeledErrorBoundInput = ({ help={errorMessage || helpText} hasFeedback={!!errorMessage} > - {props.name === 'password' ? ( + {visibilityToggle || props.name === 'password' ? ( <StyledInputPassword {...props} {...validationMethods} iconRender={visible => visible ? ( - <Tooltip title="Hide password."> - <EyeInvisibleOutlined /> + <Tooltip title={t('Hide password.')}> + <Icons.EyeInvisibleOutlined iconSize="m" css={iconReset} /> </Tooltip> ) : ( - <Tooltip title="Show password."> - <EyeOutlined /> + <Tooltip title={t('Show password.')}> + <Icons.EyeOutlined + iconSize="m" + css={iconReset} + data-test="icon-eye" + /> </Tooltip> ) } diff --git a/superset-frontend/src/components/GenericLink/GenericLink.test.tsx b/superset-frontend/src/components/GenericLink/GenericLink.test.tsx new file mode 100644 index 000000000000..c8f2ba5f5f41 --- /dev/null +++ b/superset-frontend/src/components/GenericLink/GenericLink.test.tsx @@ -0,0 +1,59 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import { GenericLink } from './GenericLink'; + +test('renders', () => { + render(<GenericLink to="/explore">Link to Explore</GenericLink>, { + useRouter: true, + }); + expect(screen.getByText('Link to Explore')).toBeVisible(); +}); + +test('navigates to internal URL', () => { + render(<GenericLink to="/explore">Link to Explore</GenericLink>, { + useRouter: true, + }); + const internalLink = screen.getByTestId('internal-link'); + expect(internalLink).toHaveAttribute('href', '/explore'); +}); + +test('navigates to external URL', () => { + render( + <GenericLink to="https://superset.apache.org/"> + Link to external website + </GenericLink>, + { useRouter: true }, + ); + const externalLink = screen.getByTestId('external-link'); + expect(externalLink).toHaveAttribute('href', 'https://superset.apache.org/'); +}); + +test('navigates to external URL without host', () => { + render( + <GenericLink to="superset.apache.org/"> + Link to external website + </GenericLink>, + { useRouter: true }, + ); + const externalLink = screen.getByTestId('external-link'); + expect(externalLink).toHaveAttribute('href', '//superset.apache.org/'); +}); diff --git a/superset-frontend/src/components/GenericLink/GenericLink.tsx b/superset-frontend/src/components/GenericLink/GenericLink.tsx new file mode 100644 index 000000000000..2bc111d1b60f --- /dev/null +++ b/superset-frontend/src/components/GenericLink/GenericLink.tsx @@ -0,0 +1,52 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { Link, LinkProps } from 'react-router-dom'; +import { isUrlExternal, parseUrl } from 'src/utils/urlUtils'; + +export const GenericLink = <S,>({ + to, + component, + replace, + innerRef, + children, + ...rest +}: React.PropsWithoutRef<LinkProps<S>> & + React.RefAttributes<HTMLAnchorElement>) => { + if (typeof to === 'string' && isUrlExternal(to)) { + return ( + <a data-test="external-link" href={parseUrl(to)} {...rest}> + {children} + </a> + ); + } + return ( + <Link + data-test="internal-link" + to={to} + component={component} + replace={replace} + innerRef={innerRef} + {...rest} + > + {children} + </Link> + ); +}; diff --git a/superset-frontend/src/components/Icons/index.tsx b/superset-frontend/src/components/Icons/index.tsx index 371278d6d8ef..f9462cc3472f 100644 --- a/superset-frontend/src/components/Icons/index.tsx +++ b/superset-frontend/src/components/Icons/index.tsx @@ -167,7 +167,7 @@ const IconFileNames = [ 'redo', ]; -const iconOverrides: Record<string, React.FC> = {}; +const iconOverrides: Record<string, React.FC<IconType>> = {}; IconFileNames.forEach(fileName => { const keyName = _.startCase(fileName).replace(/ /g, ''); iconOverrides[keyName] = (props: IconType) => ( diff --git a/superset-frontend/src/components/ImportModal/ErrorAlert.tsx b/superset-frontend/src/components/ImportModal/ErrorAlert.tsx index 52bd54a79618..904dced7bad5 100644 --- a/superset-frontend/src/components/ImportModal/ErrorAlert.tsx +++ b/superset-frontend/src/components/ImportModal/ErrorAlert.tsx @@ -49,7 +49,7 @@ const ErrorAlert: FunctionComponent<IProps> = ({ <> <br /> {t( - 'Database driver for importing maybe not installed. Visit the Superset documentation page for installation instructions:', + 'Database driver for importing maybe not installed. Visit the Superset documentation page for installation instructions: ', )} <a href={DOCUMENTATION_LINK} diff --git a/superset-frontend/src/components/ImportModal/index.tsx b/superset-frontend/src/components/ImportModal/index.tsx index 6a980f7d2013..4e8ec1139657 100644 --- a/superset-frontend/src/components/ImportModal/index.tsx +++ b/superset-frontend/src/components/ImportModal/index.tsx @@ -216,7 +216,7 @@ const ImportModelsModal: FunctionComponent<ImportModelsModalProps> = ({ return ( <> - <h5>Database passwords</h5> + <h5>{t('Database passwords')}</h5> <HelperMessage>{passwordsNeededMessage}</HelperMessage> {passwordFields.map(fileName => ( <StyledInputContainer key={`password-for-${fileName}`}> @@ -297,7 +297,7 @@ const ImportModelsModal: FunctionComponent<ImportModelsModalProps> = ({ customRequest={() => {}} disabled={importingModel} > - <Button loading={importingModel}>Select file</Button> + <Button loading={importingModel}>{t('Select file')}</Button> </Upload> </StyledInputContainer> {errorMessage && ( diff --git a/superset-frontend/src/components/IndeterminateCheckbox/IndeterminateCheckbox.test.tsx b/superset-frontend/src/components/IndeterminateCheckbox/IndeterminateCheckbox.test.tsx index 7bced98f8eb8..08fdbe2fa4dd 100644 --- a/superset-frontend/src/components/IndeterminateCheckbox/IndeterminateCheckbox.test.tsx +++ b/superset-frontend/src/components/IndeterminateCheckbox/IndeterminateCheckbox.test.tsx @@ -18,11 +18,11 @@ */ import React from 'react'; -import { render, screen } from 'spec/helpers/testing-library'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; -import IndeterminateCheckbox from '.'; +import IndeterminateCheckbox, { IndeterminateCheckboxProps } from '.'; -const mockedProps = { +const mockedProps: IndeterminateCheckboxProps = { checked: false, id: 'checkbox-id', indeterminate: false, @@ -30,27 +30,30 @@ const mockedProps = { onChange: jest.fn(), }; -test('should render', () => { - const { container } = render(<IndeterminateCheckbox {...mockedProps} />); +const asyncRender = (props = mockedProps) => + waitFor(() => render(<IndeterminateCheckbox {...props} />)); + +test('should render', async () => { + const { container } = await asyncRender(); expect(container).toBeInTheDocument(); }); -test('should render the label', () => { - render(<IndeterminateCheckbox {...mockedProps} />); +test('should render the label', async () => { + await asyncRender(); expect(screen.getByTitle('Checkbox title')).toBeInTheDocument(); }); -test('should render the checkbox', () => { - render(<IndeterminateCheckbox {...mockedProps} />); +test('should render the checkbox', async () => { + await asyncRender(); expect(screen.getByRole('checkbox')).toBeInTheDocument(); }); -test('should render the checkbox-half icon', () => { +test('should render the checkbox-half icon', async () => { const indeterminateProps = { ...mockedProps, indeterminate: true, }; - render(<IndeterminateCheckbox {...indeterminateProps} />); + await asyncRender(indeterminateProps); expect(screen.getByRole('img')).toBeInTheDocument(); expect(screen.getByRole('img')).toHaveAttribute( 'aria-label', @@ -58,24 +61,24 @@ test('should render the checkbox-half icon', () => { ); }); -test('should render the checkbox-off icon', () => { - render(<IndeterminateCheckbox {...mockedProps} />); +test('should render the checkbox-off icon', async () => { + await asyncRender(); expect(screen.getByRole('img')).toBeInTheDocument(); expect(screen.getByRole('img')).toHaveAttribute('aria-label', 'checkbox-off'); }); -test('should render the checkbox-on icon', () => { +test('should render the checkbox-on icon', async () => { const checkboxOnProps = { ...mockedProps, checked: true, }; - render(<IndeterminateCheckbox {...checkboxOnProps} />); + await asyncRender(checkboxOnProps); expect(screen.getByRole('img')).toBeInTheDocument(); expect(screen.getByRole('img')).toHaveAttribute('aria-label', 'checkbox-on'); }); -test('should call the onChange', () => { - render(<IndeterminateCheckbox {...mockedProps} />); +test('should call the onChange', async () => { + await asyncRender(); const label = screen.getByTitle('Checkbox title'); userEvent.click(label); expect(mockedProps.onChange).toHaveBeenCalledTimes(1); diff --git a/superset-frontend/src/components/LastUpdated/LastUpdated.test.tsx b/superset-frontend/src/components/LastUpdated/LastUpdated.test.tsx index 830695918057..1df3f60ee476 100644 --- a/superset-frontend/src/components/LastUpdated/LastUpdated.test.tsx +++ b/superset-frontend/src/components/LastUpdated/LastUpdated.test.tsx @@ -20,6 +20,7 @@ import React from 'react'; import { ReactWrapper } from 'enzyme'; import { styledMount as mount } from 'spec/helpers/theming'; +import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint'; import LastUpdated from '.'; describe('LastUpdated', () => { @@ -31,9 +32,10 @@ describe('LastUpdated', () => { expect(/^Last Updated .+$/.test(wrapper.text())).toBe(true); }); - it('renders a refresh action', () => { + it('renders a refresh action', async () => { const mockAction = jest.fn(); wrapper = mount(<LastUpdated updatedAt={updatedAt} update={mockAction} />); + await waitForComponentToPaint(wrapper); const props = wrapper.find('[aria-label="refresh"]').first().props(); if (props.onClick) { props.onClick({} as React.MouseEvent); diff --git a/superset-frontend/src/components/ListView/CrossLinks.test.tsx b/superset-frontend/src/components/ListView/CrossLinks.test.tsx new file mode 100644 index 000000000000..ad7eb4e0dd28 --- /dev/null +++ b/superset-frontend/src/components/ListView/CrossLinks.test.tsx @@ -0,0 +1,97 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import CrossLinks, { CrossLinksProps } from './CrossLinks'; + +const mockedProps = { + crossLinks: [ + { + id: 1, + title: 'Test dashboard', + }, + { + id: 2, + title: 'Test dashboard 2', + }, + { + id: 3, + title: 'Test dashboard 3', + }, + { + id: 4, + title: 'Test dashboard 4', + }, + ], +}; + +function setup(overrideProps: CrossLinksProps | {} = {}) { + return render(<CrossLinks {...mockedProps} {...overrideProps} />, { + useRouter: true, + }); +} + +test('should render', () => { + const { container } = setup(); + expect(container).toBeInTheDocument(); +}); + +test('should not render links', () => { + setup({ + crossLinks: [], + }); + expect(screen.queryByRole('link')).not.toBeInTheDocument(); +}); + +test('should render the link with just one item', () => { + setup({ + crossLinks: [ + { + id: 1, + title: 'Test dashboard', + }, + ], + }); + expect(screen.getByText('Test dashboard')).toBeInTheDocument(); + expect(screen.getByRole('link')).toHaveAttribute( + 'href', + `/superset/dashboard/1`, + ); +}); + +test('should render a custom prefix link', () => { + setup({ + crossLinks: [ + { + id: 1, + title: 'Test dashboard', + }, + ], + linkPrefix: '/custom/dashboard/', + }); + expect(screen.getByRole('link')).toHaveAttribute( + 'href', + `/custom/dashboard/1`, + ); +}); + +test('should render multiple links', () => { + setup(); + expect(screen.getAllByRole('link')).toHaveLength(4); +}); diff --git a/superset-frontend/src/components/ListView/CrossLinks.tsx b/superset-frontend/src/components/ListView/CrossLinks.tsx new file mode 100644 index 000000000000..653e97b06eab --- /dev/null +++ b/superset-frontend/src/components/ListView/CrossLinks.tsx @@ -0,0 +1,122 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useMemo, useRef } from 'react'; +import { styled } from '@superset-ui/core'; +import { Link } from 'react-router-dom'; +import { useTruncation } from 'src/hooks/useTruncation'; +import CrossLinksTooltip from './CrossLinksTooltip'; + +export type CrossLinkProps = { + title: string; + id: number; +}; + +export type CrossLinksProps = { + crossLinks: Array<CrossLinkProps>; + maxLinks?: number; + linkPrefix?: string; +}; + +const StyledCrossLinks = styled.div` + ${({ theme }) => ` + & > span { + width: 100%; + display: flex; + + .ant-tooltip-open { + display: inline; + } + + .truncated { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: inline-block; + width: 100%; + vertical-align: bottom; + } + + .count { + cursor: pointer; + color: ${theme.colors.grayscale.base}; + font-weight: ${theme.typography.weights.bold}; + } + } + `} +`; + +export default function CrossLinks({ + crossLinks, + maxLinks = 20, + linkPrefix = '/superset/dashboard/', +}: CrossLinksProps) { + const crossLinksRef = useRef<HTMLDivElement>(null); + const plusRef = useRef<HTMLDivElement>(null); + const [elementsTruncated, hasHiddenElements] = useTruncation( + crossLinksRef, + plusRef, + ); + const hasMoreItems = useMemo( + () => + crossLinks.length > maxLinks ? crossLinks.length - maxLinks : undefined, + [crossLinks, maxLinks], + ); + const links = useMemo( + () => ( + <span className="truncated" ref={crossLinksRef} data-test="crosslinks"> + {crossLinks.map((link, index) => ( + <Link + key={link.id} + to={linkPrefix + link.id} + target="_blank" + rel="noreferer noopener" + > + {index === 0 ? link.title : `, ${link.title}`} + </Link> + ))} + </span> + ), + [crossLinks], + ); + const tooltipLinks = useMemo( + () => + crossLinks.slice(0, maxLinks).map(l => ({ + title: l.title, + to: linkPrefix + l.id, + })), + [crossLinks, maxLinks], + ); + + return ( + <StyledCrossLinks> + <CrossLinksTooltip + moreItems={hasMoreItems} + crossLinks={tooltipLinks} + show={!!elementsTruncated} + > + {links} + {hasHiddenElements && ( + <span ref={plusRef} className="count" data-test="count-crosslinks"> + +{elementsTruncated} + </span> + )} + </CrossLinksTooltip> + </StyledCrossLinks> + ); +} diff --git a/superset-frontend/src/components/ListView/CrossLinksTooltip.test.tsx b/superset-frontend/src/components/ListView/CrossLinksTooltip.test.tsx new file mode 100644 index 000000000000..96723e7bf698 --- /dev/null +++ b/superset-frontend/src/components/ListView/CrossLinksTooltip.test.tsx @@ -0,0 +1,89 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import userEvent from '@testing-library/user-event'; +import React from 'react'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import CrossLinksTooltip, { CrossLinksTooltipProps } from './CrossLinksTooltip'; + +const mockedProps = { + crossLinks: [ + { + to: 'somewhere/1', + title: 'Test dashboard', + }, + { + to: 'somewhere/2', + title: 'Test dashboard 2', + }, + { + to: 'somewhere/3', + title: 'Test dashboard 3', + }, + { + to: 'somewhere/4', + title: 'Test dashboard 4', + }, + ], + moreItems: 0, + show: true, +}; + +function setup(overrideProps: CrossLinksTooltipProps | {} = {}) { + return render( + <CrossLinksTooltip {...mockedProps} {...overrideProps}> + Hover me + </CrossLinksTooltip>, + { + useRouter: true, + }, + ); +} + +test('should render', () => { + const { container } = setup(); + expect(container).toBeInTheDocument(); +}); + +test('should render multiple links', async () => { + setup(); + userEvent.hover(screen.getByText('Hover me')); + + await waitFor(() => { + expect(screen.getByText('Test dashboard')).toBeInTheDocument(); + expect(screen.getByText('Test dashboard 2')).toBeInTheDocument(); + expect(screen.getByText('Test dashboard 3')).toBeInTheDocument(); + expect(screen.getByText('Test dashboard 4')).toBeInTheDocument(); + expect(screen.getAllByRole('link')).toHaveLength(4); + }); +}); + +test('should not render the "+ {x} more"', () => { + setup(); + userEvent.hover(screen.getByText('Hover me')); + expect(screen.queryByTestId('plus-more')).not.toBeInTheDocument(); +}); + +test('should render the "+ {x} more"', async () => { + setup({ + moreItems: 3, + }); + userEvent.hover(screen.getByText('Hover me')); + expect(await screen.findByTestId('plus-more')).toBeInTheDocument(); + expect(await screen.findByText('+ 3 more')).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/components/ListView/CrossLinksTooltip.tsx b/superset-frontend/src/components/ListView/CrossLinksTooltip.tsx new file mode 100644 index 000000000000..cc552cd8b4cf --- /dev/null +++ b/superset-frontend/src/components/ListView/CrossLinksTooltip.tsx @@ -0,0 +1,73 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { styled, t } from '@superset-ui/core'; +import { Tooltip } from 'src/components/Tooltip'; +import { Link } from 'react-router-dom'; + +export type CrossLinksTooltipProps = { + children: React.ReactNode; + crossLinks: { to: string; title: string }[]; + moreItems?: number; + show: boolean; +}; + +const StyledLinkedTooltip = styled.div` + .link { + color: ${({ theme }) => theme.colors.grayscale.light5}; + display: block; + text-decoration: underline; + } +`; + +export default function CrossLinksTooltip({ + children, + crossLinks = [], + moreItems = undefined, + show = false, +}: CrossLinksTooltipProps) { + return ( + <Tooltip + placement="top" + data-test="crosslinks-tooltip" + title={ + show && ( + <StyledLinkedTooltip> + {crossLinks.map(link => ( + <Link + className="link" + key={link.to} + to={link.to} + target="_blank" + rel="noreferer noopener" + > + {link.title} + </Link> + ))} + {moreItems && ( + <span data-test="plus-more">{t('+ %s more', moreItems)}</span> + )} + </StyledLinkedTooltip> + ) + } + > + {children} + </Tooltip> + ); +} diff --git a/superset-frontend/src/components/ListView/Filters/DateRange.tsx b/superset-frontend/src/components/ListView/Filters/DateRange.tsx index 4dfaf11f79fd..121131248f2d 100644 --- a/superset-frontend/src/components/ListView/Filters/DateRange.tsx +++ b/superset-frontend/src/components/ListView/Filters/DateRange.tsx @@ -23,7 +23,7 @@ import React, { useImperativeHandle, } from 'react'; import moment, { Moment } from 'moment'; -import { styled } from '@superset-ui/core'; +import { styled, t } from '@superset-ui/core'; import { RangePicker } from 'src/components/DatePicker'; import { FormLabel } from 'src/components/Form'; import { BaseFilter, FilterHandler } from './Base'; @@ -64,6 +64,7 @@ function DateRangeFilter( <RangeFilterContainer> <FormLabel>{Header}</FormLabel> <RangePicker + placeholder={[t('Start date'), t('End date')]} showTime value={momentValue} onChange={momentRange => { diff --git a/superset-frontend/src/components/ListView/Filters/Select.tsx b/superset-frontend/src/components/ListView/Filters/Select.tsx index 525061fd2741..b6c1e2764238 100644 --- a/superset-frontend/src/components/ListView/Filters/Select.tsx +++ b/superset-frontend/src/components/ListView/Filters/Select.tsx @@ -26,12 +26,13 @@ import { t } from '@superset-ui/core'; import { Select } from 'src/components'; import { Filter, SelectOption } from 'src/components/ListView/types'; import { FormLabel } from 'src/components/Form'; +import AsyncSelect from 'src/components/Select/AsyncSelect'; import { FilterContainer, BaseFilter, FilterHandler } from './Base'; interface SelectFilterProps extends BaseFilter { fetchSelects?: Filter['fetchSelects']; name?: string; - onSelect: (selected: SelectOption | undefined) => void; + onSelect: (selected: SelectOption | undefined, isClear?: boolean) => void; paginate?: boolean; selects: Filter['selects']; } @@ -57,7 +58,7 @@ function SelectFilter( }; const onClear = () => { - onSelect(undefined); + onSelect(undefined, true); setSelectedOption(undefined); }; @@ -86,19 +87,34 @@ function SelectFilter( return ( <FilterContainer> - <Select - allowClear - ariaLabel={typeof Header === 'string' ? Header : name || t('Filter')} - labelInValue - data-test="filters-select" - header={<FormLabel>{Header}</FormLabel>} - onChange={onChange} - onClear={onClear} - options={fetchSelects ? fetchAndFormatSelects : selects} - placeholder={t('Select or type a value')} - showSearch - value={selectedOption} - /> + {fetchSelects ? ( + <AsyncSelect + allowClear + ariaLabel={typeof Header === 'string' ? Header : name || t('Filter')} + data-test="filters-select" + header={<FormLabel>{Header}</FormLabel>} + onChange={onChange} + onClear={onClear} + options={fetchAndFormatSelects} + placeholder={t('Select or type a value')} + showSearch + value={selectedOption} + /> + ) : ( + <Select + allowClear + ariaLabel={typeof Header === 'string' ? Header : name || t('Filter')} + data-test="filters-select" + header={<FormLabel>{Header}</FormLabel>} + labelInValue + onChange={onChange} + onClear={onClear} + options={selects} + placeholder={t('Select or type a value')} + showSearch + value={selectedOption} + /> + )} </FilterContainer> ); } diff --git a/superset-frontend/src/components/ListView/Filters/index.tsx b/superset-frontend/src/components/ListView/Filters/index.tsx index 348ed3850dd2..dbbc761cb8a2 100644 --- a/superset-frontend/src/components/ListView/Filters/index.tsx +++ b/superset-frontend/src/components/ListView/Filters/index.tsx @@ -62,9 +62,20 @@ function UIFilters( return ( <> {filters.map( - ({ Header, fetchSelects, id, input, paginate, selects }, index) => { - const initialValue = - internalFilters[index] && internalFilters[index].value; + ( + { + Header, + fetchSelects, + key, + id, + input, + paginate, + selects, + onFilterUpdate, + }, + index, + ) => { + const initialValue = internalFilters?.[index]?.value; if (input === 'select') { return ( <SelectFilter @@ -72,11 +83,21 @@ function UIFilters( Header={Header} fetchSelects={fetchSelects} initialValue={initialValue} - key={id} + key={key} name={id} - onSelect={(option: SelectOption | undefined) => - updateFilterValue(index, option) - } + onSelect={( + option: SelectOption | undefined, + isClear?: boolean, + ) => { + if (onFilterUpdate) { + // Filter change triggers both onChange AND onClear, only want to track onChange + if (!isClear) { + onFilterUpdate(option); + } + } + + updateFilterValue(index, option); + }} paginate={paginate} selects={selects} /> @@ -88,9 +109,15 @@ function UIFilters( ref={filterRefs[index]} Header={Header} initialValue={initialValue} - key={id} + key={key} name={id} - onSubmit={(value: string) => updateFilterValue(index, value)} + onSubmit={(value: string) => { + if (onFilterUpdate) { + onFilterUpdate(value); + } + + updateFilterValue(index, value); + }} /> ); } @@ -100,7 +127,7 @@ function UIFilters( ref={filterRefs[index]} Header={Header} initialValue={initialValue} - key={id} + key={key} name={id} onSubmit={value => updateFilterValue(index, value)} /> diff --git a/superset-frontend/src/components/ListView/types.ts b/superset-frontend/src/components/ListView/types.ts index f8bff90f0ee9..641cb0580151 100644 --- a/superset-frontend/src/components/ListView/types.ts +++ b/superset-frontend/src/components/ListView/types.ts @@ -39,6 +39,7 @@ export interface CardSortSelectOption { export interface Filter { Header: ReactNode; + key: string; id: string; urlDisplay?: string; operator?: FilterOperator; @@ -52,6 +53,7 @@ export interface Filter { unfilteredLabel?: string; selects?: SelectOption[]; onFilterOpen?: () => void; + onFilterUpdate?: (value?: any) => void; fetchSelects?: ( filterValue: string, page: number, @@ -114,4 +116,6 @@ export enum FilterOperator { chartIsCertified = 'chart_is_certified', dashboardIsCertified = 'dashboard_is_certified', datasetIsCertified = 'dataset_is_certified', + dashboardHasCreatedBy = 'dashboard_has_created_by', + chartHasCreatedBy = 'chart_has_created_by', } diff --git a/superset-frontend/src/components/ListView/utils.ts b/superset-frontend/src/components/ListView/utils.ts index 78873f51f14a..8a8c57cb6234 100644 --- a/superset-frontend/src/components/ListView/utils.ts +++ b/superset-frontend/src/components/ListView/utils.ts @@ -35,7 +35,7 @@ import { import rison from 'rison'; import { isEqual } from 'lodash'; -import { PartialStylesConfig } from 'src/components/Select'; +import { PartialStylesConfig } from 'src/components/DeprecatedSelect'; import { FetchDataConfig, Filter, @@ -344,7 +344,7 @@ export function useListViewState({ const applyFilterValue = (index: number, value: any) => { setInternalFilters(currentInternalFilters => { - // skip redunundant updates + // skip redundant updates if (currentInternalFilters[index].value === value) { return currentInternalFilters; } diff --git a/superset-frontend/src/components/ListViewCard/ListViewCard.stories.tsx b/superset-frontend/src/components/ListViewCard/ListViewCard.stories.tsx index 9f91193ee932..ca53d8108464 100644 --- a/superset-frontend/src/components/ListViewCard/ListViewCard.stories.tsx +++ b/superset-frontend/src/components/ListViewCard/ListViewCard.stories.tsx @@ -18,9 +18,7 @@ */ import React from 'react'; import { action } from '@storybook/addon-actions'; -import { withKnobs, boolean, select, text } from '@storybook/addon-knobs'; -import DashboardImg from 'src/assets/images/dashboard-card-fallback.svg'; -import ChartImg from 'src/assets/images/chart-card-fallback.svg'; +import { boolean, text } from '@storybook/addon-knobs'; import { AntdDropdown } from 'src/components'; import { Menu } from 'src/components/Menu'; import Icons from 'src/components/Icons'; @@ -30,16 +28,6 @@ import ListViewCard from '.'; export default { title: 'ListViewCard', component: ListViewCard, - decorators: [withKnobs], -}; - -const imgFallbackKnob = { - label: 'Fallback/Loading Image', - options: { - Dashboard: DashboardImg, - Chart: ChartImg, - }, - defaultValue: DashboardImg, }; export const SupersetListViewCard = () => ( @@ -47,11 +35,13 @@ export const SupersetListViewCard = () => ( title="Superset Card Title" loading={boolean('loading', false)} url="/superset/dashboard/births/" - imgURL={text('imgURL', 'https://picsum.photos/800/600')} - imgFallbackURL={select( - imgFallbackKnob.label, - imgFallbackKnob.options, - imgFallbackKnob.defaultValue, + imgURL={text( + 'imgURL', + 'https://images.unsplash.com/photo-1658163724548-29ef00812a54?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2670&q=80', + )} + imgFallbackURL={text( + 'imgURL', + 'https://images.unsplash.com/photo-1658208193219-e859d9771912?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2670&q=80', )} description="Lorem ipsum dolor sit amet, consectetur adipiscing elit..." coverLeft="Left Section" diff --git a/superset-frontend/src/components/ListViewCard/index.tsx b/superset-frontend/src/components/ListViewCard/index.tsx index 3078db8ea4ba..f182fd70b8f5 100644 --- a/superset-frontend/src/components/ListViewCard/index.tsx +++ b/superset-frontend/src/components/ListViewCard/index.tsx @@ -71,7 +71,7 @@ const Cover = styled.div` const TitleContainer = styled.div` display: flex; justify-content: flex-start; - flex-direction: row; + flex-direction: column; .card-actions { margin-left: auto; @@ -82,6 +82,12 @@ const TitleContainer = styled.div` align-items: center; } } + + .titleRow { + display: flex; + justify-content: flex-start; + flex-direction: row; + } `; const TitleLink = styled.span` @@ -141,6 +147,7 @@ const AnchorLink: React.FC<LinkProps> = ({ to, children }) => ( interface CardProps { title?: React.ReactNode; + subtitle?: React.ReactNode; url?: string; linkComponent?: React.ComponentType<LinkProps>; imgURL?: string; @@ -161,6 +168,7 @@ interface CardProps { function ListViewCard({ title, + subtitle, url, linkComponent, titleRight, @@ -245,9 +253,10 @@ function ListViewCard({ <AntdCard.Meta title={ <TitleContainer> - <Tooltip title={title}> - <TitleLink> - <Link to={url!}> + {subtitle || null} + <div className="titleRow"> + <Tooltip title={title}> + <TitleLink> {certifiedBy && ( <> <CertifiedBadge @@ -257,12 +266,12 @@ function ListViewCard({ </> )} {title} - </Link> - </TitleLink> - </Tooltip> - {titleRight && <TitleRight>{titleRight}</TitleRight>} - <div className="card-actions" data-test="card-actions"> - {actions} + </TitleLink> + </Tooltip> + {titleRight && <TitleRight>{titleRight}</TitleRight>} + <div className="card-actions" data-test="card-actions"> + {actions} + </div> </div> </TitleContainer> } diff --git a/superset-frontend/src/components/Loading/Loading.stories.tsx b/superset-frontend/src/components/Loading/Loading.stories.tsx index 9f079848b8a2..0c80c6f0ff61 100644 --- a/superset-frontend/src/components/Loading/Loading.stories.tsx +++ b/superset-frontend/src/components/Loading/Loading.stories.tsx @@ -40,7 +40,7 @@ export const LoadingGallery = () => ( }} > <h4>{position}</h4> - <Loading position={position} image="/src/assets/images/loading.gif" /> + <Loading position={position} /> </div> ))} </> @@ -71,7 +71,7 @@ InteractiveLoading.story = { }; InteractiveLoading.args = { - image: '/src/assets/images/loading.gif', + image: '', className: '', }; diff --git a/superset-frontend/src/components/Loading/Loading.test.tsx b/superset-frontend/src/components/Loading/Loading.test.tsx index d6ea8581c510..7325c9304b58 100644 --- a/superset-frontend/src/components/Loading/Loading.test.tsx +++ b/superset-frontend/src/components/Loading/Loading.test.tsx @@ -26,11 +26,9 @@ test('Rerendering correctly with default props', () => { render(<Loading />); const loading = screen.getByRole('status'); const classNames = loading.getAttribute('class')?.split(' '); - const imagePath = loading.getAttribute('src'); const ariaLive = loading.getAttribute('aria-live'); const ariaLabel = loading.getAttribute('aria-label'); expect(loading).toBeInTheDocument(); - expect(imagePath).toBe('/static/assets/images/loading.gif'); expect(classNames).toContain('floating'); expect(classNames).toContain('loading'); expect(ariaLive).toContain('polite'); @@ -56,7 +54,7 @@ test('support for extra classes', () => { expect(classNames).toContain('extra-class'); }); -test('Diferent image path', () => { +test('Different image path', () => { render(<Loading image="/src/assets/images/loading.gif" />); const loading = screen.getByRole('status'); const imagePath = loading.getAttribute('src'); diff --git a/superset-frontend/src/components/Loading/index.tsx b/superset-frontend/src/components/Loading/index.tsx index 6ba6fb45c544..b8d91ce6a2ea 100644 --- a/superset-frontend/src/components/Loading/index.tsx +++ b/superset-frontend/src/components/Loading/index.tsx @@ -20,6 +20,7 @@ import React from 'react'; import { styled } from '@superset-ui/core'; import cls from 'classnames'; +import Loader from 'src/assets/images/loading.gif'; export type PositionOption = | 'floating' @@ -35,6 +36,7 @@ export interface Props { const LoaderImg = styled.img` z-index: 99; width: 50px; + height: unset; position: relative; margin: 10px; &.inline { @@ -57,17 +59,18 @@ const LoaderImg = styled.img` `; export default function Loading({ position = 'floating', - image = '/static/assets/images/loading.gif', + image, className, }: Props) { return ( <LoaderImg className={cls('loading', position, className)} alt="Loading..." - src={image} + src={image || Loader} role="status" aria-live="polite" aria-label="Loading" + data-test="loading-indicator" /> ); } diff --git a/superset-frontend/src/components/Menu/index.tsx b/superset-frontend/src/components/Menu/index.tsx index 73858bc92e91..a7061b47e12c 100644 --- a/superset-frontend/src/components/Menu/index.tsx +++ b/superset-frontend/src/components/Menu/index.tsx @@ -18,6 +18,9 @@ */ import { styled } from '@superset-ui/core'; import { Menu as AntdMenu } from 'antd'; +import { MenuProps as AntdMenuProps } from 'antd/lib/menu'; + +export type MenuProps = AntdMenuProps; const MenuItem = styled(AntdMenu.Item)` > a { diff --git a/superset-frontend/src/components/MessageToasts/Toast.tsx b/superset-frontend/src/components/MessageToasts/Toast.tsx index 0a1a93d92a49..c248a2427b37 100644 --- a/superset-frontend/src/components/MessageToasts/Toast.tsx +++ b/superset-frontend/src/components/MessageToasts/Toast.tsx @@ -18,7 +18,7 @@ */ import { styled, css, SupersetTheme } from '@superset-ui/core'; import cx from 'classnames'; -import Interweave from 'interweave'; +import { Interweave } from 'interweave'; import React, { useCallback, useEffect, useRef, useState } from 'react'; import Icons from 'src/components/Icons'; import { ToastType, ToastMeta } from './types'; diff --git a/superset-frontend/src/components/MetadataBar/ContentConfig.tsx b/superset-frontend/src/components/MetadataBar/ContentConfig.tsx new file mode 100644 index 000000000000..8e9958da1c8f --- /dev/null +++ b/superset-frontend/src/components/MetadataBar/ContentConfig.tsx @@ -0,0 +1,136 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { ensureIsArray, styled, t } from '@superset-ui/core'; +import Icons from 'src/components/Icons'; +import { ContentType, MetadataType } from '.'; + +const Header = styled.div` + font-weight: ${({ theme }) => theme.typography.weights.bold}; +`; + +const Info = ({ + text, + header, +}: { + text?: string | string[]; + header?: string; +}) => { + const values = ensureIsArray(text); + return ( + <> + {header && <Header>{header}</Header>} + {values.map(value => ( + <div key={value}>{value}</div> + ))} + </> + ); +}; + +const config = (contentType: ContentType) => { + const { type } = contentType; + + /** + * Tooltips are very similar. It's pretty much blocks + * of header/text pairs. That's why they are implemented here. + * If more complex tooltips emerge, then we should extract the different + * types of tooltips to their own components and reference them here. + */ + + switch (type) { + case MetadataType.DASHBOARDS: + return { + icon: Icons.FundProjectionScreenOutlined, + title: contentType.title, + tooltip: contentType.description ? ( + <div> + <Info header={contentType.title} text={contentType.description} /> + </div> + ) : undefined, + }; + + case MetadataType.DESCRIPTION: + return { + icon: Icons.BookOutlined, + title: contentType.value, + }; + + case MetadataType.LAST_MODIFIED: + return { + icon: Icons.EditOutlined, + title: contentType.value, + tooltip: ( + <div> + <Info header={t('Last modified')} text={contentType.value} /> + <Info header={t('Modified by')} text={contentType.modifiedBy} /> + </div> + ), + }; + + case MetadataType.OWNER: + return { + icon: Icons.UserOutlined, + title: contentType.createdBy, + tooltip: ( + <div> + <Info header={t('Created by')} text={contentType.createdBy} /> + <Info header={t('Owners')} text={contentType.owners} /> + <Info header={t('Created on')} text={contentType.createdOn} /> + </div> + ), + }; + + case MetadataType.ROWS: + return { + icon: Icons.InsertRowBelowOutlined, + title: contentType.title, + tooltip: contentType.title, + }; + + case MetadataType.SQL: + return { + icon: Icons.ConsoleSqlOutlined, + title: contentType.title, + tooltip: contentType.title, + }; + + case MetadataType.TABLE: + return { + icon: Icons.Table, + title: contentType.title, + tooltip: contentType.title, + }; + + case MetadataType.TAGS: + return { + icon: Icons.TagsOutlined, + title: contentType.values.join(', '), + tooltip: ( + <div> + <Info header={t('Tags')} text={contentType.values} /> + </div> + ), + }; + + default: + throw Error(`Invalid type provided: ${type}`); + } +}; + +export { config }; diff --git a/superset-frontend/src/components/MetadataBar/ContentType.ts b/superset-frontend/src/components/MetadataBar/ContentType.ts new file mode 100644 index 000000000000..13c070739108 --- /dev/null +++ b/superset-frontend/src/components/MetadataBar/ContentType.ts @@ -0,0 +1,91 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export enum MetadataType { + DASHBOARDS = 'dashboards', + DESCRIPTION = 'description', + LAST_MODIFIED = 'lastModified', + OWNER = 'owner', + ROWS = 'rows', + SQL = 'sql', + TABLE = 'table', + TAGS = 'tags', +} + +export type Dashboards = { + type: MetadataType.DASHBOARDS; + title: string; + description?: string; + onClick?: (type: string) => void; +}; + +export type Description = { + type: MetadataType.DESCRIPTION; + value: string; + onClick?: (type: string) => void; +}; + +export type LastModified = { + type: MetadataType.LAST_MODIFIED; + value: string; + modifiedBy: string; + onClick?: (type: string) => void; +}; + +export type Owner = { + type: MetadataType.OWNER; + createdBy: string; + owners: string[]; + createdOn: string; + onClick?: (type: string) => void; +}; + +export type Rows = { + type: MetadataType.ROWS; + title: string; + onClick?: (type: string) => void; +}; + +export type Sql = { + type: MetadataType.SQL; + title: string; + onClick?: (type: string) => void; +}; + +export type Table = { + type: MetadataType.TABLE; + title: string; + onClick?: (type: string) => void; +}; + +export type Tags = { + type: MetadataType.TAGS; + values: string[]; + onClick?: (type: string) => void; +}; + +export type ContentType = + | Dashboards + | Description + | LastModified + | Owner + | Rows + | Sql + | Table + | Tags; diff --git a/superset-frontend/src/components/MetadataBar/MetadataBar.stories.mdx b/superset-frontend/src/components/MetadataBar/MetadataBar.stories.mdx new file mode 100644 index 000000000000..d85c2c622684 --- /dev/null +++ b/superset-frontend/src/components/MetadataBar/MetadataBar.stories.mdx @@ -0,0 +1,145 @@ +import { Meta, Source, Story } from '@storybook/addon-docs'; + +<Meta title="Design System/Components/MetadataBar/Overview" /> + +# Metadata bar + +The metadata bar component is used to display additional information about an entity. + +## Usage + +Some of the common applications in Superset are: + +- Display the chart's metadata in Explore to help the user understand what dashboards this chart is added to and get + to know the details of the chart +- Display the database's metadata in a drill to detail modal to help the user understand what data they are looking + at while accessing the feature in the dashboard + +## Basic example + +<Story id="design-system-components-metadatabar-examples--basic" /> + +## Variations + +The metadata bar is by default a static component (besides the links in text). +The variations in this component are related to content and entity type as all of the details are predefined +in the code and should be specific for each metadata object. + +Content types are predefined and consistent across the whole app. This means that +they will be displayed and behave in a consistent manner, keeping the same ordering, +information formatting, and interactions. For example, the Owner content type will always +have the same icon and when hovered it will present who created the entity, its current owners, and when the entity was created. + +To extend the list of content types, a developer needs to request the inclusion of the new type in the design system. +This process is important to make sure the new type is reviewed by the design team, improving Superset consistency. + +To check each content type in detail and its interactions, check the [MetadataBar](/story/design-system-components-metadatabar-examples--basic) page. +Below you can find the configurations for each content type: + +<Source + language="jsx" + format={true} + code={` + export enum MetadataType { + DASHBOARDS = 'dashboards', + DESCRIPTION = 'description', + LAST_MODIFIED = 'lastModified', + OWNER = 'owner', + ROWS = 'rows', + SQL = 'sql', + TABLE = 'table', + TAGS = 'tags', + }`} +/> + +<Source + language="jsx" + format={true} + code={` + export type Dashboards = { + type: MetadataType.DASHBOARDS; + title: string; + description?: string; + onClick?: (type: string) => void; + };`} +/> + +<Source + language="jsx" + format={true} + code={` + export type Description = { + type: MetadataType.DESCRIPTION; + value: string; + onClick?: (type: string) => void; + };`} +/> + +<Source + language="jsx" + format={true} + code={` + export type LastModified = { + type: MetadataType.LAST_MODIFIED; + value: Date; + modifiedBy: string; + onClick?: (type: string) => void; + };`} +/> + +<Source + language="jsx" + format={true} + code={` + export type Owner = { + type: MetadataType.OWNER; + createdBy: string; + owners: string[]; + createdOn: Date; + onClick?: (type: string) => void; + };`} +/> + +<Source + language="jsx" + format={true} + code={` + export type Rows = { + type: MetadataType.ROWS; + title: string; + onClick?: (type: string) => void; + };`} +/> + +<Source + language="jsx" + format={true} + code={` + export type Sql = { + type: MetadataType.SQL; + title: string; + onClick?: (type: string) => void; + };`} +/> + +<Source + language="jsx" + format={true} + code={` + export type Table = { + type: MetadataType.TABLE; + title: string; + onClick?: (type: string) => void; + };`} +/> + +<Source + language="jsx" + format={true} + code={` + export type Tags = { + type: MetadataType.TAGS; + values: string[]; + onClick?: (type: string) => void; + };`} +/> diff --git a/superset-frontend/src/components/MetadataBar/MetadataBar.stories.tsx b/superset-frontend/src/components/MetadataBar/MetadataBar.stories.tsx new file mode 100644 index 000000000000..1b5fb33d9612 --- /dev/null +++ b/superset-frontend/src/components/MetadataBar/MetadataBar.stories.tsx @@ -0,0 +1,109 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { css } from '@superset-ui/core'; +import { useResizeDetector } from 'react-resize-detector'; +import MetadataBar, { MetadataBarProps, MetadataType } from '.'; + +export default { + title: 'Design System/Components/MetadataBar/Examples', + component: MetadataBar, +}; + +const A_WEEK_AGO = 'a week ago'; + +export const Basic = ({ + items, + onClick, +}: MetadataBarProps & { + onClick: (type: string) => void; +}) => { + const { width, height, ref } = useResizeDetector(); + // eslint-disable-next-line no-param-reassign + items[0].onClick = onClick; + return ( + <div + ref={ref} + css={css` + margin-top: 70px; + margin-left: 80px; + overflow: auto; + min-width: ${168}px; + max-width: ${740}px; + resize: horizontal; + `} + > + <MetadataBar items={items} /> + <span + css={css` + position: absolute; + top: 150px; + left: 115px; + `} + >{`${width}x${height}`}</span> + </div> + ); +}; + +Basic.story = { + parameters: { + knobs: { + disable: true, + }, + }, +}; + +Basic.args = { + items: [ + { + type: MetadataType.SQL, + title: 'Click to view query', + }, + { + type: MetadataType.OWNER, + createdBy: 'Jane Smith', + owners: ['John Doe', 'Mary Wilson'], + createdOn: A_WEEK_AGO, + }, + { + type: MetadataType.LAST_MODIFIED, + value: A_WEEK_AGO, + modifiedBy: 'Jane Smith', + }, + { + type: MetadataType.TAGS, + values: ['management', 'research', 'poc'], + }, + { + type: MetadataType.DASHBOARDS, + title: 'Added to 452 dashboards', + description: + 'To preview the list of dashboards go to "More" settings on the right.', + }, + ], +}; + +Basic.argTypes = { + onClick: { + action: 'onClick', + table: { + disable: true, + }, + }, +}; diff --git a/superset-frontend/src/components/MetadataBar/MetadataBar.test.tsx b/superset-frontend/src/components/MetadataBar/MetadataBar.test.tsx new file mode 100644 index 000000000000..549b917ec138 --- /dev/null +++ b/superset-frontend/src/components/MetadataBar/MetadataBar.test.tsx @@ -0,0 +1,268 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen, within } from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; +import * as resizeDetector from 'react-resize-detector'; +import { supersetTheme } from '@superset-ui/core'; +import { hexToRgb } from 'src/utils/colorUtils'; +import MetadataBar, { + MIN_NUMBER_ITEMS, + MAX_NUMBER_ITEMS, + ContentType, + MetadataType, +} from '.'; + +const DASHBOARD_TITLE = 'Added to 452 dashboards'; +const DASHBOARD_DESCRIPTION = + 'To preview the list of dashboards go to "More" settings on the right.'; +const DESCRIPTION_VALUE = 'This is the description'; +const ROWS_TITLE = '500 rows'; +const SQL_TITLE = 'Click to view query'; +const TABLE_TITLE = 'database.schema.table'; +const CREATED_BY = 'Jane Smith'; +const MODIFIED_BY = 'Jane Smith'; +const OWNERS = ['John Doe', 'Mary Wilson']; +const TAGS = ['management', 'research', 'poc']; +const A_WEEK_AGO = 'a week ago'; +const TWO_DAYS_AGO = '2 days ago'; + +const runWithBarCollapsed = async (func: Function) => { + const spy = jest.spyOn(resizeDetector, 'useResizeDetector'); + let width: number; + spy.mockImplementation(props => { + if (props?.onResize && !width) { + width = 80; + props.onResize(width); + } + return { ref: { current: undefined } }; + }); + await func(); + spy.mockRestore(); +}; + +const ITEMS: ContentType[] = [ + { + type: MetadataType.DASHBOARDS, + title: DASHBOARD_TITLE, + description: DASHBOARD_DESCRIPTION, + }, + { + type: MetadataType.DESCRIPTION, + value: DESCRIPTION_VALUE, + }, + { + type: MetadataType.LAST_MODIFIED, + value: TWO_DAYS_AGO, + modifiedBy: MODIFIED_BY, + }, + { + type: MetadataType.OWNER, + createdBy: CREATED_BY, + owners: OWNERS, + createdOn: A_WEEK_AGO, + }, + { + type: MetadataType.ROWS, + title: ROWS_TITLE, + }, + { + type: MetadataType.SQL, + title: SQL_TITLE, + }, + { + type: MetadataType.TABLE, + title: TABLE_TITLE, + }, + { + type: MetadataType.TAGS, + values: TAGS, + }, +]; + +test('renders an array of items', () => { + render(<MetadataBar items={ITEMS.slice(0, 2)} />); + expect(screen.getByText(DASHBOARD_TITLE)).toBeInTheDocument(); + expect(screen.getByText(DESCRIPTION_VALUE)).toBeInTheDocument(); +}); + +test('throws errors when out of min/max restrictions', () => { + const spy = jest.spyOn(console, 'error'); + spy.mockImplementation(() => {}); + expect(() => + render(<MetadataBar items={ITEMS.slice(0, MIN_NUMBER_ITEMS - 1)} />), + ).toThrow( + `The minimum number of items for the metadata bar is ${MIN_NUMBER_ITEMS}.`, + ); + expect(() => + render(<MetadataBar items={ITEMS.slice(0, MAX_NUMBER_ITEMS + 1)} />), + ).toThrow( + `The maximum number of items for the metadata bar is ${MAX_NUMBER_ITEMS}.`, + ); + spy.mockRestore(); +}); + +test('removes duplicated items when rendering', () => { + render(<MetadataBar items={[...ITEMS.slice(0, 2), ...ITEMS.slice(0, 2)]} />); + expect(screen.getAllByRole('img').length).toBe(2); +}); + +test('collapses the bar when min width is reached', async () => { + await runWithBarCollapsed(() => { + render(<MetadataBar items={ITEMS.slice(0, 2)} />); + expect(screen.queryByText(DASHBOARD_TITLE)).not.toBeInTheDocument(); + expect(screen.queryByText(DESCRIPTION_VALUE)).not.toBeInTheDocument(); + expect(screen.getAllByRole('img').length).toBe(2); + }); +}); + +test('always renders a tooltip when the bar is collapsed', async () => { + await runWithBarCollapsed(async () => { + render(<MetadataBar items={ITEMS.slice(0, 2)} />); + userEvent.hover(screen.getAllByRole('img')[0]); + expect(await screen.findByText(DASHBOARD_DESCRIPTION)).toBeInTheDocument(); + userEvent.hover(screen.getAllByRole('img')[1]); + expect(await screen.findByText(DESCRIPTION_VALUE)).toBeInTheDocument(); + }); +}); + +test('renders a tooltip when one is provided even if not collapsed', async () => { + render(<MetadataBar items={ITEMS.slice(0, 2)} />); + expect(screen.getByText(DASHBOARD_TITLE)).toBeInTheDocument(); + userEvent.hover(screen.getAllByRole('img')[0]); + expect(await screen.findByText(DASHBOARD_DESCRIPTION)).toBeInTheDocument(); +}); + +test('renders underlined text and emits event when clickable', () => { + const onClick = jest.fn(); + const items = [{ ...ITEMS[0], onClick }, ITEMS[1]]; + render(<MetadataBar items={items} />); + const element = screen.getByText(DASHBOARD_TITLE); + userEvent.click(element); + expect(onClick).toHaveBeenCalled(); + const style = window.getComputedStyle(element); + expect(style.textDecoration).toBe('underline'); +}); + +test('renders clicable items with blue icons when the bar is collapsed', async () => { + await runWithBarCollapsed(async () => { + const onClick = jest.fn(); + const items = [{ ...ITEMS[0], onClick }, ITEMS[1]]; + render(<MetadataBar items={items} />); + const images = screen.getAllByRole('img'); + const clickableColor = window.getComputedStyle(images[0]).color; + const nonClickableColor = window.getComputedStyle(images[1]).color; + expect(clickableColor).toBe(hexToRgb(supersetTheme.colors.primary.base)); + expect(nonClickableColor).toBe( + hexToRgb(supersetTheme.colors.grayscale.base), + ); + }); +}); + +test('renders the items sorted', () => { + const { container } = render(<MetadataBar items={ITEMS.slice(0, 6)} />); + const nodes = container.firstChild?.childNodes as NodeListOf<HTMLElement>; + expect(within(nodes[0]).getByText(DASHBOARD_TITLE)).toBeInTheDocument(); + expect(within(nodes[1]).getByText(SQL_TITLE)).toBeInTheDocument(); + expect(within(nodes[2]).getByText(ROWS_TITLE)).toBeInTheDocument(); + expect(within(nodes[3]).getByText(DESCRIPTION_VALUE)).toBeInTheDocument(); + expect(within(nodes[4]).getByText(CREATED_BY)).toBeInTheDocument(); +}); + +test('correctly renders the dashboards tooltip', async () => { + render(<MetadataBar items={ITEMS.slice(0, 2)} />); + userEvent.hover(screen.getByText(DASHBOARD_TITLE)); + const tooltip = await screen.findByRole('tooltip'); + expect(tooltip).toBeInTheDocument(); + expect(within(tooltip).getByText(DASHBOARD_TITLE)).toBeInTheDocument(); + expect(within(tooltip).getByText(DASHBOARD_DESCRIPTION)).toBeInTheDocument(); +}); + +test('correctly renders the description tooltip', async () => { + await runWithBarCollapsed(async () => { + render(<MetadataBar items={ITEMS.slice(0, 2)} />); + userEvent.hover(screen.getAllByRole('img')[1]); + const tooltip = await screen.findByRole('tooltip'); + expect(tooltip).toBeInTheDocument(); + expect(within(tooltip).getByText(DESCRIPTION_VALUE)).toBeInTheDocument(); + }); +}); + +test('correctly renders the last modified tooltip', async () => { + render(<MetadataBar items={ITEMS.slice(0, 3)} />); + userEvent.hover(screen.getByText(TWO_DAYS_AGO)); + const tooltip = await screen.findByRole('tooltip'); + expect(tooltip).toBeInTheDocument(); + expect(within(tooltip).getByText(TWO_DAYS_AGO)).toBeInTheDocument(); + expect(within(tooltip).getByText(MODIFIED_BY)).toBeInTheDocument(); +}); + +test('correctly renders the owner tooltip', async () => { + render(<MetadataBar items={ITEMS.slice(0, 4)} />); + userEvent.hover(screen.getByText(CREATED_BY)); + const tooltip = await screen.findByRole('tooltip'); + expect(tooltip).toBeInTheDocument(); + expect(within(tooltip).getByText(CREATED_BY)).toBeInTheDocument(); + expect(within(tooltip).getByText(A_WEEK_AGO)).toBeInTheDocument(); + OWNERS.forEach(owner => + expect(within(tooltip).getByText(owner)).toBeInTheDocument(), + ); +}); + +test('correctly renders the rows tooltip', async () => { + await runWithBarCollapsed(async () => { + render(<MetadataBar items={ITEMS.slice(4, 8)} />); + userEvent.hover(screen.getAllByRole('img')[2]); + const tooltip = await screen.findByRole('tooltip'); + expect(tooltip).toBeInTheDocument(); + expect(within(tooltip).getByText(ROWS_TITLE)).toBeInTheDocument(); + }); +}); + +test('correctly renders the sql tooltip', async () => { + await runWithBarCollapsed(async () => { + render(<MetadataBar items={ITEMS.slice(4, 8)} />); + userEvent.hover(screen.getAllByRole('img')[1]); + const tooltip = await screen.findByRole('tooltip'); + expect(tooltip).toBeInTheDocument(); + expect(within(tooltip).getByText(SQL_TITLE)).toBeInTheDocument(); + }); +}); + +test('correctly renders the table tooltip', async () => { + await runWithBarCollapsed(async () => { + render(<MetadataBar items={ITEMS.slice(4, 8)} />); + userEvent.hover(screen.getAllByRole('img')[0]); + const tooltip = await screen.findByRole('tooltip'); + expect(tooltip).toBeInTheDocument(); + expect(within(tooltip).getByText(TABLE_TITLE)).toBeInTheDocument(); + }); +}); + +test('correctly renders the tags tooltip', async () => { + await runWithBarCollapsed(async () => { + render(<MetadataBar items={ITEMS.slice(4, 8)} />); + userEvent.hover(screen.getAllByRole('img')[3]); + const tooltip = await screen.findByRole('tooltip'); + expect(tooltip).toBeInTheDocument(); + TAGS.forEach(tag => + expect(within(tooltip).getByText(tag)).toBeInTheDocument(), + ); + }); +}); diff --git a/superset-frontend/src/components/MetadataBar/MetadataBar.tsx b/superset-frontend/src/components/MetadataBar/MetadataBar.tsx new file mode 100644 index 000000000000..b2809ae53c2c --- /dev/null +++ b/superset-frontend/src/components/MetadataBar/MetadataBar.tsx @@ -0,0 +1,237 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { useResizeDetector } from 'react-resize-detector'; +import { uniqWith } from 'lodash'; +import { styled } from '@superset-ui/core'; +import { Tooltip, TooltipPlacement } from 'src/components/Tooltip'; +import { ContentType } from './ContentType'; +import { config } from './ContentConfig'; + +export const MIN_NUMBER_ITEMS = 2; +export const MAX_NUMBER_ITEMS = 6; + +const HORIZONTAL_PADDING = 12; +const VERTICAL_PADDING = 8; +const ICON_PADDING = 8; +const SPACE_BETWEEN_ITEMS = 16; +const ICON_WIDTH = 16; +const TEXT_MIN_WIDTH = 70; +const TEXT_MAX_WIDTH = 150; +const ORDER = { + dashboards: 0, + table: 1, + sql: 2, + rows: 3, + tags: 4, + description: 5, + owner: 6, + lastModified: 7, +}; + +const Bar = styled.div<{ count: number }>` + ${({ theme, count }) => ` + display: flex; + align-items: center; + padding: ${VERTICAL_PADDING}px ${HORIZONTAL_PADDING}px; + background-color: ${theme.colors.grayscale.light4}; + color: ${theme.colors.grayscale.base}; + font-size: ${theme.typography.sizes.s}px; + min-width: ${ + HORIZONTAL_PADDING * 2 + + (ICON_WIDTH + SPACE_BETWEEN_ITEMS) * count - + SPACE_BETWEEN_ITEMS + }px; + border-radius: ${theme.borderRadius}px; + line-height: 1; + `} +`; + +const StyledItem = styled.div<{ + collapsed: boolean; + last: boolean; + onClick?: () => void; +}>` + ${({ theme, collapsed, last, onClick }) => ` + display: flex; + align-items: center; + max-width: ${ + ICON_WIDTH + + ICON_PADDING + + TEXT_MAX_WIDTH + + (last ? 0 : SPACE_BETWEEN_ITEMS) + }px; + min-width: ${ + collapsed + ? ICON_WIDTH + (last ? 0 : SPACE_BETWEEN_ITEMS) + : ICON_WIDTH + + ICON_PADDING + + TEXT_MIN_WIDTH + + (last ? 0 : SPACE_BETWEEN_ITEMS) + }px; + padding-right: ${last ? 0 : SPACE_BETWEEN_ITEMS}px; + cursor: ${onClick ? 'pointer' : 'default'}; + & .metadata-icon { + color: ${ + onClick && collapsed + ? theme.colors.primary.base + : theme.colors.grayscale.base + }; + padding-right: ${collapsed ? 0 : ICON_PADDING}px; + & .anticon { + line-height: 0; + } + } + & .metadata-text { + min-width: ${TEXT_MIN_WIDTH}px; + overflow: hidden; + text-overflow: ${collapsed ? 'unset' : 'ellipsis'}; + white-space: nowrap; + text-decoration: ${onClick ? 'underline' : 'none'}; + } + `} +`; + +// Make sure big tootips are truncated +const TootipContent = styled.div` + display: -webkit-box; + -webkit-line-clamp: 20; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +`; + +const Item = ({ + barWidth, + contentType, + collapsed, + last = false, + tooltipPlacement, +}: { + barWidth: number | undefined; + contentType: ContentType; + collapsed: boolean; + last?: boolean; + tooltipPlacement: TooltipPlacement; +}) => { + const { icon, title, tooltip = title } = config(contentType); + const [isTruncated, setIsTruncated] = useState(false); + const ref = useRef<HTMLDivElement>(null); + const Icon = icon; + const { type, onClick } = contentType; + + useEffect(() => { + setIsTruncated( + ref.current ? ref.current.scrollWidth > ref.current.clientWidth : false, + ); + }, [barWidth, setIsTruncated, contentType]); + + const content = ( + <StyledItem + collapsed={collapsed} + last={last} + onClick={onClick ? () => onClick(type) : undefined} + > + <Icon iconSize="l" className="metadata-icon" /> + {!collapsed && ( + <span ref={ref} className="metadata-text"> + {title} + </span> + )} + </StyledItem> + ); + return isTruncated || collapsed || (tooltip && tooltip !== title) ? ( + <Tooltip + placement={tooltipPlacement} + title={<TootipContent>{tooltip}</TootipContent>} + > + {content} + </Tooltip> + ) : ( + content + ); +}; + +export interface MetadataBarProps { + /** + * Array of content type configurations. To see the available properties + * for each content type, check {@link ContentType} + */ + items: ContentType[]; + /** + * Antd tooltip placement. To see available values, check {@link TooltipPlacement}. + * Defaults to "top". + */ + tooltipPlacement?: TooltipPlacement; +} + +/** + * The metadata bar component is used to display additional information about an entity. + * Content types are predefined and consistent across the whole app. This means that + * they will be displayed and behave in a consistent manner, keeping the same ordering, + * information formatting, and interactions. + * To extend the list of content types, a developer needs to request the inclusion of the new type in the design system. + * This process is important to make sure the new type is reviewed by the design team, improving Superset consistency. + */ +const MetadataBar = ({ items, tooltipPlacement = 'top' }: MetadataBarProps) => { + const [width, setWidth] = useState<number>(); + const [collapsed, setCollapsed] = useState(false); + const uniqueItems = uniqWith(items, (a, b) => a.type === b.type); + const sortedItems = uniqueItems.sort((a, b) => ORDER[a.type] - ORDER[b.type]); + const count = sortedItems.length; + if (count < MIN_NUMBER_ITEMS) { + throw Error('The minimum number of items for the metadata bar is 2.'); + } + if (count > MAX_NUMBER_ITEMS) { + throw Error('The maximum number of items for the metadata bar is 6.'); + } + + const onResize = useCallback( + width => { + // Calculates the breakpoint width to collapse the bar. + // The last item does not have a space, so we subtract SPACE_BETWEEN_ITEMS from the total. + const breakpoint = + (ICON_WIDTH + ICON_PADDING + TEXT_MIN_WIDTH + SPACE_BETWEEN_ITEMS) * + count - + SPACE_BETWEEN_ITEMS; + setWidth(width); + setCollapsed(Boolean(width && width < breakpoint)); + }, + [count], + ); + + const { ref } = useResizeDetector({ onResize }); + + return ( + <Bar ref={ref} count={count} data-test="metadata-bar"> + {sortedItems.map((item, index) => ( + <Item + barWidth={width} + key={index} + contentType={item} + collapsed={collapsed} + last={index === count - 1} + tooltipPlacement={tooltipPlacement} + /> + ))} + </Bar> + ); +}; + +export default MetadataBar; diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/shared-controls/emitFilterControl.test.tsx b/superset-frontend/src/components/MetadataBar/index.tsx similarity index 77% rename from superset-frontend/packages/superset-ui-chart-controls/test/shared-controls/emitFilterControl.test.tsx rename to superset-frontend/src/components/MetadataBar/index.tsx index 6070ccccfdee..e4398a3063b2 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/shared-controls/emitFilterControl.test.tsx +++ b/superset-frontend/src/components/MetadataBar/index.tsx @@ -16,11 +16,14 @@ * specific language governing permissions and limitations * under the License. */ +import MetadataBar, { + MetadataBarProps, + MIN_NUMBER_ITEMS, + MAX_NUMBER_ITEMS, +} from './MetadataBar'; -import { emitFilterControl } from '@superset-ui/chart-controls'; +export default MetadataBar; -describe('isFeatureFlagEnabled', () => { - it('returns empty array for unset feature flag', () => { - expect(emitFilterControl).toHaveLength(0); - }); -}); +export { MetadataBarProps, MIN_NUMBER_ITEMS, MAX_NUMBER_ITEMS }; + +export * from './ContentType'; diff --git a/superset-frontend/src/components/Modal/Modal.stories.tsx b/superset-frontend/src/components/Modal/Modal.stories.tsx index b3557c5a8b99..67b8837b0d27 100644 --- a/superset-frontend/src/components/Modal/Modal.stories.tsx +++ b/superset-frontend/src/components/Modal/Modal.stories.tsx @@ -16,8 +16,10 @@ * specific language governing permissions and limitations * under the License. */ +import { ModalFuncProps } from 'antd/lib/modal'; import React from 'react'; import Modal, { ModalProps } from '.'; +import Button from '../Button'; export default { title: 'Modal', @@ -50,3 +52,16 @@ InteractiveModal.story = { }, }, }; + +export const ModalFunctions = (props: ModalFuncProps) => ( + <div> + <Button onClick={() => Modal.error(props)}>Error</Button> + <Button onClick={() => Modal.warning(props)}>Warning</Button> + <Button onClick={() => Modal.confirm(props)}>Confirm</Button> + </div> +); + +ModalFunctions.args = { + title: 'Modal title', + content: 'Modal content', +}; diff --git a/superset-frontend/src/components/Modal/Modal.tsx b/superset-frontend/src/components/Modal/Modal.tsx index 3bd21fef8075..d1e1affcfbe9 100644 --- a/superset-frontend/src/components/Modal/Modal.tsx +++ b/superset-frontend/src/components/Modal/Modal.tsx @@ -16,8 +16,9 @@ * specific language governing permissions and limitations * under the License. */ -import React, { useRef, useState } from 'react'; +import React, { useMemo, useRef, useState } from 'react'; import { isNil } from 'lodash'; +import { ModalFuncProps } from 'antd/lib/modal'; import { styled, t } from '@superset-ui/core'; import { css } from '@emotion/react'; import { AntdModal, AntdModalProps } from 'src/components'; @@ -57,6 +58,7 @@ export interface ModalProps { draggableConfig?: DraggableProps; destroyOnClose?: boolean; maskClosable?: boolean; + zIndex?: number; } interface StyledModalProps { @@ -201,6 +203,24 @@ export const StyledModal = styled(BaseModal)<StyledModalProps>` } `} `; +const defaultResizableConfig = (hideFooter: boolean | undefined) => ({ + maxHeight: RESIZABLE_MAX_HEIGHT, + maxWidth: RESIZABLE_MAX_WIDTH, + minHeight: hideFooter + ? RESIZABLE_MIN_HEIGHT + : RESIZABLE_MIN_HEIGHT + MODAL_FOOTER_HEIGHT, + minWidth: RESIZABLE_MIN_WIDTH, + enable: { + bottom: true, + bottomLeft: false, + bottomRight: true, + left: false, + top: false, + topLeft: false, + topRight: false, + right: true, + }, +}); const CustomModal = ({ children, @@ -222,24 +242,7 @@ const CustomModal = ({ wrapProps, draggable = false, resizable = false, - resizableConfig = { - maxHeight: RESIZABLE_MAX_HEIGHT, - maxWidth: RESIZABLE_MAX_WIDTH, - minHeight: hideFooter - ? RESIZABLE_MIN_HEIGHT - : RESIZABLE_MIN_HEIGHT + MODAL_FOOTER_HEIGHT, - minWidth: RESIZABLE_MIN_WIDTH, - enable: { - bottom: true, - bottomLeft: false, - bottomRight: true, - left: false, - top: false, - topLeft: false, - topRight: false, - right: true, - }, - }, + resizableConfig = defaultResizableConfig(hideFooter), draggableConfig, destroyOnClose, ...rest @@ -247,7 +250,13 @@ const CustomModal = ({ const draggableRef = useRef<HTMLDivElement>(null); const [bounds, setBounds] = useState<DraggableBounds>(); const [dragDisabled, setDragDisabled] = useState<boolean>(true); - const modalFooter = isNil(footer) + let FooterComponent; + if (React.isValidElement(footer)) { + // If a footer component is provided inject a closeModal function + // so the footer can provide a "close" button if desired + FooterComponent = React.cloneElement(footer, { closeModal: onHide }); + } + const modalFooter = isNil(FooterComponent) ? [ <Button key="back" onClick={onHide} cta data-test="modal-cancel-button"> {t('Cancel')} @@ -264,7 +273,7 @@ const CustomModal = ({ {primaryButtonName} </Button>, ] - : footer; + : FooterComponent; const modalWidth = width || (responsive ? '100vw' : '600px'); const shouldShowMask = !(resizable || draggable); @@ -283,6 +292,13 @@ const CustomModal = ({ } }; + const getResizableConfig = useMemo(() => { + if (Object.keys(resizableConfig).length === 0) { + return defaultResizableConfig(hideFooter); + } + return resizableConfig; + }, [hideFooter, resizableConfig]); + const ModalTitle = () => draggable ? ( <div @@ -323,7 +339,7 @@ const CustomModal = ({ {...draggableConfig} > {resizable ? ( - <Resizable className="resizable" {...resizableConfig}> + <Resizable className="resizable" {...getResizableConfig}> <div className="resizable-wrapper" ref={draggableRef}> {modal} </div> @@ -348,13 +364,26 @@ const CustomModal = ({ }; CustomModal.displayName = 'Modal'; +// Ant Design 4 does not allow overriding Modal's buttons when +// using one of the pre-defined functions. Ant Design 5 Modal introduced +// the footer property that will allow that. Meanwhile, we're replicating +// Button style using global CSS in src/GlobalStyles.tsx. +// TODO: Replace this logic when on Ant Design 5. +const buttonProps = { + okButtonProps: { className: 'modal-functions-ok-button' }, + cancelButtonProps: { className: 'modal-functions-cancel-button' }, +}; + // TODO: in another PR, rename this to CompatabilityModal // and demote it as the default export. // We should start using AntD component interfaces going forward. const Modal = Object.assign(CustomModal, { - error: AntdModal.error, - warning: AntdModal.warning, - confirm: AntdModal.confirm, + error: (config: ModalFuncProps) => + AntdModal.error({ ...config, ...buttonProps }), + warning: (config: ModalFuncProps) => + AntdModal.warning({ ...config, ...buttonProps }), + confirm: (config: ModalFuncProps) => + AntdModal.confirm({ ...config, ...buttonProps }), useModal: AntdModal.useModal, }); diff --git a/superset-frontend/src/components/ModalTrigger/ModalTrigger.stories.tsx b/superset-frontend/src/components/ModalTrigger/ModalTrigger.stories.tsx index 9c0817c2dbc6..7ab85dd1c49e 100644 --- a/superset-frontend/src/components/ModalTrigger/ModalTrigger.stories.tsx +++ b/superset-frontend/src/components/ModalTrigger/ModalTrigger.stories.tsx @@ -20,11 +20,11 @@ import React from 'react'; import ModalTrigger from '.'; interface IModalTriggerProps { - triggerNode: React.ReactNode; + triggerNode: JSX.Element; dialogClassName?: string; - modalTitle?: React.ReactNode; - modalBody?: React.ReactNode; - modalFooter?: React.ReactNode; + modalTitle?: string; + modalBody?: JSX.Element; + modalFooter?: JSX.Element; beforeOpen?: () => void; onExit?: () => void; isButton?: boolean; diff --git a/superset-frontend/src/components/ModalTrigger/index.jsx b/superset-frontend/src/components/ModalTrigger/index.jsx deleted file mode 100644 index b15000d851fb..000000000000 --- a/superset-frontend/src/components/ModalTrigger/index.jsx +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import PropTypes from 'prop-types'; -import Modal from 'src/components/Modal'; -import Button from 'src/components/Button'; - -const propTypes = { - dialogClassName: PropTypes.string, - triggerNode: PropTypes.node.isRequired, - modalTitle: PropTypes.node, - modalBody: PropTypes.node, // not required because it can be generated by beforeOpen - modalFooter: PropTypes.node, - beforeOpen: PropTypes.func, - onExit: PropTypes.func, - isButton: PropTypes.bool, - className: PropTypes.string, - tooltip: PropTypes.string, - width: PropTypes.string, - maxWidth: PropTypes.string, - responsive: PropTypes.bool, - resizable: PropTypes.bool, - resizableConfig: PropTypes.object, - draggable: PropTypes.bool, - draggableConfig: PropTypes.object, - destroyOnClose: PropTypes.bool, -}; - -const defaultProps = { - beforeOpen: () => {}, - onExit: () => {}, - isButton: false, - className: '', - modalTitle: '', - resizable: false, - draggable: false, -}; - -export default class ModalTrigger extends React.Component { - constructor(props) { - super(props); - this.state = { - showModal: false, - }; - this.open = this.open.bind(this); - this.close = this.close.bind(this); - } - - close() { - this.setState(() => ({ showModal: false })); - } - - open(e) { - e.preventDefault(); - this.props.beforeOpen(); - this.setState(() => ({ showModal: true })); - } - - renderModal() { - return ( - <Modal - wrapClassName={this.props.dialogClassName} - className={this.props.className} - show={this.state.showModal} - onHide={this.close} - afterClose={this.props.onExit} - title={this.props.modalTitle} - footer={this.props.modalFooter} - hideFooter={!this.props.modalFooter} - width={this.props.width} - maxWidth={this.props.maxWidth} - responsive={this.props.responsive} - resizable={this.props.resizable} - resizableConfig={this.props.resizableConfig} - draggable={this.props.draggable} - draggableConfig={this.props.draggableConfig} - destroyOnClose={this.props.destroyOnClose} - > - {this.props.modalBody} - </Modal> - ); - } - - render() { - if (this.props.isButton) { - return ( - <> - <Button - className="modal-trigger" - data-test="btn-modal-trigger" - tooltip={this.props.tooltip} - onClick={this.open} - > - {this.props.triggerNode} - </Button> - {this.renderModal()} - </> - ); - } - /* eslint-disable jsx-a11y/interactive-supports-focus */ - return ( - <> - <span data-test="span-modal-trigger" onClick={this.open} role="button"> - {this.props.triggerNode} - </span> - {this.renderModal()} - </> - ); - } -} - -ModalTrigger.propTypes = propTypes; -ModalTrigger.defaultProps = defaultProps; diff --git a/superset-frontend/src/components/ModalTrigger/index.tsx b/superset-frontend/src/components/ModalTrigger/index.tsx new file mode 100644 index 000000000000..8b689d640b7c --- /dev/null +++ b/superset-frontend/src/components/ModalTrigger/index.tsx @@ -0,0 +1,130 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useState } from 'react'; +import Modal from 'src/components/Modal'; +import Button from 'src/components/Button'; + +interface ModalTriggerProps { + dialogClassName?: string; + triggerNode: React.ReactNode; + modalTitle?: string; + modalBody?: React.ReactNode; // not required because it can be generated by beforeOpen + modalFooter?: React.ReactNode; + beforeOpen?: Function; + onExit?: Function; + isButton?: boolean; + className?: string; + tooltip?: string; + width?: string; + maxWidth?: string; + responsive?: boolean; + resizable?: boolean; + resizableConfig?: any; + draggable?: boolean; + draggableConfig?: any; + destroyOnClose?: boolean; +} + +export interface ModalTriggerRef { + current: { + close: Function; + open: Function; + }; +} + +const ModalTrigger = React.forwardRef( + (props: ModalTriggerProps, ref: ModalTriggerRef | null) => { + const [showModal, setShowModal] = useState(false); + const { + beforeOpen = () => {}, + onExit = () => {}, + isButton = false, + resizable = false, + draggable = false, + className = '', + tooltip, + modalFooter, + triggerNode, + destroyOnClose = true, + modalBody, + draggableConfig = {}, + resizableConfig = {}, + modalTitle, + responsive, + width, + maxWidth, + } = props; + + const close = () => { + setShowModal(false); + onExit?.(); + }; + + const open = (e: React.MouseEvent) => { + e.preventDefault(); + beforeOpen?.(); + setShowModal(true); + }; + + if (ref) { + ref.current = { close, open }; // eslint-disable-line + } + + /* eslint-disable jsx-a11y/interactive-supports-focus */ + return ( + <> + {isButton && ( + <Button + className="modal-trigger" + data-test="btn-modal-trigger" + tooltip={tooltip} + onClick={open} + > + {triggerNode} + </Button> + )} + {!isButton && ( + <span data-test="span-modal-trigger" onClick={open} role="button"> + {triggerNode} + </span> + )} + <Modal + className={className} + show={showModal} + onHide={close} + title={modalTitle} + footer={modalFooter} + hideFooter={!modalFooter} + width={width} + maxWidth={maxWidth} + responsive={responsive} + resizable={resizable} + resizableConfig={resizableConfig} + draggable={draggable} + draggableConfig={draggableConfig} + destroyOnClose={destroyOnClose} + > + {modalBody} + </Modal> + </> + ); + }, +); + +export default ModalTrigger; diff --git a/superset-frontend/src/components/PageHeaderWithActions/index.tsx b/superset-frontend/src/components/PageHeaderWithActions/index.tsx index 4449d1c6b347..9209ab818d44 100644 --- a/superset-frontend/src/components/PageHeaderWithActions/index.tsx +++ b/superset-frontend/src/components/PageHeaderWithActions/index.tsx @@ -19,6 +19,7 @@ import React, { ReactNode, ReactElement } from 'react'; import { css, SupersetTheme, t, useTheme } from '@superset-ui/core'; import { AntdDropdown, AntdDropdownProps } from 'src/components'; +import { TooltipPlacement } from 'src/components/Tooltip'; import { DynamicEditableTitle, DynamicEditableTitleProps, @@ -92,7 +93,7 @@ const buttonsStyles = (theme: SupersetTheme) => css` & .fave-unfave-icon { padding: 0 ${theme.gridUnit}px; - &:first-child { + &:first-of-type { padding-left: 0; } } @@ -112,6 +113,10 @@ export type PageHeaderWithActionsProps = { rightPanelAdditionalItems: ReactNode; additionalActionsMenu: ReactElement; menuDropdownProps: Omit<AntdDropdownProps, 'overlay'>; + tooltipProps?: { + text?: string; + placement?: TooltipPlacement; + }; }; export const PageHeaderWithActions = ({ @@ -124,6 +129,7 @@ export const PageHeaderWithActions = ({ rightPanelAdditionalItems, additionalActionsMenu, menuDropdownProps, + tooltipProps, }: PageHeaderWithActionsProps) => { const theme = useTheme(); return ( @@ -152,6 +158,9 @@ export const PageHeaderWithActions = ({ css={menuTriggerStyles} buttonStyle="tertiary" aria-label={t('Menu actions trigger')} + tooltip={tooltipProps?.text} + placement={tooltipProps?.placement} + data-test="actions-trigger" > <Icons.MoreHoriz iconColor={theme.colors.primary.dark2} diff --git a/superset-frontend/src/components/PopoverDropdown/PopoverDropdown.test.tsx b/superset-frontend/src/components/PopoverDropdown/PopoverDropdown.test.tsx index 2704e11e0cd4..2c02eec91ab2 100644 --- a/superset-frontend/src/components/PopoverDropdown/PopoverDropdown.test.tsx +++ b/superset-frontend/src/components/PopoverDropdown/PopoverDropdown.test.tsx @@ -36,19 +36,19 @@ const defaultProps: PopoverDropdownProps = { onChange: jest.fn(), }; -test('renders with default props', () => { +test('renders with default props', async () => { render(<PopoverDropdown {...defaultProps} />); - expect(screen.getByRole('button')).toBeInTheDocument(); + expect(await screen.findByRole('button')).toBeInTheDocument(); expect(screen.getByRole('button')).toHaveTextContent('Option 1'); }); -test('renders the menu on click', () => { +test('renders the menu on click', async () => { render(<PopoverDropdown {...defaultProps} />); userEvent.click(screen.getByRole('button')); - expect(screen.getByRole('menu')).toBeInTheDocument(); + expect(await screen.findByRole('menu')).toBeInTheDocument(); }); -test('renders with custom button', () => { +test('renders with custom button', async () => { render( <PopoverDropdown {...defaultProps} @@ -59,10 +59,10 @@ test('renders with custom button', () => { )} />, ); - expect(screen.getByText('Custom Option 1')).toBeInTheDocument(); + expect(await screen.findByText('Custom Option 1')).toBeInTheDocument(); }); -test('renders with custom option', () => { +test('renders with custom option', async () => { render( <PopoverDropdown {...defaultProps} @@ -74,13 +74,13 @@ test('renders with custom option', () => { />, ); userEvent.click(screen.getByRole('button')); - expect(screen.getByText('Custom Option 1')).toBeInTheDocument(); + expect(await screen.findByText('Custom Option 1')).toBeInTheDocument(); }); -test('triggers onChange', () => { +test('triggers onChange', async () => { render(<PopoverDropdown {...defaultProps} />); userEvent.click(screen.getByRole('button')); - expect(screen.getByText('Option 2')).toBeInTheDocument(); + expect(await screen.findByText('Option 2')).toBeInTheDocument(); userEvent.click(screen.getByText('Option 2')); expect(defaultProps.onChange).toHaveBeenCalled(); }); diff --git a/superset-frontend/src/components/PopoverSection/PopoverSection.test.tsx b/superset-frontend/src/components/PopoverSection/PopoverSection.test.tsx index 2135f6ba46ef..16952834c16c 100644 --- a/superset-frontend/src/components/PopoverSection/PopoverSection.test.tsx +++ b/superset-frontend/src/components/PopoverSection/PopoverSection.test.tsx @@ -21,23 +21,23 @@ import { render, screen } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; import PopoverSection from 'src/components/PopoverSection'; -test('renders with default props', () => { +test('renders with default props', async () => { render( <PopoverSection title="Title"> <div role="form" /> </PopoverSection>, ); - expect(screen.getByRole('form')).toBeInTheDocument(); - expect(screen.getAllByRole('img').length).toBe(1); + expect(await screen.findByRole('form')).toBeInTheDocument(); + expect((await screen.findAllByRole('img')).length).toBe(1); }); -test('renders tooltip icon', () => { +test('renders tooltip icon', async () => { render( <PopoverSection title="Title" info="Tooltip"> <div role="form" /> </PopoverSection>, ); - expect(screen.getAllByRole('img').length).toBe(2); + expect((await screen.findAllByRole('img')).length).toBe(2); }); test('renders a tooltip when hovered', async () => { @@ -50,13 +50,13 @@ test('renders a tooltip when hovered', async () => { expect(await screen.findByRole('tooltip')).toBeInTheDocument(); }); -test('calls onSelect when clicked', () => { +test('calls onSelect when clicked', async () => { const onSelect = jest.fn(); render( <PopoverSection title="Title" onSelect={onSelect}> <div role="form" /> </PopoverSection>, ); - userEvent.click(screen.getByRole('img')); + userEvent.click(await screen.findByRole('img')); expect(onSelect).toHaveBeenCalled(); }); diff --git a/superset-frontend/src/components/ProgressBar/index.tsx b/superset-frontend/src/components/ProgressBar/index.tsx index 93b4315e523d..ba69fc90c6ca 100644 --- a/superset-frontend/src/components/ProgressBar/index.tsx +++ b/superset-frontend/src/components/ProgressBar/index.tsx @@ -27,7 +27,7 @@ export interface ProgressBarProps extends ProgressProps { // eslint-disable-next-line @typescript-eslint/no-unused-vars const ProgressBar = styled(({ striped, ...props }: ProgressBarProps) => ( - <AntdProgress {...props} /> + <AntdProgress data-test="progress-bar" {...props} /> ))` line-height: 0; position: static; diff --git a/superset-frontend/src/components/Radio/index.tsx b/superset-frontend/src/components/Radio/index.tsx index 9ab656e4aa80..f06392d27879 100644 --- a/superset-frontend/src/components/Radio/index.tsx +++ b/superset-frontend/src/components/Radio/index.tsx @@ -57,4 +57,5 @@ const StyledGroup = styled(AntdRadio.Group)` export const Radio = Object.assign(StyledRadio, { Group: StyledGroup, + Button: AntdRadio.Button, }); diff --git a/superset-frontend/src/components/RefreshLabel/RefreshLabel.test.tsx b/superset-frontend/src/components/RefreshLabel/RefreshLabel.test.tsx index 55750fba828e..a8d5d7e3c2e1 100644 --- a/superset-frontend/src/components/RefreshLabel/RefreshLabel.test.tsx +++ b/superset-frontend/src/components/RefreshLabel/RefreshLabel.test.tsx @@ -21,9 +21,9 @@ import { render, screen } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; import RefreshLabel from 'src/components/RefreshLabel'; -test('renders with default props', () => { +test('renders with default props', async () => { render(<RefreshLabel tooltipContent="Tooltip" onClick={jest.fn()} />); - const refresh = screen.getByRole('button'); + const refresh = await screen.findByRole('button'); expect(refresh).toBeInTheDocument(); userEvent.hover(refresh); }); @@ -38,10 +38,10 @@ test('renders tooltip on hover', async () => { expect(tooltip).toHaveTextContent(tooltipText); }); -test('triggers on click event', () => { +test('triggers on click event', async () => { const onClick = jest.fn(); render(<RefreshLabel tooltipContent="Tooltip" onClick={onClick} />); - const refresh = screen.getByRole('button'); + const refresh = await screen.findByRole('button'); userEvent.click(refresh); expect(onClick).toHaveBeenCalled(); }); diff --git a/superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.test.tsx b/superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.test.tsx index a527fd67ccfd..ea1d823d2498 100644 --- a/superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.test.tsx +++ b/superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.test.tsx @@ -33,72 +33,64 @@ const createProps = () => ({ }); const stateWithOnlyUser = { - explore: { - user: { - email: 'admin@test.com', - firstName: 'admin', - isActive: true, - lastName: 'admin', - permissions: {}, - createdOn: '2022-01-12T10:17:37.801361', - roles: { Admin: [['menu_access', 'Manage']] }, - userId: 1, - username: 'admin', - }, + user: { + email: 'admin@test.com', + firstName: 'admin', + isActive: true, + lastName: 'admin', + permissions: {}, + createdOn: '2022-01-12T10:17:37.801361', + roles: { Admin: [['menu_access', 'Manage']] }, + userId: 1, + username: 'admin', }, reports: {}, }; const stateWithNonAdminUser = { - explore: { - user: { - email: 'nonadmin@test.com', - firstName: 'nonadmin', - isActive: true, - lastName: 'nonadmin', - permissions: {}, - createdOn: '2022-01-12T10:17:37.801361', - roles: { - Gamme: [['no_menu_access', 'Manage']], - OtherRole: [['menu_access', 'Manage']], - }, - userId: 1, - username: 'nonadmin', + user: { + email: 'nonadmin@test.com', + firstName: 'nonadmin', + isActive: true, + lastName: 'nonadmin', + permissions: {}, + createdOn: '2022-01-12T10:17:37.801361', + roles: { + Gamme: [['no_menu_access', 'Manage']], + OtherRole: [['menu_access', 'Manage']], }, + userId: 1, + username: 'nonadmin', }, reports: {}, }; const stateWithNonMenuAccessOnManage = { - explore: { - user: { - email: 'nonaccess@test.com', - firstName: 'nonaccess', - isActive: true, - lastName: 'nonaccess', - permissions: {}, - createdOn: '2022-01-12T10:17:37.801361', - roles: { Gamma: [['no_menu_access', 'Manage']] }, - userId: 1, - username: 'nonaccess', - }, + user: { + email: 'nonaccess@test.com', + firstName: 'nonaccess', + isActive: true, + lastName: 'nonaccess', + permissions: {}, + createdOn: '2022-01-12T10:17:37.801361', + roles: { Gamma: [['no_menu_access', 'Manage']] }, + userId: 1, + username: 'nonaccess', }, reports: {}, }; const stateWithUserAndReport = { - explore: { - user: { - email: 'admin@test.com', - firstName: 'admin', - isActive: true, - lastName: 'admin', - permissions: {}, - createdOn: '2022-01-12T10:17:37.801361', - roles: { Admin: [['menu_access', 'Manage']] }, - userId: 1, - username: 'admin', - }, + user: { + email: 'admin@test.com', + firstName: 'admin', + isActive: true, + lastName: 'admin', + permissions: {}, + createdOn: '2022-01-12T10:17:37.801361', + roles: { Admin: [['menu_access', 'Manage']] }, + userId: 1, + username: 'admin', }, reports: { dashboards: { diff --git a/superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx b/superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx index a83ab239ff17..504ba41d09a3 100644 --- a/superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx +++ b/superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx @@ -23,9 +23,11 @@ import { t, SupersetTheme, css, + styled, useTheme, FeatureFlag, isFeatureEnabled, + getExtensionsRegistry, } from '@superset-ui/core'; import Icons from 'src/components/Icons'; import { Switch } from 'src/components/Switch'; @@ -46,6 +48,8 @@ import { import { reportSelector } from 'src/views/CRUD/hooks'; import { MenuItemWithCheckboxContainer } from 'src/explore/components/useExploreAdditionalActionsMenu/index'; +const extensionsRegistry = getExtensionsRegistry(); + const deleteColor = (theme: SupersetTheme) => css` color: ${theme.colors.error.base}; `; @@ -70,6 +74,21 @@ const onMenuItemHover = (theme: SupersetTheme) => css` background-color: ${theme.colors.secondary.light5}; } `; + +const StyledDropdownItemWithIcon = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + > *:first-child { + margin-right: ${({ theme }) => theme.gridUnit}px; + } +`; + +const DropdownItemExtension = extensionsRegistry.get( + 'report-modal.dropdown.item.icon', +); + export enum CreationMethod { CHARTS = 'charts', DASHBOARDS = 'dashboards', @@ -103,7 +122,7 @@ export default function HeaderReportDropDown({ const user: UserWithPermissionsAndRoles = useSelector< any, UserWithPermissionsAndRoles - >(state => state.user || state.explore?.user); + >(state => state.user); const canAddReports = () => { if (!isFeatureEnabled(FeatureFlag.ALERT_REPORTS)) { return false; @@ -201,7 +220,14 @@ export default function HeaderReportDropDown({ ) : ( <Menu selectable={false} css={onMenuHover}> <Menu.Item onClick={handleShowMenu}> - {t('Set up an email report')} + {DropdownItemExtension ? ( + <StyledDropdownItemWithIcon> + <div>{t('Set up an email report')}</div> + <DropdownItemExtension /> + </StyledDropdownItemWithIcon> + ) : ( + t('Set up an email report') + )} </Menu.Item> <Menu.Divider /> </Menu> diff --git a/superset-frontend/src/components/ReportModal/ReportModal.test.tsx b/superset-frontend/src/components/ReportModal/ReportModal.test.tsx index 1db3aa0fd6c5..2755d832d79f 100644 --- a/superset-frontend/src/components/ReportModal/ReportModal.test.tsx +++ b/superset-frontend/src/components/ReportModal/ReportModal.test.tsx @@ -20,7 +20,7 @@ import * as React from 'react'; import userEvent from '@testing-library/user-event'; import sinon from 'sinon'; import fetchMock from 'fetch-mock'; -import { render, screen } from 'spec/helpers/testing-library'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; import * as featureFlags from 'src/featureFlags'; import * as actions from 'src/reports/actions/reports'; import { FeatureFlag } from '@superset-ui/core'; @@ -156,7 +156,7 @@ describe('Email Report Modal', () => { // Click "Add" button to create a new email report const addButton = screen.getByRole('button', { name: /add/i }); - userEvent.click(addButton); + await waitFor(() => userEvent.click(addButton)); // Mock addReport from Redux const makeRequest = () => { @@ -164,16 +164,15 @@ describe('Email Report Modal', () => { return request(dispatch); }; - return makeRequest().then(() => { - // 🐞 ----- There are 2 POST calls at this point ----- 🐞 + await makeRequest(); - // addReport's mocked POST return should match the mocked values - expect(fetchMock.lastOptions()?.body).toEqual(stringyReportValues); - // Dispatch should be called once for addReport - expect(dispatch.callCount).toBe(2); - const reportCalls = fetchMock.calls(REPORT_ENDPOINT); - expect(reportCalls).toHaveLength(2); - }); + // 🐞 ----- There are 2 POST calls at this point ----- 🐞 + + // addReport's mocked POST return should match the mocked values + expect(fetchMock.lastOptions()?.body).toEqual(stringyReportValues); + expect(dispatch.callCount).toBe(2); + const reportCalls = fetchMock.calls(REPORT_ENDPOINT); + expect(reportCalls).toHaveLength(2); }); }); }); diff --git a/superset-frontend/src/components/ReportModal/index.tsx b/superset-frontend/src/components/ReportModal/index.tsx index 632f9f91ec42..9f9596e2ffcf 100644 --- a/superset-frontend/src/components/ReportModal/index.tsx +++ b/superset-frontend/src/components/ReportModal/index.tsx @@ -273,7 +273,7 @@ function ReportModal({ onChange: ({ target }: { target: HTMLInputElement }) => setCurrentReport({ name: target.value }), }} - label="Report Name" + label={t('Report Name')} data-test="report-name-test" /> <LabeledErrorBoundInput diff --git a/superset-frontend/src/components/ResizableSidebar/index.tsx b/superset-frontend/src/components/ResizableSidebar/index.tsx new file mode 100644 index 000000000000..4abe56e526fd --- /dev/null +++ b/superset-frontend/src/components/ResizableSidebar/index.tsx @@ -0,0 +1,82 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { Resizable } from 're-resizable'; +import { styled } from '@superset-ui/core'; +import useStoredSidebarWidth from './useStoredSidebarWidth'; + +const ResizableWrapper = styled.div` + position: absolute; + height: 100%; + + :hover .sidebar-resizer::after { + background-color: ${({ theme }) => theme.colors.primary.base}; + } + + .sidebar-resizer { + // @z-index-above-sticky-header (100) + 1 = 101 + z-index: 101; + } + + .sidebar-resizer::after { + display: block; + content: ''; + width: 1px; + height: 100%; + margin: 0 auto; + } +`; + +type Props = { + id: string; + initialWidth: number; + enable: boolean; + minWidth?: number; + maxWidth?: number; + children: (width: number) => React.ReactNode; +}; + +const ResizableSidebar: React.FC<Props> = ({ + id, + initialWidth, + minWidth, + maxWidth, + enable, + children, +}) => { + const [width, setWidth] = useStoredSidebarWidth(id, initialWidth); + + return ( + <> + <ResizableWrapper> + <Resizable + enable={{ right: enable }} + handleClasses={{ right: 'sidebar-resizer' }} + size={{ width, height: '100%' }} + minWidth={minWidth} + maxWidth={maxWidth} + onResizeStop={(e, direction, ref, d) => setWidth(width + d.width)} + /> + </ResizableWrapper> + {children(width)} + </> + ); +}; + +export default ResizableSidebar; diff --git a/superset-frontend/src/components/ResizableSidebar/useStoredSidebarWidth.test.ts b/superset-frontend/src/components/ResizableSidebar/useStoredSidebarWidth.test.ts new file mode 100644 index 000000000000..347cfd8b9ae3 --- /dev/null +++ b/superset-frontend/src/components/ResizableSidebar/useStoredSidebarWidth.test.ts @@ -0,0 +1,92 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { renderHook, act } from '@testing-library/react-hooks'; +import { + LocalStorageKeys, + setItem, + getItem, +} from 'src/utils/localStorageHelpers'; +import useStoredSidebarWidth from './useStoredSidebarWidth'; + +const INITIAL_WIDTH = 300; + +describe('useStoredSidebarWidth', () => { + beforeEach(() => { + localStorage.clear(); + }); + + afterAll(() => { + localStorage.clear(); + }); + + it('returns a default filterBar width by initialWidth', () => { + const id = '123'; + const { result } = renderHook(() => + useStoredSidebarWidth(id, INITIAL_WIDTH), + ); + const [actualWidth] = result.current; + + expect(actualWidth).toEqual(INITIAL_WIDTH); + }); + + it('returns a stored filterBar width from localStorage', () => { + const id = '123'; + const expectedWidth = 378; + setItem(LocalStorageKeys.common__resizable_sidebar_widths, { + [id]: expectedWidth, + '456': 250, + }); + const { result } = renderHook(() => + useStoredSidebarWidth(id, INITIAL_WIDTH), + ); + const [actualWidth] = result.current; + + expect(actualWidth).toEqual(expectedWidth); + expect(actualWidth).not.toEqual(250); + }); + + it('returns a setter for filterBar width that stores the state in localStorage together', () => { + const id = '123'; + const expectedWidth = 378; + const otherDashboardId = '456'; + const otherDashboardWidth = 253; + setItem(LocalStorageKeys.common__resizable_sidebar_widths, { + [id]: 300, + [otherDashboardId]: otherDashboardWidth, + }); + const { result } = renderHook(() => + useStoredSidebarWidth(id, INITIAL_WIDTH), + ); + const [prevWidth, setter] = result.current; + + expect(prevWidth).toEqual(300); + + act(() => setter(expectedWidth)); + + const updatedWidth = result.current[0]; + const widthsMap = getItem( + LocalStorageKeys.common__resizable_sidebar_widths, + {}, + ); + expect(widthsMap[id]).toEqual(expectedWidth); + expect(widthsMap[otherDashboardId]).toEqual(otherDashboardWidth); + expect(updatedWidth).toEqual(expectedWidth); + expect(updatedWidth).not.toEqual(250); + }); +}); diff --git a/superset-frontend/src/components/ResizableSidebar/useStoredSidebarWidth.ts b/superset-frontend/src/components/ResizableSidebar/useStoredSidebarWidth.ts new file mode 100644 index 000000000000..4448d2ec52a3 --- /dev/null +++ b/superset-frontend/src/components/ResizableSidebar/useStoredSidebarWidth.ts @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { useEffect, useRef, useState } from 'react'; +import { + LocalStorageKeys, + setItem, + getItem, +} from 'src/utils/localStorageHelpers'; + +export default function useStoredSidebarWidth( + id: string, + initialWidth: number, +) { + const widthsMapRef = useRef<Record<string, number>>(); + const [sidebarWidth, setSidebarWidth] = useState<number>(initialWidth); + + useEffect(() => { + widthsMapRef.current = + widthsMapRef.current ?? + getItem(LocalStorageKeys.common__resizable_sidebar_widths, {}); + if (widthsMapRef.current[id]) { + setSidebarWidth(widthsMapRef.current[id]); + } + }, [id]); + + function setStoredSidebarWidth(updatedWidth: number) { + setSidebarWidth(updatedWidth); + setItem(LocalStorageKeys.common__resizable_sidebar_widths, { + ...widthsMapRef.current, + [id]: updatedWidth, + }); + } + + return [sidebarWidth, setStoredSidebarWidth] as const; +} diff --git a/superset-frontend/src/components/Select/AsyncSelect.stories.tsx b/superset-frontend/src/components/Select/AsyncSelect.stories.tsx new file mode 100644 index 000000000000..0bdaf43f2c06 --- /dev/null +++ b/superset-frontend/src/components/Select/AsyncSelect.stories.tsx @@ -0,0 +1,368 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { + ReactNode, + useState, + useCallback, + useRef, + useMemo, +} from 'react'; +import Button from 'src/components/Button'; +import AsyncSelect from './AsyncSelect'; +import { + SelectOptionsType, + AsyncSelectProps, + AsyncSelectRef, + SelectOptionsTypePage, +} from './types'; + +export default { + title: 'AsyncSelect', + component: AsyncSelect, +}; + +const DEFAULT_WIDTH = 200; + +const options: SelectOptionsType = [ + { + label: 'Such an incredibly awesome long long label', + value: 'Such an incredibly awesome long long label', + custom: 'Secret custom prop', + }, + { + label: 'Another incredibly awesome long long label', + value: 'Another incredibly awesome long long label', + }, + { + label: 'JSX Label', + customLabel: <div style={{ color: 'red' }}>JSX Label</div>, + value: 'JSX Label', + }, + { label: 'A', value: 'A' }, + { label: 'B', value: 'B' }, + { label: 'C', value: 'C' }, + { label: 'D', value: 'D' }, + { label: 'E', value: 'E' }, + { label: 'F', value: 'F' }, + { label: 'G', value: 'G' }, + { label: 'H', value: 'H' }, + { label: 'I', value: 'I' }, +]; + +const ARG_TYPES = { + options: { + defaultValue: options, + description: `It defines the options of the Select. + The options can be static, an array of options. + The options can also be async, a promise that returns an array of options. + `, + }, + ariaLabel: { + description: `It adds the aria-label tag for accessibility standards. + Must be plain English and localized. + `, + }, + labelInValue: { + defaultValue: true, + table: { + disable: true, + }, + }, + name: { + table: { + disable: true, + }, + }, + notFoundContent: { + table: { + disable: true, + }, + }, + mode: { + description: `It defines whether the Select should allow for + the selection of multiple options or single. Single by default. + `, + defaultValue: 'single', + control: { + type: 'inline-radio', + options: ['single', 'multiple'], + }, + }, + allowNewOptions: { + description: `It enables the user to create new options. + Can be used with standard or async select types. + Can be used with any mode, single or multiple. False by default. + `, + }, + invertSelection: { + description: `It shows a stop-outlined icon at the far right of a selected + option instead of the default checkmark. + Useful to better indicate to the user that by clicking on a selected + option it will be de-selected. False by default. + `, + }, + optionFilterProps: { + description: `It allows to define which properties of the option object + should be looked for when searching. + By default label and value. + `, + }, + oneLine: { + defaultValue: false, + description: `Sets maxTagCount to 1. The overflow tag is always displayed in + the same line, line wrapping is disabled. + When the dropdown is open, sets maxTagCount to 0, + displays only the overflow tag. + Requires '"mode=multiple"'. + `, + }, +}; + +const USERS = [ + 'John', + 'Liam', + 'Olivia', + 'Emma', + 'Noah', + 'Ava', + 'Oliver', + 'Elijah', + 'Charlotte', + 'Diego', + 'Evan', + 'Michael', + 'Giovanni', + 'Luca', + 'Paolo', + 'Francesca', + 'Chiara', + 'Sara', + 'Valentina', + 'Jessica', + 'Angelica', + 'Mario', + 'Marco', + 'Andrea', + 'Luigi', + 'Quarto', + 'Quinto', + 'Sesto', + 'Franco', + 'Sandro', + 'Alehandro', + 'Johnny', + 'Nikole', + 'Igor', + 'Sipatha', + 'Thami', + 'Munei', + 'Guilherme', + 'Umair', + 'Ashfaq', + 'Amna', + 'Irfan', + 'George', + 'Naseer', + 'Mohammad', + 'Rick', + 'Saliya', + 'Claire', + 'Benedetta', + 'Ilenia', +].sort(); + +export const AsynchronousSelect = ({ + fetchOnlyOnSearch, + withError, + withInitialValue, + responseTime, + ...rest +}: AsyncSelectProps & { + withError: boolean; + withInitialValue: boolean; + responseTime: number; +}) => { + const [requests, setRequests] = useState<ReactNode[]>([]); + const ref = useRef<AsyncSelectRef>(null); + + const getResults = (username?: string) => { + let results: { label: string; value: string }[] = []; + + if (!username) { + results = USERS.map(u => ({ + label: u, + value: u, + })); + } else { + const foundUsers = USERS.filter(u => u.toLowerCase().includes(username)); + if (foundUsers) { + results = foundUsers.map(u => ({ label: u, value: u })); + } else { + results = []; + } + } + return results; + }; + + const setRequestLog = (results: number, total: number, username?: string) => { + const request = ( + <> + Emulating network request with search <b>{username || 'empty'}</b> ...{' '} + <b> + {results}/{total} + </b>{' '} + results + </> + ); + + setRequests(requests => [request, ...requests]); + }; + + const fetchUserListPage = useCallback( + ( + search: string, + page: number, + pageSize: number, + ): Promise<SelectOptionsTypePage> => { + const username = search.trim().toLowerCase(); + return new Promise(resolve => { + let results = getResults(username); + const totalCount = results.length; + const start = page * pageSize; + const deleteCount = + start + pageSize < totalCount ? pageSize : totalCount - start; + results = results.splice(start, deleteCount); + setRequestLog(start + results.length, totalCount, username); + setTimeout(() => { + resolve({ data: results, totalCount }); + }, responseTime * 1000); + }); + }, + [responseTime], + ); + + const fetchUserListError = async (): Promise<SelectOptionsTypePage> => + new Promise((_, reject) => { + reject(new Error('Error while fetching the names from the server')); + }); + + const initialValue = useMemo( + () => ({ label: 'Valentina', value: 'Valentina' }), + [], + ); + + return ( + <> + <div + style={{ + width: DEFAULT_WIDTH, + }} + > + <AsyncSelect + {...rest} + ref={ref} + fetchOnlyOnSearch={fetchOnlyOnSearch} + options={withError ? fetchUserListError : fetchUserListPage} + placeholder={fetchOnlyOnSearch ? 'Type anything' : 'AsyncSelect...'} + value={withInitialValue ? initialValue : undefined} + /> + </div> + <div + style={{ + position: 'absolute', + top: 32, + left: DEFAULT_WIDTH + 100, + height: 400, + width: 600, + overflowY: 'auto', + border: '1px solid #d9d9d9', + padding: 20, + }} + > + {requests.map((request, index) => ( + <p key={`request-${index}`}>{request}</p> + ))} + </div> + <Button + style={{ + position: 'absolute', + top: 452, + left: DEFAULT_WIDTH + 580, + }} + onClick={() => { + ref.current?.clearCache(); + setRequests([]); + }} + > + Clear cache + </Button> + </> + ); +}; + +AsynchronousSelect.args = { + allowClear: false, + allowNewOptions: false, + fetchOnlyOnSearch: false, + pageSize: 10, + withError: false, + withInitialValue: false, + tokenSeparators: ['\n', '\t', ';'], +}; + +AsynchronousSelect.argTypes = { + ...ARG_TYPES, + header: { + table: { + disable: true, + }, + }, + invertSelection: { + table: { + disable: true, + }, + }, + pageSize: { + defaultValue: 10, + control: { + type: 'range', + min: 10, + max: 50, + step: 10, + }, + }, + responseTime: { + defaultValue: 0.5, + name: 'responseTime (seconds)', + control: { + type: 'range', + min: 0.5, + max: 5, + step: 0.5, + }, + }, +}; + +AsynchronousSelect.story = { + parameters: { + knobs: { + disable: true, + }, + }, +}; diff --git a/superset-frontend/src/components/Select/AsyncSelect.test.tsx b/superset-frontend/src/components/Select/AsyncSelect.test.tsx new file mode 100644 index 000000000000..ac9c78767c4a --- /dev/null +++ b/superset-frontend/src/components/Select/AsyncSelect.test.tsx @@ -0,0 +1,813 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen, waitFor, within } from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; +import { AsyncSelect } from 'src/components'; + +const ARIA_LABEL = 'Test'; +const NEW_OPTION = 'Kyle'; +const NO_DATA = 'No Data'; +const LOADING = 'Loading...'; +const OPTIONS = [ + { label: 'John', value: 1, gender: 'Male' }, + { label: 'Liam', value: 2, gender: 'Male' }, + { label: 'Olivia', value: 3, gender: 'Female' }, + { label: 'Emma', value: 4, gender: 'Female' }, + { label: 'Noah', value: 5, gender: 'Male' }, + { label: 'Ava', value: 6, gender: 'Female' }, + { label: 'Oliver', value: 7, gender: 'Male' }, + { label: 'ElijahH', value: 8, gender: 'Male' }, + { label: 'Charlotte', value: 9, gender: 'Female' }, + { label: 'Giovanni', value: 10, gender: 'Male' }, + { label: 'Franco', value: 11, gender: 'Male' }, + { label: 'Sandro', value: 12, gender: 'Male' }, + { label: 'Alehandro', value: 13, gender: 'Male' }, + { label: 'Johnny', value: 14, gender: 'Male' }, + { label: 'Nikole', value: 15, gender: 'Female' }, + { label: 'Igor', value: 16, gender: 'Male' }, + { label: 'Guilherme', value: 17, gender: 'Male' }, + { label: 'Irfan', value: 18, gender: 'Male' }, + { label: 'George', value: 19, gender: 'Male' }, + { label: 'Ashfaq', value: 20, gender: 'Male' }, + { label: 'Herme', value: 21, gender: 'Male' }, + { label: 'Cher', value: 22, gender: 'Female' }, + { label: 'Her', value: 23, gender: 'Male' }, +].sort((option1, option2) => option1.label.localeCompare(option2.label)); +const NULL_OPTION = { label: '<NULL>', value: null } as unknown as { + label: string; + value: number; +}; + +const loadOptions = async (search: string, page: number, pageSize: number) => { + const totalCount = OPTIONS.length; + const start = page * pageSize; + const deleteCount = + start + pageSize < totalCount ? pageSize : totalCount - start; + const searchValue = search.trim().toLowerCase(); + const optionFilterProps = ['label', 'value', 'gender']; + const data = OPTIONS.filter(option => + optionFilterProps.some(prop => { + const optionProp = option?.[prop] + ? String(option[prop]).trim().toLowerCase() + : ''; + return optionProp.includes(searchValue); + }), + ).splice(start, deleteCount); + return { + data, + totalCount: OPTIONS.length, + }; +}; + +const defaultProps = { + allowClear: true, + ariaLabel: ARIA_LABEL, + labelInValue: true, + options: loadOptions, + pageSize: 10, + showSearch: true, +}; + +const getElementByClassName = (className: string) => + document.querySelector(className)! as HTMLElement; + +const getElementsByClassName = (className: string) => + document.querySelectorAll(className)! as NodeListOf<HTMLElement>; + +const getSelect = () => screen.getByRole('combobox', { name: ARIA_LABEL }); + +const findSelectOption = (text: string) => + waitFor(() => + within(getElementByClassName('.rc-virtual-list')).getByText(text), + ); + +const querySelectOption = (text: string) => + waitFor(() => + within(getElementByClassName('.rc-virtual-list')).queryByText(text), + ); + +const findAllSelectOptions = () => + waitFor(() => getElementsByClassName('.ant-select-item-option-content')); + +const findSelectValue = () => + waitFor(() => getElementByClassName('.ant-select-selection-item')); + +const findAllSelectValues = () => + waitFor(() => getElementsByClassName('.ant-select-selection-item')); + +const clearAll = () => userEvent.click(screen.getByLabelText('close-circle')); + +const matchOrder = async (expectedLabels: string[]) => { + const actualLabels: string[] = []; + (await findAllSelectOptions()).forEach(option => { + actualLabels.push(option.textContent || ''); + }); + // menu is a virtual list, which means it may not render all options + expect(actualLabels.slice(0, expectedLabels.length)).toEqual( + expectedLabels.slice(0, actualLabels.length), + ); + return true; +}; + +const type = (text: string) => { + const select = getSelect(); + userEvent.clear(select); + return userEvent.type(select, text, { delay: 10 }); +}; + +const open = () => waitFor(() => userEvent.click(getSelect())); + +test('displays a header', async () => { + const headerText = 'Header'; + render(<AsyncSelect {...defaultProps} header={headerText} />); + expect(screen.getByText(headerText)).toBeInTheDocument(); +}); + +test('adds a new option if the value is not in the options, when options are empty', async () => { + const loadOptions = jest.fn(async () => ({ data: [], totalCount: 0 })); + render( + <AsyncSelect {...defaultProps} options={loadOptions} value={OPTIONS[0]} />, + ); + await open(); + expect(await findSelectOption(OPTIONS[0].label)).toBeInTheDocument(); + const options = await findAllSelectOptions(); + expect(options).toHaveLength(1); + options.forEach((option, i) => + expect(option).toHaveTextContent(OPTIONS[i].label), + ); +}); + +test('adds a new option if the value is not in the options, when options have values', async () => { + const loadOptions = jest.fn(async () => ({ + data: [OPTIONS[1]], + totalCount: 1, + })); + render( + <AsyncSelect {...defaultProps} options={loadOptions} value={OPTIONS[0]} />, + ); + await open(); + expect(await findSelectOption(OPTIONS[0].label)).toBeInTheDocument(); + expect(await findSelectOption(OPTIONS[1].label)).toBeInTheDocument(); + const options = await findAllSelectOptions(); + expect(options).toHaveLength(2); + options.forEach((option, i) => + expect(option).toHaveTextContent(OPTIONS[i].label), + ); +}); + +test('does not add a new option if the value is already in the options', async () => { + const loadOptions = jest.fn(async () => ({ + data: [OPTIONS[0]], + totalCount: 1, + })); + render( + <AsyncSelect {...defaultProps} options={loadOptions} value={OPTIONS[0]} />, + ); + await open(); + expect(await findSelectOption(OPTIONS[0].label)).toBeInTheDocument(); + const options = await findAllSelectOptions(); + expect(options).toHaveLength(1); +}); + +test('inverts the selection', async () => { + render(<AsyncSelect {...defaultProps} invertSelection />); + await open(); + userEvent.click(await findSelectOption(OPTIONS[0].label)); + expect(await screen.findByLabelText('stop')).toBeInTheDocument(); +}); + +test('sort the options by label if no sort comparator is provided', async () => { + const loadUnsortedOptions = jest.fn(async () => ({ + data: [...OPTIONS].sort(() => Math.random()), + totalCount: 2, + })); + render(<AsyncSelect {...defaultProps} options={loadUnsortedOptions} />); + await open(); + const options = await findAllSelectOptions(); + options.forEach((option, key) => + expect(option).toHaveTextContent(OPTIONS[key].label), + ); +}); + +test('sort the options using a custom sort comparator', async () => { + const sortComparator = ( + option1: typeof OPTIONS[0], + option2: typeof OPTIONS[0], + ) => option1.gender.localeCompare(option2.gender); + render(<AsyncSelect {...defaultProps} sortComparator={sortComparator} />); + await open(); + const options = await findAllSelectOptions(); + const optionsPage = OPTIONS.slice(0, defaultProps.pageSize); + const sortedOptions = optionsPage.sort(sortComparator); + options.forEach((option, key) => { + expect(option).toHaveTextContent(sortedOptions[key].label); + }); +}); + +test('should sort selected to top when in single mode', async () => { + render(<AsyncSelect {...defaultProps} mode="single" />); + const originalLabels = OPTIONS.map(option => option.label); + await open(); + userEvent.click(await findSelectOption(originalLabels[1])); + // after selection, keep the original order + expect(await matchOrder(originalLabels)).toBe(true); + + // order selected to top when reopen + await type('{esc}'); + await open(); + let labels = originalLabels.slice(); + labels = labels.splice(1, 1).concat(labels); + expect(await matchOrder(labels)).toBe(true); + + // keep clicking other items, the updated order should still based on + // original order + userEvent.click(await findSelectOption(originalLabels[5])); + await matchOrder(labels); + await type('{esc}'); + await open(); + labels = originalLabels.slice(); + labels = labels.splice(5, 1).concat(labels); + expect(await matchOrder(labels)).toBe(true); + + // should revert to original order + clearAll(); + await type('{esc}'); + await open(); + expect(await matchOrder(originalLabels)).toBe(true); +}); + +test('should sort selected to the top when in multi mode', async () => { + render(<AsyncSelect {...defaultProps} mode="multiple" />); + const originalLabels = OPTIONS.map(option => option.label); + let labels = originalLabels.slice(); + + await open(); + userEvent.click(await findSelectOption(labels[1])); + expect(await matchOrder(labels)).toBe(true); + + await type('{esc}'); + await open(); + labels = labels.splice(1, 1).concat(labels); + expect(await matchOrder(labels)).toBe(true); + + await open(); + userEvent.click(await findSelectOption(labels[5])); + await type('{esc}'); + await open(); + labels = [labels.splice(0, 1)[0], labels.splice(4, 1)[0]].concat(labels); + expect(await matchOrder(labels)).toBe(true); + + // should revert to original order + clearAll(); + await type('{esc}'); + await open(); + expect(await matchOrder(originalLabels)).toBe(true); +}); + +test('searches for label or value', async () => { + const option = OPTIONS[11]; + render(<AsyncSelect {...defaultProps} />); + const search = option.value; + await type(search.toString()); + expect(await findSelectOption(option.label)).toBeInTheDocument(); + const options = await findAllSelectOptions(); + expect(options.length).toBe(1); + expect(options[0]).toHaveTextContent(option.label); +}); + +test('search order exact and startWith match first', async () => { + render(<AsyncSelect {...defaultProps} />); + await open(); + await type('Her'); + expect(await findSelectOption('Guilherme')).toBeInTheDocument(); + const options = await findAllSelectOptions(); + expect(options.length).toBe(4); + expect(options[0]).toHaveTextContent('Her'); + expect(options[1]).toHaveTextContent('Herme'); + expect(options[2]).toHaveTextContent('Cher'); + expect(options[3]).toHaveTextContent('Guilherme'); +}); + +test('ignores case when searching', async () => { + render(<AsyncSelect {...defaultProps} />); + await type('george'); + expect(await findSelectOption('George')).toBeInTheDocument(); +}); + +test('same case should be ranked to the top', async () => { + const loadOptions = jest.fn(async () => ({ + data: [ + { value: 'Cac' }, + { value: 'abac' }, + { value: 'acbc' }, + { value: 'CAc' }, + ], + totalCount: 4, + })); + render(<AsyncSelect {...defaultProps} options={loadOptions} />); + await type('Ac'); + const options = await findAllSelectOptions(); + expect(options.length).toBe(4); + expect(options[0]?.textContent).toEqual('acbc'); + expect(options[1]?.textContent).toEqual('CAc'); + expect(options[2]?.textContent).toEqual('abac'); + expect(options[3]?.textContent).toEqual('Cac'); +}); + +test('ignores special keys when searching', async () => { + render(<AsyncSelect {...defaultProps} />); + await type('{shift}'); + expect(screen.queryByText(LOADING)).not.toBeInTheDocument(); +}); + +test('searches for custom fields', async () => { + render( + <AsyncSelect {...defaultProps} optionFilterProps={['label', 'gender']} />, + ); + await open(); + await type('Liam'); + // Liam is on the second page. need to wait to fetch options + expect(await findSelectOption('Liam')).toBeInTheDocument(); + let options = await findAllSelectOptions(); + expect(options.length).toBe(1); + expect(options[0]).toHaveTextContent('Liam'); + await type('Female'); + // Olivia is on the second page. need to wait to fetch options + expect(await findSelectOption('Olivia')).toBeInTheDocument(); + options = await findAllSelectOptions(); + expect(options.length).toBe(6); + expect(options[0]).toHaveTextContent('Ava'); + expect(options[1]).toHaveTextContent('Charlotte'); + expect(options[2]).toHaveTextContent('Cher'); + expect(options[3]).toHaveTextContent('Emma'); + expect(options[4]).toHaveTextContent('Nikole'); + expect(options[5]).toHaveTextContent('Olivia'); + await type('1'); + expect(await screen.findByText(NO_DATA)).toBeInTheDocument(); +}); + +test('removes duplicated values', async () => { + render(<AsyncSelect {...defaultProps} mode="multiple" allowNewOptions />); + await type('a,b,b,b,c,d,d'); + const values = await findAllSelectValues(); + expect(values.length).toBe(4); + expect(values[0]).toHaveTextContent('a'); + expect(values[1]).toHaveTextContent('b'); + expect(values[2]).toHaveTextContent('c'); + expect(values[3]).toHaveTextContent('d'); +}); + +test('renders a custom label', async () => { + const loadOptions = jest.fn(async () => ({ + data: [ + { label: 'John', value: 1, customLabel: <h1>John</h1> }, + { label: 'Liam', value: 2, customLabel: <h1>Liam</h1> }, + { label: 'Olivia', value: 3, customLabel: <h1>Olivia</h1> }, + ], + totalCount: 3, + })); + render(<AsyncSelect {...defaultProps} options={loadOptions} />); + await open(); + expect(screen.getByRole('heading', { name: 'John' })).toBeInTheDocument(); + expect(screen.getByRole('heading', { name: 'Liam' })).toBeInTheDocument(); + expect(screen.getByRole('heading', { name: 'Olivia' })).toBeInTheDocument(); +}); + +test('searches for a word with a custom label', async () => { + const loadOptions = jest.fn(async () => ({ + data: [ + { label: 'John', value: 1, customLabel: <h1>John</h1> }, + { label: 'Liam', value: 2, customLabel: <h1>Liam</h1> }, + { label: 'Olivia', value: 3, customLabel: <h1>Olivia</h1> }, + ], + totalCount: 3, + })); + render(<AsyncSelect {...defaultProps} options={loadOptions} />); + await type('Liam'); + const selectOptions = await findAllSelectOptions(); + expect(selectOptions.length).toBe(1); + expect(selectOptions[0]).toHaveTextContent('Liam'); +}); + +test('removes a new option if the user does not select it', async () => { + render(<AsyncSelect {...defaultProps} allowNewOptions />); + await type(NEW_OPTION); + expect(await findSelectOption(NEW_OPTION)).toBeInTheDocument(); + await type('k'); + await waitFor(() => + expect(screen.queryByText(NEW_OPTION)).not.toBeInTheDocument(), + ); +}); + +test('clear all the values', async () => { + const onClear = jest.fn(); + render( + <AsyncSelect + {...defaultProps} + mode="multiple" + value={[OPTIONS[0], OPTIONS[1]]} + onClear={onClear} + />, + ); + clearAll(); + expect(onClear).toHaveBeenCalled(); + const values = await findAllSelectValues(); + expect(values.length).toBe(0); +}); + +test('does not add a new option if allowNewOptions is false', async () => { + render(<AsyncSelect {...defaultProps} />); + await open(); + await type(NEW_OPTION); + expect(await screen.findByText(NO_DATA)).toBeInTheDocument(); +}); + +test('adds the null option when selected in single mode', async () => { + const loadOptions = jest.fn(async () => ({ + data: [OPTIONS[0], NULL_OPTION], + totalCount: 2, + })); + render(<AsyncSelect {...defaultProps} options={loadOptions} />); + await open(); + userEvent.click(await findSelectOption(NULL_OPTION.label)); + const values = await findAllSelectValues(); + expect(values[0]).toHaveTextContent(NULL_OPTION.label); +}); + +test('adds the null option when selected in multiple mode', async () => { + const loadOptions = jest.fn(async () => ({ + data: [OPTIONS[0], NULL_OPTION], + totalCount: 2, + })); + render( + <AsyncSelect {...defaultProps} options={loadOptions} mode="multiple" />, + ); + await open(); + userEvent.click(await findSelectOption(OPTIONS[0].label)); + userEvent.click(await findSelectOption(NULL_OPTION.label)); + const values = await findAllSelectValues(); + expect(values[0]).toHaveTextContent(OPTIONS[0].label); + expect(values[1]).toHaveTextContent(NULL_OPTION.label); +}); + +test('renders the select with default props', () => { + render(<AsyncSelect {...defaultProps} />); + expect(getSelect()).toBeInTheDocument(); +}); + +test('opens the select without any data', async () => { + render( + <AsyncSelect + {...defaultProps} + options={async () => ({ data: [], totalCount: 0 })} + />, + ); + await open(); + expect(await screen.findByText(/no data/i)).toBeInTheDocument(); +}); + +test('displays the loading indicator when opening', async () => { + render(<AsyncSelect {...defaultProps} />); + await waitFor(() => { + userEvent.click(getSelect()); + expect(screen.getByText(LOADING)).toBeInTheDocument(); + }); + expect(screen.queryByText(LOADING)).not.toBeInTheDocument(); +}); + +test('makes a selection in single mode', async () => { + render(<AsyncSelect {...defaultProps} />); + const optionText = 'Emma'; + await open(); + userEvent.click(await findSelectOption(optionText)); + expect(await findSelectValue()).toHaveTextContent(optionText); +}); + +test('multiple selections in multiple mode', async () => { + render(<AsyncSelect {...defaultProps} mode="multiple" />); + await open(); + const [firstOption, secondOption] = OPTIONS; + userEvent.click(await findSelectOption(firstOption.label)); + userEvent.click(await findSelectOption(secondOption.label)); + const values = await findAllSelectValues(); + expect(values[0]).toHaveTextContent(firstOption.label); + expect(values[1]).toHaveTextContent(secondOption.label); +}); + +test('changes the selected item in single mode', async () => { + const onChange = jest.fn(); + render(<AsyncSelect {...defaultProps} onChange={onChange} />); + await open(); + const [firstOption, secondOption] = OPTIONS; + userEvent.click(await findSelectOption(firstOption.label)); + expect(onChange).toHaveBeenCalledWith( + expect.objectContaining({ + label: firstOption.label, + value: firstOption.value, + }), + firstOption, + ); + expect(await findSelectValue()).toHaveTextContent(firstOption.label); + userEvent.click(await findSelectOption(secondOption.label)); + expect(onChange).toHaveBeenCalledWith( + expect.objectContaining({ + label: secondOption.label, + value: secondOption.value, + }), + secondOption, + ); + expect(await findSelectValue()).toHaveTextContent(secondOption.label); +}); + +test('deselects an item in multiple mode', async () => { + render(<AsyncSelect {...defaultProps} mode="multiple" />); + await open(); + const option3 = OPTIONS[2]; + const option8 = OPTIONS[7]; + userEvent.click(await findSelectOption(option8.label)); + userEvent.click(await findSelectOption(option3.label)); + + let options = await findAllSelectOptions(); + expect(options).toHaveLength(Math.min(defaultProps.pageSize, OPTIONS.length)); + expect(options[0]).toHaveTextContent(OPTIONS[0].label); + expect(options[1]).toHaveTextContent(OPTIONS[1].label); + + await type('{esc}'); + await open(); + + // should rank selected options to the top after menu closes + options = await findAllSelectOptions(); + expect(options).toHaveLength(Math.min(defaultProps.pageSize, OPTIONS.length)); + expect(options[0]).toHaveTextContent(option3.label); + expect(options[1]).toHaveTextContent(option8.label); + + let values = await findAllSelectValues(); + expect(values).toHaveLength(2); + // should keep the order by which the options were selected + expect(values[0]).toHaveTextContent(option8.label); + expect(values[1]).toHaveTextContent(option3.label); + + userEvent.click(await findSelectOption(option3.label)); + values = await findAllSelectValues(); + expect(values.length).toBe(1); + expect(values[0]).toHaveTextContent(option8.label); +}); + +test('adds a new option if none is available and allowNewOptions is true', async () => { + render(<AsyncSelect {...defaultProps} allowNewOptions />); + await open(); + await type(NEW_OPTION); + expect(await findSelectOption(NEW_OPTION)).toBeInTheDocument(); +}); + +test('does not add a new option if the option already exists', async () => { + render(<AsyncSelect {...defaultProps} allowNewOptions />); + const option = OPTIONS[0].label; + await open(); + await type(option); + await waitFor(() => { + const array = within( + getElementByClassName('.rc-virtual-list'), + ).getAllByText(option); + expect(array.length).toBe(1); + }); +}); + +test('shows "No data" when allowNewOptions is false and a new option is entered', async () => { + render(<AsyncSelect {...defaultProps} allowNewOptions={false} showSearch />); + await open(); + await type(NEW_OPTION); + expect(await screen.findByText(NO_DATA)).toBeInTheDocument(); +}); + +test('does not show "No data" when allowNewOptions is true and a new option is entered', async () => { + render(<AsyncSelect {...defaultProps} allowNewOptions />); + await open(); + await type(NEW_OPTION); + expect(screen.queryByText(NO_DATA)).not.toBeInTheDocument(); +}); + +test('sets a initial value in single mode', async () => { + render(<AsyncSelect {...defaultProps} value={OPTIONS[0]} />); + expect(await findSelectValue()).toHaveTextContent(OPTIONS[0].label); +}); + +test('sets a initial value in multiple mode', async () => { + render( + <AsyncSelect + {...defaultProps} + mode="multiple" + value={[OPTIONS[0], OPTIONS[1]]} + />, + ); + const values = await findAllSelectValues(); + expect(values[0]).toHaveTextContent(OPTIONS[0].label); + expect(values[1]).toHaveTextContent(OPTIONS[1].label); +}); + +test('searches for matches in both loaded and unloaded pages', async () => { + render(<AsyncSelect {...defaultProps} />); + await open(); + await type('and'); + + let options = await findAllSelectOptions(); + expect(options.length).toBe(1); + expect(options[0]).toHaveTextContent('Alehandro'); + + await screen.findByText('Sandro'); + options = await findAllSelectOptions(); + expect(options.length).toBe(2); + expect(options[0]).toHaveTextContent('Alehandro'); + expect(options[1]).toHaveTextContent('Sandro'); +}); + +test('searches for an item in a page not loaded', async () => { + const mock = jest.fn(loadOptions); + render(<AsyncSelect {...defaultProps} options={mock} />); + const search = 'Sandro'; + await open(); + await type(search); + await waitFor(() => expect(mock).toHaveBeenCalledTimes(2)); + const options = await findAllSelectOptions(); + expect(options.length).toBe(1); + expect(options[0]).toHaveTextContent(search); +}); + +test('does not fetches data when rendering', async () => { + const loadOptions = jest.fn(async () => ({ data: [], totalCount: 0 })); + render(<AsyncSelect {...defaultProps} options={loadOptions} />); + expect(loadOptions).not.toHaveBeenCalled(); +}); + +test('fetches data when opening', async () => { + const loadOptions = jest.fn(async () => ({ data: [], totalCount: 0 })); + render(<AsyncSelect {...defaultProps} options={loadOptions} />); + await open(); + expect(loadOptions).toHaveBeenCalled(); +}); + +test('fetches data only after a search input is entered if fetchOnlyOnSearch is true', async () => { + const loadOptions = jest.fn(async () => ({ data: [], totalCount: 0 })); + render( + <AsyncSelect {...defaultProps} options={loadOptions} fetchOnlyOnSearch />, + ); + await open(); + await waitFor(() => expect(loadOptions).not.toHaveBeenCalled()); + await type('search'); + await waitFor(() => expect(loadOptions).toHaveBeenCalled()); +}); + +test('displays an error message when an exception is thrown while fetching', async () => { + const error = 'Fetch error'; + const loadOptions = async () => { + throw new Error(error); + }; + render(<AsyncSelect {...defaultProps} options={loadOptions} />); + await open(); + expect(screen.getByText(error)).toBeInTheDocument(); +}); + +test('does not fire a new request for the same search input', async () => { + const loadOptions = jest.fn(async () => ({ data: [], totalCount: 0 })); + render( + <AsyncSelect {...defaultProps} options={loadOptions} fetchOnlyOnSearch />, + ); + await type('search'); + expect(await screen.findByText(NO_DATA)).toBeInTheDocument(); + expect(loadOptions).toHaveBeenCalledTimes(1); + clearAll(); + await type('search'); + expect(await screen.findByText(LOADING)).toBeInTheDocument(); + expect(loadOptions).toHaveBeenCalledTimes(1); +}); + +test('does not fire a new request if all values have been fetched', async () => { + const mock = jest.fn(loadOptions); + const search = 'George'; + const pageSize = OPTIONS.length; + render(<AsyncSelect {...defaultProps} options={mock} pageSize={pageSize} />); + await open(); + expect(mock).toHaveBeenCalledTimes(1); + await type(search); + expect(await findSelectOption(search)).toBeInTheDocument(); + expect(mock).toHaveBeenCalledTimes(1); +}); + +test('fires a new request if all values have not been fetched', async () => { + const mock = jest.fn(loadOptions); + const pageSize = OPTIONS.length / 2; + render(<AsyncSelect {...defaultProps} options={mock} pageSize={pageSize} />); + await open(); + expect(mock).toHaveBeenCalledTimes(1); + await type('or'); + + // `George` is on the first page so when it appears the API has not been called again + expect(await findSelectOption('George')).toBeInTheDocument(); + expect(mock).toHaveBeenCalledTimes(1); + + // `Igor` is on the second paged API request + expect(await findSelectOption('Igor')).toBeInTheDocument(); + expect(mock).toHaveBeenCalledTimes(2); +}); + +test('does not render a helper text by default', async () => { + render(<AsyncSelect {...defaultProps} />); + await open(); + expect(screen.queryByRole('note')).not.toBeInTheDocument(); +}); + +test('renders a helper text when one is provided', async () => { + const helperText = 'Helper text'; + render(<AsyncSelect {...defaultProps} helperText={helperText} />); + await open(); + expect(screen.getByRole('note')).toBeInTheDocument(); + expect(screen.queryByText(helperText)).toBeInTheDocument(); +}); + +test('finds an element with a numeric value and does not duplicate the options', async () => { + const options = jest.fn(async () => ({ + data: [ + { label: 'a', value: 11 }, + { label: 'b', value: 12 }, + ], + totalCount: 2, + })); + render(<AsyncSelect {...defaultProps} options={options} allowNewOptions />); + await open(); + await type('11'); + expect(await findSelectOption('a')).toBeInTheDocument(); + expect(await querySelectOption('11')).not.toBeInTheDocument(); +}); + +test('Renders only 1 tag and an overflow tag in oneLine mode', () => { + render( + <AsyncSelect + {...defaultProps} + value={[OPTIONS[0], OPTIONS[1], OPTIONS[2]]} + mode="multiple" + oneLine + />, + ); + expect(screen.getByText(OPTIONS[0].label)).toBeVisible(); + expect(screen.queryByText(OPTIONS[1].label)).not.toBeInTheDocument(); + expect(screen.queryByText(OPTIONS[2].label)).not.toBeInTheDocument(); + expect(screen.getByText('+ 2 ...')).toBeVisible(); +}); + +test('Renders only an overflow tag if dropdown is open in oneLine mode', async () => { + render( + <AsyncSelect + {...defaultProps} + value={[OPTIONS[0], OPTIONS[1], OPTIONS[2]]} + mode="multiple" + oneLine + />, + ); + await open(); + + const withinSelector = within(getElementByClassName('.ant-select-selector')); + await waitFor(() => { + expect( + withinSelector.queryByText(OPTIONS[0].label), + ).not.toBeInTheDocument(); + expect( + withinSelector.queryByText(OPTIONS[1].label), + ).not.toBeInTheDocument(); + expect( + withinSelector.queryByText(OPTIONS[2].label), + ).not.toBeInTheDocument(); + expect(withinSelector.getByText('+ 3 ...')).toBeVisible(); + }); + + await type('{esc}'); + + expect(await withinSelector.findByText(OPTIONS[0].label)).toBeVisible(); + expect(withinSelector.queryByText(OPTIONS[1].label)).not.toBeInTheDocument(); + expect(withinSelector.queryByText(OPTIONS[2].label)).not.toBeInTheDocument(); + expect(withinSelector.getByText('+ 2 ...')).toBeVisible(); +}); + +/* + TODO: Add tests that require scroll interaction. Needs further investigation. + - Fetches more data when scrolling and more data is available + - Doesn't fetch more data when no more data is available + - Requests the correct page and page size + - Sets the page to zero when a new search is made + */ diff --git a/superset-frontend/src/components/Select/AsyncSelect.tsx b/superset-frontend/src/components/Select/AsyncSelect.tsx new file mode 100644 index 000000000000..00c1443c56e2 --- /dev/null +++ b/superset-frontend/src/components/Select/AsyncSelect.tsx @@ -0,0 +1,532 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { + forwardRef, + ReactElement, + RefObject, + UIEvent, + useEffect, + useMemo, + useState, + useRef, + useCallback, + useImperativeHandle, +} from 'react'; +import { ensureIsArray, t } from '@superset-ui/core'; +import { LabeledValue as AntdLabeledValue } from 'antd/lib/select'; +import debounce from 'lodash/debounce'; +import { isEqual } from 'lodash'; +import Icons from 'src/components/Icons'; +import { getClientErrorObject } from 'src/utils/getClientErrorObject'; +import { SLOW_DEBOUNCE } from 'src/constants'; +import { + getValue, + hasOption, + isLabeledValue, + renderSelectOptions, + hasCustomLabels, + sortSelectedFirstHelper, + sortComparatorWithSearchHelper, + sortComparatorForNoSearchHelper, + getSuffixIcon, + dropDownRenderHelper, + handleFilterOptionHelper, +} from './utils'; +import { + AsyncSelectProps, + AsyncSelectRef, + SelectOptionsPagePromise, + SelectOptionsType, + SelectOptionsTypePage, +} from './types'; +import { + StyledCheckOutlined, + StyledContainer, + StyledError, + StyledErrorMessage, + StyledHeader, + StyledSelect, + StyledStopOutlined, +} from './styles'; +import { + DEFAULT_PAGE_SIZE, + EMPTY_OPTIONS, + MAX_TAG_COUNT, + TOKEN_SEPARATORS, + DEFAULT_SORT_COMPARATOR, +} from './constants'; +import { customTagRender } from './CustomTag'; + +const Error = ({ error }: { error: string }) => ( + <StyledError> + <Icons.ErrorSolid /> <StyledErrorMessage>{error}</StyledErrorMessage> + </StyledError> +); + +const getQueryCacheKey = (value: string, page: number, pageSize: number) => + `${value};${page};${pageSize}`; + +/** + * This component is a customized version of the Antdesign 4.X Select component + * https://ant.design/components/select/. + * The aim of the component was to combine all the instances of select components throughout the + * project under one and to remove the react-select component entirely. + * This Select component provides an API that is tested against all the different use cases of Superset. + * It limits and overrides the existing Antdesign API in order to keep their usage to the minimum + * and to enforce simplification and standardization. + * It is divided into two macro categories, Static and Async. + * The Static type accepts a static array of options. + * The Async type accepts a promise that will return the options. + * Each of the categories come with different abilities. For a comprehensive guide please refer to + * the storybook in src/components/Select/Select.stories.tsx. + */ +const AsyncSelect = forwardRef( + ( + { + allowClear, + allowNewOptions = false, + ariaLabel, + fetchOnlyOnSearch, + filterOption = true, + header = null, + headerPosition = 'top', + helperText, + invertSelection = false, + lazyLoading = true, + loading, + mode = 'single', + name, + notFoundContent, + onError, + onChange, + onClear, + onDropdownVisibleChange, + optionFilterProps = ['label', 'value'], + options, + pageSize = DEFAULT_PAGE_SIZE, + placeholder = t('Select ...'), + showSearch = true, + sortComparator = DEFAULT_SORT_COMPARATOR, + tokenSeparators, + value, + getPopupContainer, + oneLine, + maxTagCount: propsMaxTagCount, + ...props + }: AsyncSelectProps, + ref: RefObject<AsyncSelectRef>, + ) => { + const isSingleMode = mode === 'single'; + const [selectValue, setSelectValue] = useState(value); + const [inputValue, setInputValue] = useState(''); + const [isLoading, setIsLoading] = useState(loading); + const [error, setError] = useState(''); + const [isDropdownVisible, setIsDropdownVisible] = useState(false); + const [page, setPage] = useState(0); + const [totalCount, setTotalCount] = useState(0); + const [loadingEnabled, setLoadingEnabled] = useState(!lazyLoading); + const [allValuesLoaded, setAllValuesLoaded] = useState(false); + const selectValueRef = useRef(selectValue); + const fetchedQueries = useRef(new Map<string, number>()); + const mappedMode = isSingleMode + ? undefined + : allowNewOptions + ? 'tags' + : 'multiple'; + const allowFetch = !fetchOnlyOnSearch || inputValue; + + const [maxTagCount, setMaxTagCount] = useState( + propsMaxTagCount ?? MAX_TAG_COUNT, + ); + + useEffect(() => { + if (oneLine) { + setMaxTagCount(isDropdownVisible ? 0 : 1); + } + }, [isDropdownVisible, oneLine]); + + useEffect(() => { + selectValueRef.current = selectValue; + }, [selectValue]); + + const sortSelectedFirst = useCallback( + (a: AntdLabeledValue, b: AntdLabeledValue) => + sortSelectedFirstHelper(a, b, selectValueRef.current), + [], + ); + + const sortComparatorWithSearch = useCallback( + (a: AntdLabeledValue, b: AntdLabeledValue) => + sortComparatorWithSearchHelper( + a, + b, + inputValue, + sortSelectedFirst, + sortComparator, + ), + [inputValue, sortComparator, sortSelectedFirst], + ); + + const sortComparatorForNoSearch = useCallback( + (a: AntdLabeledValue, b: AntdLabeledValue) => + sortComparatorForNoSearchHelper( + a, + b, + sortSelectedFirst, + sortComparator, + ), + [sortComparator, sortSelectedFirst], + ); + + const [selectOptions, setSelectOptions] = + useState<SelectOptionsType>(EMPTY_OPTIONS); + + // add selected values to options list if they are not in it + const fullSelectOptions = useMemo(() => { + const missingValues: SelectOptionsType = ensureIsArray(selectValue) + .filter(opt => !hasOption(getValue(opt), selectOptions)) + .map(opt => + isLabeledValue(opt) ? opt : { value: opt, label: String(opt) }, + ); + return missingValues.length > 0 + ? missingValues.concat(selectOptions) + : selectOptions; + }, [selectOptions, selectValue]); + + const handleOnSelect = ( + selectedItem: string | number | AntdLabeledValue | undefined, + ) => { + if (isSingleMode) { + setSelectValue(selectedItem); + } else { + setSelectValue(previousState => { + const array = ensureIsArray(previousState); + const value = getValue(selectedItem); + // Tokenized values can contain duplicated values + if (!hasOption(value, array)) { + const result = [...array, selectedItem]; + return isLabeledValue(selectedItem) + ? (result as AntdLabeledValue[]) + : (result as (string | number)[]); + } + return previousState; + }); + } + setInputValue(''); + }; + + const handleOnDeselect = ( + value: string | number | AntdLabeledValue | undefined, + ) => { + if (Array.isArray(selectValue)) { + if (isLabeledValue(value)) { + const array = selectValue as AntdLabeledValue[]; + setSelectValue( + array.filter(element => element.value !== value.value), + ); + } else { + const array = selectValue as (string | number)[]; + setSelectValue(array.filter(element => element !== value)); + } + } + setInputValue(''); + }; + + const internalOnError = useCallback( + (response: Response) => + getClientErrorObject(response).then(e => { + const { error } = e; + setError(error); + + if (onError) { + onError(error); + } + }), + [onError], + ); + + const mergeData = useCallback( + (data: SelectOptionsType) => { + let mergedData: SelectOptionsType = []; + if (data && Array.isArray(data) && data.length) { + // unique option values should always be case sensitive so don't lowercase + const dataValues = new Set(data.map(opt => opt.value)); + // merges with existing and creates unique options + setSelectOptions(prevOptions => { + mergedData = prevOptions + .filter(previousOption => !dataValues.has(previousOption.value)) + .concat(data) + .sort(sortComparatorForNoSearch); + return mergedData; + }); + } + return mergedData; + }, + [sortComparatorForNoSearch], + ); + + const fetchPage = useMemo( + () => (search: string, page: number) => { + setPage(page); + if (allValuesLoaded) { + setIsLoading(false); + return; + } + const key = getQueryCacheKey(search, page, pageSize); + const cachedCount = fetchedQueries.current.get(key); + if (cachedCount !== undefined) { + setTotalCount(cachedCount); + setIsLoading(false); + return; + } + setIsLoading(true); + + const fetchOptions = options as SelectOptionsPagePromise; + fetchOptions(search, page, pageSize) + .then(({ data, totalCount }: SelectOptionsTypePage) => { + const mergedData = mergeData(data); + fetchedQueries.current.set(key, totalCount); + setTotalCount(totalCount); + if ( + !fetchOnlyOnSearch && + search === '' && + mergedData.length >= totalCount + ) { + setAllValuesLoaded(true); + } + }) + .catch(internalOnError) + .finally(() => { + setIsLoading(false); + }); + }, + [ + allValuesLoaded, + fetchOnlyOnSearch, + mergeData, + internalOnError, + options, + pageSize, + ], + ); + + const debouncedFetchPage = useMemo( + () => debounce(fetchPage, SLOW_DEBOUNCE), + [fetchPage], + ); + + const handleOnSearch = (search: string) => { + const searchValue = search.trim(); + if (allowNewOptions && isSingleMode) { + const newOption = searchValue && + !hasOption(searchValue, fullSelectOptions, true) && { + label: searchValue, + value: searchValue, + isNewOption: true, + }; + const cleanSelectOptions = fullSelectOptions.filter( + opt => !opt.isNewOption || hasOption(opt.value, selectValue), + ); + const newOptions = newOption + ? [newOption, ...cleanSelectOptions] + : cleanSelectOptions; + setSelectOptions(newOptions); + } + if ( + !allValuesLoaded && + loadingEnabled && + !fetchedQueries.current.has(getQueryCacheKey(searchValue, 0, pageSize)) + ) { + // if fetch only on search but search value is empty, then should not be + // in loading state + setIsLoading(!(fetchOnlyOnSearch && !searchValue)); + } + setInputValue(search); + }; + + const handlePagination = (e: UIEvent<HTMLElement>) => { + const vScroll = e.currentTarget; + const thresholdReached = + vScroll.scrollTop > (vScroll.scrollHeight - vScroll.offsetHeight) * 0.7; + const hasMoreData = page * pageSize + pageSize < totalCount; + + if (!isLoading && hasMoreData && thresholdReached) { + const newPage = page + 1; + fetchPage(inputValue, newPage); + } + }; + + const handleFilterOption = (search: string, option: AntdLabeledValue) => + handleFilterOptionHelper(search, option, optionFilterProps, filterOption); + + const handleOnDropdownVisibleChange = (isDropdownVisible: boolean) => { + setIsDropdownVisible(isDropdownVisible); + + // loading is enabled when dropdown is open, + // disabled when dropdown is closed + if (loadingEnabled !== isDropdownVisible) { + setLoadingEnabled(isDropdownVisible); + } + // when closing dropdown, always reset loading state + if (!isDropdownVisible && isLoading) { + // delay is for the animation of closing the dropdown + // so the dropdown doesn't flash between "Loading..." and "No data" + // before closing. + setTimeout(() => { + setIsLoading(false); + }, 250); + } + // if no search input value, force sort options because it won't be sorted by + // `filterSort`. + if (isDropdownVisible && !inputValue && selectOptions.length > 1) { + const sortedOptions = selectOptions + .slice() + .sort(sortComparatorForNoSearch); + if (!isEqual(sortedOptions, selectOptions)) { + setSelectOptions(sortedOptions); + } + } + + if (onDropdownVisibleChange) { + onDropdownVisibleChange(isDropdownVisible); + } + }; + + const dropdownRender = ( + originNode: ReactElement & { ref?: RefObject<HTMLElement> }, + ) => + dropDownRenderHelper( + originNode, + isDropdownVisible, + isLoading, + fullSelectOptions.length, + helperText, + error ? <Error error={error} /> : undefined, + ); + + const handleClear = () => { + setSelectValue(undefined); + if (onClear) { + onClear(); + } + }; + + useEffect(() => { + // when `options` list is updated from component prop, reset states + fetchedQueries.current.clear(); + setAllValuesLoaded(false); + setSelectOptions(EMPTY_OPTIONS); + }, [options]); + + useEffect(() => { + setSelectValue(value); + }, [value]); + + // Stop the invocation of the debounced function after unmounting + useEffect( + () => () => { + debouncedFetchPage.cancel(); + }, + [debouncedFetchPage], + ); + + useEffect(() => { + if (loadingEnabled && allowFetch) { + // trigger fetch every time inputValue changes + if (inputValue) { + debouncedFetchPage(inputValue, 0); + } else { + fetchPage('', 0); + } + } + }, [loadingEnabled, fetchPage, allowFetch, inputValue, debouncedFetchPage]); + + useEffect(() => { + if (loading !== undefined && loading !== isLoading) { + setIsLoading(loading); + } + }, [isLoading, loading]); + + const clearCache = () => fetchedQueries.current.clear(); + + useImperativeHandle( + ref, + () => ({ + ...(ref.current as HTMLInputElement), + clearCache, + }), + [ref], + ); + + return ( + <StyledContainer headerPosition={headerPosition}> + {header && ( + <StyledHeader headerPosition={headerPosition}>{header}</StyledHeader> + )} + <StyledSelect + allowClear={!isLoading && allowClear} + aria-label={ariaLabel || name} + dropdownRender={dropdownRender} + filterOption={handleFilterOption} + filterSort={sortComparatorWithSearch} + getPopupContainer={ + getPopupContainer || (triggerNode => triggerNode.parentNode) + } + headerPosition={headerPosition} + labelInValue + maxTagCount={maxTagCount} + mode={mappedMode} + notFoundContent={isLoading ? t('Loading...') : notFoundContent} + onDeselect={handleOnDeselect} + onDropdownVisibleChange={handleOnDropdownVisibleChange} + onPopupScroll={handlePagination} + onSearch={showSearch ? handleOnSearch : undefined} + onSelect={handleOnSelect} + onClear={handleClear} + onChange={onChange} + options={ + hasCustomLabels(fullSelectOptions) ? undefined : fullSelectOptions + } + placeholder={placeholder} + showSearch={showSearch} + showArrow + tokenSeparators={tokenSeparators || TOKEN_SEPARATORS} + value={selectValue} + suffixIcon={getSuffixIcon(isLoading, showSearch, isDropdownVisible)} + menuItemSelectedIcon={ + invertSelection ? ( + <StyledStopOutlined iconSize="m" aria-label="stop" /> + ) : ( + <StyledCheckOutlined iconSize="m" aria-label="check" /> + ) + } + oneLine={oneLine} + tagRender={customTagRender} + {...props} + ref={ref} + > + {hasCustomLabels(fullSelectOptions) && + renderSelectOptions(fullSelectOptions)} + </StyledSelect> + </StyledContainer> + ); + }, +); + +export default AsyncSelect; diff --git a/superset-frontend/src/components/Select/CustomTag.tsx b/superset-frontend/src/components/Select/CustomTag.tsx new file mode 100644 index 000000000000..a7ffe10f6d54 --- /dev/null +++ b/superset-frontend/src/components/Select/CustomTag.tsx @@ -0,0 +1,82 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { Tag as AntdTag } from 'antd'; +import { styled } from '@superset-ui/core'; +import { useCSSTextTruncation } from 'src/hooks/useTruncation'; +import { Tooltip } from '../Tooltip'; +import { CustomTagProps } from './types'; +import { SELECT_ALL_VALUE } from './utils'; +import { NoElement } from './styles'; + +const StyledTag = styled(AntdTag)` + & .ant-tag-close-icon { + display: inline-flex; + align-items: center; + margin-left: ${({ theme }) => theme.gridUnit}px; + } + + & .tag-content { + overflow: hidden; + text-overflow: ellipsis; + } +`; + +// TODO: use antd Tag props instead of any. Currently it's causing a typescript error +const Tag = (props: any) => { + const [tagRef, tagIsTruncated] = useCSSTextTruncation<HTMLSpanElement>(); + return ( + <Tooltip title={tagIsTruncated ? props.children : null}> + <StyledTag {...props} className="ant-select-selection-item"> + <span className="tag-content" ref={tagRef}> + {props.children} + </span> + </StyledTag> + </Tooltip> + ); +}; + +/** + * Custom tag renderer + */ +export const customTagRender = (props: CustomTagProps) => { + const { label, value } = props; + + const onPreventMouseDown = (event: React.MouseEvent<HTMLElement>) => { + // if close icon is clicked, stop propagation to avoid opening the dropdown + const target = event.target as HTMLElement; + if ( + target.tagName === 'svg' || + target.tagName === 'path' || + (target.tagName === 'span' && + target.className.includes('ant-tag-close-icon')) + ) { + event.stopPropagation(); + } + }; + + if (value !== SELECT_ALL_VALUE) { + return ( + <Tag onMouseDown={onPreventMouseDown} {...(props as object)}> + {label} + </Tag> + ); + } + return <NoElement />; +}; diff --git a/superset-frontend/src/components/Select/Select.stories.tsx b/superset-frontend/src/components/Select/Select.stories.tsx index 5526c2fc2ac0..cb7224fdca3b 100644 --- a/superset-frontend/src/components/Select/Select.stories.tsx +++ b/superset-frontend/src/components/Select/Select.stories.tsx @@ -16,9 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -import React, { ReactNode, useState, useCallback } from 'react'; +import React from 'react'; import ControlHeader from 'src/explore/components/ControlHeader'; -import Select, { SelectProps, OptionsTypePage, OptionsType } from './Select'; +import { SelectOptionsType, SelectProps } from './types'; + +import Select from './Select'; export default { title: 'Select', @@ -27,7 +29,7 @@ export default { const DEFAULT_WIDTH = 200; -const options: OptionsType = [ +const options: SelectOptionsType = [ { label: 'Such an incredibly awesome long long label', value: 'Such an incredibly awesome long long label', @@ -130,6 +132,22 @@ const ARG_TYPES = { By default label and value. `, }, + oneLine: { + defaultValue: false, + description: `Sets maxTagCount to 1. The overflow tag is always displayed in + the same line, line wrapping is disabled. + When the dropdown is open, sets maxTagCount to 0, + displays only the overflow tag. + Requires '"mode=multiple"'. + `, + }, + maxTagCount: { + defaultValue: 4, + description: `Sets maxTagCount attribute. The overflow tag is displayed in + place of the remaining items. + Requires '"mode=multiple"'. + `, + }, }; const mountHeader = (type: String) => { @@ -140,14 +158,14 @@ const mountHeader = (type: String) => { header = ( <ControlHeader label="Control header" - warning="Example of warning messsage" + warning="Example of warning message" /> ); } return header; }; -const generateOptions = (opts: OptionsType, count: number) => { +const generateOptions = (opts: SelectOptionsType, count: number) => { let generated = opts.slice(); let iteration = 0; while (generated.length < count) { @@ -195,6 +213,8 @@ InteractiveSelect.args = { invertSelection: false, placeholder: 'Select ...', optionFilterProps: ['value', 'label', 'custom'], + oneLine: false, + maxTagCount: 4, }; InteractiveSelect.argTypes = { @@ -321,220 +341,3 @@ PageScroll.story = { }, }, }; - -const USERS = [ - 'John', - 'Liam', - 'Olivia', - 'Emma', - 'Noah', - 'Ava', - 'Oliver', - 'Elijah', - 'Charlotte', - 'Diego', - 'Evan', - 'Michael', - 'Giovanni', - 'Luca', - 'Paolo', - 'Francesca', - 'Chiara', - 'Sara', - 'Valentina', - 'Jessica', - 'Angelica', - 'Mario', - 'Marco', - 'Andrea', - 'Luigi', - 'Quarto', - 'Quinto', - 'Sesto', - 'Franco', - 'Sandro', - 'Alehandro', - 'Johnny', - 'Nikole', - 'Igor', - 'Sipatha', - 'Thami', - 'Munei', - 'Guilherme', - 'Umair', - 'Ashfaq', - 'Amna', - 'Irfan', - 'George', - 'Naseer', - 'Mohammad', - 'Rick', - 'Saliya', - 'Claire', - 'Benedetta', - 'Ilenia', -].sort(); - -export const AsyncSelect = ({ - fetchOnlyOnSearch, - withError, - withInitialValue, - responseTime, - ...rest -}: SelectProps & { - withError: boolean; - withInitialValue: boolean; - responseTime: number; -}) => { - const [requests, setRequests] = useState<ReactNode[]>([]); - - const getResults = (username?: string) => { - let results: { label: string; value: string }[] = []; - - if (!username) { - results = USERS.map(u => ({ - label: u, - value: u, - })); - } else { - const foundUsers = USERS.filter(u => u.toLowerCase().includes(username)); - if (foundUsers) { - results = foundUsers.map(u => ({ label: u, value: u })); - } else { - results = []; - } - } - return results; - }; - - const setRequestLog = (results: number, total: number, username?: string) => { - const request = ( - <> - Emulating network request with search <b>{username || 'empty'}</b> ...{' '} - <b> - {results}/{total} - </b>{' '} - results - </> - ); - - setRequests(requests => [request, ...requests]); - }; - - const fetchUserListPage = useCallback( - ( - search: string, - page: number, - pageSize: number, - ): Promise<OptionsTypePage> => { - const username = search.trim().toLowerCase(); - return new Promise(resolve => { - let results = getResults(username); - const totalCount = results.length; - const start = page * pageSize; - const deleteCount = - start + pageSize < totalCount ? pageSize : totalCount - start; - results = results.splice(start, deleteCount); - setRequestLog(start + results.length, totalCount, username); - setTimeout(() => { - resolve({ data: results, totalCount }); - }, responseTime * 1000); - }); - }, - [responseTime], - ); - - const fetchUserListError = async (): Promise<OptionsTypePage> => - new Promise((_, reject) => { - reject(new Error('Error while fetching the names from the server')); - }); - - return ( - <> - <div - style={{ - width: DEFAULT_WIDTH, - }} - > - <Select - {...rest} - fetchOnlyOnSearch={fetchOnlyOnSearch} - options={withError ? fetchUserListError : fetchUserListPage} - placeholder={fetchOnlyOnSearch ? 'Type anything' : 'Select...'} - value={ - withInitialValue - ? { label: 'Valentina', value: 'Valentina' } - : undefined - } - /> - </div> - <div - style={{ - position: 'absolute', - top: 32, - left: DEFAULT_WIDTH + 100, - height: 400, - width: 600, - overflowY: 'auto', - border: '1px solid #d9d9d9', - padding: 20, - }} - > - {requests.map((request, index) => ( - <p key={`request-${index}`}>{request}</p> - ))} - </div> - </> - ); -}; - -AsyncSelect.args = { - allowClear: false, - allowNewOptions: false, - fetchOnlyOnSearch: false, - pageSize: 10, - withError: false, - withInitialValue: false, - tokenSeparators: ['\n', '\t', ';'], -}; - -AsyncSelect.argTypes = { - ...ARG_TYPES, - header: { - table: { - disable: true, - }, - }, - invertSelection: { - table: { - disable: true, - }, - }, - pageSize: { - defaultValue: 10, - control: { - type: 'range', - min: 10, - max: 50, - step: 10, - }, - }, - responseTime: { - defaultValue: 0.5, - name: 'responseTime (seconds)', - control: { - type: 'range', - min: 0.5, - max: 5, - step: 0.5, - }, - }, -}; - -AsyncSelect.story = { - parameters: { - knobs: { - disable: true, - }, - }, -}; diff --git a/superset-frontend/src/components/Select/Select.test.tsx b/superset-frontend/src/components/Select/Select.test.tsx index 37a39204369f..f55299e3fc7b 100644 --- a/superset-frontend/src/components/Select/Select.test.tsx +++ b/superset-frontend/src/components/Select/Select.test.tsx @@ -19,13 +19,21 @@ import React from 'react'; import { render, screen, waitFor, within } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; -import { Select } from 'src/components'; +import Select from 'src/components/Select/Select'; +import { SELECT_ALL_VALUE } from './utils'; + +type Option = { + label: string; + value: number; + gender: string; + disabled?: boolean; +}; const ARIA_LABEL = 'Test'; const NEW_OPTION = 'Kyle'; const NO_DATA = 'No Data'; const LOADING = 'Loading...'; -const OPTIONS = [ +const OPTIONS: Option[] = [ { label: 'John', value: 1, gender: 'Male' }, { label: 'Liam', value: 2, gender: 'Male' }, { label: 'Olivia', value: 3, gender: 'Female' }, @@ -55,21 +63,6 @@ const NULL_OPTION = { label: '<NULL>', value: null } as unknown as { value: number; }; -const loadOptions = async (search: string, page: number, pageSize: number) => { - const totalCount = OPTIONS.length; - const start = page * pageSize; - const deleteCount = - start + pageSize < totalCount ? pageSize : totalCount - start; - const data = OPTIONS.filter(option => option.label.match(search)).splice( - start, - deleteCount, - ); - return { - data, - totalCount: OPTIONS.length, - }; -}; - const defaultProps = { allowClear: true, ariaLabel: ARIA_LABEL, @@ -79,6 +72,9 @@ const defaultProps = { showSearch: true, }; +const selectAllOptionLabel = (numOptions: number) => + `${String(SELECT_ALL_VALUE)} (${numOptions})`; + const getElementByClassName = (className: string) => document.querySelector(className)! as HTMLElement; @@ -92,6 +88,11 @@ const findSelectOption = (text: string) => within(getElementByClassName('.rc-virtual-list')).getByText(text), ); +const querySelectOption = (text: string) => + waitFor(() => + within(getElementByClassName('.rc-virtual-list')).queryByText(text), + ); + const findAllSelectOptions = () => waitFor(() => getElementsByClassName('.ant-select-item-option-content')); @@ -99,7 +100,12 @@ const findSelectValue = () => waitFor(() => getElementByClassName('.ant-select-selection-item')); const findAllSelectValues = () => - waitFor(() => getElementsByClassName('.ant-select-selection-item')); + waitFor(() => [...getElementsByClassName('.ant-select-selection-item')]); + +const findAllCheckedValues = () => + waitFor(() => [ + ...getElementsByClassName('.ant-select-item-option-selected'), + ]); const clearAll = () => userEvent.click(screen.getByLabelText('close-circle')); @@ -129,17 +135,24 @@ test('displays a header', async () => { expect(screen.getByText(headerText)).toBeInTheDocument(); }); -test('adds a new option if the value is not in the options', async () => { - const { rerender } = render( - <Select {...defaultProps} options={[]} value={OPTIONS[0]} />, - ); +test('adds a new option if the value is not in the options, when options are empty', async () => { + render(<Select {...defaultProps} options={[]} value={OPTIONS[0]} />); await open(); expect(await findSelectOption(OPTIONS[0].label)).toBeInTheDocument(); + const options = await findAllSelectOptions(); + expect(options).toHaveLength(1); + options.forEach((option, i) => + expect(option).toHaveTextContent(OPTIONS[i].label), + ); +}); - rerender( +test('adds a new option if the value is not in the options, when options have values', async () => { + render( <Select {...defaultProps} options={[OPTIONS[1]]} value={OPTIONS[0]} />, ); await open(); + expect(await findSelectOption(OPTIONS[0].label)).toBeInTheDocument(); + expect(await findSelectOption(OPTIONS[1].label)).toBeInTheDocument(); const options = await findAllSelectOptions(); expect(options).toHaveLength(2); options.forEach((option, i) => @@ -147,6 +160,16 @@ test('adds a new option if the value is not in the options', async () => { ); }); +test('does not add a new option if the value is already in the options', async () => { + render( + <Select {...defaultProps} options={[OPTIONS[0]]} value={OPTIONS[0]} />, + ); + await open(); + expect(await findSelectOption(OPTIONS[0].label)).toBeInTheDocument(); + const options = await findAllSelectOptions(); + expect(options).toHaveLength(1); +}); + test('inverts the selection', async () => { render(<Select {...defaultProps} invertSelection />); await open(); @@ -164,27 +187,6 @@ test('sort the options by label if no sort comparator is provided', async () => ); }); -test('sort the options using a custom sort comparator', async () => { - const sortComparator = ( - option1: typeof OPTIONS[0], - option2: typeof OPTIONS[0], - ) => option1.gender.localeCompare(option2.gender); - render( - <Select - {...defaultProps} - options={loadOptions} - sortComparator={sortComparator} - />, - ); - await open(); - const options = await findAllSelectOptions(); - const optionsPage = OPTIONS.slice(0, defaultProps.pageSize); - const sortedOptions = optionsPage.sort(sortComparator); - options.forEach((option, key) => { - expect(option).toHaveTextContent(sortedOptions[key].label); - }); -}); - test('should sort selected to top when in single mode', async () => { render(<Select {...defaultProps} mode="single" />); const originalLabels = OPTIONS.map(option => option.label); @@ -223,26 +225,37 @@ test('should sort selected to the top when in multi mode', async () => { let labels = originalLabels.slice(); await open(); - userEvent.click(await findSelectOption(labels[1])); - expect(await matchOrder(labels)).toBe(true); + userEvent.click(await findSelectOption(labels[2])); + expect( + await matchOrder([selectAllOptionLabel(originalLabels.length), ...labels]), + ).toBe(true); await type('{esc}'); await open(); - labels = labels.splice(1, 1).concat(labels); - expect(await matchOrder(labels)).toBe(true); + labels = labels.splice(2, 1).concat(labels); + expect( + await matchOrder([selectAllOptionLabel(originalLabels.length), ...labels]), + ).toBe(true); await open(); userEvent.click(await findSelectOption(labels[5])); await type('{esc}'); await open(); labels = [labels.splice(0, 1)[0], labels.splice(4, 1)[0]].concat(labels); - expect(await matchOrder(labels)).toBe(true); + expect( + await matchOrder([selectAllOptionLabel(originalLabels.length), ...labels]), + ).toBe(true); // should revert to original order clearAll(); await type('{esc}'); await open(); - expect(await matchOrder(originalLabels)).toBe(true); + expect( + await matchOrder([ + selectAllOptionLabel(originalLabels.length), + ...originalLabels, + ]), + ).toBe(true); }); test('searches for label or value', async () => { @@ -382,7 +395,7 @@ test('clear all the values', async () => { }); test('does not add a new option if allowNewOptions is false', async () => { - render(<Select {...defaultProps} options={loadOptions} />); + render(<Select {...defaultProps} options={OPTIONS} />); await open(); await type(NEW_OPTION); expect(await screen.findByText(NO_DATA)).toBeInTheDocument(); @@ -412,18 +425,18 @@ test('adds the null option when selected in multiple mode', async () => { expect(values[1]).toHaveTextContent(NULL_OPTION.label); }); -test('static - renders the select with default props', () => { +test('renders the select with default props', () => { render(<Select {...defaultProps} />); expect(getSelect()).toBeInTheDocument(); }); -test('static - opens the select without any data', async () => { +test('opens the select without any data', async () => { render(<Select {...defaultProps} options={[]} />); await open(); expect(screen.getByText(NO_DATA)).toBeInTheDocument(); }); -test('static - makes a selection in single mode', async () => { +test('makes a selection in single mode', async () => { render(<Select {...defaultProps} />); const optionText = 'Emma'; await open(); @@ -431,7 +444,7 @@ test('static - makes a selection in single mode', async () => { expect(await findSelectValue()).toHaveTextContent(optionText); }); -test('static - multiple selections in multiple mode', async () => { +test('multiple selections in multiple mode', async () => { render(<Select {...defaultProps} mode="multiple" />); await open(); const [firstOption, secondOption] = OPTIONS; @@ -442,7 +455,7 @@ test('static - multiple selections in multiple mode', async () => { expect(values[1]).toHaveTextContent(secondOption.label); }); -test('static - changes the selected item in single mode', async () => { +test('changes the selected item in single mode', async () => { const onChange = jest.fn(); render(<Select {...defaultProps} onChange={onChange} />); await open(); @@ -454,7 +467,7 @@ test('static - changes the selected item in single mode', async () => { label: firstOption.label, value: firstOption.value, }), - firstOption, + expect.objectContaining(firstOption), ); userEvent.click(await findSelectOption(secondOption.label)); expect(onChange).toHaveBeenCalledWith( @@ -462,12 +475,12 @@ test('static - changes the selected item in single mode', async () => { label: secondOption.label, value: secondOption.value, }), - secondOption, + expect.objectContaining(secondOption), ); expect(await findSelectValue()).toHaveTextContent(secondOption.label); }); -test('static - deselects an item in multiple mode', async () => { +test('deselects an item in multiple mode', async () => { render(<Select {...defaultProps} mode="multiple" />); await open(); const [firstOption, secondOption] = OPTIONS; @@ -483,35 +496,35 @@ test('static - deselects an item in multiple mode', async () => { expect(values[0]).toHaveTextContent(secondOption.label); }); -test('static - adds a new option if none is available and allowNewOptions is true', async () => { +test('adds a new option if none is available and allowNewOptions is true', async () => { render(<Select {...defaultProps} allowNewOptions />); await open(); await type(NEW_OPTION); expect(await findSelectOption(NEW_OPTION)).toBeInTheDocument(); }); -test('static - shows "No data" when allowNewOptions is false and a new option is entered', async () => { +test('shows "No data" when allowNewOptions is false and a new option is entered', async () => { render(<Select {...defaultProps} allowNewOptions={false} />); await open(); await type(NEW_OPTION); expect(await screen.findByText(NO_DATA)).toBeInTheDocument(); }); -test('static - does not show "No data" when allowNewOptions is true and a new option is entered', async () => { +test('does not show "No data" when allowNewOptions is true and a new option is entered', async () => { render(<Select {...defaultProps} allowNewOptions />); await open(); await type(NEW_OPTION); expect(screen.queryByText(NO_DATA)).not.toBeInTheDocument(); }); -test('static - does not show "Loading..." when allowNewOptions is false and a new option is entered', async () => { +test('does not show "Loading..." when allowNewOptions is false and a new option is entered', async () => { render(<Select {...defaultProps} allowNewOptions={false} />); await open(); await type(NEW_OPTION); expect(screen.queryByText(LOADING)).not.toBeInTheDocument(); }); -test('static - does not add a new option if the option already exists', async () => { +test('does not add a new option if the option already exists', async () => { render(<Select {...defaultProps} allowNewOptions />); const option = OPTIONS[0].label; await open(); @@ -519,12 +532,12 @@ test('static - does not add a new option if the option already exists', async () expect(await findSelectOption(option)).toBeInTheDocument(); }); -test('static - sets a initial value in single mode', async () => { +test('sets a initial value in single mode', async () => { render(<Select {...defaultProps} value={OPTIONS[0]} />); expect(await findSelectValue()).toHaveTextContent(OPTIONS[0].label); }); -test('static - sets a initial value in multiple mode', async () => { +test('sets a initial value in multiple mode', async () => { render( <Select {...defaultProps} @@ -537,7 +550,7 @@ test('static - sets a initial value in multiple mode', async () => { expect(values[1]).toHaveTextContent(OPTIONS[1].label); }); -test('static - searches for an item', async () => { +test('searches for an item', async () => { render(<Select {...defaultProps} />); const search = 'Oli'; await type(search); @@ -547,270 +560,327 @@ test('static - searches for an item', async () => { expect(options[1]).toHaveTextContent('Olivia'); }); -test('async - renders the select with default props', () => { - render(<Select {...defaultProps} options={loadOptions} />); - expect(getSelect()).toBeInTheDocument(); -}); - -test('async - opens the select without any data', async () => { - render( - <Select - {...defaultProps} - options={async () => ({ data: [], totalCount: 0 })} - />, - ); +test('triggers getPopupContainer if passed', async () => { + const getPopupContainer = jest.fn(); + render(<Select {...defaultProps} getPopupContainer={getPopupContainer} />); await open(); - expect(await screen.findByText(/no data/i)).toBeInTheDocument(); + expect(getPopupContainer).toHaveBeenCalled(); }); -test('async - displays the loading indicator when opening', async () => { - render(<Select {...defaultProps} options={loadOptions} />); - await waitFor(() => { - userEvent.click(getSelect()); - expect(screen.getByText(LOADING)).toBeInTheDocument(); - }); - expect(screen.queryByText(LOADING)).not.toBeInTheDocument(); +test('does not render a helper text by default', async () => { + render(<Select {...defaultProps} />); + await open(); + expect(screen.queryByRole('note')).not.toBeInTheDocument(); }); -test('async - makes a selection in single mode', async () => { - render(<Select {...defaultProps} options={loadOptions} />); - const optionText = 'Emma'; +test('renders a helper text when one is provided', async () => { + const helperText = 'Helper text'; + render(<Select {...defaultProps} helperText={helperText} />); await open(); - userEvent.click(await findSelectOption(optionText)); - expect(await findSelectValue()).toHaveTextContent(optionText); + expect(screen.getByRole('note')).toBeInTheDocument(); + expect(screen.queryByText(helperText)).toBeInTheDocument(); }); -test('async - multiple selections in multiple mode', async () => { - render(<Select {...defaultProps} options={loadOptions} mode="multiple" />); +test('finds an element with a numeric value and does not duplicate the options', async () => { + const options = [ + { label: 'a', value: 11 }, + { label: 'b', value: 12 }, + ]; + render(<Select {...defaultProps} options={options} allowNewOptions />); await open(); - const [firstOption, secondOption] = OPTIONS; - userEvent.click(await findSelectOption(firstOption.label)); - userEvent.click(await findSelectOption(secondOption.label)); - const values = await findAllSelectValues(); - expect(values[0]).toHaveTextContent(firstOption.label); - expect(values[1]).toHaveTextContent(secondOption.label); + await type('11'); + expect(await findSelectOption('a')).toBeInTheDocument(); + expect(await querySelectOption('11')).not.toBeInTheDocument(); }); -test('async - changes the selected item in single mode', async () => { - const onChange = jest.fn(); - render( - <Select {...defaultProps} options={loadOptions} onChange={onChange} />, - ); +test('render "Select all" for multi select', async () => { + render(<Select {...defaultProps} mode="multiple" options={OPTIONS} />); await open(); - const [firstOption, secondOption] = OPTIONS; - userEvent.click(await findSelectOption(firstOption.label)); - expect(onChange).toHaveBeenCalledWith( - expect.objectContaining({ - label: firstOption.label, - value: firstOption.value, - }), - firstOption, - ); - expect(await findSelectValue()).toHaveTextContent(firstOption.label); - userEvent.click(await findSelectOption(secondOption.label)); - expect(onChange).toHaveBeenCalledWith( - expect.objectContaining({ - label: secondOption.label, - value: secondOption.value, - }), - secondOption, - ); - expect(await findSelectValue()).toHaveTextContent(secondOption.label); + const options = await findAllSelectOptions(); + expect(options[0]).toHaveTextContent(selectAllOptionLabel(OPTIONS.length)); }); -test('async - deselects an item in multiple mode', async () => { - render(<Select {...defaultProps} options={loadOptions} mode="multiple" />); +test('does not render "Select all" for single select', async () => { + render(<Select {...defaultProps} options={OPTIONS} mode="single" />); await open(); - const option3 = OPTIONS[2]; - const option8 = OPTIONS[7]; - userEvent.click(await findSelectOption(option8.label)); - userEvent.click(await findSelectOption(option3.label)); - - let options = await findAllSelectOptions(); - expect(options).toHaveLength(Math.min(defaultProps.pageSize, OPTIONS.length)); - expect(options[0]).toHaveTextContent(OPTIONS[0].label); - expect(options[1]).toHaveTextContent(OPTIONS[1].label); + expect( + screen.queryByText(selectAllOptionLabel(OPTIONS.length)), + ).not.toBeInTheDocument(); +}); - await type('{esc}'); +test('does not render "Select all" for an empty multiple select', async () => { + render(<Select {...defaultProps} options={[]} mode="multiple" />); await open(); - - // should rank selected options to the top after menu closes - options = await findAllSelectOptions(); - expect(options).toHaveLength(Math.min(defaultProps.pageSize, OPTIONS.length)); - expect(options[0]).toHaveTextContent(option3.label); - expect(options[1]).toHaveTextContent(option8.label); - - let values = await findAllSelectValues(); - expect(values).toHaveLength(2); - // should keep the order by which the options were selected - expect(values[0]).toHaveTextContent(option8.label); - expect(values[1]).toHaveTextContent(option3.label); - - userEvent.click(await findSelectOption(option3.label)); - values = await findAllSelectValues(); - expect(values.length).toBe(1); - expect(values[0]).toHaveTextContent(option8.label); + expect( + screen.queryByText(selectAllOptionLabel(OPTIONS.length)), + ).not.toBeInTheDocument(); }); -test('async - adds a new option if none is available and allowNewOptions is true', async () => { - render(<Select {...defaultProps} options={loadOptions} allowNewOptions />); +test('does not render "Select all" when searching', async () => { + render(<Select {...defaultProps} options={OPTIONS} mode="multiple" />); await open(); - await type(NEW_OPTION); - expect(await findSelectOption(NEW_OPTION)).toBeInTheDocument(); + await type('Select'); + expect( + screen.queryByText(selectAllOptionLabel(OPTIONS.length)), + ).not.toBeInTheDocument(); }); -test('async - does not add a new option if the option already exists', async () => { - render(<Select {...defaultProps} options={loadOptions} allowNewOptions />); - const option = OPTIONS[0].label; +test('does not render "Select all" as one of the tags after selection', async () => { + render(<Select {...defaultProps} options={OPTIONS} mode="multiple" />); await open(); - await type(option); - await waitFor(() => { - const array = within( - getElementByClassName('.rc-virtual-list'), - ).getAllByText(option); - expect(array.length).toBe(1); - }); + userEvent.click(await findSelectOption(selectAllOptionLabel(OPTIONS.length))); + const values = await findAllSelectValues(); + expect(values[0]).not.toHaveTextContent(selectAllOptionLabel(OPTIONS.length)); }); -test('async - shows "No data" when allowNewOptions is false and a new option is entered', async () => { +test('keeps "Select all" at the top after a selection', async () => { + const selected = OPTIONS[2]; render( <Select {...defaultProps} - options={loadOptions} - allowNewOptions={false} - showSearch + options={OPTIONS.slice(0, 10)} + mode="multiple" + value={[selected]} />, ); await open(); - await type(NEW_OPTION); - expect(await screen.findByText(NO_DATA)).toBeInTheDocument(); + const options = await findAllSelectOptions(); + expect(options[0]).toHaveTextContent(selectAllOptionLabel(10)); + expect(options[1]).toHaveTextContent(selected.label); }); -test('async - does not show "No data" when allowNewOptions is true and a new option is entered', async () => { - render(<Select {...defaultProps} options={loadOptions} allowNewOptions />); +test('selects all values', async () => { + render( + <Select + {...defaultProps} + options={OPTIONS} + mode="multiple" + maxTagCount={0} + />, + ); await open(); - await type(NEW_OPTION); - expect(screen.queryByText(NO_DATA)).not.toBeInTheDocument(); -}); - -test('async - sets a initial value in single mode', async () => { - render(<Select {...defaultProps} options={loadOptions} value={OPTIONS[0]} />); - expect(await findSelectValue()).toHaveTextContent(OPTIONS[0].label); + userEvent.click(await findSelectOption(selectAllOptionLabel(OPTIONS.length))); + const values = await findAllSelectValues(); + expect(values.length).toBe(1); + expect(values[0]).toHaveTextContent(`+ ${OPTIONS.length} ...`); }); -test('async - sets a initial value in multiple mode', async () => { +test('unselects all values', async () => { render( <Select {...defaultProps} + options={OPTIONS} mode="multiple" - options={loadOptions} - value={[OPTIONS[0], OPTIONS[1]]} + maxTagCount={0} />, ); - const values = await findAllSelectValues(); - expect(values[0]).toHaveTextContent(OPTIONS[0].label); - expect(values[1]).toHaveTextContent(OPTIONS[1].label); + await open(); + userEvent.click(await findSelectOption(selectAllOptionLabel(OPTIONS.length))); + let values = await findAllSelectValues(); + expect(values.length).toBe(1); + expect(values[0]).toHaveTextContent(`+ ${OPTIONS.length} ...`); + userEvent.click(await findSelectOption(selectAllOptionLabel(OPTIONS.length))); + values = await findAllSelectValues(); + expect(values.length).toBe(0); }); -test('async - searches for matches in both loaded and unloaded pages', async () => { - render(<Select {...defaultProps} options={loadOptions} />); +test('deselecting a value also deselects "Select all"', async () => { + render( + <Select + {...defaultProps} + options={OPTIONS.slice(0, 10)} + mode="multiple" + maxTagCount={0} + />, + ); await open(); - await type('and'); - - let options = await findAllSelectOptions(); - expect(options.length).toBe(1); - expect(options[0]).toHaveTextContent('Alehandro'); - - await screen.findByText('Sandro'); - options = await findAllSelectOptions(); - expect(options.length).toBe(2); - expect(options[0]).toHaveTextContent('Alehandro'); - expect(options[1]).toHaveTextContent('Sandro'); + userEvent.click(await findSelectOption(selectAllOptionLabel(10))); + let values = await findAllCheckedValues(); + expect(values[0]).toHaveTextContent(selectAllOptionLabel(10)); + userEvent.click(await findSelectOption(OPTIONS[0].label)); + values = await findAllCheckedValues(); + expect(values[0]).not.toHaveTextContent(selectAllOptionLabel(10)); }); -test('async - searches for an item in a page not loaded', async () => { - const mock = jest.fn(loadOptions); - render(<Select {...defaultProps} options={mock} />); - const search = 'Sandro'; +test('selecting all values also selects "Select all"', async () => { + render( + <Select + {...defaultProps} + options={OPTIONS.slice(0, 10)} + mode="multiple" + maxTagCount={0} + />, + ); await open(); - await type(search); - await waitFor(() => expect(mock).toHaveBeenCalledTimes(2)); const options = await findAllSelectOptions(); - expect(options.length).toBe(1); - expect(options[0]).toHaveTextContent(search); + options.forEach((option, index) => { + // skip select all + if (index > 0) { + userEvent.click(option); + } + }); + const values = await findAllSelectValues(); + expect(values[0]).toHaveTextContent(`+ 10 ...`); }); -test('async - does not fetches data when rendering', async () => { - const loadOptions = jest.fn(async () => ({ data: [], totalCount: 0 })); - render(<Select {...defaultProps} options={loadOptions} />); - expect(loadOptions).not.toHaveBeenCalled(); +test('Renders only 1 tag and an overflow tag in oneLine mode', () => { + render( + <Select + {...defaultProps} + value={[OPTIONS[0], OPTIONS[1], OPTIONS[2]]} + mode="multiple" + oneLine + />, + ); + expect(screen.getByText(OPTIONS[0].label)).toBeVisible(); + expect(screen.queryByText(OPTIONS[1].label)).not.toBeInTheDocument(); + expect(screen.queryByText(OPTIONS[2].label)).not.toBeInTheDocument(); + expect(screen.getByText('+ 2 ...')).toBeVisible(); }); -test('async - fetches data when opening', async () => { - const loadOptions = jest.fn(async () => ({ data: [], totalCount: 0 })); - render(<Select {...defaultProps} options={loadOptions} />); +test('Renders only an overflow tag if dropdown is open in oneLine mode', async () => { + render( + <Select + {...defaultProps} + value={[OPTIONS[0], OPTIONS[1], OPTIONS[2]]} + mode="multiple" + oneLine + />, + ); await open(); - expect(loadOptions).toHaveBeenCalled(); -}); -test('async - fetches data only after a search input is entered if fetchOnlyOnSearch is true', async () => { - const loadOptions = jest.fn(async () => ({ data: [], totalCount: 0 })); - render(<Select {...defaultProps} options={loadOptions} fetchOnlyOnSearch />); - await open(); - await waitFor(() => expect(loadOptions).not.toHaveBeenCalled()); - await type('search'); - await waitFor(() => expect(loadOptions).toHaveBeenCalled()); + const withinSelector = within(getElementByClassName('.ant-select-selector')); + await waitFor(() => { + expect( + withinSelector.queryByText(OPTIONS[0].label), + ).not.toBeInTheDocument(); + expect( + withinSelector.queryByText(OPTIONS[1].label), + ).not.toBeInTheDocument(); + expect( + withinSelector.queryByText(OPTIONS[2].label), + ).not.toBeInTheDocument(); + expect(withinSelector.getByText('+ 3 ...')).toBeVisible(); + }); + + await type('{esc}'); + + expect(await withinSelector.findByText(OPTIONS[0].label)).toBeVisible(); + expect(withinSelector.queryByText(OPTIONS[1].label)).not.toBeInTheDocument(); + expect(withinSelector.queryByText(OPTIONS[2].label)).not.toBeInTheDocument(); + expect(withinSelector.getByText('+ 2 ...')).toBeVisible(); }); -test('async - displays an error message when an exception is thrown while fetching', async () => { - const error = 'Fetch error'; - const loadOptions = async () => { - throw new Error(error); - }; - render(<Select {...defaultProps} options={loadOptions} />); +test('+N tag does not count the "Select All" option', async () => { + render( + <Select + {...defaultProps} + options={OPTIONS.slice(0, 10)} + mode="multiple" + maxTagCount={0} + />, + ); await open(); - expect(screen.getByText(error)).toBeInTheDocument(); + userEvent.click(await findSelectOption(selectAllOptionLabel(10))); + const values = await findAllSelectValues(); + // maxTagCount is 0 so the +N tag should be + 10 ... + expect(values[0]).toHaveTextContent('+ 10 ...'); }); -test('async - does not fire a new request for the same search input', async () => { - const loadOptions = jest.fn(async () => ({ data: [], totalCount: 0 })); - render(<Select {...defaultProps} options={loadOptions} fetchOnlyOnSearch />); - await type('search'); - expect(await screen.findByText(NO_DATA)).toBeInTheDocument(); - expect(loadOptions).toHaveBeenCalledTimes(1); - clearAll(); - await type('search'); - expect(await screen.findByText(LOADING)).toBeInTheDocument(); - expect(loadOptions).toHaveBeenCalledTimes(1); +test('"Select All" is checked when unchecking a newly added option and all the other options are still selected', async () => { + render( + <Select + {...defaultProps} + options={OPTIONS.slice(0, 10)} + mode="multiple" + allowNewOptions + />, + ); + await open(); + userEvent.click(await findSelectOption(selectAllOptionLabel(10))); + expect(await findSelectOption(selectAllOptionLabel(10))).toBeInTheDocument(); + // add a new option + await type(`${NEW_OPTION}{enter}`); + expect(await findSelectOption(selectAllOptionLabel(11))).toBeInTheDocument(); + expect(await findSelectOption(NEW_OPTION)).toBeInTheDocument(); + // select all should be selected + let values = await findAllCheckedValues(); + expect(values[0]).toHaveTextContent(selectAllOptionLabel(11)); + // remove new option + userEvent.click(await findSelectOption(NEW_OPTION)); + // select all should still be selected + values = await findAllCheckedValues(); + expect(values[0]).toHaveTextContent(selectAllOptionLabel(10)); + expect(await findSelectOption(selectAllOptionLabel(10))).toBeInTheDocument(); +}); + +test('does not render "Select All" when there are 0 or 1 options', async () => { + const { rerender } = render( + <Select {...defaultProps} options={[]} mode="multiple" allowNewOptions />, + ); + await open(); + expect(screen.queryByText(selectAllOptionLabel(0))).not.toBeInTheDocument(); + rerender( + <Select + {...defaultProps} + options={OPTIONS.slice(0, 1)} + mode="multiple" + allowNewOptions + />, + ); + expect(screen.queryByText(selectAllOptionLabel(1))).not.toBeInTheDocument(); + await type(`${NEW_OPTION}{enter}`); + expect(screen.queryByText(selectAllOptionLabel(2))).toBeInTheDocument(); }); -test('async - does not fire a new request if all values have been fetched', async () => { - const mock = jest.fn(loadOptions); - const search = 'George'; - const pageSize = OPTIONS.length; - render(<Select {...defaultProps} options={mock} pageSize={pageSize} />); +test('do not count unselected disabled options in "Select All"', async () => { + const options = [...OPTIONS]; + options[0].disabled = true; + options[1].disabled = true; + render( + <Select + {...defaultProps} + options={options} + mode="multiple" + value={options[0]} + />, + ); await open(); - expect(mock).toHaveBeenCalledTimes(1); - await type(search); - expect(await findSelectOption(search)).toBeInTheDocument(); - expect(mock).toHaveBeenCalledTimes(1); + // We have 2 options disabled but one is selected initially + // Select All should count one and ignore the other + expect( + screen.getByText(selectAllOptionLabel(OPTIONS.length - 1)), + ).toBeInTheDocument(); }); -test('async - fires a new request if all values have not been fetched', async () => { - const mock = jest.fn(loadOptions); - const pageSize = OPTIONS.length / 2; - render(<Select {...defaultProps} options={mock} pageSize={pageSize} />); +test('"Select All" does not affect disabled options', async () => { + const options = [...OPTIONS]; + options[0].disabled = true; + options[1].disabled = true; + render( + <Select + {...defaultProps} + options={options} + mode="multiple" + value={options[0]} + />, + ); await open(); - expect(mock).toHaveBeenCalledTimes(1); - await type('or'); - // `George` is on the first page so when it appears the API has not been called again - expect(await findSelectOption('George')).toBeInTheDocument(); - expect(mock).toHaveBeenCalledTimes(1); + // We have 2 options disabled but one is selected initially + expect(await findSelectValue()).toHaveTextContent(options[0].label); + expect(await findSelectValue()).not.toHaveTextContent(options[1].label); + + // Checking Select All shouldn't affect the disabled options + const selectAll = selectAllOptionLabel(OPTIONS.length - 1); + userEvent.click(await findSelectOption(selectAll)); + expect(await findSelectValue()).toHaveTextContent(options[0].label); + expect(await findSelectValue()).not.toHaveTextContent(options[1].label); - // `Igor` is on the second paged API request - expect(await findSelectOption('Igor')).toBeInTheDocument(); - expect(mock).toHaveBeenCalledTimes(2); + // Unchecking Select All shouldn't affect the disabled options + userEvent.click(await findSelectOption(selectAll)); + expect(await findSelectValue()).toHaveTextContent(options[0].label); + expect(await findSelectValue()).not.toHaveTextContent(options[1].label); }); /* diff --git a/superset-frontend/src/components/Select/Select.tsx b/superset-frontend/src/components/Select/Select.tsx index b018b53a8b93..11f66d8dba52 100644 --- a/superset-frontend/src/components/Select/Select.tsx +++ b/superset-frontend/src/components/Select/Select.tsx @@ -19,260 +19,50 @@ import React, { forwardRef, ReactElement, - ReactNode, RefObject, - UIEvent, useEffect, useMemo, useState, - useRef, useCallback, } from 'react'; -import { ensureIsArray, styled, t } from '@superset-ui/core'; -import AntdSelect, { - SelectProps as AntdSelectProps, - SelectValue as AntdSelectValue, - LabeledValue as AntdLabeledValue, -} from 'antd/lib/select'; -import { DownOutlined, SearchOutlined } from '@ant-design/icons'; -import { Spin } from 'antd'; -import debounce from 'lodash/debounce'; +import { + ensureIsArray, + formatNumber, + NumberFormats, + t, +} from '@superset-ui/core'; +import AntdSelect, { LabeledValue as AntdLabeledValue } from 'antd/lib/select'; import { isEqual } from 'lodash'; -import Icons from 'src/components/Icons'; -import { getClientErrorObject } from 'src/utils/getClientErrorObject'; -import { SLOW_DEBOUNCE } from 'src/constants'; -import { rankedSearchCompare } from 'src/utils/rankedSearchCompare'; -import { getValue, hasOption, isLabeledValue } from './utils'; - -const { Option } = AntdSelect; - -export const SELECT_ALL_STRING = 'Select all'; - -type AntdSelectAllProps = AntdSelectProps<AntdSelectValue>; - -type PickedSelectProps = Pick< - AntdSelectAllProps, - | 'allowClear' - | 'autoFocus' - | 'disabled' - | 'filterOption' - | 'labelInValue' - | 'loading' - | 'notFoundContent' - | 'onChange' - | 'onClear' - | 'onFocus' - | 'onBlur' - | 'onDropdownVisibleChange' - | 'placeholder' - | 'showSearch' - | 'tokenSeparators' - | 'value' ->; - -export type OptionsType = Exclude<AntdSelectAllProps['options'], undefined>; - -export type OptionsTypePage = { - data: OptionsType; - totalCount: number; -}; - -export type OptionsPagePromise = ( - search: string, - page: number, - pageSize: number, -) => Promise<OptionsTypePage>; - -export interface SelectProps extends PickedSelectProps { - /** - * It enables the user to create new options. - * Can be used with standard or async select types. - * Can be used with any mode, single or multiple. - * False by default. - * */ - allowNewOptions?: boolean; - /** - * It adds the aria-label tag for accessibility standards. - * Must be plain English and localized. - */ - ariaLabel: string; - /** - * It adds a header on top of the Select. - * Can be any ReactNode. - */ - header?: ReactNode; - /** - * It fires a request against the server after - * the first interaction and not on render. - * Works in async mode only (See the options property). - * True by default. - */ - lazyLoading?: boolean; - /** - * It defines whether the Select should allow for the - * selection of multiple options or single. - * Single by default. - */ - mode?: 'single' | 'multiple'; - /** - * Deprecated. - * Prefer ariaLabel instead. - */ - name?: string; // discourage usage - /** - * It allows to define which properties of the option object - * should be looked for when searching. - * By default label and value. - */ - optionFilterProps?: string[]; - /** - * It defines the options of the Select. - * The options can be static, an array of options. - * The options can also be async, a promise that returns - * an array of options. - */ - options: OptionsType | OptionsPagePromise; - /** - * It defines how many results should be included - * in the query response. - * Works in async mode only (See the options property). - */ - pageSize?: number; - /** - * It shows a stop-outlined icon at the far right of a selected - * option instead of the default checkmark. - * Useful to better indicate to the user that by clicking on a selected - * option it will be de-selected. - * False by default. - */ - invertSelection?: boolean; - /** - * It fires a request against the server only after - * searching. - * Works in async mode only (See the options property). - * Undefined by default. - */ - fetchOnlyOnSearch?: boolean; - /** - * It provides a callback function when an error - * is generated after a request is fired. - * Works in async mode only (See the options property). - */ - onError?: (error: string) => void; - /** - * Customize how filtered options are sorted while users search. - * Will not apply to predefined `options` array when users are not searching. - */ - sortComparator?: typeof DEFAULT_SORT_COMPARATOR; -} - -const StyledContainer = styled.div` - display: flex; - flex-direction: column; - width: 100%; -`; - -const StyledSelect = styled(AntdSelect)` - ${({ theme }) => ` - && .ant-select-selector { - border-radius: ${theme.gridUnit}px; - } - // Open the dropdown when clicking on the suffix - // This is fixed in version 4.16 - .ant-select-arrow .anticon:not(.ant-select-suffix) { - pointer-events: none; - } - `} -`; - -const StyledStopOutlined = styled(Icons.StopOutlined)` - vertical-align: 0; -`; - -const StyledCheckOutlined = styled(Icons.CheckOutlined)` - vertical-align: 0; -`; - -const StyledError = styled.div` - ${({ theme }) => ` - display: flex; - justify-content: center; - align-items: flex-start; - width: 100%; - padding: ${theme.gridUnit * 2}px; - color: ${theme.colors.error.base}; - & svg { - margin-right: ${theme.gridUnit * 2}px; - } - `} -`; - -const StyledErrorMessage = styled.div` - overflow: hidden; - text-overflow: ellipsis; -`; - -const StyledSpin = styled(Spin)` - margin-top: ${({ theme }) => -theme.gridUnit}px; -`; - -const StyledLoadingText = styled.div` - ${({ theme }) => ` - margin-left: ${theme.gridUnit * 3}px; - line-height: ${theme.gridUnit * 8}px; - color: ${theme.colors.grayscale.light1}; - `} -`; - -const MAX_TAG_COUNT = 4; -const TOKEN_SEPARATORS = [',', '\n', '\t', ';']; -const DEFAULT_PAGE_SIZE = 100; -const EMPTY_OPTIONS: OptionsType = []; - -const Error = ({ error }: { error: string }) => ( - <StyledError> - <Icons.ErrorSolid /> <StyledErrorMessage>{error}</StyledErrorMessage> - </StyledError> -); - -export const DEFAULT_SORT_COMPARATOR = ( - a: AntdLabeledValue, - b: AntdLabeledValue, - search?: string, -) => { - let aText: string | undefined; - let bText: string | undefined; - if (typeof a.label === 'string' && typeof b.label === 'string') { - aText = a.label; - bText = b.label; - } else if (typeof a.value === 'string' && typeof b.value === 'string') { - aText = a.value; - bText = b.value; - } - // sort selected options first - if (typeof aText === 'string' && typeof bText === 'string') { - if (search) { - return rankedSearchCompare(aText, bText, search); - } - return aText.localeCompare(bText); - } - return (a.value as number) - (b.value as number); -}; - -/** - * It creates a comparator to check for a specific property. - * Can be used with string and number property values. - * */ -export const propertyComparator = - (property: string) => (a: AntdLabeledValue, b: AntdLabeledValue) => { - if (typeof a[property] === 'string' && typeof b[property] === 'string') { - return a[property].localeCompare(b[property]); - } - return (a[property] as number) - (b[property] as number); - }; - -const getQueryCacheKey = (value: string, page: number, pageSize: number) => - `${value};${page};${pageSize}`; +import { + getValue, + hasOption, + isLabeledValue, + renderSelectOptions, + sortSelectedFirstHelper, + sortComparatorWithSearchHelper, + handleFilterOptionHelper, + dropDownRenderHelper, + getSuffixIcon, + SELECT_ALL_VALUE, + selectAllOption, + mapValues, + mapOptions, +} from './utils'; +import { SelectOptionsType, SelectProps } from './types'; +import { + StyledCheckOutlined, + StyledContainer, + StyledHeader, + StyledSelect, + StyledStopOutlined, +} from './styles'; +import { + EMPTY_OPTIONS, + MAX_TAG_COUNT, + TOKEN_SEPARATORS, + DEFAULT_SORT_COMPARATOR, +} from './constants'; +import { customTagRender } from './CustomTag'; /** * This component is a customized version of the Antdesign 4.X Select component @@ -288,451 +78,439 @@ const getQueryCacheKey = (value: string, page: number, pageSize: number) => * Each of the categories come with different abilities. For a comprehensive guide please refer to * the storybook in src/components/Select/Select.stories.tsx. */ -const Select = ( - { - allowClear, - allowNewOptions = false, - ariaLabel, - fetchOnlyOnSearch, - filterOption = true, - header = null, - invertSelection = false, - labelInValue = false, - lazyLoading = true, - loading, - mode = 'single', - name, - notFoundContent, - onError, - onChange, - onClear, - onDropdownVisibleChange, - optionFilterProps = ['label', 'value'], - options, - pageSize = DEFAULT_PAGE_SIZE, - placeholder = t('Select ...'), - showSearch = true, - sortComparator = DEFAULT_SORT_COMPARATOR, - tokenSeparators, - value, - ...props - }: SelectProps, - ref: RefObject<HTMLInputElement>, -) => { - const isAsync = typeof options === 'function'; - const isSingleMode = mode === 'single'; - const shouldShowSearch = isAsync || allowNewOptions ? true : showSearch; - const [selectValue, setSelectValue] = useState(value); - const [inputValue, setInputValue] = useState(''); - const [isLoading, setIsLoading] = useState(loading); - const [error, setError] = useState(''); - const [isDropdownVisible, setIsDropdownVisible] = useState(false); - const [page, setPage] = useState(0); - const [totalCount, setTotalCount] = useState(0); - const [loadingEnabled, setLoadingEnabled] = useState(!lazyLoading); - const [allValuesLoaded, setAllValuesLoaded] = useState(false); - const fetchedQueries = useRef(new Map<string, number>()); - const mappedMode = isSingleMode - ? undefined - : allowNewOptions - ? 'tags' - : 'multiple'; - const allowFetch = !fetchOnlyOnSearch || inputValue; - - const sortSelectedFirst = useCallback( - (a: AntdLabeledValue, b: AntdLabeledValue) => - selectValue && a.value !== undefined && b.value !== undefined - ? Number(hasOption(b.value, selectValue)) - - Number(hasOption(a.value, selectValue)) - : 0, - [selectValue], - ); - const sortComparatorWithSearch = useCallback( - (a: AntdLabeledValue, b: AntdLabeledValue) => - sortSelectedFirst(a, b) || sortComparator(a, b, inputValue), - [inputValue, sortComparator, sortSelectedFirst], - ); - const sortComparatorForNoSearch = useCallback( - (a: AntdLabeledValue, b: AntdLabeledValue) => - sortSelectedFirst(a, b) || - // Only apply the custom sorter in async mode because we should - // preserve the options order as much as possible. - (isAsync ? sortComparator(a, b, '') : 0), - [isAsync, sortComparator, sortSelectedFirst], - ); - - const initialOptions = useMemo( - () => (options && Array.isArray(options) ? options.slice() : EMPTY_OPTIONS), - [options], - ); - const initialOptionsSorted = useMemo( - () => initialOptions.slice().sort(sortComparatorForNoSearch), - [initialOptions, sortComparatorForNoSearch], - ); - - const [selectOptions, setSelectOptions] = - useState<OptionsType>(initialOptionsSorted); - - // add selected values to options list if they are not in it - const fullSelectOptions = useMemo(() => { - const missingValues: OptionsType = ensureIsArray(selectValue) - .filter(opt => !hasOption(getValue(opt), selectOptions)) - .map(opt => - isLabeledValue(opt) ? opt : { value: opt, label: String(opt) }, - ); - return missingValues.length > 0 - ? missingValues.concat(selectOptions) - : selectOptions; - }, [selectOptions, selectValue]); - - const hasCustomLabels = fullSelectOptions.some(opt => !!opt?.customLabel); - - const handleOnSelect = ( - selectedItem: string | number | AntdLabeledValue | undefined, - ) => { - if (isSingleMode) { - setSelectValue(selectedItem); - } else { - setSelectValue(previousState => { - const array = ensureIsArray(previousState); - const value = getValue(selectedItem); - // Tokenized values can contain duplicated values - if (!hasOption(value, array)) { - const result = [...array, selectedItem]; - return isLabeledValue(selectedItem) - ? (result as AntdLabeledValue[]) - : (result as (string | number)[]); - } - return previousState; - }); - } - setInputValue(''); - }; - - const handleOnDeselect = ( - value: string | number | AntdLabeledValue | undefined, +const Select = forwardRef( + ( + { + allowClear, + allowNewOptions = false, + ariaLabel, + filterOption = true, + header = null, + headerPosition = 'top', + helperText, + invertSelection = false, + labelInValue = false, + loading, + mode = 'single', + name, + notFoundContent, + onChange, + onClear, + onDropdownVisibleChange, + optionFilterProps = ['label', 'value'], + options, + placeholder = t('Select ...'), + showSearch = true, + sortComparator = DEFAULT_SORT_COMPARATOR, + tokenSeparators, + value, + getPopupContainer, + oneLine, + maxTagCount: propsMaxTagCount, + ...props + }: SelectProps, + ref: RefObject<HTMLInputElement>, ) => { - if (Array.isArray(selectValue)) { - if (isLabeledValue(value)) { - const array = selectValue as AntdLabeledValue[]; - setSelectValue(array.filter(element => element.value !== value.value)); - } else { - const array = selectValue as (string | number)[]; - setSelectValue(array.filter(element => element !== value)); + const isSingleMode = mode === 'single'; + const shouldShowSearch = allowNewOptions ? true : showSearch; + const [selectValue, setSelectValue] = useState(value); + const [inputValue, setInputValue] = useState(''); + const [isLoading, setIsLoading] = useState(loading); + const [isDropdownVisible, setIsDropdownVisible] = useState(false); + const [maxTagCount, setMaxTagCount] = useState( + propsMaxTagCount ?? MAX_TAG_COUNT, + ); + + useEffect(() => { + if (oneLine) { + setMaxTagCount(isDropdownVisible ? 0 : 1); } - } - setInputValue(''); - }; - - const internalOnError = useCallback( - (response: Response) => - getClientErrorObject(response).then(e => { - const { error } = e; - setError(error); - - if (onError) { - onError(error); - } - }), - [onError], - ); - - const mergeData = useCallback( - (data: OptionsType) => { - let mergedData: OptionsType = []; - if (data && Array.isArray(data) && data.length) { - // unique option values should always be case sensitive so don't lowercase - const dataValues = new Set(data.map(opt => opt.value)); - // merges with existing and creates unique options - setSelectOptions(prevOptions => { - mergedData = prevOptions - .filter(previousOption => !dataValues.has(previousOption.value)) - .concat(data) - .sort(sortComparatorForNoSearch); - return mergedData; + }, [isDropdownVisible, oneLine]); + + const mappedMode = isSingleMode + ? undefined + : allowNewOptions + ? 'tags' + : 'multiple'; + + const { Option } = AntdSelect; + + const sortSelectedFirst = useCallback( + (a: AntdLabeledValue, b: AntdLabeledValue) => + sortSelectedFirstHelper(a, b, selectValue), + [selectValue], + ); + const sortComparatorWithSearch = useCallback( + (a: AntdLabeledValue, b: AntdLabeledValue) => + sortComparatorWithSearchHelper( + a, + b, + inputValue, + sortSelectedFirst, + sortComparator, + ), + [inputValue, sortComparator, sortSelectedFirst], + ); + + const initialOptions = useMemo( + () => + options && Array.isArray(options) ? options.slice() : EMPTY_OPTIONS, + [options], + ); + const initialOptionsSorted = useMemo( + () => initialOptions.slice().sort(sortSelectedFirst), + [initialOptions, sortSelectedFirst], + ); + + const [selectOptions, setSelectOptions] = + useState<SelectOptionsType>(initialOptionsSorted); + + // add selected values to options list if they are not in it + const fullSelectOptions = useMemo(() => { + const missingValues: SelectOptionsType = ensureIsArray(selectValue) + .filter(opt => !hasOption(getValue(opt), selectOptions)) + .map(opt => + isLabeledValue(opt) ? opt : { value: opt, label: String(opt) }, + ); + const result = + missingValues.length > 0 + ? missingValues.concat(selectOptions) + : selectOptions; + return result.filter(opt => opt.value !== SELECT_ALL_VALUE); + }, [selectOptions, selectValue]); + + const enabledOptions = useMemo( + () => fullSelectOptions.filter(option => !option.disabled), + [fullSelectOptions], + ); + + const selectAllEligible = useMemo( + () => + fullSelectOptions.filter( + option => hasOption(option.value, selectValue) || !option.disabled, + ), + [fullSelectOptions, selectValue], + ); + + const selectAllEnabled = useMemo( + () => + !isSingleMode && + selectOptions.length > 0 && + enabledOptions.length > 1 && + !inputValue, + [isSingleMode, selectOptions.length, enabledOptions.length, inputValue], + ); + + const selectAllMode = useMemo( + () => ensureIsArray(selectValue).length === selectAllEligible.length + 1, + [selectValue, selectAllEligible], + ); + + const handleOnSelect = ( + selectedItem: string | number | AntdLabeledValue | undefined, + ) => { + if (isSingleMode) { + setSelectValue(selectedItem); + } else { + setSelectValue(previousState => { + const array = ensureIsArray(previousState); + const value = getValue(selectedItem); + // Tokenized values can contain duplicated values + if (value === getValue(SELECT_ALL_VALUE)) { + if (isLabeledValue(selectedItem)) { + return [ + ...selectAllEligible, + selectAllOption, + ] as AntdLabeledValue[]; + } + return [ + SELECT_ALL_VALUE, + ...selectAllEligible.map(opt => opt.value), + ] as AntdLabeledValue[]; + } + if (!hasOption(value, array)) { + const result = [...array, selectedItem]; + if ( + result.length === selectAllEligible.length && + selectAllEnabled + ) { + return isLabeledValue(selectedItem) + ? ([...result, selectAllOption] as AntdLabeledValue[]) + : ([...result, SELECT_ALL_VALUE] as (string | number)[]); + } + return result as AntdLabeledValue[]; + } + return previousState; }); } - return mergedData; - }, - [sortComparatorForNoSearch], - ); - - const fetchPage = useMemo( - () => (search: string, page: number) => { - setPage(page); - if (allValuesLoaded) { - setIsLoading(false); - return; - } - const key = getQueryCacheKey(search, page, pageSize); - const cachedCount = fetchedQueries.current.get(key); - if (cachedCount !== undefined) { - setTotalCount(cachedCount); - setIsLoading(false); - return; - } - setIsLoading(true); - const fetchOptions = options as OptionsPagePromise; - fetchOptions(search, page, pageSize) - .then(({ data, totalCount }: OptionsTypePage) => { - const mergedData = mergeData(data); - fetchedQueries.current.set(key, totalCount); - setTotalCount(totalCount); + setInputValue(''); + }; + + const clear = () => { + setSelectValue( + fullSelectOptions + .filter( + option => option.disabled && hasOption(option.value, selectValue), + ) + .map(option => + labelInValue + ? { label: option.label, value: option.value } + : option.value, + ), + ); + }; + + const handleOnDeselect = ( + value: string | number | AntdLabeledValue | undefined, + ) => { + if (Array.isArray(selectValue)) { + if (getValue(value) === getValue(SELECT_ALL_VALUE)) { + clear(); + } else { + let array = selectValue as AntdLabeledValue[]; + array = array.filter( + element => getValue(element) !== getValue(value), + ); + // if this was not a new item, deselect select all option if ( - !fetchOnlyOnSearch && - value === '' && - mergedData.length >= totalCount + selectAllMode && + selectOptions.some(opt => opt.value === getValue(value)) ) { - setAllValuesLoaded(true); + array = array.filter( + element => getValue(element) !== SELECT_ALL_VALUE, + ); } - }) - .catch(internalOnError) - .finally(() => { - setIsLoading(false); - }); - }, - [ - allValuesLoaded, - fetchOnlyOnSearch, - mergeData, - internalOnError, - options, - pageSize, - value, - ], - ); - - const debouncedFetchPage = useMemo( - () => debounce(fetchPage, SLOW_DEBOUNCE), - [fetchPage], - ); - - const handleOnSearch = (search: string) => { - const searchValue = search.trim(); - if (allowNewOptions && isSingleMode) { - const newOption = searchValue && - !hasOption(searchValue, fullSelectOptions, true) && { - label: searchValue, - value: searchValue, - isNewOption: true, - }; - const cleanSelectOptions = fullSelectOptions.filter( - opt => !opt.isNewOption || hasOption(opt.value, selectValue), - ); - const newOptions = newOption - ? [newOption, ...cleanSelectOptions] - : cleanSelectOptions; - setSelectOptions(newOptions); - } - if ( - isAsync && - !allValuesLoaded && - loadingEnabled && - !fetchedQueries.current.has(getQueryCacheKey(searchValue, 0, pageSize)) - ) { - // if fetch only on search but search value is empty, then should not be - // in loading state - setIsLoading(!(fetchOnlyOnSearch && !searchValue)); - } - setInputValue(search); - }; - - const handlePagination = (e: UIEvent<HTMLElement>) => { - const vScroll = e.currentTarget; - const thresholdReached = - vScroll.scrollTop > (vScroll.scrollHeight - vScroll.offsetHeight) * 0.7; - const hasMoreData = page * pageSize + pageSize < totalCount; - - if (!isLoading && isAsync && hasMoreData && thresholdReached) { - const newPage = page + 1; - fetchPage(inputValue, newPage); - } - }; - - const handleFilterOption = (search: string, option: AntdLabeledValue) => { - if (typeof filterOption === 'function') { - return filterOption(search, option); - } - - if (filterOption) { - const searchValue = search.trim().toLowerCase(); - if (optionFilterProps && optionFilterProps.length) { - return optionFilterProps.some(prop => { - const optionProp = option?.[prop] - ? String(option[prop]).trim().toLowerCase() - : ''; - return optionProp.includes(searchValue); - }); + setSelectValue(array); + } + } + setInputValue(''); + }; + + const handleOnSearch = (search: string) => { + const searchValue = search.trim(); + if (allowNewOptions && isSingleMode) { + const newOption = searchValue && + !hasOption(searchValue, fullSelectOptions, true) && { + label: searchValue, + value: searchValue, + isNewOption: true, + }; + const cleanSelectOptions = ensureIsArray(fullSelectOptions).filter( + opt => !opt.isNewOption || hasOption(opt.value, selectValue), + ); + const newOptions = newOption + ? [newOption, ...cleanSelectOptions] + : cleanSelectOptions; + setSelectOptions(newOptions); } - } + setInputValue(search); + }; - return false; - }; + const handleFilterOption = (search: string, option: AntdLabeledValue) => + handleFilterOptionHelper(search, option, optionFilterProps, filterOption); - const handleOnDropdownVisibleChange = (isDropdownVisible: boolean) => { - setIsDropdownVisible(isDropdownVisible); + const handleOnDropdownVisibleChange = (isDropdownVisible: boolean) => { + setIsDropdownVisible(isDropdownVisible); - if (isAsync) { - // loading is enabled when dropdown is open, - // disabled when dropdown is closed - if (loadingEnabled !== isDropdownVisible) { - setLoadingEnabled(isDropdownVisible); - } - // when closing dropdown, always reset loading state - if (!isDropdownVisible && isLoading) { - // delay is for the animation of closing the dropdown - // so the dropdown doesn't flash between "Loading..." and "No data" - // before closing. - setTimeout(() => { - setIsLoading(false); - }, 250); + // if no search input value, force sort options because it won't be sorted by + // `filterSort`. + if (isDropdownVisible && !inputValue && selectOptions.length > 1) { + if (!isEqual(initialOptionsSorted, selectOptions)) { + setSelectOptions(initialOptionsSorted); + } } - } - // if no search input value, force sort options because it won't be sorted by - // `filterSort`. - if (isDropdownVisible && !inputValue && selectOptions.length > 1) { - const sortedOptions = isAsync - ? selectOptions.slice().sort(sortComparatorForNoSearch) - : // if not in async mode, revert to the original select options - // (with selected options still sorted to the top) - initialOptionsSorted; - if (!isEqual(sortedOptions, selectOptions)) { - setSelectOptions(sortedOptions); + if (onDropdownVisibleChange) { + onDropdownVisibleChange(isDropdownVisible); } - } - - if (onDropdownVisibleChange) { - onDropdownVisibleChange(isDropdownVisible); - } - }; - - const dropdownRender = ( - originNode: ReactElement & { ref?: RefObject<HTMLElement> }, - ) => { - if (!isDropdownVisible) { - originNode.ref?.current?.scrollTo({ top: 0 }); - } - if (isLoading && fullSelectOptions.length === 0) { - return <StyledLoadingText>{t('Loading...')}</StyledLoadingText>; - } - return error ? <Error error={error} /> : originNode; - }; - - // use a function instead of component since every rerender of the - // Select component will create a new component - const getSuffixIcon = () => { - if (isLoading) { - return <StyledSpin size="small" />; - } - if (shouldShowSearch && isDropdownVisible) { - return <SearchOutlined />; - } - return <DownOutlined />; - }; - - const handleClear = () => { - setSelectValue(undefined); - if (onClear) { - onClear(); - } - }; - - useEffect(() => { - // when `options` list is updated from component prop, reset states - fetchedQueries.current.clear(); - setAllValuesLoaded(false); - setSelectOptions(initialOptions); - }, [initialOptions]); - - useEffect(() => { - setSelectValue(value); - }, [value]); - - // Stop the invocation of the debounced function after unmounting - useEffect( - () => () => { - debouncedFetchPage.cancel(); - }, - [debouncedFetchPage], - ); + }; + + const dropdownRender = ( + originNode: ReactElement & { ref?: RefObject<HTMLElement> }, + ) => + dropDownRenderHelper( + originNode, + isDropdownVisible, + isLoading, + fullSelectOptions.length, + helperText, + ); - useEffect(() => { - if (isAsync && loadingEnabled && allowFetch) { - // trigger fetch every time inputValue changes - if (inputValue) { - debouncedFetchPage(inputValue, 0); - } else { - fetchPage('', 0); + const handleClear = () => { + clear(); + if (onClear) { + onClear(); } - } - }, [ - isAsync, - loadingEnabled, - fetchPage, - allowFetch, - inputValue, - debouncedFetchPage, - ]); + }; - useEffect(() => { - if (loading !== undefined && loading !== isLoading) { - setIsLoading(loading); - } - }, [isLoading, loading]); + useEffect(() => { + // when `options` list is updated from component prop, reset states + setSelectOptions(initialOptions); + }, [initialOptions]); - return ( - <StyledContainer> - {header} - <StyledSelect - allowClear={!isLoading && allowClear} - aria-label={ariaLabel || name} - dropdownRender={dropdownRender} - filterOption={handleFilterOption} - filterSort={sortComparatorWithSearch} - getPopupContainer={triggerNode => triggerNode.parentNode} - labelInValue={isAsync || labelInValue} - maxTagCount={MAX_TAG_COUNT} - mode={mappedMode} - notFoundContent={isLoading ? t('Loading...') : notFoundContent} - onDeselect={handleOnDeselect} - onDropdownVisibleChange={handleOnDropdownVisibleChange} - onPopupScroll={isAsync ? handlePagination : undefined} - onSearch={shouldShowSearch ? handleOnSearch : undefined} - onSelect={handleOnSelect} - onClear={handleClear} - onChange={onChange} - options={hasCustomLabels ? undefined : fullSelectOptions} - placeholder={placeholder} - showSearch={shouldShowSearch} - showArrow - tokenSeparators={tokenSeparators || TOKEN_SEPARATORS} - value={selectValue} - suffixIcon={getSuffixIcon()} - menuItemSelectedIcon={ - invertSelection ? ( - <StyledStopOutlined iconSize="m" /> - ) : ( - <StyledCheckOutlined iconSize="m" /> + useEffect(() => { + if (loading !== undefined && loading !== isLoading) { + setIsLoading(loading); + } + }, [isLoading, loading]); + + useEffect(() => { + setSelectValue(value); + }, [value]); + + useEffect(() => { + // if all values are selected, add select all to value + if ( + !isSingleMode && + ensureIsArray(value).length === selectAllEligible.length && + selectOptions.length > 0 + ) { + setSelectValue( + labelInValue + ? ([...ensureIsArray(value), selectAllOption] as AntdLabeledValue[]) + : ([ + ...ensureIsArray(value), + SELECT_ALL_VALUE, + ] as AntdLabeledValue[]), + ); + } + }, [ + value, + isSingleMode, + labelInValue, + selectAllEligible.length, + selectOptions.length, + ]); + + useEffect(() => { + const checkSelectAll = ensureIsArray(selectValue).some( + v => getValue(v) === SELECT_ALL_VALUE, + ); + if (checkSelectAll && !selectAllMode) { + const optionsToSelect = selectAllEligible.map(option => + labelInValue ? option : option.value, + ); + optionsToSelect.push(labelInValue ? selectAllOption : SELECT_ALL_VALUE); + setSelectValue(optionsToSelect); + } + }, [selectValue, selectAllMode, labelInValue, selectAllEligible]); + + const selectAllLabel = useMemo( + () => () => + // TODO: localize + `${SELECT_ALL_VALUE} (${formatNumber( + NumberFormats.INTEGER, + selectAllEligible.length, + )})`, + [selectAllEligible], + ); + + const handleOnChange = (values: any, options: any) => { + // intercept onChange call to handle the select all case + // if the "select all" option is selected, we want to send all options to the onChange, + // otherwise we want to remove + let newValues = values; + let newOptions = options; + if (!isSingleMode) { + if ( + ensureIsArray(newValues).some( + val => getValue(val) === SELECT_ALL_VALUE, ) - } - ref={ref} - {...props} - > - {hasCustomLabels && - fullSelectOptions.map(opt => { - const isOptObject = typeof opt === 'object'; - const label = isOptObject ? opt?.label || opt.value : opt; - const value = isOptObject ? opt.value : opt; - const { customLabel, ...optProps } = opt; - return ( - <Option {...optProps} key={value} label={label} value={value}> - {isOptObject && customLabel ? customLabel : label} - </Option> + ) { + // send all options to onchange if all are not currently there + if (!selectAllMode) { + newValues = mapValues(selectAllEligible, labelInValue); + newOptions = mapOptions(selectAllEligible); + } else { + newValues = ensureIsArray(values).filter( + (val: any) => getValue(val) !== SELECT_ALL_VALUE, ); - })} - </StyledSelect> - </StyledContainer> - ); -}; + } + } else if ( + ensureIsArray(values).length === selectAllEligible.length && + selectAllMode + ) { + const array = selectAllEligible.filter( + option => hasOption(option.value, selectValue) && option.disabled, + ); + newValues = mapValues(array, labelInValue); + newOptions = mapOptions(array); + } + } + onChange?.(newValues, newOptions); + }; + + const customMaxTagPlaceholder = () => { + const num_selected = ensureIsArray(selectValue).length; + const num_shown = maxTagCount as number; + return selectAllMode + ? `+ ${num_selected - num_shown - 1} ...` + : `+ ${num_selected - num_shown} ...`; + }; + + return ( + <StyledContainer headerPosition={headerPosition}> + {header && ( + <StyledHeader headerPosition={headerPosition}>{header}</StyledHeader> + )} + <StyledSelect + allowClear={!isLoading && allowClear} + aria-label={ariaLabel || name} + dropdownRender={dropdownRender} + filterOption={handleFilterOption} + filterSort={sortComparatorWithSearch} + getPopupContainer={ + getPopupContainer || (triggerNode => triggerNode.parentNode) + } + headerPosition={headerPosition} + labelInValue={labelInValue} + maxTagCount={maxTagCount} + maxTagPlaceholder={customMaxTagPlaceholder} + mode={mappedMode} + notFoundContent={isLoading ? t('Loading...') : notFoundContent} + onDeselect={handleOnDeselect} + onDropdownVisibleChange={handleOnDropdownVisibleChange} + onPopupScroll={undefined} + onSearch={shouldShowSearch ? handleOnSearch : undefined} + onSelect={handleOnSelect} + onClear={handleClear} + onChange={handleOnChange} + placeholder={placeholder} + showSearch={shouldShowSearch} + showArrow + tokenSeparators={tokenSeparators || TOKEN_SEPARATORS} + value={selectValue} + suffixIcon={getSuffixIcon( + isLoading, + shouldShowSearch, + isDropdownVisible, + )} + menuItemSelectedIcon={ + invertSelection ? ( + <StyledStopOutlined iconSize="m" aria-label="stop" /> + ) : ( + <StyledCheckOutlined iconSize="m" aria-label="check" /> + ) + } + oneLine={oneLine} + tagRender={customTagRender} + {...props} + ref={ref} + > + {selectAllEnabled && ( + <Option + id="select-all" + className="select-all" + key={SELECT_ALL_VALUE} + value={SELECT_ALL_VALUE} + > + {selectAllLabel()} + </Option> + )} + {renderSelectOptions(fullSelectOptions)} + </StyledSelect> + </StyledContainer> + ); + }, +); -export default forwardRef(Select); +export default Select; diff --git a/superset-frontend/src/components/Select/constants.ts b/superset-frontend/src/components/Select/constants.ts new file mode 100644 index 000000000000..63218d9b712e --- /dev/null +++ b/superset-frontend/src/components/Select/constants.ts @@ -0,0 +1,52 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { LabeledValue as AntdLabeledValue } from 'antd/lib/select'; +import { rankedSearchCompare } from 'src/utils/rankedSearchCompare'; + +export const MAX_TAG_COUNT = 4; + +export const TOKEN_SEPARATORS = [',', '\r\n', '\n', '\t', ';']; + +export const EMPTY_OPTIONS = []; + +export const DEFAULT_PAGE_SIZE = 100; + +export const DEFAULT_SORT_COMPARATOR = ( + a: AntdLabeledValue, + b: AntdLabeledValue, + search?: string, +) => { + let aText: string | undefined; + let bText: string | undefined; + if (typeof a.label === 'string' && typeof b.label === 'string') { + aText = a.label; + bText = b.label; + } else if (typeof a.value === 'string' && typeof b.value === 'string') { + aText = a.value; + bText = b.value; + } + // sort selected options first + if (typeof aText === 'string' && typeof bText === 'string') { + if (search) { + return rankedSearchCompare(aText, bText, search); + } + return aText.localeCompare(bText); + } + return (a.value as number) - (b.value as number); +}; diff --git a/superset-frontend/src/components/Select/styles.tsx b/superset-frontend/src/components/Select/styles.tsx index f04cfbdba9ed..cf9613d1c8e8 100644 --- a/superset-frontend/src/components/Select/styles.tsx +++ b/superset-frontend/src/components/Select/styles.tsx @@ -16,391 +16,123 @@ * specific language governing permissions and limitations * under the License. */ - -// Deprecated component -/* eslint-disable theme-colors/no-literal-colors */ - -import React, { CSSProperties, ComponentType, ReactNode } from 'react'; -import { SerializedStyles } from '@emotion/react'; -import { SupersetTheme, css } from '@superset-ui/core'; -import { - Styles, - Theme, - SelectComponentsConfig, - components as defaultComponents, - InputProps as ReactSelectInputProps, - Props as SelectProps, -} from 'react-select'; -import type { colors as reactSelectColors } from 'react-select/src/theme'; -import type { DeepNonNullable } from 'react-select/src/components'; -import { OptionType } from 'antd/lib/select'; -import { SupersetStyledSelectProps } from './DeprecatedSelect'; - -export const DEFAULT_CLASS_NAME = 'Select'; -export const DEFAULT_CLASS_NAME_PREFIX = 'Select'; - -type RecursivePartial<T> = { - [P in keyof T]?: RecursivePartial<T[P]>; -}; - -const colors = (theme: SupersetTheme) => ({ - primary: theme.colors.success.base, - danger: theme.colors.error.base, - warning: theme.colors.warning.base, - indicator: theme.colors.info.base, - almostBlack: theme.colors.grayscale.dark1, - grayDark: theme.colors.grayscale.dark1, - grayLight: theme.colors.grayscale.light2, - gray: theme.colors.grayscale.light1, - grayBg: theme.colors.grayscale.light4, - grayBgDarker: theme.colors.grayscale.light3, - grayBgDarkest: theme.colors.grayscale.light2, - grayHeading: theme.colors.grayscale.light1, - menuHover: theme.colors.grayscale.light3, - lightest: theme.colors.grayscale.light5, - darkest: theme.colors.grayscale.dark2, - grayBorder: theme.colors.grayscale.light2, - grayBorderLight: theme.colors.grayscale.light3, - grayBorderDark: theme.colors.grayscale.light1, - textDefault: theme.colors.grayscale.dark1, - textDarkest: theme.colors.grayscale.dark2, - dangerLight: theme.colors.error.light1, -}); - -export type ThemeConfig = { - borderRadius: number; - // z-index for menu dropdown - // (the same as `@z-index-above-dashboard-charts + 1` in variables.less) - zIndex: number; - colors: { - // add known colors - [key in keyof typeof reactSelectColors]: string; - } & { - [key in keyof ReturnType<typeof colors>]: string; - } & { - [key: string]: string; // any other colors - }; - spacing: Theme['spacing'] & { - // line height and font size must be pixels for easier computation - // of option item height in WindowedMenuList - lineHeight: number; - fontSize: number; - // other relative size must be string - minWidth: string; - }; -}; - -export type PartialThemeConfig = RecursivePartial<ThemeConfig>; - -export const defaultTheme: (theme: SupersetTheme) => PartialThemeConfig = - theme => ({ - borderRadius: theme.borderRadius, - zIndex: 11, - colors: colors(theme), - spacing: { - baseUnit: 3, - menuGutter: 0, - controlHeight: 34, - lineHeight: 19, - fontSize: 14, - minWidth: '6.5em', - }, - weights: theme.typography.weights, - }); - -// let styles accept serialized CSS, too -type CSSStyles = CSSProperties | SerializedStyles; -type styleFnWithSerializedStyles = ( - base: CSSProperties, - state: any, -) => CSSStyles | CSSStyles[]; - -export type StylesConfig = { - [key in keyof Styles]: styleFnWithSerializedStyles; -}; -export type PartialStylesConfig = Partial<StylesConfig>; - -export const DEFAULT_STYLES: PartialStylesConfig = { - container: ( - provider, - { - theme: { - spacing: { minWidth }, - }, - }, - ) => [ - provider, - css` - min-width: ${minWidth}; - `, - ], - placeholder: provider => [ - provider, - css` - white-space: nowrap; - `, - ], - indicatorSeparator: () => css` - display: none; - `, - indicatorsContainer: provider => [ - provider, - css` - i { - width: 1em; - display: inline-block; - } - `, - ], - clearIndicator: provider => [ - provider, - css` - padding: 4px 0 4px 6px; - `, - ], - control: ( - provider, - { isFocused, menuIsOpen, theme: { borderRadius, colors } }, - ) => { - const isPseudoFocused = isFocused && !menuIsOpen; - let borderColor = colors.grayBorder; - if (isPseudoFocused || menuIsOpen) { - borderColor = colors.grayBorderDark; +import { styled } from '@superset-ui/core'; +import Icons from 'src/components/Icons'; +import { Spin, Tag } from 'antd'; +import AntdSelect from 'antd/lib/select'; + +export const StyledHeader = styled.span<{ headerPosition: string }>` + ${({ theme, headerPosition }) => ` + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-right: ${headerPosition === 'left' ? theme.gridUnit * 2 : 0}px; + `} +`; + +export const StyledContainer = styled.div<{ headerPosition: string }>` + ${({ headerPosition }) => ` + display: flex; + flex-direction: ${headerPosition === 'top' ? 'column' : 'row'}; + align-items: ${headerPosition === 'left' ? 'center' : undefined}; + width: 100%; + `} +`; + +export const StyledSelect = styled(AntdSelect, { + shouldForwardProp: prop => prop !== 'headerPosition' && prop !== 'oneLine', +})<{ headerPosition: string; oneLine?: boolean }>` + ${({ theme, headerPosition, oneLine }) => ` + flex: ${headerPosition === 'left' ? 1 : 0}; + && .ant-select-selector { + border-radius: ${theme.gridUnit}px; } - return [ - provider, - css` - border-color: ${borderColor}; - box-shadow: ${isPseudoFocused - ? 'inset 0 1px 1px rgba(0,0,0,.075), 0 0 0 3px rgba(0,0,0,.1)' - : 'none'}; - border-radius: ${menuIsOpen - ? `${borderRadius}px ${borderRadius}px 0 0` - : `${borderRadius}px`}; - &:hover { - border-color: ${borderColor}; - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06); - } - flex-wrap: nowrap; - padding-left: 1px; - `, - ]; - }, - menu: (provider, { theme: { zIndex } }) => [ - provider, - css` - padding-bottom: 2em; - z-index: ${zIndex}; /* override at least multi-page pagination */ - width: auto; - min-width: 100%; - max-width: 80vw; - background: none; - box-shadow: none; - border: 0; - `, - ], - menuList: (provider, { theme: { borderRadius, colors } }) => [ - provider, - css` - background: ${colors.lightest}; - border-radius: 0 0 ${borderRadius}px ${borderRadius}px; - border: 1px solid ${colors.grayBorderDark}; - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06); - margin-top: -1px; - border-top-color: ${colors.grayBorderLight}; - min-width: 100%; - width: auto; - border-radius: 0 0 ${borderRadius}px ${borderRadius}px; - padding-top: 0; - padding-bottom: 0; - `, - ], - option: ( - provider, - { - isDisabled, - isFocused, - isSelected, - theme: { - colors, - spacing: { lineHeight, fontSize }, - weights, - }, - }, - ) => { - let color = colors.textDefault; - let backgroundColor = colors.lightest; - if (isFocused) { - backgroundColor = colors.grayBgDarker; - } else if (isDisabled) { - color = '#ccc'; + // Open the dropdown when clicking on the suffix + // This is fixed in version 4.16 + .ant-select-arrow .anticon:not(.ant-select-suffix) { + pointer-events: none; + } + .select-all { + border-bottom: 1px solid ${theme.colors.grayscale.light3}; } - return [ - provider, - css` - cursor: pointer; - line-height: ${lineHeight}px; - font-size: ${fontSize}px; - background-color: ${backgroundColor}; - color: ${color}; - font-weight: ${isSelected ? weights.bold : weights.normal}; - white-space: nowrap; - &:hover:active { - background-color: ${colors.grayBg}; + ${ + oneLine && + ` + .ant-select-selection-overflow { + flex-wrap: nowrap; } - `, - ]; - }, - valueContainer: ( - provider, - { - isMulti, - hasValue, - theme: { - spacing: { baseUnit }, - }, - }, - ) => [ - provider, - css` - padding-left: ${isMulti && hasValue ? 1 : baseUnit * 3}px; - `, - ], - multiValueLabel: ( - provider, - { - theme: { - spacing: { baseUnit }, - }, - }, - ) => ({ - ...provider, - paddingLeft: baseUnit * 1.2, - paddingRight: baseUnit * 1.2, - }), - input: (provider, { selectProps }) => [ - provider, - css` - margin-left: 0; - vertical-align: middle; - ${selectProps?.isMulti && selectProps?.value?.length - ? 'padding: 0 6px; width: 100%' - : 'padding: 0; flex: 1 1 auto;'}; - `, - ], - menuPortal: base => ({ - ...base, - zIndex: 1030, // must be same or higher of antd popover - }), -}; - -const INPUT_TAG_BASE_STYLES = { - background: 'none', - border: 'none', - outline: 'none', - padding: 0, -}; - -export type SelectComponentsType = Omit< - SelectComponentsConfig<any>, - 'Input' -> & { - Input: ComponentType<InputProps>; -}; - -// react-select is missing selectProps from their props type -// so overwriting it here to avoid errors -export type InputProps = ReactSelectInputProps & { - placeholder?: ReactNode; - selectProps: SelectProps; - autoComplete?: string; - onPaste?: SupersetStyledSelectProps<OptionType>['onPaste']; - inputStyle?: object; -}; -const { ClearIndicator, DropdownIndicator, Option, Input, SelectContainer } = - defaultComponents as Required<DeepNonNullable<SelectComponentsType>>; - -export const DEFAULT_COMPONENTS: SelectComponentsType = { - SelectContainer: ({ children, ...props }) => { - const { - selectProps: { assistiveText }, - } = props; - return ( - <div> - <SelectContainer {...props}>{children}</SelectContainer> - {assistiveText && ( - <span - css={(theme: SupersetTheme) => ({ - marginLeft: 3, - fontSize: theme.typography.sizes.s, - color: theme.colors.grayscale.light1, - })} - > - {assistiveText} - </span> - )} - </div> - ); - }, - Option: ({ children, innerProps, data, ...props }) => ( - <Option - {...props} - data={data} - css={data?.style ? data.style : null} - innerProps={innerProps} - > - {children} - </Option> - ), - ClearIndicator: props => ( - <ClearIndicator {...props}> - <i className="fa">×</i> - </ClearIndicator> - ), - DropdownIndicator: props => ( - <DropdownIndicator {...props}> - <i - className={`fa fa-caret-${ - props.selectProps.menuIsOpen ? 'up' : 'down' - }`} - /> - </DropdownIndicator> - ), - Input: (props: InputProps) => { - const { getStyles } = props; - return ( - <Input - {...props} - css={getStyles('input', props)} - autoComplete="chrome-off" - inputStyle={INPUT_TAG_BASE_STYLES} - /> - ); - }, -}; + .ant-select-selection-overflow-item:not(.ant-select-selection-overflow-item-rest):not(.ant-select-selection-overflow-item-suffix) { + flex-shrink: 1; + min-width: ${theme.gridUnit * 13}px; + } -export const VALUE_LABELED_STYLES: PartialStylesConfig = { - valueContainer: ( - provider, - { - getValue, - theme: { - spacing: { baseUnit }, - }, - isMulti, - }, - ) => ({ - ...provider, - paddingLeft: getValue().length > 0 ? 1 : baseUnit * 3, - overflow: isMulti && getValue().length > 0 ? 'visible' : 'hidden', - }), - // render single value as is they are multi-value - singleValue: (provider, props) => { - const { getStyles } = props; - return { - ...getStyles('multiValue', props), - '.metric-option': getStyles('multiValueLabel', props), + .ant-select-selection-overflow-item-suffix { + flex: unset; + min-width: 0px; + } + ` }; - }, -}; + `} +`; + +export const NoElement = styled.span` + display: none; +`; + +export const StyledTag = styled(Tag)` + ${({ theme }) => ` + background: ${theme.colors.grayscale.light3}; + font-size: ${theme.typography.sizes.m}px; + border: none; + `} +`; + +export const StyledStopOutlined = styled(Icons.StopOutlined)` + vertical-align: 0; +`; + +export const StyledCheckOutlined = styled(Icons.CheckOutlined)` + vertical-align: 0; +`; + +export const StyledSpin = styled(Spin)` + margin-top: ${({ theme }) => -theme.gridUnit}px; +`; + +export const StyledLoadingText = styled.div` + ${({ theme }) => ` + margin-left: ${theme.gridUnit * 3}px; + line-height: ${theme.gridUnit * 8}px; + color: ${theme.colors.grayscale.light1}; + `} +`; + +export const StyledHelperText = styled.div` + ${({ theme }) => ` + padding: ${theme.gridUnit * 2}px ${theme.gridUnit * 3}px; + color: ${theme.colors.grayscale.base}; + font-size: ${theme.typography.sizes.s}px; + cursor: default; + border-bottom: 1px solid ${theme.colors.grayscale.light2}; + `} +`; + +export const StyledError = styled.div` + ${({ theme }) => ` + display: flex; + justify-content: center; + align-items: flex-start; + width: 100%; + padding: ${theme.gridUnit * 2}px; + color: ${theme.colors.error.base}; + & svg { + margin-right: ${theme.gridUnit * 2}px; + } + `} +`; + +export const StyledErrorMessage = styled.div` + overflow: hidden; + text-overflow: ellipsis; +`; diff --git a/superset-frontend/src/components/Select/types.ts b/superset-frontend/src/components/Select/types.ts new file mode 100644 index 000000000000..6e4c7f072db8 --- /dev/null +++ b/superset-frontend/src/components/Select/types.ts @@ -0,0 +1,217 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { + JSXElementConstructor, + ReactElement, + ReactNode, + RefObject, +} from 'react'; +import { + SelectProps as AntdSelectProps, + SelectValue as AntdSelectValue, + LabeledValue as AntdLabeledValue, +} from 'antd/lib/select'; +import { TagProps } from 'antd/lib/tag'; + +export type RawValue = string | number; + +export type V = string | number | null | undefined; + +export type LabeledValue = { label?: ReactNode; value?: V }; + +export type AntdProps = AntdSelectProps<AntdSelectValue>; + +export type AntdExposedProps = Pick< + AntdProps, + | 'allowClear' + | 'autoFocus' + | 'disabled' + | 'filterOption' + | 'filterSort' + | 'loading' + | 'labelInValue' + | 'maxTagCount' + | 'notFoundContent' + | 'onChange' + | 'onClear' + | 'onDeselect' + | 'onSelect' + | 'onFocus' + | 'onBlur' + | 'onPopupScroll' + | 'onSearch' + | 'onDropdownVisibleChange' + | 'placeholder' + | 'showArrow' + | 'showSearch' + | 'tokenSeparators' + | 'value' + | 'getPopupContainer' + | 'menuItemSelectedIcon' +>; + +export type SelectOptionsType = Exclude<AntdProps['options'], undefined>; + +export interface BaseSelectProps extends AntdExposedProps { + /** + * It enables the user to create new options. + * Can be used with standard or async select types. + * Can be used with any mode, single or multiple. + * False by default. + * */ + allowNewOptions?: boolean; + /** + * It adds the aria-label tag for accessibility standards. + * Must be plain English and localized. + */ + ariaLabel?: string; + /** + * Renders the dropdown + */ + dropdownRender?: ( + menu: ReactElement<any, string | JSXElementConstructor<any>>, + ) => ReactElement<any, string | JSXElementConstructor<any>>; + /** + * It adds a header on top of the Select. + * Can be any ReactNode. + */ + header?: ReactNode; + /** + * It changes the position of the header. + */ + headerPosition?: 'top' | 'left'; + /** + * It adds a helper text on top of the Select options + * with additional context to help with the interaction. + */ + helperText?: string; + /** + * It allows to define which properties of the option object + * should be looked for when searching. + * By default label and value. + */ + mappedMode?: 'multiple' | 'tags'; + /** + * It defines whether the Select should allow for the + * selection of multiple options or single. + * Single by default. + */ + mode?: 'single' | 'multiple'; + /** + * Deprecated. + * Prefer ariaLabel instead. + */ + name?: string; // discourage usage + /** + * It allows to define which properties of the option object + * should be looked for when searching. + * By default label and value. + */ + optionFilterProps?: string[]; + /** + * It shows a stop-outlined icon at the far right of a selected + * option instead of the default checkmark. + * Useful to better indicate to the user that by clicking on a selected + * option it will be de-selected. + * False by default. + */ + invertSelection?: boolean; + /** + * Customize how filtered options are sorted while users search. + * Will not apply to predefined `options` array when users are not searching. + */ + sortComparator?: ( + a: AntdLabeledValue, + b: AntdLabeledValue, + search?: string, + ) => number; + /** + * Sets maxTagCount to 1. The overflow tag is always displayed in + * the same line, line wrapping is disabled. + * When the dropdown is open, sets maxTagCount to 0, + * displays only the overflow tag. + */ + oneLine?: boolean; + + suffixIcon?: ReactNode; + + ref: RefObject<HTMLInputElement>; +} + +export interface SelectProps extends BaseSelectProps { + /** + * It defines the options of the Select. + * The options can be static, an array of options. + */ + options: SelectOptionsType; +} + +export type AsyncSelectRef = HTMLInputElement & { clearCache: () => void }; + +export type SelectOptionsTypePage = { + data: SelectOptionsType; + totalCount: number; +}; + +export type SelectOptionsPagePromise = ( + search: string, + page: number, + pageSize: number, +) => Promise<SelectOptionsTypePage>; + +export interface AsyncSelectProps extends BaseSelectProps { + /** + * It fires a request against the server after + * the first interaction and not on render. + * Works in async mode only (See the options property). + * True by default. + */ + lazyLoading?: boolean; + /** + * It defines the options of the Select. + * The options are async, a promise that returns + * an array of options. + */ + options: SelectOptionsPagePromise; + /** + * It defines how many results should be included + * in the query response. + * Works in async mode only (See the options property). + */ + pageSize?: number; + /** + * It fires a request against the server only after + * searching. + * Works in async mode only (See the options property). + * Undefined by default. + */ + fetchOnlyOnSearch?: boolean; + /** + * It provides a callback function when an error + * is generated after a request is fired. + * Works in async mode only (See the options property). + */ + onError?: (error: string) => void; +} + +export type CustomTagProps = HTMLSpanElement & + TagProps & { + label: ReactNode; + value: string; + }; diff --git a/superset-frontend/src/components/Select/utils.tsx b/superset-frontend/src/components/Select/utils.tsx new file mode 100644 index 000000000000..d6d352132fcc --- /dev/null +++ b/superset-frontend/src/components/Select/utils.tsx @@ -0,0 +1,224 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { ensureIsArray, t } from '@superset-ui/core'; +import AntdSelect, { LabeledValue as AntdLabeledValue } from 'antd/lib/select'; +import React, { ReactElement, RefObject } from 'react'; +import Icons from 'src/components/Icons'; +import { StyledHelperText, StyledLoadingText, StyledSpin } from './styles'; +import { LabeledValue, RawValue, SelectOptionsType, V } from './types'; + +const { Option } = AntdSelect; + +export const SELECT_ALL_VALUE: RawValue = 'Select All'; +export const selectAllOption = { + value: SELECT_ALL_VALUE, + label: String(SELECT_ALL_VALUE), +}; + +export function isObject(value: unknown): value is Record<string, unknown> { + return ( + value !== null && + typeof value === 'object' && + Array.isArray(value) === false + ); +} + +export function isLabeledValue(value: unknown): value is AntdLabeledValue { + return isObject(value) && 'value' in value && 'label' in value; +} + +export function getValue( + option: string | number | AntdLabeledValue | null | undefined, +) { + return isLabeledValue(option) ? option.value : option; +} + +export function hasOption( + value: V, + options?: V | LabeledValue | (V | LabeledValue)[], + checkLabel = false, +): boolean { + const optionsArray = ensureIsArray(options); + // When comparing the values we use the equality + // operator to automatically convert different types + return ( + optionsArray.find( + x => + // eslint-disable-next-line eqeqeq + x == value || + (isObject(x) && + // eslint-disable-next-line eqeqeq + (('value' in x && x.value == value) || + (checkLabel && 'label' in x && x.label === value))), + ) !== undefined + ); +} + +/** + * It creates a comparator to check for a specific property. + * Can be used with string and number property values. + * */ +export const propertyComparator = + (property: string) => (a: AntdLabeledValue, b: AntdLabeledValue) => { + if (typeof a[property] === 'string' && typeof b[property] === 'string') { + return a[property].localeCompare(b[property]); + } + return (a[property] as number) - (b[property] as number); + }; + +export const sortSelectedFirstHelper = ( + a: AntdLabeledValue, + b: AntdLabeledValue, + selectValue: + | string + | number + | RawValue[] + | AntdLabeledValue + | AntdLabeledValue[] + | undefined, +) => + selectValue && a.value !== undefined && b.value !== undefined + ? Number(hasOption(b.value, selectValue)) - + Number(hasOption(a.value, selectValue)) + : 0; + +export const sortComparatorWithSearchHelper = ( + a: AntdLabeledValue, + b: AntdLabeledValue, + inputValue: string, + sortCallback: (a: AntdLabeledValue, b: AntdLabeledValue) => number, + sortComparator: ( + a: AntdLabeledValue, + b: AntdLabeledValue, + search?: string | undefined, + ) => number, +) => sortCallback(a, b) || sortComparator(a, b, inputValue); + +export const sortComparatorForNoSearchHelper = ( + a: AntdLabeledValue, + b: AntdLabeledValue, + sortCallback: (a: AntdLabeledValue, b: AntdLabeledValue) => number, + sortComparator: ( + a: AntdLabeledValue, + b: AntdLabeledValue, + search?: string | undefined, + ) => number, +) => sortCallback(a, b) || sortComparator(a, b, ''); + +// use a function instead of component since every rerender of the +// Select component will create a new component +export const getSuffixIcon = ( + isLoading: boolean | undefined, + showSearch: boolean, + isDropdownVisible: boolean, +) => { + if (isLoading) { + return <StyledSpin size="small" />; + } + if (showSearch && isDropdownVisible) { + return <Icons.SearchOutlined iconSize="s" />; + } + return <Icons.DownOutlined iconSize="s" />; +}; + +export const dropDownRenderHelper = ( + originNode: ReactElement & { ref?: RefObject<HTMLElement> }, + isDropdownVisible: boolean, + isLoading: boolean | undefined, + optionsLength: number, + helperText: string | undefined, + errorComponent?: JSX.Element, +) => { + if (!isDropdownVisible) { + originNode.ref?.current?.scrollTo({ top: 0 }); + } + if (isLoading && optionsLength === 0) { + return <StyledLoadingText>{t('Loading...')}</StyledLoadingText>; + } + if (errorComponent) { + return errorComponent; + } + return ( + <> + {helperText && ( + <StyledHelperText role="note">{helperText}</StyledHelperText> + )} + {originNode} + </> + ); +}; + +export const handleFilterOptionHelper = ( + search: string, + option: AntdLabeledValue, + optionFilterProps: string[], + filterOption: boolean | Function, +) => { + if (typeof filterOption === 'function') { + return filterOption(search, option); + } + + if (filterOption) { + const searchValue = search.trim().toLowerCase(); + if (optionFilterProps?.length) { + return optionFilterProps.some(prop => { + const optionProp = option?.[prop] + ? String(option[prop]).trim().toLowerCase() + : ''; + return optionProp.includes(searchValue); + }); + } + } + + return false; +}; + +export const hasCustomLabels = (options: SelectOptionsType) => + options?.some(opt => !!opt?.customLabel); + +export const renderSelectOptions = (options: SelectOptionsType) => + options.map(opt => { + const isOptObject = typeof opt === 'object'; + const label = isOptObject ? opt?.label || opt.value : opt; + const value = isOptObject ? opt.value : opt; + const { customLabel, ...optProps } = opt; + return ( + <Option {...optProps} key={value} label={label} value={value}> + {isOptObject && customLabel ? customLabel : label} + </Option> + ); + }); + +export const mapValues = (values: SelectOptionsType, labelInValue: boolean) => + labelInValue + ? values.map(opt => ({ + key: opt.value, + value: opt.value, + label: opt.label, + })) + : values.map(opt => opt.value); + +export const mapOptions = (values: SelectOptionsType) => + values.map(opt => ({ + children: opt.label, + key: opt.value, + value: opt.value, + label: opt.label, + disabled: opt.disabled, + })); diff --git a/superset-frontend/src/components/Table/Table.overview.mdx b/superset-frontend/src/components/Table/Table.overview.mdx new file mode 100644 index 000000000000..2fa1455cd0ed --- /dev/null +++ b/superset-frontend/src/components/Table/Table.overview.mdx @@ -0,0 +1,339 @@ +import { Meta, Source, Story, ArgsTable } from '@storybook/addon-docs'; + +<Meta title="Design System/Components/Table/Overview" /> + +# Table + +A table is UI that allows the user to explore data in a tabular format. + +## Usage + +Common table applications in Superset: + +- Display lists of user-generated entities (e.g. dashboard, charts, queries) for further exploration and use +- Display data that can help the user make a decision (e.g. query results) + +This component provides a general use Table. + +--- + +### [Basic example](./?path=/docs/design-system-components-table-examples--basic) + +<Story id="design-system-components-table-examples--basic" /> + +### Data and Columns + +To set the visible columns and data for the table you use the `columns` and `data` props. + +<details> + +The basic table example for the `columns` prop is: + +``` +const basicColumns: = [ + { + title: 'Name', + dataIndex: 'name', + key: 'name', + width: 150, + sorter: (a: BasicData, b: BasicData) => + alphabeticalSort('name', a, b), + }, + { + title: 'Category', + dataIndex: 'category', + key: 'category', + sorter: (a: BasicData, b: BasicData) => + alphabeticalSort('category', a, b), + }, + { + title: 'Price', + dataIndex: 'price', + key: 'price', + sorter: (a: BasicData, b: BasicData) => + numericalSort('price', a, b), + }, + { + title: 'Description', + dataIndex: 'description', + key: 'description', + }, +]; +``` + +The data prop is: + +``` +const basicData: = [ + { + key: 1, + name: 'Floppy Disk 10 pack', + category: 'Disk Storage', + price: '9.99' + description: 'A real blast from the past', + }, + { + key: 2, + name: 'DVD 100 pack', + category: 'Optical Storage', + price: '27.99' + description: 'Still pretty ancient', + }, + { + key: 3, + name: '128 GB SSD', + category: 'Hardrive', + price: '49.99' + description: 'Reliable and fast data storage', + }, +]; +``` + +</details> + +### Column Sort Functions + +To ensure consistency for column sorting and to avoid redundant definitions for common column sorters, reusable sort functions are provided. +When defining the object for the `columns` prop you can provide an optional attribute `sorter`. +The function provided in the `sorter` prop is given the entire record representing a row as props `a` and `b`. +When using a provided sorter function the pattern is to wrap the call to the sorter with an inline function, then specify the specific attribute value from `dataIndex`, representing a column +of the data object for that row, as the first argument of the sorter function. + +#### alphabeticalSort + +The alphabeticalSort is for columns that display a string of text. + +<details> + +``` +import { alphabeticalSort } from 'src/components/Table/sorters'; + +const basicColumns = [ + { + title: 'Column Name', + dataIndex: 'columnName', + key: 'columnName', + sorter: (a, b) => + alphabeticalSort('columnName', a, b), + } +] +``` + +</details> + +#### numericSort + +The numericalSort is for columns that display a numeric value. + +<details> + +``` +import { numericalSort } from './sorters'; + +const basicColumns = [ + { + title: 'Height', + dataIndex: 'height', + key: 'height', + sorter: (a, b) => + numericalSort('height', a, b), + } +] +``` + +</details> + +If a different sort option is needed, consider adding it as a reusable sort function following the pattern provided above. + +--- + +### Cell Content Renderers + +By default, each column will render the value as simple text. Often you will want to show formatted values, such as a numeric column showing as currency, or a more complex component such as a button or action menu as a cell value. +Cell Renderers are React components provided to the optional `render` attribute on a column definition that enables injecting a specific React component to enable this. + +<Story id="design-system-components-table-examples--cell-renderers" /> + +For convenience and consistency, the Table component provides pre-built Cell Renderers for: +The following data types can be displayed in table cells. + +- Text (default) +- [Button Cell](./?path=/docs/design-system-components-table-cell-renderers-buttoncell--basic) +- [Numeric Cell](./docs/design-system-components-table-cell-renderers-numericcell--basic) + - Support Locale and currency formatting + - w/ icons - Coming Soon +- [Action Menu Cell](./?path=/docs/design-system-components-table-cell-renderers-actioncell-overview--page) +- Provide a list of menu options with callback functions that retain a reference to the row the menu is defined for +- Custom + - You can provide your own React component as a cell renderer in cases not supported + +--- + +### Loading + +The table can be set to a loading state simply by setting the loading prop to true | false + +<Story id="design-system-components-table-examples--loading" /> + +--- + +### Pagination + +The table displays a set number of rows at a time, the user navigates the table via pagination. Use in scenarios where the user is searching for a specific piece of content. +The default page size and page size options for the menu are configurable via the `pageSizeOptions` and `defaultPageSize` props. +NOTE: Pagination controls will only display when the data for the table has more records than the default page size. + +<Story id="design-system-components-table-examples--pagination" /> + +``` +<Table pageSizeOptions={[5, 10, 15, 20, 25] defaultPageSize={10} /> +``` + +--- + +### Server Pagination + +The table can be configured for async data fetching to get partial data sets while showing pagination controls that let the user navigate through data. +To override the default paging, which uses `data.length` to determine the record count, populate the `recordCount` prop with the total number of records +contained in the dataset on the server being paged through. When the user navigates through the paged data it will invoke the `onChange` callback +function enabling data fetching to occur when the user changes the page. + +<Story id="design-system-components-table-examples--server-pagination" /> + +``` +interface BasicData { + name: string; + category: string; + price: number; + description?: string; + key: number; +} + +const generateData = (startIndex: number, pageSize: number): BasicData[] => { + const data: BasicData[] = []; + for (let i = 0; i < pageSize; i += 1) { + const recordIndex = startIndex + i; + data.push({ + key: recordIndex, + name: `Dynamic Record ${recordIndex}`, + category: 'Disk Storage', + price: recordIndex * 2.59, + description: 'A random description', + }); + } + return data; +}; + +const ServerPaginationTable = () => { + const [data, setData] = useState(generateData(0, 5)); + const [loading, setLoading] = useState(false); + // This should really be calculated server side for the data set being paged through + const recordCount = 5000; + + const handleChange = (pagination: TablePaginationConfig) => { + const pageSize = pagination?.pageSize ?? 5; + const current = pagination?.current ?? 0; + setLoading(true); + // simulate a fetch + setTimeout(() => { + setData(generateData(current * pageSize, pageSize)); + setLoading(false); + }, 1000); + }; + + return ( + <Table + columns: paginationColumns, + size: TableSize.SMALL, + pageSizeOptions: ['10', '20', '50'], + defaultPageSize: 10, + data={data} + recordCount={5000} + onChange={handleChange} + loading={loading} + /> + ); +}; +``` + +--- + +### Virtualization for Performance + +Table virtualization can enable viewing data with many columns and/or rows. +Virtualization can be enabled via the `virtualize` prop. + +NOTE: Row event handlers will be ignored when table is running with `virtualize={true}`. +Support for row event handlers may be added in future versions of the Table. + +<Story id="design-system-components-table-examples--virtualized-performance" /> + +--- + +## Integration Checklist + +The following specifications are required every time a table is used. These choices should be intentional based on the specific user needs for the table instance. + +<details> + +- [ ] Size + - Large + - Small +- Columns + - [ ] Number of + - [ ] Contents + - [ ] Order + - [ ] Widths +- Column headers + - [ ] Labels + - [ ] Has tooltip + - [ ] Tooltip text +- [ ] Default sort +- Functionality + - [ ] Can sort columns + - [ ] Can filter columns +- [ ] Loading + - Pagination + - [ ] Number of rows per page + - Infinite scroll +- [ ] Has toolbar + - [ ] Has table title + - [ ] Label + - [ ] Has buttons + - [ ] Labels + - [ ] Actions + - [ ] Has search + +</details> + +--- + +## Experimental features + +The Table component has features that are still experimental and can be used at your own risk. +These features are intended to be made fully stable in future releases. + +### Resizable Columns + +The prop `resizable` enables table columns to be resized by the user dragging from the right edge of each +column to increase or decrease the columns' width + +<Story id="design-system-components-table-examples--resizable-columns" /> + +### Drag & Drop Columns + +The prop `reorderable` can enable column drag and drop reordering as well as dragging a column to another component. If you want to accept the drop event of a Table Column +you can register `onDragOver` and `onDragDrop` event handlers on the destination component. In the `onDragDrop` handler you can check for `SUPERSET_TABLE_COLUMN` +as the getData key as shown below. + +``` +import { SUPERSET_TABLE_COLUMN } from 'src/components/table'; + +const handleDrop = (ev:Event) => { + const json = ev.dataTransfer?.getData?.(SUPERSET_TABLE_COLUMN); + const data = JSON.parse(json); + // ... do something with the data here +} +``` + +<Story id="design-system-components-table-examples--reorderable-columns" /> diff --git a/superset-frontend/src/components/Table/Table.stories.tsx b/superset-frontend/src/components/Table/Table.stories.tsx new file mode 100644 index 000000000000..7ae3525562d1 --- /dev/null +++ b/superset-frontend/src/components/Table/Table.stories.tsx @@ -0,0 +1,682 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useState } from 'react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { action } from '@storybook/addon-actions'; +import { + Table, + TableSize, + SUPERSET_TABLE_COLUMN, + ColumnsType, + OnChangeFunction, + ETableAction, +} from './index'; +import { numericalSort, alphabeticalSort } from './sorters'; +import ButtonCell from './cell-renderers/ButtonCell'; +import ActionCell from './cell-renderers/ActionCell'; +import { exampleMenuOptions } from './cell-renderers/ActionCell/fixtures'; +import NumericCell, { + CurrencyCode, + LocaleCode, + Style, +} from './cell-renderers/NumericCell'; +import HeaderWithRadioGroup from './header-renderers/HeaderWithRadioGroup'; +import TimeCell from './cell-renderers/TimeCell'; + +export default { + title: 'Design System/Components/Table/Examples', + component: Table, + argTypes: { onClick: { action: 'clicked' } }, +} as ComponentMeta<typeof Table>; + +export interface BasicData { + name: string; + category: string; + price: number; + description?: string; + key: number; +} + +export interface RendererData { + key: number; + buttonCell: string; + textCell: string; + euroCell: number; + dollarCell: number; +} + +export interface ExampleData { + title: string; + name: string; + age: number; + address: string; + tags?: string[]; + key: number; +} + +function generateValues(amount: number, row = 0): object { + const cells = {}; + for (let i = 0; i < amount; i += 1) { + cells[`col-${i}`] = i * row * 0.75; + } + return cells; +} + +function generateColumns(amount: number): ColumnsType<ExampleData>[] { + const newCols: any[] = []; + for (let i = 0; i < amount; i += 1) { + newCols.push({ + title: `C${i}`, + dataIndex: `col-${i}`, + key: `col-${i}`, + width: 90, + render: (value: number) => ( + <NumericCell + options={{ style: Style.CURRENCY, currency: CurrencyCode.EUR }} + value={value} + locale={LocaleCode.en_US} + /> + ), + sorter: (a: BasicData, b: BasicData) => numericalSort(`col-${i}`, a, b), + }); + } + return newCols as ColumnsType<ExampleData>[]; +} +const recordCount = 500; +const columnCount = 500; +const randomCols: ColumnsType<ExampleData>[] = generateColumns(columnCount); + +const basicData: BasicData[] = [ + { + key: 1, + name: 'Floppy Disk 10 pack', + category: 'Disk Storage', + price: 9.99, + description: 'A real blast from the past', + }, + { + key: 2, + name: 'DVD 100 pack', + category: 'Optical Storage', + price: 27.99, + description: 'Still pretty ancient', + }, + { + key: 3, + name: '128 GB SSD', + category: 'Hardrive', + price: 49.99, + description: 'Reliable and fast data storage', + }, + { + key: 4, + name: '128 GB SSD', + category: 'Hardrive', + price: 49.99, + description: 'Reliable and fast data storage', + }, + { + key: 5, + name: '4GB 144mhz', + category: 'Memory', + price: 19.99, + description: 'Laptop memory', + }, + { + key: 6, + name: '1GB USB Flash Drive', + category: 'Portable Storage', + price: 9.99, + description: 'USB Flash Drive portal data storage', + }, + { + key: 7, + name: '256 GB SSD', + category: 'Hardrive', + price: 175, + description: 'Reliable and fast data storage', + }, + { + key: 8, + name: '1 TB SSD', + category: 'Hardrive', + price: 349.99, + description: 'Reliable and fast data storage', + }, +]; + +const basicColumns: ColumnsType<BasicData> = [ + { + title: 'Name', + dataIndex: 'name', + key: 'name', + width: 100, + sorter: (a: BasicData, b: BasicData) => alphabeticalSort('name', a, b), + }, + { + title: 'Category', + dataIndex: 'category', + key: 'category', + sorter: (a: BasicData, b: BasicData) => alphabeticalSort('category', a, b), + }, + { + title: 'Price', + dataIndex: 'price', + key: 'price', + sorter: (a: BasicData, b: BasicData) => numericalSort('price', a, b), + width: 100, + }, + { + title: 'Description', + dataIndex: 'description', + key: 'description', + }, +]; + +const bigColumns: ColumnsType<ExampleData> = [ + { + title: 'Name', + dataIndex: 'name', + key: 'name', + width: 150, + }, + { + title: 'Age', + dataIndex: 'age', + key: 'age', + sorter: (a: ExampleData, b: ExampleData) => numericalSort('age', a, b), + width: 75, + }, + { + title: 'Address', + dataIndex: 'address', + key: 'address', + width: 100, + }, + ...(randomCols as ColumnsType<ExampleData>), +]; + +const rendererColumns: ColumnsType<RendererData> = [ + { + title: 'Button Cell', + dataIndex: 'buttonCell', + key: 'buttonCell', + width: 150, + render: (text: string, data: object, index: number) => ( + <ButtonCell + label={text} + row={data} + index={index} + onClick={action('button-cell-click')} + /> + ), + }, + { + title: 'Text Cell', + dataIndex: 'textCell', + key: 'textCell', + }, + { + title: 'Euro Cell', + dataIndex: 'euroCell', + key: 'euroCell', + render: (value: number) => ( + <NumericCell + options={{ style: Style.CURRENCY, currency: CurrencyCode.EUR }} + value={value} + locale={LocaleCode.en_US} + /> + ), + }, + { + title: 'Dollar Cell', + dataIndex: 'dollarCell', + key: 'dollarCell', + render: (value: number) => ( + <NumericCell + options={{ style: Style.CURRENCY, currency: CurrencyCode.USD }} + value={value} + locale={LocaleCode.en_US} + /> + ), + }, + { + dataIndex: 'actions', + key: 'actions', + render: (text: string, row: object) => ( + <ActionCell row={row} menuOptions={exampleMenuOptions} /> + ), + width: 32, + fixed: 'right', + }, +]; + +const baseData: any[] = [ + { + key: 1, + name: 'John Brown', + age: 32, + address: 'New York No. 1 Lake Park', + tags: ['nice', 'developer'], + ...generateValues(columnCount), + }, + { + key: 2, + name: 'Jim Green', + age: 42, + address: 'London No. 1 Lake Park', + tags: ['loser'], + ...generateValues(columnCount), + }, + { + key: 3, + name: 'Joe Black', + age: 32, + address: 'Sidney No. 1 Lake Park', + tags: ['cool', 'teacher'], + ...generateValues(columnCount), + }, +]; + +const bigdata: any[] = []; +for (let i = 0; i < recordCount; i += 1) { + bigdata.push({ + key: i + baseData.length, + name: `Dynamic record ${i}`, + age: 32 + i, + address: `DynamoCity, Dynamic Lane no. ${i}`, + ...generateValues(columnCount, i), + }); +} + +export const Basic: ComponentStory<typeof Table> = args => <Table {...args} />; + +function handlers(record: object, rowIndex: number) { + return { + onClick: action( + `row onClick, row: ${rowIndex}, record: ${JSON.stringify(record)}`, + ), // click row + onDoubleClick: action( + `row onDoubleClick, row: ${rowIndex}, record: ${JSON.stringify(record)}`, + ), // double click row + onContextMenu: action( + `row onContextMenu, row: ${rowIndex}, record: ${JSON.stringify(record)}`, + ), // right button click row + onMouseEnter: action(`Mouse Enter, row: ${rowIndex}`), // mouse enter row + onMouseLeave: action(`Mouse Leave, row: ${rowIndex}`), // mouse leave row + }; +} + +Basic.args = { + data: basicData, + columns: basicColumns, + size: TableSize.SMALL, + onRow: handlers, + usePagination: false, +}; + +export const Pagination: ComponentStory<typeof Table> = args => ( + <Table {...args} /> +); + +Pagination.args = { + data: basicData, + columns: basicColumns, + size: TableSize.SMALL, + pageSizeOptions: ['5', '10', '15', '20', '25'], + defaultPageSize: 5, +}; + +const generateData = (startIndex: number, pageSize: number): BasicData[] => { + const data: BasicData[] = []; + for (let i = 0; i < pageSize; i += 1) { + const recordIndex = startIndex + i; + data.push({ + key: recordIndex, + name: `Dynamic Record ${recordIndex}`, + category: 'Disk Storage', + price: recordIndex * 2.59, + description: 'A random description', + }); + } + return data; +}; + +const paginationColumns: ColumnsType<BasicData> = [ + { + title: 'Name', + dataIndex: 'name', + key: 'name', + width: 100, + }, + { + title: 'Category', + dataIndex: 'category', + key: 'category', + }, + { + title: 'Price', + dataIndex: 'price', + key: 'price', + width: 100, + render: (value: number) => ( + <NumericCell + options={{ style: Style.CURRENCY, currency: CurrencyCode.EUR }} + value={value} + locale={LocaleCode.en_US} + /> + ), + sorter: (a: BasicData, b: BasicData) => numericalSort('price', a, b), + }, + { + title: 'Description', + dataIndex: 'description', + key: 'description', + }, + { + dataIndex: 'actions', + key: 'actions', + render: (text: string, row: object) => ( + <ActionCell row={row} menuOptions={exampleMenuOptions} /> + ), + width: 32, + fixed: 'right', + }, +]; + +export const ServerPagination: ComponentStory<typeof Table> = args => { + const [data, setData] = useState(generateData(0, 5)); + const [loading, setLoading] = useState(false); + + const handleChange: OnChangeFunction = ( + pagination, + filters, + sorter, + extra, + ) => { + const pageSize = pagination?.pageSize ?? 5; + const current = pagination?.current ?? 0; + switch (extra?.action) { + case ETableAction.PAGINATE: { + setLoading(true); + // simulate a fetch + setTimeout(() => { + setData(generateData(current * pageSize, pageSize)); + setLoading(false); + }, 1000); + break; + } + case ETableAction.SORT: { + action(`table-sort-change: ${JSON.stringify(sorter)}`); + break; + } + case ETableAction.FILTER: { + action(`table-sort-change: ${JSON.stringify(filters)}`); + break; + } + default: { + action('table action unknown'); + break; + } + } + }; + + return ( + <Table + {...args} + data={data} + recordCount={5000} + onChange={handleChange} + loading={loading} + /> + ); +}; + +ServerPagination.args = { + columns: paginationColumns, + size: TableSize.SMALL, + pageSizeOptions: ['5', '20', '50'], + defaultPageSize: 5, +}; + +export const VirtualizedPerformance: ComponentStory<typeof Table> = args => ( + <Table {...args} /> +); + +VirtualizedPerformance.args = { + data: bigdata, + columns: bigColumns, + size: TableSize.SMALL, + resizable: true, + reorderable: true, + height: 350, + virtualize: true, + usePagination: false, +}; + +export const Loading: ComponentStory<typeof Table> = args => ( + <Table {...args} /> +); + +Loading.args = { + data: basicData, + columns: basicColumns, + size: TableSize.SMALL, + loading: true, +}; + +export const ResizableColumns: ComponentStory<typeof Table> = args => ( + <Table {...args} /> +); + +ResizableColumns.args = { + data: basicData, + columns: basicColumns, + size: TableSize.SMALL, + resizable: true, +}; + +export const ReorderableColumns: ComponentStory<typeof Table> = args => { + const [droppedItem, setDroppedItem] = useState<string | undefined>(); + const dragOver = (ev: React.DragEvent<HTMLDivElement>) => { + ev.preventDefault(); + const element: HTMLElement | null = ev?.currentTarget as HTMLElement; + if (element?.style) { + element.style.border = '1px dashed green'; + } + }; + + const dragOut = (ev: React.DragEvent<HTMLDivElement>) => { + ev.preventDefault(); + const element: HTMLElement | null = ev?.currentTarget as HTMLElement; + if (element?.style) { + element.style.border = '1px solid grey'; + } + }; + + const dragDrop = (ev: React.DragEvent<HTMLDivElement>) => { + const data = ev.dataTransfer?.getData?.(SUPERSET_TABLE_COLUMN); + const element: HTMLElement | null = ev?.currentTarget as HTMLElement; + if (element?.style) { + element.style.border = '1px solid grey'; + } + setDroppedItem(data); + }; + return ( + <div> + <div + onDragOver={(ev: React.DragEvent<HTMLDivElement>) => dragOver(ev)} + onDragLeave={(ev: React.DragEvent<HTMLDivElement>) => dragOut(ev)} + onDrop={(ev: React.DragEvent<HTMLDivElement>) => dragDrop(ev)} + style={{ + width: '100%', + height: '40px', + border: '1px solid grey', + marginBottom: '8px', + padding: '8px', + borderRadius: '4px', + }} + > + {droppedItem ?? 'Drop column here...'} + </div> + <Table {...args} /> + </div> + ); +}; + +ReorderableColumns.args = { + data: basicData, + columns: basicColumns, + size: TableSize.SMALL, + reorderable: true, +}; + +const rendererData: RendererData[] = [ + { + key: 1, + buttonCell: 'Click Me', + textCell: 'Some text', + euroCell: 45.5, + dollarCell: 45.5, + }, + { + key: 2, + buttonCell: 'I am a button', + textCell: 'More text', + euroCell: 1700, + dollarCell: 1700, + }, + { + key: 3, + buttonCell: 'Button 3', + textCell: 'The third string of text', + euroCell: 500.567, + dollarCell: 500.567, + }, +]; + +export const CellRenderers: ComponentStory<typeof Table> = args => ( + <Table {...args} /> +); + +CellRenderers.args = { + data: rendererData, + columns: rendererColumns, + size: TableSize.SMALL, + reorderable: true, +}; + +export interface ShoppingData { + key: number; + item: string; + orderDate: number; + price: number; +} + +const shoppingData: ShoppingData[] = [ + { + key: 1, + item: 'Floppy Disk 10 pack', + orderDate: Date.now(), + price: 9.99, + }, + { + key: 2, + item: 'DVD 100 pack', + orderDate: Date.now(), + price: 7.99, + }, + { + key: 3, + item: '128 GB SSD', + orderDate: Date.now(), + price: 3.99, + }, +]; + +export const HeaderRenderers: ComponentStory<typeof Table> = args => { + const [orderDateFormatting, setOrderDateFormatting] = useState('formatted'); + const [priceLocale, setPriceLocale] = useState(LocaleCode.en_US); + const shoppingColumns: ColumnsType<ShoppingData> = [ + { + title: 'Item', + dataIndex: 'item', + key: 'item', + width: 200, + }, + { + title: () => ( + <HeaderWithRadioGroup + headerTitle="Order date" + groupTitle="Formatting" + groupOptions={[ + { label: 'Original value', value: 'original' }, + { label: 'Formatted value', value: 'formatted' }, + ]} + value={orderDateFormatting} + onChange={value => setOrderDateFormatting(value)} + /> + ), + dataIndex: 'orderDate', + key: 'orderDate', + width: 200, + render: value => + orderDateFormatting === 'original' ? value : <TimeCell value={value} />, + }, + { + title: () => ( + <HeaderWithRadioGroup + headerTitle="Price" + groupTitle="Currency" + groupOptions={[ + { label: 'US Dollar', value: LocaleCode.en_US }, + { label: 'Brazilian Real', value: LocaleCode.pt_BR }, + ]} + value={priceLocale} + onChange={value => setPriceLocale(value as LocaleCode)} + /> + ), + dataIndex: 'price', + key: 'price', + width: 200, + render: value => ( + <NumericCell + value={value} + options={{ + style: Style.CURRENCY, + currency: + priceLocale === LocaleCode.en_US + ? CurrencyCode.USD + : CurrencyCode.BRL, + }} + locale={priceLocale} + /> + ), + }, + ]; + + return ( + <Table + data={shoppingData} + columns={shoppingColumns} + size={TableSize.SMALL} + resizable + /> + ); +}; diff --git a/superset-frontend/src/components/Table/Table.test.tsx b/superset-frontend/src/components/Table/Table.test.tsx new file mode 100644 index 000000000000..eded7efeb96f --- /dev/null +++ b/superset-frontend/src/components/Table/Table.test.tsx @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import type { ColumnsType } from 'antd/es/table'; +import { Table, TableSize } from './index'; + +interface BasicData { + columnName: string; + columnType: string; + dataType: string; +} + +const testData: BasicData[] = [ + { + columnName: 'Number', + columnType: 'Numerical', + dataType: 'number', + }, + { + columnName: 'String', + columnType: 'Physical', + dataType: 'string', + }, + { + columnName: 'Date', + columnType: 'Virtual', + dataType: 'date', + }, +]; + +const testColumns: ColumnsType<BasicData> = [ + { + title: 'Column Name', + dataIndex: 'columnName', + key: 'columnName', + }, + { + title: 'Column Type', + dataIndex: 'columnType', + key: 'columnType', + }, + { + title: 'Data Type', + dataIndex: 'dataType', + key: 'dataType', + }, +]; + +test('renders with default props', async () => { + render( + <Table size={TableSize.MIDDLE} columns={testColumns} data={testData} />, + ); + await waitFor(() => + testColumns.forEach(column => + expect(screen.getByText(column.title as string)).toBeInTheDocument(), + ), + ); + testData.forEach(row => { + expect(screen.getByText(row.columnName)).toBeInTheDocument(); + expect(screen.getByText(row.columnType)).toBeInTheDocument(); + expect(screen.getByText(row.dataType)).toBeInTheDocument(); + }); +}); diff --git a/superset-frontend/src/components/Table/VirtualTable.tsx b/superset-frontend/src/components/Table/VirtualTable.tsx new file mode 100644 index 000000000000..fc7b7ee27d35 --- /dev/null +++ b/superset-frontend/src/components/Table/VirtualTable.tsx @@ -0,0 +1,247 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { Table as AntTable } from 'antd'; +import classNames from 'classnames'; +import { useResizeDetector } from 'react-resize-detector'; +import React, { useEffect, useRef, useState, useCallback } from 'react'; +import { VariableSizeGrid as Grid } from 'react-window'; +import { StyledComponent } from '@emotion/styled'; +import { useTheme, styled } from '@superset-ui/core'; +import { TablePaginationConfig } from 'antd/lib/table'; +import { TableProps, TableSize, ETableAction } from './index'; + +const StyledCell: StyledComponent<any> = styled('div')<any>( + ({ theme, height }) => ` + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding-left: ${theme.gridUnit * 2}px; + padding-right: ${theme.gridUnit}px; + border-bottom: 1px solid ${theme.colors.grayscale.light3}; + transition: background 0.3s; + line-height: ${height}px; + box-sizing: border-box; +`, +); + +const StyledTable: StyledComponent<any> = styled(AntTable)<any>( + ({ theme }) => ` + th.ant-table-cell { + font-weight: ${theme.typography.weights.bold}; + color: ${theme.colors.grayscale.dark1}; + user-select: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .ant-pagination-item-active { + border-color: ${theme.colors.primary.base}; + } + } +`, +); + +const SMALL = 39; +const MIDDLE = 47; + +const VirtualTable = (props: TableProps) => { + const { columns, pagination, onChange, height, scroll, size } = props; + const [tableWidth, setTableWidth] = useState<number>(0); + const onResize = useCallback((width: number) => { + setTableWidth(width); + }, []); + const { ref } = useResizeDetector({ onResize }); + const theme = useTheme(); + + // If a column definition has no width, react-window will use this as the default column width + const DEFAULT_COL_WIDTH = theme?.gridUnit * 37 || 150; + const widthColumnCount = columns!.filter(({ width }) => !width).length; + let staticColWidthTotal = 0; + columns?.forEach(column => { + if (column.width) { + staticColWidthTotal += column.width as number; + } + }); + + let totalWidth = 0; + const defaultWidth = Math.max( + Math.floor((tableWidth - staticColWidthTotal) / widthColumnCount), + 50, + ); + + const mergedColumns = + columns?.map?.(column => { + const modifiedColumn = { ...column }; + if (!column.width) { + modifiedColumn.width = defaultWidth; + } + totalWidth += modifiedColumn.width as number; + return modifiedColumn; + }) ?? []; + + /* + * There are cases where a user could set the width of each column and the total width is less than width of + * the table. In this case we will stretch the last column to use the extra space + */ + if (totalWidth < tableWidth) { + const lastColumn = mergedColumns[mergedColumns.length - 1]; + lastColumn.width = + (lastColumn.width as number) + Math.floor(tableWidth - totalWidth); + } + + const gridRef = useRef<any>(); + const [connectObject] = useState<any>(() => { + const obj = {}; + Object.defineProperty(obj, 'scrollLeft', { + get: () => { + if (gridRef.current) { + return gridRef.current?.state?.scrollLeft; + } + return null; + }, + set: (scrollLeft: number) => { + if (gridRef.current) { + gridRef.current.scrollTo({ scrollLeft }); + } + }, + }); + + return obj; + }); + + const resetVirtualGrid = () => { + gridRef.current?.resetAfterIndices({ + columnIndex: 0, + shouldForceUpdate: true, + }); + }; + + useEffect(() => resetVirtualGrid, [tableWidth, columns, size]); + + /* + * antd Table has a runtime error when it tries to fire the onChange event triggered from a pageChange + * when the table body is overridden with the virtualized table. This function capture the page change event + * from within the pagination controls and proxies the onChange event payload + */ + const onPageChange = (page: number, size: number) => { + /** + * This resets vertical scroll position to 0 (top) when page changes + * We intentionally leave horizontal scroll where it was so user can focus on + * specific range of columns as they page through data + */ + gridRef.current?.scrollTo?.({ scrollTop: 0 }); + + onChange?.( + { + ...pagination, + current: page, + pageSize: size, + } as TablePaginationConfig, + {}, + {}, + { + action: ETableAction.PAGINATE, + currentDataSource: [], + }, + ); + }; + + const renderVirtualList = (rawData: object[], { ref, onScroll }: any) => { + // eslint-disable-next-line no-param-reassign + ref.current = connectObject; + const cellSize = size === TableSize.MIDDLE ? MIDDLE : SMALL; + return ( + <Grid + ref={gridRef} + className="virtual-grid" + columnCount={mergedColumns.length} + columnWidth={(index: number) => { + const { width = DEFAULT_COL_WIDTH } = mergedColumns[index]; + return width as number; + }} + height={height || (scroll!.y as number)} + rowCount={rawData.length} + rowHeight={() => cellSize} + width={tableWidth} + onScroll={({ scrollLeft }: { scrollLeft: number }) => { + onScroll({ scrollLeft }); + }} + > + {({ + columnIndex, + rowIndex, + style, + }: { + columnIndex: number; + rowIndex: number; + style: React.CSSProperties; + }) => { + const data: any = rawData?.[rowIndex]; + // Set default content + let content = + data?.[(mergedColumns as any)?.[columnIndex]?.dataIndex]; + // Check if the column has a render function + const render = mergedColumns[columnIndex]?.render; + if (typeof render === 'function') { + // Use render function to generate formatted content using column's render function + content = render(content, data, rowIndex); + } + + return ( + <StyledCell + className={classNames('virtual-table-cell', { + 'virtual-table-cell-last': + columnIndex === mergedColumns.length - 1, + })} + style={style} + title={typeof content === 'string' ? content : undefined} + theme={theme} + height={cellSize} + > + {content} + </StyledCell> + ); + }} + </Grid> + ); + }; + + const modifiedPagination = { + ...pagination, + onChange: onPageChange, + }; + + return ( + <div ref={ref}> + <StyledTable + {...props} + sticky={false} + className="virtual-table" + columns={mergedColumns} + components={{ + body: renderVirtualList, + }} + pagination={modifiedPagination} + /> + </div> + ); +}; + +export default VirtualTable; diff --git a/superset-frontend/src/components/Table/cell-renderers/ActionCell/ActionCell.overview.mdx b/superset-frontend/src/components/Table/cell-renderers/ActionCell/ActionCell.overview.mdx new file mode 100644 index 000000000000..09e1b5ed6b17 --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/ActionCell/ActionCell.overview.mdx @@ -0,0 +1,69 @@ +import { Meta, Source, Story, ArgsTable } from '@storybook/addon-docs'; + +<Meta title="Design System/Components/Table/Cell Renderers/ActionCell/Overview" /> + +# ActionCell + +An ActionCell is used to display an overflow icon that opens a menu allowing the user to take actions +specific to the data in the table row that the cell is a member of. + +### [Basic example](./?path=/docs/design-system-components-table-cell-renderers-actioncell--basic) + +<Story id="design-system-components-table-cell-renderers-actioncell--basic" /> + +--- + +## Usage + +The action cell accepts an array of objects that define the label, tooltip, onClick callback functions, +and an optional data payload to be provided back to the onClick handler function. + +### [Basic example](./?path=/docs/design-system-components-table-cell-renderers-actioncell--basic) + +<Story id="design-system-components-table-cell-renderers-actioncell--basic" /> + +``` +import { ActionMenuItem } from 'src/components/Table/cell-renderers/index'; + +export const exampleMenuOptions: ActionMenuItem[] = [ + { + label: 'Action 1', + tooltip: "This is a tip, don't spend it all in one place", + onClick: (item: ActionMenuItem) => { + // eslint-disable-next-line no-alert + alert(JSON.stringify(item)); + }, + payload: { + taco: 'spicy chicken', + }, + }, + { + label: 'Action 2', + tooltip: 'This is another tip', + onClick: (item: ActionMenuItem) => { + // eslint-disable-next-line no-alert + alert(JSON.stringify(item)); + }, + payload: { + taco: 'saucy tofu', + }, + }, +]; + +``` + +Within the context of adding an action cell to cell definitions provided to the table using the ActionCell component +for the return value from the render function on the cell definition. See the [Basic example](./?path=/docs/design-system-components-table-examples--basic) + +``` +import ActionCell from './index'; + +const cellExample = [ + { + title: 'Actions', + dataIndex: 'actions', + key: 'actions', + render: () => <ActionCell menuOptions={exampleMenuOptions} />, + } +] +``` diff --git a/superset-frontend/src/components/Table/cell-renderers/ActionCell/ActionCell.stories.tsx b/superset-frontend/src/components/Table/cell-renderers/ActionCell/ActionCell.stories.tsx new file mode 100644 index 000000000000..d51dbcc559fd --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/ActionCell/ActionCell.stories.tsx @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import ActionCell from './index'; +import { exampleMenuOptions, exampleRow } from './fixtures'; + +export default { + title: 'Design System/Components/Table/Cell Renderers/ActionCell', + component: ActionCell, +} as ComponentMeta<typeof ActionCell>; + +export const Basic: ComponentStory<typeof ActionCell> = args => ( + <ActionCell {...args} /> +); + +Basic.args = { + menuOptions: exampleMenuOptions, + row: exampleRow, +}; diff --git a/superset-frontend/src/components/Table/cell-renderers/ActionCell/ActionCell.test.tsx b/superset-frontend/src/components/Table/cell-renderers/ActionCell/ActionCell.test.tsx new file mode 100644 index 000000000000..5da7453aa9d7 --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/ActionCell/ActionCell.test.tsx @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; +import ActionCell, { appendDataToMenu } from './index'; +import { exampleMenuOptions, exampleRow } from './fixtures'; + +test('renders with default props', async () => { + const clickHandler = jest.fn(); + exampleMenuOptions[0].onClick = clickHandler; + render(<ActionCell menuOptions={exampleMenuOptions} row={exampleRow} />); + // Open the menu + userEvent.click(await screen.findByTestId('dropdown-trigger')); + // verify all of the menu items are being displayed + exampleMenuOptions.forEach((item, index) => { + expect(screen.getByText(item.label)).toBeInTheDocument(); + if (index === 0) { + // verify the menu items' onClick gets invoked + userEvent.click(screen.getByText(item.label)); + } + }); + expect(clickHandler).toHaveBeenCalled(); +}); + +/** + * Validate that the appendDataToMenu utility function used within the + * Action cell menu rendering works as expected + */ +test('appendDataToMenu utility', () => { + exampleMenuOptions.forEach(item => expect(item?.row).toBeUndefined()); + const modifiedMenuOptions = appendDataToMenu(exampleMenuOptions, exampleRow); + modifiedMenuOptions.forEach(item => expect(item?.row).toBeDefined()); +}); diff --git a/superset-frontend/src/components/Table/cell-renderers/ActionCell/fixtures.ts b/superset-frontend/src/components/Table/cell-renderers/ActionCell/fixtures.ts new file mode 100644 index 000000000000..a0569b69906b --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/ActionCell/fixtures.ts @@ -0,0 +1,47 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { action } from '@storybook/addon-actions'; +import { ActionMenuItem } from './index'; + +export const exampleMenuOptions: ActionMenuItem[] = [ + { + label: 'Action 1', + tooltip: "This is a tip, don't spend it all in one place", + onClick: action('menu item onClick'), + payload: { + taco: 'spicy chicken', + }, + }, + { + label: 'Action 2', + tooltip: 'This is another tip', + onClick: action('menu item onClick'), + payload: { + taco: 'saucy tofu', + }, + }, +]; + +export const exampleRow = { + key: 1, + buttonCell: 'Click Me', + textCell: 'Some text', + euroCell: 45.5, + dollarCell: 45.5, +}; diff --git a/superset-frontend/src/components/Table/cell-renderers/ActionCell/index.tsx b/superset-frontend/src/components/Table/cell-renderers/ActionCell/index.tsx new file mode 100644 index 000000000000..b6ba57420c6b --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/ActionCell/index.tsx @@ -0,0 +1,145 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useState, useEffect } from 'react'; +import { styled } from '@superset-ui/core'; +import { Dropdown, IconOrientation } from 'src/components/Dropdown'; +import { Menu } from 'src/components/Menu'; +import { MenuProps } from 'antd/lib/menu'; + +/** + * Props interface for Action Cell Renderer + */ +export interface ActionCellProps { + /** + * The Menu option presented to user when menu displays + */ + menuOptions: ActionMenuItem[]; + /** + * Object representing the data rendering the Table row with attribute for each column + */ + row: object; +} + +export interface ActionMenuItem { + /** + * Click handler specific to the menu item + * @param menuItem The definition of the menu item that was clicked + * @returns ActionMenuItem + */ + onClick: (menuItem: ActionMenuItem) => void; + /** + * Label user will see displayed in the list of menu options + */ + label: string; + /** + * Optional tooltip user will see if they hover over the menu option to get more context + */ + tooltip?: string; + /** + * Optional variable that can contain data relevant to the menu item that you + * want easy access to in the callback function for the menu + */ + payload?: any; + /** + * Object representing the data rendering the Table row with attribute for each column + */ + row?: object; +} + +/** + * Props interface for ActionMenu + */ +export interface ActionMenuProps { + menuOptions: ActionMenuItem[]; + setVisible: (visible: boolean) => void; +} + +const SHADOW = + 'box-shadow: 0px 3px 6px -4px rgba(0, 0, 0, 0.12), 0px 9px 28px 8px rgba(0, 0, 0, 0.05)'; +const FILTER = 'drop-shadow(0px 6px 16px rgba(0, 0, 0, 0.08))'; + +const StyledMenu = styled(Menu)` + box-shadow: ${SHADOW} !important; + filter: ${FILTER} !important; + border-radius: 2px !important; + -webkit-box-shadow: ${SHADOW} !important; +`; + +export const appendDataToMenu = ( + options: ActionMenuItem[], + row: object, +): ActionMenuItem[] => { + const newOptions = options?.map?.(option => ({ + ...option, + row, + })); + return newOptions; +}; + +function ActionMenu(props: ActionMenuProps) { + const { menuOptions, setVisible } = props; + const handleClick: MenuProps['onClick'] = ({ key }) => { + setVisible?.(false); + const menuItem = menuOptions[key]; + if (menuItem) { + menuItem?.onClick?.(menuItem); + } + }; + + return ( + <StyledMenu onClick={handleClick}> + {menuOptions?.map?.((option: ActionMenuItem, index: number) => ( + <Menu.Item key={index}>{option?.label}</Menu.Item> + ))} + </StyledMenu> + ); +} + +export function ActionCell(props: ActionCellProps) { + const { menuOptions, row } = props; + const [visible, setVisible] = useState(false); + const [appendedMenuOptions, setAppendedMenuOptions] = useState( + appendDataToMenu(menuOptions, row), + ); + + useEffect(() => { + const newOptions = appendDataToMenu(menuOptions, row); + setAppendedMenuOptions(newOptions); + }, [menuOptions, row]); + + const handleVisibleChange = (flag: boolean) => { + setVisible(flag); + }; + return ( + <Dropdown + iconOrientation={IconOrientation.HORIZONTAL} + onVisibleChange={handleVisibleChange} + trigger={['click']} + overlay={ + <ActionMenu menuOptions={appendedMenuOptions} setVisible={setVisible} /> + } + disabled={ + !(appendedMenuOptions?.length && appendedMenuOptions.length > 0) + } + visible={visible} + /> + ); +} + +export default ActionCell; diff --git a/superset-frontend/src/components/Table/cell-renderers/BooleanCell/BooleanCell.stories.tsx b/superset-frontend/src/components/Table/cell-renderers/BooleanCell/BooleanCell.stories.tsx new file mode 100644 index 000000000000..8a98f18299c7 --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/BooleanCell/BooleanCell.stories.tsx @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import BooleanCell from '.'; + +export default { + title: 'Design System/Components/Table/Cell Renderers/BooleanCell', + component: BooleanCell, +} as ComponentMeta<typeof BooleanCell>; + +export const Basic: ComponentStory<typeof BooleanCell> = args => ( + <BooleanCell {...args} /> +); + +Basic.args = { + value: true, +}; diff --git a/superset-frontend/src/components/Table/cell-renderers/BooleanCell/BooleanCell.test.tsx b/superset-frontend/src/components/Table/cell-renderers/BooleanCell/BooleanCell.test.tsx new file mode 100644 index 000000000000..fa83db6271d9 --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/BooleanCell/BooleanCell.test.tsx @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import { BOOL_FALSE_DISPLAY, BOOL_TRUE_DISPLAY } from 'src/constants'; +import BooleanCell from '.'; + +test('renders true value', async () => { + render(<BooleanCell value />); + expect(screen.getByText(BOOL_TRUE_DISPLAY)).toBeInTheDocument(); +}); + +test('renders false value', async () => { + render(<BooleanCell value={false} />); + expect(screen.getByText(BOOL_FALSE_DISPLAY)).toBeInTheDocument(); +}); + +test('renders falsy value', async () => { + render(<BooleanCell />); + expect(screen.getByText(BOOL_FALSE_DISPLAY)).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/components/Table/cell-renderers/BooleanCell/index.tsx b/superset-frontend/src/components/Table/cell-renderers/BooleanCell/index.tsx new file mode 100644 index 000000000000..2707d522417d --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/BooleanCell/index.tsx @@ -0,0 +1,30 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { BOOL_FALSE_DISPLAY, BOOL_TRUE_DISPLAY } from 'src/constants'; + +export interface BooleanCellProps { + value?: boolean; +} + +function BooleanCell({ value }: BooleanCellProps) { + return <span>{value ? BOOL_TRUE_DISPLAY : BOOL_FALSE_DISPLAY}</span>; +} + +export default BooleanCell; diff --git a/superset-frontend/src/components/Table/cell-renderers/ButtonCell/ButtonCell.stories.tsx b/superset-frontend/src/components/Table/cell-renderers/ButtonCell/ButtonCell.stories.tsx new file mode 100644 index 000000000000..707e758eedb8 --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/ButtonCell/ButtonCell.stories.tsx @@ -0,0 +1,62 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { action } from '@storybook/addon-actions'; +import { ButtonCell } from './index'; + +export default { + title: 'Design System/Components/Table/Cell Renderers/ButtonCell', + component: ButtonCell, +} as ComponentMeta<typeof ButtonCell>; + +const clickHandler = action('button cell onClick'); + +export const Basic: ComponentStory<typeof ButtonCell> = args => ( + <ButtonCell {...args} /> +); + +Basic.args = { + onClick: clickHandler, + label: 'Primary', + row: { + key: 1, + buttonCell: 'Click Me', + textCell: 'Some text', + euroCell: 45.5, + dollarCell: 45.5, + }, +}; + +export const Secondary: ComponentStory<typeof ButtonCell> = args => ( + <ButtonCell {...args} /> +); + +Secondary.args = { + onClick: clickHandler, + label: 'Secondary', + buttonStyle: 'secondary', + row: { + key: 1, + buttonCell: 'Click Me', + textCell: 'Some text', + euroCell: 45.5, + dollarCell: 45.5, + }, +}; diff --git a/superset-frontend/src/components/Table/cell-renderers/ButtonCell/ButtonCell.test.tsx b/superset-frontend/src/components/Table/cell-renderers/ButtonCell/ButtonCell.test.tsx new file mode 100644 index 000000000000..dbdb8fd4f2f2 --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/ButtonCell/ButtonCell.test.tsx @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; +import ButtonCell from './index'; +import { exampleRow } from '../fixtures'; + +test('renders with default props', async () => { + const clickHandler = jest.fn(); + const BUTTON_LABEL = 'Button Label'; + + render( + <ButtonCell + label={BUTTON_LABEL} + key={5} + index={0} + row={exampleRow} + onClick={clickHandler} + />, + ); + await userEvent.click(screen.getByText(BUTTON_LABEL)); + expect(clickHandler).toHaveBeenCalled(); +}); diff --git a/superset-frontend/src/dashboard/stylesheets/builder.less b/superset-frontend/src/components/Table/cell-renderers/ButtonCell/index.tsx similarity index 51% rename from superset-frontend/src/dashboard/stylesheets/builder.less rename to superset-frontend/src/components/Table/cell-renderers/ButtonCell/index.tsx index 422d455622a4..c5739a386ced 100644 --- a/superset-frontend/src/dashboard/stylesheets/builder.less +++ b/superset-frontend/src/components/Table/cell-renderers/ButtonCell/index.tsx @@ -16,34 +16,43 @@ * specific language governing permissions and limitations * under the License. */ -.dashboard { - position: relative; - color: @almost-black; - flex-grow: 1; - display: flex; - flex-direction: column; - height: 100%; -} +import React from 'react'; +import Button, { ButtonStyle, ButtonSize } from 'src/components/Button'; -/* only top-level tabs have popover, give it more padding to match header + tabs */ -.dashboard > .with-popover-menu > .popover-menu { - left: 24px; -} +type onClickFunction = (row: object, index: number) => void; -/* drop shadow for top-level tabs only */ -.dashboard .dashboard-component-tabs { - box-shadow: 0 4px 4px 0 fade(@darkest, @opacity-light); - padding-left: 8px; /* note this is added to tab-level padding, to match header */ +export interface ButtonCellProps { + label: string; + onClick: onClickFunction; + row: object; + index: number; + tooltip?: string; + buttonStyle?: ButtonStyle; + buttonSize?: ButtonSize; } -.dropdown-toggle.btn.btn-primary .caret { - color: @lightest; -} +export function ButtonCell(props: ButtonCellProps) { + const { + label, + onClick, + row, + index, + tooltip, + buttonStyle = 'primary', + buttonSize = 'small', + } = props; -.background--transparent { - background-color: transparent; + return ( + <Button + buttonStyle={buttonStyle} + buttonSize={buttonSize} + onClick={() => onClick?.(row, index)} + key={`${buttonStyle}_${buttonSize}`} + tooltip={tooltip} + > + {label} + </Button> + ); } -.background--white { - background-color: @lightest; -} +export default ButtonCell; diff --git a/superset-frontend/src/dashboard/stylesheets/index.less b/superset-frontend/src/components/Table/cell-renderers/NullCell/NullCell.stories.tsx similarity index 70% rename from superset-frontend/src/dashboard/stylesheets/index.less rename to superset-frontend/src/components/Table/cell-renderers/NullCell/NullCell.stories.tsx index ba46688dfe64..ff39cd25528b 100644 --- a/superset-frontend/src/dashboard/stylesheets/index.less +++ b/superset-frontend/src/components/Table/cell-renderers/NullCell/NullCell.stories.tsx @@ -16,14 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -@import '../../assets/stylesheets/less/variables.less'; +import React from 'react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import NullCell from '.'; -@import './builder.less'; -@import './builder-sidepane.less'; -@import './dashboard.less'; -@import './dnd.less'; -@import './filter-scope-selector.less'; -@import './grid.less'; -@import './popover-menu.less'; -@import './resizable.less'; -@import './components/index.less'; +export default { + title: 'Design System/Components/Table/Cell Renderers/NullCell', + component: NullCell, +} as ComponentMeta<typeof NullCell>; + +export const Basic: ComponentStory<typeof NullCell> = () => <NullCell />; diff --git a/superset-frontend/src/explore/reducers/index.js b/superset-frontend/src/components/Table/cell-renderers/NullCell/NullCell.test.tsx similarity index 60% rename from superset-frontend/src/explore/reducers/index.js rename to superset-frontend/src/components/Table/cell-renderers/NullCell/NullCell.test.tsx index a504fbf6e644..3a3fd9d416ca 100644 --- a/superset-frontend/src/explore/reducers/index.js +++ b/superset-frontend/src/components/Table/cell-renderers/NullCell/NullCell.test.tsx @@ -16,23 +16,20 @@ * specific language governing permissions and limitations * under the License. */ -import { combineReducers } from 'redux'; +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import { supersetTheme } from '@superset-ui/core'; +import { NULL_DISPLAY } from 'src/constants'; +import NullCell from '.'; -import reports from 'src/reports/reducers/reports'; -import charts from 'src/components/Chart/chartReducer'; -import dataMask from 'src/dataMask/reducer'; -import messageToasts from 'src/components/MessageToasts/reducers'; -import saveModal from './saveModalReducer'; -import explore from './exploreReducer'; - -const impressionId = (state = '') => state; +test('renders null value', async () => { + render(<NullCell />); + expect(screen.getByText(NULL_DISPLAY)).toBeInTheDocument(); +}); -export default combineReducers({ - charts, - saveModal, - dataMask, - explore, - impressionId, - messageToasts, - reports, +test('renders with gray font', async () => { + render(<NullCell />); + expect(screen.getByText(NULL_DISPLAY)).toHaveStyle( + `color: ${supersetTheme.colors.grayscale.light1}`, + ); }); diff --git a/superset-frontend/src/components/Table/cell-renderers/NullCell/index.tsx b/superset-frontend/src/components/Table/cell-renderers/NullCell/index.tsx new file mode 100644 index 000000000000..f1c9139fd9f0 --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/NullCell/index.tsx @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { css, SupersetTheme } from '@superset-ui/core'; +import { NULL_DISPLAY } from 'src/constants'; + +function NullCell() { + return ( + <span + css={(theme: SupersetTheme) => + css` + color: ${theme.colors.grayscale.light1}; + ` + } + > + {NULL_DISPLAY} + </span> + ); +} + +export default NullCell; diff --git a/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorScheme.test.jsx b/superset-frontend/src/components/Table/cell-renderers/NumericCell/NumericCell.stories.tsx similarity index 55% rename from superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorScheme.test.jsx rename to superset-frontend/src/components/Table/cell-renderers/NumericCell/NumericCell.stories.tsx index 565c4f9f28b5..bb0b52fe625f 100644 --- a/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorScheme.test.jsx +++ b/superset-frontend/src/components/Table/cell-renderers/NumericCell/NumericCell.stories.tsx @@ -16,28 +16,32 @@ * specific language governing permissions and limitations * under the License. */ -/* eslint-disable no-unused-expressions */ import React from 'react'; -import { Select } from 'src/components'; -import { getCategoricalSchemeRegistry } from '@superset-ui/core'; -import { styledMount as mount } from 'spec/helpers/theming'; -import ColorSchemeControl from 'src/explore/components/controls/ColorSchemeControl'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { CurrencyCode, LocaleCode, NumericCell, Style } from './index'; -const defaultProps = { - name: 'color_scheme', - label: 'Color Scheme', - options: getCategoricalSchemeRegistry() - .keys() - .map(s => [s, s]), +export default { + title: 'Design System/Components/Table/Cell Renderers/NumericCell', + component: NumericCell, +} as ComponentMeta<typeof NumericCell>; + +export const Basic: ComponentStory<typeof NumericCell> = args => ( + <NumericCell {...args} /> +); + +Basic.args = { + value: 5678943, }; -describe('ColorSchemeControl', () => { - let wrapper; - beforeEach(() => { - wrapper = mount(<ColorSchemeControl {...defaultProps} />); - }); +export const FrenchLocale: ComponentStory<typeof NumericCell> = args => ( + <NumericCell {...args} /> +); - it('renders a Select', () => { - expect(wrapper.find(Select)).toExist(); - }); -}); +FrenchLocale.args = { + value: 5678943, + locale: LocaleCode.fr, + options: { + style: Style.CURRENCY, + currency: CurrencyCode.EUR, + }, +}; diff --git a/superset-frontend/src/explore/exploreUtils/getAnnotationJsonUrl.test.ts b/superset-frontend/src/components/Table/cell-renderers/NumericCell/NumericCell.test.tsx similarity index 51% rename from superset-frontend/src/explore/exploreUtils/getAnnotationJsonUrl.test.ts rename to superset-frontend/src/components/Table/cell-renderers/NumericCell/NumericCell.test.tsx index 388c3b9a0309..b76a5bef65f8 100644 --- a/superset-frontend/src/explore/exploreUtils/getAnnotationJsonUrl.test.ts +++ b/superset-frontend/src/components/Table/cell-renderers/NumericCell/NumericCell.test.tsx @@ -16,36 +16,34 @@ * specific language governing permissions and limitations * under the License. */ -import { getAnnotationJsonUrl } from '.'; +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import NumericCell, { CurrencyCode, LocaleCode, Style } from './index'; -let windowLocation: any; - -beforeAll(() => { - windowLocation = window.location; - // @ts-expect-error - delete window.location; -}); - -beforeEach(() => { - window.location = { - search: '?testA=0&testB=1', - } as any; -}); - -afterAll(() => { - window.location = windowLocation; -}); - -test('get correct annotation when isNative:true', () => { - const response = getAnnotationJsonUrl('slice_id', 'form_data', true); - expect(response).toBe( - '/superset/annotation_json/slice_id?form_data=%22form_data%22', +test('renders with French locale and Euro currency format', () => { + render( + <NumericCell + value={5678943} + locale={LocaleCode.fr} + options={{ + style: Style.CURRENCY, + currency: CurrencyCode.EUR, + }} + />, ); + expect(screen.getByText('5 678 943,00 €')).toBeInTheDocument(); }); -test('get correct annotation when isNative:false', () => { - const response = getAnnotationJsonUrl('slice_id', { json: 'my-data' }, false); - expect(response).toBe( - '/superset/slice_json/slice_id?form_data=%7B%22json%22%3A%22my-data%22%7D', +test('renders with English US locale and USD currency format', () => { + render( + <NumericCell + value={5678943} + locale={LocaleCode.en_US} + options={{ + style: Style.CURRENCY, + currency: CurrencyCode.USD, + }} + />, ); + expect(screen.getByText('$5,678,943.00')).toBeInTheDocument(); }); diff --git a/superset-frontend/src/components/Table/cell-renderers/NumericCell/index.tsx b/superset-frontend/src/components/Table/cell-renderers/NumericCell/index.tsx new file mode 100644 index 000000000000..5e6d61aa4782 --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/NumericCell/index.tsx @@ -0,0 +1,418 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { logging } from '@superset-ui/core'; + +export interface NumericCellProps { + /** + * The number to display (before optional formatting applied) + */ + value: number; + /** + * ISO 639-1 language code with optional region or script modifier (e.g. en_US). + */ + locale?: LocaleCode; + /** + * Options for number formatting + */ + options?: NumberOptions; +} + +interface NumberOptions { + /** + * Style of number to display + */ + style?: Style; + + /** + * ISO 4217 currency code + */ + currency?: CurrencyCode; + + /** + * Languages in the form of a ISO 639-1 language code with optional region or script modifier (e.g. de_AT). + */ + maximumFractionDigits?: number; + + /** + * A number from 1 to 21 (default is 21) + */ + maximumSignificantDigits?: number; + + /** + * A number from 0 to 20 (default is 3) + */ + minimumFractionDigits?: number; + + /** + * A number from 1 to 21 (default is 1) + */ + minimumIntegerDigits?: number; + + /** + * A number from 1 to 21 (default is 21) + */ + minimumSignificantDigits?: number; +} + +export enum Style { + CURRENCY = 'currency', + DECIMAL = 'decimal', + PERCENT = 'percent', +} + +export enum CurrencyDisplay { + SYMBOL = 'symbol', + CODE = 'code', + NAME = 'name', +} + +export enum LocaleCode { + af = 'af', + ak = 'ak', + sq = 'sq', + am = 'am', + ar = 'ar', + hy = 'hy', + as = 'as', + az = 'az', + bm = 'bm', + bn = 'bn', + eu = 'eu', + be = 'be', + bs = 'bs', + br = 'br', + bg = 'bg', + my = 'my', + ca = 'ca', + ce = 'ce', + zh = 'zh', + zh_Hans = 'zh-Hans', + zh_Hant = 'zh-Hant', + cu = 'cu', + kw = 'kw', + co = 'co', + hr = 'hr', + cs = 'cs', + da = 'da', + nl = 'nl', + nl_BE = 'nl-BE', + dz = 'dz', + en = 'en', + en_AU = 'en-AU', + en_CA = 'en-CA', + en_GB = 'en-GB', + en_US = 'en-US', + eo = 'eo', + et = 'et', + ee = 'ee', + fo = 'fo', + fi = 'fi', + fr = 'fr', + fr_CA = 'fr-CA', + fr_CH = 'fr-CH', + ff = 'ff', + gl = 'gl', + lg = 'lg', + ka = 'ka', + de = 'de', + de_AT = 'de-AT', + de_CH = 'de-CH', + el = 'el', + gu = 'gu', + ht = 'ht', + ha = 'ha', + he = 'he', + hi = 'hi', + hu = 'hu', + is = 'is', + ig = 'ig', + id = 'id', + ia = 'ia', + ga = 'ga', + it = 'it', + ja = 'ja', + jv = 'jv', + kl = 'kl', + kn = 'kn', + ks = 'ks', + kk = 'kk', + km = 'km', + ki = 'ki', + rw = 'rw', + ko = 'ko', + ku = 'ku', + ky = 'ky', + lo = 'lo', + la = 'la', + lv = 'lv', + ln = 'ln', + lt = 'lt', + lu = 'lu', + lb = 'lb', + mk = 'mk', + mg = 'mg', + ms = 'ms', + ml = 'ml', + mt = 'mt', + gv = 'gv', + mi = 'mi', + mr = 'mr', + mn = 'mn', + ne = 'ne', + nd = 'nd', + se = 'se', + nb = 'nb', + nn = 'nn', + ny = 'ny', + or = 'or', + om = 'om', + os = 'os', + ps = 'ps', + fa = 'fa', + fa_AF = 'fa-AF', + pl = 'pl', + pt = 'pt', + pt_BR = 'pt-BR', + pt_PT = 'pt-PT', + pa = 'pa', + qu = 'qu', + ro = 'ro', + ro_MD = 'ro-MD', + rm = 'rm', + rn = 'rn', + ru = 'ru', + sm = 'sm', + sg = 'sg', + sa = 'sa', + gd = 'gd', + sr = 'sr', + sn = 'sn', + ii = 'ii', + sd = 'sd', + si = 'si', + sk = 'sk', + sl = 'sl', + so = 'so', + st = 'st', + es = 'es', + es_ES = 'es-ES', + es_MX = 'es-MX', + su = 'su', + sw = 'sw', + sw_CD = 'sw-CD', + sv = 'sv', + tg = 'tg', + ta = 'ta', + tt = 'tt', + te = 'te', + th = 'th', + bo = 'bo', + ti = 'ti', + to = 'to', + tr = 'tr', + tk = 'tk', + uk = 'uk', + ur = 'ur', + ug = 'ug', + uz = 'uz', + vi = 'vi', + vo = 'vo', + cy = 'cy', + fy = 'fy', + wo = 'wo', + xh = 'xh', + yi = 'yi', + yo = 'yo', + zu = 'zu', +} + +export enum CurrencyCode { + AED = 'AED', + AFN = 'AFN', + ALL = 'ALL', + AMD = 'AMD', + ANG = 'ANG', + AOA = 'AOA', + ARS = 'ARS', + AUD = 'AUD', + AWG = 'AWG', + AZN = 'AZN', + BAM = 'BAM', + BBD = 'BBD', + BDT = 'BDT', + BGN = 'BGN', + BHD = 'BHD', + BIF = 'BIF', + BMD = 'BMD', + BND = 'BND', + BOB = 'BOB', + BRL = 'BRL', + BSD = 'BSD', + BTN = 'BTN', + BWP = 'BWP', + BYN = 'BYN', + BZD = 'BZD', + CAD = 'CAD', + CDF = 'CDF', + CHF = 'CHF', + CLP = 'CLP', + CNY = 'CNY', + COP = 'COP', + CRC = 'CRC', + CUC = 'CUC', + CUP = 'CUP', + CVE = 'CVE', + CZK = 'CZK', + DJF = 'DJF', + DKK = 'DKK', + DOP = 'DOP', + DZD = 'DZD', + EGP = 'EGP', + ERN = 'ERN', + ETB = 'ETB', + EUR = 'EUR', + FJD = 'FJD', + FKP = 'FKP', + GBP = 'GBP', + GEL = 'GEL', + GHS = 'GHS', + GIP = 'GIP', + GMD = 'GMD', + GNF = 'GNF', + GTQ = 'GTQ', + GYD = 'GYD', + HKD = 'HKD', + HNL = 'HNL', + HRK = 'HRK', + HTG = 'HTG', + HUF = 'HUF', + IDR = 'IDR', + ILS = 'ILS', + INR = 'INR', + IQD = 'IQD', + IRR = 'IRR', + ISK = 'ISK', + JMD = 'JMD', + JOD = 'JOD', + JPY = 'JPY', + KES = 'KES', + KGS = 'KGS', + KHR = 'KHR', + KMF = 'KMF', + KPW = 'KPW', + KRW = 'KRW', + KWD = 'KWD', + KYD = 'KYD', + KZT = 'KZT', + LAK = 'LAK', + LBP = 'LBP', + LKR = 'LKR', + LRD = 'LRD', + LSL = 'LSL', + LYD = 'LYD', + MAD = 'MAD', + MDL = 'MDL', + MGA = 'MGA', + MKD = 'MKD', + MMK = 'MMK', + MNT = 'MNT', + MOP = 'MOP', + MRU = 'MRU', + MUR = 'MUR', + MVR = 'MVR', + MWK = 'MWK', + MXN = 'MXN', + MYR = 'MYR', + MZN = 'MZN', + NAD = 'NAD', + NGN = 'NGN', + NIO = 'NIO', + NOK = 'NOK', + NPR = 'NPR', + NZD = 'NZD', + OMR = 'OMR', + PAB = 'PAB', + PEN = 'PEN', + PGK = 'PGK', + PHP = 'PHP', + PKR = 'PKR', + PLN = 'PLN', + PYG = 'PYG', + QAR = 'QAR', + RON = 'RON', + RSD = 'RSD', + RUB = 'RUB', + RWF = 'RWF', + SAR = 'SAR', + SBD = 'SBD', + SCR = 'SCR', + SDG = 'SDG', + SEK = 'SEK', + SGD = 'SGD', + SHP = 'SHP', + SLL = 'SLL', + SOS = 'SOS', + SRD = 'SRD', + SSP = 'SSP', + STN = 'STN', + SVC = 'SVC', + SYP = 'SYP', + SZL = 'SZL', + THB = 'THB', + TJS = 'TJS', + TMT = 'TMT', + TND = 'TND', + TOP = 'TOP', + TRY = 'TRY', + TTD = 'TTD', + TWD = 'TWD', + TZS = 'TZS', + UAH = 'UAH', + UGX = 'UGX', + USD = 'USD', + UYU = 'UYU', + UZS = 'UZS', + VES = 'VES', + VND = 'VND', + VUV = 'VUV', + WST = 'WST', + XAF = 'XAF', + XCD = 'XCD', + XOF = 'XOF', + XPF = 'XPF', + YER = 'YER', + ZAR = 'ZAR', + ZMW = 'ZMW', + ZWL = 'ZWL', +} + +export function NumericCell(props: NumericCellProps) { + const { value, locale = LocaleCode.en_US, options } = props; + let displayValue = value?.toString() ?? value; + try { + displayValue = value?.toLocaleString?.(locale, options); + } catch (e) { + logging.error(e); + } + + return <span>{displayValue}</span>; +} + +export default NumericCell; diff --git a/superset-frontend/src/dashboard/stylesheets/components/markdown.less b/superset-frontend/src/components/Table/cell-renderers/TimeCell/TimeCell.stories.tsx similarity index 57% rename from superset-frontend/src/dashboard/stylesheets/components/markdown.less rename to superset-frontend/src/components/Table/cell-renderers/TimeCell/TimeCell.stories.tsx index d8b3676eb8e9..f37c5b8c6af3 100644 --- a/superset-frontend/src/dashboard/stylesheets/components/markdown.less +++ b/superset-frontend/src/components/Table/cell-renderers/TimeCell/TimeCell.stories.tsx @@ -16,42 +16,28 @@ * specific language governing permissions and limitations * under the License. */ -.dashboard-markdown { - overflow: hidden; +import React from 'react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { TimeFormats } from '@superset-ui/core'; +import TimeCell from '.'; - h4, - h5, - h6 { - font-weight: @font-weight-normal; - } +export default { + title: 'Design System/Components/Table/Cell Renderers/TimeCell', + component: TimeCell, +} as ComponentMeta<typeof TimeCell>; - h5 { - color: @gray-heading; - } +export const Basic: ComponentStory<typeof TimeCell> = args => ( + <TimeCell {...args} /> +); - h6 { - font-size: @font-size-s; - } +Basic.args = { + value: Date.now(), +}; - .dashboard-component-chart-holder { - overflow-y: auto; - overflow-x: hidden; - } - - .dashboard--editing & { - cursor: move; - } - - #ace-editor { - border: none; - } -} - -/* maximize editing space */ -.dashboard-markdown--editing { - .dashboard-component-chart-holder { - .with-popover-menu--focused & { - padding: 1px; - } - } -} +Basic.argTypes = { + format: { + defaultValue: TimeFormats.DATABASE_DATETIME, + control: 'select', + options: Object.values(TimeFormats), + }, +}; diff --git a/superset-frontend/src/components/Table/cell-renderers/TimeCell/TimeCell.test.tsx b/superset-frontend/src/components/Table/cell-renderers/TimeCell/TimeCell.test.tsx new file mode 100644 index 000000000000..81ccbed38acd --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/TimeCell/TimeCell.test.tsx @@ -0,0 +1,49 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { TimeFormats } from '@superset-ui/core'; +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import TimeCell from '.'; + +const DATE = Date.parse('2022-01-01'); + +test('renders with default format', async () => { + render(<TimeCell value={DATE} />); + expect(screen.getByText('2022-01-01 00:00:00')).toBeInTheDocument(); +}); + +test('renders with custom format', async () => { + render(<TimeCell value={DATE} format={TimeFormats.DATABASE_DATE} />); + expect(screen.getByText('2022-01-01')).toBeInTheDocument(); +}); + +test('renders with number', async () => { + render(<TimeCell value={DATE.valueOf()} />); + expect(screen.getByText('2022-01-01 00:00:00')).toBeInTheDocument(); +}); + +test('renders with no value', async () => { + render(<TimeCell />); + expect(screen.getByText('N/A')).toBeInTheDocument(); +}); + +test('renders with invalid date format', async () => { + render(<TimeCell format="aaa-bbb-ccc" value={DATE} />); + expect(screen.getByText('aaa-bbb-ccc')).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/components/Table/cell-renderers/TimeCell/index.tsx b/superset-frontend/src/components/Table/cell-renderers/TimeCell/index.tsx new file mode 100644 index 000000000000..31a9dac24729 --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/TimeCell/index.tsx @@ -0,0 +1,38 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { getTimeFormatter, TimeFormats } from '@superset-ui/core'; +import NullCell from '../NullCell'; + +export interface TimeCellProps { + format?: string; + value?: number | Date; +} + +function TimeCell({ + format = TimeFormats.DATABASE_DATETIME, + value, +}: TimeCellProps) { + if (value) { + return <span>{getTimeFormatter(format).format(value)}</span>; + } + return <NullCell />; +} + +export default TimeCell; diff --git a/superset-frontend/src/components/Table/cell-renderers/fixtures.ts b/superset-frontend/src/components/Table/cell-renderers/fixtures.ts new file mode 100644 index 000000000000..9b2070b0359b --- /dev/null +++ b/superset-frontend/src/components/Table/cell-renderers/fixtures.ts @@ -0,0 +1,25 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +export const exampleRow = { + key: 1, + buttonCell: 'Click Me', + textCell: 'Some text', + euroCell: 45.5, + dollarCell: 45.5, +}; diff --git a/superset-frontend/src/components/Table/header-renderers/HeaderWithRadioGroup.tsx b/superset-frontend/src/components/Table/header-renderers/HeaderWithRadioGroup.tsx new file mode 100644 index 000000000000..65fd435119ff --- /dev/null +++ b/superset-frontend/src/components/Table/header-renderers/HeaderWithRadioGroup.tsx @@ -0,0 +1,94 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useState } from 'react'; +import { css, useTheme } from '@superset-ui/core'; +import { Radio } from 'src/components/Radio'; +import { Space } from 'src/components'; +import Icons from 'src/components/Icons'; +import Popover from 'src/components/Popover'; + +export interface HeaderWithRadioGroupProps { + headerTitle: string; + groupTitle: string; + groupOptions: { label: string; value: string | number }[]; + value?: string | number; + onChange: (value: string) => void; +} + +function HeaderWithRadioGroup(props: HeaderWithRadioGroupProps) { + const { headerTitle, groupTitle, groupOptions, value, onChange } = props; + const theme = useTheme(); + const [popoverVisible, setPopoverVisible] = useState(false); + + return ( + <div + css={css` + display: flex; + align-items: center; + `} + > + <Popover + trigger="click" + visible={popoverVisible} + content={ + <div> + <div + css={css` + font-weight: ${theme.typography.weights.bold}; + margin-bottom: ${theme.gridUnit}px; + `} + > + {groupTitle} + </div> + <Radio.Group + value={value} + onChange={e => { + onChange(e.target.value); + setPopoverVisible(false); + }} + > + <Space direction="vertical"> + {groupOptions.map(option => ( + <Radio key={option.value} value={option.value}> + {option.label} + </Radio> + ))} + </Space> + </Radio.Group> + </div> + } + placement="bottomLeft" + arrowPointAtCenter + > + <Icons.SettingOutlined + iconSize="m" + iconColor={theme.colors.grayscale.light1} + css={css` + margin-top: 3px; // we need exactly 3px to align the icon + margin-right: ${theme.gridUnit}px; + `} + onClick={() => setPopoverVisible(true)} + /> + </Popover> + {headerTitle} + </div> + ); +} + +export default HeaderWithRadioGroup; diff --git a/superset-frontend/src/components/Table/index.tsx b/superset-frontend/src/components/Table/index.tsx new file mode 100644 index 000000000000..55b004570ad1 --- /dev/null +++ b/superset-frontend/src/components/Table/index.tsx @@ -0,0 +1,454 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useState, useEffect, useRef, ReactElement } from 'react'; +import { Table as AntTable, ConfigProvider } from 'antd'; +import { + ColumnType, + ColumnGroupType, + TableProps as AntTableProps, +} from 'antd/es/table'; +import { PaginationProps } from 'antd/es/pagination'; +import { Key } from 'antd/lib/table/interface'; +import { t, useTheme, logging } from '@superset-ui/core'; +import Loading from 'src/components/Loading'; +import styled, { StyledComponent } from '@emotion/styled'; +import InteractiveTableUtils from './utils/InteractiveTableUtils'; +import VirtualTable from './VirtualTable'; + +export const SUPERSET_TABLE_COLUMN = 'superset/table-column'; +export interface TableDataType { + key: React.Key; +} + +export interface TablePaginationConfig extends PaginationProps { + extra?: object; +} + +export type ColumnsType<RecordType = unknown> = ( + | ColumnGroupType<RecordType> + | ColumnType<RecordType> +)[]; + +export enum SelectionType { + 'DISABLED' = 'disabled', + 'SINGLE' = 'single', + 'MULTI' = 'multi', +} + +export interface Locale { + /** + * Text contained within the Table UI. + */ + filterTitle: string; + filterConfirm: string; + filterReset: string; + filterEmptyText: string; + filterCheckall: string; + filterSearchPlaceholder: string; + emptyText: string; + selectAll: string; + selectInvert: string; + selectNone: string; + selectionAll: string; + sortTitle: string; + expand: string; + collapse: string; + triggerDesc: string; + triggerAsc: string; + cancelSort: string; +} + +export type SortOrder = 'descend' | 'ascend' | null; +export interface SorterResult<RecordType> { + column?: ColumnType<RecordType>; + order?: SortOrder; + field?: Key | Key[]; + columnKey?: Key; +} + +export enum ETableAction { + PAGINATE = 'paginate', + SORT = 'sort', + FILTER = 'filter', +} + +export interface TableCurrentDataSource<RecordType> { + currentDataSource: RecordType[]; + action: ETableAction; +} + +export type OnChangeFunction = ( + pagination: TablePaginationConfig, + filters: Record<string, (Key | boolean)[] | null>, + sorter: SorterResult<any> | SorterResult<any>[], + extra: TableCurrentDataSource<any>, +) => void; + +export interface TableProps extends AntTableProps<TableProps> { + /** + * Data that will populate the each row and map to the column key. + */ + data: object[]; + /** + * Table column definitions. + */ + columns: ColumnsType<any>; + /** + * Array of row keys to represent list of selected rows. + */ + selectedRows?: React.Key[]; + /** + * Callback function invoked when a row is selected by user. + */ + handleRowSelection?: Function; + /** + * Controls the size of the table. + */ + size: TableSize; + /** + * Adjusts the padding around elements for different amounts of spacing between elements. + */ + selectionType?: SelectionType; + /* + * Places table in visual loading state. Use while waiting to retrieve data or perform an async operation that will update the table. + */ + loading?: boolean; + /** + * Uses a sticky header which always displays when vertically scrolling the table. Default: true + */ + sticky?: boolean; + /** + * Controls if columns are resizable by user. + */ + resizable?: boolean; + /** + * EXPERIMENTAL: Controls if columns are re-orderable by user drag drop. + */ + reorderable?: boolean; + /** + * Controls if pagination is active or disabled. + */ + usePagination?: boolean; + /** + * Default number of rows table will display per page of data. + */ + defaultPageSize?: number; + /** + * Array of numeric options for the number of rows table will display per page of data. + * The user can select from these options in the page size drop down menu. + */ + pageSizeOptions?: string[]; + /** + * Set table to display no data even if data has been provided + */ + hideData?: boolean; + /** + * emptyComponent + */ + emptyComponent?: ReactElement; + /** + * Enables setting the text displayed in various components and tooltips within the Table UI. + */ + locale?: Locale; + /** + * Restricts the visible height of the table and allows for internal scrolling within the table + * when the number of rows exceeds the visible space. + */ + height?: number; + /** + * Sets the table to use react-window for scroll virtualization in cases where + * there are unknown amount of columns, or many, many rows + */ + virtualize?: boolean; + /** + * Used to override page controls total record count when using server-side paging. + */ + recordCount?: number; + /** + * Invoked when the tables sorting, paging, or filtering is changed. + */ + onChange?: OnChangeFunction; +} + +interface IPaginationOptions { + hideOnSinglePage: boolean; + pageSize: number; + pageSizeOptions: string[]; + onShowSizeChange: Function; + total?: number; +} + +export enum TableSize { + SMALL = 'small', + MIDDLE = 'middle', +} + +const defaultRowSelection: React.Key[] = []; + +const PAGINATION_HEIGHT = 40; +const HEADER_HEIGHT = 68; + +const StyledTable: StyledComponent<any> = styled(AntTable)<any>( + ({ theme, height }) => ` + .ant-table-body { + overflow: auto; + height: ${height ? `${height}px` : undefined}; + } + + th.ant-table-cell { + font-weight: ${theme.typography.weights.bold}; + color: ${theme.colors.grayscale.dark1}; + user-select: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .ant-table-tbody > tr > td { + user-select: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + border-bottom: 1px solid ${theme.colors.grayscale.light3}; + } + + .ant-pagination-item-active { + border-color: ${theme.colors.primary.base}; + } + } +`, +); + +const StyledVirtualTable: StyledComponent<any> = styled(VirtualTable)<any>( + ({ theme }) => ` + .virtual-table .ant-table-container:before, + .virtual-table .ant-table-container:after { + display: none; + } + .virtual-table-cell { + box-sizing: border-box; + padding: ${theme.gridUnit * 4}px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +`, +); + +const defaultLocale = { + filterTitle: t('Filter menu'), + filterConfirm: t('OK'), + filterReset: t('Reset'), + filterEmptyText: t('No filters'), + filterCheckall: t('Select all items'), + filterSearchPlaceholder: t('Search in filters'), + emptyText: t('No data'), + selectAll: t('Select current page'), + selectInvert: t('Invert current page'), + selectNone: t('Clear all data'), + selectionAll: t('Select all data'), + sortTitle: t('Sort'), + expand: t('Expand row'), + collapse: t('Collapse row'), + triggerDesc: t('Click to sort descending'), + triggerAsc: t('Click to sort ascending'), + cancelSort: t('Click to cancel sorting'), +}; + +const selectionMap = {}; +const noop = () => {}; +selectionMap[SelectionType.MULTI] = 'checkbox'; +selectionMap[SelectionType.SINGLE] = 'radio'; +selectionMap[SelectionType.DISABLED] = null; + +export function Table(props: TableProps) { + const { + data, + columns, + selectedRows = defaultRowSelection, + handleRowSelection, + size = TableSize.SMALL, + selectionType = SelectionType.DISABLED, + sticky = true, + loading = false, + resizable = false, + reorderable = false, + usePagination = true, + defaultPageSize = 15, + pageSizeOptions = ['5', '15', '25', '50', '100'], + hideData = false, + emptyComponent, + locale, + height, + virtualize = false, + onChange = noop, + recordCount, + } = props; + + const wrapperRef = useRef<HTMLDivElement | null>(null); + const [derivedColumns, setDerivedColumns] = useState(columns); + const [pageSize, setPageSize] = useState(defaultPageSize); + const [mergedLocale, setMergedLocale] = useState({ ...defaultLocale }); + const [selectedRowKeys, setSelectedRowKeys] = + useState<React.Key[]>(selectedRows); + const interactiveTableUtils = useRef<InteractiveTableUtils | null>(null); + + const onSelectChange = (newSelectedRowKeys: React.Key[]) => { + setSelectedRowKeys(newSelectedRowKeys); + handleRowSelection?.(newSelectedRowKeys); + }; + + const selectionTypeValue = selectionMap[selectionType]; + const rowSelection = { + type: selectionTypeValue, + selectedRowKeys, + onChange: onSelectChange, + }; + + const renderEmpty = () => + emptyComponent ?? <div>{mergedLocale.emptyText}</div>; + + // Log use of experimental features + useEffect(() => { + if (reorderable === true) { + logging.warn( + 'EXPERIMENTAL FEATURE ENABLED: The "reorderable" prop of Table is experimental and NOT recommended for use in production deployments.', + ); + } + if (resizable === true) { + logging.warn( + 'EXPERIMENTAL FEATURE ENABLED: The "resizable" prop of Table is experimental and NOT recommended for use in production deployments.', + ); + } + }, [reorderable, resizable]); + + useEffect(() => { + let updatedLocale; + if (locale) { + // This spread allows for locale to only contain a subset of locale overrides on props + updatedLocale = { ...defaultLocale, ...locale }; + } else { + updatedLocale = { ...defaultLocale }; + } + setMergedLocale(updatedLocale); + }, [locale]); + + useEffect(() => setDerivedColumns(columns), [columns]); + + useEffect(() => { + if (interactiveTableUtils.current) { + interactiveTableUtils.current?.clearListeners(); + } + const table = wrapperRef.current?.getElementsByTagName('table')[0]; + if (table) { + interactiveTableUtils.current = new InteractiveTableUtils( + table, + derivedColumns, + setDerivedColumns, + ); + if (reorderable) { + interactiveTableUtils?.current?.initializeDragDropColumns( + reorderable, + table, + ); + } + if (resizable) { + interactiveTableUtils?.current?.initializeResizableColumns( + resizable, + table, + ); + } + } + return () => { + interactiveTableUtils?.current?.clearListeners?.(); + }; + /** + * We DO NOT want this effect to trigger when derivedColumns changes as it will break functionality + * The exclusion from the effect dependencies is intentional and should not be modified + */ + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [wrapperRef, reorderable, resizable, virtualize, interactiveTableUtils]); + + const theme = useTheme(); + + const paginationSettings: IPaginationOptions | false = usePagination + ? { + hideOnSinglePage: true, + pageSize, + pageSizeOptions, + onShowSizeChange: (page: number, size: number) => setPageSize(size), + } + : false; + + /** + * When recordCount is provided it lets the user of Table control total number of pages + * independent from data.length. This allows the parent component do things like server side paging + * where the user can be shown the total mount of data they can page through, but the component can provide + * data one page at a time, and respond to the onPageChange event to fetch and set new data + */ + if (paginationSettings && recordCount) { + paginationSettings.total = recordCount; + } + + let bodyHeight = height; + if (bodyHeight) { + bodyHeight -= HEADER_HEIGHT; + const hasPagination = + usePagination && recordCount && recordCount > pageSize; + if (hasPagination) { + bodyHeight -= PAGINATION_HEIGHT; + } + } + + const sharedProps = { + loading: { spinning: loading ?? false, indicator: <Loading /> }, + hasData: hideData ? false : data, + columns: derivedColumns, + dataSource: hideData ? [undefined] : data, + size, + pagination: paginationSettings, + locale: mergedLocale, + showSorterTooltip: false, + onChange, + theme, + height: bodyHeight, + }; + + return ( + <ConfigProvider renderEmpty={renderEmpty}> + <div ref={wrapperRef}> + {!virtualize && ( + <StyledTable + {...sharedProps} + rowSelection={selectionTypeValue ? rowSelection : undefined} + sticky={sticky} + /> + )} + {virtualize && ( + <StyledVirtualTable + {...sharedProps} + scroll={{ y: 300, x: '100vw' }} + /> + )} + </div> + </ConfigProvider> + ); +} + +export default Table; diff --git a/superset-frontend/src/components/Table/sorters.test.ts b/superset-frontend/src/components/Table/sorters.test.ts new file mode 100644 index 000000000000..80bc0a20c42c --- /dev/null +++ b/superset-frontend/src/components/Table/sorters.test.ts @@ -0,0 +1,100 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { alphabeticalSort, numericalSort } from './sorters'; + +const rows = [ + { + name: 'Deathstar Lamp', + category: 'Lamp', + cost: 75.99, + }, + { + name: 'Desk Lamp', + category: 'Lamp', + cost: 15.99, + }, + { + name: 'Bedside Lamp', + category: 'Lamp', + cost: 15.99, + }, + { name: 'Drafting Desk', category: 'Desk', cost: 125 }, + { name: 'Sit / Stand Desk', category: 'Desk', cost: 275.99 }, +]; + +/** + * NOTE: Sorters for antd table use < 0, 0, > 0 for sorting + * -1 or less means the first item comes after the second item + * 0 means the items sort values is equivalent + * 1 or greater means the first item comes before the second item + */ +test('alphabeticalSort sorts correctly', () => { + expect(alphabeticalSort('name', rows[0], rows[1])).toBe(-1); + expect(alphabeticalSort('name', rows[1], rows[0])).toBe(1); + expect(alphabeticalSort('category', rows[1], rows[0])).toBe(0); +}); + +test('numericalSort sorts correctly', () => { + expect(numericalSort('cost', rows[1], rows[2])).toBe(0); + expect(numericalSort('cost', rows[1], rows[0])).toBeLessThan(0); + expect(numericalSort('cost', rows[4], rows[1])).toBeGreaterThan(0); +}); + +/** + * We want to make sure our sorters do not throw runtime errors given bad inputs. + * Runtime Errors in a sorter will cause a catastrophic React lifecycle error and produce white screen of death + * In the case the sorter cannot perform the comparison it should return undefined and the next sort step will proceed without error + */ +test('alphabeticalSort bad inputs no errors', () => { + // @ts-ignore + expect(alphabeticalSort('name', null, null)).toBe(undefined); + // incorrect non-object values + // @ts-ignore + expect(alphabeticalSort('name', 3, [])).toBe(undefined); + // incorrect object values without specificed key + expect(alphabeticalSort('name', {}, {})).toBe(undefined); + // Object as value for name when it should be a string + expect( + alphabeticalSort( + 'name', + { name: { title: 'the name attribute should not be an object' } }, + { name: 'Doug' }, + ), + ).toBe(undefined); +}); + +test('numericalSort bad inputs no errors', () => { + // @ts-ignore + expect(numericalSort('name', undefined, undefined)).toBe(NaN); + // @ts-ignore + expect(numericalSort('name', null, null)).toBe(NaN); + // incorrect non-object values + // @ts-ignore + expect(numericalSort('name', 3, [])).toBe(NaN); + // incorrect object values without specified key + expect(numericalSort('name', {}, {})).toBe(NaN); + // Object as value for name when it should be a string + expect( + numericalSort( + 'name', + { name: { title: 'the name attribute should not be an object' } }, + { name: 'Doug' }, + ), + ).toBe(NaN); +}); diff --git a/superset-frontend/src/SqlLab/components/SouthPane/state.ts b/superset-frontend/src/components/Table/sorters.ts similarity index 56% rename from superset-frontend/src/SqlLab/components/SouthPane/state.ts rename to superset-frontend/src/components/Table/sorters.ts index 9963739fa6d4..3f06071aacc6 100644 --- a/superset-frontend/src/SqlLab/components/SouthPane/state.ts +++ b/superset-frontend/src/components/Table/sorters.ts @@ -16,24 +16,21 @@ * specific language governing permissions and limitations * under the License. */ -import { connect } from 'react-redux'; -import { bindActionCreators, Dispatch } from 'redux'; -import * as Actions from 'src/SqlLab/actions/sqlLab'; -import SouthPane from '.'; -function mapStateToProps({ sqlLab }: Record<string, any>) { - return { - activeSouthPaneTab: sqlLab.activeSouthPaneTab, - databases: sqlLab.databases, - offline: sqlLab.offline, - user: sqlLab.user, - }; -} - -function mapDispatchToProps(dispatch: Dispatch) { - return { - actions: bindActionCreators<any, any>(Actions, dispatch), - }; -} +/** + * @param key The name of the row's attribute used to compare values for alphabetical sorting + * @param a First row object to compare + * @param b Second row object to compare + * @returns number + */ +export const alphabeticalSort = (key: string, a: object, b: object): number => + a?.[key]?.localeCompare?.(b?.[key]); -export default connect<any>(mapStateToProps, mapDispatchToProps)(SouthPane); +/** + * @param key The name of the row's attribute used to compare values for numerical sorting + * @param a First row object to compare + * @param b Second row object to compare + * @returns number + */ +export const numericalSort = (key: string, a: object, b: object): number => + a?.[key] - b?.[key]; diff --git a/superset-frontend/src/components/Table/utils/InteractiveTableUtils.ts b/superset-frontend/src/components/Table/utils/InteractiveTableUtils.ts new file mode 100644 index 000000000000..94977413e2cd --- /dev/null +++ b/superset-frontend/src/components/Table/utils/InteractiveTableUtils.ts @@ -0,0 +1,233 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import type { ColumnsType } from 'antd/es/table'; +import { SUPERSET_TABLE_COLUMN } from 'src/components/Table'; +import { withinRange } from './utils'; + +interface IInteractiveColumn extends HTMLElement { + mouseDown: boolean; + oldX: number; + oldWidth: number; + draggable: boolean; +} +export default class InteractiveTableUtils { + tableRef: HTMLTableElement | null; + + columnRef: IInteractiveColumn | null; + + setDerivedColumns: Function; + + isDragging: boolean; + + resizable: boolean; + + reorderable: boolean; + + derivedColumns: ColumnsType<any>; + + RESIZE_INDICATOR_THRESHOLD: number; + + constructor( + tableRef: HTMLTableElement, + derivedColumns: ColumnsType<any>, + setDerivedColumns: Function, + ) { + this.setDerivedColumns = setDerivedColumns; + this.tableRef = tableRef; + this.isDragging = false; + this.RESIZE_INDICATOR_THRESHOLD = 8; + this.resizable = false; + this.reorderable = false; + this.derivedColumns = [...derivedColumns]; + document.addEventListener('mouseup', this.handleMouseup); + } + + clearListeners = () => { + document.removeEventListener('mouseup', this.handleMouseup); + this.initializeResizableColumns(false, this.tableRef); + this.initializeDragDropColumns(false, this.tableRef); + }; + + setTableRef = (table: HTMLTableElement) => { + this.tableRef = table; + }; + + getColumnIndex = (): number => { + let index = -1; + const parent = this.columnRef?.parentNode; + if (parent) { + index = Array.prototype.indexOf.call(parent.children, this.columnRef); + } + return index; + }; + + handleColumnDragStart = (ev: DragEvent): void => { + const target = ev?.currentTarget as IInteractiveColumn; + if (target) { + this.columnRef = target; + } + this.isDragging = true; + const index = this.getColumnIndex(); + const columnData = this.derivedColumns[index]; + const dragData = { index, columnData }; + ev?.dataTransfer?.setData(SUPERSET_TABLE_COLUMN, JSON.stringify(dragData)); + }; + + handleDragDrop = (ev: DragEvent): void => { + const data = ev.dataTransfer?.getData?.(SUPERSET_TABLE_COLUMN); + if (data) { + ev.preventDefault(); + const parent = (ev.currentTarget as HTMLElement) + ?.parentNode as HTMLElement; + const dropIndex = Array.prototype.indexOf.call( + parent.children, + ev.currentTarget, + ); + const dragIndex = this.getColumnIndex(); + const columnsCopy = [...this.derivedColumns]; + const removedItem = columnsCopy.slice(dragIndex, dragIndex + 1); + columnsCopy.splice(dragIndex, 1); + columnsCopy.splice(dropIndex, 0, removedItem[0]); + this.derivedColumns = [...columnsCopy]; + this.setDerivedColumns(columnsCopy); + } + }; + + allowDrop = (ev: DragEvent): void => { + ev.preventDefault(); + }; + + handleMouseDown = (event: MouseEvent) => { + const target = event?.currentTarget as IInteractiveColumn; + if (target) { + this.columnRef = target; + if ( + event && + withinRange( + event.offsetX, + target.offsetWidth, + this.RESIZE_INDICATOR_THRESHOLD, + ) + ) { + target.mouseDown = true; + target.oldX = event.x; + target.oldWidth = target.offsetWidth; + target.draggable = false; + } else if (this.reorderable) { + target.draggable = true; + } + } + }; + + handleMouseMove = (event: MouseEvent) => { + if (this.resizable === true && !this.isDragging) { + const target = event.currentTarget as IInteractiveColumn; + if ( + event && + withinRange( + event.offsetX, + target.offsetWidth, + this.RESIZE_INDICATOR_THRESHOLD, + ) + ) { + target.style.cursor = 'col-resize'; + } else { + target.style.cursor = 'default'; + } + + const column = this.columnRef; + if (column?.mouseDown) { + let width = column.oldWidth; + const diff = event.x - column.oldX; + if (column.oldWidth + (event.x - column.oldX) > 0) { + width = column.oldWidth + diff; + } + const colIndex = this.getColumnIndex(); + if (!Number.isNaN(colIndex)) { + const columnDef = { ...this.derivedColumns[colIndex] }; + columnDef.width = width; + this.derivedColumns[colIndex] = columnDef; + this.setDerivedColumns([...this.derivedColumns]); + } + } + } + }; + + handleMouseup = () => { + if (this.columnRef) { + this.columnRef.mouseDown = false; + this.columnRef.style.cursor = 'default'; + this.columnRef.draggable = false; + } + this.isDragging = false; + }; + + initializeResizableColumns = ( + resizable = false, + table: HTMLTableElement | null, + ) => { + this.tableRef = table; + const header: HTMLTableRowElement | undefined = this.tableRef?.rows?.[0]; + if (header) { + const { cells } = header; + const len = cells.length; + for (let i = 0; i < len; i += 1) { + const cell = cells[i]; + if (resizable === true) { + this.resizable = true; + cell.addEventListener('mousedown', this.handleMouseDown); + cell.addEventListener('mousemove', this.handleMouseMove, true); + } else { + this.resizable = false; + cell.removeEventListener('mousedown', this.handleMouseDown); + cell.removeEventListener('mousemove', this.handleMouseMove, true); + } + } + } + }; + + initializeDragDropColumns = ( + reorderable = false, + table: HTMLTableElement | null, + ) => { + this.tableRef = table; + const header: HTMLTableRowElement | undefined = this.tableRef?.rows?.[0]; + if (header) { + const { cells } = header; + const len = cells.length; + for (let i = 0; i < len; i += 1) { + const cell = cells[i]; + if (reorderable === true) { + this.reorderable = true; + cell.addEventListener('mousedown', this.handleMouseDown); + cell.addEventListener('dragover', this.allowDrop); + cell.addEventListener('dragstart', this.handleColumnDragStart); + cell.addEventListener('drop', this.handleDragDrop); + } else { + this.reorderable = false; + cell.draggable = false; + cell.removeEventListener('mousedown', this.handleMouseDown); + cell.removeEventListener('dragover', this.allowDrop); + cell.removeEventListener('dragstart', this.handleColumnDragStart); + cell.removeEventListener('drop', this.handleDragDrop); + } + } + } + }; +} diff --git a/superset-frontend/src/components/Table/utils/utils.test.ts b/superset-frontend/src/components/Table/utils/utils.test.ts new file mode 100644 index 000000000000..eff50f1580fc --- /dev/null +++ b/superset-frontend/src/components/Table/utils/utils.test.ts @@ -0,0 +1,48 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { withinRange } from './utils'; + +test('withinRange supported positive numbers', () => { + // Valid inputs within range + expect(withinRange(50, 60, 16)).toBeTruthy(); + + // Valid inputs outside of range + expect(withinRange(40, 60, 16)).toBeFalsy(); +}); + +test('withinRange unsupported negative numbers', () => { + // Negative numbers not supported + expect(withinRange(65, 60, -16)).toBeFalsy(); + expect(withinRange(-60, -65, 16)).toBeFalsy(); + expect(withinRange(-60, -65, 16)).toBeFalsy(); + expect(withinRange(-60, 65, 16)).toBeFalsy(); +}); + +test('withinRange invalid inputs', () => { + // Invalid inputs should return falsy and not throw an error + // We need ts-ignore here to be able to pass invalid values and pass linting + // @ts-ignore + expect(withinRange(null, 60, undefined)).toBeFalsy(); + // @ts-ignore + expect(withinRange([], 'hello', {})).toBeFalsy(); + // @ts-ignore + expect(withinRange([], undefined, {})).toBeFalsy(); + // @ts-ignore + expect(withinRange([], 'hello', {})).toBeFalsy(); +}); diff --git a/superset-frontend/src/components/Table/utils/utils.ts b/superset-frontend/src/components/Table/utils/utils.ts new file mode 100644 index 000000000000..5b4e4d13baa8 --- /dev/null +++ b/superset-frontend/src/components/Table/utils/utils.ts @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Method to check if a number is within inclusive range between a maximum value minus a threshold + * Invalid non numeric inputs will not error, but will return false + * + * @param value number coordinate to determine if it is within bounds of the targetCoordinate - threshold. Must be positive and less than maximum. + * @param maximum number max value for the test range. Must be positive and greater than value + * @param threshold number values to determine a range from maximum - threshold. Must be positive and greater than zero. + * @returns boolean + */ +export const withinRange = ( + value: number, + maximum: number, + threshold: number, +): boolean => { + let within = false; + const diff = maximum - value; + if (diff > 0 && diff <= threshold) { + within = true; + } + return within; +}; diff --git a/superset-frontend/src/components/TableCollection/index.tsx b/superset-frontend/src/components/TableCollection/index.tsx index ad83f3b9027f..88296edf638e 100644 --- a/superset-frontend/src/components/TableCollection/index.tsx +++ b/superset-frontend/src/components/TableCollection/index.tsx @@ -292,9 +292,9 @@ export default React.memo( {row.cells.map(cell => { if (cell.column.hidden) return null; const columnCellProps = cell.column.cellProps || {}; - const isWrapText = - columnsForWrapText && - columnsForWrapText.includes(cell.column.Header as string); + const isWrapText = columnsForWrapText?.includes( + cell.column.Header as string, + ); return ( <td diff --git a/superset-frontend/src/components/TableSelector/TableSelector.test.tsx b/superset-frontend/src/components/TableSelector/TableSelector.test.tsx index 32d84c008605..b4b67deb92dc 100644 --- a/superset-frontend/src/components/TableSelector/TableSelector.test.tsx +++ b/superset-frontend/src/components/TableSelector/TableSelector.test.tsx @@ -19,55 +19,60 @@ import React from 'react'; import { render, screen, waitFor, within } from 'spec/helpers/testing-library'; -import { SupersetClient } from '@superset-ui/core'; +import { queryClient } from 'src/views/QueryProvider'; +import fetchMock from 'fetch-mock'; import { act } from 'react-dom/test-utils'; import userEvent from '@testing-library/user-event'; import TableSelector, { TableSelectorMultiple } from '.'; -const SupersetClientGet = jest.spyOn(SupersetClient, 'get'); - const createProps = (props = {}) => ({ database: { id: 1, database_name: 'main', backend: 'sqlite', - allow_multi_schema_metadata_fetch: false, }, schema: 'test_schema', handleError: jest.fn(), ...props, }); -afterEach(() => { - jest.clearAllMocks(); -}); - -const getSchemaMockFunction = async () => +const getSchemaMockFunction = () => ({ - json: { - result: ['schema_a', 'schema_b'], - }, + result: ['schema_a', 'schema_b'], } as any); -const getTableMockFunction = async () => +const getTableMockFunction = () => ({ - json: { - options: [ - { label: 'table_a', value: 'table_a' }, - { label: 'table_b', value: 'table_b' }, - { label: 'table_c', value: 'table_c' }, - { label: 'table_d', value: 'table_d' }, - ], - }, + count: 4, + result: [ + { label: 'table_a', value: 'table_a' }, + { label: 'table_b', value: 'table_b' }, + { label: 'table_c', value: 'table_c' }, + { label: 'table_d', value: 'table_d' }, + ], } as any); +const databaseApiRoute = 'glob:*/api/v1/database/?*'; +const schemaApiRoute = 'glob:*/api/v1/database/*/schemas/?*'; +const tablesApiRoute = 'glob:*/api/v1/database/*/tables/*'; + const getSelectItemContainer = (select: HTMLElement) => select.parentElement?.parentElement?.getElementsByClassName( 'ant-select-selection-item', ); +beforeEach(() => { + queryClient.clear(); + fetchMock.get(databaseApiRoute, { result: [] }); +}); + +afterEach(() => { + fetchMock.reset(); +}); + test('renders with default props', async () => { - SupersetClientGet.mockImplementation(getTableMockFunction); + fetchMock.get(schemaApiRoute, { result: [] }); + fetchMock.get(tablesApiRoute, getTableMockFunction()); const props = createProps(); render(<TableSelector {...props} />, { useRedux: true }); @@ -88,7 +93,8 @@ test('renders with default props', async () => { }); test('renders table options', async () => { - SupersetClientGet.mockImplementation(getTableMockFunction); + fetchMock.get(schemaApiRoute, { result: ['test_schema'] }); + fetchMock.get(tablesApiRoute, getTableMockFunction()); const props = createProps(); render(<TableSelector {...props} />, { useRedux: true }); @@ -105,7 +111,8 @@ test('renders table options', async () => { }); test('renders disabled without schema', async () => { - SupersetClientGet.mockImplementation(getTableMockFunction); + fetchMock.get(schemaApiRoute, { result: [] }); + fetchMock.get(tablesApiRoute, getTableMockFunction()); const props = createProps(); render(<TableSelector {...props} schema={undefined} />, { useRedux: true }); @@ -118,7 +125,7 @@ test('renders disabled without schema', async () => { }); test('table options are notified after schema selection', async () => { - SupersetClientGet.mockImplementation(getSchemaMockFunction); + fetchMock.get(schemaApiRoute, getSchemaMockFunction()); const callback = jest.fn(); const props = createProps({ @@ -142,7 +149,7 @@ test('table options are notified after schema selection', async () => { await screen.findByRole('option', { name: 'schema_b' }), ).toBeInTheDocument(); - SupersetClientGet.mockImplementation(getTableMockFunction); + fetchMock.get(tablesApiRoute, getTableMockFunction()); act(() => { userEvent.click(screen.getAllByText('schema_a')[1]); @@ -159,7 +166,8 @@ test('table options are notified after schema selection', async () => { }); test('table select retain value if not in SQL Lab mode', async () => { - SupersetClientGet.mockImplementation(getTableMockFunction); + fetchMock.get(schemaApiRoute, { result: ['test_schema'] }); + fetchMock.get(tablesApiRoute, getTableMockFunction()); const callback = jest.fn(); const props = createProps({ @@ -182,7 +190,7 @@ test('table select retain value if not in SQL Lab mode', async () => { await screen.findByRole('option', { name: 'table_a' }), ).toBeInTheDocument(); - act(() => { + await waitFor(() => { userEvent.click(screen.getAllByText('table_a')[1]); }); @@ -199,7 +207,8 @@ test('table select retain value if not in SQL Lab mode', async () => { }); test('table multi select retain all the values selected', async () => { - SupersetClientGet.mockImplementation(getTableMockFunction); + fetchMock.get(schemaApiRoute, { result: ['test_schema'] }); + fetchMock.get(tablesApiRoute, getTableMockFunction()); const callback = jest.fn(); const props = createProps({ @@ -217,31 +226,19 @@ test('table multi select retain all the values selected', async () => { userEvent.click(tableSelect); - expect( - await screen.findByRole('option', { name: 'table_a' }), - ).toBeInTheDocument(); - - act(() => { - const item = screen.getAllByText('table_a'); + await waitFor(async () => { + const item = await screen.findAllByText('table_b'); userEvent.click(item[item.length - 1]); }); - act(() => { - const item = screen.getAllByText('table_c'); + await waitFor(async () => { + const item = await screen.findAllByText('table_c'); userEvent.click(item[item.length - 1]); }); - const selectedValueContainer = getSelectItemContainer(tableSelect); + const selection1 = await screen.findByRole('option', { name: 'table_b' }); + expect(selection1).toHaveAttribute('aria-selected', 'true'); - expect(selectedValueContainer).toHaveLength(2); - expect( - await within(selectedValueContainer?.[0] as HTMLElement).findByText( - 'table_a', - ), - ).toBeInTheDocument(); - expect( - await within(selectedValueContainer?.[1] as HTMLElement).findByText( - 'table_c', - ), - ).toBeInTheDocument(); + const selection2 = await screen.findByRole('option', { name: 'table_c' }); + expect(selection2).toHaveAttribute('aria-selected', 'true'); }); diff --git a/superset-frontend/src/components/TableSelector/index.tsx b/superset-frontend/src/components/TableSelector/index.tsx index fcc5dbe10d21..ffb45cc8fed9 100644 --- a/superset-frontend/src/components/TableSelector/index.tsx +++ b/superset-frontend/src/components/TableSelector/index.tsx @@ -25,7 +25,7 @@ import React, { } from 'react'; import { SelectValue } from 'antd/lib/select'; -import { styled, SupersetClient, t } from '@superset-ui/core'; +import { styled, t } from '@superset-ui/core'; import { Select } from 'src/components'; import { FormLabel } from 'src/components/Form'; import Icons from 'src/components/Icons'; @@ -36,13 +36,21 @@ import RefreshLabel from 'src/components/RefreshLabel'; import CertifiedBadge from 'src/components/CertifiedBadge'; import WarningIconWithTooltip from 'src/components/WarningIconWithTooltip'; import { useToasts } from 'src/components/MessageToasts/withToasts'; +import { SchemaOption } from 'src/SqlLab/types'; +import { useTables, Table } from 'src/hooks/apiResources'; +import { + getClientErrorMessage, + getClientErrorObject, +} from 'src/utils/getClientErrorObject'; + +const REFRESH_WIDTH = 30; const TableSelectorWrapper = styled.div` ${({ theme }) => ` .refresh { display: flex; align-items: center; - width: 30px; + width: ${REFRESH_WIDTH}px; margin-left: ${theme.gridUnit}px; margin-top: ${theme.gridUnit * 5}px; } @@ -64,6 +72,7 @@ const TableSelectorWrapper = styled.div` .select { flex: 1; + max-width: calc(100% - ${theme.gridUnit + REFRESH_WIDTH}px) } `} `; @@ -81,15 +90,15 @@ const TableLabel = styled.span` interface TableSelectorProps { clearable?: boolean; - database?: DatabaseObject; + database?: DatabaseObject | null; emptyState?: ReactNode; formMode?: boolean; - getDbList?: (arg0: any) => {}; + getDbList?: (arg0: any) => void; handleError: (msg: string) => void; isDatabaseSelectEnabled?: boolean; onDbChange?: (db: DatabaseObject) => void; onSchemaChange?: (schema?: string) => void; - onSchemasLoad?: () => void; + onSchemasLoad?: (schemaOptions: SchemaOption[]) => void; onTablesLoad?: (options: Array<any>) => void; readOnly?: boolean; schema?: string; @@ -100,29 +109,16 @@ interface TableSelectorProps { tableSelectMode?: 'single' | 'multiple'; } -interface Table { - label: string; - value: string; - type: string; - extra?: { - certification?: { - certified_by: string; - details: string; - }; - warning_markdown?: string; - }; -} - -interface TableOption { +export interface TableOption { label: JSX.Element; text: string; value: string; } -const TableOption = ({ table }: { table: Table }) => { - const { label, type, extra } = table; +export const TableOption = ({ table }: { table: Table }) => { + const { value, type, extra } = table; return ( - <TableLabel title={label}> + <TableLabel title={value}> {type === 'view' ? ( <Icons.Eye iconSize="m" /> ) : ( @@ -141,11 +137,20 @@ const TableOption = ({ table }: { table: Table }) => { size="l" /> )} - {label} + {value} </TableLabel> ); }; +function renderSelectRow(select: ReactNode, refreshBtn: ReactNode) { + return ( + <div className="section"> + <span className="select">{select}</span> + <span className="refresh">{refreshBtn}</span> + </div> + ); +} + const TableSelector: FunctionComponent<TableSelectorProps> = ({ database, emptyState, @@ -165,26 +170,61 @@ const TableSelector: FunctionComponent<TableSelectorProps> = ({ tableValue = undefined, onTableSelectChange, }) => { - const [currentDatabase, setCurrentDatabase] = useState< - DatabaseObject | undefined - >(database); + const { addSuccessToast } = useToasts(); const [currentSchema, setCurrentSchema] = useState<string | undefined>( schema, ); - - const [tableOptions, setTableOptions] = useState<TableOption[]>([]); const [tableSelectValue, setTableSelectValue] = useState< SelectValue | undefined >(undefined); - const [refresh, setRefresh] = useState(0); - const [previousRefresh, setPreviousRefresh] = useState(0); - const [loadingTables, setLoadingTables] = useState(false); - const { addSuccessToast } = useToasts(); + const { + data, + isFetching: loadingTables, + isFetched, + refetch, + } = useTables({ + dbId: database?.id, + schema: currentSchema, + onSuccess: () => { + if (isFetched) { + addSuccessToast(t('List updated')); + } + }, + onError: (err: Response) => { + getClientErrorObject(err).then(clientError => { + handleError( + getClientErrorMessage( + t('There was an error loading the tables'), + clientError, + ), + ); + }); + }, + }); + + useEffect(() => { + // Set the tableOptions in the queryEditor so autocomplete + // works on new tabs + if (data && isFetched) { + onTablesLoad?.(data.options); + } + }, [data, isFetched, onTablesLoad]); + + const tableOptions = useMemo<TableOption[]>( + () => + data + ? data.options.map(table => ({ + value: table.value, + label: <TableOption table={table} />, + text: table.value, + })) + : [], + [data], + ); useEffect(() => { // reset selections if (database === undefined) { - setCurrentDatabase(undefined); setCurrentSchema(undefined); setTableSelectValue(undefined); } @@ -204,56 +244,6 @@ const TableSelector: FunctionComponent<TableSelectorProps> = ({ } }, [tableOptions, tableValue, tableSelectMode]); - useEffect(() => { - if (currentDatabase && currentSchema) { - setLoadingTables(true); - const encodedSchema = encodeURIComponent(currentSchema); - const forceRefresh = refresh !== previousRefresh; - // TODO: Would be nice to add pagination in a follow-up. Needs endpoint changes. - const endpoint = encodeURI( - `/superset/tables/${currentDatabase.id}/${encodedSchema}/undefined/${forceRefresh}/`, - ); - - if (previousRefresh !== refresh) { - setPreviousRefresh(refresh); - } - - SupersetClient.get({ endpoint }) - .then(({ json }) => { - const options: TableOption[] = json.options.map((table: Table) => { - const option: TableOption = { - value: table.value, - label: <TableOption table={table} />, - text: table.label, - }; - - return option; - }); - - onTablesLoad?.(json.options); - setTableOptions(options); - setLoadingTables(false); - if (forceRefresh) addSuccessToast('List updated'); - }) - .catch(() => { - setLoadingTables(false); - handleError(t('There was an error loading the tables')); - }); - } - // We are using the refresh state to re-trigger the query - // previousRefresh should be out of dependencies array - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [currentDatabase, currentSchema, onTablesLoad, setTableOptions, refresh]); - - function renderSelectRow(select: ReactNode, refreshBtn: ReactNode) { - return ( - <div className="section"> - <span className="select">{select}</span> - <span className="refresh">{refreshBtn}</span> - </div> - ); - } - const internalTableChange = ( selectedOptions: TableOption | TableOption[] | undefined, ) => { @@ -270,7 +260,6 @@ const TableSelector: FunctionComponent<TableSelectorProps> = ({ }; const internalDbChange = (db: DatabaseObject) => { - setCurrentDatabase(db); if (onDbChange) { onDbChange(db); } @@ -282,30 +271,10 @@ const TableSelector: FunctionComponent<TableSelectorProps> = ({ onSchemaChange(schema); } - internalTableChange(undefined); + const value = tableSelectMode === 'single' ? undefined : []; + internalTableChange(value); }; - function renderDatabaseSelector() { - return ( - <DatabaseSelector - key={currentDatabase?.id} - db={currentDatabase} - emptyState={emptyState} - formMode={formMode} - getDbList={getDbList} - handleError={handleError} - onDbChange={readOnly ? undefined : internalDbChange} - onEmptyResults={onEmptyResults} - onSchemaChange={readOnly ? undefined : internalSchemaChange} - onSchemasLoad={onSchemasLoad} - schema={currentSchema} - sqlLabMode={sqlLabMode} - isDatabaseSelectEnabled={isDatabaseSelectEnabled && !readOnly} - readOnly={readOnly} - /> - ); - } - const handleFilterOption = useMemo( () => (search: string, option: TableOption) => { const searchValue = search.trim().toLowerCase(); @@ -316,9 +285,7 @@ const TableSelector: FunctionComponent<TableSelectorProps> = ({ ); function renderTableSelect() { - const disabled = - (currentSchema && !formMode && readOnly) || - (!currentSchema && !database?.allow_multi_schema_metadata_fetch); + const disabled = (currentSchema && !formMode && readOnly) || !currentSchema; const header = sqlLabMode ? ( <FormLabel>{t('See table schema')}</FormLabel> @@ -333,7 +300,6 @@ const TableSelector: FunctionComponent<TableSelectorProps> = ({ filterOption={handleFilterOption} header={header} labelInValue - lazyLoading={false} loading={loadingTables} name="select-table" onChange={(options: TableOption | TableOption[]) => @@ -348,9 +314,9 @@ const TableSelector: FunctionComponent<TableSelectorProps> = ({ /> ); - const refreshLabel = !formMode && !readOnly && ( + const refreshLabel = !readOnly && ( <RefreshLabel - onClick={() => setRefresh(refresh + 1)} + onClick={() => refetch()} tooltipContent={t('Force refresh table list')} /> ); @@ -360,7 +326,21 @@ const TableSelector: FunctionComponent<TableSelectorProps> = ({ return ( <TableSelectorWrapper> - {renderDatabaseSelector()} + <DatabaseSelector + db={database} + emptyState={emptyState} + formMode={formMode} + getDbList={getDbList} + handleError={handleError} + onDbChange={readOnly ? undefined : internalDbChange} + onEmptyResults={onEmptyResults} + onSchemaChange={readOnly ? undefined : internalSchemaChange} + onSchemasLoad={onSchemasLoad} + schema={currentSchema} + sqlLabMode={sqlLabMode} + isDatabaseSelectEnabled={isDatabaseSelectEnabled && !readOnly} + readOnly={readOnly} + /> {sqlLabMode && !formMode && <div className="divider" />} {renderTableSelect()} </TableSelectorWrapper> diff --git a/superset-frontend/src/components/TableView/TableView.stories.tsx b/superset-frontend/src/components/TableView/TableView.stories.tsx index 9d28ca38b44d..ff2079431a39 100644 --- a/superset-frontend/src/components/TableView/TableView.stories.tsx +++ b/superset-frontend/src/components/TableView/TableView.stories.tsx @@ -77,6 +77,7 @@ InteractiveTableView.args = { showRowCount: true, withPagination: true, columnsForWrapText: ['Summary'], + scrollTopOnPagination: false, }; InteractiveTableView.argTypes = { diff --git a/superset-frontend/src/components/TableView/TableView.tsx b/superset-frontend/src/components/TableView/TableView.tsx index 25a403ff9e60..5bf393363669 100644 --- a/superset-frontend/src/components/TableView/TableView.tsx +++ b/superset-frontend/src/components/TableView/TableView.tsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import React, { useEffect } from 'react'; +import React, { useEffect, useRef } from 'react'; import isEqual from 'lodash/isEqual'; import { styled, t } from '@superset-ui/core'; import { useFilters, usePagination, useSortBy, useTable } from 'react-table'; @@ -49,6 +49,7 @@ export interface TableViewProps { isPaginationSticky?: boolean; showRowCount?: boolean; scrollTable?: boolean; + scrollTopOnPagination?: boolean; small?: boolean; columnsForWrapText?: string[]; } @@ -130,6 +131,7 @@ const TableView = ({ serverPagination = false, columnsForWrapText, onServerPagination = () => {}, + scrollTopOnPagination = false, ...props }: TableViewProps) => { const initialState = { @@ -161,22 +163,6 @@ const TableView = ({ useSortBy, usePagination, ); - useEffect(() => { - if (serverPagination && pageIndex !== initialState.pageIndex) { - onServerPagination({ - pageIndex, - }); - } - }, [pageIndex]); - - useEffect(() => { - if (serverPagination && !isEqual(sortBy, initialState.sortBy)) { - onServerPagination({ - pageIndex: 0, - sortBy, - }); - } - }, [sortBy]); const content = withPagination ? page : rows; @@ -194,10 +180,34 @@ const TableView = ({ const isEmpty = !loading && content.length === 0; const hasPagination = pageCount > 1 && withPagination; + const tableRef = useRef<HTMLTableElement>(null); + const handleGotoPage = (p: number) => { + if (scrollTopOnPagination) { + tableRef?.current?.scroll(0, 0); + } + gotoPage(p); + }; + + useEffect(() => { + if (serverPagination && pageIndex !== initialState.pageIndex) { + onServerPagination({ + pageIndex, + }); + } + }, [pageIndex]); + + useEffect(() => { + if (serverPagination && !isEqual(sortBy, initialState.sortBy)) { + onServerPagination({ + pageIndex: 0, + sortBy, + }); + } + }, [sortBy]); return ( <> - <TableViewStyles {...props}> + <TableViewStyles {...props} ref={tableRef}> <TableCollection getTableProps={getTableProps} getTableBodyProps={getTableBodyProps} @@ -229,7 +239,7 @@ const TableView = ({ <Pagination totalPages={pageCount || 0} currentPage={pageCount ? pageIndex + 1 : 0} - onChange={(p: number) => gotoPage(p - 1)} + onChange={(p: number) => handleGotoPage(p - 1)} hideFirstAndLastPageLinks /> {showRowCount && ( diff --git a/superset-frontend/src/components/Timer/index.tsx b/superset-frontend/src/components/Timer/index.tsx index cfffc285717b..ce9bac55e983 100644 --- a/superset-frontend/src/components/Timer/index.tsx +++ b/superset-frontend/src/components/Timer/index.tsx @@ -31,6 +31,7 @@ export interface TimerProps { const TimerLabel = styled(Label)` text-align: left; + font-family: ${({ theme }) => theme.typography.families.monospace}; `; export default function Timer({ diff --git a/superset-frontend/src/components/TimezoneSelector/TimezoneSelector.test.tsx b/superset-frontend/src/components/TimezoneSelector/TimezoneSelector.test.tsx index 19c713adf4f1..6e79954b3b81 100644 --- a/superset-frontend/src/components/TimezoneSelector/TimezoneSelector.test.tsx +++ b/superset-frontend/src/components/TimezoneSelector/TimezoneSelector.test.tsx @@ -39,7 +39,7 @@ const loadComponent = (mockCurrentTime?: string) => { const getSelectOptions = () => waitFor(() => document.querySelectorAll('.ant-select-item-option-content')); -const openSelectMenu = async () => { +const openSelectMenu = () => { const searchInput = screen.getByRole('combobox'); userEvent.click(searchInput); }; @@ -86,7 +86,7 @@ test('render timezones in correct oder for standard time', async () => { timezone="America/Nassau" />, ); - await openSelectMenu(); + openSelectMenu(); const options = await getSelectOptions(); expect(options[0]).toHaveTextContent('GMT -05:00 (Eastern Standard Time)'); expect(options[1]).toHaveTextContent('GMT -11:00 (Pacific/Pago_Pago)'); @@ -103,7 +103,7 @@ test('render timezones in correct order for daylight saving time', async () => { timezone="America/Nassau" />, ); - await openSelectMenu(); + openSelectMenu(); const options = await getSelectOptions(); // first option is always current timezone expect(options[0]).toHaveTextContent('GMT -04:00 (Eastern Daylight Time)'); @@ -122,7 +122,7 @@ test('can select a timezone values and returns canonical timezone name', async ( />, ); - await openSelectMenu(); + openSelectMenu(); const searchInput = screen.getByRole('combobox'); // search for mountain time diff --git a/superset-frontend/src/components/Tooltip/index.tsx b/superset-frontend/src/components/Tooltip/index.tsx index 926750268280..06469abd1367 100644 --- a/superset-frontend/src/components/Tooltip/index.tsx +++ b/superset-frontend/src/components/Tooltip/index.tsx @@ -19,9 +19,14 @@ import React from 'react'; import { useTheme, css } from '@superset-ui/core'; import { Tooltip as AntdTooltip } from 'antd'; -import { TooltipProps } from 'antd/lib/tooltip'; +import { + TooltipProps, + TooltipPlacement as AntdTooltipPlacement, +} from 'antd/lib/tooltip'; import { Global } from '@emotion/react'; +export type TooltipPlacement = AntdTooltipPlacement; + export const Tooltip = (props: TooltipProps) => { const theme = useTheme(); return ( diff --git a/superset-frontend/src/components/TruncatedList/index.tsx b/superset-frontend/src/components/TruncatedList/index.tsx new file mode 100644 index 000000000000..37d4fe043656 --- /dev/null +++ b/superset-frontend/src/components/TruncatedList/index.tsx @@ -0,0 +1,160 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { ReactNode, useMemo, useRef } from 'react'; +import { styled, t } from '@superset-ui/core'; +import { useTruncation } from 'src/hooks/useTruncation'; +import { Tooltip } from '../Tooltip'; + +export type TruncatedListProps<ListItemType> = { + /** + * Array of input items of type `ListItemType`. + */ + items: ListItemType[]; + + /** + * Renderer for items not overflowed into the tooltip. + * Required if `ListItemType` is not renderable by React. + */ + renderVisibleItem?: (item: ListItemType) => ReactNode; + + /** + * Renderer for items that are overflowed into the tooltip. + * Required if `ListItemType` is not renderable by React. + */ + renderTooltipItem?: (item: ListItemType) => ReactNode; + + /** + * Returns the React key for an item. + */ + getKey?: (item: ListItemType) => React.Key; + + /** + * The max number of links that should appear in the tooltip. + */ + maxLinks?: number; +}; + +const StyledTruncatedList = styled.div` + & > span { + width: 100%; + display: flex; + + .ant-tooltip-open { + display: inline; + } + } +`; + +const StyledVisibleItems = styled.span` + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: inline-block; + width: 100%; + vertical-align: bottom; +`; + +const StyledVisibleItem = styled.span` + &:not(:last-child)::after { + content: ', '; + } +`; + +const StyledTooltipItem = styled.div` + .link { + color: ${({ theme }) => theme.colors.grayscale.light5}; + display: block; + text-decoration: underline; + } +`; + +const StyledPlus = styled.span` + ${({ theme }) => ` + cursor: pointer; + color: ${theme.colors.primary.dark1}; + font-weight: ${theme.typography.weights.normal}; + `} +`; + +export default function TruncatedList<ListItemType>({ + items, + renderVisibleItem = item => item, + renderTooltipItem = item => item, + getKey = item => item as unknown as React.Key, + maxLinks = 20, +}: TruncatedListProps<ListItemType>) { + const itemsNotInTooltipRef = useRef<HTMLDivElement>(null); + const plusRef = useRef<HTMLDivElement>(null); + const [elementsTruncated, hasHiddenElements] = useTruncation( + itemsNotInTooltipRef, + plusRef, + ) as [number, boolean]; + + const nMoreItems = useMemo( + () => (items.length > maxLinks ? items.length - maxLinks : undefined), + [items, maxLinks], + ); + + const itemsNotInTooltip = useMemo( + () => ( + <StyledVisibleItems ref={itemsNotInTooltipRef} data-test="crosslinks"> + {items.map(item => ( + <StyledVisibleItem key={getKey(item)}> + {renderVisibleItem(item)} + </StyledVisibleItem> + ))} + </StyledVisibleItems> + ), + [getKey, items, renderVisibleItem], + ); + + const itemsInTooltip = useMemo( + () => + items + .slice(0, maxLinks) + .map(item => ( + <StyledTooltipItem key={getKey(item)}> + {renderTooltipItem(item)} + </StyledTooltipItem> + )), + [getKey, items, maxLinks, renderTooltipItem], + ); + + return ( + <StyledTruncatedList> + <Tooltip + placement="top" + title={ + elementsTruncated ? ( + <> + {itemsInTooltip} + {nMoreItems && <span>{t('+ %s more', nMoreItems)}</span>} + </> + ) : null + } + > + {itemsNotInTooltip} + {hasHiddenElements && ( + <StyledPlus ref={plusRef}>+{elementsTruncated}</StyledPlus> + )} + </Tooltip> + </StyledTruncatedList> + ); +} diff --git a/superset-frontend/src/components/atomic-design.png b/superset-frontend/src/components/atomic-design.png new file mode 100644 index 0000000000000000000000000000000000000000..e44c5f34a54ebbdd26a30adc43339e40b954914c GIT binary patch literal 163100 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%0D1hj3<PnBL5LyiXEC2Iav!)pvDcKIU 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%0DCrlvHPL7w{ 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 Zw1XC2;iH1K&DRJYZB2vwW$HFz{{!AVv(Nwl literal 0 HcmV?d00001 diff --git a/superset-frontend/src/components/index.ts b/superset-frontend/src/components/index.ts index a370836fcfb8..bfa341a9ddd1 100644 --- a/superset-frontend/src/components/index.ts +++ b/superset-frontend/src/components/index.ts @@ -23,6 +23,7 @@ * E.g. import { Select } from 'src/components' */ export { default as Select } from './Select/Select'; +export { default as AsyncSelect } from './Select/AsyncSelect'; /* * Components that don't conflict with the ones in src/components. diff --git a/superset-frontend/src/constants.ts b/superset-frontend/src/constants.ts index 60668ddcb865..974edeeb6eee 100644 --- a/superset-frontend/src/constants.ts +++ b/superset-frontend/src/constants.ts @@ -16,6 +16,10 @@ * specific language governing permissions and limitations * under the License. */ +import { t } from '@superset-ui/core'; + +import { BootstrapData, CommonBootstrapData } from './types/bootstrapTypes'; + export const DATETIME_WITH_TIME_ZONE = 'YYYY-MM-DD HH:mm:ssZ'; export const TIME_WITH_MS = 'HH:mm:ss.SSS'; @@ -65,7 +69,7 @@ export const URL_PARAMS = { }, sliceId: { name: 'slice_id', - type: 'string', + type: 'number', }, datasourceId: { name: 'datasource_id', @@ -91,6 +95,26 @@ export const URL_PARAMS = { name: 'permalink_key', type: 'string', }, + vizType: { + name: 'viz_type', + type: 'string', + }, + showDatabaseModal: { + name: 'show_database_modal', + type: 'boolean', + }, + saveAction: { + name: 'save_action', + type: 'string', + }, + dashboardPageId: { + name: 'dashboard_page_id', + type: 'string', + }, + dashboardFocusedChart: { + name: 'focused_chart', + type: 'number', + }, } as const; export const RESERVED_CHART_URL_PARAMS: string[] = [ @@ -120,4 +144,58 @@ export const SLOW_DEBOUNCE = 500; /** * Display null as `N/A` */ -export const NULL_DISPLAY = 'N/A'; +export const NULL_DISPLAY = t('N/A'); + +export const DEFAULT_COMMON_BOOTSTRAP_DATA: CommonBootstrapData = { + flash_messages: [], + conf: {}, + locale: 'en', + feature_flags: {}, + language_pack: { + domain: '', + locale_data: { + superset: { + '': { + domain: 'superset', + lang: 'en', + plural_forms: '', + }, + }, + }, + }, + extra_categorical_color_schemes: [], + extra_sequential_color_schemes: [], + theme_overrides: {}, + menu_data: { + menu: [], + brand: { + path: '', + icon: '', + alt: '', + tooltip: '', + text: '', + }, + navbar_right: { + show_watermark: true, + languages: {}, + show_language_picker: true, + user_is_anonymous: false, + user_info_url: '', + user_login_url: '', + user_logout_url: '', + user_profile_url: '', + locale: '', + }, + settings: [], + environment_tag: { + text: '', + color: '', + }, + }, + datahub_url: '', + advanced_data_types: [], +}; + +export const DEFAULT_BOOTSTRAP_DATA: BootstrapData = { + common: DEFAULT_COMMON_BOOTSTRAP_DATA, +}; diff --git a/superset-frontend/src/dashboard/actions/dashboardInfo.ts b/superset-frontend/src/dashboard/actions/dashboardInfo.ts index 9a769101cfdc..bbc06d37b0ad 100644 --- a/superset-frontend/src/dashboard/actions/dashboardInfo.ts +++ b/superset-frontend/src/dashboard/actions/dashboardInfo.ts @@ -19,7 +19,15 @@ import { Dispatch } from 'redux'; import { makeApi, CategoricalColorNamespace } from '@superset-ui/core'; import { isString } from 'lodash'; -import { ChartConfiguration, DashboardInfo } from '../reducers/types'; +import { getErrorText } from 'src/utils/getClientErrorObject'; +import { addDangerToast } from 'src/components/MessageToasts/actions'; +import { + DashboardInfo, + FilterBarOrientation, + RootState, +} from 'src/dashboard/types'; +import { ChartConfiguration } from 'src/dashboard/reducers/types'; +import { onSave } from './dashboardState'; export const DASHBOARD_INFO_UPDATED = 'DASHBOARD_INFO_UPDATED'; @@ -111,3 +119,93 @@ export const setChartConfiguration = dispatch({ type: SET_CHART_CONFIG_FAIL, chartConfiguration }); } }; + +export const SET_FILTER_BAR_ORIENTATION = 'SET_FILTER_BAR_ORIENTATION'; +export interface SetFilterBarOrientation { + type: typeof SET_FILTER_BAR_ORIENTATION; + filterBarOrientation: FilterBarOrientation; +} +export function setFilterBarOrientation( + filterBarOrientation: FilterBarOrientation, +) { + return { type: SET_FILTER_BAR_ORIENTATION, filterBarOrientation }; +} + +export const SET_CROSS_FILTERS_ENABLED = 'SET_CROSS_FILTERS_ENABLED'; +export interface SetCrossFiltersEnabled { + type: typeof SET_CROSS_FILTERS_ENABLED; + crossFiltersEnabled: boolean; +} +export function setCrossFiltersEnabled(crossFiltersEnabled: boolean) { + return { type: SET_CROSS_FILTERS_ENABLED, crossFiltersEnabled }; +} + +export function saveFilterBarOrientation(orientation: FilterBarOrientation) { + return async (dispatch: Dispatch, getState: () => RootState) => { + const { id, metadata } = getState().dashboardInfo; + const updateDashboard = makeApi< + Partial<DashboardInfo>, + { result: Partial<DashboardInfo>; last_modified_time: number } + >({ + method: 'PUT', + endpoint: `/api/v1/dashboard/${id}`, + }); + try { + const response = await updateDashboard({ + json_metadata: JSON.stringify({ + ...metadata, + filter_bar_orientation: orientation, + }), + }); + const updatedDashboard = response.result; + const lastModifiedTime = response.last_modified_time; + if (updatedDashboard.json_metadata) { + const metadata = JSON.parse(updatedDashboard.json_metadata); + if (metadata.filter_bar_orientation) { + dispatch(setFilterBarOrientation(metadata.filter_bar_orientation)); + } + } + if (lastModifiedTime) { + dispatch(onSave(lastModifiedTime)); + } + } catch (errorObject) { + const errorText = await getErrorText(errorObject, 'dashboard'); + dispatch(addDangerToast(errorText)); + throw errorObject; + } + }; +} + +export function saveCrossFiltersSetting(crossFiltersEnabled: boolean) { + return async (dispatch: Dispatch, getState: () => RootState) => { + const { id, metadata } = getState().dashboardInfo; + const updateDashboard = makeApi< + Partial<DashboardInfo>, + { result: Partial<DashboardInfo>; last_modified_time: number } + >({ + method: 'PUT', + endpoint: `/api/v1/dashboard/${id}`, + }); + try { + const response = await updateDashboard({ + json_metadata: JSON.stringify({ + ...metadata, + cross_filters_enabled: crossFiltersEnabled, + }), + }); + const updatedDashboard = response.result; + const lastModifiedTime = response.last_modified_time; + if (updatedDashboard.json_metadata) { + const metadata = JSON.parse(updatedDashboard.json_metadata); + dispatch(setCrossFiltersEnabled(metadata.cross_filters_enabled)); + } + if (lastModifiedTime) { + dispatch(onSave(lastModifiedTime)); + } + } catch (errorObject) { + const errorText = await getErrorText(errorObject, 'dashboard'); + dispatch(addDangerToast(errorText)); + throw errorObject; + } + }; +} diff --git a/superset-frontend/src/dashboard/actions/dashboardState.js b/superset-frontend/src/dashboard/actions/dashboardState.js index f96b3ebadf28..8db1a500eee3 100644 --- a/superset-frontend/src/dashboard/actions/dashboardState.js +++ b/superset-frontend/src/dashboard/actions/dashboardState.js @@ -32,7 +32,11 @@ import { import { chart as initChart } from 'src/components/Chart/chartReducer'; import { applyDefaultFormData } from 'src/explore/store'; import { getClientErrorObject } from 'src/utils/getClientErrorObject'; -import { SAVE_TYPE_OVERWRITE } from 'src/dashboard/util/constants'; +import { + SAVE_TYPE_OVERWRITE, + SAVE_TYPE_OVERWRITE_CONFIRMED, +} from 'src/dashboard/util/constants'; +import { isCrossFiltersEnabled } from 'src/dashboard/util/crossFilters'; import { addSuccessToast, addWarningToast, @@ -43,6 +47,8 @@ import serializeFilterScopes from 'src/dashboard/util/serializeFilterScopes'; import { getActiveFilters } from 'src/dashboard/util/activeDashboardFilters'; import { safeStringify } from 'src/utils/safeStringify'; import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; +import { logEvent } from 'src/logger/actions'; +import { LOG_ACTIONS_CONFIRM_OVERWRITE_DASHBOARD_METADATA } from 'src/logger/LogUtils'; import { UPDATE_COMPONENTS_PARENTS_LIST } from './dashboardLayout'; import { setChartConfiguration, @@ -56,6 +62,7 @@ import { updateDirectPathToFilter, } from './dashboardFilters'; import { SET_FILTER_CONFIG_COMPLETE } from './nativeFilters'; +import getOverwriteItems from '../util/getOverwriteItems'; export const SET_UNSAVED_CHANGES = 'SET_UNSAVED_CHANGES'; export function setUnsavedChanges(hasUnsavedChanges) { @@ -72,11 +79,6 @@ export function removeSlice(sliceId) { return { type: REMOVE_SLICE, sliceId }; } -export const RESET_SLICE = 'RESET_SLICE'; -export function resetSlice() { - return { type: RESET_SLICE }; -} - const FAVESTAR_BASE_URL = '/superset/favstar/Dashboard'; export const TOGGLE_FAVE_STAR = 'TOGGLE_FAVE_STAR'; export function toggleFaveStar(isStarred) { @@ -194,9 +196,28 @@ export function saveDashboardRequestSuccess(lastModifiedTime) { }; } +export const SET_OVERRIDE_CONFIRM = 'SET_OVERRIDE_CONFIRM'; +export function setOverrideConfirm(overwriteConfirmMetadata) { + return { + type: SET_OVERRIDE_CONFIRM, + overwriteConfirmMetadata, + }; +} + +export const SAVE_DASHBOARD_STARTED = 'SAVE_DASHBOARD_STARTED'; +export function saveDashboardStarted() { + return { type: SAVE_DASHBOARD_STARTED }; +} + +export const SAVE_DASHBOARD_FINISHED = 'SAVE_DASHBOARD_FINISHED'; +export function saveDashboardFinished() { + return { type: SAVE_DASHBOARD_FINISHED }; +} + export function saveDashboardRequest(data, id, saveType) { return (dispatch, getState) => { dispatch({ type: UPDATE_COMPONENTS_PARENTS_LIST }); + dispatch(saveDashboardStarted()); const { dashboardFilters, dashboardLayout } = getState(); const layout = dashboardLayout.present; @@ -222,7 +243,7 @@ export function saveDashboardRequest(data, id, saveType) { } = data; const hasId = item => item.id !== undefined; - + const metadataCrossFiltersEnabled = data.metadata?.cross_filters_enabled; // making sure the data is what the backend expects const cleanedData = { ...data, @@ -240,12 +261,17 @@ export function saveDashboardRequest(data, id, saveType) { ...data.metadata, color_namespace: data.metadata?.color_namespace || undefined, color_scheme: data.metadata?.color_scheme || '', + color_scheme_domain: data.metadata?.color_scheme_domain || [], expanded_slices: data.metadata?.expanded_slices || {}, label_colors: data.metadata?.label_colors || {}, shared_label_colors: data.metadata?.shared_label_colors || {}, refresh_frequency: data.metadata?.refresh_frequency || 0, timed_refresh_immune_slices: data.metadata?.timed_refresh_immune_slices || [], + // cross-filters should be enabled by default + cross_filters_enabled: isCrossFiltersEnabled( + metadataCrossFiltersEnabled, + ), }, }; @@ -281,6 +307,7 @@ export function saveDashboardRequest(data, id, saveType) { const chartConfiguration = handleChartConfiguration(); dispatch(setChartConfiguration(chartConfiguration)); } + dispatch(saveDashboardFinished()); dispatch(addSuccessToast(t('This dashboard was saved successfully.'))); return response; }; @@ -288,7 +315,7 @@ export function saveDashboardRequest(data, id, saveType) { const onUpdateSuccess = response => { const updatedDashboard = response.json.result; const lastModifiedTime = response.json.last_modified_time; - // synching with the backend transformations of the metadata + // syncing with the backend transformations of the metadata if (updatedDashboard.json_metadata) { const metadata = JSON.parse(updatedDashboard.json_metadata); dispatch( @@ -312,6 +339,7 @@ export function saveDashboardRequest(data, id, saveType) { if (lastModifiedTime) { dispatch(saveDashboardRequestSuccess(lastModifiedTime)); } + dispatch(saveDashboardFinished()); // redirect to the new slug or id window.history.pushState( { event: 'dashboard_properties_changed' }, @@ -320,6 +348,7 @@ export function saveDashboardRequest(data, id, saveType) { ); dispatch(addSuccessToast(t('This dashboard was saved successfully.'))); + dispatch(setOverrideConfirm(undefined)); return response; }; @@ -336,37 +365,89 @@ export function saveDashboardRequest(data, id, saveType) { if (typeof message === 'string' && message === 'Forbidden') { errorText = t('You do not have permission to edit this dashboard'); } + dispatch(saveDashboardFinished()); dispatch(addDangerToast(errorText)); }; - if (saveType === SAVE_TYPE_OVERWRITE) { + if ( + [SAVE_TYPE_OVERWRITE, SAVE_TYPE_OVERWRITE_CONFIRMED].includes(saveType) + ) { let chartConfiguration = {}; if (isFeatureEnabled(FeatureFlag.DASHBOARD_CROSS_FILTERS)) { chartConfiguration = handleChartConfiguration(); } - const updatedDashboard = { - certified_by: cleanedData.certified_by, - certification_details: cleanedData.certification_details, - css: cleanedData.css, - dashboard_title: cleanedData.dashboard_title, - slug: cleanedData.slug, - owners: cleanedData.owners, - roles: cleanedData.roles, - json_metadata: safeStringify({ - ...(cleanedData?.metadata || {}), - default_filters: safeStringify(serializedFilters), - filter_scopes: serializedFilterScopes, - chart_configuration: chartConfiguration, - }), - }; - - return SupersetClient.put({ - endpoint: `/api/v1/dashboard/${id}`, - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(updatedDashboard), + const updatedDashboard = + saveType === SAVE_TYPE_OVERWRITE_CONFIRMED + ? data + : { + certified_by: cleanedData.certified_by, + certification_details: cleanedData.certification_details, + css: cleanedData.css, + dashboard_title: cleanedData.dashboard_title, + slug: cleanedData.slug, + owners: cleanedData.owners, + roles: cleanedData.roles, + json_metadata: safeStringify({ + ...(cleanedData?.metadata || {}), + default_filters: safeStringify(serializedFilters), + filter_scopes: serializedFilterScopes, + chart_configuration: chartConfiguration, + }), + }; + + const updateDashboard = () => + SupersetClient.put({ + endpoint: `/api/v1/dashboard/${id}`, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(updatedDashboard), + }) + .then(response => onUpdateSuccess(response)) + .catch(response => onError(response)); + return new Promise((resolve, reject) => { + if ( + !isFeatureEnabled(FeatureFlag.CONFIRM_DASHBOARD_DIFF) || + saveType === SAVE_TYPE_OVERWRITE_CONFIRMED + ) { + // skip overwrite precheck + resolve(); + return; + } + + // precheck for overwrite items + SupersetClient.get({ + endpoint: `/api/v1/dashboard/${id}`, + }).then(response => { + const dashboard = response.json.result; + const overwriteConfirmItems = getOverwriteItems( + dashboard, + updatedDashboard, + ); + if (overwriteConfirmItems.length > 0) { + dispatch( + setOverrideConfirm({ + updatedAt: dashboard.changed_on, + updatedBy: dashboard.changed_by_name, + overwriteConfirmItems, + dashboardId: id, + data: updatedDashboard, + }), + ); + return reject(overwriteConfirmItems); + } + return resolve(); + }); }) - .then(response => onUpdateSuccess(response)) - .catch(response => onError(response)); + .then(updateDashboard) + .catch(overwriteConfirmItems => { + const errorText = t('Please confirm the overwrite values.'); + dispatch( + logEvent(LOG_ACTIONS_CONFIRM_OVERWRITE_DASHBOARD_METADATA, { + dashboard_id: id, + items: overwriteConfirmItems, + }), + ); + dispatch(addDangerToast(errorText)); + }); } // changing the data as the endpoint requires const copyData = { ...cleanedData }; @@ -489,8 +570,7 @@ export function addSliceToDashboard(id, component) { const newChart = { ...initChart, id, - form_data, - formData: applyDefaultFormData(form_data), + form_data: applyDefaultFormData(form_data), }; return Promise.all([ @@ -506,28 +586,6 @@ export function addSliceToDashboard(id, component) { }; } -export function postAddSliceFromDashboard() { - return (dispatch, getState) => { - const { - dashboardInfo: { metadata }, - dashboardState, - } = getState(); - - if (dashboardState?.updateSlice && dashboardState?.editMode) { - metadata.shared_label_colors = getSharedLabelColor().getColorMap( - metadata?.color_namespace, - metadata?.color_scheme, - ); - dispatch( - dashboardInfoChanged({ - metadata, - }), - ); - dispatch(resetSlice()); - } - }; -} - export function removeSliceFromDashboard(id) { return (dispatch, getState) => { const sliceEntity = getState().sliceEntities.slices[id]; @@ -537,20 +595,7 @@ export function removeSliceFromDashboard(id) { dispatch(removeSlice(id)); dispatch(removeChart(id)); - - const { - dashboardInfo: { metadata }, - } = getState(); getSharedLabelColor().removeSlice(id); - metadata.shared_label_colors = getSharedLabelColor().getColorMap( - metadata?.color_namespace, - metadata?.color_scheme, - ); - dispatch( - dashboardInfoChanged({ - metadata, - }), - ); }; } @@ -607,7 +652,10 @@ export function maxUndoHistoryToast() { return dispatch( addWarningToast( - `You have used all ${historyLength} undo slots and will not be able to fully undo subsequent actions. You may save your current state to reset the history.`, + t( + 'You have used all %(historyLength)s undo slots and will not be able to fully undo subsequent actions. You may save your current state to reset the history.', + { historyLength }, + ), ), ); }; diff --git a/superset-frontend/src/dashboard/actions/dashboardState.test.js b/superset-frontend/src/dashboard/actions/dashboardState.test.js index f5fa60c08d56..00b358bc4397 100644 --- a/superset-frontend/src/dashboard/actions/dashboardState.test.js +++ b/superset-frontend/src/dashboard/actions/dashboardState.test.js @@ -18,14 +18,22 @@ */ import sinon from 'sinon'; import { SupersetClient } from '@superset-ui/core'; +import { waitFor } from '@testing-library/react'; import { removeSliceFromDashboard, + SAVE_DASHBOARD_STARTED, saveDashboardRequest, + SET_OVERRIDE_CONFIRM, } from 'src/dashboard/actions/dashboardState'; import { REMOVE_FILTER } from 'src/dashboard/actions/dashboardFilters'; +import * as featureFlags from 'src/featureFlags'; import { UPDATE_COMPONENTS_PARENTS_LIST } from 'src/dashboard/actions/dashboardLayout'; -import { DASHBOARD_GRID_ID } from 'src/dashboard/util/constants'; +import { + DASHBOARD_GRID_ID, + SAVE_TYPE_OVERWRITE, + SAVE_TYPE_OVERWRITE_CONFIRMED, +} from 'src/dashboard/util/constants'; import { filterId, sliceEntitiesForDashboard as sliceEntities, @@ -55,13 +63,32 @@ describe('dashboardState actions', () => { const newDashboardData = mockDashboardData; let postStub; + let getStub; + let putStub; + const updatedCss = '.updated_css_value {\n color: black;\n}'; + beforeEach(() => { postStub = sinon .stub(SupersetClient, 'post') .resolves('the value you want to return'); + getStub = sinon.stub(SupersetClient, 'get').resolves({ + json: { + result: { + ...mockDashboardData, + css: updatedCss, + }, + }, + }); + putStub = sinon.stub(SupersetClient, 'put').resolves({ + json: { + result: mockDashboardData, + }, + }); }); afterEach(() => { postStub.restore(); + getStub.restore(); + putStub.restore(); }); function setup(stateOverrides) { @@ -78,10 +105,11 @@ describe('dashboardState actions', () => { }); const thunk = saveDashboardRequest(newDashboardData, 1, 'save_dash'); thunk(dispatch, getState); - expect(dispatch.callCount).toBe(1); + expect(dispatch.callCount).toBe(2); expect(dispatch.getCall(0).args[0].type).toBe( UPDATE_COMPONENTS_PARENTS_LIST, ); + expect(dispatch.getCall(1).args[0].type).toBe(SAVE_DASHBOARD_STARTED); }); it('should post dashboard data with updated redux state', () => { @@ -111,6 +139,58 @@ describe('dashboardState actions', () => { mockParentsList, ); }); + + describe('FeatureFlag.CONFIRM_DASHBOARD_DIFF', () => { + let isFeatureEnabledMock; + beforeEach(() => { + isFeatureEnabledMock = jest + .spyOn(featureFlags, 'isFeatureEnabled') + .mockImplementation(feature => feature === 'CONFIRM_DASHBOARD_DIFF'); + }); + + afterEach(() => { + isFeatureEnabledMock.mockRestore(); + }); + + it('dispatches SET_OVERRIDE_CONFIRM when an inspect value has diff', async () => { + const id = 192; + const { getState, dispatch } = setup(); + const thunk = saveDashboardRequest( + newDashboardData, + id, + SAVE_TYPE_OVERWRITE, + ); + thunk(dispatch, getState); + expect(getStub.callCount).toBe(1); + expect(postStub.callCount).toBe(0); + await waitFor(() => + expect(dispatch.getCall(2).args[0].type).toBe(SET_OVERRIDE_CONFIRM), + ); + expect( + dispatch.getCall(2).args[0].overwriteConfirmMetadata.dashboardId, + ).toBe(id); + }); + + it('should post dashboard data with after confirm the overwrite values', async () => { + const id = 192; + const { getState, dispatch } = setup(); + const confirmedDashboardData = { + ...newDashboardData, + css: updatedCss, + }; + const thunk = saveDashboardRequest( + confirmedDashboardData, + id, + SAVE_TYPE_OVERWRITE_CONFIRMED, + ); + thunk(dispatch, getState); + expect(getStub.callCount).toBe(0); + expect(postStub.callCount).toBe(0); + await waitFor(() => expect(putStub.callCount).toBe(1)); + const { body } = putStub.getCall(0).args[0]; + expect(body).toBe(JSON.stringify(confirmedDashboardData)); + }); + }); }); it('should dispatch removeFilter if a removed slice is a filter_box', () => { @@ -120,6 +200,6 @@ describe('dashboardState actions', () => { const removeFilter = dispatch.getCall(0).args[0]; removeFilter(dispatch, getState); - expect(dispatch.getCall(4).args[0].type).toBe(REMOVE_FILTER); + expect(dispatch.getCall(3).args[0].type).toBe(REMOVE_FILTER); }); }); diff --git a/superset-frontend/src/dashboard/actions/hydrate.js b/superset-frontend/src/dashboard/actions/hydrate.js index ccc8288e6158..efae72151ef9 100644 --- a/superset-frontend/src/dashboard/actions/hydrate.js +++ b/superset-frontend/src/dashboard/actions/hydrate.js @@ -24,9 +24,9 @@ import { initSliceEntities } from 'src/dashboard/reducers/sliceEntities'; import { getInitialState as getInitialNativeFilterState } from 'src/dashboard/reducers/nativeFilters'; import { applyDefaultFormData } from 'src/explore/store'; import { buildActiveFilters } from 'src/dashboard/util/activeDashboardFilters'; -import findPermission, { - canUserEditDashboard, -} from 'src/dashboard/util/findPermission'; +import { findPermission } from 'src/utils/findPermission'; +import { canUserEditDashboard } from 'src/dashboard/util/permissionUtils'; +import { isCrossFiltersEnabled } from 'src/dashboard/util/crossFilters'; import { DASHBOARD_FILTER_SCOPE_GLOBAL, dashboardFilter, @@ -56,27 +56,31 @@ import { FeatureFlag, isFeatureEnabled } from '../../featureFlags'; import extractUrlParams from '../util/extractUrlParams'; import getNativeFilterConfig from '../util/filterboxMigrationHelper'; import { updateColorSchema } from './dashboardInfo'; +import { getChartIdsInFilterScope } from '../util/getChartIdsInFilterScope'; +import updateComponentParentsList from '../util/updateComponentParentsList'; +import { FilterBarOrientation } from '../types'; export const HYDRATE_DASHBOARD = 'HYDRATE_DASHBOARD'; export const hydrateDashboard = - ( - dashboardData, - chartData, + ({ + history, + dashboard, + charts, filterboxMigrationState = FILTER_BOX_MIGRATION_STATES.NOOP, - dataMaskApplied, - ) => + dataMask, + activeTabs, + }) => (dispatch, getState) => { const { user, common, dashboardState } = getState(); - - const { metadata } = dashboardData; + const { metadata, position_data: positionData } = dashboard; const regularUrlParams = extractUrlParams('regular'); const reservedUrlParams = extractUrlParams('reserved'); const editMode = reservedUrlParams.edit === 'true'; let preselectFilters = {}; - chartData.forEach(chart => { + charts.forEach(chart => { // eslint-disable-next-line no-param-reassign chart.slice_id = chart.form_data.slice_id; }); @@ -99,12 +103,10 @@ export const hydrateDashboard = updateColorSchema(metadata, metadata?.label_colors); } - // dashboard layout - const { position_data } = dashboardData; // new dash: position_json could be {} or null const layout = - position_data && Object.keys(position_data).length > 0 - ? position_data + positionData && Object.keys(positionData).length > 0 + ? positionData : getEmptyLayout(); // create a lookup to sync layout names with slice names @@ -129,7 +131,7 @@ export const hydrateDashboard = const sliceIds = new Set(); const slicesFromExploreCount = new Map(); - chartData.forEach(slice => { + charts.forEach(slice => { const key = slice.slice_id; const form_data = { ...slice.form_data, @@ -141,8 +143,7 @@ export const hydrateDashboard = chartQueries[key] = { ...chart, id: key, - form_data, - formData: applyDefaultFormData(form_data), + form_data: applyDefaultFormData(form_data), }; slices[key] = { @@ -260,6 +261,19 @@ export const hydrateDashboard = layout[layoutId].meta.sliceName = slice.slice_name; } }); + + // make sure that parents tree is built + if ( + Object.values(layout).some( + element => element.id !== DASHBOARD_ROOT_ID && !element.parents, + ) + ) { + updateComponentParentsList({ + currentComponent: layout[DASHBOARD_ROOT_ID], + layout, + }); + } + buildActiveFilters({ dashboardFilters, components: layout, @@ -270,7 +284,7 @@ export const hydrateDashboard = id: DASHBOARD_HEADER_ID, type: DASHBOARD_HEADER_TYPE, meta: { - text: dashboardData.dashboard_title, + text: dashboard.dashboard_title, }, }; @@ -280,9 +294,26 @@ export const hydrateDashboard = future: [], }; + // Searches for a focused_chart parameter in the URL to automatically focus a chart + const focusedChartId = getUrlParam(URL_PARAMS.dashboardFocusedChart); + let focusedChartLayoutId; + if (focusedChartId) { + // Converts focused_chart to dashboard layout id + const found = Object.values(dashboardLayout.present).find( + element => element.meta?.chartId === focusedChartId, + ); + focusedChartLayoutId = found?.id; + // Removes the focused_chart parameter from the URL + const params = new URLSearchParams(window.location.search); + params.delete(URL_PARAMS.dashboardFocusedChart.name); + history.replace({ + search: params.toString(), + }); + } + // find direct link component and path from root - const directLinkComponentId = getLocationHash(); - let directPathToChild = []; + const directLinkComponentId = focusedChartLayoutId || getLocationHash(); + let directPathToChild = dashboardState.directPathToChild || []; if (layout[directLinkComponentId]) { directPathToChild = (layout[directLinkComponentId].parents || []).slice(); directPathToChild.push(directLinkComponentId); @@ -292,7 +323,7 @@ export const hydrateDashboard = let filterConfig = metadata?.native_filter_configuration || []; if (filterboxMigrationState === FILTER_BOX_MIGRATION_STATES.REVIEWING) { filterConfig = getNativeFilterConfig( - chartData, + charts, filterScopes, preselectFilters, ); @@ -303,7 +334,7 @@ export const hydrateDashboard = filterConfig, }); metadata.show_native_filters = - dashboardData?.metadata?.show_native_filters ?? + dashboard?.metadata?.show_native_filters ?? (isFeatureEnabled(FeatureFlag.DASHBOARD_NATIVE_FILTERS) && [ FILTER_BOX_MIGRATION_STATES.CONVERTED, @@ -319,13 +350,32 @@ export const hydrateDashboard = const behaviors = ( getChartMetadataRegistry().get( - chartQueries[chartId]?.formData?.viz_type, + chartQueries[chartId]?.form_data?.viz_type, ) ?? {} )?.behaviors ?? []; if (!metadata.chart_configuration) { metadata.chart_configuration = {}; } + if (behaviors.includes(Behavior.INTERACTIVE_CHART)) { + if (!metadata.chart_configuration[chartId]) { + metadata.chart_configuration[chartId] = { + id: chartId, + crossFilters: { + scope: { + rootPath: [DASHBOARD_ROOT_ID], + excluded: [chartId], // By default it doesn't affects itself + }, + }, + }; + } + metadata.chart_configuration[chartId].crossFilters.chartsInScope = + getChartIdsInFilterScope( + metadata.chart_configuration[chartId].crossFilters.scope, + chartQueries, + dashboardLayout.present, + ); + } if ( behaviors.includes(Behavior.INTERACTIVE_CHART) && !metadata.chart_configuration[chartId] @@ -344,7 +394,10 @@ export const hydrateDashboard = } const { roles } = user; - const canEdit = canUserEditDashboard(dashboardData, user); + const canEdit = canUserEditDashboard(dashboard, user); + const crossFiltersEnabled = isCrossFiltersEnabled( + metadata.cross_filters_enabled, + ); return dispatch({ type: HYDRATE_DASHBOARD, @@ -353,7 +406,7 @@ export const hydrateDashboard = charts: chartQueries, // read-only data dashboardInfo: { - ...dashboardData, + ...dashboard, metadata, userId: user.userId ? String(user.userId) : null, // legacy, please use state.user instead dash_edit_perm: canEdit, @@ -380,8 +433,13 @@ export const hydrateDashboard = flash_messages: common?.flash_messages, conf: common?.conf, }, + filterBarOrientation: + (isFeatureEnabled(FeatureFlag.HORIZONTAL_FILTER_BAR) && + metadata.filter_bar_orientation) || + FilterBarOrientation.VERTICAL, + crossFiltersEnabled, }, - dataMask: dataMaskApplied, + dataMask, dashboardFilters, nativeFilters, dashboardState: { @@ -395,17 +453,18 @@ export const hydrateDashboard = // dashboard viewers can set refresh frequency for the current visit, // only persistent refreshFrequency will be saved to backend shouldPersistRefreshFrequency: false, - css: dashboardData.css || '', + css: dashboard.css || '', colorNamespace: metadata?.color_namespace || null, colorScheme: metadata?.color_scheme || null, editMode: canEdit && editMode, - isPublished: dashboardData.published, + isPublished: dashboard.published, hasUnsavedChanges: false, + dashboardIsSaving: false, maxUndoHistoryExceeded: false, - lastModifiedTime: dashboardData.changed_on, + lastModifiedTime: dashboard.changed_on, isRefreshing: false, isFiltersRefreshing: false, - activeTabs: dashboardState?.activeTabs || [], + activeTabs: activeTabs || dashboardState?.activeTabs || [], filterboxMigrationState, datasetsStatus: ResourceStatus.LOADING, }, diff --git a/superset-frontend/src/dashboard/actions/nativeFilters.ts b/superset-frontend/src/dashboard/actions/nativeFilters.ts index 71cc01d99681..76ac6cc1fbed 100644 --- a/superset-frontend/src/dashboard/actions/nativeFilters.ts +++ b/superset-frontend/src/dashboard/actions/nativeFilters.ts @@ -372,6 +372,28 @@ export function unsetFocusedNativeFilter(): UnsetFocusedNativeFilter { }; } +export const SET_HOVERED_NATIVE_FILTER = 'SET_HOVERED_NATIVE_FILTER'; +export interface SetHoveredNativeFilter { + type: typeof SET_HOVERED_NATIVE_FILTER; + id: string; +} +export const UNSET_HOVERED_NATIVE_FILTER = 'UNSET_HOVERED_NATIVE_FILTER'; +export interface UnsetHoveredNativeFilter { + type: typeof UNSET_HOVERED_NATIVE_FILTER; +} + +export function setHoveredNativeFilter(id: string): SetHoveredNativeFilter { + return { + type: SET_HOVERED_NATIVE_FILTER, + id, + }; +} +export function unsetHoveredNativeFilter(): UnsetHoveredNativeFilter { + return { + type: UNSET_HOVERED_NATIVE_FILTER, + }; +} + export type AnyFilterAction = | SetFilterConfigBegin | SetFilterConfigComplete @@ -383,6 +405,8 @@ export type AnyFilterAction = | SetBootstrapData | SetFocusedNativeFilter | UnsetFocusedNativeFilter + | SetHoveredNativeFilter + | UnsetHoveredNativeFilter | CreateFilterSetBegin | CreateFilterSetComplete | CreateFilterSetFail diff --git a/superset-frontend/src/dashboard/actions/sliceEntities.js b/superset-frontend/src/dashboard/actions/sliceEntities.js index be111605202c..74fd8fd7f252 100644 --- a/superset-frontend/src/dashboard/actions/sliceEntities.js +++ b/superset-frontend/src/dashboard/actions/sliceEntities.js @@ -24,6 +24,12 @@ import { addDangerToast } from 'src/components/MessageToasts/actions'; import { getClientErrorObject } from 'src/utils/getClientErrorObject'; export const SET_ALL_SLICES = 'SET_ALL_SLICES'; +const FETCH_SLICES_PAGE_SIZE = 200; + +export function getDatasourceParameter(datasourceId, datasourceType) { + return `${datasourceId}__${datasourceType}`; +} + export function setAllSlices(slices) { return { type: SET_ALL_SLICES, payload: { slices } }; } @@ -38,96 +44,141 @@ export function fetchAllSlicesFailed(error) { return { type: FETCH_ALL_SLICES_FAILED, payload: { error } }; } -export function getDatasourceParameter(datasourceId, datasourceType) { - return `${datasourceId}__${datasourceType}`; +export function fetchSlices( + userId, + excludeFilterBox, + dispatch, + filter_value, + sortColumn = 'changed_on', + slices = {}, +) { + const additional_filters = filter_value + ? [{ col: 'slice_name', opr: 'chart_all_text', value: filter_value }] + : []; + + const cloneSlices = { ...slices }; + + return SupersetClient.get({ + endpoint: `/api/v1/chart/?q=${rison.encode({ + columns: [ + 'changed_on_delta_humanized', + 'changed_on_utc', + 'datasource_id', + 'datasource_type', + 'datasource_url', + 'datasource_name_text', + 'description_markeddown', + 'description', + 'id', + 'params', + 'slice_name', + 'thumbnail_url', + 'url', + 'viz_type', + ], + filters: [...additional_filters], + page_size: FETCH_SLICES_PAGE_SIZE, + order_column: + sortColumn === 'changed_on' ? 'changed_on_delta_humanized' : sortColumn, + order_direction: sortColumn === 'changed_on' ? 'desc' : 'asc', + })}`, + }) + .then(({ json }) => { + let { result } = json; + // disable add filter_box viz to dashboard + if (excludeFilterBox) { + result = result.filter(slice => slice.viz_type !== 'filter_box'); + } + result.forEach(slice => { + let form_data = JSON.parse(slice.params); + form_data = { + ...form_data, + // force using datasource stored in relational table prop + datasource: + getDatasourceParameter( + slice.datasource_id, + slice.datasource_type, + ) || form_data.datasource, + }; + cloneSlices[slice.id] = { + slice_id: slice.id, + slice_url: slice.url, + slice_name: slice.slice_name, + form_data, + datasource_name: slice.datasource_name_text, + datasource_url: slice.datasource_url, + datasource_id: slice.datasource_id, + datasource_type: slice.datasource_type, + changed_on: new Date(slice.changed_on_utc).getTime(), + description: slice.description, + description_markdown: slice.description_markeddown, + viz_type: slice.viz_type, + modified: slice.changed_on_delta_humanized, + changed_on_humanized: slice.changed_on_delta_humanized, + thumbnail_url: slice.thumbnail_url, + }; + }); + + return dispatch(setAllSlices(cloneSlices)); + }) + .catch(errorResponse => + getClientErrorObject(errorResponse).then(({ error }) => { + dispatch( + fetchAllSlicesFailed(error || t('Could not fetch all saved charts')), + ); + dispatch( + addDangerToast( + t('Sorry there was an error fetching saved charts: ') + error, + ), + ); + }), + ); } -const FETCH_SLICES_PAGE_SIZE = 200; export function fetchAllSlices(userId, excludeFilterBox = false) { return (dispatch, getState) => { const { sliceEntities } = getState(); if (sliceEntities.lastUpdated === 0) { dispatch(fetchAllSlicesStarted()); - - return SupersetClient.get({ - endpoint: `/api/v1/chart/?q=${rison.encode({ - columns: [ - 'changed_on_delta_humanized', - 'changed_on_utc', - 'datasource_id', - 'datasource_type', - 'datasource_url', - 'datasource_name_text', - 'description_markeddown', - 'description', - 'id', - 'params', - 'slice_name', - 'url', - 'viz_type', - ], - filters: [{ col: 'owners', opr: 'rel_m_m', value: userId }], - page_size: FETCH_SLICES_PAGE_SIZE, - order_column: 'changed_on_delta_humanized', - order_direction: 'desc', - })}`, - }) - .then(({ json }) => { - const slices = {}; - let { result } = json; - // disable add filter_box viz to dashboard - if (excludeFilterBox) { - result = result.filter(slice => slice.viz_type !== 'filter_box'); - } - result.forEach(slice => { - let form_data = JSON.parse(slice.params); - form_data = { - ...form_data, - // force using datasource stored in relational table prop - datasource: - getDatasourceParameter( - slice.datasource_id, - slice.datasource_type, - ) || form_data.datasource, - }; - slices[slice.id] = { - slice_id: slice.id, - slice_url: slice.url, - slice_name: slice.slice_name, - form_data, - datasource_name: slice.datasource_name_text, - datasource_url: slice.datasource_url, - datasource_id: slice.datasource_id, - datasource_type: slice.datasource_type, - changed_on: new Date(slice.changed_on_utc).getTime(), - description: slice.description, - description_markdown: slice.description_markeddown, - viz_type: slice.viz_type, - modified: slice.changed_on_delta_humanized, - changed_on_humanized: slice.changed_on_delta_humanized, - }; - }); - - return dispatch(setAllSlices(slices)); - }) - .catch( - errorResponse => - console.log(errorResponse) || - getClientErrorObject(errorResponse).then(({ error }) => { - dispatch( - fetchAllSlicesFailed( - error || t('Could not fetch all saved charts'), - ), - ); - dispatch( - addDangerToast( - t('Sorry there was an error fetching saved charts: ') + error, - ), - ); - }), - ); + return fetchSlices(userId, excludeFilterBox, dispatch, undefined); } return dispatch(setAllSlices(sliceEntities.slices)); }; } + +export function fetchSortedSlices( + userId, + excludeFilterBox = false, + order_column, +) { + return dispatch => { + dispatch(fetchAllSlicesStarted()); + return fetchSlices( + userId, + excludeFilterBox, + dispatch, + undefined, + order_column, + ); + }; +} + +export function fetchFilteredSlices( + userId, + excludeFilterBox = false, + filter_value, +) { + return (dispatch, getState) => { + dispatch(fetchAllSlicesStarted()); + const { sliceEntities } = getState(); + return fetchSlices( + userId, + excludeFilterBox, + dispatch, + filter_value, + undefined, + sliceEntities.slices, + ); + }; +} diff --git a/superset-frontend/src/dashboard/actions/sliceEntities.test.js b/superset-frontend/src/dashboard/actions/sliceEntities.test.js new file mode 100644 index 000000000000..0fe9365fc9d1 --- /dev/null +++ b/superset-frontend/src/dashboard/actions/sliceEntities.test.js @@ -0,0 +1,102 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import sinon from 'sinon'; +import { SupersetClient } from '@superset-ui/core'; + +import { + FETCH_ALL_SLICES_STARTED, + fetchSortedSlices, + fetchFilteredSlices, + fetchAllSlices, +} from './sliceEntities'; + +describe('slice entity actions', () => { + const mockState = { + sliceEntities: { slices: {} }, + isLoading: true, + errorMessage: null, + lastUpdated: 0, + }; + + function setup(stateOverrides) { + const state = { ...mockState, ...stateOverrides }; + const getState = sinon.spy(() => state); + const dispatch = sinon.spy(); + + return { getState, dispatch, state }; + } + + let spy; + + beforeEach(() => { + spy = sinon.spy(SupersetClient); + }); + + afterEach(() => { + sinon.restore(); + }); + + describe('fetchSortedSlices', () => { + it('should dispatch an fetchAllSlicesStarted action', async () => { + const { dispatch } = setup(); + const thunk1 = fetchSortedSlices('userId', false, 'orderColumn'); + await thunk1(dispatch); + expect(dispatch.getCall(0).args[0]).toEqual({ + type: FETCH_ALL_SLICES_STARTED, + }); + expect(spy.get.callCount).toBe(1); + }); + }); + + describe('fetchFilteredSlices', () => { + it('should dispatch an fetchAllSlicesStarted action', async () => { + const { dispatch, getState } = setup(); + const thunk1 = fetchFilteredSlices('userId', false, 'filter_value'); + await thunk1(dispatch, getState); + expect(dispatch.getCall(0).args[0]).toEqual({ + type: FETCH_ALL_SLICES_STARTED, + }); + expect(spy.get.callCount).toBe(1); + }); + }); + + describe('fetchAllSlices', () => { + it('should not trigger fetchSlices when sliceEntities lastUpdate is not 0', async () => { + const { dispatch, getState } = setup({ + sliceEntities: { slices: {}, lastUpdated: 1 }, + }); + + const thunk1 = fetchAllSlices('userId', false, 'filter_value'); + await thunk1(dispatch, getState); + + expect(spy.get.callCount).toBe(0); + }); + + it('should trigger fetchSlices when sliceEntities lastUpdate is 0', async () => { + const { dispatch, getState } = setup({ + sliceEntities: { slices: {}, lastUpdated: 0 }, + }); + + const thunk1 = fetchAllSlices('userId', false, 'filter_value'); + await thunk1(dispatch, getState); + + expect(spy.get.callCount).toBe(1); + }); + }); +}); diff --git a/superset-frontend/src/dashboard/components/AddSliceCard.jsx b/superset-frontend/src/dashboard/components/AddSliceCard.jsx deleted file mode 100644 index 7a8f7f3b7828..000000000000 --- a/superset-frontend/src/dashboard/components/AddSliceCard.jsx +++ /dev/null @@ -1,148 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import cx from 'classnames'; -import React from 'react'; -import PropTypes from 'prop-types'; -import { t, styled } from '@superset-ui/core'; - -const propTypes = { - datasourceUrl: PropTypes.string, - datasourceName: PropTypes.string, - innerRef: PropTypes.func, - isSelected: PropTypes.bool, - lastModified: PropTypes.string, - sliceName: PropTypes.string.isRequired, - style: PropTypes.object, - visType: PropTypes.string.isRequired, -}; - -const defaultProps = { - datasourceUrl: null, - datasourceName: '-', - innerRef: null, - isSelected: false, - style: null, - lastModified: null, -}; - -const Styled = styled.div` - ${({ theme }) => ` - .chart-card { - border: 1px solid ${theme.colors.grayscale.light2}; - border-radius: ${theme.gridUnit}px; - background: ${theme.colors.grayscale.light5}; - padding: ${theme.gridUnit * 2}px; - margin: 0 ${theme.gridUnit * 3}px - ${theme.gridUnit * 3}px - ${theme.gridUnit * 3}px; - position: relative; - cursor: move; - white-space: nowrap; - overflow: hidden; - - &:hover { - background: ${theme.colors.grayscale.light4}; - } - } - - .chart-card.is-selected { - cursor: not-allowed; - opacity: 0.4; - } - - .card-title { - margin-right: 60px; - margin-bottom: ${theme.gridUnit * 2}px; - font-weight: ${theme.typography.weights.bold}; - } - - .card-body { - display: flex; - flex-direction: column; - - .item { - span { - word-break: break-all; - - &:first-child { - font-weight: ${theme.typography.weights.normal}; - } - } - } - } - - .is-added-label { - background: ${theme.colors.grayscale.base}; - border-radius: ${theme.gridUnit}px; - color: ${theme.colors.grayscale.light5}; - font-size: ${theme.typography.sizes.s}px; - text-transform: uppercase; - position: absolute; - padding: ${theme.gridUnit}px - ${theme.gridUnit * 2}px; - top: ${theme.gridUnit * 8}px; - right: ${theme.gridUnit * 8}px; - pointer-events: none; - } - `} -`; - -function AddSliceCard({ - datasourceUrl, - datasourceName, - innerRef, - isSelected, - lastModified, - sliceName, - style, - visType, -}) { - return ( - <Styled ref={innerRef} style={style}> - <div - className={cx('chart-card', isSelected && 'is-selected')} - data-test="chart-card" - > - <div className="card-title" data-test="card-title"> - {sliceName} - </div> - <div className="card-body"> - <div className="item"> - <span>{t('Modified')} </span> - <span>{lastModified}</span> - </div> - <div className="item"> - <span>{t('Visualization')} </span> - <span>{visType}</span> - </div> - <div className="item"> - <span>{t('Data source')} </span> - <a href={datasourceUrl}>{datasourceName}</a> - </div> - </div> - </div> - {isSelected && <div className="is-added-label">{t('Added')}</div>} - </Styled> - ); -} - -AddSliceCard.propTypes = propTypes; -AddSliceCard.defaultProps = defaultProps; - -export default AddSliceCard; diff --git a/superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.test.tsx b/superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.test.tsx new file mode 100644 index 000000000000..26cd7b945d0e --- /dev/null +++ b/superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.test.tsx @@ -0,0 +1,62 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { FeatureFlag } from '@superset-ui/core'; +import { act, render, screen } from 'spec/helpers/testing-library'; +import AddSliceCard from '.'; + +jest.mock('src/components/DynamicPlugins', () => ({ + usePluginContext: () => ({ + mountedPluginMetadata: { table: { name: 'Table' } }, + }), +})); + +const mockedProps = { + visType: 'table', + sliceName: '-', +}; + +declare const global: { + featureFlags: Record<string, boolean>; +}; + +test('do not render thumbnail if feature flag is not set', async () => { + global.featureFlags = { + [FeatureFlag.THUMBNAILS]: false, + }; + + await act(async () => { + render(<AddSliceCard {...mockedProps} />); + }); + + expect(screen.queryByTestId('thumbnail')).not.toBeInTheDocument(); +}); + +test('render thumbnail if feature flag is set', async () => { + global.featureFlags = { + [FeatureFlag.THUMBNAILS]: true, + }; + + await act(async () => { + render(<AddSliceCard {...mockedProps} />); + }); + + expect(screen.queryByTestId('thumbnail')).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.tsx b/superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.tsx new file mode 100644 index 000000000000..caf71c0b9019 --- /dev/null +++ b/superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.tsx @@ -0,0 +1,288 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { + CSSProperties, + ReactNode, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import { t, isFeatureEnabled, FeatureFlag, css } from '@superset-ui/core'; +import ImageLoader from 'src/components/ListViewCard/ImageLoader'; +import { usePluginContext } from 'src/components/DynamicPlugins'; +import { Tooltip } from 'src/components/Tooltip'; +import { GenericLink } from 'src/components/GenericLink/GenericLink'; +import { Theme } from '@emotion/react'; + +const FALLBACK_THUMBNAIL_URL = '/static/assets/images/chart-card-fallback.svg'; + +const TruncatedTextWithTooltip: React.FC = ({ children, ...props }) => { + const [isTruncated, setIsTruncated] = useState(false); + const ref = useRef<HTMLDivElement>(null); + useEffect(() => { + setIsTruncated( + ref.current ? ref.current.scrollWidth > ref.current.clientWidth : false, + ); + }, [children]); + + const div = ( + <div + {...props} + ref={ref} + css={css` + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: block; + `} + > + {children} + </div> + ); + + return isTruncated ? <Tooltip title={children}>{div}</Tooltip> : div; +}; + +const MetadataItem: React.FC<{ + label: ReactNode; + value: ReactNode; +}> = ({ label, value }) => ( + <div + css={(theme: Theme) => css` + font-size: ${theme.typography.sizes.s}px; + display: flex; + justify-content: space-between; + + &:not(:last-child) { + margin-bottom: ${theme.gridUnit}px; + } + `} + > + <span + css={(theme: Theme) => css` + margin-right: ${theme.gridUnit * 4}px; + color: ${theme.colors.grayscale.base}; + `} + > + {label} + </span> + <span + css={css` + min-width: 0; + `} + > + <TruncatedTextWithTooltip>{value}</TruncatedTextWithTooltip> + </span> + </div> +); + +const SliceAddedBadgePlaceholder: React.FC<{ + showThumbnails?: boolean; + placeholderRef: (element: HTMLDivElement) => void; +}> = ({ showThumbnails, placeholderRef }) => ( + <div + ref={placeholderRef} + css={(theme: Theme) => css` + /* Display styles */ + border: 1px solid ${theme.colors.primary.dark1}; + border-radius: ${theme.gridUnit}px; + color: ${theme.colors.primary.dark1}; + font-size: ${theme.typography.sizes.xs}px; + text-transform: uppercase; + letter-spacing: 0.02em; + padding: ${theme.gridUnit / 2}px ${theme.gridUnit * 2}px; + margin-left: ${theme.gridUnit * 4}px; + pointer-events: none; + + /* Position styles */ + visibility: hidden; + position: ${showThumbnails ? 'absolute' : 'unset'}; + top: ${showThumbnails ? '72px' : 'unset'}; + left: ${showThumbnails ? '84px' : 'unset'}; + `} + > + {t('Added')} + </div> +); + +const SliceAddedBadge: React.FC<{ placeholder?: HTMLDivElement }> = ({ + placeholder, +}) => ( + <div + css={(theme: Theme) => css` + /* Display styles */ + border: 1px solid ${theme.colors.primary.dark1}; + border-radius: ${theme.gridUnit}px; + color: ${theme.colors.primary.dark1}; + font-size: ${theme.typography.sizes.xs}px; + text-transform: uppercase; + letter-spacing: 0.02em; + padding: ${theme.gridUnit / 2}px ${theme.gridUnit * 2}px; + margin-left: ${theme.gridUnit * 4}px; + pointer-events: none; + + /* Position styles */ + display: ${placeholder ? 'unset' : 'none'}; + position: absolute; + top: ${placeholder ? `${placeholder.offsetTop}px` : 'unset'}; + left: ${placeholder ? `${placeholder.offsetLeft - 2}px` : 'unset'}; + `} + > + {t('Added')} + </div> +); + +const AddSliceCard: React.FC<{ + datasourceUrl?: string; + datasourceName?: string; + innerRef?: React.RefObject<HTMLDivElement>; + isSelected?: boolean; + lastModified?: string; + sliceName: string; + style?: CSSProperties; + thumbnailUrl?: string; + visType: string; +}> = ({ + datasourceUrl, + datasourceName = '-', + innerRef, + isSelected = false, + lastModified, + sliceName, + style = {}, + thumbnailUrl, + visType, +}) => { + const showThumbnails = isFeatureEnabled(FeatureFlag.THUMBNAILS); + const [sliceAddedBadge, setSliceAddedBadge] = useState<HTMLDivElement>(); + const { mountedPluginMetadata } = usePluginContext(); + const vizName = useMemo( + () => mountedPluginMetadata[visType].name, + [mountedPluginMetadata, visType], + ); + + return ( + <div ref={innerRef} style={style}> + <div + data-test="chart-card" + css={(theme: Theme) => css` + border: 1px solid ${theme.colors.grayscale.light2}; + border-radius: ${theme.gridUnit}px; + background: ${theme.colors.grayscale.light5}; + padding: ${theme.gridUnit * 4}px; + margin: 0 ${theme.gridUnit * 3}px + ${theme.gridUnit * 3}px + ${theme.gridUnit * 3}px; + position: relative; + cursor: ${isSelected ? 'not-allowed' : 'move'}; + white-space: nowrap; + overflow: hidden; + line-height: 1.3; + color: ${theme.colors.grayscale.dark1} + + &:hover { + background: ${theme.colors.grayscale.light4}; + } + + opacity: ${isSelected ? 0.4 : 'unset'}; + `} + > + <div + css={css` + display: flex; + `} + > + {showThumbnails ? ( + <div + data-test="thumbnail" + css={css` + width: 146px; + height: 82px; + flex-shrink: 0; + margin-right: 16px; + `} + > + <ImageLoader + src={thumbnailUrl || ''} + fallback={FALLBACK_THUMBNAIL_URL} + position="top" + /> + {isSelected && showThumbnails ? ( + <SliceAddedBadgePlaceholder + placeholderRef={setSliceAddedBadge} + showThumbnails={showThumbnails} + /> + ) : null} + </div> + ) : null} + <div + css={css` + flex-grow: 1; + min-width: 0; + `} + > + <div + data-test="card-title" + css={(theme: Theme) => css` + margin-bottom: ${theme.gridUnit * 2}px; + font-weight: ${theme.typography.weights.bold}; + display: flex; + justify-content: space-between; + align-items: center; + `} + > + <TruncatedTextWithTooltip>{sliceName}</TruncatedTextWithTooltip> + {isSelected && !showThumbnails ? ( + <SliceAddedBadgePlaceholder + placeholderRef={setSliceAddedBadge} + /> + ) : null} + </div> + <div + css={css` + display: flex; + flex-direction: column; + `} + > + <MetadataItem label={t('Viz type')} value={vizName} /> + <MetadataItem + label={t('Dataset')} + value={ + datasourceUrl ? ( + <GenericLink to={datasourceUrl}> + {datasourceName} + </GenericLink> + ) : ( + datasourceName + ) + } + /> + <MetadataItem label={t('Modified')} value={lastModified} /> + </div> + </div> + </div> + </div> + <SliceAddedBadge placeholder={sliceAddedBadge} /> + </div> + ); +}; + +export default AddSliceCard; diff --git a/superset-frontend/cypress-base/cypress/integration/chart_list/chart_list.helper.ts b/superset-frontend/src/dashboard/components/AddSliceCard/index.ts similarity index 91% rename from superset-frontend/cypress-base/cypress/integration/chart_list/chart_list.helper.ts rename to superset-frontend/src/dashboard/components/AddSliceCard/index.ts index 0d66010cf4eb..c3736da122cd 100644 --- a/superset-frontend/cypress-base/cypress/integration/chart_list/chart_list.helper.ts +++ b/superset-frontend/src/dashboard/components/AddSliceCard/index.ts @@ -16,4 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -export const CHART_LIST = '/chart/list/'; + +import AddSliceCard from './AddSliceCard'; + +export default AddSliceCard; diff --git a/superset-frontend/src/dashboard/components/AnchorLink/index.tsx b/superset-frontend/src/dashboard/components/AnchorLink/index.tsx index cfabaf51b7da..a2541ce2a242 100644 --- a/superset-frontend/src/dashboard/components/AnchorLink/index.tsx +++ b/superset-frontend/src/dashboard/components/AnchorLink/index.tsx @@ -26,9 +26,10 @@ import getLocationHash from 'src/dashboard/util/getLocationHash'; export type AnchorLinkProps = { id: string; + dashboardId?: number; scrollIntoView?: boolean; showShortLinkButton?: boolean; -} & Pick<URLShortLinkButtonProps, 'dashboardId' | 'placement'>; +} & Pick<URLShortLinkButtonProps, 'placement'>; export default function AnchorLink({ id, diff --git a/superset-frontend/src/dashboard/components/BuilderComponentPane/BuilderComponentPane.test.tsx b/superset-frontend/src/dashboard/components/BuilderComponentPane/BuilderComponentPane.test.tsx index a5ff5b1314f3..be2b429f59db 100644 --- a/superset-frontend/src/dashboard/components/BuilderComponentPane/BuilderComponentPane.test.tsx +++ b/superset-frontend/src/dashboard/components/BuilderComponentPane/BuilderComponentPane.test.tsx @@ -24,7 +24,7 @@ import BuilderComponentPane from '.'; jest.mock('src/dashboard/containers/SliceAdder'); test('BuilderComponentPane has correct tabs in correct order', () => { - render(<BuilderComponentPane isStandalone={false} topOffset={115} />); + render(<BuilderComponentPane topOffset={115} />); const tabs = screen.getAllByRole('tab'); expect(tabs).toHaveLength(2); expect(tabs[0]).toHaveTextContent('Charts'); diff --git a/superset-frontend/src/dashboard/components/BuilderComponentPane/index.tsx b/superset-frontend/src/dashboard/components/BuilderComponentPane/index.tsx index 7a1019a0e2b2..d9b34cfed2c5 100644 --- a/superset-frontend/src/dashboard/components/BuilderComponentPane/index.tsx +++ b/superset-frontend/src/dashboard/components/BuilderComponentPane/index.tsx @@ -18,12 +18,9 @@ */ /* eslint-env browser */ import React from 'react'; +import { rgba } from 'emotion-rgba'; import Tabs from 'src/components/Tabs'; -import { StickyContainer, Sticky } from 'react-sticky'; -import { ParentSize } from '@vx/responsive'; - -import { t, styled } from '@superset-ui/core'; - +import { t, css, SupersetTheme } from '@superset-ui/core'; import SliceAdder from 'src/dashboard/containers/SliceAdder'; import dashboardComponents from 'src/visualizations/presets/dashboardComponents'; import NewColumn from '../gridComponents/new/NewColumn'; @@ -34,98 +31,72 @@ import NewTabs from '../gridComponents/new/NewTabs'; import NewMarkdown from '../gridComponents/new/NewMarkdown'; import NewDynamicComponent from '../gridComponents/new/NewDynamicComponent'; -export interface BCPProps { - isStandalone: boolean; - topOffset: number; -} - -const SUPERSET_HEADER_HEIGHT = 59; -const SIDEPANE_ADJUST_OFFSET = 4; -const TOP_PANEL_OFFSET = 210; - -const BuilderComponentPaneTabs = styled(Tabs)` - line-height: inherit; - margin-top: ${({ theme }) => theme.gridUnit * 2}px; -`; - -const DashboardBuilderSidepane = styled.div<{ - topOffset: number; -}>` - height: calc(100% - ${TOP_PANEL_OFFSET}px); - position: fixed; - right: 0; - top: 0; -`; +const BUILDER_PANE_WIDTH = 374; -const BuilderComponentPane: React.FC<BCPProps> = ({ - isStandalone, - topOffset = 0, -}) => ( - <DashboardBuilderSidepane - topOffset={topOffset} - className="dashboard-builder-sidepane" +const BuilderComponentPane = ({ topOffset = 0 }) => ( + <div + data-test="dashboard-builder-sidepane" + css={css` + position: sticky; + right: 0; + top: ${topOffset}px; + height: calc(100vh - ${topOffset}px); + width: ${BUILDER_PANE_WIDTH}px; + `} > - <ParentSize> - {({ height }) => ( - <StickyContainer> - <Sticky topOffset={-topOffset} bottomOffset={Infinity}> - {({ style, isSticky }: { style: any; isSticky: boolean }) => { - const { pageYOffset } = window; - const hasHeader = - pageYOffset < SUPERSET_HEADER_HEIGHT && !isStandalone; - const withHeaderTopOffset = - topOffset + - (SUPERSET_HEADER_HEIGHT - pageYOffset - SIDEPANE_ADJUST_OFFSET); + <div + css={(theme: SupersetTheme) => css` + position: absolute; + height: 100%; + width: ${BUILDER_PANE_WIDTH}px; + box-shadow: -4px 0 4px 0 ${rgba(theme.colors.grayscale.dark2, 0.1)}; + background-color: ${theme.colors.grayscale.light5}; + `} + > + <Tabs + data-test="dashboard-builder-component-pane-tabs-navigation" + id="tabs" + css={(theme: SupersetTheme) => css` + line-height: inherit; + margin-top: ${theme.gridUnit * 2}px; + height: 100%; - return ( - <div - className="viewport" - style={{ - ...style, - top: hasHeader ? withHeaderTopOffset : topOffset, - }} - > - <BuilderComponentPaneTabs - id="tabs" - className="tabs-components" - data-test="dashboard-builder-component-pane-tabs-navigation" - > - <Tabs.TabPane - key={1} - tab={t('Charts')} - className="tab-charts" - > - <SliceAdder - height={ - height + (isSticky ? SUPERSET_HEADER_HEIGHT : 0) - } - /> - </Tabs.TabPane> - <Tabs.TabPane key={2} tab={t('Layout elements')}> - <NewTabs /> - <NewRow /> - <NewColumn /> - <NewHeader /> - <NewMarkdown /> - <NewDivider /> - {dashboardComponents - .getAll() - .map(({ key: componentKey, metadata }) => ( - <NewDynamicComponent - metadata={metadata} - componentKey={componentKey} - /> - ))} - </Tabs.TabPane> - </BuilderComponentPaneTabs> - </div> - ); - }} - </Sticky> - </StickyContainer> - )} - </ParentSize> - </DashboardBuilderSidepane> + & .ant-tabs-content-holder { + height: 100%; + & .ant-tabs-content { + height: 100%; + } + } + `} + > + <Tabs.TabPane + key={1} + tab={t('Charts')} + css={css` + height: 100%; + `} + > + <SliceAdder /> + </Tabs.TabPane> + <Tabs.TabPane key={2} tab={t('Layout elements')}> + <NewTabs /> + <NewRow /> + <NewColumn /> + <NewHeader /> + <NewMarkdown /> + <NewDivider /> + {dashboardComponents + .getAll() + .map(({ key: componentKey, metadata }) => ( + <NewDynamicComponent + metadata={metadata} + componentKey={componentKey} + /> + ))} + </Tabs.TabPane> + </Tabs> + </div> + </div> ); export default BuilderComponentPane; diff --git a/superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx b/superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx index f860f65b3550..cdd9364b4b82 100644 --- a/superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx +++ b/superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx @@ -24,6 +24,8 @@ import Button from 'src/components/Button'; import { AntdForm } from 'src/components'; import { setChartConfiguration } from 'src/dashboard/actions/dashboardInfo'; import { ChartConfiguration } from 'src/dashboard/reducers/types'; +import { ChartsState, Layout, RootState } from 'src/dashboard/types'; +import { getChartIdsInFilterScope } from 'src/dashboard/util/getChartIdsInFilterScope'; import CrossFilterScopingForm from './CrossFilterScopingForm'; import { CrossFilterScopingFormType } from './types'; import { StyledForm } from '../nativeFilters/FiltersConfigModal/FiltersConfigModal'; @@ -44,14 +46,24 @@ const CrossFilterScopingModal: FC<CrossFilterScopingModalProps> = ({ const chartConfig = useSelector<any, ChartConfiguration>( ({ dashboardInfo }) => dashboardInfo?.metadata?.chart_configuration, ); + const charts = useSelector<RootState, ChartsState>(state => state.charts); + const layout = useSelector<RootState, Layout>( + state => state.dashboardLayout.present, + ); const scope = chartConfig?.[chartId]?.crossFilters?.scope; const handleSave = () => { + const chartsInScope = getChartIdsInFilterScope( + form.getFieldValue('scope'), + charts, + layout, + ); + dispatch( setChartConfiguration({ ...chartConfig, [chartId]: { id: chartId, - crossFilters: { scope: form.getFieldValue('scope') }, + crossFilters: { scope: form.getFieldValue('scope'), chartsInScope }, }, }), ); diff --git a/superset-frontend/src/dashboard/components/Dashboard.jsx b/superset-frontend/src/dashboard/components/Dashboard.jsx index f04eb696aade..827f0f455d3d 100644 --- a/superset-frontend/src/dashboard/components/Dashboard.jsx +++ b/superset-frontend/src/dashboard/components/Dashboard.jsx @@ -22,6 +22,7 @@ import { isFeatureEnabled, t, FeatureFlag } from '@superset-ui/core'; import { PluginContext } from 'src/components/DynamicPlugins'; import Loading from 'src/components/Loading'; +import getBootstrapData from 'src/utils/getBootstrapData'; import getChartIdsFromLayout from '../util/getChartIdsFromLayout'; import getLayoutComponentFromChartId from '../util/getLayoutComponentFromChartId'; import DashboardBuilder from './DashboardBuilder/DashboardBuilder'; @@ -38,7 +39,6 @@ import { } from '../../logger/LogUtils'; import { areObjectsEqual } from '../../reduxUtils'; -import '../stylesheets/index.less'; import getLocationHash from '../util/getLocationHash'; import isDashboardEmpty from '../util/isDashboardEmpty'; import { getAffectedOwnDataCharts } from '../util/charts/getOwnDataCharts'; @@ -56,7 +56,7 @@ const propTypes = { charts: PropTypes.objectOf(chartPropShape).isRequired, slices: PropTypes.objectOf(slicePropShape).isRequired, activeFilters: PropTypes.object.isRequired, - chartConfiguration: PropTypes.object.isRequired, + chartConfiguration: PropTypes.object, datasources: PropTypes.object.isRequired, ownDataCharts: PropTypes.object.isRequired, layout: PropTypes.object.isRequired, @@ -97,8 +97,7 @@ class Dashboard extends React.PureComponent { } componentDidMount() { - const appContainer = document.getElementById('app'); - const bootstrapData = appContainer?.getAttribute('data-bootstrap') || '{}'; + const bootstrapData = getBootstrapData(); const { dashboardState, layout } = this.props; const eventData = { is_soft_navigation: Logger.timeOriginOffset > 0, diff --git a/superset-frontend/src/dashboard/components/Dashboard.test.jsx b/superset-frontend/src/dashboard/components/Dashboard.test.jsx index a881d0cdadf9..56a696f91314 100644 --- a/superset-frontend/src/dashboard/components/Dashboard.test.jsx +++ b/superset-frontend/src/dashboard/components/Dashboard.test.jsx @@ -31,7 +31,6 @@ import datasources from 'spec/fixtures/mockDatasource'; import { extraFormData, NATIVE_FILTER_ID, - layoutForSingleNativeFilter, singleNativeFiltersState, dataMaskWith1Filter, } from 'spec/fixtures/mockNativeFilters'; @@ -157,7 +156,7 @@ describe('Dashboard', () => { ...getAllActiveFilters({ dataMask: dataMaskWith1Filter, nativeFilters: singleNativeFiltersState.filters, - layout: layoutForSingleNativeFilter, + allSliceIds: [227, 229, 230], }), }, }); diff --git a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.test.jsx b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.test.jsx deleted file mode 100644 index 937012a9f8be..000000000000 --- a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.test.jsx +++ /dev/null @@ -1,196 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { Provider } from 'react-redux'; -import React from 'react'; -import { mount } from 'enzyme'; -import sinon from 'sinon'; -import fetchMock from 'fetch-mock'; -import { ParentSize } from '@vx/responsive'; -import { supersetTheme, ThemeProvider } from '@superset-ui/core'; -import Tabs from 'src/components/Tabs'; -import { DndProvider } from 'react-dnd'; -import { HTML5Backend } from 'react-dnd-html5-backend'; -import BuilderComponentPane from 'src/dashboard/components/BuilderComponentPane'; -import DashboardBuilder from 'src/dashboard/components/DashboardBuilder/DashboardBuilder'; -import DashboardComponent from 'src/dashboard/containers/DashboardComponent'; -import DashboardHeader from 'src/dashboard/containers/DashboardHeader'; -import DashboardGrid from 'src/dashboard/containers/DashboardGrid'; -import * as dashboardStateActions from 'src/dashboard/actions/dashboardState'; -import { - dashboardLayout as undoableDashboardLayout, - dashboardLayoutWithTabs as undoableDashboardLayoutWithTabs, -} from 'spec/fixtures/mockDashboardLayout'; -import { mockStoreWithTabs, storeWithState } from 'spec/fixtures/mockStore'; -import mockState from 'spec/fixtures/mockState'; -import { - DASHBOARD_ROOT_ID, - DASHBOARD_GRID_ID, -} from 'src/dashboard/util/constants'; - -fetchMock.get('glob:*/csstemplateasyncmodelview/api/read', {}); - -jest.mock('src/dashboard/actions/dashboardState'); - -describe('DashboardBuilder', () => { - let favStarStub; - let activeTabsStub; - - beforeAll(() => { - // this is invoked on mount, so we stub it instead of making a request - favStarStub = sinon - .stub(dashboardStateActions, 'fetchFaveStar') - .returns({ type: 'mock-action' }); - activeTabsStub = sinon - .stub(dashboardStateActions, 'setActiveTabs') - .returns({ type: 'mock-action' }); - }); - - afterAll(() => { - favStarStub.restore(); - activeTabsStub.restore(); - }); - - function setup(overrideState = {}, overrideStore) { - const store = - overrideStore ?? - storeWithState({ - ...mockState, - dashboardLayout: undoableDashboardLayout, - ...overrideState, - }); - return mount( - <Provider store={store}> - <DndProvider backend={HTML5Backend}> - <DashboardBuilder /> - </DndProvider> - </Provider>, - { - wrappingComponent: ThemeProvider, - wrappingComponentProps: { theme: supersetTheme }, - }, - ); - } - - it('should render a StickyContainer with class "dashboard"', () => { - const wrapper = setup(); - const stickyContainer = wrapper.find('[data-test="dashboard-content"]'); - expect(stickyContainer).toHaveLength(1); - expect(stickyContainer.prop('className')).toBe('dashboard'); - }); - - it('should add the "dashboard--editing" class if editMode=true', () => { - const wrapper = setup({ dashboardState: { editMode: true } }); - const stickyContainer = wrapper.find('[data-test="dashboard-content"]'); - expect(stickyContainer.prop('className')).toBe( - 'dashboard dashboard--editing', - ); - }); - - it('should render a DragDroppable DashboardHeader', () => { - const wrapper = setup(); - expect(wrapper.find(DashboardHeader)).toExist(); - }); - - it('should render a Sticky top-level Tabs if the dashboard has tabs', () => { - const wrapper = setup( - { dashboardLayout: undoableDashboardLayoutWithTabs }, - mockStoreWithTabs, - ); - - const sticky = wrapper.find('[data-test="top-level-tabs"]'); - const dashboardComponent = sticky.find(DashboardComponent); - - const tabChildren = - undoableDashboardLayoutWithTabs.present.TABS_ID.children; - expect(dashboardComponent).toHaveLength(1 + tabChildren.length); // tab + tabs - expect(dashboardComponent.at(0).prop('id')).toBe('TABS_ID'); - tabChildren.forEach((tabId, i) => { - expect(dashboardComponent.at(i + 1).prop('id')).toBe(tabId); - }); - }); - - it('should render one Tabs and two TabPane', () => { - const wrapper = setup({ dashboardLayout: undoableDashboardLayoutWithTabs }); - const parentSize = wrapper.find(ParentSize); - expect(parentSize.find(Tabs)).toHaveLength(1); - expect(parentSize.find(Tabs.TabPane)).toHaveLength(2); - }); - - it('should render a TabPane and DashboardGrid for first Tab', () => { - const wrapper = setup({ dashboardLayout: undoableDashboardLayoutWithTabs }); - const parentSize = wrapper.find(ParentSize); - const expectedCount = - undoableDashboardLayoutWithTabs.present.TABS_ID.children.length; - expect(parentSize.find(Tabs.TabPane)).toHaveLength(expectedCount); - expect( - parentSize.find(Tabs.TabPane).first().find(DashboardGrid), - ).toHaveLength(1); - }); - - it('should render a TabPane and DashboardGrid for second Tab', () => { - const wrapper = setup({ - dashboardLayout: undoableDashboardLayoutWithTabs, - dashboardState: { - ...mockState, - directPathToChild: [DASHBOARD_ROOT_ID, 'TABS_ID', 'TAB_ID2'], - }, - }); - const parentSize = wrapper.find(ParentSize); - const expectedCount = - undoableDashboardLayoutWithTabs.present.TABS_ID.children.length; - expect(parentSize.find(Tabs.TabPane)).toHaveLength(expectedCount); - expect( - parentSize.find(Tabs.TabPane).at(1).find(DashboardGrid), - ).toHaveLength(1); - }); - - it('should render a BuilderComponentPane if editMode=false and user selects "Insert Components" pane', () => { - const wrapper = setup(); - expect(wrapper.find(BuilderComponentPane)).not.toExist(); - }); - - it('should render a BuilderComponentPane if editMode=true and user selects "Insert Components" pane', () => { - const wrapper = setup({ dashboardState: { editMode: true } }); - expect(wrapper.find(BuilderComponentPane)).toExist(); - }); - - it('should change redux state if a top-level Tab is clicked', () => { - dashboardStateActions.setDirectPathToChild = jest.fn(arg0 => ({ - type: 'type', - arg0, - })); - const wrapper = setup({ - ...mockStoreWithTabs, - dashboardLayout: undoableDashboardLayoutWithTabs, - }); - - expect(wrapper.find(Tabs).at(1).prop('activeKey')).toBe(DASHBOARD_GRID_ID); - - wrapper - .find('.dashboard-component-tabs .ant-tabs .ant-tabs-tab') - .at(1) - .simulate('click'); - - expect(dashboardStateActions.setDirectPathToChild).toHaveBeenCalledWith([ - 'ROOT_ID', - 'TABS_ID', - 'TAB_ID2', - ]); - }); -}); diff --git a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.test.tsx b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.test.tsx new file mode 100644 index 000000000000..fc651e52b706 --- /dev/null +++ b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.test.tsx @@ -0,0 +1,291 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { Store } from 'redux'; +import React from 'react'; +import fetchMock from 'fetch-mock'; +import { render } from 'spec/helpers/testing-library'; +import { fireEvent, within } from '@testing-library/react'; +import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; +import DashboardBuilder from 'src/dashboard/components/DashboardBuilder/DashboardBuilder'; +import useStoredSidebarWidth from 'src/components/ResizableSidebar/useStoredSidebarWidth'; +import { + fetchFaveStar, + setActiveTabs, + setDirectPathToChild, +} from 'src/dashboard/actions/dashboardState'; +import { + dashboardLayout as undoableDashboardLayout, + dashboardLayoutWithTabs as undoableDashboardLayoutWithTabs, +} from 'spec/fixtures/mockDashboardLayout'; +import { mockStoreWithTabs, storeWithState } from 'spec/fixtures/mockStore'; +import mockState from 'spec/fixtures/mockState'; +import { DASHBOARD_ROOT_ID } from 'src/dashboard/util/constants'; + +fetchMock.get('glob:*/csstemplateasyncmodelview/api/read', {}); + +jest.mock('src/dashboard/actions/dashboardState', () => ({ + ...jest.requireActual('src/dashboard/actions/dashboardState'), + fetchFaveStar: jest.fn(), + setActiveTabs: jest.fn(), + setDirectPathToChild: jest.fn(), +})); +jest.mock('src/featureFlags'); +jest.mock('src/components/ResizableSidebar/useStoredSidebarWidth'); + +// mock following dependant components to fix the prop warnings +jest.mock('src/components/DeprecatedSelect/WindowedSelect', () => () => ( + <div data-test="mock-windowed-select" /> +)); +jest.mock('src/components/DeprecatedSelect', () => () => ( + <div data-test="mock-deprecated-select" /> +)); +jest.mock('src/components/Select/Select', () => () => ( + <div data-test="mock-select" /> +)); +jest.mock('src/components/Select/AsyncSelect', () => () => ( + <div data-test="mock-async-select" /> +)); +jest.mock('src/dashboard/components/Header/HeaderActionsDropdown', () => () => ( + <div data-test="mock-header-actions-dropdown" /> +)); +jest.mock('src/components/PageHeaderWithActions', () => ({ + PageHeaderWithActions: () => ( + <div data-test="mock-page-header-with-actions" /> + ), +})); +jest.mock( + 'src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal', + () => () => <div data-test="mock-filters-config-modal" />, +); +jest.mock('src/dashboard/components/BuilderComponentPane', () => () => ( + <div data-test="mock-builder-component-pane" /> +)); +jest.mock('src/dashboard/components/nativeFilters/FilterBar', () => () => ( + <div data-test="mock-filter-bar" /> +)); +jest.mock('src/dashboard/containers/DashboardGrid', () => () => ( + <div data-test="mock-dashboard-grid" /> +)); + +describe('DashboardBuilder', () => { + let favStarStub: jest.Mock; + let activeTabsStub: jest.Mock; + + beforeAll(() => { + // this is invoked on mount, so we stub it instead of making a request + favStarStub = (fetchFaveStar as jest.Mock).mockReturnValue({ + type: 'mock-action', + }); + activeTabsStub = (setActiveTabs as jest.Mock).mockReturnValue({ + type: 'mock-action', + }); + (useStoredSidebarWidth as jest.Mock).mockImplementation(() => [ + 100, + jest.fn(), + ]); + (isFeatureEnabled as jest.Mock).mockImplementation(() => false); + }); + + afterAll(() => { + favStarStub.mockReset(); + activeTabsStub.mockReset(); + (useStoredSidebarWidth as jest.Mock).mockReset(); + }); + + function setup(overrideState = {}, overrideStore?: Store) { + return render(<DashboardBuilder />, { + useRedux: true, + store: storeWithState({ + ...mockState, + dashboardLayout: undoableDashboardLayout, + ...overrideState, + }), + useDnd: true, + }); + } + + it('should render a StickyContainer with class "dashboard"', () => { + const { getByTestId } = setup(); + const stickyContainer = getByTestId('dashboard-content-wrapper'); + expect(stickyContainer).toHaveClass('dashboard'); + }); + + it('should add the "dashboard--editing" class if editMode=true', () => { + const { getByTestId } = setup({ + dashboardState: { ...mockState.dashboardState, editMode: true }, + }); + const stickyContainer = getByTestId('dashboard-content-wrapper'); + expect(stickyContainer).toHaveClass('dashboard dashboard--editing'); + }); + + it('should render a DragDroppable DashboardHeader', () => { + const { queryByTestId } = setup(); + const header = queryByTestId('dashboard-header-container'); + expect(header).toBeTruthy(); + }); + + it('should render a Sticky top-level Tabs if the dashboard has tabs', async () => { + const { findAllByTestId } = setup( + { dashboardLayout: undoableDashboardLayoutWithTabs }, + mockStoreWithTabs, + ); + const sticky = await findAllByTestId('nav-list'); + + expect(sticky.length).toBe(1); + expect(sticky[0]).toHaveAttribute('id', 'TABS_ID'); + + const dashboardTabComponents = within(sticky[0]).getAllByRole('tab'); + const tabChildren = + undoableDashboardLayoutWithTabs.present.TABS_ID.children; + expect(dashboardTabComponents.length).toBe(tabChildren.length); + tabChildren.forEach((tabId, i) => { + const idMatcher = new RegExp(`${tabId}$`); + expect(dashboardTabComponents[i]).toHaveAttribute( + 'id', + expect.stringMatching(idMatcher), + ); + }); + }); + + it('should render one Tabs and two TabPane', async () => { + const { findAllByRole } = setup({ + dashboardLayout: undoableDashboardLayoutWithTabs, + }); + const tabs = await findAllByRole('tablist'); + expect(tabs.length).toBe(1); + const tabPanels = await findAllByRole('tabpanel'); + expect(tabPanels.length).toBe(2); + }); + + it('should render a TabPane and DashboardGrid for first Tab', async () => { + const { findByTestId } = setup({ + dashboardLayout: undoableDashboardLayoutWithTabs, + }); + const parentSize = await findByTestId('grid-container'); + const expectedCount = + undoableDashboardLayoutWithTabs.present.TABS_ID.children.length; + const tabPanels = within(parentSize).getAllByRole('tabpanel', { + // to include invisiable tab panels + hidden: true, + }); + expect(tabPanels.length).toBe(expectedCount); + expect( + within(tabPanels[0]).getAllByTestId('mock-dashboard-grid').length, + ).toBe(1); + }); + + it('should render a TabPane and DashboardGrid for second Tab', async () => { + const { findByTestId } = setup({ + dashboardLayout: undoableDashboardLayoutWithTabs, + dashboardState: { + ...mockState.dashboardState, + directPathToChild: [DASHBOARD_ROOT_ID, 'TABS_ID', 'TAB_ID2'], + }, + }); + const parentSize = await findByTestId('grid-container'); + const expectedCount = + undoableDashboardLayoutWithTabs.present.TABS_ID.children.length; + const tabPanels = within(parentSize).getAllByRole('tabpanel', { + // to include invisiable tab panels + hidden: true, + }); + expect(tabPanels.length).toBe(expectedCount); + expect( + within(tabPanels[1]).getAllByTestId('mock-dashboard-grid').length, + ).toBe(1); + }); + + it('should render a BuilderComponentPane if editMode=false and user selects "Insert Components" pane', () => { + const { queryAllByTestId } = setup(); + const builderComponents = queryAllByTestId('mock-builder-component-pane'); + expect(builderComponents.length).toBe(0); + }); + + it('should render a BuilderComponentPane if editMode=true and user selects "Insert Components" pane', () => { + const { queryAllByTestId } = setup({ dashboardState: { editMode: true } }); + const builderComponents = queryAllByTestId('mock-builder-component-pane'); + expect(builderComponents.length).toBeGreaterThanOrEqual(1); + }); + + it('should change redux state if a top-level Tab is clicked', async () => { + (setDirectPathToChild as jest.Mock).mockImplementation(arg0 => ({ + type: 'type', + arg0, + })); + const { findByRole } = setup( + { + dashboardLayout: undoableDashboardLayoutWithTabs, + }, + mockStoreWithTabs, + ); + const tabList = await findByRole('tablist'); + const tabs = within(tabList).getAllByRole('tab'); + expect(setDirectPathToChild).toHaveBeenCalledTimes(0); + fireEvent.click(tabs[1]); + expect(setDirectPathToChild).toHaveBeenCalledWith([ + 'ROOT_ID', + 'TABS_ID', + 'TAB_ID2', + ]); + (setDirectPathToChild as jest.Mock).mockReset(); + }); + + it('should not display a loading spinner when saving is not in progress', () => { + const { queryByAltText } = setup(); + + expect(queryByAltText('Loading...')).not.toBeInTheDocument(); + }); + + it('should display a loading spinner when saving is in progress', async () => { + const { findByAltText } = setup({ + dashboardState: { dashboardIsSaving: true }, + }); + + expect(await findByAltText('Loading...')).toBeVisible(); + }); + + describe('when nativeFiltersEnabled', () => { + beforeEach(() => { + (isFeatureEnabled as jest.Mock).mockImplementation( + flag => flag === FeatureFlag.DASHBOARD_NATIVE_FILTERS, + ); + }); + afterEach(() => { + (isFeatureEnabled as jest.Mock).mockReset(); + }); + + it('should set FilterBar width by useStoredSidebarWidth', () => { + const expectedValue = 200; + const setter = jest.fn(); + (useStoredSidebarWidth as jest.Mock).mockImplementation(() => [ + expectedValue, + setter, + ]); + const { getByTestId } = setup({ + dashboardInfo: { + ...mockState.dashboardInfo, + dash_edit_perm: true, + metadata: { show_native_filters: true }, + }, + }); + const filterbar = getByTestId('dashboard-filters-panel'); + expect(filterbar).toHaveStyleRule('width', `${expectedValue}px`); + }); + }); +}); diff --git a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx index 8352482ed8ab..f07fdb9c066c 100644 --- a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx +++ b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx @@ -22,11 +22,18 @@ import React, { FC, useCallback, useEffect, - useState, useMemo, useRef, + useState, } from 'react'; -import { JsonObject, styled, css, t } from '@superset-ui/core'; +import { + addAlpha, + css, + JsonObject, + styled, + t, + useTheme, +} from '@superset-ui/core'; import { Global } from '@emotion/react'; import { useDispatch, useSelector } from 'react-redux'; import ErrorBoundary from 'src/components/ErrorBoundary'; @@ -40,7 +47,11 @@ import WithPopoverMenu from 'src/dashboard/components/menu/WithPopoverMenu'; import getDirectPathToTabIndex from 'src/dashboard/util/getDirectPathToTabIndex'; import { URL_PARAMS } from 'src/constants'; import { getUrlParam } from 'src/utils/urlUtils'; -import { DashboardLayout, RootState } from 'src/dashboard/types'; +import { + DashboardLayout, + FilterBarOrientation, + RootState, +} from 'src/dashboard/types'; import { setDirectPathToChild, setEditMode, @@ -53,82 +64,99 @@ import { } from 'src/dashboard/actions/dashboardLayout'; import { DASHBOARD_GRID_ID, - DASHBOARD_ROOT_ID, DASHBOARD_ROOT_DEPTH, + DASHBOARD_ROOT_ID, DashboardStandaloneMode, } from 'src/dashboard/util/constants'; import FilterBar from 'src/dashboard/components/nativeFilters/FilterBar'; import Loading from 'src/components/Loading'; import { EmptyStateBig } from 'src/components/EmptyState'; import { useUiConfig } from 'src/components/UiConfigContext'; +import ResizableSidebar from 'src/components/ResizableSidebar'; import { BUILDER_SIDEPANEL_WIDTH, CLOSED_FILTER_BAR_WIDTH, FILTER_BAR_HEADER_HEIGHT, FILTER_BAR_TABS_HEIGHT, MAIN_HEADER_HEIGHT, + OPEN_FILTER_BAR_MAX_WIDTH, OPEN_FILTER_BAR_WIDTH, } from 'src/dashboard/constants'; -import { shouldFocusTabs, getRootLevelTabsComponent } from './utils'; +import { getRootLevelTabsComponent, shouldFocusTabs } from './utils'; import DashboardContainer from './DashboardContainer'; import { useNativeFilters } from './state'; type DashboardBuilderProps = {}; const StyledDiv = styled.div` - display: grid; - grid-template-columns: auto 1fr; - grid-template-rows: auto 1fr; - flex: 1; - /* Special cases */ - - /* A row within a column has inset hover menu */ - .dragdroppable-column .dragdroppable-row .hover-menu--left { - left: -12px; - background: ${({ theme }) => theme.colors.grayscale.light5}; - border: 1px solid ${({ theme }) => theme.colors.grayscale.light2}; - } - - .dashboard-component-tabs { - position: relative; - } - - /* A column within a column or tabs has inset hover menu */ - .dragdroppable-column .dragdroppable-column .hover-menu--top, - .dashboard-component-tabs .dragdroppable-column .hover-menu--top { - top: -12px; - background: ${({ theme }) => theme.colors.grayscale.light5}; - border: 1px solid ${({ theme }) => theme.colors.grayscale.light2}; - } - - /* move Tabs hover menu to top near actual Tabs */ - .dashboard-component-tabs > .hover-menu-container > .hover-menu--left { - top: 0; - transform: unset; - background: transparent; - } - - /* push Chart actions to upper right */ - .dragdroppable-column .dashboard-component-chart-holder .hover-menu--top, - .dragdroppable .dashboard-component-header .hover-menu--top { - right: 8px; - top: 8px; - background: transparent; - border: none; - transform: unset; - left: unset; - } - div:hover > .hover-menu-container .hover-menu, - .hover-menu-container .hover-menu:hover { - opacity: 1; - } + ${({ theme }) => css` + display: grid; + grid-template-columns: auto 1fr; + grid-template-rows: auto 1fr; + flex: 1; + /* Special cases */ + + /* A row within a column has inset hover menu */ + .dragdroppable-column .dragdroppable-row .hover-menu--left { + left: ${theme.gridUnit * -3}px; + background: ${theme.colors.grayscale.light5}; + border: 1px solid ${theme.colors.grayscale.light2}; + } + + .dashboard-component-tabs { + position: relative; + } + + /* A column within a column or tabs has inset hover menu */ + .dragdroppable-column .dragdroppable-column .hover-menu--top, + .dashboard-component-tabs .dragdroppable-column .hover-menu--top { + top: ${theme.gridUnit * -3}px; + background: ${theme.colors.grayscale.light5}; + border: 1px solid ${theme.colors.grayscale.light2}; + } + + /* move Tabs hover menu to top near actual Tabs */ + .dashboard-component-tabs > .hover-menu-container > .hover-menu--left { + top: 0; + transform: unset; + background: transparent; + } + + /* push Chart actions to upper right */ + .dragdroppable-column .dashboard-component-chart-holder .hover-menu--top, + .dragdroppable .dashboard-component-header .hover-menu--top { + right: ${theme.gridUnit * 2}px; + top: ${theme.gridUnit * 2}px; + background: transparent; + border: none; + transform: unset; + left: unset; + } + div:hover > .hover-menu-container .hover-menu, + .hover-menu-container .hover-menu:hover { + opacity: 1; + } + + p { + margin: 0 0 ${theme.gridUnit * 2}px 0; + } + + i.danger { + color: ${theme.colors.error.base}; + } + + i.warning { + color: ${theme.colors.alert.base}; + } + `} `; // @z-index-above-dashboard-charts + 1 = 11 -const FiltersPanel = styled.div` +const FiltersPanel = styled.div<{ width: number }>` grid-column: 1; grid-row: 1 / span 2; z-index: 11; + width: ${({ width }) => width}px; `; const StickyPanel = styled.div<{ width: number }>` @@ -145,6 +173,7 @@ const StyledHeader = styled.div` position: sticky; top: 0; z-index: 100; + max-width: 100vw; `; const StyledContent = styled.div<{ @@ -156,69 +185,251 @@ const StyledContent = styled.div<{ ${({ fullSizeChartId }) => fullSizeChartId && `z-index: 101;`} `; +const DashboardContentWrapper = styled.div` + ${({ theme }) => css` + &.dashboard { + position: relative; + flex-grow: 1; + display: flex; + flex-direction: column; + height: 100%; + + /* drop shadow for top-level tabs only */ + & .dashboard-component-tabs { + box-shadow: 0 ${theme.gridUnit}px ${theme.gridUnit}px 0 + ${addAlpha( + theme.colors.grayscale.dark2, + parseFloat(theme.opacity.light) / 100, + )}; + padding-left: ${theme.gridUnit * + 2}px; /* note this is added to tab-level padding, to match header */ + } + + .dropdown-toggle.btn.btn-primary .caret { + color: ${theme.colors.grayscale.light5}; + } + + .background--transparent { + background-color: transparent; + } + + .background--white { + background-color: ${theme.colors.grayscale.light5}; + } + } + &.dashboard--editing { + .grid-row:after, + .dashboard-component-tabs > .hover-menu:hover + div:after { + border: 1px dashed transparent; + content: ''; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 1; + pointer-events: none; + } + + .resizable-container { + & .dashboard-component-chart-holder { + .dashboard-chart { + .chart-container { + cursor: move; + opacity: 0.2; + } + + .slice_container { + /* disable chart interactions in edit mode */ + pointer-events: none; + } + } + + &:hover .dashboard-chart .chart-container { + opacity: 0.7; + } + } + + &:hover, + &.resizable-container--resizing:hover { + & > .dashboard-component-chart-holder:after { + border: 1px dashed ${theme.colors.primary.base}; + } + } + } + + .resizable-container--resizing:hover > .grid-row:after, + .hover-menu:hover + .grid-row:after, + .dashboard-component-tabs > .hover-menu:hover + div:after { + border: 1px dashed ${theme.colors.primary.base}; + z-index: 2; + } + + .grid-row:after, + .dashboard-component-tabs > .hover-menu + div:after { + border: 1px dashed ${theme.colors.grayscale.light2}; + } + + /* provide hit area in case row contents is edge to edge */ + .dashboard-component-tabs-content { + .dragdroppable-row { + padding-top: ${theme.gridUnit * 4}px; + } + + & > div:not(:last-child):not(.empty-droptarget) { + margin-bottom: ${theme.gridUnit * 4}px; + } + } + + .dashboard-component-chart-holder { + &:after { + content: ''; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 1; + pointer-events: none; + border: 1px solid transparent; + } + + &:hover:after { + border: 1px dashed ${theme.colors.primary.base}; + z-index: 2; + } + } + + .contract-trigger:before { + display: none; + } + } + + & .dashboard-component-tabs-content { + & > div:not(:last-child):not(.empty-droptarget) { + margin-bottom: ${theme.gridUnit * 4}px; + } + + & > .empty-droptarget { + position: absolute; + width: 100%; + } + + & > .empty-droptarget:first-child { + height: ${theme.gridUnit * 4}px; + top: -2px; + z-index: 10; + } + + & > .empty-droptarget:last-child { + height: ${theme.gridUnit * 3}px; + bottom: 0; + } + } + + .empty-droptarget:first-child .drop-indicator--bottom { + top: ${theme.gridUnit * 6}px; + } + `} +`; + const StyledDashboardContent = styled.div<{ - dashboardFiltersOpen: boolean; editMode: boolean; - nativeFiltersEnabled: boolean; + marginLeft: number; }>` - display: flex; - flex-direction: row; - flex-wrap: nowrap; - height: auto; - flex: 1; - - .grid-container .dashboard-component-tabs { - box-shadow: none; - padding-left: 0; - } - - .grid-container { - /* without this, the grid will not get smaller upon toggling the builder panel on */ - width: 0; + ${({ theme, editMode, marginLeft }) => css` + display: flex; + flex-direction: row; + flex-wrap: nowrap; + height: auto; flex: 1; - position: relative; - margin-top: ${({ theme }) => theme.gridUnit * 6}px; - margin-right: ${({ theme }) => theme.gridUnit * 8}px; - margin-bottom: ${({ theme }) => theme.gridUnit * 6}px; - margin-left: ${({ - theme, - dashboardFiltersOpen, - editMode, - nativeFiltersEnabled, - }) => { - if (!dashboardFiltersOpen && !editMode && nativeFiltersEnabled) { - return 0; - } - return theme.gridUnit * 8; - }}px; - ${({ editMode, theme }) => - editMode && + .grid-container .dashboard-component-tabs { + box-shadow: none; + padding-left: 0; + } + + .grid-container { + /* without this, the grid will not get smaller upon toggling the builder panel on */ + width: 0; + flex: 1; + position: relative; + margin-top: ${theme.gridUnit * 6}px; + margin-right: ${theme.gridUnit * 8}px; + margin-bottom: ${theme.gridUnit * 6}px; + margin-left: ${marginLeft}px; + + ${editMode && ` max-width: calc(100% - ${ BUILDER_SIDEPANEL_WIDTH + theme.gridUnit * 16 }px); `} - } - - .dashboard-builder-sidepane { - width: ${BUILDER_SIDEPANEL_WIDTH}px; - z-index: 1; - } - - .dashboard-component-chart-holder { - // transitionable traits to show filter relevance - transition: opacity ${({ theme }) => theme.transitionTiming}s, - border-color ${({ theme }) => theme.transitionTiming}s, - box-shadow ${({ theme }) => theme.transitionTiming}s; - border: 0 solid transparent; - } + + /* this is the ParentSize wrapper */ + & > div:first-child { + height: inherit !important; + } + } + + .dashboard-builder-sidepane { + width: ${BUILDER_SIDEPANEL_WIDTH}px; + z-index: 1; + } + + .dashboard-component-chart-holder { + width: 100%; + height: 100%; + background-color: ${theme.colors.grayscale.light5}; + position: relative; + padding: ${theme.gridUnit * 4}px; + overflow-y: visible; + + // transitionable traits to show filter relevance + transition: opacity ${theme.transitionTiming}s ease-in-out, + border-color ${theme.transitionTiming}s ease-in-out, + box-shadow ${theme.transitionTiming}s ease-in-out; + + &.fade-in { + border-radius: ${theme.borderRadius}px; + box-shadow: inset 0 0 0 2px ${theme.colors.primary.base}, + 0 0 0 3px + ${addAlpha( + theme.colors.primary.base, + parseFloat(theme.opacity.light) / 100, + )}; + } + + &.fade-out { + border-radius: ${theme.borderRadius}px; + box-shadow: none; + } + + & .missing-chart-container { + display: flex; + flex-direction: column; + align-items: center; + overflow-y: auto; + justify-content: center; + + .missing-chart-body { + font-size: ${theme.typography.sizes.s}px; + position: relative; + display: flex; + } + } + } + `} `; const DashboardBuilder: FC<DashboardBuilderProps> = () => { const dispatch = useDispatch(); const uiConfig = useUiConfig(); + const theme = useTheme(); + const dashboardId = useSelector<RootState, string>( + ({ dashboardInfo }) => `${dashboardInfo.id}`, + ); const dashboardLayout = useSelector<RootState, DashboardLayout>( state => state.dashboardLayout.present, ); @@ -228,12 +439,20 @@ const DashboardBuilder: FC<DashboardBuilderProps> = () => { const canEdit = useSelector<RootState, boolean>( ({ dashboardInfo }) => dashboardInfo.dash_edit_perm, ); - const directPathToChild = useSelector<RootState, string[]>( - state => state.dashboardState.directPathToChild, + const dashboardIsSaving = useSelector<RootState, boolean>( + ({ dashboardState }) => dashboardState.dashboardIsSaving, ); + const nativeFilters = useSelector((state: RootState) => state.nativeFilters); + const focusedFilterId = nativeFilters?.focusedFilterId; const fullSizeChartId = useSelector<RootState, number | null>( state => state.dashboardState.fullSizeChartId, ); + const filterBarOrientation = useSelector<RootState, FilterBarOrientation>( + ({ dashboardInfo }) => + isFeatureEnabled(FeatureFlag.HORIZONTAL_FILTER_BAR) + ? dashboardInfo.filterBarOrientation + : FilterBarOrientation.VERTICAL, + ); const handleChangeTab = useCallback( ({ pathToTabIndex }: { pathToTabIndex: string[] }) => { @@ -270,13 +489,14 @@ const DashboardBuilder: FC<DashboardBuilderProps> = () => { uiConfig.hideTitle || standaloneMode === DashboardStandaloneMode.HIDE_NAV_AND_TITLE || isReport; + const [barTopOffset, setBarTopOffset] = useState(0); useEffect(() => { setBarTopOffset(headerRef.current?.getBoundingClientRect()?.height || 0); let observer: ResizeObserver; - if (typeof global.ResizeObserver !== 'undefined' && headerRef.current) { + if (global.hasOwnProperty('ResizeObserver') && headerRef.current) { observer = new ResizeObserver(entries => { setBarTopOffset( current => entries?.[0]?.contentRect?.height || current, @@ -298,10 +518,6 @@ const DashboardBuilder: FC<DashboardBuilderProps> = () => { nativeFiltersEnabled, } = useNativeFilters(); - const filterBarWidth = dashboardFiltersOpen - ? OPEN_FILTER_BAR_WIDTH - : CLOSED_FILTER_BAR_WIDTH; - const [containerRef, isSticky] = useElementOnScreen<HTMLDivElement>({ threshold: [1], }); @@ -309,6 +525,7 @@ const DashboardBuilder: FC<DashboardBuilderProps> = () => { const filterSetEnabled = isFeatureEnabled( FeatureFlag.DASHBOARD_NATIVE_FILTERS_SET, ); + const showFilterBar = nativeFiltersEnabled && !editMode; const offset = FILTER_BAR_HEADER_HEIGHT + @@ -321,9 +538,19 @@ const DashboardBuilder: FC<DashboardBuilderProps> = () => { const draggableStyle = useMemo( () => ({ marginLeft: - dashboardFiltersOpen || editMode || !nativeFiltersEnabled ? 0 : -32, + dashboardFiltersOpen || + editMode || + !nativeFiltersEnabled || + filterBarOrientation === FilterBarOrientation.HORIZONTAL + ? 0 + : -32, }), - [dashboardFiltersOpen, editMode, nativeFiltersEnabled], + [ + dashboardFiltersOpen, + editMode, + filterBarOrientation, + nativeFiltersEnabled, + ], ); // If a new tab was added, update the directPathToChild to reflect it @@ -351,6 +578,13 @@ const DashboardBuilder: FC<DashboardBuilderProps> = () => { ({ dropIndicatorProps }: { dropIndicatorProps: JsonObject }) => ( <div> {!hideDashboardHeader && <DashboardHeader />} + {showFilterBar && + filterBarOrientation === FilterBarOrientation.HORIZONTAL && ( + <FilterBar + focusedFilterId={focusedFilterId} + orientation={FilterBarOrientation.HORIZONTAL} + /> + )} {dropIndicatorProps && <div {...dropIndicatorProps} />} {!isReport && topLevelTabs && !uiConfig.hideNav && ( <WithPopoverMenu @@ -358,7 +592,7 @@ const DashboardBuilder: FC<DashboardBuilderProps> = () => { menuItems={[ <IconButton icon={<Icons.FallOutlined iconSize="xl" />} - label="Collapse tab content" + label={t('Collapse tab content')} onClick={handleDeleteTopLevelTabs} />, ]} @@ -379,6 +613,9 @@ const DashboardBuilder: FC<DashboardBuilderProps> = () => { </div> ), [ + focusedFilterId, + nativeFiltersEnabled, + filterBarOrientation, editMode, handleChangeTab, handleDeleteTopLevelTabs, @@ -389,23 +626,56 @@ const DashboardBuilder: FC<DashboardBuilderProps> = () => { ], ); + const dashboardContentMarginLeft = + !dashboardFiltersOpen && + !editMode && + nativeFiltersEnabled && + filterBarOrientation !== FilterBarOrientation.HORIZONTAL + ? 0 + : theme.gridUnit * 8; + return ( <StyledDiv> - {nativeFiltersEnabled && !editMode && ( - <FiltersPanel> - <StickyPanel ref={containerRef} width={filterBarWidth}> - <ErrorBoundary> - <FilterBar - filtersOpen={dashboardFiltersOpen} - toggleFiltersBar={toggleDashboardFiltersOpen} - directPathToChild={directPathToChild} - width={filterBarWidth} - height={filterBarHeight} - offset={filterBarOffset} - /> - </ErrorBoundary> - </StickyPanel> - </FiltersPanel> + {showFilterBar && filterBarOrientation === FilterBarOrientation.VERTICAL && ( + <> + <ResizableSidebar + id={`dashboard:${dashboardId}`} + enable={dashboardFiltersOpen} + minWidth={OPEN_FILTER_BAR_WIDTH} + maxWidth={OPEN_FILTER_BAR_MAX_WIDTH} + initialWidth={OPEN_FILTER_BAR_WIDTH} + > + {adjustedWidth => { + const filterBarWidth = dashboardFiltersOpen + ? adjustedWidth + : CLOSED_FILTER_BAR_WIDTH; + return ( + <FiltersPanel + width={filterBarWidth} + data-test="dashboard-filters-panel" + > + <StickyPanel ref={containerRef} width={filterBarWidth}> + <ErrorBoundary> + {!isReport && ( + <FilterBar + focusedFilterId={focusedFilterId} + orientation={FilterBarOrientation.VERTICAL} + verticalConfig={{ + filtersOpen: dashboardFiltersOpen, + toggleFiltersBar: toggleDashboardFiltersOpen, + width: filterBarWidth, + height: filterBarHeight, + offset: filterBarOffset, + }} + /> + )} + </ErrorBoundary> + </StickyPanel> + </FiltersPanel> + ); + }} + </ResizableSidebar> + </> )} <StyledHeader ref={headerRef}> {/* @ts-ignore */} @@ -449,30 +719,33 @@ const DashboardBuilder: FC<DashboardBuilderProps> = () => { image="dashboard.svg" /> )} - <div - data-test="dashboard-content" + <DashboardContentWrapper + data-test="dashboard-content-wrapper" className={cx('dashboard', editMode && 'dashboard--editing')} > <StyledDashboardContent className="dashboard-content" - dashboardFiltersOpen={dashboardFiltersOpen} editMode={editMode} - nativeFiltersEnabled={nativeFiltersEnabled} + marginLeft={dashboardContentMarginLeft} > {showDashboard ? ( <DashboardContainer topLevelTabs={topLevelTabs} /> ) : ( <Loading /> )} - {editMode && ( - <BuilderComponentPane - isStandalone={!!standaloneMode} - topOffset={barTopOffset} - /> - )} + {editMode && <BuilderComponentPane topOffset={barTopOffset} />} </StyledDashboardContent> - </div> + </DashboardContentWrapper> </StyledContent> + {dashboardIsSaving && ( + <Loading + css={css` + && { + position: fixed; + } + `} + /> + )} </StyledDiv> ); }; diff --git a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardContainer.tsx b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardContainer.tsx index c763f07267f5..386d96266a09 100644 --- a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardContainer.tsx +++ b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardContainer.tsx @@ -18,20 +18,23 @@ */ // ParentSize uses resize observer so the dashboard will update size // when its container size changes, due to e.g., builder side panel opening -import React, { FC, useEffect, useMemo } from 'react'; +import React, { FC, useCallback, useEffect, useMemo } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { FeatureFlag, Filter, Filters, + getCategoricalSchemeRegistry, isFeatureEnabled, + SupersetClient, } from '@superset-ui/core'; -import { ParentSize } from '@vx/responsive'; +import { ParentSize } from '@visx/responsive'; import pick from 'lodash/pick'; import Tabs from 'src/components/Tabs'; import DashboardGrid from 'src/dashboard/containers/DashboardGrid'; import { ChartsState, + DashboardInfo, DashboardLayout, LayoutItem, RootState, @@ -43,9 +46,13 @@ import { import { getChartIdsInFilterScope } from 'src/dashboard/util/getChartIdsInFilterScope'; import findTabIndexByComponentId from 'src/dashboard/util/findTabIndexByComponentId'; import { setInScopeStatusOfFilters } from 'src/dashboard/actions/nativeFilters'; -import { getRootLevelTabIndex, getRootLevelTabsComponent } from './utils'; -import { findTabsWithChartsInScope } from '../nativeFilters/utils'; +import { dashboardInfoChanged } from 'src/dashboard/actions/dashboardInfo'; +import { setColorScheme } from 'src/dashboard/actions/dashboardState'; +import { useComponentDidUpdate } from 'src/hooks/useComponentDidUpdate/useComponentDidUpdate'; +import jsonStringify from 'json-stringify-pretty-compact'; import { NATIVE_FILTER_DIVIDER_PREFIX } from '../nativeFilters/FiltersConfigModal/utils'; +import { findTabsWithChartsInScope } from '../nativeFilters/utils'; +import { getRootLevelTabIndex, getRootLevelTabsComponent } from './utils'; type DashboardContainerProps = { topLevelTabs?: LayoutItem; @@ -73,6 +80,9 @@ const DashboardContainer: FC<DashboardContainerProps> = ({ topLevelTabs }) => { const dashboardLayout = useSelector<RootState, DashboardLayout>( state => state.dashboardLayout.present, ); + const dashboardInfo = useSelector<RootState, DashboardInfo>( + state => state.dashboardInfo, + ); const directPathToChild = useSelector<RootState, string[]>( state => state.dashboardState.directPathToChild, ); @@ -122,10 +132,88 @@ const DashboardContainer: FC<DashboardContainerProps> = ({ topLevelTabs }) => { dispatch(setInScopeStatusOfFilters(scopes)); }, [nativeFilterScopes, dashboardLayout, dispatch]); + const verifyUpdateColorScheme = useCallback(() => { + const currentMetadata = dashboardInfo.metadata; + if (currentMetadata?.color_scheme) { + const metadata = { ...currentMetadata }; + const colorScheme = metadata?.color_scheme; + const colorSchemeDomain = metadata?.color_scheme_domain || []; + const categoricalSchemes = getCategoricalSchemeRegistry(); + const registryColorScheme = + categoricalSchemes.get(colorScheme, true) || undefined; + const registryColorSchemeDomain = registryColorScheme?.colors || []; + const defaultColorScheme = categoricalSchemes.defaultKey; + const colorSchemeExists = !!registryColorScheme; + + const updateDashboardData = () => { + SupersetClient.put({ + endpoint: `/api/v1/dashboard/${dashboardInfo.id}`, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + json_metadata: jsonStringify(metadata), + }), + }).catch(e => console.log(e)); + }; + const updateColorScheme = (scheme: string) => { + dispatch(setColorScheme(scheme)); + }; + const updateDashboard = () => { + dispatch( + dashboardInfoChanged({ + metadata, + }), + ); + updateDashboardData(); + }; + // selected color scheme does not exist anymore + // must fallback to the available default one + if (!colorSchemeExists) { + const updatedScheme = + defaultColorScheme?.toString() || 'supersetColors'; + metadata.color_scheme = updatedScheme; + metadata.color_scheme_domain = + categoricalSchemes.get(defaultColorScheme)?.colors || []; + + // reset shared_label_colors + // TODO: Requires regenerating the shared_label_colors after + // fixing a bug which affects their generation on dashboards with tabs + metadata.shared_label_colors = {}; + + updateColorScheme(updatedScheme); + updateDashboard(); + } else { + // if this dashboard does not have a color_scheme_domain saved + // must create one and store it for the first time + if (colorSchemeExists && !colorSchemeDomain.length) { + metadata.color_scheme_domain = registryColorSchemeDomain; + updateDashboard(); + } + // if the color_scheme_domain is not the same as the registry domain + // must update the existing color_scheme_domain + if ( + colorSchemeExists && + colorSchemeDomain.length && + registryColorSchemeDomain.toString() !== colorSchemeDomain.toString() + ) { + metadata.color_scheme_domain = registryColorSchemeDomain; + + // reset shared_label_colors + // TODO: Requires regenerating the shared_label_colors after + // fixing a bug which affects their generation on dashboards with tabs + metadata.shared_label_colors = {}; + + updateColorScheme(colorScheme); + updateDashboard(); + } + } + } + }, [charts]); + + useComponentDidUpdate(verifyUpdateColorScheme); + const childIds: string[] = topLevelTabs ? topLevelTabs.children : [DASHBOARD_GRID_ID]; - const min = Math.min(tabIndex, childIds.length - 1); const activeKey = min === 0 ? DASHBOARD_GRID_ID : min.toString(); diff --git a/superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx b/superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx index a2c44f490243..8d7702edd4d3 100644 --- a/superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx +++ b/superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx @@ -22,7 +22,7 @@ import { styled, SupersetApiError, t, - getUiOverrideRegistry, + getExtensionsRegistry, } from '@superset-ui/core'; import { InfoTooltipWithTrigger } from '@superset-ui/chart-controls'; import Modal from 'src/components/Modal'; @@ -33,7 +33,7 @@ import { useToasts } from 'src/components/MessageToasts/withToasts'; import { FormItem } from 'src/components/Form'; import { EmbeddedDashboard } from '../types'; -const uiOverrideRegistry = getUiOverrideRegistry(); +const extensionsRegistry = getExtensionsRegistry(); type Props = { dashboardId: string; @@ -148,30 +148,37 @@ export const DashboardEmbedControls = ({ dashboardId, onHide }: Props) => { return <Loading />; } - const docsDescription = uiOverrideRegistry.get( + const DocsConfigDetails = extensionsRegistry.get( + 'embedded.documentation.configuration_details', + ); + const docsDescription = extensionsRegistry.get( 'embedded.documentation.description', ); const docsUrl = - uiOverrideRegistry.get('embedded.documentation.url') ?? + extensionsRegistry.get('embedded.documentation.url') ?? 'https://www.npmjs.com/package/@superset-ui/embedded-sdk'; return ( <> - <p> - {embedded ? ( - <> + {embedded ? ( + DocsConfigDetails ? ( + <DocsConfigDetails embeddedId={embedded.uuid} /> + ) : ( + <p> {t( 'This dashboard is ready to embed. In your application, pass the following id to the SDK:', )} <br /> <code>{embedded.uuid}</code> - </> - ) : ( - t( + </p> + ) + ) : ( + <p> + {t( 'Configure this dashboard to embed it into an external web application.', - ) - )} - </p> + )} + </p> + )} <p> {t('For further instructions, consult the')}{' '} <a href={docsUrl} target="_blank" rel="noreferrer"> @@ -180,7 +187,7 @@ export const DashboardEmbedControls = ({ dashboardId, onHide }: Props) => { : t('Superset Embedded SDK documentation.')} </a> </p> - <h3>Settings</h3> + <h3>{t('Settings')}</h3> <FormItem> <label htmlFor="allowed-domains"> {t('Allowed Domains (comma separated)')}{' '} diff --git a/superset-frontend/src/dashboard/components/DashboardGrid.jsx b/superset-frontend/src/dashboard/components/DashboardGrid.jsx index 72f86fff3210..601dbac4a4cd 100644 --- a/superset-frontend/src/dashboard/components/DashboardGrid.jsx +++ b/superset-frontend/src/dashboard/components/DashboardGrid.jsx @@ -18,7 +18,7 @@ */ import React from 'react'; import PropTypes from 'prop-types'; -import { styled, t } from '@superset-ui/core'; +import { addAlpha, css, styled, t } from '@superset-ui/core'; import { EmptyStateBig } from 'src/components/EmptyState'; import { componentShape } from '../util/propShapes'; import DashboardComponent from '../containers/DashboardComponent'; @@ -28,8 +28,8 @@ import { TAB_TYPE } from '../util/componentTypes'; const propTypes = { depth: PropTypes.number.isRequired, - editMode: PropTypes.bool.isRequired, - gridComponent: componentShape.isRequired, + editMode: PropTypes.bool, + gridComponent: componentShape, handleComponentDrop: PropTypes.func.isRequired, isComponentVisible: PropTypes.bool.isRequired, resizeComponent: PropTypes.func.isRequired, @@ -58,16 +58,62 @@ const DashboardEmptyStateContainer = styled.div` right: 0; `; +const GridContent = styled.div` + ${({ theme }) => css` + display: flex; + flex-direction: column; + + /* gutters between rows */ + & > div:not(:last-child):not(.empty-droptarget) { + margin-bottom: ${theme.gridUnit * 4}px; + } + + & > .empty-droptarget { + width: 100%; + height: 100%; + } + + & > .empty-droptarget:first-child { + height: ${theme.gridUnit * 12}px; + margin-top: ${theme.gridUnit * -6}px; + margin-bottom: ${theme.gridUnit * -6}px; + } + + & > .empty-droptarget:only-child { + height: 80vh; + } + `} +`; + +const GridColumnGuide = styled.div` + ${({ theme }) => css` + // /* Editing guides */ + &.grid-column-guide { + position: absolute; + top: 0; + min-height: 100%; + background-color: ${addAlpha( + theme.colors.primary.base, + parseFloat(theme.opacity.light) / 100, + )}; + pointer-events: none; + box-shadow: inset 0 0 0 1px + ${addAlpha( + theme.colors.primary.base, + parseFloat(theme.opacity.mediumHeavy) / 100, + )}; + } + `}; +`; + class DashboardGrid extends React.PureComponent { constructor(props) { super(props); this.state = { isResizing: false, - rowGuideTop: null, }; this.handleResizeStart = this.handleResizeStart.bind(this); - this.handleResize = this.handleResize.bind(this); this.handleResizeStop = this.handleResizeStop.bind(this); this.handleTopDropTargetDrop = this.handleTopDropTargetDrop.bind(this); this.getRowGuidePosition = this.getRowGuidePosition.bind(this); @@ -90,30 +136,17 @@ class DashboardGrid extends React.PureComponent { this.grid = ref; } - handleResizeStart({ ref, direction }) { - let rowGuideTop = null; - if (direction === 'bottom' || direction === 'bottomRight') { - rowGuideTop = this.getRowGuidePosition(ref); - } - + handleResizeStart() { this.setState(() => ({ isResizing: true, - rowGuideTop, })); } - handleResize({ ref, direction }) { - if (direction === 'bottom' || direction === 'bottomRight') { - this.setState(() => ({ rowGuideTop: this.getRowGuidePosition(ref) })); - } - } - handleResizeStop({ id, widthMultiple: width, heightMultiple: height }) { this.props.resizeComponent({ id, width, height }); this.setState(() => ({ isResizing: false, - rowGuideTop: null, })); } @@ -150,7 +183,7 @@ class DashboardGrid extends React.PureComponent { (width + GRID_GUTTER_SIZE) / GRID_COLUMN_COUNT; const columnWidth = columnPlusGutterWidth - GRID_GUTTER_SIZE; - const { isResizing, rowGuideTop } = this.state; + const { isResizing } = this.state; const shouldDisplayEmptyState = gridComponent?.children?.length === 0; const shouldDisplayTopLevelTabEmptyState = @@ -227,7 +260,7 @@ class DashboardGrid extends React.PureComponent { </DashboardEmptyStateContainer> )} <div className="dashboard-grid" ref={this.setGridRef}> - <div className="grid-content" data-test="grid-content"> + <GridContent className="grid-content" data-test="grid-content"> {/* make the area above components droppable */} {editMode && ( <DragDroppable @@ -278,7 +311,7 @@ class DashboardGrid extends React.PureComponent { Array(GRID_COLUMN_COUNT) .fill(null) .map((_, i) => ( - <div + <GridColumnGuide key={`grid-column-${i}`} className="grid-column-guide" style={{ @@ -287,16 +320,7 @@ class DashboardGrid extends React.PureComponent { }} /> ))} - {isResizing && rowGuideTop && ( - <div - className="grid-row-guide" - style={{ - top: rowGuideTop, - width, - }} - /> - )} - </div> + </GridContent> </div> </> ); diff --git a/superset-frontend/src/dashboard/components/DashboardGrid.test.jsx b/superset-frontend/src/dashboard/components/DashboardGrid.test.jsx index 4fd1704b230e..c954ecff7be6 100644 --- a/superset-frontend/src/dashboard/components/DashboardGrid.test.jsx +++ b/superset-frontend/src/dashboard/components/DashboardGrid.test.jsx @@ -76,13 +76,6 @@ describe('DashboardGrid', () => { expect(wrapper.find('.grid-column-guide')).toHaveLength(GRID_COLUMN_COUNT); }); - it('should render a grid row guide when resizing', () => { - const wrapper = setup(); - expect(wrapper.find('.grid-row-guide')).not.toExist(); - wrapper.setState({ isResizing: true, rowGuideTop: 10 }); - expect(wrapper.find('.grid-row-guide')).toExist(); - }); - it('should call resizeComponent when a child DashboardComponent calls resizeStop', () => { const resizeComponent = sinon.spy(); const args = { id: 'id', widthMultiple: 1, heightMultiple: 3 }; diff --git a/superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/DetailsPanel.test.tsx b/superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/DetailsPanel.test.tsx index 12efe2c3e5d6..8d2b121ff6b0 100644 --- a/superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/DetailsPanel.test.tsx +++ b/superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/DetailsPanel.test.tsx @@ -102,13 +102,11 @@ test('Should render "appliedCrossFilterIndicators"', () => { userEvent.click(screen.getByTestId('details-panel-content')); expect(screen.getByText('Applied Cross Filters (1)')).toBeInTheDocument(); expect( - screen.getByRole('button', { name: 'search Clinical Stage' }), + screen.getByRole('button', { name: 'Clinical Stage' }), ).toBeInTheDocument(); expect(props.onHighlightFilterSource).toBeCalledTimes(0); - userEvent.click( - screen.getByRole('button', { name: 'search Clinical Stage' }), - ); + userEvent.click(screen.getByRole('button', { name: 'Clinical Stage' })); expect(props.onHighlightFilterSource).toBeCalledTimes(1); expect(props.onHighlightFilterSource).toBeCalledWith([ 'ROOT_ID', @@ -135,12 +133,10 @@ test('Should render "appliedIndicators"', () => { userEvent.click(screen.getByTestId('details-panel-content')); expect(screen.getByText('Applied Filters (1)')).toBeInTheDocument(); - expect( - screen.getByRole('button', { name: 'search Country' }), - ).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Country' })).toBeInTheDocument(); expect(props.onHighlightFilterSource).toBeCalledTimes(0); - userEvent.click(screen.getByRole('button', { name: 'search Country' })); + userEvent.click(screen.getByRole('button', { name: 'Country' })); expect(props.onHighlightFilterSource).toBeCalledTimes(1); expect(props.onHighlightFilterSource).toBeCalledWith([ 'ROOT_ID', @@ -168,12 +164,12 @@ test('Should render "incompatibleIndicators"', () => { userEvent.click(screen.getByTestId('details-panel-content')); expect(screen.getByText('Incompatible Filters (1)')).toBeInTheDocument(); expect( - screen.getByRole('button', { name: 'search Vaccine Approach Copy' }), + screen.getByRole('button', { name: 'Vaccine Approach Copy' }), ).toBeInTheDocument(); expect(props.onHighlightFilterSource).toBeCalledTimes(0); userEvent.click( - screen.getByRole('button', { name: 'search Vaccine Approach Copy' }), + screen.getByRole('button', { name: 'Vaccine Approach Copy' }), ); expect(props.onHighlightFilterSource).toBeCalledTimes(1); expect(props.onHighlightFilterSource).toBeCalledWith([ @@ -202,13 +198,11 @@ test('Should render "unsetIndicators"', () => { userEvent.click(screen.getByTestId('details-panel-content')); expect(screen.getByText('Unset Filters (1)')).toBeInTheDocument(); expect( - screen.getByRole('button', { name: 'search Vaccine Approach' }), + screen.getByRole('button', { name: 'Vaccine Approach' }), ).toBeInTheDocument(); expect(props.onHighlightFilterSource).toBeCalledTimes(0); - userEvent.click( - screen.getByRole('button', { name: 'search Vaccine Approach' }), - ); + userEvent.click(screen.getByRole('button', { name: 'Vaccine Approach' })); expect(props.onHighlightFilterSource).toBeCalledTimes(1); expect(props.onHighlightFilterSource).toBeCalledWith([ 'ROOT_ID', diff --git a/superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx b/superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx index b5dfb0150d59..3531ab1be9b2 100644 --- a/superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx +++ b/superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx @@ -20,11 +20,6 @@ import React, { useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; import { Global, css } from '@emotion/react'; import { t, useTheme } from '@superset-ui/core'; -import { - MinusCircleFilled, - CheckCircleFilled, - ExclamationCircleFilled, -} from '@ant-design/icons'; import Popover from 'src/components/Popover'; import Collapse from 'src/components/Collapse'; import Icons from 'src/components/Icons'; @@ -38,6 +33,12 @@ import { Indicator } from 'src/dashboard/components/FiltersBadge/selectors'; import FilterIndicator from 'src/dashboard/components/FiltersBadge/FilterIndicator'; import { RootState } from 'src/dashboard/types'; +const iconReset = css` + span { + line-height: 0; + } +`; + export interface DetailsPanelProps { appliedCrossFilterIndicators: Indicator[]; appliedIndicators: Indicator[]; @@ -206,7 +207,7 @@ const DetailsPanelPopover = ({ key="applied" header={ <Title bold color={theme.colors.success.base}> - <CheckCircleFilled />{' '} + <Icons.CheckCircleFilled css={iconReset} iconSize="m" />{' '} {t('Applied Filters (%d)', appliedIndicators.length)} } @@ -227,7 +228,7 @@ const DetailsPanelPopover = ({ key="incompatible" header={ - <ExclamationCircleFilled />{' '} + <Icons.ExclamationCircleFilled css={iconReset} iconSize="m" />{' '} {t( 'Incompatible Filters (%d)', incompatibleIndicators.length, @@ -251,7 +252,7 @@ const DetailsPanelPopover = ({ key="unset" header={ <Title bold color={theme.colors.grayscale.light1}> - <MinusCircleFilled />{' '} + <Icons.MinusCircleFilled css={iconReset} iconSize="m" />{' '} {t('Unset Filters (%d)', unsetIndicators.length)} } diff --git a/superset-frontend/src/dashboard/components/FiltersBadge/FilterIndicator/FilterIndicator.test.tsx b/superset-frontend/src/dashboard/components/FiltersBadge/FilterIndicator/FilterIndicator.test.tsx index c93abaa90362..fdded804b8ba 100644 --- a/superset-frontend/src/dashboard/components/FiltersBadge/FilterIndicator/FilterIndicator.test.tsx +++ b/superset-frontend/src/dashboard/components/FiltersBadge/FilterIndicator/FilterIndicator.test.tsx @@ -43,9 +43,9 @@ test('Should render', () => { render(); expect( - screen.getByRole('button', { name: 'search Vaccine Approach' }), + screen.getByRole('button', { name: 'Vaccine Approach' }), ).toBeInTheDocument(); - expect(screen.getByRole('img', { name: 'search' })).toBeInTheDocument(); + expect(screen.getByRole('img')).toBeInTheDocument(); }); test('Should call "onClick"', () => { @@ -53,9 +53,7 @@ test('Should call "onClick"', () => { render(); expect(props.onClick).toBeCalledTimes(0); - userEvent.click( - screen.getByRole('button', { name: 'search Vaccine Approach' }), - ); + userEvent.click(screen.getByRole('button', { name: 'Vaccine Approach' })); expect(props.onClick).toBeCalledTimes(1); }); @@ -66,7 +64,7 @@ test('Should render "value"', () => { expect( screen.getByRole('button', { - name: 'search Vaccine Approach: any, string', + name: 'Vaccine Approach: any, string', }), ).toBeInTheDocument(); }); @@ -77,9 +75,7 @@ test('Should render with default props', () => { render(); expect( - screen.getByRole('button', { name: 'search Vaccine Approach' }), + screen.getByRole('button', { name: 'Vaccine Approach' }), ).toBeInTheDocument(); - userEvent.click( - screen.getByRole('button', { name: 'search Vaccine Approach' }), - ); + userEvent.click(screen.getByRole('button', { name: 'Vaccine Approach' })); }); diff --git a/superset-frontend/src/dashboard/components/FiltersBadge/FilterIndicator/index.tsx b/superset-frontend/src/dashboard/components/FiltersBadge/FilterIndicator/index.tsx index e94bca37751d..e7675a3ef0e3 100644 --- a/superset-frontend/src/dashboard/components/FiltersBadge/FilterIndicator/index.tsx +++ b/superset-frontend/src/dashboard/components/FiltersBadge/FilterIndicator/index.tsx @@ -17,8 +17,9 @@ * under the License. */ -import { SearchOutlined } from '@ant-design/icons'; import React, { FC } from 'react'; +import { css } from '@superset-ui/core'; +import Icons from 'src/components/Icons'; import { getFilterValueForDisplay } from 'src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils'; import { FilterIndicatorText, @@ -46,7 +47,14 @@ const FilterIndicator: FC = ({ onClick([...path, `LABEL-${column}`])}> <ItemIcon> - <SearchOutlined /> + <Icons.SearchOutlined + iconSize="m" + css={css` + span { + vertical-align: 0; + } + `} + /> </ItemIcon> {name} {resultValue ? ': ' : ''} diff --git a/superset-frontend/src/dashboard/components/FiltersBadge/index.tsx b/superset-frontend/src/dashboard/components/FiltersBadge/index.tsx index 316534823772..fd21d07fc2b9 100644 --- a/superset-frontend/src/dashboard/components/FiltersBadge/index.tsx +++ b/superset-frontend/src/dashboard/components/FiltersBadge/index.tsx @@ -23,6 +23,7 @@ import cx from 'classnames'; import { DataMaskStateWithId, Filters } from '@superset-ui/core'; import Icons from 'src/components/Icons'; import { usePrevious } from 'src/hooks/usePrevious'; +import { setFocusedNativeFilter } from 'src/dashboard/actions/nativeFilters'; import DetailsPanelPopover from './DetailsPanel'; import { Pill } from './Styles'; import { @@ -31,7 +32,6 @@ import { selectIndicatorsForChart, selectNativeIndicatorsForChart, } from './selectors'; -import { setDirectPathToChild } from '../../actions/dashboardState'; import { ChartsState, DashboardInfo, @@ -87,7 +87,7 @@ export const FiltersBadge = ({ chartId }: FiltersBadgeProps) => { const onHighlightFilterSource = useCallback( (path: string[]) => { - dispatch(setDirectPathToChild(path)); + dispatch(setFocusedNativeFilter(path[0])); }, [dispatch], ); diff --git a/superset-frontend/src/dashboard/components/FiltersBadge/selectors.ts b/superset-frontend/src/dashboard/components/FiltersBadge/selectors.ts index 6d9ab6fe9c9d..c0916b99607b 100644 --- a/superset-frontend/src/dashboard/components/FiltersBadge/selectors.ts +++ b/superset-frontend/src/dashboard/components/FiltersBadge/selectors.ts @@ -25,10 +25,10 @@ import { FilterState, isFeatureEnabled, NativeFilterType, + NO_TIME_RANGE, } from '@superset-ui/core'; -import { NO_TIME_RANGE, TIME_FILTER_MAP } from 'src/explore/constants'; +import { TIME_FILTER_MAP } from 'src/explore/constants'; import { getChartIdsInFilterBoxScope } from 'src/dashboard/util/activeDashboardFilters'; -import { CHART_TYPE } from 'src/dashboard/util/componentTypes'; import { ChartConfiguration } from 'src/dashboard/reducers/types'; import { Layout } from 'src/dashboard/types'; import { areObjectsEqual } from 'src/reduxUtils'; @@ -293,18 +293,9 @@ export const selectNativeIndicatorsForChart = ( let crossFilterIndicators: any = []; if (isFeatureEnabled(FeatureFlag.DASHBOARD_CROSS_FILTERS)) { const dashboardLayoutValues = Object.values(dashboardLayout); - const chartLayoutItem = dashboardLayoutValues.find( - layoutItem => layoutItem?.meta?.chartId === chartId, - ); crossFilterIndicators = Object.values(chartConfiguration) - .filter( - chartConfig => - !chartConfig.crossFilters.scope.excluded.includes(chartId) && - chartConfig.crossFilters.scope.rootPath.some( - elementId => - chartLayoutItem?.type === CHART_TYPE && - chartLayoutItem?.parents?.includes(elementId), - ), + .filter(chartConfig => + chartConfig.crossFilters?.chartsInScope?.includes(chartId), ) .map(chartConfig => { const filterState = dataMask[chartConfig.id]?.filterState; diff --git a/superset-frontend/src/dashboard/components/Header/Header.test.tsx b/superset-frontend/src/dashboard/components/Header/Header.test.tsx index 214a0d0a5322..79ae0a48652b 100644 --- a/superset-frontend/src/dashboard/components/Header/Header.test.tsx +++ b/superset-frontend/src/dashboard/components/Header/Header.test.tsx @@ -20,6 +20,8 @@ import React from 'react'; import { render, screen, fireEvent } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; import fetchMock from 'fetch-mock'; +import { getExtensionsRegistry } from '@superset-ui/core'; +import setupExtensions from 'src/setup/setupExtensions'; import { HeaderProps } from './types'; import Header from '.'; @@ -35,7 +37,12 @@ const createProps = () => ({ userId: '1', metadata: {}, common: { - conf: {}, + conf: { + DASHBOARD_AUTO_REFRESH_INTERVALS: [ + [0, "Don't refresh"], + [10, '10 seconds'], + ], + }, }, }, user: { @@ -75,7 +82,8 @@ const createProps = () => ({ setEditMode: jest.fn(), showBuilderPane: jest.fn(), updateCss: jest.fn(), - setColorSchemeAndUnsavedChanges: jest.fn(), + setColorScheme: jest.fn(), + setUnsavedChanges: jest.fn(), logEvent: jest.fn(), setRefreshFrequency: jest.fn(), hasUnsavedChanges: false, @@ -328,6 +336,20 @@ test('should refresh the charts', async () => { expect(mockedProps.onRefresh).toHaveBeenCalledTimes(1); }); +test('should render an extension component if one is supplied', () => { + const extensionsRegistry = getExtensionsRegistry(); + extensionsRegistry.set('dashboard.nav.right', () => ( + <>dashboard.nav.right extension component</> + )); + setupExtensions(); + + const mockedProps = createProps(); + setup(mockedProps); + expect( + screen.getByText('dashboard.nav.right extension component'), + ).toBeInTheDocument(); +}); + test('should show datahub link', async () => { const mockedProps = createProps(); setup(mockedProps); diff --git a/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/HeaderActionsDropdown.test.tsx b/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/HeaderActionsDropdown.test.tsx index eb3c6aeb4e97..37ff40c6b79b 100644 --- a/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/HeaderActionsDropdown.test.tsx +++ b/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/HeaderActionsDropdown.test.tsx @@ -38,7 +38,12 @@ const createProps = () => ({ userId: '1', metadata: {}, common: { - conf: {}, + conf: { + DASHBOARD_AUTO_REFRESH_INTERVALS: [ + [0, "Don't refresh"], + [10, '10 seconds'], + ], + }, }, }, dashboardTitle: 'Title', @@ -63,6 +68,7 @@ const createProps = () => ({ lastModifiedTime: 0, isDropdownVisible: true, dataMask: {}, + logEvent: jest.fn(), }); const editModeOnProps = { ...createProps(), diff --git a/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx b/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx index 3d25b049fba5..d4c9a8aadb6b 100644 --- a/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx +++ b/superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx @@ -36,39 +36,45 @@ import getDashboardUrl from 'src/dashboard/util/getDashboardUrl'; import { getActiveFilters } from 'src/dashboard/util/activeDashboardFilters'; import { getUrlParam } from 'src/utils/urlUtils'; import { FILTER_BOX_MIGRATION_STATES } from 'src/explore/constants'; +import { LOG_ACTIONS_DASHBOARD_DOWNLOAD_AS_IMAGE } from 'src/logger/LogUtils'; const propTypes = { addSuccessToast: PropTypes.func.isRequired, addDangerToast: PropTypes.func.isRequired, dashboardInfo: PropTypes.object.isRequired, - dashboardId: PropTypes.number.isRequired, - dashboardTitle: PropTypes.string.isRequired, + dashboardId: PropTypes.number, + dashboardTitle: PropTypes.string, dataMask: PropTypes.object.isRequired, - customCss: PropTypes.string.isRequired, + customCss: PropTypes.string, colorNamespace: PropTypes.string, colorScheme: PropTypes.string, onChange: PropTypes.func.isRequired, updateCss: PropTypes.func.isRequired, forceRefreshAllCharts: PropTypes.func.isRequired, - refreshFrequency: PropTypes.number.isRequired, + refreshFrequency: PropTypes.number, shouldPersistRefreshFrequency: PropTypes.bool.isRequired, setRefreshFrequency: PropTypes.func.isRequired, startPeriodicRender: PropTypes.func.isRequired, editMode: PropTypes.bool.isRequired, - userCanEdit: PropTypes.bool.isRequired, - userCanShare: PropTypes.bool.isRequired, - userCanSave: PropTypes.bool.isRequired, + userCanEdit: PropTypes.bool, + userCanShare: PropTypes.bool, + userCanSave: PropTypes.bool, userCanCurate: PropTypes.bool.isRequired, isLoading: PropTypes.bool.isRequired, layout: PropTypes.object.isRequired, - expandedSlices: PropTypes.object.isRequired, + expandedSlices: PropTypes.object, onSave: PropTypes.func.isRequired, showPropertiesModal: PropTypes.func.isRequired, manageEmbedded: PropTypes.func.isRequired, + logEvent: PropTypes.func, refreshLimit: PropTypes.number, refreshWarning: PropTypes.string, lastModifiedTime: PropTypes.number.isRequired, - filterboxMigrationState: FILTER_BOX_MIGRATION_STATES, + filterboxMigrationState: PropTypes.oneOf( + Object.keys(FILTER_BOX_MIGRATION_STATES).map( + key => FILTER_BOX_MIGRATION_STATES[key], + ), + ), }; const defaultProps = { @@ -178,6 +184,7 @@ class HeaderActionsDropdown extends React.PureComponent { )(domEvent).then(() => { menu.style.visibility = 'visible'; }); + this.props.logEvent?.(LOG_ACTIONS_DASHBOARD_DOWNLOAD_AS_IMAGE); break; } case MENU_KEYS.TOGGLE_FULLSCREEN: { @@ -239,6 +246,9 @@ class HeaderActionsDropdown extends React.PureComponent { hash: window.location.hash, }); + const refreshIntervalOptions = + dashboardInfo.common?.conf?.DASHBOARD_AUTO_REFRESH_INTERVALS; + return ( <Menu selectable={false} data-test="header-actions-menu" {...rest}> {!editMode && ( @@ -386,6 +396,7 @@ class HeaderActionsDropdown extends React.PureComponent { refreshWarning={refreshWarning} onChange={this.changeRefreshInterval} editMode={editMode} + refreshIntervalOptions={refreshIntervalOptions} triggerNode={<span>{t('Set auto-refresh interval')}</span>} /> </Menu.Item> diff --git a/superset-frontend/src/dashboard/components/Header/index.jsx b/superset-frontend/src/dashboard/components/Header/index.jsx index e55d83e4e546..6c7565cea940 100644 --- a/superset-frontend/src/dashboard/components/Header/index.jsx +++ b/superset-frontend/src/dashboard/components/Header/index.jsx @@ -20,7 +20,13 @@ import moment from 'moment'; import React from 'react'; import PropTypes from 'prop-types'; -import { styled, css, t, getSharedLabelColor } from '@superset-ui/core'; +import { + styled, + css, + t, + getSharedLabelColor, + getUiOverrideRegistry, +} from '@superset-ui/core'; import { Global } from '@emotion/react'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; import { @@ -31,6 +37,7 @@ import { import Icons from 'src/components/Icons'; import Button from 'src/components/Button'; import { AntdButton } from 'src/components/'; +import { findPermission } from 'src/utils/findPermission'; import { Tooltip } from 'src/components/Tooltip'; import { safeStringify } from 'src/utils/safeStringify'; import HeaderActionsDropdown from 'src/dashboard/components/Header/HeaderActionsDropdown'; @@ -38,7 +45,6 @@ import PublishedStatus from 'src/dashboard/components/PublishedStatus'; import UndoRedoKeyListeners from 'src/dashboard/components/UndoRedoKeyListeners'; import PropertiesModal from 'src/dashboard/components/PropertiesModal'; import { chartPropShape } from 'src/dashboard/util/propShapes'; -import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; import { UNDO_LIMIT, SAVE_TYPE_OVERWRITE, @@ -47,28 +53,30 @@ import { import setPeriodicRunner, { stopPeriodicRender, } from 'src/dashboard/util/setPeriodicRunner'; -import { options as PeriodicRefreshOptions } from 'src/dashboard/components/RefreshIntervalModal'; -import findPermission from 'src/dashboard/util/findPermission'; import { FILTER_BOX_MIGRATION_STATES } from 'src/explore/constants'; import { PageHeaderWithActions } from 'src/components/PageHeaderWithActions'; import { datahubUrl } from 'src/preamble'; import { DashboardEmbedModal } from '../DashboardEmbedControls'; +import OverwriteConfirm from '../OverwriteConfirm'; + +const uiOverrideRegistry = getUiOverrideRegistry(); const propTypes = { addSuccessToast: PropTypes.func.isRequired, addDangerToast: PropTypes.func.isRequired, addWarningToast: PropTypes.func.isRequired, - user: UserWithPermissionsAndRoles, + user: PropTypes.object, // UserWithPermissionsAndRoles, dashboardInfo: PropTypes.object.isRequired, - dashboardTitle: PropTypes.string.isRequired, + dashboardTitle: PropTypes.string, dataMask: PropTypes.object.isRequired, charts: PropTypes.objectOf(chartPropShape).isRequired, layout: PropTypes.object.isRequired, - expandedSlices: PropTypes.object.isRequired, - customCss: PropTypes.string.isRequired, + expandedSlices: PropTypes.object, + customCss: PropTypes.string, colorNamespace: PropTypes.string, colorScheme: PropTypes.string, - setColorSchemeAndUnsavedChanges: PropTypes.func.isRequired, + setColorScheme: PropTypes.func.isRequired, + setUnsavedChanges: PropTypes.func.isRequired, isStarred: PropTypes.bool.isRequired, isPublished: PropTypes.bool.isRequired, isLoading: PropTypes.bool.isRequired, @@ -96,7 +104,7 @@ const propTypes = { redoLength: PropTypes.number.isRequired, setMaxUndoHistoryExceeded: PropTypes.func.isRequired, maxUndoHistoryToast: PropTypes.func.isRequired, - refreshFrequency: PropTypes.number.isRequired, + refreshFrequency: PropTypes.number, shouldPersistRefreshFrequency: PropTypes.bool.isRequired, setRefreshFrequency: PropTypes.func.isRequired, dashboardInfoChanged: PropTypes.func.isRequired, @@ -125,6 +133,7 @@ const actionButtonsStyle = theme => css` } .undoRedo { + display: flex; margin-right: ${theme.gridUnit * 2}px; } `; @@ -280,12 +289,17 @@ class Header extends React.PureComponent { startPeriodicRender(interval) { let intervalMessage; + if (interval) { - const predefinedValue = PeriodicRefreshOptions.find( - option => option.value === interval / 1000, + const { dashboardInfo } = this.props; + const periodicRefreshOptions = + dashboardInfo.common?.conf?.DASHBOARD_AUTO_REFRESH_INTERVALS; + const predefinedValue = periodicRefreshOptions.find( + option => Number(option[0]) === interval / 1000, ); + if (predefinedValue) { - intervalMessage = predefinedValue.label; + intervalMessage = t(predefinedValue[1]); } else { intervalMessage = moment.duration(interval, 'millisecond').humanize(); } @@ -363,9 +377,8 @@ class Header extends React.PureComponent { dashboardInfo?.metadata?.color_scheme || colorScheme; const currentColorNamespace = dashboardInfo?.metadata?.color_namespace || colorNamespace; - const currentSharedLabelColors = getSharedLabelColor().getColorMap( - currentColorNamespace, - currentColorScheme, + const currentSharedLabelColors = Object.fromEntries( + getSharedLabelColor().getColorMap(), ); const data = { @@ -431,7 +444,8 @@ class Header extends React.PureComponent { customCss, colorNamespace, dataMask, - setColorSchemeAndUnsavedChanges, + setColorScheme, + setUnsavedChanges, colorScheme, onUndo, onRedo, @@ -451,6 +465,7 @@ class Header extends React.PureComponent { setRefreshFrequency, lastModifiedTime, filterboxMigrationState, + logEvent, } = this.props; const userCanEdit = @@ -472,6 +487,8 @@ class Header extends React.PureComponent { const handleOnPropertiesChange = updates => { const { dashboardInfoChanged, dashboardTitleChanged } = this.props; + + setColorScheme(updates.colorScheme); dashboardInfoChanged({ slug: updates.slug, metadata: JSON.parse(updates.jsonMetadata || '{}'), @@ -480,13 +497,16 @@ class Header extends React.PureComponent { owners: updates.owners, roles: updates.roles, }); - setColorSchemeAndUnsavedChanges(updates.colorScheme); + setUnsavedChanges(true); dashboardTitleChanged(updates.title); }; + const NavExtension = uiOverrideRegistry.get('dashboard.nav.right'); + return ( <div css={headerContainerStyle} + data-test="dashboard-header-container" data-test-id={dashboardInfo.id} className="dashboard-header-container" > @@ -611,11 +631,12 @@ class Header extends React.PureComponent { /> ) : ( <div css={actionButtonsStyle}> + {NavExtension && <NavExtension />} {userCanEdit && ( <Button buttonStyle="secondary" onClick={this.toggleEditMode} - data-test="query-save-button" + data-test="edit-dashboard-button" className="action-button" css={editButtonStyle} aria-label={t('Edit dashboard')} @@ -669,6 +690,7 @@ class Header extends React.PureComponent { filterboxMigrationState={filterboxMigrationState} isDropdownVisible={this.state.isDropdownVisible} setIsDropdownVisible={this.setIsDropdownVisible} + logEvent={logEvent} /> } showFaveStar={user?.userId && dashboardInfo?.id} @@ -687,6 +709,8 @@ class Header extends React.PureComponent { /> )} + <OverwriteConfirm /> + {userCanCurate && ( <DashboardEmbedModal show={this.state.showingEmbedModal} diff --git a/superset-frontend/src/dashboard/components/Header/types.ts b/superset-frontend/src/dashboard/components/Header/types.ts index f03e01874005..89ea7569888d 100644 --- a/superset-frontend/src/dashboard/components/Header/types.ts +++ b/superset-frontend/src/dashboard/components/Header/types.ts @@ -68,7 +68,8 @@ export interface HeaderProps { user: Object | undefined; dashboardInfo: DashboardInfo; dashboardTitle: string; - setColorSchemeAndUnsavedChanges: () => void; + setColorScheme: () => void; + setUnsavedChanges: () => void; isStarred: boolean; isPublished: boolean; onChange: () => void; diff --git a/superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirm.test.tsx b/superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirm.test.tsx new file mode 100644 index 000000000000..498fbbc6ea8f --- /dev/null +++ b/superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirm.test.tsx @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import configureStore from 'redux-mock-store'; +import { render, waitFor } from 'spec/helpers/testing-library'; +import { overwriteConfirmMetadata } from 'spec/fixtures/mockDashboardState'; + +import OverwriteConfirm from '.'; + +import './OverwriteConfirmModal'; + +const mockStore = configureStore(); + +test('renders nothing without overwriteConfirmMetadata', () => { + const { queryByText } = render(<OverwriteConfirm />, { + useRedux: true, + store: mockStore({ dashboardState: {} }), + }); + expect(queryByText('Confirm overwrite')).not.toBeInTheDocument(); +}); + +test('renders confirm modal on overwriteConfirmMetadata is provided', async () => { + const { queryByText } = render(<OverwriteConfirm />, { + useRedux: true, + store: mockStore({ + dashboardState: { + overwriteConfirmMetadata, + }, + }), + }); + await waitFor(() => + expect(queryByText('Confirm overwrite')).toBeInTheDocument(), + ); +}); diff --git a/superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.test.tsx b/superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.test.tsx new file mode 100644 index 000000000000..c49977ce7a52 --- /dev/null +++ b/superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.test.tsx @@ -0,0 +1,90 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import thunk from 'redux-thunk'; +import configureStore from 'redux-mock-store'; +import fetchMock from 'fetch-mock'; +import { mockAllIsIntersecting } from 'react-intersection-observer/test-utils'; + +import { fireEvent, render, waitFor } from 'spec/helpers/testing-library'; +import { overwriteConfirmMetadata } from 'spec/fixtures/mockDashboardState'; +import OverwriteConfirmModal from './OverwriteConfirmModal'; + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); + +jest.mock('react-diff-viewer-continued', () => () => ( + <div data-test="mock-diff-viewer" /> +)); + +test('renders diff viewer when it contains overwriteConfirmMetadata', async () => { + const { queryByText, findAllByTestId } = render( + <OverwriteConfirmModal + overwriteConfirmMetadata={overwriteConfirmMetadata} + />, + { + useRedux: true, + store: mockStore(), + }, + ); + expect(queryByText('Confirm overwrite')).toBeInTheDocument(); + const diffViewers = await findAllByTestId('mock-diff-viewer'); + expect(diffViewers).toHaveLength( + overwriteConfirmMetadata.overwriteConfirmItems.length, + ); +}); + +test('requests update dashboard api when save button is clicked', async () => { + const updateDashboardEndpoint = `glob:*/api/v1/dashboard/${overwriteConfirmMetadata.dashboardId}`; + fetchMock.put(updateDashboardEndpoint, { + id: overwriteConfirmMetadata.dashboardId, + last_modified_time: +new Date(), + result: overwriteConfirmMetadata.data, + }); + const store = mockStore({ + dashboardLayout: {}, + dashboardFilters: {}, + }); + const { findByTestId } = render( + <OverwriteConfirmModal + overwriteConfirmMetadata={overwriteConfirmMetadata} + />, + { + useRedux: true, + store, + }, + ); + const saveButton = await findByTestId('overwrite-confirm-save-button'); + expect(fetchMock.calls(updateDashboardEndpoint)).toHaveLength(0); + fireEvent.click(saveButton); + expect(fetchMock.calls(updateDashboardEndpoint)).toHaveLength(0); + mockAllIsIntersecting(true); + fireEvent.click(saveButton); + await waitFor(() => + expect(fetchMock.calls(updateDashboardEndpoint)?.[0]?.[1]?.body).toEqual( + JSON.stringify(overwriteConfirmMetadata.data), + ), + ); + await waitFor(() => + expect(store.getActions()).toContainEqual({ + type: 'SET_OVERRIDE_CONFIRM', + overwriteConfirmMetadata: undefined, + }), + ); +}); diff --git a/superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.tsx b/superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.tsx new file mode 100644 index 000000000000..134681731c07 --- /dev/null +++ b/superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.tsx @@ -0,0 +1,209 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useMemo, useCallback, RefObject, createRef } from 'react'; +import moment from 'moment'; +import { useDispatch } from 'react-redux'; +import ReactDiffViewer from 'react-diff-viewer-continued'; +import { useInView } from 'react-intersection-observer'; +import Modal from 'src/components/Modal'; +import Button from 'src/components/Button'; +import { DashboardState } from 'src/dashboard/types'; +import { + saveDashboardRequest, + setOverrideConfirm, +} from 'src/dashboard/actions/dashboardState'; +import { t, styled } from '@superset-ui/core'; +import { SAVE_TYPE_OVERWRITE_CONFIRMED } from 'src/dashboard/util/constants'; + +const STICKY_HEADER_TOP = 16; +const STICKY_HEADER_HEIGHT = 32; + +const StyledTitle = styled.h2` + ${({ theme }) => ` + color: ${theme.colors.grayscale.dark1} + `} +`; + +const StyledEditor = styled.div` + ${({ theme }) => ` + table { + border: 1px ${theme.colors.grayscale.light2} solid; + } + pre { + font-size: 11px; + padding: 0px; + background-color: transparent; + border: 0px; + line-height: 110%; + } + `} +`; + +const StackableHeader = styled(Button)<{ top: number }>` + ${({ theme, top }) => ` + position: sticky; + top: ${top}px; + background-color: ${theme.colors.grayscale.light5}; + margin: 0px; + padding: 8px 4px; + z-index: 1; + border: 0px; + border-radius: 0px; + width: 100%; + justify-content: flex-start; + border-bottom: 1px ${theme.colors.grayscale.light1} solid; + &::before { + display: inline-block; + position: relative; + opacity: 1; + content: "\\00BB"; + } + `} +`; + +const StyledBottom = styled.div<{ inView: boolean }>` + ${({ inView }) => ` + margin: 8px auto; + text-align: center; + opacity: ${inView ? 0 : 1}; + `} +`; + +type Props = { + overwriteConfirmMetadata: DashboardState['overwriteConfirmMetadata']; +}; + +const OverrideConfirmModal = ({ overwriteConfirmMetadata }: Props) => { + const [bottomRef, hasReviewed] = useInView({ triggerOnce: true }); + const dispatch = useDispatch(); + const onHide = useCallback( + () => dispatch(setOverrideConfirm(undefined)), + [dispatch], + ); + const anchors = useMemo<RefObject<HTMLDivElement>[]>( + () => + overwriteConfirmMetadata + ? overwriteConfirmMetadata.overwriteConfirmItems.map(() => + createRef<HTMLDivElement>(), + ) + : [], + [overwriteConfirmMetadata], + ); + const onAnchorClicked = useCallback( + (index: number) => { + anchors[index]?.current?.scrollIntoView({ behavior: 'smooth' }); + }, + [anchors], + ); + const onConfirmOverwrite = useCallback(() => { + if (overwriteConfirmMetadata) { + dispatch( + saveDashboardRequest( + overwriteConfirmMetadata.data, + overwriteConfirmMetadata.dashboardId, + SAVE_TYPE_OVERWRITE_CONFIRMED, + ), + ); + } + }, [dispatch, overwriteConfirmMetadata]); + + return ( + <Modal + responsive + maxWidth="1024px" + height="50vh" + show={Boolean(overwriteConfirmMetadata)} + title={t('Confirm overwrite')} + footer={ + <> + {t('Scroll down to the bottom to enable overwriting changes. ')} + <Button + htmlType="button" + buttonSize="small" + onClick={onHide} + data-test="override-confirm-modal-cancel-button" + cta + > + {t('No')} + </Button> + <Button + data-test="overwrite-confirm-save-button" + htmlType="button" + buttonSize="small" + cta + buttonStyle="primary" + onClick={onConfirmOverwrite} + disabled={!hasReviewed} + > + {t('Yes, overwrite changes')} + </Button> + </> + } + onHide={onHide} + > + {overwriteConfirmMetadata && ( + <> + <StyledTitle> + {t('Are you sure you intend to overwrite the following values?')} + </StyledTitle> + <StyledEditor> + {overwriteConfirmMetadata.overwriteConfirmItems.map( + ({ keyPath, oldValue, newValue }, index) => ( + <React.Fragment key={keyPath}> + <div ref={anchors[index]} /> + <StackableHeader + top={index * STICKY_HEADER_HEIGHT - STICKY_HEADER_TOP} + buttonStyle="tertiary" + onClick={() => onAnchorClicked(index)} + > + {keyPath} + </StackableHeader> + <ReactDiffViewer + oldValue={oldValue} + newValue={newValue} + leftTitle={t( + 'Last Updated %s by %s', + moment.utc(overwriteConfirmMetadata.updatedAt).calendar(), + overwriteConfirmMetadata.updatedBy, + )} + rightTitle="new value" + /> + </React.Fragment> + ), + )} + <StyledBottom ref={bottomRef} inView={hasReviewed}> + {/* Add submit button at the bottom in case of intersection-observer fallback */} + <Button + htmlType="button" + buttonSize="small" + cta + buttonStyle="primary" + onClick={onConfirmOverwrite} + > + {t('Yes, overwrite changes')} + </Button> + </StyledBottom> + </StyledEditor> + </> + )} + </Modal> + ); +}; + +export default OverrideConfirmModal; diff --git a/superset-frontend/src/dashboard/stylesheets/components/new-component.less b/superset-frontend/src/dashboard/components/OverwriteConfirm/index.tsx similarity index 54% rename from superset-frontend/src/dashboard/stylesheets/components/new-component.less rename to superset-frontend/src/dashboard/components/OverwriteConfirm/index.tsx index 2202a59ff70b..46e4f3ab5014 100644 --- a/superset-frontend/src/dashboard/stylesheets/components/new-component.less +++ b/superset-frontend/src/dashboard/components/OverwriteConfirm/index.tsx @@ -16,40 +16,26 @@ * specific language governing permissions and limitations * under the License. */ -@import '../../../assets/stylesheets/less/variables.less'; +import React from 'react'; +import { useSelector } from 'react-redux'; +import AsyncEsmComponent from 'src/components/AsyncEsmComponent'; +import { DashboardState, RootState } from 'src/dashboard/types'; -.new-component { - display: flex; - flex-direction: row; - flex-wrap: nowrap; - align-items: center; - padding: 16px; - background: @lightest; - cursor: move; +const Modal = AsyncEsmComponent(() => import('./OverwriteConfirmModal')); - &:not(.static):hover { - background: @gray-bg; - } -} +const OverrideConfirm = () => { + const overwriteConfirmMetadata = useSelector< + RootState, + DashboardState['overwriteConfirmMetadata'] + >(({ dashboardState }) => dashboardState.overwriteConfirmMetadata); -.new-component-placeholder { - position: relative; - background: @gray-bg; - width: 40px; - height: 40px; - margin-right: 16px; - border: 1px solid @lightest; - display: flex; - align-items: center; - justify-content: center; - color: @gray; - font-size: @font-size-xxl; + return ( + <> + {overwriteConfirmMetadata && ( + <Modal overwriteConfirmMetadata={overwriteConfirmMetadata} /> + )} + </> + ); +}; - &.fa-window-restore { - font-size: @font-size-l; - } - - &.fa-area-chart { - font-size: @font-size-xl; - } -} +export default OverrideConfirm; diff --git a/superset-frontend/src/dashboard/components/PropertiesModal/PropertiesModal.test.tsx b/superset-frontend/src/dashboard/components/PropertiesModal/PropertiesModal.test.tsx index 07d48eb98a3c..8469ef60057b 100644 --- a/superset-frontend/src/dashboard/components/PropertiesModal/PropertiesModal.test.tsx +++ b/superset-frontend/src/dashboard/components/PropertiesModal/PropertiesModal.test.tsx @@ -38,7 +38,7 @@ spyColorSchemeControlWrapper.mockImplementation( ); fetchMock.get( - 'http://localhost/api/v1/dashboard/related/roles?q=(filter:%27%27)', + 'http://localhost/api/v1/dashboard/related/roles?q=(filter:%27%27,page:0,page_size:100)', { body: { count: 6, @@ -46,26 +46,32 @@ fetchMock.get( { text: 'Admin', value: 1, + extra: {}, }, { text: 'Alpha', value: 3, + extra: {}, }, { text: 'Gamma', value: 4, + extra: {}, }, { text: 'granter', value: 5, + extra: {}, }, { text: 'Public', value: 2, + extra: {}, }, { text: 'sql_lab', value: 6, + extra: {}, }, ], }, @@ -73,7 +79,7 @@ fetchMock.get( ); fetchMock.get( - 'http://localhost/api/v1/dashboard/related/owners?q=(filter:%27%27)', + 'http://localhost/api/v1/dashboard/related/owners?q=(filter:%27%27,page:0,page_size:100)', { body: { count: 1, @@ -81,45 +87,53 @@ fetchMock.get( { text: 'Superset Admin', value: 1, + extra: { active: true }, + }, + { + text: 'Inactive Admin', + value: 2, + extra: { active: false }, }, ], }, }, ); +const dashboardInfo = { + certified_by: 'John Doe', + certification_details: 'Sample certification', + changed_by: null, + changed_by_name: '', + changed_by_url: '', + changed_on: '2021-03-30T19:30:14.020942', + charts: [ + 'Vaccine Candidates per Country & Stage', + 'Vaccine Candidates per Country', + 'Vaccine Candidates per Country', + 'Vaccine Candidates per Approach & Stage', + 'Vaccine Candidates per Phase', + 'Vaccine Candidates per Phase', + 'Vaccine Candidates per Country & Stage', + 'Filtering Vaccines', + ], + css: '', + dashboard_title: 'COVID Vaccine Dashboard', + id: 26, + metadata: mockedJsonMetadata, + owners: [], + position_json: + '{"CHART-63bEuxjDMJ": {"children": [], "id": "CHART-63bEuxjDMJ", "meta": {"chartId": 369, "height": 76, "sliceName": "Vaccine Candidates per Country", "sliceNameOverride": "Map of Vaccine Candidates", "uuid": "ddc91df6-fb40-4826-bdca-16b85af1c024", "width": 7}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-zvw7luvEL"], "type": "CHART"}, "CHART-F-fkth0Dnv": {"children": [], "id": "CHART-F-fkth0Dnv", "meta": {"chartId": 314, "height": 76, "sliceName": "Vaccine Candidates per Country", "sliceNameOverride": "Treemap of Vaccine Candidates per Country", "uuid": "e2f5a8a7-feb0-4f79-bc6b-01fe55b98b3c", "width": 5}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-zvw7luvEL"], "type": "CHART"}, "CHART-RjD_ygqtwH": {"children": [], "id": "CHART-RjD_ygqtwH", "meta": {"chartId": 351, "height": 59, "sliceName": "Vaccine Candidates per Phase", "sliceNameOverride": "Vaccine Candidates per Phase", "uuid": "30b73c65-85e7-455f-bb24-801bb0cdc670", "width": 2}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-xSeNAspgw"], "type": "CHART"}, "CHART-aGfmWtliqA": {"children": [], "id": "CHART-aGfmWtliqA", "meta": {"chartId": 312, "height": 59, "sliceName": "Vaccine Candidates per Phase", "uuid": "392f293e-0892-4316-bd41-c927b65606a4", "width": 4}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-xSeNAspgw"], "type": "CHART"}, "CHART-dCUpAcPsji": {"children": [], "id": "CHART-dCUpAcPsji", "meta": {"chartId": 325, "height": 82, "sliceName": "Vaccine Candidates per Country & Stage", "sliceNameOverride": "Heatmap of Countries & Clinical Stages", "uuid": "cd111331-d286-4258-9020-c7949a109ed2", "width": 4}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-zhOlQLQnB"], "type": "CHART"}, "CHART-eirDduqb1A": {"children": [], "id": "CHART-eirDduqb1A", "meta": {"chartId": 358, "height": 59, "sliceName": "Filtering Vaccines", "sliceNameOverride": "Filter Box of Vaccines", "uuid": "c29381ce-0e99-4cf3-bf0f-5f55d6b94176", "width": 3}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-xSeNAspgw"], "type": "CHART"}, "CHART-fYo7IyvKZQ": {"children": [], "id": "CHART-fYo7IyvKZQ", "meta": {"chartId": 371, "height": 82, "sliceName": "Vaccine Candidates per Country & Stage", "sliceNameOverride": "Sunburst of Country & Clinical Stages", "uuid": "f69c556f-15fe-4a82-a8bb-69d5b6954123", "width": 5}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-zhOlQLQnB"], "type": "CHART"}, "CHART-j4hUvP5dDD": {"children": [], "id": "CHART-j4hUvP5dDD", "meta": {"chartId": 364, "height": 82, "sliceName": "Vaccine Candidates per Approach & Stage", "sliceNameOverride": "Heatmap of Approaches & Clinical Stages", "uuid": "0c953c84-0c9a-418d-be9f-2894d2a2cee0", "width": 3}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-zhOlQLQnB"], "type": "CHART"}, "DASHBOARD_VERSION_KEY": "v2", "GRID_ID": {"children": [], "id": "GRID_ID", "parents": ["ROOT_ID"], "type": "GRID"}, "HEADER_ID": {"id": "HEADER_ID", "meta": {"text": "COVID Vaccine Dashboard"}, "type": "HEADER"}, "MARKDOWN-VjQQ5SFj5v": {"children": [], "id": "MARKDOWN-VjQQ5SFj5v", "meta": {"code": "# COVID-19 Vaccine Dashboard\\n\\nEverywhere you look, you see negative news about COVID-19. This is to be expected; it\'s been a brutal year and this disease is no joke. This dashboard hopes to use visualization to inject some optimism about the coming return to normalcy we enjoyed before 2020! There\'s lots to be optimistic about:\\n\\n- the sheer volume of attempts to fund the R&D needed to produce and bring an effective vaccine to market\\n- the large number of countries involved in at least one vaccine candidate (and the diversity of economic status of these countries)\\n- the diversity of vaccine approaches taken\\n- the fact that 2 vaccines have already been approved (and a hundreds of thousands of patients have already been vaccinated)\\n\\n### The Dataset\\n\\nThis dashboard is powered by data maintained by the Millken Institute ([link to dataset](https://airtable.com/shrSAi6t5WFwqo3GM/tblEzPQS5fnc0FHYR/viwDBH7b6FjmIBX5x?blocks=bipZFzhJ7wHPv7x9z)). We researched each vaccine candidate and added our own best guesses for the country responsible for each vaccine effort.\\n\\n_Note that this dataset was last updated on 12/23/2020_.\\n\\n", "height": 59, "width": 3}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-xSeNAspgw"], "type": "MARKDOWN"}, "ROOT_ID": {"children": ["TABS-wUKya7eQ0Z"], "id": "ROOT_ID", "type": "ROOT"}, "ROW-xSeNAspgw": {"children": ["MARKDOWN-VjQQ5SFj5v", "CHART-aGfmWtliqA", "CHART-RjD_ygqtwH", "CHART-eirDduqb1A"], "id": "ROW-xSeNAspgw", "meta": {"0": "ROOT_ID", "background": "BACKGROUND_TRANSPARENT"}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ"], "type": "ROW"}, "ROW-zhOlQLQnB": {"children": ["CHART-j4hUvP5dDD", "CHART-dCUpAcPsji", "CHART-fYo7IyvKZQ"], "id": "ROW-zhOlQLQnB", "meta": {"0": "ROOT_ID", "background": "BACKGROUND_TRANSPARENT"}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ"], "type": "ROW"}, "ROW-zvw7luvEL": {"children": ["CHART-63bEuxjDMJ", "CHART-F-fkth0Dnv"], "id": "ROW-zvw7luvEL", "meta": {"0": "ROOT_ID", "background": "BACKGROUND_TRANSPARENT"}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ"], "type": "ROW"}, "TAB-BCIJF4NvgQ": {"children": ["ROW-xSeNAspgw", "ROW-zvw7luvEL", "ROW-zhOlQLQnB"], "id": "TAB-BCIJF4NvgQ", "meta": {"text": "Overview"}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z"], "type": "TAB"}, "TABS-wUKya7eQ0Z": {"children": ["TAB-BCIJF4NvgQ"], "id": "TABS-wUKya7eQ0Z", "meta": {}, "parents": ["ROOT_ID"], "type": "TABS"}}', + published: false, + roles: [], + slug: null, + thumbnail_url: + '/api/v1/dashboard/26/thumbnail/b24805e98d90116da8c0974d24f5c533/', + url: '/superset/dashboard/26/', +}; + fetchMock.get('glob:*/api/v1/dashboard/26', { body: { - result: { - certified_by: 'John Doe', - certification_details: 'Sample certification', - changed_by: null, - changed_by_name: '', - changed_by_url: '', - changed_on: '2021-03-30T19:30:14.020942', - charts: [ - 'Vaccine Candidates per Country & Stage', - 'Vaccine Candidates per Country', - 'Vaccine Candidates per Country', - 'Vaccine Candidates per Approach & Stage', - 'Vaccine Candidates per Phase', - 'Vaccine Candidates per Phase', - 'Vaccine Candidates per Country & Stage', - 'Filtering Vaccines', - ], - css: '', - dashboard_title: 'COVID Vaccine Dashboard', - id: 26, - json_metadata: mockedJsonMetadata, - owners: [], - position_json: - '{"CHART-63bEuxjDMJ": {"children": [], "id": "CHART-63bEuxjDMJ", "meta": {"chartId": 369, "height": 76, "sliceName": "Vaccine Candidates per Country", "sliceNameOverride": "Map of Vaccine Candidates", "uuid": "ddc91df6-fb40-4826-bdca-16b85af1c024", "width": 7}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-zvw7luvEL"], "type": "CHART"}, "CHART-F-fkth0Dnv": {"children": [], "id": "CHART-F-fkth0Dnv", "meta": {"chartId": 314, "height": 76, "sliceName": "Vaccine Candidates per Country", "sliceNameOverride": "Treemap of Vaccine Candidates per Country", "uuid": "e2f5a8a7-feb0-4f79-bc6b-01fe55b98b3c", "width": 5}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-zvw7luvEL"], "type": "CHART"}, "CHART-RjD_ygqtwH": {"children": [], "id": "CHART-RjD_ygqtwH", "meta": {"chartId": 351, "height": 59, "sliceName": "Vaccine Candidates per Phase", "sliceNameOverride": "Vaccine Candidates per Phase", "uuid": "30b73c65-85e7-455f-bb24-801bb0cdc670", "width": 2}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-xSeNAspgw"], "type": "CHART"}, "CHART-aGfmWtliqA": {"children": [], "id": "CHART-aGfmWtliqA", "meta": {"chartId": 312, "height": 59, "sliceName": "Vaccine Candidates per Phase", "uuid": "392f293e-0892-4316-bd41-c927b65606a4", "width": 4}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-xSeNAspgw"], "type": "CHART"}, "CHART-dCUpAcPsji": {"children": [], "id": "CHART-dCUpAcPsji", "meta": {"chartId": 325, "height": 82, "sliceName": "Vaccine Candidates per Country & Stage", "sliceNameOverride": "Heatmap of Countries & Clinical Stages", "uuid": "cd111331-d286-4258-9020-c7949a109ed2", "width": 4}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-zhOlQLQnB"], "type": "CHART"}, "CHART-eirDduqb1A": {"children": [], "id": "CHART-eirDduqb1A", "meta": {"chartId": 358, "height": 59, "sliceName": "Filtering Vaccines", "sliceNameOverride": "Filter Box of Vaccines", "uuid": "c29381ce-0e99-4cf3-bf0f-5f55d6b94176", "width": 3}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-xSeNAspgw"], "type": "CHART"}, "CHART-fYo7IyvKZQ": {"children": [], "id": "CHART-fYo7IyvKZQ", "meta": {"chartId": 371, "height": 82, "sliceName": "Vaccine Candidates per Country & Stage", "sliceNameOverride": "Sunburst of Country & Clinical Stages", "uuid": "f69c556f-15fe-4a82-a8bb-69d5b6954123", "width": 5}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-zhOlQLQnB"], "type": "CHART"}, "CHART-j4hUvP5dDD": {"children": [], "id": "CHART-j4hUvP5dDD", "meta": {"chartId": 364, "height": 82, "sliceName": "Vaccine Candidates per Approach & Stage", "sliceNameOverride": "Heatmap of Aproaches & Clinical Stages", "uuid": "0c953c84-0c9a-418d-be9f-2894d2a2cee0", "width": 3}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-zhOlQLQnB"], "type": "CHART"}, "DASHBOARD_VERSION_KEY": "v2", "GRID_ID": {"children": [], "id": "GRID_ID", "parents": ["ROOT_ID"], "type": "GRID"}, "HEADER_ID": {"id": "HEADER_ID", "meta": {"text": "COVID Vaccine Dashboard"}, "type": "HEADER"}, "MARKDOWN-VjQQ5SFj5v": {"children": [], "id": "MARKDOWN-VjQQ5SFj5v", "meta": {"code": "# COVID-19 Vaccine Dashboard\\n\\nEverywhere you look, you see negative news about COVID-19. This is to be expected; it\'s been a brutal year and this disease is no joke. This dashboard hopes to use visualization to inject some optimism about the coming return to normalcy we enjoyed before 2020! There\'s lots to be optimistic about:\\n\\n- the sheer volume of attempts to fund the R&D needed to produce and bring an effective vaccine to market\\n- the large number of countries involved in at least one vaccine candidate (and the diversity of economic status of these countries)\\n- the diversity of vaccine approaches taken\\n- the fact that 2 vaccines have already been approved (and a hundreds of thousands of patients have already been vaccinated)\\n\\n### The Dataset\\n\\nThis dashboard is powered by data maintained by the Millken Institute ([link to dataset](https://airtable.com/shrSAi6t5WFwqo3GM/tblEzPQS5fnc0FHYR/viwDBH7b6FjmIBX5x?blocks=bipZFzhJ7wHPv7x9z)). We researched each vaccine candidate and added our own best guesses for the country responsible for each vaccine effort.\\n\\n_Note that this dataset was last updated on 12/23/2020_.\\n\\n", "height": 59, "width": 3}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ", "ROW-xSeNAspgw"], "type": "MARKDOWN"}, "ROOT_ID": {"children": ["TABS-wUKya7eQ0Z"], "id": "ROOT_ID", "type": "ROOT"}, "ROW-xSeNAspgw": {"children": ["MARKDOWN-VjQQ5SFj5v", "CHART-aGfmWtliqA", "CHART-RjD_ygqtwH", "CHART-eirDduqb1A"], "id": "ROW-xSeNAspgw", "meta": {"0": "ROOT_ID", "background": "BACKGROUND_TRANSPARENT"}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ"], "type": "ROW"}, "ROW-zhOlQLQnB": {"children": ["CHART-j4hUvP5dDD", "CHART-dCUpAcPsji", "CHART-fYo7IyvKZQ"], "id": "ROW-zhOlQLQnB", "meta": {"0": "ROOT_ID", "background": "BACKGROUND_TRANSPARENT"}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ"], "type": "ROW"}, "ROW-zvw7luvEL": {"children": ["CHART-63bEuxjDMJ", "CHART-F-fkth0Dnv"], "id": "ROW-zvw7luvEL", "meta": {"0": "ROOT_ID", "background": "BACKGROUND_TRANSPARENT"}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z", "TAB-BCIJF4NvgQ"], "type": "ROW"}, "TAB-BCIJF4NvgQ": {"children": ["ROW-xSeNAspgw", "ROW-zvw7luvEL", "ROW-zhOlQLQnB"], "id": "TAB-BCIJF4NvgQ", "meta": {"text": "Overview"}, "parents": ["ROOT_ID", "TABS-wUKya7eQ0Z"], "type": "TAB"}, "TABS-wUKya7eQ0Z": {"children": ["TAB-BCIJF4NvgQ"], "id": "TABS-wUKya7eQ0Z", "meta": {}, "parents": ["ROOT_ID"], "type": "TABS"}}', - published: false, - roles: [], - slug: null, - thumbnail_url: - '/api/v1/dashboard/26/thumbnail/b24805e98d90116da8c0974d24f5c533/', - url: '/superset/dashboard/26/', - }, + result: { ...dashboardInfo, json_metadata: mockedJsonMetadata }, }, }); @@ -262,6 +276,7 @@ test('submitting with onlyApply:false', async () => { ); spyGetCategoricalSchemeRegistry.mockReturnValue({ keys: () => ['supersetColors'], + get: () => ['#FFFFFF', '#000000'], } as any); put.mockResolvedValue({ json: { @@ -289,13 +304,12 @@ test('submitting with onlyApply:false', async () => { userEvent.click(screen.getByRole('button', { name: 'Save' })); await waitFor(() => { - expect(props.onHide).toBeCalledTimes(1); expect(props.onSubmit).toBeCalledTimes(1); expect(props.onSubmit).toBeCalledWith({ certificationDetails: 'Sample certification', certifiedBy: 'John Doe', colorScheme: 'supersetColors', - colorNamespace: '', + colorNamespace: undefined, id: 26, jsonMetadata: expect.anything(), owners: [], @@ -312,6 +326,7 @@ test('submitting with onlyApply:true', async () => { ); spyGetCategoricalSchemeRegistry.mockReturnValue({ keys: () => ['supersetColors'], + get: () => ['#FFFFFF', '#000000'], } as any); spyIsFeatureEnabled.mockReturnValue(false); const props = createProps(); @@ -328,7 +343,6 @@ test('submitting with onlyApply:true', async () => { userEvent.click(screen.getByRole('button', { name: 'Apply' })); await waitFor(() => { - expect(props.onHide).toBeCalledTimes(1); expect(props.onSubmit).toBeCalledTimes(1); }); }); @@ -347,3 +361,102 @@ test('Empty "Certified by" should clear "Certification details"', async () => { screen.getByRole('textbox', { name: 'Certification details' }), ).toHaveValue(''); }); + +test('should show all roles', async () => { + spyIsFeatureEnabled.mockReturnValue(true); + + const props = createProps(); + const propsWithDashboardIndo = { ...props, dashboardInfo }; + + const open = () => waitFor(() => userEvent.click(getSelect())); + const getSelect = () => + screen.getByRole('combobox', { name: SupersetCore.t('Roles') }); + + const getElementsByClassName = (className: string) => + document.querySelectorAll(className)! as NodeListOf<HTMLElement>; + + const findAllSelectOptions = () => + waitFor(() => getElementsByClassName('.ant-select-item-option-content')); + + render(<PropertiesModal {...propsWithDashboardIndo} />, { + useRedux: true, + }); + + expect(screen.getAllByRole('combobox')).toHaveLength(2); + expect( + screen.getByRole('combobox', { name: SupersetCore.t('Roles') }), + ).toBeInTheDocument(); + + await open(); + + const options = await findAllSelectOptions(); + + expect(options).toHaveLength(6); + expect(options[0]).toHaveTextContent('Admin'); +}); + +test('should show active owners with dashboard rbac', async () => { + spyIsFeatureEnabled.mockReturnValue(true); + + const props = createProps(); + const propsWithDashboardIndo = { ...props, dashboardInfo }; + + const open = () => waitFor(() => userEvent.click(getSelect())); + const getSelect = () => + screen.getByRole('combobox', { name: SupersetCore.t('Owners') }); + + const getElementsByClassName = (className: string) => + document.querySelectorAll(className)! as NodeListOf<HTMLElement>; + + const findAllSelectOptions = () => + waitFor(() => getElementsByClassName('.ant-select-item-option-content')); + + render(<PropertiesModal {...propsWithDashboardIndo} />, { + useRedux: true, + }); + + expect(screen.getAllByRole('combobox')).toHaveLength(2); + expect( + screen.getByRole('combobox', { name: SupersetCore.t('Owners') }), + ).toBeInTheDocument(); + + await open(); + + const options = await findAllSelectOptions(); + + expect(options).toHaveLength(1); + expect(options[0]).toHaveTextContent('Superset Admin'); +}); + +test('should show active owners without dashboard rbac', async () => { + spyIsFeatureEnabled.mockReturnValue(false); + + const props = createProps(); + const propsWithDashboardIndo = { ...props, dashboardInfo }; + + const open = () => waitFor(() => userEvent.click(getSelect())); + const getSelect = () => + screen.getByRole('combobox', { name: SupersetCore.t('Owners') }); + + const getElementsByClassName = (className: string) => + document.querySelectorAll(className)! as NodeListOf<HTMLElement>; + + const findAllSelectOptions = () => + waitFor(() => getElementsByClassName('.ant-select-item-option-content')); + + render(<PropertiesModal {...propsWithDashboardIndo} />, { + useRedux: true, + }); + + expect(screen.getByRole('combobox')).toBeInTheDocument(); + expect( + screen.getByRole('combobox', { name: SupersetCore.t('Owners') }), + ).toBeInTheDocument(); + + await open(); + + const options = await findAllSelectOptions(); + + expect(options).toHaveLength(1); + expect(options[0]).toHaveTextContent('Superset Admin'); +}); diff --git a/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx b/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx index effd18b3d07c..59eca184085d 100644 --- a/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx +++ b/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx @@ -21,21 +21,23 @@ import { Input } from 'src/components/Input'; import { FormItem } from 'src/components/Form'; import jsonStringify from 'json-stringify-pretty-compact'; import Button from 'src/components/Button'; -import { Select, Row, Col, AntdForm } from 'src/components'; +import { AntdForm, AsyncSelect, Col, Row } from 'src/components'; import rison from 'rison'; import { - styled, - t, - SupersetClient, - getCategoricalSchemeRegistry, + CategoricalColorNamespace, ensureIsArray, + getCategoricalSchemeRegistry, getSharedLabelColor, + styled, + SupersetClient, + t, } from '@superset-ui/core'; import Modal from 'src/components/Modal'; import { JsonEditor } from 'src/components/AsyncAceEditor'; import ColorSchemeControlWrapper from 'src/dashboard/components/ColorSchemeControlWrapper'; +import FilterScopeModal from 'src/dashboard/components/filterscope/FilterScopeModal'; import { getClientErrorObject } from 'src/utils/getClientErrorObject'; import withToasts from 'src/components/MessageToasts/withToasts'; import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; @@ -56,9 +58,9 @@ type PropertiesModalProps = { show?: boolean; onHide?: () => void; colorScheme?: string; - setColorSchemeAndUnsavedChanges?: () => void; onSubmit?: (params: Record<string, any>) => void; addSuccessToast: (message: string) => void; + addDangerToast: (message: string) => void; onlyApply?: boolean; }; @@ -80,6 +82,7 @@ type DashboardInfo = { const PropertiesModal = ({ addSuccessToast, + addDangerToast, colorScheme: currentColorScheme, dashboardId, dashboardInfo: currentDashboardInfo, @@ -98,6 +101,7 @@ const PropertiesModal = ({ const [owners, setOwners] = useState<Owners>([]); const [roles, setRoles] = useState<Roles>([]); const saveLabel = onlyApply ? t('Apply') : t('Save'); + const categoricalSchemeRegistry = getCategoricalSchemeRegistry(); const handleErrorResponse = async (response: Response) => { const { error, statusText, message } = await getClientErrorObject(response); @@ -113,7 +117,7 @@ const PropertiesModal = ({ } Modal.error({ - title: 'Error', + title: t('Error'), content: errorText, okButtonProps: { danger: true, className: 'btn-danger' }, }); @@ -129,12 +133,14 @@ const PropertiesModal = ({ return SupersetClient.get({ endpoint: `/api/v1/dashboard/related/${accessType}?q=${query}`, }).then(response => ({ - data: response.json.result.map( - (item: { value: number; text: string }) => ({ + data: response.json.result + .filter((item: { extra: { active: boolean } }) => + item.extra.active !== undefined ? item.extra.active : true, + ) + .map((item: { value: number; text: string }) => ({ value: item.value, label: item.text, - }), - ), + })), totalCount: response.json.count, })); }, @@ -174,9 +180,11 @@ const PropertiesModal = ({ delete metadata.positions; } const metaDataCopy = { ...metadata }; - if (metaDataCopy?.shared_label_colors) { - delete metaDataCopy.shared_label_colors; - } + + delete metaDataCopy.shared_label_colors; + + delete metaDataCopy.color_scheme_domain; + setJsonMetadata(metaDataCopy ? jsonStringify(metaDataCopy) : ''); }, [form], @@ -258,17 +266,17 @@ const PropertiesModal = ({ }; const onColorSchemeChange = ( - colorScheme?: string, + colorScheme = '', { updateMetadata = true } = {}, ) => { // check that color_scheme is valid - const colorChoices = getCategoricalSchemeRegistry().keys(); + const colorChoices = categoricalSchemeRegistry.keys(); const jsonMetadataObj = getJsonMetadata(); // only fire if the color_scheme is present and invalid if (colorScheme && !colorChoices.includes(colorScheme)) { Modal.error({ - title: 'Error', + title: t('Error'), content: t('A valid color scheme is required'), okButtonProps: { danger: true, className: 'btn-danger' }, }); @@ -292,25 +300,52 @@ const PropertiesModal = ({ let colorNamespace = ''; let currentJsonMetadata = jsonMetadata; - // color scheme in json metadata has precedence over selection - if (currentJsonMetadata?.length) { - const metadata = JSON.parse(currentJsonMetadata); - currentColorScheme = metadata?.color_scheme || colorScheme; - colorNamespace = metadata?.color_namespace || ''; - - // filter shared_label_color from user input - if (metadata?.shared_label_colors) { - delete metadata.shared_label_colors; + // validate currentJsonMetadata + let metadata; + try { + if ( + !currentJsonMetadata.startsWith('{') || + !currentJsonMetadata.endsWith('}') + ) { + throw new Error(); } - const colorMap = getSharedLabelColor().getColorMap( - colorNamespace, - currentColorScheme, - true, + metadata = JSON.parse(currentJsonMetadata); + } catch (error) { + addDangerToast(t('JSON metadata is invalid!')); + return; + } + + // color scheme in json metadata has precedence over selection + currentColorScheme = metadata?.color_scheme || colorScheme; + colorNamespace = metadata?.color_namespace; + + // filter shared_label_color from user input + if (metadata?.shared_label_colors) { + delete metadata.shared_label_colors; + } + if (metadata?.color_scheme_domain) { + delete metadata.color_scheme_domain; + } + + const sharedLabelColor = getSharedLabelColor(); + const categoricalNamespace = + CategoricalColorNamespace.getNamespace(colorNamespace); + categoricalNamespace.resetColors(); + if (currentColorScheme) { + sharedLabelColor.updateColorMap(colorNamespace, currentColorScheme); + metadata.shared_label_colors = Object.fromEntries( + sharedLabelColor.getColorMap(), ); - metadata.shared_label_colors = colorMap; - currentJsonMetadata = jsonStringify(metadata); + metadata.color_scheme_domain = + categoricalSchemeRegistry.get(colorScheme)?.colors || []; + } else { + sharedLabelColor.reset(); + metadata.shared_label_colors = {}; + metadata.color_scheme_domain = []; } + currentJsonMetadata = jsonStringify(metadata); + onColorSchemeChange(currentColorScheme, { updateMetadata: false, }); @@ -334,9 +369,9 @@ const PropertiesModal = ({ ...moreOnSubmitProps, }; if (onlyApply) { - addSuccessToast(t('Dashboard properties updated')); onSubmit(onSubmitProps); onHide(); + addSuccessToast(t('Dashboard properties updated')); } else { SupersetClient.put({ endpoint: `/api/v1/dashboard/${dashboardId}`, @@ -352,9 +387,9 @@ const PropertiesModal = ({ ...morePutProps, }), }).then(() => { - addSuccessToast(t('The dashboard has been saved')); onSubmit(onSubmitProps); onHide(); + addSuccessToast(t('The dashboard has been saved')); }, handleErrorResponse); } }; @@ -370,7 +405,7 @@ const PropertiesModal = ({ <Col xs={24} md={12}> <h3 style={{ marginTop: '1em' }}>{t('Access')}</h3> <StyledFormItem label={t('Owners')}> - <Select + <AsyncSelect allowClear ariaLabel={t('Owners')} disabled={isLoading} @@ -417,7 +452,7 @@ const PropertiesModal = ({ <Row gutter={16}> <Col xs={24} md={12}> <StyledFormItem label={t('Owners')}> - <Select + <AsyncSelect allowClear ariaLabel={t('Owners')} disabled={isLoading} @@ -437,7 +472,7 @@ const PropertiesModal = ({ </Col> <Col xs={24} md={12}> <StyledFormItem label={t('Roles')}> - <Select + <AsyncSelect allowClear ariaLabel={t('Roles')} disabled={isLoading} @@ -513,6 +548,7 @@ const PropertiesModal = ({ {t('Cancel')} </Button> <Button + data-test="properties-modal-apply-button" onClick={form.submit} buttonSize="small" buttonStyle="primary" @@ -625,6 +661,23 @@ const PropertiesModal = ({ {t( 'This JSON object is generated dynamically when clicking the save or overwrite button in the dashboard view. It is exposed here for reference and for power users who may want to alter specific parameters.', )} + {onlyApply && ( + <> + {' '} + {t( + 'Please DO NOT overwrite the "filter_scopes" key.', + )}{' '} + <FilterScopeModal + triggerNode={ + <span className="alert-link"> + {t('Use "%(menuName)s" menu instead.', { + menuName: t('Set filter mapping'), + })} + </span> + } + /> + </> + )} </p> </> )} diff --git a/superset-frontend/src/dashboard/components/PublishedStatus/index.jsx b/superset-frontend/src/dashboard/components/PublishedStatus/index.jsx index 915ea0aecc96..490112e9c88d 100644 --- a/superset-frontend/src/dashboard/components/PublishedStatus/index.jsx +++ b/superset-frontend/src/dashboard/components/PublishedStatus/index.jsx @@ -23,11 +23,11 @@ import { Tooltip } from 'src/components/Tooltip'; import Label from 'src/components/Label'; const propTypes = { - dashboardId: PropTypes.number.isRequired, + dashboardId: PropTypes.number, isPublished: PropTypes.bool.isRequired, savePublished: PropTypes.func.isRequired, - canEdit: PropTypes.bool.isRequired, - canSave: PropTypes.bool.isRequired, + canEdit: PropTypes.bool, + canSave: PropTypes.bool, }; const draftButtonTooltip = t( diff --git a/superset-frontend/src/dashboard/components/RefreshIntervalModal.test.tsx b/superset-frontend/src/dashboard/components/RefreshIntervalModal.test.tsx index 9151275e800d..aad254d9ceb4 100644 --- a/superset-frontend/src/dashboard/components/RefreshIntervalModal.test.tsx +++ b/superset-frontend/src/dashboard/components/RefreshIntervalModal.test.tsx @@ -41,6 +41,7 @@ describe('RefreshIntervalModal - Enzyme', () => { refreshFrequency: 10, onChange: jest.fn(), editMode: true, + refreshIntervalOptions: [], }; it('should show warning message', () => { const props = { @@ -78,7 +79,20 @@ const createProps = () => ({ userId: '1', metadata: {}, common: { - conf: {}, + conf: { + DASHBOARD_AUTO_REFRESH_INTERVALS: [ + [0, "Don't refresh"], + [10, '10 seconds'], + [30, '30 seconds'], + [60, '1 minute'], + [300, '5 minutes'], + [1800, '30 minutes'], + [3600, '1 hour'], + [21600, '6 hours'], + [43200, '12 hours'], + [86400, '24 hours'], + ], + }, }, }, dashboardTitle: 'Title', @@ -133,6 +147,7 @@ const defaultRefreshIntervalModalProps = { onChange: jest.fn(), editMode: true, addSuccessToast: jest.fn(), + refreshIntervalOptions: [], }; describe('RefreshIntervalModal - RTL', () => { diff --git a/superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx b/superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx index 896792ceebf6..6299b09c539a 100644 --- a/superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx +++ b/superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx @@ -16,27 +16,15 @@ * specific language governing permissions and limitations * under the License. */ -import React, { RefObject } from 'react'; -import Select, { propertyComparator } from 'src/components/Select/Select'; +import React from 'react'; +import Select from 'src/components/Select/Select'; import { t, styled } from '@superset-ui/core'; import Alert from 'src/components/Alert'; import Button from 'src/components/Button'; -import ModalTrigger from 'src/components/ModalTrigger'; +import ModalTrigger, { ModalTriggerRef } from 'src/components/ModalTrigger'; import { FormLabel } from 'src/components/Form'; - -export const options = [ - [0, t("Don't refresh")], - [10, t('10 seconds')], - [30, t('30 seconds')], - [60, t('1 minute')], - [300, t('5 minutes')], - [1800, t('30 minutes')], - [3600, t('1 hour')], - [21600, t('6 hours')], - [43200, t('12 hours')], - [86400, t('24 hours')], -].map(o => ({ value: o[0] as number, label: o[1] })); +import { propertyComparator } from 'src/components/Select/utils'; const StyledModalTrigger = styled(ModalTrigger)` .ant-modal-body { @@ -56,6 +44,7 @@ type RefreshIntervalModalProps = { editMode: boolean; refreshLimit?: number; refreshWarning: string | null; + refreshIntervalOptions: [number, string][]; }; type RefreshIntervalModalState = { @@ -71,11 +60,11 @@ class RefreshIntervalModal extends React.PureComponent< refreshWarning: null, }; - modalRef: RefObject<ModalTrigger>; + modalRef: ModalTriggerRef | null; constructor(props: RefreshIntervalModalProps) { super(props); - this.modalRef = React.createRef(); + this.modalRef = React.createRef() as ModalTriggerRef; this.state = { refreshFrequency: props.refreshFrequency, }; @@ -86,7 +75,7 @@ class RefreshIntervalModal extends React.PureComponent< onSave() { this.props.onChange(this.state.refreshFrequency, this.props.editMode); - this.modalRef.current?.close(); + this.modalRef?.current?.close(); this.props.addSuccessToast(t('Refresh interval saved')); } @@ -94,17 +83,23 @@ class RefreshIntervalModal extends React.PureComponent< this.setState({ refreshFrequency: this.props.refreshFrequency, }); - this.modalRef.current?.close(); + this.modalRef?.current?.close(); } handleFrequencyChange(value: number) { + const { refreshIntervalOptions } = this.props; this.setState({ - refreshFrequency: value || options[0].value, + refreshFrequency: value || refreshIntervalOptions[0][0], }); } render() { - const { refreshLimit = 0, refreshWarning, editMode } = this.props; + const { + refreshLimit = 0, + refreshWarning, + editMode, + refreshIntervalOptions, + } = this.props; const { refreshFrequency = 0 } = this.state; const showRefreshWarning = !!refreshFrequency && !!refreshWarning && refreshFrequency < refreshLimit; @@ -119,7 +114,10 @@ class RefreshIntervalModal extends React.PureComponent< <FormLabel>{t('Refresh frequency')}</FormLabel> <Select ariaLabel={t('Refresh interval')} - options={options} + options={refreshIntervalOptions.map(option => ({ + value: option[0], + label: t(option[1]), + }))} value={refreshFrequency} onChange={this.handleFrequencyChange} sortComparator={propertyComparator('value')} diff --git a/superset-frontend/src/dashboard/components/SaveModal.tsx b/superset-frontend/src/dashboard/components/SaveModal.tsx index 913125a16800..dbdcb7b55200 100644 --- a/superset-frontend/src/dashboard/components/SaveModal.tsx +++ b/superset-frontend/src/dashboard/components/SaveModal.tsx @@ -24,7 +24,7 @@ import { Input } from 'src/components/Input'; import Button from 'src/components/Button'; import { t, JsonResponse } from '@superset-ui/core'; -import ModalTrigger from 'src/components/ModalTrigger'; +import ModalTrigger, { ModalTriggerRef } from 'src/components/ModalTrigger'; import Checkbox from 'src/components/Checkbox'; import { SAVE_TYPE_OVERWRITE, @@ -69,7 +69,7 @@ const defaultProps = { class SaveModal extends React.PureComponent<SaveModalProps, SaveModalState> { static defaultProps = defaultProps; - modal: ModalTrigger | null; + modal: ModalTriggerRef | null; onSave: ( data: Record<string, any>, @@ -81,20 +81,16 @@ class SaveModal extends React.PureComponent<SaveModalProps, SaveModalState> { super(props); this.state = { saveType: props.saveType, - newDashName: `${props.dashboardTitle} [copy]`, + newDashName: props.dashboardTitle + t('[copy]'), duplicateSlices: false, }; - this.modal = null; + this.handleSaveTypeChange = this.handleSaveTypeChange.bind(this); this.handleNameChange = this.handleNameChange.bind(this); this.saveDashboard = this.saveDashboard.bind(this); - this.setModalRef = this.setModalRef.bind(this); this.toggleDuplicateSlices = this.toggleDuplicateSlices.bind(this); this.onSave = this.props.onSave.bind(this); - } - - setModalRef(ref: ModalTrigger | null) { - this.modal = ref; + this.modal = React.createRef() as ModalTriggerRef; } toggleDuplicateSlices(): void { @@ -166,14 +162,14 @@ class SaveModal extends React.PureComponent<SaveModalProps, SaveModalState> { window.location.href = `/superset/dashboard/${resp.json.id}/`; } }); - this.modal?.close(); + this.modal?.current?.close?.(); } } render() { return ( <ModalTrigger - ref={this.setModalRef} + ref={this.modal} triggerNode={this.props.triggerNode} modalTitle={t('Save dashboard')} modalBody={ diff --git a/superset-frontend/src/dashboard/components/SliceAdder.jsx b/superset-frontend/src/dashboard/components/SliceAdder.jsx index 22f8038ee494..55db08cd86ac 100644 --- a/superset-frontend/src/dashboard/components/SliceAdder.jsx +++ b/superset-frontend/src/dashboard/components/SliceAdder.jsx @@ -19,7 +19,8 @@ /* eslint-env browser */ import React from 'react'; import PropTypes from 'prop-types'; -import { List } from 'react-virtualized'; +import AutoSizer from 'react-virtualized-auto-sizer'; +import { FixedSizeList as List } from 'react-window'; import { createFilter } from 'react-search-input'; import { t, @@ -43,6 +44,7 @@ import { } from 'src/dashboard/util/constants'; import { slicePropShape } from 'src/dashboard/util/propShapes'; import { FILTER_BOX_MIGRATION_STATES } from 'src/explore/constants'; +import _ from 'lodash'; import AddSliceCard from './AddSliceCard'; import AddSliceDragPreview from './dnd/AddSliceDragPreview'; import DragDroppable from './dnd/DragDroppable'; @@ -56,7 +58,6 @@ const propTypes = { userId: PropTypes.string.isRequired, selectedSliceIds: PropTypes.arrayOf(PropTypes.number), editMode: PropTypes.bool, - height: PropTypes.number, filterboxMigrationState: FILTER_BOX_MIGRATION_STATES, dashboardId: PropTypes.number, }; @@ -65,24 +66,20 @@ const defaultProps = { selectedSliceIds: [], editMode: false, errorMessage: '', - height: window.innerHeight, filterboxMigrationState: FILTER_BOX_MIGRATION_STATES.NOOP, }; const KEYS_TO_FILTERS = ['slice_name', 'viz_type', 'datasource_name']; const KEYS_TO_SORT = { - slice_name: 'name', - viz_type: 'viz type', - datasource_name: 'dataset', - changed_on: 'recent', + slice_name: t('name'), + viz_type: t('viz type'), + datasource_name: t('dataset'), + changed_on: t('recent'), }; const DEFAULT_SORT_KEY = 'changed_on'; -const MARGIN_BOTTOM = 16; -const SIDEPANE_HEADER_HEIGHT = 30; -const SLICE_ADDER_CONTROL_HEIGHT = 64; -const DEFAULT_CELL_HEIGHT = 112; +const DEFAULT_CELL_HEIGHT = 128; const Controls = styled.div` display: flex; @@ -118,6 +115,11 @@ const NewChartButton = styled(Button)` `} `; +export const ChartList = styled.div` + flex-grow: 1; + min-height: 0; +`; + class SliceAdder extends React.Component { static sortByComparator(attr) { const desc = attr === 'changed_on' ? -1 : 1; @@ -144,7 +146,6 @@ class SliceAdder extends React.Component { this.rowRenderer = this.rowRenderer.bind(this); this.searchUpdated = this.searchUpdated.bind(this); this.handleKeyPress = this.handleKeyPress.bind(this); - this.handleChange = this.handleChange.bind(this); this.handleSelect = this.handleSelect.bind(this); } @@ -194,9 +195,17 @@ class SliceAdder extends React.Component { } } - handleChange(ev) { - this.searchUpdated(ev.target.value); - } + handleChange = _.debounce(value => { + this.searchUpdated(value); + + const { userId, filterboxMigrationState } = this.props; + this.slicesRequest = this.props.fetchFilteredSlices( + userId, + isFeatureEnabled(FeatureFlag.ENABLE_FILTER_BOX_MIGRATION) && + filterboxMigrationState !== FILTER_BOX_MIGRATION_STATES.SNOOZED, + value, + ); + }, 300); searchUpdated(searchTerm) { this.setState(prevState => ({ @@ -216,6 +225,14 @@ class SliceAdder extends React.Component { sortBy, ), })); + + const { userId, filterboxMigrationState } = this.props; + this.slicesRequest = this.props.fetchSortedSlices( + userId, + isFeatureEnabled(FeatureFlag.ENABLE_FILTER_BOX_MIGRATION) && + filterboxMigrationState !== FILTER_BOX_MIGRATION_STATES.SNOOZED, + sortBy, + ); } rowRenderer({ key, index, style }) { @@ -257,6 +274,7 @@ class SliceAdder extends React.Component { visType={cellData.viz_type} datasourceUrl={cellData.datasource_url} datasourceName={cellData.datasource_name} + thumbnailUrl={cellData.thumbnail_url} isSelected={isSelected} /> )} @@ -265,13 +283,14 @@ class SliceAdder extends React.Component { } render() { - const slicesListHeight = - this.props.height - - SIDEPANE_HEADER_HEIGHT - - SLICE_ADDER_CONTROL_HEIGHT - - MARGIN_BOTTOM; return ( - <div className="slice-adder-container"> + <div + css={css` + height: 100%; + display: flex; + flex-direction: column; + `} + > <NewChartButtonContainer> <NewChartButton buttonStyle="link" @@ -292,7 +311,7 @@ class SliceAdder extends React.Component { <Input placeholder={t('Filter your charts')} className="search-input" - onChange={this.handleChange} + onChange={ev => this.handleChange(ev.target.value)} onKeyPress={this.handleKeyPress} data-test="dashboard-charts-filter-search-input" /> @@ -309,19 +328,32 @@ class SliceAdder extends React.Component { </Controls> {this.props.isLoading && <Loading />} {!this.props.isLoading && this.state.filteredSlices.length > 0 && ( - <List - width={376} - height={slicesListHeight} - rowCount={this.state.filteredSlices.length} - rowHeight={DEFAULT_CELL_HEIGHT} - rowRenderer={this.rowRenderer} - searchTerm={this.state.searchTerm} - sortBy={this.state.sortBy} - selectedSliceIds={this.props.selectedSliceIds} - /> + <ChartList> + <AutoSizer> + {({ height, width }) => ( + <List + width={width} + height={height} + itemCount={this.state.filteredSlices.length} + itemSize={DEFAULT_CELL_HEIGHT} + searchTerm={this.state.searchTerm} + sortBy={this.state.sortBy} + selectedSliceIds={this.props.selectedSliceIds} + > + {this.rowRenderer} + </List> + )} + </AutoSizer> + </ChartList> )} {this.props.errorMessage && ( - <div className="error-message">{this.props.errorMessage}</div> + <div + css={css` + padding: 16px; + `} + > + {this.props.errorMessage} + </div> )} {/* Drag preview is just a single fixed-position element */} <AddSliceDragPreview slices={this.state.filteredSlices} /> diff --git a/superset-frontend/src/dashboard/components/SliceAdder.test.jsx b/superset-frontend/src/dashboard/components/SliceAdder.test.jsx index 16703d0505ce..72327d63c7ab 100644 --- a/superset-frontend/src/dashboard/components/SliceAdder.test.jsx +++ b/superset-frontend/src/dashboard/components/SliceAdder.test.jsx @@ -20,10 +20,9 @@ import React from 'react'; import { shallow } from 'enzyme'; import sinon from 'sinon'; -import { List } from 'react-virtualized'; - -import SliceAdder from 'src/dashboard/components/SliceAdder'; +import SliceAdder, { ChartList } from 'src/dashboard/components/SliceAdder'; import { sliceEntitiesForDashboard as mockSliceEntities } from 'spec/fixtures/mockSliceEntities'; +import { styledShallow } from 'spec/helpers/theming'; describe('SliceAdder', () => { const mockEvent = { @@ -36,9 +35,9 @@ describe('SliceAdder', () => { const props = { ...mockSliceEntities, fetchAllSlices: () => {}, + fetchSortedSlices: () => {}, selectedSliceIds: [127, 128], userId: '1', - height: 100, }; const errorProps = { ...props, @@ -71,10 +70,10 @@ describe('SliceAdder', () => { }); }); - it('render List', () => { - const wrapper = shallow(<SliceAdder {...props} />); + it('render chart list', () => { + const wrapper = styledShallow(<SliceAdder {...props} />); wrapper.setState({ filteredSlices: Object.values(props.slices) }); - expect(wrapper.find(List)).toExist(); + expect(wrapper.find(ChartList)).toExist(); }); it('render error', () => { diff --git a/superset-frontend/src/dashboard/components/SliceHeader/SliceHeader.test.tsx b/superset-frontend/src/dashboard/components/SliceHeader/SliceHeader.test.tsx index ffee7f6ee465..f1aacd79e087 100644 --- a/superset-frontend/src/dashboard/components/SliceHeader/SliceHeader.test.tsx +++ b/superset-frontend/src/dashboard/components/SliceHeader/SliceHeader.test.tsx @@ -17,6 +17,8 @@ * under the License. */ import React from 'react'; +import { Router } from 'react-router-dom'; +import { createMemoryHistory } from 'history'; import { render, screen } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; import SliceHeader from '.'; @@ -115,7 +117,7 @@ const createProps = (overrides: any = {}) => ({ sliceCanEdit: false, slice: { slice_id: 312, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20312%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20312%7D', slice_name: 'Vaccine Candidates per Phase', form_data: { adhoc_filters: [], @@ -154,8 +156,8 @@ const createProps = (overrides: any = {}) => ({ toggleExpandSlice: jest.fn(), forceRefresh: jest.fn(), logExploreChart: jest.fn(), + logEvent: jest.fn(), exportCSV: jest.fn(), - onExploreChart: jest.fn(), formData: { slice_id: 1, datasource: '58__table' }, width: 100, height: 100, @@ -164,7 +166,7 @@ const createProps = (overrides: any = {}) => ({ test('Should render', () => { const props = createProps(); - render(<SliceHeader {...props} />, { useRedux: true }); + render(<SliceHeader {...props} />, { useRedux: true, useRouter: true }); expect(screen.getByTestId('slice-header')).toBeInTheDocument(); }); @@ -206,7 +208,7 @@ test('Should render - default props', () => { // @ts-ignore delete props.sliceCanEdit; - render(<SliceHeader {...props} />, { useRedux: true }); + render(<SliceHeader {...props} />, { useRedux: true, useRouter: true }); expect(screen.getByTestId('slice-header')).toBeInTheDocument(); }); @@ -248,7 +250,7 @@ test('Should render default props and "call" actions', () => { // @ts-ignore delete props.sliceCanEdit; - render(<SliceHeader {...props} />, { useRedux: true }); + render(<SliceHeader {...props} />, { useRedux: true, useRouter: true }); userEvent.click(screen.getByTestId('toggleExpandSlice')); userEvent.click(screen.getByTestId('forceRefresh')); userEvent.click(screen.getByTestId('exploreChart')); @@ -261,27 +263,69 @@ test('Should render default props and "call" actions', () => { test('Should render title', () => { const props = createProps(); - render(<SliceHeader {...props} />, { useRedux: true }); + render(<SliceHeader {...props} />, { useRedux: true, useRouter: true }); expect(screen.getByText('Vaccine Candidates per Phase')).toBeInTheDocument(); }); test('Should render click to edit prompt and run onExploreChart on click', async () => { const props = createProps(); - render(<SliceHeader {...props} />, { useRedux: true }); + const history = createMemoryHistory({ + initialEntries: ['/superset/dashboard/1/'], + }); + render( + <Router history={history}> + <SliceHeader {...props} /> + </Router>, + { useRedux: true }, + ); + userEvent.hover(screen.getByText('Vaccine Candidates per Phase')); + expect( + await screen.findByText('Click to edit Vaccine Candidates per Phase.'), + ).toBeInTheDocument(); + expect( + await screen.findByText('Use ctrl + click to open in a new tab.'), + ).toBeInTheDocument(); + + userEvent.click(screen.getByText('Vaccine Candidates per Phase')); + expect(history.location.pathname).toMatch('/explore'); +}); + +test('Display cmd button in tooltip if running on MacOS', async () => { + jest.spyOn(window.navigator, 'appVersion', 'get').mockReturnValue('Mac'); + const props = createProps(); + render(<SliceHeader {...props} />, { useRedux: true, useRouter: true }); + userEvent.hover(screen.getByText('Vaccine Candidates per Phase')); + expect( + await screen.findByText('Click to edit Vaccine Candidates per Phase.'), + ).toBeInTheDocument(); + expect( + await screen.findByText('Use ⌘ + click to open in a new tab.'), + ).toBeInTheDocument(); +}); + +test('Display correct tooltip when DASHBOARD_EDIT_CHART_IN_NEW_TAB is enabled', async () => { + window.featureFlags.DASHBOARD_EDIT_CHART_IN_NEW_TAB = true; + const props = createProps(); + render(<SliceHeader {...props} />, { useRedux: true, useRouter: true }); userEvent.hover(screen.getByText('Vaccine Candidates per Phase')); expect( await screen.findByText( 'Click to edit Vaccine Candidates per Phase in a new tab', ), ).toBeInTheDocument(); - - userEvent.click(screen.getByText('Vaccine Candidates per Phase')); - expect(props.onExploreChart).toHaveBeenCalled(); }); test('Should not render click to edit prompt and run onExploreChart on click if supersetCanExplore=false', () => { const props = createProps({ supersetCanExplore: false }); - render(<SliceHeader {...props} />, { useRedux: true }); + const history = createMemoryHistory({ + initialEntries: ['/superset/dashboard/1/'], + }); + render( + <Router history={history}> + <SliceHeader {...props} /> + </Router>, + { useRedux: true }, + ); userEvent.hover(screen.getByText('Vaccine Candidates per Phase')); expect( screen.queryByText( @@ -290,12 +334,20 @@ test('Should not render click to edit prompt and run onExploreChart on click if ).not.toBeInTheDocument(); userEvent.click(screen.getByText('Vaccine Candidates per Phase')); - expect(props.onExploreChart).not.toHaveBeenCalled(); + expect(history.location.pathname).toMatch('/superset/dashboard'); }); test('Should not render click to edit prompt and run onExploreChart on click if in edit mode', () => { const props = createProps({ editMode: true }); - render(<SliceHeader {...props} />, { useRedux: true }); + const history = createMemoryHistory({ + initialEntries: ['/superset/dashboard/1/'], + }); + render( + <Router history={history}> + <SliceHeader {...props} /> + </Router>, + { useRedux: true }, + ); userEvent.hover(screen.getByText('Vaccine Candidates per Phase')); expect( screen.queryByText( @@ -304,12 +356,12 @@ test('Should not render click to edit prompt and run onExploreChart on click if ).not.toBeInTheDocument(); userEvent.click(screen.getByText('Vaccine Candidates per Phase')); - expect(props.onExploreChart).not.toHaveBeenCalled(); + expect(history.location.pathname).toMatch('/superset/dashboard'); }); test('Should render "annotationsLoading"', () => { const props = createProps(); - render(<SliceHeader {...props} />, { useRedux: true }); + render(<SliceHeader {...props} />, { useRedux: true, useRouter: true }); expect( screen.getByRole('img', { name: 'Annotation layers are still loading.', @@ -319,7 +371,7 @@ test('Should render "annotationsLoading"', () => { test('Should render "annotationsError"', () => { const props = createProps(); - render(<SliceHeader {...props} />, { useRedux: true }); + render(<SliceHeader {...props} />, { useRedux: true, useRouter: true }); expect( screen.getByRole('img', { name: 'One ore more annotation layers failed loading.', @@ -331,7 +383,7 @@ test('Should not render "annotationsError" and "annotationsLoading"', () => { const props = createProps(); props.annotationQuery = {}; props.annotationError = {}; - render(<SliceHeader {...props} />, { useRedux: true }); + render(<SliceHeader {...props} />, { useRedux: true, useRouter: true }); expect( screen.queryByRole('img', { name: 'One ore more annotation layers failed loading.', @@ -346,7 +398,7 @@ test('Should not render "annotationsError" and "annotationsLoading"', () => { test('Correct props to "FiltersBadge"', () => { const props = createProps(); - render(<SliceHeader {...props} />, { useRedux: true }); + render(<SliceHeader {...props} />, { useRedux: true, useRouter: true }); expect(screen.getByTestId('FiltersBadge')).toHaveAttribute( 'data-chart-id', '312', @@ -355,7 +407,7 @@ test('Correct props to "FiltersBadge"', () => { test('Correct props to "SliceHeaderControls"', () => { const props = createProps(); - render(<SliceHeader {...props} />, { useRedux: true }); + render(<SliceHeader {...props} />, { useRedux: true, useRouter: true }); expect(screen.getByTestId('SliceHeaderControls')).toHaveAttribute( 'data-cached-dttm', '', @@ -412,7 +464,7 @@ test('Correct props to "SliceHeaderControls"', () => { test('Correct actions to "SliceHeaderControls"', () => { const props = createProps(); - render(<SliceHeader {...props} />, { useRedux: true }); + render(<SliceHeader {...props} />, { useRedux: true, useRouter: true }); expect(props.toggleExpandSlice).toBeCalledTimes(0); userEvent.click(screen.getByTestId('toggleExpandSlice')); diff --git a/superset-frontend/src/dashboard/components/SliceHeader/index.tsx b/superset-frontend/src/dashboard/components/SliceHeader/index.tsx index af9d509e2f8a..a928933b54a2 100644 --- a/superset-frontend/src/dashboard/components/SliceHeader/index.tsx +++ b/superset-frontend/src/dashboard/components/SliceHeader/index.tsx @@ -16,8 +16,16 @@ * specific language governing permissions and limitations * under the License. */ -import React, { FC, useEffect, useMemo, useRef, useState } from 'react'; -import { styled, t } from '@superset-ui/core'; +import React, { + FC, + ReactNode, + useContext, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import { css, styled, t } from '@superset-ui/core'; import { useUiConfig } from 'src/components/UiConfigContext'; import { Tooltip } from 'src/components/Tooltip'; import { useDispatch, useSelector } from 'react-redux'; @@ -29,6 +37,8 @@ import FiltersBadge from 'src/dashboard/components/FiltersBadge'; import Icons from 'src/components/Icons'; import { RootState } from 'src/dashboard/types'; import FilterIndicator from 'src/dashboard/components/FiltersBadge/FilterIndicator'; +import { getSliceHeaderTooltip } from 'src/dashboard/util/getSliceHeaderTooltip'; +import { DashboardPageIdContext } from 'src/dashboard/containers/DashboardPage'; import { clearDataMask } from 'src/dataMask/actions'; type SliceHeaderProps = SliceHeaderControlsProps & { @@ -54,13 +64,76 @@ const CrossFilterIcon = styled(Icons.CursorTarget)` width: 22px; `; +const ChartHeaderStyles = styled.div` + ${({ theme }) => css` + font-size: ${theme.typography.sizes.l}px; + font-weight: ${theme.typography.weights.bold}; + margin-bottom: ${theme.gridUnit}px; + display: flex; + max-width: 100%; + align-items: flex-start; + min-height: 0; + + & > .header-title { + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; + flex-grow: 1; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + + & > span.ant-tooltip-open { + display: inline; + } + } + + & > .header-controls { + display: flex; + + & > * { + margin-left: ${theme.gridUnit * 2}px; + } + } + + .dropdown.btn-group { + pointer-events: none; + vertical-align: top; + & > * { + pointer-events: auto; + } + } + + .dropdown-toggle.btn.btn-default { + background: none; + border: none; + box-shadow: none; + } + + .dropdown-menu.dropdown-menu-right { + top: ${theme.gridUnit * 5}px; + } + + .divider { + margin: ${theme.gridUnit}px 0; + } + + .refresh-tooltip { + display: block; + height: ${theme.gridUnit * 4}px; + margin: ${theme.gridUnit}px 0; + color: ${theme.colors.text.label}; + } + `} +`; + const SliceHeader: FC<SliceHeaderProps> = ({ innerRef = null, forceRefresh = () => ({}), updateSliceName = () => ({}), toggleExpandSlice = () => ({}), logExploreChart = () => ({}), - onExploreChart, + logEvent, exportCSV = () => ({}), editMode = false, annotationQuery = {}, @@ -89,12 +162,16 @@ const SliceHeader: FC<SliceHeaderProps> = ({ }) => { const dispatch = useDispatch(); const uiConfig = useUiConfig(); - const [headerTooltip, setHeaderTooltip] = useState<string | null>(null); + const dashboardPageId = useContext(DashboardPageIdContext); + const [headerTooltip, setHeaderTooltip] = useState<ReactNode | null>(null); const headerRef = useRef<HTMLDivElement>(null); // TODO: change to indicator field after it will be implemented const crossFilterValue = useSelector<RootState, any>( state => state.dataMask[slice?.slice_id]?.filterState?.value, ); + const isCrossFiltersEnabled = useSelector<RootState, boolean>( + ({ dashboardInfo }) => dashboardInfo.crossFiltersEnabled, + ); const indicator = useMemo( () => ({ @@ -104,17 +181,12 @@ const SliceHeader: FC<SliceHeaderProps> = ({ [crossFilterValue], ); - const handleClickTitle = - !editMode && supersetCanExplore ? onExploreChart : undefined; + const canExplore = !editMode && supersetCanExplore; useEffect(() => { const headerElement = headerRef.current; - if (handleClickTitle) { - setHeaderTooltip( - sliceName - ? t('Click to edit %s in a new tab', sliceName) - : t('Click to edit chart in a new tab'), - ); + if (canExplore) { + setHeaderTooltip(getSliceHeaderTooltip(sliceName)); } else if ( headerElement && (headerElement.scrollWidth > headerElement.offsetWidth || @@ -124,10 +196,12 @@ const SliceHeader: FC<SliceHeaderProps> = ({ } else { setHeaderTooltip(null); } - }, [sliceName, width, height, handleClickTitle]); + }, [sliceName, width, height, canExplore]); + + const exploreUrl = `/explore/?dashboard_page_id=${dashboardPageId}&slice_id=${slice.slice_id}`; return ( - <div className="chart-header" data-test="slice-header" ref={innerRef}> + <ChartHeaderStyles data-test="slice-header" ref={innerRef}> <div className="header-title" ref={headerRef}> <Tooltip title={headerTooltip}> <EditableTitle @@ -138,10 +212,9 @@ const SliceHeader: FC<SliceHeaderProps> = ({ : '') } canEdit={editMode} - emptyText="" onSaveTitle={updateSliceName} showTooltip={false} - onClickTitle={handleClickTitle} + url={canExplore ? exploreUrl : undefined} /> </Tooltip> {!!Object.values(annotationQuery).length && ( @@ -159,7 +232,7 @@ const SliceHeader: FC<SliceHeaderProps> = ({ )} {!!Object.values(annotationError).length && ( <Tooltip - id="annoation-errors-tooltip" + id="annotation-errors-tooltip" placement="top" title={annotationsError} > @@ -202,7 +275,7 @@ const SliceHeader: FC<SliceHeaderProps> = ({ toggleExpandSlice={toggleExpandSlice} forceRefresh={forceRefresh} logExploreChart={logExploreChart} - onExploreChart={onExploreChart} + logEvent={logEvent} exportCSV={exportCSV} exportFullCSV={exportFullCSV} supersetCanExplore={supersetCanExplore} @@ -218,12 +291,14 @@ const SliceHeader: FC<SliceHeaderProps> = ({ isDescriptionExpanded={isExpanded} chartStatus={chartStatus} formData={formData} + exploreUrl={exploreUrl} + crossFiltersEnabled={isCrossFiltersEnabled} /> )} </> )} </div> - </div> + </ChartHeaderStyles> ); }; diff --git a/superset-frontend/src/dashboard/components/SliceHeaderControls/SliceHeaderControls.test.tsx b/superset-frontend/src/dashboard/components/SliceHeaderControls/SliceHeaderControls.test.tsx index 9e212018ad42..3a1e30564022 100644 --- a/superset-frontend/src/dashboard/components/SliceHeaderControls/SliceHeaderControls.test.tsx +++ b/superset-frontend/src/dashboard/components/SliceHeaderControls/SliceHeaderControls.test.tsx @@ -19,9 +19,10 @@ import userEvent from '@testing-library/user-event'; import React from 'react'; +import { getMockStore } from 'spec/fixtures/mockStore'; import { render, screen } from 'spec/helpers/testing-library'; import { FeatureFlag } from 'src/featureFlags'; -import SliceHeaderControls from '.'; +import SliceHeaderControls, { SliceHeaderControlsProps } from '.'; jest.mock('src/components/Dropdown', () => { const original = jest.requireActual('src/components/Dropdown'); @@ -36,66 +37,77 @@ jest.mock('src/components/Dropdown', () => { }; }); -const createProps = (viz_type = 'sunburst') => ({ - addDangerToast: jest.fn(), - addSuccessToast: jest.fn(), - exploreChart: jest.fn(), - exportCSV: jest.fn(), - exportFullCSV: jest.fn(), - forceRefresh: jest.fn(), - handleToggleFullSize: jest.fn(), - toggleExpandSlice: jest.fn(), - onExploreChart: jest.fn(), - slice: { - slice_id: 371, - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20371%7D', - slice_name: 'Vaccine Candidates per Country & Stage', - slice_description: 'Table of vaccine candidates for 100 countries', - form_data: { - adhoc_filters: [], - color_scheme: 'supersetColors', - datasource: '58__table', - groupby: ['product_category', 'clinical_stage'], - linear_color_scheme: 'schemeYlOrBr', - metric: 'count', - queryFields: { - groupby: 'groupby', - metric: 'metrics', - secondary_metric: 'metrics', - }, - row_limit: 10000, +const createProps = (viz_type = 'sunburst') => + ({ + addDangerToast: jest.fn(), + addSuccessToast: jest.fn(), + exploreChart: jest.fn(), + exportCSV: jest.fn(), + exportFullCSV: jest.fn(), + forceRefresh: jest.fn(), + handleToggleFullSize: jest.fn(), + toggleExpandSlice: jest.fn(), + logEvent: jest.fn(), + slice: { slice_id: 371, - time_range: 'No filter', - url_params: {}, + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20371%7D', + slice_name: 'Vaccine Candidates per Country & Stage', + slice_description: 'Table of vaccine candidates for 100 countries', + form_data: { + adhoc_filters: [], + color_scheme: 'supersetColors', + datasource: '58__table', + groupby: ['product_category', 'clinical_stage'], + linear_color_scheme: 'schemeYlOrBr', + metric: 'count', + queryFields: { + groupby: 'groupby', + metric: 'metrics', + secondary_metric: 'metrics', + }, + row_limit: 10000, + slice_id: 371, + time_range: 'No filter', + url_params: {}, + viz_type, + }, viz_type, + datasource: '58__table', + description: 'test-description', + description_markeddown: '', + owners: [], + modified: '<span class="no-wrap">22 hours ago</span>', + changed_on: 1617143411523, }, - viz_type, - datasource: '58__table', - description: 'test-description', - description_markeddown: '', - owners: [], - modified: '<span class="no-wrap">22 hours ago</span>', - changed_on: 1617143411523, - }, - isCached: [false], - isExpanded: false, - cachedDttm: [''], - updatedDttm: 1617213803803, - supersetCanExplore: true, - supersetCanCSV: true, - sliceCanEdit: false, - componentId: 'CHART-fYo7IyvKZQ', - dashboardId: 26, - isFullSize: false, - chartStatus: 'rendered', - showControls: true, - supersetCanShare: true, - formData: { slice_id: 1, datasource: '58__table', viz_type: 'sunburst' }, -}); + isCached: [false], + isExpanded: false, + cachedDttm: [''], + updatedDttm: 1617213803803, + supersetCanExplore: true, + supersetCanCSV: true, + sliceCanEdit: false, + componentId: 'CHART-fYo7IyvKZQ', + dashboardId: 26, + isFullSize: false, + chartStatus: 'rendered', + showControls: true, + supersetCanShare: true, + formData: { slice_id: 1, datasource: '58__table', viz_type: 'sunburst' }, + exploreUrl: '/explore', + } as SliceHeaderControlsProps); + +const renderWrapper = (overrideProps?: SliceHeaderControlsProps) => { + const props = overrideProps || createProps(); + const store = getMockStore(); + return render(<SliceHeaderControls {...props} />, { + useRedux: true, + useRouter: true, + store, + }); +}; test('Should render', () => { - const props = createProps(); - render(<SliceHeaderControls {...props} />, { useRedux: true }); + renderWrapper(); expect( screen.getByRole('button', { name: 'More Options' }), ).toBeInTheDocument(); @@ -124,7 +136,7 @@ test('Should render default props', () => { // @ts-ignore delete props.sliceCanEdit; - render(<SliceHeaderControls {...props} />, { useRedux: true }); + renderWrapper(props); expect( screen.getByRole('menuitem', { name: 'Enter fullscreen' }), ).toBeInTheDocument(); @@ -150,8 +162,7 @@ test('Should render default props', () => { test('Should "export to CSV"', async () => { const props = createProps(); - render(<SliceHeaderControls {...props} />, { useRedux: true }); - + renderWrapper(props); expect(props.exportCSV).toBeCalledTimes(0); userEvent.hover(screen.getByText('Download')); userEvent.click(await screen.findByText('Export to .CSV')); @@ -161,7 +172,7 @@ test('Should "export to CSV"', async () => { test('Should not show "Download" if slice is filter box', () => { const props = createProps('filter_box'); - render(<SliceHeaderControls {...props} />, { useRedux: true }); + renderWrapper(props); expect(screen.queryByText('Download')).not.toBeInTheDocument(); }); @@ -171,7 +182,7 @@ test('Export full CSV is under featureflag', async () => { [FeatureFlag.ALLOW_FULL_CSV_EXPORT]: false, }; const props = createProps('table'); - render(<SliceHeaderControls {...props} />, { useRedux: true }); + renderWrapper(props); userEvent.hover(screen.getByText('Download')); expect(await screen.findByText('Export to .CSV')).toBeInTheDocument(); expect(screen.queryByText('Export to full .CSV')).not.toBeInTheDocument(); @@ -183,7 +194,7 @@ test('Should "export full CSV"', async () => { [FeatureFlag.ALLOW_FULL_CSV_EXPORT]: true, }; const props = createProps('table'); - render(<SliceHeaderControls {...props} />, { useRedux: true }); + renderWrapper(props); expect(props.exportFullCSV).toBeCalledTimes(0); userEvent.hover(screen.getByText('Download')); userEvent.click(await screen.findByText('Export to full .CSV')); @@ -196,8 +207,7 @@ test('Should not show export full CSV if report is not table', async () => { global.featureFlags = { [FeatureFlag.ALLOW_FULL_CSV_EXPORT]: true, }; - const props = createProps(); - render(<SliceHeaderControls {...props} />, { useRedux: true }); + renderWrapper(); userEvent.hover(screen.getByText('Download')); expect(await screen.findByText('Export to .CSV')).toBeInTheDocument(); expect(screen.queryByText('Export to full .CSV')).not.toBeInTheDocument(); @@ -205,8 +215,7 @@ test('Should not show export full CSV if report is not table', async () => { test('Should "Show chart description"', () => { const props = createProps(); - render(<SliceHeaderControls {...props} />, { useRedux: true }); - + renderWrapper(props); expect(props.toggleExpandSlice).toBeCalledTimes(0); userEvent.click(screen.getByText('Show chart description')); expect(props.toggleExpandSlice).toBeCalledTimes(1); @@ -215,8 +224,7 @@ test('Should "Show chart description"', () => { test('Should "Force refresh"', () => { const props = createProps(); - render(<SliceHeaderControls {...props} />, { useRedux: true }); - + renderWrapper(props); expect(props.forceRefresh).toBeCalledTimes(0); userEvent.click(screen.getByText('Force refresh')); expect(props.forceRefresh).toBeCalledTimes(1); @@ -226,9 +234,30 @@ test('Should "Force refresh"', () => { test('Should "Enter fullscreen"', () => { const props = createProps(); - render(<SliceHeaderControls {...props} />, { useRedux: true }); + renderWrapper(props); expect(props.handleToggleFullSize).toBeCalledTimes(0); userEvent.click(screen.getByText('Enter fullscreen')); expect(props.handleToggleFullSize).toBeCalledTimes(1); }); + +test('Drill to detail modal is under featureflag', () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.DRILL_TO_DETAIL]: false, + }; + const props = createProps(); + renderWrapper(props); + expect(screen.queryByText('Drill to detail')).not.toBeInTheDocument(); +}); + +test('Should show the "Drill to detail"', () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.DRILL_TO_DETAIL]: true, + }; + const props = createProps(); + props.slice.slice_id = 18; + renderWrapper(props); + expect(screen.getByText('Drill to detail')).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx b/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx index e7415f517c82..4037234f74fd 100644 --- a/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx +++ b/superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx @@ -16,7 +16,19 @@ * specific language governing permissions and limitations * under the License. */ -import React from 'react'; +import React, { + MouseEvent, + Key, + ReactChild, + useState, + useCallback, +} from 'react'; +import { + Link, + RouteComponentProps, + useHistory, + withRouter, +} from 'react-router-dom'; import moment from 'moment'; import { Behavior, @@ -25,6 +37,7 @@ import { QueryFormData, styled, t, + useTheme, } from '@superset-ui/core'; import { Menu } from 'src/components/Menu'; import { NoAnimationDropdown } from 'src/components/Dropdown'; @@ -32,11 +45,16 @@ import ShareMenuItems from 'src/dashboard/components/menu/ShareMenuItems'; import downloadAsImage from 'src/utils/downloadAsImage'; import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; import CrossFilterScopingModal from 'src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal'; +import { getSliceHeaderTooltip } from 'src/dashboard/util/getSliceHeaderTooltip'; +import { Tooltip } from 'src/components/Tooltip'; import Icons from 'src/components/Icons'; import ModalTrigger from 'src/components/ModalTrigger'; import Button from 'src/components/Button'; import ViewQueryModal from 'src/explore/components/controls/ViewQueryModal'; import { ResultsPaneOnDashboard } from 'src/explore/components/DataTablesPane'; +import Modal from 'src/components/Modal'; +import { DrillDetailMenuItems } from 'src/components/Chart/DrillDetail'; +import { LOG_ACTIONS_CHART_DOWNLOAD_AS_IMAGE } from 'src/logger/LogUtils'; const MENU_KEYS = { CROSS_FILTER_SCOPING: 'cross_filter_scoping', @@ -49,14 +67,23 @@ const MENU_KEYS = { TOGGLE_CHART_DESCRIPTION: 'toggle_chart_description', VIEW_QUERY: 'view_query', VIEW_RESULTS: 'view_results', + DRILL_TO_DETAIL: 'drill_to_detail', }; +// TODO: replace 3 dots with an icon const VerticalDotsContainer = styled.div` padding: ${({ theme }) => theme.gridUnit / 4}px ${({ theme }) => theme.gridUnit * 1.5}px; .dot { display: block; + + height: ${({ theme }) => theme.gridUnit}px; + width: ${({ theme }) => theme.gridUnit}px; + border-radius: 50%; + margin: ${({ theme }) => theme.gridUnit / 2}px 0; + + background-color: ${({ theme }) => theme.colors.text.label}; } &:hover { @@ -93,7 +120,7 @@ export interface SliceHeaderControlsProps { slice_name: string; slice_id: number; slice_description: string; - form_data?: { emit_filter?: boolean }; + datasource: string; }; componentId: string; @@ -106,10 +133,11 @@ export interface SliceHeaderControlsProps { isFullSize?: boolean; isDescriptionExpanded?: boolean; formData: QueryFormData; - onExploreChart: () => void; + exploreUrl: string; forceRefresh: (sliceId: number, dashboardId: number) => void; logExploreChart?: (sliceId: number) => void; + logEvent?: (eventName: string, eventData?: object) => void; toggleExpandSlice?: (sliceId: number) => void; exportCSV?: (sliceId: number) => void; exportFullCSV?: (sliceId: number) => void; @@ -122,7 +150,11 @@ export interface SliceHeaderControlsProps { supersetCanShare?: boolean; supersetCanCSV?: boolean; sliceCanEdit?: boolean; + + crossFiltersEnabled?: boolean; } +type SliceHeaderControlsPropsWithRouter = SliceHeaderControlsProps & + RouteComponentProps; interface State { showControls: boolean; showCrossFilterScopingModal: boolean; @@ -135,11 +167,88 @@ const dropdownIconsStyles = css` } `; +const ViewResultsModalTrigger = ({ + exploreUrl, + triggerNode, + modalTitle, + modalBody, +}: { + exploreUrl: string; + triggerNode: ReactChild; + modalTitle: ReactChild; + modalBody: ReactChild; +}) => { + const [showModal, setShowModal] = useState(false); + const openModal = useCallback(() => setShowModal(true), []); + const closeModal = useCallback(() => setShowModal(false), []); + const history = useHistory(); + const exploreChart = () => history.push(exploreUrl); + const theme = useTheme(); + + return ( + <> + <span + data-test="span-modal-trigger" + onClick={openModal} + role="button" + tabIndex={0} + > + {triggerNode} + </span> + {(() => ( + <Modal + css={css` + .ant-modal-body { + display: flex; + flex-direction: column; + } + `} + show={showModal} + onHide={closeModal} + title={modalTitle} + footer={ + <> + <Button + buttonStyle="secondary" + buttonSize="small" + onClick={exploreChart} + > + {t('Edit chart')} + </Button> + <Button + buttonStyle="primary" + buttonSize="small" + onClick={closeModal} + > + {t('Close')} + </Button> + </> + } + responsive + resizable + resizableConfig={{ + minHeight: theme.gridUnit * 128, + minWidth: theme.gridUnit * 128, + defaultSize: { + width: 'auto', + height: '75vh', + }, + }} + draggable + destroyOnClose + > + {modalBody} + </Modal> + ))()} + </> + ); +}; + class SliceHeaderControls extends React.PureComponent< - SliceHeaderControlsProps, + SliceHeaderControlsPropsWithRouter, State > { - constructor(props: SliceHeaderControlsProps) { + constructor(props: SliceHeaderControlsPropsWithRouter) { super(props); this.toggleControls = this.toggleControls.bind(this); this.refreshChart = this.refreshChart.bind(this); @@ -170,8 +279,8 @@ class SliceHeaderControls extends React.PureComponent< key, domEvent, }: { - key: React.Key; - domEvent: React.MouseEvent<HTMLElement>; + key: Key; + domEvent: MouseEvent<HTMLElement>; }) { switch (key) { case MENU_KEYS.FORCE_REFRESH: @@ -183,25 +292,22 @@ class SliceHeaderControls extends React.PureComponent< break; case MENU_KEYS.TOGGLE_CHART_DESCRIPTION: // eslint-disable-next-line no-unused-expressions - this.props.toggleExpandSlice && - this.props.toggleExpandSlice(this.props.slice.slice_id); + this.props.toggleExpandSlice?.(this.props.slice.slice_id); break; case MENU_KEYS.EXPLORE_CHART: // eslint-disable-next-line no-unused-expressions - this.props.logExploreChart && - this.props.logExploreChart(this.props.slice.slice_id); + this.props.logExploreChart?.(this.props.slice.slice_id); break; case MENU_KEYS.EXPORT_CSV: // eslint-disable-next-line no-unused-expressions - this.props.exportCSV && this.props.exportCSV(this.props.slice.slice_id); + this.props.exportCSV?.(this.props.slice.slice_id); break; case MENU_KEYS.FULLSCREEN: this.props.handleToggleFullSize(); break; case MENU_KEYS.EXPORT_FULL_CSV: // eslint-disable-next-line no-unused-expressions - this.props.exportFullCSV && - this.props.exportFullCSV(this.props.slice.slice_id); + this.props.exportFullCSV?.(this.props.slice.slice_id); break; case MENU_KEYS.DOWNLOAD_AS_IMAGE: { // menu closes with a delay, we need to hide it manually, @@ -218,6 +324,9 @@ class SliceHeaderControls extends React.PureComponent< )(domEvent).then(() => { menu.style.visibility = 'visible'; }); + this.props.logEvent?.(LOG_ACTIONS_CHART_DOWNLOAD_AS_IMAGE, { + chartId: this.props.slice.slice_id, + }); break; } default: @@ -237,6 +346,7 @@ class SliceHeaderControls extends React.PureComponent< addDangerToast = () => {}, supersetCanShare = false, isCached = [], + crossFiltersEnabled, } = this.props; const crossFilterItems = getChartMetadataRegistry().items; const isTable = slice.viz_type === 'table'; @@ -246,7 +356,6 @@ class SliceHeaderControls extends React.PureComponent< value.behaviors?.includes(Behavior.INTERACTIVE_CHART), ) .find(([key]) => key === slice.viz_type); - const canEmitCrossFilter = slice.form_data?.emit_filter; const cachedWhen = (cachedDttm || []).map(itemCachedDttm => moment.utc(itemCachedDttm).fromNow(), @@ -273,6 +382,7 @@ class SliceHeaderControls extends React.PureComponent< const fullscreenLabel = isFullSize ? t('Exit fullscreen') : t('Enter fullscreen'); + const menu = ( <Menu onClick={this.handleMenuClick} @@ -304,11 +414,14 @@ class SliceHeaderControls extends React.PureComponent< )} {this.props.supersetCanExplore && ( - <Menu.Item - key={MENU_KEYS.EXPLORE_CHART} - onClick={this.props.onExploreChart} - > - {t('Edit chart')} + <Menu.Item key={MENU_KEYS.EXPLORE_CHART}> + <Link to={this.props.exploreUrl}> + <Tooltip + title={getSliceHeaderTooltip(this.props.slice.slice_name)} + > + {t('Edit chart')} + </Tooltip> + </Link> </Menu.Item> )} @@ -331,7 +444,8 @@ class SliceHeaderControls extends React.PureComponent< {this.props.supersetCanExplore && ( <Menu.Item key={MENU_KEYS.VIEW_RESULTS}> - <ModalTrigger + <ViewResultsModalTrigger + exploreUrl={this.props.exploreUrl} triggerNode={ <span data-test="view-query-menu-item"> {t('View as table')} @@ -347,29 +461,25 @@ class SliceHeaderControls extends React.PureComponent< isVisible /> } - modalFooter={ - <Button - buttonStyle="secondary" - buttonSize="small" - onClick={this.props.onExploreChart} - > - {t('Edit chart')} - </Button> - } - draggable - resizable - responsive /> </Menu.Item> )} + {isFeatureEnabled(FeatureFlag.DRILL_TO_DETAIL) && + this.props.supersetCanExplore && ( + <DrillDetailMenuItems + chartId={slice.slice_id} + formData={this.props.formData} + /> + )} + {(slice.description || this.props.supersetCanExplore) && ( <Menu.Divider /> )} {isFeatureEnabled(FeatureFlag.DASHBOARD_CROSS_FILTERS) && isCrossFilter && - canEmitCrossFilter && ( + crossFiltersEnabled && ( <> <Menu.Item key={MENU_KEYS.CROSS_FILTER_SCOPING}> {t('Cross-filter scoping')} @@ -459,4 +569,4 @@ class SliceHeaderControls extends React.PureComponent< } } -export default SliceHeaderControls; +export default withRouter(SliceHeaderControls); diff --git a/superset-frontend/src/dashboard/components/URLShortLinkButton/index.tsx b/superset-frontend/src/dashboard/components/URLShortLinkButton/index.tsx index f2af7af1dcbc..2d13cedcd63e 100644 --- a/superset-frontend/src/dashboard/components/URLShortLinkButton/index.tsx +++ b/superset-frontend/src/dashboard/components/URLShortLinkButton/index.tsx @@ -20,10 +20,11 @@ import React, { useState } from 'react'; import { t } from '@superset-ui/core'; import Popover, { PopoverProps } from 'src/components/Popover'; import CopyToClipboard from 'src/components/CopyToClipboard'; -import { getDashboardPermalink, getUrlParam } from 'src/utils/urlUtils'; +import { getDashboardPermalink } from 'src/utils/urlUtils'; import { useToasts } from 'src/components/MessageToasts/withToasts'; -import { URL_PARAMS } from 'src/constants'; -import { getFilterValue } from 'src/dashboard/components/nativeFilters/FilterBar/keyValue'; +import { useSelector } from 'react-redux'; +import { RootState } from 'src/dashboard/types'; +import { getClientErrorObject } from 'src/utils/getClientErrorObject'; export type URLShortLinkButtonProps = { dashboardId: number; @@ -42,19 +43,27 @@ export default function URLShortLinkButton({ }: URLShortLinkButtonProps) { const [shortUrl, setShortUrl] = useState(''); const { addDangerToast } = useToasts(); + const { dataMask, activeTabs } = useSelector((state: RootState) => ({ + dataMask: state.dataMask, + activeTabs: state.dashboardState.activeTabs, + })); const getCopyUrl = async () => { - const nativeFiltersKey = getUrlParam(URL_PARAMS.nativeFiltersKey); try { - const filterState = await getFilterValue(dashboardId, nativeFiltersKey); const url = await getDashboardPermalink({ dashboardId, - filterState, - hash: anchorLinkId, + dataMask, + activeTabs, + anchor: anchorLinkId, }); setShortUrl(url); } catch (error) { - addDangerToast(error); + if (error) { + addDangerToast( + (await getClientErrorObject(error)).error || + t('Something went wrong.'), + ); + } } }; @@ -66,7 +75,14 @@ export default function URLShortLinkButton({ trigger="click" placement={placement} content={ - <div id="shorturl-popover" data-test="shorturl-popover"> + // eslint-disable-next-line jsx-a11y/no-static-element-interactions + <div + id="shorturl-popover" + data-test="shorturl-popover" + onClick={e => { + e.stopPropagation(); + }} + > <CopyToClipboard text={shortUrl} copyNode={ diff --git a/superset-frontend/src/dashboard/components/dnd/DragDroppable.jsx b/superset-frontend/src/dashboard/components/dnd/DragDroppable.jsx index a29d0475e53b..3bc9f4d299a0 100644 --- a/superset-frontend/src/dashboard/components/dnd/DragDroppable.jsx +++ b/superset-frontend/src/dashboard/components/dnd/DragDroppable.jsx @@ -21,6 +21,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { DragSource, DropTarget } from 'react-dnd'; import cx from 'classnames'; +import { css, styled } from '@superset-ui/core'; import { componentShape } from '../../util/propShapes'; import { dragConfig, dropConfig } from './dragDroppableConfig'; @@ -34,7 +35,7 @@ import { const propTypes = { children: PropTypes.func, className: PropTypes.string, - component: componentShape.isRequired, + component: componentShape, parentComponent: componentShape, depth: PropTypes.number.isRequired, disableDragDrop: PropTypes.bool, @@ -42,16 +43,17 @@ const propTypes = { index: PropTypes.number.isRequired, style: PropTypes.object, onDrop: PropTypes.func, - editMode: PropTypes.bool.isRequired, + onHover: PropTypes.func, + editMode: PropTypes.bool, useEmptyDragPreview: PropTypes.bool, // from react-dnd - isDragging: PropTypes.bool.isRequired, - isDraggingOver: PropTypes.bool.isRequired, - isDraggingOverShallow: PropTypes.bool.isRequired, - droppableRef: PropTypes.func.isRequired, - dragSourceRef: PropTypes.func.isRequired, - dragPreviewRef: PropTypes.func.isRequired, + isDragging: PropTypes.bool, + isDraggingOver: PropTypes.bool, + isDraggingOverShallow: PropTypes.bool, + droppableRef: PropTypes.func, + dragSourceRef: PropTypes.func, + dragPreviewRef: PropTypes.func, }; const defaultProps = { @@ -61,10 +63,75 @@ const defaultProps = { disableDragDrop: false, children() {}, onDrop() {}, + onHover() {}, orientation: 'row', useEmptyDragPreview: false, + isDragging: false, + isDraggingOver: false, + isDraggingOverShallow: false, + droppableRef() {}, + dragSourceRef() {}, + dragPreviewRef() {}, }; +const DragDroppableStyles = styled.div` + ${({ theme }) => css` + position: relative; + + &.dragdroppable--dragging { + opacity: 0.2; + } + + &.dragdroppable-row { + width: 100%; + } + + &.dragdroppable-column .resizable-container span div { + z-index: 10; + } + + & { + .drop-indicator { + display: block; + background-color: ${theme.colors.primary.base}; + position: absolute; + z-index: 10; + } + + .drop-indicator--top { + top: 0; + left: 0; + height: ${theme.gridUnit}px; + width: 100%; + min-width: ${theme.gridUnit * 4}px; + } + + .drop-indicator--bottom { + top: 100%; + left: 0; + height: ${theme.gridUnit}px; + width: 100%; + min-width: ${theme.gridUnit * 4}px; + } + + .drop-indicator--right { + top: 0; + left: 100%; + height: 100%; + width: ${theme.gridUnit}px; + min-height: ${theme.gridUnit * 4}px; + } + + .drop-indicator--left { + top: 0; + left: 0; + height: 100%; + width: ${theme.gridUnit}px; + min-height: ${theme.gridUnit * 4}px; + } + } + `}; +`; // export unwrapped component for testing export class UnwrappedDragDroppable extends React.PureComponent { constructor(props) { @@ -95,7 +162,7 @@ export class UnwrappedDragDroppable extends React.PureComponent { } else { this.props.dragPreviewRef(ref); } - this.props.droppableRef(ref); + this.props.droppableRef?.(ref); } render() { @@ -133,7 +200,7 @@ export class UnwrappedDragDroppable extends React.PureComponent { : {}; return ( - <div + <DragDroppableStyles style={style} ref={this.setRef} data-test="dragdroppable-object" @@ -146,7 +213,7 @@ export class UnwrappedDragDroppable extends React.PureComponent { )} > {children(childProps)} - </div> + </DragDroppableStyles> ); } } diff --git a/superset-frontend/src/dashboard/components/dnd/DragDroppable.test.jsx b/superset-frontend/src/dashboard/components/dnd/DragDroppable.test.jsx index 65d77e773c56..e8366815a6dd 100644 --- a/superset-frontend/src/dashboard/components/dnd/DragDroppable.test.jsx +++ b/superset-frontend/src/dashboard/components/dnd/DragDroppable.test.jsx @@ -17,7 +17,10 @@ * under the License. */ import React from 'react'; -import { shallow, mount } from 'enzyme'; +import { + styledMount as mount, + styledShallow as shallow, +} from 'spec/helpers/theming'; import sinon from 'sinon'; import newComponentFactory from 'src/dashboard/util/newComponentFactory'; diff --git a/superset-frontend/src/dashboard/components/dnd/dragDroppableConfig.js b/superset-frontend/src/dashboard/components/dnd/dragDroppableConfig.js index 02466d3c5e15..4d7185148e85 100644 --- a/superset-frontend/src/dashboard/components/dnd/dragDroppableConfig.js +++ b/superset-frontend/src/dashboard/components/dnd/dragDroppableConfig.js @@ -19,7 +19,7 @@ import handleHover from './handleHover'; import handleDrop from './handleDrop'; -// note: the 'type' hook is not useful for us as dropping is contigent on other properties +// note: the 'type' hook is not useful for us as dropping is contingent on other properties const TYPE = 'DRAG_DROPPABLE'; export const dragConfig = [ diff --git a/superset-frontend/src/dashboard/components/dnd/handleHover.js b/superset-frontend/src/dashboard/components/dnd/handleHover.js index 71862a66c5b5..e709b6e3e54d 100644 --- a/superset-frontend/src/dashboard/components/dnd/handleHover.js +++ b/superset-frontend/src/dashboard/components/dnd/handleHover.js @@ -40,6 +40,8 @@ function handleHover(props, monitor, Component) { return; } + Component?.props?.onHover(); + Component.setState(() => ({ dropIndicator: dropPosition, })); diff --git a/superset-frontend/src/dashboard/components/filterscope/FilterScopeModal.tsx b/superset-frontend/src/dashboard/components/filterscope/FilterScopeModal.tsx index 53bd0e170f6d..6fe994e11bed 100644 --- a/superset-frontend/src/dashboard/components/filterscope/FilterScopeModal.tsx +++ b/superset-frontend/src/dashboard/components/filterscope/FilterScopeModal.tsx @@ -16,9 +16,9 @@ * specific language governing permissions and limitations * under the License. */ -import React, { RefObject } from 'react'; +import React from 'react'; import { styled } from '@superset-ui/core'; -import ModalTrigger from 'src/components/ModalTrigger'; +import ModalTrigger, { ModalTriggerRef } from 'src/components/ModalTrigger'; import FilterScope from 'src/dashboard/containers/FilterScope'; type FilterScopeModalProps = { @@ -34,19 +34,17 @@ export default class FilterScopeModal extends React.PureComponent< FilterScopeModalProps, {} > { - modal: RefObject<ModalTrigger>; + modal: ModalTriggerRef; constructor(props: FilterScopeModalProps) { super(props); - this.modal = React.createRef(); + this.modal = React.createRef() as ModalTriggerRef; this.handleCloseModal = this.handleCloseModal.bind(this); } handleCloseModal(): void { - if (this.modal.current) { - this.modal.current.close(); - } + this?.modal?.current?.close?.(); } render() { diff --git a/superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx b/superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx index 995cac01ca1f..1b146148682b 100644 --- a/superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx +++ b/superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx @@ -20,7 +20,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import cx from 'classnames'; import Button from 'src/components/Button'; -import { t, styled } from '@superset-ui/core'; +import { css, t, styled } from '@superset-ui/core'; import buildFilterScopeTreeEntry from 'src/dashboard/util/buildFilterScopeTreeEntry'; import getFilterScopeNodesTree from 'src/dashboard/util/getFilterScopeNodesTree'; @@ -49,6 +49,268 @@ const propTypes = { onCloseModal: PropTypes.func.isRequired, }; +const ScopeContainer = styled.div` + ${({ theme }) => css` + display: flex; + flex-direction: column; + height: 80%; + margin-right: ${theme.gridUnit * -6}px; + font-size: ${theme.typography.sizes.m}px; + + & .nav.nav-tabs { + border: none; + } + + & .filter-scope-body { + flex: 1; + max-height: calc(100% - ${theme.gridUnit * 32}px); + + .filter-field-pane, + .filter-scope-pane { + overflow-y: auto; + } + } + + & .warning-message { + padding: ${theme.gridUnit * 6}px; + } + `} +`; + +const ScopeBody = styled.div` + ${({ theme }) => css` + &.filter-scope-body { + flex: 1; + max-height: calc(100% - ${theme.gridUnit * 32}px); + + .filter-field-pane, + .filter-scope-pane { + overflow-y: auto; + } + } + `} +`; + +const ScopeHeader = styled.div` + ${({ theme }) => css` + height: ${theme.gridUnit * 16}px; + border-bottom: 1px solid ${theme.colors.grayscale.light2}; + padding-left: ${theme.gridUnit * 6}px; + margin-left: ${theme.gridUnit * -6}px; + + h4 { + margin-top: 0; + } + + .selected-fields { + margin: ${theme.gridUnit * 3}px 0 ${theme.gridUnit * 4}px; + visibility: hidden; + + &.multi-edit-mode { + visibility: visible; + } + + .selected-scopes { + padding-left: ${theme.gridUnit}px; + } + } + `} +`; + +const ScopeSelector = styled.div` + ${({ theme }) => css` + &.filters-scope-selector { + display: flex; + flex-direction: row; + position: relative; + height: 100%; + + a, + a:active, + a:hover { + color: inherit; + text-decoration: none; + } + + .react-checkbox-tree .rct-icon.rct-icon-expand-all, + .react-checkbox-tree .rct-icon.rct-icon-collapse-all { + font-family: ${theme.typography.families.sansSerif}; + font-size: ${theme.typography.sizes.m}px; + color: ${theme.colors.primary.base}; + + &::before { + content: ''; + } + + &:hover { + text-decoration: underline; + } + + &:focus { + outline: none; + } + } + + .filter-field-pane { + position: relative; + width: 40%; + padding: ${theme.gridUnit * 4}px; + padding-left: 0; + border-right: 1px solid ${theme.colors.grayscale.light2}; + + .filter-container label { + font-weight: ${theme.typography.weights.normal}; + margin: 0 0 0 ${theme.gridUnit * 4}px; + word-break: break-all; + } + + .filter-field-item { + height: ${theme.gridUnit * 9}px; + display: flex; + align-items: center; + justify-content: center; + padding: 0 ${theme.gridUnit * 6}px; + margin-left: ${theme.gridUnit * -6}px; + + &.is-selected { + border: 1px solid ${theme.colors.text.label}; + border-radius: ${theme.borderRadius}px; + background-color: ${theme.colors.grayscale.light4}; + margin-left: ${theme.gridUnit * -6}px; + } + } + + .react-checkbox-tree { + .rct-title .root { + font-weight: ${theme.typography.weights.bold}; + } + + .rct-text { + height: ${theme.gridUnit * 10}px; + } + } + } + + .filter-scope-pane { + position: relative; + flex: 1; + padding: ${theme.gridUnit * 4}px; + padding-right: ${theme.gridUnit * 6}px; + } + + .react-checkbox-tree { + flex-direction: column; + color: ${theme.colors.grayscale.dark1}; + font-size: ${theme.typography.sizes.m}px; + + .filter-scope-type { + padding: ${theme.gridUnit * 2}px 0; + display: flex; + align-items: center; + + &.chart { + font-weight: ${theme.typography.weights.normal}; + } + + &.selected-filter { + padding-left: ${theme.gridUnit * 7}px; + position: relative; + color: ${theme.colors.text.label}; + + &::before { + content: ' '; + position: absolute; + left: 0; + top: 50%; + width: ${theme.gridUnit * 4}px; + height: ${theme.gridUnit * 4}px; + border-radius: ${theme.borderRadius}px; + margin-top: ${theme.gridUnit * -2}px; + box-shadow: inset 0 0 0 2px ${theme.colors.grayscale.light2}; + background: ${theme.colors.grayscale.light3}; + } + } + + &.root { + font-weight: ${theme.typography.weights.bold}; + } + } + + .rct-checkbox { + svg { + position: relative; + top: 3px; + width: ${theme.gridUnit * 4.5}px; + } + } + + .rct-node-leaf { + .rct-bare-label { + &::before { + padding-left: ${theme.gridUnit}px; + } + } + } + + .rct-options { + text-align: left; + margin-left: 0; + margin-bottom: ${theme.gridUnit * 2}px; + } + + .rct-text { + margin: 0; + display: flex; + } + + .rct-title { + display: block; + } + + // disable style from react-checkbox-trees.css + .rct-node-clickable:hover, + .rct-node-clickable:focus, + label:hover, + label:active { + background: none !important; + } + } + + .multi-edit-mode { + &.filter-scope-pane { + .rct-node.rct-node-leaf .filter-scope-type.filter_box { + display: none; + } + } + + .filter-field-item { + padding: 0 ${theme.gridUnit * 4}px 0 ${theme.gridUnit * 12}px; + margin-left: ${theme.gridUnit * -12}px; + + &.is-selected { + margin-left: ${theme.gridUnit * -13}px; + } + } + } + + .scope-search { + position: absolute; + right: ${theme.gridUnit * 4}px; + top: ${theme.gridUnit * 4}px; + border-radius: ${theme.borderRadius}px; + border: 1px solid ${theme.colors.grayscale.light2}; + padding: ${theme.gridUnit}px ${theme.gridUnit * 2}px; + font-size: ${theme.typography.sizes.m}px; + outline: none; + + &:focus { + border: 1px solid ${theme.colors.primary.base}; + } + } + } + `} +`; + const ActionsContainer = styled.div` ${({ theme }) => ` height: ${theme.gridUnit * 16}px; @@ -496,28 +758,28 @@ export default class FilterScopeSelector extends React.PureComponent { const { showSelector } = this.state; return ( - <div className="filter-scope-container"> - <div className="filter-scope-header"> + <ScopeContainer> + <ScopeHeader> <h4>{t('Configure filter scopes')}</h4> {showSelector && this.renderEditingFiltersName()} - </div> + </ScopeHeader> - <div className="filter-scope-body"> + <ScopeBody className="filter-scope-body"> {!showSelector ? ( <div className="warning-message"> {t('There are no filters in this dashboard.')} </div> ) : ( - <div className="filters-scope-selector"> + <ScopeSelector className="filters-scope-selector"> <div className={cx('filter-field-pane multi-edit-mode')}> {this.renderFilterFieldList()} </div> <div className="filter-scope-pane multi-edit-mode"> {this.renderFilterScopeTree()} </div> - </div> + </ScopeSelector> )} - </div> + </ScopeBody> <ActionsContainer> <Button buttonSize="small" onClick={this.onClose}> @@ -533,7 +795,7 @@ export default class FilterScopeSelector extends React.PureComponent { </Button> )} </ActionsContainer> - </div> + </ScopeContainer> ); } } diff --git a/superset-frontend/src/dashboard/components/gridComponents/Chart.jsx b/superset-frontend/src/dashboard/components/gridComponents/Chart.jsx index fc3f6d39b34a..89d4fb94ce7c 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Chart.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Chart.jsx @@ -19,8 +19,15 @@ import cx from 'classnames'; import React from 'react'; import PropTypes from 'prop-types'; -import { styled, t, logging } from '@superset-ui/core'; +import { + styled, + t, + logging, + isFeatureEnabled, + FeatureFlag, +} from '@superset-ui/core'; import { isEqual } from 'lodash'; +import { withRouter } from 'react-router-dom'; import { exportChart, mountExploreUrl } from 'src/explore/exploreUtils'; import ChartContainer from 'src/components/Chart/ChartContainer'; @@ -63,7 +70,11 @@ const propTypes = { sliceName: PropTypes.string.isRequired, timeout: PropTypes.number.isRequired, maxRows: PropTypes.number.isRequired, - filterboxMigrationState: FILTER_BOX_MIGRATION_STATES, + filterboxMigrationState: PropTypes.oneOf( + Object.keys(FILTER_BOX_MIGRATION_STATES).map( + key => FILTER_BOX_MIGRATION_STATES[key], + ), + ), // all active filter fields in dashboard filters: PropTypes.object.isRequired, refreshChart: PropTypes.func.isRequired, @@ -85,6 +96,8 @@ const propTypes = { filterState: PropTypes.object, postTransformProps: PropTypes.func, datasetsStatus: PropTypes.oneOf(['loading', 'error', 'complete']), + isInView: PropTypes.bool, + emitCrossFilters: PropTypes.bool, }; const defaultProps = { @@ -102,6 +115,15 @@ const SHOULD_UPDATE_ON_PROP_CHANGES = Object.keys(propTypes).filter( const OVERFLOWABLE_VIZ_TYPES = new Set(['filter_box']); const DEFAULT_HEADER_HEIGHT = 22; +const ChartWrapper = styled.div` + overflow: hidden; + position: relative; + + &.dashboard-chart--overflowable { + overflow: visible; + } +`; + const ChartOverlay = styled.div` position: absolute; top: 0; @@ -120,7 +142,7 @@ const SliceContainer = styled.div` max-height: 100%; `; -export default class Chart extends React.Component { +class Chart extends React.Component { constructor(props) { super(props); this.state = { @@ -155,6 +177,14 @@ export default class Chart extends React.Component { return true; } + // allow chart to update if the status changed and the previous status was loading. + if ( + this.props?.chart?.chartStatus !== nextProps?.chart?.chartStatus && + this.props?.chart?.chartStatus === 'loading' + ) { + return true; + } + // allow chart update/re-render only if visible: // under selected tab or no tab layout if (nextProps.isComponentVisible) { @@ -170,7 +200,9 @@ export default class Chart extends React.Component { if ( nextProps.width !== this.props.width || - nextProps.height !== this.props.height + nextProps.height !== this.props.height || + nextProps.width !== this.state.width || + nextProps.height !== this.state.height ) { clearTimeout(this.resizeTimeout); this.resizeTimeout = setTimeout(this.resize, RESIZE_TIMEOUT); @@ -179,11 +211,20 @@ export default class Chart extends React.Component { for (let i = 0; i < SHOULD_UPDATE_ON_PROP_CHANGES.length; i += 1) { const prop = SHOULD_UPDATE_ON_PROP_CHANGES[i]; // use deep objects equality comparison to prevent - // unneccessary updates when objects references change + // unnecessary updates when objects references change if (!areObjectsEqual(nextProps[prop], this.props[prop])) { return true; } } + } else if ( + // chart should re-render if color scheme or label color was changed + nextProps.formData?.color_scheme !== this.props.formData?.color_scheme || + !areObjectsEqual( + nextProps.formData?.label_colors, + this.props.formData?.label_colors, + ) + ) { + return true; } // `cacheBusterProp` is jected by react-hot-loader @@ -270,7 +311,9 @@ export default class Chart extends React.Component { }); }; - onExploreChart = async () => { + onExploreChart = async clickEvent => { + const isOpenInNewTab = + clickEvent.shiftKey || clickEvent.ctrlKey || clickEvent.metaKey; try { const lastTabId = window.localStorage.getItem('last_tab_id'); const nextTabId = lastTabId @@ -287,7 +330,14 @@ export default class Chart extends React.Component { [URL_PARAMS.formDataKey.name]: key, [URL_PARAMS.sliceId.name]: this.props.slice.slice_id, }); - window.open(url, '_blank', 'noreferrer'); + if ( + isFeatureEnabled(FeatureFlag.DASHBOARD_EDIT_CHART_IN_NEW_TAB) || + isOpenInNewTab + ) { + window.open(url, '_blank', 'noreferrer'); + } else { + this.props.history.push(url); + } } catch (error) { logging.error(error); this.props.addDangerToast(t('An error occurred while opening Explore')); @@ -358,6 +408,9 @@ export default class Chart extends React.Component { filterboxMigrationState, postTransformProps, datasetsStatus, + isInView, + emitCrossFilters, + logEvent, } = this.props; const { width } = this.state; @@ -387,6 +440,7 @@ export default class Chart extends React.Component { filterId: id, }) : {}; + return ( <SliceContainer className="chart-slice" @@ -407,6 +461,7 @@ export default class Chart extends React.Component { editMode={editMode} annotationQuery={chart.annotationQuery} logExploreChart={this.logExploreChart} + logEvent={logEvent} onExploreChart={this.onExploreChart} exportCSV={this.exportCSV} exportFullCSV={this.exportFullCSV} @@ -445,7 +500,7 @@ export default class Chart extends React.Component { /> )} - <div + <ChartWrapper className={cx( 'dashboard-chart', isOverflowable && 'dashboard-chart--overflowable', @@ -487,8 +542,10 @@ export default class Chart extends React.Component { filterboxMigrationState={filterboxMigrationState} postTransformProps={postTransformProps} datasetsStatus={datasetsStatus} + isInView={isInView} + emitCrossFilters={emitCrossFilters} /> - </div> + </ChartWrapper> </SliceContainer> ); } @@ -496,3 +553,5 @@ export default class Chart extends React.Component { Chart.propTypes = propTypes; Chart.defaultProps = defaultProps; + +export default withRouter(Chart); diff --git a/superset-frontend/src/dashboard/components/gridComponents/Chart.test.jsx b/superset-frontend/src/dashboard/components/gridComponents/Chart.test.jsx index 59cbce209035..a3851a73b3e9 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Chart.test.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Chart.test.jsx @@ -40,7 +40,7 @@ describe('Chart', () => { // from redux maxRows: 666, chart: chartQueries[queryId], - formData: chartQueries[queryId].formData, + formData: chartQueries[queryId].form_data, datasource: mockDatasource[sliceEntities.slices[queryId].datasource], slice: { ...sliceEntities.slices[queryId], @@ -72,7 +72,9 @@ describe('Chart', () => { }; function setup(overrideProps) { - const wrapper = shallow(<Chart {...props} {...overrideProps} />); + const wrapper = shallow( + <Chart.WrappedComponent {...props} {...overrideProps} />, + ); return wrapper; } @@ -94,7 +96,10 @@ describe('Chart', () => { }); it('should calculate the description height if it has one and isExpanded=true', () => { - const spy = jest.spyOn(Chart.prototype, 'getDescriptionHeight'); + const spy = jest.spyOn( + Chart.WrappedComponent.prototype, + 'getDescriptionHeight', + ); const wrapper = setup({ isExpanded: true }); expect(wrapper.find('.slice_description')).toExist(); diff --git a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx deleted file mode 100644 index 2363b1610e4f..000000000000 --- a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx +++ /dev/null @@ -1,420 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import PropTypes from 'prop-types'; -import cx from 'classnames'; -import { useTheme } from '@superset-ui/core'; -import { useSelector, connect } from 'react-redux'; - -import { getChartIdsInFilterBoxScope } from 'src/dashboard/util/activeDashboardFilters'; -import Chart from 'src/dashboard/containers/Chart'; -import AnchorLink from 'src/dashboard/components/AnchorLink'; -import DeleteComponentButton from 'src/dashboard/components/DeleteComponentButton'; -import DragDroppable from 'src/dashboard/components/dnd/DragDroppable'; -import HoverMenu from 'src/dashboard/components/menu/HoverMenu'; -import ResizableContainer from 'src/dashboard/components/resizable/ResizableContainer'; -import getChartAndLabelComponentIdFromPath from 'src/dashboard/util/getChartAndLabelComponentIdFromPath'; -import { componentShape } from 'src/dashboard/util/propShapes'; -import { COLUMN_TYPE, ROW_TYPE } from 'src/dashboard/util/componentTypes'; -import { - GRID_BASE_UNIT, - GRID_GUTTER_SIZE, - GRID_MIN_COLUMN_COUNT, - GRID_MIN_ROW_UNITS, -} from 'src/dashboard/util/constants'; - -const CHART_MARGIN = 32; - -const propTypes = { - id: PropTypes.string.isRequired, - parentId: PropTypes.string.isRequired, - dashboardId: PropTypes.number.isRequired, - component: componentShape.isRequired, - parentComponent: componentShape.isRequired, - getComponentById: PropTypes.func.isRequired, - index: PropTypes.number.isRequired, - depth: PropTypes.number.isRequired, - editMode: PropTypes.bool.isRequired, - directPathToChild: PropTypes.arrayOf(PropTypes.string), - directPathLastUpdated: PropTypes.number, - focusedFilterScope: PropTypes.object, - fullSizeChartId: PropTypes.oneOf([PropTypes.number, null]), - - // grid related - availableColumnCount: PropTypes.number.isRequired, - columnWidth: PropTypes.number.isRequired, - onResizeStart: PropTypes.func.isRequired, - onResize: PropTypes.func.isRequired, - onResizeStop: PropTypes.func.isRequired, - - // dnd - deleteComponent: PropTypes.func.isRequired, - updateComponents: PropTypes.func.isRequired, - handleComponentDrop: PropTypes.func.isRequired, - setFullSizeChartId: PropTypes.func.isRequired, - postAddSliceFromDashboard: PropTypes.func, -}; - -const defaultProps = { - directPathToChild: [], - directPathLastUpdated: 0, -}; - -/** - * Selects the chart scope of the filter input that has focus. - * - * @returns {{chartId: number, scope: { scope: string[], immune: string[] }} | null } - * the scope of the currently focused filter, if any - */ -function selectFocusedFilterScope(dashboardState, dashboardFilters) { - if (!dashboardState.focusedFilterField) return null; - const { chartId, column } = dashboardState.focusedFilterField; - return { - chartId, - scope: dashboardFilters[chartId].scopes[column], - }; -} - -/** - * Renders any styles necessary to highlight the chart's relationship to the focused filter. - * - * If there is no focused filter scope (i.e. most of the time), this will be just a pass-through. - * - * If the chart is outside the scope of the focused filter, dims the chart. - * - * If the chart is in the scope of the focused filter, - * renders a highlight around the chart. - * - * If ChartHolder were a function component, this could be implemented as a hook instead. - */ -const FilterFocusHighlight = React.forwardRef( - ({ chartId, ...otherProps }, ref) => { - const theme = useTheme(); - - const nativeFilters = useSelector(state => state.nativeFilters); - const dashboardState = useSelector(state => state.dashboardState); - const dashboardFilters = useSelector(state => state.dashboardFilters); - const focusedFilterScope = selectFocusedFilterScope( - dashboardState, - dashboardFilters, - ); - const focusedNativeFilterId = nativeFilters.focusedFilterId; - if (!(focusedFilterScope || focusedNativeFilterId)) { - return <div ref={ref} {...otherProps} />; - } - - // we use local styles here instead of a conditionally-applied class, - // because adding any conditional class to this container - // causes performance issues in Chrome. - - // default to the "de-emphasized" state - const unfocusedChartStyles = { opacity: 0.3, pointerEvents: 'none' }; - const focusedChartStyles = { - borderColor: theme.colors.primary.light2, - opacity: 1, - boxShadow: `0px 0px ${theme.gridUnit * 2}px ${theme.colors.primary.base}`, - pointerEvents: 'auto', - }; - - if (focusedNativeFilterId) { - if ( - nativeFilters.filters[focusedNativeFilterId]?.chartsInScope?.includes( - chartId, - ) - ) { - return <div ref={ref} style={focusedChartStyles} {...otherProps} />; - } - } else if ( - chartId === focusedFilterScope.chartId || - getChartIdsInFilterBoxScope({ - filterScope: focusedFilterScope.scope, - }).includes(chartId) - ) { - return <div ref={ref} style={focusedChartStyles} {...otherProps} />; - } - - // inline styles are used here due to a performance issue when adding/changing a class, which causes a reflow - return <div ref={ref} style={unfocusedChartStyles} {...otherProps} />; - }, -); - -class ChartHolder extends React.Component { - static renderInFocusCSS(columnName) { - return ( - <style> - {`label[for=${columnName}] + .Select .Select__control { - border-color: #00736a; - transition: border-color 1s ease-in-out; - }`} - </style> - ); - } - - static getDerivedStateFromProps(props, state) { - const { component, directPathToChild, directPathLastUpdated } = props; - const { label: columnName, chart: chartComponentId } = - getChartAndLabelComponentIdFromPath(directPathToChild); - - if ( - directPathLastUpdated !== state.directPathLastUpdated && - component.id === chartComponentId - ) { - return { - outlinedComponentId: component.id, - outlinedColumnName: columnName, - directPathLastUpdated, - }; - } - return null; - } - - constructor(props) { - super(props); - this.state = { - isFocused: false, - outlinedComponentId: null, - outlinedColumnName: null, - directPathLastUpdated: 0, - extraControls: {}, - }; - - this.handleChangeFocus = this.handleChangeFocus.bind(this); - this.handleDeleteComponent = this.handleDeleteComponent.bind(this); - this.handleUpdateSliceName = this.handleUpdateSliceName.bind(this); - this.handleToggleFullSize = this.handleToggleFullSize.bind(this); - this.handleExtraControl = this.handleExtraControl.bind(this); - this.handlePostTransformProps = this.handlePostTransformProps.bind(this); - } - - componentDidMount() { - this.hideOutline({}, this.state); - } - - componentDidUpdate(prevProps, prevState) { - this.hideOutline(prevState, this.state); - } - - hideOutline(prevState, state) { - const { outlinedComponentId: timerKey } = state; - const { outlinedComponentId: prevTimerKey } = prevState; - - // because of timeout, there might be multiple charts showing outline - if (!!timerKey && !prevTimerKey) { - setTimeout(() => { - this.setState(() => ({ - outlinedComponentId: null, - outlinedColumnName: null, - })); - }, 2000); - } - } - - handleChangeFocus(nextFocus) { - this.setState(() => ({ isFocused: nextFocus })); - } - - handleDeleteComponent() { - const { deleteComponent, id, parentId } = this.props; - deleteComponent(id, parentId); - } - - handleUpdateSliceName(nextName) { - const { component, updateComponents } = this.props; - updateComponents({ - [component.id]: { - ...component, - meta: { - ...component.meta, - sliceNameOverride: nextName, - }, - }, - }); - } - - handleToggleFullSize() { - const { component, fullSizeChartId, setFullSizeChartId } = this.props; - const { chartId } = component.meta; - const isFullSize = fullSizeChartId === chartId; - setFullSizeChartId(isFullSize ? null : chartId); - } - - handleExtraControl(name, value) { - this.setState(prevState => ({ - extraControls: { - ...prevState.extraControls, - [name]: value, - }, - })); - } - - handlePostTransformProps(props) { - this.props.postAddSliceFromDashboard(); - return props; - } - - render() { - const { isFocused, extraControls } = this.state; - const { - component, - parentComponent, - index, - depth, - availableColumnCount, - columnWidth, - onResizeStart, - onResize, - onResizeStop, - handleComponentDrop, - editMode, - isComponentVisible, - dashboardId, - fullSizeChartId, - getComponentById = () => undefined, - } = this.props; - - const { chartId } = component.meta; - const isFullSize = fullSizeChartId === chartId; - - // inherit the size of parent columns - const columnParentWidth = getComponentById( - parentComponent.parents?.find(parent => parent.startsWith(COLUMN_TYPE)), - )?.meta?.width; - let widthMultiple = component.meta.width || GRID_MIN_COLUMN_COUNT; - if (parentComponent.type === COLUMN_TYPE) { - widthMultiple = parentComponent.meta.width || GRID_MIN_COLUMN_COUNT; - } else if (columnParentWidth && widthMultiple > columnParentWidth) { - widthMultiple = columnParentWidth; - } - - let chartWidth = 0; - let chartHeight = 0; - - if (isFullSize) { - chartWidth = window.innerWidth - CHART_MARGIN; - chartHeight = window.innerHeight - CHART_MARGIN; - } else { - chartWidth = Math.floor( - widthMultiple * columnWidth + - (widthMultiple - 1) * GRID_GUTTER_SIZE - - CHART_MARGIN, - ); - chartHeight = Math.floor( - component.meta.height * GRID_BASE_UNIT - CHART_MARGIN, - ); - } - - return ( - <DragDroppable - component={component} - parentComponent={parentComponent} - orientation={parentComponent.type === ROW_TYPE ? 'column' : 'row'} - index={index} - depth={depth} - onDrop={handleComponentDrop} - disableDragDrop={isFocused} - editMode={editMode} - > - {({ dropIndicatorProps, dragSourceRef }) => ( - <ResizableContainer - id={component.id} - adjustableWidth={parentComponent.type === ROW_TYPE} - adjustableHeight - widthStep={columnWidth} - widthMultiple={widthMultiple} - heightStep={GRID_BASE_UNIT} - heightMultiple={component.meta.height} - minWidthMultiple={GRID_MIN_COLUMN_COUNT} - minHeightMultiple={GRID_MIN_ROW_UNITS} - maxWidthMultiple={availableColumnCount + widthMultiple} - onResizeStart={onResizeStart} - onResize={onResize} - onResizeStop={onResizeStop} - editMode={editMode} - > - <FilterFocusHighlight - chartId={chartId} - ref={dragSourceRef} - data-test="dashboard-component-chart-holder" - className={cx( - 'dashboard-component', - 'dashboard-component-chart-holder', - // The following class is added to support custom dashboard styling via the CSS editor - `dashboard-chart-id-${chartId}`, - this.state.outlinedComponentId ? 'fade-in' : 'fade-out', - isFullSize && 'full-size', - )} - > - {!editMode && ( - <AnchorLink - id={component.id} - scrollIntoView={ - this.state.outlinedComponentId === component.id - } - /> - )} - {!!this.state.outlinedComponentId && - ChartHolder.renderInFocusCSS(this.state.outlinedColumnName)} - <Chart - componentId={component.id} - id={component.meta.chartId} - dashboardId={dashboardId} - width={chartWidth} - height={chartHeight} - sliceName={ - component.meta.sliceNameOverride || - component.meta.sliceName || - '' - } - updateSliceName={this.handleUpdateSliceName} - isComponentVisible={isComponentVisible} - handleToggleFullSize={this.handleToggleFullSize} - isFullSize={isFullSize} - setControlValue={this.handleExtraControl} - extraControls={extraControls} - postTransformProps={this.handlePostTransformProps} - /> - {editMode && ( - <HoverMenu position="top"> - <div data-test="dashboard-delete-component-button"> - <DeleteComponentButton - onDelete={this.handleDeleteComponent} - /> - </div> - </HoverMenu> - )} - </FilterFocusHighlight> - - {dropIndicatorProps && <div {...dropIndicatorProps} />} - </ResizableContainer> - )} - </DragDroppable> - ); - } -} - -ChartHolder.propTypes = propTypes; -ChartHolder.defaultProps = defaultProps; - -function mapStateToProps(state) { - return { - directPathToChild: state.dashboardState.directPathToChild, - directPathLastUpdated: state.dashboardState.directPathLastUpdated, - }; -} -export default connect(mapStateToProps)(ChartHolder); diff --git a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.test.jsx b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.test.jsx deleted file mode 100644 index 0c46b16de471..000000000000 --- a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.test.jsx +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { Provider } from 'react-redux'; -import React from 'react'; -import { styledMount as mount } from 'spec/helpers/theming'; -import sinon from 'sinon'; -import { DndProvider } from 'react-dnd'; -import { HTML5Backend } from 'react-dnd-html5-backend'; - -import Chart from 'src/dashboard/containers/Chart'; -import ChartHolderConnected from 'src/dashboard/components/gridComponents/ChartHolder'; -import DeleteComponentButton from 'src/dashboard/components/DeleteComponentButton'; -import DragDroppable from 'src/dashboard/components/dnd/DragDroppable'; -import HoverMenu from 'src/dashboard/components/menu/HoverMenu'; -import ResizableContainer from 'src/dashboard/components/resizable/ResizableContainer'; - -import { getMockStore } from 'spec/fixtures/mockStore'; -import { sliceId } from 'spec/fixtures/mockChartQueries'; -import dashboardInfo from 'spec/fixtures/mockDashboardInfo'; -import { nativeFilters } from 'spec/fixtures/mockNativeFilters'; -import { dashboardLayout as mockLayout } from 'spec/fixtures/mockDashboardLayout'; -import { sliceEntitiesForChart } from 'spec/fixtures/mockSliceEntities'; -import { initialState } from 'src/SqlLab/fixtures'; - -describe('ChartHolder', () => { - const props = { - id: String(sliceId), - dashboardId: dashboardInfo.id, - parentId: 'ROW_ID', - component: mockLayout.present.CHART_ID, - depth: 2, - parentComponent: mockLayout.present.ROW_ID, - index: 0, - editMode: false, - availableColumnCount: 12, - columnWidth: 50, - onResizeStart() {}, - onResize() {}, - onResizeStop() {}, - handleComponentDrop() {}, - updateComponents() {}, - deleteComponent() {}, - nativeFilters: nativeFilters.filters, - }; - - function setup(overrideProps) { - const mockStore = getMockStore({ - ...initialState, - sliceEntities: sliceEntitiesForChart, - }); - - // We have to wrap provide DragDropContext for the underlying DragDroppable - // otherwise we cannot assert on DragDroppable children - const wrapper = mount( - <Provider store={mockStore}> - <DndProvider backend={HTML5Backend}> - <ChartHolderConnected {...props} {...overrideProps} /> - </DndProvider> - </Provider>, - ); - return wrapper; - } - - it('should render a DragDroppable', () => { - const wrapper = setup(); - expect(wrapper.find(DragDroppable)).toExist(); - }); - - it('should render a ResizableContainer', () => { - const wrapper = setup(); - expect(wrapper.find(ResizableContainer)).toExist(); - }); - - it('should only have an adjustableWidth if its parent is a Row', () => { - let wrapper = setup(); - expect(wrapper.find(ResizableContainer).prop('adjustableWidth')).toBe(true); - - wrapper = setup({ ...props, parentComponent: mockLayout.present.CHART_ID }); - expect(wrapper.find(ResizableContainer).prop('adjustableWidth')).toBe( - false, - ); - }); - - it('should pass correct props to ResizableContainer', () => { - const wrapper = setup(); - const resizableProps = wrapper.find(ResizableContainer).props(); - expect(resizableProps.widthStep).toBe(props.columnWidth); - expect(resizableProps.widthMultiple).toBe(props.component.meta.width); - expect(resizableProps.heightMultiple).toBe(props.component.meta.height); - expect(resizableProps.maxWidthMultiple).toBe( - props.component.meta.width + props.availableColumnCount, - ); - }); - - it('should render a div with class "dashboard-component-chart-holder"', () => { - const wrapper = setup(); - expect(wrapper.find('.dashboard-component-chart-holder')).toExist(); - }); - - it('should render a Chart', () => { - const wrapper = setup(); - expect(wrapper.find(Chart)).toExist(); - }); - - it('should render a HoverMenu with DeleteComponentButton in editMode', () => { - let wrapper = setup(); - expect(wrapper.find(HoverMenu)).not.toExist(); - expect(wrapper.find(DeleteComponentButton)).not.toExist(); - - // we cannot set props on the Divider because of the WithDragDropContext wrapper - wrapper = setup({ editMode: true }); - expect(wrapper.find(HoverMenu)).toExist(); - expect(wrapper.find(DeleteComponentButton)).toExist(); - }); - - it('should call deleteComponent when deleted', () => { - const deleteComponent = sinon.spy(); - const wrapper = setup({ editMode: true, deleteComponent }); - wrapper.find(DeleteComponentButton).simulate('click'); - expect(deleteComponent.callCount).toBe(1); - }); -}); diff --git a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.test.tsx b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.test.tsx index 09cd34738e5e..4470d616fc59 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.test.tsx +++ b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.test.tsx @@ -18,25 +18,40 @@ */ import React from 'react'; +import { combineReducers, createStore, applyMiddleware, compose } from 'redux'; +import { Provider } from 'react-redux'; +import thunk from 'redux-thunk'; +import sinon from 'sinon'; +import userEvent from '@testing-library/user-event'; +import mockState from 'spec/fixtures/mockState'; +import reducerIndex from 'spec/helpers/reducerIndex'; import { sliceId as chartId } from 'spec/fixtures/mockChartQueries'; +import { + screen, + render, + waitFor, + fireEvent, +} from 'spec/helpers/testing-library'; import { nativeFiltersInfo } from 'src/dashboard/fixtures/mockNativeFilters'; import newComponentFactory from 'src/dashboard/util/newComponentFactory'; -import { getMockStore } from 'spec/fixtures/mockStore'; import { initialState } from 'src/SqlLab/fixtures'; -import { DndProvider } from 'react-dnd'; -import { HTML5Backend } from 'react-dnd-html5-backend'; -import { Provider } from 'react-redux'; -import { screen, render } from 'spec/helpers/testing-library'; -import { CHART_TYPE, ROW_TYPE } from '../../util/componentTypes'; -import { ChartHolder } from './index'; +import { SET_DIRECT_PATH } from 'src/dashboard/actions/dashboardState'; +import { CHART_TYPE, COLUMN_TYPE, ROW_TYPE } from '../../util/componentTypes'; +import ChartHolder, { CHART_MARGIN } from './ChartHolder'; +import { GRID_BASE_UNIT, GRID_GUTTER_SIZE } from '../../util/constants'; + +const DEFAULT_HEADER_HEIGHT = 22; describe('ChartHolder', () => { + let scrollViewBase: any; + const defaultProps = { component: { ...newComponentFactory(CHART_TYPE), - id: 'CHART_ID', + id: 'CHART-ID', parents: ['ROOT_ID', 'TABS_ID', 'TAB_ID', 'ROW_ID'], meta: { + uuid: `CHART-${chartId}`, chartId, width: 3, height: 10, @@ -50,7 +65,7 @@ describe('ChartHolder', () => { }, index: 0, depth: 0, - id: 'CHART_ID', + id: 'CHART-ID', parentId: 'ROW_ID', availableColumnCount: 12, columnWidth: 300, @@ -67,18 +82,31 @@ describe('ChartHolder', () => { fullSizeChartId: chartId, setFullSizeChartId: () => {}, }; - const mockStore = getMockStore({ - ...initialState, + + beforeAll(() => { + scrollViewBase = window.HTMLElement.prototype.scrollIntoView; + window.HTMLElement.prototype.scrollIntoView = () => {}; }); - const renderWrapper = () => - render( - <Provider store={mockStore}> - <DndProvider backend={HTML5Backend}> - <ChartHolder {...defaultProps} />{' '} - </DndProvider> - </Provider>, + + afterAll(() => { + window.HTMLElement.prototype.scrollIntoView = scrollViewBase; + }); + + const createMockStore = (customState: any = {}) => + createStore( + combineReducers(reducerIndex), + { ...mockState, ...(initialState as any), ...customState }, + compose(applyMiddleware(thunk)), ); + const renderWrapper = (store = createMockStore(), props: any = {}) => + render(<ChartHolder {...defaultProps} {...props} />, { + useRouter: true, + useDnd: true, + useRedux: true, + store, + }); + it('should render empty state', async () => { renderWrapper(); @@ -92,4 +120,315 @@ describe('ChartHolder', () => { ).not.toBeInTheDocument(); // description should display only in Explore view expect(screen.getByAltText('empty')).toBeVisible(); }); + + it('should render anchor link when not editing', async () => { + const store = createMockStore(); + const { rerender } = renderWrapper(store, { editMode: false }); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).toBeVisible(); + + expect( + screen + .getByTestId('dashboard-component-chart-holder') + .getElementsByClassName('anchor-link-container').length, + ).toEqual(1); + + rerender( + <Provider store={store}> + <ChartHolder {...defaultProps} editMode isInView /> + </Provider>, + ); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).toBeVisible(); + + expect( + screen + .getByTestId('dashboard-component-chart-holder') + .getElementsByClassName('anchor-link-container').length, + ).toEqual(0); + }); + + it('should highlight when path matches', async () => { + const store = createMockStore({ + dashboardState: { + ...mockState.dashboardState, + directPathToChild: ['CHART-ID'], + }, + }); + renderWrapper(store); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).toBeVisible(); + + expect(screen.getByTestId('dashboard-component-chart-holder')).toHaveClass( + 'fade-out', + ); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).not.toHaveClass('fade-in'); + + store.dispatch({ type: SET_DIRECT_PATH, path: ['CHART-ID'] }); + + await waitFor(() => { + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).not.toHaveClass('fade-out'); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).toHaveClass('fade-in'); + }); + + await waitFor( + () => { + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).toHaveClass('fade-out'); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).not.toHaveClass('fade-in'); + }, + { timeout: 5000 }, + ); + }); + + it('should calculate the default widthMultiple', async () => { + const widthMultiple = 5; + renderWrapper(createMockStore(), { + editMode: true, + component: { + ...defaultProps.component, + meta: { + ...defaultProps.component.meta, + width: widthMultiple, + }, + }, + }); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).toBeVisible(); + + const resizeContainer = screen + .getByTestId('dragdroppable-object') + .getElementsByClassName('resizable-container')[0]; + + const { width: computedWidth } = getComputedStyle(resizeContainer); + const expectedWidth = + (defaultProps.columnWidth + GRID_GUTTER_SIZE) * widthMultiple - + GRID_GUTTER_SIZE; + + expect(computedWidth).toEqual(`${expectedWidth}px`); + }); + + it('should set the resizable width to auto when parent component type is column', async () => { + renderWrapper(createMockStore(), { + editMode: true, + parentComponent: { + ...newComponentFactory(COLUMN_TYPE), + id: 'ROW_ID', + children: ['COLUMN_ID'], + }, + }); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).toBeVisible(); + + const resizeContainer = screen + .getByTestId('dragdroppable-object') + .getElementsByClassName('resizable-container')[0]; + + const { width: computedWidth } = getComputedStyle(resizeContainer); + + // the width is only adjustable if the parent component is row type + expect(computedWidth).toEqual('auto'); + }); + + it("should override the widthMultiple if there's a column in the parent chain whose width is less than the chart", async () => { + const widthMultiple = 10; + const parentColumnWidth = 6; + renderWrapper(createMockStore(), { + editMode: true, + component: { + ...defaultProps.component, + meta: { + ...defaultProps.component.meta, + width: widthMultiple, + }, + }, + // Return the first column in the chain + getComponentById: () => + newComponentFactory(COLUMN_TYPE, { width: parentColumnWidth }), + }); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).toBeVisible(); + + const resizeContainer = screen + .getByTestId('dragdroppable-object') + .getElementsByClassName('resizable-container')[0]; + + const { width: computedWidth } = getComputedStyle(resizeContainer); + const expectedWidth = + (defaultProps.columnWidth + GRID_GUTTER_SIZE) * parentColumnWidth - + GRID_GUTTER_SIZE; + + expect(computedWidth).toEqual(`${expectedWidth}px`); + }); + + it('should calculate the chartWidth', async () => { + const widthMultiple = 7; + const columnWidth = 250; + renderWrapper(createMockStore(), { + fullSizeChartId: null, + component: { + ...defaultProps.component, + meta: { + ...defaultProps.component.meta, + width: widthMultiple, + }, + }, + columnWidth, + }); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).toBeVisible(); + + const container = screen.getByTestId('chart-container'); + + const computedWidth = parseInt(container.getAttribute('width') || '0', 10); + const expectedWidth = Math.floor( + widthMultiple * columnWidth + + (widthMultiple - 1) * GRID_GUTTER_SIZE - + CHART_MARGIN, + ); + + expect(computedWidth).toEqual(expectedWidth); + }); + + it('should calculate the chartWidth on full screen mode', async () => { + const widthMultiple = 7; + const columnWidth = 250; + renderWrapper(createMockStore(), { + component: { + ...defaultProps.component, + meta: { + ...defaultProps.component.meta, + width: widthMultiple, + }, + }, + columnWidth, + }); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).toBeVisible(); + + const container = screen.getByTestId('chart-container'); + + const computedWidth = parseInt(container.getAttribute('width') || '0', 10); + const expectedWidth = window.innerWidth - CHART_MARGIN; + + expect(computedWidth).toEqual(expectedWidth); + }); + + it('should calculate the chartHeight', async () => { + const heightMultiple = 12; + renderWrapper(createMockStore(), { + fullSizeChartId: null, + component: { + ...defaultProps.component, + meta: { + ...defaultProps.component.meta, + height: heightMultiple, + }, + }, + }); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).toBeVisible(); + + const container = screen.getByTestId('chart-container'); + + const computedWidth = parseInt(container.getAttribute('height') || '0', 10); + const expectedWidth = Math.floor( + heightMultiple * GRID_BASE_UNIT - CHART_MARGIN - DEFAULT_HEADER_HEIGHT, + ); + + expect(computedWidth).toEqual(expectedWidth); + }); + + it('should calculate the chartHeight on full screen mode', async () => { + const heightMultiple = 12; + renderWrapper(createMockStore(), { + component: { + ...defaultProps.component, + meta: { + ...defaultProps.component.meta, + height: heightMultiple, + }, + }, + }); + + expect( + screen.getByTestId('dashboard-component-chart-holder'), + ).toBeVisible(); + + const container = screen.getByTestId('chart-container'); + + const computedWidth = parseInt(container.getAttribute('height') || '0', 10); + const expectedWidth = + window.innerHeight - CHART_MARGIN - DEFAULT_HEADER_HEIGHT; + + expect(computedWidth).toEqual(expectedWidth); + }); + + it('should call deleteComponent when deleted', async () => { + const deleteComponent = sinon.spy(); + const store = createMockStore(); + const { rerender } = renderWrapper(store, { + editMode: false, + fullSizeChartId: null, + deleteComponent, + }); + + expect( + screen.queryByTestId('dashboard-delete-component-button'), + ).not.toBeInTheDocument(); + + rerender( + <Provider store={store}> + <ChartHolder + {...defaultProps} + deleteComponent={deleteComponent} + fullSizeChartId={null} + editMode + isInView + /> + </Provider>, + ); + + expect( + screen.getByTestId('dashboard-delete-component-button'), + ).toBeInTheDocument(); + + userEvent.hover(screen.getByTestId('dashboard-component-chart-holder')); + + fireEvent.click( + screen.getByTestId('dashboard-delete-component-button') + .firstElementChild!, + ); + expect(deleteComponent.callCount).toBe(1); + }); }); diff --git a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.tsx b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.tsx new file mode 100644 index 000000000000..a93f3b0b8db6 --- /dev/null +++ b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.tsx @@ -0,0 +1,334 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useState, useMemo, useCallback, useEffect } from 'react'; +import { ResizeCallback, ResizeStartCallback } from 're-resizable'; +import cx from 'classnames'; +import { useSelector } from 'react-redux'; +import { css } from '@superset-ui/core'; +import { LayoutItem, RootState } from 'src/dashboard/types'; +import AnchorLink from 'src/dashboard/components/AnchorLink'; +import Chart from 'src/dashboard/containers/Chart'; +import DeleteComponentButton from 'src/dashboard/components/DeleteComponentButton'; +import DragDroppable from 'src/dashboard/components/dnd/DragDroppable'; +import HoverMenu from 'src/dashboard/components/menu/HoverMenu'; +import ResizableContainer from 'src/dashboard/components/resizable/ResizableContainer'; +import getChartAndLabelComponentIdFromPath from 'src/dashboard/util/getChartAndLabelComponentIdFromPath'; +import useFilterFocusHighlightStyles from 'src/dashboard/util/useFilterFocusHighlightStyles'; +import { COLUMN_TYPE, ROW_TYPE } from 'src/dashboard/util/componentTypes'; +import { + GRID_BASE_UNIT, + GRID_GUTTER_SIZE, + GRID_MIN_COLUMN_COUNT, + GRID_MIN_ROW_UNITS, +} from 'src/dashboard/util/constants'; + +export const CHART_MARGIN = 32; + +interface ChartHolderProps { + id: string; + parentId: string; + dashboardId: number; + component: LayoutItem; + parentComponent: LayoutItem; + getComponentById?: (id?: string) => LayoutItem | undefined; + index: number; + depth: number; + editMode: boolean; + directPathLastUpdated?: number; + fullSizeChartId: number | null; + isComponentVisible: boolean; + + // grid related + availableColumnCount: number; + columnWidth: number; + onResizeStart: ResizeStartCallback; + onResize: ResizeCallback; + onResizeStop: ResizeCallback; + + // dnd + deleteComponent: (id: string, parentId: string) => void; + updateComponents: Function; + handleComponentDrop: (...args: unknown[]) => unknown; + setFullSizeChartId: (chartId: number | null) => void; + isInView: boolean; +} + +const fullSizeStyle = css` + && { + position: fixed; + z-index: 3000; + left: 0; + top: 0; + } +`; + +const ChartHolder: React.FC<ChartHolderProps> = ({ + id, + parentId, + component, + parentComponent, + index, + depth, + availableColumnCount, + columnWidth, + onResizeStart, + onResize, + onResizeStop, + editMode, + isComponentVisible, + dashboardId, + fullSizeChartId, + getComponentById = () => undefined, + deleteComponent, + updateComponents, + handleComponentDrop, + setFullSizeChartId, + isInView, +}) => { + const { chartId } = component.meta; + const isFullSize = fullSizeChartId === chartId; + + const focusHighlightStyles = useFilterFocusHighlightStyles(chartId); + const dashboardState = useSelector( + (state: RootState) => state.dashboardState, + ); + const [extraControls, setExtraControls] = useState<Record<string, unknown>>( + {}, + ); + const [outlinedComponentId, setOutlinedComponentId] = useState<string>(); + const [outlinedColumnName, setOutlinedColumnName] = useState<string>(); + const [currentDirectPathLastUpdated, setCurrentDirectPathLastUpdated] = + useState(0); + + const directPathToChild = useMemo( + () => dashboardState?.directPathToChild ?? [], + [dashboardState], + ); + + const directPathLastUpdated = useMemo( + () => dashboardState?.directPathLastUpdated ?? 0, + [dashboardState], + ); + + const infoFromPath = useMemo( + () => getChartAndLabelComponentIdFromPath(directPathToChild) as any, + [directPathToChild], + ); + + // Calculate if the chart should be outlined + useEffect(() => { + const { label: columnName, chart: chartComponentId } = infoFromPath; + + if ( + directPathLastUpdated !== currentDirectPathLastUpdated && + component.id === chartComponentId + ) { + setCurrentDirectPathLastUpdated(directPathLastUpdated); + setOutlinedComponentId(component.id); + setOutlinedColumnName(columnName); + } + }, [ + component, + currentDirectPathLastUpdated, + directPathLastUpdated, + infoFromPath, + ]); + + // Remove the chart outline after a defined time + useEffect(() => { + let timerId: NodeJS.Timeout | undefined; + if (outlinedComponentId) { + timerId = setTimeout(() => { + setOutlinedComponentId(undefined); + setOutlinedColumnName(undefined); + }, 2000); + } + + return () => { + if (timerId) { + clearTimeout(timerId); + } + }; + }, [outlinedComponentId]); + + const widthMultiple = useMemo(() => { + const columnParentWidth = getComponentById( + parentComponent.parents?.find(parent => parent.startsWith(COLUMN_TYPE)), + )?.meta?.width; + + let widthMultiple = component.meta.width || GRID_MIN_COLUMN_COUNT; + if (parentComponent.type === COLUMN_TYPE) { + widthMultiple = parentComponent.meta.width || GRID_MIN_COLUMN_COUNT; + } else if (columnParentWidth && widthMultiple > columnParentWidth) { + widthMultiple = columnParentWidth; + } + + return widthMultiple; + }, [ + component, + getComponentById, + parentComponent.meta.width, + parentComponent.parents, + parentComponent.type, + ]); + + const { chartWidth, chartHeight } = useMemo(() => { + let chartWidth = 0; + let chartHeight = 0; + + if (isFullSize) { + chartWidth = window.innerWidth - CHART_MARGIN; + chartHeight = window.innerHeight - CHART_MARGIN; + } else { + chartWidth = Math.floor( + widthMultiple * columnWidth + + (widthMultiple - 1) * GRID_GUTTER_SIZE - + CHART_MARGIN, + ); + chartHeight = Math.floor( + component.meta.height * GRID_BASE_UNIT - CHART_MARGIN, + ); + } + + return { + chartWidth, + chartHeight, + }; + }, [columnWidth, component, isFullSize, widthMultiple]); + + const handleDeleteComponent = useCallback(() => { + deleteComponent(id, parentId); + }, [deleteComponent, id, parentId]); + + const handleUpdateSliceName = useCallback( + (nextName: string) => { + updateComponents({ + [component.id]: { + ...component, + meta: { + ...component.meta, + sliceNameOverride: nextName, + }, + }, + }); + }, + [component, updateComponents], + ); + + const handleToggleFullSize = useCallback(() => { + setFullSizeChartId(isFullSize ? null : chartId); + }, [chartId, isFullSize, setFullSizeChartId]); + + const handleExtraControl = useCallback((name: string, value: unknown) => { + setExtraControls(current => ({ + ...current, + [name]: value, + })); + }, []); + + return ( + <DragDroppable + component={component} + parentComponent={parentComponent} + orientation={parentComponent.type === ROW_TYPE ? 'column' : 'row'} + index={index} + depth={depth} + onDrop={handleComponentDrop} + disableDragDrop={false} + editMode={editMode} + > + {({ dropIndicatorProps, dragSourceRef }) => ( + <ResizableContainer + id={component.id} + adjustableWidth={parentComponent.type === ROW_TYPE} + adjustableHeight + widthStep={columnWidth} + widthMultiple={widthMultiple} + heightStep={GRID_BASE_UNIT} + heightMultiple={component.meta.height} + minWidthMultiple={GRID_MIN_COLUMN_COUNT} + minHeightMultiple={GRID_MIN_ROW_UNITS} + maxWidthMultiple={availableColumnCount + widthMultiple} + onResizeStart={onResizeStart} + onResize={onResize} + onResizeStop={onResizeStop} + editMode={editMode} + > + <div + ref={dragSourceRef} + data-test="dashboard-component-chart-holder" + style={focusHighlightStyles} + css={isFullSize ? fullSizeStyle : undefined} + className={cx( + 'dashboard-component', + 'dashboard-component-chart-holder', + // The following class is added to support custom dashboard styling via the CSS editor + `dashboard-chart-id-${chartId}`, + outlinedComponentId ? 'fade-in' : 'fade-out', + )} + > + {!editMode && ( + <AnchorLink + id={component.id} + scrollIntoView={outlinedComponentId === component.id} + /> + )} + {!!outlinedComponentId && ( + <style> + {`label[for=${outlinedColumnName}] + .Select .Select__control { + border-color: #00736a; + transition: border-color 1s ease-in-out; + }`} + </style> + )} + <Chart + componentId={component.id} + id={component.meta.chartId} + dashboardId={dashboardId} + width={chartWidth} + height={chartHeight} + sliceName={ + component.meta.sliceNameOverride || + component.meta.sliceName || + '' + } + updateSliceName={handleUpdateSliceName} + isComponentVisible={isComponentVisible} + handleToggleFullSize={handleToggleFullSize} + isFullSize={isFullSize} + setControlValue={handleExtraControl} + extraControls={extraControls} + isInView={isInView} + /> + {editMode && ( + <HoverMenu position="top"> + <div data-test="dashboard-delete-component-button"> + <DeleteComponentButton onDelete={handleDeleteComponent} /> + </div> + </HoverMenu> + )} + </div> + {dropIndicatorProps && <div {...dropIndicatorProps} />} + </ResizableContainer> + )} + </DragDroppable> + ); +}; + +export default ChartHolder; diff --git a/superset-frontend/src/dashboard/components/gridComponents/Column.jsx b/superset-frontend/src/dashboard/components/gridComponents/Column.jsx index 90666d6d9883..1883531404f7 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Column.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Column.jsx @@ -19,6 +19,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import cx from 'classnames'; +import { css, styled, t } from '@superset-ui/core'; import Icons from 'src/components/Icons'; import DashboardComponent from 'src/dashboard/containers/DashboardComponent'; import DeleteComponentButton from 'src/dashboard/components/DeleteComponentButton'; @@ -58,6 +59,46 @@ const propTypes = { const defaultProps = {}; +const ColumnStyles = styled.div` + ${({ theme }) => css` + &.grid-column { + width: 100%; + position: relative; + + & > :not(.hover-menu):not(:last-child) { + margin-bottom: ${theme.gridUnit * 4}px; + } + } + + .dashboard--editing &:after { + content: ''; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 1; + pointer-events: none; + border: 1px dashed ${theme.colors.grayscale.light2}; + } + .dashboard--editing .resizable-container--resizing:hover > &:after, + .dashboard--editing .hover-menu:hover + &:after { + border: 1px dashed ${theme.colors.primary.base}; + z-index: 2; + } + `} +`; + +const emptyColumnContentStyles = theme => css` + min-height: ${theme.gridUnit * 25}px; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + color: ${theme.colors.text.label}; +`; + class Column extends React.PureComponent { constructor(props) { super(props); @@ -172,32 +213,32 @@ class Column extends React.PureComponent { /> </HoverMenu> )} - <div - className={cx( - 'grid-column', - columnItems.length === 0 && 'grid-column--empty', - backgroundStyle.className, - )} + <ColumnStyles + className={cx('grid-column', backgroundStyle.className)} > - {columnItems.map((componentId, itemIndex) => ( - <DashboardComponent - key={componentId} - id={componentId} - parentId={columnComponent.id} - depth={depth + 1} - index={itemIndex} - availableColumnCount={columnComponent.meta.width} - columnWidth={columnWidth} - onResizeStart={onResizeStart} - onResize={onResize} - onResizeStop={onResizeStop} - isComponentVisible={isComponentVisible} - onChangeTab={onChangeTab} - /> - ))} + {columnItems.length === 0 ? ( + <div css={emptyColumnContentStyles}>{t('Empty column')}</div> + ) : ( + columnItems.map((componentId, itemIndex) => ( + <DashboardComponent + key={componentId} + id={componentId} + parentId={columnComponent.id} + depth={depth + 1} + index={itemIndex} + availableColumnCount={columnComponent.meta.width} + columnWidth={columnWidth} + onResizeStart={onResizeStart} + onResize={onResize} + onResizeStop={onResizeStop} + isComponentVisible={isComponentVisible} + onChangeTab={onChangeTab} + /> + )) + )} {dropIndicatorProps && <div {...dropIndicatorProps} />} - </div> + </ColumnStyles> </WithPopoverMenu> </ResizableContainer> )} diff --git a/superset-frontend/src/dashboard/components/gridComponents/Column.test.jsx b/superset-frontend/src/dashboard/components/gridComponents/Column.test.jsx index a117d9082097..72e89075b58c 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Column.test.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Column.test.jsx @@ -20,6 +20,7 @@ import { Provider } from 'react-redux'; import React from 'react'; import { mount } from 'enzyme'; import sinon from 'sinon'; +import { MemoryRouter } from 'react-router-dom'; import { supersetTheme, ThemeProvider } from '@superset-ui/core'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; @@ -71,9 +72,11 @@ describe('Column', () => { }); const wrapper = mount( <Provider store={mockStore}> - <DndProvider backend={HTML5Backend}> - <Column {...props} {...overrideProps} /> - </DndProvider> + <MemoryRouter> + <DndProvider backend={HTML5Backend}> + <Column {...props} {...overrideProps} /> + </DndProvider> + </MemoryRouter> </Provider>, { wrappingComponent: ThemeProvider, diff --git a/superset-frontend/src/dashboard/components/gridComponents/Divider.jsx b/superset-frontend/src/dashboard/components/gridComponents/Divider.jsx index 8be4fe892485..078405be3e4a 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Divider.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Divider.jsx @@ -18,6 +18,7 @@ */ import React from 'react'; import PropTypes from 'prop-types'; +import { css, styled } from '@superset-ui/core'; import DragDroppable from '../dnd/DragDroppable'; import HoverMenu from '../menu/HoverMenu'; @@ -36,6 +37,31 @@ const propTypes = { deleteComponent: PropTypes.func.isRequired, }; +const DividerLine = styled.div` + ${({ theme }) => css` + width: 100%; + padding: ${theme.gridUnit * 2}px 0; /* this is padding not margin to enable a larger mouse target */ + background-color: transparent; + + &:after { + content: ''; + height: 1px; + width: 100%; + background-color: ${theme.colors.grayscale.light2}; + display: block; + } + + div[draggable='true'] & { + cursor: move; + } + + .dashboard-component-tabs & { + padding-left: ${theme.gridUnit * 4}px; + padding-right: ${theme.gridUnit * 4}px; + } + `} +`; + class Divider extends React.PureComponent { constructor(props) { super(props); @@ -75,7 +101,7 @@ class Divider extends React.PureComponent { </HoverMenu> )} - <div className="dashboard-component dashboard-component-divider" /> + <DividerLine className="dashboard-component dashboard-component-divider" /> {dropIndicatorProps && <div {...dropIndicatorProps} />} </div> diff --git a/superset-frontend/src/dashboard/components/gridComponents/Header.jsx b/superset-frontend/src/dashboard/components/gridComponents/Header.jsx index 938a48bf099d..253f377fc2f7 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Header.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Header.jsx @@ -19,6 +19,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import cx from 'classnames'; +import { css, styled } from '@superset-ui/core'; import PopoverDropdown from 'src/components/PopoverDropdown'; import EditableTitle from 'src/components/EditableTitle'; @@ -55,6 +56,64 @@ const propTypes = { const defaultProps = {}; +const HeaderStyles = styled.div` + ${({ theme }) => css` + font-weight: ${theme.typography.weights.bold}; + width: 100%; + padding: ${theme.gridUnit * 4}px 0; + + &.header-small { + font-size: ${theme.typography.sizes.l}px; + } + + &.header-medium { + font-size: ${theme.typography.sizes.xl}px; + } + + &.header-large { + font-size: ${theme.typography.sizes.xxl}px; + } + + .dashboard--editing .dashboard-grid & { + &:after { + border: 1px dashed transparent; + content: ''; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 1; + pointer-events: none; + } + + &:hover:after { + border: 1px dashed ${theme.colors.primary.base}; + z-index: 2; + } + } + + .dashboard--editing .dragdroppable-row & { + cursor: move; + } + + /** + * grids add margin between items, so don't double pad within columns + * we'll not worry about double padding on top as it can serve as a visual separator + */ + .grid-column > :not(:last-child) & { + margin-bottom: ${theme.gridUnit * -4}px; + } + + .background--white &, + &.background--white, + .dashboard-component-tabs & { + padding-left: ${theme.gridUnit * 4}px; + padding-right: ${theme.gridUnit * 4}px; + } + `} +`; + class Header extends React.PureComponent { constructor(props) { super(props); @@ -154,7 +213,7 @@ class Header extends React.PureComponent { ]} editMode={editMode} > - <div + <HeaderStyles className={cx( 'dashboard-component', 'dashboard-component-header', @@ -178,7 +237,7 @@ class Header extends React.PureComponent { {!editMode && ( <AnchorLink id={component.id} dashboardId={dashboardId} /> )} - </div> + </HeaderStyles> </WithPopoverMenu> {dropIndicatorProps && <div {...dropIndicatorProps} />} diff --git a/superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx b/superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx index a6dfe4e2b84b..9febfacf909d 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx @@ -21,7 +21,7 @@ import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import cx from 'classnames'; -import { t, SafeMarkdown } from '@superset-ui/core'; +import { css, styled, t, SafeMarkdown } from '@superset-ui/core'; import { Logger, LOG_ACTIONS_RENDER_CHART } from 'src/logger/LogUtils'; import { MarkdownEditor } from 'src/components/AsyncAceEditor'; @@ -73,16 +73,48 @@ const propTypes = { const defaultProps = {}; -const MARKDOWN_PLACE_HOLDER = `# ✨Markdown -## ✨Markdown -### ✨Markdown +// TODO: localize +const MARKDOWN_PLACE_HOLDER = `# ✨Header 1 +## ✨Header 2 +### ✨Header 3 <br /> -Click here to edit [markdown](https://bit.ly/1dQOfRK)`; +Click here to learn more about [markdown formatting](https://bit.ly/1dQOfRK)`; const MARKDOWN_ERROR_MESSAGE = t('This markdown component has an error.'); +const MarkdownStyles = styled.div` + ${({ theme }) => css` + &.dashboard-markdown { + overflow: hidden; + + h4, + h5, + h6 { + font-weight: ${theme.typography.weights.normal}; + } + + h5 { + color: ${theme.colors.grayscale.base}; + } + + h6 { + font-size: ${theme.typography.sizes.s}px; + } + + .dashboard-component-chart-holder { + overflow-y: auto; + overflow-x: hidden; + } + + .dashboard--editing & { + cursor: move; + } + } + `} +`; + class Markdown extends React.PureComponent { constructor(props) { super(props); @@ -322,7 +354,7 @@ class Markdown extends React.PureComponent { ]} editMode={editMode} > - <div + <MarkdownStyles data-test="dashboard-markdown-editor" className={cx( 'dashboard-markdown', @@ -363,7 +395,7 @@ class Markdown extends React.PureComponent { : this.renderPreviewMode()} </div> </ResizableContainer> - </div> + </MarkdownStyles> {dropIndicatorProps && <div {...dropIndicatorProps} />} </WithPopoverMenu> )} diff --git a/superset-frontend/src/dashboard/components/gridComponents/Row.jsx b/superset-frontend/src/dashboard/components/gridComponents/Row.jsx index b0037bf12322..ae3db36d1dbf 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Row.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Row.jsx @@ -19,6 +19,13 @@ import React from 'react'; import PropTypes from 'prop-types'; import cx from 'classnames'; +import { + css, + FeatureFlag, + isFeatureEnabled, + styled, + t, +} from '@superset-ui/core'; import DragDroppable from 'src/dashboard/components/dnd/DragDroppable'; import DragHandle from 'src/dashboard/components/dnd/DragHandle'; @@ -32,6 +39,7 @@ import WithPopoverMenu from 'src/dashboard/components/menu/WithPopoverMenu'; import { componentShape } from 'src/dashboard/util/propShapes'; import backgroundStyleOptions from 'src/dashboard/util/backgroundStyleOptions'; import { BACKGROUND_TRANSPARENT } from 'src/dashboard/util/constants'; +import { isCurrentUserBot } from 'src/utils/isBot'; const propTypes = { id: PropTypes.string.isRequired, @@ -56,11 +64,42 @@ const propTypes = { updateComponents: PropTypes.func.isRequired, }; +const GridRow = styled.div` + ${({ theme }) => css` + position: relative; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: flex-start; + width: 100%; + height: fit-content; + + & > :not(:last-child):not(.hover-menu) { + margin-right: ${theme.gridUnit * 4}px; + } + + &.grid-row--empty { + min-height: ${theme.gridUnit * 25}px; + } + `} +`; + +const emptyRowContentStyles = theme => css` + position: absolute; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + color: ${theme.colors.text.label}; +`; + class Row extends React.PureComponent { constructor(props) { super(props); this.state = { isFocused: false, + isInView: false, }; this.handleDeleteComponent = this.handleDeleteComponent.bind(this); this.handleUpdateMeta = this.handleUpdateMeta.bind(this); @@ -69,6 +108,50 @@ class Row extends React.PureComponent { 'background', ); this.handleChangeFocus = this.handleChangeFocus.bind(this); + + this.containerRef = React.createRef(); + this.observerEnabler = null; + this.observerDisabler = null; + } + + // if chart not rendered - render it if it's less than 1 view height away from current viewport + // if chart rendered - remove it if it's more than 4 view heights away from current viewport + componentDidMount() { + if ( + isFeatureEnabled(FeatureFlag.DASHBOARD_VIRTUALIZATION) && + !isCurrentUserBot() + ) { + this.observerEnabler = new IntersectionObserver( + ([entry]) => { + if (entry.isIntersecting && !this.state.isInView) { + this.setState({ isInView: true }); + } + }, + { + rootMargin: '100% 0px', + }, + ); + this.observerDisabler = new IntersectionObserver( + ([entry]) => { + if (!entry.isIntersecting && this.state.isInView) { + this.setState({ isInView: false }); + } + }, + { + rootMargin: '400% 0px', + }, + ); + const element = this.containerRef.current; + if (element) { + this.observerEnabler.observe(element); + this.observerDisabler.observe(element); + } + } + } + + componentWillUnmount() { + this.observerEnabler?.disconnect(); + this.observerDisabler?.disconnect(); } handleChangeFocus(nextFocus) { @@ -154,35 +237,41 @@ class Row extends React.PureComponent { /> </HoverMenu> )} - <div + <GridRow className={cx( 'grid-row', rowItems.length === 0 && 'grid-row--empty', backgroundStyle.className, )} data-test={`grid-row-${backgroundStyle.className}`} + ref={this.containerRef} > - {rowItems.map((componentId, itemIndex) => ( - <DashboardComponent - key={componentId} - id={componentId} - parentId={rowComponent.id} - depth={depth + 1} - index={itemIndex} - availableColumnCount={ - availableColumnCount - occupiedColumnCount - } - columnWidth={columnWidth} - onResizeStart={onResizeStart} - onResize={onResize} - onResizeStop={onResizeStop} - isComponentVisible={isComponentVisible} - onChangeTab={onChangeTab} - /> - ))} + {rowItems.length === 0 ? ( + <div css={emptyRowContentStyles}>{t('Empty row')}</div> + ) : ( + rowItems.map((componentId, itemIndex) => ( + <DashboardComponent + key={componentId} + id={componentId} + parentId={rowComponent.id} + depth={depth + 1} + index={itemIndex} + availableColumnCount={ + availableColumnCount - occupiedColumnCount + } + columnWidth={columnWidth} + onResizeStart={onResizeStart} + onResize={onResize} + onResizeStop={onResizeStop} + isComponentVisible={isComponentVisible} + onChangeTab={onChangeTab} + isInView={this.state.isInView} + /> + )) + )} {dropIndicatorProps && <div {...dropIndicatorProps} />} - </div> + </GridRow> </WithPopoverMenu> )} </DragDroppable> diff --git a/superset-frontend/src/dashboard/components/gridComponents/Row.test.jsx b/superset-frontend/src/dashboard/components/gridComponents/Row.test.jsx index 86cf613b6f27..84591e5a882c 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Row.test.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Row.test.jsx @@ -22,6 +22,7 @@ import { mount } from 'enzyme'; import sinon from 'sinon'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; +import { MemoryRouter } from 'react-router-dom'; import BackgroundStyleDropdown from 'src/dashboard/components/menu/BackgroundStyleDropdown'; import DashboardComponent from 'src/dashboard/containers/DashboardComponent'; @@ -67,9 +68,11 @@ describe('Row', () => { }); const wrapper = mount( <Provider store={mockStore}> - <DndProvider backend={HTML5Backend}> - <Row {...props} {...overrideProps} /> - </DndProvider> + <MemoryRouter> + <DndProvider backend={HTML5Backend}> + <Row {...props} {...overrideProps} /> + </DndProvider> + </MemoryRouter> </Provider>, { wrappingComponent: ThemeProvider, diff --git a/superset-frontend/src/dashboard/components/gridComponents/Tab.jsx b/superset-frontend/src/dashboard/components/gridComponents/Tab.jsx index d8312cd60a9d..32ac77936c6a 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Tab.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Tab.jsx @@ -43,6 +43,7 @@ const propTypes = { depth: PropTypes.number.isRequired, renderType: PropTypes.oneOf([RENDER_TAB, RENDER_TAB_CONTENT]).isRequired, onDropOnTab: PropTypes.func, + onHoverTab: PropTypes.func, editMode: PropTypes.bool.isRequired, canEdit: PropTypes.bool.isRequired, @@ -64,6 +65,7 @@ const defaultProps = { availableColumnCount: 0, columnWidth: 0, onDropOnTab() {}, + onHoverTab() {}, onResizeStart() {}, onResize() {}, onResizeStop() {}, @@ -95,6 +97,7 @@ class Tab extends React.PureComponent { super(props); this.handleChangeText = this.handleChangeText.bind(this); this.handleDrop = this.handleDrop.bind(this); + this.handleOnHover = this.handleOnHover.bind(this); this.handleTopDropTargetDrop = this.handleTopDropTargetDrop.bind(this); this.handleChangeTab = this.handleChangeTab.bind(this); } @@ -123,6 +126,10 @@ class Tab extends React.PureComponent { this.props.onDropOnTab(dropResult); } + handleOnHover() { + this.props.onHoverTab(); + } + handleTopDropTargetDrop(dropResult) { if (dropResult) { this.props.handleComponentDrop({ @@ -216,6 +223,7 @@ class Tab extends React.PureComponent { depth={depth} // see isValidChild.js for why tabs don't increment child depth index={componentIndex} onDrop={this.handleDrop} + onHover={this.handleOnHover} availableColumnCount={availableColumnCount} columnWidth={columnWidth} onResizeStart={onResizeStart} @@ -234,6 +242,7 @@ class Tab extends React.PureComponent { index={tabComponent.children.length} depth={depth} onDrop={this.handleDrop} + onHover={this.handleOnHover} editMode className="empty-droptarget" > @@ -263,6 +272,7 @@ class Tab extends React.PureComponent { index={index} depth={depth} onDrop={this.handleDrop} + onHover={this.handleOnHover} editMode={editMode} > {({ dropIndicatorProps, dragSourceRef }) => ( diff --git a/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx b/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx index c579abb911b1..43ed8906906e 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx @@ -48,7 +48,12 @@ const propTypes = { editMode: PropTypes.bool.isRequired, renderHoverMenu: PropTypes.bool, directPathToChild: PropTypes.arrayOf(PropTypes.string), - filterboxMigrationState: FILTER_BOX_MIGRATION_STATES, + activeTabs: PropTypes.arrayOf(PropTypes.string), + filterboxMigrationState: PropTypes.oneOf( + Object.keys(FILTER_BOX_MIGRATION_STATES).map( + key => FILTER_BOX_MIGRATION_STATES[key], + ), + ), // actions (from DashboardComponent.jsx) logEvent: PropTypes.func.isRequired, @@ -74,6 +79,7 @@ const defaultProps = { renderHoverMenu: true, availableColumnCount: 0, columnWidth: 0, + activeTabs: [], directPathToChild: [], filterboxMigrationState: FILTER_BOX_MIGRATION_STATES.NOOP, setActiveTabs() {}, @@ -112,15 +118,7 @@ const StyledTabsContainer = styled.div` export class Tabs extends React.PureComponent { constructor(props) { super(props); - const tabIndex = Math.max( - 0, - findTabIndexByComponentId({ - currentComponent: props.component, - directPathToChild: props.directPathToChild, - }), - ); - const { children: tabIds } = props.component; - const activeKey = tabIds[tabIndex]; + const { tabIndex, activeKey } = this.getTabInfo(props); this.state = { tabIndex, @@ -155,6 +153,15 @@ export class Tabs extends React.PureComponent { this.setState(() => ({ tabIndex: maxIndex })); } + // reset tab index if dashboard was changed + if (nextProps.dashboardId !== this.props.dashboardId) { + const { tabIndex, activeKey } = this.getTabInfo(nextProps); + this.setState(() => ({ + tabIndex, + activeKey, + })); + } + if (nextProps.isComponentVisible) { const nextFocusComponent = getLeafComponentIdFromPath( nextProps.directPathToChild, @@ -187,15 +194,42 @@ export class Tabs extends React.PureComponent { } } + getTabInfo = props => { + let tabIndex = Math.max( + 0, + findTabIndexByComponentId({ + currentComponent: props.component, + directPathToChild: props.directPathToChild, + }), + ); + if (tabIndex === 0 && props.activeTabs?.length) { + props.component.children.forEach((tabId, index) => { + if (tabIndex === 0 && props.activeTabs.includes(tabId)) { + tabIndex = index; + } + }); + } + const { children: tabIds } = props.component; + const activeKey = tabIds[tabIndex]; + + return { + tabIndex, + activeKey, + }; + }; + showDeleteConfirmModal = key => { const { component, deleteComponent } = this.props; AntdModal.confirm({ title: t('Delete dashboard tab?'), content: ( <span> - Deleting a tab will remove all content within it. You may still - reverse this action with the <b>undo</b> button (cmd + z) until you - save your changes. + {t( + 'Deleting a tab will remove all content within it. You may still ' + + 'reverse this action with the', + )}{' '} + <b>{t('undo')}</b>{' '} + {t('button (cmd + z) until you save your changes.')} </span> ), onOk: () => { @@ -204,8 +238,8 @@ export class Tabs extends React.PureComponent { this.handleDeleteTab(tabIndex); }, okType: 'danger', - okText: 'DELETE', - cancelText: 'CANCEL', + okText: t('DELETE'), + cancelText: t('CANCEL'), icon: null, }); }; @@ -309,9 +343,10 @@ export class Tabs extends React.PureComponent { const { tabIndex: selectedTabIndex, activeKey } = this.state; let tabsToHighlight; - if (nativeFilters?.focusedFilterId) { - tabsToHighlight = - nativeFilters.filters[nativeFilters.focusedFilterId].tabsInScope; + const highlightedFilterId = + nativeFilters?.focusedFilterId || nativeFilters?.hoveredFilterId; + if (highlightedFilterId) { + tabsToHighlight = nativeFilters.filters[highlightedFilterId]?.tabsInScope; } return ( <DragDroppable @@ -361,6 +396,7 @@ export class Tabs extends React.PureComponent { availableColumnCount={availableColumnCount} columnWidth={columnWidth} onDropOnTab={this.handleDropOnTab} + onHoverTab={() => this.handleClickTab(tabIndex)} isFocused={activeKey === tabId} isHighlighted={ activeKey !== tabId && tabsToHighlight?.includes(tabId) @@ -408,6 +444,7 @@ Tabs.defaultProps = defaultProps; function mapStateToProps(state) { return { nativeFilters: state.nativeFilters, + activeTabs: state.dashboardState.activeTabs, directPathToChild: state.dashboardState.directPathToChild, filterboxMigrationState: state.dashboardState.filterboxMigrationState, }; diff --git a/superset-frontend/src/dashboard/components/gridComponents/Tabs.test.jsx b/superset-frontend/src/dashboard/components/gridComponents/Tabs.test.jsx index 0ceb2f47bac8..8a4f5117187c 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Tabs.test.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Tabs.test.jsx @@ -40,7 +40,7 @@ import { nativeFilters } from 'spec/fixtures/mockNativeFilters'; import { initialState } from 'src/SqlLab/fixtures'; describe('Tabs', () => { - fetchMock.post('glob:*/r/shortner/', {}); + fetchMock.post('glob:*/r/shortener/', {}); const props = { id: 'TABS_ID', @@ -53,6 +53,7 @@ describe('Tabs', () => { editMode: false, availableColumnCount: 12, columnWidth: 50, + dashboardId: 1, onResizeStart() {}, onResize() {}, onResizeStop() {}, @@ -202,4 +203,15 @@ describe('Tabs', () => { expect(modalMock.mock.calls).toHaveLength(1); expect(deleteComponent.callCount).toBe(0); }); + + it('should set new tab key if dashboardId was changed', () => { + const wrapper = shallow(<Tabs {...props} />); + expect(wrapper.state('activeKey')).toBe('TAB_ID'); + wrapper.setProps({ + ...props, + dashboardId: 2, + component: dashboardLayoutWithTabs.present.TAB_ID, + }); + expect(wrapper.state('activeKey')).toBe('ROW_ID'); + }); }); diff --git a/superset-frontend/src/dashboard/components/gridComponents/new/DraggableNewComponent.jsx b/superset-frontend/src/dashboard/components/gridComponents/new/DraggableNewComponent.jsx index f4f33c9333df..c261fd2da25e 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/new/DraggableNewComponent.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/new/DraggableNewComponent.jsx @@ -19,10 +19,11 @@ import React from 'react'; import PropTypes from 'prop-types'; import cx from 'classnames'; +import { css, styled } from '@superset-ui/core'; -import DragDroppable from '../../dnd/DragDroppable'; -import { NEW_COMPONENTS_SOURCE_ID } from '../../../util/constants'; -import { NEW_COMPONENT_SOURCE_TYPE } from '../../../util/componentTypes'; +import DragDroppable from 'src/dashboard/components/dnd/DragDroppable'; +import { NEW_COMPONENTS_SOURCE_ID } from 'src/dashboard/util/constants'; +import { NEW_COMPONENT_SOURCE_TYPE } from 'src/dashboard/util/componentTypes'; const propTypes = { id: PropTypes.string.isRequired, @@ -35,6 +36,53 @@ const defaultProps = { className: null, }; +const NewComponent = styled.div` + ${({ theme }) => css` + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + padding: ${theme.gridUnit * 4}px; + background: ${theme.colors.grayscale.light5}; + cursor: move; + + &:not(.static):hover { + background: ${theme.colors.grayscale.light4}; + } + `} +`; + +const NewComponentPlaceholder = styled.div` + ${({ theme }) => css` + position: relative; + background: ${theme.colors.grayscale.light4}; + width: ${theme.gridUnit * 10}px; + height: ${theme.gridUnit * 10}px; + margin-right: ${theme.gridUnit * 4}px; + border: 1px solid ${theme.colors.grayscale.light5}; + display: flex; + align-items: center; + justify-content: center; + color: ${theme.colors.text.label}; + font-size: ${theme.typography.sizes.xxl}px; + + &.fa-window-restore { + font-size: ${theme.typography.sizes.l}px; + } + + &.fa-area-chart { + font-size: ${theme.typography.sizes.xl}px; + } + + &.divider-placeholder:after { + content: ''; + height: 2px; + width: 100%; + background-color: ${theme.colors.grayscale.light2}; + } + `} +`; + export default class DraggableNewComponent extends React.PureComponent { render() { const { label, id, type, className, meta } = this.props; @@ -50,14 +98,12 @@ export default class DraggableNewComponent extends React.PureComponent { editMode > {({ dragSourceRef }) => ( - <div - ref={dragSourceRef} - className="new-component" - data-test="new-component" - > - <div className={cx('new-component-placeholder', className)} /> + <NewComponent ref={dragSourceRef} data-test="new-component"> + <NewComponentPlaceholder + className={cx('new-component-placeholder', className)} + /> {label} - </div> + </NewComponent> )} </DragDroppable> ); diff --git a/superset-frontend/src/dashboard/components/gridComponents/new/DraggableNewComponent.test.jsx b/superset-frontend/src/dashboard/components/gridComponents/new/DraggableNewComponent.test.jsx index 2b56f02f5d91..a105fa43964f 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/new/DraggableNewComponent.test.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/new/DraggableNewComponent.test.jsx @@ -17,7 +17,7 @@ * under the License. */ import React from 'react'; -import { mount } from 'enzyme'; +import { styledMount as mount } from 'spec/helpers/theming'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; @@ -73,7 +73,9 @@ describe('DraggableNewComponent', () => { it('should render the passed label', () => { const wrapper = setup(); - expect(wrapper.find('.new-component').text()).toBe(props.label); + expect( + wrapper.find('[data-test="new-component"]').at(0).childAt(0).text(), + ).toBe(props.label); }); it('should add the passed className', () => { diff --git a/superset-frontend/src/dashboard/components/gridComponents/new/NewMarkdown.jsx b/superset-frontend/src/dashboard/components/gridComponents/new/NewMarkdown.jsx index f16b4b55f42d..3cc3138667b8 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/new/NewMarkdown.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/new/NewMarkdown.jsx @@ -17,6 +17,7 @@ * under the License. */ import React from 'react'; +import { t } from '@superset-ui/core'; import { MARKDOWN_TYPE } from '../../../util/componentTypes'; import { NEW_MARKDOWN_ID } from '../../../util/constants'; @@ -27,8 +28,8 @@ export default function DraggableNewDivider() { <DraggableNewComponent id={NEW_MARKDOWN_ID} type={MARKDOWN_TYPE} - label="Markdown" - className="fa fa-code" + label={t('Text')} + className="fa fa-font" /> ); } diff --git a/superset-frontend/src/dashboard/components/menu/BackgroundStyleDropdown.tsx b/superset-frontend/src/dashboard/components/menu/BackgroundStyleDropdown.tsx index 82c899410253..5498b72169da 100644 --- a/superset-frontend/src/dashboard/components/menu/BackgroundStyleDropdown.tsx +++ b/superset-frontend/src/dashboard/components/menu/BackgroundStyleDropdown.tsx @@ -18,6 +18,7 @@ */ import React from 'react'; import cx from 'classnames'; +import { css, styled, t } from '@superset-ui/core'; import backgroundStyleOptions from 'src/dashboard/util/backgroundStyleOptions'; import PopoverDropdown, { @@ -31,19 +32,64 @@ interface BackgroundStyleDropdownProps { onChange: OnChangeHandler; } +const BackgroundStyleOption = styled.div` + ${({ theme }) => css` + display: inline-block; + + &:before { + content: ''; + width: 1em; + height: 1em; + margin-right: ${theme.gridUnit * 2}px; + display: inline-block; + vertical-align: middle; + } + + &.background--white { + padding-left: 0; + background: transparent; + + &:before { + background: ${theme.colors.grayscale.light5}; + border: 1px solid ${theme.colors.grayscale.light2}; + } + } + + /* Create the transparent rect icon */ + &.background--transparent:before { + background-image: linear-gradient( + 45deg, + ${theme.colors.text.label} 25%, + transparent 25% + ), + linear-gradient(-45deg, ${theme.colors.text.label} 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, ${theme.colors.text.label} 75%), + linear-gradient(-45deg, transparent 75%, ${theme.colors.text.label} 75%); + background-size: ${theme.gridUnit * 2}px ${theme.gridUnit * 2}px; + background-position: 0 0, 0 ${theme.gridUnit}px, + ${theme.gridUnit}px ${-theme.gridUnit}px, ${-theme.gridUnit}px 0px; + } + `} +`; + function renderButton(option: OptionProps) { + const BACKGROUND_TEXT = t('background'); return ( - <div className={cx('background-style-option', option.className)}> - {`${option.label} background`} - </div> + <BackgroundStyleOption + className={cx('background-style-option', option.className)} + > + {`${option.label} ${BACKGROUND_TEXT}`} + </BackgroundStyleOption> ); } function renderOption(option: OptionProps) { return ( - <div className={cx('background-style-option', option.className)}> + <BackgroundStyleOption + className={cx('background-style-option', option.className)} + > {option.label} - </div> + </BackgroundStyleOption> ); } diff --git a/superset-frontend/src/dashboard/components/menu/ShareMenuItems/ShareMenuItems.test.tsx b/superset-frontend/src/dashboard/components/menu/ShareMenuItems/ShareMenuItems.test.tsx index 498009224a5e..bf247bc24925 100644 --- a/superset-frontend/src/dashboard/components/menu/ShareMenuItems/ShareMenuItems.test.tsx +++ b/superset-frontend/src/dashboard/components/menu/ShareMenuItems/ShareMenuItems.test.tsx @@ -70,6 +70,7 @@ test('Should render menu items', () => { <Menu onClick={jest.fn()} selectable={false} data-test="main-menu"> <ShareMenuItems {...props} /> </Menu>, + { useRedux: true }, ); expect( screen.getByRole('menuitem', { name: 'Copy dashboard URL' }), @@ -92,6 +93,7 @@ test('Click on "Copy dashboard URL" and succeed', async () => { <Menu onClick={jest.fn()} selectable={false} data-test="main-menu"> <ShareMenuItems {...props} /> </Menu>, + { useRedux: true }, ); await waitFor(() => { @@ -119,6 +121,7 @@ test('Click on "Copy dashboard URL" and fail', async () => { <Menu onClick={jest.fn()} selectable={false} data-test="main-menu"> <ShareMenuItems {...props} /> </Menu>, + { useRedux: true }, ); await waitFor(() => { @@ -147,6 +150,7 @@ test('Click on "Share dashboard by email" and succeed', async () => { <Menu onClick={jest.fn()} selectable={false} data-test="main-menu"> <ShareMenuItems {...props} /> </Menu>, + { useRedux: true }, ); await waitFor(() => { @@ -177,6 +181,7 @@ test('Click on "Share dashboard by email" and fail', async () => { <Menu onClick={jest.fn()} selectable={false} data-test="main-menu"> <ShareMenuItems {...props} /> </Menu>, + { useRedux: true }, ); await waitFor(() => { diff --git a/superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx b/superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx index f9016e5263c0..d0d8844cdd2b 100644 --- a/superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx +++ b/superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx @@ -20,9 +20,9 @@ import React from 'react'; import copyTextToClipboard from 'src/utils/copy'; import { t, logging } from '@superset-ui/core'; import { Menu } from 'src/components/Menu'; -import { getDashboardPermalink, getUrlParam } from 'src/utils/urlUtils'; -import { URL_PARAMS } from 'src/constants'; -import { getFilterValue } from 'src/dashboard/components/nativeFilters/FilterBar/keyValue'; +import { getDashboardPermalink } from 'src/utils/urlUtils'; +import { RootState } from 'src/dashboard/types'; +import { useSelector } from 'react-redux'; interface ShareMenuItemProps { url?: string; @@ -48,17 +48,17 @@ const ShareMenuItems = (props: ShareMenuItemProps) => { dashboardComponentId, ...rest } = props; + const { dataMask, activeTabs } = useSelector((state: RootState) => ({ + dataMask: state.dataMask, + activeTabs: state.dashboardState.activeTabs, + })); async function generateUrl() { - const nativeFiltersKey = getUrlParam(URL_PARAMS.nativeFiltersKey); - let filterState = {}; - if (nativeFiltersKey && dashboardId) { - filterState = await getFilterValue(dashboardId, nativeFiltersKey); - } return getDashboardPermalink({ dashboardId, - filterState, - hash: dashboardComponentId, + dataMask, + activeTabs, + anchor: dashboardComponentId, }); } diff --git a/superset-frontend/src/dashboard/components/menu/WithPopoverMenu.tsx b/superset-frontend/src/dashboard/components/menu/WithPopoverMenu.tsx index df44b4e1c1f2..3aa0aa81d3d2 100644 --- a/superset-frontend/src/dashboard/components/menu/WithPopoverMenu.tsx +++ b/superset-frontend/src/dashboard/components/menu/WithPopoverMenu.tsx @@ -18,6 +18,7 @@ */ import React from 'react'; import cx from 'classnames'; +import { addAlpha, css, styled } from '@superset-ui/core'; type ShouldFocusContainer = HTMLDivElement & { contains: (event_target: EventTarget & HTMLElement) => Boolean; @@ -41,6 +42,67 @@ interface WithPopoverMenuState { isFocused: Boolean; } +const WithPopoverMenuStyles = styled.div` + ${({ theme }) => css` + position: relative; + outline: none; + + &.with-popover-menu--focused:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border: 2px solid ${theme.colors.primary.base}; + pointer-events: none; + } + + .dashboard-component-tabs li &.with-popover-menu--focused:after { + top: ${theme.gridUnit * -3}px; + left: ${theme.gridUnit * -2}px; + width: calc(100% + ${theme.gridUnit * 4}px); + height: calc(100% + ${theme.gridUnit * 7}px); + } + `} +`; + +const PopoverMenuStyles = styled.div` + ${({ theme }) => css` + position: absolute; + flex-wrap: nowrap; + left: 1px; + top: -42px; + height: ${theme.gridUnit * 10}px; + padding: 0 ${theme.gridUnit * 4}px; + background: ${theme.colors.grayscale.light5}; + box-shadow: 0 1px 2px 1px + ${addAlpha( + theme.colors.grayscale.dark2, + parseFloat(theme.opacity.mediumLight) / 100, + )}; + font-size: ${theme.typography.sizes.m}px; + cursor: default; + z-index: 3000; + + &, + .menu-item { + display: flex; + flex-direction: row; + align-items: center; + } + + /* vertical spacer after each menu item */ + .menu-item:not(:last-child):after { + content: ''; + width: 1px; + height: 100%; + background: ${theme.colors.grayscale.light2}; + margin: 0 ${theme.gridUnit * 4}px; + } + `} +`; + export default class WithPopoverMenu extends React.PureComponent< WithPopoverMenuProps, WithPopoverMenuState @@ -126,7 +188,7 @@ export default class WithPopoverMenu extends React.PureComponent< const { isFocused } = this.state; return ( - <div + <WithPopoverMenuStyles ref={this.setRef} onClick={this.handleClick} role="none" @@ -138,15 +200,15 @@ export default class WithPopoverMenu extends React.PureComponent< > {children} {editMode && isFocused && (menuItems?.length ?? 0) > 0 && ( - <div className="popover-menu"> + <PopoverMenuStyles> {menuItems.map((node: React.ReactNode, i: Number) => ( <div className="menu-item" key={`menu-item-${i}`}> {node} </div> ))} - </div> + </PopoverMenuStyles> )} - </div> + </WithPopoverMenuStyles> ); } } diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/ActionButtons.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/ActionButtons.test.tsx index 77aede5be353..525f51963246 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/ActionButtons.test.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/ActionButtons.test.tsx @@ -17,9 +17,10 @@ * under the License. */ import React from 'react'; +import { OPEN_FILTER_BAR_WIDTH } from 'src/dashboard/constants'; import userEvent from '@testing-library/user-event'; import { render, screen } from 'spec/helpers/testing-library'; -import { ActionButtons } from './index'; +import ActionButtons from './index'; const createProps = () => ({ onApply: jest.fn(), @@ -77,3 +78,28 @@ test('should apply', () => { userEvent.click(applyBtn); expect(mockedProps.onApply).toHaveBeenCalled(); }); + +describe('custom width', () => { + it('sets its default width with OPEN_FILTER_BAR_WIDTH', () => { + const mockedProps = createProps(); + render(<ActionButtons {...mockedProps} />, { useRedux: true }); + const container = screen.getByTestId('filterbar-action-buttons'); + expect(container).toHaveStyleRule( + 'width', + `${OPEN_FILTER_BAR_WIDTH - 1}px`, + ); + }); + + it('sets custom width', () => { + const mockedProps = createProps(); + const expectedWidth = 423; + const { getByTestId } = render( + <ActionButtons {...mockedProps} width={expectedWidth} />, + { + useRedux: true, + }, + ); + const container = getByTestId('filterbar-action-buttons'); + expect(container).toHaveStyleRule('width', `${expectedWidth - 1}px`); + }); +}); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/index.tsx index d94885b1c970..cb6f17d96dbf 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/index.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/index.tsx @@ -21,89 +21,116 @@ import { css, DataMaskState, DataMaskStateWithId, - styled, t, + isDefined, + SupersetTheme, } from '@superset-ui/core'; import Button from 'src/components/Button'; -import { isNullish } from 'src/utils/common'; import { OPEN_FILTER_BAR_WIDTH } from 'src/dashboard/constants'; import { rgba } from 'emotion-rgba'; -import { getFilterBarTestId } from '../index'; +import { FilterBarOrientation } from 'src/dashboard/types'; +import { getFilterBarTestId } from '../utils'; interface ActionButtonsProps { + width?: number; onApply: () => void; onClearAll: () => void; dataMaskSelected: DataMaskState; dataMaskApplied: DataMaskStateWithId; isApplyDisabled: boolean; + filterBarOrientation?: FilterBarOrientation; } -const ActionButtonsContainer = styled.div` - ${({ theme }) => css` - display: flex; - flex-direction: column; - align-items: center; +const containerStyle = (theme: SupersetTheme) => css` + display: flex; - position: fixed; - z-index: 100; + && > .filter-clear-all-button { + color: ${theme.colors.grayscale.base}; + margin-left: 0; + &:hover { + color: ${theme.colors.primary.dark1}; + } - // filter bar width minus 1px for border - width: ${OPEN_FILTER_BAR_WIDTH - 1}px; - bottom: 0; + &[disabled], + &[disabled]:hover { + color: ${theme.colors.grayscale.light1}; + } + } +`; - padding: ${theme.gridUnit * 4}px; - padding-top: ${theme.gridUnit * 6}px; +const verticalStyle = (theme: SupersetTheme, width: number) => css` + flex-direction: column; + align-items: center; + pointer-events: none; + position: fixed; + z-index: 100; - background: linear-gradient( - ${rgba(theme.colors.grayscale.light5, 0)}, - ${theme.colors.grayscale.light5} ${theme.opacity.mediumLight} - ); + // filter bar width minus 1px for border + width: ${width - 1}px; + bottom: 0; - pointer-events: none; + padding: ${theme.gridUnit * 4}px; + padding-top: ${theme.gridUnit * 6}px; - & > button { - pointer-events: auto; - } + background: linear-gradient( + ${rgba(theme.colors.grayscale.light5, 0)}, + ${theme.colors.grayscale.light5} ${theme.opacity.mediumLight} + ); - & > .filter-apply-button { - margin-bottom: ${theme.gridUnit * 3}px; - } + & > button { + pointer-events: auto; + } - && > .filter-clear-all-button { - color: ${theme.colors.grayscale.base}; - margin-left: 0; - &:hover { - color: ${theme.colors.primary.dark1}; - } + & > .filter-apply-button { + margin-bottom: ${theme.gridUnit * 3}px; + } +`; - &[disabled], - &[disabled]:hover { - color: ${theme.colors.grayscale.light1}; - } +const horizontalStyle = (theme: SupersetTheme) => css` + align-items: center; + margin-left: auto; + && > .filter-clear-all-button { + text-transform: capitalize; + font-weight: ${theme.typography.weights.normal}; + } + & > .filter-apply-button { + &[disabled], + &[disabled]:hover { + color: ${theme.colors.grayscale.light1}; + background: ${theme.colors.grayscale.light3}; } - `}; + } `; -export const ActionButtons = ({ +const ActionButtons = ({ + width = OPEN_FILTER_BAR_WIDTH, onApply, onClearAll, dataMaskApplied, dataMaskSelected, isApplyDisabled, + filterBarOrientation = FilterBarOrientation.VERTICAL, }: ActionButtonsProps) => { const isClearAllEnabled = useMemo( () => Object.values(dataMaskApplied).some( filter => - !isNullish(dataMaskSelected[filter.id]?.filterState?.value) || + isDefined(dataMaskSelected[filter.id]?.filterState?.value) || (!dataMaskSelected[filter.id] && - !isNullish(filter.filterState?.value)), + isDefined(filter.filterState?.value)), ), [dataMaskApplied, dataMaskSelected], ); + const isVertical = filterBarOrientation === FilterBarOrientation.VERTICAL; return ( - <ActionButtonsContainer> + <div + css={(theme: SupersetTheme) => [ + containerStyle(theme), + isVertical ? verticalStyle(theme, width) : horizontalStyle(theme), + ]} + data-test="filterbar-action-buttons" + > <Button disabled={isApplyDisabled} buttonStyle="primary" @@ -112,7 +139,7 @@ export const ActionButtons = ({ onClick={onApply} {...getFilterBarTestId('apply-button')} > - {t('Apply filters')} + {isVertical ? t('Apply filters') : t('Apply')} </Button> <Button disabled={!isClearAllEnabled} @@ -124,6 +151,8 @@ export const ActionButtons = ({ > {t('Clear all')} </Button> - </ActionButtonsContainer> + </div> ); }; + +export default ActionButtons; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.test.tsx index de7d6af99ca0..7a8106ecbe97 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.test.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.test.tsx @@ -26,10 +26,12 @@ import { testWithId } from 'src/utils/testUtils'; import { FeatureFlag } from 'src/featureFlags'; import { Preset } from '@superset-ui/core'; import { TimeFilterPlugin, SelectFilterPlugin } from 'src/filters/components'; -import { DATE_FILTER_CONTROL_TEST_ID } from 'src/explore/components/controls/DateFilterControl/DateFilterLabel'; +import { DATE_FILTER_TEST_KEY } from 'src/explore/components/controls/DateFilterControl'; import fetchMock from 'fetch-mock'; import { waitFor } from '@testing-library/react'; -import FilterBar, { FILTER_BAR_TEST_ID } from '.'; +import { FilterBarOrientation } from 'src/dashboard/types'; +import { FILTER_BAR_TEST_ID } from './utils'; +import FilterBar from '.'; import { FILTERS_CONFIG_MODAL_TEST_ID } from '../FiltersConfigModal/FiltersConfigModal'; jest.useFakeTimers(); @@ -71,10 +73,6 @@ fetchMock.get('glob:*/api/v1/dataset/7', { const getTestId = testWithId<string>(FILTER_BAR_TEST_ID, true); const getModalTestId = testWithId<string>(FILTERS_CONFIG_MODAL_TEST_ID, true); -const getDateControlTestId = testWithId<string>( - DATE_FILTER_CONTROL_TEST_ID, - true, -); const FILTER_NAME = 'Time filter 1'; const FILTER_SET_NAME = 'New filter set'; @@ -121,7 +119,7 @@ const changeFilterValue = async () => { userEvent.click(screen.getAllByText('No filter')[0]); userEvent.click(screen.getByDisplayValue('Last day')); expect(await screen.findByText(/2021-04-13/)).toBeInTheDocument(); - userEvent.click(screen.getByTestId(getDateControlTestId('apply-button'))); + userEvent.click(screen.getByTestId(DATE_FILTER_TEST_KEY.applyButton)); }; describe('FilterBar', () => { @@ -220,12 +218,23 @@ describe('FilterBar', () => { }); const renderWrapper = (props = closedBarProps, state?: object) => - render(<FilterBar {...props} width={280} height={400} offset={0} />, { - initialState: state, - useDnd: true, - useRedux: true, - useRouter: true, - }); + render( + <FilterBar + orientation={FilterBarOrientation.VERTICAL} + verticalConfig={{ + width: 280, + height: 400, + offset: 0, + ...props, + }} + />, + { + initialState: state, + useDnd: true, + useRedux: true, + useRouter: true, + }, + ); it('should render', () => { const { container } = renderWrapper(); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/FilterBarSettings.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/FilterBarSettings.test.tsx new file mode 100644 index 000000000000..344e891365a5 --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/FilterBarSettings.test.tsx @@ -0,0 +1,299 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import fetchMock from 'fetch-mock'; +import { waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { render, screen, within } from 'spec/helpers/testing-library'; +import { DashboardInfo, FilterBarOrientation } from 'src/dashboard/types'; +import * as mockedMessageActions from 'src/components/MessageToasts/actions'; +import { FeatureFlag } from '@superset-ui/core'; +import FilterBarSettings from '.'; + +const initialState: { dashboardInfo: DashboardInfo } = { + dashboardInfo: { + id: 1, + userId: '1', + metadata: { + native_filter_configuration: {}, + show_native_filters: true, + chart_configuration: {}, + color_scheme: '', + color_namespace: '', + color_scheme_domain: [], + label_colors: {}, + shared_label_colors: {}, + cross_filters_enabled: false, + }, + json_metadata: '', + dash_edit_perm: true, + filterBarOrientation: FilterBarOrientation.VERTICAL, + common: { + conf: {}, + flash_messages: [], + }, + crossFiltersEnabled: true, + }, +}; + +const setup = (dashboardInfoOverride: Partial<DashboardInfo> = {}) => + waitFor(() => + render(<FilterBarSettings />, { + useRedux: true, + initialState: { + ...initialState, + dashboardInfo: { + ...initialState.dashboardInfo, + ...dashboardInfoOverride, + }, + }, + }), + ); + +test('Dropdown trigger renders with FF HORIZONTAL_FILTER_BAR on', async () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.HORIZONTAL_FILTER_BAR]: true, + }; + await setup(); + expect(screen.getByLabelText('gear')).toBeVisible(); +}); + +test('Dropdown trigger does not render with FF HORIZONTAL_FILTER_BAR off', async () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.HORIZONTAL_FILTER_BAR]: false, + }; + await setup(); + expect(screen.queryByLabelText('gear')).not.toBeInTheDocument(); +}); + +test('Dropdown trigger renders with dashboard edit permissions', async () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.HORIZONTAL_FILTER_BAR]: true, + }; + await setup({ + dash_edit_perm: true, + }); + expect(screen.getByRole('img', { name: 'gear' })).toBeInTheDocument(); +}); + +test('Dropdown trigger does not render without dashboard edit permissions', async () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.HORIZONTAL_FILTER_BAR]: true, + }; + await setup({ + dash_edit_perm: false, + }); + + expect(screen.queryByRole('img', { name: 'gear' })).not.toBeInTheDocument(); +}); + +test('Dropdown trigger renders with FF DASHBOARD_CROSS_FILTERS on', async () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.DASHBOARD_CROSS_FILTERS]: true, + }; + await setup(); + + expect(screen.getByRole('img', { name: 'gear' })).toBeInTheDocument(); +}); + +test('Dropdown trigger does not render with FF DASHBOARD_CROSS_FILTERS off', async () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.DASHBOARD_CROSS_FILTERS]: false, + }; + await setup(); + + expect(screen.queryByRole('img', { name: 'gear' })).not.toBeInTheDocument(); +}); + +test('Popover shows cross-filtering option on by default', async () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.DASHBOARD_CROSS_FILTERS]: true, + }; + await setup(); + userEvent.click(screen.getByLabelText('gear')); + expect(screen.getByText('Enable cross-filtering')).toBeInTheDocument(); + expect(screen.getByRole('checkbox')).toBeChecked(); +}); + +test('Can enable/disable cross-filtering', async () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.DASHBOARD_CROSS_FILTERS]: true, + }; + fetchMock.reset(); + fetchMock.put('glob:*/api/v1/dashboard/1', { + result: {}, + }); + await setup(); + userEvent.click(screen.getByLabelText('gear')); + const checkbox = screen.getByRole('checkbox'); + expect(checkbox).toBeChecked(); + + userEvent.click(checkbox); + + userEvent.click(screen.getByLabelText('gear')); + expect(checkbox).not.toBeChecked(); +}); + +test('Popover opens with "Vertical" selected', async () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.HORIZONTAL_FILTER_BAR]: true, + }; + await setup(); + userEvent.click(screen.getByLabelText('gear')); + userEvent.hover(screen.getByText('Orientation of filter bar')); + expect(await screen.findByText('Vertical (Left)')).toBeInTheDocument(); + expect(screen.getByText('Horizontal (Top)')).toBeInTheDocument(); + expect( + within(screen.getAllByRole('menuitem')[1]).getByLabelText('check'), + ).toBeInTheDocument(); +}); + +test('Popover opens with "Horizontal" selected', async () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.HORIZONTAL_FILTER_BAR]: true, + }; + await setup({ filterBarOrientation: FilterBarOrientation.HORIZONTAL }); + userEvent.click(screen.getByLabelText('gear')); + userEvent.hover(screen.getByText('Orientation of filter bar')); + expect(await screen.findByText('Vertical (Left)')).toBeInTheDocument(); + expect(screen.getByText('Horizontal (Top)')).toBeInTheDocument(); + expect( + within(screen.getAllByRole('menuitem')[2]).getByLabelText('check'), + ).toBeInTheDocument(); +}); + +test('On selection change, send request and update checked value', async () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.HORIZONTAL_FILTER_BAR]: true, + }; + fetchMock.reset(); + fetchMock.put('glob:*/api/v1/dashboard/1', { + result: { + json_metadata: JSON.stringify({ + ...initialState.dashboardInfo.metadata, + filter_bar_orientation: 'HORIZONTAL', + }), + }, + }); + + await setup(); + userEvent.click(screen.getByLabelText('gear')); + userEvent.hover(screen.getByText('Orientation of filter bar')); + + expect(await screen.findByText('Vertical (Left)')).toBeInTheDocument(); + expect(screen.getByText('Horizontal (Top)')).toBeInTheDocument(); + expect( + within(screen.getAllByRole('menuitem')[1]).getByLabelText('check'), + ).toBeInTheDocument(); + expect( + within(screen.getAllByRole('menuitem')[2]).queryByLabelText('check'), + ).not.toBeInTheDocument(); + + userEvent.click(await screen.findByText('Horizontal (Top)')); + + // 1st check - checkmark appears immediately after click + expect( + await within(screen.getAllByRole('menuitem')[2]).findByLabelText('check'), + ).toBeInTheDocument(); + expect( + within(screen.getAllByRole('menuitem')[1]).queryByLabelText('check'), + ).not.toBeInTheDocument(); + + // successful query + await waitFor(() => + expect(fetchMock.lastCall()?.[1]?.body).toEqual( + JSON.stringify({ + json_metadata: JSON.stringify({ + ...initialState.dashboardInfo.metadata, + filter_bar_orientation: 'HORIZONTAL', + }), + }), + ), + ); + + // 2nd check - checkmark stays after successful query + expect( + await within(screen.getAllByRole('menuitem')[2]).findByLabelText('check'), + ).toBeInTheDocument(); + expect( + within(screen.getAllByRole('menuitem')[1]).queryByLabelText('check'), + ).not.toBeInTheDocument(); + + fetchMock.reset(); +}); + +test('On failed request, restore previous selection', async () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.HORIZONTAL_FILTER_BAR]: true, + }; + fetchMock.reset(); + fetchMock.put('glob:*/api/v1/dashboard/1', 400); + + const dangerToastSpy = jest.spyOn(mockedMessageActions, 'addDangerToast'); + + await setup(); + userEvent.click(screen.getByLabelText('gear')); + userEvent.hover(screen.getByText('Orientation of filter bar')); + + expect(await screen.findByText('Vertical (Left)')).toBeInTheDocument(); + expect(screen.getByText('Horizontal (Top)')).toBeInTheDocument(); + + expect( + within(screen.getAllByRole('menuitem')[1]).getByLabelText('check'), + ).toBeInTheDocument(); + expect( + within(screen.getAllByRole('menuitem')[2]).queryByLabelText('check'), + ).not.toBeInTheDocument(); + + userEvent.click(await screen.findByText('Horizontal (Top)')); + + await waitFor(() => { + expect(dangerToastSpy).toHaveBeenCalledWith( + 'Sorry, there was an error saving this dashboard: Unknown Error', + ); + }); + + userEvent.click(screen.getByLabelText('gear')); + userEvent.hover(screen.getByText('Orientation of filter bar')); + + expect(await screen.findByText('Vertical (Left)')).toBeInTheDocument(); + + // checkmark gets rolled back to the original selection after successful query + expect( + await within(screen.getAllByRole('menuitem')[1]).findByLabelText('check'), + ).toBeInTheDocument(); + expect( + within(screen.getAllByRole('menuitem')[2]).queryByLabelText('check'), + ).not.toBeInTheDocument(); + + fetchMock.reset(); +}); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/index.tsx new file mode 100644 index 000000000000..dda3b7e47ba0 --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/index.tsx @@ -0,0 +1,192 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useCallback, useMemo, useState } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { + FeatureFlag, + isFeatureEnabled, + styled, + t, + useTheme, +} from '@superset-ui/core'; +import { MenuProps } from 'src/components/Menu'; +import { FilterBarOrientation, RootState } from 'src/dashboard/types'; +import { + saveFilterBarOrientation, + saveCrossFiltersSetting, +} from 'src/dashboard/actions/dashboardInfo'; +import Icons from 'src/components/Icons'; +import DropdownSelectableIcon, { + DropDownSelectableProps, +} from 'src/components/DropdownSelectableIcon'; +import Checkbox from 'src/components/Checkbox'; +import { clearDataMaskState } from 'src/dataMask/actions'; + +type SelectedKey = FilterBarOrientation | string | number; + +const StyledMenuLabel = styled.span` + display: flex; + align-items: center; + justify-content: space-between; + + .enable-cross-filters-text { + padding-left: ${({ theme }) => `${theme.gridUnit * 2}px`}; + } +`; + +const StyledCheckbox = styled(Checkbox)` + ${({ theme }) => ` + &, + svg { + display: inline-block; + width: ${theme.gridUnit * 4}px; + height: ${theme.gridUnit * 4}px; + } +`} +`; + +const FilterBarSettings = () => { + const dispatch = useDispatch(); + const theme = useTheme(); + const isCrossFiltersEnabled = useSelector<RootState, boolean>( + ({ dashboardInfo }) => dashboardInfo.crossFiltersEnabled, + ); + const filterBarOrientation = useSelector<RootState, FilterBarOrientation>( + ({ dashboardInfo }) => dashboardInfo.filterBarOrientation, + ); + const [selectedFilterBarOrientation, setSelectedFilterBarOrientation] = + useState(filterBarOrientation); + const isCrossFiltersFeatureEnabled = isFeatureEnabled( + FeatureFlag.DASHBOARD_CROSS_FILTERS, + ); + const shouldEnableCrossFilters = + !!isCrossFiltersEnabled && isCrossFiltersFeatureEnabled; + const [crossFiltersEnabled, setCrossFiltersEnabled] = useState<boolean>( + shouldEnableCrossFilters, + ); + const canEdit = useSelector<RootState, boolean>( + ({ dashboardInfo }) => dashboardInfo.dash_edit_perm, + ); + const canSetHorizontalFilterBar = + canEdit && isFeatureEnabled(FeatureFlag.HORIZONTAL_FILTER_BAR); + const crossFiltersMenuKey = 'cross-filters-menu-key'; + const isOrientation = (o: SelectedKey): o is FilterBarOrientation => + o === FilterBarOrientation.VERTICAL || + o === FilterBarOrientation.HORIZONTAL; + const updateCrossFiltersSetting = useCallback( + async isEnabled => { + if (!isEnabled) { + dispatch(clearDataMaskState()); + } + await dispatch(saveCrossFiltersSetting(isEnabled)); + }, + [dispatch, crossFiltersEnabled], + ); + const changeFilterBarSettings = useCallback( + async ( + selection: Parameters< + Required<Pick<MenuProps, 'onSelect'>>['onSelect'] + >[0], + ) => { + const selectedKey: SelectedKey = selection.key; + if (selectedKey === crossFiltersMenuKey) { + setCrossFiltersEnabled(!crossFiltersEnabled); + updateCrossFiltersSetting(!crossFiltersEnabled); + return; + } + if (isOrientation(selectedKey) && selectedKey !== filterBarOrientation) { + // set displayed selection in local state for immediate visual response after clicking + setSelectedFilterBarOrientation(selectedKey as FilterBarOrientation); + try { + // save selection in Redux and backend + await dispatch( + saveFilterBarOrientation(selection.key as FilterBarOrientation), + ); + } catch { + // revert local state in case of error when saving + setSelectedFilterBarOrientation(filterBarOrientation); + } + } + }, + [dispatch, crossFiltersEnabled, filterBarOrientation], + ); + const crossFiltersMenuItem = useMemo( + () => ( + <StyledMenuLabel> + <StyledCheckbox + className="enable-cross-filters" + checked={crossFiltersEnabled} + onChange={checked => setCrossFiltersEnabled(checked || false)} + />{' '} + <span className="enable-cross-filters-text"> + {t('Enable cross-filtering')} + </span> + </StyledMenuLabel> + ), + [crossFiltersEnabled], + ); + const menuItems: DropDownSelectableProps['menuItems'] = []; + + if (isCrossFiltersFeatureEnabled) { + menuItems.unshift({ + key: crossFiltersMenuKey, + label: crossFiltersMenuItem, + divider: canSetHorizontalFilterBar, + }); + } + + if (canSetHorizontalFilterBar) { + menuItems.push({ + key: 'placement', + label: t('Orientation of filter bar'), + children: [ + { + key: FilterBarOrientation.VERTICAL, + label: t('Vertical (Left)'), + }, + { + key: FilterBarOrientation.HORIZONTAL, + label: t('Horizontal (Top)'), + }, + ], + }); + } + + if (!menuItems.length) { + return null; + } + + return ( + <DropdownSelectableIcon + onSelect={changeFilterBarSettings} + icon={ + <Icons.Gear + name="gear" + iconColor={theme.colors.grayscale.base} + data-test="filterbar-orientation-icon" + /> + } + menuItems={menuItems} + selectedKeys={[selectedFilterBarOrientation]} + /> + ); +}; + +export default FilterBarSettings; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterConfigurationLink/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterConfigurationLink/index.tsx index bb3c1517104e..c9e4b834d940 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterConfigurationLink/index.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterConfigurationLink/index.tsx @@ -16,17 +16,20 @@ * specific language governing permissions and limitations * under the License. */ -import React, { useState } from 'react'; +import React, { useCallback, useState } from 'react'; import { useDispatch } from 'react-redux'; import { setFilterConfiguration } from 'src/dashboard/actions/nativeFilters'; import Button from 'src/components/Button'; import { FilterConfiguration, styled } from '@superset-ui/core'; -import { FiltersConfigModal } from 'src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal'; -import { getFilterBarTestId } from '..'; +import FiltersConfigModal from 'src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal'; +import { getFilterBarTestId } from '../utils'; export interface FCBProps { createNewOnOpen?: boolean; dashboardId?: number; + initialFilterId?: string; + onClick?: () => void; + children?: React.ReactNode; } const HeaderButton = styled(Button)` @@ -36,19 +39,31 @@ const HeaderButton = styled(Button)` export const FilterConfigurationLink: React.FC<FCBProps> = ({ createNewOnOpen, dashboardId, + initialFilterId, + onClick, children, }) => { const dispatch = useDispatch(); const [isOpen, setOpen] = useState(false); - function close() { + const close = useCallback(() => { setOpen(false); - } + }, [setOpen]); - async function submit(filterConfig: FilterConfiguration) { - dispatch(await setFilterConfiguration(filterConfig)); - close(); - } + const submit = useCallback( + async (filterConfig: FilterConfiguration) => { + dispatch(await setFilterConfiguration(filterConfig)); + close(); + }, + [dispatch, close], + ); + + const handleClick = useCallback(() => { + setOpen(true); + if (onClick) { + onClick(); + } + }, [setOpen, onClick]); return ( <> @@ -57,7 +72,7 @@ export const FilterConfigurationLink: React.FC<FCBProps> = ({ {...getFilterBarTestId('create-filter')} buttonStyle="link" buttonSize="xsmall" - onClick={() => setOpen(true)} + onClick={handleClick} > {children} </HeaderButton> @@ -65,6 +80,7 @@ export const FilterConfigurationLink: React.FC<FCBProps> = ({ isOpen={isOpen} onSave={submit} onCancel={close} + initialFilterId={initialFilterId} createNewOnOpen={createNewOnOpen} key={`filters-for-${dashboardId}`} /> @@ -72,4 +88,4 @@ export const FilterConfigurationLink: React.FC<FCBProps> = ({ ); }; -export default FilterConfigurationLink; +export default React.memo(FilterConfigurationLink); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl.tsx index ff5b08781e4e..fa54036dbbca 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl.tsx @@ -17,28 +17,49 @@ * under the License. */ import React, { useContext, useMemo, useState } from 'react'; +import { + createHtmlPortalNode, + InPortal, + OutPortal, +} from 'react-reverse-portal'; import { styled, SupersetTheme } from '@superset-ui/core'; import { FormItem as StyledFormItem, Form } from 'src/components/Form'; import { Tooltip } from 'src/components/Tooltip'; +import { FilterBarOrientation } from 'src/dashboard/types'; +import { truncationCSS } from 'src/hooks/useTruncation'; import { checkIsMissingRequiredValue } from '../utils'; import FilterValue from './FilterValue'; -import { FilterProps } from './types'; import { FilterCard } from '../../FilterCard'; -import { FilterBarScrollContext } from '../index'; +import { FilterBarScrollContext } from '../Vertical'; +import { FilterControlProps } from './types'; +import { FilterCardPlacement } from '../../FilterCard/types'; const StyledIcon = styled.div` position: absolute; right: 0; `; -const StyledFilterControlTitle = styled.h4` +const VerticalFilterControlTitle = styled.h4` font-size: ${({ theme }) => theme.typography.sizes.s}px; color: ${({ theme }) => theme.colors.grayscale.dark1}; margin: 0; overflow-wrap: break-word; `; -const StyledFilterControlTitleBox = styled.div` +const HorizontalFilterControlTitle = styled(VerticalFilterControlTitle)` + font-weight: ${({ theme }) => theme.typography.weights.normal}; + color: ${({ theme }) => theme.colors.grayscale.base}; + max-width: ${({ theme }) => theme.gridUnit * 15}px; + ${truncationCSS}; +`; + +const HorizontalOverflowFilterControlTitle = styled( + HorizontalFilterControlTitle, +)` + max-width: none; +`; + +const VerticalFilterControlTitleBox = styled.div` display: flex; flex-direction: row; align-items: center; @@ -46,7 +67,17 @@ const StyledFilterControlTitleBox = styled.div` margin-bottom: ${({ theme }) => theme.gridUnit}px; `; -const StyledFilterControlContainer = styled(Form)` +const HorizontalFilterControlTitleBox = styled(VerticalFilterControlTitleBox)` + margin-bottom: unset; +`; + +const HorizontalOverflowFilterControlTitleBox = styled( + VerticalFilterControlTitleBox, +)` + width: 100%; +`; + +const VerticalFilterControlContainer = styled(Form)` width: 100%; && .ant-form-item-label > label { text-transform: none; @@ -58,7 +89,28 @@ const StyledFilterControlContainer = styled(Form)` } `; -const FormItem = styled(StyledFormItem)` +const HorizontalFilterControlContainer = styled(Form)` + && .ant-form-item-label > label { + margin-bottom: 0; + text-transform: none; + } + .ant-form-item-tooltip { + margin-bottom: ${({ theme }) => theme.gridUnit}px; + } +`; + +const HorizontalOverflowFilterControlContainer = styled( + VerticalFilterControlContainer, +)` + && .ant-form-item-label { + line-height: 1; + & > label { + padding-right: unset; + } + } +`; + +const VerticalFormItem = styled(StyledFormItem)` .ant-form-item-label { label.ant-form-item-required:not(.ant-form-item-required-mark-optional) { &::after { @@ -68,6 +120,62 @@ const FormItem = styled(StyledFormItem)` } `; +const HorizontalFormItem = styled(StyledFormItem)` + && { + margin-bottom: 0; + align-items: center; + } + + .ant-form-item-label { + padding-bottom: 0; + margin-right: ${({ theme }) => theme.gridUnit * 2}px; + label.ant-form-item-required:not(.ant-form-item-required-mark-optional) { + &::after { + display: none; + } + } + + & > label::after { + display: none; + } + } + + .ant-form-item-control { + width: ${({ theme }) => theme.gridUnit * 41}px; + } +`; + +const HorizontalOverflowFormItem = VerticalFormItem; + +const useFilterControlDisplay = ( + orientation: FilterBarOrientation, + overflow: boolean, +) => + useMemo(() => { + if (orientation === FilterBarOrientation.HORIZONTAL) { + if (overflow) { + return { + FilterControlContainer: HorizontalOverflowFilterControlContainer, + FormItem: HorizontalOverflowFormItem, + FilterControlTitleBox: HorizontalOverflowFilterControlTitleBox, + FilterControlTitle: HorizontalOverflowFilterControlTitle, + }; + } + return { + FilterControlContainer: HorizontalFilterControlContainer, + FormItem: HorizontalFormItem, + FilterControlTitleBox: HorizontalFilterControlTitleBox, + FilterControlTitle: HorizontalFilterControlTitle, + }; + } + return { + FilterControlContainer: VerticalFilterControlContainer, + FormItem: VerticalFormItem, + FilterControlTitleBox: VerticalFilterControlTitleBox, + FilterControlTitle: VerticalFilterControlTitle, + }; + }, [orientation, overflow]); + const ToolTipContainer = styled.div` font-size: ${({ theme }) => theme.typography.sizes.m}px; display: flex; @@ -109,16 +217,19 @@ const DescriptionToolTip = ({ description }: { description: string }) => ( </ToolTipContainer> ); -const FilterControl: React.FC<FilterProps> = ({ +const FilterControl = ({ dataMaskSelected, filter, icon, onFilterSelectionChange, - directPathToChild, + focusedFilterId, inView, showOverflow, parentRef, -}) => { + orientation = FilterBarOrientation.VERTICAL, + overflow = false, +}: FilterControlProps) => { + const portalNode = useMemo(() => createHtmlPortalNode(), []); const [isFilterActive, setIsFilterActive] = useState(false); const { name = '<undefined>' } = filter; @@ -129,47 +240,87 @@ const FilterControl: React.FC<FilterProps> = ({ ); const isRequired = !!filter.controlValues?.enableEmptyFilter; + const { + FilterControlContainer, + FormItem, + FilterControlTitleBox, + FilterControlTitle, + } = useFilterControlDisplay(orientation, overflow); + const label = useMemo( () => ( - <StyledFilterControlTitleBox> - <StyledFilterControlTitle data-test="filter-control-name"> + <FilterControlTitleBox> + <FilterControlTitle data-test="filter-control-name"> {name} - </StyledFilterControlTitle> + </FilterControlTitle> {isRequired && <RequiredFieldIndicator />} - {filter.description && filter.description.trim() && ( + {filter.description?.trim() && ( <DescriptionToolTip description={filter.description} /> )} <StyledIcon data-test="filter-icon">{icon}</StyledIcon> - </StyledFilterControlTitleBox> + </FilterControlTitleBox> ), - [name, isRequired, filter.description, icon], + [ + FilterControlTitleBox, + FilterControlTitle, + name, + isRequired, + filter.description, + icon, + ], ); const isScrolling = useContext(FilterBarScrollContext); + const filterCardPlacement = useMemo(() => { + if (orientation === FilterBarOrientation.HORIZONTAL) { + if (overflow) { + return FilterCardPlacement.Left; + } + return FilterCardPlacement.Bottom; + } + return FilterCardPlacement.Right; + }, [orientation, overflow]); return ( - <StyledFilterControlContainer layout="vertical"> - <FilterCard filter={filter} isVisible={!isFilterActive && !isScrolling}> - <div> - <FormItem - label={label} - required={filter?.controlValues?.enableEmptyFilter} - validateStatus={isMissingRequiredValue ? 'error' : undefined} - > - <FilterValue - dataMaskSelected={dataMaskSelected} - filter={filter} - showOverflow={showOverflow} - directPathToChild={directPathToChild} - onFilterSelectionChange={onFilterSelectionChange} - inView={inView} - parentRef={parentRef} - setFilterActive={setIsFilterActive} - /> - </FormItem> - </div> - </FilterCard> - </StyledFilterControlContainer> + <> + <InPortal node={portalNode}> + <FilterValue + dataMaskSelected={dataMaskSelected} + filter={filter} + showOverflow={showOverflow} + focusedFilterId={focusedFilterId} + onFilterSelectionChange={onFilterSelectionChange} + inView={inView} + parentRef={parentRef} + setFilterActive={setIsFilterActive} + orientation={orientation} + overflow={overflow} + /> + </InPortal> + <FilterControlContainer + layout={ + orientation === FilterBarOrientation.HORIZONTAL && !overflow + ? 'horizontal' + : 'vertical' + } + > + <FilterCard + filter={filter} + isVisible={!isFilterActive && !isScrolling} + placement={filterCardPlacement} + > + <div> + <FormItem + label={label} + required={filter?.controlValues?.enableEmptyFilter} + validateStatus={isMissingRequiredValue ? 'error' : undefined} + > + <OutPortal node={portalNode} /> + </FormItem> + </div> + </FilterCard> + </FilterControlContainer> + </> ); }; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx index 79085daee3f4..a621052d5143 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx @@ -16,152 +16,247 @@ * specific language governing permissions and limitations * under the License. */ -import React, { FC, useCallback, useMemo } from 'react'; -import { css } from '@emotion/react'; +import React, { + FC, + useEffect, + useCallback, + useMemo, + useRef, + useState, +} from 'react'; import { DataMask, DataMaskStateWithId, Filter, - isFilterDivider, - styled, + Divider, + css, + SupersetTheme, t, + isFeatureEnabled, + FeatureFlag, + isNativeFilterWithDataMask, } from '@superset-ui/core'; import { createHtmlPortalNode, InPortal, OutPortal, } from 'react-reverse-portal'; -import { AntdCollapse } from 'src/components'; +import { useSelector } from 'react-redux'; import { useDashboardHasTabs, useSelectFiltersInScope, } from 'src/dashboard/components/nativeFilters/state'; -import { useFilters } from '../state'; -import FilterControl from './FilterControl'; - -const Wrapper = styled.div` - padding: ${({ theme }) => theme.gridUnit * 4}px; - // 108px padding to make room for buttons with position: absolute - padding-bottom: ${({ theme }) => theme.gridUnit * 27}px; -`; +import { FilterBarOrientation, RootState } from 'src/dashboard/types'; +import DropdownContainer, { + Ref as DropdownContainerRef, +} from 'src/components/DropdownContainer'; +import Icons from 'src/components/Icons'; +import { FiltersOutOfScopeCollapsible } from '../FiltersOutOfScopeCollapsible'; +import { useFilterControlFactory } from '../useFilterControlFactory'; +import { FiltersDropdownContent } from '../FiltersDropdownContent'; type FilterControlsProps = { - directPathToChild?: string[]; + focusedFilterId?: string; dataMaskSelected: DataMaskStateWithId; onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void; }; const FilterControls: FC<FilterControlsProps> = ({ - directPathToChild, + focusedFilterId, dataMaskSelected, onFilterSelectionChange, }) => { - const filters = useFilters(); - const filterValues = useMemo(() => Object.values(filters), [filters]); + const filterBarOrientation = useSelector<RootState, FilterBarOrientation>( + ({ dashboardInfo }) => + isFeatureEnabled(FeatureFlag.HORIZONTAL_FILTER_BAR) + ? dashboardInfo.filterBarOrientation + : FilterBarOrientation.VERTICAL, + ); + + const [overflowedIds, setOverflowedIds] = useState<string[]>([]); + const popoverRef = useRef<DropdownContainerRef>(null); + + const { filterControlFactory, filtersWithValues } = useFilterControlFactory( + dataMaskSelected, + focusedFilterId, + onFilterSelectionChange, + ); const portalNodes = useMemo(() => { - const nodes = new Array(filterValues.length); - for (let i = 0; i < filterValues.length; i += 1) { + const nodes = new Array(filtersWithValues.length); + for (let i = 0; i < filtersWithValues.length; i += 1) { nodes[i] = createHtmlPortalNode(); } return nodes; - }, [filterValues.length]); + }, [filtersWithValues.length]); - const filtersWithValues = useMemo( - () => - filterValues.map(filter => ({ - ...filter, - dataMask: dataMaskSelected[filter.id], - })), - [filterValues, dataMaskSelected], - ); const filterIds = new Set(filtersWithValues.map(item => item.id)); const [filtersInScope, filtersOutOfScope] = useSelectFiltersInScope(filtersWithValues); + const dashboardHasTabs = useDashboardHasTabs(); const showCollapsePanel = dashboardHasTabs && filtersWithValues.length > 0; - const filterControlFactory = useCallback( - index => { - const filter = filtersWithValues[index]; - if (isFilterDivider(filter)) { - return ( - <div> - <h3>{filter.title}</h3> - <p>{filter.description}</p> - </div> - ); - } + const renderer = useCallback( + ({ id }: Filter | Divider, index: number | undefined) => { + const filterIndex = filtersWithValues.findIndex(f => f.id === id); + const key = index ?? id; return ( - <FilterControl - dataMaskSelected={dataMaskSelected} - filter={filter} - directPathToChild={directPathToChild} - onFilterSelectionChange={onFilterSelectionChange} - inView={false} - /> + // Empty text node is to ensure there's always an element preceding + // the OutPortal, otherwise react-reverse-portal crashes + <React.Fragment key={key}> + {'' /* eslint-disable-line react/jsx-curly-brace-presence */} + <OutPortal node={portalNodes[filterIndex]} inView /> + </React.Fragment> ); }, - [ - filtersWithValues, - JSON.stringify(dataMaskSelected), - directPathToChild, - onFilterSelectionChange, - ], + [filtersWithValues, portalNodes], + ); + + const renderVerticalContent = () => ( + <> + {filtersInScope.map(renderer)} + {showCollapsePanel && ( + <FiltersOutOfScopeCollapsible + filtersOutOfScope={filtersOutOfScope} + hasTopMargin={filtersInScope.length > 0} + renderer={renderer} + /> + )} + </> ); + + const items = useMemo( + () => + filtersInScope.map((filter, index) => ({ + id: filter.id, + element: ( + <div + className="filter-item-wrapper" + css={css` + flex-shrink: 0; + `} + > + {renderer(filter, index)} + </div> + ), + })), + [filtersInScope, renderer], + ); + + const overflowedFiltersInScope = useMemo( + () => filtersInScope.filter(({ id }) => overflowedIds?.includes(id)), + [filtersInScope, overflowedIds], + ); + + const activeOverflowedFiltersInScope = useMemo( + () => + overflowedFiltersInScope.filter(filter => + isNativeFilterWithDataMask(filter), + ), + [overflowedFiltersInScope], + ); + + const renderHorizontalContent = () => ( + <div + css={(theme: SupersetTheme) => + css` + padding: 0 ${theme.gridUnit * 4}px; + min-width: 0; + flex: 1; + ` + } + > + <DropdownContainer + items={items} + dropdownTriggerIcon={ + <Icons.FilterSmall + css={css` + && { + margin-right: -4px; + display: flex; + } + `} + /> + } + dropdownTriggerText={t('More filters')} + dropdownTriggerCount={activeOverflowedFiltersInScope.length} + dropdownTriggerTooltip={ + activeOverflowedFiltersInScope.length === 0 + ? t('No applied filters') + : t( + 'Applied filters: %s', + activeOverflowedFiltersInScope + .map(filter => filter.name) + .join(', '), + ) + } + dropdownContent={ + overflowedFiltersInScope.length || + (filtersOutOfScope.length && showCollapsePanel) + ? () => ( + <FiltersDropdownContent + filtersInScope={overflowedFiltersInScope} + filtersOutOfScope={filtersOutOfScope} + renderer={renderer} + showCollapsePanel={showCollapsePanel} + /> + ) + : undefined + } + ref={popoverRef} + onOverflowingStateChange={({ overflowed: nextOverflowedIds }) => { + if ( + nextOverflowedIds.length !== overflowedIds.length || + overflowedIds.reduce( + (a, b, i) => a || b !== nextOverflowedIds[i], + false, + ) + ) { + setOverflowedIds(nextOverflowedIds); + } + }} + /> + </div> + ); + + const overflowedByIndex = useMemo(() => { + const filtersOutOfScopeIds = new Set(filtersOutOfScope.map(({ id }) => id)); + const overflowedFiltersInScopeIds = new Set( + overflowedFiltersInScope.map(({ id }) => id), + ); + + return filtersWithValues.map( + filter => + filtersOutOfScopeIds.has(filter.id) || + overflowedFiltersInScopeIds.has(filter.id), + ); + }, [filtersOutOfScope, filtersWithValues, overflowedFiltersInScope]); + + useEffect(() => { + if (focusedFilterId && overflowedIds.includes(focusedFilterId)) { + popoverRef?.current?.open(); + } + }, [focusedFilterId, popoverRef, overflowedIds]); + return ( - <Wrapper> + <> {portalNodes - .filter((node, index) => filterIds.has(filterValues[index].id)) + .filter((node, index) => filterIds.has(filtersWithValues[index].id)) .map((node, index) => ( - <InPortal node={node}>{filterControlFactory(index)}</InPortal> + <InPortal node={node} key={filtersWithValues[index].id}> + {filterControlFactory( + index, + filterBarOrientation, + overflowedByIndex[index], + )} + </InPortal> ))} - {filtersInScope.map(filter => { - const index = filterValues.findIndex(f => f.id === filter.id); - return <OutPortal node={portalNodes[index]} inView />; - })} - {showCollapsePanel && ( - <AntdCollapse - ghost - bordered - expandIconPosition="right" - collapsible={filtersOutOfScope.length === 0 ? 'disabled' : undefined} - css={theme => css` - &.ant-collapse { - margin-top: ${filtersInScope.length > 0 - ? theme.gridUnit * 6 - : 0}px; - & > .ant-collapse-item { - & > .ant-collapse-header { - padding-left: 0; - padding-bottom: ${theme.gridUnit * 2}px; - - & > .ant-collapse-arrow { - right: ${theme.gridUnit}px; - } - } - - & .ant-collapse-content-box { - padding: ${theme.gridUnit * 4}px 0 0; - } - } - } - `} - > - <AntdCollapse.Panel - header={t('Filters out of scope (%d)', filtersOutOfScope.length)} - key="1" - > - {filtersOutOfScope.map(filter => { - const index = filtersWithValues.findIndex( - f => f.id === filter.id, - ); - return <OutPortal node={portalNodes[index]} inView />; - })} - </AntdCollapse.Panel> - </AntdCollapse> - )} - </Wrapper> + {filterBarOrientation === FilterBarOrientation.VERTICAL && + renderVerticalContent()} + {filterBarOrientation === FilterBarOrientation.HORIZONTAL && + renderHorizontalContent()} + </> ); }; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.stories.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.stories.tsx new file mode 100644 index 000000000000..46e7c03fadb5 --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.stories.tsx @@ -0,0 +1,121 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { css } from '@emotion/react'; +import { FilterBarOrientation } from 'src/dashboard/types'; +import FilterDivider from './FilterDivider'; +import { FilterDividerProps } from './types'; + +export default { + title: 'FilterDivider', + component: FilterDivider, +}; + +export const VerticalFilterDivider = (props: FilterDividerProps) => ( + <div + css={css` + background-color: #ddd; + padding: 50px; + `} + > + <div + css={css` + display: flex; + flex-direction: column; + width: 259px; + padding: 16px; + background-color: white; + `} + > + <FilterDivider {...props} /> + </div> + </div> +); + +export const HorizontalFilterDivider = (props: FilterDividerProps) => ( + <div + css={css` + background-color: #ddd; + padding: 50px; + `} + > + <div + css={css` + height: 48px; + padding: 0 16px; + display: flex; + align-items: center; + background-color: white; + `} + > + <FilterDivider orientation={FilterBarOrientation.HORIZONTAL} {...props} /> + </div> + </div> +); + +export const HorizontalOverflowFilterDivider = (props: FilterDividerProps) => ( + <div + css={css` + background-color: #ddd; + padding: 50px; + `} + > + <div + css={css` + width: 224px; + padding: 16px; + background-color: white; + `} + > + <FilterDivider {...props} /> + </div> + </div> +); + +const args = { + title: 'Sample title', + description: 'Sample description', +}; + +const story = { parameters: { knobs: { disable: true } } }; + +VerticalFilterDivider.args = { + ...args, + horizontal: false, + overflow: false, +}; + +VerticalFilterDivider.story = story; + +HorizontalFilterDivider.args = { + ...args, + horizontal: true, + overflow: false, +}; + +HorizontalFilterDivider.story = story; + +HorizontalOverflowFilterDivider.args = { + ...args, + horizontal: true, + overflow: true, +}; + +HorizontalOverflowFilterDivider.story = story; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.test.tsx new file mode 100644 index 000000000000..8491c93d8fa1 --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.test.tsx @@ -0,0 +1,135 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import userEvent from '@testing-library/user-event'; +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import { FilterBarOrientation } from 'src/dashboard/types'; +import FilterDivider from './FilterDivider'; + +const SAMPLE_TITLE = 'Sample title'; +const SAMPLE_DESCRIPTION = + 'Sample description that is even longer, it goes on and on and on and on and on and on and on and on and on and on.'; + +test('vertical mode, title', () => { + render(<FilterDivider title={SAMPLE_TITLE} description="" />); + const title = screen.getByRole('heading', { name: SAMPLE_TITLE }); + expect(title).toBeVisible(); + expect(title).toHaveTextContent(SAMPLE_TITLE); + const description = screen.queryByTestId('divider-description'); + expect(description).not.toBeInTheDocument(); + const descriptionIcon = screen.queryByTestId('divider-description-icon'); + expect(descriptionIcon).not.toBeInTheDocument(); +}); + +test('vertical mode, title and description', () => { + render( + <FilterDivider title={SAMPLE_TITLE} description={SAMPLE_DESCRIPTION} />, + ); + + const title = screen.getByRole('heading', { name: SAMPLE_TITLE }); + expect(title).toBeVisible(); + expect(title).toHaveTextContent(SAMPLE_TITLE); + const description = screen.getByTestId('divider-description'); + expect(description).toBeVisible(); + expect(description).toHaveTextContent(SAMPLE_DESCRIPTION); + const descriptionIcon = screen.queryByTestId('divider-description-icon'); + expect(descriptionIcon).not.toBeInTheDocument(); +}); + +test('horizontal mode, title', () => { + render( + <FilterDivider + orientation={FilterBarOrientation.HORIZONTAL} + title={SAMPLE_TITLE} + description="" + overflow + />, + ); + + const title = screen.getByRole('heading', { name: SAMPLE_TITLE }); + expect(title).toBeVisible(); + expect(title).toHaveTextContent(SAMPLE_TITLE); + const description = screen.queryByTestId('divider-description'); + expect(description).not.toBeInTheDocument(); + const descriptionIcon = screen.queryByTestId('divider-description-icon'); + expect(descriptionIcon).not.toBeInTheDocument(); +}); + +test('horizontal mode, title and description', async () => { + render( + <FilterDivider + orientation={FilterBarOrientation.HORIZONTAL} + title={SAMPLE_TITLE} + description={SAMPLE_DESCRIPTION} + />, + ); + + const title = screen.getByRole('heading', { name: SAMPLE_TITLE }); + expect(title).toBeVisible(); + expect(title).toHaveTextContent(SAMPLE_TITLE); + const description = screen.queryByTestId('divider-description'); + expect(description).not.toBeInTheDocument(); + const descriptionIcon = screen.getByTestId('divider-description-icon'); + expect(descriptionIcon).toBeVisible(); + userEvent.hover(descriptionIcon); + const tooltip = await screen.findByRole('tooltip'); + + expect(tooltip).toBeInTheDocument(); + expect(tooltip).toHaveTextContent(SAMPLE_DESCRIPTION); +}); + +test('horizontal overflow mode, title', () => { + render( + <FilterDivider + orientation={FilterBarOrientation.HORIZONTAL} + overflow + title={SAMPLE_TITLE} + description="" + />, + ); + + const title = screen.getByRole('heading', { name: SAMPLE_TITLE }); + expect(title).toBeVisible(); + expect(title).toHaveTextContent(SAMPLE_TITLE); + const description = screen.queryByTestId('divider-description'); + expect(description).not.toBeInTheDocument(); + const descriptionIcon = screen.queryByTestId('divider-description-icon'); + expect(descriptionIcon).not.toBeInTheDocument(); +}); + +test('horizontal overflow mode, title and description', () => { + render( + <FilterDivider + orientation={FilterBarOrientation.HORIZONTAL} + overflow + title={SAMPLE_TITLE} + description={SAMPLE_DESCRIPTION} + />, + ); + + const title = screen.getByRole('heading', { name: SAMPLE_TITLE }); + expect(title).toBeVisible(); + expect(title).toHaveTextContent(SAMPLE_TITLE); + const description = screen.queryByTestId('divider-description'); + expect(description).toBeVisible(); + expect(description).toHaveTextContent(SAMPLE_DESCRIPTION); + const descriptionIcon = screen.queryByTestId('divider-description-icon'); + expect(descriptionIcon).not.toBeInTheDocument(); +}); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.tsx new file mode 100644 index 000000000000..e06a56ac7bc6 --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.tsx @@ -0,0 +1,162 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { css, useTheme } from '@superset-ui/core'; +import React from 'react'; +import Icons from 'src/components/Icons'; +import { Tooltip } from 'src/components/Tooltip'; +import { FilterBarOrientation } from 'src/dashboard/types'; +import { useCSSTextTruncation, truncationCSS } from 'src/hooks/useTruncation'; +import { FilterDividerProps } from './types'; + +const VerticalDivider = ({ title, description }: FilterDividerProps) => ( + <div> + <h3>{title}</h3> + {description ? <p data-test="divider-description">{description}</p> : null} + </div> +); + +const HorizontalDivider = ({ title, description }: FilterDividerProps) => { + const theme = useTheme(); + const [titleRef, titleIsTruncated] = + useCSSTextTruncation<HTMLHeadingElement>(); + + return ( + <div + css={css` + display: flex; + align-items: center; + height: ${6 * theme.gridUnit}px; + border-left: 1px solid ${theme.colors.grayscale.light2}; + padding-left: ${4 * theme.gridUnit}px; + + .filter-item-wrapper:first-child & { + border-left: none; + padding-left: 0; + } + `} + > + <Tooltip overlay={titleIsTruncated ? title : null}> + <h3 + ref={titleRef} + css={css` + ${truncationCSS}; + max-width: ${theme.gridUnit * 32.5}px; + font-size: ${theme.typography.sizes.m}px; + font-weight: ${theme.typography.weights.normal}; + margin: 0; + color: ${theme.colors.grayscale.dark1}; + `} + > + {title} + </h3> + </Tooltip> + {description ? ( + <Tooltip overlay={description}> + <Icons.BookOutlined + data-test="divider-description-icon" + iconSize="l" + iconColor={theme.colors.grayscale.base} + css={css` + margin: 0 ${theme.gridUnit * 1.5}px; + vertical-align: unset; + line-height: unset; + `} + /> + </Tooltip> + ) : null} + </div> + ); +}; + +const HorizontalOverflowDivider = ({ + title, + description, +}: FilterDividerProps) => { + const theme = useTheme(); + const [titleRef, titleIsTruncated] = + useCSSTextTruncation<HTMLHeadingElement>(); + + const [descriptionRef, descriptionIsTruncated] = + useCSSTextTruncation<HTMLHeadingElement>(); + + return ( + <div + css={css` + border-top: 1px solid ${theme.colors.grayscale.light2}; + padding-top: ${theme.gridUnit * 4}px; + margin-bottom: ${theme.gridUnit * 4}px; + `} + > + <Tooltip overlay={titleIsTruncated ? <strong>{title}</strong> : null}> + <h3 + ref={titleRef} + css={css` + ${truncationCSS}; + display: block; + color: ${theme.colors.grayscale.dark1}; + font-weight: ${theme.typography.weights.normal}; + font-size: ${theme.typography.sizes.m}px; + margin: 0 0 ${theme.gridUnit}px 0; + `} + > + {title} + </h3> + </Tooltip> + {description ? ( + <Tooltip overlay={descriptionIsTruncated ? description : null}> + <p + ref={descriptionRef} + data-test="divider-description" + css={css` + ${truncationCSS}; + display: block; + font-size: ${theme.typography.sizes.s}px; + color: ${theme.colors.grayscale.base}; + margin: ${theme.gridUnit}px 0 0 0; + `} + > + {description} + </p> + </Tooltip> + ) : null} + </div> + ); +}; + +const FilterDivider = ({ + title, + description, + orientation = FilterBarOrientation.VERTICAL, + overflow = false, +}: FilterDividerProps) => { + if (orientation === FilterBarOrientation.HORIZONTAL) { + if (overflow) { + return ( + <HorizontalOverflowDivider title={title} description={description} /> + ); + } + + return <HorizontalDivider title={title} description={description} />; + } + + return <VerticalDivider title={title} description={description} />; +}; + +export default FilterDivider; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx index 4337d59ed86f..308361622e16 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx @@ -42,10 +42,11 @@ import BasicErrorAlert from 'src/components/ErrorMessage/BasicErrorAlert'; import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; import { waitForAsyncData } from 'src/middleware/asyncEvent'; import { ClientErrorObject } from 'src/utils/getClientErrorObject'; -import { RootState } from 'src/dashboard/types'; +import { FilterBarOrientation, RootState } from 'src/dashboard/types'; import { onFiltersRefreshSuccess } from 'src/dashboard/actions/dashboardState'; -import { dispatchFocusAction } from './utils'; -import { FilterProps } from './types'; +import { FAST_DEBOUNCE } from 'src/constants'; +import { dispatchHoverAction, dispatchFocusAction } from './utils'; +import { FilterControlProps } from './types'; import { getFormData } from '../../utils'; import { useFilterDependencies } from './state'; import { checkIsMissingRequiredValue } from '../utils'; @@ -75,15 +76,17 @@ const useShouldFilterRefresh = () => { return !isDashboardRefreshing && isFilterRefreshing; }; -const FilterValue: React.FC<FilterProps> = ({ +const FilterValue: React.FC<FilterControlProps> = ({ dataMaskSelected, filter, - directPathToChild, + focusedFilterId, onFilterSelectionChange, inView = true, showOverflow, parentRef, setFilterActive, + orientation = FilterBarOrientation.VERTICAL, + overflow = false, }) => { const { id, targets, filterType, adhoc_filters, time_range } = filter; const metadata = getChartMetadataRegistry().get(filterType); @@ -209,10 +212,12 @@ const FilterValue: React.FC<FilterProps> = ({ ]); useEffect(() => { - if (directPathToChild?.[0] === filter.id) { - inputRef?.current?.focus(); + if (focusedFilterId && focusedFilterId === filter.id) { + setTimeout(() => { + inputRef?.current?.focus(); + }, FAST_DEBOUNCE); } - }, [inputRef, directPathToChild, filter.id]); + }, [inputRef, focusedFilterId, filter.id]); const setDataMask = useCallback( (dataMask: DataMask) => onFilterSelectionChange(filter, dataMask), @@ -228,14 +233,32 @@ const FilterValue: React.FC<FilterProps> = ({ [dispatch], ); + const setHoveredFilter = useCallback( + () => dispatchHoverAction(dispatch, id), + [dispatch, id], + ); + const unsetHoveredFilter = useCallback( + () => dispatchHoverAction(dispatch), + [dispatch], + ); + const hooks = useMemo( () => ({ setDataMask, + setHoveredFilter, + unsetHoveredFilter, setFocusedFilter, unsetFocusedFilter, setFilterActive, }), - [setDataMask, setFilterActive, setFocusedFilter, unsetFocusedFilter], + [ + setDataMask, + setFilterActive, + setHoveredFilter, + unsetHoveredFilter, + setFocusedFilter, + unsetFocusedFilter, + ], ); const isMissingRequiredValue = checkIsMissingRequiredValue( @@ -251,6 +274,14 @@ const FilterValue: React.FC<FilterProps> = ({ [filter.dataMask?.filterState, isMissingRequiredValue], ); + const displaySettings = useMemo( + () => ({ + filterBarOrientation: orientation, + isOverflowingFilterBar: overflow, + }), + [orientation, overflow], + ); + if (error) { return ( <BasicErrorAlert @@ -271,6 +302,7 @@ const FilterValue: React.FC<FilterProps> = ({ width="100%" showOverflow={showOverflow} formData={formData} + displaySettings={displaySettings} parentRef={parentRef} inputRef={inputRef} // For charts that don't have datasource we need workaround for empty placeholder @@ -287,4 +319,4 @@ const FilterValue: React.FC<FilterProps> = ({ </StyledDiv> ); }; -export default FilterValue; +export default React.memo(FilterValue); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts index e5b553712634..ac9cca8c0179 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts @@ -18,14 +18,25 @@ */ import React, { RefObject } from 'react'; import { DataMask, DataMaskStateWithId, Filter } from '@superset-ui/core'; +import { FilterBarOrientation } from 'src/dashboard/types'; -export interface FilterProps { +export interface BaseFilterProps { + orientation?: FilterBarOrientation; + overflow?: boolean; +} + +export interface FilterDividerProps extends BaseFilterProps { + title: string; + description: string; +} + +export interface FilterControlProps extends BaseFilterProps { dataMaskSelected?: DataMaskStateWithId; filter: Filter & { dataMask?: DataMask; }; icon?: React.ReactElement; - directPathToChild?: string[]; + focusedFilterId?: string; onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void; inView?: boolean; showOverflow?: boolean; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/utils.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/utils.ts index 3077c42768e8..5e0e159d1189 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/utils.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/utils.ts @@ -21,7 +21,21 @@ import { Dispatch } from 'react'; import { setFocusedNativeFilter, unsetFocusedNativeFilter, + setHoveredNativeFilter, + unsetHoveredNativeFilter, } from 'src/dashboard/actions/nativeFilters'; +import { FAST_DEBOUNCE } from 'src/constants'; + +export const dispatchHoverAction = debounce( + (dispatch: Dispatch<any>, id?: string) => { + if (id) { + dispatch(setHoveredNativeFilter(id)); + } else { + dispatch(unsetHoveredNativeFilter()); + } + }, + FAST_DEBOUNCE, +); export const dispatchFocusAction = debounce( (dispatch: Dispatch<any>, id?: string) => { @@ -31,5 +45,5 @@ export const dispatchFocusAction = debounce( dispatch(unsetFocusedNativeFilter()); } }, - 300, + FAST_DEBOUNCE, ); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx index 689eaa826627..4b753a6a3e6a 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx @@ -22,12 +22,12 @@ import { Typography, AntdTooltip } from 'src/components'; import { useDispatch } from 'react-redux'; import Button from 'src/components/Button'; import { updateFilterSet } from 'src/dashboard/actions/nativeFilters'; -import { WarningOutlined } from '@ant-design/icons'; +import Icons from 'src/components/Icons'; import { ActionButtons } from './Footer'; import { useNativeFiltersDataMask, useFilters, useFilterSets } from '../state'; import { APPLY_FILTERS_HINT, findExistingFilterSet } from './utils'; import { useFilterSetNameDuplicated } from './state'; -import { getFilterBarTestId } from '../index'; +import { getFilterBarTestId } from '../utils'; const Wrapper = styled.div` display: grid; @@ -160,7 +160,7 @@ const EditSection: FC<EditSectionProps> = ({ </ActionButtons> {isDuplicateFilterSet && ( <Warning mark> - <WarningOutlined /> + <Icons.WarningOutlined iconSize="m" /> {t('This filter set is identical to: "%s"', foundFilterSet?.name)} </Warning> )} diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.test.tsx index a5e34432cd7f..50fe910c53ae 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.test.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.test.tsx @@ -32,7 +32,7 @@ const createProps = () => ({ }); function openDropdown() { - const dropdownIcon = screen.getByRole('img', { name: 'ellipsis' }); + const dropdownIcon = screen.getAllByRole('img', { name: '' })[0]; userEvent.click(dropdownIcon); } diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx index 53ea1c94c528..74cf3aa6625e 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx @@ -27,11 +27,11 @@ import { useTheme, t, } from '@superset-ui/core'; -import { CheckOutlined, EllipsisOutlined } from '@ant-design/icons'; +import Icons from 'src/components/Icons'; import Button from 'src/components/Button'; import { Tooltip } from 'src/components/Tooltip'; import FiltersHeader from './FiltersHeader'; -import { getFilterBarTestId } from '..'; +import { getFilterBarTestId } from '../utils'; const HeaderButton = styled(Button)` padding: 0; @@ -107,7 +107,10 @@ const FilterSetUnit: FC<FilterSetUnitProps> = ({ </Typography.Text> <IconsBlock> {isApplied && ( - <CheckOutlined style={{ color: theme.colors.success.base }} /> + <Icons.CheckOutlined + iconSize="m" + iconColor={theme.colors.success.base} + /> )} {onDelete && ( <AntdDropdown @@ -124,7 +127,7 @@ const FilterSetUnit: FC<FilterSetUnitProps> = ({ buttonStyle="link" buttonSize="xsmall" > - <EllipsisOutlined /> + <Icons.EllipsisOutlined iconSize="m" /> </HeaderButton> </AntdDropdown> )} diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSets.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSets.test.tsx index 78ad4599933d..2fe855147ab6 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSets.test.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSets.test.tsx @@ -21,7 +21,7 @@ import { render, screen } from 'spec/helpers/testing-library'; import { mockStore } from 'spec/fixtures/mockStore'; import { Provider } from 'react-redux'; import FilterSets, { FilterSetsProps } from '.'; -import { TabIds } from '../utils'; +import { TabIds } from '../types'; const createProps = () => ({ disabled: false, diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx index 5a7bff6527f3..5982bf515a6e 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx @@ -30,7 +30,7 @@ import Icons from 'src/components/Icons'; import { areObjectsEqual } from 'src/reduxUtils'; import { getFilterValueForDisplay } from './utils'; import { useFilters } from '../state'; -import { getFilterBarTestId } from '../index'; +import { getFilterBarTestId } from '../utils'; const FilterHeader = styled.div` display: flex; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx index df6c6ee44ebf..7847927ff5b8 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx @@ -22,7 +22,7 @@ import Button from 'src/components/Button'; import { Tooltip } from 'src/components/Tooltip'; import { APPLY_FILTERS_HINT } from './utils'; import { useFilterSetNameDuplicated } from './state'; -import { getFilterBarTestId } from '..'; +import { getFilterBarTestId } from '../utils'; export type FooterProps = { filterSetName: string; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx index 5fdfd481719e..2e12425de75b 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx @@ -40,8 +40,8 @@ import { findExistingFilterSet } from './utils'; import { useFilters, useNativeFiltersDataMask, useFilterSets } from '../state'; import Footer from './Footer'; import FilterSetUnit from './FilterSetUnit'; -import { getFilterBarTestId } from '..'; -import { TabIds } from '../utils'; +import { getFilterBarTestId } from '../utils'; +import { TabIds } from '../types'; const FilterSetsWrapper = styled.div` display: grid; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FiltersDropdownContent/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FiltersDropdownContent/index.tsx new file mode 100644 index 000000000000..84710c94b5f0 --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FiltersDropdownContent/index.tsx @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { ReactNode } from 'react'; +import { css, Divider, Filter, SupersetTheme } from '@superset-ui/core'; +import { FiltersOutOfScopeCollapsible } from '../FiltersOutOfScopeCollapsible'; + +export interface FiltersDropdownContentProps { + filtersInScope: (Filter | Divider)[]; + filtersOutOfScope: (Filter | Divider)[]; + renderer: (filter: Filter | Divider, index: number) => ReactNode; + showCollapsePanel?: boolean; +} + +export const FiltersDropdownContent = ({ + filtersInScope, + filtersOutOfScope, + renderer, + showCollapsePanel, +}: FiltersDropdownContentProps) => ( + <div + css={(theme: SupersetTheme) => + css` + width: ${theme.gridUnit * 56}px; + padding: ${theme.gridUnit}px 0; + ` + } + > + {filtersInScope.map(renderer)} + {showCollapsePanel && ( + <FiltersOutOfScopeCollapsible + filtersOutOfScope={filtersOutOfScope} + renderer={renderer} + horizontalOverflow + /> + )} + </div> +); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FiltersOutOfScopeCollapsible/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FiltersOutOfScopeCollapsible/index.tsx new file mode 100644 index 000000000000..a85f1907322c --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FiltersOutOfScopeCollapsible/index.tsx @@ -0,0 +1,89 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { ReactNode } from 'react'; +import { css } from '@emotion/react'; +import { Divider, Filter, SupersetTheme, t } from '@superset-ui/core'; +import { AntdCollapse } from 'src/components'; + +export interface FiltersOutOfScopeCollapsibleProps { + filtersOutOfScope: (Filter | Divider)[]; + renderer: (filter: Filter | Divider, index: number) => ReactNode; + hasTopMargin?: boolean; + horizontalOverflow?: boolean; +} + +export const FiltersOutOfScopeCollapsible = ({ + filtersOutOfScope, + renderer, + hasTopMargin, + horizontalOverflow, +}: FiltersOutOfScopeCollapsibleProps) => ( + <AntdCollapse + ghost + bordered + expandIconPosition="right" + collapsible={filtersOutOfScope.length === 0 ? 'disabled' : undefined} + css={(theme: SupersetTheme) => + horizontalOverflow + ? css` + &.ant-collapse > .ant-collapse-item { + & > .ant-collapse-header { + padding: 0; + + & > .ant-collapse-arrow { + right: 0; + padding: 0; + } + } + + & .ant-collapse-content-box { + padding: ${theme.gridUnit * 4}px 0 0; + margin-bottom: ${theme.gridUnit * -4}px; + } + } + ` + : css` + &.ant-collapse { + margin-top: ${hasTopMargin ? theme.gridUnit * 6 : 0}px; + & > .ant-collapse-item { + & > .ant-collapse-header { + padding-left: 0; + padding-bottom: ${theme.gridUnit * 2}px; + + & > .ant-collapse-arrow { + right: ${theme.gridUnit}px; + } + } + + & .ant-collapse-content-box { + padding: ${theme.gridUnit * 4}px 0 0; + } + } + } + ` + } + > + <AntdCollapse.Panel + header={t('Filters out of scope (%d)', filtersOutOfScope.length)} + key="1" + > + {filtersOutOfScope.map(renderer)} + </AntdCollapse.Panel> + </AntdCollapse> +); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx index 45019f58cdfc..7cd4877d11e2 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx @@ -18,25 +18,39 @@ */ /* eslint-disable no-param-reassign */ import { css, styled, t, useTheme } from '@superset-ui/core'; -import React, { FC } from 'react'; +import React, { FC, useMemo } from 'react'; import Icons from 'src/components/Icons'; import Button from 'src/components/Button'; import { useSelector } from 'react-redux'; import FilterConfigurationLink from 'src/dashboard/components/nativeFilters/FilterBar/FilterConfigurationLink'; import { useFilters } from 'src/dashboard/components/nativeFilters/FilterBar/state'; import { RootState } from 'src/dashboard/types'; -import { getFilterBarTestId } from '..'; +import { getFilterBarTestId } from '../utils'; +import FilterBarSettings from '../FilterBarSettings'; -const TitleArea = styled.h4` - display: flex; - flex-direction: row; - justify-content: space-between; - margin: 0; - padding: ${({ theme }) => theme.gridUnit * 2}px; +const TitleArea = styled.div` + ${({ theme }) => css` + display: flex; + align-items: center; + flex-direction: row; + justify-content: space-between; + margin: 0; + padding: 0 ${theme.gridUnit * 2}px ${theme.gridUnit * 2}px; + + & > span { + font-size: ${theme.typography.sizes.l}px; + flex-grow: 1; + font-weight: ${theme.typography.weights.bold}; + } + + & > div:first-of-type { + line-height: 0; + } - & > span { - flex-grow: 1; - } + & > button > span.anticon { + line-height: 0; + } + `} `; const HeaderButton = styled(Button)` @@ -44,8 +58,15 @@ const HeaderButton = styled(Button)` `; const Wrapper = styled.div` - padding: ${({ theme }) => theme.gridUnit}px - ${({ theme }) => theme.gridUnit * 2}px; + ${({ theme }) => ` + padding: ${theme.gridUnit * 3}px ${theme.gridUnit * 2}px ${ + theme.gridUnit + }px; + + .ant-dropdown-trigger span { + padding-right: ${theme.gridUnit * 2}px; + } + `} `; type HeaderProps = { @@ -74,7 +95,7 @@ const AddFiltersButtonContainer = styled.div` const Header: FC<HeaderProps> = ({ toggleFiltersBar }) => { const theme = useTheme(); const filters = useFilters(); - const filterValues = Object.values(filters); + const filterValues = useMemo(() => Object.values(filters), [filters]); const canEdit = useSelector<RootState, boolean>( ({ dashboardInfo }) => dashboardInfo.dash_edit_perm, ); @@ -86,6 +107,7 @@ const Header: FC<HeaderProps> = ({ toggleFiltersBar }) => { <Wrapper> <TitleArea> <span>{t('Filters')}</span> + <FilterBarSettings /> <HeaderButton {...getFilterBarTestId('collapse-button')} buttonStyle="link" @@ -109,4 +131,4 @@ const Header: FC<HeaderProps> = ({ toggleFiltersBar }) => { ); }; -export default Header; +export default React.memo(Header); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx new file mode 100644 index 000000000000..7e786985e890 --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx @@ -0,0 +1,138 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { styled, t } from '@superset-ui/core'; +import Icons from 'src/components/Icons'; +import Loading from 'src/components/Loading'; +import FilterControls from './FilterControls/FilterControls'; +import { getFilterBarTestId } from './utils'; +import { HorizontalBarProps } from './types'; +import FilterBarSettings from './FilterBarSettings'; +import FilterConfigurationLink from './FilterConfigurationLink'; + +const HorizontalBar = styled.div` + ${({ theme }) => ` + padding: ${theme.gridUnit * 3}px ${theme.gridUnit * 2}px ${ + theme.gridUnit * 3 + }px ${theme.gridUnit * 4}px; + background: ${theme.colors.grayscale.light5}; + box-shadow: inset 0px -2px 2px -1px ${theme.colors.grayscale.light2}; + `} +`; + +const HorizontalBarContent = styled.div` + ${({ theme }) => ` + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + justify-content: flex-start; + line-height: 0; + + .loading { + margin: ${theme.gridUnit * 2}px auto ${theme.gridUnit * 2}px; + padding: 0; + } + `} +`; + +const FilterBarEmptyStateContainer = styled.div` + ${({ theme }) => ` + font-weight: ${theme.typography.weights.bold}; + color: ${theme.colors.grayscale.base}; + font-size: ${theme.typography.sizes.s}px; + `} +`; + +const FiltersLinkContainer = styled.div<{ hasFilters: boolean }>` + ${({ theme, hasFilters }) => ` + height: 24px; + display: flex; + align-items: center; + padding: 0 ${theme.gridUnit * 4}px 0 ${theme.gridUnit * 4}px; + border-right: ${ + hasFilters ? `1px solid ${theme.colors.grayscale.light2}` : 0 + }; + + button { + display: flex; + align-items: center; + > .anticon { + height: 24px; + padding-right: ${theme.gridUnit}px; + } + > .anticon + span, > .anticon { + margin-right: 0; + margin-left: 0; + } + } + `} +`; + +const HorizontalFilterBar: React.FC<HorizontalBarProps> = ({ + actions, + canEdit, + dashboardId, + dataMaskSelected, + filterValues, + isInitialized, + focusedFilterId, + onSelectionChange, +}) => { + const hasFilters = filterValues.length > 0; + + return ( + <HorizontalBar {...getFilterBarTestId()}> + <HorizontalBarContent> + {!isInitialized ? ( + <Loading position="inline-centered" /> + ) : ( + <> + <FilterBarSettings /> + {canEdit && ( + <FiltersLinkContainer hasFilters={hasFilters}> + <FilterConfigurationLink + dashboardId={dashboardId} + createNewOnOpen={filterValues.length === 0} + > + <Icons.PlusSmall /> {t('Add/Edit Filters')} + </FilterConfigurationLink> + </FiltersLinkContainer> + )} + {!hasFilters && ( + <FilterBarEmptyStateContainer data-test="horizontal-filterbar-empty"> + {t('No filters are currently added to this dashboard.')} + </FilterBarEmptyStateContainer> + )} + {hasFilters && ( + <FilterControls + dataMaskSelected={dataMaskSelected} + focusedFilterId={focusedFilterId} + onFilterSelectionChange={onSelectionChange} + /> + )} + {actions} + </> + )} + </HorizontalBarContent> + </HorizontalBar> + ); +}; +export default React.memo(HorizontalFilterBar); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/HorizontalFilterBar.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/HorizontalFilterBar.test.tsx new file mode 100644 index 000000000000..c0b2b7c19940 --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/HorizontalFilterBar.test.tsx @@ -0,0 +1,97 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { NativeFilterType } from '@superset-ui/core'; +import React from 'react'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import HorizontalBar from './Horizontal'; + +const defaultProps = { + actions: null, + canEdit: true, + dashboardId: 1, + dataMaskSelected: {}, + filterValues: [], + isInitialized: true, + onSelectionChange: jest.fn(), +}; + +const renderWrapper = (overrideProps?: Record<string, any>) => + waitFor(() => + render(<HorizontalBar {...defaultProps} {...overrideProps} />, { + useRedux: true, + initialState: { + dashboardInfo: { + dash_edit_perm: true, + }, + }, + }), + ); + +test('should render', async () => { + const { container } = await renderWrapper(); + expect(container).toBeInTheDocument(); +}); + +test('should not render the empty message', async () => { + await renderWrapper({ + filterValues: [ + { + id: 'test', + type: NativeFilterType.NATIVE_FILTER, + }, + ], + }); + expect( + screen.queryByText('No filters are currently added to this dashboard.'), + ).not.toBeInTheDocument(); +}); + +test('should render the empty message', async () => { + await renderWrapper(); + expect( + screen.getByText('No filters are currently added to this dashboard.'), + ).toBeInTheDocument(); +}); + +test('should not render the loading icon', async () => { + await renderWrapper(); + expect( + screen.queryByRole('status', { name: 'Loading' }), + ).not.toBeInTheDocument(); +}); + +test('should render the loading icon', async () => { + await renderWrapper({ + isInitialized: false, + }); + expect(screen.getByRole('status', { name: 'Loading' })).toBeInTheDocument(); +}); + +test('should render Add/Edit Filters', async () => { + await renderWrapper(); + expect(screen.getByText('Add/Edit Filters')).toBeInTheDocument(); +}); + +test('should not render Add/Edit Filters', async () => { + await renderWrapper({ + canEdit: false, + }); + expect(screen.queryByText('Add/Edit Filters')).not.toBeInTheDocument(); +}); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx new file mode 100644 index 000000000000..2a6b7178362d --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx @@ -0,0 +1,316 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable no-param-reassign */ +import throttle from 'lodash/throttle'; +import React, { + useEffect, + useState, + useCallback, + useMemo, + useRef, + createContext, +} from 'react'; +import cx from 'classnames'; +import { HandlerFunction, styled, t, isNativeFilter } from '@superset-ui/core'; +import Icons from 'src/components/Icons'; +import { AntdTabs } from 'src/components'; +import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; +import Loading from 'src/components/Loading'; +import { EmptyStateSmall } from 'src/components/EmptyState'; +import { getFilterBarTestId } from './utils'; +import { TabIds, VerticalBarProps } from './types'; +import FilterSets from './FilterSets'; +import { useFilterSets } from './state'; +import EditSection from './FilterSets/EditSection'; +import Header from './Header'; +import FilterControls from './FilterControls/FilterControls'; + +const BarWrapper = styled.div<{ width: number }>` + width: ${({ theme }) => theme.gridUnit * 8}px; + + & .ant-tabs-top > .ant-tabs-nav { + margin: 0; + } + &.open { + width: ${({ width }) => width}px; // arbitrary... + } +`; + +const Bar = styled.div<{ width: number }>` + ${({ theme, width }) => ` + & .ant-typography-edit-content { + left: 0; + margin-top: 0; + width: 100%; + } + position: absolute; + top: 0; + left: 0; + flex-direction: column; + flex-grow: 1; + width: ${width}px; + background: ${theme.colors.grayscale.light5}; + border-right: 1px solid ${theme.colors.grayscale.light2}; + border-bottom: 1px solid ${theme.colors.grayscale.light2}; + min-height: 100%; + display: none; + &.open { + display: flex; + } + `} +`; + +const CollapsedBar = styled.div<{ offset: number }>` + ${({ theme, offset }) => ` + position: absolute; + top: ${offset}px; + left: 0; + height: 100%; + width: ${theme.gridUnit * 8}px; + padding-top: ${theme.gridUnit * 2}px; + display: none; + text-align: center; + &.open { + display: flex; + flex-direction: column; + align-items: center; + padding: ${theme.gridUnit * 2}px; + } + svg { + cursor: pointer; + } + `} +`; + +const StyledCollapseIcon = styled(Icons.Collapse)` + ${({ theme }) => ` + color: ${theme.colors.primary.base}; + margin-bottom: ${theme.gridUnit * 3}px; + `} +`; + +const StyledFilterIcon = styled(Icons.Filter)` + color: ${({ theme }) => theme.colors.grayscale.base}; +`; + +const StyledTabs = styled(AntdTabs)` + & .ant-tabs-nav-list { + width: 100%; + } + & .ant-tabs-tab { + display: flex; + justify-content: center; + margin: 0; + flex: 1; + } + + & > .ant-tabs-nav .ant-tabs-nav-operations { + display: none; + } +`; + +const FilterBarEmptyStateContainer = styled.div` + margin-top: ${({ theme }) => theme.gridUnit * 8}px; +`; + +const FilterControlsWrapper = styled.div` + padding: ${({ theme }) => theme.gridUnit * 4}px; + // 108px padding to make room for buttons with position: absolute + padding-bottom: ${({ theme }) => theme.gridUnit * 27}px; +`; + +export const FilterBarScrollContext = createContext(false); +const VerticalFilterBar: React.FC<VerticalBarProps> = ({ + actions, + canEdit, + dataMaskSelected, + focusedFilterId, + filtersOpen, + filterValues, + height, + isDisabled, + isInitialized, + offset, + onSelectionChange, + toggleFiltersBar, + width, +}) => { + const [editFilterSetId, setEditFilterSetId] = useState<number | null>(null); + const filterSets = useFilterSets(); + const filterSetFilterValues = Object.values(filterSets); + const [tab, setTab] = useState(TabIds.AllFilters); + const nativeFilterValues = filterValues.filter(isNativeFilter); + const [isScrolling, setIsScrolling] = useState(false); + const timeout = useRef<any>(); + + const openFiltersBar = useCallback( + () => toggleFiltersBar(true), + [toggleFiltersBar], + ); + + const onScroll = useMemo( + () => + throttle(() => { + clearTimeout(timeout.current); + setIsScrolling(true); + timeout.current = setTimeout(() => { + setIsScrolling(false); + }, 300); + }, 200), + [], + ); + + useEffect(() => { + document.onscroll = onScroll; + return () => { + document.onscroll = null; + }; + }, [onScroll]); + + const tabPaneStyle = useMemo( + () => ({ overflow: 'auto', height, overscrollBehavior: 'contain' }), + [height], + ); + + const numberOfFilters = nativeFilterValues.length; + + return ( + <FilterBarScrollContext.Provider value={isScrolling}> + <BarWrapper + {...getFilterBarTestId()} + className={cx({ open: filtersOpen })} + width={width} + > + <CollapsedBar + {...getFilterBarTestId('collapsable')} + className={cx({ open: !filtersOpen })} + onClick={openFiltersBar} + offset={offset} + > + <StyledCollapseIcon + {...getFilterBarTestId('expand-button')} + iconSize="l" + /> + <StyledFilterIcon + {...getFilterBarTestId('filter-icon')} + iconSize="l" + /> + </CollapsedBar> + <Bar className={cx({ open: filtersOpen })} width={width}> + <Header toggleFiltersBar={toggleFiltersBar} /> + {!isInitialized ? ( + <div css={{ height }}> + <Loading /> + </div> + ) : isFeatureEnabled(FeatureFlag.DASHBOARD_NATIVE_FILTERS_SET) ? ( + <StyledTabs + centered + onChange={setTab as HandlerFunction} + defaultActiveKey={TabIds.AllFilters} + activeKey={editFilterSetId ? TabIds.AllFilters : undefined} + > + <AntdTabs.TabPane + tab={t('All filters (%(filterCount)d)', { + filterCount: numberOfFilters, + })} + key={TabIds.AllFilters} + css={tabPaneStyle} + > + {editFilterSetId && ( + <EditSection + dataMaskSelected={dataMaskSelected} + disabled={!isDisabled} + onCancel={() => setEditFilterSetId(null)} + filterSetId={editFilterSetId} + /> + )} + {filterValues.length === 0 ? ( + <FilterBarEmptyStateContainer> + <EmptyStateSmall + title={t('No filters are currently added')} + image="filter.svg" + description={ + canEdit && + t( + 'Click the button above to add a filter to the dashboard', + ) + } + /> + </FilterBarEmptyStateContainer> + ) : ( + <FilterControlsWrapper> + <FilterControls + dataMaskSelected={dataMaskSelected} + focusedFilterId={focusedFilterId} + onFilterSelectionChange={onSelectionChange} + /> + </FilterControlsWrapper> + )} + </AntdTabs.TabPane> + <AntdTabs.TabPane + disabled={!!editFilterSetId} + tab={t('Filter sets (%(filterSetCount)d)', { + filterSetCount: filterSetFilterValues.length, + })} + key={TabIds.FilterSets} + css={tabPaneStyle} + > + <FilterSets + onEditFilterSet={setEditFilterSetId} + disabled={!isDisabled} + dataMaskSelected={dataMaskSelected} + tab={tab} + onFilterSelectionChange={onSelectionChange} + /> + </AntdTabs.TabPane> + </StyledTabs> + ) : ( + <div css={tabPaneStyle} onScroll={onScroll}> + {filterValues.length === 0 ? ( + <FilterBarEmptyStateContainer> + <EmptyStateSmall + title={t('No filters are currently added')} + image="filter.svg" + description={ + canEdit && + t( + 'Click the button above to add a filter to the dashboard', + ) + } + /> + </FilterBarEmptyStateContainer> + ) : ( + <FilterControlsWrapper> + <FilterControls + dataMaskSelected={dataMaskSelected} + focusedFilterId={focusedFilterId} + onFilterSelectionChange={onSelectionChange} + /> + </FilterControlsWrapper> + )} + </div> + )} + {actions} + </Bar> + </BarWrapper> + </FilterBarScrollContext.Provider> + ); +}; +export default React.memo(VerticalFilterBar); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx index 309d75dac9a8..6eeee2ae708f 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx @@ -18,152 +18,38 @@ */ /* eslint-disable no-param-reassign */ -import throttle from 'lodash/throttle'; -import React, { - useEffect, - useState, - useCallback, - useMemo, - useRef, - createContext, -} from 'react'; +import React, { useEffect, useState, useCallback, createContext } from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import cx from 'classnames'; import { DataMaskStateWithId, DataMaskWithId, Filter, DataMask, - HandlerFunction, - styled, - t, SLOW_DEBOUNCE, isNativeFilter, } from '@superset-ui/core'; -import Icons from 'src/components/Icons'; -import { AntdTabs } from 'src/components'; import { useHistory } from 'react-router-dom'; import { usePrevious } from 'src/hooks/usePrevious'; -import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; import { updateDataMask, clearDataMask } from 'src/dataMask/actions'; import { useImmer } from 'use-immer'; import { isEmpty, isEqual, debounce } from 'lodash'; -import { testWithId } from 'src/utils/testUtils'; -import Loading from 'src/components/Loading'; import { getInitialDataMask } from 'src/dataMask/reducer'; import { URL_PARAMS } from 'src/constants'; import { getUrlParam } from 'src/utils/urlUtils'; -import { EmptyStateSmall } from 'src/components/EmptyState'; import { useTabId } from 'src/hooks/useTabId'; -import { RootState } from 'src/dashboard/types'; -import { checkIsApplyDisabled, TabIds } from './utils'; -import FilterSets from './FilterSets'; +import { FilterBarOrientation, RootState } from 'src/dashboard/types'; +import { checkIsApplyDisabled } from './utils'; +import { FiltersBarProps } from './types'; import { useNativeFiltersDataMask, useFilters, - useFilterSets, useFilterUpdates, useInitialization, } from './state'; import { createFilterKey, updateFilterKey } from './keyValue'; -import EditSection from './FilterSets/EditSection'; -import Header from './Header'; -import FilterControls from './FilterControls/FilterControls'; -import { ActionButtons } from './ActionButtons'; - -export const FILTER_BAR_TEST_ID = 'filter-bar'; -export const getFilterBarTestId = testWithId(FILTER_BAR_TEST_ID); - -const BarWrapper = styled.div<{ width: number }>` - width: ${({ theme }) => theme.gridUnit * 8}px; - - & .ant-tabs-top > .ant-tabs-nav { - margin: 0; - } - &.open { - width: ${({ width }) => width}px; // arbitrary... - } -`; - -const Bar = styled.div<{ width: number }>` - & .ant-typography-edit-content { - left: 0; - margin-top: 0; - width: 100%; - } - position: absolute; - top: 0; - left: 0; - flex-direction: column; - flex-grow: 1; - width: ${({ width }) => width}px; - background: ${({ theme }) => theme.colors.grayscale.light5}; - border-right: 1px solid ${({ theme }) => theme.colors.grayscale.light2}; - border-bottom: 1px solid ${({ theme }) => theme.colors.grayscale.light2}; - min-height: 100%; - display: none; - &.open { - display: flex; - } -`; - -const CollapsedBar = styled.div<{ offset: number }>` - position: absolute; - top: ${({ offset }) => offset}px; - left: 0; - height: 100%; - width: ${({ theme }) => theme.gridUnit * 8}px; - padding-top: ${({ theme }) => theme.gridUnit * 2}px; - display: none; - text-align: center; - &.open { - display: flex; - flex-direction: column; - align-items: center; - padding: ${({ theme }) => theme.gridUnit * 2}px; - } - svg { - cursor: pointer; - } -`; - -const StyledCollapseIcon = styled(Icons.Collapse)` - color: ${({ theme }) => theme.colors.primary.base}; - margin-bottom: ${({ theme }) => theme.gridUnit * 3}px; -`; - -const StyledFilterIcon = styled(Icons.Filter)` - color: ${({ theme }) => theme.colors.grayscale.base}; -`; - -const StyledTabs = styled(AntdTabs)` - & .ant-tabs-nav-list { - width: 100%; - } - & .ant-tabs-tab { - display: flex; - justify-content: center; - margin: 0; - flex: 1; - } - - & > .ant-tabs-nav .ant-tabs-nav-operations { - display: none; - } -`; - -const FilterBarEmptyStateContainer = styled.div` - margin-top: ${({ theme }) => theme.gridUnit * 8}px; -`; - -export interface FiltersBarProps { - filtersOpen: boolean; - toggleFiltersBar: any; - directPathToChild?: string[]; - width: number; - height: number | string; - offset: number; -} +import ActionButtons from './ActionButtons'; +import Horizontal from './Horizontal'; +import Vertical from './Vertical'; const EXCLUDED_URL_PARAMS: string[] = [ URL_PARAMS.nativeFilters.name, @@ -211,48 +97,43 @@ const publishDataMask = debounce( // pathname could be updated somewhere else through window.history // keep react router history in sync with window history - history.location.pathname = window.location.pathname; - history.replace({ - search: newParams.toString(), - }); + // replace params only when current page is /superset/dashboard + // this prevents a race condition between updating filters and navigating to Explore + if (window.location.pathname.includes('/superset/dashboard')) { + history.location.pathname = window.location.pathname; + history.replace({ + search: newParams.toString(), + }); + } }, SLOW_DEBOUNCE, ); export const FilterBarScrollContext = createContext(false); const FilterBar: React.FC<FiltersBarProps> = ({ - filtersOpen, - toggleFiltersBar, - directPathToChild, - width, - height, - offset, + focusedFilterId, + orientation = FilterBarOrientation.VERTICAL, + verticalConfig, }) => { const history = useHistory(); const dataMaskApplied: DataMaskStateWithId = useNativeFiltersDataMask(); - const [editFilterSetId, setEditFilterSetId] = useState<number | null>(null); const [dataMaskSelected, setDataMaskSelected] = useImmer<DataMaskStateWithId>(dataMaskApplied); const dispatch = useDispatch(); const [updateKey, setUpdateKey] = useState(0); const tabId = useTabId(); - const filterSets = useFilterSets(); - const filterSetFilterValues = Object.values(filterSets); - const [tab, setTab] = useState(TabIds.AllFilters); const filters = useFilters(); const previousFilters = usePrevious(filters); const filterValues = Object.values(filters); const nativeFilterValues = filterValues.filter(isNativeFilter); - const dashboardId = useSelector<any, string>( + const dashboardId = useSelector<any, number>( ({ dashboardInfo }) => dashboardInfo?.id, ); + const previousDashboardId = usePrevious(dashboardId); const canEdit = useSelector<RootState, boolean>( ({ dashboardInfo }) => dashboardInfo.dash_edit_perm, ); - const [isScrolling, setIsScrolling] = useState(false); - const timeout = useRef<any>(); - const handleFilterSelectionChange = useCallback( ( filter: Pick<Filter, 'id'> & Partial<Filter>, @@ -279,7 +160,7 @@ const FilterBar: React.FC<FiltersBarProps> = ({ ); useEffect(() => { - if (previousFilters) { + if (previousFilters && dashboardId === previousDashboardId) { const updates = {}; Object.values(filters).forEach(currentFilter => { const previousFilter = previousFilters?.[currentFilter.id]; @@ -306,7 +187,11 @@ const FilterBar: React.FC<FiltersBarProps> = ({ Object.keys(updates).forEach(key => dispatch(clearDataMask(key))); } } - }, [JSON.stringify(filters), JSON.stringify(previousFilters)]); + }, [ + JSON.stringify(filters), + JSON.stringify(previousFilters), + previousDashboardId, + ]); const dataMaskAppliedText = JSON.stringify(dataMaskApplied); @@ -343,29 +228,6 @@ const FilterBar: React.FC<FiltersBarProps> = ({ }); }, [dataMaskSelected, dispatch, setDataMaskSelected]); - const openFiltersBar = useCallback( - () => toggleFiltersBar(true), - [toggleFiltersBar], - ); - - const onScroll = useCallback( - throttle(() => { - clearTimeout(timeout.current); - setIsScrolling(true); - timeout.current = setTimeout(() => { - setIsScrolling(false); - }, 300); - }, 200), - [], - ); - - useEffect(() => { - document.onscroll = onScroll; - return () => { - document.onscroll = null; - }; - }, [onScroll]); - useFilterUpdates(dataMaskSelected, setDataMaskSelected); const isApplyDisabled = checkIsApplyDisabled( dataMaskSelected, @@ -373,135 +235,46 @@ const FilterBar: React.FC<FiltersBarProps> = ({ nativeFilterValues, ); const isInitialized = useInitialization(); - const tabPaneStyle = useMemo( - () => ({ overflow: 'auto', height, overscrollBehavior: 'contain' }), - [height], - ); - - const numberOfFilters = nativeFilterValues.length; - return ( - <FilterBarScrollContext.Provider value={isScrolling}> - <BarWrapper - {...getFilterBarTestId()} - className={cx({ open: filtersOpen })} - width={width} - > - <CollapsedBar - {...getFilterBarTestId('collapsable')} - className={cx({ open: !filtersOpen })} - onClick={openFiltersBar} - offset={offset} - > - <StyledCollapseIcon - {...getFilterBarTestId('expand-button')} - iconSize="l" - /> - <StyledFilterIcon - {...getFilterBarTestId('filter-icon')} - iconSize="l" - /> - </CollapsedBar> - <Bar className={cx({ open: filtersOpen })} width={width}> - <Header toggleFiltersBar={toggleFiltersBar} /> - {!isInitialized ? ( - <div css={{ height }}> - <Loading /> - </div> - ) : isFeatureEnabled(FeatureFlag.DASHBOARD_NATIVE_FILTERS_SET) ? ( - <StyledTabs - centered - onChange={setTab as HandlerFunction} - defaultActiveKey={TabIds.AllFilters} - activeKey={editFilterSetId ? TabIds.AllFilters : undefined} - > - <AntdTabs.TabPane - tab={t('All filters (%(filterCount)d)', { - filterCount: numberOfFilters, - })} - key={TabIds.AllFilters} - css={tabPaneStyle} - > - {editFilterSetId && ( - <EditSection - dataMaskSelected={dataMaskSelected} - disabled={!isApplyDisabled} - onCancel={() => setEditFilterSetId(null)} - filterSetId={editFilterSetId} - /> - )} - {filterValues.length === 0 ? ( - <FilterBarEmptyStateContainer> - <EmptyStateSmall - title={t('No filters are currently added')} - image="filter.svg" - description={ - canEdit && - t( - 'Click the button above to add a filter to the dashboard', - ) - } - /> - </FilterBarEmptyStateContainer> - ) : ( - <FilterControls - dataMaskSelected={dataMaskSelected} - directPathToChild={directPathToChild} - onFilterSelectionChange={handleFilterSelectionChange} - /> - )} - </AntdTabs.TabPane> - <AntdTabs.TabPane - disabled={!!editFilterSetId} - tab={t('Filter sets (%(filterSetCount)d)', { - filterSetCount: filterSetFilterValues.length, - })} - key={TabIds.FilterSets} - css={tabPaneStyle} - > - <FilterSets - onEditFilterSet={setEditFilterSetId} - disabled={!isApplyDisabled} - dataMaskSelected={dataMaskSelected} - tab={tab} - onFilterSelectionChange={handleFilterSelectionChange} - /> - </AntdTabs.TabPane> - </StyledTabs> - ) : ( - <div css={tabPaneStyle} onScroll={onScroll}> - {filterValues.length === 0 ? ( - <FilterBarEmptyStateContainer> - <EmptyStateSmall - title={t('No filters are currently added')} - image="filter.svg" - description={ - canEdit && - t( - 'Click the button above to add a filter to the dashboard', - ) - } - /> - </FilterBarEmptyStateContainer> - ) : ( - <FilterControls - dataMaskSelected={dataMaskSelected} - directPathToChild={directPathToChild} - onFilterSelectionChange={handleFilterSelectionChange} - /> - )} - </div> - )} - <ActionButtons - onApply={handleApply} - onClearAll={handleClearAll} - dataMaskSelected={dataMaskSelected} - dataMaskApplied={dataMaskApplied} - isApplyDisabled={isApplyDisabled} - /> - </Bar> - </BarWrapper> - </FilterBarScrollContext.Provider> + const actions = ( + <ActionButtons + filterBarOrientation={orientation} + width={verticalConfig?.width} + onApply={handleApply} + onClearAll={handleClearAll} + dataMaskSelected={dataMaskSelected} + dataMaskApplied={dataMaskApplied} + isApplyDisabled={isApplyDisabled} + /> ); + + return orientation === FilterBarOrientation.HORIZONTAL ? ( + <Horizontal + actions={actions} + canEdit={canEdit} + dashboardId={dashboardId} + dataMaskSelected={dataMaskSelected} + focusedFilterId={focusedFilterId} + filterValues={filterValues} + isInitialized={isInitialized} + onSelectionChange={handleFilterSelectionChange} + /> + ) : verticalConfig ? ( + <Vertical + actions={actions} + canEdit={canEdit} + dataMaskSelected={dataMaskSelected} + focusedFilterId={focusedFilterId} + filtersOpen={verticalConfig.filtersOpen} + filterValues={filterValues} + isInitialized={isInitialized} + isDisabled={isApplyDisabled} + height={verticalConfig.height} + offset={verticalConfig.offset} + onSelectionChange={handleFilterSelectionChange} + toggleFiltersBar={verticalConfig.toggleFiltersBar} + width={verticalConfig.width} + /> + ) : null; }; export default React.memo(FilterBar); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/state.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/state.ts index 4e1b2eda1271..425029bb8687 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/state.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/state.ts @@ -111,7 +111,7 @@ export const useInitialization = () => { // do not load filter_box in reviewing if (filterboxMigrationState === FILTER_BOX_MIGRATION_STATES.REVIEWING) { charts = keyBy( - filter(charts, chart => chart.formData?.viz_type !== 'filter_box'), + filter(charts, chart => chart.form_data?.viz_type !== 'filter_box'), 'id', ); const numberOfFilterbox = document.querySelectorAll( diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/types.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/types.ts new file mode 100644 index 000000000000..034a639f589e --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/types.ts @@ -0,0 +1,67 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { + DataMask, + DataMaskStateWithId, + Divider, + Filter, +} from '@superset-ui/core'; +import { FilterBarOrientation } from 'src/dashboard/types'; + +interface CommonFiltersBarProps { + actions: React.ReactNode; + canEdit: boolean; + dataMaskSelected: DataMaskStateWithId; + focusedFilterId?: string; + filterValues: (Filter | Divider)[]; + isInitialized: boolean; + onSelectionChange: ( + filter: Pick<Filter, 'id'> & Partial<Filter>, + dataMask: Partial<DataMask>, + ) => void; +} + +interface VerticalBarConfig { + filtersOpen: boolean; + height: number | string; + offset: number; + toggleFiltersBar: any; + width: number; +} + +export interface FiltersBarProps + extends Pick<CommonFiltersBarProps, 'focusedFilterId'> { + orientation: FilterBarOrientation; + verticalConfig?: VerticalBarConfig; +} + +export type HorizontalBarProps = CommonFiltersBarProps & { + dashboardId: number; +}; + +export type VerticalBarProps = Omit<FiltersBarProps, 'orientation'> & + CommonFiltersBarProps & + VerticalBarConfig & { + isDisabled: boolean; + }; + +export enum TabIds { + AllFilters = 'allFilters', + FilterSets = 'filterSets', +} diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/useFilterControlFactory.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/useFilterControlFactory.tsx new file mode 100644 index 000000000000..29e539630d15 --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/useFilterControlFactory.tsx @@ -0,0 +1,87 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useCallback, useMemo } from 'react'; +import { + DataMask, + DataMaskStateWithId, + Divider, + Filter, + isFilterDivider, +} from '@superset-ui/core'; +import { FilterBarOrientation } from 'src/dashboard/types'; +import FilterControl from './FilterControls/FilterControl'; +import { useFilters } from './state'; +import FilterDivider from './FilterControls/FilterDivider'; + +export const useFilterControlFactory = ( + dataMaskSelected: DataMaskStateWithId, + focusedFilterId: string | undefined, + onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void, +) => { + const filters = useFilters(); + const filterValues = useMemo(() => Object.values(filters), [filters]); + const filtersWithValues: (Filter | Divider)[] = useMemo( + () => + filterValues.map(filter => ({ + ...filter, + dataMask: dataMaskSelected[filter.id], + })), + [filterValues, dataMaskSelected], + ); + + const filterControlFactory = useCallback( + ( + index: number, + filterBarOrientation: FilterBarOrientation, + overflow: boolean, + ) => { + const filter = filtersWithValues[index]; + if (isFilterDivider(filter)) { + return ( + <FilterDivider + title={filter.title} + description={filter.description} + orientation={filterBarOrientation} + overflow={overflow} + /> + ); + } + return ( + <FilterControl + dataMaskSelected={dataMaskSelected} + filter={filter} + focusedFilterId={focusedFilterId} + onFilterSelectionChange={onFilterSelectionChange} + inView={false} + orientation={filterBarOrientation} + overflow={overflow} + /> + ); + }, + [ + filtersWithValues, + dataMaskSelected, + focusedFilterId, + onFilterSelectionChange, + ], + ); + + return { filterControlFactory, filtersWithValues }; +}; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/utils.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/utils.ts index 842bb440542c..9aaa02fc54ea 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/utils.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/utils.ts @@ -19,11 +19,7 @@ import { areObjectsEqual } from 'src/reduxUtils'; import { DataMaskStateWithId, Filter, FilterState } from '@superset-ui/core'; - -export enum TabIds { - AllFilters = 'allFilters', - FilterSets = 'filterSets', -} +import { testWithId } from 'src/utils/testUtils'; export const getOnlyExtraFormData = (data: DataMaskStateWithId) => Object.values(data).reduce( @@ -65,3 +61,6 @@ export const checkIsApplyDisabled = ( ) ); }; + +export const FILTER_BAR_TEST_ID = 'filter-bar'; +export const getFilterBarTestId = testWithId(FILTER_BAR_TEST_ID); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/DependenciesRow.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/DependenciesRow.tsx index 18a1c257b4ba..6a846c012f6d 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/DependenciesRow.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/DependenciesRow.tsx @@ -19,8 +19,9 @@ import React, { useCallback, useMemo, useRef } from 'react'; import { useDispatch } from 'react-redux'; import { css, t, useTheme } from '@superset-ui/core'; -import { setDirectPathToChild } from 'src/dashboard/actions/dashboardState'; import Icons from 'src/components/Icons'; +import { useTruncation } from 'src/hooks/useTruncation'; +import { setFocusedNativeFilter } from 'src/dashboard/actions/nativeFilters'; import { DependencyItem, Row, @@ -30,7 +31,6 @@ import { TooltipList, } from './Styles'; import { useFilterDependencies } from './useFilterDependencies'; -import { useTruncation } from './useTruncation'; import { DependencyValueProps, FilterCardRowProps } from './types'; import { TooltipWithTruncation } from './TooltipWithTruncation'; @@ -40,7 +40,7 @@ const DependencyValue = ({ }: DependencyValueProps) => { const dispatch = useDispatch(); const handleClick = useCallback(() => { - dispatch(setDirectPathToChild([dependency.id])); + dispatch(setFocusedNativeFilter(dependency.id)); }, [dependency.id, dispatch]); return ( <span> @@ -55,7 +55,11 @@ const DependencyValue = ({ export const DependenciesRow = React.memo(({ filter }: FilterCardRowProps) => { const dependencies = useFilterDependencies(filter); const dependenciesRef = useRef<HTMLDivElement>(null); - const [elementsTruncated, hasHiddenElements] = useTruncation(dependenciesRef); + const plusRef = useRef<HTMLDivElement>(null); + const [elementsTruncated, hasHiddenElements] = useTruncation( + dependenciesRef, + plusRef, + ); const theme = useTheme(); const tooltipText = useMemo( @@ -102,13 +106,16 @@ export const DependenciesRow = React.memo(({ filter }: FilterCardRowProps) => { <RowValue ref={dependenciesRef}> {dependencies.map((dependency, index) => ( <DependencyValue + key={dependency.id} dependency={dependency} hasSeparator={index !== 0} /> ))} </RowValue> {hasHiddenElements && ( - <RowTruncationCount>+{elementsTruncated}</RowTruncationCount> + <RowTruncationCount ref={plusRef}> + +{elementsTruncated} + </RowTruncationCount> )} </TooltipWithTruncation> </Row> diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/FilterCard.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/FilterCard.test.tsx index 93f1ccfca438..560fa1faf008 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/FilterCard.test.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/FilterCard.test.tsx @@ -23,10 +23,11 @@ import { Filter, NativeFilterType } from '@superset-ui/core'; import userEvent from '@testing-library/user-event'; import { render, screen } from 'spec/helpers/testing-library'; import { DASHBOARD_ROOT_ID } from 'src/dashboard/util/constants'; -import { SET_DIRECT_PATH } from 'src/dashboard/actions/dashboardState'; +import { SET_FOCUSED_NATIVE_FILTER } from 'src/dashboard/actions/nativeFilters'; import { FilterCardContent } from './FilterCardContent'; const baseInitialState = { + dashboardInfo: {}, nativeFilters: { filters: { 'NATIVE_FILTER-1': { @@ -204,6 +205,13 @@ jest.mock('@superset-ui/core', () => ({ }), })); +jest.mock( + 'src/components/Icons/Icon', + () => + ({ fileName }: { fileName: string }) => + <span role="img" aria-label={fileName.replace('_', '-')} />, +); + // extract text from embedded html tags // source: https://polvara.me/posts/five-things-you-didnt-know-about-testing-library const getTextInHTMLTags = @@ -217,90 +225,115 @@ const getTextInHTMLTags = return nodeHasText && childrenDontHaveText; }; +const hidePopover = jest.fn(); + const renderContent = (filter = baseFilter, initialState = baseInitialState) => - render(<FilterCardContent filter={filter} />, { + render(<FilterCardContent filter={filter} hidePopover={hidePopover} />, { useRedux: true, initialState, }); -describe('Filter Card', () => { - it('Basic', () => { - renderContent(); - expect(screen.getByText('Native filter 1')).toBeVisible(); - expect(screen.getByLabelText('filter-small')).toBeVisible(); +test('filter card title, type, scope, dependencies', () => { + renderContent(); + expect(screen.getByText('Native filter 1')).toBeVisible(); + expect(screen.getByLabelText('filter-small')).toBeVisible(); - expect(screen.getByText('Filter type')).toBeVisible(); - expect(screen.getByText('Select filter')).toBeVisible(); + expect(screen.getByText('Filter type')).toBeVisible(); + expect(screen.getByText('Select filter')).toBeVisible(); - expect(screen.getByText('Scope')).toBeVisible(); - expect(screen.getByText('All charts')).toBeVisible(); + expect(screen.getByText('Scope')).toBeVisible(); + expect(screen.getByText('All charts')).toBeVisible(); - expect(screen.queryByText('Dependencies')).not.toBeInTheDocument(); - }); + expect(screen.queryByText('Dependencies')).not.toBeInTheDocument(); +}); + +test('filter card scope with excluded', () => { + const filter = { + ...baseFilter, + scope: { rootPath: [DASHBOARD_ROOT_ID], excluded: [1, 4] }, + }; + renderContent(filter); + expect(screen.getByText('Scope')).toBeVisible(); + expect( + screen.getByText(getTextInHTMLTags('Test chart 2, Test chart 3')), + ).toBeVisible(); +}); + +test('filter card scope with top level tab as root', () => { + const filter = { + ...baseFilter, + scope: { rootPath: ['TAB-1', 'TAB-2'], excluded: [1, 2] }, + }; + renderContent(filter); + expect(screen.getByText('Scope')).toBeVisible(); + expect( + screen.getByText(getTextInHTMLTags('Tab 2, Test chart 3')), + ).toBeVisible(); +}); + +test('filter card empty scope', () => { + const filter = { + ...baseFilter, + scope: { rootPath: [], excluded: [1, 2, 3, 4] }, + }; + renderContent(filter); + expect(screen.getByText('Scope')).toBeVisible(); + expect(screen.getByText('None')).toBeVisible(); +}); + +test('filter card with dependency', () => { + const filter = { + ...baseFilter, + cascadeParentIds: ['NATIVE_FILTER-2'], + }; + renderContent(filter); + expect(screen.getByText('Dependent on')).toBeVisible(); + expect(screen.getByText('Native filter 2')).toBeVisible(); +}); - describe('Scope', () => { - it('Scope with excluded', () => { - const filter = { - ...baseFilter, - scope: { rootPath: [DASHBOARD_ROOT_ID], excluded: [1, 4] }, - }; - renderContent(filter); - expect(screen.getByText('Scope')).toBeVisible(); - expect( - screen.getByText(getTextInHTMLTags('Test chart 2, Test chart 3')), - ).toBeVisible(); - }); +test('focus filter on filter card dependency click', () => { + const useDispatchMock = jest.spyOn(reactRedux, 'useDispatch'); + const dummyDispatch = jest.fn(); + useDispatchMock.mockReturnValue(dummyDispatch); - it('Scope with top level tab as root', () => { - const filter = { - ...baseFilter, - scope: { rootPath: ['TAB-1', 'TAB-2'], excluded: [1, 2] }, - }; - renderContent(filter); - expect(screen.getByText('Scope')).toBeVisible(); - expect( - screen.getByText(getTextInHTMLTags('Tab 2, Test chart 3')), - ).toBeVisible(); - }); + const filter = { + ...baseFilter, + cascadeParentIds: ['NATIVE_FILTER-2'], + }; + renderContent(filter); - it('Empty scope', () => { - const filter = { - ...baseFilter, - scope: { rootPath: [], excluded: [1, 2, 3, 4] }, - }; - renderContent(filter); - expect(screen.getByText('Scope')).toBeVisible(); - expect(screen.getByText('None')).toBeVisible(); - }); + userEvent.click(screen.getByText('Native filter 2')); + expect(dummyDispatch).toHaveBeenCalledWith({ + type: SET_FOCUSED_NATIVE_FILTER, + id: 'NATIVE_FILTER-2', }); +}); - describe('Dependencies', () => { - it('Has dependency', () => { - const filter = { - ...baseFilter, - cascadeParentIds: ['NATIVE_FILTER-2'], - }; - renderContent(filter); - expect(screen.getByText('Dependent on')).toBeVisible(); - expect(screen.getByText('Native filter 2')).toBeVisible(); - }); +test('edit filter button for dashboard viewer', () => { + renderContent(); + expect( + screen.queryByRole('button', { name: /edit/i }), + ).not.toBeInTheDocument(); +}); - it('Focus filter on dependency click', () => { - const useDispatchMock = jest.spyOn(reactRedux, 'useDispatch'); - const dummyDispatch = jest.fn(); - useDispatchMock.mockReturnValue(dummyDispatch); +test('edit filter button for dashboard editor', () => { + renderContent(baseFilter, { + ...baseInitialState, + dashboardInfo: { dash_edit_perm: true }, + }); - const filter = { - ...baseFilter, - cascadeParentIds: ['NATIVE_FILTER-2'], - }; - renderContent(filter); + expect(screen.getByRole('button', { name: /edit/i })).toBeVisible(); +}); - userEvent.click(screen.getByText('Native filter 2')); - expect(dummyDispatch).toHaveBeenCalledWith({ - type: SET_DIRECT_PATH, - path: ['NATIVE_FILTER-2'], - }); - }); +test('open modal on edit filter button click', async () => { + renderContent(baseFilter, { + ...baseInitialState, + dashboardInfo: { dash_edit_perm: true }, }); + + const editButton = screen.getByRole('button', { name: /edit/i }); + userEvent.click(editButton); + expect( + await screen.findByRole('dialog', { name: /add and edit filters/i }), + ).toBeVisible(); }); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/FilterCardContent.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/FilterCardContent.tsx index 41696ed98f88..02b0d875a9dc 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/FilterCardContent.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/FilterCardContent.tsx @@ -24,9 +24,17 @@ import { DependenciesRow } from './DependenciesRow'; import { NameRow } from './NameRow'; import { TypeRow } from './TypeRow'; -export const FilterCardContent = ({ filter }: { filter: Filter }) => ( +interface FilterCardContentProps { + filter: Filter; + hidePopover: () => void; +} + +export const FilterCardContent = ({ + filter, + hidePopover, +}: FilterCardContentProps) => ( <div> - <NameRow filter={filter} /> + <NameRow filter={filter} hidePopover={hidePopover} /> <TypeRow filter={filter} /> <ScopeRow filter={filter} /> <DependenciesRow filter={filter} /> diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/NameRow.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/NameRow.tsx index 05cb8119487c..6c7e82b15ddb 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/NameRow.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/NameRow.tsx @@ -17,34 +17,61 @@ * under the License. */ import React, { useRef } from 'react'; -import { css, SupersetTheme } from '@superset-ui/core'; +import { useSelector } from 'react-redux'; +import { css, SupersetTheme, useTheme } from '@superset-ui/core'; import Icons from 'src/components/Icons'; -import { Row, FilterName } from './Styles'; +import { useTruncation } from 'src/hooks/useTruncation'; +import { RootState } from 'src/dashboard/types'; +import { Row, FilterName, InternalRow } from './Styles'; import { FilterCardRowProps } from './types'; -import { useTruncation } from './useTruncation'; +import { FilterConfigurationLink } from '../FilterBar/FilterConfigurationLink'; import { TooltipWithTruncation } from './TooltipWithTruncation'; -export const NameRow = ({ filter }: FilterCardRowProps) => { +export const NameRow = ({ + filter, + hidePopover, +}: FilterCardRowProps & { hidePopover: () => void }) => { + const theme = useTheme(); const filterNameRef = useRef<HTMLElement>(null); const [elementsTruncated] = useTruncation(filterNameRef); + const dashboardId = useSelector<RootState, number>( + ({ dashboardInfo }) => dashboardInfo.id, + ); + + const canEdit = useSelector<RootState, boolean>( + ({ dashboardInfo }) => dashboardInfo.dash_edit_perm, + ); + return ( <Row css={(theme: SupersetTheme) => css` margin-bottom: ${theme.gridUnit * 3}px; + justify-content: space-between; ` } > - <Icons.FilterSmall - css={(theme: SupersetTheme) => - css` - margin-right: ${theme.gridUnit}px; - ` - } - /> - <TooltipWithTruncation title={elementsTruncated ? filter.name : null}> - <FilterName ref={filterNameRef}>{filter.name}</FilterName> - </TooltipWithTruncation> + <InternalRow> + <Icons.FilterSmall + css={(theme: SupersetTheme) => + css` + margin-right: ${theme.gridUnit}px; + ` + } + /> + <TooltipWithTruncation title={elementsTruncated ? filter.name : null}> + <FilterName ref={filterNameRef}>{filter.name}</FilterName> + </TooltipWithTruncation> + </InternalRow> + {canEdit && ( + <FilterConfigurationLink + dashboardId={dashboardId} + onClick={hidePopover} + initialFilterId={filter.id} + > + <Icons.Edit iconSize="l" iconColor={theme.colors.grayscale.light1} /> + </FilterConfigurationLink> + )} </Row> ); }; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx index 66656f0ba514..0c0704089119 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx @@ -18,6 +18,7 @@ */ import React, { useMemo, useRef } from 'react'; import { t } from '@superset-ui/core'; +import { useTruncation } from 'src/hooks/useTruncation'; import { useFilterScope } from './useFilterScope'; import { Row, @@ -27,7 +28,6 @@ import { TooltipList, TooltipSectionLabel, } from './Styles'; -import { useTruncation } from './useTruncation'; import { FilterCardRowProps } from './types'; import { TooltipWithTruncation } from './TooltipWithTruncation'; @@ -46,8 +46,12 @@ const getTooltipSection = (items: string[] | undefined, label: string) => export const ScopeRow = React.memo(({ filter }: FilterCardRowProps) => { const scope = useFilterScope(filter); const scopeRef = useRef<HTMLDivElement>(null); + const plusRef = useRef<HTMLDivElement>(null); - const [elementsTruncated, hasHiddenElements] = useTruncation(scopeRef); + const [elementsTruncated, hasHiddenElements] = useTruncation( + scopeRef, + plusRef, + ); const tooltipText = useMemo(() => { if (elementsTruncated === 0 || !scope) { return null; @@ -72,12 +76,16 @@ export const ScopeRow = React.memo(({ filter }: FilterCardRowProps) => { ? Object.values(scope) .flat() .map((element, index) => ( - <span>{index === 0 ? element : `, ${element}`}</span> + <span key={element}> + {index === 0 ? element : `, ${element}`} + </span> )) : t('None')} </RowValue> {hasHiddenElements > 0 && ( - <RowTruncationCount>+{elementsTruncated}</RowTruncationCount> + <RowTruncationCount ref={plusRef}> + +{elementsTruncated} + </RowTruncationCount> )} </TooltipWithTruncation> </Row> diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/Styles.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/Styles.ts index bda865063d75..8090201f1c3c 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/Styles.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/Styles.ts @@ -92,3 +92,8 @@ export const TooltipTrigger = styled.div` display: inline-flex; white-space: nowrap; `; + +export const InternalRow = styled.div` + display: flex; + align-items: center; +`; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/index.tsx index bc1f7b2ea371..bdbfcff8aebf 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/index.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/index.tsx @@ -27,9 +27,14 @@ export const FilterCard = ({ filter, getPopupContainer, isVisible: externalIsVisible = true, + placement, }: FilterCardProps) => { const [internalIsVisible, setInternalIsVisible] = useState(false); + const hidePopover = () => { + setInternalIsVisible(false); + }; + useEffect(() => { if (!externalIsVisible) { setInternalIsVisible(false); @@ -37,7 +42,7 @@ export const FilterCard = ({ }, [externalIsVisible]); return ( <Popover - placement="right" + placement={placement} overlayClassName="filter-card-popover" mouseEnterDelay={0.2} mouseLeaveDelay={0.2} @@ -45,9 +50,8 @@ export const FilterCard = ({ setInternalIsVisible(externalIsVisible && visible); }} visible={externalIsVisible && internalIsVisible} - content={<FilterCardContent filter={filter} />} + content={<FilterCardContent filter={filter} hidePopover={hidePopover} />} getPopupContainer={getPopupContainer ?? (() => document.body)} - destroyTooltipOnHide > {children} </Popover> diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/types.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/types.ts index 6e65a4eecc63..10af257b2661 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/types.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/types.ts @@ -19,11 +19,18 @@ import { ReactNode } from 'react'; import { Filter } from '@superset-ui/core'; +export enum FilterCardPlacement { + Right = 'right', + Bottom = 'bottom', + Left = 'left', +} + export interface FilterCardProps { children: ReactNode; filter: Filter; getPopupContainer?: (node: HTMLElement) => HTMLElement; isVisible?: boolean; + placement: FilterCardPlacement; } export interface FilterCardRowProps { diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/useFilterScope.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/useFilterScope.ts index 12a578c35a14..35c84a8591d1 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/useFilterScope.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/useFilterScope.ts @@ -62,10 +62,9 @@ export const useFilterScope = (filter: Filter) => { if ( filter.scope.excluded.length === 0 && (filter.scope.rootPath[0] === DASHBOARD_ROOT_ID || - (topLevelTabs && - topLevelTabs.every(topLevelTab => - filter.scope.rootPath.includes(topLevelTab), - ))) + topLevelTabs?.every(topLevelTab => + filter.scope.rootPath.includes(topLevelTab), + )) ) { return { all: [t('All charts')] }; } diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterConfigPane.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterConfigPane.test.tsx index 3742d536326f..223d5a35d00d 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterConfigPane.test.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterConfigPane.test.tsx @@ -26,7 +26,6 @@ const scrollMock = jest.fn(); Element.prototype.scroll = scrollMock; const defaultProps = { - children: jest.fn(), getFilterTitle: (id: string) => id, onChange: jest.fn(), onAdd: jest.fn(), @@ -63,13 +62,6 @@ beforeEach(() => { scrollMock.mockClear(); }); -test('renders form', async () => { - await act(async () => { - defaultRender(); - }); - expect(defaultProps.children).toHaveBeenCalledTimes(3); -}); - test('drag and drop', async () => { defaultRender(); // Drag the state and country filter above the product filter diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterConfigurePane.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterConfigurePane.tsx index dba7e6bb3025..b582b240977d 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterConfigurePane.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterConfigurePane.tsx @@ -22,7 +22,7 @@ import FilterTitlePane from './FilterTitlePane'; import { FilterRemoval } from './types'; interface Props { - children: (filterId: string) => React.ReactNode; + children?: React.ReactNode; getFilterTitle: (filterId: string) => string; onChange: (activeKey: string) => void; onAdd: (type: NativeFilterType) => void; @@ -46,7 +46,7 @@ const ContentHolder = styled.div` `; const TitlesContainer = styled.div` - width: 270px; + min-width: 270px; border-right: 1px solid ${({ theme }) => theme.colors.grayscale.light2}; `; @@ -62,40 +62,24 @@ const FilterConfigurePane: React.FC<Props> = ({ currentFilterId, filters, removedFilters, -}) => { - const active = filters.filter(id => id === currentFilterId)[0]; - return ( - <Container> - <TitlesContainer> - <FilterTitlePane - currentFilterId={currentFilterId} - filters={filters} - removedFilters={removedFilters} - erroredFilters={erroredFilters} - getFilterTitle={getFilterTitle} - onChange={onChange} - onAdd={(type: NativeFilterType) => onAdd(type)} - onRearrange={onRearrange} - onRemove={(id: string) => onRemove(id)} - restoreFilter={restoreFilter} - /> - </TitlesContainer> - <ContentHolder> - {filters.map(id => ( - <div - key={id} - style={{ - height: '100%', - overflowY: 'auto', - display: id === active ? '' : 'none', - }} - > - {children(id)} - </div> - ))} - </ContentHolder> - </Container> - ); -}; +}) => ( + <Container> + <TitlesContainer> + <FilterTitlePane + currentFilterId={currentFilterId} + filters={filters} + removedFilters={removedFilters} + erroredFilters={erroredFilters} + getFilterTitle={getFilterTitle} + onChange={onChange} + onAdd={(type: NativeFilterType) => onAdd(type)} + onRearrange={onRearrange} + onRemove={(id: string) => onRemove(id)} + restoreFilter={restoreFilter} + /> + </TitlesContainer> + <ContentHolder>{children}</ContentHolder> + </Container> +); export default FilterConfigurePane; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitlePane.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitlePane.tsx index 79dc4148349a..a080d3564513 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitlePane.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitlePane.tsx @@ -53,8 +53,8 @@ const TabsContainer = styled.div` `; const options = [ - { label: 'Filter', type: NativeFilterType.NATIVE_FILTER }, - { label: 'Divider', type: NativeFilterType.DIVIDER }, + { label: t('Filter'), type: NativeFilterType.NATIVE_FILTER }, + { label: t('Divider'), type: NativeFilterType.DIVIDER }, ]; const FilterTitlePane: React.FC<Props> = ({ diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx index 8ecb75777f3b..fa0b4fbea09b 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx @@ -19,7 +19,7 @@ import React, { useCallback, useMemo } from 'react'; import rison from 'rison'; import { t, SupersetClient } from '@superset-ui/core'; -import { Select } from 'src/components'; +import { AsyncSelect } from 'src/components'; import { cacheWrapper } from 'src/utils/cacheWrapper'; import { ClientErrorObject, @@ -85,11 +85,12 @@ const DatasetSelect = ({ onChange, value }: DatasetSelectProps) => { }; return ( - <Select + <AsyncSelect ariaLabel={t('Dataset')} value={value} options={loadDatasetOptions} onChange={onChange} + notFoundContent={t('No compatible datasets found')} /> ); }; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx index 07f785484d52..e4ae521764fc 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx @@ -51,7 +51,7 @@ const DefaultValue: FC<DefaultValueProps> = ({ const formFilter = (form.getFieldValue('filters') || {})[filterId]; const queriesData = formFilter?.defaultValueQueriesData; const loading = hasDataset && queriesData === null; - const value = formFilter.defaultDataMask?.filterState?.value; + const value = formFilter?.defaultDataMask?.filterState?.value; const isMissingRequiredValue = hasDefaultValue && (value === null || value === undefined); return loading ? ( @@ -71,7 +71,7 @@ const DefaultValue: FC<DefaultValueProps> = ({ hooks={{ setDataMask }} enableNoResults={enableNoResults} filterState={{ - ...formFilter.defaultDataMask?.filterState, + ...formFilter?.defaultDataMask?.filterState, validateMessage: isMissingRequiredValue && t('Value is required'), validateStatus: isMissingRequiredValue && 'error', }} diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.test.ts b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.test.ts new file mode 100644 index 000000000000..9172b1dba58b --- /dev/null +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.test.ts @@ -0,0 +1,18204 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { Layout } from 'src/dashboard/types'; +import { buildTree } from './utils'; + +// The types defined for Layout and sub elements is not compatible with the data we get back fro a real dashboard layout +// This test file is using data from a real example dashboard to test real world data sets. ts-ignore is set for this entire file +// until we can reconcile adjusting types to match the actual data structures used + +describe('Ensure buildTree does not throw runtime errors when encountering an invalid node', () => { + const node = { + children: ['TABS-97PVJa11D_'], + id: 'ROOT_ID', + type: 'ROOT', + parents: [], + }; + + const treeItem = { + children: [], + key: 'ROOT_ID', + type: 'ROOT', + title: 'All panels', + }; + + const layout: Layout = { + 'CHART-1L7NIcXvVN': { + children: [], + id: 'CHART-1L7NIcXvVN', + meta: { + chartId: 95, + height: 79, + sliceName: 'Games per Genre over time', + uuid: '0f8976aa-7bb4-40c7-860b-64445a51aaaf', + width: 6, + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_', 'TAB-2_QXp8aNq', 'ROW-fjg6YQBkH'], + type: 'CHART', + }, + 'CHART-7mKdnU7OUJ': { + children: [], + id: 'CHART-7mKdnU7OUJ', + meta: { + chartId: 131, + height: 80, + sliceName: 'Games per Genre', + uuid: '0499bdec-0837-44f3-ae8a-8c670de81afd', + width: 3, + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_', 'TAB-2_QXp8aNq', 'ROW-yP9SB89PZ'], + type: 'CHART', + }, + 'CHART-8OG3UJX-Tn': { + children: [], + id: 'CHART-8OG3UJX-Tn', + meta: { + chartId: 125, + height: 54, + sliceName: '# of Games That Hit 100k in Sales By Release Year', + sliceNameOverride: 'Top 10 Consoles, by # of Hit Games', + uuid: '2b69887b-23e3-b46d-d38c-8ea11856c555', + width: 6, + }, + parents: [ + 'ROOT_ID', + 'TABS-97PVJa11D_', + 'TAB-lg-5ymUDgm', + 'ROW-7kAf1blYU', + ], + type: 'CHART', + }, + 'CHART-W02beJK7ms': { + children: [], + id: 'CHART-W02beJK7ms', + meta: { + chartId: 78, + height: 54, + sliceName: 'Publishers With Most Titles', + sliceNameOverride: 'Top 10 Games (by Global Sales)', + uuid: 'd20b7324-3b80-24d4-37e2-3bd583b66713', + width: 3, + }, + parents: [ + 'ROOT_ID', + 'TABS-97PVJa11D_', + 'TAB-lg-5ymUDgm', + 'ROW-7kAf1blYU', + ], + type: 'CHART', + }, + 'CHART-XFag0yZdLk': { + children: [], + id: 'CHART-XFag0yZdLk', + meta: { + chartId: 123, + height: 54, + sliceName: 'Most Dominant Platforms', + sliceNameOverride: 'Publishers of Top 25 Games', + uuid: '1810975a-f6d4-07c3-495c-c3b535d01f21', + width: 3, + }, + parents: [ + 'ROOT_ID', + 'TABS-97PVJa11D_', + 'TAB-lg-5ymUDgm', + 'ROW-7kAf1blYU', + ], + type: 'CHART', + }, + 'CHART-XRvRfsMsaQ': { + children: [], + id: 'CHART-XRvRfsMsaQ', + meta: { + chartId: 113, + height: 62, + sliceName: 'Top 10 Games: Proportion of Sales in Markets', + uuid: 'a40879d5-653a-42fe-9314-bbe88ad26e92', + width: 6, + }, + parents: [ + 'ROOT_ID', + 'TABS-97PVJa11D_', + 'TAB-lg-5ymUDgm', + 'ROW-NuR8GFQTO', + ], + type: 'CHART', + }, + 'CHART-XVIYTeubZh': { + children: [], + id: 'CHART-XVIYTeubZh', + meta: { + chartId: 132, + height: 80, + sliceName: 'Games', + uuid: '2a5e562b-ab37-1b9b-1de3-1be4335c8e83', + width: 5, + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_', 'TAB-2_QXp8aNq', 'ROW-yP9SB89PZ'], + type: 'CHART', + }, + 'CHART-_sx22yawJO': { + children: [], + id: 'CHART-_sx22yawJO', + meta: { + chartId: 93, + height: 62, + sliceName: 'Popular Genres Across Platforms', + uuid: '326fc7e5-b7f1-448e-8a6f-80d0e7ce0b64', + width: 6, + }, + parents: [ + 'ROOT_ID', + 'TABS-97PVJa11D_', + 'TAB-lg-5ymUDgm', + 'ROW-NuR8GFQTO', + ], + type: 'CHART', + }, + 'CHART-nYns6xr4Ft': { + children: [], + id: 'CHART-nYns6xr4Ft', + meta: { + chartId: 120, + height: 79, + sliceName: 'Total Sales per Market (Grouped by Genre)', + uuid: 'd8bf948e-46fd-4380-9f9c-a950c34bcc92', + width: 6, + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_', 'TAB-2_QXp8aNq', 'ROW-fjg6YQBkH'], + type: 'CHART', + }, + 'CHART-uP9GF0z0rT': { + children: [], + id: 'CHART-uP9GF0z0rT', + meta: { + chartId: 127, + height: 45, + sliceName: 'Video Game Sales filter', + uuid: 'fd9ce7ec-ae08-4f71-93e0-7c26b132b2e6', + width: 4, + }, + parents: [ + 'ROOT_ID', + 'TABS-97PVJa11D_', + 'TAB-2_QXp8aNq', + 'ROW-yP9SB89PZ', + 'COLUMN-F53B1OSMcz', + ], + type: 'CHART', + }, + 'CHART-wt6ZO8jRXZ': { + children: [], + id: 'CHART-wt6ZO8jRXZ', + meta: { + chartId: 103, + height: 72, + sliceName: 'Rise & Fall of Video Game Consoles', + sliceNameOverride: 'Global Sales per Console', + uuid: '83b0e2d0-d38b-d980-ed8e-e1c9846361b6', + width: 12, + }, + parents: [ + 'ROOT_ID', + 'TABS-97PVJa11D_', + 'TAB-lg-5ymUDgm', + 'ROW-XT1DsNA_V', + ], + type: 'CHART', + }, + 'COLUMN-F53B1OSMcz': { + children: ['MARKDOWN-7K5cBNy7qu', 'CHART-uP9GF0z0rT'], + id: 'COLUMN-F53B1OSMcz', + meta: { + // @ts-expect-error + background: 'BACKGROUND_TRANSPARENT', + width: 4, + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_', 'TAB-2_QXp8aNq', 'ROW-yP9SB89PZ'], + type: 'COLUMN', + }, + // @ts-expect-error + DASHBOARD_VERSION_KEY: 'v2', + // @ts-expect-error + GRID_ID: { + children: [], + id: 'GRID_ID', + parents: ['ROOT_ID'], + type: 'GRID', + }, + HEADER_ID: { + id: 'HEADER_ID', + type: 'HEADER', + // @ts-expect-error + meta: { + text: 'Video Game Sales', + }, + }, + 'MARKDOWN-7K5cBNy7qu': { + children: [], + id: 'MARKDOWN-7K5cBNy7qu', + meta: { + // @ts-expect-error + code: '# 🤿 Explore Trends\n\nDive into data on popular video games using the following dimensions:\n\n- Year\n- Platform\n- Publisher\n- Genre\n\nTo use the **Filter Games** box below, select values for each dimension you want to zoom in on and then click **Apply**. \n\nThe filter criteria you set in this Filter-box will apply to *all* charts in this tab.', + height: 33, + width: 4, + }, + parents: [ + 'ROOT_ID', + 'TABS-97PVJa11D_', + 'TAB-2_QXp8aNq', + 'ROW-yP9SB89PZ', + 'COLUMN-F53B1OSMcz', + ], + type: 'MARKDOWN', + }, + 'MARKDOWN-JOZKOjVc3a': { + children: [], + id: 'MARKDOWN-JOZKOjVc3a', + meta: { + // @ts-expect-error + code: '## 🎮Video Game Sales\n\nThis dashboard visualizes sales & platform data on video games that sold more than 100k copies. The data was last updated in early 2017.\n\n[Original dataset](https://www.kaggle.com/gregorut/videogamesales)', + height: 18, + width: 12, + }, + parents: [ + 'ROOT_ID', + 'TABS-97PVJa11D_', + 'TAB-lg-5ymUDgm', + 'ROW-0F99WDC-sz', + ], + type: 'MARKDOWN', + }, + // @ts-expect-error + ROOT_ID: { + children: ['TABS-97PVJa11D_'], + id: 'ROOT_ID', + type: 'ROOT', + }, + 'ROW-0F99WDC-sz': { + children: ['MARKDOWN-JOZKOjVc3a'], + id: 'ROW-0F99WDC-sz', + meta: { + // @ts-expect-error + background: 'BACKGROUND_TRANSPARENT', + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_', 'TAB-lg-5ymUDgm'], + type: 'ROW', + }, + 'ROW-7kAf1blYU': { + children: ['CHART-W02beJK7ms', 'CHART-XFag0yZdLk', 'CHART-8OG3UJX-Tn'], + id: 'ROW-7kAf1blYU', + meta: { + // @ts-expect-error + '0': 'ROOT_ID', + background: 'BACKGROUND_TRANSPARENT', + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_', 'TAB-lg-5ymUDgm'], + type: 'ROW', + }, + 'ROW-NuR8GFQTO': { + children: ['CHART-_sx22yawJO', 'CHART-XRvRfsMsaQ'], + id: 'ROW-NuR8GFQTO', + meta: { + // @ts-expect-error + '0': 'ROOT_ID', + '1': 'TABS-97PVJa11D_', + background: 'BACKGROUND_TRANSPARENT', + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_', 'TAB-lg-5ymUDgm'], + type: 'ROW', + }, + 'ROW-XT1DsNA_V': { + children: ['CHART-wt6ZO8jRXZ'], + id: 'ROW-XT1DsNA_V', + meta: { + // @ts-expect-error + background: 'BACKGROUND_TRANSPARENT', + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_', 'TAB-lg-5ymUDgm'], + type: 'ROW', + }, + 'ROW-fjg6YQBkH': { + children: ['CHART-1L7NIcXvVN', 'CHART-nYns6xr4Ft'], + id: 'ROW-fjg6YQBkH', + meta: { + // @ts-expect-error + background: 'BACKGROUND_TRANSPARENT', + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_', 'TAB-2_QXp8aNq'], + type: 'ROW', + }, + 'ROW-yP9SB89PZ': { + children: ['COLUMN-F53B1OSMcz', 'CHART-XVIYTeubZh', 'CHART-7mKdnU7OUJ'], + id: 'ROW-yP9SB89PZ', + meta: { + // @ts-expect-error + background: 'BACKGROUND_TRANSPARENT', + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_', 'TAB-2_QXp8aNq'], + type: 'ROW', + }, + 'TAB-2_QXp8aNq': { + children: ['ROW-yP9SB89PZ', 'ROW-fjg6YQBkH'], + id: 'TAB-2_QXp8aNq', + // @ts-expect-error + meta: { + text: '🤿 Explore Trends', + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_'], + type: 'TAB', + }, + 'TAB-lg-5ymUDgm': { + children: [ + 'ROW-0F99WDC-sz', + 'ROW-XT1DsNA_V', + 'ROW-7kAf1blYU', + 'ROW-NuR8GFQTO', + ], + id: 'TAB-lg-5ymUDgm', + // @ts-expect-error + meta: { + text: 'Overview', + }, + parents: ['ROOT_ID', 'TABS-97PVJa11D_'], + type: 'TAB', + }, + 'TABS-97PVJa11D_': { + children: ['TAB-lg-5ymUDgm', 'TAB-2_QXp8aNq'], + id: 'TABS-97PVJa11D_', + // @ts-expect-error + meta: {}, + parents: ['ROOT_ID'], + type: 'TABS', + }, + }; + + const charts = { + '78': { + id: 78, + chartAlert: null, + chartStatus: 'rendered', + chartStackTrace: null, + chartUpdateEndTime: 1673046999783, + chartUpdateStartTime: 1673046994590, + latestQueryFormData: { + datasource: '20__table', + viz_type: 'table', + slice_id: 78, + url_params: {}, + granularity_sqla: 'year', + time_grain_sqla: 'P1D', + time_range: 'No filter', + query_mode: 'raw', + groupby: [], + metrics: ['count'], + all_columns: [ + 'rank', + 'name', + 'global_sales', + 'platform', + 'genre', + 'publisher', + 'year', + ], + percent_metrics: [], + adhoc_filters: [], + order_by_cols: [], + row_limit: 10, + server_page_length: 10, + order_desc: true, + table_timestamp_format: 'smart_date', + page_length: null, + show_cell_bars: false, + color_pn: false, + queryFields: { + groupby: 'groupby', + metrics: 'metrics', + }, + label_colors: { + '0': '#1FA8C9', + '1': '#454E7C', + '2600': '#666666', + Europe: '#5AC189', + Japan: '#FF7F44', + 'North America': '#666666', + Other: '#E04355', + PS2: '#FCC700', + X360: '#A868B7', + PS3: '#3CCCCB', + Wii: '#A38F79', + DS: '#8FD3E4', + PS: '#A1A6BD', + GBA: '#ACE1C4', + PSP: '#FEC0A1', + PS4: '#B2B2B2', + PC: '#EFA1AA', + GB: '#FDE380', + XB: '#D3B3DA', + NES: '#9EE5E5', + '3DS': '#D1C6BC', + N64: '#1FA8C9', + SNES: '#454E7C', + GC: '#5AC189', + XOne: '#FF7F44', + WiiU: '#E04355', + PSV: '#FCC700', + SAT: '#A868B7', + GEN: '#3CCCCB', + DC: '#A38F79', + SCD: '#8FD3E4', + NG: '#A1A6BD', + WS: '#ACE1C4', + TG16: '#FEC0A1', + '3DO': '#B2B2B2', + GG: '#EFA1AA', + PCFX: '#FDE380', + Nintendo: '#D3B3DA', + 'Take-Two Interactive': '#9EE5E5', + 'Microsoft Game Studios': '#D1C6BC', + Action: '#1FA8C9', + Adventure: '#454E7C', + Fighting: '#5AC189', + Misc: '#FF7F44', + Platform: '#666666', + Puzzle: '#E04355', + Racing: '#FCC700', + 'Role-Playing': '#A868B7', + Shooter: '#3CCCCB', + Simulation: '#A38F79', + Sports: '#8FD3E4', + Strategy: '#A1A6BD', + }, + shared_label_colors: {}, + color_scheme: 'supersetColors', + extra_filters: [ + { + col: '__time_range', + op: '==', + val: 'No filter', + }, + ], + extra_form_data: {}, + dashboardId: 9, + }, + sliceFormData: null, + queryController: {}, + queriesResponse: [ + { + cache_key: '83862e7cb770044d4b5a4b2d8e665022', + cached_dttm: null, + cache_timeout: 86400, + applied_template_filters: [], + annotation_data: {}, + error: null, + is_cached: null, + query: + 'SELECT rank AS rank,\n name AS name,\n global_sales AS global_sales,\n platform AS platform,\n genre AS genre,\n publisher AS publisher,\n year AS year\nFROM main.video_game_sales\nLIMIT 10\nOFFSET 0;\n\n', + status: 'success', + stacktrace: null, + rowcount: 10, + from_dttm: null, + to_dttm: null, + label_map: { + rank: ['rank'], + name: ['name'], + global_sales: ['global_sales'], + platform: ['platform'], + genre: ['genre'], + publisher: ['publisher'], + year: ['year'], + }, + colnames: [ + 'rank', + 'name', + 'global_sales', + 'platform', + 'genre', + 'publisher', + 'year', + ], + indexnames: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + coltypes: [0, 1, 0, 1, 1, 1, 2], + data: [ + { + rank: 1, + name: 'Wii Sports', + global_sales: 82.74, + platform: 'Wii', + genre: 'Sports', + publisher: 'Nintendo', + year: 1136073600000, + }, + { + rank: 2, + name: 'Super Mario Bros.', + global_sales: 40.24, + platform: 'NES', + genre: 'Platform', + publisher: 'Nintendo', + year: 473385600000, + }, + { + rank: 3, + name: 'Mario Kart Wii', + global_sales: 35.82, + platform: 'Wii', + genre: 'Racing', + publisher: 'Nintendo', + year: 1199145600000, + }, + { + rank: 4, + name: 'Wii Sports Resort', + global_sales: 33, + platform: 'Wii', + genre: 'Sports', + publisher: 'Nintendo', + year: 1230768000000, + }, + { + rank: 5, + name: 'Pokemon Red/Pokemon Blue', + global_sales: 31.37, + platform: 'GB', + genre: 'Role-Playing', + publisher: 'Nintendo', + year: 820454400000, + }, + { + rank: 6, + name: 'Tetris', + global_sales: 30.26, + platform: 'GB', + genre: 'Puzzle', + publisher: 'Nintendo', + year: 599616000000, + }, + { + rank: 7, + name: 'New Super Mario Bros.', + global_sales: 30.01, + platform: 'DS', + genre: 'Platform', + publisher: 'Nintendo', + year: 1136073600000, + }, + { + rank: 8, + name: 'Wii Play', + global_sales: 29.02, + platform: 'Wii', + genre: 'Misc', + publisher: 'Nintendo', + year: 1136073600000, + }, + { + rank: 9, + name: 'New Super Mario Bros. Wii', + global_sales: 28.62, + platform: 'Wii', + genre: 'Platform', + publisher: 'Nintendo', + year: 1230768000000, + }, + { + rank: 10, + name: 'Duck Hunt', + global_sales: 28.31, + platform: 'NES', + genre: 'Shooter', + publisher: 'Nintendo', + year: 441763200000, + }, + ], + result_format: 'json', + applied_filters: [ + { + column: '__time_range', + }, + ], + rejected_filters: [], + }, + ], + triggerQuery: false, + lastRendered: 0, + form_data: { + datasource: '20__table', + viz_type: 'table', + slice_id: 78, + url_params: {}, + granularity_sqla: 'year', + time_grain_sqla: 'P1D', + time_range: 'No filter', + query_mode: 'raw', + groupby: [], + metrics: ['count'], + all_columns: [ + 'rank', + 'name', + 'global_sales', + 'platform', + 'genre', + 'publisher', + 'year', + ], + percent_metrics: [], + adhoc_filters: [], + order_by_cols: [], + row_limit: 10, + server_page_length: 10, + order_desc: true, + table_timestamp_format: 'smart_date', + page_length: null, + show_cell_bars: false, + color_pn: false, + queryFields: { + groupby: 'groupby', + metrics: 'metrics', + }, + }, + }, + '93': { + id: 93, + chartAlert: null, + chartStatus: 'rendered', + chartStackTrace: null, + chartUpdateEndTime: 1673046999051, + chartUpdateStartTime: 1673046994633, + latestQueryFormData: { + datasource: '20__table', + viz_type: 'heatmap', + slice_id: 93, + url_params: {}, + granularity_sqla: 'year', + time_range: 'No filter', + all_columns_x: 'platform', + all_columns_y: 'genre', + metric: 'count', + adhoc_filters: [], + row_limit: 10000, + linear_color_scheme: 'blue_white_yellow', + xscale_interval: null, + yscale_interval: null, + canvas_image_rendering: 'pixelated', + normalize_across: 'heatmap', + left_margin: 'auto', + bottom_margin: 'auto', + y_axis_bounds: [null, null], + y_axis_format: 'SMART_NUMBER', + sort_x_axis: 'alpha_asc', + sort_y_axis: 'alpha_asc', + show_legend: true, + show_perc: true, + show_values: true, + queryFields: { + metric: 'metrics', + }, + shared_label_colors: {}, + color_scheme: 'supersetColors', + extra_filters: [ + { + col: '__time_range', + op: '==', + val: 'No filter', + }, + ], + extra_form_data: {}, + dashboardId: 9, + }, + sliceFormData: null, + queryController: {}, + queriesResponse: [ + { + cache_key: '74366173c918f7430ab23aaa5567af49', + cached_dttm: null, + cache_timeout: 86400, + errors: [], + form_data: { + datasource: '20__table', + viz_type: 'heatmap', + slice_id: 93, + url_params: {}, + granularity_sqla: 'year', + time_range: 'No filter', + all_columns_x: 'platform', + all_columns_y: 'genre', + metric: 'count', + adhoc_filters: [], + row_limit: 10000, + linear_color_scheme: 'blue_white_yellow', + xscale_interval: null, + yscale_interval: null, + canvas_image_rendering: 'pixelated', + normalize_across: 'heatmap', + left_margin: 'auto', + bottom_margin: 'auto', + y_axis_bounds: [null, null], + y_axis_format: 'SMART_NUMBER', + sort_x_axis: 'alpha_asc', + sort_y_axis: 'alpha_asc', + show_legend: true, + show_perc: true, + show_values: true, + queryFields: { + metric: 'metrics', + }, + shared_label_colors: {}, + color_scheme: 'supersetColors', + dashboardId: 9, + applied_time_extras: {}, + where: '', + having: '', + having_filters: [], + filters: [], + }, + is_cached: false, + query: + 'SELECT platform AS platform,\n genre AS genre,\n COUNT(*) AS count\nFROM main.video_game_sales\nGROUP BY platform,\n genre\nLIMIT 10000\nOFFSET 0', + from_dttm: null, + to_dttm: null, + status: 'success', + stacktrace: null, + rowcount: 293, + colnames: ['platform', 'genre', 'count'], + coltypes: [1, 1, 0], + data: { + records: [ + { + x: '2600', + y: 'Action', + v: 61, + perc: 0.15037593984962405, + rank: 0.6962457337883959, + }, + { + x: '2600', + y: 'Adventure', + v: 2, + perc: 0.002506265664160401, + rank: 0.09044368600682594, + }, + { + x: '2600', + y: 'Fighting', + v: 2, + perc: 0.002506265664160401, + rank: 0.09044368600682594, + }, + { + x: '2600', + y: 'Misc', + v: 5, + perc: 0.010025062656641603, + rank: 0.1962457337883959, + }, + { + x: '2600', + y: 'Platform', + v: 9, + perc: 0.020050125313283207, + rank: 0.2832764505119454, + }, + { + x: '2600', + y: 'Puzzle', + v: 11, + perc: 0.02506265664160401, + rank: 0.3242320819112628, + }, + { + x: '2600', + y: 'Racing', + v: 6, + perc: 0.012531328320802004, + rank: 0.22184300341296928, + }, + { + x: '2600', + y: 'Shooter', + v: 24, + perc: 0.05764411027568922, + rank: 0.49829351535836175, + }, + { + x: '2600', + y: 'Simulation', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: '2600', + y: 'Sports', + v: 12, + perc: 0.02756892230576441, + rank: 0.34982935153583616, + }, + { + x: '3DO', + y: 'Adventure', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: '3DO', + y: 'Puzzle', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: '3DO', + y: 'Simulation', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: '3DS', + y: 'Action', + v: 182, + perc: 0.45363408521303256, + rank: 0.9146757679180887, + }, + { + x: '3DS', + y: 'Adventure', + v: 37, + perc: 0.09022556390977443, + rank: 0.6006825938566553, + }, + { + x: '3DS', + y: 'Fighting', + v: 14, + perc: 0.03258145363408521, + rank: 0.378839590443686, + }, + { + x: '3DS', + y: 'Misc', + v: 53, + perc: 0.13032581453634084, + rank: 0.6723549488054608, + }, + { + x: '3DS', + y: 'Platform', + v: 28, + perc: 0.06766917293233082, + rank: 0.5426621160409556, + }, + { + x: '3DS', + y: 'Puzzle', + v: 20, + perc: 0.047619047619047616, + rank: 0.4590443686006826, + }, + { + x: '3DS', + y: 'Racing', + v: 11, + perc: 0.02506265664160401, + rank: 0.3242320819112628, + }, + { + x: '3DS', + y: 'Role-Playing', + v: 86, + perc: 0.21303258145363407, + rank: 0.7832764505119454, + }, + { + x: '3DS', + y: 'Shooter', + v: 7, + perc: 0.015037593984962405, + rank: 0.24573378839590443, + }, + { + x: '3DS', + y: 'Simulation', + v: 30, + perc: 0.07268170426065163, + rank: 0.5580204778156996, + }, + { + x: '3DS', + y: 'Sports', + v: 26, + perc: 0.06265664160401002, + rank: 0.5273037542662116, + }, + { + x: '3DS', + y: 'Strategy', + v: 15, + perc: 0.03508771929824561, + rank: 0.39419795221843, + }, + { + x: 'DC', + y: 'Action', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'DC', + y: 'Adventure', + v: 11, + perc: 0.02506265664160401, + rank: 0.3242320819112628, + }, + { + x: 'DC', + y: 'Fighting', + v: 12, + perc: 0.02756892230576441, + rank: 0.34982935153583616, + }, + { + x: 'DC', + y: 'Platform', + v: 2, + perc: 0.002506265664160401, + rank: 0.09044368600682594, + }, + { + x: 'DC', + y: 'Racing', + v: 6, + perc: 0.012531328320802004, + rank: 0.22184300341296928, + }, + { + x: 'DC', + y: 'Role-Playing', + v: 4, + perc: 0.007518796992481203, + rank: 0.16552901023890784, + }, + { + x: 'DC', + y: 'Shooter', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'DC', + y: 'Simulation', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'DC', + y: 'Sports', + v: 10, + perc: 0.022556390977443608, + rank: 0.3003412969283277, + }, + { + x: 'DS', + y: 'Action', + v: 343, + perc: 0.8571428571428571, + rank: 0.9863481228668942, + }, + { + x: 'DS', + y: 'Adventure', + v: 240, + perc: 0.5989974937343359, + rank: 0.9692832764505119, + }, + { + x: 'DS', + y: 'Fighting', + v: 36, + perc: 0.08771929824561403, + rank: 0.5887372013651877, + }, + { + x: 'DS', + y: 'Misc', + v: 393, + perc: 0.9824561403508771, + rank: 0.9965870307167235, + }, + { + x: 'DS', + y: 'Platform', + v: 92, + perc: 0.22807017543859648, + rank: 0.8003412969283277, + }, + { + x: 'DS', + y: 'Puzzle', + v: 238, + perc: 0.5939849624060151, + rank: 0.9641638225255973, + }, + { + x: 'DS', + y: 'Racing', + v: 67, + perc: 0.16541353383458646, + rank: 0.726962457337884, + }, + { + x: 'DS', + y: 'Role-Playing', + v: 200, + perc: 0.49874686716791977, + rank: 0.931740614334471, + }, + { + x: 'DS', + y: 'Shooter', + v: 42, + perc: 0.10275689223057644, + rank: 0.6279863481228669, + }, + { + x: 'DS', + y: 'Simulation', + v: 284, + perc: 0.7092731829573935, + rank: 0.9795221843003413, + }, + { + x: 'DS', + y: 'Sports', + v: 148, + perc: 0.3684210526315789, + rank: 0.8822525597269625, + }, + { + x: 'DS', + y: 'Strategy', + v: 79, + perc: 0.19548872180451127, + rank: 0.7679180887372014, + }, + { + x: 'GB', + y: 'Action', + v: 6, + perc: 0.012531328320802004, + rank: 0.22184300341296928, + }, + { + x: 'GB', + y: 'Adventure', + v: 5, + perc: 0.010025062656641603, + rank: 0.1962457337883959, + }, + { + x: 'GB', + y: 'Misc', + v: 8, + perc: 0.017543859649122806, + rank: 0.26791808873720135, + }, + { + x: 'GB', + y: 'Platform', + v: 19, + perc: 0.045112781954887216, + rank: 0.45051194539249145, + }, + { + x: 'GB', + y: 'Puzzle', + v: 15, + perc: 0.03508771929824561, + rank: 0.39419795221843, + }, + { + x: 'GB', + y: 'Racing', + v: 2, + perc: 0.002506265664160401, + rank: 0.09044368600682594, + }, + { + x: 'GB', + y: 'Role-Playing', + v: 21, + perc: 0.05012531328320802, + rank: 0.46757679180887374, + }, + { + x: 'GB', + y: 'Shooter', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'GB', + y: 'Simulation', + v: 5, + perc: 0.010025062656641603, + rank: 0.1962457337883959, + }, + { + x: 'GB', + y: 'Sports', + v: 9, + perc: 0.020050125313283207, + rank: 0.2832764505119454, + }, + { + x: 'GB', + y: 'Strategy', + v: 7, + perc: 0.015037593984962405, + rank: 0.24573378839590443, + }, + { + x: 'GBA', + y: 'Action', + v: 167, + perc: 0.41604010025062654, + rank: 0.9078498293515358, + }, + { + x: 'GBA', + y: 'Adventure', + v: 38, + perc: 0.09273182957393483, + rank: 0.6092150170648464, + }, + { + x: 'GBA', + y: 'Fighting', + v: 23, + perc: 0.05513784461152882, + rank: 0.4812286689419795, + }, + { + x: 'GBA', + y: 'Misc', + v: 110, + perc: 0.2731829573934837, + rank: 0.8378839590443686, + }, + { + x: 'GBA', + y: 'Platform', + v: 142, + perc: 0.3533834586466165, + rank: 0.8737201365187713, + }, + { + x: 'GBA', + y: 'Puzzle', + v: 41, + perc: 0.10025062656641603, + rank: 0.621160409556314, + }, + { + x: 'GBA', + y: 'Racing', + v: 64, + perc: 0.15789473684210525, + rank: 0.7081911262798635, + }, + { + x: 'GBA', + y: 'Role-Playing', + v: 73, + perc: 0.18045112781954886, + rank: 0.7457337883959044, + }, + { + x: 'GBA', + y: 'Shooter', + v: 40, + perc: 0.09774436090225563, + rank: 0.6160409556313993, + }, + { + x: 'GBA', + y: 'Simulation', + v: 18, + perc: 0.042606516290726815, + rank: 0.43686006825938567, + }, + { + x: 'GBA', + y: 'Sports', + v: 88, + perc: 0.21804511278195488, + rank: 0.7918088737201365, + }, + { + x: 'GBA', + y: 'Strategy', + v: 18, + perc: 0.042606516290726815, + rank: 0.43686006825938567, + }, + { + x: 'GC', + y: 'Action', + v: 101, + perc: 0.2506265664160401, + rank: 0.8156996587030717, + }, + { + x: 'GC', + y: 'Adventure', + v: 20, + perc: 0.047619047619047616, + rank: 0.4590443686006826, + }, + { + x: 'GC', + y: 'Fighting', + v: 42, + perc: 0.10275689223057644, + rank: 0.6279863481228669, + }, + { + x: 'GC', + y: 'Misc', + v: 36, + perc: 0.08771929824561403, + rank: 0.5887372013651877, + }, + { + x: 'GC', + y: 'Platform', + v: 73, + perc: 0.18045112781954886, + rank: 0.7457337883959044, + }, + { + x: 'GC', + y: 'Puzzle', + v: 13, + perc: 0.03007518796992481, + rank: 0.36689419795221845, + }, + { + x: 'GC', + y: 'Racing', + v: 63, + perc: 0.15538847117794485, + rank: 0.7013651877133106, + }, + { + x: 'GC', + y: 'Role-Playing', + v: 27, + perc: 0.06516290726817042, + rank: 0.5358361774744027, + }, + { + x: 'GC', + y: 'Shooter', + v: 48, + perc: 0.11779448621553884, + rank: 0.6535836177474402, + }, + { + x: 'GC', + y: 'Simulation', + v: 12, + perc: 0.02756892230576441, + rank: 0.34982935153583616, + }, + { + x: 'GC', + y: 'Sports', + v: 110, + perc: 0.2731829573934837, + rank: 0.8378839590443686, + }, + { + x: 'GC', + y: 'Strategy', + v: 11, + perc: 0.02506265664160401, + rank: 0.3242320819112628, + }, + { + x: 'GEN', + y: 'Action', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'GEN', + y: 'Adventure', + v: 2, + perc: 0.002506265664160401, + rank: 0.09044368600682594, + }, + { + x: 'GEN', + y: 'Fighting', + v: 5, + perc: 0.010025062656641603, + rank: 0.1962457337883959, + }, + { + x: 'GEN', + y: 'Misc', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'GEN', + y: 'Platform', + v: 7, + perc: 0.015037593984962405, + rank: 0.24573378839590443, + }, + { + x: 'GEN', + y: 'Racing', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'GEN', + y: 'Role-Playing', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'GEN', + y: 'Shooter', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'GEN', + y: 'Sports', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'GEN', + y: 'Strategy', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'GG', + y: 'Platform', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'N64', + y: 'Action', + v: 38, + perc: 0.09273182957393483, + rank: 0.6092150170648464, + }, + { + x: 'N64', + y: 'Adventure', + v: 4, + perc: 0.007518796992481203, + rank: 0.16552901023890784, + }, + { + x: 'N64', + y: 'Fighting', + v: 29, + perc: 0.07017543859649122, + rank: 0.5511945392491467, + }, + { + x: 'N64', + y: 'Misc', + v: 18, + perc: 0.042606516290726815, + rank: 0.43686006825938567, + }, + { + x: 'N64', + y: 'Platform', + v: 30, + perc: 0.07268170426065163, + rank: 0.5580204778156996, + }, + { + x: 'N64', + y: 'Puzzle', + v: 12, + perc: 0.02756892230576441, + rank: 0.34982935153583616, + }, + { + x: 'N64', + y: 'Racing', + v: 57, + perc: 0.14035087719298245, + rank: 0.6791808873720137, + }, + { + x: 'N64', + y: 'Role-Playing', + v: 8, + perc: 0.017543859649122806, + rank: 0.26791808873720135, + }, + { + x: 'N64', + y: 'Shooter', + v: 24, + perc: 0.05764411027568922, + rank: 0.49829351535836175, + }, + { + x: 'N64', + y: 'Simulation', + v: 10, + perc: 0.022556390977443608, + rank: 0.3003412969283277, + }, + { + x: 'N64', + y: 'Sports', + v: 80, + perc: 0.19799498746867167, + rank: 0.7713310580204779, + }, + { + x: 'N64', + y: 'Strategy', + v: 9, + perc: 0.020050125313283207, + rank: 0.2832764505119454, + }, + { + x: 'NES', + y: 'Action', + v: 13, + perc: 0.03007518796992481, + rank: 0.36689419795221845, + }, + { + x: 'NES', + y: 'Adventure', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'NES', + y: 'Fighting', + v: 4, + perc: 0.007518796992481203, + rank: 0.16552901023890784, + }, + { + x: 'NES', + y: 'Misc', + v: 2, + perc: 0.002506265664160401, + rank: 0.09044368600682594, + }, + { + x: 'NES', + y: 'Platform', + v: 28, + perc: 0.06766917293233082, + rank: 0.5426621160409556, + }, + { + x: 'NES', + y: 'Puzzle', + v: 14, + perc: 0.03258145363408521, + rank: 0.378839590443686, + }, + { + x: 'NES', + y: 'Racing', + v: 4, + perc: 0.007518796992481203, + rank: 0.16552901023890784, + }, + { + x: 'NES', + y: 'Role-Playing', + v: 11, + perc: 0.02506265664160401, + rank: 0.3242320819112628, + }, + { + x: 'NES', + y: 'Shooter', + v: 7, + perc: 0.015037593984962405, + rank: 0.24573378839590443, + }, + { + x: 'NES', + y: 'Sports', + v: 14, + perc: 0.03258145363408521, + rank: 0.378839590443686, + }, + { + x: 'NG', + y: 'Fighting', + v: 11, + perc: 0.02506265664160401, + rank: 0.3242320819112628, + }, + { + x: 'NG', + y: 'Sports', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'PC', + y: 'Action', + v: 165, + perc: 0.41102756892230574, + rank: 0.9044368600682594, + }, + { + x: 'PC', + y: 'Adventure', + v: 65, + perc: 0.16040100250626566, + rank: 0.7167235494880546, + }, + { + x: 'PC', + y: 'Fighting', + v: 6, + perc: 0.012531328320802004, + rank: 0.22184300341296928, + }, + { + x: 'PC', + y: 'Misc', + v: 24, + perc: 0.05764411027568922, + rank: 0.49829351535836175, + }, + { + x: 'PC', + y: 'Platform', + v: 11, + perc: 0.02506265664160401, + rank: 0.3242320819112628, + }, + { + x: 'PC', + y: 'Puzzle', + v: 25, + perc: 0.06015037593984962, + rank: 0.515358361774744, + }, + { + x: 'PC', + y: 'Racing', + v: 60, + perc: 0.14786967418546365, + rank: 0.689419795221843, + }, + { + x: 'PC', + y: 'Role-Playing', + v: 104, + perc: 0.2581453634085213, + rank: 0.8225255972696246, + }, + { + x: 'PC', + y: 'Shooter', + v: 148, + perc: 0.3684210526315789, + rank: 0.8822525597269625, + }, + { + x: 'PC', + y: 'Simulation', + v: 115, + perc: 0.2857142857142857, + rank: 0.8430034129692833, + }, + { + x: 'PC', + y: 'Sports', + v: 49, + perc: 0.12030075187969924, + rank: 0.6621160409556314, + }, + { + x: 'PC', + y: 'Strategy', + v: 188, + perc: 0.46867167919799496, + rank: 0.9215017064846417, + }, + { + x: 'PCFX', + y: 'Role-Playing', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'PS', + y: 'Action', + v: 157, + perc: 0.39097744360902253, + rank: 0.8976109215017065, + }, + { + x: 'PS', + y: 'Adventure', + v: 69, + perc: 0.17042606516290726, + rank: 0.7337883959044369, + }, + { + x: 'PS', + y: 'Fighting', + v: 108, + perc: 0.2681704260651629, + rank: 0.8327645051194539, + }, + { + x: 'PS', + y: 'Misc', + v: 76, + perc: 0.18796992481203006, + rank: 0.7610921501706485, + }, + { + x: 'PS', + y: 'Platform', + v: 64, + perc: 0.15789473684210525, + rank: 0.7081911262798635, + }, + { + x: 'PS', + y: 'Puzzle', + v: 32, + perc: 0.07769423558897243, + rank: 0.5699658703071673, + }, + { + x: 'PS', + y: 'Racing', + v: 145, + perc: 0.3609022556390977, + rank: 0.8771331058020477, + }, + { + x: 'PS', + y: 'Role-Playing', + v: 97, + perc: 0.24060150375939848, + rank: 0.8122866894197952, + }, + { + x: 'PS', + y: 'Shooter', + v: 96, + perc: 0.23809523809523808, + rank: 0.8088737201365188, + }, + { + x: 'PS', + y: 'Simulation', + v: 60, + perc: 0.14786967418546365, + rank: 0.689419795221843, + }, + { + x: 'PS', + y: 'Sports', + v: 222, + perc: 0.5538847117794486, + rank: 0.9556313993174061, + }, + { + x: 'PS', + y: 'Strategy', + v: 70, + perc: 0.17293233082706766, + rank: 0.7372013651877133, + }, + { + x: 'PS2', + y: 'Action', + v: 348, + perc: 0.8696741854636592, + rank: 0.9897610921501706, + }, + { + x: 'PS2', + y: 'Adventure', + v: 196, + perc: 0.48872180451127817, + rank: 0.9283276450511946, + }, + { + x: 'PS2', + y: 'Fighting', + v: 150, + perc: 0.37343358395989973, + rank: 0.8873720136518771, + }, + { + x: 'PS2', + y: 'Misc', + v: 222, + perc: 0.5538847117794486, + rank: 0.9556313993174061, + }, + { + x: 'PS2', + y: 'Platform', + v: 103, + perc: 0.2556390977443609, + rank: 0.8191126279863481, + }, + { + x: 'PS2', + y: 'Puzzle', + v: 18, + perc: 0.042606516290726815, + rank: 0.43686006825938567, + }, + { + x: 'PS2', + y: 'Racing', + v: 216, + perc: 0.5388471177944862, + rank: 0.9453924914675768, + }, + { + x: 'PS2', + y: 'Role-Playing', + v: 187, + perc: 0.46616541353383456, + rank: 0.9180887372013652, + }, + { + x: 'PS2', + y: 'Shooter', + v: 160, + perc: 0.39849624060150374, + rank: 0.9010238907849829, + }, + { + x: 'PS2', + y: 'Simulation', + v: 90, + perc: 0.22305764411027568, + rank: 0.7952218430034129, + }, + { + x: 'PS2', + y: 'Sports', + v: 400, + perc: 1, + rank: 1, + }, + { + x: 'PS2', + y: 'Strategy', + v: 71, + perc: 0.17543859649122806, + rank: 0.7406143344709898, + }, + { + x: 'PS3', + y: 'Action', + v: 380, + perc: 0.949874686716792, + rank: 0.9931740614334471, + }, + { + x: 'PS3', + y: 'Adventure', + v: 74, + perc: 0.18295739348370926, + rank: 0.7525597269624573, + }, + { + x: 'PS3', + y: 'Fighting', + v: 76, + perc: 0.18796992481203006, + rank: 0.7610921501706485, + }, + { + x: 'PS3', + y: 'Misc', + v: 124, + perc: 0.3082706766917293, + rank: 0.856655290102389, + }, + { + x: 'PS3', + y: 'Platform', + v: 37, + perc: 0.09022556390977443, + rank: 0.6006825938566553, + }, + { + x: 'PS3', + y: 'Puzzle', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'PS3', + y: 'Racing', + v: 92, + perc: 0.22807017543859648, + rank: 0.8003412969283277, + }, + { + x: 'PS3', + y: 'Role-Playing', + v: 119, + perc: 0.2957393483709273, + rank: 0.8464163822525598, + }, + { + x: 'PS3', + y: 'Shooter', + v: 156, + perc: 0.38847117794486213, + rank: 0.89419795221843, + }, + { + x: 'PS3', + y: 'Simulation', + v: 31, + perc: 0.07518796992481203, + rank: 0.5648464163822525, + }, + { + x: 'PS3', + y: 'Sports', + v: 213, + perc: 0.531328320802005, + rank: 0.9402730375426621, + }, + { + x: 'PS3', + y: 'Strategy', + v: 24, + perc: 0.05764411027568922, + rank: 0.49829351535836175, + }, + { + x: 'PS4', + y: 'Action', + v: 122, + perc: 0.3032581453634085, + rank: 0.8498293515358362, + }, + { + x: 'PS4', + y: 'Adventure', + v: 19, + perc: 0.045112781954887216, + rank: 0.45051194539249145, + }, + { + x: 'PS4', + y: 'Fighting', + v: 17, + perc: 0.040100250626566414, + rank: 0.42150170648464164, + }, + { + x: 'PS4', + y: 'Misc', + v: 15, + perc: 0.03508771929824561, + rank: 0.39419795221843, + }, + { + x: 'PS4', + y: 'Platform', + v: 11, + perc: 0.02506265664160401, + rank: 0.3242320819112628, + }, + { + x: 'PS4', + y: 'Puzzle', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'PS4', + y: 'Racing', + v: 17, + perc: 0.040100250626566414, + rank: 0.42150170648464164, + }, + { + x: 'PS4', + y: 'Role-Playing', + v: 47, + perc: 0.11528822055137844, + rank: 0.6467576791808873, + }, + { + x: 'PS4', + y: 'Shooter', + v: 34, + perc: 0.08270676691729323, + rank: 0.5767918088737202, + }, + { + x: 'PS4', + y: 'Simulation', + v: 5, + perc: 0.010025062656641603, + rank: 0.1962457337883959, + }, + { + x: 'PS4', + y: 'Sports', + v: 43, + perc: 0.10526315789473684, + rank: 0.6348122866894198, + }, + { + x: 'PS4', + y: 'Strategy', + v: 5, + perc: 0.010025062656641603, + rank: 0.1962457337883959, + }, + { + x: 'PSP', + y: 'Action', + v: 222, + perc: 0.5538847117794486, + rank: 0.9556313993174061, + }, + { + x: 'PSP', + y: 'Adventure', + v: 213, + perc: 0.531328320802005, + rank: 0.9402730375426621, + }, + { + x: 'PSP', + y: 'Fighting', + v: 74, + perc: 0.18295739348370926, + rank: 0.7525597269624573, + }, + { + x: 'PSP', + y: 'Misc', + v: 106, + perc: 0.2631578947368421, + rank: 0.8293515358361775, + }, + { + x: 'PSP', + y: 'Platform', + v: 36, + perc: 0.08771929824561403, + rank: 0.5887372013651877, + }, + { + x: 'PSP', + y: 'Puzzle', + v: 44, + perc: 0.10776942355889724, + rank: 0.6382252559726962, + }, + { + x: 'PSP', + y: 'Racing', + v: 65, + perc: 0.16040100250626566, + rank: 0.7167235494880546, + }, + { + x: 'PSP', + y: 'Role-Playing', + v: 192, + perc: 0.47869674185463656, + rank: 0.9249146757679181, + }, + { + x: 'PSP', + y: 'Shooter', + v: 37, + perc: 0.09022556390977443, + rank: 0.6006825938566553, + }, + { + x: 'PSP', + y: 'Simulation', + v: 29, + perc: 0.07017543859649122, + rank: 0.5511945392491467, + }, + { + x: 'PSP', + y: 'Sports', + v: 135, + perc: 0.3358395989974937, + rank: 0.8668941979522184, + }, + { + x: 'PSP', + y: 'Strategy', + v: 60, + perc: 0.14786967418546365, + rank: 0.689419795221843, + }, + { + x: 'PSV', + y: 'Action', + v: 141, + perc: 0.3508771929824561, + rank: 0.8703071672354948, + }, + { + x: 'PSV', + y: 'Adventure', + v: 86, + perc: 0.21303258145363407, + rank: 0.7832764505119454, + }, + { + x: 'PSV', + y: 'Fighting', + v: 16, + perc: 0.03759398496240601, + rank: 0.40955631399317405, + }, + { + x: 'PSV', + y: 'Misc', + v: 24, + perc: 0.05764411027568922, + rank: 0.49829351535836175, + }, + { + x: 'PSV', + y: 'Platform', + v: 10, + perc: 0.022556390977443608, + rank: 0.3003412969283277, + }, + { + x: 'PSV', + y: 'Puzzle', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'PSV', + y: 'Racing', + v: 11, + perc: 0.02506265664160401, + rank: 0.3242320819112628, + }, + { + x: 'PSV', + y: 'Role-Playing', + v: 82, + perc: 0.20300751879699247, + rank: 0.7747440273037542, + }, + { + x: 'PSV', + y: 'Shooter', + v: 5, + perc: 0.010025062656641603, + rank: 0.1962457337883959, + }, + { + x: 'PSV', + y: 'Simulation', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'PSV', + y: 'Sports', + v: 23, + perc: 0.05513784461152882, + rank: 0.4812286689419795, + }, + { + x: 'PSV', + y: 'Strategy', + v: 7, + perc: 0.015037593984962405, + rank: 0.24573378839590443, + }, + { + x: 'SAT', + y: 'Action', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'SAT', + y: 'Adventure', + v: 26, + perc: 0.06265664160401002, + rank: 0.5273037542662116, + }, + { + x: 'SAT', + y: 'Fighting', + v: 31, + perc: 0.07518796992481203, + rank: 0.5648464163822525, + }, + { + x: 'SAT', + y: 'Misc', + v: 15, + perc: 0.03508771929824561, + rank: 0.39419795221843, + }, + { + x: 'SAT', + y: 'Platform', + v: 5, + perc: 0.010025062656641603, + rank: 0.1962457337883959, + }, + { + x: 'SAT', + y: 'Puzzle', + v: 5, + perc: 0.010025062656641603, + rank: 0.1962457337883959, + }, + { + x: 'SAT', + y: 'Racing', + v: 8, + perc: 0.017543859649122806, + rank: 0.26791808873720135, + }, + { + x: 'SAT', + y: 'Role-Playing', + v: 17, + perc: 0.040100250626566414, + rank: 0.42150170648464164, + }, + { + x: 'SAT', + y: 'Shooter', + v: 22, + perc: 0.05263157894736842, + rank: 0.47440273037542663, + }, + { + x: 'SAT', + y: 'Simulation', + v: 7, + perc: 0.015037593984962405, + rank: 0.24573378839590443, + }, + { + x: 'SAT', + y: 'Sports', + v: 16, + perc: 0.03759398496240601, + rank: 0.40955631399317405, + }, + { + x: 'SAT', + y: 'Strategy', + v: 18, + perc: 0.042606516290726815, + rank: 0.43686006825938567, + }, + { + x: 'SCD', + y: 'Misc', + v: 2, + perc: 0.002506265664160401, + rank: 0.09044368600682594, + }, + { + x: 'SCD', + y: 'Platform', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'SCD', + y: 'Racing', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'SCD', + y: 'Role-Playing', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'SCD', + y: 'Strategy', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'SNES', + y: 'Action', + v: 12, + perc: 0.02756892230576441, + rank: 0.34982935153583616, + }, + { + x: 'SNES', + y: 'Adventure', + v: 4, + perc: 0.007518796992481203, + rank: 0.16552901023890784, + }, + { + x: 'SNES', + y: 'Fighting', + v: 25, + perc: 0.06015037593984962, + rank: 0.515358361774744, + }, + { + x: 'SNES', + y: 'Misc', + v: 17, + perc: 0.040100250626566414, + rank: 0.42150170648464164, + }, + { + x: 'SNES', + y: 'Platform', + v: 26, + perc: 0.06265664160401002, + rank: 0.5273037542662116, + }, + { + x: 'SNES', + y: 'Puzzle', + v: 13, + perc: 0.03007518796992481, + rank: 0.36689419795221845, + }, + { + x: 'SNES', + y: 'Racing', + v: 9, + perc: 0.020050125313283207, + rank: 0.2832764505119454, + }, + { + x: 'SNES', + y: 'Role-Playing', + v: 50, + perc: 0.12280701754385964, + rank: 0.6689419795221843, + }, + { + x: 'SNES', + y: 'Shooter', + v: 10, + perc: 0.022556390977443608, + rank: 0.3003412969283277, + }, + { + x: 'SNES', + y: 'Simulation', + v: 9, + perc: 0.020050125313283207, + rank: 0.2832764505119454, + }, + { + x: 'SNES', + y: 'Sports', + v: 49, + perc: 0.12030075187969924, + rank: 0.6621160409556314, + }, + { + x: 'SNES', + y: 'Strategy', + v: 15, + perc: 0.03508771929824561, + rank: 0.39419795221843, + }, + { + x: 'TG16', + y: 'Adventure', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'TG16', + y: 'Shooter', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'WS', + y: 'Role-Playing', + v: 4, + perc: 0.007518796992481203, + rank: 0.16552901023890784, + }, + { + x: 'WS', + y: 'Strategy', + v: 2, + perc: 0.002506265664160401, + rank: 0.09044368600682594, + }, + { + x: 'Wii', + y: 'Action', + v: 238, + perc: 0.5939849624060151, + rank: 0.9641638225255973, + }, + { + x: 'Wii', + y: 'Adventure', + v: 84, + perc: 0.20802005012531327, + rank: 0.7781569965870307, + }, + { + x: 'Wii', + y: 'Fighting', + v: 42, + perc: 0.10275689223057644, + rank: 0.6279863481228669, + }, + { + x: 'Wii', + y: 'Misc', + v: 280, + perc: 0.6992481203007519, + rank: 0.9761092150170648, + }, + { + x: 'Wii', + y: 'Platform', + v: 58, + perc: 0.14285714285714285, + rank: 0.6825938566552902, + }, + { + x: 'Wii', + y: 'Puzzle', + v: 55, + perc: 0.13533834586466165, + rank: 0.6757679180887372, + }, + { + x: 'Wii', + y: 'Racing', + v: 94, + perc: 0.23308270676691728, + rank: 0.8054607508532423, + }, + { + x: 'Wii', + y: 'Role-Playing', + v: 35, + perc: 0.08521303258145363, + rank: 0.5802047781569966, + }, + { + x: 'Wii', + y: 'Shooter', + v: 66, + perc: 0.16290726817042606, + rank: 0.7235494880546075, + }, + { + x: 'Wii', + y: 'Simulation', + v: 87, + perc: 0.21553884711779447, + rank: 0.78839590443686, + }, + { + x: 'Wii', + y: 'Sports', + v: 261, + perc: 0.6516290726817042, + rank: 0.9726962457337884, + }, + { + x: 'Wii', + y: 'Strategy', + v: 25, + perc: 0.06015037593984962, + rank: 0.515358361774744, + }, + { + x: 'WiiU', + y: 'Action', + v: 63, + perc: 0.15538847117794485, + rank: 0.7013651877133106, + }, + { + x: 'WiiU', + y: 'Adventure', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'WiiU', + y: 'Fighting', + v: 5, + perc: 0.010025062656641603, + rank: 0.1962457337883959, + }, + { + x: 'WiiU', + y: 'Misc', + v: 21, + perc: 0.05012531328320802, + rank: 0.46757679180887374, + }, + { + x: 'WiiU', + y: 'Platform', + v: 16, + perc: 0.03759398496240601, + rank: 0.40955631399317405, + }, + { + x: 'WiiU', + y: 'Puzzle', + v: 4, + perc: 0.007518796992481203, + rank: 0.16552901023890784, + }, + { + x: 'WiiU', + y: 'Racing', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'WiiU', + y: 'Role-Playing', + v: 6, + perc: 0.012531328320802004, + rank: 0.22184300341296928, + }, + { + x: 'WiiU', + y: 'Shooter', + v: 10, + perc: 0.022556390977443608, + rank: 0.3003412969283277, + }, + { + x: 'WiiU', + y: 'Simulation', + v: 1, + perc: 0, + rank: 0.03924914675767918, + }, + { + x: 'WiiU', + y: 'Sports', + v: 8, + perc: 0.017543859649122806, + rank: 0.26791808873720135, + }, + { + x: 'WiiU', + y: 'Strategy', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'X360', + y: 'Action', + v: 324, + perc: 0.8095238095238095, + rank: 0.9829351535836177, + }, + { + x: 'X360', + y: 'Adventure', + v: 47, + perc: 0.11528822055137844, + rank: 0.6467576791808873, + }, + { + x: 'X360', + y: 'Fighting', + v: 65, + perc: 0.16040100250626566, + rank: 0.7167235494880546, + }, + { + x: 'X360', + y: 'Misc', + v: 126, + perc: 0.3132832080200501, + rank: 0.8600682593856656, + }, + { + x: 'X360', + y: 'Platform', + v: 24, + perc: 0.05764411027568922, + rank: 0.49829351535836175, + }, + { + x: 'X360', + y: 'Puzzle', + v: 7, + perc: 0.015037593984962405, + rank: 0.24573378839590443, + }, + { + x: 'X360', + y: 'Racing', + v: 105, + perc: 0.2606516290726817, + rank: 0.825938566552901, + }, + { + x: 'X360', + y: 'Role-Playing', + v: 76, + perc: 0.18796992481203006, + rank: 0.7610921501706485, + }, + { + x: 'X360', + y: 'Shooter', + v: 203, + perc: 0.506265664160401, + rank: 0.9351535836177475, + }, + { + x: 'X360', + y: 'Simulation', + v: 40, + perc: 0.09774436090225563, + rank: 0.6160409556313993, + }, + { + x: 'X360', + y: 'Sports', + v: 220, + perc: 0.5488721804511278, + rank: 0.9488054607508533, + }, + { + x: 'X360', + y: 'Strategy', + v: 28, + perc: 0.06766917293233082, + rank: 0.5426621160409556, + }, + { + x: 'XB', + y: 'Action', + v: 155, + perc: 0.38596491228070173, + rank: 0.8907849829351536, + }, + { + x: 'XB', + y: 'Adventure', + v: 26, + perc: 0.06265664160401002, + rank: 0.5273037542662116, + }, + { + x: 'XB', + y: 'Fighting', + v: 48, + perc: 0.11779448621553884, + rank: 0.6535836177474402, + }, + { + x: 'XB', + y: 'Misc', + v: 46, + perc: 0.11278195488721804, + rank: 0.6416382252559727, + }, + { + x: 'XB', + y: 'Platform', + v: 49, + perc: 0.12030075187969924, + rank: 0.6621160409556314, + }, + { + x: 'XB', + y: 'Puzzle', + v: 7, + perc: 0.015037593984962405, + rank: 0.24573378839590443, + }, + { + x: 'XB', + y: 'Racing', + v: 123, + perc: 0.3057644110275689, + rank: 0.8532423208191127, + }, + { + x: 'XB', + y: 'Role-Playing', + v: 23, + perc: 0.05513784461152882, + rank: 0.4812286689419795, + }, + { + x: 'XB', + y: 'Shooter', + v: 132, + perc: 0.3283208020050125, + rank: 0.863481228668942, + }, + { + x: 'XB', + y: 'Simulation', + v: 24, + perc: 0.05764411027568922, + rank: 0.49829351535836175, + }, + { + x: 'XB', + y: 'Sports', + v: 170, + perc: 0.42355889724310775, + rank: 0.9112627986348123, + }, + { + x: 'XB', + y: 'Strategy', + v: 21, + perc: 0.05012531328320802, + rank: 0.46757679180887374, + }, + { + x: 'XOne', + y: 'Action', + v: 68, + perc: 0.16791979949874686, + rank: 0.7303754266211604, + }, + { + x: 'XOne', + y: 'Adventure', + v: 12, + perc: 0.02756892230576441, + rank: 0.34982935153583616, + }, + { + x: 'XOne', + y: 'Fighting', + v: 7, + perc: 0.015037593984962405, + rank: 0.24573378839590443, + }, + { + x: 'XOne', + y: 'Misc', + v: 15, + perc: 0.03508771929824561, + rank: 0.39419795221843, + }, + { + x: 'XOne', + y: 'Platform', + v: 4, + perc: 0.007518796992481203, + rank: 0.16552901023890784, + }, + { + x: 'XOne', + y: 'Racing', + v: 19, + perc: 0.045112781954887216, + rank: 0.45051194539249145, + }, + { + x: 'XOne', + y: 'Role-Playing', + v: 13, + perc: 0.03007518796992481, + rank: 0.36689419795221845, + }, + { + x: 'XOne', + y: 'Shooter', + v: 33, + perc: 0.08020050125313283, + rank: 0.5733788395904437, + }, + { + x: 'XOne', + y: 'Simulation', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + { + x: 'XOne', + y: 'Sports', + v: 36, + perc: 0.08771929824561403, + rank: 0.5887372013651877, + }, + { + x: 'XOne', + y: 'Strategy', + v: 3, + perc: 0.005012531328320802, + rank: 0.12798634812286688, + }, + ], + extents: [1, 400], + }, + applied_filters: [], + rejected_filters: [], + }, + ], + triggerQuery: false, + lastRendered: 0, + form_data: { + datasource: '20__table', + viz_type: 'heatmap', + slice_id: 93, + url_params: {}, + granularity_sqla: 'year', + time_range: 'No filter', + all_columns_x: 'platform', + all_columns_y: 'genre', + metric: 'count', + adhoc_filters: [], + row_limit: 10000, + linear_color_scheme: 'blue_white_yellow', + xscale_interval: null, + yscale_interval: null, + canvas_image_rendering: 'pixelated', + normalize_across: 'heatmap', + left_margin: 'auto', + bottom_margin: 'auto', + y_axis_bounds: [null, null], + y_axis_format: 'SMART_NUMBER', + sort_x_axis: 'alpha_asc', + sort_y_axis: 'alpha_asc', + show_legend: true, + show_perc: true, + show_values: true, + queryFields: { + metric: 'metrics', + }, + }, + }, + '95': { + id: 95, + chartAlert: null, + chartStatus: 'loading', + chartStackTrace: null, + chartUpdateEndTime: null, + chartUpdateStartTime: 0, + latestQueryFormData: {}, + sliceFormData: null, + queryController: null, + queriesResponse: null, + triggerQuery: true, + lastRendered: 0, + form_data: { + datasource: '20__table', + viz_type: 'line', + slice_id: 95, + url_params: { + preselect_filters: + '{"1389": {"platform": ["PS", "PS2", "PS3", "PS4"], "genre": null, "__time_range": "No filter"}}', + }, + granularity_sqla: 'year', + time_grain_sqla: null, + time_range: 'No filter', + metrics: ['count'], + adhoc_filters: [], + groupby: ['genre'], + order_desc: true, + contribution: false, + row_limit: null, + color_scheme: 'supersetColors', + show_brush: 'auto', + show_legend: true, + rich_tooltip: true, + show_markers: false, + line_interpolation: 'linear', + x_axis_label: 'Year Published', + bottom_margin: 'auto', + x_ticks_layout: 'auto', + x_axis_format: 'smart_date', + x_axis_showminmax: true, + y_axis_label: '# of Games Published', + left_margin: 'auto', + y_axis_showminmax: true, + y_axis_format: 'SMART_NUMBER', + y_axis_bounds: [null, null], + rolling_type: 'None', + comparison_type: 'values', + annotation_layers: [], + label_colors: { + '0': '#1FA8C9', + '1': '#454E7C', + '2600': '#666666', + '3DO': '#B2B2B2', + '3DS': '#D1C6BC', + Action: '#1FA8C9', + Adventure: '#454E7C', + DC: '#A38F79', + DS: '#8FD3E4', + Europe: '#5AC189', + Fighting: '#5AC189', + GB: '#FDE380', + GBA: '#ACE1C4', + GC: '#5AC189', + GEN: '#3CCCCB', + GG: '#EFA1AA', + Japan: '#FF7F44', + 'Microsoft Game Studios': '#D1C6BC', + Misc: '#FF7F44', + N64: '#1FA8C9', + NES: '#9EE5E5', + NG: '#A1A6BD', + Nintendo: '#D3B3DA', + 'North America': '#666666', + Other: '#E04355', + PC: '#EFA1AA', + PCFX: '#FDE380', + PS: '#A1A6BD', + PS2: '#FCC700', + PS3: '#3CCCCB', + PS4: '#B2B2B2', + PSP: '#FEC0A1', + PSV: '#FCC700', + Platform: '#666666', + Puzzle: '#E04355', + Racing: '#FCC700', + 'Role-Playing': '#A868B7', + SAT: '#A868B7', + SCD: '#8FD3E4', + SNES: '#454E7C', + Shooter: '#3CCCCB', + Simulation: '#A38F79', + Sports: '#8FD3E4', + Strategy: '#A1A6BD', + TG16: '#FEC0A1', + 'Take-Two Interactive': '#9EE5E5', + WS: '#ACE1C4', + Wii: '#A38F79', + WiiU: '#E04355', + X360: '#A868B7', + XB: '#D3B3DA', + XOne: '#FF7F44', + }, + queryFields: { + groupby: 'groupby', + metrics: 'metrics', + }, + }, + }, + '103': { + id: 103, + chartAlert: null, + chartStatus: 'rendered', + chartStackTrace: null, + chartUpdateEndTime: 1673047001527, + chartUpdateStartTime: 1673046994566, + latestQueryFormData: { + datasource: '20__table', + viz_type: 'area', + slice_id: 103, + url_params: { + preselect_filters: + '{"1389": {"platform": ["PS", "PS2", "PS3", "PS4"], "genre": null, "__time_range": "No filter"}}', + }, + granularity_sqla: 'year', + time_grain_sqla: null, + time_range: 'No filter', + metrics: [ + { + aggregate: 'SUM', + column: { + column_name: 'global_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 887, + is_dttm: false, + optionName: '_col_Global_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: false, + isNew: false, + label: 'SUM(Global_Sales)', + optionName: 'metric_ufl75addr8c_oqqhdumirpn', + sqlExpression: null, + }, + ], + adhoc_filters: [], + groupby: ['platform'], + order_desc: true, + contribution: false, + row_limit: null, + show_brush: 'auto', + show_legend: false, + line_interpolation: 'linear', + stacked_style: 'stream', + color_scheme: 'supersetColors', + rich_tooltip: true, + x_axis_label: 'Year Published', + bottom_margin: 'auto', + x_ticks_layout: 'auto', + x_axis_format: 'smart_date', + x_axis_showminmax: true, + y_axis_format: 'SMART_NUMBER', + y_axis_bounds: [null, null], + rolling_type: 'None', + comparison_type: 'values', + annotation_layers: [], + queryFields: { + groupby: 'groupby', + metrics: 'metrics', + }, + shared_label_colors: {}, + extra_filters: [ + { + col: '__time_range', + op: '==', + val: 'No filter', + }, + ], + extra_form_data: {}, + dashboardId: 9, + }, + sliceFormData: null, + queryController: {}, + queriesResponse: [ + { + cache_key: '20775ba73440f8cab2208ae3f422402f', + cached_dttm: null, + cache_timeout: 86400, + errors: [], + form_data: { + datasource: '20__table', + viz_type: 'area', + slice_id: 103, + url_params: { + preselect_filters: + '{"1389": {"platform": ["PS", "PS2", "PS3", "PS4"], "genre": null, "__time_range": "No filter"}}', + }, + granularity_sqla: 'year', + time_grain_sqla: null, + time_range: 'No filter', + metrics: [ + { + aggregate: 'SUM', + column: { + column_name: 'global_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 887, + is_dttm: false, + optionName: '_col_Global_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: false, + isNew: false, + label: 'SUM(Global_Sales)', + optionName: 'metric_ufl75addr8c_oqqhdumirpn', + sqlExpression: null, + }, + ], + adhoc_filters: [], + groupby: ['platform'], + order_desc: true, + contribution: false, + row_limit: null, + show_brush: 'auto', + show_legend: false, + line_interpolation: 'linear', + stacked_style: 'stream', + color_scheme: 'supersetColors', + rich_tooltip: true, + x_axis_label: 'Year Published', + bottom_margin: 'auto', + x_ticks_layout: 'auto', + x_axis_format: 'smart_date', + x_axis_showminmax: true, + y_axis_format: 'SMART_NUMBER', + y_axis_bounds: [null, null], + rolling_type: 'None', + comparison_type: 'values', + annotation_layers: [], + queryFields: { + groupby: 'groupby', + metrics: 'metrics', + }, + shared_label_colors: {}, + dashboardId: 9, + applied_time_extras: {}, + where: '', + having: '', + having_filters: [], + filters: [], + }, + is_cached: false, + query: + 'SELECT year AS __timestamp,\n platform AS platform,\n sum(global_sales) AS "SUM(Global_Sales)"\nFROM main.video_game_sales\nGROUP BY platform,\n year\nORDER BY "SUM(Global_Sales)" DESC\nLIMIT 50000\nOFFSET 0', + from_dttm: null, + to_dttm: null, + status: 'success', + stacktrace: null, + rowcount: 255, + colnames: ['__timestamp', 'platform', 'SUM(Global_Sales)'], + coltypes: [2, 1, 0], + data: [ + { + key: ['PS2'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 0, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 0, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 0, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 0, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 0, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 0, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 0, + display: { + y: 0, + y0: 336.1057418579461, + }, + series: 0, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 0, + display: { + y: 0, + y0: 355.76073292228295, + }, + series: 0, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 0, + display: { + y: 0, + y0: 357.452200293436, + }, + series: 0, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 0, + display: { + y: 0, + y0: 348.78746735575066, + }, + series: 0, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 0, + display: { + y: 0, + y0: 339.76436707976166, + }, + series: 0, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 0, + display: { + y: 0, + y0: 352.9550172280039, + }, + series: 0, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 0, + display: { + y: 0, + y0: 345.7760219931503, + }, + series: 0, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 0, + display: { + y: 0, + y0: 365.16480818468705, + }, + series: 0, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 0, + display: { + y: 0, + y0: 355.9463874586553, + }, + series: 0, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 0, + display: { + y: 0, + y0: 375.71003766873946, + }, + series: 0, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 0, + display: { + y: 0, + y0: 377.41055311023564, + }, + series: 0, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 0, + display: { + y: 0, + y0: 383.37655475227183, + }, + series: 0, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 0, + display: { + y: 0, + y0: 381.6416336309462, + }, + series: 0, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 0, + display: { + y: 0, + y0: 436.22008078133535, + }, + series: 0, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 0, + display: { + y: 0, + y0: 421.48302062609594, + }, + series: 0, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 0, + display: { + y: 0, + y0: 457.6032684133616, + }, + series: 0, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 0, + display: { + y: 0, + y0: 464.9110839106354, + }, + series: 0, + }, + { + x: 946684800000, + y: 39.11000000000001, + index: 20, + seriesIndex: 0, + display: { + y: 39.11000000000001, + y0: 422.2363863019829, + }, + series: 0, + }, + { + x: 978307200000, + y: 166.43000000000006, + index: 21, + seriesIndex: 0, + display: { + y: 166.43000000000006, + y0: 375.71659853838435, + }, + series: 0, + }, + { + x: 1009843200000, + y: 205.40000000000006, + index: 22, + seriesIndex: 0, + display: { + y: 205.40000000000006, + y0: 366.939571207276, + }, + series: 0, + }, + { + x: 1041379200000, + y: 184.28999999999996, + index: 23, + seriesIndex: 0, + display: { + y: 184.28999999999996, + y0: 366.3006269568918, + }, + series: 0, + }, + { + x: 1072915200000, + y: 211.77999999999992, + index: 24, + seriesIndex: 0, + display: { + y: 211.77999999999992, + y0: 358.5965490670251, + }, + series: 0, + }, + { + x: 1104537600000, + y: 160.65000000000012, + index: 25, + seriesIndex: 0, + display: { + y: 160.65000000000012, + y0: 367.8171603424089, + }, + series: 0, + }, + { + x: 1136073600000, + y: 103.41999999999999, + index: 26, + seriesIndex: 0, + display: { + y: 103.41999999999999, + y0: 332.2283968117778, + }, + series: 0, + }, + { + x: 1167609600000, + y: 76, + index: 27, + seriesIndex: 0, + display: { + y: 76, + y0: 334.2380715127416, + }, + series: 0, + }, + { + x: 1199145600000, + y: 53.830000000000034, + index: 28, + seriesIndex: 0, + display: { + y: 53.830000000000034, + y0: 331.2200000000006, + }, + series: 0, + }, + { + x: 1230768000000, + y: 26.45, + index: 29, + seriesIndex: 0, + display: { + y: 26.45, + y0: 323.57657904990293, + }, + series: 0, + }, + { + x: 1262304000000, + y: 5.629999999999995, + index: 30, + seriesIndex: 0, + display: { + y: 5.629999999999995, + y0: 353.63872327506743, + }, + series: 0, + }, + { + x: 1293840000000, + y: 0.47, + index: 31, + seriesIndex: 0, + display: { + y: 0.47, + y0: 346.7617397094945, + }, + series: 0, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 0, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 0, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 0, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 0, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 0, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 0, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 0, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 0, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 0, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 0, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 0, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 0, + }, + ], + }, + { + key: ['X360'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 1, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 1, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 1, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 1, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 1, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 1, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 1, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 1, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 1, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 1, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 1, + display: { + y: 0, + y0: 303.54220029343605, + }, + series: 1, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 1, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 1, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 1, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 1, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 1, + display: { + y: 0, + y0: 305.7650172280039, + }, + series: 1, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 1, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 1, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 1, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 1, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 1, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 1, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 1, + display: { + y: 0, + y0: 302.57003766873936, + }, + series: 1, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 1, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 1, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 1, + display: { + y: 0, + y0: 317.05655475227184, + }, + series: 1, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 1, + display: { + y: 0, + y0: 297.7616336309462, + }, + series: 1, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 1, + display: { + y: 0, + y0: 247.66008078133538, + }, + series: 1, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 1, + display: { + y: 0, + y0: 231.76302062609608, + }, + series: 1, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 1, + display: { + y: 0, + y0: 204.41326841336158, + }, + series: 1, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 1, + display: { + y: 0, + y0: 218.39108391063536, + }, + series: 1, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 1, + display: { + y: 0, + y0: 264.466386301983, + }, + series: 1, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 1, + display: { + y: 0, + y0: 216.18659853838435, + }, + series: 1, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 1, + display: { + y: 0, + y0: 185.4195712072759, + }, + series: 1, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 1, + display: { + y: 0, + y0: 201.70062695689174, + }, + series: 1, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 1, + display: { + y: 0, + y0: 161.52654906702506, + }, + series: 1, + }, + { + x: 1104537600000, + y: 8.319999999999999, + index: 25, + seriesIndex: 1, + display: { + y: 8.319999999999999, + y0: 72.99716034240856, + }, + series: 1, + }, + { + x: 1136073600000, + y: 51.879999999999995, + index: 26, + seriesIndex: 1, + display: { + y: 51.879999999999995, + y0: 76.55839681177778, + }, + series: 1, + }, + { + x: 1167609600000, + y: 95.83999999999993, + index: 27, + seriesIndex: 1, + display: { + y: 95.83999999999993, + y0: 37.28807151274146, + }, + series: 1, + }, + { + x: 1199145600000, + y: 135.76000000000002, + index: 28, + seriesIndex: 1, + display: { + y: 135.76000000000002, + y0: 12.669999999999975, + }, + series: 1, + }, + { + x: 1230768000000, + y: 120.85000000000001, + index: 29, + seriesIndex: 1, + display: { + y: 120.85000000000001, + y0: 42.666579049902865, + }, + series: 1, + }, + { + x: 1262304000000, + y: 171.05000000000004, + index: 30, + seriesIndex: 1, + display: { + y: 171.05000000000004, + y0: 59.49872327506736, + }, + series: 1, + }, + { + x: 1293840000000, + y: 145.1200000000002, + index: 31, + seriesIndex: 1, + display: { + y: 145.1200000000002, + y0: 155.9517397094943, + }, + series: 1, + }, + { + x: 1325376000000, + y: 100.87999999999992, + index: 32, + seriesIndex: 1, + display: { + y: 100.87999999999992, + y0: 234.96331147601265, + }, + series: 1, + }, + { + x: 1356998400000, + y: 89.61000000000001, + index: 33, + seriesIndex: 1, + display: { + y: 89.61000000000001, + y0: 252.25434975261473, + }, + series: 1, + }, + { + x: 1388534400000, + y: 36.41999999999998, + index: 34, + seriesIndex: 1, + display: { + y: 36.41999999999998, + y0: 319.4614727314013, + }, + series: 1, + }, + { + x: 1420070400000, + y: 13.049999999999999, + index: 35, + seriesIndex: 1, + display: { + y: 13.049999999999999, + y0: 339.81176221105636, + }, + series: 1, + }, + { + x: 1451606400000, + y: 0.8300000000000001, + index: 36, + seriesIndex: 1, + display: { + y: 0.8300000000000001, + y0: 322.48515851727376, + }, + series: 1, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 1, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 1, + }, + ], + }, + { + key: ['PS3'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 2, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 2, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 2, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 2, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 2, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 2, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 2, + display: { + y: 0, + y0: 336.1057418579461, + }, + series: 2, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 2, + display: { + y: 0, + y0: 355.76073292228295, + }, + series: 2, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 2, + display: { + y: 0, + y0: 357.452200293436, + }, + series: 2, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 2, + display: { + y: 0, + y0: 348.78746735575066, + }, + series: 2, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 2, + display: { + y: 0, + y0: 339.76436707976166, + }, + series: 2, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 2, + display: { + y: 0, + y0: 352.9550172280039, + }, + series: 2, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 2, + display: { + y: 0, + y0: 345.7760219931503, + }, + series: 2, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 2, + display: { + y: 0, + y0: 365.16480818468705, + }, + series: 2, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 2, + display: { + y: 0, + y0: 355.9463874586553, + }, + series: 2, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 2, + display: { + y: 0, + y0: 375.71003766873946, + }, + series: 2, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 2, + display: { + y: 0, + y0: 377.41055311023564, + }, + series: 2, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 2, + display: { + y: 0, + y0: 383.37655475227183, + }, + series: 2, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 2, + display: { + y: 0, + y0: 381.6416336309462, + }, + series: 2, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 2, + display: { + y: 0, + y0: 436.22008078133535, + }, + series: 2, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 2, + display: { + y: 0, + y0: 421.48302062609594, + }, + series: 2, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 2, + display: { + y: 0, + y0: 457.6032684133616, + }, + series: 2, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 2, + display: { + y: 0, + y0: 464.9110839106354, + }, + series: 2, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 2, + display: { + y: 0, + y0: 461.34638630198293, + }, + series: 2, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 2, + display: { + y: 0, + y0: 542.1465985383844, + }, + series: 2, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 2, + display: { + y: 0, + y0: 572.3395712072761, + }, + series: 2, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 2, + display: { + y: 0, + y0: 550.5906269568918, + }, + series: 2, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 2, + display: { + y: 0, + y0: 570.376549067025, + }, + series: 2, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 2, + display: { + y: 0, + y0: 528.467160342409, + }, + series: 2, + }, + { + x: 1136073600000, + y: 21.070000000000004, + index: 26, + seriesIndex: 2, + display: { + y: 21.070000000000004, + y0: 573.5583968117778, + }, + series: 2, + }, + { + x: 1167609600000, + y: 73.81000000000006, + index: 27, + seriesIndex: 2, + display: { + y: 73.81000000000006, + y0: 565.2080715127415, + }, + series: 2, + }, + { + x: 1199145600000, + y: 119.69000000000001, + index: 28, + seriesIndex: 2, + display: { + y: 119.69000000000001, + y0: 559.2100000000006, + }, + series: 2, + }, + { + x: 1230768000000, + y: 132.33999999999997, + index: 29, + seriesIndex: 2, + display: { + y: 132.33999999999997, + y0: 560.4665790499031, + }, + series: 2, + }, + { + x: 1262304000000, + y: 144.42000000000007, + index: 30, + seriesIndex: 2, + display: { + y: 144.42000000000007, + y0: 491.06872327506755, + }, + series: 2, + }, + { + x: 1293840000000, + y: 159.3700000000001, + index: 31, + seriesIndex: 2, + display: { + y: 159.3700000000001, + y0: 409.6417397094946, + }, + series: 2, + }, + { + x: 1325376000000, + y: 109.49000000000002, + index: 32, + seriesIndex: 2, + display: { + y: 109.49000000000002, + y0: 377.9733114760125, + }, + series: 2, + }, + { + x: 1356998400000, + y: 117.38999999999994, + index: 33, + seriesIndex: 2, + display: { + y: 117.38999999999994, + y0: 356.37434975261476, + }, + series: 2, + }, + { + x: 1388534400000, + y: 50.96000000000002, + index: 34, + seriesIndex: 2, + display: { + y: 50.96000000000002, + y0: 360.5814727314012, + }, + series: 2, + }, + { + x: 1420070400000, + y: 18.220000000000002, + index: 35, + seriesIndex: 2, + display: { + y: 18.220000000000002, + y0: 354.5317622110564, + }, + series: 2, + }, + { + x: 1451606400000, + y: 2.59, + index: 36, + seriesIndex: 2, + display: { + y: 2.59, + y0: 323.31515851727374, + }, + series: 2, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 2, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 2, + }, + ], + }, + { + key: ['Wii'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 3, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 3, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 3, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 3, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 3, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 3, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 3, + display: { + y: 0, + y0: 336.1057418579461, + }, + series: 3, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 3, + display: { + y: 0, + y0: 355.76073292228295, + }, + series: 3, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 3, + display: { + y: 0, + y0: 357.452200293436, + }, + series: 3, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 3, + display: { + y: 0, + y0: 348.78746735575066, + }, + series: 3, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 3, + display: { + y: 0, + y0: 339.76436707976166, + }, + series: 3, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 3, + display: { + y: 0, + y0: 352.9550172280039, + }, + series: 3, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 3, + display: { + y: 0, + y0: 345.7760219931503, + }, + series: 3, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 3, + display: { + y: 0, + y0: 365.16480818468705, + }, + series: 3, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 3, + display: { + y: 0, + y0: 355.9463874586553, + }, + series: 3, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 3, + display: { + y: 0, + y0: 375.71003766873946, + }, + series: 3, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 3, + display: { + y: 0, + y0: 377.41055311023564, + }, + series: 3, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 3, + display: { + y: 0, + y0: 383.37655475227183, + }, + series: 3, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 3, + display: { + y: 0, + y0: 381.6416336309462, + }, + series: 3, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 3, + display: { + y: 0, + y0: 436.22008078133535, + }, + series: 3, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 3, + display: { + y: 0, + y0: 421.48302062609594, + }, + series: 3, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 3, + display: { + y: 0, + y0: 457.6032684133616, + }, + series: 3, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 3, + display: { + y: 0, + y0: 464.9110839106354, + }, + series: 3, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 3, + display: { + y: 0, + y0: 461.34638630198293, + }, + series: 3, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 3, + display: { + y: 0, + y0: 542.1465985383844, + }, + series: 3, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 3, + display: { + y: 0, + y0: 572.3395712072761, + }, + series: 3, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 3, + display: { + y: 0, + y0: 550.5906269568918, + }, + series: 3, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 3, + display: { + y: 0, + y0: 570.376549067025, + }, + series: 3, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 3, + display: { + y: 0, + y0: 528.467160342409, + }, + series: 3, + }, + { + x: 1136073600000, + y: 137.91000000000003, + index: 26, + seriesIndex: 3, + display: { + y: 137.91000000000003, + y0: 435.64839681177784, + }, + series: 3, + }, + { + x: 1167609600000, + y: 154.96999999999997, + index: 27, + seriesIndex: 3, + display: { + y: 154.96999999999997, + y0: 410.2380715127416, + }, + series: 3, + }, + { + x: 1199145600000, + y: 174.16, + index: 28, + seriesIndex: 3, + display: { + y: 174.16, + y0: 385.05000000000064, + }, + series: 3, + }, + { + x: 1230768000000, + y: 210.4400000000002, + index: 29, + seriesIndex: 3, + display: { + y: 210.4400000000002, + y0: 350.0265790499029, + }, + series: 3, + }, + { + x: 1262304000000, + y: 131.8000000000001, + index: 30, + seriesIndex: 3, + display: { + y: 131.8000000000001, + y0: 359.26872327506743, + }, + series: 3, + }, + { + x: 1293840000000, + y: 62.41000000000001, + index: 31, + seriesIndex: 3, + display: { + y: 62.41000000000001, + y0: 347.23173970949455, + }, + series: 3, + }, + { + x: 1325376000000, + y: 22.770000000000003, + index: 32, + seriesIndex: 3, + display: { + y: 22.770000000000003, + y0: 355.2033114760125, + }, + series: 3, + }, + { + x: 1356998400000, + y: 9.359999999999998, + index: 33, + seriesIndex: 3, + display: { + y: 9.359999999999998, + y0: 347.01434975261475, + }, + series: 3, + }, + { + x: 1388534400000, + y: 4.439999999999999, + index: 34, + seriesIndex: 3, + display: { + y: 4.439999999999999, + y0: 356.1414727314012, + }, + series: 3, + }, + { + x: 1420070400000, + y: 1.55, + index: 35, + seriesIndex: 3, + display: { + y: 1.55, + y0: 352.9817622110564, + }, + series: 3, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 3, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 3, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 3, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 3, + }, + ], + }, + { + key: ['DS'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 4, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 4, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 4, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 4, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 4, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 4, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 4, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 4, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 4, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 4, + }, + { + x: 473385600000, + y: 0.02, + index: 5, + seriesIndex: 4, + display: { + y: 0.02, + y0: 303.54220029343605, + }, + series: 4, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 4, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 4, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 4, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 4, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 4, + display: { + y: 0, + y0: 305.7650172280039, + }, + series: 4, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 4, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 4, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 4, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 4, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 4, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 4, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 4, + display: { + y: 0, + y0: 302.57003766873936, + }, + series: 4, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 4, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 4, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 4, + display: { + y: 0, + y0: 317.05655475227184, + }, + series: 4, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 4, + display: { + y: 0, + y0: 297.7616336309462, + }, + series: 4, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 4, + display: { + y: 0, + y0: 247.66008078133538, + }, + series: 4, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 4, + display: { + y: 0, + y0: 231.76302062609608, + }, + series: 4, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 4, + display: { + y: 0, + y0: 204.41326841336158, + }, + series: 4, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 4, + display: { + y: 0, + y0: 218.39108391063536, + }, + series: 4, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 4, + display: { + y: 0, + y0: 264.466386301983, + }, + series: 4, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 4, + display: { + y: 0, + y0: 216.18659853838435, + }, + series: 4, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 4, + display: { + y: 0, + y0: 185.4195712072759, + }, + series: 4, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 4, + display: { + y: 0, + y0: 201.70062695689174, + }, + series: 4, + }, + { + x: 1072915200000, + y: 17.459999999999994, + index: 24, + seriesIndex: 4, + display: { + y: 17.459999999999994, + y0: 161.52654906702506, + }, + series: 4, + }, + { + x: 1104537600000, + y: 131.4000000000002, + index: 25, + seriesIndex: 4, + display: { + y: 131.4000000000002, + y0: 81.31716034240856, + }, + series: 4, + }, + { + x: 1136073600000, + y: 121.14999999999998, + index: 26, + seriesIndex: 4, + display: { + y: 121.14999999999998, + y0: 128.43839681177778, + }, + series: 4, + }, + { + x: 1167609600000, + y: 149.3600000000002, + index: 27, + seriesIndex: 4, + display: { + y: 149.3600000000002, + y0: 133.1280715127414, + }, + series: 4, + }, + { + x: 1199145600000, + y: 147.89000000000047, + index: 28, + seriesIndex: 4, + display: { + y: 147.89000000000047, + y0: 148.43, + }, + series: 4, + }, + { + x: 1230768000000, + y: 121.99000000000001, + index: 29, + seriesIndex: 4, + display: { + y: 121.99000000000001, + y0: 163.51657904990287, + }, + series: 4, + }, + { + x: 1262304000000, + y: 87.97999999999995, + index: 30, + seriesIndex: 4, + display: { + y: 87.97999999999995, + y0: 230.5487232750674, + }, + series: 4, + }, + { + x: 1293840000000, + y: 27.799999999999994, + index: 31, + seriesIndex: 4, + display: { + y: 27.799999999999994, + y0: 301.0717397094945, + }, + series: 4, + }, + { + x: 1325376000000, + y: 11.639999999999993, + index: 32, + seriesIndex: 4, + display: { + y: 11.639999999999993, + y0: 335.84331147601256, + }, + series: 4, + }, + { + x: 1356998400000, + y: 1.96, + index: 33, + seriesIndex: 4, + display: { + y: 1.96, + y0: 341.86434975261477, + }, + series: 4, + }, + { + x: 1388534400000, + y: 0.02, + index: 34, + seriesIndex: 4, + display: { + y: 0.02, + y0: 355.88147273140123, + }, + series: 4, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 4, + display: { + y: 0, + y0: 352.8617622110564, + }, + series: 4, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 4, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 4, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 4, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 4, + }, + ], + }, + { + key: ['PS'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 5, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 5, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 5, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 5, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 5, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 5, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 5, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 5, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 5, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 5, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 5, + display: { + y: 0, + y0: 303.56220029343604, + }, + series: 5, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 5, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 5, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 5, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 5, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 5, + display: { + y: 0, + y0: 305.7650172280039, + }, + series: 5, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 5, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 5, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 5, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 5, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 5, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 5, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 5, + display: { + y: 0, + y0: 302.57003766873936, + }, + series: 5, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 5, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 5, + }, + { + x: 757382400000, + y: 6.020000000000001, + index: 14, + seriesIndex: 5, + display: { + y: 6.020000000000001, + y0: 317.05655475227184, + }, + series: 5, + }, + { + x: 788918400000, + y: 35.92000000000002, + index: 15, + seriesIndex: 5, + display: { + y: 35.92000000000002, + y0: 297.7616336309462, + }, + series: 5, + }, + { + x: 820454400000, + y: 94.67999999999999, + index: 16, + seriesIndex: 5, + display: { + y: 94.67999999999999, + y0: 247.66008078133538, + }, + series: 5, + }, + { + x: 852076800000, + y: 136.0799999999999, + index: 17, + seriesIndex: 5, + display: { + y: 136.0799999999999, + y0: 231.76302062609608, + }, + series: 5, + }, + { + x: 883612800000, + y: 169.58, + index: 18, + seriesIndex: 5, + display: { + y: 169.58, + y0: 204.41326841336158, + }, + series: 5, + }, + { + x: 915148800000, + y: 144.5700000000001, + index: 19, + seriesIndex: 5, + display: { + y: 144.5700000000001, + y0: 218.39108391063536, + }, + series: 5, + }, + { + x: 946684800000, + y: 96.27999999999993, + index: 20, + seriesIndex: 5, + display: { + y: 96.27999999999993, + y0: 265.516386301983, + }, + series: 5, + }, + { + x: 978307200000, + y: 35.520000000000024, + index: 21, + seriesIndex: 5, + display: { + y: 35.520000000000024, + y0: 300.04659853838433, + }, + series: 5, + }, + { + x: 1009843200000, + y: 6.689999999999998, + index: 22, + seriesIndex: 5, + display: { + y: 6.689999999999998, + y0: 307.949571207276, + }, + series: 5, + }, + { + x: 1041379200000, + y: 2.05, + index: 23, + seriesIndex: 5, + display: { + y: 2.05, + y0: 313.59062695689175, + }, + series: 5, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 5, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 5, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 5, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 5, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 5, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 5, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 5, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 5, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 5, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 5, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 5, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 5, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 5, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 5, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 5, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 5, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 5, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 5, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 5, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 5, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 5, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 5, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 5, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 5, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 5, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 5, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 5, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 5, + }, + ], + }, + { + key: ['GBA'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 6, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 6, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 6, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 6, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 6, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 6, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 6, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 6, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 6, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 6, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 6, + display: { + y: 0, + y0: 303.56220029343604, + }, + series: 6, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 6, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 6, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 6, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 6, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 6, + display: { + y: 0, + y0: 305.7650172280039, + }, + series: 6, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 6, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 6, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 6, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 6, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 6, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 6, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 6, + display: { + y: 0, + y0: 302.57003766873936, + }, + series: 6, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 6, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 6, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 6, + display: { + y: 0, + y0: 317.05655475227184, + }, + series: 6, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 6, + display: { + y: 0, + y0: 297.7616336309462, + }, + series: 6, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 6, + display: { + y: 0, + y0: 247.66008078133538, + }, + series: 6, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 6, + display: { + y: 0, + y0: 231.76302062609608, + }, + series: 6, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 6, + display: { + y: 0, + y0: 204.41326841336158, + }, + series: 6, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 6, + display: { + y: 0, + y0: 218.39108391063536, + }, + series: 6, + }, + { + x: 946684800000, + y: 0.06, + index: 20, + seriesIndex: 6, + display: { + y: 0.06, + y0: 265.456386301983, + }, + series: 6, + }, + { + x: 978307200000, + y: 61.62000000000001, + index: 21, + seriesIndex: 6, + display: { + y: 61.62000000000001, + y0: 238.42659853838433, + }, + series: 6, + }, + { + x: 1009843200000, + y: 74.38, + index: 22, + seriesIndex: 6, + display: { + y: 74.38, + y0: 233.56957120727597, + }, + series: 6, + }, + { + x: 1041379200000, + y: 56.72999999999996, + index: 23, + seriesIndex: 6, + display: { + y: 56.72999999999996, + y0: 256.8606269568918, + }, + series: 6, + }, + { + x: 1072915200000, + y: 78.09, + index: 24, + seriesIndex: 6, + display: { + y: 78.09, + y0: 251.61654906702506, + }, + series: 6, + }, + { + x: 1104537600000, + y: 33.90000000000001, + index: 25, + seriesIndex: 6, + display: { + y: 33.90000000000001, + y0: 306.1171603424089, + }, + series: 6, + }, + { + x: 1136073600000, + y: 5.35, + index: 26, + seriesIndex: 6, + display: { + y: 5.35, + y0: 315.5883968117778, + }, + series: 6, + }, + { + x: 1167609600000, + y: 3.4299999999999997, + index: 27, + seriesIndex: 6, + display: { + y: 3.4299999999999997, + y0: 330.51807151274164, + }, + series: 6, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 6, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 6, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 6, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 6, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 6, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 6, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 6, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 6, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 6, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 6, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 6, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 6, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 6, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 6, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 6, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 6, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 6, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 6, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 6, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 6, + }, + ], + }, + { + key: ['PSP'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 7, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 7, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 7, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 7, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 7, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 7, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 7, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 7, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 7, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 7, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 7, + display: { + y: 0, + y0: 303.56220029343604, + }, + series: 7, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 7, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 7, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 7, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 7, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 7, + display: { + y: 0, + y0: 305.7650172280039, + }, + series: 7, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 7, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 7, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 7, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 7, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 7, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 7, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 7, + display: { + y: 0, + y0: 302.57003766873936, + }, + series: 7, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 7, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 7, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 7, + display: { + y: 0, + y0: 317.05655475227184, + }, + series: 7, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 7, + display: { + y: 0, + y0: 297.7616336309462, + }, + series: 7, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 7, + display: { + y: 0, + y0: 247.66008078133538, + }, + series: 7, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 7, + display: { + y: 0, + y0: 231.76302062609608, + }, + series: 7, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 7, + display: { + y: 0, + y0: 204.41326841336158, + }, + series: 7, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 7, + display: { + y: 0, + y0: 218.39108391063536, + }, + series: 7, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 7, + display: { + y: 0, + y0: 264.466386301983, + }, + series: 7, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 7, + display: { + y: 0, + y0: 216.18659853838435, + }, + series: 7, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 7, + display: { + y: 0, + y0: 185.4195712072759, + }, + series: 7, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 7, + display: { + y: 0, + y0: 201.70062695689174, + }, + series: 7, + }, + { + x: 1072915200000, + y: 7.13, + index: 24, + seriesIndex: 7, + display: { + y: 7.13, + y0: 178.98654906702507, + }, + series: 7, + }, + { + x: 1104537600000, + y: 44.23000000000001, + index: 25, + seriesIndex: 7, + display: { + y: 44.23000000000001, + y0: 212.71716034240876, + }, + series: 7, + }, + { + x: 1136073600000, + y: 55.850000000000044, + index: 26, + seriesIndex: 7, + display: { + y: 55.850000000000044, + y0: 249.58839681177776, + }, + series: 7, + }, + { + x: 1167609600000, + y: 47.48000000000004, + index: 27, + seriesIndex: 7, + display: { + y: 47.48000000000004, + y0: 282.4880715127416, + }, + series: 7, + }, + { + x: 1199145600000, + y: 34.680000000000035, + index: 28, + seriesIndex: 7, + display: { + y: 34.680000000000035, + y0: 296.3200000000005, + }, + series: 7, + }, + { + x: 1230768000000, + y: 38.070000000000036, + index: 29, + seriesIndex: 7, + display: { + y: 38.070000000000036, + y0: 285.5065790499029, + }, + series: 7, + }, + { + x: 1262304000000, + y: 35.11000000000007, + index: 30, + seriesIndex: 7, + display: { + y: 35.11000000000007, + y0: 318.52872327506736, + }, + series: 7, + }, + { + x: 1293840000000, + y: 17.89000000000001, + index: 31, + seriesIndex: 7, + display: { + y: 17.89000000000001, + y0: 328.87173970949453, + }, + series: 7, + }, + { + x: 1325376000000, + y: 7.71999999999999, + index: 32, + seriesIndex: 7, + display: { + y: 7.71999999999999, + y0: 347.48331147601255, + }, + series: 7, + }, + { + x: 1356998400000, + y: 3.189999999999996, + index: 33, + seriesIndex: 7, + display: { + y: 3.189999999999996, + y0: 343.82434975261475, + }, + series: 7, + }, + { + x: 1388534400000, + y: 0.24000000000000005, + index: 34, + seriesIndex: 7, + display: { + y: 0.24000000000000005, + y0: 355.9014727314012, + }, + series: 7, + }, + { + x: 1420070400000, + y: 0.12000000000000001, + index: 35, + seriesIndex: 7, + display: { + y: 0.12000000000000001, + y0: 352.8617622110564, + }, + series: 7, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 7, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 7, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 7, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 7, + }, + ], + }, + { + key: ['PS4'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 8, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 8, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 8, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 8, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 8, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 8, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 8, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 8, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 8, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 8, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 8, + display: { + y: 0, + y0: 303.5122002934361, + }, + series: 8, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 8, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 8, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 8, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 8, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 8, + display: { + y: 0, + y0: 305.7350172280039, + }, + series: 8, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 8, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 8, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 8, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 8, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 8, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 8, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 8, + display: { + y: 0, + y0: 299.5500376687394, + }, + series: 8, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 8, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 8, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 8, + display: { + y: 0, + y0: 304.2065547522718, + }, + series: 8, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 8, + display: { + y: 0, + y0: 293.5316336309462, + }, + series: 8, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 8, + display: { + y: 0, + y0: 237.07008078133538, + }, + series: 8, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 8, + display: { + y: 0, + y0: 220.5030206260961, + }, + series: 8, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 8, + display: { + y: 0, + y0: 201.13326841336158, + }, + series: 8, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 8, + display: { + y: 0, + y0: 213.64108391063536, + }, + series: 8, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 8, + display: { + y: 0, + y0: 259.786386301983, + }, + series: 8, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 8, + display: { + y: 0, + y0: 210.67659853838435, + }, + series: 8, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 8, + display: { + y: 0, + y0: 176.8195712072759, + }, + series: 8, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 8, + display: { + y: 0, + y0: 192.74062695689176, + }, + series: 8, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 8, + display: { + y: 0, + y0: 151.06654906702508, + }, + series: 8, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 8, + display: { + y: 0, + y0: 68.52716034240856, + }, + series: 8, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 8, + display: { + y: 0, + y0: 73.58839681177778, + }, + series: 8, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 8, + display: { + y: 0, + y0: 27.888071512741476, + }, + series: 8, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 8, + display: { + y: 0, + y0: 0, + }, + series: 8, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 8, + display: { + y: 0, + y0: 25.506579049902825, + }, + series: 8, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 8, + display: { + y: 0, + y0: 35.038723275067355, + }, + series: 8, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 8, + display: { + y: 0, + y0: 115.55173970949426, + }, + series: 8, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 8, + display: { + y: 0, + y0: 175.06331147601264, + }, + series: 8, + }, + { + x: 1356998400000, + y: 24.760000000000005, + index: 33, + seriesIndex: 8, + display: { + y: 24.760000000000005, + y0: 180.13434975261472, + }, + series: 8, + }, + { + x: 1388534400000, + y: 98.76000000000003, + index: 34, + seriesIndex: 8, + display: { + y: 98.76000000000003, + y0: 170.06147273140124, + }, + series: 8, + }, + { + x: 1420070400000, + y: 115.29999999999997, + index: 35, + seriesIndex: 8, + display: { + y: 115.29999999999997, + y0: 192.96176221105642, + }, + series: 8, + }, + { + x: 1451606400000, + y: 39.25000000000002, + index: 36, + seriesIndex: 8, + display: { + y: 39.25000000000002, + y0: 273.94515851727374, + }, + series: 8, + }, + { + x: 1483228800000, + y: 0.03, + index: 37, + seriesIndex: 8, + display: { + y: 0.03, + y0: 293.55515851727375, + }, + series: 8, + }, + ], + }, + { + key: ['PC'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 9, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 9, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 9, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 9, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 9, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 9, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 9, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 9, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 9, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 9, + }, + { + x: 473385600000, + y: 0.03, + index: 5, + seriesIndex: 9, + display: { + y: 0.03, + y0: 303.5122002934361, + }, + series: 9, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 9, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 9, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 9, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 9, + }, + { + x: 567993600000, + y: 0.03, + index: 8, + seriesIndex: 9, + display: { + y: 0.03, + y0: 305.7350172280039, + }, + series: 9, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 9, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 9, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 9, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 9, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 9, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 9, + }, + { + x: 694224000000, + y: 3.0199999999999996, + index: 12, + seriesIndex: 9, + display: { + y: 3.0199999999999996, + y0: 299.5500376687394, + }, + series: 9, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 9, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 9, + }, + { + x: 757382400000, + y: 12.85, + index: 14, + seriesIndex: 9, + display: { + y: 12.85, + y0: 304.2065547522718, + }, + series: 9, + }, + { + x: 788918400000, + y: 4.2299999999999995, + index: 15, + seriesIndex: 9, + display: { + y: 4.2299999999999995, + y0: 293.5316336309462, + }, + series: 9, + }, + { + x: 820454400000, + y: 10.59, + index: 16, + seriesIndex: 9, + display: { + y: 10.59, + y0: 237.07008078133538, + }, + series: 9, + }, + { + x: 852076800000, + y: 11.260000000000002, + index: 17, + seriesIndex: 9, + display: { + y: 11.260000000000002, + y0: 220.5030206260961, + }, + series: 9, + }, + { + x: 883612800000, + y: 3.2800000000000002, + index: 18, + seriesIndex: 9, + display: { + y: 3.2800000000000002, + y0: 201.13326841336158, + }, + series: 9, + }, + { + x: 915148800000, + y: 4.749999999999999, + index: 19, + seriesIndex: 9, + display: { + y: 4.749999999999999, + y0: 213.64108391063536, + }, + series: 9, + }, + { + x: 946684800000, + y: 4.679999999999999, + index: 20, + seriesIndex: 9, + display: { + y: 4.679999999999999, + y0: 259.786386301983, + }, + series: 9, + }, + { + x: 978307200000, + y: 5.51, + index: 21, + seriesIndex: 9, + display: { + y: 5.51, + y0: 210.67659853838435, + }, + series: 9, + }, + { + x: 1009843200000, + y: 8.599999999999996, + index: 22, + seriesIndex: 9, + display: { + y: 8.599999999999996, + y0: 176.8195712072759, + }, + series: 9, + }, + { + x: 1041379200000, + y: 8.959999999999988, + index: 23, + seriesIndex: 9, + display: { + y: 8.959999999999988, + y0: 192.74062695689176, + }, + series: 9, + }, + { + x: 1072915200000, + y: 10.459999999999992, + index: 24, + seriesIndex: 9, + display: { + y: 10.459999999999992, + y0: 151.06654906702508, + }, + series: 9, + }, + { + x: 1104537600000, + y: 4.469999999999995, + index: 25, + seriesIndex: 9, + display: { + y: 4.469999999999995, + y0: 68.52716034240856, + }, + series: 9, + }, + { + x: 1136073600000, + y: 2.969999999999998, + index: 26, + seriesIndex: 9, + display: { + y: 2.969999999999998, + y0: 73.58839681177778, + }, + series: 9, + }, + { + x: 1167609600000, + y: 9.399999999999984, + index: 27, + seriesIndex: 9, + display: { + y: 9.399999999999984, + y0: 27.888071512741476, + }, + series: 9, + }, + { + x: 1199145600000, + y: 12.669999999999975, + index: 28, + seriesIndex: 9, + display: { + y: 12.669999999999975, + y0: 0, + }, + series: 9, + }, + { + x: 1230768000000, + y: 17.160000000000043, + index: 29, + seriesIndex: 9, + display: { + y: 17.160000000000043, + y0: 25.506579049902825, + }, + series: 9, + }, + { + x: 1262304000000, + y: 24.460000000000004, + index: 30, + seriesIndex: 9, + display: { + y: 24.460000000000004, + y0: 35.038723275067355, + }, + series: 9, + }, + { + x: 1293840000000, + y: 35.250000000000036, + index: 31, + seriesIndex: 9, + display: { + y: 35.250000000000036, + y0: 120.70173970949426, + }, + series: 9, + }, + { + x: 1325376000000, + y: 23.53, + index: 32, + seriesIndex: 9, + display: { + y: 23.53, + y0: 211.43331147601265, + }, + series: 9, + }, + { + x: 1356998400000, + y: 12.829999999999995, + index: 33, + seriesIndex: 9, + display: { + y: 12.829999999999995, + y0: 239.42434975261475, + }, + series: 9, + }, + { + x: 1388534400000, + y: 13.389999999999993, + index: 34, + seriesIndex: 9, + display: { + y: 13.389999999999993, + y0: 306.0714727314013, + }, + series: 9, + }, + { + x: 1420070400000, + y: 8.069999999999997, + index: 35, + seriesIndex: 9, + display: { + y: 8.069999999999997, + y0: 331.74176221105637, + }, + series: 9, + }, + { + x: 1451606400000, + y: 2.5999999999999974, + index: 36, + seriesIndex: 9, + display: { + y: 2.5999999999999974, + y0: 319.88515851727374, + }, + series: 9, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 9, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 9, + }, + ], + }, + { + key: ['GB'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 10, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 10, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 10, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 10, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 10, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 10, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 10, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 10, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 10, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 10, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 10, + display: { + y: 0, + y0: 303.56220029343604, + }, + series: 10, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 10, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 10, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 10, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 10, + }, + { + x: 567993600000, + y: 1.43, + index: 8, + seriesIndex: 10, + display: { + y: 1.43, + y0: 305.7650172280039, + }, + series: 10, + }, + { + x: 599616000000, + y: 64.98, + index: 9, + seriesIndex: 10, + display: { + y: 64.98, + y0: 272.3260219931503, + }, + series: 10, + }, + { + x: 631152000000, + y: 4.890000000000001, + index: 10, + seriesIndex: 10, + display: { + y: 4.890000000000001, + y0: 315.774808184687, + }, + series: 10, + }, + { + x: 662688000000, + y: 5.57, + index: 11, + seriesIndex: 10, + display: { + y: 5.57, + y0: 323.71638745865533, + }, + series: 10, + }, + { + x: 694224000000, + y: 25.48, + index: 12, + seriesIndex: 10, + display: { + y: 25.48, + y0: 302.57003766873936, + }, + series: 10, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 10, + display: { + y: 0, + y0: 333.14055311023566, + }, + series: 10, + }, + { + x: 757382400000, + y: 12.170000000000002, + index: 14, + seriesIndex: 10, + display: { + y: 12.170000000000002, + y0: 327.9065547522718, + }, + series: 10, + }, + { + x: 788918400000, + y: 3.5999999999999996, + index: 15, + seriesIndex: 10, + display: { + y: 3.5999999999999996, + y0: 345.8316336309462, + }, + series: 10, + }, + { + x: 820454400000, + y: 36.02, + index: 16, + seriesIndex: 10, + display: { + y: 36.02, + y0: 350.16008078133535, + }, + series: 10, + }, + { + x: 852076800000, + y: 6.37, + index: 17, + seriesIndex: 10, + display: { + y: 6.37, + y0: 374.61302062609593, + }, + series: 10, + }, + { + x: 883612800000, + y: 26.9, + index: 18, + seriesIndex: 10, + display: { + y: 26.9, + y0: 377.8132684133616, + }, + series: 10, + }, + { + x: 915148800000, + y: 38.010000000000005, + index: 19, + seriesIndex: 10, + display: { + y: 38.010000000000005, + y0: 363.05108391063544, + }, + series: 10, + }, + { + x: 946684800000, + y: 19.759999999999998, + index: 20, + seriesIndex: 10, + display: { + y: 19.759999999999998, + y0: 361.7963863019829, + }, + series: 10, + }, + { + x: 978307200000, + y: 9.24, + index: 21, + seriesIndex: 10, + display: { + y: 9.24, + y0: 335.56659853838437, + }, + series: 10, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 10, + display: { + y: 0, + y0: 314.639571207276, + }, + series: 10, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 10, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 10, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 10, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 10, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 10, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 10, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 10, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 10, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 10, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 10, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 10, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 10, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 10, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 10, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 10, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 10, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 10, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 10, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 10, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 10, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 10, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 10, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 10, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 10, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 10, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 10, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 10, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 10, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 10, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 10, + }, + ], + }, + { + key: ['XB'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 11, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 11, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 11, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 11, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 11, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 11, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 11, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 11, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 11, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 11, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 11, + display: { + y: 0, + y0: 303.56220029343604, + }, + series: 11, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 11, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 11, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 11, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 11, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 11, + display: { + y: 0, + y0: 305.7650172280039, + }, + series: 11, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 11, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 11, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 11, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 11, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 11, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 11, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 11, + display: { + y: 0, + y0: 302.57003766873936, + }, + series: 11, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 11, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 11, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 11, + display: { + y: 0, + y0: 317.05655475227184, + }, + series: 11, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 11, + display: { + y: 0, + y0: 297.7616336309462, + }, + series: 11, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 11, + display: { + y: 0, + y0: 247.66008078133538, + }, + series: 11, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 11, + display: { + y: 0, + y0: 231.76302062609608, + }, + series: 11, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 11, + display: { + y: 0, + y0: 204.41326841336158, + }, + series: 11, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 11, + display: { + y: 0, + y0: 218.39108391063536, + }, + series: 11, + }, + { + x: 946684800000, + y: 0.99, + index: 20, + seriesIndex: 11, + display: { + y: 0.99, + y0: 264.466386301983, + }, + series: 11, + }, + { + x: 978307200000, + y: 22.23999999999999, + index: 21, + seriesIndex: 11, + display: { + y: 22.23999999999999, + y0: 216.18659853838435, + }, + series: 11, + }, + { + x: 1009843200000, + y: 48.15000000000006, + index: 22, + seriesIndex: 11, + display: { + y: 48.15000000000006, + y0: 185.4195712072759, + }, + series: 11, + }, + { + x: 1041379200000, + y: 55.16000000000003, + index: 23, + seriesIndex: 11, + display: { + y: 55.16000000000003, + y0: 201.70062695689174, + }, + series: 11, + }, + { + x: 1072915200000, + y: 65.50000000000001, + index: 24, + seriesIndex: 11, + display: { + y: 65.50000000000001, + y0: 186.11654906702506, + }, + series: 11, + }, + { + x: 1104537600000, + y: 49.17000000000011, + index: 25, + seriesIndex: 11, + display: { + y: 49.17000000000011, + y0: 256.9471603424088, + }, + series: 11, + }, + { + x: 1136073600000, + y: 10.149999999999991, + index: 26, + seriesIndex: 11, + display: { + y: 10.149999999999991, + y0: 305.4383968117778, + }, + series: 11, + }, + { + x: 1167609600000, + y: 0.5499999999999999, + index: 27, + seriesIndex: 11, + display: { + y: 0.5499999999999999, + y0: 329.96807151274163, + }, + series: 11, + }, + { + x: 1199145600000, + y: 0.18, + index: 28, + seriesIndex: 11, + display: { + y: 0.18, + y0: 331.00000000000057, + }, + series: 11, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 11, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 11, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 11, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 11, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 11, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 11, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 11, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 11, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 11, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 11, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 11, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 11, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 11, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 11, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 11, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 11, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 11, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 11, + }, + ], + }, + { + key: ['NES'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 12, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 12, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 12, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 12, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 12, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 12, + }, + { + x: 410227200000, + y: 10.959999999999999, + index: 3, + seriesIndex: 12, + display: { + y: 10.959999999999999, + y0: 325.1457418579461, + }, + series: 12, + }, + { + x: 441763200000, + y: 50.09000000000001, + index: 4, + seriesIndex: 12, + display: { + y: 50.09000000000001, + y0: 305.6707329222829, + }, + series: 12, + }, + { + x: 473385600000, + y: 53.44, + index: 5, + seriesIndex: 12, + display: { + y: 53.44, + y0: 304.012200293436, + }, + series: 12, + }, + { + x: 504921600000, + y: 36.410000000000004, + index: 6, + seriesIndex: 12, + display: { + y: 36.410000000000004, + y0: 312.37746735575064, + }, + series: 12, + }, + { + x: 536457600000, + y: 19.759999999999998, + index: 7, + seriesIndex: 12, + display: { + y: 19.759999999999998, + y0: 320.00436707976166, + }, + series: 12, + }, + { + x: 567993600000, + y: 45.01, + index: 8, + seriesIndex: 12, + display: { + y: 45.01, + y0: 307.9450172280039, + }, + series: 12, + }, + { + x: 599616000000, + y: 7.849999999999999, + index: 9, + seriesIndex: 12, + display: { + y: 7.849999999999999, + y0: 337.9260219931503, + }, + series: 12, + }, + { + x: 631152000000, + y: 15.74, + index: 10, + seriesIndex: 12, + display: { + y: 15.74, + y0: 320.664808184687, + }, + series: 12, + }, + { + x: 662688000000, + y: 6.11, + index: 11, + seriesIndex: 12, + display: { + y: 6.11, + y0: 329.2863874586553, + }, + series: 12, + }, + { + x: 694224000000, + y: 1.9800000000000002, + index: 12, + seriesIndex: 12, + display: { + y: 1.9800000000000002, + y0: 328.0500376687394, + }, + series: 12, + }, + { + x: 725846400000, + y: 3.61, + index: 13, + seriesIndex: 12, + display: { + y: 3.61, + y0: 333.14055311023566, + }, + series: 12, + }, + { + x: 757382400000, + y: 0.11, + index: 14, + seriesIndex: 12, + display: { + y: 0.11, + y0: 340.0765547522718, + }, + series: 12, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 12, + display: { + y: 0, + y0: 349.43163363094624, + }, + series: 12, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 12, + display: { + y: 0, + y0: 386.18008078133533, + }, + series: 12, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 12, + display: { + y: 0, + y0: 380.98302062609594, + }, + series: 12, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 12, + display: { + y: 0, + y0: 404.71326841336156, + }, + series: 12, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 12, + display: { + y: 0, + y0: 401.06108391063543, + }, + series: 12, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 12, + display: { + y: 0, + y0: 381.5563863019829, + }, + series: 12, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 12, + display: { + y: 0, + y0: 344.8065985383844, + }, + series: 12, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 12, + display: { + y: 0, + y0: 314.639571207276, + }, + series: 12, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 12, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 12, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 12, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 12, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 12, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 12, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 12, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 12, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 12, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 12, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 12, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 12, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 12, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 12, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 12, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 12, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 12, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 12, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 12, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 12, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 12, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 12, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 12, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 12, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 12, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 12, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 12, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 12, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 12, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 12, + }, + ], + }, + { + key: ['3DS'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 13, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 13, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 13, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 13, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 13, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 13, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 13, + display: { + y: 0, + y0: 336.1057418579461, + }, + series: 13, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 13, + display: { + y: 0, + y0: 355.76073292228295, + }, + series: 13, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 13, + display: { + y: 0, + y0: 357.452200293436, + }, + series: 13, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 13, + display: { + y: 0, + y0: 348.78746735575066, + }, + series: 13, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 13, + display: { + y: 0, + y0: 339.76436707976166, + }, + series: 13, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 13, + display: { + y: 0, + y0: 352.9550172280039, + }, + series: 13, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 13, + display: { + y: 0, + y0: 345.7760219931503, + }, + series: 13, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 13, + display: { + y: 0, + y0: 365.16480818468705, + }, + series: 13, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 13, + display: { + y: 0, + y0: 355.9463874586553, + }, + series: 13, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 13, + display: { + y: 0, + y0: 375.71003766873946, + }, + series: 13, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 13, + display: { + y: 0, + y0: 377.41055311023564, + }, + series: 13, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 13, + display: { + y: 0, + y0: 383.37655475227183, + }, + series: 13, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 13, + display: { + y: 0, + y0: 381.6416336309462, + }, + series: 13, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 13, + display: { + y: 0, + y0: 436.22008078133535, + }, + series: 13, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 13, + display: { + y: 0, + y0: 421.48302062609594, + }, + series: 13, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 13, + display: { + y: 0, + y0: 457.6032684133616, + }, + series: 13, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 13, + display: { + y: 0, + y0: 464.9110839106354, + }, + series: 13, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 13, + display: { + y: 0, + y0: 461.34638630198293, + }, + series: 13, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 13, + display: { + y: 0, + y0: 542.1465985383844, + }, + series: 13, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 13, + display: { + y: 0, + y0: 572.3395712072761, + }, + series: 13, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 13, + display: { + y: 0, + y0: 550.5906269568918, + }, + series: 13, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 13, + display: { + y: 0, + y0: 570.376549067025, + }, + series: 13, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 13, + display: { + y: 0, + y0: 528.467160342409, + }, + series: 13, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 13, + display: { + y: 0, + y0: 594.6283968117779, + }, + series: 13, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 13, + display: { + y: 0, + y0: 639.0180715127416, + }, + series: 13, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 13, + display: { + y: 0, + y0: 678.9000000000007, + }, + series: 13, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 13, + display: { + y: 0, + y0: 692.8065790499031, + }, + series: 13, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 13, + display: { + y: 0, + y0: 635.4887232750676, + }, + series: 13, + }, + { + x: 1293840000000, + y: 62.53, + index: 31, + seriesIndex: 13, + display: { + y: 62.53, + y0: 569.0117397094947, + }, + series: 13, + }, + { + x: 1325376000000, + y: 51.14000000000004, + index: 32, + seriesIndex: 13, + display: { + y: 51.14000000000004, + y0: 487.4633114760125, + }, + series: 13, + }, + { + x: 1356998400000, + y: 55.88000000000002, + index: 33, + seriesIndex: 13, + display: { + y: 55.88000000000002, + y0: 473.7643497526147, + }, + series: 13, + }, + { + x: 1388534400000, + y: 43.140000000000036, + index: 34, + seriesIndex: 13, + display: { + y: 43.140000000000036, + y0: 411.54147273140126, + }, + series: 13, + }, + { + x: 1420070400000, + y: 26.99, + index: 35, + seriesIndex: 13, + display: { + y: 26.99, + y0: 372.7517622110564, + }, + series: 13, + }, + { + x: 1451606400000, + y: 6.599999999999999, + index: 36, + seriesIndex: 13, + display: { + y: 6.599999999999999, + y0: 325.9051585172737, + }, + series: 13, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 13, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 13, + }, + ], + }, + { + key: ['N64'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 14, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 14, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 14, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 14, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 14, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 14, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 14, + display: { + y: 0, + y0: 336.1057418579461, + }, + series: 14, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 14, + display: { + y: 0, + y0: 355.76073292228295, + }, + series: 14, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 14, + display: { + y: 0, + y0: 357.452200293436, + }, + series: 14, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 14, + display: { + y: 0, + y0: 348.78746735575066, + }, + series: 14, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 14, + display: { + y: 0, + y0: 339.76436707976166, + }, + series: 14, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 14, + display: { + y: 0, + y0: 352.9550172280039, + }, + series: 14, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 14, + display: { + y: 0, + y0: 345.7760219931503, + }, + series: 14, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 14, + display: { + y: 0, + y0: 365.16480818468705, + }, + series: 14, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 14, + display: { + y: 0, + y0: 355.9463874586553, + }, + series: 14, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 14, + display: { + y: 0, + y0: 375.71003766873946, + }, + series: 14, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 14, + display: { + y: 0, + y0: 377.41055311023564, + }, + series: 14, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 14, + display: { + y: 0, + y0: 383.37655475227183, + }, + series: 14, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 14, + display: { + y: 0, + y0: 381.6416336309462, + }, + series: 14, + }, + { + x: 820454400000, + y: 34.10999999999999, + index: 16, + seriesIndex: 14, + display: { + y: 34.10999999999999, + y0: 402.11008078133534, + }, + series: 14, + }, + { + x: 852076800000, + y: 39.509999999999984, + index: 17, + seriesIndex: 14, + display: { + y: 39.509999999999984, + y0: 381.97302062609594, + }, + series: 14, + }, + { + x: 883612800000, + y: 49.28000000000002, + index: 18, + seriesIndex: 14, + display: { + y: 49.28000000000002, + y0: 404.9332684133616, + }, + series: 14, + }, + { + x: 915148800000, + y: 57.95999999999997, + index: 19, + seriesIndex: 14, + display: { + y: 57.95999999999997, + y0: 401.3210839106354, + }, + series: 14, + }, + { + x: 946684800000, + y: 34.00999999999999, + index: 20, + seriesIndex: 14, + display: { + y: 34.00999999999999, + y0: 381.5563863019829, + }, + series: 14, + }, + { + x: 978307200000, + y: 3.2600000000000002, + index: 21, + seriesIndex: 14, + display: { + y: 3.2600000000000002, + y0: 344.8065985383844, + }, + series: 14, + }, + { + x: 1009843200000, + y: 0.08, + index: 22, + seriesIndex: 14, + display: { + y: 0.08, + y0: 314.639571207276, + }, + series: 14, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 14, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 14, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 14, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 14, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 14, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 14, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 14, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 14, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 14, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 14, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 14, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 14, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 14, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 14, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 14, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 14, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 14, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 14, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 14, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 14, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 14, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 14, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 14, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 14, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 14, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 14, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 14, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 14, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 14, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 14, + }, + ], + }, + { + key: ['SNES'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 15, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 15, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 15, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 15, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 15, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 15, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 15, + display: { + y: 0, + y0: 336.1057418579461, + }, + series: 15, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 15, + display: { + y: 0, + y0: 355.76073292228295, + }, + series: 15, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 15, + display: { + y: 0, + y0: 357.452200293436, + }, + series: 15, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 15, + display: { + y: 0, + y0: 348.78746735575066, + }, + series: 15, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 15, + display: { + y: 0, + y0: 339.76436707976166, + }, + series: 15, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 15, + display: { + y: 0, + y0: 352.9550172280039, + }, + series: 15, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 15, + display: { + y: 0, + y0: 345.7760219931503, + }, + series: 15, + }, + { + x: 631152000000, + y: 26.16, + index: 10, + seriesIndex: 15, + display: { + y: 26.16, + y0: 339.004808184687, + }, + series: 15, + }, + { + x: 662688000000, + y: 16.21, + index: 11, + seriesIndex: 15, + display: { + y: 16.21, + y0: 339.7363874586553, + }, + series: 15, + }, + { + x: 694224000000, + y: 32.97999999999999, + index: 12, + seriesIndex: 15, + display: { + y: 32.97999999999999, + y0: 342.73003766873944, + }, + series: 15, + }, + { + x: 725846400000, + y: 40.010000000000005, + index: 13, + seriesIndex: 15, + display: { + y: 40.010000000000005, + y0: 337.40055311023565, + }, + series: 15, + }, + { + x: 757382400000, + y: 35.08, + index: 14, + seriesIndex: 15, + display: { + y: 35.08, + y0: 348.29655475227185, + }, + series: 15, + }, + { + x: 788918400000, + y: 32.21000000000001, + index: 15, + seriesIndex: 15, + display: { + y: 32.21000000000001, + y0: 349.43163363094624, + }, + series: 15, + }, + { + x: 820454400000, + y: 15.929999999999996, + index: 16, + seriesIndex: 15, + display: { + y: 15.929999999999996, + y0: 386.18008078133533, + }, + series: 15, + }, + { + x: 852076800000, + y: 0.99, + index: 17, + seriesIndex: 15, + display: { + y: 0.99, + y0: 380.98302062609594, + }, + series: 15, + }, + { + x: 883612800000, + y: 0.22000000000000003, + index: 18, + seriesIndex: 15, + display: { + y: 0.22000000000000003, + y0: 404.71326841336156, + }, + series: 15, + }, + { + x: 915148800000, + y: 0.26, + index: 19, + seriesIndex: 15, + display: { + y: 0.26, + y0: 401.06108391063543, + }, + series: 15, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 15, + display: { + y: 0, + y0: 381.5563863019829, + }, + series: 15, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 15, + display: { + y: 0, + y0: 344.8065985383844, + }, + series: 15, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 15, + display: { + y: 0, + y0: 314.639571207276, + }, + series: 15, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 15, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 15, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 15, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 15, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 15, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 15, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 15, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 15, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 15, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 15, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 15, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 15, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 15, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 15, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 15, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 15, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 15, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 15, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 15, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 15, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 15, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 15, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 15, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 15, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 15, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 15, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 15, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 15, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 15, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 15, + }, + ], + }, + { + key: ['GC'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 16, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 16, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 16, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 16, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 16, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 16, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 16, + display: { + y: 0, + y0: 336.1057418579461, + }, + series: 16, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 16, + display: { + y: 0, + y0: 355.76073292228295, + }, + series: 16, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 16, + display: { + y: 0, + y0: 357.452200293436, + }, + series: 16, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 16, + display: { + y: 0, + y0: 348.78746735575066, + }, + series: 16, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 16, + display: { + y: 0, + y0: 339.76436707976166, + }, + series: 16, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 16, + display: { + y: 0, + y0: 352.9550172280039, + }, + series: 16, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 16, + display: { + y: 0, + y0: 345.7760219931503, + }, + series: 16, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 16, + display: { + y: 0, + y0: 365.16480818468705, + }, + series: 16, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 16, + display: { + y: 0, + y0: 355.9463874586553, + }, + series: 16, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 16, + display: { + y: 0, + y0: 375.71003766873946, + }, + series: 16, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 16, + display: { + y: 0, + y0: 377.41055311023564, + }, + series: 16, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 16, + display: { + y: 0, + y0: 383.37655475227183, + }, + series: 16, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 16, + display: { + y: 0, + y0: 381.6416336309462, + }, + series: 16, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 16, + display: { + y: 0, + y0: 436.22008078133535, + }, + series: 16, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 16, + display: { + y: 0, + y0: 421.48302062609594, + }, + series: 16, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 16, + display: { + y: 0, + y0: 457.6032684133616, + }, + series: 16, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 16, + display: { + y: 0, + y0: 464.9110839106354, + }, + series: 16, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 16, + display: { + y: 0, + y0: 422.2363863019829, + }, + series: 16, + }, + { + x: 978307200000, + y: 26.299999999999997, + index: 21, + seriesIndex: 16, + display: { + y: 26.299999999999997, + y0: 349.41659853838433, + }, + series: 16, + }, + { + x: 1009843200000, + y: 51.93, + index: 22, + seriesIndex: 16, + display: { + y: 51.93, + y0: 315.009571207276, + }, + series: 16, + }, + { + x: 1041379200000, + y: 50.660000000000004, + index: 23, + seriesIndex: 16, + display: { + y: 50.660000000000004, + y0: 315.64062695689177, + }, + series: 16, + }, + { + x: 1072915200000, + y: 28.889999999999983, + index: 24, + seriesIndex: 16, + display: { + y: 28.889999999999983, + y0: 329.7065490670251, + }, + series: 16, + }, + { + x: 1104537600000, + y: 27.799999999999976, + index: 25, + seriesIndex: 16, + display: { + y: 27.799999999999976, + y0: 340.01716034240894, + }, + series: 16, + }, + { + x: 1136073600000, + y: 11.29, + index: 26, + seriesIndex: 16, + display: { + y: 11.29, + y0: 320.9383968117778, + }, + series: 16, + }, + { + x: 1167609600000, + y: 0.27, + index: 27, + seriesIndex: 16, + display: { + y: 0.27, + y0: 333.96807151274163, + }, + series: 16, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 16, + display: { + y: 0, + y0: 331.2200000000006, + }, + series: 16, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 16, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 16, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 16, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 16, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 16, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 16, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 16, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 16, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 16, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 16, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 16, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 16, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 16, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 16, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 16, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 16, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 16, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 16, + }, + ], + }, + { + key: ['XOne'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 17, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 17, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 17, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 17, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 17, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 17, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 17, + display: { + y: 0, + y0: 336.1057418579461, + }, + series: 17, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 17, + display: { + y: 0, + y0: 355.76073292228295, + }, + series: 17, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 17, + display: { + y: 0, + y0: 357.452200293436, + }, + series: 17, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 17, + display: { + y: 0, + y0: 348.78746735575066, + }, + series: 17, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 17, + display: { + y: 0, + y0: 339.76436707976166, + }, + series: 17, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 17, + display: { + y: 0, + y0: 352.9550172280039, + }, + series: 17, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 17, + display: { + y: 0, + y0: 345.7760219931503, + }, + series: 17, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 17, + display: { + y: 0, + y0: 365.16480818468705, + }, + series: 17, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 17, + display: { + y: 0, + y0: 355.9463874586553, + }, + series: 17, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 17, + display: { + y: 0, + y0: 375.71003766873946, + }, + series: 17, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 17, + display: { + y: 0, + y0: 377.41055311023564, + }, + series: 17, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 17, + display: { + y: 0, + y0: 383.37655475227183, + }, + series: 17, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 17, + display: { + y: 0, + y0: 381.6416336309462, + }, + series: 17, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 17, + display: { + y: 0, + y0: 436.22008078133535, + }, + series: 17, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 17, + display: { + y: 0, + y0: 421.48302062609594, + }, + series: 17, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 17, + display: { + y: 0, + y0: 457.6032684133616, + }, + series: 17, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 17, + display: { + y: 0, + y0: 464.9110839106354, + }, + series: 17, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 17, + display: { + y: 0, + y0: 461.34638630198293, + }, + series: 17, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 17, + display: { + y: 0, + y0: 542.1465985383844, + }, + series: 17, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 17, + display: { + y: 0, + y0: 572.3395712072761, + }, + series: 17, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 17, + display: { + y: 0, + y0: 550.5906269568918, + }, + series: 17, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 17, + display: { + y: 0, + y0: 570.376549067025, + }, + series: 17, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 17, + display: { + y: 0, + y0: 528.467160342409, + }, + series: 17, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 17, + display: { + y: 0, + y0: 594.6283968117779, + }, + series: 17, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 17, + display: { + y: 0, + y0: 639.0180715127416, + }, + series: 17, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 17, + display: { + y: 0, + y0: 678.9000000000007, + }, + series: 17, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 17, + display: { + y: 0, + y0: 692.8065790499031, + }, + series: 17, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 17, + display: { + y: 0, + y0: 635.4887232750676, + }, + series: 17, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 17, + display: { + y: 0, + y0: 631.5417397094947, + }, + series: 17, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 17, + display: { + y: 0, + y0: 538.6033114760125, + }, + series: 17, + }, + { + x: 1356998400000, + y: 18.599999999999998, + index: 33, + seriesIndex: 17, + display: { + y: 18.599999999999998, + y0: 529.6443497526147, + }, + series: 17, + }, + { + x: 1388534400000, + y: 52.43, + index: 34, + seriesIndex: 17, + display: { + y: 52.43, + y0: 454.6814727314013, + }, + series: 17, + }, + { + x: 1420070400000, + y: 57.660000000000025, + index: 35, + seriesIndex: 17, + display: { + y: 57.660000000000025, + y0: 399.7417622110564, + }, + series: 17, + }, + { + x: 1451606400000, + y: 12.369999999999987, + index: 36, + seriesIndex: 17, + display: { + y: 12.369999999999987, + y0: 332.50515851727374, + }, + series: 17, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 17, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 17, + }, + ], + }, + { + key: ['2600'], + values: [ + { + x: 315532800000, + y: 11.379999999999999, + index: 0, + seriesIndex: 18, + display: { + y: 11.379999999999999, + y0: 312.60127789129933, + }, + series: 18, + }, + { + x: 347155200000, + y: 35.77000000000001, + index: 1, + seriesIndex: 18, + display: { + y: 35.77000000000001, + y0: 300.40627789129934, + }, + series: 18, + }, + { + x: 378691200000, + y: 28.859999999999996, + index: 2, + seriesIndex: 18, + display: { + y: 28.859999999999996, + y0: 303.8612778912993, + }, + series: 18, + }, + { + x: 410227200000, + y: 5.83, + index: 3, + seriesIndex: 18, + display: { + y: 5.83, + y0: 319.31574185794614, + }, + series: 18, + }, + { + x: 441763200000, + y: 0.27, + index: 4, + seriesIndex: 18, + display: { + y: 0.27, + y0: 305.40073292228294, + }, + series: 18, + }, + { + x: 473385600000, + y: 0.45, + index: 5, + seriesIndex: 18, + display: { + y: 0.45, + y0: 303.56220029343604, + }, + series: 18, + }, + { + x: 504921600000, + y: 0.6599999999999999, + index: 6, + seriesIndex: 18, + display: { + y: 0.6599999999999999, + y0: 311.7174673557506, + }, + series: 18, + }, + { + x: 536457600000, + y: 1.9800000000000002, + index: 7, + seriesIndex: 18, + display: { + y: 1.9800000000000002, + y0: 318.02436707976165, + }, + series: 18, + }, + { + x: 567993600000, + y: 0.75, + index: 8, + seriesIndex: 18, + display: { + y: 0.75, + y0: 307.1950172280039, + }, + series: 18, + }, + { + x: 599616000000, + y: 0.62, + index: 9, + seriesIndex: 18, + display: { + y: 0.62, + y0: 337.3060219931503, + }, + series: 18, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 18, + display: { + y: 0, + y0: 320.664808184687, + }, + series: 18, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 18, + display: { + y: 0, + y0: 329.2863874586553, + }, + series: 18, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 18, + display: { + y: 0, + y0: 328.0500376687394, + }, + series: 18, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 18, + display: { + y: 0, + y0: 333.14055311023566, + }, + series: 18, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 18, + display: { + y: 0, + y0: 340.0765547522718, + }, + series: 18, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 18, + display: { + y: 0, + y0: 349.43163363094624, + }, + series: 18, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 18, + display: { + y: 0, + y0: 386.18008078133533, + }, + series: 18, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 18, + display: { + y: 0, + y0: 380.98302062609594, + }, + series: 18, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 18, + display: { + y: 0, + y0: 404.71326841336156, + }, + series: 18, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 18, + display: { + y: 0, + y0: 401.06108391063543, + }, + series: 18, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 18, + display: { + y: 0, + y0: 381.5563863019829, + }, + series: 18, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 18, + display: { + y: 0, + y0: 344.8065985383844, + }, + series: 18, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 18, + display: { + y: 0, + y0: 314.639571207276, + }, + series: 18, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 18, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 18, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 18, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 18, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 18, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 18, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 18, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 18, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 18, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 18, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 18, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 18, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 18, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 18, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 18, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 18, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 18, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 18, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 18, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 18, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 18, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 18, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 18, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 18, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 18, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 18, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 18, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 18, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 18, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 18, + }, + ], + }, + { + key: ['WiiU'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 19, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 19, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 19, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 19, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 19, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 19, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 19, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 19, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 19, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 19, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 19, + display: { + y: 0, + y0: 303.5122002934361, + }, + series: 19, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 19, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 19, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 19, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 19, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 19, + display: { + y: 0, + y0: 305.7350172280039, + }, + series: 19, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 19, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 19, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 19, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 19, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 19, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 19, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 19, + display: { + y: 0, + y0: 299.5500376687394, + }, + series: 19, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 19, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 19, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 19, + display: { + y: 0, + y0: 304.2065547522718, + }, + series: 19, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 19, + display: { + y: 0, + y0: 293.5316336309462, + }, + series: 19, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 19, + display: { + y: 0, + y0: 237.07008078133538, + }, + series: 19, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 19, + display: { + y: 0, + y0: 220.5030206260961, + }, + series: 19, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 19, + display: { + y: 0, + y0: 201.13326841336158, + }, + series: 19, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 19, + display: { + y: 0, + y0: 213.64108391063536, + }, + series: 19, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 19, + display: { + y: 0, + y0: 259.786386301983, + }, + series: 19, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 19, + display: { + y: 0, + y0: 210.67659853838435, + }, + series: 19, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 19, + display: { + y: 0, + y0: 176.8195712072759, + }, + series: 19, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 19, + display: { + y: 0, + y0: 192.74062695689176, + }, + series: 19, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 19, + display: { + y: 0, + y0: 151.06654906702508, + }, + series: 19, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 19, + display: { + y: 0, + y0: 68.52716034240856, + }, + series: 19, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 19, + display: { + y: 0, + y0: 73.58839681177778, + }, + series: 19, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 19, + display: { + y: 0, + y0: 27.888071512741476, + }, + series: 19, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 19, + display: { + y: 0, + y0: 0, + }, + series: 19, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 19, + display: { + y: 0, + y0: 25.506579049902825, + }, + series: 19, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 19, + display: { + y: 0, + y0: 35.038723275067355, + }, + series: 19, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 19, + display: { + y: 0, + y0: 115.55173970949426, + }, + series: 19, + }, + { + x: 1325376000000, + y: 17.840000000000003, + index: 32, + seriesIndex: 19, + display: { + y: 17.840000000000003, + y0: 175.06331147601264, + }, + series: 19, + }, + { + x: 1356998400000, + y: 21.84, + index: 33, + seriesIndex: 19, + display: { + y: 21.84, + y0: 204.89434975261474, + }, + series: 19, + }, + { + x: 1388534400000, + y: 22.509999999999994, + index: 34, + seriesIndex: 19, + display: { + y: 22.509999999999994, + y0: 268.8214727314013, + }, + series: 19, + }, + { + x: 1420070400000, + y: 16.380000000000003, + index: 35, + seriesIndex: 19, + display: { + y: 16.380000000000003, + y0: 308.2617622110564, + }, + series: 19, + }, + { + x: 1451606400000, + y: 3.2899999999999996, + index: 36, + seriesIndex: 19, + display: { + y: 3.2899999999999996, + y0: 313.19515851727374, + }, + series: 19, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 19, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 19, + }, + ], + }, + { + key: ['PSV'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 20, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 20, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 20, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 20, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 20, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 20, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 20, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 20, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 20, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 20, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 20, + display: { + y: 0, + y0: 303.5122002934361, + }, + series: 20, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 20, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 20, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 20, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 20, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 20, + display: { + y: 0, + y0: 305.7350172280039, + }, + series: 20, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 20, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 20, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 20, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 20, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 20, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 20, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 20, + display: { + y: 0, + y0: 299.5500376687394, + }, + series: 20, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 20, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 20, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 20, + display: { + y: 0, + y0: 304.2065547522718, + }, + series: 20, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 20, + display: { + y: 0, + y0: 293.5316336309462, + }, + series: 20, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 20, + display: { + y: 0, + y0: 237.07008078133538, + }, + series: 20, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 20, + display: { + y: 0, + y0: 220.5030206260961, + }, + series: 20, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 20, + display: { + y: 0, + y0: 201.13326841336158, + }, + series: 20, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 20, + display: { + y: 0, + y0: 213.64108391063536, + }, + series: 20, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 20, + display: { + y: 0, + y0: 259.786386301983, + }, + series: 20, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 20, + display: { + y: 0, + y0: 210.67659853838435, + }, + series: 20, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 20, + display: { + y: 0, + y0: 176.8195712072759, + }, + series: 20, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 20, + display: { + y: 0, + y0: 192.74062695689176, + }, + series: 20, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 20, + display: { + y: 0, + y0: 151.06654906702508, + }, + series: 20, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 20, + display: { + y: 0, + y0: 68.52716034240856, + }, + series: 20, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 20, + display: { + y: 0, + y0: 73.58839681177778, + }, + series: 20, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 20, + display: { + y: 0, + y0: 27.888071512741476, + }, + series: 20, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 20, + display: { + y: 0, + y0: 0, + }, + series: 20, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 20, + display: { + y: 0, + y0: 25.506579049902825, + }, + series: 20, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 20, + display: { + y: 0, + y0: 35.038723275067355, + }, + series: 20, + }, + { + x: 1293840000000, + y: 5.1499999999999995, + index: 31, + seriesIndex: 20, + display: { + y: 5.1499999999999995, + y0: 115.55173970949426, + }, + series: 20, + }, + { + x: 1325376000000, + y: 18.530000000000005, + index: 32, + seriesIndex: 20, + display: { + y: 18.530000000000005, + y0: 192.90331147601265, + }, + series: 20, + }, + { + x: 1356998400000, + y: 12.690000000000001, + index: 33, + seriesIndex: 20, + display: { + y: 12.690000000000001, + y0: 226.73434975261475, + }, + series: 20, + }, + { + x: 1388534400000, + y: 14.73999999999999, + index: 34, + seriesIndex: 20, + display: { + y: 14.73999999999999, + y0: 291.3314727314013, + }, + series: 20, + }, + { + x: 1420070400000, + y: 7.09999999999999, + index: 35, + seriesIndex: 20, + display: { + y: 7.09999999999999, + y0: 324.6417622110564, + }, + series: 20, + }, + { + x: 1451606400000, + y: 3.399999999999996, + index: 36, + seriesIndex: 20, + display: { + y: 3.399999999999996, + y0: 316.48515851727376, + }, + series: 20, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 20, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 20, + }, + ], + }, + { + key: ['SAT'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 21, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 21, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 21, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 21, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 21, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 21, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 21, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 21, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 21, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 21, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 21, + display: { + y: 0, + y0: 303.56220029343604, + }, + series: 21, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 21, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 21, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 21, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 21, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 21, + display: { + y: 0, + y0: 305.7650172280039, + }, + series: 21, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 21, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 21, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 21, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 21, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 21, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 21, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 21, + display: { + y: 0, + y0: 302.57003766873936, + }, + series: 21, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 21, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 21, + }, + { + x: 757382400000, + y: 3.6400000000000006, + index: 14, + seriesIndex: 21, + display: { + y: 3.6400000000000006, + y0: 323.0965547522718, + }, + series: 21, + }, + { + x: 788918400000, + y: 11.579999999999998, + index: 15, + seriesIndex: 21, + display: { + y: 11.579999999999998, + y0: 333.92163363094625, + }, + series: 21, + }, + { + x: 820454400000, + y: 7.69, + index: 16, + seriesIndex: 21, + display: { + y: 7.69, + y0: 342.37008078133533, + }, + series: 21, + }, + { + x: 852076800000, + y: 6.7700000000000005, + index: 17, + seriesIndex: 21, + display: { + y: 6.7700000000000005, + y0: 367.84302062609595, + }, + series: 21, + }, + { + x: 883612800000, + y: 3.819999999999999, + index: 18, + seriesIndex: 21, + display: { + y: 3.819999999999999, + y0: 373.9932684133616, + }, + series: 21, + }, + { + x: 915148800000, + y: 0.09, + index: 19, + seriesIndex: 21, + display: { + y: 0.09, + y0: 362.96108391063547, + }, + series: 21, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 21, + display: { + y: 0, + y0: 361.7963863019829, + }, + series: 21, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 21, + display: { + y: 0, + y0: 335.56659853838437, + }, + series: 21, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 21, + display: { + y: 0, + y0: 314.639571207276, + }, + series: 21, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 21, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 21, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 21, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 21, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 21, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 21, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 21, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 21, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 21, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 21, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 21, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 21, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 21, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 21, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 21, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 21, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 21, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 21, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 21, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 21, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 21, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 21, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 21, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 21, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 21, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 21, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 21, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 21, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 21, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 21, + }, + ], + }, + { + key: ['GEN'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 22, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 22, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 22, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 22, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 22, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 22, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 22, + display: { + y: 0, + y0: 336.1057418579461, + }, + series: 22, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 22, + display: { + y: 0, + y0: 355.76073292228295, + }, + series: 22, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 22, + display: { + y: 0, + y0: 357.452200293436, + }, + series: 22, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 22, + display: { + y: 0, + y0: 348.78746735575066, + }, + series: 22, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 22, + display: { + y: 0, + y0: 339.76436707976166, + }, + series: 22, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 22, + display: { + y: 0, + y0: 352.9550172280039, + }, + series: 22, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 22, + display: { + y: 0, + y0: 345.7760219931503, + }, + series: 22, + }, + { + x: 631152000000, + y: 2.6, + index: 10, + seriesIndex: 22, + display: { + y: 2.6, + y0: 336.404808184687, + }, + series: 22, + }, + { + x: 662688000000, + y: 4.34, + index: 11, + seriesIndex: 22, + display: { + y: 4.34, + y0: 335.39638745865534, + }, + series: 22, + }, + { + x: 694224000000, + y: 12.66, + index: 12, + seriesIndex: 22, + display: { + y: 12.66, + y0: 330.0300376687394, + }, + series: 22, + }, + { + x: 725846400000, + y: 0.6500000000000001, + index: 13, + seriesIndex: 22, + display: { + y: 0.6500000000000001, + y0: 336.75055311023567, + }, + series: 22, + }, + { + x: 757382400000, + y: 8.109999999999998, + index: 14, + seriesIndex: 22, + display: { + y: 8.109999999999998, + y0: 340.18655475227183, + }, + series: 22, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 22, + display: { + y: 0, + y0: 349.43163363094624, + }, + series: 22, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 22, + display: { + y: 0, + y0: 386.18008078133533, + }, + series: 22, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 22, + display: { + y: 0, + y0: 380.98302062609594, + }, + series: 22, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 22, + display: { + y: 0, + y0: 404.71326841336156, + }, + series: 22, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 22, + display: { + y: 0, + y0: 401.06108391063543, + }, + series: 22, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 22, + display: { + y: 0, + y0: 381.5563863019829, + }, + series: 22, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 22, + display: { + y: 0, + y0: 344.8065985383844, + }, + series: 22, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 22, + display: { + y: 0, + y0: 314.639571207276, + }, + series: 22, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 22, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 22, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 22, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 22, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 22, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 22, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 22, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 22, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 22, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 22, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 22, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 22, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 22, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 22, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 22, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 22, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 22, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 22, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 22, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 22, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 22, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 22, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 22, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 22, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 22, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 22, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 22, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 22, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 22, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 22, + }, + ], + }, + { + key: ['DC'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 23, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 23, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 23, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 23, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 23, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 23, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 23, + display: { + y: 0, + y0: 336.1057418579461, + }, + series: 23, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 23, + display: { + y: 0, + y0: 355.76073292228295, + }, + series: 23, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 23, + display: { + y: 0, + y0: 357.452200293436, + }, + series: 23, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 23, + display: { + y: 0, + y0: 348.78746735575066, + }, + series: 23, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 23, + display: { + y: 0, + y0: 339.76436707976166, + }, + series: 23, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 23, + display: { + y: 0, + y0: 352.9550172280039, + }, + series: 23, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 23, + display: { + y: 0, + y0: 345.7760219931503, + }, + series: 23, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 23, + display: { + y: 0, + y0: 365.16480818468705, + }, + series: 23, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 23, + display: { + y: 0, + y0: 355.9463874586553, + }, + series: 23, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 23, + display: { + y: 0, + y0: 375.71003766873946, + }, + series: 23, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 23, + display: { + y: 0, + y0: 377.41055311023564, + }, + series: 23, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 23, + display: { + y: 0, + y0: 383.37655475227183, + }, + series: 23, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 23, + display: { + y: 0, + y0: 381.6416336309462, + }, + series: 23, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 23, + display: { + y: 0, + y0: 436.22008078133535, + }, + series: 23, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 23, + display: { + y: 0, + y0: 421.48302062609594, + }, + series: 23, + }, + { + x: 883612800000, + y: 3.39, + index: 18, + seriesIndex: 23, + display: { + y: 3.39, + y0: 454.2132684133616, + }, + series: 23, + }, + { + x: 915148800000, + y: 5.169999999999999, + index: 19, + seriesIndex: 23, + display: { + y: 5.169999999999999, + y0: 459.2810839106354, + }, + series: 23, + }, + { + x: 946684800000, + y: 5.989999999999998, + index: 20, + seriesIndex: 23, + display: { + y: 5.989999999999998, + y0: 415.5663863019829, + }, + series: 23, + }, + { + x: 978307200000, + y: 1.07, + index: 21, + seriesIndex: 23, + display: { + y: 1.07, + y0: 348.06659853838437, + }, + series: 23, + }, + { + x: 1009843200000, + y: 0.29, + index: 22, + seriesIndex: 23, + display: { + y: 0.29, + y0: 314.719571207276, + }, + series: 23, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 23, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 23, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 23, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 23, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 23, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 23, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 23, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 23, + }, + { + x: 1167609600000, + y: 0.02, + index: 27, + seriesIndex: 23, + display: { + y: 0.02, + y0: 333.94807151274165, + }, + series: 23, + }, + { + x: 1199145600000, + y: 0.04, + index: 28, + seriesIndex: 23, + display: { + y: 0.04, + y0: 331.1800000000006, + }, + series: 23, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 23, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 23, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 23, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 23, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 23, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 23, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 23, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 23, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 23, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 23, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 23, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 23, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 23, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 23, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 23, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 23, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 23, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 23, + }, + ], + }, + { + key: ['SCD'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 24, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 24, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 24, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 24, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 24, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 24, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 24, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 24, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 24, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 24, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 24, + display: { + y: 0, + y0: 303.56220029343604, + }, + series: 24, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 24, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 24, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 24, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 24, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 24, + display: { + y: 0, + y0: 305.7650172280039, + }, + series: 24, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 24, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 24, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 24, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 24, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 24, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 24, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 24, + display: { + y: 0, + y0: 302.57003766873936, + }, + series: 24, + }, + { + x: 725846400000, + y: 1.5, + index: 13, + seriesIndex: 24, + display: { + y: 1.5, + y0: 331.64055311023566, + }, + series: 24, + }, + { + x: 757382400000, + y: 0.37, + index: 14, + seriesIndex: 24, + display: { + y: 0.37, + y0: 327.5365547522718, + }, + series: 24, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 24, + display: { + y: 0, + y0: 345.8316336309462, + }, + series: 24, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 24, + display: { + y: 0, + y0: 350.16008078133535, + }, + series: 24, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 24, + display: { + y: 0, + y0: 374.61302062609593, + }, + series: 24, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 24, + display: { + y: 0, + y0: 377.8132684133616, + }, + series: 24, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 24, + display: { + y: 0, + y0: 363.05108391063544, + }, + series: 24, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 24, + display: { + y: 0, + y0: 361.7963863019829, + }, + series: 24, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 24, + display: { + y: 0, + y0: 335.56659853838437, + }, + series: 24, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 24, + display: { + y: 0, + y0: 314.639571207276, + }, + series: 24, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 24, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 24, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 24, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 24, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 24, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 24, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 24, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 24, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 24, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 24, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 24, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 24, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 24, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 24, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 24, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 24, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 24, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 24, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 24, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 24, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 24, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 24, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 24, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 24, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 24, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 24, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 24, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 24, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 24, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 24, + }, + ], + }, + { + key: ['NG'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 25, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 25, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 25, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 25, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 25, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 25, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 25, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 25, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 25, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 25, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 25, + display: { + y: 0, + y0: 303.56220029343604, + }, + series: 25, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 25, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 25, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 25, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 25, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 25, + display: { + y: 0, + y0: 305.7650172280039, + }, + series: 25, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 25, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 25, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 25, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 25, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 25, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 25, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 25, + display: { + y: 0, + y0: 302.57003766873936, + }, + series: 25, + }, + { + x: 725846400000, + y: 0.21000000000000002, + index: 13, + seriesIndex: 25, + display: { + y: 0.21000000000000002, + y0: 331.4305531102357, + }, + series: 25, + }, + { + x: 757382400000, + y: 0.7999999999999999, + index: 14, + seriesIndex: 25, + display: { + y: 0.7999999999999999, + y0: 326.7365547522718, + }, + series: 25, + }, + { + x: 788918400000, + y: 0.33000000000000007, + index: 15, + seriesIndex: 25, + display: { + y: 0.33000000000000007, + y0: 345.50163363094623, + }, + series: 25, + }, + { + x: 820454400000, + y: 0.1, + index: 16, + seriesIndex: 25, + display: { + y: 0.1, + y0: 350.06008078133533, + }, + series: 25, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 25, + display: { + y: 0, + y0: 374.61302062609593, + }, + series: 25, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 25, + display: { + y: 0, + y0: 377.8132684133616, + }, + series: 25, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 25, + display: { + y: 0, + y0: 363.05108391063544, + }, + series: 25, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 25, + display: { + y: 0, + y0: 361.7963863019829, + }, + series: 25, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 25, + display: { + y: 0, + y0: 335.56659853838437, + }, + series: 25, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 25, + display: { + y: 0, + y0: 314.639571207276, + }, + series: 25, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 25, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 25, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 25, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 25, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 25, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 25, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 25, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 25, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 25, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 25, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 25, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 25, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 25, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 25, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 25, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 25, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 25, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 25, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 25, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 25, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 25, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 25, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 25, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 25, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 25, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 25, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 25, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 25, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 25, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 25, + }, + ], + }, + { + key: ['WS'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 26, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 26, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 26, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 26, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 26, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 26, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 26, + display: { + y: 0, + y0: 336.1057418579461, + }, + series: 26, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 26, + display: { + y: 0, + y0: 355.76073292228295, + }, + series: 26, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 26, + display: { + y: 0, + y0: 357.452200293436, + }, + series: 26, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 26, + display: { + y: 0, + y0: 348.78746735575066, + }, + series: 26, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 26, + display: { + y: 0, + y0: 339.76436707976166, + }, + series: 26, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 26, + display: { + y: 0, + y0: 352.9550172280039, + }, + series: 26, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 26, + display: { + y: 0, + y0: 345.7760219931503, + }, + series: 26, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 26, + display: { + y: 0, + y0: 365.16480818468705, + }, + series: 26, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 26, + display: { + y: 0, + y0: 355.9463874586553, + }, + series: 26, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 26, + display: { + y: 0, + y0: 375.71003766873946, + }, + series: 26, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 26, + display: { + y: 0, + y0: 377.41055311023564, + }, + series: 26, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 26, + display: { + y: 0, + y0: 383.37655475227183, + }, + series: 26, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 26, + display: { + y: 0, + y0: 381.6416336309462, + }, + series: 26, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 26, + display: { + y: 0, + y0: 436.22008078133535, + }, + series: 26, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 26, + display: { + y: 0, + y0: 421.48302062609594, + }, + series: 26, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 26, + display: { + y: 0, + y0: 457.6032684133616, + }, + series: 26, + }, + { + x: 915148800000, + y: 0.46, + index: 19, + seriesIndex: 26, + display: { + y: 0.46, + y0: 464.4510839106354, + }, + series: 26, + }, + { + x: 946684800000, + y: 0.68, + index: 20, + seriesIndex: 26, + display: { + y: 0.68, + y0: 421.5563863019829, + }, + series: 26, + }, + { + x: 978307200000, + y: 0.28, + index: 21, + seriesIndex: 26, + display: { + y: 0.28, + y0: 349.13659853838436, + }, + series: 26, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 26, + display: { + y: 0, + y0: 315.009571207276, + }, + series: 26, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 26, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 26, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 26, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 26, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 26, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 26, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 26, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 26, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 26, + display: { + y: 0, + y0: 333.96807151274163, + }, + series: 26, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 26, + display: { + y: 0, + y0: 331.2200000000006, + }, + series: 26, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 26, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 26, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 26, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 26, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 26, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 26, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 26, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 26, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 26, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 26, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 26, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 26, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 26, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 26, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 26, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 26, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 26, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 26, + }, + ], + }, + { + key: ['TG16'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 27, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 27, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 27, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 27, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 27, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 27, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 27, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 27, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 27, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 27, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 27, + display: { + y: 0, + y0: 303.56220029343604, + }, + series: 27, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 27, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 27, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 27, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 27, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 27, + display: { + y: 0, + y0: 305.7650172280039, + }, + series: 27, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 27, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 27, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 27, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 27, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 27, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 27, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 27, + display: { + y: 0, + y0: 302.57003766873936, + }, + series: 27, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 27, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 27, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 27, + display: { + y: 0, + y0: 323.0965547522718, + }, + series: 27, + }, + { + x: 788918400000, + y: 0.16, + index: 15, + seriesIndex: 27, + display: { + y: 0.16, + y0: 333.7616336309462, + }, + series: 27, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 27, + display: { + y: 0, + y0: 342.37008078133533, + }, + series: 27, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 27, + display: { + y: 0, + y0: 367.84302062609595, + }, + series: 27, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 27, + display: { + y: 0, + y0: 373.9932684133616, + }, + series: 27, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 27, + display: { + y: 0, + y0: 362.96108391063547, + }, + series: 27, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 27, + display: { + y: 0, + y0: 361.7963863019829, + }, + series: 27, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 27, + display: { + y: 0, + y0: 335.56659853838437, + }, + series: 27, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 27, + display: { + y: 0, + y0: 314.639571207276, + }, + series: 27, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 27, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 27, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 27, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 27, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 27, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 27, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 27, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 27, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 27, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 27, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 27, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 27, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 27, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 27, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 27, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 27, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 27, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 27, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 27, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 27, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 27, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 27, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 27, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 27, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 27, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 27, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 27, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 27, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 27, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 27, + }, + ], + }, + { + key: ['3DO'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 28, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 28, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 28, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 28, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 28, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 28, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 28, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 28, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 28, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 28, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 28, + display: { + y: 0, + y0: 303.56220029343604, + }, + series: 28, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 28, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 28, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 28, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 28, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 28, + display: { + y: 0, + y0: 305.7650172280039, + }, + series: 28, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 28, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 28, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 28, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 28, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 28, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 28, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 28, + display: { + y: 0, + y0: 302.57003766873936, + }, + series: 28, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 28, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 28, + }, + { + x: 757382400000, + y: 0.02, + index: 14, + seriesIndex: 28, + display: { + y: 0.02, + y0: 323.0765547522718, + }, + series: 28, + }, + { + x: 788918400000, + y: 0.08, + index: 15, + seriesIndex: 28, + display: { + y: 0.08, + y0: 333.68163363094624, + }, + series: 28, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 28, + display: { + y: 0, + y0: 342.37008078133533, + }, + series: 28, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 28, + display: { + y: 0, + y0: 367.84302062609595, + }, + series: 28, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 28, + display: { + y: 0, + y0: 373.9932684133616, + }, + series: 28, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 28, + display: { + y: 0, + y0: 362.96108391063547, + }, + series: 28, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 28, + display: { + y: 0, + y0: 361.7963863019829, + }, + series: 28, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 28, + display: { + y: 0, + y0: 335.56659853838437, + }, + series: 28, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 28, + display: { + y: 0, + y0: 314.639571207276, + }, + series: 28, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 28, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 28, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 28, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 28, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 28, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 28, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 28, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 28, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 28, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 28, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 28, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 28, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 28, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 28, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 28, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 28, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 28, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 28, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 28, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 28, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 28, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 28, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 28, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 28, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 28, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 28, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 28, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 28, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 28, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 28, + }, + ], + }, + { + key: ['GG'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 29, + display: { + y: 0, + y0: 323.9812778912993, + }, + series: 29, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 29, + display: { + y: 0, + y0: 336.1762778912994, + }, + series: 29, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 29, + display: { + y: 0, + y0: 332.72127789129934, + }, + series: 29, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 29, + display: { + y: 0, + y0: 336.1057418579461, + }, + series: 29, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 29, + display: { + y: 0, + y0: 355.76073292228295, + }, + series: 29, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 29, + display: { + y: 0, + y0: 357.452200293436, + }, + series: 29, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 29, + display: { + y: 0, + y0: 348.78746735575066, + }, + series: 29, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 29, + display: { + y: 0, + y0: 339.76436707976166, + }, + series: 29, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 29, + display: { + y: 0, + y0: 352.9550172280039, + }, + series: 29, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 29, + display: { + y: 0, + y0: 345.7760219931503, + }, + series: 29, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 29, + display: { + y: 0, + y0: 339.004808184687, + }, + series: 29, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 29, + display: { + y: 0, + y0: 339.7363874586553, + }, + series: 29, + }, + { + x: 694224000000, + y: 0.04, + index: 12, + seriesIndex: 29, + display: { + y: 0.04, + y0: 342.6900376687394, + }, + series: 29, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 29, + display: { + y: 0, + y0: 337.40055311023565, + }, + series: 29, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 29, + display: { + y: 0, + y0: 348.29655475227185, + }, + series: 29, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 29, + display: { + y: 0, + y0: 349.43163363094624, + }, + series: 29, + }, + { + x: 820454400000, + y: 0, + index: 16, + seriesIndex: 29, + display: { + y: 0, + y0: 386.18008078133533, + }, + series: 29, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 29, + display: { + y: 0, + y0: 380.98302062609594, + }, + series: 29, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 29, + display: { + y: 0, + y0: 404.71326841336156, + }, + series: 29, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 29, + display: { + y: 0, + y0: 401.06108391063543, + }, + series: 29, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 29, + display: { + y: 0, + y0: 381.5563863019829, + }, + series: 29, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 29, + display: { + y: 0, + y0: 344.8065985383844, + }, + series: 29, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 29, + display: { + y: 0, + y0: 314.639571207276, + }, + series: 29, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 29, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 29, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 29, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 29, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 29, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 29, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 29, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 29, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 29, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 29, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 29, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 29, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 29, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 29, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 29, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 29, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 29, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 29, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 29, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 29, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 29, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 29, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 29, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 29, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 29, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 29, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 29, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 29, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 29, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 29, + }, + ], + }, + { + key: ['PCFX'], + values: [ + { + x: 315532800000, + y: 0, + index: 0, + seriesIndex: 30, + display: { + y: 0, + y0: 312.60127789129933, + }, + series: 30, + }, + { + x: 347155200000, + y: 0, + index: 1, + seriesIndex: 30, + display: { + y: 0, + y0: 300.40627789129934, + }, + series: 30, + }, + { + x: 378691200000, + y: 0, + index: 2, + seriesIndex: 30, + display: { + y: 0, + y0: 303.8612778912993, + }, + series: 30, + }, + { + x: 410227200000, + y: 0, + index: 3, + seriesIndex: 30, + display: { + y: 0, + y0: 319.31574185794614, + }, + series: 30, + }, + { + x: 441763200000, + y: 0, + index: 4, + seriesIndex: 30, + display: { + y: 0, + y0: 305.40073292228294, + }, + series: 30, + }, + { + x: 473385600000, + y: 0, + index: 5, + seriesIndex: 30, + display: { + y: 0, + y0: 303.56220029343604, + }, + series: 30, + }, + { + x: 504921600000, + y: 0, + index: 6, + seriesIndex: 30, + display: { + y: 0, + y0: 311.7174673557506, + }, + series: 30, + }, + { + x: 536457600000, + y: 0, + index: 7, + seriesIndex: 30, + display: { + y: 0, + y0: 318.02436707976165, + }, + series: 30, + }, + { + x: 567993600000, + y: 0, + index: 8, + seriesIndex: 30, + display: { + y: 0, + y0: 305.7650172280039, + }, + series: 30, + }, + { + x: 599616000000, + y: 0, + index: 9, + seriesIndex: 30, + display: { + y: 0, + y0: 272.3260219931503, + }, + series: 30, + }, + { + x: 631152000000, + y: 0, + index: 10, + seriesIndex: 30, + display: { + y: 0, + y0: 315.774808184687, + }, + series: 30, + }, + { + x: 662688000000, + y: 0, + index: 11, + seriesIndex: 30, + display: { + y: 0, + y0: 323.71638745865533, + }, + series: 30, + }, + { + x: 694224000000, + y: 0, + index: 12, + seriesIndex: 30, + display: { + y: 0, + y0: 302.57003766873936, + }, + series: 30, + }, + { + x: 725846400000, + y: 0, + index: 13, + seriesIndex: 30, + display: { + y: 0, + y0: 331.4305531102357, + }, + series: 30, + }, + { + x: 757382400000, + y: 0, + index: 14, + seriesIndex: 30, + display: { + y: 0, + y0: 323.0765547522718, + }, + series: 30, + }, + { + x: 788918400000, + y: 0, + index: 15, + seriesIndex: 30, + display: { + y: 0, + y0: 333.68163363094624, + }, + series: 30, + }, + { + x: 820454400000, + y: 0.03, + index: 16, + seriesIndex: 30, + display: { + y: 0.03, + y0: 342.34008078133536, + }, + series: 30, + }, + { + x: 852076800000, + y: 0, + index: 17, + seriesIndex: 30, + display: { + y: 0, + y0: 367.84302062609595, + }, + series: 30, + }, + { + x: 883612800000, + y: 0, + index: 18, + seriesIndex: 30, + display: { + y: 0, + y0: 373.9932684133616, + }, + series: 30, + }, + { + x: 915148800000, + y: 0, + index: 19, + seriesIndex: 30, + display: { + y: 0, + y0: 362.96108391063547, + }, + series: 30, + }, + { + x: 946684800000, + y: 0, + index: 20, + seriesIndex: 30, + display: { + y: 0, + y0: 361.7963863019829, + }, + series: 30, + }, + { + x: 978307200000, + y: 0, + index: 21, + seriesIndex: 30, + display: { + y: 0, + y0: 335.56659853838437, + }, + series: 30, + }, + { + x: 1009843200000, + y: 0, + index: 22, + seriesIndex: 30, + display: { + y: 0, + y0: 314.639571207276, + }, + series: 30, + }, + { + x: 1041379200000, + y: 0, + index: 23, + seriesIndex: 30, + display: { + y: 0, + y0: 315.64062695689177, + }, + series: 30, + }, + { + x: 1072915200000, + y: 0, + index: 24, + seriesIndex: 30, + display: { + y: 0, + y0: 329.7065490670251, + }, + series: 30, + }, + { + x: 1104537600000, + y: 0, + index: 25, + seriesIndex: 30, + display: { + y: 0, + y0: 340.01716034240894, + }, + series: 30, + }, + { + x: 1136073600000, + y: 0, + index: 26, + seriesIndex: 30, + display: { + y: 0, + y0: 320.9383968117778, + }, + series: 30, + }, + { + x: 1167609600000, + y: 0, + index: 27, + seriesIndex: 30, + display: { + y: 0, + y0: 333.94807151274165, + }, + series: 30, + }, + { + x: 1199145600000, + y: 0, + index: 28, + seriesIndex: 30, + display: { + y: 0, + y0: 331.1800000000006, + }, + series: 30, + }, + { + x: 1230768000000, + y: 0, + index: 29, + seriesIndex: 30, + display: { + y: 0, + y0: 323.57657904990293, + }, + series: 30, + }, + { + x: 1262304000000, + y: 0, + index: 30, + seriesIndex: 30, + display: { + y: 0, + y0: 353.63872327506743, + }, + series: 30, + }, + { + x: 1293840000000, + y: 0, + index: 31, + seriesIndex: 30, + display: { + y: 0, + y0: 346.7617397094945, + }, + series: 30, + }, + { + x: 1325376000000, + y: 0, + index: 32, + seriesIndex: 30, + display: { + y: 0, + y0: 355.2033114760125, + }, + series: 30, + }, + { + x: 1356998400000, + y: 0, + index: 33, + seriesIndex: 30, + display: { + y: 0, + y0: 347.01434975261475, + }, + series: 30, + }, + { + x: 1388534400000, + y: 0, + index: 34, + seriesIndex: 30, + display: { + y: 0, + y0: 356.1414727314012, + }, + series: 30, + }, + { + x: 1420070400000, + y: 0, + index: 35, + seriesIndex: 30, + display: { + y: 0, + y0: 352.9817622110564, + }, + series: 30, + }, + { + x: 1451606400000, + y: 0, + index: 36, + seriesIndex: 30, + display: { + y: 0, + y0: 323.31515851727374, + }, + series: 30, + }, + { + x: 1483228800000, + y: 0, + index: 37, + seriesIndex: 30, + display: { + y: 0, + y0: 293.5851585172737, + }, + series: 30, + }, + ], + }, + ], + applied_filters: [], + rejected_filters: [], + }, + ], + triggerQuery: false, + lastRendered: 0, + form_data: { + datasource: '20__table', + viz_type: 'area', + slice_id: 103, + url_params: { + preselect_filters: + '{"1389": {"platform": ["PS", "PS2", "PS3", "PS4"], "genre": null, "__time_range": "No filter"}}', + }, + granularity_sqla: 'year', + time_grain_sqla: null, + time_range: 'No filter', + metrics: [ + { + aggregate: 'SUM', + column: { + column_name: 'global_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 887, + is_dttm: false, + optionName: '_col_Global_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: false, + isNew: false, + label: 'SUM(Global_Sales)', + optionName: 'metric_ufl75addr8c_oqqhdumirpn', + sqlExpression: null, + }, + ], + adhoc_filters: [], + groupby: ['platform'], + order_desc: true, + contribution: false, + row_limit: null, + show_brush: 'auto', + show_legend: false, + line_interpolation: 'linear', + stacked_style: 'stream', + color_scheme: 'supersetColors', + rich_tooltip: true, + x_axis_label: 'Year Published', + bottom_margin: 'auto', + x_ticks_layout: 'auto', + x_axis_format: 'smart_date', + x_axis_showminmax: true, + y_axis_format: 'SMART_NUMBER', + y_axis_bounds: [null, null], + rolling_type: 'None', + comparison_type: 'values', + annotation_layers: [], + label_colors: { + '0': '#1FA8C9', + '1': '#454E7C', + '2600': '#666666', + '3DO': '#B2B2B2', + '3DS': '#D1C6BC', + Action: '#1FA8C9', + Adventure: '#454E7C', + DC: '#A38F79', + DS: '#8FD3E4', + Europe: '#5AC189', + Fighting: '#5AC189', + GB: '#FDE380', + GBA: '#ACE1C4', + GC: '#5AC189', + GEN: '#3CCCCB', + GG: '#EFA1AA', + Japan: '#FF7F44', + 'Microsoft Game Studios': '#D1C6BC', + Misc: '#FF7F44', + N64: '#1FA8C9', + NES: '#9EE5E5', + NG: '#A1A6BD', + Nintendo: '#D3B3DA', + 'North America': '#666666', + Other: '#E04355', + PC: '#EFA1AA', + PCFX: '#FDE380', + PS: '#A1A6BD', + PS2: '#FCC700', + PS3: '#3CCCCB', + PS4: '#B2B2B2', + PSP: '#FEC0A1', + PSV: '#FCC700', + Platform: '#666666', + Puzzle: '#E04355', + Racing: '#FCC700', + 'Role-Playing': '#A868B7', + SAT: '#A868B7', + SCD: '#8FD3E4', + SNES: '#454E7C', + Shooter: '#3CCCCB', + Simulation: '#A38F79', + Sports: '#8FD3E4', + Strategy: '#A1A6BD', + TG16: '#FEC0A1', + 'Take-Two Interactive': '#9EE5E5', + WS: '#ACE1C4', + Wii: '#A38F79', + WiiU: '#E04355', + X360: '#A868B7', + XB: '#D3B3DA', + XOne: '#FF7F44', + }, + queryFields: { + groupby: 'groupby', + metrics: 'metrics', + }, + }, + }, + '113': { + id: 113, + chartAlert: null, + chartStatus: 'rendered', + chartStackTrace: null, + chartUpdateEndTime: 1673047001005, + chartUpdateStartTime: 1673046994648, + latestQueryFormData: { + datasource: '20__table', + viz_type: 'dist_bar', + slice_id: 113, + url_params: {}, + granularity_sqla: 'year', + time_range: 'No filter', + metrics: [ + { + aggregate: 'SUM', + column: { + column_name: 'na_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 883, + is_dttm: false, + optionName: '_col_NA_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'North America', + optionName: 'metric_a943v7wg5g_0mm03hrsmpf', + sqlExpression: null, + }, + { + aggregate: 'SUM', + column: { + column_name: 'eu_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 884, + is_dttm: false, + optionName: '_col_EU_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'Europe', + optionName: 'metric_bibau54x0rb_dwrjtqkbyso', + sqlExpression: null, + }, + { + aggregate: 'SUM', + column: { + column_name: 'jp_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 885, + is_dttm: false, + optionName: '_col_JP_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'Japan', + optionName: 'metric_06whpr2oyhw_4l88xxu6zvd', + sqlExpression: null, + }, + { + aggregate: 'SUM', + column: { + column_name: 'other_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 886, + is_dttm: false, + optionName: '_col_Other_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'Other', + optionName: 'metric_pcx05ioxums_ibr16zvi74', + sqlExpression: null, + }, + ], + adhoc_filters: [ + { + clause: 'WHERE', + comparator: '10', + expressionType: 'SIMPLE', + filterOptionName: 'filter_juemdnqji5_d6fm8tuf4rc', + isExtra: false, + isNew: false, + operator: '<=', + sqlExpression: null, + subject: 'rank', + }, + ], + groupby: ['name'], + columns: [], + row_limit: null, + order_desc: true, + contribution: true, + color_scheme: 'supersetColors', + show_legend: true, + rich_tooltip: true, + bar_stacked: true, + y_axis_format: 'SMART_NUMBER', + y_axis_bounds: [null, null], + bottom_margin: 'auto', + x_ticks_layout: 'staggered', + queryFields: { + columns: 'groupby', + groupby: 'groupby', + metrics: 'metrics', + }, + shared_label_colors: {}, + extra_filters: [ + { + col: '__time_range', + op: '==', + val: 'No filter', + }, + ], + extra_form_data: {}, + dashboardId: 9, + }, + sliceFormData: null, + queryController: {}, + queriesResponse: [ + { + cache_key: '420a73a7c686ce86838126ba14e5c69a', + cached_dttm: null, + cache_timeout: 86400, + errors: [], + form_data: { + datasource: '20__table', + viz_type: 'dist_bar', + slice_id: 113, + url_params: {}, + granularity_sqla: 'year', + time_range: 'No filter', + metrics: [ + { + aggregate: 'SUM', + column: { + column_name: 'na_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 883, + is_dttm: false, + optionName: '_col_NA_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'North America', + optionName: 'metric_a943v7wg5g_0mm03hrsmpf', + sqlExpression: null, + }, + { + aggregate: 'SUM', + column: { + column_name: 'eu_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 884, + is_dttm: false, + optionName: '_col_EU_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'Europe', + optionName: 'metric_bibau54x0rb_dwrjtqkbyso', + sqlExpression: null, + }, + { + aggregate: 'SUM', + column: { + column_name: 'jp_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 885, + is_dttm: false, + optionName: '_col_JP_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'Japan', + optionName: 'metric_06whpr2oyhw_4l88xxu6zvd', + sqlExpression: null, + }, + { + aggregate: 'SUM', + column: { + column_name: 'other_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 886, + is_dttm: false, + optionName: '_col_Other_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'Other', + optionName: 'metric_pcx05ioxums_ibr16zvi74', + sqlExpression: null, + }, + ], + adhoc_filters: [ + { + clause: 'WHERE', + comparator: '10', + expressionType: 'SIMPLE', + filterOptionName: 'filter_juemdnqji5_d6fm8tuf4rc', + isExtra: false, + isNew: false, + operator: '<=', + sqlExpression: null, + subject: 'rank', + }, + ], + groupby: ['name'], + columns: [], + row_limit: null, + order_desc: true, + contribution: true, + color_scheme: 'supersetColors', + show_legend: true, + rich_tooltip: true, + bar_stacked: true, + y_axis_format: 'SMART_NUMBER', + y_axis_bounds: [null, null], + bottom_margin: 'auto', + x_ticks_layout: 'staggered', + queryFields: { + columns: 'groupby', + groupby: 'groupby', + metrics: 'metrics', + }, + shared_label_colors: {}, + dashboardId: 9, + applied_time_extras: {}, + where: '', + having: '', + having_filters: [], + filters: [ + { + col: 'rank', + op: '<=', + val: '10', + }, + ], + }, + is_cached: false, + query: + 'SELECT name AS name,\n sum(na_sales) AS "North America",\n sum(eu_sales) AS "Europe",\n sum(jp_sales) AS "Japan",\n sum(other_sales) AS "Other"\nFROM main.video_game_sales\nWHERE rank <= 10\nGROUP BY name\nORDER BY "North America" DESC\nLIMIT 50000\nOFFSET 0', + from_dttm: null, + to_dttm: null, + status: 'success', + stacktrace: null, + rowcount: 10, + colnames: ['name', 'North America', 'Europe', 'Japan', 'Other'], + coltypes: [1, 0, 0, 0, 0], + data: [ + { + key: 'North America', + values: [ + { + x: 'Wii Sports', + y: 0.5014503263234228, + y0: 0, + series: 0, + key: 'North America', + size: 0.5014503263234228, + y1: 0.5014503263234228, + }, + { + x: 'Super Mario Bros.', + y: 0.7226640159045725, + y0: 0, + series: 0, + key: 'North America', + size: 0.7226640159045725, + y1: 0.7226640159045725, + }, + { + x: 'Duck Hunt', + y: 0.9512539738608266, + y0: 0, + series: 0, + key: 'North America', + size: 0.9512539738608266, + y1: 0.9512539738608266, + }, + { + x: 'Tetris', + y: 0.7666886979510906, + y0: 0, + series: 0, + key: 'North America', + size: 0.7666886979510906, + y1: 0.7666886979510906, + }, + { + x: 'Mario Kart Wii', + y: 0.44236673178900354, + y0: 0, + series: 0, + key: 'North America', + size: 0.44236673178900354, + y1: 0.44236673178900354, + }, + { + x: 'Wii Sports Resort', + y: 0.4772727272727273, + y0: 0, + series: 0, + key: 'North America', + size: 0.4772727272727273, + y1: 0.4772727272727273, + }, + { + x: 'New Super Mario Bros. Wii', + y: 0.5099615519049283, + y0: 0, + series: 0, + key: 'North America', + size: 0.5099615519049283, + y1: 0.5099615519049283, + }, + { + x: 'Wii Play', + y: 0.4836263357462944, + y0: 0, + series: 0, + key: 'North America', + size: 0.4836263357462944, + y1: 0.4836263357462944, + }, + { + x: 'New Super Mario Bros.', + y: 0.3792069310229924, + y0: 0, + series: 0, + key: 'North America', + size: 0.3792069310229924, + y1: 0.3792069310229924, + }, + { + x: 'Pokemon Red/Pokemon Blue', + y: 0.3591459528362014, + y0: 0, + series: 0, + key: 'North America', + size: 0.3591459528362014, + y1: 0.3591459528362014, + }, + ], + }, + { + key: 'Europe', + values: [ + { + x: 'Wii Sports', + y: 0.3507372492144065, + y0: 0.5014503263234228, + series: 1, + key: 'Europe', + size: 0.3507372492144065, + y1: 0.8521875755378293, + }, + { + x: 'Super Mario Bros.', + y: 0.0889662027833002, + y0: 0.7226640159045725, + series: 1, + key: 'Europe', + size: 0.0889662027833002, + y1: 0.8116302186878728, + }, + { + x: 'Duck Hunt', + y: 0.022253620628753093, + y0: 0.9512539738608266, + series: 1, + key: 'Europe', + size: 0.022253620628753093, + y1: 0.9735075944895797, + }, + { + x: 'Tetris', + y: 0.07468605419695969, + y0: 0.7666886979510906, + series: 1, + key: 'Europe', + size: 0.07468605419695969, + y1: 0.8413747521480504, + }, + { + x: 'Mario Kart Wii', + y: 0.35947530002790956, + y0: 0.44236673178900354, + series: 1, + key: 'Europe', + size: 0.35947530002790956, + y1: 0.801842031816913, + }, + { + x: 'Wii Sports Resort', + y: 0.3336363636363636, + y0: 0.4772727272727273, + series: 1, + key: 'Europe', + size: 0.3336363636363636, + y1: 0.8109090909090909, + }, + { + x: 'New Super Mario Bros. Wii', + y: 0.24676686473261097, + y0: 0.5099615519049283, + series: 1, + key: 'Europe', + size: 0.24676686473261097, + y1: 0.7567284166375393, + }, + { + x: 'Wii Play', + y: 0.31713202344019303, + y0: 0.4836263357462944, + series: 1, + key: 'Europe', + size: 0.31713202344019303, + y1: 0.8007583591864874, + }, + { + x: 'New Super Mario Bros.', + y: 0.30756414528490506, + y0: 0.3792069310229924, + series: 1, + key: 'Europe', + size: 0.30756414528490506, + y1: 0.6867710763078975, + }, + { + x: 'Pokemon Red/Pokemon Blue', + y: 0.28330146590184835, + y0: 0.3591459528362014, + series: 1, + key: 'Europe', + size: 0.28330146590184835, + y1: 0.6424474187380498, + }, + ], + }, + { + key: 'Japan', + values: [ + { + x: 'Wii Sports', + y: 0.04556441866086536, + y0: 0.8521875755378293, + series: 2, + key: 'Japan', + size: 0.04556441866086536, + y1: 0.8977519941986947, + }, + { + x: 'Super Mario Bros.', + y: 0.169234592445328, + y0: 0.8116302186878728, + series: 2, + key: 'Japan', + size: 0.169234592445328, + y1: 0.9808648111332008, + }, + { + x: 'Duck Hunt', + y: 0.009890498057223597, + y0: 0.9735075944895797, + series: 2, + key: 'Japan', + size: 0.009890498057223597, + y1: 0.9833980925468033, + }, + { + x: 'Tetris', + y: 0.1394580304031725, + y0: 0.8413747521480504, + series: 2, + key: 'Japan', + size: 0.1394580304031725, + y1: 0.9808327825512229, + }, + { + x: 'Mario Kart Wii', + y: 0.1057772816075914, + y0: 0.801842031816913, + series: 2, + key: 'Japan', + size: 0.1057772816075914, + y1: 0.9076193134245044, + }, + { + x: 'Wii Sports Resort', + y: 0.09939393939393938, + y0: 0.8109090909090909, + series: 2, + key: 'Japan', + size: 0.09939393939393938, + y1: 0.9103030303030303, + }, + { + x: 'New Super Mario Bros. Wii', + y: 0.16427822439706397, + y0: 0.7567284166375393, + series: 2, + key: 'Japan', + size: 0.16427822439706397, + y1: 0.9210066410346033, + }, + { + x: 'Wii Play', + y: 0.10099965529127888, + y0: 0.8007583591864874, + series: 2, + key: 'Japan', + size: 0.10099965529127888, + y1: 0.9017580144777663, + }, + { + x: 'New Super Mario Bros.', + y: 0.21659446851049652, + y0: 0.6867710763078975, + series: 2, + key: 'Japan', + size: 0.21659446851049652, + y1: 0.9033655448183939, + }, + { + x: 'Pokemon Red/Pokemon Blue', + y: 0.32568514977692803, + y0: 0.6424474187380498, + series: 2, + key: 'Japan', + size: 0.32568514977692803, + y1: 0.9681325685149778, + }, + ], + }, + { + key: 'Other', + values: [ + { + x: 'Wii Sports', + y: 0.10224800580130529, + y0: 0.8977519941986947, + series: 3, + key: 'Other', + size: 0.10224800580130529, + y1: 1, + }, + { + x: 'Super Mario Bros.', + y: 0.019135188866799203, + y0: 0.9808648111332008, + series: 3, + key: 'Other', + size: 0.019135188866799203, + y1: 1, + }, + { + x: 'Duck Hunt', + y: 0.01660190745319675, + y0: 0.9833980925468033, + series: 3, + key: 'Other', + size: 0.01660190745319675, + y1: 1, + }, + { + x: 'Tetris', + y: 0.019167217448777262, + y0: 0.9808327825512229, + series: 3, + key: 'Other', + size: 0.019167217448777262, + y1: 1.0000000000000002, + }, + { + x: 'Mario Kart Wii', + y: 0.09238068657549538, + y0: 0.9076193134245044, + series: 3, + key: 'Other', + size: 0.09238068657549538, + y1: 0.9999999999999998, + }, + { + x: 'Wii Sports Resort', + y: 0.08969696969696969, + y0: 0.9103030303030303, + series: 3, + key: 'Other', + size: 0.08969696969696969, + y1: 1, + }, + { + x: 'New Super Mario Bros. Wii', + y: 0.0789933589653967, + y0: 0.9210066410346033, + series: 3, + key: 'Other', + size: 0.0789933589653967, + y1: 1, + }, + { + x: 'Wii Play', + y: 0.09824198552223372, + y0: 0.9017580144777663, + series: 3, + key: 'Other', + size: 0.09824198552223372, + y1: 1, + }, + { + x: 'New Super Mario Bros.', + y: 0.09663445518160614, + y0: 0.9033655448183939, + series: 3, + key: 'Other', + size: 0.09663445518160614, + y1: 1, + }, + { + x: 'Pokemon Red/Pokemon Blue', + y: 0.03186743148502231, + y0: 0.9681325685149778, + series: 3, + key: 'Other', + size: 0.03186743148502231, + y1: 1, + }, + ], + }, + ], + applied_filters: [ + { + column: 'rank', + }, + ], + rejected_filters: [], + }, + ], + triggerQuery: false, + lastRendered: 0, + form_data: { + datasource: '20__table', + viz_type: 'dist_bar', + slice_id: 113, + url_params: {}, + granularity_sqla: 'year', + time_range: 'No filter', + metrics: [ + { + aggregate: 'SUM', + column: { + column_name: 'na_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 883, + is_dttm: false, + optionName: '_col_NA_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'North America', + optionName: 'metric_a943v7wg5g_0mm03hrsmpf', + sqlExpression: null, + }, + { + aggregate: 'SUM', + column: { + column_name: 'eu_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 884, + is_dttm: false, + optionName: '_col_EU_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'Europe', + optionName: 'metric_bibau54x0rb_dwrjtqkbyso', + sqlExpression: null, + }, + { + aggregate: 'SUM', + column: { + column_name: 'jp_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 885, + is_dttm: false, + optionName: '_col_JP_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'Japan', + optionName: 'metric_06whpr2oyhw_4l88xxu6zvd', + sqlExpression: null, + }, + { + aggregate: 'SUM', + column: { + column_name: 'other_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 886, + is_dttm: false, + optionName: '_col_Other_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'Other', + optionName: 'metric_pcx05ioxums_ibr16zvi74', + sqlExpression: null, + }, + ], + adhoc_filters: [ + { + clause: 'WHERE', + comparator: '10', + expressionType: 'SIMPLE', + filterOptionName: 'filter_juemdnqji5_d6fm8tuf4rc', + isExtra: false, + isNew: false, + operator: '<=', + sqlExpression: null, + subject: 'rank', + }, + ], + groupby: ['name'], + columns: [], + row_limit: null, + order_desc: true, + contribution: true, + color_scheme: 'supersetColors', + show_legend: true, + rich_tooltip: true, + bar_stacked: true, + y_axis_format: 'SMART_NUMBER', + y_axis_bounds: [null, null], + bottom_margin: 'auto', + x_ticks_layout: 'staggered', + label_colors: {}, + queryFields: { + columns: 'groupby', + groupby: 'groupby', + metrics: 'metrics', + }, + }, + }, + '120': { + id: 120, + chartAlert: null, + chartStatus: 'loading', + chartStackTrace: null, + chartUpdateEndTime: null, + chartUpdateStartTime: 0, + latestQueryFormData: {}, + sliceFormData: null, + queryController: null, + queriesResponse: null, + triggerQuery: true, + lastRendered: 0, + form_data: { + datasource: '20__table', + viz_type: 'dist_bar', + slice_id: 120, + url_params: { + preselect_filters: + '{"1389": {"platform": ["PS", "PS2", "PS3", "PS4"], "genre": null, "__time_range": "No filter"}}', + }, + granularity_sqla: 'year', + time_range: 'No filter', + metrics: [ + { + aggregate: 'SUM', + column: { + column_name: 'na_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 883, + is_dttm: false, + optionName: '_col_NA_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'North America', + optionName: 'metric_3pl6jwmyd72_p9o4j2xxgyp', + sqlExpression: null, + }, + { + aggregate: 'SUM', + column: { + column_name: 'eu_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 884, + is_dttm: false, + optionName: '_col_EU_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'Europe', + optionName: 'metric_e8rdyfxxjdu_6dgyhf7xcne', + sqlExpression: null, + }, + { + aggregate: 'SUM', + column: { + column_name: 'jp_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 885, + is_dttm: false, + optionName: '_col_JP_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'Japan', + optionName: 'metric_6gesefugzy6_517l3wowdwu', + sqlExpression: null, + }, + { + aggregate: 'SUM', + column: { + column_name: 'other_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 886, + is_dttm: false, + optionName: '_col_Other_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: true, + isNew: false, + label: 'Other', + optionName: 'metric_cf6kbre28f_2sg5b5pfq5a', + sqlExpression: null, + }, + ], + adhoc_filters: [], + groupby: ['genre'], + columns: [], + row_limit: null, + order_desc: true, + contribution: false, + color_scheme: 'supersetColors', + show_legend: true, + show_bar_value: false, + rich_tooltip: true, + bar_stacked: true, + order_bars: false, + y_axis_format: 'SMART_NUMBER', + show_controls: true, + y_axis_bounds: [null, null], + x_axis_label: 'Genre', + bottom_margin: 'auto', + x_ticks_layout: 'flat', + label_colors: { + '0': '#1FA8C9', + '1': '#454E7C', + '2600': '#666666', + '3DO': '#B2B2B2', + '3DS': '#D1C6BC', + Action: '#1FA8C9', + Adventure: '#454E7C', + DC: '#A38F79', + DS: '#8FD3E4', + Europe: '#5AC189', + Fighting: '#5AC189', + GB: '#FDE380', + GBA: '#ACE1C4', + GC: '#5AC189', + GEN: '#3CCCCB', + GG: '#EFA1AA', + Japan: '#FF7F44', + 'Microsoft Game Studios': '#D1C6BC', + Misc: '#FF7F44', + N64: '#1FA8C9', + NES: '#9EE5E5', + NG: '#A1A6BD', + Nintendo: '#D3B3DA', + 'North America': '#666666', + Other: '#E04355', + PC: '#EFA1AA', + PCFX: '#FDE380', + PS: '#A1A6BD', + PS2: '#FCC700', + PS3: '#3CCCCB', + PS4: '#B2B2B2', + PSP: '#FEC0A1', + PSV: '#FCC700', + Platform: '#666666', + Puzzle: '#E04355', + Racing: '#FCC700', + 'Role-Playing': '#A868B7', + SAT: '#A868B7', + SCD: '#8FD3E4', + SNES: '#454E7C', + Shooter: '#3CCCCB', + Simulation: '#A38F79', + Sports: '#8FD3E4', + Strategy: '#A1A6BD', + TG16: '#FEC0A1', + 'Take-Two Interactive': '#9EE5E5', + WS: '#ACE1C4', + Wii: '#A38F79', + WiiU: '#E04355', + X360: '#A868B7', + XB: '#D3B3DA', + XOne: '#FF7F44', + }, + queryFields: { + columns: 'groupby', + groupby: 'groupby', + metrics: 'metrics', + }, + }, + }, + '123': { + id: 123, + chartAlert: null, + chartStatus: 'rendered', + chartStackTrace: null, + chartUpdateEndTime: 1673046998143, + chartUpdateStartTime: 1673046994604, + latestQueryFormData: { + datasource: '20__table', + viz_type: 'pie', + slice_id: 123, + url_params: {}, + granularity_sqla: 'year', + time_range: 'No filter', + groupby: ['publisher'], + metric: { + aggregate: 'SUM', + column: { + column_name: 'global_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 887, + is_dttm: false, + optionName: '_col_Global_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: false, + isNew: false, + label: 'SUM(Global_Sales)', + optionName: 'metric_k2rqz0zqhkf_49hu4kq9h3u', + sqlExpression: null, + }, + adhoc_filters: [ + { + clause: 'WHERE', + comparator: '25', + expressionType: 'SIMPLE', + filterOptionName: 'filter_znxs4o61aod_n5blgxo29r', + isExtra: false, + isNew: false, + operator: '<=', + sqlExpression: null, + subject: 'rank', + }, + ], + row_limit: null, + sort_by_metric: true, + color_scheme: 'supersetColors', + show_labels_threshold: 5, + show_legend: false, + legendType: 'scroll', + legendOrientation: 'top', + label_type: 'key', + number_format: 'SMART_NUMBER', + date_format: 'smart_date', + show_labels: true, + labels_outside: true, + label_line: true, + outerRadius: 67, + donut: true, + innerRadius: 45, + queryFields: { + groupby: 'groupby', + metric: 'metrics', + }, + label_colors: { + '0': '#1FA8C9', + '1': '#454E7C', + '2600': '#666666', + Europe: '#5AC189', + Japan: '#FF7F44', + 'North America': '#666666', + Other: '#E04355', + PS2: '#FCC700', + X360: '#A868B7', + PS3: '#3CCCCB', + Wii: '#A38F79', + DS: '#8FD3E4', + PS: '#A1A6BD', + GBA: '#ACE1C4', + PSP: '#FEC0A1', + PS4: '#B2B2B2', + PC: '#EFA1AA', + GB: '#FDE380', + XB: '#D3B3DA', + NES: '#9EE5E5', + '3DS': '#D1C6BC', + N64: '#1FA8C9', + SNES: '#454E7C', + GC: '#5AC189', + XOne: '#FF7F44', + WiiU: '#E04355', + PSV: '#FCC700', + SAT: '#A868B7', + GEN: '#3CCCCB', + DC: '#A38F79', + SCD: '#8FD3E4', + NG: '#A1A6BD', + WS: '#ACE1C4', + TG16: '#FEC0A1', + '3DO': '#B2B2B2', + GG: '#EFA1AA', + PCFX: '#FDE380', + Nintendo: '#D3B3DA', + 'Take-Two Interactive': '#9EE5E5', + 'Microsoft Game Studios': '#D1C6BC', + Action: '#1FA8C9', + Adventure: '#454E7C', + Fighting: '#5AC189', + Misc: '#FF7F44', + Platform: '#666666', + Puzzle: '#E04355', + Racing: '#FCC700', + 'Role-Playing': '#A868B7', + Shooter: '#3CCCCB', + Simulation: '#A38F79', + Sports: '#8FD3E4', + Strategy: '#A1A6BD', + }, + shared_label_colors: {}, + extra_filters: [ + { + col: '__time_range', + op: '==', + val: 'No filter', + }, + ], + extra_form_data: {}, + dashboardId: 9, + }, + sliceFormData: null, + queryController: {}, + queriesResponse: [ + { + cache_key: '18929e0056e248f9ae6e413e91a3e0ef', + cached_dttm: null, + cache_timeout: 86400, + applied_template_filters: [], + annotation_data: {}, + error: null, + is_cached: null, + query: + 'SELECT publisher AS publisher,\n sum(global_sales) AS "SUM(Global_Sales)"\nFROM main.video_game_sales\nWHERE rank <= 25\nGROUP BY publisher\nORDER BY "SUM(Global_Sales)" DESC\nLIMIT 50000\nOFFSET 0;\n\n', + status: 'success', + stacktrace: null, + rowcount: 3, + from_dttm: null, + to_dttm: null, + label_map: { + publisher: ['publisher'], + 'SUM(Global_Sales)': ['SUM(Global_Sales)'], + }, + colnames: ['publisher', 'SUM(Global_Sales)'], + indexnames: [0, 1, 2], + coltypes: [1, 0], + data: [ + { + publisher: 'Nintendo', + 'SUM(Global_Sales)': 580, + }, + { + publisher: 'Take-Two Interactive', + 'SUM(Global_Sales)': 74.73999999999998, + }, + { + publisher: 'Microsoft Game Studios', + 'SUM(Global_Sales)': 21.82, + }, + ], + result_format: 'json', + applied_filters: [ + { + column: 'rank', + }, + { + column: '__time_range', + }, + ], + rejected_filters: [], + }, + ], + triggerQuery: false, + lastRendered: 0, + form_data: { + datasource: '20__table', + viz_type: 'pie', + slice_id: 123, + url_params: {}, + granularity_sqla: 'year', + time_range: 'No filter', + groupby: ['publisher'], + metric: { + aggregate: 'SUM', + column: { + column_name: 'global_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 887, + is_dttm: false, + optionName: '_col_Global_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: false, + isNew: false, + label: 'SUM(Global_Sales)', + optionName: 'metric_k2rqz0zqhkf_49hu4kq9h3u', + sqlExpression: null, + }, + adhoc_filters: [ + { + clause: 'WHERE', + comparator: '25', + expressionType: 'SIMPLE', + filterOptionName: 'filter_znxs4o61aod_n5blgxo29r', + isExtra: false, + isNew: false, + operator: '<=', + sqlExpression: null, + subject: 'rank', + }, + ], + row_limit: null, + sort_by_metric: true, + color_scheme: 'supersetColors', + show_labels_threshold: 5, + show_legend: false, + legendType: 'scroll', + legendOrientation: 'top', + label_type: 'key', + number_format: 'SMART_NUMBER', + date_format: 'smart_date', + show_labels: true, + labels_outside: true, + label_line: true, + outerRadius: 67, + donut: true, + innerRadius: 45, + queryFields: { + groupby: 'groupby', + metric: 'metrics', + }, + }, + }, + '125': { + id: 125, + chartAlert: null, + chartStatus: 'rendered', + chartStackTrace: null, + chartUpdateEndTime: 1673046997626, + chartUpdateStartTime: 1673046994618, + latestQueryFormData: { + datasource: '20__table', + viz_type: 'treemap', + slice_id: 125, + url_params: {}, + granularity_sqla: 'year', + time_range: 'No filter', + metrics: ['count'], + adhoc_filters: [], + groupby: ['platform'], + row_limit: 10, + order_desc: true, + color_scheme: 'supersetColors', + treemap_ratio: 1.618033988749895, + number_format: 'SMART_NUMBER', + queryFields: { + groupby: 'groupby', + metrics: 'metrics', + }, + shared_label_colors: {}, + extra_filters: [ + { + col: '__time_range', + op: '==', + val: 'No filter', + }, + ], + dashboardId: 9, + }, + sliceFormData: null, + queryController: {}, + queriesResponse: [ + { + cache_key: '9a7e15121b29cddbb238559d031557df', + cached_dttm: null, + cache_timeout: 86400, + errors: [], + form_data: { + datasource: '20__table', + viz_type: 'treemap', + slice_id: 125, + url_params: {}, + granularity_sqla: 'year', + time_range: 'No filter', + metrics: ['count'], + adhoc_filters: [], + groupby: ['platform'], + row_limit: 10, + order_desc: true, + color_scheme: 'supersetColors', + treemap_ratio: 1.618033988749895, + number_format: 'SMART_NUMBER', + queryFields: { + groupby: 'groupby', + metrics: 'metrics', + }, + shared_label_colors: {}, + dashboardId: 9, + applied_time_extras: {}, + where: '', + having: '', + having_filters: [], + filters: [], + }, + is_cached: false, + query: + 'SELECT platform AS platform,\n COUNT(*) AS count\nFROM main.video_game_sales\nGROUP BY platform\nLIMIT 10\nOFFSET 0', + from_dttm: null, + to_dttm: null, + status: 'success', + stacktrace: null, + rowcount: 10, + colnames: ['platform', 'count'], + coltypes: [1, 0], + data: [ + { + name: 'count', + children: [ + { + name: '2600', + value: 133, + }, + { + name: '3DO', + value: 3, + }, + { + name: '3DS', + value: 509, + }, + { + name: 'DC', + value: 52, + }, + { + name: 'DS', + value: 2162, + }, + { + name: 'GB', + value: 98, + }, + { + name: 'GBA', + value: 822, + }, + { + name: 'GC', + value: 556, + }, + { + name: 'GEN', + value: 27, + }, + { + name: 'GG', + value: 1, + }, + ], + }, + ], + applied_filters: [], + rejected_filters: [], + }, + ], + triggerQuery: false, + lastRendered: 0, + form_data: { + datasource: '20__table', + viz_type: 'treemap', + slice_id: 125, + url_params: {}, + granularity_sqla: 'year', + time_range: 'No filter', + metrics: ['count'], + adhoc_filters: [], + groupby: ['platform'], + row_limit: 10, + order_desc: true, + color_scheme: 'supersetColors', + treemap_ratio: 1.618033988749895, + number_format: 'SMART_NUMBER', + label_colors: { + '2600': '#D1C6BC', + '3DO': '#A38F79', + '3DS': '#B2B2B2', + Action: '#ACE1C4', + Adventure: '#5AC189', + 'COUNT(*)': '#1FA8C9', + DC: '#666666', + DS: '#E04355', + Fighting: '#D1C6BC', + GB: '#A1A6BD', + GBA: '#A868B7', + GC: '#D3B3DA', + GEN: '#FF7F44', + GG: '#8FD3E4', + 'Microsoft Game Studios': '#FCC700', + Misc: '#D3B3DA', + N64: '#EFA1AA', + NES: '#FEC0A1', + NG: '#FCC700', + Nintendo: '#666666', + PC: '#8FD3E4', + PCFX: '#A1A6BD', + PS: '#FCC700', + PS2: '#454E7C', + PS3: '#FF7F44', + PS4: '#A38F79', + PSP: '#3CCCCB', + PSV: '#454E7C', + Platform: '#FDE380', + Puzzle: '#454E7C', + Racing: '#9EE5E5', + 'Role-Playing': '#EFA1AA', + SAT: '#5AC189', + SCD: '#E04355', + SNES: '#FDE380', + Shooter: '#B2B2B2', + Simulation: '#1FA8C9', + Sports: '#FEC0A1', + Strategy: '#FF7F44', + TG16: '#3CCCCB', + 'Take-Two Interactive': '#E04355', + WS: '#A868B7', + Wii: '#666666', + WiiU: '#1FA8C9', + X360: '#5AC189', + XB: '#ACE1C4', + XOne: '#9EE5E5', + }, + queryFields: { + groupby: 'groupby', + metrics: 'metrics', + }, + }, + }, + '127': { + id: 127, + chartAlert: null, + chartStatus: 'loading', + chartStackTrace: null, + chartUpdateEndTime: null, + chartUpdateStartTime: 0, + latestQueryFormData: {}, + sliceFormData: null, + queryController: null, + queriesResponse: null, + triggerQuery: true, + lastRendered: 0, + form_data: { + datasource: '20__table', + viz_type: 'filter_box', + slice_id: 127, + url_params: { + preselect_filters: + '{"1389": {"platform": ["PS", "PS2", "PS3", "PS4"], "genre": null, "__time_range": "No filter"}}', + }, + granularity_sqla: 'Year', + time_range: 'No filter', + filter_configs: [ + { + asc: true, + clearable: true, + column: 'platform', + key: 's3ItH9vhG', + label: 'Platform', + multiple: true, + searchAllOptions: false, + }, + { + asc: true, + clearable: true, + column: 'genre', + key: '202hDeMsG', + label: 'Genre', + multiple: true, + searchAllOptions: false, + }, + { + asc: true, + clearable: true, + column: 'publisher', + key: '5Os6jsJFK', + label: 'Publisher', + multiple: true, + searchAllOptions: false, + }, + ], + date_filter: true, + adhoc_filters: [], + queryFields: {}, + }, + }, + '131': { + id: 131, + chartAlert: null, + chartStatus: 'loading', + chartStackTrace: null, + chartUpdateEndTime: null, + chartUpdateStartTime: 0, + latestQueryFormData: {}, + sliceFormData: null, + queryController: null, + queriesResponse: null, + triggerQuery: true, + lastRendered: 0, + form_data: { + datasource: '20__table', + viz_type: 'treemap', + slice_id: 131, + url_params: { + preselect_filters: + '{"1389": {"platform": ["PS", "PS2", "PS3", "PS4"], "genre": null, "__time_range": "No filter"}}', + }, + granularity_sqla: 'year', + time_range: 'No filter', + metrics: ['count'], + adhoc_filters: [], + groupby: ['genre'], + row_limit: null, + order_desc: true, + color_scheme: 'supersetColors', + treemap_ratio: 1.618033988749895, + number_format: 'SMART_NUMBER', + label_colors: { + '0': '#1FA8C9', + '1': '#454E7C', + '2600': '#666666', + '3DO': '#B2B2B2', + '3DS': '#D1C6BC', + Action: '#1FA8C9', + Adventure: '#454E7C', + DC: '#A38F79', + DS: '#8FD3E4', + Europe: '#5AC189', + Fighting: '#5AC189', + GB: '#FDE380', + GBA: '#ACE1C4', + GC: '#5AC189', + GEN: '#3CCCCB', + GG: '#EFA1AA', + Japan: '#FF7F44', + 'Microsoft Game Studios': '#D1C6BC', + Misc: '#FF7F44', + N64: '#1FA8C9', + NES: '#9EE5E5', + NG: '#A1A6BD', + Nintendo: '#D3B3DA', + 'North America': '#666666', + Other: '#E04355', + PC: '#EFA1AA', + PCFX: '#FDE380', + PS: '#A1A6BD', + PS2: '#FCC700', + PS3: '#3CCCCB', + PS4: '#B2B2B2', + PSP: '#FEC0A1', + PSV: '#FCC700', + Platform: '#666666', + Puzzle: '#E04355', + Racing: '#FCC700', + 'Role-Playing': '#A868B7', + SAT: '#A868B7', + SCD: '#8FD3E4', + SNES: '#454E7C', + Shooter: '#3CCCCB', + Simulation: '#A38F79', + Sports: '#8FD3E4', + Strategy: '#A1A6BD', + TG16: '#FEC0A1', + 'Take-Two Interactive': '#9EE5E5', + WS: '#ACE1C4', + Wii: '#A38F79', + WiiU: '#E04355', + X360: '#A868B7', + XB: '#D3B3DA', + XOne: '#FF7F44', + }, + queryFields: { + groupby: 'groupby', + metrics: 'metrics', + }, + }, + }, + '132': { + id: 132, + chartAlert: null, + chartStatus: 'loading', + chartStackTrace: null, + chartUpdateEndTime: null, + chartUpdateStartTime: 0, + latestQueryFormData: {}, + sliceFormData: null, + queryController: null, + queriesResponse: null, + triggerQuery: true, + lastRendered: 0, + form_data: { + datasource: '20__table', + viz_type: 'table', + slice_id: 132, + url_params: {}, + granularity_sqla: 'year', + time_grain_sqla: 'P1D', + time_range: 'No filter', + query_mode: 'raw', + groupby: ['name'], + metrics: [ + { + aggregate: 'SUM', + column: { + column_name: 'global_sales', + description: null, + expression: null, + filterable: true, + groupby: true, + id: 887, + is_dttm: false, + optionName: '_col_Global_Sales', + python_date_format: null, + type: 'DOUBLE PRECISION', + verbose_name: null, + }, + expressionType: 'SIMPLE', + hasCustomLabel: false, + isNew: false, + label: 'SUM(Global_Sales)', + optionName: 'metric_pkpvgdsf70d_pnqv77v0x2p', + sqlExpression: null, + }, + ], + all_columns: [ + 'name', + 'global_sales', + 'platform', + 'genre', + 'publisher', + 'year', + ], + percent_metrics: [], + adhoc_filters: [], + order_by_cols: ['["global_sales", false]'], + row_limit: null, + server_page_length: 10, + order_desc: true, + table_timestamp_format: 'smart_date', + page_length: '15', + include_search: true, + show_cell_bars: false, + color_pn: false, + queryFields: { + groupby: 'groupby', + metrics: 'metrics', + }, + table_filter: false, + }, + }, + }; + + const validNodes = [ + 'ROOT_ID', + 'TABS-97PVJa11D_', + 'TAB-2_QXp8aNq', + 'ROW-fjg6YQBkH', + 'CHART-1L7NIcXvVN', + 'ROW-yP9SB89PZ', + 'CHART-7mKdnU7OUJ', + 'TAB-lg-5ymUDgm', + 'ROW-7kAf1blYU', + 'CHART-8OG3UJX-Tn', + 'CHART-W02beJK7ms', + 'CHART-XFag0yZdLk', + 'ROW-NuR8GFQTO', + 'CHART-XRvRfsMsaQ', + 'CHART-XVIYTeubZh', + 'CHART-_sx22yawJO', + 'CHART-nYns6xr4Ft', + 'COLUMN-F53B1OSMcz', + 'CHART-uP9GF0z0rT', + 'ROW-XT1DsNA_V', + 'CHART-wt6ZO8jRXZ', + ]; + + const initiallyExcludedCharts: number[] = []; + it('Succeeds with valid', () => { + expect(() => { + buildTree( + // @ts-ignore + node, + treeItem, + layout, + charts, + validNodes, + initiallyExcludedCharts, + () => 'Fake title', + ); + }).not.toThrowError(); + }); + + it('Avoids runtime error with invalid inputs', () => { + expect(() => { + buildTree( + // @ts-expect-error + undefined, + treeItem, + layout, + charts, + validNodes, + initiallyExcludedCharts, + () => 'Fake title', + ); + }).not.toThrowError(); + + expect(() => { + buildTree( + // @ts-expect-error + node, + null, + layout, + charts, + validNodes, + initiallyExcludedCharts, + () => 'Fake title', + ); + }).not.toThrowError(); + + expect(() => { + buildTree( + // @ts-expect-error + node, + treeItem, + null, + charts, + validNodes, + initiallyExcludedCharts, + () => 'Fake title', + ); + }).not.toThrowError(); + + expect(() => { + buildTree( + // @ts-expect-error + node, + treeItem, + layout, + null, + validNodes, + initiallyExcludedCharts, + () => 'Fake title', + ); + }).not.toThrowError(); + + expect(() => { + buildTree( + // @ts-expect-error + node, + treeItem, + layout, + charts, + null, + initiallyExcludedCharts, + () => 'Fake title', + ); + }).not.toThrowError(); + + expect(() => { + buildTree( + // @ts-expect-error + node, + treeItem, + layout, + charts, + validNodes, + null, + () => 'Fake title', + ); + }).not.toThrowError(); + }); +}); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.ts b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.ts index 4bf04c7e957b..347da2d2ca68 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.ts @@ -23,12 +23,20 @@ import { TAB_TYPE, } from 'src/dashboard/util/componentTypes'; import { DASHBOARD_ROOT_ID } from 'src/dashboard/util/constants'; -import { NativeFilterScope, t } from '@superset-ui/core'; +import { logging, NativeFilterScope, t } from '@superset-ui/core'; import { BuildTreeLeafTitle, TreeItem } from './types'; export const isShowTypeInTree = ({ type, meta }: LayoutItem, charts?: Charts) => (type === TAB_TYPE || type === CHART_TYPE || type === DASHBOARD_ROOT_TYPE) && - (!charts || charts[meta?.chartId]?.formData?.viz_type !== 'filter_box'); + (!charts || charts[meta?.chartId]?.form_data?.viz_type !== 'filter_box'); + +export const getNodeTitle = (node: LayoutItem) => + node?.meta?.sliceNameOverride ?? + node?.meta?.sliceName ?? + node?.meta?.text ?? + node?.meta?.defaultText ?? + node?.id?.toString?.() ?? + ''; export const buildTree = ( node: LayoutItem, @@ -41,17 +49,15 @@ export const buildTree = ( ) => { let itemToPass: TreeItem = treeItem; if ( + node && + treeItem && isShowTypeInTree(node, charts) && node.type !== DASHBOARD_ROOT_TYPE && - validNodes.includes(node.id) + validNodes?.includes?.(node.id) ) { const title = buildTreeLeafTitle( - node.meta.sliceNameOverride || - node.meta.sliceName || - node.meta.text || - node.meta.defaultText || - node.id.toString(), - initiallyExcludedCharts.includes(node.meta?.chartId), + getNodeTitle(node), + initiallyExcludedCharts?.includes?.(node.meta?.chartId), t( "This chart might be incompatible with the filter (datasets don't match)", ), @@ -65,17 +71,24 @@ export const buildTree = ( treeItem.children.push(currentTreeItem); itemToPass = currentTreeItem; } - node.children.forEach(child => - buildTree( - layout[child], - itemToPass, - layout, - charts, - validNodes, - initiallyExcludedCharts, - buildTreeLeafTitle, - ), - ); + node?.children?.forEach?.(child => { + const node = layout?.[child]; + if (node) { + buildTree( + node, + itemToPass, + layout, + charts, + validNodes, + initiallyExcludedCharts, + buildTreeLeafTitle, + ); + } else { + logging.warn( + `Unable to find item with id: ${child} in the dashboard layout. This may indicate you have invalid references in your dashboard and the references to id: ${child} should be removed.`, + ); + } + }); }; const addInvisibleParents = (layout: Layout, item: string) => [ diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx index fc7092b0176e..0f61aeb04b14 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx @@ -191,10 +191,6 @@ export const StyledLabel = styled.span` text-transform: uppercase; `; -export const StyledCheckboxFormItem = styled(FormItem)` - margin-bottom: 0; -`; - const CleanFormItem = styled(FormItem)` margin-bottom: 0; `; @@ -262,6 +258,19 @@ const StyledAsterisk = styled.span` } `; +const FilterTypeInfo = styled.div` + ${({ theme }) => ` + width: 49%; + font-size: ${theme.typography.sizes.s}px; + color: ${theme.colors.grayscale.light1}; + margin: + ${-theme.gridUnit * 2}px + 0px + ${theme.gridUnit * 4}px + ${theme.gridUnit * 4}px; + `} +`; + const FilterTabs = { configuration: { key: 'configuration', @@ -337,6 +346,7 @@ const FiltersConfigForm = ( setErroredFilters, validateDependencies, getDependencySuggestion, + isActive, }: FiltersConfigFormProps, ref: React.RefObject<any>, ) => { @@ -351,7 +361,7 @@ const FiltersConfigForm = ( string, any > | null>(null); - const forceUpdate = useForceUpdate(); + const forceUpdate = useForceUpdate(isActive); const [datasetDetails, setDatasetDetails] = useState<Record<string, any>>(); const defaultFormFilter = useMemo(() => ({}), []); const filters = form.getFieldValue('filters'); @@ -693,7 +703,7 @@ const FiltersConfigForm = ( } Object.values(charts).forEach((chart: Chart) => { - const chartDatasetUid = chart.formData?.datasource; + const chartDatasetUid = chart.form_data?.datasource; if (chartDatasetUid === undefined) { return; } @@ -799,6 +809,13 @@ const FiltersConfigForm = ( /> </StyledFormItem> </StyledContainer> + {formFilter?.filterType === 'filter_time' && ( + <FilterTypeInfo> + {t(`Dashboard time range filters apply to temporal columns defined in + the filter section of each chart. Add temporal columns to the chart + filters to have this dashboard filter impact those charts.`)} + </FilterTypeInfo> + )} {hasDataset && ( <StyledRowContainer> {showDataset ? ( @@ -844,7 +861,7 @@ const FiltersConfigForm = ( </StyledRowContainer> )} <StyledCollapse - activeKey={activeFilterPanelKeys} + defaultActiveKey={activeFilterPanelKeys} onChange={key => { handleActiveFilterPanelChange(key); }} @@ -1248,6 +1265,8 @@ const FiltersConfigForm = ( ); }; -export default forwardRef<typeof FiltersConfigForm, FiltersConfigFormProps>( - FiltersConfigForm, +export default React.memo( + forwardRef<typeof FiltersConfigForm, FiltersConfigFormProps>( + FiltersConfigForm, + ), ); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx index 22078c26a926..ec43e4aa5929 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx @@ -129,7 +129,7 @@ export default function getControlItemsMap({ doesColumnMatchFilterType(formFilter?.filterType || '', column) } onChange={() => { - // We need reset default value when when column changed + // We need reset default value when column changed setNativeFilterFieldValues(form, filterId, { defaultDataMask: null, }); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/utils.ts b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/utils.ts index 538f5ce88bfb..66ab7f8e8ba4 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/utils.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/utils.ts @@ -44,9 +44,13 @@ export const FILTER_SUPPORTED_TYPES = { filter_range: [GenericDataType.NUMERIC], }; -export const useForceUpdate = () => { +export const useForceUpdate = (isActive = true) => { const [, updateState] = React.useState({}); - return React.useCallback(() => updateState({}), []); + return React.useCallback(() => { + if (isActive) { + updateState({}); + } + }, [isActive]); }; export const setNativeFilterFieldValues = ( @@ -117,7 +121,7 @@ export const mostUsedDataset = ( let maxCount = 0; Object.values(charts).forEach(chart => { - const { formData } = chart; + const { form_data: formData } = chart; if (formData) { const { datasource } = formData; const count = (map.get(datasource) || 0) + 1; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.test.tsx index 80126fe6a925..58ebcea548bc 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.test.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.test.tsx @@ -32,8 +32,7 @@ import { TimeFilterPlugin, TimeGrainFilterPlugin, } from 'src/filters/components'; -import { - FiltersConfigModal, +import FiltersConfigModal, { FiltersConfigModalProps, } from './FiltersConfigModal'; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx index d258b34fa748..fa7ef238e8f7 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx @@ -23,7 +23,7 @@ import React, { useState, useRef, } from 'react'; -import { uniq, isEqual, sortBy, debounce } from 'lodash'; +import { uniq, isEqual, sortBy, debounce, isEmpty } from 'lodash'; import { Filter, FilterConfiguration, @@ -91,6 +91,12 @@ export interface FiltersConfigModalProps { } export const ALLOW_DEPENDENCIES = ['filter_select']; +const DEFAULT_EMPTY_FILTERS: string[] = []; +const DEFAULT_REMOVED_FILTERS: Record<string, FilterRemoval> = {}; +const DEFAULT_FORM_VALUES: NativeFiltersForm = { + filters: {}, +}; + /** * This is the modal to configure all the dashboard-native filters. * Manages modal-level state, such as what filters are in the list, @@ -99,7 +105,7 @@ export const ALLOW_DEPENDENCIES = ['filter_select']; * Calls the `save` callback with the new FilterConfiguration object * when the user saves the filters. */ -export function FiltersConfigModal({ +function FiltersConfigModal({ isOpen, initialFilterId, createNewOnOpen, @@ -116,14 +122,16 @@ export function FiltersConfigModal({ // new filter ids belong to filters have been added during // this configuration session, and only exist in the form state until we submit. - const [newFilterIds, setNewFilterIds] = useState<string[]>([]); + const [newFilterIds, setNewFilterIds] = useState<string[]>( + DEFAULT_EMPTY_FILTERS, + ); // store ids of filters that have been removed with the time they were removed // so that we can disappear them after a few secs. // filters are still kept in state until form is submitted. const [removedFilters, setRemovedFilters] = useState< Record<string, FilterRemoval> - >({}); + >(DEFAULT_REMOVED_FILTERS); const [saveAlertVisible, setSaveAlertVisible] = useState<boolean>(false); @@ -143,28 +151,39 @@ export function FiltersConfigModal({ const [currentFilterId, setCurrentFilterId] = useState( initialCurrentFilterId, ); - const [erroredFilters, setErroredFilters] = useState<string[]>([]); + const [erroredFilters, setErroredFilters] = useState<string[]>( + DEFAULT_EMPTY_FILTERS, + ); // the form values are managed by the antd form, but we copy them to here // so that we can display them (e.g. filter titles in the tab headers) - const [formValues, setFormValues] = useState<NativeFiltersForm>({ - filters: {}, - }); + const [formValues, setFormValues] = + useState<NativeFiltersForm>(DEFAULT_FORM_VALUES); const unsavedFiltersIds = newFilterIds.filter(id => !removedFilters[id]); // brings back a filter that was previously removed ("Undo") - const restoreFilter = (id: string) => { - const removal = removedFilters[id]; - // gotta clear the removal timeout to prevent the filter from getting deleted - if (removal?.isPending) clearTimeout(removal.timerId); - setRemovedFilters(current => ({ ...current, [id]: null })); - }; - const getInitialFilterOrder = () => Object.keys(filterConfigMap); + const restoreFilter = useCallback( + (id: string) => { + const removal = removedFilters[id]; + // gotta clear the removal timeout to prevent the filter from getting deleted + if (removal?.isPending) clearTimeout(removal.timerId); + setRemovedFilters(current => ({ ...current, [id]: null })); + }, + [removedFilters], + ); + const initialFilterOrder = useMemo( + () => Object.keys(filterConfigMap), + [filterConfigMap], + ); // State for tracking the re-ordering of filters - const [orderedFilters, setOrderedFilters] = useState<string[]>( - getInitialFilterOrder(), - ); + const [orderedFilters, setOrderedFilters] = + useState<string[]>(initialFilterOrder); + + // State for rendered filter to improve performance + const [renderedFilters, setRenderedFilters] = useState<string[]>([ + initialCurrentFilterId, + ]); const getActiveFilterPanelKey = (filterId: string) => [ `${filterId}-${FilterPanels.configuration.key}`, @@ -175,7 +194,7 @@ export function FiltersConfigModal({ string | string[] >(getActiveFilterPanelKey(initialCurrentFilterId)); - const onTabChange = (filterId: string) => { + const handleTabChange = (filterId: string) => { setCurrentFilterId(filterId); setActiveFilterPanelKey(getActiveFilterPanelKey(filterId)); }; @@ -217,18 +236,19 @@ export function FiltersConfigModal({ // After this, it should be as if the modal was just opened fresh. // Called when the modal is closed. const resetForm = (isSaving = false) => { - setNewFilterIds([]); + setNewFilterIds(DEFAULT_EMPTY_FILTERS); setCurrentFilterId(initialCurrentFilterId); - setRemovedFilters({}); + setRemovedFilters(DEFAULT_REMOVED_FILTERS); setSaveAlertVisible(false); - setFormValues({ filters: {} }); - setErroredFilters([]); + setFormValues(DEFAULT_FORM_VALUES); + setErroredFilters(DEFAULT_EMPTY_FILTERS); if (filterIds.length > 0) { setActiveFilterPanelKey(getActiveFilterPanelKey(filterIds[0])); } if (!isSaving) { - setOrderedFilters(getInitialFilterOrder()); + setOrderedFilters(initialFilterOrder); } + setRenderedFilters([initialCurrentFilterId]); form.resetFields(['filters']); form.setFieldsValue({ changed: false }); }; @@ -321,7 +341,7 @@ export function FiltersConfigModal({ // no form validation issues found, resets errored filters if (!erroredFiltersIds.length && erroredFilters.length > 0) { - setErroredFilters([]); + setErroredFilters(DEFAULT_EMPTY_FILTERS); return; } // form validation issues found, sets errored filters @@ -364,10 +384,9 @@ export function FiltersConfigModal({ const handleCancel = () => { const changed = form.getFieldValue('changed'); - const initialOrder = getInitialFilterOrder(); const didChangeOrder = - orderedFilters.length !== initialOrder.length || - orderedFilters.some((val, index) => val !== initialOrder[index]); + orderedFilters.length !== initialFilterOrder.length || + orderedFilters.some((val, index) => val !== initialFilterOrder[index]); if ( unsavedFiltersIds.length > 0 || form.isFieldsTouched() || @@ -379,7 +398,7 @@ export function FiltersConfigModal({ handleConfirmCancel(); } }; - const onRearrange = (dragIndex: number, targetIndex: number) => { + const handleRearrange = (dragIndex: number, targetIndex: number) => { const newOrderedFilter = [...orderedFilters]; const removed = newOrderedFilter.splice(dragIndex, 1)[0]; newOrderedFilter.splice(targetIndex, 0, removed); @@ -396,7 +415,7 @@ export function FiltersConfigModal({ let array: string[] = []; if (formItem && 'dependencies' in formItem) { array = [...formItem.dependencies]; - } else if (configItem && configItem.cascadeParentIds) { + } else if (configItem?.cascadeParentIds) { array = [...configItem.cascadeParentIds]; } dependencyMap.set(key, array); @@ -405,7 +424,7 @@ export function FiltersConfigModal({ return dependencyMap; }, [filterConfigMap, form]); - const validateDependencies = () => { + const validateDependencies = useCallback(() => { const dependencyMap = buildDependencyMap(); filterIds .filter(id => !removedFilters[id]) @@ -418,26 +437,35 @@ export function FiltersConfigModal({ form.setFields([field]); }); handleErroredFilters(); - }; + }, [ + buildDependencyMap, + filterIds, + form, + handleErroredFilters, + removedFilters, + ]); - const getDependencySuggestion = (filterId: string) => { - const dependencyMap = buildDependencyMap(); - const possibleDependencies = orderedFilters.filter( - key => key !== filterId && canBeUsedAsDependency(key), - ); - const found = possibleDependencies.find(filter => { - const dependencies = dependencyMap.get(filterId) || []; - dependencies.push(filter); - if (hasCircularDependency(dependencyMap, filterId)) { - dependencies.pop(); - return false; - } - return true; - }); - return found || possibleDependencies[0]; - }; + const getDependencySuggestion = useCallback( + (filterId: string) => { + const dependencyMap = buildDependencyMap(); + const possibleDependencies = orderedFilters.filter( + key => key !== filterId && canBeUsedAsDependency(key), + ); + const found = possibleDependencies.find(filter => { + const dependencies = dependencyMap.get(filterId) || []; + dependencies.push(filter); + if (hasCircularDependency(dependencyMap, filterId)) { + dependencies.pop(); + return false; + } + return true; + }); + return found || possibleDependencies[0]; + }, + [buildDependencyMap, canBeUsedAsDependency, orderedFilters], + ); - const onValuesChange = useMemo( + const handleValuesChange = useMemo( () => debounce((changes: any, values: NativeFiltersForm) => { const didChangeFilterName = @@ -461,37 +489,80 @@ export function FiltersConfigModal({ ); useEffect(() => { - setErroredFilters(prevErroredFilters => - prevErroredFilters.filter(f => !removedFilters[f]), - ); + if (!isEmpty(removedFilters)) { + setErroredFilters(prevErroredFilters => + prevErroredFilters.filter(f => !removedFilters[f]), + ); + } }, [removedFilters]); - const getForm = (id: string) => { - const isDivider = id.startsWith(NATIVE_FILTER_DIVIDER_PREFIX); - return isDivider ? ( - <DividerConfigForm - componentId={id} - divider={filterConfigMap[id] as Divider} - /> - ) : ( - <FiltersConfigForm - ref={configFormRef} - form={form} - filterId={id} - filterToEdit={filterConfigMap[id] as Filter} - removedFilters={removedFilters} - restoreFilter={restoreFilter} - getAvailableFilters={getAvailableFilters} - key={id} - activeFilterPanelKeys={activeFilterPanelKey} - handleActiveFilterPanelChange={key => setActiveFilterPanelKey(key)} - isActive={currentFilterId === id} - setErroredFilters={setErroredFilters} - validateDependencies={validateDependencies} - getDependencySuggestion={getDependencySuggestion} - /> - ); - }; + useEffect(() => { + if (!renderedFilters.includes(currentFilterId)) { + setRenderedFilters([...renderedFilters, currentFilterId]); + } + }, [currentFilterId]); + + const handleActiveFilterPanelChange = useCallback( + key => setActiveFilterPanelKey(key), + [setActiveFilterPanelKey], + ); + + const formList = useMemo( + () => + orderedFilters.map(id => { + if (!renderedFilters.includes(id)) return null; + const isDivider = id.startsWith(NATIVE_FILTER_DIVIDER_PREFIX); + const isActive = currentFilterId === id; + return ( + <div + key={id} + style={{ + height: '100%', + overflowY: 'auto', + display: isActive ? '' : 'none', + }} + > + {isDivider ? ( + <DividerConfigForm + componentId={id} + divider={filterConfigMap[id] as Divider} + /> + ) : ( + <FiltersConfigForm + ref={configFormRef} + form={form} + filterId={id} + filterToEdit={filterConfigMap[id] as Filter} + removedFilters={removedFilters} + restoreFilter={restoreFilter} + getAvailableFilters={getAvailableFilters} + key={id} + activeFilterPanelKeys={activeFilterPanelKey} + handleActiveFilterPanelChange={handleActiveFilterPanelChange} + isActive={isActive} + setErroredFilters={setErroredFilters} + validateDependencies={validateDependencies} + getDependencySuggestion={getDependencySuggestion} + /> + )} + </div> + ); + }), + [ + renderedFilters, + orderedFilters, + currentFilterId, + filterConfigMap, + form, + removedFilters, + restoreFilter, + getAvailableFilters, + activeFilterPanelKey, + validateDependencies, + getDependencySuggestion, + handleActiveFilterPanelChange, + ], + ); return ( <StyledModalWrapper @@ -519,22 +590,22 @@ export function FiltersConfigModal({ <StyledModalBody> <StyledForm form={form} - onValuesChange={onValuesChange} + onValuesChange={handleValuesChange} layout="vertical" > <FilterConfigurePane erroredFilters={erroredFilters} onRemove={handleRemoveItem} onAdd={addFilter} - onChange={onTabChange} + onChange={handleTabChange} getFilterTitle={getFilterTitle} currentFilterId={currentFilterId} removedFilters={removedFilters} restoreFilter={restoreFilter} - onRearrange={onRearrange} + onRearrange={handleRearrange} filters={orderedFilters} > - {(id: string) => getForm(id)} + {formList} </FilterConfigurePane> </StyledForm> </StyledModalBody> @@ -542,3 +613,5 @@ export function FiltersConfigModal({ </StyledModalWrapper> ); } + +export default React.memo(FiltersConfigModal); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/NativeFiltersModal.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/NativeFiltersModal.test.tsx index 7717d1915b11..06a566937d0b 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/NativeFiltersModal.test.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/NativeFiltersModal.test.tsx @@ -28,7 +28,7 @@ import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint'; import { AntdDropdown } from 'src/components'; import { Menu } from 'src/components/Menu'; import Alert from 'src/components/Alert'; -import { FiltersConfigModal } from 'src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal'; +import FiltersConfigModal from 'src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal'; Object.defineProperty(window, 'matchMedia', { writable: true, diff --git a/superset-frontend/src/dashboard/components/nativeFilters/utils.ts b/superset-frontend/src/dashboard/components/nativeFilters/utils.ts index 868205714f67..32a060057b7c 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/utils.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/utils.ts @@ -28,7 +28,7 @@ import { getChartMetadataRegistry, QueryFormData, } from '@superset-ui/core'; -import { Charts, DashboardLayout } from 'src/dashboard/types'; +import { DashboardLayout } from 'src/dashboard/types'; import extractUrlParams from 'src/dashboard/util/extractUrlParams'; import { isFeatureEnabled } from 'src/featureFlags'; import { CHART_TYPE, TAB_TYPE } from '../../util/componentTypes'; @@ -122,7 +122,6 @@ export function isCrossFilter(vizType: string) { export function getExtraFormData( dataMask: DataMaskStateWithId, - charts: Charts, filterIdsAppliedOnChart: string[], ): ExtraFormData { let extraFormData: ExtraFormData = {}; @@ -147,7 +146,7 @@ export function nativeFilterGate(behaviors: Behavior[]): boolean { const isComponentATab = ( dashboardLayout: DashboardLayout, componentId: string, -) => dashboardLayout[componentId].type === TAB_TYPE; +) => dashboardLayout?.[componentId]?.type === TAB_TYPE; const findTabsWithChartsInScopeHelper = ( dashboardLayout: DashboardLayout, @@ -157,19 +156,19 @@ const findTabsWithChartsInScopeHelper = ( tabsToHighlight: Set<string>, ) => { if ( - dashboardLayout[componentId].type === CHART_TYPE && - chartsInScope.includes(dashboardLayout[componentId].meta.chartId) + dashboardLayout?.[componentId]?.type === CHART_TYPE && + chartsInScope.includes(dashboardLayout[componentId]?.meta?.chartId) ) { tabIds.forEach(tabsToHighlight.add, tabsToHighlight); } if ( - dashboardLayout[componentId].children.length === 0 || + dashboardLayout?.[componentId]?.children?.length === 0 || (isComponentATab(dashboardLayout, componentId) && tabsToHighlight.has(componentId)) ) { return; } - dashboardLayout[componentId].children.forEach(childId => + dashboardLayout[componentId]?.children.forEach(childId => findTabsWithChartsInScopeHelper( dashboardLayout, chartsInScope, @@ -189,7 +188,7 @@ export const findTabsWithChartsInScope = ( const hasTopLevelTabs = rootChildId !== DASHBOARD_GRID_ID; const tabsInScope = new Set<string>(); if (hasTopLevelTabs) { - dashboardLayout[rootChildId].children?.forEach(tabId => + dashboardLayout[rootChildId]?.children?.forEach(tabId => findTabsWithChartsInScopeHelper( dashboardLayout, chartsInScope, @@ -200,7 +199,7 @@ export const findTabsWithChartsInScope = ( ); } else { Object.values(dashboardLayout) - .filter(element => element.type === TAB_TYPE) + .filter(element => element?.type === TAB_TYPE) .forEach(element => findTabsWithChartsInScopeHelper( dashboardLayout, diff --git a/superset-frontend/src/dashboard/components/resizable/ResizableContainer.jsx b/superset-frontend/src/dashboard/components/resizable/ResizableContainer.jsx index ff576101f491..a14731574e58 100644 --- a/superset-frontend/src/dashboard/components/resizable/ResizableContainer.jsx +++ b/superset-frontend/src/dashboard/components/resizable/ResizableContainer.jsx @@ -20,6 +20,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Resizable } from 're-resizable'; import cx from 'classnames'; +import { css, styled } from '@superset-ui/core'; import ResizableHandle from './ResizableHandle'; import resizableConfig from '../../util/resizableConfig'; @@ -80,6 +81,93 @@ const HANDLE_CLASSES = { right: 'resizable-container-handle--right', bottom: 'resizable-container-handle--bottom', }; + +const StyledResizable = styled(Resizable)` + ${({ theme }) => css` + &.resizable-container { + background-color: transparent; + position: relative; + + /* re-resizable sets an empty div to 100% width and height, which doesn't + play well with many 100% height containers we need */ + + & ~ div { + width: auto !important; + height: auto !important; + } + } + + &.resizable-container--resizing { + /* after ensures border visibility on top of any children */ + + &:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + box-shadow: inset 0 0 0 2px ${theme.colors.primary.base}; + } + + & > span .resize-handle { + border-color: ${theme.colors.primary.base}; + } + } + + .resize-handle { + opacity: 0; + z-index: 10; + + &--bottom-right { + position: absolute; + border-right: 1px solid ${theme.colors.text.label}; + border-bottom: 1px solid ${theme.colors.text.label}; + right: ${theme.gridUnit * 4}px; + bottom: ${theme.gridUnit * 4}px; + width: ${theme.gridUnit * 2}px; + height: ${theme.gridUnit * 2}px; + } + + &--right { + width: ${theme.gridUnit / 2}px; + height: ${theme.gridUnit * 5}px; + right: ${theme.gridUnit}px; + top: 50%; + transform: translate(0, -50%); + position: absolute; + border-left: 1px solid ${theme.colors.text.label}; + border-right: 1px solid ${theme.colors.text.label}; + } + + &--bottom { + height: ${theme.gridUnit / 2}px; + width: ${theme.gridUnit * 5}px; + bottom: ${theme.gridUnit}px; + left: 50%; + transform: translate(-50%); + position: absolute; + border-top: 1px solid ${theme.colors.text.label}; + border-bottom: 1px solid ${theme.colors.text.label}; + } + } + `} + + &.resizable-container:hover .resize-handle, + &.resizable-container--resizing .resize-handle { + opacity: 1; + } + + .dragdroppable-column & .resizable-container-handle--right { + /* override the default because the inner column's handle's mouse target is very small */ + right: 0 !important; + } + + & .resizable-container-handle--bottom { + bottom: 0 !important; + } +`; + class ResizableContainer extends React.PureComponent { constructor(props) { super(props); @@ -186,7 +274,7 @@ class ResizableContainer extends React.PureComponent { const { isResizing } = this.state; return ( - <Resizable + <StyledResizable enable={enableConfig} grid={SNAP_TO_GRID} minWidth={ @@ -228,7 +316,7 @@ class ResizableContainer extends React.PureComponent { handleClasses={HANDLE_CLASSES} > {children} - </Resizable> + </StyledResizable> ); } } diff --git a/superset-frontend/src/dashboard/constants.ts b/superset-frontend/src/dashboard/constants.ts index 296bc0a9b3bb..97753abe45c5 100644 --- a/superset-frontend/src/dashboard/constants.ts +++ b/superset-frontend/src/dashboard/constants.ts @@ -37,6 +37,8 @@ export const PLACEHOLDER_DATASOURCE: Datasource = { export const MAIN_HEADER_HEIGHT = 53; export const CLOSED_FILTER_BAR_WIDTH = 32; export const OPEN_FILTER_BAR_WIDTH = 260; +export const OPEN_FILTER_BAR_MAX_WIDTH = 550; export const FILTER_BAR_HEADER_HEIGHT = 80; export const FILTER_BAR_TABS_HEIGHT = 46; export const BUILDER_SIDEPANEL_WIDTH = 374; +export const OVERWRITE_INSPECT_FIELDS = ['css', 'json_metadata.filter_scopes']; diff --git a/superset-frontend/src/dashboard/containers/Chart.jsx b/superset-frontend/src/dashboard/containers/Chart.jsx index 81d06b856623..167ec0a04387 100644 --- a/superset-frontend/src/dashboard/containers/Chart.jsx +++ b/superset-frontend/src/dashboard/containers/Chart.jsx @@ -46,7 +46,6 @@ function mapStateToProps( charts: chartQueries, dashboardInfo, dashboardState, - dashboardLayout, dataMask, datasources, sliceEntities, @@ -65,16 +64,15 @@ function mapStateToProps( const sharedLabelColors = dashboardInfo?.metadata?.shared_label_colors || {}; // note: this method caches filters if possible to prevent render cascades const formData = getFormDataWithExtraFilters({ - layout: dashboardLayout.present, chart, - // eslint-disable-next-line camelcase chartConfiguration: dashboardInfo.metadata?.chart_configuration, charts: chartQueries, filters: getAppliedFilterValues(id), colorScheme, colorNamespace, sliceId: id, - nativeFilters, + nativeFilters: nativeFilters?.filters, + allSliceIds: dashboardState.sliceIds, dataMask, extraControls, labelColors, @@ -104,6 +102,7 @@ function mapStateToProps( setControlValue, filterboxMigrationState: dashboardState.filterboxMigrationState, datasetsStatus, + emitCrossFilters: !!dashboardInfo.crossFiltersEnabled, }; } diff --git a/superset-frontend/src/dashboard/containers/Dashboard.ts b/superset-frontend/src/dashboard/containers/Dashboard.ts index 647d774f4835..50e42fef24dc 100644 --- a/superset-frontend/src/dashboard/containers/Dashboard.ts +++ b/superset-frontend/src/dashboard/containers/Dashboard.ts @@ -68,7 +68,7 @@ function mapStateToProps(state: RootState) { chartConfiguration: dashboardInfo.metadata?.chart_configuration, nativeFilters: nativeFilters.filters, dataMask, - layout: dashboardLayout.present, + allSliceIds: dashboardState.sliceIds, }), }, chartConfiguration: dashboardInfo.metadata?.chart_configuration, diff --git a/superset-frontend/src/dashboard/containers/DashboardComponent.jsx b/superset-frontend/src/dashboard/containers/DashboardComponent.jsx index 23298d8bf96a..08b7ed9f82d9 100644 --- a/superset-frontend/src/dashboard/containers/DashboardComponent.jsx +++ b/superset-frontend/src/dashboard/containers/DashboardComponent.jsx @@ -37,7 +37,6 @@ import { setDirectPathToChild, setActiveTabs, setFullSizeChartId, - postAddSliceFromDashboard, } from 'src/dashboard/actions/dashboardState'; const propTypes = { @@ -112,7 +111,6 @@ function mapDispatchToProps(dispatch) { setFullSizeChartId, setActiveTabs, logEvent, - postAddSliceFromDashboard, }, dispatch, ); diff --git a/superset-frontend/src/dashboard/containers/DashboardHeader.jsx b/superset-frontend/src/dashboard/containers/DashboardHeader.jsx index 121215fe8bfe..178568f064ea 100644 --- a/superset-frontend/src/dashboard/containers/DashboardHeader.jsx +++ b/superset-frontend/src/dashboard/containers/DashboardHeader.jsx @@ -31,7 +31,8 @@ import { fetchFaveStar, saveFaveStar, savePublished, - setColorSchemeAndUnsavedChanges, + setColorScheme, + setUnsavedChanges, fetchCharts, updateCss, onChange, @@ -112,7 +113,8 @@ function mapDispatchToProps(dispatch) { onRedo: redoLayoutAction, setEditMode, showBuilderPane, - setColorSchemeAndUnsavedChanges, + setColorScheme, + setUnsavedChanges, fetchFaveStar, saveFaveStar, savePublished, diff --git a/superset-frontend/src/dashboard/containers/DashboardPage.tsx b/superset-frontend/src/dashboard/containers/DashboardPage.tsx index 49bf783ba344..0066354f589b 100644 --- a/superset-frontend/src/dashboard/containers/DashboardPage.tsx +++ b/superset-frontend/src/dashboard/containers/DashboardPage.tsx @@ -16,15 +16,18 @@ * specific language governing permissions and limitations * under the License. */ -import React, { FC, useRef, useEffect, useState } from 'react'; +import React, { FC, useEffect, useMemo, useRef, useState } from 'react'; +import { useHistory } from 'react-router-dom'; import { CategoricalColorNamespace, FeatureFlag, getSharedLabelColor, isFeatureEnabled, + SharedLabelColorSource, t, useTheme, } from '@superset-ui/core'; +import pick from 'lodash/pick'; import { useDispatch, useSelector } from 'react-redux'; import { Global } from '@emotion/react'; import { useToasts } from 'src/components/MessageToasts/withToasts'; @@ -44,8 +47,8 @@ import { addWarningToast } from 'src/components/MessageToasts/actions'; import { getItem, - setItem, LocalStorageKeys, + setItem, } from 'src/utils/localStorageHelpers'; import { FILTER_BOX_MIGRATION_STATES, @@ -53,19 +56,25 @@ import { } from 'src/explore/constants'; import { URL_PARAMS } from 'src/constants'; import { getUrlParam } from 'src/utils/urlUtils'; -import { canUserEditDashboard } from 'src/dashboard/util/findPermission'; -import { getFilterSets } from '../actions/nativeFilters'; -import { setDatasetsStatus } from '../actions/dashboardState'; +import { canUserEditDashboard } from 'src/dashboard/util/permissionUtils'; +import { getFilterSets } from 'src/dashboard/actions/nativeFilters'; +import { setDatasetsStatus } from 'src/dashboard/actions/dashboardState'; import { getFilterValue, getPermalinkValue, -} from '../components/nativeFilters/FilterBar/keyValue'; -import { filterCardPopoverStyle } from '../styles'; +} from 'src/dashboard/components/nativeFilters/FilterBar/keyValue'; +import { filterCardPopoverStyle, headerStyles } from 'src/dashboard/styles'; +import { DashboardContextForExplore } from 'src/types/DashboardContextForExplore'; +import shortid from 'shortid'; +import { RootState } from '../types'; +import { getActiveFilters } from '../util/activeDashboardFilters'; export const MigrationContext = React.createContext( FILTER_BOX_MIGRATION_STATES.NOOP, ); +export const DashboardPageIdContext = React.createContext(''); + setupPlugins(); const DashboardContainer = React.lazy( () => @@ -82,12 +91,77 @@ type PageProps = { idOrSlug: string; }; +const getDashboardContextLocalStorage = () => { + const dashboardsContexts = getItem( + LocalStorageKeys.dashboard__explore_context, + {}, + ); + // A new dashboard tab id is generated on each dashboard page opening. + // We mark ids as redundant when user leaves the dashboard, because they won't be reused. + // Then we remove redundant dashboard contexts from local storage in order not to clutter it + return Object.fromEntries( + Object.entries(dashboardsContexts).filter( + ([, value]) => !value.isRedundant, + ), + ); +}; + +const updateDashboardTabLocalStorage = ( + dashboardPageId: string, + dashboardContext: DashboardContextForExplore, +) => { + const dashboardsContexts = getDashboardContextLocalStorage(); + setItem(LocalStorageKeys.dashboard__explore_context, { + ...dashboardsContexts, + [dashboardPageId]: dashboardContext, + }); +}; + +const useSyncDashboardStateWithLocalStorage = () => { + const dashboardPageId = useMemo(() => shortid.generate(), []); + const dashboardContextForExplore = useSelector< + RootState, + DashboardContextForExplore + >(({ dashboardInfo, dashboardState, nativeFilters, dataMask }) => ({ + labelColors: dashboardInfo.metadata?.label_colors || {}, + sharedLabelColors: dashboardInfo.metadata?.shared_label_colors || {}, + colorScheme: dashboardState?.colorScheme, + chartConfiguration: dashboardInfo.metadata?.chart_configuration || {}, + nativeFilters: Object.entries(nativeFilters.filters).reduce( + (acc, [key, filterValue]) => ({ + ...acc, + [key]: pick(filterValue, ['chartsInScope']), + }), + {}, + ), + dataMask, + dashboardId: dashboardInfo.id, + filterBoxFilters: getActiveFilters(), + dashboardPageId, + })); + + useEffect(() => { + updateDashboardTabLocalStorage(dashboardPageId, dashboardContextForExplore); + return () => { + // mark tab id as redundant when dashboard unmounts - case when user opens + // Explore in the same tab + updateDashboardTabLocalStorage(dashboardPageId, { + ...dashboardContextForExplore, + isRedundant: true, + }); + }; + }, [dashboardContextForExplore, dashboardPageId]); + return dashboardPageId; +}; + export const DashboardPage: FC<PageProps> = ({ idOrSlug }: PageProps) => { const dispatch = useDispatch(); const theme = useTheme(); + const history = useHistory(); const user = useSelector<any, UserWithPermissionsAndRoles>( state => state.user, ); + const dashboardPageId = useSyncDashboardStateWithLocalStorage(); const { addDangerToast } = useToasts(); const { result: dashboard, error: dashboardApiError } = useDashboard(idOrSlug); @@ -113,15 +187,34 @@ export const DashboardPage: FC<PageProps> = ({ idOrSlug }: PageProps) => { migrationStateParam || FILTER_BOX_MIGRATION_STATES.NOOP, ); + useEffect(() => { + // mark tab id as redundant when user closes browser tab - a new id will be + // generated next time user opens a dashboard and the old one won't be reused + const handleTabClose = () => { + const dashboardsContexts = getDashboardContextLocalStorage(); + setItem(LocalStorageKeys.dashboard__explore_context, { + ...dashboardsContexts, + [dashboardPageId]: { + ...dashboardsContexts[dashboardPageId], + isRedundant: true, + }, + }); + }; + window.addEventListener('beforeunload', handleTabClose); + return () => { + window.removeEventListener('beforeunload', handleTabClose); + }; + }, [dashboardPageId]); + useEffect(() => { dispatch(setDatasetsStatus(status)); }, [dispatch, status]); useEffect(() => { // should convert filter_box to filter component? - const hasFilterBox = - charts && - charts.some(chart => chart.form_data?.viz_type === 'filter_box'); + const hasFilterBox = charts?.some( + chart => chart.form_data?.viz_type === 'filter_box', + ); const canEdit = dashboard && canUserEditDashboard(dashboard, user); if (canEdit) { @@ -183,19 +276,22 @@ export const DashboardPage: FC<PageProps> = ({ idOrSlug }: PageProps) => { async function getDataMaskApplied() { const permalinkKey = getUrlParam(URL_PARAMS.permalinkKey); const nativeFilterKeyValue = getUrlParam(URL_PARAMS.nativeFiltersKey); - let dataMaskFromUrl = nativeFilterKeyValue || {}; - const isOldRison = getUrlParam(URL_PARAMS.nativeFilters); + + let dataMask = nativeFilterKeyValue || {}; + // activeTabs is initialized with undefined so that it doesn't override + // the currently stored value when hydrating + let activeTabs: string[] | undefined; if (permalinkKey) { const permalinkValue = await getPermalinkValue(permalinkKey); if (permalinkValue) { - dataMaskFromUrl = permalinkValue.state.filterState; + ({ dataMask, activeTabs } = permalinkValue.state); } } else if (nativeFilterKeyValue) { - dataMaskFromUrl = await getFilterValue(id, nativeFilterKeyValue); + dataMask = await getFilterValue(id, nativeFilterKeyValue); } if (isOldRison) { - dataMaskFromUrl = isOldRison; + dataMask = isOldRison; } if (readyToRender) { @@ -207,12 +303,14 @@ export const DashboardPage: FC<PageProps> = ({ idOrSlug }: PageProps) => { } } dispatch( - hydrateDashboard( + hydrateDashboard({ + history, dashboard, charts, + activeTabs, filterboxMigrationState, - dataMaskFromUrl, - ), + dataMask, + }), ); } return null; @@ -239,17 +337,18 @@ export const DashboardPage: FC<PageProps> = ({ idOrSlug }: PageProps) => { return () => {}; }, [css]); - useEffect( - () => () => { + useEffect(() => { + const sharedLabelColor = getSharedLabelColor(); + sharedLabelColor.source = SharedLabelColorSource.dashboard; + return () => { // clean up label color const categoricalNamespace = CategoricalColorNamespace.getNamespace( metadata?.color_namespace, ); categoricalNamespace.resetColors(); - getSharedLabelColor().clear(); - }, - [metadata?.color_namespace], - ); + sharedLabelColor.clear(); + }; + }, [metadata?.color_namespace]); useEffect(() => { if (datasetsApiError) { @@ -266,7 +365,7 @@ export const DashboardPage: FC<PageProps> = ({ idOrSlug }: PageProps) => { return ( <> - <Global styles={filterCardPopoverStyle(theme)} /> + <Global styles={[filterCardPopoverStyle(theme), headerStyles(theme)]} /> <FilterBoxMigrationModal show={filterboxMigrationState === FILTER_BOX_MIGRATION_STATES.UNDECIDED} hideFooter={!isMigrationEnabled} @@ -291,7 +390,9 @@ export const DashboardPage: FC<PageProps> = ({ idOrSlug }: PageProps) => { /> <MigrationContext.Provider value={filterboxMigrationState}> - <DashboardContainer /> + <DashboardPageIdContext.Provider value={dashboardPageId}> + <DashboardContainer /> + </DashboardPageIdContext.Provider> </MigrationContext.Provider> </> ); diff --git a/superset-frontend/src/dashboard/containers/SliceAdder.jsx b/superset-frontend/src/dashboard/containers/SliceAdder.jsx index 078ded23d8ac..580dedc2f830 100644 --- a/superset-frontend/src/dashboard/containers/SliceAdder.jsx +++ b/superset-frontend/src/dashboard/containers/SliceAdder.jsx @@ -19,7 +19,11 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { fetchAllSlices } from '../actions/sliceEntities'; +import { + fetchAllSlices, + fetchSortedSlices, + fetchFilteredSlices, +} from '../actions/sliceEntities'; import SliceAdder from '../components/SliceAdder'; function mapStateToProps( @@ -44,6 +48,8 @@ function mapDispatchToProps(dispatch) { return bindActionCreators( { fetchAllSlices, + fetchSortedSlices, + fetchFilteredSlices, }, dispatch, ); diff --git a/superset-frontend/src/dashboard/reducers/dashboardInfo.js b/superset-frontend/src/dashboard/reducers/dashboardInfo.js index fdd39fae1232..3503c441b65c 100644 --- a/superset-frontend/src/dashboard/reducers/dashboardInfo.js +++ b/superset-frontend/src/dashboard/reducers/dashboardInfo.js @@ -17,7 +17,11 @@ * under the License. */ -import { DASHBOARD_INFO_UPDATED } from '../actions/dashboardInfo'; +import { + DASHBOARD_INFO_UPDATED, + SET_FILTER_BAR_ORIENTATION, + SET_CROSS_FILTERS_ENABLED, +} from '../actions/dashboardInfo'; import { HYDRATE_DASHBOARD } from '../actions/hydrate'; export default function dashboardStateReducer(state = {}, action) { @@ -35,6 +39,16 @@ export default function dashboardStateReducer(state = {}, action) { ...action.data.dashboardInfo, // set async api call data }; + case SET_FILTER_BAR_ORIENTATION: + return { + ...state, + filterBarOrientation: action.filterBarOrientation, + }; + case SET_CROSS_FILTERS_ENABLED: + return { + ...state, + crossFiltersEnabled: action.crossFiltersEnabled, + }; default: return state; } diff --git a/superset-frontend/src/dashboard/reducers/dashboardLayout.js b/superset-frontend/src/dashboard/reducers/dashboardLayout.js index 30ad33c62b6c..6ba297be9147 100644 --- a/superset-frontend/src/dashboard/reducers/dashboardLayout.js +++ b/superset-frontend/src/dashboard/reducers/dashboardLayout.js @@ -45,6 +45,39 @@ import { import { HYDRATE_DASHBOARD } from '../actions/hydrate'; +export function recursivelyDeleteChildren( + componentId, + componentParentId, + nextComponents, +) { + // delete child and it's children + const component = nextComponents?.[componentId]; + if (component) { + // eslint-disable-next-line no-param-reassign + delete nextComponents[componentId]; + + const { children = [] } = component; + children?.forEach?.(childId => { + recursivelyDeleteChildren(childId, componentId, nextComponents); + }); + + const parent = nextComponents?.[componentParentId]; + if (Array.isArray(parent?.children)) { + // may have been deleted in another recursion + const componentIndex = parent.children.indexOf(componentId); + if (componentIndex > -1) { + const nextChildren = [...parent.children]; + nextChildren.splice(componentIndex, 1); + // eslint-disable-next-line no-param-reassign + nextComponents[componentParentId] = { + ...parent, + children: nextChildren, + }; + } + } + } +} + const actionHandlers = { [HYDRATE_DASHBOARD](state, action) { return { @@ -71,39 +104,14 @@ const actionHandlers = { const nextComponents = { ...state }; - function recursivelyDeleteChildren(componentId, componentParentId) { - // delete child and it's children - const component = nextComponents[componentId]; - delete nextComponents[componentId]; - - const { children = [] } = component; - children.forEach(childId => { - recursivelyDeleteChildren(childId, componentId); - }); - - const parent = nextComponents[componentParentId]; - if (parent) { - // may have been deleted in another recursion - const componentIndex = (parent.children || []).indexOf(componentId); - if (componentIndex > -1) { - const nextChildren = [...parent.children]; - nextChildren.splice(componentIndex, 1); - nextComponents[componentParentId] = { - ...parent, - children: nextChildren, - }; - } - } - } - - recursivelyDeleteChildren(id, parentId); + recursivelyDeleteChildren(id, parentId, nextComponents); const nextParent = nextComponents[parentId]; - if (nextParent.type === ROW_TYPE && nextParent.children.length === 0) { + if (nextParent?.type === ROW_TYPE && nextParent?.children?.length === 0) { const grandparentId = findParentId({ childId: parentId, layout: nextComponents, }); - recursivelyDeleteChildren(parentId, grandparentId); + recursivelyDeleteChildren(parentId, grandparentId, nextComponents); } return nextComponents; diff --git a/superset-frontend/src/dashboard/reducers/dashboardLayout.test.js b/superset-frontend/src/dashboard/reducers/dashboardLayout.test.js index f9b504acf75a..f0f4d8b1bcaf 100644 --- a/superset-frontend/src/dashboard/reducers/dashboardLayout.test.js +++ b/superset-frontend/src/dashboard/reducers/dashboardLayout.test.js @@ -16,7 +16,9 @@ * specific language governing permissions and limitations * under the License. */ -import layoutReducer from 'src/dashboard/reducers/dashboardLayout'; +import layoutReducer, { + recursivelyDeleteChildren, +} from 'src/dashboard/reducers/dashboardLayout'; import { UPDATE_COMPONENTS, @@ -455,4 +457,23 @@ describe('dashboardLayout reducer', () => { expect(result[DASHBOARD_GRID_ID].children).toHaveLength(2); expect(result[newId].type).toBe(ROW_TYPE); }); + + it('recursivelyDeleteChildren should be error proof with bad inputs', () => { + /* + ** The recursivelyDeleteChildren function was missing runtime safety checks before operating + ** on sub properties of object causing runtime errors when a componentId lookup returned and unexpected value + ** These test are to ensure this function is fault tolerant if provided any bad values while recursively looping + ** through the data structure of + */ + const componentId = '123'; + const componentParentId = '456'; + const nextComponents = []; + expect(() => { + recursivelyDeleteChildren(componentId, componentParentId, nextComponents); + }).not.toThrow(); + + expect(() => { + recursivelyDeleteChildren(null, null, null); + }).not.toThrow(); + }); }); diff --git a/superset-frontend/src/dashboard/reducers/dashboardState.js b/superset-frontend/src/dashboard/reducers/dashboardState.js index 277865030cb7..5d81cd8ac11f 100644 --- a/superset-frontend/src/dashboard/reducers/dashboardState.js +++ b/superset-frontend/src/dashboard/reducers/dashboardState.js @@ -39,10 +39,12 @@ import { UNSET_FOCUSED_FILTER_FIELD, SET_ACTIVE_TABS, SET_FULL_SIZE_CHART_ID, - RESET_SLICE, ON_FILTERS_REFRESH, ON_FILTERS_REFRESH_SUCCESS, SET_DATASETS_STATUS, + SET_OVERRIDE_CONFIRM, + SAVE_DASHBOARD_STARTED, + SAVE_DASHBOARD_FINISHED, } from '../actions/dashboardState'; import { HYDRATE_DASHBOARD } from '../actions/hydrate'; @@ -60,7 +62,6 @@ export default function dashboardStateReducer(state = {}, action) { return { ...state, sliceIds: Array.from(updatedSliceIds), - updateSlice: true, }; }, [REMOVE_SLICE]() { @@ -73,12 +74,6 @@ export default function dashboardStateReducer(state = {}, action) { sliceIds: Array.from(updatedSliceIds), }; }, - [RESET_SLICE]() { - return { - ...state, - updateSlice: false, - }; - }, [TOGGLE_FAVE_STAR]() { return { ...state, isStarred: action.isStarred }; }, @@ -118,6 +113,18 @@ export default function dashboardStateReducer(state = {}, action) { [ON_CHANGE]() { return { ...state, hasUnsavedChanges: true }; }, + [SAVE_DASHBOARD_STARTED]() { + return { + ...state, + dashboardIsSaving: true, + }; + }, + [SAVE_DASHBOARD_FINISHED]() { + return { + ...state, + dashboardIsSaving: false, + }; + }, [ON_SAVE]() { return { ...state, @@ -125,7 +132,6 @@ export default function dashboardStateReducer(state = {}, action) { maxUndoHistoryExceeded: false, editMode: false, updatedColorScheme: false, - updateSlice: false, // server-side returns last_modified_time for latest change lastModifiedTime: action.lastModifiedTime, }; @@ -182,6 +188,12 @@ export default function dashboardStateReducer(state = {}, action) { activeTabs: Array.from(newActiveTabs), }; }, + [SET_OVERRIDE_CONFIRM]() { + return { + ...state, + overwriteConfirmMetadata: action.overwriteConfirmMetadata, + }; + }, [SET_FOCUSED_FILTER_FIELD]() { return { ...state, diff --git a/superset-frontend/src/dashboard/reducers/dashboardState.test.js b/superset-frontend/src/dashboard/reducers/dashboardState.test.js index de3ecf72ff3e..39798ecf139e 100644 --- a/superset-frontend/src/dashboard/reducers/dashboardState.test.js +++ b/superset-frontend/src/dashboard/reducers/dashboardState.test.js @@ -28,7 +28,6 @@ import { TOGGLE_EXPAND_SLICE, TOGGLE_FAVE_STAR, UNSET_FOCUSED_FILTER_FIELD, - RESET_SLICE, } from 'src/dashboard/actions/dashboardState'; import dashboardStateReducer from 'src/dashboard/reducers/dashboardState'; @@ -44,7 +43,7 @@ describe('dashboardState reducer', () => { { sliceIds: [1] }, { type: ADD_SLICE, slice: { slice_id: 2 } }, ), - ).toEqual({ sliceIds: [1, 2], updateSlice: true }); + ).toEqual({ sliceIds: [1, 2] }); }); it('should remove a slice', () => { @@ -56,12 +55,6 @@ describe('dashboardState reducer', () => { ).toEqual({ sliceIds: [1], filters: {} }); }); - it('should reset updateSlice', () => { - expect( - dashboardStateReducer({ updateSlice: true }, { type: RESET_SLICE }), - ).toEqual({ updateSlice: false }); - }); - it('should toggle fav star', () => { expect( dashboardStateReducer( diff --git a/superset-frontend/src/dashboard/reducers/nativeFilters.ts b/superset-frontend/src/dashboard/reducers/nativeFilters.ts index b3900af31cf5..81a1a4bd2d20 100644 --- a/superset-frontend/src/dashboard/reducers/nativeFilters.ts +++ b/superset-frontend/src/dashboard/reducers/nativeFilters.ts @@ -23,6 +23,8 @@ import { SET_FILTER_SETS_COMPLETE, SET_FOCUSED_NATIVE_FILTER, UNSET_FOCUSED_NATIVE_FILTER, + SET_HOVERED_NATIVE_FILTER, + UNSET_HOVERED_NATIVE_FILTER, } from 'src/dashboard/actions/nativeFilters'; import { FilterSet, @@ -102,6 +104,18 @@ export default function nativeFilterReducer( ...state, focusedFilterId: undefined, }; + + case SET_HOVERED_NATIVE_FILTER: + return { + ...state, + hoveredFilterId: action.id, + }; + + case UNSET_HOVERED_NATIVE_FILTER: + return { + ...state, + hoveredFilterId: undefined, + }; // TODO handle SET_FILTER_CONFIG_FAIL action default: return state; diff --git a/superset-frontend/src/dashboard/reducers/types.ts b/superset-frontend/src/dashboard/reducers/types.ts index 7b3aec25241e..9e9b4e8ca5fa 100644 --- a/superset-frontend/src/dashboard/reducers/types.ts +++ b/superset-frontend/src/dashboard/reducers/types.ts @@ -30,6 +30,7 @@ export type ChartConfiguration = { id: number; crossFilters: { scope: NativeFilterScope; + chartsInScope: number[]; }; }; }; diff --git a/superset-frontend/src/dashboard/styles.ts b/superset-frontend/src/dashboard/styles.ts index 5947fd6f2614..a5f49acb85f4 100644 --- a/superset-frontend/src/dashboard/styles.ts +++ b/superset-frontend/src/dashboard/styles.ts @@ -18,15 +18,57 @@ */ import { css, SupersetTheme } from '@superset-ui/core'; +export const headerStyles = (theme: SupersetTheme) => css` + body { + h1 { + font-weight: ${theme.typography.weights.bold}; + line-height: 1.4; + font-size: ${theme.typography.sizes.xxl}px; + letter-spacing: -0.2px; + margin-top: ${theme.gridUnit * 3}px; + margin-bottom: ${theme.gridUnit * 3}px; + } + + h2 { + font-weight: ${theme.typography.weights.bold}; + line-height: 1.4; + font-size: ${theme.typography.sizes.xl}px; + margin-top: ${theme.gridUnit * 3}px; + margin-bottom: ${theme.gridUnit * 2}px; + } + + h3, + h4, + h5, + h6 { + font-weight: ${theme.typography.weights.bold}; + line-height: 1.4; + font-size: ${theme.typography.sizes.l}px; + letter-spacing: 0.2px; + margin-top: ${theme.gridUnit * 2}px; + margin-bottom: ${theme.gridUnit}px; + } + } +`; + export const filterCardPopoverStyle = (theme: SupersetTheme) => css` .filter-card-popover { width: 240px; padding: 0; border-radius: 4px; + &.ant-popover-placement-bottom { + padding-top: ${theme.gridUnit}px; + } + + &.ant-popover-placement-left { + padding-right: ${theme.gridUnit * 3}px; + } + .ant-popover-inner { box-shadow: 0 0 8px rgb(0 0 0 / 10%); } + .ant-popover-inner-content { padding: ${theme.gridUnit * 4}px; } diff --git a/superset-frontend/src/dashboard/stylesheets/builder-sidepane.less b/superset-frontend/src/dashboard/stylesheets/builder-sidepane.less deleted file mode 100644 index ad26877771a2..000000000000 --- a/superset-frontend/src/dashboard/stylesheets/builder-sidepane.less +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -@import '../../assets/stylesheets/less/variables.less'; - -.dashboard-builder-sidepane { - .dashboard-builder-sidepane-header { - font-size: @font-size-l; - font-weight: @font-weight-bold; - border-top: 1px solid @gray-light; - border-bottom: 1px solid @gray-light; - padding: 16px; - display: flex; - align-items: center; - } - - .trigger { - font-size: @font-size-l; - color: @almost-black; - opacity: 1; - margin-left: auto; - cursor: pointer; - } - - .slices-layer .trigger { - margin-left: 0; - margin-right: 20px; - } - - .viewport { - position: absolute; - transform: none !important; - overflow: hidden; - width: @builder-pane-width; - height: 100%; - box-shadow: -4px 0 4px 0 fade(@darkest, @opacity-light); - background-color: @lightest; - } - - .slider-container { - position: absolute; - background: @lightest; - width: @builder-pane-width * 2; - height: 100vh; - display: flex; - transition: all @timing-normal ease; - - &.slide-in { - left: -@builder-pane-width; - } - - &.slide-out { - left: 0; - } - - .slide-content { - width: @builder-pane-width; - } - } - - .component-layer .new-component.static, - .slices-layer .dashboard-builder-sidepane-header { - cursor: pointer; - } - - .component-layer { - .new-component.static { - cursor: pointer; - } - } - - .new-component-label { - flex-grow: 1; - } - - .slice-adder-container { - position: relative; - background-color: white; - min-height: 200px; /* for loader positioning */ - - .error-message { - padding: 16px; - } - - .controls { - display: flex; - padding: 16px; - - /* the input is wrapped in a div */ - .search-input { - flex-grow: 1; - margin-right: 16px; - } - - .dropdown.btn-group button, - input { - font-size: @font-size-m; - padding: 7px 12px; - height: 32px; - border: 1px solid @gray-light; - } - - input { - width: 100%; - - &:focus { - outline: none; - border-color: @gray; - } - } - } - - .ReactVirtualized__Grid.ReactVirtualized__List:focus { - outline: none; - } - } -} diff --git a/superset-frontend/src/dashboard/stylesheets/components/chart.less b/superset-frontend/src/dashboard/stylesheets/components/chart.less deleted file mode 100644 index 01bf3db1e7f8..000000000000 --- a/superset-frontend/src/dashboard/stylesheets/components/chart.less +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -.dashboard-component-chart-holder { - width: 100%; - height: 100%; - color: @gray-dark; - background-color: @lightest; - position: relative; - padding: 16px; - overflow-y: visible; - - // transitionable traits for when a filter is being actively focused - transition: opacity 0.2s, border-color 0.2s, box-shadow 0.2s; - border: 2px solid transparent; - - .missing-chart-container { - display: flex; - flex-direction: column; - align-items: center; - overflow-y: auto; - justify-content: center; - - .missing-chart-body { - font-size: @font-size-s; - position: relative; - display: flex; - } - } - - &.fade-in { - border-radius: @border-radius-large; - box-shadow: inset 0 0 0 2px @shadow-highlight, - 0 0 0 3px fade(@shadow-highlight, @opacity-light); - transition: box-shadow 0.2s ease-in-out, opacity 0.2s ease-in-out, - border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; - } - - &.fade-out { - border-radius: @border-radius-large; - box-shadow: none; - transition: box-shadow 0.2s ease-in-out, opacity 0.2s ease-in-out, - border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; - } -} - -.dashboard-chart { - overflow: hidden; - position: relative; - flex-shrink: 0; -} - -.dashboard-chart.dashboard-chart--overflowable { - overflow: visible; -} - -.dashboard--editing { - .dashboard-component-chart-holder { - &:after { - content: ''; - position: absolute; - width: 100%; - height: 100%; - top: 0px; - left: 0px; - z-index: @z-index-chart; - pointer-events: none; - border: 1px solid transparent; - } - - &:hover:after { - border: 1px dashed @indicator-color; - z-index: @z-index-chart--dragging; - } - } - - .resizable-container { - &:hover, - &.resizable-container--resizing:hover { - & > .dashboard-component-chart-holder:after { - border: 1px dashed @indicator-color; - } - } - } - - .resizable-container .dashboard-component-chart-holder { - .dashboard-chart { - .chart-container { - cursor: move; - opacity: 0.2; - } - - .slice_container { - /* disable chart interactions in edit mode */ - pointer-events: none; - } - } - - &:hover .dashboard-chart .chart-container { - opacity: 0.7; - } - } -} - -.dot { - @dot-diameter: 4px; - - height: @dot-diameter; - width: @dot-diameter; - border-radius: @dot-diameter / 2; - margin: @dot-diameter / 2 0; - - background-color: @gray; - display: inline-block; - - a[role='menuitem'] & { - width: 8px; - height: 8px; - margin-right: 8px; - } -} - -.time-filter-tabs > .nav-tabs { - margin-bottom: 8px; -} - -.time-filter-tabs > .nav-tabs > li > a { - padding: 4px; -} - -.full-size { - position: fixed; - z-index: @z-index-max; - left: 0; - top: 0; -} diff --git a/superset-frontend/src/dashboard/stylesheets/components/column.less b/superset-frontend/src/dashboard/stylesheets/components/column.less deleted file mode 100644 index 7d7b7baba364..000000000000 --- a/superset-frontend/src/dashboard/stylesheets/components/column.less +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -.grid-column { - width: 100%; - position: relative; -} - -/* gutters between elements in a column */ -.grid-column > :not(:only-child):not(.hover-menu):not(:last-child) { - margin-bottom: 16px; -} - -.dashboard--editing { - .grid-column:after { - content: ''; - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - z-index: @z-index-chart; - pointer-events: none; - border: 1px dashed @gray-light; - } - - .resizable-container.resizable-container--resizing:hover > .grid-column:after, - .hover-menu:hover + .grid-column:after { - border: 1px dashed @indicator-color; - z-index: @z-index-chart--dragging; - } -} - -.grid-column--empty { - min-height: 100px; - - &:before { - content: 'Empty column'; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; - color: @gray-light; - } -} diff --git a/superset-frontend/src/dashboard/stylesheets/components/header.less b/superset-frontend/src/dashboard/stylesheets/components/header.less deleted file mode 100644 index 355385d373fd..000000000000 --- a/superset-frontend/src/dashboard/stylesheets/components/header.less +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -.dashboard-component-header { - width: 100%; - font-weight: @font-weight-bold; - padding: 16px 0; - color: @almost-black; -} - -.dashboard--editing { - .dashboard-grid { - .dashboard-component-header { - &:after { - border: 1px dashed transparent; - content: ''; - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - z-index: @z-index-chart; - pointer-events: none; - } - - &:hover:after { - border: 1px dashed @indicator-color; - z-index: @z-index-chart--dragging; - } - } - } - - .dragdroppable-row .dashboard-component-header { - cursor: move; - } -} - -.header-style-option { - font-weight: @font-weight-bold; - color: @almost-black; -} - -.dashboard--editing - -/* note: sizes should be a multiple of the 8px grid unit so that rows in the grid align */ -.header-small { - font-size: @font-size-l; -} - -.header-medium { - font-size: @font-size-xl; -} - -.header-large { - font-size: @font-size-xxl; -} - -.background--white .dashboard-component-header, -.dashboard-component-header.background--white, -.dashboard-component-tabs .dashboard-component-header, -.dashboard-component-tabs .dashboard-component-divider { - padding-left: 16px; - padding-right: 16px; -} - -/* - * grids add margin between items, so don't double pad within columns - * we'll not worry about double padding on top as it can serve as a visual separator - */ -.grid-column > :not(:only-child):not(:last-child) .dashboard-component-header { - margin-bottom: -16px; -} diff --git a/superset-frontend/src/dashboard/stylesheets/components/index.less b/superset-frontend/src/dashboard/stylesheets/components/index.less deleted file mode 100644 index d99e11df2a45..000000000000 --- a/superset-frontend/src/dashboard/stylesheets/components/index.less +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -@import './chart.less'; -@import './column.less'; -@import './divider.less'; -@import './header.less'; -@import './new-component.less'; -@import './row.less'; -@import './markdown.less'; diff --git a/superset-frontend/src/dashboard/stylesheets/components/row.less b/superset-frontend/src/dashboard/stylesheets/components/row.less deleted file mode 100644 index 87b376f51dbf..000000000000 --- a/superset-frontend/src/dashboard/stylesheets/components/row.less +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -.grid-row { - position: relative; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - align-items: flex-start; - width: 100%; - height: fit-content; -} - -/* gutters between elements in a row */ -.grid-row > :not(:only-child):not(:last-child):not(.hover-menu) { - margin-right: 16px; -} - -/* hover indicator */ -.dashboard--editing { - .grid-row:after, - .dashboard-component-tabs > .hover-menu:hover + div:after { - border: 1px dashed transparent; - content: ''; - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - z-index: @z-index-chart; - pointer-events: none; - } - - .resizable-container.resizable-container--resizing:hover > .grid-row:after, - .hover-menu:hover + .grid-row:after, - .dashboard-component-tabs > .hover-menu:hover + div:after { - border: 1px dashed @indicator-color; - z-index: @z-index-chart--dragging; - } - - .grid-row:after, - .dashboard-component-tabs > .hover-menu + div:after { - border: 1px dashed @gray-light; - } - - /* provide hit area in case row contents is edge to edge */ - .dashboard-component-tabs-content { - .dragdroppable-row { - padding-top: 16px; - } - } -} - -.grid-row.grid-row--empty { - /* this centers the empty note content */ - align-items: center; - height: 100px; - - &:before { - position: absolute; - top: 0; - left: 0; - content: 'Empty row'; - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 100%; - color: @gray; - } -} diff --git a/superset-frontend/src/dashboard/stylesheets/dashboard.less b/superset-frontend/src/dashboard/stylesheets/dashboard.less deleted file mode 100644 index b69303ce1607..000000000000 --- a/superset-frontend/src/dashboard/stylesheets/dashboard.less +++ /dev/null @@ -1,165 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -/* header has mysterious extra margin */ -header.top { - margin-bottom: 2px; - z-index: 10; -} - -body { - h1 { - font-weight: @font-weight-bold; - line-height: @line-height-base; - font-size: @font-size-xxl; - letter-spacing: -0.2px; - margin-top: 12px; - margin-bottom: 12px; - } - - h2 { - font-weight: @font-weight-bold; - line-height: @line-height-base; - font-size: @font-size-xl; - margin-top: 12px; - margin-bottom: 8px; - } - - h3, - h4, - h5, - h6 { - font-weight: @font-weight-bold; - line-height: @line-height-base; - font-size: @font-size-l; - letter-spacing: 0.2px; - margin-top: 8px; - margin-bottom: 4px; - } - - p { - margin: 0 0 8px 0; - } -} - -.dashboard .chart-header { - font-size: @font-size-l; - font-weight: @font-weight-bold; - margin-bottom: 4px; - display: flex; - max-width: 100%; - align-items: flex-start; - min-height: 0; - flex-shrink: 0; - - & > .header-title { - overflow: hidden; - text-overflow: ellipsis; - max-width: 100%; - flex-grow: 1; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - - & > span.ant-tooltip-open { - display: inline; - } - } - - & > .header-controls { - display: flex; - - & > * { - margin-left: 8px; - } - } - - .dropdown.btn-group { - pointer-events: none; - vertical-align: top; - & > * { - pointer-events: auto; - } - } - - .dropdown-toggle.btn.btn-default { - background: none; - border: none; - box-shadow: none; - } - - .dropdown-menu.dropdown-menu-right { - top: 20px; - } - - .divider { - margin: 5px 0; - } - - .refresh-tooltip { - display: block; - height: 16px; - margin: 3px 0; - color: @gray; - } -} - -.dashboard .chart-header, -.dashboard .dashboard-header { - .dropdown-menu { - padding: 9px 0; - } - - .dropdown-menu li { - font-weight: @font-weight-normal; - } -} - -.react-bs-container-body { - max-height: 400px; - overflow-y: auto; -} - -.hidden, -#pageDropDown { - display: none; -} - -.separator .chart-container { - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; -} - -.dashboard .title { - margin: 0 20px; -} - -.slice_container .alert { - margin: 10px; -} - -i.danger { - color: @danger; -} - -i.warning { - color: @warning; -} diff --git a/superset-frontend/src/dashboard/stylesheets/dnd.less b/superset-frontend/src/dashboard/stylesheets/dnd.less deleted file mode 100644 index 2465c6fac066..000000000000 --- a/superset-frontend/src/dashboard/stylesheets/dnd.less +++ /dev/null @@ -1,130 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -.dragdroppable { - position: relative; -} - -// Fixes ISSUE-12181 - before in chart's contract-trigger breaks drag and drop mode -.dashboard--editing { - .contract-trigger:before { - display: none; - } -} - -.dragdroppable--dragging { - opacity: 0.2; -} - -.dragdroppable-row { - width: 100%; -} - -.dragdroppable-column { - .resizable-container { - span { - div { - z-index: @z-index-above-dashboard-charts; - } - } - } -} - -/* drop indicators */ -.drop-indicator { - display: block; - background-color: @indicator-color; - position: absolute; - z-index: @z-index-above-dashboard-charts; -} - -.drop-indicator--top { - top: 0; - left: 0; - height: 4px; - width: 100%; - min-width: 16px; -} - -.drop-indicator--bottom { - top: 100%; - left: 0; - height: 4px; - width: 100%; - min-width: 16px; -} - -.empty-droptarget:first-child { - .drop-indicator--bottom { - top: 24px; - } -} - -.drop-indicator--right { - top: 0; - left: 100%; - height: 100%; - width: 4px; - min-height: 16px; -} - -.drop-indicator--left { - top: 0; - left: 0; - height: 100%; - width: 4px; - min-height: 16px; -} - -/* empty drop targets */ -.dashboard-component-tabs-content { - & > .empty-droptarget { - position: absolute; - width: 100%; - } - - & > .empty-droptarget:first-child { - height: 14px; - top: -2px; - z-index: @z-index-above-dashboard-charts; - } - - & > .empty-droptarget:last-child { - height: 12px; - bottom: 0px; - } -} - -.grid-content { - /* note we don't do a :last-child selection because - assuming bottom empty-droptarget is last child is fragile */ - & > .empty-droptarget { - width: 100%; - height: 100%; - } - - & > .empty-droptarget:first-child { - height: 48px; - margin-top: -24px; - margin-bottom: -24px; - } - - & > .empty-droptarget:only-child { - height: 80vh; - } -} diff --git a/superset-frontend/src/dashboard/stylesheets/filter-scope-selector.less b/superset-frontend/src/dashboard/stylesheets/filter-scope-selector.less deleted file mode 100644 index e12054e09da7..000000000000 --- a/superset-frontend/src/dashboard/stylesheets/filter-scope-selector.less +++ /dev/null @@ -1,259 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -@import '../../assets/stylesheets/less/variables.less'; - -.filter-scope-container { - display: flex; - flex-direction: column; - height: 80%; - margin-right: -24px; - font-size: @font-size-m; - - .nav.nav-tabs { - border: none; - } - - .filter-scope-body { - flex: 1; - max-height: calc(100% - 128px); - - .filter-field-pane, - .filter-scope-pane { - overflow-y: scroll; - } - } - - .warning-message { - padding: 24px; - } -} - -.filter-scope-header { - height: 64px; - border-bottom: 1px solid @gray-light; - padding-left: 24px; - margin-left: -24px; - - h4 { - margin-top: 0; - } - - .selected-fields { - margin: 12px 0 16px; - visibility: hidden; - - &.multi-edit-mode { - visibility: visible; - } - - .selected-scopes { - padding-left: 5px; - } - } -} - -.filters-scope-selector { - display: flex; - flex-direction: row; - position: relative; - height: 100%; - - a, - a:active, - a:hover { - color: @almost-black; - text-decoration: none; - } - - .react-checkbox-tree .rct-icon.rct-icon-expand-all, - .react-checkbox-tree .rct-icon.rct-icon-collapse-all { - font-size: @font-size-m; - font-family: @font-family-sans-serif; - color: @brand-primary; - - &::before { - content: ''; - } - - &:hover { - text-decoration: underline; - } - - &:focus { - outline: none; - } - } - - .filter-field-pane { - position: relative; - width: 40%; - padding: 16px 16px 16px 0; - border-right: 1px solid @gray-light; - - .filter-container { - label { - font-weight: @font-weight-normal; - margin: 0 0 0 16px; - word-break: break-all; - } - } - - .filter-field-item { - height: 35px; - display: flex; - align-items: center; - justify-content: center; - padding: 0 24px; - margin-left: -24px; - - &.is-selected { - border: 1px solid @gray-heading; - border-radius: @border-radius-large; - background-color: @gray-bg; - margin-left: -25px; - } - } - - .react-checkbox-tree { - .rct-title .root { - font-weight: @font-weight-bold; - } - - .rct-text { - height: 40px; - } - } - } - - .filter-scope-pane { - position: relative; - flex: 1; - padding: 16px 24px 16px 16px; - } - - .react-checkbox-tree { - flex-direction: column; - color: @almost-black; - font-size: @font-size-m; - - .filter-scope-type { - padding: 8px 0; - display: flex; - align-items: center; - - &.chart { - font-weight: @font-weight-normal; - } - - &.selected-filter { - padding-left: 28px; - position: relative; - color: @gray-heading; - - &::before { - content: ' '; - position: absolute; - left: 0; - top: 50%; - width: 18px; - height: 18px; - border-radius: @border-radius-normal; - margin-top: -9px; - box-shadow: inset 0 0 0 2px @gray-light; - background: #f2f2f2; - } - } - - &.root { - font-weight: @font-weight-bold; - } - } - - .rct-checkbox { - svg { - position: relative; - top: 3px; - width: 18px; - } - } - - .rct-node-leaf { - .rct-bare-label { - &::before { - padding-left: 5px; - } - } - } - - .rct-options { - text-align: left; - margin-left: 0; - margin-bottom: 8px; - } - - .rct-text { - margin: 0; - display: flex; - } - - .rct-title { - display: block; - } - - // disable style from react-checkbox-trees.css - .rct-node-clickable:hover, - .rct-node-clickable:focus, - label:hover, - label:active { - background: none !important; - } - } - - .multi-edit-mode { - &.filter-scope-pane { - .rct-node.rct-node-leaf .filter-scope-type.filter_box { - display: none; - } - } - - .filter-field-item { - padding: 0 16px 0 50px; - margin-left: -50px; - - &.is-selected { - margin-left: -51px; - } - } - } - - .scope-search { - position: absolute; - right: 16px; - top: 16px; - border-radius: @border-radius-large; - border: 1px solid @gray-light; - padding: 4px 8px 4px 8px; - font-size: @font-size-m; - outline: none; - - &:focus { - border: 1px solid @brand-primary; - } - } -} diff --git a/superset-frontend/src/dashboard/stylesheets/popover-menu.less b/superset-frontend/src/dashboard/stylesheets/popover-menu.less deleted file mode 100644 index 4abc49499360..000000000000 --- a/superset-frontend/src/dashboard/stylesheets/popover-menu.less +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -.with-popover-menu { - position: relative; - outline: none; -} - -.grid-row.grid-row--empty .with-popover-menu { - /* drop indicator doesn't show up without this */ - width: 100%; - height: 100%; -} - -.with-popover-menu--focused:after { - content: ''; - position: absolute; - top: 0px; - left: 0px; - width: 100%; - height: 100%; - border: 2px solid @indicator-color; - pointer-events: none; -} - -.popover-menu { - position: absolute; - flex-wrap: nowrap; - left: 1px; - top: -42px; - height: 40px; - padding: 0 16px; - background: @lightest; - box-shadow: 0 1px 2px 1px fade(@darkest, @opacity-medium-light); - font-size: @font-size-m; - cursor: default; - z-index: @z-index-max; - - &, - .menu-item { - display: flex; - flex-direction: row; - align-items: center; - } - - /* vertical spacer after each menu item */ - .menu-item:not(:only-child):not(:last-child):after { - content: ''; - width: 1; - height: 100%; - background: @gray-light; - margin: 0 16px; - } -} - -/* the focus menu doesn't account for parent padding */ -.dashboard-component-tabs li .with-popover-menu--focused:after { - top: -12px; - left: -8px; - width: ~'calc(100% + 16px)'; /* escape for .less */ - height: ~'calc(100% + 28px)'; -} - -.dashboard-component-tabs li .popover-menu { - top: -56px; - left: -7px; -} - -.hover-dropdown .btn { - &:hover, - &:active, - &:focus { - background: initial; - box-shadow: none; - } -} - -.hover-dropdown, -.popover-menu { - li.dropdown-item { - &:hover a { - background: @menu-hover; - } - - &.active a { - background: @gray-light; - font-weight: @font-weight-bold; - color: @almost-black; - } - } -} - -/* background style menu */ -.background-style-option { - display: inline-block; - - &:before { - content: ''; - width: 1em; - height: 1em; - margin-right: 8px; - display: inline-block; - vertical-align: middle; - } - - &.background--white { - padding-left: 0; - background: transparent; - - &:before { - background: @lightest; - border: 1px solid @gray-light; - } - } - - /* Create the transparent rect icon */ - &.background--transparent:before { - background-image: linear-gradient(45deg, @gray 25%, transparent 25%), - linear-gradient(-45deg, @gray 25%, transparent 25%), - linear-gradient(45deg, transparent 75%, @gray 75%), - linear-gradient(-45deg, transparent 75%, @gray 75%); - background-size: 8px 8px; - background-position: 0 0, 0 4px, 4px -4px, -4px 0px; - } -} diff --git a/superset-frontend/src/dashboard/stylesheets/resizable.less b/superset-frontend/src/dashboard/stylesheets/resizable.less deleted file mode 100644 index be7182716d04..000000000000 --- a/superset-frontend/src/dashboard/stylesheets/resizable.less +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -.resizable-container { - background-color: transparent; - position: relative; - - /* re-resizable sets an empty div to 100% width and height, which doesn't - play well with many 100% height containers we need - */ - & ~ div { - width: auto !important; - height: auto !important; - } -} - -.resizable-container--resizing { - /* after ensures border visibility on top of any children */ - &:after { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - box-shadow: inset 0 0 0 2px @indicator-color; - } - - & > span .resize-handle { - border-color: @indicator-color; - } -} - -.resize-handle { - opacity: 0; - z-index: @z-index-above-dashboard-charts; - - &--bottom-right { - position: absolute; - border: solid; - border-width: 0 1.5px 1.5px 0; - border-right-color: @gray; - border-bottom-color: @gray; - right: 16px; - bottom: 16px; - width: 8px; - height: 8px; - } - - &--right { - width: 2px; - height: 20px; - right: 4px; - top: 50%; - transform: translate(0, -50%); - position: absolute; - border-left: 1px solid @gray; - border-right: 1px solid @gray; - } - - &--bottom { - height: 2px; - width: 20px; - bottom: 4px; - left: 50%; - transform: translate(-50%); - position: absolute; - border-top: 1px solid @gray; - border-bottom: 1px solid @gray; - } -} - -.resizable-container:hover .resize-handle, -.resizable-container--resizing .resize-handle { - opacity: 1; -} - -.dragdroppable-column .resizable-container-handle--right { - /* override the default because the inner column's handle's mouse target is very small */ - right: 0 !important; -} - -.dragdroppable-column .dragdroppable-column .resizable-container-handle--right { - /* override the default because the inner column's handle's mouse target is very small */ - right: 0 !important; -} - -.resizable-container-handle--bottom { - bottom: 0 !important; -} diff --git a/superset-frontend/src/dashboard/types.ts b/superset-frontend/src/dashboard/types.ts index e4b8227689ce..87dee0b05ab6 100644 --- a/superset-frontend/src/dashboard/types.ts +++ b/superset-frontend/src/dashboard/types.ts @@ -27,8 +27,9 @@ import { import { Dataset } from '@superset-ui/chart-controls'; import { chart } from 'src/components/Chart/chartReducer'; import componentTypes from 'src/dashboard/util/componentTypes'; +import { UrlParamEntries } from 'src/utils/urlUtils'; -import { User } from 'src/types/bootstrapTypes'; +import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; import { ChartState } from '../explore/types'; export { Dashboard } from 'src/types/Dashboard'; @@ -39,19 +40,23 @@ export type ChartReducerInitialState = typeof chart; // Ref: https://github.com/apache/superset/blob/dcac860f3e5528ecbc39e58f045c7388adb5c3d0/superset-frontend/src/dashboard/reducers/getInitialState.js#L120 export interface ChartQueryPayload extends Partial<ChartReducerInitialState> { id: number; - formData: ChartProps['formData']; form_data?: ChartProps['rawFormData']; [key: string]: unknown; } /** Chart state of redux */ export type Chart = ChartState & { - formData: { + form_data: { viz_type: string; datasource: string; }; }; +export enum FilterBarOrientation { + VERTICAL = 'VERTICAL', + HORIZONTAL = 'HORIZONTAL', +} + export type ActiveTabs = string[]; export type DashboardLayout = { [key: string]: LayoutItem }; export type DashboardLayoutState = { present: DashboardLayout }; @@ -65,6 +70,25 @@ export type DashboardState = { isRefreshing: boolean; isFiltersRefreshing: boolean; hasUnsavedChanges: boolean; + dashboardIsSaving: boolean; + colorScheme: string; + sliceIds: number[]; + directPathLastUpdated: number; + focusedFilterField?: { + chartId: number; + column: string; + }; + overwriteConfirmMetadata?: { + updatedAt: string; + updatedBy: string; + overwriteConfirmItems: { + keyPath: string; + oldValue: string; + newValue: string; + }[]; + dashboardId: number; + data: JsonObject; + }; }; export type DashboardInfo = { id: number; @@ -79,7 +103,15 @@ export type DashboardInfo = { native_filter_configuration: JsonObject; show_native_filters: boolean; chart_configuration: JsonObject; + color_scheme: string; + color_namespace: string; + color_scheme_domain: string[]; + label_colors: JsonObject; + shared_label_colors: JsonObject; + cross_filters_enabled: boolean; }; + crossFiltersEnabled: boolean; + filterBarOrientation: FilterBarOrientation; }; export type ChartsState = { [key: string]: Chart }; @@ -105,7 +137,7 @@ export type RootState = { dataMask: DataMaskStateWithId; impressionId: string; nativeFilters: NativeFiltersState; - user: User; + user: UserWithPermissionsAndRoles; }; /** State of dashboardLayout in redux */ @@ -145,13 +177,17 @@ export type ActiveFilters = { [key: string]: ActiveFilter; }; -export type DashboardPermalinkValue = { +export interface DashboardPermalinkState { + dataMask: DataMaskStateWithId; + activeTabs: string[]; + anchor: string; + urlParams?: UrlParamEntries; +} + +export interface DashboardPermalinkValue { dashboardId: string; - state: { - filterState: DataMaskStateWithId; - hash: string; - }; -}; + state: DashboardPermalinkState; +} export type EmbeddedDashboard = { uuid: string; diff --git a/superset-frontend/src/dashboard/util/activeAllDashboardFilters.ts b/superset-frontend/src/dashboard/util/activeAllDashboardFilters.ts index f0a9b709ee5d..14ae2d4ea083 100644 --- a/superset-frontend/src/dashboard/util/activeAllDashboardFilters.ts +++ b/superset-frontend/src/dashboard/util/activeAllDashboardFilters.ts @@ -18,61 +18,11 @@ */ import { DataMaskStateWithId, - Filters, + PartialFilters, JsonObject, - NativeFilterScope, } from '@superset-ui/core'; -import { CHART_TYPE } from './componentTypes'; -import { ActiveFilters, Layout, LayoutItem } from '../types'; +import { ActiveFilters } from '../types'; import { ChartConfiguration } from '../reducers/types'; -import { DASHBOARD_ROOT_ID } from './constants'; - -// Looking for affected chart scopes and values -export const findAffectedCharts = ({ - child, - layout, - scope, - activeFilters, - filterId, - extraFormData, -}: { - child: string; - layout: { [key: string]: LayoutItem }; - scope: NativeFilterScope; - activeFilters: ActiveFilters; - filterId: string; - extraFormData: any; -}) => { - const chartId = layout[child]?.meta?.chartId; - if (layout[child].type === CHART_TYPE) { - // Ignore excluded charts - if (scope.excluded.includes(chartId)) { - return; - } - if (!activeFilters[filterId]) { - // Small mutation but simplify logic - // eslint-disable-next-line no-param-reassign - activeFilters[filterId] = { - scope: [], - values: extraFormData, - }; - } - // Add not excluded chart scopes(to know what charts refresh) and values(refresh only if its value changed) - activeFilters[filterId].scope.push(chartId); - return; - } - // If child is not chart, recursive iterate over its children - layout[child].children.forEach((child: string) => - findAffectedCharts({ - child, - layout, - scope, - activeFilters, - filterId, - extraFormData, - }), - ); -}; export const getRelevantDataMask = ( dataMask: DataMaskStateWithId, @@ -89,36 +39,27 @@ export const getAllActiveFilters = ({ chartConfiguration, nativeFilters, dataMask, - layout, + allSliceIds, }: { chartConfiguration: ChartConfiguration; dataMask: DataMaskStateWithId; - nativeFilters: Filters; - layout: Layout; + nativeFilters: PartialFilters; + allSliceIds: number[]; }): ActiveFilters => { const activeFilters = {}; // Combine native filters with cross filters, because they have similar logic Object.values(dataMask).forEach(({ id: filterId, extraFormData }) => { - const scope = nativeFilters?.[filterId]?.scope ?? - chartConfiguration?.[filterId]?.crossFilters?.scope ?? { - rootPath: [DASHBOARD_ROOT_ID], - excluded: [filterId], - }; + const scope = + nativeFilters?.[filterId]?.chartsInScope ?? + chartConfiguration?.[filterId]?.crossFilters?.chartsInScope ?? + allSliceIds ?? + []; // Iterate over all roots to find all affected charts - scope.rootPath.forEach((layoutItemId: string | number) => { - layout[layoutItemId]?.children?.forEach((child: string) => { - // Need exclude from affected charts, charts that located in scope `excluded` - findAffectedCharts({ - child, - layout, - scope, - activeFilters, - filterId, - extraFormData, - }); - }); - }); + activeFilters[filterId] = { + scope, + values: extraFormData, + }; }); return activeFilters; }; diff --git a/superset-frontend/src/dashboard/util/activeDashboardFilters.js b/superset-frontend/src/dashboard/util/activeDashboardFilters.js index 41871f7c0b08..3369dc1c5be6 100644 --- a/superset-frontend/src/dashboard/util/activeDashboardFilters.js +++ b/superset-frontend/src/dashboard/util/activeDashboardFilters.js @@ -45,10 +45,10 @@ export function isFilterBox(chartId) { // this function is to find all filter values applied to a chart, // it goes through all active filters and their scopes. // return: { [column]: array of selected values } -export function getAppliedFilterValues(chartId) { +export function getAppliedFilterValues(chartId, filters) { // use cached data if possible if (!(chartId in appliedFilterValuesByChart)) { - const applicableFilters = Object.entries(activeFilters).filter( + const applicableFilters = Object.entries(filters || activeFilters).filter( ([, { scope: chartIds }]) => chartIds.includes(chartId), ); appliedFilterValuesByChart[chartId] = flow( diff --git a/superset-frontend/src/dashboard/util/charts/getFormDataWithExtraFilters.ts b/superset-frontend/src/dashboard/util/charts/getFormDataWithExtraFilters.ts index 0bbabfcde52d..cbed55755a89 100644 --- a/superset-frontend/src/dashboard/util/charts/getFormDataWithExtraFilters.ts +++ b/superset-frontend/src/dashboard/util/charts/getFormDataWithExtraFilters.ts @@ -20,9 +20,9 @@ import { DataMaskStateWithId, DataRecordFilters, JsonObject, - NativeFiltersState, + PartialFilters, } from '@superset-ui/core'; -import { ChartQueryPayload, Charts, LayoutItem } from 'src/dashboard/types'; +import { ChartQueryPayload } from 'src/dashboard/types'; import { getExtraFormData } from 'src/dashboard/components/nativeFilters/utils'; import { areObjectsEqual } from 'src/reduxUtils'; import getEffectiveExtraFilters from './getEffectiveExtraFilters'; @@ -37,17 +37,16 @@ const cachedFormdataByChart = {}; export interface GetFormDataWithExtraFiltersArguments { chartConfiguration: ChartConfiguration; chart: ChartQueryPayload; - charts: Charts; filters: DataRecordFilters; - layout: { [key: string]: LayoutItem }; colorScheme?: string; colorNamespace?: string; sliceId: number; dataMask: DataMaskStateWithId; - nativeFilters: NativeFiltersState; + nativeFilters: PartialFilters; extraControls: Record<string, string | boolean | null>; labelColors?: Record<string, string>; sharedLabelColors?: Record<string, string>; + allSliceIds: number[]; } // this function merge chart's formData with dashboard filters value, @@ -55,18 +54,17 @@ export interface GetFormDataWithExtraFiltersArguments { // filters param only contains those applicable to this chart. export default function getFormDataWithExtraFilters({ chart, - charts, filters, nativeFilters, chartConfiguration, colorScheme, colorNamespace, sliceId, - layout, dataMask, extraControls, labelColors, sharedLabelColors, + allSliceIds, }: GetFormDataWithExtraFiltersArguments) { // if dashboard metadata + filters have not changed, use cache if possible const cachedFormData = cachedFormdataByChart[sliceId]; @@ -99,24 +97,20 @@ export default function getFormDataWithExtraFilters({ const activeFilters = getAllActiveFilters({ chartConfiguration, dataMask, - layout, - nativeFilters: nativeFilters.filters, + nativeFilters, + allSliceIds, }); const filterIdsAppliedOnChart = Object.entries(activeFilters) .filter(([, { scope }]) => scope.includes(chart.id)) .map(([filterId]) => filterId); if (filterIdsAppliedOnChart.length) { extraData = { - extra_form_data: getExtraFormData( - dataMask, - charts, - filterIdsAppliedOnChart, - ), + extra_form_data: getExtraFormData(dataMask, filterIdsAppliedOnChart), }; } const formData = { - ...chart.formData, + ...chart.form_data, label_colors: labelColors, shared_label_colors: sharedLabelColors, ...(colorScheme && { color_scheme: colorScheme }), diff --git a/superset-frontend/src/dashboard/util/constants.ts b/superset-frontend/src/dashboard/util/constants.ts index 640028eb4e94..0743d7a5a42d 100644 --- a/superset-frontend/src/dashboard/util/constants.ts +++ b/superset-frontend/src/dashboard/util/constants.ts @@ -58,6 +58,7 @@ export const UNDO_LIMIT = 50; // save dash options export const SAVE_TYPE_OVERWRITE = 'overwrite'; +export const SAVE_TYPE_OVERWRITE_CONFIRMED = 'overwriteConfirmed'; export const SAVE_TYPE_NEWDASHBOARD = 'newDashboard'; // default dashboard layout data size limit diff --git a/superset-frontend/src/dashboard/util/crossFilters.ts b/superset-frontend/src/dashboard/util/crossFilters.ts new file mode 100644 index 000000000000..061ed82634ac --- /dev/null +++ b/superset-frontend/src/dashboard/util/crossFilters.ts @@ -0,0 +1,26 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { FeatureFlag, isFeatureEnabled } from '@superset-ui/core'; + +export const isCrossFiltersEnabled = ( + metadataCrossFiltersEnabled: boolean | undefined, +): boolean => + isFeatureEnabled(FeatureFlag.DASHBOARD_CROSS_FILTERS) && + (metadataCrossFiltersEnabled === undefined || metadataCrossFiltersEnabled); diff --git a/superset-frontend/src/dashboard/util/filterboxMigrationHelper.test.ts b/superset-frontend/src/dashboard/util/filterboxMigrationHelper.test.ts index 82ed0dd8ac40..f59f36541e35 100644 --- a/superset-frontend/src/dashboard/util/filterboxMigrationHelper.test.ts +++ b/superset-frontend/src/dashboard/util/filterboxMigrationHelper.test.ts @@ -61,7 +61,7 @@ const regionFilter = { }, modified: '<bound method AuditMixinNullable.modified of Region Filter>', slice_name: 'Region Filter', - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%2032%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%2032%7D', slice_id: 32, }; const chart1 = { @@ -88,7 +88,7 @@ const chart1 = { }, modified: "<bound method AuditMixinNullable.modified of World's Population>", slice_name: "World's Population", - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%2033%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%2033%7D', slice_id: 33, }; const chartData = [regionFilter, chart1]; diff --git a/superset-frontend/src/dashboard/util/filterboxMigrationHelper.ts b/superset-frontend/src/dashboard/util/filterboxMigrationHelper.ts index 44356637682f..61ceec831014 100644 --- a/superset-frontend/src/dashboard/util/filterboxMigrationHelper.ts +++ b/superset-frontend/src/dashboard/util/filterboxMigrationHelper.ts @@ -51,9 +51,6 @@ interface SliceData { granularity_sqla?: string; time_grain_sqla?: string; time_range?: string; - druid_time_origin?: string; - show_druid_time_granularity?: boolean; - show_druid_time_origin?: boolean; show_sqla_time_column?: boolean; show_sqla_time_granularity?: boolean; viz_type: string; @@ -75,7 +72,7 @@ interface PreselectedFilterColumn { [key: string]: boolean | string | number | string[] | number[]; } -interface PreselectedFiltersMeatadata { +interface PreselectedFiltersMetadata { [key: string]: PreselectedFilterColumn; } @@ -101,12 +98,9 @@ enum FILTER_COMPONENT_FILTER_TYPES { } const getPreselectedValuesFromDashboard = - (preselectedFilters: PreselectedFiltersMeatadata) => + (preselectedFilters: PreselectedFiltersMetadata) => (filterKey: string, column: string) => { - if ( - preselectedFilters[filterKey] && - preselectedFilters[filterKey][column] - ) { + if (preselectedFilters[filterKey]?.[column]) { // overwrite default values by dashboard default_filters return preselectedFilters[filterKey][column]; } @@ -161,7 +155,7 @@ const getFilterboxDependencies = (filterScopes: FilterScopesMetadata) => { export default function getNativeFilterConfig( chartData: SliceData[] = [], filterScopes: FilterScopesMetadata = {}, - preselectFilters: PreselectedFiltersMeatadata = {}, + preselectFilters: PreselectedFiltersMetadata = {}, ): Filter[] { const filterConfig: Filter[] = []; const filterBoxToFilterComponentMap: FilterBoxToFilterComponentMap = {}; @@ -206,12 +200,8 @@ export default function getNativeFilterConfig( adhoc_filters = [], datasource = '', date_filter = false, - druid_time_origin, filter_configs = [], - granularity, granularity_sqla, - show_druid_time_granularity = false, - show_druid_time_origin = false, show_sqla_time_column = false, show_sqla_time_granularity = false, time_grain_sqla, @@ -344,96 +334,6 @@ export default function getNativeFilterConfig( } filterConfig.push(timeColumnFilter); } - - if (show_druid_time_granularity) { - const { scope, immune }: FilterScopeType = - scopesByChartId[TIME_FILTER_MAP.granularity] || - DASHBOARD_FILTER_SCOPE_GLOBAL; - const druidGranularityFilter: Filter = { - id: `NATIVE_FILTER-${shortid.generate()}`, - description: 'time grain filter', - controlValues: {}, - name: TIME_FILTER_LABELS.granularity, - filterType: FILTER_COMPONENT_FILTER_TYPES.FILTER_TIMEGRAIN, - targets: [ - { - datasetId: parseInt(datasource.split('__')[0], 10), - }, - ], - cascadeParentIds: [], - defaultDataMask: {}, - type: NativeFilterType.NATIVE_FILTER, - scope: { - rootPath: scope, - excluded: immune, - }, - }; - filterBoxToFilterComponentMap[key][TIME_FILTER_MAP.granularity] = - druidGranularityFilter.id; - const dashboardDefaultValues = getDashboardDefaultValues( - key, - TIME_FILTER_MAP.granularity, - ); - if (!isEmpty(dashboardDefaultValues)) { - druidGranularityFilter.defaultDataMask = { - extraFormData: { - granularity_sqla: (dashboardDefaultValues || - granularity) as string, - }, - filterState: { - value: setValuesInArray(dashboardDefaultValues, granularity), - }, - }; - } - filterConfig.push(druidGranularityFilter); - } - - if (show_druid_time_origin) { - const { scope, immune }: FilterScopeType = - scopesByChartId[TIME_FILTER_MAP.druid_time_origin] || - DASHBOARD_FILTER_SCOPE_GLOBAL; - const druidOriginFilter: Filter = { - id: `NATIVE_FILTER-${shortid.generate()}`, - description: 'time column filter', - controlValues: {}, - name: TIME_FILTER_LABELS.druid_time_origin, - filterType: FILTER_COMPONENT_FILTER_TYPES.FILTER_TIMECOLUMN, - targets: [ - { - datasetId: parseInt(datasource.split('__')[0], 10), - }, - ], - cascadeParentIds: [], - defaultDataMask: {}, - type: NativeFilterType.NATIVE_FILTER, - scope: { - rootPath: scope, - excluded: immune, - }, - }; - filterBoxToFilterComponentMap[key][ - TIME_FILTER_MAP.druid_time_origin - ] = druidOriginFilter.id; - const dashboardDefaultValues = getDashboardDefaultValues( - key, - TIME_FILTER_MAP.druid_time_origin, - ); - if (!isEmpty(dashboardDefaultValues)) { - druidOriginFilter.defaultDataMask = { - extraFormData: { - granularity_sqla: (dashboardDefaultValues || - druid_time_origin) as string, - }, - filterState: { - value: setValuesInArray( - dashboardDefaultValues, - druid_time_origin, - ), - }, - }; - } - filterConfig.push(druidOriginFilter); - } } filter_configs.forEach(config => { diff --git a/superset-frontend/src/dashboard/util/findParentId.test.js b/superset-frontend/src/dashboard/util/findParentId.test.ts similarity index 79% rename from superset-frontend/src/dashboard/util/findParentId.test.js rename to superset-frontend/src/dashboard/util/findParentId.test.ts index d63be401076a..b5fe36c59de7 100644 --- a/superset-frontend/src/dashboard/util/findParentId.test.js +++ b/superset-frontend/src/dashboard/util/findParentId.test.ts @@ -41,4 +41,15 @@ describe('findParentId', () => { it('should return null if the parent cannot be found', () => { expect(findParentId({ childId: 'a', layout })).toBeNull(); }); + + it('should not throw error and return null with bad / missing inputs', () => { + // @ts-ignore + expect(findParentId(null)).toBeNull(); + // @ts-ignore + expect(findParentId({ layout })).toBeNull(); + // @ts-ignore + expect(findParentId({ childId: 'a' })).toBeNull(); + // @ts-ignore + expect(findParentId({ childId: 'a', layout: null })).toBeNull(); + }); }); diff --git a/superset-frontend/src/dashboard/util/findParentId.ts b/superset-frontend/src/dashboard/util/findParentId.ts new file mode 100644 index 000000000000..d8dbb4dbf251 --- /dev/null +++ b/superset-frontend/src/dashboard/util/findParentId.ts @@ -0,0 +1,68 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +interface ILayoutItem { + [key: string]: { + id: string; + children: string[]; + }; +} + +interface IStructure { + childId: string; + layout: ILayoutItem; +} + +function findParentId(structure: IStructure): string | null { + let parentId = null; + if (structure) { + const { childId, layout = {} } = structure; + // default assignment to layout only works if value is undefined, not null + if (layout) { + const ids = Object.keys(layout); + for (let i = 0; i <= ids.length - 1; i += 1) { + const id = ids[i]; + const component = layout[id] || {}; + if (id !== childId && component?.children?.includes?.(childId)) { + parentId = id; + break; + } + } + } + } + return parentId; +} + +const cache = {}; +export default function findParentIdWithCache( + structure: IStructure, +): string | null { + let parentId = null; + if (structure) { + const { childId, layout = {} } = structure; + if (cache[childId]) { + const lastParent = layout?.[cache[childId]] || {}; + if (lastParent?.children && lastParent?.children?.includes?.(childId)) { + return lastParent.id; + } + } + parentId = findParentId({ childId, layout }); + cache[childId] = parentId; + } + return parentId; +} diff --git a/superset-frontend/src/dashboard/util/findTabIndexByComponentId.test.js b/superset-frontend/src/dashboard/util/findTabIndexByComponentId.test.js index 3a3672c030b8..c41ea486335f 100644 --- a/superset-frontend/src/dashboard/util/findTabIndexByComponentId.test.js +++ b/superset-frontend/src/dashboard/util/findTabIndexByComponentId.test.js @@ -4,7 +4,7 @@ * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the - * 'License'); you may not use this file except in compliance + * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 diff --git a/superset-frontend/src/dashboard/util/getFilterConfigsFromFormdata.js b/superset-frontend/src/dashboard/util/getFilterConfigsFromFormdata.js index 807076cfabcd..46f4512a0a9d 100644 --- a/superset-frontend/src/dashboard/util/getFilterConfigsFromFormdata.js +++ b/superset-frontend/src/dashboard/util/getFilterConfigsFromFormdata.js @@ -28,7 +28,6 @@ export default function getFilterConfigsFromFormdata(form_data = {}) { date_filter, filter_configs = [], show_druid_time_granularity, - show_druid_time_origin, show_sqla_time_column, show_sqla_time_granularity, } = form_data; @@ -101,13 +100,6 @@ export default function getFilterConfigsFromFormdata(form_data = {}) { }; } - if (show_druid_time_origin) { - updatedColumns = { - ...updatedColumns, - [TIME_FILTER_MAP.druid_time_origin]: form_data.druid_time_origin, - }; - } - configs = { ...configs, columns: updatedColumns, diff --git a/superset-frontend/src/dashboard/util/getFormDataWithExtraFilters.test.ts b/superset-frontend/src/dashboard/util/getFormDataWithExtraFilters.test.ts index 021a488e3779..34cbe4b1bd97 100644 --- a/superset-frontend/src/dashboard/util/getFormDataWithExtraFilters.test.ts +++ b/superset-frontend/src/dashboard/util/getFormDataWithExtraFilters.test.ts @@ -35,7 +35,7 @@ describe('getFormDataWithExtraFilters', () => { queryController: null, queriesResponse: null, triggerQuery: false, - formData: { + form_data: { viz_type: 'filter_select', filters: [ { @@ -45,23 +45,18 @@ describe('getFormDataWithExtraFilters', () => { }, ], datasource: '123', + url_params: {}, }, }; const mockArgs: GetFormDataWithExtraFiltersArguments = { chartConfiguration: {}, - charts: { - [chartId as number]: mockChart, - }, chart: mockChart, filters: { region: ['Spain'], color: ['pink', 'purple'], }, sliceId: chartId, - nativeFilters: { - filters: {}, - filterSets: {}, - }, + nativeFilters: {}, dataMask: { [filterId]: { id: filterId, @@ -70,10 +65,10 @@ describe('getFormDataWithExtraFilters', () => { ownState: {}, }, }, - layout: {}, extraControls: { stack: 'Stacked', }, + allSliceIds: [chartId], }; it('should include filters from the passed filters', () => { diff --git a/superset-frontend/src/dashboard/util/getOverwriteItems.test.ts b/superset-frontend/src/dashboard/util/getOverwriteItems.test.ts new file mode 100644 index 000000000000..e4328fb08897 --- /dev/null +++ b/superset-frontend/src/dashboard/util/getOverwriteItems.test.ts @@ -0,0 +1,57 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import getOverwriteItems from './getOverwriteItems'; + +test('returns diff items', () => { + const prevFilterScopes = { + filter1: { + scope: ['abc'], + immune: [], + }, + }; + const nextFilterScopes = { + scope: ['ROOT_ID'], + immune: ['efg'], + }; + + const prevValue = { + css: '', + json_metadata: JSON.stringify({ + filter_scopes: prevFilterScopes, + default_filters: {}, + }), + }; + + const nextValue = { + css: '.updated_css {color: white;}', + json_metadata: JSON.stringify({ + filter_scopes: nextFilterScopes, + default_filters: {}, + }), + }; + expect(getOverwriteItems(prevValue, nextValue)).toEqual([ + { keyPath: 'css', newValue: nextValue.css, oldValue: prevValue.css }, + { + keyPath: 'json_metadata.filter_scopes', + newValue: JSON.stringify(nextFilterScopes, null, 2), + oldValue: JSON.stringify(prevFilterScopes, null, 2), + }, + ]); +}); diff --git a/superset-frontend/src/dashboard/util/getOverwriteItems.ts b/superset-frontend/src/dashboard/util/getOverwriteItems.ts new file mode 100644 index 000000000000..7492b8aeacf7 --- /dev/null +++ b/superset-frontend/src/dashboard/util/getOverwriteItems.ts @@ -0,0 +1,46 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { JsonObject } from '@superset-ui/core'; +import { OVERWRITE_INSPECT_FIELDS } from 'src/dashboard/constants'; + +const JSON_KEYS = new Set(['json_metadata', 'position_json']); + +function extractValue(object: JsonObject, keyPath: string) { + return keyPath.split('.').reduce((obj: JsonObject, key: string) => { + const value = obj?.[key]; + return JSON_KEYS.has(key) && value ? JSON.parse(value) : value; + }, object); +} + +export default function getOverwriteItems(prev: JsonObject, next: JsonObject) { + return OVERWRITE_INSPECT_FIELDS.map(keyPath => ({ + keyPath, + ...(keyPath.split('.').find(key => JSON_KEYS.has(key)) + ? { + oldValue: + JSON.stringify(extractValue(prev, keyPath), null, 2) || '{}', + newValue: + JSON.stringify(extractValue(next, keyPath), null, 2) || '{}', + } + : { + oldValue: extractValue(prev, keyPath) || '', + newValue: extractValue(next, keyPath) || '', + }), + })).filter(({ oldValue, newValue }) => oldValue !== newValue); +} diff --git a/superset-frontend/src/dashboard/util/getSliceHeaderTooltip.tsx b/superset-frontend/src/dashboard/util/getSliceHeaderTooltip.tsx new file mode 100644 index 000000000000..57def408b6c6 --- /dev/null +++ b/superset-frontend/src/dashboard/util/getSliceHeaderTooltip.tsx @@ -0,0 +1,44 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { FeatureFlag, isFeatureEnabled, t } from '@superset-ui/core'; +import { detectOS } from 'src/utils/common'; + +export const getSliceHeaderTooltip = (sliceName: string | undefined) => { + if (isFeatureEnabled(FeatureFlag.DASHBOARD_EDIT_CHART_IN_NEW_TAB)) { + return sliceName + ? t('Click to edit %s in a new tab', sliceName) + : t('Click to edit chart.'); + } + const isMac = detectOS() === 'MacOS'; + const firstLine = sliceName + ? t('Click to edit %s.', sliceName) + : t('Click to edit chart.'); + const secondLine = t( + 'Use %s to open in a new tab.', + isMac ? t('⌘ + click') : t('ctrl + click'), + ); + return ( + <> + <div>{firstLine}</div> + <div>{secondLine}</div> + </> + ); +}; diff --git a/superset-frontend/src/dashboard/util/logging/childChartsDidLoad.js b/superset-frontend/src/dashboard/util/logging/childChartsDidLoad.js index fc6fa68fbd5d..7cef9ae6dc52 100644 --- a/superset-frontend/src/dashboard/util/logging/childChartsDidLoad.js +++ b/superset-frontend/src/dashboard/util/logging/childChartsDidLoad.js @@ -26,7 +26,7 @@ export default function childChartsDidLoad({ chartQueries, layout, id }) { const query = chartQueries[chartId] || {}; // filterbox's don't re-render, don't use stale update time - if (query.formData && query.formData.viz_type !== 'filter_box') { + if (query.form_data && query.form_data.viz_type !== 'filter_box') { minQueryStartTime = Math.min( query.chartUpdateStartTime, minQueryStartTime, diff --git a/superset-frontend/src/dashboard/util/newComponentFactory.js b/superset-frontend/src/dashboard/util/newComponentFactory.js index 8fddfda83c38..bec990b4e660 100644 --- a/superset-frontend/src/dashboard/util/newComponentFactory.js +++ b/superset-frontend/src/dashboard/util/newComponentFactory.js @@ -46,7 +46,7 @@ const typeToDefaultMetaData = { }, [DIVIDER_TYPE]: null, [HEADER_TYPE]: { - text: 'New header', + text: t('New header'), headerSize: MEDIUM_HEADER, background: BACKGROUND_TRANSPARENT, }, diff --git a/superset-frontend/src/dashboard/util/findPermission.test.ts b/superset-frontend/src/dashboard/util/permissionUtils.test.ts similarity index 74% rename from superset-frontend/src/dashboard/util/findPermission.test.ts rename to superset-frontend/src/dashboard/util/permissionUtils.test.ts index 0752bad40444..d19b048769ec 100644 --- a/superset-frontend/src/dashboard/util/findPermission.test.ts +++ b/superset-frontend/src/dashboard/util/permissionUtils.test.ts @@ -20,12 +20,13 @@ import { UndefinedUser, UserWithPermissionsAndRoles, } from 'src/types/bootstrapTypes'; -import Dashboard from 'src/types/Dashboard'; +import { Dashboard } from 'src/types/Dashboard'; import Owner from 'src/types/Owner'; -import findPermission, { +import { + canUserAccessSqlLab, canUserEditDashboard, isUserAdmin, -} from './findPermission'; +} from './permissionUtils'; const ownerUser: UserWithPermissionsAndRoles = { createdOn: '2021-05-12T16:56:22.116839', @@ -63,55 +64,15 @@ const owner: Owner = { username: ownerUser.username, }; -const undefinedUser: UndefinedUser = {}; - -describe('findPermission', () => { - it('findPermission for single role', () => { - expect(findPermission('abc', 'def', { role: [['abc', 'def']] })).toEqual( - true, - ); - - expect(findPermission('abc', 'def', { role: [['abc', 'de']] })).toEqual( - false, - ); - - expect(findPermission('abc', 'def', { role: [] })).toEqual(false); - }); - - it('findPermission for multiple roles', () => { - expect( - findPermission('abc', 'def', { - role1: [ - ['ccc', 'aaa'], - ['abc', 'def'], - ], - role2: [['abc', 'def']], - }), - ).toEqual(true); - - expect( - findPermission('abc', 'def', { - role1: [['abc', 'def']], - role2: [['abc', 'dd']], - }), - ).toEqual(true); - - expect( - findPermission('abc', 'def', { - role1: [['ccc', 'aaa']], - role2: [['aaa', 'ddd']], - }), - ).toEqual(false); - - expect(findPermission('abc', 'def', { role1: [], role2: [] })).toEqual( - false, - ); - }); +const sqlLabUser: UserWithPermissionsAndRoles = { + ...ownerUser, + roles: { + ...ownerUser.roles, + sql_lab: [], + }, +}; - it('handles nonexistent roles', () => { - expect(findPermission('abc', 'def', null)).toEqual(false); - }); -}); +const undefinedUser: UndefinedUser = {}; describe('canUserEditDashboard', () => { const dashboard: Dashboard = { @@ -160,6 +121,10 @@ test('isUserAdmin returns true for admin user', () => { expect(isUserAdmin(adminUser)).toEqual(true); }); +test('isUserAdmin returns false for undefined', () => { + expect(isUserAdmin(undefined)).toEqual(false); +}); + test('isUserAdmin returns false for undefined user', () => { expect(isUserAdmin(undefinedUser)).toEqual(false); }); @@ -167,3 +132,23 @@ test('isUserAdmin returns false for undefined user', () => { test('isUserAdmin returns false for non-admin user', () => { expect(isUserAdmin(ownerUser)).toEqual(false); }); + +test('canUserAccessSqlLab returns true for admin user', () => { + expect(canUserAccessSqlLab(adminUser)).toEqual(true); +}); + +test('canUserAccessSqlLab returns false for undefined', () => { + expect(canUserAccessSqlLab(undefined)).toEqual(false); +}); + +test('canUserAccessSqlLab returns false for undefined user', () => { + expect(canUserAccessSqlLab(undefinedUser)).toEqual(false); +}); + +test('canUserAccessSqlLab returns false for non-sqllab role', () => { + expect(canUserAccessSqlLab(ownerUser)).toEqual(false); +}); + +test('canUserAccessSqlLab returns true for sqllab role', () => { + expect(canUserAccessSqlLab(sqlLabUser)).toEqual(true); +}); diff --git a/superset-frontend/src/dashboard/util/findPermission.ts b/superset-frontend/src/dashboard/util/permissionUtils.ts similarity index 78% rename from superset-frontend/src/dashboard/util/findPermission.ts rename to superset-frontend/src/dashboard/util/permissionUtils.ts index 6edefbc997ad..3ea63976bfda 100644 --- a/superset-frontend/src/dashboard/util/findPermission.ts +++ b/superset-frontend/src/dashboard/util/permissionUtils.ts @@ -16,31 +16,21 @@ * specific language governing permissions and limitations * under the License. */ -import memoizeOne from 'memoize-one'; import { - UserRoles, isUserWithPermissionsAndRoles, UndefinedUser, UserWithPermissionsAndRoles, } from 'src/types/bootstrapTypes'; -import Dashboard from 'src/types/Dashboard'; - -const findPermission = memoizeOne( - (perm: string, view: string, roles?: UserRoles | null) => - !!roles && - Object.values(roles).some(permissions => - permissions.some(([perm_, view_]) => perm_ === perm && view_ === view), - ), -); - -export default findPermission; +import { Dashboard } from 'src/types/Dashboard'; +import { findPermission } from 'src/utils/findPermission'; // this should really be a config value, // but is hardcoded in backend logic already, so... const ADMIN_ROLE_NAME = 'admin'; +const SQL_LAB_ROLE = 'sql_lab'; export const isUserAdmin = ( - user: UserWithPermissionsAndRoles | UndefinedUser, + user?: UserWithPermissionsAndRoles | UndefinedUser, ) => isUserWithPermissionsAndRoles(user) && Object.keys(user.roles || {}).some( @@ -61,3 +51,15 @@ export const canUserEditDashboard = ( isUserWithPermissionsAndRoles(user) && (isUserAdmin(user) || isUserDashboardOwner(dashboard, user)) && findPermission('can_write', 'Dashboard', user.roles); + +export function canUserAccessSqlLab( + user?: UserWithPermissionsAndRoles | UndefinedUser, +) { + return ( + isUserAdmin(user) || + (isUserWithPermissionsAndRoles(user) && + Object.keys(user.roles || {}).some( + role => role.toLowerCase() === SQL_LAB_ROLE, + )) + ); +} diff --git a/superset-frontend/src/dashboard/util/propShapes.jsx b/superset-frontend/src/dashboard/util/propShapes.jsx index 37aaac2e2180..09380951bac0 100644 --- a/superset-frontend/src/dashboard/util/propShapes.jsx +++ b/superset-frontend/src/dashboard/util/propShapes.jsx @@ -63,7 +63,7 @@ export const slicePropShape = PropTypes.shape({ datasource_name: PropTypes.string, datasource_link: PropTypes.string, changed_on: PropTypes.number.isRequired, - modified: PropTypes.string.isRequired, + modified: PropTypes.string, viz_type: PropTypes.string.isRequired, description: PropTypes.string, description_markeddown: PropTypes.string, @@ -84,10 +84,10 @@ export const dashboardFilterPropShape = PropTypes.shape({ }); export const dashboardStatePropShape = PropTypes.shape({ - sliceIds: PropTypes.arrayOf(PropTypes.number).isRequired, + sliceIds: PropTypes.arrayOf(PropTypes.number), expandedSlices: PropTypes.object, editMode: PropTypes.bool, - isPublished: PropTypes.bool.isRequired, + isPublished: PropTypes.bool, colorNamespace: PropTypes.string, colorScheme: PropTypes.string, updatedColorScheme: PropTypes.bool, @@ -95,13 +95,13 @@ export const dashboardStatePropShape = PropTypes.shape({ }); export const dashboardInfoPropShape = PropTypes.shape({ - id: PropTypes.number.isRequired, + id: PropTypes.number, metadata: PropTypes.object, slug: PropTypes.string, - dash_edit_perm: PropTypes.bool.isRequired, - dash_save_perm: PropTypes.bool.isRequired, + dash_edit_perm: PropTypes.bool, + dash_save_perm: PropTypes.bool, common: PropTypes.object, - userId: PropTypes.string.isRequired, + userId: PropTypes.string, }); /* eslint-disable-next-line no-undef */ diff --git a/superset-frontend/src/dashboard/util/updateComponentParentsList.js b/superset-frontend/src/dashboard/util/updateComponentParentsList.js index 48f01e20a61d..44e6c24a19ad 100644 --- a/superset-frontend/src/dashboard/util/updateComponentParentsList.js +++ b/superset-frontend/src/dashboard/util/updateComponentParentsList.js @@ -1,3 +1,5 @@ +import { logging } from '@superset-ui/core'; + /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -20,16 +22,34 @@ export default function updateComponentParentsList({ currentComponent, layout = {}, }) { - if (currentComponent && layout[currentComponent.id]) { - const parentsList = (currentComponent.parents || []).slice(); - parentsList.push(currentComponent.id); + if (currentComponent && layout) { + if (layout[currentComponent.id]) { + const parentsList = Array.isArray(currentComponent.parents) + ? currentComponent.parents.slice() + : []; + + parentsList.push(currentComponent.id); - currentComponent.children.forEach(childId => { - layout[childId].parents = parentsList; // eslint-disable-line no-param-reassign - updateComponentParentsList({ - currentComponent: layout[childId], - layout, - }); - }); + if (Array.isArray(currentComponent.children)) { + currentComponent.children.forEach(childId => { + const child = layout[childId]; + if (child) { + child.parents = parentsList; // eslint-disable-line no-param-reassign + updateComponentParentsList({ + currentComponent: child, + layout, + }); + } else { + logging.warn( + `The current layout does not contain a component with the id: ${childId}. Skipping this component`, + ); + } + }); + } + } else { + logging.warn( + `The current layout does not contain a component with the id: ${currentComponent?.id}. Skipping this component`, + ); + } } } diff --git a/superset-frontend/src/dashboard/util/updateComponentParentsList.test.js b/superset-frontend/src/dashboard/util/updateComponentParentsList.test.js index c8f66b193406..c5a15d72901b 100644 --- a/superset-frontend/src/dashboard/util/updateComponentParentsList.test.js +++ b/superset-frontend/src/dashboard/util/updateComponentParentsList.test.js @@ -4,7 +4,7 @@ * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the - * 'License'); you may not use this file except in compliance + * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 @@ -95,3 +95,68 @@ describe('updateComponentParentsList', () => { ]); }); }); + +describe('updateComponentParentsList with bad inputs', () => { + it('should handle invalid parameters and not throw error', () => { + updateComponentParentsList({ + currentComponent: undefined, + layout: undefined, + }); + + expect(() => + updateComponentParentsList({ + currentComponent: undefined, + layout: undefined, + }), + ).not.toThrow(); + + expect(() => + updateComponentParentsList({ + currentComponent: {}, + layout: undefined, + }), + ).not.toThrow(); + + /** + * the assignment of layout = {} only works for undefined, not null + * This was a missed case in the function previously. + * This test ensure the null check is not removed + */ + expect(() => + updateComponentParentsList({ + currentComponent: {}, + layout: null, + }), + ).not.toThrow(); + + /** + * This test catches an edge case that caused runtime error in production system where + * a simple logic flaw performed a dot notation lookup on an undefined object + */ + expect(() => + updateComponentParentsList({ + currentComponent: { id: 'id3', children: ['id1', 'id2'] }, + layout: { id3: {} }, + }), + ).not.toThrow(); + + /** + * This test catches an edge case that causes runtime error where + * a simple logic flaw performed currentComponent.children.forEach without + * verifying currentComponent.children is an Array with a .forEach function defined + */ + expect(() => + updateComponentParentsList({ + currentComponent: { id: 'id3' }, + layout: { id3: {} }, + }), + ).not.toThrow(); + + expect(() => + updateComponentParentsList({ + currentComponent: { id: 'id3' }, + layout: {}, + }), + ).not.toThrow(); + }); +}); diff --git a/superset-frontend/src/dashboard/util/useFilterFocusHighlightStyles.test.tsx b/superset-frontend/src/dashboard/util/useFilterFocusHighlightStyles.test.tsx new file mode 100644 index 000000000000..fdc31f78af52 --- /dev/null +++ b/superset-frontend/src/dashboard/util/useFilterFocusHighlightStyles.test.tsx @@ -0,0 +1,248 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { combineReducers, createStore, applyMiddleware, compose } from 'redux'; +import thunk from 'redux-thunk'; +import mockState from 'spec/fixtures/mockState'; +import reducerIndex from 'spec/helpers/reducerIndex'; +import { screen, render } from 'spec/helpers/testing-library'; +import { initialState } from 'src/SqlLab/fixtures'; +import { dashboardFilters } from 'spec/fixtures/mockDashboardFilters'; +import { dashboardWithFilter } from 'spec/fixtures/mockDashboardLayout'; +import { buildActiveFilters } from './activeDashboardFilters'; +import useFilterFocusHighlightStyles from './useFilterFocusHighlightStyles'; + +const TestComponent = ({ chartId }: { chartId: number }) => { + const styles = useFilterFocusHighlightStyles(chartId); + + return <div data-test="test-component" style={styles} />; +}; + +describe('useFilterFocusHighlightStyles', () => { + const createMockStore = (customState: any = {}) => + createStore( + combineReducers(reducerIndex), + { ...mockState, ...(initialState as any), ...customState }, + compose(applyMiddleware(thunk)), + ); + + const renderWrapper = (chartId: number, store = createMockStore()) => + render(<TestComponent chartId={chartId} />, { + useRouter: true, + useDnd: true, + useRedux: true, + store, + }); + + it('should return no style if filter not in scope', async () => { + renderWrapper(10); + + const container = screen.getByTestId('test-component'); + + const styles = getComputedStyle(container); + expect(styles.opacity).toBeFalsy(); + }); + + it('should return unfocused styles if chart is not in scope of focused native filter', async () => { + const store = createMockStore({ + nativeFilters: { + focusedFilterId: 'test-filter', + filters: { + otherId: { + chartsInScope: [], + }, + }, + }, + }); + renderWrapper(10, store); + + const container = screen.getByTestId('test-component'); + + const styles = getComputedStyle(container); + expect(parseFloat(styles.opacity)).toBe(0.3); + }); + + it('should return unfocused styles if chart is not in scope of hovered native filter', async () => { + const store = createMockStore({ + nativeFilters: { + hoveredFilterId: 'test-filter', + filters: { + otherId: { + chartsInScope: [], + }, + }, + }, + }); + renderWrapper(10, store); + + const container = screen.getByTestId('test-component'); + + const styles = getComputedStyle(container); + expect(parseFloat(styles.opacity)).toBe(0.3); + }); + + it('should return focused styles if chart is in scope of focused native filter', async () => { + const chartId = 18; + const store = createMockStore({ + nativeFilters: { + focusedFilterId: 'testFilter', + filters: { + testFilter: { + chartsInScope: [chartId], + }, + }, + }, + }); + renderWrapper(chartId, store); + + const container = screen.getByTestId('test-component'); + + const styles = getComputedStyle(container); + expect(parseFloat(styles.opacity)).toBe(1); + }); + + it('should return focused styles if chart is in scope of hovered native filter', async () => { + const chartId = 18; + const store = createMockStore({ + nativeFilters: { + hoveredFilterId: 'testFilter', + filters: { + testFilter: { + chartsInScope: [chartId], + }, + }, + }, + }); + renderWrapper(chartId, store); + + const container = screen.getByTestId('test-component'); + + const styles = getComputedStyle(container); + expect(parseFloat(styles.opacity)).toBe(1); + }); + + it('should return unfocused styles if focusedFilterField is targeting a different chart', async () => { + const chartId = 18; + const store = createMockStore({ + dashboardState: { + focusedFilterField: { + chartId: 10, + column: 'test', + }, + }, + dashboardFilters: { + 10: { + scopes: {}, + }, + }, + }); + renderWrapper(chartId, store); + + const container = screen.getByTestId('test-component'); + + const styles = getComputedStyle(container); + expect(parseFloat(styles.opacity)).toBe(0.3); + }); + + it('should return focused styles if focusedFilterField chart equals our own', async () => { + const chartId = 18; + const store = createMockStore({ + dashboardState: { + focusedFilterField: { + chartId, + column: 'test', + }, + }, + dashboardFilters: { + [chartId]: { + scopes: { + otherColumn: {}, + }, + }, + }, + }); + renderWrapper(chartId, store); + + const container = screen.getByTestId('test-component'); + + const styles = getComputedStyle(container); + expect(parseFloat(styles.opacity)).toBe(1); + }); + + it('should return unfocused styles if chart is not inside filter box scope', async () => { + buildActiveFilters({ + dashboardFilters, + components: dashboardWithFilter, + }); + + const chartId = 18; + const store = createMockStore({ + dashboardState: { + focusedFilterField: { + chartId, + column: 'test', + }, + }, + dashboardFilters: { + [chartId]: { + scopes: { + column: {}, + }, + }, + }, + }); + renderWrapper(20, store); + + const container = screen.getByTestId('test-component'); + + const styles = getComputedStyle(container); + expect(parseFloat(styles.opacity)).toBe(0.3); + }); + + it('should return focused styles if chart is inside filter box scope', async () => { + buildActiveFilters({ + dashboardFilters, + components: dashboardWithFilter, + }); + + const chartId = 18; + const store = createMockStore({ + dashboardState: { + focusedFilterField: { + chartId, + column: 'test', + }, + }, + dashboardFilters: { + [chartId]: { + scopes: { + column: {}, + }, + }, + }, + }); + renderWrapper(chartId, store); + + const container = screen.getByTestId('test-component'); + + const styles = getComputedStyle(container); + expect(parseFloat(styles.opacity)).toBe(1); + }); +}); diff --git a/superset-frontend/src/dashboard/util/useFilterFocusHighlightStyles.ts b/superset-frontend/src/dashboard/util/useFilterFocusHighlightStyles.ts new file mode 100644 index 000000000000..8be43490ad3a --- /dev/null +++ b/superset-frontend/src/dashboard/util/useFilterFocusHighlightStyles.ts @@ -0,0 +1,92 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { useTheme } from '@superset-ui/core'; +import { useSelector } from 'react-redux'; + +import { getChartIdsInFilterBoxScope } from 'src/dashboard/util/activeDashboardFilters'; +import { DashboardState, RootState } from 'src/dashboard/types'; + +const selectFocusedFilterScope = ( + dashboardState: DashboardState, + dashboardFilters: any, +) => { + if (!dashboardState.focusedFilterField) return null; + const { chartId, column } = dashboardState.focusedFilterField; + return { + chartId, + scope: dashboardFilters[chartId].scopes[column], + }; +}; + +const useFilterFocusHighlightStyles = (chartId: number) => { + const theme = useTheme(); + + const nativeFilters = useSelector((state: RootState) => state.nativeFilters); + const dashboardState = useSelector( + (state: RootState) => state.dashboardState, + ); + const dashboardFilters = useSelector( + (state: RootState) => state.dashboardFilters, + ); + const focusedFilterScope = selectFocusedFilterScope( + dashboardState, + dashboardFilters, + ); + + const highlightedFilterId = + nativeFilters?.focusedFilterId || nativeFilters?.hoveredFilterId; + if (!(focusedFilterScope || highlightedFilterId)) { + return {}; + } + + // we use local styles here instead of a conditionally-applied class, + // because adding any conditional class to this container + // causes performance issues in Chrome. + + // default to the "de-emphasized" state + const unfocusedChartStyles = { opacity: 0.3, pointerEvents: 'none' }; + const focusedChartStyles = { + borderColor: theme.colors.primary.light2, + opacity: 1, + boxShadow: `0px 0px ${theme.gridUnit * 2}px ${theme.colors.primary.base}`, + pointerEvents: 'auto', + }; + + if (highlightedFilterId) { + if ( + nativeFilters.filters[highlightedFilterId]?.chartsInScope?.includes( + chartId, + ) + ) { + return focusedChartStyles; + } + } else if ( + chartId === focusedFilterScope?.chartId || + getChartIdsInFilterBoxScope({ + filterScope: focusedFilterScope?.scope, + }).includes(chartId) + ) { + return focusedChartStyles; + } + + // inline styles are used here due to a performance issue when adding/changing a class, which causes a reflow + return unfocusedChartStyles; +}; + +export default useFilterFocusHighlightStyles; diff --git a/superset-frontend/src/embedded/api.tsx b/superset-frontend/src/embedded/api.tsx new file mode 100644 index 000000000000..9d37daf2e01b --- /dev/null +++ b/superset-frontend/src/embedded/api.tsx @@ -0,0 +1,68 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import getBootstrapData from 'src/utils/getBootstrapData'; +import { store } from '../views/store'; +import { getDashboardPermalink as getDashboardPermalinkUtil } from '../utils/urlUtils'; + +const bootstrapData = getBootstrapData(); + +type Size = { + width: number; + height: number; +}; + +type EmbeddedSupersetApi = { + getScrollSize: () => Size; + getDashboardPermalink: ({ anchor }: { anchor: string }) => Promise<string>; + getActiveTabs: () => string[]; +}; + +const getScrollSize = (): Size => ({ + width: document.body.scrollWidth, + height: document.body.scrollHeight, +}); + +const getDashboardPermalink = async ({ + anchor, +}: { + anchor: string; +}): Promise<string> => { + const state = store?.getState(); + const { dashboardId, dataMask, activeTabs } = { + dashboardId: + state?.dashboardInfo?.id || bootstrapData?.embedded!.dashboard_id, + dataMask: state?.dataMask, + activeTabs: state.dashboardState?.activeTabs, + }; + + return getDashboardPermalinkUtil({ + dashboardId, + dataMask, + activeTabs, + anchor, + }); +}; + +const getActiveTabs = () => store?.getState()?.dashboardState?.activeTabs || []; + +export const embeddedApi: EmbeddedSupersetApi = { + getScrollSize, + getDashboardPermalink, + getActiveTabs, +}; diff --git a/superset-frontend/src/embedded/index.tsx b/superset-frontend/src/embedded/index.tsx index c28d416a18ae..50c026fba8f9 100644 --- a/superset-frontend/src/embedded/index.tsx +++ b/superset-frontend/src/embedded/index.tsx @@ -20,8 +20,8 @@ import React, { lazy, Suspense } from 'react'; import ReactDOM from 'react-dom'; import { BrowserRouter as Router, Route } from 'react-router-dom'; import { makeApi, t, logging } from '@superset-ui/core'; -import { Switchboard } from '@superset-ui/switchboard'; -import { bootstrapData } from 'src/preamble'; +import Switchboard from '@superset-ui/switchboard'; +import getBootstrapData from 'src/utils/getBootstrapData'; import setupClient from 'src/setup/setupClient'; import { RootContextProviders } from 'src/views/RootContextProviders'; import { store, USER_LOADED } from 'src/views/store'; @@ -30,8 +30,10 @@ import Loading from 'src/components/Loading'; import { addDangerToast } from 'src/components/MessageToasts/actions'; import ToastContainer from 'src/components/MessageToasts/ToastContainer'; import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; +import { embeddedApi } from './api'; const debugMode = process.env.WEBPACK_MODE === 'development'; +const bootstrapData = getBootstrapData(); function log(...info: unknown[]) { if (debugMode) { @@ -175,7 +177,7 @@ window.addEventListener('message', function embeddedPageInitializer(event) { if (event.data.handshake === 'port transfer' && port) { log('message port received', event); - const switchboard = new Switchboard({ + Switchboard.init({ port, name: 'superset', debug: debugMode, @@ -183,20 +185,24 @@ window.addEventListener('message', function embeddedPageInitializer(event) { let started = false; - switchboard.defineMethod('guestToken', ({ guestToken }) => { - setupGuestClient(guestToken); - if (!started) { - start(); - started = true; - } - }); - - switchboard.defineMethod('getScrollSize', () => ({ - width: document.body.scrollWidth, - height: document.body.scrollHeight, - })); - - switchboard.start(); + Switchboard.defineMethod( + 'guestToken', + ({ guestToken }: { guestToken: string }) => { + setupGuestClient(guestToken); + if (!started) { + start(); + started = true; + } + }, + ); + + Switchboard.defineMethod('getScrollSize', embeddedApi.getScrollSize); + Switchboard.defineMethod( + 'getDashboardPermalink', + embeddedApi.getDashboardPermalink, + ); + Switchboard.defineMethod('getActiveTabs', embeddedApi.getActiveTabs); + Switchboard.start(); } }); diff --git a/superset-frontend/src/explore/App.jsx b/superset-frontend/src/explore/App.jsx deleted file mode 100644 index c440b784e7de..000000000000 --- a/superset-frontend/src/explore/App.jsx +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import { hot } from 'react-hot-loader/root'; -import { Provider } from 'react-redux'; -import { DndProvider } from 'react-dnd'; -import { HTML5Backend } from 'react-dnd-html5-backend'; -import { ThemeProvider } from '@superset-ui/core'; -import { GlobalStyles } from 'src/GlobalStyles'; -import { DynamicPluginProvider } from 'src/components/DynamicPlugins'; -import ToastContainer from 'src/components/MessageToasts/ToastContainer'; -import setupApp from 'src/setup/setupApp'; -import setupPlugins from 'src/setup/setupPlugins'; -import './main.less'; -import '../assets/stylesheets/reactable-pagination.less'; -import { theme } from 'src/preamble'; -import ExploreViewContainer from './components/ExploreViewContainer'; - -setupApp(); -setupPlugins(); - -const App = ({ store }) => ( - <Provider store={store}> - <DndProvider backend={HTML5Backend}> - <ThemeProvider theme={theme}> - <GlobalStyles /> - <DynamicPluginProvider> - <ExploreViewContainer /> - <ToastContainer /> - </DynamicPluginProvider> - </ThemeProvider> - </DndProvider> - </Provider> -); - -export default hot(App); diff --git a/superset-frontend/src/explore/ExplorePage.tsx b/superset-frontend/src/explore/ExplorePage.tsx new file mode 100644 index 000000000000..cea43560afb6 --- /dev/null +++ b/superset-frontend/src/explore/ExplorePage.tsx @@ -0,0 +1,162 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useEffect, useRef, useState } from 'react'; +import { useDispatch } from 'react-redux'; +import { useLocation } from 'react-router-dom'; +import { + getSharedLabelColor, + isDefined, + JsonObject, + makeApi, + SharedLabelColorSource, + t, +} from '@superset-ui/core'; +import Loading from 'src/components/Loading'; +import { addDangerToast } from 'src/components/MessageToasts/actions'; +import { getUrlParam } from 'src/utils/urlUtils'; +import { URL_PARAMS } from 'src/constants'; +import { getClientErrorObject } from 'src/utils/getClientErrorObject'; +import getFormDataWithExtraFilters from 'src/dashboard/util/charts/getFormDataWithExtraFilters'; +import { getAppliedFilterValues } from 'src/dashboard/util/activeDashboardFilters'; +import { getParsedExploreURLParams } from './exploreUtils/getParsedExploreURLParams'; +import { hydrateExplore } from './actions/hydrateExplore'; +import ExploreViewContainer from './components/ExploreViewContainer'; +import { ExploreResponsePayload, SaveActionType } from './types'; +import { fallbackExploreInitialData } from './fixtures'; +import { getItem, LocalStorageKeys } from '../utils/localStorageHelpers'; +import { getFormDataWithDashboardContext } from './controlUtils/getFormDataWithDashboardContext'; + +const isValidResult = (rv: JsonObject): boolean => + rv?.result?.form_data && isDefined(rv?.result?.dataset?.id); + +const fetchExploreData = async (exploreUrlParams: URLSearchParams) => { + try { + const rv = await makeApi<{}, ExploreResponsePayload>({ + method: 'GET', + endpoint: 'api/v1/explore/', + })(exploreUrlParams); + if (isValidResult(rv)) { + return rv; + } + let message = t('Failed to load chart data'); + const responseError = rv?.result?.message; + if (responseError) { + message = `${message}:\n${responseError}`; + } + throw new Error(message); + } catch (err) { + // todo: encapsulate the error handler + const clientError = await getClientErrorObject(err); + throw new Error( + clientError.message || + clientError.error || + t('Failed to load chart data.'), + ); + } +}; + +const getDashboardPageContext = (pageId?: string | null) => { + if (!pageId) { + return null; + } + return ( + getItem(LocalStorageKeys.dashboard__explore_context, {})[pageId] || null + ); +}; + +const getDashboardContextFormData = () => { + const dashboardPageId = getUrlParam(URL_PARAMS.dashboardPageId); + const dashboardContext = getDashboardPageContext(dashboardPageId); + if (dashboardContext) { + const sliceId = getUrlParam(URL_PARAMS.sliceId) || 0; + const { + labelColors, + sharedLabelColors, + colorScheme, + chartConfiguration, + nativeFilters, + filterBoxFilters, + dataMask, + dashboardId, + } = dashboardContext; + const dashboardContextWithFilters = getFormDataWithExtraFilters({ + chart: { id: sliceId }, + filters: getAppliedFilterValues(sliceId, filterBoxFilters), + nativeFilters, + chartConfiguration, + colorScheme, + dataMask, + labelColors, + sharedLabelColors, + sliceId, + allSliceIds: [sliceId], + extraControls: {}, + }); + Object.assign(dashboardContextWithFilters, { dashboardId }); + return dashboardContextWithFilters; + } + return null; +}; + +export default function ExplorePage() { + const [isLoaded, setIsLoaded] = useState(false); + const isExploreInitialized = useRef(false); + const dispatch = useDispatch(); + const location = useLocation(); + + useEffect(() => { + const exploreUrlParams = getParsedExploreURLParams(location); + const saveAction = getUrlParam( + URL_PARAMS.saveAction, + ) as SaveActionType | null; + const dashboardContextFormData = getDashboardContextFormData(); + if (!isExploreInitialized.current || !!saveAction) { + fetchExploreData(exploreUrlParams) + .then(({ result }) => { + const formData = dashboardContextFormData + ? getFormDataWithDashboardContext( + result.form_data, + dashboardContextFormData, + ) + : result.form_data; + dispatch( + hydrateExplore({ + ...result, + form_data: formData, + saveAction, + }), + ); + }) + .catch(err => { + dispatch(hydrateExplore(fallbackExploreInitialData)); + dispatch(addDangerToast(err.message)); + }) + .finally(() => { + setIsLoaded(true); + isExploreInitialized.current = true; + }); + } + getSharedLabelColor().source = SharedLabelColorSource.explore; + }, [dispatch, location]); + + if (!isLoaded) { + return <Loading />; + } + return <ExploreViewContainer />; +} diff --git a/superset-frontend/src/explore/actions/datasourcesActions.test.ts b/superset-frontend/src/explore/actions/datasourcesActions.test.ts new file mode 100644 index 000000000000..6317f1f4a6d1 --- /dev/null +++ b/superset-frontend/src/explore/actions/datasourcesActions.test.ts @@ -0,0 +1,139 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { DatasourceType } from '@superset-ui/core'; +import fetchMock from 'fetch-mock'; +import { + setDatasource, + changeDatasource, + saveDataset, +} from 'src/explore/actions/datasourcesActions'; +import sinon from 'sinon'; +import * as ClientError from 'src/utils/getClientErrorObject'; +import datasourcesReducer from '../reducers/datasourcesReducer'; +import { updateFormDataByDatasource } from './exploreActions'; + +const CURRENT_DATASOURCE = { + id: 1, + uid: '1__table', + type: DatasourceType.Table, + columns: [], + metrics: [], + column_format: {}, + verbose_map: {}, + main_dttm_col: '__timestamp', + // eg. ['["ds", true]', 'ds [asc]'] + datasource_name: 'test datasource', + description: null, +}; + +const NEW_DATASOURCE = { + id: 2, + type: DatasourceType.Table, + columns: [], + metrics: [], + column_format: {}, + verbose_map: {}, + main_dttm_col: '__timestamp', + // eg. ['["ds", true]', 'ds [asc]'] + datasource_name: 'test datasource', + description: null, +}; + +const SAVE_DATASET_POST_ARGS = { + schema: 'foo', + sql: 'select * from bar', + database: { id: 1 }, + templateParams: undefined, + datasourceName: 'new dataset', + columns: [], +}; + +const defaultDatasourcesReducerState = { + [CURRENT_DATASOURCE.uid]: CURRENT_DATASOURCE, +}; + +const saveDatasetEndpoint = `glob:*/superset/sqllab_viz/`; + +test('sets new datasource', () => { + const newState = datasourcesReducer( + defaultDatasourcesReducerState, + setDatasource(NEW_DATASOURCE), + ); + expect(newState).toEqual({ + ...defaultDatasourcesReducerState, + '2__table': NEW_DATASOURCE, + }); +}); + +test('change datasource action', () => { + const dispatch = jest.fn(); + const getState = jest.fn(() => ({ + explore: { + datasource: CURRENT_DATASOURCE, + }, + })); + // ignore getState type check - we dont need explore.datasource field for this test + // @ts-ignore + changeDatasource(NEW_DATASOURCE)(dispatch, getState); + expect(dispatch).toHaveBeenCalledTimes(2); + expect(dispatch).toHaveBeenNthCalledWith(1, setDatasource(NEW_DATASOURCE)); + expect(dispatch).toHaveBeenNthCalledWith( + 2, + updateFormDataByDatasource(CURRENT_DATASOURCE, NEW_DATASOURCE), + ); +}); + +test('saveDataset handles success', async () => { + const datasource = { id: 1 }; + const saveDatasetResponse = { + data: datasource, + }; + fetchMock.reset(); + fetchMock.post(saveDatasetEndpoint, saveDatasetResponse); + const dispatch = sinon.spy(); + const getState = sinon.spy(() => ({ explore: { datasource } })); + const dataset = await saveDataset(SAVE_DATASET_POST_ARGS)(dispatch); + + expect(fetchMock.calls(saveDatasetEndpoint)).toHaveLength(1); + expect(dispatch.callCount).toBe(1); + const thunk = dispatch.getCall(0).args[0]; + thunk(dispatch, getState); + expect(dispatch.getCall(1).args[0].type).toEqual('SET_DATASOURCE'); + + expect(dataset).toEqual(datasource); +}); + +test('updateSlice with add to existing dashboard handles failure', async () => { + fetchMock.reset(); + const sampleError = new Error('sampleError'); + fetchMock.post(saveDatasetEndpoint, { throws: sampleError }); + const dispatch = sinon.spy(); + const errorSpy = jest.spyOn(ClientError, 'getClientErrorObject'); + + let caughtError; + try { + await saveDataset(SAVE_DATASET_POST_ARGS)(dispatch); + } catch (error) { + caughtError = error; + } + + expect(caughtError).toEqual(sampleError); + expect(fetchMock.calls(saveDatasetEndpoint)).toHaveLength(4); + expect(errorSpy).toHaveBeenCalledWith(sampleError); +}); diff --git a/superset-frontend/src/explore/actions/datasourcesActions.ts b/superset-frontend/src/explore/actions/datasourcesActions.ts new file mode 100644 index 000000000000..9306c180e288 --- /dev/null +++ b/superset-frontend/src/explore/actions/datasourcesActions.ts @@ -0,0 +1,93 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Dispatch, AnyAction } from 'redux'; +import { ThunkDispatch } from 'redux-thunk'; +import { Dataset } from '@superset-ui/chart-controls'; +import { SupersetClient } from '@superset-ui/core'; +import { addDangerToast } from 'src/components/MessageToasts/actions'; +import { getClientErrorObject } from 'src/utils/getClientErrorObject'; +import { updateFormDataByDatasource } from './exploreActions'; +import { ExplorePageState } from '../types'; + +export const SET_DATASOURCE = 'SET_DATASOURCE'; +export interface SetDatasource { + type: string; + datasource: Dataset; +} +export function setDatasource(datasource: Dataset) { + return { type: SET_DATASOURCE, datasource }; +} + +export function saveDataset({ + schema, + sql, + database, + templateParams, + datasourceName, + columns, +}: Omit<SqlLabPostRequest['data'], 'dbId'> & { database: { id: number } }) { + return async function (dispatch: ThunkDispatch<any, undefined, AnyAction>) { + // Create a dataset object + try { + const { + json: { data }, + } = await SupersetClient.post({ + endpoint: '/superset/sqllab_viz/', + postPayload: { + data: { + schema, + sql, + dbId: database?.id, + templateParams, + datasourceName, + metrics: [], + columns, + }, + }, + }); + // Update form_data to point to new dataset + dispatch(changeDatasource(data)); + return data; + } catch (error) { + getClientErrorObject(error).then(e => { + dispatch(addDangerToast(e.error)); + }); + throw error; + } + }; +} + +export function changeDatasource(newDatasource: Dataset) { + return function (dispatch: Dispatch, getState: () => ExplorePageState) { + const { + explore: { datasource: prevDatasource }, + } = getState(); + dispatch(setDatasource(newDatasource)); + dispatch(updateFormDataByDatasource(prevDatasource, newDatasource)); + }; +} + +export const datasourcesActions = { + setDatasource, + changeDatasource, + saveDataset, +}; + +export type AnyDatasourcesAction = SetDatasource; diff --git a/superset-frontend/src/explore/actions/exploreActions.ts b/superset-frontend/src/explore/actions/exploreActions.ts index 2b6c0f549059..0e13499b14c4 100644 --- a/superset-frontend/src/explore/actions/exploreActions.ts +++ b/superset-frontend/src/explore/actions/exploreActions.ts @@ -18,34 +18,27 @@ */ /* eslint camelcase: 0 */ import { Dataset } from '@superset-ui/chart-controls'; -import { - t, - SupersetClient, - DatasourceType, - QueryFormData, -} from '@superset-ui/core'; +import { t, SupersetClient, QueryFormData } from '@superset-ui/core'; import { Dispatch } from 'redux'; import { addDangerToast, toastActions, } from 'src/components/MessageToasts/actions'; import { Slice } from 'src/types/Chart'; +import { SaveActionType } from 'src/explore/types'; const FAVESTAR_BASE_URL = '/superset/favstar/slice'; -export const SET_DATASOURCE_TYPE = 'SET_DATASOURCE_TYPE'; -export function setDatasourceType(datasourceType: DatasourceType) { - return { type: SET_DATASOURCE_TYPE, datasourceType }; -} - -export const SET_DATASOURCE = 'SET_DATASOURCE'; -export function setDatasource(datasource: Dataset) { - return { type: SET_DATASOURCE, datasource }; -} - -export const SET_DATASOURCES = 'SET_DATASOURCES'; -export function setDatasources(datasources: Dataset[]) { - return { type: SET_DATASOURCES, datasources }; +export const UPDATE_FORM_DATA_BY_DATASOURCE = 'UPDATE_FORM_DATA_BY_DATASOURCE'; +export function updateFormDataByDatasource( + prevDatasource: Dataset, + newDatasource: Dataset, +) { + return { + type: UPDATE_FORM_DATA_BY_DATASOURCE, + prevDatasource, + newDatasource, + }; } export const POST_DATASOURCE_STARTED = 'POST_DATASOURCE_STARTED'; @@ -112,11 +105,21 @@ export function setExploreControls(formData: QueryFormData) { return { type: SET_EXPLORE_CONTROLS, formData }; } +export const SET_FORM_DATA = 'UPDATE_FORM_DATA'; +export function setFormData(formData: QueryFormData) { + return { type: SET_FORM_DATA, formData }; +} + export const UPDATE_CHART_TITLE = 'UPDATE_CHART_TITLE'; export function updateChartTitle(sliceName: string) { return { type: UPDATE_CHART_TITLE, sliceName }; } +export const SET_SAVE_ACTION = 'SET_SAVE_ACTION'; +export function setSaveAction(saveAction: SaveActionType | null) { + return { type: SET_SAVE_ACTION, saveAction }; +} + export const CREATE_NEW_SLICE = 'CREATE_NEW_SLICE'; export function createNewSlice( can_add: boolean, @@ -150,9 +153,6 @@ export function setForceQuery(force: boolean) { export const exploreActions = { ...toastActions, - setDatasourceType, - setDatasource, - setDatasources, fetchDatasourcesStarted, fetchDatasourcesSucceeded, toggleFaveStar, diff --git a/superset-frontend/src/explore/actions/hydrateExplore.test.ts b/superset-frontend/src/explore/actions/hydrateExplore.test.ts new file mode 100644 index 000000000000..7f363adef6fd --- /dev/null +++ b/superset-frontend/src/explore/actions/hydrateExplore.test.ts @@ -0,0 +1,214 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { hydrateExplore, HYDRATE_EXPLORE } from './hydrateExplore'; +import { exploreInitialData } from '../fixtures'; + +test('creates hydrate action from initial data', () => { + const dispatch = jest.fn(); + const getState = jest.fn(() => ({ + user: {}, + charts: {}, + datasources: {}, + common: {}, + explore: {}, + })); + // ignore type check - we dont need exact explore state for this test + // @ts-ignore + hydrateExplore(exploreInitialData)(dispatch, getState); + expect(dispatch).toHaveBeenCalledWith( + expect.objectContaining({ + type: HYDRATE_EXPLORE, + data: { + charts: { + 371: { + id: 371, + chartAlert: null, + chartStatus: null, + chartStackTrace: null, + chartUpdateEndTime: null, + chartUpdateStartTime: 0, + latestQueryFormData: { + cache_timeout: undefined, + datasource: '8__table', + slice_id: 371, + url_params: undefined, + viz_type: 'table', + }, + sliceFormData: { + cache_timeout: undefined, + datasource: '8__table', + slice_id: 371, + url_params: undefined, + viz_type: 'table', + }, + queryController: null, + queriesResponse: null, + triggerQuery: false, + lastRendered: 0, + }, + }, + datasources: { + '8__table': exploreInitialData.dataset, + }, + saveModal: { + dashboards: [], + saveModalAlert: null, + isVisible: false, + }, + explore: { + can_add: false, + can_download: false, + can_overwrite: false, + isDatasourceMetaLoading: false, + isStarred: false, + triggerRender: false, + datasource: exploreInitialData.dataset, + controls: expect.any(Object), + form_data: exploreInitialData.form_data, + slice: exploreInitialData.slice, + standalone: null, + force: null, + saveAction: null, + common: {}, + }, + }, + }), + ); +}); + +test('creates hydrate action with existing state', () => { + const dispatch = jest.fn(); + const getState = jest.fn(() => ({ + user: {}, + charts: {}, + datasources: {}, + common: {}, + explore: { controlsTransferred: ['all_columns'] }, + })); + // ignore type check - we dont need exact explore state for this test + // @ts-ignore + hydrateExplore(exploreInitialData)(dispatch, getState); + expect(dispatch).toHaveBeenCalledWith( + expect.objectContaining({ + type: HYDRATE_EXPLORE, + data: { + charts: { + 371: { + id: 371, + chartAlert: null, + chartStatus: null, + chartStackTrace: null, + chartUpdateEndTime: null, + chartUpdateStartTime: 0, + latestQueryFormData: { + cache_timeout: undefined, + datasource: '8__table', + slice_id: 371, + url_params: undefined, + viz_type: 'table', + }, + sliceFormData: { + cache_timeout: undefined, + datasource: '8__table', + slice_id: 371, + url_params: undefined, + viz_type: 'table', + }, + queryController: null, + queriesResponse: null, + triggerQuery: false, + lastRendered: 0, + }, + }, + datasources: { + '8__table': exploreInitialData.dataset, + }, + saveModal: { + dashboards: [], + saveModalAlert: null, + isVisible: false, + }, + explore: { + can_add: false, + can_download: false, + can_overwrite: false, + isDatasourceMetaLoading: false, + isStarred: false, + triggerRender: false, + datasource: exploreInitialData.dataset, + controls: expect.any(Object), + controlsTransferred: ['all_columns'], + form_data: exploreInitialData.form_data, + slice: exploreInitialData.slice, + standalone: null, + force: null, + saveAction: null, + common: {}, + }, + }, + }), + ); +}); + +test('uses configured default time range if not set', () => { + const dispatch = jest.fn(); + const getState = jest.fn(() => ({ + user: {}, + charts: {}, + datasources: {}, + common: { + conf: { + DEFAULT_TIME_FILTER: 'Last year', + }, + }, + explore: {}, + })); + // @ts-ignore + hydrateExplore({ form_data: {}, slice: {}, dataset: {} })(dispatch, getState); + expect(dispatch).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ + explore: expect.objectContaining({ + form_data: expect.objectContaining({ + time_range: 'Last year', + }), + }), + }), + }), + ); + const withTimeRangeSet = { + form_data: { time_range: 'Last day' }, + slice: {}, + dataset: {}, + }; + // @ts-ignore + hydrateExplore(withTimeRangeSet)(dispatch, getState); + expect(dispatch).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ + explore: expect.objectContaining({ + form_data: expect.objectContaining({ + time_range: 'Last day', + }), + }), + }), + }), + ); +}); diff --git a/superset-frontend/src/explore/actions/hydrateExplore.ts b/superset-frontend/src/explore/actions/hydrateExplore.ts new file mode 100644 index 000000000000..f9adc2fe056f --- /dev/null +++ b/superset-frontend/src/explore/actions/hydrateExplore.ts @@ -0,0 +1,195 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { ControlStateMapping } from '@superset-ui/chart-controls'; + +import { + ChartState, + ExplorePageInitialData, + ExplorePageState, +} from 'src/explore/types'; +import { getChartKey } from 'src/explore/exploreUtils'; +import { getControlsState } from 'src/explore/store'; +import { Dispatch } from 'redux'; +import { + ensureIsArray, + getCategoricalSchemeRegistry, + getSequentialSchemeRegistry, + NO_TIME_RANGE, +} from '@superset-ui/core'; +import { + getFormDataFromControls, + applyMapStateToPropsToControl, +} from 'src/explore/controlUtils'; +import { getDatasourceUid } from 'src/utils/getDatasourceUid'; +import { getUrlParam } from 'src/utils/urlUtils'; +import { URL_PARAMS } from 'src/constants'; +import { findPermission } from 'src/utils/findPermission'; + +enum ColorSchemeType { + CATEGORICAL = 'CATEGORICAL', + SEQUENTIAL = 'SEQUENTIAL', +} + +export const HYDRATE_EXPLORE = 'HYDRATE_EXPLORE'; +export const hydrateExplore = + ({ + form_data, + slice, + dataset, + metadata, + saveAction = null, + }: ExplorePageInitialData) => + (dispatch: Dispatch, getState: () => ExplorePageState) => { + const { user, datasources, charts, sliceEntities, common, explore } = + getState(); + + const sliceId = getUrlParam(URL_PARAMS.sliceId); + const dashboardId = getUrlParam(URL_PARAMS.dashboardId); + const fallbackSlice = sliceId ? sliceEntities?.slices?.[sliceId] : null; + const initialSlice = slice ?? fallbackSlice; + const initialFormData = form_data ?? initialSlice?.form_data; + if (!initialFormData.viz_type) { + const defaultVizType = common?.conf.DEFAULT_VIZ_TYPE || 'table'; + initialFormData.viz_type = + getUrlParam(URL_PARAMS.vizType) || defaultVizType; + } + if (!initialFormData.time_range) { + initialFormData.time_range = + common?.conf?.DEFAULT_TIME_FILTER || NO_TIME_RANGE; + } + if (dashboardId) { + initialFormData.dashboardId = dashboardId; + } + const initialDatasource = dataset; + + const initialExploreState = { + form_data: initialFormData, + slice: initialSlice, + datasource: initialDatasource, + }; + const initialControls = getControlsState( + initialExploreState, + initialFormData, + ) as ControlStateMapping; + const colorSchemeKey = initialControls.color_scheme && 'color_scheme'; + const linearColorSchemeKey = + initialControls.linear_color_scheme && 'linear_color_scheme'; + // if the selected color scheme does not exist anymore + // fallbacks and selects the available default one + const verifyColorScheme = (type: ColorSchemeType) => { + const schemes = + type === 'CATEGORICAL' + ? getCategoricalSchemeRegistry() + : getSequentialSchemeRegistry(); + const key = + type === 'CATEGORICAL' ? colorSchemeKey : linearColorSchemeKey; + const registryDefaultScheme = schemes.defaultKey; + const defaultScheme = + type === 'CATEGORICAL' ? 'supersetColors' : 'superset_seq_1'; + const currentScheme = initialFormData[key]; + const colorSchemeExists = !!schemes.get(currentScheme, true); + + if (currentScheme && !colorSchemeExists) { + initialControls[key].value = registryDefaultScheme || defaultScheme; + } + }; + + if (colorSchemeKey) verifyColorScheme(ColorSchemeType.CATEGORICAL); + if (linearColorSchemeKey) verifyColorScheme(ColorSchemeType.SEQUENTIAL); + + const exploreState = { + // note this will add `form_data` to state, + // which will be manipulable by future reducers. + can_add: findPermission('can_write', 'Chart', user?.roles), + can_download: findPermission('can_csv', 'Superset', user?.roles), + can_overwrite: ensureIsArray(slice?.owners).includes( + user?.userId as number, + ), + isDatasourceMetaLoading: false, + isStarred: false, + triggerRender: false, + // duplicate datasource in exploreState - it's needed by getControlsState + datasource: initialDatasource, + // Initial control state will skip `control.mapStateToProps` + // because `bootstrapData.controls` is undefined. + controls: initialControls, + form_data: initialFormData, + slice: initialSlice, + controlsTransferred: explore.controlsTransferred, + standalone: getUrlParam(URL_PARAMS.standalone), + force: getUrlParam(URL_PARAMS.force), + metadata, + saveAction, + common, + }; + + // apply initial mapStateToProps for all controls, must execute AFTER + // bootstrapState has initialized `controls`. Order of execution is not + // guaranteed, so controls shouldn't rely on each other's mapped state. + Object.entries(exploreState.controls).forEach(([key, controlState]) => { + exploreState.controls[key] = applyMapStateToPropsToControl( + controlState, + exploreState, + ); + }); + const sliceFormData = initialSlice + ? getFormDataFromControls(initialControls) + : null; + + const chartKey: number = getChartKey(initialExploreState); + const chart: ChartState = { + id: chartKey, + chartAlert: null, + chartStatus: null, + chartStackTrace: null, + chartUpdateEndTime: null, + chartUpdateStartTime: 0, + latestQueryFormData: getFormDataFromControls(exploreState.controls), + sliceFormData, + queryController: null, + queriesResponse: null, + triggerQuery: false, + lastRendered: 0, + }; + + return dispatch({ + type: HYDRATE_EXPLORE, + data: { + charts: { + ...charts, + [chartKey]: chart, + }, + datasources: { + ...datasources, + [getDatasourceUid(initialDatasource)]: initialDatasource, + }, + saveModal: { + dashboards: [], + saveModalAlert: null, + isVisible: false, + }, + explore: exploreState, + }, + }); + }; + +export type HydrateExplore = { + type: typeof HYDRATE_EXPLORE; + data: ExplorePageState; +}; diff --git a/superset-frontend/src/explore/actions/saveModalActions.js b/superset-frontend/src/explore/actions/saveModalActions.js index 6e87fe52b5f1..14bbe0999545 100644 --- a/superset-frontend/src/explore/actions/saveModalActions.js +++ b/superset-frontend/src/explore/actions/saveModalActions.js @@ -16,8 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -import { SupersetClient } from '@superset-ui/core'; -import { buildV1ChartDataPayload, getExploreUrl } from '../exploreUtils'; +import rison from 'rison'; +import { SupersetClient, t } from '@superset-ui/core'; +import { addSuccessToast } from 'src/components/MessageToasts/actions'; +import { buildV1ChartDataPayload } from '../exploreUtils'; + +const ADHOC_FILTER_REGEX = /^adhoc_filters/; export const FETCH_DASHBOARDS_SUCCEEDED = 'FETCH_DASHBOARDS_SUCCEEDED'; export function fetchDashboardsSucceeded(choices) { @@ -29,6 +33,12 @@ export function fetchDashboardsFailed(userId) { return { type: FETCH_DASHBOARDS_FAILED, userId }; } +export const SET_SAVE_CHART_MODAL_VISIBILITY = + 'SET_SAVE_CHART_MODAL_VISIBILITY'; +export function setSaveChartModalVisibility(isVisible) { + return { type: SET_SAVE_CHART_MODAL_VISIBILITY, isVisible }; +} + export function fetchDashboards(userId) { return function fetchDashboardsThunk(dispatch) { return SupersetClient.get({ @@ -39,6 +49,12 @@ export function fetchDashboards(userId) { value: id, label: (json.result[index] || {}).dashboard_title, })); + choices.sort((a, b) => + a.label.localeCompare(b.label, { + sensitivity: 'base', + numeric: true, + }), + ); return dispatch(fetchDashboardsSucceeded(choices)); }) @@ -60,33 +76,173 @@ export function removeSaveModalAlert() { return { type: REMOVE_SAVE_MODAL_ALERT }; } -export function saveSlice(formData, requestParams) { - return dispatch => { - const url = getExploreUrl({ - formData, - endpointType: 'base', - force: false, - curUrl: null, - requestParams, +export const getSlicePayload = ( + sliceName, + formDataWithNativeFilters, + dashboards, + owners, +) => { + const adhocFilters = Object.entries(formDataWithNativeFilters).reduce( + (acc, [key, value]) => + ADHOC_FILTER_REGEX.test(key) + ? { ...acc, [key]: value?.filter(f => !f.isExtra) } + : acc, + {}, + ); + const formData = { + ...formDataWithNativeFilters, + ...adhocFilters, + dashboards, + }; + + const [datasourceId, datasourceType] = formData.datasource.split('__'); + const payload = { + params: JSON.stringify(formData), + slice_name: sliceName, + viz_type: formData.viz_type, + datasource_id: parseInt(datasourceId, 10), + datasource_type: datasourceType, + dashboards, + owners, + query_context: JSON.stringify( + buildV1ChartDataPayload({ + formData, + force: false, + resultFormat: 'json', + resultType: 'full', + setDataMask: null, + ownState: null, + }), + ), + }; + return payload; +}; + +const addToasts = (isNewSlice, sliceName, addedToDashboard) => { + const toasts = []; + if (isNewSlice) { + toasts.push(addSuccessToast(t('Chart [%s] has been saved', sliceName))); + } else { + toasts.push( + addSuccessToast(t('Chart [%s] has been overwritten', sliceName)), + ); + } + + if (addedToDashboard) { + if (addedToDashboard.new) { + toasts.push( + addSuccessToast( + t( + 'Dashboard [%s] just got created and chart [%s] was added to it', + addedToDashboard.title, + sliceName, + ), + ), + ); + } else { + toasts.push( + addSuccessToast( + t( + 'Chart [%s] was added to dashboard [%s]', + sliceName, + addedToDashboard.title, + ), + ), + ); + } + } + + return toasts; +}; + +// Update existing slice +export const updateSlice = + ({ slice_id: sliceId, owners }, sliceName, dashboards, addedToDashboard) => + async (dispatch, getState) => { + const { + explore: { + form_data: { url_params: _, ...formData }, + }, + } = getState(); + try { + const response = await SupersetClient.put({ + endpoint: `/api/v1/chart/${sliceId}`, + jsonPayload: getSlicePayload(sliceName, formData, dashboards, owners), + }); + + dispatch(saveSliceSuccess()); + addToasts(false, sliceName, addedToDashboard).map(dispatch); + return response.json; + } catch (error) { + dispatch(saveSliceFailed()); + throw error; + } + }; + +// Create new slice +export const createSlice = + (sliceName, dashboards, addedToDashboard) => async (dispatch, getState) => { + const { + explore: { + form_data: { url_params: _, ...formData }, + }, + } = getState(); + try { + const response = await SupersetClient.post({ + endpoint: `/api/v1/chart/`, + jsonPayload: getSlicePayload(sliceName, formData, dashboards), + }); + + dispatch(saveSliceSuccess()); + addToasts(true, sliceName, addedToDashboard).map(dispatch); + return response.json; + } catch (error) { + dispatch(saveSliceFailed()); + throw error; + } + }; + +// Create new dashboard +export const createDashboard = dashboardName => async dispatch => { + try { + const response = await SupersetClient.post({ + endpoint: `/api/v1/dashboard/`, + jsonPayload: { dashboard_title: dashboardName }, }); - // Save the query context so we can re-generate the data from Python - // for alerts and reports - const queryContext = buildV1ChartDataPayload({ - formData, - force: false, - resultFormat: 'json', - resultType: 'full', + return response.json; + } catch (error) { + dispatch(saveSliceFailed()); + throw error; + } +}; + +// Get existing dashboard from ID +export const getDashboard = dashboardId => async dispatch => { + try { + const response = await SupersetClient.get({ + endpoint: `/api/v1/dashboard/${dashboardId}`, }); - return SupersetClient.post({ - url, - postPayload: { form_data: formData, query_context: queryContext }, - }) - .then(response => { - dispatch(saveSliceSuccess(response.json)); - return response.json; - }) - .catch(() => dispatch(saveSliceFailed())); - }; -} + return response.json; + } catch (error) { + dispatch(saveSliceFailed()); + throw error; + } +}; + +// Get dashboards the slice is added to +export const getSliceDashboards = slice => async dispatch => { + try { + const response = await SupersetClient.get({ + endpoint: `/api/v1/chart/${slice.slice_id}?q=${rison.encode({ + columns: ['dashboards.id'], + })}`, + }); + + return response.json.result.dashboards.map(({ id }) => id); + } catch (error) { + dispatch(saveSliceFailed()); + throw error; + } +}; diff --git a/superset-frontend/src/explore/actions/saveModalActions.test.js b/superset-frontend/src/explore/actions/saveModalActions.test.js new file mode 100644 index 000000000000..8e4a4e5abd32 --- /dev/null +++ b/superset-frontend/src/explore/actions/saveModalActions.test.js @@ -0,0 +1,341 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import sinon from 'sinon'; +import fetchMock from 'fetch-mock'; +import { ADD_TOAST } from 'src/components/MessageToasts/actions'; +import { + createDashboard, + createSlice, + fetchDashboards, + FETCH_DASHBOARDS_FAILED, + FETCH_DASHBOARDS_SUCCEEDED, + getDashboard, + getSliceDashboards, + SAVE_SLICE_FAILED, + SAVE_SLICE_SUCCESS, + updateSlice, +} from './saveModalActions'; + +/** + * Tests fetchDashboards action + */ + +const userId = 1; +const fetchDashboardsEndpoint = `glob:*/dashboardasync/api/read?_flt_0_owners=${1}`; +const mockDashboardData = { + pks: ['id'], + result: [{ id: 'id', dashboard_title: 'dashboard title' }], +}; + +test('fetchDashboards handles success', async () => { + fetchMock.reset(); + fetchMock.get(fetchDashboardsEndpoint, mockDashboardData); + const dispatch = sinon.spy(); + await fetchDashboards(userId)(dispatch); + expect(fetchMock.calls(fetchDashboardsEndpoint)).toHaveLength(1); + expect(dispatch.callCount).toBe(1); + expect(dispatch.getCall(0).args[0].type).toBe(FETCH_DASHBOARDS_SUCCEEDED); +}); + +test('fetchDashboards handles failure', async () => { + fetchMock.reset(); + fetchMock.get(fetchDashboardsEndpoint, { throws: 'error' }); + const dispatch = sinon.spy(); + await fetchDashboards(userId)(dispatch); + expect(fetchMock.calls(fetchDashboardsEndpoint)).toHaveLength(4); // 3 retries + expect(dispatch.callCount).toBe(1); + expect(dispatch.getCall(0).args[0].type).toBe(FETCH_DASHBOARDS_FAILED); +}); + +const sliceId = 10; +const sliceName = 'New chart'; +const vizType = 'sample_viz_type'; +const datasourceId = 11; +const datasourceType = 'sample_datasource_type'; +const dashboards = [12, 13]; +const queryContext = { sampleKey: 'sampleValue' }; +const formData = { + viz_type: vizType, + datasource: `${datasourceId}__${datasourceType}`, + dashboards, +}; +const mockExploreState = { explore: { form_data: formData } }; + +const sliceResponsePayload = { + id: 10, +}; + +const sampleError = new Error('sampleError'); + +jest.mock('../exploreUtils', () => ({ + buildV1ChartDataPayload: jest.fn(() => queryContext), +})); + +/** + * Tests updateSlice action + */ + +const updateSliceEndpoint = `glob:*/api/v1/chart/${sliceId}`; +test('updateSlice handles success', async () => { + fetchMock.reset(); + fetchMock.put(updateSliceEndpoint, sliceResponsePayload); + const dispatch = sinon.spy(); + const getState = sinon.spy(() => mockExploreState); + const slice = await updateSlice( + { slice_id: sliceId }, + sliceName, + [], + )(dispatch, getState); + + expect(fetchMock.calls(updateSliceEndpoint)).toHaveLength(1); + expect(dispatch.callCount).toBe(2); + expect(dispatch.getCall(0).args[0].type).toBe(SAVE_SLICE_SUCCESS); + expect(dispatch.getCall(1).args[0].type).toBe(ADD_TOAST); + expect(dispatch.getCall(1).args[0].payload.toastType).toBe('SUCCESS_TOAST'); + expect(dispatch.getCall(1).args[0].payload.text).toBe( + 'Chart [New chart] has been overwritten', + ); + + expect(slice).toEqual(sliceResponsePayload); +}); + +test('updateSlice handles failure', async () => { + fetchMock.reset(); + fetchMock.put(updateSliceEndpoint, { throws: sampleError }); + const dispatch = sinon.spy(); + const getState = sinon.spy(() => mockExploreState); + let caughtError; + try { + await updateSlice({ slice_id: sliceId }, sliceName, [])(dispatch, getState); + } catch (error) { + caughtError = error; + } + + expect(caughtError).toEqual(sampleError); + expect(fetchMock.calls(updateSliceEndpoint)).toHaveLength(4); + expect(dispatch.callCount).toBe(1); + expect(dispatch.getCall(0).args[0].type).toBe(SAVE_SLICE_FAILED); +}); + +/** + * Tests createSlice action + */ + +const createSliceEndpoint = `glob:*/api/v1/chart/`; +test('createSlice handles success', async () => { + fetchMock.reset(); + fetchMock.post(createSliceEndpoint, sliceResponsePayload); + const dispatch = sinon.spy(); + const getState = sinon.spy(() => mockExploreState); + const slice = await createSlice(sliceName, [])(dispatch, getState); + expect(fetchMock.calls(createSliceEndpoint)).toHaveLength(1); + expect(dispatch.callCount).toBe(2); + expect(dispatch.getCall(0).args[0].type).toBe(SAVE_SLICE_SUCCESS); + expect(dispatch.getCall(1).args[0].type).toBe(ADD_TOAST); + expect(dispatch.getCall(1).args[0].payload.toastType).toBe('SUCCESS_TOAST'); + expect(dispatch.getCall(1).args[0].payload.text).toBe( + 'Chart [New chart] has been saved', + ); + + expect(slice).toEqual(sliceResponsePayload); +}); + +test('createSlice handles failure', async () => { + fetchMock.reset(); + fetchMock.post(createSliceEndpoint, { throws: sampleError }); + const dispatch = sinon.spy(); + const getState = sinon.spy(() => mockExploreState); + let caughtError; + try { + await createSlice(sliceName, [])(dispatch, getState); + } catch (error) { + caughtError = error; + } + + expect(caughtError).toEqual(sampleError); + expect(fetchMock.calls(createSliceEndpoint)).toHaveLength(4); + expect(dispatch.callCount).toBe(1); + expect(dispatch.getCall(0).args[0].type).toBe(SAVE_SLICE_FAILED); +}); + +const dashboardId = 14; +const dashboardName = 'New dashboard'; +const dashboardResponsePayload = { + id: 14, +}; + +/** + * Tests createDashboard action + */ + +const createDashboardEndpoint = `glob:*/api/v1/dashboard/`; +test('createDashboard handles success', async () => { + fetchMock.reset(); + fetchMock.post(createDashboardEndpoint, dashboardResponsePayload); + const dispatch = sinon.spy(); + const dashboard = await createDashboard(dashboardName)(dispatch); + expect(fetchMock.calls(createDashboardEndpoint)).toHaveLength(1); + expect(dispatch.callCount).toBe(0); + expect(dashboard).toEqual(dashboardResponsePayload); +}); + +test('createDashboard handles failure', async () => { + fetchMock.reset(); + fetchMock.post(createDashboardEndpoint, { throws: sampleError }); + const dispatch = sinon.spy(); + let caughtError; + try { + await createDashboard(dashboardName)(dispatch); + } catch (error) { + caughtError = error; + } + + expect(caughtError).toEqual(sampleError); + expect(fetchMock.calls(createDashboardEndpoint)).toHaveLength(4); + expect(dispatch.callCount).toBe(1); + expect(dispatch.getCall(0).args[0].type).toBe(SAVE_SLICE_FAILED); +}); + +/** + * Tests getDashboard action + */ + +const getDashboardEndpoint = `glob:*/api/v1/dashboard/${dashboardId}`; +test('getDashboard handles success', async () => { + fetchMock.reset(); + fetchMock.get(getDashboardEndpoint, dashboardResponsePayload); + const dispatch = sinon.spy(); + const dashboard = await getDashboard(dashboardId)(dispatch); + expect(fetchMock.calls(getDashboardEndpoint)).toHaveLength(1); + expect(dispatch.callCount).toBe(0); + expect(dashboard).toEqual(dashboardResponsePayload); +}); + +test('getDashboard handles failure', async () => { + fetchMock.reset(); + fetchMock.get(getDashboardEndpoint, { throws: sampleError }); + const dispatch = sinon.spy(); + let caughtError; + try { + await getDashboard(dashboardId)(dispatch); + } catch (error) { + caughtError = error; + } + + expect(caughtError).toEqual(sampleError); + expect(fetchMock.calls(getDashboardEndpoint)).toHaveLength(4); + expect(dispatch.callCount).toBe(1); + expect(dispatch.getCall(0).args[0].type).toBe(SAVE_SLICE_FAILED); +}); + +test('updateSlice with add to new dashboard handles success', async () => { + fetchMock.reset(); + fetchMock.put(updateSliceEndpoint, sliceResponsePayload); + const dispatch = sinon.spy(); + const getState = sinon.spy(() => mockExploreState); + const slice = await updateSlice({ slice_id: sliceId }, sliceName, [], { + new: true, + title: dashboardName, + })(dispatch, getState); + + expect(fetchMock.calls(updateSliceEndpoint)).toHaveLength(1); + expect(dispatch.callCount).toBe(3); + expect(dispatch.getCall(0).args[0].type).toBe(SAVE_SLICE_SUCCESS); + expect(dispatch.getCall(1).args[0].type).toBe(ADD_TOAST); + expect(dispatch.getCall(1).args[0].payload.toastType).toBe('SUCCESS_TOAST'); + expect(dispatch.getCall(1).args[0].payload.text).toBe( + 'Chart [New chart] has been overwritten', + ); + expect(dispatch.getCall(2).args[0].type).toBe(ADD_TOAST); + expect(dispatch.getCall(2).args[0].payload.toastType).toBe('SUCCESS_TOAST'); + expect(dispatch.getCall(2).args[0].payload.text).toBe( + 'Dashboard [New dashboard] just got created and chart [New chart] was added to it', + ); + + expect(slice).toEqual(sliceResponsePayload); +}); + +test('updateSlice with add to existing dashboard handles success', async () => { + fetchMock.reset(); + fetchMock.put(updateSliceEndpoint, sliceResponsePayload); + const dispatch = sinon.spy(); + const getState = sinon.spy(() => mockExploreState); + const slice = await updateSlice({ slice_id: sliceId }, sliceName, [], { + new: false, + title: dashboardName, + })(dispatch, getState); + + expect(fetchMock.calls(updateSliceEndpoint)).toHaveLength(1); + expect(dispatch.callCount).toBe(3); + expect(dispatch.getCall(0).args[0].type).toBe(SAVE_SLICE_SUCCESS); + expect(dispatch.getCall(1).args[0].type).toBe(ADD_TOAST); + expect(dispatch.getCall(1).args[0].payload.toastType).toBe('SUCCESS_TOAST'); + expect(dispatch.getCall(1).args[0].payload.text).toBe( + 'Chart [New chart] has been overwritten', + ); + expect(dispatch.getCall(2).args[0].type).toBe(ADD_TOAST); + expect(dispatch.getCall(2).args[0].payload.toastType).toBe('SUCCESS_TOAST'); + expect(dispatch.getCall(2).args[0].payload.text).toBe( + 'Chart [New chart] was added to dashboard [New dashboard]', + ); + + expect(slice).toEqual(sliceResponsePayload); +}); + +const slice = { slice_id: 10 }; +const dashboardSlicesResponsePayload = { + result: { + dashboards: [{ id: 21 }, { id: 22 }, { id: 23 }], + }, +}; + +const getDashboardSlicesReturnValue = [21, 22, 23]; + +/** + * Tests getSliceDashboards action + */ + +const getSliceDashboardsEndpoint = `glob:*/api/v1/chart/${sliceId}?q=(columns:!(dashboards.id))`; +test('getSliceDashboards with slice handles success', async () => { + fetchMock.reset(); + fetchMock.get(getSliceDashboardsEndpoint, dashboardSlicesResponsePayload); + const dispatch = sinon.spy(); + const sliceDashboards = await getSliceDashboards(slice)(dispatch); + expect(fetchMock.calls(getSliceDashboardsEndpoint)).toHaveLength(1); + expect(dispatch.callCount).toBe(0); + expect(sliceDashboards).toEqual(getDashboardSlicesReturnValue); +}); + +test('getSliceDashboards with slice handles failure', async () => { + fetchMock.reset(); + fetchMock.get(getSliceDashboardsEndpoint, { throws: sampleError }); + const dispatch = sinon.spy(); + let caughtError; + try { + await getSliceDashboards(slice)(dispatch); + } catch (error) { + caughtError = error; + } + + expect(caughtError).toEqual(sampleError); + expect(fetchMock.calls(getSliceDashboardsEndpoint)).toHaveLength(4); + expect(dispatch.callCount).toBe(1); + expect(dispatch.getCall(0).args[0].type).toBe(SAVE_SLICE_FAILED); +}); diff --git a/superset-frontend/src/explore/components/Control.test.tsx b/superset-frontend/src/explore/components/Control.test.tsx index 3921d4374663..9b8b549858d4 100644 --- a/superset-frontend/src/explore/components/Control.test.tsx +++ b/superset-frontend/src/explore/components/Control.test.tsx @@ -61,7 +61,7 @@ describe('Control', () => { it('render null if type is not valid', () => { render( setup({ - type: 'UnkownControl', + type: 'UnknownControl', }), ); expect(screen.queryByRole('checkbox')).not.toBeInTheDocument(); diff --git a/superset-frontend/src/explore/components/ControlHeader.tsx b/superset-frontend/src/explore/components/ControlHeader.tsx index 69d34e13c857..2f374d7653ac 100644 --- a/superset-frontend/src/explore/components/ControlHeader.tsx +++ b/superset-frontend/src/explore/components/ControlHeader.tsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import React, { FC, ReactNode } from 'react'; +import React, { FC, ReactNode, useMemo, useRef } from 'react'; import { t, css, useTheme, SupersetTheme } from '@superset-ui/core'; import { InfoTooltipWithTrigger } from '@superset-ui/chart-controls'; import { Tooltip } from 'src/components/Tooltip'; @@ -44,6 +44,16 @@ export type ControlHeaderProps = { selectAllOnClick?: () => void; }; +const iconStyles = css` + &.anticon { + font-size: unset; + .anticon { + line-height: unset; + vertical-align: unset; + } + } +`; + const ControlHeader: FC<ControlHeaderProps> = ({ name, label, @@ -63,6 +73,22 @@ const ControlHeader: FC<ControlHeaderProps> = ({ selectAllOnClick, }) => { const { gridUnit, colors } = useTheme(); + const hasHadNoErrors = useRef(false); + const labelColor = useMemo(() => { + if (!validationErrors.length) { + hasHadNoErrors.current = true; + } + + if (hasHadNoErrors.current) { + if (validationErrors.length) { + return colors.error.base; + } + + return 'unset'; + } + + return colors.alert.base; + }, [colors.error.base, colors.alert.base, validationErrors.length]); if (!label) { return null; @@ -86,12 +112,16 @@ const ControlHeader: FC<ControlHeaderProps> = ({ > {description && ( <span> - <InfoTooltipWithTrigger - label={t('description')} - tooltip={description} + <Tooltip + id="description-tooltip" + title={description} placement="top" - onClick={tooltipOnClick} - />{' '} + > + <Icons.InfoCircleOutlined + css={iconStyles} + onClick={tooltipOnClick} + /> + </Tooltip>{' '} </span> )} {renderTrigger && ( @@ -138,8 +168,6 @@ const ControlHeader: FC<ControlHeaderProps> = ({ </span> ); - const labelClass = validationErrors?.length > 0 ? 'text-danger' : ''; - return ( <div className="ControlHeader" @@ -162,7 +190,6 @@ const ControlHeader: FC<ControlHeaderProps> = ({ role="button" tabIndex={0} onClick={onClick} - className={labelClass} style={{ cursor: onClick ? 'pointer' : '' }} > {label} @@ -182,13 +209,18 @@ const ControlHeader: FC<ControlHeaderProps> = ({ </span> )} {validationErrors?.length > 0 && ( - <span> + <span data-test="error-tooltip"> <Tooltip id="error-tooltip" placement="top" title={validationErrors?.join(' ')} > - <Icons.ErrorSolid iconColor={colors.error.base} iconSize="s" /> + <Icons.ExclamationCircleOutlined + css={css` + ${iconStyles} + color: ${labelColor}; + `} + /> </Tooltip>{' '} </span> )} diff --git a/superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx b/superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx index 6af860470cce..2be8745fa193 100644 --- a/superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx +++ b/superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx @@ -97,10 +97,12 @@ describe('ControlPanelsContainer', () => { } as ControlPanelsContainerProps; } - it('renders ControlPanelSections', () => { - render(<ControlPanelsContainer {...getDefaultProps()} />); + test('renders ControlPanelSections', async () => { + render(<ControlPanelsContainer {...getDefaultProps()} />, { + useRedux: true, + }); expect( - screen.getAllByTestId('collapsible-control-panel-header'), + await screen.findAllByTestId('collapsible-control-panel-header'), ).toHaveLength(4); }); }); diff --git a/superset-frontend/src/explore/components/ControlPanelsContainer.tsx b/superset-frontend/src/explore/components/ControlPanelsContainer.tsx index bb2be2b182b6..60aac1948bf4 100644 --- a/superset-frontend/src/explore/components/ControlPanelsContainer.tsx +++ b/superset-frontend/src/explore/components/ControlPanelsContainer.tsx @@ -35,6 +35,10 @@ import { DatasourceType, css, SupersetTheme, + useTheme, + isDefined, + JsonValue, + NO_TIME_RANGE, } from '@superset-ui/core'; import { ControlPanelSectionConfig, @@ -42,27 +46,32 @@ import { CustomControlItem, Dataset, ExpandedControlItem, - InfoTooltipWithTrigger, + isTemporalColumn, sections, } from '@superset-ui/chart-controls'; +import { useSelector } from 'react-redux'; +import { rgba } from 'emotion-rgba'; +import { kebabCase } from 'lodash'; import Collapse from 'src/components/Collapse'; import Tabs from 'src/components/Tabs'; import { PluginContext } from 'src/components/DynamicPlugins'; import Loading from 'src/components/Loading'; +import Modal from 'src/components/Modal'; import { usePrevious } from 'src/hooks/usePrevious'; import { getSectionsToRender } from 'src/explore/controlUtils'; import { ExploreActions } from 'src/explore/actions/exploreActions'; -import { ExplorePageState } from 'src/explore/reducers/getInitialState'; -import { ChartState } from 'src/explore/types'; +import { ChartState, ExplorePageState } from 'src/explore/types'; import { Tooltip } from 'src/components/Tooltip'; - -import { rgba } from 'emotion-rgba'; +import Icons from 'src/components/Icons'; import ControlRow from './ControlRow'; import Control from './Control'; import { ExploreAlert } from './ExploreAlert'; import { RunQueryButton } from './RunQueryButton'; +import { Operators } from '../constants'; + +const { confirm } = Modal; export type ControlPanelsContainerProps = { exploreState: ExplorePageState['explore']; @@ -86,6 +95,16 @@ export type ExpandedControlPanelSectionConfig = Omit< controlSetRows: ExpandedControlItem[][]; }; +const iconStyles = css` + &.anticon { + font-size: unset; + .anticon { + line-height: unset; + vertical-align: unset; + } + } +`; + const actionButtonsContainerStyles = (theme: SupersetTheme) => css` display: flex; position: sticky; @@ -175,9 +194,7 @@ const isTimeSection = (section: ControlPanelSectionConfig): boolean => sections.legacyTimeseriesTime.label === section.label); const hasTimeColumn = (datasource: Dataset): boolean => - datasource?.columns?.some(c => c.is_dttm) || - datasource.type === DatasourceType.Druid; - + datasource?.columns?.some(c => c.is_dttm); const sectionsToExpand = ( sections: ControlPanelSectionConfig[], datasource: Dataset, @@ -185,7 +202,8 @@ const sectionsToExpand = ( // avoid expanding time section if datasource doesn't include time column sections.reduce( (acc, section) => - section.expanded && (!isTimeSection(section) || hasTimeColumn(datasource)) + (section.expanded || !section.label) && + (!isTimeSection(section) || hasTimeColumn(datasource)) ? [...acc, String(section.label)] : acc, [] as string[], @@ -237,19 +255,137 @@ function getState( }; } +function useResetOnChangeRef(initialValue: () => any, resetOnChangeValue: any) { + const value = useRef(initialValue()); + const prevResetOnChangeValue = useRef(resetOnChangeValue); + if (prevResetOnChangeValue.current !== resetOnChangeValue) { + value.current = initialValue(); + prevResetOnChangeValue.current = resetOnChangeValue; + } + + return value; +} + export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => { + const { colors } = useTheme(); const pluginContext = useContext(PluginContext); const prevState = usePrevious(props.exploreState); const prevDatasource = usePrevious(props.exploreState.datasource); + const prevChartStatus = usePrevious(props.chart.chartStatus); const [showDatasourceAlert, setShowDatasourceAlert] = useState(false); const containerRef = useRef<HTMLDivElement>(null); + const controlsTransferred = useSelector< + ExplorePageState, + string[] | undefined + >(state => state.explore.controlsTransferred); + + const defaultTimeFilter = useSelector<ExplorePageState>( + state => state.common?.conf?.DEFAULT_TIME_FILTER, + ); + + const { form_data, actions } = props; + const { setControlValue } = actions; + const { x_axis, adhoc_filters } = form_data; + + const previousXAxis = usePrevious(x_axis); + + useEffect(() => { + if ( + x_axis && + x_axis !== previousXAxis && + isTemporalColumn(x_axis, props.exploreState.datasource) + ) { + const noFilter = + !adhoc_filters || + !adhoc_filters.find( + filter => + filter.expressionType === 'SIMPLE' && + filter.operator === Operators.TEMPORAL_RANGE && + filter.subject === x_axis, + ); + if (noFilter) { + confirm({ + title: t('The X-axis is not on the filters list'), + content: + t(`The X-axis is not on the filters list which will prevent it from being used in + time range filters in dashboards. Would you like to add it to the filters list?`), + onOk: () => { + setControlValue('adhoc_filters', [ + ...(adhoc_filters || []), + { + clause: 'WHERE', + subject: x_axis, + operator: Operators.TEMPORAL_RANGE, + comparator: defaultTimeFilter || NO_TIME_RANGE, + expressionType: 'SIMPLE', + }, + ]); + }, + }); + } + } + }, [ + x_axis, + adhoc_filters, + setControlValue, + defaultTimeFilter, + previousXAxis, + props.exploreState.datasource, + ]); + + useEffect(() => { + let shouldUpdateControls = false; + const removeDatasourceWarningFromControl = ( + value: JsonValue | undefined, + ) => { + if ( + typeof value === 'object' && + isDefined(value) && + 'datasourceWarning' in value && + value.datasourceWarning === true + ) { + shouldUpdateControls = true; + return { ...value, datasourceWarning: false }; + } + return value; + }; + if ( + props.chart.chartStatus === 'success' && + prevChartStatus !== 'success' + ) { + controlsTransferred?.forEach(controlName => { + shouldUpdateControls = false; + if (!isDefined(props.controls[controlName])) { + return; + } + const alteredControls = Array.isArray(props.controls[controlName].value) + ? ensureIsArray(props.controls[controlName].value)?.map( + removeDatasourceWarningFromControl, + ) + : removeDatasourceWarningFromControl( + props.controls[controlName].value, + ); + if (shouldUpdateControls) { + props.actions.setControlValue(controlName, alteredControls); + } + }); + } + }, [ + controlsTransferred, + prevChartStatus, + props.actions, + props.chart.chartStatus, + props.controls, + ]); + useEffect(() => { if ( prevDatasource && + prevDatasource.type !== DatasourceType.Query && (props.exploreState.datasource?.id !== prevDatasource.id || props.exploreState.datasource?.type !== prevDatasource.type) ) { @@ -270,15 +406,11 @@ export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => { } = useMemo( () => getState( - props.form_data.viz_type, + form_data.viz_type, props.exploreState.datasource, props.datasource_type, ), - [ - props.exploreState.datasource, - props.form_data.viz_type, - props.datasource_type, - ], + [props.exploreState.datasource, form_data.viz_type, props.datasource_type], ); const resetTransferredControls = useCallback(() => { @@ -332,7 +464,12 @@ export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => { undefined), name, }; - const { validationErrors, ...restProps } = controlData as ControlState & { + const { + validationErrors, + label: baseLabel, + description: baseDescription, + ...restProps + } = controlData as ControlState & { validationErrors?: any[]; }; @@ -340,10 +477,41 @@ export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => { ? visibility.call(config, props, controlData) : undefined; + const label = + typeof baseLabel === 'function' + ? baseLabel(exploreState, controls[name], chart) + : baseLabel; + + const description = + typeof baseDescription === 'function' + ? baseDescription(exploreState, controls[name], chart) + : baseDescription; + + if (name === 'adhoc_filters') { + restProps.canDelete = ( + valueToBeDeleted: Record<string, any>, + values: Record<string, any>[], + ) => { + const isTemporalRange = (filter: Record<string, any>) => + filter.operator === Operators.TEMPORAL_RANGE; + if (isTemporalRange(valueToBeDeleted)) { + const count = values.filter(isTemporalRange).length; + if (count === 1) { + return t( + `You cannot delete the last temporal filter as it's used for time range filters in dashboards.`, + ); + } + } + return true; + }; + } + return ( <Control key={`control-${name}`} name={name} + label={label} + description={description} validationErrors={validationErrors} actions={props.actions} isVisible={isVisible} @@ -352,6 +520,11 @@ export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => { ); }; + const sectionHasHadNoErrors = useResetOnChangeRef( + () => ({}), + form_data.viz_type, + ); + const renderControlPanelSection = ( section: ExpandedControlPanelSectionConfig, ) => { @@ -379,19 +552,42 @@ export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => { ); }), ); + + if (!hasErrors) { + sectionHasHadNoErrors.current[sectionId] = true; + } + + const errorColor = sectionHasHadNoErrors.current[sectionId] + ? colors.error.base + : colors.alert.base; + const PanelHeader = () => ( <span data-test="collapsible-control-panel-header"> - <span>{label}</span>{' '} + <span + css={(theme: SupersetTheme) => css` + font-size: ${theme.typography.sizes.m}px; + line-height: 1.3; + `} + > + {label} + </span>{' '} {description && ( - // label is only used in tooltip id (should probably call this prop `id`) - <InfoTooltipWithTrigger label={sectionId} tooltip={description} /> + <Tooltip id={sectionId} title={description}> + <Icons.InfoCircleOutlined css={iconStyles} /> + </Tooltip> )} {hasErrors && ( - <InfoTooltipWithTrigger - label="validation-errors" - bsStyle="danger" - tooltip="This section contains validation errors" - /> + <Tooltip + id={`${kebabCase('validation-errors')}-tooltip`} + title={t('This section contains validation errors')} + > + <Icons.InfoCircleOutlined + css={css` + ${iconStyles}; + color: ${errorColor}; + `} + /> + </Tooltip> )} </span> ); @@ -415,6 +611,12 @@ export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => { span.label { display: inline-block; } + ${!section.label && + ` + .ant-collapse-header { + display: none; + } + `} `} header={<PanelHeader />} key={sectionId} @@ -486,14 +688,26 @@ export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => { [handleClearFormClick, handleContinueClick, hasControlsTransferred], ); - const dataTabTitle = useMemo( - () => ( + const dataTabHasHadNoErrors = useResetOnChangeRef( + () => false, + form_data.viz_type, + ); + + const dataTabTitle = useMemo(() => { + if (!props.errorMessage) { + dataTabHasHadNoErrors.current = true; + } + + const errorColor = dataTabHasHadNoErrors.current + ? colors.error.base + : colors.alert.base; + + return ( <> <span>{t('Data')}</span> {props.errorMessage && ( <span css={(theme: SupersetTheme) => css` - font-size: ${theme.typography.sizes.xs}px; margin-left: ${theme.gridUnit * 2}px; `} > @@ -503,20 +717,26 @@ export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => { placement="right" title={props.errorMessage} > - <i className="fa fa-exclamation-circle text-danger fa-lg" /> + <Icons.ExclamationCircleOutlined + css={css` + ${iconStyles}; + color: ${errorColor}; + `} + /> </Tooltip> </span> )} </> - ), - [props.errorMessage], - ); + ); + }, [ + colors.error.base, + colors.alert.base, + dataTabHasHadNoErrors, + props.errorMessage, + ]); const controlPanelRegistry = getChartControlPanelRegistry(); - if ( - !controlPanelRegistry.has(props.form_data.viz_type) && - pluginContext.loading - ) { + if (!controlPanelRegistry.has(form_data.viz_type) && pluginContext.loading) { return <Loading />; } diff --git a/superset-frontend/src/explore/components/DataTableControl/FilterInput.test.tsx b/superset-frontend/src/explore/components/DataTableControl/FilterInput.test.tsx index fb77c21d7a77..e05964285573 100644 --- a/superset-frontend/src/explore/components/DataTableControl/FilterInput.test.tsx +++ b/superset-frontend/src/explore/components/DataTableControl/FilterInput.test.tsx @@ -29,6 +29,7 @@ jest.mock('lodash/debounce', () => ({ test('Render a FilterInput', async () => { const onChangeHandler = jest.fn(); render(<FilterInput onChangeHandler={onChangeHandler} />); + expect(await screen.findByRole('textbox')).toBeInTheDocument(); expect(onChangeHandler).toBeCalledTimes(0); userEvent.type(screen.getByRole('textbox'), 'test'); diff --git a/superset-frontend/src/explore/components/DataTableControl/index.tsx b/superset-frontend/src/explore/components/DataTableControl/index.tsx index fdc74d7bb4cd..7cca07a40800 100644 --- a/superset-frontend/src/explore/components/DataTableControl/index.tsx +++ b/superset-frontend/src/explore/components/DataTableControl/index.tsx @@ -314,9 +314,9 @@ export const useTableColumns = ( const isOriginalTimeColumn = originalFormattedTimeColumns.includes(key); return { - id: key, + // react-table requires a non-empty id, therefore we introduce a fallback value in case the key is empty + id: key || index, accessor: row => row[key], - // When the key is empty, have to give a string of length greater than 0 Header: colType === GenericDataType.TEMPORAL && typeof firstValue !== 'string' ? ( diff --git a/superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx b/superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx index bfba9cf98001..4101911da702 100644 --- a/superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx +++ b/superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx @@ -26,6 +26,7 @@ import React, { import { styled, t, useTheme } from '@superset-ui/core'; import Icons from 'src/components/Icons'; import Tabs from 'src/components/Tabs'; +import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; import { getItem, setItem, @@ -96,11 +97,14 @@ export const DataTablesPane = ({ samples: false, }); const [panelOpen, setPanelOpen] = useState( - getItem(LocalStorageKeys.is_datapanel_open, false), + isFeatureEnabled(FeatureFlag.DATAPANEL_CLOSED_BY_DEFAULT) + ? false + : getItem(LocalStorageKeys.is_datapanel_open, false), ); useEffect(() => { - setItem(LocalStorageKeys.is_datapanel_open, panelOpen); + if (!isFeatureEnabled(FeatureFlag.DATAPANEL_CLOSED_BY_DEFAULT)) + setItem(LocalStorageKeys.is_datapanel_open, panelOpen); }, [panelOpen]); useEffect(() => { diff --git a/superset-frontend/src/explore/components/DataTablesPane/components/ResultsPaneOnDashboard.tsx b/superset-frontend/src/explore/components/DataTablesPane/components/ResultsPaneOnDashboard.tsx index 3f27929f5cd8..ade2c1519dfc 100644 --- a/superset-frontend/src/explore/components/DataTablesPane/components/ResultsPaneOnDashboard.tsx +++ b/superset-frontend/src/explore/components/DataTablesPane/components/ResultsPaneOnDashboard.tsx @@ -17,11 +17,34 @@ * under the License. */ import React from 'react'; -import { t } from '@superset-ui/core'; +import { t, styled } from '@superset-ui/core'; import Tabs from 'src/components/Tabs'; import { ResultTypes, ResultsPaneProps } from '../types'; import { useResultsPane } from './useResultsPane'; +const Wrapper = styled.div` + display: flex; + flex-direction: column; + height: 100%; + + .ant-tabs { + height: 100%; + } + + .ant-tabs-content { + height: 100%; + } + + .ant-tabs-tabpane { + display: flex; + flex-direction: column; + } + + .table-condensed { + overflow: auto; + } +`; + export const ResultsPaneOnDashboard = ({ isRequest, queryFormData, @@ -42,8 +65,9 @@ export const ResultsPaneOnDashboard = ({ dataSize, isVisible, }); + if (resultsPanes.length === 1) { - return resultsPanes[0]; + return <Wrapper>{resultsPanes[0]}</Wrapper>; } const panes = resultsPanes.map((pane, idx) => { @@ -65,5 +89,9 @@ export const ResultsPaneOnDashboard = ({ ); }); - return <Tabs fullWidth={false}> {panes} </Tabs>; + return ( + <Wrapper> + <Tabs fullWidth={false}>{panes}</Tabs> + </Wrapper> + ); }; diff --git a/superset-frontend/src/explore/components/DataTablesPane/components/SamplesPane.tsx b/superset-frontend/src/explore/components/DataTablesPane/components/SamplesPane.tsx index 8b1137334b9d..5c66075750dc 100644 --- a/superset-frontend/src/explore/components/DataTablesPane/components/SamplesPane.tsx +++ b/superset-frontend/src/explore/components/DataTablesPane/components/SamplesPane.tsx @@ -25,7 +25,7 @@ import { useFilteredTableData, useTableColumns, } from 'src/explore/components/DataTableControl'; -import { getDatasetSamples } from 'src/components/Chart/chartAction'; +import { getDatasourceSamples } from 'src/components/Chart/chartAction'; import { TableControls } from './DataTableControls'; import { SamplesPaneProps } from '../types'; @@ -61,7 +61,7 @@ export const SamplesPane = ({ if (isRequest && !cache.has(datasource)) { setIsLoading(true); - getDatasetSamples(datasource.id, queryForce) + getDatasourceSamples(datasource.type, datasource.id, queryForce, {}) .then(response => { setData(ensureIsArray(response.data)); setColnames(ensureIsArray(response.colnames)); diff --git a/superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx b/superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx index 20e53df849cd..9b6b597c7900 100644 --- a/superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx +++ b/superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx @@ -17,13 +17,17 @@ * under the License. */ import React, { useState, useEffect } from 'react'; -import { ensureIsArray, styled, t } from '@superset-ui/core'; +import { + ensureIsArray, + styled, + t, + getChartMetadataRegistry, +} from '@superset-ui/core'; import Loading from 'src/components/Loading'; import { EmptyStateMedium } from 'src/components/EmptyState'; import { getChartDataRequest } from 'src/components/Chart/chartAction'; import { getClientErrorObject } from 'src/utils/getClientErrorObject'; import { ResultsPaneProps, QueryResultInterface } from '../types'; -import { getQueryCount } from '../utils'; import { SingleQueryResultPane } from './SingleQueryResultPane'; import { TableControls } from './DataTableControls'; @@ -31,7 +35,7 @@ const Error = styled.pre` margin-top: ${({ theme }) => `${theme.gridUnit * 4}px`}; `; -const cache = new WeakSet(); +const cache = new WeakMap(); export const useResultsPane = ({ isRequest, @@ -43,16 +47,26 @@ export const useResultsPane = ({ isVisible, dataSize = 50, }: ResultsPaneProps): React.ReactElement[] => { + const metadata = getChartMetadataRegistry().get( + queryFormData?.viz_type || queryFormData?.vizType, + ); + const [resultResp, setResultResp] = useState<QueryResultInterface[]>([]); const [isLoading, setIsLoading] = useState<boolean>(true); const [responseError, setResponseError] = useState<string>(''); - const queryCount = getQueryCount( - queryFormData?.viz_type || queryFormData?.vizType, - ); + const queryCount = metadata?.queryObjectCount ?? 1; useEffect(() => { // it's an invalid formData when gets a errorMessage if (errorMessage) return; + if (isRequest && cache.has(queryFormData)) { + setResultResp(ensureIsArray(cache.get(queryFormData))); + setResponseError(''); + if (queryForce && actions) { + actions.setForceQuery(false); + } + setIsLoading(false); + } if (isRequest && !cache.has(queryFormData)) { setIsLoading(true); getChartDataRequest({ @@ -65,7 +79,7 @@ export const useResultsPane = ({ .then(({ json }) => { setResultResp(ensureIsArray(json.result)); setResponseError(''); - cache.add(queryFormData); + cache.set(queryFormData, json.result); if (queryForce && actions) { actions.setForceQuery(false); } @@ -122,15 +136,17 @@ export const useResultsPane = ({ ); } - return resultResp.map((result, idx) => ( - <SingleQueryResultPane - data={result.data} - colnames={result.colnames} - coltypes={result.coltypes} - dataSize={dataSize} - datasourceId={queryFormData.datasource} - key={idx} - isVisible={isVisible} - /> - )); + return resultResp + .slice(0, queryCount) + .map((result, idx) => ( + <SingleQueryResultPane + data={result.data} + colnames={result.colnames} + coltypes={result.coltypes} + dataSize={dataSize} + datasourceId={queryFormData.datasource} + key={idx} + isVisible={isVisible} + /> + )); }; diff --git a/superset-frontend/src/explore/components/DataTablesPane/test/DataTablesPane.test.tsx b/superset-frontend/src/explore/components/DataTablesPane/test/DataTablesPane.test.tsx index c5d9d0c7bb2d..a27385f51e9b 100644 --- a/superset-frontend/src/explore/components/DataTablesPane/test/DataTablesPane.test.tsx +++ b/superset-frontend/src/explore/components/DataTablesPane/test/DataTablesPane.test.tsx @@ -19,12 +19,14 @@ import React from 'react'; import userEvent from '@testing-library/user-event'; import fetchMock from 'fetch-mock'; +import { FeatureFlag } from 'src/featureFlags'; import * as copyUtils from 'src/utils/copy'; import { render, screen, waitForElementToBeRemoved, } from 'spec/helpers/testing-library'; +import { setItem, LocalStorageKeys } from 'src/utils/localStorageHelpers'; import { DataTablesPane } from '..'; import { createDataTablesPaneProps } from './fixture'; @@ -39,10 +41,10 @@ describe('DataTablesPane', () => { localStorage.clear(); }); - test('Rendering DataTablesPane correctly', () => { + test('Rendering DataTablesPane correctly', async () => { const props = createDataTablesPaneProps(0); render(<DataTablesPane {...props} />, { useRedux: true }); - expect(screen.getByText('Results')).toBeVisible(); + expect(await screen.findByText('Results')).toBeVisible(); expect(screen.getByText('Samples')).toBeVisible(); expect(screen.getByLabelText('Expand data panel')).toBeVisible(); }); @@ -143,4 +145,19 @@ describe('DataTablesPane', () => { expect(screen.queryByText('Action')).not.toBeInTheDocument(); fetchMock.restore(); }); + + test('Displaying the data pane is under featureflag', () => { + // @ts-ignore + global.featureFlags = { + [FeatureFlag.DATAPANEL_CLOSED_BY_DEFAULT]: true, + }; + const props = createDataTablesPaneProps(0); + setItem(LocalStorageKeys.is_datapanel_open, true); + render(<DataTablesPane {...props} />, { + useRedux: true, + }); + expect( + screen.queryByLabelText('Collapse data panel'), + ).not.toBeInTheDocument(); + }); }); diff --git a/superset-frontend/src/explore/components/DataTablesPane/test/ResultsPaneOnDashboard.test.tsx b/superset-frontend/src/explore/components/DataTablesPane/test/ResultsPaneOnDashboard.test.tsx index 19980ff71147..839126bb6253 100644 --- a/superset-frontend/src/explore/components/DataTablesPane/test/ResultsPaneOnDashboard.test.tsx +++ b/superset-frontend/src/explore/components/DataTablesPane/test/ResultsPaneOnDashboard.test.tsx @@ -22,9 +22,10 @@ import userEvent from '@testing-library/user-event'; import { render, waitForElementToBeRemoved, + waitFor, } from 'spec/helpers/testing-library'; import { exploreActions } from 'src/explore/actions/exploreActions'; -import { promiseTimeout } from '@superset-ui/core'; +import { ChartMetadata, ChartPlugin } from '@superset-ui/core'; import { ResultsPaneOnDashboard } from '../components'; import { createResultsPaneOnDashboardProps } from './fixture'; @@ -133,9 +134,9 @@ describe('ResultsPaneOnDashboard', () => { }, ); - await promiseTimeout(() => { + await waitFor(() => { expect(setForceQuery).toHaveBeenCalledTimes(1); - }, 10); + }); expect(queryByText('2 rows')).toBeVisible(); expect(queryByText('Action')).toBeVisible(); expect(queryByText('Horror')).toBeVisible(); @@ -147,6 +148,19 @@ describe('ResultsPaneOnDashboard', () => { }); test('multiple results pane', async () => { + const FakeChart = () => <span>test</span>; + const metadata = new ChartMetadata({ + name: 'test-chart', + thumbnail: '', + queryObjectCount: 2, + }); + + const plugin = new ChartPlugin({ + metadata, + Chart: FakeChart, + }); + plugin.configure({ key: 'mixed_timeseries' }).register(); + const props = createResultsPaneOnDashboardProps({ sliceId: 196, vizType: 'mixed_timeseries', diff --git a/superset-frontend/src/explore/components/DataTablesPane/test/SamplesPane.test.tsx b/superset-frontend/src/explore/components/DataTablesPane/test/SamplesPane.test.tsx index 54c04c6003ba..eed6e84808b7 100644 --- a/superset-frontend/src/explore/components/DataTablesPane/test/SamplesPane.test.tsx +++ b/superset-frontend/src/explore/components/DataTablesPane/test/SamplesPane.test.tsx @@ -22,33 +22,42 @@ import userEvent from '@testing-library/user-event'; import { render, waitForElementToBeRemoved, + waitFor, } from 'spec/helpers/testing-library'; import { exploreActions } from 'src/explore/actions/exploreActions'; -import { promiseTimeout } from '@superset-ui/core'; import { SamplesPane } from '../components'; import { createSamplesPaneProps } from './fixture'; describe('SamplesPane', () => { - fetchMock.get('end:/api/v1/dataset/34/samples?force=false', { - result: { - data: [], - colnames: [], - coltypes: [], + fetchMock.post( + 'end:/datasource/samples?force=false&datasource_type=table&datasource_id=34', + { + result: { + data: [], + colnames: [], + coltypes: [], + }, }, - }); + ); - fetchMock.get('end:/api/v1/dataset/35/samples?force=true', { - result: { - data: [ - { __timestamp: 1230768000000, genre: 'Action' }, - { __timestamp: 1230768000010, genre: 'Horror' }, - ], - colnames: ['__timestamp', 'genre'], - coltypes: [2, 1], + fetchMock.post( + 'end:/datasource/samples?force=true&datasource_type=table&datasource_id=35', + { + result: { + data: [ + { __timestamp: 1230768000000, genre: 'Action' }, + { __timestamp: 1230768000010, genre: 'Horror' }, + ], + colnames: ['__timestamp', 'genre'], + coltypes: [2, 1], + }, }, - }); + ); - fetchMock.get('end:/api/v1/dataset/36/samples?force=false', 400); + fetchMock.post( + 'end:/datasource/samples?force=false&datasource_type=table&datasource_id=36', + 400, + ); const setForceQuery = jest.spyOn(exploreActions, 'setForceQuery'); @@ -63,9 +72,9 @@ describe('SamplesPane', () => { expect( await findByText('No samples were returned for this dataset'), ).toBeVisible(); - await promiseTimeout(() => { + await waitFor(() => { expect(setForceQuery).toHaveBeenCalledTimes(0); - }, 10); + }); }); test('error response', async () => { @@ -91,9 +100,9 @@ describe('SamplesPane', () => { }, ); - await promiseTimeout(() => { + await waitFor(() => { expect(setForceQuery).toHaveBeenCalledTimes(1); - }, 10); + }); expect(queryByText('2 rows')).toBeVisible(); expect(queryByText('Action')).toBeVisible(); expect(queryByText('Horror')).toBeVisible(); diff --git a/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanel.test.tsx b/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanel.test.tsx index 4b19c5b2f381..95258f443ec4 100644 --- a/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanel.test.tsx +++ b/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanel.test.tsx @@ -17,11 +17,10 @@ * under the License. */ import React from 'react'; -import { HTML5Backend } from 'react-dnd-html5-backend'; -import { DndProvider } from 'react-dnd'; import { render, screen, waitFor } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; import DatasourcePanel, { + IDatasource, Props as DatasourcePanelProps, } from 'src/explore/components/DatasourcePanel'; import { @@ -31,23 +30,15 @@ import { import { DatasourceType } from '@superset-ui/core'; import DatasourceControl from 'src/explore/components/controls/DatasourceControl'; -const datasource = { +const datasource: IDatasource = { id: 1, type: DatasourceType.Table, - name: 'birth_names', columns, metrics, - uid: '1__table', database: { - backend: 'mysql', - name: 'main', + id: 1, }, - column_format: { ratio: '.2%' }, - verbose_map: { __timestamp: 'Time' }, - main_dttm_col: 'None', datasource_name: 'table1', - description: 'desc', - owners: [{ username: 'admin', userId: 1 }], }; const mockUser = { @@ -80,53 +71,50 @@ const props: DatasourcePanelProps = { }, }; -const setup = (props: DatasourcePanelProps) => ( - <DndProvider backend={HTML5Backend}> - <DatasourcePanel {...props} /> - </DndProvider> -); - -function search(value: string, input: HTMLElement) { +const search = (value: string, input: HTMLElement) => { userEvent.clear(input); userEvent.type(input, value); -} +}; -test('should render', () => { - const { container } = render(setup(props), { useRedux: true }); +test('should render', async () => { + const { container } = render(<DatasourcePanel {...props} />, { + useRedux: true, + useDnd: true, + }); + expect(await screen.findByText(/metrics/i)).toBeInTheDocument(); expect(container).toBeVisible(); }); -test('should display items in controls', () => { - render(setup(props), { useRedux: true }); - expect(screen.getByText('birth_names')).toBeInTheDocument(); - expect(screen.getByText('Metrics')).toBeInTheDocument(); +test('should display items in controls', async () => { + render(<DatasourcePanel {...props} />, { useRedux: true, useDnd: true }); + expect(await screen.findByText('Metrics')).toBeInTheDocument(); expect(screen.getByText('Columns')).toBeInTheDocument(); }); -test('should render the metrics', () => { - render(setup(props), { useRedux: true }); +test('should render the metrics', async () => { + render(<DatasourcePanel {...props} />, { useRedux: true, useDnd: true }); const metricsNum = metrics.length; metrics.forEach(metric => expect(screen.getByText(metric.metric_name)).toBeInTheDocument(), ); expect( - screen.getByText(`Showing ${metricsNum} of ${metricsNum}`), + await screen.findByText(`Showing ${metricsNum} of ${metricsNum}`), ).toBeInTheDocument(); }); -test('should render the columns', () => { - render(setup(props), { useRedux: true }); +test('should render the columns', async () => { + render(<DatasourcePanel {...props} />, { useRedux: true, useDnd: true }); const columnsNum = columns.length; columns.forEach(col => expect(screen.getByText(col.column_name)).toBeInTheDocument(), ); expect( - screen.getByText(`Showing ${columnsNum} of ${columnsNum}`), + await screen.findByText(`Showing ${columnsNum} of ${columnsNum}`), ).toBeInTheDocument(); }); test('should render 0 search results', async () => { - render(setup(props), { useRedux: true }); + render(<DatasourcePanel {...props} />, { useRedux: true, useDnd: true }); const searchInput = screen.getByPlaceholderText('Search Metrics & Columns'); search('nothing', searchInput); @@ -134,7 +122,7 @@ test('should render 0 search results', async () => { }); test('should search and render matching columns', async () => { - render(setup(props), { useRedux: true }); + render(<DatasourcePanel {...props} />, { useRedux: true, useDnd: true }); const searchInput = screen.getByPlaceholderText('Search Metrics & Columns'); search(columns[0].column_name, searchInput); @@ -146,7 +134,7 @@ test('should search and render matching columns', async () => { }); test('should search and render matching metrics', async () => { - render(setup(props), { useRedux: true }); + render(<DatasourcePanel {...props} />, { useRedux: true, useDnd: true }); const searchInput = screen.getByPlaceholderText('Search Metrics & Columns'); search(metrics[0].metric_name, searchInput); @@ -162,38 +150,34 @@ test('should render a warning', async () => { ...datasource, extra: JSON.stringify({ warning_markdown: 'This is a warning.' }), }; - render( - setup({ - ...props, - datasource: deprecatedDatasource, - controls: { - datasource: { - ...props.controls.datasource, - datasource: deprecatedDatasource, - user: mockUser, - }, + const newProps = { + ...props, + datasource: deprecatedDatasource, + controls: { + datasource: { + ...props.controls.datasource, + datasource: deprecatedDatasource, + user: mockUser, }, - }), - { useRedux: true }, - ); + }, + }; + render(<DatasourcePanel {...newProps} />, { useRedux: true, useDnd: true }); expect( await screen.findByRole('img', { name: 'alert-solid' }), ).toBeInTheDocument(); }); -test('should render a create dataset infobox', () => { - render( - setup({ - ...props, - datasource: { - ...datasource, - type: DatasourceType.Query, - }, - }), - { useRedux: true }, - ); +test('should render a create dataset infobox', async () => { + const newProps = { + ...props, + datasource: { + ...datasource, + type: DatasourceType.Query, + }, + }; + render(<DatasourcePanel {...newProps} />, { useRedux: true, useDnd: true }); - const createButton = screen.getByRole('button', { + const createButton = await screen.findByRole('button', { name: /create a dataset/i, }); const infoboxText = screen.getByText(/to edit or add columns and metrics./i); @@ -202,40 +186,16 @@ test('should render a create dataset infobox', () => { expect(infoboxText).toBeVisible(); }); -test('should render a save dataset modal when "Create a dataset" is clicked', () => { - render( - setup({ - ...props, - datasource: { - ...datasource, - type: DatasourceType.Query, - }, - }), - { useRedux: true }, - ); - - const createButton = screen.getByRole('button', { - name: /create a dataset/i, - }); - - userEvent.click(createButton); - - const saveDatasetModalTitle = screen.getByText(/save or overwrite dataset/i); - - expect(saveDatasetModalTitle).toBeVisible(); -}); - -test('should not render a save dataset modal when datasource is not query or dataset', () => { - render( - setup({ - ...props, - datasource: { - ...datasource, - type: DatasourceType.Table, - }, - }), - { useRedux: true }, - ); +test('should not render a save dataset modal when datasource is not query or dataset', async () => { + const newProps = { + ...props, + datasource: { + ...datasource, + type: DatasourceType.Table, + }, + }; + render(<DatasourcePanel {...newProps} />, { useRedux: true, useDnd: true }); + expect(await screen.findByText(/metrics/i)).toBeInTheDocument(); expect(screen.queryByText(/create a dataset/i)).toBe(null); }); diff --git a/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanelDragOption/DatasourcePanelDragOption.test.tsx b/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanelDragOption/DatasourcePanelDragOption.test.tsx index be8f91eade6a..8de766da88c9 100644 --- a/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanelDragOption/DatasourcePanelDragOption.test.tsx +++ b/superset-frontend/src/explore/components/DatasourcePanel/DatasourcePanelDragOption/DatasourcePanelDragOption.test.tsx @@ -17,38 +17,35 @@ * under the License. */ import React from 'react'; -import { DndProvider } from 'react-dnd'; -import { HTML5Backend } from 'react-dnd-html5-backend'; import { render, screen } from 'spec/helpers/testing-library'; import { DndItemType } from 'src/explore/components/DndItemType'; import DatasourcePanelDragOption from '.'; -test('should render', () => { +test('should render', async () => { render( - <DndProvider backend={HTML5Backend}> - <DatasourcePanelDragOption - value={{ metric_name: 'test' }} - type={DndItemType.Metric} - /> - </DndProvider>, + <DatasourcePanelDragOption + value={{ metric_name: 'test' }} + type={DndItemType.Metric} + />, + { useDnd: true }, ); - expect(screen.getByTestId('DatasourcePanelDragOption')).toBeInTheDocument(); + expect( + await screen.findByTestId('DatasourcePanelDragOption'), + ).toBeInTheDocument(); expect(screen.getByText('test')).toBeInTheDocument(); }); -test('should have attribute draggable:true', () => { +test('should have attribute draggable:true', async () => { render( - <DndProvider backend={HTML5Backend}> - <DatasourcePanelDragOption - value={{ metric_name: 'test' }} - type={DndItemType.Metric} - /> - </DndProvider>, + <DatasourcePanelDragOption + value={{ metric_name: 'test' }} + type={DndItemType.Metric} + />, + { useDnd: true }, ); - expect(screen.getByTestId('DatasourcePanelDragOption')).toHaveAttribute( - 'draggable', - 'true', - ); + expect( + await screen.findByTestId('DatasourcePanelDragOption'), + ).toHaveAttribute('draggable', 'true'); }); diff --git a/superset-frontend/src/explore/components/DatasourcePanel/fixtures.tsx b/superset-frontend/src/explore/components/DatasourcePanel/fixtures.tsx index a4a893fae08f..05909b1e64fc 100644 --- a/superset-frontend/src/explore/components/DatasourcePanel/fixtures.tsx +++ b/superset-frontend/src/explore/components/DatasourcePanel/fixtures.tsx @@ -16,10 +16,9 @@ * specific language governing permissions and limitations * under the License. */ -import { ColumnMeta } from '@superset-ui/chart-controls'; import { GenericDataType } from '@superset-ui/core'; -export const columns: ColumnMeta[] = [ +export const columns = [ { column_name: 'bootcamp_attend', description: null, diff --git a/superset-frontend/src/explore/components/DatasourcePanel/index.tsx b/superset-frontend/src/explore/components/DatasourcePanel/index.tsx index b0042e138f4a..dedffc104455 100644 --- a/superset-frontend/src/explore/components/DatasourcePanel/index.tsx +++ b/superset-frontend/src/explore/components/DatasourcePanel/index.tsx @@ -17,39 +17,69 @@ * under the License. */ import React, { useEffect, useMemo, useRef, useState } from 'react'; -import { css, styled, t, DatasourceType } from '@superset-ui/core'; import { - ControlConfig, - Dataset, - ColumnMeta, -} from '@superset-ui/chart-controls'; -import { debounce } from 'lodash'; + css, + styled, + t, + DatasourceType, + Metric, + QueryFormData, +} from '@superset-ui/core'; + +import { ControlConfig, ColumnMeta } from '@superset-ui/chart-controls'; + +import { debounce, isArray } from 'lodash'; import { matchSorter, rankings } from 'match-sorter'; import Collapse from 'src/components/Collapse'; import Alert from 'src/components/Alert'; import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; +import { getDatasourceAsSaveableDataset } from 'src/utils/datasourceUtils'; import { Input } from 'src/components/Input'; import { FAST_DEBOUNCE } from 'src/constants'; import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; import { ExploreActions } from 'src/explore/actions/exploreActions'; import Control from 'src/explore/components/Control'; -import { ExploreDatasource } from 'src/SqlLab/types'; import DatasourcePanelDragOption from './DatasourcePanelDragOption'; import { DndItemType } from '../DndItemType'; import { StyledColumnOption, StyledMetricOption } from '../optionRenderers'; +import { DndItemValue } from './types'; interface DatasourceControl extends ControlConfig { - datasource?: ExploreDatasource; + datasource?: IDatasource; +} + +export interface DataSourcePanelColumn { + is_dttm?: boolean | null; + description?: string | null; + expression?: string | null; + is_certified?: number | null; + column_name?: string | null; + name?: string | null; + type?: string; +} +export interface IDatasource { + metrics: Metric[]; + columns: DataSourcePanelColumn[]; + id: number; + type: DatasourceType; + database: { + id: number; + }; + sql?: string | null; + datasource_name?: string | null; + name?: string | null; + schema?: string | null; } export interface Props { - datasource: Dataset; + datasource: IDatasource; controls: { datasource: DatasourceControl; }; actions: Partial<ExploreActions> & Pick<ExploreActions, 'setControlValue'>; // we use this props control force update when this panel resize shouldForceUpdate?: number; + formData?: QueryFormData; } const enableExploreDnd = isFeatureEnabled( @@ -150,8 +180,9 @@ const LabelWrapper = styled.div` `; const SectionHeader = styled.span` - ${({ theme }) => css` - font-size: ${theme.typography.sizes.s}px; + ${({ theme }) => ` + font-size: ${theme.typography.sizes.m}px; + line-height: 1.3; `} `; @@ -182,20 +213,20 @@ const LabelContainer = (props: { export default function DataSourcePanel({ datasource, + formData, controls: { datasource: datasourceControl }, actions, shouldForceUpdate, }: Props) { const { columns: _columns, metrics } = datasource; - // display temporal column first const columns = useMemo( () => - [..._columns].sort((col1, col2) => { - if (col1.is_dttm && !col2.is_dttm) { + [...(isArray(_columns) ? _columns : [])].sort((col1, col2) => { + if (col1?.is_dttm && !col2?.is_dttm) { return -1; } - if (col2.is_dttm && !col1.is_dttm) { + if (col2?.is_dttm && !col1?.is_dttm) { return 1; } return 0; @@ -235,7 +266,7 @@ export default function DataSourcePanel({ }, { key: item => - [item.description, item.expression].map( + [item?.description ?? '', item?.expression ?? ''].map( x => x?.replace(/[_\n\s]+/g, ' ') || '', ), threshold: rankings.CONTAINS, @@ -256,7 +287,7 @@ export default function DataSourcePanel({ }, { key: item => - [item.description, item.expression].map( + [item?.description ?? '', item?.expression ?? ''].map( x => x?.replace(/[_\n\s]+/g, ' ') || '', ), threshold: rankings.CONTAINS, @@ -265,8 +296,9 @@ export default function DataSourcePanel({ ], keepDiacritics: true, baseSort: (a, b) => - Number(b.item.is_certified) - Number(a.item.is_certified) || - String(a.rankedValue).localeCompare(b.rankedValue), + Number(b?.item?.is_certified ?? 0) - + Number(a?.item?.is_certified ?? 0) || + String(a?.rankedValue ?? '').localeCompare(b?.rankedValue ?? ''), }), }); }, FAST_DEBOUNCE), @@ -281,23 +313,23 @@ export default function DataSourcePanel({ setInputValue(''); }, [columns, datasource, metrics]); - const sortCertifiedFirst = (slice: ColumnMeta[]) => - slice.sort((a, b) => b.is_certified - a.is_certified); + const sortCertifiedFirst = (slice: DataSourcePanelColumn[]) => + slice.sort((a, b) => (b?.is_certified ?? 0) - (a?.is_certified ?? 0)); const metricSlice = useMemo( () => showAllMetrics - ? lists.metrics - : lists.metrics.slice(0, DEFAULT_MAX_METRICS_LENGTH), - [lists.metrics, showAllMetrics], + ? lists?.metrics + : lists?.metrics?.slice?.(0, DEFAULT_MAX_METRICS_LENGTH), + [lists?.metrics, showAllMetrics], ); const columnSlice = useMemo( () => showAllColumns - ? sortCertifiedFirst(lists.columns) + ? sortCertifiedFirst(lists?.columns) : sortCertifiedFirst( - lists.columns.slice(0, DEFAULT_MAX_COLUMNS_LENGTH), + lists?.columns?.slice?.(0, DEFAULT_MAX_COLUMNS_LENGTH), ), [lists.columns, showAllColumns], ); @@ -307,6 +339,14 @@ export default function DataSourcePanel({ return true; }; + const saveableDatasets = { + query: DatasourceType.Query, + saved_query: DatasourceType.SavedQuery, + }; + + const datasourceIsSaveable = + datasource.type && saveableDatasets[datasource.type]; + const mainBody = useMemo( () => ( <> @@ -321,7 +361,7 @@ export default function DataSourcePanel({ placeholder={t('Search Metrics & Columns')} /> <div className="field-selections"> - {datasource.type === DatasourceType.Query && showInfoboxCheck() && ( + {datasourceIsSaveable && showInfoboxCheck() && ( <StyledInfoboxWrapper> <Alert closable @@ -349,42 +389,44 @@ export default function DataSourcePanel({ expandIconPosition="right" ghost > - <Collapse.Panel - header={<SectionHeader>{t('Metrics')}</SectionHeader>} - key="metrics" - > - <div className="field-length"> - {t( - `Showing %s of %s`, - metricSlice.length, - lists.metrics.length, - )} - </div> - {metricSlice.map(m => ( - <LabelContainer - key={m.metric_name + String(shouldForceUpdate)} - className="column" - > - {enableExploreDnd ? ( - <DatasourcePanelDragOption - value={m} - type={DndItemType.Metric} - /> - ) : ( - <StyledMetricOption metric={m} showType /> + {metrics?.length && ( + <Collapse.Panel + header={<SectionHeader>{t('Metrics')}</SectionHeader>} + key="metrics" + > + <div className="field-length"> + {t( + `Showing %s of %s`, + metricSlice?.length, + lists?.metrics.length, )} - </LabelContainer> - ))} - {lists.metrics.length > DEFAULT_MAX_METRICS_LENGTH ? ( - <ButtonContainer> - <Button onClick={() => setShowAllMetrics(!showAllMetrics)}> - {showAllMetrics ? t('Show less...') : t('Show all...')} - </Button> - </ButtonContainer> - ) : ( - <></> - )} - </Collapse.Panel> + </div> + {metricSlice?.map?.((m: Metric) => ( + <LabelContainer + key={m.metric_name + String(shouldForceUpdate)} + className="column" + > + {enableExploreDnd ? ( + <DatasourcePanelDragOption + value={m} + type={DndItemType.Metric} + /> + ) : ( + <StyledMetricOption metric={m} showType /> + )} + </LabelContainer> + ))} + {lists?.metrics?.length > DEFAULT_MAX_METRICS_LENGTH ? ( + <ButtonContainer> + <Button onClick={() => setShowAllMetrics(!showAllMetrics)}> + {showAllMetrics ? t('Show less...') : t('Show all...')} + </Button> + </ButtonContainer> + ) : ( + <></> + )} + </Collapse.Panel> + )} <Collapse.Panel header={<SectionHeader>{t('Columns')}</SectionHeader>} key="column" @@ -403,11 +445,11 @@ export default function DataSourcePanel({ > {enableExploreDnd ? ( <DatasourcePanelDragOption - value={col} + value={col as DndItemValue} type={DndItemType.Column} /> ) : ( - <StyledColumnOption column={col} showType /> + <StyledColumnOption column={col as ColumnMeta} showType /> )} </LabelContainer> ))} @@ -425,28 +467,34 @@ export default function DataSourcePanel({ </div> </> ), + // eslint-disable-next-line react-hooks/exhaustive-deps [ columnSlice, inputValue, lists.columns.length, - lists.metrics.length, + lists?.metrics?.length, metricSlice, search, showAllColumns, showAllMetrics, + datasourceIsSaveable, shouldForceUpdate, ], ); return ( <DatasourceContainer> - <SaveDatasetModal - visible={showSaveDatasetModal} - onHide={() => setShowSaveDatasetModal(false)} - buttonTextOnSave={t('Save')} - buttonTextOnOverwrite={t('Overwrite')} - datasource={datasource} - /> + {datasourceIsSaveable && showSaveDatasetModal && ( + <SaveDatasetModal + visible={showSaveDatasetModal} + onHide={() => setShowSaveDatasetModal(false)} + buttonTextOnSave={t('Save')} + buttonTextOnOverwrite={t('Overwrite')} + datasource={getDatasourceAsSaveableDataset(datasource)} + openWindow={false} + formData={formData} + /> + )} <Control {...datasourceControl} name="datasource" actions={actions} /> {datasource.id != null && mainBody} </DatasourceContainer> diff --git a/superset-frontend/src/explore/components/ExploreAlert.tsx b/superset-frontend/src/explore/components/ExploreAlert.tsx index 34c4cf070e30..0602fc903501 100644 --- a/superset-frontend/src/explore/components/ExploreAlert.tsx +++ b/superset-frontend/src/explore/components/ExploreAlert.tsx @@ -28,7 +28,7 @@ interface ControlPanelAlertProps { secondaryButtonAction?: (e: React.MouseEvent) => void; primaryButtonText?: string; secondaryButtonText?: string; - type: 'info' | 'warning'; + type: 'info' | 'warning' | 'error'; className?: string; } @@ -85,6 +85,11 @@ const Title = styled.p` font-weight: ${({ theme }) => theme.typography.weights.bold}; `; +const typeChart = { + warning: 'warning', + danger: 'danger', +}; + export const ExploreAlert = forwardRef( ( { @@ -114,7 +119,7 @@ export const ExploreAlert = forwardRef( </Button> )} <Button - buttonStyle={type === 'warning' ? 'warning' : 'primary'} + buttonStyle={type in typeChart ? typeChart[type] : 'primary'} buttonSize="small" onClick={primaryButtonAction} > diff --git a/superset-frontend/src/explore/components/ExploreChartHeader/ExploreChartHeader.test.tsx b/superset-frontend/src/explore/components/ExploreChartHeader/ExploreChartHeader.test.tsx index 540a444ab047..3d9f6b995cc4 100644 --- a/superset-frontend/src/explore/components/ExploreChartHeader/ExploreChartHeader.test.tsx +++ b/superset-frontend/src/explore/components/ExploreChartHeader/ExploreChartHeader.test.tsx @@ -23,15 +23,21 @@ import { render, screen, waitFor } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; import fetchMock from 'fetch-mock'; import * as chartAction from 'src/components/Chart/chartAction'; +import * as saveModalActions from 'src/explore/actions/saveModalActions'; import * as downloadAsImage from 'src/utils/downloadAsImage'; import * as exploreUtils from 'src/explore/exploreUtils'; +import { FeatureFlag } from '@superset-ui/core'; import ExploreHeader from '.'; const chartEndpoint = 'glob:*api/v1/chart/*'; fetchMock.get(chartEndpoint, { json: 'foo' }); -const createProps = () => ({ +window.featureFlags = { + [FeatureFlag.EMBEDDABLE_CHARTS]: true, +}; + +const createProps = (additionalProps = {}) => ({ chart: { id: 1, latestQueryFormData: { @@ -58,7 +64,7 @@ const createProps = () => ({ changed_on: '2021-03-19T16:30:56.750230', changed_on_humanized: '7 days ago', datasource: 'FCC 2018 Survey', - description: null, + description: 'Simple description', description_markeddown: '', edit_url: '/chart/edit/318', form_data: { @@ -88,7 +94,7 @@ const createProps = () => ({ ], slice_id: 318, slice_name: 'Age distribution of respondents', - slice_url: '/superset/explore/?form_data=%7B%22slice_id%22%3A%20318%7D', + slice_url: '/explore/?form_data=%7B%22slice_id%22%3A%20318%7D', }, slice_name: 'Age distribution of respondents', actions: { @@ -101,10 +107,18 @@ const createProps = () => ({ user: { userId: 1, }, - onSaveChart: jest.fn(), + metadata: { + created_on_humanized: 'a week ago', + changed_on_humanized: '2 days ago', + owners: ['John Doe'], + created_by: 'John Doe', + changed_by: 'John Doe', + dashboards: [{ id: 1, dashboard_title: 'Test' }], + }, canOverwrite: false, canDownload: false, isStarred: false, + ...additionalProps, }); fetchMock.post( @@ -115,16 +129,19 @@ fetchMock.post( }, ); -test('Cancelling changes to the properties should reset previous properties', () => { +test('Cancelling changes to the properties should reset previous properties', async () => { const props = createProps(); render(<ExploreHeader {...props} />, { useRedux: true }); const newChartName = 'New chart name'; const prevChartName = props.slice_name; + expect( + await screen.findByText(/add the name of the chart/i), + ).toBeInTheDocument(); userEvent.click(screen.getByLabelText('Menu actions trigger')); userEvent.click(screen.getByText('Edit chart properties')); - const nameInput = screen.getByRole('textbox', { name: 'Name' }); + const nameInput = await screen.findByRole('textbox', { name: 'Name' }); userEvent.clear(nameInput); userEvent.type(nameInput, newChartName); @@ -136,31 +153,80 @@ test('Cancelling changes to the properties should reset previous properties', () userEvent.click(screen.getByLabelText('Menu actions trigger')); userEvent.click(screen.getByText('Edit chart properties')); - expect(screen.getByDisplayValue(prevChartName)).toBeInTheDocument(); + expect(await screen.findByDisplayValue(prevChartName)).toBeInTheDocument(); +}); + +test('renders the metadata bar when saved', async () => { + const props = createProps({ showTitlePanelItems: true }); + render(<ExploreHeader {...props} />, { useRedux: true }); + expect(await screen.findByText('Added to 1 dashboard')).toBeInTheDocument(); + expect(await screen.findByText('Simple description')).toBeInTheDocument(); + expect(await screen.findByText('John Doe')).toBeInTheDocument(); + expect(await screen.findByText('2 days ago')).toBeInTheDocument(); +}); + +test('Changes "Added to X dashboards" to plural when more than 1 dashboard', async () => { + const props = createProps({ showTitlePanelItems: true }); + render( + <ExploreHeader + {...props} + metadata={{ + ...props.metadata, + dashboards: [ + { id: 1, dashboard_title: 'Test' }, + { id: 2, dashboard_title: 'Test2' }, + ], + }} + />, + { useRedux: true }, + ); + expect(await screen.findByText('Added to 2 dashboards')).toBeInTheDocument(); }); -test('Save chart', () => { +test('does not render the metadata bar when not saved', async () => { + const props = createProps({ showTitlePanelItems: true, slice: null }); + render(<ExploreHeader {...props} />, { useRedux: true }); + await waitFor(() => + expect(screen.queryByText('Added to 1 dashboard')).not.toBeInTheDocument(), + ); +}); + +test('Save chart', async () => { + const setSaveChartModalVisibility = jest.spyOn( + saveModalActions, + 'setSaveChartModalVisibility', + ); const props = createProps(); render(<ExploreHeader {...props} />, { useRedux: true }); + expect(await screen.findByText('Save')).toBeInTheDocument(); userEvent.click(screen.getByText('Save')); - expect(props.onSaveChart).toHaveBeenCalled(); + expect(setSaveChartModalVisibility).toHaveBeenCalledWith(true); + setSaveChartModalVisibility.mockClear(); }); -test('Save disabled', () => { +test('Save disabled', async () => { + const setSaveChartModalVisibility = jest.spyOn( + saveModalActions, + 'setSaveChartModalVisibility', + ); const props = createProps(); render(<ExploreHeader {...props} saveDisabled />, { useRedux: true }); + expect(await screen.findByText('Save')).toBeInTheDocument(); userEvent.click(screen.getByText('Save')); - expect(props.onSaveChart).not.toHaveBeenCalled(); + expect(setSaveChartModalVisibility).not.toHaveBeenCalled(); + setSaveChartModalVisibility.mockClear(); }); describe('Additional actions tests', () => { - test('Should render a button', () => { + test('Should render a button', async () => { const props = createProps(); render(<ExploreHeader {...props} />, { useRedux: true }); - expect(screen.getByLabelText('Menu actions trigger')).toBeInTheDocument(); + expect( + await screen.findByLabelText('Menu actions trigger'), + ).toBeInTheDocument(); }); - test('Should open a menu', () => { + test('Should open a menu', async () => { const props = createProps(); render(<ExploreHeader {...props} />, { useRedux: true, @@ -168,7 +234,9 @@ describe('Additional actions tests', () => { userEvent.click(screen.getByLabelText('Menu actions trigger')); - expect(screen.getByText('Edit chart properties')).toBeInTheDocument(); + expect( + await screen.findByText('Edit chart properties'), + ).toBeInTheDocument(); expect(screen.getByText('Download')).toBeInTheDocument(); expect(screen.getByText('Share')).toBeInTheDocument(); expect(screen.getByText('View query')).toBeInTheDocument(); @@ -252,11 +320,12 @@ describe('Additional actions tests', () => { await waitFor(() => expect(getChartDataRequest).toBeCalledTimes(1)); }); - test('Should call onOpenInEditor when click on "Run in SQL Lab"', () => { + test('Should call onOpenInEditor when click on "Run in SQL Lab"', async () => { const props = createProps(); render(<ExploreHeader {...props} />, { useRedux: true, }); + expect(await screen.findByText('Save')).toBeInTheDocument(); expect(props.actions.redirectSQLLab).toBeCalledTimes(0); userEvent.click(screen.getByLabelText('Menu actions trigger')); @@ -278,6 +347,7 @@ describe('Additional actions tests', () => { spyDownloadAsImage.restore(); spyExportChart.restore(); }); + test('Should call downloadAsImage when click on "Download as image"', async () => { const props = createProps(); const spy = jest.spyOn(downloadAsImage, 'default'); diff --git a/superset-frontend/src/explore/components/ExploreChartHeader/index.jsx b/superset-frontend/src/explore/components/ExploreChartHeader/index.jsx index fb85882f0233..958aa16a3199 100644 --- a/superset-frontend/src/explore/components/ExploreChartHeader/index.jsx +++ b/superset-frontend/src/explore/components/ExploreChartHeader/index.jsx @@ -16,18 +16,18 @@ * specific language governing permissions and limitations * under the License. */ -import React, { useEffect, useState } from 'react'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { useDispatch } from 'react-redux'; import PropTypes from 'prop-types'; import { Tooltip } from 'src/components/Tooltip'; import { CategoricalColorNamespace, css, + logging, SupersetClient, t, + tn, } from '@superset-ui/core'; -import { toggleActive, deleteActiveReport } from 'src/reports/actions/reports'; import { chartPropShape } from 'src/dashboard/util/propShapes'; import AlteredSliceTag from 'src/components/AlteredSliceTag'; import Button from 'src/components/Button'; @@ -35,6 +35,8 @@ import Icons from 'src/components/Icons'; import PropertiesModal from 'src/explore/components/PropertiesModal'; import { sliceUpdated } from 'src/explore/actions/exploreActions'; import { PageHeaderWithActions } from 'src/components/PageHeaderWithActions'; +import MetadataBar, { MetadataType } from 'src/components/MetadataBar'; +import { setSaveChartModalVisibility } from 'src/explore/actions/saveModalActions'; import { useExploreAdditionalActionsMenu } from '../useExploreAdditionalActionsMenu'; const propTypes = { @@ -60,6 +62,15 @@ const saveButtonStyles = theme => css` } `; +const additionalItemsStyles = theme => css` + display: flex; + align-items: center; + margin-left: ${theme.gridUnit}px; + & > span { + margin-right: ${theme.gridUnit * 3}px; + } +`; + export const ExploreChartHeader = ({ dashboardId, slice, @@ -71,57 +82,54 @@ export const ExploreChartHeader = ({ canOverwrite, canDownload, isStarred, - sliceUpdated, sliceName, - onSaveChart, saveDisabled, + metadata, }) => { + const dispatch = useDispatch(); const { latestQueryFormData, sliceFormData } = chart; const [isPropertiesModalOpen, setIsPropertiesModalOpen] = useState(false); - const fetchChartDashboardData = async () => { - await SupersetClient.get({ - endpoint: `/api/v1/chart/${slice.slice_id}`, - }) - .then(res => { - const response = res?.json?.result; - if (response && response.dashboards && response.dashboards.length) { - const { dashboards } = response; - const dashboard = - dashboardId && - dashboards.length && - dashboards.find(d => d.id === dashboardId); - - if (dashboard && dashboard.json_metadata) { - // setting the chart to use the dashboard custom label colors if any - const metadata = JSON.parse(dashboard.json_metadata); - const sharedLabelColors = metadata.shared_label_colors || {}; - const customLabelColors = metadata.label_colors || {}; - const mergedLabelColors = { - ...sharedLabelColors, - ...customLabelColors, - }; - - const categoricalNamespace = - CategoricalColorNamespace.getNamespace(); - - Object.keys(mergedLabelColors).forEach(label => { - categoricalNamespace.setColor( - label, - mergedLabelColors[label], - metadata.color_scheme, - ); - }); - } - } - }) - .catch(() => {}); + const updateCategoricalNamespace = async () => { + const { dashboards } = metadata || {}; + const dashboard = + dashboardId && dashboards && dashboards.find(d => d.id === dashboardId); + + if (dashboard) { + try { + // Dashboards from metadata don't contain the json_metadata field + // to avoid unnecessary payload. Here we query for the dashboard json_metadata. + const response = await SupersetClient.get({ + endpoint: `/api/v1/dashboard/${dashboard.id}`, + }); + const result = response?.json?.result; + + // setting the chart to use the dashboard custom label colors if any + const metadata = JSON.parse(result.json_metadata); + const sharedLabelColors = metadata.shared_label_colors || {}; + const customLabelColors = metadata.label_colors || {}; + const mergedLabelColors = { + ...sharedLabelColors, + ...customLabelColors, + }; + + const categoricalNamespace = CategoricalColorNamespace.getNamespace(); + + Object.keys(mergedLabelColors).forEach(label => { + categoricalNamespace.setColor( + label, + mergedLabelColors[label], + metadata.color_scheme, + ); + }); + } catch (error) { + logging.info(t('Unable to retrieve dashboard colors')); + } + } }; useEffect(() => { - if (dashboardId) { - fetchChartDashboardData(); - } + if (dashboardId) updateCategoricalNamespace(); }, []); const openPropertiesModal = () => { @@ -132,6 +140,17 @@ export const ExploreChartHeader = ({ setIsPropertiesModalOpen(false); }; + const showModal = useCallback(() => { + dispatch(setSaveChartModalVisibility(true)); + }, [dispatch]); + + const updateSlice = useCallback( + slice => { + dispatch(sliceUpdated(slice)); + }, + [dispatch], + ); + const [menu, isDropdownVisible, setIsDropdownVisible] = useExploreAdditionalActionsMenu( latestQueryFormData, @@ -140,8 +159,52 @@ export const ExploreChartHeader = ({ actions.redirectSQLLab, openPropertiesModal, ownState, + metadata?.dashboards, ); + const metadataBar = useMemo(() => { + if (!metadata) { + return null; + } + const items = []; + items.push({ + type: MetadataType.DASHBOARDS, + title: + metadata.dashboards.length > 0 + ? tn( + 'Added to 1 dashboard', + 'Added to %s dashboards', + metadata.dashboards.length, + metadata.dashboards.length, + ) + : t('Not added to any dashboard'), + description: + metadata.dashboards.length > 0 + ? t( + 'You can preview the list of dashboards in the chart settings dropdown.', + ) + : undefined, + }); + items.push({ + type: MetadataType.LAST_MODIFIED, + value: metadata.changed_on_humanized, + modifiedBy: metadata.changed_by || t('Not available'), + }); + items.push({ + type: MetadataType.OWNER, + createdBy: metadata.created_by || t('Not available'), + owners: metadata.owners.length > 0 ? metadata.owners : t('None'), + createdOn: metadata.created_on_humanized, + }); + if (slice?.description) { + items.push({ + type: MetadataType.DESCRIPTION, + value: slice?.description, + }); + } + return <MetadataBar items={items} tooltipPlacement="bottom" />; + }, [metadata, slice?.description]); + const oldSliceName = slice?.slice_name; return ( <> @@ -170,16 +233,19 @@ export const ExploreChartHeader = ({ showTooltip: true, }} titlePanelAdditionalItems={ - sliceFormData ? ( - <AlteredSliceTag - className="altered" - origFormData={{ - ...sliceFormData, - chartTitle: oldSliceName, - }} - currentFormData={{ ...formData, chartTitle: sliceName }} - /> - ) : null + <div css={additionalItemsStyles}> + {sliceFormData ? ( + <AlteredSliceTag + className="altered" + origFormData={{ + ...sliceFormData, + chartTitle: oldSliceName, + }} + currentFormData={{ ...formData, chartTitle: sliceName }} + /> + ) : null} + {metadataBar} + </div> } rightPanelAdditionalItems={ <Tooltip @@ -193,7 +259,7 @@ export const ExploreChartHeader = ({ <div> <Button buttonStyle="secondary" - onClick={onSaveChart} + onClick={showModal} disabled={saveDisabled} data-test="query-save-button" css={saveButtonStyles} @@ -214,7 +280,7 @@ export const ExploreChartHeader = ({ <PropertiesModal show={isPropertiesModalOpen} onHide={closePropertiesModal} - onSave={sliceUpdated} + onSave={updateSlice} slice={slice} /> )} @@ -224,11 +290,4 @@ export const ExploreChartHeader = ({ ExploreChartHeader.propTypes = propTypes; -function mapDispatchToProps(dispatch) { - return bindActionCreators( - { sliceUpdated, toggleActive, deleteActiveReport }, - dispatch, - ); -} - -export default connect(null, mapDispatchToProps)(ExploreChartHeader); +export default ExploreChartHeader; diff --git a/superset-frontend/src/explore/components/ExploreChartPanel.jsx b/superset-frontend/src/explore/components/ExploreChartPanel.jsx index cfb60f64878c..fe23251b8d1b 100644 --- a/superset-frontend/src/explore/components/ExploreChartPanel.jsx +++ b/superset-frontend/src/explore/components/ExploreChartPanel.jsx @@ -26,15 +26,21 @@ import { SupersetClient, t, useTheme, + getChartMetadataRegistry, + DatasourceType, } from '@superset-ui/core'; import { useResizeDetector } from 'react-resize-detector'; import { chartPropShape } from 'src/dashboard/util/propShapes'; import ChartContainer from 'src/components/Chart/ChartContainer'; +import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; import { getItem, setItem, LocalStorageKeys, } from 'src/utils/localStorageHelpers'; +import Alert from 'src/components/Alert'; +import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; +import { getDatasourceAsSaveableDataset } from 'src/utils/datasourceUtils'; import { DataTablesPane } from './DataTablesPane'; import { buildV1ChartDataPayload } from '../exploreUtils'; import { ChartPills } from './ChartPills'; @@ -57,7 +63,7 @@ const propTypes = { vizType: PropTypes.string.isRequired, form_data: PropTypes.object, ownState: PropTypes.object, - standalone: PropTypes.number, + standalone: PropTypes.bool, force: PropTypes.bool, timeout: PropTypes.number, chartIsStale: PropTypes.bool, @@ -93,6 +99,7 @@ const Styles = styled.div` } .gutter.gutter-vertical { + display: ${({ showSplite }) => (showSplite ? 'block' : 'none')}; cursor: row-resize; } @@ -142,12 +149,27 @@ const ExploreChartPanel = ({ refreshRate: 300, }); const [splitSizes, setSplitSizes] = useState( - getItem(LocalStorageKeys.chart_split_sizes, INITIAL_SIZES), + isFeatureEnabled(FeatureFlag.DATAPANEL_CLOSED_BY_DEFAULT) + ? INITIAL_SIZES + : getItem(LocalStorageKeys.chart_split_sizes, INITIAL_SIZES), ); + const [showSplite, setShowSplit] = useState( + isFeatureEnabled(FeatureFlag.DATAPANEL_CLOSED_BY_DEFAULT) + ? false + : getItem(LocalStorageKeys.is_datapanel_open, false), + ); + + const [showDatasetModal, setShowDatasetModal] = useState(false); + const metaDataRegistry = getChartMetadataRegistry(); + const { useLegacyApi } = metaDataRegistry.get(vizType) ?? {}; + const vizTypeNeedsDataset = + useLegacyApi && datasource.type !== DatasourceType.Table; + // added boolean column to below show boolean so that the errors aren't overlapping const showAlertBanner = !chartAlert && chartIsStale && + !vizTypeNeedsDataset && chart.chartStatus !== 'failed' && ensureIsArray(chart.queriesResponse).length > 0; @@ -212,6 +234,7 @@ const ExploreChartPanel = ({ ]; } setSplitSizes(splitSizes); + setShowSplit(isOpen); }, []); const renderChart = useCallback( @@ -286,6 +309,31 @@ const ExploreChartPanel = ({ flex-direction: column; `} > + {vizTypeNeedsDataset && ( + <Alert + message={t('Chart type requires a dataset')} + type="error" + css={theme => css` + margin: 0 0 ${theme.gridUnit * 4}px 0; + `} + description={ + <> + {t( + 'This chart type is not supported when using an unsaved query as a chart source. ', + )} + <span + role="button" + tabIndex={0} + onClick={() => setShowDatasetModal(true)} + css={{ textDecoration: 'underline' }} + > + {t('Create a dataset')} + </span> + {t(' to visualize your data.')} + </> + } + /> + )} {showAlertBanner && ( <ExploreAlert title={ @@ -363,7 +411,7 @@ const ExploreChartPanel = ({ ); if (standalone) { - // dom manipulation hack to get rid of the boostrap theme's body background + // dom manipulation hack to get rid of the bootstrap theme's body background const standaloneClass = 'background-transparent'; const bodyClasses = document.body.className.split(' '); if (!bodyClasses.includes(standaloneClass)) { @@ -373,7 +421,10 @@ const ExploreChartPanel = ({ } return ( - <Styles className="panel panel-default chart-container"> + <Styles + className="panel panel-default chart-container" + showSplite={showSplite} + > {vizType === 'filter_box' ? ( panelBody ) : ( @@ -399,6 +450,17 @@ const ExploreChartPanel = ({ /> </Split> )} + {showDatasetModal && ( + <SaveDatasetModal + visible={showDatasetModal} + onHide={() => setShowDatasetModal(false)} + buttonTextOnSave={t('Save')} + buttonTextOnOverwrite={t('Overwrite')} + datasource={getDatasourceAsSaveableDataset(datasource)} + openWindow={false} + formData={formData} + /> + )} </Styles> ); }; diff --git a/superset-frontend/src/explore/components/ExploreChartPanel.test.jsx b/superset-frontend/src/explore/components/ExploreChartPanel.test.jsx index 557b2149e01e..63e139e755d8 100644 --- a/superset-frontend/src/explore/components/ExploreChartPanel.test.jsx +++ b/superset-frontend/src/explore/components/ExploreChartPanel.test.jsx @@ -18,8 +18,10 @@ */ import React from 'react'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'spec/helpers/testing-library'; +import { render, screen, within } from 'spec/helpers/testing-library'; +import { getChartMetadataRegistry, ChartMetadata } from '@superset-ui/core'; import ChartContainer from 'src/explore/components/ExploreChartPanel'; +import { setItem, LocalStorageKeys } from 'src/utils/localStorageHelpers'; const createProps = (overrides = {}) => ({ sliceName: 'Trend Line', @@ -57,42 +59,54 @@ const createProps = (overrides = {}) => ({ }); describe('ChartContainer', () => { - it('renders when vizType is line', () => { + test('renders when vizType is line', () => { const props = createProps(); expect(React.isValidElement(<ChartContainer {...props} />)).toBe(true); }); - it('renders with alert banner', () => { + test('renders with alert banner', async () => { const props = createProps({ chartIsStale: true, chart: { chartStatus: 'rendered', queriesResponse: [{}] }, }); + getChartMetadataRegistry().registerValue( + 'histogram', + new ChartMetadata({ + name: 'fake table', + thumbnail: '.png', + useLegacyApi: false, + }), + ); render(<ChartContainer {...props} />, { useRedux: true }); - expect(screen.getByText('Your chart is not up to date')).toBeVisible(); + expect( + await screen.findByText('Your chart is not up to date'), + ).toBeVisible(); }); - it('doesnt render alert banner when no changes in control panel were made (chart is not stale)', () => { + test('doesnt render alert banner when no changes in control panel were made (chart is not stale)', async () => { const props = createProps({ chartIsStale: false, }); render(<ChartContainer {...props} />, { useRedux: true }); + expect(await screen.findByText(/cached/i)).toBeInTheDocument(); expect( screen.queryByText('Your chart is not up to date'), ).not.toBeInTheDocument(); }); - it('doesnt render alert banner when chart not created yet (no queries response)', () => { + test('doesnt render alert banner when chart not created yet (no queries response)', async () => { const props = createProps({ chartIsStale: true, chart: { queriesResponse: [] }, }); render(<ChartContainer {...props} />, { useRedux: true }); + expect(await screen.findByRole('timer')).toBeInTheDocument(); expect( screen.queryByText('Your chart is not up to date'), ).not.toBeInTheDocument(); }); - it('renders prompt to fill required controls when required control removed', () => { + test('renders prompt to fill required controls when required control removed', async () => { const props = createProps({ chartIsStale: true, chart: { chartStatus: 'rendered', queriesResponse: [{}] }, @@ -100,11 +114,11 @@ describe('ChartContainer', () => { }); render(<ChartContainer {...props} />, { useRedux: true }); expect( - screen.getByText('Required control values have been removed'), + await screen.findByText('Required control values have been removed'), ).toBeVisible(); }); - it('should render cached button and call expected actions', () => { + test('should render cached button and call expected actions', async () => { const setForceQuery = jest.fn(); const postChartFormData = jest.fn(); const updateQueryFormData = jest.fn(); @@ -117,7 +131,7 @@ describe('ChartContainer', () => { }); render(<ChartContainer {...props} />, { useRedux: true }); - const cached = screen.queryByText('Cached'); + const cached = await screen.findByText('Cached'); expect(cached).toBeInTheDocument(); userEvent.click(cached); @@ -126,7 +140,7 @@ describe('ChartContainer', () => { expect(updateQueryFormData).toHaveBeenCalledTimes(1); }); - it('should hide cached button', () => { + test('should hide cached button', async () => { const props = createProps({ chart: { chartStatus: 'rendered', @@ -134,6 +148,24 @@ describe('ChartContainer', () => { }, }); render(<ChartContainer {...props} />, { useRedux: true }); - expect(screen.queryByText('Cached')).not.toBeInTheDocument(); + expect(await screen.findByRole('timer')).toBeInTheDocument(); + expect(screen.queryByText(/cached/i)).not.toBeInTheDocument(); + }); + + it('hides gutter when collapsing data panel', async () => { + const props = createProps(); + setItem(LocalStorageKeys.is_datapanel_open, true); + const { container } = render(<ChartContainer {...props} />, { + useRedux: true, + }); + const tabpanel = screen.getByRole('tabpanel', { name: /results/i }); + expect(await within(tabpanel).findByText(/0 rows/i)).toBeInTheDocument(); + + const gutter = container.querySelector('.gutter'); + expect(gutter).toBeVisible(); + + userEvent.click(screen.getByLabelText('Collapse data panel')); + expect(await screen.findByRole('timer')).toBeInTheDocument(); + expect(gutter).not.toBeVisible(); }); }); diff --git a/superset-frontend/src/explore/components/ExploreViewContainer/ExploreViewContainer.test.tsx b/superset-frontend/src/explore/components/ExploreViewContainer/ExploreViewContainer.test.tsx index 2260346968dd..a4ad59438743 100644 --- a/superset-frontend/src/explore/components/ExploreViewContainer/ExploreViewContainer.test.tsx +++ b/superset-frontend/src/explore/components/ExploreViewContainer/ExploreViewContainer.test.tsx @@ -18,7 +18,11 @@ */ import React from 'react'; import fetchMock from 'fetch-mock'; -import { getChartControlPanelRegistry } from '@superset-ui/core'; +import { + getChartControlPanelRegistry, + getChartMetadataRegistry, + ChartMetadata, +} from '@superset-ui/core'; import { MemoryRouter, Route } from 'react-router-dom'; import { render, screen, waitFor } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; @@ -26,7 +30,6 @@ import ExploreViewContainer from '.'; const reduxState = { explore: { - common: { conf: { SUPERSET_WEBSERVER_TIMEOUT: 60 } }, controls: { datasource: { value: '1__table' }, viz_type: { value: 'table' }, @@ -37,10 +40,18 @@ const reduxState = { columns: [{ is_dttm: false }], metrics: [{ id: 1, metric_name: 'count' }], }, - user: { - userId: 1, - }, isStarred: false, + slice: { + slice_id: 1, + }, + metadata: { + created_on_humanized: 'a week ago', + changed_on_humanized: '2 days ago', + owners: ['John Doe'], + created_by: 'John Doe', + changed_by: 'John Doe', + dashboards: [{ id: 1, dashboard_title: 'Test' }], + }, }, charts: { 1: { @@ -50,9 +61,22 @@ const reduxState = { }, }, }, + user: { + userId: 1, + }, + common: { conf: { SUPERSET_WEBSERVER_TIMEOUT: 60 } }, + datasources: { + '1__table': { + id: 1, + type: 'table', + columns: [{ is_dttm: false }], + metrics: [{ id: 1, metric_name: 'count' }], + }, + }, }; -const key = 'aWrs7w29sd'; +const KEY = 'aWrs7w29sd'; +const SEARCH = `?form_data_key=${KEY}&dataset_id=1`; jest.mock('react-resize-detector', () => ({ __esModule: true, @@ -64,13 +88,25 @@ jest.mock('lodash/debounce', () => ({ default: (fuc: Function) => fuc, })); -fetchMock.post('glob:*/api/v1/explore/form_data*', { key }); -fetchMock.put('glob:*/api/v1/explore/form_data*', { key }); +fetchMock.post('glob:*/api/v1/explore/form_data*', { key: KEY }); +fetchMock.put('glob:*/api/v1/explore/form_data*', { key: KEY }); fetchMock.get('glob:*/api/v1/explore/form_data*', {}); +fetchMock.get('glob:*/favstar/slice*', { count: 0 }); -const renderWithRouter = (withKey?: boolean) => { - const path = '/superset/explore/'; - const search = withKey ? `?form_data_key=${key}&dataset_id=1` : ''; +const defaultPath = '/explore/'; +const renderWithRouter = ({ + search = '', + overridePathname, +}: { + search?: string; + overridePathname?: string; +} = {}) => { + const path = overridePathname ?? defaultPath; + Object.defineProperty(window, 'location', { + get() { + return { pathname: path, search }; + }, + }); return render( <MemoryRouter initialEntries={[`${path}${search}`]}> <Route path={path}> @@ -82,6 +118,14 @@ const renderWithRouter = (withKey?: boolean) => { }; test('generates a new form_data param when none is available', async () => { + getChartMetadataRegistry().registerValue( + 'table', + new ChartMetadata({ + name: 'fake table', + thumbnail: '.png', + useLegacyApi: false, + }), + ); const replaceState = jest.spyOn(window.history, 'replaceState'); await waitFor(() => renderWithRouter()); expect(replaceState).toHaveBeenCalledWith( @@ -99,12 +143,12 @@ test('generates a new form_data param when none is available', async () => { test('generates a different form_data param when one is provided and is mounting', async () => { const replaceState = jest.spyOn(window.history, 'replaceState'); - await waitFor(() => renderWithRouter(true)); + await waitFor(() => renderWithRouter({ search: SEARCH })); expect(replaceState).not.toHaveBeenLastCalledWith( 0, expect.anything(), undefined, - expect.stringMatching(key), + expect.stringMatching(KEY), ); expect(replaceState).toHaveBeenCalledWith( expect.anything(), @@ -120,7 +164,7 @@ test('reuses the same form_data param when updating', async () => { }); const replaceState = jest.spyOn(window.history, 'replaceState'); const pushState = jest.spyOn(window.history, 'pushState'); - await waitFor(() => renderWithRouter()); + await waitFor(() => renderWithRouter({ search: SEARCH })); expect(replaceState.mock.calls.length).toBe(1); userEvent.click(screen.getByText('Update chart')); await waitFor(() => expect(pushState.mock.calls.length).toBe(1)); @@ -129,3 +173,32 @@ test('reuses the same form_data param when updating', async () => { pushState.mockRestore(); getChartControlPanelRegistry().remove('table'); }); + +test('doesnt call replaceState when pathname is not /explore', async () => { + getChartMetadataRegistry().registerValue( + 'table', + new ChartMetadata({ + name: 'fake table', + thumbnail: '.png', + useLegacyApi: false, + }), + ); + const replaceState = jest.spyOn(window.history, 'replaceState'); + await waitFor(() => renderWithRouter({ overridePathname: '/dashboard' })); + expect(replaceState).not.toHaveBeenCalled(); + replaceState.mockRestore(); +}); + +test('preserves unknown parameters', async () => { + const replaceState = jest.spyOn(window.history, 'replaceState'); + const unknownParam = 'test=123'; + await waitFor(() => + renderWithRouter({ search: `${SEARCH}&${unknownParam}` }), + ); + expect(replaceState).toHaveBeenCalledWith( + expect.anything(), + undefined, + expect.stringMatching(unknownParam), + ); + replaceState.mockRestore(); +}); diff --git a/superset-frontend/src/explore/components/ExploreViewContainer/index.jsx b/superset-frontend/src/explore/components/ExploreViewContainer/index.jsx index 9f33e9df824d..66eed14a6ca5 100644 --- a/superset-frontend/src/explore/components/ExploreViewContainer/index.jsx +++ b/superset-frontend/src/explore/components/ExploreViewContainer/index.jsx @@ -37,6 +37,12 @@ import { LocalStorageKeys, } from 'src/utils/localStorageHelpers'; import { RESERVED_CHART_URL_PARAMS, URL_PARAMS } from 'src/constants'; +import { areObjectsEqual } from 'src/reduxUtils'; +import * as logActions from 'src/logger/actions'; +import { + LOG_ACTIONS_MOUNT_EXPLORER, + LOG_ACTIONS_CHANGE_EXPLORE_CONTROLS, +} from 'src/logger/LogUtils'; import { getUrlParam } from 'src/utils/urlUtils'; import cx from 'classnames'; import * as chartActions from 'src/components/Chart/chartAction'; @@ -44,21 +50,17 @@ import { fetchDatasourceMetadata } from 'src/dashboard/actions/datasources'; import { chartPropShape } from 'src/dashboard/util/propShapes'; import { mergeExtraFormData } from 'src/dashboard/components/nativeFilters/utils'; import { postFormData, putFormData } from 'src/explore/exploreUtils/formData'; +import { datasourcesActions } from 'src/explore/actions/datasourcesActions'; +import { mountExploreUrl } from 'src/explore/exploreUtils'; +import { getFormDataFromControls } from 'src/explore/controlUtils'; +import * as exploreActions from 'src/explore/actions/exploreActions'; +import * as saveModalActions from 'src/explore/actions/saveModalActions'; import { useTabId } from 'src/hooks/useTabId'; +import withToasts from 'src/components/MessageToasts/withToasts'; import ExploreChartPanel from '../ExploreChartPanel'; import ConnectedControlPanelsContainer from '../ControlPanelsContainer'; import SaveModal from '../SaveModal'; import DataSourcePanel from '../DatasourcePanel'; -import { mountExploreUrl } from '../../exploreUtils'; -import { areObjectsEqual } from '../../../reduxUtils'; -import { getFormDataFromControls } from '../../controlUtils'; -import * as exploreActions from '../../actions/exploreActions'; -import * as saveModalActions from '../../actions/saveModalActions'; -import * as logActions from '../../../logger/actions'; -import { - LOG_ACTIONS_MOUNT_EXPLORER, - LOG_ACTIONS_CHANGE_EXPLORE_CONTROLS, -} from '../../../logger/LogUtils'; import ConnectedExploreChartHeader from '../ExploreChartHeader'; const propTypes = { @@ -73,17 +75,20 @@ const propTypes = { controls: PropTypes.object.isRequired, forcedHeight: PropTypes.string, form_data: PropTypes.object.isRequired, - standalone: PropTypes.number.isRequired, + standalone: PropTypes.bool.isRequired, force: PropTypes.bool, timeout: PropTypes.number, impressionId: PropTypes.string, vizType: PropTypes.string, + saveAction: PropTypes.string, + isSaveModalVisible: PropTypes.bool, }; const ExploreContainer = styled.div` display: flex; flex-direction: column; height: 100%; + min-height: 0; `; const ExplorePanelContainer = styled.div` @@ -126,10 +131,10 @@ const ExplorePanelContainer = styled.div` position: relative; display: flex; flex-direction: row; - padding: 0 ${theme.gridUnit * 4}px; + padding: 0 ${theme.gridUnit * 2}px 0 ${theme.gridUnit * 4}px; justify-content: space-between; .horizontal-text { - font-size: ${theme.typography.sizes.s}px; + font-size: ${theme.typography.sizes.m}px; } } .no-show { @@ -145,7 +150,7 @@ const ExplorePanelContainer = styled.div` padding: ${theme.gridUnit * 2}px; width: ${theme.gridUnit * 8}px; } - .callpase-icon > svg { + .collapse-icon > svg { color: ${theme.colors.primary.base}; } `}; @@ -164,7 +169,9 @@ const updateHistory = debounce( ) => { const payload = { ...formData }; const chartId = formData.slice_id; - const additionalParam = {}; + const params = new URLSearchParams(window.location.search); + const additionalParam = Object.fromEntries(params); + if (chartId) { additionalParam[URL_PARAMS.sliceId.name] = chartId; } else { @@ -203,15 +210,18 @@ const updateHistory = debounce( ); stateModifier = 'pushState'; } - const url = mountExploreUrl( - standalone ? URL_PARAMS.standalone.name : null, - { - [URL_PARAMS.formDataKey.name]: key, - ...additionalParam, - }, - force, - ); - window.history[stateModifier](payload, title, url); + // avoid race condition in case user changes route before explore updates the url + if (window.location.pathname.startsWith('/explore')) { + const url = mountExploreUrl( + standalone ? URL_PARAMS.standalone.name : null, + { + [URL_PARAMS.formDataKey.name]: key, + ...additionalParam, + }, + force, + ); + window.history[stateModifier](payload, title, url); + } } catch (e) { logging.warn('Failed at altering browser history', e); } @@ -232,7 +242,6 @@ function ExploreViewContainer(props) { props.controls, ); - const [showingModal, setShowingModal] = useState(false); const [isCollapsed, setIsCollapsed] = useState(false); const [shouldForceUpdate, setShouldForceUpdate] = useState(-1); const tabId = useTabId(); @@ -330,10 +339,6 @@ function ExploreViewContainer(props) { } } - function toggleModal() { - setShowingModal(!showingModal); - } - function toggleCollapse() { setIsCollapsed(!isCollapsed); } @@ -450,6 +455,7 @@ function ExploreViewContainer(props) { !areObjectsEqual( props.controls[key].value, lastQueriedControls[key].value, + { ignoreFields: ['datasourceWarning'] }, ), ); @@ -462,6 +468,14 @@ function ExploreViewContainer(props) { return false; }, [lastQueriedControls, props.controls]); + useChangeEffect(props.saveAction, () => { + if (['saveas', 'overwrite'].includes(props.saveAction)) { + onQuery(); + addHistory({ isReplace: true }); + props.actions.setSaveAction(null); + } + }); + useEffect(() => { if (props.ownState !== undefined) { onQuery(); @@ -549,8 +563,8 @@ function ExploreViewContainer(props) { ownState={props.ownState} user={props.user} reports={props.reports} - onSaveChart={toggleModal} saveDisabled={errorMessage || props.chart.chartStatus === 'loading'} + metadata={props.metadata} /> <ExplorePanelContainer id="explore-container"> <Global @@ -577,15 +591,6 @@ function ExploreViewContainer(props) { } `} /> - {showingModal && ( - <SaveModal - onHide={toggleModal} - actions={props.actions} - form_data={props.form_data} - sliceName={props.sliceName} - dashboardId={props.dashboardId} - /> - )} <Resizable onResizeStop={(evt, direction, ref, d) => { setShouldForceUpdate(d?.width); @@ -603,7 +608,7 @@ function ExploreViewContainer(props) { } > <div className="title-container"> - <span className="horizontal-text">{t('Dataset')}</span> + <span className="horizontal-text">{t('Chart Source')}</span> <span role="button" tabIndex={0} @@ -618,6 +623,7 @@ function ExploreViewContainer(props) { </span> </div> <DataSourcePanel + formData={props.form_data} datasource={props.datasource} controls={props.controls} actions={props.actions} @@ -642,11 +648,6 @@ function ExploreViewContainer(props) { /> </Tooltip> </span> - <Icons.DatasetPhysical - css={{ marginTop: theme.gridUnit * 2 }} - iconSize="l" - iconColor={theme.colors.grayscale.base} - /> </div> ) : null} <Resizable @@ -686,6 +687,15 @@ function ExploreViewContainer(props) { {renderChartContainer()} </div> </ExplorePanelContainer> + {props.isSaveModalVisible && ( + <SaveModal + addDangerToast={props.addDangerToast} + actions={props.actions} + form_data={props.form_data} + sliceName={props.sliceName} + dashboardId={props.dashboardId} + /> + )} </ExploreContainer> ); } @@ -693,16 +703,26 @@ function ExploreViewContainer(props) { ExploreViewContainer.propTypes = propTypes; function mapStateToProps(state) { - const { explore, charts, impressionId, dataMask, reports } = state; - const form_data = getFormDataFromControls(explore.controls); + const { + explore, + charts, + common, + impressionId, + dataMask, + reports, + user, + saveModal, + } = state; + const { controls, slice, datasource, metadata } = explore; + const form_data = getFormDataFromControls(controls); + const slice_id = form_data.slice_id ?? slice?.slice_id ?? 0; // 0 - unsaved chart form_data.extra_form_data = mergeExtraFormData( { ...form_data.extra_form_data }, { - ...dataMask[form_data.slice_id ?? 0]?.ownState, // 0 - unsaved chart + ...dataMask[slice_id]?.ownState, }, ); - const chartKey = Object.keys(charts)[0]; - const chart = charts[chartKey]; + const chart = charts[slice_id]; let dashboardId = Number(explore.form_data?.dashboardId); if (Number.isNaN(dashboardId)) { @@ -711,43 +731,44 @@ function mapStateToProps(state) { return { isDatasourceMetaLoading: explore.isDatasourceMetaLoading, - datasource: explore.datasource, - datasource_type: explore.datasource.type, - datasourceId: explore.datasource_id, + datasource, + datasource_type: datasource.type, + datasourceId: datasource.datasource_id, dashboardId, controls: explore.controls, - can_overwrite: !!explore.can_overwrite, can_add: !!explore.can_add, can_download: !!explore.can_download, - column_formats: explore.datasource - ? explore.datasource.column_formats - : null, - containerId: explore.slice - ? `slice-container-${explore.slice.slice_id}` + can_overwrite: !!explore.can_overwrite, + column_formats: datasource?.column_formats ?? null, + containerId: slice + ? `slice-container-${slice.slice_id}` : 'slice-container', isStarred: explore.isStarred, - slice: explore.slice, - sliceName: explore.sliceName, + slice, + sliceName: explore.sliceName ?? slice?.slice_name ?? null, triggerRender: explore.triggerRender, form_data, - table_name: form_data.datasource_name, + table_name: datasource.table_name, vizType: form_data.viz_type, - standalone: explore.standalone, - force: explore.force, - forcedHeight: explore.forced_height, + standalone: !!explore.standalone, + force: !!explore.force, chart, - timeout: explore.common.conf.SUPERSET_WEBSERVER_TIMEOUT, - ownState: dataMask[form_data.slice_id ?? 0]?.ownState, // 0 - unsaved chart + timeout: common.conf.SUPERSET_WEBSERVER_TIMEOUT, + ownState: dataMask[slice_id]?.ownState, impressionId, - user: explore.user, + user, exploreState: explore, reports, + metadata, + saveAction: explore.saveAction, + isSaveModalVisible: saveModal.isVisible, }; } function mapDispatchToProps(dispatch) { const actions = { ...exploreActions, + ...datasourcesActions, ...saveModalActions, ...chartActions, ...logActions, @@ -760,4 +781,4 @@ function mapDispatchToProps(dispatch) { export default connect( mapStateToProps, mapDispatchToProps, -)(ExploreViewContainer); +)(withToasts(React.memo(ExploreViewContainer))); diff --git a/superset-frontend/src/explore/components/ExportToCSVDropdown/ExportToCSVDropdown.test.tsx b/superset-frontend/src/explore/components/ExportToCSVDropdown/ExportToCSVDropdown.test.tsx index 5207b5f5ffbb..144f03aa6f16 100644 --- a/superset-frontend/src/explore/components/ExportToCSVDropdown/ExportToCSVDropdown.test.tsx +++ b/superset-frontend/src/explore/components/ExportToCSVDropdown/ExportToCSVDropdown.test.tsx @@ -18,21 +18,27 @@ */ import React from 'react'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'spec/helpers/testing-library'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; import { ExportToCSVDropdown } from './index'; const exportCSVOriginal = jest.fn(); const exportCSVPivoted = jest.fn(); -test('Dropdown button with menu renders', () => { - render( - <ExportToCSVDropdown - exportCSVOriginal={exportCSVOriginal} - exportCSVPivoted={exportCSVPivoted} - > - <div>.CSV</div> - </ExportToCSVDropdown>, +const waitForRender = () => { + waitFor(() => + render( + <ExportToCSVDropdown + exportCSVOriginal={exportCSVOriginal} + exportCSVPivoted={exportCSVPivoted} + > + <div>.CSV</div> + </ExportToCSVDropdown>, + ), ); +}; + +test('Dropdown button with menu renders', () => { + waitForRender(); expect(screen.getByText('.CSV')).toBeVisible(); @@ -43,14 +49,7 @@ test('Dropdown button with menu renders', () => { }); test('Call export csv original on click', () => { - render( - <ExportToCSVDropdown - exportCSVOriginal={exportCSVOriginal} - exportCSVPivoted={exportCSVPivoted} - > - <div>.CSV</div> - </ExportToCSVDropdown>, - ); + waitForRender(); userEvent.click(screen.getByText('.CSV')); userEvent.click(screen.getByText('Original')); @@ -59,14 +58,7 @@ test('Call export csv original on click', () => { }); test('Call export csv pivoted on click', () => { - render( - <ExportToCSVDropdown - exportCSVOriginal={exportCSVOriginal} - exportCSVPivoted={exportCSVPivoted} - > - <div>.CSV</div> - </ExportToCSVDropdown>, - ); + waitForRender(); userEvent.click(screen.getByText('.CSV')); userEvent.click(screen.getByText('Pivoted')); diff --git a/superset-frontend/src/explore/components/PropertiesModal/PropertiesModal.test.tsx b/superset-frontend/src/explore/components/PropertiesModal/PropertiesModal.test.tsx index 4ea132760331..9b8d4ec2edf5 100644 --- a/superset-frontend/src/explore/components/PropertiesModal/PropertiesModal.test.tsx +++ b/superset-frontend/src/explore/components/PropertiesModal/PropertiesModal.test.tsx @@ -269,6 +269,9 @@ test('Empty "Certified by" should clear "Certification details"', async () => { }; renderModal(noCertifiedByProps); + expect( + await screen.findByRole('textbox', { name: 'Certification details' }), + ).toBeInTheDocument(); expect( screen.getByRole('textbox', { name: 'Certification details' }), ).toHaveValue(''); diff --git a/superset-frontend/src/explore/components/PropertiesModal/index.tsx b/superset-frontend/src/explore/components/PropertiesModal/index.tsx index de1639894b77..53bcfe77c3d1 100644 --- a/superset-frontend/src/explore/components/PropertiesModal/index.tsx +++ b/superset-frontend/src/explore/components/PropertiesModal/index.tsx @@ -20,7 +20,7 @@ import React, { useMemo, useState, useCallback, useEffect } from 'react'; import Modal from 'src/components/Modal'; import { Input, TextArea } from 'src/components/Input'; import Button from 'src/components/Button'; -import { Select, Row, Col, AntdForm } from 'src/components'; +import { AsyncSelect, Row, Col, AntdForm } from 'src/components'; import { SelectValue } from 'antd/lib/select'; import rison from 'rison'; import { t, SupersetClient, styled } from '@superset-ui/core'; @@ -69,7 +69,7 @@ function PropertiesModal({ errorText = t('You do not have permission to edit this chart'); } Modal.error({ - title: 'Error', + title: t('Error'), content: errorText, okButtonProps: { danger: true, className: 'btn-danger' }, }); @@ -107,12 +107,12 @@ function PropertiesModal({ return SupersetClient.get({ endpoint: `/api/v1/chart/related/owners?q=${query}`, }).then(response => ({ - data: response.json.result.map( - (item: { value: number; text: string }) => ({ + data: response.json.result + .filter((item: { extra: { active: boolean } }) => item.extra.active) + .map((item: { value: number; text: string }) => ({ value: item.value, label: item.text, - }), - ), + })), totalCount: response.json.count, })); }, @@ -159,6 +159,7 @@ function PropertiesModal({ ...payload, ...res.json.result, id: slice.slice_id, + owners: selectedOwners, }; onSave(updatedChart); addSuccessToast(t('Chart properties updated')); @@ -186,7 +187,7 @@ function PropertiesModal({ <Modal show={show} onHide={onHide} - title="Edit Chart Properties" + title={t('Edit Chart Properties')} footer={ <> <Button @@ -298,7 +299,7 @@ function PropertiesModal({ </FormItem> <h3 style={{ marginTop: '1em' }}>{t('Access')}</h3> <FormItem label={ownersLabel}> - <Select + <AsyncSelect ariaLabel={ownersLabel} mode="multiple" name="owners" diff --git a/superset-frontend/src/explore/components/RowCountLabel/index.tsx b/superset-frontend/src/explore/components/RowCountLabel/index.tsx index 3597e4972475..be41be0ba67d 100644 --- a/superset-frontend/src/explore/components/RowCountLabel/index.tsx +++ b/superset-frontend/src/explore/components/RowCountLabel/index.tsx @@ -35,10 +35,14 @@ export default function RowCountLabel(props: RowCountLabelProps) { limitReached || (rowcount === 0 && !loading) ? 'danger' : 'default'; const formattedRowCount = getNumberFormatter()(rowcount); const label = ( - <Label type={type} data-test="row-count-label"> - {loading - ? t('Loading...') - : tn('%s row', '%s rows', rowcount, formattedRowCount)} + <Label type={type}> + {loading ? ( + t('Loading...') + ) : ( + <span data-test="row-count-label"> + {tn('%s row', '%s rows', rowcount, formattedRowCount)} + </span> + )} </Label> ); return limitReached ? ( diff --git a/superset-frontend/src/explore/components/SaveModal.test.jsx b/superset-frontend/src/explore/components/SaveModal.test.jsx index b3a7ac3d58b1..15bfc64e7588 100644 --- a/superset-frontend/src/explore/components/SaveModal.test.jsx +++ b/superset-frontend/src/explore/components/SaveModal.test.jsx @@ -29,322 +29,199 @@ import Button from 'src/components/Button'; import sinon from 'sinon'; import fetchMock from 'fetch-mock'; -import * as exploreUtils from 'src/explore/exploreUtils'; import * as saveModalActions from 'src/explore/actions/saveModalActions'; import SaveModal, { StyledModal } from 'src/explore/components/SaveModal'; - -describe('SaveModal', () => { - const middlewares = [thunk]; - const mockStore = configureStore(middlewares); - const initialState = { - chart: {}, - saveModal: { - dashboards: [], - }, - explore: { - datasource: {}, - slice: { - slice_id: 1, - slice_name: 'title', - owners: [1], - }, - alert: null, - user: { - userId: 1, - }, - }, - }; - const store = mockStore(initialState); - - const defaultProps = { - onHide: () => ({}), - actions: bindActionCreators(saveModalActions, arg => { - if (typeof arg === 'function') { - return arg(jest.fn); - } - return arg; - }), - form_data: { datasource: '107__table', url_params: { foo: 'bar' } }, - }; - const mockEvent = { - target: { - value: 'mock event target', +import { BrowserRouter } from 'react-router-dom'; + +const middlewares = [thunk]; +const mockStore = configureStore(middlewares); +const initialState = { + chart: {}, + saveModal: { + dashboards: [], + }, + explore: { + datasource: {}, + slice: { + slice_id: 1, + slice_name: 'title', + owners: [1], }, - value: 10, - }; - - const mockDashboardData = { - pks: ['id'], - result: [{ id: 'id', dashboard_title: 'dashboard title' }], - }; - - const saveEndpoint = `glob:*/dashboardasync/api/read?_flt_0_owners=${1}`; - - beforeAll(() => fetchMock.get(saveEndpoint, mockDashboardData)); - - afterAll(() => fetchMock.restore()); - - const getWrapper = () => - shallow(<SaveModal {...defaultProps} store={store} />) - .dive() - .dive(); - - it('renders a Modal with the right set of components', () => { - const wrapper = getWrapper(); - expect(wrapper.find(StyledModal)).toExist(); - expect(wrapper.find(Radio)).toHaveLength(2); - - const footerWrapper = shallow(wrapper.find(StyledModal).props().footer); - - expect(footerWrapper.find(Button)).toHaveLength(3); - }); - - it('renders the right footer buttons when an existing dashboard', () => { - const wrapper = getWrapper(); - const footerWrapper = shallow(wrapper.find(StyledModal).props().footer); - const saveAndGoDash = footerWrapper - .find('#btn_modal_save_goto_dash') - .getElement(); - const save = footerWrapper.find('#btn_modal_save').getElement(); - expect(save.props.children).toBe('Save'); - expect(saveAndGoDash.props.children).toBe('Save & go to dashboard'); - }); - - it('renders the right footer buttons when a new dashboard', () => { - const wrapper = getWrapper(); - wrapper.setState({ - saveToDashboardId: null, - newDashboardName: 'Test new dashboard', - }); - const footerWrapper = shallow(wrapper.find(StyledModal).props().footer); - const saveAndGoDash = footerWrapper - .find('#btn_modal_save_goto_dash') - .getElement(); - const save = footerWrapper.find('#btn_modal_save').getElement(); - expect(save.props.children).toBe('Save to new dashboard'); - expect(saveAndGoDash.props.children).toBe('Save & go to new dashboard'); - }); - - it('overwrite radio button is disabled for new slice', () => { - const wrapper = getWrapper(); - wrapper.setProps({ slice: null }); - expect(wrapper.find('#overwrite-radio').prop('disabled')).toBe(true); - }); - - it('disable overwrite option for non-owner', () => { - const wrapperForNonOwner = getWrapper(); - wrapperForNonOwner.setProps({ userId: 2 }); - const overwriteRadio = wrapperForNonOwner.find('#overwrite-radio'); - expect(overwriteRadio).toHaveLength(1); - expect(overwriteRadio.prop('disabled')).toBe(true); - }); - - it('saves a new slice', () => { - const wrapperForNewSlice = getWrapper(); - wrapperForNewSlice.setProps({ can_overwrite: false }); - wrapperForNewSlice.instance().changeAction('saveas'); - const saveasRadio = wrapperForNewSlice.find('#saveas-radio'); - saveasRadio.simulate('click'); - expect(wrapperForNewSlice.state().action).toBe('saveas'); - }); - - it('overwrite a slice', () => { - const wrapperForOverwrite = getWrapper(); - const overwriteRadio = wrapperForOverwrite.find('#overwrite-radio'); - overwriteRadio.simulate('click'); - expect(wrapperForOverwrite.state().action).toBe('overwrite'); - }); - - it('componentDidMount', () => { - sinon.spy(defaultProps.actions, 'fetchDashboards'); - mount( - <Provider store={store}> - <SaveModal {...defaultProps} /> - </Provider>, - ); - expect(defaultProps.actions.fetchDashboards.calledOnce).toBe(true); - - defaultProps.actions.fetchDashboards.restore(); - }); - - it('onChange', () => { - const wrapper = getWrapper(); - const dashboardId = mockEvent.value; - - wrapper.instance().onSliceNameChange(mockEvent); - expect(wrapper.state().newSliceName).toBe(mockEvent.target.value); - - wrapper.instance().onDashboardSelectChange(dashboardId); - expect(wrapper.state().saveToDashboardId).toBe(dashboardId); - }); - - describe('saveOrOverwrite', () => { - beforeEach(() => { - sinon.stub(exploreUtils, 'getExploreUrl').callsFake(() => 'mockURL'); - - sinon.stub(defaultProps.actions, 'saveSlice').callsFake(() => - Promise.resolve({ - dashboard_url: 'http://localhost/mock_dashboard/', - slice: { slice_url: '/mock_slice/' }, - }), - ); - }); - - afterEach(() => { - exploreUtils.getExploreUrl.restore(); - defaultProps.actions.saveSlice.restore(); - }); - - it('should save slice without url_params in form_data', () => { - const wrapper = getWrapper(); - wrapper.instance().saveOrOverwrite(true); - const { args } = defaultProps.actions.saveSlice.getCall(0); - expect(args[0]).toEqual({ datasource: '107__table' }); - }); - - it('existing dashboard', () => { - const wrapper = getWrapper(); - const saveToDashboardId = 100; + alert: null, + }, + user: { + userId: 1, + }, +}; + +const initialStore = mockStore(initialState); + +const defaultProps = { + onHide: () => ({}), + actions: bindActionCreators(saveModalActions, arg => { + if (typeof arg === 'function') { + return arg(jest.fn); + } + return arg; + }), + form_data: { datasource: '107__table', url_params: { foo: 'bar' } }, +}; + +const mockEvent = { + target: { + value: 'mock event target', + }, + value: 10, +}; + +const mockDashboardData = { + pks: ['id'], + result: [{ id: 'id', dashboard_title: 'dashboard title' }], +}; + +const queryStore = mockStore({ + chart: {}, + saveModal: { + dashboards: [], + }, + explore: { + datasource: { name: 'test', type: 'query' }, + slice: null, + alert: null, + }, + user: { + userId: 1, + }, +}); - wrapper.setState({ saveToDashboardId }); - wrapper.instance().saveOrOverwrite(true); - const { args } = defaultProps.actions.saveSlice.getCall(0); - expect(args[1].save_to_dashboard_id).toBe(saveToDashboardId); - }); +const queryDefaultProps = { + ...defaultProps, + form_data: { datasource: '107__query', url_params: { foo: 'bar' } }, +}; - it('new dashboard', () => { - const wrapper = getWrapper(); - const newDashboardName = 'new dashboard name'; +const fetchDashboardsEndpoint = `glob:*/dashboardasync/api/read?_flt_0_owners=${1}`; - wrapper.setState({ newDashboardName }); - wrapper.instance().saveOrOverwrite(true); - const { args } = defaultProps.actions.saveSlice.getCall(0); - expect(args[1].new_dashboard_name).toBe(newDashboardName); - }); +beforeAll(() => fetchMock.get(fetchDashboardsEndpoint, mockDashboardData)); - describe('should always reload or redirect', () => { - const originalLocation = window.location; - delete window.location; - window.location = { assign: jest.fn() }; - const stub = sinon.stub(window.location, 'assign'); +afterAll(() => fetchMock.restore()); - afterAll(() => { - delete window.location; - window.location = originalLocation; - }); +const getWrapper = (props = defaultProps, store = initialStore) => + shallow( + <BrowserRouter> + <SaveModal {...props} store={store} /> + </BrowserRouter>, + ) + .dive() + .dive() + .dive() + .dive() + .dive() + .dive() + .dive() + .dive(); - let wrapper; +test('renders a Modal with the right set of components', () => { + const wrapper = getWrapper(); + expect(wrapper.find(StyledModal)).toExist(); + expect(wrapper.find(Radio)).toHaveLength(2); - beforeEach(() => { - stub.resetHistory(); - wrapper = getWrapper(); - }); + const footerWrapper = shallow(wrapper.find(StyledModal).props().footer); - it('Save & go to dashboard', () => - new Promise(done => { - wrapper.instance().saveOrOverwrite(true); - defaultProps.actions.saveSlice().then(() => { - expect(window.location.assign.callCount).toEqual(1); - expect(window.location.assign.getCall(0).args[0]).toEqual( - 'http://localhost/mock_dashboard/?foo=bar', - ); - done(); - }); - })); + expect(footerWrapper.find(Button)).toHaveLength(3); +}); - it('saveas new slice', () => - new Promise(done => { - wrapper.setState({ - action: 'saveas', - newSliceName: 'new slice name', - }); - wrapper.instance().saveOrOverwrite(false); - defaultProps.actions.saveSlice().then(() => { - expect(window.location.assign.callCount).toEqual(1); - expect(window.location.assign.getCall(0).args[0]).toEqual( - '/mock_slice/?foo=bar', - ); - done(); - }); - })); +test('renders the right footer buttons when existing dashboard selected', () => { + const wrapper = getWrapper(); + const footerWrapper = shallow(wrapper.find(StyledModal).props().footer); + const saveAndGoDash = footerWrapper + .find('#btn_modal_save_goto_dash') + .getElement(); + const save = footerWrapper.find('#btn_modal_save').getElement(); + expect(save.props.children).toBe('Save'); + expect(saveAndGoDash.props.children).toBe('Save & go to dashboard'); +}); - it('overwrite original slice', () => - new Promise(done => { - wrapper.setState({ action: 'overwrite' }); - wrapper.instance().saveOrOverwrite(false); - defaultProps.actions.saveSlice().then(() => { - expect(window.location.assign.callCount).toEqual(1); - expect(window.location.assign.getCall(0).args[0]).toEqual( - '/mock_slice/?foo=bar', - ); - done(); - }); - })); - }); +test('renders the right footer buttons when new dashboard selected', () => { + const wrapper = getWrapper(); + wrapper.setState({ + saveToDashboardId: null, + newDashboardName: 'Test new dashboard', }); + const footerWrapper = shallow(wrapper.find(StyledModal).props().footer); + const saveAndGoDash = footerWrapper + .find('#btn_modal_save_goto_dash') + .getElement(); + const save = footerWrapper.find('#btn_modal_save').getElement(); + expect(save.props.children).toBe('Save to new dashboard'); + expect(saveAndGoDash.props.children).toBe('Save & go to new dashboard'); +}); - describe('fetchDashboards', () => { - let dispatch; - let actionThunk; - const userID = 1; - - beforeEach(() => { - fetchMock.resetHistory(); - dispatch = sinon.spy(); - }); +test('disables overwrite option for new slice', () => { + const wrapper = getWrapper(); + wrapper.setProps({ slice: null }); + expect(wrapper.find('#overwrite-radio').prop('disabled')).toBe(true); +}); - const makeRequest = () => { - actionThunk = saveModalActions.fetchDashboards(userID); - return actionThunk(dispatch); - }; +test('disables overwrite option for non-owner', () => { + const wrapperForNonOwner = getWrapper(); + wrapperForNonOwner.setProps({ userId: 2 }); + const overwriteRadio = wrapperForNonOwner.find('#overwrite-radio'); + expect(overwriteRadio).toHaveLength(1); + expect(overwriteRadio.prop('disabled')).toBe(true); +}); - it('makes the fetch request', () => - makeRequest().then(() => { - expect(fetchMock.calls(saveEndpoint)).toHaveLength(1); +test('sets action when saving as new slice', () => { + const wrapperForNewSlice = getWrapper(); + wrapperForNewSlice.setProps({ can_overwrite: false }); + wrapperForNewSlice.instance().changeAction('saveas'); + const saveasRadio = wrapperForNewSlice.find('#saveas-radio'); + saveasRadio.simulate('click'); + expect(wrapperForNewSlice.state().action).toBe('saveas'); +}); - return Promise.resolve(); - })); +test('sets action when overwriting slice', () => { + const wrapperForOverwrite = getWrapper(); + const overwriteRadio = wrapperForOverwrite.find('#overwrite-radio'); + overwriteRadio.simulate('click'); + expect(wrapperForOverwrite.state().action).toBe('overwrite'); +}); - it('calls correct actions on success', () => - makeRequest().then(() => { - expect(dispatch.callCount).toBe(1); - expect(dispatch.getCall(0).args[0].type).toBe( - saveModalActions.FETCH_DASHBOARDS_SUCCEEDED, - ); +test('fetches dashboards on component mount', () => { + sinon.spy(defaultProps.actions, 'fetchDashboards'); + mount( + <Provider store={initialStore}> + <SaveModal {...defaultProps} /> + </Provider>, + ); + expect(defaultProps.actions.fetchDashboards.calledOnce).toBe(true); - return Promise.resolve(); - })); + defaultProps.actions.fetchDashboards.restore(); +}); - it('calls correct actions on error', () => { - fetchMock.get( - saveEndpoint, - { throws: 'error' }, - { overwriteRoutes: true }, - ); +test('updates slice name and selected dashboard', () => { + const wrapper = getWrapper(); + const dashboardId = mockEvent.value; - return makeRequest().then(() => { - expect(dispatch.callCount).toBe(1); - expect(dispatch.getCall(0).args[0].type).toBe( - saveModalActions.FETCH_DASHBOARDS_FAILED, - ); + wrapper.instance().onSliceNameChange(mockEvent); + expect(wrapper.state().newSliceName).toBe(mockEvent.target.value); - fetchMock.get(saveEndpoint, mockDashboardData, { - overwriteRoutes: true, - }); + wrapper.instance().onDashboardSelectChange(dashboardId); + expect(wrapper.state().saveToDashboardId).toBe(dashboardId); +}); - return Promise.resolve(); - }); - }); - }); +test('removes alert', () => { + sinon.spy(defaultProps.actions, 'removeSaveModalAlert'); + const wrapper = getWrapper(); + wrapper.setProps({ alert: 'old alert' }); - it('removeAlert', () => { - sinon.spy(defaultProps.actions, 'removeSaveModalAlert'); - const wrapper = getWrapper(); - wrapper.setProps({ alert: 'old alert' }); + wrapper.instance().removeAlert(); + expect(defaultProps.actions.removeSaveModalAlert.callCount).toBe(1); + expect(wrapper.state().alert).toBeNull(); + defaultProps.actions.removeSaveModalAlert.restore(); +}); - wrapper.instance().removeAlert(); - expect(defaultProps.actions.removeSaveModalAlert.callCount).toBe(1); - expect(wrapper.state().alert).toBeNull(); - defaultProps.actions.removeSaveModalAlert.restore(); - }); +test('set dataset name when chart source is query', () => { + const wrapper = getWrapper(queryDefaultProps, queryStore); + expect(wrapper.find('[data-test="new-dataset-name"]')).toExist(); + expect(wrapper.state().datasetName).toBe('test'); }); diff --git a/superset-frontend/src/explore/components/SaveModal.tsx b/superset-frontend/src/explore/components/SaveModal.tsx index 5a9cd37fbb59..d62cb4d898c6 100644 --- a/superset-frontend/src/explore/components/SaveModal.tsx +++ b/superset-frontend/src/explore/components/SaveModal.tsx @@ -18,22 +18,35 @@ */ /* eslint camelcase: 0 */ import React from 'react'; +import { Dispatch } from 'redux'; +import { SelectValue } from 'antd/lib/select'; +import { connect } from 'react-redux'; +import { withRouter, RouteComponentProps } from 'react-router-dom'; +import { InfoTooltipWithTrigger } from '@superset-ui/chart-controls'; +import { + css, + t, + styled, + DatasourceType, + isDefined, + ensureIsArray, +} from '@superset-ui/core'; import { Input } from 'src/components/Input'; import { Form, FormItem } from 'src/components/Form'; import Alert from 'src/components/Alert'; -import { JsonObject, t, styled } from '@superset-ui/core'; import Modal from 'src/components/Modal'; import { Radio } from 'src/components/Radio'; import Button from 'src/components/Button'; import { Select } from 'src/components'; -import { SelectValue } from 'antd/lib/select'; -import { connect } from 'react-redux'; +import Loading from 'src/components/Loading'; +import { setSaveChartModalVisibility } from 'src/explore/actions/saveModalActions'; +import { SaveActionType } from 'src/explore/types'; // Session storage key for recent dashboard const SK_DASHBOARD_ID = 'save_chart_recent_dashboard'; -type SaveModalProps = { - onHide: () => void; +interface SaveModalProps extends RouteComponentProps { + addDangerToast: (msg: string) => void; actions: Record<string, any>; form_data?: Record<string, any>; userId: number; @@ -43,22 +56,30 @@ type SaveModalProps = { slice?: Record<string, any>; datasource?: Record<string, any>; dashboardId: '' | number | null; -}; - -type ActionType = 'overwrite' | 'saveas'; + isVisible: boolean; + dispatch: Dispatch; +} type SaveModalState = { saveToDashboardId: number | string | null; newSliceName?: string; newDashboardName?: string; + datasetName: string; alert: string | null; - action: ActionType; + action: SaveActionType; + isLoading: boolean; + saveStatus?: string | null; }; export const StyledModal = styled(Modal)` .ant-modal-body { overflow: visible; } + i { + position: absolute; + top: -${({ theme }) => theme.gridUnit * 5.25}px; + left: ${({ theme }) => theme.gridUnit * 26.75}px; + } `; class SaveModal extends React.Component<SaveModalProps, SaveModalState> { @@ -67,14 +88,18 @@ class SaveModal extends React.Component<SaveModalProps, SaveModalState> { this.state = { saveToDashboardId: null, newSliceName: props.sliceName, + datasetName: props.datasource?.name, alert: null, action: this.canOverwriteSlice() ? 'overwrite' : 'saveas', + isLoading: false, }; this.onDashboardSelectChange = this.onDashboardSelectChange.bind(this); this.onSliceNameChange = this.onSliceNameChange.bind(this); this.changeAction = this.changeAction.bind(this); this.saveOrOverwrite = this.saveOrOverwrite.bind(this); this.isNewDashboard = this.isNewDashboard.bind(this); + this.removeAlert = this.removeAlert.bind(this); + this.onHide = this.onHide.bind(this); } isNewDashboard(): boolean { @@ -90,7 +115,10 @@ class SaveModal extends React.Component<SaveModalProps, SaveModalState> { componentDidMount() { this.props.actions.fetchDashboards(this.props.userId).then(() => { - const dashboardIds = this.props.dashboards.map( + if (ensureIsArray(this.props.dashboards).length === 0) { + return; + } + const dashboardIds = this.props.dashboards?.map( dashboard => dashboard.value, ); const lastDashboard = sessionStorage.getItem(SK_DASHBOARD_ID); @@ -111,6 +139,11 @@ class SaveModal extends React.Component<SaveModalProps, SaveModalState> { }); } + handleDatasetNameChange = (e: React.FormEvent<HTMLInputElement>) => { + // @ts-expect-error + this.setState({ datasetName: e.target.value }); + }; + onSliceNameChange(event: React.ChangeEvent<HTMLInputElement>) { this.setState({ newSliceName: event.target.value }); } @@ -122,48 +155,256 @@ class SaveModal extends React.Component<SaveModalProps, SaveModalState> { this.setState({ saveToDashboardId, newDashboardName }); } - changeAction(action: ActionType) { + changeAction(action: SaveActionType) { this.setState({ action }); } - saveOrOverwrite(gotodash: boolean) { - this.setState({ alert: null }); + onHide() { + this.props.dispatch(setSaveChartModalVisibility(false)); + } + + async saveOrOverwrite(gotodash: boolean) { + this.setState({ alert: null, isLoading: true }); this.props.actions.removeSaveModalAlert(); - const sliceParams: Record<string, any> = {}; - if (this.props.slice && this.props.slice.slice_id) { - sliceParams.slice_id = this.props.slice.slice_id; - } - if (sliceParams.action === 'saveas') { - if (this.state.newSliceName === '') { - this.setState({ alert: t('Please enter a chart name') }); + // Create or retrieve dashboard + type DashboardGetResponse = { + id: number; + url: string; + dashboard_title: string; + }; + + try { + if (this.props.datasource?.type === DatasourceType.Query) { + const { schema, sql, database } = this.props.datasource; + const { templateParams } = this.props.datasource; + const columns = this.props.datasource?.columns || []; + + await this.props.actions.saveDataset({ + schema, + sql, + database, + templateParams, + datasourceName: this.state.datasetName, + columns, + }); + } + + // Get chart dashboards + let sliceDashboards: number[] = []; + if (this.props.slice && this.state.action === 'overwrite') { + sliceDashboards = await this.props.actions.getSliceDashboards( + this.props.slice, + ); + } + + const formData = this.props.form_data || {}; + delete formData.url_params; + + let dashboard: DashboardGetResponse | null = null; + if (this.state.newDashboardName || this.state.saveToDashboardId) { + let saveToDashboardId = this.state.saveToDashboardId || null; + if (!this.state.saveToDashboardId) { + const response = await this.props.actions.createDashboard( + this.state.newDashboardName, + ); + saveToDashboardId = response.id; + } + + const response = await this.props.actions.getDashboard( + saveToDashboardId, + ); + dashboard = response.result; + if (isDefined(dashboard) && isDefined(dashboard?.id)) { + sliceDashboards = sliceDashboards.includes(dashboard.id) + ? sliceDashboards + : [...sliceDashboards, dashboard.id]; + formData.dashboards = sliceDashboards; + } + } + + // Sets the form data + this.props.actions.setFormData({ ...formData }); + + // Update or create slice + let value: { id: number }; + if (this.state.action === 'overwrite') { + value = await this.props.actions.updateSlice( + this.props.slice, + this.state.newSliceName, + sliceDashboards, + dashboard + ? { + title: dashboard.dashboard_title, + new: !this.state.saveToDashboardId, + } + : null, + ); + } else { + value = await this.props.actions.createSlice( + this.state.newSliceName, + sliceDashboards, + dashboard + ? { + title: dashboard.dashboard_title, + new: !this.state.saveToDashboardId, + } + : null, + ); + } + + if (dashboard) { + sessionStorage.setItem(SK_DASHBOARD_ID, `${dashboard.id}`); + } else { + sessionStorage.removeItem(SK_DASHBOARD_ID); + } + + // Go to new dashboard url + if (gotodash && dashboard) { + this.props.history.push(dashboard.url); return; } + + const searchParams = new URLSearchParams(window.location.search); + searchParams.set('save_action', this.state.action); + searchParams.delete('form_data_key'); + if (this.state.action === 'saveas') { + searchParams.set('slice_id', value.id.toString()); + } + this.props.history.replace(`/explore/?${searchParams.toString()}`); + + this.setState({ isLoading: false }); + this.onHide(); + } finally { + this.setState({ isLoading: false }); } - sliceParams.action = this.state.action; - sliceParams.slice_name = this.state.newSliceName; - sliceParams.save_to_dashboard_id = this.state.saveToDashboardId; - sliceParams.new_dashboard_name = this.state.newDashboardName; - const { url_params, ...formData } = this.props.form_data || {}; - - this.props.actions - .saveSlice(formData, sliceParams) - .then((data: JsonObject) => { - if (data.dashboard_id === null) { - sessionStorage.removeItem(SK_DASHBOARD_ID); - } else { - sessionStorage.setItem(SK_DASHBOARD_ID, data.dashboard_id); + } + + renderSaveChartModal = () => { + const dashboardSelectValue = + this.state.saveToDashboardId || this.state.newDashboardName; + + return ( + <Form data-test="save-modal-body" layout="vertical"> + {(this.state.alert || this.props.alert) && ( + <Alert + type="warning" + message={this.state.alert || this.props.alert} + onClose={this.removeAlert} + /> + )} + <FormItem data-test="radio-group"> + <Radio + id="overwrite-radio" + disabled={!this.canOverwriteSlice()} + checked={this.state.action === 'overwrite'} + onChange={() => this.changeAction('overwrite')} + data-test="save-overwrite-radio" + > + {t('Save (Overwrite)')} + </Radio> + <Radio + id="saveas-radio" + data-test="saveas-radio" + checked={this.state.action === 'saveas'} + onChange={() => this.changeAction('saveas')} + > + {t('Save as...')} + </Radio> + </FormItem> + <hr /> + <FormItem label={t('Chart name')} required> + <Input + name="new_slice_name" + type="text" + placeholder="Name" + value={this.state.newSliceName} + onChange={this.onSliceNameChange} + data-test="new-chart-name" + /> + </FormItem> + {this.props.datasource?.type === 'query' && ( + <FormItem label={t('Dataset Name')} required> + <InfoTooltipWithTrigger + tooltip={t('A reusable dataset will be saved with your chart.')} + placement="right" + /> + <Input + name="dataset_name" + type="text" + placeholder="Dataset Name" + value={this.state.datasetName} + onChange={this.handleDatasetNameChange} + data-test="new-dataset-name" + /> + </FormItem> + )} + <FormItem + label={t('Add to dashboard')} + data-test="save-chart-modal-select-dashboard-form" + > + <Select + allowClear + allowNewOptions + ariaLabel={t('Select a dashboard')} + options={this.props.dashboards} + onChange={this.onDashboardSelectChange} + value={dashboardSelectValue || undefined} + placeholder={ + <div> + <b>{t('Select')}</b> + {t(' a dashboard OR ')} + <b>{t('create')}</b> + {t(' a new one')} + </div> + } + /> + </FormItem> + </Form> + ); + }; + + renderFooter = () => ( + <div data-test="save-modal-footer"> + <Button id="btn_cancel" buttonSize="small" onClick={this.onHide}> + {t('Cancel')} + </Button> + <Button + id="btn_modal_save_goto_dash" + buttonSize="small" + disabled={ + !this.state.newSliceName || + (!this.state.saveToDashboardId && !this.state.newDashboardName) || + (this.props.datasource?.type !== DatasourceType.Table && + !this.state.datasetName) } - // Go to new slice url or dashboard url - let url = gotodash ? data.dashboard_url : data.slice.slice_url; - if (url_params) { - const prefix = url.includes('?') ? '&' : '?'; - url = `${url}${prefix}${new URLSearchParams(url_params).toString()}`; + onClick={() => this.saveOrOverwrite(true)} + > + {this.isNewDashboard() + ? t('Save & go to new dashboard') + : t('Save & go to dashboard')} + </Button> + <Button + id="btn_modal_save" + buttonSize="small" + buttonStyle="primary" + onClick={() => this.saveOrOverwrite(false)} + disabled={ + this.state.isLoading || + !this.state.newSliceName || + (this.props.datasource?.type !== DatasourceType.Table && + !this.state.datasetName) } - window.location.assign(url); - }); - this.props.onHide(); - } + data-test="btn-modal-save" + > + {!this.canOverwriteSlice() && this.props.slice + ? t('Save as new chart') + : this.isNewDashboard() + ? t('Save to new dashboard') + : t('Save')} + </Button> + </div> + ); removeAlert() { if (this.props.alert) { @@ -173,139 +414,52 @@ class SaveModal extends React.Component<SaveModalProps, SaveModalState> { } render() { - const dashboardSelectValue = - this.state.saveToDashboardId || this.state.newDashboardName; return ( <StyledModal - show - onHide={this.props.onHide} + show={this.props.isVisible} + onHide={this.onHide} title={t('Save chart')} - footer={ - <div data-test="save-modal-footer"> - <Button - id="btn_cancel" - buttonSize="small" - onClick={this.props.onHide} - > - {t('Cancel')} - </Button> - <Button - id="btn_modal_save_goto_dash" - buttonSize="small" - disabled={ - !this.state.newSliceName || - (!this.state.saveToDashboardId && !this.state.newDashboardName) - } - onClick={() => this.saveOrOverwrite(true)} - > - {this.isNewDashboard() - ? t('Save & go to new dashboard') - : t('Save & go to dashboard')} - </Button> - <Button - id="btn_modal_save" - buttonSize="small" - buttonStyle="primary" - onClick={() => this.saveOrOverwrite(false)} - disabled={!this.state.newSliceName} - data-test="btn-modal-save" - > - {!this.canOverwriteSlice() && this.props.slice - ? t('Save as new chart') - : this.isNewDashboard() - ? t('Save to new dashboard') - : t('Save')} - </Button> - </div> - } + footer={this.renderFooter()} > - <Form data-test="save-modal-body" layout="vertical"> - {(this.state.alert || this.props.alert) && ( - <Alert - type="warning" - message={ - <> - {this.state.alert ? this.state.alert : this.props.alert} - <i - role="button" - aria-label="Remove alert" - tabIndex={0} - className="fa fa-close pull-right" - onClick={this.removeAlert.bind(this)} - style={{ cursor: 'pointer' }} - /> - </> - } - /> - )} - <FormItem data-test="radio-group"> - <Radio - id="overwrite-radio" - disabled={!this.canOverwriteSlice()} - checked={this.state.action === 'overwrite'} - onChange={() => this.changeAction('overwrite')} - data-test="save-overwrite-radio" - > - {t('Save (Overwrite)')} - </Radio> - <Radio - id="saveas-radio" - data-test="saveas-radio" - checked={this.state.action === 'saveas'} - onChange={() => this.changeAction('saveas')} - > - {t('Save as...')} - </Radio> - </FormItem> - <hr /> - <FormItem label={t('Chart name')} required> - <Input - name="new_slice_name" - type="text" - placeholder="Name" - value={this.state.newSliceName} - onChange={this.onSliceNameChange} - data-test="new-chart-name" - /> - </FormItem> - <FormItem - label={t('Add to dashboard')} - data-test="save-chart-modal-select-dashboard-form" + {this.state.isLoading ? ( + <div + css={css` + display: flex; + justify-content: center; + `} > - <Select - allowClear - allowNewOptions - ariaLabel={t('Select a dashboard')} - options={this.props.dashboards} - onChange={this.onDashboardSelectChange} - value={dashboardSelectValue || undefined} - placeholder={ - <div> - <b>{t('Select')}</b> - {t(' a dashboard OR ')} - <b>{t('create')}</b> - {t(' a new one')} - </div> - } - /> - </FormItem> - </Form> + <Loading position="normal" /> + </div> + ) : ( + this.renderSaveChartModal() + )} </StyledModal> ); } } +interface StateProps { + datasource: any; + slice: any; + userId: any; + dashboards: any; + alert: any; + isVisible: boolean; +} + function mapStateToProps({ explore, saveModal, -}: Record<string, any>): Partial<SaveModalProps> { + user, +}: Record<string, any>): StateProps { return { datasource: explore.datasource, slice: explore.slice, - userId: explore.user?.userId, + userId: user?.userId, dashboards: saveModal.dashboards, alert: saveModal.saveModalAlert, + isVisible: saveModal.isVisible, }; } -export default connect(mapStateToProps, () => ({}))(SaveModal); +export default withRouter(connect(mapStateToProps)(SaveModal)); diff --git a/superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx b/superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx index 8df36c1291ac..c444e027d9b2 100644 --- a/superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx +++ b/superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx @@ -28,6 +28,7 @@ import { validateNonEmpty, isValidExpression, styled, + getColumnLabel, withTheme, } from '@superset-ui/core'; @@ -115,7 +116,7 @@ const NotFoundContent = () => ( <span> {t('Add an annotation layer')}{' '} <a - href="/annotationlayermodelview/list" + href="/annotationlayer/list" target="_blank" rel="noopener noreferrer" > @@ -300,7 +301,7 @@ class AnnotationLayer extends React.PureComponent { if (isLoadingOptions) { if (sourceType === ANNOTATION_SOURCE_TYPES.NATIVE) { SupersetClient.get({ - endpoint: '/annotationlayermodelview/api/read?', + endpoint: '/api/v1/annotation_layer/', }).then(({ json }) => { const layers = json ? json.result.map(layer => ({ @@ -326,7 +327,19 @@ class AnnotationLayer extends React.PureComponent { metadata && metadata.canBeAnnotationType(annotationType) ); }) - .map(x => ({ value: x.id, label: x.title, slice: x })), + .map(x => ({ + value: x.id, + label: x.title, + slice: { + ...x, + data: { + ...x.data, + groupby: x.data.groupby?.map(column => + getColumnLabel(column), + ), + }, + }, + })), }); }, ); @@ -413,8 +426,8 @@ class AnnotationLayer extends React.PureComponent { let description = ''; if (requiresQuery(sourceType)) { if (sourceType === ANNOTATION_SOURCE_TYPES.NATIVE) { - label = 'Annotation layer'; - description = 'Select the Annotation Layer you would like to use.'; + label = t('Annotation layer'); + description = t('Select the Annotation Layer you would like to use.'); } else { label = t('Chart'); description = t( @@ -426,10 +439,10 @@ class AnnotationLayer extends React.PureComponent { ); } } else if (annotationType === ANNOTATION_TYPES.FORMULA) { - label = 'Formula'; - description = `Expects a formula with depending time parameter 'x' + label = t('Formula'); + description = t(`Expects a formula with depending time parameter 'x' in milliseconds since epoch. mathjs is used to evaluate the formulas. - Example: '2x+5'`; + Example: '2x+5'`); } if (requiresQuery(sourceType)) { return ( @@ -464,7 +477,7 @@ class AnnotationLayer extends React.PureComponent { onChange={this.handleValue} validationErrors={ !this.isValidFormulaAnnotation(value, annotationType) - ? ['Bad formula.'] + ? [t('Bad formula.')] : [] } /> @@ -499,7 +512,7 @@ class AnnotationLayer extends React.PureComponent { isSelected title={t('Annotation Slice Configuration')} info={t(`This section allows you to configure how to use the slice - to generate annotations.`)} + to generate annotations.`)} > {(annotationType === ANNOTATION_TYPES.EVENT || annotationType === ANNOTATION_TYPES.INTERVAL) && ( @@ -543,7 +556,7 @@ class AnnotationLayer extends React.PureComponent { name="annotation-layer-title" label={t('Title Column')} description={t('Pick a title for you annotation.')} - options={[{ value: '', label: 'None' }].concat(columns)} + options={[{ value: '', label: t('None') }].concat(columns)} value={titleColumn} onChange={value => this.setState({ titleColumn: value })} /> @@ -566,9 +579,9 @@ class AnnotationLayer extends React.PureComponent { <CheckboxControl hovered name="annotation-override-time_range" - label="Override time range" - description={`This controls whether the "time_range" field from the current - view should be passed down to the chart containing the annotation data.`} + label={t('Override time range')} + description={t(`This controls whether the "time_range" field from the current + view should be passed down to the chart containing the annotation data.`)} value={'time_range' in overrides} onChange={v => { delete overrides.time_range; @@ -584,9 +597,9 @@ class AnnotationLayer extends React.PureComponent { <CheckboxControl hovered name="annotation-override-timegrain" - label="Override time grain" - description={`This controls whether the time grain field from the current - view should be passed down to the chart containing the annotation data.`} + label={t('Override time grain')} + description={t(`This controls whether the time grain field from the current + view should be passed down to the chart containing the annotation data.`)} value={'time_grain_sqla' in overrides} onChange={v => { delete overrides.time_grain_sqla; @@ -607,9 +620,9 @@ class AnnotationLayer extends React.PureComponent { <TextControl hovered name="annotation-layer-timeshift" - label="Time Shift" - description={`Time delta in natural language - (example: 24 hours, 7 days, 56 weeks, 365 days)`} + label={t('Time Shift')} + description={t(`Time delta in natural language + (example: 24 hours, 7 days, 56 weeks, 365 days)`)} placeholder="" value={overrides.time_shift} onChange={v => @@ -656,10 +669,10 @@ class AnnotationLayer extends React.PureComponent { label={t('Style')} // see '../../../visualizations/nvd3_vis.css' options={[ - { value: 'solid', label: 'Solid' }, - { value: 'dashed', label: 'Dashed' }, - { value: 'longDashed', label: 'Long dashed' }, - { value: 'dotted', label: 'Dotted' }, + { value: 'solid', label: t('Solid') }, + { value: 'dashed', label: t('Dashed') }, + { value: 'longDashed', label: t('Long dashed') }, + { value: 'dotted', label: t('Dotted') }, ]} value={style} clearable={false} @@ -671,7 +684,7 @@ class AnnotationLayer extends React.PureComponent { label={t('Opacity')} // see '../../../visualizations/nvd3_vis.css' options={[ - { value: '', label: 'Solid' }, + { value: '', label: t('Solid') }, { value: 'opacityLow', label: '0.2' }, { value: 'opacityMedium', label: '0.5' }, { value: 'opacityHigh', label: '0.8' }, @@ -693,7 +706,7 @@ class AnnotationLayer extends React.PureComponent { buttonSize="xsmall" onClick={() => this.setState({ color: AUTOMATIC_COLOR })} > - Automatic Color + {t('Automatic Color')} </Button> </div> </div> @@ -708,8 +721,8 @@ class AnnotationLayer extends React.PureComponent { <CheckboxControl hovered name="annotation-layer-show-markers" - label="Show Markers" - description="Shows or hides markers for the time series" + label={t('Show Markers')} + description={t('Shows or hides markers for the time series')} value={showMarkers} onChange={v => this.setState({ showMarkers: v })} /> @@ -718,8 +731,8 @@ class AnnotationLayer extends React.PureComponent { <CheckboxControl hovered name="annotation-layer-hide-line" - label="Hide Line" - description="Hides the Line for the time series" + label={t('Hide Line')} + description={t('Hides the Line for the time series')} value={hideLine} onChange={v => this.setState({ hideLine: v })} /> diff --git a/superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.test.tsx b/superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.test.tsx index ed8ae44339b2..c5fed0b865f6 100644 --- a/superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.test.tsx +++ b/superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.test.tsx @@ -36,7 +36,7 @@ beforeAll(() => { value => value.value, ); - fetchMock.get('glob:*/annotationlayermodelview/api/read?*', { + fetchMock.get('glob:*/api/v1/annotation_layer/*', { result: [{ label: 'Chart A', value: 'a' }], }); @@ -78,7 +78,7 @@ test('renders extra checkboxes when type is time series', async () => { userEvent.click(screen.getAllByText('Formula')[0]); userEvent.click(screen.getByText('Time series')); expect( - screen.getByRole('button', { name: 'Show Markers' }), + await screen.findByRole('button', { name: 'Show Markers' }), ).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'Hide Line' })).toBeInTheDocument(); }); @@ -86,7 +86,7 @@ test('renders extra checkboxes when type is time series', async () => { test('enables apply and ok buttons', async () => { const { container } = render(<AnnotationLayer {...defaultProps} />); - waitFor(() => { + await waitFor(() => { expect(container).toBeInTheDocument(); }); @@ -99,7 +99,7 @@ test('enables apply and ok buttons', async () => { userEvent.type(nameInput, 'Name'); userEvent.type(formulaInput, '2x'); - waitFor(() => { + await waitFor(() => { expect(screen.getByRole('button', { name: 'Apply' })).toBeEnabled(); expect(screen.getByRole('button', { name: 'OK' })).toBeEnabled(); }); @@ -150,13 +150,13 @@ test('renders chart options', async () => { screen.getByRole('combobox', { name: 'Annotation source type' }), ); userEvent.click(screen.getByText('Superset annotation')); - expect(screen.getByText('Annotation layer')).toBeInTheDocument(); + expect(await screen.findByText('Annotation layer')).toBeInTheDocument(); userEvent.click( screen.getByRole('combobox', { name: 'Annotation source type' }), ); userEvent.click(screen.getByText('Table')); - expect(screen.getByText('Chart')).toBeInTheDocument(); + expect(await screen.findByText('Chart')).toBeInTheDocument(); }); test('keeps apply disabled when missing required fields', async () => { @@ -167,25 +167,26 @@ test('keeps apply disabled when missing required fields', async () => { userEvent.click( screen.getByRole('combobox', { name: 'Annotation layer value' }), ); - userEvent.click(await screen.findByText('Chart A')); - expect( - screen.getByText('Annotation Slice Configuration'), - ).toBeInTheDocument(); + expect(await screen.findByText('Chart A')).toBeInTheDocument(); + userEvent.click(screen.getByText('Chart A')); userEvent.click(screen.getByRole('button', { name: 'Automatic Color' })); userEvent.click( screen.getByRole('combobox', { name: 'Annotation layer title column' }), ); + expect(await screen.findByText(/none/i)).toBeInTheDocument(); userEvent.click(screen.getByText('None')); userEvent.click(screen.getByText('Style')); userEvent.click( screen.getByRole('combobox', { name: 'Annotation layer stroke' }), ); + expect(await screen.findByText('Dashed')).toBeInTheDocument(); userEvent.click(screen.getByText('Dashed')); userEvent.click(screen.getByText('Opacity')); userEvent.click( screen.getByRole('combobox', { name: 'Annotation layer opacity' }), ); + expect(await screen.findByText(/0.5/i)).toBeInTheDocument(); userEvent.click(screen.getByText('0.5')); const checkboxes = screen.getAllByRole('checkbox'); diff --git a/superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx b/superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx index f1381abee1aa..f70557170c0d 100644 --- a/superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx +++ b/superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx @@ -26,7 +26,9 @@ import AsyncEsmComponent from 'src/components/AsyncEsmComponent'; import { getChartKey } from 'src/explore/exploreUtils'; import { runAnnotationQuery } from 'src/components/Chart/chartAction'; import CustomListItem from 'src/explore/components/controls/CustomListItem'; -import ControlPopover from '../ControlPopover/ControlPopover'; +import ControlPopover, { + getSectionContainerElement, +} from '../ControlPopover/ControlPopover'; const AnnotationLayer = AsyncEsmComponent( () => import('./AnnotationLayer'), @@ -69,7 +71,7 @@ class AnnotationLayerControl extends React.PureComponent { } componentDidMount() { - // preload the AnotationLayer component and dependent libraries i.e. mathjs + // preload the AnnotationLayer component and dependent libraries i.e. mathjs AnnotationLayer.preload(); } @@ -114,6 +116,11 @@ class AnnotationLayerControl extends React.PureComponent { removeAnnotationLayer(annotation) { const annotations = this.props.value.filter(anno => anno !== annotation); + // So scrollbar doesnt get stuck on hidden + const element = getSectionContainerElement(); + if (element) { + element.style.setProperty('overflow-y', 'auto', 'important'); + } this.props.onChange(annotations); } diff --git a/superset-frontend/src/explore/components/controls/CollectionControl/CollectionControl.test.tsx b/superset-frontend/src/explore/components/controls/CollectionControl/CollectionControl.test.tsx index 53d57030c946..00ece2306901 100644 --- a/superset-frontend/src/explore/components/controls/CollectionControl/CollectionControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/CollectionControl/CollectionControl.test.tsx @@ -85,49 +85,58 @@ const createProps = () => ({ value: [{ key: 'hrYAZ5iBH' }], }); -test('Should render', () => { +test('Should render', async () => { const props = createProps(); render(<CollectionControl {...props} />); - expect(screen.getByTestId('CollectionControl')).toBeInTheDocument(); + expect(await screen.findByTestId('CollectionControl')).toBeInTheDocument(); }); -test('Should show the button with the label', () => { +test('Should show the button with the label', async () => { const props = createProps(); render(<CollectionControl {...props} />); - expect(screen.getByRole('button', { name: props.label })).toBeInTheDocument(); + expect( + await screen.findByRole('button', { name: props.label }), + ).toBeInTheDocument(); expect(screen.getByRole('button', { name: props.label })).toHaveTextContent( props.label, ); }); -test('Should have add button', () => { +test('Should have add button', async () => { const props = createProps(); render(<CollectionControl {...props} />); + expect( + await screen.findByRole('button', { name: 'plus-large' }), + ).toBeInTheDocument(); expect(props.onChange).toBeCalledTimes(0); userEvent.click(screen.getByRole('button', { name: 'plus-large' })); expect(props.onChange).toBeCalledWith([{ key: 'hrYAZ5iBH' }, undefined]); }); -test('Should have remove button', () => { +test('Should have remove button', async () => { const props = createProps(); render(<CollectionControl {...props} />); + expect( + await screen.findByRole('button', { name: 'remove-item' }), + ).toBeInTheDocument(); expect(props.onChange).toBeCalledTimes(0); userEvent.click(screen.getByRole('button', { name: 'remove-item' })); expect(props.onChange).toBeCalledWith([]); }); -test('Should have SortableDragger icon', () => { +test('Should have SortableDragger icon', async () => { const props = createProps(); render(<CollectionControl {...props} />); - expect(screen.getByLabelText('drag')).toBeVisible(); + expect(await screen.findByLabelText('drag')).toBeVisible(); }); -test('Should call Control component', () => { +test('Should call Control component', async () => { const props = createProps(); render(<CollectionControl {...props} />); + expect(await screen.findByTestId('TestControl')).toBeInTheDocument(); expect(props.onChange).toBeCalledTimes(0); userEvent.click(screen.getByTestId('TestControl')); expect(props.onChange).toBeCalledWith([{ key: 'hrYAZ5iBH' }]); diff --git a/superset-frontend/src/explore/components/controls/ColorPickerControl.jsx b/superset-frontend/src/explore/components/controls/ColorPickerControl.jsx index d0337dcc3eab..3b887357924b 100644 --- a/superset-frontend/src/explore/components/controls/ColorPickerControl.jsx +++ b/superset-frontend/src/explore/components/controls/ColorPickerControl.jsx @@ -59,7 +59,7 @@ const styles = { ...swatchCommon, borderRadius: '2px', }, - checkboard: { + checkerboard: { ...swatchCommon, background: 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg==") left center', @@ -105,7 +105,7 @@ export default class ColorPickerControl extends React.Component { content={this.renderPopover()} > <StyledSwatch> - <div style={styles.checkboard} /> + <div style={styles.checkerboard} /> <div style={colStyle} /> </StyledSwatch> </Popover> diff --git a/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeControl.test.tsx b/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeControl.test.tsx index 1f19d8a2c3a8..9e760aab1316 100644 --- a/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeControl.test.tsx @@ -18,7 +18,7 @@ */ import React from 'react'; import { render, screen, waitFor } from 'spec/helpers/testing-library'; -import ColorSchemeControl from '.'; +import ColorSchemeControl, { ColorSchemes } from '.'; const defaultProps = { hasCustomLabelColors: false, @@ -28,7 +28,7 @@ const defaultProps = { value: 'supersetDefault', clearable: true, choices: [], - schemes: () => null, + schemes: () => ({} as ColorSchemes), isLinear: false, }; diff --git a/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeLabel.test.tsx b/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeLabel.test.tsx new file mode 100644 index 000000000000..e3117d2f77ce --- /dev/null +++ b/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeLabel.test.tsx @@ -0,0 +1,59 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import ColorSchemeLabel from './ColorSchemeLabel'; + +const defaultProps = { + colors: [ + '#000000', + '#FFFFFF', + '#CCCCCC', + '#000000', + '#FFFFFF', + '#CCCCCC', + '#000000', + '#FFFFFF', + '#CCCCCC', + '#000000', + '#FFFFFF', + '#CCCCCC', + ], + label: 'Superset Colors', + id: 'colorScheme', +}; + +const setup = (overrides?: Record<string, any>) => + render(<ColorSchemeLabel {...defaultProps} {...overrides} />); + +test('should render', async () => { + const { container } = setup(); + await waitFor(() => expect(container).toBeVisible()); +}); + +test('should render the label', () => { + setup(); + expect(screen.getByText('Superset Colors')).toBeInTheDocument(); +}); + +test('should render the colors', () => { + setup(); + const allColors = screen.getAllByTestId('color'); + expect(allColors).toHaveLength(12); +}); diff --git a/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeLabel.tsx b/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeLabel.tsx new file mode 100644 index 000000000000..cd046eb1fd90 --- /dev/null +++ b/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeLabel.tsx @@ -0,0 +1,126 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { css, SupersetTheme } from '@superset-ui/core'; +import React, { useRef, useState } from 'react'; +import { Tooltip } from 'src/components/Tooltip'; + +type ColorSchemeLabelProps = { + colors: string[]; + id: string; + label: string; +}; + +export default function ColorSchemeLabel(props: ColorSchemeLabelProps) { + const { id, label, colors } = props; + const [showTooltip, setShowTooltip] = useState<boolean>(false); + const labelNameRef = useRef<HTMLElement>(null); + const labelColorsRef = useRef<HTMLElement>(null); + const handleShowTooltip = () => { + const labelNameElement = labelNameRef.current; + const labelColorsElement = labelColorsRef.current; + if ( + labelNameElement && + labelColorsElement && + (labelNameElement.scrollWidth > labelNameElement.offsetWidth || + labelNameElement.scrollHeight > labelNameElement.offsetHeight || + labelColorsElement.scrollWidth > labelColorsElement.offsetWidth || + labelColorsElement.scrollHeight > labelColorsElement.offsetHeight) + ) { + setShowTooltip(true); + } + }; + const handleHideTooltip = () => { + setShowTooltip(false); + }; + + const colorsList = () => + colors.map((color: string, i: number) => ( + <span + data-test="color" + key={`${id}-${i}`} + css={(theme: { gridUnit: number }) => css` + padding-left: ${theme.gridUnit / 2}px; + :before { + content: ''; + display: inline-block; + background-color: ${color}; + border: 1px solid ${color === 'white' ? 'black' : color}; + width: 9px; + height: 10px; + } + `} + /> + )); + + const tooltipContent = () => ( + <> + <span>{label}</span> + <div>{colorsList()}</div> + </> + ); + + return ( + <Tooltip + data-testid="tooltip" + overlayClassName="color-scheme-tooltip" + title={tooltipContent} + key={id} + visible={showTooltip} + > + <span + className="color-scheme-option" + onMouseEnter={handleShowTooltip} + onMouseLeave={handleHideTooltip} + css={css` + display: flex; + align-items: center; + justify-content: flex-start; + `} + data-test={id} + > + <span + className="color-scheme-label" + ref={labelNameRef} + css={(theme: SupersetTheme) => css` + min-width: 125px; + padding-right: ${theme.gridUnit * 2}px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + `} + > + {label} + </span> + <span + ref={labelColorsRef} + css={(theme: SupersetTheme) => css` + flex: 100%; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + padding-right: ${theme.gridUnit}px; + `} + > + {colorsList()} + </span> + </span> + </Tooltip> + ); +} diff --git a/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx b/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx deleted file mode 100644 index f0ccc1239814..000000000000 --- a/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx +++ /dev/null @@ -1,208 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import PropTypes from 'prop-types'; -import { isFunction } from 'lodash'; -import { Select } from 'src/components'; -import { Tooltip } from 'src/components/Tooltip'; -import { styled, t } from '@superset-ui/core'; -import Icons from 'src/components/Icons'; -import ControlHeader from 'src/explore/components/ControlHeader'; - -const propTypes = { - hasCustomLabelColors: PropTypes.bool, - dashboardId: PropTypes.number, - description: PropTypes.string, - label: PropTypes.string, - labelMargin: PropTypes.number, - name: PropTypes.string.isRequired, - onChange: PropTypes.func, - value: PropTypes.string, - clearable: PropTypes.bool, - default: PropTypes.string, - choices: PropTypes.oneOfType([ - PropTypes.arrayOf(PropTypes.array), - PropTypes.func, - ]), - schemes: PropTypes.oneOfType([PropTypes.object, PropTypes.func]), - isLinear: PropTypes.bool, -}; - -const defaultProps = { - choices: [], - hasCustomLabelColors: false, - label: t('Color scheme'), - schemes: {}, - clearable: false, - onChange: () => {}, -}; - -const StyledAlert = styled(Icons.AlertSolid)` - color: ${({ theme }) => theme.colors.alert.base}; -`; - -export default class ColorSchemeControl extends React.PureComponent { - constructor(props) { - super(props); - this.onChange = this.onChange.bind(this); - this.renderOption = this.renderOption.bind(this); - this.renderLabel = this.renderLabel.bind(this); - this.dashboardColorSchemeAlert = t( - `The color scheme is determined by the related dashboard. - Edit the color scheme in the dashboard properties.`, - ); - } - - onChange(value) { - this.props.onChange(value); - } - - renderOption(value) { - const { isLinear } = this.props; - const currentScheme = this.schemes[value]; - - // For categorical scheme, display all the colors - // For sequential scheme, show 10 or interpolate to 10. - // Sequential schemes usually have at most 10 colors. - let colors = []; - if (currentScheme) { - colors = isLinear ? currentScheme.getColors(10) : currentScheme.colors; - } - - return ( - <span key={currentScheme.id} title={currentScheme.label}> - <ul - css={{ - listStyle: 'none', - margin: 0, - padding: 0, - display: 'flex', - alignItems: 'center', - - '& li': { - flexBasis: 9, - height: 10, - margin: '9px 1px', - }, - }} - data-test={currentScheme.id} - > - {colors.map((color, i) => ( - <li - key={`${currentScheme.id}-${i}`} - css={{ - backgroundColor: color, - border: `1px solid ${color === 'white' ? 'black' : color}`, - }} - > -   - </li> - ))} - </ul> - </span> - ); - } - - renderLabel() { - const { dashboardId, hasCustomLabelColors, label } = this.props; - - if (hasCustomLabelColors || dashboardId) { - const alertTitle = hasCustomLabelColors - ? t( - `This color scheme is being overriden by custom label colors. - Check the JSON metadata in the Advanced settings`, - ) - : this.dashboardColorSchemeAlert; - return ( - <> - {label}{' '} - <Tooltip title={alertTitle}> - <StyledAlert iconSize="s" /> - </Tooltip> - </> - ); - } - return label; - } - - render() { - const { choices, dashboardId, schemes } = this.props; - let options = dashboardId - ? [ - { - value: 'dashboard', - label: 'dashboard', - customLabel: ( - <Tooltip title={this.dashboardColorSchemeAlert}> - {t('Dashboard scheme')} - </Tooltip> - ), - }, - ] - : []; - let currentScheme = dashboardId ? 'dashboard' : undefined; - - // if related to a dashboard the scheme is dictated by the dashboard - if (!dashboardId) { - this.schemes = isFunction(schemes) ? schemes() : schemes; - const controlChoices = isFunction(choices) ? choices() : choices; - const allColorOptions = []; - const filteredColorOptions = controlChoices.filter(o => { - const option = o[0]; - const isValidColorOption = - option !== 'SUPERSET_DEFAULT' && !allColorOptions.includes(option); - allColorOptions.push(option); - return isValidColorOption; - }); - - options = filteredColorOptions.map(([value]) => ({ - customLabel: this.renderOption(value), - label: this.schemes?.[value]?.label || value, - value, - })); - - currentScheme = this.props.value || this.props.default; - - if (currentScheme === 'SUPERSET_DEFAULT') { - currentScheme = this.schemes?.SUPERSET_DEFAULT?.id; - } - } - - const selectProps = { - ariaLabel: t('Select color scheme'), - allowClear: this.props.clearable, - disabled: !!dashboardId, - name: `select-${this.props.name}`, - onChange: this.onChange, - options, - placeholder: t('Select scheme'), - value: currentScheme, - }; - - return ( - <Select - header={<ControlHeader {...this.props} label={this.renderLabel()} />} - {...selectProps} - /> - ); - } -} - -ColorSchemeControl.propTypes = propTypes; -ColorSchemeControl.defaultProps = defaultProps; diff --git a/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx b/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx new file mode 100644 index 000000000000..2faa08d8eea2 --- /dev/null +++ b/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx @@ -0,0 +1,189 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useMemo } from 'react'; +import { ColorScheme, SequentialScheme, styled, t } from '@superset-ui/core'; +import { isFunction } from 'lodash'; +import { Select } from 'src/components'; +import ControlHeader from 'src/explore/components/ControlHeader'; +import { Tooltip } from 'src/components/Tooltip'; +import Icons from 'src/components/Icons'; +import ColorSchemeLabel from './ColorSchemeLabel'; + +export interface ColorSchemes { + [key: string]: ColorScheme; +} + +export interface ColorSchemeControlProps { + hasCustomLabelColors: boolean; + dashboardId?: number; + label: string; + name: string; + onChange?: (value: string) => void; + value: string; + clearable: boolean; + defaultScheme?: string; + choices: string[][] | (() => string[][]); + schemes: ColorSchemes | (() => ColorSchemes); + isLinear: boolean; +} + +const StyledAlert = styled(Icons.AlertSolid)` + color: ${({ theme }) => theme.colors.alert.base}; +`; + +const CUSTOM_LABEL_ALERT = t( + `This color scheme is being overridden by custom label colors. + Check the JSON metadata in the Advanced settings`, +); + +const DASHBOARD_ALERT = t( + `The color scheme is determined by the related dashboard. + Edit the color scheme in the dashboard properties.`, +); + +const Label = ({ + label, + hasCustomLabelColors, + dashboardId, +}: Pick< + ColorSchemeControlProps, + 'label' | 'hasCustomLabelColors' | 'dashboardId' +>) => { + if (hasCustomLabelColors || dashboardId) { + const alertTitle = hasCustomLabelColors + ? CUSTOM_LABEL_ALERT + : DASHBOARD_ALERT; + return ( + <> + {label}{' '} + <Tooltip title={alertTitle}> + <StyledAlert iconSize="s" /> + </Tooltip> + </> + ); + } + return <>{label}</>; +}; + +const ColorSchemeControl = ({ + hasCustomLabelColors = false, + dashboardId, + label = t('Color scheme'), + name, + onChange = () => {}, + value, + clearable = false, + defaultScheme, + choices = [], + schemes = {}, + isLinear, + ...rest +}: ColorSchemeControlProps) => { + const currentScheme = useMemo(() => { + if (dashboardId) { + return 'dashboard'; + } + let result = value || defaultScheme; + if (result === 'SUPERSET_DEFAULT') { + const schemesObject = isFunction(schemes) ? schemes() : schemes; + result = schemesObject?.SUPERSET_DEFAULT?.id; + } + return result; + }, [dashboardId, defaultScheme, schemes, value]); + + const options = useMemo(() => { + if (dashboardId) { + return [ + { + value: 'dashboard', + label: t('dashboard'), + customLabel: ( + <Tooltip title={DASHBOARD_ALERT}>{t('Dashboard scheme')}</Tooltip> + ), + }, + ]; + } + const schemesObject = isFunction(schemes) ? schemes() : schemes; + const controlChoices = isFunction(choices) ? choices() : choices; + const allColorOptions: string[] = []; + const filteredColorOptions = controlChoices.filter(o => { + const option = o[0]; + const isValidColorOption = + option !== 'SUPERSET_DEFAULT' && !allColorOptions.includes(option); + allColorOptions.push(option); + return isValidColorOption; + }); + + return filteredColorOptions.map(([value]) => { + const currentScheme = schemesObject[value]; + + // For categorical scheme, display all the colors + // For sequential scheme, show 10 or interpolate to 10. + // Sequential schemes usually have at most 10 colors. + let colors: string[] = []; + if (currentScheme) { + colors = isLinear + ? (currentScheme as SequentialScheme).getColors(10) + : currentScheme.colors; + } + return { + customLabel: ( + <ColorSchemeLabel + id={currentScheme.id} + label={currentScheme.label} + colors={colors} + /> + ), + label: schemesObject?.[value]?.label || value, + value, + }; + }); + }, [choices, dashboardId, isLinear, schemes]); + + // We can't pass on change directly because it receives a second + // parameter and it would be interpreted as the error parameter + const handleOnChange = (value: string) => onChange(value); + + return ( + <Select + header={ + <ControlHeader + {...rest} + label={ + <Label + label={label} + hasCustomLabelColors={hasCustomLabelColors} + dashboardId={dashboardId} + /> + } + /> + } + ariaLabel={t('Select color scheme')} + allowClear={clearable} + disabled={!!dashboardId} + name={`select-${name}`} + onChange={handleOnChange} + options={options} + placeholder={t('Select scheme')} + value={currentScheme} + /> + ); +}; + +export default ColorSchemeControl; diff --git a/superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx b/superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx index b32ca5f21639..d50e71608ba1 100644 --- a/superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx +++ b/superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx @@ -45,7 +45,7 @@ const colorSchemeOptions = (theme: SupersetTheme) => [ ]; const operatorOptions = [ - { value: COMPARATOR.NONE, label: 'None' }, + { value: COMPARATOR.NONE, label: t('None') }, { value: COMPARATOR.GREATER_THAN, label: '>' }, { value: COMPARATOR.LESS_THAN, label: '<' }, { value: COMPARATOR.GREATER_OR_EQUAL, label: '≥' }, diff --git a/superset-frontend/src/explore/components/controls/ControlPopover/ControlPopover.tsx b/superset-frontend/src/explore/components/controls/ControlPopover/ControlPopover.tsx index f84194c43caa..55391c04c9a5 100644 --- a/superset-frontend/src/explore/components/controls/ControlPopover/ControlPopover.tsx +++ b/superset-frontend/src/explore/components/controls/ControlPopover/ControlPopover.tsx @@ -24,12 +24,12 @@ import Popover, { } from 'src/components/Popover'; const sectionContainerId = 'controlSections'; -const getSectionContainerElement = () => +export const getSectionContainerElement = () => document.getElementById(sectionContainerId)?.lastElementChild as HTMLElement; const getElementYVisibilityRatioOnContainer = (node: HTMLElement) => { const containerHeight = window?.innerHeight; - const nodePositionInViewport = node.getBoundingClientRect()?.top; + const nodePositionInViewport = node?.getBoundingClientRect()?.top; if (!containerHeight || !nodePositionInViewport) { return 0; } @@ -45,6 +45,7 @@ const ControlPopover: React.FC<PopoverProps> = ({ getPopupContainer, getVisibilityRatio = getElementYVisibilityRatioOnContainer, visible: visibleProp, + destroyTooltipOnHide = false, ...props }) => { const triggerElementRef = useRef<HTMLElement>(); @@ -56,10 +57,9 @@ const ControlPopover: React.FC<PopoverProps> = ({ const calculatePlacement = useCallback(() => { const visibilityRatio = getVisibilityRatio(triggerElementRef.current!); - - if (visibilityRatio < 0.35) { + if (visibilityRatio < 0.35 && placement !== 'rightTop') { setPlacement('rightTop'); - } else if (visibilityRatio > 0.65) { + } else if (visibilityRatio > 0.65 && placement !== 'rightBottom') { setPlacement('rightBottom'); } else { setPlacement('right'); @@ -68,10 +68,6 @@ const ControlPopover: React.FC<PopoverProps> = ({ const changeContainerScrollStatus = useCallback( visible => { - if (triggerElementRef.current && visible) { - calculatePlacement(); - } - const element = getSectionContainerElement(); if (element) { element.style.setProperty( @@ -87,9 +83,6 @@ const ControlPopover: React.FC<PopoverProps> = ({ const handleGetPopupContainer = useCallback( (triggerNode: HTMLElement) => { triggerElementRef.current = triggerNode; - setTimeout(() => { - calculatePlacement(); - }, 0); return getPopupContainer?.(triggerNode) || document.body; }, @@ -140,6 +133,12 @@ const ControlPopover: React.FC<PopoverProps> = ({ }; }, [handleDocumentKeyDownListener, visible]); + useEffect(() => { + if (visible) { + calculatePlacement(); + } + }, [visible, calculatePlacement]); + return ( <Popover {...props} @@ -148,6 +147,7 @@ const ControlPopover: React.FC<PopoverProps> = ({ placement={placement} onVisibleChange={handleOnVisibleChange} getPopupContainer={handleGetPopupContainer} + destroyTooltipOnHide={destroyTooltipOnHide} /> ); }; diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx index 41a40c0bc442..a4e9c100ee0f 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.jsx @@ -20,13 +20,19 @@ import React from 'react'; import sinon from 'sinon'; import configureStore from 'redux-mock-store'; import { mount, shallow } from 'enzyme'; -import { supersetTheme, ThemeProvider } from '@superset-ui/core'; +import { + supersetTheme, + ThemeProvider, + DatasourceType, +} from '@superset-ui/core'; import { Menu } from 'src/components/Menu'; import { DatasourceModal, ChangeDatasourceModal, } from 'src/components/Datasource'; -import DatasourceControl from 'src/explore/components/controls/DatasourceControl'; +import DatasourceControl, { + getDatasourceTitle, +} from 'src/explore/components/controls/DatasourceControl'; import Icons from 'src/components/Icons'; import { Tooltip } from 'src/components/Tooltip'; @@ -110,29 +116,6 @@ describe('DatasourceControl', () => { </div>, ); expect(menuWrapper.find(Menu.Item)).toHaveLength(2); - - wrapper = setup({ - datasource: { - name: 'birth_names', - type: 'druid', - uid: '1__druid', - id: 1, - columns: [], - metrics: [], - owners: [{ username: 'admin', userId: 1 }], - database: { - backend: 'druid', - name: 'main', - }, - }, - }); - expect(wrapper.find('[data-test="datasource-menu"]')).toExist(); - menuWrapper = shallow( - <div> - {wrapper.find('[data-test="datasource-menu"]').first().prop('overlay')} - </div>, - ); - expect(menuWrapper.find(Menu.Item)).toHaveLength(2); }); it('should render health check message', () => { @@ -143,4 +126,30 @@ describe('DatasourceControl', () => { defaultProps.datasource.health_check_message, ); }); + + it('Gets Datasource Title', () => { + const sql = 'This is the sql'; + const name = 'this is a name'; + const emptyResult = ''; + const queryDatasource1 = { type: DatasourceType.Query, sql }; + let displayText = getDatasourceTitle(queryDatasource1); + expect(displayText).toBe(sql); + const queryDatasource2 = { type: DatasourceType.Query, sql: null }; + displayText = getDatasourceTitle(queryDatasource2); + expect(displayText).toBe(null); + const queryDatasource3 = { type: 'random type', name }; + displayText = getDatasourceTitle(queryDatasource3); + expect(displayText).toBe(name); + const queryDatasource4 = { type: 'random type' }; + displayText = getDatasourceTitle(queryDatasource4); + expect(displayText).toBe(emptyResult); + displayText = getDatasourceTitle(); + expect(displayText).toBe(emptyResult); + displayText = getDatasourceTitle(null); + expect(displayText).toBe(emptyResult); + displayText = getDatasourceTitle('I should not be a string'); + expect(displayText).toBe(emptyResult); + displayText = getDatasourceTitle([]); + expect(displayText).toBe(emptyResult); + }); }); diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.tsx b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.tsx index 8a65a1139df9..2c094e72afba 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/DatasourceControl.test.tsx @@ -18,14 +18,16 @@ */ import React from 'react'; -import { render, screen, act } from 'spec/helpers/testing-library'; +import fetchMock from 'fetch-mock'; import userEvent from '@testing-library/user-event'; -import { SupersetClient, DatasourceType } from '@superset-ui/core'; +import { DatasourceType, JsonObject, SupersetClient } from '@superset-ui/core'; +import { render, screen, act, waitFor } from 'spec/helpers/testing-library'; +import { fallbackExploreInitialData } from 'src/explore/fixtures'; import DatasourceControl from '.'; const SupersetClientGet = jest.spyOn(SupersetClient, 'get'); -const createProps = () => ({ +const createProps = (overrides: JsonObject = {}) => ({ hovered: false, type: 'DatasourceControl', label: 'Datasource', @@ -45,7 +47,10 @@ const createProps = () => ({ }, validationErrors: [], name: 'datasource', - actions: {}, + actions: { + changeDatasource: jest.fn(), + setControlValue: jest.fn(), + }, isEditable: true, user: { createdOn: '2021-04-27T18:12:38.952304', @@ -60,37 +65,94 @@ const createProps = () => ({ }, onChange: jest.fn(), onDatasourceSave: jest.fn(), + ...overrides, }); -test('Should render', () => { +async function openAndSaveChanges(datasource: any) { + fetchMock.post('glob:*/datasource/save/', datasource, { + overwriteRoutes: true, + }); + userEvent.click(screen.getByTestId('datasource-menu-trigger')); + userEvent.click(await screen.findByTestId('edit-dataset')); + userEvent.click(await screen.findByTestId('datasource-modal-save')); + userEvent.click(await screen.findByText('OK')); +} + +test('Should render', async () => { const props = createProps(); render(<DatasourceControl {...props} />); - expect(screen.getByTestId('datasource-control')).toBeVisible(); + expect(await screen.findByTestId('datasource-control')).toBeVisible(); }); -test('Should have elements', () => { +test('Should have elements', async () => { const props = createProps(); render(<DatasourceControl {...props} />); - expect(screen.getByText('channels')).toBeVisible(); + expect(await screen.findByText('channels')).toBeVisible(); expect(screen.getByTestId('datasource-menu-trigger')).toBeVisible(); }); -test('Should open a menu', () => { +test('Should open a menu', async () => { const props = createProps(); render(<DatasourceControl {...props} />); expect(screen.queryByText('Edit dataset')).not.toBeInTheDocument(); - expect(screen.queryByText('Change dataset')).not.toBeInTheDocument(); + expect(screen.queryByText('Swap dataset')).not.toBeInTheDocument(); + expect(screen.queryByText('View in SQL Lab')).not.toBeInTheDocument(); + + userEvent.click(screen.getByTestId('datasource-menu-trigger')); + + expect(await screen.findByText('Edit dataset')).toBeInTheDocument(); + expect(screen.getByText('Swap dataset')).toBeInTheDocument(); + expect(screen.getByText('View in SQL Lab')).toBeInTheDocument(); +}); + +test('Should not show SQL Lab for non sql_lab role', async () => { + const props = createProps({ + user: { + createdOn: '2021-04-27T18:12:38.952304', + email: 'gamma', + firstName: 'gamma', + isActive: true, + lastName: 'gamma', + permissions: {}, + roles: { Gamma: [] }, + userId: 2, + username: 'gamma', + }, + }); + render(<DatasourceControl {...props} />); + + userEvent.click(screen.getByTestId('datasource-menu-trigger')); + + expect(await screen.findByText('Edit dataset')).toBeInTheDocument(); + expect(screen.getByText('Swap dataset')).toBeInTheDocument(); expect(screen.queryByText('View in SQL Lab')).not.toBeInTheDocument(); +}); + +test('Should show SQL Lab for sql_lab role', async () => { + const props = createProps({ + user: { + createdOn: '2021-04-27T18:12:38.952304', + email: 'sql', + firstName: 'sql', + isActive: true, + lastName: 'sql', + permissions: {}, + roles: { Gamma: [], sql_lab: [] }, + userId: 2, + username: 'sql', + }, + }); + render(<DatasourceControl {...props} />); userEvent.click(screen.getByTestId('datasource-menu-trigger')); - expect(screen.getByText('Edit dataset')).toBeInTheDocument(); - expect(screen.getByText('Change dataset')).toBeInTheDocument(); + expect(await screen.findByText('Edit dataset')).toBeInTheDocument(); + expect(screen.getByText('Swap dataset')).toBeInTheDocument(); expect(screen.getByText('View in SQL Lab')).toBeInTheDocument(); }); -test('Click on Change dataset option', async () => { +test('Click on Swap dataset option', async () => { const props = createProps(); SupersetClientGet.mockImplementation( async ({ endpoint }: { endpoint: string }) => { @@ -109,7 +171,7 @@ test('Click on Change dataset option', async () => { userEvent.click(screen.getByTestId('datasource-menu-trigger')); await act(async () => { - userEvent.click(screen.getByText('Change dataset')); + userEvent.click(screen.getByText('Swap dataset')); }); expect( screen.getByText( @@ -139,6 +201,27 @@ test('Click on Edit dataset', async () => { ).toBeInTheDocument(); }); +test('Edit dataset should be disabled when user is not admin', async () => { + const props = createProps(); + // @ts-expect-error + props.user.roles = {}; + props.datasource.owners = []; + SupersetClientGet.mockImplementation( + async () => ({ json: { result: [] } } as any), + ); + + render(<DatasourceControl {...props} />, { + useRedux: true, + }); + + userEvent.click(screen.getByTestId('datasource-menu-trigger')); + + expect(await screen.findByTestId('edit-dataset')).toHaveAttribute( + 'aria-disabled', + 'true', + ); +}); + test('Click on View in SQL Lab', async () => { const props = createProps(); const postFormSpy = jest.spyOn(SupersetClient, 'postForm'); @@ -158,7 +241,7 @@ test('Click on View in SQL Lab', async () => { expect(postFormSpy).toBeCalledTimes(1); }); -test('Should open a different menu when datasource=query', () => { +test('Should open a different menu when datasource=query', async () => { const props = createProps(); const queryProps = { ...props, @@ -175,12 +258,12 @@ test('Should open a different menu when datasource=query', () => { userEvent.click(screen.getByTestId('datasource-menu-trigger')); - expect(screen.getByText('Query preview')).toBeInTheDocument(); + expect(await screen.findByText('Query preview')).toBeInTheDocument(); expect(screen.getByText('View in SQL Lab')).toBeInTheDocument(); expect(screen.getByText('Save as dataset')).toBeInTheDocument(); }); -test('Click on Save as dataset', () => { +test('Click on Save as dataset', async () => { const props = createProps(); const queryProps = { ...props, @@ -195,14 +278,148 @@ test('Click on Save as dataset', () => { userEvent.click(screen.getByText('Save as dataset')); // Renders a save dataset modal - const saveRadioBtn = screen.getByRole('radio', { - name: /save as new undefined/i, + const saveRadioBtn = await screen.findByRole('radio', { + name: /save as new/i, }); const overwriteRadioBtn = screen.getByRole('radio', { - name: /overwrite existing select or type dataset name/i, + name: /overwrite existing/i, }); + const dropdownField = screen.getByText(/select or type dataset name/i); expect(saveRadioBtn).toBeVisible(); expect(overwriteRadioBtn).toBeVisible(); expect(screen.getByRole('button', { name: /save/i })).toBeVisible(); expect(screen.getByRole('button', { name: /close/i })).toBeVisible(); + expect(dropdownField).toBeVisible(); +}); + +test('should set the default temporal column', async () => { + const props = createProps(); + const overrideProps = { + ...props, + form_data: { + granularity_sqla: 'test-col', + }, + datasource: { + ...props.datasource, + main_dttm_col: 'test-default', + columns: [ + { + column_name: 'test-col', + is_dttm: false, + }, + { + column_name: 'test-default', + is_dttm: true, + }, + ], + }, + }; + render(<DatasourceControl {...props} {...overrideProps} />, { + useRedux: true, + }); + + await openAndSaveChanges(overrideProps.datasource); + await waitFor(() => { + expect(props.actions.setControlValue).toHaveBeenCalledWith( + 'granularity_sqla', + 'test-default', + ); + }); +}); + +test('should set the first available temporal column', async () => { + const props = createProps(); + const overrideProps = { + ...props, + form_data: { + granularity_sqla: 'test-col', + }, + datasource: { + ...props.datasource, + main_dttm_col: null, + columns: [ + { + column_name: 'test-col', + is_dttm: false, + }, + { + column_name: 'test-first', + is_dttm: true, + }, + ], + }, + }; + render(<DatasourceControl {...props} {...overrideProps} />, { + useRedux: true, + }); + + await openAndSaveChanges(overrideProps.datasource); + await waitFor(() => { + expect(props.actions.setControlValue).toHaveBeenCalledWith( + 'granularity_sqla', + 'test-first', + ); + }); +}); + +test('should not set the temporal column', async () => { + const props = createProps(); + const overrideProps = { + ...props, + form_data: { + granularity_sqla: null, + }, + datasource: { + ...props.datasource, + main_dttm_col: null, + columns: [ + { + column_name: 'test-col', + is_dttm: false, + }, + { + column_name: 'test-col-2', + is_dttm: false, + }, + ], + }, + }; + render(<DatasourceControl {...props} {...overrideProps} />, { + useRedux: true, + }); + + await openAndSaveChanges(overrideProps.datasource); + await waitFor(() => { + expect(props.actions.setControlValue).toHaveBeenCalledWith( + 'granularity_sqla', + null, + ); + }); +}); + +test('should show missing params state', () => { + const props = createProps({ datasource: fallbackExploreInitialData.dataset }); + render(<DatasourceControl {...props} />, { useRedux: true }); + expect(screen.getByText(/missing dataset/i)).toBeVisible(); + expect(screen.getByText(/missing url parameters/i)).toBeVisible(); + expect( + screen.getByText( + /the url is missing the dataset_id or slice_id parameters\./i, + ), + ).toBeVisible(); +}); + +test('should show missing dataset state', () => { + // @ts-ignore + delete window.location; + // @ts-ignore + window.location = { search: '?slice_id=152' }; + const props = createProps({ datasource: fallbackExploreInitialData.dataset }); + render(<DatasourceControl {...props} />, { useRedux: true }); + expect(screen.getAllByText(/missing dataset/i)).toHaveLength(2); + expect( + screen.getByText( + /the dataset linked to this chart may have been deleted\./i, + ), + ).toBeVisible(); }); diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx index 615c61c2bd20..c99193dd427d 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx @@ -17,6 +17,7 @@ * specific language governing permissions and limitations * under the License. */ + import React from 'react'; import PropTypes from 'prop-types'; import { @@ -26,8 +27,8 @@ import { t, withTheme, } from '@superset-ui/core'; +import { getTemporalColumns } from '@superset-ui/chart-controls'; import { getUrlParam } from 'src/utils/urlUtils'; - import { AntdDropdown } from 'src/components'; import { Menu } from 'src/components/Menu'; import { Tooltip } from 'src/components/Tooltip'; @@ -40,9 +41,17 @@ import Button from 'src/components/Button'; import ErrorAlert from 'src/components/ErrorMessage/ErrorAlert'; import WarningIconWithTooltip from 'src/components/WarningIconWithTooltip'; import { URL_PARAMS } from 'src/constants'; -import { isUserAdmin } from 'src/dashboard/util/findPermission'; +import { getDatasourceAsSaveableDataset } from 'src/utils/datasourceUtils'; +import { + canUserAccessSqlLab, + isUserAdmin, +} from 'src/dashboard/util/permissionUtils'; +import ModalTrigger from 'src/components/ModalTrigger'; +import ViewQueryModalFooter from 'src/explore/components/controls/ViewQueryModalFooter'; +import ViewQuery from 'src/explore/components/controls/ViewQuery'; import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; import { safeStringify } from 'src/utils/safeStringify'; +import { isString } from 'lodash'; const propTypes = { actions: PropTypes.object.isRequired, @@ -104,7 +113,7 @@ const Styles = styled.div` white-space: nowrap; overflow: hidden; } - .dataset-svg { + .datasource-svg { margin-right: ${({ theme }) => 2 * theme.gridUnit}px; flex: none; } @@ -122,67 +131,104 @@ const EDIT_DATASET = 'edit_dataset'; const QUERY_PREVIEW = 'query_preview'; const SAVE_AS_DATASET = 'save_as_dataset'; +// If the string is longer than this value's number characters we add +// a tooltip for user can see the full name by hovering over the visually truncated string in UI +const VISIBLE_TITLE_LENGTH = 25; + +// Assign icon for each DatasourceType. If no icon assingment is found in the lookup, no icon will render +export const datasourceIconLookup = { + [DatasourceType.Query]: ( + <Icons.ConsoleSqlOutlined className="datasource-svg" /> + ), + [DatasourceType.Table]: <Icons.DatasetPhysical className="datasource-svg" />, +}; + +// Render title for datasource with tooltip only if text is longer than VISIBLE_TITLE_LENGTH +export const renderDatasourceTitle = (displayString, tooltip) => + displayString?.length > VISIBLE_TITLE_LENGTH ? ( + // Add a tooltip only for long names that will be visually truncated + <Tooltip title={tooltip}> + <span className="title-select">{displayString}</span> + </Tooltip> + ) : ( + <span title={tooltip} className="title-select"> + {displayString} + </span> + ); + +// Different data source types use different attributes for the display title +export const getDatasourceTitle = datasource => { + if (datasource?.type === 'query') return datasource?.sql; + return datasource?.name || ''; +}; + class DatasourceControl extends React.PureComponent { constructor(props) { super(props); this.state = { showEditDatasourceModal: false, showChangeDatasourceModal: false, + showSaveDatasetModal: false, }; - this.onDatasourceSave = this.onDatasourceSave.bind(this); - this.toggleChangeDatasourceModal = - this.toggleChangeDatasourceModal.bind(this); - this.toggleEditDatasourceModal = this.toggleEditDatasourceModal.bind(this); - this.toggleShowDatasource = this.toggleShowDatasource.bind(this); - this.handleMenuItemClick = this.handleMenuItemClick.bind(this); - this.toggleSaveDatasetModal = this.toggleSaveDatasetModal.bind(this); } - onDatasourceSave(datasource) { - this.props.actions.setDatasource(datasource); + onDatasourceSave = datasource => { + this.props.actions.changeDatasource(datasource); + const { temporalColumns, defaultTemporalColumn } = + getTemporalColumns(datasource); + const { columns } = datasource; + // the current granularity_sqla might not be a temporal column anymore const timeCol = this.props.form_data?.granularity_sqla; - const { columns } = this.props.datasource; - const firstDttmCol = columns.find(column => column.is_dttm); - if ( - datasource.type === 'table' && - !columns.find(({ column_name }) => column_name === timeCol)?.is_dttm - ) { - // set `granularity_sqla` to first datatime column name or null + const isGranularitySqalTemporal = columns.find( + ({ column_name }) => column_name === timeCol, + )?.is_dttm; + // the current main_dttm_col might not be a temporal column anymore + const isDefaultTemporal = columns.find( + ({ column_name }) => column_name === defaultTemporalColumn, + )?.is_dttm; + + // if the current granularity_sqla is empty or it is not a temporal column anymore + // let's update the control value + if (datasource.type === 'table' && !isGranularitySqalTemporal) { + const temporalColumn = isDefaultTemporal + ? defaultTemporalColumn + : temporalColumns?.[0]; this.props.actions.setControlValue( 'granularity_sqla', - firstDttmCol ? firstDttmCol.column_name : null, + temporalColumn || null, ); } + if (this.props.onDatasourceSave) { this.props.onDatasourceSave(datasource); } - } + }; - toggleShowDatasource() { + toggleShowDatasource = () => { this.setState(({ showDatasource }) => ({ showDatasource: !showDatasource, })); - } + }; - toggleChangeDatasourceModal() { + toggleChangeDatasourceModal = () => { this.setState(({ showChangeDatasourceModal }) => ({ showChangeDatasourceModal: !showChangeDatasourceModal, })); - } + }; - toggleEditDatasourceModal() { + toggleEditDatasourceModal = () => { this.setState(({ showEditDatasourceModal }) => ({ showEditDatasourceModal: !showEditDatasourceModal, })); - } + }; - toggleSaveDatasetModal() { + toggleSaveDatasetModal = () => { this.setState(({ showSaveDatasetModal }) => ({ showSaveDatasetModal: !showSaveDatasetModal, })); - } + }; - handleMenuItemClick({ key }) { + handleMenuItemClick = ({ key }) => { switch (key) { case CHANGE_DATASET: this.toggleChangeDatasourceModal(); @@ -205,9 +251,6 @@ class DatasourceControl extends React.PureComponent { } break; - case QUERY_PREVIEW: - break; - case SAVE_AS_DATASET: this.toggleSaveDatasetModal(); break; @@ -215,7 +258,7 @@ class DatasourceControl extends React.PureComponent { default: break; } - } + }; render() { const { @@ -224,28 +267,29 @@ class DatasourceControl extends React.PureComponent { showSaveDatasetModal, } = this.state; const { datasource, onChange, theme } = this.props; - const isMissingDatasource = datasource.id == null; + const isMissingDatasource = !datasource?.id; let isMissingParams = false; if (isMissingDatasource) { const datasourceId = getUrlParam(URL_PARAMS.datasourceId); const sliceId = getUrlParam(URL_PARAMS.sliceId); + if (!datasourceId && !sliceId) { isMissingParams = true; } } - const isSqlSupported = datasource.type === 'table'; const { user } = this.props; - const allowEdit = datasource.owners - .map(o => o.id || o.value) - .includes(user.userId); - isUserAdmin(user); + const allowEdit = + datasource.owners?.map(o => o.id || o.value).includes(user.userId) || + isUserAdmin(user); + + const canAccessSqlLab = canUserAccessSqlLab(user); const editText = t('Edit dataset'); const defaultDatasourceMenu = ( <Menu onClick={this.handleMenuItemClick}> - {this.props.isEditable && ( + {this.props.isEditable && !isMissingDatasource && ( <Menu.Item key={EDIT_DATASET} data-test="edit-dataset" @@ -264,8 +308,8 @@ class DatasourceControl extends React.PureComponent { )} </Menu.Item> )} - <Menu.Item key={CHANGE_DATASET}>{t('Change dataset')}</Menu.Item> - {isSqlSupported && ( + <Menu.Item key={CHANGE_DATASET}>{t('Swap dataset')}</Menu.Item> + {!isMissingDatasource && canAccessSqlLab && ( <Menu.Item key={VIEW_IN_SQL_LAB}>{t('View in SQL Lab')}</Menu.Item> )} </Menu> @@ -273,35 +317,59 @@ class DatasourceControl extends React.PureComponent { const queryDatasourceMenu = ( <Menu onClick={this.handleMenuItemClick}> - <Menu.Item key={QUERY_PREVIEW}>{t('Query preview')}</Menu.Item> - <Menu.Item key={VIEW_IN_SQL_LAB}>{t('View in SQL Lab')}</Menu.Item> + <Menu.Item key={QUERY_PREVIEW}> + <ModalTrigger + triggerNode={ + <span data-test="view-query-menu-item">{t('Query preview')}</span> + } + modalTitle={t('Query preview')} + modalBody={ + <ViewQuery + sql={datasource?.sql || datasource?.select_star || ''} + /> + } + modalFooter={ + <ViewQueryModalFooter + changeDatasource={this.toggleSaveDatasetModal} + datasource={datasource} + /> + } + draggable={false} + resizable={false} + responsive + /> + </Menu.Item> + {canAccessSqlLab && ( + <Menu.Item key={VIEW_IN_SQL_LAB}>{t('View in SQL Lab')}</Menu.Item> + )} <Menu.Item key={SAVE_AS_DATASET}>{t('Save as dataset')}</Menu.Item> </Menu> ); const { health_check_message: healthCheckMessage } = datasource; - let extra = {}; + let extra; if (datasource?.extra) { - try { - extra = JSON.parse(datasource?.extra); - } catch {} // eslint-disable-line no-empty + if (isString(datasource.extra)) { + try { + extra = JSON.parse(datasource.extra); + } catch {} // eslint-disable-line no-empty + } else { + extra = datasource.extra; // eslint-disable-line prefer-destructuring + } } + const titleText = isMissingDatasource + ? t('Missing dataset') + : getDatasourceTitle(datasource); + + const tooltip = titleText; + return ( <Styles data-test="datasource-control" className="DatasourceControl"> <div className="data-container"> - <Icons.DatasetPhysical className="dataset-svg" /> - {/* Add a tooltip only for long dataset names */} - {!isMissingDatasource && datasource.name.length > 25 ? ( - <Tooltip title={datasource.name}> - <span className="title-select">{datasource.name}</span> - </Tooltip> - ) : ( - <span title={datasource.name} className="title-select"> - {datasource.name} - </span> - )} + {datasourceIconLookup[datasource?.type]} + {renderDatasourceTitle(titleText, tooltip)} {healthCheckMessage && ( <Tooltip title={healthCheckMessage}> <Icons.AlertSolid iconColor={theme.colors.warning.base} /> @@ -319,12 +387,10 @@ class DatasourceControl extends React.PureComponent { trigger={['click']} data-test="datasource-menu" > - <Tooltip title={t('More dataset related options')}> - <Icons.MoreVert - className="datasource-modal-trigger" - data-test="datasource-menu-trigger" - /> - </Tooltip> + <Icons.MoreVert + className="datasource-modal-trigger" + data-test="datasource-menu-trigger" + /> </AntdDropdown> </div> {/* missing dataset */} @@ -366,7 +432,7 @@ class DatasourceControl extends React.PureComponent { this.handleMenuItemClick({ key: CHANGE_DATASET }) } > - {t('Change dataset')} + {t('Swap dataset')} </Button> </p> </> @@ -394,12 +460,14 @@ class DatasourceControl extends React.PureComponent { <SaveDatasetModal visible={showSaveDatasetModal} onHide={this.toggleSaveDatasetModal} - buttonTextOnSave={t('Save & Explore')} - buttonTextOnOverwrite={t('Overwrite & Explore')} + buttonTextOnSave={t('Save')} + buttonTextOnOverwrite={t('Overwrite')} modalDescription={t( 'Save this query as a virtual dataset to continue exploring', )} - datasource={datasource} + datasource={getDatasourceAsSaveableDataset(datasource)} + openWindow={false} + formData={this.props.form_data} /> )} </Styles> diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx b/superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx index cf63995c5a5f..031c8d9ad55f 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx @@ -16,83 +16,44 @@ * specific language governing permissions and limitations * under the License. */ -import React, { useState, useEffect, useMemo } from 'react'; -import rison from 'rison'; -import { css, SupersetClient, styled, t, useTheme } from '@superset-ui/core'; +import React, { ReactNode, useState, useEffect, useMemo } from 'react'; import { - buildTimeRangeString, - formatTimeRange, - COMMON_RANGE_VALUES_SET, - CALENDAR_RANGE_VALUES_SET, - FRAME_OPTIONS, - customTimeRangeDecode, -} from 'src/explore/components/controls/DateFilterControl/utils'; -import { getClientErrorObject } from 'src/utils/getClientErrorObject'; + css, + styled, + t, + useTheme, + NO_TIME_RANGE, + SupersetTheme, +} from '@superset-ui/core'; import Button from 'src/components/Button'; import ControlHeader from 'src/explore/components/ControlHeader'; -import Label, { Type } from 'src/components/Label'; +import Modal from 'src/components/Modal'; import { Divider } from 'src/components'; import Icons from 'src/components/Icons'; import Select from 'src/components/Select/Select'; import { Tooltip } from 'src/components/Tooltip'; -import { DEFAULT_TIME_RANGE } from 'src/explore/constants'; import { useDebouncedEffect } from 'src/explore/exploreUtils'; import { SLOW_DEBOUNCE } from 'src/constants'; -import { testWithId } from 'src/utils/testUtils'; import { noOp } from 'src/utils/common'; -import { FrameType } from './types'; +import { useCSSTextTruncation } from 'src/hooks/useTruncation'; import ControlPopover from '../ControlPopover/ControlPopover'; +import { DateFilterControlProps, FrameType } from './types'; +import { + DATE_FILTER_TEST_KEY, + fetchTimeRange, + FRAME_OPTIONS, + guessFrame, + useDefaultTimeFilter, +} from './utils'; import { CommonFrame, CalendarFrame, CustomFrame, AdvancedFrame, + DateLabel, } from './components'; -const guessFrame = (timeRange: string): FrameType => { - if (COMMON_RANGE_VALUES_SET.has(timeRange)) { - return 'Common'; - } - if (timeRange === 'today : tomorrow') { - return 'Today'; - } - if (timeRange === 'yesterday : today') { - return 'Yesterday'; - } - if (CALENDAR_RANGE_VALUES_SET.has(timeRange)) { - return 'Calendar'; - } - if (timeRange === 'No filter') { - return 'No filter'; - } - if (customTimeRangeDecode(timeRange).matchedFlag) { - return 'Custom'; - } - return 'Advanced'; -}; - -const fetchTimeRange = async (timeRange: string) => { - const query = rison.encode_uri(timeRange); - const endpoint = `/api/v1/time_range/?q=${query}`; - try { - const response = await SupersetClient.get({ endpoint }); - const timeRangeString = buildTimeRangeString( - response?.json?.result?.since || '', - response?.json?.result?.until || '', - ); - return { - value: formatTimeRange(timeRangeString), - }; - } catch (response) { - const clientError = await getClientErrorObject(response); - return { - error: clientError.message || clientError.error, - }; - } -}; - -const StyledPopover = styled(ControlPopover)``; const StyledRangeType = styled(Select)` width: 272px; `; @@ -167,27 +128,39 @@ const IconWrapper = styled.span` } `; -interface DateFilterControlProps { - name: string; - onChange: (timeRange: string) => void; - value?: string; - type?: Type; - onOpenPopover?: () => void; - onClosePopover?: () => void; -} - -export const DATE_FILTER_CONTROL_TEST_ID = 'date-filter-control'; -export const getDateFilterControlTestId = testWithId( - DATE_FILTER_CONTROL_TEST_ID, -); +const getTooltipTitle = ( + isLabelTruncated: boolean, + label: string | undefined, + range: string | undefined, +) => + isLabelTruncated ? ( + <div> + {label && <strong>{label}</strong>} + {range && ( + <div + css={(theme: SupersetTheme) => css` + margin-top: ${theme.gridUnit}px; + `} + > + {range} + </div> + )} + </div> + ) : ( + range || null + ); export default function DateFilterLabel(props: DateFilterControlProps) { const { - value = DEFAULT_TIME_RANGE, onChange, onOpenPopover = noOp, onClosePopover = noOp, + overlayStyle = 'Popover', + isOverflowingFilterBar = false, } = props; + const defaultTimeFilter = useDefaultTimeFilter(); + + const value = props.value ?? defaultTimeFilter; const [actualTimeRange, setActualTimeRange] = useState<string>(value); const [show, setShow] = useState<boolean>(false); @@ -197,14 +170,22 @@ export default function DateFilterLabel(props: DateFilterControlProps) { const [timeRangeValue, setTimeRangeValue] = useState(value); const [validTimeRange, setValidTimeRange] = useState<boolean>(false); const [evalResponse, setEvalResponse] = useState<string>(value); - const [tooltipTitle, setTooltipTitle] = useState<string>(value); + const [tooltipTitle, setTooltipTitle] = useState<ReactNode | null>(value); + const theme = useTheme(); + const [labelRef, labelIsTruncated] = useCSSTextTruncation<HTMLSpanElement>(); useEffect(() => { + if (value === NO_TIME_RANGE) { + setActualTimeRange(NO_TIME_RANGE); + setTooltipTitle(null); + setValidTimeRange(true); + return; + } fetchTimeRange(value).then(({ value: actualRange, error }) => { if (error) { setEvalResponse(error || ''); setValidTimeRange(false); - setTooltipTitle(value || ''); + setTooltipTitle(value || null); } else { /* HRT == human readable text @@ -223,22 +204,30 @@ export default function DateFilterLabel(props: DateFilterControlProps) { guessedFrame === 'No filter' ) { setActualTimeRange(value); - setTooltipTitle(actualRange || ''); - } else if (guessedFrame === 'Today' || guessedFrame === 'Yesterday') { - setActualTimeRange(guessedFrame); - setTooltipTitle(actualRange || ''); + setTooltipTitle( + getTooltipTitle(labelIsTruncated, value, actualRange), + ); } else { setActualTimeRange(actualRange || ''); - setTooltipTitle(value || ''); + setTooltipTitle( + getTooltipTitle(labelIsTruncated, actualRange, value), + ); } setValidTimeRange(true); } setLastFetchedTimeRange(value); + setEvalResponse(actualRange || value); }); - }, [value]); + }, [guessedFrame, labelIsTruncated, labelRef, value]); useDebouncedEffect( () => { + if (timeRangeValue === NO_TIME_RANGE) { + setEvalResponse(NO_TIME_RANGE); + setLastFetchedTimeRange(NO_TIME_RANGE); + setValidTimeRange(true); + return; + } if (lastFetchedTimeRange !== timeRangeValue) { fetchTimeRange(timeRangeValue).then(({ value: actualRange, error }) => { if (error) { @@ -259,45 +248,38 @@ export default function DateFilterLabel(props: DateFilterControlProps) { function onSave() { onChange(timeRangeValue); setShow(false); + onClosePopover(); } function onOpen() { setTimeRangeValue(value); setFrame(guessedFrame); setShow(true); + onOpenPopover(); } function onHide() { setTimeRangeValue(value); setFrame(guessedFrame); setShow(false); + onClosePopover(); } - const togglePopover = () => { + const toggleOverlay = () => { if (show) { onHide(); - onClosePopover(); } else { onOpen(); - onOpenPopover(); } }; - function onChangeFrame(value: string) { - if (value === 'No filter') { - setTimeRangeValue('No filter'); - } - if (value === 'Today') { - setTimeRangeValue('today : tomorrow'); - } - if (value === 'Yesterday') { - setTimeRangeValue('yesterday : today'); + function onChangeFrame(value: FrameType) { + if (value === NO_TIME_RANGE) { + setTimeRangeValue(NO_TIME_RANGE); } - setFrame(value as FrameType); + setFrame(value); } - const theme = useTheme(); - const overlayContent = ( <ContentStyleWrapper> <div className="control-label">{t('RANGE TYPE')}</div> @@ -322,7 +304,9 @@ export default function DateFilterLabel(props: DateFilterControlProps) { {frame === 'Custom' && ( <CustomFrame value={timeRangeValue} onChange={setTimeRangeValue} /> )} - {frame === 'No filter' && <div data-test="no-filter" />} + {frame === 'No filter' && ( + <div data-test={DATE_FILTER_TEST_KEY.noFilter} /> + )} <Divider /> <div> <div className="section-title">{t('Actual time range')}</div> @@ -341,7 +325,7 @@ export default function DateFilterLabel(props: DateFilterControlProps) { cta key="cancel" onClick={onHide} - data-test="cancel-button" + data-test={DATE_FILTER_TEST_KEY.cancelButton} > {t('CANCEL')} </Button> @@ -351,7 +335,7 @@ export default function DateFilterLabel(props: DateFilterControlProps) { disabled={!validTimeRange} key="apply" onClick={onSave} - {...getDateFilterControlTestId('apply-button')} + data-test={DATE_FILTER_TEST_KEY.applyButton} > {t('APPLY')} </Button> @@ -366,29 +350,65 @@ export default function DateFilterLabel(props: DateFilterControlProps) { </IconWrapper> ); - const overlayStyle = { - width: '600px', - }; + const popoverContent = ( + <ControlPopover + placement="right" + trigger="click" + content={overlayContent} + title={title} + defaultVisible={show} + visible={show} + onVisibleChange={toggleOverlay} + overlayStyle={{ width: '600px' }} + getPopupContainer={triggerNode => + isOverflowingFilterBar + ? (triggerNode.parentNode as HTMLElement) + : document.body + } + destroyTooltipOnHide + > + <Tooltip placement="top" title={tooltipTitle}> + <DateLabel + label={actualTimeRange} + isActive={show} + isPlaceholder={actualTimeRange === NO_TIME_RANGE} + data-test={DATE_FILTER_TEST_KEY.popoverOverlay} + ref={labelRef} + /> + </Tooltip> + </ControlPopover> + ); - return ( + const modalContent = ( <> - <ControlHeader {...props} /> - <StyledPopover - placement="right" - trigger="click" - content={overlayContent} + <Tooltip placement="top" title={tooltipTitle}> + <DateLabel + onClick={toggleOverlay} + label={actualTimeRange} + isActive={show} + isPlaceholder={actualTimeRange === NO_TIME_RANGE} + data-test={DATE_FILTER_TEST_KEY.modalOverlay} + ref={labelRef} + /> + </Tooltip> + {/* the zIndex value is from trying so that the Modal doesn't overlay the AdhocFilter when GENERIC_CHART_AXES is enabled */} + <Modal title={title} - defaultVisible={show} - visible={show} - onVisibleChange={togglePopover} - overlayStyle={overlayStyle} + show={show} + onHide={toggleOverlay} + width="600px" + hideFooter + zIndex={1030} > - <Tooltip placement="top" title={tooltipTitle}> - <Label className="pointer" data-test="time-range-trigger"> - {actualTimeRange} - </Label> - </Tooltip> - </StyledPopover> + {overlayContent} + </Modal> + </> + ); + + return ( + <> + <ControlHeader {...props} /> + {overlayStyle === 'Modal' ? modalContent : popoverContent} </> ); } diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx b/superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx index f865b703a78a..77f42598ac9a 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx @@ -24,20 +24,20 @@ import { InfoTooltipWithTrigger } from '@superset-ui/chart-controls'; import { FrameComponentProps } from 'src/explore/components/controls/DateFilterControl/types'; import DateFunctionTooltip from './DateFunctionTooltip'; -export function AdvancedFrame(props: FrameComponentProps) { - function getAdvancedRange(value: string): string { - if (value.includes(SEPARATOR)) { - return value; - } - if (value.startsWith('Last')) { - return [value, ''].join(SEPARATOR); - } - if (value.startsWith('Next')) { - return ['', value].join(SEPARATOR); - } - return SEPARATOR; +function getAdvancedRange(value: string): string { + if (value.includes(SEPARATOR)) { + return value; } + if (value.startsWith('Last')) { + return [value, ''].join(SEPARATOR); + } + if (value.startsWith('Next')) { + return ['', value].join(SEPARATOR); + } + return SEPARATOR; +} +export function AdvancedFrame(props: FrameComponentProps) { const advancedRange = getAdvancedRange(props.value || ''); const [since, until] = advancedRange.split(SEPARATOR); if (advancedRange !== props.value) { diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/components/CommonFrame.tsx b/superset-frontend/src/explore/components/controls/DateFilterControl/components/CommonFrame.tsx index 4b76ab648a15..d3de2b9991b1 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/components/CommonFrame.tsx +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/components/CommonFrame.tsx @@ -22,6 +22,7 @@ import { Radio } from 'src/components/Radio'; import { COMMON_RANGE_OPTIONS, COMMON_RANGE_SET, + DATE_FILTER_TEST_KEY, } from 'src/explore/components/controls/DateFilterControl/utils'; import { CommonRangeType, @@ -38,7 +39,12 @@ export function CommonFrame(props: FrameComponentProps) { return ( <> - <div className="section-title">{t('Configure Time Range: Last...')}</div> + <div + className="section-title" + data-test={DATE_FILTER_TEST_KEY.commonFrame} + > + {t('Configure Time Range: Last...')} + </div> <Radio.Group value={commonRange} onChange={(e: any) => props.onChange(e.target.value)} diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/components/DateLabel.tsx b/superset-frontend/src/explore/components/controls/DateFilterControl/components/DateLabel.tsx new file mode 100644 index 000000000000..2c31f8030f56 --- /dev/null +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/components/DateLabel.tsx @@ -0,0 +1,100 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { forwardRef, ReactNode, RefObject } from 'react'; +import { css, styled, useTheme } from '@superset-ui/core'; +import Icons from 'src/components/Icons'; + +export type DateLabelProps = { + label: ReactNode; + isActive?: boolean; + isPlaceholder?: boolean; + onClick?: (event: React.MouseEvent) => void; +}; + +// This is the color that antd components (such as Select or Input) use on hover +// TODO: use theme.colors.primary.base here and in antd components +const ACTIVE_BORDER_COLOR = '#45BED6'; + +const LabelContainer = styled.div<{ + isActive?: boolean; + isPlaceholder?: boolean; +}>` + ${({ theme, isActive, isPlaceholder }) => css` + width: 100%; + height: ${theme.gridUnit * 8}px; + + display: flex; + align-items: center; + flex-wrap: nowrap; + + padding: 0 ${theme.gridUnit * 3}px; + + background-color: ${theme.colors.grayscale.light5}; + + border: 1px solid + ${isActive ? ACTIVE_BORDER_COLOR : theme.colors.grayscale.light2}; + border-radius: ${theme.borderRadius}px; + + cursor: pointer; + + transition: border-color 0.3s cubic-bezier(0.65, 0.05, 0.36, 1); + :hover, + :focus { + border-color: ${ACTIVE_BORDER_COLOR}; + } + + .date-label-content { + color: ${isPlaceholder + ? theme.colors.grayscale.light1 + : theme.colors.grayscale.dark1}; + overflow: hidden; + text-overflow: ellipsis; + min-width: 0; + flex-shrink: 1; + white-space: nowrap; + } + + span[role='img'] { + margin-left: auto; + padding-left: ${theme.gridUnit}px; + + & > span[role='img'] { + line-height: 0; + } + } + `} +`; + +export const DateLabel = forwardRef( + (props: DateLabelProps, ref: RefObject<HTMLSpanElement>) => { + const theme = useTheme(); + return ( + <LabelContainer {...props} tabIndex={0}> + <span className="date-label-content" ref={ref}> + {props.label} + </span> + <Icons.CalendarOutlined + iconSize="s" + iconColor={theme.colors.grayscale.base} + /> + </LabelContainer> + ); + }, +); diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/components/index.ts b/superset-frontend/src/explore/components/controls/DateFilterControl/components/index.ts index 0bec82106562..0d46ee7a97d1 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/components/index.ts +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/components/index.ts @@ -20,3 +20,4 @@ export { CommonFrame } from './CommonFrame'; export { CalendarFrame } from './CalendarFrame'; export { CustomFrame } from './CustomFrame'; export { AdvancedFrame } from './AdvancedFrame'; +export { DateLabel } from './DateLabel'; diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/index.ts b/superset-frontend/src/explore/components/controls/DateFilterControl/index.ts index da29085f8b52..d339827629fb 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/index.ts +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/index.ts @@ -17,3 +17,4 @@ * under the License. */ export { default } from './DateFilterLabel'; +export * from './utils'; diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.test.tsx b/superset-frontend/src/explore/components/controls/DateFilterControl/tests/AdvancedFrame.test.tsx similarity index 97% rename from superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.test.tsx rename to superset-frontend/src/explore/components/controls/DateFilterControl/tests/AdvancedFrame.test.tsx index f7f13add422a..327f020b7c56 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.test.tsx +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/tests/AdvancedFrame.test.tsx @@ -19,7 +19,7 @@ import React from 'react'; import { render, screen } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; -import { AdvancedFrame } from '.'; +import { AdvancedFrame } from '../components'; test('renders with default props', () => { render(<AdvancedFrame onChange={jest.fn()} value="Last week" />); diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.test.tsx b/superset-frontend/src/explore/components/controls/DateFilterControl/tests/CustomFrame.test.tsx similarity index 95% rename from superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.test.tsx rename to superset-frontend/src/explore/components/controls/DateFilterControl/tests/CustomFrame.test.tsx index 5a26d728a725..83cad48bdb43 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.test.tsx +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/tests/CustomFrame.test.tsx @@ -22,7 +22,9 @@ import { Provider } from 'react-redux'; import configureStore from 'redux-mock-store'; import { render, screen } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; -import { CustomFrame } from '.'; +import { CustomFrame } from '../components'; + +jest.useFakeTimers(); const emptyValue = ''; const nowValue = 'now : now'; @@ -191,7 +193,7 @@ test('triggers onChange when the value changes', () => { expect(onChange).toHaveBeenCalled(); }); -test('triggers onChange when the mode changes', () => { +test('triggers onChange when the mode changes', async () => { const onChange = jest.fn(); render( <Provider store={store}> @@ -199,8 +201,12 @@ test('triggers onChange when the mode changes', () => { </Provider>, ); userEvent.click(screen.getByTitle('Midnight')); + expect(await screen.findByTitle('Relative Date/Time')).toBeInTheDocument(); userEvent.click(screen.getByTitle('Relative Date/Time')); userEvent.click(screen.getAllByTitle('Now')[1]); + expect( + await screen.findByText('Configure custom time range'), + ).toBeInTheDocument(); userEvent.click(screen.getAllByTitle('Specific Date/Time')[1]); expect(onChange).toHaveBeenCalledTimes(2); }); @@ -213,8 +219,10 @@ test('triggers onChange when the grain changes', async () => { </Provider>, ); userEvent.click(screen.getByText('Days Before')); + expect(await screen.findByText('Weeks Before')).toBeInTheDocument(); userEvent.click(screen.getByText('Weeks Before')); userEvent.click(screen.getByText('Days After')); + expect(await screen.findByText('Weeks After')).toBeInTheDocument(); userEvent.click(screen.getByText('Weeks After')); expect(onChange).toHaveBeenCalledTimes(2); }); diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/tests/DateFilterLabel.test.tsx b/superset-frontend/src/explore/components/controls/DateFilterControl/tests/DateFilterLabel.test.tsx new file mode 100644 index 000000000000..dc7559beece7 --- /dev/null +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/tests/DateFilterLabel.test.tsx @@ -0,0 +1,108 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import thunk from 'redux-thunk'; +import { Provider } from 'react-redux'; +import configureStore from 'redux-mock-store'; + +import { render, screen } from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; + +import { NO_TIME_RANGE } from '@superset-ui/core'; +import DateFilterLabel from '..'; +import { DateFilterControlProps } from '../types'; +import { DATE_FILTER_TEST_KEY } from '../utils'; + +const mockStore = configureStore([thunk]); + +const defaultProps = { + onChange: jest.fn(), + onClosePopover: jest.fn(), + onOpenPopover: jest.fn(), +}; + +function setup( + props: Omit<DateFilterControlProps, 'name'> = defaultProps, + store: any = mockStore({}), +) { + return ( + <Provider store={store}> + <DateFilterLabel name="time_range" {...props} /> + </Provider> + ); +} + +test('DateFilter with default props', () => { + render(setup()); + // label + expect(screen.getByText(NO_TIME_RANGE)).toBeInTheDocument(); + + // should be popover by default + userEvent.click(screen.getByText(NO_TIME_RANGE)); + expect( + screen.getByTestId(DATE_FILTER_TEST_KEY.popoverOverlay), + ).toBeInTheDocument(); +}); + +test('DateFilter should be applied the overlayStyle props', () => { + render(setup({ onChange: () => {}, overlayStyle: 'Modal' })); + // should be Modal as overlay + userEvent.click(screen.getByText(NO_TIME_RANGE)); + expect( + screen.getByTestId(DATE_FILTER_TEST_KEY.modalOverlay), + ).toBeInTheDocument(); +}); + +test('DateFilter should be applied the global config time_filter from the store', () => { + render( + setup( + defaultProps, + mockStore({ + common: { conf: { DEFAULT_TIME_FILTER: 'Last week' } }, + }), + ), + ); + // the label should be 'Last week' + expect(screen.getByText('Last week')).toBeInTheDocument(); + + userEvent.click(screen.getByText('Last week')); + expect( + screen.getByTestId(DATE_FILTER_TEST_KEY.commonFrame), + ).toBeInTheDocument(); +}); + +test('Open and close popover', () => { + render(setup()); + + // click "Cancel" + userEvent.click(screen.getByText(NO_TIME_RANGE)); + expect(defaultProps.onOpenPopover).toHaveBeenCalled(); + expect(screen.getByText('Edit time range')).toBeInTheDocument(); + userEvent.click(screen.getByText('CANCEL')); + expect(defaultProps.onClosePopover).toHaveBeenCalled(); + expect(screen.queryByText('Edit time range')).not.toBeInTheDocument(); + + // click "Apply" + userEvent.click(screen.getByText(NO_TIME_RANGE)); + expect(defaultProps.onOpenPopover).toHaveBeenCalled(); + expect(screen.getByText('Edit time range')).toBeInTheDocument(); + userEvent.click(screen.getByText('APPLY')); + expect(defaultProps.onClosePopover).toHaveBeenCalled(); + expect(screen.queryByText('Edit time range')).not.toBeInTheDocument(); +}); diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/utils/utils.test.ts b/superset-frontend/src/explore/components/controls/DateFilterControl/tests/utils.test.ts similarity index 100% rename from superset-frontend/src/explore/components/controls/DateFilterControl/utils/utils.test.ts rename to superset-frontend/src/explore/components/controls/DateFilterControl/tests/utils.test.ts diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/types.ts b/superset-frontend/src/explore/components/controls/DateFilterControl/types.ts index e4d9b977e3fd..1835b254619d 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/types.ts +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/types.ts @@ -96,3 +96,13 @@ export type FrameComponentProps = { onChange: (timeRange: string) => void; value: string; }; + +export interface DateFilterControlProps { + name: string; + onChange: (timeRange: string) => void; + value?: string; + onOpenPopover?: () => void; + onClosePopover?: () => void; + overlayStyle?: 'Modal' | 'Popover'; + isOverflowingFilterBar?: boolean; +} diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts b/superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts index 7cda21f84019..f92f7704bac4 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts @@ -118,11 +118,7 @@ export const SEVEN_DAYS_AGO = moment() .startOf('day') .subtract(7, 'days') .format(MOMENT_FORMAT); -export const MIDNIGHT = moment() - .utc() - .add(DEFAULT_RELATIVE_END_TIME === 'tomorrow' ? 1 : 0, 'days') - .startOf('day') - .format(MOMENT_FORMAT); +export const MIDNIGHT = moment().utc().startOf('day').format(MOMENT_FORMAT); export const LOCALE_MAPPING = { en: 'en_US', @@ -140,3 +136,12 @@ export const LOCALE_MAPPING = { sl: 'sl_SI', nl: 'nl_NL', }; + +export enum DATE_FILTER_TEST_KEY { + commonFrame = 'common-frame', + modalOverlay = 'modal-overlay', + popoverOverlay = 'time-range-trigger', + noFilter = 'no-filter', + cancelButton = 'cancel-button', + applyButton = 'date-filter-control__apply-button', +} diff --git a/superset-frontend/src/explore/components/controls/DateFilterControl/utils/dateFilterUtils.ts b/superset-frontend/src/explore/components/controls/DateFilterControl/utils/dateFilterUtils.ts index fc14dd9855bf..08162cedf02d 100644 --- a/superset-frontend/src/explore/components/controls/DateFilterControl/utils/dateFilterUtils.ts +++ b/superset-frontend/src/explore/components/controls/DateFilterControl/utils/dateFilterUtils.ts @@ -16,6 +16,17 @@ * specific language governing permissions and limitations * under the License. */ +import rison from 'rison'; +import { SupersetClient, NO_TIME_RANGE, JsonObject } from '@superset-ui/core'; +import { getClientErrorObject } from 'src/utils/getClientErrorObject'; +import { useSelector } from 'react-redux'; +import { + COMMON_RANGE_VALUES_SET, + CALENDAR_RANGE_VALUES_SET, + customTimeRangeDecode, +} from '.'; +import { FrameType } from '../types'; + export const SEPARATOR = ' : '; export const buildTimeRangeString = (since: string, until: string): string => @@ -24,11 +35,61 @@ export const buildTimeRangeString = (since: string, until: string): string => const formatDateEndpoint = (dttm: string, isStart?: boolean): string => dttm.replace('T00:00:00', '') || (isStart ? '-∞' : '∞'); -export const formatTimeRange = (timeRange: string) => { +export const formatTimeRange = ( + timeRange: string, + columnPlaceholder = 'col', +) => { const splitDateRange = timeRange.split(SEPARATOR); if (splitDateRange.length === 1) return timeRange; return `${formatDateEndpoint( splitDateRange[0], true, - )} ≤ col < ${formatDateEndpoint(splitDateRange[1])}`; + )} ≤ ${columnPlaceholder} < ${formatDateEndpoint(splitDateRange[1])}`; +}; + +export const guessFrame = (timeRange: string): FrameType => { + if (COMMON_RANGE_VALUES_SET.has(timeRange)) { + return 'Common'; + } + if (CALENDAR_RANGE_VALUES_SET.has(timeRange)) { + return 'Calendar'; + } + if (timeRange === NO_TIME_RANGE) { + return 'No filter'; + } + if (customTimeRangeDecode(timeRange).matchedFlag) { + return 'Custom'; + } + return 'Advanced'; }; + +export const fetchTimeRange = async ( + timeRange: string, + columnPlaceholder = 'col', +) => { + const query = rison.encode_uri(timeRange); + const endpoint = `/api/v1/time_range/?q=${query}`; + try { + const response = await SupersetClient.get({ endpoint }); + const timeRangeString = buildTimeRangeString( + response?.json?.result?.since || '', + response?.json?.result?.until || '', + ); + return { + value: formatTimeRange(timeRangeString, columnPlaceholder), + }; + } catch (response) { + const clientError = await getClientErrorObject(response); + return { + error: clientError.message || clientError.error || response.statusText, + }; + } +}; + +export function useDefaultTimeFilter() { + return ( + useSelector( + (state: JsonObject) => state?.common?.conf?.DEFAULT_TIME_FILTER, + ) ?? NO_TIME_RANGE + ); +} diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx index 9c4011f9d54b..dbbc8fe94843 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx @@ -18,18 +18,24 @@ */ /* eslint-disable camelcase */ import React, { + Dispatch, + SetStateAction, useCallback, useEffect, useMemo, useRef, useState, } from 'react'; -import { AdhocColumn, t, styled, css } from '@superset-ui/core'; +import { useSelector } from 'react-redux'; import { - ColumnMeta, + AdhocColumn, isAdhocColumn, - isSavedExpression, -} from '@superset-ui/chart-controls'; + t, + styled, + css, + DatasourceType, +} from '@superset-ui/core'; +import { ColumnMeta, isSavedExpression } from '@superset-ui/chart-controls'; import Tabs from 'src/components/Tabs'; import Button from 'src/components/Button'; import { Select } from 'src/components'; @@ -42,6 +48,7 @@ import { POPOVER_INITIAL_HEIGHT, UNRESIZABLE_POPOVER_WIDTH, } from 'src/explore/constants'; +import { ExplorePageState } from 'src/explore/types'; const StyledSelect = styled(Select)` .metric-option { @@ -64,6 +71,7 @@ interface ColumnSelectPopoverProps { getCurrentTab: (tab: string) => void; label: string; isTemporal?: boolean; + setDatasetModal?: Dispatch<SetStateAction<boolean>>; } const getInitialColumnValues = ( @@ -86,11 +94,15 @@ const ColumnSelectPopover = ({ editedColumn, onChange, onClose, + setDatasetModal, setLabel, getCurrentTab, label, isTemporal, }: ColumnSelectPopoverProps) => { + const datasourceType = useSelector<ExplorePageState, string | undefined>( + state => state.explore.datasource.type, + ); const [initialLabel] = useState(label); const [initialAdhocColumn, initialCalculatedColumn, initialSimpleColumn] = getInitialColumnValues(editedColumn); @@ -125,7 +137,7 @@ const ColumnSelectPopover = ({ const onSqlExpressionChange = useCallback( sqlExpression => { - setAdhocColumn({ label, sqlExpression } as AdhocColumn); + setAdhocColumn({ label, sqlExpression, expressionType: 'SQL' }); setSelectedSimpleColumn(undefined); setSelectedCalculatedColumn(undefined); }, @@ -218,6 +230,13 @@ const ColumnSelectPopover = ({ sqlEditorRef.current?.editor.resize(); }, []); + const setDatasetAndClose = () => { + if (setDatasetModal) { + setDatasetModal(true); + } + onClose(); + }; + const stateIsValid = adhocColumn || selectedCalculatedColumn || selectedSimpleColumn; const hasUnsavedChanges = @@ -265,7 +284,7 @@ const ColumnSelectPopover = ({ }))} /> </FormItem> - ) : ( + ) : datasourceType === DatasourceType.Table ? ( <EmptyStateSmall image="empty.svg" title={ @@ -283,6 +302,40 @@ const ColumnSelectPopover = ({ ) } /> + ) : ( + <EmptyStateSmall + image="empty.svg" + title={ + isTemporal + ? t('No temporal columns found') + : t('No saved expressions found') + } + description={ + isTemporal ? ( + <> + <span + role="button" + tabIndex={0} + onClick={setDatasetAndClose} + > + {t('Create a dataset')} + </span>{' '} + {t(' to mark a column as a time column')} + </> + ) : ( + <> + <span + role="button" + tabIndex={0} + onClick={setDatasetAndClose} + > + {t('Create a dataset')} + </span>{' '} + {t(' to add calculated columns')} + </> + ) + } + /> )} </Tabs.TabPane> <Tabs.TabPane key="simple" tab={t('Simple')}> @@ -290,9 +343,22 @@ const ColumnSelectPopover = ({ <EmptyStateSmall image="empty.svg" title={t('No temporal columns found')} - description={t( - 'Mark a column as temporal in "Edit datasource" modal', - )} + description={ + datasourceType === DatasourceType.Table ? ( + t('Mark a column as temporal in "Edit datasource" modal') + ) : ( + <> + <span + role="button" + tabIndex={0} + onClick={setDatasetAndClose} + > + {t('Create a dataset')} + </span>{' '} + {t(' to mark a column as a time column')} + </> + ) + } /> ) : ( <FormItem label={simpleColumnsLabel}> @@ -342,10 +408,8 @@ const ColumnSelectPopover = ({ {t('Close')} </Button> <Button - disabled={!stateIsValid} - buttonStyle={ - hasUnsavedChanges && stateIsValid ? 'primary' : 'default' - } + disabled={!stateIsValid || !hasUnsavedChanges} + buttonStyle="primary" buttonSize="small" onClick={onSave} data-test="ColumnEdit#save" diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx index 62107753e828..4340317f04d1 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx @@ -17,13 +17,11 @@ * under the License. */ import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import { AdhocColumn, t } from '@superset-ui/core'; -import { - ColumnMeta, - isAdhocColumn, - isColumnMeta, -} from '@superset-ui/chart-controls'; +import { useSelector } from 'react-redux'; +import { AdhocColumn, t, isAdhocColumn } from '@superset-ui/core'; +import { ColumnMeta, isColumnMeta } from '@superset-ui/chart-controls'; import { ExplorePopoverContent } from 'src/explore/components/ExploreContentPopover'; +import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; import ColumnSelectPopover from './ColumnSelectPopover'; import { DndColumnSelectPopoverTitle } from './DndColumnSelectPopoverTitle'; import ControlPopover from '../ControlPopover/ControlPopover'; @@ -52,10 +50,13 @@ const ColumnSelectPopoverTrigger = ({ isTemporal, ...props }: ColumnSelectPopoverTriggerProps) => { + // @ts-ignore + const datasource = useSelector(state => state.explore.datasource); const [popoverLabel, setPopoverLabel] = useState(defaultPopoverLabel); const [popoverVisible, setPopoverVisible] = useState(false); const [isTitleEditDisabled, setIsTitleEditDisabled] = useState(true); const [hasCustomLabel, setHasCustomLabel] = useState(false); + const [showDatasetModal, setDatasetModal] = useState(false); let initialPopoverLabel = defaultPopoverLabel; if (editedColumn && isColumnMeta(editedColumn)) { @@ -99,6 +100,7 @@ const ColumnSelectPopoverTrigger = ({ <ColumnSelectPopover editedColumn={editedColumn} columns={columns} + setDatasetModal={setDatasetModal} onClose={handleClosePopover} onChange={onColumnEdit} label={popoverLabel} @@ -137,17 +139,31 @@ const ColumnSelectPopoverTrigger = ({ ); return ( - <ControlPopover - trigger="click" - content={overlayContent} - defaultVisible={visible} - visible={visible} - onVisibleChange={handleTogglePopover} - title={popoverTitle} - destroyTooltipOnHide - > - {children} - </ControlPopover> + <> + {showDatasetModal && ( + <SaveDatasetModal + visible={showDatasetModal} + onHide={() => setDatasetModal(false)} + buttonTextOnSave={t('Save')} + buttonTextOnOverwrite={t('Overwrite')} + modalDescription={t( + 'Save this query as a virtual dataset to continue exploring', + )} + datasource={datasource} + /> + )} + <ControlPopover + trigger="click" + content={overlayContent} + defaultVisible={visible} + visible={visible} + onVisibleChange={handleTogglePopover} + title={popoverTitle} + destroyTooltipOnHide + > + {children} + </ControlPopover> + </> ); }; diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndAdhocFilterOption.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndAdhocFilterOption.tsx new file mode 100644 index 000000000000..2b9b72b459a1 --- /dev/null +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndAdhocFilterOption.tsx @@ -0,0 +1,78 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { t } from '@superset-ui/core'; +import { DndItemType } from 'src/explore/components/DndItemType'; +import AdhocFilterPopoverTrigger from 'src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger'; +import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter'; +import { OptionSortType } from 'src/explore/types'; +import { useGetTimeRangeLabel } from 'src/explore/components/controls/FilterControl/utils'; +import OptionWrapper from './OptionWrapper'; + +export interface DndAdhocFilterOptionProps { + adhocFilter: AdhocFilter; + onFilterEdit: (changedFilter: AdhocFilter) => void; + onClickClose: (index: number) => void; + onShiftOptions: (dragIndex: number, hoverIndex: number) => void; + options: OptionSortType[]; + datasource: Record<string, any>; + partitionColumn?: string; + index: number; +} + +export default function DndAdhocFilterOption({ + adhocFilter, + options, + datasource, + onFilterEdit, + onShiftOptions, + onClickClose, + partitionColumn, + index, +}: DndAdhocFilterOptionProps) { + const { actualTimeRange, title } = useGetTimeRangeLabel(adhocFilter); + + return ( + <AdhocFilterPopoverTrigger + key={index} + adhocFilter={adhocFilter} + options={options} + datasource={datasource} + onFilterEdit={onFilterEdit} + partitionColumn={partitionColumn} + > + <OptionWrapper + key={index} + index={index} + label={actualTimeRange ?? adhocFilter.getDefaultLabel()} + tooltipTitle={title ?? adhocFilter.getTooltipTitle()} + clickClose={onClickClose} + onShiftOptions={onShiftOptions} + type={DndItemType.FilterOption} + withCaret + isExtra={adhocFilter.isExtra} + datasourceWarningMessage={ + adhocFilter.datasourceWarning + ? t('This filter might be incompatible with current dataset') + : undefined + } + /> + </AdhocFilterPopoverTrigger> + ); +} diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.test.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.test.tsx index 37240d57caad..5cf5c59fd99f 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.test.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.test.tsx @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ +import { FeatureFlag } from '@superset-ui/core'; import React from 'react'; import { render, screen } from 'spec/helpers/testing-library'; import { @@ -27,18 +28,46 @@ const defaultProps: DndColumnSelectProps = { type: 'DndColumnSelect', name: 'Filter', onChange: jest.fn(), - options: { string: { column_name: 'Column A' } }, + options: [{ column_name: 'Column A' }], actions: { setControlValue: jest.fn() }, }; -test('renders with default props', () => { - render(<DndColumnSelect {...defaultProps} />, { useDnd: true }); - expect(screen.getByText('Drop columns here')).toBeInTheDocument(); +beforeAll(() => { + window.featureFlags = { [FeatureFlag.ENABLE_EXPLORE_DRAG_AND_DROP]: true }; }); -test('renders with value', () => { - render(<DndColumnSelect {...defaultProps} value="string" />, { +afterAll(() => { + window.featureFlags = {}; +}); + +test('renders with default props', async () => { + render(<DndColumnSelect {...defaultProps} />, { + useDnd: true, + useRedux: true, + }); + expect(await screen.findByText('Drop columns here')).toBeInTheDocument(); +}); + +test('renders with value', async () => { + render(<DndColumnSelect {...defaultProps} value="Column A" />, { useDnd: true, + useRedux: true, }); - expect(screen.getByText('Column A')).toBeInTheDocument(); + expect(await screen.findByText('Column A')).toBeInTheDocument(); +}); + +test('renders adhoc column', async () => { + render( + <DndColumnSelect + {...defaultProps} + value={{ + sqlExpression: 'Count *', + label: 'adhoc column', + expressionType: 'SQL', + }} + />, + { useDnd: true, useRedux: true }, + ); + expect(await screen.findByText('adhoc column')).toBeVisible(); + expect(screen.getByLabelText('calculator')).toBeVisible(); }); diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx index e7b25908cf11..071fdbd42443 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx @@ -23,24 +23,30 @@ import { isFeatureEnabled, tn, QueryFormColumn, + t, + isAdhocColumn, } from '@superset-ui/core'; -import { ColumnMeta, isColumnMeta } from '@superset-ui/chart-controls'; +import { + ColumnMeta, + isColumnMeta, + withDndFallback, +} from '@superset-ui/chart-controls'; import { isEmpty } from 'lodash'; import DndSelectLabel from 'src/explore/components/controls/DndColumnSelectControl/DndSelectLabel'; import OptionWrapper from 'src/explore/components/controls/DndColumnSelectControl/OptionWrapper'; import { OptionSelector } from 'src/explore/components/controls/DndColumnSelectControl/utils'; import { DatasourcePanelDndItem } from 'src/explore/components/DatasourcePanel/types'; import { DndItemType } from 'src/explore/components/DndItemType'; -import { useComponentDidUpdate } from 'src/hooks/useComponentDidUpdate'; import ColumnSelectPopoverTrigger from './ColumnSelectPopoverTrigger'; import { DndControlProps } from './types'; +import SelectControl from '../SelectControl'; export type DndColumnSelectProps = DndControlProps<QueryFormColumn> & { - options: Record<string, ColumnMeta>; + options: ColumnMeta[]; isTemporal?: boolean; }; -export function DndColumnSelect(props: DndColumnSelectProps) { +function DndColumnSelect(props: DndColumnSelectProps) { const { value, options, @@ -48,44 +54,20 @@ export function DndColumnSelect(props: DndColumnSelectProps) { onChange, canDelete = true, ghostButtonText, + clickEnabledGhostButtonText, name, label, isTemporal, } = props; const [newColumnPopoverVisible, setNewColumnPopoverVisible] = useState(false); - const optionSelector = useMemo( - () => new OptionSelector(options, multi, value), - [multi, options, value], - ); + const optionSelector = useMemo(() => { + const optionsMap = Object.fromEntries( + options.map(option => [option.column_name, option]), + ); - // synchronize values in case of dataset changes - const handleOptionsChange = useCallback(() => { - const optionSelectorValues = optionSelector.getValues(); - if (typeof value !== typeof optionSelectorValues) { - onChange(optionSelectorValues); - } - if ( - typeof value === 'string' && - typeof optionSelectorValues === 'string' && - value !== optionSelectorValues - ) { - onChange(optionSelectorValues); - } - if ( - Array.isArray(optionSelectorValues) && - Array.isArray(value) && - (optionSelectorValues.length !== value.length || - optionSelectorValues.every((val, index) => val === value[index])) - ) { - onChange(optionSelectorValues); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [JSON.stringify(value), JSON.stringify(optionSelector.getValues())]); - - // useComponentDidUpdate to avoid running this for the first render, to avoid - // calling onChange when the initial value is not valid for the dataset - useComponentDidUpdate(handleOptionsChange); + return new OptionSelector(optionsMap, multi, value); + }, [multi, options, value]); const onDrop = useCallback( (item: DatasourcePanelDndItem) => { @@ -126,15 +108,22 @@ export function DndColumnSelect(props: DndColumnSelectProps) { [onChange, optionSelector], ); - const popoverOptions = useMemo(() => Object.values(options), [options]); + const clickEnabled = useMemo( + () => isFeatureEnabled(FeatureFlag.ENABLE_DND_WITH_CLICK_UX), + [], + ); const valuesRenderer = useCallback( () => - optionSelector.values.map((column, idx) => - isFeatureEnabled(FeatureFlag.ENABLE_DND_WITH_CLICK_UX) ? ( + optionSelector.values.map((column, idx) => { + const datasourceWarningMessage = + isAdhocColumn(column) && column.datasourceWarning + ? t('This column might be incompatible with current dataset') + : undefined; + return clickEnabled ? ( <ColumnSelectPopoverTrigger key={idx} - columns={popoverOptions} + columns={options} onColumnEdit={newColumn => { if (isColumnMeta(newColumn)) { optionSelector.replace(idx, newColumn.column_name); @@ -154,6 +143,7 @@ export function DndColumnSelect(props: DndColumnSelectProps) { type={`${DndItemType.ColumnOption}_${name}_${label}`} canDelete={canDelete} column={column} + datasourceWarningMessage={datasourceWarningMessage} withCaret /> </ColumnSelectPopoverTrigger> @@ -166,18 +156,21 @@ export function DndColumnSelect(props: DndColumnSelectProps) { type={`${DndItemType.ColumnOption}_${name}_${label}`} canDelete={canDelete} column={column} + datasourceWarningMessage={datasourceWarningMessage} /> - ), - ), + ); + }), [ canDelete, + clickEnabled, + isTemporal, label, name, onChange, onClickClose, onShiftOptions, optionSelector, - popoverOptions, + options, ], ); @@ -205,15 +198,24 @@ export function DndColumnSelect(props: DndColumnSelectProps) { togglePopover(true); }, [togglePopover]); - const defaultGhostButtonText = isFeatureEnabled( - FeatureFlag.ENABLE_DND_WITH_CLICK_UX, - ) - ? tn( - 'Drop a column here or click', - 'Drop columns here or click', - multi ? 2 : 1, - ) - : tn('Drop column here', 'Drop columns here', multi ? 2 : 1); + const labelGhostButtonText = useMemo(() => { + if (clickEnabled) { + return ( + clickEnabledGhostButtonText ?? + ghostButtonText ?? + tn( + 'Drop a column here or click', + 'Drop columns here or click', + multi ? 2 : 1, + ) + ); + } + + return ( + ghostButtonText ?? + tn('Drop column here', 'Drop columns here', multi ? 2 : 1) + ); + }, [clickEnabled, clickEnabledGhostButtonText, ghostButtonText, multi]); return ( <div> @@ -223,16 +225,12 @@ export function DndColumnSelect(props: DndColumnSelectProps) { valuesRenderer={valuesRenderer} accept={DndItemType.Column} displayGhostButton={multi || optionSelector.values.length === 0} - ghostButtonText={ghostButtonText || defaultGhostButtonText} - onClickGhostButton={ - isFeatureEnabled(FeatureFlag.ENABLE_DND_WITH_CLICK_UX) - ? openPopover - : undefined - } + ghostButtonText={labelGhostButtonText} + onClickGhostButton={clickEnabled ? openPopover : undefined} {...props} /> <ColumnSelectPopoverTrigger - columns={popoverOptions} + columns={options} onColumnEdit={addNewColumnWithPopover} isControlledComponent togglePopover={togglePopover} @@ -245,3 +243,10 @@ export function DndColumnSelect(props: DndColumnSelectProps) { </div> ); } + +const DndColumnSelectWithFallback = withDndFallback( + DndColumnSelect, + SelectControl, +); + +export { DndColumnSelectWithFallback as DndColumnSelect }; diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.test.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.test.tsx index 7371d7bb488a..b6f6c6fb9c2f 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.test.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.test.tsx @@ -17,7 +17,19 @@ * under the License. */ import React from 'react'; -import { GenericDataType } from '@superset-ui/core'; +import thunk from 'redux-thunk'; +import { Provider } from 'react-redux'; +import configureStore from 'redux-mock-store'; + +import { + ensureIsArray, + FeatureFlag, + GenericDataType, + QueryFormData, +} from '@superset-ui/core'; +import { ColumnMeta } from '@superset-ui/chart-controls'; +import { TimeseriesDefaultFormData } from '@superset-ui/plugin-chart-echarts'; + import { render, screen } from 'spec/helpers/testing-library'; import AdhocMetric from 'src/explore/components/controls/MetricControl/AdhocMetric'; import AdhocFilter, { @@ -28,7 +40,6 @@ import { DndFilterSelectProps, } from 'src/explore/components/controls/DndColumnSelectControl/DndFilterSelect'; import { PLACEHOLDER_DATASOURCE } from 'src/dashboard/constants'; -import { TimeseriesDefaultFormData } from '@superset-ui/plugin-chart-echarts'; const defaultProps: DndFilterSelectProps = { type: 'DndFilterSelect', @@ -48,76 +59,113 @@ const baseFormData = { datasource: 'table__1', }; -test('renders with default props', () => { - render(<DndFilterSelect {...defaultProps} />, { useDnd: true }); - expect(screen.getByText('Drop columns or metrics here')).toBeInTheDocument(); +beforeAll(() => { + window.featureFlags = { [FeatureFlag.ENABLE_EXPLORE_DRAG_AND_DROP]: true }; +}); + +afterAll(() => { + window.featureFlags = {}; +}); + +const mockStore = configureStore([thunk]); +const store = mockStore({}); + +function setup({ + value = undefined, + formData = baseFormData, + columns = [], +}: { + value?: AdhocFilter; + formData?: QueryFormData; + columns?: ColumnMeta[]; +} = {}) { + return ( + <Provider store={store}> + <DndFilterSelect + {...defaultProps} + value={ensureIsArray(value)} + formData={formData} + columns={columns} + /> + </Provider> + ); +} + +test('renders with default props', async () => { + render(setup(), { useDnd: true }); + expect( + await screen.findByText('Drop columns or metrics here'), + ).toBeInTheDocument(); }); -test('renders with value', () => { +test('renders with value', async () => { const value = new AdhocFilter({ sqlExpression: 'COUNT(*)', expressionType: EXPRESSION_TYPES.SQL, }); - render(<DndFilterSelect {...defaultProps} value={[value]} />, { + render(setup({ value }), { useDnd: true, }); - expect(screen.getByText('COUNT(*)')).toBeInTheDocument(); + expect(await screen.findByText('COUNT(*)')).toBeInTheDocument(); }); -test('renders options with saved metric', () => { +test('renders options with saved metric', async () => { render( - <DndFilterSelect - {...defaultProps} - formData={{ + setup({ + formData: { ...baseFormData, ...TimeseriesDefaultFormData, metrics: ['saved_metric'], - }} - />, + }, + }), { useDnd: true, }, ); - expect(screen.getByText('Drop columns or metrics here')).toBeInTheDocument(); + expect( + await screen.findByText('Drop columns or metrics here'), + ).toBeInTheDocument(); }); -test('renders options with column', () => { +test('renders options with column', async () => { render( - <DndFilterSelect - {...defaultProps} - columns={[ + setup({ + columns: [ { id: 1, type: 'VARCHAR', type_generic: GenericDataType.STRING, column_name: 'Column', }, - ]} - />, + ], + }), { useDnd: true, }, ); - expect(screen.getByText('Drop columns or metrics here')).toBeInTheDocument(); + expect( + await screen.findByText('Drop columns or metrics here'), + ).toBeInTheDocument(); }); -test('renders options with adhoc metric', () => { +test('renders options with adhoc metric', async () => { const adhocMetric = new AdhocMetric({ expression: 'AVG(birth_names.num)', metric_name: 'avg__num', }); render( - <DndFilterSelect - {...defaultProps} - formData={{ + setup({ + formData: { ...baseFormData, ...TimeseriesDefaultFormData, metrics: [adhocMetric], - }} - />, + }, + }), { useDnd: true, }, ); - expect(screen.getByText('Drop columns or metrics here')).toBeInTheDocument(); + expect( + await screen.findByText('Drop columns or metrics here'), + ).toBeInTheDocument(); }); diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx index 4a08c214de8e..134678aa6fad 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx @@ -19,6 +19,7 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { FeatureFlag, + hasGenericChartAxes, isFeatureEnabled, logging, Metric, @@ -27,7 +28,13 @@ import { SupersetClient, t, } from '@superset-ui/core'; -import { ColumnMeta } from '@superset-ui/chart-controls'; +import { + ColumnMeta, + isColumnMeta, + isTemporalColumn, + withDndFallback, +} from '@superset-ui/chart-controls'; +import Modal from 'src/components/Modal'; import { OPERATOR_ENUM_TO_OPERATOR_TYPE, Operators, @@ -35,7 +42,6 @@ import { import { Datasource, OptionSortType } from 'src/explore/types'; import { OptionValueType } from 'src/explore/components/controls/DndColumnSelectControl/types'; import AdhocFilterPopoverTrigger from 'src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger'; -import OptionWrapper from 'src/explore/components/controls/DndColumnSelectControl/OptionWrapper'; import DndSelectLabel from 'src/explore/components/controls/DndColumnSelectControl/DndSelectLabel'; import AdhocFilter, { CLAUSES, @@ -49,6 +55,11 @@ import { } from 'src/explore/components/DatasourcePanel/types'; import { DndItemType } from 'src/explore/components/DndItemType'; import { ControlComponentProps } from 'src/explore/components/Control'; +import AdhocFilterControl from '../FilterControl/AdhocFilterControl'; +import DndAdhocFilterOption from './DndAdhocFilterOption'; +import { useDefaultTimeFilter } from '../DateFilterControl/utils'; + +const { warning } = Modal; const EMPTY_OBJECT = {}; const DND_ACCEPTED_TYPES = [ @@ -67,10 +78,19 @@ export interface DndFilterSelectProps savedMetrics: Metric[]; selectedMetrics: QueryFormMetric[]; datasource: Datasource; + canDelete?: ( + valueToBeDeleted: OptionValueType, + values: OptionValueType[], + ) => true | string; } -export const DndFilterSelect = (props: DndFilterSelectProps) => { - const { datasource, onChange = () => {}, name: controlName } = props; +const DndFilterSelect = (props: DndFilterSelectProps) => { + const { + datasource, + onChange = () => {}, + name: controlName, + canDelete, + } = props; const propsValues = Array.from(props.value ?? []); const [values, setValues] = useState( @@ -150,13 +170,12 @@ export const DndFilterSelect = (props: DndFilterSelectProps) => { endpoint: `/api/v1/database/${dbId}/table_extra/${name}/${schema}/`, }) .then(({ json }: { json: Record<string, any> }) => { - if (json && json.partitions) { + if (json?.partitions) { const { partitions } = json; // for now only show latest_partition option // when table datasource has only 1 partition key. if ( - partitions && - partitions.cols && + partitions?.cols && Object.keys(partitions.cols).length === 1 ) { setPartitionColumn(partitions.cols[0]); @@ -182,7 +201,7 @@ export const DndFilterSelect = (props: DndFilterSelectProps) => { ); }, [props.value]); - const onClickClose = useCallback( + const removeValue = useCallback( (index: number) => { const valuesCopy = [...values]; valuesCopy.splice(index, 1); @@ -192,6 +211,18 @@ export const DndFilterSelect = (props: DndFilterSelectProps) => { [onChange, values], ); + const onClickClose = useCallback( + (index: number) => { + const result = canDelete?.(values[index], values); + if (typeof result === 'string') { + warning({ title: t('Warning'), content: result }); + return; + } + removeValue(index); + }, + [canDelete, removeValue, values], + ); + const onShiftOptions = useCallback( (dragIndex: number, hoverIndex: number) => { const newValues = [...values]; @@ -222,14 +253,8 @@ export const DndFilterSelect = (props: DndFilterSelectProps) => { // via datasource saved metric if (filterOptions.saved_metric_name) { return new AdhocFilter({ - expressionType: - datasource.type === 'druid' - ? EXPRESSION_TYPES.SIMPLE - : EXPRESSION_TYPES.SQL, - subject: - datasource.type === 'druid' - ? filterOptions.saved_metric_name - : getMetricExpression(filterOptions.saved_metric_name), + expressionType: EXPRESSION_TYPES.SQL, + subject: getMetricExpression(filterOptions.saved_metric_name), operator: OPERATOR_ENUM_TO_OPERATOR_TYPE[Operators.GREATER_THAN].operation, operatorId: Operators.GREATER_THAN, @@ -240,14 +265,8 @@ export const DndFilterSelect = (props: DndFilterSelectProps) => { // has a custom label, meaning it's custom column if (filterOptions.label) { return new AdhocFilter({ - expressionType: - datasource.type === 'druid' - ? EXPRESSION_TYPES.SIMPLE - : EXPRESSION_TYPES.SQL, - subject: - datasource.type === 'druid' - ? filterOptions.label - : new AdhocMetric(option).translateToSql(), + expressionType: EXPRESSION_TYPES.SQL, + subject: new AdhocMetric(option).translateToSql(), operator: OPERATOR_ENUM_TO_OPERATOR_TYPE[Operators.GREATER_THAN].operation, operatorId: Operators.GREATER_THAN, @@ -308,32 +327,18 @@ export const DndFilterSelect = (props: DndFilterSelectProps) => { const valuesRenderer = useCallback( () => - values.map((adhocFilter: AdhocFilter, index: number) => { - const label = adhocFilter.getDefaultLabel(); - const tooltipTitle = adhocFilter.getTooltipTitle(); - return ( - <AdhocFilterPopoverTrigger - key={index} - adhocFilter={adhocFilter} - options={options} - datasource={datasource} - onFilterEdit={onFilterEdit} - partitionColumn={partitionColumn} - > - <OptionWrapper - key={index} - index={index} - label={label} - tooltipTitle={tooltipTitle} - clickClose={onClickClose} - onShiftOptions={onShiftOptions} - type={DndItemType.FilterOption} - withCaret - isExtra={adhocFilter.isExtra} - /> - </AdhocFilterPopoverTrigger> - ); - }), + values.map((adhocFilter: AdhocFilter, index: number) => ( + <DndAdhocFilterOption + index={index} + adhocFilter={adhocFilter} + options={options} + datasource={datasource} + onFilterEdit={onFilterEdit} + partitionColumn={partitionColumn} + onClickClose={onClickClose} + onShiftOptions={onShiftOptions} + /> + )), [ onClickClose, onFilterEdit, @@ -350,6 +355,7 @@ export const DndFilterSelect = (props: DndFilterSelectProps) => { togglePopover(true); }, [togglePopover]); + const defaultTimeFilter = useDefaultTimeFilter(); const adhocFilter = useMemo(() => { if (isSavedMetric(droppedItem)) { return new AdhocFilter({ @@ -372,6 +378,15 @@ export const DndFilterSelect = (props: DndFilterSelectProps) => { config.operator = OPERATOR_ENUM_TO_OPERATOR_TYPE[Operators.IN].operation; config.operatorId = Operators.IN; } + if ( + hasGenericChartAxes && + isColumnMeta(droppedItem) && + isTemporalColumn(droppedItem?.column_name, props.datasource) + ) { + config.operator = Operators.TEMPORAL_RANGE; + config.operatorId = Operators.TEMPORAL_RANGE; + config.comparator = defaultTimeFilter; + } return new AdhocFilter(config); }, [droppedItem]); @@ -413,9 +428,15 @@ export const DndFilterSelect = (props: DndFilterSelectProps) => { visible={newFilterPopoverVisible} togglePopover={togglePopover} closePopover={closePopover} - > - <div /> - </AdhocFilterPopoverTrigger> + requireSave={!!droppedItem} + /> </> ); }; + +const DndFilterSelectWithFallback = withDndFallback( + DndFilterSelect, + AdhocFilterControl, +); + +export { DndFilterSelectWithFallback as DndFilterSelect }; diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.test.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.test.tsx index e16c1d0d2557..80337344a2a1 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.test.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.test.tsx @@ -18,6 +18,7 @@ */ import React from 'react'; import userEvent from '@testing-library/user-event'; +import { FeatureFlag } from '@superset-ui/core'; import { render, screen, @@ -67,6 +68,14 @@ const adhocMetricB = { optionName: 'def', }; +beforeAll(() => { + window.featureFlags = { [FeatureFlag.ENABLE_EXPLORE_DRAG_AND_DROP]: true }; +}); + +afterAll(() => { + window.featureFlags = {}; +}); + test('renders with default props', () => { render(<DndMetricSelect {...defaultProps} />, { useDnd: true }); expect(screen.getByText('Drop column or metric here')).toBeInTheDocument(); @@ -124,6 +133,7 @@ test('remove selected custom metric when metric gets removed from dataset', () = ); expect(screen.getByText('metric_a')).toBeVisible(); expect(screen.queryByText('Metric B')).not.toBeInTheDocument(); + expect(screen.queryByText('metric_b')).not.toBeInTheDocument(); expect(screen.getByText('SUM(column_a)')).toBeVisible(); expect(screen.getByText('SUM(Column B)')).toBeVisible(); }); @@ -162,15 +172,6 @@ test('remove selected custom metric when metric gets removed from dataset for si ], }; - // rerender twice - first to update columns, second to update value - rerender( - <DndMetricSelect - {...newPropsWithRemovedMetric} - value={metricValue} - onChange={onChange} - multi={false} - />, - ); rerender( <DndMetricSelect {...newPropsWithRemovedMetric} @@ -211,15 +212,6 @@ test('remove selected adhoc metric when column gets removed from dataset', async ], }; - // rerender twice - first to update columns, second to update value - rerender( - <DndMetricSelect - {...newPropsWithRemovedColumn} - value={metricValues} - onChange={onChange} - multi - />, - ); rerender( <DndMetricSelect {...newPropsWithRemovedColumn} diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx index 0d9591a0c5ae..32a9c3756bb1 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx @@ -22,14 +22,15 @@ import { ensureIsArray, FeatureFlag, GenericDataType, + isAdhocMetricSimple, isFeatureEnabled, + isSavedMetric, Metric, QueryFormMetric, + t, tn, } from '@superset-ui/core'; -import { ColumnMeta } from '@superset-ui/chart-controls'; -import { isEqual } from 'lodash'; -import { usePrevious } from 'src/hooks/usePrevious'; +import { ColumnMeta, withDndFallback } from '@superset-ui/chart-controls'; import AdhocMetric from 'src/explore/components/controls/MetricControl/AdhocMetric'; import AdhocMetricPopoverTrigger from 'src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger'; import MetricDefinitionValue from 'src/explore/components/controls/MetricControl/MetricDefinitionValue'; @@ -41,28 +42,54 @@ import { DndItemType } from 'src/explore/components/DndItemType'; import DndSelectLabel from 'src/explore/components/controls/DndColumnSelectControl/DndSelectLabel'; import { savedMetricType } from 'src/explore/components/controls/MetricControl/types'; import { AGGREGATES } from 'src/explore/constants'; +import MetricsControl from '../MetricControl/MetricsControl'; const EMPTY_OBJECT = {}; const DND_ACCEPTED_TYPES = [DndItemType.Column, DndItemType.Metric]; -const isDictionaryForAdhocMetric = (value: any) => - value && !(value instanceof AdhocMetric) && value.expressionType; +const isDictionaryForAdhocMetric = (value: QueryFormMetric) => + value && + !(value instanceof AdhocMetric) && + typeof value !== 'string' && + value.expressionType; -const coerceAdhocMetrics = (value: any) => { - if (!value) { +const coerceMetrics = ( + addedMetrics: QueryFormMetric | QueryFormMetric[] | undefined | null, + savedMetrics: Metric[], + columns: ColumnMeta[], +) => { + if (!addedMetrics) { return []; } - if (!Array.isArray(value)) { - if (isDictionaryForAdhocMetric(value)) { - return [new AdhocMetric(value)]; + const metricsCompatibleWithDataset = ensureIsArray(addedMetrics).filter( + metric => { + if (isSavedMetric(metric)) { + return savedMetrics.some( + savedMetric => savedMetric.metric_name === metric, + ); + } + if (isAdhocMetricSimple(metric)) { + return columns.some( + column => column.column_name === metric.column.column_name, + ); + } + return true; + }, + ); + + return metricsCompatibleWithDataset.map(metric => { + if (!isDictionaryForAdhocMetric(metric)) { + return metric; } - return [value]; - } - return value.map(val => { - if (isDictionaryForAdhocMetric(val)) { - return new AdhocMetric(val); + if (isAdhocMetricSimple(metric)) { + const column = columns.find( + col => col.column_name === metric.column.column_name, + ); + if (column) { + return new AdhocMetric({ ...metric, column }); + } } - return val; + return new AdhocMetric(metric); }); }; @@ -80,53 +107,8 @@ const getOptionsForSavedMetrics = ( type ValueType = Metric | AdhocMetric | QueryFormMetric; -// TODO: use typeguards to distinguish saved metrics from adhoc metrics -const getMetricsMatchingCurrentDataset = ( - values: ValueType[], - columns: ColumnMeta[], - savedMetrics: (savedMetricType | Metric)[], - prevColumns: ColumnMeta[], - prevSavedMetrics: (savedMetricType | Metric)[], -): ValueType[] => { - const areSavedMetricsEqual = - !prevSavedMetrics || isEqual(prevSavedMetrics, savedMetrics); - const areColsEqual = !prevColumns || isEqual(prevColumns, columns); - - if (areColsEqual && areSavedMetricsEqual) { - return values; - } - return values.reduce((acc: ValueType[], metric) => { - if (typeof metric === 'string' || (metric as Metric).metric_name) { - if ( - areSavedMetricsEqual || - savedMetrics?.some( - savedMetric => - savedMetric.metric_name === metric || - savedMetric.metric_name === (metric as Metric).metric_name, - ) - ) { - acc.push(metric); - } - return acc; - } - - if (!areColsEqual) { - const newCol = columns?.find( - column => - (metric as AdhocMetric).column?.column_name === column.column_name, - ); - if (newCol) { - acc.push({ ...(metric as AdhocMetric), column: newCol }); - } - } else { - acc.push(metric); - } - return acc; - }, []); -}; - -export const DndMetricSelect = (props: any) => { - const { onChange, multi, columns, savedMetrics } = props; +const DndMetricSelect = (props: any) => { + const { onChange, multi } = props; const handleChange = useCallback( opts => { @@ -152,39 +134,20 @@ export const DndMetricSelect = (props: any) => { ); const [value, setValue] = useState<ValueType[]>( - coerceAdhocMetrics(props.value), + coerceMetrics(props.value, props.savedMetrics, props.columns), ); const [droppedItem, setDroppedItem] = useState< DatasourcePanelDndItem | typeof EMPTY_OBJECT >({}); const [newMetricPopoverVisible, setNewMetricPopoverVisible] = useState(false); - const prevColumns = usePrevious(columns); - const prevSavedMetrics = usePrevious(savedMetrics); useEffect(() => { - setValue(coerceAdhocMetrics(props.value)); - }, [JSON.stringify(props.value)]); - - useEffect(() => { - // Remove selected custom metrics that do not exist in the dataset anymore - // Remove selected adhoc metrics that use columns which do not exist in the dataset anymore - // Sync adhoc metrics with dataset columns when they are modified by the user - if (!props.value) { - return; - } - const propsValues = ensureIsArray(props.value); - const matchingMetrics = getMetricsMatchingCurrentDataset( - propsValues, - columns, - savedMetrics, - prevColumns, - prevSavedMetrics, - ); - - if (!isEqual(propsValues, matchingMetrics)) { - handleChange(matchingMetrics); - } - }, [columns, savedMetrics, handleChange]); + setValue(coerceMetrics(props.value, props.savedMetrics, props.columns)); + }, [ + JSON.stringify(props.value), + JSON.stringify(props.savedMetrics), + JSON.stringify(props.columns), + ]); const canDrop = useCallback( (item: DatasourcePanelDndItem) => { @@ -290,6 +253,11 @@ export const DndMetricSelect = (props: any) => { onDropLabel={handleDropLabel} type={`${DndItemType.AdhocMetricOption}_${props.name}_${props.label}`} multi={multi} + datasourceWarningMessage={ + option instanceof AdhocMetric && option.datasourceWarning + ? t('This metric might be incompatible with current dataset') + : undefined + } /> ), [ @@ -360,7 +328,7 @@ export const DndMetricSelect = (props: any) => { } return new AdhocMetric(config); } - return new AdhocMetric({ isNew: true }); + return new AdhocMetric({}); }, [droppedItem]); const ghostButtonText = isFeatureEnabled(FeatureFlag.ENABLE_DND_WITH_CLICK_UX) @@ -402,9 +370,17 @@ export const DndMetricSelect = (props: any) => { visible={newMetricPopoverVisible} togglePopover={togglePopover} closePopover={closePopover} + isNew > <div /> </AdhocMetricPopoverTrigger> </div> ); }; + +const DndMetricSelectWithFallback = withDndFallback( + DndMetricSelect, + MetricsControl, +); + +export { DndMetricSelectWithFallback as DndMetricSelect }; diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/Option.test.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/Option.test.tsx index 744fe03a0955..042cd73a763b 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/Option.test.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/Option.test.tsx @@ -21,47 +21,53 @@ import { render, screen } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; import Option from 'src/explore/components/controls/DndColumnSelectControl/Option'; -test('renders with default props', () => { +test('renders with default props', async () => { const { container } = render( <Option index={1} clickClose={jest.fn()}> Option </Option>, ); expect(container).toBeInTheDocument(); - expect(screen.getByRole('img', { name: 'x-small' })).toBeInTheDocument(); + expect( + await screen.findByRole('img', { name: 'x-small' }), + ).toBeInTheDocument(); expect( screen.queryByRole('img', { name: 'caret-right' }), ).not.toBeInTheDocument(); }); -test('renders with caret', () => { +test('renders with caret', async () => { render( <Option index={1} clickClose={jest.fn()} withCaret> Option </Option>, ); - expect(screen.getByRole('img', { name: 'x-small' })).toBeInTheDocument(); - expect(screen.getByRole('img', { name: 'caret-right' })).toBeInTheDocument(); + expect( + await screen.findByRole('img', { name: 'x-small' }), + ).toBeInTheDocument(); + expect( + await screen.findByRole('img', { name: 'caret-right' }), + ).toBeInTheDocument(); }); -test('renders with extra triangle', () => { +test('renders with extra triangle', async () => { render( <Option index={1} clickClose={jest.fn()} isExtra> Option </Option>, ); expect( - screen.getByRole('button', { name: 'Show info tooltip' }), + await screen.findByRole('button', { name: 'Show info tooltip' }), ).toBeInTheDocument(); }); -test('triggers onClose', () => { +test('triggers onClose', async () => { const clickClose = jest.fn(); render( <Option index={1} clickClose={clickClose}> Option </Option>, ); - userEvent.click(screen.getByRole('img', { name: 'x-small' })); + userEvent.click(await screen.findByRole('img', { name: 'x-small' })); expect(clickClose).toHaveBeenCalled(); }); diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/Option.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/Option.tsx index 3c7ee3c7c14b..3de910c1375f 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/Option.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/Option.tsx @@ -38,6 +38,7 @@ export default function Option({ clickClose, withCaret, isExtra, + datasourceWarningMessage, canDelete = true, }: OptionProps) { const theme = useTheme(); @@ -60,15 +61,18 @@ export default function Option({ </CloseContainer> )} <Label data-test="control-label">{children}</Label> - {isExtra && ( + {(!!datasourceWarningMessage || isExtra) && ( <StyledInfoTooltipWithTrigger icon="exclamation-triangle" placement="top" bsStyle="warning" - tooltip={t(` + tooltip={ + datasourceWarningMessage || + t(` This filter was inherited from the dashboard's context. It won't be saved when saving the chart. - `)} + `) + } /> )} {withCaret && ( diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.test.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.test.tsx index e237cea989a5..d7d362996fe1 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.test.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.test.tsx @@ -21,7 +21,7 @@ import { render, screen, fireEvent } from 'spec/helpers/testing-library'; import { DndItemType } from 'src/explore/components/DndItemType'; import OptionWrapper from 'src/explore/components/controls/DndColumnSelectControl/OptionWrapper'; -test('renders with default props', () => { +test('renders with default props', async () => { const { container } = render( <OptionWrapper index={1} @@ -33,10 +33,12 @@ test('renders with default props', () => { { useDnd: true }, ); expect(container).toBeInTheDocument(); - expect(screen.getByRole('img', { name: 'x-small' })).toBeInTheDocument(); + expect( + await screen.findByRole('img', { name: 'x-small' }), + ).toBeInTheDocument(); }); -test('triggers onShiftOptions on drop', () => { +test('triggers onShiftOptions on drop', async () => { const onShiftOptions = jest.fn(); render( <> @@ -58,7 +60,7 @@ test('triggers onShiftOptions on drop', () => { { useDnd: true }, ); - fireEvent.dragStart(screen.getByText('Option 1')); - fireEvent.drop(screen.getByText('Option 2')); + fireEvent.dragStart(await screen.findByText('Option 1')); + fireEvent.drop(await screen.findByText('Option 2')); expect(onShiftOptions).toHaveBeenCalled(); }); diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.tsx index 18cd57645eca..e2272288326a 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.tsx @@ -30,8 +30,8 @@ import { } from 'src/explore/components/controls/DndColumnSelectControl/types'; import { Tooltip } from 'src/components/Tooltip'; import { StyledColumnOption } from 'src/explore/components/optionRenderers'; -import { styled } from '@superset-ui/core'; -import { ColumnMeta, isAdhocColumn } from '@superset-ui/chart-controls'; +import { styled, isAdhocColumn } from '@superset-ui/core'; +import { ColumnMeta } from '@superset-ui/chart-controls'; import Option from './Option'; export const OptionLabel = styled.div` @@ -57,6 +57,7 @@ export default function OptionWrapper( clickClose, withCaret, isExtra, + datasourceWarningMessage, canDelete = true, ...rest } = props; @@ -176,6 +177,7 @@ export default function OptionWrapper( clickClose={clickClose} withCaret={withCaret} isExtra={isExtra} + datasourceWarningMessage={datasourceWarningMessage} canDelete={canDelete} > <Label /> diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/types.ts b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/types.ts index b2c9bd953b98..f1658b5ae3e0 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/types.ts +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/types.ts @@ -30,6 +30,7 @@ export interface OptionProps { clickClose: (index: number) => void; withCaret?: boolean; isExtra?: boolean; + datasourceWarningMessage?: string; canDelete?: boolean; } @@ -46,6 +47,7 @@ export type DndControlProps<ValueType extends JsonValue> = multi?: boolean; canDelete?: boolean; ghostButtonText?: string; + clickEnabledGhostButtonText?: string; onChange: (value: ValueType | ValueType[] | null | undefined) => void; }; diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/AdhocFilter.test.js b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/AdhocFilter.test.js index 2aa5fd160418..f3e08d7a28ae 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/AdhocFilter.test.js +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/AdhocFilter.test.js @@ -36,6 +36,7 @@ describe('AdhocFilter', () => { expressionType: EXPRESSION_TYPES.SIMPLE, subject: 'value', operator: '>', + datasourceWarning: false, comparator: '10', clause: CLAUSES.WHERE, filterOptionName: adhocFilter.filterOptionName, diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/index.js b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/index.js index 5b6278bde267..3b54a7dc1a7a 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/index.js +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/index.js @@ -62,7 +62,9 @@ function translateToSql(adhocMetric, { useSimple } = {}) { const { subject, comparator } = adhocMetric; const operator = adhocMetric.operator && - CUSTOM_OPERATIONS.indexOf(adhocMetric.operator) >= 0 + // 'LATEST PARTITION' supported callback only + adhocMetric.operator === + OPERATOR_ENUM_TO_OPERATOR_TYPE[Operators.LATEST_PARTITION].operation ? OPERATORS_TO_SQL[adhocMetric.operator](adhocMetric) : OPERATORS_TO_SQL[adhocMetric.operator]; return getSimpleSQLExpression(subject, operator, comparator); @@ -118,6 +120,7 @@ export default class AdhocFilter { } this.isExtra = !!adhocFilter.isExtra; this.isNew = !!adhocFilter.isNew; + this.datasourceWarning = !!adhocFilter.datasourceWarning; this.filterOptionName = adhocFilter.filterOptionName || diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx index 876eca1e75b4..c0750c7805d0 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx @@ -42,6 +42,7 @@ import { LabelsContainer, } from 'src/explore/components/controls/OptionControls'; import Icons from 'src/components/Icons'; +import Modal from 'src/components/Modal'; import AdhocFilterPopoverTrigger from 'src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger'; import AdhocFilterOption from 'src/explore/components/controls/FilterControl/AdhocFilterOption'; import AdhocFilter, { @@ -51,6 +52,8 @@ import AdhocFilter, { import adhocFilterType from 'src/explore/components/controls/FilterControl/adhocFilterType'; import columnType from 'src/explore/components/controls/FilterControl/columnType'; +const { warning } = Modal; + const selectedMetricType = PropTypes.oneOfType([ PropTypes.string, adhocMetricType, @@ -71,6 +74,7 @@ const propTypes = { PropTypes.arrayOf(selectedMetricType), ]), isLoading: PropTypes.bool, + canDelete: PropTypes.func, }; const defaultProps = { @@ -96,6 +100,7 @@ class AdhocFilterControl extends React.Component { this.onChange = this.onChange.bind(this); this.mapOption = this.mapOption.bind(this); this.getMetricExpression = this.getMetricExpression.bind(this); + this.removeFilter = this.removeFilter.bind(this); const filters = (this.props.value || []).map(filter => isDictionaryForAdhocFilter(filter) ? new AdhocFilter(filter) : filter, @@ -112,7 +117,10 @@ class AdhocFilterControl extends React.Component { sections={this.props.sections} operators={this.props.operators} datasource={this.props.datasource} - onRemoveFilter={() => this.onRemoveFilter(index)} + onRemoveFilter={e => { + e.stopPropagation(); + this.onRemoveFilter(index); + }} onMoveLabel={this.moveLabel} onDropLabel={() => this.props.onChange(this.state.values)} partitionColumn={this.state.partitionColumn} @@ -173,7 +181,7 @@ class AdhocFilterControl extends React.Component { } } - onRemoveFilter(index) { + removeFilter(index) { const valuesCopy = [...this.state.values]; valuesCopy.splice(index, 1); this.setState(prevState => ({ @@ -183,6 +191,17 @@ class AdhocFilterControl extends React.Component { this.props.onChange(valuesCopy); } + onRemoveFilter(index) { + const { canDelete } = this.props; + const { values } = this.state; + const result = canDelete?.(values[index], values); + if (typeof result === 'string') { + warning({ title: t('Warning'), content: result }); + return; + } + this.removeFilter(index); + } + onNewFilter(newFilter) { const mappedOption = this.mapOption(newFilter); if (mappedOption) { @@ -241,14 +260,8 @@ class AdhocFilterControl extends React.Component { // via datasource saved metric if (option.saved_metric_name) { return new AdhocFilter({ - expressionType: - this.props.datasource.type === 'druid' - ? EXPRESSION_TYPES.SIMPLE - : EXPRESSION_TYPES.SQL, - subject: - this.props.datasource.type === 'druid' - ? option.saved_metric_name - : this.getMetricExpression(option.saved_metric_name), + expressionType: EXPRESSION_TYPES.SQL, + subject: this.getMetricExpression(option.saved_metric_name), operator: OPERATOR_ENUM_TO_OPERATOR_TYPE[Operators.GREATER_THAN].operation, comparator: 0, @@ -258,14 +271,8 @@ class AdhocFilterControl extends React.Component { // has a custom label, meaning it's custom column if (option.label) { return new AdhocFilter({ - expressionType: - this.props.datasource.type === 'druid' - ? EXPRESSION_TYPES.SIMPLE - : EXPRESSION_TYPES.SQL, - subject: - this.props.datasource.type === 'druid' - ? option.label - : new AdhocMetric(option).translateToSql(), + expressionType: EXPRESSION_TYPES.SQL, + subject: new AdhocMetric(option).translateToSql(), operator: OPERATOR_ENUM_TO_OPERATOR_TYPE[Operators.GREATER_THAN].operation, comparator: 0, diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/AdhocFilterEditPopover.test.jsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/AdhocFilterEditPopover.test.jsx index 907d78ff6438..3fec073f9466 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/AdhocFilterEditPopover.test.jsx +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/AdhocFilterEditPopover.test.jsx @@ -122,7 +122,7 @@ describe('AdhocFilterEditPopover', () => { it('prevents saving if the filter is invalid', () => { const { wrapper } = setup(); - expect(wrapper.find(Button).find({ disabled: true })).not.toExist(); + expect(wrapper.find(Button).find({ disabled: true })).toExist(); wrapper .instance() .onAdhocFilterChange(simpleAdhocFilter.duplicateWith({ operator: null })); @@ -133,7 +133,6 @@ describe('AdhocFilterEditPopover', () => { it('highlights save if changes are present', () => { const { wrapper } = setup(); - expect(wrapper.find(Button).find({ buttonStyle: 'primary' })).not.toExist(); wrapper.instance().onAdhocFilterChange(sqlAdhocFilter); expect(wrapper.find(Button).find({ buttonStyle: 'primary' })).toExist(); }); diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx index 8ae706fc54de..98c6da8f1c00 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx @@ -19,7 +19,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import Button from 'src/components/Button'; -import { Tooltip } from 'src/components/Tooltip'; import { styled, t } from '@superset-ui/core'; import ErrorBoundary from 'src/components/ErrorBoundary'; @@ -53,6 +52,7 @@ const propTypes = { theme: PropTypes.object, sections: PropTypes.arrayOf(PropTypes.string), operators: PropTypes.arrayOf(PropTypes.string), + requireSave: PropTypes.bool, }; const ResizeIcon = styled.i` @@ -182,12 +182,14 @@ export default class AdhocFilterEditPopover extends React.Component { partitionColumn, theme, operators, + requireSave, ...popoverProps } = this.props; const { adhocFilter } = this.state; const stateIsValid = adhocFilter.isValid(); - const hasUnsavedChanges = !adhocFilter.equals(propsAdhocFilter); + const hasUnsavedChanges = + requireSave || !adhocFilter.equals(propsAdhocFilter); return ( <FilterPopoverContentContainer @@ -227,20 +229,7 @@ export default class AdhocFilterEditPopover extends React.Component { <Tabs.TabPane className="adhoc-filter-edit-tab" key={EXPRESSION_TYPES.SQL} - tab={ - datasource?.type === 'druid' ? ( - <Tooltip - title={t( - 'Custom SQL ad-hoc filters are not available for the native Druid connector', - )} - > - {t('Custom SQL')} - </Tooltip> - ) : ( - t('Custom SQL') - ) - } - disabled={datasource?.type === 'druid'} + tab={t('Custom SQL')} > <ErrorBoundary> <AdhocFilterEditPopoverSqlTabContent @@ -259,10 +248,12 @@ export default class AdhocFilterEditPopover extends React.Component { </Button> <Button data-test="adhoc-filter-edit-popover-save-button" - disabled={!stateIsValid || !this.state.isSimpleTabValid} - buttonStyle={ - hasUnsavedChanges && stateIsValid ? 'primary' : 'default' + disabled={ + !stateIsValid || + !this.state.isSimpleTabValid || + !hasUnsavedChanges } + buttonStyle="primary" buttonSize="small" className="m-r-5" onClick={this.onSave} diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/AdhocFilterEditPopoverSimpleTabContent.test.tsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/AdhocFilterEditPopoverSimpleTabContent.test.tsx index a34a77c44217..9d1b68bc6f75 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/AdhocFilterEditPopoverSimpleTabContent.test.tsx +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/AdhocFilterEditPopoverSimpleTabContent.test.tsx @@ -18,8 +18,12 @@ */ /* eslint-disable no-unused-expressions */ import React from 'react'; +import * as redux from 'react-redux'; import sinon from 'sinon'; import { shallow } from 'enzyme'; +import thunk from 'redux-thunk'; +import { Provider } from 'react-redux'; +import configureStore from 'redux-mock-store'; import AdhocFilter, { EXPRESSION_TYPES, @@ -37,6 +41,7 @@ import * as featureFlags from 'src/featureFlags'; import userEvent from '@testing-library/user-event'; import fetchMock from 'fetch-mock'; +import { TestDataset } from '@superset-ui/chart-controls'; import AdhocFilterEditPopoverSimpleTabContent, { useSimpleTabFilterProps, Props, @@ -99,10 +104,11 @@ const getAdvancedDataTypeTestProps = (overrides?: Record<string, any>) => { onChange, options: [{ type: 'DOUBLE', column_name: 'advancedDataType', id: 5 }], datasource: { - id: 'test-id', - columns: [], - type: 'postgres', - filter_select: false, + ...TestDataset, + ...{ + columns: [], + filter_select: false, + }, }, partitionColumn: 'test', ...overrides, @@ -114,15 +120,18 @@ const getAdvancedDataTypeTestProps = (overrides?: Record<string, any>) => { function setup(overrides?: Record<string, any>) { const onChange = sinon.spy(); const validHandler = sinon.spy(); + const spy = jest.spyOn(redux, 'useSelector'); + spy.mockReturnValue({}); const props = { adhocFilter: simpleAdhocFilter, onChange, options, datasource: { - id: 'test-id', - columns: [], - type: 'postgres', - filter_select: false, + ...TestDataset, + ...{ + columns: [], + filter_select: false, + }, }, partitionColumn: 'test', ...overrides, @@ -235,17 +244,9 @@ describe('AdhocFilterEditPopoverSimpleTabContent', () => { it('will filter operators for table datasources', () => { const { props } = setup({ datasource: { type: 'table' } }); const { isOperatorRelevant } = useSimpleTabFilterProps(props); - expect(isOperatorRelevant(Operators.REGEX, 'value')).toBe(false); expect(isOperatorRelevant(Operators.LIKE, 'value')).toBe(true); }); - it('will filter operators for druid datasources', () => { - const { props } = setup({ datasource: { type: 'druid' } }); - const { isOperatorRelevant } = useSimpleTabFilterProps(props); - expect(isOperatorRelevant(Operators.REGEX, 'value')).toBe(true); - expect(isOperatorRelevant(Operators.LIKE, 'value')).toBe(false); - }); - it('will show LATEST PARTITION operator', () => { const { props } = setup({ datasource: { @@ -380,14 +381,19 @@ fetchMock.get(ADVANCED_DATA_TYPE_ENDPOINT_INVALID, { values: [], }, }); +const mockStore = configureStore([thunk]); +const store = mockStore({}); describe('AdhocFilterEditPopoverSimpleTabContent Advanced data Type Test', () => { const setupFilter = async (props: Props) => { await act(async () => { render( - <ThemeProvider theme={supersetTheme}> - <AdhocFilterEditPopoverSimpleTabContent {...props} /> - </ThemeProvider>, + <Provider store={store}> + <ThemeProvider theme={supersetTheme}> + <AdhocFilterEditPopoverSimpleTabContent {...props} /> + </ThemeProvider> + , + </Provider>, ); }); }; diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx index cb432318bbc1..e65e25b9b375 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx @@ -19,12 +19,17 @@ import React, { useEffect, useState } from 'react'; import FormItem from 'src/components/Form/FormItem'; import { Select } from 'src/components'; -import { t, SupersetClient, SupersetTheme, styled } from '@superset-ui/core'; +import { + t, + SupersetClient, + SupersetTheme, + styled, + hasGenericChartAxes, + isDefined, +} from '@superset-ui/core'; import { Operators, OPERATORS_OPTIONS, - TABLE_ONLY_OPERATORS, - DRUID_ONLY_OPERATORS, HAVING_OPERATORS, MULTI_OPERATORS, CUSTOM_OPERATORS, @@ -41,7 +46,14 @@ import { Tooltip } from 'src/components/Tooltip'; import { Input } from 'src/components/Input'; import { optionLabel } from 'src/utils/common'; import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; +import { + ColumnMeta, + Dataset, + isTemporalColumn, +} from '@superset-ui/chart-controls'; import useAdvancedDataTypes from './useAdvancedDataTypes'; +import { useDatePickerInAdhocFilter } from '../utils'; +import { useDefaultTimeFilter } from '../../DateFilterControl/utils'; const StyledInput = styled(Input)` margin-bottom: ${({ theme }) => theme.gridUnit * 4}px; @@ -63,20 +75,9 @@ const SelectWithLabel = styled(Select)<{ labelText: string }>` } `; -export interface SimpleColumnType { - id: number; - column_name: string; - expression?: string; - type: string; - optionName?: string; - filterBy?: string; - value?: string; - advanced_data_type?: string; -} - export interface SimpleExpressionType { expressionType: keyof typeof EXPRESSION_TYPES; - column: SimpleColumnType; + column: ColumnMeta; aggregate: keyof typeof AGGREGATES; label: string; } @@ -91,7 +92,7 @@ export interface MetricColumnType { } export type ColumnType = - | SimpleColumnType + | ColumnMeta | SimpleExpressionType | SQLExpressionType | MetricColumnType; @@ -100,12 +101,7 @@ export interface Props { adhocFilter: AdhocFilter; onChange: (filter: AdhocFilter) => void; options: ColumnType[]; - datasource: { - id: string; - columns: SimpleColumnType[]; - type: string; - filter_select: boolean; - }; + datasource: Dataset; partitionColumn: string; operators?: Operators[]; validHandler: (isValid: boolean) => void; @@ -119,6 +115,8 @@ export interface AdvancedDataTypesState { } export const useSimpleTabFilterProps = (props: Props) => { + const defaultTimeFilter = useDefaultTimeFilter(); + const isOperatorRelevant = (operator: Operators, subject: string) => { const column = props.datasource.columns?.find( col => col.column_name === subject, @@ -129,10 +127,14 @@ export const useSimpleTabFilterProps = (props: Props) => { !!column && (column.type === 'INT' || column.type === 'INTEGER'); const isColumnFunction = !!column && !!column.expression; - if (operator && CUSTOM_OPERATORS.has(operator)) { + if (operator && operator === Operators.LATEST_PARTITION) { const { partitionColumn } = props; return partitionColumn && subject && subject === partitionColumn; } + if (operator && operator === Operators.TEMPORAL_RANGE) { + // hide the TEMPORAL_RANGE operator + return false; + } if (operator === Operators.IS_TRUE || operator === Operators.IS_FALSE) { return isColumnBoolean || isColumnNumber || isColumnFunction; } @@ -141,13 +143,9 @@ export const useSimpleTabFilterProps = (props: Props) => { operator === Operators.IS_NULL || operator === Operators.IS_NOT_NULL ); } - return !( - (props.datasource.type === 'druid' && - TABLE_ONLY_OPERATORS.indexOf(operator) >= 0) || - (props.datasource.type === 'table' && - DRUID_ONLY_OPERATORS.indexOf(operator) >= 0) || - (props.adhocFilter.clause === CLAUSES.HAVING && - HAVING_OPERATORS.indexOf(operator) === -1) + return ( + props.adhocFilter.clause !== CLAUSES.HAVING || + HAVING_OPERATORS.indexOf(operator) !== -1 ); }; const onSubjectChange = (id: string) => { @@ -165,21 +163,37 @@ export const useSimpleTabFilterProps = (props: Props) => { } else if (option && 'saved_metric_name' in option) { subject = option.saved_metric_name; clause = CLAUSES.HAVING; - } else if (option && option.label) { + } else if (option?.label) { subject = option.label; clause = CLAUSES.HAVING; } - const { operator, operatorId } = props.adhocFilter; + let { operator, operatorId, comparator } = props.adhocFilter; + operator = + operator && operatorId && isOperatorRelevant(operatorId, subject) + ? OPERATOR_ENUM_TO_OPERATOR_TYPE[operatorId].operation + : null; + if (!isDefined(operator)) { + // if operator is `null`, use the `IN` and reset the comparator. + operator = Operators.IN; + operatorId = Operators.IN; + comparator = undefined; + } + + if (hasGenericChartAxes && isTemporalColumn(id, props.datasource)) { + subject = id; + operator = Operators.TEMPORAL_RANGE; + operatorId = Operators.TEMPORAL_RANGE; + comparator = defaultTimeFilter; + } + props.onChange( props.adhocFilter.duplicateWith({ subject, clause, - operator: - operator && operatorId && isOperatorRelevant(operatorId, subject) - ? OPERATOR_ENUM_TO_OPERATOR_TYPE[operatorId].operation - : null, + operator, expressionType: EXPRESSION_TYPES.SIMPLE, operatorId, + comparator, }), ); }; @@ -238,12 +252,23 @@ export const useSimpleTabFilterProps = (props: Props) => { }), ); }; + const onDatePickerChange = (columnName: string, timeRange: string) => { + props.onChange( + props.adhocFilter.duplicateWith({ + subject: columnName, + operator: Operators.TEMPORAL_RANGE, + comparator: timeRange, + expressionType: EXPRESSION_TYPES.SIMPLE, + }), + ); + }; return { onSubjectChange, onOperatorChange, onComparatorChange, isOperatorRelevant, clearOperator, + onDatePickerChange, }; }; @@ -253,6 +278,7 @@ const AdhocFilterEditPopoverSimpleTabContent: React.FC<Props> = props => { onOperatorChange, isOperatorRelevant, onComparatorChange, + onDatePickerChange, } = useSimpleTabFilterProps(props); const [suggestions, setSuggestions] = useState< Record<'label' | 'value', any>[] @@ -317,23 +343,13 @@ const AdhocFilterEditPopoverSimpleTabContent: React.FC<Props> = props => { placeholder: '', }; - if (props.datasource.type === 'druid') { - subjectSelectProps.placeholder = t( - '%s column(s) and metric(s)', - columns.length, - ); - } else { - // we cannot support simple ad-hoc filters for metrics because we don't know what type - // the value should be cast to (without knowing the output type of the aggregate, which - // becomes a rather complicated problem) - subjectSelectProps.placeholder = - props.adhocFilter.clause === CLAUSES.WHERE - ? t('%s column(s)', columns.length) - : t('To filter on a metric, use Custom SQL tab.'); - columns = props.options.filter( - option => 'column_name' in option && option.column_name, - ); - } + subjectSelectProps.placeholder = + props.adhocFilter.clause === CLAUSES.WHERE + ? t('%s column(s)', columns.length) + : t('To filter on a metric, use Custom SQL tab.'); + columns = props.options.filter( + option => 'column_name' in option && option.column_name, + ); const operatorSelectProps = { placeholder: t( @@ -370,6 +386,16 @@ const AdhocFilterEditPopoverSimpleTabContent: React.FC<Props> = props => { const labelText = comparator && comparator.length > 0 && createSuggestionsPlaceholder(); + const datePicker = useDatePickerInAdhocFilter({ + columnName: props.adhocFilter.subject, + timeRange: + props.adhocFilter.operator === Operators.TEMPORAL_RANGE + ? props.adhocFilter.comparator + : undefined, + datasource: props.datasource, + onChange: onDatePickerChange, + }); + useEffect(() => { const refreshComparatorSuggestions = () => { const { datasource } = props; @@ -385,14 +411,16 @@ const AdhocFilterEditPopoverSimpleTabContent: React.FC<Props> = props => { setLoadingComparatorSuggestions(true); SupersetClient.get({ signal, - endpoint: `/superset/filter/${datasource.type}/${datasource.id}/${col}/`, + endpoint: `/api/v1/datasource/${datasource.type}/${datasource.id}/column/${col}/values/`, }) .then(({ json }) => { setSuggestions( - json.map((suggestion: null | number | boolean | string) => ({ - value: suggestion, - label: optionLabel(suggestion), - })), + json.result.map( + (suggestion: null | number | boolean | string) => ({ + value: suggestion, + label: optionLabel(suggestion), + }), + ), ); setLoadingComparatorSuggestions(false); }) @@ -402,7 +430,9 @@ const AdhocFilterEditPopoverSimpleTabContent: React.FC<Props> = props => { }); } }; - refreshComparatorSuggestions(); + if (!datePicker) { + refreshComparatorSuggestions(); + } }, [props.adhocFilter.subject]); useEffect(() => { @@ -427,31 +457,35 @@ const AdhocFilterEditPopoverSimpleTabContent: React.FC<Props> = props => { } }, [props.adhocFilter.comparator]); - return ( + // another name for columns, just for following previous naming. + const subjectComponent = ( + <Select + css={(theme: SupersetTheme) => ({ + marginTop: theme.gridUnit * 4, + marginBottom: theme.gridUnit * 4, + })} + data-test="select-element" + options={columns.map(column => ({ + value: + ('column_name' in column && column.column_name) || + ('optionName' in column && column.optionName) || + '', + label: + ('saved_metric_name' in column && column.saved_metric_name) || + ('column_name' in column && column.column_name) || + ('label' in column && column.label), + key: + ('id' in column && column.id) || + ('optionName' in column && column.optionName) || + undefined, + customLabel: renderSubjectOptionLabel(column), + }))} + {...subjectSelectProps} + /> + ); + + const operatorsAndOperandComponent = ( <> - <Select - css={(theme: SupersetTheme) => ({ - marginTop: theme.gridUnit * 4, - marginBottom: theme.gridUnit * 4, - })} - data-test="select-element" - options={columns.map(column => ({ - value: - ('column_name' in column && column.column_name) || - ('optionName' in column && column.optionName) || - '', - label: - ('saved_metric_name' in column && column.saved_metric_name) || - ('column_name' in column && column.column_name) || - ('label' in column && column.label), - key: - ('id' in column && column.id) || - ('optionName' in column && column.optionName) || - undefined, - customLabel: renderSubjectOptionLabel(column), - }))} - {...subjectSelectProps} - /> <Select css={(theme: SupersetTheme) => ({ marginBottom: theme.gridUnit * 4 })} options={(props.operators ?? OPERATORS_OPTIONS) @@ -501,6 +535,12 @@ const AdhocFilterEditPopoverSimpleTabContent: React.FC<Props> = props => { )} </> ); + return ( + <> + {subjectComponent} + {datePicker ?? operatorsAndOperandComponent} + </> + ); }; export default AdhocFilterEditPopoverSimpleTabContent; diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/AdhocFilterOption.test.tsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/AdhocFilterOption.test.tsx index 34ec66d087dd..8513f452e58d 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/AdhocFilterOption.test.tsx +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/AdhocFilterOption.test.tsx @@ -19,13 +19,11 @@ import React from 'react'; import { render, screen, waitFor } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; -import { HTML5Backend } from 'react-dnd-html5-backend'; -import { DndProvider } from 'react-dnd'; import AdhocFilter, { EXPRESSION_TYPES, CLAUSES, } from 'src/explore/components/controls/FilterControl/AdhocFilter'; -import AdhocFilterOption from '.'; +import AdhocFilterOption, { AdhocFilterOptionProps } from '.'; const simpleAdhocFilter = new AdhocFilter({ expressionType: EXPRESSION_TYPES.SIMPLE, @@ -44,48 +42,49 @@ const options = [ const mockedProps = { adhocFilter: simpleAdhocFilter, onFilterEdit: jest.fn(), + onRemoveFilter: jest.fn(), options, + sections: [], + operators: [], + datasource: {}, + partitionColumn: '', + onMoveLabel: jest.fn(), + onDropLabel: jest.fn(), + index: 1, }; -const setup = (props: { - adhocFilter: typeof simpleAdhocFilter; - onFilterEdit: () => void; - options: { - type: string; - column_name: string; - id: number; - }[]; -}) => ( - <DndProvider backend={HTML5Backend}> - <AdhocFilterOption {...props} /> - </DndProvider> +const setup = (props: AdhocFilterOptionProps) => ( + <AdhocFilterOption {...props} /> ); test('should render', async () => { - const { container } = render(setup(mockedProps)); + const { container } = render(setup(mockedProps), { + useDnd: true, + useRedux: true, + }); await waitFor(() => expect(container).toBeInTheDocument()); }); test('should render the control label', async () => { - render(setup(mockedProps)); + render(setup(mockedProps), { useDnd: true, useRedux: true }); expect(await screen.findByText('value > 10')).toBeInTheDocument(); }); test('should render the remove button', async () => { - render(setup(mockedProps)); + render(setup(mockedProps), { useDnd: true, useRedux: true }); const removeBtn = await screen.findByRole('button'); expect(removeBtn).toBeInTheDocument(); }); test('should render the right caret', async () => { - render(setup(mockedProps)); + render(setup(mockedProps), { useDnd: true, useRedux: true }); expect( await screen.findByRole('img', { name: 'caret-right' }), ).toBeInTheDocument(); }); test('should render the Popover on clicking the right caret', async () => { - render(setup(mockedProps)); + render(setup(mockedProps), { useDnd: true, useRedux: true }); const rightCaret = await screen.findByRole('img', { name: 'caret-right' }); userEvent.click(rightCaret); expect(screen.getByRole('tooltip')).toBeInTheDocument(); diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/index.jsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/index.jsx deleted file mode 100644 index c9f90b7b29a4..000000000000 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/index.jsx +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import PropTypes from 'prop-types'; -import adhocMetricType from 'src/explore/components/controls/MetricControl/adhocMetricType'; -import { OptionControlLabel } from 'src/explore/components/controls/OptionControls'; -import { DndItemType } from 'src/explore/components/DndItemType'; -import columnType from 'src/explore/components/controls/FilterControl/columnType'; -import AdhocFilterPopoverTrigger from 'src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger'; -import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter'; - -const propTypes = { - adhocFilter: PropTypes.instanceOf(AdhocFilter).isRequired, - onFilterEdit: PropTypes.func.isRequired, - onRemoveFilter: PropTypes.func, - options: PropTypes.arrayOf( - PropTypes.oneOfType([ - columnType, - PropTypes.shape({ saved_metric_name: PropTypes.string.isRequired }), - adhocMetricType, - ]), - ).isRequired, - sections: PropTypes.arrayOf(PropTypes.string), - operators: PropTypes.arrayOf(PropTypes.string), - datasource: PropTypes.object, - partitionColumn: PropTypes.string, - onMoveLabel: PropTypes.func, - onDropLabel: PropTypes.func, - index: PropTypes.number, -}; - -const AdhocFilterOption = ({ - adhocFilter, - options, - datasource, - onFilterEdit, - onRemoveFilter, - partitionColumn, - onMoveLabel, - onDropLabel, - index, - sections, - operators, -}) => ( - <AdhocFilterPopoverTrigger - sections={sections} - operators={operators} - adhocFilter={adhocFilter} - options={options} - datasource={datasource} - onFilterEdit={onFilterEdit} - partitionColumn={partitionColumn} - > - <OptionControlLabel - label={adhocFilter.getDefaultLabel()} - tooltipTitle={adhocFilter.getTooltipTitle()} - onRemove={onRemoveFilter} - onMoveLabel={onMoveLabel} - onDropLabel={onDropLabel} - index={index} - type={DndItemType.FilterOption} - withCaret - isExtra={adhocFilter.isExtra} - /> - </AdhocFilterPopoverTrigger> -); - -export default AdhocFilterOption; - -AdhocFilterOption.propTypes = propTypes; diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/index.tsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/index.tsx new file mode 100644 index 000000000000..a8bffe9dd5cf --- /dev/null +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterOption/index.tsx @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { OptionControlLabel } from 'src/explore/components/controls/OptionControls'; +import { DndItemType } from 'src/explore/components/DndItemType'; +import AdhocFilterPopoverTrigger from 'src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger'; +import AdhocFilter from 'src/explore/components/controls/FilterControl/AdhocFilter'; +import { OptionSortType } from 'src/explore/types'; +import { Operators } from 'src/explore/constants'; +import { useGetTimeRangeLabel } from '../utils'; + +export interface AdhocFilterOptionProps { + adhocFilter: AdhocFilter; + onFilterEdit: () => void; + onRemoveFilter: () => void; + options: OptionSortType[]; + sections: string[]; + operators: Operators[]; + datasource: Record<string, any>; + partitionColumn: string; + onMoveLabel: () => void; + onDropLabel: () => void; + index: number; +} + +export default function AdhocFilterOption({ + adhocFilter, + options, + datasource, + onFilterEdit, + onRemoveFilter, + partitionColumn, + onMoveLabel, + onDropLabel, + index, + sections, + operators, +}: AdhocFilterOptionProps) { + const { actualTimeRange, title } = useGetTimeRangeLabel(adhocFilter); + + return ( + <AdhocFilterPopoverTrigger + sections={sections} + operators={operators} + adhocFilter={adhocFilter} + options={options} + datasource={datasource} + onFilterEdit={onFilterEdit} + partitionColumn={partitionColumn} + > + <OptionControlLabel + label={actualTimeRange ?? adhocFilter.getDefaultLabel()} + tooltipTitle={title ?? adhocFilter.getTooltipTitle()} + onRemove={onRemoveFilter} + onMoveLabel={onMoveLabel} + onDropLabel={onDropLabel} + index={index} + type={DndItemType.FilterOption} + withCaret + isExtra={adhocFilter.isExtra} + /> + </AdhocFilterPopoverTrigger> + ); +} diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger/index.tsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger/index.tsx index 5dd6993c1201..931a69657dfb 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger/index.tsx +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger/index.tsx @@ -36,6 +36,7 @@ interface AdhocFilterPopoverTriggerProps { visible?: boolean; togglePopover?: (visible: boolean) => void; closePopover?: () => void; + requireSave?: boolean; } interface AdhocFilterPopoverTriggerState { @@ -96,6 +97,7 @@ class AdhocFilterPopoverTrigger extends React.PureComponent< sections={this.props.sections} operators={this.props.operators} onChange={this.props.onFilterEdit} + requireSave={this.props.requireSave} /> </ExplorePopoverContent> ); diff --git a/superset-frontend/src/explore/components/controls/FilterControl/utils/index.ts b/superset-frontend/src/explore/components/controls/FilterControl/utils/index.ts new file mode 100644 index 000000000000..f2d580c9785d --- /dev/null +++ b/superset-frontend/src/explore/components/controls/FilterControl/utils/index.ts @@ -0,0 +1,20 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +export { useGetTimeRangeLabel } from './useGetTimeRangeLabel'; +export { useDatePickerInAdhocFilter } from './useDatePickerInAdhocFilter'; diff --git a/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocFilter.tsx b/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocFilter.tsx new file mode 100644 index 000000000000..14e6544810b3 --- /dev/null +++ b/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocFilter.tsx @@ -0,0 +1,52 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; + +import { hasGenericChartAxes, t } from '@superset-ui/core'; +import { Dataset, isTemporalColumn } from '@superset-ui/chart-controls'; +import DateFilterControl from 'src/explore/components/controls/DateFilterControl/DateFilterLabel'; +import ControlHeader from 'src/explore/components/ControlHeader'; + +interface DatePickerInFilterProps { + columnName: string; + timeRange?: string; + datasource: Dataset; + onChange: (columnName: string, timeRange: string) => void; +} + +export const useDatePickerInAdhocFilter = ({ + columnName, + timeRange, + datasource, + onChange, +}: DatePickerInFilterProps): React.ReactElement | undefined => { + const onTimeRangeChange = (val: string) => onChange(columnName, val); + + return hasGenericChartAxes && isTemporalColumn(columnName, datasource) ? ( + <> + <ControlHeader label={t('Time Range')} /> + <DateFilterControl + value={timeRange} + name="time_range" + onChange={onTimeRangeChange} + overlayStyle="Modal" + /> + </> + ) : undefined; +}; diff --git a/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocfilter.test.ts b/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocfilter.test.ts new file mode 100644 index 000000000000..fdafba2d989c --- /dev/null +++ b/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocfilter.test.ts @@ -0,0 +1,64 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { renderHook } from '@testing-library/react-hooks'; +import { TestDataset } from '@superset-ui/chart-controls'; +import * as supersetCoreModule from '@superset-ui/core'; +import { useDatePickerInAdhocFilter } from './useDatePickerInAdhocFilter'; + +test('should return undefined if Generic Axis is disabled', () => { + Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', { + value: false, + }); + const { result } = renderHook(() => + useDatePickerInAdhocFilter({ + columnName: 'ds', + datasource: TestDataset, + onChange: jest.fn(), + }), + ); + expect(result.current).toBeUndefined(); +}); + +test('should return undefined if column is not temporal', () => { + Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', { + value: true, + }); + const { result } = renderHook(() => + useDatePickerInAdhocFilter({ + columnName: 'gender', + datasource: TestDataset, + onChange: jest.fn(), + }), + ); + expect(result.current).toBeUndefined(); +}); + +test('should return JSX', () => { + Object.defineProperty(supersetCoreModule, 'hasGenericChartAxes', { + value: true, + }); + const { result } = renderHook(() => + useDatePickerInAdhocFilter({ + columnName: 'ds', + datasource: TestDataset, + onChange: jest.fn(), + }), + ); + expect(result.current).not.toBeUndefined(); +}); diff --git a/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.test.ts b/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.test.ts new file mode 100644 index 000000000000..0d39ef8a2704 --- /dev/null +++ b/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.test.ts @@ -0,0 +1,103 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { renderHook } from '@testing-library/react-hooks'; +import { NO_TIME_RANGE } from '@superset-ui/core'; +import { Operators } from 'src/explore/constants'; +import * as FetchTimeRangeModule from 'src/explore/components/controls/DateFilterControl'; +import { useGetTimeRangeLabel } from './useGetTimeRangeLabel'; +import AdhocFilter, { CLAUSES, EXPRESSION_TYPES } from '../AdhocFilter'; + +test('should return empty object if operator is not TEMPORAL_RANGE', () => { + const adhocFilter = new AdhocFilter({ + expressionType: EXPRESSION_TYPES.SIMPLE, + subject: 'value', + operator: '>', + comparator: '10', + clause: CLAUSES.WHERE, + }); + const { result } = renderHook(() => useGetTimeRangeLabel(adhocFilter)); + expect(result.current).toEqual({}); +}); + +test('should return empty object if expressionType is SQL', () => { + const adhocFilter = new AdhocFilter({ + expressionType: EXPRESSION_TYPES.SQL, + subject: 'temporal column', + operator: Operators.TEMPORAL_RANGE, + comparator: 'Last week', + clause: CLAUSES.WHERE, + }); + const { result } = renderHook(() => useGetTimeRangeLabel(adhocFilter)); + expect(result.current).toEqual({}); +}); + +test('should get "No filter" label', () => { + const adhocFilter = new AdhocFilter({ + expressionType: EXPRESSION_TYPES.SIMPLE, + subject: 'temporal column', + operator: Operators.TEMPORAL_RANGE, + comparator: NO_TIME_RANGE, + clause: CLAUSES.WHERE, + }); + const { result } = renderHook(() => useGetTimeRangeLabel(adhocFilter)); + expect(result.current).toEqual({ + actualTimeRange: 'temporal column (No filter)', + title: 'No filter', + }); +}); + +test('should get actualTimeRange and title', async () => { + jest + .spyOn(FetchTimeRangeModule, 'fetchTimeRange') + .mockResolvedValue({ value: 'MOCK TIME' }); + + const adhocFilter = new AdhocFilter({ + expressionType: EXPRESSION_TYPES.SIMPLE, + subject: 'temporal column', + operator: Operators.TEMPORAL_RANGE, + comparator: 'Last week', + clause: CLAUSES.WHERE, + }); + + const { result } = await renderHook(() => useGetTimeRangeLabel(adhocFilter)); + expect(result.current).toEqual({ + actualTimeRange: 'MOCK TIME', + title: 'Last week', + }); +}); + +test('should get actualTimeRange and title when gets an error', async () => { + jest + .spyOn(FetchTimeRangeModule, 'fetchTimeRange') + .mockResolvedValue({ error: 'MOCK ERROR' }); + + const adhocFilter = new AdhocFilter({ + expressionType: EXPRESSION_TYPES.SIMPLE, + subject: 'temporal column', + operator: Operators.TEMPORAL_RANGE, + comparator: 'Last week', + clause: CLAUSES.WHERE, + }); + + const { result } = await renderHook(() => useGetTimeRangeLabel(adhocFilter)); + expect(result.current).toEqual({ + actualTimeRange: 'temporal column (Last week)', + title: 'MOCK ERROR', + }); +}); diff --git a/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.tsx b/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.tsx new file mode 100644 index 000000000000..abc2ad5b27c9 --- /dev/null +++ b/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.tsx @@ -0,0 +1,75 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { useEffect, useState } from 'react'; +import { NO_TIME_RANGE } from '@superset-ui/core'; +import { fetchTimeRange } from 'src/explore/components/controls/DateFilterControl'; +import { Operators } from 'src/explore/constants'; +import AdhocFilter, { EXPRESSION_TYPES } from '../AdhocFilter'; + +interface Results { + actualTimeRange?: string; + title?: string; +} + +export const useGetTimeRangeLabel = (adhocFilter: AdhocFilter): Results => { + const [actualTimeRange, setActualTimeRange] = useState<Results>({}); + + useEffect(() => { + if ( + adhocFilter.operator !== Operators.TEMPORAL_RANGE || + adhocFilter.expressionType !== EXPRESSION_TYPES.SIMPLE + ) { + setActualTimeRange({}); + } + if ( + adhocFilter.operator === Operators.TEMPORAL_RANGE && + adhocFilter.comparator === NO_TIME_RANGE + ) { + setActualTimeRange({ + actualTimeRange: `${adhocFilter.subject} (${NO_TIME_RANGE})`, + title: NO_TIME_RANGE, + }); + } + + if ( + adhocFilter.operator === Operators.TEMPORAL_RANGE && + adhocFilter.expressionType === EXPRESSION_TYPES.SIMPLE && + adhocFilter.comparator !== NO_TIME_RANGE && + actualTimeRange.title !== adhocFilter.comparator + ) { + fetchTimeRange(adhocFilter.comparator, adhocFilter.subject).then( + ({ value, error }) => { + if (error) { + setActualTimeRange({ + actualTimeRange: `${adhocFilter.subject} (${adhocFilter.comparator})`, + title: error, + }); + } else { + setActualTimeRange({ + actualTimeRange: value ?? '', + title: adhocFilter.comparator, + }); + } + }, + ); + } + }, [adhocFilter]); + + return actualTimeRange; +}; diff --git a/superset-frontend/src/explore/components/controls/FixedOrMetricControl/FixedOrMetricControl.test.tsx b/superset-frontend/src/explore/components/controls/FixedOrMetricControl/FixedOrMetricControl.test.tsx index 6a2efd59ab4d..f44b5a932f2a 100644 --- a/superset-frontend/src/explore/components/controls/FixedOrMetricControl/FixedOrMetricControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/FixedOrMetricControl/FixedOrMetricControl.test.tsx @@ -21,6 +21,13 @@ import { render, screen } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; import FixedOrMetricControl from '.'; +jest.mock( + 'src/components/Icons/Icon', + () => + ({ fileName }: { fileName: string }) => + <span role="img" aria-label={fileName.replace('_', '-')} />, +); + const createProps = () => ({ datasource: { columns: [{ column_name: 'Column A' }], diff --git a/superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx b/superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx index 545065319b77..2652c30f9e13 100644 --- a/superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx +++ b/superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx @@ -133,7 +133,7 @@ export default class FixedOrMetricControl extends React.Component { )} {this.state.type === controlTypes.metric && ( <span> - <span>metric: </span> + <span>{t('metric')}: </span> <strong> {this.state.metricValue ? this.state.metricValue.label diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetric.js b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetric.js index 5b29d7418c2f..752fc457b948 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetric.js +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetric.js @@ -75,7 +75,7 @@ export default class AdhocMetric { this.column = null; this.aggregate = null; } - this.isNew = !!adhocMetric.isNew; + this.datasourceWarning = !!adhocMetric.datasourceWarning; this.hasCustomLabel = !!(adhocMetric.hasCustomLabel && adhocMetric.label); this.label = this.hasCustomLabel ? adhocMetric.label @@ -124,9 +124,6 @@ export default class AdhocMetric { duplicateWith(nextFields) { return new AdhocMetric({ ...this, - // all duplicate metrics are not considered new by default - isNew: false, - // but still overriddable by nextFields ...nextFields, }); } diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetric.test.js b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetric.test.js index 336b194e0024..4edc21572f8e 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetric.test.js +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetric.test.js @@ -34,11 +34,11 @@ describe('AdhocMetric', () => { expressionType: EXPRESSION_TYPES.SIMPLE, column: valueColumn, aggregate: AGGREGATES.SUM, + datasourceWarning: false, label: 'SUM(value)', hasCustomLabel: false, optionName: adhocMetric.optionName, sqlExpression: null, - isNew: false, }); }); @@ -46,7 +46,6 @@ describe('AdhocMetric', () => { const adhocMetric1 = new AdhocMetric({ column: valueColumn, aggregate: AGGREGATES.SUM, - isNew: true, }); const adhocMetric2 = adhocMetric1.duplicateWith({ aggregate: AGGREGATES.AVG, @@ -57,10 +56,6 @@ describe('AdhocMetric', () => { expect(adhocMetric1.aggregate).toBe(AGGREGATES.SUM); expect(adhocMetric2.aggregate).toBe(AGGREGATES.AVG); - - // duplicated clone should not be new - expect(adhocMetric1.isNew).toBe(true); - expect(adhocMetric2.isNew).toStrictEqual(false); }); it('can verify equality', () => { diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/AdhocMetricEditPopover.test.jsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/AdhocMetricEditPopover.test.jsx index 1025131e4361..5fdd80e9d3f6 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/AdhocMetricEditPopover.test.jsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/AdhocMetricEditPopover.test.jsx @@ -98,7 +98,7 @@ describe('AdhocMetricEditPopover', () => { it('prevents saving if no column or aggregate is chosen', () => { const { wrapper } = setup(); - expect(wrapper.find(Button).find({ disabled: true })).not.toExist(); + expect(wrapper.find(Button).find({ disabled: false })).not.toExist(); wrapper.instance().onColumnChange(null); expect(wrapper.find(Button).find({ disabled: true })).toExist(); wrapper.instance().onColumnChange(columns[0].column_name); @@ -109,9 +109,9 @@ describe('AdhocMetricEditPopover', () => { it('highlights save if changes are present', () => { const { wrapper } = setup(); - expect(wrapper.find(Button).find({ buttonStyle: 'primary' })).not.toExist(); + expect(wrapper.find(Button).find({ disabled: true })).toExist(); wrapper.instance().onColumnChange(columns[1].column_name); - expect(wrapper.find(Button).find({ buttonStyle: 'primary' })).toExist(); + expect(wrapper.find(Button).find({ disabled: true })).not.toExist(); }); it('will initiate a drag when clicked', () => { diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/AdhocMetricEditPopover.test.tsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/AdhocMetricEditPopover.test.tsx index d665befcca6a..78add7781469 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/AdhocMetricEditPopover.test.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/AdhocMetricEditPopover.test.tsx @@ -18,7 +18,7 @@ */ import userEvent from '@testing-library/user-event'; import React from 'react'; -import { render, screen } from 'spec/helpers/testing-library'; +import { render, screen, waitFor, within } from 'spec/helpers/testing-library'; import AdhocMetric from 'src/explore/components/controls/MetricControl/AdhocMetric'; import AdhocMetricEditPopover from '.'; @@ -35,12 +35,17 @@ const createProps = () => ({ }, savedMetricsOptions: [ { - id: 65, + id: 64, metric_name: 'count', expression: 'COUNT(*)', }, + { + id: 65, + metric_name: 'sum', + expression: 'sum(num)', + }, ], - adhocMetric: new AdhocMetric({ isNew: true }), + adhocMetric: new AdhocMetric({}), datasource: { extra: '{}', type: 'table', @@ -80,18 +85,6 @@ test('Should render correct elements for SQL', () => { expect(screen.getByRole('tabpanel', { name: 'Saved' })).toBeVisible(); }); -test('Should render correct elements for native Druid', () => { - const props = { ...createProps(), datasource: { type: 'druid' } }; - render(<AdhocMetricEditPopover {...props} />); - expect(screen.getByRole('tab', { name: 'Custom SQL' })).toHaveAttribute( - 'aria-disabled', - 'true', - ); - expect(screen.getByRole('tab', { name: 'Simple' })).toBeEnabled(); - expect(screen.getByRole('tab', { name: 'Saved' })).toBeEnabled(); - expect(screen.getByRole('tabpanel', { name: 'Saved' })).toBeVisible(); -}); - test('Should render correct elements for allow ad-hoc metrics', () => { const props = { ...createProps(), @@ -130,25 +123,52 @@ test('Clicking on "Close" should call onClose', () => { expect(props.onClose).toBeCalledTimes(1); }); -test('Clicking on "Save" should call onChange and onClose', () => { +test('Clicking on "Save" should call onChange and onClose', async () => { const props = createProps(); render(<AdhocMetricEditPopover {...props} />); expect(props.onChange).toBeCalledTimes(0); expect(props.onClose).toBeCalledTimes(0); + userEvent.click( + screen.getByRole('combobox', { + name: 'Select saved metrics', + }), + ); + const sumOption = await waitFor(() => + within(document.querySelector('.rc-virtual-list')!).getByText('sum'), + ); + userEvent.click(sumOption); + userEvent.click(screen.getByRole('button', { name: 'Save' })); + expect(props.onChange).toBeCalledTimes(1); + expect(props.onClose).toBeCalledTimes(1); +}); + +test('Clicking on "Save" should not call onChange and onClose', () => { + const props = createProps(); + render(<AdhocMetricEditPopover {...props} />); + expect(props.onChange).toBeCalledTimes(0); + expect(props.onClose).toBeCalledTimes(0); + userEvent.click(screen.getByRole('button', { name: 'Save' })); + expect(props.onChange).toBeCalledTimes(0); + expect(props.onClose).toBeCalledTimes(0); +}); + +test('Clicking on "Save" should call onChange and onClose for new metric', () => { + const props = createProps(); + render(<AdhocMetricEditPopover {...props} isNewMetric />); + expect(props.onChange).toBeCalledTimes(0); + expect(props.onClose).toBeCalledTimes(0); + userEvent.click(screen.getByRole('button', { name: 'Save' })); + expect(props.onChange).toBeCalledTimes(1); + expect(props.onClose).toBeCalledTimes(1); +}); + +test('Clicking on "Save" should call onChange and onClose for new title', () => { + const props = createProps(); + render(<AdhocMetricEditPopover {...props} isLabelModified />); + expect(props.onChange).toBeCalledTimes(0); + expect(props.onClose).toBeCalledTimes(0); userEvent.click(screen.getByRole('button', { name: 'Save' })); expect(props.onChange).toBeCalledTimes(1); - expect(props.onChange).toBeCalledWith( - { - id: 64, - metric_name: 'count', - expression: 'COUNT(*)', - }, - { - id: 64, - metric_name: 'count', - expression: 'COUNT(*)', - }, - ); expect(props.onClose).toBeCalledTimes(1); }); diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx index decad4c12d5d..9ed817f28395 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx @@ -19,7 +19,13 @@ /* eslint-disable camelcase */ import React from 'react'; import PropTypes from 'prop-types'; -import { t, styled, ensureIsArray } from '@superset-ui/core'; +import { + isDefined, + t, + styled, + ensureIsArray, + DatasourceType, +} from '@superset-ui/core'; import Tabs from 'src/components/Tabs'; import Button from 'src/components/Button'; import { Select } from 'src/components'; @@ -55,11 +61,14 @@ const propTypes = { savedMetricsOptions: PropTypes.arrayOf(savedMetricType), savedMetric: savedMetricType, datasource: PropTypes.object, + isNewMetric: PropTypes.bool, + isLabelModified: PropTypes.bool, }; const defaultProps = { columns: [], getCurrentTab: noOp, + isNewMetric: false, }; const StyledSelect = styled(Select)` @@ -78,12 +87,7 @@ export const SAVED_TAB_KEY = 'SAVED'; export default class AdhocMetricEditPopover extends React.PureComponent { // "Saved" is a default tab unless there are no saved metrics for dataset - defaultActiveTabKey = - (this.props.savedMetric.metric_name || this.props.adhocMetric.isNew) && - Array.isArray(this.props.savedMetricsOptions) && - this.props.savedMetricsOptions.length > 0 - ? SAVED_TAB_KEY - : this.props.adhocMetric.expressionType; + defaultActiveTabKey = this.getDefaultTab(); constructor(props) { super(props); @@ -99,6 +103,7 @@ export default class AdhocMetricEditPopover extends React.PureComponent { this.onTabChange = this.onTabChange.bind(this); this.handleAceEditorRef = this.handleAceEditorRef.bind(this); this.refreshAceEditor = this.refreshAceEditor.bind(this); + this.getDefaultTab = this.getDefaultTab.bind(this); this.state = { adhocMetric: this.props.adhocMetric, @@ -106,7 +111,6 @@ export default class AdhocMetricEditPopover extends React.PureComponent { width: POPOVER_INITIAL_WIDTH, height: POPOVER_INITIAL_HEIGHT, }; - document.addEventListener('mouseup', this.onMouseUp); } @@ -137,6 +141,22 @@ export default class AdhocMetricEditPopover extends React.PureComponent { document.removeEventListener('mousemove', this.onMouseMove); } + getDefaultTab() { + const { adhocMetric, savedMetric, savedMetricsOptions, isNewMetric } = + this.props; + if (isDefined(adhocMetric.column) || isDefined(adhocMetric.sqlExpression)) { + return adhocMetric.expressionType; + } + if ( + (isNewMetric || savedMetric.metric_name) && + Array.isArray(savedMetricsOptions) && + savedMetricsOptions.length > 0 + ) { + return SAVED_TAB_KEY; + } + return adhocMetric.expressionType; + } + onSave() { const { adhocMetric, savedMetric } = this.state; @@ -279,6 +299,8 @@ export default class AdhocMetricEditPopover extends React.PureComponent { onClose, onResize, datasource, + isNewMetric, + isLabelModified, ...popoverProps } = this.props; const { adhocMetric, savedMetric } = this.state; @@ -323,17 +345,10 @@ export default class AdhocMetricEditPopover extends React.PureComponent { autoFocus: true, }; - if ( - this.props.datasource?.type === 'druid' && - aggregateSelectProps.options - ) { - aggregateSelectProps.options = aggregateSelectProps.options.filter( - aggregate => aggregate !== 'AVG', - ); - } - const stateIsValid = adhocMetric.isValid() || savedMetric?.metric_name; const hasUnsavedChanges = + isLabelModified || + isNewMetric || !adhocMetric.equals(propsAdhocMetric) || (!( typeof savedMetric?.metric_name === 'undefined' && @@ -379,7 +394,7 @@ export default class AdhocMetricEditPopover extends React.PureComponent { {...savedSelectProps} /> </FormItem> - ) : ( + ) : datasource.type === DatasourceType.Table ? ( <EmptyStateSmall image="empty.svg" title={t('No saved metrics found')} @@ -387,6 +402,26 @@ export default class AdhocMetricEditPopover extends React.PureComponent { 'Add metrics to dataset in "Edit datasource" modal', )} /> + ) : ( + <EmptyStateSmall + image="empty.svg" + title={t('No saved metrics found')} + description={ + <> + <span + tabIndex={0} + role="button" + onClick={() => { + this.props.handleDatasetModal(true); + this.props.onClose(); + }} + > + {t('Create a dataset')} + </span> + {t(' to add metrics')} + </> + } + /> )} </Tabs.TabPane> <Tabs.TabPane @@ -431,18 +466,11 @@ export default class AdhocMetricEditPopover extends React.PureComponent { <Tabs.TabPane key={EXPRESSION_TYPES.SQL} tab={ - extra.disallow_adhoc_metrics || - this.props.datasource?.type === 'druid' ? ( + extra.disallow_adhoc_metrics ? ( <Tooltip - title={ - this.props.datasource?.type === 'druid' - ? t( - 'Custom SQL ad-hoc metrics are not available for the native Druid connector', - ) - : t( - 'Custom SQL ad-hoc metrics are not enabled for this dataset', - ) - } + title={t( + 'Custom SQL ad-hoc metrics are not enabled for this dataset', + )} > {t('Custom SQL')} </Tooltip> @@ -451,10 +479,7 @@ export default class AdhocMetricEditPopover extends React.PureComponent { ) } data-test="adhoc-metric-edit-tab#custom" - disabled={ - extra.disallow_adhoc_metrics || - this.props.datasource?.type === 'druid' - } + disabled={extra.disallow_adhoc_metrics} > <SQLEditor data-test="sql-editor" @@ -486,10 +511,8 @@ export default class AdhocMetricEditPopover extends React.PureComponent { {t('Close')} </Button> <Button - disabled={!stateIsValid} - buttonStyle={ - hasUnsavedChanges && stateIsValid ? 'primary' : 'default' - } + disabled={!stateIsValid || !hasUnsavedChanges} + buttonStyle="primary" buttonSize="small" data-test="AdhocMetricEdit#save" onClick={this.onSave} diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.tsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.tsx index da6a2739c387..5bc8e530fb2e 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.tsx @@ -102,7 +102,7 @@ const AdhocMetricEditPopoverTitle: React.FC<AdhocMetricEditPopoverTitleProps> = } return ( - <Tooltip placement="top" title="Click to edit label"> + <Tooltip placement="top" title={t('Click to edit label')}> <span className="AdhocMetricEditPopoverTitle inline-editable" data-test="AdhocMetricEditTitle#trigger" diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.jsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.jsx index 352480f22220..80cf879f7f25 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.jsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.jsx @@ -38,6 +38,7 @@ const propTypes = { index: PropTypes.number, type: PropTypes.string, multi: PropTypes.bool, + datasourceWarningMessage: PropTypes.string, }; class AdhocMetricOption extends React.PureComponent { @@ -64,6 +65,7 @@ class AdhocMetricOption extends React.PureComponent { index, type, multi, + datasourceWarningMessage, } = this.props; return ( @@ -87,6 +89,7 @@ class AdhocMetricOption extends React.PureComponent { withCaret isFunction multi={multi} + datasourceWarningMessage={datasourceWarningMessage} /> </AdhocMetricPopoverTrigger> ); diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx index 273c83e7d265..f423c2651a3e 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx @@ -17,9 +17,14 @@ * under the License. */ import React, { ReactNode } from 'react'; -import { Datasource, Metric } from '@superset-ui/core'; +import { Metric, t } from '@superset-ui/core'; import AdhocMetricEditPopoverTitle from 'src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle'; import { ExplorePopoverContent } from 'src/explore/components/ExploreContentPopover'; +import { + ISaveableDatasource, + SaveDatasetModal, +} from 'src/SqlLab/components/SaveDatasetModal'; +import { Datasource } from 'src/explore/types'; import AdhocMetricEditPopover, { SAVED_TAB_KEY, } from './AdhocMetricEditPopover'; @@ -33,12 +38,13 @@ export type AdhocMetricPopoverTriggerProps = { columns: { column_name: string; type: string }[]; savedMetricsOptions: savedMetricType[]; savedMetric: savedMetricType; - datasource?: Datasource; + datasource: Datasource & ISaveableDatasource; children: ReactNode; isControlledComponent?: boolean; visible?: boolean; togglePopover?: (visible: boolean) => void; closePopover?: () => void; + isNew?: boolean; }; export type AdhocMetricPopoverTriggerState = { @@ -48,6 +54,7 @@ export type AdhocMetricPopoverTriggerState = { currentLabel: string; labelModified: boolean; isTitleEditDisabled: boolean; + showSaveDatasetModal: boolean; }; class AdhocMetricPopoverTrigger extends React.PureComponent< @@ -63,6 +70,7 @@ class AdhocMetricPopoverTrigger extends React.PureComponent< this.getCurrentTab = this.getCurrentTab.bind(this); this.getCurrentLabel = this.getCurrentLabel.bind(this); this.onChange = this.onChange.bind(this); + this.handleDatasetModal = this.handleDatasetModal.bind(this); this.state = { adhocMetric: props.adhocMetric, @@ -74,6 +82,7 @@ class AdhocMetricPopoverTrigger extends React.PureComponent< currentLabel: '', labelModified: false, isTitleEditDisabled: false, + showSaveDatasetModal: false, }; } @@ -119,6 +128,10 @@ class AdhocMetricPopoverTrigger extends React.PureComponent< this.forceUpdate(); } + handleDatasetModal(showModal: boolean) { + this.setState({ showSaveDatasetModal: showModal }); + } + closePopover() { this.togglePopover(false); this.setState({ @@ -205,11 +218,17 @@ class AdhocMetricPopoverTrigger extends React.PureComponent< savedMetricsOptions={savedMetricsOptions} savedMetric={savedMetric} datasource={datasource} + handleDatasetModal={this.handleDatasetModal} onResize={this.onPopoverResize} onClose={closePopover} onChange={this.onChange} getCurrentTab={this.getCurrentTab} getCurrentLabel={this.getCurrentLabel} + isNewMetric={this.props.isNew} + isLabelModified={ + this.state.labelModified && + adhocMetricLabel !== this.state.title.label + } /> </ExplorePopoverContent> ); @@ -223,18 +242,32 @@ class AdhocMetricPopoverTrigger extends React.PureComponent< ); return ( - <ControlPopover - placement="right" - trigger="click" - content={overlayContent} - defaultVisible={visible} - visible={visible} - onVisibleChange={togglePopover} - title={popoverTitle} - destroyTooltipOnHide - > - {this.props.children} - </ControlPopover> + <> + {this.state.showSaveDatasetModal && ( + <SaveDatasetModal + visible={this.state.showSaveDatasetModal} + onHide={() => this.handleDatasetModal(false)} + buttonTextOnSave={t('Save')} + buttonTextOnOverwrite={t('Overwrite')} + modalDescription={t( + 'Save this query as a virtual dataset to continue exploring', + )} + datasource={datasource} + /> + )} + <ControlPopover + placement="right" + trigger="click" + content={overlayContent} + defaultVisible={visible} + visible={visible} + onVisibleChange={togglePopover} + title={popoverTitle} + destroyTooltipOnHide + > + {this.props.children} + </ControlPopover> + </> ); } } diff --git a/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.jsx b/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.jsx index 0b5f5de0acca..67d9d6e4d231 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.jsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.jsx @@ -35,6 +35,7 @@ const propTypes = { savedMetricsOptions: PropTypes.arrayOf(savedMetricType), multi: PropTypes.bool, datasource: PropTypes.object, + datasourceWarningMessage: PropTypes.string, }; export default function MetricDefinitionValue({ @@ -50,6 +51,7 @@ export default function MetricDefinitionValue({ index, type, multi, + datasourceWarningMessage, }) { const getSavedMetricByName = metricName => savedMetrics.find(metric => metric.metric_name === metricName); @@ -63,7 +65,7 @@ export default function MetricDefinitionValue({ if (option instanceof AdhocMetric || savedMetric) { const adhocMetric = - option instanceof AdhocMetric ? option : new AdhocMetric({ isNew: true }); + option instanceof AdhocMetric ? option : new AdhocMetric({}); const metricOptionProps = { onMetricEdit, @@ -78,6 +80,7 @@ export default function MetricDefinitionValue({ savedMetric: savedMetric ?? {}, type, multi, + datasourceWarningMessage, }; return <AdhocMetricOption {...metricOptionProps} />; diff --git a/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.jsx b/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.jsx index 853ca90294b1..617be7112bdf 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.jsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.jsx @@ -217,10 +217,7 @@ const MetricsControl = ({ [propsValue, savedMetrics], ); - const newAdhocMetric = useMemo( - () => new AdhocMetric({ isNew: true }), - [value], - ); + const newAdhocMetric = useMemo(() => new AdhocMetric({}), [value]); const addNewMetricPopoverTrigger = useCallback( trigger => { if (isAddNewMetricDisabled()) { @@ -234,6 +231,7 @@ const MetricsControl = ({ savedMetricsOptions={savedMetricOptions} savedMetric={emptySavedMetric} datasource={datasource} + isNew > {trigger} </AdhocMetricPopoverTrigger> diff --git a/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.test.jsx b/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.test.jsx index c255e6a62b53..12a19c5cdf79 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.test.jsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.test.jsx @@ -100,7 +100,6 @@ describe.skip('MetricsControl', () => { hasCustomLabel: false, optionName: 'blahblahblah', sqlExpression: null, - isNew: false, }, ]); }); diff --git a/superset-frontend/src/explore/components/controls/MetricControl/savedMetricType.js b/superset-frontend/src/explore/components/controls/MetricControl/savedMetricType.js index c57831aa9332..3c9a987bd199 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/savedMetricType.js +++ b/superset-frontend/src/explore/components/controls/MetricControl/savedMetricType.js @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; export default PropTypes.shape({ - metric_name: PropTypes.string.isRequired, + metric_name: PropTypes.string, verbose_name: PropTypes.string, - expression: PropTypes.string.isRequired, + expression: PropTypes.string, }); diff --git a/superset-frontend/src/explore/components/controls/OptionControls/index.tsx b/superset-frontend/src/explore/components/controls/OptionControls/index.tsx index 74ec85dc143b..90ae73c6370a 100644 --- a/superset-frontend/src/explore/components/controls/OptionControls/index.tsx +++ b/superset-frontend/src/explore/components/controls/OptionControls/index.tsx @@ -179,6 +179,7 @@ export const OptionControlLabel = ({ type, index, isExtra, + datasourceWarningMessage, tooltipTitle, multi = true, ...props @@ -195,7 +196,8 @@ export const OptionControlLabel = ({ type: string; index: number; isExtra?: boolean; - tooltipTitle: string; + datasourceWarningMessage?: string; + tooltipTitle?: string; multi?: boolean; }) => { const theme = useTheme(); @@ -314,15 +316,18 @@ export const OptionControlLabel = ({ {isFunction && <Icons.FieldDerived />} {getLabelContent()} </Label> - {isExtra && ( + {(!!datasourceWarningMessage || isExtra) && ( <StyledInfoTooltipWithTrigger icon="exclamation-triangle" placement="top" bsStyle="warning" - tooltip={t(` + tooltip={ + datasourceWarningMessage || + t(` This filter was inherited from the dashboard's context. It won't be saved when saving the chart. - `)} + `) + } /> )} {withCaret && ( diff --git a/superset-frontend/src/explore/components/controls/SelectAsyncControl/SelectAsyncControl.test.tsx b/superset-frontend/src/explore/components/controls/SelectAsyncControl/SelectAsyncControl.test.tsx index bc7843485081..80bdc78babff 100644 --- a/superset-frontend/src/explore/components/controls/SelectAsyncControl/SelectAsyncControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/SelectAsyncControl/SelectAsyncControl.test.tsx @@ -65,17 +65,17 @@ beforeEach(() => { jest.resetAllMocks(); }); -test('Should render', () => { +test('Should render', async () => { const props = createProps(); render(<SelectAsyncControl {...props} />, { useRedux: true }); - expect(screen.getByTestId('select-test')).toBeInTheDocument(); + expect(await screen.findByTestId('select-test')).toBeInTheDocument(); }); -test('Should send correct props to Select component - value props', () => { +test('Should send correct props to Select component - value props', async () => { const props = createProps(); render(<SelectAsyncControl {...props} />, { useRedux: true }); - expect(screen.getByTestId('select-test')).toHaveAttribute( + expect(await screen.findByTestId('select-test')).toHaveAttribute( 'data-value', JSON.stringify(props.value), ); @@ -89,20 +89,20 @@ test('Should send correct props to Select component - value props', () => { ); }); -test('Should send correct props to Select component - function onChange multi:true', () => { +test('Should send correct props to Select component - function onChange multi:true', async () => { const props = createProps(); render(<SelectAsyncControl {...props} />, { useRedux: true }); expect(props.onChange).toBeCalledTimes(0); - userEvent.click(screen.getByText('onChange')); + userEvent.click(await screen.findByText('onChange')); expect(props.onChange).toBeCalledTimes(1); }); -test('Should send correct props to Select component - function onChange multi:false', () => { +test('Should send correct props to Select component - function onChange multi:false', async () => { const props = createProps(); render(<SelectAsyncControl {...{ ...props, multi: false }} />, { useRedux: true, }); expect(props.onChange).toBeCalledTimes(0); - userEvent.click(screen.getByText('onChange')); + userEvent.click(await screen.findByText('onChange')); expect(props.onChange).toBeCalledTimes(1); }); diff --git a/superset-frontend/src/explore/components/controls/SelectAsyncControl/index.tsx b/superset-frontend/src/explore/components/controls/SelectAsyncControl/index.tsx index 66d9fb154eb8..ddc242a76495 100644 --- a/superset-frontend/src/explore/components/controls/SelectAsyncControl/index.tsx +++ b/superset-frontend/src/explore/components/controls/SelectAsyncControl/index.tsx @@ -20,7 +20,7 @@ import React, { useEffect, useState } from 'react'; import { t, SupersetClient } from '@superset-ui/core'; import ControlHeader from 'src/explore/components/ControlHeader'; import { Select } from 'src/components'; -import { SelectProps, OptionsType } from 'src/components/Select/Select'; +import { SelectOptionsType, SelectProps } from 'src/components/Select/types'; import { SelectValue, LabeledValue } from 'antd/lib/select'; import withToasts from 'src/components/MessageToasts/withToasts'; import { getClientErrorObject } from 'src/utils/getClientErrorObject'; @@ -32,7 +32,7 @@ interface SelectAsyncControlProps extends SelectAsyncProps { ariaLabel?: string; dataEndpoint: string; default?: SelectValue; - mutator?: (response: Record<string, any>) => OptionsType; + mutator?: (response: Record<string, any>) => SelectOptionsType; multi?: boolean; onChange: (val: SelectValue) => void; // ControlHeader related props @@ -57,7 +57,7 @@ const SelectAsyncControl = ({ value, ...props }: SelectAsyncControlProps) => { - const [options, setOptions] = useState<OptionsType>([]); + const [options, setOptions] = useState<SelectOptionsType>([]); const handleOnChange = (val: SelectValue) => { let onChangeVal = val; diff --git a/superset-frontend/src/explore/components/controls/SelectControl.jsx b/superset-frontend/src/explore/components/controls/SelectControl.jsx index c641377f202b..b686e3d9e637 100644 --- a/superset-frontend/src/explore/components/controls/SelectControl.jsx +++ b/superset-frontend/src/explore/components/controls/SelectControl.jsx @@ -27,7 +27,7 @@ const propTypes = { autoFocus: PropTypes.bool, choices: PropTypes.array, clearable: PropTypes.bool, - description: PropTypes.string, + description: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), disabled: PropTypes.bool, freeForm: PropTypes.bool, isLoading: PropTypes.bool, @@ -225,7 +225,6 @@ export default class SelectControl extends React.PureComponent { name, placeholder, onFocus, - optionRenderer, showHeader, value, tokenSeparators, @@ -300,7 +299,6 @@ export default class SelectControl extends React.PureComponent { name: `select-${name}`, onChange: this.onChange, onFocus, - optionRenderer, options: this.state.options, placeholder, sortComparator: this.props.sortComparator, diff --git a/superset-frontend/src/explore/components/controls/SelectControl.test.jsx b/superset-frontend/src/explore/components/controls/SelectControl.test.jsx index 7307a4d515d9..1a004ee71a37 100644 --- a/superset-frontend/src/explore/components/controls/SelectControl.test.jsx +++ b/superset-frontend/src/explore/components/controls/SelectControl.test.jsx @@ -21,9 +21,7 @@ import React from 'react'; import sinon from 'sinon'; import { shallow } from 'enzyme'; import { Select as SelectComponent } from 'src/components'; -import { Select as DeprecatedSelect } from 'src/components/Select/DeprecatedSelect'; import SelectControl from 'src/explore/components/controls/SelectControl'; -import ControlHeader from 'src/explore/components/ControlHeader'; import { styledMount as mount } from 'spec/helpers/theming'; const defaultProps = { @@ -62,20 +60,6 @@ describe('SelectControl', () => { expect(wrapper.find(SelectComponent)).toExist(); }); - it('renders with DeprecatedSelect & ControlHeader when deprecatedSelectFlag=true', () => { - wrapper.setProps({ deprecatedSelectFlag: true }); - expect(wrapper.find(SelectComponent)).not.toExist(); - expect(wrapper.find(DeprecatedSelect)).toExist(); - expect(wrapper.find(ControlHeader)).toExist(); - }); - - it('renders with Select when deprecatedSelectFlag=false', () => { - wrapper.setProps({ deprecatedSelectFlag: false }); - expect(wrapper.find(SelectComponent)).toExist(); - expect(wrapper.find(DeprecatedSelect)).not.toExist(); - expect(wrapper.find(ControlHeader)).not.toExist(); - }); - it('renders as mode multiple', () => { wrapper.setProps({ multi: true }); expect(wrapper.find(SelectComponent)).toExist(); diff --git a/superset-frontend/src/explore/components/controls/SpatialControl.jsx b/superset-frontend/src/explore/components/controls/SpatialControl.jsx index 77c8279de084..9528e665363d 100644 --- a/superset-frontend/src/explore/components/controls/SpatialControl.jsx +++ b/superset-frontend/src/explore/components/controls/SpatialControl.jsx @@ -171,11 +171,11 @@ export default class SpatialControl extends React.Component { > <Row gutter={16}> <Col xs={24} md={12}> - Longitude + {t('Longitude')} {this.renderSelect('lonCol', spatialTypes.latlong)} </Col> <Col xs={24} md={12}> - Latitude + {t('Latitude')} {this.renderSelect('latCol', spatialTypes.latlong)} </Col> </Row> @@ -206,7 +206,7 @@ export default class SpatialControl extends React.Component { > <Row gutter={16}> <Col xs={24} md={12}> - Column + {t('Column')} {this.renderSelect('geohashCol', spatialTypes.geohash)} </Col> <Col xs={24} md={12}> diff --git a/superset-frontend/src/explore/components/controls/TextAreaControl.jsx b/superset-frontend/src/explore/components/controls/TextAreaControl.jsx index e371061fbe55..48582c4bc757 100644 --- a/superset-frontend/src/explore/components/controls/TextAreaControl.jsx +++ b/superset-frontend/src/explore/components/controls/TextAreaControl.jsx @@ -45,6 +45,16 @@ const propTypes = { ]), aboveEditorSection: PropTypes.node, readOnly: PropTypes.bool, + resize: PropTypes.oneOf([ + null, + 'block', + 'both', + 'horizontal', + 'inline', + 'none', + 'vertical', + ]), + textAreaStyles: PropTypes.object, }; const defaultProps = { @@ -55,6 +65,8 @@ const defaultProps = { maxLines: 10, offerEditInModal: true, readOnly: false, + resize: null, + textAreaStyles: {}, }; class TextAreaControl extends React.Component { @@ -72,18 +84,23 @@ class TextAreaControl extends React.Component { if (this.props.language) { const style = { border: `1px solid ${this.props.theme.colors.grayscale.light1}`, + minHeight: `${minLines}em`, + width: 'auto', + ...this.props.textAreaStyles, }; + if (this.props.resize) { + style.resize = this.props.resize; + } if (this.props.readOnly) { style.backgroundColor = '#f2f2f2'; } + return ( <TextAreaEditor mode={this.props.language} style={style} minLines={minLines} maxLines={inModal ? 1000 : this.props.maxLines} - width="100%" - height={`${minLines}em`} editorProps={{ $blockScrolling: true }} defaultValue={this.props.initialValue} readOnly={this.props.readOnly} @@ -106,10 +123,10 @@ class TextAreaControl extends React.Component { renderModalBody() { return ( - <div> + <> <div>{this.props.aboveEditorSection}</div> {this.renderEditor(true)} - </div> + </> ); } diff --git a/superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx b/superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx index 5070c9a5956d..29ac223cf3e0 100644 --- a/superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx +++ b/superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx @@ -61,17 +61,17 @@ const defaultProps = { }; const comparisonTypeOptions = [ - { value: 'value', label: 'Actual value', key: 'value' }, - { value: 'diff', label: 'Difference', key: 'diff' }, - { value: 'perc', label: 'Percentage', key: 'perc' }, - { value: 'perc_change', label: 'Percentage change', key: 'perc_change' }, + { value: 'value', label: t('Actual value'), key: 'value' }, + { value: 'diff', label: t('Difference'), key: 'diff' }, + { value: 'perc', label: t('Percentage'), key: 'perc' }, + { value: 'perc_change', label: t('Percentage change'), key: 'perc_change' }, ]; const colTypeOptions = [ - { value: 'time', label: 'Time comparison', key: 'time' }, - { value: 'contrib', label: 'Contribution', key: 'contrib' }, - { value: 'spark', label: 'Sparkline', key: 'spark' }, - { value: 'avg', label: 'Period average', key: 'avg' }, + { value: 'time', label: t('Time comparison'), key: 'time' }, + { value: 'contrib', label: t('Contribution'), key: 'contrib' }, + { value: 'spark', label: t('Sparkline'), key: 'spark' }, + { value: 'avg', label: t('Period average'), key: 'avg' }, ]; const StyledRow = styled(Row)` @@ -192,28 +192,28 @@ export default class TimeSeriesColumnControl extends React.Component { return ( <div id="ts-col-popo" style={{ width: 320 }}> {this.formRow( - 'Label', - 'The column header label', + t('Label'), + t('The column header label'), 'time-lag', <Input value={this.state.label} onChange={this.onTextInputChange.bind(this, 'label')} - placeholder="Label" + placeholder={t('Label')} />, )} {this.formRow( - 'Tooltip', - 'Column header tooltip', + t('Tooltip'), + t('Column header tooltip'), 'col-tooltip', <Input value={this.state.tooltip} onChange={this.onTextInputChange.bind(this, 'tooltip')} - placeholder="Tooltip" + placeholder={t('Tooltip')} />, )} {this.formRow( - 'Type', - 'Type of comparison, value difference or percentage', + t('Type'), + t('Type of comparison, value difference or percentage'), 'col-type', <Select ariaLabel={t('Type')} @@ -225,52 +225,52 @@ export default class TimeSeriesColumnControl extends React.Component { <hr /> {this.state.colType === 'spark' && this.formRow( - 'Width', - 'Width of the sparkline', + t('Width'), + t('Width of the sparkline'), 'spark-width', <Input value={this.state.width} onChange={this.onTextInputChange.bind(this, 'width')} - placeholder="Width" + placeholder={t('Width')} />, )} {this.state.colType === 'spark' && this.formRow( - 'Height', - 'Height of the sparkline', + t('Height'), + t('Height of the sparkline'), 'spark-width', <Input value={this.state.height} onChange={this.onTextInputChange.bind(this, 'height')} - placeholder="Height" + placeholder={t('Height')} />, )} {['time', 'avg'].indexOf(this.state.colType) >= 0 && this.formRow( - 'Time lag', - 'Number of periods to compare against', + t('Time lag'), + t('Number of periods to compare against'), 'time-lag', <Input value={this.state.timeLag} onChange={this.onTextInputChange.bind(this, 'timeLag')} - placeholder="Time Lag" + placeholder={t('Time Lag')} />, )} {['spark'].indexOf(this.state.colType) >= 0 && this.formRow( - 'Time ratio', - 'Number of periods to ratio against', + t('Time ratio'), + t('Number of periods to ratio against'), 'time-ratio', <Input value={this.state.timeRatio} onChange={this.onTextInputChange.bind(this, 'timeRatio')} - placeholder="Time Ratio" + placeholder={t('Time Ratio')} />, )} {this.state.colType === 'time' && this.formRow( - 'Type', - 'Type of comparison, value difference or percentage', + t('Type'), + t('Type of comparison, value difference or percentage'), 'comp-type', <Select ariaLabel={t('Type')} @@ -281,8 +281,10 @@ export default class TimeSeriesColumnControl extends React.Component { )} {this.state.colType === 'spark' && this.formRow( - 'Show Y-axis', - 'Show Y-axis on the sparkline. Will display the manually set min/max if set or min/max values in the data otherwise.', + t('Show Y-axis'), + t( + 'Show Y-axis on the sparkline. Will display the manually set min/max if set or min/max values in the data otherwise.', + ), 'show-y-axis-bounds', <CheckboxControl value={this.state.showYAxis} @@ -291,8 +293,8 @@ export default class TimeSeriesColumnControl extends React.Component { )} {this.state.colType === 'spark' && this.formRow( - 'Y-axis bounds', - 'Manually set min/max values for the y-axis.', + t('Y-axis bounds'), + t('Manually set min/max values for the y-axis.'), 'y-axis-bounds', <BoundsControl value={this.state.yAxisBounds} @@ -301,10 +303,10 @@ export default class TimeSeriesColumnControl extends React.Component { )} {this.state.colType !== 'spark' && this.formRow( - 'Color bounds', - `Number bounds used for color encoding from red to blue. - Reverse the numbers for blue to red. To get pure red or blue, - you can enter either only min or max.`, + t('Color bounds'), + t(`Number bounds used for color encoding from red to blue. + Reverse the numbers for blue to red. To get pure red or blue, + you can enter either only min or max.`), 'bounds', <BoundsControl value={this.state.bounds} @@ -312,24 +314,24 @@ export default class TimeSeriesColumnControl extends React.Component { />, )} {this.formRow( - 'Number format', - 'Optional d3 number format string', + t('Number format'), + t('Optional d3 number format string'), 'd3-format', <Input value={this.state.d3format} onChange={this.onTextInputChange.bind(this, 'd3format')} - placeholder="Number format string" + placeholder={t('Number format string')} />, )} {this.state.colType === 'spark' && this.formRow( - 'Date format', - 'Optional d3 date format string', + t('Date format'), + t('Optional d3 date format string'), 'date-format', <Input value={this.state.dateFormat} onChange={this.onTextInputChange.bind(this, 'dateFormat')} - placeholder="Date format string" + placeholder={t('Date format string')} />, )} <ButtonBar> @@ -356,7 +358,7 @@ export default class TimeSeriesColumnControl extends React.Component { <ControlPopover trigger="click" content={this.renderPopover()} - title="Column Configuration" + title={t('Column Configuration')} visible={this.state.popoverVisible} onVisibleChange={this.onPopoverVisibleChange} > diff --git a/superset-frontend/src/explore/components/controls/ViewQuery.tsx b/superset-frontend/src/explore/components/controls/ViewQuery.tsx new file mode 100644 index 000000000000..a8ebd975d334 --- /dev/null +++ b/superset-frontend/src/explore/components/controls/ViewQuery.tsx @@ -0,0 +1,76 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { styled } from '@superset-ui/core'; +import SyntaxHighlighter from 'react-syntax-highlighter/dist/cjs/light'; +import github from 'react-syntax-highlighter/dist/cjs/styles/hljs/github'; +import CopyToClipboard from 'src/components/CopyToClipboard'; +import { CopyButton } from 'src/explore/components/DataTableControl'; +import markdownSyntax from 'react-syntax-highlighter/dist/cjs/languages/hljs/markdown'; +import htmlSyntax from 'react-syntax-highlighter/dist/cjs/languages/hljs/htmlbars'; +import sqlSyntax from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql'; +import jsonSyntax from 'react-syntax-highlighter/dist/cjs/languages/hljs/json'; + +const CopyButtonViewQuery = styled(CopyButton)` + && { + margin: 0 0 ${({ theme }) => theme.gridUnit}px; + } +`; + +SyntaxHighlighter.registerLanguage('markdown', markdownSyntax); +SyntaxHighlighter.registerLanguage('html', htmlSyntax); +SyntaxHighlighter.registerLanguage('sql', sqlSyntax); +SyntaxHighlighter.registerLanguage('json', jsonSyntax); + +interface ViewQueryProps { + sql: string; + language?: string; +} + +const StyledSyntaxContainer = styled.div` + height: 100%; + display: flex; + flex-direction: column; +`; + +const StyledSyntaxHighlighter = styled(SyntaxHighlighter)` + flex: 1; +`; + +const ViewQuery: React.FC<ViewQueryProps> = props => { + const { sql, language = 'sql' } = props; + return ( + <StyledSyntaxContainer key={sql}> + <CopyToClipboard + text={sql} + shouldShowText={false} + copyNode={ + <CopyButtonViewQuery buttonSize="xsmall"> + <i className="fa fa-clipboard" /> + </CopyButtonViewQuery> + } + /> + <StyledSyntaxHighlighter language={language} style={github}> + {sql} + </StyledSyntaxHighlighter> + </StyledSyntaxContainer> + ); +}; + +export default ViewQuery; diff --git a/superset-frontend/src/explore/components/controls/ViewQueryModal.tsx b/superset-frontend/src/explore/components/controls/ViewQueryModal.tsx index 238982c3d85f..023c1e355130 100644 --- a/superset-frontend/src/explore/components/controls/ViewQueryModal.tsx +++ b/superset-frontend/src/explore/components/controls/ViewQueryModal.tsx @@ -17,29 +17,11 @@ * under the License. */ import React, { useEffect, useState } from 'react'; -import { ensureIsArray, styled, t } from '@superset-ui/core'; -import SyntaxHighlighter from 'react-syntax-highlighter/dist/cjs/light'; -import github from 'react-syntax-highlighter/dist/cjs/styles/hljs/github'; -import CopyToClipboard from 'src/components/CopyToClipboard'; +import { styled, ensureIsArray, t } from '@superset-ui/core'; import Loading from 'src/components/Loading'; -import { CopyButton } from 'src/explore/components/DataTableControl'; import { getClientErrorObject } from 'src/utils/getClientErrorObject'; import { getChartDataRequest } from 'src/components/Chart/chartAction'; -import markdownSyntax from 'react-syntax-highlighter/dist/cjs/languages/hljs/markdown'; -import htmlSyntax from 'react-syntax-highlighter/dist/cjs/languages/hljs/htmlbars'; -import sqlSyntax from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql'; -import jsonSyntax from 'react-syntax-highlighter/dist/cjs/languages/hljs/json'; - -const CopyButtonViewQuery = styled(CopyButton)` - && { - margin: 0 0 ${({ theme }) => theme.gridUnit}px; - } -`; - -SyntaxHighlighter.registerLanguage('markdown', markdownSyntax); -SyntaxHighlighter.registerLanguage('html', htmlSyntax); -SyntaxHighlighter.registerLanguage('sql', sqlSyntax); -SyntaxHighlighter.registerLanguage('json', jsonSyntax); +import ViewQuery from 'src/explore/components/controls/ViewQuery'; interface Props { latestQueryFormData: object; @@ -50,12 +32,10 @@ type Result = { language: string; }; -const StyledSyntaxContainer = styled.div` +const ViewQueryModalContainer = styled.div` height: 100%; -`; - -const StyledSyntaxHighlighter = styled(SyntaxHighlighter)` - height: calc(100% - 26px); // 100% - clipboard height + display: flex; + flex-direction: column; `; const ViewQueryModal: React.FC<Props> = props => { @@ -97,30 +77,15 @@ const ViewQueryModal: React.FC<Props> = props => { if (error) { return <pre>{error}</pre>; } + return ( - <> + <ViewQueryModalContainer> {result.map(item => item.query ? ( - <StyledSyntaxContainer key={item.query}> - <CopyToClipboard - text={item.query} - shouldShowText={false} - copyNode={ - <CopyButtonViewQuery buttonSize="xsmall"> - <i className="fa fa-clipboard" /> - </CopyButtonViewQuery> - } - /> - <StyledSyntaxHighlighter - language={item.language || undefined} - style={github} - > - {item.query} - </StyledSyntaxHighlighter> - </StyledSyntaxContainer> + <ViewQuery sql={item.query} language={item.language || undefined} /> ) : null, )} - </> + </ViewQueryModalContainer> ); }; diff --git a/superset-frontend/src/explore/components/controls/ViewQueryModalFooter.tsx b/superset-frontend/src/explore/components/controls/ViewQueryModalFooter.tsx new file mode 100644 index 000000000000..4f4af039b1a2 --- /dev/null +++ b/superset-frontend/src/explore/components/controls/ViewQueryModalFooter.tsx @@ -0,0 +1,83 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { isObject } from 'lodash'; +import { t, SupersetClient } from '@superset-ui/core'; +import Button from 'src/components/Button'; + +interface SimpleDataSource { + id: string; + sql: string; + type: string; +} + +interface ViewQueryModalFooterProps { + closeModal?: Function; + changeDatasource?: Function; + datasource?: SimpleDataSource; +} + +const CLOSE = t('Close'); +const SAVE_AS_DATASET = t('Save as Dataset'); +const OPEN_IN_SQL_LAB = t('Open in SQL Lab'); + +const ViewQueryModalFooter: React.FC<ViewQueryModalFooterProps> = (props: { + closeModal: () => void; + changeDatasource: () => void; + datasource: SimpleDataSource; +}) => { + const viewInSQLLab = (id: string, type: string, sql: string) => { + const payload = { + datasourceKey: `${id}__${type}`, + sql, + }; + SupersetClient.postForm('/superset/sqllab/', payload); + }; + + const openSQL = () => { + const { datasource } = props; + if (isObject(datasource)) { + const { id, type, sql } = datasource; + viewInSQLLab(id, type, sql); + } + }; + return ( + <div> + <Button + onClick={() => { + props?.closeModal?.(); + props?.changeDatasource?.(); + }} + > + {SAVE_AS_DATASET} + </Button> + <Button onClick={() => openSQL()}>{OPEN_IN_SQL_LAB}</Button> + <Button + buttonStyle="primary" + onClick={() => { + props?.closeModal?.(); + }} + > + {CLOSE} + </Button> + </div> + ); +}; + +export default ViewQueryModalFooter; diff --git a/superset-frontend/src/explore/components/controls/ViewportControl.jsx b/superset-frontend/src/explore/components/controls/ViewportControl.jsx index 631a8c550878..ff9ebef2042e 100644 --- a/superset-frontend/src/explore/components/controls/ViewportControl.jsx +++ b/superset-frontend/src/explore/components/controls/ViewportControl.jsx @@ -17,6 +17,7 @@ * under the License. */ import React from 'react'; +import { t } from '@superset-ui/core'; import PropTypes from 'prop-types'; import Popover from 'src/components/Popover'; import { decimal2sexagesimal } from 'geolib'; @@ -107,7 +108,7 @@ export default class ViewportControl extends React.Component { trigger="click" placement="right" content={this.renderPopover()} - title="Viewport" + title={t('Viewport')} > <Label className="pointer">{this.renderLabel()}</Label> </Popover> diff --git a/superset-frontend/src/explore/components/controls/VizTypeControl/FastVizSwitcher.tsx b/superset-frontend/src/explore/components/controls/VizTypeControl/FastVizSwitcher.tsx index 5b9df8021fa1..a7186e2aa19b 100644 --- a/superset-frontend/src/explore/components/controls/VizTypeControl/FastVizSwitcher.tsx +++ b/superset-frontend/src/explore/components/controls/VizTypeControl/FastVizSwitcher.tsx @@ -29,7 +29,8 @@ import { css, SupersetTheme, t, useTheme } from '@superset-ui/core'; import { usePluginContext } from 'src/components/DynamicPlugins'; import { Tooltip } from 'src/components/Tooltip'; import Icons from 'src/components/Icons'; -import { ExplorePageState } from 'src/explore/reducers/getInitialState'; +import { getChartKey } from 'src/explore/exploreUtils'; +import { ExplorePageState } from 'src/explore/types'; export interface VizMeta { icon: ReactElement; @@ -52,19 +53,29 @@ const FEATURED_CHARTS: VizMeta[] = [ name: 'echarts_timeseries_line', icon: <Icons.LineChartTile />, }, + { + name: 'echarts_timeseries_bar', + icon: <Icons.BarChartTile />, + }, + { name: 'echarts_area', icon: <Icons.AreaChartTile /> }, { name: 'table', icon: <Icons.TableChartTile /> }, { name: 'big_number_total', icon: <Icons.BigNumberChartTile />, }, { name: 'pie', icon: <Icons.PieChartTile /> }, - { - name: 'echarts_timeseries_bar', - icon: <Icons.BarChartTile />, - }, - { name: 'echarts_area', icon: <Icons.AreaChartTile /> }, ]; +const antdIconProps = { + iconSize: 'l' as const, + css: (theme: SupersetTheme) => css` + padding: ${theme.gridUnit}px; + & > * { + line-height: 0; + } + `, +}; + const VizTile = ({ isActive, isRendered, @@ -188,8 +199,8 @@ export const FastVizSwitcher = React.memo( ({ currentSelection, onChange }: FastVizSwitcherProps) => { const currentViz = useSelector<ExplorePageState, string | undefined>( state => - state.charts && - Object.values(state.charts)[0]?.latestQueryFormData?.viz_type, + state.charts?.[getChartKey(state.explore)]?.latestQueryFormData + ?.viz_type, ); const vizTiles = useMemo(() => { const vizTiles = [...FEATURED_CHARTS]; @@ -203,15 +214,7 @@ export const FastVizSwitcher = React.memo( vizTiles.unshift({ name: currentSelection, icon: ( - <Icons.MonitorOutlined - iconSize="l" - css={(theme: SupersetTheme) => css` - padding: ${theme.gridUnit}px; - & > * { - line-height: 0; - } - `} - /> + <Icons.MonitorOutlined {...antdIconProps} aria-label="monitor" /> ), }); } @@ -223,7 +226,12 @@ export const FastVizSwitcher = React.memo( ) { vizTiles.unshift({ name: currentViz, - icon: <Icons.CurrentRenderedTile />, + icon: ( + <Icons.CheckSquareOutlined + {...antdIconProps} + aria-label="check-square" + /> + ), }); } return vizTiles; diff --git a/superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeControl.test.tsx b/superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeControl.test.tsx index 98a7b9099e72..034b339cda94 100644 --- a/superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeControl.test.tsx @@ -17,7 +17,13 @@ * under the License. */ import { Preset } from '@superset-ui/core'; -import { render, cleanup, screen, within } from 'spec/helpers/testing-library'; +import { + render, + cleanup, + screen, + within, + waitFor, +} from 'spec/helpers/testing-library'; import { stateWithoutNativeFilters } from 'spec/fixtures/mockStore'; import React from 'react'; import userEvent from '@testing-library/user-event'; @@ -34,7 +40,7 @@ import { } from '@superset-ui/plugin-chart-echarts'; import TableChartPlugin from '@superset-ui/plugin-chart-table'; import { LineChartPlugin } from '@superset-ui/preset-chart-xy'; -import TimeTableChartPlugin from '../../../../visualizations/TimeTable'; +import TimeTableChartPlugin from 'src/visualizations/TimeTable'; import VizTypeControl, { VIZ_TYPE_CONTROL_TEST_ID } from './index'; jest.useFakeTimers(); @@ -90,30 +96,31 @@ describe('VizTypeControl', () => { isModalOpenInit: true, }; - const renderWrapper = ( + const waitForRenderWrapper = ( props: typeof defaultProps = defaultProps, state: object = stateWithoutNativeFilters, - ) => { - render( - <DynamicPluginProvider> - <VizTypeControl {...props} /> - </DynamicPluginProvider>, - { useRedux: true, initialState: state }, - ); - }; + ) => + waitFor(() => { + render( + <DynamicPluginProvider> + <VizTypeControl {...props} /> + </DynamicPluginProvider>, + { useRedux: true, initialState: state }, + ); + }); afterEach(() => { cleanup(); jest.clearAllMocks(); }); - it('Fast viz switcher tiles render', () => { + it('Fast viz switcher tiles render', async () => { const props = { ...defaultProps, value: 'echarts_timeseries_line', isModalOpenInit: false, }; - renderWrapper(props); + await waitForRenderWrapper(props); expect(screen.getByLabelText('line-chart-tile')).toBeVisible(); expect(screen.getByLabelText('table-chart-tile')).toBeVisible(); expect(screen.getByLabelText('big-number-chart-tile')).toBeVisible(); @@ -121,9 +128,7 @@ describe('VizTypeControl', () => { expect(screen.getByLabelText('bar-chart-tile')).toBeVisible(); expect(screen.getByLabelText('area-chart-tile')).toBeVisible(); expect(screen.queryByLabelText('monitor')).not.toBeInTheDocument(); - expect( - screen.queryByLabelText('current-rendered-tile'), - ).not.toBeInTheDocument(); + expect(screen.queryByLabelText('check-square')).not.toBeInTheDocument(); expect( within(screen.getByTestId('fast-viz-switcher')).getByText( @@ -141,7 +146,7 @@ describe('VizTypeControl', () => { ).toBeInTheDocument(); expect( within(screen.getByTestId('fast-viz-switcher')).getByText( - 'Time-series Bar Chart v2', + 'Time-series Bar Chart', ), ).toBeInTheDocument(); expect( @@ -154,13 +159,13 @@ describe('VizTypeControl', () => { ).not.toBeInTheDocument(); }); - it('Render viz tiles when non-featured chart is selected', () => { + it('Render viz tiles when non-featured chart is selected', async () => { const props = { ...defaultProps, value: 'line', isModalOpenInit: false, }; - renderWrapper(props); + await waitForRenderWrapper(props); expect(screen.getByLabelText('monitor')).toBeVisible(); expect( @@ -168,7 +173,7 @@ describe('VizTypeControl', () => { ).toBeVisible(); }); - it('Render viz tiles when non-featured is rendered', () => { + it('Render viz tiles when non-featured is rendered', async () => { const props = { ...defaultProps, value: 'line', @@ -182,21 +187,26 @@ describe('VizTypeControl', () => { }, }, }, + explore: { + slice: { + slice_id: 1, + }, + }, }; - renderWrapper(props, state); - expect(screen.getByLabelText('current-rendered-tile')).toBeVisible(); + await waitForRenderWrapper(props, state); + expect(screen.getByLabelText('check-square')).toBeVisible(); expect( within(screen.getByTestId('fast-viz-switcher')).getByText('Line Chart'), ).toBeVisible(); }); - it('Change viz type on click', () => { + it('Change viz type on click', async () => { const props = { ...defaultProps, value: 'echarts_timeseries_line', isModalOpenInit: false, }; - renderWrapper(props); + await waitForRenderWrapper(props); userEvent.click( within(screen.getByTestId('fast-viz-switcher')).getByText( 'Time-series Line Chart', @@ -210,7 +220,7 @@ describe('VizTypeControl', () => { }); it('Open viz gallery modal on "View all charts" click', async () => { - renderWrapper({ ...defaultProps, isModalOpenInit: false }); + await waitForRenderWrapper({ ...defaultProps, isModalOpenInit: false }); expect( screen.queryByText('Select a visualization type'), ).not.toBeInTheDocument(); @@ -221,7 +231,7 @@ describe('VizTypeControl', () => { }); it('Search visualization type', async () => { - renderWrapper(); + await waitForRenderWrapper(); const visualizations = screen.getByTestId(getTestId('viz-row')); @@ -248,7 +258,7 @@ describe('VizTypeControl', () => { within(visualizations).getByText('Time-series Line Chart'), ).toBeVisible(); expect( - within(visualizations).getByText('Time-series Bar Chart v2'), + within(visualizations).getByText('Time-series Bar Chart'), ).toBeVisible(); expect( within(visualizations).queryByText('Line Chart'), @@ -261,4 +271,20 @@ describe('VizTypeControl', () => { within(visualizations).queryByText('Pie Chart'), ).not.toBeInTheDocument(); }); + + it('Submit on viz type double-click', async () => { + await waitForRenderWrapper(); + userEvent.click(screen.getByRole('button', { name: 'ballot All charts' })); + const visualizations = screen.getByTestId(getTestId('viz-row')); + userEvent.click(within(visualizations).getByText('Time-series Bar Chart')); + + expect(defaultProps.onChange).not.toBeCalled(); + userEvent.dblClick( + within(visualizations).getByText('Time-series Line Chart'), + ); + + expect(defaultProps.onChange).toHaveBeenCalledWith( + 'echarts_timeseries_line', + ); + }); }); diff --git a/superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx b/superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx index 1679fff69980..6b1466007512 100644 --- a/superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx +++ b/superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx @@ -47,8 +47,10 @@ import scrollIntoView from 'scroll-into-view-if-needed'; interface VizTypeGalleryProps { onChange: (vizType: string | null) => void; + onDoubleClick: () => void; selectedViz: string | null; className?: string; + denyList: string[]; } type VizEntry = { @@ -224,7 +226,7 @@ const SelectorLabel = styled.button` } &.selected { - background-color: ${theme.colors.primary.dark1}; + background-color: ${theme.colors.primary.base}; color: ${theme.colors.primary.light5}; svg { @@ -380,12 +382,14 @@ interface ThumbnailProps { entry: VizEntry; selectedViz: string | null; setSelectedViz: (viz: string) => void; + onDoubleClick: () => void; } const Thumbnail: React.FC<ThumbnailProps> = ({ entry, selectedViz, setSelectedViz, + onDoubleClick, }) => { const theme = useTheme(); const { key, value: type } = entry; @@ -400,6 +404,7 @@ const Thumbnail: React.FC<ThumbnailProps> = ({ tabIndex={0} className={isSelected ? 'selected' : ''} onClick={() => setSelectedViz(key)} + onDoubleClick={onDoubleClick} data-test="viztype-selector-container" > <img @@ -429,6 +434,7 @@ interface ThumbnailGalleryProps { vizEntries: VizEntry[]; selectedViz: string | null; setSelectedViz: (viz: string) => void; + onDoubleClick: () => void; } /** A list of viz thumbnails, used within the viz picker modal */ @@ -487,7 +493,7 @@ const doesVizMatchSelector = (viz: ChartMetadata, selector: string) => (viz.tags || []).indexOf(selector) > -1; export default function VizTypeGallery(props: VizTypeGalleryProps) { - const { selectedViz, onChange, className } = props; + const { selectedViz, onChange, onDoubleClick, className } = props; const { mountedPluginMetadata } = usePluginContext(); const searchInputRef = useRef<HTMLInputElement>(); const [searchInputValue, setSearchInputValue] = useState(''); @@ -501,6 +507,7 @@ export default function VizTypeGallery(props: VizTypeGalleryProps) { const chartMetadata: VizEntry[] = useMemo(() => { const result = Object.entries(mountedPluginMetadata) .map(([key, value]) => ({ key, value })) + .filter(({ key }) => !props.denyList.includes(key)) .filter( ({ value }) => nativeFilterGate(value.behaviors || []) && !value.deprecated, @@ -793,6 +800,7 @@ export default function VizTypeGallery(props: VizTypeGalleryProps) { vizEntries={getVizEntriesToDisplay()} selectedViz={selectedViz} setSelectedViz={onChange} + onDoubleClick={onDoubleClick} /> </RightPane> diff --git a/superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx b/superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx index 0f8de76926c0..802c04f8a995 100644 --- a/superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx +++ b/superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx @@ -27,6 +27,7 @@ import { import { usePluginContext } from 'src/components/DynamicPlugins'; import Modal from 'src/components/Modal'; import { noOp } from 'src/utils/common'; +import getBootstrapData from 'src/utils/getBootstrapData'; import VizTypeGallery, { MAX_ADVISABLE_VIZ_GALLERY_WIDTH, } from './VizTypeGallery'; @@ -41,6 +42,8 @@ interface VizTypeControlProps { isModalOpenInit?: boolean; } +const bootstrapData = getBootstrapData(); +const denyList: string[] = bootstrapData.common.conf.VIZ_TYPE_DENYLIST || []; const metadataRegistry = getChartMetadataRegistry(); export const VIZ_TYPE_CONTROL_TEST_ID = 'viz-type-control'; @@ -140,6 +143,8 @@ const VizTypeControl = ({ key={modalKey} selectedViz={selectedViz} onChange={setSelectedViz} + onDoubleClick={onSubmit} + denyList={denyList} /> </UnpaddedModal> </> diff --git a/superset-frontend/src/dashboard/stylesheets/components/divider.less b/superset-frontend/src/explore/components/controls/XAxisSortControl.tsx similarity index 61% rename from superset-frontend/src/dashboard/stylesheets/components/divider.less rename to superset-frontend/src/explore/components/controls/XAxisSortControl.tsx index 7ee4956ddfc0..05d27dc0d436 100644 --- a/superset-frontend/src/dashboard/stylesheets/components/divider.less +++ b/superset-frontend/src/explore/components/controls/XAxisSortControl.tsx @@ -16,27 +16,21 @@ * specific language governing permissions and limitations * under the License. */ -.dashboard-component-divider { - width: 100%; - padding: 8px 0; /* this is padding not margin to enable a larger mouse target */ - background-color: transparent; -} - -.dashboard-component-divider:after { - content: ''; - height: 1px; - width: 100%; - background-color: @gray-light; - display: block; -} +import React, { useEffect, useState } from 'react'; +import SelectControl from './SelectControl'; -.new-component-placeholder.divider-placeholder:after { - content: ''; - height: 2px; - width: 100%; - background-color: @gray-light; -} +export default function XAxisSortControl(props: { + onChange: (val: string | undefined) => void; + value: string | null; + shouldReset: boolean; +}) { + const [value, setValue] = useState(props.value); + useEffect(() => { + if (props.shouldReset) { + props.onChange(undefined); + setValue(null); + } + }, [props.shouldReset, props.value]); -.dragdroppable .dashboard-component-divider { - cursor: move; + return <SelectControl {...props} value={value} />; } diff --git a/superset-frontend/src/explore/components/controls/index.js b/superset-frontend/src/explore/components/controls/index.js index 23cd3a73d85b..21e3bd4cf285 100644 --- a/superset-frontend/src/explore/components/controls/index.js +++ b/superset-frontend/src/explore/components/controls/index.js @@ -45,6 +45,7 @@ import DndColumnSelectControl, { DndFilterSelect, DndMetricSelect, } from './DndColumnSelectControl'; +import XAxisSortControl from './XAxisSortControl'; const controlMap = { AnnotationLayerControl, @@ -74,6 +75,7 @@ const controlMap = { AdhocFilterControl, FilterBoxItemControl, ConditionalFormattingControl, + XAxisSortControl, ...sharedControlComponents, }; export default controlMap; diff --git a/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/DashboardsSubMenu.test.tsx b/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/DashboardsSubMenu.test.tsx new file mode 100644 index 000000000000..aea0b4a8e598 --- /dev/null +++ b/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/DashboardsSubMenu.test.tsx @@ -0,0 +1,78 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; +import { Menu } from 'src/components/Menu'; +import DashboardItems from './DashboardsSubMenu'; + +const asyncRender = (numberOfItems: number) => + waitFor(() => { + const dashboards = []; + for (let i = 1; i <= numberOfItems; i += 1) { + dashboards.push({ id: i, dashboard_title: `Dashboard ${i}` }); + } + render( + <Menu openKeys={['menu']}> + <Menu.SubMenu title="Dashboards added to" key="menu"> + <DashboardItems key="menu" dashboards={dashboards} /> + </Menu.SubMenu> + </Menu>, + { + useRouter: true, + }, + ); + }); + +test('renders a submenu', async () => { + await asyncRender(3); + expect(screen.getByText('Dashboard 1')).toBeInTheDocument(); + expect(screen.getByText('Dashboard 2')).toBeInTheDocument(); + expect(screen.getByText('Dashboard 3')).toBeInTheDocument(); +}); + +test('renders a submenu with search', async () => { + await asyncRender(20); + expect(screen.getByPlaceholderText('Search')).toBeInTheDocument(); +}); + +test('displays a searched value', async () => { + await asyncRender(20); + userEvent.type(screen.getByPlaceholderText('Search'), '2'); + expect(screen.getByText('Dashboard 2')).toBeInTheDocument(); + expect(screen.getByText('Dashboard 20')).toBeInTheDocument(); +}); + +test('renders a "No results found" message when searching', async () => { + await asyncRender(20); + userEvent.type(screen.getByPlaceholderText('Search'), 'unknown'); + expect(screen.getByText('No results found')).toBeInTheDocument(); +}); + +test('renders a submenu with no dashboards', async () => { + await asyncRender(0); + expect(screen.getByText('None')).toBeInTheDocument(); +}); + +test('shows link icon when hovering', async () => { + await asyncRender(3); + expect(screen.queryByRole('img', { name: 'full' })).not.toBeInTheDocument(); + userEvent.hover(screen.getByText('Dashboard 1')); + expect(screen.getByRole('img', { name: 'full' })).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/DashboardsSubMenu.tsx b/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/DashboardsSubMenu.tsx new file mode 100644 index 000000000000..625f4b8949d8 --- /dev/null +++ b/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/DashboardsSubMenu.tsx @@ -0,0 +1,146 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useState } from 'react'; +import { css, t, useTheme } from '@superset-ui/core'; +import { Input } from 'src/components/Input'; +import Icons from 'src/components/Icons'; +import { Menu } from 'src/components/Menu'; +import { Link } from 'react-router-dom'; + +export interface DashboardsSubMenuProps { + chartId?: number; + dashboards?: { id: number; dashboard_title: string }[]; +} + +const WIDTH = 220; +const HEIGHT = 300; +const SEARCH_THRESHOLD = 10; + +const DashboardsSubMenu = ({ + chartId, + dashboards = [], + ...menuProps +}: DashboardsSubMenuProps) => { + const theme = useTheme(); + const [dashboardSearch, setDashboardSearch] = useState<string>(); + const [hoveredItem, setHoveredItem] = useState<number | null>(); + const showSearch = dashboards.length > SEARCH_THRESHOLD; + const filteredDashboards = dashboards.filter( + dashboard => + !dashboardSearch || + dashboard.dashboard_title + .toLowerCase() + .includes(dashboardSearch.toLowerCase()), + ); + const noResults = dashboards.length === 0; + const noResultsFound = dashboardSearch && filteredDashboards.length === 0; + const urlQueryString = chartId ? `?focused_chart=${chartId}` : ''; + return ( + <> + {showSearch && ( + <Input + allowClear + placeholder={t('Search')} + prefix={<Icons.Search iconSize="l" />} + css={css` + width: ${WIDTH}px; + margin: ${theme.gridUnit * 2}px ${theme.gridUnit * 3}px; + `} + value={dashboardSearch} + onChange={e => setDashboardSearch(e.currentTarget.value)} + /> + )} + <div + css={css` + max-height: ${HEIGHT}px; + overflow: auto; + `} + > + {filteredDashboards.map(dashboard => ( + <Menu.Item + key={String(dashboard.id)} + onMouseEnter={() => setHoveredItem(dashboard.id)} + onMouseLeave={() => { + if (hoveredItem === dashboard.id) { + setHoveredItem(null); + } + }} + {...menuProps} + > + <Link + target="_blank" + rel="noreferer noopener" + to={`/superset/dashboard/${dashboard.id}${urlQueryString}`} + > + <div + css={css` + display: flex; + flex-direction: row; + align-items: center; + max-width: ${WIDTH}px; + `} + > + <div + css={css` + white-space: normal; + `} + > + {dashboard.dashboard_title} + </div> + <Icons.Full + iconSize="l" + iconColor={theme.colors.grayscale.base} + css={css` + margin-left: ${theme.gridUnit * 2}px; + visibility: ${hoveredItem === dashboard.id + ? 'visible' + : 'hidden'}; + `} + /> + </div> + </Link> + </Menu.Item> + ))} + {noResultsFound && ( + <div + css={css` + margin-left: ${theme.gridUnit * 3}px; + margin-bottom: ${theme.gridUnit}px; + `} + > + {t('No results found')} + </div> + )} + {noResults && ( + <Menu.Item + disabled + css={css` + min-width: ${WIDTH}px; + `} + {...menuProps} + > + {t('None')} + </Menu.Item> + )} + </div> + </> + ); +}; + +export default DashboardsSubMenu; diff --git a/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx b/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx index fb317985a17c..445db6dc4414 100644 --- a/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx +++ b/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx @@ -18,26 +18,30 @@ */ import React, { useCallback, useMemo, useState } from 'react'; import { useSelector } from 'react-redux'; -import { FileOutlined, FileImageOutlined } from '@ant-design/icons'; import { css, styled, t, useTheme } from '@superset-ui/core'; +import Icons from 'src/components/Icons'; import { Menu } from 'src/components/Menu'; import ModalTrigger from 'src/components/ModalTrigger'; import Button from 'src/components/Button'; import { useToasts } from 'src/components/MessageToasts/withToasts'; -import { exportChart } from 'src/explore/exploreUtils'; +import { exportChart, getChartKey } from 'src/explore/exploreUtils'; import downloadAsImage from 'src/utils/downloadAsImage'; import { getChartPermalink } from 'src/utils/urlUtils'; import copyTextToClipboard from 'src/utils/copy'; import HeaderReportDropDown from 'src/components/ReportModal/HeaderReportDropdown'; +import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; import ViewQueryModal from '../controls/ViewQueryModal'; import EmbedCodeContent from '../EmbedCodeContent'; +import DashboardsSubMenu from './DashboardsSubMenu'; const MENU_KEYS = { EDIT_PROPERTIES: 'edit_properties', + DASHBOARDS_ADDED_TO: 'dashboards_added_to', DOWNLOAD_SUBMENU: 'download_submenu', EXPORT_TO_CSV: 'export_to_csv', EXPORT_TO_CSV_PIVOTED: 'export_to_csv_pivoted', EXPORT_TO_JSON: 'export_to_json', + EXPORT_TO_XLSX: 'export_to_xlsx', DOWNLOAD_AS_IMAGE: 'download_as_image', SHARE_SUBMENU: 'share_submenu', COPY_PERMALINK: 'copy_permalink', @@ -89,6 +93,13 @@ export const MenuTrigger = styled(Button)` `} `; +const iconReset = css` + .ant-dropdown-menu-item > & > .anticon:first-child { + margin-right: 0; + vertical-align: 0; + } +`; + export const useExploreAdditionalActionsMenu = ( latestQueryFormData, canDownloadCSV, @@ -96,26 +107,18 @@ export const useExploreAdditionalActionsMenu = ( onOpenInEditor, onOpenPropertiesModal, ownState, + dashboards, ) => { const theme = useTheme(); const { addDangerToast, addSuccessToast } = useToasts(); const [showReportSubMenu, setShowReportSubMenu] = useState(null); const [isDropdownVisible, setIsDropdownVisible] = useState(false); const [openSubmenus, setOpenSubmenus] = useState([]); - const charts = useSelector(state => state.charts); - const chart = useMemo(() => { - if (!charts) { - return undefined; - } - const chartsValues = Object.values(charts); - if (chartsValues.length > 0) { - return chartsValues[0]; - } - return undefined; - }, [charts]); + const chart = useSelector( + state => state.charts?.[getChartKey(state.explore)], + ); const { datasource } = latestQueryFormData; - const sqlSupported = datasource && datasource.split('__')[1] === 'table'; const shareByEmail = useCallback(async () => { try { @@ -163,6 +166,16 @@ export const useExploreAdditionalActionsMenu = ( [latestQueryFormData], ); + const exportExcel = useCallback( + () => + exportChart({ + formData: latestQueryFormData, + resultType: 'results', + resultFormat: 'xlsx', + }), + [latestQueryFormData], + ); + const copyLink = useCallback(async () => { try { if (!latestQueryFormData) { @@ -197,6 +210,11 @@ export const useExploreAdditionalActionsMenu = ( setIsDropdownVisible(false); setOpenSubmenus([]); + break; + case MENU_KEYS.EXPORT_TO_XLSX: + exportExcel(); + setIsDropdownVisible(false); + setOpenSubmenus([]); break; case MENU_KEYS.DOWNLOAD_AS_IMAGE: downloadAsImage( @@ -254,27 +272,36 @@ export const useExploreAdditionalActionsMenu = ( openKeys={openSubmenus} onOpenChange={setOpenSubmenus} > - {slice && ( - <> + <> + {slice && ( <Menu.Item key={MENU_KEYS.EDIT_PROPERTIES}> {t('Edit chart properties')} </Menu.Item> - <Menu.Divider /> - </> - )} + )} + <Menu.SubMenu + title={t('Dashboards added to')} + key={MENU_KEYS.DASHBOARDS_ADDED_TO} + > + <DashboardsSubMenu + chartId={slice?.slice_id} + dashboards={dashboards} + /> + </Menu.SubMenu> + <Menu.Divider /> + </> <Menu.SubMenu title={t('Download')} key={MENU_KEYS.DOWNLOAD_SUBMENU}> {VIZ_TYPES_PIVOTABLE.includes(latestQueryFormData.viz_type) ? ( <> <Menu.Item key={MENU_KEYS.EXPORT_TO_CSV} - icon={<FileOutlined />} + icon={<Icons.FileOutlined css={iconReset} />} disabled={!canDownloadCSV} > {t('Export to original .CSV')} </Menu.Item> <Menu.Item key={MENU_KEYS.EXPORT_TO_CSV_PIVOTED} - icon={<FileOutlined />} + icon={<Icons.FileOutlined css={iconReset} />} disabled={!canDownloadCSV} > {t('Export to pivoted .CSV')} @@ -283,21 +310,30 @@ export const useExploreAdditionalActionsMenu = ( ) : ( <Menu.Item key={MENU_KEYS.EXPORT_TO_CSV} - icon={<FileOutlined />} + icon={<Icons.FileOutlined css={iconReset} />} disabled={!canDownloadCSV} > {t('Export to .CSV')} </Menu.Item> )} - <Menu.Item key={MENU_KEYS.EXPORT_TO_JSON} icon={<FileOutlined />}> + <Menu.Item + key={MENU_KEYS.EXPORT_TO_JSON} + icon={<Icons.FileOutlined css={iconReset} />} + > {t('Export to .JSON')} </Menu.Item> <Menu.Item key={MENU_KEYS.DOWNLOAD_AS_IMAGE} - icon={<FileImageOutlined />} + icon={<Icons.FileImageOutlined css={iconReset} />} > {t('Download as image')} </Menu.Item> + <Menu.Item + key={MENU_KEYS.EXPORT_TO_XLSX} + icon={<Icons.FileOutlined css={iconReset} />} + > + {t('Export to Excel')} + </Menu.Item> </Menu.SubMenu> <Menu.SubMenu title={t('Share')} key={MENU_KEYS.SHARE_SUBMENU}> <Menu.Item key={MENU_KEYS.COPY_PERMALINK}> @@ -306,23 +342,25 @@ export const useExploreAdditionalActionsMenu = ( <Menu.Item key={MENU_KEYS.SHARE_BY_EMAIL}> {t('Share chart by email')} </Menu.Item> - <Menu.Item key={MENU_KEYS.EMBED_CODE}> - <ModalTrigger - triggerNode={ - <span data-test="embed-code-button">{t('Embed code')}</span> - } - modalTitle={t('Embed code')} - modalBody={ - <EmbedCodeContent - formData={latestQueryFormData} - addDangerToast={addDangerToast} - /> - } - maxWidth={`${theme.gridUnit * 100}px`} - destroyOnClose - responsive - /> - </Menu.Item> + {isFeatureEnabled(FeatureFlag.EMBEDDABLE_CHARTS) ? ( + <Menu.Item key={MENU_KEYS.EMBED_CODE}> + <ModalTrigger + triggerNode={ + <span data-test="embed-code-button">{t('Embed code')}</span> + } + modalTitle={t('Embed code')} + modalBody={ + <EmbedCodeContent + formData={latestQueryFormData} + addDangerToast={addDangerToast} + /> + } + maxWidth={`${theme.gridUnit * 100}px`} + destroyOnClose + responsive + /> + </Menu.Item> + ) : null} </Menu.SubMenu> <Menu.Divider /> {showReportSubMenu ? ( @@ -364,7 +402,7 @@ export const useExploreAdditionalActionsMenu = ( responsive /> </Menu.Item> - {sqlSupported && ( + {datasource && ( <Menu.Item key={MENU_KEYS.RUN_IN_SQL_LAB}> {t('Run in SQL Lab')} </Menu.Item> @@ -375,13 +413,13 @@ export const useExploreAdditionalActionsMenu = ( addDangerToast, canDownloadCSV, chart, + dashboards, handleMenuClick, isDropdownVisible, latestQueryFormData, openSubmenus, showReportSubMenu, slice, - sqlSupported, theme.gridUnit, ], ); diff --git a/superset-frontend/src/explore/constants.ts b/superset-frontend/src/explore/constants.ts index f1353c7734bf..cd038dac20ca 100644 --- a/superset-frontend/src/explore/constants.ts +++ b/superset-frontend/src/explore/constants.ts @@ -45,6 +45,7 @@ export enum Operators { LATEST_PARTITION = 'LATEST_PARTITION', IS_TRUE = 'IS_TRUE', IS_FALSE = 'IS_FALSE', + TEMPORAL_RANGE = 'TEMPORAL_RANGE', } export interface OperatorType { @@ -55,37 +56,46 @@ export interface OperatorType { export const OPERATOR_ENUM_TO_OPERATOR_TYPE: { [key in Operators]: OperatorType; } = { - [Operators.EQUALS]: { display: 'Equal to (=)', operation: '==' }, - [Operators.NOT_EQUALS]: { display: 'Not equal to (≠)', operation: '!=' }, - [Operators.LESS_THAN]: { display: 'Less than (<)', operation: '<' }, + [Operators.EQUALS]: { display: t('Equal to (=)'), operation: '==' }, + [Operators.NOT_EQUALS]: { display: t('Not equal to (≠)'), operation: '!=' }, + [Operators.LESS_THAN]: { display: t('Less than (<)'), operation: '<' }, [Operators.LESS_THAN_OR_EQUAL]: { - display: 'Less or equal (<=)', + display: t('Less or equal (<=)'), operation: '<=', }, - [Operators.GREATER_THAN]: { display: 'Greater than (>)', operation: '>' }, + [Operators.GREATER_THAN]: { display: t('Greater than (>)'), operation: '>' }, [Operators.GREATER_THAN_OR_EQUAL]: { - display: 'Greater or equal (>=)', + display: t('Greater or equal (>=)'), operation: '>=', }, - [Operators.IN]: { display: 'In', operation: 'IN' }, - [Operators.NOT_IN]: { display: 'Not in', operation: 'NOT IN' }, - [Operators.LIKE]: { display: 'Like', operation: 'LIKE' }, - [Operators.ILIKE]: { display: 'Like (case insensitive)', operation: 'ILIKE' }, - [Operators.REGEX]: { display: 'Regex', operation: 'REGEX' }, - [Operators.IS_NOT_NULL]: { display: 'Is not null', operation: 'IS NOT NULL' }, - [Operators.IS_NULL]: { display: 'Is null', operation: 'IS NULL' }, + [Operators.IN]: { display: t('In'), operation: 'IN' }, + [Operators.NOT_IN]: { display: t('Not in'), operation: 'NOT IN' }, + [Operators.LIKE]: { display: t('Like'), operation: 'LIKE' }, + [Operators.ILIKE]: { + display: t('Like (case insensitive)'), + operation: 'ILIKE', + }, + [Operators.REGEX]: { display: t('Regex'), operation: 'REGEX' }, + [Operators.IS_NOT_NULL]: { + display: t('Is not null'), + operation: 'IS NOT NULL', + }, + [Operators.IS_NULL]: { display: t('Is null'), operation: 'IS NULL' }, [Operators.LATEST_PARTITION]: { - display: 'use latest_partition template', + display: t('use latest_partition template'), operation: 'LATEST PARTITION', }, - [Operators.IS_TRUE]: { display: 'Is true', operation: '==' }, - [Operators.IS_FALSE]: { display: 'Is false', operation: '==' }, + [Operators.IS_TRUE]: { display: t('Is true'), operation: '==' }, + [Operators.IS_FALSE]: { display: t('Is false'), operation: '==' }, + [Operators.TEMPORAL_RANGE]: { + display: t('TEMPORAL_RANGE'), + operation: 'TEMPORAL_RANGE', + }, }; export const OPERATORS_OPTIONS = Object.values(Operators) as Operators[]; export const TABLE_ONLY_OPERATORS = [Operators.LIKE, Operators.ILIKE]; -export const DRUID_ONLY_OPERATORS = [Operators.REGEX]; export const HAVING_OPERATORS = [ Operators.EQUALS, Operators.NOT_EQUALS, @@ -97,7 +107,10 @@ export const HAVING_OPERATORS = [ export const MULTI_OPERATORS = new Set([Operators.IN, Operators.NOT_IN]); // CUSTOM_OPERATORS will show operator in simple mode, // but will generate customized sqlExpression -export const CUSTOM_OPERATORS = new Set([Operators.LATEST_PARTITION]); +export const CUSTOM_OPERATORS = new Set([ + Operators.LATEST_PARTITION, + Operators.TEMPORAL_RANGE, +]); // DISABLE_INPUT_OPERATORS will disable filter value input // in adhocFilter control export const DISABLE_INPUT_OPERATORS = [ @@ -119,7 +132,6 @@ export const TIME_FILTER_LABELS = { time_range: t('Time range'), granularity_sqla: t('Time column'), time_grain_sqla: t('Time grain'), - druid_time_origin: t('Origin'), granularity: t('Time granularity'), }; @@ -141,14 +153,9 @@ export const TIME_FILTER_MAP = { time_range: '__time_range', granularity_sqla: '__time_col', time_grain_sqla: '__time_grain', - druid_time_origin: '__time_origin', granularity: '__granularity', }; -// TODO: make this configurable per Superset installation -export const DEFAULT_TIME_RANGE = 'No filter'; -export const NO_TIME_RANGE = 'No filter'; - export enum FILTER_BOX_MIGRATION_STATES { CONVERTED = 'CONVERTED', NOOP = 'NOOP', @@ -162,3 +169,5 @@ export const FILTER_BOX_TRANSITION_SNOOZE_DURATION = 24 * 60 * 60 * 1000; // 24 export const POPOVER_INITIAL_HEIGHT = 240; export const POPOVER_INITIAL_WIDTH = 320; export const UNRESIZABLE_POPOVER_WIDTH = 296; + +export const UNSAVED_CHART_ID = 0; diff --git a/superset-frontend/src/explore/controlPanels/sections.tsx b/superset-frontend/src/explore/controlPanels/sections.tsx index 78815215df22..51b6b9c2f2aa 100644 --- a/superset-frontend/src/explore/controlPanels/sections.tsx +++ b/superset-frontend/src/explore/controlPanels/sections.tsx @@ -19,18 +19,8 @@ import React from 'react'; import { t } from '@superset-ui/core'; import { ControlPanelSectionConfig } from '@superset-ui/chart-controls'; -import { formatSelectOptions } from 'src/explore/exploreUtils'; - -export const druidTimeSeries: ControlPanelSectionConfig = { - label: t('Time'), - expanded: true, - description: t('Time related form attributes'), - controlSetRows: [['time_range']], -}; export const datasourceAndVizType: ControlPanelSectionConfig = { - label: t('Visualization type'), - expanded: true, controlSetRows: [ ['datasource'], ['viz_type'], @@ -90,7 +80,7 @@ export const annotations: ControlPanelSectionConfig = { type: 'AnnotationLayerControl', label: '', default: [], - description: 'Annotation layers', + description: t('Annotation layers'), renderTrigger: true, tabOverride: 'data', }, @@ -140,13 +130,13 @@ export const NVD3TimeSeries: ControlPanelSectionConfig[] = [ type: 'SelectControl', label: t('Rolling function'), default: 'None', - choices: formatSelectOptions([ - 'None', - 'mean', - 'sum', - 'std', - 'cumsum', - ]), + choices: [ + ['None', t('None')], + ['mean', t('mean')], + ['sum', t('sum')], + ['std', t('std')], + ['cumsum', t('cumsum')], + ], description: t( 'Defines a rolling window function to apply, works along ' + 'with the [Periods] text box', @@ -190,22 +180,22 @@ export const NVD3TimeSeries: ControlPanelSectionConfig[] = [ multi: true, freeForm: true, label: t('Time shift'), - choices: formatSelectOptions([ - '1 day', - '1 week', - '28 days', - '30 days', - '52 weeks', - '1 year', - '104 weeks', - '2 years', - '156 weeks', - '3 years', - ]), + choices: [ + ['1 day', t('1 day')], + ['1 week', t('1 week')], + ['28 days', t('28 days')], + ['30 days', t('30 days')], + ['52 weeks', t('52 weeks')], + ['1 year', t('1 year')], + ['104 weeks', t('104 weeks')], + ['2 years', t('2 years')], + ['156 weeks', t('156 weeks')], + ['3 years', t('3 years')], + ], description: t( 'Overlay one or more timeseries from a ' + 'relative time period. Expects relative time deltas ' + - 'in natural language (example: 24 hours, 7 days, ' + + 'in natural language (example: 24 hours, 7 days, ' + '52 weeks, 365 days). Free text is supported.', ), }, @@ -217,10 +207,10 @@ export const NVD3TimeSeries: ControlPanelSectionConfig[] = [ label: t('Calculation type'), default: 'values', choices: [ - ['values', 'Actual values'], - ['absolute', 'Difference'], - ['percentage', 'Percentage change'], - ['ratio', 'Ratio'], + ['values', t('Actual values')], + ['absolute', t('Difference')], + ['percentage', t('Percentage change')], + ['ratio', t('Ratio')], ], description: t( 'How to display time shifts: as individual lines; as the ' + @@ -239,7 +229,14 @@ export const NVD3TimeSeries: ControlPanelSectionConfig[] = [ freeForm: true, label: t('Rule'), default: null, - choices: formatSelectOptions(['1T', '1H', '1D', '7D', '1M', '1AS']), + choices: [ + ['1T', t('1T')], + ['1H', t('1H')], + ['1D', t('1D')], + ['7D', t('7D')], + ['1M', t('1M')], + ['1AS', t('1AS')], + ], description: t('Pandas resample rule'), }, }, @@ -250,14 +247,14 @@ export const NVD3TimeSeries: ControlPanelSectionConfig[] = [ freeForm: true, label: t('Method'), default: null, - choices: formatSelectOptions([ - 'asfreq', - 'bfill', - 'ffill', - 'median', - 'mean', - 'sum', - ]), + choices: [ + ['asfreq', t('asfreq')], + ['bfill', t('bfill')], + ['ffill', t('ffill')], + ['median', t('median')], + ['mean', t('mean')], + ['sum', t('sum')], + ], description: t('Pandas resample method'), }, }, diff --git a/superset-frontend/src/explore/controlUtils/controlUtils.test.tsx b/superset-frontend/src/explore/controlUtils/controlUtils.test.tsx index 1b9cf1ea55c7..5feefc3481aa 100644 --- a/superset-frontend/src/explore/controlUtils/controlUtils.test.tsx +++ b/superset-frontend/src/explore/controlUtils/controlUtils.test.tsx @@ -59,6 +59,7 @@ describe('controlUtils', () => { }, controls: {}, form_data: { datasource: '1__table', viz_type: 'table' }, + common: {}, }; beforeAll(() => { diff --git a/superset-frontend/src/explore/controlUtils/getControlState.ts b/superset-frontend/src/explore/controlUtils/getControlState.ts index 5014cd3c1a40..794c2b7b7a9d 100644 --- a/superset-frontend/src/explore/controlUtils/getControlState.ts +++ b/superset-frontend/src/explore/controlUtils/getControlState.ts @@ -98,6 +98,21 @@ export function applyMapStateToPropsToControl<T = ControlType>( // `mapStateToProps` may also provide a value value = value || state.value; } + + // InitialValue is used for setting value for the control, + // this value is not recalculated. The default value will override it. + if (typeof state.initialValue === 'function') { + state.initialValue = state.initialValue(state, controlPanelState); + // if default is still a function, discard + if (typeof state.initialValue === 'function') { + delete state.initialValue; + } + } + if (state.initialValue) { + value = state.initialValue; + delete state.initialValue; + } + // If default is a function, evaluate it if (typeof state.default === 'function') { state.default = state.default(state, controlPanelState); @@ -159,7 +174,7 @@ export function getAllControlsState( getSectionsToRender(vizType, datasourceType).forEach(section => section.controlSetRows.forEach(fieldsetRow => fieldsetRow.forEach((field: CustomControlItem) => { - if (field && field.config && field.name) { + if (field?.config && field.name) { const { config, name } = field; controlsState[name] = getControlStateFromControlConfig( config, diff --git a/superset-frontend/src/explore/controlUtils/getControlValuesCompatibleWithDatasource.test.ts b/superset-frontend/src/explore/controlUtils/getControlValuesCompatibleWithDatasource.test.ts new file mode 100644 index 000000000000..ad7ccc480121 --- /dev/null +++ b/superset-frontend/src/explore/controlUtils/getControlValuesCompatibleWithDatasource.test.ts @@ -0,0 +1,287 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + ControlState, + Dataset, + sharedControls, +} from '@superset-ui/chart-controls'; +import { DatasourceType, JsonValue } from '@superset-ui/core'; +import { getControlValuesCompatibleWithDatasource } from './getControlValuesCompatibleWithDatasource'; + +const sampleDatasource: Dataset = { + id: 1, + type: DatasourceType.Table, + columns: [ + { column_name: 'sample_column_1' }, + { column_name: 'sample_column_3' }, + { column_name: 'sample_column_4' }, + ], + metrics: [{ metric_name: 'saved_metric_2' }], + column_format: {}, + verbose_map: {}, + main_dttm_col: '', + datasource_name: 'Sample Dataset', + description: 'A sample dataset', +}; + +const getValues = (controlState: ControlState) => { + const { value } = controlState; + return getControlValuesCompatibleWithDatasource( + sampleDatasource, + controlState, + value as JsonValue, + ); +}; + +test('empty values', () => { + const controlState = sharedControls.groupby; + expect( + getValues({ + ...controlState, + value: undefined, + }), + ).toEqual(undefined); + + expect( + getValues({ + ...controlState, + value: null, + }), + ).toEqual(undefined); + + expect( + getValues({ + ...controlState, + value: [], + }), + ).toEqual(controlState.default); +}); + +test('column values', () => { + const controlState = { + ...sharedControls.columns, + options: [ + { column_name: 'sample_column_1' }, + { column_name: 'sample_column_2' }, + { column_name: 'sample_column_3' }, + ], + }; + + expect( + getValues({ + ...controlState, + value: 'sample_column_1', + }), + ).toEqual('sample_column_1'); + + expect( + getValues({ + ...controlState, + value: 'sample_column_2', + }), + ).toEqual(controlState.default); + + expect( + getValues({ + ...controlState, + value: 'sample_column_3', + }), + ).toEqual('sample_column_3'); + + expect( + getValues({ + ...controlState, + value: ['sample_column_1', 'sample_column_2', 'sample_column_3'], + }), + ).toEqual(['sample_column_1', 'sample_column_3']); +}); + +test('saved metric values', () => { + const controlState = { + ...sharedControls.metrics, + savedMetrics: [ + { metric_name: 'saved_metric_1' }, + { metric_name: 'saved_metric_2' }, + ], + }; + + expect( + getValues({ + ...controlState, + value: 'saved_metric_1', + }), + ).toEqual(controlState.default); + + expect( + getValues({ + ...controlState, + value: 'saved_metric_2', + }), + ).toEqual('saved_metric_2'); + + expect( + getValues({ + ...controlState, + value: ['saved_metric_1', 'saved_metric_2'], + }), + ).toEqual(['saved_metric_2']); +}); + +test('simple ad-hoc metric values', () => { + const controlState = { + ...sharedControls.metrics, + columns: [ + { column_name: 'sample_column_1' }, + { column_name: 'sample_column_2' }, + { column_name: 'sample_column_3' }, + ], + }; + + expect( + getValues({ + ...controlState, + value: { + expressionType: 'SIMPLE', + column: { column_name: 'sample_column_1' }, + }, + }), + ).toEqual({ + expressionType: 'SIMPLE', + column: { column_name: 'sample_column_1' }, + }); + + expect( + getValues({ + ...controlState, + value: { + expressionType: 'SIMPLE', + column: { column_name: 'sample_column_2' }, + }, + }), + ).toEqual(controlState.default); + + expect( + getValues({ + ...controlState, + value: [ + { + expressionType: 'SIMPLE', + column: { column_name: 'sample_column_1' }, + }, + { + expressionType: 'SIMPLE', + column: { column_name: 'sample_column_2' }, + }, + ], + }), + ).toEqual([ + { expressionType: 'SIMPLE', column: { column_name: 'sample_column_1' } }, + ]); +}); + +test('SQL ad-hoc metric values', () => { + const controlState = { + ...sharedControls.metrics, + }; + + expect( + getValues({ + ...controlState, + value: { + expressionType: 'SQL', + sqlExpression: 'select * from sample_column_1;', + }, + }), + ).toEqual({ + datasourceWarning: true, + expressionType: 'SQL', + sqlExpression: 'select * from sample_column_1;', + }); +}); + +test('simple ad-hoc filter values', () => { + const controlState = { + ...sharedControls.adhoc_filters, + columns: [ + { column_name: 'sample_column_1' }, + { column_name: 'sample_column_2' }, + { column_name: 'sample_column_3' }, + ], + }; + + expect( + getValues({ + ...controlState, + value: { + expressionType: 'SIMPLE', + subject: 'sample_column_1', + }, + }), + ).toEqual({ + expressionType: 'SIMPLE', + subject: 'sample_column_1', + }); + + expect( + getValues({ + ...controlState, + value: { + expressionType: 'SIMPLE', + subject: 'sample_column_2', + }, + }), + ).toEqual(controlState.default); + + expect( + getValues({ + ...controlState, + value: [ + { + expressionType: 'SIMPLE', + subject: 'sample_column_1', + }, + { + expressionType: 'SIMPLE', + subject: 'sample_column_2', + }, + ], + }), + ).toEqual([{ expressionType: 'SIMPLE', subject: 'sample_column_1' }]); +}); + +test('SQL ad-hoc filter values', () => { + const controlState = { + ...sharedControls.adhoc_filters, + }; + + expect( + getValues({ + ...controlState, + value: { + expressionType: 'SQL', + sqlExpression: 'select * from sample_column_1;', + }, + }), + ).toEqual({ + datasourceWarning: true, + expressionType: 'SQL', + sqlExpression: 'select * from sample_column_1;', + }); +}); diff --git a/superset-frontend/src/explore/controlUtils/getControlValuesCompatibleWithDatasource.ts b/superset-frontend/src/explore/controlUtils/getControlValuesCompatibleWithDatasource.ts index e070e82464d5..7013b59764cb 100644 --- a/superset-frontend/src/explore/controlUtils/getControlValuesCompatibleWithDatasource.ts +++ b/superset-frontend/src/explore/controlUtils/getControlValuesCompatibleWithDatasource.ts @@ -21,6 +21,7 @@ import { ControlState, Dataset, Metric } from '@superset-ui/chart-controls'; import { Column, isAdhocMetricSimple, + isAdhocMetricSQL, isSavedMetric, isSimpleAdhocFilter, JsonValue, @@ -35,11 +36,12 @@ const isControlValueCompatibleWithDatasource = ( ) => { if (controlState.options && typeof value === 'string') { if ( - (Array.isArray(controlState.options) && - controlState.options.some( - (option: [string | number, string]) => option[0] === value, - )) || - value in controlState.options + controlState.options.some( + (option: [string | number, string] | { column_name: string }) => + Array.isArray(option) + ? option[0] === value + : option.column_name === value, + ) ) { return datasource.columns.some(column => column.column_name === value); } @@ -70,6 +72,10 @@ const isControlValueCompatibleWithDatasource = ( column.column_name === (value as SimpleAdhocFilter).subject, ); } + if (isAdhocMetricSQL(value)) { + Object.assign(value, { datasourceWarning: true }); + return true; + } return false; }; diff --git a/superset-frontend/src/explore/controlUtils/getFormDataFromDashboardContext.test.ts b/superset-frontend/src/explore/controlUtils/getFormDataFromDashboardContext.test.ts new file mode 100644 index 000000000000..f3584e1c7092 --- /dev/null +++ b/superset-frontend/src/explore/controlUtils/getFormDataFromDashboardContext.test.ts @@ -0,0 +1,305 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { JsonObject } from '@superset-ui/core'; +import { getFormDataWithDashboardContext } from './getFormDataWithDashboardContext'; + +const getExploreFormData = (overrides: JsonObject = {}) => ({ + adhoc_filters: [ + { + clause: 'WHERE' as const, + expressionType: 'SIMPLE' as const, + operator: 'IN' as const, + subject: 'gender', + comparator: ['boys'], + filterOptionName: '123', + }, + { + clause: 'WHERE' as const, + expressionType: 'SQL' as const, + operator: null, + subject: null, + comparator: null, + sqlExpression: "name = 'John'", + filterOptionName: '456', + }, + { + clause: 'WHERE' as const, + expressionType: 'SQL' as const, + operator: null, + subject: null, + comparator: null, + sqlExpression: "city = 'Warsaw'", + filterOptionName: '567', + }, + { + clause: 'WHERE' as const, + expressionType: 'SIMPLE' as const, + operator: 'TEMPORAL_RANGE' as const, + subject: 'ds', + comparator: 'No filter', + filterOptionName: '678', + }, + ], + adhoc_filters_b: [ + { + clause: 'WHERE' as const, + expressionType: 'SQL' as const, + operator: null, + subject: null, + comparator: null, + sqlExpression: "country = 'Poland'", + filterOptionName: '789', + }, + ], + applied_time_extras: {}, + color_scheme: 'supersetColors', + datasource: '2__table', + granularity_sqla: 'ds', + groupby: ['gender'], + metric: { + aggregate: 'SUM', + column: { + column_name: 'num', + type: 'BIGINT', + }, + expressionType: 'SIMPLE', + label: 'Births', + }, + slice_id: 46, + time_range: '100 years ago : now', + viz_type: 'pie', + ...overrides, +}); + +const getDashboardFormData = (overrides: JsonObject = {}) => ({ + label_colors: { + Girls: '#FF69B4', + Boys: '#ADD8E6', + girl: '#FF69B4', + boy: '#ADD8E6', + }, + shared_label_colors: { + boy: '#ADD8E6', + girl: '#FF69B4', + }, + color_scheme: 'd3Category20b', + extra_filters: [ + { + col: '__time_range', + op: '==', + val: 'No filter', + }, + { + col: '__time_grain', + op: '==', + val: 'P1D', + }, + { + col: '__time_col', + op: '==', + val: 'ds', + }, + ], + extra_form_data: { + filters: [ + { + col: 'name', + op: 'IN', + val: ['Aaron'], + }, + { + col: 'num_boys', + op: '<=', + val: 10000, + }, + ], + granularity_sqla: 'ds', + time_range: 'Last month', + time_grain_sqla: 'PT1S', + }, + dashboardId: 2, + ...overrides, +}); + +const getExpectedResultFormData = (overrides: JsonObject = {}) => ({ + adhoc_filters: [ + { + clause: 'WHERE', + expressionType: 'SIMPLE', + operator: 'IN', + subject: 'gender', + comparator: ['boys'], + filterOptionName: '123', + }, + { + clause: 'WHERE' as const, + expressionType: 'SQL' as const, + operator: null, + subject: null, + comparator: null, + sqlExpression: "name = 'John'", + filterOptionName: '456', + }, + { + clause: 'WHERE' as const, + expressionType: 'SQL' as const, + operator: null, + subject: null, + comparator: null, + sqlExpression: "city = 'Warsaw'", + filterOptionName: '567', + }, + { + clause: 'WHERE', + expressionType: 'SIMPLE', + operator: 'TEMPORAL_RANGE', + subject: 'ds', + comparator: 'Last month', + filterOptionName: expect.any(String), + isExtra: true, + }, + { + clause: 'WHERE', + expressionType: 'SIMPLE', + operator: 'IN', + subject: 'name', + comparator: ['Aaron'], + isExtra: true, + filterOptionName: expect.any(String), + }, + { + clause: 'WHERE', + expressionType: 'SIMPLE', + operator: '<=', + subject: 'num_boys', + comparator: 10000, + isExtra: true, + filterOptionName: expect.any(String), + }, + ], + adhoc_filters_b: [ + { + clause: 'WHERE' as const, + expressionType: 'SQL' as const, + operator: null, + subject: null, + comparator: null, + sqlExpression: "country = 'Poland'", + filterOptionName: expect.any(String), + }, + { + clause: 'WHERE', + expressionType: 'SIMPLE', + operator: 'IN', + subject: 'name', + comparator: ['Aaron'], + isExtra: true, + filterOptionName: expect.any(String), + }, + { + clause: 'WHERE', + expressionType: 'SIMPLE', + operator: '<=', + subject: 'num_boys', + comparator: 10000, + isExtra: true, + filterOptionName: expect.any(String), + }, + ], + applied_time_extras: { + __time_grain: 'P1D', + __time_col: 'ds', + }, + color_scheme: 'd3Category20b', + datasource: '2__table', + granularity_sqla: 'ds', + groupby: ['gender'], + metric: { + aggregate: 'SUM', + column: { + column_name: 'num', + type: 'BIGINT', + }, + expressionType: 'SIMPLE', + label: 'Births', + }, + slice_id: 46, + time_range: 'Last month', + viz_type: 'pie', + label_colors: { + Girls: '#FF69B4', + Boys: '#ADD8E6', + girl: '#FF69B4', + boy: '#ADD8E6', + }, + shared_label_colors: { + boy: '#ADD8E6', + girl: '#FF69B4', + }, + extra_filters: [ + { + col: '__time_range', + op: '==', + val: 'No filter', + }, + { + col: '__time_grain', + op: '==', + val: 'P1D', + }, + { + col: '__time_col', + op: '==', + val: 'ds', + }, + ], + extra_form_data: { + filters: [ + { + col: 'name', + op: 'IN', + val: ['Aaron'], + }, + { + col: 'num_boys', + op: '<=', + val: 10000, + }, + ], + granularity_sqla: 'ds', + time_range: 'Last month', + time_grain_sqla: 'PT1S', + }, + dashboardId: 2, + time_grain_sqla: 'PT1S', + granularity: 'ds', + extras: { + time_grain_sqla: 'PT1S', + }, + ...overrides, +}); + +test('merges dashboard context form data with explore form data', () => { + const fullFormData = getFormDataWithDashboardContext( + getExploreFormData(), + getDashboardFormData(), + ); + expect(fullFormData).toEqual(getExpectedResultFormData()); +}); diff --git a/superset-frontend/src/explore/controlUtils/getFormDataWithDashboardContext.ts b/superset-frontend/src/explore/controlUtils/getFormDataWithDashboardContext.ts new file mode 100644 index 000000000000..9565b48ddf46 --- /dev/null +++ b/superset-frontend/src/explore/controlUtils/getFormDataWithDashboardContext.ts @@ -0,0 +1,236 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import isEqual from 'lodash/isEqual'; +import { + EXTRA_FORM_DATA_OVERRIDE_REGULAR_MAPPINGS, + EXTRA_FORM_DATA_OVERRIDE_EXTRA_KEYS, + isDefined, + JsonObject, + ensureIsArray, + QueryObjectFilterClause, + SimpleAdhocFilter, + QueryFormData, + AdhocFilter, + isFreeFormAdhocFilter, + isSimpleAdhocFilter, + NO_TIME_RANGE, +} from '@superset-ui/core'; + +const simpleFilterToAdhoc = ( + filterClause: QueryObjectFilterClause, + clause = 'where', +) => { + const result = { + clause: clause.toUpperCase(), + expressionType: 'SIMPLE', + operator: filterClause.op, + subject: filterClause.col, + comparator: 'val' in filterClause ? filterClause.val : undefined, + } as SimpleAdhocFilter; + if (filterClause.isExtra) { + Object.assign(result, { + isExtra: true, + filterOptionName: `filter_${Math.random() + .toString(36) + .substring(2, 15)}_${Math.random().toString(36).substring(2, 15)}`, + }); + } + return result; +}; + +const removeAdhocFilterDuplicates = (filters: AdhocFilter[]) => { + const isDuplicate = ( + adhocFilter: AdhocFilter, + existingFilters: AdhocFilter[], + ) => + existingFilters.some( + (existingFilter: AdhocFilter) => + (isFreeFormAdhocFilter(existingFilter) && + isFreeFormAdhocFilter(adhocFilter) && + existingFilter.clause === adhocFilter.clause && + existingFilter.sqlExpression === adhocFilter.sqlExpression) || + (isSimpleAdhocFilter(existingFilter) && + isSimpleAdhocFilter(adhocFilter) && + existingFilter.operator === adhocFilter.operator && + existingFilter.subject === adhocFilter.subject && + ((!('comparator' in existingFilter) && + !('comparator' in adhocFilter)) || + ('comparator' in existingFilter && + 'comparator' in adhocFilter && + isEqual(existingFilter.comparator, adhocFilter.comparator)))), + ); + + return filters.reduce((acc, filter) => { + if (!isDuplicate(filter, acc)) { + acc.push(filter); + } + return acc; + }, [] as AdhocFilter[]); +}; + +const mergeFilterBoxToFormData = ( + exploreFormData: QueryFormData, + dashboardFormData: JsonObject, +) => { + const dateColumns = { + __time_range: 'time_range', + __time_col: 'granularity_sqla', + __time_grain: 'time_grain_sqla', + __granularity: 'granularity', + }; + const appliedTimeExtras = {}; + + const filterBoxData: JsonObject = {}; + ensureIsArray(dashboardFormData.extra_filters).forEach(filter => { + if (dateColumns[filter.col]) { + if (filter.val !== NO_TIME_RANGE) { + filterBoxData[dateColumns[filter.col]] = filter.val; + appliedTimeExtras[filter.col] = filter.val; + } + } else { + const adhocFilter = simpleFilterToAdhoc({ + ...(filter as QueryObjectFilterClause), + isExtra: true, + }); + filterBoxData.adhoc_filters = [ + ...ensureIsArray(filterBoxData.adhoc_filters), + adhocFilter, + ]; + } + }); + filterBoxData.applied_time_extras = appliedTimeExtras; + return filterBoxData; +}; + +const mergeNativeFiltersToFormData = ( + exploreFormData: QueryFormData, + dashboardFormData: JsonObject, +) => { + const nativeFiltersData: JsonObject = {}; + const extraFormData = dashboardFormData.extra_form_data || {}; + + Object.entries(EXTRA_FORM_DATA_OVERRIDE_REGULAR_MAPPINGS).forEach( + ([srcKey, targetKey]) => { + const val = extraFormData[srcKey]; + if (isDefined(val)) { + nativeFiltersData[targetKey] = val; + } + }, + ); + + if ('time_grain_sqla' in extraFormData) { + nativeFiltersData.time_grain_sqla = extraFormData.time_grain_sqla; + } + if ('granularity_sqla' in extraFormData) { + nativeFiltersData.granularity_sqla = extraFormData.granularity_sqla; + } + + const extras = dashboardFormData.extras || {}; + EXTRA_FORM_DATA_OVERRIDE_EXTRA_KEYS.forEach(key => { + const val = extraFormData[key]; + if (isDefined(val)) { + extras[key] = val; + } + }); + if (Object.keys(extras).length) { + nativeFiltersData.extras = extras; + } + + nativeFiltersData.adhoc_filters = ensureIsArray( + extraFormData.adhoc_filters, + ).map(filter => ({ + ...filter, + isExtra: true, + })); + + const appendFilters = ensureIsArray(extraFormData.filters).map(extraFilter => + simpleFilterToAdhoc({ ...extraFilter, isExtra: true }), + ); + Object.keys(exploreFormData).forEach(key => { + if (key.match(/adhoc_filter.*/)) { + nativeFiltersData[key] = [ + ...ensureIsArray(nativeFiltersData[key]), + ...appendFilters, + ]; + } + }); + return nativeFiltersData; +}; + +const applyTimeRangeFilters = ( + dashboardFormData: JsonObject, + adhocFilters: AdhocFilter[], +) => { + const extraFormData = dashboardFormData.extra_form_data || {}; + if ('time_range' in extraFormData) { + return adhocFilters.map((filter: SimpleAdhocFilter) => { + if (filter.operator === 'TEMPORAL_RANGE') { + return { + ...filter, + comparator: extraFormData.time_range, + isExtra: true, + }; + } + return filter; + }); + } + return adhocFilters; +}; + +export const getFormDataWithDashboardContext = ( + exploreFormData: QueryFormData, + dashboardContextFormData: JsonObject, +) => { + const filterBoxData = mergeFilterBoxToFormData( + exploreFormData, + dashboardContextFormData, + ); + const nativeFiltersData = mergeNativeFiltersToFormData( + exploreFormData, + dashboardContextFormData, + ); + const adhocFilters = [ + ...Object.keys(exploreFormData), + ...Object.keys(filterBoxData), + ...Object.keys(nativeFiltersData), + ] + .filter(key => key.match(/adhoc_filter.*/)) + .reduce( + (acc, key) => ({ + ...acc, + [key]: applyTimeRangeFilters( + dashboardContextFormData, + removeAdhocFilterDuplicates([ + ...ensureIsArray(exploreFormData[key]), + ...ensureIsArray(filterBoxData[key]), + ...ensureIsArray(nativeFiltersData[key]), + ]), + ), + }), + {}, + ); + + return { + ...exploreFormData, + ...dashboardContextFormData, + ...filterBoxData, + ...nativeFiltersData, + ...adhocFilters, + }; +}; diff --git a/superset-frontend/src/explore/controlUtils/getSectionsToRender.ts b/superset-frontend/src/explore/controlUtils/getSectionsToRender.ts index c82833f4705b..5bfefb8ec654 100644 --- a/superset-frontend/src/explore/controlUtils/getSectionsToRender.ts +++ b/superset-frontend/src/explore/controlUtils/getSectionsToRender.ts @@ -54,11 +54,11 @@ const getMemoizedSectionsToRender = memoizeOne( const { datasourceAndVizType } = sections; - // list of datasource-specific controls that should be removed - const invalidControls = - datasourceType === 'table' - ? ['granularity', 'druid_time_origin'] - : ['granularity_sqla', 'time_grain_sqla']; + // list of datasource-specific controls that should be removed if the datasource is a specific type + const filterControlsForTypes = [DatasourceType.Query, DatasourceType.Table]; + const invalidControls = filterControlsForTypes.includes(datasourceType) + ? ['granularity'] + : ['granularity_sqla', 'time_grain_sqla']; return [datasourceAndVizType] .concat(controlPanelSections.filter(isControlPanelSectionConfig)) diff --git a/superset-frontend/src/explore/controlUtils/standardizedFormData.test.ts b/superset-frontend/src/explore/controlUtils/standardizedFormData.test.ts index e7d1c758c44d..4f8de967a895 100644 --- a/superset-frontend/src/explore/controlUtils/standardizedFormData.test.ts +++ b/superset-frontend/src/explore/controlUtils/standardizedFormData.test.ts @@ -16,33 +16,180 @@ * specific language governing permissions and limitations * under the License. */ -import { getChartControlPanelRegistry, QueryFormData } from '@superset-ui/core'; +import { + AdhocColumn, + AdhocMetricSimple, + AdhocMetricSQL, + getChartControlPanelRegistry, + QueryFormData, + TimeGranularity, +} from '@superset-ui/core'; import TableChartPlugin from '@superset-ui/plugin-chart-table'; import { BigNumberTotalChartPlugin } from '@superset-ui/plugin-chart-echarts'; import { sections } from '@superset-ui/chart-controls'; import { StandardizedFormData, - sharedControls, + sharedMetricsKey, + sharedColumnsKey, publicControls, } from './standardizedFormData'; -import { xAxisControl } from '../../../plugins/plugin-chart-echarts/src/controls'; + +const adhocColumn: AdhocColumn = { + expressionType: 'SQL', + label: 'country', + optionName: 'country', + sqlExpression: 'country', +}; +const adhocMetricSQL: AdhocMetricSQL = { + expressionType: 'SQL', + label: 'count', + optionName: 'count', + sqlExpression: 'count(*)', +}; +const adhocMetricSimple: AdhocMetricSimple = { + expressionType: 'SIMPLE', + column: { + id: 1, + column_name: 'sales', + columnName: 'sales', + verbose_name: 'sales', + }, + aggregate: 'SUM', + label: 'count', + optionName: 'count', +}; + +const tableVizFormData = { + datasource: '30__table', + viz_type: 'table', + granularity_sqla: 'ds', + time_grain_sqla: TimeGranularity.DAY, + time_range: 'No filter', + query_mode: 'aggregate', + groupby: ['name', 'gender', adhocColumn], + metrics: ['count', 'avg(sales)', adhocMetricSimple, adhocMetricSQL], + all_columns: [], + percent_metrics: [], + adhoc_filters: [], + order_by_cols: [], + row_limit: 10000, + server_page_length: 10, + order_desc: true, + table_timestamp_format: 'smart_date', + show_cell_bars: true, + color_pn: true, + url_params: { + form_data_key: + 'p3No_sqDW7k-kMTzlBPAPd9vwp1IXTf6stbyzjlrPPa0ninvdYUUiMC6F1iKit3Y', + dataset_id: '30', + }, +}; +const tableVizStore = { + form_data: tableVizFormData, + controls: { + datasource: { + value: '30__table', + }, + viz_type: { + value: 'table', + }, + slice_id: {}, + cache_timeout: {}, + url_params: { + value: { + form_data_key: + 'p3No_sqDW7k-kMTzlBPAPd9vwp1IXTf6stbyzjlrPPa0ninvdYUUiMC6F1iKit3Y', + dataset_id: '30', + }, + }, + granularity_sqla: { + value: 'ds', + }, + time_grain_sqla: { + value: 'P1D', + }, + time_range: { + value: 'No filter', + }, + query_mode: { + value: 'aggregate', + }, + groupby: { + value: ['name', 'gender', adhocColumn], + }, + metrics: { + value: ['count', 'avg(sales)', adhocMetricSimple, adhocMetricSQL], + }, + all_columns: { + value: [], + }, + percent_metrics: { + value: [], + }, + adhoc_filters: { + value: [], + }, + timeseries_limit_metric: {}, + order_by_cols: { + value: [], + }, + server_pagination: {}, + row_limit: { + value: 10000, + }, + server_page_length: { + value: 10, + }, + include_time: {}, + order_desc: { + value: true, + }, + show_totals: {}, + table_timestamp_format: { + value: 'smart_date', + }, + page_length: {}, + include_search: {}, + show_cell_bars: { + value: true, + }, + align_pn: {}, + color_pn: { + value: true, + }, + column_config: {}, + conditional_formatting: {}, + }, + datasource: { + type: 'table', + columns: [], + }, +}; describe('should collect control values and create SFD', () => { + const sharedKey = [...sharedMetricsKey, ...sharedColumnsKey]; const sharedControlsFormData = { // metrics metric: 'm1', metrics: ['m2'], metric_2: 'm3', + size: 'm4', + x: 'm5', + y: 'm6', + secondary_metric: 'm7', // columns groupby: ['c1'], columns: ['c2'], groupbyColumns: ['c3'], groupbyRows: ['c4'], + series: 'c5', + entity: 'c6', + series_columns: ['c7'], }; const publicControlsFormData = { // time section granularity_sqla: 'time_column', - time_grain_sqla: 'P1D', + time_grain_sqla: TimeGranularity.DAY, time_range: '2000 : today', // filters adhoc_filters: [], @@ -74,6 +221,7 @@ describe('should collect control values and create SFD', () => { datasource: '100__table', viz_type: 'source_viz', }; + const sourceMockStore = { form_data: sourceMockFormData, controls: Object.fromEntries( @@ -87,6 +235,7 @@ describe('should collect control values and create SFD', () => { columns: [], }, }; + beforeAll(() => { getChartControlPanelRegistry().registerValue('source_viz', { controlPanelSections: [ @@ -97,7 +246,7 @@ describe('should collect control values and create SFD', () => { }, { label: 'axis column', - controlSetRows: [[xAxisControl]], + controlSetRows: [['x_axis']], }, ], }); @@ -110,19 +259,19 @@ describe('should collect control values and create SFD', () => { }, { label: 'axis column', - controlSetRows: [[xAxisControl]], + controlSetRows: [['x_axis']], }, ], - denormalizeFormData: (formData: QueryFormData) => ({ + formDataOverrides: (formData: QueryFormData) => ({ ...formData, - columns: formData.standardizedFormData.standardizedState.columns, - metrics: formData.standardizedFormData.standardizedState.metrics, + columns: formData.standardizedFormData.controls.columns, + metrics: formData.standardizedFormData.controls.metrics, }), }); }); test('should avoid to overlap', () => { - const sharedControlsSet = new Set(Object.keys(sharedControls)); + const sharedControlsSet = new Set(Object.keys(sharedKey)); const publicControlsSet = new Set(publicControls); expect( [...sharedControlsSet].filter((x: string) => publicControlsSet.has(x)), @@ -131,19 +280,26 @@ describe('should collect control values and create SFD', () => { test('should collect all sharedControls', () => { expect(Object.entries(sharedControlsFormData).length).toBe( - Object.entries(sharedControls).length, + Object.entries(sharedKey).length, ); const sfd = new StandardizedFormData(sourceMockFormData); - expect(sfd.serialize().standardizedState.metrics).toEqual([ + expect(sfd.serialize().controls.metrics).toEqual([ 'm1', 'm2', 'm3', + 'm4', + 'm5', + 'm6', + 'm7', ]); - expect(sfd.serialize().standardizedState.columns).toEqual([ + expect(sfd.serialize().controls.columns).toEqual([ 'c1', 'c2', 'c3', 'c4', + 'c5', + 'c6', + 'c7', ]); }); @@ -158,8 +314,24 @@ describe('should collect control values and create SFD', () => { expect(formData).toHaveProperty(key); expect(value).toEqual(publicControlsFormData[key]); }); - expect(formData.columns).toEqual(['c1', 'c2', 'c3', 'c4']); - expect(formData.metrics).toEqual(['m1', 'm2', 'm3']); + expect(formData.columns).toEqual([ + 'c1', + 'c2', + 'c3', + 'c4', + 'c5', + 'c6', + 'c7', + ]); + expect(formData.metrics).toEqual([ + 'm1', + 'm2', + 'm3', + 'm4', + 'm5', + 'm6', + 'm7', + ]); }); test('should inherit standardizedFormData and memorizedFormData is LIFO', () => { @@ -204,114 +376,6 @@ describe('should collect control values and create SFD', () => { }); describe('should transform form_data between table and bigNumberTotal', () => { - const tableVizFormData = { - datasource: '30__table', - viz_type: 'table', - granularity_sqla: 'ds', - time_grain_sqla: 'P1D', - time_range: 'No filter', - query_mode: 'aggregate', - groupby: ['name'], - metrics: ['count'], - all_columns: [], - percent_metrics: [], - adhoc_filters: [], - order_by_cols: [], - row_limit: 10000, - server_page_length: 10, - order_desc: true, - table_timestamp_format: 'smart_date', - show_cell_bars: true, - color_pn: true, - url_params: { - form_data_key: - 'p3No_sqDW7k-kMTzlBPAPd9vwp1IXTf6stbyzjlrPPa0ninvdYUUiMC6F1iKit3Y', - dataset_id: '30', - }, - }; - const tableVizStore = { - form_data: tableVizFormData, - controls: { - datasource: { - value: '30__table', - }, - viz_type: { - value: 'table', - }, - slice_id: {}, - cache_timeout: {}, - url_params: { - value: { - form_data_key: - 'p3No_sqDW7k-kMTzlBPAPd9vwp1IXTf6stbyzjlrPPa0ninvdYUUiMC6F1iKit3Y', - dataset_id: '30', - }, - }, - granularity_sqla: { - value: 'ds', - }, - time_grain_sqla: { - value: 'P1D', - }, - time_range: { - value: 'No filter', - }, - query_mode: { - value: 'aggregate', - }, - groupby: { - value: ['name'], - }, - metrics: { - value: ['count'], - }, - all_columns: { - value: [], - }, - percent_metrics: { - value: [], - }, - adhoc_filters: { - value: [], - }, - timeseries_limit_metric: {}, - order_by_cols: { - value: [], - }, - server_pagination: {}, - row_limit: { - value: 10000, - }, - server_page_length: { - value: 10, - }, - include_time: {}, - order_desc: { - value: true, - }, - show_totals: {}, - emit_filter: {}, - table_timestamp_format: { - value: 'smart_date', - }, - page_length: {}, - include_search: {}, - show_cell_bars: { - value: true, - }, - align_pn: {}, - color_pn: { - value: true, - }, - column_config: {}, - conditional_formatting: {}, - }, - datasource: { - type: 'table', - columns: [], - }, - }; - beforeAll(() => { getChartControlPanelRegistry().registerValue( 'big_number_total', @@ -350,7 +414,7 @@ describe('should transform form_data between table and bigNumberTotal', () => { expect(bntFormData.viz_type).toBe('big_number_total'); expect(bntFormData.metric).toBe('count'); - // change control values + // change control values on bigNumber bntFormData.metric = 'sum(sales)'; bntFormData.time_range = '2021 : 2022'; bntControlsState.metric.value = 'sum(sales)'; @@ -368,8 +432,56 @@ describe('should transform form_data between table and bigNumberTotal', () => { [...Object.keys(tblControlsState), 'standardizedFormData'].sort(), ); expect(tblFormData.viz_type).toBe('table'); - expect(tblFormData.metrics).toEqual(['sum(sales)']); - expect(tblFormData.groupby).toEqual(['name']); + expect(tblFormData.metrics).toEqual([ + 'sum(sales)', + 'avg(sales)', + adhocMetricSimple, + adhocMetricSQL, + ]); + expect(tblFormData.groupby).toEqual(['name', 'gender', adhocColumn]); expect(tblFormData.time_range).toBe('2021 : 2022'); }); }); + +describe('initial SFD between different datasource', () => { + beforeAll(() => { + getChartControlPanelRegistry().registerValue( + 'big_number_total', + new BigNumberTotalChartPlugin().controlPanel, + ); + getChartControlPanelRegistry().registerValue( + 'table', + new TableChartPlugin().controlPanel, + ); + }); + + test('initial SFD between different datasource', () => { + const sfd = new StandardizedFormData(tableVizFormData); + // table -> big number + const { formData: bntFormData, controlsState: bntControlsState } = + sfd.transform('big_number_total', tableVizStore); + const sfd2 = new StandardizedFormData(bntFormData); + // big number -> table + const { formData: tblFormData } = sfd2.transform('table', { + ...tableVizStore, + form_data: bntFormData, + controls: bntControlsState, + }); + + expect( + tblFormData.standardizedFormData.memorizedFormData.map( + (mfd: [string, QueryFormData][]) => mfd[0], + ), + ).toEqual(['table', 'big_number_total']); + const newDatasourceFormData = { ...tblFormData, datasource: '20__table' }; + const newDatasourceSFD = new StandardizedFormData(newDatasourceFormData); + expect( + newDatasourceSFD + .serialize() + .memorizedFormData.map(([vizType]) => vizType), + ).toEqual(['table']); + expect(newDatasourceSFD.get('table')).not.toHaveProperty( + 'standardizedFormData', + ); + }); +}); diff --git a/superset-frontend/src/explore/controlUtils/standardizedFormData.ts b/superset-frontend/src/explore/controlUtils/standardizedFormData.ts index 99b0220da334..082ff6c91daa 100644 --- a/superset-frontend/src/explore/controlUtils/standardizedFormData.ts +++ b/superset-frontend/src/explore/controlUtils/standardizedFormData.ts @@ -16,38 +16,43 @@ * specific language governing permissions and limitations * under the License. */ -import { isEmpty, intersection } from 'lodash'; +import { omit } from 'lodash'; import { ensureIsArray, getChartControlPanelRegistry, + QueryFormColumn, QueryFormData, + QueryFormMetric, } from '@superset-ui/core'; import { ControlStateMapping, - StandardizedState, + getStandardizedControls, + isStandardizedFormData, + StandardizedControls, StandardizedFormDataInterface, } from '@superset-ui/chart-controls'; import { getControlsState } from 'src/explore/store'; import { getFormDataFromControls } from './getFormDataFromControls'; -export const sharedControls: Record<string, keyof StandardizedState> = { - // metrics - metric: 'metrics', // via sharedControls, scalar - metrics: 'metrics', // via sharedControls, array - metric_2: 'metrics', // via sharedControls, scalar - // columns - groupby: 'columns', // via sharedControls, array - columns: 'columns', // via sharedControls, array - groupbyColumns: 'columns', // via pivot table v2, array - groupbyRows: 'columns', // via pivot table v2, array -}; -const sharedControlsMap: Record<keyof StandardizedState, string[]> = { - metrics: [], - columns: [], -}; -Object.entries(sharedControls).forEach(([key, value]) => - sharedControlsMap[value].push(key), -); +export const sharedMetricsKey = [ + 'metric', // via sharedControls, scalar + 'metrics', // via sharedControls, array + 'metric_2', // via sharedControls, scalar + 'size', // via sharedControls, scalar + 'x', // via sharedControls, scalar + 'y', // via sharedControls, scalar + 'secondary_metric', // via sharedControls, scalar +]; +export const sharedColumnsKey = [ + 'groupby', // via sharedControls, array + 'columns', // via sharedControls, array + 'groupbyColumns', // via pivot table v2, array + 'groupbyRows', // via pivot table v2, array + 'entity', // via sharedControls, scalar + 'series', // via sharedControls, scalar + 'series_columns', // via sharedControls, array +]; + export const publicControls = [ // time section 'granularity_sqla', // via sharedControls @@ -87,90 +92,78 @@ export class StandardizedFormData { * */ const formData = Object.freeze(sourceFormData); - // generates an ordered map, the key is viz_type and the value is form_data. the last item is current viz - const memorizedFormData: Map<string, QueryFormData> = Array.isArray( - formData?.standardizedFormData?.memorizedFormData, - ) - ? new Map(formData.standardizedFormData.memorizedFormData) - : new Map(); + // generates an ordered map, the key is viz_type and the value is form_data. the last item is current viz. + const mfd = formData?.standardizedFormData?.memorizedFormData; const vizType = formData.viz_type; - if (memorizedFormData.has(vizType)) { - memorizedFormData.delete(vizType); + let memorizedFormData = new Map<string, QueryFormData>(); + let controls: StandardizedControls; + if ( + Array.isArray(mfd) && + mfd.length > 0 && + formData.datasource === mfd.slice(-1)[0][1]?.datasource + ) { + memorizedFormData = new Map( + formData.standardizedFormData.memorizedFormData, + ); + if (memorizedFormData.has(vizType)) { + memorizedFormData.delete(vizType); + } + memorizedFormData.set(vizType, formData); + controls = StandardizedFormData.getStandardizedControls(formData); + } else { + // reset the `memorizedFormData` if a request between different datasource. + const restFormData = omit( + formData, + 'standardizedFormData', + ) as QueryFormData; + memorizedFormData.set(vizType, restFormData); + controls = StandardizedFormData.getStandardizedControls(restFormData); } - memorizedFormData.set(vizType, formData); - - // calculate sharedControls - const standardizedState = - StandardizedFormData.getStandardizedState(formData); this.sfd = { - standardizedState, + controls, memorizedFormData, }; } - static getStandardizedState(formData: QueryFormData): StandardizedState { - // 1. collect current sharedControls - let currState: StandardizedState = { + static getStandardizedControls( + formData: QueryFormData, + ): StandardizedControls { + // 1. initial StandardizedControls + const controls: StandardizedControls = { metrics: [], columns: [], }; + + // 2. collect current sharedControls Object.entries(formData).forEach(([key, value]) => { - if (key in sharedControls) { - currState[sharedControls[key]].push(...ensureIsArray(value)); + if (sharedMetricsKey.includes(key)) { + controls.metrics.push(...ensureIsArray<QueryFormMetric>(value)); } - }); - - // 2. get previous StandardizedState - let prevState: StandardizedState = { - metrics: [], - columns: [], - }; - if ( - formData?.standardizedFormData?.standardizedState && - Array.isArray(formData.standardizedFormData.standardizedState.metrics) && - Array.isArray(formData.standardizedFormData.standardizedState.columns) - ) { - prevState = formData.standardizedFormData.standardizedState; - } - // the initial prevState should equal to currentState - if (isEmpty(prevState.metrics) && isEmpty(prevState.columns)) { - prevState = currState; - } - - // 3. inherit SS from previous state if current viz hasn't columns-like controls or metrics-like controls - Object.keys(sharedControlsMap).forEach(key => { - if ( - isEmpty(intersection(Object.keys(formData), sharedControlsMap[key])) - ) { - currState[key] = prevState[key]; + if (sharedColumnsKey.includes(key)) { + controls.columns.push(...ensureIsArray<QueryFormColumn>(value)); } }); - // 4. update hook - const controlPanel = getChartControlPanelRegistry().get(formData.viz_type); - if (controlPanel?.updateStandardizedState) { - currState = controlPanel.updateStandardizedState(prevState, currState); + // 3. append inherit sharedControls + if (isStandardizedFormData(formData)) { + const { metrics, columns } = formData.standardizedFormData.controls; + controls.metrics.push(...metrics); + controls.columns.push(...columns); } - // 5. clear up - Object.entries(currState).forEach(([key, value]) => { - currState[key] = value.filter(Boolean); - }); - - return currState; + return controls; } private getLatestFormData(vizType: string): QueryFormData { if (this.has(vizType)) { return this.get(vizType); } - return this.memorizedFormData.slice(-1)[0][1]; } - private get standardizedState() { - return this.sfd.standardizedState; + private get standardizedControls() { + return this.sfd.controls; } private get memorizedFormData() { @@ -179,7 +172,7 @@ export class StandardizedFormData { serialize() { return { - standardizedState: this.standardizedState, + controls: this.standardizedControls, memorizedFormData: this.memorizedFormData, }; } @@ -205,8 +198,9 @@ export class StandardizedFormData { * 2. collect public control values * 3. generate initial targetControlsState * 4. attach `standardizedFormData` to the initial form_data - * 5. call denormalizeFormData to transform initial form_data if the plugin was defined + * 5. call formDataOverrides to transform initial form_data if the plugin was defined * 6. use final form_data to generate controlsState + * 7. to refresh validator message * */ const latestFormData = this.getLatestFormData(targetVizType); const publicFormData = {}; @@ -225,18 +219,33 @@ export class StandardizedFormData { standardizedFormData: this.serialize(), }; + let rv = { + formData: targetFormData, + controlsState: targetControlsState, + }; + const controlPanel = getChartControlPanelRegistry().get(targetVizType); - if (controlPanel?.denormalizeFormData) { - const transformed = controlPanel.denormalizeFormData(targetFormData); - return { + if (controlPanel?.formDataOverrides) { + getStandardizedControls().setStandardizedControls(targetFormData); + const transformed = { + ...controlPanel.formDataOverrides(targetFormData), + standardizedFormData: { + controls: { ...getStandardizedControls().controls }, + memorizedFormData: this.memorizedFormData, + }, + }; + getStandardizedControls().clear(); + rv = { formData: transformed, controlsState: getControlsState(exploreState, transformed), }; } - return { - formData: targetFormData, - controlsState: targetControlsState, - }; + // refresh validator message + rv.controlsState = getControlsState( + { ...exploreState, controls: rv.controlsState }, + rv.formData, + ); + return rv; } } diff --git a/superset-frontend/src/explore/controls.jsx b/superset-frontend/src/explore/controls.jsx index e3fb05614de3..d4e371c93958 100644 --- a/superset-frontend/src/explore/controls.jsx +++ b/superset-frontend/src/explore/controls.jsx @@ -75,8 +75,8 @@ export const PRIMARY_COLOR = { r: 0, g: 122, b: 135, a: 1 }; // input choices & options export const D3_FORMAT_OPTIONS = [ - ['SMART_NUMBER', 'Adaptive formatting'], - ['~g', 'Original value'], + ['SMART_NUMBER', t('Adaptive formatting')], + ['~g', t('Original value')], [',d', ',d (12345.432 => 12,345)'], ['.1s', '.1s (12345.432 => 10k)'], ['.3s', '.3s (12345.432 => 12.3k)'], @@ -86,8 +86,8 @@ export const D3_FORMAT_OPTIONS = [ [',.3f', ',.3f (12345.432 => 12,345.432)'], ['+,', '+, (12345.432 => +12,345.432)'], ['$,.2f', '$,.2f (12345.432 => $12,345.43)'], - ['DURATION', 'Duration in ms (66000 => 1m 6s)'], - ['DURATION_SUB', 'Duration in ms (100.40008 => 100ms 400µs 80ns)'], + ['DURATION', t('Duration in ms (66000 => 1m 6s)')], + ['DURATION_SUB', t('Duration in ms (100.40008 => 100ms 400µs 80ns)')], ]; const ROW_LIMIT_OPTIONS = [10, 50, 100, 250, 500, 1000, 5000, 10000, 50000]; @@ -98,7 +98,7 @@ export const D3_FORMAT_DOCS = 'D3 format syntax: https://github.com/d3/d3-format'; export const D3_TIME_FORMAT_OPTIONS = [ - ['smart_date', 'Adaptive formatting'], + ['smart_date', t('Adaptive formatting')], ['%d/%m/%Y', '%d/%m/%Y | 14/01/2019'], ['%m/%d/%Y', '%m/%d/%Y | 01/14/2019'], ['%Y-%m-%d', '%Y-%m-%d | 2019-01-14'], @@ -200,7 +200,6 @@ export const controls = { viz_type: { type: 'VizTypeControl', - label: t('Visualization type'), default: 'table', description: t('The type of visualization to display'), }, @@ -249,47 +248,32 @@ export const controls = { description: t('One or many controls to pivot as columns'), }, - druid_time_origin: { - type: 'SelectControl', - freeForm: true, - label: TIME_FILTER_LABELS.druid_time_origin, - choices: [ - ['', 'default'], - ['now', 'now'], - ], - default: null, - description: t( - 'Defines the origin where time buckets start, ' + - 'accepts natural dates as in `now`, `sunday` or `1970-01-01`', - ), - }, - granularity: { type: 'SelectControl', freeForm: true, label: TIME_FILTER_LABELS.granularity, default: 'P1D', choices: [ - [null, 'all'], - ['PT5S', '5 seconds'], - ['PT30S', '30 seconds'], - ['PT1M', '1 minute'], - ['PT5M', '5 minutes'], - ['PT30M', '30 minutes'], - ['PT1H', '1 hour'], - ['PT6H', '6 hour'], - ['P1D', '1 day'], - ['P7D', '7 days'], - ['P1W', 'week'], - ['week_starting_sunday', 'week starting Sunday'], - ['week_ending_saturday', 'week ending Saturday'], - ['P1M', 'month'], - ['P3M', 'quarter'], - ['P1Y', 'year'], + [null, t('all')], + ['PT5S', t('5 seconds')], + ['PT30S', t('30 seconds')], + ['PT1M', t('1 minute')], + ['PT5M', t('5 minutes')], + ['PT30M', t('30 minutes')], + ['PT1H', t('1 hour')], + ['PT6H', t('6 hour')], + ['P1D', t('1 day')], + ['P7D', t('7 days')], + ['P1W', t('week')], + ['week_starting_sunday', t('week starting Sunday')], + ['week_ending_saturday', t('week ending Saturday')], + ['P1M', t('month')], + ['P3M', t('quarter')], + ['P1Y', t('year')], ], description: t( 'The time granularity for the visualization. Note that you ' + - 'can type and use simple natural language as in `10 seconds`, ' + + 'can type and use simple natural language as in `10 seconds`,' + '`1 day` or `56 weeks`', ), }, diff --git a/superset-frontend/src/explore/exploreUtils/exploreUtils.test.jsx b/superset-frontend/src/explore/exploreUtils/exploreUtils.test.jsx index b385099699cb..52c20dcd84bd 100644 --- a/superset-frontend/src/explore/exploreUtils/exploreUtils.test.jsx +++ b/superset-frontend/src/explore/exploreUtils/exploreUtils.test.jsx @@ -51,7 +51,7 @@ describe('exploreUtils', () => { force: false, curUrl: 'http://superset.com', }); - compareURI(URI(url), URI('/superset/explore/')); + compareURI(URI(url), URI('/explore/')); }); it('generates proper json url', () => { const url = getExploreUrl({ @@ -95,7 +95,7 @@ describe('exploreUtils', () => { }); compareURI( URI(url), - URI('/superset/explore/').search({ + URI('/explore/').search({ standalone: DashboardStandaloneMode.HIDE_NAV, }), ); diff --git a/superset-frontend/src/explore/exploreUtils/getExploreUrl.test.ts b/superset-frontend/src/explore/exploreUtils/getExploreUrl.test.ts index 7457b462b031..c0f2721a49b9 100644 --- a/superset-frontend/src/explore/exploreUtils/getExploreUrl.test.ts +++ b/superset-frontend/src/explore/exploreUtils/getExploreUrl.test.ts @@ -33,7 +33,7 @@ const createParams = () => ({ test('Get ExploreUrl with default params', () => { const params = createParams(); - expect(getExploreUrl(params)).toBe('http://localhost/superset/explore/'); + expect(getExploreUrl(params)).toBe('http://localhost/explore/'); }); test('Get ExploreUrl with endpointType:full', () => { diff --git a/superset-frontend/src/explore/exploreUtils/getHostName.test.ts b/superset-frontend/src/explore/exploreUtils/getHostName.test.ts index 6b90cc0f53bb..6711eca4a2fd 100644 --- a/superset-frontend/src/explore/exploreUtils/getHostName.test.ts +++ b/superset-frontend/src/explore/exploreUtils/getHostName.test.ts @@ -30,7 +30,7 @@ jest.mock('src/utils/hostNamesConfig', () => ({ ], })); -test('Should get next diferent domain on a loop, never the first on the list', () => { +test('Should get next different domain on a loop, never the first on the list', () => { for (let loop = 3; loop > 0; loop -= 1) { expect(getHostName(true)).toBe('domain-b'); expect(getHostName(true)).toBe('domain-c'); diff --git a/superset-frontend/src/explore/exploreUtils/getParsedExploreURLParams.test.ts b/superset-frontend/src/explore/exploreUtils/getParsedExploreURLParams.test.ts new file mode 100644 index 000000000000..f6f2344f6228 --- /dev/null +++ b/superset-frontend/src/explore/exploreUtils/getParsedExploreURLParams.test.ts @@ -0,0 +1,62 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getParsedExploreURLParams } from './getParsedExploreURLParams'; + +const EXPLORE_BASE_URL = 'http://localhost:9000/explore/'; +const setupLocation = (newUrl: string) => { + delete (window as any).location; + // @ts-ignore + window.location = new URL(newUrl); +}; + +test('get form_data_key and slice_id from search params - url when moving from dashboard to explore', () => { + setupLocation( + `${EXPLORE_BASE_URL}?form_data_key=yrLXmyE9fmhQ11lM1KgaD1PoPSBpuLZIJfqdyIdw9GoBwhPFRZHeIgeFiNZljbpd&slice_id=56`, + ); + expect(getParsedExploreURLParams().toString()).toEqual( + 'form_data_key=yrLXmyE9fmhQ11lM1KgaD1PoPSBpuLZIJfqdyIdw9GoBwhPFRZHeIgeFiNZljbpd&slice_id=56', + ); +}); + +test('get slice_id from form_data search param - url on Chart List', () => { + setupLocation(`${EXPLORE_BASE_URL}?form_data=%7B%22slice_id%22%3A%2056%7D`); + expect(getParsedExploreURLParams().toString()).toEqual('slice_id=56'); +}); + +test('get datasource and viz type from form_data search param - url when creating new chart', () => { + setupLocation( + `${EXPLORE_BASE_URL}?form_data=%7B%22viz_type%22%3A%22big_number%22%2C%22datasource%22%3A%222__table%22%7D`, + ); + expect(getParsedExploreURLParams().toString()).toEqual( + 'viz_type=big_number&datasource_id=2&datasource_type=table', + ); +}); + +test('get permalink key from path params', () => { + setupLocation(`${EXPLORE_BASE_URL}p/kpOqweaMY9R/`); + expect(getParsedExploreURLParams().toString()).toEqual( + 'permalink_key=kpOqweaMY9R', + ); +}); + +test('get dataset id from path params', () => { + setupLocation(`${EXPLORE_BASE_URL}table/42/`); + expect(getParsedExploreURLParams().toString()).toEqual('datasource_id=42'); +}); diff --git a/superset-frontend/src/explore/exploreUtils/getParsedExploreURLParams.ts b/superset-frontend/src/explore/exploreUtils/getParsedExploreURLParams.ts new file mode 100644 index 000000000000..b5a544031d7d --- /dev/null +++ b/superset-frontend/src/explore/exploreUtils/getParsedExploreURLParams.ts @@ -0,0 +1,125 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface Location { + search: string; + pathname: string; +} + +// mapping { url_param: v1_explore_request_param } +const EXPLORE_URL_SEARCH_PARAMS = { + form_data: { + name: 'form_data', + parser: (formData: string) => { + const formDataObject = JSON.parse(formData); + if (formDataObject.datasource) { + const [datasource_id, datasource_type] = + formDataObject.datasource.split('__'); + formDataObject.datasource_id = datasource_id; + formDataObject.datasource_type = datasource_type; + delete formDataObject.datasource; + } + return formDataObject; + }, + }, + slice_id: { + name: 'slice_id', + }, + datasource_id: { + name: 'datasource_id', + }, + datasource_type: { + name: 'datasource_type', + }, + datasource: { + name: 'datasource', + parser: (datasource: string) => { + const [datasource_id, datasource_type] = datasource.split('__'); + return { datasource_id, datasource_type }; + }, + }, + form_data_key: { + name: 'form_data_key', + }, + permalink_key: { + name: 'permalink_key', + }, + viz_type: { + name: 'viz_type', + }, + dashboard_id: { + name: 'dashboard_id', + }, +}; + +const EXPLORE_URL_PATH_PARAMS = { + p: 'permalink_key', // permalink + table: 'datasource_id', +}; + +// search params can be placed in form_data object +// we need to "flatten" the search params to use them with /v1/explore endpoint +const getParsedExploreURLSearchParams = (search: string) => { + const urlSearchParams = new URLSearchParams(search); + return Array.from(urlSearchParams.keys()).reduce((acc, currentParam) => { + const paramValue = urlSearchParams.get(currentParam); + if (paramValue === null) { + return acc; + } + let parsedParamValue; + try { + parsedParamValue = + EXPLORE_URL_SEARCH_PARAMS[currentParam].parser?.(paramValue) ?? + paramValue; + } catch { + parsedParamValue = paramValue; + } + if (typeof parsedParamValue === 'object') { + return { ...acc, ...parsedParamValue }; + } + const key = EXPLORE_URL_SEARCH_PARAMS[currentParam]?.name || currentParam; + return { + ...acc, + [key]: parsedParamValue, + }; + }, {}); +}; + +// path params need to be transformed to search params to use them with /v1/explore endpoint +const getParsedExploreURLPathParams = (pathname: string) => + Object.keys(EXPLORE_URL_PATH_PARAMS).reduce((acc, currentParam) => { + const re = new RegExp(`/(${currentParam})/(\\w+)`); + const pathGroups = pathname.match(re); + if (pathGroups?.[2]) { + return { ...acc, [EXPLORE_URL_PATH_PARAMS[currentParam]]: pathGroups[2] }; + } + return acc; + }, {}); + +export const getParsedExploreURLParams = ( + location: Location = window.location, +) => + new URLSearchParams( + Object.entries({ + ...getParsedExploreURLSearchParams(location.search), + ...getParsedExploreURLPathParams(location.pathname), + }) + .map(entry => entry.join('=')) + .join('&'), + ); diff --git a/superset-frontend/src/explore/exploreUtils/getURIDirectory.test.ts b/superset-frontend/src/explore/exploreUtils/getURIDirectory.test.ts index c8d43f413f69..1d6ad40045ae 100644 --- a/superset-frontend/src/explore/exploreUtils/getURIDirectory.test.ts +++ b/superset-frontend/src/explore/exploreUtils/getURIDirectory.test.ts @@ -25,6 +25,6 @@ test('Cases in which the "explore_json" will be returned', () => { }); test('Cases in which the "explore" will be returned', () => { - expect(getURIDirectory('any-string')).toBe('/superset/explore/'); - expect(getURIDirectory()).toBe('/superset/explore/'); + expect(getURIDirectory('any-string')).toBe('/explore/'); + expect(getURIDirectory()).toBe('/explore/'); }); diff --git a/superset-frontend/src/explore/exploreUtils/index.js b/superset-frontend/src/explore/exploreUtils/index.js index 94bcfc775047..754e84c5305a 100644 --- a/superset-frontend/src/explore/exploreUtils/index.js +++ b/superset-frontend/src/explore/exploreUtils/index.js @@ -30,17 +30,18 @@ import { import { omit } from 'lodash'; import { availableDomains } from 'src/utils/hostNamesConfig'; import { safeStringify } from 'src/utils/safeStringify'; +import { optionLabel } from 'src/utils/common'; import { URL_PARAMS } from 'src/constants'; import { MULTI_OPERATORS, OPERATOR_ENUM_TO_OPERATOR_TYPE, + UNSAVED_CHART_ID, } from 'src/explore/constants'; import { DashboardStandaloneMode } from 'src/dashboard/util/constants'; -import { optionLabel } from '../../utils/common'; export function getChartKey(explore) { - const { slice } = explore; - return slice ? slice.slice_id : 0; + const { slice, form_data } = explore; + return slice?.slice_id ?? form_data?.slice_id ?? UNSAVED_CHART_ID; } let requestCounter = 0; @@ -61,18 +62,16 @@ export function getHostName(allowDomainSharding = false) { return availableDomains[currentIndex]; } -export function getAnnotationJsonUrl(slice_id, form_data, isNative, force) { +export function getAnnotationJsonUrl(slice_id, force) { if (slice_id === null || slice_id === undefined) { return null; } + const uri = URI(window.location.search); - const endpoint = isNative ? 'annotation_json' : 'slice_json'; return uri - .pathname(`/superset/${endpoint}/${slice_id}`) + .pathname('/api/v1/chart/data') .search({ - form_data: safeStringify(form_data, (key, value) => - value === null ? undefined : value, - ), + form_data: safeStringify({ slice_id }), force, }) .toString(); @@ -87,7 +86,7 @@ export function getURIDirectory(endpointType = 'base') { ) { return '/superset/explore_json/'; } - return '/superset/explore/'; + return '/explore/'; } export function mountExploreUrl(endpointType, extraSearch = {}, force = false) { @@ -274,11 +273,12 @@ export const exportChart = ({ SupersetClient.postForm(url, { form_data: safeStringify(payload) }); }; -export const exploreChart = formData => { +export const exploreChart = (formData, requestParams) => { const url = getExploreUrl({ formData, endpointType: 'base', allowDomainSharding: false, + requestParams, }); SupersetClient.postForm(url, { form_data: safeStringify(formData) }); }; diff --git a/superset-frontend/src/explore/fixtures.tsx b/superset-frontend/src/explore/fixtures.tsx index 78579b82e49c..351e6f26b126 100644 --- a/superset-frontend/src/explore/fixtures.tsx +++ b/superset-frontend/src/explore/fixtures.tsx @@ -18,13 +18,14 @@ */ import React from 'react'; -import { t } from '@superset-ui/core'; +import { DatasourceType, t } from '@superset-ui/core'; import { ColumnMeta, ColumnOption, ControlConfig, ControlPanelSectionConfig, } from '@superset-ui/chart-controls'; +import { ExplorePageInitialData } from './types'; export const controlPanelSectionsChartOptions: (ControlPanelSectionConfig | null)[] = [ @@ -57,9 +58,9 @@ export const controlPanelSectionsChartOptions: (ControlPanelSectionConfig | null label: t('Stacked Style'), renderTrigger: true, choices: [ - ['stack', 'stack'], - ['stream', 'stream'], - ['expand', 'expand'], + ['stack', t('stack')], + ['stream', t('stream')], + ['expand', t('expand')], ], default: 'stack', description: '', @@ -108,3 +109,57 @@ export const controlPanelSectionsChartOptionsTable: ControlPanelSectionConfig[] ], }, ]; + +export const exploreInitialData: ExplorePageInitialData = { + form_data: { + datasource: '8__table', + metric: 'count', + slice_id: 371, + viz_type: 'table', + }, + slice: { + cache_timeout: null, + description: null, + slice_id: 371, + slice_name: 'Age distribution of respondents', + is_managed_externally: false, + form_data: { + datasource: '8__table', + metric: 'count', + slice_id: 371, + viz_type: 'table', + }, + }, + dataset: { + id: 8, + type: DatasourceType.Table, + columns: [{ column_name: 'a' }], + metrics: [{ metric_name: 'first' }, { metric_name: 'second' }], + column_format: {}, + verbose_map: {}, + main_dttm_col: '', + datasource_name: '8__table', + description: null, + }, +}; + +export const fallbackExploreInitialData: ExplorePageInitialData = { + form_data: { + datasource: '0__table', + viz_type: 'table', + }, + dataset: { + id: 0, + type: DatasourceType.Table, + columns: [], + metrics: [], + column_format: {}, + verbose_map: {}, + main_dttm_col: '', + owners: [], + datasource_name: 'missing_datasource', + name: 'missing_datasource', + description: null, + }, + slice: null, +}; diff --git a/superset-frontend/src/explore/index.jsx b/superset-frontend/src/explore/index.jsx deleted file mode 100644 index cc99666e02f5..000000000000 --- a/superset-frontend/src/explore/index.jsx +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import ReactDOM from 'react-dom'; -import { createStore, applyMiddleware, compose } from 'redux'; -import thunk from 'redux-thunk'; -import logger from '../middleware/loggerMiddleware'; -import { initFeatureFlags } from '../featureFlags'; -import { initEnhancer } from '../reduxUtils'; -import getInitialState from './reducers/getInitialState'; -import rootReducer from './reducers/index'; -import App from './App'; - -const exploreViewContainer = document.getElementById('app'); -const bootstrapData = JSON.parse( - exploreViewContainer.getAttribute('data-bootstrap'), -); -initFeatureFlags(bootstrapData.common.feature_flags); -const initState = getInitialState(bootstrapData); -const store = createStore( - rootReducer, - initState, - compose(applyMiddleware(thunk, logger), initEnhancer(false)), -); - -ReactDOM.render(<App store={store} />, document.getElementById('app')); diff --git a/superset-frontend/src/explore/main.less b/superset-frontend/src/explore/main.less deleted file mode 100644 index 015a8a1a3bed..000000000000 --- a/superset-frontend/src/explore/main.less +++ /dev/null @@ -1,137 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -@import '../assets/stylesheets/less/variables.less'; - -.scrollbar-container { - position: relative; - overflow: hidden; - width: 100%; - height: 100%; -} - -.scrollbar-content { - position: absolute; - top: 0px; - left: 0px; - right: 0px; - bottom: 0px; - overflow-y: auto; - margin-right: 0px; - margin-bottom: 40px; -} - -.edit-desc-icon { - padding: 0 0 0 0.5em; - font-size: @font-size-m; -} - -.checkbox { - float: left; - margin-top: 0px; - margin-right: 3px; -} - -.background-transparent { - background-color: transparent !important; -} - -.fa.expander { - width: 15px; -} - -.list-group { - margin-bottom: 10px; -} - -.color-popover.popover { - border: none; - background-color: transparent; -} - -.color-popover .popover-content { - padding: 0; - background-color: transparent; -} - -.column-option { - margin-left: 3px; -} - -.datasource-container { - overflow: auto; -} - -.adhoc-metric-edit-tabs > .nav-tabs { - margin-bottom: 6px; - - & > li > a { - padding: 4px 4px 4px 4px; - } -} - -#metrics-edit-popover { - max-width: none; - - .inline-editable { - line-height: 30px; // hand-tweaked to match the height of the input - } -} - -.adhoc-option { - cursor: pointer; -} - -.label-dropdown ul.dropdown-menu { - position: fixed; - top: auto; - left: auto; - margin: 20px 0 0; -} - -.label-btn:hover, -.label-btn-label:hover { - background-color: @gray-dark; -} - -.label-btn-label { - cursor: pointer; -} - -.adhoc-label-arrow { - font-size: @font-size-s; - margin-left: 3px; - position: static; -} - -.time-filter-tabs > .nav-tabs { - margin-bottom: 8px; - - & > li > a { - padding: 4px; - } -} - -div.section-header { - font-size: @font-size-s; - font-weight: @font-weight-bold; - color: @gray-light5; - margin-bottom: 0; - margin-top: 0; - padding-bottom: 16px; -} diff --git a/superset-frontend/src/dashboard/util/findParentId.js b/superset-frontend/src/explore/reducers/datasourcesReducer.ts similarity index 51% rename from superset-frontend/src/dashboard/util/findParentId.js rename to superset-frontend/src/explore/reducers/datasourcesReducer.ts index 4d24bb761d85..50393dbd2450 100644 --- a/superset-frontend/src/dashboard/util/findParentId.js +++ b/superset-frontend/src/explore/reducers/datasourcesReducer.ts @@ -16,34 +16,27 @@ * specific language governing permissions and limitations * under the License. */ -function findParentId({ childId, layout = {} }) { - let parentId = null; +import { Dataset } from '@superset-ui/chart-controls'; +import { getDatasourceUid } from 'src/utils/getDatasourceUid'; +import { + AnyDatasourcesAction, + SET_DATASOURCE, +} from '../actions/datasourcesActions'; +import { HYDRATE_EXPLORE, HydrateExplore } from '../actions/hydrateExplore'; - const ids = Object.keys(layout); - for (let i = 0; i <= ids.length - 1; i += 1) { - const id = ids[i]; - const component = layout[id] || {}; - if ( - id !== childId && - component.children && - component.children.includes(childId) - ) { - parentId = id; - break; - } +export default function datasourcesReducer( + // TODO: change type to include other datasource types + datasources: { [key: string]: Dataset }, + action: AnyDatasourcesAction | HydrateExplore, +) { + if (action.type === SET_DATASOURCE) { + return { + ...datasources, + [getDatasourceUid(action.datasource)]: action.datasource, + }; } - - return parentId; -} - -const cache = {}; -export default function findParentIdWithCache({ childId, layout = {} }) { - if (cache[childId]) { - const lastParent = layout[cache[childId]] || {}; - if (lastParent.children && lastParent.children.includes(childId)) { - return lastParent.id; - } + if (action.type === HYDRATE_EXPLORE) { + return { ...(action as HydrateExplore).data.datasources }; } - cache[childId] = findParentId({ childId, layout }); - return cache[childId]; + return datasources || {}; } diff --git a/superset-frontend/src/explore/reducers/exploreReducer.js b/superset-frontend/src/explore/reducers/exploreReducer.js index 87c3aa9b0a6e..ac451ade3da1 100644 --- a/superset-frontend/src/explore/reducers/exploreReducer.js +++ b/superset-frontend/src/explore/reducers/exploreReducer.js @@ -19,7 +19,6 @@ /* eslint camelcase: 0 */ import { ensureIsArray } from '@superset-ui/core'; import { DYNAMIC_PLUGIN_CONTROLS_READY } from 'src/components/Chart/chartAction'; -import { DEFAULT_TIME_RANGE } from 'src/explore/constants'; import { getControlsState } from 'src/explore/store'; import { getControlConfig, @@ -28,6 +27,7 @@ import { StandardizedFormData, } from 'src/explore/controlUtils'; import * as actions from 'src/explore/actions/exploreActions'; +import { HYDRATE_EXPLORE } from '../actions/hydrateExplore'; export default function exploreReducer(state = {}, action) { const actionHandlers = { @@ -49,65 +49,46 @@ export default function exploreReducer(state = {}, action) { isDatasourceMetaLoading: true, }; }, - [actions.SET_DATASOURCE]() { + [actions.UPDATE_FORM_DATA_BY_DATASOURCE]() { const newFormData = { ...state.form_data }; - if (action.datasource.type !== state.datasource.type) { - if (action.datasource.type === 'table') { - newFormData.granularity_sqla = action.datasource.granularity_sqla; - newFormData.time_grain_sqla = action.datasource.time_grain_sqla; - delete newFormData.druid_time_origin; - delete newFormData.granularity; - } else { - newFormData.druid_time_origin = action.datasource.druid_time_origin; - newFormData.granularity = action.datasource.granularity; - delete newFormData.granularity_sqla; - delete newFormData.time_grain_sqla; - } - } - + const { prevDatasource, newDatasource } = action; const controls = { ...state.controls }; const controlsTransferred = []; + if ( - action.datasource.id !== state.datasource.id || - action.datasource.type !== state.datasource.type + prevDatasource.id !== newDatasource.id || + prevDatasource.type !== newDatasource.type ) { - // reset time range filter to default - newFormData.time_range = DEFAULT_TIME_RANGE; - - // reset control values for column/metric related controls - Object.entries(controls).forEach(([controlName, controlState]) => { + newFormData.datasource = newDatasource.uid; + } + // reset control values for column/metric related controls + Object.entries(controls).forEach(([controlName, controlState]) => { + if ( + // for direct column select controls + controlState.valueKey === 'column_name' || + // for all other controls + 'savedMetrics' in controlState || + 'columns' in controlState || + ('options' in controlState && !Array.isArray(controlState.options)) + ) { + newFormData[controlName] = getControlValuesCompatibleWithDatasource( + newDatasource, + controlState, + controlState.value, + ); if ( - // for direct column select controls - controlState.valueKey === 'column_name' || - // for all other controls - 'savedMetrics' in controlState || - 'columns' in controlState || - ('options' in controlState && !Array.isArray(controlState.options)) + ensureIsArray(newFormData[controlName]).length > 0 && + newFormData[controlName] !== controls[controlName].default ) { - controls[controlName] = { - ...controlState, - }; - newFormData[controlName] = getControlValuesCompatibleWithDatasource( - action.datasource, - controlState, - controlState.value, - ); - if ( - ensureIsArray(newFormData[controlName]).length > 0 && - newFormData[controlName] !== controls[controlName].default - ) { - controlsTransferred.push(controlName); - } + controlsTransferred.push(controlName); } - }); - } + } + }); const newState = { ...state, controls, - datasource: action.datasource, - datasource_id: action.datasource.id, - datasource_type: action.datasource.type, + datasource: action.newDatasource, }; return { ...newState, @@ -122,12 +103,6 @@ export default function exploreReducer(state = {}, action) { isDatasourcesLoading: true, }; }, - [actions.SET_DATASOURCES]() { - return { - ...state, - datasources: action.datasources, - }; - }, [actions.SET_FIELD_VALUE]() { const { controlName, value, validationErrors } = action; let new_form_data = { ...state.form_data, [controlName]: value }; @@ -235,12 +210,24 @@ export default function exploreReducer(state = {}, action) { controls: getControlsState(state, action.formData), }; }, + [actions.SET_FORM_DATA]() { + return { + ...state, + form_data: action.formData, + }; + }, [actions.UPDATE_CHART_TITLE]() { return { ...state, sliceName: action.sliceName, }; }, + [actions.SET_SAVE_ACTION]() { + return { + ...state, + saveAction: action.saveAction, + }; + }, [actions.CREATE_NEW_SLICE]() { return { ...state, @@ -257,9 +244,17 @@ export default function exploreReducer(state = {}, action) { slice: { ...state.slice, ...action.slice, - owners: action.slice.owners ?? null, + owners: action.slice.owners + ? action.slice.owners.map(owner => owner.value) + : null, }, sliceName: action.slice.slice_name ?? state.sliceName, + metadata: { + ...state.metadata, + owners: action.slice.owners + ? action.slice.owners.map(owner => owner.label) + : null, + }, }; }, [actions.SET_FORCE_QUERY]() { @@ -268,8 +263,12 @@ export default function exploreReducer(state = {}, action) { force: action.force, }; }, + [HYDRATE_EXPLORE]() { + return { + ...action.data.explore, + }; + }, }; - if (action.type in actionHandlers) { return actionHandlers[action.type](); } diff --git a/superset-frontend/src/explore/reducers/getInitialState.ts b/superset-frontend/src/explore/reducers/getInitialState.ts deleted file mode 100644 index 4d598fb722de..000000000000 --- a/superset-frontend/src/explore/reducers/getInitialState.ts +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import shortid from 'shortid'; -import { DatasourceType, JsonObject, QueryFormData } from '@superset-ui/core'; -import { ControlStateMapping, Dataset } from '@superset-ui/chart-controls'; -import { - CommonBootstrapData, - UserWithPermissionsAndRoles, -} from 'src/types/bootstrapTypes'; -import getToastsFromPyFlashMessages from 'src/components/MessageToasts/getToastsFromPyFlashMessages'; - -import { ChartState, Slice } from 'src/explore/types'; -import { getChartKey } from 'src/explore/exploreUtils'; -import { getControlsState } from 'src/explore/store'; -import { - getFormDataFromControls, - applyMapStateToPropsToControl, -} from 'src/explore/controlUtils'; - -export interface ExplorePageBootstrapData extends JsonObject { - can_add: boolean; - can_download: boolean; - can_overwrite: boolean; - common: CommonBootstrapData; - datasource: Dataset; - datasource_id: number; - datasource_type: DatasourceType; - forced_height: string | null; - form_data: QueryFormData; - slice: Slice | null; - standalone: boolean; - force: boolean; - user: UserWithPermissionsAndRoles; -} - -export default function getInitialState( - bootstrapData: ExplorePageBootstrapData, -) { - const { form_data: initialFormData } = bootstrapData; - const { slice } = bootstrapData; - const sliceName = slice ? slice.slice_name : null; - - const exploreState = { - // note this will add `form_data` to state, - // which will be manipulatable by future reducers. - ...bootstrapData, - sliceName, - common: { - flash_messages: bootstrapData.common.flash_messages, - conf: bootstrapData.common.conf, - }, - isDatasourceMetaLoading: false, - isStarred: false, - // Initial control state will skip `control.mapStateToProps` - // because `bootstrapData.controls` is undefined. - controls: getControlsState( - bootstrapData, - initialFormData, - ) as ControlStateMapping, - controlsTransferred: [], - }; - - // apply initial mapStateToProps for all controls, must execute AFTER - // bootstrapState has initialized `controls`. Order of execution is not - // guaranteed, so controls shouldn't rely on the each other's mapped state. - Object.entries(exploreState.controls).forEach(([key, controlState]) => { - exploreState.controls[key] = applyMapStateToPropsToControl( - controlState, - exploreState, - ); - }); - - const sliceFormData = slice - ? getFormDataFromControls(getControlsState(bootstrapData, slice.form_data)) - : null; - - const chartKey: number = getChartKey(bootstrapData); - const chart: ChartState = { - id: chartKey, - chartAlert: null, - chartStatus: null, - chartStackTrace: null, - chartUpdateEndTime: null, - chartUpdateStartTime: 0, - latestQueryFormData: getFormDataFromControls(exploreState.controls), - sliceFormData, - queryController: null, - queriesResponse: null, - triggerQuery: false, - lastRendered: 0, - }; - - return { - charts: { - [chartKey]: chart, - }, - saveModal: { - dashboards: [], - saveModalAlert: null, - }, - explore: exploreState, - impressionId: shortid.generate(), - messageToasts: getToastsFromPyFlashMessages( - (bootstrapData.common || {}).flash_messages || [], - ), - }; -} - -export type ExplorePageState = ReturnType<typeof getInitialState>; diff --git a/superset-frontend/src/explore/reducers/saveModalReducer.js b/superset-frontend/src/explore/reducers/saveModalReducer.js index eee419799118..85983e1ef1ca 100644 --- a/superset-frontend/src/explore/reducers/saveModalReducer.js +++ b/superset-frontend/src/explore/reducers/saveModalReducer.js @@ -18,9 +18,13 @@ */ /* eslint camelcase: 0 */ import * as actions from '../actions/saveModalActions'; +import { HYDRATE_EXPLORE } from '../actions/hydrateExplore'; export default function saveModalReducer(state = {}, action) { const actionHandlers = { + [actions.SET_SAVE_CHART_MODAL_VISIBILITY]() { + return { ...state, isVisible: action.isVisible }; + }, [actions.FETCH_DASHBOARDS_SUCCEEDED]() { return { ...state, dashboards: action.choices }; }, @@ -39,6 +43,9 @@ export default function saveModalReducer(state = {}, action) { [actions.REMOVE_SAVE_MODAL_ALERT]() { return { ...state, saveModalAlert: null }; }, + [HYDRATE_EXPLORE]() { + return { ...action.data.saveModal }; + }, }; if (action.type in actionHandlers) { diff --git a/superset-frontend/src/explore/store.js b/superset-frontend/src/explore/store.js index 80ad75e3e5bd..239884bcdedb 100644 --- a/superset-frontend/src/explore/store.js +++ b/superset-frontend/src/explore/store.js @@ -22,7 +22,7 @@ import { getAllControlsState, getFormDataFromControls } from './controlUtils'; import { controls } from './controls'; function handleDeprecatedControls(formData) { - // Reacffectation / handling of deprecated controls + // Reaffectation / handling of deprecated controls /* eslint-disable no-param-reassign */ // y_axis_zero was a boolean forcing 0 to be part of the Y Axis @@ -42,10 +42,9 @@ export function getControlsState(state, inputFormData) { // Getting a list of active control names for the current viz const formData = { ...inputFormData }; const vizType = - formData.viz_type || state.common.conf.DEFAULT_VIZ_TYPE || 'table'; + formData.viz_type || state.common?.conf.DEFAULT_VIZ_TYPE || 'table'; handleDeprecatedControls(formData); - const controlsState = getAllControlsState( vizType, state.datasource.type, diff --git a/superset-frontend/src/explore/types.ts b/superset-frontend/src/explore/types.ts index fbbb90ee33c7..85240c919d3b 100644 --- a/superset-frontend/src/explore/types.ts +++ b/superset-frontend/src/explore/types.ts @@ -25,15 +25,14 @@ import { } from '@superset-ui/core'; import { ColumnMeta, - Dataset, ControlStateMapping, + Dataset, } from '@superset-ui/chart-controls'; import { DatabaseObject } from 'src/views/CRUD/types'; import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; -import { toastState } from 'src/SqlLab/types'; import { Slice } from 'src/types/Chart'; -export { Slice, Chart } from 'src/types/Chart'; +export type SaveActionType = 'overwrite' | 'saveas'; export type ChartStatus = | 'loading' @@ -71,36 +70,18 @@ export type Datasource = Dataset & { is_sqllab_view?: boolean; }; -export type ExploreRootState = { - explore: { - can_add: boolean; - can_download: boolean; - common: object; - controls: object; - controlsTransferred: object; - datasource: object; - datasource_id: number; - datasource_type: string; - force: boolean; - forced_height: object; - form_data: object; - isDatasourceMetaLoading: boolean; - isStarred: boolean; - slice: object; - sliceName: string; - standalone: boolean; - timeFormattedColumns: object; - user: UserWithPermissionsAndRoles; - }; - localStorageUsageInKilobytes: number; - messageToasts: toastState[]; - common: {}; -}; - export interface ExplorePageInitialData { dataset: Dataset; form_data: QueryFormData; slice: Slice | null; + metadata?: { + created_on_humanized: string; + changed_on_humanized: string; + owners: string[]; + created_by?: string; + changed_by?: string; + }; + saveAction?: SaveActionType | null; } export interface ExploreResponsePayload { @@ -131,6 +112,7 @@ export interface ExplorePageState { controlsTransferred: string[]; standalone: boolean; force: boolean; + common: JsonObject; }; sliceEntities?: JsonObject; // propagated from Dashboard view } diff --git a/superset-frontend/src/featureFlags.ts b/superset-frontend/src/featureFlags.ts index 4d457fd527f9..e71ec8207410 100644 --- a/superset-frontend/src/featureFlags.ts +++ b/superset-frontend/src/featureFlags.ts @@ -21,12 +21,20 @@ import { FeatureFlagMap, FeatureFlag } from '@superset-ui/core'; export { FeatureFlag } from '@superset-ui/core'; export type { FeatureFlagMap } from '@superset-ui/core'; -export function initFeatureFlags(featureFlags: FeatureFlagMap) { +export function initFeatureFlags(featureFlags?: FeatureFlagMap) { if (!window.featureFlags) { window.featureFlags = featureFlags || {}; } } export function isFeatureEnabled(feature: FeatureFlag) { - return window && window.featureFlags && !!window.featureFlags[feature]; + try { + return !!window.featureFlags[feature]; + } catch (error) { + // eslint-disable-next-line no-console + console.error(`Failed to query feature flag ${feature} (see error below)`); + // eslint-disable-next-line no-console + console.error(error); + return false; + } } diff --git a/superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx b/superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx index 091232a5ec3e..dfc314024ec9 100644 --- a/superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx +++ b/superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx @@ -36,6 +36,8 @@ export default function PluginFilterGroupBy(props: PluginFilterGroupByProps) { height, width, setDataMask, + setHoveredFilter, + unsetHoveredFilter, setFocusedFilter, unsetFocusedFilter, setFilterActive, @@ -116,6 +118,8 @@ export default function PluginFilterGroupBy(props: PluginFilterGroupByProps) { onChange={handleChange} onBlur={unsetFocusedFilter} onFocus={setFocusedFilter} + onMouseEnter={setHoveredFilter} + onMouseLeave={unsetHoveredFilter} ref={inputRef} options={options} onDropdownVisibleChange={setFilterActive} diff --git a/superset-frontend/src/filters/components/GroupBy/controlPanel.ts b/superset-frontend/src/filters/components/GroupBy/controlPanel.ts index fbc61bf6e4a3..5b26f9cdcfaa 100644 --- a/superset-frontend/src/filters/components/GroupBy/controlPanel.ts +++ b/superset-frontend/src/filters/components/GroupBy/controlPanel.ts @@ -39,7 +39,7 @@ const config: ControlPanelConfig = { name: 'groupby', config: { ...sharedControls.groupby, - label: 'Columns to show', + label: t('Columns to show'), multiple: true, required: false, }, diff --git a/superset-frontend/src/filters/components/GroupBy/transformProps.ts b/superset-frontend/src/filters/components/GroupBy/transformProps.ts index 9ca0ec047bfa..1f502602734e 100644 --- a/superset-frontend/src/filters/components/GroupBy/transformProps.ts +++ b/superset-frontend/src/filters/components/GroupBy/transformProps.ts @@ -33,6 +33,8 @@ export default function transformProps(chartProps: ChartProps) { } = chartProps; const { setDataMask = noOp, + setHoveredFilter = noOp, + unsetHoveredFilter = noOp, setFocusedFilter = noOp, unsetFocusedFilter = noOp, setFilterActive = noOp, @@ -48,6 +50,8 @@ export default function transformProps(chartProps: ChartProps) { data, formData: { ...DEFAULT_FORM_DATA, ...formData }, setDataMask, + setHoveredFilter, + unsetHoveredFilter, setFocusedFilter, unsetFocusedFilter, setFilterActive, diff --git a/superset-frontend/src/filters/components/Range/RangeFilterPlugin.test.tsx b/superset-frontend/src/filters/components/Range/RangeFilterPlugin.test.tsx index 7dac323d6b13..0a2aac41ba81 100644 --- a/superset-frontend/src/filters/components/Range/RangeFilterPlugin.test.tsx +++ b/superset-frontend/src/filters/components/Range/RangeFilterPlugin.test.tsx @@ -18,7 +18,7 @@ */ import { AppSection, GenericDataType } from '@superset-ui/core'; import React from 'react'; -import { render } from 'spec/helpers/testing-library'; +import { render, screen } from 'spec/helpers/testing-library'; import RangeFilterPlugin from './RangeFilterPlugin'; import { SingleValueType } from './SingleValueType'; import transformProps from './transformProps'; @@ -121,41 +121,49 @@ describe('RangeFilterPlugin', () => { }); it('should call setDataMask with correct greater than filter', () => { - getWrapper({ enableSingleValue: SingleValueType.Minimum }); + getWrapper({ + enableSingleValue: SingleValueType.Minimum, + defaultValue: [20, 60], + }); expect(setDataMask).toHaveBeenCalledWith({ extraFormData: { filters: [ { col: 'SP_POP_TOTL', op: '>=', - val: 70, + val: 20, }, ], }, filterState: { - label: 'x ≥ 70', - value: [70, 100], + label: 'x ≥ 20', + value: [20, 100], }, }); + expect(screen.getByRole('slider')).toHaveAttribute('aria-valuenow', '20'); }); it('should call setDataMask with correct less than filter', () => { - getWrapper({ enableSingleValue: SingleValueType.Maximum }); + getWrapper({ + enableSingleValue: SingleValueType.Maximum, + defaultValue: [20, 60], + }); expect(setDataMask).toHaveBeenCalledWith({ extraFormData: { filters: [ { col: 'SP_POP_TOTL', op: '<=', - val: 70, + val: 60, }, ], }, filterState: { - label: 'x ≤ 70', - value: [10, 70], + label: 'x ≤ 60', + value: [10, 60], }, }); + expect(screen.getByRole('slider')).toHaveAttribute('aria-valuenow', '60'); }); it('should call setDataMask with correct exact filter', () => { diff --git a/superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx b/superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx index d2cc9a417132..5c8533dd1e5a 100644 --- a/superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx +++ b/superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx @@ -25,8 +25,9 @@ import { t, } from '@superset-ui/core'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import { AntdSlider } from 'src/components'; import { rgba } from 'emotion-rgba'; +import { AntdSlider } from 'src/components'; +import { FilterBarOrientation } from 'src/dashboard/types'; import { PluginFilterRangeProps } from './types'; import { StatusMessage, StyledFormItem, FilterPluginStyle } from '../common'; import { getRangeExtraFormData } from '../../utils'; @@ -65,8 +66,12 @@ const StyledMinSlider = styled(AntdSlider)<{ `} `; -const Wrapper = styled.div<{ validateStatus?: 'error' | 'warning' | 'info' }>` - ${({ theme, validateStatus }) => ` +const Wrapper = styled.div<{ + validateStatus?: 'error' | 'warning' | 'info'; + orientation?: FilterBarOrientation; + isOverflowing?: boolean; +}>` + ${({ theme, validateStatus, orientation, isOverflowing }) => ` border: 1px solid transparent; &:focus { border: 1px solid @@ -76,8 +81,18 @@ const Wrapper = styled.div<{ validateStatus?: 'error' | 'warning' | 'info' }>` ${rgba(theme.colors[validateStatus || 'primary']?.base, 0.2)}; } & .ant-slider { - margin-top: ${theme.gridUnit}px; - margin-bottom: ${theme.gridUnit * 5}px; + margin-top: ${ + orientation === FilterBarOrientation.HORIZONTAL ? 0 : theme.gridUnit + }px; + margin-bottom: ${ + orientation === FilterBarOrientation.HORIZONTAL ? 0 : theme.gridUnit * 5 + }px; + + ${ + orientation === FilterBarOrientation.HORIZONTAL && + !isOverflowing && + `line-height: 1.2;` + } & .ant-slider-track { background-color: ${ @@ -93,6 +108,10 @@ const Wrapper = styled.div<{ validateStatus?: 'error' | 'warning' | 'info' }>` ${rgba(theme.colors[validateStatus || 'primary']?.base, 0.2)}; } } + & .ant-slider-mark { + font-size: ${theme.typography.sizes.s}px; + } + &:hover { & .ant-slider-track { background-color: ${ @@ -152,9 +171,13 @@ export default function RangeFilterPlugin(props: PluginFilterRangeProps) { setDataMask, setFocusedFilter, unsetFocusedFilter, + setHoveredFilter, + unsetHoveredFilter, setFilterActive, filterState, inputRef, + filterBarOrientation, + isOverflowingFilterBar, } = props; const [row] = data; // @ts-ignore @@ -261,13 +284,13 @@ export default function RangeFilterPlugin(props: PluginFilterRangeProps) { useEffect(() => { if (enableSingleMaxValue) { - handleAfterChange([min, minMax[minIndex]]); + handleAfterChange([min, minMax[maxIndex]]); } }, [enableSingleMaxValue]); useEffect(() => { if (enableSingleMinValue) { - handleAfterChange([minMax[maxIndex], max]); + handleAfterChange([minMax[minIndex], max]); } }, [enableSingleMinValue]); @@ -287,10 +310,12 @@ export default function RangeFilterPlugin(props: PluginFilterRangeProps) { tabIndex={-1} ref={inputRef} validateStatus={filterState.validateStatus} + orientation={filterBarOrientation} + isOverflowing={isOverflowingFilterBar} onFocus={setFocusedFilter} onBlur={unsetFocusedFilter} - onMouseEnter={setFocusedFilter} - onMouseLeave={unsetFocusedFilter} + onMouseEnter={setHoveredFilter} + onMouseLeave={unsetHoveredFilter} onMouseDown={() => setFilterActive(true)} onMouseUp={() => setFilterActive(false)} > diff --git a/superset-frontend/src/filters/components/Range/buildQuery.ts b/superset-frontend/src/filters/components/Range/buildQuery.ts index f29228c7f714..72e2fa549247 100644 --- a/superset-frontend/src/filters/components/Range/buildQuery.ts +++ b/superset-frontend/src/filters/components/Range/buildQuery.ts @@ -20,6 +20,7 @@ import { buildQueryContext, GenericDataType, QueryFormData, + t, } from '@superset-ui/core'; /** @@ -44,7 +45,6 @@ export default function buildQuery(formData: QueryFormData) { { ...baseQueryObject, columns: [], - groupby: [], metrics: [ { aggregate: 'MIN', @@ -55,7 +55,7 @@ export default function buildQuery(formData: QueryFormData) { }, expressionType: 'SIMPLE', hasCustomLabel: true, - label: 'min', + label: t('min'), }, { aggregate: 'MAX', @@ -66,7 +66,7 @@ export default function buildQuery(formData: QueryFormData) { }, expressionType: 'SIMPLE', hasCustomLabel: true, - label: 'max', + label: t('max'), }, ], }, diff --git a/superset-frontend/src/filters/components/Range/controlPanel.ts b/superset-frontend/src/filters/components/Range/controlPanel.ts index 076d5a44aa0d..2a38f5733cb1 100644 --- a/superset-frontend/src/filters/components/Range/controlPanel.ts +++ b/superset-frontend/src/filters/components/Range/controlPanel.ts @@ -36,7 +36,7 @@ const config: ControlPanelConfig = { name: 'groupby', config: { ...sharedControls.groupby, - label: 'Column', + label: t('Column'), required: true, }, }, diff --git a/superset-frontend/src/filters/components/Range/transformProps.ts b/superset-frontend/src/filters/components/Range/transformProps.ts index f4c47cec267b..cbca7a982a3c 100644 --- a/superset-frontend/src/filters/components/Range/transformProps.ts +++ b/superset-frontend/src/filters/components/Range/transformProps.ts @@ -29,11 +29,14 @@ export default function transformProps(chartProps: ChartProps) { behaviors, filterState, inputRef, + displaySettings, } = chartProps; const { setDataMask = noOp, setFocusedFilter = noOp, unsetFocusedFilter = noOp, + setHoveredFilter = noOp, + unsetHoveredFilter = noOp, setFilterActive = noOp, } = hooks; const { data } = queriesData[0]; @@ -46,9 +49,13 @@ export default function transformProps(chartProps: ChartProps) { setDataMask, filterState, width, + setHoveredFilter, + unsetHoveredFilter, setFocusedFilter, unsetFocusedFilter, setFilterActive, inputRef, + isOverflowingFilterBar: displaySettings?.isOverflowingFilterBar, + filterBarOrientation: displaySettings?.filterBarOrientation, }; } diff --git a/superset-frontend/src/filters/components/Range/types.ts b/superset-frontend/src/filters/components/Range/types.ts index 69ad4d53da80..25a18bb3e86b 100644 --- a/superset-frontend/src/filters/components/Range/types.ts +++ b/superset-frontend/src/filters/components/Range/types.ts @@ -24,6 +24,7 @@ import { } from '@superset-ui/core'; import { RefObject } from 'react'; import { PluginFilterHooks, PluginFilterStylesProps } from '../types'; +import { FilterBarOrientation } from '../../../dashboard/types'; interface PluginFilterSelectCustomizeProps { max?: number; @@ -40,4 +41,6 @@ export type PluginFilterRangeProps = PluginFilterStylesProps & { filterState: FilterState; behaviors: Behavior[]; inputRef: RefObject<any>; + filterBarOrientation?: FilterBarOrientation; + isOverflowingFilterBar?: boolean; } & PluginFilterHooks; diff --git a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.test.tsx b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.test.tsx index 8c025c97119b..f0aa4453b1b1 100644 --- a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.test.tsx +++ b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.test.tsx @@ -24,6 +24,8 @@ import { NULL_STRING } from 'src/utils/common'; import SelectFilterPlugin from './SelectFilterPlugin'; import transformProps from './transformProps'; +jest.useFakeTimers(); + const selectMultipleProps = { formData: { sortAscending: true, @@ -86,7 +88,7 @@ describe('SelectFilterPlugin', () => { jest.clearAllMocks(); }); - it('Add multiple values with first render', () => { + test('Add multiple values with first render', async () => { getWrapper(); expect(setDataMask).toHaveBeenCalledWith({ extraFormData: {}, @@ -114,6 +116,7 @@ describe('SelectFilterPlugin', () => { }); userEvent.click(screen.getByRole('combobox')); userEvent.click(screen.getByTitle('girl')); + expect(await screen.findByTitle(/girl/i)).toBeInTheDocument(); expect(setDataMask).toHaveBeenCalledWith({ __cache: { value: ['boy'], @@ -134,9 +137,14 @@ describe('SelectFilterPlugin', () => { }); }); - it('Remove multiple values when required', () => { + test('Remove multiple values when required', () => { getWrapper(); - userEvent.click(document.querySelector('[data-icon="close"]')!); + userEvent.click( + screen.getByRole('img', { + name: /close-circle/i, + hidden: true, + }), + ); expect(setDataMask).toHaveBeenCalledWith({ __cache: { value: ['boy'], @@ -157,9 +165,14 @@ describe('SelectFilterPlugin', () => { }); }); - it('Remove multiple values when not required', () => { + test('Remove multiple values when not required', () => { getWrapper({ enableEmptyFilter: false }); - userEvent.click(document.querySelector('[data-icon="close"]')!); + userEvent.click( + screen.getByRole('img', { + name: /close-circle/i, + hidden: true, + }), + ); expect(setDataMask).toHaveBeenCalledWith({ __cache: { value: ['boy'], @@ -172,9 +185,10 @@ describe('SelectFilterPlugin', () => { }); }); - it('Select single values with inverse', () => { + test('Select single values with inverse', async () => { getWrapper({ multiSelect: false, inverseSelection: true }); userEvent.click(screen.getByRole('combobox')); + expect(await screen.findByTitle('girl')).toBeInTheDocument(); userEvent.click(screen.getByTitle('girl')); expect(setDataMask).toHaveBeenCalledWith({ __cache: { @@ -196,9 +210,10 @@ describe('SelectFilterPlugin', () => { }); }); - it('Select single null (empty) value', () => { + test('Select single null (empty) value', async () => { getWrapper(); userEvent.click(screen.getByRole('combobox')); + expect(await screen.findByRole('combobox')).toBeInTheDocument(); userEvent.click(screen.getByTitle(NULL_STRING)); expect(setDataMask).toHaveBeenLastCalledWith({ __cache: { @@ -220,9 +235,10 @@ describe('SelectFilterPlugin', () => { }); }); - it('Add ownState with column types when search all options', () => { + test('Add ownState with column types when search all options', async () => { getWrapper({ searchAllOptions: true, multiSelect: false }); userEvent.click(screen.getByRole('combobox')); + expect(await screen.findByRole('combobox')).toBeInTheDocument(); userEvent.click(screen.getByTitle('girl')); expect(setDataMask).toHaveBeenCalledWith({ __cache: { diff --git a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx index 9803e4a7e6fa..fb8e20093c92 100644 --- a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx +++ b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx @@ -17,6 +17,7 @@ * under the License. */ /* eslint-disable no-param-reassign */ +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { AppSection, DataMask, @@ -31,14 +32,14 @@ import { tn, } from '@superset-ui/core'; import { LabeledValue as AntdLabeledValue } from 'antd/lib/select'; -import React, { useCallback, useEffect, useState, useMemo } from 'react'; -import { Select } from 'src/components'; import debounce from 'lodash/debounce'; -import { SLOW_DEBOUNCE } from 'src/constants'; import { useImmerReducer } from 'use-immer'; -import { propertyComparator } from 'src/components/Select/Select'; +import { Select } from 'src/components'; +import { SLOW_DEBOUNCE } from 'src/constants'; +import { propertyComparator } from 'src/components/Select/utils'; +import { FilterBarOrientation } from 'src/dashboard/types'; import { PluginFilterSelectProps, SelectValue } from './types'; -import { StyledFormItem, FilterPluginStyle, StatusMessage } from '../common'; +import { FilterPluginStyle, StatusMessage, StyledFormItem } from '../common'; import { getDataRecordFormatter, getSelectExtraFormData } from '../../utils'; type DataMaskAction = @@ -82,6 +83,8 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) { isRefreshing, width, setDataMask, + setHoveredFilter, + unsetHoveredFilter, setFocusedFilter, unsetFocusedFilter, setFilterActive, @@ -89,6 +92,7 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) { showOverflow, parentRef, inputRef, + filterBarOrientation, } = props; const { enableEmptyFilter, @@ -228,7 +232,7 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) { : null; // firstItem[0] !== undefined for a case when groupby changed but new data still not fetched // TODO: still need repopulate default value in config modal when column changed - if (firstItem && firstItem[0] !== undefined) { + if (firstItem?.[0] !== undefined) { updateDataMask(firstItem); } } else if (isDisabled) { @@ -307,8 +311,9 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) { disabled={isDisabled} getPopupContainer={ showOverflow - ? () => parentRef?.current - : (trigger: HTMLElement) => trigger?.parentNode + ? () => (parentRef?.current as HTMLElement) || document.body + : (trigger: HTMLElement) => + (trigger?.parentNode as HTMLElement) || document.body } showSearch={showSearch} mode={multiSelect ? 'multiple' : 'single'} @@ -316,13 +321,14 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) { onSearch={searchWrapper} onSelect={clearSuggestionSearch} onBlur={handleBlur} - onMouseEnter={setFocusedFilter} - onMouseLeave={unsetFocusedFilter} + onFocus={setFocusedFilter} + onMouseEnter={setHoveredFilter} + onMouseLeave={unsetHoveredFilter} // @ts-ignore onChange={handleChange} ref={inputRef} loading={isRefreshing} - maxTagCount={5} + oneLine={filterBarOrientation === FilterBarOrientation.HORIZONTAL} invertSelection={inverseSelection} // @ts-ignore options={options} diff --git a/superset-frontend/src/filters/components/Select/buildQuery.test.ts b/superset-frontend/src/filters/components/Select/buildQuery.test.ts index 08b7037f9cef..c89719dc836d 100644 --- a/superset-frontend/src/filters/components/Select/buildQuery.test.ts +++ b/superset-frontend/src/filters/components/Select/buildQuery.test.ts @@ -41,7 +41,7 @@ describe('Select buildQuery', () => { const queryContext = buildQuery(formData); expect(queryContext.queries.length).toEqual(1); const [query] = queryContext.queries; - expect(query.groupby).toEqual(['my_col']); + expect(query.columns).toEqual(['my_col']); expect(query.filters).toEqual([]); expect(query.metrics).toEqual([]); expect(query.orderby).toEqual([]); @@ -55,7 +55,7 @@ describe('Select buildQuery', () => { }); expect(queryContext.queries.length).toEqual(1); const [query] = queryContext.queries; - expect(query.groupby).toEqual(['my_col']); + expect(query.columns).toEqual(['my_col']); expect(query.metrics).toEqual(['my_metric']); expect(query.orderby).toEqual([['my_metric', false]]); }); @@ -68,7 +68,7 @@ describe('Select buildQuery', () => { }); expect(queryContext.queries.length).toEqual(1); const [query] = queryContext.queries; - expect(query.groupby).toEqual(['my_col']); + expect(query.columns).toEqual(['my_col']); expect(query.metrics).toEqual(['my_metric']); expect(query.orderby).toEqual([['my_metric', true]]); }); @@ -80,7 +80,7 @@ describe('Select buildQuery', () => { }); expect(queryContext.queries.length).toEqual(1); const [query] = queryContext.queries; - expect(query.groupby).toEqual(['my_col']); + expect(query.columns).toEqual(['my_col']); expect(query.metrics).toEqual([]); expect(query.orderby).toEqual([['my_col', true]]); }); @@ -92,7 +92,7 @@ describe('Select buildQuery', () => { }); expect(queryContext.queries.length).toEqual(1); const [query] = queryContext.queries; - expect(query.groupby).toEqual(['my_col']); + expect(query.columns).toEqual(['my_col']); expect(query.metrics).toEqual([]); expect(query.orderby).toEqual([['my_col', false]]); }); diff --git a/superset-frontend/src/filters/components/Select/buildQuery.ts b/superset-frontend/src/filters/components/Select/buildQuery.ts index abcd84f9d238..d9a5b3c229ab 100644 --- a/superset-frontend/src/filters/components/Select/buildQuery.ts +++ b/superset-frontend/src/filters/components/Select/buildQuery.ts @@ -63,7 +63,7 @@ const buildQuery: BuildQuery<PluginFilterSelectQueryFormData> = ( const query: QueryObject[] = [ { ...baseQueryObject, - groupby: columns, + columns, metrics: sortMetric ? [sortMetric] : [], filters: filters.concat(extraFilters), orderby: diff --git a/superset-frontend/src/filters/components/Select/controlPanel.ts b/superset-frontend/src/filters/components/Select/controlPanel.ts index 6b1549d5359c..12bc36a7ade4 100644 --- a/superset-frontend/src/filters/components/Select/controlPanel.ts +++ b/superset-frontend/src/filters/components/Select/controlPanel.ts @@ -46,7 +46,7 @@ const config: ControlPanelConfig = { name: 'groupby', config: { ...sharedControls.groupby, - label: 'Column', + label: t('Column'), required: true, }, }, diff --git a/superset-frontend/src/filters/components/Select/transformProps.ts b/superset-frontend/src/filters/components/Select/transformProps.ts index 59d9adc57e93..2ed3d74ff092 100644 --- a/superset-frontend/src/filters/components/Select/transformProps.ts +++ b/superset-frontend/src/filters/components/Select/transformProps.ts @@ -29,6 +29,7 @@ export default function transformProps( hooks, queriesData, width, + displaySettings, behaviors, appSection, filterState, @@ -38,6 +39,8 @@ export default function transformProps( const newFormData = { ...DEFAULT_FORM_DATA, ...formData }; const { setDataMask = noOp, + setHoveredFilter = noOp, + unsetHoveredFilter = noOp, setFocusedFilter = noOp, unsetFocusedFilter = noOp, setFilterActive = noOp, @@ -60,9 +63,13 @@ export default function transformProps( formData: newFormData, isRefreshing, setDataMask, + setHoveredFilter, + unsetHoveredFilter, setFocusedFilter, unsetFocusedFilter, setFilterActive, inputRef, + filterBarOrientation: displaySettings?.filterBarOrientation, + isOverflowingFilterBar: displaySettings?.isOverflowingFilterBar, }; } diff --git a/superset-frontend/src/filters/components/Select/types.ts b/superset-frontend/src/filters/components/Select/types.ts index 0497b58e5558..e608f59640fc 100644 --- a/superset-frontend/src/filters/components/Select/types.ts +++ b/superset-frontend/src/filters/components/Select/types.ts @@ -27,6 +27,7 @@ import { ChartDataResponseResult, } from '@superset-ui/core'; import { RefObject } from 'react'; +import { FilterBarOrientation } from 'src/dashboard/types'; import { PluginFilterHooks, PluginFilterStylesProps } from '../types'; export type SelectValue = (number | string | null)[] | null | undefined; @@ -61,6 +62,8 @@ export type PluginFilterSelectProps = PluginFilterStylesProps & { showOverflow: boolean; parentRef?: RefObject<any>; inputRef?: RefObject<any>; + filterBarOrientation?: FilterBarOrientation; + isOverflowingFilterBar?: boolean; } & PluginFilterHooks; export const DEFAULT_FORM_DATA: PluginFilterSelectCustomizeProps = { diff --git a/superset-frontend/src/filters/components/Time/TimeFilterPlugin.tsx b/superset-frontend/src/filters/components/Time/TimeFilterPlugin.tsx index 9a35cdb35942..d22ee5559400 100644 --- a/superset-frontend/src/filters/components/Time/TimeFilterPlugin.tsx +++ b/superset-frontend/src/filters/components/Time/TimeFilterPlugin.tsx @@ -16,20 +16,41 @@ * specific language governing permissions and limitations * under the License. */ -import { styled } from '@superset-ui/core'; +import { styled, NO_TIME_RANGE } from '@superset-ui/core'; import React, { useCallback, useEffect } from 'react'; import DateFilterControl from 'src/explore/components/controls/DateFilterControl'; -import { NO_TIME_RANGE } from 'src/explore/constants'; import { PluginFilterTimeProps } from './types'; -import { ControlContainer, FilterPluginStyle } from '../common'; +import { FilterPluginStyle } from '../common'; const TimeFilterStyles = styled(FilterPluginStyle)` + display: flex; + align-items: center; overflow-x: auto; + + & .ant-tag { + margin-right: 0; + } +`; + +const ControlContainer = styled.div<{ + validateStatus?: 'error' | 'warning' | 'info'; +}>` + display: flex; + height: 100%; + max-width: 100%; + width: 100%; + & > div, + & > div:hover { + ${({ validateStatus, theme }) => + validateStatus && `border-color: ${theme.colors[validateStatus]?.base}`} + } `; export default function TimeFilterPlugin(props: PluginFilterTimeProps) { const { setDataMask, + setHoveredFilter, + unsetHoveredFilter, setFocusedFilter, unsetFocusedFilter, setFilterActive, @@ -37,6 +58,7 @@ export default function TimeFilterPlugin(props: PluginFilterTimeProps) { height, filterState, inputRef, + isOverflowingFilterBar = false, } = props; const handleTimeRangeChange = useCallback( @@ -61,24 +83,26 @@ export default function TimeFilterPlugin(props: PluginFilterTimeProps) { }, [filterState.value]); return props.formData?.inView ? ( - // @ts-ignore <TimeFilterStyles width={width} height={height}> <ControlContainer - tabIndex={-1} ref={inputRef} validateStatus={filterState.validateStatus} onFocus={setFocusedFilter} onBlur={unsetFocusedFilter} - onMouseEnter={setFocusedFilter} - onMouseLeave={unsetFocusedFilter} + onMouseEnter={setHoveredFilter} + onMouseLeave={unsetHoveredFilter} > <DateFilterControl value={filterState.value || NO_TIME_RANGE} name="time_range" onChange={handleTimeRangeChange} - type={filterState.validateStatus} onOpenPopover={() => setFilterActive(true)} - onClosePopover={() => setFilterActive(false)} + onClosePopover={() => { + setFilterActive(false); + unsetHoveredFilter(); + unsetFocusedFilter(); + }} + isOverflowingFilterBar={isOverflowingFilterBar} /> </ControlContainer> </TimeFilterStyles> diff --git a/superset-frontend/src/filters/components/Time/controlPanel.ts b/superset-frontend/src/filters/components/Time/controlPanel.ts index b54909f70b96..2dbded365160 100644 --- a/superset-frontend/src/filters/components/Time/controlPanel.ts +++ b/superset-frontend/src/filters/components/Time/controlPanel.ts @@ -34,7 +34,7 @@ const config: ControlPanelConfig = { name: 'groupby', config: { ...sharedControls.groupby, - label: 'Column', + label: t('Column'), required: true, }, }, diff --git a/superset-frontend/src/filters/components/Time/transformProps.ts b/superset-frontend/src/filters/components/Time/transformProps.ts index 883b6002d892..b86a3622486a 100644 --- a/superset-frontend/src/filters/components/Time/transformProps.ts +++ b/superset-frontend/src/filters/components/Time/transformProps.ts @@ -30,9 +30,12 @@ export default function transformProps(chartProps: ChartProps) { behaviors, filterState, inputRef, + displaySettings, } = chartProps; const { setDataMask = noOp, + setHoveredFilter = noOp, + unsetHoveredFilter = noOp, setFocusedFilter = noOp, unsetFocusedFilter = noOp, setFilterActive = noOp, @@ -49,10 +52,14 @@ export default function transformProps(chartProps: ChartProps) { height, behaviors, setDataMask, + setHoveredFilter, + unsetHoveredFilter, setFocusedFilter, unsetFocusedFilter, setFilterActive, width, inputRef, + filterBarOrientation: displaySettings?.filterBarOrientation, + isOverflowingFilterBar: displaySettings?.isOverflowingFilterBar, }; } diff --git a/superset-frontend/src/filters/components/Time/types.ts b/superset-frontend/src/filters/components/Time/types.ts index 4219c7cbb351..39ee425bb0f2 100644 --- a/superset-frontend/src/filters/components/Time/types.ts +++ b/superset-frontend/src/filters/components/Time/types.ts @@ -39,6 +39,7 @@ export type PluginFilterTimeProps = PluginFilterStylesProps & { formData: PluginFilterSelectQueryFormData; filterState: FilterState; inputRef: RefObject<HTMLInputElement>; + isOverflowingFilterBar?: boolean; } & PluginFilterHooks; export const DEFAULT_FORM_DATA: PluginFilterTimeCustomizeProps = { diff --git a/superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx b/superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx index fd5f21caad91..4c25b4bec0fc 100644 --- a/superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx +++ b/superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx @@ -38,6 +38,8 @@ export default function PluginFilterTimeColumn( height, width, setDataMask, + setHoveredFilter, + unsetHoveredFilter, setFocusedFilter, unsetFocusedFilter, setFilterActive, @@ -114,8 +116,10 @@ export default function PluginFilterTimeColumn( placeholder={placeholderText} // @ts-ignore onChange={handleChange} - onMouseEnter={setFocusedFilter} - onMouseLeave={unsetFocusedFilter} + onBlur={unsetFocusedFilter} + onFocus={setFocusedFilter} + onMouseEnter={setHoveredFilter} + onMouseLeave={unsetHoveredFilter} ref={inputRef} options={options} onDropdownVisibleChange={setFilterActive} diff --git a/superset-frontend/src/filters/components/TimeColumn/transformProps.ts b/superset-frontend/src/filters/components/TimeColumn/transformProps.ts index 9ca0ec047bfa..1f502602734e 100644 --- a/superset-frontend/src/filters/components/TimeColumn/transformProps.ts +++ b/superset-frontend/src/filters/components/TimeColumn/transformProps.ts @@ -33,6 +33,8 @@ export default function transformProps(chartProps: ChartProps) { } = chartProps; const { setDataMask = noOp, + setHoveredFilter = noOp, + unsetHoveredFilter = noOp, setFocusedFilter = noOp, unsetFocusedFilter = noOp, setFilterActive = noOp, @@ -48,6 +50,8 @@ export default function transformProps(chartProps: ChartProps) { data, formData: { ...DEFAULT_FORM_DATA, ...formData }, setDataMask, + setHoveredFilter, + unsetHoveredFilter, setFocusedFilter, unsetFocusedFilter, setFilterActive, diff --git a/superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx b/superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx index 383272c7bbd5..55dca4b28054 100644 --- a/superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx +++ b/superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx @@ -38,6 +38,8 @@ export default function PluginFilterTimegrain( height, width, setDataMask, + setHoveredFilter, + unsetHoveredFilter, setFocusedFilter, unsetFocusedFilter, setFilterActive, @@ -124,8 +126,10 @@ export default function PluginFilterTimegrain( placeholder={placeholderText} // @ts-ignore onChange={handleChange} - onMouseEnter={setFocusedFilter} - onMouseLeave={unsetFocusedFilter} + onBlur={unsetFocusedFilter} + onFocus={setFocusedFilter} + onMouseEnter={setHoveredFilter} + onMouseLeave={unsetHoveredFilter} ref={inputRef} options={options} onDropdownVisibleChange={setFilterActive} diff --git a/superset-frontend/src/filters/components/TimeGrain/transformProps.ts b/superset-frontend/src/filters/components/TimeGrain/transformProps.ts index 797a2d1d80e5..b86d04c0c499 100644 --- a/superset-frontend/src/filters/components/TimeGrain/transformProps.ts +++ b/superset-frontend/src/filters/components/TimeGrain/transformProps.ts @@ -25,6 +25,8 @@ export default function transformProps(chartProps: ChartProps) { chartProps; const { setDataMask = noOp, + setHoveredFilter = noOp, + unsetHoveredFilter = noOp, setFocusedFilter = noOp, unsetFocusedFilter = noOp, setFilterActive = noOp, @@ -39,6 +41,8 @@ export default function transformProps(chartProps: ChartProps) { data, formData: { ...DEFAULT_FORM_DATA, ...formData }, setDataMask, + setHoveredFilter, + unsetHoveredFilter, setFocusedFilter, unsetFocusedFilter, setFilterActive, diff --git a/superset-frontend/src/filters/components/types.ts b/superset-frontend/src/filters/components/types.ts index 2a403fe61bb7..fd6229826bb3 100644 --- a/superset-frontend/src/filters/components/types.ts +++ b/superset-frontend/src/filters/components/types.ts @@ -1,4 +1,5 @@ import { SetDataMaskHook } from '@superset-ui/core'; +import { FilterBarOrientation } from 'src/dashboard/types'; /** * Licensed to the Apache Software Foundation (ASF) under one @@ -21,11 +22,15 @@ import { SetDataMaskHook } from '@superset-ui/core'; export interface PluginFilterStylesProps { height: number; width: number; + orientation?: FilterBarOrientation; + overflow?: boolean; } export interface PluginFilterHooks { setDataMask: SetDataMaskHook; setFocusedFilter: () => void; unsetFocusedFilter: () => void; + setHoveredFilter: () => void; + unsetHoveredFilter: () => void; setFilterActive: (isActive: boolean) => void; } diff --git a/superset-frontend/src/hooks/apiResources/dashboards.ts b/superset-frontend/src/hooks/apiResources/dashboards.ts index 9f512d5b15b2..b21cc668c06a 100644 --- a/superset-frontend/src/hooks/apiResources/dashboards.ts +++ b/superset-frontend/src/hooks/apiResources/dashboards.ts @@ -26,6 +26,7 @@ export const useDashboard = (idOrSlug: string | number) => useApiV1Resource<Dashboard>(`/api/v1/dashboard/${idOrSlug}`), dashboard => ({ ...dashboard, + // TODO: load these at the API level metadata: (dashboard.json_metadata && JSON.parse(dashboard.json_metadata)) || {}, position_data: diff --git a/superset-frontend/src/hooks/apiResources/index.ts b/superset-frontend/src/hooks/apiResources/index.ts index 5e6392073114..81d77b5d11a5 100644 --- a/superset-frontend/src/hooks/apiResources/index.ts +++ b/superset-frontend/src/hooks/apiResources/index.ts @@ -28,3 +28,5 @@ export { // different files for different resource types. export * from './charts'; export * from './dashboards'; +export * from './tables'; +export * from './schemas'; diff --git a/superset-frontend/src/hooks/apiResources/schemas.test.ts b/superset-frontend/src/hooks/apiResources/schemas.test.ts new file mode 100644 index 000000000000..59d00a5dc71b --- /dev/null +++ b/superset-frontend/src/hooks/apiResources/schemas.test.ts @@ -0,0 +1,138 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import rison from 'rison'; +import fetchMock from 'fetch-mock'; +import { act, renderHook } from '@testing-library/react-hooks'; +import QueryProvider, { queryClient } from 'src/views/QueryProvider'; +import { useSchemas } from './schemas'; + +const fakeApiResult = { + result: ['test schema 1', 'test schema b'], +}; + +const expectedResult = fakeApiResult.result.map((value: string) => ({ + value, + label: value, + title: value, +})); + +describe('useSchemas hook', () => { + beforeEach(() => { + queryClient.clear(); + jest.useFakeTimers(); + }); + + afterEach(() => { + fetchMock.reset(); + jest.useRealTimers(); + }); + + test('returns api response mapping json result', async () => { + const expectDbId = 'db1'; + const forceRefresh = false; + const schemaApiRoute = `glob:*/api/v1/database/${expectDbId}/schemas/*`; + fetchMock.get(schemaApiRoute, fakeApiResult); + const { result } = renderHook( + () => + useSchemas({ + dbId: expectDbId, + }), + { + wrapper: QueryProvider, + }, + ); + await act(async () => { + jest.runAllTimers(); + }); + expect(fetchMock.calls(schemaApiRoute).length).toBe(1); + expect( + fetchMock.calls( + `end:/api/v1/database/${expectDbId}/schemas/?q=${rison.encode({ + force: forceRefresh, + })}`, + ).length, + ).toBe(1); + expect(result.current.data).toEqual(expectedResult); + await act(async () => { + result.current.refetch(); + }); + expect(fetchMock.calls(schemaApiRoute).length).toBe(2); + expect( + fetchMock.calls( + `end:/api/v1/database/${expectDbId}/schemas/?q=${rison.encode({ + force: true, + })}`, + ).length, + ).toBe(1); + expect(result.current.data).toEqual(expectedResult); + }); + + test('returns cached data without api request', async () => { + const expectDbId = 'db1'; + const schemaApiRoute = `glob:*/api/v1/database/${expectDbId}/schemas/*`; + fetchMock.get(schemaApiRoute, fakeApiResult); + const { result, rerender } = renderHook( + () => + useSchemas({ + dbId: expectDbId, + }), + { + wrapper: QueryProvider, + }, + ); + await act(async () => { + jest.runAllTimers(); + }); + expect(fetchMock.calls(schemaApiRoute).length).toBe(1); + rerender(); + expect(fetchMock.calls(schemaApiRoute).length).toBe(1); + expect(result.current.data).toEqual(expectedResult); + }); + + it('returns refreshed data after expires', async () => { + const expectDbId = 'db1'; + const schemaApiRoute = `glob:*/api/v1/database/${expectDbId}/schemas/*`; + fetchMock.get(schemaApiRoute, fakeApiResult); + const { result, rerender } = renderHook( + () => + useSchemas({ + dbId: expectDbId, + }), + { + wrapper: QueryProvider, + }, + ); + await act(async () => { + jest.runAllTimers(); + }); + expect(fetchMock.calls(schemaApiRoute).length).toBe(1); + rerender(); + await act(async () => { + jest.runAllTimers(); + }); + expect(fetchMock.calls(schemaApiRoute).length).toBe(1); + queryClient.clear(); + rerender(); + await act(async () => { + jest.runAllTimers(); + }); + expect(fetchMock.calls(schemaApiRoute).length).toBe(2); + expect(result.current.data).toEqual(expectedResult); + }); +}); diff --git a/superset-frontend/src/hooks/apiResources/schemas.ts b/superset-frontend/src/hooks/apiResources/schemas.ts new file mode 100644 index 000000000000..34a50ca4e989 --- /dev/null +++ b/superset-frontend/src/hooks/apiResources/schemas.ts @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { useRef } from 'react'; +import { useQuery, UseQueryOptions } from 'react-query'; +import rison from 'rison'; +import { SupersetClient } from '@superset-ui/core'; + +export type FetchSchemasQueryParams = { + dbId?: string | number; + forceRefresh?: boolean; +}; + +type QueryData = { + json: { result: string[] }; + response: Response; +}; + +export type SchemaOption = { + value: string; + label: string; + title: string; +}; + +export function fetchSchemas({ dbId, forceRefresh }: FetchSchemasQueryParams) { + const queryParams = rison.encode({ force: forceRefresh }); + // TODO: Would be nice to add pagination in a follow-up. Needs endpoint changes. + const endpoint = `/api/v1/database/${dbId}/schemas/?q=${queryParams}`; + return SupersetClient.get({ endpoint }) as Promise<QueryData>; +} + +type Params = FetchSchemasQueryParams & + Pick<UseQueryOptions<SchemaOption[]>, 'onSuccess' | 'onError'>; + +export function useSchemas(options: Params) { + const { dbId, onSuccess, onError } = options || {}; + const forceRefreshRef = useRef(false); + const params = { dbId }; + const result = useQuery<QueryData, Error, SchemaOption[]>( + ['schemas', { dbId }], + () => fetchSchemas({ ...params, forceRefresh: forceRefreshRef.current }), + { + select: ({ json }) => + json.result.map((value: string) => ({ + value, + label: value, + title: value, + })), + enabled: Boolean(dbId), + onSuccess, + onError, + onSettled: () => { + forceRefreshRef.current = false; + }, + }, + ); + + return { + ...result, + refetch: () => { + forceRefreshRef.current = true; + return result.refetch(); + }, + }; +} diff --git a/superset-frontend/src/hooks/apiResources/tables.test.ts b/superset-frontend/src/hooks/apiResources/tables.test.ts new file mode 100644 index 000000000000..8cc0791d5069 --- /dev/null +++ b/superset-frontend/src/hooks/apiResources/tables.test.ts @@ -0,0 +1,248 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import rison from 'rison'; +import fetchMock from 'fetch-mock'; +import { act, renderHook } from '@testing-library/react-hooks'; +import QueryProvider, { queryClient } from 'src/views/QueryProvider'; +import { useTables } from './tables'; + +const fakeApiResult = { + count: 2, + result: [ + { + id: 1, + name: 'fake api result1', + label: 'fake api label1', + }, + { + id: 2, + name: 'fake api result2', + label: 'fake api label2', + }, + ], +}; + +const fakeHasMoreApiResult = { + count: 4, + result: [ + { + id: 1, + name: 'fake api result1', + label: 'fake api label1', + }, + { + id: 2, + name: 'fake api result2', + label: 'fake api label2', + }, + ], +}; + +const fakeSchemaApiResult = ['schema1', 'schema2']; + +const expectedData = { + options: fakeApiResult.result, + hasMore: false, +}; + +const expectedHasMoreData = { + options: fakeHasMoreApiResult.result, + hasMore: true, +}; + +describe('useTables hook', () => { + beforeEach(() => { + queryClient.clear(); + jest.useFakeTimers(); + }); + + afterEach(() => { + fetchMock.reset(); + jest.useRealTimers(); + }); + + test('returns api response mapping json options', async () => { + const expectDbId = 'db1'; + const expectedSchema = 'schema1'; + const schemaApiRoute = `glob:*/api/v1/database/${expectDbId}/schemas/*`; + const tableApiRoute = `glob:*/api/v1/database/${expectDbId}/tables/?q=*`; + fetchMock.get(tableApiRoute, fakeApiResult); + fetchMock.get(schemaApiRoute, { + result: fakeSchemaApiResult, + }); + const { result } = renderHook( + () => + useTables({ + dbId: expectDbId, + schema: expectedSchema, + }), + { + wrapper: QueryProvider, + }, + ); + await act(async () => { + jest.runAllTimers(); + }); + expect(fetchMock.calls(schemaApiRoute).length).toBe(1); + expect( + fetchMock.calls( + `end:api/v1/database/${expectDbId}/tables/?q=${rison.encode({ + force: false, + schema_name: expectedSchema, + })}`, + ).length, + ).toBe(1); + expect(result.current.data).toEqual(expectedData); + await act(async () => { + result.current.refetch(); + }); + expect(fetchMock.calls(schemaApiRoute).length).toBe(1); + expect( + fetchMock.calls( + `end:api/v1/database/${expectDbId}/tables/?q=${rison.encode({ + force: true, + schema_name: expectedSchema, + })}`, + ).length, + ).toBe(1); + expect(result.current.data).toEqual(expectedData); + }); + + test('skips the deprecated schema option', async () => { + const expectDbId = 'db1'; + const unexpectedSchema = 'invalid schema'; + const schemaApiRoute = `glob:*/api/v1/database/${expectDbId}/schemas/*`; + const tableApiRoute = `glob:*/api/v1/database/${expectDbId}/tables/?q=*`; + fetchMock.get(tableApiRoute, fakeApiResult); + fetchMock.get(schemaApiRoute, { + result: fakeSchemaApiResult, + }); + const { result } = renderHook( + () => + useTables({ + dbId: expectDbId, + schema: unexpectedSchema, + }), + { + wrapper: QueryProvider, + }, + ); + await act(async () => { + jest.runAllTimers(); + }); + expect(fetchMock.calls(schemaApiRoute).length).toBe(1); + expect(result.current.data).toEqual(undefined); + expect( + fetchMock.calls( + `end:api/v1/database/${expectDbId}/tables/?q=${rison.encode({ + force: false, + schema_name: unexpectedSchema, + })}`, + ).length, + ).toBe(0); + }); + + test('returns hasMore when total is larger than result size', async () => { + const expectDbId = 'db1'; + const expectedSchema = 'schema2'; + const tableApiRoute = `glob:*/api/v1/database/${expectDbId}/tables/?q=*`; + fetchMock.get(tableApiRoute, fakeHasMoreApiResult); + fetchMock.get(`glob:*/api/v1/database/${expectDbId}/schemas/*`, { + result: fakeSchemaApiResult, + }); + const { result } = renderHook( + () => + useTables({ + dbId: expectDbId, + schema: expectedSchema, + }), + { + wrapper: QueryProvider, + }, + ); + await act(async () => { + jest.runAllTimers(); + }); + expect(fetchMock.calls(tableApiRoute).length).toBe(1); + expect(result.current.data).toEqual(expectedHasMoreData); + }); + + test('returns cached data without api request', async () => { + const expectDbId = 'db1'; + const expectedSchema = 'schema1'; + const tableApiRoute = `glob:*/api/v1/database/${expectDbId}/tables/?q=*`; + fetchMock.get(tableApiRoute, fakeApiResult); + fetchMock.get(`glob:*/api/v1/database/${expectDbId}/schemas/*`, { + result: fakeSchemaApiResult, + }); + const { result, rerender } = renderHook( + () => + useTables({ + dbId: expectDbId, + schema: expectedSchema, + }), + { + wrapper: QueryProvider, + }, + ); + await act(async () => { + jest.runAllTimers(); + }); + expect(fetchMock.calls(tableApiRoute).length).toBe(1); + rerender(); + expect(fetchMock.calls(tableApiRoute).length).toBe(1); + expect(result.current.data).toEqual(expectedData); + }); + + test('returns refreshed data after expires', async () => { + const expectDbId = 'db1'; + const expectedSchema = 'schema1'; + const tableApiRoute = `glob:*/api/v1/database/${expectDbId}/tables/?q=*`; + fetchMock.get(tableApiRoute, fakeApiResult); + fetchMock.get(`glob:*/api/v1/database/${expectDbId}/schemas/*`, { + result: fakeSchemaApiResult, + }); + const { result, rerender } = renderHook( + () => + useTables({ + dbId: expectDbId, + schema: expectedSchema, + }), + { + wrapper: QueryProvider, + }, + ); + await act(async () => { + jest.runAllTimers(); + }); + expect(fetchMock.calls(tableApiRoute).length).toBe(1); + rerender(); + await act(async () => { + jest.runAllTimers(); + }); + expect(fetchMock.calls(tableApiRoute).length).toBe(1); + queryClient.clear(); + rerender(); + await act(async () => { + jest.runAllTimers(); + }); + expect(fetchMock.calls(tableApiRoute).length).toBe(2); + expect(result.current.data).toEqual(expectedData); + }); +}); diff --git a/superset-frontend/src/hooks/apiResources/tables.ts b/superset-frontend/src/hooks/apiResources/tables.ts new file mode 100644 index 000000000000..34d286c9456a --- /dev/null +++ b/superset-frontend/src/hooks/apiResources/tables.ts @@ -0,0 +1,115 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { useRef, useMemo } from 'react'; +import { useQuery, UseQueryOptions } from 'react-query'; +import rison from 'rison'; +import { SupersetClient } from '@superset-ui/core'; + +import { useSchemas } from './schemas'; + +export type FetchTablesQueryParams = { + dbId?: string | number; + schema?: string; + forceRefresh?: boolean; +}; +export interface Table { + label: string; + value: string; + type: string; + extra?: { + certification?: { + certified_by: string; + details: string; + }; + warning_markdown?: string; + }; +} + +type QueryData = { + json: { + count: number; + result: Table[]; + }; + response: Response; +}; + +export type Data = { + options: Table[]; + hasMore: boolean; +}; + +export function fetchTables({ + dbId, + schema, + forceRefresh, +}: FetchTablesQueryParams) { + const encodedSchema = schema ? encodeURIComponent(schema) : ''; + const params = rison.encode({ + force: forceRefresh, + schema_name: encodedSchema, + }); + + // TODO: Would be nice to add pagination in a follow-up. Needs endpoint changes. + const endpoint = `/api/v1/database/${ + dbId ?? 'undefined' + }/tables/?q=${params}`; + return SupersetClient.get({ endpoint }) as Promise<QueryData>; +} + +type Params = FetchTablesQueryParams & + Pick<UseQueryOptions<Data>, 'onSuccess' | 'onError'>; + +export function useTables(options: Params) { + const { data: schemaOptions, isFetching } = useSchemas({ + dbId: options.dbId, + }); + const schemaOptionsMap = useMemo( + () => new Set(schemaOptions?.map(({ value }) => value)), + [schemaOptions], + ); + const { dbId, schema, onSuccess, onError } = options || {}; + const forceRefreshRef = useRef(false); + const params = { dbId, schema }; + const result = useQuery<QueryData, Error, Data>( + ['tables', { dbId, schema }], + () => fetchTables({ ...params, forceRefresh: forceRefreshRef.current }), + { + select: ({ json }) => ({ + options: json.result, + hasMore: json.count > json.result.length, + }), + enabled: Boolean( + dbId && schema && !isFetching && schemaOptionsMap.has(schema), + ), + onSuccess, + onError, + onSettled: () => { + forceRefreshRef.current = false; + }, + }, + ); + + return { + ...result, + refetch: () => { + forceRefreshRef.current = true; + return result.refetch(); + }, + }; +} diff --git a/superset-frontend/src/hooks/useTabId.ts b/superset-frontend/src/hooks/useTabId.ts index 1bd0df3a36aa..4f60763c8887 100644 --- a/superset-frontend/src/hooks/useTabId.ts +++ b/superset-frontend/src/hooks/useTabId.ts @@ -17,6 +17,7 @@ * under the License. */ import { useEffect, useState } from 'react'; +import shortid from 'shortid'; import { BroadcastChannel } from 'broadcast-channel'; interface TabIdChannelMessage { @@ -32,7 +33,21 @@ const channel = new BroadcastChannel<TabIdChannelMessage>('tab_id_channel'); export function useTabId() { const [tabId, setTabId] = useState<string>(); + function isStorageAvailable() { + try { + return window.localStorage && window.sessionStorage; + } catch (error) { + return false; + } + } useEffect(() => { + if (!isStorageAvailable()) { + if (!tabId) { + setTabId(shortid.generate()); + } + return; + } + const updateTabId = () => { const lastTabId = window.localStorage.getItem('last_tab_id'); const newTabId = String( diff --git a/superset-frontend/src/explore/components/DataTablesPane/utils.ts b/superset-frontend/src/hooks/useTruncation/index.ts similarity index 80% rename from superset-frontend/src/explore/components/DataTablesPane/utils.ts rename to superset-frontend/src/hooks/useTruncation/index.ts index c6394fb9b67f..5dc5550188a3 100644 --- a/superset-frontend/src/explore/components/DataTablesPane/utils.ts +++ b/superset-frontend/src/hooks/useTruncation/index.ts @@ -16,9 +16,8 @@ * specific language governing permissions and limitations * under the License. */ -const queryObjectCount = { - mixed_timeseries: 2, -}; -export const getQueryCount = (vizType: string): number => - queryObjectCount?.[vizType] || 1; +import useTruncation from './useChildElementTruncation'; +import useCSSTextTruncation, { truncationCSS } from './useCSSTextTruncation'; + +export { useTruncation, useCSSTextTruncation, truncationCSS }; diff --git a/superset-frontend/src/hooks/useTruncation/useCSSTextTruncation.ts b/superset-frontend/src/hooks/useTruncation/useCSSTextTruncation.ts new file mode 100644 index 000000000000..a591766fbb2c --- /dev/null +++ b/superset-frontend/src/hooks/useTruncation/useCSSTextTruncation.ts @@ -0,0 +1,61 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { css } from '@emotion/react'; +import React, { useEffect, useRef, useState } from 'react'; + +/** + * Importable CSS that enables text truncation on fixed-width block + * elements. + */ +export const truncationCSS = css` + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +`; + +/** + * This hook encapsulates logic supporting truncation of text via + * the CSS "text-overflow: ellipsis;" feature. Given the text content + * to be displayed, this hook returns a ref to attach to the text + * element and a boolean for whether that element is currently truncated. + */ +const useCSSTextTruncation = <T extends HTMLElement>(): [ + React.RefObject<T>, + boolean, +] => { + const [isTruncated, setIsTruncated] = useState(true); + const ref = useRef<T>(null); + const [offsetWidth, setOffsetWidth] = useState(0); + const [scrollWidth, setScrollWidth] = useState(0); + + // eslint-disable-next-line react-hooks/exhaustive-deps + useEffect(() => { + setOffsetWidth(ref.current?.offsetWidth ?? 0); + setScrollWidth(ref.current?.scrollWidth ?? 0); + }); + + useEffect(() => { + setIsTruncated(offsetWidth < scrollWidth); + }, [offsetWidth, scrollWidth]); + + return [ref, isTruncated]; +}; + +export default useCSSTextTruncation; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/useTruncation.ts b/superset-frontend/src/hooks/useTruncation/useChildElementTruncation.ts similarity index 62% rename from superset-frontend/src/dashboard/components/nativeFilters/FilterCard/useTruncation.ts rename to superset-frontend/src/hooks/useTruncation/useChildElementTruncation.ts index a4a893463f61..4f6b628642ab 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterCard/useTruncation.ts +++ b/superset-frontend/src/hooks/useTruncation/useChildElementTruncation.ts @@ -18,17 +18,32 @@ */ import { RefObject, useLayoutEffect, useState, useRef } from 'react'; -export const useTruncation = (elementRef: RefObject<HTMLElement>) => { +/** + * This hook encapsulates logic to support truncation of child HTML + * elements contained in a fixed-width parent HTML element. Given + * a ref to the parent element and optionally a ref to the "+x" + * component that shows the number of truncated items, this hook + * will return the number of elements that are not fully visible + * (including those completely hidden) and whether any elements + * are completely hidden. + */ +const useChildElementTruncation = ( + elementRef: RefObject<HTMLElement>, + plusRef?: RefObject<HTMLElement>, +) => { const [elementsTruncated, setElementsTruncated] = useState(0); const [hasHiddenElements, setHasHiddenElements] = useState(false); const previousEffectInfoRef = useRef({ scrollWidth: 0, parentElementWidth: 0, + plusRefWidth: 0, }); useLayoutEffect(() => { const currentElement = elementRef.current; + const plusRefElement = plusRef?.current; + if (!currentElement) { return; } @@ -45,36 +60,50 @@ export const useTruncation = (elementRef: RefObject<HTMLElement>) => { // the child nodes changes. const previousEffectInfo = previousEffectInfoRef.current; const parentElementWidth = currentElement.parentElement?.clientWidth || 0; + const plusRefWidth = plusRefElement?.offsetWidth || 0; previousEffectInfoRef.current = { scrollWidth, parentElementWidth, + plusRefWidth, }; if ( previousEffectInfo.parentElementWidth === parentElementWidth && - previousEffectInfo.scrollWidth === scrollWidth + previousEffectInfo.scrollWidth === scrollWidth && + previousEffectInfo.plusRefWidth === plusRefWidth ) { return; } if (scrollWidth > clientWidth) { // "..." is around 6px wide - const maxWidth = clientWidth - 6; + const truncationWidth = 6; + const plusSize = plusRefElement?.offsetWidth || 0; + const maxWidth = clientWidth - truncationWidth; const elementsCount = childNodes.length; + let width = 0; - let i = 0; - while (width < maxWidth) { - width += (childNodes[i] as HTMLElement).offsetWidth; - i += 1; + let hiddenElements = 0; + for (let i = 0; i < elementsCount; i += 1) { + const itemWidth = (childNodes[i] as HTMLElement).offsetWidth; + const remainingWidth = maxWidth - truncationWidth - width - plusSize; + + // assures it shows +{number} only when the item is not visible + if (remainingWidth <= 0) { + hiddenElements += 1; + } + width += itemWidth; } - if (i === elementsCount) { - setElementsTruncated(1); - setHasHiddenElements(false); - } else { - setElementsTruncated(elementsCount - i); + + if (elementsCount > 1 && hiddenElements) { setHasHiddenElements(true); + setElementsTruncated(hiddenElements); + } else { + setHasHiddenElements(false); + setElementsTruncated(1); } } else { + setHasHiddenElements(false); setElementsTruncated(0); } }, [ @@ -85,3 +114,5 @@ export const useTruncation = (elementRef: RefObject<HTMLElement>) => { return [elementsTruncated, hasHiddenElements]; }; + +export default useChildElementTruncation; diff --git a/superset-frontend/src/logger/LogUtils.ts b/superset-frontend/src/logger/LogUtils.ts index b3e834bc935d..5c4c05e4f09b 100644 --- a/superset-frontend/src/logger/LogUtils.ts +++ b/superset-frontend/src/logger/LogUtils.ts @@ -35,6 +35,23 @@ export const LOG_ACTIONS_EXPLORE_DASHBOARD_CHART = 'explore_dashboard_chart'; export const LOG_ACTIONS_EXPORT_CSV_DASHBOARD_CHART = 'export_csv_dashboard_chart'; export const LOG_ACTIONS_CHANGE_DASHBOARD_FILTER = 'change_dashboard_filter'; +export const LOG_ACTIONS_DATASET_CREATION_EMPTY_CANCELLATION = + 'dataset_creation_empty_cancellation'; +export const LOG_ACTIONS_DATASET_CREATION_DATABASE_CANCELLATION = + 'dataset_creation_database_cancellation'; +export const LOG_ACTIONS_DATASET_CREATION_SCHEMA_CANCELLATION = + 'dataset_creation_schema_cancellation'; +export const LOG_ACTIONS_DATASET_CREATION_TABLE_CANCELLATION = + 'dataset_creation_table_cancellation'; +export const LOG_ACTIONS_DATASET_CREATION_SUCCESS = 'dataset_creation_success'; +export const LOG_ACTIONS_SPA_NAVIGATION = 'spa_navigation'; +export const LOG_ACTIONS_CONFIRM_OVERWRITE_DASHBOARD_METADATA = + 'confirm_overwrite_dashboard_metadata'; +export const LOG_ACTIONS_DASHBOARD_DOWNLOAD_AS_IMAGE = + 'dashboard_download_as_image'; +export const LOG_ACTIONS_CHART_DOWNLOAD_AS_IMAGE = 'chart_download_as_image'; +export const LOG_ACTIONS_SQLLAB_WARN_LOCAL_STORAGE_USAGE = + 'sqllab_warn_local_storage_usage'; // Log event types -------------------------------------------------------------- export const LOG_EVENT_TYPE_TIMING = new Set([ @@ -54,8 +71,19 @@ export const LOG_EVENT_TYPE_USER = new Set([ LOG_ACTIONS_FORCE_REFRESH_DASHBOARD, LOG_ACTIONS_PERIODIC_RENDER_DASHBOARD, LOG_ACTIONS_MOUNT_EXPLORER, + LOG_ACTIONS_CONFIRM_OVERWRITE_DASHBOARD_METADATA, + LOG_ACTIONS_DASHBOARD_DOWNLOAD_AS_IMAGE, + LOG_ACTIONS_CHART_DOWNLOAD_AS_IMAGE, ]); +export const LOG_EVENT_DATASET_TYPE_DATASET_CREATION = [ + LOG_ACTIONS_DATASET_CREATION_EMPTY_CANCELLATION, + LOG_ACTIONS_DATASET_CREATION_DATABASE_CANCELLATION, + LOG_ACTIONS_DATASET_CREATION_SCHEMA_CANCELLATION, + LOG_ACTIONS_DATASET_CREATION_TABLE_CANCELLATION, + LOG_ACTIONS_DATASET_CREATION_SUCCESS, +]; + export const Logger = { timeOriginOffset: 0, diff --git a/superset-frontend/src/middleware/asyncEvent.ts b/superset-frontend/src/middleware/asyncEvent.ts index 9ae4f90e479f..6966ad6d3f71 100644 --- a/superset-frontend/src/middleware/asyncEvent.ts +++ b/superset-frontend/src/middleware/asyncEvent.ts @@ -23,6 +23,7 @@ import { logging, } from '@superset-ui/core'; import { SupersetError } from 'src/components/ErrorMessage/types'; +import getBootstrapData from 'src/utils/getBootstrapData'; import { FeatureFlag, isFeatureEnabled } from '../featureFlags'; import { getClientErrorObject, @@ -171,7 +172,7 @@ const loadEventsFromApi = async () => { if (Object.keys(listenersByJobId).length) { try { const { result: events } = await fetchEvents(eventArgs); - if (events && events.length) await processEvents(events); + if (events?.length) await processEvents(events); } catch (err) { logging.warn(err); } @@ -235,21 +236,7 @@ export const init = (appConfig?: AppConfig) => { retriesByJobId = {}; lastReceivedEventId = null; - if (appConfig) { - config = appConfig; - } else { - // load bootstrap data from DOM - const appContainer = document.getElementById('app'); - if (appContainer) { - const bootstrapData = JSON.parse( - appContainer?.getAttribute('data-bootstrap') || '{}', - ); - config = bootstrapData?.common?.conf; - } else { - config = {}; - logging.warn('asyncEvent: app config data not found'); - } - } + config = appConfig || getBootstrapData().common.conf; transport = config.GLOBAL_ASYNC_QUERIES_TRANSPORT || TRANSPORT_POLLING; pollingDelayMs = config.GLOBAL_ASYNC_QUERIES_POLLING_DELAY || 500; diff --git a/superset-frontend/src/middleware/logger.test.js b/superset-frontend/src/middleware/logger.test.js index fd584c2b36ac..d67c681caaf1 100644 --- a/superset-frontend/src/middleware/logger.test.js +++ b/superset-frontend/src/middleware/logger.test.js @@ -109,4 +109,39 @@ describe('logger middleware', () => { SupersetClient.post.getCall(0).args[0].postPayload.events, ).toHaveLength(3); }); + + it('should use navigator.sendBeacon if it exists', () => { + const clock = sinon.useFakeTimers(); + const beaconMock = jest.fn(); + Object.defineProperty(navigator, 'sendBeacon', { + writable: true, + value: beaconMock, + }); + + logger(mockStore)(next)(action); + expect(beaconMock.mock.calls.length).toBe(0); + clock.tick(2000); + + expect(beaconMock.mock.calls.length).toBe(1); + const endpoint = beaconMock.mock.calls[0][0]; + expect(endpoint).toMatch('/superset/log/'); + }); + + it('should pass a guest token to sendBeacon if present', () => { + const clock = sinon.useFakeTimers(); + const beaconMock = jest.fn(); + Object.defineProperty(navigator, 'sendBeacon', { + writable: true, + value: beaconMock, + }); + SupersetClient.configure({ guestToken: 'token' }); + + logger(mockStore)(next)(action); + expect(beaconMock.mock.calls.length).toBe(0); + clock.tick(2000); + expect(beaconMock.mock.calls.length).toBe(1); + + const formData = beaconMock.mock.calls[0][1]; + expect(formData.getAll('guest_token')[0]).toMatch('token'); + }); }); diff --git a/superset-frontend/src/middleware/loggerMiddleware.js b/superset-frontend/src/middleware/loggerMiddleware.js index b88d55542851..475c1784cce5 100644 --- a/superset-frontend/src/middleware/loggerMiddleware.js +++ b/superset-frontend/src/middleware/loggerMiddleware.js @@ -44,6 +44,10 @@ const sendBeacon = events => { if (navigator.sendBeacon) { const formData = new FormData(); formData.append('events', safeStringify(events)); + if (SupersetClient.getGuestToken()) { + // if we have a guest token, we need to send it for auth via the form + formData.append('guest_token', SupersetClient.getGuestToken()); + } navigator.sendBeacon(endpoint, formData); } else { SupersetClient.post({ @@ -68,24 +72,34 @@ const loggerMiddleware = store => next => action => { return next(action); } - const { dashboardInfo, explore, impressionId, dashboardLayout } = + const { dashboardInfo, explore, impressionId, dashboardLayout, sqlLab } = store.getState(); let logMetadata = { impression_id: impressionId, version: 'v2', }; - if (dashboardInfo) { + if (dashboardInfo?.id) { logMetadata = { source: 'dashboard', source_id: dashboardInfo.id, ...logMetadata, }; - } else if (explore) { + } else if (explore?.slice) { logMetadata = { source: 'explore', source_id: explore.slice ? explore.slice.slice_id : 0, ...logMetadata, }; + } else if (sqlLab) { + const editor = sqlLab.queryEditors.find( + ({ id }) => id === sqlLab.tabHistory.slice(-1)[0], + ); + logMetadata = { + source: 'sqlLab', + source_id: editor?.id, + db_id: editor?.dbId, + schema: editor?.schema, + }; } const { eventName } = action.payload; diff --git a/superset-frontend/src/modules/AnnotationTypes.js b/superset-frontend/src/modules/AnnotationTypes.js index 1f8556114d12..cdf7a161f768 100644 --- a/superset-frontend/src/modules/AnnotationTypes.js +++ b/superset-frontend/src/modules/AnnotationTypes.js @@ -16,6 +16,8 @@ * specific language governing permissions and limitations * under the License. */ +import { t } from '@superset-ui/core'; + function extractTypes(metadata) { return Object.keys(metadata).reduce((prev, key) => { const result = prev; @@ -27,21 +29,21 @@ function extractTypes(metadata) { export const ANNOTATION_TYPES_METADATA = { FORMULA: { value: 'FORMULA', - label: 'Formula', + label: t('Formula'), }, EVENT: { value: 'EVENT', - label: 'Event', + label: t('Event'), supportNativeSource: true, }, INTERVAL: { value: 'INTERVAL', - label: 'Interval', + label: t('Interval'), supportNativeSource: true, }, TIME_SERIES: { value: 'TIME_SERIES', - label: 'Time series', + label: t('Time series'), }, }; diff --git a/superset-frontend/src/pages/ChartCreation/ChartCreation.test.tsx b/superset-frontend/src/pages/ChartCreation/ChartCreation.test.tsx new file mode 100644 index 000000000000..2c3c7b5d639e --- /dev/null +++ b/superset-frontend/src/pages/ChartCreation/ChartCreation.test.tsx @@ -0,0 +1,153 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { ReactWrapper } from 'enzyme'; +import { styledMount as mount } from 'spec/helpers/theming'; +import Button from 'src/components/Button'; +import { AsyncSelect } from 'src/components'; +import { + ChartCreation, + ChartCreationProps, + ChartCreationState, +} from 'src/pages/ChartCreation'; +import VizTypeGallery from 'src/explore/components/controls/VizTypeControl/VizTypeGallery'; +import { act } from 'spec/helpers/testing-library'; +import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; + +const datasource = { + value: '1', + label: 'table', +}; + +const mockUser: UserWithPermissionsAndRoles = { + createdOn: '2021-04-27T18:12:38.952304', + email: 'admin', + firstName: 'admin', + isActive: true, + lastName: 'admin', + permissions: {}, + roles: { Admin: Array(173) }, + userId: 1, + username: 'admin', + isAnonymous: false, +}; + +const mockUserWithDatasetWrite: UserWithPermissionsAndRoles = { + createdOn: '2021-04-27T18:12:38.952304', + email: 'admin', + firstName: 'admin', + isActive: true, + lastName: 'admin', + permissions: {}, + roles: { Admin: [['can_write', 'Dataset']] }, + userId: 1, + username: 'admin', + isAnonymous: false, +}; + +// We don't need the actual implementation for the tests +const routeProps = { + history: {} as any, + location: {} as any, + match: {} as any, +}; + +async function getWrapper(user = mockUser) { + const wrapper = mount( + <ChartCreation user={user} addSuccessToast={() => null} {...routeProps} />, + ) as unknown as ReactWrapper< + ChartCreationProps, + ChartCreationState, + ChartCreation + >; + await act(() => new Promise(resolve => setTimeout(resolve, 0))); + return wrapper; +} + +test('renders a select and a VizTypeGallery', async () => { + const wrapper = await getWrapper(); + expect(wrapper.find(AsyncSelect)).toExist(); + expect(wrapper.find(VizTypeGallery)).toExist(); +}); + +test('renders dataset help text when user lacks dataset write permissions', async () => { + const wrapper = await getWrapper(); + expect(wrapper.find('[data-test="dataset-write"]')).not.toExist(); + expect(wrapper.find('[data-test="no-dataset-write"]')).toExist(); +}); + +test('renders dataset help text when user has dataset write permissions', async () => { + const wrapper = await getWrapper(mockUserWithDatasetWrite); + expect(wrapper.find('[data-test="dataset-write"]')).toExist(); + expect(wrapper.find('[data-test="no-dataset-write"]')).not.toExist(); +}); + +test('renders a button', async () => { + const wrapper = await getWrapper(); + expect(wrapper.find(Button)).toExist(); +}); + +test('renders a disabled button if no datasource is selected', async () => { + const wrapper = await getWrapper(); + expect( + wrapper.find(Button).find({ disabled: true }).hostNodes(), + ).toHaveLength(1); +}); + +test('renders an enabled button if datasource and viz type are selected', async () => { + const wrapper = await getWrapper(); + wrapper.setState({ + datasource, + vizType: 'table', + }); + expect( + wrapper.find(Button).find({ disabled: true }).hostNodes(), + ).toHaveLength(0); +}); + +test('double-click viz type does nothing if no datasource is selected', async () => { + const wrapper = await getWrapper(); + wrapper.instance().gotoSlice = jest.fn(); + wrapper.update(); + wrapper.instance().onVizTypeDoubleClick(); + expect(wrapper.instance().gotoSlice).not.toBeCalled(); +}); + +test('double-click viz type submits if datasource is selected', async () => { + const wrapper = await getWrapper(); + wrapper.instance().gotoSlice = jest.fn(); + wrapper.update(); + wrapper.setState({ + datasource, + vizType: 'table', + }); + + wrapper.instance().onVizTypeDoubleClick(); + expect(wrapper.instance().gotoSlice).toBeCalled(); +}); + +test('formats Explore url', async () => { + const wrapper = await getWrapper(); + wrapper.setState({ + datasource, + vizType: 'table', + }); + const formattedUrl = '/explore/?viz_type=table&datasource=1'; + expect(wrapper.instance().exploreUrl()).toBe(formattedUrl); +}); diff --git a/superset-frontend/src/addSlice/AddSliceContainer.tsx b/superset-frontend/src/pages/ChartCreation/index.tsx similarity index 62% rename from superset-frontend/src/addSlice/AddSliceContainer.tsx rename to superset-frontend/src/pages/ChartCreation/index.tsx index fd22377314ac..2a01a9123af1 100644 --- a/superset-frontend/src/addSlice/AddSliceContainer.tsx +++ b/superset-frontend/src/pages/ChartCreation/index.tsx @@ -18,18 +18,28 @@ */ import React, { ReactNode } from 'react'; import rison from 'rison'; -import { styled, t, SupersetClient, JsonResponse } from '@superset-ui/core'; +import querystring from 'query-string'; +import { + styled, + t, + SupersetClient, + JsonResponse, + isDefined, +} from '@superset-ui/core'; import { getUrlParam } from 'src/utils/urlUtils'; import { URL_PARAMS } from 'src/constants'; -import { isNullish } from 'src/utils/common'; +import { Link, withRouter, RouteComponentProps } from 'react-router-dom'; import Button from 'src/components/Button'; -import { Select, Steps } from 'src/components'; -import { FormLabel } from 'src/components/Form'; +import { AsyncSelect, Steps } from 'src/components'; import { Tooltip } from 'src/components/Tooltip'; +import withToasts from 'src/components/MessageToasts/withToasts'; import VizTypeGallery, { MAX_ADVISABLE_VIZ_GALLERY_WIDTH, } from 'src/explore/components/controls/VizTypeControl/VizTypeGallery'; +import { findPermission } from 'src/utils/findPermission'; +import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; +import getBootstrapData from 'src/utils/getBootstrapData'; type Dataset = { id: number; @@ -38,16 +48,24 @@ type Dataset = { datasource_type: string; }; -export type AddSliceContainerProps = {}; +export interface ChartCreationProps extends RouteComponentProps { + user: UserWithPermissionsAndRoles; + addSuccessToast: (arg: string) => void; +} -export type AddSliceContainerState = { +export type ChartCreationState = { datasource?: { label: string; value: string }; - visType: string | null; + datasetName?: string | string[] | null; + vizType: string | null; + canCreateDataset: boolean; }; const ESTIMATED_NAV_HEIGHT = 56; const ELEMENTS_EXCEPT_VIZ_GALLERY = ESTIMATED_NAV_HEIGHT + 250; +const bootstrapData = getBootstrapData(); +const denyList: string[] = bootstrapData.common.conf.VIZ_TYPE_DENYLIST || []; + const StyledContainer = styled.div` ${({ theme }) => ` flex: 1 1 auto; @@ -73,7 +91,6 @@ const StyledContainer = styled.div` display: flex; flex-direction: row; align-items: center; - margin-bottom: ${theme.gridUnit * 2}px; & > div { min-width: 200px; @@ -180,49 +197,91 @@ const StyledLabel = styled.span` `} `; -export default class AddSliceContainer extends React.PureComponent< - AddSliceContainerProps, - AddSliceContainerState +const StyledStepTitle = styled.span` + ${({ + theme: { + typography: { sizes, weights }, + }, + }) => ` + font-size: ${sizes.m}px; + font-weight: ${weights.bold}; + `} +`; + +const StyledStepDescription = styled.div` + ${({ theme: { gridUnit } }) => ` + margin-top: ${gridUnit * 4}px; + margin-bottom: ${gridUnit * 3}px; + `} +`; + +export class ChartCreation extends React.PureComponent< + ChartCreationProps, + ChartCreationState > { - constructor(props: AddSliceContainerProps) { + constructor(props: ChartCreationProps) { super(props); this.state = { - visType: null, + vizType: null, + canCreateDataset: findPermission( + 'can_write', + 'Dataset', + props.user.roles, + ), }; this.changeDatasource = this.changeDatasource.bind(this); - this.changeVisType = this.changeVisType.bind(this); + this.changeVizType = this.changeVizType.bind(this); this.gotoSlice = this.gotoSlice.bind(this); this.newLabel = this.newLabel.bind(this); this.loadDatasources = this.loadDatasources.bind(this); + this.onVizTypeDoubleClick = this.onVizTypeDoubleClick.bind(this); + } + + componentDidMount() { + const params = querystring.parse(window.location.search)?.dataset as string; + if (params) { + this.loadDatasources(params, 0, 1).then(r => { + const datasource = r.data[0]; + // override here to force styling of option label + // which expects a reactnode instead of string + // @ts-expect-error + datasource.label = datasource.customLabel; + this.setState({ datasource }); + }); + this.props.addSuccessToast(t('The dataset has been saved')); + } } exploreUrl() { const dashboardId = getUrlParam(URL_PARAMS.dashboardId); - const formData = encodeURIComponent( - JSON.stringify({ - viz_type: this.state.visType, - datasource: this.state.datasource?.value, - ...(!isNullish(dashboardId) && { dashboardId }), - }), - ); - return `/superset/explore/?form_data=${formData}`; + let url = `/explore/?viz_type=${this.state.vizType}&datasource=${this.state.datasource?.value}`; + if (isDefined(dashboardId)) { + url += `&dashboard_id=${dashboardId}`; + } + return url; } gotoSlice() { - window.location.href = this.exploreUrl(); + this.props.history.push(this.exploreUrl()); } changeDatasource(datasource: { label: string; value: string }) { this.setState({ datasource }); } - changeVisType(visType: string | null) { - this.setState({ visType }); + changeVizType(vizType: string | null) { + this.setState({ vizType }); } isBtnDisabled() { - return !(this.state.datasource?.value && this.state.visType); + return !(this.state.datasource?.value && this.state.vizType); + } + + onVizTypeDoubleClick() { + if (!this.isBtnDisabled()) { + this.gotoSlice(); + } } newLabel(item: Dataset) { @@ -276,16 +335,48 @@ export default class AddSliceContainer extends React.PureComponent< render() { const isButtonDisabled = this.isBtnDisabled(); + const VIEW_INSTRUCTIONS_TEXT = t('view instructions'); + const datasetHelpText = this.state.canCreateDataset ? ( + <span data-test="dataset-write"> + <Link to="/dataset/add/" data-test="add-chart-new-dataset"> + {t('Add a dataset')}{' '} + </Link> + {t('or')}{' '} + <a + href="https://superset.apache.org/docs/creating-charts-dashboards/creating-your-first-dashboard/#registering-a-new-table" + rel="noopener noreferrer" + target="_blank" + data-test="add-chart-new-dataset-instructions" + > + {`${VIEW_INSTRUCTIONS_TEXT} `} + <i className="fa fa-external-link" /> + </a> + . + </span> + ) : ( + <span data-test="no-dataset-write"> + <a + href="https://superset.apache.org/docs/creating-charts-dashboards/creating-your-first-dashboard/#registering-a-new-table" + rel="noopener noreferrer" + target="_blank" + > + {`${VIEW_INSTRUCTIONS_TEXT} `} + <i className="fa fa-external-link" /> + </a> + . + </span> + ); + return ( <StyledContainer> <h3>{t('Create a new chart')}</h3> <Steps direction="vertical" size="small"> <Steps.Step - title={<FormLabel>{t('Choose a dataset')}</FormLabel>} + title={<StyledStepTitle>{t('Choose a dataset')}</StyledStepTitle>} status={this.state.datasource?.value ? 'finish' : 'process'} description={ - <div className="dataset"> - <Select + <StyledStepDescription className="dataset"> + <AsyncSelect autoFocus ariaLabel={t('Dataset')} name="select-datasource" @@ -296,30 +387,23 @@ export default class AddSliceContainer extends React.PureComponent< showSearch value={this.state.datasource} /> - <span> - {t( - 'Instructions to add a dataset are available in the Superset tutorial.', - )}{' '} - <a - href="https://superset.apache.org/docs/creating-charts-dashboards/creating-your-first-dashboard/#registering-a-new-table" - rel="noopener noreferrer" - target="_blank" - > - <i className="fa fa-external-link" /> - </a> - </span> - </div> + {datasetHelpText} + </StyledStepDescription> } /> <Steps.Step - title={<FormLabel>{t('Choose chart type')}</FormLabel>} - status={this.state.visType ? 'finish' : 'process'} + title={<StyledStepTitle>{t('Choose chart type')}</StyledStepTitle>} + status={this.state.vizType ? 'finish' : 'process'} description={ - <VizTypeGallery - className="viz-gallery" - onChange={this.changeVisType} - selectedViz={this.state.visType} - /> + <StyledStepDescription> + <VizTypeGallery + denyList={denyList} + className="viz-gallery" + onChange={this.changeVizType} + onDoubleClick={this.onVizTypeDoubleClick} + selectedViz={this.state.vizType} + /> + </StyledStepDescription> } /> </Steps> @@ -341,3 +425,5 @@ export default class AddSliceContainer extends React.PureComponent< ); } } + +export default withRouter(withToasts(ChartCreation)); diff --git a/superset-frontend/src/views/CRUD/chart/ChartCard.tsx b/superset-frontend/src/pages/ChartList/ChartCard.tsx similarity index 96% rename from superset-frontend/src/views/CRUD/chart/ChartCard.tsx rename to superset-frontend/src/pages/ChartList/ChartCard.tsx index 69812bd64155..df9b148567dd 100644 --- a/superset-frontend/src/views/CRUD/chart/ChartCard.tsx +++ b/superset-frontend/src/pages/ChartList/ChartCard.tsx @@ -18,6 +18,7 @@ */ import React from 'react'; import { t, useTheme } from '@superset-ui/core'; +import { Link, useHistory } from 'react-router-dom'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; import ConfirmStatusChange from 'src/components/ConfirmStatusChange'; import Icons from 'src/components/Icons'; @@ -29,7 +30,7 @@ import { AntdDropdown } from 'src/components'; import { Menu } from 'src/components/Menu'; import FaveStar from 'src/components/FaveStar'; import FacePile from 'src/components/FacePile'; -import { handleChartDelete, CardStyles } from '../utils'; +import { handleChartDelete, CardStyles } from 'src/views/CRUD/utils'; interface ChartCardProps { chart: Chart; @@ -64,6 +65,7 @@ export default function ChartCard({ userId, handleBulkChartExport, }: ChartCardProps) { + const history = useHistory(); const canEdit = hasPerm('can_write'); const canDelete = hasPerm('can_write'); const canExport = @@ -136,7 +138,7 @@ export default function ChartCard({ <CardStyles onClick={() => { if (!bulkSelectEnabled && chart.url) { - window.location.href = chart.url; + history.push(chart.url); } }} > @@ -158,6 +160,7 @@ export default function ChartCard({ coverRight={ <Label type="secondary">{chart.datasource_name_text}</Label> } + linkComponent={Link} actions={ <ListViewCard.Actions onClick={e => { diff --git a/superset-frontend/src/views/CRUD/chart/ChartList.test.jsx b/superset-frontend/src/pages/ChartList/ChartList.test.jsx similarity index 98% rename from superset-frontend/src/views/CRUD/chart/ChartList.test.jsx rename to superset-frontend/src/pages/ChartList/ChartList.test.jsx index fd9aee16ab06..fc216e617dd9 100644 --- a/superset-frontend/src/views/CRUD/chart/ChartList.test.jsx +++ b/superset-frontend/src/pages/ChartList/ChartList.test.jsx @@ -30,7 +30,7 @@ import userEvent from '@testing-library/user-event'; import { QueryParamProvider } from 'use-query-params'; import { act } from 'react-dom/test-utils'; -import ChartList from 'src/views/CRUD/chart/ChartList'; +import ChartList from 'src/pages/ChartList'; import ConfirmStatusChange from 'src/components/ConfirmStatusChange'; import ListView from 'src/components/ListView'; import PropertiesModal from 'src/explore/components/PropertiesModal'; @@ -189,7 +189,7 @@ describe('RTL', () => { <QueryParamProvider> <ChartList {...mockedProps} user={mockUser} /> </QueryParamProvider>, - { useRedux: true }, + { useRedux: true, useRouter: true }, ); }); diff --git a/superset-frontend/src/views/CRUD/chart/ChartList.tsx b/superset-frontend/src/pages/ChartList/index.tsx similarity index 87% rename from superset-frontend/src/views/CRUD/chart/ChartList.tsx rename to superset-frontend/src/pages/ChartList/index.tsx index 1e2298538673..38271e470db4 100644 --- a/superset-frontend/src/views/CRUD/chart/ChartList.tsx +++ b/superset-frontend/src/pages/ChartList/index.tsx @@ -17,7 +17,9 @@ * under the License. */ import { + ensureIsArray, getChartMetadataRegistry, + JsonResponse, styled, SupersetClient, t, @@ -41,6 +43,7 @@ import handleResourceExport from 'src/utils/export'; import ConfirmStatusChange from 'src/components/ConfirmStatusChange'; import SubMenu, { SubMenuProps } from 'src/views/components/SubMenu'; import FaveStar from 'src/components/FaveStar'; +import { Link, useHistory } from 'react-router-dom'; import ListView, { Filter, FilterOperator, @@ -48,19 +51,21 @@ import ListView, { ListViewProps, SelectOption, } from 'src/components/ListView'; +import CrossLinks from 'src/components/ListView/CrossLinks'; import Loading from 'src/components/Loading'; import { dangerouslyGetItemDoNotUse } from 'src/utils/localStorageHelpers'; import withToasts from 'src/components/MessageToasts/withToasts'; import PropertiesModal from 'src/explore/components/PropertiesModal'; import ImportModelsModal from 'src/components/ImportModal/index'; -import Chart from 'src/types/Chart'; +import Chart, { ChartLinkedDashboard } from 'src/types/Chart'; import { Tooltip } from 'src/components/Tooltip'; import Icons from 'src/components/Icons'; import { nativeFilterGate } from 'src/dashboard/components/nativeFilters/utils'; import setupPlugins from 'src/setup/setupPlugins'; import InfoTooltip from 'src/components/InfoTooltip'; import CertifiedBadge from 'src/components/CertifiedBadge'; -import { bootstrapData } from 'src/preamble'; +import { GenericLink } from 'src/components/GenericLink/GenericLink'; +import getBootstrapData from 'src/utils/getBootstrapData'; import Owner from 'src/types/Owner'; import ChartCard from './ChartCard'; @@ -147,6 +152,8 @@ const Actions = styled.div` color: ${({ theme }) => theme.colors.grayscale.base}; `; +const bootstrapData = getBootstrapData(); + function ChartList(props: ChartListProps) { const { addDangerToast, @@ -154,6 +161,8 @@ function ChartList(props: ChartListProps) { user: { userId }, } = props; + const history = useHistory(); + const { state: { loading, @@ -212,7 +221,7 @@ function ChartList(props: ChartListProps) { hasPerm('can_export') && isFeatureEnabled(FeatureFlag.VERSIONED_EXPORT); const initialSort = [{ id: 'changed_on_delta_humanized', desc: true }]; const enableBroadUserAccess = - bootstrapData?.common?.conf?.ENABLE_BROAD_ACTIVITY_ACCESS; + bootstrapData.common.conf.ENABLE_BROAD_ACTIVITY_ACCESS; const handleBulkChartExport = (chartsToExport: Chart[]) => { const ids = chartsToExport.map(({ id }) => id); handleResourceExport('chart', ids, () => { @@ -242,6 +251,56 @@ function ChartList(props: ChartListProps) { ), ); } + const fetchDashboards = async ( + filterValue = '', + page: number, + pageSize: number, + ) => { + // add filters if filterValue + const filters = filterValue + ? { + filters: [ + { + col: 'dashboards', + opr: FilterOperator.relationManyMany, + value: filterValue, + }, + ], + } + : {}; + const queryParams = rison.encode({ + columns: ['dashboard_title', 'id'], + keys: ['none'], + order_column: 'dashboard_title', + order_direction: 'asc', + page, + page_size: pageSize, + ...filters, + }); + const response: void | JsonResponse = await SupersetClient.get({ + endpoint: !filterValue + ? `/api/v1/dashboard/?q=${queryParams}` + : `/api/v1/chart/?q=${queryParams}`, + }).catch(() => + addDangerToast(t('An error occurred while fetching dashboards')), + ); + const dashboards = response?.json?.result?.map( + ({ + dashboard_title: dashboardTitle, + id, + }: { + dashboard_title: string; + id: number; + }) => ({ + label: dashboardTitle, + value: id, + }), + ); + return { + data: uniqBy<SelectOption>(dashboards, 'value'), + totalCount: response?.json?.count, + }; + }; const columns = useMemo( () => [ @@ -277,7 +336,7 @@ function ChartList(props: ChartListProps) { }, }: any) => ( <FlexRowContainer> - <a href={url} data-test={`${sliceName}-list-chart-title`}> + <Link to={url} data-test={`${sliceName}-list-chart-title`}> {certifiedBy && ( <> <CertifiedBadge @@ -287,7 +346,7 @@ function ChartList(props: ChartListProps) { </> )} {sliceName} - </a> + </Link> {description && ( <InfoTooltip tooltip={description} viewBox="0 -1 24 24" /> )} @@ -314,12 +373,33 @@ function ChartList(props: ChartListProps) { datasource_url: dsUrl, }, }, - }: any) => <a href={dsUrl}>{dsNameTxt}</a>, + }: any) => <GenericLink to={dsUrl}>{dsNameTxt}</GenericLink>, Header: t('Dataset'), accessor: 'datasource_id', disableSortBy: true, size: 'xl', }, + { + Cell: ({ + row: { + original: { dashboards }, + }, + }: any) => ( + <CrossLinks + crossLinks={ensureIsArray(dashboards).map( + (d: ChartLinkedDashboard) => ({ + title: d.dashboard_title, + id: d.id, + }), + )} + /> + ), + Header: t('Dashboards added to'), + accessor: 'dashboards', + disableSortBy: true, + size: 'xxl', + hidden: true, + }, { Cell: ({ row: { @@ -473,6 +553,7 @@ function ChartList(props: ChartListProps) { const favoritesFilter: Filter = useMemo( () => ({ Header: t('Favorite'), + key: 'favorite', id: 'id', urlDisplay: 'favorite', input: 'select', @@ -490,6 +571,7 @@ function ChartList(props: ChartListProps) { () => [ { Header: t('Owner'), + key: 'owner', id: 'owners', input: 'select', operator: FilterOperator.relationManyMany, @@ -511,6 +593,7 @@ function ChartList(props: ChartListProps) { }, { Header: t('Created by'), + key: 'created_by', id: 'created_by', input: 'select', operator: FilterOperator.relationOneMany, @@ -532,6 +615,7 @@ function ChartList(props: ChartListProps) { }, { Header: t('Chart type'), + key: 'viz_type', id: 'viz_type', input: 'select', operator: FilterOperator.equals, @@ -557,6 +641,7 @@ function ChartList(props: ChartListProps) { }, { Header: t('Dataset'), + key: 'dataset', id: 'datasource_id', input: 'select', operator: FilterOperator.equals, @@ -564,9 +649,20 @@ function ChartList(props: ChartListProps) { fetchSelects: createFetchDatasets, paginate: true, }, + { + Header: t('Dashboards'), + key: 'dashboards', + id: 'dashboards', + input: 'select', + operator: FilterOperator.relationManyMany, + unfilteredLabel: t('All'), + fetchSelects: fetchDashboards, + paginate: true, + }, ...(userId ? [favoritesFilter] : []), { Header: t('Certified'), + key: 'certified', id: 'id', urlDisplay: 'certified', input: 'select', @@ -579,6 +675,7 @@ function ChartList(props: ChartListProps) { }, { Header: t('Search'), + key: 'search', id: 'slice_name', input: 'search', operator: FilterOperator.chartAllText, @@ -658,7 +755,7 @@ function ChartList(props: ChartListProps) { ), buttonStyle: 'primary', onClick: () => { - window.location.assign('/chart/add'); + history.push('/chart/add'); }, }); @@ -678,6 +775,7 @@ function ChartList(props: ChartListProps) { }); } } + return ( <> <SubMenu name={t('Charts')} buttons={subMenuButtons} /> diff --git a/superset-frontend/src/preamble.ts b/superset-frontend/src/preamble.ts index c088b10737aa..4d8e8ed0e736 100644 --- a/superset-frontend/src/preamble.ts +++ b/superset-frontend/src/preamble.ts @@ -25,45 +25,35 @@ import { merge } from 'lodash'; import setupClient from './setup/setupClient'; import setupColors from './setup/setupColors'; import setupFormatters from './setup/setupFormatters'; -import setupDashboardComponents from './setup/setupDasboardComponents'; -import { BootstrapUser, User } from './types/bootstrapTypes'; +import setupDashboardComponents from './setup/setupDashboardComponents'; +import { User } from './types/bootstrapTypes'; +import { initFeatureFlags } from './featureFlags'; +import getBootstrapData from './utils/getBootstrapData'; if (process.env.WEBPACK_MODE === 'development') { setHotLoaderConfig({ logLevel: 'debug', trackTailUpdates: false }); } // eslint-disable-next-line import/no-mutable-exports -export let bootstrapData: { - user?: BootstrapUser; - common?: any; - config?: any; - embedded?: { - dashboard_id: string; - }; -} = {}; +export const bootstrapData = getBootstrapData(); + // Configure translation if (typeof window !== 'undefined') { - const root = document.getElementById('app'); - bootstrapData = root - ? JSON.parse(root.getAttribute('data-bootstrap') || '{}') - : {}; - if (bootstrapData.common && bootstrapData.common.language_pack) { - const languagePack = bootstrapData.common.language_pack; - configure({ languagePack }); - moment.locale(bootstrapData.common.locale); - } else { - configure(); - } + configure({ languagePack: bootstrapData.common.language_pack }); + moment.locale(bootstrapData.common.locale); } else { configure(); } +// Configure feature flags +initFeatureFlags(bootstrapData.common.feature_flags); + // Setup SupersetClient setupClient(); setupColors( - bootstrapData?.common?.extra_categorical_color_schemes, - bootstrapData?.common?.extra_sequential_color_schemes, + bootstrapData.common.extra_categorical_color_schemes, + bootstrapData.common.extra_sequential_color_schemes, ); // Setup number formatters @@ -73,7 +63,7 @@ setupDashboardComponents(); export const theme = merge( supersetTheme, - bootstrapData?.common?.theme_overrides ?? {}, + bootstrapData.common.theme_overrides ?? {}, ); const getMe = makeApi<void, User>({ diff --git a/superset-frontend/src/profile/App.tsx b/superset-frontend/src/profile/App.tsx index 1f2cd144afcc..ed331ce73725 100644 --- a/superset-frontend/src/profile/App.tsx +++ b/superset-frontend/src/profile/App.tsx @@ -27,15 +27,15 @@ import App from 'src/profile/components/App'; import messageToastReducer from 'src/components/MessageToasts/reducers'; import { initEnhancer } from 'src/reduxUtils'; import setupApp from 'src/setup/setupApp'; +import setupExtensions from 'src/setup/setupExtensions'; import { theme } from 'src/preamble'; import ToastContainer from 'src/components/MessageToasts/ToastContainer'; +import getBootstrapData from 'src/utils/getBootstrapData'; setupApp(); +setupExtensions(); -const profileViewContainer = document.getElementById('app'); -const bootstrap = JSON.parse( - profileViewContainer?.getAttribute('data-bootstrap') ?? '{}', -); +const bootstrapData = getBootstrapData(); const store = createStore( combineReducers({ @@ -49,7 +49,7 @@ const Application = () => ( <Provider store={store}> <ThemeProvider theme={theme}> <GlobalStyles /> - <App user={bootstrap.user} /> + <App user={bootstrapData.user} /> <ToastContainer /> </ThemeProvider> </Provider> diff --git a/superset-frontend/src/profile/components/App.tsx b/superset-frontend/src/profile/components/App.tsx index e2c910abd2f5..08130176fe61 100644 --- a/superset-frontend/src/profile/components/App.tsx +++ b/superset-frontend/src/profile/components/App.tsx @@ -20,7 +20,7 @@ import React from 'react'; import { t, styled } from '@superset-ui/core'; import { Row, Col } from 'src/components'; import Tabs from 'src/components/Tabs'; -import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; +import { BootstrapUser } from 'src/types/bootstrapTypes'; import Favorites from './Favorites'; import UserInfo from './UserInfo'; import Security from './Security'; @@ -28,7 +28,7 @@ import RecentActivity from './RecentActivity'; import CreatedContent from './CreatedContent'; interface AppProps { - user: UserWithPermissionsAndRoles; + user: BootstrapUser; } const StyledTabPane = styled(Tabs.TabPane)` diff --git a/superset-frontend/src/profile/components/CreatedContent.tsx b/superset-frontend/src/profile/components/CreatedContent.tsx index 61dfb418f09c..a972ea5db90f 100644 --- a/superset-frontend/src/profile/components/CreatedContent.tsx +++ b/superset-frontend/src/profile/components/CreatedContent.tsx @@ -18,30 +18,45 @@ */ import rison from 'rison'; import React from 'react'; -import moment from 'moment'; import { t } from '@superset-ui/core'; -import TableLoader from '../../components/TableLoader'; -import { Slice } from '../types'; -import { User, DashboardResponse } from '../../types/bootstrapTypes'; +import TableLoader from 'src/components/TableLoader'; +import { + BootstrapUser, + ChartResponse, + DashboardResponse, +} from 'src/types/bootstrapTypes'; interface CreatedContentProps { - user: User; + user: BootstrapUser; } class CreatedContent extends React.PureComponent<CreatedContentProps> { renderSliceTable() { - const mutator = (data: Slice[]) => - data.map(slice => ({ - slice: <a href={slice.url}>{slice.title}</a>, - created: moment.utc(slice.dttm).fromNow(), - _created: slice.dttm, + const search = [ + { col: 'created_by', opr: 'chart_created_by_me', value: 'me' }, + ]; + const query = rison.encode({ + keys: ['none'], + columns: ['created_on_delta_humanized', 'slice_name', 'url'], + filters: search, + order_column: 'changed_on_delta_humanized', + order_direction: 'desc', + page: 0, + page_size: 100, + }); + + const mutator = (data: ChartResponse) => + data.result.map(chart => ({ + chart: <a href={chart.url}>{chart.slice_name}</a>, + created: chart.created_on_delta_humanized, + _created: chart.created_on_delta_humanized, })); return ( <TableLoader - dataEndpoint={`/superset/created_slices/${this.props.user.userId}/`} + dataEndpoint={`/api/v1/chart/?q=${query}`} className="table-condensed" - columns={['slice', 'created']} + columns={['chart', 'created']} mutator={mutator} noDataText={t('No charts')} sortable @@ -50,7 +65,9 @@ class CreatedContent extends React.PureComponent<CreatedContentProps> { } renderDashboardTable() { - const search = [{ col: 'created_by', opr: 'created_by_me', value: 'me' }]; + const search = [ + { col: 'created_by', opr: 'dashboard_created_by_me', value: 'me' }, + ]; const query = rison.encode({ keys: ['none'], columns: ['created_on_delta_humanized', 'dashboard_title', 'url'], diff --git a/superset-frontend/src/profile/components/Favorites.tsx b/superset-frontend/src/profile/components/Favorites.tsx index 1a7daa750f06..1e28cd989aab 100644 --- a/superset-frontend/src/profile/components/Favorites.tsx +++ b/superset-frontend/src/profile/components/Favorites.tsx @@ -20,13 +20,12 @@ import React from 'react'; import rison from 'rison'; import moment from 'moment'; import { t } from '@superset-ui/core'; - +import { DashboardResponse, BootstrapUser } from 'src/types/bootstrapTypes'; import TableLoader from '../../components/TableLoader'; import { Slice } from '../types'; -import { User, DashboardResponse } from '../../types/bootstrapTypes'; interface FavoritesProps { - user: User; + user: BootstrapUser; } export default class Favorites extends React.PureComponent<FavoritesProps> { @@ -40,7 +39,7 @@ export default class Favorites extends React.PureComponent<FavoritesProps> { })); return ( <TableLoader - dataEndpoint={`/superset/fave_slices/${this.props.user.userId}/`} + dataEndpoint={`/superset/fave_slices/${this.props.user?.userId}/`} className="table-condensed" columns={['slice', 'creator', 'favorited']} mutator={mutator} diff --git a/superset-frontend/src/profile/components/RecentActivity.tsx b/superset-frontend/src/profile/components/RecentActivity.tsx index d1bb83866b5c..975d8cb3ddf3 100644 --- a/superset-frontend/src/profile/components/RecentActivity.tsx +++ b/superset-frontend/src/profile/components/RecentActivity.tsx @@ -18,19 +18,21 @@ */ import React from 'react'; import moment from 'moment'; +import { t } from '@superset-ui/core'; +import rison from 'rison'; import TableLoader from '../../components/TableLoader'; -import { Activity } from '../types'; -import { User } from '../../types/bootstrapTypes'; +import { ActivityResult } from '../types'; +import { BootstrapUser } from '../../types/bootstrapTypes'; interface RecentActivityProps { - user: User; + user: BootstrapUser; } export default function RecentActivity({ user }: RecentActivityProps) { const rowLimit = 50; - const mutator = function (data: Activity[]) { - return data + const mutator = function (data: ActivityResult) { + return data.result .filter(row => row.action === 'dashboard' || row.action === 'explore') .map(row => ({ name: <a href={row.item_url}>{row.item_title}</a>, @@ -39,13 +41,15 @@ export default function RecentActivity({ user }: RecentActivityProps) { _time: row.time, })); }; + const params = rison.encode({ page_size: rowLimit }); return ( <div> <TableLoader className="table-condensed" mutator={mutator} sortable - dataEndpoint={`/superset/recent_activity/${user.userId}/?limit=${rowLimit}`} + dataEndpoint={`/api/v1/log/recent_activity/${user?.userId}/?q=${params}`} + noDataText={t('No Data')} /> </div> ); diff --git a/superset-frontend/src/profile/components/Security.tsx b/superset-frontend/src/profile/components/Security.tsx index 078fc42e4c74..a102e5599287 100644 --- a/superset-frontend/src/profile/components/Security.tsx +++ b/superset-frontend/src/profile/components/Security.tsx @@ -21,10 +21,10 @@ import Badge from 'src/components/Badge'; import { t } from '@superset-ui/core'; import Label from 'src/components/Label'; -import { UserWithPermissionsAndRoles } from '../../types/bootstrapTypes'; +import { BootstrapUser } from 'src/types/bootstrapTypes'; interface SecurityProps { - user: UserWithPermissionsAndRoles; + user: BootstrapUser; } export default function Security({ user }: SecurityProps) { @@ -32,15 +32,16 @@ export default function Security({ user }: SecurityProps) { <div> <div className="roles"> <h4> - {t('Roles')} <Badge count={Object.keys(user.roles).length} showZero /> + {t('Roles')}{' '} + <Badge count={Object.keys(user?.roles || {}).length} showZero /> </h4> - {Object.keys(user.roles).map(role => ( + {Object.keys(user?.roles || {}).map(role => ( <Label key={role}>{role}</Label> ))} <hr /> </div> <div className="databases"> - {user.permissions.database_access && ( + {user?.permissions.database_access && ( <div> <h4> {t('Databases')}{' '} @@ -54,7 +55,7 @@ export default function Security({ user }: SecurityProps) { )} </div> <div className="datasources"> - {user.permissions.datasource_access && ( + {user?.permissions.datasource_access && ( <div> <h4> {t('Datasets')}{' '} diff --git a/superset-frontend/src/profile/components/UserInfo.tsx b/superset-frontend/src/profile/components/UserInfo.tsx index 887b4ec50c13..b79f1fb97cb6 100644 --- a/superset-frontend/src/profile/components/UserInfo.tsx +++ b/superset-frontend/src/profile/components/UserInfo.tsx @@ -20,10 +20,10 @@ import React from 'react'; import Gravatar from 'react-gravatar'; import moment from 'moment'; import { t, styled } from '@superset-ui/core'; -import { UserWithPermissionsAndRoles } from '../../types/bootstrapTypes'; +import { BootstrapUser } from 'src/types/bootstrapTypes'; interface UserInfoProps { - user: UserWithPermissionsAndRoles; + user: BootstrapUser; } const StyledContainer = styled.div` @@ -37,7 +37,7 @@ export default function UserInfo({ user }: UserInfoProps) { <StyledContainer> <a href="https://en.gravatar.com/"> <Gravatar - email={user.email} + email={user?.email} width="100%" height="" size={220} @@ -51,29 +51,30 @@ export default function UserInfo({ user }: UserInfoProps) { <div className="header"> <h3> <strong> - {user.firstName} {user.lastName} + {user?.firstName} {user?.lastName} </strong> </h3> <h4 className="username"> - <i className="fa fa-user-o" /> {user.username} + <i className="fa fa-user-o" /> {user?.username} </h4> </div> <hr /> <p> <i className="fa fa-clock-o" data-test="clock-icon-test" />{' '} - {t('joined')} {moment(user.createdOn, 'YYYYMMDD').fromNow()} + {t('joined')} {moment(user?.createdOn, 'YYYYMMDD').fromNow()} </p> <p className="email"> - <i className="fa fa-envelope-o" /> {user.email} + <i className="fa fa-envelope-o" /> {user?.email} </p> <p className="roles"> - <i className="fa fa-lock" /> {Object.keys(user.roles).join(', ')} + <i className="fa fa-lock" />{' '} + {Object.keys(user?.roles || {}).join(', ')} </p> <p> <i className="fa fa-key" />   - <span className="text-muted">{t('id:')}</span>  - <span className="user-id">{user.userId}</span> + <span className="text-muted">{t('id')}:</span>  + <span className="user-id">{user?.userId}</span> </p> </div> </StyledContainer> diff --git a/superset-frontend/src/profile/types.ts b/superset-frontend/src/profile/types.ts index a2433e0827eb..29ca01605fb2 100644 --- a/superset-frontend/src/profile/types.ts +++ b/superset-frontend/src/profile/types.ts @@ -32,3 +32,7 @@ export type Activity = { item_url: string; time: number; }; + +export type ActivityResult = { + result: Activity[]; +}; diff --git a/superset-frontend/src/reduxUtils.ts b/superset-frontend/src/reduxUtils.ts index 245abc23e540..8e744b48dc14 100644 --- a/superset-frontend/src/reduxUtils.ts +++ b/superset-frontend/src/reduxUtils.ts @@ -19,7 +19,15 @@ import shortid from 'shortid'; import { compose } from 'redux'; import persistState, { StorageAdapter } from 'redux-localstorage'; -import { isEqual, omitBy, isUndefined, isNull } from 'lodash'; +import { + isEqual, + omitBy, + omit, + isUndefined, + isNull, + isEqualWith, +} from 'lodash'; +import { ensureIsArray } from '@superset-ui/core'; export function addToObject( state: Record<string, any>, @@ -136,10 +144,11 @@ export function extendArr( export function initEnhancer( persist = true, persistConfig: { paths?: StorageAdapter<unknown>; config?: string } = {}, + disableDebugger = false, ) { const { paths, config } = persistConfig; const composeEnhancers = - process.env.WEBPACK_MODE === 'development' + process.env.WEBPACK_MODE === 'development' && disableDebugger !== true ? /* eslint-disable-next-line no-underscore-dangle, dot-notation */ window['__REDUX_DEVTOOLS_EXTENSION_COMPOSE__'] ? /* eslint-disable-next-line no-underscore-dangle, dot-notation */ @@ -180,7 +189,8 @@ export function areObjectsEqual( opts: { ignoreUndefined?: boolean; ignoreNull?: boolean; - } = { ignoreUndefined: false, ignoreNull: false }, + ignoreFields?: string[]; + } = { ignoreUndefined: false, ignoreNull: false, ignoreFields: [] }, ) { let comp1 = obj1; let comp2 = obj2; @@ -192,5 +202,14 @@ export function areObjectsEqual( comp1 = omitBy(comp1, isNull); comp2 = omitBy(comp2, isNull); } + if (opts.ignoreFields?.length) { + const ignoreFields = ensureIsArray(opts.ignoreFields); + return isEqualWith(comp1, comp2, (val1, val2) => + isEqual( + ensureIsArray(val1).map(value => omit(value, ignoreFields)), + ensureIsArray(val2).map(value => omit(value, ignoreFields)), + ), + ); + } return isEqual(comp1, comp2); } diff --git a/superset-frontend/src/reports/actions/reports.js b/superset-frontend/src/reports/actions/reports.js index 6fbd8ca4ec0f..96a435ec5da3 100644 --- a/superset-frontend/src/reports/actions/reports.js +++ b/superset-frontend/src/reports/actions/reports.js @@ -23,6 +23,7 @@ import { addDangerToast, addSuccessToast, } from 'src/components/MessageToasts/actions'; +import { isEmpty } from 'lodash'; export const SET_REPORT = 'SET_REPORT'; export function setReport(report, resourceId, creationMethod, filterField) { @@ -76,7 +77,7 @@ export function fetchUISpecificReport({ const structureFetchAction = (dispatch, getState) => { const state = getState(); const { user, dashboardInfo, charts, explore } = state; - if (dashboardInfo) { + if (!isEmpty(dashboardInfo)) { dispatch( fetchUISpecificReport({ userId: user.userId, @@ -89,7 +90,7 @@ const structureFetchAction = (dispatch, getState) => { const [chartArr] = Object.keys(charts); dispatch( fetchUISpecificReport({ - userId: explore.user.userId, + userId: explore.user?.userId || user?.userId, filterField: 'chart_id', creationMethod: 'charts', resourceId: charts[chartArr].id, diff --git a/superset-frontend/src/setup/setupApp.ts b/superset-frontend/src/setup/setupApp.ts index ba3b9ac96143..227aad3a6863 100644 --- a/superset-frontend/src/setup/setupApp.ts +++ b/superset-frontend/src/setup/setupApp.ts @@ -52,7 +52,7 @@ function toggleCheckbox(apiUrlPrefix: string, selector: string) { .then(() => undefined) .catch(response => getClientErrorObject(response).then(parsedResp => { - if (parsedResp && parsedResp.message) { + if (parsedResp?.message) { showApiMessage(parsedResp); } }), diff --git a/superset-frontend/src/setup/setupClient.ts b/superset-frontend/src/setup/setupClient.ts index 8802ae47227d..80ce6b54bb8c 100644 --- a/superset-frontend/src/setup/setupClient.ts +++ b/superset-frontend/src/setup/setupClient.ts @@ -30,7 +30,7 @@ function getDefaultConfiguration(): ClientConfig { protocol: ['http:', 'https:'].includes(window?.location?.protocol) ? (window?.location?.protocol as 'http:' | 'https:') : undefined, - host: (window.location && window.location.host) || '', + host: window.location?.host || '', csrfToken: csrfToken || cookieCSRFToken, }; } diff --git a/superset-frontend/src/setup/setupDasboardComponents.ts b/superset-frontend/src/setup/setupDashboardComponents.ts similarity index 100% rename from superset-frontend/src/setup/setupDasboardComponents.ts rename to superset-frontend/src/setup/setupDashboardComponents.ts diff --git a/superset-frontend/cypress-base/cypress/integration/alerts_and_reports/alert_report.helper.ts b/superset-frontend/src/setup/setupExtensions.ts similarity index 88% rename from superset-frontend/cypress-base/cypress/integration/alerts_and_reports/alert_report.helper.ts rename to superset-frontend/src/setup/setupExtensions.ts index dcf8b2b4a293..88a9cf105929 100644 --- a/superset-frontend/cypress-base/cypress/integration/alerts_and_reports/alert_report.helper.ts +++ b/superset-frontend/src/setup/setupExtensions.ts @@ -16,5 +16,6 @@ * specific language governing permissions and limitations * under the License. */ -export const ALERT_LIST = '/alert/list/'; -export const REPORT_LIST = '/report/list/'; + +// For individual deployments to add custom overrides +export default function setupExtensions() {} diff --git a/superset-frontend/src/showSavedQuery/index.jsx b/superset-frontend/src/showSavedQuery/index.jsx index 6b8adcd60d7a..10c09703f720 100644 --- a/superset-frontend/src/showSavedQuery/index.jsx +++ b/superset-frontend/src/showSavedQuery/index.jsx @@ -21,11 +21,10 @@ import ReactDom from 'react-dom'; import Form from 'react-jsonschema-form'; import { interpolate } from 'src/showSavedQuery/utils'; import { styled } from '@superset-ui/core'; +import getBootstrapData from 'src/utils/getBootstrapData'; const scheduleInfoContainer = document.getElementById('schedule-info'); -const bootstrapData = JSON.parse( - scheduleInfoContainer.getAttribute('data-bootstrap'), -); +const bootstrapData = getBootstrapData(); const config = bootstrapData.common.conf.SCHEDULED_QUERIES; const { query } = bootstrapData.common; const scheduleInfo = query.extra_json.schedule_info; diff --git a/superset-frontend/src/types/Chart.ts b/superset-frontend/src/types/Chart.ts index cf4a64b6baa6..76ec04f60b7a 100644 --- a/superset-frontend/src/types/Chart.ts +++ b/superset-frontend/src/types/Chart.ts @@ -24,6 +24,11 @@ import { QueryFormData } from '@superset-ui/core'; import Owner from './Owner'; +export type ChartLinkedDashboard = { + id: number; + dashboard_title: string; +}; + export interface Chart { id: number; url: string; @@ -39,11 +44,20 @@ export interface Chart { cache_timeout: number | null; thumbnail_url?: string; owners?: Owner[]; + last_saved_at?: string; + last_saved_by?: { + id: number; + first_name: string; + last_name: string; + }; datasource_name_text?: string; form_data: { viz_type: string; }; is_managed_externally: boolean; + + // TODO: Update API spec to describe `dashboards` key + dashboards: ChartLinkedDashboard[]; } export type Slice = { @@ -57,6 +71,7 @@ export type Slice = { form_data?: QueryFormData; query_context?: object; is_managed_externally: boolean; + owners?: number[]; }; export default Chart; diff --git a/superset-frontend/cypress-base/cypress/integration/database/helper.ts b/superset-frontend/src/types/ChartSource.ts similarity index 91% rename from superset-frontend/cypress-base/cypress/integration/database/helper.ts rename to superset-frontend/src/types/ChartSource.ts index a339865e1fe6..6abc7d754c64 100644 --- a/superset-frontend/cypress-base/cypress/integration/database/helper.ts +++ b/superset-frontend/src/types/ChartSource.ts @@ -16,4 +16,8 @@ * specific language governing permissions and limitations * under the License. */ -export const DATABASE_LIST = '/databaseview/list'; + +export enum ChartSource { + Explore = 'explore', + Dashboard = 'dashboard', +} diff --git a/superset-frontend/src/types/Dashboard.ts b/superset-frontend/src/types/Dashboard.ts index 96a92d567f12..faecc0bc4acf 100644 --- a/superset-frontend/src/types/Dashboard.ts +++ b/superset-frontend/src/types/Dashboard.ts @@ -36,5 +36,3 @@ export interface Dashboard { owners: Owner[]; roles: Role[]; } - -export default Dashboard; diff --git a/superset-frontend/src/types/DashboardContextForExplore.ts b/superset-frontend/src/types/DashboardContextForExplore.ts new file mode 100644 index 000000000000..b69ec3ca7f0e --- /dev/null +++ b/superset-frontend/src/types/DashboardContextForExplore.ts @@ -0,0 +1,43 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { + DataMaskStateWithId, + DataRecordValue, + PartialFilters, +} from '@superset-ui/core'; +import { ChartConfiguration } from 'src/dashboard/reducers/types'; + +export interface DashboardContextForExplore { + labelColors: Record<string, string>; + sharedLabelColors: Record<string, string>; + colorScheme: string; + chartConfiguration: ChartConfiguration; + nativeFilters: PartialFilters; + dataMask: DataMaskStateWithId; + dashboardId: number; + filterBoxFilters: + | { + [key: string]: { + scope: number[]; + values: DataRecordValue[]; + }; + } + | {}; + isRedundant?: boolean; +} diff --git a/superset-frontend/src/types/Database.ts b/superset-frontend/src/types/Database.ts index 02c9347215d4..c4491dbb9943 100644 --- a/superset-frontend/src/types/Database.ts +++ b/superset-frontend/src/types/Database.ts @@ -21,9 +21,10 @@ export default interface Database { id: number; allow_run_async: boolean; database_name: string; - encrypted_extra: string; + masked_encrypted_extra: string; extra: string; impersonate_user: boolean; server_cert: string; sqlalchemy_uri: string; + catalog: object; } diff --git a/superset-frontend/src/types/bootstrapTypes.ts b/superset-frontend/src/types/bootstrapTypes.ts index a6c1a32440b1..f51ec3261087 100644 --- a/superset-frontend/src/types/bootstrapTypes.ts +++ b/superset-frontend/src/types/bootstrapTypes.ts @@ -1,5 +1,14 @@ -import { JsonObject, Locale } from '@superset-ui/core'; +import { + ColorSchemeConfig, + FeatureFlagMap, + JsonObject, + LanguagePack, + Locale, + SequentialSchemeConfig, +} from '@superset-ui/core'; import { isPlainObject } from 'lodash'; +import { FlashMessage } from '../components/FlashProvider'; +import { Languages } from '../views/components/LanguagePicker'; /** * Licensed to the Apache Software Foundation (ASF) under one @@ -64,11 +73,93 @@ export type DashboardResponse = { result: DashboardData[]; }; +export type ChartData = { + slice_name: string; + created_on_delta_humanized?: string; + url: string; +}; + +export type ChartResponse = { + result: ChartData[]; +}; + +export interface BrandProps { + path: string; + icon: string; + alt: string; + tooltip: string; + text: string; +} + +export interface NavBarProps { + show_watermark: boolean; + bug_report_url?: string; + bug_report_text?: string; + bug_report_icon?: string; + version_string?: string; + version_sha?: string; + build_number?: string; + documentation_url?: string; + documentation_text?: string; + documentation_icon?: string; + languages: Languages; + show_language_picker: boolean; + user_is_anonymous: boolean; + user_info_url: string; + user_login_url: string; + user_logout_url: string; + user_profile_url: string | null; + locale: string; +} + +export interface MenuObjectChildProps { + label: string; + name?: string; + icon?: string; + index?: number; + url?: string; + isFrontendRoute?: boolean; + perm?: string | boolean; + view?: string; + disable?: boolean; +} + +export interface MenuObjectProps extends MenuObjectChildProps { + childs?: (MenuObjectChildProps | string)[]; + isHeader?: boolean; +} + +export interface MenuData { + menu: MenuObjectProps[]; + brand: BrandProps; + navbar_right: NavBarProps; + settings: MenuObjectProps[]; + environment_tag: { + text: string; + color: string; + }; +} export interface CommonBootstrapData { - flash_messages: string[][]; + flash_messages: FlashMessage[]; conf: JsonObject; locale: Locale; - feature_flags: Record<string, boolean>; + feature_flags: FeatureFlagMap; + language_pack: LanguagePack; + extra_categorical_color_schemes: ColorSchemeConfig[]; + extra_sequential_color_schemes: SequentialSchemeConfig[]; + theme_overrides: JsonObject; + menu_data: MenuData; + datahub_url: String; + advanced_data_types: Record<string, any>[]; +} + +export interface BootstrapData { + user?: BootstrapUser; + common: CommonBootstrapData; + config?: any; + embedded?: { + dashboard_id: string; + }; } export function isUser(user: any): user is User { diff --git a/superset-frontend/src/types/files.d.ts b/superset-frontend/src/types/files.d.ts index c694d13cfbf2..c4f304b57f63 100644 --- a/superset-frontend/src/types/files.d.ts +++ b/superset-frontend/src/types/files.d.ts @@ -18,3 +18,4 @@ */ declare module '*.svg'; +declare module '*.gif'; diff --git a/superset-frontend/src/utils/DebouncedMessageQueue.js b/superset-frontend/src/utils/DebouncedMessageQueue.js index 031963dda01e..6fd6c5b77804 100644 --- a/superset-frontend/src/utils/DebouncedMessageQueue.js +++ b/superset-frontend/src/utils/DebouncedMessageQueue.js @@ -26,9 +26,9 @@ class DebouncedMessageQueue { }) { this.queue = []; this.sizeThreshold = sizeThreshold; - this.delayThrehold = delayThreshold; + this.delayThreshold = delayThreshold; - this.trigger = debounce(this.trigger.bind(this), this.delayThrehold); + this.trigger = debounce(this.trigger.bind(this), this.delayThreshold); this.callback = callback; } diff --git a/superset-frontend/src/utils/common.js b/superset-frontend/src/utils/common.js index 400a7d05e010..4bc702d44758 100644 --- a/superset-frontend/src/utils/common.js +++ b/superset-frontend/src/utils/common.js @@ -36,17 +36,6 @@ export const SHORT_TIME = 'h:m a'; const DATETIME_FORMATTER = getTimeFormatter(TimeFormats.DATABASE_DATETIME); -export function getParamFromQuery(query, param) { - const vars = query.split('&'); - for (let i = 0; i < vars.length; i += 1) { - const pair = vars[i].split('='); - if (decodeURIComponent(pair[0]) === param) { - return decodeURIComponent(pair[1]); - } - } - return null; -} - export function storeQuery(query) { return SupersetClient.post({ endpoint: '/kv/store/', @@ -66,10 +55,10 @@ export function optionLabel(opt) { return EMPTY_STRING; } if (opt === true) { - return '<true>'; + return TRUE_STRING; } if (opt === false) { - return '<false>'; + return FALSE_STRING; } if (typeof opt !== 'string' && opt.toString) { return opt.toString(); @@ -150,5 +139,3 @@ export const isSafari = () => { return userAgent && /^((?!chrome|android).)*safari/i.test(userAgent); }; - -export const isNullish = value => value === null || value === undefined; diff --git a/superset-frontend/src/utils/common.test.jsx b/superset-frontend/src/utils/common.test.jsx index 571e493addbf..59cba6e7b2d0 100644 --- a/superset-frontend/src/utils/common.test.jsx +++ b/superset-frontend/src/utils/common.test.jsx @@ -21,6 +21,8 @@ import { optionFromValue, prepareCopyToClipboardTabularData, NULL_STRING, + TRUE_STRING, + FALSE_STRING, } from 'src/utils/common'; describe('utils/common', () => { @@ -28,9 +30,12 @@ describe('utils/common', () => { it('converts values as expected', () => { expect(optionFromValue(false)).toEqual({ value: false, - label: '<false>', + label: FALSE_STRING, + }); + expect(optionFromValue(true)).toEqual({ + value: true, + label: TRUE_STRING, }); - expect(optionFromValue(true)).toEqual({ value: true, label: '<true>' }); expect(optionFromValue(null)).toEqual({ value: NULL_STRING, label: NULL_STRING, diff --git a/superset-frontend/src/utils/datasourceUtils.js b/superset-frontend/src/utils/datasourceUtils.js new file mode 100644 index 000000000000..1a5924b3e6c4 --- /dev/null +++ b/superset-frontend/src/utils/datasourceUtils.js @@ -0,0 +1,25 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +export const getDatasourceAsSaveableDataset = source => ({ + columns: source.columns, + name: source?.datasource_name || source?.name || 'Untitled', + dbId: source?.database?.id || source?.dbId, + sql: source?.sql || '', + schema: source?.schema, +}); diff --git a/superset-frontend/src/utils/downloadAsImage.ts b/superset-frontend/src/utils/downloadAsImage.ts index 145fb86508ac..de7454364637 100644 --- a/superset-frontend/src/utils/downloadAsImage.ts +++ b/superset-frontend/src/utils/downloadAsImage.ts @@ -19,15 +19,9 @@ import { SyntheticEvent } from 'react'; import domToImage from 'dom-to-image-more'; import kebabCase from 'lodash/kebabCase'; -import { t } from '@superset-ui/core'; +import { t, supersetTheme } from '@superset-ui/core'; import { addWarningToast } from 'src/components/MessageToasts/actions'; -/** - * @remark - * same as https://github.com/apache/superset/blob/c53bc4ddf9808a8bb6916bbe3cb31935d33a2420/superset-frontend/src/assets/stylesheets/less/variables.less#L34 - */ -const GRAY_BACKGROUND_COLOR = '#F5F5F5'; - /** * generate a consistent file stem from a description and date * @@ -77,7 +71,7 @@ export default function downloadAsImage( return domToImage .toJpeg(elementToPrint, { quality: 0.95, - bgcolor: GRAY_BACKGROUND_COLOR, + bgcolor: supersetTheme.colors.grayscale.light4, filter, }) .then(dataUrl => { diff --git a/superset-frontend/src/utils/findPermission.test.ts b/superset-frontend/src/utils/findPermission.test.ts new file mode 100644 index 000000000000..4dadb3a4ed28 --- /dev/null +++ b/superset-frontend/src/utils/findPermission.test.ts @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { findPermission } from './findPermission'; + +test('findPermission for single role', () => { + expect(findPermission('abc', 'def', { role: [['abc', 'def']] })).toEqual( + true, + ); + + expect(findPermission('abc', 'def', { role: [['abc', 'de']] })).toEqual( + false, + ); + + expect(findPermission('abc', 'def', { role: [] })).toEqual(false); +}); + +test('findPermission for multiple roles', () => { + expect( + findPermission('abc', 'def', { + role1: [ + ['ccc', 'aaa'], + ['abc', 'def'], + ], + role2: [['abc', 'def']], + }), + ).toEqual(true); + + expect( + findPermission('abc', 'def', { + role1: [['abc', 'def']], + role2: [['abc', 'dd']], + }), + ).toEqual(true); + + expect( + findPermission('abc', 'def', { + role1: [['ccc', 'aaa']], + role2: [['aaa', 'ddd']], + }), + ).toEqual(false); + + expect(findPermission('abc', 'def', { role1: [], role2: [] })).toEqual(false); +}); + +test('handles nonexistent roles', () => { + expect(findPermission('abc', 'def', null)).toEqual(false); +}); diff --git a/superset-frontend/src/utils/findPermission.ts b/superset-frontend/src/utils/findPermission.ts new file mode 100644 index 000000000000..69c45be5a075 --- /dev/null +++ b/superset-frontend/src/utils/findPermission.ts @@ -0,0 +1,28 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import memoizeOne from 'memoize-one'; +import { UserRoles } from 'src/types/bootstrapTypes'; + +export const findPermission = memoizeOne( + (perm: string, view: string, roles?: UserRoles | null) => + !!roles && + Object.values(roles).some(permissions => + permissions.some(([perm_, view_]) => perm_ === perm && view_ === view), + ), +); diff --git a/superset-frontend/src/utils/getBootstrapData.ts b/superset-frontend/src/utils/getBootstrapData.ts new file mode 100644 index 000000000000..e426498e5738 --- /dev/null +++ b/superset-frontend/src/utils/getBootstrapData.ts @@ -0,0 +1,27 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { BootstrapData } from 'src/types/bootstrapTypes'; +import { DEFAULT_BOOTSTRAP_DATA } from 'src/constants'; + +export default function getBootstrapData(): BootstrapData { + const appContainer = document.getElementById('app'); + const dataBootstrap = appContainer?.getAttribute('data-bootstrap'); + return dataBootstrap ? JSON.parse(dataBootstrap) : DEFAULT_BOOTSTRAP_DATA; +} diff --git a/superset-frontend/src/utils/getChartRequiredFieldsMissingMessage.ts b/superset-frontend/src/utils/getChartRequiredFieldsMissingMessage.ts index ac11e8503dc2..865452ade825 100644 --- a/superset-frontend/src/utils/getChartRequiredFieldsMissingMessage.ts +++ b/superset-frontend/src/utils/getChartRequiredFieldsMissingMessage.ts @@ -19,8 +19,11 @@ import { t } from '@superset-ui/core'; +const CREATE_CHART_TEXT = t('Create chart'); +const UPDATE_CHART_TEXT = t('Update chart'); + export const getChartRequiredFieldsMissingMessage = (isCreating: boolean) => t( 'Select values in highlighted field(s) in the control panel. Then run the query by clicking on the %s button.', - isCreating ? '"Create chart"' : '"Update chart"', + `"${isCreating ? CREATE_CHART_TEXT : UPDATE_CHART_TEXT}"`, ); diff --git a/superset-frontend/src/utils/getClientErrorObject.ts b/superset-frontend/src/utils/getClientErrorObject.ts index 3451528f025c..a5f2871872b3 100644 --- a/superset-frontend/src/utils/getClientErrorObject.ts +++ b/superset-frontend/src/utils/getClientErrorObject.ts @@ -41,6 +41,14 @@ interface TimeoutError { timeout: number; } +type ErrorType = + | SupersetClientResponse + | TimeoutError + | { response: Response } + | string; + +type ErrorTextSource = 'dashboard' | 'chart' | 'query' | 'dataset' | 'database'; + export function parseErrorJson(responseObject: JsonObject): ClientErrorObject { let error = { ...responseObject }; // Backwards compatibility for old error renderers with the new error object @@ -48,12 +56,17 @@ export function parseErrorJson(responseObject: JsonObject): ClientErrorObject { error.error = error.description = error.errors[0].message; error.link = error.errors[0]?.extra?.link; } - // Marshmallow field validation returns the error mssage in the format + // Marshmallow field validation returns the error message in the format // of { message: { field1: [msg1, msg2], field2: [msg], } } - if (error.message && typeof error.message === 'object' && !error.error) { - error.error = - Object.values(error.message as Record<string, string[]>)[0]?.[0] || - t('Invalid input'); + if (!error.error && error.message) { + if (typeof error.message === 'object') { + error.error = + Object.values(error.message as Record<string, string[]>)[0]?.[0] || + t('Invalid input'); + } + if (typeof error.message === 'string') { + error.error = error.message; + } } if (error.stack) { error = { @@ -73,6 +86,29 @@ export function parseErrorJson(responseObject: JsonObject): ClientErrorObject { return { ...error, error: error.error }; // explicit ClientErrorObject } +/* + * Utility to get standardized error text for generic update failures + */ +export async function getErrorText( + errorObject: ErrorType, + source: ErrorTextSource, +) { + const { error, message } = await getClientErrorObject(errorObject); + let errorText = t('Sorry, an unknown error occurred.'); + + if (error) { + errorText = t( + 'Sorry, there was an error saving this %s: %s', + source, + error, + ); + } + if (typeof message === 'string' && message === 'Forbidden') { + errorText = t('You do not have permission to edit this %s', source); + } + return errorText; +} + export function getClientErrorObject( response: | SupersetClientResponse @@ -166,3 +202,15 @@ export function getClientErrorObject( }); }); } + +export function getClientErrorMessage( + message: string, + clientError?: ClientErrorObject, +) { + let finalMessage = message; + const errorMessage = clientError?.message || clientError?.error; + if (errorMessage) { + finalMessage = `${finalMessage}:\n${errorMessage}`; + } + return finalMessage; +} diff --git a/superset-frontend/src/utils/getDatasourceUid.test.ts b/superset-frontend/src/utils/getDatasourceUid.test.ts new file mode 100644 index 000000000000..2d14fde26230 --- /dev/null +++ b/superset-frontend/src/utils/getDatasourceUid.test.ts @@ -0,0 +1,49 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { DatasourceType } from '@superset-ui/core'; +import { getDatasourceUid } from './getDatasourceUid'; + +const TEST_DATASOURCE = { + id: 2, + type: DatasourceType.Table, + columns: [], + metrics: [], + column_format: {}, + verbose_map: {}, + main_dttm_col: '__timestamp', + // eg. ['["ds", true]', 'ds [asc]'] + datasource_name: 'test datasource', + description: null, +}; + +const TEST_DATASOURCE_WITH_UID = { + ...TEST_DATASOURCE, + uid: 'dataset_uid', +}; + +test('creates uid from id and type when dataset does not have uid field', () => { + expect(getDatasourceUid(TEST_DATASOURCE)).toEqual('2__table'); +}); + +test('returns uid when dataset has uid field', () => { + expect(getDatasourceUid(TEST_DATASOURCE_WITH_UID)).toEqual( + TEST_DATASOURCE_WITH_UID.uid, + ); +}); diff --git a/superset-frontend/src/addSlice/index.tsx b/superset-frontend/src/utils/getDatasourceUid.ts similarity index 81% rename from superset-frontend/src/addSlice/index.tsx rename to superset-frontend/src/utils/getDatasourceUid.ts index c257009e64fd..b438d18ba7dc 100644 --- a/superset-frontend/src/addSlice/index.tsx +++ b/superset-frontend/src/utils/getDatasourceUid.ts @@ -16,8 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import React from 'react'; -import ReactDOM from 'react-dom'; -import App from './App'; +import { Dataset } from '@superset-ui/chart-controls'; -ReactDOM.render(<App />, document.getElementById('app')); +export const getDatasourceUid = (datasource: Dataset) => + datasource.uid ?? `${datasource.id ?? 'None'}__${datasource.type}`; diff --git a/superset-frontend/src/utils/hostNamesConfig.js b/superset-frontend/src/utils/hostNamesConfig.js index f2a1638cc775..2fda95c46ab6 100644 --- a/superset-frontend/src/utils/hostNamesConfig.js +++ b/superset-frontend/src/utils/hostNamesConfig.js @@ -21,6 +21,7 @@ import { isFeatureEnabled, FeatureFlag, } from 'src/featureFlags'; +import getBootstrapData from './getBootstrapData'; function getDomainsConfig() { const appContainer = document.getElementById('app'); @@ -38,11 +39,11 @@ function getDomainsConfig() { return Array.from(availableDomains); } - const bootstrapData = JSON.parse(appContainer.getAttribute('data-bootstrap')); + const bootstrapData = getBootstrapData(); // this module is a little special, it may be loaded before index.jsx, // where window.featureFlags get initialized // eslint-disable-next-line camelcase - initFeatureFlags(bootstrapData?.common?.feature_flags); + initFeatureFlags(bootstrapData.common.feature_flags); if ( isFeatureEnabled(FeatureFlag.ALLOW_DASHBOARD_DOMAIN_SHARDING) && diff --git a/superset-frontend/src/utils/isBot.ts b/superset-frontend/src/utils/isBot.ts new file mode 100644 index 000000000000..8509a43c85c9 --- /dev/null +++ b/superset-frontend/src/utils/isBot.ts @@ -0,0 +1,21 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// navigator.webdriver is true when browser is controlled by a bot +export const isCurrentUserBot = () => window?.navigator?.webdriver; diff --git a/superset-frontend/src/utils/isDashboardVirtualizationEnabled.ts b/superset-frontend/src/utils/isDashboardVirtualizationEnabled.ts new file mode 100644 index 000000000000..f27b8c849f3c --- /dev/null +++ b/superset-frontend/src/utils/isDashboardVirtualizationEnabled.ts @@ -0,0 +1,30 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export enum DASHBOARD_VIRTUALIZATION_MODE { + NONE = 'NONE', + VIEWPORT = 'VIEWPORT', + PAGINATED = 'PAGINATED', +} + +export const isDashboardVirtualizationEnabled = ( + virtualizationMode: DASHBOARD_VIRTUALIZATION_MODE, +) => + virtualizationMode === DASHBOARD_VIRTUALIZATION_MODE.VIEWPORT || + virtualizationMode === DASHBOARD_VIRTUALIZATION_MODE.PAGINATED; diff --git a/superset-frontend/src/utils/localStorageHelpers.ts b/superset-frontend/src/utils/localStorageHelpers.ts index 482f413372b6..3dceaba86ece 100644 --- a/superset-frontend/src/utils/localStorageHelpers.ts +++ b/superset-frontend/src/utils/localStorageHelpers.ts @@ -17,8 +17,8 @@ * under the License. */ -import { TableTabTypes } from 'src/views/CRUD/types'; -import { SetTabType } from 'src/views/CRUD/welcome/ActivityTable'; +import { TableTab } from 'src/views/CRUD/types'; +import { DashboardContextForExplore } from 'src/types/DashboardContextForExplore'; export enum LocalStorageKeys { /** @@ -31,6 +31,7 @@ export enum LocalStorageKeys { * and therefore should be done in a major release. */ filter_box_transition_snoozed_at = 'filter_box_transition_snoozed_at', + db = 'db', chart_split_sizes = 'chart_split_sizes', controls_width = 'controls_width', datasource_width = 'datasource_width', @@ -39,6 +40,7 @@ export enum LocalStorageKeys { homepage_dashboard_filter = 'homepage_dashboard_filter', homepage_collapse_state = 'homepage_collapse_state', homepage_activity_filter = 'homepage_activity_filter', + datasetname_set_successful = 'datasetname_set_successful', /** END LEGACY LOCAL STORAGE KEYS */ /** @@ -50,20 +52,28 @@ export enum LocalStorageKeys { */ sqllab__is_autocomplete_enabled = 'sqllab__is_autocomplete_enabled', explore__data_table_original_formatted_time_columns = 'explore__data_table_original_formatted_time_columns', + dashboard__custom_filter_bar_widths = 'dashboard__custom_filter_bar_widths', + dashboard__explore_context = 'dashboard__explore_context', + common__resizable_sidebar_widths = 'common__resizable_sidebar_widths', } export type LocalStorageValues = { filter_box_transition_snoozed_at: Record<number, number>; + db: object | null; chart_split_sizes: [number, number]; controls_width: number; datasource_width: number; is_datapanel_open: boolean; - homepage_chart_filter: TableTabTypes; - homepage_dashboard_filter: TableTabTypes; + homepage_chart_filter: TableTab; + homepage_dashboard_filter: TableTab; homepage_collapse_state: string[]; - homepage_activity_filter: SetTabType | null; + datasetname_set_successful: boolean; + homepage_activity_filter: TableTab | null; sqllab__is_autocomplete_enabled: boolean; explore__data_table_original_formatted_time_columns: Record<string, string[]>; + dashboard__custom_filter_bar_widths: Record<string, number>; + dashboard__explore_context: Record<string, DashboardContextForExplore>; + common__resizable_sidebar_widths: Record<string, number>; }; /* diff --git a/superset-frontend/src/utils/urlUtils.test.ts b/superset-frontend/src/utils/urlUtils.test.ts new file mode 100644 index 000000000000..19e2a470d182 --- /dev/null +++ b/superset-frontend/src/utils/urlUtils.test.ts @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { isUrlExternal, parseUrl } from './urlUtils'; + +test('isUrlExternal', () => { + expect(isUrlExternal('http://google.com')).toBeTruthy(); + expect(isUrlExternal('https://google.com')).toBeTruthy(); + expect(isUrlExternal('//google.com')).toBeTruthy(); + expect(isUrlExternal('google.com')).toBeTruthy(); + expect(isUrlExternal('www.google.com')).toBeTruthy(); + expect(isUrlExternal('mailto:mail@example.com')).toBeTruthy(); + + // treat all urls starting with protocol or hostname as external + // such urls are not handled well by react-router Link component + expect(isUrlExternal('http://localhost:8888/port')).toBeTruthy(); + expect(isUrlExternal('https://localhost/secure')).toBeTruthy(); + expect(isUrlExternal('http://localhost/about')).toBeTruthy(); + expect(isUrlExternal('HTTP://localhost/about')).toBeTruthy(); + expect(isUrlExternal('//localhost/about')).toBeTruthy(); + expect(isUrlExternal('localhost/about')).toBeTruthy(); + + expect(isUrlExternal('/about')).toBeFalsy(); + expect(isUrlExternal('#anchor')).toBeFalsy(); +}); + +test('parseUrl', () => { + expect(parseUrl('http://google.com')).toEqual('http://google.com'); + expect(parseUrl('//google.com')).toEqual('//google.com'); + expect(parseUrl('mailto:mail@example.com')).toEqual( + 'mailto:mail@example.com', + ); + expect(parseUrl('google.com')).toEqual('//google.com'); + expect(parseUrl('www.google.com')).toEqual('//www.google.com'); + + expect(parseUrl('/about')).toEqual('/about'); + expect(parseUrl('#anchor')).toEqual('#anchor'); +}); diff --git a/superset-frontend/src/utils/urlUtils.ts b/superset-frontend/src/utils/urlUtils.ts index bd570291f2cb..07c8ad550074 100644 --- a/superset-frontend/src/utils/urlUtils.ts +++ b/superset-frontend/src/utils/urlUtils.ts @@ -4,22 +4,26 @@ * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the - * 'License'); you may not use this file except in compliance + * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an - * 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ -import { JsonObject, QueryFormData, SupersetClient } from '@superset-ui/core'; +import { + isDefined, + JsonObject, + QueryFormData, + SupersetClient, +} from '@superset-ui/core'; import rison from 'rison'; import { isEmpty } from 'lodash'; -import { getClientErrorObject } from './getClientErrorObject'; import { RESERVED_CHART_URL_PARAMS, RESERVED_DASHBOARD_URL_PARAMS, @@ -53,10 +57,10 @@ export function getUrlParam({ name, type }: UrlParam): unknown { if (!urlParam) { return null; } - if (urlParam === 'true') { + if (urlParam.toLowerCase() === 'true') { return 1; } - if (urlParam === 'false') { + if (urlParam.toLowerCase() === 'false') { return 0; } if (!Number.isNaN(Number(urlParam))) { @@ -72,7 +76,7 @@ export function getUrlParam({ name, type }: UrlParam): unknown { if (!urlParam) { return null; } - return urlParam !== 'false' && urlParam !== '0'; + return urlParam.toLowerCase() !== 'false' && urlParam !== '0'; case 'rison': if (!urlParam) { return null; @@ -96,7 +100,7 @@ function getUrlParams(excludedParams: string[]): URLSearchParams { return urlParams; } -type UrlParamEntries = [string, string][]; +export type UrlParamEntries = [string, string][]; function getUrlParamEntries(urlParams: URLSearchParams): UrlParamEntries { const urlEntries: [string, string][] = []; @@ -134,14 +138,7 @@ function getPermalink(endpoint: string, jsonPayload: JsonObject) { return SupersetClient.post({ endpoint, jsonPayload, - }) - .then(result => result.json.url as string) - .catch(response => - // @ts-ignore - getClientErrorObject(response).then(({ error, statusText }) => - Promise.reject(error || statusText), - ), - ); + }).then(result => result.json.url as string); } export function getChartPermalink( @@ -156,17 +153,56 @@ export function getChartPermalink( export function getDashboardPermalink({ dashboardId, - filterState, - hash, // the anchor part of the link which corresponds to the tab/chart id + dataMask, + activeTabs, + anchor, // the anchor part of the link which corresponds to the tab/chart id }: { dashboardId: string | number; - filterState: JsonObject; - hash?: string; + /** + * Current applied data masks (for native filters). + */ + dataMask: JsonObject; + /** + * Current active tabs in the dashboard. + */ + activeTabs: string[]; + /** + * The "anchor" component for the permalink. It will be scrolled into view + * and highlighted upon page load. + */ + anchor?: string; }) { // only encode filter box state if non-empty return getPermalink(`/api/v1/dashboard/${dashboardId}/permalink`, { - filterState, urlParams: getDashboardUrlParams(), - hash, + dataMask, + activeTabs, + anchor, }); } + +const externalUrlRegex = + /^([^:/?#]+:)?(?:(\/\/)?([^/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/; + +// group 1 matches protocol +// group 2 matches '//' +// group 3 matches hostname +export function isUrlExternal(url: string) { + const match = url.match(externalUrlRegex) || []; + return ( + (typeof match[1] === 'string' && match[1].length > 0) || + match[2] === '//' || + (typeof match[3] === 'string' && match[3].length > 0) + ); +} + +export function parseUrl(url: string) { + const match = url.match(externalUrlRegex) || []; + // if url is external but start with protocol or '//', + // it can't be used correctly with <a> element + // in such case, add '//' prefix + if (isUrlExternal(url) && !isDefined(match[1]) && !url.startsWith('//')) { + return `//${url}`; + } + return url; +} diff --git a/superset-frontend/src/views/App.tsx b/superset-frontend/src/views/App.tsx index ecdbddbd5679..cacfaa145528 100644 --- a/superset-frontend/src/views/App.tsx +++ b/superset-frontend/src/views/App.tsx @@ -24,31 +24,41 @@ import { Route, useLocation, } from 'react-router-dom'; +import { bindActionCreators } from 'redux'; import { GlobalStyles } from 'src/GlobalStyles'; -import { initFeatureFlags } from 'src/featureFlags'; import ErrorBoundary from 'src/components/ErrorBoundary'; import Loading from 'src/components/Loading'; import Menu from 'src/views/components/Menu'; -import { bootstrapData } from 'src/preamble'; +import getBootstrapData from 'src/utils/getBootstrapData'; import ToastContainer from 'src/components/MessageToasts/ToastContainer'; import setupApp from 'src/setup/setupApp'; +import setupPlugins from 'src/setup/setupPlugins'; import { routes, isFrontendRoute } from 'src/views/routes'; -import { Logger } from 'src/logger/LogUtils'; +import { Logger, LOG_ACTIONS_SPA_NAVIGATION } from 'src/logger/LogUtils'; +import setupExtensions from 'src/setup/setupExtensions'; +import { logEvent } from 'src/logger/actions'; +import { store } from 'src/views/store'; import { RootContextProviders } from './RootContextProviders'; import { ScrollToTop } from './ScrollToTop'; +import QueryProvider from './QueryProvider'; setupApp(); +setupPlugins(); +setupExtensions(); + +const bootstrapData = getBootstrapData(); -const user = { ...bootstrapData.user }; -const menu = { - ...bootstrapData.common.menu_data, -}; let lastLocationPathname: string; -initFeatureFlags(bootstrapData.common.feature_flags); + +const boundActions = bindActionCreators({ logEvent }, store.dispatch); const LocationPathnameLogger = () => { const location = useLocation(); useEffect(() => { + // This will log client side route changes for single page app user navigation + boundActions.logEvent(LOG_ACTIONS_SPA_NAVIGATION, { + path: location.pathname, + }); // reset performance logger timer start point to avoid soft navigation // cause dashboard perf measurement problem if (lastLocationPathname && lastLocationPathname !== location.pathname) { @@ -60,26 +70,31 @@ const LocationPathnameLogger = () => { }; const App = () => ( - <Router> - <ScrollToTop /> - <LocationPathnameLogger /> - <RootContextProviders> - <GlobalStyles /> - <Menu data={menu} isFrontendRoute={isFrontendRoute} /> - <Switch> - {routes.map(({ path, Component, props = {}, Fallback = Loading }) => ( - <Route path={path} key={path}> - <Suspense fallback={<Fallback />}> - <ErrorBoundary> - <Component user={user} {...props} /> - </ErrorBoundary> - </Suspense> - </Route> - ))} - </Switch> - <ToastContainer /> - </RootContextProviders> - </Router> + <QueryProvider> + <Router> + <ScrollToTop /> + <LocationPathnameLogger /> + <RootContextProviders> + <GlobalStyles /> + <Menu + data={bootstrapData.common.menu_data} + isFrontendRoute={isFrontendRoute} + /> + <Switch> + {routes.map(({ path, Component, props = {}, Fallback = Loading }) => ( + <Route path={path} key={path}> + <Suspense fallback={<Fallback />}> + <ErrorBoundary> + <Component user={bootstrapData.user} {...props} /> + </ErrorBoundary> + </Suspense> + </Route> + ))} + </Switch> + <ToastContainer /> + </RootContextProviders> + </Router> + </QueryProvider> ); export default hot(App); diff --git a/superset-frontend/src/views/CRUD/alert/AlertList.test.jsx b/superset-frontend/src/views/CRUD/alert/AlertList.test.jsx index 5cf9483a526e..d5b4d241502c 100644 --- a/superset-frontend/src/views/CRUD/alert/AlertList.test.jsx +++ b/superset-frontend/src/views/CRUD/alert/AlertList.test.jsx @@ -55,7 +55,7 @@ const mockalerts = [...new Array(3)].map((_, i) => ({ last_eval_dttm: Date.now(), last_state: 'ok', name: `alert ${i} `, - owners: [], + owners: [{ id: 1 }], recipients: [ { id: `${i}`, @@ -67,6 +67,8 @@ const mockalerts = [...new Array(3)].map((_, i) => ({ const mockUser = { userId: 1, + firstName: 'user 1', + lastName: 'lastname', }; fetchMock.get(alertsEndpoint, { diff --git a/superset-frontend/src/views/CRUD/alert/AlertList.tsx b/superset-frontend/src/views/CRUD/alert/AlertList.tsx index a2fdb9110e7d..1c3416765246 100644 --- a/superset-frontend/src/views/CRUD/alert/AlertList.tsx +++ b/superset-frontend/src/views/CRUD/alert/AlertList.tsx @@ -19,7 +19,13 @@ import React, { useState, useMemo, useEffect, useCallback } from 'react'; import { useHistory } from 'react-router-dom'; -import { t, SupersetClient, makeApi, styled } from '@superset-ui/core'; +import { + t, + SupersetClient, + makeApi, + styled, + getExtensionsRegistry, +} from '@superset-ui/core'; import moment from 'moment'; import ActionsBar, { ActionProps } from 'src/components/ListView/ActionsBar'; import FacePile from 'src/components/FacePile'; @@ -44,9 +50,13 @@ import { useSingleViewResource, } from 'src/views/CRUD/hooks'; import { createErrorHandler, createFetchRelated } from 'src/views/CRUD/utils'; +import { isUserAdmin } from 'src/dashboard/util/permissionUtils'; +import Owner from 'src/types/Owner'; import AlertReportModal from './AlertReportModal'; import { AlertObject, AlertState } from './types'; +const extensionsRegistry = getExtensionsRegistry(); + const PAGE_SIZE = 25; const AlertStateLabel: Record<AlertState, string> = { @@ -80,6 +90,18 @@ const RefreshContainer = styled.div` background-color: ${({ theme }) => theme.colors.grayscale.light5}; `; +const StyledHeaderWithIcon = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + > *:first-child { + margin-right: ${({ theme }) => theme.gridUnit}px; + } +`; + +const HeaderExtension = extensionsRegistry.get('alertsreports.header.icon'); + function AlertList({ addDangerToast, isReportEnabled = false, @@ -191,7 +213,7 @@ function AlertList({ const toggleActive = useCallback( (data: AlertObject, checked: boolean) => { - if (data && data.id) { + if (data?.id) { const update_id = data.id; const original = [...alerts]; @@ -316,14 +338,21 @@ function AlertList({ size: 'xl', }, { - Cell: ({ row: { original } }: any) => ( - <Switch - data-test="toggle-active" - checked={original.active} - onClick={(checked: boolean) => toggleActive(original, checked)} - size="small" - /> - ), + Cell: ({ row: { original } }: any) => { + const allowEdit = + original.owners.map((o: Owner) => o.id).includes(user.userId) || + isUserAdmin(user); + + return ( + <Switch + disabled={!allowEdit} + data-test="toggle-active" + checked={original.active} + onClick={(checked: boolean) => toggleActive(original, checked)} + size="small" + /> + ); + }, Header: t('Active'), accessor: 'active', id: 'active', @@ -337,6 +366,10 @@ function AlertList({ const handleGotoExecutionLog = () => history.push(`/${original.type.toLowerCase()}/${original.id}/log`); + const allowEdit = + original.owners.map((o: Owner) => o.id).includes(user.userId) || + isUserAdmin(user); + const actions = [ canEdit ? { @@ -349,14 +382,14 @@ function AlertList({ : null, canEdit ? { - label: 'edit-action', - tooltip: t('Edit'), + label: allowEdit ? 'edit-action' : 'preview-action', + tooltip: allowEdit ? t('Edit') : t('View'), placement: 'bottom', - icon: 'Edit', + icon: allowEdit ? 'Edit' : 'Binoculars', onClick: handleEdit, } : null, - canDelete + allowEdit && canDelete ? { label: 'delete-action', tooltip: t('Delete'), @@ -418,10 +451,11 @@ function AlertList({ () => [ { Header: t('Owner'), + key: 'owner', id: 'owners', input: 'select', operator: FilterOperator.relationManyMany, - unfilteredLabel: 'All', + unfilteredLabel: t('All'), fetchSelects: createFetchRelated( 'report', 'owners', @@ -434,6 +468,7 @@ function AlertList({ }, { Header: t('Created by'), + key: 'created_by', id: 'created_by', input: 'select', operator: FilterOperator.relationOneMany, @@ -450,6 +485,7 @@ function AlertList({ }, { Header: t('Status'), + key: 'status', id: 'last_state', input: 'select', operator: FilterOperator.equals, @@ -470,6 +506,7 @@ function AlertList({ }, { Header: t('Search'), + key: 'search', id: 'name', input: 'search', operator: FilterOperator.contains, @@ -478,11 +515,20 @@ function AlertList({ [], ); + const header = HeaderExtension ? ( + <StyledHeaderWithIcon> + <div>{t('Alerts & reports')}</div> + <HeaderExtension /> + </StyledHeaderWithIcon> + ) : ( + t('Alerts & reports') + ); + return ( <> <SubMenu activeChild={pathName} - name={t('Alerts & reports')} + name={header} tabs={[ { name: 'Alerts', diff --git a/superset-frontend/src/views/CRUD/alert/AlertReportModal.test.jsx b/superset-frontend/src/views/CRUD/alert/AlertReportModal.test.jsx index 1598e5a926f3..a383c8be20cf 100644 --- a/superset-frontend/src/views/CRUD/alert/AlertReportModal.test.jsx +++ b/superset-frontend/src/views/CRUD/alert/AlertReportModal.test.jsx @@ -24,7 +24,7 @@ import fetchMock from 'fetch-mock'; import { act } from 'react-dom/test-utils'; import AlertReportModal from 'src/views/CRUD/alert/AlertReportModal'; import Modal from 'src/components/Modal'; -import { Select } from 'src/components'; +import { Select, AsyncSelect } from 'src/components'; import { Switch } from 'src/components/Switch'; import { Radio } from 'src/components/Radio'; import TextAreaControl from 'src/explore/components/controls/TextAreaControl'; @@ -180,9 +180,11 @@ describe('AlertReportModal', () => { expect(wrapper.find('input[name="name"]')).toExist(); }); - it('renders five select elements when in report mode', () => { + it('renders four select elements when in report mode', () => { expect(wrapper.find(Select)).toExist(); - expect(wrapper.find(Select)).toHaveLength(5); + expect(wrapper.find(AsyncSelect)).toExist(); + expect(wrapper.find(Select)).toHaveLength(2); + expect(wrapper.find(AsyncSelect)).toHaveLength(2); }); it('renders Switch element', () => { @@ -218,12 +220,14 @@ describe('AlertReportModal', () => { expect(input.props().initialValue).toEqual('SELECT NaN'); }); - it('renders five select element when in report mode', () => { + it('renders four select element when in report mode', () => { expect(wrapper.find(Select)).toExist(); - expect(wrapper.find(Select)).toHaveLength(5); + expect(wrapper.find(AsyncSelect)).toExist(); + expect(wrapper.find(Select)).toHaveLength(2); + expect(wrapper.find(AsyncSelect)).toHaveLength(2); }); - it('renders seven select elements when in alert mode', async () => { + it('renders six select elements when in alert mode', async () => { const props = { ...mockedProps, isReport: false, @@ -232,7 +236,9 @@ describe('AlertReportModal', () => { const addWrapper = await mountAndWait(props); expect(addWrapper.find(Select)).toExist(); - expect(addWrapper.find(Select)).toHaveLength(7); + expect(addWrapper.find(AsyncSelect)).toExist(); + expect(addWrapper.find(Select)).toHaveLength(3); + expect(addWrapper.find(AsyncSelect)).toHaveLength(3); }); it('renders value input element when in alert mode', async () => { diff --git a/superset-frontend/src/views/CRUD/alert/AlertReportModal.test.tsx b/superset-frontend/src/views/CRUD/alert/AlertReportModal.test.tsx index 8eeea3d45bcd..928b2e956706 100644 --- a/superset-frontend/src/views/CRUD/alert/AlertReportModal.test.tsx +++ b/superset-frontend/src/views/CRUD/alert/AlertReportModal.test.tsx @@ -40,3 +40,37 @@ test('allows change to None in log retention', async () => { // check if None is selected expect(selectedItem).toHaveTextContent('None'); }); + +test('renders the appropriate dropdown in Message Content section', async () => { + render(<AlertReportModal show />, { useRedux: true }); + + const chartRadio = screen.getByRole('radio', { name: /chart/i }); + + // Dashboard is initially checked by default + expect( + await screen.findByRole('radio', { + name: /dashboard/i, + }), + ).toBeChecked(); + expect(chartRadio).not.toBeChecked(); + // Only the dashboard dropdown should show + expect(screen.getByRole('combobox', { name: /dashboard/i })).toBeVisible(); + expect( + screen.queryByRole('combobox', { name: /chart/i }), + ).not.toBeInTheDocument(); + + // Click the chart radio option + userEvent.click(chartRadio); + + expect(await screen.findByRole('radio', { name: /chart/i })).toBeChecked(); + expect( + screen.getByRole('radio', { + name: /dashboard/i, + }), + ).not.toBeChecked(); + // Now that chart is checked, only the chart dropdown should show + expect(screen.getByRole('combobox', { name: /chart/i })).toBeVisible(); + expect( + screen.queryByRole('combobox', { name: /dashboard/i }), + ).not.toBeInTheDocument(); +}); diff --git a/superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx b/superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx index 04398a3582fc..d7f7a4c7364c 100644 --- a/superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx +++ b/superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx @@ -38,11 +38,11 @@ import { Switch } from 'src/components/Switch'; import Modal from 'src/components/Modal'; import TimezoneSelector from 'src/components/TimezoneSelector'; import { Radio } from 'src/components/Radio'; -import Select, { propertyComparator } from 'src/components/Select/Select'; +import { propertyComparator } from 'src/components/Select/utils'; import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; import withToasts from 'src/components/MessageToasts/withToasts'; import Owner from 'src/types/Owner'; -import { AntdCheckbox } from 'src/components'; +import { AntdCheckbox, AsyncSelect, Select } from 'src/components'; import TextAreaControl from 'src/explore/components/controls/TextAreaControl'; import { useCommonConf } from 'src/views/CRUD/data/database/state'; import { @@ -171,6 +171,10 @@ const StyledSectionContainer = styled.div` display: flex; flex-direction: column; + .control-label { + margin-top: ${({ theme }) => theme.gridUnit}px; + } + .header-section { display: flex; flex: 0 0 auto; @@ -257,7 +261,6 @@ const StyledSwitchContainer = styled.div` export const StyledInputContainer = styled.div` flex: 1; - margin: ${({ theme }) => theme.gridUnit * 2}px; margin-top: 0; .helper { @@ -340,6 +343,7 @@ const StyledRadioGroup = styled(Radio.Group)` const StyledCheckbox = styled(AntdCheckbox)` margin-left: ${({ theme }) => theme.gridUnit * 5.5}px; + margin-top: ${({ theme }) => theme.gridUnit}px; `; // Notification Method components @@ -357,10 +361,21 @@ const StyledNotificationAddButton = styled.div` } `; +const StyledNotificationMethodWrapper = styled.div` + .inline-container .input-container { + margin-left: 0; + } +`; + const timezoneHeaderStyle = (theme: SupersetTheme) => css` margin: ${theme.gridUnit * 3}px 0; `; +const inputSpacer = (theme: SupersetTheme) => + css` + margin-right: ${theme.gridUnit * 3}px; + `; + type NotificationAddStatus = 'active' | 'disabled' | 'hidden'; interface NotificationMethodAddProps { @@ -368,6 +383,46 @@ interface NotificationMethodAddProps { onClick: () => void; } +const TRANSLATIONS = { + ADD_NOTIFICATION_METHOD_TEXT: t('Add notification method'), + ADD_DELIVERY_METHOD_TEXT: t('Add delivery method'), + SAVE_TEXT: t('Save'), + ADD_TEXT: t('Add'), + EDIT_REPORT_TEXT: t('Edit Report'), + EDIT_ALERT_TEXT: t('Edit Alert'), + ADD_REPORT_TEXT: t('Add Report'), + ADD_ALERT_TEXT: t('Add Alert'), + REPORT_NAME_TEXT: t('Report name'), + ALERT_NAME_TEXT: t('Alert name'), + OWNERS_TEXT: t('Owners'), + DESCRIPTION_TEXT: t('Description'), + ACTIVE_TEXT: t('Active'), + ALERT_CONDITION_TEXT: t('Alert condition'), + DATABASE_TEXT: t('Database'), + SQL_QUERY_TEXT: t('SQL Query'), + TRIGGER_ALERT_IF_TEXT: t('Trigger Alert If...'), + CONDITION_TEXT: t('Condition'), + VALUE_TEXT: t('Value'), + VALUE_TOOLTIP: t('Threshold value should be double precision number'), + REPORT_SCHEDULE_TEXT: t('Report schedule'), + ALERT_CONDITION_SCHEDULE_TEXT: t('Alert condition schedule'), + TIMEZONE_TEXT: t('Timezone'), + SCHEDULE_SETTINGS_TEXT: t('Schedule settings'), + LOG_RETENTION_TEXT: t('Log retention'), + WORKING_TIMEOUT_TEXT: t('Working timeout'), + TIME_IN_SECONDS_TEXT: t('Time in seconds'), + SECONDS_TEXT: t('seconds'), + GRACE_PERIOD_TEXT: t('Grace period'), + MESSAGE_CONTENT_TEXT: t('Message content'), + DASHBOARD_TEXT: t('Dashboard'), + CHART_TEXT: t('Chart'), + SEND_AS_PNG_TEXT: t('Send as PNG'), + SEND_AS_CSV_TEXT: t('Send as CSV'), + SEND_AS_TEXT: t('Send as text'), + IGNORE_CACHE_TEXT: t('Ignore cache when generating screenshot'), + NOTIFICATION_METHOD_TEXT: t('Notification method'), +}; + const NotificationMethodAdd: FunctionComponent<NotificationMethodAddProps> = ({ status = 'active', onClick, @@ -386,8 +441,8 @@ const NotificationMethodAdd: FunctionComponent<NotificationMethodAddProps> = ({ <StyledNotificationAddButton className={status} onClick={checkStatus}> <i className="fa fa-plus" />{' '} {status === 'active' - ? t('Add notification method') - : t('Add delivery method')} + ? TRANSLATIONS.ADD_NOTIFICATION_METHOD_TEXT + : TRANSLATIONS.ADD_DELIVERY_METHOD_TEXT} </StyledNotificationAddButton> ); }; @@ -516,7 +571,7 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ const shouldEnableForceScreenshot = contentType === 'chart' && !isReport; const data: any = { ...currentAlert, - type: isReport ? 'Report' : 'Alert', + type: isReport ? t('Report') : t('Alert'), force_screenshot: shouldEnableForceScreenshot || forceScreenshot, validator_type: conditionNotNull ? 'not null' : 'operator', validator_config_json: conditionNotNull @@ -544,7 +599,7 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ if (isEditMode) { // Edit - if (currentAlert && currentAlert.id) { + if (currentAlert?.id) { const update_id = currentAlert.id; delete data.id; @@ -664,8 +719,7 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ [], ); - const databaseLabel = - currentAlert && currentAlert.database && !currentAlert.database.label; + const databaseLabel = currentAlert?.database && !currentAlert.database.label; useEffect(() => { // Find source if current alert has one set if (databaseLabel) { @@ -738,8 +792,7 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ [chartOptions, currentAlert?.chart], ); - const noChartLabel = - currentAlert && currentAlert.chart && !currentAlert.chart.label; + const noChartLabel = currentAlert?.chart && !currentAlert?.chart.label; useEffect(() => { // Find source if current alert has one set if (noChartLabel) { @@ -899,13 +952,12 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ const validate = () => { if ( - currentAlert && - currentAlert.name?.length && - currentAlert.owners?.length && - currentAlert.crontab?.length && - currentAlert.working_timeout !== undefined && - ((contentType === 'dashboard' && !!currentAlert.dashboard) || - (contentType === 'chart' && !!currentAlert.chart)) && + currentAlert?.name?.length && + currentAlert?.owners?.length && + currentAlert?.crontab?.length && + currentAlert?.working_timeout !== undefined && + ((contentType === 'dashboard' && !!currentAlert?.dashboard) || + (contentType === 'chart' && !!currentAlert?.chart)) && checkNotificationSettings() ) { if (isReport) { @@ -932,7 +984,7 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ isEditMode && (!currentAlert?.id || alert?.id !== currentAlert.id || (isHidden && show)) ) { - if (alert && alert.id !== null && !loading && !fetchError) { + if (alert?.id !== null && !loading && !fetchError) { const id = alert.id || 0; fetchResource(id); } @@ -1054,7 +1106,9 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ disablePrimaryButton={disableSave} onHandledPrimaryAction={onSave} onHide={hide} - primaryButtonName={isEditMode ? t('Save') : t('Add')} + primaryButtonName={ + isEditMode ? TRANSLATIONS.SAVE_TEXT : TRANSLATIONS.ADD_TEXT + } show={show} width="100%" maxWidth="1450px" @@ -1066,12 +1120,12 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ <Icons.PlusLarge css={StyledIcon} /> )} {isEditMode && isReport - ? t('Edit Report') + ? TRANSLATIONS.EDIT_REPORT_TEXT : isEditMode - ? t('Edit Alert') + ? TRANSLATIONS.EDIT_ALERT_TEXT : isReport - ? t('Add Report') - : t('Add Alert')} + ? TRANSLATIONS.ADD_REPORT_TEXT + : TRANSLATIONS.ADD_ALERT_TEXT} </h4> } > @@ -1079,7 +1133,9 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ <div className="header-section"> <StyledInputContainer> <div className="control-label"> - {isReport ? t('Report name') : t('Alert name')} + {isReport + ? TRANSLATIONS.REPORT_NAME_TEXT + : TRANSLATIONS.ALERT_NAME_TEXT} <span className="required">*</span> </div> <div className="input-container"> @@ -1087,19 +1143,24 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ type="text" name="name" value={currentAlert ? currentAlert.name : ''} - placeholder={isReport ? t('Report name') : t('Alert name')} + placeholder={ + isReport + ? TRANSLATIONS.REPORT_NAME_TEXT + : TRANSLATIONS.ALERT_NAME_TEXT + } onChange={onTextChange} + css={inputSpacer} /> </div> </StyledInputContainer> <StyledInputContainer> <div className="control-label"> - {t('Owners')} + {TRANSLATIONS.OWNERS_TEXT} <span className="required">*</span> </div> <div data-test="owners-select" className="input-container"> - <Select - ariaLabel={t('Owners')} + <AsyncSelect + ariaLabel={TRANSLATIONS.OWNERS_TEXT} allowClear name="owners" mode="multiple" @@ -1111,18 +1172,20 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ } options={loadOwnerOptions} onChange={onOwnersChange} + css={inputSpacer} /> </div> </StyledInputContainer> <StyledInputContainer> - <div className="control-label">{t('Description')}</div> + <div className="control-label">{TRANSLATIONS.DESCRIPTION_TEXT}</div> <div className="input-container"> <input type="text" name="description" value={currentAlert ? currentAlert.description || '' : ''} - placeholder={t('Description')} + placeholder={TRANSLATIONS.DESCRIPTION_TEXT} onChange={onTextChange} + css={inputSpacer} /> </div> </StyledInputContainer> @@ -1131,23 +1194,23 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ onChange={onActiveSwitch} checked={currentAlert ? currentAlert.active : true} /> - <div className="switch-label">Active</div> + <div className="switch-label">{TRANSLATIONS.ACTIVE_TEXT}</div> </StyledSwitchContainer> </div> <div className="column-section"> {!isReport && ( <div className="column condition"> <StyledSectionTitle> - <h4>{t('Alert condition')}</h4> + <h4>{TRANSLATIONS.ALERT_CONDITION_TEXT}</h4> </StyledSectionTitle> <StyledInputContainer> <div className="control-label"> - {t('Database')} + {TRANSLATIONS.DATABASE_TEXT} <span className="required">*</span> </div> <div className="input-container"> - <Select - ariaLabel={t('Database')} + <AsyncSelect + ariaLabel={TRANSLATIONS.DATABASE_TEXT} name="source" value={ currentAlert?.database?.label && @@ -1165,7 +1228,7 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ </StyledInputContainer> <StyledInputContainer> <div className="control-label"> - {t('SQL Query')} + {TRANSLATIONS.SQL_QUERY_TEXT} <span className="required">*</span> </div> <TextAreaControl @@ -1182,29 +1245,28 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ </StyledInputContainer> <div className="inline-container wrap"> <StyledInputContainer> - <div className="control-label"> - {t('Trigger Alert If...')} + <div className="control-label" css={inputSpacer}> + {TRANSLATIONS.TRIGGER_ALERT_IF_TEXT} <span className="required">*</span> </div> <div className="input-container"> <Select - ariaLabel={t('Condition')} + ariaLabel={TRANSLATIONS.CONDITION_TEXT} onChange={onConditionChange} placeholder="Condition" value={ currentAlert?.validator_config_json?.op || undefined } options={CONDITIONS} + css={inputSpacer} /> </div> </StyledInputContainer> <StyledInputContainer> <div className="control-label"> - {t('Value')}{' '} + {TRANSLATIONS.VALUE_TEXT}{' '} <InfoTooltipWithTrigger - tooltip={t( - 'Threshold value should be double precision number', - )} + tooltip={TRANSLATIONS.VALUE_TOOLTIP} /> <span className="required">*</span> </div> @@ -1214,14 +1276,12 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ name="threshold" disabled={conditionNotNull} value={ - currentAlert && - currentAlert.validator_config_json && - currentAlert.validator_config_json.threshold !== - undefined + currentAlert?.validator_config_json?.threshold !== + undefined ? currentAlert.validator_config_json.threshold : '' } - placeholder={t('Value')} + placeholder={TRANSLATIONS.VALUE_TEXT} onChange={onThresholdChange} /> </div> @@ -1233,8 +1293,8 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ <StyledSectionTitle> <h4> {isReport - ? t('Report schedule') - : t('Alert condition schedule')} + ? TRANSLATIONS.REPORT_SCHEDULE_TEXT + : TRANSLATIONS.ALERT_CONDITION_SCHEDULE_TEXT} </h4> <span className="required">*</span> </StyledSectionTitle> @@ -1242,7 +1302,7 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ value={currentAlert?.crontab || DEFAULT_CRON_VALUE} onChange={newVal => updateAlertState('crontab', newVal)} /> - <div className="control-label">{t('Timezone')}</div> + <div className="control-label">{TRANSLATIONS.TIMEZONE_TEXT}</div> <div className="input-container" css={(theme: SupersetTheme) => timezoneHeaderStyle(theme)} @@ -1254,17 +1314,17 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ /> </div> <StyledSectionTitle> - <h4>{t('Schedule settings')}</h4> + <h4>{TRANSLATIONS.SCHEDULE_SETTINGS_TEXT}</h4> </StyledSectionTitle> <StyledInputContainer> <div className="control-label"> - {t('Log retention')} + {TRANSLATIONS.LOG_RETENTION_TEXT} <span className="required">*</span> </div> <div className="input-container"> <Select - ariaLabel={t('Log retention')} - placeholder={t('Log retention')} + ariaLabel={TRANSLATIONS.LOG_RETENTION_TEXT} + placeholder={TRANSLATIONS.LOG_RETENTION_TEXT} onChange={onLogRetentionChange} value={ typeof currentAlert?.log_retention === 'number' @@ -1278,7 +1338,7 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ </StyledInputContainer> <StyledInputContainer> <div className="control-label"> - {t('Working timeout')} + {TRANSLATIONS.WORKING_TIMEOUT_TEXT} <span className="required">*</span> </div> <div className="input-container"> @@ -1287,72 +1347,76 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ min="1" name="working_timeout" value={currentAlert?.working_timeout || ''} - placeholder={t('Time in seconds')} + placeholder={TRANSLATIONS.TIME_IN_SECONDS_TEXT} onChange={onTimeoutVerifyChange} /> - <span className="input-label">seconds</span> + <span className="input-label">{TRANSLATIONS.SECONDS_TEXT}</span> </div> </StyledInputContainer> {!isReport && ( <StyledInputContainer> - <div className="control-label">{t('Grace period')}</div> + <div className="control-label"> + {TRANSLATIONS.GRACE_PERIOD_TEXT} + </div> <div className="input-container"> <input type="number" min="1" name="grace_period" value={currentAlert?.grace_period || ''} - placeholder={t('Time in seconds')} + placeholder={TRANSLATIONS.TIME_IN_SECONDS_TEXT} onChange={onTimeoutVerifyChange} /> - <span className="input-label">seconds</span> + <span className="input-label"> + {TRANSLATIONS.SECONDS_TEXT} + </span> </div> </StyledInputContainer> )} </div> <div className="column message"> <StyledSectionTitle> - <h4>{t('Message content')}</h4> + <h4>{TRANSLATIONS.MESSAGE_CONTENT_TEXT}</h4> <span className="required">*</span> </StyledSectionTitle> <Radio.Group onChange={onContentTypeChange} value={contentType}> - <StyledRadio value="dashboard">{t('Dashboard')}</StyledRadio> - <StyledRadio value="chart">{t('Chart')}</StyledRadio> + <StyledRadio value="dashboard"> + {TRANSLATIONS.DASHBOARD_TEXT} + </StyledRadio> + <StyledRadio value="chart">{TRANSLATIONS.CHART_TEXT}</StyledRadio> </Radio.Group> - <Select - ariaLabel={t('Chart')} - css={{ - display: contentType === 'chart' ? 'inline' : 'none', - }} - name="chart" - value={ - currentAlert?.chart?.label && currentAlert?.chart?.value - ? { - value: currentAlert.chart.value, - label: currentAlert.chart.label, - } - : undefined - } - options={loadChartOptions} - onChange={onChartChange} - /> - <Select - ariaLabel={t('Dashboard')} - css={{ - display: contentType === 'dashboard' ? 'inline' : 'none', - }} - name="dashboard" - value={ - currentAlert?.dashboard?.label && currentAlert?.dashboard?.value - ? { - value: currentAlert.dashboard.value, - label: currentAlert.dashboard.label, - } - : undefined - } - options={loadDashboardOptions} - onChange={onDashboardChange} - /> + {contentType === 'chart' ? ( + <AsyncSelect + ariaLabel={TRANSLATIONS.CHART_TEXT} + name="chart" + value={ + currentAlert?.chart?.label && currentAlert?.chart?.value + ? { + value: currentAlert.chart.value, + label: currentAlert.chart.label, + } + : undefined + } + options={loadChartOptions} + onChange={onChartChange} + /> + ) : ( + <AsyncSelect + ariaLabel={TRANSLATIONS.DASHBOARD_TEXT} + name="dashboard" + value={ + currentAlert?.dashboard?.label && + currentAlert?.dashboard?.value + ? { + value: currentAlert.dashboard.value, + label: currentAlert.dashboard.label, + } + : undefined + } + options={loadDashboardOptions} + onChange={onDashboardChange} + /> + )} {formatOptionEnabled && ( <> <div className="inline-container"> @@ -1360,11 +1424,15 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ onChange={onFormatChange} value={reportFormat} > - <StyledRadio value="PNG">{t('Send as PNG')}</StyledRadio> - <StyledRadio value="CSV">{t('Send as CSV')}</StyledRadio> + <StyledRadio value="PNG"> + {TRANSLATIONS.SEND_AS_PNG_TEXT} + </StyledRadio> + <StyledRadio value="CSV"> + {TRANSLATIONS.SEND_AS_CSV_TEXT} + </StyledRadio> {TEXT_BASED_VISUALIZATION_TYPES.includes(chartVizType) && ( <StyledRadio value="TEXT"> - {t('Send as text')} + {TRANSLATIONS.SEND_AS_TEXT} </StyledRadio> )} </StyledRadioGroup> @@ -1379,22 +1447,24 @@ const AlertReportModal: FunctionComponent<AlertReportModalProps> = ({ checked={forceScreenshot} onChange={onForceScreenshotChange} > - Ignore cache when generating screenshot + {TRANSLATIONS.IGNORE_CACHE_TEXT} </StyledCheckbox> </div> )} <StyledSectionTitle> - <h4>{t('Notification method')}</h4> + <h4>{TRANSLATIONS.NOTIFICATION_METHOD_TEXT}</h4> <span className="required">*</span> </StyledSectionTitle> {notificationSettings.map((notificationSetting, i) => ( - <NotificationMethod - setting={notificationSetting} - index={i} - key={`NotificationMethod-${i}`} - onUpdate={updateNotificationSetting} - onRemove={removeNotificationSetting} - /> + <StyledNotificationMethodWrapper> + <NotificationMethod + setting={notificationSetting} + index={i} + key={`NotificationMethod-${i}`} + onUpdate={updateNotificationSetting} + onRemove={removeNotificationSetting} + /> + </StyledNotificationMethodWrapper> ))} <NotificationMethodAdd data-test="notification-add" diff --git a/superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx b/superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx index 37f3e7c2add6..61b801c1c091 100644 --- a/superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx +++ b/superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx @@ -159,16 +159,26 @@ function ExecutionLog({ addDangerToast, isReportEnabled }: ExecutionLogProps) { [isReportEnabled], ); const path = `/${isReportEnabled ? 'report' : 'alert'}/list/`; + const ALERT_TEXT = t('Alert'); + const REPORT_TEXT = t('Report'); + return ( <> <SubMenu name={ <StyledHeader> <span> - {alertResource?.type} {alertResource?.name} + {alertResource + ? alertResource.type === 'Alert' + ? `${ALERT_TEXT}:` + : alertResource.type === 'Report' + ? `${REPORT_TEXT}:` + : null + : null}{' '} + {alertResource?.name} </span> <span> - <Link to={path}>Back to all</Link> + <Link to={path}>{t('Back to all')}</Link> </span> </StyledHeader> } diff --git a/superset-frontend/src/views/CRUD/alert/components/AlertReportCronScheduler.tsx b/superset-frontend/src/views/CRUD/alert/components/AlertReportCronScheduler.tsx index 5418842aeaaa..9a7fa6214b8e 100644 --- a/superset-frontend/src/views/CRUD/alert/components/AlertReportCronScheduler.tsx +++ b/superset-frontend/src/views/CRUD/alert/components/AlertReportCronScheduler.tsx @@ -80,7 +80,7 @@ export const AlertReportCronScheduler: React.FC<AlertReportCronSchedulerProps> = </div> <div className="inline-container add-margin"> <Radio data-test="input" value="input" /> - <span className="input-label">CRON Schedule</span> + <span className="input-label">{t('CRON Schedule')}</span> <StyledInputContainer data-test="input-content" className="styled-input" diff --git a/superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx b/superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx index 6dedb5e0ead6..f92bedd15d58 100644 --- a/superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx +++ b/superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx @@ -259,9 +259,9 @@ function AnnotationList({ <span>{t('Annotation Layer %s', annotationLayerName)}</span> <span> {hasHistory ? ( - <Link to="/annotationlayermodelview/list/">Back to all</Link> + <Link to="/annotationlayer/list/">{t('Back to all')}</Link> ) : ( - <a href="/annotationlayermodelview/list/">Back to all</a> + <a href="/annotationlayer/list/">{t('Back to all')}</a> )} </span> </StyledHeader> @@ -274,7 +274,7 @@ function AnnotationList({ annotation={currentAnnotation} show={annotationModalOpen} onAnnotationAdd={() => refreshData()} - annnotationLayerId={annotationLayerId} + annotationLayerId={annotationLayerId} onHide={() => setAnnotationModalOpen(false)} /> {annotationCurrentlyDeleting && ( diff --git a/superset-frontend/src/views/CRUD/annotation/AnnotationModal.test.jsx b/superset-frontend/src/views/CRUD/annotation/AnnotationModal.test.jsx index 0b2f4cb9a697..4ba95fe3bd20 100644 --- a/superset-frontend/src/views/CRUD/annotation/AnnotationModal.test.jsx +++ b/superset-frontend/src/views/CRUD/annotation/AnnotationModal.test.jsx @@ -80,12 +80,12 @@ describe('AnnotationModal', () => { it('renders add header when no annotation prop is included', async () => { const addWrapper = await mountAndWait({}); expect( - addWrapper.find('[data-test="annotaion-modal-title"]').text(), + addWrapper.find('[data-test="annotation-modal-title"]').text(), ).toEqual('Add annotation'); }); it('renders edit header when annotation prop is included', () => { - expect(wrapper.find('[data-test="annotaion-modal-title"]').text()).toEqual( + expect(wrapper.find('[data-test="annotation-modal-title"]').text()).toEqual( 'Edit annotation', ); }); diff --git a/superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx b/superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx index 22af06241f77..7aedad199f86 100644 --- a/superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx +++ b/superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx @@ -32,7 +32,7 @@ import { AnnotationObject } from './types'; interface AnnotationModalProps { addDangerToast: (msg: string) => void; addSuccessToast: (msg: string) => void; - annnotationLayerId: number; + annotationLayerId: number; annotation?: AnnotationObject | null; onAnnotationAdd?: (annotation?: AnnotationObject) => void; onHide: () => void; @@ -84,7 +84,7 @@ const AnnotationContainer = styled.div` const AnnotationModal: FunctionComponent<AnnotationModalProps> = ({ addDangerToast, addSuccessToast, - annnotationLayerId, + annotationLayerId, annotation = null, onAnnotationAdd, onHide, @@ -102,7 +102,7 @@ const AnnotationModal: FunctionComponent<AnnotationModalProps> = ({ createResource, updateResource, } = useSingleViewResource<AnnotationObject>( - `annotation_layer/${annnotationLayerId}/annotation`, + `annotation_layer/${annotationLayerId}/annotation`, t('annotation'), addDangerToast, ); @@ -130,7 +130,7 @@ const AnnotationModal: FunctionComponent<AnnotationModalProps> = ({ const onSave = () => { if (isEditMode) { // Edit - if (currentAnnotation && currentAnnotation.id) { + if (currentAnnotation?.id) { const update_id = currentAnnotation.id; delete currentAnnotation.id; delete currentAnnotation.created_by; @@ -217,10 +217,9 @@ const AnnotationModal: FunctionComponent<AnnotationModalProps> = ({ const validate = () => { if ( - currentAnnotation && - currentAnnotation.short_descr?.length && - currentAnnotation.start_dttm?.length && - currentAnnotation.end_dttm?.length + currentAnnotation?.short_descr?.length && + currentAnnotation?.start_dttm?.length && + currentAnnotation?.end_dttm?.length ) { setDisableSave(false); } else { @@ -237,7 +236,7 @@ const AnnotationModal: FunctionComponent<AnnotationModalProps> = ({ (annotation && annotation.id !== currentAnnotation.id) || show) ) { - if (annotation && annotation.id !== null && !loading) { + if (annotation?.id !== null && !loading) { const id = annotation.id || 0; fetchResource(id); @@ -274,7 +273,7 @@ const AnnotationModal: FunctionComponent<AnnotationModalProps> = ({ show={show} width="55%" title={ - <h4 data-test="annotaion-modal-title"> + <h4 data-test="annotation-modal-title"> {isEditMode ? ( <Icons.EditAlt css={StyledIcon} /> ) : ( @@ -305,6 +304,7 @@ const AnnotationModal: FunctionComponent<AnnotationModalProps> = ({ <span className="required">*</span> </div> <RangePicker + placeholder={[t('Start date'), t('End date')]} format="YYYY-MM-DD HH:mm" onChange={onDateChange} showTime={{ format: 'hh:mm a' }} @@ -337,7 +337,7 @@ const AnnotationModal: FunctionComponent<AnnotationModalProps> = ({ <StyledJsonEditor onChange={onJsonChange} value={ - currentAnnotation && currentAnnotation.json_metadata + currentAnnotation?.json_metadata ? currentAnnotation.json_metadata : '' } diff --git a/superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx b/superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx index a7b78de39a32..7510ef51c9ba 100644 --- a/superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx +++ b/superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx @@ -126,7 +126,7 @@ const AnnotationLayerModal: FunctionComponent<AnnotationLayerModalProps> = ({ const onSave = () => { if (isEditMode) { // Edit - if (currentLayer && currentLayer.id) { + if (currentLayer?.id) { const update_id = currentLayer.id; delete currentLayer.id; delete currentLayer.created_by; @@ -173,7 +173,7 @@ const AnnotationLayerModal: FunctionComponent<AnnotationLayerModalProps> = ({ }; const validate = () => { - if (currentLayer && currentLayer.name?.length) { + if (currentLayer?.name?.length) { setDisableSave(false); } else { setDisableSave(true); diff --git a/superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx b/superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx index 0265682dc7e6..3f4e1cd66c0e 100644 --- a/superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx +++ b/superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx @@ -143,12 +143,10 @@ function AnnotationLayersList({ } if (hasHistory) { - return ( - <Link to={`/annotationmodelview/${id}/annotation`}>{name}</Link> - ); + return <Link to={`/annotationlayer/${id}/annotation`}>{name}</Link>; } - return <a href={`/annotationmodelview/${id}/annotation`}>{name}</a>; + return <a href={`/annotationlayer/${id}/annotation`}>{name}</a>; }, }, { @@ -283,10 +281,11 @@ function AnnotationLayersList({ () => [ { Header: t('Created by'), + key: 'created_by', id: 'created_by', input: 'select', operator: FilterOperator.relationOneMany, - unfilteredLabel: 'All', + unfilteredLabel: t('All'), fetchSelects: createFetchRelated( 'annotation_layer', 'created_by', @@ -302,6 +301,7 @@ function AnnotationLayersList({ }, { Header: t('Search'), + key: 'search', id: 'name', input: 'search', operator: FilterOperator.contains, @@ -322,7 +322,7 @@ function AnnotationLayersList({ }; const onLayerAdd = (id?: number) => { - window.location.href = `/annotationmodelview/${id}/annotation`; + window.location.href = `/annotationlayer/${id}/annotation`; }; const onModalHide = () => { diff --git a/superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx b/superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx index 3248babb63cf..63486973592c 100644 --- a/superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx +++ b/superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx @@ -101,7 +101,7 @@ const CssTemplateModal: FunctionComponent<CssTemplateModalProps> = ({ const onSave = () => { if (isEditMode) { // Edit - if (currentCssTemplate && currentCssTemplate.id) { + if (currentCssTemplate?.id) { const update_id = currentCssTemplate.id; delete currentCssTemplate.id; delete currentCssTemplate.created_by; @@ -157,10 +157,8 @@ const CssTemplateModal: FunctionComponent<CssTemplateModalProps> = ({ const validate = () => { if ( - currentCssTemplate && - currentCssTemplate.template_name.length && - currentCssTemplate.css && - currentCssTemplate.css.length + currentCssTemplate?.template_name.length && + currentCssTemplate?.css?.length ) { setDisableSave(false); } else { @@ -174,10 +172,10 @@ const CssTemplateModal: FunctionComponent<CssTemplateModalProps> = ({ isEditMode && (!currentCssTemplate || !currentCssTemplate.id || - (cssTemplate && cssTemplate.id !== currentCssTemplate.id) || + (cssTemplate && cssTemplate?.id !== currentCssTemplate.id) || (isHidden && show)) ) { - if (cssTemplate && cssTemplate.id !== null && !loading) { + if (cssTemplate?.id !== null && !loading) { const id = cssTemplate.id || 0; fetchResource(id); diff --git a/superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx b/superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx index 4263d2214b53..253a4f4cdf1b 100644 --- a/superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx +++ b/superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx @@ -271,10 +271,11 @@ function CssTemplatesList({ () => [ { Header: t('Created by'), + key: 'created_by', id: 'created_by', input: 'select', operator: FilterOperator.relationOneMany, - unfilteredLabel: 'All', + unfilteredLabel: t('All'), fetchSelects: createFetchRelated( 'css_template', 'created_by', @@ -290,6 +291,7 @@ function CssTemplatesList({ }, { Header: t('Search'), + key: 'search', id: 'template_name', input: 'search', operator: FilterOperator.contains, diff --git a/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx b/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx index 2da9f4551533..0a46749a017a 100644 --- a/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx +++ b/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx @@ -19,11 +19,10 @@ import React from 'react'; import { Link, useHistory } from 'react-router-dom'; import { t, useTheme } from '@superset-ui/core'; -import { handleDashboardDelete, CardStyles } from 'src/views/CRUD/utils'; +import { CardStyles } from 'src/views/CRUD/utils'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; import { AntdDropdown } from 'src/components'; import { Menu } from 'src/components/Menu'; -import ConfirmStatusChange from 'src/components/ConfirmStatusChange'; import ListViewCard from 'src/components/ListViewCard'; import Icons from 'src/components/Icons'; import Label from 'src/components/Label'; @@ -36,33 +35,27 @@ interface DashboardCardProps { dashboard: Dashboard; hasPerm: (name: string) => boolean; bulkSelectEnabled: boolean; - refreshData: () => void; loading: boolean; - addDangerToast: (msg: string) => void; - addSuccessToast: (msg: string) => void; openDashboardEditModal?: (d: Dashboard) => void; saveFavoriteStatus: (id: number, isStarred: boolean) => void; favoriteStatus: boolean; - dashboardFilter?: string; userId?: string | number; showThumbnails?: boolean; handleBulkDashboardExport: (dashboardsToExport: Dashboard[]) => void; + onDelete: (dashboard: Dashboard) => void; } function DashboardCard({ dashboard, hasPerm, bulkSelectEnabled, - dashboardFilter, - refreshData, userId, - addDangerToast, - addSuccessToast, openDashboardEditModal, favoriteStatus, saveFavoriteStatus, showThumbnails, handleBulkDashboardExport, + onDelete, }: DashboardCardProps) { const history = useHistory(); const canEdit = hasPerm('can_write'); @@ -78,9 +71,7 @@ function DashboardCard({ role="button" tabIndex={0} className="action-button" - onClick={() => - openDashboardEditModal && openDashboardEditModal(dashboard) - } + onClick={() => openDashboardEditModal?.(dashboard)} data-test="dashboard-card-option-edit-button" > <Icons.EditAlt iconSize="l" data-test="edit-alt" /> {t('Edit')} @@ -102,37 +93,15 @@ function DashboardCard({ )} {canDelete && ( <Menu.Item> - <ConfirmStatusChange - title={t('Please confirm')} - description={ - <> - {t('Are you sure you want to delete')}{' '} - <b>{dashboard.dashboard_title}</b>? - </> - } - onConfirm={() => - handleDashboardDelete( - dashboard, - refreshData, - addSuccessToast, - addDangerToast, - dashboardFilter, - userId, - ) - } + <div + role="button" + tabIndex={0} + className="action-button" + onClick={() => onDelete(dashboard)} + data-test="dashboard-card-option-delete-button" > - {confirmDelete => ( - <div - role="button" - tabIndex={0} - className="action-button" - onClick={confirmDelete} - data-test="dashboard-card-option-delete-button" - > - <Icons.Trash iconSize="l" /> {t('Delete')} - </div> - )} - </ConfirmStatusChange> + <Icons.Trash iconSize="l" /> {t('Delete')} + </div> </Menu.Item> )} </Menu> diff --git a/superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx b/superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx index 8569f840d368..d892b24fa1b9 100644 --- a/superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx +++ b/superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx @@ -42,14 +42,16 @@ import Owner from 'src/types/Owner'; import withToasts from 'src/components/MessageToasts/withToasts'; import FacePile from 'src/components/FacePile'; import Icons from 'src/components/Icons'; +import DeleteModal from 'src/components/DeleteModal'; import FaveStar from 'src/components/FaveStar'; import PropertiesModal from 'src/dashboard/components/PropertiesModal'; import { Tooltip } from 'src/components/Tooltip'; import ImportModelsModal from 'src/components/ImportModal/index'; import Dashboard from 'src/dashboard/containers/Dashboard'; +import { Dashboard as CRUDDashboard } from 'src/views/CRUD/types'; import CertifiedBadge from 'src/components/CertifiedBadge'; -import { bootstrapData } from 'src/preamble'; +import getBootstrapData from 'src/utils/getBootstrapData'; import DashboardCard from './DashboardCard'; import { DashboardStatus } from './types'; @@ -95,6 +97,8 @@ const Actions = styled.div` color: ${({ theme }) => theme.colors.grayscale.base}; `; +const bootstrapData = getBootstrapData(); + function DashboardList(props: DashboardListProps) { const { addDangerToast, @@ -129,6 +133,8 @@ function DashboardList(props: DashboardListProps) { const [dashboardToEdit, setDashboardToEdit] = useState<Dashboard | null>( null, ); + const [dashboardToDelete, setDashboardToDelete] = + useState<CRUDDashboard | null>(null); const [importingDashboard, showImportModal] = useState<boolean>(false); const [passwordFields, setPasswordFields] = useState<string[]>([]); @@ -184,6 +190,7 @@ function DashboardList(props: DashboardListProps) { url = '', certified_by = '', certification_details = '', + owners, } = json.result; return { ...dashboard, @@ -197,6 +204,7 @@ function DashboardList(props: DashboardListProps) { url, certified_by, certification_details, + owners, }; } return dashboard; @@ -447,6 +455,7 @@ function DashboardList(props: DashboardListProps) { const favoritesFilter: Filter = useMemo( () => ({ Header: t('Favorite'), + key: 'favorite', id: 'id', urlDisplay: 'favorite', input: 'select', @@ -462,8 +471,16 @@ function DashboardList(props: DashboardListProps) { const filters: Filters = useMemo( () => [ + { + Header: t('Search'), + key: 'search', + id: 'dashboard_title', + input: 'search', + operator: FilterOperator.titleOrSlug, + }, { Header: t('Owner'), + key: 'owner', id: 'owners', input: 'select', operator: FilterOperator.relationManyMany, @@ -485,6 +502,7 @@ function DashboardList(props: DashboardListProps) { }, { Header: t('Created by'), + key: 'created_by', id: 'created_by', input: 'select', operator: FilterOperator.relationOneMany, @@ -506,6 +524,7 @@ function DashboardList(props: DashboardListProps) { }, { Header: t('Status'), + key: 'published', id: 'published', input: 'select', operator: FilterOperator.equals, @@ -518,6 +537,7 @@ function DashboardList(props: DashboardListProps) { ...(userId ? [favoritesFilter] : []), { Header: t('Certified'), + key: 'certified', id: 'id', urlDisplay: 'certified', input: 'select', @@ -528,12 +548,6 @@ function DashboardList(props: DashboardListProps) { { label: t('No'), value: false }, ], }, - { - Header: t('Search'), - id: 'dashboard_title', - input: 'search', - operator: FilterOperator.titleOrSlug, - }, ], [addDangerToast, favoritesFilter, props.user], ); @@ -565,7 +579,6 @@ function DashboardList(props: DashboardListProps) { dashboard={dashboard} hasPerm={hasPerm} bulkSelectEnabled={bulkSelectEnabled} - refreshData={refreshData} showThumbnails={ userKey ? userKey.thumbnails @@ -573,23 +586,19 @@ function DashboardList(props: DashboardListProps) { } userId={userId} loading={loading} - addDangerToast={addDangerToast} - addSuccessToast={addSuccessToast} openDashboardEditModal={openDashboardEditModal} saveFavoriteStatus={saveFavoriteStatus} favoriteStatus={favoriteStatus[dashboard.id]} handleBulkDashboardExport={handleBulkDashboardExport} + onDelete={dashboard => setDashboardToDelete(dashboard)} /> ), [ - addDangerToast, - addSuccessToast, bulkSelectEnabled, favoriteStatus, hasPerm, loading, userId, - refreshData, saveFavoriteStatus, userKey, ], @@ -671,6 +680,30 @@ function DashboardList(props: DashboardListProps) { onSubmit={handleDashboardEdit} /> )} + {dashboardToDelete && ( + <DeleteModal + description={ + <> + {t('Are you sure you want to delete')}{' '} + <b>{dashboardToDelete.dashboard_title}</b>? + </> + } + onConfirm={() => { + handleDashboardDelete( + dashboardToDelete, + refreshData, + addSuccessToast, + addDangerToast, + undefined, + userId, + ); + setDashboardToDelete(null); + }} + onHide={() => setDashboardToDelete(null)} + open={!!dashboardToDelete} + title={t('Please confirm')} + /> + )} <ListView<Dashboard> bulkActions={bulkActions} bulkSelectEnabled={bulkSelectEnabled} diff --git a/superset-frontend/src/views/CRUD/data/common.ts b/superset-frontend/src/views/CRUD/data/common.ts index c6708c451177..634176145b76 100644 --- a/superset-frontend/src/views/CRUD/data/common.ts +++ b/superset-frontend/src/views/CRUD/data/common.ts @@ -19,20 +19,8 @@ import { t } from '@superset-ui/core'; export const commonMenuData = { - name: t('Data'), + name: t('SQL'), tabs: [ - { - name: 'Databases', - label: t('Databases'), - url: '/databaseview/list/', - usesRouter: true, - }, - { - name: 'Datasets', - label: t('Datasets'), - url: '/tablemodelview/list/', - usesRouter: true, - }, { name: 'Saved queries', label: t('Saved queries'), diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseList.test.jsx b/superset-frontend/src/views/CRUD/data/database/DatabaseList.test.jsx index 1cc66ef9e3c9..f6fc0481f652 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseList.test.jsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseList.test.jsx @@ -131,23 +131,27 @@ describe('Admin DatabaseList', () => { await waitForComponentToPaint(wrapper); }); - it('renders', () => { + test('renders', () => { expect(wrapper.find(DatabaseList)).toExist(); }); - it('renders a SubMenu', () => { + test('renders a SubMenu', () => { expect(wrapper.find(SubMenu)).toExist(); }); - it('renders a DatabaseModal', () => { + test('renders a SubMenu with no tabs', () => { + expect(wrapper.find(SubMenu).props().tabs).toBeUndefined(); + }); + + test('renders a DatabaseModal', () => { expect(wrapper.find(DatabaseModal)).toExist(); }); - it('renders a ListView', () => { + test('renders a ListView', () => { expect(wrapper.find(ListView)).toExist(); }); - it('fetches Databases', () => { + test('fetches Databases', () => { const callsD = fetchMock.calls(/database\/\?q/); expect(callsD).toHaveLength(2); expect(callsD[0][0]).toMatchInlineSnapshot( @@ -155,7 +159,7 @@ describe('Admin DatabaseList', () => { ); }); - it('deletes', async () => { + test('deletes', async () => { act(() => { wrapper.find('[data-test="database-delete"]').first().props().onClick(); }); @@ -185,7 +189,7 @@ describe('Admin DatabaseList', () => { expect(fetchMock.calls(/database\/0/, 'DELETE')).toHaveLength(1); }); - it('filters', async () => { + test('filters', async () => { const filtersWrapper = wrapper.find(Filters); act(() => { filtersWrapper @@ -213,7 +217,7 @@ describe('Admin DatabaseList', () => { ); }); - it('should not render dropdown menu button if user is not admin', () => { + test('should not render dropdown menu button if user is not admin', async () => { userSelectorMock.mockReturnValue({ createdOn: '2021-05-27T18:12:38.952304', email: 'alpha@gmail.com', @@ -236,6 +240,8 @@ describe('Admin DatabaseList', () => { <DatabaseList /> </Provider>, ); + await waitForComponentToPaint(newWrapper); + expect(newWrapper.find('.dropdown-menu-links')).not.toExist(); }); }); diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx index dc9dc1a27914..00f207ba7a84 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx @@ -21,6 +21,7 @@ import React, { useState, useMemo, useEffect } from 'react'; import rison from 'rison'; import { useSelector } from 'react-redux'; import { useQueryParams, BooleanParam } from 'use-query-params'; +import { LocalStorageKeys, setItem } from 'src/utils/localStorageHelpers'; import Loading from 'src/components/Loading'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; @@ -29,15 +30,16 @@ import { createErrorHandler, uploadUserPerms } from 'src/views/CRUD/utils'; import withToasts from 'src/components/MessageToasts/withToasts'; import SubMenu, { SubMenuProps } from 'src/views/components/SubMenu'; import DeleteModal from 'src/components/DeleteModal'; +import { getUrlParam } from 'src/utils/urlUtils'; +import { URL_PARAMS } from 'src/constants'; import { Tooltip } from 'src/components/Tooltip'; import Icons from 'src/components/Icons'; -import { isUserAdmin } from 'src/dashboard/util/findPermission'; +import { isUserAdmin } from 'src/dashboard/util/permissionUtils'; import ListView, { FilterOperator, Filters } from 'src/components/ListView'; -import { commonMenuData } from 'src/views/CRUD/data/common'; import handleResourceExport from 'src/utils/export'; -import { ExtentionConfigs } from 'src/views/components/types'; +import { ExtensionConfigs } from 'src/views/components/types'; import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; -import type { MenuObjectProps } from 'src/views/components/Menu'; +import type { MenuObjectProps } from 'src/types/bootstrapTypes'; import DatabaseModal from './DatabaseModal'; import { DatabaseObject } from './types'; @@ -93,12 +95,15 @@ function DatabaseList({ addDangerToast, addSuccessToast }: DatabaseListProps) { const user = useSelector<any, UserWithPermissionsAndRoles>( state => state.user, ); + const showDatabaseModal = getUrlParam(URL_PARAMS.showDatabaseModal); const [query, setQuery] = useQueryParams({ databaseAdded: BooleanParam, }); - const [databaseModalOpen, setDatabaseModalOpen] = useState<boolean>(false); + const [databaseModalOpen, setDatabaseModalOpen] = useState<boolean>( + showDatabaseModal || false, + ); const [databaseCurrentlyDeleting, setDatabaseCurrentlyDeleting] = useState<DatabaseDeleteObject | null>(null); const [currentDatabase, setCurrentDatabase] = useState<DatabaseObject | null>( @@ -115,7 +120,7 @@ function DatabaseList({ addDangerToast, addSuccessToast }: DatabaseListProps) { COLUMNAR_EXTENSIONS, EXCEL_EXTENSIONS, ALLOWED_EXTENSIONS, - } = useSelector<any, ExtentionConfigs>(state => state.common.conf); + } = useSelector<any, ExtensionConfigs>(state => state.common.conf); useEffect(() => { if (query?.databaseAdded) { @@ -153,6 +158,9 @@ function DatabaseList({ addDangerToast, addSuccessToast }: DatabaseListProps) { refreshData(); addSuccessToast(t('Deleted: %s', dbName)); + // Delete user-selected db from local storage + setItem(LocalStorageKeys.db, null); + // Close delete modal setDatabaseCurrentlyDeleting(null); }, @@ -225,7 +233,13 @@ function DatabaseList({ addDangerToast, addSuccessToast }: DatabaseListProps) { SupersetClient.get({ endpoint: `/api/v1/database/?q=${rison.encode(payload)}`, }).then(({ json }: Record<string, any>) => { - setAllowUploads(json.count >= 1); + // There might be some existings Gsheets and Clickhouse DBs + // with allow_file_upload set as True which is not possible from now on + const allowedDatabasesWithFileUpload = + json?.result?.filter( + (database: any) => database?.engine_information?.supports_file_upload, + ) || []; + setAllowUploads(allowedDatabasesWithFileUpload?.length >= 1); }); }; @@ -242,7 +256,7 @@ function DatabaseList({ addDangerToast, addSuccessToast }: DatabaseListProps) { const menuData: SubMenuProps = { activeChild: 'Databases', dropDownLinks: filteredDropDown, - ...commonMenuData, + name: t('Databases'), }; if (canCreate) { @@ -445,13 +459,14 @@ function DatabaseList({ addDangerToast, addSuccessToast }: DatabaseListProps) { () => [ { Header: t('Expose in SQL Lab'), + key: 'expose_in_sql_lab', id: 'expose_in_sqllab', input: 'select', operator: FilterOperator.equals, - unfilteredLabel: 'All', + unfilteredLabel: t('All'), selects: [ - { label: 'Yes', value: true }, - { label: 'No', value: false }, + { label: t('Yes'), value: true }, + { label: t('No'), value: false }, ], }, { @@ -464,17 +479,19 @@ function DatabaseList({ addDangerToast, addSuccessToast }: DatabaseListProps) { <span>{t('AQE')}</span> </Tooltip> ), + key: 'allow_run_async', id: 'allow_run_async', input: 'select', operator: FilterOperator.equals, - unfilteredLabel: 'All', + unfilteredLabel: t('All'), selects: [ - { label: 'Yes', value: true }, - { label: 'No', value: false }, + { label: t('Yes'), value: true }, + { label: t('No'), value: false }, ], }, { Header: t('Search'), + key: 'search', id: 'database_name', input: 'search', operator: FilterOperator.contains, diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx index 34c21466bec8..99a414012b77 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx @@ -66,16 +66,40 @@ export const portField = ({ errorMessage={validationErrors?.port} placeholder={t('e.g. 5432')} className="form-group-w-50" - label="Port" + label={t('Port')} onChange={changeMethods.onParametersChange} /> </> ); +export const httpPath = ({ + required, + changeMethods, + getValidation, + validationErrors, + db, +}: FieldPropTypes) => { + const extraJson = JSON.parse(db?.extra || '{}'); + return ( + <ValidatedInput + id="http_path" + name="http_path" + required={required} + value={extraJson.engine_params?.connect_args?.http_path} + validationMethods={{ onBlur: getValidation }} + errorMessage={validationErrors?.http_path} + placeholder={t('e.g. sql/protocolv1/o/12345')} + label="HTTP Path" + onChange={changeMethods.onExtraInputChange} + helpText={t('Copy the name of the HTTP Path of your cluster.')} + /> + ); +}; export const databaseField = ({ required, changeMethods, getValidation, validationErrors, + placeholder, db, }: FieldPropTypes) => ( <ValidatedInput @@ -85,10 +109,10 @@ export const databaseField = ({ value={db?.parameters?.database} validationMethods={{ onBlur: getValidation }} errorMessage={validationErrors?.database} - placeholder={t('e.g. world_population')} + placeholder={placeholder ?? t('e.g. world_population')} label={t('Database name')} onChange={changeMethods.onParametersChange} - helpText={t('Copy the name of the database you are trying to connect to.')} + helpText={t('Copy the name of the database you are trying to connect to.')} /> ); export const usernameField = ({ @@ -131,6 +155,27 @@ export const passwordField = ({ onChange={changeMethods.onParametersChange} /> ); +export const accessTokenField = ({ + required, + changeMethods, + getValidation, + validationErrors, + db, + isEditMode, +}: FieldPropTypes) => ( + <ValidatedInput + id="access_token" + name="access_token" + required={required} + visibilityToggle={!isEditMode} + value={db?.parameters?.access_token} + validationMethods={{ onBlur: getValidation }} + errorMessage={validationErrors?.access_token} + placeholder={t('e.g. ********')} + label={t('Access token')} + onChange={changeMethods.onParametersChange} + /> +); export const displayField = ({ changeMethods, getValidation, @@ -149,7 +194,7 @@ export const displayField = ({ label={t('Display Name')} onChange={changeMethods.onChange} helpText={t( - 'Pick a nickname for this database to display as in Superset.', + 'Pick a nickname for how the database will display in Superset.', )} /> </> diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx index d4817d68b441..0125fd36d512 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx @@ -21,9 +21,9 @@ import { SupersetTheme, t } from '@superset-ui/core'; import { AntdButton, AntdSelect } from 'src/components'; import InfoTooltip from 'src/components/InfoTooltip'; import FormLabel from 'src/components/Form/FormLabel'; -import { DeleteFilled } from '@ant-design/icons'; +import Icons from 'src/components/Icons'; import { FieldPropTypes } from '.'; -import { infoTooltip, labelMarginBotton, CredentialInfoForm } from '../styles'; +import { infoTooltip, labelMarginBottom, CredentialInfoForm } from '../styles'; enum CredentialInfoOptions { jsonUpload, @@ -55,8 +55,7 @@ export const EncryptedField = ({ const [isPublic, setIsPublic] = useState<boolean>(true); const showCredentialsInfo = db?.engine === 'gsheets' ? !isEditMode && !isPublic : !isEditMode; - // a database that has an optional encrypted field has an encrypted_extra that is an empty object, this checks for that. - const isEncrypted = isEditMode && db?.encrypted_extra !== '{}'; + const isEncrypted = isEditMode && db?.masked_encrypted_extra !== '{}'; const encryptedField = db?.engine && encryptedCredentialsMap[db.engine]; const encryptedValue = typeof db?.parameters?.[encryptedField] === 'object' @@ -67,7 +66,7 @@ export const EncryptedField = ({ {db?.engine === 'gsheets' && ( <div className="catalog-type-select"> <FormLabel - css={(theme: SupersetTheme) => labelMarginBotton(theme)} + css={(theme: SupersetTheme) => labelMarginBottom(theme)} required > {t('Type of Google Sheets allowed')} @@ -118,7 +117,9 @@ export const EncryptedField = ({ name={encryptedField} value={encryptedValue} onChange={changeMethods.onParametersChange} - placeholder="Paste content of service credentials JSON file here" + placeholder={t( + 'Paste content of service credentials JSON file here', + )} /> <span className="label-paste"> {t('Copy and paste the entire service account .json file here')} @@ -153,7 +154,8 @@ export const EncryptedField = ({ {fileToUpload && ( <div className="input-upload-current"> {fileToUpload} - <DeleteFilled + <Icons.DeleteFilled + iconSize="m" onClick={() => { setFileToUpload(null); changeMethods.onParametersChange({ @@ -169,6 +171,7 @@ export const EncryptedField = ({ <input id="selectedFile" + accept=".json" className="input-upload" type="file" onChange={async event => { diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx index fb70b9c3652a..ed5cc94903f2 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx @@ -17,10 +17,10 @@ * under the License. */ import React from 'react'; -import { t } from '@superset-ui/core'; +import { css, SupersetTheme, t } from '@superset-ui/core'; import ValidatedInput from 'src/components/Form/LabeledErrorBoundInput'; import FormLabel from 'src/components/Form/FormLabel'; -import { CloseOutlined } from '@ant-design/icons'; +import Icons from 'src/components/Icons'; import { FieldPropTypes } from '.'; import { StyledFooterButton, StyledCatalogTable } from '../styles'; import { CatalogObject } from '../../types'; @@ -64,8 +64,17 @@ export const TableCatalog = ({ value={sheet.name} /> {tableCatalog?.length > 1 && ( - <CloseOutlined - className="catalog-delete" + <Icons.CloseOutlined + css={(theme: SupersetTheme) => css` + align-self: center; + background: ${theme.colors.grayscale.light4}; + margin: 5px 5px 8px 5px; + + &.anticon > * { + line-height: 0; + } + `} + iconSize="m" onClick={() => changeMethods.onRemoveTableCatalog(idx)} /> )} diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/ValidatedInputField.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/ValidatedInputField.tsx index 93ba1f2d1ffe..a00b3ba9354e 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/ValidatedInputField.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/ValidatedInputField.tsx @@ -26,14 +26,14 @@ const FIELD_TEXT_MAP = { helpText: t( 'Copy the account name of that database you are trying to connect to.', ), - placeholder: 'e.g. world_population', + placeholder: t('e.g. world_population'), }, warehouse: { - placeholder: 'e.g. compute_wh', + placeholder: t('e.g. compute_wh'), className: 'form-group-w-50', }, role: { - placeholder: 'e.g. AccountAdmin', + placeholder: t('e.g. AccountAdmin'), className: 'form-group-w-50', }, }; diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/index.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/index.tsx index 84108e40dcc6..f6284ae67d9a 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/index.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/index.tsx @@ -21,14 +21,16 @@ import { SupersetTheme, JsonObject } from '@superset-ui/core'; import { InputProps } from 'antd/lib/input'; import { Form } from 'src/components/Form'; import { - hostField, - portField, + accessTokenField, databaseField, - usernameField, - passwordField, displayField, - queryField, forceSSLField, + hostField, + httpPath, + passwordField, + portField, + queryField, + usernameField, } from './CommonParameters'; import { validatedInputField } from './ValidatedInputField'; import { EncryptedField } from './EncryptedField'; @@ -42,6 +44,8 @@ export const FormFieldOrder = [ 'database', 'username', 'password', + 'access_token', + 'http_path', 'database_name', 'credentials_info', 'service_account_info', @@ -57,6 +61,7 @@ export interface FieldPropTypes { required: boolean; hasTooltip?: boolean; tooltipText?: (value: any) => string; + placeholder?: string; onParametersChange: (value: any) => string; onParametersUploadFileChange: (value: any) => string; changeMethods: { onParametersChange: (value: any) => string } & { @@ -66,6 +71,9 @@ export interface FieldPropTypes { } & { onParametersUploadFileChange: (value: any) => string } & { onAddTableCatalog: () => void; onRemoveTableCatalog: (idx: number) => void; + } & { + onExtraInputChange: (value: any) => void; + onSSHTunnelParametersChange: (value: any) => string; }; validationErrors: JsonObject | null; getValidation: () => void; @@ -79,10 +87,12 @@ export interface FieldPropTypes { const FORM_FIELD_MAP = { host: hostField, + http_path: httpPath, port: portField, database: databaseField, username: usernameField, password: passwordField, + access_token: accessTokenField, database_name: displayField, query: queryField, encryption: forceSSLField, @@ -94,21 +104,7 @@ const FORM_FIELD_MAP = { account: validatedInputField, }; -const DatabaseConnectionForm = ({ - dbModel: { parameters }, - onParametersChange, - onChange, - onQueryChange, - onParametersUploadFileChange, - onAddTableCatalog, - onRemoveTableCatalog, - validationErrors, - getValidation, - db, - isEditMode = false, - sslForced, - editNewDb, -}: { +interface DatabaseConnectionFormProps { isEditMode?: boolean; sslForced: boolean; editNewDb?: boolean; @@ -126,11 +122,33 @@ const DatabaseConnectionForm = ({ onParametersUploadFileChange?: ( event: FormEvent<InputProps> | { target: HTMLInputElement }, ) => void; + onExtraInputChange: ( + event: FormEvent<InputProps> | { target: HTMLInputElement }, + ) => void; onAddTableCatalog: () => void; onRemoveTableCatalog: (idx: number) => void; validationErrors: JsonObject | null; getValidation: () => void; -}) => ( + getPlaceholder?: (field: string) => string | undefined; +} + +const DatabaseConnectionForm = ({ + dbModel: { parameters }, + db, + editNewDb, + getPlaceholder, + getValidation, + isEditMode = false, + onAddTableCatalog, + onChange, + onExtraInputChange, + onParametersChange, + onParametersUploadFileChange, + onQueryChange, + onRemoveTableCatalog, + sslForced, + validationErrors, +}: DatabaseConnectionFormProps) => ( <Form> <div // @ts-ignore @@ -154,6 +172,7 @@ const DatabaseConnectionForm = ({ onParametersUploadFileChange, onAddTableCatalog, onRemoveTableCatalog, + onExtraInputChange, }, validationErrors, getValidation, @@ -163,6 +182,7 @@ const DatabaseConnectionForm = ({ isEditMode, sslForced, editNewDb, + placeholder: getPlaceholder ? getPlaceholder(field) : undefined, }), )} </div> diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx index 12a712fa35b5..f50d7597f2fc 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx @@ -29,7 +29,7 @@ import { antdCollapseStyles, no_margin_bottom, } from './styles'; -import { DatabaseObject } from '../types'; +import { DatabaseObject, ExtraJson } from '../types'; const ExtraOptions = ({ db, @@ -48,6 +48,18 @@ const ExtraOptions = ({ }) => { const expandableModalIsOpen = !!db?.expose_in_sqllab; const createAsOpen = !!(db?.allow_ctas || db?.allow_cvas); + const isFileUploadSupportedByEngine = + db?.engine_information?.supports_file_upload; + + // JSON.parse will deep parse engine_params + // if it's an object, and we want to keep it a string + const extraJson: ExtraJson = JSON.parse(db?.extra || '{}', (key, value) => { + if (key === 'engine_params' && typeof value === 'object') { + // keep this as a string + return JSON.stringify(value); + } + return value; + }); return ( <Collapse @@ -58,9 +70,9 @@ const ExtraOptions = ({ <Collapse.Panel header={ <div> - <h4>SQL Lab</h4> + <h4>{t('SQL Lab')}</h4> <p className="helper"> - Adjust how this database will interact with SQL Lab. + {t('Adjust how this database will interact with SQL Lab.')} </p> </div> } @@ -120,9 +132,9 @@ const ExtraOptions = ({ <input type="text" name="force_ctas_schema" - value={db?.force_ctas_schema || ''} placeholder={t('Create or select schema...')} onChange={onInputChange} + value={db?.force_ctas_schema || ''} /> </div> <div className="helper"> @@ -148,36 +160,18 @@ const ExtraOptions = ({ /> </div> </StyledInputContainer> - <StyledInputContainer css={no_margin_bottom}> - <div className="input-container"> - <IndeterminateCheckbox - id="allow_multi_schema_metadata_fetch" - indeterminate={false} - checked={!!db?.allow_multi_schema_metadata_fetch} - onChange={onInputChange} - labelText={t('Allow Multi Schema Metadata Fetch')} - /> - <InfoTooltip - tooltip={t( - 'Allow SQL Lab to fetch a list of all tables and all views across all database ' + - 'schemas. For large data warehouse with thousands of tables, this can be ' + - 'expensive and put strain on the system.', - )} - /> - </div> - </StyledInputContainer> <StyledInputContainer css={no_margin_bottom}> <div className="input-container"> <IndeterminateCheckbox id="cost_estimate_enabled" indeterminate={false} - checked={!!db?.extra_json?.cost_estimate_enabled} + checked={!!extraJson?.cost_estimate_enabled} onChange={onExtraInputChange} labelText={t('Enable query cost estimation')} /> <InfoTooltip tooltip={t( - 'For Presto and Postgres, shows a button to compute cost before running a query.', + 'For Bigquery, Presto and Postgres, shows a button to compute cost before running a query.', )} /> </div> @@ -187,7 +181,7 @@ const ExtraOptions = ({ <IndeterminateCheckbox id="allows_virtual_table_explore" indeterminate={false} - checked={!!db?.extra_json?.allows_virtual_table_explore} + checked={!!extraJson?.allows_virtual_table_explore} onChange={onExtraInputChange} labelText={t('Allow this database to be explored')} /> @@ -203,7 +197,7 @@ const ExtraOptions = ({ <IndeterminateCheckbox id="disable_data_preview" indeterminate={false} - checked={!!db?.extra_json?.disable_data_preview} + checked={!!extraJson?.disable_data_preview} onChange={onExtraInputChange} labelText={t('Disable SQL Lab data preview queries')} /> @@ -222,9 +216,9 @@ const ExtraOptions = ({ <Collapse.Panel header={ <div> - <h4>Performance</h4> + <h4>{t('Performance')}</h4> <p className="helper"> - Adjust performance settings of this database. + {t('Adjust performance settings of this database.')} </p> </div> } @@ -256,8 +250,7 @@ const ExtraOptions = ({ type="number" name="schema_cache_timeout" value={ - db?.extra_json?.metadata_cache_timeout?.schema_cache_timeout || - '' + extraJson?.metadata_cache_timeout?.schema_cache_timeout || '' } placeholder={t('Enter duration in seconds')} onChange={onExtraInputChange} @@ -278,8 +271,7 @@ const ExtraOptions = ({ type="number" name="table_cache_timeout" value={ - db?.extra_json?.metadata_cache_timeout?.table_cache_timeout || - '' + extraJson?.metadata_cache_timeout?.table_cache_timeout || '' } placeholder={t('Enter duration in seconds')} onChange={onExtraInputChange} @@ -317,7 +309,7 @@ const ExtraOptions = ({ <IndeterminateCheckbox id="cancel_query_on_windows_unload" indeterminate={false} - checked={!!db?.extra_json?.cancel_query_on_windows_unload} + checked={!!extraJson?.cancel_query_on_windows_unload} onChange={onExtraInputChange} labelText={t('Cancel query on window unload event')} /> @@ -334,8 +326,8 @@ const ExtraOptions = ({ <Collapse.Panel header={ <div> - <h4>Security</h4> - <p className="helper">Add extra connection information.</p> + <h4>{t('Security')}</h4> + <p className="helper">{t('Add extra connection information.')}</p> </div> } key="3" @@ -344,11 +336,11 @@ const ExtraOptions = ({ <div className="control-label">{t('Secure extra')}</div> <div className="input-container"> <StyledJsonEditor - name="encrypted_extra" - value={db?.encrypted_extra || ''} + name="masked_encrypted_extra" + value={db?.masked_encrypted_extra || ''} placeholder={t('Secure extra')} onChange={(json: string) => - onEditorChange({ json, name: 'encrypted_extra' }) + onEditorChange({ json, name: 'masked_encrypted_extra' }) } width="100%" height="160px" @@ -382,28 +374,9 @@ const ExtraOptions = ({ )} </div> </StyledInputContainer> - <StyledInputContainer> - <div className="control-label"> - {t('Schemas allowed for CSV upload')} - </div> - <div className="input-container"> - <input - type="text" - name="schemas_allowed_for_file_upload" - value={( - db?.extra_json?.schemas_allowed_for_file_upload || [] - ).join(',')} - placeholder="schema1,schema2" - onChange={onExtraInputChange} - /> - </div> - <div className="helper"> - {t( - 'A comma-separated list of schemas that CSVs are allowed to upload to.', - )} - </div> - </StyledInputContainer> - <StyledInputContainer css={{ no_margin_bottom }}> + <StyledInputContainer + css={!isFileUploadSupportedByEngine ? no_margin_bottom : {}} + > <div className="input-container"> <IndeterminateCheckbox id="impersonate_user" @@ -425,28 +398,50 @@ const ExtraOptions = ({ /> </div> </StyledInputContainer> - <StyledInputContainer css={{ ...no_margin_bottom }}> - <div className="input-container"> - <IndeterminateCheckbox - id="allow_file_upload" - indeterminate={false} - checked={!!db?.allow_file_upload} - onChange={onInputChange} - labelText={t('Allow data upload')} - /> - <InfoTooltip - tooltip={t( - 'If selected, please set the schemas allowed for data upload in Extra.', + {isFileUploadSupportedByEngine && ( + <StyledInputContainer + css={!db?.allow_file_upload ? no_margin_bottom : {}} + > + <div className="input-container"> + <IndeterminateCheckbox + id="allow_file_upload" + indeterminate={false} + checked={!!db?.allow_file_upload} + onChange={onInputChange} + labelText={t('Allow file uploads to database')} + /> + </div> + </StyledInputContainer> + )} + {isFileUploadSupportedByEngine && !!db?.allow_file_upload && ( + <StyledInputContainer css={no_margin_bottom}> + <div className="control-label"> + {t('Schemas allowed for File upload')} + </div> + <div className="input-container"> + <input + type="text" + name="schemas_allowed_for_file_upload" + value={(extraJson?.schemas_allowed_for_file_upload || []).join( + ',', + )} + placeholder="schema1,schema2" + onChange={onExtraInputChange} + /> + </div> + <div className="helper"> + {t( + 'A comma-separated list of schemas that files are allowed to upload to.', )} - /> - </div> - </StyledInputContainer> + </div> + </StyledInputContainer> + )} </Collapse.Panel> <Collapse.Panel header={ <div> - <h4>Other</h4> - <p className="helper">Additional settings.</p> + <h4>{t('Other')}</h4> + <p className="helper">{t('Additional settings.')}</p> </div> } key="4" @@ -456,13 +451,17 @@ const ExtraOptions = ({ <div className="input-container"> <StyledJsonEditor name="metadata_params" - value={db?.extra_json?.metadata_params || ''} placeholder={t('Metadata Parameters')} onChange={(json: string) => onExtraEditorChange({ json, name: 'metadata_params' }) } width="100%" height="160px" + defaultValue={ + !Object.keys(extraJson?.metadata_params || {}).length + ? '' + : extraJson?.metadata_params + } /> </div> <div className="helper"> @@ -478,13 +477,17 @@ const ExtraOptions = ({ <div className="input-container"> <StyledJsonEditor name="engine_params" - value={db?.extra_json?.engine_params || ''} placeholder={t('Engine Parameters')} onChange={(json: string) => onExtraEditorChange({ json, name: 'engine_params' }) } width="100%" height="160px" + defaultValue={ + !Object.keys(extraJson?.engine_params || {}).length + ? '' + : extraJson?.engine_params + } /> </div> <div className="helper"> @@ -503,9 +506,9 @@ const ExtraOptions = ({ <input type="number" name="version" - value={db?.extra_json?.version || ''} placeholder={t('Version number')} onChange={onExtraInputChange} + value={extraJson?.version || ''} /> </div> <div className="helper"> diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx index 7cdcbaba281e..9825489a7b80 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx @@ -20,6 +20,7 @@ import React from 'react'; import { getDatabaseDocumentationLinks } from 'src/views/CRUD/hooks'; import { UploadFile } from 'antd/lib/upload/interface'; +import { t } from '@superset-ui/core'; import { EditHeaderTitle, EditHeaderSubtitle, @@ -88,16 +89,21 @@ const ModalHeader = ({ const useSqlAlchemyFormHeader = ( <StyledFormHeader> - <p className="helper-top"> STEP 2 OF 2 </p> - <h4>Enter Primary Credentials</h4> + <p className="helper-top"> + {t('STEP %(stepCurr)s OF %(stepLast)s', { + stepCurr: 2, + stepLast: 2, + })} + </p> + <h4>{t('Enter Primary Credentials')}</h4> <p className="helper-bottom"> - Need help? Learn how to connect your database{' '} + {t('Need help? Learn how to connect your database')}{' '} <a href={supersetTextDocs?.default || DOCUMENTATION_LINK} target="_blank" rel="noopener noreferrer" > - here + {t('here')} </a> . </p> @@ -107,20 +113,16 @@ const ModalHeader = ({ const hasConnectedDbHeader = ( <StyledStickyHeader> <StyledFormHeader> - <p className="helper-top"> STEP 3 OF 3 </p> - <h4 className="step-3-text"> - Your database was successfully connected! Here are some optional - settings for your database - </h4> - <p className="helper-bottom"> - Need help? Learn more about{' '} - <a - href={documentationLink(db?.engine)} - target="_blank" - rel="noopener noreferrer" - > - connecting to {dbModel.name}. - </a> + <p className="helper-top"> + {t('STEP %(stepCurr)s OF %(stepLast)s', { + stepCurr: 3, + stepLast: 3, + })} + </p> + <h4 className="step-3-text">{t('Database connected')}</h4> + <p className="subheader-text"> + {t(`Create a dataset to begin visualizing your data as a chart or go to + SQL Lab to query your data.`)} </p> </StyledFormHeader> </StyledStickyHeader> @@ -129,16 +131,26 @@ const ModalHeader = ({ const hasDbHeader = ( <StyledStickyHeader> <StyledFormHeader> - <p className="helper-top"> STEP 2 OF 3 </p> - <h4>Enter the required {dbModel.name} credentials</h4> + <p className="helper-top"> + {t('STEP %(stepCurr)s OF %(stepLast)s', { + stepCurr: 2, + stepLast: 3, + })} + </p> + <h4> + {t('Enter the required %(dbModelName)s credentials', { + dbModelName: dbModel.name, + })} + </h4> <p className="helper-bottom"> - Need help? Learn more about{' '} + {t('Need help? Learn more about')}{' '} <a href={documentationLink(db?.engine)} target="_blank" rel="noopener noreferrer" > - connecting to {dbModel.name}. + {t('connecting to %(dbModelName)s.', { dbModelName: dbModel.name })} + . </a> </p> </StyledFormHeader> @@ -148,8 +160,13 @@ const ModalHeader = ({ const noDbHeader = ( <StyledFormHeader> <div className="select-db"> - <p className="helper-top"> STEP 1 OF 3 </p> - <h4>Select a database to connect</h4> + <p className="helper-top"> + {t('STEP %(stepCurr)s OF %(stepLast)s', { + stepCurr: 1, + stepLast: 3, + })} + </p> + <h4>{t('Select a database to connect')}</h4> </div> </StyledFormHeader> ); @@ -157,8 +174,17 @@ const ModalHeader = ({ const importDbHeader = ( <StyledStickyHeader> <StyledFormHeader> - <p className="helper-top"> STEP 2 OF 2 </p> - <h4>Enter the required {dbModel.name} credentials</h4> + <p className="helper-top"> + {t('STEP %(stepCurr)s OF %(stepLast)s', { + stepCurr: 2, + stepLast: 2, + })} + </p> + <h4> + {t('Enter the required %(dbModelName)s credentials', { + dbModelName: dbModel.name, + })} + </h4> <p className="helper-bottom">{fileCheck ? fileList[0].name : ''}</p> </StyledFormHeader> </StyledStickyHeader> diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx new file mode 100644 index 000000000000..6cc0312b52a4 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx @@ -0,0 +1,228 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { EventHandler, ChangeEvent, useState } from 'react'; +import { t, styled } from '@superset-ui/core'; +import { AntdForm, Col, Row } from 'src/components'; +import { Form, FormLabel } from 'src/components/Form'; +import { Radio } from 'src/components/Radio'; +import { Input, TextArea } from 'src/components/Input'; +import { Input as AntdInput, Tooltip } from 'antd'; +import { EyeInvisibleOutlined, EyeOutlined } from '@ant-design/icons'; + +import { DatabaseObject } from '../types'; +import { AuthType } from '.'; + +const StyledDiv = styled.div` + padding-top: ${({ theme }) => theme.gridUnit * 2}px; + label { + color: ${({ theme }) => theme.colors.grayscale.base}; + text-transform: uppercase; + margin-bottom: ${({ theme }) => theme.gridUnit * 2}px; + } +`; + +const StyledRow = styled(Row)` + padding-bottom: ${({ theme }) => theme.gridUnit * 2}px; +`; + +const StyledFormItem = styled(AntdForm.Item)` + margin-bottom: 0 !important; +`; + +const StyledInputPassword = styled(AntdInput.Password)` + margin: ${({ theme }) => `${theme.gridUnit}px 0 ${theme.gridUnit * 2}px`}; +`; + +const SSHTunnelForm = ({ + db, + onSSHTunnelParametersChange, + setSSHTunnelLoginMethod, +}: { + db: DatabaseObject | null; + onSSHTunnelParametersChange: EventHandler< + ChangeEvent<HTMLInputElement | HTMLTextAreaElement> + >; + setSSHTunnelLoginMethod: (method: AuthType) => void; +}) => { + const [usePassword, setUsePassword] = useState<AuthType>(AuthType.password); + + return ( + <Form> + <StyledRow gutter={16}> + <Col xs={24} md={12}> + <StyledDiv> + <FormLabel htmlFor="server_address" required> + {t('SSH Host')} + </FormLabel> + <Input + name="server_address" + type="text" + placeholder={t('e.g. 127.0.0.1')} + value={db?.ssh_tunnel?.server_address || ''} + onChange={onSSHTunnelParametersChange} + data-test="ssh-tunnel-server_address-input" + /> + </StyledDiv> + </Col> + <Col xs={24} md={12}> + <StyledDiv> + <FormLabel htmlFor="server_port" required> + {t('SSH Port')} + </FormLabel> + <Input + name="server_port" + type="text" + placeholder={t('22')} + value={db?.ssh_tunnel?.server_port || ''} + onChange={onSSHTunnelParametersChange} + data-test="ssh-tunnel-server_port-input" + /> + </StyledDiv> + </Col> + </StyledRow> + <StyledRow gutter={16}> + <Col xs={24}> + <StyledDiv> + <FormLabel htmlFor="username" required> + {t('Username')} + </FormLabel> + <Input + name="username" + type="text" + placeholder={t('e.g. Analytics')} + value={db?.ssh_tunnel?.username || ''} + onChange={onSSHTunnelParametersChange} + data-test="ssh-tunnel-username-input" + /> + </StyledDiv> + </Col> + </StyledRow> + <StyledRow gutter={16}> + <Col xs={24}> + <StyledDiv> + <FormLabel htmlFor="use_password" required> + {t('Login with')} + </FormLabel> + <StyledFormItem name="use_password" initialValue={usePassword}> + <Radio.Group + onChange={({ target: { value } }) => { + setUsePassword(value); + setSSHTunnelLoginMethod(value); + }} + > + <Radio + value={AuthType.password} + data-test="ssh-tunnel-use_password-radio" + > + {t('Password')} + </Radio> + <Radio + value={AuthType.privateKey} + data-test="ssh-tunnel-use_private_key-radio" + > + {t('Private Key & Password')} + </Radio> + </Radio.Group> + </StyledFormItem> + </StyledDiv> + </Col> + </StyledRow> + {usePassword === AuthType.password && ( + <StyledRow gutter={16}> + <Col xs={24}> + <StyledDiv> + <FormLabel htmlFor="password" required> + {t('SSH Password')} + </FormLabel> + <StyledInputPassword + name="password" + placeholder={t('e.g. ********')} + value={db?.ssh_tunnel?.password || ''} + onChange={onSSHTunnelParametersChange} + data-test="ssh-tunnel-password-input" + iconRender={visible => + visible ? ( + <Tooltip title="Hide password."> + <EyeInvisibleOutlined /> + </Tooltip> + ) : ( + <Tooltip title="Show password."> + <EyeOutlined /> + </Tooltip> + ) + } + role="textbox" + /> + </StyledDiv> + </Col> + </StyledRow> + )} + {usePassword === AuthType.privateKey && ( + <> + <StyledRow gutter={16}> + <Col xs={24}> + <StyledDiv> + <FormLabel htmlFor="private_key" required> + {t('Private Key')} + </FormLabel> + <TextArea + name="private_key" + placeholder={t('Paste Private Key here')} + value={db?.ssh_tunnel?.private_key || ''} + onChange={onSSHTunnelParametersChange} + data-test="ssh-tunnel-private_key-input" + rows={4} + /> + </StyledDiv> + </Col> + </StyledRow> + <StyledRow gutter={16}> + <Col xs={24}> + <StyledDiv> + <FormLabel htmlFor="private_key_password" required> + {t('Private Key Password')} + </FormLabel> + <StyledInputPassword + name="private_key_password" + placeholder={t('e.g. ********')} + value={db?.ssh_tunnel?.private_key_password || ''} + onChange={onSSHTunnelParametersChange} + data-test="ssh-tunnel-private_key_password-input" + iconRender={visible => + visible ? ( + <Tooltip title="Hide password."> + <EyeInvisibleOutlined /> + </Tooltip> + ) : ( + <Tooltip title="Show password."> + <EyeOutlined /> + </Tooltip> + ) + } + role="textbox" + /> + </StyledDiv> + </Col> + </StyledRow> + </> + )} + </Form> + ); +}; +export default SSHTunnelForm; diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelSwitch.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelSwitch.tsx new file mode 100644 index 000000000000..a3cc38ca37a5 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelSwitch.tsx @@ -0,0 +1,58 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { t, SupersetTheme, SwitchProps } from '@superset-ui/core'; +import { AntdSwitch } from 'src/components'; +import InfoTooltip from 'src/components/InfoTooltip'; +import { isEmpty } from 'lodash'; +import { ActionType } from '.'; +import { infoTooltip, toggleStyle } from './styles'; + +const SSHTunnelSwitch = ({ + isEditMode, + dbFetched, + useSSHTunneling, + setUseSSHTunneling, + setDB, + isSSHTunneling, +}: SwitchProps) => + isSSHTunneling ? ( + <div css={(theme: SupersetTheme) => infoTooltip(theme)}> + <AntdSwitch + disabled={isEditMode && !isEmpty(dbFetched?.ssh_tunnel)} + checked={useSSHTunneling} + onChange={changed => { + setUseSSHTunneling(changed); + if (!changed) { + setDB({ + type: ActionType.removeSSHTunnelConfig, + }); + } + }} + data-test="ssh-tunnel-switch" + /> + <span css={toggleStyle}>{t('SSH Tunnel')}</span> + <InfoTooltip + tooltip={t('SSH Tunnel configuration parameters')} + placement="right" + viewBox="0 -5 24 24" + /> + </div> + ) : null; +export default SSHTunnelSwitch; diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx index 454070b52a91..003a26c9a171 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import React, { EventHandler, ChangeEvent, MouseEvent } from 'react'; +import React, { EventHandler, ChangeEvent, MouseEvent, ReactNode } from 'react'; import { t, SupersetTheme } from '@superset-ui/core'; import SupersetText from 'src/utils/textUtils'; import Button from 'src/components/Button'; @@ -30,12 +30,14 @@ const SqlAlchemyTab = ({ testConnection, conf, testInProgress = false, + children, }: { db: DatabaseObject | null; onInputChange: EventHandler<ChangeEvent<HTMLInputElement>>; testConnection: EventHandler<MouseEvent<HTMLElement>>; conf: { SQLALCHEMY_DOCS_URL: string; SQLALCHEMY_DISPLAY_TEXT: string }; testInProgress?: boolean; + children?: ReactNode; }) => { let fallbackDocsUrl; let fallbackDisplayText; @@ -99,9 +101,10 @@ const SqlAlchemyTab = ({ {t('for more information on how to structure your URI.')} </div> </StyledInputContainer> + {children} <Button onClick={testConnection} - disabled={testInProgress} + loading={testInProgress} cta buttonStyle="link" css={(theme: SupersetTheme) => wideButton(theme)} diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.jsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.jsx deleted file mode 100644 index 79a11b0b1343..000000000000 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.jsx +++ /dev/null @@ -1,1069 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import fetchMock from 'fetch-mock'; -import userEvent from '@testing-library/user-event'; -import { - render, - screen, - within, - cleanup, - act, -} from 'spec/helpers/testing-library'; -/* -- These imports are used for the mock functions that currently don't work -import { - testDatabaseConnection, - useSingleViewResource, -} from 'src/views/CRUD/hooks'; */ -import DatabaseModal from './index'; - -const dbProps = { - show: true, - database_name: 'my database', - sqlalchemy_uri: 'postgres://superset:superset@something:1234/superset', -}; - -const DATABASE_FETCH_ENDPOINT = 'glob:*/api/v1/database/10'; -// const DATABASE_POST_ENDPOINT = 'glob:*/api/v1/database/'; -const AVAILABLE_DB_ENDPOINT = 'glob:*/api/v1/database/available*'; -const VALIDATE_PARAMS_ENDPOINT = 'glob:*/api/v1/database/validate_parameters*'; - -fetchMock.config.overwriteRoutes = true; -fetchMock.get(DATABASE_FETCH_ENDPOINT, { - result: { - id: 10, - database_name: 'my database', - expose_in_sqllab: false, - allow_ctas: false, - allow_cvas: false, - configuration_method: 'sqlalchemy_form', - }, -}); -fetchMock.mock(AVAILABLE_DB_ENDPOINT, { - databases: [ - { - available_drivers: ['psycopg2'], - default_driver: 'psycopg2', - engine: 'postgresql', - name: 'PostgreSQL', - parameters: { - properties: { - database: { - description: 'Database name', - type: 'string', - }, - encryption: { - description: 'Use an encrypted connection to the database', - type: 'boolean', - }, - host: { - description: 'Hostname or IP address', - type: 'string', - }, - password: { - description: 'Password', - nullable: true, - type: 'string', - }, - port: { - description: 'Database port', - format: 'int32', - maximum: 65536, - minimum: 0, - type: 'integer', - }, - query: { - additionalProperties: {}, - description: 'Additional parameters', - type: 'object', - }, - username: { - description: 'Username', - nullable: true, - type: 'string', - }, - }, - required: ['database', 'host', 'port', 'username'], - type: 'object', - }, - preferred: true, - sqlalchemy_uri_placeholder: - 'postgresql://user:password@host:port/dbname[?key=value&key=value...]', - }, - { - available_drivers: ['rest'], - engine: 'presto', - name: 'Presto', - preferred: true, - }, - { - available_drivers: ['mysqldb'], - default_driver: 'mysqldb', - engine: 'mysql', - name: 'MySQL', - parameters: { - properties: { - database: { - description: 'Database name', - type: 'string', - }, - encryption: { - description: 'Use an encrypted connection to the database', - type: 'boolean', - }, - host: { - description: 'Hostname or IP address', - type: 'string', - }, - password: { - description: 'Password', - nullable: true, - type: 'string', - }, - port: { - description: 'Database port', - format: 'int32', - maximum: 65536, - minimum: 0, - type: 'integer', - }, - query: { - additionalProperties: {}, - description: 'Additional parameters', - type: 'object', - }, - username: { - description: 'Username', - nullable: true, - type: 'string', - }, - }, - required: ['database', 'host', 'port', 'username'], - type: 'object', - }, - preferred: true, - sqlalchemy_uri_placeholder: - 'mysql://user:password@host:port/dbname[?key=value&key=value...]', - }, - { - available_drivers: ['pysqlite'], - engine: 'sqlite', - name: 'SQLite', - preferred: true, - }, - { - available_drivers: ['rest'], - engine: 'druid', - name: 'Apache Druid', - preferred: false, - }, - { - available_drivers: ['bigquery'], - default_driver: 'bigquery', - engine: 'bigquery', - name: 'Google BigQuery', - parameters: { - properties: { - credentials_info: { - description: 'Contents of BigQuery JSON credentials.', - type: 'string', - 'x-encrypted-extra': true, - }, - query: { - type: 'object', - }, - }, - type: 'object', - }, - preferred: false, - sqlalchemy_uri_placeholder: 'bigquery://{project_id}', - }, - ], -}); -fetchMock.post(VALIDATE_PARAMS_ENDPOINT, { - message: 'OK', -}); - -describe('DatabaseModal', () => { - const renderAndWait = async () => { - const mounted = act(async () => { - render(<DatabaseModal {...dbProps} />, { - useRedux: true, - }); - }); - - return mounted; - }; - - beforeEach(async () => { - await renderAndWait(); - }); - - afterEach(cleanup); - - describe('Visual: New database connection', () => { - it('renders the initial load of Step 1 correctly', async () => { - // ---------- Components ---------- - // <TabHeader> - AntD header - const closeButton = screen.getByLabelText('Close'); - const step1Header = screen.getByRole('heading', { - name: /connect a database/i, - }); - // <ModalHeader> - Connection header - const step1Helper = screen.getByText(/step 1 of 3/i); - const selectDbHeader = screen.getByRole('heading', { - name: /select a database to connect/i, - }); - // <IconButton> - Preferred database buttons - const preferredDbButtonPostgreSQL = screen.getByRole('button', { - name: /postgresql/i, - }); - const preferredDbTextPostgreSQL = within( - preferredDbButtonPostgreSQL, - ).getByText(/postgresql/i); - const preferredDbButtonPresto = screen.getByRole('button', { - name: /presto/i, - }); - const preferredDbTextPresto = within(preferredDbButtonPresto).getByText( - /presto/i, - ); - const preferredDbButtonMySQL = screen.getByRole('button', { - name: /mysql/i, - }); - const preferredDbTextMySQL = within(preferredDbButtonMySQL).getByText( - /mysql/i, - ); - const preferredDbButtonSQLite = screen.getByRole('button', { - name: /sqlite/i, - }); - const preferredDbTextSQLite = within(preferredDbButtonSQLite).getByText( - /sqlite/i, - ); - // All dbs render with this icon in this testing environment, - // The Icon count should equal the count of databases rendered - const preferredDbIcon = screen.getAllByRole('img', { - name: /default-icon/i, - }); - // renderAvailableSelector() => <Select> - Supported databases selector - const supportedDbsHeader = screen.getByRole('heading', { - name: /or choose from a list of other databases we support:/i, - }); - const selectorLabel = screen.getByText(/supported databases/i); - const selectorPlaceholder = screen.getByText(/choose a database\.\.\./i); - const selectorArrow = screen.getByRole('img', { - name: /down/i, - hidden: true, - }); - - // ---------- TODO (lyndsiWilliams): Selector options, can't seem to get these to render properly. - - // renderAvailableSelector() => <Alert> - Supported databases alert - const alertIcon = screen.getByRole('img', { name: /info icon/i }); - const alertMessage = screen.getByText(/want to add a new database\?/i); - const alertDescription = screen.getByText( - /any databases that allow connections via sql alchemy uris can be added\. learn about how to connect a database driver \./i, - ); - const alertLink = screen.getByRole('link', { name: /here/i }); - - // ---------- Assertions ---------- - const visibleComponents = [ - closeButton, - step1Header, - step1Helper, - selectDbHeader, - supportedDbsHeader, - selectorLabel, - selectorPlaceholder, - selectorArrow, - alertIcon, - alertMessage, - alertDescription, - alertLink, - preferredDbButtonPostgreSQL, - preferredDbButtonPresto, - preferredDbButtonMySQL, - preferredDbButtonSQLite, - preferredDbIcon[0], - preferredDbIcon[1], - preferredDbIcon[2], - preferredDbIcon[3], - preferredDbTextPostgreSQL, - preferredDbTextPresto, - preferredDbTextMySQL, - preferredDbTextSQLite, - ]; - - visibleComponents.forEach(component => { - expect(component).toBeVisible(); - }); - // This is how many preferred databases are rendered - expect(preferredDbIcon).toHaveLength(4); - }); - - it('renders the "Basic" tab of SQL Alchemy form (step 2 of 2) correctly', async () => { - // On step 1, click dbButton to access SQL Alchemy form - userEvent.click( - screen.getByRole('button', { - name: /sqlite/i, - }), - ); - - // ---------- Components ---------- - // <TabHeader> - AntD header - const closeButton = screen.getByRole('button', { name: /close/i }); - const basicHeader = screen.getByRole('heading', { - name: /connect a database/i, - }); - // <ModalHeader> - Connection header - const basicHelper = screen.getByText(/step 2 of 2/i); - const basicHeaderTitle = screen.getByText(/enter primary credentials/i); - const basicHeaderSubtitle = screen.getByText( - /need help\? learn how to connect your database \./i, - ); - const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { - name: /here/i, - }); - // <Tabs> - Basic/Advanced tabs - const basicTab = screen.getByRole('tab', { name: /basic/i }); - const advancedTab = screen.getByRole('tab', { name: /advanced/i }); - // <StyledBasicTab> - Basic tab's content - const displayNameLabel = screen.getByText(/display name*/i); - const displayNameInput = screen.getByTestId('database-name-input'); - const displayNameHelper = screen.getByText( - /pick a name to help you identify this database\./i, - ); - const SQLURILabel = screen.getByText(/sqlalchemy uri*/i); - const SQLURIInput = screen.getByTestId('sqlalchemy-uri-input'); - const SQLURIHelper = screen.getByText( - /refer to the for more information on how to structure your uri\./i, - ); - const testConnectionButton = screen.getByRole('button', { - name: /test connection/i, - }); - // <Alert> - Basic tab's alert - const alertIcon = screen.getByRole('img', { name: /info icon/i }); - const alertMessage = screen.getByText( - /additional fields may be required/i, - ); - const alertDescription = screen.getByText( - /select databases require additional fields to be completed in the advanced tab to successfully connect the database\. learn what requirements your databases has \./i, - ); - const alertLink = within(alertDescription).getByRole('link', { - name: /here/i, - }); - // renderModalFooter() - Basic tab's footer - const backButton = screen.getByRole('button', { name: /back/i }); - const connectButton = screen.getByRole('button', { name: 'Connect' }); - - // ---------- Assertions ---------- - const visibleComponents = [ - closeButton, - basicHeader, - basicHelper, - basicHeaderTitle, - basicHeaderSubtitle, - basicHeaderLink, - basicTab, - advancedTab, - displayNameLabel, - displayNameInput, - displayNameHelper, - SQLURILabel, - SQLURIInput, - SQLURIHelper, - testConnectionButton, - alertIcon, - alertMessage, - alertDescription, - alertLink, - backButton, - connectButton, - ]; - - visibleComponents.forEach(component => { - expect(component).toBeVisible(); - }); - }); - - it('renders the unexpanded "Advanced" tab correctly', async () => { - // On step 1, click dbButton to access step 2 - userEvent.click( - screen.getByRole('button', { - name: /sqlite/i, - }), - ); - // Click the "Advanced" tab - userEvent.click(screen.getByRole('tab', { name: /advanced/i })); - - // ---------- Components ---------- - // <TabHeader> - AntD header - const closeButton = screen.getByRole('button', { name: /close/i }); - const advancedHeader = screen.getByRole('heading', { - name: /connect a database/i, - }); - // <ModalHeader> - Connection header - const basicHelper = screen.getByText(/step 2 of 2/i); - const basicHeaderTitle = screen.getByText(/enter primary credentials/i); - const basicHeaderSubtitle = screen.getByText( - /need help\? learn how to connect your database \./i, - ); - const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { - name: /here/i, - }); - // <Tabs> - Basic/Advanced tabs - const basicTab = screen.getByRole('tab', { name: /basic/i }); - const advancedTab = screen.getByRole('tab', { name: /advanced/i }); - // <ExtraOptions> - Advanced tabs - const sqlLabTab = screen.getByRole('tab', { - name: /right sql lab adjust how this database will interact with sql lab\./i, - }); - const sqlLabTabArrow = within(sqlLabTab).getByRole('img', { - name: /right/i, - }); - const sqlLabTabHeading = screen.getByRole('heading', { - name: /sql lab/i, - }); - const performanceTab = screen.getByRole('tab', { - name: /right performance adjust performance settings of this database\./i, - }); - const performanceTabArrow = within(performanceTab).getByRole('img', { - name: /right/i, - }); - const performanceTabHeading = screen.getByRole('heading', { - name: /performance/i, - }); - const securityTab = screen.getByRole('tab', { - name: /right security add extra connection information\./i, - }); - const securityTabArrow = within(securityTab).getByRole('img', { - name: /right/i, - }); - const securityTabHeading = screen.getByRole('heading', { - name: /security/i, - }); - const otherTab = screen.getByRole('tab', { - name: /right other additional settings\./i, - }); - const otherTabArrow = within(otherTab).getByRole('img', { - name: /right/i, - }); - const otherTabHeading = screen.getByRole('heading', { name: /other/i }); - // renderModalFooter() - Advanced tab's footer - const backButton = screen.getByRole('button', { name: /back/i }); - const connectButton = screen.getByRole('button', { name: 'Connect' }); - - // ---------- Assertions ---------- - const visibleComponents = [ - closeButton, - advancedHeader, - basicHelper, - basicHeaderTitle, - basicHeaderSubtitle, - basicHeaderLink, - basicTab, - advancedTab, - sqlLabTab, - sqlLabTabArrow, - sqlLabTabHeading, - performanceTab, - performanceTabArrow, - performanceTabHeading, - securityTab, - securityTabArrow, - securityTabHeading, - otherTab, - otherTabArrow, - otherTabHeading, - backButton, - connectButton, - ]; - - visibleComponents.forEach(component => { - expect(component).toBeVisible(); - }); - }); - - it('renders the "Advanced" - SQL LAB tab correctly (unexpanded)', async () => { - // ---------- Components ---------- - // On step 1, click dbButton to access step 2 - userEvent.click( - screen.getByRole('button', { - name: /sqlite/i, - }), - ); - // Click the "Advanced" tab - userEvent.click(screen.getByRole('tab', { name: /advanced/i })); - // Click the "SQL Lab" tab - userEvent.click( - screen.getByRole('tab', { - name: /right sql lab adjust how this database will interact with sql lab\./i, - }), - ); - - // ----- BEGIN STEP 2 (ADVANCED - SQL LAB) - // <TabHeader> - AntD header - const closeButton = screen.getByRole('button', { name: /close/i }); - const advancedHeader = screen.getByRole('heading', { - name: /connect a database/i, - }); - // <ModalHeader> - Connection header - const basicHelper = screen.getByText(/step 2 of 2/i); - const basicHeaderTitle = screen.getByText(/enter primary credentials/i); - const basicHeaderSubtitle = screen.getByText( - /need help\? learn how to connect your database \./i, - ); - const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { - name: /here/i, - }); - // <Tabs> - Basic/Advanced tabs - const basicTab = screen.getByRole('tab', { name: /basic/i }); - const advancedTab = screen.getByRole('tab', { name: /advanced/i }); - // <ExtraOptions> - Advanced tabs - const sqlLabTab = screen.getByRole('tab', { - name: /right sql lab adjust how this database will interact with sql lab\./i, - }); - // These are the checkbox SVGs that cover the actual checkboxes - const checkboxOffSVGs = screen.getAllByRole('img', { - name: /checkbox-off/i, - }); - const tooltipIcons = screen.getAllByRole('img', { - name: /info-solid_small/i, - }); - const exposeInSQLLabCheckbox = screen.getByRole('checkbox', { - name: /expose database in sql lab/i, - }); - // This is both the checkbox and it's respective SVG - // const exposeInSQLLabCheckboxSVG = checkboxOffSVGs[0].parentElement; - const exposeInSQLLabText = screen.getByText( - /expose database in sql lab/i, - ); - const allowCTASCheckbox = screen.getByRole('checkbox', { - name: /allow create table as/i, - }); - const allowCTASText = screen.getByText(/allow create table as/i); - const allowCVASCheckbox = screen.getByRole('checkbox', { - name: /allow create table as/i, - }); - const allowCVASText = screen.getByText(/allow create table as/i); - const CTASCVASLabelText = screen.getByText(/ctas & cvas schema/i); - // This grabs the whole input by placeholder text - const CTASCVASInput = screen.getByPlaceholderText( - /create or select schema\.\.\./i, - ); - const CTASCVASHelperText = screen.getByText( - /force all tables and views to be created in this schema when clicking ctas or cvas in sql lab\./i, - ); - const allowDMLCheckbox = screen.getByRole('checkbox', { - name: /allow dml/i, - }); - const allowDMLText = screen.getByText(/allow dml/i); - const allowMultiSchemaMDFetchCheckbox = screen.getByRole('checkbox', { - name: /allow multi schema metadata fetch/i, - }); - const allowMultiSchemaMDFetchText = screen.getByText( - /allow multi schema metadata fetch/i, - ); - const enableQueryCostEstimationCheckbox = screen.getByRole('checkbox', { - name: /enable query cost estimation/i, - }); - const enableQueryCostEstimationText = screen.getByText( - /enable query cost estimation/i, - ); - const allowDbExplorationCheckbox = screen.getByRole('checkbox', { - name: /allow this database to be explored/i, - }); - const allowDbExplorationText = screen.getByText( - /allow this database to be explored/i, - ); - const disableSQLLabDataPreviewQueriesCheckbox = screen.getByRole( - 'checkbox', - { - name: /Disable SQL Lab data preview queries/i, - }, - ); - const disableSQLLabDataPreviewQueriesText = screen.getByText( - /Disable SQL Lab data preview queries/i, - ); - - // ---------- Assertions ---------- - const visibleComponents = [ - closeButton, - advancedHeader, - basicHelper, - basicHeaderTitle, - basicHeaderSubtitle, - basicHeaderLink, - basicTab, - advancedTab, - sqlLabTab, - checkboxOffSVGs[0], - checkboxOffSVGs[1], - checkboxOffSVGs[2], - checkboxOffSVGs[3], - checkboxOffSVGs[4], - checkboxOffSVGs[5], - checkboxOffSVGs[6], - checkboxOffSVGs[7], - tooltipIcons[0], - tooltipIcons[1], - tooltipIcons[2], - tooltipIcons[3], - tooltipIcons[4], - tooltipIcons[5], - tooltipIcons[6], - tooltipIcons[7], - exposeInSQLLabText, - allowCTASText, - allowCVASText, - CTASCVASLabelText, - CTASCVASInput, - CTASCVASHelperText, - allowDMLText, - allowMultiSchemaMDFetchText, - enableQueryCostEstimationText, - allowDbExplorationText, - disableSQLLabDataPreviewQueriesText, - ]; - // These components exist in the DOM but are not visible - const invisibleComponents = [ - exposeInSQLLabCheckbox, - allowCTASCheckbox, - allowCVASCheckbox, - allowDMLCheckbox, - allowMultiSchemaMDFetchCheckbox, - enableQueryCostEstimationCheckbox, - allowDbExplorationCheckbox, - disableSQLLabDataPreviewQueriesCheckbox, - ]; - - visibleComponents.forEach(component => { - expect(component).toBeVisible(); - }); - invisibleComponents.forEach(component => { - expect(component).not.toBeVisible(); - }); - expect(checkboxOffSVGs).toHaveLength(8); - expect(tooltipIcons).toHaveLength(8); - }); - - it('renders the "Advanced" - PERFORMANCE tab correctly', async () => { - // ---------- Components ---------- - // On step 1, click dbButton to access step 2 - userEvent.click( - screen.getByRole('button', { - name: /sqlite/i, - }), - ); - // Click the "Advanced" tab - userEvent.click(screen.getByRole('tab', { name: /advanced/i })); - // Click the "Performance" tab - userEvent.click( - screen.getByRole('tab', { - name: /right performance adjust performance settings of this database\./i, - }), - ); - - // ----- BEGIN STEP 2 (ADVANCED - PERFORMANCE) - // <TabHeader> - AntD header - const closeButton = screen.getByRole('button', { name: /close/i }); - const advancedHeader = screen.getByRole('heading', { - name: /connect a database/i, - }); - // <ModalHeader> - Connection header - const basicHelper = screen.getByText(/step 2 of 2/i); - const basicHeaderTitle = screen.getByText(/enter primary credentials/i); - const basicHeaderSubtitle = screen.getByText( - /need help\? learn how to connect your database \./i, - ); - const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { - name: /here/i, - }); - // <Tabs> - Basic/Advanced tabs - const basicTab = screen.getByRole('tab', { name: /basic/i }); - const advancedTab = screen.getByRole('tab', { name: /advanced/i }); - // <ExtraOptions> - Advanced tabs - const sqlLabTab = screen.getByRole('tab', { - name: /right sql lab adjust how this database will interact with sql lab\./i, - }); - const performanceTab = screen.getByRole('tab', { - name: /right performance adjust performance settings of this database\./i, - }); - - // ---------- Assertions ---------- - const visibleComponents = [ - closeButton, - advancedHeader, - basicHelper, - basicHeaderTitle, - basicHeaderSubtitle, - basicHeaderLink, - basicTab, - advancedTab, - sqlLabTab, - performanceTab, - ]; - - visibleComponents.forEach(component => { - expect(component).toBeVisible(); - }); - }); - - it('renders the "Advanced" - SECURITY tab correctly', async () => { - // ---------- Components ---------- - // On step 1, click dbButton to access step 2 - userEvent.click( - screen.getByRole('button', { - name: /sqlite/i, - }), - ); - // Click the "Advanced" tab - userEvent.click(screen.getByRole('tab', { name: /advanced/i })); - // Click the "Security" tab - userEvent.click( - screen.getByRole('tab', { - name: /right security add extra connection information\./i, - }), - ); - - // ----- BEGIN STEP 2 (ADVANCED - SECURITY) - // <TabHeader> - AntD header - const closeButton = screen.getByRole('button', { name: /close/i }); - const advancedHeader = screen.getByRole('heading', { - name: /connect a database/i, - }); - // <ModalHeader> - Connection header - const basicHelper = screen.getByText(/step 2 of 2/i); - const basicHeaderTitle = screen.getByText(/enter primary credentials/i); - const basicHeaderSubtitle = screen.getByText( - /need help\? learn how to connect your database \./i, - ); - const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { - name: /here/i, - }); - // <Tabs> - Basic/Advanced tabs - const basicTab = screen.getByRole('tab', { name: /basic/i }); - const advancedTab = screen.getByRole('tab', { name: /advanced/i }); - // <ExtraOptions> - Advanced tabs - const sqlLabTab = screen.getByRole('tab', { - name: /right sql lab adjust how this database will interact with sql lab\./i, - }); - const performanceTab = screen.getByRole('tab', { - name: /right performance adjust performance settings of this database\./i, - }); - const securityTab = screen.getByRole('tab', { - name: /right security add extra connection information\./i, - }); - - // ---------- Assertions ---------- - const visibleComponents = [ - closeButton, - advancedHeader, - basicHelper, - basicHeaderTitle, - basicHeaderSubtitle, - basicHeaderLink, - basicTab, - advancedTab, - sqlLabTab, - performanceTab, - securityTab, - ]; - - visibleComponents.forEach(component => { - expect(component).toBeVisible(); - }); - }); - - it('renders the "Advanced" - OTHER tab correctly', async () => { - // ---------- Components ---------- - // On step 1, click dbButton to access step 2 - userEvent.click( - screen.getByRole('button', { - name: /sqlite/i, - }), - ); - // Click the "Advanced" tab - userEvent.click(screen.getByRole('tab', { name: /advanced/i })); - // Click the "Other" tab - userEvent.click( - screen.getByRole('tab', { - name: /right other additional settings\./i, - }), - ); - - // ----- BEGIN STEP 2 (ADVANCED - OTHER) - // <TabHeader> - AntD header - const closeButton = screen.getByRole('button', { name: /close/i }); - const advancedHeader = screen.getByRole('heading', { - name: /connect a database/i, - }); - // <ModalHeader> - Connection header - const basicHelper = screen.getByText(/step 2 of 2/i); - const basicHeaderTitle = screen.getByText(/enter primary credentials/i); - const basicHeaderSubtitle = screen.getByText( - /need help\? learn how to connect your database \./i, - ); - const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { - name: /here/i, - }); - // <Tabs> - Basic/Advanced tabs - const basicTab = screen.getByRole('tab', { name: /basic/i }); - const advancedTab = screen.getByRole('tab', { name: /advanced/i }); - // <ExtraOptions> - Advanced tabs - const sqlLabTab = screen.getByRole('tab', { - name: /right sql lab adjust how this database will interact with sql lab\./i, - }); - const performanceTab = screen.getByRole('tab', { - name: /right performance adjust performance settings of this database\./i, - }); - const securityTab = screen.getByRole('tab', { - name: /right security add extra connection information\./i, - }); - const otherTab = screen.getByRole('tab', { - name: /right other additional settings\./i, - }); - - // ---------- Assertions ---------- - const visibleComponents = [ - closeButton, - advancedHeader, - basicHelper, - basicHeaderTitle, - basicHeaderSubtitle, - basicHeaderLink, - basicTab, - advancedTab, - sqlLabTab, - performanceTab, - securityTab, - otherTab, - ]; - - visibleComponents.forEach(component => { - expect(component).toBeVisible(); - }); - }); - - it('Dynamic form', async () => { - // ---------- Components ---------- - // On step 1, click dbButton to access step 2 - userEvent.click( - screen.getByRole('button', { - name: /postgresql/i, - }), - ); - - expect.anything(); - }); - }); - - describe('Functional: Create new database', () => { - it('directs databases to the appropriate form (dynamic vs. SQL Alchemy)', () => { - // ---------- Dynamic example (3-step form) - // Click the PostgreSQL button to enter the dynamic form - const postgreSQLButton = screen.getByRole('button', { - name: /postgresql/i, - }); - userEvent.click(postgreSQLButton); - - // Dynamic form has 3 steps, seeing this text means the dynamic form is present - const dynamicFormStepText = screen.getByText(/step 2 of 3/i); - - expect(dynamicFormStepText).toBeVisible(); - - // ---------- SQL Alchemy example (2-step form) - // Click the back button to go back to step 1, - // then click the SQLite button to enter the SQL Alchemy form - const backButton = screen.getByRole('button', { name: /back/i }); - userEvent.click(backButton); - - const sqliteButton = screen.getByRole('button', { - name: /sqlite/i, - }); - userEvent.click(sqliteButton); - - // SQL Alchemy form has 2 steps, seeing this text means the SQL Alchemy form is present - const sqlAlchemyFormStepText = screen.getByText(/step 2 of 2/i); - - expect(sqlAlchemyFormStepText).toBeVisible(); - }); - - describe('SQL Alchemy form flow', () => { - beforeEach(() => { - userEvent.click( - screen.getByRole('button', { - name: /sqlite/i, - }), - ); - }); - - it('enters step 2 of 2 when proper database is selected', () => { - const step2text = screen.getByText(/step 2 of 2/i); - expect(step2text).toBeVisible(); - }); - - it('runs fetchResource when "Connect" is clicked', () => { - /* ---------- 🐞 TODO (lyndsiWilliams): function mock is not currently working 🐞 ---------- - - // Mock useSingleViewResource - const mockUseSingleViewResource = jest.fn(); - mockUseSingleViewResource.mockImplementation(useSingleViewResource); - - const { fetchResource } = mockUseSingleViewResource('database'); - - // Invalid hook call? - userEvent.click(screen.getByRole('button', { name: 'Connect' })); - expect(fetchResource).toHaveBeenCalled(); - - The line below makes the linter happy */ - expect.anything(); - }); - - describe('step 2 component interaction', () => { - it('properly interacts with textboxes', () => { - const dbNametextBox = screen.getByTestId('database-name-input'); - expect(dbNametextBox).toHaveValue('SQLite'); - - userEvent.type(dbNametextBox, 'Different text'); - expect(dbNametextBox).toHaveValue('SQLiteDifferent text'); - - const sqlAlchemyURItextBox = screen.getByTestId( - 'sqlalchemy-uri-input', - ); - expect(sqlAlchemyURItextBox).toHaveValue(''); - - userEvent.type(sqlAlchemyURItextBox, 'Different text'); - expect(sqlAlchemyURItextBox).toHaveValue('Different text'); - }); - - it('runs testDatabaseConnection when "TEST CONNECTION" is clicked', () => { - /* ---------- 🐞 TODO (lyndsiWilliams): function mock is not currently working 🐞 ---------- - - // Mock testDatabaseConnection - const mockTestDatabaseConnection = jest.fn(); - mockTestDatabaseConnection.mockImplementation(testDatabaseConnection); - - userEvent.click( - screen.getByRole('button', { - name: /test connection/i, - }), - ); - - expect(mockTestDatabaseConnection).toHaveBeenCalled(); - - The line below makes the linter happy */ - expect.anything(); - }); - }); - }); - - describe('Dynamic form flow', () => { - beforeEach(() => { - userEvent.click( - screen.getByRole('button', { - name: /postgresql/i, - }), - ); - }); - - it('enters step 2 of 3 when proper database is selected', () => { - const step2of3text = screen.getByText(/step 2 of 3/i); - expect(step2of3text).toBeVisible(); - }); - - it('enters form credentials and runs fetchResource when "Connect" is clicked', () => { - const textboxes = screen.getAllByRole('textbox'); - const hostField = textboxes[0]; - const portField = screen.getByRole('spinbutton'); - const databaseNameField = textboxes[1]; - const usernameField = textboxes[2]; - const passwordField = textboxes[3]; - - expect(hostField).toHaveValue(''); - expect(portField).toHaveValue(null); - expect(databaseNameField).toHaveValue(''); - expect(usernameField).toHaveValue(''); - expect(passwordField).toHaveValue(''); - - userEvent.type(hostField, 'localhost'); - userEvent.type(portField, '5432'); - userEvent.type(databaseNameField, 'postgres'); - userEvent.type(usernameField, 'testdb'); - userEvent.type(passwordField, 'demoPassword'); - - expect(hostField).toHaveValue('localhost'); - expect(portField).toHaveValue(5432); - expect(databaseNameField).toHaveValue('postgres'); - expect(usernameField).toHaveValue('testdb'); - expect(passwordField).toHaveValue('demoPassword'); - - /* ---------- 🐞 TODO (lyndsiWilliams): function mock is not currently working 🐞 ---------- - - // Mock useSingleViewResource - const mockUseSingleViewResource = jest.fn(); - mockUseSingleViewResource.mockImplementation(useSingleViewResource); - - const { fetchResource } = mockUseSingleViewResource('database'); - - // Invalid hook call? - userEvent.click(screen.getByRole('button', { name: 'Connect' })); - expect(fetchResource).toHaveBeenCalled(); - - */ - }); - }); - - describe('Import database flow', () => { - it('imports a file', () => { - const importDbButton = screen.getByTestId('import-database-btn'); - expect(importDbButton).toBeVisible(); - - const testFile = new File([new ArrayBuffer(1)], 'model_export.zip'); - - userEvent.click(importDbButton); - userEvent.upload(importDbButton, testFile); - - expect(importDbButton.files[0]).toStrictEqual(testFile); - expect(importDbButton.files.item(0)).toStrictEqual(testFile); - expect(importDbButton.files).toHaveLength(1); - }); - }); - }); - - describe('DatabaseModal w/ Deeplinking Engine', () => { - const renderAndWait = async () => { - const mounted = act(async () => { - render(<DatabaseModal {...dbProps} dbEngine="PostgreSQL" />, { - useRedux: true, - }); - }); - - return mounted; - }; - - beforeEach(async () => { - await renderAndWait(); - }); - - it('enters step 2 of 3 when proper database is selected', () => { - const step2of3text = screen.getByText(/step 2 of 3/i); - expect(step2of3text).toBeVisible(); - }); - }); -}); diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.tsx new file mode 100644 index 000000000000..32cc16b04f45 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.tsx @@ -0,0 +1,2101 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import fetchMock from 'fetch-mock'; +import userEvent from '@testing-library/user-event'; +import { + render, + screen, + within, + cleanup, + act, + waitFor, +} from 'spec/helpers/testing-library'; +import { + DatabaseObject, + CONFIGURATION_METHOD, +} from 'src/views/CRUD/data/database/types'; +import { getExtensionsRegistry } from '@superset-ui/core'; +import setupExtensions from 'src/setup/setupExtensions'; +import * as hooks from 'src/views/CRUD/hooks'; +import DatabaseModal, { + dbReducer, + DBReducerActionType, + ActionType, +} from './index'; + +jest.mock('@superset-ui/core', () => ({ + ...jest.requireActual('@superset-ui/core'), + isFeatureEnabled: () => true, +})); + +const mockHistoryPush = jest.fn(); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), +})); + +const dbProps = { + show: true, + database_name: 'my database', + sqlalchemy_uri: 'postgres://superset:superset@something:1234/superset', + onHide: () => {}, +}; + +const DATABASE_FETCH_ENDPOINT = 'glob:*/api/v1/database/10'; +const AVAILABLE_DB_ENDPOINT = 'glob:*/api/v1/database/available*'; +const VALIDATE_PARAMS_ENDPOINT = 'glob:*/api/v1/database/validate_parameters*'; +const DATABASE_CONNECT_ENDPOINT = 'glob:*/api/v1/database/'; + +fetchMock.post(DATABASE_CONNECT_ENDPOINT, { + id: 10, + result: { + configuration_method: 'sqlalchemy_form', + database_name: 'Other2', + driver: 'apsw', + expose_in_sqllab: true, + extra: '{"allows_virtual_table_explore":true}', + sqlalchemy_uri: 'gsheets://', + }, + json: 'foo', +}); + +fetchMock.config.overwriteRoutes = true; +fetchMock.get(DATABASE_FETCH_ENDPOINT, { + result: { + id: 10, + database_name: 'my database', + expose_in_sqllab: false, + allow_ctas: false, + allow_cvas: false, + configuration_method: 'sqlalchemy_form', + }, +}); +fetchMock.mock(AVAILABLE_DB_ENDPOINT, { + databases: [ + { + available_drivers: ['psycopg2'], + default_driver: 'psycopg2', + engine: 'postgresql', + name: 'PostgreSQL', + parameters: { + properties: { + database: { + description: 'Database name', + type: 'string', + }, + encryption: { + description: 'Use an encrypted connection to the database', + type: 'boolean', + }, + host: { + description: 'Hostname or IP address', + type: 'string', + }, + password: { + description: 'Password', + nullable: true, + type: 'string', + }, + port: { + description: 'Database port', + format: 'int32', + maximum: 65536, + minimum: 0, + type: 'integer', + }, + query: { + additionalProperties: {}, + description: 'Additional parameters', + type: 'object', + }, + username: { + description: 'Username', + nullable: true, + type: 'string', + }, + }, + required: ['database', 'host', 'port', 'username'], + type: 'object', + }, + preferred: true, + sqlalchemy_uri_placeholder: + 'postgresql://user:password@host:port/dbname[?key=value&key=value...]', + engine_information: { + supports_file_upload: true, + disable_ssh_tunneling: false, + }, + }, + { + available_drivers: ['rest'], + engine: 'presto', + name: 'Presto', + preferred: true, + engine_information: { + supports_file_upload: true, + disable_ssh_tunneling: false, + }, + }, + { + available_drivers: ['mysqldb'], + default_driver: 'mysqldb', + engine: 'mysql', + name: 'MySQL', + parameters: { + properties: { + database: { + description: 'Database name', + type: 'string', + }, + encryption: { + description: 'Use an encrypted connection to the database', + type: 'boolean', + }, + host: { + description: 'Hostname or IP address', + type: 'string', + }, + password: { + description: 'Password', + nullable: true, + type: 'string', + }, + port: { + description: 'Database port', + format: 'int32', + maximum: 65536, + minimum: 0, + type: 'integer', + }, + query: { + additionalProperties: {}, + description: 'Additional parameters', + type: 'object', + }, + username: { + description: 'Username', + nullable: true, + type: 'string', + }, + }, + required: ['database', 'host', 'port', 'username'], + type: 'object', + }, + preferred: true, + sqlalchemy_uri_placeholder: + 'mysql://user:password@host:port/dbname[?key=value&key=value...]', + engine_information: { + supports_file_upload: true, + disable_ssh_tunneling: false, + }, + }, + { + available_drivers: ['pysqlite'], + engine: 'sqlite', + name: 'SQLite', + preferred: true, + engine_information: { + supports_file_upload: true, + disable_ssh_tunneling: false, + }, + }, + { + available_drivers: ['rest'], + engine: 'druid', + name: 'Apache Druid', + preferred: false, + engine_information: { + supports_file_upload: true, + disable_ssh_tunneling: false, + }, + }, + { + available_drivers: ['bigquery'], + default_driver: 'bigquery', + engine: 'bigquery', + name: 'Google BigQuery', + parameters: { + properties: { + credentials_info: { + description: 'Contents of BigQuery JSON credentials.', + type: 'string', + 'x-encrypted-extra': true, + }, + query: { + type: 'object', + }, + }, + type: 'object', + }, + preferred: false, + sqlalchemy_uri_placeholder: 'bigquery://{project_id}', + engine_information: { + supports_file_upload: true, + disable_ssh_tunneling: true, + }, + }, + { + available_drivers: ['rest'], + default_driver: 'apsw', + engine: 'gsheets', + name: 'Google Sheets', + preferred: false, + engine_information: { + supports_file_upload: false, + disable_ssh_tunneling: true, + }, + }, + { + available_drivers: ['connector'], + default_driver: 'connector', + engine: 'databricks', + name: 'Databricks', + parameters: { + properties: { + access_token: { + type: 'string', + }, + database: { + type: 'string', + }, + host: { + type: 'string', + }, + http_path: { + type: 'string', + }, + port: { + format: 'int32', + type: 'integer', + }, + }, + required: ['access_token', 'database', 'host', 'http_path', 'port'], + type: 'object', + }, + preferred: true, + sqlalchemy_uri_placeholder: + 'databricks+connector://token:{access_token}@{host}:{port}/{database_name}', + }, + ], +}); +fetchMock.post(VALIDATE_PARAMS_ENDPOINT, { + message: 'OK', +}); + +const databaseFixture: DatabaseObject = { + backend: 'postgres', + configuration_method: CONFIGURATION_METHOD.DYNAMIC_FORM, + database_name: 'Postgres', + name: 'PostgresDB', + is_managed_externally: false, + driver: 'psycopg2', +}; + +describe('DatabaseModal', () => { + const renderAndWait = async () => { + const mounted = act(async () => { + render(<DatabaseModal {...dbProps} />, { + useRedux: true, + }); + }); + + return mounted; + }; + + beforeEach(async () => { + await renderAndWait(); + }); + + afterEach(cleanup); + + describe('Visual: New database connection', () => { + test('renders the initial load of Step 1 correctly', () => { + // ---------- Components ---------- + // <TabHeader> - AntD header + const closeButton = screen.getByLabelText('Close'); + const step1Header = screen.getByRole('heading', { + name: /connect a database/i, + }); + // <ModalHeader> - Connection header + const step1Helper = screen.getByText(/step 1 of 3/i); + const selectDbHeader = screen.getByRole('heading', { + name: /select a database to connect/i, + }); + // <IconButton> - Preferred database buttons + const preferredDbButtonPostgreSQL = screen.getByRole('button', { + name: /postgresql/i, + }); + const preferredDbTextPostgreSQL = within( + preferredDbButtonPostgreSQL, + ).getByText(/postgresql/i); + const preferredDbButtonPresto = screen.getByRole('button', { + name: /presto/i, + }); + const preferredDbTextPresto = within(preferredDbButtonPresto).getByText( + /presto/i, + ); + const preferredDbButtonMySQL = screen.getByRole('button', { + name: /mysql/i, + }); + const preferredDbTextMySQL = within(preferredDbButtonMySQL).getByText( + /mysql/i, + ); + const preferredDbButtonSQLite = screen.getByRole('button', { + name: /sqlite/i, + }); + const preferredDbTextSQLite = within(preferredDbButtonSQLite).getByText( + /sqlite/i, + ); + // renderAvailableSelector() => <Select> - Supported databases selector + const supportedDbsHeader = screen.getByRole('heading', { + name: /or choose from a list of other databases we support:/i, + }); + const selectorLabel = screen.getByText(/supported databases/i); + const selectorPlaceholder = screen.getByText(/choose a database\.\.\./i); + const selectorArrow = screen.getByRole('img', { + name: /down/i, + hidden: true, + }); + + const footer = document.getElementsByClassName('ant-modal-footer'); + // ---------- TODO (lyndsiWilliams): Selector options, can't seem to get these to render properly. + + // renderAvailableSelector() => <Alert> - Supported databases alert + const alertIcon = screen.getByRole('img', { name: /info icon/i }); + const alertMessage = screen.getByText(/want to add a new database\?/i); + const alertDescription = screen.getByText( + /any databases that allow connections via sql alchemy uris can be added\. learn about how to connect a database driver \./i, + ); + const alertLink = screen.getByRole('link', { name: /here/i }); + + // ---------- Assertions ---------- + const visibleComponents = [ + closeButton, + step1Header, + step1Helper, + selectDbHeader, + supportedDbsHeader, + selectorLabel, + selectorPlaceholder, + selectorArrow, + alertIcon, + alertMessage, + alertDescription, + alertLink, + preferredDbButtonPostgreSQL, + preferredDbButtonPresto, + preferredDbButtonMySQL, + preferredDbButtonSQLite, + preferredDbTextPostgreSQL, + preferredDbTextPresto, + preferredDbTextMySQL, + preferredDbTextSQLite, + ]; + + visibleComponents.forEach(component => { + expect(component).toBeVisible(); + }); + // there should be a footer but it should not have any buttons in it + expect(footer[0]).toBeEmptyDOMElement(); + }); + + test('renders the "Basic" tab of SQL Alchemy form (step 2 of 2) correctly', async () => { + // On step 1, click dbButton to access SQL Alchemy form + userEvent.click( + screen.getByRole('button', { + name: /sqlite/i, + }), + ); + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); + + // ---------- Components ---------- + // <TabHeader> - AntD header + const closeButton = screen.getByRole('button', { name: /close/i }); + const basicHeader = screen.getByRole('heading', { + name: /connect a database/i, + }); + // <ModalHeader> - Connection header + const basicHelper = screen.getByText(/step 2 of 2/i); + const basicHeaderTitle = screen.getByText(/enter primary credentials/i); + const basicHeaderSubtitle = screen.getByText( + /need help\? learn how to connect your database \./i, + ); + const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { + name: /here/i, + }); + // <Tabs> - Basic/Advanced tabs + const basicTab = screen.getByRole('tab', { name: /basic/i }); + const advancedTab = screen.getByRole('tab', { name: /advanced/i }); + // <StyledBasicTab> - Basic tab's content + const displayNameLabel = screen.getByText(/display name*/i); + const displayNameInput = screen.getByTestId('database-name-input'); + const displayNameHelper = screen.getByText( + /pick a name to help you identify this database\./i, + ); + const SQLURILabel = screen.getByText(/sqlalchemy uri*/i); + const SQLURIInput = screen.getByTestId('sqlalchemy-uri-input'); + const SQLURIHelper = screen.getByText( + /refer to the for more information on how to structure your uri\./i, + ); + // <SSHTunnelForm> - Basic tab's SSH Tunnel Form + const SSHTunnelingToggle = screen.getByTestId('ssh-tunnel-switch'); + userEvent.click(SSHTunnelingToggle); + const SSHTunnelServerAddressInput = screen.getByTestId( + 'ssh-tunnel-server_address-input', + ); + const SSHTunnelServerPortInput = screen.getByTestId( + 'ssh-tunnel-server_port-input', + ); + const SSHTunnelUsernameInput = screen.getByTestId( + 'ssh-tunnel-username-input', + ); + const SSHTunnelPasswordInput = screen.getByTestId( + 'ssh-tunnel-password-input', + ); + const testConnectionButton = screen.getByRole('button', { + name: /test connection/i, + }); + // <Alert> - Basic tab's alert + const alertIcon = screen.getByRole('img', { name: /info icon/i }); + const alertMessage = screen.getByText( + /additional fields may be required/i, + ); + const alertDescription = screen.getByText( + /select databases require additional fields to be completed in the advanced tab to successfully connect the database\. learn what requirements your databases has \./i, + ); + const alertLink = within(alertDescription).getByRole('link', { + name: /here/i, + }); + // renderModalFooter() - Basic tab's footer + const backButton = screen.getByRole('button', { name: /back/i }); + const connectButton = screen.getByRole('button', { name: 'Connect' }); + + // ---------- Assertions ---------- + const visibleComponents = [ + closeButton, + basicHeader, + basicHelper, + basicHeaderTitle, + basicHeaderSubtitle, + basicHeaderLink, + basicTab, + advancedTab, + displayNameLabel, + displayNameInput, + displayNameHelper, + SQLURILabel, + SQLURIInput, + SQLURIHelper, + SSHTunnelingToggle, + SSHTunnelServerAddressInput, + SSHTunnelServerPortInput, + SSHTunnelUsernameInput, + SSHTunnelPasswordInput, + testConnectionButton, + alertIcon, + alertMessage, + alertDescription, + alertLink, + backButton, + connectButton, + ]; + + visibleComponents.forEach(component => { + expect(component).toBeVisible(); + }); + }); + + test('renders the unexpanded "Advanced" tab correctly', async () => { + // On step 1, click dbButton to access step 2 + userEvent.click( + screen.getByRole('button', { + name: /sqlite/i, + }), + ); + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); + // Click the "Advanced" tab + userEvent.click(screen.getByRole('tab', { name: /advanced/i })); + + // ---------- Components ---------- + // <TabHeader> - AntD header + const closeButton = screen.getByRole('button', { name: /close/i }); + const advancedHeader = screen.getByRole('heading', { + name: /connect a database/i, + }); + // <ModalHeader> - Connection header + const basicHelper = screen.getByText(/step 2 of 2/i); + const basicHeaderTitle = screen.getByText(/enter primary credentials/i); + const basicHeaderSubtitle = screen.getByText( + /need help\? learn how to connect your database \./i, + ); + const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { + name: /here/i, + }); + // <Tabs> - Basic/Advanced tabs + const basicTab = screen.getByRole('tab', { name: /basic/i }); + const advancedTab = screen.getByRole('tab', { name: /advanced/i }); + // <ExtraOptions> - Advanced tabs + const sqlLabTab = screen.getByRole('tab', { + name: /right sql lab adjust how this database will interact with sql lab\./i, + }); + const sqlLabTabArrow = within(sqlLabTab).getByRole('img', { + name: /right/i, + }); + const sqlLabTabHeading = screen.getByRole('heading', { + name: /sql lab/i, + }); + const performanceTab = screen.getByRole('tab', { + name: /right performance adjust performance settings of this database\./i, + }); + const performanceTabArrow = within(performanceTab).getByRole('img', { + name: /right/i, + }); + const performanceTabHeading = screen.getByRole('heading', { + name: /performance/i, + }); + const securityTab = screen.getByRole('tab', { + name: /right security add extra connection information\./i, + }); + const securityTabArrow = within(securityTab).getByRole('img', { + name: /right/i, + }); + const securityTabHeading = screen.getByRole('heading', { + name: /security/i, + }); + const otherTab = screen.getByRole('tab', { + name: /right other additional settings\./i, + }); + const otherTabArrow = within(otherTab).getByRole('img', { + name: /right/i, + }); + const otherTabHeading = screen.getByRole('heading', { name: /other/i }); + // renderModalFooter() - Advanced tab's footer + const backButton = screen.getByRole('button', { name: /back/i }); + const connectButton = screen.getByRole('button', { name: 'Connect' }); + + // ---------- Assertions ---------- + const visibleComponents = [ + closeButton, + advancedHeader, + basicHelper, + basicHeaderTitle, + basicHeaderSubtitle, + basicHeaderLink, + basicTab, + advancedTab, + sqlLabTab, + sqlLabTabArrow, + sqlLabTabHeading, + performanceTab, + performanceTabArrow, + performanceTabHeading, + securityTab, + securityTabArrow, + securityTabHeading, + otherTab, + otherTabArrow, + otherTabHeading, + backButton, + connectButton, + ]; + + visibleComponents.forEach(component => { + expect(component).toBeVisible(); + }); + }); + + test('renders the "Advanced" - SQL LAB tab correctly (unexpanded)', async () => { + // ---------- Components ---------- + // On step 1, click dbButton to access step 2 + userEvent.click( + screen.getByRole('button', { + name: /sqlite/i, + }), + ); + // Click the "Advanced" tab + userEvent.click(screen.getByRole('tab', { name: /advanced/i })); + // Click the "SQL Lab" tab + userEvent.click( + screen.getByRole('tab', { + name: /right sql lab adjust how this database will interact with sql lab\./i, + }), + ); + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); + + // ----- BEGIN STEP 2 (ADVANCED - SQL LAB) + // <TabHeader> - AntD header + const closeButton = screen.getByRole('button', { name: /close/i }); + const advancedHeader = screen.getByRole('heading', { + name: /connect a database/i, + }); + // <ModalHeader> - Connection header + const basicHelper = screen.getByText(/step 2 of 2/i); + const basicHeaderTitle = screen.getByText(/enter primary credentials/i); + const basicHeaderSubtitle = screen.getByText( + /need help\? learn how to connect your database \./i, + ); + const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { + name: /here/i, + }); + // <Tabs> - Basic/Advanced tabs + const basicTab = screen.getByRole('tab', { name: /basic/i }); + const advancedTab = screen.getByRole('tab', { name: /advanced/i }); + // <ExtraOptions> - Advanced tabs + const sqlLabTab = screen.getByRole('tab', { + name: /right sql lab adjust how this database will interact with sql lab\./i, + }); + // These are the checkbox SVGs that cover the actual checkboxes + const checkboxOffSVGs = screen.getAllByRole('img', { + name: /checkbox-off/i, + }); + const tooltipIcons = screen.getAllByRole('img', { + name: /info-solid_small/i, + }); + const exposeInSQLLabCheckbox = screen.getByRole('checkbox', { + name: /expose database in sql lab/i, + }); + // This is both the checkbox and it's respective SVG + // const exposeInSQLLabCheckboxSVG = checkboxOffSVGs[0].parentElement; + const exposeInSQLLabText = screen.getByText( + /expose database in sql lab/i, + ); + const allowCTASCheckbox = screen.getByRole('checkbox', { + name: /allow create table as/i, + }); + const allowCTASText = screen.getByText(/allow create table as/i); + const allowCVASCheckbox = screen.getByRole('checkbox', { + name: /allow create table as/i, + }); + const allowCVASText = screen.getByText(/allow create table as/i); + const CTASCVASLabelText = screen.getByText(/ctas & cvas schema/i); + // This grabs the whole input by placeholder text + const CTASCVASInput = screen.getByPlaceholderText( + /create or select schema\.\.\./i, + ); + const CTASCVASHelperText = screen.getByText( + /force all tables and views to be created in this schema when clicking ctas or cvas in sql lab\./i, + ); + const allowDMLCheckbox = screen.getByRole('checkbox', { + name: /allow dml/i, + }); + const allowDMLText = screen.getByText(/allow dml/i); + const enableQueryCostEstimationCheckbox = screen.getByRole('checkbox', { + name: /enable query cost estimation/i, + }); + const enableQueryCostEstimationText = screen.getByText( + /enable query cost estimation/i, + ); + const allowDbExplorationCheckbox = screen.getByRole('checkbox', { + name: /allow this database to be explored/i, + }); + const allowDbExplorationText = screen.getByText( + /allow this database to be explored/i, + ); + const disableSQLLabDataPreviewQueriesCheckbox = screen.getByRole( + 'checkbox', + { + name: /Disable SQL Lab data preview queries/i, + }, + ); + const disableSQLLabDataPreviewQueriesText = screen.getByText( + /Disable SQL Lab data preview queries/i, + ); + + // ---------- Assertions ---------- + const visibleComponents = [ + closeButton, + advancedHeader, + basicHelper, + basicHeaderTitle, + basicHeaderSubtitle, + basicHeaderLink, + basicTab, + advancedTab, + sqlLabTab, + checkboxOffSVGs[0], + checkboxOffSVGs[1], + checkboxOffSVGs[2], + checkboxOffSVGs[3], + checkboxOffSVGs[4], + tooltipIcons[0], + tooltipIcons[1], + tooltipIcons[2], + tooltipIcons[3], + tooltipIcons[4], + tooltipIcons[5], + tooltipIcons[6], + exposeInSQLLabText, + allowCTASText, + allowCVASText, + CTASCVASLabelText, + CTASCVASInput, + CTASCVASHelperText, + allowDMLText, + enableQueryCostEstimationText, + allowDbExplorationText, + disableSQLLabDataPreviewQueriesText, + ]; + // These components exist in the DOM but are not visible + const invisibleComponents = [ + exposeInSQLLabCheckbox, + allowCTASCheckbox, + allowCVASCheckbox, + allowDMLCheckbox, + enableQueryCostEstimationCheckbox, + allowDbExplorationCheckbox, + disableSQLLabDataPreviewQueriesCheckbox, + ]; + visibleComponents.forEach(component => { + expect(component).toBeVisible(); + }); + invisibleComponents.forEach(component => { + expect(component).not.toBeVisible(); + }); + expect(checkboxOffSVGs).toHaveLength(5); + expect(tooltipIcons).toHaveLength(7); + }); + + test('renders the "Advanced" - PERFORMANCE tab correctly', async () => { + // ---------- Components ---------- + // On step 1, click dbButton to access step 2 + userEvent.click( + screen.getByRole('button', { + name: /sqlite/i, + }), + ); + // Click the "Advanced" tab + userEvent.click(screen.getByRole('tab', { name: /advanced/i })); + // Click the "Performance" tab + userEvent.click( + screen.getByRole('tab', { + name: /right performance adjust performance settings of this database\./i, + }), + ); + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); + + // ----- BEGIN STEP 2 (ADVANCED - PERFORMANCE) + // <TabHeader> - AntD header + const closeButton = screen.getByRole('button', { name: /close/i }); + const advancedHeader = screen.getByRole('heading', { + name: /connect a database/i, + }); + // <ModalHeader> - Connection header + const basicHelper = screen.getByText(/step 2 of 2/i); + const basicHeaderTitle = screen.getByText(/enter primary credentials/i); + const basicHeaderSubtitle = screen.getByText( + /need help\? learn how to connect your database \./i, + ); + const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { + name: /here/i, + }); + // <Tabs> - Basic/Advanced tabs + const basicTab = screen.getByRole('tab', { name: /basic/i }); + const advancedTab = screen.getByRole('tab', { name: /advanced/i }); + // <ExtraOptions> - Advanced tabs + const sqlLabTab = screen.getByRole('tab', { + name: /right sql lab adjust how this database will interact with sql lab\./i, + }); + const performanceTab = screen.getByRole('tab', { + name: /right performance adjust performance settings of this database\./i, + }); + + // ---------- Assertions ---------- + const visibleComponents = [ + closeButton, + advancedHeader, + basicHelper, + basicHeaderTitle, + basicHeaderSubtitle, + basicHeaderLink, + basicTab, + advancedTab, + sqlLabTab, + performanceTab, + ]; + + visibleComponents.forEach(component => { + expect(component).toBeVisible(); + }); + }); + + test('renders the "Advanced" - SECURITY tab correctly', async () => { + // ---------- Components ---------- + // On step 1, click dbButton to access step 2 + userEvent.click( + screen.getByRole('button', { + name: /sqlite/i, + }), + ); + // Click the "Advanced" tab + userEvent.click(screen.getByRole('tab', { name: /advanced/i })); + // Click the "Security" tab + userEvent.click( + screen.getByRole('tab', { + name: /right security add extra connection information\./i, + }), + ); + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); + + // ----- BEGIN STEP 2 (ADVANCED - SECURITY) + // <TabHeader> - AntD header + const closeButton = screen.getByRole('button', { name: /close/i }); + const advancedHeader = screen.getByRole('heading', { + name: /connect a database/i, + }); + // <ModalHeader> - Connection header + const basicHelper = screen.getByText(/step 2 of 2/i); + const basicHeaderTitle = screen.getByText(/enter primary credentials/i); + const basicHeaderSubtitle = screen.getByText( + /need help\? learn how to connect your database \./i, + ); + const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { + name: /here/i, + }); + // <Tabs> - Basic/Advanced tabs + const basicTab = screen.getByRole('tab', { name: /basic/i }); + const advancedTab = screen.getByRole('tab', { name: /advanced/i }); + // <ExtraOptions> - Advanced tabs + const sqlLabTab = screen.getByRole('tab', { + name: /right sql lab adjust how this database will interact with sql lab\./i, + }); + const performanceTab = screen.getByRole('tab', { + name: /right performance adjust performance settings of this database\./i, + }); + const securityTab = screen.getByRole('tab', { + name: /right security add extra connection information\./i, + }); + const allowFileUploadCheckbox = screen.getByRole('checkbox', { + name: /Allow file uploads to database/i, + }); + const allowFileUploadText = screen.getByText( + /Allow file uploads to database/i, + ); + + const schemasForFileUploadText = screen.queryByText( + /Schemas allowed for File upload/i, + ); + + const visibleComponents = [ + closeButton, + advancedHeader, + basicHelper, + basicHeaderTitle, + basicHeaderSubtitle, + basicHeaderLink, + basicTab, + advancedTab, + sqlLabTab, + performanceTab, + securityTab, + allowFileUploadText, + ]; + // These components exist in the DOM but are not visible + const invisibleComponents = [allowFileUploadCheckbox]; + + // ---------- Assertions ---------- + visibleComponents.forEach(component => { + expect(component).toBeVisible(); + }); + invisibleComponents.forEach(component => { + expect(component).not.toBeVisible(); + }); + expect(schemasForFileUploadText).not.toBeInTheDocument(); + }); + + it('renders the "Advanced" - SECURITY tab correctly after selecting Allow file uploads', async () => { + // ---------- Components ---------- + // On step 1, click dbButton to access step 2 + userEvent.click( + screen.getByRole('button', { + name: /sqlite/i, + }), + ); + // Click the "Advanced" tab + userEvent.click(screen.getByRole('tab', { name: /advanced/i })); + // Click the "Security" tab + userEvent.click( + screen.getByRole('tab', { + name: /right security add extra connection information\./i, + }), + ); + // Click the "Allow file uploads" tab + + const allowFileUploadCheckbox = screen.getByRole('checkbox', { + name: /Allow file uploads to database/i, + }); + userEvent.click(allowFileUploadCheckbox); + + // ----- BEGIN STEP 2 (ADVANCED - SECURITY) + // <TabHeader> - AntD header + const closeButton = screen.getByRole('button', { name: /close/i }); + const advancedHeader = screen.getByRole('heading', { + name: /connect a database/i, + }); + // <ModalHeader> - Connection header + const basicHelper = screen.getByText(/step 2 of 2/i); + const basicHeaderTitle = screen.getByText(/enter primary credentials/i); + const basicHeaderSubtitle = screen.getByText( + /need help\? learn how to connect your database \./i, + ); + const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { + name: /here/i, + }); + // <Tabs> - Basic/Advanced tabs + const basicTab = screen.getByRole('tab', { name: /basic/i }); + const advancedTab = screen.getByRole('tab', { name: /advanced/i }); + // <ExtraOptions> - Advanced tabs + const sqlLabTab = screen.getByRole('tab', { + name: /right sql lab adjust how this database will interact with sql lab\./i, + }); + const performanceTab = screen.getByRole('tab', { + name: /right performance adjust performance settings of this database\./i, + }); + const securityTab = screen.getByRole('tab', { + name: /right security add extra connection information\./i, + }); + const allowFileUploadText = screen.getByText( + /Allow file uploads to database/i, + ); + + const schemasForFileUploadText = screen.queryByText( + /Schemas allowed for File upload/i, + ); + + const visibleComponents = [ + closeButton, + advancedHeader, + basicHelper, + basicHeaderTitle, + basicHeaderSubtitle, + basicHeaderLink, + basicTab, + advancedTab, + sqlLabTab, + performanceTab, + securityTab, + allowFileUploadText, + ]; + // These components exist in the DOM but are not visible + const invisibleComponents = [allowFileUploadCheckbox]; + + // ---------- Assertions ---------- + visibleComponents.forEach(component => { + expect(component).toBeVisible(); + }); + invisibleComponents.forEach(component => { + expect(component).not.toBeVisible(); + }); + expect(schemasForFileUploadText).toBeInTheDocument(); + }); + + test('renders the "Advanced" - OTHER tab correctly', async () => { + // ---------- Components ---------- + // On step 1, click dbButton to access step 2 + userEvent.click( + screen.getByRole('button', { + name: /sqlite/i, + }), + ); + // Click the "Advanced" tab + userEvent.click(screen.getByRole('tab', { name: /advanced/i })); + // Click the "Other" tab + userEvent.click( + screen.getByRole('tab', { + name: /right other additional settings\./i, + }), + ); + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); + + // ----- BEGIN STEP 2 (ADVANCED - OTHER) + // <TabHeader> - AntD header + const closeButton = screen.getByRole('button', { name: /close/i }); + const advancedHeader = screen.getByRole('heading', { + name: /connect a database/i, + }); + // <ModalHeader> - Connection header + const basicHelper = screen.getByText(/step 2 of 2/i); + const basicHeaderTitle = screen.getByText(/enter primary credentials/i); + const basicHeaderSubtitle = screen.getByText( + /need help\? learn how to connect your database \./i, + ); + const basicHeaderLink = within(basicHeaderSubtitle).getByRole('link', { + name: /here/i, + }); + // <Tabs> - Basic/Advanced tabs + const basicTab = screen.getByRole('tab', { name: /basic/i }); + const advancedTab = screen.getByRole('tab', { name: /advanced/i }); + // <ExtraOptions> - Advanced tabs + const sqlLabTab = screen.getByRole('tab', { + name: /right sql lab adjust how this database will interact with sql lab\./i, + }); + const performanceTab = screen.getByRole('tab', { + name: /right performance adjust performance settings of this database\./i, + }); + const securityTab = screen.getByRole('tab', { + name: /right security add extra connection information\./i, + }); + const otherTab = screen.getByRole('tab', { + name: /right other additional settings\./i, + }); + + // ---------- Assertions ---------- + const visibleComponents = [ + closeButton, + advancedHeader, + basicHelper, + basicHeaderTitle, + basicHeaderSubtitle, + basicHeaderLink, + basicTab, + advancedTab, + sqlLabTab, + performanceTab, + securityTab, + otherTab, + ]; + + visibleComponents.forEach(component => { + expect(component).toBeVisible(); + }); + }); + + test('Dynamic form', async () => { + // ---------- Components ---------- + // On step 1, click dbButton to access step 2 + userEvent.click( + screen.getByRole('button', { + name: /postgresql/i, + }), + ); + expect(await screen.findByText(/step 2 of 3/i)).toBeInTheDocument(); + + expect.anything(); + }); + }); + + describe('Functional: Create new database', () => { + test('directs databases to the appropriate form (dynamic vs. SQL Alchemy)', async () => { + // ---------- Dynamic example (3-step form) + // Click the PostgreSQL button to enter the dynamic form + const postgreSQLButton = screen.getByRole('button', { + name: /postgresql/i, + }); + userEvent.click(postgreSQLButton); + + // Dynamic form has 3 steps, seeing this text means the dynamic form is present + const dynamicFormStepText = screen.getByText(/step 2 of 3/i); + + expect(dynamicFormStepText).toBeVisible(); + + // ---------- SQL Alchemy example (2-step form) + // Click the back button to go back to step 1, + // then click the SQLite button to enter the SQL Alchemy form + const backButton = screen.getByRole('button', { name: /back/i }); + userEvent.click(backButton); + + const sqliteButton = screen.getByRole('button', { + name: /sqlite/i, + }); + userEvent.click(sqliteButton); + + // SQL Alchemy form has 2 steps, seeing this text means the SQL Alchemy form is present + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); + const sqlAlchemyFormStepText = screen.getByText(/step 2 of 2/i); + + expect(sqlAlchemyFormStepText).toBeVisible(); + }); + + describe('SQL Alchemy form flow', () => { + test('enters step 2 of 2 when proper database is selected', async () => { + userEvent.click( + screen.getByRole('button', { + name: /sqlite/i, + }), + ); + + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); + }); + + test('runs fetchResource when "Connect" is clicked', () => { + /* ---------- 🐞 TODO (lyndsiWilliams): function mock is not currently working 🐞 ---------- + + // Mock useSingleViewResource + const mockUseSingleViewResource = jest.fn(); + mockUseSingleViewResource.mockImplementation(useSingleViewResource); + + const { fetchResource } = mockUseSingleViewResource('database'); + + // Invalid hook call? + userEvent.click(screen.getByRole('button', { name: 'Connect' })); + expect(fetchResource).toHaveBeenCalled(); + + The line below makes the linter happy */ + expect.anything(); + }); + + describe('step 2 component interaction', () => { + test('properly interacts with textboxes', async () => { + userEvent.click( + screen.getByRole('button', { + name: /sqlite/i, + }), + ); + + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); + const dbNametextBox = screen.getByTestId('database-name-input'); + expect(dbNametextBox).toHaveValue('SQLite'); + + userEvent.type(dbNametextBox, 'Different text'); + expect(dbNametextBox).toHaveValue('SQLiteDifferent text'); + + const sqlAlchemyURItextBox = screen.getByTestId( + 'sqlalchemy-uri-input', + ); + expect(sqlAlchemyURItextBox).toHaveValue(''); + + userEvent.type(sqlAlchemyURItextBox, 'Different text'); + expect(sqlAlchemyURItextBox).toHaveValue('Different text'); + }); + + test('runs testDatabaseConnection when "TEST CONNECTION" is clicked', () => { + /* ---------- 🐞 TODO (lyndsiWilliams): function mock is not currently working 🐞 ---------- + + // Mock testDatabaseConnection + const mockTestDatabaseConnection = jest.fn(); + mockTestDatabaseConnection.mockImplementation(testDatabaseConnection); + + userEvent.click( + screen.getByRole('button', { + name: /test connection/i, + }), + ); + + expect(mockTestDatabaseConnection).toHaveBeenCalled(); + + The line below makes the linter happy */ + expect.anything(); + }); + }); + + describe('SSH Tunnel Form interaction', () => { + test('properly interacts with SSH Tunnel form textboxes for dynamic form', async () => { + userEvent.click( + screen.getByRole('button', { + name: /postgresql/i, + }), + ); + expect(await screen.findByText(/step 2 of 3/i)).toBeInTheDocument(); + const SSHTunnelingToggle = screen.getByTestId('ssh-tunnel-switch'); + userEvent.click(SSHTunnelingToggle); + const SSHTunnelServerAddressInput = screen.getByTestId( + 'ssh-tunnel-server_address-input', + ); + expect(SSHTunnelServerAddressInput).toHaveValue(''); + userEvent.type(SSHTunnelServerAddressInput, 'localhost'); + expect(SSHTunnelServerAddressInput).toHaveValue('localhost'); + const SSHTunnelServerPortInput = screen.getByTestId( + 'ssh-tunnel-server_port-input', + ); + expect(SSHTunnelServerPortInput).toHaveValue(''); + userEvent.type(SSHTunnelServerPortInput, '22'); + expect(SSHTunnelServerPortInput).toHaveValue('22'); + const SSHTunnelUsernameInput = screen.getByTestId( + 'ssh-tunnel-username-input', + ); + expect(SSHTunnelUsernameInput).toHaveValue(''); + userEvent.type(SSHTunnelUsernameInput, 'test'); + expect(SSHTunnelUsernameInput).toHaveValue('test'); + const SSHTunnelPasswordInput = screen.getByTestId( + 'ssh-tunnel-password-input', + ); + expect(SSHTunnelPasswordInput).toHaveValue(''); + userEvent.type(SSHTunnelPasswordInput, 'pass'); + expect(SSHTunnelPasswordInput).toHaveValue('pass'); + }); + + test('properly interacts with SSH Tunnel form textboxes', async () => { + userEvent.click( + screen.getByRole('button', { + name: /sqlite/i, + }), + ); + + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); + const SSHTunnelingToggle = screen.getByTestId('ssh-tunnel-switch'); + userEvent.click(SSHTunnelingToggle); + const SSHTunnelServerAddressInput = screen.getByTestId( + 'ssh-tunnel-server_address-input', + ); + expect(SSHTunnelServerAddressInput).toHaveValue(''); + userEvent.type(SSHTunnelServerAddressInput, 'localhost'); + expect(SSHTunnelServerAddressInput).toHaveValue('localhost'); + const SSHTunnelServerPortInput = screen.getByTestId( + 'ssh-tunnel-server_port-input', + ); + expect(SSHTunnelServerPortInput).toHaveValue(''); + userEvent.type(SSHTunnelServerPortInput, '22'); + expect(SSHTunnelServerPortInput).toHaveValue('22'); + const SSHTunnelUsernameInput = screen.getByTestId( + 'ssh-tunnel-username-input', + ); + expect(SSHTunnelUsernameInput).toHaveValue(''); + userEvent.type(SSHTunnelUsernameInput, 'test'); + expect(SSHTunnelUsernameInput).toHaveValue('test'); + const SSHTunnelPasswordInput = screen.getByTestId( + 'ssh-tunnel-password-input', + ); + expect(SSHTunnelPasswordInput).toHaveValue(''); + userEvent.type(SSHTunnelPasswordInput, 'pass'); + expect(SSHTunnelPasswordInput).toHaveValue('pass'); + }); + + test('if the SSH Tunneling toggle is not true, no inputs are displayed', async () => { + userEvent.click( + screen.getByRole('button', { + name: /sqlite/i, + }), + ); + + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); + const SSHTunnelingToggle = screen.getByTestId('ssh-tunnel-switch'); + expect(SSHTunnelingToggle).toBeVisible(); + const SSHTunnelServerAddressInput = screen.queryByTestId( + 'ssh-tunnel-server_address-input', + ); + expect(SSHTunnelServerAddressInput).not.toBeInTheDocument(); + const SSHTunnelServerPortInput = screen.queryByTestId( + 'ssh-tunnel-server_port-input', + ); + expect(SSHTunnelServerPortInput).not.toBeInTheDocument(); + const SSHTunnelUsernameInput = screen.queryByTestId( + 'ssh-tunnel-username-input', + ); + expect(SSHTunnelUsernameInput).not.toBeInTheDocument(); + const SSHTunnelPasswordInput = screen.queryByTestId( + 'ssh-tunnel-password-input', + ); + expect(SSHTunnelPasswordInput).not.toBeInTheDocument(); + }); + + test('If user changes the login method, the inputs change', async () => { + userEvent.click( + screen.getByRole('button', { + name: /sqlite/i, + }), + ); + + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); + const SSHTunnelingToggle = screen.getByTestId('ssh-tunnel-switch'); + userEvent.click(SSHTunnelingToggle); + const SSHTunnelUsePasswordInput = screen.getByTestId( + 'ssh-tunnel-use_password-radio', + ); + expect(SSHTunnelUsePasswordInput).toBeVisible(); + const SSHTunnelUsePrivateKeyInput = screen.getByTestId( + 'ssh-tunnel-use_private_key-radio', + ); + expect(SSHTunnelUsePrivateKeyInput).toBeVisible(); + const SSHTunnelPasswordInput = screen.getByTestId( + 'ssh-tunnel-password-input', + ); + // By default, we use Password as login method + expect(SSHTunnelPasswordInput).toBeVisible(); + // Change the login method to use private key + userEvent.click(SSHTunnelUsePrivateKeyInput); + const SSHTunnelPrivateKeyInput = screen.getByTestId( + 'ssh-tunnel-private_key-input', + ); + expect(SSHTunnelPrivateKeyInput).toBeVisible(); + const SSHTunnelPrivateKeyPasswordInput = screen.getByTestId( + 'ssh-tunnel-private_key_password-input', + ); + expect(SSHTunnelPrivateKeyPasswordInput).toBeVisible(); + }); + }); + }); + + describe('Dynamic form flow', () => { + test('enters step 2 of 3 when proper database is selected', async () => { + expect(await screen.findByText(/step 1 of 3/i)).toBeInTheDocument(); + userEvent.click( + screen.getByRole('button', { + name: /postgresql/i, + }), + ); + expect(await screen.findByText(/step 2 of 3/i)).toBeInTheDocument(); + + const step2of3text = screen.getByText(/step 2 of 3/i); + expect(step2of3text).toBeVisible(); + }); + + test('enters form credentials and runs fetchResource when "Connect" is clicked', async () => { + userEvent.click( + screen.getByRole('button', { + name: /postgresql/i, + }), + ); + + const textboxes = screen.getAllByRole('textbox'); + const hostField = textboxes[0]; + const portField = screen.getByRole('spinbutton'); + const databaseNameField = textboxes[1]; + const usernameField = textboxes[2]; + const passwordField = textboxes[3]; + const connectButton = screen.getByRole('button', { name: 'Connect' }); + + expect(hostField).toHaveValue(''); + expect(portField).toHaveValue(null); + expect(databaseNameField).toHaveValue(''); + expect(usernameField).toHaveValue(''); + expect(passwordField).toHaveValue(''); + + userEvent.type(hostField, 'localhost'); + userEvent.type(portField, '5432'); + userEvent.type(databaseNameField, 'postgres'); + userEvent.type(usernameField, 'testdb'); + userEvent.type(passwordField, 'demoPassword'); + + expect(await screen.findByDisplayValue(/5432/i)).toBeInTheDocument(); + expect(hostField).toHaveValue('localhost'); + expect(portField).toHaveValue(5432); + expect(databaseNameField).toHaveValue('postgres'); + expect(usernameField).toHaveValue('testdb'); + expect(passwordField).toHaveValue('demoPassword'); + + userEvent.click(connectButton); + await waitFor(() => { + expect(fetchMock.calls(VALIDATE_PARAMS_ENDPOINT).length).toEqual(6); + }); + }); + }); + + describe('Import database flow', () => { + test('imports a file', async () => { + const importDbButton = screen.getByTestId( + 'import-database-btn', + ) as HTMLInputElement; + expect(importDbButton).toBeVisible(); + + const testFile = new File([new ArrayBuffer(1)], 'model_export.zip'); + + userEvent.click(importDbButton); + userEvent.upload(importDbButton, testFile); + + expect(importDbButton.files?.[0]).toStrictEqual(testFile); + expect(importDbButton.files?.item(0)).toStrictEqual(testFile); + expect(importDbButton.files).toHaveLength(1); + }); + }); + }); + + describe('DatabaseModal w/ Deeplinking Engine', () => { + const renderAndWait = async () => { + const mounted = act(async () => { + render(<DatabaseModal {...dbProps} dbEngine="PostgreSQL" />, { + useRedux: true, + }); + }); + + return mounted; + }; + + beforeEach(async () => { + await renderAndWait(); + }); + + test('enters step 2 of 3 when proper database is selected', () => { + const step2of3text = screen.getByText(/step 2 of 3/i); + expect(step2of3text).toBeVisible(); + }); + }); + + describe('DatabaseModal w/ GSheet Engine', () => { + const renderAndWait = async () => { + const dbProps = { + show: true, + database_name: 'my database', + sqlalchemy_uri: 'gsheets://', + }; + const mounted = act(async () => { + render(<DatabaseModal {...dbProps} dbEngine="Google Sheets" />, { + useRedux: true, + }); + }); + + return mounted; + }; + + beforeEach(async () => { + await renderAndWait(); + }); + + it('enters step 2 of 2 when proper database is selected', () => { + const step2of2text = screen.getByText(/step 2 of 2/i); + expect(step2of2text).toBeVisible(); + }); + + it('renders the "Advanced" - SECURITY tab without Allow File Upload Checkbox', async () => { + // Click the "Advanced" tab + userEvent.click(screen.getByRole('tab', { name: /advanced/i })); + // Click the "Security" tab + userEvent.click( + screen.getByRole('tab', { + name: /right security add extra connection information\./i, + }), + ); + + // ----- BEGIN STEP 2 (ADVANCED - SECURITY) + // <ExtraOptions> - Advanced tabs + const impersonateLoggerUserCheckbox = screen.getByRole('checkbox', { + name: /impersonate logged in/i, + }); + const impersonateLoggerUserText = screen.getByText( + /impersonate logged in/i, + ); + const allowFileUploadText = screen.queryByText( + /Allow file uploads to database/i, + ); + const schemasForFileUploadText = screen.queryByText( + /Schemas allowed for File upload/i, + ); + + const visibleComponents = [impersonateLoggerUserText]; + // These components exist in the DOM but are not visible + const invisibleComponents = [impersonateLoggerUserCheckbox]; + + // ---------- Assertions ---------- + visibleComponents.forEach(component => { + expect(component).toBeVisible(); + }); + invisibleComponents.forEach(component => { + expect(component).not.toBeVisible(); + }); + expect(allowFileUploadText).not.toBeInTheDocument(); + expect(schemasForFileUploadText).not.toBeInTheDocument(); + }); + + it('if the SSH Tunneling toggle is not displayed, nothing should get displayed', async () => { + const SSHTunnelingToggle = screen.queryByTestId('ssh-tunnel-switch'); + expect(SSHTunnelingToggle).not.toBeInTheDocument(); + const SSHTunnelServerAddressInput = screen.queryByTestId( + 'ssh-tunnel-server_address-input', + ); + expect(SSHTunnelServerAddressInput).not.toBeInTheDocument(); + const SSHTunnelServerPortInput = screen.queryByTestId( + 'ssh-tunnel-server_port-input', + ); + expect(SSHTunnelServerPortInput).not.toBeInTheDocument(); + const SSHTunnelUsernameInput = screen.queryByTestId( + 'ssh-tunnel-username-input', + ); + expect(SSHTunnelUsernameInput).not.toBeInTheDocument(); + const SSHTunnelPasswordInput = screen.queryByTestId( + 'ssh-tunnel-password-input', + ); + expect(SSHTunnelPasswordInput).not.toBeInTheDocument(); + }); + }); + + describe('DatabaseModal w errors as objects', () => { + jest.mock('src/views/CRUD/hooks', () => ({ + ...jest.requireActual('src/views/CRUD/hooks'), + useSingleViewResource: jest.fn(), + })); + + const renderAndWait = async () => { + const mounted = act(async () => { + render(<DatabaseModal {...dbProps} dbEngine="PostgreSQL" />, { + useRedux: true, + }); + }); + + return mounted; + }; + + beforeEach(async () => { + await renderAndWait(); + }); + + test('Error displays when it is an object', async () => { + const step2of3text = screen.getByText(/step 2 of 3/i); + const errorSection = screen.getByText(/Database Creation Error/i); + expect(step2of3text).toBeVisible(); + expect(errorSection).toBeVisible(); + }); + }); + + describe('DatabaseModal w errors as strings', () => { + jest.mock('src/views/CRUD/hooks', () => ({ + ...jest.requireActual('src/views/CRUD/hooks'), + useSingleViewResource: jest.fn(), + })); + const useSingleViewResourceMock = jest.spyOn( + hooks, + 'useSingleViewResource', + ); + + useSingleViewResourceMock.mockReturnValue({ + state: { + loading: false, + resource: null, + error: 'Test Error With String', + }, + fetchResource: jest.fn(), + createResource: jest.fn(), + updateResource: jest.fn(), + clearError: jest.fn(), + setResource: jest.fn(), + }); + + const renderAndWait = async () => { + const mounted = act(async () => { + render(<DatabaseModal {...dbProps} dbEngine="PostgreSQL" />, { + useRedux: true, + }); + }); + + return mounted; + }; + + beforeEach(async () => { + await renderAndWait(); + }); + + test('Error displays when it is a string', async () => { + const step2of3text = screen.getByText(/step 2 of 3/i); + const errorTitleMessage = screen.getByText(/Database Creation Error/i); + const button = screen.getByText('See more'); + userEvent.click(button); + const errorMessage = screen.getByText(/Test Error With String/i); + expect(errorMessage).toBeVisible(); + const closeButton = screen.getByText('Close'); + userEvent.click(closeButton); + expect(step2of3text).toBeVisible(); + expect(errorTitleMessage).toBeVisible(); + }); + }); + + describe('DatabaseModal w Extensions', () => { + const renderAndWait = async () => { + const extensionsRegistry = getExtensionsRegistry(); + + extensionsRegistry.set('ssh_tunnel.form.switch', () => ( + <>ssh_tunnel.form.switch extension component</> + )); + + setupExtensions(); + + const mounted = act(async () => { + render(<DatabaseModal {...dbProps} dbEngine="SQLite" />, { + useRedux: true, + }); + }); + + return mounted; + }; + + beforeEach(async () => { + await renderAndWait(); + }); + + test('should render an extension component if one is supplied', () => { + expect( + screen.getByText('ssh_tunnel.form.switch extension component'), + ).toBeInTheDocument(); + }); + }); +}); + +describe('dbReducer', () => { + test('it will reset state to null', () => { + const action: DBReducerActionType = { type: ActionType.reset }; + const currentState = dbReducer(databaseFixture, action); + expect(currentState).toBeNull(); + }); + + test('it will set state to payload from fetched', () => { + const action: DBReducerActionType = { + type: ActionType.fetched, + payload: databaseFixture, + }; + const currentState = dbReducer({}, action); + expect(currentState).toEqual({ + ...databaseFixture, + engine: 'postgres', + masked_encrypted_extra: '', + parameters: undefined, + query_input: '', + }); + }); + + test('it will set state to payload from extra editor', () => { + const action: DBReducerActionType = { + type: ActionType.extraEditorChange, + payload: { name: 'foo', json: JSON.stringify({ bar: 1 }) }, + }; + const currentState = dbReducer(databaseFixture, action); + // extra should be serialized + expect(currentState).toEqual({ + ...databaseFixture, + extra: '{"foo":{"bar":1}}', + }); + }); + + test('it will set state to payload from editor', () => { + const action: DBReducerActionType = { + type: ActionType.editorChange, + payload: { name: 'foo', json: JSON.stringify({ bar: 1 }) }, + }; + const currentState = dbReducer(databaseFixture, action); + // extra should be serialized + expect(currentState).toEqual({ + ...databaseFixture, + foo: JSON.stringify({ bar: 1 }), + }); + }); + + test('it will add extra payload to existing extra data', () => { + const action: DBReducerActionType = { + type: ActionType.extraEditorChange, + payload: { name: 'foo', json: JSON.stringify({ bar: 1 }) }, + }; + // extra should be a string + const currentState = dbReducer( + { + ...databaseFixture, + extra: JSON.stringify({ name: 'baz', json: { fiz: 2 } }), + }, + action, + ); + // extra should be serialized + expect(currentState).toEqual({ + ...databaseFixture, + extra: '{"name":"baz","json":{"fiz":2},"foo":{"bar":1}}', + }); + }); + + test('it will set state to payload from extra input change', () => { + const action: DBReducerActionType = { + type: ActionType.extraInputChange, + payload: { name: 'foo', value: 'bar' }, + }; + const currentState = dbReducer(databaseFixture, action); + + // extra should be serialized + expect(currentState).toEqual({ + ...databaseFixture, + extra: '{"foo":"bar"}', + }); + }); + + test('it will set state to payload from extra input change when checkbox', () => { + const action: DBReducerActionType = { + type: ActionType.extraInputChange, + payload: { name: 'foo', type: 'checkbox', checked: true }, + }; + const currentState = dbReducer(databaseFixture, action); + + // extra should be serialized + expect(currentState).toEqual({ + ...databaseFixture, + extra: '{"foo":true}', + }); + }); + + test('it will set state to payload from extra input change when schema_cache_timeout', () => { + const action: DBReducerActionType = { + type: ActionType.extraInputChange, + payload: { name: 'schema_cache_timeout', value: 'bar' }, + }; + const currentState = dbReducer(databaseFixture, action); + + // extra should be serialized + expect(currentState).toEqual({ + ...databaseFixture, + extra: '{"metadata_cache_timeout":{"schema_cache_timeout":"bar"}}', + }); + }); + + test('it will set state to payload from extra input change when table_cache_timeout', () => { + const action: DBReducerActionType = { + type: ActionType.extraInputChange, + payload: { name: 'table_cache_timeout', value: 'bar' }, + }; + const currentState = dbReducer(databaseFixture, action); + + // extra should be serialized + expect(currentState).toEqual({ + ...databaseFixture, + extra: '{"metadata_cache_timeout":{"table_cache_timeout":"bar"}}', + }); + }); + + test('it will overwrite state to payload from extra input change when table_cache_timeout', () => { + const action: DBReducerActionType = { + type: ActionType.extraInputChange, + payload: { name: 'table_cache_timeout', value: 'bar' }, + }; + const currentState = dbReducer( + { + ...databaseFixture, + extra: '{"metadata_cache_timeout":{"table_cache_timeout":"foo"}}', + }, + action, + ); + + // extra should be serialized + expect(currentState).toEqual({ + ...databaseFixture, + extra: '{"metadata_cache_timeout":{"table_cache_timeout":"bar"}}', + }); + }); + + test(`it will set state to payload from extra + input change when schemas_allowed_for_file_upload`, () => { + const action: DBReducerActionType = { + type: ActionType.extraInputChange, + payload: { name: 'schemas_allowed_for_file_upload', value: 'bar' }, + }; + const currentState = dbReducer(databaseFixture, action); + + // extra should be serialized + expect(currentState).toEqual({ + ...databaseFixture, + extra: '{"schemas_allowed_for_file_upload":["bar"]}', + }); + }); + + test(`it will overwrite state to payload from extra + input change when schemas_allowed_for_file_upload`, () => { + const action: DBReducerActionType = { + type: ActionType.extraInputChange, + payload: { name: 'schemas_allowed_for_file_upload', value: 'bar' }, + }; + const currentState = dbReducer( + { + ...databaseFixture, + extra: '{"schemas_allowed_for_file_upload":["foo"]}', + }, + action, + ); + + // extra should be serialized + expect(currentState).toEqual({ + ...databaseFixture, + extra: '{"schemas_allowed_for_file_upload":["bar"]}', + }); + }); + + test(`it will set state to payload from extra + input change when schemas_allowed_for_file_upload + with blank list`, () => { + const action: DBReducerActionType = { + type: ActionType.extraInputChange, + payload: { name: 'schemas_allowed_for_file_upload', value: 'bar,' }, + }; + const currentState = dbReducer(databaseFixture, action); + + // extra should be serialized + expect(currentState).toEqual({ + ...databaseFixture, + extra: '{"schemas_allowed_for_file_upload":["bar"]}', + }); + }); + + test('it will set state to payload from input change', () => { + const action: DBReducerActionType = { + type: ActionType.inputChange, + payload: { name: 'foo', value: 'bar' }, + }; + const currentState = dbReducer(databaseFixture, action); + + expect(currentState).toEqual({ + ...databaseFixture, + foo: 'bar', + }); + }); + + test('it will set state to payload from input change for checkbox', () => { + const action: DBReducerActionType = { + type: ActionType.inputChange, + payload: { name: 'foo', type: 'checkbox', checked: true }, + }; + const currentState = dbReducer(databaseFixture, action); + + expect(currentState).toEqual({ + ...databaseFixture, + foo: true, + }); + }); + + test('it will change state to payload from input change for checkbox', () => { + const action: DBReducerActionType = { + type: ActionType.inputChange, + payload: { name: 'allow_ctas', type: 'checkbox', checked: false }, + }; + const currentState = dbReducer( + { + ...databaseFixture, + allow_ctas: true, + }, + action, + ); + + expect(currentState).toEqual({ + ...databaseFixture, + allow_ctas: false, + }); + }); + + test('it will add a parameter', () => { + const action: DBReducerActionType = { + type: ActionType.parametersChange, + payload: { name: 'host', value: '127.0.0.1' }, + }; + const currentState = dbReducer(databaseFixture, action); + + expect(currentState).toEqual({ + ...databaseFixture, + parameters: { + host: '127.0.0.1', + }, + }); + }); + + test('it will add a parameter with existing parameters', () => { + const action: DBReducerActionType = { + type: ActionType.parametersChange, + payload: { name: 'port', value: '1234' }, + }; + const currentState = dbReducer( + { + ...databaseFixture, + parameters: { + host: '127.0.0.1', + }, + }, + action, + ); + + expect(currentState).toEqual({ + ...databaseFixture, + parameters: { + host: '127.0.0.1', + port: '1234', + }, + }); + }); + + test('it will change a parameter with existing parameters', () => { + const action: DBReducerActionType = { + type: ActionType.parametersChange, + payload: { name: 'host', value: 'localhost' }, + }; + const currentState = dbReducer( + { + ...databaseFixture, + parameters: { + host: '127.0.0.1', + }, + }, + action, + ); + + expect(currentState).toEqual({ + ...databaseFixture, + parameters: { + host: 'localhost', + }, + }); + }); + + test('it will set state to payload from parametersChange with catalog', () => { + const action: DBReducerActionType = { + type: ActionType.parametersChange, + payload: { name: 'name', type: 'catalog-0', value: 'bar' }, + }; + const currentState = dbReducer( + { ...databaseFixture, catalog: [{ name: 'foo', value: 'baz' }] }, + action, + ); + + expect(currentState).toEqual({ + ...databaseFixture, + catalog: [{ name: 'bar', value: 'baz' }], + parameters: { + catalog: { + bar: 'baz', + }, + }, + }); + }); + + test('it will add a new catalog array when empty', () => { + const action: DBReducerActionType = { + type: ActionType.addTableCatalogSheet, + }; + const currentState = dbReducer(databaseFixture, action); + + expect(currentState).toEqual({ + ...databaseFixture, + catalog: [{ name: '', value: '' }], + }); + }); + + test('it will add a new catalog array when one exists', () => { + const action: DBReducerActionType = { + type: ActionType.addTableCatalogSheet, + }; + const currentState = dbReducer( + { ...databaseFixture, catalog: [{ name: 'foo', value: 'baz' }] }, + action, + ); + + expect(currentState).toEqual({ + ...databaseFixture, + catalog: [ + { name: 'foo', value: 'baz' }, + { name: '', value: '' }, + ], + }); + }); + + test('it will remove a catalog when one exists', () => { + const action: DBReducerActionType = { + type: ActionType.removeTableCatalogSheet, + payload: { indexToDelete: 0 }, + }; + const currentState = dbReducer( + { ...databaseFixture, catalog: [{ name: 'foo', value: 'baz' }] }, + action, + ); + + expect(currentState).toEqual({ + ...databaseFixture, + catalog: [], + }); + }); + + test('it will add db information when one is selected', () => { + const { backend, ...db } = databaseFixture; + const action: DBReducerActionType = { + type: ActionType.dbSelected, + payload: { + engine_information: { + supports_file_upload: true, + disable_ssh_tunneling: false, + }, + ...db, + driver: db.driver, + engine: backend, + }, + }; + const currentState = dbReducer({}, action); + + expect(currentState).toEqual({ + database_name: db.database_name, + engine: backend, + configuration_method: db.configuration_method, + engine_information: { + supports_file_upload: true, + disable_ssh_tunneling: false, + }, + driver: db.driver, + expose_in_sqllab: true, + extra: '{"allows_virtual_table_explore":true}', + is_managed_externally: false, + name: 'PostgresDB', + }); + }); + + test('it will add a SSH Tunnel config parameter', () => { + const action: DBReducerActionType = { + type: ActionType.parametersSSHTunnelChange, + payload: { name: 'server_address', value: '127.0.0.1' }, + }; + const currentState = dbReducer(databaseFixture, action); + + expect(currentState).toEqual({ + ...databaseFixture, + ssh_tunnel: { + server_address: '127.0.0.1', + }, + }); + }); + + test('it will add a SSH Tunnel config parameter with existing configs', () => { + const action: DBReducerActionType = { + type: ActionType.parametersSSHTunnelChange, + payload: { name: 'server_port', value: '22' }, + }; + const currentState = dbReducer( + { + ...databaseFixture, + ssh_tunnel: { + server_address: '127.0.0.1', + }, + }, + action, + ); + + expect(currentState).toEqual({ + ...databaseFixture, + ssh_tunnel: { + server_address: '127.0.0.1', + server_port: '22', + }, + }); + }); + + test('it will change a SSH Tunnel config parameter with existing configs', () => { + const action: DBReducerActionType = { + type: ActionType.parametersSSHTunnelChange, + payload: { name: 'server_address', value: 'localhost' }, + }; + const currentState = dbReducer( + { + ...databaseFixture, + ssh_tunnel: { + server_address: '127.0.0.1', + }, + }, + action, + ); + + expect(currentState).toEqual({ + ...databaseFixture, + ssh_tunnel: { + server_address: 'localhost', + }, + }); + }); + + test('it will remove the SSH Tunnel config parameters', () => { + const action: DBReducerActionType = { + type: ActionType.removeSSHTunnelConfig, + }; + const currentState = dbReducer(databaseFixture, action); + expect(currentState).toEqual({ + ...databaseFixture, + ssh_tunnel: undefined, + }); + }); +}); diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx index 7891e6b0e2ed..35151598e08d 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx @@ -22,6 +22,7 @@ import { SupersetTheme, FeatureFlag, isFeatureEnabled, + getExtensionsRegistry, } from '@superset-ui/core'; import React, { FunctionComponent, @@ -31,6 +32,7 @@ import React, { useReducer, Reducer, } from 'react'; +import { setItem, LocalStorageKeys } from 'src/utils/localStorageHelpers'; import { UploadChangeParam, UploadFile } from 'antd/lib/upload/interface'; import Tabs from 'src/components/Tabs'; import { AntdSelect, Upload } from 'src/components'; @@ -41,6 +43,8 @@ import IconButton from 'src/components/IconButton'; import InfoTooltip from 'src/components/InfoTooltip'; import withToasts from 'src/components/MessageToasts/withToasts'; import ValidatedInput from 'src/components/Form/LabeledErrorBoundInput'; +import ErrorMessageWithStackTrace from 'src/components/ErrorMessage/ErrorMessageWithStackTrace'; +import ErrorAlert from 'src/components/ImportModal/ErrorAlert'; import { testDatabaseConnection, useSingleViewResource, @@ -56,13 +60,15 @@ import { DatabaseForm, CONFIGURATION_METHOD, CatalogObject, + Engines, + ExtraJson, } from 'src/views/CRUD/data/database/types'; import Loading from 'src/components/Loading'; +import { isEmpty, pick } from 'lodash'; import ExtraOptions from './ExtraOptions'; import SqlAlchemyForm from './SqlAlchemyForm'; import DatabaseConnectionForm from './DatabaseConnectionForm'; import { - antDErrorAlertStyles, antDAlertStyles, antdWarningAlertStyles, StyledAlertMargin, @@ -84,11 +90,12 @@ import { StyledUploadWrapper, } from './styles'; import ModalHeader, { DOCUMENTATION_LINK } from './ModalHeader'; +import SSHTunnelForm from './SSHTunnelForm'; +import SSHTunnelSwitch from './SSHTunnelSwitch'; -enum Engines { - GSheet = 'gsheets', - Snowflake = 'snowflake', -} +const extensionsRegistry = getExtensionsRegistry(); + +const DEFAULT_EXTRA = JSON.stringify({ allows_virtual_table_explore: true }); const engineSpecificAlertMapping = { [Engines.GSheet]: { @@ -114,42 +121,63 @@ const TabsStyled = styled(Tabs)` } `; +const ErrorAlertContainer = styled.div` + ${({ theme }) => ` + margin: ${theme.gridUnit * 8}px ${theme.gridUnit * 4}px; + `}; +`; + +const SSHTunnelContainer = styled.div` + ${({ theme }) => ` + padding: 0px ${theme.gridUnit * 4}px; + `}; +`; + interface DatabaseModalProps { addDangerToast: (msg: string) => void; addSuccessToast: (msg: string) => void; - onDatabaseAdd?: (database?: DatabaseObject) => void; // TODO: should we add a separate function for edit? + onDatabaseAdd?: (database?: DatabaseObject) => void; onHide: () => void; show: boolean; databaseId: number | undefined; // If included, will go into edit mode dbEngine: string | undefined; // if included goto step 2 with engine already set + history?: any; } -enum ActionType { +export enum ActionType { + addTableCatalogSheet, configMethodChange, dbSelected, editorChange, + extraEditorChange, + extraInputChange, fetched, inputChange, parametersChange, + queryChange, + removeTableCatalogSheet, reset, textChange, - extraInputChange, - extraEditorChange, - addTableCatalogSheet, - removeTableCatalogSheet, - queryChange, + parametersSSHTunnelChange, + setSSHTunnelLoginMethod, + removeSSHTunnelConfig, +} + +export enum AuthType { + password, + privateKey, } interface DBReducerPayloadType { target?: string; name: string; - json?: {}; + json?: string; type?: string; checked?: boolean; value?: string; } -type DBReducerActionType = +export type DBReducerActionType = | { type: | ActionType.extraEditorChange @@ -158,7 +186,8 @@ type DBReducerActionType = | ActionType.queryChange | ActionType.inputChange | ActionType.editorChange - | ActionType.parametersChange; + | ActionType.parametersChange + | ActionType.parametersSSHTunnelChange; payload: DBReducerPayloadType; } | { @@ -171,10 +200,15 @@ type DBReducerActionType = database_name?: string; engine?: string; configuration_method: CONFIGURATION_METHOD; + engine_information?: {}; + driver?: string; }; } | { - type: ActionType.reset | ActionType.addTableCatalogSheet; + type: + | ActionType.reset + | ActionType.addTableCatalogSheet + | ActionType.removeSSHTunnelConfig; } | { type: ActionType.removeTableCatalogSheet; @@ -189,9 +223,20 @@ type DBReducerActionType = engine?: string; configuration_method: CONFIGURATION_METHOD; }; + } + | { + type: ActionType.setSSHTunnelLoginMethod; + payload: { + login_method: AuthType; + }; }; -function dbReducer( +const StyledBtns = styled.div` + margin-bottom: ${({ theme }) => theme.gridUnit * 3}px; + margin-left: ${({ theme }) => theme.gridUnit * 3}px; +`; + +export function dbReducer( state: Partial<DatabaseObject> | null, action: DBReducerActionType, ): Partial<DatabaseObject> | null { @@ -200,54 +245,77 @@ function dbReducer( }; let query = {}; let query_input = ''; - let deserializeExtraJSON = { allows_virtual_table_explore: true }; - let extra_json: DatabaseObject['extra_json']; + let parametersCatalog; + let actionPayloadJson; + const extraJson: ExtraJson = JSON.parse(trimmedState.extra || '{}'); switch (action.type) { case ActionType.extraEditorChange: + // "extra" payload in state is a string + try { + // we don't want to stringify encoded strings twice + actionPayloadJson = JSON.parse(action.payload.json || '{}'); + } catch (e) { + actionPayloadJson = action.payload.json; + } return { ...trimmedState, - extra_json: { - ...trimmedState.extra_json, - [action.payload.name]: action.payload.json, - }, + extra: JSON.stringify({ + ...extraJson, + [action.payload.name]: actionPayloadJson, + }), }; case ActionType.extraInputChange: + // "extra" payload in state is a string + if ( action.payload.name === 'schema_cache_timeout' || action.payload.name === 'table_cache_timeout' ) { return { ...trimmedState, - extra_json: { - ...trimmedState.extra_json, + extra: JSON.stringify({ + ...extraJson, metadata_cache_timeout: { - ...trimmedState.extra_json?.metadata_cache_timeout, + ...extraJson?.metadata_cache_timeout, [action.payload.name]: action.payload.value, }, - }, + }), }; } if (action.payload.name === 'schemas_allowed_for_file_upload') { return { ...trimmedState, - extra_json: { - ...trimmedState.extra_json, - schemas_allowed_for_file_upload: (action.payload.value || '').split( - ',', - ), - }, + extra: JSON.stringify({ + ...extraJson, + schemas_allowed_for_file_upload: (action.payload.value || '') + .split(',') + .filter(schema => schema !== ''), + }), + }; + } + if (action.payload.name === 'http_path') { + return { + ...trimmedState, + extra: JSON.stringify({ + ...extraJson, + engine_params: { + connect_args: { + [action.payload.name]: action.payload.value?.trim(), + }, + }, + }), }; } return { ...trimmedState, - extra_json: { - ...trimmedState.extra_json, + extra: JSON.stringify({ + ...extraJson, [action.payload.name]: action.payload.type === 'checkbox' ? action.payload.checked : action.payload.value, - }, + }), }; case ActionType.inputChange: if (action.payload.type === 'checkbox') { @@ -261,26 +329,36 @@ function dbReducer( [action.payload.name]: action.payload.value, }; case ActionType.parametersChange: + // catalog params will always have a catalog state for + // dbs that use a catalog, i.e., gsheets, even if the + // fields are empty strings if ( - trimmedState.catalog !== undefined && - action.payload.type?.startsWith('catalog') + action.payload.type?.startsWith('catalog') && + trimmedState.catalog !== undefined ) { // Formatting wrapping google sheets table catalog + const catalogCopy: CatalogObject[] = [...trimmedState.catalog]; const idx = action.payload.type?.split('-')[1]; - const catalogToUpdate = trimmedState?.catalog[idx] || {}; + const catalogToUpdate: CatalogObject = catalogCopy[idx] || {}; catalogToUpdate[action.payload.name] = action.payload.value; - const paramatersCatalog = {}; + // insert updated catalog to existing state + catalogCopy.splice(parseInt(idx, 10), 1, catalogToUpdate); + + // format catalog for state // eslint-disable-next-line array-callback-return - trimmedState.catalog?.map((item: CatalogObject) => { - paramatersCatalog[item.name] = item.value; - }); + parametersCatalog = catalogCopy.reduce((obj, item: any) => { + const catalog = { ...obj }; + catalog[item.name] = item.value; + return catalog; + }, {}); return { ...trimmedState, + catalog: catalogCopy, parameters: { ...trimmedState.parameters, - catalog: paramatersCatalog, + catalog: parametersCatalog, }, }; } @@ -291,6 +369,55 @@ function dbReducer( [action.payload.name]: action.payload.value, }, }; + + case ActionType.parametersSSHTunnelChange: + return { + ...trimmedState, + ssh_tunnel: { + ...trimmedState.ssh_tunnel, + [action.payload.name]: action.payload.value, + }, + }; + case ActionType.setSSHTunnelLoginMethod: { + let ssh_tunnel = {}; + if (trimmedState?.ssh_tunnel) { + // remove any attributes that are considered sensitive + ssh_tunnel = pick(trimmedState.ssh_tunnel, [ + 'id', + 'server_address', + 'server_port', + 'username', + ]); + } + if (action.payload.login_method === AuthType.privateKey) { + return { + ...trimmedState, + ssh_tunnel: { + private_key: trimmedState?.ssh_tunnel?.private_key, + private_key_password: + trimmedState?.ssh_tunnel?.private_key_password, + ...ssh_tunnel, + }, + }; + } + if (action.payload.login_method === AuthType.password) { + return { + ...trimmedState, + ssh_tunnel: { + password: trimmedState?.ssh_tunnel?.password, + ...ssh_tunnel, + }, + }; + } + return { + ...trimmedState, + }; + } + case ActionType.removeSSHTunnelConfig: + return { + ...trimmedState, + ssh_tunnel: undefined, + }; case ActionType.addTableCatalogSheet: if (trimmedState.catalog !== undefined) { return { @@ -327,22 +454,6 @@ function dbReducer( [action.payload.name]: action.payload.value, }; case ActionType.fetched: - // convert all the keys in this payload into strings - if (action.payload.extra) { - extra_json = { - ...JSON.parse(action.payload.extra || ''), - } as DatabaseObject['extra_json']; - - deserializeExtraJSON = { - ...deserializeExtraJSON, - ...JSON.parse(action.payload.extra || ''), - metadata_params: JSON.stringify(extra_json?.metadata_params), - engine_params: JSON.stringify(extra_json?.engine_params), - schemas_allowed_for_file_upload: - extra_json?.schemas_allowed_for_file_upload, - }; - } - // convert query to a string and store in query_input query = action.payload?.parameters?.query || {}; query_input = Object.entries(query) @@ -350,41 +461,50 @@ function dbReducer( .join('&'); if ( - action.payload.encrypted_extra && + action.payload.masked_encrypted_extra && action.payload.configuration_method === CONFIGURATION_METHOD.DYNAMIC_FORM ) { - const engineParamsCatalog = Object.entries( - extra_json?.engine_params?.catalog || {}, - ).map(([key, value]) => ({ - name: key, - value, - })); + // "extra" payload from the api is a string + const extraJsonPayload: ExtraJson = { + ...JSON.parse((action.payload.extra as string) || '{}'), + }; + + const payloadCatalog = extraJsonPayload.engine_params?.catalog; + + const engineRootCatalog = Object.entries(payloadCatalog || {}).map( + ([name, value]: string[]) => ({ name, value }), + ); + return { ...action.payload, engine: action.payload.backend || trimmedState.engine, configuration_method: action.payload.configuration_method, - extra_json: deserializeExtraJSON, - catalog: engineParamsCatalog, - parameters: action.payload.parameters || trimmedState.parameters, + catalog: engineRootCatalog, + parameters: { + ...(action.payload.parameters || trimmedState.parameters), + catalog: payloadCatalog, + }, query_input, }; } return { ...action.payload, - encrypted_extra: action.payload.encrypted_extra || '', + masked_encrypted_extra: action.payload.masked_encrypted_extra || '', engine: action.payload.backend || trimmedState.engine, configuration_method: action.payload.configuration_method, - extra_json: deserializeExtraJSON, parameters: action.payload.parameters || trimmedState.parameters, + ssh_tunnel: action.payload.ssh_tunnel || trimmedState.ssh_tunnel, query_input, }; case ActionType.dbSelected: + // set initial state for blank form return { ...action.payload, + extra: DEFAULT_EXTRA, + expose_in_sqllab: true, }; - case ActionType.configMethodChange: return { ...action.payload, @@ -398,16 +518,6 @@ function dbReducer( const DEFAULT_TAB_KEY = '1'; -const serializeExtra = (extraJson: DatabaseObject['extra_json']) => - JSON.stringify({ - ...extraJson, - metadata_params: JSON.parse((extraJson?.metadata_params as string) || '{}'), - engine_params: JSON.parse((extraJson?.engine_params as string) || '{}'), - schemas_allowed_for_file_upload: ( - extraJson?.schemas_allowed_for_file_upload || [] - ).filter(schema => schema !== ''), - }); - const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ addDangerToast, addSuccessToast, @@ -416,6 +526,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ show, databaseId, dbEngine, + history, }) => { const [db, setDB] = useReducer< Reducer<Partial<DatabaseObject> | null, DBReducerActionType> @@ -438,6 +549,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ const [validationErrors, getValidation, setValidationErrors] = useDatabaseValidation(); const [hasConnectedDb, setHasConnectedDb] = useState<boolean>(false); + const [showCTAbtns, setShowCTAbtns] = useState(false); const [dbName, setDbName] = useState(''); const [editNewDb, setEditNewDb] = useState<boolean>(false); const [isLoading, setLoading] = useState<boolean>(false); @@ -446,6 +558,13 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ const [confirmedOverwrite, setConfirmedOverwrite] = useState<boolean>(false); const [fileList, setFileList] = useState<UploadFile[]>([]); const [importingModal, setImportingModal] = useState<boolean>(false); + const [importingErrorMessage, setImportingErrorMessage] = useState<string>(); + const [passwordFields, setPasswordFields] = useState<string[]>([]); + + const SSHTunnelSwitchComponent = + extensionsRegistry.get('ssh_tunnel.form.switch') ?? SSHTunnelSwitch; + + const [useSSHTunneling, setUseSSHTunneling] = useState<boolean>(false); const conf = useCommonConf(); const dbImages = getDatabaseImages(); @@ -454,6 +573,15 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ const sslForced = isFeatureEnabled( FeatureFlag.FORCE_DATABASE_CONNECTIONS_SSL, ); + const disableSSHTunnelingForEngine = ( + availableDbs?.databases?.find( + (DB: DatabaseObject) => + DB.backend === db?.engine || DB.engine === db?.engine, + ) as DatabaseObject + )?.engine_information?.disable_ssh_tunneling; + const isSSHTunneling = + isFeatureEnabled(FeatureFlag.SSH_TUNNELING) && + !disableSSHTunnelingForEngine; const hasAlert = connectionAlert || !!(db?.engine && engineSpecificAlertMapping[db.engine]); const useSqlAlchemyForm = @@ -464,8 +592,6 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ (DB: DatabaseObject) => DB.backend === engine || DB.engine === engine, )?.parameters !== undefined; const showDBError = validationErrors || dbErrors; - const isEmpty = (data?: Object | null) => - data && Object.keys(data).length === 0; const dbModel: DatabaseForm = availableDbs?.databases?.find( @@ -485,9 +611,10 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ sqlalchemy_uri: db?.sqlalchemy_uri || '', database_name: db?.database_name?.trim() || undefined, impersonate_user: db?.impersonate_user || undefined, - extra: serializeExtra(db?.extra_json) || undefined, - encrypted_extra: db?.encrypted_extra || '', + extra: db?.extra, + masked_encrypted_extra: db?.masked_encrypted_extra || '', server_cert: db?.server_cert || undefined, + ssh_tunnel: db?.ssh_tunnel || undefined, }; setTestInProgress(true); testDatabaseConnection( @@ -503,6 +630,18 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ ); }; + const getPlaceholder = (field: string) => { + if (field === 'database') { + switch (db?.engine) { + case Engines.Snowflake: + return t('e.g. xy12345.us-east-2.aws'); + default: + return t('e.g. world_population'); + } + } + return undefined; + }; + const removeFile = (removedFile: UploadFile) => { setFileList(fileList.filter(file => file.uid !== removedFile.uid)); return false; @@ -516,11 +655,24 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ setEditNewDb(false); setFileList([]); setImportingModal(false); + setImportingErrorMessage(''); + setPasswordFields([]); setPasswords({}); setConfirmedOverwrite(false); + setUseSSHTunneling(false); onHide(); }; + const redirectURL = (url: string) => { + /* TODO (lyndsiWilliams): This check and passing history + as a prop can be removed once SQL Lab is in the SPA */ + if (!isEmpty(history)) { + history?.push(url); + } else { + window.location.href = url; + } + }; + // Database import logic const { state: { @@ -531,8 +683,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ }, importResource, } = useImportResource('database', t('database'), msg => { - addDangerToast(msg); - onClose(); + setImportingErrorMessage(msg); }); const onChange = (type: any, payload: any) => { @@ -540,40 +691,55 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ }; const onSave = async () => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { id, ...update } = db || {}; // Clone DB object - const dbToUpdate = JSON.parse(JSON.stringify(update)); + const dbToUpdate = { ...(db || {}) }; if (dbToUpdate.configuration_method === CONFIGURATION_METHOD.DYNAMIC_FORM) { // Validate DB before saving + if (dbToUpdate?.parameters?.catalog) { + // need to stringify gsheets catalog to allow it to be serialized + dbToUpdate.extra = JSON.stringify({ + ...JSON.parse(dbToUpdate.extra || '{}'), + engine_params: { + catalog: dbToUpdate.parameters.catalog, + }, + }); + } + + // make sure that button spinner animates + setLoading(true); const errors = await getValidation(dbToUpdate, true); if ((validationErrors && !isEmpty(validationErrors)) || errors) { + setLoading(false); return; } + setLoading(false); + // end spinner animation + const parameters_schema = isEditMode - ? dbToUpdate.parameters_schema.properties + ? dbToUpdate.parameters_schema?.properties : dbModel?.parameters.properties; const additionalEncryptedExtra = JSON.parse( - dbToUpdate.encrypted_extra || '{}', + dbToUpdate.masked_encrypted_extra || '{}', ); const paramConfigArray = Object.keys(parameters_schema || {}); paramConfigArray.forEach(paramConfig => { /* - * Parameters that are annotated with the `x-encrypted-extra` properties should be moved to - * `encrypted_extra`, so that they are stored encrypted in the backend when the database is - * created or edited. + * Parameters that are annotated with the `x-encrypted-extra` properties should be + * moved to `masked_encrypted_extra`, so that they are stored encrypted in the + * backend when the database is created or edited. */ if ( parameters_schema[paramConfig]['x-encrypted-extra'] && dbToUpdate.parameters?.[paramConfig] ) { if (typeof dbToUpdate.parameters?.[paramConfig] === 'object') { - // add new encrypted extra to encrypted_extra object + // add new encrypted extra to masked_encrypted_extra object additionalEncryptedExtra[paramConfig] = dbToUpdate.parameters?.[paramConfig]; - // The backend expects `encrypted_extra` as a string for historical reasons. + // The backend expects `masked_encrypted_extra` as a string for historical + // reasons. dbToUpdate.parameters[paramConfig] = JSON.stringify( dbToUpdate.parameters[paramConfig], ); @@ -585,7 +751,9 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ } }); // cast the new encrypted extra object into a string - dbToUpdate.encrypted_extra = JSON.stringify(additionalEncryptedExtra); + dbToUpdate.masked_encrypted_extra = JSON.stringify( + additionalEncryptedExtra, + ); // this needs to be added by default to gsheets if (dbToUpdate.engine === Engines.GSheet) { dbToUpdate.impersonate_user = true; @@ -593,17 +761,13 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ } if (dbToUpdate?.parameters?.catalog) { - // need to stringify gsheets catalog to allow it to be seralized - dbToUpdate.extra_json = { - engine_params: JSON.stringify({ + // need to stringify gsheets catalog to allow it to be serialized + dbToUpdate.extra = JSON.stringify({ + ...JSON.parse(dbToUpdate.extra || '{}'), + engine_params: { catalog: dbToUpdate.parameters.catalog, - }), - }; - } - - if (dbToUpdate?.extra_json) { - // convert extra_json to back to string - dbToUpdate.extra = serializeExtra(dbToUpdate?.extra_json); + }, + }); } setLoading(true); @@ -656,6 +820,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ } } + setShowCTAbtns(true); setEditNewDb(false); setLoading(false); }; @@ -685,13 +850,17 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ database_name, configuration_method: CONFIGURATION_METHOD.SQLALCHEMY_URI, engine: undefined, + engine_information: { + supports_file_upload: true, + }, }, }); } else { const selectedDbModel = availableDbs?.databases.filter( (db: DatabaseObject) => db.name === database_name, )[0]; - const { engine, parameters } = selectedDbModel; + const { engine, parameters, engine_information, default_driver } = + selectedDbModel; const isDynamic = parameters !== undefined; setDB({ type: ActionType.dbSelected, @@ -701,11 +870,16 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ configuration_method: isDynamic ? CONFIGURATION_METHOD.DYNAMIC_FORM : CONFIGURATION_METHOD.SQLALCHEMY_URI, + engine_information, + driver: default_driver, }, }); - } - setDB({ type: ActionType.addTableCatalogSheet }); + if (engine === Engines.GSheet) { + // only create a catalog if the DB is Google Sheets + setDB({ type: ActionType.addTableCatalogSheet }); + } + } }; const renderAvailableSelector = () => ( @@ -788,6 +962,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ onClick={() => setDatabaseModel(database.name)} buttonText={database.name} icon={dbImages?.[database.engine]} + key={`${database.name}`} /> ))} </div> @@ -797,12 +972,19 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ if (dbFetched) { fetchResource(dbFetched.id as number); } + setShowCTAbtns(false); setEditNewDb(true); }; const handleBackButtonOnConnect = () => { if (editNewDb) setHasConnectedDb(false); if (importingModal) setImportingModal(false); + if (importErrored) { + setImportingModal(false); + setImportingErrorMessage(''); + setPasswordFields([]); + setPasswords({}); + } setDB({ type: ActionType.reset }); setFileList([]); }; @@ -819,7 +1001,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ const renderModalFooter = () => { if (db) { - // if db show back + connenct + // if db show back + connect if (!hasConnectedDb || editNewDb) { return ( <> @@ -830,6 +1012,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ key="submit" buttonStyle="primary" onClick={onSave} + loading={isLoading} > {t('Connect')} </StyledFooterButton> @@ -847,6 +1030,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ buttonStyle="primary" onClick={onSave} data-test="modal-confirm-button" + loading={isLoading} > {t('Finish')} </StyledFooterButton> @@ -866,6 +1050,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ buttonStyle="primary" onClick={onSave} disabled={handleDisableOnImport()} + loading={isLoading} > {t('Connect')} </StyledFooterButton> @@ -873,7 +1058,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ ); } - return []; + return <></>; }; const renderEditModalFooter = (db: Partial<DatabaseObject> | null) => ( @@ -886,6 +1071,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ buttonStyle="primary" onClick={onSave} disabled={db?.is_managed_externally} + loading={isLoading} tooltip={ db?.is_managed_externally ? t( @@ -923,8 +1109,8 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ useEffect(() => { if (show) { setTabKey(DEFAULT_TAB_KEY); - getAvailableDbs(); setLoading(true); + getAvailableDbs(); } if (databaseId && show) { fetchDB(); @@ -963,7 +1149,20 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ } }, [importingModal]); + useEffect(() => { + setPasswordFields([...passwordsNeeded]); + }, [passwordsNeeded]); + + useEffect(() => { + if (db && isSSHTunneling) { + setUseSSHTunneling(!isEmpty(db?.ssh_tunnel)); + } + }, [db, isSSHTunneling]); + const onDbImport = async (info: UploadChangeParam) => { + setImportingErrorMessage(''); + setPasswordFields([]); + setPasswords({}); setImportingModal(true); setFileList([ { @@ -973,17 +1172,18 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ ]); if (!(info.file.originFileObj instanceof File)) return; - await importResource( + const dbId = await importResource( info.file.originFileObj, passwords, confirmedOverwrite, ); + if (dbId) onDatabaseAdd?.(); }; const passwordNeededField = () => { - if (!passwordsNeeded.length) return null; + if (!passwordFields.length) return null; - return passwordsNeeded.map(database => ( + return passwordFields.map(database => ( <> <StyledAlertMargin> <Alert @@ -1014,6 +1214,19 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ )); }; + const importingErrorAlert = () => { + if (!importingErrorMessage) return null; + + return ( + <StyledAlertMargin> + <ErrorAlert + errorMessage={importingErrorMessage} + showDbInstallInstructions={passwordFields.length > 0} + /> + </StyledAlertMargin> + ); + }; + const confirmOverwrite = (event: React.ChangeEvent<HTMLInputElement>) => { const targetValue = (event.currentTarget?.value as string) ?? ''; setConfirmedOverwrite(targetValue.toUpperCase() === t('OVERWRITE')); @@ -1042,7 +1255,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ required validationMethods={{ onBlur: () => {} }} errorMessage={validationErrors?.confirm_overwrite} - label={t(`TYPE "OVERWRITE" TO CONFIRM`)} + label={t('Type "%s" to confirm', t('OVERWRITE'))} onChange={confirmOverwrite} css={formScrollableStyles} /> @@ -1085,28 +1298,93 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ // eslint-disable-next-line consistent-return const errorAlert = () => { let alertErrors: string[] = []; - if (isEmpty(dbErrors) === false) { - alertErrors = typeof dbErrors === 'object' ? Object.values(dbErrors) : []; - } else if (db?.engine === Engines.Snowflake) { + if (!isEmpty(dbErrors)) { alertErrors = - validationErrors?.error_type === 'GENERIC_DB_ENGINE_ERROR' - ? [validationErrors?.description] + typeof dbErrors === 'object' + ? Object.values(dbErrors) + : typeof dbErrors === 'string' + ? [dbErrors] : []; + } else if ( + !isEmpty(validationErrors) && + validationErrors?.error_type === 'GENERIC_DB_ENGINE_ERROR' + ) { + alertErrors = [ + validationErrors?.description || validationErrors?.message, + ]; } - if (alertErrors.length) { return ( - <Alert - type="error" - css={(theme: SupersetTheme) => antDErrorAlertStyles(theme)} - message={t('Database Creation Error')} - description={t(alertErrors[0])} - /> + <ErrorAlertContainer> + <ErrorMessageWithStackTrace + title={t('Database Creation Error')} + description={t( + 'We are unable to connect to your database. Click "See more" for database-provided information that may help troubleshoot the issue.', + )} + subtitle={alertErrors?.[0] || validationErrors?.description} + copyText={validationErrors?.description} + /> + </ErrorAlertContainer> ); } return <></>; }; + const fetchAndSetDB = () => { + setLoading(true); + fetchResource(dbFetched?.id as number).then(r => { + setItem(LocalStorageKeys.db, r); + }); + }; + + const renderSSHTunnelForm = () => ( + <SSHTunnelForm + db={db as DatabaseObject} + onSSHTunnelParametersChange={({ + target, + }: { + target: HTMLInputElement | HTMLTextAreaElement; + }) => + onChange(ActionType.parametersSSHTunnelChange, { + type: target.type, + name: target.name, + value: target.value, + }) + } + setSSHTunnelLoginMethod={(method: AuthType) => + setDB({ + type: ActionType.setSSHTunnelLoginMethod, + payload: { login_method: method }, + }) + } + /> + ); + + const renderCTABtns = () => ( + <StyledBtns> + <Button + buttonStyle="secondary" + onClick={() => { + setLoading(true); + fetchAndSetDB(); + redirectURL('/dataset/add/'); + }} + > + {t('CREATE DATASET')} + </Button> + <Button + buttonStyle="secondary" + onClick={() => { + setLoading(true); + fetchAndSetDB(); + redirectURL(`/superset/sqllab/?db=true`); + }} + > + {t('QUERY DATA IN SQL LAB')} + </Button> + </StyledBtns> + ); + const renderFinishState = () => { if (!editNewDb) { return ( @@ -1157,6 +1435,12 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ value: target.value, }) } + onExtraInputChange={({ target }: { target: HTMLInputElement }) => + onChange(ActionType.extraInputChange, { + name: target.name, + value: target.value, + }) + } onChange={({ target }: { target: HTMLInputElement }) => onChange(ActionType.textChange, { name: target.name, @@ -1184,7 +1468,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ ); }; - if (fileList.length > 0 && (alreadyExists.length || passwordsNeeded.length)) { + if (fileList.length > 0 && (alreadyExists.length || passwordFields.length)) { return ( <Modal css={(theme: SupersetTheme) => [ @@ -1215,10 +1499,13 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ /> {passwordNeededField()} {confirmOverwriteField()} + {importingErrorAlert()} </Modal> ); } - + const modalFooter = isEditMode + ? renderEditModalFooter(db) + : renderModalFooter(); return useTabLayout ? ( <Modal css={(theme: SupersetTheme) => [ @@ -1239,7 +1526,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ title={ <h4>{isEditMode ? t('Edit database') : t('Connect a database')}</h4> } - footer={isEditMode ? renderEditModalFooter(db) : renderModalFooter()} + footer={modalFooter} > <StyledStickyHeader> <TabHeader> @@ -1276,7 +1563,18 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ conf={conf} testConnection={testConnection} testInProgress={testInProgress} - /> + > + <SSHTunnelSwitchComponent + isEditMode={isEditMode} + dbFetched={dbFetched} + disableSSHTunnelingForEngine={disableSSHTunnelingForEngine} + useSSHTunneling={useSSHTunneling} + setUseSSHTunneling={setUseSSHTunneling} + setDB={setDB} + isSSHTunneling={isSSHTunneling} + /> + {useSSHTunneling && renderSSHTunnelForm()} + </SqlAlchemyForm> {isDynamic(db?.backend || db?.engine) && !isEditMode && ( <div css={(theme: SupersetTheme) => infoTooltip(theme)}> <Button @@ -1319,6 +1617,12 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ value: target.value, }) } + onExtraInputChange={({ target }: { target: HTMLInputElement }) => + onChange(ActionType.extraInputChange, { + name: target.name, + value: target.value, + }) + } onChange={({ target }: { target: HTMLInputElement }) => onChange(ActionType.textChange, { name: target.name, @@ -1349,7 +1653,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ <Alert closable={false} css={(theme: SupersetTheme) => antDAlertStyles(theme)} - message="Additional fields may be required" + message={t('Additional fields may be required')} showIcon description={ <> @@ -1371,6 +1675,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ /> </StyledAlertMargin> )} + {showDBError && errorAlert()} </Tabs.TabPane> <Tabs.TabPane tab={<span>{t('Advanced')}</span>} key="2"> <ExtraOptions @@ -1404,7 +1709,6 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ onChange(ActionType.extraEditorChange, payload); }} /> - {showDBError && errorAlert()} </Tabs.TabPane> </TabsStyled> </Modal> @@ -1426,7 +1730,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ title={<h4>{t('Connect a database')}</h4>} footer={renderModalFooter()} > - {hasConnectedDb ? ( + {!isLoading && hasConnectedDb ? ( <> <ModalHeader isLoading={isLoading} @@ -1438,6 +1742,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ dbModel={dbModel} editNewDb={editNewDb} /> + {showCTAbtns && renderCTABtns()} {renderFinishState()} </> ) : ( @@ -1477,6 +1782,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ </Button> </Upload> </StyledUploadWrapper> + {importingErrorAlert()} </SelectDatabaseStyles> ) : ( <> @@ -1503,6 +1809,16 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ value: target.value, }) } + onExtraInputChange={({ + target, + }: { + target: HTMLInputElement; + }) => + onChange(ActionType.extraInputChange, { + name: target.name, + value: target.value, + }) + } onRemoveTableCatalog={(idx: number) => { setDB({ type: ActionType.removeTableCatalogSheet, @@ -1529,7 +1845,24 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({ } getValidation={() => getValidation(db)} validationErrors={validationErrors} + getPlaceholder={getPlaceholder} /> + <SSHTunnelContainer> + <SSHTunnelSwitchComponent + isEditMode={isEditMode} + dbFetched={dbFetched} + disableSSHTunnelingForEngine={disableSSHTunnelingForEngine} + useSSHTunneling={useSSHTunneling} + setUseSSHTunneling={setUseSSHTunneling} + setDB={setDB} + isSSHTunneling={isSSHTunneling} + /> + </SSHTunnelContainer> + {useSSHTunneling && ( + <SSHTunnelContainer> + {renderSSHTunnelForm()} + </SSHTunnelContainer> + )} <div css={(theme: SupersetTheme) => infoTooltip(theme)}> {dbModel.engine !== Engines.GSheet && ( <> diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/styles.ts b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/styles.ts index d3d0b11dd76a..ed30e7885b92 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/styles.ts +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/styles.ts @@ -21,9 +21,10 @@ import { css, styled, SupersetTheme } from '@superset-ui/core'; import { JsonEditor } from 'src/components/AsyncAceEditor'; import Button from 'src/components/Button'; -const CTAS_CVAS_SCHEMA_FORM_HEIGHT = 102; +const CTAS_CVAS_SCHEMA_FORM_HEIGHT = 108; const EXPOSE_IN_SQLLAB_FORM_HEIGHT = CTAS_CVAS_SCHEMA_FORM_HEIGHT + 153; const EXPOSE_ALL_FORM_HEIGHT = EXPOSE_IN_SQLLAB_FORM_HEIGHT + 102; +const MODAL_BODY_HEIGHT = 180.5; const anticonHeight = 12; @@ -31,7 +32,7 @@ export const no_margin_bottom = css` margin-bottom: 0; `; -export const labelMarginBotton = (theme: SupersetTheme) => css` +export const labelMarginBottom = (theme: SupersetTheme) => css` margin-bottom: ${theme.gridUnit * 2}px; `; @@ -40,8 +41,6 @@ export const marginBottom = (theme: SupersetTheme) => css` `; export const StyledFormHeader = styled.header` - border-bottom: ${({ theme }) => `${theme.gridUnit * 0.25}px solid - ${theme.colors.grayscale.light2};`} padding: ${({ theme }) => theme.gridUnit * 2}px ${({ theme }) => theme.gridUnit * 4}px; line-height: ${({ theme }) => theme.gridUnit * 6}px; @@ -53,6 +52,10 @@ export const StyledFormHeader = styled.header` margin: 0; } + .subheader-text { + line-height: ${({ theme }) => theme.gridUnit * 4.25}px; + } + .helper-bottom { padding-top: 0; color: ${({ theme }) => theme.colors.grayscale.base}; @@ -154,7 +157,7 @@ export const antDModalStyles = (theme: SupersetTheme) => css` } .ant-modal-body { - height: ${theme.gridUnit * 180.5}px; + height: ${theme.gridUnit * MODAL_BODY_HEIGHT}px; } .ant-modal-footer { @@ -275,7 +278,6 @@ export const formStyles = (theme: SupersetTheme) => css` width: ${`calc(50% - ${theme.gridUnit * 4}px)`}; & + .form-group-w-50 { margin-left: ${theme.gridUnit * 8}px; - margin-bottom: ${theme.gridUnit * 10}px; } } } @@ -511,7 +513,7 @@ export const CredentialInfoForm = styled.div` .input-container { .input-upload { - display: none; + display: none !important; } .input-upload-current { display: flex; @@ -603,12 +605,6 @@ export const StyledCatalogTable = styled.div` width: 95%; } - .catalog-delete { - align-self: center; - background: ${({ theme }) => theme.colors.grayscale.light4}; - margin: 5px 5px 8px 5px; - } - .catalog-add-btn { width: 95%; } diff --git a/superset-frontend/src/views/CRUD/data/database/types.ts b/superset-frontend/src/views/CRUD/data/database/types.ts index d48fa956e28b..c347948f7ed7 100644 --- a/superset-frontend/src/views/CRUD/data/database/types.ts +++ b/superset-frontend/src/views/CRUD/data/database/types.ts @@ -26,17 +26,33 @@ export type CatalogObject = { value: string; }; +export type SSHTunnelObject = { + id?: number; + server_address?: string; + server_port?: number; + username?: string; + password?: string; + private_key?: string; + private_key_password?: string; +}; + export type DatabaseObject = { // Connection + general - id?: number; + backend?: string; + changed_on?: string; + changed_on_delta_humanized?: string; + configuration_method: CONFIGURATION_METHOD; + created_by?: null | DatabaseUser; database_name: string; + driver: string; + engine?: string; + extra?: string; + id?: number; name: string; // synonym to database_name + paramProperties?: Record<string, any>; sqlalchemy_uri?: string; - backend?: string; - created_by?: null | DatabaseUser; - changed_on_delta_humanized?: string; - changed_on?: string; parameters?: { + access_token?: string; database_name?: string; host?: string; port?: number; @@ -47,53 +63,30 @@ export type DatabaseObject = { credentials_info?: string; service_account_info?: string; query?: Record<string, string>; - catalog?: Record<string, string>; + catalog?: Record<string, string | undefined>; properties?: Record<string, any>; warehouse?: string; role?: string; account?: string; }; - configuration_method: CONFIGURATION_METHOD; - engine?: string; - paramProperties?: Record<string, any>; // Performance cache_timeout?: string; allow_run_async?: boolean; // SQL Lab - expose_in_sqllab?: boolean; allow_ctas?: boolean; allow_cvas?: boolean; allow_dml?: boolean; - allow_multi_schema_metadata_fetch?: boolean; + expose_in_sqllab?: boolean; force_ctas_schema?: string; // Security - encrypted_extra?: string; - server_cert?: string; allow_file_upload?: boolean; impersonate_user?: boolean; + masked_encrypted_extra?: string; parameters_schema?: Record<string, any>; - - // Extra - extra_json?: { - engine_params?: { - catalog?: Record<any, any> | string; - }; - metadata_params?: {} | string; - metadata_cache_timeout?: { - schema_cache_timeout?: number; // in Performance - table_cache_timeout?: number; // in Performance - }; // No field, holds schema and table timeout - allows_virtual_table_explore?: boolean; // in SQL Lab - schemas_allowed_for_file_upload?: string[]; // in Security - cancel_query_on_windows_unload?: boolean; // in Performance - - version?: string; - cost_estimate_enabled?: boolean; // in SQL Lab - disable_data_preview?: boolean; // in SQL Lab - }; + server_cert?: string; // External management is_managed_externally: boolean; @@ -101,10 +94,19 @@ export type DatabaseObject = { // Temporary storage catalog?: Array<CatalogObject>; query_input?: string; - extra?: string; + + // DB Engine Spec information + engine_information?: { + supports_file_upload?: boolean; + disable_ssh_tunneling?: boolean; + }; + + // SSH Tunnel information + ssh_tunnel?: SSHTunnelObject; }; export type DatabaseForm = { + default_driver: string; engine: string; name: string; parameters: { @@ -151,6 +153,40 @@ export type DatabaseForm = { required: string[]; type: string; }; + ssh_tunnel: { + properties: { + ssh_address: { + description: string; + type: string; + }; + ssh_port: { + description: string; + format: string; + type: string; + }; + username: { + description: string; + type: string; + }; + password: { + description: string; + nullable: boolean; + type: string; + }; + private_key: { + description: string; + nullable: boolean; + type: string; + }; + private_key_password: { + description: string; + nullable: boolean; + type: string; + }; + }; + required: string[]; + type: string; + }; preferred: boolean; sqlalchemy_uri_placeholder: string; }; @@ -161,3 +197,28 @@ export enum CONFIGURATION_METHOD { SQLALCHEMY_URI = 'sqlalchemy_form', DYNAMIC_FORM = 'dynamic_form', } + +export enum Engines { + GSheet = 'gsheets', + Snowflake = 'snowflake', +} + +export interface ExtraJson { + allows_virtual_table_explore?: boolean; // in SQL Lab + cancel_query_on_windows_unload?: boolean; // in Performance + cost_estimate_enabled?: boolean; // in SQL Lab + disable_data_preview?: boolean; // in SQL Lab + engine_params?: { + catalog?: Record<string, string>; + connect_args?: { + http_path?: string; + }; + }; + metadata_params?: {}; + metadata_cache_timeout?: { + schema_cache_timeout?: number; // in Performance + table_cache_timeout?: number; // in Performance + }; // No field, holds schema and table timeout + schemas_allowed_for_file_upload?: string[]; // in Security + version?: string; +} diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/AddDataset.test.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/AddDataset.test.tsx new file mode 100644 index 000000000000..ea595c0f901a --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/AddDataset.test.tsx @@ -0,0 +1,47 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import AddDataset from 'src/views/CRUD/data/dataset/AddDataset'; + +const mockHistoryPush = jest.fn(); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), + useParams: () => ({ datasetId: undefined }), +})); + +describe('AddDataset', () => { + it('renders a blank state AddDataset', async () => { + render(<AddDataset />, { useRedux: true }); + + const blankeStateImgs = screen.getAllByRole('img', { name: /empty/i }); + + // Header + expect(await screen.findByText(/new dataset/i)).toBeVisible(); + // Left panel + expect(blankeStateImgs[0]).toBeVisible(); + // Footer + expect(screen.getByText(/Cancel/i)).toBeVisible(); + + expect(blankeStateImgs.length).toBe(1); + }); +}); diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.stories.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.stories.tsx new file mode 100644 index 000000000000..8a7fd7d6438f --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.stories.tsx @@ -0,0 +1,44 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { supersetTheme, ThemeProvider } from '@superset-ui/core'; +import DatasetPanel from './DatasetPanel'; +import { exampleColumns } from './fixtures'; + +export default { + title: 'Superset App/views/CRUD/data/dataset/DatasetPanel', + component: DatasetPanel, +} as ComponentMeta<typeof DatasetPanel>; + +export const Basic: ComponentStory<typeof DatasetPanel> = args => ( + <ThemeProvider theme={supersetTheme}> + <div style={{ height: '350px' }}> + <DatasetPanel {...args} /> + </div> + </ThemeProvider> +); + +Basic.args = { + tableName: 'example_table', + loading: false, + hasError: false, + columnList: exampleColumns, +}; diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.test.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.test.tsx new file mode 100644 index 000000000000..b5a29638c61b --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.test.tsx @@ -0,0 +1,160 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import DatasetPanel, { + REFRESHING, + ALT_LOADING, + tableColumnDefinition, + COLUMN_TITLE, +} from 'src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel'; +import { exampleColumns, exampleDataset } from './fixtures'; +import { + SELECT_MESSAGE, + CREATE_MESSAGE, + VIEW_DATASET_MESSAGE, + SELECT_TABLE_TITLE, + NO_COLUMNS_TITLE, + NO_COLUMNS_DESCRIPTION, + ERROR_TITLE, + ERROR_DESCRIPTION, +} from './MessageContent'; + +jest.mock( + 'src/components/Icons/Icon', + () => + ({ fileName }: { fileName: string }) => + <span role="img" aria-label={fileName.replace('_', '-')} />, +); + +describe('DatasetPanel', () => { + test('renders a blank state DatasetPanel', () => { + render(<DatasetPanel hasError={false} columnList={[]} loading={false} />); + + const blankDatasetImg = screen.getByRole('img', { name: /empty/i }); + expect(blankDatasetImg).toBeVisible(); + const blankDatasetTitle = screen.getByText(SELECT_TABLE_TITLE); + expect(blankDatasetTitle).toBeVisible(); + const blankDatasetDescription1 = screen.getByText(SELECT_MESSAGE, { + exact: false, + }); + expect(blankDatasetDescription1).toBeVisible(); + const blankDatasetDescription2 = screen.getByText(VIEW_DATASET_MESSAGE, { + exact: false, + }); + expect(blankDatasetDescription2).toBeVisible(); + const sqlLabLink = screen.getByRole('button', { + name: CREATE_MESSAGE, + }); + expect(sqlLabLink).toBeVisible(); + }); + + test('renders a no columns screen', () => { + render( + <DatasetPanel + tableName="Name" + hasError={false} + columnList={[]} + loading={false} + />, + ); + + const blankDatasetImg = screen.getByRole('img', { name: /empty/i }); + expect(blankDatasetImg).toBeVisible(); + const noColumnsTitle = screen.getByText(NO_COLUMNS_TITLE); + expect(noColumnsTitle).toBeVisible(); + const noColumnsDescription = screen.getByText(NO_COLUMNS_DESCRIPTION); + expect(noColumnsDescription).toBeVisible(); + }); + + test('renders a loading screen', () => { + render( + <DatasetPanel + tableName="Name" + hasError={false} + columnList={[]} + loading + />, + ); + + const blankDatasetImg = screen.getByAltText(ALT_LOADING); + expect(blankDatasetImg).toBeVisible(); + const blankDatasetTitle = screen.getByText(REFRESHING); + expect(blankDatasetTitle).toBeVisible(); + }); + + test('renders an error screen', () => { + render( + <DatasetPanel + tableName="Name" + hasError + columnList={[]} + loading={false} + />, + ); + + const errorTitle = screen.getByText(ERROR_TITLE); + expect(errorTitle).toBeVisible(); + const errorDescription = screen.getByText(ERROR_DESCRIPTION); + expect(errorDescription).toBeVisible(); + }); + + test('renders a table with columns displayed', async () => { + const tableName = 'example_name'; + render( + <DatasetPanel + tableName={tableName} + hasError={false} + columnList={exampleColumns} + loading={false} + />, + ); + expect(await screen.findByText(tableName)).toBeVisible(); + expect(screen.getByText(COLUMN_TITLE)).toBeVisible(); + expect( + screen.getByText(tableColumnDefinition[0].title as string), + ).toBeInTheDocument(); + expect( + screen.getByText(tableColumnDefinition[1].title as string), + ).toBeInTheDocument(); + exampleColumns.forEach(row => { + expect(screen.getByText(row.name)).toBeInTheDocument(); + expect(screen.getByText(row.type)).toBeInTheDocument(); + }); + }); + + test('renders an info banner if table already has a dataset', async () => { + render( + <DatasetPanel + tableName="example_table" + hasError={false} + columnList={exampleColumns} + loading={false} + datasets={exampleDataset} + />, + ); + + // This is text in the info banner + expect( + await screen.findByText( + /this table already has a dataset associated with it. you can only associate one dataset with a table./i, + ), + ).toBeVisible(); + }); +}); diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.tsx new file mode 100644 index 000000000000..8d579b79b8b9 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.tsx @@ -0,0 +1,353 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { t, styled, useTheme } from '@superset-ui/core'; +import Icons from 'src/components/Icons'; +import Alert from 'src/components/Alert'; +import Table, { ColumnsType, TableSize } from 'src/components/Table'; +import { alphabeticalSort } from 'src/components/Table/sorters'; +// @ts-ignore +import LOADING_GIF from 'src/assets/images/loading.gif'; +import { DatasetObject } from 'src/views/CRUD/data/dataset/AddDataset/types'; +import { ITableColumn } from './types'; +import MessageContent from './MessageContent'; + +/** + * Enum defining CSS position options + */ +enum EPosition { + ABSOLUTE = 'absolute', + RELATIVE = 'relative', +} + +/** + * Interface for StyledHeader + */ +interface StyledHeaderProps { + /** + * Determine the CSS positioning type + * Vertical centering of loader, No columns screen, and select table screen + * gets offset when the header position is relative and needs to be absolute, but table + * needs this positioned relative to render correctly + */ + position: EPosition; +} + +const LOADER_WIDTH = 200; +const SPINNER_WIDTH = 120; +const HALF = 0.5; +const MARGIN_MULTIPLIER = 3; + +const StyledHeader = styled.div<StyledHeaderProps>` + ${({ theme, position }) => ` + position: ${position}; + margin: ${theme.gridUnit * (MARGIN_MULTIPLIER + 1)}px + ${theme.gridUnit * MARGIN_MULTIPLIER}px + ${theme.gridUnit * MARGIN_MULTIPLIER}px + ${theme.gridUnit * (MARGIN_MULTIPLIER + 3)}px; + font-size: ${theme.gridUnit * 6}px; + font-weight: ${theme.typography.weights.medium}; + padding-bottom: ${theme.gridUnit * MARGIN_MULTIPLIER}px; + + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + .anticon:first-of-type { + margin-right: ${theme.gridUnit * (MARGIN_MULTIPLIER + 1)}px; + } + + .anticon:nth-of-type(2) { + margin-left: ${theme.gridUnit * (MARGIN_MULTIPLIER + 1)}px; + `} +`; + +const StyledTitle = styled.div` + ${({ theme }) => ` + margin-left: ${theme.gridUnit * (MARGIN_MULTIPLIER + 3)}px; + margin-bottom: ${theme.gridUnit * MARGIN_MULTIPLIER}px; + font-weight: ${theme.typography.weights.bold}; + `} +`; + +const LoaderContainer = styled.div` + ${({ theme }) => ` + padding: ${theme.gridUnit * 8}px + ${theme.gridUnit * 6}px; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; + height: 100%; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + `} +`; + +const StyledLoader = styled.div` + ${({ theme }) => ` + max-width: 50%; + width: ${LOADER_WIDTH}px; + + img { + width: ${SPINNER_WIDTH}px; + margin-left: ${(LOADER_WIDTH - SPINNER_WIDTH) * HALF}px; + } + + div { + width: 100%; + margin-top: ${theme.gridUnit * MARGIN_MULTIPLIER}px; + text-align: center; + font-weight: ${theme.typography.weights.normal}; + font-size: ${theme.typography.sizes.l}px; + color: ${theme.colors.grayscale.light1}; + } + `} +`; + +const TableContainerWithBanner = styled.div` + ${({ theme }) => ` + position: relative; + margin: ${theme.gridUnit * MARGIN_MULTIPLIER}px; + margin-left: ${theme.gridUnit * (MARGIN_MULTIPLIER + 3)}px; + height: calc(100% - ${theme.gridUnit * 60}px); + overflow: auto; + `} +`; + +const TableContainerWithoutBanner = styled.div` + ${({ theme }) => ` + position: relative; + margin: ${theme.gridUnit * MARGIN_MULTIPLIER}px; + margin-left: ${theme.gridUnit * (MARGIN_MULTIPLIER + 3)}px; + height: calc(100% - ${theme.gridUnit * 30}px); + overflow: auto; + `} +`; + +const TableScrollContainer = styled.div` + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; +`; + +const StyledAlert = styled(Alert)` + ${({ theme }) => ` + border: 1px solid ${theme.colors.info.base}; + padding: ${theme.gridUnit * 4}px; + margin: ${theme.gridUnit * 6}px ${theme.gridUnit * 6}px + ${theme.gridUnit * 8}px; + .view-dataset-button { + position: absolute; + top: ${theme.gridUnit * 4}px; + right: ${theme.gridUnit * 4}px; + font-weight: ${theme.typography.weights.normal}; + + &:hover { + color: ${theme.colors.secondary.dark3}; + text-decoration: underline; + } + } + `} +`; + +export const REFRESHING = t('Refreshing columns'); +export const COLUMN_TITLE = t('Table columns'); +export const ALT_LOADING = t('Loading'); + +const pageSizeOptions = ['5', '10', '15', '25']; +const DEFAULT_PAGE_SIZE = 25; + +// Define the columns for Table instance +export const tableColumnDefinition: ColumnsType<ITableColumn> = [ + { + title: 'Column Name', + dataIndex: 'name', + key: 'name', + sorter: (a: ITableColumn, b: ITableColumn) => + alphabeticalSort('name', a, b), + }, + { + title: 'Datatype', + dataIndex: 'type', + key: 'type', + width: '100px', + sorter: (a: ITableColumn, b: ITableColumn) => + alphabeticalSort('type', a, b), + }, +]; + +/** + * Props interface for DatasetPanel + */ +export interface IDatasetPanelProps { + /** + * Name of the database table + */ + tableName?: string | null; + /** + * Array of ITableColumn instances with name and type attributes + */ + columnList: ITableColumn[]; + /** + * Boolean indicating if there is an error state + */ + hasError: boolean; + /** + * Boolean indicating if the component is in a loading state + */ + loading: boolean; + datasets?: DatasetObject[] | undefined; +} + +const EXISTING_DATASET_DESCRIPTION = t( + 'This table already has a dataset associated with it. You can only associate one dataset with a table.\n', +); +const VIEW_DATASET = t('View Dataset'); + +const renderExistingDatasetAlert = (dataset?: DatasetObject) => ( + <StyledAlert + closable={false} + type="info" + showIcon + message={t('This table already has a dataset')} + description={ + <> + {EXISTING_DATASET_DESCRIPTION} + <span + role="button" + onClick={() => { + window.open( + dataset?.explore_url, + '_blank', + 'noreferrer noopener popup=false', + ); + }} + tabIndex={0} + className="view-dataset-button" + > + {VIEW_DATASET} + </span> + </> + } + /> +); + +const DatasetPanel = ({ + tableName, + columnList, + loading, + hasError, + datasets, +}: IDatasetPanelProps) => { + const theme = useTheme(); + const hasColumns = columnList?.length > 0 ?? false; + const datasetNames = datasets?.map(dataset => dataset.table_name); + const tableWithDataset = datasets?.find( + dataset => dataset.table_name === tableName, + ); + + let component; + let loader; + if (loading) { + loader = ( + <LoaderContainer> + <StyledLoader> + <img alt={ALT_LOADING} src={LOADING_GIF} /> + <div>{REFRESHING}</div> + </StyledLoader> + </LoaderContainer> + ); + } + if (!loading) { + if (!loading && tableName && hasColumns && !hasError) { + component = ( + <> + <StyledTitle>{COLUMN_TITLE}</StyledTitle> + {tableWithDataset ? ( + <TableContainerWithBanner> + <TableScrollContainer> + <Table + loading={loading} + size={TableSize.SMALL} + columns={tableColumnDefinition} + data={columnList} + pageSizeOptions={pageSizeOptions} + defaultPageSize={DEFAULT_PAGE_SIZE} + /> + </TableScrollContainer> + </TableContainerWithBanner> + ) : ( + <TableContainerWithoutBanner> + <TableScrollContainer> + <Table + loading={loading} + size={TableSize.SMALL} + columns={tableColumnDefinition} + data={columnList} + pageSizeOptions={pageSizeOptions} + defaultPageSize={DEFAULT_PAGE_SIZE} + /> + </TableScrollContainer> + </TableContainerWithoutBanner> + )} + </> + ); + } else { + component = ( + <MessageContent + hasColumns={hasColumns} + hasError={hasError} + tableName={tableName} + /> + ); + } + } + + return ( + <> + {tableName && ( + <> + {datasetNames?.includes(tableName) && + renderExistingDatasetAlert(tableWithDataset)} + <StyledHeader + position={ + !loading && hasColumns ? EPosition.RELATIVE : EPosition.ABSOLUTE + } + title={tableName || ''} + > + {tableName && ( + <Icons.Table iconColor={theme.colors.grayscale.base} /> + )} + {tableName} + </StyledHeader> + </> + )} + {component} + {loader} + </> + ); +}; + +export default DatasetPanel; diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/MessageContent.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/MessageContent.tsx new file mode 100644 index 000000000000..5d0ef5eda736 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/MessageContent.tsx @@ -0,0 +1,107 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { t, styled } from '@superset-ui/core'; +import { EmptyStateBig } from 'src/components/EmptyState'; + +const StyledContainer = styled.div` + padding: ${({ theme }) => theme.gridUnit * 8}px + ${({ theme }) => theme.gridUnit * 6}px; + + display: flex; + align-items: center; + justify-content: center; + height: 100%; +`; + +const StyledEmptyStateBig = styled(EmptyStateBig)` + max-width: 50%; + + p { + width: ${({ theme }) => theme.gridUnit * 115}px; + } +`; + +export const SELECT_MESSAGE = t( + 'Datasets can be created from database tables or SQL queries. Select a database table to the left or ', +); +export const CREATE_MESSAGE = t('create dataset from SQL query'); +export const VIEW_DATASET_MESSAGE = t( + ' to open SQL Lab. From there you can save the query as a dataset.', +); + +const renderEmptyDescription = () => ( + <> + {SELECT_MESSAGE} + <span + role="button" + onClick={() => { + window.location.href = `/superset/sqllab`; + }} + tabIndex={0} + > + {CREATE_MESSAGE} + </span> + {VIEW_DATASET_MESSAGE} + </> +); + +export const SELECT_TABLE_TITLE = t('Select dataset source'); +export const NO_COLUMNS_TITLE = t('No table columns'); +export const NO_COLUMNS_DESCRIPTION = t( + 'This database table does not contain any data. Please select a different table.', +); +export const ERROR_TITLE = t('An Error Occurred'); +export const ERROR_DESCRIPTION = t( + 'Unable to load columns for the selected table. Please select a different table.', +); + +interface MessageContentProps { + hasError: boolean; + tableName?: string | null; + hasColumns: boolean; +} + +export const MessageContent = (props: MessageContentProps) => { + const { hasError, tableName, hasColumns } = props; + let currentImage: string | undefined = 'empty-dataset.svg'; + let currentTitle = SELECT_TABLE_TITLE; + let currentDescription = renderEmptyDescription(); + if (hasError) { + currentTitle = ERROR_TITLE; + currentDescription = <>{ERROR_DESCRIPTION}</>; + currentImage = undefined; + } else if (tableName && !hasColumns) { + currentImage = 'no-columns.svg'; + currentTitle = NO_COLUMNS_TITLE; + currentDescription = <>{NO_COLUMNS_DESCRIPTION}</>; + } + return ( + <StyledContainer> + <StyledEmptyStateBig + image={currentImage} + title={currentTitle} + description={currentDescription} + /> + </StyledContainer> + ); +}; + +export default MessageContent; diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/emitFilterControl.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/fixtures.ts similarity index 57% rename from superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/emitFilterControl.tsx rename to superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/fixtures.ts index a4c3f4a86d8a..5c09188c61a8 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/emitFilterControl.tsx +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/fixtures.ts @@ -16,22 +16,34 @@ * specific language governing permissions and limitations * under the License. */ +import { DatasetObject } from 'src/views/CRUD/data/dataset/AddDataset/types'; +import { ITableColumn } from './types'; -import { FeatureFlag, isFeatureEnabled, t } from '@superset-ui/core'; +export const exampleColumns: ITableColumn[] = [ + { + name: 'name', + type: 'STRING', + }, + { + name: 'height_in_inches', + type: 'NUMBER', + }, + { + name: 'birth_date', + type: 'DATE', + }, +]; -const enableCrossFilter = isFeatureEnabled(FeatureFlag.DASHBOARD_CROSS_FILTERS); - -export const emitFilterControl = enableCrossFilter - ? [ - { - name: 'emit_filter', - config: { - type: 'CheckboxControl', - label: t('Enable dashboard cross filters'), - default: false, - renderTrigger: true, - description: t('Enable dashboard cross filters'), - }, - }, - ] - : []; +export const exampleDataset: DatasetObject[] = [ + { + db: { + id: 1, + database_name: 'test_database', + owners: [1], + backend: 'test_backend', + }, + schema: 'test_schema', + dataset_name: 'example_dataset', + table_name: 'example_table', + }, +]; diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/index.tsx new file mode 100644 index 000000000000..73bea70b41f2 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/index.tsx @@ -0,0 +1,140 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useEffect, useState, useRef } from 'react'; +import { SupersetClient, logging, t } from '@superset-ui/core'; +import { DatasetObject } from 'src/views/CRUD/data/dataset/AddDataset/types'; +import { addDangerToast } from 'src/components/MessageToasts/actions'; +import DatasetPanel from './DatasetPanel'; +import { ITableColumn, IDatabaseTable, isIDatabaseTable } from './types'; + +/** + * Interface for the getTableMetadata API call + */ +interface IColumnProps { + /** + * Unique id of the database + */ + dbId: number; + /** + * Name of the table + */ + tableName: string; + /** + * Name of the schema + */ + schema: string; +} + +export interface IDatasetPanelWrapperProps { + /** + * Name of the database table + */ + tableName?: string | null; + /** + * Database ID + */ + dbId?: number; + /** + * The selected schema for the database + */ + schema?: string | null; + setHasColumns?: Function; + datasets?: DatasetObject[] | undefined; +} + +const DatasetPanelWrapper = ({ + tableName, + dbId, + schema, + setHasColumns, + datasets, +}: IDatasetPanelWrapperProps) => { + const [columnList, setColumnList] = useState<ITableColumn[]>([]); + const [loading, setLoading] = useState(false); + const [hasError, setHasError] = useState(false); + const tableNameRef = useRef(tableName); + + const getTableMetadata = async (props: IColumnProps) => { + const { dbId, tableName, schema } = props; + setLoading(true); + setHasColumns?.(false); + const path = `/api/v1/database/${dbId}/table/${tableName}/${schema}/`; + try { + const response = await SupersetClient.get({ + endpoint: path, + }); + + if (isIDatabaseTable(response?.json)) { + const table: IDatabaseTable = response.json as IDatabaseTable; + /** + * The user is able to click other table columns while the http call for last selected table column is made + * This check ensures we process the response that matches the last selected table name and ignore the others + */ + if (table.name === tableNameRef.current) { + setColumnList(table.columns); + setHasColumns?.(table.columns.length > 0); + setHasError(false); + } + } else { + setColumnList([]); + setHasColumns?.(false); + setHasError(true); + addDangerToast( + t( + 'The API response from %s does not match the IDatabaseTable interface.', + path, + ), + ); + logging.error( + t( + 'The API response from %s does not match the IDatabaseTable interface.', + path, + ), + ); + } + } catch (error) { + setColumnList([]); + setHasColumns?.(false); + setHasError(true); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + tableNameRef.current = tableName; + if (tableName && schema && dbId) { + getTableMetadata({ tableName, dbId, schema }); + } + // getTableMetadata is a const and should not be in dependency array + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [tableName, dbId, schema]); + + return ( + <DatasetPanel + columnList={columnList} + hasError={hasError} + loading={loading} + tableName={tableName} + datasets={datasets} + /> + ); +}; + +export default DatasetPanelWrapper; diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/types.ts b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/types.ts new file mode 100644 index 000000000000..c2330f3f10a4 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/types.ts @@ -0,0 +1,92 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Interface for table columns dataset + */ +export interface ITableColumn { + /** + * Name of the column + */ + name: string; + /** + * Datatype of the column + */ + type: string; +} + +/** + * Checks if a given item matches the ITableColumn interface + * @param item Object to check if it matches the ITableColumn interface + * @returns boolean true if matches interface + */ +export const isITableColumn = (item: any): boolean => { + let match = true; + const BASE_ERROR = + 'The object provided to isITableColumn does match the interface.'; + if (typeof item?.name !== 'string') { + match = false; + // eslint-disable-next-line no-console + console.error( + `${BASE_ERROR} The property 'name' is required and must be a string`, + ); + } + if (match && typeof item?.type !== 'string') { + match = false; + // eslint-disable-next-line no-console + console.error( + `${BASE_ERROR} The property 'type' is required and must be a string`, + ); + } + return match; +}; + +export interface IDatabaseTable { + name: string; + columns: ITableColumn[]; +} + +/** + * Checks if a given item matches the isIDatabsetTable interface + * @param item Object to check if it matches the isIDatabsetTable interface + * @returns boolean true if matches interface + */ +export const isIDatabaseTable = (item: any): boolean => { + let match = true; + if (typeof item?.name !== 'string') { + match = false; + } + if (match && !Array.isArray(item.columns)) { + match = false; + } + if (match && item.columns.length > 0) { + const invalid = item.columns.some((column: any, index: number) => { + const valid = isITableColumn(column); + if (!valid) { + // eslint-disable-next-line no-console + console.error( + `The provided object does not match the IDatabaseTable interface. columns[${index}] is invalid and does not match the ITableColumn interface`, + ); + } + return !valid; + }); + match = !invalid; + } + return match; +}; diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/EditDataset.test.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/EditDataset.test.tsx new file mode 100644 index 000000000000..c24496facc87 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/EditDataset.test.tsx @@ -0,0 +1,43 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import fetchMock from 'fetch-mock'; +import { render, screen } from 'spec/helpers/testing-library'; +import EditDataset from './index'; + +const DATASET_ENDPOINT = 'glob:*api/v1/dataset/1/related_objects'; + +const mockedProps = { + id: '1', +}; + +fetchMock.get(DATASET_ENDPOINT, { charts: { results: [], count: 2 } }); + +test('should render edit dataset view with tabs', async () => { + render(<EditDataset {...mockedProps} />); + + const columnTab = await screen.findByRole('tab', { name: /columns/i }); + const metricsTab = screen.getByRole('tab', { name: /metrics/i }); + const usageTab = screen.getByRole('tab', { name: /usage/i }); + + expect(fetchMock.calls(DATASET_ENDPOINT)).toBeTruthy(); + expect(columnTab).toBeInTheDocument(); + expect(metricsTab).toBeInTheDocument(); + expect(usageTab).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/UsageTab/UsageTab.test.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/UsageTab/UsageTab.test.tsx new file mode 100644 index 000000000000..7bbdbbfd52cf --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/UsageTab/UsageTab.test.tsx @@ -0,0 +1,405 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import fetchMock from 'fetch-mock'; +import userEvent from '@testing-library/user-event'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import { ChartListChart, getMockChart } from 'spec/fixtures/mockCharts'; +import ToastContainer from 'src/components/MessageToasts/ToastContainer'; +import DatasetUsage from '.'; + +const DEFAULT_DATASET_ID = '1'; +const DEFAULT_ORDER_COLUMN = 'last_saved_at'; +const DEFAULT_ORDER_DIRECTION = 'desc'; +const DEFAULT_PAGE = 0; +const DEFAULT_PAGE_SIZE = 25; + +const getChartResponse = (result: ChartListChart[]) => ({ + count: result.length, + result, +}); + +const CHARTS_ENDPOINT = 'glob:*/api/v1/chart/?*'; +const mockChartsFetch = (response: fetchMock.MockResponse) => { + fetchMock.reset(); + fetchMock.get('glob:*/api/v1/chart/_info?*', { + permissions: ['can_export', 'can_read', 'can_write'], + }); + + fetchMock.get(CHARTS_ENDPOINT, response); +}; + +const renderDatasetUsage = () => + render( + <> + <DatasetUsage datasetId={DEFAULT_DATASET_ID} /> + <ToastContainer /> + </>, + { useRedux: true, useRouter: true }, + ); + +const expectLastChartRequest = (params?: { + datasetId?: string; + orderColumn?: string; + orderDirection?: 'desc' | 'asc'; + page?: number; + pageSize?: number; +}) => { + const { datasetId, orderColumn, orderDirection, page, pageSize } = { + datasetId: DEFAULT_DATASET_ID, + orderColumn: DEFAULT_ORDER_COLUMN, + orderDirection: DEFAULT_ORDER_DIRECTION, + page: DEFAULT_PAGE, + pageSize: DEFAULT_PAGE_SIZE, + ...(params || {}), + }; + + const calls = fetchMock.calls(CHARTS_ENDPOINT); + expect(calls.length).toBeGreaterThan(0); + const lastChartRequestUrl = calls[calls.length - 1][0]; + expect(lastChartRequestUrl).toMatch( + new RegExp(`col:datasource_id,opr:eq,value:%27${datasetId}%27`), + ); + + expect(lastChartRequestUrl).toMatch( + new RegExp(`order_column:${orderColumn}`), + ); + + expect(lastChartRequestUrl).toMatch( + new RegExp(`order_direction:${orderDirection}`), + ); + + expect(lastChartRequestUrl).toMatch(new RegExp(`page:${page}`)); + expect(lastChartRequestUrl).toMatch(new RegExp(`page_size:${pageSize}`)); +}; + +test('shows loading state', async () => { + mockChartsFetch( + new Promise(resolve => + setTimeout(() => resolve(getChartResponse([])), 250), + ), + ); + + renderDatasetUsage(); + + const loadingIndicator = await screen.findByRole('status', { + name: /loading/i, + }); + + expect(loadingIndicator).toBeVisible(); +}); + +test('shows error state', async () => { + mockChartsFetch(500); + renderDatasetUsage(); + + const errorMessage = await screen.findByText( + /an error occurred while fetching charts/i, + ); + + expect(errorMessage).toBeInTheDocument(); +}); + +test('shows empty state', async () => { + mockChartsFetch(getChartResponse([])); + renderDatasetUsage(); + + const noChartsTitle = await screen.findByText(/no charts/i); + const noChartsDescription = screen.getByText( + /this dataset is not used to power any charts\./i, + ); + + expect(noChartsTitle).toBeVisible(); + expect(noChartsDescription).toBeVisible(); + expect(fetchMock.calls(CHARTS_ENDPOINT)).toHaveLength(1); + expectLastChartRequest(); +}); + +test('show and sort by chart title', async () => { + mockChartsFetch( + getChartResponse([ + getMockChart({ id: 1, slice_name: 'Sample A' }), + getMockChart({ id: 2, slice_name: 'Sample C' }), + getMockChart({ id: 3, slice_name: 'Sample B' }), + ]), + ); + + renderDatasetUsage(); + + const chartNameColumnHeader = screen.getByText('Chart'); + const chartNameLinks = await screen.findAllByRole('link', { + name: /sample/i, + }); + + // Default sort + expect(chartNameLinks).toHaveLength(3); + expect(chartNameLinks[0]).toHaveTextContent('Sample A'); + expect(chartNameLinks[0]).toHaveAttribute('href', '/explore/?slice_id=1'); + expect(chartNameLinks[1]).toHaveTextContent('Sample C'); + expect(chartNameLinks[1]).toHaveAttribute('href', '/explore/?slice_id=2'); + expect(chartNameLinks[2]).toHaveTextContent('Sample B'); + expect(chartNameLinks[2]).toHaveAttribute('href', '/explore/?slice_id=3'); + expectLastChartRequest(); + + // Sort by name ascending + userEvent.click(chartNameColumnHeader); + waitFor(() => { + expectLastChartRequest({ + orderColumn: 'slice_name', + orderDirection: 'asc', + }); + }); + + // Sort by name descending + userEvent.click(chartNameColumnHeader); + waitFor(() => { + expectLastChartRequest({ + orderColumn: 'slice_name', + orderDirection: 'desc', + }); + }); +}); + +test('show chart owners', async () => { + mockChartsFetch( + getChartResponse([ + getMockChart({ + id: 1, + owners: [ + { id: 1, first_name: 'John', last_name: 'Doe', username: 'j1' }, + { id: 2, first_name: 'Jane', last_name: 'Doe', username: 'j2' }, + ], + }), + getMockChart({ id: 2 }), + getMockChart({ + id: 3, + owners: [ + { id: 3, first_name: 'John', last_name: 'Doe', username: 'j1' }, + ], + }), + ]), + ); + + renderDatasetUsage(); + + const chartOwners = await screen.findAllByText(/doe/i); + + expect(chartOwners).toHaveLength(3); + expect(chartOwners[0]).toHaveTextContent('John Doe'); + expect(chartOwners[1]).toHaveTextContent('Jane Doe'); + expect(chartOwners[0].parentNode).toBe(chartOwners[1].parentNode); + expect(chartOwners[2]).toHaveTextContent('John Doe'); + expect(chartOwners[2].parentNode).not.toBe(chartOwners[0].parentNode); + expect(chartOwners[2].parentNode).not.toBe(chartOwners[1].parentNode); + expectLastChartRequest(); +}); + +const getDate = (msAgo: number) => { + const date = new Date(); + date.setMilliseconds(date.getMilliseconds() - msAgo); + return date; +}; + +test('show and sort by chart last modified', async () => { + mockChartsFetch( + getChartResponse([ + getMockChart({ id: 2, last_saved_at: getDate(10000).toISOString() }), + getMockChart({ id: 1, last_saved_at: getDate(1000000).toISOString() }), + getMockChart({ id: 3, last_saved_at: getDate(100000000).toISOString() }), + ]), + ); + + renderDatasetUsage(); + + const chartLastModifiedColumnHeader = screen.getByText('Chart last modified'); + const chartLastModifiedValues = await screen.findAllByText( + /a few seconds ago|17 minutes ago|a day ago/i, + ); + + // Default sort + expect(chartLastModifiedValues).toHaveLength(3); + expect(chartLastModifiedValues[0]).toHaveTextContent('a few seconds ago'); + expect(chartLastModifiedValues[1]).toHaveTextContent('17 minutes ago'); + expect(chartLastModifiedValues[2]).toHaveTextContent('a day ago'); + expectLastChartRequest(); + + // Sort by last modified ascending + userEvent.click(chartLastModifiedColumnHeader); + waitFor(() => { + expectLastChartRequest({ orderDirection: 'asc' }); + }); + + // Sort by last modified descending + userEvent.click(chartLastModifiedColumnHeader); + waitFor(() => { + expectLastChartRequest({ orderDirection: 'desc' }); + }); +}); + +test('show and sort by chart last modified by', async () => { + mockChartsFetch( + getChartResponse([ + getMockChart({ + id: 2, + last_saved_by: { id: 1, first_name: 'John', last_name: 'Doe' }, + }), + getMockChart({ + id: 1, + last_saved_by: null, + }), + getMockChart({ + id: 3, + last_saved_by: { id: 2, first_name: 'Jane', last_name: 'Doe' }, + }), + ]), + ); + + renderDatasetUsage(); + + const chartLastModifiedByColumnHeader = screen.getByText( + 'Chart last modified by', + ); + + const chartLastModifiedByValues = await screen.findAllByText(/doe/i); + + // Default sort + expect(chartLastModifiedByValues).toHaveLength(2); + expect(chartLastModifiedByValues[0]).toHaveTextContent('John Doe'); + expect(chartLastModifiedByValues[1]).toHaveTextContent('Jane Doe'); + expectLastChartRequest(); + + // Sort by last modified ascending + userEvent.click(chartLastModifiedByColumnHeader); + waitFor(() => { + expectLastChartRequest({ orderDirection: 'asc' }); + }); + + // Sort by last modified descending + userEvent.click(chartLastModifiedByColumnHeader); + waitFor(() => { + expectLastChartRequest({ orderDirection: 'desc' }); + }); +}); + +test('show chart dashboards', async () => { + mockChartsFetch( + getChartResponse([ + getMockChart({ + id: 1, + dashboards: [ + { id: 1, dashboard_title: 'Sample dashboard A' }, + { id: 2, dashboard_title: 'Sample dashboard B' }, + ], + }), + getMockChart({ id: 2 }), + getMockChart({ + id: 3, + dashboards: [{ id: 3, dashboard_title: 'Sample dashboard C' }], + }), + ]), + ); + + renderDatasetUsage(); + + const chartDashboards = await screen.findAllByRole('link', { + name: /sample dashboard/i, + }); + + expect(chartDashboards).toHaveLength(3); + expect(chartDashboards[0]).toHaveTextContent('Sample dashboard A'); + expect(chartDashboards[0]).toHaveAttribute('href', '/superset/dashboard/1'); + expect(chartDashboards[1]).toHaveTextContent('Sample dashboard B'); + expect(chartDashboards[1]).toHaveAttribute('href', '/superset/dashboard/2'); + expect(chartDashboards[0].closest('.ant-table-cell')).toBe( + chartDashboards[1].closest('.ant-table-cell'), + ); + + expect(chartDashboards[2]).toHaveTextContent('Sample dashboard C'); + expect(chartDashboards[2]).toHaveAttribute('href', '/superset/dashboard/3'); + expect(chartDashboards[2].closest('.ant-table-cell')).not.toBe( + chartDashboards[0].closest('.ant-table-cell'), + ); + + expect(chartDashboards[2].closest('.ant-table-cell')).not.toBe( + chartDashboards[1].closest('.ant-table-cell'), + ); + + expectLastChartRequest(); + + expect( + screen.queryByRole('button', { + name: /right/i, + }), + ).not.toBeInTheDocument(); +}); + +test('paginates', async () => { + const charts = []; + for (let i = 0; i < 65; i += 1) { + charts.push( + getMockChart({ + id: i + 1, + slice_name: `Sample chart ${i + 1}`, + }), + ); + } + + mockChartsFetch(getChartResponse(charts)); + renderDatasetUsage(); + + // First page + let chartNameValues = await screen.findAllByRole('cell', { + name: /sample chart/i, + }); + + expect(chartNameValues).toHaveLength(25); + expect(chartNameValues[0]).toHaveTextContent('Sample chart 1'); + expect(chartNameValues[24]).toHaveTextContent('Sample chart 25'); + + // Second page + userEvent.click( + screen.getByRole('button', { + name: /right/i, + }), + ); + + chartNameValues = await screen.findAllByRole('cell', { + name: /sample chart/i, + }); + + expect(chartNameValues).toHaveLength(25); + expect(chartNameValues[0]).toHaveTextContent('Sample chart 26'); + expect(chartNameValues[24]).toHaveTextContent('Sample chart 50'); + + // Third page + userEvent.click( + screen.getByRole('button', { + name: /right/i, + }), + ); + + chartNameValues = await screen.findAllByRole('cell', { + name: /sample chart/i, + }); + + expect(chartNameValues).toHaveLength(15); + expect(chartNameValues[0]).toHaveTextContent('Sample chart 51'); + expect(chartNameValues[14]).toHaveTextContent('Sample chart 65'); +}); diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/UsageTab/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/UsageTab/index.tsx new file mode 100644 index 000000000000..99663d91e19d --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/UsageTab/index.tsx @@ -0,0 +1,261 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useCallback, useEffect, useMemo } from 'react'; +import { Link } from 'react-router-dom'; +import { + css, + ensureIsArray, + styled, + SupersetTheme, + t, +} from '@superset-ui/core'; +import Chart, { ChartLinkedDashboard } from 'src/types/Chart'; +import Table, { + ColumnsType, + TableSize, + OnChangeFunction, +} from 'src/components/Table'; +import { EmptyStateBig } from 'src/components/EmptyState'; +import ChartImage from 'src/assets/images/chart.svg'; +import Icons from 'src/components/Icons'; +import { useToasts } from 'src/components/MessageToasts/withToasts'; +import { useListViewResource } from 'src/views/CRUD/hooks'; +import { FilterOperator } from 'src/components/ListView'; +import moment from 'moment'; +import TruncatedList from 'src/components/TruncatedList'; + +interface DatasetUsageProps { + datasetId: string; +} + +const DEFAULT_PAGE_SIZE = 25; + +const getLinkProps = (dashboard: ChartLinkedDashboard) => ({ + key: dashboard.id, + to: `/superset/dashboard/${dashboard.id}`, + target: '_blank', + rel: 'noreferer noopener', + children: dashboard.dashboard_title, +}); + +const tooltipItemCSS = (theme: SupersetTheme) => css` + color: ${theme.colors.grayscale.light5}; + text-decoration: underline; + &:hover { + color: inherit; + } +`; + +const columns: ColumnsType<Chart> = [ + { + key: 'slice_name', + title: t('Chart'), + width: '320px', + sorter: true, + render: (value, record) => <Link to={record.url}>{record.slice_name}</Link>, + }, + { + key: 'owners', + title: t('Chart owners'), + width: '242px', + render: (value, record) => ( + <TruncatedList + items={ + record.owners?.map( + owner => `${owner.first_name} ${owner.last_name}`, + ) ?? [] + } + /> + ), + }, + { + key: 'last_saved_at', + title: t('Chart last modified'), + width: '209px', + sorter: true, + defaultSortOrder: 'descend', + render: (value, record) => + record.last_saved_at ? moment.utc(record.last_saved_at).fromNow() : null, + }, + { + key: 'last_saved_by.first_name', + title: t('Chart last modified by'), + width: '216px', + sorter: true, + render: (value, record) => + record.last_saved_by + ? `${record.last_saved_by.first_name} ${record.last_saved_by.last_name}` + : null, + }, + { + key: 'dashboards', + title: t('Dashboard usage'), + width: '420px', + render: (value, record) => ( + <TruncatedList<ChartLinkedDashboard> + items={record.dashboards} + renderVisibleItem={dashboard => <Link {...getLinkProps(dashboard)} />} + renderTooltipItem={dashboard => ( + <Link {...getLinkProps(dashboard)} css={tooltipItemCSS} /> + )} + getKey={dashboard => dashboard.id} + /> + ), + }, +]; + +const emptyStateTableCSS = (theme: SupersetTheme) => css` + && th.ant-table-cell { + color: ${theme.colors.grayscale.light1}; + } + + .ant-table-placeholder { + display: none; + } +`; + +const emptyStateButtonText = ( + <> + <Icons.PlusOutlined + iconSize="m" + css={css` + & > .anticon { + line-height: 0; + } + `} + /> + {t('Create chart with dataset')} + </> +); + +const StyledEmptyStateBig = styled(EmptyStateBig)` + margin: ${({ theme }) => 13 * theme.gridUnit}px 0; +`; + +/** + * Hook that uses the useListViewResource hook to retrieve records + * based on pagination state. + */ +const useDatasetChartRecords = (datasetId: string) => { + const { addDangerToast } = useToasts(); + + // Always filters charts by dataset + const baseFilters = useMemo( + () => [ + { + id: 'datasource_id', + operator: FilterOperator.equals, + value: datasetId, + }, + ], + [datasetId], + ); + + // Returns request status/results and function for re-fetching + const { + state: { loading, resourceCount, resourceCollection }, + fetchData, + } = useListViewResource<Chart>( + 'chart', + t('chart'), + addDangerToast, + true, + [], + baseFilters, + ); + + // Adds `key` field + const resourceCollectionWithKey = useMemo( + () => resourceCollection.map(o => ({ ...o, key: o.id })), + [resourceCollection], + ); + + // Called by table with updated table state to fetch new data + const onChange: OnChangeFunction = useCallback( + (tablePagination, tableFilters, tableSorter) => { + const pageIndex = (tablePagination.current ?? 1) - 1; + const pageSize = tablePagination.pageSize ?? 0; + const sortBy = ensureIsArray(tableSorter) + .filter(({ columnKey }) => typeof columnKey === 'string') + .map(({ columnKey, order }) => ({ + id: columnKey as string, + desc: order === 'descend', + })); + fetchData({ pageIndex, pageSize, sortBy, filters: [] }); + }, + [fetchData], + ); + + // Initial data request + useEffect(() => { + fetchData({ + pageIndex: 0, + pageSize: DEFAULT_PAGE_SIZE, + sortBy: [{ id: 'last_saved_at', desc: true }], + filters: [], + }); + }, [fetchData]); + + return { + loading, + recordCount: resourceCount, + data: resourceCollectionWithKey, + onChange, + }; +}; + +const DatasetUsage = ({ datasetId }: DatasetUsageProps) => { + const { loading, recordCount, data, onChange } = + useDatasetChartRecords(datasetId); + + const emptyStateButtonAction = useCallback( + () => + window.open( + `/explore/?dataset_type=table&dataset_id=${datasetId}`, + '_blank', + ), + [datasetId], + ); + + return ( + <div css={!data.length ? emptyStateTableCSS : null}> + <Table + columns={columns} + data={data} + size={TableSize.MIDDLE} + defaultPageSize={DEFAULT_PAGE_SIZE} + recordCount={recordCount} + loading={loading} + onChange={onChange} + /> + {!data.length && !loading ? ( + <StyledEmptyStateBig + image={<ChartImage />} + title={t('No charts')} + description={t('This dataset is not used to power any charts.')} + buttonText={emptyStateButtonText} + buttonAction={emptyStateButtonAction} + /> + ) : null} + </div> + ); +}; + +export default DatasetUsage; diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/index.tsx new file mode 100644 index 000000000000..e8853cf043b1 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/EditDataset/index.tsx @@ -0,0 +1,78 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { styled, t } from '@superset-ui/core'; +import React from 'react'; +import { useGetDatasetRelatedCounts } from 'src/views/CRUD/data/hooks'; +import Badge from 'src/components/Badge'; +import Tabs from 'src/components/Tabs'; +import UsageTab from './UsageTab'; + +const StyledTabs = styled(Tabs)` + ${({ theme }) => ` + margin-top: ${theme.gridUnit * 8.5}px; + padding-left: ${theme.gridUnit * 4}px; + padding-right: ${theme.gridUnit * 4}px; + + .ant-tabs-top > .ant-tabs-nav::before { + width: ${theme.gridUnit * 50}px; + } + `} +`; + +const TabStyles = styled.div` + ${({ theme }) => ` + .ant-badge { + width: ${theme.gridUnit * 8}px; + margin-left: ${theme.gridUnit * 2.5}px; + } + `} +`; + +interface EditPageProps { + id: string; +} + +const TRANSLATIONS = { + USAGE_TEXT: t('Usage'), + COLUMNS_TEXT: t('Columns'), + METRICS_TEXT: t('Metrics'), +}; + +const EditPage = ({ id }: EditPageProps) => { + const { usageCount } = useGetDatasetRelatedCounts(id); + + const usageTab = ( + <TabStyles> + <span>{TRANSLATIONS.USAGE_TEXT}</span> + {usageCount > 0 && <Badge count={usageCount} />} + </TabStyles> + ); + + return ( + <StyledTabs moreIcon={null} fullWidth={false}> + <Tabs.TabPane tab={TRANSLATIONS.COLUMNS_TEXT} key="1" /> + <Tabs.TabPane tab={TRANSLATIONS.METRICS_TEXT} key="2" /> + <Tabs.TabPane tab={usageTab} key="3"> + <UsageTab datasetId={id} /> + </Tabs.TabPane> + </StyledTabs> + ); +}; + +export default EditPage; diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/Footer/Footer.test.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/Footer/Footer.test.tsx new file mode 100644 index 000000000000..a1818cdf2291 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/Footer/Footer.test.tsx @@ -0,0 +1,87 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import Footer from 'src/views/CRUD/data/dataset/AddDataset/Footer'; + +const mockHistoryPush = jest.fn(); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), +})); + +const mockedProps = { + url: 'realwebsite.com', +}; + +const mockPropsWithDataset = { + url: 'realwebsite.com', + datasetObject: { + database: { + id: '1', + database_name: 'examples', + }, + owners: [1, 2, 3], + schema: 'public', + dataset_name: 'Untitled', + table_name: 'real_info', + }, + hasColumns: true, +}; + +describe('Footer', () => { + test('renders a Footer with a cancel button and a disabled create button', () => { + render(<Footer {...mockedProps} />, { useRedux: true }); + + const saveButton = screen.getByRole('button', { + name: /Cancel/i, + }); + + const createButton = screen.getByRole('button', { + name: /Create/i, + }); + + expect(saveButton).toBeVisible(); + expect(createButton).toBeDisabled(); + }); + + test('renders a Create Dataset button when a table is selected', () => { + render(<Footer {...mockPropsWithDataset} />, { useRedux: true }); + + const createButton = screen.getByRole('button', { + name: /Create/i, + }); + + expect(createButton).toBeEnabled(); + }); + + test('create button becomes disabled when table already has a dataset', () => { + render(<Footer datasets={['real_info']} {...mockPropsWithDataset} />, { + useRedux: true, + }); + + const createButton = screen.getByRole('button', { + name: /Create/i, + }); + + expect(createButton).toBeDisabled(); + }); +}); diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/Footer/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/Footer/index.tsx new file mode 100644 index 000000000000..e0853cdc9d58 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/Footer/index.tsx @@ -0,0 +1,130 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { useHistory } from 'react-router-dom'; +import Button from 'src/components/Button'; +import { t } from '@superset-ui/core'; +import { useSingleViewResource } from 'src/views/CRUD/hooks'; +import { logEvent } from 'src/logger/actions'; +import withToasts from 'src/components/MessageToasts/withToasts'; +import { + LOG_ACTIONS_DATASET_CREATION_EMPTY_CANCELLATION, + LOG_ACTIONS_DATASET_CREATION_DATABASE_CANCELLATION, + LOG_ACTIONS_DATASET_CREATION_SCHEMA_CANCELLATION, + LOG_ACTIONS_DATASET_CREATION_TABLE_CANCELLATION, + LOG_ACTIONS_DATASET_CREATION_SUCCESS, +} from 'src/logger/LogUtils'; +import { DatasetObject } from '../types'; + +interface FooterProps { + url: string; + addDangerToast: () => void; + datasetObject?: Partial<DatasetObject> | null; + onDatasetAdd?: (dataset: DatasetObject) => void; + hasColumns?: boolean; + datasets?: (string | null | undefined)[] | undefined; +} + +const INPUT_FIELDS = ['db', 'schema', 'table_name']; +const LOG_ACTIONS = [ + LOG_ACTIONS_DATASET_CREATION_EMPTY_CANCELLATION, + LOG_ACTIONS_DATASET_CREATION_DATABASE_CANCELLATION, + LOG_ACTIONS_DATASET_CREATION_SCHEMA_CANCELLATION, + LOG_ACTIONS_DATASET_CREATION_TABLE_CANCELLATION, +]; + +function Footer({ + datasetObject, + addDangerToast, + hasColumns = false, + datasets, +}: FooterProps) { + const history = useHistory(); + const { createResource } = useSingleViewResource<Partial<DatasetObject>>( + 'dataset', + t('dataset'), + addDangerToast, + ); + + const createLogAction = (dataset: Partial<DatasetObject>) => { + let totalCount = 0; + const value = Object.keys(dataset).reduce((total, key) => { + if (INPUT_FIELDS.includes(key) && dataset[key]) { + totalCount += 1; + } + return totalCount; + }, 0); + + return LOG_ACTIONS[value]; + }; + + const cancelButtonOnClick = () => { + if (!datasetObject) { + logEvent(LOG_ACTIONS_DATASET_CREATION_EMPTY_CANCELLATION, {}); + } else { + const logAction = createLogAction(datasetObject); + logEvent(logAction, datasetObject); + } + history.goBack(); + }; + + const tooltipText = t('Select a database table.'); + + const onSave = () => { + if (datasetObject) { + const data = { + database: datasetObject.db?.id, + schema: datasetObject.schema, + table_name: datasetObject.table_name, + }; + createResource(data).then(response => { + if (!response) { + return; + } + if (typeof response === 'number') { + logEvent(LOG_ACTIONS_DATASET_CREATION_SUCCESS, datasetObject); + // When a dataset is created the response we get is its ID number + history.push(`/chart/add/?dataset=${datasetObject.table_name}`); + } + }); + } + }; + + const CREATE_DATASET_TEXT = t('Create dataset and create chart'); + const disabledCheck = + !datasetObject?.table_name || + !hasColumns || + datasets?.includes(datasetObject?.table_name); + + return ( + <> + <Button onClick={cancelButtonOnClick}>{t('Cancel')}</Button> + <Button + buttonStyle="primary" + disabled={disabledCheck} + tooltip={!datasetObject?.table_name ? tooltipText : undefined} + onClick={onSave} + > + {CREATE_DATASET_TEXT} + </Button> + </> + ); +} + +export default withToasts(Footer); diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/Header.test.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/Header.test.tsx new file mode 100644 index 000000000000..539181208694 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/Header.test.tsx @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import Header, { + DEFAULT_TITLE, +} from 'src/views/CRUD/data/dataset/AddDataset/Header'; + +describe('Header', () => { + const mockSetDataset = jest.fn(); + + const waitForRender = (props?: any) => + waitFor(() => render(<Header setDataset={mockSetDataset} {...props} />)); + + test('renders a blank state Header', async () => { + await waitForRender(); + + const datasetName = screen.getByText(/new dataset/i); + + expect(datasetName).toBeVisible(); + }); + + test('displays "New dataset" when a table is not selected', async () => { + await waitForRender(); + + const datasetName = screen.getByText(/new dataset/i); + expect(datasetName.innerHTML).toBe(DEFAULT_TITLE); + }); + + test('displays table name when a table is selected', async () => { + // The schema and table name are passed in through props once selected + await waitForRender({ schema: 'testSchema', title: 'testTable' }); + + const datasetName = screen.getByText(/testtable/i); + + expect(datasetName.innerHTML).toBe('testTable'); + }); +}); diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/index.tsx new file mode 100644 index 000000000000..044221c3fe47 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/index.tsx @@ -0,0 +1,109 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { t } from '@superset-ui/core'; +import { PageHeaderWithActions } from 'src/components/PageHeaderWithActions'; +import Button from 'src/components/Button'; +import Icons from 'src/components/Icons'; +import { Menu } from 'src/components/Menu'; +import { TooltipPlacement } from 'src/components/Tooltip'; +import { + HeaderComponentStyles, + disabledSaveBtnStyles, + StyledCreateDatasetTitle, +} from 'src/views/CRUD/data/dataset/styles'; +import { + DatasetActionType, + DSReducerActionType, +} from 'src/views/CRUD/data/dataset/AddDataset/types'; + +export const DEFAULT_TITLE = t('New dataset'); + +const tooltipProps: { text: string; placement: TooltipPlacement } = { + text: t('Select a database table and create dataset'), + placement: 'bottomRight', +}; + +const renderDisabledSaveButton = () => ( + <Button + buttonStyle="primary" + tooltip={tooltipProps?.text} + placement={tooltipProps?.placement} + disabled + css={disabledSaveBtnStyles} + > + <Icons.Save iconSize="m" /> + {t('Save')} + </Button> +); + +const renderOverlay = () => ( + <Menu> + <Menu.Item>{t('Settings')}</Menu.Item> + <Menu.Item>{t('Delete')}</Menu.Item> + </Menu> +); + +export default function Header({ + setDataset, + title = DEFAULT_TITLE, + editing = false, +}: { + setDataset: React.Dispatch<DSReducerActionType>; + title?: string | null | undefined; + schema?: string | null | undefined; + editing?: boolean; +}) { + const editableTitleProps = { + title: title ?? DEFAULT_TITLE, + placeholder: DEFAULT_TITLE, + onSave: (newDatasetName: string) => { + setDataset({ + type: DatasetActionType.changeDataset, + payload: { name: 'dataset_name', value: newDatasetName }, + }); + }, + canEdit: false, + label: t('dataset name'), + }; + + return ( + <HeaderComponentStyles> + {editing ? ( + <PageHeaderWithActions + editableTitleProps={editableTitleProps} + showTitlePanelItems={false} + showFaveStar={false} + faveStarProps={{ itemId: 1, saveFaveStar: () => {} }} + titlePanelAdditionalItems={<></>} + rightPanelAdditionalItems={renderDisabledSaveButton()} + additionalActionsMenu={renderOverlay()} + menuDropdownProps={{ + disabled: true, + }} + tooltipProps={tooltipProps} + /> + ) : ( + <StyledCreateDatasetTitle> + {title || DEFAULT_TITLE} + </StyledCreateDatasetTitle> + )} + </HeaderComponentStyles> + ); +} diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/LeftPanel.test.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/LeftPanel.test.tsx new file mode 100644 index 000000000000..3996dc0fec5c --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/LeftPanel.test.tsx @@ -0,0 +1,283 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import fetchMock from 'fetch-mock'; +import userEvent from '@testing-library/user-event'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import LeftPanel from 'src/views/CRUD/data/dataset/AddDataset/LeftPanel'; +import { exampleDataset } from 'src/views/CRUD/data/dataset/AddDataset/DatasetPanel/fixtures'; + +const databasesEndpoint = 'glob:*/api/v1/database/?q*'; +const schemasEndpoint = 'glob:*/api/v1/database/*/schemas*'; +const tablesEndpoint = 'glob:*/api/v1/database/*/tables/?q*'; + +fetchMock.get(databasesEndpoint, { + count: 2, + description_columns: {}, + ids: [1, 2], + label_columns: { + allow_file_upload: 'Allow Csv Upload', + allow_ctas: 'Allow Ctas', + allow_cvas: 'Allow Cvas', + allow_dml: 'Allow Dml', + allow_multi_schema_metadata_fetch: 'Allow Multi Schema Metadata Fetch', + allow_run_async: 'Allow Run Async', + allows_cost_estimate: 'Allows Cost Estimate', + allows_subquery: 'Allows Subquery', + allows_virtual_table_explore: 'Allows Virtual Table Explore', + disable_data_preview: 'Disables SQL Lab Data Preview', + backend: 'Backend', + changed_on: 'Changed On', + changed_on_delta_humanized: 'Changed On Delta Humanized', + 'created_by.first_name': 'Created By First Name', + 'created_by.last_name': 'Created By Last Name', + database_name: 'Database Name', + explore_database_id: 'Explore Database Id', + expose_in_sqllab: 'Expose In Sqllab', + force_ctas_schema: 'Force Ctas Schema', + id: 'Id', + }, + list_columns: [ + 'allow_file_upload', + 'allow_ctas', + 'allow_cvas', + 'allow_dml', + 'allow_multi_schema_metadata_fetch', + 'allow_run_async', + 'allows_cost_estimate', + 'allows_subquery', + 'allows_virtual_table_explore', + 'disable_data_preview', + 'backend', + 'changed_on', + 'changed_on_delta_humanized', + 'created_by.first_name', + 'created_by.last_name', + 'database_name', + 'explore_database_id', + 'expose_in_sqllab', + 'force_ctas_schema', + 'id', + ], + list_title: 'List Database', + order_columns: [ + 'allow_file_upload', + 'allow_dml', + 'allow_run_async', + 'changed_on', + 'changed_on_delta_humanized', + 'created_by.first_name', + 'database_name', + 'expose_in_sqllab', + ], + result: [ + { + allow_file_upload: false, + allow_ctas: false, + allow_cvas: false, + allow_dml: false, + allow_multi_schema_metadata_fetch: false, + allow_run_async: false, + allows_cost_estimate: null, + allows_subquery: true, + allows_virtual_table_explore: true, + disable_data_preview: false, + backend: 'postgresql', + changed_on: '2021-03-09T19:02:07.141095', + changed_on_delta_humanized: 'a day ago', + created_by: null, + database_name: 'test-postgres', + explore_database_id: 1, + expose_in_sqllab: true, + force_ctas_schema: null, + id: 1, + }, + { + allow_csv_upload: false, + allow_ctas: false, + allow_cvas: false, + allow_dml: false, + allow_multi_schema_metadata_fetch: false, + allow_run_async: false, + allows_cost_estimate: null, + allows_subquery: true, + allows_virtual_table_explore: true, + disable_data_preview: false, + backend: 'mysql', + changed_on: '2021-03-09T19:02:07.141095', + changed_on_delta_humanized: 'a day ago', + created_by: null, + database_name: 'test-mysql', + explore_database_id: 1, + expose_in_sqllab: true, + force_ctas_schema: null, + id: 2, + }, + ], +}); + +fetchMock.get(schemasEndpoint, { + result: ['information_schema', 'public'], +}); + +fetchMock.get(tablesEndpoint, { + count: 3, + result: [ + { value: 'Sheet1', type: 'table', extra: null }, + { value: 'Sheet2', type: 'table', extra: null }, + { value: 'Sheet3', type: 'table', extra: null }, + ], +}); + +const mockFun = jest.fn(); + +test('should render', async () => { + render(<LeftPanel setDataset={mockFun} />, { + useRedux: true, + }); + expect( + await screen.findByText(/select database & schema/i), + ).toBeInTheDocument(); +}); + +test('should render schema selector, database selector container, and selects', async () => { + render(<LeftPanel setDataset={mockFun} />, { useRedux: true }); + + expect(await screen.findByText(/select database & schema/i)).toBeVisible(); + + const databaseSelect = screen.getByRole('combobox', { + name: 'Select database or type database name', + }); + const schemaSelect = screen.getByRole('combobox', { + name: 'Select schema or type schema name', + }); + expect(databaseSelect).toBeInTheDocument(); + expect(schemaSelect).toBeInTheDocument(); +}); + +test('does not render blank state if there is nothing selected', async () => { + render(<LeftPanel setDataset={mockFun} />, { useRedux: true }); + + expect( + await screen.findByText(/select database & schema/i), + ).toBeInTheDocument(); + const emptyState = screen.queryByRole('img', { name: /empty/i }); + expect(emptyState).not.toBeInTheDocument(); +}); + +test('renders list of options when user clicks on schema', async () => { + render(<LeftPanel setDataset={mockFun} dataset={exampleDataset[0]} />, { + useRedux: true, + }); + + // Click 'test-postgres' database to access schemas + const databaseSelect = screen.getByRole('combobox', { + name: 'Select database or type database name', + }); + userEvent.click(databaseSelect); + expect(await screen.findByText('test-postgres')).toBeInTheDocument(); + userEvent.click(screen.getByText('test-postgres')); + + // Schema select will be automatically populated if there is only one schema + const schemaSelect = screen.getByRole('combobox', { + name: /select schema or type schema name/i, + }); + await waitFor(() => { + expect(schemaSelect).toBeEnabled(); + }); +}); + +test('searches for a table name', async () => { + render(<LeftPanel setDataset={mockFun} dataset={exampleDataset[0]} />, { + useRedux: true, + }); + + // Click 'test-postgres' database to access schemas + const databaseSelect = screen.getByRole('combobox', { + name: /select database or type database name/i, + }); + userEvent.click(databaseSelect); + userEvent.click(await screen.findByText('test-postgres')); + + const schemaSelect = screen.getByRole('combobox', { + name: /select schema or type schema name/i, + }); + + await waitFor(() => expect(schemaSelect).toBeEnabled()); + + // Click 'public' schema to access tables + userEvent.click(schemaSelect); + userEvent.click(screen.getAllByText('public')[1]); + + await waitFor(() => { + expect(screen.getByText('Sheet1')).toBeInTheDocument(); + expect(screen.getByText('Sheet2')).toBeInTheDocument(); + expect(screen.getByText('Sheet3')).toBeInTheDocument(); + }); + + userEvent.type(screen.getByRole('textbox'), 'Sheet2'); + + await waitFor(() => { + expect(screen.queryByText('Sheet1')).not.toBeInTheDocument(); + expect(screen.getByText('Sheet2')).toBeInTheDocument(); + expect(screen.queryByText('Sheet3')).not.toBeInTheDocument(); + }); +}); + +test('renders a warning icon when a table name has a pre-existing dataset', async () => { + render( + <LeftPanel + setDataset={mockFun} + dataset={exampleDataset[0]} + datasetNames={['Sheet2']} + />, + { + useRedux: true, + }, + ); + + // Click 'test-postgres' database to access schemas + const databaseSelect = screen.getByRole('combobox', { + name: /select database or type database name/i, + }); + userEvent.click(databaseSelect); + userEvent.click(await screen.findByText('test-postgres')); + + const schemaSelect = screen.getByRole('combobox', { + name: /select schema or type schema name/i, + }); + + await waitFor(() => expect(schemaSelect).toBeEnabled()); + + // Warning icon should not show yet + expect( + screen.queryByRole('img', { name: 'warning' }), + ).not.toBeInTheDocument(); + + // Click 'public' schema to access tables + userEvent.click(schemaSelect); + userEvent.click(screen.getAllByText('public')[1]); + + await waitFor(() => { + expect(screen.getByText('Sheet2')).toBeInTheDocument(); + }); + + // Sheet2 should now show the warning icon + expect(screen.getByRole('img', { name: 'warning' })).toBeVisible(); +}); diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/index.tsx new file mode 100644 index 000000000000..1d1d3847a2da --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/index.tsx @@ -0,0 +1,378 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { + useEffect, + useState, + SetStateAction, + Dispatch, + useCallback, +} from 'react'; +import rison from 'rison'; +import { + SupersetClient, + t, + styled, + css, + useTheme, + logging, +} from '@superset-ui/core'; +import { Input } from 'src/components/Input'; +import { Form } from 'src/components/Form'; +import Icons from 'src/components/Icons'; +import { TableOption } from 'src/components/TableSelector'; +import RefreshLabel from 'src/components/RefreshLabel'; +import { Table } from 'src/hooks/apiResources'; +import Loading from 'src/components/Loading'; +import DatabaseSelector, { + DatabaseObject, +} from 'src/components/DatabaseSelector'; +import { + EmptyStateMedium, + emptyStateComponent, +} from 'src/components/EmptyState'; +import { useToasts } from 'src/components/MessageToasts/withToasts'; +import { LocalStorageKeys, getItem } from 'src/utils/localStorageHelpers'; +import { + DatasetActionType, + DatasetObject, +} from 'src/views/CRUD/data/dataset/AddDataset/types'; + +interface LeftPanelProps { + setDataset: Dispatch<SetStateAction<object>>; + dataset?: Partial<DatasetObject> | null; + datasetNames?: (string | null | undefined)[] | undefined; +} + +const SearchIcon = styled(Icons.Search)` + color: ${({ theme }) => theme.colors.grayscale.light1}; +`; + +const LeftPanelStyle = styled.div` + ${({ theme }) => ` + max-width: ${theme.gridUnit * 87.5}px; + padding: ${theme.gridUnit * 4}px; + height: 100%; + background-color: ${theme.colors.grayscale.light5}; + position: relative; + .emptystate { + height: auto; + margin-top: ${theme.gridUnit * 17.5}px; + } + .refresh { + position: absolute; + top: ${theme.gridUnit * 38.75}px; + left: ${theme.gridUnit * 16.75}px; + span[role="button"]{ + font-size: ${theme.gridUnit * 4.25}px; + } + } + .section-title { + margin-top: ${theme.gridUnit * 5.5}px; + margin-bottom: ${theme.gridUnit * 11}px; + font-weight: ${theme.typography.weights.bold}; + } + .table-title { + margin-top: ${theme.gridUnit * 11}px; + margin-bottom: ${theme.gridUnit * 6}px; + font-weight: ${theme.typography.weights.bold}; + } + .options-list { + overflow: auto; + position: absolute; + bottom: 0; + top: ${theme.gridUnit * 92.25}px; + left: ${theme.gridUnit * 3.25}px; + right: 0; + + .no-scrollbar { + margin-right: ${theme.gridUnit * 4}px; + } + + .options { + cursor: pointer; + padding: ${theme.gridUnit * 1.75}px; + border-radius: ${theme.borderRadius}px; + :hover { + background-color: ${theme.colors.grayscale.light4} + } + } + + .options-highlighted { + cursor: pointer; + padding: ${theme.gridUnit * 1.75}px; + border-radius: ${theme.borderRadius}px; + background-color: ${theme.colors.primary.dark1}; + color: ${theme.colors.grayscale.light5}; + } + + .options, .options-highlighted { + display: flex; + align-items: center; + justify-content: space-between; + } + } + form > span[aria-label="refresh"] { + position: absolute; + top: ${theme.gridUnit * 69}px; + left: ${theme.gridUnit * 42.75}px; + font-size: ${theme.gridUnit * 4.25}px; + } + .table-form { + margin-bottom: ${theme.gridUnit * 8}px; + } + .loading-container { + position: absolute; + top: ${theme.gridUnit * 89.75}px; + left: 0; + right: 0; + text-align: center; + img { + width: ${theme.gridUnit * 20}px; + margin-bottom: ${theme.gridUnit * 2.5}px; + } + p { + color: ${theme.colors.grayscale.light1}; + } + } +`} +`; + +export default function LeftPanel({ + setDataset, + dataset, + datasetNames, +}: LeftPanelProps) { + const theme = useTheme(); + + const [tableOptions, setTableOptions] = useState<Array<TableOption>>([]); + const [resetTables, setResetTables] = useState(false); + const [loadTables, setLoadTables] = useState(false); + const [searchVal, setSearchVal] = useState(''); + const [refresh, setRefresh] = useState(false); + const [selectedTable, setSelectedTable] = useState<number | null>(null); + + const { addDangerToast } = useToasts(); + + const setDatabase = useCallback( + (db: Partial<DatabaseObject>) => { + setDataset({ type: DatasetActionType.selectDatabase, payload: { db } }); + setSelectedTable(null); + setResetTables(true); + }, + [setDataset], + ); + + const setTable = (tableName: string, index: number) => { + setSelectedTable(index); + setDataset({ + type: DatasetActionType.selectTable, + payload: { name: 'table_name', value: tableName }, + }); + }; + + const getTablesList = useCallback( + (url: string) => { + SupersetClient.get({ url }) + .then(({ json }) => { + const options: TableOption[] = json.result.map((table: Table) => { + const option: TableOption = { + value: table.value, + label: <TableOption table={table} />, + text: table.label, + }; + + return option; + }); + + setTableOptions(options); + setLoadTables(false); + setResetTables(false); + setRefresh(false); + }) + .catch(error => { + addDangerToast(t('There was an error fetching tables')); + logging.error(t('There was an error fetching tables'), error); + }); + }, + [addDangerToast], + ); + + const setSchema = (schema: string) => { + if (schema) { + setDataset({ + type: DatasetActionType.selectSchema, + payload: { name: 'schema', value: schema }, + }); + setLoadTables(true); + } + setSelectedTable(null); + setResetTables(true); + }; + + const encodedSchema = dataset?.schema + ? encodeURIComponent(dataset?.schema) + : undefined; + + useEffect(() => { + const currentUserSelectedDb = getItem( + LocalStorageKeys.db, + null, + ) as DatabaseObject; + if (currentUserSelectedDb) { + setDatabase(currentUserSelectedDb); + } + }, [setDatabase]); + + useEffect(() => { + if (loadTables) { + const params = rison.encode({ + force: refresh, + schema_name: encodedSchema, + }); + + const endpoint = `/api/v1/database/${dataset?.db?.id}/tables/?q=${params}`; + getTablesList(endpoint); + } + }, [loadTables, dataset?.db?.id, encodedSchema, getTablesList, refresh]); + + useEffect(() => { + if (resetTables) { + setTableOptions([]); + setResetTables(false); + } + }, [resetTables]); + + const filteredOptions = tableOptions.filter(option => + option?.value?.toLowerCase().includes(searchVal.toLowerCase()), + ); + + const Loader = (inline: string) => ( + <div className="loading-container"> + <Loading position="inline" /> + <p>{inline}</p> + </div> + ); + + const SELECT_DATABASE_AND_SCHEMA_TEXT = t('Select database & schema'); + const TABLE_LOADING_TEXT = t('Table loading'); + const NO_TABLES_FOUND_TITLE = t('No database tables found'); + const NO_TABLES_FOUND_DESCRIPTION = t('Try selecting a different schema'); + const SELECT_DATABASE_TABLE_TEXT = t('Select database table'); + const REFRESH_TABLE_LIST_TOOLTIP = t('Refresh table list'); + const REFRESH_TABLES_TEXT = t('Refresh tables'); + const SEARCH_TABLES_PLACEHOLDER_TEXT = t('Search tables'); + + const optionsList = document.getElementsByClassName('options-list'); + const scrollableOptionsList = + optionsList[0]?.scrollHeight > optionsList[0]?.clientHeight; + const [emptyResultsWithSearch, setEmptyResultsWithSearch] = useState(false); + + const onEmptyResults = (searchText?: string) => { + setEmptyResultsWithSearch(!!searchText); + }; + + return ( + <LeftPanelStyle> + <p className="section-title db-schema"> + {SELECT_DATABASE_AND_SCHEMA_TEXT} + </p> + <DatabaseSelector + db={dataset?.db} + handleError={addDangerToast} + onDbChange={setDatabase} + onSchemaChange={setSchema} + emptyState={emptyStateComponent(emptyResultsWithSearch)} + onEmptyResults={onEmptyResults} + /> + {loadTables && !refresh && Loader(TABLE_LOADING_TEXT)} + {dataset?.schema && !loadTables && !tableOptions.length && !searchVal && ( + <div className="emptystate"> + <EmptyStateMedium + image="empty-table.svg" + title={NO_TABLES_FOUND_TITLE} + description={NO_TABLES_FOUND_DESCRIPTION} + /> + </div> + )} + + {dataset?.schema && (tableOptions.length > 0 || searchVal.length > 0) && ( + <> + <Form> + <p className="table-title">{SELECT_DATABASE_TABLE_TEXT}</p> + <RefreshLabel + onClick={() => { + setLoadTables(true); + setRefresh(true); + }} + tooltipContent={REFRESH_TABLE_LIST_TOOLTIP} + /> + {refresh && Loader(REFRESH_TABLES_TEXT)} + {!refresh && ( + <Input + value={searchVal} + prefix={<SearchIcon iconSize="l" />} + onChange={evt => { + setSearchVal(evt.target.value); + }} + className="table-form" + placeholder={SEARCH_TABLES_PLACEHOLDER_TEXT} + allowClear + /> + )} + </Form> + <div className="options-list" data-test="options-list"> + {!refresh && + filteredOptions.map((option, i) => ( + <div + className={ + selectedTable === i + ? scrollableOptionsList + ? 'options-highlighted' + : 'options-highlighted no-scrollbar' + : scrollableOptionsList + ? 'options' + : 'options no-scrollbar' + } + key={i} + role="button" + tabIndex={0} + onClick={() => setTable(option.value, i)} + > + {option.label} + {datasetNames?.includes(option.value) && ( + <Icons.Warning + iconColor={ + selectedTable === i + ? theme.colors.grayscale.light5 + : theme.colors.info.base + } + iconSize="m" + css={css` + margin-right: ${theme.gridUnit * 2}px; + `} + /> + )} + </div> + ))} + </div> + </> + )} + </LeftPanelStyle> + ); +} diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/RightPanel/RightPanel.test.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/RightPanel/RightPanel.test.tsx new file mode 100644 index 000000000000..987d96abfa9e --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/RightPanel/RightPanel.test.tsx @@ -0,0 +1,29 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import RightPanel from 'src/views/CRUD/data/dataset/AddDataset/RightPanel'; + +describe('RightPanel', () => { + it('renders a blank state RightPanel', () => { + render(<RightPanel />); + + expect(screen.getByText(/right panel/i)).toBeVisible(); + }); +}); diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/RightPanel/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/RightPanel/index.tsx new file mode 100644 index 000000000000..60f9589aad2e --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/RightPanel/index.tsx @@ -0,0 +1,23 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; + +export default function RightPanel() { + return <div>Right Panel</div>; +} diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDataset/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/index.tsx new file mode 100644 index 000000000000..67b108ab366f --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/index.tsx @@ -0,0 +1,136 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useReducer, Reducer, useEffect, useState } from 'react'; +import { useParams } from 'react-router-dom'; +import { useDatasetsList } from 'src/views/CRUD/data/hooks'; +import Header from './Header'; +import EditPage from './EditDataset'; +import DatasetPanel from './DatasetPanel'; +import LeftPanel from './LeftPanel'; +import Footer from './Footer'; +import { DatasetActionType, DatasetObject, DSReducerActionType } from './types'; +import DatasetLayout from '../DatasetLayout'; + +type Schema = { + schema: string; +}; + +export function datasetReducer( + state: DatasetObject | null, + action: DSReducerActionType, +): Partial<DatasetObject> | Schema | null { + const trimmedState = { + ...(state || {}), + }; + + switch (action.type) { + case DatasetActionType.selectDatabase: + return { + ...trimmedState, + ...action.payload, + schema: null, + table_name: null, + }; + case DatasetActionType.selectSchema: + return { + ...trimmedState, + [action.payload.name]: action.payload.value, + table_name: null, + }; + case DatasetActionType.selectTable: + return { + ...trimmedState, + [action.payload.name]: action.payload.value, + }; + case DatasetActionType.changeDataset: + return { + ...trimmedState, + [action.payload.name]: action.payload.value, + }; + default: + return null; + } +} + +const prevUrl = + '/tablemodelview/list/?pageIndex=0&sortColumn=changed_on_delta_humanized&sortOrder=desc'; + +export default function AddDataset() { + const [dataset, setDataset] = useReducer< + Reducer<Partial<DatasetObject> | null, DSReducerActionType> + >(datasetReducer, null); + const [hasColumns, setHasColumns] = useState(false); + const [editPageIsVisible, setEditPageIsVisible] = useState(false); + + const { datasets, datasetNames } = useDatasetsList( + dataset?.db, + dataset?.schema, + ); + + const { datasetId: id } = useParams<{ datasetId: string }>(); + useEffect(() => { + if (!Number.isNaN(parseInt(id, 10))) { + setEditPageIsVisible(true); + } + }, [id]); + + const HeaderComponent = () => ( + <Header setDataset={setDataset} title={dataset?.table_name} /> + ); + + const LeftPanelComponent = () => ( + <LeftPanel + setDataset={setDataset} + dataset={dataset} + datasetNames={datasetNames} + /> + ); + + const EditPageComponent = () => <EditPage id={id} />; + + const DatasetPanelComponent = () => ( + <DatasetPanel + tableName={dataset?.table_name} + dbId={dataset?.db?.id} + schema={dataset?.schema} + setHasColumns={setHasColumns} + datasets={datasets} + /> + ); + + const FooterComponent = () => ( + <Footer + url={prevUrl} + datasetObject={dataset} + hasColumns={hasColumns} + datasets={datasetNames} + /> + ); + + return ( + <DatasetLayout + header={HeaderComponent()} + leftPanel={editPageIsVisible ? null : LeftPanelComponent()} + datasetPanel={ + editPageIsVisible ? EditPageComponent() : DatasetPanelComponent() + } + footer={FooterComponent()} + /> + ); +} diff --git a/superset-frontend/src/dashboard/stylesheets/grid.less b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/types.tsx similarity index 50% rename from superset-frontend/src/dashboard/stylesheets/grid.less rename to superset-frontend/src/views/CRUD/data/dataset/AddDataset/types.tsx index 5b793b96bdb6..89473e5426cb 100644 --- a/superset-frontend/src/dashboard/stylesheets/grid.less +++ b/superset-frontend/src/views/CRUD/data/dataset/AddDataset/types.tsx @@ -16,38 +16,41 @@ * specific language governing permissions and limitations * under the License. */ +import { DatabaseObject } from 'src/components/DatabaseSelector'; -/* this is the ParentSize wrapper */ -.grid-container > div:first-child { - height: inherit !important; +export enum DatasetActionType { + selectDatabase, + selectSchema, + selectTable, + changeDataset, } -.grid-content { - display: flex; - flex-direction: column; +export interface DatasetObject { + db: DatabaseObject & { owners: [number] }; + schema?: string | null; + dataset_name: string; + table_name?: string | null; + explore_url?: string; } -/* gutters between rows */ -.grid-content > div:not(:only-child):not(:last-child):not(.empty-droptarget) { - margin-bottom: 16px; +export interface DatasetReducerPayloadType { + name: string; + value?: string; } -/* Editing guides */ -.grid-column-guide { - position: absolute; - top: 0; - min-height: 100%; - background-color: fade(@indicator-color, @opacity-light); - pointer-events: none; - box-shadow: inset 0 0 0 1px fade(@indicator-color, @opacity-medium-heavy); -} +export type Schema = { + schema?: string | null | undefined; +}; -.grid-row-guide { - position: absolute; - left: 0; - bottom: 2; - height: 2; - background-color: @indicator-color; - pointer-events: none; - z-index: @z-index-above-dashboard-charts; -} +export type DSReducerActionType = + | { + type: DatasetActionType.selectDatabase; + payload: Partial<DatasetObject>; + } + | { + type: + | DatasetActionType.changeDataset + | DatasetActionType.selectSchema + | DatasetActionType.selectTable; + payload: DatasetReducerPayloadType; + }; diff --git a/superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx b/superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx deleted file mode 100644 index 10a3b7bb77e4..000000000000 --- a/superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React, { FunctionComponent, useState, useEffect } from 'react'; -import { styled, t } from '@superset-ui/core'; -import { useSingleViewResource } from 'src/views/CRUD/hooks'; -import Modal from 'src/components/Modal'; -import TableSelector from 'src/components/TableSelector'; -import withToasts from 'src/components/MessageToasts/withToasts'; -import { DatabaseObject } from 'src/components/DatabaseSelector'; - -type DatasetAddObject = { - id: number; - database: number; - schema: string; - table_name: string; -}; -interface DatasetModalProps { - addDangerToast: (msg: string) => void; - addSuccessToast: (msg: string) => void; - onDatasetAdd?: (dataset: DatasetAddObject) => void; - onHide: () => void; - show: boolean; -} - -const TableSelectorContainer = styled.div` - padding-bottom: 340px; - width: 65%; -`; - -const DatasetModal: FunctionComponent<DatasetModalProps> = ({ - addDangerToast, - addSuccessToast, - onDatasetAdd, - onHide, - show, -}) => { - const [currentDatabase, setCurrentDatabase] = useState< - DatabaseObject | undefined - >(); - const [currentSchema, setSchema] = useState<string | undefined>(''); - const [currentTableName, setTableName] = useState(''); - const [disableSave, setDisableSave] = useState(true); - const { - createResource, - state: { loading }, - } = useSingleViewResource<Partial<DatasetAddObject>>( - 'dataset', - t('dataset'), - addDangerToast, - ); - - useEffect(() => { - setDisableSave(currentDatabase === undefined || currentTableName === ''); - }, [currentTableName, currentDatabase]); - - const onDbChange = (db: DatabaseObject) => { - setCurrentDatabase(db); - }; - - const onSchemaChange = (schema?: string) => { - setSchema(schema); - }; - - const onTableChange = (tableName: string) => { - setTableName(tableName); - }; - - const clearModal = () => { - setSchema(''); - setTableName(''); - setCurrentDatabase(undefined); - setDisableSave(true); - }; - - const hide = () => { - clearModal(); - onHide(); - }; - - const onSave = () => { - if (currentDatabase === undefined) { - return; - } - const data = { - database: currentDatabase.id, - ...(currentSchema ? { schema: currentSchema } : {}), - table_name: currentTableName, - }; - createResource(data).then(response => { - if (!response) { - return; - } - if (onDatasetAdd) { - onDatasetAdd({ id: response.id, ...response }); - } - addSuccessToast(t('The dataset has been saved')); - hide(); - }); - }; - - return ( - <Modal - disablePrimaryButton={disableSave} - primaryButtonLoading={loading} - onHandledPrimaryAction={onSave} - onHide={hide} - primaryButtonName={t('Add')} - show={show} - title={t('Add dataset')} - > - <TableSelectorContainer> - <TableSelector - clearable={false} - formMode - database={currentDatabase} - schema={currentSchema} - tableValue={currentTableName} - onDbChange={onDbChange} - onSchemaChange={onSchemaChange} - onTableSelectChange={onTableChange} - handleError={addDangerToast} - /> - </TableSelectorContainer> - </Modal> - ); -}; - -export default withToasts(DatasetModal); diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetLayout/DatasetLayout.test.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetLayout/DatasetLayout.test.tsx new file mode 100644 index 000000000000..a1939761aa7c --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetLayout/DatasetLayout.test.tsx @@ -0,0 +1,88 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import DatasetLayout from 'src/views/CRUD/data/dataset/DatasetLayout'; +import Header from 'src/views/CRUD/data/dataset/AddDataset/Header'; +import LeftPanel from 'src/views/CRUD/data/dataset/AddDataset/LeftPanel'; +import DatasetPanel from 'src/views/CRUD/data/dataset/AddDataset/DatasetPanel'; +import RightPanel from 'src/views/CRUD/data/dataset/AddDataset/RightPanel'; +import Footer from 'src/views/CRUD/data/dataset/AddDataset/Footer'; + +const mockHistoryPush = jest.fn(); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), +})); + +describe('DatasetLayout', () => { + it('renders nothing when no components are passed in', () => { + render(<DatasetLayout />); + const layoutWrapper = screen.getByTestId('dataset-layout-wrapper'); + + expect(layoutWrapper).toHaveTextContent(''); + }); + + const mockSetDataset = jest.fn(); + + const waitForRender = () => + waitFor(() => render(<Header setDataset={mockSetDataset} />)); + + it('renders a Header when passed in', async () => { + await waitForRender(); + + expect(screen.getByText(/new dataset/i)).toBeVisible(); + }); + + it('renders a LeftPanel when passed in', async () => { + render( + <DatasetLayout leftPanel={<LeftPanel setDataset={() => null} />} />, + { useRedux: true }, + ); + + expect( + await screen.findByText(/select database & schema/i), + ).toBeInTheDocument(); + expect(LeftPanel).toBeTruthy(); + }); + + it('renders a DatasetPanel when passed in', () => { + render(<DatasetLayout datasetPanel={<DatasetPanel />} />); + + const blankDatasetImg = screen.getByRole('img', { name: /empty/i }); + const blankDatasetTitle = screen.getByText(/select dataset source/i); + + expect(blankDatasetImg).toBeVisible(); + expect(blankDatasetTitle).toBeVisible(); + }); + + it('renders a RightPanel when passed in', () => { + render(<DatasetLayout rightPanel={RightPanel()} />); + + expect(screen.getByText(/right panel/i)).toBeVisible(); + }); + + it('renders a Footer when passed in', () => { + render(<DatasetLayout footer={<Footer url="" />} />, { useRedux: true }); + + expect(screen.getByText(/Cancel/i)).toBeVisible(); + }); +}); diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetLayout/index.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetLayout/index.tsx new file mode 100644 index 000000000000..7702efcb5907 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetLayout/index.tsx @@ -0,0 +1,77 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { ReactElement, JSXElementConstructor } from 'react'; +import { + StyledLayoutWrapper, + LeftColumn, + RightColumn, + OuterRow, + PanelRow, + FooterRow, + StyledLayoutHeader, + StyledLayoutLeftPanel, + StyledLayoutDatasetPanel, + StyledLayoutRightPanel, + StyledLayoutFooter, +} from 'src/views/CRUD/data/dataset/styles'; + +interface DatasetLayoutProps { + header?: ReactElement<any, string | JSXElementConstructor<any>> | null; + leftPanel?: ReactElement<any, string | JSXElementConstructor<any>> | null; + datasetPanel?: ReactElement<any, string | JSXElementConstructor<any>> | null; + rightPanel?: ReactElement<any, string | JSXElementConstructor<any>> | null; + footer?: ReactElement<any, string | JSXElementConstructor<any>> | null; +} + +export default function DatasetLayout({ + header, + leftPanel, + datasetPanel, + rightPanel, + footer, +}: DatasetLayoutProps) { + return ( + <StyledLayoutWrapper data-test="dataset-layout-wrapper"> + {header && <StyledLayoutHeader>{header}</StyledLayoutHeader>} + <OuterRow> + {leftPanel && ( + <LeftColumn> + <StyledLayoutLeftPanel>{leftPanel}</StyledLayoutLeftPanel> + </LeftColumn> + )} + <RightColumn> + <PanelRow> + {datasetPanel && ( + <StyledLayoutDatasetPanel> + {datasetPanel} + </StyledLayoutDatasetPanel> + )} + {rightPanel && ( + <StyledLayoutRightPanel>{rightPanel}</StyledLayoutRightPanel> + )} + </PanelRow> + + <FooterRow> + {footer && <StyledLayoutFooter>{footer}</StyledLayoutFooter>} + </FooterRow> + </RightColumn> + </OuterRow> + </StyledLayoutWrapper> + ); +} diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.test.jsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.test.tsx similarity index 79% rename from superset-frontend/src/views/CRUD/data/dataset/DatasetList.test.jsx rename to superset-frontend/src/views/CRUD/data/dataset/DatasetList.test.tsx index 92f06881c857..25f778dff082 100644 --- a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.test.jsx +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.test.tsx @@ -33,6 +33,7 @@ import Button from 'src/components/Button'; import IndeterminateCheckbox from 'src/components/IndeterminateCheckbox'; import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint'; import { act } from 'react-dom/test-utils'; +import SubMenu from 'src/views/components/SubMenu'; // store needed for withToasts(DatasetList) const mockStore = configureStore([thunk]); @@ -41,6 +42,7 @@ const store = mockStore({}); const datasetsInfoEndpoint = 'glob:*/api/v1/dataset/_info*'; const datasetsOwnersEndpoint = 'glob:*/api/v1/dataset/related/owners*'; const datasetsSchemaEndpoint = 'glob:*/api/v1/dataset/distinct/schema*'; +const datasetsDuplicateEndpoint = 'glob:*/api/v1/dataset/duplicate*'; const databaseEndpoint = 'glob:*/api/v1/dataset/related/database*'; const datasetsEndpoint = 'glob:*/api/v1/dataset/?*'; @@ -51,7 +53,7 @@ const mockdatasets = [...new Array(3)].map((_, i) => ({ changed_by: 'user', changed_on: new Date().toISOString(), database_name: `db ${i}`, - explore_url: `/explore/table/${i}`, + explore_url: `/explore/?datasource_type=table&datasource_id=${i}`, id: i, schema: `schema ${i}`, table_name: `coolest table ${i}`, @@ -64,7 +66,7 @@ const mockUser = { }; fetchMock.get(datasetsInfoEndpoint, { - permissions: ['can_read', 'can_write'], + permissions: ['can_read', 'can_write', 'can_duplicate'], }); fetchMock.get(datasetsOwnersEndpoint, { result: [], @@ -72,6 +74,9 @@ fetchMock.get(datasetsOwnersEndpoint, { fetchMock.get(datasetsSchemaEndpoint, { result: [], }); +fetchMock.post(datasetsDuplicateEndpoint, { + result: [], +}); fetchMock.get(datasetsEndpoint, { result: mockdatasets, dataset_count: 3, @@ -80,7 +85,7 @@ fetchMock.get(databaseEndpoint, { result: [], }); -async function mountAndWait(props) { +async function mountAndWait(props: {}) { const mounted = mount( <Provider store={store}> <DatasetList {...props} user={mockUser} /> @@ -93,7 +98,7 @@ async function mountAndWait(props) { describe('DatasetList', () => { const mockedProps = {}; - let wrapper; + let wrapper: any; beforeAll(async () => { wrapper = await mountAndWait(mockedProps); @@ -183,12 +188,59 @@ describe('DatasetList', () => { ).toMatchInlineSnapshot(`"3 Selected (2 Physical, 1 Virtual)"`); }); + it('shows duplicate modal when duplicate action is clicked', async () => { + await waitForComponentToPaint(wrapper); + expect( + wrapper.find('[data-test="duplicate-modal-input"]').exists(), + ).toBeFalsy(); + act(() => { + wrapper + .find('#duplicate-action-tooltop') + .at(0) + .find('.action-button') + .props() + .onClick(); + }); + await waitForComponentToPaint(wrapper); + expect( + wrapper.find('[data-test="duplicate-modal-input"]').exists(), + ).toBeTruthy(); + }); + + it('calls the duplicate endpoint', async () => { + await waitForComponentToPaint(wrapper); + await act(async () => { + wrapper + .find('#duplicate-action-tooltop') + .at(0) + .find('.action-button') + .props() + .onClick(); + await waitForComponentToPaint(wrapper); + wrapper + .find('[data-test="duplicate-modal-input"]') + .at(0) + .props() + .onPressEnter(); + }); + expect(fetchMock.calls(/dataset\/duplicate/)).toHaveLength(1); + }); + + it('renders a SubMenu', () => { + expect(wrapper.find(SubMenu)).toExist(); + }); + + it('renders a SubMenu with no tabs', () => { + expect(wrapper.find(SubMenu).props().tabs).toBeUndefined(); + }); + it('renders datahub link when urn is defined', async () => { await waitForComponentToPaint(wrapper); expect( wrapper .find('[data-test="cell-text"]') .filterWhere( + // @ts-ignore e => e.childAt(0).props().cell.column.id === 'datahub_link' && e.childAt(0).props().cell.row.index === 0, @@ -204,6 +256,7 @@ describe('DatasetList', () => { wrapper .find('[data-test="cell-text"]') .filterWhere( + // @ts-ignore e => e.childAt(0).props().cell.column.id === 'datahub_link' && e.childAt(0).props().cell.row.index === 1, @@ -214,6 +267,12 @@ describe('DatasetList', () => { }); }); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useLocation: () => ({}), + useHistory: () => ({}), +})); + describe('RTL', () => { async function renderAndWait() { const mounted = act(async () => { @@ -222,14 +281,17 @@ describe('RTL', () => { <QueryParamProvider> <DatasetList {...mockedProps} user={mockUser} /> </QueryParamProvider>, - { useRedux: true }, + { useRedux: true, useRouter: true }, ); }); return mounted; } - let isFeatureEnabledMock; + let isFeatureEnabledMock: jest.SpyInstance< + boolean, + [feature: featureFlags.FeatureFlag] + >; beforeEach(async () => { isFeatureEnabledMock = jest .spyOn(featureFlags, 'isFeatureEnabled') diff --git a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx index 0759306cc08b..958fafb2d900 100644 --- a/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx +++ b/superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx @@ -23,7 +23,9 @@ import React, { useMemo, useCallback, } from 'react'; +import { useHistory } from 'react-router-dom'; import rison from 'rison'; +import { datahubUrl } from 'src/preamble'; import { createFetchRelated, createFetchDistinct, @@ -45,7 +47,6 @@ import SubMenu, { SubMenuProps, ButtonProps, } from 'src/views/components/SubMenu'; -import { commonMenuData } from 'src/views/CRUD/data/common'; import Owner from 'src/types/Owner'; import withToasts from 'src/components/MessageToasts/withToasts'; import { Tooltip } from 'src/components/Tooltip'; @@ -56,9 +57,8 @@ import InfoTooltip from 'src/components/InfoTooltip'; import ImportModelsModal from 'src/components/ImportModal/index'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; import WarningIconWithTooltip from 'src/components/WarningIconWithTooltip'; -import { isUserAdmin } from 'src/dashboard/util/findPermission'; -import { datahubUrl } from 'src/preamble'; -import AddDatasetModal from './AddDatasetModal'; +import { isUserAdmin } from 'src/dashboard/util/permissionUtils'; +import { GenericLink } from 'src/components/GenericLink/GenericLink'; import { PAGE_SIZE, @@ -66,6 +66,7 @@ import { PASSWORDS_NEEDED_MESSAGE, CONFIRM_OVERWRITE_MESSAGE, } from './constants'; +import DuplicateDatasetModal from './DuplicateDatasetModal'; const FlexRowContainer = styled.div` align-items: center; @@ -116,6 +117,11 @@ type Dataset = { table_name: string; }; +interface VirtualDataset extends Dataset { + extra: Record<string, any>; + sql: string; +} + interface DatasetListProps { addDangerToast: (msg: string) => void; addSuccessToast: (msg: string) => void; @@ -131,6 +137,7 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ addSuccessToast, user, }) => { + const history = useHistory(); const { state: { loading, @@ -144,9 +151,6 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ refreshData, } = useListViewResource<Dataset>('dataset', t('dataset'), addDangerToast); - const [datasetAddModalOpen, setDatasetAddModalOpen] = - useState<boolean>(false); - const [datasetCurrentlyDeleting, setDatasetCurrentlyDeleting] = useState< (Dataset & { chart_count: number; dashboard_count: number }) | null >(null); @@ -154,6 +158,9 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ const [datasetCurrentlyEditing, setDatasetCurrentlyEditing] = useState<Dataset | null>(null); + const [datasetCurrentlyDuplicating, setDatasetCurrentlyDuplicating] = + useState<VirtualDataset | null>(null); + const [importingDataset, showImportModal] = useState<boolean>(false); const [passwordFields, setPasswordFields] = useState<string[]>([]); const [preparingExport, setPreparingExport] = useState<boolean>(false); @@ -175,6 +182,7 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ const canEdit = hasPerm('can_write'); const canDelete = hasPerm('can_write'); const canCreate = hasPerm('can_write'); + const canDuplicate = hasPerm('can_duplicate'); const canExport = hasPerm('can_export') && isFeatureEnabled(FeatureFlag.VERSIONED_EXPORT); @@ -232,6 +240,10 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ ), ); + const openDatasetDuplicateModal = (dataset: VirtualDataset) => { + setDatasetCurrentlyDuplicating(dataset); + }; + const handleBulkDatasetExport = (datasetsToExport: Dataset[]) => { const ids = datasetsToExport.map(({ id }) => id); handleResourceExport('dataset', ids, () => { @@ -281,7 +293,11 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ }, }, }: any) => { - const titleLink = <a href={exploreURL}>{datasetTitle}</a>; + const titleLink = ( + // exploreUrl can be a link to Explore or an external link + // in the first case use SPA routing, else use HTML anchor + <GenericLink to={exploreURL}>{datasetTitle}</GenericLink> + ); try { const parsedExtra = JSON.parse(extra); return ( @@ -341,7 +357,7 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ row: { original: { kind }, }, - }: any) => kind[0]?.toUpperCase() + kind.slice(1), + }: any) => (kind === 'physical' ? t('Physical') : t('Virtual')), Header: t('Type'), accessor: 'kind', disableSortBy: true, @@ -408,7 +424,8 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ const handleEdit = () => openDatasetEditModal(original); const handleDelete = () => openDatasetDeleteModal(original); const handleExport = () => handleBulkDatasetExport([original]); - if (!canEdit && !canDelete && !canExport) { + const handleDuplicate = () => openDatasetDuplicateModal(original); + if (!canEdit && !canDelete && !canExport && !canDuplicate) { return null; } return ( @@ -467,22 +484,39 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ </span> </Tooltip> )} + {canDuplicate && original.kind === 'virtual' && ( + <Tooltip + id="duplicate-action-tooltop" + title={t('Duplicate')} + placement="bottom" + > + <span + role="button" + tabIndex={0} + className="action-button" + onClick={handleDuplicate} + > + <Icons.Copy /> + </span> + </Tooltip> + )} </Actions> ); }, Header: t('Actions'), id: 'actions', - hidden: !canEdit && !canDelete, + hidden: !canEdit && !canDelete && !canDuplicate, disableSortBy: true, }, ], - [canEdit, canDelete, canExport, openDatasetEditModal], + [canEdit, canDelete, canExport, openDatasetEditModal, canDuplicate, user], ); const filterTypes: Filters = useMemo( () => [ { Header: t('Owner'), + key: 'owner', id: 'owners', input: 'select', operator: FilterOperator.relationManyMany, @@ -502,6 +536,7 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ }, { Header: t('Database'), + key: 'database', id: 'database', input: 'select', operator: FilterOperator.relationOneMany, @@ -517,6 +552,7 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ }, { Header: t('Schema'), + key: 'schema', id: 'schema', input: 'select', operator: FilterOperator.equals, @@ -532,17 +568,19 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ }, { Header: t('Type'), + key: 'sql', id: 'sql', input: 'select', operator: FilterOperator.datasetIsNullOrEmpty, unfilteredLabel: 'All', selects: [ - { label: 'Virtual', value: false }, - { label: 'Physical', value: true }, + { label: t('Virtual'), value: false }, + { label: t('Physical'), value: true }, ], }, { Header: t('Certified'), + key: 'certified', id: 'id', urlDisplay: 'certified', input: 'select', @@ -555,17 +593,18 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ }, { Header: t('Search'), + key: 'search', id: 'table_name', input: 'search', operator: FilterOperator.contains, }, ], - [], + [user], ); const menuData: SubMenuProps = { activeChild: 'Datasets', - ...commonMenuData, + name: t('Datasets'), }; const buttonArr: Array<ButtonProps> = []; @@ -585,7 +624,9 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ <i className="fa fa-plus" /> {t('Dataset')}{' '} </> ), - onClick: () => setDatasetAddModalOpen(true), + onClick: () => { + history.push('/dataset/add/'); + }, buttonStyle: 'primary', }); @@ -616,6 +657,10 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ setDatasetCurrentlyEditing(null); }; + const closeDatasetDuplicateModal = () => { + setDatasetCurrentlyDuplicating(null); + }; + const handleDatasetDelete = ({ id, table_name: tableName }: Dataset) => { SupersetClient.delete({ endpoint: `/api/v1/dataset/${id}`, @@ -651,14 +696,33 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ ); }; + const handleDatasetDuplicate = (newDatasetName: string) => { + if (datasetCurrentlyDuplicating === null) { + addDangerToast(t('There was an issue duplicating the dataset.')); + } + + SupersetClient.post({ + endpoint: `/api/v1/dataset/duplicate`, + jsonPayload: { + base_model_id: datasetCurrentlyDuplicating?.id, + table_name: newDatasetName, + }, + }).then( + () => { + setDatasetCurrentlyDuplicating(null); + refreshData(); + }, + createErrorHandler(errMsg => + addDangerToast( + t('There was an issue duplicating the selected datasets: %s', errMsg), + ), + ), + ); + }; + return ( <> <SubMenu {...menuData} /> - <AddDatasetModal - show={datasetAddModalOpen} - onHide={() => setDatasetAddModalOpen(false)} - onDatasetAdd={refreshData} - /> {datasetCurrentlyDeleting && ( <DeleteModal description={t( @@ -685,6 +749,11 @@ const DatasetList: FunctionComponent<DatasetListProps> = ({ show /> )} + <DuplicateDatasetModal + dataset={datasetCurrentlyDuplicating} + onHide={closeDatasetDuplicateModal} + onDuplicate={handleDatasetDuplicate} + /> <ConfirmStatusChange title={t('Please confirm')} description={t( diff --git a/superset-frontend/src/views/CRUD/data/dataset/DuplicateDatasetModal.tsx b/superset-frontend/src/views/CRUD/data/dataset/DuplicateDatasetModal.tsx index 0885bf03155f..6766adf74eab 100644 --- a/superset-frontend/src/views/CRUD/data/dataset/DuplicateDatasetModal.tsx +++ b/superset-frontend/src/views/CRUD/data/dataset/DuplicateDatasetModal.tsx @@ -1,3 +1,21 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ import { t } from '@superset-ui/core'; import React, { FunctionComponent, useEffect, useState } from 'react'; import { FormLabel } from 'src/components/Form'; @@ -43,6 +61,7 @@ const DuplicateDatasetModal: FunctionComponent<DuplicateDatasetModalProps> = ({ title={t('Duplicate dataset')} disablePrimaryButton={disableSave} onHandledPrimaryAction={duplicateDataset} + primaryButtonName={t('Duplicate')} > <FormLabel htmlFor="duplicate">{t('New dataset name')}</FormLabel> <Input diff --git a/superset-frontend/src/views/CRUD/data/dataset/styles.ts b/superset-frontend/src/views/CRUD/data/dataset/styles.ts new file mode 100644 index 000000000000..268b9e273e48 --- /dev/null +++ b/superset-frontend/src/views/CRUD/data/dataset/styles.ts @@ -0,0 +1,146 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { styled, css, SupersetTheme } from '@superset-ui/core'; + +export const StyledLayoutWrapper = styled.div` + flex-grow: 1; + display: flex; + flex-direction: column; + background-color: ${({ theme }) => theme.colors.grayscale.light5}; +`; + +const Column = styled.div` + width: 100%; + height: 100%; + flex-direction: column; +`; + +export const LeftColumn = styled(Column)` + width: ${({ theme }) => theme.gridUnit * 80}px; + height: auto; +`; + +export const RightColumn = styled(Column)` + height: auto; + display: flex; + flex: 1 0 auto; + width: calc(100% - ${({ theme }) => theme.gridUnit * 80}px); +`; + +const Row = styled.div` + width: 100%; + height: 100%; + display: flex; + flex-direction: row; +`; + +export const OuterRow = styled(Row)` + flex: 1 0 auto; +`; + +export const PanelRow = styled(Row)` + flex: 1 0 auto; + height: auto; +`; + +export const FooterRow = styled(Row)` + flex: 0 0 auto; + height: ${({ theme }) => theme.gridUnit * 16}px; + z-index: 0; +`; + +export const StyledLayoutHeader = styled.div` + ${({ theme }) => ` + flex: 0 0 auto; + height: ${theme.gridUnit * 16}px; + border-bottom: 2px solid ${theme.colors.grayscale.light2}; + + .header-with-actions { + height: ${theme.gridUnit * 15.5}px; + } + `} +`; + +export const StyledCreateDatasetTitle = styled.div` + ${({ theme }) => ` + margin: ${theme.gridUnit * 4}px; + font-size: ${theme.typography.sizes.xl}px; + font-weight: ${theme.typography.weights.bold}; + `} +`; + +export const StyledLayoutLeftPanel = styled.div` + ${({ theme }) => ` + width: ${theme.gridUnit * 80}px; + height: 100%; + border-right: 1px solid ${theme.colors.grayscale.light2}; + `} +`; + +export const StyledLayoutDatasetPanel = styled.div` + width: 100%; + position: relative; +`; + +export const StyledLayoutRightPanel = styled.div` + ${({ theme }) => ` + border-left: 1px solid ${theme.colors.grayscale.light2}; + color: ${theme.colors.success.base}; + `} +`; + +export const StyledLayoutFooter = styled.div` + ${({ theme }) => ` + height: ${theme.gridUnit * 16}px; + width: 100%; + border-top: 1px solid ${theme.colors.grayscale.light2}; + border-bottom: 1px solid ${theme.colors.grayscale.light2}; + color: ${theme.colors.info.base}; + border-top: ${theme.gridUnit / 4}px solid + ${theme.colors.grayscale.light2}; + padding: ${theme.gridUnit * 4}px; + display: flex; + justify-content: flex-end; + background-color: ${theme.colors.grayscale.light5}; + z-index: ${theme.zIndex.max} + `} +`; + +export const HeaderComponentStyles = styled.div` + .ant-btn { + span { + margin-right: 0; + } + + &:disabled { + svg { + color: ${({ theme }) => theme.colors.grayscale.light1}; + } + } + } +`; + +export const disabledSaveBtnStyles = (theme: SupersetTheme) => css` + width: ${theme.gridUnit * 21.5}px; + + &:disabled { + background-color: ${theme.colors.grayscale.light3}; + color: ${theme.colors.grayscale.light1}; + } +`; diff --git a/superset-frontend/src/views/CRUD/data/hooks.ts b/superset-frontend/src/views/CRUD/data/hooks.ts index 41b514591547..4e7a51de3521 100644 --- a/superset-frontend/src/views/CRUD/data/hooks.ts +++ b/superset-frontend/src/views/CRUD/data/hooks.ts @@ -16,11 +16,17 @@ * specific language governing permissions and limitations * under the License. */ -import { useState, useEffect } from 'react'; +import { useState, useEffect, useCallback } from 'react'; +import { SupersetClient, logging, t } from '@superset-ui/core'; +import rison from 'rison'; +import { addDangerToast } from 'src/components/MessageToasts/actions'; +import { DatasetObject } from 'src/views/CRUD/data/dataset/AddDataset/types'; +import { DatabaseObject } from 'src/components/DatabaseSelector'; type BaseQueryObject = { id: number; }; + export function useQueryPreviewState<D extends BaseQueryObject = any>({ queries, fetchData, @@ -73,3 +79,100 @@ export function useQueryPreviewState<D extends BaseQueryObject = any>({ disableNext, }; } + +/** + * Retrieves all pages of dataset results + */ +export const useDatasetsList = ( + db: + | (DatabaseObject & { + owners: [number]; + }) + | undefined, + schema: string | null | undefined, +) => { + const [datasets, setDatasets] = useState<DatasetObject[]>([]); + const encodedSchema = schema ? encodeURIComponent(schema) : undefined; + + const getDatasetsList = useCallback(async (filters: object[]) => { + let results: DatasetObject[] = []; + let page = 0; + let count; + + // If count is undefined or less than results, we need to + // asynchronously retrieve a page of dataset results + while (count === undefined || results.length < count) { + const queryParams = rison.encode_uri({ filters, page }); + try { + // eslint-disable-next-line no-await-in-loop + const response = await SupersetClient.get({ + endpoint: `/api/v1/dataset/?q=${queryParams}`, + }); + + // Reassign local count to response's count + ({ count } = response.json); + + const { + json: { result }, + } = response; + + results = [...results, ...result]; + + page += 1; + } catch (error) { + addDangerToast(t('There was an error fetching dataset')); + logging.error(t('There was an error fetching dataset'), error); + } + } + + setDatasets(results); + }, []); + + useEffect(() => { + const filters = [ + { col: 'database', opr: 'rel_o_m', value: db?.id }, + { col: 'schema', opr: 'eq', value: encodedSchema }, + { col: 'sql', opr: 'dataset_is_null_or_empty', value: true }, + ]; + + if (schema) { + getDatasetsList(filters); + } + }, [db?.id, schema, encodedSchema, getDatasetsList]); + + const datasetNames = datasets?.map(dataset => dataset.table_name); + + return { datasets, datasetNames }; +}; + +export const useGetDatasetRelatedCounts = (id: string) => { + const [usageCount, setUsageCount] = useState(0); + + const getDatasetRelatedObjects = useCallback( + () => + SupersetClient.get({ + endpoint: `/api/v1/dataset/${id}/related_objects`, + }) + .then(({ json }) => { + setUsageCount(json?.charts.count); + }) + .catch(error => { + addDangerToast( + t(`There was an error fetching dataset's related objects`), + ); + logging.error(error); + }), + [id], + ); + + useEffect(() => { + // Todo: this useEffect should be used to call all count methods conncurently + // when we populate data for the new tabs. For right separating out this + // api call for building the usage page. + if (id) { + getDatasetRelatedObjects(); + } + }, [id, getDatasetRelatedObjects]); + + return { usageCount }; +}; diff --git a/superset-frontend/src/views/CRUD/data/query/QueryList.test.tsx b/superset-frontend/src/views/CRUD/data/query/QueryList.test.tsx index 83ecc588b2d1..be28d7e2dfa8 100644 --- a/superset-frontend/src/views/CRUD/data/query/QueryList.test.tsx +++ b/superset-frontend/src/views/CRUD/data/query/QueryList.test.tsx @@ -32,6 +32,8 @@ import { QueryObject } from 'src/views/CRUD/types'; import ListView from 'src/components/ListView'; import Filters from 'src/components/ListView/Filters'; import SyntaxHighlighter from 'react-syntax-highlighter/dist/cjs/light'; +import SubMenu from 'src/views/components/SubMenu'; +import { QueryState } from '@superset-ui/core'; // store needed for withToasts const mockStore = configureStore([thunk]); @@ -53,7 +55,7 @@ const mockQueries: QueryObject[] = [...new Array(3)].map((_, i) => ({ { schema: 'foo', table: 'table' }, { schema: 'bar', table: 'table_2' }, ], - status: 'success', + status: QueryState.SUCCESS, tab_name: 'Main Tab', user: { first_name: 'cool', @@ -147,4 +149,26 @@ describe('QueryList', () => { `"http://localhost/api/v1/query/?q=(filters:!((col:sql,opr:ct,value:fooo)),order_column:start_time,order_direction:desc,page:0,page_size:25)"`, ); }); + + it('renders a SubMenu', () => { + expect(wrapper.find(SubMenu)).toExist(); + }); + + it('renders a SubMenu with Saved queries and Query History links', () => { + expect(wrapper.find(SubMenu).props().tabs).toEqual( + expect.arrayContaining([ + expect.objectContaining({ label: 'Saved queries' }), + expect.objectContaining({ label: 'Query history' }), + ]), + ); + }); + + it('renders a SubMenu without Databases and Datasets links', () => { + expect(wrapper.find(SubMenu).props().tabs).not.toEqual( + expect.arrayContaining([ + expect.objectContaining({ label: 'Databases' }), + expect.objectContaining({ label: 'Datasets' }), + ]), + ); + }); }); diff --git a/superset-frontend/src/views/CRUD/data/query/QueryList.tsx b/superset-frontend/src/views/CRUD/data/query/QueryList.tsx index 6ab71b8d4367..ff7a268f20b9 100644 --- a/superset-frontend/src/views/CRUD/data/query/QueryList.tsx +++ b/superset-frontend/src/views/CRUD/data/query/QueryList.tsx @@ -17,7 +17,13 @@ * under the License. */ import React, { useMemo, useState, useCallback, ReactElement } from 'react'; -import { SupersetClient, t, styled, useTheme } from '@superset-ui/core'; +import { + QueryState, + styled, + SupersetClient, + t, + useTheme, +} from '@superset-ui/core'; import moment from 'moment'; import { createFetchRelated, @@ -127,7 +133,13 @@ function QueryList({ addDangerToast }: QueryListProps) { row: { original: { status }, }, - }: any) => { + }: { + row: { + original: { + status: QueryState; + }; + }; + }) => { const statusConfig: { name: ReactElement | null; label: string; @@ -135,33 +147,39 @@ function QueryList({ addDangerToast }: QueryListProps) { name: null, label: '', }; - if (status === 'success') { + if (status === QueryState.SUCCESS) { statusConfig.name = ( <Icons.Check iconColor={theme.colors.success.base} /> ); statusConfig.label = t('Success'); - } else if (status === 'failed' || status === 'stopped') { + } else if ( + status === QueryState.FAILED || + status === QueryState.STOPPED + ) { statusConfig.name = ( <Icons.XSmall iconColor={ - status === 'failed' + status === QueryState.FAILED ? theme.colors.error.base : theme.colors.grayscale.base } /> ); statusConfig.label = t('Failed'); - } else if (status === 'running') { + } else if (status === QueryState.RUNNING) { statusConfig.name = ( <Icons.Running iconColor={theme.colors.primary.base} /> ); statusConfig.label = t('Running'); - } else if (status === 'timed_out') { + } else if (status === QueryState.TIMED_OUT) { statusConfig.name = ( <Icons.Offline iconColor={theme.colors.grayscale.light1} /> ); statusConfig.label = t('Offline'); - } else if (status === 'scheduled' || status === 'pending') { + } else if ( + status === QueryState.SCHEDULED || + status === QueryState.PENDING + ) { statusConfig.name = ( <Icons.Queued iconColor={theme.colors.grayscale.base} /> ); @@ -329,10 +347,11 @@ function QueryList({ addDangerToast }: QueryListProps) { () => [ { Header: t('Database'), + key: 'database', id: 'database', input: 'select', operator: FilterOperator.relationOneMany, - unfilteredLabel: 'All', + unfilteredLabel: t('All'), fetchSelects: createFetchRelated( 'query', 'database', @@ -346,6 +365,7 @@ function QueryList({ addDangerToast }: QueryListProps) { }, { Header: t('State'), + key: 'state', id: 'status', input: 'select', operator: FilterOperator.equals, @@ -363,6 +383,7 @@ function QueryList({ addDangerToast }: QueryListProps) { }, { Header: t('User'), + key: 'user', id: 'user', input: 'select', operator: FilterOperator.relationOneMany, @@ -380,12 +401,14 @@ function QueryList({ addDangerToast }: QueryListProps) { }, { Header: t('Time range'), + key: 'start_time', id: 'start_time', input: 'datetime_range', operator: FilterOperator.between, }, { Header: t('Search by query text'), + key: 'sql', id: 'sql', input: 'search', operator: FilterOperator.contains, diff --git a/superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.test.tsx b/superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.test.tsx index 7a85e4c29212..96498f6e69a6 100644 --- a/superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.test.tsx +++ b/superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.test.tsx @@ -27,6 +27,7 @@ import QueryPreviewModal from 'src/views/CRUD/data/query/QueryPreviewModal'; import { QueryObject } from 'src/views/CRUD/types'; import SyntaxHighlighter from 'react-syntax-highlighter/dist/cjs/light'; import { act } from 'react-dom/test-utils'; +import { QueryState } from '@superset-ui/core'; // store needed for withToasts const mockStore = configureStore([thunk]); @@ -46,7 +47,7 @@ const mockQueries: QueryObject[] = [...new Array(3)].map((_, i) => ({ { schema: 'foo', table: 'table' }, { schema: 'bar', table: 'table_2' }, ], - status: 'success', + status: QueryState.SUCCESS, tab_name: 'Main Tab', user: { first_name: 'cool', diff --git a/superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx b/superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx index 694b49055700..e8d7b5e201e9 100644 --- a/superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx +++ b/superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx @@ -115,32 +115,34 @@ function QueryPreviewModal({ onHide={onHide} show={show} title={t('Query preview')} - footer={[ - <Button - data-test="previous-query" - key="previous-query" - disabled={disablePrevious} - onClick={() => handleDataChange(true)} - > - {t('Previous')} - </Button>, - <Button - data-test="next-query" - key="next-query" - disabled={disableNext} - onClick={() => handleDataChange(false)} - > - {t('Next')} - </Button>, - <Button - data-test="open-in-sql-lab" - key="open-in-sql-lab" - buttonStyle="primary" - onClick={() => openInSqlLab(id)} - > - {t('Open in SQL Lab')} - </Button>, - ]} + footer={ + <> + <Button + data-test="previous-query" + key="previous-query" + disabled={disablePrevious} + onClick={() => handleDataChange(true)} + > + {t('Previous')} + </Button> + <Button + data-test="next-query" + key="next-query" + disabled={disableNext} + onClick={() => handleDataChange(false)} + > + {t('Next')} + </Button> + <Button + data-test="open-in-sql-lab" + key="open-in-sql-lab" + buttonStyle="primary" + onClick={() => openInSqlLab(id)} + > + {t('Open in SQL Lab')} + </Button> + </> + } > <QueryTitle>{t('Tab name')}</QueryTitle> <QueryLabel>{query.tab_name}</QueryLabel> diff --git a/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.test.jsx b/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.test.jsx index 456fe2f394f5..afa0fcd6aeac 100644 --- a/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.test.jsx +++ b/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.test.jsx @@ -18,6 +18,7 @@ */ import React from 'react'; import thunk from 'redux-thunk'; +import { BrowserRouter } from 'react-router-dom'; import configureStore from 'redux-mock-store'; import { Provider } from 'react-redux'; import fetchMock from 'fetch-mock'; @@ -153,6 +154,24 @@ describe('SavedQueryList', () => { expect(wrapper.find(SubMenu)).toExist(); }); + it('renders a SubMenu with Saved queries and Query History links', () => { + expect(wrapper.find(SubMenu).props().tabs).toEqual( + expect.arrayContaining([ + expect.objectContaining({ label: 'Saved queries' }), + expect.objectContaining({ label: 'Query history' }), + ]), + ); + }); + + it('renders a SubMenu without Databases and Datasets links', () => { + expect(wrapper.find(SubMenu).props().tabs).not.toEqual( + expect.arrayContaining([ + expect.objectContaining({ label: 'Databases' }), + expect.objectContaining({ label: 'Datasets' }), + ]), + ); + }); + it('renders a ListView', () => { expect(wrapper.find(ListView)).toExist(); }); @@ -227,9 +246,11 @@ describe('RTL', () => { async function renderAndWait() { const mounted = act(async () => { render( - <QueryParamProvider> - <SavedQueryList /> - </QueryParamProvider>, + <BrowserRouter> + <QueryParamProvider> + <SavedQueryList /> + </QueryParamProvider> + </BrowserRouter>, { useRedux: true }, ); }); diff --git a/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx b/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx index f3d58fe52cce..291063aa88b1 100644 --- a/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx +++ b/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx @@ -50,6 +50,7 @@ import copyTextToClipboard from 'src/utils/copy'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; import ImportModelsModal from 'src/components/ImportModal/index'; import Icons from 'src/components/Icons'; +import { BootstrapUser } from 'src/types/bootstrapTypes'; import SavedQueryPreviewModal from './SavedQueryPreviewModal'; const PAGE_SIZE = 25; @@ -69,9 +70,7 @@ const CONFIRM_OVERWRITE_MESSAGE = t( interface SavedQueryListProps { addDangerToast: (msg: string) => void; addSuccessToast: (msg: string) => void; - user: { - userId: string | number; - }; + user: BootstrapUser; } const StyledTableLabel = styled.div` @@ -424,10 +423,11 @@ function SavedQueryList({ () => [ { Header: t('Database'), + key: 'database', id: 'database', input: 'select', operator: FilterOperator.relationOneMany, - unfilteredLabel: 'All', + unfilteredLabel: t('All'), fetchSelects: createFetchRelated( 'saved_query', 'database', @@ -445,6 +445,7 @@ function SavedQueryList({ { Header: t('Schema'), id: 'schema', + key: 'schema', input: 'select', operator: FilterOperator.equals, unfilteredLabel: 'All', @@ -462,6 +463,7 @@ function SavedQueryList({ { Header: t('Search'), id: 'label', + key: 'search', input: 'search', operator: FilterOperator.allText, }, diff --git a/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx b/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx index e8250d0fb7f8..29efb634a49e 100644 --- a/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx +++ b/superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx @@ -95,32 +95,34 @@ const SavedQueryPreviewModal: FunctionComponent<SavedQueryPreviewModalProps> = onHide={onHide} show={show} title={t('Query preview')} - footer={[ - <Button - data-test="previous-saved-query" - key="previous-saved-query" - disabled={disablePrevious} - onClick={() => handleDataChange(true)} - > - {t('Previous')} - </Button>, - <Button - data-test="next-saved-query" - key="next-saved-query" - disabled={disableNext} - onClick={() => handleDataChange(false)} - > - {t('Next')} - </Button>, - <Button - data-test="open-in-sql-lab" - key="open-in-sql-lab" - buttonStyle="primary" - onClick={() => openInSqlLab(savedQuery.id)} - > - {t('Open in SQL Lab')} - </Button>, - ]} + footer={ + <> + <Button + data-test="previous-saved-query" + key="previous-saved-query" + disabled={disablePrevious} + onClick={() => handleDataChange(true)} + > + {t('Previous')} + </Button> + <Button + data-test="next-saved-query" + key="next-saved-query" + disabled={disableNext} + onClick={() => handleDataChange(false)} + > + {t('Next')} + </Button> + <Button + data-test="open-in-sql-lab" + key="open-in-sql-lab" + buttonStyle="primary" + onClick={() => openInSqlLab(savedQuery.id)} + > + {t('Open in SQL Lab')} + </Button> + </> + } > <QueryTitle>{t('Query name')}</QueryTitle> <QueryLabel>{savedQuery.label}</QueryLabel> diff --git a/superset-frontend/src/views/CRUD/hooks.ts b/superset-frontend/src/views/CRUD/hooks.ts index 1bb0a06dc6d9..80a6c4793bbe 100644 --- a/superset-frontend/src/views/CRUD/hooks.ts +++ b/superset-frontend/src/views/CRUD/hooks.ts @@ -420,6 +420,10 @@ export function useImportResource( const formData = new FormData(); formData.append('formData', bundle); + const RE_EXPORT_TEXT = t( + 'Please re-export your file and try importing again', + ); + /* The import bundle never contains database passwords; if required * they should be provided by the user during import. */ @@ -468,8 +472,8 @@ export function useImportResource( resourceLabel, [ ...error.errors.map(payload => payload.message), - t('Please re-export your file and try importing again'), - ].join('\n'), + RE_EXPORT_TEXT, + ].join('.\n'), ), ); } else { @@ -641,7 +645,7 @@ export const testDatabaseConnection = ( addSuccessToast: (arg0: string) => void, ) => { SupersetClient.post({ - endpoint: 'api/v1/database/test_connection', + endpoint: 'api/v1/database/test_connection/', body: JSON.stringify(connection), headers: { 'Content-Type': 'application/json' }, }).then( @@ -668,6 +672,21 @@ export function useAvailableDatabases() { return [availableDbs, getAvailable] as const; } +const transformDB = (db: Partial<DatabaseObject> | null) => { + if (db && Array.isArray(db?.catalog)) { + return { + ...db, + catalog: Object.assign( + {}, + ...db.catalog.map((x: { name: string; value: string }) => ({ + [x.name]: x.value, + })), + ), + }; + } + return db; +}; + export function useDatabaseValidation() { const [validationErrors, setValidationErrors] = useState<JsonObject | null>( null, @@ -675,8 +694,8 @@ export function useDatabaseValidation() { const getValidation = useCallback( (database: Partial<DatabaseObject> | null, onCreate = false) => SupersetClient.post({ - endpoint: '/api/v1/database/validate_parameters', - body: JSON.stringify(database), + endpoint: '/api/v1/database/validate_parameters/', + body: JSON.stringify(transformDB(database)), headers: { 'Content-Type': 'application/json' }, }) .then(() => { diff --git a/superset-frontend/src/views/CRUD/types.ts b/superset-frontend/src/views/CRUD/types.ts index 0090697747ac..7dd5d74f1339 100644 --- a/superset-frontend/src/views/CRUD/types.ts +++ b/superset-frontend/src/views/CRUD/types.ts @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ +import { QueryState } from '@superset-ui/core'; import { User } from 'src/types/bootstrapTypes'; import Database from 'src/types/Database'; import Owner from 'src/types/Owner'; @@ -24,13 +25,16 @@ export type FavoriteStatus = { [id: number]: boolean; }; -export enum TableTabTypes { - FAVORITE = 'Favorite', - MINE = 'Mine', - EXAMPLES = 'Examples', +export enum TableTab { + Favorite = 'Favorite', + Mine = 'Mine', + Other = 'Other', + Viewed = 'Viewed', + Created = 'Created', + Edited = 'Edited', } -export type Filters = { +export type Filter = { col: string; opr: string; value: string | number; @@ -39,12 +43,12 @@ export type Filters = { export interface DashboardTableProps { addDangerToast: (message: string) => void; addSuccessToast: (message: string) => void; - search: string; user?: User; mine: Array<Dashboard>; showThumbnails?: boolean; - featureFlag?: boolean; - examples: Array<Dashboard>; + otherTabData: Array<Dashboard>; + otherTabFilters: Filter[]; + otherTabTitle: string; } export interface Dashboard { @@ -91,14 +95,7 @@ export interface QueryObject { sql: string; executed_sql: string | null; sql_tables?: { catalog?: string; schema: string; table: string }[]; - status: - | 'success' - | 'failed' - | 'stopped' - | 'running' - | 'timed_out' - | 'scheduled' - | 'pending'; + status: QueryState; tab_name: string; user: { first_name: string; @@ -120,7 +117,7 @@ export enum QueryObjectColumns { database_name = 'database.database_name', schema = 'schema', sql = 'sql', - executed_sql = 'exceuted_sql', + executed_sql = 'executed_sql', sql_tables = 'sql_tables', status = 'status', tab_name = 'tab_name', diff --git a/superset-frontend/src/views/CRUD/utils.test.tsx b/superset-frontend/src/views/CRUD/utils.test.tsx index e727a0c896bd..fa41455d8508 100644 --- a/superset-frontend/src/views/CRUD/utils.test.tsx +++ b/superset-frontend/src/views/CRUD/utils.test.tsx @@ -18,13 +18,17 @@ */ import rison from 'rison'; import { - isNeedsPassword, - isAlreadyExists, - getPasswordsNeeded, + checkUploadExtensions, getAlreadyExists, + getFilterValues, + getPasswordsNeeded, hasTerminalValidation, - checkUploadExtensions, + isAlreadyExists, + isNeedsPassword, } from 'src/views/CRUD/utils'; +import { User } from 'src/types/bootstrapTypes'; +import { Filter, TableTab } from './types'; +import { WelcomeTable } from './welcome/types'; const terminalErrors = { errors: [ @@ -228,3 +232,165 @@ test('checkUploadExtensions should return valid upload extensions', () => { checkUploadExtensions(randomExtensionThree, uploadExtensionTest), ).toBeFalsy(); }); + +test('getFilterValues', () => { + const userId = 1234; + const mockUser: User = { + firstName: 'foo', + lastName: 'bar', + username: 'baz', + userId, + isActive: true, + isAnonymous: false, + }; + const testCases: [ + TableTab, + WelcomeTable, + User | undefined, + Filter[] | undefined, + ReturnType<typeof getFilterValues>, + ][] = [ + [ + TableTab.Mine, + WelcomeTable.SavedQueries, + mockUser, + undefined, + [ + { + id: 'created_by', + operator: 'rel_o_m', + value: `${userId}`, + }, + ], + ], + [ + TableTab.Favorite, + WelcomeTable.SavedQueries, + mockUser, + undefined, + [ + { + id: 'id', + operator: 'saved_query_is_fav', + value: true, + }, + ], + ], + [ + TableTab.Created, + WelcomeTable.Charts, + mockUser, + undefined, + [ + { + id: 'created_by', + operator: 'rel_o_m', + value: `${userId}`, + }, + ], + ], + [ + TableTab.Created, + WelcomeTable.Dashboards, + mockUser, + undefined, + [ + { + id: 'created_by', + operator: 'rel_o_m', + value: `${userId}`, + }, + ], + ], + [ + TableTab.Created, + WelcomeTable.Recents, + mockUser, + undefined, + [ + { + id: 'created_by', + operator: 'rel_o_m', + value: `${userId}`, + }, + ], + ], + [ + TableTab.Mine, + WelcomeTable.Charts, + mockUser, + undefined, + [ + { + id: 'owners', + operator: 'rel_m_m', + value: `${userId}`, + }, + ], + ], + [ + TableTab.Mine, + WelcomeTable.Dashboards, + mockUser, + undefined, + [ + { + id: 'owners', + operator: 'rel_m_m', + value: `${userId}`, + }, + ], + ], + [ + TableTab.Favorite, + WelcomeTable.Dashboards, + mockUser, + undefined, + [ + { + id: 'id', + operator: 'dashboard_is_favorite', + value: true, + }, + ], + ], + [ + TableTab.Favorite, + WelcomeTable.Charts, + mockUser, + undefined, + [ + { + id: 'id', + operator: 'chart_is_favorite', + value: true, + }, + ], + ], + [ + TableTab.Other, + WelcomeTable.Charts, + mockUser, + [ + { + col: 'created_by', + opr: 'rel_o_m', + value: 0, + }, + ], + [ + { + id: 'created_by', + operator: 'rel_o_m', + value: 0, + }, + ], + ], + ]; + testCases.forEach(testCase => { + const [tab, welcomeTable, user, otherTabFilters, expectedValue] = testCase; + expect(getFilterValues(tab, welcomeTable, user, otherTabFilters)).toEqual( + expectedValue, + ); + }); +}); diff --git a/superset-frontend/src/views/CRUD/utils.tsx b/superset-frontend/src/views/CRUD/utils.tsx index a0004a844b7d..4b839739d47c 100644 --- a/superset-frontend/src/views/CRUD/utils.tsx +++ b/superset-frontend/src/views/CRUD/utils.tsx @@ -18,22 +18,24 @@ */ import { - t, - SupersetClient, - SupersetClientResponse, + css, logging, styled, + SupersetClient, + SupersetClientResponse, SupersetTheme, - css, + t, } from '@superset-ui/core'; import Chart from 'src/types/Chart'; import { intersection } from 'lodash'; import rison from 'rison'; import { getClientErrorObject } from 'src/utils/getClientErrorObject'; -import { FetchDataConfig } from 'src/components/ListView'; +import { FetchDataConfig, FilterValue } from 'src/components/ListView'; import SupersetText from 'src/utils/textUtils'; -import findPermission from 'src/dashboard/util/findPermission'; -import { Dashboard, Filters } from './types'; +import { findPermission } from 'src/utils/findPermission'; +import { User } from 'src/types/bootstrapTypes'; +import { Dashboard, Filter, TableTab } from './types'; +import { WelcomeTable } from './welcome/types'; // Modifies the rison encoding slightly to match the backend's rison encoding/decoding. Applies globally. // Code pulled from rison.js (https://github.com/Nanonid/rison), rison is licensed under the MIT license. @@ -92,8 +94,9 @@ const createFetchResourceMethod = : undefined; const data: { label: string; value: string | number }[] = []; - json?.result?.forEach( - ({ text, value }: { text: string; value: string | number }) => { + json?.result + ?.filter(({ text }: { text: string }) => text.trim().length > 0) + .forEach(({ text, value }: { text: string; value: string | number }) => { if ( loggedUser && value === loggedUser.value && @@ -106,8 +109,7 @@ const createFetchResourceMethod = value, }); } - }, - ); + }); if (loggedUser && (!filterValue || fetchedLoggedUser)) { data.unshift(loggedUser); @@ -120,7 +122,7 @@ const createFetchResourceMethod = }; export const PAGE_SIZE = 5; -const getParams = (filters?: Array<Filters>) => { +const getParams = (filters?: Filter[]) => { const params = { order_column: 'changed_on_delta_humanized', order_direction: 'desc', @@ -164,7 +166,7 @@ export const getEditedObjects = (userId: string | number) => { export const getUserOwnedObjects = ( userId: string | number, resource: string, - filters: Array<Filters> = [ + filters: Filter[] = [ { col: 'owners', opr: 'rel_m_m', @@ -176,20 +178,14 @@ export const getUserOwnedObjects = ( endpoint: `/api/v1/${resource}/?q=${getParams(filters)}`, }).then(res => res.json?.result); -export const getRecentAcitivtyObjs = ( +export const getRecentActivityObjs = ( userId: string | number, recent: string, addDangerToast: (arg1: string, arg2: any) => any, + filters: Filter[], ) => SupersetClient.get({ endpoint: recent }).then(recentsRes => { const res: any = {}; - const filters = [ - { - col: 'created_by', - opr: 'rel_o_m', - value: 0, - }, - ]; const newBatch = [ SupersetClient.get({ endpoint: `/api/v1/chart/?q=${getParams(filters)}`, @@ -200,8 +196,8 @@ export const getRecentAcitivtyObjs = ( ]; return Promise.all(newBatch) .then(([chartRes, dashboardRes]) => { - res.examples = [...chartRes.json.result, ...dashboardRes.json.result]; - res.viewed = recentsRes.json; + res.other = [...chartRes.json.result, ...dashboardRes.json.result]; + res.viewed = recentsRes.json.result; return res; }) .catch(errMsg => @@ -227,10 +223,8 @@ export function createErrorHandler( const errorsArray = parsedError?.errors; const config = await SupersetText; if ( - errorsArray && - errorsArray.length && - config && - config.ERRORS && + errorsArray?.length && + config?.ERRORS && errorsArray[0].error_type in config.ERRORS ) { parsedError.message = config.ERRORS[errorsArray[0].error_type]; @@ -444,3 +438,64 @@ export const uploadUserPerms = ( canUploadData: canUploadCSV || canUploadColumnar || canUploadExcel, }; }; + +export function getFilterValues( + tab: TableTab, + welcomeTable: WelcomeTable, + user?: User, + otherTabFilters?: Filter[], +): FilterValue[] { + if ( + tab === TableTab.Created || + (welcomeTable === WelcomeTable.SavedQueries && tab === TableTab.Mine) + ) { + return [ + { + id: 'created_by', + operator: 'rel_o_m', + value: `${user?.userId}`, + }, + ]; + } + if (welcomeTable === WelcomeTable.SavedQueries && tab === TableTab.Favorite) { + return [ + { + id: 'id', + operator: 'saved_query_is_fav', + value: true, + }, + ]; + } + if (tab === TableTab.Mine && user) { + return [ + { + id: 'owners', + operator: 'rel_m_m', + value: `${user.userId}`, + }, + ]; + } + if ( + tab === TableTab.Favorite && + [WelcomeTable.Dashboards, WelcomeTable.Charts].includes(welcomeTable) + ) { + return [ + { + id: 'id', + operator: + welcomeTable === WelcomeTable.Dashboards + ? 'dashboard_is_favorite' + : 'chart_is_favorite', + value: true, + }, + ]; + } + if (tab === TableTab.Other) { + return (otherTabFilters || []).map(flt => ({ + id: flt.col, + operator: flt.opr, + value: flt.value, + })); + } + return []; +} diff --git a/superset-frontend/src/views/CRUD/welcome/ActivityTable.test.tsx b/superset-frontend/src/views/CRUD/welcome/ActivityTable.test.tsx index 71067b817a3e..66d521f362b0 100644 --- a/superset-frontend/src/views/CRUD/welcome/ActivityTable.test.tsx +++ b/superset-frontend/src/views/CRUD/welcome/ActivityTable.test.tsx @@ -25,6 +25,7 @@ import fetchMock from 'fetch-mock'; import thunk from 'redux-thunk'; import configureStore from 'redux-mock-store'; import ActivityTable from 'src/views/CRUD/welcome/ActivityTable'; +import { TableTab } from 'src/views/CRUD/types'; const mockStore = configureStore([thunk]); const store = mockStore({}); @@ -33,7 +34,7 @@ const chartsEndpoint = 'glob:*/api/v1/chart/?*'; const dashboardsEndpoint = 'glob:*/api/v1/dashboard/?*'; const mockData = { - Viewed: [ + [TableTab.Viewed]: [ { slice_name: 'ChartyChart', changed_on_utc: '24 Feb 2014 10:13:14', @@ -42,7 +43,7 @@ const mockData = { table: {}, }, ], - Created: [ + [TableTab.Created]: [ { dashboard_title: 'Dashboard_Test', changed_on_utc: '24 Feb 2014 10:13:14', @@ -77,11 +78,11 @@ fetchMock.get(dashboardsEndpoint, { describe('ActivityTable', () => { const activityProps = { - activeChild: 'Created', + activeChild: TableTab.Created, activityData: mockData, setActiveChild: jest.fn(), user: { userId: '1' }, - loadedCount: 3, + isFetchingActivityData: false, }; let wrapper: ReactWrapper; @@ -122,11 +123,11 @@ describe('ActivityTable', () => { }); it('show empty state if there is no data', () => { const activityProps = { - activeChild: 'Created', + activeChild: TableTab.Created, activityData: {}, setActiveChild: jest.fn(), user: { userId: '1' }, - loadedCount: 3, + isFetchingActivityData: false, }; const wrapper = mount( <Provider store={store}> diff --git a/superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx b/superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx index 540c03341900..11a3e9afdb83 100644 --- a/superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx +++ b/superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx @@ -20,9 +20,10 @@ import React, { useEffect, useState } from 'react'; import moment from 'moment'; import { styled, t } from '@superset-ui/core'; import { setItem, LocalStorageKeys } from 'src/utils/localStorageHelpers'; - +import { Link } from 'react-router-dom'; import ListViewCard from 'src/components/ListViewCard'; import SubMenu from 'src/views/components/SubMenu'; +import { Dashboard, SavedQueryObject, TableTab } from 'src/views/CRUD/types'; import { ActivityData, LoadingCards } from 'src/views/CRUD/welcome/Welcome'; import { CardContainer, @@ -30,7 +31,6 @@ import { getEditedObjects, } from 'src/views/CRUD/utils'; import { Chart } from 'src/types/Chart'; -import { Dashboard, SavedQueryObject } from 'src/views/CRUD/types'; import Icons from 'src/components/Icons'; @@ -38,7 +38,7 @@ import EmptyState from './EmptyState'; import { WelcomeTable } from './types'; /** - * Return result from /superset/recent_activity/{user_id} + * Return result from /api/v1/log/recent_activity/{user_id}/ */ interface RecentActivity { action: string; @@ -57,14 +57,8 @@ interface RecentDashboard extends RecentActivity { item_type: 'dashboard'; } -export enum SetTabType { - EDITED = 'Edited', - CREATED = 'Created', - VIEWED = 'Viewed', - EXAMPLE = 'Examples', -} /** - * Recent activity objects fetched by `getRecentAcitivtyObjs`. + * Recent activity objects fetched by `getRecentActivityObjs`. */ type ActivityObject = | RecentSlice @@ -80,7 +74,7 @@ interface ActivityProps { activeChild: string; setActiveChild: (arg0: string) => void; activityData: ActivityData; - loadedCount: number; + isFetchingActivityData: boolean; } const Styles = styled.div` @@ -134,67 +128,64 @@ export default function ActivityTable({ setActiveChild, activityData, user, - loadedCount, + isFetchingActivityData, }: ActivityProps) { - const [editedObjs, setEditedObjs] = useState<Array<ActivityData>>(); - const [loadingState, setLoadingState] = useState(false); + const [editedCards, setEditedCards] = useState<ActivityData[]>(); + const [isFetchingEditedCards, setIsFetchingEditedCards] = useState(false); const getEditedCards = () => { - setLoadingState(true); + setIsFetchingEditedCards(true); getEditedObjects(user.userId).then(r => { - setEditedObjs([...r.editedChart, ...r.editedDash]); - setLoadingState(false); + setEditedCards([...r.editedChart, ...r.editedDash]); + setIsFetchingEditedCards(false); }); }; useEffect(() => { - if (activeChild === 'Edited') { - setLoadingState(true); + if (activeChild === TableTab.Edited) { getEditedCards(); } }, [activeChild]); const tabs = [ { - name: 'Edited', + name: TableTab.Edited, label: t('Edited'), onClick: () => { - setActiveChild('Edited'); - setItem(LocalStorageKeys.homepage_activity_filter, SetTabType.EDITED); + setActiveChild(TableTab.Edited); + setItem(LocalStorageKeys.homepage_activity_filter, TableTab.Edited); }, }, { - name: 'Created', + name: TableTab.Created, label: t('Created'), onClick: () => { - setActiveChild('Created'); - setItem(LocalStorageKeys.homepage_activity_filter, SetTabType.CREATED); + setActiveChild(TableTab.Created); + setItem(LocalStorageKeys.homepage_activity_filter, TableTab.Created); }, }, ]; - if (activityData?.Viewed) { + if (activityData?.[TableTab.Viewed]) { tabs.unshift({ - name: 'Viewed', + name: TableTab.Viewed, label: t('Viewed'), onClick: () => { - setActiveChild('Viewed'); - setItem(LocalStorageKeys.homepage_activity_filter, SetTabType.VIEWED); + setActiveChild(TableTab.Viewed); + setItem(LocalStorageKeys.homepage_activity_filter, TableTab.Viewed); }, }); } const renderActivity = () => - (activeChild !== 'Edited' ? activityData[activeChild] : editedObjs).map( - (entity: ActivityObject) => { - const url = getEntityUrl(entity); - const lastActionOn = getEntityLastActionOn(entity); - return ( - <CardStyles - onClick={() => { - window.location.href = url; - }} - key={url} - > + (activeChild === TableTab.Edited + ? editedCards + : activityData[activeChild] + ).map((entity: ActivityObject) => { + const url = getEntityUrl(entity); + const lastActionOn = getEntityLastActionOn(entity); + return ( + <CardStyles key={url}> + <Link to={url}> <ListViewCard cover={<></>} url={url} @@ -203,21 +194,19 @@ export default function ActivityTable({ avatar={getEntityIcon(entity)} actions={null} /> - </CardStyles> - ); - }, - ); - - const doneFetching = loadedCount < 3; + </Link> + </CardStyles> + ); + }); - if ((loadingState && !editedObjs) || doneFetching) { + if ((isFetchingEditedCards && !editedCards) || isFetchingActivityData) { return <LoadingCards />; } return ( <Styles> <SubMenu activeChild={activeChild} tabs={tabs} /> {activityData[activeChild]?.length > 0 || - (activeChild === 'Edited' && editedObjs && editedObjs.length > 0) ? ( + (activeChild === TableTab.Edited && editedCards?.length) ? ( <CardContainer className="recentCards"> {renderActivity()} </CardContainer> diff --git a/superset-frontend/src/views/CRUD/welcome/ChartTable.test.tsx b/superset-frontend/src/views/CRUD/welcome/ChartTable.test.tsx index cfa9230328c0..45e3483026cc 100644 --- a/superset-frontend/src/views/CRUD/welcome/ChartTable.test.tsx +++ b/superset-frontend/src/views/CRUD/welcome/ChartTable.test.tsx @@ -62,6 +62,11 @@ describe('ChartTable', () => { user: { userId: '2', }, + mine: [], + otherTabData: [], + otherTabFilters: [], + otherTabTitle: 'Other', + showThumbnails: false, }; let wrapper: ReactWrapper; @@ -89,13 +94,35 @@ describe('ChartTable', () => { expect(wrapper.find('ChartCard')).toExist(); }); + it('renders other tab by default', async () => { + await act(async () => { + wrapper = mount( + <ChartTable + user={{ userId: '2' }} + mine={[]} + otherTabData={mockCharts} + otherTabFilters={[]} + otherTabTitle="Other" + showThumbnails={false} + store={store} + />, + ); + }); + await waitForComponentToPaint(wrapper); + expect(wrapper.find('EmptyState')).not.toExist(); + expect(wrapper.find('ChartCard')).toExist(); + }); + it('display EmptyState if there is no data', async () => { await act(async () => { wrapper = mount( <ChartTable - chartFilter="Mine" user={{ userId: '2' }} mine={[]} + otherTabData={[]} + otherTabFilters={[]} + otherTabTitle="Other" + showThumbnails={false} store={store} />, ); diff --git a/superset-frontend/src/views/CRUD/welcome/ChartTable.tsx b/superset-frontend/src/views/CRUD/welcome/ChartTable.tsx index 41c25033df61..52548e30b0c0 100644 --- a/superset-frontend/src/views/CRUD/welcome/ChartTable.tsx +++ b/superset-frontend/src/views/CRUD/welcome/ChartTable.tsx @@ -26,17 +26,21 @@ import { } from 'src/views/CRUD/hooks'; import { getItem, - setItem, LocalStorageKeys, + setItem, } from 'src/utils/localStorageHelpers'; import withToasts from 'src/components/MessageToasts/withToasts'; import { useHistory } from 'react-router-dom'; -import { TableTabTypes } from 'src/views/CRUD/types'; +import { Filter, TableTab } from 'src/views/CRUD/types'; import PropertiesModal from 'src/explore/components/PropertiesModal'; import { User } from 'src/types/bootstrapTypes'; -import { CardContainer, PAGE_SIZE } from 'src/views/CRUD/utils'; +import { + CardContainer, + getFilterValues, + PAGE_SIZE, +} from 'src/views/CRUD/utils'; import { LoadingCards } from 'src/views/CRUD/welcome/Welcome'; -import ChartCard from 'src/views/CRUD/chart/ChartCard'; +import ChartCard from 'src/pages/ChartList/ChartCard'; import Chart from 'src/types/Chart'; import handleResourceExport from 'src/utils/export'; import Loading from 'src/components/Loading'; @@ -48,12 +52,12 @@ import { WelcomeTable } from './types'; interface ChartTableProps { addDangerToast: (message: string) => void; addSuccessToast: (message: string) => void; - search: string; - chartFilter?: string; user?: User; mine: Array<any>; showThumbnails: boolean; - examples?: Array<object>; + otherTabData?: Array<object>; + otherTabFilters: Filter[]; + otherTabTitle: string; } function ChartTable({ @@ -62,16 +66,17 @@ function ChartTable({ addSuccessToast, mine, showThumbnails, - examples, + otherTabData, + otherTabFilters, + otherTabTitle, }: ChartTableProps) { const history = useHistory(); - const filterStore = getItem( + const initialTab = getItem( LocalStorageKeys.homepage_chart_filter, - TableTabTypes.EXAMPLES, + TableTab.Other, ); - const initialFilter = filterStore; - const filteredExamples = filter(examples, obj => 'viz_type' in obj); + const filteredOtherTabData = filter(otherTabData, obj => 'viz_type' in obj); const { state: { loading, resourceCollection: charts, bulkSelectEnabled }, @@ -84,7 +89,7 @@ function ChartTable({ t('chart'), addDangerToast, true, - initialFilter === 'Mine' ? mine : filteredExamples, + initialTab === TableTab.Mine ? mine : filteredOtherTabData, [], false, ); @@ -102,36 +107,11 @@ function ChartTable({ closeChartEditModal, } = useChartEditModal(setCharts, charts); - const [chartFilter, setChartFilter] = useState(initialFilter); + const [activeTab, setActiveTab] = useState(initialTab); const [preparingExport, setPreparingExport] = useState<boolean>(false); const [loaded, setLoaded] = useState<boolean>(false); - const getFilters = (filterName: string) => { - const filters = []; - - if (filterName === 'Mine') { - filters.push({ - id: 'owners', - operator: 'rel_m_m', - value: `${user?.userId}`, - }); - } else if (filterName === 'Favorite') { - filters.push({ - id: 'id', - operator: 'chart_is_favorite', - value: true, - }); - } else if (filterName === 'Examples') { - filters.push({ - id: 'created_by', - operator: 'rel_o_m', - value: 0, - }); - } - return filters; - }; - - const getData = (filter: string) => + const getData = (tab: TableTab) => fetchData({ pageIndex: 0, pageSize: PAGE_SIZE, @@ -141,15 +121,15 @@ function ChartTable({ desc: true, }, ], - filters: getFilters(filter), + filters: getFilterValues(tab, WelcomeTable.Charts, user, otherTabFilters), }); useEffect(() => { - if (loaded || chartFilter === 'Favorite') { - getData(chartFilter); + if (loaded || activeTab === TableTab.Favorite) { + getData(activeTab); } setLoaded(true); - }, [chartFilter]); + }, [activeTab]); const handleBulkChartExport = (chartsToExport: Chart[]) => { const ids = chartsToExport.map(({ id }) => id); @@ -161,29 +141,29 @@ function ChartTable({ const menuTabs = [ { - name: 'Favorite', + name: TableTab.Favorite, label: t('Favorite'), onClick: () => { - setChartFilter(TableTabTypes.FAVORITE); - setItem(LocalStorageKeys.homepage_chart_filter, TableTabTypes.FAVORITE); + setActiveTab(TableTab.Favorite); + setItem(LocalStorageKeys.homepage_chart_filter, TableTab.Favorite); }, }, { - name: 'Mine', + name: TableTab.Mine, label: t('Mine'), onClick: () => { - setChartFilter(TableTabTypes.MINE); - setItem(LocalStorageKeys.homepage_chart_filter, TableTabTypes.MINE); + setActiveTab(TableTab.Mine); + setItem(LocalStorageKeys.homepage_chart_filter, TableTab.Mine); }, }, ]; - if (examples) { + if (otherTabData) { menuTabs.push({ - name: 'Examples', - label: t('Examples'), + name: TableTab.Other, + label: otherTabTitle, onClick: () => { - setChartFilter(TableTabTypes.EXAMPLES); - setItem(LocalStorageKeys.homepage_chart_filter, TableTabTypes.EXAMPLES); + setActiveTab(TableTab.Other); + setItem(LocalStorageKeys.homepage_chart_filter, TableTab.Other); }, }); } @@ -201,7 +181,7 @@ function ChartTable({ )} <SubMenu - activeChild={chartFilter} + activeChild={activeTab} tabs={menuTabs} buttons={[ { @@ -221,7 +201,7 @@ function ChartTable({ buttonStyle: 'link', onClick: () => { const target = - chartFilter === 'Favorite' + activeTab === TableTab.Favorite ? `/chart/list/?filters=(favorite:(label:${t( 'Yes', )},value:!t))` @@ -237,7 +217,7 @@ function ChartTable({ <ChartCard key={`${e.id}`} openChartEditModal={openChartEditModal} - chartFilter={chartFilter} + chartFilter={activeTab} chart={e} userId={user?.userId} hasPerm={hasPerm} @@ -253,7 +233,11 @@ function ChartTable({ ))} </CardContainer> ) : ( - <EmptyState tableName={WelcomeTable.Charts} tab={chartFilter} /> + <EmptyState + tableName={WelcomeTable.Charts} + tab={activeTab} + otherTabTitle={otherTabTitle} + /> )} {preparingExport && <Loading />} </ErrorBoundary> diff --git a/superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx b/superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx index a5078465fc6f..e4a31bdf4f6d 100644 --- a/superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx +++ b/superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx @@ -20,54 +20,51 @@ import React, { useEffect, useMemo, useState } from 'react'; import { SupersetClient, t } from '@superset-ui/core'; import { filter } from 'lodash'; import { useFavoriteStatus, useListViewResource } from 'src/views/CRUD/hooks'; -import { - Dashboard, - DashboardTableProps, - TableTabTypes, -} from 'src/views/CRUD/types'; +import { Dashboard, DashboardTableProps, TableTab } from 'src/views/CRUD/types'; import handleResourceExport from 'src/utils/export'; import { useHistory } from 'react-router-dom'; import { getItem, - setItem, LocalStorageKeys, + setItem, } from 'src/utils/localStorageHelpers'; import { LoadingCards } from 'src/views/CRUD/welcome/Welcome'; import { CardContainer, createErrorHandler, + getFilterValues, PAGE_SIZE, + handleDashboardDelete, } from 'src/views/CRUD/utils'; import withToasts from 'src/components/MessageToasts/withToasts'; import Loading from 'src/components/Loading'; +import DeleteModal from 'src/components/DeleteModal'; import PropertiesModal from 'src/dashboard/components/PropertiesModal'; import DashboardCard from 'src/views/CRUD/dashboard/DashboardCard'; import SubMenu from 'src/views/components/SubMenu'; import EmptyState from './EmptyState'; import { WelcomeTable } from './types'; -export interface FilterValue { - col: string; - operator: string; - value: string | boolean | number | null | undefined; -} - function DashboardTable({ user, addDangerToast, addSuccessToast, mine, showThumbnails, - examples, + otherTabData, + otherTabFilters, + otherTabTitle, }: DashboardTableProps) { const history = useHistory(); - const filterStore = getItem( + const defaultTab = getItem( LocalStorageKeys.homepage_dashboard_filter, - TableTabTypes.EXAMPLES, + TableTab.Other, ); - const defaultFilter = filterStore; - const filteredExamples = filter(examples, obj => !('viz_type' in obj)); + const filteredOtherTabData = filter( + otherTabData, + obj => !('viz_type' in obj), + ); const { state: { loading, resourceCollection: dashboards }, @@ -80,7 +77,7 @@ function DashboardTable({ t('dashboard'), addDangerToast, true, - defaultFilter === 'Mine' ? mine : filteredExamples, + defaultTab === TableTab.Mine ? mine : filteredOtherTabData, [], false, ); @@ -92,35 +89,14 @@ function DashboardTable({ ); const [editModal, setEditModal] = useState<Dashboard>(); - const [dashboardFilter, setDashboardFilter] = useState(defaultFilter); + const [activeTab, setActiveTab] = useState(defaultTab); const [preparingExport, setPreparingExport] = useState<boolean>(false); const [loaded, setLoaded] = useState<boolean>(false); + const [dashboardToDelete, setDashboardToDelete] = useState<Dashboard | null>( + null, + ); - const getFilters = (filterName: string) => { - const filters = []; - if (filterName === 'Mine') { - filters.push({ - id: 'owners', - operator: 'rel_m_m', - value: `${user?.userId}`, - }); - } else if (filterName === 'Favorite') { - filters.push({ - id: 'id', - operator: 'dashboard_is_favorite', - value: true, - }); - } else if (filterName === 'Examples') { - filters.push({ - id: 'created_by', - operator: 'rel_o_m', - value: 0, - }); - } - return filters; - }; - - const getData = (filter: string) => + const getData = (tab: TableTab) => fetchData({ pageIndex: 0, pageSize: PAGE_SIZE, @@ -130,15 +106,20 @@ function DashboardTable({ desc: true, }, ], - filters: getFilters(filter), + filters: getFilterValues( + tab, + WelcomeTable.Dashboards, + user, + otherTabFilters, + ), }); useEffect(() => { - if (loaded || dashboardFilter === 'Favorite') { - getData(dashboardFilter); + if (loaded || activeTab === TableTab.Favorite) { + getData(activeTab); } setLoaded(true); - }, [dashboardFilter]); + }, [activeTab]); const handleBulkDashboardExport = (dashboardsToExport: Dashboard[]) => { const ids = dashboardsToExport.map(({ id }) => id); @@ -171,36 +152,30 @@ function DashboardTable({ const menuTabs = [ { - name: 'Favorite', + name: TableTab.Favorite, label: t('Favorite'), onClick: () => { - setDashboardFilter(TableTabTypes.FAVORITE); - setItem( - LocalStorageKeys.homepage_dashboard_filter, - TableTabTypes.FAVORITE, - ); + setActiveTab(TableTab.Favorite); + setItem(LocalStorageKeys.homepage_dashboard_filter, TableTab.Favorite); }, }, { - name: 'Mine', + name: TableTab.Mine, label: t('Mine'), onClick: () => { - setDashboardFilter(TableTabTypes.MINE); - setItem(LocalStorageKeys.homepage_dashboard_filter, TableTabTypes.MINE); + setActiveTab(TableTab.Mine); + setItem(LocalStorageKeys.homepage_dashboard_filter, TableTab.Mine); }, }, ]; - if (examples) { + if (otherTabData) { menuTabs.push({ - name: 'Examples', - label: t('Examples'), + name: TableTab.Other, + label: otherTabTitle, onClick: () => { - setDashboardFilter(TableTabTypes.EXAMPLES); - setItem( - LocalStorageKeys.homepage_dashboard_filter, - TableTabTypes.EXAMPLES, - ); + setActiveTab(TableTab.Other); + setItem(LocalStorageKeys.homepage_dashboard_filter, TableTab.Other); }, }); } @@ -209,7 +184,7 @@ function DashboardTable({ return ( <> <SubMenu - activeChild={dashboardFilter} + activeChild={activeTab} tabs={menuTabs} buttons={[ { @@ -229,7 +204,7 @@ function DashboardTable({ buttonStyle: 'link', onClick: () => { const target = - dashboardFilter === 'Favorite' + activeTab === TableTab.Favorite ? `/dashboard/list/?filters=(favorite:(label:${t( 'Yes', )},value:!t))` @@ -247,6 +222,30 @@ function DashboardTable({ onSubmit={handleDashboardEdit} /> )} + {dashboardToDelete && ( + <DeleteModal + description={ + <> + {t('Are you sure you want to delete')}{' '} + <b>{dashboardToDelete.dashboard_title}</b>? + </> + } + onConfirm={() => { + handleDashboardDelete( + dashboardToDelete, + refreshData, + addSuccessToast, + addDangerToast, + activeTab, + user?.userId, + ); + setDashboardToDelete(null); + }} + onHide={() => setDashboardToDelete(null)} + open={!!dashboardToDelete} + title={t('Please confirm')} + /> + )} {dashboards.length > 0 && ( <CardContainer showThumbnails={showThumbnails}> {dashboards.map(e => ( @@ -256,10 +255,6 @@ function DashboardTable({ hasPerm={hasPerm} bulkSelectEnabled={false} showThumbnails={showThumbnails} - dashboardFilter={dashboardFilter} - refreshData={refreshData} - addDangerToast={addDangerToast} - addSuccessToast={addSuccessToast} userId={user?.userId} loading={loading} openDashboardEditModal={(dashboard: Dashboard) => @@ -268,12 +263,13 @@ function DashboardTable({ saveFavoriteStatus={saveFavoriteStatus} favoriteStatus={favoriteStatus[e.id]} handleBulkDashboardExport={handleBulkDashboardExport} + onDelete={dashboard => setDashboardToDelete(dashboard)} /> ))} </CardContainer> )} {dashboards.length === 0 && ( - <EmptyState tableName={WelcomeTable.Dashboards} tab={dashboardFilter} /> + <EmptyState tableName={WelcomeTable.Dashboards} tab={activeTab} /> )} {preparingExport && <Loading />} </> diff --git a/superset-frontend/src/views/CRUD/welcome/EmptyState.test.tsx b/superset-frontend/src/views/CRUD/welcome/EmptyState.test.tsx index 908ebed6c4f8..fb8ae48ee16b 100644 --- a/superset-frontend/src/views/CRUD/welcome/EmptyState.test.tsx +++ b/superset-frontend/src/views/CRUD/welcome/EmptyState.test.tsx @@ -18,47 +18,48 @@ */ import React from 'react'; import { styledMount as mount } from 'spec/helpers/theming'; -import EmptyState from 'src/views/CRUD/welcome/EmptyState'; +import { TableTab } from 'src/views/CRUD/types'; +import EmptyState, { EmptyStateProps } from 'src/views/CRUD/welcome/EmptyState'; import { WelcomeTable } from './types'; describe('EmptyState', () => { - const variants = [ + const variants: EmptyStateProps[] = [ { - tab: 'Favorite', + tab: TableTab.Favorite, tableName: WelcomeTable.Dashboards, }, { - tab: 'Mine', + tab: TableTab.Mine, tableName: WelcomeTable.Dashboards, }, { - tab: 'Favorite', + tab: TableTab.Favorite, tableName: WelcomeTable.Charts, }, { - tab: 'Mine', + tab: TableTab.Mine, tableName: WelcomeTable.Charts, }, { - tab: 'Favorite', + tab: TableTab.Favorite, tableName: WelcomeTable.SavedQueries, }, { - tab: 'Mine', + tab: TableTab.Mine, tableName: WelcomeTable.SavedQueries, }, ]; - const recents = [ + const recents: EmptyStateProps[] = [ { - tab: 'Viewed', + tab: TableTab.Viewed, tableName: WelcomeTable.Recents, }, { - tab: 'Edited', + tab: TableTab.Edited, tableName: WelcomeTable.Recents, }, { - tab: 'Created', + tab: TableTab.Created, tableName: WelcomeTable.Recents, }, ]; @@ -68,10 +69,10 @@ describe('EmptyState', () => { expect(wrapper).toExist(); const textContainer = wrapper.find('.ant-empty-description'); expect(textContainer.text()).toEqual( - variant.tab === 'Favorite' + variant.tab === TableTab.Favorite ? "You don't have any favorites yet!" : `No ${ - variant.tableName === 'SAVED_QUERIES' + variant.tableName === WelcomeTable.SavedQueries ? 'saved queries' : variant.tableName.toLowerCase() } yet`, @@ -80,13 +81,13 @@ describe('EmptyState', () => { }); }); recents.forEach(recent => { - it(`it renders an ${recent.tab} ${recent.tableName} empty state`, () => { + it(`it renders a ${recent.tab} ${recent.tableName} empty state`, () => { const wrapper = mount(<EmptyState {...recent} />); expect(wrapper).toExist(); const textContainer = wrapper.find('.ant-empty-description'); expect(wrapper.find('.ant-empty-image').children()).toHaveLength(1); expect(textContainer.text()).toContain( - `Recently ${recent.tab.toLowerCase()} charts, dashboards, and saved queries will appear here`, + `Recently ${recent.tab?.toLowerCase()} charts, dashboards, and saved queries will appear here`, ); }); }); diff --git a/superset-frontend/src/views/CRUD/welcome/EmptyState.tsx b/superset-frontend/src/views/CRUD/welcome/EmptyState.tsx index 525c9ef62e80..47e7817ae374 100644 --- a/superset-frontend/src/views/CRUD/welcome/EmptyState.tsx +++ b/superset-frontend/src/views/CRUD/welcome/EmptyState.tsx @@ -19,7 +19,8 @@ import React from 'react'; import Button from 'src/components/Button'; import { Empty } from 'src/components'; -import { t, styled } from '@superset-ui/core'; +import { TableTab } from 'src/views/CRUD/types'; +import { styled, t } from '@superset-ui/core'; import { WelcomeTable } from './types'; const welcomeTableLabels: Record<WelcomeTable, string> = { @@ -29,9 +30,29 @@ const welcomeTableLabels: Record<WelcomeTable, string> = { [WelcomeTable.SavedQueries]: t('saved queries'), }; -interface EmptyStateProps { +const welcomeTableEmpty: Record<WelcomeTable, string> = { + [WelcomeTable.Charts]: t('No charts yet'), + [WelcomeTable.Dashboards]: t('No dashboards yet'), + [WelcomeTable.Recents]: t('No recents yet'), + [WelcomeTable.SavedQueries]: t('No saved queries yet'), +}; + +const welcomeTableWillAppear: Record<WelcomeTable, (other: string) => string> = + { + [WelcomeTable.Charts]: (other: string) => + t('%(other)s charts will appear here', { other }), + [WelcomeTable.Dashboards]: (other: string) => + t('%(other)s dashboards will appear here', { other }), + [WelcomeTable.Recents]: (other: string) => + t('%(other)s recents will appear here', { other }), + [WelcomeTable.SavedQueries]: (other: string) => + t('%(other)s saved queries will appear here', { other }), + }; + +export interface EmptyStateProps { tableName: WelcomeTable; tab?: string; + otherTabTitle?: string; } const EmptyContainer = styled.div` min-height: 200px; @@ -52,7 +73,11 @@ type Redirects = Record< string >; -export default function EmptyState({ tableName, tab }: EmptyStateProps) { +export default function EmptyState({ + tableName, + tab, + otherTabTitle, +}: EmptyStateProps) { const mineRedirects: Redirects = { [WelcomeTable.Charts]: '/chart/add', [WelcomeTable.Dashboards]: '/dashboard/new', @@ -69,30 +94,25 @@ export default function EmptyState({ tableName, tab }: EmptyStateProps) { [WelcomeTable.Recents]: 'union.svg', [WelcomeTable.SavedQueries]: 'empty-queries.svg', }; - const mine = ( - <span> - {t('No %(tableName)s yet', { tableName: welcomeTableLabels[tableName] })} - </span> - ); + const mine = <span>{welcomeTableEmpty[tableName]}</span>; const recent = ( <span className="no-recents"> {(() => { - if (tab === 'Viewed') { + if (tab === TableTab.Viewed) { return t( `Recently viewed charts, dashboards, and saved queries will appear here`, ); } - if (tab === 'Created') { + if (tab === TableTab.Created) { return t( 'Recently created charts, dashboards, and saved queries will appear here', ); } - if (tab === 'Examples') { - return t('Example %(tableName)s will appear here', { - tableName: tableName.toLowerCase(), - }); + if (tab === TableTab.Other) { + const other = otherTabTitle || t('Other'); + return welcomeTableWillAppear[tableName](other); } - if (tab === 'Edited') { + if (tab === TableTab.Edited) { return t( `Recently edited charts, dashboards, and saved queries will appear here`, ); @@ -101,17 +121,24 @@ export default function EmptyState({ tableName, tab }: EmptyStateProps) { })()} </span> ); + // Mine and Recent Activity(all tabs) tab empty state - if (tab === 'Mine' || tableName === 'RECENTS' || tab === 'Examples') { + if ( + tab === TableTab.Mine || + tableName === WelcomeTable.Recents || + tab === TableTab.Other + ) { return ( <EmptyContainer> <Empty image={`/static/assets/images/${tableIcon[tableName]}`} description={ - tableName === 'RECENTS' || tab === 'Examples' ? recent : mine + tableName === WelcomeTable.Recents || tab === TableTab.Other + ? recent + : mine } > - {tableName !== 'RECENTS' && ( + {tableName !== WelcomeTable.Recents && ( <ButtonContainer> <Button buttonStyle="primary" @@ -120,7 +147,7 @@ export default function EmptyState({ tableName, tab }: EmptyStateProps) { }} > <i className="fa fa-plus" /> - {tableName === 'SAVED_QUERIES' + {tableName === WelcomeTable.SavedQueries ? t('SQL query') : tableName .split('') @@ -152,7 +179,7 @@ export default function EmptyState({ tableName, tab }: EmptyStateProps) { > {t('See all %(tableName)s', { tableName: - tableName === 'SAVED_QUERIES' + tableName === WelcomeTable.SavedQueries ? t('SQL Lab queries') : welcomeTableLabels[tableName], })} diff --git a/superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx b/superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx index b267bed8c262..4e323e633f22 100644 --- a/superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx +++ b/superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx @@ -22,6 +22,7 @@ import SyntaxHighlighter from 'react-syntax-highlighter/dist/cjs/light'; import sql from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql'; import github from 'react-syntax-highlighter/dist/cjs/styles/hljs/github'; import { LoadingCards } from 'src/views/CRUD/welcome/Welcome'; +import { TableTab } from 'src/views/CRUD/types'; import withToasts from 'src/components/MessageToasts/withToasts'; import { AntdDropdown } from 'src/components'; import { Menu } from 'src/components/Menu'; @@ -30,10 +31,12 @@ import ListViewCard from 'src/components/ListViewCard'; import DeleteModal from 'src/components/DeleteModal'; import Icons from 'src/components/Icons'; import SubMenu from 'src/views/components/SubMenu'; +import { User } from 'src/types/bootstrapTypes'; import EmptyState from './EmptyState'; import { CardContainer, createErrorHandler, + getFilterValues, PAGE_SIZE, shortenSQL, } from '../utils'; @@ -56,9 +59,7 @@ interface Query { } interface SavedQueriesProps { - user: { - userId: string | number; - }; + user: User; queryFilter: string; addDangerToast: (arg0: string) => void; addSuccessToast: (arg0: string) => void; @@ -134,7 +135,7 @@ const SavedQueries = ({ [], false, ); - const [queryFilter, setQueryFilter] = useState('Mine'); + const [activeTab, setActiveTab] = useState(TableTab.Mine); const [queryDeleteModal, setQueryDeleteModal] = useState(false); const [currentlyEdited, setCurrentlyEdited] = useState<Query>({}); const [ifMine, setMine] = useState(true); @@ -149,13 +150,11 @@ const SavedQueries = ({ }).then( () => { const queryParams = { - filters: [ - { - id: 'created_by', - operator: 'rel_o_m', - value: `${user?.userId}`, - }, - ], + filters: getFilterValues( + TableTab.Created, + WelcomeTable.SavedQueries, + user, + ), pageSize: PAGE_SIZE, sortBy: [ { @@ -178,25 +177,7 @@ const SavedQueries = ({ ); }; - const getFilters = (filterName: string) => { - const filters = []; - if (filterName === 'Mine') { - filters.push({ - id: 'created_by', - operator: 'rel_o_m', - value: `${user?.userId}`, - }); - } else { - filters.push({ - id: 'id', - operator: 'saved_query_is_fav', - value: true, - }); - } - return filters; - }; - - const getData = (filter: string) => + const getData = (tab: TableTab) => fetchData({ pageIndex: 0, pageSize: PAGE_SIZE, @@ -206,7 +187,7 @@ const SavedQueries = ({ desc: true, }, ], - filters: getFilters(filter), + filters: getFilterValues(tab, WelcomeTable.SavedQueries, user), }); const renderMenu = (query: Query) => ( @@ -263,21 +244,13 @@ const SavedQueries = ({ /> )} <SubMenu - activeChild={queryFilter} + activeChild={activeTab} tabs={[ - /* @TODO uncomment when fav functionality is implemented - { - name: 'Favorite', - label: t('Favorite'), - onClick: () => { - getData('Favorite').then(() => setQueryFilter('Favorite')); - }, - }, - */ { - name: 'Mine', + name: TableTab.Mine, label: t('Mine'), - onClick: () => getData('Mine').then(() => setQueryFilter('Mine')), + onClick: () => + getData(TableTab.Mine).then(() => setActiveTab(TableTab.Mine)), }, ]} buttons={[ @@ -366,7 +339,7 @@ const SavedQueries = ({ ))} </CardContainer> ) : ( - <EmptyState tableName={WelcomeTable.SavedQueries} tab={queryFilter} /> + <EmptyState tableName={WelcomeTable.SavedQueries} tab={activeTab} /> )} </> ); diff --git a/superset-frontend/src/views/CRUD/welcome/Welcome.test.tsx b/superset-frontend/src/views/CRUD/welcome/Welcome.test.tsx index 85c953017ba1..dffe5acdd0a8 100644 --- a/superset-frontend/src/views/CRUD/welcome/Welcome.test.tsx +++ b/superset-frontend/src/views/CRUD/welcome/Welcome.test.tsx @@ -27,6 +27,9 @@ import * as featureFlags from 'src/featureFlags'; import Welcome from 'src/views/CRUD/welcome/Welcome'; import { ReactWrapper } from 'enzyme'; import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint'; +import { render, screen } from 'spec/helpers/testing-library'; +import { getExtensionsRegistry } from '@superset-ui/core'; +import setupExtensions from 'src/setup/setupExtensions'; const mockStore = configureStore([thunk]); const store = mockStore({}); @@ -40,7 +43,7 @@ const dashboardFavoriteStatusEndpoint = 'glob:*/api/v1/dashboard/favorite_status?*'; const savedQueryEndpoint = 'glob:*/api/v1/saved_query/?*'; const savedQueryInfoEndpoint = 'glob:*/api/v1/saved_query/_info?*'; -const recentActivityEndpoint = 'glob:*/superset/recent_activity/*'; +const recentActivityEndpoint = 'glob:*/api/v1/log/recent_activity/*'; fetchMock.get(chartsEndpoint, { result: [ @@ -103,10 +106,15 @@ const mockedProps = { userId: 5, email: 'alpha@alpha.com', isActive: true, + isAnonymous: false, + permissions: {}, + roles: { + sql_lab: [], + }, }, }; -describe('Welcome', () => { +describe('Welcome with sql role', () => { let wrapper: ReactWrapper; beforeAll(async () => { @@ -119,6 +127,10 @@ describe('Welcome', () => { }); }); + afterAll(() => { + fetchMock.resetHistory(); + }); + it('renders', () => { expect(wrapper).toExist(); }); @@ -130,7 +142,7 @@ describe('Welcome', () => { it('calls api methods in parallel on page load', () => { const chartCall = fetchMock.calls(/chart\/\?q/); const savedQueryCall = fetchMock.calls(/saved_query\/\?q/); - const recentCall = fetchMock.calls(/superset\/recent_activity\/*/); + const recentCall = fetchMock.calls(/api\/v1\/log\/recent_activity\/*/); const dashboardCall = fetchMock.calls(/dashboard\/\?q/); expect(chartCall).toHaveLength(2); expect(recentCall).toHaveLength(1); @@ -139,6 +151,50 @@ describe('Welcome', () => { }); }); +describe('Welcome without sql role', () => { + let wrapper: ReactWrapper; + + beforeAll(async () => { + await act(async () => { + const props = { + ...mockedProps, + user: { + ...mockedProps.user, + roles: {}, + }, + }; + wrapper = mount( + <Provider store={store}> + <Welcome {...props} /> + </Provider>, + ); + }); + }); + + afterAll(() => { + fetchMock.resetHistory(); + }); + + it('renders', () => { + expect(wrapper).toExist(); + }); + + it('renders all panels on the page on page load', () => { + expect(wrapper.find('CollapsePanel')).toHaveLength(6); + }); + + it('calls api methods in parallel on page load', () => { + const chartCall = fetchMock.calls(/chart\/\?q/); + const savedQueryCall = fetchMock.calls(/saved_query\/\?q/); + const recentCall = fetchMock.calls(/api\/v1\/log\/recent_activity\/*/); + const dashboardCall = fetchMock.calls(/dashboard\/\?q/); + expect(chartCall).toHaveLength(2); + expect(recentCall).toHaveLength(1); + expect(savedQueryCall).toHaveLength(0); + expect(dashboardCall).toHaveLength(2); + }); +}); + async function mountAndWait(props = mockedProps) { const wrapper = mount( <Provider store={store}> @@ -179,3 +235,23 @@ describe('Welcome page with toggle switch', () => { expect(wrapper.find('ImageLoader')).not.toExist(); }); }); + +test('should render an extension component if one is supplied', () => { + const extensionsRegistry = getExtensionsRegistry(); + + extensionsRegistry.set('welcome.banner', () => ( + <>welcome.banner extension component</> + )); + + setupExtensions(); + + render( + <Provider store={store}> + <Welcome {...mockedProps} /> + </Provider>, + ); + + expect( + screen.getByText('welcome.banner extension component'), + ).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/views/CRUD/welcome/Welcome.tsx b/superset-frontend/src/views/CRUD/welcome/Welcome.tsx index 3660b8acc8e0..9da45615fbfc 100644 --- a/superset-frontend/src/views/CRUD/welcome/Welcome.tsx +++ b/superset-frontend/src/views/CRUD/welcome/Welcome.tsx @@ -16,8 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -import React, { useEffect, useState } from 'react'; -import { styled, t } from '@superset-ui/core'; +import React, { useEffect, useMemo, useState } from 'react'; +import { + getExtensionsRegistry, + JsonObject, + styled, + t, +} from '@superset-ui/core'; +import rison from 'rison'; import Collapse from 'src/components/Collapse'; import { User } from 'src/types/bootstrapTypes'; import { reject } from 'lodash'; @@ -32,7 +38,7 @@ import ListViewCard from 'src/components/ListViewCard'; import withToasts from 'src/components/MessageToasts/withToasts'; import { createErrorHandler, - getRecentAcitivtyObjs, + getRecentActivityObjs, mq, CardContainer, getUserOwnedObjects, @@ -40,22 +46,27 @@ import { } from 'src/views/CRUD/utils'; import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags'; import { AntdSwitch } from 'src/components'; - +import getBootstrapData from 'src/utils/getBootstrapData'; +import { TableTab } from 'src/views/CRUD/types'; +import { canUserAccessSqlLab } from 'src/dashboard/util/permissionUtils'; +import { WelcomePageLastTab } from './types'; import ActivityTable from './ActivityTable'; import ChartTable from './ChartTable'; import SavedQueries from './SavedQueries'; import DashboardTable from './DashboardTable'; +const extensionsRegistry = getExtensionsRegistry(); + interface WelcomeProps { user: User; addDangerToast: (arg0: string) => void; } export interface ActivityData { - Created?: Array<object>; - Edited?: Array<object>; - Viewed?: Array<object>; - Examples?: Array<object>; + [TableTab.Created]?: JsonObject[]; + [TableTab.Edited]?: JsonObject[]; + [TableTab.Viewed]?: JsonObject[]; + [TableTab.Other]?: JsonObject[]; } interface LoadingProps { @@ -136,6 +147,8 @@ const WelcomeNav = styled.div` `} `; +const bootstrapData = getBootstrapData(); + export const LoadingCards = ({ cover }: LoadingProps) => ( <CardContainer showThumbnails={cover} className="loading-cards"> {[...new Array(loadingCardCount)].map((_, index) => ( @@ -150,9 +163,11 @@ export const LoadingCards = ({ cover }: LoadingProps) => ( ); function Welcome({ user, addDangerToast }: WelcomeProps) { + const canAccessSqlLab = canUserAccessSqlLab(user); const userid = user.userId; const id = userid!.toString(); // confident that user is not a guest user - const recent = `/superset/recent_activity/${user.userId}/?limit=6`; + const params = rison.encode({ page_size: 6 }); + const recent = `/api/v1/log/recent_activity/${user.userId}/?q=${params}`; const [activeChild, setActiveChild] = useState('Loading'); const userKey = dangerouslyGetItemDoNotUse(id, null); let defaultChecked = false; @@ -167,7 +182,7 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { const [dashboardData, setDashboardData] = useState<Array<object> | null>( null, ); - const [loadedCount, setLoadedCount] = useState(0); + const [isFetchingActivityData, setIsFetchingActivityData] = useState(true); const collapseState = getItem(LocalStorageKeys.homepage_collapse_state, []); const [activeState, setActiveState] = useState<Array<string>>(collapseState); @@ -177,28 +192,64 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { setItem(LocalStorageKeys.homepage_collapse_state, state); }; + const WelcomeMessageExtension = extensionsRegistry.get('welcome.message'); + const WelcomeTopExtension = extensionsRegistry.get('welcome.banner'); + const WelcomeMainExtension = extensionsRegistry.get( + 'welcome.main.replacement', + ); + + const [otherTabTitle, otherTabFilters] = useMemo(() => { + const lastTab = bootstrapData.common?.conf + .WELCOME_PAGE_LAST_TAB as WelcomePageLastTab; + const [customTitle, customFilter] = Array.isArray(lastTab) + ? lastTab + : [undefined, undefined]; + if (customTitle && customFilter) { + return [t(customTitle), customFilter]; + } + if (lastTab === 'all') { + return [t('All'), []]; + } + return [ + t('Examples'), + [ + { + col: 'created_by', + opr: 'rel_o_m', + value: 0, + }, + ], + ]; + }, []); + useEffect(() => { + if (!otherTabFilters) { + return; + } const activeTab = getItem(LocalStorageKeys.homepage_activity_filter, null); setActiveState(collapseState.length > 0 ? collapseState : DEFAULT_TAB_ARR); - getRecentAcitivtyObjs(user.userId!, recent, addDangerToast) + getRecentActivityObjs(user.userId!, recent, addDangerToast, otherTabFilters) .then(res => { const data: ActivityData | null = {}; - data.Examples = res.examples; + data[TableTab.Other] = res.other; if (res.viewed) { const filtered = reject(res.viewed, ['item_url', null]).map(r => r); - data.Viewed = filtered; - if (!activeTab && data.Viewed) { - setActiveChild('Viewed'); - } else if (!activeTab && !data.Viewed) { - setActiveChild('Created'); - } else setActiveChild(activeTab || 'Created'); - } else if (!activeTab) setActiveChild('Created'); + data[TableTab.Viewed] = filtered; + if (!activeTab && data[TableTab.Viewed]) { + setActiveChild(TableTab.Viewed); + } else if (!activeTab && !data[TableTab.Viewed]) { + setActiveChild(TableTab.Created); + } else setActiveChild(activeTab || TableTab.Created); + } else if (!activeTab) setActiveChild(TableTab.Created); else setActiveChild(activeTab); setActivityData(activityData => ({ ...activityData, ...data })); }) .catch( createErrorHandler((errMsg: unknown) => { - setActivityData(activityData => ({ ...activityData, Viewed: [] })); + setActivityData(activityData => ({ + ...activityData, + [TableTab.Viewed]: [], + })); addDangerToast( t('There was an issue fetching your recent activity: %s', errMsg), ); @@ -213,41 +264,47 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { value: `${id}`, }, ]; - getUserOwnedObjects(id, 'dashboard') - .then(r => { - setDashboardData(r); - setLoadedCount(loadedCount => loadedCount + 1); - }) - .catch((err: unknown) => { - setDashboardData([]); - setLoadedCount(loadedCount => loadedCount + 1); - addDangerToast( - t('There was an issue fetching your dashboards: %s', err), - ); - }); - getUserOwnedObjects(id, 'chart') - .then(r => { - setChartData(r); - setLoadedCount(loadedCount => loadedCount + 1); - }) - .catch((err: unknown) => { - setChartData([]); - setLoadedCount(loadedCount => loadedCount + 1); - addDangerToast(t('There was an issue fetching your chart: %s', err)); - }); - getUserOwnedObjects(id, 'saved_query', ownSavedQueryFilters) - .then(r => { - setQueryData(r); - setLoadedCount(loadedCount => loadedCount + 1); - }) - .catch((err: unknown) => { - setQueryData([]); - setLoadedCount(loadedCount => loadedCount + 1); - addDangerToast( - t('There was an issues fetching your saved queries: %s', err), - ); - }); - }, []); + Promise.all([ + getUserOwnedObjects(id, 'dashboard') + .then(r => { + setDashboardData(r); + return Promise.resolve(); + }) + .catch((err: unknown) => { + setDashboardData([]); + addDangerToast( + t('There was an issue fetching your dashboards: %s', err), + ); + return Promise.resolve(); + }), + getUserOwnedObjects(id, 'chart') + .then(r => { + setChartData(r); + return Promise.resolve(); + }) + .catch((err: unknown) => { + setChartData([]); + addDangerToast(t('There was an issue fetching your chart: %s', err)); + return Promise.resolve(); + }), + canAccessSqlLab + ? getUserOwnedObjects(id, 'saved_query', ownSavedQueryFilters) + .then(r => { + setQueryData(r); + return Promise.resolve(); + }) + .catch((err: unknown) => { + setQueryData([]); + addDangerToast( + t('There was an issue fetching your saved queries: %s', err), + ); + return Promise.resolve(); + }) + : Promise.resolve(), + ]).then(() => { + setIsFetchingActivityData(false); + }); + }, [otherTabFilters]); const handleToggle = () => { setChecked(!checked); @@ -269,79 +326,98 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { }, [chartData, queryData, dashboardData]); useEffect(() => { - if (!collapseState && activityData?.Viewed?.length) { + if (!collapseState && activityData?.[TableTab.Viewed]?.length) { setActiveState(activeState => ['1', ...activeState]); } }, [activityData]); const isRecentActivityLoading = - !activityData?.Examples && !activityData?.Viewed; + !activityData?.[TableTab.Other] && !activityData?.[TableTab.Viewed]; + return ( <WelcomeContainer> - <WelcomeNav> - <h1 className="welcome-header">Home</h1> - {isFeatureEnabled(FeatureFlag.THUMBNAILS) ? ( - <div className="switch"> - <AntdSwitch checked={checked} onChange={handleToggle} /> - <span>Thumbnails</span> - </div> - ) : null} - </WelcomeNav> - <Collapse activeKey={activeState} onChange={handleCollapse} ghost bigger> - <Collapse.Panel header={t('Recents')} key="1"> - {activityData && - (activityData.Viewed || - activityData.Examples || - activityData.Created) && - activeChild !== 'Loading' ? ( - <ActivityTable - user={{ userId: user.userId! }} // user is definitely not a guest user on this page - activeChild={activeChild} - setActiveChild={setActiveChild} - activityData={activityData} - loadedCount={loadedCount} - /> - ) : ( - <LoadingCards /> - )} - </Collapse.Panel> - <Collapse.Panel header={t('Dashboards')} key="2"> - {!dashboardData || isRecentActivityLoading ? ( - <LoadingCards cover={checked} /> - ) : ( - <DashboardTable - user={user} - mine={dashboardData} - showThumbnails={checked} - examples={activityData?.Examples} - /> - )} - </Collapse.Panel> - <Collapse.Panel header={t('Charts')} key="3"> - {!chartData || isRecentActivityLoading ? ( - <LoadingCards cover={checked} /> - ) : ( - <ChartTable - showThumbnails={checked} - user={user} - mine={chartData} - examples={activityData?.Examples} - /> - )} - </Collapse.Panel> - <Collapse.Panel header={t('Saved queries')} key="4"> - {!queryData ? ( - <LoadingCards cover={checked} /> - ) : ( - <SavedQueries - showThumbnails={checked} - user={user} - mine={queryData} - featureFlag={isFeatureEnabled(FeatureFlag.THUMBNAILS)} - /> - )} - </Collapse.Panel> - </Collapse> + {WelcomeMessageExtension && <WelcomeMessageExtension />} + {WelcomeTopExtension && <WelcomeTopExtension />} + {WelcomeMainExtension && <WelcomeMainExtension />} + {(!WelcomeTopExtension || !WelcomeMainExtension) && ( + <> + <WelcomeNav> + <h1 className="welcome-header">{t('Home')}</h1> + {isFeatureEnabled(FeatureFlag.THUMBNAILS) ? ( + <div className="switch"> + <AntdSwitch checked={checked} onChange={handleToggle} /> + <span>{t('Thumbnails')}</span> + </div> + ) : null} + </WelcomeNav> + <Collapse + activeKey={activeState} + onChange={handleCollapse} + ghost + bigger + > + <Collapse.Panel header={t('Recents')} key="1"> + {activityData && + (activityData[TableTab.Viewed] || + activityData[TableTab.Other] || + activityData[TableTab.Created]) && + activeChild !== 'Loading' ? ( + <ActivityTable + user={{ userId: user.userId! }} // user is definitely not a guest user on this page + activeChild={activeChild} + setActiveChild={setActiveChild} + activityData={activityData} + isFetchingActivityData={isFetchingActivityData} + /> + ) : ( + <LoadingCards /> + )} + </Collapse.Panel> + <Collapse.Panel header={t('Dashboards')} key="2"> + {!dashboardData || isRecentActivityLoading ? ( + <LoadingCards cover={checked} /> + ) : ( + <DashboardTable + user={user} + mine={dashboardData} + showThumbnails={checked} + otherTabData={activityData?.[TableTab.Other]} + otherTabFilters={otherTabFilters} + otherTabTitle={otherTabTitle} + /> + )} + </Collapse.Panel> + <Collapse.Panel header={t('Charts')} key="3"> + {!chartData || isRecentActivityLoading ? ( + <LoadingCards cover={checked} /> + ) : ( + <ChartTable + showThumbnails={checked} + user={user} + mine={chartData} + otherTabData={activityData?.[TableTab.Other]} + otherTabFilters={otherTabFilters} + otherTabTitle={otherTabTitle} + /> + )} + </Collapse.Panel> + {canAccessSqlLab && ( + <Collapse.Panel header={t('Saved queries')} key="4"> + {!queryData ? ( + <LoadingCards cover={checked} /> + ) : ( + <SavedQueries + showThumbnails={checked} + user={user} + mine={queryData} + featureFlag={isFeatureEnabled(FeatureFlag.THUMBNAILS)} + /> + )} + </Collapse.Panel> + )} + </Collapse> + </> + )} </WelcomeContainer> ); } diff --git a/superset-frontend/src/views/CRUD/welcome/types.ts b/superset-frontend/src/views/CRUD/welcome/types.ts index 8e9d6d4c46eb..b6e34e8b5708 100644 --- a/superset-frontend/src/views/CRUD/welcome/types.ts +++ b/superset-frontend/src/views/CRUD/welcome/types.ts @@ -17,9 +17,13 @@ * under the License. */ +import { Filter } from '../types'; + export enum WelcomeTable { Charts = 'CHARTS', Dashboards = 'DASHBOARDS', Recents = 'RECENTS', SavedQueries = 'SAVED_QUERIES', } + +export type WelcomePageLastTab = 'examples' | 'all' | [string, Filter[]]; diff --git a/superset-frontend/src/views/QueryProvider.tsx b/superset-frontend/src/views/QueryProvider.tsx new file mode 100644 index 000000000000..9fef2022d4c3 --- /dev/null +++ b/superset-frontend/src/views/QueryProvider.tsx @@ -0,0 +1,43 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { QueryClient, QueryClientProvider } from 'react-query'; + +export const queryClient = new QueryClient({ + defaultOptions: { + queries: { + staleTime: Infinity, + retry: false, + retryOnMount: false, + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + }, + }, +}); + +type Props = { + children: React.ReactNode; +}; + +const Queryprovider: React.FC<Props> = ({ children }) => ( + <QueryClientProvider client={queryClient}>{children}</QueryClientProvider> +); + +export default Queryprovider; diff --git a/superset-frontend/src/views/RootContextProviders.tsx b/superset-frontend/src/views/RootContextProviders.tsx index f40f228bb8c1..795ea7c5ee25 100644 --- a/superset-frontend/src/views/RootContextProviders.tsx +++ b/superset-frontend/src/views/RootContextProviders.tsx @@ -19,37 +19,51 @@ import React from 'react'; import { Route } from 'react-router-dom'; -import { ThemeProvider } from '@superset-ui/core'; +import { getExtensionsRegistry, ThemeProvider } from '@superset-ui/core'; import { Provider as ReduxProvider } from 'react-redux'; import { QueryParamProvider } from 'use-query-params'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; - +import getBootstrapData from 'src/utils/getBootstrapData'; import { store } from './store'; import FlashProvider from '../components/FlashProvider'; -import { bootstrapData, theme } from '../preamble'; +import { theme } from '../preamble'; import { EmbeddedUiConfigProvider } from '../components/UiConfigContext'; import { DynamicPluginProvider } from '../components/DynamicPlugins'; -const common = { ...bootstrapData.common }; +const { common } = getBootstrapData(); + +const extensionsRegistry = getExtensionsRegistry(); + +export const RootContextProviders: React.FC = ({ children }) => { + const RootContextProviderExtension = extensionsRegistry.get( + 'root.context.provider', + ); -export const RootContextProviders: React.FC = ({ children }) => ( - <ThemeProvider theme={theme}> - <ReduxProvider store={store}> - <DndProvider backend={HTML5Backend}> - <FlashProvider messages={common.flash_messages}> - <EmbeddedUiConfigProvider> - <DynamicPluginProvider> - <QueryParamProvider - ReactRouterRoute={Route} - stringifyOptions={{ encode: false }} - > - {children} - </QueryParamProvider> - </DynamicPluginProvider> - </EmbeddedUiConfigProvider> - </FlashProvider> - </DndProvider> - </ReduxProvider> - </ThemeProvider> -); + return ( + <ThemeProvider theme={theme}> + <ReduxProvider store={store}> + <DndProvider backend={HTML5Backend}> + <FlashProvider messages={common.flash_messages}> + <EmbeddedUiConfigProvider> + <DynamicPluginProvider> + <QueryParamProvider + ReactRouterRoute={Route} + stringifyOptions={{ encode: false }} + > + {RootContextProviderExtension ? ( + <RootContextProviderExtension> + {children} + </RootContextProviderExtension> + ) : ( + children + )} + </QueryParamProvider> + </DynamicPluginProvider> + </EmbeddedUiConfigProvider> + </FlashProvider> + </DndProvider> + </ReduxProvider> + </ThemeProvider> + ); +}; diff --git a/superset-frontend/src/views/components/LanguagePicker.test.tsx b/superset-frontend/src/views/components/LanguagePicker.test.tsx index 230c89d18b48..a427c4e91ae0 100644 --- a/superset-frontend/src/views/components/LanguagePicker.test.tsx +++ b/superset-frontend/src/views/components/LanguagePicker.test.tsx @@ -38,22 +38,23 @@ const mockedProps = { }, }; -test('should render', () => { +test('should render', async () => { const { container } = render( <Menu> <LanguagePicker {...mockedProps} /> </Menu>, ); + expect(await screen.findByRole('button')).toBeInTheDocument(); expect(container).toBeInTheDocument(); }); -test('should render the language picker', () => { +test('should render the language picker', async () => { render( <Menu> <LanguagePicker {...mockedProps} /> </Menu>, ); - expect(screen.getByLabelText('Languages')).toBeInTheDocument(); + expect(await screen.findByLabelText('Languages')).toBeInTheDocument(); }); test('should render the items', async () => { diff --git a/superset-frontend/src/views/components/Menu.test.tsx b/superset-frontend/src/views/components/Menu.test.tsx index bcfc01c7704b..b40a5ab07525 100644 --- a/superset-frontend/src/views/components/Menu.test.tsx +++ b/superset-frontend/src/views/components/Menu.test.tsx @@ -20,7 +20,9 @@ import React from 'react'; import * as reactRedux from 'react-redux'; import fetchMock from 'fetch-mock'; import { render, screen } from 'spec/helpers/testing-library'; +import setupExtensions from 'src/setup/setupExtensions'; import userEvent from '@testing-library/user-event'; +import { getExtensionsRegistry } from '@superset-ui/core'; import { Menu } from './Menu'; const dropdownItems = [ @@ -250,48 +252,64 @@ beforeEach(() => { useSelectorMock.mockClear(); }); -test('should render', () => { +test('should render', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); const { container } = render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true, + useRouter: true, }); + expect(await screen.findByText(/sources/i)).toBeInTheDocument(); expect(container).toBeInTheDocument(); }); -test('should render the navigation', () => { +test('should render the navigation', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); - expect(screen.getByRole('navigation')).toBeInTheDocument(); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + expect(await screen.findByRole('navigation')).toBeInTheDocument(); }); -test('should render the brand', () => { +test('should render the brand', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); const { data: { brand: { alt, icon }, }, } = mockedProps; - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + expect(await screen.findByAltText(alt)).toBeInTheDocument(); const image = screen.getByAltText(alt); expect(image).toHaveAttribute('src', icon); }); -test('should render the environment tag', () => { +test('should render the environment tag', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); const { data: { environment_tag }, } = mockedProps; - render(<Menu {...mockedProps} />, { useRedux: true }); - expect(screen.getByText(environment_tag.text)).toBeInTheDocument(); + render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + expect(await screen.findByText(environment_tag.text)).toBeInTheDocument(); }); -test('should render all the top navbar menu items', () => { +test('should render all the top navbar menu items', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); const { data: { menu }, } = mockedProps; - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + expect(await screen.findByText(menu[0].label)).toBeInTheDocument(); menu.forEach(item => { expect(screen.getByText(item.label)).toBeInTheDocument(); }); @@ -302,7 +320,11 @@ test('should render the top navbar child menu items', async () => { const { data: { menu }, } = mockedProps; - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); const sources = screen.getByText('Sources'); userEvent.hover(sources); const datasets = await screen.findByText('Datasets'); @@ -316,7 +338,11 @@ test('should render the top navbar child menu items', async () => { test('should render the dropdown items', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); - render(<Menu {...notanonProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...notanonProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); const dropdown = screen.getByTestId('new-dropdown-icon'); userEvent.hover(dropdown); // todo (philip): test data submenu @@ -342,14 +368,22 @@ test('should render the dropdown items', async () => { test('should render the Settings', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); const settings = await screen.findByText('Settings'); expect(settings).toBeInTheDocument(); }); test('should render the Settings menu item', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); userEvent.hover(screen.getByText('Settings')); const label = await screen.findByText('Security'); expect(label).toBeInTheDocument(); @@ -360,21 +394,34 @@ test('should render the Settings dropdown child menu items', async () => { const { data: { settings }, } = mockedProps; - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); userEvent.hover(screen.getByText('Settings')); const listUsers = await screen.findByText('List Users'); expect(listUsers).toHaveAttribute('href', settings[0].childs[0].url); }); -test('should render the plus menu (+) when user is not anonymous', () => { +test('should render the plus menu (+) when user is not anonymous', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); - render(<Menu {...notanonProps} />, { useRedux: true, useQueryParams: true }); - expect(screen.getByTestId('new-dropdown')).toBeInTheDocument(); + render(<Menu {...notanonProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + expect(await screen.findByTestId('new-dropdown')).toBeInTheDocument(); }); -test('should NOT render the plus menu (+) when user is anonymous', () => { +test('should NOT render the plus menu (+) when user is anonymous', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + expect(await screen.findByText(/sources/i)).toBeInTheDocument(); expect(screen.queryByTestId('new-dropdown')).not.toBeInTheDocument(); }); @@ -386,7 +433,11 @@ test('should render the user actions when user is not anonymous', async () => { }, } = mockedProps; - render(<Menu {...notanonProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...notanonProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); userEvent.hover(screen.getByText('Settings')); const user = await screen.findByText('User'); expect(user).toBeInTheDocument(); @@ -398,9 +449,14 @@ test('should render the user actions when user is not anonymous', async () => { expect(logout).toHaveAttribute('href', user_logout_url); }); -test('should NOT render the user actions when user is anonymous', () => { +test('should NOT render the user actions when user is anonymous', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + expect(await screen.findByText(/sources/i)).toBeInTheDocument(); expect(screen.queryByText('User')).not.toBeInTheDocument(); }); @@ -412,7 +468,11 @@ test('should render the Profile link when available', async () => { }, } = mockedProps; - render(<Menu {...notanonProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...notanonProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); userEvent.hover(screen.getByText('Settings')); const profile = await screen.findByText('Profile'); @@ -427,7 +487,11 @@ test('should render the About section and version_string, sha or build_number wh }, } = mockedProps; - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); userEvent.hover(screen.getByText('Settings')); const about = await screen.findByText('About'); const version = await screen.findByText(`Version: ${version_string}`); @@ -446,7 +510,11 @@ test('should render the Documentation link when available', async () => { navbar_right: { documentation_url }, }, } = mockedProps; - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); userEvent.hover(screen.getByText('Settings')); const doc = await screen.findByTitle('Documentation'); expect(doc).toHaveAttribute('href', documentation_url); @@ -460,12 +528,16 @@ test('should render the Bug Report link when available', async () => { }, } = mockedProps; - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); const bugReport = await screen.findByTitle('Report a bug'); expect(bugReport).toHaveAttribute('href', bug_report_url); }); -test('should render the Login link when user is anonymous', () => { +test('should render the Login link when user is anonymous', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); const { data: { @@ -473,25 +545,59 @@ test('should render the Login link when user is anonymous', () => { }, } = mockedProps; - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); - const login = screen.getByText('Login'); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + const login = await screen.findByText('Login'); expect(login).toHaveAttribute('href', user_login_url); }); -test('should render the Language Picker', () => { +test('should render the Language Picker', async () => { useSelectorMock.mockReturnValue({ roles: user.roles }); - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); - expect(screen.getByLabelText('Languages')).toBeInTheDocument(); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + expect(await screen.findByLabelText('Languages')).toBeInTheDocument(); }); -test('should hide create button without proper roles', () => { +test('should hide create button without proper roles', async () => { useSelectorMock.mockReturnValue({ roles: [] }); - render(<Menu {...mockedProps} />, { useRedux: true, useQueryParams: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + expect(await screen.findByText(/sources/i)).toBeInTheDocument(); expect(screen.queryByTestId('new-dropdown')).not.toBeInTheDocument(); }); -test('should render without QueryParamProvider', () => { +test('should render without QueryParamProvider', async () => { useSelectorMock.mockReturnValue({ roles: [] }); - render(<Menu {...mockedProps} />, { useRedux: true }); + render(<Menu {...mockedProps} />, { + useRedux: true, + useRouter: true, + useQueryParams: true, + }); + expect(await screen.findByText(/sources/i)).toBeInTheDocument(); expect(screen.queryByTestId('new-dropdown')).not.toBeInTheDocument(); }); + +test('should render an extension component if one is supplied', async () => { + const extensionsRegistry = getExtensionsRegistry(); + + extensionsRegistry.set('navbar.right', () => ( + <>navbar.right extension component</> + )); + + setupExtensions(); + + render(<Menu {...mockedProps} />, { useRouter: true, useQueryParams: true }); + + expect( + await screen.findByText('navbar.right extension component'), + ).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/views/components/Menu.tsx b/superset-frontend/src/views/components/Menu.tsx index 86502c5276e5..652ae63fd91c 100644 --- a/superset-frontend/src/views/components/Menu.tsx +++ b/superset-frontend/src/views/components/Menu.tsx @@ -25,72 +25,28 @@ import { Row, Col, Grid } from 'src/components'; import { MainNav as DropdownMenu, MenuMode } from 'src/components/Menu'; import { Tooltip } from 'src/components/Tooltip'; import { Link } from 'react-router-dom'; +import { GenericLink } from 'src/components/GenericLink/GenericLink'; import Icons from 'src/components/Icons'; import { useUiConfig } from 'src/components/UiConfigContext'; import { URL_PARAMS } from 'src/constants'; -import RightMenu from './MenuRight'; -import { Languages } from './LanguagePicker'; +import { + MenuObjectChildProps, + MenuObjectProps, + MenuData, +} from 'src/types/bootstrapTypes'; +import RightMenu from './RightMenu'; -interface BrandProps { - path: string; - icon: string; - alt: string; - tooltip: string; - text: string; -} - -export interface NavBarProps { - show_watermark: boolean; - bug_report_url?: string; - version_string?: string; - version_sha?: string; - build_number?: string; - documentation_url?: string; - languages: Languages; - show_language_picker: boolean; - user_is_anonymous: boolean; - user_info_url: string; - user_login_url: string; - user_logout_url: string; - user_profile_url: string | null; - locale: string; -} - -export interface MenuProps { - data: { - menu: MenuObjectProps[]; - brand: BrandProps; - navbar_right: NavBarProps; - settings: MenuObjectProps[]; - environment_tag: { - text: string; - color: string; - }; - }; +interface MenuProps { + data: MenuData; isFrontendRoute?: (path?: string) => boolean; } -export interface MenuObjectChildProps { - label: string; - name?: string; - icon?: string; - index?: number; - url?: string; - isFrontendRoute?: boolean; - perm?: string | boolean; - view?: string; - disable?: boolean; -} - -export interface MenuObjectProps extends MenuObjectChildProps { - childs?: (MenuObjectChildProps | string)[]; - isHeader?: boolean; -} - const StyledHeader = styled.header` ${({ theme }) => ` background-color: ${theme.colors.grayscale.light5}; margin-bottom: 2px; + z-index: 10; + &:nth-last-of-type(2) nav { margin-bottom: 2px; } @@ -106,7 +62,7 @@ const StyledHeader = styled.header` padding: ${theme.gridUnit}px ${theme.gridUnit * 2}px ${ theme.gridUnit }px ${theme.gridUnit * 4}px; - max-width: ${theme.gridUnit * 37}px; + max-width: ${theme.gridUnit * theme.brandIconMaxWidth}px; img { height: 100%; object-fit: contain; @@ -159,7 +115,7 @@ const StyledHeader = styled.header` .ant-menu > .ant-menu-item > a { padding: 0px; } - .main-nav .ant-menu-submenu-title > svg:nth-child(1) { + .main-nav .ant-menu-submenu-title > svg:nth-of-type(1) { display: none; } .ant-menu-item-active > a { @@ -292,9 +248,15 @@ export function Menu({ title={brand.tooltip} arrowPointAtCenter > - <a className="navbar-brand" href={brand.path}> - <img src={brand.icon} alt={brand.alt} /> - </a> + {isFrontendRoute(window.location.pathname) ? ( + <GenericLink className="navbar-brand" to={brand.path}> + <img src={brand.icon} alt={brand.alt} /> + </GenericLink> + ) : ( + <a className="navbar-brand" href={brand.path}> + <img src={brand.icon} alt={brand.alt} /> + </a> + )} </Tooltip> {brand.text && ( <div className="navbar-brand-text"> @@ -348,6 +310,7 @@ export default function MenuWrapper({ data, ...rest }: MenuProps) { }; // Menu items that should go into settings dropdown const settingsMenus = { + Data: true, Security: true, Manage: true, }; diff --git a/superset-frontend/src/views/components/RightMenu.test.tsx b/superset-frontend/src/views/components/RightMenu.test.tsx new file mode 100644 index 000000000000..907c305ff64c --- /dev/null +++ b/superset-frontend/src/views/components/RightMenu.test.tsx @@ -0,0 +1,354 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import * as reactRedux from 'react-redux'; +import fetchMock from 'fetch-mock'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import userEvent from '@testing-library/user-event'; +import RightMenu from './RightMenu'; +import { GlobalMenuDataOptions, RightMenuProps } from './types'; + +jest.mock('react-redux', () => ({ + ...jest.requireActual('react-redux'), + useSelector: jest.fn(), +})); + +jest.mock('src/views/CRUD/data/database/DatabaseModal', () => () => <span />); + +const dropdownItems = [ + { + label: 'Data', + icon: 'fa-database', + childs: [ + { + label: 'Connect database', + name: GlobalMenuDataOptions.DB_CONNECTION, + perm: true, + }, + { + label: 'Create dataset', + name: GlobalMenuDataOptions.DATASET_CREATION, + perm: true, + }, + { + label: 'Connect Google Sheet', + name: GlobalMenuDataOptions.GOOGLE_SHEETS, + perm: true, + }, + { + label: 'Upload CSV to database', + name: 'Upload a CSV', + url: '/csvtodatabaseview/form', + perm: true, + }, + { + label: 'Upload columnar file to database', + name: 'Upload a Columnar file', + url: '/columnartodatabaseview/form', + perm: true, + }, + { + label: 'Upload Excel file to database', + name: 'Upload Excel', + url: '/exceltodatabaseview/form', + perm: true, + }, + ], + }, + { + label: 'SQL query', + url: '/superset/sqllab?new=true', + icon: 'fa-fw fa-search', + perm: 'can_sqllab', + view: 'Superset', + }, + { + label: 'Chart', + url: '/chart/add', + icon: 'fa-fw fa-bar-chart', + perm: 'can_write', + view: 'Chart', + }, + { + label: 'Dashboard', + url: '/dashboard/new', + icon: 'fa-fw fa-dashboard', + perm: 'can_write', + view: 'Dashboard', + }, +]; + +const createProps = (): RightMenuProps => ({ + align: 'flex-end', + navbarRight: { + show_watermark: false, + bug_report_url: undefined, + documentation_url: undefined, + languages: { + en: { + flag: 'us', + name: 'English', + url: '/lang/en', + }, + it: { + flag: 'it', + name: 'Italian', + url: '/lang/it', + }, + }, + show_language_picker: false, + user_is_anonymous: false, + user_info_url: '/users/userinfo/', + user_logout_url: '/logout/', + user_login_url: '/login/', + user_profile_url: '/profile/', + locale: 'en', + version_string: '1.0.0', + version_sha: 'randomSHA', + build_number: 'randomBuildNumber', + }, + settings: [], + isFrontendRoute: () => true, + environmentTag: { + color: 'error.base', + text: 'Development2', + }, +}); + +const mockNonExamplesDB = [...new Array(2)].map((_, i) => ({ + changed_by: { + first_name: `user`, + last_name: `${i}`, + }, + database_name: `db ${i}`, + backend: 'postgresql', + allow_run_async: true, + allow_dml: false, + allow_file_upload: true, + expose_in_sqllab: false, + changed_on_delta_humanized: `${i} day(s) ago`, + changed_on: new Date().toISOString, + id: i, + engine_information: { + supports_file_upload: true, + }, +})); + +const useSelectorMock = jest.spyOn(reactRedux, 'useSelector'); + +beforeEach(async () => { + useSelectorMock.mockReset(); + fetchMock.get( + 'glob:*api/v1/database/?q=(filters:!((col:allow_file_upload,opr:upload_is_enabled,value:!t)))', + { result: [], count: 0 }, + ); + fetchMock.get( + 'glob:*api/v1/database/?q=(filters:!((col:database_name,opr:neq,value:examples)))', + { result: [], count: 0 }, + ); +}); + +afterEach(fetchMock.restore); + +const resetUseSelectorMock = () => { + useSelectorMock.mockReturnValueOnce({ + createdOn: '2021-04-27T18:12:38.952304', + email: 'admin', + firstName: 'admin', + isActive: true, + lastName: 'admin', + permissions: {}, + roles: { + Admin: [ + ['can_this_form_get', 'CsvToDatabaseView'], // So we can upload CSV + ['can_write', 'Database'], // So we can write DBs + ['can_write', 'Dataset'], // So we can write Datasets + ['can_write', 'Chart'], // So we can write Datasets + ], + }, + userId: 1, + username: 'admin', + }); + + // By default we get file extensions to be uploaded + useSelectorMock.mockReturnValueOnce('1'); + // By default we get file extensions to be uploaded + useSelectorMock.mockReturnValueOnce({ + CSV_EXTENSIONS: ['csv'], + EXCEL_EXTENSIONS: ['xls', 'xlsx'], + COLUMNAR_EXTENSIONS: ['parquet', 'zip'], + ALLOWED_EXTENSIONS: ['parquet', 'zip', 'xls', 'xlsx', 'csv'], + }); +}; + +test('renders', async () => { + const mockedProps = createProps(); + // Initial Load + resetUseSelectorMock(); + const { container } = render(<RightMenu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + }); + // expect(await screen.findByText(/Settings/i)).toBeInTheDocument(); + await waitFor(() => expect(container).toBeInTheDocument()); +}); + +test('If user has permission to upload files AND connect DBs we query existing DBs that has allow_file_upload as True and DBs that are not examples', async () => { + const mockedProps = createProps(); + // Initial Load + resetUseSelectorMock(); + const { container } = render(<RightMenu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + }); + await waitFor(() => expect(container).toBeVisible()); + const callsD = fetchMock.calls(/database\/\?q/); + expect(callsD).toHaveLength(2); + expect(callsD[0][0]).toMatchInlineSnapshot( + `"http://localhost/api/v1/database/?q=(filters:!((col:allow_file_upload,opr:upload_is_enabled,value:!t)))"`, + ); + expect(callsD[1][0]).toMatchInlineSnapshot( + `"http://localhost/api/v1/database/?q=(filters:!((col:database_name,opr:neq,value:examples)))"`, + ); +}); + +test('If only examples DB exist we must show the Connect Database option', async () => { + const mockedProps = createProps(); + fetchMock.get( + 'glob:*api/v1/database/?q=(filters:!((col:allow_file_upload,opr:upload_is_enabled,value:!t)))', + { result: [...mockNonExamplesDB], count: 2 }, + { overwriteRoutes: true }, + ); + fetchMock.get( + 'glob:*api/v1/database/?q=(filters:!((col:database_name,opr:neq,value:examples)))', + { result: [], count: 0 }, + { overwriteRoutes: true }, + ); + // Initial Load + resetUseSelectorMock(); + // setAllowUploads called + resetUseSelectorMock(); + render(<RightMenu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + const dropdown = screen.getByTestId('new-dropdown-icon'); + userEvent.hover(dropdown); + const dataMenu = await screen.findByText(dropdownItems[0].label); + userEvent.hover(dataMenu); + expect(await screen.findByText('Connect database')).toBeInTheDocument(); + expect(screen.queryByText('Create dataset')).not.toBeInTheDocument(); +}); + +test('If more than just examples DB exist we must show the Create dataset option', async () => { + const mockedProps = createProps(); + fetchMock.get( + 'glob:*api/v1/database/?q=(filters:!((col:allow_file_upload,opr:upload_is_enabled,value:!t)))', + { result: [...mockNonExamplesDB], count: 2 }, + { overwriteRoutes: true }, + ); + fetchMock.get( + 'glob:*api/v1/database/?q=(filters:!((col:database_name,opr:neq,value:examples)))', + { result: [...mockNonExamplesDB], count: 2 }, + { overwriteRoutes: true }, + ); + // Initial Load + resetUseSelectorMock(); + // setAllowUploads called + resetUseSelectorMock(); + // setNonExamplesDBConnected called + resetUseSelectorMock(); + render(<RightMenu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + const dropdown = screen.getByTestId('new-dropdown-icon'); + userEvent.hover(dropdown); + const dataMenu = await screen.findByText(dropdownItems[0].label); + userEvent.hover(dataMenu); + expect(await screen.findByText('Create dataset')).toBeInTheDocument(); + expect(screen.queryByText('Connect database')).not.toBeInTheDocument(); +}); + +test('If there is a DB with allow_file_upload set as True the option should be enabled', async () => { + const mockedProps = createProps(); + fetchMock.get( + 'glob:*api/v1/database/?q=(filters:!((col:allow_file_upload,opr:upload_is_enabled,value:!t)))', + { result: [...mockNonExamplesDB], count: 2 }, + { overwriteRoutes: true }, + ); + fetchMock.get( + 'glob:*api/v1/database/?q=(filters:!((col:database_name,opr:neq,value:examples)))', + { result: [...mockNonExamplesDB], count: 2 }, + { overwriteRoutes: true }, + ); + // Initial load + resetUseSelectorMock(); + // setAllowUploads called + resetUseSelectorMock(); + // setNonExamplesDBConnected called + resetUseSelectorMock(); + render(<RightMenu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + const dropdown = screen.getByTestId('new-dropdown-icon'); + userEvent.hover(dropdown); + const dataMenu = await screen.findByText(dropdownItems[0].label); + userEvent.hover(dataMenu); + expect( + (await screen.findByText('Upload CSV to database')).closest('a'), + ).toHaveAttribute('href', '/csvtodatabaseview/form'); +}); + +test('If there is NOT a DB with allow_file_upload set as True the option should be disabled', async () => { + const mockedProps = createProps(); + fetchMock.get( + 'glob:*api/v1/database/?q=(filters:!((col:allow_file_upload,opr:upload_is_enabled,value:!t)))', + { result: [], count: 0 }, + { overwriteRoutes: true }, + ); + fetchMock.get( + 'glob:*api/v1/database/?q=(filters:!((col:database_name,opr:neq,value:examples)))', + { result: [...mockNonExamplesDB], count: 2 }, + { overwriteRoutes: true }, + ); + // Initial load + resetUseSelectorMock(); + // setAllowUploads called + resetUseSelectorMock(); + // setNonExamplesDBConnected called + resetUseSelectorMock(); + render(<RightMenu {...mockedProps} />, { + useRedux: true, + useQueryParams: true, + useRouter: true, + }); + const dropdown = screen.getByTestId('new-dropdown-icon'); + userEvent.hover(dropdown); + const dataMenu = await screen.findByText(dropdownItems[0].label); + userEvent.hover(dataMenu); + expect(await screen.findByText('Upload CSV to database')).toBeInTheDocument(); + expect( + (await screen.findByText('Upload CSV to database')).closest('a'), + ).not.toBeInTheDocument(); +}); diff --git a/superset-frontend/src/views/components/MenuRight.tsx b/superset-frontend/src/views/components/RightMenu.tsx similarity index 65% rename from superset-frontend/src/views/components/MenuRight.tsx rename to superset-frontend/src/views/components/RightMenu.tsx index 179301e92694..e245096f43c2 100644 --- a/superset-frontend/src/views/components/MenuRight.tsx +++ b/superset-frontend/src/views/components/RightMenu.tsx @@ -21,6 +21,7 @@ import rison from 'rison'; import { useSelector } from 'react-redux'; import { Link } from 'react-router-dom'; import { useQueryParams, BooleanParam } from 'use-query-params'; +import { isEmpty } from 'lodash'; import { t, @@ -28,23 +29,31 @@ import { css, SupersetTheme, SupersetClient, + getExtensionsRegistry, + useTheme, } from '@superset-ui/core'; import { MainNav as Menu } from 'src/components/Menu'; import { Tooltip } from 'src/components/Tooltip'; import Icons from 'src/components/Icons'; -import findPermission, { isUserAdmin } from 'src/dashboard/util/findPermission'; -import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; +import Label from 'src/components/Label'; +import { findPermission } from 'src/utils/findPermission'; +import { isUserAdmin } from 'src/dashboard/util/permissionUtils'; +import { + MenuObjectProps, + UserWithPermissionsAndRoles, + MenuObjectChildProps, +} from 'src/types/bootstrapTypes'; import { RootState } from 'src/dashboard/types'; -import { Tag } from 'antd'; import LanguagePicker from './LanguagePicker'; import DatabaseModal from '../CRUD/data/database/DatabaseModal'; import { uploadUserPerms } from '../CRUD/utils'; import { - ExtentionConfigs, + ExtensionConfigs, GlobalMenuDataOptions, RightMenuProps, } from './types'; -import { MenuObjectProps } from './Menu'; + +const extensionsRegistry = getExtensionsRegistry(); const versionInfoStyles = (theme: SupersetTheme) => css` padding: ${theme.gridUnit * 1.5}px ${theme.gridUnit * 4}px @@ -77,11 +86,29 @@ const StyledDiv = styled.div<{ align: string }>` } `; +const StyledMenuItemWithIcon = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +`; + const StyledAnchor = styled.a` padding-right: ${({ theme }) => theme.gridUnit}px; padding-left: ${({ theme }) => theme.gridUnit}px; `; +const tagStyles = (theme: SupersetTheme) => css` + color: ${theme.colors.grayscale.light5}; +`; + +const styledChildMenu = (theme: SupersetTheme) => css` + &:hover { + color: ${theme.colors.primary.base} !important; + cursor: pointer !important; + } +`; + const { SubMenu } = Menu; const RightMenu = ({ @@ -92,7 +119,13 @@ const RightMenu = ({ environmentTag, setQuery, }: RightMenuProps & { - setQuery: ({ databaseAdded }: { databaseAdded: boolean }) => void; + setQuery: ({ + databaseAdded, + datasetAdded, + }: { + databaseAdded?: boolean; + datasetAdded?: boolean; + }) => void; }) => { const user = useSelector<any, UserWithPermissionsAndRoles>( state => state.user, @@ -100,21 +133,22 @@ const RightMenu = ({ const dashboardId = useSelector<RootState, number | undefined>( state => state.dashboardInfo?.id, ); - - const { roles } = user; + const userValues = user || {}; + const { roles } = userValues; const { CSV_EXTENSIONS, COLUMNAR_EXTENSIONS, EXCEL_EXTENSIONS, ALLOWED_EXTENSIONS, HAS_GSHEETS_INSTALLED, - } = useSelector<any, ExtentionConfigs>(state => state.common.conf); - const [showModal, setShowModal] = useState<boolean>(false); + } = useSelector<any, ExtensionConfigs>(state => state.common.conf); + const [showDatabaseModal, setShowDatabaseModal] = useState<boolean>(false); const [engine, setEngine] = useState<string>(''); const canSql = findPermission('can_sqllab', 'Superset', roles); const canDashboard = findPermission('can_write', 'Dashboard', roles); const canChart = findPermission('can_write', 'Chart', roles); const canDatabase = findPermission('can_write', 'Database', roles); + const canDataset = findPermission('can_write', 'Dataset', roles); const { canUploadData, canUploadCSV, canUploadColumnar, canUploadExcel } = uploadUserPerms( @@ -127,6 +161,8 @@ const RightMenu = ({ const showActionDropdown = canSql || canChart || canDashboard; const [allowUploads, setAllowUploads] = useState<boolean>(false); + const [nonExamplesDBConnected, setNonExamplesDBConnected] = + useState<boolean>(false); const isAdmin = isUserAdmin(user); const showUploads = allowUploads || isAdmin; const dropdownItems: MenuObjectProps[] = [ @@ -137,7 +173,13 @@ const RightMenu = ({ { label: t('Connect database'), name: GlobalMenuDataOptions.DB_CONNECTION, - perm: canDatabase, + perm: canDatabase && !nonExamplesDBConnected, + }, + { + label: t('Create dataset'), + name: GlobalMenuDataOptions.DATASET_CREATION, + url: '/dataset/add/', + perm: canDataset && nonExamplesDBConnected, }, { label: t('Connect Google Sheet'), @@ -149,18 +191,21 @@ const RightMenu = ({ name: 'Upload a CSV', url: '/csvtodatabaseview/form', perm: canUploadCSV && showUploads, + disable: isAdmin && !allowUploads, }, { label: t('Upload columnar file to database'), name: 'Upload a Columnar file', url: '/columnartodatabaseview/form', perm: canUploadColumnar && showUploads, + disable: isAdmin && !allowUploads, }, { label: t('Upload Excel file to database'), name: 'Upload Excel', url: '/exceltodatabaseview/form', perm: canUploadExcel && showUploads, + disable: isAdmin && !allowUploads, }, ], }, @@ -198,7 +243,24 @@ const RightMenu = ({ SupersetClient.get({ endpoint: `/api/v1/database/?q=${rison.encode(payload)}`, }).then(({ json }: Record<string, any>) => { - setAllowUploads(json.count >= 1); + // There might be some existings Gsheets and Clickhouse DBs + // with allow_file_upload set as True which is not possible from now on + const allowedDatabasesWithFileUpload = + json?.result?.filter( + (database: any) => database?.engine_information?.supports_file_upload, + ) || []; + setAllowUploads(allowedDatabasesWithFileUpload?.length >= 1); + }); + }; + + const existsNonExamplesDatabases = () => { + const payload = { + filters: [{ col: 'database_name', opr: 'neq', value: 'examples' }], + }; + SupersetClient.get({ + endpoint: `/api/v1/database/?q=${rison.encode(payload)}`, + }).then(({ json }: Record<string, any>) => { + setNonExamplesDBConnected(json.count >= 1); }); }; @@ -208,6 +270,12 @@ const RightMenu = ({ } }, [canUploadData]); + useEffect(() => { + if (canDatabase || canDataset) { + existsNonExamplesDatabases(); + } + }, [canDatabase, canDataset]); + const menuIconAndLabel = (menu: MenuObjectProps) => ( <> <i data-test={`menu-item-${menu.label}`} className={`fa ${menu.icon}`} /> @@ -217,62 +285,84 @@ const RightMenu = ({ const handleMenuSelection = (itemChose: any) => { if (itemChose.key === GlobalMenuDataOptions.DB_CONNECTION) { - setShowModal(true); + setShowDatabaseModal(true); } else if (itemChose.key === GlobalMenuDataOptions.GOOGLE_SHEETS) { - setShowModal(true); + setShowDatabaseModal(true); setEngine('Google Sheets'); } }; const handleOnHideModal = () => { setEngine(''); - setShowModal(false); + setShowDatabaseModal(false); }; - const isDisabled = isAdmin && !allowUploads; - const tooltipText = t( - "Enable 'Allow data upload' in any database's settings", + "Enable 'Allow file uploads to database' in any database's settings", ); - const buildMenuItem = (item: Record<string, any>) => { - const disabledText = isDisabled && item.url; - return disabledText ? ( + const buildMenuItem = (item: MenuObjectChildProps) => + item.disable ? ( <Menu.Item key={item.name} css={styledDisabled}> <Tooltip placement="top" title={tooltipText}> {item.label} </Tooltip> </Menu.Item> ) : ( - <Menu.Item key={item.name}> + <Menu.Item key={item.name} css={styledChildMenu}> {item.url ? <a href={item.url}> {item.label} </a> : item.label} </Menu.Item> ); - }; const onMenuOpen = (openKeys: string[]) => { - if (openKeys.length && canUploadData) { - return checkAllowUploads(); + // We should query the API only if opening Data submenus + // because the rest don't need this information. Not using + // "Data" directly since we might change the label later on? + if ( + openKeys.length > 1 && + !isEmpty( + openKeys?.filter((key: string) => + key.includes(`sub2_${dropdownItems?.[0]?.label}`), + ), + ) + ) { + if (canUploadData) checkAllowUploads(); + if (canDatabase || canDataset) existsNonExamplesDatabases(); } return null; }; + const RightMenuExtension = extensionsRegistry.get('navbar.right'); + const RightMenuItemIconExtension = extensionsRegistry.get( + 'navbar.right-menu.item.icon', + ); const handleDatabaseAdd = () => setQuery({ databaseAdded: true }); + const theme = useTheme(); + return ( <StyledDiv align={align}> {canDatabase && ( <DatabaseModal onHide={handleOnHideModal} - show={showModal} + show={showDatabaseModal} dbEngine={engine} onDatabaseAdd={handleDatabaseAdd} /> )} - {environmentTag.text && ( - <Tag css={{ borderRadius: '500px' }} color={environmentTag.color}> - {environmentTag.text} - </Tag> + {environmentTag?.text && ( + <Label + css={{ borderRadius: `${theme.gridUnit * 125}px` }} + color={ + /^#(?:[0-9a-f]{3}){1,2}$/i.test(environmentTag.color) + ? environmentTag.color + : environmentTag.color + .split('.') + .reduce((o, i) => o[i], theme.colors) + } + > + <span css={tagStyles}>{environmentTag.text}</span> + </Label> )} <Menu selectable={false} @@ -280,6 +370,7 @@ const RightMenu = ({ onClick={handleMenuSelection} onOpenChange={onMenuOpen} > + {RightMenuExtension && <RightMenuExtension />} {!navbarRight.user_is_anonymous && showActionDropdown && ( <SubMenu data-test="new-dropdown" @@ -288,7 +379,7 @@ const RightMenu = ({ } icon={<Icons.TriangleDown />} > - {dropdownItems.map(menu => { + {dropdownItems?.map?.(menu => { const canShowChild = menu.childs?.some( item => typeof item === 'object' && !!item.perm, ); @@ -300,10 +391,10 @@ const RightMenu = ({ className="data-menu" title={menuIconAndLabel(menu)} > - {menu.childs.map((item, idx) => + {menu?.childs?.map?.((item, idx) => typeof item !== 'string' && item.name && item.perm ? ( <Fragment key={item.name}> - {idx === 2 && <Menu.Divider />} + {idx === 3 && <Menu.Divider />} {buildMenuItem(item)} </Fragment> ) : null, @@ -322,13 +413,23 @@ const RightMenu = ({ roles, ) && ( <Menu.Item key={menu.label}> - <a href={menu.url}> - <i - data-test={`menu-item-${menu.label}`} - className={`fa ${menu.icon}`} - />{' '} - {menu.label} - </a> + {isFrontendRoute(menu.url) ? ( + <Link to={menu.url || ''}> + <i + data-test={`menu-item-${menu.label}`} + className={`fa ${menu.icon}`} + />{' '} + {menu.label} + </Link> + ) : ( + <a href={menu.url}> + <i + data-test={`menu-item-${menu.label}`} + className={`fa ${menu.icon}`} + />{' '} + {menu.label} + </a> + )} </Menu.Item> ) ); @@ -339,16 +440,24 @@ const RightMenu = ({ title={t('Settings')} icon={<Icons.TriangleDown iconSize="xl" />} > - {settings.map((section, index) => [ + {settings?.map?.((section, index) => [ <Menu.ItemGroup key={`${section.label}`} title={section.label}> - {section.childs?.map(child => { + {section?.childs?.map?.(child => { if (typeof child !== 'string') { + const menuItemDisplay = RightMenuItemIconExtension ? ( + <StyledMenuItemWithIcon> + {child.label} + <RightMenuItemIconExtension menuChild={child} /> + </StyledMenuItemWithIcon> + ) : ( + child.label + ); return ( <Menu.Item key={`${child.label}`}> {isFrontendRoute(child.url) ? ( - <Link to={child.url || ''}>{child.label}</Link> + <Link to={child.url || ''}>{menuItemDisplay}</Link> ) : ( - <a href={child.url}>{child.label}</a> + <a href={child.url}>{menuItemDisplay}</a> )} </Menu.Item> ); @@ -390,17 +499,17 @@ const RightMenu = ({ )} {navbarRight.version_string && ( <div css={versionInfoStyles}> - Version: {navbarRight.version_string} + {t('Version')}: {navbarRight.version_string} </div> )} {navbarRight.version_sha && ( <div css={versionInfoStyles}> - SHA: {navbarRight.version_sha} + {t('SHA')}: {navbarRight.version_sha} </div> )} {navbarRight.build_number && ( <div css={versionInfoStyles}> - Build: {navbarRight.build_number} + {t('Build')}: {navbarRight.build_number} </div> )} </div> @@ -415,25 +524,38 @@ const RightMenu = ({ )} </Menu> {navbarRight.documentation_url && ( - <StyledAnchor - href={navbarRight.documentation_url} - target="_blank" - rel="noreferrer" - title={t('Documentation')} - > - <i className="fa fa-question" /> -   - </StyledAnchor> + <> + <StyledAnchor + href={navbarRight.documentation_url} + target="_blank" + rel="noreferrer" + title={navbarRight.documentation_text || t('Documentation')} + > + {navbarRight.documentation_icon ? ( + <i className={navbarRight.documentation_icon} /> + ) : ( + <i className="fa fa-question" /> + )} + </StyledAnchor> + <span> </span> + </> )} {navbarRight.bug_report_url && ( - <StyledAnchor - href={navbarRight.bug_report_url} - target="_blank" - rel="noreferrer" - title={t('Report a bug')} - > - <i className="fa fa-bug" /> - </StyledAnchor> + <> + <StyledAnchor + href={navbarRight.bug_report_url} + target="_blank" + rel="noreferrer" + title={navbarRight.bug_report_text || t('Report a bug')} + > + {navbarRight.bug_report_icon ? ( + <i className={navbarRight.bug_report_icon} /> + ) : ( + <i className="fa fa-bug" /> + )} + </StyledAnchor> + <span> </span> + </> )} {navbarRight.user_is_anonymous && ( <StyledAnchor href={navbarRight.user_login_url}> @@ -448,6 +570,7 @@ const RightMenu = ({ const RightMenuWithQueryWrapper: React.FC<RightMenuProps> = props => { const [, setQuery] = useQueryParams({ databaseAdded: BooleanParam, + datasetAdded: BooleanParam, }); return <RightMenu setQuery={setQuery} {...props} />; diff --git a/superset-frontend/src/views/components/SubMenu.test.tsx b/superset-frontend/src/views/components/SubMenu.test.tsx index 6359e03cc261..661787bee9a0 100644 --- a/superset-frontend/src/views/components/SubMenu.test.tsx +++ b/superset-frontend/src/views/components/SubMenu.test.tsx @@ -18,6 +18,7 @@ */ import userEvent from '@testing-library/user-event'; import React from 'react'; +import { BrowserRouter } from 'react-router-dom'; import { render, screen } from 'spec/helpers/testing-library'; import SubMenu, { ButtonProps } from './SubMenu'; @@ -45,7 +46,7 @@ const mockedProps = { ], dropDownLinks: [ { - label: 'test a upload', + label: 'test an upload', childs: [ { label: 'Upload Test', @@ -58,29 +59,43 @@ const mockedProps = { ], }; -test('should render', () => { - const { container } = render(<SubMenu {...mockedProps} />); +const setup = (overrides: Record<string, any> = {}) => { + const props = { + ...mockedProps, + ...overrides, + }; + return render( + <BrowserRouter> + <SubMenu {...props} /> + </BrowserRouter>, + ); +}; + +test('should render', async () => { + const { container } = setup(); + expect(await screen.findByText(/title/i)).toBeInTheDocument(); expect(container).toBeInTheDocument(); }); -test('should render the navigation', () => { - render(<SubMenu {...mockedProps} />); - expect(screen.getByRole('navigation')).toBeInTheDocument(); +test('should render the navigation', async () => { + setup(); + expect(await screen.findByRole('navigation')).toBeInTheDocument(); }); -test('should render the brand', () => { - render(<SubMenu {...mockedProps} />); - expect(screen.getByText('Title')).toBeInTheDocument(); +test('should render the brand', async () => { + setup(); + expect(await screen.findByText('Title')).toBeInTheDocument(); }); -test('should render the right number of tabs', () => { - render(<SubMenu {...mockedProps} />); - expect(screen.getAllByRole('tab')).toHaveLength(3); +test('should render the right number of tabs', async () => { + setup(); + expect(await screen.findAllByRole('tab')).toHaveLength(3); }); -test('should render all the tabs links', () => { +test('should render all the tabs links', async () => { const { tabs } = mockedProps; - render(<SubMenu {...mockedProps} />); + setup(); + expect(await screen.findAllByRole('tab')).toHaveLength(3); tabs.forEach(tab => { const tabItem = screen.getByText(tab.label); expect(tabItem).toHaveAttribute('href', tab.url); @@ -88,13 +103,13 @@ test('should render all the tabs links', () => { }); test('should render dropdownlinks', async () => { - render(<SubMenu {...mockedProps} />); - userEvent.hover(screen.getByText('test a upload')); - const label = await screen.findByText('test a upload'); + setup(); + userEvent.hover(screen.getByText('test an upload')); + const label = await screen.findByText('test an upload'); expect(label).toBeInTheDocument(); }); -test('should render the buttons', () => { +test('should render the buttons', async () => { const mockFunc = jest.fn(); const buttons = [ { @@ -108,13 +123,9 @@ test('should render the buttons', () => { buttonStyle: 'danger' as ButtonProps['buttonStyle'], }, ]; - const buttonsProps = { - ...mockedProps, - buttons, - }; - render(<SubMenu {...buttonsProps} />); + setup({ buttons }); const testButton = screen.getByText(buttons[0].name); - expect(screen.getAllByRole('button')).toHaveLength(3); + expect(await screen.findAllByRole('button')).toHaveLength(3); userEvent.click(testButton); expect(mockFunc).toHaveBeenCalled(); }); diff --git a/superset-frontend/src/views/components/SubMenu.tsx b/superset-frontend/src/views/components/SubMenu.tsx index e51c1e8eca8c..4d21c0f3a48c 100644 --- a/superset-frontend/src/views/components/SubMenu.tsx +++ b/superset-frontend/src/views/components/SubMenu.tsx @@ -26,7 +26,7 @@ import { Row } from 'src/components'; import { Menu, MenuMode, MainNav as DropdownMenu } from 'src/components/Menu'; import Button, { OnClickHandler } from 'src/components/Button'; import Icons from 'src/components/Icons'; -import { MenuObjectProps } from './Menu'; +import { MenuObjectProps } from 'src/types/bootstrapTypes'; const StyledHeader = styled.div` margin-bottom: ${({ theme }) => theme.gridUnit * 4}px; @@ -302,7 +302,7 @@ const SubMenuComponent: React.FunctionComponent<SubMenuProps> = props => { <Tooltip placement="top" title={t( - "Enable 'Allow data upload' in any database's settings", + "Enable 'Allow file uploads to database' in any database's settings", )} > {item.label} diff --git a/superset-frontend/src/views/components/types.ts b/superset-frontend/src/views/components/types.ts index 8e0dcdf3d046..2cdc3ae9240d 100644 --- a/superset-frontend/src/views/components/types.ts +++ b/superset-frontend/src/views/components/types.ts @@ -17,9 +17,9 @@ * under the License. */ -import { NavBarProps, MenuObjectProps } from './Menu'; +import { NavBarProps, MenuObjectProps } from 'src/types/bootstrapTypes'; -export interface ExtentionConfigs { +export interface ExtensionConfigs { ALLOWED_EXTENSIONS: Array<any>; CSV_EXTENSIONS: Array<any>; COLUMNAR_EXTENSIONS: Array<any>; @@ -40,4 +40,5 @@ export interface RightMenuProps { export enum GlobalMenuDataOptions { GOOGLE_SHEETS = 'gsheets', DB_CONNECTION = 'dbconnection', + DATASET_CREATION = 'datasetCreation', } diff --git a/superset-frontend/src/views/menu.tsx b/superset-frontend/src/views/menu.tsx index 166516569198..287634a29b60 100644 --- a/superset-frontend/src/views/menu.tsx +++ b/superset-frontend/src/views/menu.tsx @@ -26,14 +26,16 @@ import createCache from '@emotion/cache'; import { ThemeProvider } from '@superset-ui/core'; import Menu from 'src/views/components/Menu'; import { theme } from 'src/preamble'; +import getBootstrapData from 'src/utils/getBootstrapData'; import { Provider } from 'react-redux'; -import { store } from './store'; +import { setupStore } from './store'; -const container = document.getElementById('app'); -const bootstrapJson = container?.getAttribute('data-bootstrap') ?? '{}'; -const bootstrap = JSON.parse(bootstrapJson); -const menu = { ...bootstrap.common.menu_data }; +// Disable connecting to redux debugger so that the React app injected +// Below the menu like SqlLab or Explore can connect its redux store to the debugger +const store = setupStore(true); +const bootstrapData = getBootstrapData(); +const menu = { ...bootstrapData.common.menu_data }; const emotionCache = createCache({ key: 'menu', diff --git a/superset-frontend/src/views/routes.test.tsx b/superset-frontend/src/views/routes.test.tsx index e00c64f4af97..2497dce15a90 100644 --- a/superset-frontend/src/views/routes.test.tsx +++ b/superset-frontend/src/views/routes.test.tsx @@ -16,13 +16,16 @@ * specific language governing permissions and limitations * under the License. */ - +import React from 'react'; import { isFrontendRoute, routes } from './routes'; jest.mock('src/featureFlags', () => ({ ...jest.requireActual<object>('src/featureFlags'), isFeatureEnabled: jest.fn().mockReturnValue(true), })); +jest.mock('src/views/CRUD/welcome/Welcome', () => () => ( + <div data-test="mock-welcome" /> +)); describe('isFrontendRoute', () => { it('returns true if a route matches', () => { diff --git a/superset-frontend/src/views/routes.tsx b/superset-frontend/src/views/routes.tsx index 525860ecef06..cbab3f09fdf3 100644 --- a/superset-frontend/src/views/routes.tsx +++ b/superset-frontend/src/views/routes.tsx @@ -21,6 +21,10 @@ import React, { lazy } from 'react'; // not lazy loaded since this is the home page. import Welcome from 'src/views/CRUD/welcome/Welcome'; +const ChartCreation = lazy( + () => + import(/* webpackChunkName: "ChartCreation" */ 'src/pages/ChartCreation'), +); const AnnotationLayersList = lazy( () => import( @@ -40,10 +44,7 @@ const AnnotationList = lazy( ), ); const ChartList = lazy( - () => - import( - /* webpackChunkName: "ChartList" */ 'src/views/CRUD/chart/ChartList' - ), + () => import(/* webpackChunkName: "ChartList" */ 'src/pages/ChartList'), ); const CssTemplatesList = lazy( () => @@ -75,12 +76,23 @@ const DatasetList = lazy( /* webpackChunkName: "DatasetList" */ 'src/views/CRUD/data/dataset/DatasetList' ), ); + +const AddDataset = lazy( + () => + import( + /* webpackChunkName: "DatasetEditor" */ 'src/views/CRUD/data/dataset/AddDataset/index' + ), +); + const ExecutionLog = lazy( () => import( /* webpackChunkName: "ExecutionLog" */ 'src/views/CRUD/alert/ExecutionLog' ), ); +const ExplorePage = lazy( + () => import(/* webpackChunkName: "ExplorePage" */ 'src/explore/ExplorePage'), +); const QueryList = lazy( () => import( @@ -114,6 +126,10 @@ export const routes: Routes = [ path: '/superset/dashboard/:idOrSlug/', Component: DashboardRoute, }, + { + path: '/chart/add', + Component: ChartCreation, + }, { path: '/chart/list/', Component: ChartList, @@ -135,11 +151,11 @@ export const routes: Routes = [ Component: CssTemplatesList, }, { - path: '/annotationlayermodelview/list/', + path: '/annotationlayer/list/', Component: AnnotationLayersList, }, { - path: '/annotationmodelview/:annotationLayerId/annotation/', + path: '/annotationlayer/:annotationLayerId/annotation/', Component: AnnotationList, }, { @@ -168,6 +184,22 @@ export const routes: Routes = [ isReportEnabled: true, }, }, + { + path: '/explore/', + Component: ExplorePage, + }, + { + path: '/superset/explore/p', + Component: ExplorePage, + }, + { + path: '/dataset/add/', + Component: AddDataset, + }, + { + path: '/dataset/:datasetId', + Component: AddDataset, + }, ]; const frontEndRoutes = routes diff --git a/superset-frontend/src/views/store.ts b/superset-frontend/src/views/store.ts index d363ed2cd99f..a143deb7379f 100644 --- a/superset-frontend/src/views/store.ts +++ b/superset-frontend/src/views/store.ts @@ -16,7 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -import { applyMiddleware, combineReducers, compose, createStore } from 'redux'; +import { + applyMiddleware, + combineReducers, + compose, + createStore, + Store, +} from 'redux'; import thunk from 'redux-thunk'; import messageToastReducer from 'src/components/MessageToasts/reducers'; import { initEnhancer } from 'src/reduxUtils'; @@ -27,15 +33,28 @@ import dashboardInfo from 'src/dashboard/reducers/dashboardInfo'; import dashboardState from 'src/dashboard/reducers/dashboardState'; import dashboardFilters from 'src/dashboard/reducers/dashboardFilters'; import nativeFilters from 'src/dashboard/reducers/nativeFilters'; -import datasources from 'src/dashboard/reducers/datasources'; +import dashboardDatasources from 'src/dashboard/reducers/datasources'; import sliceEntities from 'src/dashboard/reducers/sliceEntities'; import dashboardLayout from 'src/dashboard/reducers/undoableDashboardLayout'; import logger from 'src/middleware/loggerMiddleware'; +import saveModal from 'src/explore/reducers/saveModalReducer'; +import explore from 'src/explore/reducers/exploreReducer'; +import exploreDatasources from 'src/explore/reducers/datasourcesReducer'; +import { DatasourcesState } from 'src/dashboard/types'; +import { + DatasourcesActionPayload, + DatasourcesAction, +} from 'src/dashboard/actions/datasources'; import shortid from 'shortid'; import { BootstrapUser, + UndefinedUser, UserWithPermissionsAndRoles, } from 'src/types/bootstrapTypes'; +import { AnyDatasourcesAction } from 'src/explore/actions/datasourcesActions'; +import { HydrateExplore } from 'src/explore/actions/hydrateExplore'; +import getBootstrapData from 'src/utils/getBootstrapData'; +import { Dataset } from '@superset-ui/chart-controls'; // Some reducers don't do anything, and redux is just used to reference the initial "state". // This may change later, as the client application takes on more responsibilities. @@ -44,22 +63,7 @@ const noopReducer = (state: STATE = initialState) => state; -const container = document.getElementById('app'); -const bootstrap = JSON.parse(container?.getAttribute('data-bootstrap') ?? '{}'); - -// reducers used only in the dashboard page -const dashboardReducers = { - charts, - datasources, - dashboardInfo, - dashboardFilters, - dataMask, - nativeFilters, - dashboardState, - dashboardLayout, - sliceEntities, - reports, -}; +const bootstrapData = getBootstrapData(); export const USER_LOADED = 'USER_LOADED'; @@ -69,26 +73,75 @@ export type UserLoadedAction = { }; const userReducer = ( - user: BootstrapUser = bootstrap.user || {}, + user = bootstrapData.user || {}, action: UserLoadedAction, -): BootstrapUser => { +): BootstrapUser | UndefinedUser => { if (action.type === USER_LOADED) { return action.user; } return user; }; +// TODO: This reducer is a combination of the Dashboard and Explore reducers. +// The correct way of handling this is to unify the actions and reducers from both +// modules in shared files. This involves a big refactor to unify the parameter types +// and move files around. We should tackle this in a specific PR. +const CombinedDatasourceReducers = ( + datasources: DatasourcesState | undefined | { [key: string]: Dataset }, + action: DatasourcesActionPayload | AnyDatasourcesAction | HydrateExplore, +) => { + if (action.type === DatasourcesAction.SET_DATASOURCES) { + return dashboardDatasources( + datasources as DatasourcesState | undefined, + action as DatasourcesActionPayload, + ); + } + return exploreDatasources( + datasources as { [key: string]: Dataset }, + action as AnyDatasourcesAction | HydrateExplore, + ); +}; + // exported for tests export const rootReducer = combineReducers({ messageToasts: messageToastReducer, - common: noopReducer(bootstrap.common || {}), + common: noopReducer(bootstrapData.common), user: userReducer, impressionId: noopReducer(shortid.generate()), - ...dashboardReducers, + charts, + datasources: CombinedDatasourceReducers, + dashboardInfo, + dashboardFilters, + dataMask, + nativeFilters, + dashboardState, + dashboardLayout, + sliceEntities, + reports, + saveModal, + explore, }); -export const store = createStore( +export const store: Store = createStore( rootReducer, {}, compose(applyMiddleware(thunk, logger), initEnhancer(false)), ); + +/* In some cases the jinja template injects two seperate React apps into basic.html + * One for the top navigation Menu and one for the application below the Menu + * The first app to connect to the Redux debugger wins which is the menu blocking + * the application from being able to connect to the redux debugger. + * setupStore with disableDebugger true enables the menu.tsx component to avoid connecting + * to redux debugger so the application can connect to redux debugger + */ +export function setupStore(disableDegugger = false): Store { + return createStore( + rootReducer, + {}, + compose( + applyMiddleware(thunk, logger), + initEnhancer(false, undefined, disableDegugger), + ), + ); +} diff --git a/superset-frontend/src/visualizations/FilterBox/FilterBox.jsx b/superset-frontend/src/visualizations/FilterBox/FilterBox.jsx index d734cf943dc6..b90d82289e67 100644 --- a/superset-frontend/src/visualizations/FilterBox/FilterBox.jsx +++ b/superset-frontend/src/visualizations/FilterBox/FilterBox.jsx @@ -20,7 +20,10 @@ import React from 'react'; import PropTypes from 'prop-types'; import { debounce } from 'lodash'; import { max as d3Max } from 'd3-array'; -import { AsyncCreatableSelect, CreatableSelect } from 'src/components/Select'; +import { + AsyncCreatableSelect, + CreatableSelect, +} from 'src/components/DeprecatedSelect'; import Button from 'src/components/Button'; import { css, @@ -43,7 +46,7 @@ import ControlRow from 'src/explore/components/ControlRow'; import Control from 'src/explore/components/Control'; import { controls } from 'src/explore/controls'; import { getExploreUrl } from 'src/explore/exploreUtils'; -import OnPasteSelect from 'src/components/Select/OnPasteSelect'; +import OnPasteSelect from 'src/components/DeprecatedSelect/OnPasteSelect'; import { FILTER_CONFIG_ATTRIBUTES, FILTER_OPTIONS_LIMIT, @@ -81,8 +84,6 @@ const propTypes = { showDateFilter: PropTypes.bool, showSqlaTimeGrain: PropTypes.bool, showSqlaTimeColumn: PropTypes.bool, - showDruidTimeGrain: PropTypes.bool, - showDruidTimeOrigin: PropTypes.bool, }; const defaultProps = { origSelectedValues: {}, @@ -92,8 +93,6 @@ const defaultProps = { showDateFilter: false, showSqlaTimeGrain: false, showSqlaTimeColumn: false, - showDruidTimeGrain: false, - showDruidTimeOrigin: false, instantFiltering: false, }; @@ -319,19 +318,12 @@ class FilterBox extends React.PureComponent { } renderDatasourceFilters() { - const { - showSqlaTimeGrain, - showSqlaTimeColumn, - showDruidTimeGrain, - showDruidTimeOrigin, - } = this.props; + const { showSqlaTimeGrain, showSqlaTimeColumn } = this.props; const datasourceFilters = []; const sqlaFilters = []; const druidFilters = []; if (showSqlaTimeGrain) sqlaFilters.push('time_grain_sqla'); if (showSqlaTimeColumn) sqlaFilters.push('granularity_sqla'); - if (showDruidTimeGrain) druidFilters.push('granularity'); - if (showDruidTimeOrigin) druidFilters.push('druid_time_origin'); if (sqlaFilters.length) { datasourceFilters.push( <ControlRow diff --git a/superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js b/superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js index e1f871fa4cf4..137a2b191af2 100644 --- a/superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js +++ b/superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js @@ -19,6 +19,8 @@ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; +import example1 from './images/example1.jpg'; +import example2 from './images/example2.jpg'; import controlPanel from './controlPanel'; const metadata = new ChartMetadata({ @@ -28,6 +30,7 @@ const metadata = new ChartMetadata({ t(`Chart component that lets you add a custom filter UI in your dashboard. When added to dashboard, a filter box lets users specify specific values or ranges to filter charts by. The charts that each filter box is applied to can be fine tuned as well in the dashboard view. Note that this plugin is being replaced with the new Filters feature that lives in the dashboard view itself. It's easier to use and has more capabilities!`), + exampleGallery: [{ url: example1 }, { url: example2 }], thumbnail, useLegacyApi: true, }); diff --git a/superset-frontend/src/visualizations/FilterBox/controlPanel.jsx b/superset-frontend/src/visualizations/FilterBox/controlPanel.jsx index 8e76c9d8287f..60bb9c83af9e 100644 --- a/superset-frontend/src/visualizations/FilterBox/controlPanel.jsx +++ b/superset-frontend/src/visualizations/FilterBox/controlPanel.jsx @@ -32,7 +32,7 @@ export default { name: 'filter_configs', config: { type: 'CollectionControl', - label: 'Filters', + label: t('Filters'), description: t('Filter configuration for the filter box'), validators: [], controlName: 'FilterBoxItemControl', diff --git a/superset-frontend/src/visualizations/FilterBox/images/example1.jpg b/superset-frontend/src/visualizations/FilterBox/images/example1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cc109ee5aa38724a0aa7b2274a739a485b520859 GIT binary patch literal 10921 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 literal 0 HcmV?d00001 diff --git a/superset-frontend/src/visualizations/FilterBox/images/example2.jpg b/superset-frontend/src/visualizations/FilterBox/images/example2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17912d52f72cf29106303524e866766398587dea GIT binary patch literal 16969 zcmeHu2T)YY*6s!rkRU;VWF<?Kj1opbl87Y9Nku`jNRERf5hM!;2uPMJ5{5iV&N&V_ z2MI$SV3>K^d;f6Hx$m8O-d}&!tH0jqnXc;Y-Me?M)!l2aZ>_bl6WDox{DG3H5`cq) z14M&A0J{KKDtcI30)V<YzykmPA%KrV3E+Vx9PkI=;Q*KaRt5k)JiK2mf6IUt`QOXG z8nh^YOMh>t;n1S|&obBs_73?B0A*3wDL?_h#liXY|F?v98ShuZzjO)jG66mT!LLks zh4=~~ArT<~0TC$?5itpv2(DZuBPF@|tNd$_U$_6d3;dH15)l6C@qd@F-vJ6j;1I_F z4~G@NrNF_Xz`?cvEZ|HpgIxK=n14$+xOkT?<AYNoA_hBDl7rL7!@~t9d-)PbE{-pF z9k@hsnewKP9R4+}rv$7{RKjm!G6>n^%YIO64<gw`p1lsZLPSG*osOP^lZ*QnkEocq zgyfyO3ilP2lvPw8=secd(>E|QvUvW&((0wPjkAlZo4bdnS71<Z$lK6&VX<)^;u8`- zCM9QPW#{DPeaSEQR$ftA1*@*9ZE9|5ZENr7>>3͢v+m_#frE-kODuB~ru?(H8O z9vz>cPS1YPg##|(zo)+w_B*;LK)P_jHMm6Zi!K~ocQE5oT)KQy2%l0;i{Po#HCEv_ zgjDh|8D&4Nu!(3Rsh_<bB%)y#UEtXJMcUse`*VZ^{Ff;E55oSFE(AaVZcJPXJPH5; zT%a?<R_b5uCEi1lh1$6kYui7N+E!T{y)jg>qvss*tYA;6yP8LYx=%iz9jBLBZq-#( zk2zvbP;QSP6#C8XNXk1xZEM$!e<XF4J?XRi52i~6n&(kY2FK6}mY^fmqNTDC2Uo~8 zU_|qExWthS!RbLPqR7A_m_!v`6G~vgIByv_3msp_%p*=VF8m62r5^C6><PBck$FH` zVm9u^pBv3|Qa)-e&bfUrvL|$?hpL_2Qc0^Jk^RYI7@P_%lQ)eDp{umLpVE}j=~<Y& zRT;z=!CLobfJ({nbLN@(=dGy~V=R!?c0t{@389r1$)4ozIU5a|YWUz4_JHNJnj>3K z#K8NvvpoeFuMNHel!}(U=W-}*DPGTnv*U%5>;w*2)zD6fK$b@n9gPa52;YnQF|kbg z%+IiZ$8!vv!OzQUo&Ok90beQ2&9hb%zcRLZDaPGCMuD{J@%&j}#~HKr2%x1%_1}{9 z1(%?gO+6CZW=Tgr$Id)K?qtc#bak{yWlfsg!vzSrTnZkk%riUtdxfp(I@YU|Y{s+~ zm~K>^*=^XpvuEUc&Ut->ukAkcbi*HCcGqWANkSxFCjnu$7H>0GE*N%A+g?X`w4y=6 zP$jL8;qyLa!U-*G$b_tBMA4Nh^e$cT0Ha`!P7}O5FSL;k1yhex8m_QyU>%SqrbiWE z0o8LxbA*1PP!!K~CV_il3;3NXnjOs?29;iGXx2n5a42G%ezMt*1>S360m2+Ca6y7t zyErSy0!vg&R8_u?<Ne*eQ<ZbCUubJL%pa+`Y&b%83Qx*feN0hoMIHw&$t4*U`O23h z+>GpD6J~B<O!tjvH24Pkx`M~<uzlcuey7u}P_S#d1q*yTd50NX<k!JaGT0XDw9(ux zPRqBx{kS5?B>!9}Vu*q-O(T)SFgiUZ`vzXHY|TGS2ikNCiUkzJ!7F}6SOC?^-OA;1 ze)1D8-%wHNr#uW(uT4`e#B|pl$M0QT(j6#uaUXI)Z97z$3U9Bxds3}d?j%+xTxbuo zh<%TDJqe}sST}pzj~FdKidMba;B@uv7c+*G=8II?uu{?B@(_b<3ZTBSoU+f^p`|G1 z3(nx{Sp%+d$O07{3uL62U;(%u6#Xm;r6`C6)-A^&yQAq?;CiNz)>~FDo3kB+V_qz# zM57{6LV~R^Jh#)(_4F)-CPcxO<x?SJ9sZHNK*7W^{tZf*4!T2Xj;C1Q_tdc<!_2Y3 zKyL|jt`LF|((S4%ZJ}1>aL`9VlWG+I^$lwA?r1E~A(IV{!LY14Xc<6%JD~FK*T1U{ z16^hwGVj0wWCs%5MUdZ-mW82E!vbe?mHp>OR#>2od&LwBK=#S31(%_3Pg6eVvHX6- ze_F!VC0HQ+l%OJUAJUBO?cyc-{g7B7NE-`aLhPL}7lv41FYJy!v>zRaP&;K=z*w$O zzx}5n|7lk+7Q)vsa@!o}C?pmTc^%gLPh<Xm4I_2u4zR$D<5-OHpX9AF&+aJ}i1t>6 zvY{b8)0tnfz`xiRS%0m@f8T15EtslmenhJmCJF7IMk9o+rU~WR2LgAMd3N9||F9vU z!D1nMWWg0P@`?ttXJfn}y6ZUuLU;$oL<vP()^xWxI7YZL!xS$+Md@G^W;wCI*I4KV zQ>B9*OE4K)qh1{gJY~lMLsB-?TNjYW7CMVjrRzQBk=mOU4+a*7T(7uHO%*@89;?e` zeae2*gseX3O}vca>ocy_RDFZJ)}!KbWh-A-v4m81iMrLmho6*P_R((=ogBF@Hw(;n zI7jl12^^mL-fKP%y_vGLf92T$xkSQ}<coeKI_XHy0<ZKymk4Wtu>-Z?k_0SZh47hr z4y~{|PuZ8XZzvzGR95qx+s6WdC<ZJL4~L)#2$sz0Y!Gwb8~hff!o6i4w5=Ln5#S$e zc^&jgssH+1jXT-#JDr%g_hT%fVl(=3d-u;?M669dA2u^kP&%m4jvspH|1nt)z+VQu z{2#4$%GRba3}+7NtDDMpx~ynsj@)Zh0oE9VV03FaydLfv-UlvY;+7jJo*%zAKDAE~ zsiW)bPn7-Sk|X9av<YVtLmwV6-Qn((7{UTk8Yr$0d2NE%Hj+(?R7o4N#1i7IeVw@` zSZMuTaxtLiZ#I=kM9)_}q9W1vM8aE=)59xL3V$A#85r$*d%ye~9Ft{`8!KH$`=n)? zz`uH})YcI>+#E|RgTN1imiO5!Ph?>M<u&)t_U;45y}7i?LW{hqjc8B30R>0qRo|E! ziqkFSj8|9Qv7fLf*GN@eK!y2VIBImGk2o{Kc$BEL6oLOrrv8B$Hm9hJ3c>=HDpS3i zkB?zqqlLzb)}$@6F0Z9wLJ9$Cb~mGTuj0hxJ0;+8)^+_rB_hxI7ZU?^Dx@|_inn*t zZb?sB>Lzf7J&vby=M}sf_UduqFcr=L#2+K<Hz-T7*B?0Eo=hdQem7^PF$T(4tCZ@H zFFKB++dQ>7Tw|XEgvu}b>!8}lMpw1`dNyPWbEj?0B=*K?t|ofpXD}6C%#?p0YFbq3 zzWl~GL~Ag_lj%ySIv1}0Z44b2=#&5@<VB!8{7`#r<tbWZX`vmIuUicESRgY2##7+) zu$>IeeJ0oe9+J2xMGZPX#_m@BG*J;)NcGqEw(Tr_@9#3R@@=QR(N??Ob_u%emVOCy z)680*nJGnc=+IZ7TW@4{X@oUQ&7-6wr%H}dFiI@&zADa}8~!+w_*q;%AKah!2{}2~ zY(Sg+><-gW`eQ5ydnM5MRZtv94q^eKvu2E+SU;L^7P^P{frPdfi?o>IS86brDR3s{ ztncO%XRy5$YPWEb7M4}IdwSV_`;&gk1ZL`Pd#E(tg0HhW3M!(yNNRzh_?bdH^GwP( zl~;3ilQr7YjwoL9{LT8$c2S;K$9M@}2<?lL1{u5BtUFIPINYhnGdBv)6B^%^Lz@~w z(ViaRj0FfJ($Q{Fzn$WEOx|{T-h>DEGQ6u)Y>~N<fVmvz>1u)spcCVdp5z#bqE7h1 z9xDC)%^M)vS4az$b&RM-(uBMDD9p<!D2yeK^<e?^vYL_Y9`~^m+OLKyx#~@Htg(x1 ztkL&Kh{~PcJdUeOJGSjRfi2HvR{NU8&hjeTC!DAqSo;iau^>x}AZtsYCi0_q4GS=3 zVW^MZqS3bLs5|wb`c}Er$aK+oXsXkmMut4v33tt#@yOB}skl`_v(KAi%upvpfNQYN z9;sIyK^-#07|e6^-VVfy3?Zd{ks}&KX+y7`+FBeLSkj-R$X7%NHyDyI4q6IbHl$9J zc^o)fAe^GFp=Q34d7(d>_I+L3xYg0V_9v)sz^gam3+4vU{x(og3ry+9NGYRvf0CV| z#vw>&Pb|=G`#Q{Q$aKQjEOEcI<~sCW5K*JZ{8#7ySkk|^@sAt){}DGb8ksh}-O`UU zh+zm(74wGaF$dAzRxT^<;y#YsY2G}9$NP5J3GvsfG1`>1UneTa!nwB&<Y_6&ef<SF z^(hMc`emudF`|M|uKWVykH_bSw-3*i>#IUshsWqF<DdI~qm7gwzRkxFo&UW}!_iP{ zGQvW;@gS#`*q*1AzE!FP*dKf+rPA5W+&E%444$??mnBeGHe=o<DV{S}@6M~cH@TY$ z?d6;V9i1mRSPpTB6O+igt|3+<*ds?Rg*sZ7p6pBPEI%QXeCn)l5$VISU@DhA1gWT~ zW7$5}pyW(<<RLaF<zE!S*L}`Mqc~OXu$&pK|LIHu&8CM14u&<c!1oOhfYm}4=wTp^ zPkxIb(7*z%gDh^nF0lDwb7$3{%7(MKJw2$Gm6$z}pt&#)HQTpISIGbgrPZF^{5t(D zUe>-sub-Zps4GM=F`u2XT?SYZzyi<s30m}M$x(4FX##sL<q9vXsLm?JB9E)8U{0pR zwMB00?_*U-{47*T*$Vv4{gsQLO=6B%Kt_xVeHDaX;UGpS1d;R?=)4OSK$}tw=GGbt z#(q0bNQ)>bVy-)JT%DO)j5|_2RE|QuJqD1<q4kmoDN|IyxLUB7=+~;s>M)L>%SWvZ z-4`E2zok7s-e5Q6dTPm7GHQMgC5412plI`K61;Gy6|D+Pb0!0n^wgdu3>fn{EyxkF z!5&?Gq~<(uHSo8SU_nNJ){cI41uTG<hXoebqv~L`KBdrpO|RV<c*^uZCWy9w$4L<8 zjKa}}BM{_WC`Q0vl=~OpRVu~;Yq=R%;LR`yja+_5`e#xiUdX?AGM;=G2=#+(<}hA1 zEGQ-j7NAxB{h|VY&F6nSe+Fjh10B1?KNnA2R9QrQFJnmsUTW#OFu+DcrKH|L#?*0D zCYZVcY)1d4_fn^W>T`!Oc(zMH1JEFaUa-|V7TBj4h5y`u9^QY9)8aQquZ(EK@hI1h zJU1HNt&pKVKI`+9(5?CEv8uup|M3T_BjE4WsE?>AwpyggK<XP+Arn3pd%7-47A+&U zl5<v8GuVfv7o`UI;vV*Olh`x<(EVV~CuP|X_jqXAwO4qt>kKiw-?uLw;=%P^m8zqe z<bB@F4*_xn0i@4tprm|9>7ljCp(PFi>~V6i1O{UDvQYk6P3qO_rYl{fANebA{Y*X$ zGI97NoA-^Q53ktN4?(>v8-GF?CiW(wHs;hGjz5s7EX}vgUb%@-=VBwdTmxfu>SfX= ziIFA4q9r9o{6t?V1crG&eR^^{hl}AxWwo9)=36cDO8Hie>5Y$#>zz4oV5~kqCuR9? z(9?teUGLsw@kQ}~`fVSHi*%n`$VSx?(F+!hINciCK-oP0Y;*fm%cPa(p1KOc0q6H1 zO$Aq-jAe;XRtxZufobK189c=Si+U&apLvtYHk?mC(GcRRbhdd}=H8k-^Sk>?m@`~D z^4o>}L=NvwgIYSd-$<GWayOvD^kr$VBV^(BFet94UT&@F4MB(abzU@kuJtiExFzU@ zQ*tw?*paEAI&*Eu=SW><q-_x<cSl=~>YWL9IR=IefAAd-bd|CXh!n(%i%4`Ry;5bm zocN=Z&>H3y(FzatxpV2P`JG^PlzOnyUf^4NdD^v`-yKsR5;C5}8dM${YI|+(#8Zl` ztLUpzoub6Y_Ghd@9+E3*y&<@SD>)yQZ`9RY`qSI<c+__El8fWoDb(10FkJ@W<2>%e z>ot1~*_vC!ob$}lsv*3E0v^i#%_F#sX0V&7OQc1y37*3KO_+e_@vAT0WC-3?>&2fa zzT(wLEYOl1oD@d4y*!#Rq<_vlyQ*Rlawl_Et(+x6kx}a4J&SD}ig?}|3y>gQmZKz^ zhF>02idKzjTWg9n)WK$-%h%~fy~fw@8SV96P!2}x<W3uInlTKx603ExC3`sVu_oL} z6D5rN@gbngpPMThz{3qjPHrBKueqbF?cExVp5}>-Auv+VboK2)X484|$XSuSL+6LR z^H_kC^9^a1P4s42CnkBQn^i=ar?+Z`sD0nTF!GqkQzz~1yll;)y5mCPI{_cXLL(b@ z@}Kmr#pP3zm4yn75{VQ%pSn)*o=m-`Ho-NBXfH~iUkh?5bxC<A&A%`yAbQE*u#-VO zsOnSL>%uEj=U?-pX#wW=oEP&mTxxgY3^%I8g>A3CXpBW%3R9~g+7`U2Nh~foJt?i{ znz?d?`$*mQ7<M%9rS1X$q4h;)ZsQ45WR;0mW5kgxShPXBy&VBhMIQHSMKY1K6z3L6 ze5<?WB;;MKu=DKhySu*AuiPtG!p%gHpORO@T-AKlTGa}vT+%gCwB^5AdwFZDu=YAK z3V9AY@a<;?auKO9dcSS%4>5u^M^Lu)&EzzusF$nDGE7y3&V)Zdk50UAl6idn<jx&Y zkMITBU}-ah%~?7mCfjIjJ7~swPrcSYEJUH^kx6F3&ZaJ?E)^GS&T&1)0(8!TH80O6 z`HLQU!v!xmxK1jeys(;ss8ByakArqBK-_r42Kf`=muTg*a6x%IhTx^E@4n_qUlDL8 zVL`*4!N2c8w9;^0o%wraPNZ1mkt1nm#=6%wJeWnpSSq+7O}>l^L8Datq_9@*#=Dq_ zmKx#M*D|J!)F{)AnT3YSRg<}&MDki&3&=YOX0X8HBAhEHa=;rkCuCi-M4AvYYf3YM zvG%Neg;aIxneEq<2ipg3J8eVybn7Y`Iy!o%qVUrVl&Pn)xl35MNxlpgn72huqKnI| z!j;eO`N*gIpr`o^V<t5&Hg2NzyB*EMx{?)fQ_a#?Q+DKv#hUnwK1miX0)bH<`w~>G zubAtGXpNxgwtllwe0*CH$(Wys{<yIjfnKuuGGQox^mWLz8D>_RIHS1eHYvjc@~KJj z6e{TRC_B9(Dp4Y#Hxz{apHCkRw&RvdYapXk_rzvX1b0P`hD+=n9=d6@QqEi?wIu9y zxzPx<P4X1zGo+M>>6>(70WZPj>?!me{mv8jv~<o!dv-X(1x95PGzvr$acBDfnJfuM zsrY~<Yht`}iE}{>O!v&HFN_S<)nDSY>NXWwf4ExrfIBNEu($^V{m_o$Tr4nNWPSz| z6ZIqW&|wJ23$Ioz@R?}fGj167XWV>~mu+hKoFSW=qq#q#6~Df{@r07j_!A)6E~jtX z-6-HUB;q5z7t!}F+rtdhOKFWBB{7#3UUz&_p~h>??y;yVa+^|}O;KQC|MS*LB5&*k zq-3ew3kw)e9aw$F0v6NI0b@|fZM*@(Xcy>js;-Nq=N=QPi=e50W6wHSBXR!RHazKO zN(;F{ff=9P74MH*VW+_ls!b=q-;A=*v|&MNHe7|`Hy6D;;~zaq&zYP{@lJ^^j~(+o z;yygCOn)V7+{%~q?Dg$Dx=WP&c8SKuYi^C_kj*A9oAaqP7x*1P_{fRlmUq+{u?@>f z3k%vI>K`kOK5-Z#-aJ^S=r-Fqi{kJR@w?JuhZMa%_2T$X&PJ+^4B6Kf5|-Q%R9_g3 zSDrj3zjyY~CBv3ltb9UnSMta>2@6b|upH8iKz2hRs2P@jti05^2O5d~vE{GJAdmh( zVhd^Jqo0+P>T(~DN)t*@itCVgka!Z<8-D(!FtI5{8;Zwnc>cEzweDS}0<$Nyt$$KS z5j9g}GCOT^b{x)`mq*H`t1dYuYSfU~@mwWWE%XJDCGsIwCYI~tgj1W0d^u1(>Pp;d z+*xc<8GWCIL*8IZpFKejb1d2Z;L)ueG0rMXErv{YEq`Uqyv!{wi;U86qw&_BWzs@F zwH!NbEfsNIWpd#}PU6n8w_c5DnKB(-U)wTxl5+W>$0SIWP}d7Jtr%Cy=VN>>Q%v&Q z%c0F)d=5{m!&E7<Zq%JpwBNi=68;`9gt`18$_Wd|*(+dBfmk47@VC`b&SCA%Vw9<1 zjW{o_@!1Tdmup`-q5qg|$VaSra?Zo5b@nzg#TxFYrXqScY#A^{+__YpFe_S9@sUs7 z;Dnn+c;^Ly1C{p!(gJ+7Cl*`{nwa)#P@YwRSk6Zdv>vYiuD)SU%^ZG)J~|?ulh6S% z+wU&_zWe$wT=!R>|06s9;?Ey%xBo4F?3vdEy9;J_wreFHU?lHBjX=Xd;rdB${ss+< zB*SQtD*DX;B@U+Y+21vQe$WK9%vJ~;2mL+kp@s70htN~P&AFpP_!%n?u!IGy>ryT5 zqj*7WSYZ!8Z{b3r`OI`S>za{*Ezh*{tMURBt`IpGkL=Fyu7SJxb-_l;Zt=h`s$Wo9 z2Fbj1he@S*umE-4lDu;%#q)5FAt7RW%bVA?qA9)gb5VKC;<94MzKpERSH5}bqxRVq zwQs$-QmDdo$6rS`^Qd&(h-|AVr9iVrwL)m>MHYGUi`7emigzvte}&1qrwa#JS*y)| zmTS7yx0~V)Xfbh=Ak6osDnT4sF~fDT;b;c;Y?0V@a?kYem6j{<Fk@gLnNiP2Af}CN z(yi+~?Gjcdr17bA^^H}lzQ%+~$>Fg_#?9xohew4OMdn-iW=~m{TaO`U-r4P})>p-_ z3lPz<2T*dzrwa!^4bi^7ya;bjpVVn?BrSK`zFa*nkezVRQBzy(Eoxlz!dl#@K7z!~ z;zL_c0Ws;^>=Unk0L?Rqp})x9NJqqq4P`r=oaKyt-h5a0jMqeEg~DB&T7~g2KVoZl zYHu7vfF^D7KCd$eA!G;^c<U?OY;;jtDR>oStTE;&&1T0}ulii@@N&2TKmQQjlY21W z`=zVe3yhbomAkqO7_UwHXxHs!`3P6VsaA^DPMOHN5>~uhsI3kmoohJfongJdkMo{R z6Ia5gt}2iTzSTTm2$g|;+sO@kzCT1)DV6`UJgQf<zRty(XeuLCveO_SuuSecps%_F ze~Zv>iJ+HaGNQ|lq>Ej>a-$|;Y!RW`H_4X3X~_08R=DWu6{airIkvp+7f>dNL34Wv z!kt|ZPo|glTeRsMe@Xd4Q?`yYRbSjTHQKa}gcGkP>It>3Jez$HGTGes@N*%bR$GVM z%wTF6W;`+351wB-F}8HBeLP?-?v+v*V2x}{x;&C;6?WzMH1k6Xi`4%2!F0?ZkIK1% zn42W^=8QsKE+;58zBPr1VdlHYRXA!4gN6zTvo4!<v{?I#m+)^w%jbfQ6caCSH~Xx) z!j?@8Z6w6qDO8!Ns}vZ^R7%ooa0s>Wu6|w~Xk>C9J{U(17aokrjwis8kYY+i&kFj= zxzf*cst2-x^P|bU*SGtM61_4it6`o@f&8_ik{@|8eESAM^h{o>(9d1=yXg_v4k7cA z`(is*YZ~7hnO|UNEEX}`L&v{k8RS4p`J^-fV3YEnmXE72slG@--*k4eU^AE_``Su^ zFE;8hCe`w;yG=k-t!m9ygt3P)w*5|L@%FWa)ue?K(`WqRceeG7(u@m(C4{@LCz~Wb zSAJHu^UNTKh?r8PlQZ+11EuC>DxBC4j&$dNP#N!(ZdgIv=8)pjj^AfF_sGIre6OiH z(xT!X1hoGcljVTde=7%BsXdZcE9?{cO-|e*s?#x6GQ2DXki2e#FyAibOvyI>UNtt$ zlde{!KPpHqP%#xAx7K@w+(@ik=p&&){cF(&*SGc9V%C!(TPwMcKp&~RpZfal$x$I& zAu0Cx8}9l>V%^661#DKZk9V{wu4u2Qk^Yct<L^BeN6BECzHY$Wgf@=%5PW)fQ%67P zlehJ3Fm6zVm4C5vey8xf&Ppmps<XtqxD;iIiQx5gEK7bg>xQ-~J*k*MA4|@WW5#Nu zLW*2TA1yUi6=zPFZz4?Vy9;3m2LZdMwJEFN9f+8YsuBs$_gyWdLC(5p#q%dNX4G&R zm>=yhVsor(PO}jfsF!9Pq*G3%_NwY*vKGC=3k%BSV0{ObLsN@+iJ+qkN_Fvr2M0yV z4Rs?%kcys~w9PwNsr!s9sREqW`|#2JgqN6EQPc}?Dx0eDL_I{1v+)n=e45&v(IR)v z7S+f*L$|1{6!|77Ls&$vzL)Ehxl<44hceZ_<(<=j^lP9Kp~A2xsj0R-$0$ArG2*Fn zUn%1Ve!rn}1mSX7<;TyGEZm-q{$5tp)A|zgEV$Di%6fYoN3$8s8BU8#_sv-ZraBC$ zpM+hyCsDOXL(TC`Sasf|BsTclp?Ng#5eWL;1piX{{zPUpNAoi&V`vDD$<S;tsS}3- z%z(J(9T0AvI7QhVEfu?c&{9?-(1A3i@AF#2kABi({CVZe(YLSwYgGysFe`(u<5qA3 znPJ>O0p&*G?OApHoE9PC5Hi+ooM;CkS~imEc`~zjzxwe-=(fhfTu|EGIEB%oqt$bc zh{h~msO^ij$&IfXqR~nR!l|3YE%VXY+;oz3H)e9C#UE)rcQ>~hg{&Qb9*pl2AmFR; zO$QAR>Aj$F9GC<B(Bo8Cppq<j2{{{6aP5n4qVY&2DbLge%j!W<?8e%(NYi4U9WxdX ze7F}gA2p@iWF}ERWKT2RV)O!2$scQkn49p_R%Ke&>9&_upc1N`Qtx;sXF@K_9a+-d z=`%YAy_Z;9f}ZPiJYh~c_SL~aMM1{}9u#z&P9ABTqCrbPk`%Q4Z#&6KUwrZT<*{!$ zN#<y|+j?AS>-@rsIzB!xRcz}-tCvr!wS#Vdd)1Op_uiwL8#){p1=1q+3;owNb(%|z z+83CvGC{RN)-=4mL+zKZMK_wH827MPMN{8!`*CA6GU6C~J)qxqO{o=P0VzK(rvBeP zp5-?@s$5GnugraCGb@mCPS&bzEqg^RcU0_t`Fn)Y*zw}xeVtVY%ZbNiiI<{9W@}l3 z(ivS!-;?DVPfq@%H_OR7<@bD=k6`c))qXBWjC>$m8z83#aS03{%&;k`<J$LzBuRH4 zn7d&Cr@`N?#o%u^WJIMY0@*stLu0H#4&j4*bBik9Og}gUy)5%!RLmY?Ak$w2(_aAX zUromX{-C3%{pGoAJ{Yx@48`EUL7#as5jWmnL;R2Dg{`{QxOL+<lfC%zC(Rp4gcrQ> zVL({hpy)Zb{ZfA-5ua^ZH6CtGW*7iktpMI`AKP<o59p$PJ6*lSB7Vwam_28=dX%bl zUf4)wL(joG&ifyfUlBj7jx?CK6~(sew5j`PTt9JqTxd$w{*qe>n+2cxO*fw6Ho8~0 zo5vf7m9k;Re&%0fo-H1GUu<Ar?%A48^lQ@|AG^!mhNUzilrjo8YZU`twn=q+r^*Rv z)t{$J7Y()vav=(-p0BtIP4#olJEFMUDv>+<tV_y!i9v@A3i9dd$p|SHf=>I~>4r}d zLY^n$-M&c<FN~v-U&IKrX;mDb8UNwtXWOZ3@5TZgqrP*<1wn6BPmI*XTBOJBvC5dV zuV=COoJV+*`}pildaL8$+?)k!_>h2lwob;3JxBjXJkh56w}k8MDbYJu2olmUS5h-< zX9>p-K~IEDf-J}Akp{_+&jvP#gh&`IJzq>p?!kiagFY&TV4{>Cx^HmYq@%KA|LELh z!BgOUW9Tq#n||2o+<`Qi&P8Bu!#L*Vv~r;bzXj^eWi+K(=K@Wf@mE^CXH(D2e81w+ z$CG_+k-+VaNo^j0Tg^?@wjX<r_^4kbc^(&%k!#q$F6+G}(_7w-+tlU2G`akKizIYz zvs>~~0Pe{jOZY(+S3@_o<ting!ac{;6LbXVNc}_368+5|`&&`-J92*^^52S@tltj# zcc1QGWBj}1{vXYcjL)OGuLUYj*ie35KhxWLB+(I|!&TEdu~}!>euvtvxJB&-LDfCT zSl-_a*uMeC14S1s82P)f3tvG@Xqdkw7C<<x84QBn!Z_mrv|K(4s)@uTx_@aIi$-+8 z$Qb!HW3Mbk+jm9PRh*A8jkgi+27T-Oyh&*z%RR;!*5=D;yRkhVr)!&!=^ON0oE3d9 zKV=xIB*lIyZ4@+~A$y}Dd_=yyJp06AJ?v_1%`cEK+qv4x8t*!teY-1Gn2@ck#I^-W zn6;<TT1tWn+qBiOUEuY8^VE*NKXt7qgASpM;wFFfMx<_a<~x<Ls%=#w+HKnx*Qi)R z_2SHUymZ!y^xVXBJ&i?!+%}Ciq`g@}$HuJ+MuW&hI5Hb^)VPu11XJsd4cQm5Kf5|` zuahksb!%^NX)z(Iz;Mo59ASrWt(SOaELBs=pRGz95Tbe`=$&R>PlmzM4<UCXOOb2G zkCD59c2nna4r1N;9Prly4kgUJG&_by>ItQ63Jlj*gvxmWn%z%6GM9gc5LG}!;MRAo zj<X|N@);U1`L18?W;#rSjZ@yaZ`vEIO(4T#;VpHHb_Js<!1#<;X_%dHG-Lt3FsE^Q z3~sxv*4#)le3a5pI7KW-X-Is5^K6V*%_YQuod5f69J~+J$~Z<^``;1>E}gJYm7rhF zkrZbS*{hdSjgzO!^Rs$5l-vw--}UP{QHhcEx4?f4M9c|ne{Od?zm4LV>o?!3%g;=b zt_ZPzv}s_sbfE1hFheh2wf;O(SntN?ElnkWddOpU0sNkUO)0WnFT|QH<ateiiolD? z>Z*9>DwUOY2`UrM-xuNqD9g)%u2;}SW!|oSs6VCNBvp5cF<<+6FtPXHqJR^rSmY&5 ztK(6puUDIFQQCCIG5X%g(*TzAwCdGC95+ulmD4wJcNZ%=XywXkdg-R^u~;=`q@jXd zJuP?pNwSY%uAD1((qe$21VP;Oi8be?n@Y+V@U6}Tg0GR(u(6EfI~*~k8RL$N@M_^8 z$}0|fPeluwxPR!s7NUPbS{Uw?zIC!7qxAv{+^a25R$Z*2r7?==O>NOucHob0=hNoR z+qoxC<=_0}j;P>U(?j$TT67bAL{_;{iYEJczpDHW6xVOCcCD2%>N85rGOSI?xsYS_ zi@gK?tn!m?hls13L|@FED{jUoGRES=ewc@vvG4Ua&ym~EAC)A&aJDG0Nzm)Ha5=zN z^G?cO2)zH1cg3HuZ(f2tdz)4OVhP6Dm`odVj7c<a2`S)2xEfbR?y<h!3;#g5U4!Up z7a?FT>w9hMeIMnS>tQ)=5Uw8Stvi;Nu(_b#^R10Dkz<l#qR9JW!cE+OmRMocFGVRq zAMWNkHqDiynYyA{Y0eAJ4CnS>Xws;(EL75>8n?8F1s1sC9%T`G@ckG8dXk>6-zw_$ z^yL+jbv$ElWm^Yk=$9gzzZ}ky_zm3sfT4HXw!bQ6YSwQ26?wGfG>s0IX>F*8Rgu;4 zk9hT%^O2kHj>kHN8qFFA!ugz(q|A}Z2tn2G`^Kn6Z>aDP+sA?S)w?@PYFAbJ<-V)y z%+m(DrqheVou0ZN;!Iopez-DxfZ2YG*X0ubc_XNcTG#!<^y4S7lEt<*h{!(hgAY^i ztq(I7oUt!i@JsgE2SY@1crQ+7+oM&_)jhhJ=dD6^D%GT9AdmNGVyt|h78uXu^d#O_ ze_4JyaGgfdaOm~-o6%R59=}OFCqsmsE53agX)k11-Z<hopQtnD3i&3VrkBP4t(mb5 zamuNlA0Md~x;-J$F_m1q%>^EH@d%4!gNnLNehZkI%8lyLQUSK|VD`v+(R{HnM2TVI zPnl<?@V6p)`m)Z&P>{zF7I7Ml#=iR%Ulj{xS})HfNloAFrSGD7A>6TDb+1c;8o0&# zNc)j>amnr()Cih%Z1i*Z41_+?=glmY;*|?zWSzc?y#lkl%CRSAYWDI7Bm)c#qtB+O z{2EN5-|3(EHU1q>j{meuy81<_ScJZ2`S49-T8emazS)$Kv8Na4z<k;=Xaet-nk*#H zD39(a``QwwAi>(e-+0BtOpRDgf5;*M(dOO#F*DYX32)||V&{!A5=ISfo=H3?@Z?#^ zn{!!|d2^y(d8=cAsfL9!(@X{Itaat!`(Acg8&xlFbXd6xE?MGgpGctL@L-931$bH@ zIn|ps>71AoG+EtQV+({}S1>Bf$JN5q*VU6brC2Fp(bH$HyeL7uT-0WQ;E5*-9TTa$ zZZC@9JB*oPv|iQM{fqJ!6OXrAwC&wh`!tsgSl^J7ZdV5ftJ=Mf^<d)7&KvX+>`?0g zm1q1v6DaQlMOL`7pbS_hAjrt+-I==n^LvxaYZs0)Z8GKKk(CH7MJ7I`hkwe~`$a9+ zq}fxnDv`WJ;JS1;AHG~Qx5<0qC4U(&-Ln-R<2@w^$>z3YmHn$df0HC}K&1mOFpcmt zY3U!SR<<!%AQ-esYr@f>2XyP@Z)<oZf2g_Du%OH!N5o+Kd^)Br>L1GfcX$8rp|nlr zR2F;UB~|v8W4kvv2;)51NuoWj&(m*y`3r>p1<3!5aU!H*l*ujSCr3Y>u{eorQgqZ% z1@~vdBKvC^-$G`kPhVxW)%^6o&0_=xN&E_ws1IL+qN60{j=`u;#bU2*Puf<pQ)Wl_ zb~+~92tY=?H?Qb{63dEs=rqfkrE^pjXjQ7_)=+f6jC)XZ+$M$*9==vLsF^%}G&f~o zI9MWWbh8{en{yF_=<-dQRaI~M$oJeeQmw2jbQJ;IQAoHx(<hVFl8)zdYl%43#$H1? zU>{1ZNJTr;$#xnU6F|=9&|~~sWxwlFtk;1a2TFC}w4S!m!?j``AzQ=WGyav~9n|mS z>d-^?ooNXXp;MJMkMB7Qh<;xvgYnMzh{L!Z;wQ2JbK<DR?22qYP8zAVUXtNbjh$0$ ztZW?Fu~RC|Rb?|YXLmEVCc|;qoU406_nqgJ^Y=;6Xx7%?Zh-3Mdb2#35w1D3mawZ; z$AbkdF+FS-^afF$FWe^dxvT>$1_ZqNnbBN>ejH3<l`2OZDJn5J<;m@jYlm0gBoT?T z!(v$C*~uT>wpopz=jT=26Gikk)Tbj7#Wk&mrd6HTOWDa2Uykfp#F9j+`7YJPdK8@N zdqcm^?QT@2?6dYK%s}V2Ps~>n)l%Wj;7Zs*xAQRJHb;nk!C)}rQhEXlOle%ujQ*?$ z`!iuRf4Wcim=9g9?Fp-Goo=kA_zp>z%E=Epw5@g+@EsI==Aaw8KMJE1hXumGk4XI9 zVgXsmDZK`U2e$s1gbby7#)3wH-aTswssOT}zYaYBMQ2Pl7|LAe7Y1|>*3;#_q~)|# f(~Z;?-{I@Icibt7=G6wRwZAO3{{u1}cJhA#Pfe$` literal 0 HcmV?d00001 diff --git a/superset-frontend/src/visualizations/TimeTable/TimeTable.jsx b/superset-frontend/src/visualizations/TimeTable/TimeTable.jsx index 9dd76ffc1565..6843387ed20f 100644 --- a/superset-frontend/src/visualizations/TimeTable/TimeTable.jsx +++ b/superset-frontend/src/visualizations/TimeTable/TimeTable.jsx @@ -21,7 +21,7 @@ import PropTypes from 'prop-types'; import Mustache from 'mustache'; import { scaleLinear } from 'd3-scale'; import TableView from 'src/components/TableView'; -import { formatNumber, formatTime, styled } from '@superset-ui/core'; +import { formatNumber, formatTime, styled, t } from '@superset-ui/core'; import { InfoTooltipWithTrigger, MetricOption, @@ -98,12 +98,13 @@ const defaultProps = { url: '', }; +// @z-index-above-dashboard-charts + 1 = 11 const TimeTableStyles = styled.div` height: ${props => props.height}px; overflow: auto; th { - z-index: 1; // to cover sparkline + z-index: 11 !important; // to cover sparkline } `; @@ -118,7 +119,7 @@ const TimeTable = ({ }) => { const memoizedColumns = useMemo( () => [ - { accessor: 'metric', Header: 'Metric' }, + { accessor: 'metric', Header: t('Metric') }, ...columnConfigs.map((columnConfig, i) => ({ accessor: columnConfig.key, cellProps: columnConfig.colType === 'spark' && { diff --git a/superset-frontend/src/visualizations/TimeTable/controlPanel.js b/superset-frontend/src/visualizations/TimeTable/controlPanel.js index a81576b09c39..65988a5ea70a 100644 --- a/superset-frontend/src/visualizations/TimeTable/controlPanel.js +++ b/superset-frontend/src/visualizations/TimeTable/controlPanel.js @@ -17,7 +17,7 @@ * under the License. */ import { t, validateNonEmpty } from '@superset-ui/core'; -import { sections } from '@superset-ui/chart-controls'; +import { getStandardizedControls, sections } from '@superset-ui/chart-controls'; export default { controlPanelSections: [ @@ -65,4 +65,9 @@ export default { multiple: false, }, }, + formDataOverrides: formData => ({ + ...formData, + groupby: getStandardizedControls().popAllColumns(), + metrics: getStandardizedControls().popAllMetrics(), + }), }; diff --git a/superset-frontend/src/visualizations/TimeTable/images/example.jpg b/superset-frontend/src/visualizations/TimeTable/images/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e20c26506602f16a074ba86ea43f57364f698850 GIT binary patch literal 72275 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 literal 0 HcmV?d00001 diff --git a/superset-frontend/src/visualizations/TimeTable/index.ts b/superset-frontend/src/visualizations/TimeTable/index.ts index ae7f40664667..7855a3617aa5 100644 --- a/superset-frontend/src/visualizations/TimeTable/index.ts +++ b/superset-frontend/src/visualizations/TimeTable/index.ts @@ -19,6 +19,7 @@ import { t, ChartMetadata, ChartPlugin } from '@superset-ui/core'; import transformProps from './transformProps'; import thumbnail from './images/thumbnail.png'; +import example from './images/example.jpg'; import controlPanel from './controlPanel'; const metadata = new ChartMetadata({ @@ -27,6 +28,7 @@ const metadata = new ChartMetadata({ description: t( 'Compare multiple time series charts (as sparklines) and related metrics quickly.', ), + exampleGallery: [{ url: example }], tags: [ t('Multi-Variables'), t('Comparison'), diff --git a/superset-frontend/src/visualizations/presets/MainPreset.js b/superset-frontend/src/visualizations/presets/MainPreset.js index db25ff233521..11c68fd8f23c 100644 --- a/superset-frontend/src/visualizations/presets/MainPreset.js +++ b/superset-frontend/src/visualizations/presets/MainPreset.js @@ -67,6 +67,7 @@ import { EchartsTreemapChartPlugin, EchartsMixedTimeseriesChartPlugin, EchartsTreeChartPlugin, + EchartsSunburstChartPlugin, } from '@superset-ui/plugin-chart-echarts'; import { AdhocFilterPlugin, @@ -76,7 +77,7 @@ import { TimeColumnFilterPlugin, TimeGrainFilterPlugin, GroupByFilterPlugin, -} from 'src/filters/components/'; +} from 'src/filters/components'; import { PivotTableChartPlugin as PivotTableChartPluginV2 } from '@superset-ui/plugin-chart-pivot-table'; import { HandlebarsChartPlugin } from '@superset-ui/plugin-chart-handlebars'; import { @@ -193,6 +194,7 @@ export default class MainPreset extends Preset { new TimeColumnFilterPlugin().configure({ key: 'filter_timecolumn' }), new TimeGrainFilterPlugin().configure({ key: 'filter_timegrain' }), new EchartsTreeChartPlugin().configure({ key: 'tree_chart' }), + new EchartsSunburstChartPlugin().configure({ key: 'sunburst_v2' }), new HandlebarsChartPlugin().configure({ key: 'handlebars' }), ...experimentalplugins, ], diff --git a/superset-frontend/webpack.config.js b/superset-frontend/webpack.config.js index ac0b9b40f6a2..f8428e4418fb 100644 --- a/superset-frontend/webpack.config.js +++ b/superset-frontend/webpack.config.js @@ -26,6 +26,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); const SpeedMeasurePlugin = require('speed-measure-webpack-plugin'); +const createMdxCompiler = require('@storybook/addon-docs/mdx-compiler-plugin'); const { WebpackManifestPlugin, getCompilerHooks, @@ -107,7 +108,7 @@ const plugins = [ entrypoints: entryFiles, }; }, - // Also write maniafest.json to disk when running `npm run dev`. + // Also write manifest.json to disk when running `npm run dev`. // This is required for Flask to work. writeToFileEmit: isDevMode && !isDevServer, }), @@ -209,8 +210,6 @@ const config = { menu: addPreamble('src/views/menu.tsx'), spa: addPreamble('/src/views/index.tsx'), embedded: addPreamble('/src/embedded/index.tsx'), - addSlice: addPreamble('/src/addSlice/index.tsx'), - explore: addPreamble('/src/explore/index.jsx'), sqllab: addPreamble('/src/SqlLab/index.tsx'), profile: addPreamble('/src/profile/index.tsx'), showSavedQuery: [path.join(APP_DIR, '/src/showSavedQuery/index.jsx')], @@ -290,6 +289,9 @@ const config = { // AntD version conflict has been resolved antd: path.resolve(path.join(APP_DIR, './node_modules/antd')), react: path.resolve(path.join(APP_DIR, './node_modules/react')), + // TODO: remove Handlebars alias once Handlebars NPM package has been updated to + // correctly support webpack import (https://github.com/handlebars-lang/handlebars.js/issues/953) + handlebars: 'handlebars/dist/handlebars.js', }, extensions: ['.ts', '.tsx', '.js', '.jsx', '.yml'], fallback: { @@ -323,7 +325,7 @@ const config = { transpileOnly: true, // must override compiler options here, even though we have set // the same options in `tsconfig.json`, because they may still - // be overriden by `tsconfig.json` in node_modules subdirectories. + // be overridden by `tsconfig.json` in node_modules subdirectories. compilerOptions: { esModuleInterop: false, importHelpers: false, @@ -385,6 +387,9 @@ const config = { sourceMap: true, lessOptions: { javascriptEnabled: true, + modifyVars: { + 'root-entry-name': 'default', + }, }, }, }, @@ -444,6 +449,24 @@ const config = { test: /\.geojson$/, type: 'asset/resource', }, + { + test: /\.mdx$/, + use: [ + { + loader: 'babel-loader', + // may or may not need this line depending on your app's setup + options: { + plugins: ['@babel/plugin-transform-react-jsx'], + }, + }, + { + loader: '@mdx-js/loader', + options: { + compilers: [createMdxCompiler({})], + }, + }, + ], + }, ], }, externals: { diff --git a/superset-websocket/.nvmrc b/superset-websocket/.nvmrc index ab155ce138b8..4be2b935c508 100644 --- a/superset-websocket/.nvmrc +++ b/superset-websocket/.nvmrc @@ -1 +1 @@ -v14.15.5 +v16.9.1 diff --git a/superset-websocket/Dockerfile b/superset-websocket/Dockerfile index 85ff66520dd2..4cc2117f07a3 100644 --- a/superset-websocket/Dockerfile +++ b/superset-websocket/Dockerfile @@ -12,13 +12,28 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -FROM node:16 +FROM node:16-alpine as build WORKDIR /home/superset-websocket -COPY . . +COPY . ./ -RUN npm ci -RUN npm run build +RUN npm ci && \ + npm run build -CMD ["npm", "start"] + +FROM node:16-alpine + +ENV NODE_ENV=production +WORKDIR /home/superset-websocket + +COPY --from=build /home/superset-websocket/dist ./dist +COPY package*.json ./ + +# Only install production dependencies +RUN npm ci --omit=dev + +# Don't run as root! +USER node + +CMD [ "npm", "start" ] diff --git a/superset-websocket/README.md b/superset-websocket/README.md index 9a61d70025a0..a0c7563b1f36 100644 --- a/superset-websocket/README.md +++ b/superset-websocket/README.md @@ -57,7 +57,7 @@ In addition to periodic socket connection cleanup, the internal _channels_ regis Install dependencies: ``` -npm install +npm ci ``` ## WebSocket Server Configuration diff --git a/superset-websocket/package-lock.json b/superset-websocket/package-lock.json index 808666237672..52fb4e26ea56 100644 --- a/superset-websocket/package-lock.json +++ b/superset-websocket/package-lock.json @@ -9,35 +9,35 @@ "version": "0.0.1", "license": "Apache-2.0", "dependencies": { - "cookie": "^0.4.1", - "hot-shots": "^9.0.0", + "cookie": "^0.5.0", + "hot-shots": "^10.0.0", "ioredis": "^4.28.0", - "jsonwebtoken": "^8.5.1", - "uuid": "^8.3.2", - "winston": "^3.3.3", - "ws": "^8.2.3" + "jsonwebtoken": "^9.0.0", + "uuid": "^9.0.0", + "winston": "^3.8.2", + "ws": "^8.12.1" }, "devDependencies": { - "@types/cookie": "^0.4.1", + "@types/cookie": "^0.5.1", "@types/ioredis": "^4.27.8", "@types/jest": "^27.0.2", - "@types/jsonwebtoken": "^8.5.5", - "@types/node": "^16.11.6", - "@types/uuid": "^8.3.1", - "@types/ws": "^8.2.0", - "@typescript-eslint/eslint-plugin": "^4.19.0", - "@typescript-eslint/parser": "^4.19.0", - "eslint": "^7.32.0", - "eslint-config-prettier": "^7.1.0", + "@types/jsonwebtoken": "^9.0.1", + "@types/node": "^18.13.0", + "@types/uuid": "^9.0.0", + "@types/ws": "^8.5.4", + "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/parser": "^5.51.0", + "eslint": "^8.34.0", + "eslint-config-prettier": "^8.6.0", "jest": "^27.3.1", - "prettier": "^2.4.1", + "prettier": "^2.8.4", "ts-jest": "^27.0.7", - "ts-node": "^9.1.1", - "typescript": "^4.2.3" + "ts-node": "^10.9.1", + "typescript": "^4.9.5" }, "engines": { "node": "^16.9.1", - "npm": "^7.5.4" + "npm": "^7.5.4 || ^8.1.2" } }, "node_modules/@babel/code-frame": { @@ -635,6 +635,26 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@dabh/diagnostics": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", @@ -646,29 +666,38 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "dependencies": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -680,20 +709,45 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -1005,13 +1059,38 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -1019,21 +1098,21 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -1067,6 +1146,30 @@ "node": ">= 6" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.1.16", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", @@ -1109,9 +1212,9 @@ } }, "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", + "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", "dev": true }, "node_modules/@types/graceful-fs": { @@ -1167,24 +1270,24 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "node_modules/@types/jsonwebtoken": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.5.tgz", - "integrity": "sha512-OGqtHQ7N5/Ap/TUwO6IgHDuLiAoTmHhGpNvgkCm/F4N6pKzx/RBSfr2OXZSwC6vkfnsEdb6+7DNZVtiXiwdwFw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", "dev": true }, "node_modules/@types/prettier": { @@ -1193,6 +1296,12 @@ "integrity": "sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -1200,15 +1309,15 @@ "dev": true }, "node_modules/@types/uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==", "dev": true }, "node_modules/@types/ws": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.0.tgz", - "integrity": "sha512-cyeefcUCgJlEk+hk2h3N+MqKKsPViQgF5boi9TTHSK+PoR9KWBb/C5ccPcDyAqgsbAYHTwulch725DV84+pSpg==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", "dev": true, "dependencies": { "@types/node": "*" @@ -1230,137 +1339,405 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.19.0.tgz", - "integrity": "sha512-CRQNQ0mC2Pa7VLwKFbrGVTArfdVDdefS+gTw0oC98vSI98IX5A8EVH4BzJ2FOB0YlCmm8Im36Elad/Jgtvveaw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", + "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.19.0", - "@typescript-eslint/scope-manager": "4.19.0", - "debug": "^4.1.1", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/type-utils": "5.52.0", + "@typescript-eslint/utils": "5.52.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.19.0.tgz", - "integrity": "sha512-9/23F1nnyzbHKuoTqFN1iXwN3bvOm/PRIXSBR3qFAYotK/0LveEOHr5JT1WZSzcD6BESl8kPOG3OoDRKO84bHA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.19.0", - "@typescript-eslint/types": "4.19.0", - "@typescript-eslint/typescript-estree": "4.19.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.19.0.tgz", - "integrity": "sha512-/uabZjo2ZZhm66rdAu21HA8nQebl3lAIDcybUoOxoI7VbZBYavLIwtOOmykKCJy+Xq6Vw6ugkiwn8Js7D6wieA==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.51.0.tgz", + "integrity": "sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.19.0", - "@typescript-eslint/types": "4.19.0", - "@typescript-eslint/typescript-estree": "4.19.0", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/typescript-estree": "5.51.0", + "debug": "^4.3.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.19.0.tgz", - "integrity": "sha512-GGy4Ba/hLXwJXygkXqMzduqOMc+Na6LrJTZXJWVhRrSuZeXmu8TAnniQVKgj8uTRKe4igO2ysYzH+Np879G75g==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", + "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", + "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/utils": "5.52.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.19.0", - "@typescript-eslint/visitor-keys": "4.19.0" + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.19.0.tgz", - "integrity": "sha512-A4iAlexVvd4IBsSTNxdvdepW0D4uR/fwxDrKUa+iEY9UWvGREu2ZyB8ylTENM1SH8F7bVC9ac9+si3LWNxcBuA==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", + "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", "dev": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.19.0.tgz", - "integrity": "sha512-3xqArJ/A62smaQYRv2ZFyTA+XxGGWmlDYrsfZG68zJeNbeqRScnhf81rUVa6QG4UgzHnXw5VnMT5cg75dQGDkA==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", + "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.19.0", - "@typescript-eslint/visitor-keys": "4.19.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@typescript-eslint/utils": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", + "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.19.0.tgz", - "integrity": "sha512-aGPS6kz//j7XLSlgpzU2SeTqHPsmRYxFztj2vPuMMFJXZudpRSehE3WCV+BaxwZFvfAqMoSd86TEuM0PQ59E/A==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", + "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.19.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.51.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/abab": { @@ -1437,15 +1814,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1531,15 +1899,6 @@ "node": ">=8" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", @@ -1911,14 +2270,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/colorspace": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", @@ -1956,18 +2307,13 @@ } }, "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -2027,14 +2373,19 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decimal.js": { @@ -2190,18 +2541,6 @@ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2252,66 +2591,65 @@ } }, "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", "dev": true, "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-prettier": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", - "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -2334,24 +2672,21 @@ } }, "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, "node_modules/eslint-visitor-keys": { @@ -2363,14 +2698,11 @@ "node": ">=10" } }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", @@ -2384,16 +2716,90 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/eslint/node_modules/globals": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.7.0.tgz", - "integrity": "sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/eslint/node_modules/levn": { @@ -2409,6 +2815,21 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -2426,28 +2847,43 @@ "node": ">= 0.8.0" } }, - "node_modules/eslint/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "p-limit": "^3.0.2" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/eslint/node_modules/type-check": { @@ -2463,26 +2899,41 @@ } }, "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/esprima": { @@ -2626,20 +3077,19 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { @@ -2654,15 +3104,10 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -2678,9 +3123,9 @@ } }, "node_modules/fecha": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", - "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "node_modules/file-entry-cache": { "version": "6.0.1", @@ -2789,12 +3234,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2873,29 +3312,23 @@ } }, "node_modules/globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { "node": ">=10" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/graceful-fs": { @@ -2904,6 +3337,12 @@ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2926,14 +3365,14 @@ } }, "node_modules/hot-shots": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-9.0.0.tgz", - "integrity": "sha512-fpljto22PvfzDGznnzUpWgFMgccyZRtWo+fY8R4ktwipkv3ywDyeaTLijYaM629DEZvtnEDAN00yV6zxzivnpQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-10.0.0.tgz", + "integrity": "sha512-uy/uGpuJk7yuyiKRfZMBNkF1GAOX5O2ifO9rDCaX9jw8fu6eW9QeWC7WRPDI+O98frW1HQgV3+xwjWsZPECIzQ==", "engines": { - "node": ">=6.0.0" + "node": ">=10.0.0" }, "optionalDependencies": { - "unix-dgram": "2.0.x" + "unix-dgram": "2.x" } }, "node_modules/html-encoding-sniffer": { @@ -3003,9 +3442,9 @@ } }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", "dev": true, "engines": { "node": ">= 4" @@ -3141,9 +3580,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" @@ -3161,6 +3600,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -3184,11 +3632,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3794,21 +4237,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-util": { "version": "27.3.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.3.1.tgz", @@ -3902,6 +4330,16 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4025,13 +4463,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -4040,24 +4475,18 @@ } }, "node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", "dependencies": { "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", + "lodash": "^4.17.21", "ms": "^2.1.1", - "semver": "^5.6.0" + "semver": "^7.3.8" }, "engines": { - "node": ">=4", - "npm": ">=1.4.28" + "node": ">=12", + "npm": ">=6" } }, "node_modules/jwa": { @@ -4130,14 +4559,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.defaults": { "version": "4.2.0", @@ -4149,40 +4571,10 @@ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, "node_modules/lodash.isarguments": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" }, "node_modules/lodash.memoize": { "version": "4.1.2", @@ -4196,26 +4588,15 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, "node_modules/logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.2.tgz", + "integrity": "sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw==", "dependencies": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", + "@colors/colors": "1.5.0", "fecha": "^4.2.0", "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" } }, @@ -4223,7 +4604,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -4329,9 +4709,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -4340,12 +4720,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4363,6 +4737,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4616,15 +4996,18 @@ } }, "node_modules/prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-format": { @@ -4654,20 +5037,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -4700,7 +5069,21 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/react-is": { "version": "17.0.1", @@ -4746,12 +5129,15 @@ } }, "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/require-directory": { @@ -4763,15 +5149,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -4842,6 +5219,20 @@ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { "queue-microtask": "^1.2.2" } @@ -4851,6 +5242,14 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/safe-stable-stringify": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz", + "integrity": "sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4870,11 +5269,17 @@ } }, "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/shebang-command": { @@ -4932,23 +5337,6 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5135,45 +5523,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "node_modules/table": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", - "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -5319,42 +5668,68 @@ } } }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "dependencies": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.17", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=10.0.0" + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" } }, "node_modules/tslib": { @@ -5418,9 +5793,9 @@ } }, "node_modules/typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5468,17 +5843,17 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, "node_modules/v8-to-istanbul": { @@ -5588,58 +5963,39 @@ } }, "node_modules/winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", + "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", "dependencies": { + "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", + "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.2.0", + "logform": "^2.4.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" + "winston-transport": "^4.5.0" }, "engines": { - "node": ">= 6.4.0" + "node": ">= 12.0.0" } }, "node_modules/winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", "dependencies": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" }, "engines": { "node": ">= 6.4.0" } }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/winston-transport/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -5685,15 +6041,15 @@ } }, "node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -5728,8 +6084,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { "version": "16.2.0", @@ -5766,6 +6121,18 @@ "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { @@ -6221,6 +6588,20 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, "@dabh/diagnostics": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", @@ -6232,44 +6613,65 @@ } }, "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } } } }, "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -6517,29 +6919,51 @@ "chalk": "^4.0.0" } }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, @@ -6567,6 +6991,30 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, "@types/babel__core": { "version": "7.1.16", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", @@ -6609,9 +7057,9 @@ } }, "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", + "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", "dev": true }, "@types/graceful-fs": { @@ -6667,24 +7115,24 @@ } }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/jsonwebtoken": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.5.tgz", - "integrity": "sha512-OGqtHQ7N5/Ap/TUwO6IgHDuLiAoTmHhGpNvgkCm/F4N6pKzx/RBSfr2OXZSwC6vkfnsEdb6+7DNZVtiXiwdwFw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", "dev": true }, "@types/prettier": { @@ -6693,6 +7141,12 @@ "integrity": "sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw==", "dev": true }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -6700,15 +7154,15 @@ "dev": true }, "@types/uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==", "dev": true }, "@types/ws": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.0.tgz", - "integrity": "sha512-cyeefcUCgJlEk+hk2h3N+MqKKsPViQgF5boi9TTHSK+PoR9KWBb/C5ccPcDyAqgsbAYHTwulch725DV84+pSpg==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", "dev": true, "requires": { "@types/node": "*" @@ -6730,108 +7184,232 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.19.0.tgz", - "integrity": "sha512-CRQNQ0mC2Pa7VLwKFbrGVTArfdVDdefS+gTw0oC98vSI98IX5A8EVH4BzJ2FOB0YlCmm8Im36Elad/Jgtvveaw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", + "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/type-utils": "5.52.0", + "@typescript-eslint/utils": "5.52.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" + } + }, + "@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + } + } + }, + "@typescript-eslint/parser": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.51.0.tgz", + "integrity": "sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.19.0", - "@typescript-eslint/scope-manager": "4.19.0", - "debug": "^4.1.1", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/typescript-estree": "5.51.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", + "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", + "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/utils": "5.52.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" }, "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true } } }, - "@typescript-eslint/experimental-utils": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.19.0.tgz", - "integrity": "sha512-9/23F1nnyzbHKuoTqFN1iXwN3bvOm/PRIXSBR3qFAYotK/0LveEOHr5JT1WZSzcD6BESl8kPOG3OoDRKO84bHA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.19.0", - "@typescript-eslint/types": "4.19.0", - "@typescript-eslint/typescript-estree": "4.19.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.19.0.tgz", - "integrity": "sha512-/uabZjo2ZZhm66rdAu21HA8nQebl3lAIDcybUoOxoI7VbZBYavLIwtOOmykKCJy+Xq6Vw6ugkiwn8Js7D6wieA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.19.0", - "@typescript-eslint/types": "4.19.0", - "@typescript-eslint/typescript-estree": "4.19.0", - "debug": "^4.1.1" - } + "@typescript-eslint/types": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", + "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", + "dev": true }, - "@typescript-eslint/scope-manager": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.19.0.tgz", - "integrity": "sha512-GGy4Ba/hLXwJXygkXqMzduqOMc+Na6LrJTZXJWVhRrSuZeXmu8TAnniQVKgj8uTRKe4igO2ysYzH+Np879G75g==", + "@typescript-eslint/typescript-estree": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", + "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.19.0", - "@typescript-eslint/visitor-keys": "4.19.0" + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" } }, - "@typescript-eslint/types": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.19.0.tgz", - "integrity": "sha512-A4iAlexVvd4IBsSTNxdvdepW0D4uR/fwxDrKUa+iEY9UWvGREu2ZyB8ylTENM1SH8F7bVC9ac9+si3LWNxcBuA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.19.0.tgz", - "integrity": "sha512-3xqArJ/A62smaQYRv2ZFyTA+XxGGWmlDYrsfZG68zJeNbeqRScnhf81rUVa6QG4UgzHnXw5VnMT5cg75dQGDkA==", + "@typescript-eslint/utils": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", + "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.19.0", - "@typescript-eslint/visitor-keys": "4.19.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" }, "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "@typescript-eslint/scope-manager": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" + } + }, + "@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true } } }, "@typescript-eslint/visitor-keys": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.19.0.tgz", - "integrity": "sha512-aGPS6kz//j7XLSlgpzU2SeTqHPsmRYxFztj2vPuMMFJXZudpRSehE3WCV+BaxwZFvfAqMoSd86TEuM0PQ59E/A==", + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", + "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.19.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.51.0", + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + } } }, "abab": { @@ -6890,12 +7468,6 @@ "uri-js": "^4.2.2" } }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -6959,12 +7531,6 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, "async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", @@ -7271,11 +7837,6 @@ "simple-swizzle": "^0.2.2" } }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, "colorspace": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", @@ -7310,14 +7871,9 @@ } }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "create-require": { "version": "1.1.1", @@ -7371,9 +7927,9 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -7497,15 +8053,6 @@ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -7540,61 +8087,57 @@ } }, "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", "dev": true, "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "escape-string-regexp": { "version": "4.0.0", @@ -7602,15 +8145,65 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, "globals": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.7.0.tgz", - "integrity": "sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -7621,6 +8214,15 @@ "type-check": "~0.4.0" } }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -7635,21 +8237,30 @@ "word-wrap": "^1.2.3" } }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7662,9 +8273,9 @@ } }, "eslint-config-prettier": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", - "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", "dev": true, "requires": {} }, @@ -7679,20 +8290,12 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "eslint-visitor-keys": "^2.0.0" } }, "eslint-visitor-keys": { @@ -7702,20 +8305,26 @@ "dev": true }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" }, "dependencies": { + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true } } @@ -7824,17 +8433,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -7849,15 +8457,10 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -7873,9 +8476,9 @@ } }, "fecha": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", - "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "file-entry-cache": { "version": "6.0.1", @@ -7962,12 +8565,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -8022,25 +8619,17 @@ "dev": true }, "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } } }, "graceful-fs": { @@ -8049,6 +8638,12 @@ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -8065,11 +8660,11 @@ "dev": true }, "hot-shots": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-9.0.0.tgz", - "integrity": "sha512-fpljto22PvfzDGznnzUpWgFMgccyZRtWo+fY8R4ktwipkv3ywDyeaTLijYaM629DEZvtnEDAN00yV6zxzivnpQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-10.0.0.tgz", + "integrity": "sha512-uy/uGpuJk7yuyiKRfZMBNkF1GAOX5O2ifO9rDCaX9jw8fu6eW9QeWC7WRPDI+O98frW1HQgV3+xwjWsZPECIzQ==", "requires": { - "unix-dgram": "2.0.x" + "unix-dgram": "2.x" } }, "html-encoding-sniffer": { @@ -8124,9 +8719,9 @@ } }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", "dev": true }, "import-fresh": { @@ -8224,9 +8819,9 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -8238,6 +8833,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -8255,11 +8856,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -8735,17 +9331,6 @@ "natural-compare": "^1.4.0", "pretty-format": "^27.3.1", "semver": "^7.3.2" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "jest-util": { @@ -8821,6 +9406,12 @@ } } }, + "js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8906,29 +9497,20 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true }, "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", "requires": { "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", + "lodash": "^4.17.21", "ms": "^2.1.1", - "semver": "^5.6.0" + "semver": "^7.3.8" } }, "jwa": { @@ -8989,14 +9571,7 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.defaults": { "version": "4.2.0", @@ -9008,41 +9583,11 @@ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -9055,26 +9600,15 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, "logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.2.tgz", + "integrity": "sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw==", "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", + "@colors/colors": "1.5.0", "fecha": "^4.2.0", "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" } }, @@ -9082,7 +9616,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -9163,20 +9696,14 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -9194,6 +9721,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -9384,9 +9917,9 @@ "dev": true }, "prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "dev": true }, "pretty-format": { @@ -9409,17 +9942,6 @@ } } }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -9483,9 +10005,9 @@ } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "require-directory": { @@ -9494,12 +10016,6 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -9560,6 +10076,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safe-stable-stringify": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz", + "integrity": "sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==" + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -9576,9 +10097,12 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } }, "shebang-command": { "version": "2.0.0", @@ -9628,17 +10152,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9776,40 +10289,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "table": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", - "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -9908,31 +10387,41 @@ "make-error": "1.x", "semver": "7.x", "yargs-parser": "20.x" - }, - "dependencies": { - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "requires": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.17", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" + }, + "dependencies": { + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + } } }, "tslib": { @@ -9981,9 +10470,9 @@ } }, "typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "universalify": { @@ -10017,14 +10506,14 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, "v8-to-istanbul": { @@ -10115,52 +10604,31 @@ } }, "winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", + "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", "requires": { + "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", + "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.2.0", + "logform": "^2.4.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" + "winston-transport": "^4.5.0" } }, "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" } }, "word-wrap": { @@ -10199,9 +10667,9 @@ } }, "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", "requires": {} }, "xml-name-validator": { @@ -10225,8 +10693,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { "version": "16.2.0", @@ -10254,6 +10721,12 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/superset-websocket/package.json b/superset-websocket/package.json index 4967e36141e8..453a019c08f7 100644 --- a/superset-websocket/package.json +++ b/superset-websocket/package.json @@ -15,34 +15,34 @@ }, "license": "Apache-2.0", "dependencies": { - "cookie": "^0.4.1", - "hot-shots": "^9.0.0", + "cookie": "^0.5.0", + "hot-shots": "^10.0.0", "ioredis": "^4.28.0", - "jsonwebtoken": "^8.5.1", - "uuid": "^8.3.2", - "winston": "^3.3.3", - "ws": "^8.2.3" + "jsonwebtoken": "^9.0.0", + "uuid": "^9.0.0", + "winston": "^3.8.2", + "ws": "^8.12.1" }, "devDependencies": { - "@types/cookie": "^0.4.1", + "@types/cookie": "^0.5.1", "@types/ioredis": "^4.27.8", "@types/jest": "^27.0.2", - "@types/jsonwebtoken": "^8.5.5", - "@types/node": "^16.11.6", - "@types/uuid": "^8.3.1", - "@types/ws": "^8.2.0", - "@typescript-eslint/eslint-plugin": "^4.19.0", - "@typescript-eslint/parser": "^4.19.0", - "eslint": "^7.32.0", - "eslint-config-prettier": "^7.1.0", + "@types/jsonwebtoken": "^9.0.1", + "@types/node": "^18.13.0", + "@types/uuid": "^9.0.0", + "@types/ws": "^8.5.4", + "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/parser": "^5.51.0", + "eslint": "^8.34.0", + "eslint-config-prettier": "^8.6.0", "jest": "^27.3.1", - "prettier": "^2.4.1", + "prettier": "^2.8.4", "ts-jest": "^27.0.7", - "ts-node": "^9.1.1", - "typescript": "^4.2.3" + "ts-node": "^10.9.1", + "typescript": "^4.9.5" }, "engines": { "node": "^16.9.1", - "npm": "^7.5.4" + "npm": "^7.5.4 || ^8.1.2" } } diff --git a/superset-websocket/spec/index.test.ts b/superset-websocket/spec/index.test.ts index 320f13b4451e..ca575e9e8af5 100644 --- a/superset-websocket/spec/index.test.ts +++ b/superset-websocket/spec/index.test.ts @@ -98,7 +98,7 @@ describe('server', () => { expect(endMock).toHaveBeenLastCalledWith('OK'); }); - test('reponds with a 404 when not found', () => { + test('responds with a 404 when not found', () => { const endMock = jest.fn(); const writeHeadMock = jest.fn(); diff --git a/superset-websocket/utils/client-ws-app/package-lock.json b/superset-websocket/utils/client-ws-app/package-lock.json index 3d24b6358e76..e266ae36953b 100644 --- a/superset-websocket/utils/client-ws-app/package-lock.json +++ b/superset-websocket/utils/client-ws-app/package-lock.json @@ -8,11 +8,11 @@ "name": "client-ws-app", "version": "0.0.0", "dependencies": { - "cookie-parser": "~1.4.5", - "debug": "~4.3.2", - "express": "~4.17.1", - "http-errors": "~1.8.0", - "jsonwebtoken": "^8.5.1", + "cookie-parser": "~1.4.6", + "debug": "~4.3.4", + "express": "~4.18.2", + "http-errors": "~2.0.0", + "jsonwebtoken": "^9.0.0", "morgan": "~1.10.0", "pug": "~3.0.2" } @@ -49,12 +49,12 @@ } }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -109,23 +109,26 @@ } }, "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/debug": { @@ -136,40 +139,31 @@ "ms": "2.0.0" } }, - "node_modules/body-parser/node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/body-parser/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } @@ -204,16 +198,35 @@ } }, "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -223,34 +236,42 @@ } }, "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", - "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", "dependencies": { - "cookie": "0.4.0", + "cookie": "0.4.1", "cookie-signature": "1.0.6" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -264,17 +285,21 @@ } }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/doctypes": { "version": "1.1.0", @@ -297,7 +322,7 @@ "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } @@ -305,48 +330,49 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } }, "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -368,17 +394,47 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { @@ -396,7 +452,18 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/forwarded": { "version": "0.2.0", @@ -409,7 +476,7 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } @@ -469,25 +536,20 @@ } }, "node_modules/http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -558,24 +620,18 @@ "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" }, "node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", "dependencies": { "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", + "lodash": "^4.17.21", "ms": "^2.1.1", - "semver": "^5.6.0" + "semver": "^7.3.8" }, "engines": { - "node": ">=4", - "npm": ">=1.4.28" + "node": ">=12", + "npm": ">=6" } }, "node_modules/jsonwebtoken/node_modules/ms": { @@ -611,45 +667,26 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { "node": ">= 0.6" } @@ -679,19 +716,19 @@ } }, "node_modules/mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.49.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -720,14 +757,6 @@ "ms": "2.0.0" } }, - "node_modules/morgan/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/morgan/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -739,9 +768,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } @@ -754,6 +783,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -924,11 +961,17 @@ "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" }, "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/range-parser": { @@ -940,12 +983,12 @@ } }, "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -953,26 +996,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -996,31 +1019,37 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -1037,53 +1066,62 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/send/node_modules/http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/to-fast-properties": { @@ -1095,9 +1133,9 @@ } }, "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } @@ -1122,7 +1160,7 @@ "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } @@ -1164,6 +1202,11 @@ "engines": { "node": ">= 10.0.0" } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } }, "dependencies": { @@ -1187,12 +1230,12 @@ } }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -1232,20 +1275,22 @@ } }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "debug": { @@ -1256,27 +1301,18 @@ "ms": "2.0.0" } }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } } } }, @@ -1286,9 +1322,9 @@ "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "call-bind": { "version": "1.0.2", @@ -1317,11 +1353,18 @@ } }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "content-type": { @@ -1330,17 +1373,24 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", - "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", "requires": { - "cookie": "0.4.0", + "cookie": "0.4.1", "cookie-signature": "1.0.6" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + } } }, "cookie-signature": { @@ -1349,22 +1399,22 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "doctypes": { "version": "1.1.0", @@ -1387,50 +1437,51 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -1448,20 +1499,33 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "dependencies": { @@ -1476,7 +1540,15 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } } } }, @@ -1488,7 +1560,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "function-bind": { "version": "1.1.1", @@ -1527,22 +1599,15 @@ } }, "http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - } + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, "iconv-lite": { @@ -1600,20 +1665,14 @@ "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" }, "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", "requires": { "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", + "lodash": "^4.17.21", "ms": "^2.1.1", - "semver": "^5.6.0" + "semver": "^7.3.8" }, "dependencies": { "ms": { @@ -1651,45 +1710,23 @@ "safe-buffer": "^5.0.1" } }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "merge-descriptors": { "version": "1.0.1", @@ -1707,16 +1744,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.49.0" + "mime-db": "1.52.0" } }, "morgan": { @@ -1739,11 +1776,6 @@ "ms": "2.0.0" } }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1757,15 +1789,20 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -1924,9 +1961,12 @@ "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } }, "range-parser": { "version": "1.2.1", @@ -1934,33 +1974,14 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" - }, - "dependencies": { - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } } }, "resolve": { @@ -1983,28 +2004,31 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -2018,49 +2042,55 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "ee-first": "1.1.1" } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "to-fast-properties": { "version": "2.0.0", @@ -2068,9 +2098,9 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "token-stream": { "version": "1.0.0", @@ -2089,7 +2119,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "utils-merge": { "version": "1.0.1", @@ -2116,6 +2146,11 @@ "assert-never": "^1.2.1", "babel-walk": "3.0.0-canary-5" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/superset-websocket/utils/client-ws-app/package.json b/superset-websocket/utils/client-ws-app/package.json index 39b5465d123d..d2be76c94213 100644 --- a/superset-websocket/utils/client-ws-app/package.json +++ b/superset-websocket/utils/client-ws-app/package.json @@ -6,11 +6,11 @@ "start": "node ./bin/www" }, "dependencies": { - "cookie-parser": "~1.4.5", - "debug": "~4.3.2", - "express": "~4.17.1", - "http-errors": "~1.8.0", - "jsonwebtoken": "^8.5.1", + "cookie-parser": "~1.4.6", + "debug": "~4.3.4", + "express": "~4.18.2", + "http-errors": "~2.0.0", + "jsonwebtoken": "^9.0.0", "morgan": "~1.10.0", "pug": "~3.0.2" } diff --git a/superset-websocket/utils/client-ws-app/views/index.pug b/superset-websocket/utils/client-ws-app/views/index.pug index 3b1efc7fbff9..2322bec5805c 100644 --- a/superset-websocket/utils/client-ws-app/views/index.pug +++ b/superset-websocket/utils/client-ws-app/views/index.pug @@ -24,7 +24,7 @@ block content div Sockets connected: span#socket-count 0 - div Messages recevied: + div Messages received: span#message-count 0 div Last message received: code#message-debug diff --git a/superset/__init__.py b/superset/__init__.py index 6df897f3ecdb..5c8ff3ca2dc5 100644 --- a/superset/__init__.py +++ b/superset/__init__.py @@ -19,7 +19,6 @@ from werkzeug.local import LocalProxy from superset.app import create_app -from superset.connectors.connector_registry import ConnectorRegistry from superset.extensions import ( appbuilder, cache_manager, diff --git a/superset/advanced_data_type/api.py b/superset/advanced_data_type/api.py index 87a820e4410c..b22efa708838 100644 --- a/superset/advanced_data_type/api.py +++ b/superset/advanced_data_type/api.py @@ -18,7 +18,7 @@ from flask import current_app as app from flask.wrappers import Response -from flask_appbuilder.api import BaseApi, expose, permission_name, protect, rison, safe +from flask_appbuilder.api import expose, permission_name, protect, rison, safe from flask_babel import lazy_gettext as _ from superset.advanced_data_type.schemas import ( @@ -27,12 +27,13 @@ ) from superset.advanced_data_type.types import AdvancedDataTypeResponse from superset.extensions import event_logger +from superset.views.base_api import BaseSupersetApi config = app.config ADVANCED_DATA_TYPES = config["ADVANCED_DATA_TYPES"] -class AdvancedDataTypeRestApi(BaseApi): +class AdvancedDataTypeRestApi(BaseSupersetApi): """ Advanced Data Type Rest API -Will return available AdvancedDataTypes when the /types endpoint is accessed @@ -41,7 +42,6 @@ class AdvancedDataTypeRestApi(BaseApi): """ allow_browser_login = True - include_route_methods = {"get", "get_types"} resource_name = "advanced_data_type" class_permission_name = "AdvancedDataType" diff --git a/superset/annotation_layers/annotations/api.py b/superset/annotation_layers/annotations/api.py index 291c074fa358..c0af2dce6f00 100644 --- a/superset/annotation_layers/annotations/api.py +++ b/superset/annotation_layers/annotations/api.py @@ -17,7 +17,7 @@ import logging from typing import Any, Dict -from flask import g, request, Response +from flask import request, Response from flask_appbuilder.api import expose, permission_name, protect, rison, safe from flask_appbuilder.api.schemas import get_item_schema, get_list_schema from flask_appbuilder.models.sqla.interface import SQLAInterface @@ -306,7 +306,7 @@ def post(self, pk: int) -> Response: # pylint: disable=arguments-differ except ValidationError as error: return self.response_400(message=error.messages) try: - new_model = CreateAnnotationCommand(g.user, item).run() + new_model = CreateAnnotationCommand(item).run() return self.response(201, id=new_model.id, result=item) except AnnotationLayerNotFoundError as ex: return self.response_400(message=str(ex)) @@ -381,7 +381,7 @@ def put( # pylint: disable=arguments-differ except ValidationError as error: return self.response_400(message=error.messages) try: - new_model = UpdateAnnotationCommand(g.user, annotation_id, item).run() + new_model = UpdateAnnotationCommand(annotation_id, item).run() return self.response(200, id=new_model.id, result=item) except (AnnotationNotFoundError, AnnotationLayerNotFoundError): return self.response_404() @@ -438,7 +438,7 @@ def delete( # pylint: disable=arguments-differ $ref: '#/components/responses/500' """ try: - DeleteAnnotationCommand(g.user, annotation_id).run() + DeleteAnnotationCommand(annotation_id).run() return self.response(200, message="OK") except AnnotationNotFoundError: return self.response_404() @@ -495,7 +495,7 @@ def bulk_delete(self, **kwargs: Any) -> Response: """ item_ids = kwargs["rison"] try: - BulkDeleteAnnotationCommand(g.user, item_ids).run() + BulkDeleteAnnotationCommand(item_ids).run() return self.response( 200, message=ngettext( diff --git a/superset/annotation_layers/annotations/commands/bulk_delete.py b/superset/annotation_layers/annotations/commands/bulk_delete.py index 6a164c877da8..113725050fd8 100644 --- a/superset/annotation_layers/annotations/commands/bulk_delete.py +++ b/superset/annotation_layers/annotations/commands/bulk_delete.py @@ -17,8 +17,6 @@ import logging from typing import List, Optional -from flask_appbuilder.security.sqla.models import User - from superset.annotation_layers.annotations.commands.exceptions import ( AnnotationBulkDeleteFailedError, AnnotationNotFoundError, @@ -32,8 +30,7 @@ class BulkDeleteAnnotationCommand(BaseCommand): - def __init__(self, user: User, model_ids: List[int]): - self._actor = user + def __init__(self, model_ids: List[int]): self._model_ids = model_ids self._models: Optional[List[Annotation]] = None diff --git a/superset/annotation_layers/annotations/commands/create.py b/superset/annotation_layers/annotations/commands/create.py index d745df121f7c..26cd968c5a1f 100644 --- a/superset/annotation_layers/annotations/commands/create.py +++ b/superset/annotation_layers/annotations/commands/create.py @@ -19,7 +19,6 @@ from typing import Any, Dict, List, Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError from superset.annotation_layers.annotations.commands.exceptions import ( @@ -38,8 +37,7 @@ class CreateAnnotationCommand(BaseCommand): - def __init__(self, user: User, data: Dict[str, Any]): - self._actor = user + def __init__(self, data: Dict[str, Any]): self._properties = data.copy() def run(self) -> Model: @@ -72,7 +70,7 @@ def validate(self) -> None: # validate date time sanity if start_dttm and end_dttm and end_dttm < start_dttm: - exceptions.append(AnnotationDatesValidationError) + exceptions.append(AnnotationDatesValidationError()) if exceptions: exception = AnnotationInvalidError() diff --git a/superset/annotation_layers/annotations/commands/delete.py b/superset/annotation_layers/annotations/commands/delete.py index 3d874818dc6c..915f7f80cef6 100644 --- a/superset/annotation_layers/annotations/commands/delete.py +++ b/superset/annotation_layers/annotations/commands/delete.py @@ -18,7 +18,6 @@ from typing import Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from superset.annotation_layers.annotations.commands.exceptions import ( AnnotationDeleteFailedError, @@ -33,8 +32,7 @@ class DeleteAnnotationCommand(BaseCommand): - def __init__(self, user: User, model_id: int): - self._actor = user + def __init__(self, model_id: int): self._model_id = model_id self._model: Optional[Annotation] = None diff --git a/superset/annotation_layers/annotations/commands/update.py b/superset/annotation_layers/annotations/commands/update.py index 9e3012acb69b..c55a1cdaf768 100644 --- a/superset/annotation_layers/annotations/commands/update.py +++ b/superset/annotation_layers/annotations/commands/update.py @@ -19,7 +19,6 @@ from typing import Any, Dict, List, Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError from superset.annotation_layers.annotations.commands.exceptions import ( @@ -40,8 +39,7 @@ class UpdateAnnotationCommand(BaseCommand): - def __init__(self, user: User, model_id: int, data: Dict[str, Any]): - self._actor = user + def __init__(self, model_id: int, data: Dict[str, Any]): self._model_id = model_id self._properties = data.copy() self._model: Optional[Annotation] = None diff --git a/superset/annotation_layers/annotations/dao.py b/superset/annotation_layers/annotations/dao.py index 3b6e5e72e709..0c8a9e47c5c0 100644 --- a/superset/annotation_layers/annotations/dao.py +++ b/superset/annotation_layers/annotations/dao.py @@ -40,8 +40,7 @@ def bulk_delete(models: Optional[List[Annotation]], commit: bool = True) -> None if commit: db.session.commit() except SQLAlchemyError as ex: - if commit: - db.session.rollback() + db.session.rollback() raise DAODeleteFailedError() from ex @staticmethod diff --git a/superset/annotation_layers/api.py b/superset/annotation_layers/api.py index db3979f66360..8ef343cae6bc 100644 --- a/superset/annotation_layers/api.py +++ b/superset/annotation_layers/api.py @@ -17,7 +17,7 @@ import logging from typing import Any -from flask import g, request, Response +from flask import request, Response from flask_appbuilder.api import expose, permission_name, protect, rison, safe from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_babel import ngettext @@ -151,7 +151,7 @@ def delete(self, pk: int) -> Response: $ref: '#/components/responses/500' """ try: - DeleteAnnotationLayerCommand(g.user, pk).run() + DeleteAnnotationLayerCommand(pk).run() return self.response(200, message="OK") except AnnotationLayerNotFoundError: return self.response_404() @@ -216,7 +216,7 @@ def post(self) -> Response: except ValidationError as error: return self.response_400(message=error.messages) try: - new_model = CreateAnnotationLayerCommand(g.user, item).run() + new_model = CreateAnnotationLayerCommand(item).run() return self.response(201, id=new_model.id, result=item) except AnnotationLayerNotFoundError as ex: return self.response_400(message=str(ex)) @@ -288,7 +288,7 @@ def put(self, pk: int) -> Response: except ValidationError as error: return self.response_400(message=error.messages) try: - new_model = UpdateAnnotationLayerCommand(g.user, pk, item).run() + new_model = UpdateAnnotationLayerCommand(pk, item).run() return self.response(200, id=new_model.id, result=item) except AnnotationLayerNotFoundError: return self.response_404() @@ -346,7 +346,7 @@ def bulk_delete(self, **kwargs: Any) -> Response: """ item_ids = kwargs["rison"] try: - BulkDeleteAnnotationLayerCommand(g.user, item_ids).run() + BulkDeleteAnnotationLayerCommand(item_ids).run() return self.response( 200, message=ngettext( diff --git a/superset/annotation_layers/commands/bulk_delete.py b/superset/annotation_layers/commands/bulk_delete.py index a828047fdda0..b9bc17e82f3b 100644 --- a/superset/annotation_layers/commands/bulk_delete.py +++ b/superset/annotation_layers/commands/bulk_delete.py @@ -17,8 +17,6 @@ import logging from typing import List, Optional -from flask_appbuilder.security.sqla.models import User - from superset.annotation_layers.commands.exceptions import ( AnnotationLayerBulkDeleteFailedError, AnnotationLayerBulkDeleteIntegrityError, @@ -33,8 +31,7 @@ class BulkDeleteAnnotationLayerCommand(BaseCommand): - def __init__(self, user: User, model_ids: List[int]): - self._actor = user + def __init__(self, model_ids: List[int]): self._model_ids = model_ids self._models: Optional[List[AnnotationLayer]] = None diff --git a/superset/annotation_layers/commands/create.py b/superset/annotation_layers/commands/create.py index ee42ce755740..d5af6c24a292 100644 --- a/superset/annotation_layers/commands/create.py +++ b/superset/annotation_layers/commands/create.py @@ -18,7 +18,6 @@ from typing import Any, Dict, List from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError from superset.annotation_layers.commands.exceptions import ( @@ -34,8 +33,7 @@ class CreateAnnotationLayerCommand(BaseCommand): - def __init__(self, user: User, data: Dict[str, Any]): - self._actor = user + def __init__(self, data: Dict[str, Any]): self._properties = data.copy() def run(self) -> Model: diff --git a/superset/annotation_layers/commands/delete.py b/superset/annotation_layers/commands/delete.py index c439542b24d9..3dbd7a574f2f 100644 --- a/superset/annotation_layers/commands/delete.py +++ b/superset/annotation_layers/commands/delete.py @@ -18,7 +18,6 @@ from typing import Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from superset.annotation_layers.commands.exceptions import ( AnnotationLayerDeleteFailedError, @@ -34,8 +33,7 @@ class DeleteAnnotationLayerCommand(BaseCommand): - def __init__(self, user: User, model_id: int): - self._actor = user + def __init__(self, model_id: int): self._model_id = model_id self._model: Optional[AnnotationLayer] = None diff --git a/superset/annotation_layers/commands/update.py b/superset/annotation_layers/commands/update.py index d2f48abb2444..f4a04cdeb703 100644 --- a/superset/annotation_layers/commands/update.py +++ b/superset/annotation_layers/commands/update.py @@ -18,7 +18,6 @@ from typing import Any, Dict, List, Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError from superset.annotation_layers.commands.exceptions import ( @@ -36,8 +35,7 @@ class UpdateAnnotationLayerCommand(BaseCommand): - def __init__(self, user: User, model_id: int, data: Dict[str, Any]): - self._actor = user + def __init__(self, model_id: int, data: Dict[str, Any]): self._model_id = model_id self._properties = data.copy() self._model: Optional[AnnotationLayer] = None diff --git a/superset/annotation_layers/dao.py b/superset/annotation_layers/dao.py index 0ca19e270091..d9db4b582d97 100644 --- a/superset/annotation_layers/dao.py +++ b/superset/annotation_layers/dao.py @@ -42,8 +42,7 @@ def bulk_delete( if commit: db.session.commit() except SQLAlchemyError as ex: - if commit: - db.session.rollback() + db.session.rollback() raise DAODeleteFailedError() from ex @staticmethod diff --git a/superset/async_events/api.py b/superset/async_events/api.py index 61916162eec7..d3f3bee64d64 100644 --- a/superset/async_events/api.py +++ b/superset/async_events/api.py @@ -18,21 +18,19 @@ from flask import request, Response from flask_appbuilder import expose -from flask_appbuilder.api import BaseApi, safe +from flask_appbuilder.api import safe from flask_appbuilder.security.decorators import permission_name, protect from superset.extensions import async_query_manager, event_logger from superset.utils.async_query_manager import AsyncQueryTokenException +from superset.views.base_api import BaseSupersetApi logger = logging.getLogger(__name__) -class AsyncEventsRestApi(BaseApi): +class AsyncEventsRestApi(BaseSupersetApi): resource_name = "async_event" allow_browser_login = True - include_route_methods = { - "events", - } @expose("/", methods=["GET"]) @event_logger.log_this diff --git a/superset/db_engines/__init__.py b/superset/available_domains/__init__.py similarity index 100% rename from superset/db_engines/__init__.py rename to superset/available_domains/__init__.py diff --git a/superset/available_domains/api.py b/superset/available_domains/api.py new file mode 100644 index 000000000000..b35f4c0702fd --- /dev/null +++ b/superset/available_domains/api.py @@ -0,0 +1,76 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import logging + +from flask import Response +from flask_appbuilder.api import expose, protect, safe + +from superset import conf +from superset.available_domains.schemas import AvailableDomainsSchema +from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP +from superset.extensions import event_logger +from superset.views.base_api import BaseSupersetApi, statsd_metrics + +logger = logging.getLogger(__name__) + + +class AvailableDomainsRestApi(BaseSupersetApi): + available_domains_schema = AvailableDomainsSchema() + + method_permission_name = MODEL_API_RW_METHOD_PERMISSION_MAP + allow_browser_login = True + class_permission_name = "AvailableDomains" + resource_name = "available_domains" + openapi_spec_tag = "Available Domains" + openapi_spec_component_schemas = (AvailableDomainsSchema,) + + @expose("/", methods=["GET"]) + @protect() + @safe + @statsd_metrics + @event_logger.log_this_with_context( + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.get", + log_to_statsd=True, + ) + def get(self) -> Response: + """ + Returns the list of available Superset Webserver domains (if any) + defined in config. This enables charts embedded in other apps to + leverage domain sharding if appropriately configured. + --- + get: + description: >- + Get all available domains + responses: + 200: + description: a list of available domains + content: + application/json: + schema: + type: object + properties: + result: + $ref: '#/components/schemas/AvailableDomainsSchema' + 401: + $ref: '#/components/responses/401' + 403: + $ref: '#/components/responses/403' + """ + result = self.available_domains_schema.dump( + {"domains": conf.get("SUPERSET_WEBSERVER_DOMAINS")} + ) + return self.response(200, result=result) diff --git a/superset/available_domains/schemas.py b/superset/available_domains/schemas.py new file mode 100644 index 000000000000..e9aa1b0a0c93 --- /dev/null +++ b/superset/available_domains/schemas.py @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# License ); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from marshmallow import fields, Schema + + +class AvailableDomainsSchema(Schema): + domains = fields.List(fields.String()) diff --git a/superset/cachekeys/api.py b/superset/cachekeys/api.py index 6eb0d54d9eef..78e680d524c5 100644 --- a/superset/cachekeys/api.py +++ b/superset/cachekeys/api.py @@ -25,8 +25,8 @@ from sqlalchemy.exc import SQLAlchemyError from superset.cachekeys.schemas import CacheInvalidationRequestSchema -from superset.connectors.connector_registry import ConnectorRegistry -from superset.extensions import cache_manager, db, event_logger +from superset.connectors.sqla.models import SqlaTable +from superset.extensions import cache_manager, db, event_logger, stats_logger_manager from superset.models.cache import CacheKey from superset.views.base_api import BaseSupersetModelRestApi, statsd_metrics @@ -83,13 +83,13 @@ def invalidate(self) -> Response: return self.response_400(message=str(error)) datasource_uids = set(datasources.get("datasource_uids", [])) for ds in datasources.get("datasources", []): - ds_obj = ConnectorRegistry.get_datasource_by_name( + ds_obj = SqlaTable.get_datasource_by_name( session=db.session, - datasource_type=ds.get("datasource_type"), datasource_name=ds.get("datasource_name"), schema=ds.get("schema"), database_name=ds.get("database_name"), ) + if ds_obj: datasource_uids.add(ds_obj.uid) @@ -117,7 +117,9 @@ def invalidate(self) -> Response: ) db.session.execute(delete_stmt) db.session.commit() - self.stats_logger.gauge("invalidated_cache", len(cache_keys)) + stats_logger_manager.instance.gauge( + "invalidated_cache", len(cache_keys) + ) logger.info( "Invalidated %s cache records for %s datasources", len(cache_keys), diff --git a/superset/charts/api.py b/superset/charts/api.py index e59c3a41bb73..7dc6d5e1e8d9 100644 --- a/superset/charts/api.py +++ b/superset/charts/api.py @@ -18,10 +18,10 @@ import logging from datetime import datetime from io import BytesIO -from typing import Any, Optional +from typing import Any, cast, Optional from zipfile import is_zipfile, ZipFile -from flask import g, redirect, request, Response, send_file, url_for +from flask import redirect, request, Response, send_file, url_for from flask_appbuilder.api import expose, protect, rison, safe from flask_appbuilder.hooks import before_request from flask_appbuilder.models.sqla.interface import SQLAInterface @@ -50,8 +50,10 @@ from superset.charts.filters import ( ChartAllTextFilter, ChartCertifiedFilter, + ChartCreatedByMeFilter, ChartFavoriteFilter, ChartFilter, + ChartHasCreatedByFilter, ) from superset.charts.schemas import ( CHART_SCHEMAS, @@ -73,6 +75,7 @@ from superset.extensions import event_logger from superset.models.slice import Slice from superset.tasks.thumbnails import cache_chart_thumbnail +from superset.tasks.utils import get_current_user from superset.utils.screenshots import ChartScreenshot from superset.utils.urls import get_url_path from superset.views.base_api import ( @@ -82,7 +85,7 @@ requires_json, statsd_metrics, ) -from superset.views.filters import FilterRelatedOwners +from superset.views.filters import BaseFilterRelatedUsers, FilterRelatedOwners logger = logging.getLogger(__name__) config = app.config @@ -117,16 +120,22 @@ def ensure_thumbnails_enabled(self) -> Optional[Response]: "cache_timeout", "certified_by", "certification_details", + "changed_on_delta_humanized", "dashboards.dashboard_title", "dashboards.id", "dashboards.json_metadata", "description", + "id", "owners.first_name", "owners.id", "owners.last_name", "owners.username", + "dashboards.id", + "dashboards.dashboard_title", "params", "slice_name", + "thumbnail_url", + "url", "viz_type", "query_context", "is_managed_externally", @@ -146,6 +155,7 @@ def ensure_thumbnails_enabled(self) -> Optional[Response]: "created_by.first_name", "created_by.id", "created_by.last_name", + "created_on_delta_humanized", "datasource_id", "datasource_name_text", "datasource_type", @@ -162,6 +172,8 @@ def ensure_thumbnails_enabled(self) -> Optional[Response]: "owners.id", "owners.last_name", "owners.username", + "dashboards.id", + "dashboards.dashboard_title", "params", "slice_name", "table.default_endpoint", @@ -187,15 +199,14 @@ def ensure_thumbnails_enabled(self) -> Optional[Response]: "created_by", "changed_by", "last_saved_at", - "last_saved_by.id", - "last_saved_by.first_name", - "last_saved_by.last_name", + "last_saved_by", "datasource_id", "datasource_name", "datasource_type", "description", "id", "owners", + "dashboards", "slice_name", "viz_type", ] @@ -204,6 +215,7 @@ def ensure_thumbnails_enabled(self) -> Optional[Response]: search_filters = { "id": [ChartFavoriteFilter, ChartCertifiedFilter], "slice_name": [ChartAllTextFilter], + "created_by": [ChartHasCreatedByFilter, ChartCreatedByMeFilter], } # Will just affect _info endpoint @@ -231,7 +243,10 @@ def ensure_thumbnails_enabled(self) -> Optional[Response]: "slices": ("slice_name", "asc"), "owners": ("first_name", "asc"), } - + base_related_field_filters = { + "owners": [["id", BaseFilterRelatedUsers, lambda: []]], + "created_by": [["id", BaseFilterRelatedUsers, lambda: []]], + } related_field_filters = { "owners": RelatedFieldFilter("first_name", FilterRelatedOwners), "created_by": RelatedFieldFilter("first_name", FilterRelatedOwners), @@ -288,7 +303,7 @@ def post(self) -> Response: except ValidationError as error: return self.response_400(message=error.messages) try: - new_model = CreateChartCommand(g.user, item).run() + new_model = CreateChartCommand(item).run() return self.response(201, id=new_model.id, result=item) except ChartInvalidError as ex: return self.response_422(message=ex.normalized_messages()) @@ -359,7 +374,7 @@ def put(self, pk: int) -> Response: except ValidationError as error: return self.response_400(message=error.messages) try: - changed_model = UpdateChartCommand(g.user, pk, item).run() + changed_model = UpdateChartCommand(pk, item).run() response = self.response(200, id=changed_model.id, result=item) except ChartNotFoundError: response = self.response_404() @@ -419,7 +434,7 @@ def delete(self, pk: int) -> Response: $ref: '#/components/responses/500' """ try: - DeleteChartCommand(g.user, pk).run() + DeleteChartCommand(pk).run() return self.response(200, message="OK") except ChartNotFoundError: return self.response_404() @@ -479,7 +494,7 @@ def bulk_delete(self, **kwargs: Any) -> Response: """ item_ids = kwargs["rison"] try: - BulkDeleteChartCommand(g.user, item_ids).run() + BulkDeleteChartCommand(item_ids).run() return self.response( 200, message=ngettext( @@ -541,11 +556,11 @@ def cache_screenshot(self, pk: int, **kwargs: Any) -> WerkzeugResponse: # Don't shrink the image if thumb_size is not specified thumb_size = rison_dict.get("thumb_size") or window_size - chart = self.datamodel.get(pk, self._base_filters) + chart = cast(Slice, self.datamodel.get(pk, self._base_filters)) if not chart: return self.response_404() - chart_url = get_url_path("Superset.slice", slice_id=chart.id, standalone="true") + chart_url = get_url_path("Superset.slice", slice_id=chart.id) screenshot_obj = ChartScreenshot(chart_url, chart.digest) cache_key = screenshot_obj.cache_key(window_size, thumb_size) image_url = get_url_path( @@ -554,14 +569,13 @@ def cache_screenshot(self, pk: int, **kwargs: Any) -> WerkzeugResponse: def trigger_celery() -> WerkzeugResponse: logger.info("Triggering screenshot ASYNC") - kwargs = { - "url": chart_url, - "digest": chart.digest, - "force": True, - "window_size": window_size, - "thumb_size": thumb_size, - } - cache_chart_thumbnail.delay(**kwargs) + cache_chart_thumbnail.delay( + current_user=get_current_user(), + chart_id=chart.id, + force=True, + window_size=window_size, + thumb_size=thumb_size, + ) return self.response( 202, cache_key=cache_key, chart_url=chart_url, image_url=image_url ) @@ -664,16 +678,21 @@ def thumbnail(self, pk: int, digest: str, **kwargs: Any) -> WerkzeugResponse: 500: $ref: '#/components/responses/500' """ - chart = self.datamodel.get(pk, self._base_filters) + chart = cast(Slice, self.datamodel.get(pk, self._base_filters)) if not chart: return self.response_404() - url = get_url_path("Superset.slice", slice_id=chart.id, standalone="true") + current_user = get_current_user() + url = get_url_path("Superset.slice", slice_id=chart.id) if kwargs["rison"].get("force", False): logger.info( "Triggering thumbnail compute (chart id: %s) ASYNC", str(chart.id) ) - cache_chart_thumbnail.delay(url, chart.digest, force=True) + cache_chart_thumbnail.delay( + current_user=current_user, + chart_id=chart.id, + force=True, + ) return self.response(202, message="OK Async") # fetch the chart screenshot using the current user and cache if set screenshot = ChartScreenshot(url, chart.digest).get_from_cache( @@ -685,7 +704,11 @@ def thumbnail(self, pk: int, digest: str, **kwargs: Any) -> WerkzeugResponse: logger.info( "Triggering thumbnail compute (chart id: %s) ASYNC", str(chart.id) ) - cache_chart_thumbnail.delay(url, chart.digest, force=True) + cache_chart_thumbnail.delay( + current_user=current_user, + chart_id=chart.id, + force=True, + ) return self.response(202, message="OK Async") # If digests if chart.digest != digest: @@ -808,7 +831,7 @@ def favorite_status(self, **kwargs: Any) -> Response: charts = ChartDAO.find_by_ids(requested_ids) if not charts: return self.response_404() - favorited_chart_ids = ChartDAO.favorited_ids(charts, g.user.get_id()) + favorited_chart_ids = ChartDAO.favorited_ids(charts) res = [ {"id": request_id, "value": request_id in favorited_chart_ids} for request_id in requested_ids diff --git a/superset/charts/commands/bulk_delete.py b/superset/charts/commands/bulk_delete.py index 26a3fce9e41c..caf8fe039922 100644 --- a/superset/charts/commands/bulk_delete.py +++ b/superset/charts/commands/bulk_delete.py @@ -17,9 +17,9 @@ import logging from typing import List, Optional -from flask_appbuilder.security.sqla.models import User from flask_babel import lazy_gettext as _ +from superset import security_manager from superset.charts.commands.exceptions import ( ChartBulkDeleteFailedError, ChartBulkDeleteFailedReportsExistError, @@ -32,14 +32,12 @@ from superset.exceptions import SupersetSecurityException from superset.models.slice import Slice from superset.reports.dao import ReportScheduleDAO -from superset.views.base import check_ownership logger = logging.getLogger(__name__) class BulkDeleteChartCommand(BaseCommand): - def __init__(self, user: User, model_ids: List[int]): - self._actor = user + def __init__(self, model_ids: List[int]): self._model_ids = model_ids self._models: Optional[List[Slice]] = None @@ -66,6 +64,6 @@ def validate(self) -> None: # Check ownership for model in self._models: try: - check_ownership(model) + security_manager.raise_for_ownership(model) except SupersetSecurityException as ex: raise ChartForbiddenError() from ex diff --git a/superset/charts/commands/create.py b/superset/charts/commands/create.py index 34a25aea2d4a..823834079447 100644 --- a/superset/charts/commands/create.py +++ b/superset/charts/commands/create.py @@ -18,8 +18,8 @@ from datetime import datetime from typing import Any, Dict, List, Optional +from flask import g from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError from superset.charts.commands.exceptions import ( @@ -37,15 +37,14 @@ class CreateChartCommand(CreateMixin, BaseCommand): - def __init__(self, user: User, data: Dict[str, Any]): - self._actor = user + def __init__(self, data: Dict[str, Any]): self._properties = data.copy() def run(self) -> Model: self.validate() try: self._properties["last_saved_at"] = datetime.now() - self._properties["last_saved_by"] = self._actor + self._properties["last_saved_by"] = g.user chart = ChartDAO.create(self._properties) except DAOCreateFailedError as ex: logger.exception(ex.exception) @@ -73,7 +72,7 @@ def validate(self) -> None: self._properties["dashboards"] = dashboards try: - owners = self.populate_owners(self._actor, owner_ids) + owners = self.populate_owners(owner_ids) self._properties["owners"] = owners except ValidationError as ex: exceptions.append(ex) diff --git a/superset/charts/commands/delete.py b/superset/charts/commands/delete.py index faf72c5ef7b9..cb6644c711c4 100644 --- a/superset/charts/commands/delete.py +++ b/superset/charts/commands/delete.py @@ -18,9 +18,9 @@ from typing import Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from flask_babel import lazy_gettext as _ +from superset import security_manager from superset.charts.commands.exceptions import ( ChartDeleteFailedError, ChartDeleteFailedReportsExistError, @@ -34,14 +34,12 @@ from superset.models.dashboard import Dashboard from superset.models.slice import Slice from superset.reports.dao import ReportScheduleDAO -from superset.views.base import check_ownership logger = logging.getLogger(__name__) class DeleteChartCommand(BaseCommand): - def __init__(self, user: User, model_id: int): - self._actor = user + def __init__(self, model_id: int): self._model_id = model_id self._model: Optional[Slice] = None @@ -69,6 +67,6 @@ def validate(self) -> None: ) # Check ownership try: - check_ownership(self._model) + security_manager.raise_for_ownership(self._model) except SupersetSecurityException as ex: raise ChartForbiddenError() from ex diff --git a/superset/charts/commands/export.py b/superset/charts/commands/export.py index 9b3a06c47358..39c3c7d46a77 100644 --- a/superset/charts/commands/export.py +++ b/superset/charts/commands/export.py @@ -21,7 +21,6 @@ from typing import Iterator, Tuple import yaml -from werkzeug.utils import secure_filename from superset.charts.commands.exceptions import ChartNotFoundError from superset.charts.dao import ChartDAO @@ -29,12 +28,13 @@ from superset.commands.export.models import ExportModelsCommand from superset.models.slice import Slice from superset.utils.dict_import_export import EXPORT_VERSION +from superset.utils.file import get_filename logger = logging.getLogger(__name__) # keys present in the standard export that are not needed -REMOVE_KEYS = ["datasource_type", "datasource_name", "query_context", "url_params"] +REMOVE_KEYS = ["datasource_type", "datasource_name", "url_params"] class ExportChartsCommand(ExportModelsCommand): @@ -44,8 +44,8 @@ class ExportChartsCommand(ExportModelsCommand): @staticmethod def _export(model: Slice, export_related: bool = True) -> Iterator[Tuple[str, str]]: - chart_slug = secure_filename(model.slice_name) - file_name = f"charts/{chart_slug}_{model.id}.yaml" + file_name = get_filename(model.slice_name, model.id) + file_path = f"charts/{file_name}.yaml" payload = model.export_to_dict( recursive=False, @@ -70,7 +70,7 @@ def _export(model: Slice, export_related: bool = True) -> Iterator[Tuple[str, st payload["dataset_uuid"] = str(model.table.uuid) file_content = yaml.safe_dump(payload, sort_keys=False) - yield file_name, file_content + yield file_path, file_content if model.table and export_related: yield from ExportDatasetsCommand([model.table.id]).run() diff --git a/superset/charts/commands/update.py b/superset/charts/commands/update.py index 0355e6e5ffe5..042c85a930f9 100644 --- a/superset/charts/commands/update.py +++ b/superset/charts/commands/update.py @@ -18,10 +18,11 @@ from datetime import datetime from typing import Any, Dict, List, Optional +from flask import g from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError +from superset import security_manager from superset.charts.commands.exceptions import ( ChartForbiddenError, ChartInvalidError, @@ -37,7 +38,6 @@ from superset.dashboards.dao import DashboardDAO from superset.exceptions import SupersetSecurityException from superset.models.slice import Slice -from superset.views.base import check_ownership logger = logging.getLogger(__name__) @@ -49,8 +49,7 @@ def is_query_context_update(properties: Dict[str, Any]) -> bool: class UpdateChartCommand(UpdateMixin, BaseCommand): - def __init__(self, user: User, model_id: int, data: Dict[str, Any]): - self._actor = user + def __init__(self, model_id: int, data: Dict[str, Any]): self._model_id = model_id self._properties = data.copy() self._model: Optional[Slice] = None @@ -60,7 +59,7 @@ def run(self) -> Model: try: if self._properties.get("query_context_generation") is None: self._properties["last_saved_at"] = datetime.now() - self._properties["last_saved_by"] = self._actor + self._properties["last_saved_by"] = g.user chart = ChartDAO.update(self._model, self._properties) except DAOUpdateFailedError as ex: logger.exception(ex.exception) @@ -88,8 +87,8 @@ def validate(self) -> None: # ownership so the update can be performed by report workers if not is_query_context_update(self._properties): try: - check_ownership(self._model) - owners = self.populate_owners(self._actor, owner_ids) + security_manager.raise_for_ownership(self._model) + owners = self.populate_owners(owner_ids) self._properties["owners"] = owners except SupersetSecurityException as ex: raise ChartForbiddenError() from ex @@ -106,7 +105,10 @@ def validate(self) -> None: # Validate/Populate dashboards only if it's a list if dashboard_ids is not None: - dashboards = DashboardDAO.find_by_ids(dashboard_ids) + dashboards = DashboardDAO.find_by_ids( + dashboard_ids, + skip_base_filter=True, + ) if len(dashboards) != len(dashboard_ids): exceptions.append(DashboardsNotFoundValidationError()) self._properties["dashboards"] = dashboards diff --git a/superset/charts/dao.py b/superset/charts/dao.py index 8e16f3b445b4..384bd9a1fe6e 100644 --- a/superset/charts/dao.py +++ b/superset/charts/dao.py @@ -25,6 +25,7 @@ from superset.extensions import db from superset.models.core import FavStar, FavStarClassName from superset.models.slice import Slice +from superset.utils.core import get_user_id if TYPE_CHECKING: from superset.connectors.base.models import BaseDatasource @@ -53,8 +54,7 @@ def bulk_delete(models: Optional[List[Slice]], commit: bool = True) -> None: if commit: db.session.commit() except SQLAlchemyError as ex: - if commit: - db.session.rollback() + db.session.rollback() raise ex @staticmethod @@ -70,7 +70,7 @@ def overwrite(slc: Slice, commit: bool = True) -> None: db.session.commit() @staticmethod - def favorited_ids(charts: List[Slice], current_user_id: int) -> List[FavStar]: + def favorited_ids(charts: List[Slice]) -> List[FavStar]: ids = [chart.id for chart in charts] return [ star.obj_id @@ -78,7 +78,7 @@ def favorited_ids(charts: List[Slice], current_user_id: int) -> List[FavStar]: .filter( FavStar.class_name == FavStarClassName.CHART, FavStar.obj_id.in_(ids), - FavStar.user_id == current_user_id, + FavStar.user_id == get_user_id(), ) .all() ] diff --git a/superset/charts/data/api.py b/superset/charts/data/api.py index 73468d651cbc..0d0758819ed0 100644 --- a/superset/charts/data/api.py +++ b/superset/charts/data/api.py @@ -21,7 +21,7 @@ from typing import Any, Dict, Optional, TYPE_CHECKING import simplejson -from flask import current_app, g, make_response, request, Response +from flask import current_app, make_response, request, Response from flask_appbuilder.api import expose, protect from flask_babel import gettext as _ from marshmallow import ValidationError @@ -41,11 +41,12 @@ from superset.charts.schemas import ChartDataQueryContextSchema from superset.common.chart_data import ChartDataResultFormat, ChartDataResultType from superset.connectors.base.models import BaseDatasource +from superset.dao.exceptions import DatasourceNotFound from superset.exceptions import QueryObjectValidationError from superset.extensions import event_logger from superset.utils.async_query_manager import AsyncQueryTokenException -from superset.utils.core import create_zip, json_int_dttm_ser -from superset.views.base import CsvResponse, generate_download_headers +from superset.utils.core import create_zip, get_user_id, json_int_dttm_ser +from superset.views.base import CsvResponse, generate_download_headers, XlsxResponse from superset.views.base_api import statsd_metrics if TYPE_CHECKING: @@ -89,6 +90,11 @@ def get_data(self, pk: int) -> Response: description: The type in which the data should be returned schema: type: string + - in: query + name: force + description: Should the queries be forced to load from the source + schema: + type: boolean responses: 200: description: Query result @@ -130,11 +136,14 @@ def get_data(self, pk: int) -> Response: "format", ChartDataResultFormat.JSON ) json_body["result_type"] = request.args.get("type", ChartDataResultType.FULL) + json_body["force"] = request.args.get("force") try: query_context = self._create_query_context_from_form(json_body) command = ChartDataCommand(query_context) command.validate() + except DatasourceNotFound as error: + return self.response_404() except QueryObjectValidationError as error: return self.response_400(message=error.message) except ValidationError as error: @@ -223,6 +232,8 @@ def data(self) -> Response: query_context = self._create_query_context_from_form(json_body) command = ChartDataCommand(query_context) command.validate() + except DatasourceNotFound as error: + return self.response_404() except QueryObjectValidationError as error: return self.response_400(message=error.message) except ValidationError as error: @@ -324,7 +335,7 @@ def _run_async( except AsyncQueryTokenException: return self.response_401() - result = async_command.run(form_data, g.user.get_id()) + result = async_command.run(form_data, get_user_id()) return self.response(202, **result) def _send_chart_response( @@ -342,24 +353,34 @@ def _send_chart_response( if result_type == ChartDataResultType.POST_PROCESSED: result = apply_post_process(result, form_data, datasource) - if result_format == ChartDataResultFormat.CSV: - # Verify user has permission to export CSV file + if result_format in ChartDataResultFormat.table_like(): + # Verify user has permission to export file if not security_manager.can_access("can_csv", "Superset"): return self.response_403() if not result["queries"]: return self.response_400(_("Empty query result")) + is_csv_format = result_format == ChartDataResultFormat.CSV + if len(result["queries"]) == 1: - # return single query results csv format + # return single query results data = result["queries"][0]["data"] - return CsvResponse(data, headers=generate_download_headers("csv")) + if is_csv_format: + return CsvResponse(data, headers=generate_download_headers("csv")) + + return XlsxResponse(data, headers=generate_download_headers("xlsx")) + + # return multi-query results bundled as a zip file + def _process_data(query_data: Any) -> Any: + if result_format == ChartDataResultFormat.CSV: + encoding = current_app.config["CSV_EXPORT"].get("encoding", "utf-8") + return query_data.encode(encoding) + return query_data - # return multi-query csv results bundled as a zip file - encoding = current_app.config["CSV_EXPORT"].get("encoding", "utf-8") files = { - f"query_{idx + 1}.csv": result["data"].encode(encoding) - for idx, result in enumerate(result["queries"]) + f"query_{idx + 1}.{result_format}": _process_data(query["data"]) + for idx, query in enumerate(result["queries"]) } return Response( create_zip(files), diff --git a/superset/charts/data/commands/create_async_job_command.py b/superset/charts/data/commands/create_async_job_command.py index 98a0174e6252..c4e25f742baa 100644 --- a/superset/charts/data/commands/create_async_job_command.py +++ b/superset/charts/data/commands/create_async_job_command.py @@ -32,7 +32,7 @@ def validate(self, request: Request) -> None: jwt_data = async_query_manager.parse_jwt_from_request(request) self._async_channel_id = jwt_data["channel"] - def run(self, form_data: Dict[str, Any], user_id: Optional[str]) -> Dict[str, Any]: + def run(self, form_data: Dict[str, Any], user_id: Optional[int]) -> Dict[str, Any]: job_metadata = async_query_manager.init_job(self._async_channel_id, user_id) load_chart_data_into_cache.delay(job_metadata, form_data) return job_metadata diff --git a/superset/charts/data/commands/get_data_command.py b/superset/charts/data/commands/get_data_command.py index 95f7513f253f..819693607bfb 100644 --- a/superset/charts/data/commands/get_data_command.py +++ b/superset/charts/data/commands/get_data_command.py @@ -17,6 +17,8 @@ import logging from typing import Any, Dict +from flask_babel import lazy_gettext as _ + from superset.charts.commands.exceptions import ( ChartDataCacheLoadError, ChartDataQueryFailedError, @@ -49,7 +51,9 @@ def run(self, **kwargs: Any) -> Dict[str, Any]: # TODO: QueryContext should support SIP-40 style errors for query in payload["queries"]: if query.get("error"): - raise ChartDataQueryFailedError(f"Error: {query['error']}") + raise ChartDataQueryFailedError( + _("Error: %(error)s", error=query["error"]) + ) return_value = { "query_context": self._query_context, diff --git a/superset/charts/filters.py b/superset/charts/filters.py index c60d28594083..fd3fff7f6e2f 100644 --- a/superset/charts/filters.py +++ b/superset/charts/filters.py @@ -24,6 +24,7 @@ from superset.connectors.sqla import models from superset.connectors.sqla.models import SqlaTable from superset.models.slice import Slice +from superset.utils.core import get_user_id from superset.views.base import BaseFilter from superset.views.base_api import BaseFavoriteFilter @@ -93,3 +94,34 @@ def apply(self, query: Query, value: Any) -> Query: models.SqlaTable.id.in_(owner_ids_query), ) ) + + +class ChartHasCreatedByFilter(BaseFilter): # pylint: disable=too-few-public-methods + """ + Custom filter for the GET list that filters all charts created by user + """ + + name = _("Has created by") + arg_name = "chart_has_created_by" + + def apply(self, query: Query, value: Any) -> Query: + if value is True: + return query.filter(and_(Slice.created_by_fk.isnot(None))) + if value is False: + return query.filter(and_(Slice.created_by_fk.is_(None))) + return query + + +class ChartCreatedByMeFilter(BaseFilter): # pylint: disable=too-few-public-methods + name = _("Created by me") + arg_name = "chart_created_by_me" + + def apply(self, query: Query, value: Any) -> Query: + return query.filter( + or_( + Slice.created_by_fk # pylint: disable=comparison-with-callable + == get_user_id(), + Slice.changed_by_fk # pylint: disable=comparison-with-callable + == get_user_id(), + ) + ) diff --git a/superset/charts/post_processing.py b/superset/charts/post_processing.py index 44131afe942b..831775fa039a 100644 --- a/superset/charts/post_processing.py +++ b/superset/charts/post_processing.py @@ -25,16 +25,15 @@ In order to do that, we reproduce the post-processing in Python for these chart types. """ - import logging from io import StringIO from typing import Any, Dict, List, Optional, Tuple, TYPE_CHECKING import pandas as pd +from flask_babel import gettext as __ from superset import app from superset.common.chart_data import ChartDataResultFormat -from superset.common.query_context import QueryContext from superset.utils.core import ( DTTM_ALIAS, extract_dataframe_dtypes, @@ -45,8 +44,8 @@ if TYPE_CHECKING: from superset.connectors.base.models import BaseDatasource -config = app.config logger = logging.getLogger(__name__) +config = app.config def get_column_key(label: Tuple[str, ...], metrics: List[str]) -> Tuple[Any, ...]: @@ -74,7 +73,7 @@ def pivot_df( # pylint: disable=too-many-locals, too-many-arguments, too-many-s show_columns_total: bool = False, apply_metrics_on_rows: bool = False, ) -> pd.DataFrame: - metric_name = f"Total ({aggfunc})" + metric_name = __("Total (%(aggfunc)s)", aggfunc=aggfunc) if transpose_pivot: rows, columns = columns, rows @@ -162,7 +161,7 @@ def pivot_df( # pylint: disable=too-many-locals, too-many-arguments, too-many-s slice_ = df.columns.get_loc(subgroup) subtotal = pivot_v2_aggfunc_map[aggfunc](df.iloc[:, slice_], axis=1) depth = df.columns.nlevels - len(subgroup) - 1 - total = metric_name if level == 0 else "Subtotal" + total = metric_name if level == 0 else __("Subtotal") subtotal_name = tuple([*subgroup, total, *([""] * depth)]) # insert column after subgroup df.insert(int(slice_.stop), subtotal_name, subtotal) @@ -179,7 +178,7 @@ def pivot_df( # pylint: disable=too-many-locals, too-many-arguments, too-many-s df.iloc[slice_, :].apply(pd.to_numeric), axis=0 ) depth = df.index.nlevels - len(subgroup) - 1 - total = metric_name if level == 0 else "Subtotal" + total = metric_name if level == 0 else __("Subtotal") subtotal.name = tuple([*subgroup, total, *([""] * depth)]) # insert row after subgroup df = pd.concat( @@ -362,14 +361,7 @@ def apply_post_process( ) -> Dict[Any, Any]: form_data = form_data or {} - viz_type = form_data.get("viz_type", "") - if not viz_type: - viz_type = ( - result.get("query_context", QueryContext).viz_type - if result.get("query_context", QueryContext).viz_type - else "" - ) - + viz_type = form_data.get("viz_type") if viz_type not in post_processors: return result @@ -394,12 +386,21 @@ def apply_post_process( result = post_processor(result, form_data) # type: ignore else: for query in result["queries"]: + if query["result_format"] not in (rf.value for rf in ChartDataResultFormat): + raise Exception(f"Result format {query['result_format']} not supported") + + if not query["data"]: + # do not try to process empty data + continue + if query["result_format"] == ChartDataResultFormat.JSON: df = pd.DataFrame.from_dict(query["data"]) elif query["result_format"] == ChartDataResultFormat.CSV: df = pd.read_csv(StringIO(query["data"])) - else: - raise Exception(f"Result format {query['result_format']} not supported") + + # convert all columns to verbose (label) name + if datasource: + df.rename(columns=datasource.data["verbose_map"], inplace=True) processed_df = post_processor(df, form_data, datasource) # type: ignore diff --git a/superset/charts/schemas.py b/superset/charts/schemas.py index b15f81b091c4..9e62e6322d79 100644 --- a/superset/charts/schemas.py +++ b/superset/charts/schemas.py @@ -71,6 +71,7 @@ # # Column schema descriptions # +id_description = "The id of the chart." slice_name_description = "The name of the chart." description_description = "A description of the chart propose." viz_type_description = "The type of chart visualization used." @@ -153,7 +154,7 @@ class ChartEntityResponseSchema(Schema): Schema for a chart object """ - slice_id = fields.Integer() + id = fields.Integer(description=id_description) slice_name = fields.String(description=slice_name_description) cache_timeout = fields.Integer(description=cache_timeout_description) changed_on = fields.String(description=changed_on_description) @@ -434,7 +435,7 @@ class ChartDataRollingOptionsSchema(ChartDataPostProcessingOperationOptionsSchem example=7, ) rolling_type_options = fields.Dict( - desctiption="Optional options to pass to rolling method. Needed for " + description="Optional options to pass to rolling method. Needed for " "e.g. quantile operation.", example={}, ) @@ -550,7 +551,7 @@ class ChartDataProphetOptionsSchema(ChartDataPostProcessingOperationOptionsSchem required=True, ) periods = fields.Integer( - descrption="Time periods (in units of `time_grain`) to predict into the future", + description="Time periods (in units of `time_grain`) to predict into the future", min=0, example=7, required=True, @@ -819,7 +820,8 @@ class ChartDataFilterSchema(Schema): ) val = fields.Raw( description="The value or values to compare against. Can be a string, " - "integer, decimal or list, depending on the operator.", + "integer, decimal, None or list, depending on the operator.", + allow_none=True, example=["China", "France", "Japan"], ) grain = fields.String( @@ -853,7 +855,9 @@ class ChartDataExtrasSchema(Schema): ) having_druid = fields.List( fields.Nested(ChartDataFilterSchema), - description="HAVING filters to be added to legacy Druid datasource queries.", + description="HAVING filters to be added to legacy Druid datasource queries. " + "This field is deprecated", + deprecated=True, ) time_grain_sqla = fields.String( description="To what level of granularity should the temporal column be " @@ -869,11 +873,6 @@ class ChartDataExtrasSchema(Schema): example="P1D", allow_none=True, ) - druid_time_origin = fields.String( - description="Starting point for time grain counting on legacy Druid " - "datasources. Used to change e.g. Monday/Sunday first-day-of-week.", - allow_none=True, - ) class AnnotationLayerSchema(Schema): @@ -911,7 +910,7 @@ class AnnotationLayerSchema(Schema): ) overrides = fields.Dict( keys=fields.String( - desciption="Name of property to be overridden", + description="Name of property to be overridden", validate=validate.OneOf( choices=("granularity", "time_grain_sqla", "time_range", "time_shift"), ), @@ -1175,6 +1174,7 @@ class Meta: # pylint: disable=too-few-public-methods "This field is deprecated and should be passed to `extras` " "as `druid_time_origin`.", allow_none=True, + deprecated=True, ) url_params = fields.Dict( description="Optional query parameters passed to a dashboard or Explore view", @@ -1205,6 +1205,7 @@ class ChartDataQueryContextSchema(Schema): force = fields.Boolean( description="Should the queries be forced to load from the source. " "Default: `false`", + allow_none=True, ) result_type = EnumField(ChartDataResultType, by_value=True) @@ -1298,7 +1299,7 @@ class ChartDataResponseResult(Schema): allow_none=False, ) stacktrace = fields.String( - desciption="Stacktrace if there was an error", + description="Stacktrace if there was an error", allow_none=True, ) rowcount = fields.Integer( @@ -1317,10 +1318,10 @@ class ChartDataResponseResult(Schema): fields.Dict(), description="A list with rejected filters" ) from_dttm = fields.Integer( - desciption="Start timestamp of time range", required=False, allow_none=True + description="Start timestamp of time range", required=False, allow_none=True ) to_dttm = fields.Integer( - desciption="End timestamp of time range", required=False, allow_none=True + description="End timestamp of time range", required=False, allow_none=True ) @@ -1368,6 +1369,9 @@ class GetFavStarIdsSchema(Schema): class ImportV1ChartSchema(Schema): slice_name = fields.String(required=True) + description = fields.String(allow_none=True) + certified_by = fields.String(allow_none=True) + certification_details = fields.String(allow_none=True) viz_type = fields.String(required=True) params = fields.Dict() query_context = fields.String(allow_none=True, validate=utils.validate_json) diff --git a/superset/cli/examples.py b/superset/cli/examples.py index cad87da9d3d2..d4ba3af87e53 100755 --- a/superset/cli/examples.py +++ b/superset/cli/examples.py @@ -54,6 +54,9 @@ def load_examples_run( if load_test_data: print("Loading [Tabbed dashboard]") examples.load_tabbed_dashboard(only_metadata) + + print("Loading [Supported Charts Dashboard]") + examples.load_supported_charts_dashboard() else: print("Loading [Random long/lat data]") examples.load_long_lat_data(only_metadata, force) diff --git a/superset/cli/importexport.py b/superset/cli/importexport.py index 1ddaf7cfc8d0..6ca58e9952df 100755 --- a/superset/cli/importexport.py +++ b/superset/cli/importexport.py @@ -66,7 +66,7 @@ def import_directory(directory: str, overwrite: bool, force: bool) -> None: @click.option( "--dashboard-file", "-f", - help="Specify the the file to export to", + help="Specify the file to export to", ) def export_dashboards(dashboard_file: Optional[str] = None) -> None: """Export dashboards to ZIP file""" @@ -101,7 +101,7 @@ def export_dashboards(dashboard_file: Optional[str] = None) -> None: @click.option( "--datasource-file", "-f", - help="Specify the the file to export to", + help="Specify the file to export to", ) def export_datasources(datasource_file: Optional[str] = None) -> None: """Export datasources to ZIP file""" @@ -206,7 +206,7 @@ def import_datasources(path: str) -> None: "--dashboard-file", "-f", default=None, - help="Specify the the file to export to", + help="Specify the file to export to", ) @click.option( "--print_stdout", @@ -236,7 +236,7 @@ def export_dashboards( "--datasource-file", "-f", default=None, - help="Specify the the file to export to", + help="Specify the file to export to", ) @click.option( "--print_stdout", diff --git a/superset/cli/thumbnails.py b/superset/cli/thumbnails.py index 5556cff92f62..276d9981c1ec 100755 --- a/superset/cli/thumbnails.py +++ b/superset/cli/thumbnails.py @@ -22,7 +22,6 @@ from flask.cli import with_appcontext from superset.extensions import db -from superset.utils.urls import get_url_path logger = logging.getLogger(__name__) @@ -94,13 +93,7 @@ def compute_generic_thumbnail( action = "Processing" msg = f'{action} {friendly_type} "{model}" ({i+1}/{count})' click.secho(msg, fg="green") - if friendly_type == "chart": - url = get_url_path( - "Superset.slice", slice_id=model.id, standalone="true" - ) - else: - url = get_url_path("Superset.dashboard", dashboard_id_or_slug=model.id) - func(url, model.digest, force=force) + func(None, model.id, force=force) if not charts_only: compute_generic_thumbnail( diff --git a/superset/cli/update.py b/superset/cli/update.py index ae4ad644c9a8..bdc54db3a9c9 100755 --- a/superset/cli/update.py +++ b/superset/cli/update.py @@ -30,8 +30,6 @@ from flask_appbuilder.api.manager import resolver import superset.utils.database as database_utils -from superset.extensions import db -from superset.utils.core import override_user from superset.utils.encrypt import SecretsMigrator logger = logging.getLogger(__name__) @@ -53,38 +51,6 @@ def set_database_uri(database_name: str, uri: str, skip_create: bool) -> None: database_utils.get_or_create_db(database_name, uri, not skip_create) -@click.command() -@with_appcontext -@click.option( - "--username", - "-u", - default=None, - help=( - "Specify which user should execute the underlying SQL queries. If undefined " - "defaults to the user registered with the database connection." - ), -) -def update_datasources_cache(username: Optional[str]) -> None: - """Refresh sqllab datasources cache""" - # pylint: disable=import-outside-toplevel - from superset import security_manager - from superset.models.core import Database - - with override_user(security_manager.find_user(username)): - for database in db.session.query(Database).all(): - if database.allow_multi_schema_metadata_fetch: - print("Fetching {} datasources ...".format(database.name)) - try: - database.get_all_table_names_in_database( - force=True, cache=True, cache_timeout=24 * 60 * 60 - ) - database.get_all_view_names_in_database( - force=True, cache=True, cache_timeout=24 * 60 * 60 - ) - except Exception as ex: # pylint: disable=broad-except - print("{}".format(str(ex))) - - @click.command() @with_appcontext def sync_tags() -> None: @@ -95,9 +61,9 @@ def sync_tags() -> None: # pylint: disable=import-outside-toplevel from superset.common.tags import add_favorites, add_owners, add_types - add_types(db.engine, metadata) - add_owners(db.engine, metadata) - add_favorites(db.engine, metadata) + add_types(metadata) + add_owners(metadata) + add_favorites(metadata) @click.command() diff --git a/superset/commands/base.py b/superset/commands/base.py index 552b95feb2e1..42d5956312cd 100644 --- a/superset/commands/base.py +++ b/superset/commands/base.py @@ -45,34 +45,28 @@ def validate(self) -> None: class CreateMixin: # pylint: disable=too-few-public-methods @staticmethod - def populate_owners( - user: User, owner_ids: Optional[List[int]] = None - ) -> List[User]: + def populate_owners(owner_ids: Optional[List[int]] = None) -> List[User]: """ Populate list of owners, defaulting to the current user if `owner_ids` is undefined or empty. If current user is missing in `owner_ids`, current user is added unless belonging to the Admin role. - :param user: current user :param owner_ids: list of owners by id's :raises OwnersNotFoundValidationError: if at least one owner can't be resolved :returns: Final list of owners """ - return populate_owners(user, owner_ids, default_to_user=True) + return populate_owners(owner_ids, default_to_user=True) class UpdateMixin: # pylint: disable=too-few-public-methods @staticmethod - def populate_owners( - user: User, owner_ids: Optional[List[int]] = None - ) -> List[User]: + def populate_owners(owner_ids: Optional[List[int]] = None) -> List[User]: """ Populate list of owners. If current user is missing in `owner_ids`, current user is added unless belonging to the Admin role. - :param user: current user :param owner_ids: list of owners by id's :raises OwnersNotFoundValidationError: if at least one owner can't be resolved :returns: Final list of owners """ - return populate_owners(user, owner_ids, default_to_user=False) + return populate_owners(owner_ids, default_to_user=False) diff --git a/superset/commands/importers/v1/__init__.py b/superset/commands/importers/v1/__init__.py index c620ec9f2ac8..fc67d1822e54 100644 --- a/superset/commands/importers/v1/__init__.py +++ b/superset/commands/importers/v1/__init__.py @@ -67,6 +67,9 @@ def run(self) -> None: try: self._import(db.session, self._configs, self.overwrite) db.session.commit() + except CommandException as ex: + db.session.rollback() + raise ex except Exception as ex: db.session.rollback() raise self.import_error() from ex diff --git a/superset/commands/importers/v1/assets.py b/superset/commands/importers/v1/assets.py index 9f945c560af5..b63de59536c6 100644 --- a/superset/commands/importers/v1/assets.py +++ b/superset/commands/importers/v1/assets.py @@ -14,12 +14,12 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from typing import Any, Dict, List, Optional, Tuple +from typing import Any, Dict, List, Optional from marshmallow import Schema from marshmallow.exceptions import ValidationError from sqlalchemy.orm import Session -from sqlalchemy.sql import select +from sqlalchemy.sql import delete, insert from superset import db from superset.charts.commands.importers.v1.utils import import_chart @@ -70,7 +70,6 @@ def __init__(self, contents: Dict[str, str], *args: Any, **kwargs: Any): self.passwords: Dict[str, str] = kwargs.get("passwords") or {} self._configs: Dict[str, Any] = {} - # pylint: disable=too-many-locals @staticmethod def _import(session: Session, configs: Dict[str, Any]) -> None: # import databases first @@ -106,31 +105,30 @@ def _import(session: Session, configs: Dict[str, Any]) -> None: chart = import_chart(session, config, overwrite=True) chart_ids[str(chart.uuid)] = chart.id - # store the existing relationship between dashboards and charts - existing_relationships = session.execute( - select([dashboard_slices.c.dashboard_id, dashboard_slices.c.slice_id]) - ).fetchall() - # import dashboards - dashboard_chart_ids: List[Tuple[int, int]] = [] for file_name, config in configs.items(): if file_name.startswith("dashboards/"): config = update_id_refs(config, chart_ids, dataset_info) dashboard = import_dashboard(session, config, overwrite=True) + + # set ref in the dashboard_slices table + dashboard_chart_ids: List[Dict[str, int]] = [] for uuid in find_chart_uuids(config["position"]): if uuid not in chart_ids: break chart_id = chart_ids[uuid] - if (dashboard.id, chart_id) not in existing_relationships: - dashboard_chart_ids.append((dashboard.id, chart_id)) - - # set ref in the dashboard_slices table - values = [ - {"dashboard_id": dashboard_id, "slice_id": chart_id} - for (dashboard_id, chart_id) in dashboard_chart_ids - ] - # pylint: disable=no-value-for-parameter # sqlalchemy/issues/4656 - session.execute(dashboard_slices.insert(), values) + dashboard_chart_id = { + "dashboard_id": dashboard.id, + "slice_id": chart_id, + } + dashboard_chart_ids.append(dashboard_chart_id) + + session.execute( + delete(dashboard_slices).where( + dashboard_slices.c.dashboard_id == dashboard.id + ) + ) + session.execute(insert(dashboard_slices).values(dashboard_chart_ids)) def run(self) -> None: self.validate() diff --git a/superset/commands/importers/v1/examples.py b/superset/commands/importers/v1/examples.py index 679b9c441beb..99aa831faaa4 100644 --- a/superset/commands/importers/v1/examples.py +++ b/superset/commands/importers/v1/examples.py @@ -181,5 +181,4 @@ def _import( # pylint: disable=arguments-differ, too-many-locals, too-many-bran {"dashboard_id": dashboard_id, "slice_id": chart_id} for (dashboard_id, chart_id) in dashboard_chart_ids ] - # pylint: disable=no-value-for-parameter # sqlalchemy/issues/4656 session.execute(dashboard_slices.insert(), values) diff --git a/superset/commands/importers/v1/utils.py b/superset/commands/importers/v1/utils.py index 3999669356ae..1e73886682ac 100644 --- a/superset/commands/importers/v1/utils.py +++ b/superset/commands/importers/v1/utils.py @@ -14,7 +14,7 @@ # under the License. import logging -from pathlib import Path +from pathlib import Path, PurePosixPath from typing import Any, Dict, List, Optional from zipfile import ZipFile @@ -34,8 +34,8 @@ def remove_root(file_path: str) -> str: """Remove the first directory of a path""" - full_path = Path(file_path) - relative_path = Path(*full_path.parts[1:]) + full_path = PurePosixPath(file_path) + relative_path = PurePosixPath(*full_path.parts[1:]) return str(relative_path) diff --git a/superset/commands/utils.py b/superset/commands/utils.py index f7564b3de768..ad58bb40506f 100644 --- a/superset/commands/utils.py +++ b/superset/commands/utils.py @@ -18,29 +18,31 @@ from typing import List, Optional, TYPE_CHECKING +from flask import g from flask_appbuilder.security.sqla.models import Role, User +from superset import security_manager from superset.commands.exceptions import ( DatasourceNotFoundValidationError, OwnersNotFoundValidationError, RolesNotFoundValidationError, ) -from superset.connectors.connector_registry import ConnectorRegistry -from superset.datasets.commands.exceptions import DatasetNotFoundError -from superset.extensions import db, security_manager +from superset.dao.exceptions import DatasourceNotFound +from superset.datasource.dao import DatasourceDAO +from superset.extensions import db +from superset.utils.core import DatasourceType, get_user_id if TYPE_CHECKING: from superset.connectors.base.models import BaseDatasource def populate_owners( - user: User, owner_ids: Optional[List[int]], default_to_user: bool, ) -> List[User]: """ Helper function for commands, will fetch all users from owners id's - :param user: current user + :param owner_ids: list of owners by id's :param default_to_user: make user the owner if `owner_ids` is None or empty :raises OwnersNotFoundValidationError: if at least one owner id can't be resolved @@ -49,12 +51,10 @@ def populate_owners( owner_ids = owner_ids or [] owners = [] if not owner_ids and default_to_user: - return [user] - if user.id not in owner_ids and "admin" not in [ - role.name.lower() for role in user.roles - ]: + return [g.user] + if not (security_manager.is_admin() or get_user_id() in owner_ids): # make sure non-admins can't remove themselves as owner by mistake - owners.append(user) + owners.append(g.user) for owner_id in owner_ids: owner = security_manager.get_user_by_id(owner_id) if not owner: @@ -79,8 +79,8 @@ def populate_roles(role_ids: Optional[List[int]] = None) -> List[Role]: def get_datasource_by_id(datasource_id: int, datasource_type: str) -> BaseDatasource: try: - return ConnectorRegistry.get_datasource( - datasource_type, datasource_id, db.session + return DatasourceDAO.get_datasource( + db.session, DatasourceType(datasource_type), datasource_id ) - except DatasetNotFoundError as ex: + except DatasourceNotFound as ex: raise DatasourceNotFoundValidationError() from ex diff --git a/superset/common/chart_data.py b/superset/common/chart_data.py index f3917d6d8717..659a64015937 100644 --- a/superset/common/chart_data.py +++ b/superset/common/chart_data.py @@ -15,6 +15,7 @@ # specific language governing permissions and limitations # under the License. from enum import Enum +from typing import Set class ChartDataResultFormat(str, Enum): @@ -24,6 +25,11 @@ class ChartDataResultFormat(str, Enum): CSV = "csv" JSON = "json" + XLSX = "xlsx" + + @classmethod + def table_like(cls) -> Set["ChartDataResultFormat"]: + return {cls.CSV} | {cls.XLSX} class ChartDataResultType(str, Enum): @@ -38,3 +44,4 @@ class ChartDataResultType(str, Enum): SAMPLES = "samples" TIMEGRAINS = "timegrains" POST_PROCESSED = "post_processed" + DRILL_DETAIL = "drill_detail" diff --git a/superset/common/query_actions.py b/superset/common/query_actions.py index 5899757d528d..bfb3d368789d 100644 --- a/superset/common/query_actions.py +++ b/superset/common/query_actions.py @@ -150,12 +150,39 @@ def _get_samples( query_obj.orderby = [] query_obj.metrics = None query_obj.post_processing = [] - query_obj.columns = [o.column_name for o in datasource.columns] + qry_obj_cols = [] + for o in datasource.columns: + if isinstance(o, dict): + qry_obj_cols.append(o.get("column_name")) + else: + qry_obj_cols.append(o.column_name) + query_obj.columns = qry_obj_cols query_obj.from_dttm = None query_obj.to_dttm = None return _get_full(query_context, query_obj, force_cached) +def _get_drill_detail( + query_context: QueryContext, query_obj: QueryObject, force_cached: bool = False +) -> Dict[str, Any]: + # todo(yongjie): Remove this function, + # when determining whether samples should be applied to the time filter. + datasource = _get_datasource(query_context, query_obj) + query_obj = copy.copy(query_obj) + query_obj.is_timeseries = False + query_obj.orderby = [] + query_obj.metrics = None + query_obj.post_processing = [] + qry_obj_cols = [] + for o in datasource.columns: + if isinstance(o, dict): + qry_obj_cols.append(o.get("column_name")) + else: + qry_obj_cols.append(o.column_name) + query_obj.columns = qry_obj_cols + return _get_full(query_context, query_obj, force_cached) + + def _get_results( query_context: QueryContext, query_obj: QueryObject, force_cached: bool = False ) -> Dict[str, Any]: @@ -176,6 +203,7 @@ def _get_results( # and post-process it later where we have the chart context, since # post-processing is unique to each visualization type ChartDataResultType.POST_PROCESSED: _get_full, + ChartDataResultType.DRILL_DETAIL: _get_drill_detail, } diff --git a/superset/common/query_context_factory.py b/superset/common/query_context_factory.py index 9a8aaefa9f78..126000a83d27 100644 --- a/superset/common/query_context_factory.py +++ b/superset/common/query_context_factory.py @@ -22,10 +22,11 @@ from superset.charts.dao import ChartDAO from superset.common.chart_data import ChartDataResultFormat, ChartDataResultType from superset.common.query_context import QueryContext +from superset.common.query_object import QueryObject from superset.common.query_object_factory import QueryObjectFactory -from superset.connectors.connector_registry import ConnectorRegistry +from superset.datasource.dao import DatasourceDAO from superset.models.slice import Slice -from superset.utils.core import DatasourceDict +from superset.utils.core import DatasourceDict, DatasourceType if TYPE_CHECKING: from superset.connectors.base.models import BaseDatasource @@ -34,7 +35,7 @@ def create_query_object_factory() -> QueryObjectFactory: - return QueryObjectFactory(config, ConnectorRegistry(), db.session) + return QueryObjectFactory(config, DatasourceDAO(), db.session) class QueryContextFactory: # pylint: disable=too-few-public-methods @@ -66,8 +67,12 @@ def create( result_type = result_type or ChartDataResultType.FULL result_format = result_format or ChartDataResultFormat.JSON queries_ = [ - self._query_object_factory.create( - result_type, datasource=datasource, **query_obj + self._process_query_object( + datasource_model_instance, + form_data, + self._query_object_factory.create( + result_type, datasource=datasource, **query_obj + ), ) for query_obj in queries ] @@ -92,9 +97,97 @@ def create( # pylint: disable=no-self-use def _convert_to_model(self, datasource: DatasourceDict) -> BaseDatasource: - return ConnectorRegistry.get_datasource( - str(datasource["type"]), int(datasource["id"]), db.session + return DatasourceDAO.get_datasource( + session=db.session, + datasource_type=DatasourceType(datasource["type"]), + datasource_id=int(datasource["id"]), ) def _get_slice(self, slice_id: Any) -> Optional[Slice]: return ChartDAO.find_by_id(slice_id) + + def _process_query_object( + self, + datasource: BaseDatasource, + form_data: Optional[Dict[str, Any]], + query_object: QueryObject, + ) -> QueryObject: + self._apply_granularity(query_object, form_data, datasource) + self._apply_filters(query_object) + return query_object + + def _apply_granularity( + self, + query_object: QueryObject, + form_data: Optional[Dict[str, Any]], + datasource: BaseDatasource, + ) -> None: + temporal_columns = { + column["column_name"] if isinstance(column, dict) else column.column_name + for column in datasource.columns + if (column["is_dttm"] if isinstance(column, dict) else column.is_dttm) + } + granularity = query_object.granularity + x_axis = form_data and form_data.get("x_axis") + + if granularity: + filter_to_remove = None + if x_axis and x_axis in temporal_columns: + filter_to_remove = x_axis + x_axis_column = next( + ( + column + for column in query_object.columns + if column == x_axis + or ( + isinstance(column, dict) + and column["sqlExpression"] == x_axis + ) + ), + None, + ) + # Replaces x-axis column values with granularity + if x_axis_column: + if isinstance(x_axis_column, dict): + x_axis_column["sqlExpression"] = granularity + x_axis_column["label"] = granularity + else: + query_object.columns = [ + granularity if column == x_axis_column else column + for column in query_object.columns + ] + for post_processing in query_object.post_processing: + if post_processing.get("operation") == "pivot": + post_processing["options"]["index"] = [granularity] + + # If no temporal x-axis, then get the default temporal filter + if not filter_to_remove: + temporal_filters = [ + filter["col"] + for filter in query_object.filter + if filter["op"] == "TEMPORAL_RANGE" + ] + if len(temporal_filters) > 0: + # Use granularity if it's already in the filters + if granularity in temporal_filters: + filter_to_remove = granularity + else: + # Use the first temporal filter + filter_to_remove = temporal_filters[0] + + # Removes the temporal filter which may be an x-axis or + # another temporal filter. A new filter based on the value of + # the granularity will be added later in the code. + # In practice, this is replacing the previous default temporal filter. + if filter_to_remove: + query_object.filter = [ + filter + for filter in query_object.filter + if filter["col"] != filter_to_remove + ] + + def _apply_filters(self, query_object: QueryObject) -> None: + if query_object.time_range: + for filter_object in query_object.filter: + if filter_object["op"] == "TEMPORAL_RANGE": + filter_object["val"] = query_object.time_range diff --git a/superset/common/query_context_processor.py b/superset/common/query_context_processor.py index 606836b1de88..77ca69fcf6f0 100644 --- a/superset/common/query_context_processor.py +++ b/superset/common/query_context_processor.py @@ -18,6 +18,7 @@ import copy import logging +import re from typing import Any, ClassVar, Dict, List, Optional, TYPE_CHECKING, Union import numpy as np @@ -32,8 +33,9 @@ from superset.common.chart_data import ChartDataResultFormat from superset.common.db_query_status import QueryStatus from superset.common.query_actions import get_query_results -from superset.common.utils import dataframe_utils as df_utils +from superset.common.utils import dataframe_utils from superset.common.utils.query_cache_manager import QueryCacheManager +from superset.common.utils.time_range_utils import get_since_until_from_query_object from superset.connectors.base.models import BaseDatasource from superset.constants import CacheRegion from superset.exceptions import ( @@ -43,18 +45,24 @@ ) from superset.extensions import cache_manager, security_manager from superset.models.helpers import QueryResult -from superset.utils import csv +from superset.models.sql_lab import Query +from superset.utils import csv, excel from superset.utils.cache import generate_cache_key, set_and_log_cache from superset.utils.core import ( + DatasourceType, + DateColumn, DTTM_ALIAS, error_msg_from_exception, + get_base_axis_labels, get_column_names_from_columns, get_column_names_from_metrics, get_metric_names, + get_xaxis_label, normalize_dttm_col, TIME_COMPARISON, ) from superset.utils.date_parser import get_past_or_future, normalize_time_delta +from superset.utils.pandas_postprocessing.utils import unescape_separator from superset.views.utils import get_viz if TYPE_CHECKING: @@ -116,13 +124,15 @@ def get_df_payload( and col != DTTM_ALIAS ) ] + if invalid_columns: raise QueryObjectValidationError( _( - "Columns missing in datasource: %(invalid_columns)s", + "Columns missing in dataset: %(invalid_columns)s", invalid_columns=invalid_columns, ) ) + query_result = self.get_query_result(query_obj) annotation_data = self.get_annotation_data(query_obj) cache.set_query_result( @@ -138,6 +148,17 @@ def get_df_payload( cache.error_message = str(ex) cache.status = QueryStatus.FAILED + # the N-dimensional DataFrame has converteds into flat DataFrame + # by `flatten operator`, "comma" in the column is escaped by `escape_separator` + # the result DataFrame columns should be unescaped + label_map = { + unescape_separator(col): [ + unescape_separator(col) for col in re.split(r"(?<!\\),\s", col) + ] + for col in cache.df.columns.values + } + cache.df.columns = [unescape_separator(col) for col in cache.df.columns.values] + return { "cache_key": cache_key, "cached_dttm": cache.cache_dttm, @@ -153,6 +174,7 @@ def get_df_payload( "rowcount": len(cache.df.index), "from_dttm": query_obj.from_dttm, "to_dttm": query_obj.to_dttm, + "label_map": label_map, } def query_cache_key(self, query_obj: QueryObject, **kwargs: Any) -> Optional[str]: @@ -182,9 +204,13 @@ def get_query_result(self, query_object: QueryObject) -> QueryResult: # a valid assumption for current setting. In the long term, we may # support multiple queries from different data sources. - # The datasource here can be different backend but the interface is common - result = query_context.datasource.query(query_object.to_dict()) - query = result.query + ";\n\n" + query = "" + if isinstance(query_context.datasource, Query): + # todo(hugh): add logic to manage all sip68 models here + result = query_context.datasource.exc_query(query_object.to_dict()) + else: + result = query_context.datasource.query(query_object.to_dict()) + query = result.query + ";\n\n" df = result.df # Transform the timestamp we received from database to pandas supported @@ -216,28 +242,68 @@ def get_query_result(self, query_object: QueryObject) -> QueryResult: return result def normalize_df(self, df: pd.DataFrame, query_object: QueryObject) -> pd.DataFrame: - datasource = self._qc_datasource - timestamp_format = None - if datasource.type == "table": - dttm_col = datasource.get_column(query_object.granularity) - if dttm_col: - timestamp_format = dttm_col.python_date_format + # todo: should support "python_date_format" and "get_column" in each datasource + def _get_timestamp_format( + source: BaseDatasource, column: Optional[str] + ) -> Optional[str]: + column_obj = source.get_column(column) + if ( + column_obj + # only sqla column was supported + and hasattr(column_obj, "python_date_format") + and (formatter := column_obj.python_date_format) + ): + return str(formatter) + + return None + datasource = self._qc_datasource + labels = tuple( + label + for label in [ + *get_base_axis_labels(query_object.columns), + query_object.granularity, + ] + if datasource + # Query datasource didn't support `get_column` + and hasattr(datasource, "get_column") + and (col := datasource.get_column(label)) + # todo(hugh) standardize column object in Query datasource + and (col.get("is_dttm") if isinstance(col, dict) else col.is_dttm) + ) + dttm_cols = [ + DateColumn( + timestamp_format=_get_timestamp_format(datasource, label), + offset=datasource.offset, + time_shift=query_object.time_shift, + col_label=label, + ) + for label in labels + if label + ] + if DTTM_ALIAS in df: + dttm_cols.append( + DateColumn.get_legacy_time_column( + timestamp_format=_get_timestamp_format( + datasource, query_object.granularity + ), + offset=datasource.offset, + time_shift=query_object.time_shift, + ) + ) normalize_dttm_col( df=df, - timestamp_format=timestamp_format, - offset=datasource.offset, - time_shift=query_object.time_shift, + dttm_cols=tuple(dttm_cols), ) if self.enforce_numerical_metrics: - df_utils.df_metrics_to_num(df, query_object) + dataframe_utils.df_metrics_to_num(df, query_object) df.replace([np.inf, -np.inf], np.nan, inplace=True) return df - def processing_time_offsets( # pylint: disable=too-many-locals + def processing_time_offsets( # pylint: disable=too-many-locals,too-many-statements self, df: pd.DataFrame, query_object: QueryObject, @@ -250,15 +316,36 @@ def processing_time_offsets( # pylint: disable=too-many-locals rv_dfs: List[pd.DataFrame] = [df] time_offsets = query_object.time_offsets - outer_from_dttm = query_object.from_dttm - outer_to_dttm = query_object.to_dttm + outer_from_dttm, outer_to_dttm = get_since_until_from_query_object(query_object) + if not outer_from_dttm or not outer_to_dttm: + raise QueryObjectValidationError( + _( + "An enclosed time range (both start and end) must be specified " + "when using a Time Comparison." + ) + ) for offset in time_offsets: try: + # pylint: disable=line-too-long + # Since the xaxis is also a column name for the time filter, xaxis_label will be set as granularity + # these query object are equivalent: + # 1) { granularity: 'dttm_col', time_range: '2020 : 2021', time_offsets: ['1 year ago']} + # 2) { columns: [ + # {label: 'dttm_col', sqlExpression: 'dttm_col', "columnType": "BASE_AXIS" } + # ], + # time_offsets: ['1 year ago'], + # filters: [{col: 'dttm_col', op: 'TEMPORAL_RANGE', val: '2020 : 2021'}], + # } query_object_clone.from_dttm = get_past_or_future( offset, outer_from_dttm, ) query_object_clone.to_dttm = get_past_or_future(offset, outer_to_dttm) + + xaxis_label = get_xaxis_label(query_object.columns) + query_object_clone.granularity = ( + query_object_clone.granularity or xaxis_label + ) except ValueError as ex: raise QueryObjectValidationError(str(ex)) from ex # make sure subquery use main query where clause @@ -266,14 +353,12 @@ def processing_time_offsets( # pylint: disable=too-many-locals query_object_clone.inner_to_dttm = outer_to_dttm query_object_clone.time_offsets = [] query_object_clone.post_processing = [] + query_object_clone.filter = [ + flt + for flt in query_object_clone.filter + if flt.get("col") != xaxis_label + ] - if not query_object.from_dttm or not query_object.to_dttm: - raise QueryObjectValidationError( - _( - "An enclosed time range (both start and end) must be specified " - "when using a Time Comparison." - ) - ) # `offset` is added to the hash function cache_key = self.query_cache_key(query_object_clone, time_offset=offset) cache = QueryCacheManager.get( @@ -296,7 +381,11 @@ def processing_time_offsets( # pylint: disable=too-many-locals } join_keys = [col for col in df.columns if col not in metrics_mapping.keys()] - result = self._qc_datasource.query(query_object_clone_dct) + if isinstance(self._qc_datasource, Query): + result = self._qc_datasource.exc_query(query_object_clone_dct) + else: + result = self._qc_datasource.query(query_object_clone_dct) + queries.append(result.query) cache_keys.append(None) @@ -318,13 +407,8 @@ def processing_time_offsets( # pylint: disable=too-many-locals offset_metrics_df = offset_metrics_df.rename(columns=metrics_mapping) # 3. set time offset for index - # TODO: add x-axis to QueryObject, potentially as an array for - # multi-dimensional charts - granularity = query_object.granularity - index = granularity if granularity in df.columns else DTTM_ALIAS - if not pd.api.types.is_datetime64_any_dtype( - offset_metrics_df.get(index) - ): + index = (get_base_axis_labels(query_object.columns) or [DTTM_ALIAS])[0] + if not dataframe_utils.is_datetime_series(offset_metrics_df.get(index)): raise QueryObjectValidationError( _( "A time column must be specified " @@ -337,7 +421,7 @@ def processing_time_offsets( # pylint: disable=too-many-locals ) # df left join `offset_metrics_df` - offset_df = df_utils.left_join_df( + offset_df = dataframe_utils.left_join_df( left_df=df, right_df=offset_metrics_df, join_keys=join_keys, @@ -362,15 +446,20 @@ def processing_time_offsets( # pylint: disable=too-many-locals return CachedTimeOffset(df=rv_df, queries=queries, cache_keys=cache_keys) def get_data(self, df: pd.DataFrame) -> Union[str, List[Dict[str, Any]]]: - if self._query_context.result_format == ChartDataResultFormat.CSV: + if self._query_context.result_format in ChartDataResultFormat.table_like(): include_index = not isinstance(df.index, pd.RangeIndex) columns = list(df.columns) verbose_map = self._qc_datasource.data.get("verbose_map", {}) if verbose_map: df.columns = [verbose_map.get(column, column) for column in columns] - result = csv.df_to_escaped_csv( - df, index=include_index, **config["CSV_EXPORT"] - ) + + result = None + if self._query_context.result_format == ChartDataResultFormat.CSV: + result = csv.df_to_escaped_csv( + df, index=include_index, **config["CSV_EXPORT"] + ) + elif self._query_context.result_format == ChartDataResultFormat.XLSX: + result = excel.df_to_excel(df, **config["EXCEL_EXPORT"]) return result or "" return df.to_dict(orient="records") @@ -489,7 +578,10 @@ def get_viz_annotation_data( chart = ChartDAO.find_by_id(annotation_layer["value"]) if not chart: raise QueryObjectValidationError(_("The chart does not exist")) + if not chart.datasource: + raise QueryObjectValidationError(_("The chart datasource does not exist")) form_data = chart.form_data.copy() + form_data.update(annotation_layer.get("overrides", {})) try: viz_obj = get_viz( datasource_type=chart.datasource.type, @@ -510,4 +602,8 @@ def raise_for_access(self) -> None: """ for query in self._query_context.queries: query.validate() - security_manager.raise_for_access(query_context=self._query_context) + + if self._qc_datasource.type == DatasourceType.QUERY: + security_manager.raise_for_access(query=self._qc_datasource) + else: + security_manager.raise_for_access(query_context=self._query_context) diff --git a/superset/common/query_object.py b/superset/common/query_object.py index a8585fd47e05..94cf2a74ccaa 100644 --- a/superset/common/query_object.py +++ b/superset/common/query_object.py @@ -19,7 +19,7 @@ import json import logging -from datetime import datetime, timedelta +from datetime import datetime from pprint import pformat from typing import Any, Dict, List, NamedTuple, Optional, TYPE_CHECKING @@ -46,7 +46,6 @@ json_int_dttm_ser, QueryObjectFilterClause, ) -from superset.utils.date_parser import parse_human_timedelta from superset.utils.hashing import md5_sha_from_dict if TYPE_CHECKING: @@ -73,8 +72,6 @@ class DeprecatedField(NamedTuple): DEPRECATED_EXTRAS_FIELDS = ( DeprecatedField(old_name="where", new_name="where"), DeprecatedField(old_name="having", new_name="having"), - DeprecatedField(old_name="having_filters", new_name="having_druid"), - DeprecatedField(old_name="druid_time_origin", new_name="druid_time_origin"), ) @@ -108,7 +105,7 @@ class QueryObject: # pylint: disable=too-many-instance-attributes series_limit: int series_limit_metric: Optional[Metric] time_offsets: List[str] - time_shift: Optional[timedelta] + time_shift: Optional[str] time_range: Optional[str] to_dttm: Optional[datetime] @@ -158,7 +155,7 @@ def __init__( # pylint: disable=too-many-locals self.series_limit = series_limit self.series_limit_metric = series_limit_metric self.time_range = time_range - self.time_shift = parse_human_timedelta(time_shift) + self.time_shift = time_shift self.from_dttm = kwargs.get("from_dttm") self.to_dttm = kwargs.get("to_dttm") self.result_type = kwargs.get("result_type") @@ -338,6 +335,7 @@ def to_dict(self) -> Dict[str, Any]: "series_limit": self.series_limit, "series_limit_metric": self.series_limit_metric, "to_dttm": self.to_dttm, + "time_shift": self.time_shift, } return query_object_dict diff --git a/superset/common/query_object_factory.py b/superset/common/query_object_factory.py index 64ae99deebab..88cc7ca1b461 100644 --- a/superset/common/query_object_factory.py +++ b/superset/common/query_object_factory.py @@ -16,34 +16,33 @@ # under the License. from __future__ import annotations -from datetime import datetime -from typing import Any, Dict, Optional, Tuple, TYPE_CHECKING +from typing import Any, Dict, Optional, TYPE_CHECKING from superset.common.chart_data import ChartDataResultType from superset.common.query_object import QueryObject -from superset.utils.core import apply_max_row_limit, DatasourceDict -from superset.utils.date_parser import get_since_until +from superset.common.utils.time_range_utils import get_since_until_from_time_range +from superset.utils.core import apply_max_row_limit, DatasourceDict, DatasourceType if TYPE_CHECKING: from sqlalchemy.orm import sessionmaker - from superset import ConnectorRegistry from superset.connectors.base.models import BaseDatasource + from superset.datasource.dao import DatasourceDAO class QueryObjectFactory: # pylint: disable=too-few-public-methods _config: Dict[str, Any] - _connector_registry: ConnectorRegistry + _datasource_dao: DatasourceDAO _session_maker: sessionmaker def __init__( self, app_configurations: Dict[str, Any], - connector_registry: ConnectorRegistry, + _datasource_dao: DatasourceDAO, session_maker: sessionmaker, ): self._config = app_configurations - self._connector_registry = connector_registry + self._datasource_dao = _datasource_dao self._session_maker = session_maker def create( # pylint: disable=too-many-arguments @@ -62,7 +61,9 @@ def create( # pylint: disable=too-many-arguments processed_extras = self._process_extras(extras) result_type = kwargs.setdefault("result_type", parent_result_type) row_limit = self._process_row_limit(row_limit, result_type) - from_dttm, to_dttm = self._get_dttms(time_range, time_shift, processed_extras) + from_dttm, to_dttm = get_since_until_from_time_range( + time_range, time_shift, processed_extras + ) kwargs["from_dttm"] = from_dttm kwargs["to_dttm"] = to_dttm return QueryObject( @@ -75,8 +76,10 @@ def create( # pylint: disable=too-many-arguments ) def _convert_to_model(self, datasource: DatasourceDict) -> BaseDatasource: - return self._connector_registry.get_datasource( - str(datasource["type"]), int(datasource["id"]), self._session_maker() + return self._datasource_dao.get_datasource( + datasource_type=DatasourceType(datasource["type"]), + datasource_id=int(datasource["id"]), + session=self._session_maker(), ) def _process_extras( # pylint: disable=no-self-use @@ -96,23 +99,6 @@ def _process_row_limit( ) return apply_max_row_limit(row_limit or default_row_limit) - def _get_dttms( - self, - time_range: Optional[str], - time_shift: Optional[str], - extras: Dict[str, Any], - ) -> Tuple[Optional[datetime], Optional[datetime]]: - return get_since_until( - relative_start=extras.get( - "relative_start", self._config["DEFAULT_RELATIVE_START_TIME"] - ), - relative_end=extras.get( - "relative_end", self._config["DEFAULT_RELATIVE_END_TIME"] - ), - time_range=time_range, - time_shift=time_shift, - ) - # light version of the view.utils.core # import view.utils require application context # Todo: move it and the view.utils.core to utils package diff --git a/superset/common/tags.py b/superset/common/tags.py index 74c882cf92f6..706192913a1c 100644 --- a/superset/common/tags.py +++ b/superset/common/tags.py @@ -14,76 +14,20 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from sqlalchemy import Metadata -from sqlalchemy.engine import Engine -from sqlalchemy.exc import IntegrityError -from sqlalchemy.sql import and_, func, functions, join, literal, select - -from superset.models.tags import ObjectTypes, TagTypes +from typing import Any, List +from sqlalchemy import MetaData +from sqlalchemy.exc import IntegrityError +from sqlalchemy.sql import and_, func, join, literal, select -def add_types(engine: Engine, metadata: Metadata) -> None: - """ - Tag every object according to its type: - - INSERT INTO tagged_object (tag_id, object_id, object_type) - SELECT - tag.id AS tag_id, - slices.id AS object_id, - 'chart' AS object_type - FROM slices - JOIN tag - ON tag.name = 'type:chart' - LEFT OUTER JOIN tagged_object - ON tagged_object.tag_id = tag.id - AND tagged_object.object_id = slices.id - AND tagged_object.object_type = 'chart' - WHERE tagged_object.tag_id IS NULL; - - INSERT INTO tagged_object (tag_id, object_id, object_type) - SELECT - tag.id AS tag_id, - dashboards.id AS object_id, - 'dashboard' AS object_type - FROM dashboards - JOIN tag - ON tag.name = 'type:dashboard' - LEFT OUTER JOIN tagged_object - ON tagged_object.tag_id = tag.id - AND tagged_object.object_id = dashboards.id - AND tagged_object.object_type = 'dashboard' - WHERE tagged_object.tag_id IS NULL; - - INSERT INTO tagged_object (tag_id, object_id, object_type) - SELECT - tag.id AS tag_id, - saved_query.id AS object_id, - 'query' AS object_type - FROM saved_query - JOIN tag - ON tag.name = 'type:query'; - LEFT OUTER JOIN tagged_object - ON tagged_object.tag_id = tag.id - AND tagged_object.object_id = saved_query.id - AND tagged_object.object_type = 'query' - WHERE tagged_object.tag_id IS NULL; +from superset.extensions import db +from superset.tags.models import ObjectTypes, TagTypes - """ - tag = metadata.tables["tag"] - tagged_object = metadata.tables["tagged_object"] +def add_types_to_charts( + metadata: MetaData, tag: Any, tagged_object: Any, columns: List[str] +) -> None: slices = metadata.tables["slices"] - dashboards = metadata.tables["dashboards"] - saved_query = metadata.tables["saved_query"] - columns = ["tag_id", "object_id", "object_type"] - - # add a tag for each object type - insert = tag.insert() - for type_ in ObjectTypes.__members__: - try: - engine.execute(insert, name=f"type:{type_}", type=TagTypes.type) - except IntegrityError: - pass # already exists charts = ( select( @@ -109,23 +53,29 @@ def add_types(engine: Engine, metadata: Metadata) -> None: .where(tagged_object.c.tag_id.is_(None)) ) query = tagged_object.insert().from_select(columns, charts) - engine.execute(query) + db.session.execute(query) + + +def add_types_to_dashboards( + metadata: MetaData, tag: Any, tagged_object: Any, columns: List[str] +) -> None: + dashboard_table = metadata.tables["dashboards"] dashboards = ( select( [ tag.c.id.label("tag_id"), - dashboards.c.id.label("object_id"), + dashboard_table.c.id.label("object_id"), literal(ObjectTypes.dashboard.name).label("object_type"), ] ) .select_from( join( - join(dashboards, tag, tag.c.name == "type:dashboard"), + join(dashboard_table, tag, tag.c.name == "type:dashboard"), tagged_object, and_( tagged_object.c.tag_id == tag.c.id, - tagged_object.c.object_id == dashboards.c.id, + tagged_object.c.object_id == dashboard_table.c.id, tagged_object.c.object_type == "dashboard", ), isouter=True, @@ -135,7 +85,13 @@ def add_types(engine: Engine, metadata: Metadata) -> None: .where(tagged_object.c.tag_id.is_(None)) ) query = tagged_object.insert().from_select(columns, dashboards) - engine.execute(query) + db.session.execute(query) + + +def add_types_to_saved_queries( + metadata: MetaData, tag: Any, tagged_object: Any, columns: List[str] +) -> None: + saved_query = metadata.tables["saved_query"] saved_queries = ( select( @@ -161,12 +117,44 @@ def add_types(engine: Engine, metadata: Metadata) -> None: .where(tagged_object.c.tag_id.is_(None)) ) query = tagged_object.insert().from_select(columns, saved_queries) - engine.execute(query) + db.session.execute(query) + + +def add_types_to_datasets( + metadata: MetaData, tag: Any, tagged_object: Any, columns: List[str] +) -> None: + tables = metadata.tables["tables"] + + datasets = ( + select( + [ + tag.c.id.label("tag_id"), + tables.c.id.label("object_id"), + literal(ObjectTypes.dataset.name).label("object_type"), + ] + ) + .select_from( + join( + join(tables, tag, tag.c.name == "type:dataset"), + tagged_object, + and_( + tagged_object.c.tag_id == tag.c.id, + tagged_object.c.object_id == tables.c.id, + tagged_object.c.object_type == "dataset", + ), + isouter=True, + full=False, + ) + ) + .where(tagged_object.c.tag_id.is_(None)) + ) + query = tagged_object.insert().from_select(columns, datasets) + db.session.execute(query) -def add_owners(engine: Engine, metadata: Metadata) -> None: +def add_types(metadata: MetaData) -> None: """ - Tag every object according to its owner: + Tag every object according to its type: INSERT INTO tagged_object (tag_id, object_id, object_type) SELECT @@ -175,58 +163,84 @@ def add_owners(engine: Engine, metadata: Metadata) -> None: 'chart' AS object_type FROM slices JOIN tag - ON tag.name = CONCAT('owner:', slices.created_by_fk) + ON tag.name = 'type:chart' LEFT OUTER JOIN tagged_object ON tagged_object.tag_id = tag.id AND tagged_object.object_id = slices.id AND tagged_object.object_type = 'chart' WHERE tagged_object.tag_id IS NULL; + INSERT INTO tagged_object (tag_id, object_id, object_type) SELECT tag.id AS tag_id, dashboards.id AS object_id, 'dashboard' AS object_type FROM dashboards JOIN tag - ON tag.name = CONCAT('owner:', dashboards.created_by_fk) + ON tag.name = 'type:dashboard' LEFT OUTER JOIN tagged_object ON tagged_object.tag_id = tag.id AND tagged_object.object_id = dashboards.id AND tagged_object.object_type = 'dashboard' WHERE tagged_object.tag_id IS NULL; + INSERT INTO tagged_object (tag_id, object_id, object_type) SELECT tag.id AS tag_id, saved_query.id AS object_id, 'query' AS object_type FROM saved_query JOIN tag - ON tag.name = CONCAT('owner:', saved_query.created_by_fk) + ON tag.name = 'type:query'; LEFT OUTER JOIN tagged_object ON tagged_object.tag_id = tag.id AND tagged_object.object_id = saved_query.id AND tagged_object.object_type = 'query' WHERE tagged_object.tag_id IS NULL; + INSERT INTO tagged_object (tag_id, object_id, object_type) + SELECT + tag.id AS tag_id, + tables.id AS object_id, + 'dataset' AS object_type + FROM tables + JOIN tag + ON tag.name = 'type:dataset' + LEFT OUTER JOIN tagged_object + ON tagged_object.tag_id = tag.id + AND tagged_object.object_id = tables.id + AND tagged_object.object_type = 'dataset' + WHERE tagged_object.tag_id IS NULL; + """ tag = metadata.tables["tag"] tagged_object = metadata.tables["tagged_object"] - users = metadata.tables["ab_user"] - slices = metadata.tables["slices"] - dashboards = metadata.tables["dashboards"] - saved_query = metadata.tables["saved_query"] columns = ["tag_id", "object_id", "object_type"] - # create a custom tag for each user - ids = select([users.c.id]) + # add a tag for each object type insert = tag.insert() - for (id_,) in engine.execute(ids): + for type_ in ObjectTypes.__members__: try: - engine.execute(insert, name=f"owner:{id_}", type=TagTypes.owner) + db.session.execute( + insert, + name=f"type:{type_}", + type=TagTypes.type, + ) except IntegrityError: pass # already exists + add_types_to_charts(metadata, tag, tagged_object, columns) + add_types_to_dashboards(metadata, tag, tagged_object, columns) + add_types_to_saved_queries(metadata, tag, tagged_object, columns) + add_types_to_datasets(metadata, tag, tagged_object, columns) + + +def add_owners_to_charts( + metadata: MetaData, tag: Any, tagged_object: Any, columns: List[str] +) -> None: + slices = metadata.tables["slices"] + charts = ( select( [ @@ -240,7 +254,7 @@ def add_owners(engine: Engine, metadata: Metadata) -> None: join( slices, tag, - tag.c.name == functions.concat("owner:", slices.c.created_by_fk), + tag.c.name == "owner:" + slices.c.created_by_fk, ), tagged_object, and_( @@ -255,28 +269,33 @@ def add_owners(engine: Engine, metadata: Metadata) -> None: .where(tagged_object.c.tag_id.is_(None)) ) query = tagged_object.insert().from_select(columns, charts) - engine.execute(query) + db.session.execute(query) + + +def add_owners_to_dashboards( + metadata: MetaData, tag: Any, tagged_object: Any, columns: List[str] +) -> None: + dashboard_table = metadata.tables["dashboards"] dashboards = ( select( [ tag.c.id.label("tag_id"), - dashboards.c.id.label("object_id"), + dashboard_table.c.id.label("object_id"), literal(ObjectTypes.dashboard.name).label("object_type"), ] ) .select_from( join( join( - dashboards, + dashboard_table, tag, - tag.c.name - == functions.concat("owner:", dashboards.c.created_by_fk), + tag.c.name == "owner:" + dashboard_table.c.created_by_fk, ), tagged_object, and_( tagged_object.c.tag_id == tag.c.id, - tagged_object.c.object_id == dashboards.c.id, + tagged_object.c.object_id == dashboard_table.c.id, tagged_object.c.object_type == "dashboard", ), isouter=True, @@ -286,7 +305,13 @@ def add_owners(engine: Engine, metadata: Metadata) -> None: .where(tagged_object.c.tag_id.is_(None)) ) query = tagged_object.insert().from_select(columns, dashboards) - engine.execute(query) + db.session.execute(query) + + +def add_owners_to_saved_queries( + metadata: MetaData, tag: Any, tagged_object: Any, columns: List[str] +) -> None: + saved_query = metadata.tables["saved_query"] saved_queries = ( select( @@ -301,8 +326,7 @@ def add_owners(engine: Engine, metadata: Metadata) -> None: join( saved_query, tag, - tag.c.name - == functions.concat("owner:", saved_query.c.created_by_fk), + tag.c.name == "owner:" + saved_query.c.created_by_fk, ), tagged_object, and_( @@ -317,10 +341,125 @@ def add_owners(engine: Engine, metadata: Metadata) -> None: .where(tagged_object.c.tag_id.is_(None)) ) query = tagged_object.insert().from_select(columns, saved_queries) - engine.execute(query) + db.session.execute(query) + + +def add_owners_to_datasets( + metadata: MetaData, tag: Any, tagged_object: Any, columns: List[str] +) -> None: + tables = metadata.tables["tables"] + + datasets = ( + select( + [ + tag.c.id.label("tag_id"), + tables.c.id.label("object_id"), + literal(ObjectTypes.dataset.name).label("object_type"), + ] + ) + .select_from( + join( + join( + tables, + tag, + tag.c.name == "owner:" + tables.c.created_by_fk, + ), + tagged_object, + and_( + tagged_object.c.tag_id == tag.c.id, + tagged_object.c.object_id == tables.c.id, + tagged_object.c.object_type == "dataset", + ), + isouter=True, + full=False, + ) + ) + .where(tagged_object.c.tag_id.is_(None)) + ) + query = tagged_object.insert().from_select(columns, datasets) + db.session.execute(query) + + +def add_owners(metadata: MetaData) -> None: + """ + Tag every object according to its owner: + + INSERT INTO tagged_object (tag_id, object_id, object_type) + SELECT + tag.id AS tag_id, + slices.id AS object_id, + 'chart' AS object_type + FROM slices + JOIN tag + ON tag.name = CONCAT('owner:', slices.created_by_fk) + LEFT OUTER JOIN tagged_object + ON tagged_object.tag_id = tag.id + AND tagged_object.object_id = slices.id + AND tagged_object.object_type = 'chart' + WHERE tagged_object.tag_id IS NULL; + + SELECT + tag.id AS tag_id, + dashboards.id AS object_id, + 'dashboard' AS object_type + FROM dashboards + JOIN tag + ON tag.name = CONCAT('owner:', dashboards.created_by_fk) + LEFT OUTER JOIN tagged_object + ON tagged_object.tag_id = tag.id + AND tagged_object.object_id = dashboards.id + AND tagged_object.object_type = 'dashboard' + WHERE tagged_object.tag_id IS NULL; + + SELECT + tag.id AS tag_id, + saved_query.id AS object_id, + 'query' AS object_type + FROM saved_query + JOIN tag + ON tag.name = CONCAT('owner:', saved_query.created_by_fk) + LEFT OUTER JOIN tagged_object + ON tagged_object.tag_id = tag.id + AND tagged_object.object_id = saved_query.id + AND tagged_object.object_type = 'query' + WHERE tagged_object.tag_id IS NULL; + + SELECT + tag.id AS tag_id, + tables.id AS object_id, + 'dataset' AS object_type + FROM tables + JOIN tag + ON tag.name = CONCAT('owner:', tables.created_by_fk) + LEFT OUTER JOIN tagged_object + ON tagged_object.tag_id = tag.id + AND tagged_object.object_id = tables.id + AND tagged_object.object_type = 'dataset' + WHERE tagged_object.tag_id IS NULL; + + """ + + tag = metadata.tables["tag"] + tagged_object = metadata.tables["tagged_object"] + users = metadata.tables["ab_user"] + columns = ["tag_id", "object_id", "object_type"] + # create a custom tag for each user + ids = select([users.c.id]) + insert = tag.insert() + for (id_,) in db.session.execute(ids): + try: + db.session.execute(insert, name=f"owner:{id_}", type=TagTypes.owner) + except IntegrityError: + pass # already exists -def add_favorites(engine: Engine, metadata: Metadata) -> None: + add_owners_to_charts(metadata, tag, tagged_object, columns) + add_owners_to_dashboards(metadata, tag, tagged_object, columns) + add_owners_to_saved_queries(metadata, tag, tagged_object, columns) + add_owners_to_datasets(metadata, tag, tagged_object, columns) + + +def add_favorites(metadata: MetaData) -> None: """ Tag every object that was favorited: @@ -349,9 +488,13 @@ def add_favorites(engine: Engine, metadata: Metadata) -> None: # create a custom tag for each user ids = select([users.c.id]) insert = tag.insert() - for (id_,) in engine.execute(ids): + for (id_,) in db.session.execute(ids): try: - engine.execute(insert, name=f"favorited_by:{id_}", type=TagTypes.type) + db.session.execute( + insert, + name=f"favorited_by:{id_}", + type=TagTypes.type, + ) except IntegrityError: pass # already exists @@ -368,7 +511,7 @@ def add_favorites(engine: Engine, metadata: Metadata) -> None: join( favstar, tag, - tag.c.name == functions.concat("favorited_by:", favstar.c.user_id), + tag.c.name == "favorited_by:" + favstar.c.user_id, ), tagged_object, and_( @@ -383,4 +526,4 @@ def add_favorites(engine: Engine, metadata: Metadata) -> None: .where(tagged_object.c.tag_id.is_(None)) ) query = tagged_object.insert().from_select(columns, favstars) - engine.execute(query) + db.session.execute(query) diff --git a/superset/common/utils/dataframe_utils.py b/superset/common/utils/dataframe_utils.py index a0216ad54e83..4dd62e3b5d88 100644 --- a/superset/common/utils/dataframe_utils.py +++ b/superset/common/utils/dataframe_utils.py @@ -16,7 +16,8 @@ # under the License. from __future__ import annotations -from typing import List, TYPE_CHECKING +import datetime +from typing import Any, List, TYPE_CHECKING import numpy as np import pandas as pd @@ -42,3 +43,15 @@ def df_metrics_to_num(df: pd.DataFrame, query_object: QueryObject) -> None: # soft-convert a metric column to numeric # will stay as strings if conversion fails df[col] = df[col].infer_objects() + + +def is_datetime_series(series: Any) -> bool: + if series is None or not isinstance(series, pd.Series): + return False + + if series.isnull().all(): + return False + + return pd.api.types.is_datetime64_any_dtype(series) or ( + series.apply(lambda x: isinstance(x, datetime.date) or x is None).all() + ) diff --git a/superset/common/utils/time_range_utils.py b/superset/common/utils/time_range_utils.py new file mode 100644 index 000000000000..fa6a5244b244 --- /dev/null +++ b/superset/common/utils/time_range_utils.py @@ -0,0 +1,77 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from __future__ import annotations + +from datetime import datetime +from typing import Any, cast, Dict, Optional, Tuple + +from superset import app +from superset.common.query_object import QueryObject +from superset.utils.core import FilterOperator, get_xaxis_label +from superset.utils.date_parser import get_since_until + + +def get_since_until_from_time_range( + time_range: Optional[str] = None, + time_shift: Optional[str] = None, + extras: Optional[Dict[str, Any]] = None, +) -> Tuple[Optional[datetime], Optional[datetime]]: + return get_since_until( + relative_start=(extras or {}).get( + "relative_start", app.config["DEFAULT_RELATIVE_START_TIME"] + ), + relative_end=(extras or {}).get( + "relative_end", app.config["DEFAULT_RELATIVE_END_TIME"] + ), + time_range=time_range, + time_shift=time_shift, + ) + + +# pylint: disable=invalid-name +def get_since_until_from_query_object( + query_object: QueryObject, +) -> Tuple[Optional[datetime], Optional[datetime]]: + """ + this function will return since and until by tuple if + 1) the time_range is in the query object. + 2) the xaxis column is in the columns field + and its corresponding `temporal_range` filter is in the adhoc filters. + :param query_object: a valid query object + :return: since and until by tuple + """ + if query_object.time_range: + return get_since_until_from_time_range( + time_range=query_object.time_range, + time_shift=query_object.time_shift, + extras=query_object.extras, + ) + + time_range = None + for flt in query_object.filter: + if ( + flt.get("op") == FilterOperator.TEMPORAL_RANGE.value + and flt.get("col") == get_xaxis_label(query_object.columns) + and isinstance(flt.get("val"), str) + ): + time_range = cast(str, flt.get("val")) + + return get_since_until_from_time_range( + time_range=time_range, + time_shift=query_object.time_shift, + extras=query_object.extras, + ) diff --git a/superset/config.py b/superset/config.py index 78f65a3b97fc..1130920d6fb1 100644 --- a/superset/config.py +++ b/superset/config.py @@ -21,6 +21,8 @@ at the end of this file. """ # pylint: disable=too-many-lines +from __future__ import annotations + import imp # pylint: disable=deprecated-module import importlib.util import json @@ -30,6 +32,7 @@ import sys from collections import OrderedDict from datetime import timedelta +from email.mime.multipart import MIMEMultipart from typing import ( Any, Callable, @@ -37,8 +40,11 @@ List, Literal, Optional, + Set, + Tuple, Type, TYPE_CHECKING, + TypedDict, Union, ) @@ -49,6 +55,7 @@ from flask import Blueprint from flask_appbuilder.security.manager import AUTH_DB from pandas._libs.parsers import STR_NA_VALUES # pylint: disable=no-name-in-module +from sqlalchemy.orm.query import Query from superset.advanced_data_type.plugins.internet_address import internet_address from superset.advanced_data_type.plugins.internet_port import internet_port @@ -57,7 +64,8 @@ from superset.jinja_context import BaseTemplateProcessor from superset.stats_logger import DummyStatsLogger from superset.superset_typing import CacheConfig -from superset.utils.core import is_test, parse_boolean_string +from superset.tasks.types import ExecutorType +from superset.utils.core import is_test, NO_TIME_RANGE, parse_boolean_string from superset.utils.encrypt import SQLAlchemyUtilsAdapter from superset.utils.log import DBEventLogger from superset.utils.logging_configurator import DefaultLoggingConfigurator @@ -69,6 +77,8 @@ from superset.connectors.sqla.models import SqlaTable from superset.models.core import Database + from superset.models.dashboard import Dashboard + from superset.models.slice import Slice # Realtime stats logger, a StatsD implementation exists STATS_LOGGER = DummyStatsLogger() @@ -142,7 +152,7 @@ def _try_json_readsha(filepath: str, length: int) -> Optional[str]: # can be replaced at build time to expose build information. BUILD_NUMBER = None -# default viz used in chart explorer +# default viz used in chart explorer & SQL Lab explore DEFAULT_VIZ_TYPE = "table" # default row limit when requesting chart data @@ -151,6 +161,9 @@ def _try_json_readsha(filepath: str, length: int) -> Optional[str]: SAMPLES_ROW_LIMIT = 1000 # max rows retrieved by filter select auto complete FILTER_SELECT_ROW_LIMIT = 10000 +# default time filter in explore +# values may be "Last day", "Last week", "<ISO date> : now", etc. +DEFAULT_TIME_FILTER = NO_TIME_RANGE SUPERSET_WEBSERVER_PROTOCOL = "http" SUPERSET_WEBSERVER_ADDRESS = "0.0.0.0" @@ -201,8 +214,31 @@ def _try_json_readsha(filepath: str, length: int) -> Optional[str]: # to the DB. # # Note: the default impl leverages SqlAlchemyUtils' EncryptedType, which defaults -# to AES-128 under the covers using the app's SECRET_KEY as key material. +# to AesEngine that uses AES-128 under the covers using the app's SECRET_KEY +# as key material. Do note that AesEngine allows for queryability over the +# encrypted fields. +# +# To change the default engine you need to define your own adapter: # +# e.g.: +# +# class AesGcmEncryptedAdapter( +# AbstractEncryptedFieldAdapter +# ): +# def create( +# self, +# app_config: Optional[Dict[str, Any]], +# *args: List[Any], +# **kwargs: Optional[Dict[str, Any]], +# ) -> TypeDecorator: +# if app_config: +# return EncryptedType( +# *args, app_config["SECRET_KEY"], engine=AesGcmEngine, **kwargs +# ) +# raise Exception("Missing app_config kwarg") +# +# +# SQLALCHEMY_ENCRYPTED_FIELD_TYPE_ADAPTER = AesGcmEncryptedAdapter SQLALCHEMY_ENCRYPTED_FIELD_TYPE_ADAPTER = ( # pylint: disable=invalid-name SQLAlchemyUtilsAdapter ) @@ -237,6 +273,9 @@ def _try_json_readsha(filepath: str, length: int) -> Optional[str]: ENABLE_PROXY_FIX = False PROXY_FIX_CONFIG = {"x_for": 1, "x_proto": 1, "x_host": 1, "x_port": 1, "x_prefix": 1} +# Configuration for scheduling queries from SQL Lab. +SCHEDULED_QUERIES: Dict[str, Any] = {} + # ------------------------------ # GLOBALS FOR APP Builder # ------------------------------ @@ -397,6 +436,7 @@ def _try_json_readsha(filepath: str, length: int) -> Optional[str]: # Feature is under active development and breaking changes are expected "DASHBOARD_NATIVE_FILTERS_SET": False, "DASHBOARD_FILTERS_EXPERIMENTAL": False, + "DASHBOARD_VIRTUALIZATION": False, "GLOBAL_ASYNC_QUERIES": False, "VERSIONED_EXPORT": True, "EMBEDDED_SUPERSET": False, @@ -425,15 +465,48 @@ def _try_json_readsha(filepath: str, length: int) -> Optional[str]: "UX_BETA": False, "GENERIC_CHART_AXES": False, "ALLOW_ADHOC_SUBQUERY": False, - "USE_ANALAGOUS_COLORS": True, + "USE_ANALAGOUS_COLORS": False, + "DASHBOARD_EDIT_CHART_IN_NEW_TAB": False, # Apply RLS rules to SQL Lab queries. This requires parsing and manipulating the # query, and might break queries and/or allow users to bypass RLS. Use with care! "RLS_IN_SQLLAB": False, # Enable caching per impersonation key (e.g username) in a datasource where user # impersonation is enabled "CACHE_IMPERSONATION": False, + # Enable sharing charts with embedding + "EMBEDDABLE_CHARTS": True, + "DRILL_TO_DETAIL": False, + "DATAPANEL_CLOSED_BY_DEFAULT": False, + "HORIZONTAL_FILTER_BAR": False, + # The feature is off by default, and currently only supported in Presto and Postgres, + # and Bigquery. + # It also needs to be enabled on a per-database basis, by adding the key/value pair + # `cost_estimate_enabled: true` to the database `extra` attribute. + "ESTIMATE_QUERY_COST": False, + # Allow users to enable ssh tunneling when creating a DB. + # Users must check whether the DB engine supports SSH Tunnels + # otherwise enabling this flag won't have any effect on the DB. + "SSH_TUNNELING": False, } +# ------------------------------ +# SSH Tunnel +# ------------------------------ +# Allow users to set the host used when connecting to the SSH Tunnel +# as localhost and any other alias (0.0.0.0) +# ---------------------------------------------------------------------- +# | +# -------------+ | +----------+ +# LOCAL | | | REMOTE | :22 SSH +# CLIENT | <== SSH ========> | SERVER | :8080 web service +# -------------+ | +----------+ +# | +# FIREWALL (only port 22 is open) + +# ---------------------------------------------------------------------- +SSH_TUNNEL_MANAGER_CLASS = "superset.extensions.ssh.SSHManager" +SSH_TUNNEL_LOCAL_BIND_ADDRESS = "127.0.0.1" + # Feature flags may also be set via 'SUPERSET_FEATURE_' prefixed environment vars. DEFAULT_FEATURE_FLAGS.update( { @@ -536,9 +609,33 @@ def _try_json_readsha(filepath: str, length: int) -> Optional[str]: # --------------------------------------------------- # Thumbnail config (behind feature flag) -# Also used by Alerts & Reports # --------------------------------------------------- -THUMBNAIL_SELENIUM_USER = "admin" +# When executing Alerts & Reports or Thumbnails as the Selenium user, this defines +# the username of the account used to render the queries and dashboards/charts +THUMBNAIL_SELENIUM_USER: Optional[str] = "admin" + +# To be able to have different thumbnails for different users, use these configs to +# define which user to execute the thumbnails and potentially custom functions for +# calculating thumbnail digests. To have unique thumbnails for all users, use the +# following config: +# THUMBNAIL_EXECUTE_AS = [ExecutorType.CURRENT_USER] +THUMBNAIL_EXECUTE_AS = [ExecutorType.SELENIUM] + +# By default, thumbnail digests are calculated based on various parameters in the +# chart/dashboard metadata, and in the case of user-specific thumbnails, the +# username. To specify a custom digest function, use the following config parameters +# to define callbacks that receive +# 1. the model (dashboard or chart) +# 2. the executor type (e.g. ExecutorType.SELENIUM) +# 3. the executor's username (note, this is the executor as defined by +# `THUMBNAIL_EXECUTE_AS`; the executor is only equal to the currently logged in +# user if the executor type is equal to `ExecutorType.CURRENT_USER`) +# and return the final digest string: +THUMBNAIL_DASHBOARD_DIGEST_FUNC: Optional[ + Callable[[Dashboard, ExecutorType, str], str] +] = None +THUMBNAIL_CHART_DIGEST_FUNC: Optional[Callable[[Slice, ExecutorType, str], str]] = None + THUMBNAIL_CACHE_CONFIG: CacheConfig = { "CACHE_TYPE": "NullCache", "CACHE_NO_NULL_WARNING": True, @@ -556,6 +653,12 @@ def _try_json_readsha(filepath: str, length: int) -> Optional[str]: SCREENSHOT_SELENIUM_HEADSTART = 3 # Wait for the chart animation, in seconds SCREENSHOT_SELENIUM_ANIMATION_WAIT = 5 +# Replace unexpected errors in screenshots with real error messages +SCREENSHOT_REPLACE_UNEXPECTED_ERRORS = False +# Max time to wait for error message modal to show up, in seconds +SCREENSHOT_WAIT_FOR_ERROR_MODAL_VISIBLE = 5 +# Max time to wait for error message modal to close, in seconds +SCREENSHOT_WAIT_FOR_ERROR_MODAL_INVISIBLE = 5 # --------------------------------------------------- # Image and file configuration @@ -645,17 +748,22 @@ def _try_json_readsha(filepath: str, length: int) -> Optional[str]: # note: index option should not be overridden CSV_EXPORT = {"encoding": "utf-8"} +# Excel Options: key/value pairs that will be passed as argument to DataFrame.to_excel +# method. +# note: index option should not be overridden +EXCEL_EXPORT = {"encoding": "utf-8"} + # --------------------------------------------------- # Time grain configurations # --------------------------------------------------- # List of time grains to disable in the application (see list of builtin -# time grains in superset/db_engine_specs.builtin_time_grains). +# time grains in superset/db_engine_specs/base.py). # For example: to disable 1 second time grain: # TIME_GRAIN_DENYLIST = ['PT1S'] TIME_GRAIN_DENYLIST: List[str] = [] # Additional time grains to be supported using similar definitions as in -# superset/db_engine_specs.builtin_time_grains. +# superset/db_engine_specs/base.py. # For example: To add a new 2 second time grain: # TIME_GRAIN_ADDONS = {'PT2S': '2 second'} TIME_GRAIN_ADDONS: Dict[str, str] = {} @@ -748,16 +856,25 @@ def _try_json_readsha(filepath: str, length: int) -> Optional[str]: # the SQL Lab UI DEFAULT_SQLLAB_LIMIT = 1000 -# Maximum number of tables/views displayed in the dropdown window in SQL Lab. -MAX_TABLE_NAMES = 3000 - # Adds a warning message on sqllab save query and schedule query modals. SQLLAB_SAVE_WARNING_MESSAGE = None SQLLAB_SCHEDULE_WARNING_MESSAGE = None # Force refresh while auto-refresh in dashboard DASHBOARD_AUTO_REFRESH_MODE: Literal["fetch", "force"] = "force" - +# Dashboard auto refresh intervals +DASHBOARD_AUTO_REFRESH_INTERVALS = [ + [0, "Don't refresh"], + [10, "10 seconds"], + [30, "30 seconds"], + [60, "1 minute"], + [300, "5 minutes"], + [1800, "30 minutes"], + [3600, "1 hour"], + [21600, "6 hours"], + [43200, "12 hours"], + [86400, "24 hours"], +] # Default celery config is to use SQLA as a broker, in a production setting # you'll want to use a proper broker as specified here: @@ -768,7 +885,6 @@ class CeleryConfig: # pylint: disable=too-few-public-methods broker_url = "sqla+sqlite:///celerydb.sqlite" imports = ("superset.sql_lab",) result_backend = "db+sqlite:///celery_results.sqlite" - worker_log_level = "DEBUG" worker_prefetch_multiplier = 1 task_acks_late = False task_annotations = { @@ -831,16 +947,14 @@ class CeleryConfig: # pylint: disable=too-few-public-methods # query costs before they run. These EXPLAIN queries should have a small # timeout. SQLLAB_QUERY_COST_ESTIMATE_TIMEOUT = int(timedelta(seconds=10).total_seconds()) -# The feature is off by default, and currently only supported in Presto and Postgres. -# It also need to be enabled on a per-database basis, by adding the key/value pair -# `cost_estimate_enabled: true` to the database `extra` attribute. -ESTIMATE_QUERY_COST = False + # The cost returned by the databases is a relative value; in order to map the cost to # a tangible value you need to define a custom formatter that takes into consideration # your specific infrastructure. For example, you could analyze queries a posteriori by # running EXPLAIN on them, and compute a histogram of relative costs to present the -# cost as a percentile: -# +# cost as a percentile, this step is optional as every db engine spec has its own +# query cost formatter, but it you wanna customize it you can define it inside the config: + # def postgres_query_cost_formatter( # result: List[Dict[str, Any]] # ) -> List[Dict[str, str]]: @@ -858,9 +972,7 @@ class CeleryConfig: # pylint: disable=too-few-public-methods # # return out # -# Then on define the formatter on the config: -# -# "QUERY_COST_FORMATTERS_BY_ENGINE": {"postgresql": postgres_query_cost_formatter}, +# QUERY_COST_FORMATTERS_BY_ENGINE: {"postgresql": postgres_query_cost_formatter} QUERY_COST_FORMATTERS_BY_ENGINE: Dict[ str, Callable[[List[Dict[str, Any]]], List[Dict[str, Any]]] ] = {} @@ -888,7 +1000,7 @@ class CeleryConfig: # pylint: disable=too-few-public-methods # return f'tmp_{schema}' # Function accepts database object, user object, schema name and sql that will be run. SQLLAB_CTAS_SCHEMA_NAME_FUNC: Optional[ - Callable[["Database", "models.User", str, str], str] + Callable[[Database, models.User, str, str], str] ] = None # If enabled, it can be used to store the results of long-running queries @@ -913,8 +1025,8 @@ class CeleryConfig: # pylint: disable=too-few-public-methods # Function that creates upload directory dynamically based on the # database used, user and schema provided. def CSV_TO_HIVE_UPLOAD_DIRECTORY_FUNC( # pylint: disable=invalid-name - database: "Database", - user: "models.User", # pylint: disable=unused-argument + database: Database, + user: models.User, # pylint: disable=unused-argument schema: Optional[str], ) -> str: # Note the final empty path enforces a trailing slash. @@ -932,7 +1044,7 @@ def CSV_TO_HIVE_UPLOAD_DIRECTORY_FUNC( # pylint: disable=invalid-name # db configuration and a result of this function. # mypy doesn't catch that if case ensures list content being always str -ALLOWED_USER_CSV_SCHEMA_FUNC: Callable[["Database", "models.User"], List[str]] = ( +ALLOWED_USER_CSV_SCHEMA_FUNC: Callable[[Database, models.User], List[str]] = ( lambda database, user: [UPLOADED_CSV_HIVE_NAMESPACE] if UPLOADED_CSV_HIVE_NAMESPACE else [] @@ -1019,11 +1131,17 @@ def CSV_TO_HIVE_UPLOAD_DIRECTORY_FUNC( # pylint: disable=invalid-name # into a proxied one -TRACKING_URL_TRANSFORMER = lambda x: x +# Transform SQL query tracking url for Hive and Presto engines. You may also +# access information about the query itself by adding a second parameter +# to your transformer function, e.g.: +# TRACKING_URL_TRANSFORMER = ( +# lambda url, query: url if is_fresh(query) else None +# ) +TRACKING_URL_TRANSFORMER = lambda url: url -# Interval between consecutive polls when using Hive Engine -HIVE_POLL_INTERVAL = int(timedelta(seconds=5).total_seconds()) +# customize the polling time of each engine +DB_POLL_INTERVAL_SECONDS: Dict[str, int] = {} # Interval between consecutive polls when using Presto Engine # See here: https://github.com/dropbox/PyHive/blob/8eb0aeab8ca300f3024655419b93dad926c1a351/pyhive/presto.py#L93 # pylint: disable=line-too-long,useless-suppression @@ -1084,6 +1202,36 @@ def SQL_QUERY_MUTATOR( # pylint: disable=invalid-name,unused-argument return sql +# A variable that chooses whether to apply the SQL_QUERY_MUTATOR before or after splitting the input query +# It allows for using the SQL_QUERY_MUTATOR function for more than comments +# Usage: If you want to apply a change to every statement to a given query, set MUTATE_AFTER_SPLIT = True +# An example use case is if data has role based access controls, and you want to apply +# a SET ROLE statement alongside every user query. Changing this variable maintains +# functionality for both the SQL_Lab and Charts. +MUTATE_AFTER_SPLIT = False + +# This allows for a user to add header data to any outgoing emails. For example, +# if you need to include metadata in the header or you want to change the specifications +# of the email title, header, or sender. +def EMAIL_HEADER_MUTATOR( # pylint: disable=invalid-name,unused-argument + msg: MIMEMultipart, **kwargs: Any +) -> MIMEMultipart: + return msg + + +# Define a list of usernames to be excluded from all dropdown lists of users +# Owners, filters for created_by, etc. +# The users can also be excluded by overriding the get_exclude_users_from_lists method +# in security manager +EXCLUDE_USERS_FROM_LISTS: Optional[List[str]] = None + +# For database connections, this dictionary will remove engines from the available +# list/dropdown if you do not want these dbs to show as available. +# The available list is generated by driver installed, and some engines have multiple +# drivers. +# e.g., DBS_AVAILABLE_DENYLIST: Dict[str, Set[str]] = {"databricks": {"pyhive", "pyodbc"}} +DBS_AVAILABLE_DENYLIST: Dict[str, Set[str]] = {} + # This auth provider is used by background (offline) tasks that need to access # protected resources. Can be overridden by end users in order to support # custom auth mechanisms @@ -1096,6 +1244,22 @@ def SQL_QUERY_MUTATOR( # pylint: disable=invalid-name,unused-argument # sliding cron window size, should be synced with the celery beat config minus 1 second ALERT_REPORTS_CRON_WINDOW_SIZE = 59 ALERT_REPORTS_WORKING_TIME_OUT_KILL = True +# Which user to attempt to execute Alerts/Reports as. By default, +# use the user defined in the `THUMBNAIL_SELENIUM_USER` config parameter. +# To first try to execute as the creator in the owners list (if present), then fall +# back to the creator, then the last modifier in the owners list (if present), then the +# last modifier, then an owner (giving priority to the last modifier and then the +# creator if either is contained within the list of owners, otherwise the first owner +# will be used) and finally `THUMBNAIL_SELENIUM_USER`, set as follows: +# ALERT_REPORTS_EXECUTE_AS = [ +# ScheduledTaskExecutor.CREATOR_OWNER, +# ScheduledTaskExecutor.CREATOR, +# ScheduledTaskExecutor.MODIFIER_OWNER, +# ScheduledTaskExecutor.MODIFIER, +# ScheduledTaskExecutor.OWNER, +# ScheduledTaskExecutor.SELENIUM, +# ] +ALERT_REPORTS_EXECUTE_AS: List[ExecutorType] = [ExecutorType.SELENIUM] # if ALERT_REPORTS_WORKING_TIME_OUT_KILL is True, set a celery hard timeout # Equal to working timeout + ALERT_REPORTS_WORKING_TIME_OUT_LAG ALERT_REPORTS_WORKING_TIME_OUT_LAG = int(timedelta(seconds=10).total_seconds()) @@ -1112,6 +1276,9 @@ def SQL_QUERY_MUTATOR( # pylint: disable=invalid-name,unused-argument # A custom prefix to use on all Alerts & Reports emails EMAIL_REPORTS_SUBJECT_PREFIX = "[Report] " +# The text for call-to-action link in Alerts & Reports emails +EMAIL_REPORTS_CTA = "Explore in Superset" + # Slack API token for the superset reports, either string or callable SLACK_API_TOKEN: Optional[Union[Callable[[], str], str]] = None SLACK_PROXY = None @@ -1153,6 +1320,8 @@ def SQL_QUERY_MUTATOR( # pylint: disable=invalid-name,unused-argument # Send user to a link where they can report bugs BUG_REPORT_URL = None +BUG_REPORT_TEXT = "Report a bug" +BUG_REPORT_ICON = None # Recommended size: 16x16 # Send user to a link where they can read more about Superset DOCUMENTATION_URL = None @@ -1223,7 +1392,7 @@ def SQL_QUERY_MUTATOR( # pylint: disable=invalid-name,unused-argument # SESSION_COOKIE_HTTPONLY = True # Prevent cookie from being read by frontend JS? SESSION_COOKIE_SECURE = False # Prevent cookie from being transmitted over non-tls? -SESSION_COOKIE_SAMESITE = "Lax" # One of [None, 'None', 'Lax', 'Strict'] +SESSION_COOKIE_SAMESITE: Optional[Literal["None", "Lax", "Strict"]] = "Lax" # Cache static resources. SEND_FILE_MAX_AGE_DEFAULT = int(timedelta(days=365).total_seconds()) @@ -1243,6 +1412,13 @@ def SQL_QUERY_MUTATOR( # pylint: disable=invalid-name,unused-argument # Prevents unsafe default endpoints to be registered on datasets. PREVENT_UNSAFE_DEFAULT_URLS_ON_DATASET = True +# Define a list of allowed URLs for dataset data imports (v1). +# Simple example to only allow URLs that belong to certain domains: +# ALLOWED_IMPORT_URL_DOMAINS = [ +# r"^https://.+\.domain1\.com\/?.*", r"^https://.+\.domain2\.com\/?.*" +# ] +DATASET_IMPORT_ALLOWED_DATA_URLS = [r".*"] + # Path used to store SSL certificates that are generated when using custom certs. # Defaults to temporary directory. # Example: SSL_CERT_PATH = "/certs" @@ -1271,6 +1447,9 @@ def SQL_QUERY_MUTATOR( # pylint: disable=invalid-name,unused-argument GLOBAL_ASYNC_QUERIES_REDIS_STREAM_LIMIT_FIREHOSE = 1000000 GLOBAL_ASYNC_QUERIES_JWT_COOKIE_NAME = "async-token" GLOBAL_ASYNC_QUERIES_JWT_COOKIE_SECURE = False +GLOBAL_ASYNC_QUERIES_JWT_COOKIE_SAMESITE: Optional[ + Literal["None", "Lax", "Strict"] +] = None GLOBAL_ASYNC_QUERIES_JWT_COOKIE_DOMAIN = None GLOBAL_ASYNC_QUERIES_JWT_SECRET = "test-secret-change-me" GLOBAL_ASYNC_QUERIES_TRANSPORT = "polling" @@ -1332,24 +1511,59 @@ def SQL_QUERY_MUTATOR( # pylint: disable=invalid-name,unused-argument "port": internet_port, } -DATAHUB_URL = "https://localhost:9002/" - +# By default, the Welcome page features all charts and dashboards the user has access +# to. This can be changed to show only examples, or a custom view +# by providing the title and a FAB filter: +# WELCOME_PAGE_LAST_TAB = ( +# "Xyz", +# [{"col": 'created_by', "opr": 'rel_o_m', "value": 10}], +# ) +WELCOME_PAGE_LAST_TAB: Union[ + Literal["examples", "all"], Tuple[str, List[Dict[str, Any]]] +] = "all" # Configuration for environment tag shown on the navbar. Setting 'text' to '' will hide the tag. +# 'color' can either be a hex color code, or a dot-indexed theme color (e.g. error.base) ENVIRONMENT_TAG_CONFIG = { "variable": "FLASK_ENV", "values": { "development": { - "color": "#c73d2e", + "color": "error.base", "text": "Development", }, "production": { - "color": "#039dfc", - "text": "Production", + "color": "", + "text": "", }, }, } + +# Extra related query filters make it possible to limit which objects are shown +# in the UI. For examples, to only show "admin" or users starting with the letter "b" in +# the "Owners" dropdowns, you could add the following in your config: +# def user_filter(query: Query, *args, *kwargs): +# from superset import security_manager +# +# user_model = security_manager.user_model +# filters = [ +# user_model.username == "admin", +# user_model.username.ilike("b%"), +# ] +# return query.filter(or_(*filters)) +# +# EXTRA_RELATED_QUERY_FILTERS = {"user": user_filter} +# +# Similarly, to restrict the roles in the "Roles" dropdown you can provide a custom +# filter callback for the "role" key. +class ExtraRelatedQueryFilters(TypedDict, total=False): + role: Callable[[Query], Query] + user: Callable[[Query], Query] + + +EXTRA_RELATED_QUERY_FILTERS: ExtraRelatedQueryFilters = {} + + # ------------------------------------------------------------------- # * WARNING: STOP EDITING HERE * # ------------------------------------------------------------------- @@ -1376,7 +1590,7 @@ def SQL_QUERY_MUTATOR( # pylint: disable=invalid-name,unused-argument try: # pylint: disable=import-error,wildcard-import,unused-wildcard-import import superset_config - from superset_config import * # type:ignore + from superset_config import * # type: ignore print(f"Loaded your LOCAL configuration at [{superset_config.__file__}]") except Exception: diff --git a/superset/connectors/base/models.py b/superset/connectors/base/models.py index 7809dab4ae9c..a5bea92ffa11 100644 --- a/superset/connectors/base/models.py +++ b/superset/connectors/base/models.py @@ -22,6 +22,7 @@ from typing import Any, Dict, Hashable, List, Optional, Set, Type, TYPE_CHECKING, Union from flask_appbuilder.security.sqla.models import User +from flask_babel import gettext as __ from sqlalchemy import and_, Boolean, Column, Integer, String, Text from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.orm import foreign, Query, relationship, RelationshipProperty, Session @@ -209,7 +210,7 @@ def url(self) -> str: def explore_url(self) -> str: if self.default_endpoint: return self.default_endpoint - return f"/superset/explore/{self.type}/{self.id}/" + return f"/explore/?datasource_type={self.type}&datasource_id={self.id}" @property def column_formats(self) -> Dict[str, Optional[str]]: @@ -248,10 +249,10 @@ def data(self) -> Dict[str, Any]: for column_name in self.column_names: column_name = str(column_name or "") order_by_choices.append( - (json.dumps([column_name, True]), column_name + " [asc]") + (json.dumps([column_name, True]), f"{column_name} " + __("[asc]")) ) order_by_choices.append( - (json.dumps([column_name, False]), column_name + " [desc]") + (json.dumps([column_name, False]), f"{column_name} " + __("[desc]")) ) verbose_map = {"__timestamp": "Time"} @@ -312,9 +313,9 @@ def data_for_slices( # pylint: disable=too-many-locals for metric in utils.get_iterable(form_data.get(metric_param) or []): metric_names.add(utils.get_metric_name(metric)) if utils.is_adhoc_metric(metric): - column_names.add( - (metric.get("column") or {}).get("column_name") - ) + column = metric.get("column") or {} + if column_name := column.get("column_name"): + column_names.add(column_name) # Columns used in query filters column_names.update( @@ -395,6 +396,7 @@ def data_for_slices( # pylint: disable=too-many-locals @staticmethod def filter_values_handler( # pylint: disable=too-many-arguments values: Optional[FilterValues], + operator: str, target_generic_type: GenericDataType, target_native_type: Optional[str] = None, is_list_target: bool = False, @@ -405,6 +407,8 @@ def filter_values_handler( # pylint: disable=too-many-arguments return None def handle_single_value(value: Optional[FilterValue]) -> Optional[FilterValue]: + if operator == utils.FilterOperator.TEMPORAL_RANGE: + return value if ( isinstance(value, (float, int)) and target_generic_type == utils.GenericDataType.TEMPORAL diff --git a/superset/connectors/connector_registry.py b/superset/connectors/connector_registry.py deleted file mode 100644 index 06816fa53049..000000000000 --- a/superset/connectors/connector_registry.py +++ /dev/null @@ -1,164 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from typing import Dict, List, Optional, Set, Type, TYPE_CHECKING - -from flask_babel import _ -from sqlalchemy import or_ -from sqlalchemy.orm import Session, subqueryload -from sqlalchemy.orm.exc import NoResultFound - -from superset.datasets.commands.exceptions import DatasetNotFoundError - -if TYPE_CHECKING: - from collections import OrderedDict - - from superset.connectors.base.models import BaseDatasource - from superset.models.core import Database - - -class ConnectorRegistry: - """Central Registry for all available datasource engines""" - - sources: Dict[str, Type["BaseDatasource"]] = {} - - @classmethod - def register_sources(cls, datasource_config: "OrderedDict[str, List[str]]") -> None: - for module_name, class_names in datasource_config.items(): - class_names = [str(s) for s in class_names] - module_obj = __import__(module_name, fromlist=class_names) - for class_name in class_names: - source_class = getattr(module_obj, class_name) - cls.sources[source_class.type] = source_class - - @classmethod - def get_datasource( - cls, datasource_type: str, datasource_id: int, session: Session - ) -> "BaseDatasource": - """Safely get a datasource instance, raises `DatasetNotFoundError` if - `datasource_type` is not registered or `datasource_id` does not - exist.""" - if datasource_type not in cls.sources: - raise DatasetNotFoundError() - - datasource = ( - session.query(cls.sources[datasource_type]) - .filter_by(id=datasource_id) - .one_or_none() - ) - - if not datasource: - raise DatasetNotFoundError() - - return datasource - - @classmethod - def get_all_datasources(cls, session: Session) -> List["BaseDatasource"]: - datasources: List["BaseDatasource"] = [] - for source_class in ConnectorRegistry.sources.values(): - qry = session.query(source_class) - qry = source_class.default_query(qry) - datasources.extend(qry.all()) - return datasources - - @classmethod - def get_datasource_by_id( - cls, session: Session, datasource_id: int - ) -> "BaseDatasource": - """ - Find a datasource instance based on the unique id. - - :param session: Session to use - :param datasource_id: unique id of datasource - :return: Datasource corresponding to the id - :raises NoResultFound: if no datasource is found corresponding to the id - """ - for datasource_class in ConnectorRegistry.sources.values(): - try: - return ( - session.query(datasource_class) - .filter(datasource_class.id == datasource_id) - .one() - ) - except NoResultFound: - # proceed to next datasource type - pass - raise NoResultFound(_("Datasource id not found: %(id)s", id=datasource_id)) - - @classmethod - def get_datasource_by_name( # pylint: disable=too-many-arguments - cls, - session: Session, - datasource_type: str, - datasource_name: str, - schema: str, - database_name: str, - ) -> Optional["BaseDatasource"]: - datasource_class = ConnectorRegistry.sources[datasource_type] - return datasource_class.get_datasource_by_name( - session, datasource_name, schema, database_name - ) - - @classmethod - def query_datasources_by_permissions( # pylint: disable=invalid-name - cls, - session: Session, - database: "Database", - permissions: Set[str], - schema_perms: Set[str], - ) -> List["BaseDatasource"]: - # TODO(bogdan): add unit test - datasource_class = ConnectorRegistry.sources[database.type] - return ( - session.query(datasource_class) - .filter_by(database_id=database.id) - .filter( - or_( - datasource_class.perm.in_(permissions), - datasource_class.schema_perm.in_(schema_perms), - ) - ) - .all() - ) - - @classmethod - def get_eager_datasource( - cls, session: Session, datasource_type: str, datasource_id: int - ) -> "BaseDatasource": - """Returns datasource with columns and metrics.""" - datasource_class = ConnectorRegistry.sources[datasource_type] - return ( - session.query(datasource_class) - .options( - subqueryload(datasource_class.columns), - subqueryload(datasource_class.metrics), - ) - .filter_by(id=datasource_id) - .one() - ) - - @classmethod - def query_datasources_by_name( - cls, - session: Session, - database: "Database", - datasource_name: str, - schema: Optional[str] = None, - ) -> List["BaseDatasource"]: - datasource_class = ConnectorRegistry.sources[database.type] - return datasource_class.query_datasources_by_name( - session, database, datasource_name, schema=schema - ) diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 4e1c5329309b..d1f671d106e4 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -14,7 +14,9 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -# pylint: disable=too-many-lines, redefined-outer-name +# pylint: disable=too-many-lines +from __future__ import annotations + import dataclasses import json import logging @@ -31,11 +33,11 @@ List, NamedTuple, Optional, + Set, Tuple, Type, Union, ) -from uuid import uuid4 import dateutil.parser import numpy as np @@ -65,8 +67,15 @@ update, ) from sqlalchemy.engine.base import Connection -from sqlalchemy.orm import backref, Query, relationship, RelationshipProperty, Session -from sqlalchemy.orm.exc import NoResultFound +from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy.orm import ( + backref, + Mapped, + Query, + relationship, + RelationshipProperty, + Session, +) from sqlalchemy.orm.mapper import Mapper from sqlalchemy.schema import UniqueConstraint from sqlalchemy.sql import column, ColumnElement, literal_column, table @@ -76,17 +85,18 @@ from superset import app, db, is_feature_enabled, security_manager from superset.advanced_data_type.types import AdvancedDataTypeResponse -from superset.columns.models import Column as NewColumn, UNKOWN_TYPE from superset.common.db_query_status import QueryStatus +from superset.common.utils.time_range_utils import get_since_until_from_time_range from superset.connectors.base.models import BaseColumn, BaseDatasource, BaseMetric from superset.connectors.sqla.utils import ( find_cached_objects_in_session, + get_columns_description, get_physical_table_metadata, get_virtual_table_metadata, validate_adhoc_subquery, ) from superset.datasets.models import Dataset as NewDataset -from superset.db_engine_specs.base import BaseEngineSpec, CTE_ALIAS, TimestampExpression +from superset.db_engine_specs.base import BaseEngineSpec, TimestampExpression from superset.exceptions import ( AdvancedDataTypeResponseError, DatasetInvalidPermissionEvaluationException, @@ -102,18 +112,8 @@ ) from superset.models.annotations import Annotation from superset.models.core import Database -from superset.models.helpers import ( - AuditMixinNullable, - CertificationMixin, - clone_model, - QueryResult, -) -from superset.sql_parse import ( - extract_table_references, - ParsedQuery, - sanitize_clause, - Table as TableName, -) +from superset.models.helpers import AuditMixinNullable, CertificationMixin, QueryResult +from superset.sql_parse import ParsedQuery, sanitize_clause from superset.superset_typing import ( AdhocColumn, AdhocMetric, @@ -122,7 +122,6 @@ OrderBy, QueryObjectDict, ) -from superset.tables.models import Table as NewTable from superset.utils import core as utils from superset.utils.core import ( GenericDataType, @@ -232,10 +231,10 @@ class TableColumn(Model, BaseColumn, CertificationMixin): __tablename__ = "table_columns" __table_args__ = (UniqueConstraint("table_id", "column_name"),) table_id = Column(Integer, ForeignKey("tables.id")) - table: "SqlaTable" = relationship( + table: Mapped["SqlaTable"] = relationship( "SqlaTable", - backref=backref("columns", cascade="all, delete-orphan"), - foreign_keys=[table_id], + back_populates="columns", + lazy="joined", # Eager loading for efficient parent referencing with selectin. ) is_dttm = Column(Boolean, default=False) expression = Column(MediumText()) @@ -311,14 +310,18 @@ def type_generic(self) -> Optional[utils.GenericDataType]: ) return column_spec.generic_type if column_spec else None - def get_sqla_col(self, label: Optional[str] = None) -> Column: + def get_sqla_col( + self, + label: Optional[str] = None, + template_processor: Optional[BaseTemplateProcessor] = None, + ) -> Column: label = label or self.column_name db_engine_spec = self.db_engine_spec column_spec = db_engine_spec.get_column_spec(self.type, db_extra=self.db_extra) type_ = column_spec.sqla_type if column_spec else None - if self.expression: - tp = self.table.get_template_processor() - expression = tp.process_template(self.expression) + if expression := self.expression: + if template_processor: + expression = template_processor.process_template(expression) col = literal_column(expression, type_=type_) else: col = column(self.column_name, type_=type_) @@ -331,10 +334,12 @@ def datasource(self) -> RelationshipProperty: def get_time_filter( self, - start_dttm: DateTime, - end_dttm: DateTime, + start_dttm: Optional[DateTime] = None, + end_dttm: Optional[DateTime] = None, + label: Optional[str] = "__time", + template_processor: Optional[BaseTemplateProcessor] = None, ) -> ColumnElement: - col = self.get_sqla_col(label="__time") + col = self.get_sqla_col(label=label, template_processor=template_processor) l = [] if start_dttm: l.append(col >= self.table.text(self.dttm_sql_literal(start_dttm))) @@ -367,16 +372,13 @@ def get_timestamp_expression( if not self.expression and not time_grain and not is_epoch: sqla_col = column(self.column_name, type_=type_) return self.table.make_sqla_column_compatible(sqla_col, label) - if self.expression: - expression = self.expression + if expression := self.expression: if template_processor: - expression = template_processor.process_template(self.expression) + expression = template_processor.process_template(expression) col = literal_column(expression, type_=type_) else: col = column(self.column_name, type_=type_) - time_expr = self.db_engine_spec.get_timestamp_expr( - col, pdf, time_grain, self.type - ) + time_expr = self.db_engine_spec.get_timestamp_expr(col, pdf, time_grain) return self.table.make_sqla_column_compatible(time_expr, label) def dttm_sql_literal(self, dttm: DateTime) -> str: @@ -436,75 +438,6 @@ def data(self) -> Dict[str, Any]: return attr_dict - def to_sl_column( - self, known_columns: Optional[Dict[str, NewColumn]] = None - ) -> NewColumn: - """Convert a TableColumn to NewColumn""" - session: Session = inspect(self).session - column = known_columns.get(self.uuid) if known_columns else None - if not column: - column = NewColumn() - - extra_json = self.get_extra_dict() - for attr in { - "verbose_name", - "python_date_format", - }: - value = getattr(self, attr) - if value: - extra_json[attr] = value - - if not column.id: - with session.no_autoflush: - saved_column = ( - session.query(NewColumn).filter_by(uuid=self.uuid).one_or_none() - ) - if saved_column: - logger.warning( - "sl_column already exists. Assigning existing id %s", self - ) - - # uuid isn't a primary key, so add the id of the existing column to - # ensure that the column is modified instead of created - # in order to avoid a uuid collision - column.id = saved_column.id - - column.uuid = self.uuid - column.created_on = self.created_on - column.changed_on = self.changed_on - column.created_by = self.created_by - column.changed_by = self.changed_by - column.name = self.column_name - column.type = self.type or UNKOWN_TYPE - column.expression = self.expression or self.table.quote_identifier( - self.column_name - ) - column.description = self.description - column.is_aggregation = False - column.is_dimensional = self.groupby - column.is_filterable = self.filterable - column.is_increase_desired = True - column.is_managed_externally = self.table.is_managed_externally - column.is_partition = False - column.is_physical = not self.expression - column.is_spatial = False - column.is_temporal = self.is_dttm - column.extra_json = json.dumps(extra_json) if extra_json else None - column.external_url = self.table.external_url - - return column - - @staticmethod - def after_delete( # pylint: disable=unused-argument - mapper: Mapper, - connection: Connection, - target: "TableColumn", - ) -> None: - session = inspect(target).session - column = session.query(NewColumn).filter_by(uuid=target.uuid).one_or_none() - if column: - session.delete(column) - class SqlMetric(Model, BaseMetric, CertificationMixin): @@ -513,10 +446,10 @@ class SqlMetric(Model, BaseMetric, CertificationMixin): __tablename__ = "sql_metrics" __table_args__ = (UniqueConstraint("table_id", "metric_name"),) table_id = Column(Integer, ForeignKey("tables.id")) - table = relationship( + table: Mapped["SqlaTable"] = relationship( "SqlaTable", - backref=backref("metrics", cascade="all, delete-orphan"), - foreign_keys=[table_id], + back_populates="metrics", + lazy="joined", # Eager loading for efficient parent referencing with selectin. ) expression = Column(MediumText(), nullable=False) extra = Column(Text) @@ -535,10 +468,20 @@ class SqlMetric(Model, BaseMetric, CertificationMixin): update_from_object_fields = list(s for s in export_fields if s != "table_id") export_parent = "table" - def get_sqla_col(self, label: Optional[str] = None) -> Column: + def __repr__(self) -> str: + return str(self.metric_name) + + def get_sqla_col( + self, + label: Optional[str] = None, + template_processor: Optional[BaseTemplateProcessor] = None, + ) -> Column: label = label or self.metric_name - tp = self.table.get_template_processor() - sqla_col: ColumnClause = literal_column(tp.process_template(self.expression)) + expression = self.expression + if template_processor: + expression = template_processor.process_template(expression) + + sqla_col: ColumnClause = literal_column(expression) return self.table.make_sqla_column_compatible(sqla_col, label) @property @@ -567,73 +510,6 @@ def data(self) -> Dict[str, Any]: attr_dict.update(super().data) return attr_dict - def to_sl_column( - self, known_columns: Optional[Dict[str, NewColumn]] = None - ) -> NewColumn: - """Convert a SqlMetric to NewColumn. Find and update existing or - create a new one.""" - session: Session = inspect(self).session - column = known_columns.get(self.uuid) if known_columns else None - if not column: - column = NewColumn() - - extra_json = self.get_extra_dict() - for attr in {"verbose_name", "metric_type", "d3format"}: - value = getattr(self, attr) - if value is not None: - extra_json[attr] = value - is_additive = ( - self.metric_type and self.metric_type.lower() in ADDITIVE_METRIC_TYPES_LOWER - ) - - if not column.id: - with session.no_autoflush: - saved_column = ( - session.query(NewColumn).filter_by(uuid=self.uuid).one_or_none() - ) - if saved_column: - logger.warning( - "sl_column already exists. Assigning existing id %s", self - ) - # uuid isn't a primary key, so add the id of the existing column to - # ensure that the column is modified instead of created - # in order to avoid a uuid collision - column.id = saved_column.id - - column.uuid = self.uuid - column.name = self.metric_name - column.created_on = self.created_on - column.changed_on = self.changed_on - column.created_by = self.created_by - column.changed_by = self.changed_by - column.type = UNKOWN_TYPE - column.expression = self.expression - column.warning_text = self.warning_text - column.description = self.description - column.is_aggregation = True - column.is_additive = is_additive - column.is_filterable = False - column.is_increase_desired = True - column.is_managed_externally = self.table.is_managed_externally - column.is_partition = False - column.is_physical = False - column.is_spatial = False - column.extra_json = json.dumps(extra_json) if extra_json else None - column.external_url = self.table.external_url - - return column - - @staticmethod - def after_delete( # pylint: disable=unused-argument - mapper: Mapper, - connection: Connection, - target: "SqlMetric", - ) -> None: - session = inspect(target).session - column = session.query(NewColumn).filter_by(uuid=target.uuid).one_or_none() - if column: - session.delete(column) - sqlatable_user = Table( "sqlatable_user", @@ -666,13 +542,23 @@ def _process_sql_expression( class SqlaTable(Model, BaseDatasource): # pylint: disable=too-many-public-methods - """An ORM object for SqlAlchemy table references""" + """An ORM object for SqlAlchemy table references.""" type = "table" query_language = "sql" is_rls_supported = True - columns: List[TableColumn] = [] - metrics: List[SqlMetric] = [] + columns: Mapped[List[TableColumn]] = relationship( + TableColumn, + back_populates="table", + cascade="all, delete-orphan", + lazy="selectin", # Only non-eager loading that works with bidirectional joined. + ) + metrics: Mapped[List[SqlMetric]] = relationship( + SqlMetric, + back_populates="table", + cascade="all, delete-orphan", + lazy="selectin", # Only non-eager loading that works with bidirectional joined. + ) metric_class = SqlMetric column_class = TableColumn owner_class = security_manager.user_model @@ -735,7 +621,7 @@ class SqlaTable(Model, BaseDatasource): # pylint: disable=too-many-public-metho "MAX": sa.func.MAX, } - def __repr__(self) -> str: + def __repr__(self) -> str: # pylint: disable=invalid-repr-returned return self.name @staticmethod @@ -794,7 +680,7 @@ def get_datasource_by_name( datasource_name: str, schema: Optional[str], database_name: str, - ) -> Optional["SqlaTable"]: + ) -> Optional[SqlaTable]: schema = schema or None query = ( session.query(cls) @@ -829,11 +715,9 @@ def get_perm(self) -> str: raise DatasetInvalidPermissionEvaluationException() return f"[{self.database}].[{self.table_name}](id:{self.id})" - @property - def name(self) -> str: - if not self.schema: - return self.table_name - return "{}.{}".format(self.schema, self.table_name) + @hybrid_property + def name(self) -> str: # pylint: disable=invalid-overridden-method + return self.schema + "." + self.table_name if self.schema else self.table_name @property def full_name(self) -> str: @@ -914,6 +798,7 @@ def data(self) -> Dict[str, Any]: data_["is_sqllab_view"] = self.is_sqllab_view data_["health_check_message"] = self.health_check_message data_["extra"] = self.extra + data_["owners"] = self.owners_data return data_ @property @@ -923,10 +808,17 @@ def extra_dict(self) -> Dict[str, Any]: except (TypeError, json.JSONDecodeError): return {} - def get_fetch_values_predicate(self) -> TextClause: - tp = self.get_template_processor() + def get_fetch_values_predicate( + self, + template_processor: Optional[BaseTemplateProcessor] = None, + ) -> TextClause: + fetch_values_predicate = self.fetch_values_predicate + if template_processor: + fetch_values_predicate = template_processor.process_template( + fetch_values_predicate + ) try: - return self.text(tp.process_template(self.fetch_values_predicate)) + return self.text(fetch_values_predicate) except TemplateError as ex: raise QueryObjectValidationError( _( @@ -944,27 +836,32 @@ def values_for_column(self, column_name: str, limit: int = 10000) -> List[Any]: tp = self.get_template_processor() tbl, cte = self.get_from_clause(tp) - qry = select([target_col.get_sqla_col()]).select_from(tbl).distinct() + qry = ( + select([target_col.get_sqla_col(template_processor=tp)]) + .select_from(tbl) + .distinct() + ) if limit: qry = qry.limit(limit) if self.fetch_values_predicate: - qry = qry.where(self.get_fetch_values_predicate()) + qry = qry.where(self.get_fetch_values_predicate(template_processor=tp)) - engine = self.database.get_sqla_engine() - sql = qry.compile(engine, compile_kwargs={"literal_binds": True}) - sql = self._apply_cte(sql, cte) - sql = self.mutate_query_from_config(sql) + with self.database.get_sqla_engine_with_context() as engine: + sql = qry.compile(engine, compile_kwargs={"literal_binds": True}) + sql = self._apply_cte(sql, cte) + sql = self.mutate_query_from_config(sql) - df = pd.read_sql_query(sql=sql, con=engine) - return df[column_name].to_list() + df = pd.read_sql_query(sql=sql, con=engine) + return df[column_name].to_list() def mutate_query_from_config(self, sql: str) -> str: """Apply config's SQL_QUERY_MUTATOR Typically adds comments to the query with context""" sql_query_mutator = config["SQL_QUERY_MUTATOR"] - if sql_query_mutator: + mutate_after_split = config["MUTATE_AFTER_SPLIT"] + if sql_query_mutator and not mutate_after_split: sql = sql_query_mutator( sql, # TODO(john-bodley): Deprecate in 3.0. @@ -1024,7 +921,7 @@ def get_from_clause( cte = self.db_engine_spec.get_cte_query(from_sql) from_clause = ( - table(CTE_ALIAS) + table(self.db_engine_spec.cte_alias) if cte else TextAsFrom(self.text(from_sql), []).alias(VIRTUAL_TABLE_ALIAS) ) @@ -1081,7 +978,9 @@ def adhoc_metric_to_sqla( column_name = cast(str, metric_column.get("column_name")) table_column: Optional[TableColumn] = columns_by_name.get(column_name) if table_column: - sqla_column = table_column.get_sqla_col() + sqla_column = table_column.get_sqla_col( + template_processor=template_processor + ) else: sqla_column = column(column_name) sqla_metric = self.sqla_aggregations[metric["aggregate"]](sqla_column) @@ -1118,7 +1017,31 @@ def adhoc_column_to_sqla( schema=self.schema, template_processor=template_processor, ) - sqla_column = literal_column(expression) + col_in_metadata = self.get_column(expression) + if col_in_metadata: + sqla_column = col_in_metadata.get_sqla_col( + template_processor=template_processor + ) + is_dttm = col_in_metadata.is_temporal + else: + sqla_column = literal_column(expression) + # probe adhoc column type + tbl, _ = self.get_from_clause(template_processor) + qry = sa.select([sqla_column]).limit(1).select_from(tbl) + sql = self.database.compile_sqla_query(qry) + col_desc = get_columns_description(self.database, sql) + is_dttm = col_desc[0]["is_dttm"] + + if ( + is_dttm + and col.get("columnType") == "BASE_AXIS" + and (time_grain := col.get("timeGrain")) + ): + sqla_column = self.db_engine_spec.get_timestamp_expr( + col=sqla_column, + pdf=None, + time_grain=time_grain, + ) return self.make_sqla_column_compatible(sqla_column, label) def make_sqla_column_compatible( @@ -1170,7 +1093,6 @@ def is_alias_used_in_orderby(col: ColumnElement) -> bool: def get_sqla_row_level_filters( self, template_processor: BaseTemplateProcessor, - username: Optional[str] = None, ) -> List[TextClause]: """ Return the appropriate row level security filters for this table and the @@ -1178,14 +1100,12 @@ def get_sqla_row_level_filters( Flask global namespace. :param template_processor: The template processor to apply to the filters. - :param username: Optional username if there's no user in the Flask global - namespace. :returns: A list of SQL clauses to be ANDed together. """ all_filters: List[TextClause] = [] filter_groups: Dict[Union[int, str], List[TextClause]] = defaultdict(list) try: - for filter_ in security_manager.get_rls_filters(self, username): + for filter_ in security_manager.get_rls_filters(self): clause = self.text( f"({template_processor.process_template(filter_.clause)})" ) @@ -1241,6 +1161,7 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma row_offset: Optional[int] = None, timeseries_limit: Optional[int] = None, timeseries_limit_metric: Optional[Metric] = None, + time_shift: Optional[str] = None, ) -> SqlaQuery: """Querying any sqla table from this common interface""" if granularity not in self.dttm_cols and granularity is not None: @@ -1315,7 +1236,11 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma ) ) elif isinstance(metric, str) and metric in metrics_by_name: - metrics_exprs.append(metrics_by_name[metric].get_sqla_col()) + metrics_exprs.append( + metrics_by_name[metric].get_sqla_col( + template_processor=template_processor + ) + ) else: raise QueryObjectValidationError( _("Metric '%(metric)s' does not exist", metric=metric) @@ -1354,12 +1279,16 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma col = metrics_exprs_by_expr.get(str(col), col) need_groupby = True elif col in columns_by_name: - col = columns_by_name[col].get_sqla_col() + col = columns_by_name[col].get_sqla_col( + template_processor=template_processor + ) elif col in metrics_exprs_by_label: col = metrics_exprs_by_label[col] need_groupby = True elif col in metrics_by_name: - col = metrics_by_name[col].get_sqla_col() + col = metrics_by_name[col].get_sqla_col( + template_processor=template_processor + ) need_groupby = True if isinstance(col, ColumnElement): @@ -1393,7 +1322,9 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma ) # if groupby field equals a selected column elif selected in columns_by_name: - outer = columns_by_name[selected].get_sqla_col() + outer = columns_by_name[selected].get_sqla_col( + template_processor=template_processor + ) else: selected = validate_adhoc_subquery( selected, @@ -1427,7 +1358,9 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma self.schema, ) select_exprs.append( - columns_by_name[selected].get_sqla_col() + columns_by_name[selected].get_sqla_col( + template_processor=template_processor + ) if isinstance(selected, str) and selected in columns_by_name else self.make_sqla_column_compatible( literal_column(selected), _column_label @@ -1461,11 +1394,18 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma ): time_filters.append( columns_by_name[self.main_dttm_col].get_time_filter( - from_dttm, - to_dttm, + start_dttm=from_dttm, + end_dttm=to_dttm, + template_processor=template_processor, ) ) - time_filters.append(dttm_col.get_time_filter(from_dttm, to_dttm)) + time_filters.append( + dttm_col.get_time_filter( + start_dttm=from_dttm, + end_dttm=to_dttm, + template_processor=template_processor, + ) + ) # Always remove duplicates by column name, as sometimes `metrics_exprs` # can have the same name as a groupby column (e.g. when users use @@ -1521,7 +1461,9 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma time_grain=filter_grain, template_processor=template_processor ) elif col_obj: - sqla_col = col_obj.get_sqla_col() + sqla_col = col_obj.get_sqla_col( + template_processor=template_processor + ) col_type = col_obj.type if col_obj else None col_spec = db_engine_spec.get_column_spec( native_type=col_type, @@ -1546,6 +1488,7 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma target_generic_type = GenericDataType.STRING eq = self.filter_values_handler( values=val, + operator=op, target_generic_type=target_generic_type, target_native_type=col_type, is_list_target=is_list_target, @@ -1607,7 +1550,14 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma elif op == utils.FilterOperator.IS_FALSE.value: where_clause_and.append(sqla_col.is_(False)) else: - if eq is None: + if ( + op + not in { + utils.FilterOperator.EQUALS.value, + utils.FilterOperator.NOT_EQUALS.value, + } + and eq is None + ): raise QueryObjectValidationError( _( "Must specify a value for filters " @@ -1630,6 +1580,24 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma where_clause_and.append(sqla_col.like(eq)) elif op == utils.FilterOperator.ILIKE.value: where_clause_and.append(sqla_col.ilike(eq)) + elif ( + op == utils.FilterOperator.TEMPORAL_RANGE.value + and isinstance(eq, str) + and col_obj is not None + ): + _since, _until = get_since_until_from_time_range( + time_range=eq, + time_shift=time_shift, + extras=extras, + ) + where_clause_and.append( + col_obj.get_time_filter( + start_dttm=_since, + end_dttm=_until, + label=sqla_col.key, + template_processor=template_processor, + ) + ) else: raise QueryObjectValidationError( _("Invalid filter operation type: %(op)s", op=op) @@ -1672,7 +1640,9 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma having_clause_and += [self.text(having)] if apply_fetch_values_predicate and self.fetch_values_predicate: - qry = qry.where(self.get_fetch_values_predicate()) + qry = qry.where( + self.get_fetch_values_predicate(template_processor=template_processor) + ) if granularity: qry = qry.where(and_(*(time_filters + where_clause_and))) else: @@ -1724,8 +1694,9 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma if dttm_col and not db_engine_spec.time_groupby_inline: inner_time_filter = [ dttm_col.get_time_filter( - inner_from_dttm or from_dttm, - inner_to_dttm or to_dttm, + start_dttm=inner_from_dttm or from_dttm, + end_dttm=inner_to_dttm or to_dttm, + template_processor=template_processor, ) ] subq = subq.where(and_(*(where_clause_and + inner_time_filter))) @@ -1734,7 +1705,10 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma ob = inner_main_metric_expr if series_limit_metric: ob = self._get_series_orderby( - series_limit_metric, metrics_by_name, columns_by_name + series_limit_metric=series_limit_metric, + metrics_by_name=metrics_by_name, + columns_by_name=columns_by_name, + template_processor=template_processor, ) direction = desc if order_desc else asc subq = subq.order_by(direction(ob)) @@ -1754,9 +1728,10 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma orderby = [ ( self._get_series_orderby( - series_limit_metric, - metrics_by_name, - columns_by_name, + series_limit_metric=series_limit_metric, + metrics_by_name=metrics_by_name, + columns_by_name=columns_by_name, + template_processor=template_processor, ), not order_desc, ) @@ -1816,6 +1791,7 @@ def _get_series_orderby( series_limit_metric: Metric, metrics_by_name: Dict[str, SqlMetric], columns_by_name: Dict[str, TableColumn], + template_processor: Optional[BaseTemplateProcessor] = None, ) -> Column: if utils.is_adhoc_metric(series_limit_metric): assert isinstance(series_limit_metric, dict) @@ -1824,7 +1800,9 @@ def _get_series_orderby( isinstance(series_limit_metric, str) and series_limit_metric in metrics_by_name ): - ob = metrics_by_name[series_limit_metric].get_sqla_col() + ob = metrics_by_name[series_limit_metric].get_sqla_col( + template_processor=template_processor + ) else: raise QueryObjectValidationError( _("Metric '%(metric)s' does not exist", metric=series_limit_metric) @@ -1958,7 +1936,10 @@ def fetch_metadata(self, commit: bool = True) -> MetadataResult: :return: Tuple with lists of added, removed and modified column names. """ new_columns = self.external_metadata() - metrics = [] + metrics = [ + SqlMetric(**metric) + for metric in self.database.get_metrics(self.table_name, self.schema) + ] any_date_col = None db_engine_spec = self.db_engine_spec @@ -2015,14 +1996,6 @@ def fetch_metadata(self, commit: bool = True) -> MetadataResult: columns.extend([col for col in old_columns if col.expression]) self.columns = columns - metrics.append( - SqlMetric( - metric_name="count", - verbose_name="COUNT(*)", - metric_type="count", - expression="COUNT(*)", - ) - ) if not self.main_dttm_col: self.main_dttm_col = any_date_col self.add_missing_metrics(metrics) @@ -2042,7 +2015,7 @@ def query_datasources_by_name( database: Database, datasource_name: str, schema: Optional[str] = None, - ) -> List["SqlaTable"]: + ) -> List[SqlaTable]: query = ( session.query(cls) .filter_by(database_id=database.id) @@ -2052,6 +2025,48 @@ def query_datasources_by_name( query = query.filter_by(schema=schema) return query.all() + @classmethod + def query_datasources_by_permissions( # pylint: disable=invalid-name + cls, + session: Session, + database: Database, + permissions: Set[str], + schema_perms: Set[str], + ) -> List[SqlaTable]: + # TODO(hughhhh): add unit test + return ( + session.query(cls) + .filter_by(database_id=database.id) + .filter( + or_( + SqlaTable.perm.in_(permissions), + SqlaTable.schema_perm.in_(schema_perms), + ) + ) + .all() + ) + + @classmethod + def get_eager_sqlatable_datasource( + cls, session: Session, datasource_id: int + ) -> SqlaTable: + """Returns SqlaTable with columns and metrics.""" + return ( + session.query(cls) + .options( + sa.orm.subqueryload(cls.columns), + sa.orm.subqueryload(cls.metrics), + ) + .filter_by(id=datasource_id) + .one() + ) + + @classmethod + def get_all_datasources(cls, session: Session) -> List[SqlaTable]: + qry = session.query(cls) + qry = cls.default_query(qry) + return qry.all() + @staticmethod def default_query(qry: Query) -> Query: return qry.filter_by(is_sqllab_view=False) @@ -2108,7 +2123,7 @@ def quote_identifier(self) -> Callable[[str], str]: def before_update( mapper: Mapper, # pylint: disable=unused-argument connection: Connection, # pylint: disable=unused-argument - target: "SqlaTable", + target: SqlaTable, ) -> None: """ Check before update if the target table already exists. @@ -2145,40 +2160,6 @@ def before_update( ): raise Exception(get_dataset_exist_error_msg(target.full_name)) - def get_sl_columns(self) -> List[NewColumn]: - """ - Convert `SqlaTable.columns` and `SqlaTable.metrics` to the new Column model - """ - session: Session = inspect(self).session - - uuids = set() - for column_or_metric in self.columns + self.metrics: - # pre-assign uuid after new columns or metrics are inserted so - # the related `NewColumn` can have a deterministic uuid, too - if not column_or_metric.uuid: - column_or_metric.uuid = uuid4() - else: - uuids.add(column_or_metric.uuid) - - # load existing columns from cached session states first - existing_columns = set( - find_cached_objects_in_session(session, NewColumn, uuids=uuids) - ) - for column in existing_columns: - uuids.remove(column.uuid) - - if uuids: - with session.no_autoflush: - # load those not found from db - existing_columns |= set( - session.query(NewColumn).filter(NewColumn.uuid.in_(uuids)) - ) - - known_columns = {column.uuid: column for column in existing_columns} - return [ - item.to_sl_column(known_columns) for item in self.columns + self.metrics - ] - @staticmethod def update_column( # pylint: disable=unused-argument mapper: Mapper, connection: Connection, target: Union[SqlMetric, TableColumn] @@ -2195,6 +2176,7 @@ def update_column( # pylint: disable=unused-argument # table is updated. This busts the cache key for all charts that use the table. session.execute(update(SqlaTable).where(SqlaTable.id == target.table.id)) + # TODO: This shadow writing is deprecated # if table itself has changed, shadow-writing will happen in `after_update` anyway if target.table not in session.dirty: dataset: NewDataset = ( @@ -2209,99 +2191,44 @@ def update_column( # pylint: disable=unused-argument target.table.write_shadow_dataset() return - # update changed_on timestamp - session.execute(update(NewDataset).where(NewDataset.id == dataset.id)) - try: - with session.no_autoflush: - column = session.query(NewColumn).filter_by(uuid=target.uuid).one() - # update `Column` model as well - session.merge(target.to_sl_column({target.uuid: column})) - except NoResultFound: - logger.warning("No column was found for %s", target) - # see if the column is in cache - column = next( - find_cached_objects_in_session( - session, NewColumn, uuids=[target.uuid] - ), - None, - ) - if column: - logger.warning("New column was found in cache: %s", column) - - else: - # to be safe, use a different uuid and create a new column - uuid = uuid4() - target.uuid = uuid - - session.add(target.to_sl_column()) - @staticmethod def after_insert( mapper: Mapper, connection: Connection, - sqla_table: "SqlaTable", + sqla_table: SqlaTable, ) -> None: """ - Shadow write the dataset to new models. - - The ``SqlaTable`` model is currently being migrated to two new models, ``Table`` - and ``Dataset``. In the first phase of the migration the new models are populated - whenever ``SqlaTable`` is modified (created, updated, or deleted). - - In the second phase of the migration reads will be done from the new models. - Finally, in the third phase of the migration the old models will be removed. - - For more context: https://github.com/apache/superset/issues/14909 + Update dataset permissions after insert """ - security_manager.set_perm(mapper, connection, sqla_table) + security_manager.dataset_after_insert(mapper, connection, sqla_table) + + # TODO: deprecated sqla_table.write_shadow_dataset() @staticmethod - def after_delete( # pylint: disable=unused-argument + def after_delete( mapper: Mapper, connection: Connection, - sqla_table: "SqlaTable", + sqla_table: SqlaTable, ) -> None: """ - Shadow write the dataset to new models. - - The ``SqlaTable`` model is currently being migrated to two new models, ``Table`` - and ``Dataset``. In the first phase of the migration the new models are populated - whenever ``SqlaTable`` is modified (created, updated, or deleted). - - In the second phase of the migration reads will be done from the new models. - Finally, in the third phase of the migration the old models will be removed. - - For more context: https://github.com/apache/superset/issues/14909 + Update dataset permissions after delete """ - session = inspect(sqla_table).session - dataset = ( - session.query(NewDataset).filter_by(uuid=sqla_table.uuid).one_or_none() - ) - if dataset: - session.delete(dataset) + security_manager.dataset_after_delete(mapper, connection, sqla_table) @staticmethod def after_update( mapper: Mapper, connection: Connection, - sqla_table: "SqlaTable", + sqla_table: SqlaTable, ) -> None: """ - Shadow write the dataset to new models. - - The ``SqlaTable`` model is currently being migrated to two new models, ``Table`` - and ``Dataset``. In the first phase of the migration the new models are populated - whenever ``SqlaTable`` is modified (created, updated, or deleted). - - In the second phase of the migration reads will be done from the new models. - Finally, in the third phase of the migration the old models will be removed. - - For more context: https://github.com/apache/superset/issues/14909 + Update dataset permissions """ # set permissions - security_manager.set_perm(mapper, connection, sqla_table) + security_manager.dataset_after_update(mapper, connection, sqla_table) + # TODO: the shadow writing is deprecated inspector = inspect(sqla_table) session = inspector.session @@ -2327,201 +2254,29 @@ def after_update( sqla_table.write_shadow_dataset() return - # sync column list and delete removed columns - if ( - inspector.attrs.columns.history.has_changes() - or inspector.attrs.metrics.history.has_changes() - ): - # add pending new columns to known columns list, too, so if calling - # `after_update` twice before changes are persisted will not create - # two duplicate columns with the same uuids. - dataset.columns = sqla_table.get_sl_columns() - - # physical dataset - if not sqla_table.sql: - # if the table name changed we should relink the dataset to another table - # (and create one if necessary) - if ( - inspector.attrs.table_name.history.has_changes() - or inspector.attrs.schema.history.has_changes() - or inspector.attrs.database.history.has_changes() - ): - tables = NewTable.bulk_load_or_create( - sqla_table.database, - [TableName(schema=sqla_table.schema, table=sqla_table.table_name)], - sync_columns=False, - default_props=dict( - changed_by=sqla_table.changed_by, - created_by=sqla_table.created_by, - is_managed_externally=sqla_table.is_managed_externally, - external_url=sqla_table.external_url, - ), - ) - if not tables[0].id: - # dataset columns will only be assigned to newly created tables - # existing tables should manage column syncing in another process - physical_columns = [ - clone_model( - column, ignore=["uuid"], keep_relations=["changed_by"] - ) - for column in dataset.columns - if column.is_physical - ] - tables[0].columns = physical_columns - dataset.tables = tables - - # virtual dataset - else: - # mark all columns as virtual (not physical) - for column in dataset.columns: - column.is_physical = False - - # update referenced tables if SQL changed - if sqla_table.sql and inspector.attrs.sql.history.has_changes(): - referenced_tables = extract_table_references( - sqla_table.sql, sqla_table.database.get_dialect().name - ) - dataset.tables = NewTable.bulk_load_or_create( - sqla_table.database, - referenced_tables, - default_schema=sqla_table.schema, - # sync metadata is expensive, we'll do it in another process - # e.g. when users open a Table page - sync_columns=False, - default_props=dict( - changed_by=sqla_table.changed_by, - created_by=sqla_table.created_by, - is_managed_externally=sqla_table.is_managed_externally, - external_url=sqla_table.external_url, - ), - ) - - # update other attributes - dataset.name = sqla_table.table_name - dataset.expression = sqla_table.sql or sqla_table.quote_identifier( - sqla_table.table_name - ) - dataset.is_physical = not sqla_table.sql - def write_shadow_dataset( - self: "SqlaTable", + self: SqlaTable, ) -> None: """ - Shadow write the dataset to new models. - - The ``SqlaTable`` model is currently being migrated to two new models, ``Table`` - and ``Dataset``. In the first phase of the migration the new models are populated - whenever ``SqlaTable`` is modified (created, updated, or deleted). - - In the second phase of the migration reads will be done from the new models. - Finally, in the third phase of the migration the old models will be removed. - - For more context: https://github.com/apache/superset/issues/14909 + This method is deprecated """ session = inspect(self).session - # make sure database points to the right instance, in case only - # `table.database_id` is updated and the changes haven't been - # consolidated by SQLA + # most of the write_shadow_dataset functionality has been removed + # but leaving this portion in + # to remove later because it is adding a Database relationship to the session + # and there is some functionality that depends on this if self.database_id and ( not self.database or self.database.id != self.database_id ): self.database = session.query(Database).filter_by(id=self.database_id).one() - # create columns - columns = [] - for item in self.columns + self.metrics: - item.created_by = self.created_by - item.changed_by = self.changed_by - # on `SqlaTable.after_insert`` event, although the table itself - # already has a `uuid`, the associated columns will not. - # Here we pre-assign a uuid so they can still be matched to the new - # Column after creation. - if not item.uuid: - item.uuid = uuid4() - columns.append(item.to_sl_column()) - - # physical dataset - if not self.sql: - # always create separate column entries for Dataset and Table - # so updating a dataset would not update columns in the related table - physical_columns = [ - clone_model( - column, - ignore=["uuid"], - # `created_by` will always be left empty because it'd always - # be created via some sort of automated system. - # But keep `changed_by` in case someone manually changes - # column attributes such as `is_dttm`. - keep_relations=["changed_by"], - ) - for column in columns - if column.is_physical - ] - tables = NewTable.bulk_load_or_create( - self.database, - [TableName(schema=self.schema, table=self.table_name)], - sync_columns=False, - default_props=dict( - created_by=self.created_by, - changed_by=self.changed_by, - is_managed_externally=self.is_managed_externally, - external_url=self.external_url, - ), - ) - tables[0].columns = physical_columns - - # virtual dataset - else: - # mark all columns as virtual (not physical) - for column in columns: - column.is_physical = False - - # find referenced tables - referenced_tables = extract_table_references( - self.sql, self.database.get_dialect().name - ) - tables = NewTable.bulk_load_or_create( - self.database, - referenced_tables, - default_schema=self.schema, - # syncing table columns can be slow so we are not doing it here - sync_columns=False, - default_props=dict( - created_by=self.created_by, - changed_by=self.changed_by, - is_managed_externally=self.is_managed_externally, - external_url=self.external_url, - ), - ) - - # create the new dataset - new_dataset = NewDataset( - uuid=self.uuid, - database_id=self.database_id, - created_on=self.created_on, - created_by=self.created_by, - changed_by=self.changed_by, - changed_on=self.changed_on, - owners=self.owners, - name=self.table_name, - expression=self.sql or self.quote_identifier(self.table_name), - tables=tables, - columns=columns, - is_physical=not self.sql, - is_managed_externally=self.is_managed_externally, - external_url=self.external_url, - ) - session.add(new_dataset) - sa.event.listen(SqlaTable, "before_update", SqlaTable.before_update) +sa.event.listen(SqlaTable, "after_update", SqlaTable.after_update) sa.event.listen(SqlaTable, "after_insert", SqlaTable.after_insert) sa.event.listen(SqlaTable, "after_delete", SqlaTable.after_delete) -sa.event.listen(SqlaTable, "after_update", SqlaTable.after_update) sa.event.listen(SqlMetric, "after_update", SqlaTable.update_column) -sa.event.listen(SqlMetric, "after_delete", SqlMetric.after_delete) sa.event.listen(TableColumn, "after_update", SqlaTable.update_column) -sa.event.listen(TableColumn, "after_delete", TableColumn.after_delete) RLSFilterRoles = Table( "rls_filter_roles", @@ -2547,6 +2302,8 @@ class RowLevelSecurityFilter(Model, AuditMixinNullable): __tablename__ = "row_level_security_filters" id = Column(Integer, primary_key=True) + name = Column(String(255), unique=True, nullable=False) + description = Column(Text) filter_type = Column( Enum(*[filter_type.value for filter_type in utils.RowLevelSecurityFilterType]) ) @@ -2559,5 +2316,4 @@ class RowLevelSecurityFilter(Model, AuditMixinNullable): tables = relationship( SqlaTable, secondary=RLSFilterTables, backref="row_level_security_filters" ) - clause = Column(Text, nullable=False) diff --git a/superset/connectors/sqla/utils.py b/superset/connectors/sqla/utils.py index db8877aa06e0..92ee4d97f834 100644 --- a/superset/connectors/sqla/utils.py +++ b/superset/connectors/sqla/utils.py @@ -14,8 +14,9 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +from __future__ import annotations + import logging -from contextlib import closing from typing import ( Any, Callable, @@ -106,7 +107,7 @@ def get_physical_table_metadata( return cols -def get_virtual_table_metadata(dataset: "SqlaTable") -> List[ResultSetColumnType]: +def get_virtual_table_metadata(dataset: SqlaTable) -> List[ResultSetColumnType]: """Use SQLparser to get virtual dataset metadata""" if not dataset.sql: raise SupersetGenericDBErrorException( @@ -114,7 +115,6 @@ def get_virtual_table_metadata(dataset: "SqlaTable") -> List[ResultSetColumnType ) db_engine_spec = dataset.database.db_engine_spec - engine = dataset.database.get_sqla_engine(schema=dataset.schema) sql = dataset.get_template_processor().process_template( dataset.sql, **dataset.template_params_dict ) @@ -139,9 +139,9 @@ def get_virtual_table_metadata(dataset: "SqlaTable") -> List[ResultSetColumnType # TODO(villebro): refactor to use same code that's used by # sql_lab.py:execute_sql_statements try: - with closing(engine.raw_connection()) as conn: + with dataset.database.get_raw_connection(schema=dataset.schema) as conn: cursor = conn.cursor() - query = dataset.database.apply_limit_to_sql(statements[0]) + query = dataset.database.apply_limit_to_sql(statements[0], limit=1) db_engine_spec.execute(cursor, query) result = db_engine_spec.fetch_data(cursor, limit=1) result_set = SupersetResultSet(result, cursor.description, db_engine_spec) @@ -151,6 +151,24 @@ def get_virtual_table_metadata(dataset: "SqlaTable") -> List[ResultSetColumnType return cols +def get_columns_description( + database: Database, + query: str, +) -> List[ResultSetColumnType]: + db_engine_spec = database.db_engine_spec + try: + with database.get_raw_connection() as conn: + cursor = conn.cursor() + query = database.apply_limit_to_sql(query, limit=1) + cursor.execute(query) + db_engine_spec.execute(cursor, query) + result = db_engine_spec.fetch_data(cursor, limit=1) + result_set = SupersetResultSet(result, cursor.description, db_engine_spec) + return result_set.columns + except Exception as ex: + raise SupersetGenericDBErrorException(message=str(ex)) from ex + + def validate_adhoc_subquery( sql: str, database_id: int, @@ -188,12 +206,12 @@ def validate_adhoc_subquery( @memoized def get_dialect_name(drivername: str) -> str: - return SqlaURL(drivername).get_dialect().name + return SqlaURL.create(drivername).get_dialect().name @memoized def get_identifier_quoter(drivername: str) -> Dict[str, Callable[[str], str]]: - return SqlaURL(drivername).get_dialect()().identifier_preparer.quote + return SqlaURL.create(drivername).get_dialect()().identifier_preparer.quote DeclarativeModel = TypeVar("DeclarativeModel", bound=DeclarativeMeta) @@ -217,7 +235,7 @@ def find_cached_objects_in_session( return iter([]) uuids = uuids or [] try: - items = set(session) + items = list(session) except ObjectDeletedError: logger.warning("ObjectDeletedError", exc_info=True) return iter(()) diff --git a/superset/connectors/sqla/views.py b/superset/connectors/sqla/views.py index c7b027112392..cb46930d9e29 100644 --- a/superset/connectors/sqla/views.py +++ b/superset/connectors/sqla/views.py @@ -35,7 +35,6 @@ from superset.superset_typing import FlaskResponse from superset.utils import core as utils from superset.views.base import ( - create_table_permissions, DatasourceFilter, DeleteMixin, ListWidgetWithCheckboxes, @@ -60,9 +59,10 @@ class SelectDataRequired(DataRequired): # pylint: disable=too-few-public-method field_flags = () -class TableColumnInlineView( - CompactCRUDMixin, SupersetModelView -): # pylint: disable=too-many-ancestors +class TableColumnInlineView( # pylint: disable=too-many-ancestors + CompactCRUDMixin, + SupersetModelView, +): datamodel = SQLAInterface(models.TableColumn) # TODO TODO, review need for this on related_views class_permission_name = "Dataset" @@ -99,6 +99,7 @@ class TableColumnInlineView( "groupby", "filterable", "is_dttm", + "extra", ] page_size = 500 description_columns = { @@ -194,9 +195,10 @@ class TableColumnInlineView( edit_form_extra_fields = add_form_extra_fields -class SqlMetricInlineView( - CompactCRUDMixin, SupersetModelView -): # pylint: disable=too-many-ancestors +class SqlMetricInlineView( # pylint: disable=too-many-ancestors + CompactCRUDMixin, + SupersetModelView, +): datamodel = SQLAInterface(models.SqlMetric) class_permission_name = "Dataset" method_permission_name = MODEL_VIEW_RW_METHOD_PERMISSION_MAP @@ -207,7 +209,7 @@ class SqlMetricInlineView( add_title = _("Add Metric") edit_title = _("Edit Metric") - list_columns = ["metric_name", "verbose_name", "metric_type"] + list_columns = ["metric_name", "verbose_name", "metric_type", "extra"] edit_columns = [ "metric_name", "description", @@ -278,9 +280,9 @@ def __init__(self, **kwargs: Any): super().__init__(**kwargs) -class RowLevelSecurityFiltersModelView( +class RowLevelSecurityFiltersModelView( # pylint: disable=too-many-ancestors SupersetModelView, DeleteMixin -): # pylint: disable=too-many-ancestors +): datamodel = SQLAInterface(models.RowLevelSecurityFilter) list_widget = cast(SupersetListWidget, RowLevelSecurityListWidget) @@ -291,21 +293,39 @@ class RowLevelSecurityFiltersModelView( edit_title = _("Edit Row level security filter") list_columns = [ + "name", "filter_type", "tables", "roles", - "group_key", "clause", "creator", "modified", ] - order_columns = ["filter_type", "group_key", "clause", "modified"] - edit_columns = ["filter_type", "tables", "roles", "group_key", "clause"] + order_columns = ["name", "filter_type", "clause", "modified"] + edit_columns = [ + "name", + "description", + "filter_type", + "tables", + "roles", + "group_key", + "clause", + ] show_columns = edit_columns - search_columns = ("filter_type", "tables", "roles", "group_key", "clause") + search_columns = ( + "name", + "description", + "filter_type", + "tables", + "roles", + "group_key", + "clause", + ) add_columns = edit_columns base_order = ("changed_on", "desc") description_columns = { + "name": _("Choose a unique name"), + "description": _("Optionally add a detailed description"), "filter_type": _( "Regular filters add where clauses to queries if a user belongs to a " "role referenced in the filter. Base filters apply filters to all queries " @@ -338,12 +358,16 @@ class RowLevelSecurityFiltersModelView( ), } label_columns = { + "name": _("Name"), + "description": _("Description"), "tables": _("Tables"), "roles": _("Roles"), "clause": _("Clause"), "creator": _("Creator"), "modified": _("Modified"), } + validators_columns = {"tables": [SelectDataRequired()]} + if app.config["RLS_FORM_QUERY_REL_FIELDS"]: add_form_query_rel_fields = app.config["RLS_FORM_QUERY_REL_FIELDS"] edit_form_query_rel_fields = add_form_query_rel_fields @@ -486,7 +510,6 @@ def post_add( # pylint: disable=arguments-differ ) -> None: if fetch_metadata: item.fetch_metadata() - create_table_permissions(item) if flash_message: flash( _( @@ -511,7 +534,7 @@ def edit(self, pk: str) -> FlaskResponse: resp = super().edit(pk) if isinstance(resp, str): return resp - return redirect("/superset/explore/table/{}/".format(pk)) + return redirect("/explore/?datasource_type=table&datasource_id={}".format(pk)) @expose("/list/") @has_access diff --git a/superset/constants.py b/superset/constants.py index 72fcc3fdb2bc..5c1f0e36fe26 100644 --- a/superset/constants.py +++ b/superset/constants.py @@ -20,6 +20,8 @@ # string to use when None values *need* to be converted to/from strings from enum import Enum +USER_AGENT = "Apache Superset" + NULL_STRING = "<NULL>" EMPTY_STRING = "<empty string>" @@ -28,6 +30,13 @@ # UUID for the examples database EXAMPLES_DB_UUID = "a2dc77af-e654-49bb-b321-40f6b559a1ee" +PASSWORD_MASK = "X" * 10 + +NO_TIME_RANGE = "No filter" + +QUERY_CANCEL_KEY = "cancel_query" +QUERY_EARLY_CANCEL_KEY = "early_cancel_query" + class RouteMethod: # pylint: disable=too-few-public-methods """ @@ -109,6 +118,7 @@ class RouteMethod: # pylint: disable=too-few-public-methods "put": "write", "related": "read", "related_objects": "read", + "tables": "read", "schemas": "read", "select_star": "read", "table_metadata": "read", @@ -130,6 +140,9 @@ class RouteMethod: # pylint: disable=too-few-public-methods "validate_sql": "read", "get_data": "read", "samples": "read", + "delete_ssh_tunnel": "write", + "get_updated_since": "read", + "stop_query": "read", } EXTRA_FORM_DATA_APPEND_KEYS = { @@ -147,7 +160,6 @@ class RouteMethod: # pylint: disable=too-few-public-methods "time_column": "time_column", "time_grain": "time_grain", "time_range": "time_range", - "druid_time_origin": "druid_time_origin", "time_grain_sqla": "time_grain_sqla", } diff --git a/superset/css_templates/api.py b/superset/css_templates/api.py index 5cc36f400198..ae367985e9c5 100644 --- a/superset/css_templates/api.py +++ b/superset/css_templates/api.py @@ -17,7 +17,7 @@ import logging from typing import Any -from flask import g, Response +from flask import Response from flask_appbuilder.api import expose, protect, rison, safe from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_babel import ngettext @@ -130,7 +130,7 @@ def bulk_delete(self, **kwargs: Any) -> Response: """ item_ids = kwargs["rison"] try: - BulkDeleteCssTemplateCommand(g.user, item_ids).run() + BulkDeleteCssTemplateCommand(item_ids).run() return self.response( 200, message=ngettext( diff --git a/superset/css_templates/commands/bulk_delete.py b/superset/css_templates/commands/bulk_delete.py index 839dbd26aee5..93564208c4f1 100644 --- a/superset/css_templates/commands/bulk_delete.py +++ b/superset/css_templates/commands/bulk_delete.py @@ -17,8 +17,6 @@ import logging from typing import List, Optional -from flask_appbuilder.security.sqla.models import User - from superset.commands.base import BaseCommand from superset.css_templates.commands.exceptions import ( CssTemplateBulkDeleteFailedError, @@ -32,8 +30,7 @@ class BulkDeleteCssTemplateCommand(BaseCommand): - def __init__(self, user: User, model_ids: List[int]): - self._actor = user + def __init__(self, model_ids: List[int]): self._model_ids = model_ids self._models: Optional[List[CssTemplate]] = None diff --git a/superset/dao/base.py b/superset/dao/base.py index 0090c4e535e2..126238f66132 100644 --- a/superset/dao/base.py +++ b/superset/dao/base.py @@ -50,14 +50,17 @@ class BaseDAO: @classmethod def find_by_id( - cls, model_id: Union[str, int], session: Session = None + cls, + model_id: Union[str, int], + session: Session = None, + skip_base_filter: bool = False, ) -> Optional[Model]: """ Find a model by id, if defined applies `base_filter` """ session = session or db.session query = session.query(cls.model_cls) - if cls.base_filter: + if cls.base_filter and not skip_base_filter: data_model = SQLAInterface(cls.model_cls, session) query = cls.base_filter( # pylint: disable=not-callable cls.id_column_name, data_model @@ -70,16 +73,22 @@ def find_by_id( return None @classmethod - def find_by_ids(cls, model_ids: Union[List[str], List[int]]) -> List[Model]: + def find_by_ids( + cls, + model_ids: Union[List[str], List[int]], + session: Session = None, + skip_base_filter: bool = False, + ) -> List[Model]: """ Find a List of models by a list of ids, if defined applies `base_filter` """ id_col = getattr(cls.model_cls, cls.id_column_name, None) if id_col is None: return [] - query = db.session.query(cls.model_cls).filter(id_col.in_(model_ids)) - if cls.base_filter: - data_model = SQLAInterface(cls.model_cls, db.session) + session = session or db.session + query = session.query(cls.model_cls).filter(id_col.in_(model_ids)) + if cls.base_filter and not skip_base_filter: + data_model = SQLAInterface(cls.model_cls, session) query = cls.base_filter( # pylint: disable=not-callable cls.id_column_name, data_model ).apply(query, None) diff --git a/superset/dao/datasource/dao.py b/superset/dao/datasource/dao.py deleted file mode 100644 index caa45564aa25..000000000000 --- a/superset/dao/datasource/dao.py +++ /dev/null @@ -1,147 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -from enum import Enum -from typing import Any, Dict, List, Optional, Set, Type, Union - -from flask_babel import _ -from sqlalchemy import or_ -from sqlalchemy.orm import Session, subqueryload -from sqlalchemy.orm.exc import NoResultFound - -from superset.connectors.sqla.models import SqlaTable -from superset.dao.base import BaseDAO -from superset.dao.exceptions import DatasourceNotFound, DatasourceTypeNotSupportedError -from superset.datasets.commands.exceptions import DatasetNotFoundError -from superset.datasets.models import Dataset -from superset.models.core import Database -from superset.models.sql_lab import Query, SavedQuery -from superset.tables.models import Table -from superset.utils.core import DatasourceType - -Datasource = Union[Dataset, SqlaTable, Table, Query, SavedQuery] - - -class DatasourceDAO(BaseDAO): - - sources: Dict[DatasourceType, Type[Datasource]] = { - DatasourceType.TABLE: SqlaTable, - DatasourceType.QUERY: Query, - DatasourceType.SAVEDQUERY: SavedQuery, - DatasourceType.DATASET: Dataset, - DatasourceType.SLTABLE: Table, - } - - @classmethod - def get_datasource( - cls, session: Session, datasource_type: DatasourceType, datasource_id: int - ) -> Datasource: - if datasource_type not in cls.sources: - raise DatasourceTypeNotSupportedError() - - datasource = ( - session.query(cls.sources[datasource_type]) - .filter_by(id=datasource_id) - .one_or_none() - ) - - if not datasource: - raise DatasourceNotFound() - - return datasource - - @classmethod - def get_all_sqlatables_datasources(cls, session: Session) -> List[Datasource]: - source_class = DatasourceDAO.sources[DatasourceType.TABLE] - qry = session.query(source_class) - qry = source_class.default_query(qry) - return qry.all() - - @classmethod - def get_datasource_by_name( # pylint: disable=too-many-arguments - cls, - session: Session, - datasource_type: DatasourceType, - datasource_name: str, - database_name: str, - schema: str, - ) -> Optional[Datasource]: - datasource_class = DatasourceDAO.sources[datasource_type] - if isinstance(datasource_class, SqlaTable): - return datasource_class.get_datasource_by_name( - session, datasource_name, schema, database_name - ) - return None - - @classmethod - def query_datasources_by_permissions( # pylint: disable=invalid-name - cls, - session: Session, - database: Database, - permissions: Set[str], - schema_perms: Set[str], - ) -> List[Datasource]: - # TODO(hughhhh): add unit test - datasource_class = DatasourceDAO.sources[DatasourceType[database.type]] - if not isinstance(datasource_class, SqlaTable): - return [] - - return ( - session.query(datasource_class) - .filter_by(database_id=database.id) - .filter( - or_( - datasource_class.perm.in_(permissions), - datasource_class.schema_perm.in_(schema_perms), - ) - ) - .all() - ) - - @classmethod - def get_eager_datasource( - cls, session: Session, datasource_type: str, datasource_id: int - ) -> Optional[Datasource]: - """Returns datasource with columns and metrics.""" - datasource_class = DatasourceDAO.sources[DatasourceType[datasource_type]] - if not isinstance(datasource_class, SqlaTable): - return None - return ( - session.query(datasource_class) - .options( - subqueryload(datasource_class.columns), - subqueryload(datasource_class.metrics), - ) - .filter_by(id=datasource_id) - .one() - ) - - @classmethod - def query_datasources_by_name( - cls, - session: Session, - database: Database, - datasource_name: str, - schema: Optional[str] = None, - ) -> List[Datasource]: - datasource_class = DatasourceDAO.sources[DatasourceType[database.type]] - if not isinstance(datasource_class, SqlaTable): - return [] - - return datasource_class.query_datasources_by_name( - session, database, datasource_name, schema=schema - ) diff --git a/superset/dao/exceptions.py b/superset/dao/exceptions.py index 9b5624bd5d31..a11db63a4c14 100644 --- a/superset/dao/exceptions.py +++ b/superset/dao/exceptions.py @@ -60,8 +60,10 @@ class DatasourceTypeNotSupportedError(DAOException): DAO datasource query source type is not supported """ + status = 422 message = "DAO datasource query source type is not supported" class DatasourceNotFound(DAOException): + status = 404 message = "Datasource does not exist" diff --git a/superset/dashboards/api.py b/superset/dashboards/api.py index 6e0a15a513e8..64ea637c663d 100644 --- a/superset/dashboards/api.py +++ b/superset/dashboards/api.py @@ -20,15 +20,15 @@ import logging from datetime import datetime from io import BytesIO -from typing import Any, Callable, Optional +from typing import Any, Callable, cast, Optional from zipfile import is_zipfile, ZipFile -from flask import g, make_response, redirect, request, Response, send_file, url_for +from flask import make_response, redirect, request, Response, send_file, url_for from flask_appbuilder import permission_name from flask_appbuilder.api import expose, protect, rison, safe from flask_appbuilder.hooks import before_request from flask_appbuilder.models.sqla.interface import SQLAInterface -from flask_babel import ngettext +from flask_babel import gettext, ngettext from marshmallow import ValidationError from werkzeug.wrappers import Response as WerkzeugResponse from werkzeug.wsgi import FileWrapper @@ -60,6 +60,7 @@ DashboardCertifiedFilter, DashboardCreatedByMeFilter, DashboardFavoriteFilter, + DashboardHasCreatedByFilter, DashboardTitleOrSlugFilter, FilterRelatedRoles, ) @@ -82,6 +83,7 @@ from superset.models.dashboard import Dashboard from superset.models.embedded_dashboard import EmbeddedDashboard from superset.tasks.thumbnails import cache_dashboard_thumbnail +from superset.tasks.utils import get_current_user from superset.utils.cache import etag_cache from superset.utils.screenshots import DashboardScreenshot from superset.utils.urls import get_url_path @@ -93,7 +95,11 @@ requires_json, statsd_metrics, ) -from superset.views.filters import FilterRelatedOwners +from superset.views.filters import ( + BaseFilterRelatedRoles, + BaseFilterRelatedUsers, + FilterRelatedOwners, +) logger = logging.getLogger(__name__) @@ -218,7 +224,7 @@ def ensure_thumbnails_enabled(self) -> Optional[Response]: search_filters = { "dashboard_title": [DashboardTitleOrSlugFilter], "id": [DashboardFavoriteFilter, DashboardCertifiedFilter], - "created_by": [DashboardCreatedByMeFilter], + "created_by": [DashboardCreatedByMeFilter, DashboardHasCreatedByFilter], } base_order = ("changed_on", "desc") @@ -239,6 +245,12 @@ def ensure_thumbnails_enabled(self) -> Optional[Response]: "owners": ("first_name", "asc"), "roles": ("name", "asc"), } + base_related_field_filters = { + "owners": [["id", BaseFilterRelatedUsers, lambda: []]], + "created_by": [["id", BaseFilterRelatedUsers, lambda: []]], + "roles": [["id", BaseFilterRelatedRoles, lambda: []]], + } + related_field_filters = { "owners": RelatedFieldFilter("first_name", FilterRelatedOwners), "roles": RelatedFieldFilter("name", FilterRelatedRoles), @@ -285,13 +297,14 @@ def __repr__(self) -> str: ) @safe @statsd_metrics - @event_logger.log_this_with_context( - action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.get", - log_to_statsd=False, - ) @with_dashboard - # pylint: disable=arguments-renamed, arguments-differ - def get(self, dash: Dashboard) -> Response: + @event_logger.log_this_with_extra_payload + # pylint: disable=arguments-differ + def get( + self, + dash: Dashboard, + add_extra_log_payload: Callable[..., None] = lambda **kwargs: None, + ) -> Response: """Gets a dashboard --- get: @@ -323,6 +336,9 @@ def get(self, dash: Dashboard) -> Response: $ref: '#/components/responses/404' """ result = self.dashboard_get_response_schema.dump(dash) + add_extra_log_payload( + dashboard_id=dash.id, action=f"{self.__class__.__name__}.get" + ) return self.response(200, result=result) @expose("/<id_or_slug>/datasets", methods=["GET"]) @@ -383,6 +399,12 @@ def get_datasets(self, id_or_slug: str) -> Response: self.dashboard_dataset_schema.dump(dataset) for dataset in datasets ] return self.response(200, result=result) + except (TypeError, ValueError) as err: + return self.response_400( + message=gettext( + "Dataset schema is invalid, caused by: %(error)s", error=str(err) + ) + ) except DashboardAccessDeniedError: return self.response_403() except DashboardNotFoundError: @@ -504,7 +526,7 @@ def post(self) -> Response: except ValidationError as error: return self.response_400(message=error.messages) try: - new_model = CreateDashboardCommand(g.user, item).run() + new_model = CreateDashboardCommand(item).run() return self.response(201, id=new_model.id, result=item) except DashboardInvalidError as ex: return self.response_422(message=ex.normalized_messages()) @@ -577,7 +599,7 @@ def put(self, pk: int) -> Response: except ValidationError as error: return self.response_400(message=error.messages) try: - changed_model = UpdateDashboardCommand(g.user, pk, item).run() + changed_model = UpdateDashboardCommand(pk, item).run() last_modified_time = changed_model.changed_on.replace( microsecond=0 ).timestamp() @@ -644,7 +666,7 @@ def delete(self, pk: int) -> Response: $ref: '#/components/responses/500' """ try: - DeleteDashboardCommand(g.user, pk).run() + DeleteDashboardCommand(pk).run() return self.response(200, message="OK") except DashboardNotFoundError: return self.response_404() @@ -704,7 +726,7 @@ def bulk_delete(self, **kwargs: Any) -> Response: """ item_ids = kwargs["rison"] try: - BulkDeleteDashboardCommand(g.user, item_ids).run() + BulkDeleteDashboardCommand(item_ids).run() return self.response( 200, message=ngettext( @@ -864,7 +886,7 @@ def thumbnail(self, pk: int, digest: str, **kwargs: Any) -> WerkzeugResponse: 500: $ref: '#/components/responses/500' """ - dashboard = self.datamodel.get(pk, self._base_filters) + dashboard = cast(Dashboard, self.datamodel.get(pk, self._base_filters)) if not dashboard: return self.response_404() @@ -872,8 +894,13 @@ def thumbnail(self, pk: int, digest: str, **kwargs: Any) -> WerkzeugResponse: "Superset.dashboard", dashboard_id_or_slug=dashboard.id ) # If force, request a screenshot from the workers + current_user = get_current_user() if kwargs["rison"].get("force", False): - cache_dashboard_thumbnail.delay(dashboard_url, dashboard.digest, force=True) + cache_dashboard_thumbnail.delay( + current_user=current_user, + dashboard_id=dashboard.id, + force=True, + ) return self.response(202, message="OK Async") # fetch the dashboard screenshot using the current user and cache if set screenshot = DashboardScreenshot( @@ -882,7 +909,11 @@ def thumbnail(self, pk: int, digest: str, **kwargs: Any) -> WerkzeugResponse: # If the screenshot does not exist, request one from the workers if not screenshot: self.incr_stats("async", self.thumbnail.__name__) - cache_dashboard_thumbnail.delay(dashboard_url, dashboard.digest, force=True) + cache_dashboard_thumbnail.delay( + current_user=current_user, + dashboard_id=dashboard.id, + force=True, + ) return self.response(202, message="OK Async") # If digests if dashboard.digest != digest: @@ -942,9 +973,8 @@ def favorite_status(self, **kwargs: Any) -> Response: dashboards = DashboardDAO.find_by_ids(requested_ids) if not dashboards: return self.response_404() - favorited_dashboard_ids = DashboardDAO.favorited_ids( - dashboards, g.user.get_id() - ) + + favorited_dashboard_ids = DashboardDAO.favorited_ids(dashboards) res = [ {"id": request_id, "value": request_id in favorited_dashboard_ids} for request_id in requested_ids diff --git a/superset/dashboards/commands/bulk_delete.py b/superset/dashboards/commands/bulk_delete.py index 958dea27d391..52f5998438bc 100644 --- a/superset/dashboards/commands/bulk_delete.py +++ b/superset/dashboards/commands/bulk_delete.py @@ -17,9 +17,9 @@ import logging from typing import List, Optional -from flask_appbuilder.security.sqla.models import User from flask_babel import lazy_gettext as _ +from superset import security_manager from superset.commands.base import BaseCommand from superset.commands.exceptions import DeleteFailedError from superset.dashboards.commands.exceptions import ( @@ -32,14 +32,12 @@ from superset.exceptions import SupersetSecurityException from superset.models.dashboard import Dashboard from superset.reports.dao import ReportScheduleDAO -from superset.views.base import check_ownership logger = logging.getLogger(__name__) class BulkDeleteDashboardCommand(BaseCommand): - def __init__(self, user: User, model_ids: List[int]): - self._actor = user + def __init__(self, model_ids: List[int]): self._model_ids = model_ids self._models: Optional[List[Dashboard]] = None @@ -67,6 +65,6 @@ def validate(self) -> None: # Check ownership for model in self._models: try: - check_ownership(model) + security_manager.raise_for_ownership(model) except SupersetSecurityException as ex: raise DashboardForbiddenError() from ex diff --git a/superset/dashboards/commands/create.py b/superset/dashboards/commands/create.py index 1e796bc318e4..811508c2e78f 100644 --- a/superset/dashboards/commands/create.py +++ b/superset/dashboards/commands/create.py @@ -18,7 +18,6 @@ from typing import Any, Dict, List, Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError from superset.commands.base import BaseCommand, CreateMixin @@ -35,8 +34,7 @@ class CreateDashboardCommand(CreateMixin, BaseCommand): - def __init__(self, user: User, data: Dict[str, Any]): - self._actor = user + def __init__(self, data: Dict[str, Any]): self._properties = data.copy() def run(self) -> Model: @@ -60,7 +58,7 @@ def validate(self) -> None: exceptions.append(DashboardSlugExistsValidationError()) try: - owners = self.populate_owners(self._actor, owner_ids) + owners = self.populate_owners(owner_ids) self._properties["owners"] = owners except ValidationError as ex: exceptions.append(ex) diff --git a/superset/dashboards/commands/delete.py b/superset/dashboards/commands/delete.py index 67f683a1c154..7af2fdf4ce03 100644 --- a/superset/dashboards/commands/delete.py +++ b/superset/dashboards/commands/delete.py @@ -18,9 +18,9 @@ from typing import Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from flask_babel import lazy_gettext as _ +from superset import security_manager from superset.commands.base import BaseCommand from superset.dao.exceptions import DAODeleteFailedError from superset.dashboards.commands.exceptions import ( @@ -33,14 +33,12 @@ from superset.exceptions import SupersetSecurityException from superset.models.dashboard import Dashboard from superset.reports.dao import ReportScheduleDAO -from superset.views.base import check_ownership logger = logging.getLogger(__name__) class DeleteDashboardCommand(BaseCommand): - def __init__(self, user: User, model_id: int): - self._actor = user + def __init__(self, model_id: int): self._model_id = model_id self._model: Optional[Dashboard] = None @@ -67,6 +65,6 @@ def validate(self) -> None: ) # Check ownership try: - check_ownership(self._model) + security_manager.raise_for_ownership(self._model) except SupersetSecurityException as ex: raise DashboardForbiddenError() from ex diff --git a/superset/dashboards/commands/export.py b/superset/dashboards/commands/export.py index 2d131d8f84e1..c17555694387 100644 --- a/superset/dashboards/commands/export.py +++ b/superset/dashboards/commands/export.py @@ -23,7 +23,6 @@ from typing import Any, Dict, Iterator, Optional, Set, Tuple import yaml -from werkzeug.utils import secure_filename from superset.charts.commands.export import ExportChartsCommand from superset.dashboards.commands.exceptions import DashboardNotFoundError @@ -35,6 +34,7 @@ from superset.models.dashboard import Dashboard from superset.models.slice import Slice from superset.utils.dict_import_export import EXPORT_VERSION +from superset.utils.file import get_filename logger = logging.getLogger(__name__) @@ -111,8 +111,8 @@ class ExportDashboardsCommand(ExportModelsCommand): def _export( model: Dashboard, export_related: bool = True ) -> Iterator[Tuple[str, str]]: - dashboard_slug = secure_filename(model.dashboard_title) - file_name = f"dashboards/{dashboard_slug}_{model.id}.yaml" + file_name = get_filename(model.dashboard_title, model.id) + file_path = f"dashboards/{file_name}.yaml" payload = model.export_to_dict( recursive=False, @@ -163,7 +163,7 @@ def _export( payload["version"] = EXPORT_VERSION file_content = yaml.safe_dump(payload, sort_keys=False) - yield file_name, file_content + yield file_path, file_content if export_related: chart_ids = [chart.id for chart in model.slices] diff --git a/superset/dashboards/commands/importers/v0.py b/superset/dashboards/commands/importers/v0.py index 207920b1d2c2..e49c93189683 100644 --- a/superset/dashboards/commands/importers/v0.py +++ b/superset/dashboards/commands/importers/v0.py @@ -24,7 +24,7 @@ from flask_babel import lazy_gettext as _ from sqlalchemy.orm import make_transient, Session -from superset import ConnectorRegistry, db +from superset import db from superset.commands.base import BaseCommand from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn from superset.datasets.commands.importers.v0 import import_dataset @@ -63,12 +63,11 @@ def import_chart( slc_to_import = slc_to_import.copy() slc_to_import.reset_ownership() params = slc_to_import.params_dict - datasource = ConnectorRegistry.get_datasource_by_name( - session, - slc_to_import.datasource_type, - params["datasource_name"], - params["schema"], - params["database_name"], + datasource = SqlaTable.get_datasource_by_name( + session=session, + datasource_name=params["datasource_name"], + database_name=params["database_name"], + schema=params["schema"], ) slc_to_import.datasource_id = datasource.id # type: ignore if slc_to_override: diff --git a/superset/dashboards/commands/importers/v1/__init__.py b/superset/dashboards/commands/importers/v1/__init__.py index 1720e01ab8bc..83d26fc7e735 100644 --- a/superset/dashboards/commands/importers/v1/__init__.py +++ b/superset/dashboards/commands/importers/v1/__init__.py @@ -139,5 +139,4 @@ def _import( {"dashboard_id": dashboard_id, "slice_id": chart_id} for (dashboard_id, chart_id) in dashboard_chart_ids ] - # pylint: disable=no-value-for-parameter # sqlalchemy/issues/4656 session.execute(dashboard_slices.insert(), values) diff --git a/superset/dashboards/commands/update.py b/superset/dashboards/commands/update.py index 2065437cc3b3..12ac241dccc2 100644 --- a/superset/dashboards/commands/update.py +++ b/superset/dashboards/commands/update.py @@ -19,9 +19,9 @@ from typing import Any, Dict, List, Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError +from superset import security_manager from superset.commands.base import BaseCommand, UpdateMixin from superset.commands.utils import populate_roles from superset.dao.exceptions import DAOUpdateFailedError @@ -36,14 +36,12 @@ from superset.exceptions import SupersetSecurityException from superset.extensions import db from superset.models.dashboard import Dashboard -from superset.views.base import check_ownership logger = logging.getLogger(__name__) class UpdateDashboardCommand(UpdateMixin, BaseCommand): - def __init__(self, user: User, model_id: int, data: Dict[str, Any]): - self._actor = user + def __init__(self, model_id: int, data: Dict[str, Any]): self._model_id = model_id self._properties = data.copy() self._model: Optional[Dashboard] = None @@ -52,13 +50,13 @@ def run(self) -> Model: self.validate() try: dashboard = DashboardDAO.update(self._model, self._properties, commit=False) - dashboard = DashboardDAO.update_charts_owners(dashboard, commit=False) if self._properties.get("json_metadata"): dashboard = DashboardDAO.set_dash_metadata( dashboard, data=json.loads(self._properties.get("json_metadata", "{}")), commit=False, ) + dashboard = DashboardDAO.update_charts_owners(dashboard, commit=False) db.session.commit() except DAOUpdateFailedError as ex: logger.exception(ex.exception) @@ -77,7 +75,7 @@ def validate(self) -> None: raise DashboardNotFoundError() # Check ownership try: - check_ownership(self._model) + security_manager.raise_for_ownership(self._model) except SupersetSecurityException as ex: raise DashboardForbiddenError() from ex @@ -89,7 +87,7 @@ def validate(self) -> None: if owners_ids is None: owners_ids = [owner.id for owner in self._model.owners] try: - owners = self.populate_owners(self._actor, owners_ids) + owners = self.populate_owners(owners_ids) self._properties["owners"] = owners except ValidationError as ex: exceptions.append(ex) diff --git a/superset/dashboards/dao.py b/superset/dashboards/dao.py index ce6e30f8d4be..3f0666266f9c 100644 --- a/superset/dashboards/dao.py +++ b/superset/dashboards/dao.py @@ -19,16 +19,17 @@ from datetime import datetime from typing import Any, Dict, List, Optional, Union +from flask_appbuilder.models.sqla.interface import SQLAInterface from sqlalchemy.exc import SQLAlchemyError -from superset import security_manager from superset.dao.base import BaseDAO from superset.dashboards.commands.exceptions import DashboardNotFoundError from superset.dashboards.filters import DashboardAccessFilter from superset.extensions import db from superset.models.core import FavStar, FavStarClassName -from superset.models.dashboard import Dashboard +from superset.models.dashboard import Dashboard, id_or_slug_filter from superset.models.slice import Slice +from superset.utils.core import get_user_id from superset.utils.dashboard_filter_scopes_converter import copy_filter_scopes logger = logging.getLogger(__name__) @@ -39,11 +40,22 @@ class DashboardDAO(BaseDAO): base_filter = DashboardAccessFilter @staticmethod - def get_by_id_or_slug(id_or_slug: str) -> Dashboard: - dashboard = Dashboard.get(id_or_slug) + def get_by_id_or_slug(id_or_slug: Union[int, str]) -> Dashboard: + query = ( + db.session.query(Dashboard) + .filter(id_or_slug_filter(id_or_slug)) + .outerjoin(Slice, Dashboard.slices) + .outerjoin(Slice.table) + .outerjoin(Dashboard.owners) + .outerjoin(Dashboard.roles) + ) + # Apply dashboard base filters + query = DashboardAccessFilter("id", SQLAInterface(Dashboard, db.session)).apply( + query, None + ) + dashboard = query.one_or_none() if not dashboard: raise DashboardNotFoundError() - security_manager.raise_for_dashboard_access(dashboard) return dashboard @staticmethod @@ -66,7 +78,7 @@ def get_dashboard_changed_on( :returns: The datetime the dashboard was last changed. """ - dashboard = ( + dashboard: Dashboard = ( DashboardDAO.get_by_id_or_slug(id_or_slug_or_dashboard) if isinstance(id_or_slug_or_dashboard, str) else id_or_slug_or_dashboard @@ -159,6 +171,7 @@ def bulk_delete(models: Optional[List[Dashboard]], commit: bool = True) -> None: for model in models: model.slices = [] model.owners = [] + model.embedded = [] db.session.merge(model) # bulk delete itself try: @@ -168,8 +181,7 @@ def bulk_delete(models: Optional[List[Dashboard]], commit: bool = True) -> None: if commit: db.session.commit() except SQLAlchemyError as ex: - if commit: - db.session.rollback() + db.session.rollback() raise ex @staticmethod @@ -266,7 +278,8 @@ def set_dash_metadata( # pylint: disable=too-many-locals md["color_scheme"] = data.get("color_scheme", "") md["label_colors"] = data.get("label_colors", {}) md["shared_label_colors"] = data.get("shared_label_colors", {}) - + md["color_scheme_domain"] = data.get("color_scheme_domain", []) + md["cross_filters_enabled"] = data.get("cross_filters_enabled", True) dashboard.json_metadata = json.dumps(md) if commit: @@ -274,9 +287,7 @@ def set_dash_metadata( # pylint: disable=too-many-locals return dashboard @staticmethod - def favorited_ids( - dashboards: List[Dashboard], current_user_id: int - ) -> List[FavStar]: + def favorited_ids(dashboards: List[Dashboard]) -> List[FavStar]: ids = [dash.id for dash in dashboards] return [ star.obj_id @@ -284,7 +295,7 @@ def favorited_ids( .filter( FavStar.class_name == FavStarClassName.DASHBOARD, FavStar.obj_id.in_(ids), - FavStar.user_id == current_user_id, + FavStar.user_id == get_user_id(), ) .all() ] diff --git a/superset/dashboards/filter_sets/api.py b/superset/dashboards/filter_sets/api.py index 3dc2a28de260..109ae73f0782 100644 --- a/superset/dashboards/filter_sets/api.py +++ b/superset/dashboards/filter_sets/api.py @@ -17,7 +17,7 @@ import logging from typing import Any, cast -from flask import g, request, Response +from flask import request, Response from flask_appbuilder.api import ( expose, get_list_schema, @@ -243,7 +243,7 @@ def post(self, dashboard_id: int) -> Response: """ try: item = self.add_model_schema.load(request.json) - new_model = CreateFilterSetCommand(g.user, dashboard_id, item).run() + new_model = CreateFilterSetCommand(dashboard_id, item).run() return self.response( 201, **self.show_model_schema.dump(new_model, many=False) ) @@ -314,7 +314,7 @@ def put(self, dashboard_id: int, pk: int) -> Response: """ try: item = self.edit_model_schema.load(request.json) - changed_model = UpdateFilterSetCommand(g.user, dashboard_id, pk, item).run() + changed_model = UpdateFilterSetCommand(dashboard_id, pk, item).run() return self.response( 200, **self.show_model_schema.dump(changed_model, many=False) ) @@ -374,7 +374,7 @@ def delete(self, dashboard_id: int, pk: int) -> Response: $ref: '#/components/responses/500' """ try: - changed_model = DeleteFilterSetCommand(g.user, dashboard_id, pk).run() + changed_model = DeleteFilterSetCommand(dashboard_id, pk).run() return self.response(200, id=changed_model.id) except ValidationError as error: return self.response_400(message=error.messages) diff --git a/superset/dashboards/filter_sets/commands/base.py b/superset/dashboards/filter_sets/commands/base.py index 0e902e5e687c..e6a4b03e3faa 100644 --- a/superset/dashboards/filter_sets/commands/base.py +++ b/superset/dashboards/filter_sets/commands/base.py @@ -18,10 +18,9 @@ from typing import cast, Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User +from superset import security_manager from superset.common.not_authrized_object import NotAuthorizedException -from superset.common.request_contexed_based import is_user_admin from superset.dashboards.commands.exceptions import DashboardNotFoundError from superset.dashboards.dao import DashboardDAO from superset.dashboards.filter_sets.commands.exceptions import ( @@ -31,6 +30,7 @@ from superset.dashboards.filter_sets.consts import USER_OWNER_TYPE from superset.models.dashboard import Dashboard from superset.models.filter_set import FilterSet +from superset.utils.core import get_user_id logger = logging.getLogger(__name__) @@ -41,9 +41,7 @@ class BaseFilterSetCommand: _filter_set_id: Optional[int] _filter_set: Optional[FilterSet] - def __init__(self, user: User, dashboard_id: int): - self._actor = user - self._is_actor_admin = is_user_admin() + def __init__(self, dashboard_id: int): self._dashboard_id = dashboard_id def run(self) -> Model: @@ -54,9 +52,6 @@ def _validate_filterset_dashboard_exists(self) -> None: if not self._dashboard: raise DashboardNotFoundError() - def is_user_dashboard_owner(self) -> bool: - return self._is_actor_admin or self._dashboard.is_actor_owner() - def validate_exist_filter_use_cases_set(self) -> None: # pylint: disable=C0103 self._validate_filter_set_exists_and_set_when_exists() self.check_ownership() @@ -70,15 +65,15 @@ def _validate_filter_set_exists_and_set_when_exists(self) -> None: def check_ownership(self) -> None: try: - if not self._is_actor_admin: + if not security_manager.is_admin(): filter_set: FilterSet = cast(FilterSet, self._filter_set) if filter_set.owner_type == USER_OWNER_TYPE: - if self._actor.id != filter_set.owner_id: + if get_user_id() != filter_set.owner_id: raise FilterSetForbiddenError( str(self._filter_set_id), "The user is not the owner of the filter_set", ) - elif not self.is_user_dashboard_owner(): + elif not security_manager.is_owner(self._dashboard): raise FilterSetForbiddenError( str(self._filter_set_id), "The user is not an owner of the filter_set's dashboard", diff --git a/superset/dashboards/filter_sets/commands/create.py b/superset/dashboards/filter_sets/commands/create.py index b74e6d304162..de1d70daf787 100644 --- a/superset/dashboards/filter_sets/commands/create.py +++ b/superset/dashboards/filter_sets/commands/create.py @@ -17,9 +17,7 @@ import logging from typing import Any, Dict -from flask import g from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from superset import security_manager from superset.dashboards.filter_sets.commands.base import BaseFilterSetCommand @@ -35,14 +33,15 @@ OWNER_TYPE_FIELD, ) from superset.dashboards.filter_sets.dao import FilterSetDAO +from superset.utils.core import get_user_id logger = logging.getLogger(__name__) class CreateFilterSetCommand(BaseFilterSetCommand): # pylint: disable=C0103 - def __init__(self, user: User, dashboard_id: int, data: Dict[str, Any]): - super().__init__(user, dashboard_id) + def __init__(self, dashboard_id: int, data: Dict[str, Any]): + super().__init__(dashboard_id) self._properties = data.copy() def run(self) -> Model: @@ -61,13 +60,13 @@ def validate(self) -> None: def _validate_owner_id_exists(self) -> None: owner_id = self._properties[OWNER_ID_FIELD] - if not (g.user.id == owner_id or security_manager.get_user_by_id(owner_id)): + if not (get_user_id() == owner_id or security_manager.get_user_by_id(owner_id)): raise FilterSetCreateFailedError( str(self._dashboard_id), "owner_id does not exists" ) def _validate_user_is_the_dashboard_owner(self) -> None: - if not self.is_user_dashboard_owner(): + if not security_manager.is_owner(self._dashboard): raise UserIsNotDashboardOwnerError(str(self._dashboard_id)) def _validate_owner_id_is_dashboard_id(self) -> None: diff --git a/superset/dashboards/filter_sets/commands/delete.py b/superset/dashboards/filter_sets/commands/delete.py index 18d7fed8f2bb..c416252794e8 100644 --- a/superset/dashboards/filter_sets/commands/delete.py +++ b/superset/dashboards/filter_sets/commands/delete.py @@ -17,7 +17,6 @@ import logging from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from superset.dao.exceptions import DAODeleteFailedError from superset.dashboards.filter_sets.commands.base import BaseFilterSetCommand @@ -32,8 +31,8 @@ class DeleteFilterSetCommand(BaseFilterSetCommand): - def __init__(self, user: User, dashboard_id: int, filter_set_id: int): - super().__init__(user, dashboard_id) + def __init__(self, dashboard_id: int, filter_set_id: int): + super().__init__(dashboard_id) self._filter_set_id = filter_set_id def run(self) -> Model: diff --git a/superset/dashboards/filter_sets/commands/update.py b/superset/dashboards/filter_sets/commands/update.py index d2c43f085212..07d59f93aee2 100644 --- a/superset/dashboards/filter_sets/commands/update.py +++ b/superset/dashboards/filter_sets/commands/update.py @@ -18,7 +18,6 @@ from typing import Any, Dict from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from superset.dao.exceptions import DAOUpdateFailedError from superset.dashboards.filter_sets.commands.base import BaseFilterSetCommand @@ -32,10 +31,8 @@ class UpdateFilterSetCommand(BaseFilterSetCommand): - def __init__( - self, user: User, dashboard_id: int, filter_set_id: int, data: Dict[str, Any] - ): - super().__init__(user, dashboard_id) + def __init__(self, dashboard_id: int, filter_set_id: int, data: Dict[str, Any]): + super().__init__(dashboard_id) self._filter_set_id = filter_set_id self._properties = data.copy() diff --git a/superset/dashboards/filter_sets/filters.py b/superset/dashboards/filter_sets/filters.py index 0083f40d1a57..3578e8b0b48a 100644 --- a/superset/dashboards/filter_sets/filters.py +++ b/superset/dashboards/filter_sets/filters.py @@ -18,13 +18,14 @@ from typing import Any, TYPE_CHECKING -from flask import g from sqlalchemy import and_, or_ +from superset import security_manager from superset.dashboards.filter_sets.consts import DASHBOARD_OWNER_TYPE, USER_OWNER_TYPE from superset.models.dashboard import dashboard_user from superset.models.filter_set import FilterSet -from superset.views.base import BaseFilter, is_user_admin +from superset.utils.core import get_user_id +from superset.views.base import BaseFilter if TYPE_CHECKING: from sqlalchemy.orm.query import Query @@ -32,9 +33,8 @@ class FilterSetFilter(BaseFilter): # pylint: disable=too-few-public-methods) def apply(self, query: Query, value: Any) -> Query: - if is_user_admin(): + if security_manager.is_admin(): return query - current_user_id = g.user.id filter_set_ids_by_dashboard_owners = ( # pylint: disable=C0103 query.from_self(FilterSet.id) @@ -42,7 +42,7 @@ def apply(self, query: Query, value: Any) -> Query: .filter( and_( FilterSet.owner_type == DASHBOARD_OWNER_TYPE, - dashboard_user.c.user_id == current_user_id, + dashboard_user.c.user_id == get_user_id(), ) ) ) @@ -51,7 +51,7 @@ def apply(self, query: Query, value: Any) -> Query: or_( and_( FilterSet.owner_type == USER_OWNER_TYPE, - FilterSet.owner_id == current_user_id, + FilterSet.owner_id == get_user_id(), ), FilterSet.id.in_(filter_set_ids_by_dashboard_owners), ) diff --git a/superset/dashboards/filter_state/commands/create.py b/superset/dashboards/filter_state/commands/create.py index 18dff8928fe8..48b5e4f5c2d2 100644 --- a/superset/dashboards/filter_state/commands/create.py +++ b/superset/dashboards/filter_state/commands/create.py @@ -20,17 +20,17 @@ from superset.dashboards.filter_state.commands.utils import check_access from superset.extensions import cache_manager -from superset.key_value.utils import get_owner, random_key +from superset.key_value.utils import random_key from superset.temporary_cache.commands.create import CreateTemporaryCacheCommand from superset.temporary_cache.commands.entry import Entry from superset.temporary_cache.commands.parameters import CommandParameters from superset.temporary_cache.utils import cache_key +from superset.utils.core import get_user_id class CreateFilterStateCommand(CreateTemporaryCacheCommand): def create(self, cmd_params: CommandParameters) -> str: resource_id = cmd_params.resource_id - actor = cmd_params.actor tab_id = cmd_params.tab_id contextual_key = cache_key(session.get("_id"), tab_id, resource_id) key = cache_manager.filter_state_cache.get(contextual_key) @@ -38,7 +38,7 @@ def create(self, cmd_params: CommandParameters) -> str: key = random_key() value = cast(str, cmd_params.value) # schema ensures that value is not optional check_access(resource_id) - entry: Entry = {"owner": get_owner(actor), "value": value} + entry: Entry = {"owner": get_user_id(), "value": value} cache_manager.filter_state_cache.set(cache_key(resource_id, key), entry) cache_manager.filter_state_cache.set(contextual_key, key) return key diff --git a/superset/dashboards/filter_state/commands/delete.py b/superset/dashboards/filter_state/commands/delete.py index 3ddc08fc5190..6086388a8ce4 100644 --- a/superset/dashboards/filter_state/commands/delete.py +++ b/superset/dashboards/filter_state/commands/delete.py @@ -18,23 +18,22 @@ from superset.dashboards.filter_state.commands.utils import check_access from superset.extensions import cache_manager -from superset.key_value.utils import get_owner from superset.temporary_cache.commands.delete import DeleteTemporaryCacheCommand from superset.temporary_cache.commands.entry import Entry from superset.temporary_cache.commands.exceptions import TemporaryCacheAccessDeniedError from superset.temporary_cache.commands.parameters import CommandParameters from superset.temporary_cache.utils import cache_key +from superset.utils.core import get_user_id class DeleteFilterStateCommand(DeleteTemporaryCacheCommand): def delete(self, cmd_params: CommandParameters) -> bool: resource_id = cmd_params.resource_id - actor = cmd_params.actor key = cache_key(resource_id, cmd_params.key) check_access(resource_id) entry: Entry = cache_manager.filter_state_cache.get(key) if entry: - if entry["owner"] != get_owner(actor): + if entry["owner"] != get_user_id(): raise TemporaryCacheAccessDeniedError() tab_id = cmd_params.tab_id contextual_key = cache_key(session.get("_id"), tab_id, resource_id) diff --git a/superset/dashboards/filter_state/commands/update.py b/superset/dashboards/filter_state/commands/update.py index 7f150aae6bae..c1dc529ccff5 100644 --- a/superset/dashboards/filter_state/commands/update.py +++ b/superset/dashboards/filter_state/commands/update.py @@ -20,23 +20,23 @@ from superset.dashboards.filter_state.commands.utils import check_access from superset.extensions import cache_manager -from superset.key_value.utils import get_owner, random_key +from superset.key_value.utils import random_key from superset.temporary_cache.commands.entry import Entry from superset.temporary_cache.commands.exceptions import TemporaryCacheAccessDeniedError from superset.temporary_cache.commands.parameters import CommandParameters from superset.temporary_cache.commands.update import UpdateTemporaryCacheCommand from superset.temporary_cache.utils import cache_key +from superset.utils.core import get_user_id class UpdateFilterStateCommand(UpdateTemporaryCacheCommand): def update(self, cmd_params: CommandParameters) -> Optional[str]: resource_id = cmd_params.resource_id - actor = cmd_params.actor key = cmd_params.key value = cast(str, cmd_params.value) # schema ensures that value is not optional check_access(resource_id) entry: Entry = cache_manager.filter_state_cache.get(cache_key(resource_id, key)) - owner = get_owner(actor) + owner = get_user_id() if entry: if entry["owner"] != owner: raise TemporaryCacheAccessDeniedError() diff --git a/superset/dashboards/filters.py b/superset/dashboards/filters.py index 7b02c2367954..e09609ff511e 100644 --- a/superset/dashboards/filters.py +++ b/superset/dashboards/filters.py @@ -29,7 +29,8 @@ from superset.models.embedded_dashboard import EmbeddedDashboard from superset.models.slice import Slice from superset.security.guest_token import GuestTokenResourceType, GuestUser -from superset.views.base import BaseFilter, is_user_admin +from superset.utils.core import get_user_id +from superset.views.base import BaseFilter from superset.views.base_api import BaseFavoriteFilter @@ -51,15 +52,15 @@ def apply(self, query: Query, value: Any) -> Query: class DashboardCreatedByMeFilter(BaseFilter): # pylint: disable=too-few-public-methods name = _("Created by me") - arg_name = "created_by_me" + arg_name = "dashboard_created_by_me" def apply(self, query: Query, value: Any) -> Query: return query.filter( or_( Dashboard.created_by_fk # pylint: disable=comparison-with-callable - == g.user.get_user_id(), + == get_user_id(), Dashboard.changed_by_fk # pylint: disable=comparison-with-callable - == g.user.get_user_id(), + == get_user_id(), ) ) @@ -97,7 +98,7 @@ class DashboardAccessFilter(BaseFilter): # pylint: disable=too-few-public-metho """ def apply(self, query: Query, value: Any) -> Query: - if is_user_admin(): + if security_manager.is_admin(): return query datasource_perms = security_manager.user_view_menu_names("datasource_access") @@ -110,7 +111,7 @@ def apply(self, query: Query, value: Any) -> Query: datasource_perm_query = ( db.session.query(Dashboard.id) - .join(Dashboard.slices) + .join(Dashboard.slices, isouter=True) .filter( and_( Dashboard.published.is_(True), @@ -126,17 +127,14 @@ def apply(self, query: Query, value: Any) -> Query: users_favorite_dash_query = db.session.query(FavStar.obj_id).filter( and_( - FavStar.user_id == security_manager.user_model.get_user_id(), + FavStar.user_id == get_user_id(), FavStar.class_name == "Dashboard", ) ) owner_ids_query = ( db.session.query(Dashboard.id) .join(Dashboard.owners) - .filter( - security_manager.user_model.id - == security_manager.user_model.get_user_id() - ) + .filter(security_manager.user_model.id == get_user_id()) ) feature_flagged_filters = [] @@ -158,7 +156,6 @@ def apply(self, query: Query, value: Any) -> Query: if is_feature_enabled("EMBEDDED_SUPERSET") and security_manager.is_guest_user( g.user ): - guest_user: GuestUser = g.user embedded_dashboard_ids = [ r["id"] @@ -235,3 +232,19 @@ def apply(self, query: Query, value: Any) -> Query: ) ) return query + + +class DashboardHasCreatedByFilter(BaseFilter): # pylint: disable=too-few-public-methods + """ + Custom filter for the GET list that filters all dashboards created by user + """ + + name = _("Has created by") + arg_name = "dashboard_has_created_by" + + def apply(self, query: Query, value: Any) -> Query: + if value is True: + return query.filter(and_(Dashboard.created_by_fk.isnot(None))) + if value is False: + return query.filter(and_(Dashboard.created_by_fk.is_(None))) + return query diff --git a/superset/dashboards/permalink/api.py b/superset/dashboards/permalink/api.py index ca536af8f740..a8664f0ddd80 100644 --- a/superset/dashboards/permalink/api.py +++ b/superset/dashboards/permalink/api.py @@ -16,11 +16,11 @@ # under the License. import logging -from flask import g, request, Response -from flask_appbuilder.api import BaseApi, expose, protect, safe +from flask import request, Response +from flask_appbuilder.api import expose, protect, safe from marshmallow import ValidationError -from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod +from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP from superset.dashboards.commands.exceptions import ( DashboardAccessDeniedError, DashboardNotFoundError, @@ -33,20 +33,14 @@ from superset.dashboards.permalink.schemas import DashboardPermalinkPostSchema from superset.extensions import event_logger from superset.key_value.exceptions import KeyValueAccessDeniedError -from superset.views.base_api import requires_json +from superset.views.base_api import BaseSupersetApi, requires_json logger = logging.getLogger(__name__) -class DashboardPermalinkRestApi(BaseApi): +class DashboardPermalinkRestApi(BaseSupersetApi): add_model_schema = DashboardPermalinkPostSchema() method_permission_name = MODEL_API_RW_METHOD_PERMISSION_MAP - include_route_methods = { - RouteMethod.POST, - RouteMethod.PUT, - RouteMethod.GET, - RouteMethod.DELETE, - } allow_browser_login = True class_permission_name = "DashboardPermalinkRestApi" resource_name = "dashboard" @@ -104,7 +98,6 @@ def post(self, pk: str) -> Response: try: state = self.add_model_schema.load(request.json) key = CreateDashboardPermalinkCommand( - actor=g.user, dashboard_id=pk, state=state, ).run() @@ -162,7 +155,7 @@ def get(self, key: str) -> Response: $ref: '#/components/responses/500' """ try: - value = GetDashboardPermalinkCommand(actor=g.user, key=key).run() + value = GetDashboardPermalinkCommand(key=key).run() if not value: return self.response_404() return self.response(200, **value) diff --git a/superset/dashboards/permalink/commands/create.py b/superset/dashboards/permalink/commands/create.py index 4ffd41104ea0..51dac2d5dee7 100644 --- a/superset/dashboards/permalink/commands/create.py +++ b/superset/dashboards/permalink/commands/create.py @@ -16,27 +16,32 @@ # under the License. import logging -from flask_appbuilder.security.sqla.models import User from sqlalchemy.exc import SQLAlchemyError from superset.dashboards.dao import DashboardDAO from superset.dashboards.permalink.commands.base import BaseDashboardPermalinkCommand from superset.dashboards.permalink.exceptions import DashboardPermalinkCreateFailedError from superset.dashboards.permalink.types import DashboardPermalinkState -from superset.key_value.commands.create import CreateKeyValueCommand -from superset.key_value.utils import encode_permalink_key +from superset.key_value.commands.upsert import UpsertKeyValueCommand +from superset.key_value.utils import encode_permalink_key, get_deterministic_uuid +from superset.utils.core import get_user_id logger = logging.getLogger(__name__) class CreateDashboardPermalinkCommand(BaseDashboardPermalinkCommand): + """ + Get or create a permalink key for the dashboard. + + The same dashboard_id and state for the same user will return the + same permalink. + """ + def __init__( self, - actor: User, dashboard_id: str, state: DashboardPermalinkState, ): - self.actor = actor self.dashboard_id = dashboard_id self.state = state @@ -48,13 +53,13 @@ def run(self) -> str: "dashboardId": self.dashboard_id, "state": self.state, } - key = CreateKeyValueCommand( - actor=self.actor, + user_id = get_user_id() + key = UpsertKeyValueCommand( resource=self.resource, + key=get_deterministic_uuid(self.salt, (user_id, value)), value=value, ).run() - if key.id is None: - raise DashboardPermalinkCreateFailedError("Unexpected missing key id") + assert key.id # for type checks return encode_permalink_key(key=key.id, salt=self.salt) except SQLAlchemyError as ex: logger.exception("Error running create command") diff --git a/superset/dashboards/permalink/commands/get.py b/superset/dashboards/permalink/commands/get.py index 24bf77834a60..f89f9444e7a4 100644 --- a/superset/dashboards/permalink/commands/get.py +++ b/superset/dashboards/permalink/commands/get.py @@ -17,7 +17,6 @@ import logging from typing import Optional -from flask_appbuilder.security.sqla.models import User from sqlalchemy.exc import SQLAlchemyError from superset.dashboards.commands.exceptions import DashboardNotFoundError @@ -33,8 +32,7 @@ class GetDashboardPermalinkCommand(BaseDashboardPermalinkCommand): - def __init__(self, actor: User, key: str): - self.actor = actor + def __init__(self, key: str): self.key = key def run(self) -> Optional[DashboardPermalinkValue]: diff --git a/superset/dashboards/permalink/schemas.py b/superset/dashboards/permalink/schemas.py index a0fc1cbc5598..ce222d7ed62c 100644 --- a/superset/dashboards/permalink/schemas.py +++ b/superset/dashboards/permalink/schemas.py @@ -18,10 +18,16 @@ class DashboardPermalinkPostSchema(Schema): - filterState = fields.Dict( + dataMask = fields.Dict( required=False, allow_none=True, - description="Native filter state", + description="Data mask used for native filter state", + ) + activeTabs = fields.List( + fields.String(), + required=False, + allow_none=True, + description="Current active dashboard tabs", ) urlParams = fields.List( fields.Tuple( @@ -37,6 +43,8 @@ class DashboardPermalinkPostSchema(Schema): allow_none=True, description="URL Parameters", ) - hash = fields.String( - required=False, allow_none=True, description="Optional anchor link" + anchor = fields.String( + required=False, + allow_none=True, + description="Optional anchor link added to url hash", ) diff --git a/superset/dashboards/permalink/types.py b/superset/dashboards/permalink/types.py index e93076ba2378..91c5a9620cf7 100644 --- a/superset/dashboards/permalink/types.py +++ b/superset/dashboards/permalink/types.py @@ -18,8 +18,9 @@ class DashboardPermalinkState(TypedDict): - filterState: Optional[Dict[str, Any]] - hash: Optional[str] + dataMask: Optional[Dict[str, Any]] + activeTabs: Optional[List[str]] + anchor: Optional[str] urlParams: Optional[List[Tuple[str, str]]] diff --git a/superset/dashboards/schemas.py b/superset/dashboards/schemas.py index d91879f0d88b..f0d05445aae7 100644 --- a/superset/dashboards/schemas.py +++ b/superset/dashboards/schemas.py @@ -129,9 +129,12 @@ class DashboardJSONMetadataSchema(Schema): positions = fields.Dict(allow_none=True) label_colors = fields.Dict() shared_label_colors = fields.Dict() + color_scheme_domain = fields.List(fields.Str()) + cross_filters_enabled = fields.Boolean(default=True) # used for v0 import/export import_time = fields.Integer() remote_id = fields.Integer() + filter_bar_orientation = fields.Str(allow_none=True) class UserSchema(Schema): @@ -173,7 +176,6 @@ class DatabaseSchema(Schema): id = fields.Int() name = fields.String() backend = fields.String() - allow_multi_schema_metadata_fetch = fields.Bool() # pylint: disable=invalid-name allows_subquery = fields.Bool() allows_cost_estimate = fields.Bool() allows_virtual_table_explore = fields.Bool() @@ -206,7 +208,7 @@ class DashboardDatasetSchema(Schema): health_check_message = fields.Str() fetch_values_predicate = fields.Str() template_params = fields.Str() - owners = fields.List(fields.Int()) + owners = fields.List(fields.Dict()) columns = fields.List(fields.Dict()) column_types = fields.List(fields.Int()) metrics = fields.List(fields.Dict()) diff --git a/superset/databases/api.py b/superset/databases/api.py index b9fe4ca3d7e3..c28519874747 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -19,10 +19,10 @@ import logging from datetime import datetime from io import BytesIO -from typing import Any, Dict, List, Optional +from typing import Any, cast, Dict, List, Optional from zipfile import is_zipfile, ZipFile -from flask import g, request, Response, send_file +from flask import request, Response, send_file from flask_appbuilder.api import expose, protect, rison, safe from flask_appbuilder.models.sqla.interface import SQLAInterface from marshmallow import ValidationError @@ -44,11 +44,13 @@ DatabaseDeleteFailedError, DatabaseInvalidError, DatabaseNotFoundError, + DatabaseTablesUnexpectedError, DatabaseUpdateFailedError, InvalidParametersError, ) from superset.databases.commands.export import ExportDatabasesCommand from superset.databases.commands.importers.dispatcher import ImportDatabasesCommand +from superset.databases.commands.tables import TablesDatabaseCommand from superset.databases.commands.test_connection import TestConnectionDatabaseCommand from superset.databases.commands.update import UpdateDatabaseCommand from superset.databases.commands.validate import ValidateDatabaseParametersCommand @@ -58,10 +60,12 @@ from superset.databases.filters import DatabaseFilter, DatabaseUploadEnabledFilter from superset.databases.schemas import ( database_schemas_query_schema, + database_tables_query_schema, DatabaseFunctionNamesResponse, DatabasePostSchema, DatabasePutSchema, DatabaseRelatedObjectsResponse, + DatabaseTablesResponse, DatabaseTestConnectionSchema, DatabaseValidateParametersSchema, get_export_ids_schema, @@ -72,13 +76,22 @@ ValidateSQLRequest, ValidateSQLResponse, ) +from superset.databases.ssh_tunnel.commands.delete import DeleteSSHTunnelCommand +from superset.databases.ssh_tunnel.commands.exceptions import ( + SSHTunnelDeleteFailedError, + SSHTunnelingNotEnabledError, + SSHTunnelNotFoundError, +) from superset.databases.utils import get_table_metadata from superset.db_engine_specs import get_available_engine_specs from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from superset.exceptions import SupersetErrorsException, SupersetException from superset.extensions import security_manager from superset.models.core import Database from superset.superset_typing import FlaskResponse from superset.utils.core import error_msg_from_exception, parse_js_uri_path_item +from superset.utils.ssh_tunnel import mask_password_info +from superset.views.base import json_errors_response from superset.views.base_api import ( BaseSupersetModelRestApi, requires_form_data, @@ -95,6 +108,7 @@ class DatabaseRestApi(BaseSupersetModelRestApi): include_route_methods = RouteMethod.REST_MODEL_VIEW_CRUD_SET | { RouteMethod.EXPORT, RouteMethod.IMPORT, + "tables", "table_metadata", "table_extra_metadata", "select_star", @@ -105,6 +119,7 @@ class DatabaseRestApi(BaseSupersetModelRestApi): "available", "validate_parameters", "validate_sql", + "delete_ssh_tunnel", } resource_name = "database" class_permission_name = "Database" @@ -113,6 +128,7 @@ class DatabaseRestApi(BaseSupersetModelRestApi): base_filters = [["id", DatabaseFilter, lambda: []]] show_columns = [ "id", + "uuid", "database_name", "cache_timeout", "expose_in_sqllab", @@ -123,23 +139,23 @@ class DatabaseRestApi(BaseSupersetModelRestApi): "allow_cvas", "allow_dml", "backend", + "driver", "force_ctas_schema", - "allow_multi_schema_metadata_fetch", "impersonate_user", - "encrypted_extra", + "masked_encrypted_extra", "extra", "parameters", "parameters_schema", "server_cert", "sqlalchemy_uri", "is_managed_externally", + "engine_information", ] list_columns = [ "allow_file_upload", "allow_ctas", "allow_cvas", "allow_dml", - "allow_multi_schema_metadata_fetch", "allow_run_async", "allows_cost_estimate", "allows_subquery", @@ -155,7 +171,9 @@ class DatabaseRestApi(BaseSupersetModelRestApi): "extra", "force_ctas_schema", "id", + "uuid", "disable_data_preview", + "engine_information", ] add_columns = [ "database_name", @@ -170,7 +188,6 @@ class DatabaseRestApi(BaseSupersetModelRestApi): "configuration_method", "force_ctas_schema", "impersonate_user", - "allow_multi_schema_metadata_fetch", "extra", "encrypted_extra", "server_cert", @@ -198,6 +215,7 @@ class DatabaseRestApi(BaseSupersetModelRestApi): apispec_parameter_schemas = { "database_schemas_query_schema": database_schemas_query_schema, + "database_tables_query_schema": database_tables_query_schema, "get_export_ids_schema": get_export_ids_schema, } @@ -205,6 +223,7 @@ class DatabaseRestApi(BaseSupersetModelRestApi): openapi_spec_component_schemas = ( DatabaseFunctionNamesResponse, DatabaseRelatedObjectsResponse, + DatabaseTablesResponse, DatabaseTestConnectionSchema, DatabaseValidateParametersSchema, TableExtraMetadataResponseSchema, @@ -215,6 +234,47 @@ class DatabaseRestApi(BaseSupersetModelRestApi): ValidateSQLResponse, ) + @expose("/<int:pk>", methods=["GET"]) + @protect() + @safe + def get(self, pk: int, **kwargs: Any) -> Response: + """Get a database + --- + get: + description: >- + Get a database + parameters: + - in: path + schema: + type: integer + description: The database id + name: pk + responses: + 200: + description: Database + content: + application/json: + schema: + type: object + 400: + $ref: '#/components/responses/400' + 401: + $ref: '#/components/responses/401' + 422: + $ref: '#/components/responses/422' + 500: + $ref: '#/components/responses/500' + """ + data = self.get_headless(pk, **kwargs) + try: + if ssh_tunnel := DatabaseDAO.get_ssh_tunnel(pk): + payload = data.json + payload["result"]["ssh_tunnel"] = ssh_tunnel.data + return payload + return data + except SupersetException as ex: + return self.response(ex.status, message=ex.message) + @expose("/", methods=["POST"]) @protect() @safe @@ -224,7 +284,7 @@ class DatabaseRestApi(BaseSupersetModelRestApi): log_to_statsd=False, ) @requires_json - def post(self) -> Response: + def post(self) -> FlaskResponse: """Creates a new Database --- post: @@ -264,7 +324,7 @@ def post(self) -> Response: except ValidationError as error: return self.response_400(message=error.messages) try: - new_model = CreateDatabaseCommand(g.user, item).run() + new_model = CreateDatabaseCommand(item).run() # Return censored version for sqlalchemy URI item["sqlalchemy_uri"] = new_model.sqlalchemy_uri item["expose_in_sqllab"] = new_model.expose_in_sqllab @@ -273,11 +333,22 @@ def post(self) -> Response: if new_model.parameters: item["parameters"] = new_model.parameters + if new_model.driver: + item["driver"] = new_model.driver + + # Return SSH Tunnel and hide passwords if any + if item.get("ssh_tunnel"): + item["ssh_tunnel"] = mask_password_info( + new_model.ssh_tunnel # pylint: disable=no-member + ) + return self.response(201, id=new_model.id, result=item) except DatabaseInvalidError as ex: return self.response_422(message=ex.normalized_messages()) except DatabaseConnectionFailedError as ex: return self.response_422(message=str(ex)) + except SupersetErrorsException as ex: + return json_errors_response(errors=ex.errors, status=ex.status) except DatabaseCreateFailedError as ex: logger.error( "Error creating model %s: %s", @@ -286,6 +357,10 @@ def post(self) -> Response: exc_info=True, ) return self.response_422(message=str(ex)) + except SSHTunnelingNotEnabledError as ex: + return self.response_400(message=str(ex)) + except SupersetException as ex: + return self.response(ex.status, message=ex.message) @expose("/<int:pk>", methods=["PUT"]) @protect() @@ -345,11 +420,14 @@ def put(self, pk: int) -> Response: except ValidationError as error: return self.response_400(message=error.messages) try: - changed_model = UpdateDatabaseCommand(g.user, pk, item).run() + changed_model = UpdateDatabaseCommand(pk, item).run() # Return censored version for sqlalchemy URI item["sqlalchemy_uri"] = changed_model.sqlalchemy_uri if changed_model.parameters: item["parameters"] = changed_model.parameters + # Return SSH Tunnel and hide passwords if any + if item.get("ssh_tunnel"): + item["ssh_tunnel"] = mask_password_info(changed_model.ssh_tunnel) return self.response(200, id=changed_model.id, result=item) except DatabaseNotFoundError: return self.response_404() @@ -365,6 +443,8 @@ def put(self, pk: int) -> Response: exc_info=True, ) return self.response_422(message=str(ex)) + except SSHTunnelingNotEnabledError as ex: + return self.response_400(message=str(ex)) @expose("/<int:pk>", methods=["DELETE"]) @protect() @@ -407,7 +487,7 @@ def delete(self, pk: int) -> Response: $ref: '#/components/responses/500' """ try: - DeleteDatabaseCommand(g.user, pk).run() + DeleteDatabaseCommand(pk).run() return self.response(200, message="OK") except DatabaseNotFoundError: return self.response_404() @@ -479,6 +559,75 @@ def schemas(self, pk: int, **kwargs: Any) -> FlaskResponse: return self.response( 500, message="There was an error connecting to the database" ) + except SupersetException as ex: + return self.response(ex.status, message=ex.message) + + @expose("/<int:pk>/tables/") + @protect() + @safe + @rison(database_tables_query_schema) + @statsd_metrics + @event_logger.log_this_with_context( + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}" f".tables", + log_to_statsd=False, + ) + def tables(self, pk: int, **kwargs: Any) -> FlaskResponse: + """Get a list of tables for given database + --- + get: + summary: Get a list of tables for given database + parameters: + - in: path + schema: + type: integer + name: pk + description: The database id + - in: query + name: q + content: + application/json: + schema: + $ref: '#/components/schemas/database_tables_query_schema' + responses: + 200: + description: Tables list + content: + application/json: + schema: + type: object + properties: + count: + type: integer + result: + description: >- + A List of tables for given database + type: array + items: + $ref: '#/components/schemas/DatabaseTablesResponse' + 400: + $ref: '#/components/responses/400' + 401: + $ref: '#/components/responses/401' + 404: + $ref: '#/components/responses/404' + 422: + $ref: '#/components/responses/422' + 500: + $ref: '#/components/responses/500' + """ + force = kwargs["rison"].get("force", False) + schema_name = kwargs["rison"].get("schema_name", "") + + try: + command = TablesDatabaseCommand(pk, schema_name, force) + payload = command.run() + return self.response(200, **payload) + except DatabaseNotFoundError: + return self.response_404() + except SupersetException as ex: + return self.response(ex.status, message=ex.message) + except DatabaseTablesUnexpectedError as ex: + return self.response_422(ex.message) @expose("/<int:pk>/table/<table_name>/<schema_name>/", methods=["GET"]) @protect() @@ -537,6 +686,9 @@ def table_metadata( except SQLAlchemyError as ex: self.incr_stats("error", self.table_metadata.__name__) return self.response_422(error_msg_from_exception(ex)) + except SupersetException as ex: + return self.response(ex.status, message=ex.message) + self.incr_stats("success", self.table_metadata.__name__) return self.response(200, **table_info) @@ -597,7 +749,7 @@ def table_extra_metadata( self.incr_stats("init", self.table_metadata.__name__) parsed_schema = parse_js_uri_path_item(schema_name, eval_undefined=True) - table_name = parse_js_uri_path_item(table_name) # type: ignore + table_name = cast(str, parse_js_uri_path_item(table_name)) payload = database.db_engine_spec.extra_table_metadata( database, table_name, parsed_schema ) @@ -661,11 +813,11 @@ def select_star( ) except NoSuchTableError: self.incr_stats("error", self.select_star.__name__) - return self.response(404, message="Table not found on the database") + return self.response(404, message="Table not found in the database") self.incr_stats("success", self.select_star.__name__) return self.response(200, result=result) - @expose("/test_connection", methods=["POST"]) + @expose("/test_connection/", methods=["POST"]) @protect() @statsd_metrics @event_logger.log_this_with_context( @@ -709,8 +861,11 @@ def test_connection(self) -> FlaskResponse: # This validates custom Schema with custom validations except ValidationError as error: return self.response_400(message=error.messages) - TestConnectionDatabaseCommand(g.user, item).run() - return self.response(200, message="OK") + try: + TestConnectionDatabaseCommand(item).run() + return self.response(200, message="OK") + except SSHTunnelingNotEnabledError as ex: + return self.response_400(message=str(ex)) @expose("/<int:pk>/related_objects/", methods=["GET"]) @protect() @@ -781,7 +936,7 @@ def related_objects(self, pk: int) -> Response: }, ) - @expose("/<int:pk>/validate_sql", methods=["POST"]) + @expose("/<int:pk>/validate_sql/", methods=["POST"]) @protect() @statsd_metrics @event_logger.log_this_with_context( @@ -1070,6 +1225,16 @@ def available(self) -> Response: parameters: description: JSON schema defining the needed parameters type: object + engine_information: + description: Dict with public properties form the DB Engine + type: object + properties: + supports_file_upload: + description: Whether the engine supports file uploads + type: boolean + disable_ssh_tunneling: + description: Whether the engine supports SSH Tunnels + type: boolean 400: $ref: '#/components/responses/400' 500: @@ -1086,10 +1251,11 @@ def available(self) -> Response: "engine": engine_spec.engine, "available_drivers": sorted(drivers), "preferred": engine_spec.engine_name in preferred_databases, + "engine_information": engine_spec.get_public_information(), } - if hasattr(engine_spec, "default_driver"): - payload["default_driver"] = engine_spec.default_driver # type: ignore + if engine_spec.default_driver: + payload["default_driver"] = engine_spec.default_driver # show configuration parameters for DBs that support it if ( @@ -1126,7 +1292,7 @@ def available(self) -> Response: return self.response(200, databases=response) - @expose("/validate_parameters", methods=["POST"]) + @expose("/validate_parameters/", methods=["POST"]) @protect() @statsd_metrics @event_logger.log_this_with_context( @@ -1179,6 +1345,68 @@ def validate_parameters(self) -> FlaskResponse: ] raise InvalidParametersError(errors) from ex - command = ValidateDatabaseParametersCommand(g.user, payload) + command = ValidateDatabaseParametersCommand(payload) command.run() return self.response(200, message="OK") + + @expose("/<int:pk>/ssh_tunnel/", methods=["DELETE"]) + @protect() + @statsd_metrics + @event_logger.log_this_with_context( + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}" + f".delete_ssh_tunnel", + log_to_statsd=False, + ) + def delete_ssh_tunnel(self, pk: int) -> Response: + """Deletes a SSH Tunnel + --- + delete: + description: >- + Deletes a SSH Tunnel. + parameters: + - in: path + schema: + type: integer + name: pk + responses: + 200: + description: SSH Tunnel deleted + content: + application/json: + schema: + type: object + properties: + message: + type: string + 401: + $ref: '#/components/responses/401' + 403: + $ref: '#/components/responses/403' + 404: + $ref: '#/components/responses/404' + 422: + $ref: '#/components/responses/422' + 500: + $ref: '#/components/responses/500' + """ + try: + DeleteSSHTunnelCommand(pk).run() + return self.response(200, message="OK") + except SSHTunnelNotFoundError: + return self.response_404() + except SSHTunnelDeleteFailedError as ex: + logger.error( + "Error deleting SSH Tunnel %s: %s", + self.__class__.__name__, + str(ex), + exc_info=True, + ) + return self.response_422(message=str(ex)) + except SSHTunnelingNotEnabledError as ex: + logger.error( + "Error deleting SSH Tunnel %s: %s", + self.__class__.__name__, + str(ex), + exc_info=True, + ) + return self.response_400(message=str(ex)) diff --git a/superset/databases/commands/create.py b/superset/databases/commands/create.py index e91ccec45c59..0ed23549608d 100644 --- a/superset/databases/commands/create.py +++ b/superset/databases/commands/create.py @@ -18,9 +18,9 @@ from typing import Any, Dict, List, Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError +from superset import is_feature_enabled from superset.commands.base import BaseCommand from superset.dao.exceptions import DAOCreateFailedError from superset.databases.commands.exceptions import ( @@ -32,14 +32,20 @@ ) from superset.databases.commands.test_connection import TestConnectionDatabaseCommand from superset.databases.dao import DatabaseDAO +from superset.databases.ssh_tunnel.commands.create import CreateSSHTunnelCommand +from superset.databases.ssh_tunnel.commands.exceptions import ( + SSHTunnelCreateFailedError, + SSHTunnelingNotEnabledError, + SSHTunnelInvalidError, +) +from superset.exceptions import SupersetErrorsException from superset.extensions import db, event_logger, security_manager logger = logging.getLogger(__name__) class CreateDatabaseCommand(BaseCommand): - def __init__(self, user: User, data: Dict[str, Any]): - self._actor = user + def __init__(self, data: Dict[str, Any]): self._properties = data.copy() def run(self) -> Model: @@ -47,7 +53,14 @@ def run(self) -> Model: try: # Test connection before starting create transaction - TestConnectionDatabaseCommand(self._actor, self._properties).run() + TestConnectionDatabaseCommand(self._properties).run() + except (SupersetErrorsException, SSHTunnelingNotEnabledError) as ex: + event_logger.log_with_context( + action=f"db_creation_failed.{ex.__class__.__name__}", + engine=self._properties.get("sqlalchemy_uri", "").split(":")[0], + ) + # So we can show the original message + raise ex except Exception as ex: event_logger.log_with_context( action=f"db_creation_failed.{ex.__class__.__name__}", @@ -55,17 +68,48 @@ def run(self) -> Model: ) raise DatabaseConnectionFailedError() from ex + # when creating a new database we don't need to unmask encrypted extra + self._properties["encrypted_extra"] = self._properties.pop( + "masked_encrypted_extra", + "{}", + ) + try: database = DatabaseDAO.create(self._properties, commit=False) database.set_sqlalchemy_uri(database.sqlalchemy_uri) + ssh_tunnel = None + if ssh_tunnel_properties := self._properties.get("ssh_tunnel"): + if not is_feature_enabled("SSH_TUNNELING"): + db.session.rollback() + raise SSHTunnelingNotEnabledError() + try: + # So database.id is not None + db.session.flush() + ssh_tunnel = CreateSSHTunnelCommand( + database.id, ssh_tunnel_properties + ).run() + except (SSHTunnelInvalidError, SSHTunnelCreateFailedError) as ex: + event_logger.log_with_context( + action=f"db_creation_failed.{ex.__class__.__name__}", + engine=self._properties.get("sqlalchemy_uri", "").split(":")[0], + ) + # So we can show the original message + raise ex + except Exception as ex: + event_logger.log_with_context( + action=f"db_creation_failed.{ex.__class__.__name__}", + engine=self._properties.get("sqlalchemy_uri", "").split(":")[0], + ) + raise DatabaseCreateFailedError() from ex + # adding a new database we always want to force refresh schema list - schemas = database.get_all_schema_names(cache=False) + schemas = database.get_all_schema_names(cache=False, ssh_tunnel=ssh_tunnel) for schema in schemas: security_manager.add_permission_view_menu( "schema_access", security_manager.get_schema_perm(database, schema) ) - security_manager.add_permission_view_menu("database_access", database.perm) + db.session.commit() except DAOCreateFailedError as ex: db.session.rollback() diff --git a/superset/databases/commands/delete.py b/superset/databases/commands/delete.py index 61bd7ad0a575..ebdd543570a1 100644 --- a/superset/databases/commands/delete.py +++ b/superset/databases/commands/delete.py @@ -18,7 +18,6 @@ from typing import Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from flask_babel import lazy_gettext as _ from superset.commands.base import BaseCommand @@ -37,8 +36,7 @@ class DeleteDatabaseCommand(BaseCommand): - def __init__(self, user: User, model_id: int): - self._actor = user + def __init__(self, model_id: int): self._model_id = model_id self._model: Optional[Database] = None diff --git a/superset/databases/commands/exceptions.py b/superset/databases/commands/exceptions.py index a49abd3449d0..8161e1047db6 100644 --- a/superset/databases/commands/exceptions.py +++ b/superset/databases/commands/exceptions.py @@ -137,6 +137,11 @@ class DatabaseTestConnectionUnexpectedError(SupersetErrorsException): message = _("Unexpected error occurred, please check your logs for details") +class DatabaseTablesUnexpectedError(Exception): + status = 422 + message = _("Unexpected error occurred, please check your logs for details") + + class NoValidatorConfigFoundError(SupersetErrorException): status = 422 message = _("no SQL validator is configured") diff --git a/superset/databases/commands/export.py b/superset/databases/commands/export.py index 9e8cb7e37442..4d3bb7f99f25 100644 --- a/superset/databases/commands/export.py +++ b/superset/databases/commands/export.py @@ -21,13 +21,13 @@ from typing import Any, Dict, Iterator, Tuple import yaml -from werkzeug.utils import secure_filename from superset.databases.commands.exceptions import DatabaseNotFoundError from superset.databases.dao import DatabaseDAO from superset.commands.export.models import ExportModelsCommand from superset.models.core import Database from superset.utils.dict_import_export import EXPORT_VERSION +from superset.utils.file import get_filename logger = logging.getLogger(__name__) @@ -58,8 +58,8 @@ class ExportDatabasesCommand(ExportModelsCommand): def _export( model: Database, export_related: bool = True ) -> Iterator[Tuple[str, str]]: - database_slug = secure_filename(model.database_name) - file_name = f"databases/{database_slug}.yaml" + db_file_name = get_filename(model.database_name, model.id, skip_id=True) + file_path = f"databases/{db_file_name}.yaml" payload = model.export_to_dict( recursive=False, @@ -90,12 +90,14 @@ def _export( payload["version"] = EXPORT_VERSION file_content = yaml.safe_dump(payload, sort_keys=False) - yield file_name, file_content + yield file_path, file_content if export_related: for dataset in model.tables: - dataset_slug = secure_filename(dataset.table_name) - file_name = f"datasets/{database_slug}/{dataset_slug}.yaml" + ds_file_name = get_filename( + dataset.table_name, dataset.id, skip_id=True + ) + file_path = f"datasets/{db_file_name}/{ds_file_name}.yaml" payload = dataset.export_to_dict( recursive=True, @@ -107,4 +109,4 @@ def _export( payload["database_uuid"] = str(model.uuid) file_content = yaml.safe_dump(payload, sort_keys=False) - yield file_name, file_content + yield file_path, file_content diff --git a/superset/databases/commands/tables.py b/superset/databases/commands/tables.py new file mode 100644 index 000000000000..48e9227dea75 --- /dev/null +++ b/superset/databases/commands/tables.py @@ -0,0 +1,113 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import logging +from typing import Any, cast, Dict + +from superset.commands.base import BaseCommand +from superset.connectors.sqla.models import SqlaTable +from superset.databases.commands.exceptions import ( + DatabaseNotFoundError, + DatabaseTablesUnexpectedError, +) +from superset.databases.dao import DatabaseDAO +from superset.exceptions import SupersetException +from superset.extensions import db, security_manager +from superset.models.core import Database +from superset.utils.core import DatasourceName + +logger = logging.getLogger(__name__) + + +class TablesDatabaseCommand(BaseCommand): + _model: Database + + def __init__(self, db_id: int, schema_name: str, force: bool): + self._db_id = db_id + self._schema_name = schema_name + self._force = force + + def run(self) -> Dict[str, Any]: + self.validate() + try: + tables = security_manager.get_datasources_accessible_by_user( + database=self._model, + schema=self._schema_name, + datasource_names=sorted( + DatasourceName(*datasource_name) + for datasource_name in self._model.get_all_table_names_in_schema( + schema=self._schema_name, + force=self._force, + cache=self._model.table_cache_enabled, + cache_timeout=self._model.table_cache_timeout, + ) + ), + ) + + views = security_manager.get_datasources_accessible_by_user( + database=self._model, + schema=self._schema_name, + datasource_names=sorted( + DatasourceName(*datasource_name) + for datasource_name in self._model.get_all_view_names_in_schema( + schema=self._schema_name, + force=self._force, + cache=self._model.table_cache_enabled, + cache_timeout=self._model.table_cache_timeout, + ) + ), + ) + + extra_dict_by_name = { + table.name: table.extra_dict + for table in ( + db.session.query(SqlaTable).filter( + SqlaTable.database_id == self._model.id, + SqlaTable.schema == self._schema_name, + ) + ).all() + } + + options = sorted( + [ + { + "value": table.table, + "type": "table", + "extra": extra_dict_by_name.get(table.table, None), + } + for table in tables + ] + + [ + { + "value": view.table, + "type": "view", + } + for view in views + ], + key=lambda item: item["value"], + ) + + payload = {"count": len(tables) + len(views), "result": options} + return payload + except SupersetException as ex: + raise ex + except Exception as ex: + raise DatabaseTablesUnexpectedError(ex) from ex + + def validate(self) -> None: + self._model = cast(Database, DatabaseDAO.find_by_id(self._db_id)) + if not self._model: + raise DatabaseNotFoundError() diff --git a/superset/databases/commands/test_connection.py b/superset/databases/commands/test_connection.py index 2e217ab01a80..c5e7dc48f983 100644 --- a/superset/databases/commands/test_connection.py +++ b/superset/databases/commands/test_connection.py @@ -20,41 +20,61 @@ from typing import Any, Dict, Optional from flask import current_app as app -from flask_appbuilder.security.sqla.models import User from flask_babel import gettext as _ from func_timeout import func_timeout, FunctionTimedOut from sqlalchemy.engine import Engine from sqlalchemy.exc import DBAPIError, NoSuchModuleError +from superset import is_feature_enabled from superset.commands.base import BaseCommand from superset.databases.commands.exceptions import ( DatabaseSecurityUnsafeError, DatabaseTestConnectionDriverError, - DatabaseTestConnectionFailedError, DatabaseTestConnectionUnexpectedError, ) from superset.databases.dao import DatabaseDAO +from superset.databases.ssh_tunnel.commands.exceptions import ( + SSHTunnelingNotEnabledError, +) +from superset.databases.ssh_tunnel.dao import SSHTunnelDAO +from superset.databases.ssh_tunnel.models import SSHTunnel from superset.databases.utils import make_url_safe from superset.errors import ErrorLevel, SupersetErrorType -from superset.exceptions import SupersetSecurityException, SupersetTimeoutException +from superset.exceptions import ( + SupersetErrorsException, + SupersetSecurityException, + SupersetTimeoutException, +) from superset.extensions import event_logger from superset.models.core import Database -from superset.utils.core import override_user +from superset.utils.ssh_tunnel import unmask_password_info logger = logging.getLogger(__name__) +def get_log_connection_action( + action: str, ssh_tunnel: Optional[Any], exc: Optional[Exception] = None +) -> str: + action_modified = action + if exc: + action_modified += f".{exc.__class__.__name__}" + if ssh_tunnel: + action_modified += ".ssh_tunnel" + return action_modified + + class TestConnectionDatabaseCommand(BaseCommand): - def __init__(self, user: User, data: Dict[str, Any]): - self._actor = user + def __init__(self, data: Dict[str, Any]): self._properties = data.copy() self._model: Optional[Database] = None - def run(self) -> None: + def run(self) -> None: # pylint: disable=too-many-statements, too-many-branches self.validate() + ex_str = "" uri = self._properties.get("sqlalchemy_uri", "") if self._model and uri == self._model.safe_sqlalchemy_uri(): uri = self._model.sqlalchemy_uri_decrypted + ssh_tunnel = self._properties.get("ssh_tunnel") # context for error messages url = make_url_safe(uri) @@ -66,39 +86,60 @@ def run(self) -> None: "database": url.database, } + serialized_encrypted_extra = self._properties.get( + "masked_encrypted_extra", + "{}", + ) + if self._model: + serialized_encrypted_extra = ( + self._model.db_engine_spec.unmask_encrypted_extra( + self._model.encrypted_extra, + serialized_encrypted_extra, + ) + ) + try: database = DatabaseDAO.build_db_for_connection_test( server_cert=self._properties.get("server_cert", ""), extra=self._properties.get("extra", "{}"), impersonate_user=self._properties.get("impersonate_user", False), - encrypted_extra=self._properties.get("encrypted_extra", "{}"), + encrypted_extra=serialized_encrypted_extra, ) database.set_sqlalchemy_uri(uri) database.db_engine_spec.mutate_db_for_connection_test(database) - with override_user(self._actor): - engine = database.get_sqla_engine() - event_logger.log_with_context( - action="test_connection_attempt", - engine=database.db_engine_spec.__name__, - ) + # Generate tunnel if present in the properties + if ssh_tunnel: + if not is_feature_enabled("SSH_TUNNELING"): + raise SSHTunnelingNotEnabledError() + # If there's an existing tunnel for that DB we need to use the stored + # password, private_key and private_key_password instead + if ssh_tunnel_id := ssh_tunnel.pop("id", None): + if existing_ssh_tunnel := SSHTunnelDAO.find_by_id(ssh_tunnel_id): + ssh_tunnel = unmask_password_info( + ssh_tunnel, existing_ssh_tunnel + ) + ssh_tunnel = SSHTunnel(**ssh_tunnel) + + event_logger.log_with_context( + action=get_log_connection_action("test_connection_attempt", ssh_tunnel), + engine=database.db_engine_spec.__name__, + ) - def ping(engine: Engine) -> bool: - with closing(engine.raw_connection()) as conn: - return engine.dialect.do_ping(conn) + def ping(engine: Engine) -> bool: + with closing(engine.raw_connection()) as conn: + return engine.dialect.do_ping(conn) + with database.get_sqla_engine_with_context( + override_ssh_tunnel=ssh_tunnel + ) as engine: try: alive = func_timeout( - int( - app.config[ - "TEST_DATABASE_CONNECTION_TIMEOUT" - ].total_seconds() - ), + app.config["TEST_DATABASE_CONNECTION_TIMEOUT"].total_seconds(), ping, args=(engine,), ) - except (sqlite3.ProgrammingError, RuntimeError): # SQLite can't run on a separate thread, so ``func_timeout`` fails # RuntimeError catches the equivalent error from duckdb. @@ -114,20 +155,25 @@ def ping(engine: Engine) -> bool: level=ErrorLevel.ERROR, extra={"sqlalchemy_uri": database.sqlalchemy_uri}, ) from ex - except Exception: # pylint: disable=broad-except + except Exception as ex: # pylint: disable=broad-except alive = False - if not alive: - raise DBAPIError(None, None, None) + # So we stop losing the original message if any + ex_str = str(ex) + + if not alive: + raise DBAPIError(ex_str or None, None, None) # Log succesful connection test with engine event_logger.log_with_context( - action="test_connection_success", + action=get_log_connection_action("test_connection_success", ssh_tunnel), engine=database.db_engine_spec.__name__, ) except (NoSuchModuleError, ModuleNotFoundError) as ex: event_logger.log_with_context( - action=f"test_connection_error.{ex.__class__.__name__}", + action=get_log_connection_action( + "test_connection_error", ssh_tunnel, ex + ), engine=database.db_engine_spec.__name__, ) raise DatabaseTestConnectionDriverError( @@ -137,29 +183,46 @@ def ping(engine: Engine) -> bool: ) from ex except DBAPIError as ex: event_logger.log_with_context( - action=f"test_connection_error.{ex.__class__.__name__}", + action=get_log_connection_action( + "test_connection_error", ssh_tunnel, ex + ), engine=database.db_engine_spec.__name__, ) # check for custom errors (wrong username, wrong password, etc) errors = database.db_engine_spec.extract_errors(ex, context) - raise DatabaseTestConnectionFailedError(errors) from ex + raise SupersetErrorsException(errors) from ex except SupersetSecurityException as ex: event_logger.log_with_context( - action=f"test_connection_error.{ex.__class__.__name__}", + action=get_log_connection_action( + "test_connection_error", ssh_tunnel, ex + ), engine=database.db_engine_spec.__name__, ) raise DatabaseSecurityUnsafeError(message=str(ex)) from ex except SupersetTimeoutException as ex: event_logger.log_with_context( - action=f"test_connection_error.{ex.__class__.__name__}", + action=get_log_connection_action( + "test_connection_error", ssh_tunnel, ex + ), engine=database.db_engine_spec.__name__, ) # bubble up the exception to return a 408 raise ex + except SSHTunnelingNotEnabledError as ex: + event_logger.log_with_context( + action=get_log_connection_action( + "test_connection_error", ssh_tunnel, ex + ), + engine=database.db_engine_spec.__name__, + ) + # bubble up the exception to return a 400 + raise ex except Exception as ex: event_logger.log_with_context( - action=f"test_connection_error.{ex.__class__.__name__}", + action=get_log_connection_action( + "test_connection_error", ssh_tunnel, ex + ), engine=database.db_engine_spec.__name__, ) errors = database.db_engine_spec.extract_errors(ex, context) diff --git a/superset/databases/commands/update.py b/superset/databases/commands/update.py index 69b6c30e71c6..03531803553a 100644 --- a/superset/databases/commands/update.py +++ b/superset/databases/commands/update.py @@ -18,11 +18,11 @@ from typing import Any, Dict, List, Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError +from superset import is_feature_enabled from superset.commands.base import BaseCommand -from superset.dao.exceptions import DAOUpdateFailedError +from superset.dao.exceptions import DAOCreateFailedError, DAOUpdateFailedError from superset.databases.commands.exceptions import ( DatabaseConnectionFailedError, DatabaseExistsValidationError, @@ -31,25 +31,44 @@ DatabaseUpdateFailedError, ) from superset.databases.dao import DatabaseDAO +from superset.databases.ssh_tunnel.commands.create import CreateSSHTunnelCommand +from superset.databases.ssh_tunnel.commands.exceptions import ( + SSHTunnelCreateFailedError, + SSHTunnelingNotEnabledError, + SSHTunnelInvalidError, + SSHTunnelUpdateFailedError, +) +from superset.databases.ssh_tunnel.commands.update import UpdateSSHTunnelCommand from superset.extensions import db, security_manager from superset.models.core import Database +from superset.utils.core import DatasourceType logger = logging.getLogger(__name__) class UpdateDatabaseCommand(BaseCommand): - def __init__(self, user: User, model_id: int, data: Dict[str, Any]): - self._actor = user + def __init__(self, model_id: int, data: Dict[str, Any]): self._properties = data.copy() self._model_id = model_id self._model: Optional[Database] = None def run(self) -> Model: self.validate() + if not self._model: + raise DatabaseNotFoundError() + old_database_name = self._model.database_name + + # unmask ``encrypted_extra`` + self._properties[ + "encrypted_extra" + ] = self._model.db_engine_spec.unmask_encrypted_extra( + self._model.encrypted_extra, + self._properties.pop("masked_encrypted_extra", "{}"), + ) + try: database = DatabaseDAO.update(self._model, self._properties, commit=False) database.set_sqlalchemy_uri(database.sqlalchemy_uri) - security_manager.add_permission_view_menu("database_access", database.perm) # adding a new database we always want to force refresh schema list # TODO Improve this simplistic implementation for catching DB conn fails try: @@ -57,17 +76,93 @@ def run(self) -> Model: except Exception as ex: db.session.rollback() raise DatabaseConnectionFailedError() from ex + + # Update database schema permissions + new_schemas: List[str] = [] + for schema in schemas: + old_view_menu_name = security_manager.get_schema_perm( + old_database_name, schema + ) + new_view_menu_name = security_manager.get_schema_perm( + database.database_name, schema + ) + schema_pvm = security_manager.find_permission_view_menu( + "schema_access", old_view_menu_name + ) + # Update the schema permission if the database name changed + if schema_pvm and old_database_name != database.database_name: + schema_pvm.view_menu.name = new_view_menu_name + + self._propagate_schema_permissions( + old_view_menu_name, new_view_menu_name + ) + else: + new_schemas.append(schema) + for schema in new_schemas: security_manager.add_permission_view_menu( "schema_access", security_manager.get_schema_perm(database, schema) ) + + if ssh_tunnel_properties := self._properties.get("ssh_tunnel"): + if not is_feature_enabled("SSH_TUNNELING"): + db.session.rollback() + raise SSHTunnelingNotEnabledError() + existing_ssh_tunnel_model = DatabaseDAO.get_ssh_tunnel(database.id) + if existing_ssh_tunnel_model is None: + # We couldn't found an existing tunnel so we need to create one + try: + CreateSSHTunnelCommand(database.id, ssh_tunnel_properties).run() + except (SSHTunnelInvalidError, SSHTunnelCreateFailedError) as ex: + # So we can show the original message + raise ex + except Exception as ex: + raise DatabaseUpdateFailedError() from ex + else: + # We found an existing tunnel so we need to update it + try: + UpdateSSHTunnelCommand( + existing_ssh_tunnel_model.id, ssh_tunnel_properties + ).run() + except (SSHTunnelInvalidError, SSHTunnelUpdateFailedError) as ex: + # So we can show the original message + raise ex + except Exception as ex: + raise DatabaseUpdateFailedError() from ex + db.session.commit() - except DAOUpdateFailedError as ex: - logger.exception(ex.exception) + except (DAOUpdateFailedError, DAOCreateFailedError) as ex: raise DatabaseUpdateFailedError() from ex return database + @staticmethod + def _propagate_schema_permissions( + old_view_menu_name: str, new_view_menu_name: str + ) -> None: + from superset.connectors.sqla.models import ( # pylint: disable=import-outside-toplevel + SqlaTable, + ) + from superset.models.slice import ( # pylint: disable=import-outside-toplevel + Slice, + ) + + # Update schema_perm on all datasets + datasets = ( + db.session.query(SqlaTable) + .filter(SqlaTable.schema_perm == old_view_menu_name) + .all() + ) + for dataset in datasets: + dataset.schema_perm = new_view_menu_name + charts = db.session.query(Slice).filter( + Slice.datasource_type == DatasourceType.TABLE, + Slice.datasource_id == dataset.id, + ) + # Update schema_perm on all charts + for chart in charts: + chart.schema_perm = new_view_menu_name + def validate(self) -> None: exceptions: List[ValidationError] = [] # Validate/populate model exists diff --git a/superset/databases/commands/validate.py b/superset/databases/commands/validate.py index 145965fc641f..8c58ef5de0bf 100644 --- a/superset/databases/commands/validate.py +++ b/superset/databases/commands/validate.py @@ -18,7 +18,6 @@ from contextlib import closing from typing import Any, Dict, Optional -from flask_appbuilder.security.sqla.models import User from flask_babel import gettext as __ from superset.commands.base import BaseCommand @@ -30,43 +29,30 @@ ) from superset.databases.dao import DatabaseDAO from superset.databases.utils import make_url_safe -from superset.db_engine_specs import get_engine_specs -from superset.db_engine_specs.base import BasicParametersMixin +from superset.db_engine_specs import get_engine_spec from superset.errors import ErrorLevel, SupersetError, SupersetErrorType from superset.extensions import event_logger from superset.models.core import Database -from superset.utils.core import override_user BYPASS_VALIDATION_ENGINES = {"bigquery"} class ValidateDatabaseParametersCommand(BaseCommand): - def __init__(self, user: User, parameters: Dict[str, Any]): - self._actor = user - self._properties = parameters.copy() + def __init__(self, properties: Dict[str, Any]): + self._properties = properties.copy() self._model: Optional[Database] = None def run(self) -> None: + self.validate() + engine = self._properties["engine"] - engine_specs = get_engine_specs() + driver = self._properties.get("driver") if engine in BYPASS_VALIDATION_ENGINES: # Skip engines that are only validated onCreate return - if engine not in engine_specs: - raise InvalidEngineError( - SupersetError( - message=__( - 'Engine "%(engine)s" is not a valid engine.', - engine=engine, - ), - error_type=SupersetErrorType.GENERIC_DB_ENGINE_ERROR, - level=ErrorLevel.ERROR, - extra={"allowed": list(engine_specs), "provided": engine}, - ), - ) - engine_spec = engine_specs[engine] + engine_spec = get_engine_spec(engine, driver) if not hasattr(engine_spec, "parameters_schema"): raise InvalidEngineError( SupersetError( @@ -76,26 +62,24 @@ def run(self) -> None: ), error_type=SupersetErrorType.GENERIC_DB_ENGINE_ERROR, level=ErrorLevel.ERROR, - extra={ - "allowed": [ - name - for name, engine_spec in engine_specs.items() - if issubclass(engine_spec, BasicParametersMixin) - ], - "provided": engine, - }, ), ) # perform initial validation - errors = engine_spec.validate_parameters( # type: ignore - self._properties.get("parameters", {}) - ) + errors = engine_spec.validate_parameters(self._properties) # type: ignore if errors: event_logger.log_with_context(action="validation_error", engine=engine) raise InvalidParametersError(errors) - serialized_encrypted_extra = self._properties.get("encrypted_extra", "{}") + serialized_encrypted_extra = self._properties.get( + "masked_encrypted_extra", + "{}", + ) + if self._model: + serialized_encrypted_extra = engine_spec.unmask_encrypted_extra( + self._model.encrypted_extra, + serialized_encrypted_extra, + ) try: encrypted_extra = json.loads(serialized_encrypted_extra) except json.decoder.JSONDecodeError: @@ -117,8 +101,8 @@ def run(self) -> None: database.set_sqlalchemy_uri(sqlalchemy_uri) database.db_engine_spec.mutate_db_for_connection_test(database) - with override_user(self._actor): - engine = database.get_sqla_engine() + alive = False + with database.get_sqla_engine_with_context() as engine: try: with closing(engine.raw_connection()) as conn: alive = engine.dialect.do_ping(conn) @@ -144,6 +128,6 @@ def run(self) -> None: ) def validate(self) -> None: - database_name = self._properties.get("database_name") - if database_name is not None: - self._model = DatabaseDAO.get_database_by_name(database_name) + database_id = self._properties.get("id") + if database_id is not None: + self._model = DatabaseDAO.find_by_id(database_id) diff --git a/superset/databases/dao.py b/superset/databases/dao.py index 892ab86ed21d..c82f0db5745a 100644 --- a/superset/databases/dao.py +++ b/superset/databases/dao.py @@ -19,6 +19,7 @@ from superset.dao.base import BaseDAO from superset.databases.filters import DatabaseFilter +from superset.databases.ssh_tunnel.models import SSHTunnel from superset.extensions import db from superset.models.core import Database from superset.models.dashboard import Dashboard @@ -33,6 +34,30 @@ class DatabaseDAO(BaseDAO): model_cls = Database base_filter = DatabaseFilter + @classmethod + def update( + cls, + model: Database, + properties: Dict[str, Any], + commit: bool = True, + ) -> Database: + """ + Unmask ``encrypted_extra`` before updating. + + When a database is edited the user sees a masked version of ``encrypted_extra``, + depending on the engine spec. Eg, BigQuery will mask the ``private_key`` attribute + of the credentials. + + The masked values should be unmasked before the database is updated. + """ + if "encrypted_extra" in properties: + properties["encrypted_extra"] = model.db_engine_spec.unmask_encrypted_extra( + model.encrypted_extra, + properties["encrypted_extra"], + ) + + return super().update(model, properties, commit) + @staticmethod def validate_uniqueness(database_name: str) -> bool: database_query = db.session.query(Database).filter( @@ -100,3 +125,13 @@ def get_related_objects(cls, database_id: int) -> Dict[str, Any]: return dict( charts=charts, dashboards=dashboards, sqllab_tab_states=sqllab_tab_states ) + + @classmethod + def get_ssh_tunnel(cls, database_id: int) -> Optional[SSHTunnel]: + ssh_tunnel = ( + db.session.query(SSHTunnel) + .filter(SSHTunnel.database_id == database_id) + .one_or_none() + ) + + return ssh_tunnel diff --git a/superset/databases/decorators.py b/superset/databases/decorators.py index 2cea2f96f8eb..eb05ccbea781 100644 --- a/superset/databases/decorators.py +++ b/superset/databases/decorators.py @@ -21,6 +21,7 @@ from flask import g from flask_babel import lazy_gettext as _ +from superset.extensions import stats_logger_manager from superset.models.core import Database from superset.sql_parse import Table from superset.utils.core import parse_js_uri_path_item @@ -46,14 +47,14 @@ def wraps( return self.response_422(message=_("Table name undefined")) database: Database = self.datamodel.get(pk) if not database: - self.stats_logger.incr( + stats_logger_manager.instance.incr( f"database_not_found_{self.__class__.__name__}.select_star" ) return self.response_404() if not self.appbuilder.sm.can_access_table( database, Table(table_name_parsed, schema_name_parsed) ): - self.stats_logger.incr( + stats_logger_manager.instance.incr( f"permisssion_denied_{self.__class__.__name__}.select_star" ) logger.warning( diff --git a/superset/databases/schemas.py b/superset/databases/schemas.py index cdce5578cd7d..e318e4112143 100644 --- a/superset/databases/schemas.py +++ b/superset/databases/schemas.py @@ -14,9 +14,12 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. + +# pylint: disable=no-self-use, unused-argument + import inspect import json -from typing import Any, Dict, Optional, Type +from typing import Any, Dict from flask import current_app from flask_babel import lazy_gettext as _ @@ -26,11 +29,12 @@ from sqlalchemy import MetaData from superset import db +from superset.constants import PASSWORD_MASK from superset.databases.commands.exceptions import DatabaseInvalidError from superset.databases.utils import make_url_safe -from superset.db_engine_specs import BaseEngineSpec, get_engine_specs +from superset.db_engine_specs import get_engine_spec from superset.exceptions import CertificateException, SupersetSecurityException -from superset.models.core import ConfigurationMethod, Database, PASSWORD_MASK +from superset.models.core import ConfigurationMethod, Database from superset.security.analytics_db_safety import check_sqlalchemy_uri from superset.utils.core import markdown, parse_ssl_cert @@ -39,6 +43,15 @@ "properties": {"force": {"type": "boolean"}}, } +database_tables_query_schema = { + "type": "object", + "properties": { + "force": {"type": "boolean"}, + "schema_name": {"type": "string"}, + }, + "required": ["schema_name"], +} + database_name_description = "A database name to identify this connection." port_description = "Port number for the database connection." cache_timeout_description = ( @@ -48,7 +61,7 @@ ) expose_in_sqllab_description = "Expose this database to SQLLab" allow_run_async_description = ( - "Operate the database in asynchronous mode, meaning " + "Operate the database in asynchronous mode, meaning " "that the queries are executed on remote workers as opposed " "to on the web server itself. " "This assumes that you have a Celery worker setup as well " @@ -66,11 +79,6 @@ "(UPDATE, DELETE, CREATE, ...) " "in SQL Lab" ) -allow_multi_schema_metadata_fetch_description = ( - "Allow SQL Lab to fetch a list of all tables and all views across " - "all database schemas. For large data warehouse with thousands of " - "tables, this can be expensive and put strain on the system." -) # pylint: disable=invalid-name configuration_method_description = ( "Configuration_method is used on the frontend to " "inform the backend whether to explode parameters " @@ -150,7 +158,7 @@ def sqlalchemy_uri_validator(value: str) -> str: [ _( "Invalid connection string, a valid string usually follows: " - "driver://user:password@database-host/database-name" + "backend+driver://user:password@database-host/database-name" ) ] ) from ex @@ -231,6 +239,7 @@ class DatabaseParametersSchemaMixin: # pylint: disable=too-few-public-methods """ engine = fields.String(allow_none=True, description="SQLAlchemy engine to use") + driver = fields.String(allow_none=True, description="SQLAlchemy driver to use") parameters = fields.Dict( keys=fields.String(), values=fields.Raw(), @@ -243,7 +252,6 @@ class DatabaseParametersSchemaMixin: # pylint: disable=too-few-public-methods missing=ConfigurationMethod.SQLALCHEMY_FORM, ) - # pylint: disable=no-self-use, unused-argument @pre_load def build_sqlalchemy_uri( self, data: Dict[str, Any], **kwargs: Any @@ -262,10 +270,20 @@ def build_sqlalchemy_uri( or parameters.pop("engine", None) or data.pop("backend", None) ) + driver = data.pop("driver", None) configuration_method = data.get("configuration_method") if configuration_method == ConfigurationMethod.DYNAMIC_FORM: - engine_spec = get_engine_spec(engine) + if not engine: + raise ValidationError( + [ + _( + "An engine must be specified when passing " + "individual parameters to a database." + ) + ] + ) + engine_spec = get_engine_spec(engine, driver) if not hasattr(engine_spec, "build_sqlalchemy_uri") or not hasattr( engine_spec, "parameters_schema" @@ -282,52 +300,55 @@ def build_sqlalchemy_uri( # validate parameters parameters = engine_spec.parameters_schema.load(parameters) # type: ignore - serialized_encrypted_extra = data.get("encrypted_extra") or "{}" + serialized_encrypted_extra = data.get("masked_encrypted_extra") or "{}" try: encrypted_extra = json.loads(serialized_encrypted_extra) except json.decoder.JSONDecodeError: encrypted_extra = {} data["sqlalchemy_uri"] = engine_spec.build_sqlalchemy_uri( # type: ignore - parameters, encrypted_extra + parameters, + encrypted_extra, ) return data -def get_engine_spec(engine: Optional[str]) -> Type[BaseEngineSpec]: - if not engine: - raise ValidationError( - [ - _( - "An engine must be specified when passing " - "individual parameters to a database." - ) - ] - ) - engine_specs = get_engine_specs() - if engine not in engine_specs: - raise ValidationError( - [ - _( - 'Engine "%(engine)s" is not a valid engine.', - engine=engine, - ) - ] - ) - return engine_specs[engine] +def rename_encrypted_extra( + self: Schema, + data: Dict[str, Any], + **kwargs: Any, +) -> Dict[str, Any]: + """ + Rename ``encrypted_extra`` to ``masked_encrypted_extra``. + + PR #21248 changed the database schema for security reasons. This pre-loader keeps + Superset backwards compatible with older clients. + """ + if "encrypted_extra" in data: + data["masked_encrypted_extra"] = data.pop("encrypted_extra") + return data class DatabaseValidateParametersSchema(Schema): class Meta: # pylint: disable=too-few-public-methods unknown = EXCLUDE + rename_encrypted_extra = pre_load(rename_encrypted_extra) + + id = fields.Integer(allow_none=True, description="Database ID (for updates)") engine = fields.String(required=True, description="SQLAlchemy engine to use") + driver = fields.String(allow_none=True, description="SQLAlchemy driver to use") parameters = fields.Dict( keys=fields.String(), values=fields.Raw(allow_none=True), description="DB-specific parameters for configuration", ) + catalog = fields.Dict( + keys=fields.String(), + values=fields.Raw(allow_none=True), + description="Gsheets specific column for managing label to sheet urls", + ) database_name = fields.String( description=database_name_description, allow_none=True, @@ -335,7 +356,7 @@ class Meta: # pylint: disable=too-few-public-methods ) impersonate_user = fields.Boolean(description=impersonate_user_description) extra = fields.String(description=extra_description, validate=extra_validator) - encrypted_extra = fields.String( + masked_encrypted_extra = fields.String( description=encrypted_extra_description, validate=encrypted_extra_validator, allow_none=True, @@ -353,10 +374,26 @@ class Meta: # pylint: disable=too-few-public-methods ) +class DatabaseSSHTunnel(Schema): + id = fields.Integer(allow_none=True, description="SSH Tunnel ID (for updates)") + server_address = fields.String() + server_port = fields.Integer() + username = fields.String() + + # Basic Authentication + password = fields.String(required=False) + + # password protected private key authentication + private_key = fields.String(required=False) + private_key_password = fields.String(required=False) + + class DatabasePostSchema(Schema, DatabaseParametersSchemaMixin): class Meta: # pylint: disable=too-few-public-methods unknown = EXCLUDE + rename_encrypted_extra = pre_load(rename_encrypted_extra) + database_name = fields.String( description=database_name_description, required=True, @@ -376,11 +413,8 @@ class Meta: # pylint: disable=too-few-public-methods allow_none=True, validate=Length(0, 250), ) - allow_multi_schema_metadata_fetch = fields.Boolean( - description=allow_multi_schema_metadata_fetch_description, - ) impersonate_user = fields.Boolean(description=impersonate_user_description) - encrypted_extra = fields.String( + masked_encrypted_extra = fields.String( description=encrypted_extra_description, validate=encrypted_extra_validator, allow_none=True, @@ -397,12 +431,16 @@ class Meta: # pylint: disable=too-few-public-methods ) is_managed_externally = fields.Boolean(allow_none=True, default=False) external_url = fields.String(allow_none=True) + uuid = fields.String(required=False) + ssh_tunnel = fields.Nested(DatabaseSSHTunnel, allow_none=True) class DatabasePutSchema(Schema, DatabaseParametersSchemaMixin): class Meta: # pylint: disable=too-few-public-methods unknown = EXCLUDE + rename_encrypted_extra = pre_load(rename_encrypted_extra) + database_name = fields.String( description=database_name_description, allow_none=True, @@ -422,11 +460,8 @@ class Meta: # pylint: disable=too-few-public-methods allow_none=True, validate=Length(0, 250), ) - allow_multi_schema_metadata_fetch = fields.Boolean( - description=allow_multi_schema_metadata_fetch_description - ) impersonate_user = fields.Boolean(description=impersonate_user_description) - encrypted_extra = fields.String( + masked_encrypted_extra = fields.String( description=encrypted_extra_description, allow_none=True, validate=encrypted_extra_validator, @@ -443,9 +478,13 @@ class Meta: # pylint: disable=too-few-public-methods ) is_managed_externally = fields.Boolean(allow_none=True, default=False) external_url = fields.String(allow_none=True) + ssh_tunnel = fields.Nested(DatabaseSSHTunnel, allow_none=True) class DatabaseTestConnectionSchema(Schema, DatabaseParametersSchemaMixin): + + rename_encrypted_extra = pre_load(rename_encrypted_extra) + database_name = fields.String( description=database_name_description, allow_none=True, @@ -453,7 +492,7 @@ class DatabaseTestConnectionSchema(Schema, DatabaseParametersSchemaMixin): ) impersonate_user = fields.Boolean(description=impersonate_user_description) extra = fields.String(description=extra_description, validate=extra_validator) - encrypted_extra = fields.String( + masked_encrypted_extra = fields.String( description=encrypted_extra_description, validate=encrypted_extra_validator, allow_none=True, @@ -468,6 +507,8 @@ class DatabaseTestConnectionSchema(Schema, DatabaseParametersSchemaMixin): validate=[Length(1, 1024), sqlalchemy_uri_validator], ) + ssh_tunnel = fields.Nested(DatabaseSSHTunnel, allow_none=True) + class TableMetadataOptionsResponseSchema(Schema): deferrable = fields.Bool() @@ -541,6 +582,12 @@ class SchemasResponseSchema(Schema): result = fields.List(fields.String(description="A database schema name")) +class DatabaseTablesResponse(Schema): + extra = fields.Dict(description="Extra data used to specify column metadata") + type = fields.String(description="table or view") + value = fields.String(description="The table or view name") + + class ValidateSQLRequest(Schema): sql = fields.String(required=True, description="SQL statement to validate") schema = fields.String(required=False, allow_none=True) @@ -591,9 +638,8 @@ class DatabaseFunctionNamesResponse(Schema): class ImportV1DatabaseExtraSchema(Schema): - # pylint: disable=no-self-use, unused-argument @pre_load - def fix_schemas_allowed_for_csv_upload( + def fix_schemas_allowed_for_csv_upload( # pylint: disable=invalid-name self, data: Dict[str, Any], **kwargs: Any ) -> Dict[str, Any]: """ @@ -625,10 +671,10 @@ def fix_schemas_allowed_for_csv_upload( cost_estimate_enabled = fields.Boolean() allows_virtual_table_explore = fields.Boolean(required=False) cancel_query_on_windows_unload = fields.Boolean(required=False) + disable_data_preview = fields.Boolean(required=False) class ImportV1DatabaseSchema(Schema): - # pylint: disable=no-self-use, unused-argument @pre_load def fix_allow_csv_upload( self, data: Dict[str, Any], **kwargs: Any @@ -652,6 +698,7 @@ def fix_allow_csv_upload( allow_run_async = fields.Boolean() allow_ctas = fields.Boolean() allow_cvas = fields.Boolean() + allow_dml = fields.Boolean(required=False) allow_csv_upload = fields.Boolean() extra = fields.Nested(ImportV1DatabaseExtraSchema) uuid = fields.UUID(required=True) @@ -659,7 +706,6 @@ def fix_allow_csv_upload( is_managed_externally = fields.Boolean(allow_none=True, default=False) external_url = fields.String(allow_none=True) - # pylint: disable=no-self-use, unused-argument @validates_schema def validate_password(self, data: Dict[str, Any], **kwargs: Any) -> None: """If sqlalchemy_uri has a masked password, password is required""" diff --git a/superset/databases/ssh_tunnel/__init__.py b/superset/databases/ssh_tunnel/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/superset/databases/ssh_tunnel/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/superset/databases/ssh_tunnel/commands/__init__.py b/superset/databases/ssh_tunnel/commands/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/superset/databases/ssh_tunnel/commands/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/superset/databases/ssh_tunnel/commands/create.py b/superset/databases/ssh_tunnel/commands/create.py new file mode 100644 index 000000000000..9c17149ba3d0 --- /dev/null +++ b/superset/databases/ssh_tunnel/commands/create.py @@ -0,0 +1,92 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import logging +from typing import Any, Dict, List, Optional + +from flask_appbuilder.models.sqla import Model +from marshmallow import ValidationError + +from superset.commands.base import BaseCommand +from superset.dao.exceptions import DAOCreateFailedError +from superset.databases.ssh_tunnel.commands.exceptions import ( + SSHTunnelCreateFailedError, + SSHTunnelInvalidError, + SSHTunnelRequiredFieldValidationError, +) +from superset.databases.ssh_tunnel.dao import SSHTunnelDAO +from superset.extensions import db, event_logger + +logger = logging.getLogger(__name__) + + +class CreateSSHTunnelCommand(BaseCommand): + def __init__(self, database_id: int, data: Dict[str, Any]): + self._properties = data.copy() + self._properties["database_id"] = database_id + + def run(self) -> Model: + try: + # Start nested transaction since we are always creating the tunnel + # through a DB command (Create or Update). Without this, we cannot + # safely rollback changes to databases if any, i.e, things like + # test_do_not_create_database_if_ssh_tunnel_creation_fails test will fail + db.session.begin_nested() + self.validate() + tunnel = SSHTunnelDAO.create(self._properties, commit=False) + except DAOCreateFailedError as ex: + # Rollback nested transaction + db.session.rollback() + raise SSHTunnelCreateFailedError() from ex + except SSHTunnelInvalidError as ex: + # Rollback nested transaction + db.session.rollback() + raise ex + + return tunnel + + def validate(self) -> None: + # TODO(hughhh): check to make sure the server port is not localhost + # using the config.SSH_TUNNEL_MANAGER + exceptions: List[ValidationError] = [] + database_id: Optional[int] = self._properties.get("database_id") + server_address: Optional[str] = self._properties.get("server_address") + server_port: Optional[int] = self._properties.get("server_port") + username: Optional[str] = self._properties.get("username") + private_key: Optional[str] = self._properties.get("private_key") + private_key_password: Optional[str] = self._properties.get( + "private_key_password" + ) + if not database_id: + exceptions.append(SSHTunnelRequiredFieldValidationError("database_id")) + if not server_address: + exceptions.append(SSHTunnelRequiredFieldValidationError("server_address")) + if not server_port: + exceptions.append(SSHTunnelRequiredFieldValidationError("server_port")) + if not username: + exceptions.append(SSHTunnelRequiredFieldValidationError("username")) + if private_key_password and private_key is None: + exceptions.append(SSHTunnelRequiredFieldValidationError("private_key")) + if exceptions: + exception = SSHTunnelInvalidError() + exception.add_list(exceptions) + event_logger.log_with_context( + action="ssh_tunnel_creation_failed.{}.{}".format( + exception.__class__.__name__, + ".".join(exception.get_list_classnames()), + ) + ) + raise exception diff --git a/superset/databases/ssh_tunnel/commands/delete.py b/superset/databases/ssh_tunnel/commands/delete.py new file mode 100644 index 000000000000..235ceb697bed --- /dev/null +++ b/superset/databases/ssh_tunnel/commands/delete.py @@ -0,0 +1,55 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import logging +from typing import Optional + +from flask_appbuilder.models.sqla import Model + +from superset import is_feature_enabled +from superset.commands.base import BaseCommand +from superset.dao.exceptions import DAODeleteFailedError +from superset.databases.ssh_tunnel.commands.exceptions import ( + SSHTunnelDeleteFailedError, + SSHTunnelingNotEnabledError, + SSHTunnelNotFoundError, +) +from superset.databases.ssh_tunnel.dao import SSHTunnelDAO +from superset.databases.ssh_tunnel.models import SSHTunnel + +logger = logging.getLogger(__name__) + + +class DeleteSSHTunnelCommand(BaseCommand): + def __init__(self, model_id: int): + self._model_id = model_id + self._model: Optional[SSHTunnel] = None + + def run(self) -> Model: + if not is_feature_enabled("SSH_TUNNELING"): + raise SSHTunnelingNotEnabledError() + self.validate() + try: + ssh_tunnel = SSHTunnelDAO.delete(self._model) + except DAODeleteFailedError as ex: + raise SSHTunnelDeleteFailedError() from ex + return ssh_tunnel + + def validate(self) -> None: + # Validate/populate model exists + self._model = SSHTunnelDAO.find_by_id(self._model_id) + if not self._model: + raise SSHTunnelNotFoundError() diff --git a/superset/databases/ssh_tunnel/commands/exceptions.py b/superset/databases/ssh_tunnel/commands/exceptions.py new file mode 100644 index 000000000000..2495961c369a --- /dev/null +++ b/superset/databases/ssh_tunnel/commands/exceptions.py @@ -0,0 +1,59 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from flask_babel import lazy_gettext as _ +from marshmallow import ValidationError + +from superset.commands.exceptions import ( + CommandException, + CommandInvalidError, + DeleteFailedError, + UpdateFailedError, +) + + +class SSHTunnelDeleteFailedError(DeleteFailedError): + message = _("SSH Tunnel could not be deleted.") + + +class SSHTunnelNotFoundError(CommandException): + status = 404 + message = _("SSH Tunnel not found.") + + +class SSHTunnelInvalidError(CommandInvalidError): + message = _("SSH Tunnel parameters are invalid.") + + +class SSHTunnelUpdateFailedError(UpdateFailedError): + message = _("SSH Tunnel could not be updated.") + + +class SSHTunnelCreateFailedError(CommandException): + message = _("Creating SSH Tunnel failed for an unknown reason") + + +class SSHTunnelingNotEnabledError(CommandException): + status = 400 + message = _("SSH Tunneling is not enabled") + + +class SSHTunnelRequiredFieldValidationError(ValidationError): + def __init__(self, field_name: str) -> None: + super().__init__( + [_("Field is required")], + field_name=field_name, + ) diff --git a/superset/databases/ssh_tunnel/commands/update.py b/superset/databases/ssh_tunnel/commands/update.py new file mode 100644 index 000000000000..2ac785670540 --- /dev/null +++ b/superset/databases/ssh_tunnel/commands/update.py @@ -0,0 +1,63 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import logging +from typing import Any, Dict, Optional + +from flask_appbuilder.models.sqla import Model + +from superset.commands.base import BaseCommand +from superset.dao.exceptions import DAOUpdateFailedError +from superset.databases.ssh_tunnel.commands.exceptions import ( + SSHTunnelInvalidError, + SSHTunnelNotFoundError, + SSHTunnelRequiredFieldValidationError, + SSHTunnelUpdateFailedError, +) +from superset.databases.ssh_tunnel.dao import SSHTunnelDAO +from superset.databases.ssh_tunnel.models import SSHTunnel + +logger = logging.getLogger(__name__) + + +class UpdateSSHTunnelCommand(BaseCommand): + def __init__(self, model_id: int, data: Dict[str, Any]): + self._properties = data.copy() + self._model_id = model_id + self._model: Optional[SSHTunnel] = None + + def run(self) -> Model: + self.validate() + try: + if self._model is not None: # So we dont get incompatible types error + tunnel = SSHTunnelDAO.update(self._model, self._properties) + except DAOUpdateFailedError as ex: + raise SSHTunnelUpdateFailedError() from ex + return tunnel + + def validate(self) -> None: + # Validate/populate model exists + self._model = SSHTunnelDAO.find_by_id(self._model_id) + if not self._model: + raise SSHTunnelNotFoundError() + private_key: Optional[str] = self._properties.get("private_key") + private_key_password: Optional[str] = self._properties.get( + "private_key_password" + ) + if private_key_password and private_key is None: + exception = SSHTunnelInvalidError() + exception.add(SSHTunnelRequiredFieldValidationError("private_key")) + raise exception diff --git a/superset/databases/ssh_tunnel/dao.py b/superset/databases/ssh_tunnel/dao.py new file mode 100644 index 000000000000..89562fc05dcc --- /dev/null +++ b/superset/databases/ssh_tunnel/dao.py @@ -0,0 +1,49 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import logging +from typing import Any, Dict + +from superset.dao.base import BaseDAO +from superset.databases.ssh_tunnel.models import SSHTunnel +from superset.utils.ssh_tunnel import unmask_password_info + +logger = logging.getLogger(__name__) + + +class SSHTunnelDAO(BaseDAO): + model_cls = SSHTunnel + + @classmethod + def update( + cls, + model: SSHTunnel, + properties: Dict[str, Any], + commit: bool = True, + ) -> SSHTunnel: + """ + Unmask ``password``, ``private_key`` and ``private_key_password`` before updating. + + When a database is edited the user sees a masked version of + the aforementioned fields. + + The masked values should be unmasked before the ssh tunnel is updated. + """ + # ID cannot be updated so we remove it if present in the payload + properties.pop("id", None) + properties = unmask_password_info(properties, model) + + return super().update(model, properties, commit) diff --git a/superset/databases/ssh_tunnel/models.py b/superset/databases/ssh_tunnel/models.py new file mode 100644 index 000000000000..727b6ea467c6 --- /dev/null +++ b/superset/databases/ssh_tunnel/models.py @@ -0,0 +1,85 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import Any, Dict + +import sqlalchemy as sa +from flask import current_app +from flask_appbuilder import Model +from sqlalchemy.orm import backref, relationship +from sqlalchemy_utils import EncryptedType + +from superset.constants import PASSWORD_MASK +from superset.models.core import Database +from superset.models.helpers import ( + AuditMixinNullable, + ExtraJSONMixin, + ImportExportMixin, +) + +app_config = current_app.config + + +class SSHTunnel(Model, AuditMixinNullable, ExtraJSONMixin, ImportExportMixin): + """ + A ssh tunnel configuration in a database. + """ + + __tablename__ = "ssh_tunnels" + + id = sa.Column(sa.Integer, primary_key=True) + database_id = sa.Column( + sa.Integer, sa.ForeignKey("dbs.id"), nullable=False, unique=True + ) + database: Database = relationship( + "Database", + backref=backref("ssh_tunnels", uselist=False, cascade="all, delete-orphan"), + foreign_keys=[database_id], + ) + + server_address = sa.Column(sa.Text) + server_port = sa.Column(sa.Integer) + username = sa.Column(EncryptedType(sa.String, app_config["SECRET_KEY"])) + + # basic authentication + password = sa.Column( + EncryptedType(sa.String, app_config["SECRET_KEY"]), nullable=True + ) + + # password protected pkey authentication + private_key = sa.Column( + EncryptedType(sa.String, app_config["SECRET_KEY"]), nullable=True + ) + private_key_password = sa.Column( + EncryptedType(sa.String, app_config["SECRET_KEY"]), nullable=True + ) + + @property + def data(self) -> Dict[str, Any]: + output = { + "id": self.id, + "server_address": self.server_address, + "server_port": self.server_port, + "username": self.username, + } + if self.password is not None: + output["password"] = PASSWORD_MASK + if self.private_key is not None: + output["private_key"] = PASSWORD_MASK + if self.private_key_password is not None: + output["private_key_password"] = PASSWORD_MASK + return output diff --git a/superset/datasets/api.py b/superset/datasets/api.py index c582788ebcfa..b76602987243 100644 --- a/superset/datasets/api.py +++ b/superset/datasets/api.py @@ -21,9 +21,8 @@ from typing import Any from zipfile import is_zipfile, ZipFile -import simplejson import yaml -from flask import g, make_response, request, Response, send_file +from flask import request, Response, send_file from flask_appbuilder.api import expose, protect, rison, safe from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_babel import ngettext @@ -38,6 +37,7 @@ from superset.datasets.commands.bulk_delete import BulkDeleteDatasetCommand from superset.datasets.commands.create import CreateDatasetCommand from superset.datasets.commands.delete import DeleteDatasetCommand +from superset.datasets.commands.duplicate import DuplicateDatasetCommand from superset.datasets.commands.exceptions import ( DatasetBulkDeleteFailedError, DatasetCreateFailedError, @@ -46,24 +46,24 @@ DatasetInvalidError, DatasetNotFoundError, DatasetRefreshFailedError, - DatasetSamplesFailedError, DatasetUpdateFailedError, ) from superset.datasets.commands.export import ExportDatasetsCommand from superset.datasets.commands.importers.dispatcher import ImportDatasetsCommand from superset.datasets.commands.refresh import RefreshDatasetCommand -from superset.datasets.commands.samples import SamplesDatasetCommand from superset.datasets.commands.update import UpdateDatasetCommand from superset.datasets.dao import DatasetDAO from superset.datasets.filters import DatasetCertifiedFilter, DatasetIsNullOrEmptyFilter from superset.datasets.schemas import ( + DatasetDuplicateSchema, DatasetPostSchema, DatasetPutSchema, DatasetRelatedObjectsResponse, get_delete_ids_schema, get_export_ids_schema, + GetOrCreateDatasetSchema, ) -from superset.utils.core import json_int_dttm_ser, parse_boolean_string +from superset.utils.core import parse_boolean_string from superset.views.base import DatasourceFilter, generate_download_headers from superset.views.base_api import ( BaseSupersetModelRestApi, @@ -72,7 +72,7 @@ requires_json, statsd_metrics, ) -from superset.views.filters import FilterRelatedOwners +from superset.views.filters import BaseFilterRelatedUsers, FilterRelatedOwners logger = logging.getLogger(__name__) @@ -93,7 +93,8 @@ class DatasetRestApi(BaseSupersetModelRestApi): "bulk_delete", "refresh", "related_objects", - "samples", + "duplicate", + "get_or_create_dataset", } list_columns = [ "id", @@ -143,10 +144,12 @@ class DatasetRestApi(BaseSupersetModelRestApi): "cache_timeout", "is_sqllab_view", "template_params", + "select_star", "owners.id", "owners.username", "owners.first_name", "owners.last_name", + "columns.advanced_data_type", "columns.changed_on", "columns.column_name", "columns.created_on", @@ -162,11 +165,30 @@ class DatasetRestApi(BaseSupersetModelRestApi): "columns.type", "columns.uuid", "columns.verbose_name", - "metrics", + "metrics", # TODO(john-bodley): Deprecate in 3.0. + "metrics.changed_on", + "metrics.created_on", + "metrics.d3format", + "metrics.description", + "metrics.expression", + "metrics.extra", + "metrics.id", + "metrics.metric_name", + "metrics.metric_type", + "metrics.verbose_name", + "metrics.warning_text", "datasource_type", "url", "extra", "kind", + "created_on", + "created_on_humanized", + "created_by.first_name", + "created_by.last_name", + "changed_on", + "changed_on_humanized", + "changed_by.first_name", + "changed_by.last_name", ] show_columns = show_select_columns + [ "columns.type_generic", @@ -176,7 +198,8 @@ class DatasetRestApi(BaseSupersetModelRestApi): ] add_model_schema = DatasetPostSchema() edit_model_schema = DatasetPutSchema() - add_columns = ["database", "schema", "table_name", "owners"] + duplicate_model_schema = DatasetDuplicateSchema() + add_columns = ["database", "schema", "table_name", "sql", "owners"] edit_columns = [ "table_name", "sql", @@ -196,6 +219,11 @@ class DatasetRestApi(BaseSupersetModelRestApi): "extra", ] openapi_spec_tag = "Datasets" + + base_related_field_filters = { + "owners": [["id", BaseFilterRelatedUsers, lambda: []]], + "database": [["id", DatabaseFilter, lambda: []]], + } related_field_filters = { "owners": RelatedFieldFilter("first_name", FilterRelatedOwners), "database": "database_name", @@ -212,7 +240,14 @@ class DatasetRestApi(BaseSupersetModelRestApi): apispec_parameter_schemas = { "get_export_ids_schema": get_export_ids_schema, } - openapi_spec_component_schemas = (DatasetRelatedObjectsResponse,) + openapi_spec_component_schemas = ( + DatasetRelatedObjectsResponse, + DatasetDuplicateSchema, + GetOrCreateDatasetSchema, + ) + + list_outer_default_load = True + show_outer_default_load = True @expose("/", methods=["POST"]) @protect() @@ -264,7 +299,7 @@ def post(self) -> Response: return self.response_400(message=error.messages) try: - new_model = CreateDatasetCommand(g.user, item).run() + new_model = CreateDatasetCommand(item).run() return self.response(201, id=new_model.id, result=item) except DatasetInvalidError as ex: return self.response_422(message=ex.normalized_messages()) @@ -344,11 +379,9 @@ def put(self, pk: int) -> Response: except ValidationError as error: return self.response_400(message=error.messages) try: - changed_model = UpdateDatasetCommand( - g.user, pk, item, override_columns - ).run() + changed_model = UpdateDatasetCommand(pk, item, override_columns).run() if override_columns: - RefreshDatasetCommand(g.user, pk).run() + RefreshDatasetCommand(pk).run() response = self.response(200, id=changed_model.id, result=item) except DatasetNotFoundError: response = self.response_404() @@ -407,7 +440,7 @@ def delete(self, pk: int) -> Response: $ref: '#/components/responses/500' """ try: - DeleteDatasetCommand(g.user, pk).run() + DeleteDatasetCommand(pk).run() return self.response(200, message="OK") except DatasetNotFoundError: return self.response_404() @@ -506,6 +539,77 @@ def export(self, **kwargs: Any) -> Response: mimetype="application/text", ) + @expose("/duplicate", methods=["POST"]) + @protect() + @safe + @statsd_metrics + @event_logger.log_this_with_context( + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}" f".duplicate", + log_to_statsd=False, + ) + @requires_json + def duplicate(self) -> Response: + """Duplicates a Dataset + --- + post: + description: >- + Duplicates a Dataset + requestBody: + description: Dataset schema + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/DatasetDuplicateSchema' + responses: + 201: + description: Dataset duplicated + content: + application/json: + schema: + type: object + properties: + id: + type: number + result: + $ref: '#/components/schemas/DatasetDuplicateSchema' + 400: + $ref: '#/components/responses/400' + 401: + $ref: '#/components/responses/401' + 403: + $ref: '#/components/responses/403' + 404: + $ref: '#/components/responses/404' + 422: + $ref: '#/components/responses/422' + 500: + $ref: '#/components/responses/500' + """ + try: + item = self.duplicate_model_schema.load(request.json) + # This validates custom Schema with custom validations + except ValidationError as error: + return self.response_400(message=error.messages) + + try: + new_model = DuplicateDatasetCommand(item).run() + return self.response(201, id=new_model.id, result=item) + except DatasetInvalidError as ex: + return self.response_422( + message=ex.normalized_messages() + if isinstance(ex, ValidationError) + else str(ex) + ) + except DatasetCreateFailedError as ex: + logger.error( + "Error creating model %s: %s", + self.__class__.__name__, + str(ex), + exc_info=True, + ) + return self.response_422(message=str(ex)) + @expose("/<pk>/refresh", methods=["PUT"]) @protect() @safe @@ -547,7 +651,7 @@ def refresh(self, pk: int) -> Response: $ref: '#/components/responses/500' """ try: - RefreshDatasetCommand(g.user, pk).run() + RefreshDatasetCommand(pk).run() return self.response(200, message="OK") except DatasetNotFoundError: return self.response_404() @@ -671,7 +775,7 @@ def bulk_delete(self, **kwargs: Any) -> Response: """ item_ids = kwargs["rison"] try: - BulkDeleteDatasetCommand(g.user, item_ids).run() + BulkDeleteDatasetCommand(item_ids).run() return self.response( 200, message=ngettext( @@ -778,64 +882,69 @@ def import_(self) -> Response: command.run() return self.response(200, message="OK") - @expose("/<pk>/samples") + @expose("/get_or_create/", methods=["POST"]) @protect() @safe @statsd_metrics @event_logger.log_this_with_context( - action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.samples", + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}" + f".get_or_create_dataset", log_to_statsd=False, ) - def samples(self, pk: int) -> Response: - """get samples from a Dataset + def get_or_create_dataset(self) -> Response: + """Retrieve a dataset by name, or create it if it does not exist --- - get: - description: >- - get samples from a Dataset - parameters: - - in: path - schema: - type: integer - name: pk - - in: query - schema: - type: boolean - name: force + post: + summary: Retrieve a table by name, or create it if it does not exist + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/GetOrCreateDatasetSchema' responses: 200: - description: Dataset samples + description: The ID of the table content: application/json: schema: type: object properties: result: - $ref: '#/components/schemas/ChartDataResponseResult' + type: object + properties: + table_id: + type: integer + 400: + $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' - 403: - $ref: '#/components/responses/403' - 404: - $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' """ try: - force = parse_boolean_string(request.args.get("force")) - rv = SamplesDatasetCommand(g.user, pk, force).run() - response_data = simplejson.dumps( - {"result": rv}, - default=json_int_dttm_ser, - ignore_nan=True, + body = GetOrCreateDatasetSchema().load(request.json) + except ValidationError as ex: + return self.response(400, message=ex.messages) + table_name = body["table_name"] + database_id = body["database_id"] + table = DatasetDAO.get_table_by_name(database_id, table_name) + if table: + return self.response(200, result={"table_id": table.id}) + + body["database"] = database_id + try: + tbl = CreateDatasetCommand(body).run() + return self.response(200, result={"table_id": tbl.id}) + except DatasetInvalidError as ex: + return self.response_422(message=ex.normalized_messages()) + except DatasetCreateFailedError as ex: + logger.error( + "Error creating model %s: %s", + self.__class__.__name__, + str(ex), + exc_info=True, ) - resp = make_response(response_data, 200) - resp.headers["Content-Type"] = "application/json; charset=utf-8" - return resp - except DatasetNotFoundError: - return self.response_404() - except DatasetForbiddenError: - return self.response_403() - except DatasetSamplesFailedError as ex: - return self.response_400(message=str(ex)) + return self.response_422(message=ex.message) diff --git a/superset/datasets/columns/api.py b/superset/datasets/columns/api.py index d04827d42f7e..cd260a423bd7 100644 --- a/superset/datasets/columns/api.py +++ b/superset/datasets/columns/api.py @@ -16,7 +16,7 @@ # under the License. import logging -from flask import g, Response +from flask import Response from flask_appbuilder.api import expose, permission_name, protect, safe from flask_appbuilder.models.sqla.interface import SQLAInterface @@ -91,7 +91,7 @@ def delete( # pylint: disable=arguments-differ $ref: '#/components/responses/500' """ try: - DeleteDatasetColumnCommand(g.user, pk, column_id).run() + DeleteDatasetColumnCommand(pk, column_id).run() return self.response(200, message="OK") except DatasetColumnNotFoundError: return self.response_404() diff --git a/superset/datasets/columns/commands/delete.py b/superset/datasets/columns/commands/delete.py index f5914af5277f..8fb27f938648 100644 --- a/superset/datasets/columns/commands/delete.py +++ b/superset/datasets/columns/commands/delete.py @@ -18,8 +18,8 @@ from typing import Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User +from superset import security_manager from superset.commands.base import BaseCommand from superset.connectors.sqla.models import TableColumn from superset.dao.exceptions import DAODeleteFailedError @@ -30,14 +30,12 @@ ) from superset.datasets.dao import DatasetDAO from superset.exceptions import SupersetSecurityException -from superset.views.base import check_ownership logger = logging.getLogger(__name__) class DeleteDatasetColumnCommand(BaseCommand): - def __init__(self, user: User, dataset_id: int, model_id: int): - self._actor = user + def __init__(self, dataset_id: int, model_id: int): self._dataset_id = dataset_id self._model_id = model_id self._model: Optional[TableColumn] = None @@ -60,6 +58,6 @@ def validate(self) -> None: raise DatasetColumnNotFoundError() # Check ownership try: - check_ownership(self._model) + security_manager.raise_for_ownership(self._model) except SupersetSecurityException as ex: raise DatasetColumnForbiddenError() from ex diff --git a/superset/datasets/commands/bulk_delete.py b/superset/datasets/commands/bulk_delete.py index 13608eda810c..643ac784ec3b 100644 --- a/superset/datasets/commands/bulk_delete.py +++ b/superset/datasets/commands/bulk_delete.py @@ -17,8 +17,7 @@ import logging from typing import List, Optional -from flask_appbuilder.security.sqla.models import User - +from superset import security_manager from superset.commands.base import BaseCommand from superset.commands.exceptions import DeleteFailedError from superset.connectors.sqla.models import SqlaTable @@ -29,15 +28,13 @@ ) from superset.datasets.dao import DatasetDAO from superset.exceptions import SupersetSecurityException -from superset.extensions import db, security_manager -from superset.views.base import check_ownership +from superset.extensions import db logger = logging.getLogger(__name__) class BulkDeleteDatasetCommand(BaseCommand): - def __init__(self, user: User, model_ids: List[int]): - self._actor = user + def __init__(self, model_ids: List[int]): self._model_ids = model_ids self._models: Optional[List[SqlaTable]] = None @@ -84,6 +81,6 @@ def validate(self) -> None: # Check ownership for model in self._models: try: - check_ownership(model) + security_manager.raise_for_ownership(model) except SupersetSecurityException as ex: raise DatasetForbiddenError() from ex diff --git a/superset/datasets/commands/create.py b/superset/datasets/commands/create.py index 4a89b1a81839..809eec7a1159 100644 --- a/superset/datasets/commands/create.py +++ b/superset/datasets/commands/create.py @@ -18,7 +18,6 @@ from typing import Any, Dict, List, Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError from sqlalchemy.exc import SQLAlchemyError @@ -32,14 +31,13 @@ TableNotFoundValidationError, ) from superset.datasets.dao import DatasetDAO -from superset.extensions import db, security_manager +from superset.extensions import db logger = logging.getLogger(__name__) class CreateDatasetCommand(CreateMixin, BaseCommand): - def __init__(self, user: User, data: Dict[str, Any]): - self._actor = user + def __init__(self, data: Dict[str, Any]): self._properties = data.copy() def run(self) -> Model: @@ -49,15 +47,6 @@ def run(self) -> Model: dataset = DatasetDAO.create(self._properties, commit=False) # Updates columns and metrics from the dataset dataset.fetch_metadata(commit=False) - # Add datasource access permission - security_manager.add_permission_view_menu( - "datasource_access", dataset.get_perm() - ) - # Add schema access permission if exists - if dataset.schema: - security_manager.add_permission_view_menu( - "schema_access", dataset.schema_perm - ) db.session.commit() except (SQLAlchemyError, DAOCreateFailedError) as ex: logger.warning(ex, exc_info=True) @@ -70,6 +59,7 @@ def validate(self) -> None: database_id = self._properties["database"] table_name = self._properties["table_name"] schema = self._properties.get("schema", None) + sql = self._properties.get("sql", None) owner_ids: Optional[List[int]] = self._properties.get("owners") # Validate uniqueness @@ -82,14 +72,17 @@ def validate(self) -> None: exceptions.append(DatabaseNotFoundValidationError()) self._properties["database"] = database - # Validate table exists on dataset - if database and not DatasetDAO.validate_table_exists( - database, table_name, schema + # Validate table exists on dataset if sql is not provided + # This should be validated when the dataset is physical + if ( + database + and not sql + and not DatasetDAO.validate_table_exists(database, table_name, schema) ): exceptions.append(TableNotFoundValidationError(table_name)) try: - owners = self.populate_owners(self._actor, owner_ids) + owners = self.populate_owners(owner_ids) self._properties["owners"] = owners except ValidationError as ex: exceptions.append(ex) diff --git a/superset/datasets/commands/delete.py b/superset/datasets/commands/delete.py index a9e5a0ab5aba..6f9156795813 100644 --- a/superset/datasets/commands/delete.py +++ b/superset/datasets/commands/delete.py @@ -18,9 +18,9 @@ from typing import Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from sqlalchemy.exc import SQLAlchemyError +from superset import security_manager from superset.commands.base import BaseCommand from superset.connectors.sqla.models import SqlaTable from superset.dao.exceptions import DAODeleteFailedError @@ -31,15 +31,13 @@ ) from superset.datasets.dao import DatasetDAO from superset.exceptions import SupersetSecurityException -from superset.extensions import db, security_manager -from superset.views.base import check_ownership +from superset.extensions import db logger = logging.getLogger(__name__) class DeleteDatasetCommand(BaseCommand): - def __init__(self, user: User, model_id: int): - self._actor = user + def __init__(self, model_id: int): self._model_id = model_id self._model: Optional[SqlaTable] = None @@ -47,30 +45,6 @@ def run(self) -> Model: self.validate() try: dataset = DatasetDAO.delete(self._model, commit=False) - - view_menu = ( - security_manager.find_view_menu(self._model.get_perm()) - if self._model - else None - ) - - if view_menu: - permission_views = ( - db.session.query(security_manager.permissionview_model) - .filter_by(view_menu=view_menu) - .all() - ) - - for permission_view in permission_views: - db.session.delete(permission_view) - if view_menu: - db.session.delete(view_menu) - else: - if not view_menu: - logger.error( - "Could not find the data access permission for the dataset", - exc_info=True, - ) db.session.commit() except (SQLAlchemyError, DAODeleteFailedError) as ex: logger.exception(ex) @@ -85,6 +59,6 @@ def validate(self) -> None: raise DatasetNotFoundError() # Check ownership try: - check_ownership(self._model) + security_manager.raise_for_ownership(self._model) except SupersetSecurityException as ex: raise DatasetForbiddenError() from ex diff --git a/superset/datasets/commands/duplicate.py b/superset/datasets/commands/duplicate.py new file mode 100644 index 000000000000..c6b0bbea6925 --- /dev/null +++ b/superset/datasets/commands/duplicate.py @@ -0,0 +1,133 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import logging +from typing import Any, Dict, List + +from flask_appbuilder.models.sqla import Model +from flask_babel import gettext as __ +from marshmallow import ValidationError +from sqlalchemy.exc import SQLAlchemyError + +from superset.commands.base import BaseCommand, CreateMixin +from superset.commands.exceptions import DatasourceTypeInvalidError +from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn +from superset.dao.exceptions import DAOCreateFailedError +from superset.datasets.commands.exceptions import ( + DatasetDuplicateFailedError, + DatasetExistsValidationError, + DatasetInvalidError, + DatasetNotFoundError, +) +from superset.datasets.dao import DatasetDAO +from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from superset.exceptions import SupersetErrorException +from superset.extensions import db +from superset.models.core import Database +from superset.sql_parse import ParsedQuery + +logger = logging.getLogger(__name__) + + +class DuplicateDatasetCommand(CreateMixin, BaseCommand): + def __init__(self, data: Dict[str, Any]) -> None: + self._base_model: SqlaTable = SqlaTable() + self._properties = data.copy() + + def run(self) -> Model: + self.validate() + try: + database_id = self._base_model.database_id + table_name = self._properties["table_name"] + owners = self._properties["owners"] + database = db.session.query(Database).get(database_id) + if not database: + raise SupersetErrorException( + SupersetError( + message=__("The database was not found."), + error_type=SupersetErrorType.DATABASE_NOT_FOUND_ERROR, + level=ErrorLevel.ERROR, + ), + status=404, + ) + table = SqlaTable(table_name=table_name, owners=owners) + table.database = database + table.schema = self._base_model.schema + table.template_params = self._base_model.template_params + table.is_sqllab_view = True + table.sql = ParsedQuery(self._base_model.sql).stripped() + db.session.add(table) + cols = [] + for config_ in self._base_model.columns: + column_name = config_.column_name + col = TableColumn( + column_name=column_name, + verbose_name=config_.verbose_name, + expression=config_.expression, + filterable=True, + groupby=True, + is_dttm=config_.is_dttm, + type=config_.type, + description=config_.description, + ) + cols.append(col) + table.columns = cols + mets = [] + for config_ in self._base_model.metrics: + metric_name = config_.metric_name + met = SqlMetric( + metric_name=metric_name, + verbose_name=config_.verbose_name, + expression=config_.expression, + metric_type=config_.metric_type, + description=config_.description, + ) + mets.append(met) + table.metrics = mets + db.session.commit() + except (SQLAlchemyError, DAOCreateFailedError) as ex: + logger.warning(ex, exc_info=True) + db.session.rollback() + raise DatasetDuplicateFailedError() from ex + return table + + def validate(self) -> None: + exceptions: List[ValidationError] = [] + base_model_id = self._properties["base_model_id"] + duplicate_name = self._properties["table_name"] + + base_model = DatasetDAO.find_by_id(base_model_id) + if not base_model: + exceptions.append(DatasetNotFoundError()) + else: + self._base_model = base_model + + if self._base_model and self._base_model.kind != "virtual": + exceptions.append(DatasourceTypeInvalidError()) + + if DatasetDAO.find_one_or_none(table_name=duplicate_name): + exceptions.append(DatasetExistsValidationError(table_name=duplicate_name)) + + try: + owners = self.populate_owners() + self._properties["owners"] = owners + except ValidationError as ex: + exceptions.append(ex) + + if exceptions: + exception = DatasetInvalidError() + exception.add_list(exceptions) + raise exception diff --git a/superset/datasets/commands/exceptions.py b/superset/datasets/commands/exceptions.py index b743a4355ea0..91af2fdde4e9 100644 --- a/superset/datasets/commands/exceptions.py +++ b/superset/datasets/commands/exceptions.py @@ -187,3 +187,11 @@ class DatasetImportError(ImportFailedError): class DatasetAccessDeniedError(ForbiddenError): message = _("You don't have access to this dataset.") + + +class DatasetDuplicateFailedError(CreateFailedError): + message = _("Dataset could not be duplicated.") + + +class DatasetForbiddenDataURI(ImportFailedError): + message = _("Data URI is not allowed.") diff --git a/superset/datasets/commands/export.py b/superset/datasets/commands/export.py index be9210a06c66..b71a95936ab1 100644 --- a/superset/datasets/commands/export.py +++ b/superset/datasets/commands/export.py @@ -21,13 +21,13 @@ from typing import Iterator, Tuple import yaml -from werkzeug.utils import secure_filename from superset.commands.export.models import ExportModelsCommand from superset.connectors.sqla.models import SqlaTable from superset.datasets.commands.exceptions import DatasetNotFoundError from superset.datasets.dao import DatasetDAO from superset.utils.dict_import_export import EXPORT_VERSION +from superset.utils.file import get_filename logger = logging.getLogger(__name__) @@ -43,9 +43,11 @@ class ExportDatasetsCommand(ExportModelsCommand): def _export( model: SqlaTable, export_related: bool = True ) -> Iterator[Tuple[str, str]]: - database_slug = secure_filename(model.database.database_name) - dataset_slug = secure_filename(model.table_name) - file_name = f"datasets/{database_slug}/{dataset_slug}.yaml" + db_file_name = get_filename( + model.database.database_name, model.database.id, skip_id=True + ) + ds_file_name = get_filename(model.table_name, model.id, skip_id=True) + file_path = f"datasets/{db_file_name}/{ds_file_name}.yaml" payload = model.export_to_dict( recursive=True, @@ -75,11 +77,11 @@ def _export( payload["database_uuid"] = str(model.database.uuid) file_content = yaml.safe_dump(payload, sort_keys=False) - yield file_name, file_content + yield file_path, file_content # include database as well if export_related: - file_name = f"databases/{database_slug}.yaml" + file_path = f"databases/{db_file_name}.yaml" payload = model.database.export_to_dict( recursive=False, @@ -98,4 +100,4 @@ def _export( payload["version"] = EXPORT_VERSION file_content = yaml.safe_dump(payload, sort_keys=False) - yield file_name, file_content + yield file_path, file_content diff --git a/superset/datasets/commands/importers/v0.py b/superset/datasets/commands/importers/v0.py index 74b9ca0a6abb..f706ecf38bcf 100644 --- a/superset/datasets/commands/importers/v0.py +++ b/superset/datasets/commands/importers/v0.py @@ -139,7 +139,7 @@ def import_datasource( # pylint: disable=too-many-arguments ) -> int: """Imports the datasource from the object to the database. - Metrics and columns and datasource will be overrided if exists. + Metrics and columns and datasource will be overridden if exists. This function can be used to import/export datasources between multiple superset instances. Audit metadata isn't copies over. """ diff --git a/superset/datasets/commands/importers/v1/utils.py b/superset/datasets/commands/importers/v1/utils.py index ba2b7df26174..b3fb2a804127 100644 --- a/superset/datasets/commands/importers/v1/utils.py +++ b/superset/datasets/commands/importers/v1/utils.py @@ -29,6 +29,7 @@ from sqlalchemy.sql.visitors import VisitableType from superset.connectors.sqla.models import SqlaTable +from superset.datasets.commands.exceptions import DatasetForbiddenDataURI from superset.models.core import Database logger = logging.getLogger(__name__) @@ -75,6 +76,28 @@ def get_dtype(df: pd.DataFrame, dataset: SqlaTable) -> Dict[str, VisitableType]: } +def validate_data_uri(data_uri: str) -> None: + """ + Validate that the data URI is configured on DATASET_IMPORT_ALLOWED_URLS + has a valid URL. + + :param data_uri: + :return: + """ + allowed_urls = current_app.config["DATASET_IMPORT_ALLOWED_DATA_URLS"] + for allowed_url in allowed_urls: + try: + match = re.match(allowed_url, data_uri) + except re.error: + logger.exception( + "Invalid regular expression on DATASET_IMPORT_ALLOWED_URLS" + ) + raise + if match: + return + raise DatasetForbiddenDataURI() + + def import_dataset( session: Session, config: Dict[str, Any], @@ -139,7 +162,6 @@ def import_dataset( table_exists = True if data_uri and (not table_exists or force_data): - logger.info("Downloading data from %s", data_uri) load_data(data_uri, dataset, dataset.database, session) if hasattr(g, "user") and g.user: @@ -151,6 +173,14 @@ def import_dataset( def load_data( data_uri: str, dataset: SqlaTable, database: Database, session: Session ) -> None: + """ + Load data from a data URI into a dataset. + + :raises DatasetUnAllowedDataURI: If a dataset is trying + to load data from a URI that is not allowed. + """ + validate_data_uri(data_uri) + logger.info("Downloading data from %s", data_uri) data = request.urlopen(data_uri) # pylint: disable=consider-using-with if data_uri.endswith(".gz"): data = gzip.open(data) @@ -166,17 +196,26 @@ def load_data( if database.sqlalchemy_uri == current_app.config.get("SQLALCHEMY_DATABASE_URI"): logger.info("Loading data inside the import transaction") connection = session.connection() + df.to_sql( + dataset.table_name, + con=connection, + schema=dataset.schema, + if_exists="replace", + chunksize=CHUNKSIZE, + dtype=dtype, + index=False, + method="multi", + ) else: logger.warning("Loading data outside the import transaction") - connection = database.get_sqla_engine() - - df.to_sql( - dataset.table_name, - con=connection, - schema=dataset.schema, - if_exists="replace", - chunksize=CHUNKSIZE, - dtype=dtype, - index=False, - method="multi", - ) + with database.get_sqla_engine_with_context() as engine: + df.to_sql( + dataset.table_name, + con=engine, + schema=dataset.schema, + if_exists="replace", + chunksize=CHUNKSIZE, + dtype=dtype, + index=False, + method="multi", + ) diff --git a/superset/datasets/commands/refresh.py b/superset/datasets/commands/refresh.py index 962ffb410902..5277c27771c9 100644 --- a/superset/datasets/commands/refresh.py +++ b/superset/datasets/commands/refresh.py @@ -18,8 +18,8 @@ from typing import Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User +from superset import security_manager from superset.commands.base import BaseCommand from superset.connectors.sqla.models import SqlaTable from superset.datasets.commands.exceptions import ( @@ -29,14 +29,12 @@ ) from superset.datasets.dao import DatasetDAO from superset.exceptions import SupersetSecurityException -from superset.views.base import check_ownership logger = logging.getLogger(__name__) class RefreshDatasetCommand(BaseCommand): - def __init__(self, user: User, model_id: int): - self._actor = user + def __init__(self, model_id: int): self._model_id = model_id self._model: Optional[SqlaTable] = None @@ -58,6 +56,6 @@ def validate(self) -> None: raise DatasetNotFoundError() # Check ownership try: - check_ownership(self._model) + security_manager.raise_for_ownership(self._model) except SupersetSecurityException as ex: raise DatasetForbiddenError() from ex diff --git a/superset/datasets/commands/samples.py b/superset/datasets/commands/samples.py deleted file mode 100644 index 79ac729be080..000000000000 --- a/superset/datasets/commands/samples.py +++ /dev/null @@ -1,83 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -import logging -from typing import Any, Dict, Optional - -from flask_appbuilder.security.sqla.models import User - -from superset.commands.base import BaseCommand -from superset.common.chart_data import ChartDataResultType -from superset.common.query_context_factory import QueryContextFactory -from superset.common.utils.query_cache_manager import QueryCacheManager -from superset.connectors.sqla.models import SqlaTable -from superset.constants import CacheRegion -from superset.datasets.commands.exceptions import ( - DatasetForbiddenError, - DatasetNotFoundError, - DatasetSamplesFailedError, -) -from superset.datasets.dao import DatasetDAO -from superset.exceptions import SupersetSecurityException -from superset.utils.core import QueryStatus -from superset.views.base import check_ownership - -logger = logging.getLogger(__name__) - - -class SamplesDatasetCommand(BaseCommand): - def __init__(self, user: User, model_id: int, force: bool): - self._actor = user - self._model_id = model_id - self._force = force - self._model: Optional[SqlaTable] = None - - def run(self) -> Dict[str, Any]: - self.validate() - if not self._model: - raise DatasetNotFoundError() - - qc_instance = QueryContextFactory().create( - datasource={ - "type": self._model.type, - "id": self._model.id, - }, - queries=[{}], - result_type=ChartDataResultType.SAMPLES, - force=self._force, - ) - results = qc_instance.get_payload() - try: - sample_data = results["queries"][0] - error_msg = sample_data.get("error") - if sample_data.get("status") == QueryStatus.FAILED and error_msg: - cache_key = sample_data.get("cache_key") - QueryCacheManager.delete(cache_key, region=CacheRegion.DATA) - raise DatasetSamplesFailedError(error_msg) - return sample_data - except (IndexError, KeyError) as exc: - raise DatasetSamplesFailedError from exc - - def validate(self) -> None: - # Validate/populate model exists - self._model = DatasetDAO.find_by_id(self._model_id) - if not self._model: - raise DatasetNotFoundError() - # Check ownership - try: - check_ownership(self._model) - except SupersetSecurityException as ex: - raise DatasetForbiddenError() from ex diff --git a/superset/datasets/commands/update.py b/superset/datasets/commands/update.py index 9d448a6c1939..483a98e76c3b 100644 --- a/superset/datasets/commands/update.py +++ b/superset/datasets/commands/update.py @@ -19,9 +19,9 @@ from typing import Any, Dict, List, Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError +from superset import security_manager from superset.commands.base import BaseCommand, UpdateMixin from superset.connectors.sqla.models import SqlaTable from superset.dao.exceptions import DAOUpdateFailedError @@ -41,7 +41,6 @@ ) from superset.datasets.dao import DatasetDAO from superset.exceptions import SupersetSecurityException -from superset.views.base import check_ownership logger = logging.getLogger(__name__) @@ -49,16 +48,15 @@ class UpdateDatasetCommand(UpdateMixin, BaseCommand): def __init__( self, - user: User, model_id: int, data: Dict[str, Any], - override_columns: bool = False, + override_columns: Optional[bool] = False, ): - self._actor = user self._model_id = model_id self._properties = data.copy() self._model: Optional[SqlaTable] = None self.override_columns = override_columns + self._properties["override_columns"] = override_columns def run(self) -> Model: self.validate() @@ -83,7 +81,7 @@ def validate(self) -> None: raise DatasetNotFoundError() # Check ownership try: - check_ownership(self._model) + security_manager.raise_for_ownership(self._model) except SupersetSecurityException as ex: raise DatasetForbiddenError() from ex @@ -99,7 +97,7 @@ def validate(self) -> None: exceptions.append(DatabaseChangeValidationError()) # Validate/Populate owner try: - owners = self.populate_owners(self._actor, owner_ids) + owners = self.populate_owners(owner_ids) self._properties["owners"] = owners except ValidationError as ex: exceptions.append(ex) diff --git a/superset/datasets/dao.py b/superset/datasets/dao.py index 44ab8efa0ce5..b158fce1fefe 100644 --- a/superset/datasets/dao.py +++ b/superset/datasets/dao.py @@ -17,7 +17,6 @@ import logging from typing import Any, Dict, List, Optional -from flask import current_app from sqlalchemy.exc import SQLAlchemyError from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn @@ -36,14 +35,6 @@ class DatasetDAO(BaseDAO): # pylint: disable=too-many-public-methods model_cls = SqlaTable base_filter = DatasourceFilter - @staticmethod - def get_owner_by_id(owner_id: int) -> Optional[object]: - return ( - db.session.query(current_app.appbuilder.sm.user_model) - .filter_by(id=owner_id) - .one_or_none() - ) - @staticmethod def get_database_by_id(database_id: int) -> Optional[Database]: try: @@ -156,21 +147,25 @@ def validate_metrics_uniqueness(dataset_id: int, metrics_names: List[str]) -> bo @classmethod def update( - cls, model: SqlaTable, properties: Dict[str, Any], commit: bool = True + cls, + model: SqlaTable, + properties: Dict[str, Any], + commit: bool = True, ) -> Optional[SqlaTable]: """ Updates a Dataset model on the metadata DB """ if "columns" in properties: - properties["columns"] = cls.update_columns( - model, properties.get("columns", []), commit=commit + cls.update_columns( + model, + properties.pop("columns"), + commit=commit, + override_columns=bool(properties.get("override_columns")), ) if "metrics" in properties: - properties["metrics"] = cls.update_metrics( - model, properties.get("metrics", []), commit=commit - ) + cls.update_metrics(model, properties.pop("metrics"), commit=commit) return super().update(model, properties, commit=commit) @@ -180,7 +175,8 @@ def update_columns( model: SqlaTable, property_columns: List[Dict[str, Any]], commit: bool = True, - ) -> List[TableColumn]: + override_columns: bool = False, + ) -> None: """ Creates/updates and/or deletes a list of columns, based on a list of Dict. @@ -190,21 +186,54 @@ def update_columns( - If there are extra columns on the metadata db that are not defined on the List then we delete. """ - new_columns = [] - for column in property_columns: - column_id = column.get("id") - - if column_id: - column_obj = db.session.query(TableColumn).get(column_id) - column_obj = DatasetDAO.update_column(column_obj, column, commit=commit) - else: - column_obj = DatasetDAO.create_column(column, commit=commit) - new_columns.append(column_obj) - # Checks if an exiting column is missing from properties and delete it - for existing_column in model.columns: - if existing_column.id not in [column.id for column in new_columns]: - DatasetDAO.delete_column(existing_column) - return new_columns + + if override_columns: + db.session.query(TableColumn).filter( + TableColumn.table_id == model.id + ).delete(synchronize_session="fetch") + + db.session.bulk_insert_mappings( + TableColumn, + [ + {**properties, "table_id": model.id} + for properties in property_columns + ], + ) + else: + columns_by_id = {column.id: column for column in model.columns} + + property_columns_by_id = { + properties["id"]: properties + for properties in property_columns + if "id" in properties + } + + db.session.bulk_insert_mappings( + TableColumn, + [ + {**properties, "table_id": model.id} + for properties in property_columns + if not "id" in properties + ], + ) + + db.session.bulk_update_mappings( + TableColumn, + [ + {**columns_by_id[properties["id"]].__dict__, **properties} + for properties in property_columns_by_id.values() + ], + ) + + db.session.query(TableColumn).filter( + TableColumn.id.in_( + {column.id for column in model.columns} + - property_columns_by_id.keys() + ) + ).delete(synchronize_session="fetch") + + if commit: + db.session.commit() @classmethod def update_metrics( @@ -212,7 +241,7 @@ def update_metrics( model: SqlaTable, property_metrics: List[Dict[str, Any]], commit: bool = True, - ) -> List[SqlMetric]: + ) -> None: """ Creates/updates and/or deletes a list of metrics, based on a list of Dict. @@ -222,21 +251,40 @@ def update_metrics( - If there are extra metrics on the metadata db that are not defined on the List then we delete. """ - new_metrics = [] - for metric in property_metrics: - metric_id = metric.get("id") - if metric.get("id"): - metric_obj = db.session.query(SqlMetric).get(metric_id) - metric_obj = DatasetDAO.update_metric(metric_obj, metric, commit=commit) - else: - metric_obj = DatasetDAO.create_metric(metric, commit=commit) - new_metrics.append(metric_obj) - - # Checks if an exiting column is missing from properties and delete it - for existing_metric in model.metrics: - if existing_metric.id not in [metric.id for metric in new_metrics]: - DatasetDAO.delete_metric(existing_metric) - return new_metrics + + metrics_by_id = {metric.id: metric for metric in model.metrics} + + property_metrics_by_id = { + properties["id"]: properties + for properties in property_metrics + if "id" in properties + } + + db.session.bulk_insert_mappings( + SqlMetric, + [ + {**properties, "table_id": model.id} + for properties in property_metrics + if not "id" in properties + ], + ) + + db.session.bulk_update_mappings( + SqlMetric, + [ + {**metrics_by_id[properties["id"]].__dict__, **properties} + for properties in property_metrics_by_id.values() + ], + ) + + db.session.query(SqlMetric).filter( + SqlMetric.id.in_( + {metric.id for metric in model.metrics} - property_metrics_by_id.keys() + ) + ).delete(synchronize_session="fetch") + + if commit: + db.session.commit() @classmethod def find_dataset_column( @@ -254,23 +302,24 @@ def find_dataset_column( @classmethod def update_column( - cls, model: TableColumn, properties: Dict[str, Any], commit: bool = True - ) -> Optional[TableColumn]: + cls, + model: TableColumn, + properties: Dict[str, Any], + commit: bool = True, + ) -> TableColumn: return DatasetColumnDAO.update(model, properties, commit=commit) @classmethod def create_column( cls, properties: Dict[str, Any], commit: bool = True - ) -> Optional[TableColumn]: + ) -> TableColumn: """ Creates a Dataset model on the metadata DB """ return DatasetColumnDAO.create(properties, commit=commit) @classmethod - def delete_column( - cls, model: TableColumn, commit: bool = True - ) -> Optional[TableColumn]: + def delete_column(cls, model: TableColumn, commit: bool = True) -> TableColumn: """ Deletes a Dataset column """ @@ -287,9 +336,7 @@ def find_dataset_metric( return db.session.query(SqlMetric).get(metric_id) @classmethod - def delete_metric( - cls, model: SqlMetric, commit: bool = True - ) -> Optional[TableColumn]: + def delete_metric(cls, model: SqlMetric, commit: bool = True) -> SqlMetric: """ Deletes a Dataset metric """ @@ -297,14 +344,19 @@ def delete_metric( @classmethod def update_metric( - cls, model: SqlMetric, properties: Dict[str, Any], commit: bool = True - ) -> Optional[SqlMetric]: + cls, + model: SqlMetric, + properties: Dict[str, Any], + commit: bool = True, + ) -> SqlMetric: return DatasetMetricDAO.update(model, properties, commit=commit) @classmethod def create_metric( - cls, properties: Dict[str, Any], commit: bool = True - ) -> Optional[SqlMetric]: + cls, + properties: Dict[str, Any], + commit: bool = True, + ) -> SqlMetric: """ Creates a Dataset model on the metadata DB """ @@ -336,6 +388,14 @@ def bulk_delete(models: Optional[List[SqlaTable]], commit: bool = True) -> None: db.session.rollback() raise ex + @staticmethod + def get_table_by_name(database_id: int, table_name: str) -> Optional[SqlaTable]: + return ( + db.session.query(SqlaTable) + .filter_by(database_id=database_id, table_name=table_name) + .one_or_none() + ) + class DatasetColumnDAO(BaseDAO): model_cls = TableColumn diff --git a/superset/datasets/metrics/api.py b/superset/datasets/metrics/api.py index b55ab9dbb489..c0831670dba1 100644 --- a/superset/datasets/metrics/api.py +++ b/superset/datasets/metrics/api.py @@ -16,7 +16,7 @@ # under the License. import logging -from flask import g, Response +from flask import Response from flask_appbuilder.api import expose, permission_name, protect, safe from flask_appbuilder.models.sqla.interface import SQLAInterface @@ -91,7 +91,7 @@ def delete( # pylint: disable=arguments-differ $ref: '#/components/responses/500' """ try: - DeleteDatasetMetricCommand(g.user, pk, metric_id).run() + DeleteDatasetMetricCommand(pk, metric_id).run() return self.response(200, message="OK") except DatasetMetricNotFoundError: return self.response_404() diff --git a/superset/datasets/metrics/commands/delete.py b/superset/datasets/metrics/commands/delete.py index cb3f1e0bea1e..d57e7fa359b4 100644 --- a/superset/datasets/metrics/commands/delete.py +++ b/superset/datasets/metrics/commands/delete.py @@ -18,8 +18,8 @@ from typing import Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User +from superset import security_manager from superset.commands.base import BaseCommand from superset.connectors.sqla.models import SqlMetric from superset.dao.exceptions import DAODeleteFailedError @@ -30,14 +30,12 @@ DatasetMetricNotFoundError, ) from superset.exceptions import SupersetSecurityException -from superset.views.base import check_ownership logger = logging.getLogger(__name__) class DeleteDatasetMetricCommand(BaseCommand): - def __init__(self, user: User, dataset_id: int, model_id: int): - self._actor = user + def __init__(self, dataset_id: int, model_id: int): self._dataset_id = dataset_id self._model_id = model_id self._model: Optional[SqlMetric] = None @@ -60,6 +58,6 @@ def validate(self) -> None: raise DatasetMetricNotFoundError() # Check ownership try: - check_ownership(self._model) + security_manager.raise_for_ownership(self._model) except SupersetSecurityException as ex: raise DatasetMetricForbiddenError() from ex diff --git a/superset/datasets/schemas.py b/superset/datasets/schemas.py index 8a44da458f56..103359a2c3f0 100644 --- a/superset/datasets/schemas.py +++ b/superset/datasets/schemas.py @@ -80,6 +80,7 @@ class DatasetPostSchema(Schema): database = fields.Integer(required=True) schema = fields.String(validate=Length(0, 250)) table_name = fields.String(required=True, allow_none=False, validate=Length(1, 250)) + sql = fields.String(allow_none=True) owners = fields.List(fields.Integer()) is_managed_externally = fields.Boolean(allow_none=True, default=False) external_url = fields.String(allow_none=True) @@ -107,6 +108,11 @@ class DatasetPutSchema(Schema): external_url = fields.String(allow_none=True) +class DatasetDuplicateSchema(Schema): + base_model_id = fields.Integer(required=True) + table_name = fields.String(required=True, allow_none=False, validate=Length(1, 250)) + + class DatasetRelatedChart(Schema): id = fields.Integer() slice_name = fields.String() @@ -144,7 +150,7 @@ class ImportV1ColumnSchema(Schema): @pre_load def fix_extra(self, data: Dict[str, Any], **kwargs: Any) -> Dict[str, Any]: """ - Fix for extra initially beeing exported as a string. + Fix for extra initially being exported as a string. """ if isinstance(data.get("extra"), str): data["extra"] = json.loads(data["extra"]) @@ -170,7 +176,7 @@ class ImportV1MetricSchema(Schema): @pre_load def fix_extra(self, data: Dict[str, Any], **kwargs: Any) -> Dict[str, Any]: """ - Fix for extra initially beeing exported as a string. + Fix for extra initially being exported as a string. """ if isinstance(data.get("extra"), str): data["extra"] = json.loads(data["extra"]) @@ -192,7 +198,7 @@ class ImportV1DatasetSchema(Schema): @pre_load def fix_extra(self, data: Dict[str, Any], **kwargs: Any) -> Dict[str, Any]: """ - Fix for extra initially beeing exported as a string. + Fix for extra initially being exported as a string. """ if isinstance(data.get("extra"), str): data["extra"] = json.loads(data["extra"]) @@ -222,6 +228,17 @@ def fix_extra(self, data: Dict[str, Any], **kwargs: Any) -> Dict[str, Any]: external_url = fields.String(allow_none=True) +class GetOrCreateDatasetSchema(Schema): + table_name = fields.String(required=True, description="Name of table") + database_id = fields.Integer( + required=True, description="ID of database table belongs to" + ) + schema = fields.String( + description="The schema the table belongs to", allow_none=True + ) + template_params = fields.String(description="Template params for the table") + + class DatasetSchema(SQLAlchemyAutoSchema): """ Schema for the ``Dataset`` model. diff --git a/superset/datasource/__init__.py b/superset/datasource/__init__.py new file mode 100644 index 000000000000..e0533d99236c --- /dev/null +++ b/superset/datasource/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/superset/datasource/api.py b/superset/datasource/api.py new file mode 100644 index 000000000000..be246c915d53 --- /dev/null +++ b/superset/datasource/api.py @@ -0,0 +1,130 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import logging + +from flask_appbuilder.api import expose, protect, safe + +from superset import app, db, event_logger +from superset.dao.exceptions import DatasourceNotFound, DatasourceTypeNotSupportedError +from superset.datasource.dao import DatasourceDAO +from superset.exceptions import SupersetSecurityException +from superset.superset_typing import FlaskResponse +from superset.utils.core import apply_max_row_limit, DatasourceType +from superset.views.base_api import BaseSupersetApi, statsd_metrics + +logger = logging.getLogger(__name__) + + +class DatasourceRestApi(BaseSupersetApi): + allow_browser_login = True + class_permission_name = "Datasource" + resource_name = "datasource" + openapi_spec_tag = "Datasources" + + @expose( + "/<datasource_type>/<int:datasource_id>/column/<column_name>/values/", + methods=["GET"], + ) + @protect() + @safe + @statsd_metrics + @event_logger.log_this_with_context( + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}" + f".get_column_values", + log_to_statsd=False, + ) + def get_column_values( + self, datasource_type: str, datasource_id: int, column_name: str + ) -> FlaskResponse: + """Get possible values for a datasource column + --- + get: + summary: Get possible values for a datasource column + parameters: + - in: path + schema: + type: string + name: datasource_type + description: The type of datasource + - in: path + schema: + type: integer + name: datasource_id + description: The id of the datasource + - in: path + schema: + type: string + name: column_name + description: The name of the column to get values for + responses: + 200: + description: A List of distinct values for the column + content: + application/json: + schema: + type: object + properties: + result: + type: array + items: + oneOf: + - type: string + - type: integer + - type: number + - type: boolean + - type: object + 400: + $ref: '#/components/responses/400' + 401: + $ref: '#/components/responses/401' + 403: + $ref: '#/components/responses/403' + 404: + $ref: '#/components/responses/404' + 500: + $ref: '#/components/responses/500' + """ + try: + datasource = DatasourceDAO.get_datasource( + db.session, DatasourceType(datasource_type), datasource_id + ) + datasource.raise_for_access() + except ValueError: + return self.response( + 400, message=f"Invalid datasource type: {datasource_type}" + ) + except DatasourceTypeNotSupportedError as ex: + return self.response(400, message=ex.message) + except DatasourceNotFound as ex: + return self.response(404, message=ex.message) + except SupersetSecurityException as ex: + return self.response(403, message=ex.message) + + row_limit = apply_max_row_limit(app.config["FILTER_SELECT_ROW_LIMIT"]) + try: + payload = datasource.values_for_column( + column_name=column_name, limit=row_limit + ) + return self.response(200, result=payload) + except NotImplementedError: + return self.response( + 400, + message=( + "Unable to get column values for " + f"datasource type: {datasource_type}" + ), + ) diff --git a/superset/datasource/dao.py b/superset/datasource/dao.py new file mode 100644 index 000000000000..c8df4c8d8d96 --- /dev/null +++ b/superset/datasource/dao.py @@ -0,0 +1,70 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import logging +from typing import Dict, Type, Union + +from sqlalchemy.orm import Session + +from superset.connectors.sqla.models import SqlaTable +from superset.dao.base import BaseDAO +from superset.dao.exceptions import DatasourceNotFound, DatasourceTypeNotSupportedError +from superset.datasets.models import Dataset +from superset.models.sql_lab import Query, SavedQuery +from superset.tables.models import Table +from superset.utils.core import DatasourceType + +logger = logging.getLogger(__name__) + +Datasource = Union[Dataset, SqlaTable, Table, Query, SavedQuery] + + +class DatasourceDAO(BaseDAO): + + sources: Dict[Union[DatasourceType, str], Type[Datasource]] = { + DatasourceType.TABLE: SqlaTable, + DatasourceType.QUERY: Query, + DatasourceType.SAVEDQUERY: SavedQuery, + DatasourceType.DATASET: Dataset, + DatasourceType.SLTABLE: Table, + } + + @classmethod + def get_datasource( + cls, + session: Session, + datasource_type: Union[DatasourceType, str], + datasource_id: int, + ) -> Datasource: + if datasource_type not in cls.sources: + raise DatasourceTypeNotSupportedError() + + datasource = ( + session.query(cls.sources[datasource_type]) + .filter_by(id=datasource_id) + .one_or_none() + ) + + if not datasource: + logger.warning( + "Datasource not found datasource_type: %s, datasource_id: %s", + datasource_type, + datasource_id, + ) + raise DatasourceNotFound() + + return datasource diff --git a/superset/db_engine_specs/__init__.py b/superset/db_engine_specs/__init__.py index dac700199557..f19dffd4a3bb 100644 --- a/superset/db_engine_specs/__init__.py +++ b/superset/db_engine_specs/__init__.py @@ -33,27 +33,35 @@ from collections import defaultdict from importlib import import_module from pathlib import Path -from typing import Any, Dict, List, Set, Type +from typing import Any, Dict, List, Optional, Set, Type import sqlalchemy.databases import sqlalchemy.dialects from pkg_resources import iter_entry_points from sqlalchemy.engine.default import DefaultDialect +from sqlalchemy.engine.url import URL +from superset import app from superset.db_engine_specs.base import BaseEngineSpec logger = logging.getLogger(__name__) -def is_engine_spec(attr: Any) -> bool: +def is_engine_spec(obj: Any) -> bool: + """ + Return true if a given object is a DB engine spec. + """ return ( - inspect.isclass(attr) - and issubclass(attr, BaseEngineSpec) - and attr != BaseEngineSpec + inspect.isclass(obj) + and issubclass(obj, BaseEngineSpec) + and obj != BaseEngineSpec ) def load_engine_specs() -> List[Type[BaseEngineSpec]]: + """ + Load all engine specs, native and 3rd party. + """ engine_specs: List[Type[BaseEngineSpec]] = [] # load standard engines @@ -65,7 +73,6 @@ def load_engine_specs() -> List[Type[BaseEngineSpec]]: for attr in module.__dict__ if is_engine_spec(getattr(module, attr)) ) - # load additional engines from external modules for ep in iter_entry_points("superset.db_engine_specs"): try: @@ -78,20 +85,31 @@ def load_engine_specs() -> List[Type[BaseEngineSpec]]: return engine_specs -def get_engine_specs() -> Dict[str, Type[BaseEngineSpec]]: +def get_engine_spec(backend: str, driver: Optional[str] = None) -> Type[BaseEngineSpec]: + """ + Return the DB engine spec associated with a given SQLAlchemy URL. + + Note that if a driver is not specified the function returns the first DB engine spec + that supports the backend. Also, if a driver is specified but no DB engine explicitly + supporting that driver exists then a backend-only match is done, in order to allow new + drivers to work with Superset even if they are not listed in the DB engine spec + drivers. + """ engine_specs = load_engine_specs() - # build map from name/alias -> spec - engine_specs_map: Dict[str, Type[BaseEngineSpec]] = {} - for engine_spec in engine_specs: - names = [engine_spec.engine] - if engine_spec.engine_aliases: - names.extend(engine_spec.engine_aliases) + if driver is not None: + for engine_spec in engine_specs: + if engine_spec.supports_backend(backend, driver): + return engine_spec - for name in names: - engine_specs_map[name] = engine_spec + # check ignoring the driver, in order to support new drivers; this will return a + # random DB engine spec that supports the engine + for engine_spec in engine_specs: + if engine_spec.supports_backend(backend): + return engine_spec - return engine_specs_map + # default to the generic DB engine spec + return BaseEngineSpec # there's a mismatch between the dialect name reported by the driver in these @@ -152,6 +170,17 @@ def get_available_engine_specs() -> Dict[Type[BaseEngineSpec], Set[str]]: for engine_spec in load_engine_specs(): driver = drivers[engine_spec.engine] + # do not add denied db engine specs to available list + dbs_denylist = app.config["DBS_AVAILABLE_DENYLIST"] + dbs_denylist_engines = dbs_denylist.keys() + + if ( + engine_spec.engine in dbs_denylist_engines + and hasattr(engine_spec, "default_driver") + and engine_spec.default_driver in dbs_denylist[engine_spec.engine] + ): + continue + # lookup driver by engine aliases. if not driver and engine_spec.engine_aliases: for alias in engine_spec.engine_aliases: diff --git a/superset/db_engine_specs/athena.py b/superset/db_engine_specs/athena.py index 9e1d798a7cb0..047952402d2e 100644 --- a/superset/db_engine_specs/athena.py +++ b/superset/db_engine_specs/athena.py @@ -19,10 +19,10 @@ from typing import Any, Dict, Optional, Pattern, Tuple from flask_babel import gettext as __ +from sqlalchemy import types from superset.db_engine_specs.base import BaseEngineSpec from superset.errors import SupersetErrorType -from superset.utils import core as utils SYNTAX_ERROR_REGEX = re.compile( ": mismatched input '(?P<syntax_error>.*?)'. Expecting: " @@ -33,6 +33,7 @@ class AthenaEngineSpec(BaseEngineSpec): engine = "awsathena" engine_name = "Amazon Athena" allows_escaped_colons = False + disable_ssh_tunneling = True _time_grain_expressions = { None: "{col}", @@ -65,10 +66,11 @@ class AthenaEngineSpec(BaseEngineSpec): def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"DATE '{dttm.date().isoformat()}'" - if tt == utils.TemporalType.TIMESTAMP: + if isinstance(sqla_type, types.TIMESTAMP): datetime_formatted = dttm.isoformat(sep=" ", timespec="milliseconds") return f"""TIMESTAMP '{datetime_formatted}'""" return None diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index 43ca6967b658..90386c1e1068 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -15,14 +15,17 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=too-many-lines + +from __future__ import annotations + import json import logging import re -from contextlib import closing from datetime import datetime from typing import ( Any, Callable, + ContextManager, Dict, List, Match, @@ -61,7 +64,6 @@ from superset import security_manager, sql_parse from superset.databases.utils import make_url_safe from superset.errors import ErrorLevel, SupersetError, SupersetErrorType -from superset.models.sql_lab import Query from superset.sql_parse import ParsedQuery, Table from superset.superset_typing import ResultSetColumnType from superset.utils import core as utils @@ -73,6 +75,7 @@ # prevent circular imports from superset.connectors.sqla.models import TableColumn from superset.models.core import Database + from superset.models.sql_lab import Query ColumnTypeMapping = Tuple[ Pattern[str], @@ -83,9 +86,6 @@ logger = logging.getLogger() -CTE_ALIAS = "__cte" - - class TimeGrain(NamedTuple): name: str # TODO: redundant field, remove label: str @@ -94,7 +94,6 @@ class TimeGrain(NamedTuple): builtin_time_grains: Dict[Optional[str], str] = { - None: __("Original value"), "PT1S": __("Second"), "PT5S": __("5 second"), "PT30S": __("30 second"), @@ -117,7 +116,9 @@ class TimeGrain(NamedTuple): } -class TimestampExpression(ColumnClause): # pylint: disable=abstract-method +class TimestampExpression( + ColumnClause +): # pylint: disable=abstract-method, too-many-ancestors def __init__(self, expr: str, col: ColumnClause, **kwargs: Any) -> None: """Sqlalchemy class that can be can be used to render native column elements respeting engine-specific quoting rules as part of a string-based expression. @@ -152,6 +153,21 @@ class LimitMethod: # pylint: disable=too-few-public-methods FORCE_LIMIT = "force_limit" +class MetricType(TypedDict, total=False): + """ + Type for metrics return by `get_metrics`. + """ + + metric_name: str + expression: str + verbose_name: Optional[str] + metric_type: Optional[str] + description: Optional[str] + d3format: Optional[str] + warning_text: Optional[str] + extra: Optional[str] + + class BaseEngineSpec: # pylint: disable=too-many-public-methods """Abstract class for database engine specific configurations @@ -166,12 +182,19 @@ class BaseEngineSpec: # pylint: disable=too-many-public-methods having to add the same aggregation in SELECT. """ + engine_name: Optional[str] = None # for user messages, overridden in child classes + + # These attributes map the DB engine spec to one or more SQLAlchemy dialects/drivers; + # see the ``supports_url`` and ``supports_backend`` methods below. engine = "base" # str as defined in sqlalchemy.engine.engine engine_aliases: Set[str] = set() - engine_name: Optional[str] = None # for user messages, overridden in child classes + drivers: Dict[str, str] = {} + default_driver: Optional[str] = None + disable_ssh_tunneling = False + _date_trunc_functions: Dict[str, str] = {} _time_grain_expressions: Dict[Optional[str], str] = {} - column_type_mappings: Tuple[ColumnTypeMapping, ...] = ( + _default_column_type_mappings: Tuple[ColumnTypeMapping, ...] = ( ( re.compile(r"^string", re.IGNORECASE), types.String(), @@ -288,6 +311,8 @@ class BaseEngineSpec: # pylint: disable=too-many-public-methods GenericDataType.BOOLEAN, ), ) + # engine-specific type mappings to check prior to the defaults + column_type_mappings: Tuple[ColumnTypeMapping, ...] = () # Does database support join-free timeslot grouping time_groupby_inline = False @@ -318,6 +343,8 @@ class BaseEngineSpec: # pylint: disable=too-many-public-methods # If True, then it will allow in subquery , # if False it will allow as regular CTE allows_cte_in_subquery = True + # Define alias for CTE + cte_alias = "__cte" # Whether allow LIMIT clause in the SQL # If True, then the database engine is allowed for LIMIT clause # If False, then the database engine is allowed for TOP clause @@ -338,6 +365,62 @@ class BaseEngineSpec: # pylint: disable=too-many-public-methods Pattern[str], Tuple[str, SupersetErrorType, Dict[str, Any]] ] = {} + # Whether the engine supports file uploads + # if True, database will be listed as option in the upload file form + supports_file_upload = True + + @classmethod + def supports_url(cls, url: URL) -> bool: + """ + Returns true if the DB engine spec supports a given SQLAlchemy URL. + + As an example, if a given DB engine spec has: + + class PostgresDBEngineSpec: + engine = "postgresql" + engine_aliases = "postgres" + drivers = { + "psycopg2": "The default Postgres driver", + "asyncpg": "An asynchronous Postgres driver", + } + + It would be used for all the following SQLAlchemy URIs: + + - postgres://user:password@host/db + - postgresql://user:password@host/db + - postgres+asyncpg://user:password@host/db + - postgres+psycopg2://user:password@host/db + - postgresql+asyncpg://user:password@host/db + - postgresql+psycopg2://user:password@host/db + + Note that SQLAlchemy has a default driver even if one is not specified: + + >>> from sqlalchemy.engine.url import make_url + >>> make_url('postgres://').get_driver_name() + 'psycopg2' + + """ + backend = url.get_backend_name() + driver = url.get_driver_name() + return cls.supports_backend(backend, driver) + + @classmethod + def supports_backend(cls, backend: str, driver: Optional[str] = None) -> bool: + """ + Returns true if the DB engine spec supports a given SQLAlchemy backend/driver. + """ + # check the backend first + if backend != cls.engine and backend not in cls.engine_aliases: + return False + + # originally DB engine specs didn't declare any drivers and the check was made + # only on the engine; if that's the case, ignore the driver for backwards + # compatibility + if not cls.drivers or driver is None: + return True + + return driver in cls.drivers + @classmethod def get_dbapi_exception_mapping(cls) -> Dict[Type[Exception], Type[Exception]]: """ @@ -351,6 +434,15 @@ def get_dbapi_exception_mapping(cls) -> Dict[Type[Exception], Type[Exception]]: """ return {} + @classmethod + def parse_error_exception(cls, exception: Exception) -> Exception: + """ + Each engine can implement and converge its own specific parser method + + :return: An Exception with a parsed string off the original exception + """ + return exception + @classmethod def get_dbapi_mapped_exception(cls, exception: Exception) -> Exception: """ @@ -364,7 +456,7 @@ def get_dbapi_mapped_exception(cls, exception: Exception) -> Exception: """ new_exception = cls.get_dbapi_exception_mapping().get(type(exception)) if not new_exception: - return exception + return cls.parse_error_exception(exception) return new_exception(str(exception)) @classmethod @@ -377,7 +469,7 @@ def get_allow_cost_estimate( # pylint: disable=unused-argument @classmethod def get_text_clause(cls, clause: str) -> TextClause: """ - SQLALchemy wrapper to ensure text clauses are escaped properly + SQLAlchemy wrapper to ensure text clauses are escaped properly :param clause: string clause with potentially unescaped characters :return: text clause with escaped characters @@ -389,11 +481,19 @@ def get_text_clause(cls, clause: str) -> TextClause: @classmethod def get_engine( cls, - database: "Database", + database: Database, schema: Optional[str] = None, - source: Optional[str] = None, - ) -> Engine: - return database.get_sqla_engine(schema=schema, source=source) + source: Optional[utils.QuerySource] = None, + ) -> ContextManager[Engine]: + """ + Return an engine context manager. + + >>> with DBEngineSpec.get_engine(database, schema, source) as engine: + ... connection = engine.connect() + ... connection.execute(sql) + + """ + return database.get_sqla_engine_with_context(schema=schema, source=source) @classmethod def get_timestamp_expr( @@ -401,7 +501,6 @@ def get_timestamp_expr( col: ColumnClause, pdf: Optional[str], time_grain: Optional[str], - type_: Optional[str] = None, ) -> TimestampExpression: """ Construct a TimestampExpression to be used in a SQLAlchemy query. @@ -409,10 +508,10 @@ def get_timestamp_expr( :param col: Target column for the TimestampExpression :param pdf: date format (seconds or milliseconds) :param time_grain: time grain, e.g. P1Y for 1 year - :param type_: the source column type :return: TimestampExpression object """ if time_grain: + type_ = str(getattr(col, "type", "")) time_expr = cls.get_time_grain_expressions().get(time_grain) if not time_expr: raise NotImplementedError( @@ -561,7 +660,7 @@ def fetch_data( return cursor.fetchmany(limit) return cursor.fetchall() except Exception as ex: - raise cls.get_dbapi_mapped_exception(ex) + raise cls.get_dbapi_mapped_exception(ex) from ex @classmethod def expand_data( @@ -637,7 +736,7 @@ def normalize_indexes(cls, indexes: List[Dict[str, Any]]) -> List[Dict[str, Any] @classmethod def extra_table_metadata( # pylint: disable=unused-argument cls, - database: "Database", + database: Database, table_name: str, schema_name: Optional[str], ) -> Dict[str, Any]: @@ -654,7 +753,7 @@ def extra_table_metadata( # pylint: disable=unused-argument @classmethod def apply_limit_to_sql( - cls, sql: str, limit: int, database: "Database", force: bool = False + cls, sql: str, limit: int, database: Database, force: bool = False ) -> str: """ Alters the SQL statement to apply a LIMIT clause @@ -789,14 +888,14 @@ def get_cte_query(cls, sql: str) -> Optional[str]: # extract rest of the SQLs after CTE remainder = "".join(str(token) for token in stmt.tokens[idx:]).strip() - return f"WITH {token.value},\n{CTE_ALIAS} AS (\n{remainder}\n)" + return f"WITH {token.value},\n{cls.cte_alias} AS (\n{remainder}\n)" return None @classmethod def df_to_sql( cls, - database: "Database", + database: Database, table: Table, df: pd.DataFrame, to_sql_kwargs: Dict[str, Any], @@ -816,17 +915,17 @@ def df_to_sql( :param to_sql_kwargs: The kwargs to be passed to pandas.DataFrame.to_sql` method """ - engine = cls.get_engine(database) to_sql_kwargs["name"] = table.table if table.schema: # Only add schema when it is preset and non empty. to_sql_kwargs["schema"] = table.schema - if engine.dialect.supports_multivalues_insert: - to_sql_kwargs["method"] = "multi" + with cls.get_engine(database) as engine: + if engine.dialect.supports_multivalues_insert: + to_sql_kwargs["method"] = "multi" - df.to_sql(con=engine, **to_sql_kwargs) + df.to_sql(con=engine, **to_sql_kwargs) @classmethod def convert_dttm( # pylint: disable=unused-argument @@ -842,48 +941,6 @@ def convert_dttm( # pylint: disable=unused-argument """ return None - @classmethod - def get_all_datasource_names( - cls, database: "Database", datasource_type: str - ) -> List[utils.DatasourceName]: - """Returns a list of all tables or views in database. - - :param database: Database instance - :param datasource_type: Datasource_type can be 'table' or 'view' - :return: List of all datasources in database or schema - """ - # TODO: Fix circular import caused by importing Database - schemas = database.get_all_schema_names( - cache=database.schema_cache_enabled, - cache_timeout=database.schema_cache_timeout, - force=True, - ) - all_datasources: List[utils.DatasourceName] = [] - for schema in schemas: - if datasource_type == "table": - all_datasources.extend( - utils.DatasourceName(*datasource_name) - for datasource_name in database.get_all_table_names_in_schema( - schema=schema, - force=True, - cache=database.table_cache_enabled, - cache_timeout=database.table_cache_timeout, - ) - ) - elif datasource_type == "view": - all_datasources.extend( - utils.DatasourceName(*datasource_name) - for datasource_name in database.get_all_view_names_in_schema( - schema=schema, - force=True, - cache=database.table_cache_enabled, - cache_timeout=database.table_cache_timeout, - ) - ) - else: - raise Exception(f"Unsupported datasource_type: {datasource_type}") - return all_datasources - @classmethod def handle_cursor(cls, cursor: Any, query: Query, session: Session) -> None: """Handle a live cursor between the execute and fetchall calls @@ -933,9 +990,13 @@ def extract_errors( ] @classmethod - def adjust_database_uri(cls, uri: URL, selected_schema: Optional[str]) -> None: + def adjust_database_uri( # pylint: disable=unused-argument + cls, + uri: URL, + selected_schema: Optional[str], + ) -> URL: """ - Mutate the database component of the SQLAlchemy URI. + Return a modified URL with a new database component. The URI here represents the URI as entered when saving the database, ``selected_schema`` is the schema currently active presumably in @@ -949,9 +1010,10 @@ def adjust_database_uri(cls, uri: URL, selected_schema: Optional[str]) -> None: For those it's probably better to not alter the database component of the URI with the schema name, it won't work. - Some database drivers like presto accept '{catalog}/{schema}' in + Some database drivers like Presto accept '{catalog}/{schema}' in the database component of the URL, that can be handled here. """ + return uri @classmethod def patch(cls) -> None: @@ -972,42 +1034,58 @@ def get_schema_names(cls, inspector: Inspector) -> List[str]: @classmethod def get_table_names( # pylint: disable=unused-argument cls, - database: "Database", + database: Database, inspector: Inspector, schema: Optional[str], - ) -> List[str]: + ) -> Set[str]: """ - Get all tables from schema + Get all the real table names within the specified schema. - :param database: The database to get info - :param inspector: SqlAlchemy inspector - :param schema: Schema to inspect. If omitted, uses default schema for database - :return: All tables in schema + Per the SQLAlchemy definition if the schema is omitted the database’s default + schema is used, however some dialects infer the request as schema agnostic. + + :param database: The database to inspect + :param inspector: The SQLAlchemy inspector + :param schema: The schema to inspect + :returns: The physical table names """ - tables = inspector.get_table_names(schema) + + try: + tables = set(inspector.get_table_names(schema)) + except Exception as ex: + raise cls.get_dbapi_mapped_exception(ex) from ex + if schema and cls.try_remove_schema_from_table_name: - tables = [re.sub(f"^{schema}\\.", "", table) for table in tables] - return sorted(tables) + tables = {re.sub(f"^{schema}\\.", "", table) for table in tables} + return tables @classmethod def get_view_names( # pylint: disable=unused-argument cls, - database: "Database", + database: Database, inspector: Inspector, schema: Optional[str], - ) -> List[str]: + ) -> Set[str]: """ - Get all views from schema + Get all the view names within the specified schema. - :param database: The database to get info - :param inspector: SqlAlchemy inspector - :param schema: Schema name. If omitted, uses default schema for database - :return: All views in schema + Per the SQLAlchemy definition if the schema is omitted the database’s default + schema is used, however some dialects infer the request as schema agnostic. + + :param database: The database to inspect + :param inspector: The SQLAlchemy inspector + :param schema: The schema to inspect + :returns: The view names """ - views = inspector.get_view_names(schema) + + try: + views = set(inspector.get_view_names(schema)) + except Exception as ex: + raise cls.get_dbapi_mapped_exception(ex) from ex + if schema and cls.try_remove_schema_from_table_name: - views = [re.sub(f"^{schema}\\.", "", view) for view in views] - return sorted(views) + views = {re.sub(f"^{schema}\\.", "", view) for view in views} + return views @classmethod def get_table_comment( @@ -1047,12 +1125,32 @@ def get_columns( """ return inspector.get_columns(table_name, schema) + @classmethod + def get_metrics( # pylint: disable=unused-argument + cls, + database: Database, + inspector: Inspector, + table_name: str, + schema: Optional[str], + ) -> List[MetricType]: + """ + Get all metrics from a given schema and table. + """ + return [ + { + "metric_name": "count", + "verbose_name": "COUNT(*)", + "metric_type": "count", + "expression": "COUNT(*)", + } + ] + @classmethod def where_latest_partition( # pylint: disable=too-many-arguments,unused-argument cls, table_name: str, schema: Optional[str], - database: "Database", + database: Database, query: Select, columns: Optional[List[Dict[str, str]]] = None, ) -> Optional[Select]: @@ -1077,7 +1175,7 @@ def _get_fields(cls, cols: List[Dict[str, Any]]) -> List[Any]: @classmethod def select_star( # pylint: disable=too-many-arguments,too-many-locals cls, - database: "Database", + database: Database, table_name: str, engine: Engine, schema: Optional[str] = None, @@ -1156,7 +1254,7 @@ def query_cost_formatter( raise Exception("Database does not support cost estimation") @classmethod - def process_statement(cls, statement: str, database: "Database") -> str: + def process_statement(cls, statement: str, database: Database) -> str: """ Process a SQL statement by stripping and mutating it. @@ -1167,7 +1265,8 @@ def process_statement(cls, statement: str, database: "Database") -> str: parsed_query = ParsedQuery(statement) sql = parsed_query.stripped() sql_query_mutator = current_app.config["SQL_QUERY_MUTATOR"] - if sql_query_mutator: + mutate_after_split = current_app.config["MUTATE_AFTER_SPLIT"] + if sql_query_mutator and not mutate_after_split: sql = sql_query_mutator( sql, user_name=get_username(), # TODO(john-bodley): Deprecate in 3.0. @@ -1179,7 +1278,11 @@ def process_statement(cls, statement: str, database: "Database") -> str: @classmethod def estimate_query_cost( - cls, database: "Database", schema: str, sql: str, source: Optional[str] = None + cls, + database: Database, + schema: str, + sql: str, + source: Optional[utils.QuerySource] = None, ) -> List[Dict[str, Any]]: """ Estimate the cost of a multiple statement SQL query. @@ -1196,27 +1299,14 @@ def estimate_query_cost( parsed_query = sql_parse.ParsedQuery(sql) statements = parsed_query.get_statements() - engine = cls.get_engine(database, schema=schema, source=source) costs = [] - with closing(engine.raw_connection()) as conn: + with database.get_raw_connection(schema=schema, source=source) as conn: cursor = conn.cursor() for statement in statements: processed_statement = cls.process_statement(statement, database) costs.append(cls.estimate_statement_cost(processed_statement, cursor)) - return costs - @classmethod - def modify_url_for_impersonation( - cls, url: URL, impersonate_user: bool, username: Optional[str] - ) -> None: - """ - Modify the SQL Alchemy URL object with the user to impersonate if applicable. - :param url: SQLAlchemy URL object - :param impersonate_user: Flag indicating if impersonation is enabled - :param username: Effective username - """ - if impersonate_user and username is not None: - url.username = username + return costs @classmethod def update_impersonation_config( @@ -1258,7 +1348,7 @@ def execute( # pylint: disable=unused-argument try: cursor.execute(query) except Exception as ex: - raise cls.get_dbapi_mapped_exception(ex) + raise cls.get_dbapi_mapped_exception(ex) from ex @classmethod def make_label_compatible(cls, label: str) -> Union[str, quoted_name]: @@ -1284,24 +1374,25 @@ def make_label_compatible(cls, label: str) -> Union[str, quoted_name]: return label_mutated @classmethod - def get_sqla_column_type( + def get_column_types( cls, column_type: Optional[str], - column_type_mappings: Tuple[ColumnTypeMapping, ...] = column_type_mappings, ) -> Optional[Tuple[TypeEngine, GenericDataType]]: """ - Return a sqlalchemy native column type that corresponds to the column type - defined in the data source (return None to use default type inferred by - SQLAlchemy). Override `column_type_mappings` for specific needs + Return a sqlalchemy native column type and generic data type that corresponds + to the column type defined in the data source (return None to use default type + inferred by SQLAlchemy). Override `column_type_mappings` for specific needs (see MSSQL for example of NCHAR/NVARCHAR handling). :param column_type: Column type returned by inspector - :param column_type_mappings: Maps from string to SqlAlchemy TypeEngine - :return: SqlAlchemy column type + :return: SQLAlchemy and generic Superset column types """ if not column_type: return None - for regex, sqla_type, generic_type in column_type_mappings: + + for regex, sqla_type, generic_type in ( + cls.column_type_mappings + cls._default_column_type_mappings + ): match = regex.match(column_type) if not match: continue @@ -1382,7 +1473,7 @@ def column_datatype_to_string( @classmethod def get_function_names( # pylint: disable=unused-argument cls, - database: "Database", + database: Database, ) -> List[str]: """ Get a list of function names that are able to be called on the database. @@ -1407,7 +1498,7 @@ def pyodbc_rows_to_tuples(data: List[Any]) -> List[Tuple[Any, ...]]: @staticmethod def mutate_db_for_connection_test( # pylint: disable=unused-argument - database: "Database", + database: Database, ) -> None: """ Some databases require passing additional parameters for validating database @@ -1419,7 +1510,7 @@ def mutate_db_for_connection_test( # pylint: disable=unused-argument return None @staticmethod - def get_extra_params(database: "Database") -> Dict[str, Any]: + def get_extra_params(database: Database) -> Dict[str, Any]: """ Some databases require adding elements to connection parameters, like passing certificates to `extra`. This can be done here. @@ -1436,26 +1527,6 @@ def get_extra_params(database: "Database") -> Dict[str, Any]: raise ex return extra - @staticmethod - def update_encrypted_extra_params( - database: "Database", params: Dict[str, Any] - ) -> None: - """ - Some databases require some sensitive information which do not conform to - the username:password syntax normally used by SQLAlchemy. - - :param database: database instance from which to extract extras - :param params: params to be updated - """ - if not database.encrypted_extra: - return - try: - encrypted_extra = json.loads(database.encrypted_extra) - params.update(encrypted_extra) - except json.JSONDecodeError as ex: - logger.error(ex, exc_info=True) - raise ex - @staticmethod def update_params_from_encrypted_extra( # pylint: disable=invalid-name database: "Database", params: Dict[str, Any] @@ -1498,19 +1569,16 @@ def get_column_spec( # pylint: disable=unused-argument native_type: Optional[str], db_extra: Optional[Dict[str, Any]] = None, source: utils.ColumnTypeSource = utils.ColumnTypeSource.GET_TABLE, - column_type_mappings: Tuple[ColumnTypeMapping, ...] = column_type_mappings, ) -> Optional[ColumnSpec]: """ - Converts native database type to sqlalchemy column type. + Get generic type related specs regarding a native column type. + :param native_type: Native database type :param db_extra: The database extra object :param source: Type coming from the database table or cursor description - :param column_type_mappings: Maps from string to SqlAlchemy TypeEngine :return: ColumnSpec object """ - col_types = cls.get_sqla_column_type( - native_type, column_type_mappings=column_type_mappings - ) + col_types = cls.get_column_types(native_type) if col_types: column_type, generic_type = col_types is_dttm = generic_type == GenericDataType.TEMPORAL @@ -1519,11 +1587,44 @@ def get_column_spec( # pylint: disable=unused-argument ) return None + @classmethod + def get_sqla_column_type( + cls, + native_type: Optional[str], + db_extra: Optional[Dict[str, Any]] = None, + source: utils.ColumnTypeSource = utils.ColumnTypeSource.GET_TABLE, + ) -> Optional[TypeEngine]: + """ + Converts native database type to sqlalchemy column type. + + :param native_type: Native database type + :param db_extra: The database extra object + :param source: Type coming from the database table or cursor description + :return: ColumnSpec object + """ + column_spec = cls.get_column_spec( + native_type=native_type, + db_extra=db_extra, + source=source, + ) + return column_spec.sqla_type if column_spec else None + + # pylint: disable=unused-argument + @classmethod + def prepare_cancel_query(cls, query: Query, session: Session) -> None: + """ + Some databases may acquire the query cancelation id after the query + cancelation request has been received. For those cases, the db engine spec + can record the cancelation intent so that the query can either be stopped + prior to execution, or canceled once the query id is acquired. + """ + return None + @classmethod def has_implicit_cancel(cls) -> bool: """ Return True if the live cursor handles the implicit cancelation of the query, - False otherise. + False otherwise. :return: Whether the live cursor implicitly cancels the query :see: handle_cursor @@ -1583,6 +1684,45 @@ def get_impersonation_key(cls, user: Optional[User]) -> Any: """ return user.username if user else None + @classmethod + def mask_encrypted_extra(cls, encrypted_extra: Optional[str]) -> Optional[str]: + """ + Mask ``encrypted_extra``. + + This is used to remove any sensitive data in ``encrypted_extra`` when presenting + it to the user. For example, a private key might be replaced with a masked value + "XXXXXXXXXX". If the masked value is changed the corresponding entry is updated, + otherwise the old value is used (see ``unmask_encrypted_extra`` below). + """ + return encrypted_extra + + # pylint: disable=unused-argument + @classmethod + def unmask_encrypted_extra( + cls, old: Optional[str], new: Optional[str] + ) -> Optional[str]: + """ + Remove masks from ``encrypted_extra``. + + This method allows reusing existing values from the current encrypted extra on + updates. It's useful for reusing masked passwords, allowing keys to be updated + without having to provide sensitive data to the client. + """ + return new + + @classmethod + def get_public_information(cls) -> Dict[str, Any]: + """ + Construct a Dict with properties we want to expose. + + :returns: Dict with properties of our class like supports_file_upload + and disable_ssh_tunneling + """ + return { + "supports_file_upload": cls.supports_file_upload, + "disable_ssh_tunneling": cls.disable_ssh_tunneling, + } + # schema for adding a database by providing parameters instead of the # full SQLAlchemy URI @@ -1614,6 +1754,10 @@ class BasicParametersType(TypedDict, total=False): encryption: bool +class BasicPropertiesType(TypedDict): + parameters: BasicParametersType + + class BasicParametersMixin: """ Mixin for configuring DB engine specs via a dictionary. @@ -1645,7 +1789,7 @@ class BasicParametersMixin: def build_sqlalchemy_uri( # pylint: disable=unused-argument cls, parameters: BasicParametersType, - encryted_extra: Optional[Dict[str, str]] = None, + encrypted_extra: Optional[Dict[str, str]] = None, ) -> str: # make a copy so that we don't update the original query = parameters.get("query", {}).copy() @@ -1691,7 +1835,7 @@ def get_parameters_from_uri( # pylint: disable=unused-argument @classmethod def validate_parameters( - cls, parameters: BasicParametersType + cls, properties: BasicPropertiesType ) -> List[SupersetError]: """ Validates any number of parameters, for progressive validation. @@ -1702,6 +1846,7 @@ def validate_parameters( errors: List[SupersetError] = [] required = {"host", "port", "username", "database"} + parameters = properties.get("parameters", {}) present = {key for key in parameters if parameters.get(key, ())} missing = sorted(required - present) diff --git a/superset/db_engine_specs/bigquery.py b/superset/db_engine_specs/bigquery.py index 51fd710ab335..171dad473250 100644 --- a/superset/db_engine_specs/bigquery.py +++ b/superset/db_engine_specs/bigquery.py @@ -26,15 +26,17 @@ from flask_babel import gettext as __ from marshmallow import fields, Schema from marshmallow.exceptions import ValidationError -from sqlalchemy import column +from sqlalchemy import column, types from sqlalchemy.engine.base import Engine from sqlalchemy.sql import sqltypes from typing_extensions import TypedDict +from superset import sql_parse +from superset.constants import PASSWORD_MASK from superset.databases.schemas import encrypted_field_properties, EncryptedString from superset.databases.utils import make_url_safe -from superset.db_engine_specs.base import BaseEngineSpec -from superset.db_engine_specs.exceptions import SupersetDBAPIDisconnectionError +from superset.db_engine_specs.base import BaseEngineSpec, BasicPropertiesType +from superset.db_engine_specs.exceptions import SupersetDBAPIConnectionError from superset.errors import SupersetError, SupersetErrorType from superset.sql_parse import Table from superset.utils import core as utils @@ -45,8 +47,8 @@ CONNECTION_DATABASE_PERMISSIONS_REGEX = re.compile( - "Access Denied: Project User does not have bigquery.jobs.create " - + "permission in project (?P<project>.+?)" + "Access Denied: Project (?P<project_name>.+?): User does not have " + + "bigquery.jobs.create permission in project (?P<project>.+?)" ) TABLE_DOES_NOT_EXIST_REGEX = re.compile( @@ -91,6 +93,7 @@ class BigQueryEngineSpec(BaseEngineSpec): engine = "bigquery" engine_name = "Google BigQuery" max_column_name_length = 128 + disable_ssh_tunneling = True parameters_schema = BigQueryParametersSchema() default_driver = "bigquery" @@ -104,13 +107,13 @@ class BigQueryEngineSpec(BaseEngineSpec): """ https://www.python.org/dev/peps/pep-0249/#arraysize - raw_connections bypass the pybigquery query execution context and deal with + raw_connections bypass the sqlalchemy-bigquery query execution context and deal with raw dbapi connection directly. If this value is not set, the default value is set to 1, as described here, https://googlecloudplatform.github.io/google-cloud-python/latest/_modules/google/cloud/bigquery/dbapi/cursor.html#Cursor - The default value of 5000 is derived from the pybigquery. - https://github.com/mxmzdlv/pybigquery/blob/d214bb089ca0807ca9aaa6ce4d5a01172d40264e/pybigquery/sqlalchemy_bigquery.py#L102 + The default value of 5000 is derived from the sqlalchemy-bigquery. + https://github.com/googleapis/python-bigquery-sqlalchemy/blob/4e17259088f89eac155adc19e0985278a29ecf9c/sqlalchemy_bigquery/base.py#L762 """ arraysize = 5000 @@ -153,9 +156,12 @@ class BigQueryEngineSpec(BaseEngineSpec): custom_errors: Dict[Pattern[str], Tuple[str, SupersetErrorType, Dict[str, Any]]] = { CONNECTION_DATABASE_PERMISSIONS_REGEX: ( __( - "We were unable to connect to your database. Please " - "confirm that your service account has the Viewer " - "and Job User roles on the project." + "Unable to connect. Verify that the following roles are set " + 'on the service account: "BigQuery Data Viewer", ' + '"BigQuery Metadata Viewer", "BigQuery Job User" ' + "and the following permissions are set " + '"bigquery.readsessions.create", ' + '"bigquery.readsessions.getData"' ), SupersetErrorType.CONNECTION_DATABASE_PERMISSIONS_ERROR, {}, @@ -195,15 +201,15 @@ class BigQueryEngineSpec(BaseEngineSpec): def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + if isinstance(sqla_type, types.Date): return f"CAST('{dttm.date().isoformat()}' AS DATE)" - if tt == utils.TemporalType.DATETIME: + if isinstance(sqla_type, types.TIMESTAMP): + return f"""CAST('{dttm.isoformat(timespec="microseconds")}' AS TIMESTAMP)""" + if isinstance(sqla_type, types.DateTime): return f"""CAST('{dttm.isoformat(timespec="microseconds")}' AS DATETIME)""" - if tt == utils.TemporalType.TIME: + if isinstance(sqla_type, types.Time): return f"""CAST('{dttm.strftime("%H:%M:%S.%f")}' AS TIME)""" - if tt == utils.TemporalType.TIMESTAMP: - return f"""CAST('{dttm.isoformat(timespec="microseconds")}' AS TIMESTAMP)""" return None @classmethod @@ -336,8 +342,12 @@ def df_to_sql( if not table.schema: raise Exception("The table schema must be defined") - engine = cls.get_engine(database) - to_gbq_kwargs = {"destination_table": str(table), "project_id": engine.url.host} + to_gbq_kwargs = {} + with cls.get_engine(database) as engine: + to_gbq_kwargs = { + "destination_table": str(table), + "project_id": engine.url.host, + } # Add credentials if they are set on the SQLAlchemy dialect. creds = engine.dialect.credentials_info @@ -356,6 +366,97 @@ def df_to_sql( pandas_gbq.to_gbq(df, **to_gbq_kwargs) + @classmethod + def estimate_query_cost( + cls, + database: "Database", + schema: str, + sql: str, + source: Optional[utils.QuerySource] = None, + ) -> List[Dict[str, Any]]: + """ + Estimate the cost of a multiple statement SQL query. + + :param database: Database instance + :param schema: Database schema + :param sql: SQL query with possibly multiple statements + :param source: Source of the query (eg, "sql_lab") + """ + extra = database.get_extra() or {} + if not cls.get_allow_cost_estimate(extra): + raise Exception("Database does not support cost estimation") + + parsed_query = sql_parse.ParsedQuery(sql) + statements = parsed_query.get_statements() + costs = [] + for statement in statements: + processed_statement = cls.process_statement(statement, database) + + costs.append(cls.estimate_statement_cost(processed_statement, database)) + return costs + + @classmethod + def get_allow_cost_estimate(cls, extra: Dict[str, Any]) -> bool: + return True + + @classmethod + def estimate_statement_cost(cls, statement: str, cursor: Any) -> Dict[str, Any]: + try: + # pylint: disable=import-outside-toplevel + # It's the only way to perfom a dry-run estimate cost + from google.cloud import bigquery + from google.oauth2 import service_account + except ImportError as ex: + raise Exception( + "Could not import libraries `pygibquery` or `google.oauth2`, which are " + "required to be installed in your environment in order " + "to upload data to BigQuery" + ) from ex + + with cls.get_engine(cursor) as engine: + creds = engine.dialect.credentials_info + + creds = service_account.Credentials.from_service_account_info(creds) + client = bigquery.Client(credentials=creds) + job_config = bigquery.QueryJobConfig(dry_run=True) + + query_job = client.query( + statement, + job_config=job_config, + ) # Make an API request. + + # Format Bytes. + # TODO: Humanize in case more db engine specs need to be added, + # this should be made a function outside this scope. + byte_division = 1024 + if hasattr(query_job, "total_bytes_processed"): + query_bytes_processed = query_job.total_bytes_processed + if query_bytes_processed // byte_division == 0: + byte_type = "B" + total_bytes_processed = query_bytes_processed + elif query_bytes_processed // (byte_division**2) == 0: + byte_type = "KB" + total_bytes_processed = round(query_bytes_processed / byte_division, 2) + elif query_bytes_processed // (byte_division**3) == 0: + byte_type = "MB" + total_bytes_processed = round( + query_bytes_processed / (byte_division**2), 2 + ) + else: + byte_type = "GB" + total_bytes_processed = round( + query_bytes_processed / (byte_division**3), 2 + ) + + return {f"{byte_type} Processed": total_bytes_processed} + return {} + + @classmethod + def query_cost_formatter( + cls, raw_cost: List[Dict[str, Any]] + ) -> List[Dict[str, str]]: + return [{k: str(v) for k, v in row.items()} for row in raw_cost] + @classmethod def build_sqlalchemy_uri( cls, @@ -380,26 +481,77 @@ def build_sqlalchemy_uri( @classmethod def get_parameters_from_uri( - cls, uri: str, encrypted_extra: Optional[Dict[str, str]] = None + cls, + uri: str, + encrypted_extra: Optional[Dict[str, Any]] = None, ) -> Any: value = make_url_safe(uri) # Building parameters from encrypted_extra and uri if encrypted_extra: - return {**encrypted_extra, "query": value.query} + # ``value.query`` needs to be explicitly converted into a dict (from an + # ``immutabledict``) so that it can be JSON serialized + return {**encrypted_extra, "query": dict(value.query)} raise ValidationError("Invalid service credentials") + @classmethod + def mask_encrypted_extra(cls, encrypted_extra: Optional[str]) -> Optional[str]: + if encrypted_extra is None: + return encrypted_extra + + try: + config = json.loads(encrypted_extra) + except (json.JSONDecodeError, TypeError): + return encrypted_extra + + try: + config["credentials_info"]["private_key"] = PASSWORD_MASK + except KeyError: + pass + + return json.dumps(config) + + @classmethod + def unmask_encrypted_extra( + cls, old: Optional[str], new: Optional[str] + ) -> Optional[str]: + """ + Reuse ``private_key`` if available and unchanged. + """ + if old is None or new is None: + return new + + try: + old_config = json.loads(old) + new_config = json.loads(new) + except (TypeError, json.JSONDecodeError): + return new + + if "credentials_info" not in new_config: + return new + + if "private_key" not in new_config["credentials_info"]: + return new + + if new_config["credentials_info"]["private_key"] == PASSWORD_MASK: + new_config["credentials_info"]["private_key"] = old_config[ + "credentials_info" + ]["private_key"] + + return json.dumps(new_config) + @classmethod def get_dbapi_exception_mapping(cls) -> Dict[Type[Exception], Type[Exception]]: # pylint: disable=import-outside-toplevel from google.auth.exceptions import DefaultCredentialsError - return {DefaultCredentialsError: SupersetDBAPIDisconnectionError} + return {DefaultCredentialsError: SupersetDBAPIConnectionError} @classmethod def validate_parameters( - cls, parameters: BigQueryParametersType # pylint: disable=unused-argument + cls, + properties: BasicPropertiesType, # pylint: disable=unused-argument ) -> List[SupersetError]: return [] @@ -523,3 +675,12 @@ def _get_fields(cls, cols: List[Dict[str, Any]]) -> List[Any]: "author__name" and "author__email", respectively. """ return [column(c["name"]).label(c["name"].replace(".", "__")) for c in cols] + + @classmethod + def parse_error_exception(cls, exception: Exception) -> Exception: + try: + return Exception(str(exception).splitlines()[0].strip()) + except Exception: # pylint: disable=broad-except + # If for some reason we get an exception, for example, no new line + # We will return the original exception + return exception diff --git a/superset/db_engine_specs/clickhouse.py b/superset/db_engine_specs/clickhouse.py index 4f34d2a5543c..930aeee52839 100644 --- a/superset/db_engine_specs/clickhouse.py +++ b/superset/db_engine_specs/clickhouse.py @@ -18,12 +18,12 @@ from datetime import datetime from typing import Any, Dict, List, Optional, Type, TYPE_CHECKING +from sqlalchemy import types from urllib3.exceptions import NewConnectionError from superset.db_engine_specs.base import BaseEngineSpec from superset.db_engine_specs.exceptions import SupersetDBAPIDatabaseError from superset.extensions import cache_manager -from superset.utils import core as utils if TYPE_CHECKING: # prevent circular imports @@ -58,6 +58,8 @@ class ClickHouseEngineSpec(BaseEngineSpec): # pylint: disable=abstract-method _show_functions_column = "name" + supports_file_upload = False + @classmethod def get_dbapi_exception_mapping(cls) -> Dict[Type[Exception], Type[Exception]]: return {NewConnectionError: SupersetDBAPIDatabaseError} @@ -75,10 +77,11 @@ def get_dbapi_mapped_exception(cls, exception: Exception) -> Exception: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"toDate('{dttm.date().isoformat()}')" - if tt == utils.TemporalType.DATETIME: + if isinstance(sqla_type, types.DateTime): return f"""toDateTime('{dttm.isoformat(sep=" ", timespec="seconds")}')""" return None diff --git a/superset/db_engine_specs/crate.py b/superset/db_engine_specs/crate.py index 4d934c448c35..7cf7bed15d9c 100644 --- a/superset/db_engine_specs/crate.py +++ b/superset/db_engine_specs/crate.py @@ -14,11 +14,14 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +from __future__ import annotations + from datetime import datetime from typing import Any, Dict, Optional, TYPE_CHECKING +from sqlalchemy import types + from superset.db_engine_specs.base import BaseEngineSpec -from superset.utils import core as utils if TYPE_CHECKING: from superset.connectors.sqla.models import TableColumn @@ -53,12 +56,13 @@ def epoch_ms_to_dttm(cls) -> str: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.TIMESTAMP: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.TIMESTAMP): return f"{dttm.timestamp() * 1000}" return None @classmethod - def alter_new_orm_column(cls, orm_col: "TableColumn") -> None: + def alter_new_orm_column(cls, orm_col: TableColumn) -> None: if orm_col.type == "TIMESTAMP": orm_col.python_date_format = "epoch_ms" diff --git a/superset/db_engine_specs/databricks.py b/superset/db_engine_specs/databricks.py index d010b520d0b0..df82b6d2f93e 100644 --- a/superset/db_engine_specs/databricks.py +++ b/superset/db_engine_specs/databricks.py @@ -13,13 +13,84 @@ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations -# under the License.o +# under the License. +import json from datetime import datetime -from typing import Any, Dict, Optional +from typing import Any, Dict, List, Optional, Set, TYPE_CHECKING -from superset.db_engine_specs.base import BaseEngineSpec +from apispec import APISpec +from apispec.ext.marshmallow import MarshmallowPlugin +from flask_babel import gettext as __ +from marshmallow import fields, Schema +from marshmallow.validate import Range +from sqlalchemy.engine.reflection import Inspector +from sqlalchemy.engine.url import URL +from typing_extensions import TypedDict + +from superset.constants import USER_AGENT +from superset.databases.utils import make_url_safe +from superset.db_engine_specs.base import BaseEngineSpec, BasicParametersMixin from superset.db_engine_specs.hive import HiveEngineSpec +from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from superset.utils.network import is_hostname_valid, is_port_open + +if TYPE_CHECKING: + from superset.models.core import Database + + +class DatabricksParametersSchema(Schema): + """ + This is the list of fields that are expected + from the client in order to build the sqlalchemy string + """ + + access_token = fields.Str(required=True) + host = fields.Str(required=True) + port = fields.Integer( + required=True, + description=__("Database port"), + validate=Range(min=0, max=2**16, max_inclusive=False), + ) + database = fields.Str(required=True) + encryption = fields.Boolean( + required=False, description=__("Use an encrypted connection to the database") + ) + + +class DatabricksPropertiesSchema(DatabricksParametersSchema): + """ + This is the list of fields expected + for successful database creation execution + """ + + http_path = fields.Str(required=True) + + +class DatabricksParametersType(TypedDict): + """ + The parameters are all the keys that do + not exist on the Database model. + These are used to build the sqlalchemy uri + """ + + access_token: str + host: str + port: int + database: str + encryption: bool + + +class DatabricksPropertiesType(TypedDict): + """ + All properties that need to be available to + this engine in order to create a connection + if the dynamic form is used + """ + + parameters: DatabricksParametersType + extra: str + time_grain_expressions = { None: "{col}", @@ -41,18 +112,23 @@ class DatabricksHiveEngineSpec(HiveEngineSpec): - engine = "databricks" engine_name = "Databricks Interactive Cluster" - driver = "pyhive" + + engine = "databricks" + drivers = {"pyhive": "Hive driver for Interactive Cluster"} + default_driver = "pyhive" + _show_functions_column = "function" _time_grain_expressions = time_grain_expressions class DatabricksODBCEngineSpec(BaseEngineSpec): - engine = "databricks" engine_name = "Databricks SQL Endpoint" - driver = "pyodbc" + + engine = "databricks" + drivers = {"pyodbc": "ODBC driver for SQL endpoint"} + default_driver = "pyodbc" _time_grain_expressions = time_grain_expressions @@ -67,7 +143,225 @@ def epoch_to_dttm(cls) -> str: return HiveEngineSpec.epoch_to_dttm() -class DatabricksNativeEngineSpec(DatabricksODBCEngineSpec): +class DatabricksNativeEngineSpec(DatabricksODBCEngineSpec, BasicParametersMixin): + engine_name = "Databricks" + engine = "databricks" - engine_name = "Databricks Native Connector" - driver = "connector" + drivers = {"connector": "Native all-purpose driver"} + default_driver = "connector" + + parameters_schema = DatabricksParametersSchema() + properties_schema = DatabricksPropertiesSchema() + + sqlalchemy_uri_placeholder = ( + "databricks+connector://token:{access_token}@{host}:{port}/{database_name}" + ) + encryption_parameters = {"ssl": "1"} + + @staticmethod + def get_extra_params(database: "Database") -> Dict[str, Any]: + """ + Add a user agent to be used in the requests. + Trim whitespace from connect_args to avoid databricks driver errors + """ + extra: Dict[str, Any] = BaseEngineSpec.get_extra_params(database) + engine_params: Dict[str, Any] = extra.setdefault("engine_params", {}) + connect_args: Dict[str, Any] = engine_params.setdefault("connect_args", {}) + + connect_args.setdefault("http_headers", [("User-Agent", USER_AGENT)]) + connect_args.setdefault("_user_agent_entry", USER_AGENT) + + # trim whitespace from http_path to avoid databricks errors on connecting + if http_path := connect_args.get("http_path"): + connect_args["http_path"] = http_path.strip() + + return extra + + @classmethod + def get_table_names( + cls, + database: "Database", + inspector: Inspector, + schema: Optional[str], + ) -> Set[str]: + return super().get_table_names( + database, inspector, schema + ) - cls.get_view_names(database, inspector, schema) + + @classmethod + def build_sqlalchemy_uri( # type: ignore + cls, parameters: DatabricksParametersType, *_ + ) -> str: + + query = {} + if parameters.get("encryption"): + if not cls.encryption_parameters: + raise Exception("Unable to build a URL with encryption enabled") + query.update(cls.encryption_parameters) + + return str( + URL( + f"{cls.engine}+{cls.default_driver}".rstrip("+"), + username="token", + password=parameters.get("access_token"), + host=parameters["host"], + port=parameters["port"], + database=parameters["database"], + query=query, + ) + ) + + @classmethod + def extract_errors( + cls, ex: Exception, context: Optional[Dict[str, Any]] = None + ) -> List[SupersetError]: + raw_message = cls._extract_error_message(ex) + + context = context or {} + # access_token isn't currently parseable from the + # databricks error response, but adding it in here + # for reference if their error message changes + context = { + "host": context.get("hostname"), + "access_token": context.get("password"), + "port": context.get("port"), + "username": context.get("username"), + "database": context.get("database"), + } + for regex, (message, error_type, extra) in cls.custom_errors.items(): + match = regex.search(raw_message) + if match: + params = {**context, **match.groupdict()} + extra["engine_name"] = cls.engine_name + return [ + SupersetError( + error_type=error_type, + message=message % params, + level=ErrorLevel.ERROR, + extra=extra, + ) + ] + + return [ + SupersetError( + error_type=SupersetErrorType.GENERIC_DB_ENGINE_ERROR, + message=cls._extract_error_message(ex), + level=ErrorLevel.ERROR, + extra={"engine_name": cls.engine_name}, + ) + ] + + @classmethod + def get_parameters_from_uri( # type: ignore + cls, uri: str, *_, **__ + ) -> DatabricksParametersType: + url = make_url_safe(uri) + encryption = all( + item in url.query.items() for item in cls.encryption_parameters.items() + ) + return { + "access_token": url.password, + "host": url.host, + "port": url.port, + "database": url.database, + "encryption": encryption, + } + + @classmethod + def validate_parameters( # type: ignore + cls, + properties: DatabricksPropertiesType, + ) -> List[SupersetError]: + errors: List[SupersetError] = [] + required = {"access_token", "host", "port", "database", "extra"} + extra = json.loads(properties.get("extra", "{}")) + engine_params = extra.get("engine_params", {}) + connect_args = engine_params.get("connect_args", {}) + parameters = { + **properties, + **properties.get("parameters", {}), + } + if connect_args.get("http_path"): + parameters["http_path"] = connect_args.get("http_path") + + present = {key for key in parameters if parameters.get(key, ())} + missing = sorted(required - present) + + if missing: + errors.append( + SupersetError( + message=f'One or more parameters are missing: {", ".join(missing)}', + error_type=SupersetErrorType.CONNECTION_MISSING_PARAMETERS_ERROR, + level=ErrorLevel.WARNING, + extra={"missing": missing}, + ), + ) + + host = parameters.get("host", None) + if not host: + return errors + + if not is_hostname_valid(host): # type: ignore + errors.append( + SupersetError( + message="The hostname provided can't be resolved.", + error_type=SupersetErrorType.CONNECTION_INVALID_HOSTNAME_ERROR, + level=ErrorLevel.ERROR, + extra={"invalid": ["host"]}, + ), + ) + return errors + + port = parameters.get("port", None) + if not port: + return errors + try: + port = int(port) # type: ignore + except (ValueError, TypeError): + errors.append( + SupersetError( + message="Port must be a valid integer.", + error_type=SupersetErrorType.CONNECTION_INVALID_PORT_ERROR, + level=ErrorLevel.ERROR, + extra={"invalid": ["port"]}, + ), + ) + if not (isinstance(port, int) and 0 <= port < 2**16): + errors.append( + SupersetError( + message=( + "The port must be an integer between 0 and 65535 " + "(inclusive)." + ), + error_type=SupersetErrorType.CONNECTION_INVALID_PORT_ERROR, + level=ErrorLevel.ERROR, + extra={"invalid": ["port"]}, + ), + ) + elif not is_port_open(host, port): # type: ignore + errors.append( + SupersetError( + message="The port is closed.", + error_type=SupersetErrorType.CONNECTION_PORT_CLOSED_ERROR, + level=ErrorLevel.ERROR, + extra={"invalid": ["port"]}, + ), + ) + return errors + + @classmethod + def parameters_json_schema(cls) -> Any: + """ + Return configuration parameters as OpenAPI. + """ + if not cls.properties_schema: + return None + + spec = APISpec( + title="Database Parameters", + version="1.0.0", + openapi_version="3.0.2", + plugins=[MarshmallowPlugin()], + ) + spec.components.schema(cls.__name__, schema=cls.properties_schema) + return spec.to_dict()["components"]["schemas"][cls.__name__] diff --git a/superset/db_engine_specs/dremio.py b/superset/db_engine_specs/dremio.py index fddba00b5fea..0c773e70938f 100644 --- a/superset/db_engine_specs/dremio.py +++ b/superset/db_engine_specs/dremio.py @@ -17,8 +17,9 @@ from datetime import datetime from typing import Any, Dict, Optional +from sqlalchemy import types + from superset.db_engine_specs.base import BaseEngineSpec -from superset.utils import core as utils class DremioEngineSpec(BaseEngineSpec): @@ -46,10 +47,11 @@ def epoch_to_dttm(cls) -> str: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"TO_DATE('{dttm.date().isoformat()}', 'YYYY-MM-DD')" - if tt == utils.TemporalType.TIMESTAMP: + if isinstance(sqla_type, types.TIMESTAMP): dttm_formatted = dttm.isoformat(sep=" ", timespec="milliseconds") return f"""TO_TIMESTAMP('{dttm_formatted}', 'YYYY-MM-DD HH24:MI:SS.FFF')""" return None diff --git a/superset/db_engine_specs/drill.py b/superset/db_engine_specs/drill.py index de8c8397f66b..756f74e82ac6 100644 --- a/superset/db_engine_specs/drill.py +++ b/superset/db_engine_specs/drill.py @@ -18,11 +18,11 @@ from typing import Any, Dict, Optional from urllib import parse +from sqlalchemy import types from sqlalchemy.engine.url import URL from superset.db_engine_specs.base import BaseEngineSpec from superset.db_engine_specs.exceptions import SupersetDBAPIProgrammingError -from superset.utils import core as utils class DrillEngineSpec(BaseEngineSpec): @@ -59,35 +59,41 @@ def epoch_ms_to_dttm(cls) -> str: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"TO_DATE('{dttm.date().isoformat()}', 'yyyy-MM-dd')" - if tt == utils.TemporalType.TIMESTAMP: + if isinstance(sqla_type, types.TIMESTAMP): datetime_formatted = dttm.isoformat(sep=" ", timespec="seconds") return f"""TO_TIMESTAMP('{datetime_formatted}', 'yyyy-MM-dd HH:mm:ss')""" return None @classmethod - def adjust_database_uri(cls, uri: URL, selected_schema: Optional[str]) -> None: + def adjust_database_uri(cls, uri: URL, selected_schema: Optional[str]) -> URL: if selected_schema: - uri.database = parse.quote(selected_schema, safe="") + uri = uri.set(database=parse.quote(selected_schema, safe="")) + + return uri @classmethod - def modify_url_for_impersonation( + def get_url_for_impersonation( cls, url: URL, impersonate_user: bool, username: Optional[str] - ) -> None: + ) -> URL: """ - Modify the SQL Alchemy URL object with the user to impersonate if applicable. + Return a modified URL with the username set. + :param url: SQLAlchemy URL object :param impersonate_user: Flag indicating if impersonation is enabled :param username: Effective username """ if impersonate_user and username is not None: if url.drivername == "drill+odbc": - url.query["DelegationUID"] = username + url = url.update_query_dict({"DelegationUID": username}) elif url.drivername in ["drill+sadrill", "drill+jdbc"]: - url.query["impersonation_target"] = username + url = url.update_query_dict({"impersonation_target": username}) else: raise SupersetDBAPIProgrammingError( f"impersonation is not supported for {url.drivername}" ) + + return url diff --git a/superset/db_engine_specs/druid.py b/superset/db_engine_specs/druid.py index d193daf5844b..83829ec22ac3 100644 --- a/superset/db_engine_specs/druid.py +++ b/superset/db_engine_specs/druid.py @@ -14,13 +14,20 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. + +from __future__ import annotations + import json import logging from datetime import datetime -from typing import Any, Dict, Optional, TYPE_CHECKING +from typing import Any, Dict, List, Optional, Type, TYPE_CHECKING + +from sqlalchemy import types +from sqlalchemy.engine.reflection import Inspector from superset import is_feature_enabled from superset.db_engine_specs.base import BaseEngineSpec +from superset.db_engine_specs.exceptions import SupersetDBAPIConnectionError from superset.exceptions import SupersetException from superset.utils import core as utils @@ -67,12 +74,12 @@ class DruidEngineSpec(BaseEngineSpec): } @classmethod - def alter_new_orm_column(cls, orm_col: "TableColumn") -> None: + def alter_new_orm_column(cls, orm_col: TableColumn) -> None: if orm_col.column_name == "__time": orm_col.is_dttm = True @staticmethod - def get_extra_params(database: "Database") -> Dict[str, Any]: + def get_extra_params(database: Database) -> Dict[str, Any]: """ For Druid, the path to a SSL certificate is placed in `connect_args`. @@ -99,10 +106,11 @@ def get_extra_params(database: "Database") -> Dict[str, Any]: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"CAST(TIME_PARSE('{dttm.date().isoformat()}') AS DATE)" - if tt in (utils.TemporalType.DATETIME, utils.TemporalType.TIMESTAMP): + if isinstance(sqla_type, (types.DateTime, types.TIMESTAMP)): return f"""TIME_PARSE('{dttm.isoformat(timespec="seconds")}')""" return None @@ -119,3 +127,21 @@ def epoch_ms_to_dttm(cls) -> str: Convert from number of milliseconds since the epoch to a timestamp. """ return "MILLIS_TO_TIMESTAMP({col})" + + @classmethod + def get_columns( + cls, inspector: Inspector, table_name: str, schema: Optional[str] + ) -> List[Dict[str, Any]]: + """ + Update the Druid type map. + """ + return super().get_columns(inspector, table_name, schema) + + @classmethod + def get_dbapi_exception_mapping(cls) -> Dict[Type[Exception], Type[Exception]]: + # pylint: disable=import-outside-toplevel + from requests import exceptions as requests_exceptions + + return { + requests_exceptions.ConnectionError: SupersetDBAPIConnectionError, + } diff --git a/superset/db_engine_specs/duckdb.py b/superset/db_engine_specs/duckdb.py index 9f2d7422128b..1248287b8408 100644 --- a/superset/db_engine_specs/duckdb.py +++ b/superset/db_engine_specs/duckdb.py @@ -18,14 +18,14 @@ import re from datetime import datetime -from typing import Any, Dict, List, Optional, Pattern, Tuple, TYPE_CHECKING +from typing import Any, Dict, Optional, Pattern, Set, Tuple, TYPE_CHECKING from flask_babel import gettext as __ +from sqlalchemy import types from sqlalchemy.engine.reflection import Inspector from superset.db_engine_specs.base import BaseEngineSpec from superset.errors import SupersetErrorType -from superset.utils import core as utils if TYPE_CHECKING: # prevent circular imports @@ -47,7 +47,7 @@ class DuckDBEngineSpec(BaseEngineSpec): "P1D": "DATE_TRUNC('day', {col})", "P1W": "DATE_TRUNC('week', {col})", "P1M": "DATE_TRUNC('month', {col})", - "P0.25Y": "DATE_TRUNC('quarter', {col})", + "P3M": "DATE_TRUNC('quarter', {col})", "P1Y": "DATE_TRUNC('year', {col})", } @@ -67,14 +67,14 @@ def epoch_to_dttm(cls) -> str: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt in (utils.TemporalType.TEXT, utils.TemporalType.DATETIME): + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, (types.String, types.DateTime)): return f"""'{dttm.isoformat(sep=" ", timespec="microseconds")}'""" return None @classmethod def get_table_names( cls, database: Database, inspector: Inspector, schema: Optional[str] - ) -> List[str]: - """Need to disregard the schema for DuckDB""" - return sorted(inspector.get_table_names()) + ) -> Set[str]: + return set(inspector.get_table_names(schema)) diff --git a/superset/db_engine_specs/dynamodb.py b/superset/db_engine_specs/dynamodb.py new file mode 100644 index 000000000000..c398a9c1dff1 --- /dev/null +++ b/superset/db_engine_specs/dynamodb.py @@ -0,0 +1,65 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from datetime import datetime +from typing import Any, Dict, Optional + +from sqlalchemy import types + +from superset.db_engine_specs.base import BaseEngineSpec + + +class DynamoDBEngineSpec(BaseEngineSpec): + engine = "dynamodb" + engine_name = "Amazon DynamoDB" + + _time_grain_expressions = { + None: "{col}", + "PT1S": "DATETIME(STRFTIME('%Y-%m-%dT%H:%M:%S', {col}))", + "PT1M": "DATETIME(STRFTIME('%Y-%m-%dT%H:%M:00', {col}))", + "PT1H": "DATETIME(STRFTIME('%Y-%m-%dT%H:00:00', {col}))", + "P1D": "DATETIME({col}, 'start of day')", + "P1W": "DATETIME({col}, 'start of day', -strftime('%w', {col}) || ' days')", + "P1M": "DATETIME({col}, 'start of month')", + "P3M": ( + "DATETIME({col}, 'start of month', " + "printf('-%d month', (strftime('%m', {col}) - 1) % 3))" + ), + "P1Y": "DATETIME({col}, 'start of year')", + "P1W/1970-01-03T00:00:00Z": "DATETIME({col}, 'start of day', 'weekday 6')", + "P1W/1970-01-04T00:00:00Z": "DATETIME({col}, 'start of day', 'weekday 0')", + "1969-12-28T00:00:00Z/P1W": ( + "DATETIME({col}, 'start of day', 'weekday 0', '-7 days')" + ), + "1969-12-29T00:00:00Z/P1W": ( + "DATETIME({col}, 'start of day', 'weekday 1', '-7 days')" + ), + } + + @classmethod + def epoch_to_dttm(cls) -> str: + return "datetime({col}, 'unixepoch')" + + @classmethod + def convert_dttm( + cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None + ) -> Optional[str]: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, (types.String, types.DateTime)): + return f"""'{dttm.isoformat(sep=" ", timespec="seconds")}'""" + + return None diff --git a/superset/db_engine_specs/elasticsearch.py b/superset/db_engine_specs/elasticsearch.py index 12a5e21e225d..b47a61d0ccb7 100644 --- a/superset/db_engine_specs/elasticsearch.py +++ b/superset/db_engine_specs/elasticsearch.py @@ -19,13 +19,14 @@ from distutils.version import StrictVersion from typing import Any, Dict, Optional, Type +from sqlalchemy import types + from superset.db_engine_specs.base import BaseEngineSpec from superset.db_engine_specs.exceptions import ( SupersetDBAPIDatabaseError, SupersetDBAPIOperationalError, SupersetDBAPIProgrammingError, ) -from superset.utils import core as utils logger = logging.getLogger() @@ -68,7 +69,10 @@ def convert_dttm( ) -> Optional[str]: db_extra = db_extra or {} - if target_type.upper() == utils.TemporalType.DATETIME: + + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.DateTime): es_version = db_extra.get("version") # The elasticsearch CAST function does not take effect for the time zone # setting. In elasticsearch7.8 and above, we can use the DATETIME_PARSE @@ -119,7 +123,9 @@ class OpenDistroEngineSpec(BaseEngineSpec): # pylint: disable=abstract-method def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - if target_type.upper() == utils.TemporalType.DATETIME: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.DateTime): return f"""'{dttm.isoformat(timespec="seconds")}'""" return None diff --git a/superset/db_engine_specs/exceptions.py b/superset/db_engine_specs/exceptions.py index 6b4fb5549dd2..56e354d62a57 100644 --- a/superset/db_engine_specs/exceptions.py +++ b/superset/db_engine_specs/exceptions.py @@ -29,7 +29,7 @@ class SupersetDBAPIDatabaseError(SupersetDBAPIError): pass -class SupersetDBAPIDisconnectionError(SupersetDBAPIError): +class SupersetDBAPIConnectionError(SupersetDBAPIError): pass diff --git a/superset/db_engine_specs/firebird.py b/superset/db_engine_specs/firebird.py index 9254a3f2aa31..306a642dc3d1 100644 --- a/superset/db_engine_specs/firebird.py +++ b/superset/db_engine_specs/firebird.py @@ -17,8 +17,9 @@ from datetime import datetime from typing import Any, Dict, Optional +from sqlalchemy import types + from superset.db_engine_specs.base import BaseEngineSpec, LimitMethod -from superset.utils import core as utils class FirebirdEngineSpec(BaseEngineSpec): @@ -73,13 +74,14 @@ def epoch_to_dttm(cls) -> str: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.TIMESTAMP: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): + return f"CAST('{dttm.date().isoformat()}' AS DATE)" + if isinstance(sqla_type, types.DateTime): dttm_formatted = dttm.isoformat(sep=" ") dttm_valid_precision = dttm_formatted[: len("YYYY-MM-DD HH:MM:SS.MMMM")] return f"CAST('{dttm_valid_precision}' AS TIMESTAMP)" - if tt == utils.TemporalType.DATE: - return f"CAST('{dttm.date().isoformat()}' AS DATE)" - if tt == utils.TemporalType.TIME: + if isinstance(sqla_type, types.Time): return f"CAST('{dttm.time().isoformat()}' AS TIME)" return None diff --git a/superset/db_engine_specs/firebolt.py b/superset/db_engine_specs/firebolt.py index 04f48b612a45..65cd7143523c 100644 --- a/superset/db_engine_specs/firebolt.py +++ b/superset/db_engine_specs/firebolt.py @@ -17,8 +17,9 @@ from datetime import datetime from typing import Any, Dict, Optional +from sqlalchemy import types + from superset.db_engine_specs.base import BaseEngineSpec -from superset.utils import core as utils class FireboltEngineSpec(BaseEngineSpec): @@ -44,13 +45,14 @@ class FireboltEngineSpec(BaseEngineSpec): def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"CAST('{dttm.date().isoformat()}' AS DATE)" - if tt == utils.TemporalType.DATETIME: - return f"""CAST('{dttm.isoformat(timespec="seconds")}' AS DATETIME)""" - if tt == utils.TemporalType.TIMESTAMP: + if isinstance(sqla_type, types.TIMESTAMP): return f"""CAST('{dttm.isoformat(timespec="seconds")}' AS TIMESTAMP)""" + if isinstance(sqla_type, types.DateTime): + return f"""CAST('{dttm.isoformat(timespec="seconds")}' AS DATETIME)""" return None @classmethod diff --git a/superset/db_engine_specs/gsheets.py b/superset/db_engine_specs/gsheets.py index 740c1bc33d36..c181ae62254d 100644 --- a/superset/db_engine_specs/gsheets.py +++ b/superset/db_engine_specs/gsheets.py @@ -16,7 +16,6 @@ # under the License. import json import re -from contextlib import closing from typing import Any, Dict, List, Optional, Pattern, Tuple, TYPE_CHECKING from apispec import APISpec @@ -30,6 +29,7 @@ from typing_extensions import TypedDict from superset import security_manager +from superset.constants import PASSWORD_MASK from superset.databases.schemas import encrypted_field_properties, EncryptedString from superset.db_engine_specs.sqlite import SqliteEngineSpec from superset.errors import ErrorLevel, SupersetError, SupersetErrorType @@ -54,6 +54,11 @@ class GSheetsParametersSchema(Schema): class GSheetsParametersType(TypedDict): service_account_info: str + catalog: Optional[Dict[str, str]] + + +class GSheetsPropertiesType(TypedDict): + parameters: GSheetsParametersType catalog: Dict[str, str] @@ -64,6 +69,7 @@ class GSheetsEngineSpec(SqliteEngineSpec): engine_name = "Google Sheets" allows_joins = True allows_subqueries = True + disable_ssh_tunneling = True parameters_schema = GSheetsParametersSchema() default_driver = "apsw" @@ -80,17 +86,21 @@ class GSheetsEngineSpec(SqliteEngineSpec): ), } + supports_file_upload = False + @classmethod - def modify_url_for_impersonation( + def get_url_for_impersonation( cls, url: URL, impersonate_user: bool, username: Optional[str], - ) -> None: + ) -> URL: if impersonate_user and username is not None: user = security_manager.find_user(username=username) if user and user.email: - url.query["subject"] = user.email + url = url.update_query_dict({"subject": user.email}) + + return url @classmethod def extra_table_metadata( @@ -99,12 +109,10 @@ def extra_table_metadata( table_name: str, schema_name: Optional[str], ) -> Dict[str, Any]: - engine = cls.get_engine(database, schema=schema_name) - with closing(engine.raw_connection()) as conn: + with database.get_raw_connection(schema=schema_name) as conn: cursor = conn.cursor() cursor.execute(f'SELECT GET_METADATA("{table_name}")') results = cursor.fetchone()[0] - try: metadata = json.loads(results) except Exception: # pylint: disable=broad-except @@ -126,7 +134,7 @@ def build_sqlalchemy_uri( def get_parameters_from_uri( cls, uri: str, # pylint: disable=unused-argument - encrypted_extra: Optional[Dict[str, str]] = None, + encrypted_extra: Optional[Dict[str, Any]] = None, ) -> Any: # Building parameters from encrypted_extra and uri if encrypted_extra: @@ -134,6 +142,52 @@ def get_parameters_from_uri( raise ValidationError("Invalid service credentials") + @classmethod + def mask_encrypted_extra(cls, encrypted_extra: Optional[str]) -> Optional[str]: + if encrypted_extra is None: + return encrypted_extra + + try: + config = json.loads(encrypted_extra) + except (TypeError, json.JSONDecodeError): + return encrypted_extra + + try: + config["service_account_info"]["private_key"] = PASSWORD_MASK + except KeyError: + pass + + return json.dumps(config) + + @classmethod + def unmask_encrypted_extra( + cls, old: Optional[str], new: Optional[str] + ) -> Optional[str]: + """ + Reuse ``private_key`` if available and unchanged. + """ + if old is None or new is None: + return new + + try: + old_config = json.loads(old) + new_config = json.loads(new) + except (TypeError, json.JSONDecodeError): + return new + + if "service_account_info" not in new_config: + return new + + if "private_key" not in new_config["service_account_info"]: + return new + + if new_config["service_account_info"]["private_key"] == PASSWORD_MASK: + new_config["service_account_info"]["private_key"] = old_config[ + "service_account_info" + ]["private_key"] + + return json.dumps(new_config) + @classmethod def parameters_json_schema(cls) -> Any: """ @@ -157,9 +211,18 @@ def parameters_json_schema(cls) -> Any: @classmethod def validate_parameters( cls, - parameters: GSheetsParametersType, + properties: GSheetsPropertiesType, ) -> List[SupersetError]: errors: List[SupersetError] = [] + + # backwards compatible just incase people are send data + # via parameters for validation + parameters = properties.get("parameters", {}) + if parameters and parameters.get("catalog"): + table_catalog = parameters.get("catalog", {}) + else: + table_catalog = properties.get("catalog", {}) + encrypted_credentials = parameters.get("service_account_info") or "{}" # On create the encrypted credentials are a string, @@ -167,8 +230,6 @@ def validate_parameters( if isinstance(encrypted_credentials, str): encrypted_credentials = json.loads(encrypted_credentials) - table_catalog = parameters.get("catalog", {}) - if not table_catalog: # Allowing users to submit empty catalogs errors.append( @@ -194,6 +255,7 @@ def validate_parameters( ) conn = engine.connect() idx = 0 + for name, url in table_catalog.items(): if not name: diff --git a/superset/db_engine_specs/hana.py b/superset/db_engine_specs/hana.py index 0cc55d08d3f6..e579550b2e2d 100644 --- a/superset/db_engine_specs/hana.py +++ b/superset/db_engine_specs/hana.py @@ -17,9 +17,10 @@ from datetime import datetime from typing import Any, Dict, Optional +from sqlalchemy import types + from superset.db_engine_specs.base import LimitMethod from superset.db_engine_specs.postgres import PostgresBaseEngineSpec -from superset.utils import core as utils class HanaEngineSpec(PostgresBaseEngineSpec): @@ -46,10 +47,11 @@ class HanaEngineSpec(PostgresBaseEngineSpec): def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"TO_DATE('{dttm.date().isoformat()}', 'YYYY-MM-DD')" - if tt == utils.TemporalType.TIMESTAMP: + if isinstance(sqla_type, types.TIMESTAMP): return f"""TO_TIMESTAMP('{dttm .isoformat(timespec="microseconds")}', 'YYYY-MM-DD"T"HH24:MI:SS.ff6')""" return None diff --git a/superset/db_engine_specs/hive.py b/superset/db_engine_specs/hive.py index 344d1f7ae933..c049ee652eee 100644 --- a/superset/db_engine_specs/hive.py +++ b/superset/db_engine_specs/hive.py @@ -14,13 +14,15 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +from __future__ import annotations + import logging import os import re import tempfile import time from datetime import datetime -from typing import Any, Dict, List, Optional, Tuple, TYPE_CHECKING +from typing import Any, Dict, List, Optional, Set, Tuple, TYPE_CHECKING from urllib import parse import numpy as np @@ -28,7 +30,7 @@ import pyarrow as pa import pyarrow.parquet as pq from flask import current_app, g -from sqlalchemy import Column, text +from sqlalchemy import Column, text, types from sqlalchemy.engine.base import Engine from sqlalchemy.engine.reflection import Inspector from sqlalchemy.engine.url import URL @@ -43,12 +45,13 @@ from superset.extensions import cache_manager from superset.models.sql_lab import Query from superset.sql_parse import ParsedQuery, Table -from superset.utils import core as utils if TYPE_CHECKING: # prevent circular imports - from superset.models.core import Database + from pyhive.hive import Cursor + from TCLIService.ttypes import TFetchOrientation + from superset.models.core import Database logger = logging.getLogger(__name__) @@ -139,18 +142,10 @@ def patch(cls) -> None: ttypes as patched_ttypes, ) - from superset.db_engines import hive as patched_hive - hive.TCLIService = patched_TCLIService hive.constants = patched_constants hive.ttypes = patched_ttypes - hive.Cursor.fetch_logs = patched_hive.fetch_logs - - @classmethod - def get_all_datasource_names( - cls, database: "Database", datasource_type: str - ) -> List[utils.DatasourceName]: - return BaseEngineSpec.get_all_datasource_names(database, datasource_type) + hive.Cursor.fetch_logs = fetch_logs @classmethod def fetch_data( @@ -192,8 +187,6 @@ def df_to_sql( :param to_sql_kwargs: The kwargs to be passed to pandas.DataFrame.to_sql` method """ - engine = cls.get_engine(database) - if to_sql_kwargs["if_exists"] == "append": raise SupersetException("Append operation not currently supported") @@ -212,9 +205,10 @@ def df_to_sql( if table_exists: raise SupersetException("Table already exists") elif to_sql_kwargs["if_exists"] == "replace": - engine.execute(f"DROP TABLE IF EXISTS {str(table)}") + with cls.get_engine(database) as engine: + engine.execute(f"DROP TABLE IF EXISTS {str(table)}") - def _get_hive_type(dtype: np.dtype) -> str: + def _get_hive_type(dtype: np.dtype[Any]) -> str: hive_type_by_dtype = { np.dtype("bool"): "BOOLEAN", np.dtype("float64"): "DOUBLE", @@ -233,45 +227,45 @@ def _get_hive_type(dtype: np.dtype) -> str: ) as file: pq.write_table(pa.Table.from_pandas(df), where=file.name) - engine.execute( - text( - f""" - CREATE TABLE {str(table)} ({schema_definition}) - STORED AS PARQUET - LOCATION :location - """ - ), - location=upload_to_s3( - filename=file.name, - upload_prefix=current_app.config[ - "CSV_TO_HIVE_UPLOAD_DIRECTORY_FUNC" - ](database, g.user, table.schema), - table=table, - ), - ) + with cls.get_engine(database) as engine: + engine.execute( + text( + f""" + CREATE TABLE {str(table)} ({schema_definition}) + STORED AS PARQUET + LOCATION :location + """ + ), + location=upload_to_s3( + filename=file.name, + upload_prefix=current_app.config[ + "CSV_TO_HIVE_UPLOAD_DIRECTORY_FUNC" + ](database, g.user, table.schema), + table=table, + ), + ) @classmethod def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"CAST('{dttm.date().isoformat()}' AS DATE)" - if tt == utils.TemporalType.TIMESTAMP: + if isinstance(sqla_type, types.TIMESTAMP): return f"""CAST('{dttm .isoformat(sep=" ", timespec="microseconds")}' AS TIMESTAMP)""" return None - @classmethod - def epoch_to_dttm(cls) -> str: - return "from_unixtime({col})" - @classmethod def adjust_database_uri( cls, uri: URL, selected_schema: Optional[str] = None - ) -> None: + ) -> URL: if selected_schema: - uri.database = parse.quote(selected_schema, safe="") + uri = uri.set(database=parse.quote(selected_schema, safe="")) + + return uri @classmethod def _extract_error_message(cls, ex: Exception) -> str: @@ -313,7 +307,7 @@ def progress(cls, log_lines: List[str]) -> int: return int(progress) @classmethod - def get_tracking_url(cls, log_lines: List[str]) -> Optional[str]: + def get_tracking_url_from_logs(cls, log_lines: List[str]) -> Optional[str]: lkp = "Tracking URL = " for line in log_lines: if lkp in line: @@ -364,7 +358,7 @@ def handle_cursor( # pylint: disable=too-many-locals query.progress = progress needs_commit = True if not tracking_url: - tracking_url = cls.get_tracking_url(log_lines) + tracking_url = cls.get_tracking_url_from_logs(log_lines) if tracking_url: job_id = tracking_url.split("/")[-2] logger.info( @@ -372,13 +366,6 @@ def handle_cursor( # pylint: disable=too-many-locals str(query_id), tracking_url, ) - transformer = current_app.config["TRACKING_URL_TRANSFORMER"] - tracking_url = transformer(tracking_url) - logger.info( - "Query %s: Transformation applied: %s", - str(query_id), - tracking_url, - ) query.tracking_url = tracking_url logger.info("Query %s: Job id: %s", str(query_id), str(job_id)) needs_commit = True @@ -391,7 +378,15 @@ def handle_cursor( # pylint: disable=too-many-locals last_log_line = len(log_lines) if needs_commit: session.commit() - time.sleep(current_app.config["HIVE_POLL_INTERVAL"]) + if sleep_interval := current_app.config.get("HIVE_POLL_INTERVAL"): + logger.warning( + "HIVE_POLL_INTERVAL is deprecated and will be removed in 3.0. Please use DB_POLL_INTERVAL_SECONDS instead" + ) + else: + sleep_interval = current_app.config["DB_POLL_INTERVAL_SECONDS"].get( + cls.engine, 5 + ) + time.sleep(sleep_interval) polled = cursor.poll() @classmethod @@ -485,17 +480,19 @@ def select_star( # pylint: disable=too-many-arguments ) @classmethod - def modify_url_for_impersonation( + def get_url_for_impersonation( cls, url: URL, impersonate_user: bool, username: Optional[str] - ) -> None: + ) -> URL: """ - Modify the SQL Alchemy URL object with the user to impersonate if applicable. + Return a modified URL with the username set. + :param url: SQLAlchemy URL object :param impersonate_user: Flag indicating if impersonation is enabled :param username: Effective username """ # Do nothing in the URL object since instead this should modify # the configuraiton dictionary. See get_configuration_for_impersonation + return url @classmethod def update_impersonation_config( @@ -573,7 +570,7 @@ def is_readonly_query(cls, parsed_query: ParsedQuery) -> bool: def has_implicit_cancel(cls) -> bool: """ Return True if the live cursor handles the implicit cancelation of the query, - False otherise. + False otherwise. :return: Whether the live cursor implicitly cancels the query :see: handle_cursor @@ -581,7 +578,84 @@ def has_implicit_cancel(cls) -> bool: return True + @classmethod + def get_view_names( + cls, + database: "Database", + inspector: Inspector, + schema: Optional[str], + ) -> Set[str]: + """ + Get all the view names within the specified schema. + + Per the SQLAlchemy definition if the schema is omitted the database’s default + schema is used, however some dialects infer the request as schema agnostic. -class SparkEngineSpec(HiveEngineSpec): + Note that PyHive's Hive SQLAlchemy dialect does not adhere to the specification + where the `get_view_names` method returns both real tables and views. Futhermore + the dialect wrongfully infers the request as schema agnostic when the schema is + omitted. + + :param database: The database to inspect + :param inspector: The SQLAlchemy inspector + :param schema: The schema to inspect + :returns: The view names + """ - engine_name = "Apache Spark SQL" + sql = "SHOW VIEWS" + + if schema: + sql += f" IN `{schema}`" + + with database.get_raw_connection(schema=schema) as conn: + cursor = conn.cursor() + cursor.execute(sql) + results = cursor.fetchall() + return {row[0] for row in results} + + +# TODO: contribute back to pyhive. +def fetch_logs( # pylint: disable=protected-access + self: "Cursor", + _max_rows: int = 1024, + orientation: Optional["TFetchOrientation"] = None, +) -> str: + """Mocked. Retrieve the logs produced by the execution of the query. + Can be called multiple times to fetch the logs produced after + the previous call. + :returns: list<str> + :raises: ``ProgrammingError`` when no query has been started + .. note:: + This is not a part of DB-API. + """ + # pylint: disable=import-outside-toplevel + from pyhive import hive + from TCLIService import ttypes + from thrift import Thrift + + orientation = orientation or ttypes.TFetchOrientation.FETCH_NEXT + try: + req = ttypes.TGetLogReq(operationHandle=self._operationHandle) + logs = self._connection.client.GetLog(req).log + return logs + # raised if Hive is used + except (ttypes.TApplicationException, Thrift.TApplicationException) as ex: + if self._state == self._STATE_NONE: + raise hive.ProgrammingError("No query yet") from ex + logs = [] + while True: + req = ttypes.TFetchResultsReq( + operationHandle=self._operationHandle, + orientation=ttypes.TFetchOrientation.FETCH_NEXT, + maxRows=self.arraysize, + fetchType=1, # 0: results, 1: logs + ) + response = self._connection.client.FetchResults(req) + hive._check_status(response) + assert not response.results.rows, "expected data in columnar format" + assert len(response.results.columns) == 1, response.results.columns + new_logs = hive._unwrap_column(response.results.columns[0]) + logs += new_logs + if not new_logs: + break + return "\n".join(logs) diff --git a/superset/db_engine_specs/impala.py b/superset/db_engine_specs/impala.py index 048588c046fd..5de1e690c6c9 100644 --- a/superset/db_engine_specs/impala.py +++ b/superset/db_engine_specs/impala.py @@ -14,13 +14,24 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +import logging +import re +import time from datetime import datetime from typing import Any, Dict, List, Optional +from flask import current_app +from sqlalchemy import types from sqlalchemy.engine.reflection import Inspector +from sqlalchemy.orm import Session +from superset.constants import QUERY_EARLY_CANCEL_KEY from superset.db_engine_specs.base import BaseEngineSpec -from superset.utils import core as utils +from superset.models.sql_lab import Query + +logger = logging.getLogger(__name__) +# Query 5543ffdf692b7d02:f78a944000000000: 3% Complete (17 out of 547) +QUERY_PROGRESS_REGEX = re.compile(r"Query.*: (?P<query_progress>[0-9]+)%") class ImpalaEngineSpec(BaseEngineSpec): @@ -48,10 +59,11 @@ def epoch_to_dttm(cls) -> str: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"CAST('{dttm.date().isoformat()}' AS DATE)" - if tt == utils.TemporalType.TIMESTAMP: + if isinstance(sqla_type, types.TIMESTAMP): return f"""CAST('{dttm.isoformat(timespec="microseconds")}' AS TIMESTAMP)""" return None @@ -63,3 +75,82 @@ def get_schema_names(cls, inspector: Inspector) -> List[str]: if not row[0].startswith("_") ] return schemas + + @classmethod + def has_implicit_cancel(cls) -> bool: + """ + Return True if the live cursor handles the implicit cancelation of the query, + False otherise. + + :return: Whether the live cursor implicitly cancels the query + :see: handle_cursor + """ + + return True + + @classmethod + def execute( + cls, + cursor: Any, + query: str, + **kwargs: Any, + ) -> None: + try: + cursor.execute_async(query) + except Exception as ex: + raise cls.get_dbapi_mapped_exception(ex) + + @classmethod + def handle_cursor(cls, cursor: Any, query: Query, session: Session) -> None: + """Stop query and updates progress information""" + + query_id = query.id + unfinished_states = ( + "INITIALIZED_STATE", + "RUNNING_STATE", + ) + + try: + status = cursor.status() + while status in unfinished_states: + session.refresh(query) + query = session.query(Query).filter_by(id=query_id).one() + # if query cancelation was requested prior to the handle_cursor call, but + # the query was still executed + # modified in stop_query in views / core.py is reflected here. + # stop query + if query.extra.get(QUERY_EARLY_CANCEL_KEY): + cursor.cancel_operation() + cursor.close_operation() + cursor.close() + break + + # updates progress info by log + try: + log = cursor.get_log() or "" + except Exception: # pylint: disable=broad-except + logger.warning("Call to GetLog() failed") + log = "" + + if log: + match = QUERY_PROGRESS_REGEX.match(log) + if match: + progress = int(match.groupdict()["query_progress"]) + logger.debug( + "Query %s: Progress total: %s", str(query_id), str(progress) + ) + needs_commit = False + if progress > query.progress: + query.progress = progress + needs_commit = True + + if needs_commit: + session.commit() + sleep_interval = current_app.config["DB_POLL_INTERVAL_SECONDS"].get( + cls.engine, 5 + ) + time.sleep(sleep_interval) + status = cursor.status() + except Exception: # pylint: disable=broad-except + logger.debug("Call to status() failed ") + return diff --git a/superset/db_engine_specs/kusto.py b/superset/db_engine_specs/kusto.py index d8a52768d9d0..9fddb23d2618 100644 --- a/superset/db_engine_specs/kusto.py +++ b/superset/db_engine_specs/kusto.py @@ -14,9 +14,13 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +import re from datetime import datetime from typing import Any, Dict, List, Optional, Type +from sqlalchemy import types +from sqlalchemy.dialects.mssql.base import SMALLDATETIME + from superset.db_engine_specs.base import BaseEngineSpec, LimitMethod from superset.db_engine_specs.exceptions import ( SupersetDBAPIDatabaseError, @@ -24,7 +28,7 @@ SupersetDBAPIProgrammingError, ) from superset.sql_parse import ParsedQuery -from superset.utils import core as utils +from superset.utils.core import GenericDataType class KustoSqlEngineSpec(BaseEngineSpec): # pylint: disable=abstract-method @@ -49,7 +53,7 @@ class KustoSqlEngineSpec(BaseEngineSpec): # pylint: disable=abstract-method "P1D": "DATEADD(day, DATEDIFF(day, 0, {col}), 0)", "P1W": "DATEADD(day, -1, DATEADD(week, DATEDIFF(week, 0, {col}), 0))", "P1M": "DATEADD(month, DATEDIFF(month, 0, {col}), 0)", - "P0.25Y": "DATEADD(quarter, DATEDIFF(quarter, 0, {col}), 0)", + "P3M": "DATEADD(quarter, DATEDIFF(quarter, 0, {col}), 0)", "P1Y": "DATEADD(year, DATEDIFF(year, 0, {col}), 0)", "1969-12-28T00:00:00Z/P1W": "DATEADD(day, -1," " DATEADD(week, DATEDIFF(week, 0, {col}), 0))", @@ -59,6 +63,14 @@ class KustoSqlEngineSpec(BaseEngineSpec): # pylint: disable=abstract-method type_code_map: Dict[int, str] = {} # loaded from get_datatype only if needed + column_type_mappings = ( + ( + re.compile(r"^smalldatetime.*", re.IGNORECASE), + SMALLDATETIME(), + GenericDataType.TEMPORAL, + ), + ) + @classmethod def get_dbapi_exception_mapping(cls) -> Dict[Type[Exception], Type[Exception]]: # pylint: disable=import-outside-toplevel,import-error @@ -74,18 +86,19 @@ def get_dbapi_exception_mapping(cls) -> Dict[Type[Exception], Type[Exception]]: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"CONVERT(DATE, '{dttm.date().isoformat()}', 23)" - if tt == utils.TemporalType.DATETIME: - datetime_formatted = dttm.isoformat(timespec="milliseconds") - return f"""CONVERT(DATETIME, '{datetime_formatted}', 126)""" - if tt == utils.TemporalType.SMALLDATETIME: - datetime_formatted = dttm.isoformat(sep=" ", timespec="seconds") - return f"""CONVERT(SMALLDATETIME, '{datetime_formatted}', 20)""" - if tt == utils.TemporalType.TIMESTAMP: + if isinstance(sqla_type, types.TIMESTAMP): datetime_formatted = dttm.isoformat(sep=" ", timespec="seconds") return f"""CONVERT(TIMESTAMP, '{datetime_formatted}', 20)""" + if isinstance(sqla_type, SMALLDATETIME): + datetime_formatted = dttm.isoformat(sep=" ", timespec="seconds") + return f"""CONVERT(SMALLDATETIME, '{datetime_formatted}', 20)""" + if isinstance(sqla_type, types.DateTime): + datetime_formatted = dttm.isoformat(timespec="milliseconds") + return f"""CONVERT(DATETIME, '{datetime_formatted}', 126)""" return None @classmethod @@ -132,13 +145,12 @@ def get_dbapi_exception_mapping(cls) -> Dict[Type[Exception], Type[Exception]]: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - if target_type.upper() in [ - utils.TemporalType.DATETIME, - utils.TemporalType.TIMESTAMP, - ]: - return f"""datetime({dttm.isoformat(timespec="microseconds")})""" - if target_type.upper() == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"""datetime({dttm.date().isoformat()})""" + if isinstance(sqla_type, types.DateTime): + return f"""datetime({dttm.isoformat(timespec="microseconds")})""" return None diff --git a/superset/db_engine_specs/kylin.py b/superset/db_engine_specs/kylin.py index dc3836c7373e..d76811e86c36 100644 --- a/superset/db_engine_specs/kylin.py +++ b/superset/db_engine_specs/kylin.py @@ -17,8 +17,9 @@ from datetime import datetime from typing import Any, Dict, Optional +from sqlalchemy import types + from superset.db_engine_specs.base import BaseEngineSpec -from superset.utils import core as utils class KylinEngineSpec(BaseEngineSpec): # pylint: disable=abstract-method @@ -43,10 +44,11 @@ class KylinEngineSpec(BaseEngineSpec): # pylint: disable=abstract-method def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"CAST('{dttm.date().isoformat()}' AS DATE)" - if tt == utils.TemporalType.TIMESTAMP: + if isinstance(sqla_type, types.TIMESTAMP): datetime_fomatted = dttm.isoformat(sep=" ", timespec="seconds") return f"""CAST('{datetime_fomatted}' AS TIMESTAMP)""" return None diff --git a/superset/db_engine_specs/mssql.py b/superset/db_engine_specs/mssql.py index 158e73adeaf9..8b38ec742190 100644 --- a/superset/db_engine_specs/mssql.py +++ b/superset/db_engine_specs/mssql.py @@ -20,10 +20,12 @@ from typing import Any, Dict, List, Optional, Pattern, Tuple from flask_babel import gettext as __ +from sqlalchemy import types +from sqlalchemy.dialects.mssql.base import SMALLDATETIME from superset.db_engine_specs.base import BaseEngineSpec, LimitMethod from superset.errors import SupersetErrorType -from superset.utils import core as utils +from superset.utils.core import GenericDataType logger = logging.getLogger(__name__) @@ -70,6 +72,13 @@ class MssqlEngineSpec(BaseEngineSpec): "1969-12-29T00:00:00Z/P1W": "DATEADD(WEEK," " DATEDIFF(WEEK, 0, DATEADD(DAY, -1, {col})), 0)", } + column_type_mappings = ( + ( + re.compile(r"^smalldatetime.*", re.IGNORECASE), + SMALLDATETIME(), + GenericDataType.TEMPORAL, + ), + ) custom_errors: Dict[Pattern[str], Tuple[str, SupersetErrorType, Dict[str, Any]]] = { CONNECTION_ACCESS_DENIED_REGEX: ( @@ -108,15 +117,16 @@ def epoch_to_dttm(cls) -> str: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"CONVERT(DATE, '{dttm.date().isoformat()}', 23)" - if tt == utils.TemporalType.DATETIME: - datetime_formatted = dttm.isoformat(timespec="milliseconds") - return f"""CONVERT(DATETIME, '{datetime_formatted}', 126)""" - if tt == utils.TemporalType.SMALLDATETIME: + if isinstance(sqla_type, SMALLDATETIME): datetime_formatted = dttm.isoformat(sep=" ", timespec="seconds") return f"""CONVERT(SMALLDATETIME, '{datetime_formatted}', 20)""" + if isinstance(sqla_type, types.DateTime): + datetime_formatted = dttm.isoformat(timespec="milliseconds") + return f"""CONVERT(DATETIME, '{datetime_formatted}', 126)""" return None @classmethod diff --git a/superset/db_engine_specs/mysql.py b/superset/db_engine_specs/mysql.py index 9aa3c85e0fe6..b873daff7560 100644 --- a/superset/db_engine_specs/mysql.py +++ b/superset/db_engine_specs/mysql.py @@ -20,6 +20,7 @@ from urllib import parse from flask_babel import gettext as __ +from sqlalchemy import types from sqlalchemy.dialects.mysql import ( BIT, DECIMAL, @@ -34,15 +35,10 @@ ) from sqlalchemy.engine.url import URL -from superset.db_engine_specs.base import ( - BaseEngineSpec, - BasicParametersMixin, - ColumnTypeMapping, -) +from superset.db_engine_specs.base import BaseEngineSpec, BasicParametersMixin from superset.errors import SupersetErrorType from superset.models.sql_lab import Query -from superset.utils import core as utils -from superset.utils.core import ColumnSpec, GenericDataType +from superset.utils.core import GenericDataType # Regular expressions to catch custom errors CONNECTION_ACCESS_DENIED_REGEX = re.compile( @@ -182,10 +178,11 @@ class MySQLEngineSpec(BaseEngineSpec, BasicParametersMixin): def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"STR_TO_DATE('{dttm.date().isoformat()}', '%Y-%m-%d')" - if tt == utils.TemporalType.DATETIME: + if isinstance(sqla_type, types.DateTime): datetime_formatted = dttm.isoformat(sep=" ", timespec="microseconds") return f"""STR_TO_DATE('{datetime_formatted}', '%Y-%m-%d %H:%i:%s.%f')""" return None @@ -193,9 +190,11 @@ def convert_dttm( @classmethod def adjust_database_uri( cls, uri: URL, selected_schema: Optional[str] = None - ) -> None: + ) -> URL: if selected_schema: - uri.database = parse.quote(selected_schema, safe="") + uri = uri.set(database=parse.quote(selected_schema, safe="")) + + return uri @classmethod def get_datatype(cls, type_code: Any) -> Optional[str]: @@ -230,23 +229,6 @@ def _extract_error_message(cls, ex: Exception) -> str: pass return message - @classmethod - def get_column_spec( - cls, - native_type: Optional[str], - db_extra: Optional[Dict[str, Any]] = None, - source: utils.ColumnTypeSource = utils.ColumnTypeSource.GET_TABLE, - column_type_mappings: Tuple[ColumnTypeMapping, ...] = column_type_mappings, - ) -> Optional[ColumnSpec]: - - column_spec = super().get_column_spec(native_type) - if column_spec: - return column_spec - - return super().get_column_spec( - native_type, column_type_mappings=column_type_mappings - ) - @classmethod def get_cancel_query_id(cls, cursor: Any, query: Query) -> Optional[str]: """ diff --git a/superset/db_engine_specs/oracle.py b/superset/db_engine_specs/oracle.py index ee04e49ffc64..4a219919bb53 100644 --- a/superset/db_engine_specs/oracle.py +++ b/superset/db_engine_specs/oracle.py @@ -17,8 +17,9 @@ from datetime import datetime from typing import Any, Dict, List, Optional, Tuple +from sqlalchemy import types + from superset.db_engine_specs.base import BaseEngineSpec, LimitMethod -from superset.utils import core as utils class OracleEngineSpec(BaseEngineSpec): @@ -44,15 +45,16 @@ class OracleEngineSpec(BaseEngineSpec): def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"TO_DATE('{dttm.date().isoformat()}', 'YYYY-MM-DD')" - if tt == utils.TemporalType.DATETIME: - datetime_formatted = dttm.isoformat(timespec="seconds") - return f"""TO_DATE('{datetime_formatted}', 'YYYY-MM-DD"T"HH24:MI:SS')""" - if tt == utils.TemporalType.TIMESTAMP: + if isinstance(sqla_type, types.TIMESTAMP): return f"""TO_TIMESTAMP('{dttm .isoformat(timespec="microseconds")}', 'YYYY-MM-DD"T"HH24:MI:SS.ff6')""" + if isinstance(sqla_type, types.DateTime): + datetime_formatted = dttm.isoformat(timespec="seconds") + return f"""TO_DATE('{datetime_formatted}', 'YYYY-MM-DD"T"HH24:MI:SS')""" return None @classmethod diff --git a/superset/db_engine_specs/pinot.py b/superset/db_engine_specs/pinot.py index 38e30accecbc..cebdd693a4c7 100644 --- a/superset/db_engine_specs/pinot.py +++ b/superset/db_engine_specs/pinot.py @@ -75,7 +75,6 @@ def get_timestamp_expr( col: ColumnClause, pdf: Optional[str], time_grain: Optional[str], - type_: Optional[str] = None, ) -> TimestampExpression: if not pdf: raise NotImplementedError(f"Empty date format for '{col}'") diff --git a/superset/db_engine_specs/postgres.py b/superset/db_engine_specs/postgres.py index f9d450a3e9c9..cbe00ea58dfc 100644 --- a/superset/db_engine_specs/postgres.py +++ b/superset/db_engine_specs/postgres.py @@ -18,23 +18,19 @@ import logging import re from datetime import datetime -from typing import Any, Dict, List, Optional, Pattern, Tuple, TYPE_CHECKING +from typing import Any, Dict, List, Optional, Pattern, Set, Tuple, TYPE_CHECKING from flask_babel import gettext as __ -from sqlalchemy.dialects.postgresql import ARRAY, DOUBLE_PRECISION, ENUM, JSON +from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION, ENUM, JSON from sqlalchemy.dialects.postgresql.base import PGInspector -from sqlalchemy.types import String +from sqlalchemy.types import Date, DateTime, String -from superset.db_engine_specs.base import ( - BaseEngineSpec, - BasicParametersMixin, - ColumnTypeMapping, -) +from superset.db_engine_specs.base import BaseEngineSpec, BasicParametersMixin from superset.errors import SupersetErrorType from superset.exceptions import SupersetException from superset.models.sql_lab import Query from superset.utils import core as utils -from superset.utils.core import ColumnSpec, GenericDataType +from superset.utils.core import GenericDataType if TYPE_CHECKING: from superset.models.core import Database # pragma: no cover @@ -185,7 +181,7 @@ class PostgresEngineSpec(PostgresBaseEngineSpec, BasicParametersMixin): ), ( re.compile(r"^array.*", re.IGNORECASE), - lambda match: ARRAY(int(match[2])) if match[2] else String(), + String(), GenericDataType.STRING, ), ( @@ -228,20 +224,21 @@ def query_cost_formatter( @classmethod def get_table_names( cls, database: "Database", inspector: PGInspector, schema: Optional[str] - ) -> List[str]: + ) -> Set[str]: """Need to consider foreign tables for PostgreSQL""" - tables = inspector.get_table_names(schema) - tables.extend(inspector.get_foreign_table_names(schema)) - return sorted(tables) + return set(inspector.get_table_names(schema)) | set( + inspector.get_foreign_table_names(schema) + ) @classmethod def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, Date): return f"TO_DATE('{dttm.date().isoformat()}', 'YYYY-MM-DD')" - if "TIMESTAMP" in tt or "DATETIME" in tt: + if isinstance(sqla_type, DateTime): dttm_formatted = dttm.isoformat(sep=" ", timespec="microseconds") return f"""TO_TIMESTAMP('{dttm_formatted}', 'YYYY-MM-DD HH24:MI:SS.US')""" return None @@ -270,23 +267,6 @@ def get_extra_params(database: "Database") -> Dict[str, Any]: extra["engine_params"] = engine_params return extra - @classmethod - def get_column_spec( - cls, - native_type: Optional[str], - db_extra: Optional[Dict[str, Any]] = None, - source: utils.ColumnTypeSource = utils.ColumnTypeSource.GET_TABLE, - column_type_mappings: Tuple[ColumnTypeMapping, ...] = column_type_mappings, - ) -> Optional[ColumnSpec]: - - column_spec = super().get_column_spec(native_type) - if column_spec: - return column_spec - - return super().get_column_spec( - native_type, column_type_mappings=column_type_mappings - ) - @classmethod def get_datatype(cls, type_code: Any) -> Optional[str]: # pylint: disable=import-outside-toplevel diff --git a/superset/db_engine_specs/presto.py b/superset/db_engine_specs/presto.py index cd6fa032b39e..72931a85b420 100644 --- a/superset/db_engine_specs/presto.py +++ b/superset/db_engine_specs/presto.py @@ -15,15 +15,28 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=too-many-lines +from __future__ import annotations + import logging import re -import textwrap import time +from abc import ABCMeta from collections import defaultdict, deque -from contextlib import closing from datetime import datetime from distutils.version import StrictVersion -from typing import Any, cast, Dict, List, Optional, Pattern, Tuple, TYPE_CHECKING, Union +from textwrap import dedent +from typing import ( + Any, + cast, + Dict, + List, + Optional, + Pattern, + Set, + Tuple, + TYPE_CHECKING, + Union, +) from urllib import parse import pandas as pd @@ -33,7 +46,7 @@ from sqlalchemy import Column, literal_column, types from sqlalchemy.engine.base import Engine from sqlalchemy.engine.reflection import Inspector -from sqlalchemy.engine.result import RowProxy +from sqlalchemy.engine.result import Row as ResultRow from sqlalchemy.engine.url import URL from sqlalchemy.orm import Session from sqlalchemy.sql.expression import ColumnClause, Select @@ -41,7 +54,7 @@ from superset import cache_manager, is_feature_enabled from superset.common.db_query_status import QueryStatus from superset.databases.utils import make_url_safe -from superset.db_engine_specs.base import BaseEngineSpec, ColumnTypeMapping +from superset.db_engine_specs.base import BaseEngineSpec from superset.errors import SupersetErrorType from superset.exceptions import SupersetTemplateException from superset.models.sql_lab import Query @@ -55,15 +68,20 @@ TinyInteger, ) from superset.result_set import destringify -from superset.sql_parse import ParsedQuery from superset.superset_typing import ResultSetColumnType from superset.utils import core as utils -from superset.utils.core import ColumnSpec, GenericDataType +from superset.utils.core import GenericDataType if TYPE_CHECKING: # prevent circular imports from superset.models.core import Database + # need try/catch because pyhive may not be installed + try: + from pyhive.presto import Cursor # pylint: disable=unused-import + except ImportError: + pass + COLUMN_DOES_NOT_EXIST_REGEX = re.compile( "line (?P<location>.+?): .*Column '(?P<column_name>.+?)' cannot be resolved" ) @@ -139,30 +157,447 @@ def get_children(column: ResultSetColumnType) -> List[ResultSetColumnType]: columns.append(_column) return columns - raise Exception(f"Unknown type {type_}!") + raise Exception(f"Unknown type {type_}!") + + +class PrestoBaseEngineSpec(BaseEngineSpec, metaclass=ABCMeta): + """ + A base class that share common functions between Presto and Trino + """ + + column_type_mappings = ( + ( + re.compile(r"^boolean.*", re.IGNORECASE), + types.BOOLEAN(), + GenericDataType.BOOLEAN, + ), + ( + re.compile(r"^tinyint.*", re.IGNORECASE), + TinyInteger(), + GenericDataType.NUMERIC, + ), + ( + re.compile(r"^smallint.*", re.IGNORECASE), + types.SmallInteger(), + GenericDataType.NUMERIC, + ), + ( + re.compile(r"^integer.*", re.IGNORECASE), + types.INTEGER(), + GenericDataType.NUMERIC, + ), + ( + re.compile(r"^bigint.*", re.IGNORECASE), + types.BigInteger(), + GenericDataType.NUMERIC, + ), + ( + re.compile(r"^real.*", re.IGNORECASE), + types.FLOAT(), + GenericDataType.NUMERIC, + ), + ( + re.compile(r"^double.*", re.IGNORECASE), + types.FLOAT(), + GenericDataType.NUMERIC, + ), + ( + re.compile(r"^decimal.*", re.IGNORECASE), + types.DECIMAL(), + GenericDataType.NUMERIC, + ), + ( + re.compile(r"^varchar(\((\d+)\))*$", re.IGNORECASE), + lambda match: types.VARCHAR(int(match[2])) if match[2] else types.String(), + GenericDataType.STRING, + ), + ( + re.compile(r"^char(\((\d+)\))*$", re.IGNORECASE), + lambda match: types.CHAR(int(match[2])) if match[2] else types.String(), + GenericDataType.STRING, + ), + ( + re.compile(r"^varbinary.*", re.IGNORECASE), + types.VARBINARY(), + GenericDataType.STRING, + ), + ( + re.compile(r"^json.*", re.IGNORECASE), + types.JSON(), + GenericDataType.STRING, + ), + ( + re.compile(r"^date.*", re.IGNORECASE), + types.Date(), + GenericDataType.TEMPORAL, + ), + ( + re.compile(r"^timestamp.*", re.IGNORECASE), + types.TIMESTAMP(), + GenericDataType.TEMPORAL, + ), + ( + re.compile(r"^interval.*", re.IGNORECASE), + Interval(), + GenericDataType.TEMPORAL, + ), + ( + re.compile(r"^time.*", re.IGNORECASE), + types.Time(), + GenericDataType.TEMPORAL, + ), + (re.compile(r"^array.*", re.IGNORECASE), Array(), GenericDataType.STRING), + (re.compile(r"^map.*", re.IGNORECASE), Map(), GenericDataType.STRING), + (re.compile(r"^row.*", re.IGNORECASE), Row(), GenericDataType.STRING), + ) + + # pylint: disable=line-too-long + _time_grain_expressions = { + None: "{col}", + "PT1S": "date_trunc('second', CAST({col} AS TIMESTAMP))", + "PT1M": "date_trunc('minute', CAST({col} AS TIMESTAMP))", + "PT1H": "date_trunc('hour', CAST({col} AS TIMESTAMP))", + "P1D": "date_trunc('day', CAST({col} AS TIMESTAMP))", + "P1W": "date_trunc('week', CAST({col} AS TIMESTAMP))", + "P1M": "date_trunc('month', CAST({col} AS TIMESTAMP))", + "P3M": "date_trunc('quarter', CAST({col} AS TIMESTAMP))", + "P1Y": "date_trunc('year', CAST({col} AS TIMESTAMP))", + # Week starting Sunday + "1969-12-28T00:00:00Z/P1W": "date_trunc('week', CAST({col} AS TIMESTAMP) + interval '1' day) - interval '1' day", # noqa + # Week starting Monday + "1969-12-29T00:00:00Z/P1W": "date_trunc('week', CAST({col} AS TIMESTAMP))", + # Week ending Saturday + "P1W/1970-01-03T00:00:00Z": "date_trunc('week', CAST({col} AS TIMESTAMP) + interval '1' day) + interval '5' day", # noqa + # Week ending Sunday + "P1W/1970-01-04T00:00:00Z": "date_trunc('week', CAST({col} AS TIMESTAMP)) + interval '6' day", # noqa + } + + @classmethod + def convert_dttm( + cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None + ) -> Optional[str]: + """ + Convert a Python `datetime` object to a SQL expression. + :param target_type: The target type of expression + :param dttm: The datetime object + :param db_extra: The database extra object + :return: The SQL expression + Superset only defines time zone naive `datetime` objects, though this method + handles both time zone naive and aware conversions. + """ + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): + return f"DATE '{dttm.date().isoformat()}'" + if isinstance(sqla_type, types.TIMESTAMP): + return f"""TIMESTAMP '{dttm.isoformat(timespec="microseconds", sep=" ")}'""" + + return None + + @classmethod + def epoch_to_dttm(cls) -> str: + return "from_unixtime({col})" + + @classmethod + def adjust_database_uri( + cls, uri: URL, selected_schema: Optional[str] = None + ) -> URL: + database = uri.database + if selected_schema and database: + selected_schema = parse.quote(selected_schema, safe="") + if "/" in database: + database = database.split("/")[0] + "/" + selected_schema + else: + database += "/" + selected_schema + uri = uri.set(database=database) + + return uri + + @classmethod + def estimate_statement_cost(cls, statement: str, cursor: Any) -> Dict[str, Any]: + """ + Run a SQL query that estimates the cost of a given statement. + :param statement: A single SQL statement + :param cursor: Cursor instance + :return: JSON response from Trino + """ + sql = f"EXPLAIN (TYPE IO, FORMAT JSON) {statement}" + cursor.execute(sql) + + # the output from Trino is a single column and a single row containing + # JSON: + # + # { + # ... + # "estimate" : { + # "outputRowCount" : 8.73265878E8, + # "outputSizeInBytes" : 3.41425774958E11, + # "cpuCost" : 3.41425774958E11, + # "maxMemory" : 0.0, + # "networkCost" : 3.41425774958E11 + # } + # } + result = json.loads(cursor.fetchone()[0]) + return result + + @classmethod + def query_cost_formatter( + cls, raw_cost: List[Dict[str, Any]] + ) -> List[Dict[str, str]]: + """ + Format cost estimate. + :param raw_cost: JSON estimate from Trino + :return: Human readable cost estimate + """ + + def humanize(value: Any, suffix: str) -> str: + try: + value = int(value) + except ValueError: + return str(value) + + prefixes = ["K", "M", "G", "T", "P", "E", "Z", "Y"] + prefix = "" + to_next_prefix = 1000 + while value > to_next_prefix and prefixes: + prefix = prefixes.pop(0) + value //= to_next_prefix + + return f"{value} {prefix}{suffix}" + + cost = [] + columns = [ + ("outputRowCount", "Output count", " rows"), + ("outputSizeInBytes", "Output size", "B"), + ("cpuCost", "CPU cost", ""), + ("maxMemory", "Max memory", "B"), + ("networkCost", "Network cost", ""), + ] + for row in raw_cost: + estimate: Dict[str, float] = row.get("estimate", {}) + statement_cost = {} + for key, label, suffix in columns: + if key in estimate: + statement_cost[label] = humanize(estimate[key], suffix).strip() + cost.append(statement_cost) + + return cost + + @classmethod + @cache_manager.data_cache.memoize() + def get_function_names(cls, database: Database) -> List[str]: + """ + Get a list of function names that are able to be called on the database. + Used for SQL Lab autocomplete. + + :param database: The database to get functions for + :return: A list of function names useable in the database + """ + return database.get_df("SHOW FUNCTIONS")["Function"].tolist() + + @classmethod + def _partition_query( # pylint: disable=too-many-arguments,too-many-locals + cls, + table_name: str, + database: Database, + limit: int = 0, + order_by: Optional[List[Tuple[str, bool]]] = None, + filters: Optional[Dict[Any, Any]] = None, + ) -> str: + """Returns a partition query + + :param table_name: the name of the table to get partitions from + :type table_name: str + :param limit: the number of partitions to be returned + :type limit: int + :param order_by: a list of tuples of field name and a boolean + that determines if that field should be sorted in descending + order + :type order_by: list of (str, bool) tuples + :param filters: dict of field name and filter value combinations + """ + limit_clause = "LIMIT {}".format(limit) if limit else "" + order_by_clause = "" + if order_by: + l = [] + for field, desc in order_by: + l.append(field + " DESC" if desc else "") + order_by_clause = "ORDER BY " + ", ".join(l) + + where_clause = "" + if filters: + l = [] + for field, value in filters.items(): + l.append(f"{field} = '{value}'") + where_clause = "WHERE " + " AND ".join(l) + + presto_version = database.get_extra().get("version") + + # Partition select syntax changed in v0.199, so check here. + # Default to the new syntax if version is unset. + partition_select_clause = ( + f'SELECT * FROM "{table_name}$partitions"' + if not presto_version + or StrictVersion(presto_version) >= StrictVersion("0.199") + else f"SHOW PARTITIONS FROM {table_name}" + ) + + sql = dedent( + f"""\ + {partition_select_clause} + {where_clause} + {order_by_clause} + {limit_clause} + """ + ) + return sql + + @classmethod + def where_latest_partition( # pylint: disable=too-many-arguments + cls, + table_name: str, + schema: Optional[str], + database: Database, + query: Select, + columns: Optional[List[Dict[str, str]]] = None, + ) -> Optional[Select]: + try: + col_names, values = cls.latest_partition( + table_name, schema, database, show_first=True + ) + except Exception: # pylint: disable=broad-except + # table is not partitioned + return None + + if values is None: + return None + + column_type_by_name = { + column.get("name"): column.get("type") for column in columns or [] + } + + for col_name, value in zip(col_names, values): + if col_name in column_type_by_name: + if column_type_by_name.get(col_name) == "TIMESTAMP": + query = query.where(Column(col_name, TimeStamp()) == value) + elif column_type_by_name.get(col_name) == "DATE": + query = query.where(Column(col_name, Date()) == value) + else: + query = query.where(Column(col_name) == value) + return query + + @classmethod + def _latest_partition_from_df(cls, df: pd.DataFrame) -> Optional[List[str]]: + if not df.empty: + return df.to_records(index=False)[0].item() + return None + + @classmethod + @cache_manager.data_cache.memoize(timeout=60) + def latest_partition( + cls, + table_name: str, + schema: Optional[str], + database: Database, + show_first: bool = False, + ) -> Tuple[List[str], Optional[List[str]]]: + """Returns col name and the latest (max) partition value for a table + + :param table_name: the name of the table + :param schema: schema / database / namespace + :param database: database query will be run against + :type database: models.Database + :param show_first: displays the value for the first partitioning key + if there are many partitioning keys + :type show_first: bool + + >>> latest_partition('foo_table') + (['ds'], ('2018-01-01',)) + """ + indexes = database.get_indexes(table_name, schema) + if not indexes: + raise SupersetTemplateException( + f"Error getting partition for {schema}.{table_name}. " + "Verify that this table has a partition." + ) + + if len(indexes[0]["column_names"]) < 1: + raise SupersetTemplateException( + "The table should have one partitioned field" + ) + + if not show_first and len(indexes[0]["column_names"]) > 1: + raise SupersetTemplateException( + "The table should have a single partitioned field " + "to use this function. You may want to use " + "`presto.latest_sub_partition`" + ) + + column_names = indexes[0]["column_names"] + part_fields = [(column_name, True) for column_name in column_names] + sql = cls._partition_query(table_name, database, 1, part_fields) + df = database.get_df(sql, schema) + return column_names, cls._latest_partition_from_df(df) + + @classmethod + def latest_sub_partition( + cls, table_name: str, schema: Optional[str], database: Database, **kwargs: Any + ) -> Any: + """Returns the latest (max) partition value for a table + + A filtering criteria should be passed for all fields that are + partitioned except for the field to be returned. For example, + if a table is partitioned by (``ds``, ``event_type`` and + ``event_category``) and you want the latest ``ds``, you'll want + to provide a filter as keyword arguments for both + ``event_type`` and ``event_category`` as in + ``latest_sub_partition('my_table', + event_category='page', event_type='click')`` + + :param table_name: the name of the table, can be just the table + name or a fully qualified table name as ``schema_name.table_name`` + :type table_name: str + :param schema: schema / database / namespace + :type schema: str + :param database: database query will be run against + :type database: models.Database + + :param kwargs: keyword arguments define the filtering criteria + on the partition list. There can be many of these. + :type kwargs: str + >>> latest_sub_partition('sub_partition_table', event_type='click') + '2018-01-01' + """ + indexes = database.get_indexes(table_name, schema) + part_fields = indexes[0]["column_names"] + for k in kwargs.keys(): # pylint: disable=consider-iterating-dictionary + if k not in k in part_fields: # pylint: disable=comparison-with-itself + msg = f"Field [{k}] is not part of the portioning key" + raise SupersetTemplateException(msg) + if len(kwargs.keys()) != len(part_fields) - 1: + msg = ( + "A filter needs to be specified for {} out of the " "{} fields." + ).format(len(part_fields) - 1, len(part_fields)) + raise SupersetTemplateException(msg) + + for field in part_fields: + if field not in kwargs.keys(): + field_to_return = field + + sql = cls._partition_query( + table_name, database, 1, [(field_to_return, True)], kwargs + ) + df = database.get_df(sql, schema) + if df.empty: + return "" + return df.to_dict()[field_to_return][0] -class PrestoEngineSpec(BaseEngineSpec): # pylint: disable=too-many-public-methods +class PrestoEngineSpec(PrestoBaseEngineSpec): engine = "presto" engine_name = "Presto" allows_alias_to_source_column = False - _time_grain_expressions = { - None: "{col}", - "PT1S": "date_trunc('second', CAST({col} AS TIMESTAMP))", - "PT1M": "date_trunc('minute', CAST({col} AS TIMESTAMP))", - "PT1H": "date_trunc('hour', CAST({col} AS TIMESTAMP))", - "P1D": "date_trunc('day', CAST({col} AS TIMESTAMP))", - "P1W": "date_trunc('week', CAST({col} AS TIMESTAMP))", - "P1M": "date_trunc('month', CAST({col} AS TIMESTAMP))", - "P3M": "date_trunc('quarter', CAST({col} AS TIMESTAMP))", - "P1Y": "date_trunc('year', CAST({col} AS TIMESTAMP))", - "P1W/1970-01-03T00:00:00Z": "date_add('day', 5, date_trunc('week', " - "date_add('day', 1, CAST({col} AS TIMESTAMP))))", - "1969-12-28T00:00:00Z/P1W": "date_add('day', -1, date_trunc('week', " - "date_add('day', 1, CAST({col} AS TIMESTAMP))))", - } - custom_errors: Dict[Pattern[str], Tuple[str, SupersetErrorType, Dict[str, Any]]] = { COLUMN_DOES_NOT_EXIST_REGEX: ( __( @@ -249,46 +684,79 @@ def update_impersonation_config( @classmethod def get_table_names( - cls, database: "Database", inspector: Inspector, schema: Optional[str] - ) -> List[str]: - tables = super().get_table_names(database, inspector, schema) - if not is_feature_enabled("PRESTO_SPLIT_VIEWS_FROM_TABLES"): - return tables + cls, + database: Database, + inspector: Inspector, + schema: Optional[str], + ) -> Set[str]: + """ + Get all the real table names within the specified schema. + + Per the SQLAlchemy definition if the schema is omitted the database’s default + schema is used, however some dialects infer the request as schema agnostic. - views = set(cls.get_view_names(database, inspector, schema)) - actual_tables = set(tables) - views - return list(actual_tables) + Note that PyHive's Hive and Presto SQLAlchemy dialects do not adhere to the + specification where the `get_table_names` method returns both real tables and + views. Futhermore the dialects wrongfully infer the request as schema agnostic + when the schema is omitted. + + :param database: The database to inspect + :param inspector: The SQLAlchemy inspector + :param schema: The schema to inspect + :returns: The physical table names + """ + + return super().get_table_names( + database, inspector, schema + ) - cls.get_view_names(database, inspector, schema) @classmethod def get_view_names( - cls, database: "Database", inspector: Inspector, schema: Optional[str] - ) -> List[str]: - """Returns an empty list + cls, + database: Database, + inspector: Inspector, + schema: Optional[str], + ) -> Set[str]: + """ + Get all the view names within the specified schema. + + Per the SQLAlchemy definition if the schema is omitted the database’s default + schema is used, however some dialects infer the request as schema agnostic. + + Note that PyHive's Presto SQLAlchemy dialect does not adhere to the + specification as the `get_view_names` method is not defined. Futhermore the + dialect wrongfully infers the request as schema agnostic when the schema is + omitted. - get_table_names() function returns all table names and view names, - and get_view_names() is not implemented in sqlalchemy_presto.py - https://github.com/dropbox/PyHive/blob/e25fc8440a0686bbb7a5db5de7cb1a77bdb4167a/pyhive/sqlalchemy_presto.py + :param database: The database to inspect + :param inspector: The SQLAlchemy inspector + :param schema: The schema to inspect + :returns: The view names """ - if not is_feature_enabled("PRESTO_SPLIT_VIEWS_FROM_TABLES"): - return [] if schema: - sql = ( - "SELECT table_name FROM information_schema.views " - "WHERE table_schema=%(schema)s" - ) + sql = dedent( + """ + SELECT table_name FROM information_schema.tables + WHERE table_schema = %(schema)s + AND table_type = 'VIEW' + """ + ).strip() params = {"schema": schema} else: - sql = "SELECT table_name FROM information_schema.views" + sql = dedent( + """ + SELECT table_name FROM information_schema.tables + WHERE table_type = 'VIEW' + """ + ).strip() params = {} - engine = cls.get_engine(database, schema=schema) - with closing(engine.raw_connection()) as conn: + with database.get_raw_connection(schema=schema) as conn: cursor = conn.cursor() cursor.execute(sql, params) results = cursor.fetchall() - - return [row[0] for row in results] + return {row[0] for row in results} @classmethod def _create_column_info( @@ -430,7 +898,7 @@ def _parse_structural_column( # pylint: disable=too-many-locals @classmethod def _show_columns( cls, inspector: Inspector, table_name: str, schema: Optional[str] - ) -> List[RowProxy]: + ) -> List[ResultRow]: """ Show presto column names :param inspector: object that performs database schema inspection @@ -442,94 +910,7 @@ def _show_columns( full_table = quote(table_name) if schema: full_table = "{}.{}".format(quote(schema), full_table) - columns = inspector.bind.execute("SHOW COLUMNS FROM {}".format(full_table)) - return columns - - column_type_mappings = ( - ( - re.compile(r"^boolean.*", re.IGNORECASE), - types.BOOLEAN, - GenericDataType.BOOLEAN, - ), - ( - re.compile(r"^tinyint.*", re.IGNORECASE), - TinyInteger(), - GenericDataType.NUMERIC, - ), - ( - re.compile(r"^smallint.*", re.IGNORECASE), - types.SMALLINT(), - GenericDataType.NUMERIC, - ), - ( - re.compile(r"^integer.*", re.IGNORECASE), - types.INTEGER(), - GenericDataType.NUMERIC, - ), - ( - re.compile(r"^bigint.*", re.IGNORECASE), - types.BIGINT(), - GenericDataType.NUMERIC, - ), - ( - re.compile(r"^real.*", re.IGNORECASE), - types.FLOAT(), - GenericDataType.NUMERIC, - ), - ( - re.compile(r"^double.*", re.IGNORECASE), - types.FLOAT(), - GenericDataType.NUMERIC, - ), - ( - re.compile(r"^decimal.*", re.IGNORECASE), - types.DECIMAL(), - GenericDataType.NUMERIC, - ), - ( - re.compile(r"^varchar(\((\d+)\))*$", re.IGNORECASE), - lambda match: types.VARCHAR(int(match[2])) if match[2] else types.String(), - GenericDataType.STRING, - ), - ( - re.compile(r"^char(\((\d+)\))*$", re.IGNORECASE), - lambda match: types.CHAR(int(match[2])) if match[2] else types.CHAR(), - GenericDataType.STRING, - ), - ( - re.compile(r"^varbinary.*", re.IGNORECASE), - types.VARBINARY(), - GenericDataType.STRING, - ), - ( - re.compile(r"^json.*", re.IGNORECASE), - types.JSON(), - GenericDataType.STRING, - ), - ( - re.compile(r"^date.*", re.IGNORECASE), - types.DATE(), - GenericDataType.TEMPORAL, - ), - ( - re.compile(r"^timestamp.*", re.IGNORECASE), - types.TIMESTAMP(), - GenericDataType.TEMPORAL, - ), - ( - re.compile(r"^interval.*", re.IGNORECASE), - Interval(), - GenericDataType.TEMPORAL, - ), - ( - re.compile(r"^time.*", re.IGNORECASE), - types.Time(), - GenericDataType.TEMPORAL, - ), - (re.compile(r"^array.*", re.IGNORECASE), Array(), GenericDataType.STRING), - (re.compile(r"^map.*", re.IGNORECASE), Map(), GenericDataType.STRING), - (re.compile(r"^row.*", re.IGNORECASE), Row(), GenericDataType.STRING), - ) + return inspector.bind.execute(f"SHOW COLUMNS FROM {full_table}").fetchall() @classmethod def get_columns( @@ -615,178 +996,44 @@ def _get_fields(cls, cols: List[Dict[str, Any]]) -> List[ColumnClause]: # create column clause in the format "name"."name" AS "name.name" column_clause = literal_column(quoted_col_name).label(col["name"]) column_clauses.append(column_clause) - return column_clauses - - @classmethod - def select_star( # pylint: disable=too-many-arguments - cls, - database: "Database", - table_name: str, - engine: Engine, - schema: Optional[str] = None, - limit: int = 100, - show_cols: bool = False, - indent: bool = True, - latest_partition: bool = True, - cols: Optional[List[Dict[str, Any]]] = None, - ) -> str: - """ - Include selecting properties of row objects. We cannot easily break arrays into - rows, so render the whole array in its own row and skip columns that correspond - to an array's contents. - """ - cols = cols or [] - presto_cols = cols - if is_feature_enabled("PRESTO_EXPAND_DATA") and show_cols: - dot_regex = r"\.(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)" - presto_cols = [ - col for col in presto_cols if not re.search(dot_regex, col["name"]) - ] - return super().select_star( - database, - table_name, - engine, - schema, - limit, - show_cols, - indent, - latest_partition, - presto_cols, - ) - - @classmethod - def estimate_statement_cost(cls, statement: str, cursor: Any) -> Dict[str, Any]: - """ - Run a SQL query that estimates the cost of a given statement. - - :param statement: A single SQL statement - :param cursor: Cursor instance - :return: JSON response from Presto - """ - sql = f"EXPLAIN (TYPE IO, FORMAT JSON) {statement}" - cursor.execute(sql) - - # the output from Presto is a single column and a single row containing - # JSON: - # - # { - # ... - # "estimate" : { - # "outputRowCount" : 8.73265878E8, - # "outputSizeInBytes" : 3.41425774958E11, - # "cpuCost" : 3.41425774958E11, - # "maxMemory" : 0.0, - # "networkCost" : 3.41425774958E11 - # } - # } - result = json.loads(cursor.fetchone()[0]) - return result - - @classmethod - def query_cost_formatter( - cls, raw_cost: List[Dict[str, Any]] - ) -> List[Dict[str, str]]: - """ - Format cost estimate. - - :param raw_cost: JSON estimate from Presto - :return: Human readable cost estimate - """ - - def humanize(value: Any, suffix: str) -> str: - try: - value = int(value) - except ValueError: - return str(value) - - prefixes = ["K", "M", "G", "T", "P", "E", "Z", "Y"] - prefix = "" - to_next_prefix = 1000 - while value > to_next_prefix and prefixes: - prefix = prefixes.pop(0) - value //= to_next_prefix - - return f"{value} {prefix}{suffix}" - - cost = [] - columns = [ - ("outputRowCount", "Output count", " rows"), - ("outputSizeInBytes", "Output size", "B"), - ("cpuCost", "CPU cost", ""), - ("maxMemory", "Max memory", "B"), - ("networkCost", "Network cost", ""), - ] - for row in raw_cost: - estimate: Dict[str, float] = row.get("estimate", {}) - statement_cost = {} - for key, label, suffix in columns: - if key in estimate: - statement_cost[label] = humanize(estimate[key], suffix).strip() - cost.append(statement_cost) - - return cost - - @classmethod - def adjust_database_uri( - cls, uri: URL, selected_schema: Optional[str] = None - ) -> None: - database = uri.database - if selected_schema and database: - selected_schema = parse.quote(selected_schema, safe="") - if "/" in database: - database = database.split("/")[0] + "/" + selected_schema - else: - database += "/" + selected_schema - uri.database = database - - @classmethod - def convert_dttm( - cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None - ) -> Optional[str]: - """ - Convert a Python `datetime` object to a SQL expression. - - :param target_type: The target type of expression - :param dttm: The datetime object - :param db_extra: The database extra object - :return: The SQL expression - - Superset only defines time zone naive `datetime` objects, though this method - handles both time zone naive and aware conversions. - """ - tt = target_type.upper() - if tt == utils.TemporalType.DATE: - return f"""DATE '{dttm.date().isoformat()}'""" - if tt in ( - utils.TemporalType.TIMESTAMP, - utils.TemporalType.TIMESTAMP_WITH_TIME_ZONE, - ): - return f"""TIMESTAMP '{dttm.isoformat(timespec="milliseconds", sep=" ")}'""" - return None - - @classmethod - def epoch_to_dttm(cls) -> str: - return "from_unixtime({col})" + return column_clauses @classmethod - def get_all_datasource_names( - cls, database: "Database", datasource_type: str - ) -> List[utils.DatasourceName]: - datasource_df = database.get_df( - "SELECT table_schema, table_name FROM INFORMATION_SCHEMA.{}S " - "ORDER BY concat(table_schema, '.', table_name)".format( - datasource_type.upper() - ), - None, + def select_star( # pylint: disable=too-many-arguments + cls, + database: Database, + table_name: str, + engine: Engine, + schema: Optional[str] = None, + limit: int = 100, + show_cols: bool = False, + indent: bool = True, + latest_partition: bool = True, + cols: Optional[List[Dict[str, Any]]] = None, + ) -> str: + """ + Include selecting properties of row objects. We cannot easily break arrays into + rows, so render the whole array in its own row and skip columns that correspond + to an array's contents. + """ + cols = cols or [] + presto_cols = cols + if is_feature_enabled("PRESTO_EXPAND_DATA") and show_cols: + dot_regex = r"\.(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)" + presto_cols = [ + col for col in presto_cols if not re.search(dot_regex, col["name"]) + ] + return super().select_star( + database, + table_name, + engine, + schema, + limit, + show_cols, + indent, + latest_partition, + presto_cols, ) - datasource_names: List[utils.DatasourceName] = [] - for _unused, row in datasource_df.iterrows(): - datasource_names.append( - utils.DatasourceName( - schema=row["table_schema"], table=row["table_name"] - ) - ) - return datasource_names @classmethod def expand_data( # pylint: disable=too-many-locals @@ -899,27 +1146,30 @@ def expand_data( # pylint: disable=too-many-locals @classmethod def extra_table_metadata( - cls, database: "Database", table_name: str, schema_name: Optional[str] + cls, database: Database, table_name: str, schema_name: Optional[str] ) -> Dict[str, Any]: metadata = {} indexes = database.get_indexes(table_name, schema_name) if indexes: - cols = indexes[0].get("column_names", []) - full_table_name = table_name - if schema_name and "." not in table_name: - full_table_name = "{}.{}".format(schema_name, table_name) - pql = cls._partition_query(full_table_name, database) col_names, latest_parts = cls.latest_partition( table_name, schema_name, database, show_first=True ) if not latest_parts: latest_parts = tuple([None] * len(col_names)) + metadata["partitions"] = { - "cols": cols, + "cols": sorted(indexes[0].get("column_names", [])), "latest": dict(zip(col_names, latest_parts)), - "partitionQuery": pql, + "partitionQuery": cls._partition_query( + table_name=( + f"{schema_name}.{table_name}" + if schema_name and "." not in table_name + else table_name + ), + database=database, + ), } # flake8 is not matching `Optional[str]` to `Any` for some reason... @@ -931,7 +1181,7 @@ def extra_table_metadata( @classmethod def get_create_view( - cls, database: "Database", schema: Optional[str], table: str + cls, database: Database, schema: Optional[str], table: str ) -> Optional[str]: """ Return a CREATE VIEW statement, or `None` if not a view. @@ -943,21 +1193,35 @@ def get_create_view( # pylint: disable=import-outside-toplevel from pyhive.exc import DatabaseError - engine = cls.get_engine(database, schema) - with closing(engine.raw_connection()) as conn: + with database.get_raw_connection(schema=schema) as conn: cursor = conn.cursor() sql = f"SHOW CREATE VIEW {schema}.{table}" try: cls.execute(cursor, sql) - except DatabaseError: # not a VIEW return None rows = cls.fetch_data(cursor, 1) - return rows[0][0] + + return rows[0][0] @classmethod - def handle_cursor(cls, cursor: Any, query: Query, session: Session) -> None: + def get_tracking_url(cls, cursor: "Cursor") -> Optional[str]: + try: + if cursor.last_query_id: + # pylint: disable=protected-access, line-too-long + return f"{cursor._protocol}://{cursor._host}:{cursor._port}/ui/query.html?{cursor.last_query_id}" + except AttributeError: + pass + return None + + @classmethod + def handle_cursor(cls, cursor: "Cursor", query: Query, session: Session) -> None: """Updates progress information""" + tracking_url = cls.get_tracking_url(cursor) + if tracking_url: + query.tracking_url = tracking_url + session.commit() + query_id = query.id poll_interval = query.database.connect_args.get( "poll_interval", current_app.config["PRESTO_POLL_INTERVAL"] @@ -1017,243 +1281,11 @@ def _extract_error_message(cls, ex: Exception) -> str: return error_dict.get("message", _("Unknown Presto Error")) return utils.error_msg_from_exception(ex) - @classmethod - def _partition_query( # pylint: disable=too-many-arguments,too-many-locals - cls, - table_name: str, - database: "Database", - limit: int = 0, - order_by: Optional[List[Tuple[str, bool]]] = None, - filters: Optional[Dict[Any, Any]] = None, - ) -> str: - """Returns a partition query - - :param table_name: the name of the table to get partitions from - :type table_name: str - :param limit: the number of partitions to be returned - :type limit: int - :param order_by: a list of tuples of field name and a boolean - that determines if that field should be sorted in descending - order - :type order_by: list of (str, bool) tuples - :param filters: dict of field name and filter value combinations - """ - limit_clause = "LIMIT {}".format(limit) if limit else "" - order_by_clause = "" - if order_by: - l = [] - for field, desc in order_by: - l.append(field + " DESC" if desc else "") - order_by_clause = "ORDER BY " + ", ".join(l) - - where_clause = "" - if filters: - l = [] - for field, value in filters.items(): - l.append(f"{field} = '{value}'") - where_clause = "WHERE " + " AND ".join(l) - - presto_version = database.get_extra().get("version") - - # Partition select syntax changed in v0.199, so check here. - # Default to the new syntax if version is unset. - partition_select_clause = ( - f'SELECT * FROM "{table_name}$partitions"' - if not presto_version - or StrictVersion(presto_version) >= StrictVersion("0.199") - else f"SHOW PARTITIONS FROM {table_name}" - ) - - sql = textwrap.dedent( - f"""\ - {partition_select_clause} - {where_clause} - {order_by_clause} - {limit_clause} - """ - ) - return sql - - @classmethod - def where_latest_partition( # pylint: disable=too-many-arguments - cls, - table_name: str, - schema: Optional[str], - database: "Database", - query: Select, - columns: Optional[List[Dict[str, str]]] = None, - ) -> Optional[Select]: - try: - col_names, values = cls.latest_partition( - table_name, schema, database, show_first=True - ) - except Exception: # pylint: disable=broad-except - # table is not partitioned - return None - - if values is None: - return None - - column_type_by_name = { - column.get("name"): column.get("type") for column in columns or [] - } - - for col_name, value in zip(col_names, values): - if col_name in column_type_by_name: - if column_type_by_name.get(col_name) == "TIMESTAMP": - query = query.where(Column(col_name, TimeStamp()) == value) - elif column_type_by_name.get(col_name) == "DATE": - query = query.where(Column(col_name, Date()) == value) - else: - query = query.where(Column(col_name) == value) - return query - - @classmethod - def _latest_partition_from_df(cls, df: pd.DataFrame) -> Optional[List[str]]: - if not df.empty: - return df.to_records(index=False)[0].item() - return None - - @classmethod - @cache_manager.data_cache.memoize(timeout=60) - def latest_partition( - cls, - table_name: str, - schema: Optional[str], - database: "Database", - show_first: bool = False, - ) -> Tuple[List[str], Optional[List[str]]]: - """Returns col name and the latest (max) partition value for a table - - :param table_name: the name of the table - :param schema: schema / database / namespace - :param database: database query will be run against - :type database: models.Database - :param show_first: displays the value for the first partitioning key - if there are many partitioning keys - :type show_first: bool - - >>> latest_partition('foo_table') - (['ds'], ('2018-01-01',)) - """ - indexes = database.get_indexes(table_name, schema) - if not indexes: - raise SupersetTemplateException( - f"Error getting partition for {schema}.{table_name}. " - "Verify that this table has a partition." - ) - - if len(indexes[0]["column_names"]) < 1: - raise SupersetTemplateException( - "The table should have one partitioned field" - ) - - if not show_first and len(indexes[0]["column_names"]) > 1: - raise SupersetTemplateException( - "The table should have a single partitioned field " - "to use this function. You may want to use " - "`presto.latest_sub_partition`" - ) - - column_names = indexes[0]["column_names"] - part_fields = [(column_name, True) for column_name in column_names] - sql = cls._partition_query(table_name, database, 1, part_fields) - df = database.get_df(sql, schema) - return column_names, cls._latest_partition_from_df(df) - - @classmethod - def latest_sub_partition( - cls, table_name: str, schema: Optional[str], database: "Database", **kwargs: Any - ) -> Any: - """Returns the latest (max) partition value for a table - - A filtering criteria should be passed for all fields that are - partitioned except for the field to be returned. For example, - if a table is partitioned by (``ds``, ``event_type`` and - ``event_category``) and you want the latest ``ds``, you'll want - to provide a filter as keyword arguments for both - ``event_type`` and ``event_category`` as in - ``latest_sub_partition('my_table', - event_category='page', event_type='click')`` - - :param table_name: the name of the table, can be just the table - name or a fully qualified table name as ``schema_name.table_name`` - :type table_name: str - :param schema: schema / database / namespace - :type schema: str - :param database: database query will be run against - :type database: models.Database - - :param kwargs: keyword arguments define the filtering criteria - on the partition list. There can be many of these. - :type kwargs: str - >>> latest_sub_partition('sub_partition_table', event_type='click') - '2018-01-01' - """ - indexes = database.get_indexes(table_name, schema) - part_fields = indexes[0]["column_names"] - for k in kwargs.keys(): # pylint: disable=consider-iterating-dictionary - if k not in k in part_fields: # pylint: disable=comparison-with-itself - msg = f"Field [{k}] is not part of the portioning key" - raise SupersetTemplateException(msg) - if len(kwargs.keys()) != len(part_fields) - 1: - msg = ( - "A filter needs to be specified for {} out of the " "{} fields." - ).format(len(part_fields) - 1, len(part_fields)) - raise SupersetTemplateException(msg) - - for field in part_fields: - if field not in kwargs.keys(): - field_to_return = field - - sql = cls._partition_query( - table_name, database, 1, [(field_to_return, True)], kwargs - ) - df = database.get_df(sql, schema) - if df.empty: - return "" - return df.to_dict()[field_to_return][0] - - @classmethod - @cache_manager.data_cache.memoize() - def get_function_names(cls, database: "Database") -> List[str]: - """ - Get a list of function names that are able to be called on the database. - Used for SQL Lab autocomplete. - - :param database: The database to get functions for - :return: A list of function names useable in the database - """ - return database.get_df("SHOW FUNCTIONS")["Function"].tolist() - - @classmethod - def is_readonly_query(cls, parsed_query: ParsedQuery) -> bool: - """Pessimistic readonly, 100% sure statement won't mutate anything""" - return super().is_readonly_query(parsed_query) or parsed_query.is_show() - - @classmethod - def get_column_spec( - cls, - native_type: Optional[str], - db_extra: Optional[Dict[str, Any]] = None, - source: utils.ColumnTypeSource = utils.ColumnTypeSource.GET_TABLE, - column_type_mappings: Tuple[ColumnTypeMapping, ...] = column_type_mappings, - ) -> Optional[ColumnSpec]: - - column_spec = super().get_column_spec( - native_type, column_type_mappings=column_type_mappings - ) - - if column_spec: - return column_spec - - return super().get_column_spec(native_type) - @classmethod def has_implicit_cancel(cls) -> bool: """ Return True if the live cursor handles the implicit cancelation of the query, - False otherise. + False otherwise. :return: Whether the live cursor implicitly cancels the query :see: handle_cursor diff --git a/superset/common/request_contexed_based.py b/superset/db_engine_specs/risingwave.py similarity index 73% rename from superset/common/request_contexed_based.py rename to superset/db_engine_specs/risingwave.py index 5d8405e36cf0..8f7b1c7de26a 100644 --- a/superset/common/request_contexed_based.py +++ b/superset/db_engine_specs/risingwave.py @@ -14,12 +14,10 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from __future__ import annotations +from superset.db_engine_specs.postgres import PostgresEngineSpec -from superset import conf, security_manager - -def is_user_admin() -> bool: - user_roles = [role.name.lower() for role in security_manager.get_user_roles()] - admin_role = conf.get("AUTH_ROLE_ADMIN").lower() - return admin_role in user_roles +class RisingWaveDbEngineSpec(PostgresEngineSpec): + engine = "risingwave" + engine_name = "RisingWave" + default_driver = "" diff --git a/superset/db_engine_specs/rockset.py b/superset/db_engine_specs/rockset.py index 606b860a5e64..3778c527560f 100644 --- a/superset/db_engine_specs/rockset.py +++ b/superset/db_engine_specs/rockset.py @@ -17,8 +17,9 @@ from datetime import datetime from typing import Any, Dict, Optional, TYPE_CHECKING +from sqlalchemy import types + from superset.db_engine_specs.base import BaseEngineSpec -from superset.utils import core as utils if TYPE_CHECKING: from superset.connectors.sqla.models import TableColumn @@ -53,15 +54,16 @@ def epoch_ms_to_dttm(cls) -> str: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"DATE '{dttm.date().isoformat()}'" - if tt == utils.TemporalType.DATETIME: - dttm_formatted = dttm.isoformat(sep=" ", timespec="microseconds") - return f"""DATETIME '{dttm_formatted}'""" - if tt == utils.TemporalType.TIMESTAMP: + if isinstance(sqla_type, types.TIMESTAMP): dttm_formatted = dttm.isoformat(timespec="microseconds") return f"""TIMESTAMP '{dttm_formatted}'""" + if isinstance(sqla_type, types.DateTime): + dttm_formatted = dttm.isoformat(sep=" ", timespec="microseconds") + return f"""DATETIME '{dttm_formatted}'""" return None @classmethod diff --git a/superset/db_engine_specs/shillelagh.py b/superset/db_engine_specs/shillelagh.py index c6e6f618c725..37301224484b 100644 --- a/superset/db_engine_specs/shillelagh.py +++ b/superset/db_engine_specs/shillelagh.py @@ -20,7 +20,11 @@ class ShillelaghEngineSpec(SqliteEngineSpec): """Engine for shillelagh""" - engine = "shillelagh" engine_name = "Shillelagh" + engine = "shillelagh" + drivers = {"apsw": "SQLite driver"} + default_driver = "apsw" + sqlalchemy_uri_placeholder = "shillelagh://" + allows_joins = True allows_subqueries = True diff --git a/superset/db_engine_specs/snowflake.py b/superset/db_engine_specs/snowflake.py index cf645f8b74c2..419e0a0655fe 100644 --- a/superset/db_engine_specs/snowflake.py +++ b/superset/db_engine_specs/snowflake.py @@ -15,6 +15,7 @@ # specific language governing permissions and limitations # under the License. import json +import logging import re from datetime import datetime from typing import Any, Dict, List, Optional, Pattern, Tuple, TYPE_CHECKING @@ -22,16 +23,21 @@ from apispec import APISpec from apispec.ext.marshmallow import MarshmallowPlugin +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import serialization +from flask import current_app from flask_babel import gettext as __ from marshmallow import fields, Schema +from sqlalchemy import types from sqlalchemy.engine.url import URL from typing_extensions import TypedDict +from superset.constants import USER_AGENT from superset.databases.utils import make_url_safe +from superset.db_engine_specs.base import BaseEngineSpec, BasicPropertiesType from superset.db_engine_specs.postgres import PostgresBaseEngineSpec from superset.errors import ErrorLevel, SupersetError, SupersetErrorType from superset.models.sql_lab import Query -from superset.utils import core as utils if TYPE_CHECKING: from superset.models.core import Database @@ -46,6 +52,8 @@ "unexpected '(?P<syntax_error>.+?)'." ) +logger = logging.getLogger(__name__) + class SnowflakeParametersSchema(Schema): username = fields.Str(required=True) @@ -111,16 +119,31 @@ class SnowflakeEngineSpec(PostgresBaseEngineSpec): ), } + @staticmethod + def get_extra_params(database: "Database") -> Dict[str, Any]: + """ + Add a user agent to be used in the requests. + """ + extra: Dict[str, Any] = BaseEngineSpec.get_extra_params(database) + engine_params: Dict[str, Any] = extra.setdefault("engine_params", {}) + connect_args: Dict[str, Any] = engine_params.setdefault("connect_args", {}) + + connect_args.setdefault("application", USER_AGENT) + + return extra + @classmethod def adjust_database_uri( cls, uri: URL, selected_schema: Optional[str] = None - ) -> None: + ) -> URL: database = uri.database if "/" in uri.database: database = uri.database.split("/")[0] if selected_schema: selected_schema = parse.quote(selected_schema, safe="") - uri.database = database + "/" + selected_schema + uri = uri.set(database=f"{database}/{selected_schema}") + + return uri @classmethod def epoch_to_dttm(cls) -> str: @@ -134,13 +157,14 @@ def epoch_ms_to_dttm(cls) -> str: def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt == utils.TemporalType.DATE: + sqla_type = cls.get_sqla_column_type(target_type) + + if isinstance(sqla_type, types.Date): return f"TO_DATE('{dttm.date().isoformat()}')" - if tt == utils.TemporalType.DATETIME: - return f"""CAST('{dttm.isoformat(timespec="microseconds")}' AS DATETIME)""" - if tt == utils.TemporalType.TIMESTAMP: + if isinstance(sqla_type, types.TIMESTAMP): return f"""TO_TIMESTAMP('{dttm.isoformat(timespec="microseconds")}')""" + if isinstance(sqla_type, types.DateTime): + return f"""CAST('{dttm.isoformat(timespec="microseconds")}' AS DATETIME)""" return None @staticmethod @@ -234,7 +258,7 @@ def get_parameters_from_uri( @classmethod def validate_parameters( - cls, parameters: SnowflakeParametersType + cls, properties: BasicPropertiesType ) -> List[SupersetError]: errors: List[SupersetError] = [] required = { @@ -245,6 +269,7 @@ def validate_parameters( "role", "password", } + parameters = properties.get("parameters", {}) present = {key for key in parameters if parameters.get(key, ())} missing = sorted(required - present) @@ -277,3 +302,52 @@ def parameters_json_schema(cls) -> Any: spec.components.schema(cls.__name__, schema=cls.parameters_schema) return spec.to_dict()["components"]["schemas"][cls.__name__] + + @staticmethod + def update_params_from_encrypted_extra( + database: "Database", + params: Dict[str, Any], + ) -> None: + if not database.encrypted_extra: + return + try: + encrypted_extra = json.loads(database.encrypted_extra) + except json.JSONDecodeError as ex: + logger.error(ex, exc_info=True) + raise ex + auth_method = encrypted_extra.get("auth_method", None) + auth_params = encrypted_extra.get("auth_params", {}) + if not auth_method: + return + connect_args = params.setdefault("connect_args", {}) + if auth_method == "keypair": + privatekey_body = auth_params.get("privatekey_body", None) + key = None + if privatekey_body: + key = privatekey_body.encode() + else: + with open(auth_params["privatekey_path"], "rb") as key_temp: + key = key_temp.read() + p_key = serialization.load_pem_private_key( + key, + password=auth_params["privatekey_pass"].encode(), + backend=default_backend(), + ) + pkb = p_key.private_bytes( + encoding=serialization.Encoding.DER, + format=serialization.PrivateFormat.PKCS8, + encryption_algorithm=serialization.NoEncryption(), + ) + connect_args["private_key"] = pkb + else: + allowed_extra_auths = current_app.config[ + "ALLOWED_EXTRA_AUTHENTICATIONS" + ].get("snowflake", {}) + if auth_method in allowed_extra_auths: + snowflake_auth = allowed_extra_auths.get(auth_method) + else: + raise ValueError( + f"For security reason, custom authentication '{auth_method}' " + f"must be listed in 'ALLOWED_EXTRA_AUTHENTICATIONS' config" + ) + connect_args["auth"] = snowflake_auth(**auth_params) diff --git a/superset/db_engine_specs/spark.py b/superset/db_engine_specs/spark.py new file mode 100644 index 000000000000..a6eeb2e9db4d --- /dev/null +++ b/superset/db_engine_specs/spark.py @@ -0,0 +1,41 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from superset.db_engine_specs.hive import HiveEngineSpec + +time_grain_expressions = { + None: "{col}", + "PT1S": "date_trunc('second', {col})", + "PT1M": "date_trunc('minute', {col})", + "PT1H": "date_trunc('hour', {col})", + "P1D": "date_trunc('day', {col})", + "P1W": "date_trunc('week', {col})", + "P1M": "date_trunc('month', {col})", + "P3M": "date_trunc('quarter', {col})", + "P1Y": "date_trunc('year', {col})", + "P1W/1970-01-03T00:00:00Z": ( + "date_trunc('week', {col} + interval '1 day') + interval '5 days'" + ), + "1969-12-28T00:00:00Z/P1W": ( + "date_trunc('week', {col} + interval '1 day') - interval '1 day'" + ), +} + + +class SparkEngineSpec(HiveEngineSpec): + _time_grain_expressions = time_grain_expressions + engine_name = "Apache Spark SQL" diff --git a/superset/db_engine_specs/sqlite.py b/superset/db_engine_specs/sqlite.py index b82b498c1689..a41414329633 100644 --- a/superset/db_engine_specs/sqlite.py +++ b/superset/db_engine_specs/sqlite.py @@ -16,14 +16,14 @@ # under the License. import re from datetime import datetime -from typing import Any, Dict, List, Optional, Pattern, Tuple, TYPE_CHECKING +from typing import Any, Dict, Optional, Pattern, Set, Tuple, TYPE_CHECKING from flask_babel import gettext as __ +from sqlalchemy import types from sqlalchemy.engine.reflection import Inspector from superset.db_engine_specs.base import BaseEngineSpec from superset.errors import SupersetErrorType -from superset.utils import core as utils if TYPE_CHECKING: # prevent circular imports @@ -72,50 +72,18 @@ class SqliteEngineSpec(BaseEngineSpec): def epoch_to_dttm(cls) -> str: return "datetime({col}, 'unixepoch')" - @classmethod - def get_all_datasource_names( - cls, database: "Database", datasource_type: str - ) -> List[utils.DatasourceName]: - schemas = database.get_all_schema_names( - cache=database.schema_cache_enabled, - cache_timeout=database.schema_cache_timeout, - force=True, - ) - schema = schemas[0] - if datasource_type == "table": - return [ - utils.DatasourceName(*datasource_name) - for datasource_name in database.get_all_table_names_in_schema( - schema=schema, - force=True, - cache=database.table_cache_enabled, - cache_timeout=database.table_cache_timeout, - ) - ] - if datasource_type == "view": - return [ - utils.DatasourceName(*datasource_name) - for datasource_name in database.get_all_view_names_in_schema( - schema=schema, - force=True, - cache=database.table_cache_enabled, - cache_timeout=database.table_cache_timeout, - ) - ] - raise Exception(f"Unsupported datasource_type: {datasource_type}") - @classmethod def convert_dttm( cls, target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - tt = target_type.upper() - if tt in (utils.TemporalType.TEXT, utils.TemporalType.DATETIME): - return f"""'{dttm.isoformat(sep=" ", timespec="microseconds")}'""" + sqla_type = cls.get_sqla_column_type(target_type) + if isinstance(sqla_type, (types.String, types.DateTime)): + return f"""'{dttm.isoformat(sep=" ", timespec="seconds")}'""" return None @classmethod def get_table_names( cls, database: "Database", inspector: Inspector, schema: Optional[str] - ) -> List[str]: + ) -> Set[str]: """Need to disregard the schema for Sqlite""" - return sorted(inspector.get_table_names()) + return set(inspector.get_table_names()) diff --git a/superset/db_engine_specs/teradata.py b/superset/db_engine_specs/teradata.py index bd2ee5160530..887add24e909 100644 --- a/superset/db_engine_specs/teradata.py +++ b/superset/db_engine_specs/teradata.py @@ -36,7 +36,7 @@ class TeradataEngineSpec(BaseEngineSpec): "P1D": "TRUNC(CAST({col} as DATE), 'DDD')", "P1W": "TRUNC(CAST({col} as DATE), 'WW')", "P1M": "TRUNC(CAST({col} as DATE), 'MONTH')", - "P0.25Y": "TRUNC(CAST({col} as DATE), 'Q')", + "P3M": "TRUNC(CAST({col} as DATE), 'Q')", "P1Y": "TRUNC(CAST({col} as DATE), 'YEAR')", } diff --git a/superset/db_engine_specs/trino.py b/superset/db_engine_specs/trino.py index acddb9710026..712574efdd73 100644 --- a/superset/db_engine_specs/trino.py +++ b/superset/db_engine_specs/trino.py @@ -14,8 +14,10 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +from __future__ import annotations + import logging -from typing import Any, Dict, List, Optional, TYPE_CHECKING +from typing import Any, Dict, Optional, Type, TYPE_CHECKING import simplejson as json from flask import current_app @@ -23,23 +25,76 @@ from sqlalchemy.engine.url import URL from sqlalchemy.orm import Session +from superset.constants import QUERY_CANCEL_KEY, QUERY_EARLY_CANCEL_KEY, USER_AGENT from superset.databases.utils import make_url_safe from superset.db_engine_specs.base import BaseEngineSpec -from superset.db_engine_specs.presto import PrestoEngineSpec +from superset.db_engine_specs.exceptions import SupersetDBAPIConnectionError +from superset.db_engine_specs.presto import PrestoBaseEngineSpec from superset.models.sql_lab import Query from superset.utils import core as utils if TYPE_CHECKING: from superset.models.core import Database + try: + from trino.dbapi import Cursor + except ImportError: + pass + logger = logging.getLogger(__name__) -class TrinoEngineSpec(PrestoEngineSpec): +class TrinoEngineSpec(PrestoBaseEngineSpec): engine = "trino" - engine_aliases = {"trinonative"} # Required for backwards compatibility. engine_name = "Trino" + @classmethod + def extra_table_metadata( + cls, + database: Database, + table_name: str, + schema_name: Optional[str], + ) -> Dict[str, Any]: + metadata = {} + + indexes = database.get_indexes(table_name, schema_name) + if indexes: + col_names, latest_parts = cls.latest_partition( + table_name, schema_name, database, show_first=True + ) + + if not latest_parts: + latest_parts = tuple([None] * len(col_names)) + + metadata["partitions"] = { + "cols": sorted( + list( + set( + column_name + for index in indexes + if index.get("name") == "partition" + for column_name in index.get("column_names", []) + ) + ) + ), + "latest": dict(zip(col_names, latest_parts)), + "partitionQuery": cls._partition_query( + table_name=( + f"{schema_name}.{table_name}" + if schema_name and "." not in table_name + else table_name + ), + database=database, + ), + } + + if database.has_view_by_name(table_name, schema_name): + metadata["view"] = database.inspector.get_view_definition( + table_name, schema_name + ) + + return metadata + @classmethod def update_impersonation_config( cls, @@ -65,54 +120,90 @@ def update_impersonation_config( connect_args["user"] = username @classmethod - def modify_url_for_impersonation( + def get_url_for_impersonation( cls, url: URL, impersonate_user: bool, username: Optional[str] - ) -> None: + ) -> URL: """ - Modify the SQL Alchemy URL object with the user to impersonate if applicable. + Return a modified URL with the username set. + :param url: SQLAlchemy URL object :param impersonate_user: Flag indicating if impersonation is enabled :param username: Effective username """ # Do nothing and let update_impersonation_config take care of impersonation + return url @classmethod def get_allow_cost_estimate(cls, extra: Dict[str, Any]) -> bool: return True @classmethod - def get_table_names( - cls, - database: "Database", - inspector: Inspector, - schema: Optional[str], - ) -> List[str]: - return BaseEngineSpec.get_table_names( - database=database, - inspector=inspector, - schema=schema, - ) + def get_tracking_url(cls, cursor: Cursor) -> Optional[str]: + try: + return cursor.info_uri + except AttributeError: + try: + conn = cursor.connection + # pylint: disable=protected-access, line-too-long + return f"{conn.http_scheme}://{conn.host}:{conn.port}/ui/query.html?{cursor._query.query_id}" + except AttributeError: + pass + return None @classmethod - def get_view_names( - cls, - database: "Database", - inspector: Inspector, - schema: Optional[str], - ) -> List[str]: - return BaseEngineSpec.get_view_names( - database=database, - inspector=inspector, - schema=schema, + def handle_cursor(cls, cursor: Cursor, query: Query, session: Session) -> None: + tracking_url = cls.get_tracking_url(cursor) + if tracking_url: + query.tracking_url = tracking_url + + # Adds the executed query id to the extra payload so the query can be cancelled + query.set_extra_json_key( + key=QUERY_CANCEL_KEY, + value=(cancel_query_id := cursor.stats["queryId"]), ) + session.commit() + + # if query cancelation was requested prior to the handle_cursor call, but + # the query was still executed, trigger the actual query cancelation now + if query.extra.get(QUERY_EARLY_CANCEL_KEY): + cls.cancel_query( + cursor=cursor, + query=query, + cancel_query_id=cancel_query_id, + ) + + super().handle_cursor(cursor=cursor, query=query, session=session) + @classmethod - def handle_cursor(cls, cursor: Any, query: Query, session: Session) -> None: - """Updates progress information""" - BaseEngineSpec.handle_cursor(cursor=cursor, query=query, session=session) + def prepare_cancel_query(cls, query: Query, session: Session) -> None: + if QUERY_CANCEL_KEY not in query.extra: + query.set_extra_json_key(QUERY_EARLY_CANCEL_KEY, True) + session.commit() + + @classmethod + def cancel_query(cls, cursor: Any, query: Query, cancel_query_id: str) -> bool: + """ + Cancel query in the underlying database. + + :param cursor: New cursor instance to the db of the query + :param query: Query instance + :param cancel_query_id: Trino `queryId` + :return: True if query cancelled successfully, False otherwise + """ + try: + cursor.execute( + f"CALL system.runtime.kill_query(query_id => '{cancel_query_id}'," + "message => 'Query cancelled by Superset')" + ) + cursor.fetchall() # needed to trigger the call + except Exception: # pylint: disable=broad-except + return False + + return True @staticmethod - def get_extra_params(database: "Database") -> Dict[str, Any]: + def get_extra_params(database: Database) -> Dict[str, Any]: """ Some databases require adding elements to connection parameters, like passing certificates to `extra`. This can be done here. @@ -124,6 +215,8 @@ def get_extra_params(database: "Database") -> Dict[str, Any]: engine_params: Dict[str, Any] = extra.setdefault("engine_params", {}) connect_args: Dict[str, Any] = engine_params.setdefault("connect_args", {}) + connect_args.setdefault("source", USER_AGENT) + if database.server_cert: connect_args["http_scheme"] = "https" connect_args["verify"] = utils.create_ssl_cert_file(database.server_cert) @@ -131,8 +224,9 @@ def get_extra_params(database: "Database") -> Dict[str, Any]: return extra @staticmethod - def update_encrypted_extra_params( - database: "Database", params: Dict[str, Any] + def update_params_from_encrypted_extra( + database: Database, + params: Dict[str, Any], ) -> None: if not database.encrypted_extra: return @@ -150,6 +244,8 @@ def update_encrypted_extra_params( from trino.auth import BasicAuthentication as trino_auth # noqa elif auth_method == "kerberos": from trino.auth import KerberosAuthentication as trino_auth # noqa + elif auth_method == "certificate": + from trino.auth import CertificateAuthentication as trino_auth # noqa elif auth_method == "jwt": from trino.auth import JWTAuthentication as trino_auth # noqa else: @@ -168,3 +264,12 @@ def update_encrypted_extra_params( except json.JSONDecodeError as ex: logger.error(ex, exc_info=True) raise ex + + @classmethod + def get_dbapi_exception_mapping(cls) -> Dict[Type[Exception], Type[Exception]]: + # pylint: disable=import-outside-toplevel + from requests import exceptions as requests_exceptions + + return { + requests_exceptions.ConnectionError: SupersetDBAPIConnectionError, + } diff --git a/superset/db_engines/hive.py b/superset/db_engines/hive.py deleted file mode 100644 index 0c4094fe3ef2..000000000000 --- a/superset/db_engines/hive.py +++ /dev/null @@ -1,67 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from typing import Optional, TYPE_CHECKING - -if TYPE_CHECKING: - from pyhive.hive import Cursor - from TCLIService.ttypes import TFetchOrientation - -# TODO: contribute back to pyhive. -def fetch_logs( # pylint: disable=protected-access - self: "Cursor", - _max_rows: int = 1024, - orientation: Optional["TFetchOrientation"] = None, -) -> str: - """Mocked. Retrieve the logs produced by the execution of the query. - Can be called multiple times to fetch the logs produced after - the previous call. - :returns: list<str> - :raises: ``ProgrammingError`` when no query has been started - .. note:: - This is not a part of DB-API. - """ - # pylint: disable=import-outside-toplevel - from pyhive import hive - from TCLIService import ttypes - from thrift import Thrift - - orientation = orientation or ttypes.TFetchOrientation.FETCH_NEXT - try: - req = ttypes.TGetLogReq(operationHandle=self._operationHandle) - logs = self._connection.client.GetLog(req).log - return logs - # raised if Hive is used - except (ttypes.TApplicationException, Thrift.TApplicationException) as ex: - if self._state == self._STATE_NONE: - raise hive.ProgrammingError("No query yet") from ex - logs = [] - while True: - req = ttypes.TFetchResultsReq( - operationHandle=self._operationHandle, - orientation=ttypes.TFetchOrientation.FETCH_NEXT, - maxRows=self.arraysize, - fetchType=1, # 0: results, 1: logs - ) - response = self._connection.client.FetchResults(req) - hive._check_status(response) - assert not response.results.rows, "expected data in columnar format" - assert len(response.results.columns) == 1, response.results.columns - new_logs = hive._unwrap_column(response.results.columns[0]) - logs += new_logs - if not new_logs: - break - return "\n".join(logs) diff --git a/superset/embedded/view.py b/superset/embedded/view.py index 487850b72885..8dd383aadafe 100644 --- a/superset/embedded/view.py +++ b/superset/embedded/view.py @@ -17,11 +17,12 @@ import json from typing import Callable -from flask import abort +from flask import abort, g, request from flask_appbuilder import expose -from flask_login import AnonymousUserMixin, LoginManager +from flask_login import AnonymousUserMixin, login_user +from flask_wtf.csrf import same_origin -from superset import event_logger, is_feature_enabled, security_manager +from superset import event_logger, is_feature_enabled from superset.embedded.dao import EmbeddedDAO from superset.superset_typing import FlaskResponse from superset.utils import core as utils @@ -50,14 +51,24 @@ def embedded( abort(404) embedded = EmbeddedDAO.find_by_id(uuid) + if not embedded: abort(404) + # validate request referrer in allowed domains + is_referrer_allowed = not embedded.allowed_domains + for domain in embedded.allowed_domains: + if same_origin(request.referrer, domain): + is_referrer_allowed = True + break + + if not is_referrer_allowed: + abort(403) + # Log in as an anonymous user, just for this view. # This view needs to be visible to all users, # and building the page fails if g.user and/or ctx.user aren't present. - login_manager: LoginManager = security_manager.lm - login_manager.reload_user(AnonymousUserMixin()) + login_user(AnonymousUserMixin(), force=True) add_extra_log_payload( embedded_dashboard_id=uuid, @@ -65,7 +76,7 @@ def embedded( ) bootstrap_data = { - "common": common_bootstrap_payload(), + "common": common_bootstrap_payload(g.user), "embedded": { "dashboard_id": embedded.dashboard_id, }, diff --git a/superset/errors.py b/superset/errors.py index 9198a82d3fe6..2df0eb82b26e 100644 --- a/superset/errors.py +++ b/superset/errors.py @@ -18,7 +18,7 @@ from enum import Enum from typing import Any, Dict, Optional -from flask_babel import gettext as _ +from flask_babel import lazy_gettext as _ class SupersetErrorType(str, Enum): @@ -90,6 +90,9 @@ class SupersetErrorType(str, Enum): INVALID_PAYLOAD_FORMAT_ERROR = "INVALID_PAYLOAD_FORMAT_ERROR" INVALID_PAYLOAD_SCHEMA_ERROR = "INVALID_PAYLOAD_SCHEMA_ERROR" + # Report errors + REPORT_NOTIFICATION_ERROR = "REPORT_NOTIFICATION_ERROR" + ISSUE_CODES = { 1000: _("The datasource is too large to query."), diff --git a/superset/examples/bart_lines.py b/superset/examples/bart_lines.py index bcdf3589a821..5d167b02d062 100644 --- a/superset/examples/bart_lines.py +++ b/superset/examples/bart_lines.py @@ -23,37 +23,37 @@ from superset import db from ..utils.database import get_example_database -from .helpers import get_example_data, get_table_connector_registry +from .helpers import get_example_url, get_table_connector_registry def load_bart_lines(only_metadata: bool = False, force: bool = False) -> None: tbl_name = "bart_lines" database = get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name - table_exists = database.has_table_by_name(tbl_name) + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name + table_exists = database.has_table_by_name(tbl_name) - if not only_metadata and (not table_exists or force): - content = get_example_data("bart-lines.json.gz") - df = pd.read_json(content, encoding="latin-1") - df["path_json"] = df.path.map(json.dumps) - df["polyline"] = df.path.map(polyline.encode) - del df["path"] + if not only_metadata and (not table_exists or force): + url = get_example_url("bart-lines.json.gz") + df = pd.read_json(url, encoding="latin-1", compression="gzip") + df["path_json"] = df.path.map(json.dumps) + df["polyline"] = df.path.map(polyline.encode) + del df["path"] - df.to_sql( - tbl_name, - engine, - schema=schema, - if_exists="replace", - chunksize=500, - dtype={ - "color": String(255), - "name": String(255), - "polyline": Text, - "path_json": Text, - }, - index=False, - ) + df.to_sql( + tbl_name, + engine, + schema=schema, + if_exists="replace", + chunksize=500, + dtype={ + "color": String(255), + "name": String(255), + "polyline": Text, + "path_json": Text, + }, + index=False, + ) print("Creating table {} reference".format(tbl_name)) table = get_table_connector_registry() diff --git a/superset/examples/birth_names.py b/superset/examples/birth_names.py index 6b37fe9d08dc..8da041550e92 100644 --- a/superset/examples/birth_names.py +++ b/superset/examples/birth_names.py @@ -19,13 +19,11 @@ from typing import Dict, List, Tuple, Union import pandas as pd -from flask_appbuilder.security.sqla.models import User from sqlalchemy import DateTime, inspect, String from sqlalchemy.sql import column -from superset import app, db, security_manager +from superset import app, db from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn -from superset.exceptions import NoDataException from superset.models.core import Database from superset.models.dashboard import Dashboard from superset.models.slice import Slice @@ -33,7 +31,7 @@ from ..utils.database import get_example_database from .helpers import ( - get_example_data, + get_example_url, get_slice_json, get_table_connector_registry, merge_slice, @@ -42,17 +40,6 @@ ) -def get_admin_user() -> User: - admin = security_manager.find_user("admin") - if admin is None: - raise NoDataException( - "Admin user does not exist. " - "Please, check if test users are properly loaded " - "(`superset load_test_users`)." - ) - return admin - - def gen_filter( subject: str, comparator: str, operator: str = "==" ) -> Dict[str, Union[bool, str]]: @@ -66,7 +53,8 @@ def gen_filter( def load_data(tbl_name: str, database: Database, sample: bool = False) -> None: - pdf = pd.read_json(get_example_data("birth_names2.json.gz")) + url = get_example_url("birth_names2.json.gz") + pdf = pd.read_json(url, compression="gzip") # TODO(bkyryliuk): move load examples data into the pytest fixture if database.backend == "presto": pdf.ds = pd.to_datetime(pdf.ds, unit="ms") @@ -75,25 +63,25 @@ def load_data(tbl_name: str, database: Database, sample: bool = False) -> None: pdf.ds = pd.to_datetime(pdf.ds, unit="ms") pdf = pdf.head(100) if sample else pdf - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name - - pdf.to_sql( - tbl_name, - database.get_sqla_engine(), - schema=schema, - if_exists="replace", - chunksize=500, - dtype={ - # TODO(bkyryliuk): use TIMESTAMP type for presto - "ds": DateTime if database.backend != "presto" else String(255), - "gender": String(16), - "state": String(10), - "name": String(255), - }, - method="multi", - index=False, - ) + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name + + pdf.to_sql( + tbl_name, + engine, + schema=schema, + if_exists="replace", + chunksize=500, + dtype={ + # TODO(bkyryliuk): use TIMESTAMP type for presto + "ds": DateTime if database.backend != "presto" else String(255), + "gender": String(16), + "state": String(10), + "name": String(255), + }, + method="multi", + index=False, + ) print("Done loading table!") print("-" * 80) @@ -103,8 +91,8 @@ def load_birth_names( ) -> None: """Loading birth name dataset from a zip file in the repo""" database = get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name tbl_name = "birth_names" table_exists = database.has_table_by_name(tbl_name, schema=schema) @@ -124,7 +112,7 @@ def load_birth_names( db.session.commit() - slices, _ = create_slices(obj, admin_owner=True) + slices, _ = create_slices(obj) create_dashboard(slices) @@ -156,12 +144,15 @@ def _add_table_metrics(datasource: SqlaTable) -> None: metrics.append(SqlMetric(metric_name="sum__num", expression=f"SUM({col})")) for col in columns: - if col.column_name == "ds": - col.is_dttm = True + if col.column_name == "ds": # type: ignore + col.is_dttm = True # type: ignore break + datasource.columns = columns + datasource.metrics = metrics + -def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[Slice]]: +def create_slices(tbl: SqlaTable) -> Tuple[List[Slice], List[Slice]]: metrics = [ { "expressionType": "SIMPLE", @@ -177,12 +168,10 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ "compare_lag": "10", "compare_suffix": "o10Y", "limit": "25", - "time_range": "No filter", "granularity_sqla": "ds", "groupby": [], "row_limit": app.config["ROW_LIMIT"], - "since": "100 years ago", - "until": "now", + "time_range": "100 years ago : now", "viz_type": "table", "markup_type": "markdown", } @@ -202,26 +191,16 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ], } - admin = get_admin_user() - if admin_owner: - slice_props = dict( - datasource_id=tbl.id, - datasource_type=DatasourceType.TABLE, - owners=[admin], - created_by=admin, - ) - else: - slice_props = dict( - datasource_id=tbl.id, - datasource_type=DatasourceType.TABLE, - owners=[], - created_by=admin, - ) + slice_kwargs = { + "datasource_id": tbl.id, + "datasource_type": DatasourceType.TABLE, + "owners": [], + } print("Creating some slices") slices = [ Slice( - **slice_props, + **slice_kwargs, slice_name="Participants", viz_type="big_number", params=get_slice_json( @@ -234,7 +213,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Genders", viz_type="pie", params=get_slice_json( @@ -242,7 +221,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Trends", viz_type="line", params=get_slice_json( @@ -256,7 +235,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Genders by State", viz_type="dist_bar", params=get_slice_json( @@ -292,7 +271,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Girls", viz_type="table", params=get_slice_json( @@ -305,7 +284,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Girl Name Cloud", viz_type="word_cloud", params=get_slice_json( @@ -321,7 +300,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Boys", viz_type="table", params=get_slice_json( @@ -334,7 +313,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Boy Name Cloud", viz_type="word_cloud", params=get_slice_json( @@ -350,7 +329,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Top 10 Girl Name Share", viz_type="area", params=get_slice_json( @@ -367,7 +346,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Top 10 Boy Name Share", viz_type="area", params=get_slice_json( @@ -384,7 +363,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Pivot Table v2", viz_type="pivot_table_v2", params=get_slice_json( @@ -407,7 +386,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ] misc_slices = [ Slice( - **slice_props, + **slice_kwargs, slice_name="Average and Sum Trends", viz_type="dual_line", params=get_slice_json( @@ -426,26 +405,25 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Num Births Trend", viz_type="line", params=get_slice_json(defaults, viz_type="line", metrics=metrics), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Daily Totals", viz_type="table", params=get_slice_json( defaults, groupby=["ds"], - since="40 years ago", - until="now", + time_range="1983 : 2023", viz_type="table", metrics=metrics, ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Number of California Births", viz_type="big_number_total", params=get_slice_json( @@ -464,7 +442,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Top 10 California Names Timeseries", viz_type="line", params=get_slice_json( @@ -496,7 +474,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Names Sorted by Num in California", viz_type="table", params=get_slice_json( @@ -516,7 +494,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Number of Girls", viz_type="big_number_total", params=get_slice_json( @@ -529,7 +507,7 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ ), ), Slice( - **slice_props, + **slice_kwargs, slice_name="Pivot Table", viz_type="pivot_table", params=get_slice_json( @@ -553,12 +531,10 @@ def create_slices(tbl: SqlaTable, admin_owner: bool) -> Tuple[List[Slice], List[ def create_dashboard(slices: List[Slice]) -> Dashboard: print("Creating a dashboard") - admin = get_admin_user() dash = db.session.query(Dashboard).filter_by(slug="births").first() if not dash: dash = Dashboard() - dash.owners = [admin] - dash.created_by = admin + dash.owners = [] db.session.add(dash) dash.published = True diff --git a/superset/examples/configs/dashboards/COVID_Vaccine_Dashboard.yaml b/superset/examples/configs/dashboards/COVID_Vaccine_Dashboard.yaml index fad874d60030..a954e63a0272 100644 --- a/superset/examples/configs/dashboards/COVID_Vaccine_Dashboard.yaml +++ b/superset/examples/configs/dashboards/COVID_Vaccine_Dashboard.yaml @@ -90,7 +90,7 @@ position: chartId: 3962 height: 82 sliceName: Vaccine Candidates per Approach & Stage - sliceNameOverride: Heatmap of Aproaches & Clinical Stages + sliceNameOverride: Heatmap of Approaches & Clinical Stages uuid: 0c953c84-0c9a-418d-be9f-2894d2a2cee0 width: 4 parents: diff --git a/superset/examples/country_map.py b/superset/examples/country_map.py index c959a92085fc..4331033ca836 100644 --- a/superset/examples/country_map.py +++ b/superset/examples/country_map.py @@ -27,7 +27,7 @@ from superset.utils.core import DatasourceType from .helpers import ( - get_example_data, + get_example_url, get_slice_json, get_table_connector_registry, merge_slice, @@ -39,40 +39,39 @@ def load_country_map_data(only_metadata: bool = False, force: bool = False) -> N """Loading data for map with country map""" tbl_name = "birth_france_by_region" database = database_utils.get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name - table_exists = database.has_table_by_name(tbl_name) - if not only_metadata and (not table_exists or force): - csv_bytes = get_example_data( - "birth_france_data_for_country_map.csv", is_gzip=False, make_bytes=True - ) - data = pd.read_csv(csv_bytes, encoding="utf-8") - data["dttm"] = datetime.datetime.now().date() - data.to_sql( - tbl_name, - engine, - schema=schema, - if_exists="replace", - chunksize=500, - dtype={ - "DEPT_ID": String(10), - "2003": BigInteger, - "2004": BigInteger, - "2005": BigInteger, - "2006": BigInteger, - "2007": BigInteger, - "2008": BigInteger, - "2009": BigInteger, - "2010": BigInteger, - "2011": BigInteger, - "2012": BigInteger, - "2013": BigInteger, - "2014": BigInteger, - "dttm": Date(), - }, - index=False, - ) + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name + table_exists = database.has_table_by_name(tbl_name) + + if not only_metadata and (not table_exists or force): + url = get_example_url("birth_france_data_for_country_map.csv") + data = pd.read_csv(url, encoding="utf-8") + data["dttm"] = datetime.datetime.now().date() + data.to_sql( + tbl_name, + engine, + schema=schema, + if_exists="replace", + chunksize=500, + dtype={ + "DEPT_ID": String(10), + "2003": BigInteger, + "2004": BigInteger, + "2005": BigInteger, + "2006": BigInteger, + "2007": BigInteger, + "2008": BigInteger, + "2009": BigInteger, + "2010": BigInteger, + "2011": BigInteger, + "2012": BigInteger, + "2013": BigInteger, + "2014": BigInteger, + "dttm": Date(), + }, + index=False, + ) print("Done loading table!") print("-" * 80) diff --git a/superset/examples/data_loading.py b/superset/examples/data_loading.py index 6eae82a79976..f24ebfc576b6 100644 --- a/superset/examples/data_loading.py +++ b/superset/examples/data_loading.py @@ -30,6 +30,7 @@ from .paris import load_paris_iris_geojson from .random_time_series import load_random_time_series_data from .sf_population_polygons import load_sf_population_polygons +from .supported_charts_dashboard import load_supported_charts_dashboard from .tabbed_dashboard import load_tabbed_dashboard from .utils import load_examples_from_configs from .world_bank import load_world_bank_health_n_pop diff --git a/superset/examples/energy.py b/superset/examples/energy.py index d88d693651d4..6688e5d08844 100644 --- a/superset/examples/energy.py +++ b/superset/examples/energy.py @@ -28,7 +28,7 @@ from superset.utils.core import DatasourceType from .helpers import ( - get_example_data, + get_example_url, get_table_connector_registry, merge_slice, misc_dash_slices, @@ -41,24 +41,25 @@ def load_energy( """Loads an energy related dataset to use with sankey and graphs""" tbl_name = "energy_usage" database = database_utils.get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name - table_exists = database.has_table_by_name(tbl_name) - if not only_metadata and (not table_exists or force): - data = get_example_data("energy.json.gz") - pdf = pd.read_json(data) - pdf = pdf.head(100) if sample else pdf - pdf.to_sql( - tbl_name, - engine, - schema=schema, - if_exists="replace", - chunksize=500, - dtype={"source": String(255), "target": String(255), "value": Float()}, - index=False, - method="multi", - ) + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name + table_exists = database.has_table_by_name(tbl_name) + + if not only_metadata and (not table_exists or force): + url = get_example_url("energy.json.gz") + pdf = pd.read_json(url, compression="gzip") + pdf = pdf.head(100) if sample else pdf + pdf.to_sql( + tbl_name, + engine, + schema=schema, + if_exists="replace", + chunksize=500, + dtype={"source": String(255), "target": String(255), "value": Float()}, + index=False, + method="multi", + ) print("Creating table [wb_health_population] reference") table = get_table_connector_registry() diff --git a/superset/examples/flights.py b/superset/examples/flights.py index 46fdc5c1d07a..7c8f9802988b 100644 --- a/superset/examples/flights.py +++ b/superset/examples/flights.py @@ -20,42 +20,44 @@ import superset.utils.database as database_utils from superset import db -from .helpers import get_example_data, get_table_connector_registry +from .helpers import get_example_url, get_table_connector_registry def load_flights(only_metadata: bool = False, force: bool = False) -> None: """Loading random time series data from a zip file in the repo""" tbl_name = "flights" database = database_utils.get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name - table_exists = database.has_table_by_name(tbl_name) + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name + table_exists = database.has_table_by_name(tbl_name) - if not only_metadata and (not table_exists or force): - data = get_example_data("flight_data.csv.gz", make_bytes=True) - pdf = pd.read_csv(data, encoding="latin-1") + if not only_metadata and (not table_exists or force): + flight_data_url = get_example_url("flight_data.csv.gz") + pdf = pd.read_csv(flight_data_url, encoding="latin-1", compression="gzip") - # Loading airports info to join and get lat/long - airports_bytes = get_example_data("airports.csv.gz", make_bytes=True) - airports = pd.read_csv(airports_bytes, encoding="latin-1") - airports = airports.set_index("IATA_CODE") + # Loading airports info to join and get lat/long + airports_url = get_example_url("airports.csv.gz") + airports = pd.read_csv(airports_url, encoding="latin-1", compression="gzip") + airports = airports.set_index("IATA_CODE") - pdf[ # pylint: disable=unsupported-assignment-operation,useless-suppression - "ds" - ] = (pdf.YEAR.map(str) + "-0" + pdf.MONTH.map(str) + "-0" + pdf.DAY.map(str)) - pdf.ds = pd.to_datetime(pdf.ds) - pdf.drop(columns=["DAY", "MONTH", "YEAR"]) - pdf = pdf.join(airports, on="ORIGIN_AIRPORT", rsuffix="_ORIG") - pdf = pdf.join(airports, on="DESTINATION_AIRPORT", rsuffix="_DEST") - pdf.to_sql( - tbl_name, - engine, - schema=schema, - if_exists="replace", - chunksize=500, - dtype={"ds": DateTime}, - index=False, - ) + pdf[ # pylint: disable=unsupported-assignment-operation,useless-suppression + "ds" + ] = ( + pdf.YEAR.map(str) + "-0" + pdf.MONTH.map(str) + "-0" + pdf.DAY.map(str) + ) + pdf.ds = pd.to_datetime(pdf.ds) + pdf.drop(columns=["DAY", "MONTH", "YEAR"]) + pdf = pdf.join(airports, on="ORIGIN_AIRPORT", rsuffix="_ORIG") + pdf = pdf.join(airports, on="DESTINATION_AIRPORT", rsuffix="_DEST") + pdf.to_sql( + tbl_name, + engine, + schema=schema, + if_exists="replace", + chunksize=500, + dtype={"ds": DateTime}, + index=False, + ) table = get_table_connector_registry() tbl = db.session.query(table).filter_by(table_name=tbl_name).first() diff --git a/superset/examples/helpers.py b/superset/examples/helpers.py index 9d17e7377329..e26e05e49739 100644 --- a/superset/examples/helpers.py +++ b/superset/examples/helpers.py @@ -17,13 +17,10 @@ """Loads datasets, dashboards and slices in a new superset instance""" import json import os -import zlib -from io import BytesIO from typing import Any, Dict, List, Set -from urllib import request from superset import app, db -from superset.connectors.connector_registry import ConnectorRegistry +from superset.connectors.sqla.models import SqlaTable from superset.models.slice import Slice BASE_URL = "https://github.com/apache-superset/examples-data/blob/master/" @@ -32,7 +29,7 @@ def get_table_connector_registry() -> Any: - return ConnectorRegistry.sources["table"] + return SqlaTable def get_examples_folder() -> str: @@ -73,14 +70,5 @@ def get_slice_json(defaults: Dict[Any, Any], **kwargs: Any) -> str: return json.dumps(defaults_copy, indent=4, sort_keys=True) -def get_example_data( - filepath: str, is_gzip: bool = True, make_bytes: bool = False -) -> BytesIO: - content = request.urlopen( # pylint: disable=consider-using-with - f"{BASE_URL}{filepath}?raw=true" - ).read() - if is_gzip: - content = zlib.decompress(content, zlib.MAX_WBITS | 16) - if make_bytes: - content = BytesIO(content) - return content +def get_example_url(filepath: str) -> str: + return f"{BASE_URL}{filepath}?raw=true" diff --git a/superset/examples/long_lat.py b/superset/examples/long_lat.py index ba9824bb43fe..88b45548f48d 100644 --- a/superset/examples/long_lat.py +++ b/superset/examples/long_lat.py @@ -27,7 +27,7 @@ from superset.utils.core import DatasourceType from .helpers import ( - get_example_data, + get_example_url, get_slice_json, get_table_connector_registry, merge_slice, @@ -39,49 +39,51 @@ def load_long_lat_data(only_metadata: bool = False, force: bool = False) -> None """Loading lat/long data from a csv file in the repo""" tbl_name = "long_lat" database = database_utils.get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name - table_exists = database.has_table_by_name(tbl_name) + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name + table_exists = database.has_table_by_name(tbl_name) - if not only_metadata and (not table_exists or force): - data = get_example_data("san_francisco.csv.gz", make_bytes=True) - pdf = pd.read_csv(data, encoding="utf-8") - start = datetime.datetime.now().replace( - hour=0, minute=0, second=0, microsecond=0 - ) - pdf["datetime"] = [ - start + datetime.timedelta(hours=i * 24 / (len(pdf) - 1)) - for i in range(len(pdf)) - ] - pdf["occupancy"] = [random.randint(1, 6) for _ in range(len(pdf))] - pdf["radius_miles"] = [random.uniform(1, 3) for _ in range(len(pdf))] - pdf["geohash"] = pdf[["LAT", "LON"]].apply(lambda x: geohash.encode(*x), axis=1) - pdf["delimited"] = pdf["LAT"].map(str).str.cat(pdf["LON"].map(str), sep=",") - pdf.to_sql( - tbl_name, - engine, - schema=schema, - if_exists="replace", - chunksize=500, - dtype={ - "longitude": Float(), - "latitude": Float(), - "number": Float(), - "street": String(100), - "unit": String(10), - "city": String(50), - "district": String(50), - "region": String(50), - "postcode": Float(), - "id": String(100), - "datetime": DateTime(), - "occupancy": Float(), - "radius_miles": Float(), - "geohash": String(12), - "delimited": String(60), - }, - index=False, - ) + if not only_metadata and (not table_exists or force): + url = get_example_url("san_francisco.csv.gz") + pdf = pd.read_csv(url, encoding="utf-8", compression="gzip") + start = datetime.datetime.now().replace( + hour=0, minute=0, second=0, microsecond=0 + ) + pdf["datetime"] = [ + start + datetime.timedelta(hours=i * 24 / (len(pdf) - 1)) + for i in range(len(pdf)) + ] + pdf["occupancy"] = [random.randint(1, 6) for _ in range(len(pdf))] + pdf["radius_miles"] = [random.uniform(1, 3) for _ in range(len(pdf))] + pdf["geohash"] = pdf[["LAT", "LON"]].apply( + lambda x: geohash.encode(*x), axis=1 + ) + pdf["delimited"] = pdf["LAT"].map(str).str.cat(pdf["LON"].map(str), sep=",") + pdf.to_sql( + tbl_name, + engine, + schema=schema, + if_exists="replace", + chunksize=500, + dtype={ + "longitude": Float(), + "latitude": Float(), + "number": Float(), + "street": String(100), + "unit": String(10), + "city": String(50), + "district": String(50), + "region": String(50), + "postcode": Float(), + "id": String(100), + "datetime": DateTime(), + "occupancy": Float(), + "radius_miles": Float(), + "geohash": String(12), + "delimited": String(60), + }, + index=False, + ) print("Done loading table!") print("-" * 80) diff --git a/superset/examples/multiformat_time_series.py b/superset/examples/multiformat_time_series.py index 9b8bb22c98e8..b030bcdb0f23 100644 --- a/superset/examples/multiformat_time_series.py +++ b/superset/examples/multiformat_time_series.py @@ -25,7 +25,7 @@ from ..utils.database import get_example_database from .helpers import ( - get_example_data, + get_example_url, get_slice_json, get_table_connector_registry, merge_slice, @@ -39,41 +39,41 @@ def load_multiformat_time_series( # pylint: disable=too-many-locals """Loading time series data from a zip file in the repo""" tbl_name = "multiformat_time_series" database = get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name - table_exists = database.has_table_by_name(tbl_name) + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name + table_exists = database.has_table_by_name(tbl_name) - if not only_metadata and (not table_exists or force): - data = get_example_data("multiformat_time_series.json.gz") - pdf = pd.read_json(data) - # TODO(bkyryliuk): move load examples data into the pytest fixture - if database.backend == "presto": - pdf.ds = pd.to_datetime(pdf.ds, unit="s") - pdf.ds = pdf.ds.dt.strftime("%Y-%m-%d") - pdf.ds2 = pd.to_datetime(pdf.ds2, unit="s") - pdf.ds2 = pdf.ds2.dt.strftime("%Y-%m-%d %H:%M%:%S") - else: - pdf.ds = pd.to_datetime(pdf.ds, unit="s") - pdf.ds2 = pd.to_datetime(pdf.ds2, unit="s") + if not only_metadata and (not table_exists or force): + url = get_example_url("multiformat_time_series.json.gz") + pdf = pd.read_json(url, compression="gzip") + # TODO(bkyryliuk): move load examples data into the pytest fixture + if database.backend == "presto": + pdf.ds = pd.to_datetime(pdf.ds, unit="s") + pdf.ds = pdf.ds.dt.strftime("%Y-%m-%d") + pdf.ds2 = pd.to_datetime(pdf.ds2, unit="s") + pdf.ds2 = pdf.ds2.dt.strftime("%Y-%m-%d %H:%M%:%S") + else: + pdf.ds = pd.to_datetime(pdf.ds, unit="s") + pdf.ds2 = pd.to_datetime(pdf.ds2, unit="s") - pdf.to_sql( - tbl_name, - engine, - schema=schema, - if_exists="replace", - chunksize=500, - dtype={ - "ds": String(255) if database.backend == "presto" else Date, - "ds2": String(255) if database.backend == "presto" else DateTime, - "epoch_s": BigInteger, - "epoch_ms": BigInteger, - "string0": String(100), - "string1": String(100), - "string2": String(100), - "string3": String(100), - }, - index=False, - ) + pdf.to_sql( + tbl_name, + engine, + schema=schema, + if_exists="replace", + chunksize=500, + dtype={ + "ds": String(255) if database.backend == "presto" else Date, + "ds2": String(255) if database.backend == "presto" else DateTime, + "epoch_s": BigInteger, + "epoch_ms": BigInteger, + "string0": String(100), + "string1": String(100), + "string2": String(100), + "string3": String(100), + }, + index=False, + ) print("Done loading table!") print("-" * 80) diff --git a/superset/examples/paris.py b/superset/examples/paris.py index 264d80feeb69..a54a3706b13c 100644 --- a/superset/examples/paris.py +++ b/superset/examples/paris.py @@ -22,35 +22,35 @@ import superset.utils.database as database_utils from superset import db -from .helpers import get_example_data, get_table_connector_registry +from .helpers import get_example_url, get_table_connector_registry def load_paris_iris_geojson(only_metadata: bool = False, force: bool = False) -> None: tbl_name = "paris_iris_mapping" database = database_utils.get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name - table_exists = database.has_table_by_name(tbl_name) + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name + table_exists = database.has_table_by_name(tbl_name) - if not only_metadata and (not table_exists or force): - data = get_example_data("paris_iris.json.gz") - df = pd.read_json(data) - df["features"] = df.features.map(json.dumps) + if not only_metadata and (not table_exists or force): + url = get_example_url("paris_iris.json.gz") + df = pd.read_json(url, compression="gzip") + df["features"] = df.features.map(json.dumps) - df.to_sql( - tbl_name, - engine, - schema=schema, - if_exists="replace", - chunksize=500, - dtype={ - "color": String(255), - "name": String(255), - "features": Text, - "type": Text, - }, - index=False, - ) + df.to_sql( + tbl_name, + engine, + schema=schema, + if_exists="replace", + chunksize=500, + dtype={ + "color": String(255), + "name": String(255), + "features": Text, + "type": Text, + }, + index=False, + ) print("Creating table {} reference".format(tbl_name)) table = get_table_connector_registry() diff --git a/superset/examples/random_time_series.py b/superset/examples/random_time_series.py index 152b63e1cc32..9a296ec2c471 100644 --- a/superset/examples/random_time_series.py +++ b/superset/examples/random_time_series.py @@ -24,7 +24,7 @@ from superset.utils.core import DatasourceType from .helpers import ( - get_example_data, + get_example_url, get_slice_json, get_table_connector_registry, merge_slice, @@ -37,28 +37,28 @@ def load_random_time_series_data( """Loading random time series data from a zip file in the repo""" tbl_name = "random_time_series" database = database_utils.get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name - table_exists = database.has_table_by_name(tbl_name) + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name + table_exists = database.has_table_by_name(tbl_name) - if not only_metadata and (not table_exists or force): - data = get_example_data("random_time_series.json.gz") - pdf = pd.read_json(data) - if database.backend == "presto": - pdf.ds = pd.to_datetime(pdf.ds, unit="s") - pdf.ds = pdf.ds.dt.strftime("%Y-%m-%d %H:%M%:%S") - else: - pdf.ds = pd.to_datetime(pdf.ds, unit="s") + if not only_metadata and (not table_exists or force): + url = get_example_url("random_time_series.json.gz") + pdf = pd.read_json(url, compression="gzip") + if database.backend == "presto": + pdf.ds = pd.to_datetime(pdf.ds, unit="s") + pdf.ds = pdf.ds.dt.strftime("%Y-%m-%d %H:%M%:%S") + else: + pdf.ds = pd.to_datetime(pdf.ds, unit="s") - pdf.to_sql( - tbl_name, - engine, - schema=schema, - if_exists="replace", - chunksize=500, - dtype={"ds": DateTime if database.backend != "presto" else String(255)}, - index=False, - ) + pdf.to_sql( + tbl_name, + engine, + schema=schema, + if_exists="replace", + chunksize=500, + dtype={"ds": DateTime if database.backend != "presto" else String(255)}, + index=False, + ) print("Done loading table!") print("-" * 80) diff --git a/superset/examples/sf_population_polygons.py b/superset/examples/sf_population_polygons.py index 6e60d60121b5..6011b82b0965 100644 --- a/superset/examples/sf_population_polygons.py +++ b/superset/examples/sf_population_polygons.py @@ -22,7 +22,7 @@ import superset.utils.database as database_utils from superset import db -from .helpers import get_example_data, get_table_connector_registry +from .helpers import get_example_url, get_table_connector_registry def load_sf_population_polygons( @@ -30,29 +30,29 @@ def load_sf_population_polygons( ) -> None: tbl_name = "sf_population_polygons" database = database_utils.get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name - table_exists = database.has_table_by_name(tbl_name) + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name + table_exists = database.has_table_by_name(tbl_name) - if not only_metadata and (not table_exists or force): - data = get_example_data("sf_population.json.gz") - df = pd.read_json(data) - df["contour"] = df.contour.map(json.dumps) + if not only_metadata and (not table_exists or force): + url = get_example_url("sf_population.json.gz") + df = pd.read_json(url, compression="gzip") + df["contour"] = df.contour.map(json.dumps) - df.to_sql( - tbl_name, - engine, - schema=schema, - if_exists="replace", - chunksize=500, - dtype={ - "zipcode": BigInteger, - "population": BigInteger, - "contour": Text, - "area": Float, - }, - index=False, - ) + df.to_sql( + tbl_name, + engine, + schema=schema, + if_exists="replace", + chunksize=500, + dtype={ + "zipcode": BigInteger, + "population": BigInteger, + "contour": Text, + "area": Float, + }, + index=False, + ) print("Creating table {} reference".format(tbl_name)) table = get_table_connector_registry() diff --git a/superset/examples/supported_charts_dashboard.py b/superset/examples/supported_charts_dashboard.py new file mode 100644 index 000000000000..54aa650d502b --- /dev/null +++ b/superset/examples/supported_charts_dashboard.py @@ -0,0 +1,1288 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# pylint: disable=too-many-lines + +import json +import textwrap +from typing import List + +from sqlalchemy import inspect + +from superset import db +from superset.connectors.sqla.models import SqlaTable +from superset.models.dashboard import Dashboard +from superset.models.slice import Slice +from superset.utils.core import DatasourceType + +from ..utils.database import get_example_database +from .helpers import ( + get_slice_json, + get_table_connector_registry, + merge_slice, + update_slice_ids, +) + +DASH_SLUG = "supported_charts_dash" + + +def create_slices(tbl: SqlaTable) -> List[Slice]: + slice_kwargs = { + "datasource_id": tbl.id, + "datasource_type": DatasourceType.TABLE, + "owners": [], + } + + defaults = { + "limit": "25", + "time_range": "100 years ago : now", + "granularity_sqla": "ds", + "row_limit": "50000", + "viz_type": "echarts_timeseries_bar", + } + + slices = [ + # --------------------- + # TIER 1 + # --------------------- + Slice( + **slice_kwargs, + slice_name="Big Number", + viz_type="big_number_total", + params=get_slice_json( + defaults, + viz_type="big_number_total", + metric="sum__num", + ), + ), + Slice( + **slice_kwargs, + slice_name="Big Number with Trendline", + viz_type="big_number", + params=get_slice_json( + defaults, + viz_type="big_number", + metric="sum__num", + ), + ), + Slice( + **slice_kwargs, + slice_name="Table", + viz_type="table", + params=get_slice_json( + defaults, + viz_type="table", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Pivot Table", + viz_type="pivot_table_v2", + params=get_slice_json( + defaults, + viz_type="pivot_table_v2", + metrics=["sum__num"], + groupbyColumns=["gender"], + groupbyRows=["state"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Time-Series Line Chart", + viz_type="echarts_timeseries_line", + params=get_slice_json( + defaults, + viz_type="echarts_timeseries_line", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Time-Series Area Chart", + viz_type="echarts_area", + params=get_slice_json( + defaults, + viz_type="echarts_area", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Time-Series Bar Chart V2", + viz_type="echarts_timeseries_bar", + params=get_slice_json( + defaults, + viz_type="echarts_timeseries_bar", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Time-Series Scatter Chart", + viz_type="echarts_timeseries_scatter", + params=get_slice_json( + defaults, + viz_type="echarts_timeseries_scatter", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Pie Chart", + viz_type="pie", + params=get_slice_json( + defaults, + viz_type="pie", + metric="sum__num", + groupby=["gender"], + adhoc_filters=[], + ), + ), + Slice( + **slice_kwargs, + slice_name="Bar Chart", + viz_type="dist_bar", + params=get_slice_json( + defaults, + viz_type="dist_bar", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + # --------------------- + # TIER 2 + # --------------------- + Slice( + **slice_kwargs, + slice_name="Box Plot Chart", + viz_type="box_plot", + params=get_slice_json( + defaults, + viz_type="box_plot", + metrics=["sum__num"], + groupby=["gender"], + columns=["name"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Bubble Chart", + viz_type="bubble", + params=get_slice_json( + defaults, + viz_type="bubble", + size="count", + series="state", + entity="gender", + x={ + "expressionType": "SIMPLE", + "column": { + "column_name": "num_boys", + }, + "aggregate": "SUM", + "label": "SUM(num_boys)", + "optionName": "metric_353e7rjj84m_cirsi2o2s1", + }, + y={ + "expressionType": "SIMPLE", + "column": { + "column_name": "num_girls", + }, + "aggregate": "SUM", + "label": "SUM(num_girls)", + "optionName": "metric_n8rvsr2ysmr_cb3eybtoe5f", + }, + ), + ), + Slice( + **slice_kwargs, + slice_name="Calendar Heatmap", + viz_type="cal_heatmap", + params=get_slice_json( + defaults, + viz_type="cal_heatmap", + metrics=["sum__num"], + time_range="2008-01-01 : 2008-02-01", + ), + ), + Slice( + **slice_kwargs, + slice_name="Chord Chart", + viz_type="chord", + params=get_slice_json( + defaults, + viz_type="chord", + metric="sum__num", + groupby="gender", + columns="state", + ), + ), + Slice( + **slice_kwargs, + slice_name="Time-Series Percent Change Chart", + viz_type="compare", + params=get_slice_json( + defaults, + viz_type="compare", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Time-Series Generic Chart", + viz_type="echarts_timeseries", + params=get_slice_json( + defaults, + viz_type="echarts_timeseries", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Time-Series Smooth Line Chart", + viz_type="echarts_timeseries_smooth", + params=get_slice_json( + defaults, + viz_type="echarts_timeseries_smooth", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Time-Series Step Line Chart", + viz_type="echarts_timeseries_step", + params=get_slice_json( + defaults, + viz_type="echarts_timeseries_step", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Funnel Chart", + viz_type="funnel", + params=get_slice_json( + defaults, + viz_type="funnel", + metric="sum__num", + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Gauge Chart", + viz_type="gauge_chart", + params=get_slice_json( + defaults, + viz_type="gauge_chart", + metric="sum__num", + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Heatmap Chart", + viz_type="heatmap", + params=get_slice_json( + defaults, + viz_type="funnel", + metric="sum__num", + all_columns_x="gender", + all_columns_y="state", + ), + ), + Slice( + **slice_kwargs, + slice_name="Line Chart", + viz_type="line", + params=get_slice_json( + defaults, + viz_type="line", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Mixed Chart", + viz_type="mixed_timeseries", + params=get_slice_json( + defaults, + viz_type="mixed_timeseries", + metrics=["sum__num"], + groupby=["gender"], + metrics_b=["count"], + groupby_b=["state"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Partition Chart", + viz_type="partition", + params=get_slice_json( + defaults, + viz_type="partition", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Radar Chart", + viz_type="radar", + params=get_slice_json( + defaults, + viz_type="radar", + metrics=[ + "sum__num", + "count", + { + "expressionType": "SIMPLE", + "column": { + "column_name": "num_boys", + }, + "aggregate": "SUM", + "label": "SUM(num_boys)", + "optionName": "metric_353e7rjj84m_cirsi2o2s1", + }, + ], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Nightingale Chart", + viz_type="rose", + params=get_slice_json( + defaults, + viz_type="rose", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Sankey Chart", + viz_type="sankey", + params=get_slice_json( + defaults, + viz_type="sankey", + metric="sum__num", + groupby=["gender", "state"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Sunburst Chart", + viz_type="sunburst", + params=get_slice_json( + defaults, + viz_type="sunburst", + metric="sum__num", + groupby=["gender", "state"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Treemap Chart", + viz_type="treemap", + params=get_slice_json( + defaults, + viz_type="treemap", + metrics=["sum__num"], + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Treemap V2 Chart", + viz_type="treemap_v2", + params=get_slice_json( + defaults, + viz_type="treemap_v2", + metric="sum__num", + groupby=["gender"], + ), + ), + Slice( + **slice_kwargs, + slice_name="Word Cloud Chart", + viz_type="word_cloud", + params=get_slice_json( + defaults, + viz_type="word_cloud", + metric="sum__num", + series="state", + ), + ), + ] + + for slc in slices: + merge_slice(slc) + + return slices + + +def load_supported_charts_dashboard() -> None: + """Loading a dashboard featuring supported charts""" + + database = get_example_database() + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name + + tbl_name = "birth_names" + table_exists = database.has_table_by_name(tbl_name, schema=schema) + + if table_exists: + table = get_table_connector_registry() + obj = ( + db.session.query(table) + .filter_by(table_name=tbl_name, schema=schema) + .first() + ) + create_slices(obj) + + print("Creating the dashboard") + + db.session.expunge_all() + dash = db.session.query(Dashboard).filter_by(slug=DASH_SLUG).first() + + if not dash: + dash = Dashboard() + + js = textwrap.dedent( + """ +{ + "CHART-1": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1", + "ROW-1" + ], + "id": "CHART-1", + "meta": { + "chartId": 1, + "height": 50, + "sliceName": "Big Number", + "width": 4 + }, + "type": "CHART" + }, + "CHART-2": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1", + "ROW-1" + ], + "id": "CHART-2", + "meta": { + "chartId": 2, + "height": 50, + "sliceName": "Big Number with Trendline", + "width": 4 + }, + "type": "CHART" + }, + "CHART-3": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1", + "ROW-1" + ], + "id": "CHART-3", + "meta":{ + "chartId": 3, + "height": 50, + "sliceName": "Table", + "width": 4 + }, + "type": "CHART" + }, + "CHART-4": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1", + "ROW-2" + ], + "id": "CHART-4", + "meta": { + "chartId": 4, + "height": 50, + "sliceName": "Pivot Table", + "width": 4 + }, + "type": "CHART" + }, + "CHART-5": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1", + "ROW-2" + ], + "id": "CHART-5", + "meta": { + "chartId": 5, + "height": 50, + "sliceName": "Time-Series Line Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-6": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1", + "ROW-2" + ], + "id": "CHART-6", + "meta": { + "chartId": 6, + "height": 50, + "sliceName": "Time-Series Bar Chart V2", + "width": 4 + }, + "type": "CHART" + }, + "CHART-7": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1", + "ROW-3" + ], + "id": "CHART-7", + "meta": { + "chartId": 7, + "height": 50, + "sliceName": "Time-Series Area Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-8": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1", + "ROW-3" + ], + "id": "CHART-8", + "meta": { + "chartId": 8, + "height": 50, + "sliceName": "Time-Series Scatter Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-9": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1", + "ROW-3" + ], + "id": "CHART-9", + "meta": { + "chartId": 9, + "height": 50, + "sliceName": "Pie Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-10": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1", + "ROW-4" + ], + "id": "CHART-10", + "meta": { + "chartId": 10, + "height": 50, + "sliceName": "Bar Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-11": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1", + "ROW-4" + ], + "id": "CHART-11", + "meta": { + "chartId": 11, + "height": 50, + "sliceName": "% Rural", + "width": 4 + }, + "type": "CHART" + }, + "CHART-12": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-5" + ], + "id": "CHART-12", + "meta": { + "chartId": 12, + "height": 50, + "sliceName": "Box Plot Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-13": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-5" + ], + "id": "CHART-13", + "meta": { + "chartId": 13, + "height": 50, + "sliceName": "Bubble Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-14": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-5" + ], + "id": "CHART-14", + "meta": { + "chartId": 14, + "height": 50, + "sliceName": "Calendar Heatmap", + "width": 4 + }, + "type": "CHART" + }, + "CHART-15": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-6" + ], + "id": "CHART-15", + "meta": { + "chartId": 15, + "height": 50, + "sliceName": "Chord Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-16": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-6" + ], + "id": "CHART-16", + "meta": { + "chartId": 16, + "height": 50, + "sliceName": "Time-Series Percent Change Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-17": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-6" + ], + "id": "CHART-17", + "meta": { + "chartId": 17, + "height": 50, + "sliceName": "Time-Series Generic Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-18": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-7" + ], + "id": "CHART-18", + "meta": { + "chartId": 18, + "height": 50, + "sliceName": "Time-Series Smooth Line Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-19": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-7" + ], + "id": "CHART-19", + "meta": { + "chartId": 19, + "height": 50, + "sliceName": "Time-Series Step Line Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-20": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-7" + ], + "id": "CHART-20", + "meta": { + "chartId": 20, + "height": 50, + "sliceName": "Funnel Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-21": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-8" + ], + "id": "CHART-21", + "meta": { + "chartId": 21, + "height": 50, + "sliceName": "Gauge Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-22": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-8" + ], + "id": "CHART-22", + "meta": { + "chartId": 22, + "height": 50, + "sliceName": "Heatmap Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-23": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-8" + ], + "id": "CHART-23", + "meta": { + "chartId": 23, + "height": 50, + "sliceName": "Line Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-24": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-9" + ], + "id": "CHART-24", + "meta": { + "chartId": 24, + "height": 50, + "sliceName": "Mixed Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-25": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-9" + ], + "id": "CHART-25", + "meta": { + "chartId": 25, + "height": 50, + "sliceName": "Partition Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-26": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-9" + ], + "id": "CHART-26", + "meta": { + "chartId": 26, + "height": 50, + "sliceName": "Radar Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-27": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-10" + ], + "id": "CHART-27", + "meta": { + "chartId": 27, + "height": 50, + "sliceName": "Nightingale Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-28": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-10" + ], + "id": "CHART-28", + "meta": { + "chartId": 28, + "height": 50, + "sliceName": "Sankey Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-29": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-10" + ], + "id": "CHART-29", + "meta": { + "chartId": 29, + "height": 50, + "sliceName": "Sunburst Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-30": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-11" + ], + "id": "CHART-30", + "meta": { + "chartId": 30, + "height": 50, + "sliceName": "Treemap Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-31": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-11" + ], + "id": "CHART-31", + "meta": { + "chartId": 31, + "height": 50, + "sliceName": "Treemap V2 Chart", + "width": 4 + }, + "type": "CHART" + }, + "CHART-32": { + "children": [], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2", + "ROW-11" + ], + "id": "CHART-32", + "meta": { + "chartId": 32, + "height": 50, + "sliceName": "Word Cloud Chart", + "width": 4 + }, + "type": "CHART" + }, + "GRID_ID": { + "children": [], + "id": "GRID_ID", + "type": "GRID" + }, + "HEADER_ID": { + "id": "HEADER_ID", + "meta": { + "text": "Supported Charts" + }, + "type": "HEADER" + }, + "TABS-TOP": { + "children": [ + "TAB-TOP-1", + "TAB-TOP-2" + ], + "id": "TABS-TOP", + "type": "TABS" + }, + "TAB-TOP-1": { + "id": "TAB_TOP-1", + "type": "TAB", + "meta": { + "text": "Tier 1", + "defaultText": "Tab title", + "placeholder": "Tab title" + }, + "parents": [ + "ROOT_ID", + "TABS-TOP" + ], + "children": [ + "ROW-1", + "ROW-2", + "ROW-3", + "ROW-4" + ] + }, + "TAB-TOP-2": { + "id": "TAB_TOP-2", + "type": "TAB", + "meta": { + "text": "Tier 2", + "defaultText": "Tab title", + "placeholder": "Tab title" + }, + "parents": [ + "ROOT_ID", + "TABS-TOP" + ], + "children": [ + "ROW-5", + "ROW-6", + "ROW-7", + "ROW-8", + "ROW-9", + "ROW-10", + "ROW-11" + ] + }, + "ROOT_ID": { + "children": [ + "TABS-TOP" + ], + "id": "ROOT_ID", + "type": "ROOT" + }, + "ROW-1": { + "children": [ + "CHART-1", + "CHART-2", + "CHART-3" + ], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1" + ], + "id": "ROW-1", + "meta": { + "background": "BACKGROUND_TRANSPARENT" + }, + "type": "ROW" + }, + "ROW-2": { + "children": [ + "CHART-4", + "CHART-5", + "CHART-6" + ], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1" + ], + "id": "ROW-2", + "meta": { + "background": "BACKGROUND_TRANSPARENT" + }, + "type": "ROW" + }, + "ROW-3": { + "children": [ + "CHART-7", + "CHART-8", + "CHART-9" + ], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1" + ], + "id": "ROW-3", + "meta": { + "background": "BACKGROUND_TRANSPARENT" + }, + "type": "ROW" + }, + "ROW-4": { + "children": [ + "CHART-10", + "CHART-11" + ], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-1" + ], + "id": "ROW-4", + "meta": { + "background": "BACKGROUND_TRANSPARENT" + }, + "type": "ROW" + }, + "ROW-5": { + "children": [ + "CHART-12", + "CHART-13", + "CHART-14" + ], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2" + ], + "id": "ROW-5", + "meta": { + "background": "BACKGROUND_TRANSPARENT" + }, + "type": "ROW" + }, + "ROW-6": { + "children": [ + "CHART-15", + "CHART-16", + "CHART-17" + ], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2" + ], + "id": "ROW-6", + "meta": { + "background": "BACKGROUND_TRANSPARENT" + }, + "type": "ROW" + }, + "ROW-7": { + "children": [ + "CHART-18", + "CHART-19", + "CHART-20" + ], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2" + ], + "id": "ROW-7", + "meta": { + "background": "BACKGROUND_TRANSPARENT" + }, + "type": "ROW" + }, + "ROW-8": { + "children": [ + "CHART-21", + "CHART-22", + "CHART-23" + ], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2" + ], + "id": "ROW-8", + "meta": { + "background": "BACKGROUND_TRANSPARENT" + }, + "type": "ROW" + }, + "ROW-9": { + "children": [ + "CHART-24", + "CHART-25", + "CHART-26" + ], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2" + ], + "id": "ROW-9", + "meta": { + "background": "BACKGROUND_TRANSPARENT" + }, + "type": "ROW" + }, + "ROW-10": { + "children": [ + "CHART-27", + "CHART-28", + "CHART-29" + ], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2" + ], + "id": "ROW-10", + "meta": { + "background": "BACKGROUND_TRANSPARENT" + }, + "type": "ROW" + }, + "ROW-11": { + "children": [ + "CHART-30", + "CHART-31", + "CHART-32" + ], + "parents": [ + "ROOT_ID", + "TABS-TOP", + "TAB-TOP-2" + ], + "id": "ROW-11", + "meta": { + "background": "BACKGROUND_TRANSPARENT" + }, + "type": "ROW" + }, + "DASHBOARD_VERSION_KEY": "v2" +} + """ + ) + + pos = json.loads(js) + dash.slices = update_slice_ids(pos) + dash.dashboard_title = "Supported Charts Dashboard" + dash.position_json = json.dumps(pos, indent=2) + dash.slug = DASH_SLUG + db.session.commit() diff --git a/superset/examples/tabbed_dashboard.py b/superset/examples/tabbed_dashboard.py index 7a167bc357d5..58c0ba3e4c06 100644 --- a/superset/examples/tabbed_dashboard.py +++ b/superset/examples/tabbed_dashboard.py @@ -137,6 +137,25 @@ def load_tabbed_dashboard(_: bool = False) -> None: ], "type": "CHART" }, + "CHART-dxV7Il666H": { + "children": [], + "id": "CHART-dxV7Il666H", + "meta": { + "chartId": 5539, + "height": 50, + "sliceName": "Trends", + "width": 4 + }, + "parents": [ + "ROOT_ID", + "TABS-lV0r00f4H1", + "TAB-gcQJxApOZS", + "TABS-afnrUvdxYF", + "TAB-jNNd4WWar1", + "ROW-7ygtD666Q" + ], + "type": "CHART" + }, "CHART-jJ5Yj1Ptaz": { "children": [], "id": "CHART-jJ5Yj1Ptaz", @@ -238,6 +257,19 @@ def load_tabbed_dashboard(_: bool = False) -> None: ], "type": "ROW" }, + "ROW-7ygtD666Q": { + "children": ["CHART-dxV7Il666H"], + "id": "ROW-7ygtD666Q", + "meta": { "background": "BACKGROUND_TRANSPARENT" }, + "parents": [ + "ROOT_ID", + "TABS-lV0r00f4H1", + "TAB-gcQJxApOZS", + "TABS-afnrUvdxYF", + "TAB-jNNd4WWar1" + ], + "type": "ROW" + }, "ROW-DnYkJgKQE": { "children": ["CHART-06Kg-rUggO", "CHART-E4rQMdzY9-"], "id": "ROW-DnYkJgKQE", @@ -386,7 +418,7 @@ def load_tabbed_dashboard(_: bool = False) -> None: "type": "TAB" }, "TAB-jNNd4WWar1": { - "children": ["ROW-7ygtDczaQ"], + "children": ["ROW-7ygtDczaQ", "ROW-7ygtD666Q"], "id": "TAB-jNNd4WWar1", "meta": { "text": "New Tab" }, "parents": [ diff --git a/superset/examples/world_bank.py b/superset/examples/world_bank.py index 39b982aa5246..b65ad68d1af6 100644 --- a/superset/examples/world_bank.py +++ b/superset/examples/world_bank.py @@ -33,7 +33,7 @@ from ..connectors.base.models import BaseDatasource from .helpers import ( - get_example_data, + get_example_url, get_examples_folder, get_slice_json, get_table_connector_registry, @@ -51,37 +51,38 @@ def load_world_bank_health_n_pop( # pylint: disable=too-many-locals, too-many-s """Loads the world bank health dataset, slices and a dashboard""" tbl_name = "wb_health_population" database = superset.utils.database.get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name - table_exists = database.has_table_by_name(tbl_name) + with database.get_sqla_engine_with_context() as engine: - if not only_metadata and (not table_exists or force): - data = get_example_data("countries.json.gz") - pdf = pd.read_json(data) - pdf.columns = [col.replace(".", "_") for col in pdf.columns] - if database.backend == "presto": - pdf.year = pd.to_datetime(pdf.year) - pdf.year = pdf.year.dt.strftime("%Y-%m-%d %H:%M%:%S") - else: - pdf.year = pd.to_datetime(pdf.year) - pdf = pdf.head(100) if sample else pdf + schema = inspect(engine).default_schema_name + table_exists = database.has_table_by_name(tbl_name) - pdf.to_sql( - tbl_name, - engine, - schema=schema, - if_exists="replace", - chunksize=50, - dtype={ - # TODO(bkyryliuk): use TIMESTAMP type for presto - "year": DateTime if database.backend != "presto" else String(255), - "country_code": String(3), - "country_name": String(255), - "region": String(255), - }, - method="multi", - index=False, - ) + if not only_metadata and (not table_exists or force): + url = get_example_url("countries.json.gz") + pdf = pd.read_json(url, compression="gzip") + pdf.columns = [col.replace(".", "_") for col in pdf.columns] + if database.backend == "presto": + pdf.year = pd.to_datetime(pdf.year) + pdf.year = pdf.year.dt.strftime("%Y-%m-%d %H:%M%:%S") + else: + pdf.year = pd.to_datetime(pdf.year) + pdf = pdf.head(100) if sample else pdf + + pdf.to_sql( + tbl_name, + engine, + schema=schema, + if_exists="replace", + chunksize=50, + dtype={ + # TODO(bkyryliuk): use TIMESTAMP type for presto + "year": DateTime if database.backend != "presto" else String(255), + "country_code": String(3), + "country_name": String(255), + "region": String(255), + }, + method="multi", + index=False, + ) print("Creating table [wb_health_population] reference") table = get_table_connector_registry() diff --git a/superset/exceptions.py b/superset/exceptions.py index 07bedfa2db56..963bf966820d 100644 --- a/superset/exceptions.py +++ b/superset/exceptions.py @@ -115,6 +115,14 @@ def __init__( self.status = status +class SupersetSyntaxErrorException(SupersetErrorsException): + status = 422 + error_type = SupersetErrorType.SYNTAX_ERROR + + def __init__(self, errors: List[SupersetError]) -> None: + super().__init__(errors) + + class SupersetTimeoutException(SupersetErrorFromParamsException): status = 408 @@ -258,3 +266,7 @@ def __init__(self, error: ValidationError): class SupersetCancelQueryException(SupersetException): status = 422 + + +class QueryNotFoundException(SupersetException): + status = 404 diff --git a/superset/explore/api.py b/superset/explore/api.py new file mode 100644 index 000000000000..2c1ec4b8e474 --- /dev/null +++ b/superset/explore/api.py @@ -0,0 +1,138 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import logging + +from flask import g, request, Response +from flask_appbuilder.api import expose, protect, safe + +from superset.charts.commands.exceptions import ChartNotFoundError +from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP +from superset.explore.commands.get import GetExploreCommand +from superset.explore.commands.parameters import CommandParameters +from superset.explore.exceptions import DatasetAccessDeniedError, WrongEndpointError +from superset.explore.permalink.exceptions import ExplorePermalinkGetFailedError +from superset.explore.schemas import ExploreContextSchema +from superset.extensions import event_logger +from superset.temporary_cache.commands.exceptions import ( + TemporaryCacheAccessDeniedError, + TemporaryCacheResourceNotFoundError, +) +from superset.views.base_api import BaseSupersetApi, statsd_metrics + +logger = logging.getLogger(__name__) + + +class ExploreRestApi(BaseSupersetApi): + method_permission_name = MODEL_API_RW_METHOD_PERMISSION_MAP + allow_browser_login = True + class_permission_name = "Explore" + resource_name = "explore" + openapi_spec_tag = "Explore" + openapi_spec_component_schemas = (ExploreContextSchema,) + + @expose("/", methods=["GET"]) + @protect() + @safe + @statsd_metrics + @event_logger.log_this_with_context( + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.get", + log_to_statsd=True, + ) + def get(self) -> Response: + """Assembles Explore related information (form_data, slice, dataset) + in a single endpoint. + --- + get: + summary: >- + Assembles Explore related information (form_data, slice, dataset) + in a single endpoint. + description: >- + Assembles Explore related information (form_data, slice, dataset) + in a single endpoint.<br/><br/> + The information can be assembled from:<br/> + - The cache using a form_data_key<br/> + - The metadata database using a permalink_key<br/> + - Build from scratch using dataset or slice identifiers. + parameters: + - in: query + schema: + type: string + name: form_data_key + - in: query + schema: + type: string + name: permalink_key + - in: query + schema: + type: integer + name: slice_id + - in: query + schema: + type: integer + name: datasource_id + - in: query + schema: + type: string + name: datasource_type + responses: + 200: + description: Returns the initial context. + content: + application/json: + schema: + $ref: '#/components/schemas/ExploreContextSchema' + 400: + $ref: '#/components/responses/400' + 401: + $ref: '#/components/responses/401' + 404: + $ref: '#/components/responses/404' + 422: + $ref: '#/components/responses/422' + 500: + $ref: '#/components/responses/500' + """ + try: + params = CommandParameters( + actor=g.user, + permalink_key=request.args.get("permalink_key", type=str), + form_data_key=request.args.get("form_data_key", type=str), + datasource_id=request.args.get("datasource_id", type=int), + datasource_type=request.args.get("datasource_type", type=str), + slice_id=request.args.get("slice_id", type=int), + ) + result = GetExploreCommand(params).run() + if not result: + return self.response_404() + return self.response(200, result=result) + except ValueError as ex: + return self.response(400, message=str(ex)) + except DatasetAccessDeniedError as ex: + return self.response( + 403, + message=ex.message, + datasource_id=ex.datasource_id, + datasource_type=ex.datasource_type, + ) + except (ChartNotFoundError, ExplorePermalinkGetFailedError) as ex: + return self.response(404, message=str(ex)) + except WrongEndpointError as ex: + return self.response(302, redirect=ex.redirect) + except TemporaryCacheAccessDeniedError as ex: + return self.response(403, message=str(ex)) + except TemporaryCacheResourceNotFoundError as ex: + return self.response(404, message=str(ex)) diff --git a/superset/explore/commands/__init__.py b/superset/explore/commands/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/superset/explore/commands/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/superset/explore/commands/get.py b/superset/explore/commands/get.py new file mode 100644 index 000000000000..fb690a9d7523 --- /dev/null +++ b/superset/explore/commands/get.py @@ -0,0 +1,191 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import logging +from abc import ABC +from typing import Any, cast, Dict, Optional + +import simplejson as json +from flask import current_app, request +from flask_babel import gettext as __, lazy_gettext as _ +from sqlalchemy.exc import SQLAlchemyError + +from superset import db, security_manager +from superset.commands.base import BaseCommand +from superset.connectors.base.models import BaseDatasource +from superset.connectors.sqla.models import SqlaTable +from superset.dao.exceptions import DatasourceNotFound +from superset.datasource.dao import DatasourceDAO +from superset.exceptions import SupersetException +from superset.explore.commands.parameters import CommandParameters +from superset.explore.exceptions import DatasetAccessDeniedError, WrongEndpointError +from superset.explore.form_data.commands.get import GetFormDataCommand +from superset.explore.form_data.commands.parameters import ( + CommandParameters as FormDataCommandParameters, +) +from superset.explore.permalink.commands.get import GetExplorePermalinkCommand +from superset.explore.permalink.exceptions import ExplorePermalinkGetFailedError +from superset.utils import core as utils +from superset.views.utils import ( + get_datasource_info, + get_form_data, + sanitize_datasource_data, +) + +logger = logging.getLogger(__name__) + + +class GetExploreCommand(BaseCommand, ABC): + def __init__( + self, + params: CommandParameters, + ) -> None: + self._permalink_key = params.permalink_key + self._form_data_key = params.form_data_key + self._datasource_id = params.datasource_id + self._datasource_type = params.datasource_type + self._slice_id = params.slice_id + + # pylint: disable=too-many-locals,too-many-branches,too-many-statements + def run(self) -> Optional[Dict[str, Any]]: + initial_form_data = {} + + if self._permalink_key is not None: + command = GetExplorePermalinkCommand(self._permalink_key) + permalink_value = command.run() + if not permalink_value: + raise ExplorePermalinkGetFailedError() + state = permalink_value["state"] + initial_form_data = state["formData"] + url_params = state.get("urlParams") + if url_params: + initial_form_data["url_params"] = dict(url_params) + elif self._form_data_key: + parameters = FormDataCommandParameters(key=self._form_data_key) + value = GetFormDataCommand(parameters).run() + initial_form_data = json.loads(value) if value else {} + + message = None + + if not initial_form_data: + if self._slice_id: + initial_form_data["slice_id"] = self._slice_id + if self._form_data_key: + message = _( + "Form data not found in cache, reverting to chart metadata." + ) + elif self._datasource_id: + initial_form_data[ + "datasource" + ] = f"{self._datasource_id}__{self._datasource_type}" + if self._form_data_key: + message = _( + "Form data not found in cache, reverting to dataset metadata." + ) + + form_data, slc = get_form_data( + slice_id=self._slice_id, + use_slice_data=True, + initial_form_data=initial_form_data, + ) + try: + self._datasource_id, self._datasource_type = get_datasource_info( + self._datasource_id, self._datasource_type, form_data + ) + except SupersetException: + self._datasource_id = None + # fallback unkonw datasource to table type + self._datasource_type = SqlaTable.type + + datasource: Optional[BaseDatasource] = None + if self._datasource_id is not None: + try: + datasource = DatasourceDAO.get_datasource( + db.session, cast(str, self._datasource_type), self._datasource_id + ) + except DatasourceNotFound: + pass + datasource_name = datasource.name if datasource else _("[Missing Dataset]") + + if datasource: + if current_app.config["ENABLE_ACCESS_REQUEST"] and ( + not security_manager.can_access_datasource(datasource) + ): + message = __( + security_manager.get_datasource_access_error_msg(datasource) + ) + raise DatasetAccessDeniedError( + message=message, + datasource_type=self._datasource_type, + datasource_id=self._datasource_id, + ) + + viz_type = form_data.get("viz_type") + if not viz_type and datasource and datasource.default_endpoint: + raise WrongEndpointError(redirect=datasource.default_endpoint) + + form_data["datasource"] = ( + str(self._datasource_id) + "__" + cast(str, self._datasource_type) + ) + + # On explore, merge legacy/extra filters and URL params into the form data + utils.convert_legacy_filters_into_adhoc(form_data) + utils.merge_extra_filters(form_data) + utils.merge_request_params(form_data, request.args) + + # TODO: this is a dummy placeholder - should be refactored to being just `None` + datasource_data: Dict[str, Any] = { + "type": self._datasource_type, + "name": datasource_name, + "columns": [], + "metrics": [], + "database": {"id": 0, "backend": ""}, + } + try: + if datasource: + datasource_data = datasource.data + except SupersetException as ex: + message = ex.message + except SQLAlchemyError: + message = "SQLAlchemy error" + + metadata = None + + if slc: + metadata = { + "created_on_humanized": slc.created_on_humanized, + "changed_on_humanized": slc.changed_on_humanized, + "owners": [owner.get_full_name() for owner in slc.owners], + "dashboards": [ + {"id": dashboard.id, "dashboard_title": dashboard.dashboard_title} + for dashboard in slc.dashboards + ], + } + if slc.created_by: + metadata["created_by"] = slc.created_by.get_full_name() + if slc.changed_by: + metadata["changed_by"] = slc.changed_by.get_full_name() + + return { + "dataset": sanitize_datasource_data(datasource_data), + "form_data": form_data, + "slice": slc.data if slc else None, + "message": message, + "metadata": metadata, + } + + def validate(self) -> None: + pass diff --git a/superset/explore/commands/parameters.py b/superset/explore/commands/parameters.py new file mode 100644 index 000000000000..96d72f2670d8 --- /dev/null +++ b/superset/explore/commands/parameters.py @@ -0,0 +1,30 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from dataclasses import dataclass +from typing import Optional + +from flask_appbuilder.security.sqla.models import User + + +@dataclass +class CommandParameters: + actor: User + permalink_key: Optional[str] + form_data_key: Optional[str] + datasource_id: Optional[int] + datasource_type: Optional[str] + slice_id: Optional[int] diff --git a/superset/explore/exceptions.py b/superset/explore/exceptions.py new file mode 100644 index 000000000000..e3b589c667c5 --- /dev/null +++ b/superset/explore/exceptions.py @@ -0,0 +1,49 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from typing import Optional + +from flask_babel import lazy_gettext as _ + +from superset.commands.exceptions import ( + CommandException, + CommandInvalidError, + ForbiddenError, +) + + +class DatasetAccessDeniedError(ForbiddenError): + def __init__( + self, message: str, datasource_id: Optional[int], datasource_type: Optional[str] + ) -> None: + self.message = message + self.datasource_id = datasource_id + self.datasource_type = datasource_type + super().__init__(self.message) + + +class WrongEndpointError(CommandException): + def __init__(self, redirect: str) -> None: + self.redirect = redirect + super().__init__() + + +class DatasourceSamplesFailedError(CommandInvalidError): + message = _("Samples for datasource could not be retrieved.") + + +class DatasourceForbiddenError(ForbiddenError): + message = _("Changing this datasource is forbidden") diff --git a/superset/explore/form_data/api.py b/superset/explore/form_data/api.py index 00c8730ee411..cc2fc75bb5e8 100644 --- a/superset/explore/form_data/api.py +++ b/superset/explore/form_data/api.py @@ -15,13 +15,12 @@ # specific language governing permissions and limitations # under the License. import logging -from abc import ABC -from flask import g, request, Response -from flask_appbuilder.api import BaseApi, expose, protect, safe +from flask import request, Response +from flask_appbuilder.api import expose, protect, safe from marshmallow import ValidationError -from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod +from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP from superset.explore.form_data.commands.create import CreateFormDataCommand from superset.explore.form_data.commands.delete import DeleteFormDataCommand from superset.explore.form_data.commands.get import GetFormDataCommand @@ -33,21 +32,15 @@ TemporaryCacheAccessDeniedError, TemporaryCacheResourceNotFoundError, ) -from superset.views.base_api import requires_json +from superset.views.base_api import BaseSupersetApi, requires_json, statsd_metrics logger = logging.getLogger(__name__) -class ExploreFormDataRestApi(BaseApi, ABC): +class ExploreFormDataRestApi(BaseSupersetApi): add_model_schema = FormDataPostSchema() edit_model_schema = FormDataPutSchema() method_permission_name = MODEL_API_RW_METHOD_PERMISSION_MAP - include_route_methods = { - RouteMethod.POST, - RouteMethod.PUT, - RouteMethod.GET, - RouteMethod.DELETE, - } allow_browser_login = True class_permission_name = "ExploreFormDataRestApi" resource_name = "explore" @@ -57,6 +50,7 @@ class ExploreFormDataRestApi(BaseApi, ABC): @expose("/form_data", methods=["POST"]) @protect() @safe + @statsd_metrics @event_logger.log_this_with_context( action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.post", log_to_statsd=False, @@ -103,7 +97,6 @@ def post(self) -> Response: item = self.add_model_schema.load(request.json) tab_id = request.args.get("tab_id") args = CommandParameters( - actor=g.user, datasource_id=item["datasource_id"], datasource_type=item["datasource_type"], chart_id=item.get("chart_id"), @@ -122,6 +115,7 @@ def post(self) -> Response: @expose("/form_data/<string:key>", methods=["PUT"]) @protect() @safe + @statsd_metrics @event_logger.log_this_with_context( action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.put", log_to_statsd=True, @@ -174,7 +168,6 @@ def put(self, key: str) -> Response: item = self.edit_model_schema.load(request.json) tab_id = request.args.get("tab_id") args = CommandParameters( - actor=g.user, datasource_id=item["datasource_id"], datasource_type=item["datasource_type"], chart_id=item.get("chart_id"), @@ -196,6 +189,7 @@ def put(self, key: str) -> Response: @expose("/form_data/<string:key>", methods=["GET"]) @protect() @safe + @statsd_metrics @event_logger.log_this_with_context( action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.get", log_to_statsd=True, @@ -234,7 +228,7 @@ def get(self, key: str) -> Response: $ref: '#/components/responses/500' """ try: - args = CommandParameters(actor=g.user, key=key) + args = CommandParameters(key=key) form_data = GetFormDataCommand(args).run() if not form_data: return self.response_404() @@ -247,6 +241,7 @@ def get(self, key: str) -> Response: @expose("/form_data/<string:key>", methods=["DELETE"]) @protect() @safe + @statsd_metrics @event_logger.log_this_with_context( action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.delete", log_to_statsd=True, @@ -286,7 +281,7 @@ def delete(self, key: str) -> Response: $ref: '#/components/responses/500' """ try: - args = CommandParameters(actor=g.user, key=key) + args = CommandParameters(key=key) result = DeleteFormDataCommand(args).run() if not result: return self.response_404() diff --git a/superset/explore/form_data/commands/create.py b/superset/explore/form_data/commands/create.py index 7946980c8268..df0250f2fffb 100644 --- a/superset/explore/form_data/commands/create.py +++ b/superset/explore/form_data/commands/create.py @@ -24,9 +24,10 @@ from superset.explore.form_data.commands.state import TemporaryExploreState from superset.explore.form_data.commands.utils import check_access from superset.extensions import cache_manager -from superset.key_value.utils import get_owner, random_key +from superset.key_value.utils import random_key from superset.temporary_cache.commands.exceptions import TemporaryCacheCreateFailedError from superset.temporary_cache.utils import cache_key +from superset.utils.core import DatasourceType, get_user_id from superset.utils.schema import validate_json logger = logging.getLogger(__name__) @@ -43,9 +44,8 @@ def run(self) -> str: datasource_type = self._cmd_params.datasource_type chart_id = self._cmd_params.chart_id tab_id = self._cmd_params.tab_id - actor = self._cmd_params.actor form_data = self._cmd_params.form_data - check_access(datasource_id, chart_id, actor, datasource_type) + check_access(datasource_id, chart_id, datasource_type) contextual_key = cache_key( session.get("_id"), tab_id, datasource_id, chart_id, datasource_type ) @@ -54,9 +54,9 @@ def run(self) -> str: key = random_key() if form_data: state: TemporaryExploreState = { - "owner": get_owner(actor), + "owner": get_user_id(), "datasource_id": datasource_id, - "datasource_type": datasource_type, + "datasource_type": DatasourceType(datasource_type), "chart_id": chart_id, "form_data": form_data, } diff --git a/superset/explore/form_data/commands/delete.py b/superset/explore/form_data/commands/delete.py index 598ece3f080f..bce13b719a7d 100644 --- a/superset/explore/form_data/commands/delete.py +++ b/superset/explore/form_data/commands/delete.py @@ -26,13 +26,12 @@ from superset.explore.form_data.commands.state import TemporaryExploreState from superset.explore.form_data.commands.utils import check_access from superset.extensions import cache_manager -from superset.key_value.utils import get_owner from superset.temporary_cache.commands.exceptions import ( TemporaryCacheAccessDeniedError, TemporaryCacheDeleteFailedError, ) from superset.temporary_cache.utils import cache_key -from superset.utils.core import DatasourceType +from superset.utils.core import DatasourceType, get_user_id logger = logging.getLogger(__name__) @@ -43,7 +42,6 @@ def __init__(self, cmd_params: CommandParameters): def run(self) -> bool: try: - actor = self._cmd_params.actor key = self._cmd_params.key state: TemporaryExploreState = cache_manager.explore_form_data_cache.get( key @@ -52,8 +50,8 @@ def run(self) -> bool: datasource_id: int = state["datasource_id"] chart_id: Optional[int] = state["chart_id"] datasource_type = DatasourceType(state["datasource_type"]) - check_access(datasource_id, chart_id, actor, datasource_type) - if state["owner"] != get_owner(actor): + check_access(datasource_id, chart_id, datasource_type) + if state["owner"] != get_user_id(): raise TemporaryCacheAccessDeniedError() tab_id = self._cmd_params.tab_id contextual_key = cache_key( diff --git a/superset/explore/form_data/commands/get.py b/superset/explore/form_data/commands/get.py index 982c8e3b4b7d..53fd6ea6a935 100644 --- a/superset/explore/form_data/commands/get.py +++ b/superset/explore/form_data/commands/get.py @@ -40,7 +40,6 @@ def __init__(self, cmd_params: CommandParameters) -> None: def run(self) -> Optional[str]: try: - actor = self._cmd_params.actor key = self._cmd_params.key state: TemporaryExploreState = cache_manager.explore_form_data_cache.get( key @@ -49,7 +48,6 @@ def run(self) -> Optional[str]: check_access( state["datasource_id"], state["chart_id"], - actor, DatasourceType(state["datasource_type"]), ) if self._refresh_timeout: diff --git a/superset/explore/form_data/commands/parameters.py b/superset/explore/form_data/commands/parameters.py index fec06a581fb7..c6c1574c802a 100644 --- a/superset/explore/form_data/commands/parameters.py +++ b/superset/explore/form_data/commands/parameters.py @@ -17,14 +17,11 @@ from dataclasses import dataclass from typing import Optional -from flask_appbuilder.security.sqla.models import User - from superset.utils.core import DatasourceType @dataclass class CommandParameters: - actor: User datasource_type: DatasourceType = DatasourceType.TABLE datasource_id: int = 0 chart_id: int = 0 diff --git a/superset/explore/form_data/commands/state.py b/superset/explore/form_data/commands/state.py index 470f2e22f598..35e3893478ea 100644 --- a/superset/explore/form_data/commands/state.py +++ b/superset/explore/form_data/commands/state.py @@ -18,10 +18,12 @@ from typing_extensions import TypedDict +from superset.utils.core import DatasourceType + class TemporaryExploreState(TypedDict): owner: Optional[int] datasource_id: int - datasource_type: str + datasource_type: DatasourceType chart_id: Optional[int] form_data: str diff --git a/superset/explore/form_data/commands/update.py b/superset/explore/form_data/commands/update.py index fdc75093bef8..ace57350c450 100644 --- a/superset/explore/form_data/commands/update.py +++ b/superset/explore/form_data/commands/update.py @@ -26,12 +26,13 @@ from superset.explore.form_data.commands.state import TemporaryExploreState from superset.explore.form_data.commands.utils import check_access from superset.extensions import cache_manager -from superset.key_value.utils import get_owner, random_key +from superset.key_value.utils import random_key from superset.temporary_cache.commands.exceptions import ( TemporaryCacheAccessDeniedError, TemporaryCacheUpdateFailedError, ) from superset.temporary_cache.utils import cache_key +from superset.utils.core import DatasourceType, get_user_id from superset.utils.schema import validate_json logger = logging.getLogger(__name__) @@ -50,14 +51,13 @@ def run(self) -> Optional[str]: datasource_id = self._cmd_params.datasource_id chart_id = self._cmd_params.chart_id datasource_type = self._cmd_params.datasource_type - actor = self._cmd_params.actor key = self._cmd_params.key form_data = self._cmd_params.form_data - check_access(datasource_id, chart_id, actor, datasource_type) + check_access(datasource_id, chart_id, datasource_type) state: TemporaryExploreState = cache_manager.explore_form_data_cache.get( key ) - owner = get_owner(actor) + owner = get_user_id() if state and form_data: if state["owner"] != owner: raise TemporaryCacheAccessDeniedError() @@ -75,7 +75,7 @@ def run(self) -> Optional[str]: new_state: TemporaryExploreState = { "owner": owner, "datasource_id": datasource_id, - "datasource_type": datasource_type, + "datasource_type": DatasourceType(datasource_type), "chart_id": chart_id, "form_data": form_data, } diff --git a/superset/explore/form_data/commands/utils.py b/superset/explore/form_data/commands/utils.py index 7927457178c9..e4a843dc6284 100644 --- a/superset/explore/form_data/commands/utils.py +++ b/superset/explore/form_data/commands/utils.py @@ -16,8 +16,6 @@ # under the License. from typing import Optional -from flask_appbuilder.security.sqla.models import User - from superset.charts.commands.exceptions import ( ChartAccessDeniedError, ChartNotFoundError, @@ -37,11 +35,10 @@ def check_access( datasource_id: int, chart_id: Optional[int], - actor: User, datasource_type: DatasourceType, ) -> None: try: - explore_check_access(datasource_id, chart_id, actor, datasource_type) + explore_check_access(datasource_id, chart_id, datasource_type) except (ChartNotFoundError, DatasetNotFoundError) as ex: raise TemporaryCacheResourceNotFoundError from ex except (ChartAccessDeniedError, DatasetAccessDeniedError) as ex: diff --git a/superset/explore/permalink/api.py b/superset/explore/permalink/api.py index 1d78e4354ae1..88e819aa2b0c 100644 --- a/superset/explore/permalink/api.py +++ b/superset/explore/permalink/api.py @@ -16,15 +16,15 @@ # under the License. import logging -from flask import g, request, Response -from flask_appbuilder.api import BaseApi, expose, protect, safe +from flask import request, Response +from flask_appbuilder.api import expose, protect, safe from marshmallow import ValidationError from superset.charts.commands.exceptions import ( ChartAccessDeniedError, ChartNotFoundError, ) -from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod +from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP from superset.datasets.commands.exceptions import ( DatasetAccessDeniedError, DatasetNotFoundError, @@ -35,20 +35,14 @@ from superset.explore.permalink.schemas import ExplorePermalinkPostSchema from superset.extensions import event_logger from superset.key_value.exceptions import KeyValueAccessDeniedError -from superset.views.base_api import requires_json +from superset.views.base_api import BaseSupersetApi, requires_json, statsd_metrics logger = logging.getLogger(__name__) -class ExplorePermalinkRestApi(BaseApi): +class ExplorePermalinkRestApi(BaseSupersetApi): add_model_schema = ExplorePermalinkPostSchema() method_permission_name = MODEL_API_RW_METHOD_PERMISSION_MAP - include_route_methods = { - RouteMethod.POST, - RouteMethod.PUT, - RouteMethod.GET, - RouteMethod.DELETE, - } allow_browser_login = True class_permission_name = "ExplorePermalinkRestApi" resource_name = "explore" @@ -58,6 +52,7 @@ class ExplorePermalinkRestApi(BaseApi): @expose("/permalink", methods=["POST"]) @protect() @safe + @statsd_metrics @event_logger.log_this_with_context( action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.post", log_to_statsd=False, @@ -100,7 +95,7 @@ def post(self) -> Response: """ try: state = self.add_model_schema.load(request.json) - key = CreateExplorePermalinkCommand(actor=g.user, state=state).run() + key = CreateExplorePermalinkCommand(state=state).run() http_origin = request.headers.environ.get("HTTP_ORIGIN") url = f"{http_origin}/superset/explore/p/{key}/" return self.response(201, key=key, url=url) @@ -118,6 +113,7 @@ def post(self) -> Response: @expose("/permalink/<string:key>", methods=["GET"]) @protect() @safe + @statsd_metrics @event_logger.log_this_with_context( action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.get", log_to_statsd=False, @@ -156,7 +152,7 @@ def get(self, key: str) -> Response: $ref: '#/components/responses/500' """ try: - value = GetExplorePermalinkCommand(actor=g.user, key=key).run() + value = GetExplorePermalinkCommand(key=key).run() if not value: return self.response_404() return self.response(200, **value) diff --git a/superset/explore/permalink/commands/create.py b/superset/explore/permalink/commands/create.py index 7bd6365d814b..77ce04c4e47b 100644 --- a/superset/explore/permalink/commands/create.py +++ b/superset/explore/permalink/commands/create.py @@ -17,7 +17,6 @@ import logging from typing import Any, Dict, Optional -from flask_appbuilder.security.sqla.models import User from sqlalchemy.exc import SQLAlchemyError from superset.explore.permalink.commands.base import BaseExplorePermalinkCommand @@ -31,8 +30,7 @@ class CreateExplorePermalinkCommand(BaseExplorePermalinkCommand): - def __init__(self, actor: User, state: Dict[str, Any]): - self.actor = actor + def __init__(self, state: Dict[str, Any]): self.chart_id: Optional[int] = state["formData"].get("slice_id") self.datasource: str = state["formData"]["datasource"] self.state = state @@ -43,9 +41,7 @@ def run(self) -> str: d_id, d_type = self.datasource.split("__") datasource_id = int(d_id) datasource_type = DatasourceType(d_type) - check_chart_access( - datasource_id, self.chart_id, self.actor, datasource_type - ) + check_chart_access(datasource_id, self.chart_id, datasource_type) value = { "chartId": self.chart_id, "datasourceId": datasource_id, @@ -54,7 +50,6 @@ def run(self) -> str: "state": self.state, } command = CreateKeyValueCommand( - actor=self.actor, resource=self.resource, value=value, ) diff --git a/superset/explore/permalink/commands/get.py b/superset/explore/permalink/commands/get.py index ca4fe8c74fa2..3376cab08096 100644 --- a/superset/explore/permalink/commands/get.py +++ b/superset/explore/permalink/commands/get.py @@ -17,7 +17,6 @@ import logging from typing import Optional -from flask_appbuilder.security.sqla.models import User from sqlalchemy.exc import SQLAlchemyError from superset.datasets.commands.exceptions import DatasetNotFoundError @@ -34,8 +33,7 @@ class GetExplorePermalinkCommand(BaseExplorePermalinkCommand): - def __init__(self, actor: User, key: str): - self.actor = actor + def __init__(self, key: str): self.key = key def run(self) -> Optional[ExplorePermalinkValue]: @@ -55,7 +53,7 @@ def run(self) -> Optional[ExplorePermalinkValue]: datasource_type = DatasourceType( value.get("datasourceType", DatasourceType.TABLE) ) - check_chart_access(datasource_id, chart_id, self.actor, datasource_type) + check_chart_access(datasource_id, chart_id, datasource_type) return value return None except ( diff --git a/superset/explore/schemas.py b/superset/explore/schemas.py new file mode 100644 index 000000000000..457c99422a3a --- /dev/null +++ b/superset/explore/schemas.py @@ -0,0 +1,114 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# License ); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from marshmallow import fields, Schema + + +class DatasetSchema(Schema): + cache_timeout = fields.Integer( + description="Duration (in seconds) of the caching timeout for this dataset." + ) + column_formats = fields.Dict(description="Column formats.") + columns = fields.List(fields.Dict(), description="Columns metadata.") + database = fields.Dict(description="Database associated with the dataset.") + datasource_name = fields.String(description="Dataset name.") + default_endpoint = fields.String(description="Default endpoint for the dataset.") + description = fields.String(description="Dataset description.") + edit_url = fields.String(description="The URL for editing the dataset.") + extra = fields.Dict( + description="JSON string containing extra configuration elements." + ) + fetch_values_predicate = fields.String( + description="Predicate used when fetching values from the dataset." + ) + filter_select = fields.Bool(description="SELECT filter applied to the dataset.") + filter_select_enabled = fields.Bool(description="If the SELECT filter is enabled.") + granularity_sqla = fields.List( + fields.List(fields.Dict()), + description=( + "Name of temporal column used for time filtering for SQL datasources. " + "This field is deprecated, use `granularity` instead." + ), + ) + health_check_message = fields.String(description="Health check message.") + id = fields.Integer(description="Dataset ID.") + is_sqllab_view = fields.Bool(description="If the dataset is a SQL Lab view.") + main_dttm_col = fields.String(description="The main temporal column.") + metrics = fields.List(fields.Dict(), description="Dataset metrics.") + name = fields.String(description="Dataset name.") + offset = fields.Integer(description="Dataset offset.") + order_by_choices = fields.List( + fields.List(fields.String()), description="List of order by columns." + ) + owners = fields.List(fields.Integer(), description="List of owners identifiers") + params = fields.Dict(description="Extra params for the dataset.") + perm = fields.String(description="Permission expression.") + schema = fields.String(description="Dataset schema.") + select_star = fields.String(description="Select all clause.") + sql = fields.String(description="A SQL statement that defines the dataset.") + table_name = fields.String( + description="The name of the table associated with the dataset." + ) + template_params = fields.Dict(description="Table template params.") + time_grain_sqla = fields.List( + fields.List(fields.String()), + description="List of temporal granularities supported by the dataset.", + ) + type = fields.String(description="Dataset type.") + uid = fields.String(description="Dataset unique identifier.") + verbose_map = fields.Dict(description="Mapping from raw name to verbose name.") + + +class SliceSchema(Schema): + cache_timeout = fields.Integer( + description="Duration (in seconds) of the caching timeout for this chart." + ) + certification_details = fields.String(description="Details of the certification.") + certified_by = fields.String( + description="Person or group that has certified this dashboard." + ) + changed_on = fields.String(description="Timestamp of the last modification.") + changed_on_humanized = fields.String( + description="Timestamp of the last modification in human readable form." + ) + datasource = fields.String(description="Datasource identifier.") + description = fields.String(description="Slice description.") + description_markeddown = fields.String( + description="Sanitized HTML version of the chart description." + ) + edit_url = fields.String(description="The URL for editing the slice.") + form_data = fields.Dict(description="Form data associated with the slice.") + is_managed_externally = fields.Bool( + description="If the chart is managed outside externally." + ) + modified = fields.String(description="Last modification in human readable form.") + owners = fields.List(fields.Integer(), description="Owners identifiers.") + query_context = fields.Dict(description="The context associated with the query.") + slice_id = fields.Integer(description="The slice ID.") + slice_name = fields.String(description="The slice name.") + slice_url = fields.String(description="The slice URL.") + + +class ExploreContextSchema(Schema): + form_data = fields.Dict( + description=( + "Form data from the Explore controls used to form the " + "chart's data query." + ) + ) + dataset = fields.Nested(DatasetSchema) + slice = fields.Nested(SliceSchema) + message = fields.String(description="Any message related to the processed request.") diff --git a/superset/explore/utils.py b/superset/explore/utils.py index f0bfd8f0aa40..01f63f53f2f4 100644 --- a/superset/explore/utils.py +++ b/superset/explore/utils.py @@ -16,8 +16,6 @@ # under the License. from typing import Optional -from flask_appbuilder.security.sqla.models import User - from superset import security_manager from superset.charts.commands.exceptions import ( ChartAccessDeniedError, @@ -36,13 +34,12 @@ from superset.datasets.dao import DatasetDAO from superset.queries.dao import QueryDAO from superset.utils.core import DatasourceType -from superset.views.base import is_user_admin -from superset.views.utils import is_owner def check_dataset_access(dataset_id: int) -> Optional[bool]: if dataset_id: - dataset = DatasetDAO.find_by_id(dataset_id) + # Access checks below, no need to validate them twice as they can be expensive. + dataset = DatasetDAO.find_by_id(dataset_id, skip_base_filter=True) if dataset: can_access_datasource = security_manager.can_access_datasource(dataset) if can_access_datasource: @@ -53,7 +50,8 @@ def check_dataset_access(dataset_id: int) -> Optional[bool]: def check_query_access(query_id: int) -> Optional[bool]: if query_id: - query = QueryDAO.find_by_id(query_id) + # Access checks below, no need to validate them twice as they can be expensive. + query = QueryDAO.find_by_id(query_id, skip_base_filter=True) if query: security_manager.raise_for_access(query=query) return True @@ -80,19 +78,17 @@ def check_datasource_access( def check_access( datasource_id: int, chart_id: Optional[int], - actor: User, datasource_type: DatasourceType, ) -> Optional[bool]: check_datasource_access(datasource_id, datasource_type) if not chart_id: return True - chart = ChartDAO.find_by_id(chart_id) + # Access checks below, no need to validate them twice as they can be expensive. + chart = ChartDAO.find_by_id(chart_id, skip_base_filter=True) if chart: - can_access_chart = ( - is_user_admin() - or is_owner(chart, actor) - or security_manager.can_access("can_read", "Chart") - ) + can_access_chart = security_manager.is_owner( + chart + ) or security_manager.can_access("can_read", "Chart") if can_access_chart: return True raise ChartAccessDeniedError() diff --git a/superset/extensions/__init__.py b/superset/extensions/__init__.py index 1f5882f7492a..e2e5592e1edb 100644 --- a/superset/extensions/__init__.py +++ b/superset/extensions/__init__.py @@ -16,7 +16,6 @@ # under the License. import json import os -from pathlib import Path from typing import Any, Callable, Dict, List, Optional import celery @@ -28,6 +27,8 @@ from flask_wtf.csrf import CSRFProtect from werkzeug.local import LocalProxy +from superset.extensions.ssh import SSHManagerFactory +from superset.extensions.stats_logger import BaseStatsLoggerManager from superset.utils.async_query_manager import AsyncQueryManager from superset.utils.cache_manager import CacheManager from superset.utils.encrypt import EncryptedFieldFactory @@ -126,4 +127,6 @@ def init_app(self, app: Flask) -> None: profiling = ProfilingExtension() results_backend_manager = ResultsBackendManager() security_manager = LocalProxy(lambda: appbuilder.sm) +ssh_manager_factory = SSHManagerFactory() +stats_logger_manager = BaseStatsLoggerManager() talisman = Talisman() diff --git a/superset/extensions/ssh.py b/superset/extensions/ssh.py new file mode 100644 index 000000000000..ec9c781beed7 --- /dev/null +++ b/superset/extensions/ssh.py @@ -0,0 +1,92 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import importlib +from io import StringIO +from typing import TYPE_CHECKING + +from flask import Flask +from paramiko import RSAKey +from sshtunnel import open_tunnel, SSHTunnelForwarder + +from superset.databases.utils import make_url_safe + +if TYPE_CHECKING: + from superset.databases.ssh_tunnel.models import SSHTunnel + + +class SSHManager: + def __init__(self, app: Flask) -> None: + super().__init__() + self.local_bind_address = app.config["SSH_TUNNEL_LOCAL_BIND_ADDRESS"] + + def build_sqla_url( # pylint: disable=no-self-use + self, sqlalchemy_url: str, server: SSHTunnelForwarder + ) -> str: + # override any ssh tunnel configuration object + url = make_url_safe(sqlalchemy_url) + return url.set( + host=server.local_bind_address[0], + port=server.local_bind_port, + ) + + def create_tunnel( + self, + ssh_tunnel: "SSHTunnel", + sqlalchemy_database_uri: str, + ) -> SSHTunnelForwarder: + url = make_url_safe(sqlalchemy_database_uri) + params = { + "ssh_address_or_host": ssh_tunnel.server_address, + "ssh_port": ssh_tunnel.server_port, + "ssh_username": ssh_tunnel.username, + "remote_bind_address": (url.host, url.port), # bind_port, bind_host + "local_bind_address": (self.local_bind_address,), + } + + if ssh_tunnel.password: + params["ssh_password"] = ssh_tunnel.password + elif ssh_tunnel.private_key: + private_key_file = StringIO(ssh_tunnel.private_key) + private_key = RSAKey.from_private_key(private_key_file) + params["ssh_pkey"] = private_key + params["ssh_private_key_password"] = ssh_tunnel.private_key_password + + return open_tunnel(**params) + + +class SSHManagerFactory: + def __init__(self) -> None: + self._ssh_manager = None + + def init_app(self, app: Flask) -> None: + ssh_manager_fqclass = app.config["SSH_TUNNEL_MANAGER_CLASS"] + ssh_manager_classname = ssh_manager_fqclass[ + ssh_manager_fqclass.rfind(".") + 1 : + ] + ssh_manager_module_name = ssh_manager_fqclass[ + 0 : ssh_manager_fqclass.rfind(".") + ] + ssh_manager_class = getattr( + importlib.import_module(ssh_manager_module_name), ssh_manager_classname + ) + + self._ssh_manager = ssh_manager_class(app) + + @property + def instance(self) -> SSHManager: + return self._ssh_manager # type: ignore diff --git a/tests/integration_tests/db_engine_specs/kylin_tests.py b/superset/extensions/stats_logger.py similarity index 60% rename from tests/integration_tests/db_engine_specs/kylin_tests.py rename to superset/extensions/stats_logger.py index a607565d5b41..bb6407141a2a 100644 --- a/tests/integration_tests/db_engine_specs/kylin_tests.py +++ b/superset/extensions/stats_logger.py @@ -14,19 +14,18 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from superset.db_engine_specs.kylin import KylinEngineSpec -from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec +from flask import Flask +from superset.stats_logger import BaseStatsLogger -class TestKylinDbEngineSpec(TestDbEngineSpec): - def test_convert_dttm(self): - dttm = self.get_dttm() - self.assertEqual( - KylinEngineSpec.convert_dttm("DATE", dttm), "CAST('2019-01-02' AS DATE)" - ) +class BaseStatsLoggerManager: + def __init__(self) -> None: + self._stats_logger = BaseStatsLogger() - self.assertEqual( - KylinEngineSpec.convert_dttm("TIMESTAMP", dttm), - "CAST('2019-01-02 03:04:05' AS TIMESTAMP)", - ) + def init_app(self, app: Flask) -> None: + self._stats_logger = app.config["STATS_LOGGER"] + + @property + def instance(self) -> BaseStatsLogger: + return self._stats_logger diff --git a/superset/importexport/api.py b/superset/importexport/api.py index e20cc22b80d4..26bc78e5d7a8 100644 --- a/superset/importexport/api.py +++ b/superset/importexport/api.py @@ -20,7 +20,7 @@ from zipfile import is_zipfile, ZipFile from flask import request, Response, send_file -from flask_appbuilder.api import BaseApi, expose, protect +from flask_appbuilder.api import expose, protect from superset.commands.export.assets import ExportAssetsCommand from superset.commands.importers.exceptions import ( @@ -30,10 +30,10 @@ from superset.commands.importers.v1.assets import ImportAssetsCommand from superset.commands.importers.v1.utils import get_contents_from_bundle from superset.extensions import event_logger -from superset.views.base_api import requires_form_data +from superset.views.base_api import BaseSupersetApi, requires_form_data, statsd_metrics -class ImportExportRestApi(BaseApi): +class ImportExportRestApi(BaseSupersetApi): """ API for exporting all assets or importing them. """ @@ -44,6 +44,7 @@ class ImportExportRestApi(BaseApi): @expose("/export/", methods=["GET"]) @protect() + @statsd_metrics @event_logger.log_this_with_context( action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.export", log_to_statsd=False, @@ -92,6 +93,7 @@ def export(self) -> Response: @expose("/import/", methods=["POST"]) @protect() + @statsd_metrics @event_logger.log_this_with_context( action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.import_", log_to_statsd=False, diff --git a/superset/initialization/__init__.py b/superset/initialization/__init__.py index de97b1daa6e5..b7cea854a2b1 100644 --- a/superset/initialization/__init__.py +++ b/superset/initialization/__init__.py @@ -28,7 +28,6 @@ from flask_compress import Compress from werkzeug.middleware.proxy_fix import ProxyFix -from superset.connectors.connector_registry import ConnectorRegistry from superset.constants import CHANGE_ME_SECRET_KEY from superset.extensions import ( _event_logger, @@ -46,10 +45,13 @@ migrate, profiling, results_backend_manager, + ssh_manager_factory, + stats_logger_manager, talisman, ) from superset.security import SupersetSecurityManager from superset.superset_typing import FlaskResponse +from superset.tags.core import register_sqla_event_listeners from superset.utils.core import pessimistic_connection_handling from superset.utils.log import DBEventLogger, get_event_logger_from_cfg_value @@ -117,6 +119,7 @@ def init_views(self) -> None: from superset.annotation_layers.annotations.api import AnnotationRestApi from superset.annotation_layers.api import AnnotationLayerRestApi from superset.async_events.api import AsyncEventsRestApi + from superset.available_domains.api import AvailableDomainsRestApi from superset.cachekeys.api import CacheRestApi from superset.charts.api import ChartRestApi from superset.charts.data.api import ChartDataRestApi @@ -135,8 +138,10 @@ def init_views(self) -> None: from superset.datasets.api import DatasetRestApi from superset.datasets.columns.api import DatasetColumnsRestApi from superset.datasets.metrics.api import DatasetMetricRestApi + from superset.datasource.api import DatasourceRestApi from superset.embedded.api import EmbeddedDashboardRestApi from superset.embedded.view import EmbeddedView + from superset.explore.api import ExploreRestApi from superset.explore.form_data.api import ExploreFormDataRestApi from superset.explore.permalink.api import ExplorePermalinkRestApi from superset.importexport.api import ImportExportRestApi @@ -146,12 +151,10 @@ def init_views(self) -> None: from superset.reports.api import ReportScheduleRestApi from superset.reports.logs.api import ReportExecutionLogRestApi from superset.security.api import SecurityRestApi, UsersApi + from superset.sqllab.api import SqlLabRestApi from superset.views.access_requests import AccessRequestsModelView from superset.views.alerts import AlertView, ReportView - from superset.views.annotations import ( - AnnotationLayerModelView, - AnnotationModelView, - ) + from superset.views.annotations import AnnotationLayerView from superset.views.api import Api from superset.views.chart.views import SliceAsync, SliceModelView from superset.views.core import Superset @@ -170,13 +173,14 @@ def init_views(self) -> None: DatabaseView, ExcelToDatabaseView, ) - from superset.views.datasource.views import Datasource + from superset.views.datasource.views import DatasetEditor, Datasource from superset.views.dynamic_plugins import DynamicPluginsView + from superset.views.explore import ExplorePermalinkView, ExploreView from superset.views.key_value import KV from superset.views.log.api import LogRestApi from superset.views.log.views import LogModelView from superset.views.redirects import R - from superset.views.sql_lab import ( + from superset.views.sql_lab.views import ( SavedQueryView, SavedQueryViewApi, SqlLab, @@ -193,6 +197,7 @@ def init_views(self) -> None: appbuilder.add_api(AnnotationLayerRestApi) appbuilder.add_api(AsyncEventsRestApi) appbuilder.add_api(AdvancedDataTypeRestApi) + appbuilder.add_api(AvailableDomainsRestApi) appbuilder.add_api(CacheRestApi) appbuilder.add_api(ChartRestApi) appbuilder.add_api(ChartDataRestApi) @@ -206,7 +211,9 @@ def init_views(self) -> None: appbuilder.add_api(DatasetRestApi) appbuilder.add_api(DatasetColumnsRestApi) appbuilder.add_api(DatasetMetricRestApi) + appbuilder.add_api(DatasourceRestApi) appbuilder.add_api(EmbeddedDashboardRestApi) + appbuilder.add_api(ExploreRestApi) appbuilder.add_api(ExploreFormDataRestApi) appbuilder.add_api(ExplorePermalinkRestApi) appbuilder.add_api(FilterSetRestApi) @@ -215,6 +222,7 @@ def init_views(self) -> None: appbuilder.add_api(ReportScheduleRestApi) appbuilder.add_api(ReportExecutionLogRestApi) appbuilder.add_api(SavedQueryRestApi) + appbuilder.add_api(SqlLabRestApi) appbuilder.add_api(UsersApi) # # Setup regular views @@ -225,14 +233,14 @@ def init_views(self) -> None: href="/superset/welcome/", cond=lambda: bool(appbuilder.app.config["LOGO_TARGET_PATH"]), ) + appbuilder.add_view( - AnnotationLayerModelView, - "Annotation Layers", - label=__("Annotation Layers"), - icon="fa-comment", - category="Manage", - category_label=__("Manage"), - category_icon="", + DatabaseView, + "Databases", + label=__("Database Connections"), + icon="fa-database", + category="Data", + category_label=__("Data"), ) appbuilder.add_view( DashboardModelView, @@ -250,6 +258,16 @@ def init_views(self) -> None: category="", category_icon="", ) + + appbuilder.add_link( + "Datasets", + label=__("Datasets"), + href="/tablemodelview/list/", + icon="fa-table", + category="", + category_icon="", + ) + appbuilder.add_view( DynamicPluginsView, "Plugins", @@ -290,7 +308,10 @@ def init_views(self) -> None: appbuilder.add_view_no_menu(Dashboard) appbuilder.add_view_no_menu(DashboardModelViewAsync) appbuilder.add_view_no_menu(Datasource) + appbuilder.add_view_no_menu(DatasetEditor) appbuilder.add_view_no_menu(EmbeddedView) + appbuilder.add_view_no_menu(ExploreView) + appbuilder.add_view_no_menu(ExplorePermalinkView) appbuilder.add_view_no_menu(KV) appbuilder.add_view_no_menu(R) appbuilder.add_view_no_menu(SavedQueryView) @@ -298,7 +319,6 @@ def init_views(self) -> None: appbuilder.add_view_no_menu(SliceAsync) appbuilder.add_view_no_menu(SqlLab) appbuilder.add_view_no_menu(SqlMetricInlineView) - appbuilder.add_view_no_menu(AnnotationModelView) appbuilder.add_view_no_menu(Superset) appbuilder.add_view_no_menu(TableColumnInlineView) appbuilder.add_view_no_menu(TableModelView) @@ -324,47 +344,30 @@ def init_views(self) -> None: ) appbuilder.add_link( "SQL Editor", - label=_("SQL Editor"), + label=__("SQL Lab"), href="/superset/sqllab/", category_icon="fa-flask", icon="fa-flask", category="SQL Lab", - category_label=__("SQL Lab"), + category_label=__("SQL"), ) appbuilder.add_link( - __("Saved Queries"), + "Saved Queries", + label=__("Saved Queries"), href="/savedqueryview/list/", icon="fa-save", category="SQL Lab", + category_label=__("SQL"), ) appbuilder.add_link( "Query Search", - label=_("Query History"), + label=__("Query History"), href="/superset/sqllab/history/", icon="fa-search", category_icon="fa-flask", category="SQL Lab", - category_label=__("SQL Lab"), - ) - appbuilder.add_view( - DatabaseView, - "Databases", - label=__("Databases"), - icon="fa-database", - category="Data", - category_label=__("Data"), - category_icon="fa-database", - ) - appbuilder.add_link( - "Datasets", - label=__("Datasets"), - href="/tablemodelview/list/", - icon="fa-table", - category="Data", - category_label=__("Data"), - category_icon="fa-table", + category_label=__("SQL"), ) - appbuilder.add_separator("Data") appbuilder.add_api(LogRestApi) appbuilder.add_view( @@ -394,6 +397,17 @@ def init_views(self) -> None: menu_cond=lambda: feature_flag_manager.is_feature_enabled("ALERT_REPORTS"), ) + appbuilder.add_view( + AnnotationLayerView, + "Annotation Layers", + label=__("Annotation Layers"), + href="/annotationlayer/list/", + icon="fa-comment", + category_icon="", + category="Manage", + category_label=__("Manage"), + ) + appbuilder.add_view( AccessRequestsModelView, "Access requests", @@ -413,6 +427,8 @@ def init_app_in_ctx(self) -> None: self.configure_data_sources() self.configure_auth_provider() self.configure_async_queries() + self.configure_ssh_manager() + self.configure_stats_manager() # Hook that provides administrators a handle on the Flask APP # after initialization @@ -420,6 +436,9 @@ def init_app_in_ctx(self) -> None: if flask_app_mutator: flask_app_mutator(self.superset_app) + if feature_flag_manager.is_feature_enabled("TAGGING_SYSTEM"): + register_sqla_event_listeners() + self.init_views() def check_secret_key(self) -> None: @@ -467,6 +486,12 @@ def init_app(self) -> None: def configure_auth_provider(self) -> None: machine_auth_provider_factory.init_app(self.superset_app) + def configure_ssh_manager(self) -> None: + ssh_manager_factory.init_app(self.superset_app) + + def configure_stats_manager(self) -> None: + stats_logger_manager.init_app(self.superset_app) + def setup_event_logger(self) -> None: _event_logger["event_logger"] = get_event_logger_from_cfg_value( self.superset_app.config.get("EVENT_LOGGER", DBEventLogger()) @@ -476,7 +501,11 @@ def configure_data_sources(self) -> None: # Registering sources module_datasource_map = self.config["DEFAULT_MODULE_DS_MAP"] module_datasource_map.update(self.config["ADDITIONAL_MODULE_DS_MAP"]) - ConnectorRegistry.register_sources(module_datasource_map) + + # todo(hughhhh): fully remove the datasource config register + for module_name, class_names in module_datasource_map.items(): + class_names = [str(s) for s in class_names] + __import__(module_name, fromlist=class_names) def configure_cache(self) -> None: cache_manager.init_app(self.superset_app) @@ -561,25 +590,33 @@ def __call__( # Flask-Compress Compress(self.superset_app) + # Talisman + talisman_enabled = self.config["TALISMAN_ENABLED"] + talisman_config = self.config["TALISMAN_CONFIG"] + csp_warning = self.config["CONTENT_SECURITY_POLICY_WARNING"] + + if talisman_enabled: + talisman.init_app(self.superset_app, **talisman_config) + show_csp_warning = False if ( - self.config["CONTENT_SECURITY_POLICY_WARNING"] + csp_warning and not self.superset_app.debug + and ( + not talisman_enabled + or not talisman_config + or not talisman_config.get("content_security_policy") + ) ): - if self.config["TALISMAN_ENABLED"]: - talisman.init_app(self.superset_app, **self.config["TALISMAN_CONFIG"]) - if not self.config["TALISMAN_CONFIG"].get("content_security_policy"): - show_csp_warning = True - else: - show_csp_warning = True + show_csp_warning = True if show_csp_warning: logger.warning( "We haven't found any Content Security Policy (CSP) defined in " "the configurations. Please make sure to configure CSP using the " - "TALISMAN_CONFIG key or any other external software. Failing to " - "configure CSP have serious security implications. Check " - "https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP for more " + "TALISMAN_ENABLED and TALISMAN_CONFIG keys or any other external " + "software. Failing to configure CSP have serious security implications. " + "Check https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP for more " "information. You can disable this warning using the " "CONTENT_SECURITY_POLICY_WARNING key." ) diff --git a/superset/jinja_context.py b/superset/jinja_context.py index 4ee250673f8c..823c67451beb 100644 --- a/superset/jinja_context.py +++ b/superset/jinja_context.py @@ -41,7 +41,11 @@ from superset.datasets.commands.exceptions import DatasetNotFoundError from superset.exceptions import SupersetTemplateException from superset.extensions import feature_flag_manager -from superset.utils.core import convert_legacy_filters_into_adhoc, merge_extra_filters +from superset.utils.core import ( + convert_legacy_filters_into_adhoc, + get_user_id, + merge_extra_filters, +) from superset.utils.memoized import memoized if TYPE_CHECKING: @@ -115,9 +119,10 @@ def current_user_id(self, add_to_cache_keys: bool = True) -> Optional[int]: """ if hasattr(g, "user") and g.user: + id_ = get_user_id() if add_to_cache_keys: - self.cache_key_wrapper(g.user.get_id()) - return g.user.get_id() + self.cache_key_wrapper(id_) + return id_ return None def current_username(self, add_to_cache_keys: bool = True) -> Optional[str]: diff --git a/superset/key_value/commands/create.py b/superset/key_value/commands/create.py index 5125ce7b01e2..93e99c223ba5 100644 --- a/superset/key_value/commands/create.py +++ b/superset/key_value/commands/create.py @@ -20,7 +20,6 @@ from typing import Any, Optional, Union from uuid import UUID -from flask_appbuilder.security.sqla.models import User from sqlalchemy.exc import SQLAlchemyError from superset import db @@ -28,23 +27,21 @@ from superset.key_value.exceptions import KeyValueCreateFailedError from superset.key_value.models import KeyValueEntry from superset.key_value.types import Key, KeyValueResource +from superset.utils.core import get_user_id logger = logging.getLogger(__name__) class CreateKeyValueCommand(BaseCommand): - actor: Optional[User] resource: KeyValueResource value: Any key: Optional[Union[int, UUID]] expires_on: Optional[datetime] - # pylint: disable=too-many-arguments def __init__( self, resource: KeyValueResource, value: Any, - actor: Optional[User] = None, key: Optional[Union[int, UUID]] = None, expires_on: Optional[datetime] = None, ): @@ -53,13 +50,11 @@ def __init__( :param resource: the resource (dashboard, chart etc) :param value: the value to persist in the key-value store - :param actor: the user performing the command :param key: id of entry (autogenerated if undefined) :param expires_on: entry expiration time :return: the key associated with the persisted value """ self.resource = resource - self.actor = actor self.value = value self.key = key self.expires_on = expires_on @@ -69,7 +64,6 @@ def run(self) -> Key: return self.create() except SQLAlchemyError as ex: db.session.rollback() - logger.exception("Error running create command") raise KeyValueCreateFailedError() from ex def validate(self) -> None: @@ -80,9 +74,7 @@ def create(self) -> Key: resource=self.resource.value, value=pickle.dumps(self.value), created_on=datetime.now(), - created_by_fk=None - if self.actor is None or self.actor.is_anonymous - else self.actor.id, + created_by_fk=get_user_id(), expires_on=self.expires_on, ) if self.key is not None: diff --git a/superset/key_value/commands/delete.py b/superset/key_value/commands/delete.py index f8ad291714ae..b3cf84be0751 100644 --- a/superset/key_value/commands/delete.py +++ b/superset/key_value/commands/delete.py @@ -50,7 +50,6 @@ def run(self) -> bool: return self.delete() except SQLAlchemyError as ex: db.session.rollback() - logger.exception("Error running delete command") raise KeyValueDeleteFailedError() from ex def validate(self) -> None: diff --git a/superset/key_value/commands/delete_expired.py b/superset/key_value/commands/delete_expired.py index 4031d1396830..166a9f6f87ab 100644 --- a/superset/key_value/commands/delete_expired.py +++ b/superset/key_value/commands/delete_expired.py @@ -46,7 +46,6 @@ def run(self) -> None: self.delete_expired() except SQLAlchemyError as ex: db.session.rollback() - logger.exception("Error running delete command") raise KeyValueDeleteFailedError() from ex def validate(self) -> None: diff --git a/superset/key_value/commands/get.py b/superset/key_value/commands/get.py index 01560949e37f..44c02331cccb 100644 --- a/superset/key_value/commands/get.py +++ b/superset/key_value/commands/get.py @@ -52,7 +52,6 @@ def run(self) -> Any: try: return self.get() except SQLAlchemyError as ex: - logger.exception("Error running get command") raise KeyValueGetFailedError() from ex def validate(self) -> None: diff --git a/superset/key_value/commands/update.py b/superset/key_value/commands/update.py index 48fd8daa8a45..b69ca5e70d76 100644 --- a/superset/key_value/commands/update.py +++ b/superset/key_value/commands/update.py @@ -21,7 +21,6 @@ from typing import Any, Optional, Union from uuid import UUID -from flask_appbuilder.security.sqla.models import User from sqlalchemy.exc import SQLAlchemyError from superset import db @@ -30,24 +29,22 @@ from superset.key_value.models import KeyValueEntry from superset.key_value.types import Key, KeyValueResource from superset.key_value.utils import get_filter +from superset.utils.core import get_user_id logger = logging.getLogger(__name__) class UpdateKeyValueCommand(BaseCommand): - actor: Optional[User] resource: KeyValueResource value: Any key: Union[int, UUID] expires_on: Optional[datetime] - # pylint: disable=too-many-argumentsåå def __init__( self, resource: KeyValueResource, key: Union[int, UUID], value: Any, - actor: Optional[User] = None, expires_on: Optional[datetime] = None, ): """ @@ -56,11 +53,9 @@ def __init__( :param resource: the resource (dashboard, chart etc) :param key: the key to update :param value: the value to persist in the key-value store - :param actor: the user performing the command :param expires_on: entry expiration time :return: the key associated with the updated value """ - self.actor = actor self.resource = resource self.key = key self.value = value @@ -71,7 +66,6 @@ def run(self) -> Optional[Key]: return self.update() except SQLAlchemyError as ex: db.session.rollback() - logger.exception("Error running update command") raise KeyValueUpdateFailedError() from ex def validate(self) -> None: @@ -89,9 +83,7 @@ def update(self) -> Optional[Key]: entry.value = pickle.dumps(self.value) entry.expires_on = self.expires_on entry.changed_on = datetime.now() - entry.changed_by_fk = ( - None if self.actor is None or self.actor.is_anonymous else self.actor.id - ) + entry.changed_by_fk = get_user_id() db.session.merge(entry) db.session.commit() return Key(id=entry.id, uuid=entry.uuid) diff --git a/superset/key_value/commands/upsert.py b/superset/key_value/commands/upsert.py index 8fd0bd240f2b..06b33c90fcfe 100644 --- a/superset/key_value/commands/upsert.py +++ b/superset/key_value/commands/upsert.py @@ -21,34 +21,34 @@ from typing import Any, Optional, Union from uuid import UUID -from flask_appbuilder.security.sqla.models import User from sqlalchemy.exc import SQLAlchemyError from superset import db from superset.commands.base import BaseCommand from superset.key_value.commands.create import CreateKeyValueCommand -from superset.key_value.exceptions import KeyValueUpdateFailedError +from superset.key_value.exceptions import ( + KeyValueCreateFailedError, + KeyValueUpsertFailedError, +) from superset.key_value.models import KeyValueEntry from superset.key_value.types import Key, KeyValueResource from superset.key_value.utils import get_filter +from superset.utils.core import get_user_id logger = logging.getLogger(__name__) class UpsertKeyValueCommand(BaseCommand): - actor: Optional[User] resource: KeyValueResource value: Any key: Union[int, UUID] expires_on: Optional[datetime] - # pylint: disable=too-many-arguments def __init__( self, resource: KeyValueResource, key: Union[int, UUID], value: Any, - actor: Optional[User] = None, expires_on: Optional[datetime] = None, ): """ @@ -58,28 +58,25 @@ def __init__( :param key: the key to update :param value: the value to persist in the key-value store :param key_type: the type of the key to update - :param actor: the user performing the command :param expires_on: entry expiration time :return: the key associated with the updated value """ - self.actor = actor self.resource = resource self.key = key self.value = value self.expires_on = expires_on - def run(self) -> Optional[Key]: + def run(self) -> Key: try: return self.upsert() - except SQLAlchemyError as ex: + except (KeyValueCreateFailedError, SQLAlchemyError) as ex: db.session.rollback() - logger.exception("Error running update command") - raise KeyValueUpdateFailedError() from ex + raise KeyValueUpsertFailedError() from ex def validate(self) -> None: pass - def upsert(self) -> Optional[Key]: + def upsert(self) -> Key: filter_ = get_filter(self.resource, self.key) entry: KeyValueEntry = ( db.session.query(KeyValueEntry) @@ -91,16 +88,14 @@ def upsert(self) -> Optional[Key]: entry.value = pickle.dumps(self.value) entry.expires_on = self.expires_on entry.changed_on = datetime.now() - entry.changed_by_fk = ( - None if self.actor is None or self.actor.is_anonymous else self.actor.id - ) + entry.changed_by_fk = get_user_id() db.session.merge(entry) db.session.commit() return Key(entry.id, entry.uuid) + return CreateKeyValueCommand( resource=self.resource, value=self.value, - actor=self.actor, key=self.key, expires_on=self.expires_on, ).run() diff --git a/superset/key_value/exceptions.py b/superset/key_value/exceptions.py index fc66d24c2f32..b05daf6b89e0 100644 --- a/superset/key_value/exceptions.py +++ b/superset/key_value/exceptions.py @@ -46,5 +46,9 @@ class KeyValueUpdateFailedError(UpdateFailedError): message = _("An error occurred while updating the value.") +class KeyValueUpsertFailedError(UpdateFailedError): + message = _("An error occurred while upserting the value.") + + class KeyValueAccessDeniedError(ForbiddenError): message = _("You don't have permission to modify the value.") diff --git a/superset/key_value/models.py b/superset/key_value/models.py index f846d9039d4e..f92457d19017 100644 --- a/superset/key_value/models.py +++ b/superset/key_value/models.py @@ -21,6 +21,8 @@ from superset import security_manager from superset.models.helpers import AuditMixinNullable, ImportExportMixin +VALUE_MAX_SIZE = 2**24 - 1 + class KeyValueEntry(Model, AuditMixinNullable, ImportExportMixin): """Key value store entity""" @@ -28,7 +30,7 @@ class KeyValueEntry(Model, AuditMixinNullable, ImportExportMixin): __tablename__ = "key_value" id = Column(Integer, primary_key=True) resource = Column(String(32), nullable=False) - value = Column(LargeBinary(length=2**24 - 1), nullable=False) + value = Column(LargeBinary(length=VALUE_MAX_SIZE), nullable=False) created_on = Column(DateTime, nullable=True) created_by_fk = Column(Integer, ForeignKey("ab_user.id"), nullable=True) changed_on = Column(DateTime, nullable=True) diff --git a/superset/key_value/utils.py b/superset/key_value/utils.py index db27e505fbd6..2468618a81b6 100644 --- a/superset/key_value/utils.py +++ b/superset/key_value/utils.py @@ -18,15 +18,15 @@ from hashlib import md5 from secrets import token_urlsafe -from typing import Optional, Union -from uuid import UUID +from typing import Any, Union +from uuid import UUID, uuid3 import hashids -from flask_appbuilder.security.sqla.models import User from flask_babel import gettext as _ from superset.key_value.exceptions import KeyValueParseKeyError from superset.key_value.types import KeyValueFilter, KeyValueResource +from superset.utils.core import json_dumps_w_dates HASHIDS_MIN_LENGTH = 11 @@ -66,5 +66,7 @@ def get_uuid_namespace(seed: str) -> UUID: return UUID(md5_obj.hexdigest()) -def get_owner(user: User) -> Optional[int]: - return user.get_user_id() if not user.is_anonymous else None +def get_deterministic_uuid(namespace: str, payload: Any) -> UUID: + """Get a deterministic UUID (uuid3) from a salt and a JSON-serializable payload.""" + payload_str = json_dumps_w_dates(payload, sort_keys=True) + return uuid3(get_uuid_namespace(namespace), payload_str) diff --git a/superset/migrations/alembic.ini b/superset/migrations/alembic.ini index 28169d2bebf8..1b330a59e206 100644 --- a/superset/migrations/alembic.ini +++ b/superset/migrations/alembic.ini @@ -28,7 +28,7 @@ file_template = %%(year)d-%%(month).2d-%%(day).2d_%%(hour).2d-%%(minute).2d_%%(r # Logging configuration [loggers] -keys = root,sqlalchemy,alembic +keys = root,sqlalchemy,alembic,flask_migrate [handlers] keys = console @@ -60,3 +60,8 @@ formatter = generic [formatter_generic] format = %(levelname)-5.5s [%(name)s] %(message)s datefmt = %H:%M:%S + +[logger_flask_migrate] +level = DEBUG +handlers = +qualname = flask_migrate diff --git a/superset/migrations/shared/migrate_viz/__init__.py b/superset/migrations/shared/migrate_viz/__init__.py new file mode 100644 index 000000000000..aaa860e73379 --- /dev/null +++ b/superset/migrations/shared/migrate_viz/__init__.py @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from .processors import * diff --git a/superset/migrations/shared/migrate_viz/base.py b/superset/migrations/shared/migrate_viz/base.py new file mode 100644 index 000000000000..024a58463e25 --- /dev/null +++ b/superset/migrations/shared/migrate_viz/base.py @@ -0,0 +1,145 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from __future__ import annotations + +import json +from typing import Dict, Set + +from alembic import op +from sqlalchemy import and_, Column, Integer, String, Text +from sqlalchemy.ext.declarative import declarative_base + +from superset import db +from superset.migrations.shared.utils import paginated_update, try_load_json + +Base = declarative_base() + + +class Slice(Base): # type: ignore + __tablename__ = "slices" + + id = Column(Integer, primary_key=True) + slice_name = Column(String(250)) + viz_type = Column(String(250)) + params = Column(Text) + query_context = Column(Text) + + +FORM_DATA_BAK_FIELD_NAME = "form_data_bak" + + +class MigrateViz: + remove_keys: Set[str] = set() + rename_keys: Dict[str, str] = {} + source_viz_type: str + target_viz_type: str + + def __init__(self, form_data: str) -> None: + self.data = try_load_json(form_data) + + def _pre_action(self) -> None: + """some actions before migrate""" + + def _migrate(self) -> None: + if self.data.get("viz_type") != self.source_viz_type: + return + + if "viz_type" in self.data: + self.data["viz_type"] = self.target_viz_type + + rv_data = {} + for key, value in self.data.items(): + if key in self.rename_keys and self.rename_keys[key] in rv_data: + raise ValueError("Duplicate key in target viz") + + if key in self.rename_keys: + rv_data[self.rename_keys[key]] = value + + if key in self.remove_keys: + continue + + rv_data[key] = value + + self.data = rv_data + + def _post_action(self) -> None: + """some actions after migrate""" + + @classmethod + def upgrade_slice(cls, slc: Slice) -> Slice: + clz = cls(slc.params) + slc.viz_type = cls.target_viz_type + form_data_bak = clz.data.copy() + + clz._pre_action() + clz._migrate() + clz._post_action() + + # only backup params + slc.params = json.dumps({**clz.data, FORM_DATA_BAK_FIELD_NAME: form_data_bak}) + + query_context = try_load_json(slc.query_context) + if "form_data" in query_context: + query_context["form_data"] = clz.data + slc.query_context = json.dumps(query_context) + return slc + + @classmethod + def downgrade_slice(cls, slc: Slice) -> Slice: + form_data = try_load_json(slc.params) + form_data_bak = form_data.get(FORM_DATA_BAK_FIELD_NAME, {}) + if "viz_type" in form_data_bak: + slc.params = json.dumps(form_data_bak) + slc.viz_type = form_data_bak.get("viz_type") + query_context = try_load_json(slc.query_context) + if "form_data" in query_context: + query_context["form_data"] = form_data_bak + slc.query_context = json.dumps(query_context) + return slc + + @classmethod + def upgrade(cls) -> None: + bind = op.get_bind() + session = db.Session(bind=bind) + slices = session.query(Slice).filter(Slice.viz_type == cls.source_viz_type) + for slc in paginated_update( + slices, + lambda current, total: print( + f" Updating {current}/{total} charts", end="\r" + ), + ): + new_viz = cls.upgrade_slice(slc) + session.merge(new_viz) + + @classmethod + def downgrade(cls) -> None: + bind = op.get_bind() + session = db.Session(bind=bind) + slices = session.query(Slice).filter( + and_( + Slice.viz_type == cls.target_viz_type, + Slice.params.like(f"%{FORM_DATA_BAK_FIELD_NAME}%"), + ) + ) + for slc in paginated_update( + slices, + lambda current, total: print( + f" Downgrading {current}/{total} charts", end="\r" + ), + ): + new_viz = cls.downgrade_slice(slc) + session.merge(new_viz) diff --git a/superset/migrations/shared/migrate_viz/processors.py b/superset/migrations/shared/migrate_viz/processors.py new file mode 100644 index 000000000000..3584856beb72 --- /dev/null +++ b/superset/migrations/shared/migrate_viz/processors.py @@ -0,0 +1,55 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from .base import MigrateViz + + +class MigrateTreeMap(MigrateViz): + source_viz_type = "treemap" + target_viz_type = "treemap_v2" + remove_keys = {"metrics"} + + def _pre_action(self) -> None: + if ( + "metrics" in self.data + and isinstance(self.data["metrics"], list) + and len(self.data["metrics"]) > 0 + ): + self.data["metric"] = self.data["metrics"][0] + + +class MigrateAreaChart(MigrateViz): + source_viz_type = "area" + target_viz_type = "echarts_area" + remove_keys = {"contribution", "stacked_style", "x_axis_label"} + + def _pre_action(self) -> None: + if self.data.get("contribution"): + self.data["contributionMode"] = "row" + + stacked = self.data.get("stacked_style") + if stacked: + stacked_map = { + "expand": "Expand", + "stack": "Stack", + } + self.data["show_extra_controls"] = True + self.data["stack"] = stacked_map.get(stacked) + + x_axis_label = self.data.get("x_axis_label") + if x_axis_label: + self.data["x_axis_title"] = x_axis_label + self.data["x_axis_title_margin"] = 30 diff --git a/superset/migrations/shared/utils.py b/superset/migrations/shared/utils.py index 4b0c4e1440dd..e05b1d357f2e 100644 --- a/superset/migrations/shared/utils.py +++ b/superset/migrations/shared/utils.py @@ -14,19 +14,20 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +import json import logging import os import time -from typing import Any +from typing import Any, Callable, Dict, Iterator, Optional, Union from uuid import uuid4 from alembic import op -from sqlalchemy import engine_from_config +from sqlalchemy import engine_from_config, inspect from sqlalchemy.dialects.mysql.base import MySQLDialect from sqlalchemy.dialects.postgresql.base import PGDialect from sqlalchemy.engine import reflection from sqlalchemy.exc import NoSuchTableError -from sqlalchemy.orm import Session +from sqlalchemy.orm import Query, Session logger = logging.getLogger(__name__) @@ -80,16 +81,55 @@ def assign_uuids( print(f"Done. Assigned {count} uuids in {time.time() - start_time:.3f}s.\n") return - # Othwewise Use Python uuid function - start = 0 - while start < count: - end = min(start + batch_size, count) - for obj in session.query(model)[start:end]: - obj.uuid = uuid4() - session.merge(obj) + for obj in paginated_update( + session.query(model), + lambda current, total: print( + f" uuid assigned to {current} out of {total}", end="\r" + ), + batch_size=batch_size, + ): + obj.uuid = uuid4 + print(f"Done. Assigned {count} uuids in {time.time() - start_time:.3f}s.\n") + + +def paginated_update( + query: Query, + print_page_progress: Optional[Union[Callable[[int, int], None], bool]] = None, + batch_size: int = DEFAULT_BATCH_SIZE, +) -> Iterator[Any]: + """ + Update models in small batches so we don't have to load everything in memory. + """ + + total = query.count() + processed = 0 + session: Session = inspect(query).session + result = session.execute(query) + + if print_page_progress is None or print_page_progress is True: + print_page_progress = lambda processed, total: print( + f" {processed}/{total}", end="\r" + ) + + while True: + rows = result.fetchmany(batch_size) + + if not rows: + break + + for row in rows: + yield row[0] + session.commit() - if start + batch_size < count: - print(f" uuid assigned to {end} out of {count}\r", end="") - start += batch_size + processed += len(rows) - print(f"Done. Assigned {count} uuids in {time.time() - start_time:.3f}s.\n") + if print_page_progress: + print_page_progress(processed, total) + + +def try_load_json(data: Optional[str]) -> Dict[str, Any]: + try: + return data and json.loads(data) or {} + except json.decoder.JSONDecodeError: + print(f"Failed to parse: {data}") + return {} diff --git a/superset/migrations/versions/2016-06-27_08-43_27ae655e4247_make_creator_owners.py b/superset/migrations/versions/2016-06-27_08-43_27ae655e4247_make_creator_owners.py index c373c0f7e909..ee3340d0a3aa 100644 --- a/superset/migrations/versions/2016-06-27_08-43_27ae655e4247_make_creator_owners.py +++ b/superset/migrations/versions/2016-06-27_08-43_27ae655e4247_make_creator_owners.py @@ -34,6 +34,7 @@ from sqlalchemy.orm import relationship from superset import db +from superset.utils.core import get_user_id Base = declarative_base() @@ -63,17 +64,10 @@ class User(Base): class AuditMixin: - @classmethod - def get_user_id(cls): - try: - return g.user.id - except Exception: - return None - @declared_attr def created_by_fk(cls): return Column( - Integer, ForeignKey("ab_user.id"), default=cls.get_user_id, nullable=False + Integer, ForeignKey("ab_user.id"), default=get_user_id, nullable=False ) @declared_attr diff --git a/superset/migrations/versions/2017-02-08_14-16_a99f2f7c195a_rewriting_url_from_shortner_with_new_.py b/superset/migrations/versions/2017-02-08_14-16_a99f2f7c195a_rewriting_url_from_shortner_with_new_.py index 5e1ae9a25867..04a39a31f580 100644 --- a/superset/migrations/versions/2017-02-08_14-16_a99f2f7c195a_rewriting_url_from_shortner_with_new_.py +++ b/superset/migrations/versions/2017-02-08_14-16_a99f2f7c195a_rewriting_url_from_shortner_with_new_.py @@ -14,7 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -"""rewriting url from shortner with new format +"""rewriting url from shortener with new format Revision ID: a99f2f7c195a Revises: 53fc3de270ae diff --git a/superset/migrations/versions/2018-07-05_15-19_3dda56f1c4c6_migrate_num_period_compare_and_period_.py b/superset/migrations/versions/2018-07-05_15-19_3dda56f1c4c6_migrate_num_period_compare_and_period_.py index 1d0d81faaf2c..2e491e9303f4 100644 --- a/superset/migrations/versions/2018-07-05_15-19_3dda56f1c4c6_migrate_num_period_compare_and_period_.py +++ b/superset/migrations/versions/2018-07-05_15-19_3dda56f1c4c6_migrate_num_period_compare_and_period_.py @@ -56,7 +56,7 @@ class Slice(Base): "second": "PT1S", "minute": "PT1M", "5 minute": "PT5M", - "10 minute": "PT10M", + "10 minute": "PT10M", "half hour": "PT0.5H", "hour": "PT1H", "day": "P1D", diff --git a/superset/migrations/versions/2018-07-26_11-10_c82ee8a39623_add_implicit_tags.py b/superset/migrations/versions/2018-07-26_11-10_c82ee8a39623_add_implicit_tags.py index ad809d3e4564..0179ba7d0348 100644 --- a/superset/migrations/versions/2018-07-26_11-10_c82ee8a39623_add_implicit_tags.py +++ b/superset/migrations/versions/2018-07-26_11-10_c82ee8a39623_add_implicit_tags.py @@ -33,7 +33,8 @@ from sqlalchemy import Column, DateTime, Enum, ForeignKey, Integer, String from sqlalchemy.ext.declarative import declarative_base, declared_attr -from superset.models.tags import ObjectTypes, TagTypes +from superset.tags.models import ObjectTypes, TagTypes +from superset.utils.core import get_user_id Base = declarative_base() @@ -54,7 +55,7 @@ def created_by_fk(self) -> Column: return Column( Integer, ForeignKey("ab_user.id"), - default=self.get_user_id, + default=get_user_id, nullable=True, ) @@ -63,8 +64,8 @@ def changed_by_fk(self) -> Column: return Column( Integer, ForeignKey("ab_user.id"), - default=self.get_user_id, - onupdate=self.get_user_id, + default=get_user_id, + onupdate=get_user_id, nullable=True, ) diff --git a/superset/migrations/versions/2020-03-25_10-42_f9a30386bd74_cleanup_time_grainularity.py b/superset/migrations/versions/2020-03-25_10-42_f9a30386bd74_cleanup_time_grainularity.py index 055c51174d20..b45e7f9ad355 100644 --- a/superset/migrations/versions/2020-03-25_10-42_f9a30386bd74_cleanup_time_grainularity.py +++ b/superset/migrations/versions/2020-03-25_10-42_f9a30386bd74_cleanup_time_grainularity.py @@ -14,7 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -"""cleanup_time_grainularity +"""cleanup_time_granularity Revision ID: f9a30386bd74 Revises: b5998378c225 @@ -47,7 +47,7 @@ class Slice(Base): def upgrade(): """ - Remove any erroneous time grainularity fields from slices foor those visualization + Remove any erroneous time granularity fields from slices foor those visualization types which do not support time granularity. :see: https://github.com/apache/superset/pull/8674 @@ -59,7 +59,7 @@ def upgrade(): bind = op.get_bind() session = db.Session(bind=bind) - # Visualization types which support time grainularity (hence negate). + # Visualization types which support time granularity (hence negate). viz_types = [ "area", "bar", @@ -73,9 +73,9 @@ def upgrade(): "time_table", ] - # Erroneous time grainularity fields for either Druid NoSQL or SQL slices which do - # not support time grainularity. - erroneous = ["grainularity", "time_grain_sqla"] + # Erroneous time granularity fields for either Druid NoSQL or SQL slices which do + # not support time granularity. + erroneous = ["granularity", "time_grain_sqla"] for slc in session.query(Slice).filter(Slice.viz_type.notin_(viz_types)).all(): try: diff --git a/superset/migrations/versions/2020-09-28_17-57_b56500de1855_add_uuid_column_to_import_mixin.py b/superset/migrations/versions/2020-09-28_17-57_b56500de1855_add_uuid_column_to_import_mixin.py index c392c3e78caf..9ff117b1e2a3 100644 --- a/superset/migrations/versions/2020-09-28_17-57_b56500de1855_add_uuid_column_to_import_mixin.py +++ b/superset/migrations/versions/2020-09-28_17-57_b56500de1855_add_uuid_column_to_import_mixin.py @@ -101,7 +101,7 @@ def update_position_json(dashboard, session, uuid_map): def update_dashboards(session, uuid_map): message = ( - "Updating dasboard position json with slice uuid.." + "Updating dashboard position json with slice uuid.." if uuid_map else "Cleaning up slice uuid from dashboard position json.." ) diff --git a/superset/migrations/versions/2021-05-27_16-10_6f139c533bea_add_advanced_data_types_to_column_models.py b/superset/migrations/versions/2021-05-27_16-10_6f139c533bea_add_advanced_data_types_to_column_models.py index bbbee47fad23..114716c3dace 100644 --- a/superset/migrations/versions/2021-05-27_16-10_6f139c533bea_add_advanced_data_types_to_column_models.py +++ b/superset/migrations/versions/2021-05-27_16-10_6f139c533bea_add_advanced_data_types_to_column_models.py @@ -14,10 +14,12 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -"""adding_advanced_data_type.py +"""adding advanced data type to column models + Revision ID: 6f139c533bea Revises: cbe71abde154 Create Date: 2021-05-27 16:10:59.567684 + """ import sqlalchemy as sa diff --git a/superset/migrations/versions/2021-08-31_11-37_021b81fe4fbb_add_type_to_native_filter_configuration.py b/superset/migrations/versions/2021-08-31_11-37_021b81fe4fbb_add_type_to_native_filter_configuration.py index 9c26159ba0a8..ae1b6c82edb0 100644 --- a/superset/migrations/versions/2021-08-31_11-37_021b81fe4fbb_add_type_to_native_filter_configuration.py +++ b/superset/migrations/versions/2021-08-31_11-37_021b81fe4fbb_add_type_to_native_filter_configuration.py @@ -31,7 +31,7 @@ import sqlalchemy as sa from alembic import op -from sqlalchemy.ext.declarative.api import declarative_base +from sqlalchemy.ext.declarative import declarative_base from superset import db @@ -91,7 +91,7 @@ def downgrade(): for dashboard in session.query(Dashboard).all(): logger.info( - "[RemoveTypeToNativeFilter] Updating Dashobard<pk:%s>", + "[RemoveTypeToNativeFilter] Updating Dashboard<pk:%s>", dashboard.id, ) if not dashboard.json_metadata: diff --git a/superset/migrations/versions/2021-09-19_14-42_b92d69a6643c_rename_csv_to_file.py b/superset/migrations/versions/2021-09-19_14-42_b92d69a6643c_rename_csv_to_file.py index b816b2432015..d86c8e9114c0 100644 --- a/superset/migrations/versions/2021-09-19_14-42_b92d69a6643c_rename_csv_to_file.py +++ b/superset/migrations/versions/2021-09-19_14-42_b92d69a6643c_rename_csv_to_file.py @@ -39,7 +39,7 @@ def upgrade(): new_column_name="allow_file_upload", existing_type=sa.Boolean(), ) - except sa.exc.OperationalError: + except (sa.exc.OperationalError, sa.exc.DatabaseError): # In MySQL 8.0 renaming the column rename fails because it has # a constraint check; we can safely remove it in that case, see # https://github.com/sqlalchemy/alembic/issues/699 diff --git a/superset/migrations/versions/2022-01-28_16-03_5afbb1a5849b_add_embedded_dahshoard_table.py b/superset/migrations/versions/2022-01-28_16-03_5afbb1a5849b_add_embedded_dahshoard_table.py index 1f1c62782bbe..5d415e1596e6 100644 --- a/superset/migrations/versions/2022-01-28_16-03_5afbb1a5849b_add_embedded_dahshoard_table.py +++ b/superset/migrations/versions/2022-01-28_16-03_5afbb1a5849b_add_embedded_dahshoard_table.py @@ -14,7 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -"""add_embedded_dahshoard_table +"""add_embedded_dashboard_table Revision ID: 5afbb1a5849b Revises: 5fd49410a97a diff --git a/superset/migrations/versions/2022-04-01_14-38_a9422eeaae74_new_dataset_models_take_2.py b/superset/migrations/versions/2022-04-01_14-38_a9422eeaae74_new_dataset_models_take_2.py index 87c7e13849ab..2dcd1650f0ef 100644 --- a/superset/migrations/versions/2022-04-01_14-38_a9422eeaae74_new_dataset_models_take_2.py +++ b/superset/migrations/versions/2022-04-01_14-38_a9422eeaae74_new_dataset_models_take_2.py @@ -636,14 +636,31 @@ def postprocess_columns(session: Session) -> None: return def get_joined_tables(offset, limit): + + # Import aliased from sqlalchemy + from sqlalchemy.orm import aliased + + # Create alias of NewColumn + new_column_alias = aliased(NewColumn) + # Get subquery and give it the alias "sl_colums_2" + subquery = ( + session.query(new_column_alias) + .offset(offset) + .limit(limit) + .subquery("sl_columns_2") + ) + return ( sa.join( - session.query(NewColumn) - .offset(offset) - .limit(limit) - .subquery("sl_columns"), + subquery, + NewColumn, + # Use column id from subquery + subquery.c.id == NewColumn.id, + ) + .join( dataset_column_association_table, - dataset_column_association_table.c.column_id == NewColumn.id, + # Use column id from subquery + dataset_column_association_table.c.column_id == subquery.c.id, ) .join( NewDataset, @@ -661,12 +678,14 @@ def get_joined_tables(offset, limit): .join(Database, Database.id == NewDataset.database_id) .join( TableColumn, - TableColumn.uuid == NewColumn.uuid, + # Use column uuid from subquery + TableColumn.uuid == subquery.c.uuid, isouter=True, ) .join( SqlMetric, - SqlMetric.uuid == NewColumn.uuid, + # Use column uuid from subquery + SqlMetric.uuid == subquery.c.uuid, isouter=True, ) ) diff --git a/superset/migrations/versions/2022-05-03_19-39_cbe71abde154_fix_report_schedule_and_log.py b/superset/migrations/versions/2022-05-03_19-39_cbe71abde154_fix_report_schedule_and_log.py index 5c88606511d9..d00b60cd1887 100644 --- a/superset/migrations/versions/2022-05-03_19-39_cbe71abde154_fix_report_schedule_and_log.py +++ b/superset/migrations/versions/2022-05-03_19-39_cbe71abde154_fix_report_schedule_and_log.py @@ -31,7 +31,7 @@ from sqlalchemy.ext.declarative import declarative_base from superset import db -from superset.models.reports import ReportState +from superset.reports.models import ReportState Base = declarative_base() diff --git a/superset/migrations/versions/2022-06-19_16-17_f3afaf1f11f0_add_unique_name_desc_rls.py b/superset/migrations/versions/2022-06-19_16-17_f3afaf1f11f0_add_unique_name_desc_rls.py new file mode 100644 index 000000000000..474824fcc2bb --- /dev/null +++ b/superset/migrations/versions/2022-06-19_16-17_f3afaf1f11f0_add_unique_name_desc_rls.py @@ -0,0 +1,78 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""add_unique_name_desc_rls + +Revision ID: f3afaf1f11f0 +Revises: e09b4ae78457 +Create Date: 2022-06-19 16:17:23.318618 + +""" + +# revision identifiers, used by Alembic. +revision = "f3afaf1f11f0" +down_revision = "e09b4ae78457" + +import sqlalchemy as sa +from alembic import op +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import Session + +Base = declarative_base() + + +class RowLevelSecurityFilter(Base): + __tablename__ = "row_level_security_filters" + id = sa.Column(sa.Integer, primary_key=True) + name = sa.Column(sa.String(255), unique=True, nullable=False) + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + bind = op.get_bind() + session = Session(bind=bind) + + op.add_column( + "row_level_security_filters", sa.Column("name", sa.String(length=255)) + ) + op.add_column( + "row_level_security_filters", sa.Column("description", sa.Text(), nullable=True) + ) + + # Set initial default names make sure we can have unique non null values + all_rls = session.query(RowLevelSecurityFilter).all() + for rls in all_rls: + rls.name = f"rls-{rls.id}" + session.commit() + + # Now it's safe so set non-null and unique + # add unique constraint + with op.batch_alter_table("row_level_security_filters") as batch_op: + # batch mode is required for sqlite + batch_op.alter_column( + "name", + existing_type=sa.String(255), + nullable=False, + ) + batch_op.create_unique_constraint("uq_rls_name", ["name"]) + # ### end Alembic commands ### + + +def downgrade(): + with op.batch_alter_table("row_level_security_filters") as batch_op: + batch_op.drop_constraint("uq_rls_name", type_="unique") + batch_op.drop_column("description") + batch_op.drop_column("name") diff --git a/superset/migrations/versions/2022-06-27_14-59_7fb8bca906d2_permalink_rename_filterstate.py b/superset/migrations/versions/2022-06-27_14-59_7fb8bca906d2_permalink_rename_filterstate.py new file mode 100644 index 000000000000..0b76404dc9c7 --- /dev/null +++ b/superset/migrations/versions/2022-06-27_14-59_7fb8bca906d2_permalink_rename_filterstate.py @@ -0,0 +1,88 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""permalink_rename_filterState + +Revision ID: 7fb8bca906d2 +Revises: f3afaf1f11f0 +Create Date: 2022-06-27 14:59:20.740380 + +""" + +# revision identifiers, used by Alembic. +revision = "7fb8bca906d2" +down_revision = "f3afaf1f11f0" + +import pickle + +from alembic import op +from sqlalchemy import Column, Integer, LargeBinary, String +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import Session + +from superset import db +from superset.migrations.shared.utils import paginated_update + +Base = declarative_base() +VALUE_MAX_SIZE = 2**24 - 1 +DASHBOARD_PERMALINK_RESOURCE_TYPE = "dashboard_permalink" + + +class KeyValueEntry(Base): + __tablename__ = "key_value" + id = Column(Integer, primary_key=True) + resource = Column(String(32), nullable=False) + value = Column(LargeBinary(length=VALUE_MAX_SIZE), nullable=False) + + +def upgrade(): + bind = op.get_bind() + session: Session = db.Session(bind=bind) + for entry in paginated_update( + session.query(KeyValueEntry).filter( + KeyValueEntry.resource == DASHBOARD_PERMALINK_RESOURCE_TYPE + ) + ): + value = pickle.loads(entry.value) or {} + state = value.get("state") + if state: + if "filterState" in state: + state["dataMask"] = state["filterState"] + del state["filterState"] + if "hash" in state: + state["anchor"] = state["hash"] + del state["hash"] + entry.value = pickle.dumps(value) + + +def downgrade(): + bind = op.get_bind() + session: Session = db.Session(bind=bind) + for entry in paginated_update( + session.query(KeyValueEntry).filter( + KeyValueEntry.resource == DASHBOARD_PERMALINK_RESOURCE_TYPE + ), + ): + value = pickle.loads(entry.value) or {} + state = value.get("state") + if state: + if "dataMask" in state: + state["filterState"] = state["dataMask"] + del state["dataMask"] + if "anchor" in state: + state["hash"] = state["anchor"] + del state["anchor"] + entry.value = pickle.dumps(value) diff --git a/superset/migrations/versions/2022-07-05_15-48_409c7b420ab0_add_created_by_fk_as_owner.py b/superset/migrations/versions/2022-07-05_15-48_409c7b420ab0_add_created_by_fk_as_owner.py new file mode 100644 index 000000000000..6cdf9f6891cb --- /dev/null +++ b/superset/migrations/versions/2022-07-05_15-48_409c7b420ab0_add_created_by_fk_as_owner.py @@ -0,0 +1,135 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""add created_by_fk as owner + +Revision ID: 409c7b420ab0 +Revises: a39867932713 +Create Date: 2022-07-05 15:48:06.029190 + +""" + +from alembic import op +from sqlalchemy import and_, Column, insert, Integer +from sqlalchemy.ext.declarative import declarative_base + +# revision identifiers, used by Alembic. +from superset import db + +revision = "409c7b420ab0" +down_revision = "a39867932713" + + +Base = declarative_base() + + +class Dataset(Base): + __tablename__ = "sl_datasets" + + id = Column(Integer, primary_key=True) + created_by_fk = Column(Integer) + + +class DatasetUser(Base): + __tablename__ = "sl_dataset_users" + + id = Column(Integer, primary_key=True) + user_id = Column(Integer) + dataset_id = Column(Integer) + + +class Slice(Base): + __tablename__ = "slices" + + id = Column(Integer, primary_key=True) + created_by_fk = Column(Integer) + + +class SliceUser(Base): + __tablename__ = "slice_user" + + id = Column(Integer, primary_key=True) + user_id = Column(Integer) + slice_id = Column(Integer) + + +class SqlaTable(Base): + __tablename__ = "tables" + + id = Column(Integer, primary_key=True) + created_by_fk = Column(Integer) + + +class SqlaTableUser(Base): + __tablename__ = "sqlatable_user" + + id = Column(Integer, primary_key=True) + user_id = Column(Integer) + table_id = Column(Integer) + + +def upgrade(): + bind = op.get_bind() + session = db.Session(bind=bind) + + op.execute( + insert(DatasetUser).from_select( + ["user_id", "dataset_id"], + session.query(Dataset.created_by_fk, Dataset.id) + .outerjoin( + DatasetUser, + and_( + DatasetUser.dataset_id == Dataset.id, + DatasetUser.user_id == Dataset.created_by_fk, + ), + ) + .filter(DatasetUser.dataset_id == None, Dataset.created_by_fk != None), + ) + ) + + op.execute( + insert(SliceUser).from_select( + ["user_id", "slice_id"], + session.query(Slice.created_by_fk, Slice.id) + .outerjoin( + SliceUser, + and_( + SliceUser.slice_id == Slice.id, + SliceUser.user_id == Slice.created_by_fk, + ), + ) + .filter(SliceUser.slice_id == None), + ) + ) + + op.execute( + insert(SqlaTableUser).from_select( + ["user_id", "table_id"], + session.query(SqlaTable.created_by_fk, SqlaTable.id) + .outerjoin( + SqlaTableUser, + and_( + SqlaTableUser.table_id == SqlaTable.id, + SqlaTableUser.user_id == SqlaTable.created_by_fk, + ), + ) + .filter(SqlaTableUser.table_id == None), + ) + ) + + +def downgrade(): + pass diff --git a/tests/integration_tests/db_engine_specs/drill_tests.py b/superset/migrations/versions/2022-07-07_00-00_cdcf3d64daf4_add_user_id_dttm_idx_to_log_model.py similarity index 58% rename from tests/integration_tests/db_engine_specs/drill_tests.py rename to superset/migrations/versions/2022-07-07_00-00_cdcf3d64daf4_add_user_id_dttm_idx_to_log_model.py index e89462ee5f86..1122571e17a8 100644 --- a/tests/integration_tests/db_engine_specs/drill_tests.py +++ b/superset/migrations/versions/2022-07-07_00-00_cdcf3d64daf4_add_user_id_dttm_idx_to_log_model.py @@ -14,20 +14,27 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from superset.db_engine_specs.drill import DrillEngineSpec -from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec +"""Add user_id and dttm composite index to Log model +Revision ID: cdcf3d64daf4 +Revises: 7fb8bca906d2 +Create Date: 2022-04-05 13:27:06.028908 -class TestDrillDbEngineSpec(TestDbEngineSpec): - def test_convert_dttm(self): - dttm = self.get_dttm() +""" - self.assertEqual( - DrillEngineSpec.convert_dttm("DATE", dttm), - "TO_DATE('2019-01-02', 'yyyy-MM-dd')", - ) +# revision identifiers, used by Alembic. +revision = "cdcf3d64daf4" +down_revision = "7fb8bca906d2" - self.assertEqual( - DrillEngineSpec.convert_dttm("TIMESTAMP", dttm), - "TO_TIMESTAMP('2019-01-02 03:04:05', 'yyyy-MM-dd HH:mm:ss')", - ) + +from alembic import op + + +def upgrade(): + op.create_index( + op.f("ix_logs_user_id_dttm"), "logs", ["user_id", "dttm"], unique=False + ) + + +def downgrade(): + op.drop_index(op.f("ix_logs_user_id_dttm"), table_name="logs") diff --git a/superset/migrations/versions/2022-07-07_13-00_c747c78868b6_migrating_legacy_treemap.py b/superset/migrations/versions/2022-07-07_13-00_c747c78868b6_migrating_legacy_treemap.py new file mode 100644 index 000000000000..18c9acaf5766 --- /dev/null +++ b/superset/migrations/versions/2022-07-07_13-00_c747c78868b6_migrating_legacy_treemap.py @@ -0,0 +1,47 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""Migrating legacy TreeMap + +Revision ID: c747c78868b6 +Revises: cdcf3d64daf4 +Create Date: 2022-06-30 22:04:17.686635 + +""" +from alembic import op +from sqlalchemy.dialects.mysql.base import MySQLDialect + +from superset.migrations.shared.migrate_viz import MigrateTreeMap + +# revision identifiers, used by Alembic. +revision = "c747c78868b6" +down_revision = "cdcf3d64daf4" + + +def upgrade(): + # Ensure `slice.params` and `slice.query_context`` in MySQL is MEDIUMTEXT + # before migration, as the migration will save a duplicate form_data backup + # which may significantly increase the size of these fields. + if isinstance(op.get_bind().dialect, MySQLDialect): + # If the columns are already MEDIUMTEXT, this is a no-op + op.execute("ALTER TABLE slices MODIFY params MEDIUMTEXT") + op.execute("ALTER TABLE slices MODIFY query_context MEDIUMTEXT") + + MigrateTreeMap.upgrade() + + +def downgrade(): + MigrateTreeMap.downgrade() diff --git a/superset/migrations/versions/2022-07-07_14-00_06e1e70058c7_migrating_legacy_area.py b/superset/migrations/versions/2022-07-07_14-00_06e1e70058c7_migrating_legacy_area.py new file mode 100644 index 000000000000..de4078099104 --- /dev/null +++ b/superset/migrations/versions/2022-07-07_14-00_06e1e70058c7_migrating_legacy_area.py @@ -0,0 +1,36 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""Migrating legacy Area + +Revision ID: 06e1e70058c7 +Revises: c747c78868b6 +Create Date: 2022-06-13 14:17:51.872706 + +""" +from superset.migrations.shared.migrate_viz import MigrateAreaChart + +# revision identifiers, used by Alembic. +revision = "06e1e70058c7" +down_revision = "c747c78868b6" + + +def upgrade(): + MigrateAreaChart.upgrade() + + +def downgrade(): + MigrateAreaChart.downgrade() diff --git a/superset/migrations/versions/2022-07-11_11-26_ffa79af61a56_rename_report_schedule_extra_to_extra_.py b/superset/migrations/versions/2022-07-11_11-26_ffa79af61a56_rename_report_schedule_extra_to_extra_.py new file mode 100644 index 000000000000..8de19e1266d5 --- /dev/null +++ b/superset/migrations/versions/2022-07-11_11-26_ffa79af61a56_rename_report_schedule_extra_to_extra_.py @@ -0,0 +1,53 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""rename report_schedule.extra to extra_json + +So we can reuse the ExtraJSONMixin + +Revision ID: ffa79af61a56 +Revises: 409c7b420ab0 +Create Date: 2022-07-11 11:26:00.010714 + +""" + +# revision identifiers, used by Alembic. +revision = "ffa79af61a56" +down_revision = "409c7b420ab0" + +from alembic import op +from sqlalchemy.types import Text + + +def upgrade(): + op.alter_column( + "report_schedule", + "extra", + new_column_name="extra_json", + # existing info is required for MySQL + existing_type=Text, + existing_nullable=True, + ) + + +def downgrade(): + op.alter_column( + "report_schedule", + "extra_json", + new_column_name="extra", + existing_type=Text, + existing_nullable=True, + ) diff --git a/superset/migrations/versions/2022-07-19_15-16_a39867932713_query_context_to_mediumtext.py b/superset/migrations/versions/2022-07-19_15-16_a39867932713_query_context_to_mediumtext.py new file mode 100644 index 000000000000..027b8c77dd1f --- /dev/null +++ b/superset/migrations/versions/2022-07-19_15-16_a39867932713_query_context_to_mediumtext.py @@ -0,0 +1,43 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""query_context_to_mediumtext + +Revision ID: a39867932713 +Revises: 06e1e70058c7 +Create Date: 2022-07-19 15:16:06.091961 + +""" +from alembic import op +from sqlalchemy.dialects.mysql.base import MySQLDialect + +# revision identifiers, used by Alembic. +revision = "a39867932713" +down_revision = "06e1e70058c7" + + +def upgrade(): + if isinstance(op.get_bind().dialect, MySQLDialect): + # If the columns are already MEDIUMTEXT, this is a no-op + op.execute("ALTER TABLE slices MODIFY params MEDIUMTEXT") + op.execute("ALTER TABLE slices MODIFY query_context MEDIUMTEXT") + + +def downgrade(): + # It's Okay to keep these columns as MEDIUMTEXT + # Since some oraganizations may have already manually changed the type + # and downgrade may loose data so we don't do it. + pass diff --git a/superset/migrations/versions/2022-08-16_15-23_6d3c6f9d665d_fix_table_chart_conditional_formatting_.py b/superset/migrations/versions/2022-08-16_15-23_6d3c6f9d665d_fix_table_chart_conditional_formatting_.py new file mode 100644 index 000000000000..30caf7efa111 --- /dev/null +++ b/superset/migrations/versions/2022-08-16_15-23_6d3c6f9d665d_fix_table_chart_conditional_formatting_.py @@ -0,0 +1,82 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""fix_table_chart_conditional_formatting_colors + +Revision ID: 6d3c6f9d665d +Revises: ffa79af61a56 +Create Date: 2022-08-16 15:23:42.860038 + +""" +import json + +from alembic import op +from sqlalchemy import Column, Integer, String, Text +from sqlalchemy.ext.declarative import declarative_base + +from superset import db + +# revision identifiers, used by Alembic. +revision = "6d3c6f9d665d" +down_revision = "ffa79af61a56" + +Base = declarative_base() + + +class Slice(Base): + __tablename__ = "slices" + id = Column(Integer, primary_key=True) + viz_type = Column(String(250)) + params = Column(Text) + + +def upgrade(): + bind = op.get_bind() + session = db.Session(bind=bind) + + for slc in session.query(Slice).filter(Slice.viz_type == "table"): + params = json.loads(slc.params) + conditional_formatting = params.get("conditional_formatting", []) + if conditional_formatting: + new_conditional_formatting = [] + for formatter in conditional_formatting: + color_scheme = formatter.get("colorScheme") + new_color_scheme = None + if color_scheme == "rgb(0,255,0)": + # supersetTheme.colors.success.light1 + new_color_scheme = "#ACE1C4" + elif color_scheme == "rgb(255,255,0)": + # supersetTheme.colors.alert.light1 + new_color_scheme = "#FDE380" + elif color_scheme == "rgb(255,0,0)": + # supersetTheme.colors.error.light1 + new_color_scheme = "#EFA1AA" + if new_color_scheme: + new_conditional_formatting.append( + {**formatter, "colorScheme": new_color_scheme} + ) + else: + new_conditional_formatting.append(formatter) + params["conditional_formatting"] = new_conditional_formatting + slc.params = json.dumps(params) + session.merge(slc) + session.commit() + session.close() + + +# it fixes a bug, downgrading isn't really needed here +def downgrade(): + pass diff --git a/superset/migrations/versions/2022-08-31_19-30_291f024254b5_drop_column_allow_multi_schema_metadata_fetch.py b/superset/migrations/versions/2022-08-31_19-30_291f024254b5_drop_column_allow_multi_schema_metadata_fetch.py new file mode 100644 index 000000000000..fadcb3dda24e --- /dev/null +++ b/superset/migrations/versions/2022-08-31_19-30_291f024254b5_drop_column_allow_multi_schema_metadata_fetch.py @@ -0,0 +1,48 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""drop_column_allow_multi_schema_metadata_fetch + + +Revision ID: 291f024254b5 +Revises: 6d3c6f9d665d +Create Date: 2022-08-31 19:30:33.665025 + +""" + +# revision identifiers, used by Alembic. +revision = "291f024254b5" +down_revision = "6d3c6f9d665d" + +import sqlalchemy as sa +from alembic import op + + +def upgrade(): + with op.batch_alter_table("dbs") as batch_op: + batch_op.drop_column("allow_multi_schema_metadata_fetch") + + +def downgrade(): + op.add_column( + "dbs", + sa.Column( + "allow_multi_schema_metadata_fetch", + sa.Boolean(), + nullable=True, + default=True, + ), + ) diff --git a/superset/migrations/versions/2022-10-03_17-34_deb4c9d4a4ef_parameters_in_saved_queries.py b/superset/migrations/versions/2022-10-03_17-34_deb4c9d4a4ef_parameters_in_saved_queries.py new file mode 100644 index 000000000000..af3f6157a865 --- /dev/null +++ b/superset/migrations/versions/2022-10-03_17-34_deb4c9d4a4ef_parameters_in_saved_queries.py @@ -0,0 +1,46 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""parameters in saved queries + +Revision ID: deb4c9d4a4ef +Revises: 291f024254b5 +Create Date: 2022-10-03 17:34:00.721559 + +""" + +# revision identifiers, used by Alembic. +revision = "deb4c9d4a4ef" +down_revision = "291f024254b5" + +import sqlalchemy as sa +from alembic import op + + +def upgrade(): + op.add_column( + "saved_query", + sa.Column( + "template_parameters", + sa.TEXT(), + nullable=True, + ), + ) + + +def downgrade(): + with op.batch_alter_table("saved_query") as batch_op: + batch_op.drop_column("template_parameters") diff --git a/superset/migrations/versions/2022-10-20_10-48_f3c2d8ec8595_create_ssh_tunnel_credentials_tbl.py b/superset/migrations/versions/2022-10-20_10-48_f3c2d8ec8595_create_ssh_tunnel_credentials_tbl.py new file mode 100644 index 000000000000..b373020cb14c --- /dev/null +++ b/superset/migrations/versions/2022-10-20_10-48_f3c2d8ec8595_create_ssh_tunnel_credentials_tbl.py @@ -0,0 +1,89 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""create_ssh_tunnel_credentials_tbl + +Revision ID: f3c2d8ec8595 +Revises: 4ce1d9b25135 +Create Date: 2022-10-20 10:48:08.722861 + +""" + +# revision identifiers, used by Alembic. +revision = "f3c2d8ec8595" +down_revision = "4ce1d9b25135" + +from uuid import uuid4 + +import sqlalchemy as sa +from alembic import op +from sqlalchemy_utils import UUIDType + +from superset import app +from superset.extensions import encrypted_field_factory + +app_config = app.config + + +def upgrade(): + op.create_table( + "ssh_tunnels", + # AuditMixinNullable + sa.Column("created_on", sa.DateTime(), nullable=True), + sa.Column("changed_on", sa.DateTime(), nullable=True), + sa.Column("created_by_fk", sa.Integer(), nullable=True), + sa.Column("changed_by_fk", sa.Integer(), nullable=True), + # ExtraJSONMixin + sa.Column("extra_json", sa.Text(), nullable=True), + # ImportExportMixin + sa.Column( + "uuid", + UUIDType(binary=True), + primary_key=False, + default=uuid4, + unique=True, + index=True, + ), + # SSHTunnelCredentials + sa.Column("id", sa.Integer(), primary_key=True), + sa.Column( + "database_id", + sa.INTEGER(), + sa.ForeignKey("dbs.id"), + unique=True, + index=True, + ), + sa.Column("server_address", sa.String(256)), + sa.Column("server_port", sa.INTEGER()), + sa.Column("username", encrypted_field_factory.create(sa.String(256))), + sa.Column( + "password", encrypted_field_factory.create(sa.String(256)), nullable=True + ), + sa.Column( + "private_key", + encrypted_field_factory.create(sa.String(1024)), + nullable=True, + ), + sa.Column( + "private_key_password", + encrypted_field_factory.create(sa.String(256)), + nullable=True, + ), + ) + + +def downgrade(): + op.drop_table("ssh_tunnels") diff --git a/superset/migrations/versions/2022-11-28_17-51_4ce1d9b25135_remove_filter_bar_orientation.py b/superset/migrations/versions/2022-11-28_17-51_4ce1d9b25135_remove_filter_bar_orientation.py new file mode 100644 index 000000000000..07ee47b9845c --- /dev/null +++ b/superset/migrations/versions/2022-11-28_17-51_4ce1d9b25135_remove_filter_bar_orientation.py @@ -0,0 +1,65 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""remove_filter_bar_orientation + +Revision ID: 4ce1d9b25135 +Revises: deb4c9d4a4ef +Create Date: 2022-11-28 17:51:08.954439 + +""" + +# revision identifiers, used by Alembic. +revision = "4ce1d9b25135" +down_revision = "deb4c9d4a4ef" + +import json + +import sqlalchemy as sa +from alembic import op +from sqlalchemy.ext.declarative import declarative_base + +from superset import db + +Base = declarative_base() + + +class Dashboard(Base): + __tablename__ = "dashboards" + id = sa.Column(sa.Integer, primary_key=True) + json_metadata = sa.Column(sa.Text) + + +def upgrade(): + pass + + +def downgrade(): + bind = op.get_bind() + session = db.Session(bind=bind) + + dashboards = ( + session.query(Dashboard) + .filter(Dashboard.json_metadata.like('%"filter_bar_orientation"%')) + .all() + ) + for dashboard in dashboards: + json_meta = json.loads(dashboard.json_metadata) + filter_bar_orientation = json_meta.pop("filter_bar_orientation", None) + if filter_bar_orientation: + dashboard.json_metadata = json.dumps(json_meta) + session.commit() + session.close() diff --git a/superset/models/core.py b/superset/models/core.py index c31f727df9f1..2c5c413479c7 100755 --- a/superset/models/core.py +++ b/superset/models/core.py @@ -21,10 +21,10 @@ import logging import textwrap from ast import literal_eval -from contextlib import closing, contextmanager +from contextlib import closing, contextmanager, nullcontext from copy import deepcopy from datetime import datetime -from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Type +from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Type, TYPE_CHECKING import numpy import pandas as pd @@ -46,19 +46,24 @@ from sqlalchemy.engine import Connection, Dialect, Engine from sqlalchemy.engine.reflection import Inspector from sqlalchemy.engine.url import URL -from sqlalchemy.exc import ArgumentError +from sqlalchemy.exc import ArgumentError, NoSuchModuleError from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm import relationship from sqlalchemy.pool import NullPool from sqlalchemy.schema import UniqueConstraint from sqlalchemy.sql import expression, Select -from superset import app, db_engine_specs, is_feature_enabled +from superset import app, db_engine_specs +from superset.constants import PASSWORD_MASK from superset.databases.utils import make_url_safe -from superset.db_engine_specs.base import TimeGrain -from superset.extensions import cache_manager, encrypted_field_factory, security_manager +from superset.db_engine_specs.base import MetricType, TimeGrain +from superset.extensions import ( + cache_manager, + encrypted_field_factory, + security_manager, + ssh_manager_factory, +) from superset.models.helpers import AuditMixinNullable, ImportExportMixin -from superset.models.tags import FavStarUpdater from superset.result_set import SupersetResultSet from superset.utils import cache as cache_util, core as utils from superset.utils.core import get_username @@ -71,7 +76,9 @@ metadata = Model.metadata # pylint: disable=no-member logger = logging.getLogger(__name__) -PASSWORD_MASK = "X" * 10 +if TYPE_CHECKING: + from superset.databases.ssh_tunnel.models import SSHTunnel + DB_CONNECTION_MUTATOR = config["DB_CONNECTION_MUTATOR"] @@ -134,9 +141,6 @@ class Database( allow_cvas = Column(Boolean, default=False) allow_dml = Column(Boolean, default=False) force_ctas_schema = Column(String(250)) - allow_multi_schema_metadata_fetch = Column( # pylint: disable=invalid-name - Boolean, default=False - ) extra = Column( Text, default=textwrap.dedent( @@ -164,10 +168,16 @@ class Database( "allow_run_async", "allow_ctas", "allow_cvas", + "allow_dml", "allow_file_upload", "extra", ] - extra_import_fields = ["password", "is_managed_externally", "external_url"] + extra_import_fields = [ + "password", + "is_managed_externally", + "external_url", + "encrypted_extra", + ] export_children = ["tables"] def __repr__(self) -> str: @@ -228,7 +238,6 @@ def data(self) -> Dict[str, Any]: "name": self.database_name, "backend": self.backend, "configuration_method": self.configuration_method, - "allow_multi_schema_metadata_fetch": self.allow_multi_schema_metadata_fetch, "allows_subquery": self.allows_subquery, "allows_cost_estimate": self.allows_cost_estimate, "allows_virtual_table_explore": self.allows_virtual_table_explore, @@ -236,6 +245,7 @@ def data(self) -> Dict[str, Any]: "parameters": self.parameters, "disable_data_preview": self.disable_data_preview, "parameters_schema": self.parameters_schema, + "engine_information": self.engine_information, } @property @@ -248,17 +258,36 @@ def url_object(self) -> URL: @property def backend(self) -> str: - sqlalchemy_url = make_url_safe(self.sqlalchemy_uri_decrypted) - return sqlalchemy_url.get_backend_name() + return self.url_object.get_backend_name() + + @property + def driver(self) -> str: + return self.url_object.get_driver_name() + + @property + def masked_encrypted_extra(self) -> Optional[str]: + return self.db_engine_spec.mask_encrypted_extra(self.encrypted_extra) @property def parameters(self) -> Dict[str, Any]: - uri = make_url_safe(self.sqlalchemy_uri_decrypted) - encrypted_extra = self.get_encrypted_extra() + # Database parameters are a dictionary of values that are used to make up + # the sqlalchemy_uri + # When returning the parameters we should use the masked SQLAlchemy URI and the + # masked ``encrypted_extra`` to prevent exposing sensitive credentials. + masked_uri = make_url_safe(self.sqlalchemy_uri) + masked_encrypted_extra = self.masked_encrypted_extra + encrypted_config = {} + if masked_encrypted_extra is not None: + try: + encrypted_config = json.loads(masked_encrypted_extra) + except (TypeError, json.JSONDecodeError): + pass + try: # pylint: disable=useless-suppression parameters = self.db_engine_spec.get_parameters_from_uri( # type: ignore - uri, encrypted_extra=encrypted_extra + masked_uri, + encrypted_extra=encrypted_config, ) except Exception: # pylint: disable=broad-except parameters = {} @@ -301,6 +330,14 @@ def default_schemas(self) -> List[str]: def connect_args(self) -> Dict[str, Any]: return self.get_extra().get("engine_params", {}).get("connect_args", {}) + @property + def engine_information(self) -> Dict[str, Any]: + try: + engine_information = self.db_engine_spec.get_public_information() + except Exception: # pylint: disable=broad-except + engine_information = {} + return engine_information + @classmethod def get_password_masked_url_from_uri( # pylint: disable=invalid-name cls, uri: str @@ -312,7 +349,7 @@ def get_password_masked_url_from_uri( # pylint: disable=invalid-name def get_password_masked_url(cls, masked_url: URL) -> URL: url_copy = deepcopy(masked_url) if url_copy.password is not None: - url_copy.password = PASSWORD_MASK + url_copy = url_copy.set(password=PASSWORD_MASK) return url_copy def set_sqlalchemy_uri(self, uri: str) -> None: @@ -320,7 +357,7 @@ def set_sqlalchemy_uri(self, uri: str) -> None: if conn.password != PASSWORD_MASK and not custom_password_store: # do not over-write the password with the password mask self.password = conn.password - conn.password = PASSWORD_MASK if conn.password else None + conn = conn.set(password=PASSWORD_MASK if conn.password else None) self.sqlalchemy_uri = str(conn) # hides the password def get_effective_user(self, object_url: URL) -> Optional[str]: @@ -345,39 +382,59 @@ def get_sqla_engine_with_context( schema: Optional[str] = None, nullpool: bool = True, source: Optional[utils.QuerySource] = None, + override_ssh_tunnel: Optional["SSHTunnel"] = None, ) -> Engine: - try: - yield self.get_sqla_engine(schema=schema, nullpool=nullpool, source=source) - except Exception as ex: - raise self.db_engine_spec.get_dbapi_mapped_exception(ex) + from superset.databases.dao import ( # pylint: disable=import-outside-toplevel + DatabaseDAO, + ) - @memoized( - watch=( - "impersonate_user", - "sqlalchemy_uri_decrypted", - "extra", - "encrypted_extra", + sqlalchemy_uri = self.sqlalchemy_uri_decrypted + engine_context = nullcontext() + ssh_tunnel = override_ssh_tunnel or DatabaseDAO.get_ssh_tunnel( + database_id=self.id ) - ) - def get_sqla_engine( + + if ssh_tunnel: + # if ssh_tunnel is available build engine with information + engine_context = ssh_manager_factory.instance.create_tunnel( + ssh_tunnel=ssh_tunnel, + sqlalchemy_database_uri=self.sqlalchemy_uri_decrypted, + ) + + with engine_context as server_context: + if ssh_tunnel: + sqlalchemy_uri = ssh_manager_factory.instance.build_sqla_url( + sqlalchemy_uri, server_context + ) + yield self._get_sqla_engine( + schema=schema, + nullpool=nullpool, + source=source, + sqlalchemy_uri=sqlalchemy_uri, + ) + + def _get_sqla_engine( self, schema: Optional[str] = None, nullpool: bool = True, source: Optional[utils.QuerySource] = None, + sqlalchemy_uri: Optional[str] = None, ) -> Engine: extra = self.get_extra() - sqlalchemy_url = make_url_safe(self.sqlalchemy_uri_decrypted) - self.db_engine_spec.adjust_database_uri(sqlalchemy_url, schema) + sqlalchemy_url = make_url_safe( + sqlalchemy_uri if sqlalchemy_uri else self.sqlalchemy_uri_decrypted + ) + sqlalchemy_url = self.db_engine_spec.adjust_database_uri(sqlalchemy_url, schema) effective_username = self.get_effective_user(sqlalchemy_url) # If using MySQL or Presto for example, will set url.username # If using Hive, will not do anything yet since that relies on a # configuration parameter instead. - self.db_engine_spec.modify_url_for_impersonation( + sqlalchemy_url = self.db_engine_spec.get_url_for_impersonation( sqlalchemy_url, self.impersonate_user, effective_username ) masked_url = self.get_password_masked_url(sqlalchemy_url) - logger.debug("Database.get_sqla_engine(). Masked URL: %s", str(masked_url)) + logger.debug("Database._get_sqla_engine(). Masked URL: %s", str(masked_url)) params = extra.get("engine_params", {}) if nullpool: @@ -392,26 +449,38 @@ def get_sqla_engine( if connect_args: params["connect_args"] = connect_args - self.update_encrypted_extra_params(params) + self.update_params_from_encrypted_extra(params) if DB_CONNECTION_MUTATOR: if not source and request and request.referrer: if "/superset/dashboard/" in request.referrer: source = utils.QuerySource.DASHBOARD - elif "/superset/explore/" in request.referrer: + elif "/explore/" in request.referrer: source = utils.QuerySource.CHART - elif "/superset/sqllab/" in request.referrer: + elif "/superset/sqllab" in request.referrer: source = utils.QuerySource.SQL_LAB sqlalchemy_url, params = DB_CONNECTION_MUTATOR( sqlalchemy_url, params, effective_username, security_manager, source ) - try: return create_engine(sqlalchemy_url, **params) except Exception as ex: raise self.db_engine_spec.get_dbapi_mapped_exception(ex) + @contextmanager + def get_raw_connection( + self, + schema: Optional[str] = None, + nullpool: bool = True, + source: Optional[utils.QuerySource] = None, + ) -> Connection: + with self.get_sqla_engine_with_context( + schema=schema, nullpool=nullpool, source=source + ) as engine: + with closing(engine.raw_connection()) as conn: + yield conn + @property def quote_identifier(self) -> Callable[[str], str]: """Add quotes to potential identifiter expressions if needed""" @@ -427,7 +496,10 @@ def get_df( # pylint: disable=too-many-locals mutator: Optional[Callable[[pd.DataFrame], None]] = None, ) -> pd.DataFrame: sqls = self.db_engine_spec.parse_sql(sql) - engine = self.get_sqla_engine(schema) + engine = self._get_sqla_engine(schema) + username = utils.get_username() + mutate_after_split = config["MUTATE_AFTER_SPLIT"] + sql_query_mutator = config["SQL_QUERY_MUTATOR"] def needs_conversion(df_series: pd.Series) -> bool: return ( @@ -447,15 +519,32 @@ def _log_query(sql: str) -> None: security_manager, ) - with closing(engine.raw_connection()) as conn: + with self.get_raw_connection(schema=schema) as conn: cursor = conn.cursor() for sql_ in sqls[:-1]: + if mutate_after_split: + sql_ = sql_query_mutator( + sql_, + user_name=username, + security_manager=security_manager, + database=None, + ) _log_query(sql_) self.db_engine_spec.execute(cursor, sql_) cursor.fetchall() - _log_query(sqls[-1]) - self.db_engine_spec.execute(cursor, sqls[-1]) + if mutate_after_split: + last_sql = sql_query_mutator( + sqls[-1], + user_name=username, + security_manager=security_manager, + database=None, + ) + _log_query(last_sql) + self.db_engine_spec.execute(cursor, last_sql) + else: + _log_query(sqls[-1]) + self.db_engine_spec.execute(cursor, sqls[-1]) data = self.db_engine_spec.fetch_data(cursor) result_set = SupersetResultSet( @@ -472,7 +561,7 @@ def _log_query(sql: str) -> None: return df def compile_sqla_query(self, qry: Select, schema: Optional[str] = None) -> str: - engine = self.get_sqla_engine(schema=schema) + engine = self._get_sqla_engine(schema=schema) sql = str(qry.compile(engine, compile_kwargs={"literal_binds": True})) @@ -493,7 +582,7 @@ def select_star( # pylint: disable=too-many-arguments cols: Optional[List[Dict[str, Any]]] = None, ) -> str: """Generates a ``select *`` statement in the proper dialect""" - eng = self.get_sqla_engine(schema=schema, source=utils.QuerySource.SQL_LAB) + eng = self._get_sqla_engine(schema=schema, source=utils.QuerySource.SQL_LAB) return self.db_engine_spec.select_star( self, table_name, @@ -518,52 +607,12 @@ def safe_sqlalchemy_uri(self) -> str: @property def inspector(self) -> Inspector: - engine = self.get_sqla_engine() + engine = self._get_sqla_engine() return sqla.inspect(engine) - @cache_util.memoized_func( - key="db:{self.id}:schema:None:table_list", - cache=cache_manager.data_cache, - ) - def get_all_table_names_in_database( # pylint: disable=unused-argument - self, - cache: bool = False, - cache_timeout: Optional[bool] = None, - force: bool = False, - ) -> List[Tuple[str, str]]: - """Parameters need to be passed as keyword arguments.""" - if not self.allow_multi_schema_metadata_fetch: - return [] - return [ - (datasource_name.table, datasource_name.schema) - for datasource_name in self.db_engine_spec.get_all_datasource_names( - self, "table" - ) - ] - - @cache_util.memoized_func( - key="db:{self.id}:schema:None:view_list", - cache=cache_manager.data_cache, - ) - def get_all_view_names_in_database( # pylint: disable=unused-argument - self, - cache: bool = False, - cache_timeout: Optional[bool] = None, - force: bool = False, - ) -> List[Tuple[str, str]]: - """Parameters need to be passed as keyword arguments.""" - if not self.allow_multi_schema_metadata_fetch: - return [] - return [ - (datasource_name.table, datasource_name.schema) - for datasource_name in self.db_engine_spec.get_all_datasource_names( - self, "view" - ) - ] - @cache_util.memoized_func( key="db:{self.id}:schema:{schema}:table_list", - cache=cache_manager.data_cache, + cache=cache_manager.cache, ) def get_all_table_names_in_schema( # pylint: disable=unused-argument self, @@ -571,7 +620,7 @@ def get_all_table_names_in_schema( # pylint: disable=unused-argument cache: bool = False, cache_timeout: Optional[int] = None, force: bool = False, - ) -> List[Tuple[str, str]]: + ) -> Set[Tuple[str, str]]: """Parameters need to be passed as keyword arguments. For unused parameters, they are referenced in @@ -581,20 +630,25 @@ def get_all_table_names_in_schema( # pylint: disable=unused-argument :param cache: whether cache is enabled for the function :param cache_timeout: timeout in seconds for the cache :param force: whether to force refresh the cache - :return: list of tables + :return: The table/schema pairs """ try: - tables = self.db_engine_spec.get_table_names( - database=self, inspector=self.inspector, schema=schema - ) - return [(table, schema) for table in tables] - except Exception: # pylint: disable=broad-except - logger.warning("Get all table names in schema failed", exc_info=True) - return [] + with self.get_inspector_with_context() as inspector: + tables = { + (table, schema) + for table in self.db_engine_spec.get_table_names( + database=self, + inspector=inspector, + schema=schema, + ) + } + return tables + except Exception as ex: + raise self.db_engine_spec.get_dbapi_mapped_exception(ex) @cache_util.memoized_func( key="db:{self.id}:schema:{schema}:view_list", - cache=cache_manager.data_cache, + cache=cache_manager.cache, ) def get_all_view_names_in_schema( # pylint: disable=unused-argument self, @@ -602,7 +656,7 @@ def get_all_view_names_in_schema( # pylint: disable=unused-argument cache: bool = False, cache_timeout: Optional[int] = None, force: bool = False, - ) -> List[Tuple[str, str]]: + ) -> Set[Tuple[str, str]]: """Parameters need to be passed as keyword arguments. For unused parameters, they are referenced in @@ -612,26 +666,40 @@ def get_all_view_names_in_schema( # pylint: disable=unused-argument :param cache: whether cache is enabled for the function :param cache_timeout: timeout in seconds for the cache :param force: whether to force refresh the cache - :return: list of views + :return: set of views """ try: - views = self.db_engine_spec.get_view_names( - database=self, inspector=self.inspector, schema=schema - ) - return [(view, schema) for view in views] - except Exception: # pylint: disable=broad-except - logger.warning("Get all view names failed", exc_info=True) - return [] + with self.get_inspector_with_context() as inspector: + return { + (view, schema) + for view in self.db_engine_spec.get_view_names( + database=self, + inspector=inspector, + schema=schema, + ) + } + except Exception as ex: + raise self.db_engine_spec.get_dbapi_mapped_exception(ex) + + @contextmanager + def get_inspector_with_context( + self, ssh_tunnel: Optional["SSHTunnel"] = None + ) -> Inspector: + with self.get_sqla_engine_with_context( + override_ssh_tunnel=ssh_tunnel + ) as engine: + yield sqla.inspect(engine) @cache_util.memoized_func( key="db:{self.id}:schema_list", - cache=cache_manager.data_cache, + cache=cache_manager.cache, ) def get_all_schema_names( # pylint: disable=unused-argument self, cache: bool = False, cache_timeout: Optional[int] = None, force: bool = False, + ssh_tunnel: Optional["SSHTunnel"] = None, ) -> List[str]: """Parameters need to be passed as keyword arguments. @@ -643,19 +711,28 @@ def get_all_schema_names( # pylint: disable=unused-argument :param force: whether to force refresh the cache :return: schema list """ - return self.db_engine_spec.get_schema_names(self.inspector) + try: + with self.get_inspector_with_context(ssh_tunnel=ssh_tunnel) as inspector: + return self.db_engine_spec.get_schema_names(inspector) + except Exception as ex: + raise self.db_engine_spec.get_dbapi_mapped_exception(ex) from ex @property def db_engine_spec(self) -> Type[db_engine_specs.BaseEngineSpec]: - return self.get_db_engine_spec_for_backend(self.backend) + url = make_url_safe(self.sqlalchemy_uri_decrypted) + return self.get_db_engine_spec(url) @classmethod @memoized - def get_db_engine_spec_for_backend( - cls, backend: str - ) -> Type[db_engine_specs.BaseEngineSpec]: - engines = db_engine_specs.get_engine_specs() - return engines.get(backend, db_engine_specs.BaseEngineSpec) + def get_db_engine_spec(cls, url: URL) -> Type[db_engine_specs.BaseEngineSpec]: + backend = url.get_backend_name() + try: + driver = url.get_driver_name() + except NoSuchModuleError: + # can't load the driver, fallback for backwards compatibility + driver = None + + return db_engine_specs.get_engine_spec(backend, driver) def grains(self) -> Tuple[TimeGrain, ...]: """Defines time granularity database-specific expressions. @@ -681,9 +758,6 @@ def get_encrypted_extra(self) -> Dict[str, Any]: raise ex return encrypted_extra - def update_encrypted_extra_params(self, params: Dict[str, Any]) -> None: - self.db_engine_spec.update_encrypted_extra_params(self, params) - def update_params_from_encrypted_extra( # pylint: disable=invalid-name self, params: Dict[str, Any] ) -> None: @@ -692,42 +766,61 @@ def update_params_from_encrypted_extra( # pylint: disable=invalid-name def get_table(self, table_name: str, schema: Optional[str] = None) -> Table: extra = self.get_extra() meta = MetaData(**extra.get("metadata_params", {})) - return Table( - table_name, - meta, - schema=schema or None, - autoload=True, - autoload_with=self.get_sqla_engine(), - ) + with self.get_sqla_engine_with_context() as engine: + return Table( + table_name, + meta, + schema=schema or None, + autoload=True, + autoload_with=engine, + ) def get_table_comment( self, table_name: str, schema: Optional[str] = None ) -> Optional[str]: - return self.db_engine_spec.get_table_comment(self.inspector, table_name, schema) + with self.get_inspector_with_context() as inspector: + return self.db_engine_spec.get_table_comment(inspector, table_name, schema) def get_columns( self, table_name: str, schema: Optional[str] = None ) -> List[Dict[str, Any]]: - return self.db_engine_spec.get_columns(self.inspector, table_name, schema) + with self.get_inspector_with_context() as inspector: + return self.db_engine_spec.get_columns(inspector, table_name, schema) + + def get_metrics( + self, + table_name: str, + schema: Optional[str] = None, + ) -> List[MetricType]: + with self.get_inspector_with_context() as inspector: + return self.db_engine_spec.get_metrics(self, inspector, table_name, schema) def get_indexes( self, table_name: str, schema: Optional[str] = None ) -> List[Dict[str, Any]]: - indexes = self.inspector.get_indexes(table_name, schema) - return self.db_engine_spec.normalize_indexes(indexes) + with self.get_inspector_with_context() as inspector: + indexes = inspector.get_indexes(table_name, schema) + return self.db_engine_spec.normalize_indexes(indexes) def get_pk_constraint( self, table_name: str, schema: Optional[str] = None ) -> Dict[str, Any]: - pk_constraint = self.inspector.get_pk_constraint(table_name, schema) or {} - return { - key: utils.base_json_conv(value) for key, value in pk_constraint.items() - } + with self.get_inspector_with_context() as inspector: + pk_constraint = inspector.get_pk_constraint(table_name, schema) or {} + + def _convert(value: Any) -> Any: + try: + return utils.base_json_conv(value) + except TypeError: + return None + + return {key: _convert(value) for key, value in pk_constraint.items()} def get_foreign_keys( self, table_name: str, schema: Optional[str] = None ) -> List[Dict[str, Any]]: - return self.inspector.get_foreign_keys(table_name, schema) + with self.get_inspector_with_context() as inspector: + return inspector.get_foreign_keys(table_name, schema) def get_schema_access_for_file_upload( # pylint: disable=invalid-name self, @@ -753,9 +846,9 @@ def sqlalchemy_uri_decrypted(self) -> str: # (so users see 500 less often) return "dialect://invalid_uri" if custom_password_store: - conn.password = custom_password_store(conn) + conn = conn.set(password=custom_password_store(conn)) else: - conn.password = self.password + conn = conn.set(password=self.password) return str(conn) @property @@ -776,12 +869,12 @@ def get_perm(self) -> str: return self.perm # type: ignore def has_table(self, table: Table) -> bool: - engine = self.get_sqla_engine() - return engine.has_table(table.table_name, table.schema or None) + with self.get_sqla_engine_with_context() as engine: + return engine.has_table(table.table_name, table.schema or None) def has_table_by_name(self, table_name: str, schema: Optional[str] = None) -> bool: - engine = self.get_sqla_engine() - return engine.has_table(table_name, schema) + with self.get_sqla_engine_with_context() as engine: + return engine.has_table(table_name, schema) @classmethod def _has_view( @@ -799,7 +892,7 @@ def _has_view( return view_name in view_names def has_view(self, view_name: str, schema: Optional[str] = None) -> bool: - engine = self.get_sqla_engine() + engine = self._get_sqla_engine() return engine.run_callable(self._has_view, engine.dialect, view_name, schema) def has_view_by_name(self, view_name: str, schema: Optional[str] = None) -> bool: @@ -811,8 +904,9 @@ def get_dialect(self) -> Dialect: return sqla_url.get_dialect()() -sqla.event.listen(Database, "after_insert", security_manager.set_perm) -sqla.event.listen(Database, "after_update", security_manager.set_perm) +sqla.event.listen(Database, "after_insert", security_manager.database_after_insert) +sqla.event.listen(Database, "after_update", security_manager.database_after_update) +sqla.event.listen(Database, "after_delete", security_manager.database_after_delete) class Log(Model): # pylint: disable=too-few-public-methods @@ -848,9 +942,3 @@ class FavStar(Model): # pylint: disable=too-few-public-methods class_name = Column(String(50)) obj_id = Column(Integer) dttm = Column(DateTime, default=datetime.utcnow) - - -# events for updating tags -if is_feature_enabled("TAGGING_SYSTEM"): - sqla.event.listen(FavStar, "after_insert", FavStarUpdater.after_insert) - sqla.event.listen(FavStar, "after_delete", FavStarUpdater.after_delete) diff --git a/superset/models/dashboard.py b/superset/models/dashboard.py index f2d53e1ff5e6..0e0bf56f585d 100644 --- a/superset/models/dashboard.py +++ b/superset/models/dashboard.py @@ -20,10 +20,9 @@ import logging from collections import defaultdict from functools import partial -from typing import Any, Callable, Dict, List, Set, Tuple, Type, Union +from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Type, Union import sqlalchemy as sqla -from flask import g from flask_appbuilder import Model from flask_appbuilder.models.decorators import renders from flask_appbuilder.security.sqla.models import User @@ -46,21 +45,21 @@ from sqlalchemy.sql import join, select from sqlalchemy.sql.elements import BinaryExpression -from superset import app, ConnectorRegistry, db, is_feature_enabled, security_manager -from superset.common.request_contexed_based import is_user_admin +from superset import app, db, is_feature_enabled, security_manager from superset.connectors.base.models import BaseDatasource -from superset.connectors.sqla.models import SqlMetric, TableColumn +from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn +from superset.datasource.dao import DatasourceDAO from superset.extensions import cache_manager from superset.models.filter_set import FilterSet from superset.models.helpers import AuditMixinNullable, ImportExportMixin from superset.models.slice import Slice -from superset.models.tags import DashboardUpdater from superset.models.user_attributes import UserAttribute from superset.tasks.thumbnails import cache_dashboard_thumbnail +from superset.tasks.utils import get_current_user +from superset.thumbnails.digest import get_dashboard_digest from superset.utils import core as utils +from superset.utils.core import get_user_id from superset.utils.decorators import debounce -from superset.utils.hashing import md5_sha_from_str -from superset.utils.urls import get_url_path metadata = Model.metadata # pylint: disable=no-member config = app.config @@ -178,6 +177,11 @@ def __repr__(self) -> str: def url(self) -> str: return f"/superset/dashboard/{self.slug or self.id}/" + @staticmethod + def get_url(id_: int, slug: Optional[str] = None) -> str: + # To be able to generate URL's without instanciating a Dashboard object + return f"/superset/dashboard/{slug or id_}/" + @property def datasources(self) -> Set[BaseDatasource]: # Verbose but efficient database enumeration of dashboard datasources. @@ -202,15 +206,14 @@ def filter_sets(self) -> Dict[int, FilterSet]: @property def filter_sets_lst(self) -> Dict[int, FilterSet]: - if is_user_admin(): + if security_manager.is_admin(): return self._filter_sets - current_user = g.user.id filter_sets_by_owner_type: Dict[str, List[Any]] = {"Dashboard": [], "User": []} for fs in self._filter_sets: filter_sets_by_owner_type[fs.owner_type].append(fs) user_filter_sets = list( filter( - lambda filter_set: filter_set.owner_id == current_user, + lambda filter_set: filter_set.owner_id == get_user_id(), filter_sets_by_owner_type["User"], ) ) @@ -226,8 +229,9 @@ def charts(self) -> List[str]: @property def sqla_metadata(self) -> None: # pylint: disable=no-member - meta = MetaData(bind=self.get_sqla_engine()) - meta.reflect() + with self.get_sqla_engine_with_context() as engine: + meta = MetaData(bind=engine) + meta.reflect() @property def status(self) -> utils.DashboardStatus: @@ -242,11 +246,7 @@ def dashboard_link(self) -> Markup: @property def digest(self) -> str: - """ - Returns a MD5 HEX digest that makes this dashboard unique - """ - unique_string = f"{self.position_json}.{self.css}.{self.json_metadata}" - return md5_sha_from_str(unique_string) + return get_dashboard_digest(self) @property def thumbnail_url(self) -> str: @@ -330,8 +330,11 @@ def position(self) -> Dict[str, Any]: return {} def update_thumbnail(self) -> None: - url = get_url_path("Superset.dashboard", dashboard_id_or_slug=self.id) - cache_dashboard_thumbnail.delay(url, self.digest, force=True) + cache_dashboard_thumbnail.delay( + current_user=get_current_user(), + dashboard_id=self.id, + force=True, + ) @debounce(0.1) def clear_cache(self) -> None: @@ -407,27 +410,24 @@ def export_dashboards( # pylint: disable=too-many-locals id_ = target.get("datasetId") if id_ is None: continue - datasource = ConnectorRegistry.get_datasource_by_id(session, id_) + datasource = DatasourceDAO.get_datasource( + session, utils.DatasourceType.TABLE, id_ + ) datasource_ids.add((datasource.id, datasource.type)) copied_dashboard.alter_params(remote_id=dashboard_id) copied_dashboards.append(copied_dashboard) eager_datasources = [] - for datasource_id, datasource_type in datasource_ids: - eager_datasource = ConnectorRegistry.get_eager_datasource( - db.session, datasource_type, datasource_id + for datasource_id, _ in datasource_ids: + eager_datasource = SqlaTable.get_eager_sqlatable_datasource( + db.session, datasource_id ) copied_datasource = eager_datasource.copy() copied_datasource.alter_params( remote_id=eager_datasource.id, database_name=eager_datasource.database.name, ) - datasource_class = copied_datasource.__class__ - for field_name in datasource_class.export_children: - field_val = getattr(eager_datasource, field_name).copy() - # set children without creating ORM relations - copied_datasource.__dict__[field_name] = field_val eager_datasources.append(copied_datasource) return json.dumps( @@ -437,18 +437,14 @@ def export_dashboards( # pylint: disable=too-many-locals ) @classmethod - def get(cls, id_or_slug: str) -> Dashboard: - session = db.session() - qry = session.query(Dashboard).filter(id_or_slug_filter(id_or_slug)) + def get(cls, id_or_slug: Union[str, int]) -> Dashboard: + qry = db.session.query(Dashboard).filter(id_or_slug_filter(id_or_slug)) return qry.one_or_none() - def is_actor_owner(self) -> bool: - if g.user is None or g.user.is_anonymous or not g.user.is_authenticated: - return False - return g.user.id in set(map(lambda user: user.id, self.owners)) - -def id_or_slug_filter(id_or_slug: str) -> BinaryExpression: +def id_or_slug_filter(id_or_slug: Union[int, str]) -> BinaryExpression: + if isinstance(id_or_slug, int): + return Dashboard.id == id_or_slug if id_or_slug.isdigit(): return Dashboard.id == int(id_or_slug) return Dashboard.slug == id_or_slug @@ -456,12 +452,6 @@ def id_or_slug_filter(id_or_slug: str) -> BinaryExpression: OnDashboardChange = Callable[[Mapper, Connection, Dashboard], Any] -# events for updating tags -if is_feature_enabled("TAGGING_SYSTEM"): - sqla.event.listen(Dashboard, "after_insert", DashboardUpdater.after_insert) - sqla.event.listen(Dashboard, "after_update", DashboardUpdater.after_update) - sqla.event.listen(Dashboard, "after_delete", DashboardUpdater.after_delete) - if is_feature_enabled("THUMBNAILS_SQLA_LISTENERS"): update_thumbnail: OnDashboardChange = lambda _, __, dash: dash.update_thumbnail() sqla.event.listen(Dashboard, "after_insert", update_thumbnail) diff --git a/superset/models/datasource_access_request.py b/superset/models/datasource_access_request.py index fa3b9d67113d..60bfe0823828 100644 --- a/superset/models/datasource_access_request.py +++ b/superset/models/datasource_access_request.py @@ -21,7 +21,6 @@ from sqlalchemy import Column, Integer, String from superset import app, db, security_manager -from superset.connectors.connector_registry import ConnectorRegistry from superset.models.helpers import AuditMixinNullable from superset.utils.memoized import memoized @@ -44,7 +43,10 @@ class DatasourceAccessRequest(Model, AuditMixinNullable): @property def cls_model(self) -> Type["BaseDatasource"]: - return ConnectorRegistry.sources[self.datasource_type] + # pylint: disable=import-outside-toplevel + from superset.datasource.dao import DatasourceDAO + + return DatasourceDAO.sources[self.datasource_type] @property def username(self) -> Markup: diff --git a/superset/models/filter_set.py b/superset/models/filter_set.py index 2d3b218793dc..4bbef264900d 100644 --- a/superset/models/filter_set.py +++ b/superset/models/filter_set.py @@ -55,8 +55,9 @@ def url(self) -> str: @property def sqla_metadata(self) -> None: # pylint: disable=no-member - meta = MetaData(bind=self.get_sqla_engine()) - meta.reflect() + with self.get_sqla_engine_with_context() as engine: + meta = MetaData(bind=engine) + meta.reflect() @property def changed_by_name(self) -> str: diff --git a/superset/models/helpers.py b/superset/models/helpers.py index 3b4e99159f0b..15b7a420a079 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -15,34 +15,124 @@ # specific language governing permissions and limitations # under the License. """a collection of model-related helper classes and functions""" +# pylint: disable=too-many-lines import json import logging import re import uuid from datetime import datetime, timedelta from json.decoder import JSONDecodeError -from typing import Any, Dict, List, Optional, Set, Union - +from typing import ( + Any, + cast, + Dict, + List, + Mapping, + NamedTuple, + Optional, + Set, + Text, + Tuple, + Type, + TYPE_CHECKING, + Union, +) + +import dateutil.parser import humanize +import numpy as np import pandas as pd import pytz import sqlalchemy as sa +import sqlparse import yaml from flask import escape, g, Markup from flask_appbuilder import Model from flask_appbuilder.models.decorators import renders from flask_appbuilder.models.mixins import AuditMixin from flask_appbuilder.security.sqla.models import User -from sqlalchemy import and_, or_, UniqueConstraint +from flask_babel import lazy_gettext as _ +from jinja2.exceptions import TemplateError +from sqlalchemy import and_, Column, or_, UniqueConstraint from sqlalchemy.ext.declarative import declared_attr -from sqlalchemy.orm import Mapper, Session +from sqlalchemy.orm import Mapper, Session, validates from sqlalchemy.orm.exc import MultipleResultsFound +from sqlalchemy.sql.elements import ColumnElement, literal_column, TextClause +from sqlalchemy.sql.expression import Label, Select, TextAsFrom +from sqlalchemy.sql.selectable import Alias, TableClause from sqlalchemy_utils import UUIDType +from superset import app, is_feature_enabled, security_manager +from superset.advanced_data_type.types import AdvancedDataTypeResponse from superset.common.db_query_status import QueryStatus - +from superset.common.utils.time_range_utils import get_since_until_from_time_range +from superset.constants import EMPTY_STRING, NULL_STRING +from superset.db_engine_specs.base import TimestampExpression +from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from superset.exceptions import ( + AdvancedDataTypeResponseError, + QueryClauseValidationException, + QueryObjectValidationError, + SupersetSecurityException, +) +from superset.extensions import feature_flag_manager +from superset.jinja_context import BaseTemplateProcessor +from superset.sql_parse import has_table_query, insert_rls, ParsedQuery, sanitize_clause +from superset.superset_typing import ( + AdhocMetric, + FilterValue, + FilterValues, + Metric, + OrderBy, + QueryObjectDict, +) +from superset.utils import core as utils +from superset.utils.core import get_user_id + +if TYPE_CHECKING: + from superset.connectors.sqla.models import SqlMetric, TableColumn + from superset.db_engine_specs import BaseEngineSpec + from superset.models.core import Database + + +config = app.config logger = logging.getLogger(__name__) +VIRTUAL_TABLE_ALIAS = "virtual_table" +ADVANCED_DATA_TYPES = config["ADVANCED_DATA_TYPES"] + + +def validate_adhoc_subquery( + sql: str, + database_id: int, + default_schema: str, +) -> str: + """ + Check if adhoc SQL contains sub-queries or nested sub-queries with table. + + If sub-queries are allowed, the adhoc SQL is modified to insert any applicable RLS + predicates to it. + + :param sql: adhoc sql expression + :raise SupersetSecurityException if sql contains sub-queries or + nested sub-queries with table + """ + statements = [] + for statement in sqlparse.parse(sql): + if has_table_query(statement): + if not is_feature_enabled("ALLOW_ADHOC_SUBQUERY"): + raise SupersetSecurityException( + SupersetError( + error_type=SupersetErrorType.ADHOC_SUBQUERY_NOT_ALLOWED_ERROR, + message=_("Custom SQL fields cannot contain sub-queries."), + level=ErrorLevel.ERROR, + ) + ) + statement = insert_rls(statement, database_id, default_schema) + statements.append(statement) + + return ";\n".join(str(statement) for statement in statements) + def json_to_dict(json_str: str) -> Dict[Any, Any]: if json_str: @@ -236,7 +326,10 @@ def import_from_dict( # Recursively create children if recursive: for child in cls.export_children: - child_class = cls.__mapper__.relationships[child].argument.class_ + argument = cls.__mapper__.relationships[child].argument + child_class = ( + argument.class_ if hasattr(argument, "class_") else argument + ) added = [] for c_obj in new_children.get(child, []): added.append( @@ -384,7 +477,7 @@ def created_by_fk(self) -> sa.Column: return sa.Column( sa.Integer, sa.ForeignKey("ab_user.id"), - default=self.get_user_id, + default=get_user_id, nullable=True, ) @@ -393,8 +486,8 @@ def changed_by_fk(self) -> sa.Column: return sa.Column( sa.Integer, sa.ForeignKey("ab_user.id"), - default=self.get_user_id, - onupdate=self.get_user_id, + default=get_user_id, + onupdate=get_user_id, nullable=True, ) @@ -477,14 +570,15 @@ class ExtraJSONMixin: @property def extra(self) -> Dict[str, Any]: try: - return json.loads(self.extra_json) if self.extra_json else {} + return json.loads(self.extra_json or "{}") or {} except (TypeError, JSONDecodeError) as exc: logger.error( "Unable to load an extra json: %r. Leaving empty.", exc, exc_info=True ) return {} - def set_extra_json(self, extras: Dict[str, Any]) -> None: + @extra.setter + def extra(self, extras: Dict[str, Any]) -> None: self.extra_json = json.dumps(extras) def set_extra_json_key(self, key: str, value: Any) -> None: @@ -492,6 +586,16 @@ def set_extra_json_key(self, key: str, value: Any) -> None: extra[key] = value self.extra_json = json.dumps(extra) + @validates("extra_json") + def ensure_extra_json_is_not_none( # pylint: disable=no-self-use + self, + _: str, + value: Optional[Dict[str, Any]], + ) -> Any: + if value is None: + return "{}" + return value + class CertificationMixin: """Mixin to add extra certification fields""" @@ -543,3 +647,1318 @@ def clone_model( data.update(kwargs) return target.__class__(**data) + + +# todo(hugh): centralize where this code lives +class QueryStringExtended(NamedTuple): + applied_template_filters: Optional[List[str]] + labels_expected: List[str] + prequeries: List[str] + sql: str + + +class SqlaQuery(NamedTuple): + applied_template_filters: List[str] + cte: Optional[str] + extra_cache_keys: List[Any] + labels_expected: List[str] + prequeries: List[str] + sqla_query: Select + + +class ExploreMixin: # pylint: disable=too-many-public-methods + """ + Allows any flask_appbuilder.Model (Query, Table, etc.) + to be used to power a chart inside /explore + """ + + sqla_aggregations = { + "COUNT_DISTINCT": lambda column_name: sa.func.COUNT(sa.distinct(column_name)), + "COUNT": sa.func.COUNT, + "SUM": sa.func.SUM, + "AVG": sa.func.AVG, + "MIN": sa.func.MIN, + "MAX": sa.func.MAX, + } + + @property + def query(self) -> str: + raise NotImplementedError() + + @property + def database_id(self) -> int: + raise NotImplementedError() + + @property + def owners_data(self) -> List[Any]: + raise NotImplementedError() + + @property + def metrics(self) -> List[Any]: + raise NotImplementedError() + + @property + def uid(self) -> str: + raise NotImplementedError() + + @property + def is_rls_supported(self) -> bool: + raise NotImplementedError() + + @property + def cache_timeout(self) -> int: + raise NotImplementedError() + + @property + def column_names(self) -> List[str]: + raise NotImplementedError() + + @property + def offset(self) -> int: + raise NotImplementedError() + + @property + def main_dttm_col(self) -> Optional[str]: + raise NotImplementedError() + + @property + def dttm_cols(self) -> List[str]: + raise NotImplementedError() + + @property + def db_engine_spec(self) -> Type["BaseEngineSpec"]: + raise NotImplementedError() + + @property + def database(self) -> Type["Database"]: + raise NotImplementedError() + + @property + def schema(self) -> str: + raise NotImplementedError() + + @property + def sql(self) -> str: + raise NotImplementedError() + + @property + def columns(self) -> List[Any]: + raise NotImplementedError() + + @property + def get_fetch_values_predicate(self) -> List[Any]: + raise NotImplementedError() + + @staticmethod + def get_extra_cache_keys(query_obj: Dict[str, Any]) -> List[str]: + raise NotImplementedError() + + def get_template_processor(self, **kwargs: Any) -> BaseTemplateProcessor: + raise NotImplementedError() + + def _process_sql_expression( # pylint: disable=no-self-use + self, + expression: Optional[str], + database_id: int, + schema: str, + template_processor: Optional[BaseTemplateProcessor], + ) -> Optional[str]: + if template_processor and expression: + expression = template_processor.process_template(expression) + if expression: + expression = validate_adhoc_subquery( + expression, + database_id, + schema, + ) + try: + expression = sanitize_clause(expression) + except QueryClauseValidationException as ex: + raise QueryObjectValidationError(ex.message) from ex + return expression + + def make_sqla_column_compatible( + self, sqla_col: ColumnElement, label: Optional[str] = None + ) -> ColumnElement: + """Takes a sqlalchemy column object and adds label info if supported by engine. + :param sqla_col: sqlalchemy column instance + :param label: alias/label that column is expected to have + :return: either a sql alchemy column or label instance if supported by engine + """ + label_expected = label or sqla_col.name + db_engine_spec = self.db_engine_spec + # add quotes to tables + if db_engine_spec.allows_alias_in_select: + label = db_engine_spec.make_label_compatible(label_expected) + sqla_col = sqla_col.label(label) + sqla_col.key = label_expected + return sqla_col + + def mutate_query_from_config(self, sql: str) -> str: + """Apply config's SQL_QUERY_MUTATOR + + Typically adds comments to the query with context""" + sql_query_mutator = config["SQL_QUERY_MUTATOR"] + if sql_query_mutator: + sql = sql_query_mutator( + sql, + user_name=utils.get_username(), # TODO(john-bodley): Deprecate in 3.0. + security_manager=security_manager, + database=self.database, + ) + return sql + + @staticmethod + def _apply_cte(sql: str, cte: Optional[str]) -> str: + """ + Append a CTE before the SELECT statement if defined + + :param sql: SELECT statement + :param cte: CTE statement + :return: + """ + if cte: + sql = f"{cte}\n{sql}" + return sql + + @staticmethod + def validate_adhoc_subquery( + sql: str, + database_id: int, + default_schema: str, + ) -> str: + """ + Check if adhoc SQL contains sub-queries or nested sub-queries with table. + + If sub-queries are allowed, the adhoc SQL is modified to insert any applicable RLS + predicates to it. + + :param sql: adhoc sql expression + :raise SupersetSecurityException if sql contains sub-queries or + nested sub-queries with table + """ + + statements = [] + for statement in sqlparse.parse(sql): + if has_table_query(statement): + if not is_feature_enabled("ALLOW_ADHOC_SUBQUERY"): + raise SupersetSecurityException( + SupersetError( + error_type=SupersetErrorType.ADHOC_SUBQUERY_NOT_ALLOWED_ERROR, + message=_("Custom SQL fields cannot contain sub-queries."), + level=ErrorLevel.ERROR, + ) + ) + statement = insert_rls(statement, database_id, default_schema) + statements.append(statement) + + return ";\n".join(str(statement) for statement in statements) + + def get_query_str_extended(self, query_obj: QueryObjectDict) -> QueryStringExtended: + sqlaq = self.get_sqla_query(**query_obj) + sql = self.database.compile_sqla_query(sqlaq.sqla_query) # type: ignore + sql = self._apply_cte(sql, sqlaq.cte) + sql = sqlparse.format(sql, reindent=True) + sql = self.mutate_query_from_config(sql) + return QueryStringExtended( + applied_template_filters=sqlaq.applied_template_filters, + labels_expected=sqlaq.labels_expected, + prequeries=sqlaq.prequeries, + sql=sql, + ) + + def _normalize_prequery_result_type( + self, + row: pd.Series, + dimension: str, + columns_by_name: Dict[str, "TableColumn"], + ) -> Union[str, int, float, bool, Text]: + """ + Convert a prequery result type to its equivalent Python type. + + Some databases like Druid will return timestamps as strings, but do not perform + automatic casting when comparing these strings to a timestamp. For cases like + this we convert the value via the appropriate SQL transform. + + :param row: A prequery record + :param dimension: The dimension name + :param columns_by_name: The mapping of columns by name + :return: equivalent primitive python type + """ + + value = row[dimension] + + if isinstance(value, np.generic): + value = value.item() + + column_ = columns_by_name[dimension] + db_extra: Dict[str, Any] = self.database.get_extra() # type: ignore + + if isinstance(column_, dict): + if ( + column_.get("type") + and column_.get("is_temporal") + and isinstance(value, str) + ): + sql = self.db_engine_spec.convert_dttm( + column_.get("type"), dateutil.parser.parse(value), db_extra=None + ) + + if sql: + value = self.db_engine_spec.get_text_clause(sql) + else: + if column_.type and column_.is_temporal and isinstance(value, str): + sql = self.db_engine_spec.convert_dttm( + column_.type, dateutil.parser.parse(value), db_extra=db_extra + ) + + if sql: + value = self.text(sql) + return value + + def make_orderby_compatible( + self, select_exprs: List[ColumnElement], orderby_exprs: List[ColumnElement] + ) -> None: + """ + If needed, make sure aliases for selected columns are not used in + `ORDER BY`. + + In some databases (e.g. Presto), `ORDER BY` clause is not able to + automatically pick the source column if a `SELECT` clause alias is named + the same as a source column. In this case, we update the SELECT alias to + another name to avoid the conflict. + """ + if self.db_engine_spec.allows_alias_to_source_column: + return + + def is_alias_used_in_orderby(col: ColumnElement) -> bool: + if not isinstance(col, Label): + return False + regexp = re.compile(f"\\(.*\\b{re.escape(col.name)}\\b.*\\)", re.IGNORECASE) + return any(regexp.search(str(x)) for x in orderby_exprs) + + # Iterate through selected columns, if column alias appears in orderby + # use another `alias`. The final output columns will still use the + # original names, because they are updated by `labels_expected` after + # querying. + for col in select_exprs: + if is_alias_used_in_orderby(col): + col.name = f"{col.name}__" + + def exc_query(self, qry: Any) -> QueryResult: + qry_start_dttm = datetime.now() + query_str_ext = self.get_query_str_extended(qry) + sql = query_str_ext.sql + status = QueryStatus.SUCCESS + errors = None + error_message = None + + def assign_column_label(df: pd.DataFrame) -> Optional[pd.DataFrame]: + """ + Some engines change the case or generate bespoke column names, either by + default or due to lack of support for aliasing. This function ensures that + the column names in the DataFrame correspond to what is expected by + the viz components. + Sometimes a query may also contain only order by columns that are not used + as metrics or groupby columns, but need to present in the SQL `select`, + filtering by `labels_expected` make sure we only return columns users want. + :param df: Original DataFrame returned by the engine + :return: Mutated DataFrame + """ + labels_expected = query_str_ext.labels_expected + if df is not None and not df.empty: + if len(df.columns) < len(labels_expected): + raise QueryObjectValidationError( + _("Db engine did not return all queried columns") + ) + if len(df.columns) > len(labels_expected): + df = df.iloc[:, 0 : len(labels_expected)] + df.columns = labels_expected + return df + + try: + df = self.database.get_df( + sql, self.schema, mutator=assign_column_label # type: ignore + ) + except Exception as ex: # pylint: disable=broad-except + df = pd.DataFrame() + status = QueryStatus.FAILED + logger.warning( + "Query %s on schema %s failed", sql, self.schema, exc_info=True + ) + error_message = utils.error_msg_from_exception(ex) + + return QueryResult( + status=status, + df=df, + duration=datetime.now() - qry_start_dttm, + query=sql, + errors=errors, + error_message=error_message, + ) + + def get_rendered_sql( + self, template_processor: Optional[BaseTemplateProcessor] = None + ) -> str: + """ + Render sql with template engine (Jinja). + """ + + sql = self.sql + if template_processor: + try: + sql = template_processor.process_template(sql) + except TemplateError as ex: + raise QueryObjectValidationError( + _( + "Error while rendering virtual dataset query: %(msg)s", + msg=ex.message, + ) + ) from ex + sql = sqlparse.format(sql.strip("\t\r\n; "), strip_comments=True) + if not sql: + raise QueryObjectValidationError(_("Virtual dataset query cannot be empty")) + if len(sqlparse.split(sql)) > 1: + raise QueryObjectValidationError( + _("Virtual dataset query cannot consist of multiple statements") + ) + return sql + + def text(self, clause: str) -> TextClause: + return self.db_engine_spec.get_text_clause(clause) + + def get_from_clause( + self, template_processor: Optional[BaseTemplateProcessor] = None + ) -> Tuple[Union[TableClause, Alias], Optional[str]]: + """ + Return where to select the columns and metrics from. Either a physical table + or a virtual table with it's own subquery. If the FROM is referencing a + CTE, the CTE is returned as the second value in the return tuple. + """ + + from_sql = self.get_rendered_sql(template_processor) + parsed_query = ParsedQuery(from_sql) + if not ( + parsed_query.is_unknown() + or self.db_engine_spec.is_readonly_query(parsed_query) + ): + raise QueryObjectValidationError( + _("Virtual dataset query must be read-only") + ) + + cte = self.db_engine_spec.get_cte_query(from_sql) + from_clause = ( + sa.table(self.db_engine_spec.cte_alias) + if cte + else TextAsFrom(self.text(from_sql), []).alias(VIRTUAL_TABLE_ALIAS) + ) + + return from_clause, cte + + def adhoc_metric_to_sqla( + self, + metric: AdhocMetric, + columns_by_name: Dict[str, "TableColumn"], # # pylint: disable=unused-argument + template_processor: Optional[BaseTemplateProcessor] = None, + ) -> ColumnElement: + """ + Turn an adhoc metric into a sqlalchemy column. + + :param dict metric: Adhoc metric definition + :param dict columns_by_name: Columns for the current table + :param template_processor: template_processor instance + :returns: The metric defined as a sqlalchemy column + :rtype: sqlalchemy.sql.column + """ + expression_type = metric.get("expressionType") + label = utils.get_metric_name(metric) + + if expression_type == utils.AdhocMetricExpressionType.SIMPLE: + metric_column = metric.get("column") or {} + column_name = cast(str, metric_column.get("column_name")) + sqla_column = sa.column(column_name) + sqla_metric = self.sqla_aggregations[metric["aggregate"]](sqla_column) + elif expression_type == utils.AdhocMetricExpressionType.SQL: + expression = self._process_sql_expression( + expression=metric["sqlExpression"], + database_id=self.database_id, + schema=self.schema, + template_processor=template_processor, + ) + sqla_metric = literal_column(expression) + else: + raise QueryObjectValidationError("Adhoc metric expressionType is invalid") + + return self.make_sqla_column_compatible(sqla_metric, label) + + @property + def template_params_dict(self) -> Dict[Any, Any]: + return {} + + @staticmethod + def filter_values_handler( # pylint: disable=too-many-arguments + values: Optional[FilterValues], + operator: str, + target_generic_type: utils.GenericDataType, + target_native_type: Optional[str] = None, + is_list_target: bool = False, + db_engine_spec: Optional[ + Type["BaseEngineSpec"] + ] = None, # fix(hughhh): Optional[Type[BaseEngineSpec]] + db_extra: Optional[Dict[str, Any]] = None, + ) -> Optional[FilterValues]: + if values is None: + return None + + def handle_single_value(value: Optional[FilterValue]) -> Optional[FilterValue]: + if operator == utils.FilterOperator.TEMPORAL_RANGE: + return value + if ( + isinstance(value, (float, int)) + and target_generic_type == utils.GenericDataType.TEMPORAL + and target_native_type is not None + and db_engine_spec is not None + ): + value = db_engine_spec.convert_dttm( + target_type=target_native_type, + dttm=datetime.utcfromtimestamp(value / 1000), + db_extra=db_extra, + ) + value = literal_column(value) + if isinstance(value, str): + value = value.strip("\t\n") + + if target_generic_type == utils.GenericDataType.NUMERIC: + # For backwards compatibility and edge cases + # where a column data type might have changed + return utils.cast_to_num(value) + if value == NULL_STRING: + return None + if value == EMPTY_STRING: + return "" + if target_generic_type == utils.GenericDataType.BOOLEAN: + return utils.cast_to_boolean(value) + return value + + if isinstance(values, (list, tuple)): + values = [handle_single_value(v) for v in values] # type: ignore + else: + values = handle_single_value(values) + if is_list_target and not isinstance(values, (tuple, list)): + values = [values] # type: ignore + elif not is_list_target and isinstance(values, (tuple, list)): + values = values[0] if values else None + return values + + def get_query_str(self, query_obj: QueryObjectDict) -> str: + query_str_ext = self.get_query_str_extended(query_obj) + all_queries = query_str_ext.prequeries + [query_str_ext.sql] + return ";\n\n".join(all_queries) + ";" + + def _get_series_orderby( + self, + series_limit_metric: Metric, + metrics_by_name: Mapping[str, "SqlMetric"], + columns_by_name: Mapping[str, "TableColumn"], + ) -> Column: + if utils.is_adhoc_metric(series_limit_metric): + assert isinstance(series_limit_metric, dict) + ob = self.adhoc_metric_to_sqla( + series_limit_metric, columns_by_name # type: ignore + ) + elif ( + isinstance(series_limit_metric, str) + and series_limit_metric in metrics_by_name + ): + ob = metrics_by_name[series_limit_metric].get_sqla_col() + else: + raise QueryObjectValidationError( + _("Metric '%(metric)s' does not exist", metric=series_limit_metric) + ) + return ob + + def adhoc_column_to_sqla( + self, + col: Type["AdhocColumn"], # type: ignore + template_processor: Optional[BaseTemplateProcessor] = None, + ) -> ColumnElement: + """ + Turn an adhoc column into a sqlalchemy column. + + :param col: Adhoc column definition + :param template_processor: template_processor instance + :returns: The metric defined as a sqlalchemy column + :rtype: sqlalchemy.sql.column + """ + label = utils.get_column_name(col) # type: ignore + expression = self._process_sql_expression( + expression=col["sqlExpression"], + database_id=self.database_id, + schema=self.schema, + template_processor=template_processor, + ) + sqla_column = literal_column(expression) + return self.make_sqla_column_compatible(sqla_column, label) + + def _get_top_groups( + self, + df: pd.DataFrame, + dimensions: List[str], + groupby_exprs: Dict[str, Any], + columns_by_name: Dict[str, "TableColumn"], + ) -> ColumnElement: + groups = [] + for _unused, row in df.iterrows(): + group = [] + for dimension in dimensions: + value = self._normalize_prequery_result_type( + row, + dimension, + columns_by_name, + ) + + group.append(groupby_exprs[dimension] == value) + groups.append(and_(*group)) + + return or_(*groups) + + def dttm_sql_literal(self, dttm: sa.DateTime, col_type: Optional[str]) -> str: + """Convert datetime object to a SQL expression string""" + + sql = ( + self.db_engine_spec.convert_dttm(col_type, dttm, db_extra=None) + if col_type + else None + ) + + if sql: + return sql + + return f'{dttm.strftime("%Y-%m-%d %H:%M:%S.%f")}' + + def get_time_filter( + self, + time_col: Dict[str, Any], + start_dttm: Optional[sa.DateTime], + end_dttm: Optional[sa.DateTime], + ) -> ColumnElement: + label = "__time" + col = time_col.get("column_name") + sqla_col = literal_column(col) + my_col = self.make_sqla_column_compatible(sqla_col, label) + l = [] + if start_dttm: + l.append( + my_col + >= self.db_engine_spec.get_text_clause( + self.dttm_sql_literal(start_dttm, time_col.get("type")) + ) + ) + if end_dttm: + l.append( + my_col + < self.db_engine_spec.get_text_clause( + self.dttm_sql_literal(end_dttm, time_col.get("type")) + ) + ) + return and_(*l) + + def values_for_column(self, column_name: str, limit: int = 10000) -> List[Any]: + """Runs query against sqla to retrieve some + sample values for the given column. + """ + cols = {} + for col in self.columns: + if isinstance(col, dict): + cols[col.get("column_name")] = col + else: + cols[col.column_name] = col + + target_col = cols[column_name] + tp = None # todo(hughhhh): add back self.get_template_processor() + tbl, cte = self.get_from_clause(tp) + + if isinstance(target_col, dict): + sql_column = sa.column(target_col.get("name")) + else: + sql_column = target_col + + qry = sa.select([sql_column]).select_from(tbl).distinct() + if limit: + qry = qry.limit(limit) + + with self.database.get_sqla_engine_with_context() as engine: # type: ignore + sql = qry.compile(engine, compile_kwargs={"literal_binds": True}) + sql = self._apply_cte(sql, cte) + sql = self.mutate_query_from_config(sql) + + df = pd.read_sql_query(sql=sql, con=engine) + return df[column_name].to_list() + + def get_timestamp_expression( + self, + column: Dict[str, Any], + time_grain: Optional[str], + label: Optional[str] = None, + template_processor: Optional[BaseTemplateProcessor] = None, + ) -> Union[TimestampExpression, Label]: + """ + Return a SQLAlchemy Core element representation of self to be used in a query. + + :param time_grain: Optional time grain, e.g. P1Y + :param label: alias/label that column is expected to have + :param template_processor: template processor + :return: A TimeExpression object wrapped in a Label if supported by db + """ + label = label or utils.DTTM_ALIAS + column_spec = self.db_engine_spec.get_column_spec(column.get("type")) + type_ = column_spec.sqla_type if column_spec else sa.DateTime + col = sa.column(column.get("column_name"), type_=type_) + + if template_processor: + expression = template_processor.process_template(column["column_name"]) + col = sa.literal_column(expression, type_=type_) + + time_expr = self.db_engine_spec.get_timestamp_expr(col, None, time_grain) + return self.make_sqla_column_compatible(time_expr, label) + + def get_sqla_col(self, col: Dict[str, Any]) -> Column: + label = col.get("column_name") + col_type = col.get("type") + col = sa.column(label, type_=col_type) + return self.make_sqla_column_compatible(col, label) + + def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-many-branches,too-many-statements + self, + apply_fetch_values_predicate: bool = False, + columns: Optional[List[Column]] = None, + extras: Optional[Dict[str, Any]] = None, + filter: Optional[ # pylint: disable=redefined-builtin + List[utils.QueryObjectFilterClause] + ] = None, + from_dttm: Optional[datetime] = None, + granularity: Optional[str] = None, + groupby: Optional[List[Column]] = None, + inner_from_dttm: Optional[datetime] = None, + inner_to_dttm: Optional[datetime] = None, + is_rowcount: bool = False, + is_timeseries: bool = True, + metrics: Optional[List[Metric]] = None, + orderby: Optional[List[OrderBy]] = None, + order_desc: bool = True, + to_dttm: Optional[datetime] = None, + series_columns: Optional[List[Column]] = None, + series_limit: Optional[int] = None, + series_limit_metric: Optional[Metric] = None, + row_limit: Optional[int] = None, + row_offset: Optional[int] = None, + timeseries_limit: Optional[int] = None, + timeseries_limit_metric: Optional[Metric] = None, + time_shift: Optional[str] = None, + ) -> SqlaQuery: + """Querying any sqla table from this common interface""" + if granularity not in self.dttm_cols and granularity is not None: + granularity = self.main_dttm_col + + extras = extras or {} + time_grain = extras.get("time_grain_sqla") + + template_kwargs = { + "columns": columns, + "from_dttm": from_dttm.isoformat() if from_dttm else None, + "groupby": groupby, + "metrics": metrics, + "row_limit": row_limit, + "row_offset": row_offset, + "time_column": granularity, + "time_grain": time_grain, + "to_dttm": to_dttm.isoformat() if to_dttm else None, + "table_columns": [col.get("column_name") for col in self.columns], + "filter": filter, + } + columns = columns or [] + groupby = groupby or [] + series_column_names = utils.get_column_names(series_columns or []) + # deprecated, to be removed in 2.0 + if is_timeseries and timeseries_limit: + series_limit = timeseries_limit + series_limit_metric = series_limit_metric or timeseries_limit_metric + template_kwargs.update(self.template_params_dict) + extra_cache_keys: List[Any] = [] + template_kwargs["extra_cache_keys"] = extra_cache_keys + removed_filters: List[str] = [] + applied_template_filters: List[str] = [] + template_kwargs["removed_filters"] = removed_filters + template_kwargs["applied_filters"] = applied_template_filters + template_processor = self.get_template_processor(**template_kwargs) + db_engine_spec = self.db_engine_spec + prequeries: List[str] = [] + orderby = orderby or [] + need_groupby = bool(metrics is not None or groupby) + metrics = metrics or [] + + # For backward compatibility + if granularity not in self.dttm_cols and granularity is not None: + granularity = self.main_dttm_col + + columns_by_name: Dict[str, "TableColumn"] = { + col.get("column_name"): col + for col in self.columns # col.column_name: col for col in self.columns + } + + if not granularity and is_timeseries: + raise QueryObjectValidationError( + _( + "Datetime column not provided as part table configuration " + "and is required by this type of chart" + ) + ) + if not metrics and not columns and not groupby: + raise QueryObjectValidationError(_("Empty query?")) + + metrics_exprs: List[ColumnElement] = [] + for metric in metrics: + if utils.is_adhoc_metric(metric): + assert isinstance(metric, dict) + metrics_exprs.append( + self.adhoc_metric_to_sqla( + metric=metric, + columns_by_name=columns_by_name, + template_processor=template_processor, + ) + ) + else: + raise QueryObjectValidationError( + _("Metric '%(metric)s' does not exist", metric=metric) + ) + + if metrics_exprs: + main_metric_expr = metrics_exprs[0] + else: + main_metric_expr, label = literal_column("COUNT(*)"), "ccount" + main_metric_expr = self.make_sqla_column_compatible(main_metric_expr, label) + + # To ensure correct handling of the ORDER BY labeling we need to reference the + # metric instance if defined in the SELECT clause. + # use the key of the ColumnClause for the expected label + metrics_exprs_by_label = {m.key: m for m in metrics_exprs} + metrics_exprs_by_expr = {str(m): m for m in metrics_exprs} + + # Since orderby may use adhoc metrics, too; we need to process them first + orderby_exprs: List[ColumnElement] = [] + for orig_col, ascending in orderby: + col: Union[AdhocMetric, ColumnElement] = orig_col + if isinstance(col, dict): + col = cast(AdhocMetric, col) + if col.get("sqlExpression"): + col["sqlExpression"] = self._process_sql_expression( + expression=col["sqlExpression"], + database_id=self.database_id, + schema=self.schema, + template_processor=template_processor, + ) + if utils.is_adhoc_metric(col): + # add adhoc sort by column to columns_by_name if not exists + col = self.adhoc_metric_to_sqla(col, columns_by_name) + # if the adhoc metric has been defined before + # use the existing instance. + col = metrics_exprs_by_expr.get(str(col), col) + need_groupby = True + elif col in columns_by_name: + gb_column_obj = columns_by_name[col] + if isinstance(gb_column_obj, dict): + col = self.get_sqla_col(gb_column_obj) + else: + col = gb_column_obj.get_sqla_col() + elif col in metrics_exprs_by_label: + col = metrics_exprs_by_label[col] + need_groupby = True + + if isinstance(col, ColumnElement): + orderby_exprs.append(col) + else: + # Could not convert a column reference to valid ColumnElement + raise QueryObjectValidationError( + _("Unknown column used in orderby: %(col)s", col=orig_col) + ) + + select_exprs: List[Union[Column, Label]] = [] + groupby_all_columns = {} + groupby_series_columns = {} + + # filter out the pseudo column __timestamp from columns + columns = [col for col in columns if col != utils.DTTM_ALIAS] + dttm_col = columns_by_name.get(granularity) if granularity else None + + if need_groupby: + # dedup columns while preserving order + columns = groupby or columns + for selected in columns: + if isinstance(selected, str): + # if groupby field/expr equals granularity field/expr + if selected == granularity: + table_col = columns_by_name[selected] + if isinstance(table_col, dict): + outer = self.get_timestamp_expression( + column=table_col, + time_grain=time_grain, + label=selected, + template_processor=template_processor, + ) + else: + outer = table_col.get_timestamp_expression( + time_grain=time_grain, + label=selected, + template_processor=template_processor, + ) + # if groupby field equals a selected column + elif selected in columns_by_name: + if isinstance(columns_by_name[selected], dict): + outer = sa.column(f"{selected}") + outer = self.make_sqla_column_compatible(outer, selected) + else: + outer = columns_by_name[selected].get_sqla_col() + else: + selected = self.validate_adhoc_subquery( + selected, + self.database_id, + self.schema, + ) + outer = sa.column(f"{selected}") + outer = self.make_sqla_column_compatible(outer, selected) + else: + outer = self.adhoc_column_to_sqla( + col=selected, template_processor=template_processor + ) + groupby_all_columns[outer.name] = outer + if ( + is_timeseries and not series_column_names + ) or outer.name in series_column_names: + groupby_series_columns[outer.name] = outer + select_exprs.append(outer) + elif columns: + for selected in columns: + selected = self.validate_adhoc_subquery( + selected, + self.database_id, + self.schema, + ) + if isinstance(columns_by_name[selected], dict): + select_exprs.append(sa.column(f"{selected}")) + else: + select_exprs.append( + columns_by_name[selected].get_sqla_col() + if selected in columns_by_name + else self.make_sqla_column_compatible(literal_column(selected)) + ) + metrics_exprs = [] + + if granularity: + if granularity not in columns_by_name or not dttm_col: + raise QueryObjectValidationError( + _( + 'Time column "%(col)s" does not exist in dataset', + col=granularity, + ) + ) + time_filters: List[Any] = [] + + if is_timeseries: + if isinstance(dttm_col, dict): + timestamp = self.get_timestamp_expression( + dttm_col, time_grain, template_processor=template_processor + ) + else: + timestamp = dttm_col.get_timestamp_expression( + time_grain=time_grain, template_processor=template_processor + ) + # always put timestamp as the first column + select_exprs.insert(0, timestamp) + groupby_all_columns[timestamp.name] = timestamp + + # Use main dttm column to support index with secondary dttm columns. + if db_engine_spec.time_secondary_columns: + if isinstance(dttm_col, dict): + dttm_col_name = dttm_col.get("column_name") + else: + dttm_col_name = dttm_col.column_name + + if ( + self.main_dttm_col in self.dttm_cols + and self.main_dttm_col != dttm_col_name + ): + if isinstance(self.main_dttm_col, dict): + time_filters.append( + self.get_time_filter( + self.main_dttm_col, + from_dttm, + to_dttm, + ) + ) + else: + time_filters.append( + columns_by_name[self.main_dttm_col].get_time_filter( + from_dttm, + to_dttm, + ) + ) + + if isinstance(dttm_col, dict): + time_filters.append(self.get_time_filter(dttm_col, from_dttm, to_dttm)) + else: + time_filters.append(dttm_col.get_time_filter(from_dttm, to_dttm)) + + # Always remove duplicates by column name, as sometimes `metrics_exprs` + # can have the same name as a groupby column (e.g. when users use + # raw columns as custom SQL adhoc metric). + select_exprs = utils.remove_duplicates( + select_exprs + metrics_exprs, key=lambda x: x.name + ) + + # Expected output columns + labels_expected = [c.key for c in select_exprs] + + # Order by columns are "hidden" columns, some databases require them + # always be present in SELECT if an aggregation function is used + if not db_engine_spec.allows_hidden_ordeby_agg: + select_exprs = utils.remove_duplicates(select_exprs + orderby_exprs) + + qry = sa.select(select_exprs) + + tbl, cte = self.get_from_clause(template_processor) + + if groupby_all_columns: + qry = qry.group_by(*groupby_all_columns.values()) + + where_clause_and = [] + having_clause_and = [] + + for flt in filter: # type: ignore + if not all(flt.get(s) for s in ["col", "op"]): + continue + flt_col = flt["col"] + val = flt.get("val") + op = flt["op"].upper() + col_obj: Optional["TableColumn"] = None + sqla_col: Optional[Column] = None + if flt_col == utils.DTTM_ALIAS and is_timeseries and dttm_col: + col_obj = dttm_col + elif utils.is_adhoc_column(flt_col): + sqla_col = self.adhoc_column_to_sqla(flt_col) # type: ignore + else: + col_obj = columns_by_name.get(flt_col) + filter_grain = flt.get("grain") + + if is_feature_enabled("ENABLE_TEMPLATE_REMOVE_FILTERS"): + if utils.get_column_name(flt_col) in removed_filters: + # Skip generating SQLA filter when the jinja template handles it. + continue + + if col_obj or sqla_col is not None: + if sqla_col is not None: + pass + elif col_obj and filter_grain: + if isinstance(col_obj, dict): + sqla_col = self.get_timestamp_expression( + col_obj, time_grain, template_processor=template_processor + ) + else: + sqla_col = col_obj.get_timestamp_expression( + time_grain=filter_grain, + template_processor=template_processor, + ) + elif col_obj and isinstance(col_obj, dict): + sqla_col = sa.column(col_obj.get("column_name")) + elif col_obj: + sqla_col = col_obj.get_sqla_col() + + if col_obj and isinstance(col_obj, dict): + col_type = col_obj.get("type") + else: + col_type = col_obj.type if col_obj else None + col_spec = db_engine_spec.get_column_spec( + native_type=col_type, + db_extra=self.database.get_extra(), # type: ignore + ) + is_list_target = op in ( + utils.FilterOperator.IN.value, + utils.FilterOperator.NOT_IN.value, + ) + + if col_obj and isinstance(col_obj, dict): + col_advanced_data_type = "" + else: + col_advanced_data_type = ( + col_obj.advanced_data_type if col_obj else "" + ) + + if col_spec and not col_advanced_data_type: + target_generic_type = col_spec.generic_type + else: + target_generic_type = utils.GenericDataType.STRING + eq = self.filter_values_handler( + values=val, + operator=op, + target_generic_type=target_generic_type, + target_native_type=col_type, + is_list_target=is_list_target, + db_engine_spec=db_engine_spec, + db_extra=self.database.get_extra(), # type: ignore + ) + if ( + col_advanced_data_type != "" + and feature_flag_manager.is_feature_enabled( + "ENABLE_ADVANCED_DATA_TYPES" + ) + and col_advanced_data_type in ADVANCED_DATA_TYPES + ): + values = eq if is_list_target else [eq] # type: ignore + bus_resp: AdvancedDataTypeResponse = ADVANCED_DATA_TYPES[ + col_advanced_data_type + ].translate_type( + { + "type": col_advanced_data_type, + "values": values, + } + ) + if bus_resp["error_message"]: + raise AdvancedDataTypeResponseError( + _(bus_resp["error_message"]) + ) + + where_clause_and.append( + ADVANCED_DATA_TYPES[col_advanced_data_type].translate_filter( + sqla_col, op, bus_resp["values"] + ) + ) + elif is_list_target: + assert isinstance(eq, (tuple, list)) + if len(eq) == 0: + raise QueryObjectValidationError( + _("Filter value list cannot be empty") + ) + if len(eq) > len( + eq_without_none := [x for x in eq if x is not None] + ): + is_null_cond = sqla_col.is_(None) + if eq: + cond = or_(is_null_cond, sqla_col.in_(eq_without_none)) + else: + cond = is_null_cond + else: + cond = sqla_col.in_(eq) + if op == utils.FilterOperator.NOT_IN.value: + cond = ~cond + where_clause_and.append(cond) + elif op == utils.FilterOperator.IS_NULL.value: + where_clause_and.append(sqla_col.is_(None)) + elif op == utils.FilterOperator.IS_NOT_NULL.value: + where_clause_and.append(sqla_col.isnot(None)) + elif op == utils.FilterOperator.IS_TRUE.value: + where_clause_and.append(sqla_col.is_(True)) + elif op == utils.FilterOperator.IS_FALSE.value: + where_clause_and.append(sqla_col.is_(False)) + else: + if eq is None: + raise QueryObjectValidationError( + _( + "Must specify a value for filters " + "with comparison operators" + ) + ) + if op == utils.FilterOperator.EQUALS.value: + where_clause_and.append(sqla_col == eq) + elif op == utils.FilterOperator.NOT_EQUALS.value: + where_clause_and.append(sqla_col != eq) + elif op == utils.FilterOperator.GREATER_THAN.value: + where_clause_and.append(sqla_col > eq) + elif op == utils.FilterOperator.LESS_THAN.value: + where_clause_and.append(sqla_col < eq) + elif op == utils.FilterOperator.GREATER_THAN_OR_EQUALS.value: + where_clause_and.append(sqla_col >= eq) + elif op == utils.FilterOperator.LESS_THAN_OR_EQUALS.value: + where_clause_and.append(sqla_col <= eq) + elif op == utils.FilterOperator.LIKE.value: + where_clause_and.append(sqla_col.like(eq)) + elif op == utils.FilterOperator.ILIKE.value: + where_clause_and.append(sqla_col.ilike(eq)) + elif ( + op == utils.FilterOperator.TEMPORAL_RANGE.value + and isinstance(eq, str) + and col_obj is not None + ): + _since, _until = get_since_until_from_time_range( + time_range=eq, + time_shift=time_shift, + extras=extras, + ) + where_clause_and.append( + self.get_time_filter( + time_col=col_obj, + start_dttm=_since, + end_dttm=_until, + ) + ) + else: + raise QueryObjectValidationError( + _("Invalid filter operation type: %(op)s", op=op) + ) + # todo(hugh): fix this w/ template_processor + # where_clause_and += self.get_sqla_row_level_filters(template_processor) + if extras: + where = extras.get("where") + if where: + try: + where = template_processor.process_template(f"{where}") + except TemplateError as ex: + raise QueryObjectValidationError( + _( + "Error in jinja expression in WHERE clause: %(msg)s", + msg=ex.message, + ) + ) from ex + where_clause_and += [self.text(where)] + having = extras.get("having") + if having: + try: + having = template_processor.process_template(f"{having}") + except TemplateError as ex: + raise QueryObjectValidationError( + _( + "Error in jinja expression in HAVING clause: %(msg)s", + msg=ex.message, + ) + ) from ex + having_clause_and += [self.text(having)] + if apply_fetch_values_predicate and self.fetch_values_predicate: # type: ignore + qry = qry.where(self.get_fetch_values_predicate()) # type: ignore + if granularity: + qry = qry.where(and_(*(time_filters + where_clause_and))) + else: + qry = qry.where(and_(*where_clause_and)) + qry = qry.having(and_(*having_clause_and)) + + self.make_orderby_compatible(select_exprs, orderby_exprs) + + for col, (orig_col, ascending) in zip(orderby_exprs, orderby): + if not db_engine_spec.allows_alias_in_orderby and isinstance(col, Label): + # if engine does not allow using SELECT alias in ORDER BY + # revert to the underlying column + col = col.element + + if ( + db_engine_spec.allows_alias_in_select + and db_engine_spec.allows_hidden_cc_in_orderby + and col.name in [select_col.name for select_col in select_exprs] + ): + col = literal_column(col.name) + direction = sa.asc if ascending else sa.desc + qry = qry.order_by(direction(col)) + + if row_limit: + qry = qry.limit(row_limit) + if row_offset: + qry = qry.offset(row_offset) + + if series_limit and groupby_series_columns: + if db_engine_spec.allows_joins and db_engine_spec.allows_subqueries: + # some sql dialects require for order by expressions + # to also be in the select clause -- others, e.g. vertica, + # require a unique inner alias + inner_main_metric_expr = self.make_sqla_column_compatible( + main_metric_expr, "mme_inner__" + ) + inner_groupby_exprs = [] + inner_select_exprs = [] + for gby_name, gby_obj in groupby_series_columns.items(): + label = utils.get_column_name(gby_name) + inner = self.make_sqla_column_compatible(gby_obj, gby_name + "__") + inner_groupby_exprs.append(inner) + inner_select_exprs.append(inner) + + inner_select_exprs += [inner_main_metric_expr] + subq = sa.select(inner_select_exprs).select_from(tbl) + inner_time_filter = [] + + if dttm_col and not db_engine_spec.time_groupby_inline: + if isinstance(dttm_col, dict): + inner_time_filter = [ + self.get_time_filter( + dttm_col, + inner_from_dttm or from_dttm, + inner_to_dttm or to_dttm, + ) + ] + else: + inner_time_filter = [ + dttm_col.get_time_filter( + inner_from_dttm or from_dttm, + inner_to_dttm or to_dttm, + ) + ] + + subq = subq.where(and_(*(where_clause_and + inner_time_filter))) + subq = subq.group_by(*inner_groupby_exprs) + + ob = inner_main_metric_expr + direction = sa.desc if order_desc else sa.asc + subq = subq.order_by(direction(ob)) + subq = subq.limit(series_limit) + + on_clause = [] + for gby_name, gby_obj in groupby_series_columns.items(): + # in this case the column name, not the alias, needs to be + # conditionally mutated, as it refers to the column alias in + # the inner query + col_name = db_engine_spec.make_label_compatible(gby_name + "__") + on_clause.append(gby_obj == sa.column(col_name)) + + tbl = tbl.join(subq.alias(), and_(*on_clause)) + + # run prequery to get top groups + prequery_obj = { + "is_timeseries": False, + "row_limit": series_limit, + "metrics": metrics, + "granularity": granularity, + "groupby": groupby, + "from_dttm": inner_from_dttm or from_dttm, + "to_dttm": inner_to_dttm or to_dttm, + "filter": filter, + "orderby": orderby, + "extras": extras, + "columns": columns, + "order_desc": True, + } + result = self.exc_query(prequery_obj) + prequeries.append(result.query) + dimensions = [ + c + for c in result.df.columns + if c not in metrics and c in groupby_series_columns + ] + top_groups = self._get_top_groups( + result.df, dimensions, groupby_series_columns, columns_by_name + ) + qry = qry.where(top_groups) + + qry = qry.select_from(tbl) + + if is_rowcount: + if not db_engine_spec.allows_subqueries: + raise QueryObjectValidationError( + _("Database does not support subqueries") + ) + label = "rowcount" + col = self.make_sqla_column_compatible(literal_column("COUNT(*)"), label) + qry = sa.select([col]).select_from(qry.alias("rowcount_qry")) + labels_expected = [label] + + return SqlaQuery( + applied_template_filters=applied_template_filters, + cte=cte, + extra_cache_keys=extra_cache_keys, + labels_expected=labels_expected, + sqla_query=qry, + prequeries=prequeries, + ) diff --git a/superset/models/slice.py b/superset/models/slice.py index 862edb9ec8ce..332d51d1af93 100644 --- a/superset/models/slice.py +++ b/superset/models/slice.py @@ -39,15 +39,14 @@ from sqlalchemy.orm import relationship from sqlalchemy.orm.mapper import Mapper -from superset import ConnectorRegistry, db, is_feature_enabled, security_manager +from superset import db, is_feature_enabled, security_manager from superset.legacy import update_time_range from superset.models.helpers import AuditMixinNullable, ImportExportMixin -from superset.models.tags import ChartUpdater from superset.tasks.thumbnails import cache_chart_thumbnail +from superset.tasks.utils import get_current_user +from superset.thumbnails.digest import get_chart_digest from superset.utils import core as utils -from superset.utils.hashing import md5_sha_from_str from superset.utils.memoized import memoized -from superset.utils.urls import get_url_path from superset.viz import BaseViz, viz_types if TYPE_CHECKING: @@ -111,6 +110,9 @@ class Slice( # pylint: disable=too-many-public-methods export_fields = [ "slice_name", + "description", + "certified_by", + "certification_details", "datasource_type", "datasource_name", "viz_type", @@ -126,7 +128,10 @@ def __repr__(self) -> str: @property def cls_model(self) -> Type["BaseDatasource"]: - return ConnectorRegistry.sources[self.datasource_type] + # pylint: disable=import-outside-toplevel + from superset.datasource.dao import DatasourceDAO + + return DatasourceDAO.sources[self.datasource_type] @property def datasource(self) -> Optional["BaseDatasource"]: @@ -232,10 +237,7 @@ def data(self) -> Dict[str, Any]: @property def digest(self) -> str: - """ - Returns a MD5 HEX digest that makes this dashboard unique - """ - return md5_sha_from_str(self.params or "") + return get_chart_digest(self) @property def thumbnail_url(self) -> str: @@ -283,14 +285,20 @@ def get_query_context(self) -> Optional[QueryContext]: def get_explore_url( self, - base_url: str = "/superset/explore", + base_url: str = "/explore", overrides: Optional[Dict[str, Any]] = None, + ) -> str: + return self.build_explore_url(self.id, base_url, overrides) + + @staticmethod + def build_explore_url( + id_: int, base_url: str = "/explore", overrides: Optional[Dict[str, Any]] = None ) -> str: overrides = overrides or {} - form_data = {"slice_id": self.id} + form_data = {"slice_id": id_} form_data.update(overrides) params = parse.quote(json.dumps(form_data)) - return f"{base_url}/?form_data={params}" + return f"{base_url}/?slice_id={id_}&form_data={params}" @property def slice_url(self) -> str: @@ -332,7 +340,7 @@ def icons(self) -> str: @property def url(self) -> str: - return f"/superset/explore/?form_data=%7B%22slice_id%22%3A%20{self.id}%7D" + return f"/explore/?slice_id={self.id}" def get_query_context_factory(self) -> QueryContextFactory: if self.query_context_factory is None: @@ -342,6 +350,11 @@ def get_query_context_factory(self) -> QueryContextFactory: self.query_context_factory = QueryContextFactory() return self.query_context_factory + @classmethod + def get(cls, id_: int) -> Slice: + qry = db.session.query(Slice).filter_by(id=id_) + return qry.one_or_none() + def set_related_perm(_mapper: Mapper, _connection: Connection, target: Slice) -> None: src_class = target.cls_model @@ -356,20 +369,16 @@ def set_related_perm(_mapper: Mapper, _connection: Connection, target: Slice) -> def event_after_chart_changed( _mapper: Mapper, _connection: Connection, target: Slice ) -> None: - url = get_url_path("Superset.slice", slice_id=target.id, standalone="true") - cache_chart_thumbnail.delay(url, target.digest, force=True) + cache_chart_thumbnail.delay( + current_user=get_current_user(), + chart_id=target.id, + force=True, + ) sqla.event.listen(Slice, "before_insert", set_related_perm) sqla.event.listen(Slice, "before_update", set_related_perm) -# events for updating tags -if is_feature_enabled("TAGGING_SYSTEM"): - sqla.event.listen(Slice, "after_insert", ChartUpdater.after_insert) - sqla.event.listen(Slice, "after_update", ChartUpdater.after_update) - sqla.event.listen(Slice, "after_delete", ChartUpdater.after_delete) - -# events for updating tags if is_feature_enabled("THUMBNAILS_SQLA_LISTENERS"): sqla.event.listen(Slice, "after_insert", event_after_chart_changed) sqla.event.listen(Slice, "after_update", event_after_chart_changed) diff --git a/superset/models/sql_lab.py b/superset/models/sql_lab.py index 74c43718ef78..23c13629b95e 100644 --- a/superset/models/sql_lab.py +++ b/superset/models/sql_lab.py @@ -15,15 +15,18 @@ # specific language governing permissions and limitations # under the License. """A collection of ORM sqlalchemy models for SQL Lab""" +import inspect +import logging import re from datetime import datetime -from typing import Any, Dict, List +from typing import Any, Dict, List, Optional, Type, TYPE_CHECKING import simplejson as json import sqlalchemy as sqla -from flask import Markup +from flask import current_app, Markup from flask_appbuilder import Model from flask_appbuilder.models.decorators import renders +from flask_babel import gettext as __ from humanize import naturaltime from sqlalchemy import ( Boolean, @@ -40,27 +43,37 @@ from sqlalchemy.orm import backref, relationship from superset import security_manager +from superset.jinja_context import BaseTemplateProcessor, get_template_processor from superset.models.helpers import ( AuditMixinNullable, + ExploreMixin, ExtraJSONMixin, ImportExportMixin, ) -from superset.models.tags import QueryUpdater from superset.sql_parse import CtasMethod, ParsedQuery, Table from superset.sqllab.limiting_factor import LimitingFactor -from superset.utils.core import QueryStatus, user_label +from superset.utils.core import GenericDataType, QueryStatus, user_label +if TYPE_CHECKING: + from superset.db_engine_specs import BaseEngineSpec -class Query(Model, ExtraJSONMixin): + +logger = logging.getLogger(__name__) + + +class Query( + Model, ExtraJSONMixin, ExploreMixin +): # pylint: disable=abstract-method,too-many-public-methods """ORM model for SQL query Now that SQL Lab support multi-statement execution, an entry in this table may represent multiple SQL statements executed sequentially""" __tablename__ = "query" + type = "query" id = Column(Integer, primary_key=True) client_id = Column(String(11), unique=True, nullable=False) - + query_language = "sql" database_id = Column(Integer, ForeignKey("dbs.id"), nullable=False) # Store the tmp table into the DB only if the user asks for it. @@ -98,7 +111,7 @@ class Query(Model, ExtraJSONMixin): start_running_time = Column(Numeric(precision=20, scale=6)) end_time = Column(Numeric(precision=20, scale=6)) end_result_backend_time = Column(Numeric(precision=20, scale=6)) - tracking_url = Column(Text) + tracking_url_raw = Column(Text, name="tracking_url") changed_on = Column( DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=True @@ -113,6 +126,9 @@ class Query(Model, ExtraJSONMixin): __table_args__ = (sqla.Index("ti_user_id_changed_on", user_id, changed_on),) + def get_template_processor(self, **kwargs: Any) -> BaseTemplateProcessor: + return get_template_processor(query=self, database=self.database, **kwargs) + def to_dict(self) -> Dict[str, Any]: return { "changedOn": self.changed_on, @@ -167,8 +183,70 @@ def sql_tables(self) -> List[Table]: return list(ParsedQuery(self.sql).tables) @property - def columns(self) -> List[Table]: - return self.extra.get("columns", []) + def columns(self) -> List[Dict[str, Any]]: + bool_types = ("BOOL",) + num_types = ( + "DOUBLE", + "FLOAT", + "INT", + "BIGINT", + "NUMBER", + "LONG", + "REAL", + "NUMERIC", + "DECIMAL", + "MONEY", + ) + date_types = ("DATE", "TIME") + str_types = ("VARCHAR", "STRING", "CHAR") + columns = [] + col_type = "" + for col in self.extra.get("columns", []): + computed_column = {**col} + col_type = col.get("type") + + if col_type and any(map(lambda t: t in col_type.upper(), str_types)): + computed_column["type_generic"] = GenericDataType.STRING + if col_type and any(map(lambda t: t in col_type.upper(), bool_types)): + computed_column["type_generic"] = GenericDataType.BOOLEAN + if col_type and any(map(lambda t: t in col_type.upper(), num_types)): + computed_column["type_generic"] = GenericDataType.NUMERIC + if col_type and any(map(lambda t: t in col_type.upper(), date_types)): + computed_column["type_generic"] = GenericDataType.TEMPORAL + + computed_column["column_name"] = col.get("name") + computed_column["groupby"] = True + columns.append(computed_column) + return columns + + @property + def data(self) -> Dict[str, Any]: + order_by_choices = [] + for col in self.columns: + column_name = str(col.get("column_name") or "") + order_by_choices.append( + (json.dumps([column_name, True]), f"{column_name} " + __("[asc]")) + ) + order_by_choices.append( + (json.dumps([column_name, False]), f"{column_name} " + __("[desc]")) + ) + + return { + "time_grain_sqla": [ + (g.duration, g.name) for g in self.database.grains() or [] + ], + "filter_select": True, + "name": self.tab_name, + "columns": self.columns, + "metrics": [], + "id": self.id, + "type": self.type, + "sql": self.sql, + "owners": self.owners_data, + "database": {"id": self.database_id, "backend": self.database.backend}, + "order_by_choices": order_by_choices, + "schema": self.schema, + } def raise_for_access(self) -> None: """ @@ -179,6 +257,90 @@ def raise_for_access(self) -> None: security_manager.raise_for_access(query=self) + @property + def db_engine_spec(self) -> Type["BaseEngineSpec"]: + return self.database.db_engine_spec + + @property + def owners_data(self) -> List[Dict[str, Any]]: + return [] + + @property + def uid(self) -> str: + return f"{self.id}__{self.type}" + + @property + def is_rls_supported(self) -> bool: + return False + + @property + def cache_timeout(self) -> int: + return 0 + + @property + def column_names(self) -> List[Any]: + return [col.get("column_name") for col in self.columns] + + @property + def offset(self) -> int: + return 0 + + @property + def main_dttm_col(self) -> Optional[str]: + for col in self.columns: + if col.get("is_dttm"): + return col.get("column_name") + return None + + @property + def dttm_cols(self) -> List[Any]: + return [col.get("column_name") for col in self.columns if col.get("is_dttm")] + + @property + def schema_perm(self) -> str: + return f"{self.database.database_name}.{self.schema}" + + @property + def perm(self) -> str: + return f"[{self.database.database_name}].[{self.tab_name}](id:{self.id})" + + @property + def default_endpoint(self) -> str: + return "" + + @staticmethod + def get_extra_cache_keys(query_obj: Dict[str, Any]) -> List[str]: + return [] + + @property + def tracking_url(self) -> Optional[str]: + """ + Transfrom tracking url at run time because the exact URL may depends + on query properties such as execution and finish time. + """ + transform = current_app.config.get("TRACKING_URL_TRANSFORMER") + url = self.tracking_url_raw + if url and transform: + sig = inspect.signature(transform) + # for backward compatibility, users may define a transformer function + # with only one parameter (`url`). + args = [url, self][: len(sig.parameters)] + url = transform(*args) + logger.debug("Transformed tracking url: %s", url) + return url + + @tracking_url.setter + def tracking_url(self, value: str) -> None: + self.tracking_url_raw = value + + def get_column(self, column_name: Optional[str]) -> Optional[Dict[str, Any]]: + if not column_name: + return None + for col in self.columns: + if col.get("column_name") == column_name: + return col + return None + class SavedQuery(Model, AuditMixinNullable, ExtraJSONMixin, ImportExportMixin): """ORM model for SQL query""" @@ -191,6 +353,7 @@ class SavedQuery(Model, AuditMixinNullable, ExtraJSONMixin, ImportExportMixin): label = Column(String(256)) description = Column(Text) sql = Column(Text) + template_parameters = Column(Text) user = relationship( security_manager.user_model, backref=backref("saved_queries", cascade="all, delete-orphan"), @@ -355,9 +518,3 @@ def to_dict(self) -> Dict[str, Any]: "description": description, "expanded": self.expanded, } - - -# events for updating tags -sqla.event.listen(SavedQuery, "after_insert", QueryUpdater.after_insert) -sqla.event.listen(SavedQuery, "after_update", QueryUpdater.after_update) -sqla.event.listen(SavedQuery, "after_delete", QueryUpdater.after_delete) diff --git a/superset/models/sql_types/presto_sql_types.py b/superset/models/sql_types/presto_sql_types.py index 5f36266ccaa4..c496f750399c 100644 --- a/superset/models/sql_types/presto_sql_types.py +++ b/superset/models/sql_types/presto_sql_types.py @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. -# pylint: disable=abstract-method +# pylint: disable=abstract-method, no-init from typing import Any, Dict, List, Optional, Type from sqlalchemy.engine.interfaces import Dialect diff --git a/superset/proxy/api.py b/superset/proxy/api.py index 1defcf8ec8f5..f0b321ba728f 100644 --- a/superset/proxy/api.py +++ b/superset/proxy/api.py @@ -202,7 +202,6 @@ def get_ipstring(self, ip_string: str, **_kwargs: Any) -> Response: user_ip_string = user_ips[0] for index in range(1, len(user_ips)): user_ip_string += "%22%2C%20%22" + user_ips[index] - url = ( self.ALFRED_URL + "/rest/search/cypher?expression=MATCH%20(ip%3AIP_ADDRESS)%20WHERE%20ip.value%20IN%20%5B%22" diff --git a/superset/queries/api.py b/superset/queries/api.py index 460e2dd4667e..1784edf167c8 100644 --- a/superset/queries/api.py +++ b/superset/queries/api.py @@ -15,16 +15,33 @@ # specific language governing permissions and limitations # under the License. import logging +from typing import Any +import backoff +from flask_appbuilder.api import expose, protect, request, rison, safe from flask_appbuilder.models.sqla.interface import SQLAInterface +from superset import db, event_logger from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod from superset.databases.filters import DatabaseFilter +from superset.exceptions import SupersetException from superset.models.sql_lab import Query +from superset.queries.dao import QueryDAO from superset.queries.filters import QueryFilter -from superset.queries.schemas import openapi_spec_methods_override, QuerySchema -from superset.views.base_api import BaseSupersetModelRestApi, RelatedFieldFilter -from superset.views.filters import FilterRelatedOwners +from superset.queries.schemas import ( + openapi_spec_methods_override, + queries_get_updated_since_schema, + QuerySchema, + StopQuerySchema, +) +from superset.superset_typing import FlaskResponse +from superset.views.base_api import ( + BaseSupersetModelRestApi, + RelatedFieldFilter, + requires_json, + statsd_metrics, +) +from superset.views.filters import BaseFilterRelatedUsers, FilterRelatedOwners logger = logging.getLogger(__name__) @@ -43,6 +60,12 @@ class QueryRestApi(BaseSupersetModelRestApi): RouteMethod.GET_LIST, RouteMethod.RELATED, RouteMethod.DISTINCT, + "stop_query", + "get_updated_since", + } + + apispec_parameter_schemas = { + "queries_get_updated_since_schema": queries_get_updated_since_schema, } list_columns = [ @@ -95,9 +118,11 @@ class QueryRestApi(BaseSupersetModelRestApi): base_filters = [["id", QueryFilter, lambda: []]] base_order = ("changed_on", "desc") list_model_schema = QuerySchema() + stop_query_schema = StopQuerySchema() openapi_spec_tag = "Queries" openapi_spec_methods = openapi_spec_methods_override + openapi_spec_component_schemas = (StopQuerySchema,) order_columns = [ "changed_on", @@ -109,7 +134,10 @@ class QueryRestApi(BaseSupersetModelRestApi): "tab_name", "user.first_name", ] - + base_related_field_filters = { + "created_by": [["id", BaseFilterRelatedUsers, lambda: []]], + "user": [["id", BaseFilterRelatedUsers, lambda: []]], + } related_field_filters = { "created_by": RelatedFieldFilter("first_name", FilterRelatedOwners), "user": RelatedFieldFilter("first_name", FilterRelatedOwners), @@ -117,6 +145,115 @@ class QueryRestApi(BaseSupersetModelRestApi): search_columns = ["changed_on", "database", "sql", "status", "user", "start_time"] - filter_rel_fields = {"database": [["id", DatabaseFilter, lambda: []]]} + base_related_field_filters = {"database": [["id", DatabaseFilter, lambda: []]]} allowed_rel_fields = {"database", "user"} allowed_distinct_fields = {"status"} + + @expose("/updated_since") + @protect() + @safe + @rison(queries_get_updated_since_schema) + @statsd_metrics + @event_logger.log_this_with_context( + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}" + f".get_updated_since", + log_to_statsd=False, + ) + def get_updated_since(self, **kwargs: Any) -> FlaskResponse: + """Get a list of queries that changed after last_updated_ms + --- + get: + summary: Get a list of queries that changed after last_updated_ms + parameters: + - in: query + name: q + content: + application/json: + schema: + $ref: '#/components/schemas/queries_get_updated_since_schema' + responses: + 200: + description: Queries list + content: + application/json: + schema: + type: object + properties: + result: + description: >- + A List of queries that changed after last_updated_ms + type: array + items: + $ref: '#/components/schemas/{{self.__class__.__name__}}.get' + 400: + $ref: '#/components/responses/400' + 401: + $ref: '#/components/responses/401' + 404: + $ref: '#/components/responses/404' + 500: + $ref: '#/components/responses/500' + """ + try: + last_updated_ms = kwargs["rison"].get("last_updated_ms", 0) + queries = QueryDAO.get_queries_changed_after(last_updated_ms) + payload = [q.to_dict() for q in queries] + return self.response(200, result=payload) + except SupersetException as ex: + return self.response(ex.status, message=ex.message) + + @expose("/stop", methods=["POST"]) + @protect() + @safe + @statsd_metrics + @event_logger.log_this_with_context( + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}" + f".stop_query", + log_to_statsd=False, + ) + @backoff.on_exception( + backoff.constant, + Exception, + interval=1, + on_backoff=lambda details: db.session.rollback(), + on_giveup=lambda details: db.session.rollback(), + max_tries=5, + ) + @requires_json + def stop_query(self) -> FlaskResponse: + """Manually stop a query with client_id + --- + post: + summary: Manually stop a query with client_id + requestBody: + description: Stop query schema + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/StopQuerySchema' + responses: + 200: + description: Query stopped + content: + application/json: + schema: + type: object + properties: + result: + type: string + 400: + $ref: '#/components/responses/400' + 401: + $ref: '#/components/responses/401' + 404: + $ref: '#/components/responses/404' + 500: + $ref: '#/components/responses/500' + """ + try: + body = self.stop_query_schema.load(request.json) + QueryDAO.stop_query(body["client_id"]) + return self.response(200, result="OK") + except SupersetException as ex: + return self.response(ex.status, message=ex.message) diff --git a/superset/queries/dao.py b/superset/queries/dao.py index c7d59343e858..642a5dd4cbb1 100644 --- a/superset/queries/dao.py +++ b/superset/queries/dao.py @@ -16,12 +16,17 @@ # under the License. import logging from datetime import datetime -from typing import Any, Dict +from typing import Any, Dict, List, Union +from superset import sql_lab +from superset.common.db_query_status import QueryStatus from superset.dao.base import BaseDAO +from superset.exceptions import QueryNotFoundException, SupersetCancelQueryException from superset.extensions import db from superset.models.sql_lab import Query, SavedQuery from superset.queries.filters import QueryFilter +from superset.utils.core import get_user_id +from superset.utils.dates import now_as_float logger = logging.getLogger(__name__) @@ -56,3 +61,37 @@ def save_metadata(query: Query, payload: Dict[str, Any]) -> None: columns = payload.get("columns", {}) db.session.add(query) query.set_extra_json_key("columns", columns) + + @staticmethod + def get_queries_changed_after(last_updated_ms: Union[float, int]) -> List[Query]: + # UTC date time, same that is stored in the DB. + last_updated_dt = datetime.utcfromtimestamp(last_updated_ms / 1000) + + return ( + db.session.query(Query) + .filter(Query.user_id == get_user_id(), Query.changed_on >= last_updated_dt) + .all() + ) + + @staticmethod + def stop_query(client_id: str) -> None: + query = db.session.query(Query).filter_by(client_id=client_id).one_or_none() + if not query: + raise QueryNotFoundException(f"Query with client_id {client_id} not found") + + if query.status in [ + QueryStatus.FAILED, + QueryStatus.SUCCESS, + QueryStatus.TIMED_OUT, + ]: + logger.warning( + "Query with client_id could not be stopped: query already complete", + ) + return + + if not sql_lab.cancel_query(query): + raise SupersetCancelQueryException("Could not cancel query") + + query.status = QueryStatus.STOPPED + query.end_time = now_as_float() + db.session.commit() diff --git a/superset/queries/filters.py b/superset/queries/filters.py index 22cf45f323bf..1890e38c2a5e 100644 --- a/superset/queries/filters.py +++ b/superset/queries/filters.py @@ -16,11 +16,11 @@ # under the License. from typing import Any -from flask import g from flask_sqlalchemy import BaseQuery from superset import security_manager from superset.models.sql_lab import Query +from superset.utils.core import get_user_id from superset.views.base import BaseFilter @@ -33,5 +33,5 @@ def apply(self, query: BaseQuery, value: Any) -> BaseQuery: :returns: query """ if not security_manager.can_access_all_queries(): - query = query.filter(Query.user_id == g.user.get_user_id()) + query = query.filter(Query.user_id == get_user_id()) return query diff --git a/superset/queries/saved_queries/api.py b/superset/queries/saved_queries/api.py index 19d4191f257b..2b70b582bb5f 100644 --- a/superset/queries/saved_queries/api.py +++ b/superset/queries/saved_queries/api.py @@ -84,6 +84,7 @@ class SavedQueryRestApi(BaseSupersetModelRestApi): base_filters = [["id", SavedQueryFilter, lambda: []]] show_columns = [ + "changed_on_delta_humanized", "created_by.first_name", "created_by.id", "created_by.last_name", @@ -95,6 +96,7 @@ class SavedQueryRestApi(BaseSupersetModelRestApi): "schema", "sql", "sql_tables", + "template_parameters", ] list_columns = [ "changed_on_delta_humanized", @@ -115,7 +117,14 @@ class SavedQueryRestApi(BaseSupersetModelRestApi): "last_run_delta_humanized", "extra", ] - add_columns = ["db_id", "description", "label", "schema", "sql"] + add_columns = [ + "db_id", + "description", + "label", + "schema", + "sql", + "template_parameters", + ] edit_columns = add_columns order_columns = [ "schema", @@ -146,7 +155,7 @@ class SavedQueryRestApi(BaseSupersetModelRestApi): related_field_filters = { "database": "database_name", } - filter_rel_fields = {"database": [["id", DatabaseFilter, lambda: []]]} + base_related_field_filters = {"database": [["id", DatabaseFilter, lambda: []]]} allowed_rel_fields = {"database"} allowed_distinct_fields = {"schema"} @@ -195,7 +204,7 @@ def bulk_delete(self, **kwargs: Any) -> Response: """ item_ids = kwargs["rison"] try: - BulkDeleteSavedQueryCommand(g.user, item_ids).run() + BulkDeleteSavedQueryCommand(item_ids).run() return self.response( 200, message=ngettext( diff --git a/superset/queries/saved_queries/commands/bulk_delete.py b/superset/queries/saved_queries/commands/bulk_delete.py index 0d199378c758..c96afd31e58a 100644 --- a/superset/queries/saved_queries/commands/bulk_delete.py +++ b/superset/queries/saved_queries/commands/bulk_delete.py @@ -17,8 +17,6 @@ import logging from typing import List, Optional -from flask_appbuilder.security.sqla.models import User - from superset.commands.base import BaseCommand from superset.dao.exceptions import DAODeleteFailedError from superset.models.dashboard import Dashboard @@ -32,8 +30,7 @@ class BulkDeleteSavedQueryCommand(BaseCommand): - def __init__(self, user: User, model_ids: List[int]): - self._actor = user + def __init__(self, model_ids: List[int]): self._model_ids = model_ids self._models: Optional[List[Dashboard]] = None diff --git a/superset/queries/saved_queries/dao.py b/superset/queries/saved_queries/dao.py index 48dc67d069db..c6bcfa035cce 100644 --- a/superset/queries/saved_queries/dao.py +++ b/superset/queries/saved_queries/dao.py @@ -42,6 +42,5 @@ def bulk_delete(models: Optional[List[SavedQuery]], commit: bool = True) -> None if commit: db.session.commit() except SQLAlchemyError as ex: - if commit: - db.session.rollback() + db.session.rollback() raise DAODeleteFailedError() from ex diff --git a/superset/queries/schemas.py b/superset/queries/schemas.py index f11cf3712775..c29c1c03b6b6 100644 --- a/superset/queries/schemas.py +++ b/superset/queries/schemas.py @@ -33,6 +33,14 @@ }, } +queries_get_updated_since_schema = { + "type": "object", + "properties": { + "last_updated_ms": {"type": "number"}, + }, + "required": ["last_updated_ms"], +} + class DatabaseSchema(Schema): database_name = fields.String() @@ -67,3 +75,11 @@ class Meta: # pylint: disable=too-few-public-methods # pylint: disable=no-self-use def get_sql_tables(self, obj: Query) -> List[Table]: return obj.sql_tables + + +class StopQuerySchema(Schema): + """ + Schema for the stop_query API call. + """ + + client_id = fields.String() diff --git a/superset/reports/api.py b/superset/reports/api.py index 046fe90595ea..d48357641731 100644 --- a/superset/reports/api.py +++ b/superset/reports/api.py @@ -17,7 +17,7 @@ import logging from typing import Any, Optional -from flask import g, request, Response +from flask import request, Response from flask_appbuilder.api import expose, permission_name, protect, rison, safe from flask_appbuilder.hooks import before_request from flask_appbuilder.models.sqla.interface import SQLAInterface @@ -30,7 +30,6 @@ from superset.dashboards.filters import DashboardAccessFilter from superset.databases.filters import DatabaseFilter from superset.extensions import event_logger -from superset.models.reports import ReportSchedule from superset.reports.commands.bulk_delete import BulkDeleteReportScheduleCommand from superset.reports.commands.create import CreateReportScheduleCommand from superset.reports.commands.delete import DeleteReportScheduleCommand @@ -44,7 +43,8 @@ ReportScheduleUpdateFailedError, ) from superset.reports.commands.update import UpdateReportScheduleCommand -from superset.reports.filters import ReportScheduleAllTextFilter +from superset.reports.filters import ReportScheduleAllTextFilter, ReportScheduleFilter +from superset.reports.models import ReportSchedule from superset.reports.schemas import ( get_delete_ids_schema, openapi_spec_methods_override, @@ -57,7 +57,7 @@ requires_json, statsd_metrics, ) -from superset.views.filters import FilterRelatedOwners +from superset.views.filters import BaseFilterRelatedUsers, FilterRelatedOwners logger = logging.getLogger(__name__) @@ -80,6 +80,10 @@ def ensure_alert_reports_enabled(self) -> Optional[Response]: resource_name = "report" allow_browser_login = True + base_filters = [ + ["id", ReportScheduleFilter, lambda: []], + ] + show_columns = [ "id", "active", @@ -94,6 +98,7 @@ def ensure_alert_reports_enabled(self) -> Optional[Response]: "database.database_name", "database.id", "description", + "extra", "force_screenshot", "grace_period", "last_eval_dttm", @@ -135,6 +140,7 @@ def ensure_alert_reports_enabled(self) -> Optional[Response]: "crontab_humanized", "dashboard_id", "description", + "extra", "id", "last_eval_dttm", "last_state", @@ -156,6 +162,7 @@ def ensure_alert_reports_enabled(self) -> Optional[Response]: "dashboard", "database", "description", + "extra", "force_screenshot", "grace_period", "log_retention", @@ -201,10 +208,13 @@ def ensure_alert_reports_enabled(self) -> Optional[Response]: ] search_filters = {"name": [ReportScheduleAllTextFilter]} allowed_rel_fields = {"owners", "chart", "dashboard", "database", "created_by"} - filter_rel_fields = { + + base_related_field_filters = { "chart": [["id", ChartFilter, lambda: []]], "dashboard": [["id", DashboardAccessFilter, lambda: []]], "database": [["id", DatabaseFilter, lambda: []]], + "owners": [["id", BaseFilterRelatedUsers, lambda: []]], + "created_by": [["id", BaseFilterRelatedUsers, lambda: []]], } text_field_rel_fields = { "dashboard": "dashboard_title", @@ -266,7 +276,7 @@ def delete(self, pk: int) -> Response: $ref: '#/components/responses/500' """ try: - DeleteReportScheduleCommand(g.user, pk).run() + DeleteReportScheduleCommand(pk).run() return self.response(200, message="OK") except ReportScheduleNotFoundError: return self.response_404() @@ -340,7 +350,7 @@ def post( except ValidationError as error: return self.response_400(message=error.messages) try: - new_model = CreateReportScheduleCommand(g.user, item).run() + new_model = CreateReportScheduleCommand(item).run() return self.response(201, id=new_model.id, result=item) except ReportScheduleNotFoundError as ex: return self.response_400(message=str(ex)) @@ -421,7 +431,7 @@ def put(self, pk: int) -> Response: except ValidationError as error: return self.response_400(message=error.messages) try: - new_model = UpdateReportScheduleCommand(g.user, pk, item).run() + new_model = UpdateReportScheduleCommand(pk, item).run() return self.response(200, id=new_model.id, result=item) except ReportScheduleNotFoundError: return self.response_404() @@ -483,7 +493,7 @@ def bulk_delete(self, **kwargs: Any) -> Response: """ item_ids = kwargs["rison"] try: - BulkDeleteReportScheduleCommand(g.user, item_ids).run() + BulkDeleteReportScheduleCommand(item_ids).run() return self.response( 200, message=ngettext( diff --git a/superset/reports/commands/alert.py b/superset/reports/commands/alert.py index 6382826aad54..c5b4709447fa 100644 --- a/superset/reports/commands/alert.py +++ b/superset/reports/commands/alert.py @@ -14,11 +14,13 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +from __future__ import annotations + import json import logging from operator import eq, ge, gt, le, lt, ne from timeit import default_timer -from typing import Optional +from typing import Any, Optional import numpy as np import pandas as pd @@ -27,7 +29,6 @@ from superset import app, jinja_context, security_manager from superset.commands.base import BaseCommand -from superset.models.reports import ReportSchedule, ReportScheduleValidatorType from superset.reports.commands.exceptions import ( AlertQueryError, AlertQueryInvalidTypeError, @@ -36,6 +37,8 @@ AlertQueryTimeout, AlertValidatorConfigError, ) +from superset.reports.models import ReportSchedule, ReportScheduleValidatorType +from superset.tasks.utils import get_executor from superset.utils.core import override_user from superset.utils.retries import retry_call @@ -83,12 +86,12 @@ def run(self) -> bool: except (KeyError, json.JSONDecodeError) as ex: raise AlertValidatorConfigError() from ex - def _validate_not_null(self, rows: np.recarray) -> None: + def _validate_not_null(self, rows: np.recarray[Any, Any]) -> None: self._validate_result(rows) self._result = rows[0][1] @staticmethod - def _validate_result(rows: np.recarray) -> None: + def _validate_result(rows: np.recarray[Any, Any]) -> None: # check if query return more than one row if len(rows) > 1: raise AlertQueryMultipleRowsError( @@ -107,7 +110,7 @@ def _validate_result(rows: np.recarray) -> None: ) ) - def _validate_operator(self, rows: np.recarray) -> None: + def _validate_operator(self, rows: np.recarray[Any, Any]) -> None: self._validate_result(rows) if rows[0][1] in (0, None, np.nan): self._result = 0.0 @@ -148,11 +151,12 @@ def _execute_query(self) -> pd.DataFrame: rendered_sql, ALERT_SQL_LIMIT ) - with override_user( - security_manager.find_user( - username=app.config["THUMBNAIL_SELENIUM_USER"] - ) - ): + _, username = get_executor( + executor_types=app.config["ALERT_REPORTS_EXECUTE_AS"], + model=self._report_schedule, + ) + user = security_manager.find_user(username) + with override_user(user): start = default_timer() df = self._report_schedule.database.get_df(sql=limited_rendered_sql) stop = default_timer() diff --git a/superset/reports/commands/base.py b/superset/reports/commands/base.py index ee2eba7139ed..81ad17d42e63 100644 --- a/superset/reports/commands/base.py +++ b/superset/reports/commands/base.py @@ -22,14 +22,15 @@ from superset.charts.dao import ChartDAO from superset.commands.base import BaseCommand from superset.dashboards.dao import DashboardDAO -from superset.models.reports import ReportCreationMethod from superset.reports.commands.exceptions import ( ChartNotFoundValidationError, ChartNotSavedValidationError, DashboardNotFoundValidationError, DashboardNotSavedValidationError, - ReportScheduleChartOrDashboardValidationError, + ReportScheduleEitherChartOrDashboardError, + ReportScheduleOnlyChartOrDashboardError, ) +from superset.reports.models import ReportCreationMethod logger = logging.getLogger(__name__) @@ -62,7 +63,8 @@ def validate_chart_dashboard( return if chart_id and dashboard_id: - exceptions.append(ReportScheduleChartOrDashboardValidationError()) + exceptions.append(ReportScheduleOnlyChartOrDashboardError()) + if chart_id: chart = ChartDAO.find_by_id(chart_id) if not chart: @@ -74,4 +76,4 @@ def validate_chart_dashboard( exceptions.append(DashboardNotFoundValidationError()) self._properties["dashboard"] = dashboard elif not update: - exceptions.append(ReportScheduleChartOrDashboardValidationError()) + exceptions.append(ReportScheduleEitherChartOrDashboardError()) diff --git a/superset/reports/commands/bulk_delete.py b/superset/reports/commands/bulk_delete.py index 4bff600d29df..28a39a2fb6ea 100644 --- a/superset/reports/commands/bulk_delete.py +++ b/superset/reports/commands/bulk_delete.py @@ -17,26 +17,23 @@ import logging from typing import List, Optional -from flask_appbuilder.security.sqla.models import User - +from superset import security_manager from superset.commands.base import BaseCommand from superset.dao.exceptions import DAODeleteFailedError from superset.exceptions import SupersetSecurityException -from superset.models.reports import ReportSchedule from superset.reports.commands.exceptions import ( ReportScheduleBulkDeleteFailedError, ReportScheduleForbiddenError, ReportScheduleNotFoundError, ) from superset.reports.dao import ReportScheduleDAO -from superset.views.base import check_ownership +from superset.reports.models import ReportSchedule logger = logging.getLogger(__name__) class BulkDeleteReportScheduleCommand(BaseCommand): - def __init__(self, user: User, model_ids: List[int]): - self._actor = user + def __init__(self, model_ids: List[int]): self._model_ids = model_ids self._models: Optional[List[ReportSchedule]] = None @@ -58,6 +55,6 @@ def validate(self) -> None: # Check ownership for model in self._models: try: - check_ownership(model) + security_manager.raise_for_ownership(model) except SupersetSecurityException as ex: raise ReportScheduleForbiddenError() from ex diff --git a/superset/reports/commands/create.py b/superset/reports/commands/create.py index 6d9161445a26..aac5f07856e5 100644 --- a/superset/reports/commands/create.py +++ b/superset/reports/commands/create.py @@ -18,14 +18,12 @@ import logging from typing import Any, Dict, List, Optional -from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User +from flask_babel import gettext as _ from marshmallow import ValidationError from superset.commands.base import CreateMixin from superset.dao.exceptions import DAOCreateFailedError from superset.databases.dao import DatabaseDAO -from superset.models.reports import ReportCreationMethod, ReportScheduleType from superset.reports.commands.base import BaseReportScheduleCommand from superset.reports.commands.exceptions import ( DatabaseNotFoundValidationError, @@ -37,16 +35,21 @@ ReportScheduleRequiredTypeValidationError, ) from superset.reports.dao import ReportScheduleDAO +from superset.reports.models import ( + ReportCreationMethod, + ReportSchedule, + ReportScheduleType, +) +from superset.reports.types import ReportScheduleExtra logger = logging.getLogger(__name__) class CreateReportScheduleCommand(CreateMixin, BaseReportScheduleCommand): - def __init__(self, user: User, data: Dict[str, Any]): - self._actor = user + def __init__(self, data: Dict[str, Any]): self._properties = data.copy() - def run(self) -> Model: + def run(self) -> ReportSchedule: self.validate() try: report_schedule = ReportScheduleDAO.create(self._properties) @@ -63,7 +66,6 @@ def validate(self) -> None: creation_method = self._properties.get("creation_method") chart_id = self._properties.get("chart") dashboard_id = self._properties.get("dashboard") - user_id = self._actor.id # Validate type is required if not report_type: @@ -99,7 +101,7 @@ def validate(self) -> None: if ( creation_method != ReportCreationMethod.ALERTS_REPORTS and not ReportScheduleDAO.validate_unique_creation_method( - user_id, dashboard_id, chart_id + dashboard_id, chart_id ) ): raise ReportScheduleCreationMethodUniquenessValidationError() @@ -110,7 +112,7 @@ def validate(self) -> None: ) try: - owners = self.populate_owners(self._actor, owner_ids) + owners = self.populate_owners(owner_ids) self._properties["owners"] = owners except ValidationError as ex: exceptions.append(ex) @@ -120,20 +122,26 @@ def validate(self) -> None: raise exception def _validate_report_extra(self, exceptions: List[ValidationError]) -> None: - extra = self._properties.get("extra") + extra: Optional[ReportScheduleExtra] = self._properties.get("extra") dashboard = self._properties.get("dashboard") if extra is None or dashboard is None: return - dashboard_tab_ids = extra.get("dashboard_tab_ids") - if dashboard_tab_ids is None: + dashboard_state = extra.get("dashboard") + if not dashboard_state: return - position_data = json.loads(dashboard.position_json) - invalid_tab_ids = [ - tab_id for tab_id in dashboard_tab_ids if tab_id not in position_data - ] + + position_data = json.loads(dashboard.position_json or "{}") + active_tabs = dashboard_state.get("activeTabs") or [] + anchor = dashboard_state.get("anchor") + invalid_tab_ids = set(active_tabs) - set(position_data.keys()) + if anchor and anchor not in position_data: + invalid_tab_ids.add(anchor) if invalid_tab_ids: exceptions.append( - ValidationError(f"Invalid tab IDs selected: {invalid_tab_ids}", "extra") + ValidationError( + _("Invalid tab ids: %s(tab_ids)", tab_ids=str(invalid_tab_ids)), + "extra", + ) ) diff --git a/superset/reports/commands/delete.py b/superset/reports/commands/delete.py index eef7a56aff79..4adf17683a6a 100644 --- a/superset/reports/commands/delete.py +++ b/superset/reports/commands/delete.py @@ -18,26 +18,24 @@ from typing import Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User +from superset import security_manager from superset.commands.base import BaseCommand from superset.dao.exceptions import DAODeleteFailedError from superset.exceptions import SupersetSecurityException -from superset.models.reports import ReportSchedule from superset.reports.commands.exceptions import ( ReportScheduleDeleteFailedError, ReportScheduleForbiddenError, ReportScheduleNotFoundError, ) from superset.reports.dao import ReportScheduleDAO -from superset.views.base import check_ownership +from superset.reports.models import ReportSchedule logger = logging.getLogger(__name__) class DeleteReportScheduleCommand(BaseCommand): - def __init__(self, user: User, model_id: int): - self._actor = user + def __init__(self, model_id: int): self._model_id = model_id self._model: Optional[ReportSchedule] = None @@ -58,6 +56,6 @@ def validate(self) -> None: # Check ownership try: - check_ownership(self._model) + security_manager.raise_for_ownership(self._model) except SupersetSecurityException as ex: raise ReportScheduleForbiddenError() from ex diff --git a/superset/reports/commands/exceptions.py b/superset/reports/commands/exceptions.py index db46503b93fd..b908042f19a1 100644 --- a/superset/reports/commands/exceptions.py +++ b/superset/reports/commands/exceptions.py @@ -14,6 +14,8 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +from typing import List + from flask_babel import lazy_gettext as _ from superset.commands.exceptions import ( @@ -24,7 +26,8 @@ ForbiddenError, ValidationError, ) -from superset.models.reports import ReportScheduleType +from superset.exceptions import SupersetError, SupersetErrorsException +from superset.reports.models import ReportScheduleType class DatabaseNotFoundValidationError(ValidationError): @@ -72,7 +75,7 @@ def __init__(self) -> None: super().__init__(_("Type is required"), field_name="type") -class ReportScheduleChartOrDashboardValidationError(ValidationError): +class ReportScheduleOnlyChartOrDashboardError(ValidationError): """ Marshmallow validation error for report schedule accept exlusive chart or dashboard """ @@ -81,6 +84,17 @@ def __init__(self) -> None: super().__init__(_("Choose a chart or dashboard not both"), field_name="chart") +class ReportScheduleEitherChartOrDashboardError(ValidationError): + """ + Marshmallow validation error for report schedule missing both dashboard and chart id + """ + + def __init__(self) -> None: + super().__init__( + _("Must choose either a chart or a dashboard"), field_name="chart" + ) + + class ChartNotSavedValidationError(ValidationError): """ Marshmallow validation error for charts that haven't been saved yet @@ -108,6 +122,7 @@ def __init__(self) -> None: class ReportScheduleInvalidError(CommandInvalidError): + status = 422 message = _("Report Schedule parameters are invalid.") @@ -124,6 +139,7 @@ class ReportScheduleUpdateFailedError(CreateFailedError): class ReportScheduleNotFoundError(CommandException): + status = 404 message = _("Report Schedule not found.") @@ -152,10 +168,12 @@ class ReportScheduleExecuteUnexpectedError(CommandException): class ReportSchedulePreviousWorkingError(CommandException): + status = 429 message = _("Report Schedule is still working, refusing to re-compute.") class ReportScheduleWorkingTimeoutError(CommandException): + status = 408 message = _("Report Schedule reached a working timeout.") @@ -177,68 +195,90 @@ class ReportScheduleCreationMethodUniquenessValidationError(CommandException): class AlertQueryMultipleRowsError(CommandException): - + status = 422 message = _("Alert query returned more than one row.") class AlertValidatorConfigError(CommandException): - + status = 422 message = _("Alert validator config error.") class AlertQueryMultipleColumnsError(CommandException): + status = 422 message = _("Alert query returned more than one column.") class AlertQueryInvalidTypeError(CommandException): + status = 422 message = _("Alert query returned a non-number value.") class AlertQueryError(CommandException): + """ + SQL query is not valid + """ + + status = 400 message = _("Alert found an error while executing a query.") class AlertQueryTimeout(CommandException): + status = 408 message = _("A timeout occurred while executing the query.") class ReportScheduleScreenshotTimeout(CommandException): + status = 408 message = _("A timeout occurred while taking a screenshot.") class ReportScheduleCsvTimeout(CommandException): + status = 408 message = _("A timeout occurred while generating a csv.") class ReportScheduleDataFrameTimeout(CommandException): + status = 408 message = _("A timeout occurred while generating a dataframe.") class ReportScheduleAlertGracePeriodError(CommandException): + status = 429 message = _("Alert fired during grace period.") class ReportScheduleAlertEndGracePeriodError(CommandException): + status = 429 message = _("Alert ended grace period.") class ReportScheduleNotificationError(CommandException): + status = 429 message = _("Alert on grace period") -class ReportScheduleSelleniumUserNotFoundError(CommandException): - message = _("Report Schedule sellenium user not found") - - class ReportScheduleStateNotFoundError(CommandException): message = _("Report Schedule state not found") +class ReportScheduleSystemErrorsException(CommandException, SupersetErrorsException): + errors: List[SupersetError] = [] + message = _("Report schedule system error") + + +class ReportScheduleClientErrorsException(CommandException, SupersetErrorsException): + status = 400 + errors: List[SupersetError] = [] + message = _("Report schedule client error") + + class ReportScheduleUnexpectedError(CommandException): message = _("Report schedule unexpected error") class ReportScheduleForbiddenError(ForbiddenError): + status = 403 message = _("Changing this report is forbidden") diff --git a/superset/reports/commands/execute.py b/superset/reports/commands/execute.py index ad1b1edcd2a7..c8edd928b478 100644 --- a/superset/reports/commands/execute.py +++ b/superset/reports/commands/execute.py @@ -17,43 +17,38 @@ import json import logging from datetime import datetime, timedelta -from typing import Any, List, Optional +from typing import Any, List, Optional, Union from uuid import UUID import pandas as pd from celery.exceptions import SoftTimeLimitExceeded -from flask_appbuilder.security.sqla.models import User from sqlalchemy.orm import Session from superset import app, security_manager from superset.commands.base import BaseCommand from superset.commands.exceptions import CommandException from superset.common.chart_data import ChartDataResultFormat, ChartDataResultType -from superset.extensions import feature_flag_manager, machine_auth_provider_factory -from superset.models.reports import ( - ReportDataFormat, - ReportExecutionLog, - ReportRecipients, - ReportRecipientType, - ReportSchedule, - ReportScheduleType, - ReportState, +from superset.dashboards.permalink.commands.create import ( + CreateDashboardPermalinkCommand, ) +from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from superset.exceptions import SupersetErrorsException, SupersetException +from superset.extensions import feature_flag_manager, machine_auth_provider_factory from superset.reports.commands.alert import AlertCommand from superset.reports.commands.exceptions import ( ReportScheduleAlertGracePeriodError, + ReportScheduleClientErrorsException, ReportScheduleCsvFailedError, ReportScheduleCsvTimeout, ReportScheduleDataFrameFailedError, ReportScheduleDataFrameTimeout, ReportScheduleExecuteUnexpectedError, ReportScheduleNotFoundError, - ReportScheduleNotificationError, ReportSchedulePreviousWorkingError, ReportScheduleScreenshotFailedError, ReportScheduleScreenshotTimeout, - ReportScheduleSelleniumUserNotFoundError, ReportScheduleStateNotFoundError, + ReportScheduleSystemErrorsException, ReportScheduleUnexpectedError, ReportScheduleWorkingTimeoutError, ) @@ -61,18 +56,25 @@ REPORT_SCHEDULE_ERROR_NOTIFICATION_MARKER, ReportScheduleDAO, ) +from superset.reports.models import ( + ReportDataFormat, + ReportExecutionLog, + ReportRecipients, + ReportRecipientType, + ReportSchedule, + ReportScheduleType, + ReportSourceFormat, + ReportState, +) from superset.reports.notifications import create_notification from superset.reports.notifications.base import NotificationContent from superset.reports.notifications.exceptions import NotificationError +from superset.tasks.utils import get_executor from superset.utils.celery import session_scope +from superset.utils.core import HeaderDataType, override_user from superset.utils.csv import get_chart_csv_data, get_chart_dataframe -from superset.utils.screenshots import ( - BaseScreenshot, - ChartScreenshot, - DashboardScreenshot, -) +from superset.utils.screenshots import ChartScreenshot, DashboardScreenshot from superset.utils.urls import get_url_path -from superset.utils.webdriver import DashboardStandaloneMode logger = logging.getLogger(__name__) @@ -103,7 +105,6 @@ def update_report_schedule_and_log( Update the report schedule state et al. and reflect the change in the execution log. """ - self.update_report_schedule(state) self.create_log(error_message) @@ -167,97 +168,84 @@ def _get_url( force=force, ) return get_url_path( - "Superset.explore", + "ExploreView.root", user_friendly=user_friendly, form_data=json.dumps({"slice_id": self._report_schedule.chart_id}), - standalone="true", force=force, **kwargs, ) + + # If we need to render dashboard in a specific state, use stateful permalink + dashboard_state = self._report_schedule.extra.get("dashboard") + if dashboard_state: + permalink_key = CreateDashboardPermalinkCommand( + dashboard_id=str(self._report_schedule.dashboard_id), + state=dashboard_state, + ).run() + return get_url_path("Superset.dashboard_permalink", key=permalink_key) + return get_url_path( "Superset.dashboard", user_friendly=user_friendly, dashboard_id_or_slug=self._report_schedule.dashboard_id, - standalone=DashboardStandaloneMode.REPORT.value, force=force, **kwargs, ) - @staticmethod - def _get_user() -> User: - user = security_manager.find_user( - username=app.config["THUMBNAIL_SELENIUM_USER"] - ) - if not user: - raise ReportScheduleSelleniumUserNotFoundError() - return user - def _get_screenshots(self) -> List[bytes]: """ Get chart or dashboard screenshots :raises: ReportScheduleScreenshotFailedError """ - image_data = [] - screenshots: List[BaseScreenshot] = [] + url = self._get_url() + _, username = get_executor( + executor_types=app.config["ALERT_REPORTS_EXECUTE_AS"], + model=self._report_schedule, + ) + user = security_manager.find_user(username) if self._report_schedule.chart: - url = self._get_url() - logger.info("Screenshotting chart at %s", url) - screenshots = [ - ChartScreenshot( - url, - self._report_schedule.chart.digest, - window_size=app.config["WEBDRIVER_WINDOW"]["slice"], - thumb_size=app.config["WEBDRIVER_WINDOW"]["slice"], - ) - ] + screenshot: Union[ChartScreenshot, DashboardScreenshot] = ChartScreenshot( + url, + self._report_schedule.chart.digest, + window_size=app.config["WEBDRIVER_WINDOW"]["slice"], + thumb_size=app.config["WEBDRIVER_WINDOW"]["slice"], + ) else: - tabs: Optional[List[str]] = json.loads(self._report_schedule.extra).get( - "dashboard_tab_ids", None + screenshot = DashboardScreenshot( + url, + self._report_schedule.dashboard.digest, + window_size=app.config["WEBDRIVER_WINDOW"]["dashboard"], + thumb_size=app.config["WEBDRIVER_WINDOW"]["dashboard"], ) - dashboard_base_url = self._get_url() - if tabs is None: - urls = [dashboard_base_url] - else: - urls = [f"{dashboard_base_url}#{tab_id}" for tab_id in tabs] - screenshots = [ - DashboardScreenshot( - url, - self._report_schedule.dashboard.digest, - window_size=app.config["WEBDRIVER_WINDOW"]["dashboard"], - thumb_size=app.config["WEBDRIVER_WINDOW"]["dashboard"], - ) - for url in urls - ] - user = self._get_user() - for screenshot in screenshots: - try: - image = screenshot.get_screenshot(user=user) - except SoftTimeLimitExceeded as ex: - logger.warning("A timeout occurred while taking a screenshot.") - raise ReportScheduleScreenshotTimeout() from ex - except Exception as ex: - raise ReportScheduleScreenshotFailedError( - f"Failed taking a screenshot {str(ex)}" - ) from ex - if image is not None: - image_data.append(image) - if not image_data: + try: + image = screenshot.get_screenshot(user=user) + except SoftTimeLimitExceeded as ex: + logger.warning("A timeout occurred while taking a screenshot.") + raise ReportScheduleScreenshotTimeout() from ex + except Exception as ex: + raise ReportScheduleScreenshotFailedError( + f"Failed taking a screenshot {str(ex)}" + ) from ex + if not image: raise ReportScheduleScreenshotFailedError() - return image_data + return [image] def _get_csv_data(self) -> bytes: url = self._get_url(result_format=ChartDataResultFormat.CSV) - auth_cookies = machine_auth_provider_factory.instance.get_auth_cookies( - self._get_user() + _, username = get_executor( + executor_types=app.config["ALERT_REPORTS_EXECUTE_AS"], + model=self._report_schedule, ) + user = security_manager.find_user(username) + auth_cookies = machine_auth_provider_factory.instance.get_auth_cookies(user) if self._report_schedule.chart.query_context is None: logger.warning("No query context found, taking a screenshot to generate it") self._update_query_context() try: - logger.info("Getting chart from %s", url) - csv_data = get_chart_csv_data(url, auth_cookies) + logger.info("Getting chart from %s as user %s", url, user.username) + csv_data = get_chart_csv_data(chart_url=url, auth_cookies=auth_cookies) except SoftTimeLimitExceeded as ex: raise ReportScheduleCsvTimeout() from ex except Exception as ex: @@ -273,16 +261,19 @@ def _get_embedded_data(self) -> pd.DataFrame: Return data as a Pandas dataframe, to embed in notifications as a table. """ url = self._get_url(result_format=ChartDataResultFormat.JSON) - auth_cookies = machine_auth_provider_factory.instance.get_auth_cookies( - self._get_user() + _, username = get_executor( + executor_types=app.config["ALERT_REPORTS_EXECUTE_AS"], + model=self._report_schedule, ) + user = security_manager.find_user(username) + auth_cookies = machine_auth_provider_factory.instance.get_auth_cookies(user) if self._report_schedule.chart.query_context is None: logger.warning("No query context found, taking a screenshot to generate it") self._update_query_context() try: - logger.info("Getting chart from %s", url) + logger.info("Getting chart from %s as user %s", url, user.username) dataframe = get_chart_dataframe(url, auth_cookies) except SoftTimeLimitExceeded as ex: raise ReportScheduleDataFrameTimeout() from ex @@ -315,6 +306,27 @@ def _update_query_context(self) -> None: "Please try loading the chart and saving it again." ) from ex + def _get_log_data(self) -> HeaderDataType: + chart_id = None + dashboard_id = None + report_source = None + if self._report_schedule.chart: + report_source = ReportSourceFormat.CHART + chart_id = self._report_schedule.chart_id + else: + report_source = ReportSourceFormat.DASHBOARD + dashboard_id = self._report_schedule.dashboard_id + + log_data: HeaderDataType = { + "notification_type": self._report_schedule.type, + "notification_source": report_source, + "notification_format": self._report_schedule.report_format, + "chart_id": chart_id, + "dashboard_id": dashboard_id, + "owners": self._report_schedule.owners, + } + return log_data + def _get_notification_content(self) -> NotificationContent: """ Gets a notification content, this is composed by a title and a screenshot @@ -325,6 +337,7 @@ def _get_notification_content(self) -> NotificationContent: embedded_data = None error_text = None screenshot_data = [] + header_data = self._get_log_data() url = self._get_url(user_friendly=True) if ( feature_flag_manager.is_feature_enabled("ALERTS_ATTACH_REPORTS") @@ -343,7 +356,9 @@ def _get_notification_content(self) -> NotificationContent: error_text = "Unexpected missing csv file" if error_text: return NotificationContent( - name=self._report_schedule.name, text=error_text + name=self._report_schedule.name, + text=error_text, + header_data=header_data, ) if ( @@ -362,6 +377,7 @@ def _get_notification_content(self) -> NotificationContent: f"{self._report_schedule.name}: " f"{self._report_schedule.dashboard.dashboard_title}" ) + return NotificationContent( name=name, url=url, @@ -369,6 +385,7 @@ def _get_notification_content(self) -> NotificationContent: description=self._report_schedule.description, csv=csv_data, embedded_data=embedded_data, + header_data=header_data, ) def _send( @@ -379,9 +396,9 @@ def _send( """ Sends a notification to all recipients - :raises: ReportScheduleNotificationError + :raises: CommandException """ - notification_errors = [] + notification_errors: List[SupersetError] = [] for recipient in recipients: notification = create_notification(recipient, notification_content) try: @@ -393,17 +410,32 @@ def _send( ) else: notification.send() - except NotificationError as ex: - # collect notification errors but keep processing them - notification_errors.append(str(ex)) + except (NotificationError, SupersetException) as ex: + # collect errors but keep processing them + notification_errors.append( + SupersetError( + message=ex.message, + error_type=SupersetErrorType.REPORT_NOTIFICATION_ERROR, + level=ErrorLevel.ERROR + if ex.status >= 500 + else ErrorLevel.WARNING, + ) + ) if notification_errors: - raise ReportScheduleNotificationError(";".join(notification_errors)) + # log all errors but raise based on the most severe + for error in notification_errors: + logger.warning(str(error)) + + if any(error.level == ErrorLevel.ERROR for error in notification_errors): + raise ReportScheduleSystemErrorsException(errors=notification_errors) + if any(error.level == ErrorLevel.WARNING for error in notification_errors): + raise ReportScheduleClientErrorsException(errors=notification_errors) def send(self) -> None: """ Creates the notification content and sends them to all recipients - :raises: ReportScheduleNotificationError + :raises: CommandException """ notification_content = self._get_notification_content() self._send(notification_content, self._report_schedule.recipients) @@ -412,9 +444,17 @@ def send_error(self, name: str, message: str) -> None: """ Creates and sends a notification for an error, to all recipients - :raises: ReportScheduleNotificationError + :raises: CommandException """ - notification_content = NotificationContent(name=name, text=message) + header_data = self._get_log_data() + logger.info( + "header_data in notifications for alerts and reports %s, taskid, %s", + header_data, + self._execution_id, + ) + notification_content = NotificationContent( + name=name, text=message, header_data=header_data + ) # filter recipients to recipients who are also owners owner_recipients = [ @@ -502,25 +542,34 @@ def next(self) -> None: return self.send() self.update_report_schedule_and_log(ReportState.SUCCESS) - except CommandException as first_ex: + except (SupersetErrorsException, Exception) as first_ex: + error_message = str(first_ex) + if isinstance(first_ex, SupersetErrorsException): + error_message = ";".join([error.message for error in first_ex.errors]) + self.update_report_schedule_and_log( - ReportState.ERROR, error_message=str(first_ex) + ReportState.ERROR, error_message=error_message ) + # TODO (dpgaspar) convert this logic to a new state eg: ERROR_ON_GRACE if not self.is_in_error_grace_period(): + second_error_message = REPORT_SCHEDULE_ERROR_NOTIFICATION_MARKER try: self.send_error( f"Error occurred for {self._report_schedule.type}:" f" {self._report_schedule.name}", str(first_ex), ) - self.update_report_schedule_and_log( - ReportState.ERROR, - error_message=REPORT_SCHEDULE_ERROR_NOTIFICATION_MARKER, + + except SupersetErrorsException as second_ex: + second_error_message = ";".join( + [error.message for error in second_ex.errors] ) - except CommandException as second_ex: + except Exception as second_ex: # pylint: disable=broad-except + second_error_message = str(second_ex) + finally: self.update_report_schedule_and_log( - ReportState.ERROR, error_message=str(second_ex) + ReportState.ERROR, error_message=second_error_message ) raise first_ex @@ -575,7 +624,7 @@ def next(self) -> None: if not AlertCommand(self._report_schedule).run(): self.update_report_schedule_and_log(ReportState.NOOP) return - except CommandException as ex: + except Exception as ex: self.send_error( f"Error occurred for {self._report_schedule.type}:" f" {self._report_schedule.name}", @@ -590,7 +639,7 @@ def next(self) -> None: try: self.send() self.update_report_schedule_and_log(ReportState.SUCCESS) - except CommandException as ex: + except Exception as ex: # pylint: disable=broad-except self.update_report_schedule_and_log( ReportState.ERROR, error_message=str(ex) ) @@ -652,9 +701,20 @@ def run(self) -> None: self.validate(session=session) if not self._model: raise ReportScheduleExecuteUnexpectedError() - ReportScheduleStateMachine( - session, self._execution_id, self._model, self._scheduled_dttm - ).run() + _, username = get_executor( + executor_types=app.config["ALERT_REPORTS_EXECUTE_AS"], + model=self._model, + ) + user = security_manager.find_user(username) + with override_user(user): + logger.info( + "Running report schedule %s as user %s", + self._execution_id, + username, + ) + ReportScheduleStateMachine( + session, self._execution_id, self._model, self._scheduled_dttm + ).run() except CommandException as ex: raise ex except Exception as ex: @@ -664,6 +724,13 @@ def validate( # pylint: disable=arguments-differ self, session: Session = None ) -> None: # Validate/populate model exists - self._model = ReportScheduleDAO.find_by_id(self._model_id, session=session) + logger.info( + "session is validated: id %s, executionid: %s", + self._model_id, + self._execution_id, + ) + self._model = ( + session.query(ReportSchedule).filter_by(id=self._model_id).one_or_none() + ) if not self._model: raise ReportScheduleNotFoundError() diff --git a/superset/reports/commands/log_prune.py b/superset/reports/commands/log_prune.py index 4b577b1f55dc..badd267ecfdd 100644 --- a/superset/reports/commands/log_prune.py +++ b/superset/reports/commands/log_prune.py @@ -19,9 +19,9 @@ from superset.commands.base import BaseCommand from superset.dao.exceptions import DAODeleteFailedError -from superset.models.reports import ReportSchedule from superset.reports.commands.exceptions import ReportSchedulePruneLogError from superset.reports.dao import ReportScheduleDAO +from superset.reports.models import ReportSchedule from superset.utils.celery import session_scope logger = logging.getLogger(__name__) diff --git a/superset/reports/commands/update.py b/superset/reports/commands/update.py index 201d961863d4..3399eca7b72c 100644 --- a/superset/reports/commands/update.py +++ b/superset/reports/commands/update.py @@ -19,14 +19,13 @@ from typing import Any, Dict, List, Optional from flask_appbuilder.models.sqla import Model -from flask_appbuilder.security.sqla.models import User from marshmallow import ValidationError +from superset import security_manager from superset.commands.base import UpdateMixin from superset.dao.exceptions import DAOUpdateFailedError from superset.databases.dao import DatabaseDAO from superset.exceptions import SupersetSecurityException -from superset.models.reports import ReportSchedule, ReportScheduleType, ReportState from superset.reports.commands.base import BaseReportScheduleCommand from superset.reports.commands.exceptions import ( DatabaseNotFoundValidationError, @@ -37,14 +36,13 @@ ReportScheduleUpdateFailedError, ) from superset.reports.dao import ReportScheduleDAO -from superset.views.base import check_ownership +from superset.reports.models import ReportSchedule, ReportScheduleType, ReportState logger = logging.getLogger(__name__) class UpdateReportScheduleCommand(UpdateMixin, BaseReportScheduleCommand): - def __init__(self, user: User, model_id: int, data: Dict[str, Any]): - self._actor = user + def __init__(self, model_id: int, data: Dict[str, Any]): self._model_id = model_id self._properties = data.copy() self._model: Optional[ReportSchedule] = None @@ -113,7 +111,7 @@ def validate(self) -> None: # Check ownership try: - check_ownership(self._model) + security_manager.raise_for_ownership(self._model) except SupersetSecurityException as ex: raise ReportScheduleForbiddenError() from ex @@ -121,7 +119,7 @@ def validate(self) -> None: if owner_ids is None: owner_ids = [owner.id for owner in self._model.owners] try: - owners = self.populate_owners(self._actor, owner_ids) + owners = self.populate_owners(owner_ids) self._properties["owners"] = owners except ValidationError as ex: exceptions.append(ex) diff --git a/superset/reports/dao.py b/superset/reports/dao.py index 312710fe037c..be5ee8053c48 100644 --- a/superset/reports/dao.py +++ b/superset/reports/dao.py @@ -26,13 +26,15 @@ from superset.dao.base import BaseDAO from superset.dao.exceptions import DAOCreateFailedError, DAODeleteFailedError from superset.extensions import db -from superset.models.reports import ( +from superset.reports.filters import ReportScheduleFilter +from superset.reports.models import ( ReportExecutionLog, ReportRecipients, ReportSchedule, ReportScheduleType, ReportState, ) +from superset.utils.core import get_user_id logger = logging.getLogger(__name__) @@ -42,6 +44,7 @@ class ReportScheduleDAO(BaseDAO): model_cls = ReportSchedule + base_filter = ReportScheduleFilter @staticmethod def find_by_chart_id(chart_id: int) -> List[ReportSchedule]: @@ -110,20 +113,19 @@ def bulk_delete( if commit: db.session.commit() except SQLAlchemyError as ex: - if commit: - db.session.rollback() + db.session.rollback() raise DAODeleteFailedError(str(ex)) from ex @staticmethod def validate_unique_creation_method( - user_id: int, dashboard_id: Optional[int] = None, chart_id: Optional[int] = None + dashboard_id: Optional[int] = None, chart_id: Optional[int] = None ) -> bool: """ Validate if the user already has a chart or dashboard with a report attached form the self subscribe reports """ - query = db.session.query(ReportSchedule).filter_by(created_by_fk=user_id) + query = db.session.query(ReportSchedule).filter_by(created_by_fk=get_user_id()) if dashboard_id is not None: query = query.filter(ReportSchedule.dashboard_id == dashboard_id) @@ -154,7 +156,7 @@ def validate_update_uniqueness( return found_id is None or found_id == expect_id @classmethod - def create(cls, properties: Dict[str, Any], commit: bool = True) -> Model: + def create(cls, properties: Dict[str, Any], commit: bool = True) -> ReportSchedule: """ create a report schedule and nested recipients :raises: DAOCreateFailedError @@ -186,7 +188,7 @@ def create(cls, properties: Dict[str, Any], commit: bool = True) -> Model: @classmethod def update( cls, model: Model, properties: Dict[str, Any], commit: bool = True - ) -> Model: + ) -> ReportSchedule: """ create a report schedule and nested recipients :raises: DAOCreateFailedError @@ -323,6 +325,5 @@ def bulk_delete_logs( session.commit() return row_count except SQLAlchemyError as ex: - if commit: - session.rollback() + session.rollback() raise DAODeleteFailedError(str(ex)) from ex diff --git a/superset/reports/filters.py b/superset/reports/filters.py index 82ea73a91a9f..5fb87e056334 100644 --- a/superset/reports/filters.py +++ b/superset/reports/filters.py @@ -20,10 +20,26 @@ from sqlalchemy import or_ from sqlalchemy.orm.query import Query -from superset.models.reports import ReportSchedule +from superset import db, security_manager +from superset.reports.models import ReportSchedule from superset.views.base import BaseFilter +class ReportScheduleFilter(BaseFilter): # pylint: disable=too-few-public-methods + def apply(self, query: Query, value: Any) -> Query: + if security_manager.can_access_all_datasources(): + return query + owner_ids_query = ( + db.session.query(ReportSchedule.id) + .join(ReportSchedule.owners) + .filter( + security_manager.user_model.id + == security_manager.user_model.get_user_id() + ) + ) + return query.filter(ReportSchedule.id.in_(owner_ids_query)) + + class ReportScheduleAllTextFilter(BaseFilter): # pylint: disable=too-few-public-methods name = _("All Text") arg_name = "report_all_text" diff --git a/superset/reports/logs/api.py b/superset/reports/logs/api.py index 6b11da556f67..41c47e36522d 100644 --- a/superset/reports/logs/api.py +++ b/superset/reports/logs/api.py @@ -25,8 +25,8 @@ from superset import is_feature_enabled from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod -from superset.models.reports import ReportExecutionLog from superset.reports.logs.schemas import openapi_spec_methods_override +from superset.reports.models import ReportExecutionLog from superset.views.base_api import BaseSupersetModelRestApi logger = logging.getLogger(__name__) diff --git a/superset/models/reports.py b/superset/reports/models.py similarity index 92% rename from superset/models/reports.py rename to superset/reports/models.py index b0aa94d9a77c..24d4657b7dae 100644 --- a/superset/models/reports.py +++ b/superset/reports/models.py @@ -16,8 +16,6 @@ # under the License. """A collection of ORM sqlalchemy models for Superset""" import enum -import json -from typing import Any, Dict, Optional from cron_descriptor import get_description from flask_appbuilder import Model @@ -33,15 +31,16 @@ Table, Text, ) -from sqlalchemy.orm import backref, relationship, validates +from sqlalchemy.orm import backref, relationship from sqlalchemy.schema import UniqueConstraint from sqlalchemy_utils import UUIDType from superset.extensions import security_manager from superset.models.core import Database from superset.models.dashboard import Dashboard -from superset.models.helpers import AuditMixinNullable +from superset.models.helpers import AuditMixinNullable, ExtraJSONMixin from superset.models.slice import Slice +from superset.reports.types import ReportScheduleExtra metadata = Model.metadata # pylint: disable=no-member @@ -83,6 +82,11 @@ class ReportCreationMethod(str, enum.Enum): ALERTS_REPORTS = "alerts_reports" +class ReportSourceFormat(str, enum.Enum): + CHART = "chart" + DASHBOARD = "dashboard" + + report_schedule_user = Table( "report_schedule_user", metadata, @@ -95,7 +99,7 @@ class ReportCreationMethod(str, enum.Enum): ) -class ReportSchedule(Model, AuditMixinNullable): +class ReportSchedule(Model, AuditMixinNullable, ExtraJSONMixin): """ Report Schedules, supports alerts and reports @@ -147,12 +151,11 @@ class ReportSchedule(Model, AuditMixinNullable): # (Alerts/Reports) Unlock a possible stalled working state working_timeout = Column(Integer, default=60 * 60 * 1) - # Store the selected dashboard tabs etc. - extra = Column(Text, default="{}") - # (Reports) When generating a screenshot, bypass the cache? force_screenshot = Column(Boolean, default=False) + extra: ReportScheduleExtra # type: ignore + def __repr__(self) -> str: return str(self.name) @@ -160,13 +163,6 @@ def __repr__(self) -> str: def crontab_humanized(self) -> str: return get_description(self.crontab) - @validates("extra") - # pylint: disable=unused-argument,no-self-use - def validate_extra(self, key: str, value: Dict[Any, Any]) -> Optional[str]: - if value is not None: - return json.dumps(value) - return None - class ReportRecipients(Model, AuditMixinNullable): """ diff --git a/superset/reports/notifications/__init__.py b/superset/reports/notifications/__init__.py index dae43d64c7ca..c466f59abd5b 100644 --- a/superset/reports/notifications/__init__.py +++ b/superset/reports/notifications/__init__.py @@ -15,7 +15,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from superset.models.reports import ReportRecipients +from superset.reports.models import ReportRecipients from superset.reports.notifications.base import BaseNotification, NotificationContent from superset.reports.notifications.email import EmailNotification from superset.reports.notifications.slack import SlackNotification diff --git a/superset/reports/notifications/base.py b/superset/reports/notifications/base.py index 06bfecf79014..6eb2405d0ff6 100644 --- a/superset/reports/notifications/base.py +++ b/superset/reports/notifications/base.py @@ -20,12 +20,14 @@ import pandas as pd -from superset.models.reports import ReportRecipients, ReportRecipientType +from superset.reports.models import ReportRecipients, ReportRecipientType +from superset.utils.core import HeaderDataType @dataclass class NotificationContent: name: str + header_data: HeaderDataType # this is optional to account for error states csv: Optional[bytes] = None # bytes for csv file screenshots: Optional[List[bytes]] = None # bytes for a list of screenshots text: Optional[str] = None diff --git a/superset/reports/notifications/email.py b/superset/reports/notifications/email.py index 3991f24b9264..22b1714f99fe 100644 --- a/superset/reports/notifications/email.py +++ b/superset/reports/notifications/email.py @@ -26,22 +26,48 @@ from flask_babel import gettext as __ from superset import app -from superset.models.reports import ReportRecipientType +from superset.exceptions import SupersetErrorsException +from superset.reports.models import ReportRecipientType from superset.reports.notifications.base import BaseNotification from superset.reports.notifications.exceptions import NotificationError -from superset.utils.core import send_email_smtp +from superset.utils.core import HeaderDataType, send_email_smtp from superset.utils.decorators import statsd_gauge -from superset.utils.urls import modify_url_query logger = logging.getLogger(__name__) TABLE_TAGS = ["table", "th", "tr", "td", "thead", "tbody", "tfoot"] TABLE_ATTRIBUTES = ["colspan", "rowspan", "halign", "border", "class"] +ALLOWED_TAGS = [ + "a", + "abbr", + "acronym", + "b", + "blockquote", + "br", + "code", + "div", + "em", + "i", + "li", + "ol", + "p", + "strong", + "ul", +] + TABLE_TAGS + +ALLOWED_ATTRIBUTES = { + "a": ["href", "title"], + "abbr": ["title"], + "acronym": ["title"], + **{tag: TABLE_ATTRIBUTES for tag in TABLE_TAGS}, +} + @dataclass class EmailContent: body: str + header_data: Optional[HeaderDataType] = None data: Optional[Dict[str, Any]] = None images: Optional[Dict[str, bytes]] = None @@ -82,25 +108,26 @@ def _get_content(self) -> EmailContent: } # Strip any malicious HTML from the description - description = bleach.clean(self._content.description or "") + description = bleach.clean( + self._content.description or "", + tags=ALLOWED_TAGS, + attributes=ALLOWED_ATTRIBUTES, + ) # Strip malicious HTML from embedded data, allowing only table elements if self._content.embedded_data is not None: df = self._content.embedded_data html_table = bleach.clean( - df.to_html(na_rep="", index=True), + df.to_html(na_rep="", index=True, escape=True), + # pandas will escape the HTML in cells already, so passing + # more allowed tags here will not work tags=TABLE_TAGS, attributes=TABLE_ATTRIBUTES, ) else: html_table = "" - call_to_action = __("Explore in Superset") - url = ( - modify_url_query(self._content.url, standalone="0") - if self._content.url is not None - else "" - ) + call_to_action = __(app.config["EMAIL_REPORTS_CTA"]) img_tags = [] for msgid in images.keys(): img_tags.append( @@ -127,8 +154,9 @@ def _get_content(self) -> EmailContent: </style> </head> <body> - <p>{description}</p> - <b><a href="{url}">{call_to_action}</a></b><p></p> + <div>{description}</div> + <br> + <b><a href="{self._content.url}">{call_to_action}</a></b><p></p> {html_table} {img_tag} </body> @@ -138,7 +166,12 @@ def _get_content(self) -> EmailContent: if self._content.csv: csv_data = {__("%(name)s.csv", name=self._content.name): self._content.csv} - return EmailContent(body=body, images=images, data=csv_data) + return EmailContent( + body=body, + images=images, + data=csv_data, + header_data=self._content.header_data, + ) def _get_subject(self) -> str: return __( @@ -167,7 +200,14 @@ def send(self) -> None: bcc="", mime_subtype="related", dryrun=False, + header_data=content.header_data, + ) + logger.info( + "Report sent to email, notification content is %s", content.header_data ) - logger.info("Report sent to email") + except SupersetErrorsException as ex: + raise NotificationError( + ";".join([error.message for error in ex.errors]) + ) from ex except Exception as ex: - raise NotificationError(ex) from ex + raise NotificationError(str(ex)) from ex diff --git a/superset/reports/notifications/exceptions.py b/superset/reports/notifications/exceptions.py index 749a91fd955b..aa06906f826b 100644 --- a/superset/reports/notifications/exceptions.py +++ b/superset/reports/notifications/exceptions.py @@ -14,7 +14,33 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +from superset.exceptions import SupersetException -class NotificationError(Exception): - pass +class NotificationError(SupersetException): + """ + Generic unknown exception - only used when + bubbling up unknown exceptions from lower levels + """ + + +class NotificationParamException(SupersetException): + status = 422 + + +class NotificationAuthorizationException(SupersetException): + status = 401 + + +class NotificationUnprocessableException(SupersetException): + """ + When a third party client service is down. + The request should be retried. There is no further + action required on our part or the user's other than to retry + """ + + status = 400 + + +class NotificationMalformedException(SupersetException): + status = 400 diff --git a/superset/reports/notifications/slack.py b/superset/reports/notifications/slack.py index 2a198d66453c..b89a700ef9c3 100644 --- a/superset/reports/notifications/slack.py +++ b/superset/reports/notifications/slack.py @@ -22,15 +22,28 @@ import backoff from flask_babel import gettext as __ -from slack import WebClient -from slack.errors import SlackApiError, SlackClientError +from slack_sdk import WebClient +from slack_sdk.errors import ( + BotUserAccessError, + SlackApiError, + SlackClientConfigurationError, + SlackClientError, + SlackClientNotConnectedError, + SlackObjectFormationError, + SlackRequestError, + SlackTokenRotationError, +) from superset import app -from superset.models.reports import ReportRecipientType +from superset.reports.models import ReportRecipientType from superset.reports.notifications.base import BaseNotification -from superset.reports.notifications.exceptions import NotificationError +from superset.reports.notifications.exceptions import ( + NotificationAuthorizationException, + NotificationMalformedException, + NotificationParamException, + NotificationUnprocessableException, +) from superset.utils.decorators import statsd_gauge -from superset.utils.urls import modify_url_query logger = logging.getLogger(__name__) @@ -49,11 +62,6 @@ def _get_channel(self) -> str: return json.loads(self._recipient.recipient_config_json)["target"] def _message_template(self, table: str = "") -> str: - url = ( - modify_url_query(self._content.url, standalone="0") - if self._content.url is not None - else "" - ) return __( """*%(name)s* @@ -65,7 +73,7 @@ def _message_template(self, table: str = "") -> str: """, name=self._content.name, description=self._content.description or "", - url=url, + url=self._content.url, table=table, ) @@ -173,5 +181,19 @@ def send(self) -> None: else: client.chat_postMessage(channel=channel, text=body) logger.info("Report sent to slack") + except ( + BotUserAccessError, + SlackRequestError, + SlackClientConfigurationError, + ) as ex: + raise NotificationParamException(str(ex)) from ex + except SlackObjectFormationError as ex: + raise NotificationMalformedException(str(ex)) from ex + except SlackTokenRotationError as ex: + raise NotificationAuthorizationException(str(ex)) from ex + except (SlackClientNotConnectedError, SlackApiError) as ex: + raise NotificationUnprocessableException(str(ex)) from ex except SlackClientError as ex: - raise NotificationError(ex) from ex + # this is the base class for all slack client errors + # keep it last so that it doesn't interfere with @backoff + raise NotificationUnprocessableException(str(ex)) from ex diff --git a/superset/reports/schemas.py b/superset/reports/schemas.py index a0ce67d80dbb..c64593f7f961 100644 --- a/superset/reports/schemas.py +++ b/superset/reports/schemas.py @@ -23,7 +23,7 @@ from marshmallow_enum import EnumField from pytz import all_timezones -from superset.models.reports import ( +from superset.reports.models import ( ReportCreationMethod, ReportDataFormat, ReportRecipientType, @@ -297,4 +297,5 @@ class ReportSchedulePutSchema(Schema): default=ReportDataFormat.VISUALIZATION, validate=validate.OneOf(choices=tuple(key.value for key in ReportDataFormat)), ) + extra = fields.Dict(default=None) force_screenshot = fields.Boolean(default=False) diff --git a/superset/reports/types.py b/superset/reports/types.py new file mode 100644 index 000000000000..d487e3ad2376 --- /dev/null +++ b/superset/reports/types.py @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from typing import TypedDict + +from superset.dashboards.permalink.types import DashboardPermalinkState + + +class ReportScheduleExtra(TypedDict): + dashboard: DashboardPermalinkState diff --git a/superset/result_set.py b/superset/result_set.py index 725bf1449cc7..1c4ae98dc911 100644 --- a/superset/result_set.py +++ b/superset/result_set.py @@ -24,6 +24,7 @@ import numpy as np import pandas as pd import pyarrow as pa +from numpy.typing import NDArray from superset.db_engine_specs import BaseEngineSpec from superset.superset_typing import DbapiDescription, DbapiResult, ResultSetColumnType @@ -62,9 +63,23 @@ def stringify(obj: Any) -> str: return json.dumps(obj, default=utils.json_iso_dttm_ser) -def stringify_values(array: np.ndarray) -> np.ndarray: - vstringify = np.vectorize(stringify) - return vstringify(array) +def stringify_values(array: NDArray[Any]) -> NDArray[Any]: + result = np.copy(array) + + with np.nditer(result, flags=["refs_ok"], op_flags=[["readwrite"]]) as it: + for obj in it: + if na_obj := pd.isna(obj): + # pandas <NA> type cannot be converted to string + obj[na_obj] = None # type: ignore + else: + try: + # for simple string conversions + # this handles odd character types better + obj[...] = obj.astype(str) # type: ignore + except ValueError: + obj[...] = stringify(obj) # type: ignore + + return result def destringify(obj: str) -> Any: @@ -97,7 +112,7 @@ def __init__( # pylint: disable=too-many-locals pa_data: List[pa.Array] = [] deduped_cursor_desc: List[Tuple[Any, ...]] = [] numpy_dtype: List[Tuple[str, ...]] = [] - stringified_arr: np.ndarray + stringified_arr: NDArray[Any] if cursor_description: # get deduped list of column names @@ -126,6 +141,7 @@ def __init__( # pylint: disable=too-many-locals pa.lib.ArrowInvalid, pa.lib.ArrowTypeError, pa.lib.ArrowNotImplementedError, + ValueError, TypeError, # this is super hackey, # https://issues.apache.org/jira/browse/ARROW-7855 ): @@ -161,6 +177,9 @@ def __init__( # pylint: disable=too-many-locals except Exception as ex: # pylint: disable=broad-except logger.exception(ex) + if not pa_data: + column_names = [] + self.table = pa.Table.from_arrays(pa_data, names=column_names) self._type_dict: Dict[str, Any] = {} try: @@ -195,7 +214,7 @@ def convert_table_to_df(table: pa.Table) -> pd.DataFrame: return table.to_pandas(integer_object_nulls=True, timestamp_as_object=True) @staticmethod - def first_nonempty(items: List[Any]) -> Any: + def first_nonempty(items: NDArray[Any]) -> Any: return next((i for i in items if i), None) def is_temporal(self, db_type_str: Optional[str]) -> bool: diff --git a/superset/security/api.py b/superset/security/api.py index 2fa8c713ef24..093a7c6d63ea 100644 --- a/superset/security/api.py +++ b/superset/security/api.py @@ -33,7 +33,11 @@ ) from superset.extensions import event_logger from superset.security.guest_token import GuestTokenResourceType -from superset.views.base_api import BaseSupersetModelRestApi +from superset.views.base_api import ( + BaseSupersetApi, + BaseSupersetModelRestApi, + statsd_metrics, +) logger = logging.getLogger(__name__) @@ -80,7 +84,7 @@ class GuestTokenCreateSchema(PermissiveSchema): guest_token_create_schema = GuestTokenCreateSchema() -class SecurityRestApi(BaseApi): +class SecurityRestApi(BaseSupersetApi): resource_name = "security" allow_browser_login = True openapi_spec_tag = "Security" @@ -89,6 +93,7 @@ class SecurityRestApi(BaseApi): @event_logger.log_this @protect() @safe + @statsd_metrics @permission_name("read") def csrf_token(self) -> Response: """ @@ -118,6 +123,7 @@ def csrf_token(self) -> Response: @event_logger.log_this @protect() @safe + @statsd_metrics @permission_name("grant_guest_token") def guest_token(self) -> Response: """Response diff --git a/superset/security/manager.py b/superset/security/manager.py index f07729875837..49edc26639a8 100644 --- a/superset/security/manager.py +++ b/superset/security/manager.py @@ -40,9 +40,11 @@ from flask_appbuilder.security.sqla.models import ( assoc_permissionview_role, assoc_user_role, + Permission, PermissionView, Role, User, + ViewMenu, ) from flask_appbuilder.security.views import ( PermissionModelView, @@ -52,16 +54,16 @@ ViewMenuModelView, ) from flask_appbuilder.widgets import ListWidget +from flask_babel import lazy_gettext as _ from flask_login import AnonymousUserMixin, LoginManager from jwt.api_jwt import _jwt_global_obj -from sqlalchemy import and_, or_ +from sqlalchemy import and_, inspect, or_ from sqlalchemy.engine.base import Connection from sqlalchemy.orm import Session from sqlalchemy.orm.mapper import Mapper from sqlalchemy.orm.query import Query as SqlaQuery from superset import sql_parse -from superset.connectors.connector_registry import ConnectorRegistry from superset.constants import RouteMethod from superset.errors import ErrorLevel, SupersetError, SupersetErrorType from superset.exceptions import ( @@ -76,12 +78,18 @@ GuestTokenUser, GuestUser, ) -from superset.utils.core import DatasourceName, RowLevelSecurityFilterType +from superset.utils.core import ( + DatasourceName, + DatasourceType, + get_user_id, + RowLevelSecurityFilterType, +) from superset.utils.urls import get_url_host if TYPE_CHECKING: from superset.common.query_context import QueryContext from superset.connectors.base.models import BaseDatasource + from superset.connectors.sqla.models import SqlaTable from superset.models.core import Database from superset.models.dashboard import Dashboard from superset.models.sql_lab import Query @@ -156,6 +164,7 @@ class SupersetSecurityManager( # pylint: disable=too-many-public-methods GAMMA_READ_ONLY_MODEL_VIEWS = { "Dataset", "Datasource", + "CssTemplate", } | READ_ONLY_MODEL_VIEWS ADMIN_ONLY_VIEW_MENUS = { @@ -177,10 +186,11 @@ class SupersetSecurityManager( # pylint: disable=too-many-public-methods "Queries", "Import dashboards", "Upload a CSV", + "ReportSchedule", + "Alerts & Report", } ADMIN_ONLY_PERMISSIONS = { - "can_sql_json", # TODO: move can_sql_json to sql_lab role "can_override_role_permissions", "can_sync_druid_source", "can_override_role_permissions", @@ -215,11 +225,11 @@ class SupersetSecurityManager( # pylint: disable=too-many-public-methods ACCESSIBLE_PERMS = {"can_userinfo", "resetmypassword"} - SQLLAB_PERMISSION_VIEWS = { - ("can_csv", "Superset"), + SQLLAB_ONLY_PERMISSIONS = { + ("can_my_queries", "SqlLab"), ("can_read", "SavedQuery"), - ("can_read", "Database"), ("can_sql_json", "Superset"), + ("can_sqllab_history", "Superset"), ("can_sqllab_viz", "Superset"), ("can_sqllab_table_viz", "Superset"), ("can_sqllab", "Superset"), @@ -229,6 +239,12 @@ class SupersetSecurityManager( # pylint: disable=too-many-public-methods ("menu_access", "Query Search"), } + SQLLAB_EXTRA_PERMISSION_VIEWS = { + ("can_csv", "Superset"), + ("can_read", "Superset"), + ("can_read", "Database"), + } + data_access_permissions = ( "database_access", "schema_access", @@ -270,6 +286,14 @@ def get_schema_perm( # pylint: disable=no-self-use return None + @staticmethod + def get_database_perm(database_id: int, database_name: str) -> str: + return f"[{database_name}].(id:{database_id})" + + @staticmethod + def get_dataset_perm(dataset_id: int, dataset_name: str, database_name: str) -> str: + return f"[{database_name}].[{dataset_name}](id:{dataset_id})" + def unpack_database_and_schema( # pylint: disable=no-self-use self, schema_permission: str ) -> DatabaseAndSchema: @@ -384,8 +408,10 @@ def get_datasource_access_error_msg(datasource: "BaseDatasource") -> str: :returns: The error message """ - return f"""This endpoint requires the datasource {datasource.name}, database or - `all_datasource_access` permission""" + return ( + f"This endpoint requires the datasource {datasource.name}, " + "database or `all_datasource_access` permission" + ) @staticmethod def get_datasource_access_link( # pylint: disable=unused-argument @@ -472,23 +498,25 @@ def get_user_datasources(self) -> List["BaseDatasource"]: user_perms = self.user_view_menu_names("datasource_access") schema_perms = self.user_view_menu_names("schema_access") user_datasources = set() - for datasource_class in ConnectorRegistry.sources.values(): - user_datasources.update( - self.get_session.query(datasource_class) - .filter( - or_( - datasource_class.perm.in_(user_perms), - datasource_class.schema_perm.in_(schema_perms), - ) + + # pylint: disable=import-outside-toplevel + from superset.connectors.sqla.models import SqlaTable + + user_datasources.update( + self.get_session.query(SqlaTable) + .filter( + or_( + SqlaTable.perm.in_(user_perms), + SqlaTable.schema_perm.in_(schema_perms), ) - .all() ) + .all() + ) # group all datasources by database - all_datasources = ConnectorRegistry.get_all_datasources(self.get_session) - datasources_by_database: Dict["Database", Set["BaseDatasource"]] = defaultdict( - set - ) + session = self.get_session + all_datasources = SqlaTable.get_all_datasources(session) + datasources_by_database: Dict["Database", Set["SqlaTable"]] = defaultdict(set) for datasource in all_datasources: datasources_by_database[datasource.database].add(datasource) @@ -529,7 +557,7 @@ def user_view_menu_names(self, permission_name: str) -> Set[str]: view_menu_names = ( base_query.join(assoc_user_role) .join(self.user_model) - .filter(self.user_model.id == g.user.get_id()) + .filter(self.user_model.id == get_user_id()) .filter(self.permission_model.name == permission_name) ).all() return {s.name for s in view_menu_names} @@ -600,6 +628,8 @@ def get_datasources_accessible_by_user( # pylint: disable=invalid-name :param schema: The fallback SQL schema if not present in the table name :returns: The list of accessible SQL tables w/ schema """ + # pylint: disable=import-outside-toplevel + from superset.connectors.sqla.models import SqlaTable if self.can_access_database(database): return datasource_names @@ -611,7 +641,7 @@ def get_datasources_accessible_by_user( # pylint: disable=invalid-name user_perms = self.user_view_menu_names("datasource_access") schema_perms = self.user_view_menu_names("schema_access") - user_datasources = ConnectorRegistry.query_datasources_by_permissions( + user_datasources = SqlaTable.query_datasources_by_permissions( self.get_session, database, user_perms, schema_perms ) if schema: @@ -661,6 +691,7 @@ def create_missing_perms(self) -> None: """ # pylint: disable=import-outside-toplevel + from superset.connectors.sqla.models import SqlaTable from superset.models import core as models logger.info("Fetching a set of all perms to lookup which ones are missing") @@ -669,13 +700,13 @@ def create_missing_perms(self) -> None: if pv.permission and pv.view_menu: all_pvs.add((pv.permission.name, pv.view_menu.name)) - def merge_pv(view_menu: str, perm: str) -> None: + def merge_pv(view_menu: str, perm: Optional[str]) -> None: """Create permission view menu only if it doesn't exist""" if view_menu and perm and (view_menu, perm) not in all_pvs: self.add_permission_view_menu(view_menu, perm) logger.info("Creating missing datasource permissions.") - datasources = ConnectorRegistry.get_all_datasources(self.get_session) + datasources = SqlaTable.get_all_datasources(self.get_session) for datasource in datasources: merge_pv("datasource_access", datasource.get_perm()) merge_pv("schema_access", datasource.get_schema_perm()) @@ -887,7 +918,9 @@ def _is_alpha_pvm(self, pvm: PermissionView) -> bool: """ return not ( - self._is_user_defined_permission(pvm) or self._is_admin_only(pvm) + self._is_user_defined_permission(pvm) + or self._is_admin_only(pvm) + or self._is_sql_lab_only(pvm) ) or self._is_accessible_to_all(pvm) def _is_gamma_pvm(self, pvm: PermissionView) -> bool: @@ -903,8 +936,19 @@ def _is_gamma_pvm(self, pvm: PermissionView) -> bool: self._is_user_defined_permission(pvm) or self._is_admin_only(pvm) or self._is_alpha_only(pvm) + or self._is_sql_lab_only(pvm) ) or self._is_accessible_to_all(pvm) + def _is_sql_lab_only(self, pvm: PermissionView) -> bool: + """ + Return True if the FAB permission/view is only SQL Lab related, False + otherwise. + + :param pvm: The FAB permission/view + :returns: Whether the FAB object is SQL Lab related + """ + return (pvm.permission.name, pvm.view_menu.name) in self.SQLLAB_ONLY_PERMISSIONS + def _is_sql_lab_pvm(self, pvm: PermissionView) -> bool: """ Return True if the FAB permission/view is SQL Lab related, False @@ -913,7 +957,11 @@ def _is_sql_lab_pvm(self, pvm: PermissionView) -> bool: :param pvm: The FAB permission/view :returns: Whether the FAB object is SQL Lab related """ - return (pvm.permission.name, pvm.view_menu.name) in self.SQLLAB_PERMISSION_VIEWS + return ( + self._is_sql_lab_only(pvm) + or (pvm.permission.name, pvm.view_menu.name) + in self.SQLLAB_EXTRA_PERMISSION_VIEWS + ) def _is_granter_pvm( # pylint: disable=no-self-use self, pvm: PermissionView @@ -928,85 +976,776 @@ def _is_granter_pvm( # pylint: disable=no-self-use return pvm.permission.name in {"can_override_role_permissions", "can_approve"} - def set_perm( # pylint: disable=unused-argument - self, mapper: Mapper, connection: Connection, target: "BaseDatasource" + def database_after_insert( + self, + mapper: Mapper, + connection: Connection, + target: "Database", ) -> None: """ - Set the datasource permissions. + Handles permissions when a database is created. + Triggered by a SQLAlchemy after_insert event. - :param mapper: The table mapper - :param connection: The DB-API connection - :param target: The mapped instance being persisted + We need to create: + - The database PVM + + :param mapper: The SQLA mapper + :param connection: The SQLA connection + :param target: The changed database object + :return: + """ + self._insert_pvm_on_sqla_event( + mapper, connection, "database_access", target.get_perm() + ) + + def database_after_delete( + self, + mapper: Mapper, + connection: Connection, + target: "Database", + ) -> None: + """ + Handles permissions update when a database is deleted. + Triggered by a SQLAlchemy after_delete event. + + We need to delete: + - The database PVM + + :param mapper: The SQLA mapper + :param connection: The SQLA connection + :param target: The changed database object + :return: + """ + self._delete_vm_database_access( + mapper, connection, target.id, target.database_name + ) + + def database_after_update( + self, + mapper: Mapper, + connection: Connection, + target: "Database", + ) -> None: + """ + Handles all permissions update when a database is changed. + Triggered by a SQLAlchemy after_update event. + + We need to update: + - The database PVM + - All datasets PVMs that reference the db, and it's local perm name + - All datasets local schema perm that reference the db. + - All charts local perm related with said datasets + - All charts local schema perm related with said datasets + + :param mapper: The SQLA mapper + :param connection: The SQLA connection + :param target: The changed database object + :return: + """ + # Check if database name has changed + state = inspect(target) + history = state.get_history("database_name", True) + if not history.has_changes() or not history.deleted: + return + + old_database_name = history.deleted[0] + # update database access permission + self._update_vm_database_access(mapper, connection, old_database_name, target) + # update datasource access + self._update_vm_datasources_access( + mapper, connection, old_database_name, target + ) + # Note schema permissions are updated at the API level + # (database.commands.update). Since we need to fetch all existing schemas from + # the db + + def _delete_vm_database_access( + self, + mapper: Mapper, + connection: Connection, + database_id: int, + database_name: str, + ) -> None: + view_menu_name = self.get_database_perm(database_id, database_name) + # Clean database access permission + self._delete_pvm_on_sqla_event( + mapper, connection, "database_access", view_menu_name + ) + # Clean database schema permissions + schema_pvms = ( + self.get_session.query(self.permissionview_model) + .join(self.permission_model) + .join(self.viewmenu_model) + .filter(self.permission_model.name == "schema_access") + .filter(self.viewmenu_model.name.like(f"[{database_name}].[%]")) + .all() + ) + for schema_pvm in schema_pvms: + self._delete_pvm_on_sqla_event(mapper, connection, pvm=schema_pvm) + + def _update_vm_database_access( + self, + mapper: Mapper, + connection: Connection, + old_database_name: str, + target: "Database", + ) -> Optional[ViewMenu]: + """ + Helper method that Updates all database access permission + when a database name changes. + + :param connection: Current connection (called on SQLAlchemy event listener scope) + :param old_database_name: the old database name + :param target: The database object + :return: A list of changed view menus (permission resource names) + """ + view_menu_table = self.viewmenu_model.__table__ # pylint: disable=no-member + new_database_name = target.database_name + old_view_menu_name = self.get_database_perm(target.id, old_database_name) + new_view_menu_name = self.get_database_perm(target.id, new_database_name) + db_pvm = self.find_permission_view_menu("database_access", old_view_menu_name) + if not db_pvm: + logger.warning( + "Could not find previous database permission %s", + old_view_menu_name, + ) + self._insert_pvm_on_sqla_event( + mapper, connection, "database_access", new_view_menu_name + ) + return None + new_updated_pvm = self.find_permission_view_menu( + "database_access", new_view_menu_name + ) + if new_updated_pvm: + logger.info( + "New permission [%s] already exists, deleting the previous", + new_view_menu_name, + ) + self._delete_vm_database_access( + mapper, connection, target.id, old_database_name + ) + return None + connection.execute( + view_menu_table.update() + .where(view_menu_table.c.id == db_pvm.view_menu_id) + .values(name=new_view_menu_name) + ) + new_db_view_menu = self._find_view_menu_on_sqla_event( + connection, new_view_menu_name + ) + + self.on_view_menu_after_update(mapper, connection, new_db_view_menu) + return new_db_view_menu + + def _update_vm_datasources_access( # pylint: disable=too-many-locals + self, + mapper: Mapper, + connection: Connection, + old_database_name: str, + target: "Database", + ) -> List[ViewMenu]: + """ + Helper method that Updates all datasource access permission + when a database name changes. + + :param connection: Current connection (called on SQLAlchemy event listener scope) + :param old_database_name: the old database name + :param target: The database object + :return: A list of changed view menus (permission resource names) + """ + from superset.connectors.sqla.models import ( # pylint: disable=import-outside-toplevel + SqlaTable, + ) + from superset.models.slice import ( # pylint: disable=import-outside-toplevel + Slice, + ) + + view_menu_table = self.viewmenu_model.__table__ # pylint: disable=no-member + sqlatable_table = SqlaTable.__table__ # pylint: disable=no-member + chart_table = Slice.__table__ # pylint: disable=no-member + new_database_name = target.database_name + datasets = ( + self.get_session.query(SqlaTable) + .filter(SqlaTable.database_id == target.id) + .all() + ) + updated_view_menus: List[ViewMenu] = [] + for dataset in datasets: + old_dataset_vm_name = self.get_dataset_perm( + dataset.id, dataset.table_name, old_database_name + ) + new_dataset_vm_name = self.get_dataset_perm( + dataset.id, dataset.table_name, new_database_name + ) + new_dataset_view_menu = self.find_view_menu(new_dataset_vm_name) + if new_dataset_view_menu: + continue + connection.execute( + view_menu_table.update() + .where(view_menu_table.c.name == old_dataset_vm_name) + .values(name=new_dataset_vm_name) + ) + # After update refresh + new_dataset_view_menu = self._find_view_menu_on_sqla_event( + connection, new_dataset_vm_name + ) + + # Update dataset (SqlaTable perm field) + connection.execute( + sqlatable_table.update() + .where( + sqlatable_table.c.id == dataset.id, + sqlatable_table.c.perm == old_dataset_vm_name, + ) + .values(perm=new_dataset_vm_name) + ) + # Update charts (Slice perm field) + connection.execute( + chart_table.update() + .where(chart_table.c.perm == old_dataset_vm_name) + .values(perm=new_dataset_vm_name) + ) + self.on_view_menu_after_update(mapper, connection, new_dataset_view_menu) + updated_view_menus.append(new_dataset_view_menu) + return updated_view_menus + + def dataset_after_insert( + self, + mapper: Mapper, + connection: Connection, + target: "SqlaTable", + ) -> None: + """ + Handles permission creation when a dataset is inserted. + Triggered by a SQLAlchemy after_insert event. + + We need to create: + - The dataset PVM and set local and schema perm + + :param mapper: The SQLA mapper + :param connection: The SQLA connection + :param target: The changed dataset object + :return: """ + from superset.models.core import ( # pylint: disable=import-outside-toplevel + Database, + ) + try: - target_get_perm = target.get_perm() + dataset_perm = target.get_perm() + database = target.database except DatasetInvalidPermissionEvaluationException: - logger.warning("Dataset has no database refusing to set permission") - return - link_table = target.__table__ - if target.perm != target_get_perm: + logger.warning( + "Dataset has no database will retry with database_id to set permission" + ) + database = self.get_session.query(Database).get(target.database_id) + dataset_perm = self.get_dataset_perm( + target.id, target.table_name, database.database_name + ) + dataset_table = target.__table__ + + self._insert_pvm_on_sqla_event( + mapper, connection, "datasource_access", dataset_perm + ) + if target.perm != dataset_perm: + target.perm = dataset_perm connection.execute( - link_table.update() - .where(link_table.c.id == target.id) - .values(perm=target_get_perm) + dataset_table.update() + .where(dataset_table.c.id == target.id) + .values(perm=dataset_perm) ) - target.perm = target_get_perm - if ( - hasattr(target, "schema_perm") - and target.schema_perm != target.get_schema_perm() - ): + if target.schema: + dataset_schema_perm = self.get_schema_perm( + database.database_name, target.schema + ) + self._insert_pvm_on_sqla_event( + mapper, connection, "schema_access", dataset_schema_perm + ) + target.schema_perm = dataset_schema_perm connection.execute( - link_table.update() - .where(link_table.c.id == target.id) - .values(schema_perm=target.get_schema_perm()) + dataset_table.update() + .where(dataset_table.c.id == target.id) + .values(schema_perm=dataset_schema_perm) ) - target.schema_perm = target.get_schema_perm() - pvm_names = [] - if target.__tablename__ in {"dbs", "clusters"}: - pvm_names.append(("database_access", target_get_perm)) - else: - pvm_names.append(("datasource_access", target_get_perm)) - if target.schema: - pvm_names.append(("schema_access", target.get_schema_perm())) - - # TODO(bogdan): modify slice permissions as well. - for permission_name, view_menu_name in pvm_names: - permission = self.find_permission(permission_name) - view_menu = self.find_view_menu(view_menu_name) - pv = None - - if not permission: - permission_table = ( - self.permission_model.__table__ # pylint: disable=no-member - ) - connection.execute( - permission_table.insert().values(name=permission_name) - ) - permission = self.find_permission(permission_name) - if not view_menu: - view_menu_table = ( - self.viewmenu_model.__table__ # pylint: disable=no-member - ) - connection.execute(view_menu_table.insert().values(name=view_menu_name)) - view_menu = self.find_view_menu(view_menu_name) - - if permission and view_menu: - pv = ( - self.get_session.query(self.permissionview_model) - .filter_by(permission=permission, view_menu=view_menu) - .first() - ) - if not pv and permission and view_menu: - permission_view_table = ( - self.permissionview_model.__table__ # pylint: disable=no-member - ) - connection.execute( - permission_view_table.insert().values( - permission_id=permission.id, view_menu_id=view_menu.id - ) - ) + def dataset_after_delete( + self, + mapper: Mapper, + connection: Connection, + target: "SqlaTable", + ) -> None: + """ + Handles permissions update when a dataset is deleted. + Triggered by a SQLAlchemy after_delete event. + + We need to delete: + - The dataset PVM + + :param mapper: The SQLA mapper + :param connection: The SQLA connection + :param target: The changed dataset object + :return: + """ + dataset_vm_name = self.get_dataset_perm( + target.id, target.table_name, target.database.database_name + ) + self._delete_pvm_on_sqla_event( + mapper, connection, "datasource_access", dataset_vm_name + ) + + def dataset_after_update( + self, + mapper: Mapper, + connection: Connection, + target: "SqlaTable", + ) -> None: + """ + Handles all permissions update when a dataset is changed. + Triggered by a SQLAlchemy after_update event. + + We need to update: + - The dataset PVM and local perm + - All charts local perm related with said datasets + - All charts local schema perm related with said datasets + + :param mapper: The SQLA mapper + :param connection: The SQLA connection + :param target: The changed dataset object + :return: + """ + # Check if watched fields have changed + state = inspect(target) + history_database = state.get_history("database_id", True) + history_table_name = state.get_history("table_name", True) + history_schema = state.get_history("schema", True) + + # When database name changes + if history_database.has_changes() and history_database.deleted: + new_dataset_vm_name = self.get_dataset_perm( + target.id, target.table_name, target.database.database_name + ) + self._update_dataset_perm( + mapper, connection, target.perm, new_dataset_vm_name, target + ) + + # Updates schema permissions + new_dataset_schema_name = self.get_schema_perm( + target.database.database_name, target.schema + ) + self._update_dataset_schema_perm( + mapper, + connection, + new_dataset_schema_name, + target, + ) + + # When table name changes + if history_table_name.has_changes() and history_table_name.deleted: + old_dataset_name = history_table_name.deleted[0] + new_dataset_vm_name = self.get_dataset_perm( + target.id, target.table_name, target.database.database_name + ) + old_dataset_vm_name = self.get_dataset_perm( + target.id, old_dataset_name, target.database.database_name + ) + self._update_dataset_perm( + mapper, connection, old_dataset_vm_name, new_dataset_vm_name, target + ) + + # When schema changes + if history_schema.has_changes() and history_schema.deleted: + new_dataset_schema_name = self.get_schema_perm( + target.database.database_name, target.schema + ) + self._update_dataset_schema_perm( + mapper, + connection, + new_dataset_schema_name, + target, + ) + + def _update_dataset_schema_perm( + self, + mapper: Mapper, + connection: Connection, + new_schema_permission_name: Optional[str], + target: "SqlaTable", + ) -> None: + """ + Helper method that is called by SQLAlchemy events on datasets to update + a new schema permission name, propagates the name change to datasets and charts. + + If the schema permission name does not exist already has a PVM, + creates a new one. + + :param mapper: The SQLA event mapper + :param connection: The SQLA connection + :param new_schema_permission_name: The new schema permission name that changed + :param target: Dataset that was updated + :return: + """ + from superset.connectors.sqla.models import ( # pylint: disable=import-outside-toplevel + SqlaTable, + ) + from superset.models.slice import ( # pylint: disable=import-outside-toplevel + Slice, + ) + + sqlatable_table = SqlaTable.__table__ # pylint: disable=no-member + chart_table = Slice.__table__ # pylint: disable=no-member + + # insert new schema PVM if it does not exist + self._insert_pvm_on_sqla_event( + mapper, connection, "schema_access", new_schema_permission_name + ) + + # Update dataset (SqlaTable schema_perm field) + connection.execute( + sqlatable_table.update() + .where( + sqlatable_table.c.id == target.id, + ) + .values(schema_perm=new_schema_permission_name) + ) + + # Update charts (Slice schema_perm field) + connection.execute( + chart_table.update() + .where( + chart_table.c.datasource_id == target.id, + chart_table.c.datasource_type == DatasourceType.TABLE, + ) + .values(schema_perm=new_schema_permission_name) + ) + + def _update_dataset_perm( # pylint: disable=too-many-arguments + self, + mapper: Mapper, + connection: Connection, + old_permission_name: Optional[str], + new_permission_name: Optional[str], + target: "SqlaTable", + ) -> None: + """ + Helper method that is called by SQLAlchemy events on datasets to update + a permission name change, propagates the name change to VM, datasets and charts. + + :param mapper: + :param connection: + :param old_permission_name + :param new_permission_name: + :param target: + :return: + """ + from superset.connectors.sqla.models import ( # pylint: disable=import-outside-toplevel + SqlaTable, + ) + from superset.models.slice import ( # pylint: disable=import-outside-toplevel + Slice, + ) + + view_menu_table = self.viewmenu_model.__table__ # pylint: disable=no-member + sqlatable_table = SqlaTable.__table__ # pylint: disable=no-member + chart_table = Slice.__table__ # pylint: disable=no-member + + new_dataset_view_menu = self.find_view_menu(new_permission_name) + if new_dataset_view_menu: + return + # Update VM + connection.execute( + view_menu_table.update() + .where(view_menu_table.c.name == old_permission_name) + .values(name=new_permission_name) + ) + # VM changed, so call hook + new_dataset_view_menu = self.find_view_menu(new_permission_name) + self.on_view_menu_after_update(mapper, connection, new_dataset_view_menu) + # Update dataset (SqlaTable perm field) + connection.execute( + sqlatable_table.update() + .where( + sqlatable_table.c.id == target.id, + ) + .values(perm=new_permission_name) + ) + # Update charts (Slice perm field) + connection.execute( + chart_table.update() + .where( + chart_table.c.datasource_type == DatasourceType.TABLE, + chart_table.c.datasource_id == target.id, + ) + .values(perm=new_permission_name) + ) + + def _delete_pvm_on_sqla_event( # pylint: disable=too-many-arguments + self, + mapper: Mapper, + connection: Connection, + permission_name: Optional[str] = None, + view_menu_name: Optional[str] = None, + pvm: Optional[PermissionView] = None, + ) -> None: + """ + Helper method that is called by SQLAlchemy events. + Deletes a PVM. + + :param mapper: The SQLA event mapper + :param connection: The SQLA connection + :param permission_name: e.g.: datasource_access, schema_access + :param view_menu_name: e.g. [db1].[public] + :param pvm: Can be called with the actual PVM already + :return: + """ + view_menu_table = self.viewmenu_model.__table__ # pylint: disable=no-member + permission_view_menu_table = ( + self.permissionview_model.__table__ # pylint: disable=no-member + ) + + if not pvm: + pvm = self.find_permission_view_menu(permission_name, view_menu_name) + if not pvm: + return + # Delete Any Role to PVM association + connection.execute( + assoc_permissionview_role.delete().where( + assoc_permissionview_role.c.permission_view_id == pvm.id + ) + ) + # Delete the database access PVM + connection.execute( + permission_view_menu_table.delete().where( + permission_view_menu_table.c.id == pvm.id + ) + ) + self.on_permission_view_after_delete(mapper, connection, pvm) + connection.execute( + view_menu_table.delete().where(view_menu_table.c.id == pvm.view_menu_id) + ) + + def _find_permission_on_sqla_event( + self, connection: Connection, name: str + ) -> Permission: + """ + Find a FAB Permission using a SQLA connection. + + A session.query may not return the latest results on newly created/updated + objects/rows using connection. On this case we should use a connection also + + :param connection: SQLAlchemy connection + :param name: The permission name (it's unique) + :return: Permission + """ + permission_table = self.permission_model.__table__ # pylint: disable=no-member + + permission_ = connection.execute( + permission_table.select().where(permission_table.c.name == name) + ).fetchone() + permission = Permission() + # ensures this object is never persisted + permission.metadata = None + permission.id = permission_.id + permission.name = permission_.name + return permission + + def _find_view_menu_on_sqla_event( + self, connection: Connection, name: str + ) -> ViewMenu: + """ + Find a FAB ViewMenu using a SQLA connection. + + A session.query may not return the latest results on newly created/updated + objects/rows using connection. On this case we should use a connection also + + :param connection: SQLAlchemy connection + :param name: The ViewMenu name (it's unique) + :return: ViewMenu + """ + view_menu_table = self.viewmenu_model.__table__ # pylint: disable=no-member + + view_menu_ = connection.execute( + view_menu_table.select().where(view_menu_table.c.name == name) + ).fetchone() + view_menu = ViewMenu() + # ensures this object is never persisted + view_menu.metadata = None + view_menu.id = view_menu_.id + view_menu.name = view_menu_.name + return view_menu + + def _insert_pvm_on_sqla_event( + self, + mapper: Mapper, + connection: Connection, + permission_name: str, + view_menu_name: Optional[str], + ) -> None: + """ + Helper method that is called by SQLAlchemy events. + Inserts a new PVM (if it does not exist already) + + :param mapper: The SQLA event mapper + :param connection: The SQLA connection + :param permission_name: e.g.: datasource_access, schema_access + :param view_menu_name: e.g. [db1].[public] + :return: + """ + permission_table = self.permission_model.__table__ # pylint: disable=no-member + view_menu_table = self.viewmenu_model.__table__ # pylint: disable=no-member + permission_view_table = ( + self.permissionview_model.__table__ # pylint: disable=no-member + ) + if not view_menu_name: + return + pvm = self.find_permission_view_menu(permission_name, view_menu_name) + if pvm: + return + permission = self.find_permission(permission_name) + view_menu = self.find_view_menu(view_menu_name) + if not permission: + _ = connection.execute( + permission_table.insert().values(name=permission_name) + ) + permission = self._find_permission_on_sqla_event( + connection, permission_name + ) + self.on_permission_after_insert(mapper, connection, permission) + if not view_menu: + _ = connection.execute(view_menu_table.insert().values(name=view_menu_name)) + view_menu = self._find_view_menu_on_sqla_event(connection, view_menu_name) + self.on_view_menu_after_insert(mapper, connection, view_menu) + connection.execute( + permission_view_table.insert().values( + permission_id=permission.id, view_menu_id=view_menu.id + ) + ) + permission_view = connection.execute( + permission_view_table.select().where( + permission_view_table.c.permission_id == permission.id, + permission_view_table.c.view_menu_id == view_menu.id, + ) + ).fetchone() + permission_view_model = PermissionView() + permission_view_model.metadata = None + permission_view_model.id = permission_view.id + permission_view_model.permission_id = permission.id + permission_view_model.view_menu_id = view_menu.id + permission_view_model.permission = permission + permission_view_model.view_menu = view_menu + self.on_permission_view_after_insert(mapper, connection, permission_view_model) + + def on_role_after_update( + self, mapper: Mapper, connection: Connection, target: Role + ) -> None: + """ + Hook that allows for further custom operations when a Role update + is created by SQLAlchemy events. + + On SQLAlchemy after_insert events, we cannot + create new view_menu's using a session, so any SQLAlchemy events hooked to + `ViewMenu` will not trigger an after_insert. + + :param mapper: The table mapper + :param connection: The DB-API connection + :param target: The mapped instance being changed + """ + + def on_view_menu_after_insert( + self, mapper: Mapper, connection: Connection, target: ViewMenu + ) -> None: + """ + Hook that allows for further custom operations when a new ViewMenu + is created by set_perm. + + On SQLAlchemy after_insert events, we cannot + create new view_menu's using a session, so any SQLAlchemy events hooked to + `ViewMenu` will not trigger an after_insert. + + :param mapper: The table mapper + :param connection: The DB-API connection + :param target: The mapped instance being persisted + """ + + def on_view_menu_after_update( + self, mapper: Mapper, connection: Connection, target: ViewMenu + ) -> None: + """ + Hook that allows for further custom operations when a new ViewMenu + is updated + + Since the update may be performed on after_update event. We cannot + update ViewMenus using a session, so any SQLAlchemy events hooked to + `ViewMenu` will not trigger an after_update. + + :param mapper: The table mapper + :param connection: The DB-API connection + :param target: The mapped instance being persisted + """ + + def on_permission_after_insert( + self, mapper: Mapper, connection: Connection, target: Permission + ) -> None: + """ + Hook that allows for further custom operations when a new permission + is created by set_perm. + + Since set_perm is executed by SQLAlchemy after_insert events, we cannot + create new permissions using a session, so any SQLAlchemy events hooked to + `Permission` will not trigger an after_insert. + + :param mapper: The table mapper + :param connection: The DB-API connection + :param target: The mapped instance being persisted + """ + + def on_permission_view_after_insert( + self, mapper: Mapper, connection: Connection, target: PermissionView + ) -> None: + """ + Hook that allows for further custom operations when a new PermissionView + is created by SQLAlchemy events. + + On SQLAlchemy after_insert events, we cannot + create new pvms using a session, so any SQLAlchemy events hooked to + `PermissionView` will not trigger an after_insert. + + :param mapper: The table mapper + :param connection: The DB-API connection + :param target: The mapped instance being persisted + """ + + def on_permission_view_after_delete( + self, mapper: Mapper, connection: Connection, target: PermissionView + ) -> None: + """ + Hook that allows for further custom operations when a new PermissionView + is delete by SQLAlchemy events. + + On SQLAlchemy after_delete events, we cannot + delete pvms using a session, so any SQLAlchemy events hooked to + `PermissionView` will not trigger an after_delete. + + :param mapper: The table mapper + :param connection: The DB-API connection + :param target: The mapped instance being persisted + """ + + @staticmethod + def get_exclude_users_from_lists() -> List[str]: + """ + Override to dynamically identify a list of usernames to exclude from + all UI dropdown lists, owners, created_by filters etc... + + It will exclude all users from the all endpoints of the form + ``/api/v1/<modelview>/related/<column>`` + + Optionally you can also exclude them using the `EXCLUDE_USERS_FROM_LISTS` + config setting. + + :return: A list of usernames + """ + return [] def raise_for_access( # pylint: disable=too-many-arguments,too-many-locals @@ -1034,7 +1773,6 @@ def raise_for_access( from superset.connectors.sqla.models import SqlaTable from superset.extensions import feature_flag_manager from superset.sql_parse import Table - from superset.views.utils import is_owner if database and table or query: if query: @@ -1067,7 +1805,7 @@ def raise_for_access( for datasource_ in datasources: if self.can_access( "datasource_access", datasource_.perm - ) or is_owner(datasource_, getattr(g, "user", None)): + ) or self.is_owner(datasource_): break else: denied.add(table_) @@ -1093,7 +1831,7 @@ def raise_for_access( if not ( self.can_access_schema(datasource) or self.can_access("datasource_access", datasource.perm or "") - or is_owner(datasource, getattr(g, "user", None)) + or self.is_owner(datasource) or ( should_check_dashboard_access and self.can_access_based_on_dashboard(datasource) @@ -1148,25 +1886,16 @@ def get_guest_rls_filters( ] return [] - def get_rls_filters( - self, - table: "BaseDatasource", - username: Optional[str] = None, - ) -> List[SqlaQuery]: + def get_rls_filters(self, table: "BaseDatasource") -> List[SqlaQuery]: """ Retrieves the appropriate row level security filters for the current user and the passed table. - :param BaseDatasource table: The table to check against. - :param Optional[str] username: Optional username if there's no user in the Flask - global namespace. + :param table: The table to check against :returns: A list of filters """ - if hasattr(g, "user"): - user = g.user - elif username: - user = self.find_user(username=username) - else: + + if not (hasattr(g, "user") and g.user is not None): return [] # pylint: disable=import-outside-toplevel @@ -1176,7 +1905,7 @@ def get_rls_filters( RowLevelSecurityFilter, ) - user_roles = [role.id for role in self.get_user_roles(user)] + user_roles = [role.id for role in self.get_user_roles(g.user)] regular_filter_roles = ( self.get_session() .query(RLSFilterRoles.c.rls_filter_id) @@ -1185,7 +1914,6 @@ def get_rls_filters( RowLevelSecurityFilter.filter_type == RowLevelSecurityFilterType.REGULAR ) .filter(RLSFilterRoles.c.role_id.in_(user_roles)) - .subquery() ) base_filter_roles = ( self.get_session() @@ -1195,13 +1923,11 @@ def get_rls_filters( RowLevelSecurityFilter.filter_type == RowLevelSecurityFilterType.BASE ) .filter(RLSFilterRoles.c.role_id.in_(user_roles)) - .subquery() ) filter_tables = ( self.get_session() .query(RLSFilterTables.c.rls_filter_id) .filter(RLSFilterTables.c.table_id == table.id) - .subquery() ) query = ( self.get_session() @@ -1253,10 +1979,9 @@ def get_rls_cache_key(self, datasource: "BaseDatasource") -> List[str]: @staticmethod def raise_for_user_activity_access(user_id: int) -> None: - user = g.user if g.user and g.user.get_id() else None - if not user or ( + if not get_user_id() or ( not current_app.config["ENABLE_BROAD_ACTIVITY_ACCESS"] - and user_id != user.id + and user_id != get_user_id() ): raise SupersetSecurityException( SupersetError( @@ -1278,8 +2003,6 @@ def raise_for_dashboard_access(self, dashboard: "Dashboard") -> None: # pylint: disable=import-outside-toplevel from superset import is_feature_enabled from superset.dashboards.commands.exceptions import DashboardAccessDeniedError - from superset.views.base import is_user_admin - from superset.views.utils import is_owner def has_rbac_access() -> bool: return (not is_feature_enabled("DASHBOARD_RBAC")) or any( @@ -1292,8 +2015,8 @@ def has_rbac_access() -> bool: can_access = self.has_guest_access(dashboard) else: can_access = ( - is_user_admin() - or is_owner(dashboard, g.user) + self.is_admin() + or self.is_owner(dashboard) or (dashboard.published and has_rbac_access()) or (not dashboard.published and not dashboard.roles) ) @@ -1471,3 +2194,60 @@ def has_guest_access(self, dashboard: "Dashboard") -> bool: if str(resource["id"]) == str(dashboard.embedded[0].uuid): return True return False + + def raise_for_ownership(self, resource: Model) -> None: + """ + Raise an exception if the user does not own the resource. + + Note admins are deemed owners of all resources. + + :param resource: The dashboard, dataste, chart, etc. resource + :raises SupersetSecurityException: If the current user is not an owner + """ + + # pylint: disable=import-outside-toplevel + from superset import db + + if self.is_admin(): + return + + orig_resource = db.session.query(resource.__class__).get(resource.id) + owners = orig_resource.owners if hasattr(orig_resource, "owners") else [] + + if g.user.is_anonymous or g.user not in owners: + raise SupersetSecurityException( + SupersetError( + error_type=SupersetErrorType.MISSING_OWNERSHIP_ERROR, + message=_( + "You don't have the rights to alter %(resource)s", + resource=resource, + ), + level=ErrorLevel.ERROR, + ) + ) + + def is_owner(self, resource: Model) -> bool: + """ + Returns True if the current user is an owner of the resource, False otherwise. + + :param resource: The dashboard, dataste, chart, etc. resource + :returns: Whethe the current user is an owner of the resource + """ + + try: + self.raise_for_ownership(resource) + except SupersetSecurityException: + return False + + return True + + def is_admin(self) -> bool: + """ + Returns True if the current user is an admin user, False otherwise. + + :returns: Whehther the current user is an admin user + """ + + return current_app.config["AUTH_ROLE_ADMIN"] in [ + role.name for role in self.get_user_roles() + ] diff --git a/superset/sql_lab.py b/superset/sql_lab.py index 785d16327f7f..149feb163926 100644 --- a/superset/sql_lab.py +++ b/superset/sql_lab.py @@ -33,12 +33,14 @@ from superset import ( app, + db, is_feature_enabled, results_backend, results_backend_use_msgpack, security_manager, ) from superset.common.db_query_status import QueryStatus +from superset.constants import QUERY_CANCEL_KEY, QUERY_EARLY_CANCEL_KEY from superset.dataframe import df_to_records from superset.db_engine_specs import BaseEngineSpec from superset.errors import ErrorLevel, SupersetError, SupersetErrorType @@ -69,7 +71,6 @@ SQL_QUERY_MUTATOR = config["SQL_QUERY_MUTATOR"] log_query = config["QUERY_LOGGER"] logger = logging.getLogger(__name__) -cancel_query_key = "cancel_query" class SqlLabException(Exception): @@ -96,8 +97,13 @@ def handle_query_error( msg = f"{prefix_message} {str(ex)}".strip() troubleshooting_link = config["TROUBLESHOOTING_LINK"] query.error_message = msg - query.status = QueryStatus.FAILED query.tmp_table_name = None + query.status = QueryStatus.FAILED + # TODO: re-enable this after updating the frontend to properly display timeout status + # if query.status != QueryStatus.TIMED_OUT: + # query.status = QueryStatus.FAILED + if not query.end_time: + query.end_time = now_as_float() # extract DB-specific errors (invalid column, eg) if isinstance(ex, SupersetErrorException): @@ -208,7 +214,6 @@ def execute_sql_statement( # pylint: disable=too-many-arguments,too-many-statem parsed_query._parsed[0], # pylint: disable=protected-access database.id, query.schema, - username=get_username(), ) ) ) @@ -287,6 +292,8 @@ def execute_sql_statement( # pylint: disable=too-many-arguments,too-many-statem # return 1 row less than increased_query data = data[:-1] except SoftTimeLimitExceeded as ex: + query.status = QueryStatus.TIMED_OUT + logger.warning("Query %d: Time limit exceeded", query.id) logger.debug("Query %d: %s", query.id, ex) raise SupersetErrorException( @@ -307,7 +314,6 @@ def execute_sql_statement( # pylint: disable=too-many-arguments,too-many-statem if query.status == QueryStatus.STOPPED: raise SqlLabQueryStoppedException() from ex - logger.error("Query %d: %s", query.id, type(ex), exc_info=True) logger.debug("Query %d: %s", query.id, ex) raise SqlLabException(db_engine_spec.extract_error_message(ex)) from ex @@ -458,15 +464,13 @@ def execute_sql_statements( # pylint: disable=too-many-arguments, too-many-loca ) ) - engine = database.get_sqla_engine(query.schema, source=QuerySource.SQL_LAB) - # Sharing a single connection and cursor across the - # execution of all statements (if many) - with closing(engine.raw_connection()) as conn: - # closing the connection closes the cursor as well + with database.get_raw_connection(query.schema, source=QuerySource.SQL_LAB) as conn: + # Sharing a single connection and cursor across the + # execution of all statements (if many) cursor = conn.cursor() cancel_query_id = db_engine_spec.get_cancel_query_id(cursor, query) if cancel_query_id is not None: - query.set_extra_json_key(cancel_query_key, cancel_query_id) + query.set_extra_json_key(QUERY_CANCEL_KEY, cancel_query_id) session.commit() statement_count = len(statements) for i, statement in enumerate(statements): @@ -475,15 +479,17 @@ def execute_sql_statements( # pylint: disable=too-many-arguments, too-many-loca if query.status == QueryStatus.STOPPED: payload.update({"status": query.status}) return payload - # For CTAS we create the table only on the last statement apply_ctas = query.select_as_cta and ( query.ctas_method == CtasMethod.VIEW or (query.ctas_method == CtasMethod.TABLE and i == len(statements) - 1) ) - # Run statement - msg = f"Running statement {i+1} out of {statement_count}" + msg = __( + "Running statement %(statement_num)s out of %(statement_count)s", + statement_num=i + 1, + statement_count=statement_count, + ) logger.info("Query %s: %s", str(query_id), msg) query.set_extra_json_key("progress", msg) session.commit() @@ -502,7 +508,11 @@ def execute_sql_statements( # pylint: disable=too-many-arguments, too-many-loca except Exception as ex: # pylint: disable=broad-except msg = str(ex) prefix_message = ( - f"[Statement {i+1} out of {statement_count}]" + __( + "Statement %(statement_num)s out of %(statement_count)s", + statement_num=i + 1, + statement_count=statement_count, + ) if statement_count > 1 else "" ) @@ -510,7 +520,6 @@ def execute_sql_statements( # pylint: disable=too-many-arguments, too-many-loca ex, query, session, payload, prefix_message ) return payload - # Commit the connection so CTA queries will create the table. conn.commit() @@ -518,6 +527,7 @@ def execute_sql_statements( # pylint: disable=too-many-arguments, too-many-loca query.rows = result_set.size query.progress = 100 query.set_extra_json_key("progress", None) + query.set_extra_json_key("columns", result_set.columns) if query.select_as_cta: query.select_sql = database.select_star( query.tmp_table_name, @@ -602,7 +612,7 @@ def cancel_query(query: Query) -> bool: """ Cancel a running query. - Note some engines implicitly handle the cancelation of a query and thus no expliicit + Note some engines implicitly handle the cancelation of a query and thus no explicit action is required. :param query: Query to cancel @@ -612,14 +622,24 @@ def cancel_query(query: Query) -> bool: if query.database.db_engine_spec.has_implicit_cancel(): return True - cancel_query_id = query.extra.get(cancel_query_key) + # Some databases may need to make preparations for query cancellation + query.database.db_engine_spec.prepare_cancel_query(query, db.session) + + if query.extra.get(QUERY_EARLY_CANCEL_KEY): + # Query has been cancelled prior to being able to set the cancel key. + # This can happen if the query cancellation key can only be acquired after the + # query has been executed + return True + + cancel_query_id = query.extra.get(QUERY_CANCEL_KEY) if cancel_query_id is None: return False - engine = query.database.get_sqla_engine(query.schema, source=QuerySource.SQL_LAB) - - with closing(engine.raw_connection()) as conn: - with closing(conn.cursor()) as cursor: - return query.database.db_engine_spec.cancel_query( - cursor, query, cancel_query_id - ) + with query.database.get_sqla_engine_with_context( + query.schema, source=QuerySource.SQL_LAB + ) as engine: + with closing(engine.raw_connection()) as conn: + with closing(conn.cursor()) as cursor: + return query.database.db_engine_spec.cancel_query( + cursor, query, cancel_query_id + ) diff --git a/superset/sql_parse.py b/superset/sql_parse.py index b585810f785a..ab2f04417249 100644 --- a/superset/sql_parse.py +++ b/superset/sql_parse.py @@ -494,7 +494,7 @@ class InsertRLSState(str, Enum): def has_table_query(token_list: TokenList) -> bool: """ - Return if a stament has a query reading from a table. + Return if a statement has a query reading from a table. >>> has_table_query(sqlparse.parse("COUNT(*)")[0]) False @@ -553,7 +553,6 @@ def get_rls_for_table( candidate: Token, database_id: int, default_schema: Optional[str], - username: Optional[str] = None, ) -> Optional[TokenList]: """ Given a table name, return any associated RLS predicates. @@ -586,7 +585,7 @@ def get_rls_for_table( template_processor = dataset.get_template_processor() predicate = " AND ".join( str(filter_) - for filter_ in dataset.get_sqla_row_level_filters(template_processor, username) + for filter_ in dataset.get_sqla_row_level_filters(template_processor) ) if not predicate: return None @@ -601,7 +600,6 @@ def insert_rls( token_list: TokenList, database_id: int, default_schema: Optional[str], - username: Optional[str] = None, ) -> TokenList: """ Update a statement inplace applying any associated RLS predicates. @@ -623,7 +621,7 @@ def insert_rls( elif state == InsertRLSState.SEEN_SOURCE and ( isinstance(token, Identifier) or token.ttype == Keyword ): - rls = get_rls_for_table(token, database_id, default_schema, username) + rls = get_rls_for_table(token, database_id, default_schema) if rls: state = InsertRLSState.FOUND_TABLE diff --git a/superset/sql_validators/presto_db.py b/superset/sql_validators/presto_db.py index 70b324c90073..5bc844751b83 100644 --- a/superset/sql_validators/presto_db.py +++ b/superset/sql_validators/presto_db.py @@ -162,16 +162,20 @@ def validate( statements = parsed_query.get_statements() logger.info("Validating %i statement(s)", len(statements)) - engine = database.get_sqla_engine(schema, source=QuerySource.SQL_LAB) - # Sharing a single connection and cursor across the - # execution of all statements (if many) - annotations: List[SQLValidationAnnotation] = [] - with closing(engine.raw_connection()) as conn: - cursor = conn.cursor() - for statement in parsed_query.get_statements(): - annotation = cls.validate_statement(statement, database, cursor) - if annotation: - annotations.append(annotation) - logger.debug("Validation found %i error(s)", len(annotations)) + # todo(hughhh): update this to use new database.get_raw_connection() + # this function keeps stalling CI + with database.get_sqla_engine_with_context( + schema, source=QuerySource.SQL_LAB + ) as engine: + # Sharing a single connection and cursor across the + # execution of all statements (if many) + annotations: List[SQLValidationAnnotation] = [] + with closing(engine.raw_connection()) as conn: + cursor = conn.cursor() + for statement in parsed_query.get_statements(): + annotation = cls.validate_statement(statement, database, cursor) + if annotation: + annotations.append(annotation) + logger.debug("Validation found %i error(s)", len(annotations)) return annotations diff --git a/superset/sqllab/api.py b/superset/sqllab/api.py new file mode 100644 index 000000000000..afe68323fb6b --- /dev/null +++ b/superset/sqllab/api.py @@ -0,0 +1,311 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import logging +from typing import Any, cast, Dict, Optional +from urllib import parse + +import simplejson as json +from flask import request +from flask_appbuilder.api import expose, protect, rison +from flask_appbuilder.models.sqla.interface import SQLAInterface +from marshmallow import ValidationError + +from superset import app, is_feature_enabled +from superset.databases.dao import DatabaseDAO +from superset.extensions import event_logger +from superset.jinja_context import get_template_processor +from superset.models.sql_lab import Query +from superset.queries.dao import QueryDAO +from superset.sql_lab import get_sql_results +from superset.sqllab.command_status import SqlJsonExecutionStatus +from superset.sqllab.commands.execute import CommandResult, ExecuteSqlCommand +from superset.sqllab.commands.export import SqlResultExportCommand +from superset.sqllab.commands.results import SqlExecutionResultsCommand +from superset.sqllab.exceptions import ( + QueryIsForbiddenToAccessException, + SqlLabException, +) +from superset.sqllab.execution_context_convertor import ExecutionContextConvertor +from superset.sqllab.query_render import SqlQueryRenderImpl +from superset.sqllab.schemas import ( + ExecutePayloadSchema, + QueryExecutionResponseSchema, + sql_lab_get_results_schema, +) +from superset.sqllab.sql_json_executer import ( + ASynchronousSqlJsonExecutor, + SqlJsonExecutor, + SynchronousSqlJsonExecutor, +) +from superset.sqllab.sqllab_execution_context import SqlJsonExecutionContext +from superset.sqllab.validators import CanAccessQueryValidatorImpl +from superset.superset_typing import FlaskResponse +from superset.utils import core as utils +from superset.views.base import CsvResponse, generate_download_headers, json_success +from superset.views.base_api import BaseSupersetApi, requires_json, statsd_metrics + +config = app.config +logger = logging.getLogger(__name__) + + +class SqlLabRestApi(BaseSupersetApi): + datamodel = SQLAInterface(Query) + + resource_name = "sqllab" + allow_browser_login = True + + class_permission_name = "Query" + + execute_model_schema = ExecutePayloadSchema() + + apispec_parameter_schemas = { + "sql_lab_get_results_schema": sql_lab_get_results_schema, + } + openapi_spec_tag = "SQL Lab" + openapi_spec_component_schemas = ( + ExecutePayloadSchema, + QueryExecutionResponseSchema, + ) + + @expose("/export/<string:client_id>/") + @protect() + @statsd_metrics + @event_logger.log_this_with_context( + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}" + f".export_csv", + log_to_statsd=False, + ) + def export_csv(self, client_id: str) -> CsvResponse: + """Exports the SQL query results to a CSV + --- + get: + summary: >- + Exports the SQL query results to a CSV + parameters: + - in: path + schema: + type: integer + name: client_id + description: The SQL query result identifier + responses: + 200: + description: SQL query results + content: + text/csv: + schema: + type: string + 400: + $ref: '#/components/responses/400' + 401: + $ref: '#/components/responses/401' + 403: + $ref: '#/components/responses/403' + 404: + $ref: '#/components/responses/404' + 500: + $ref: '#/components/responses/500' + """ + result = SqlResultExportCommand(client_id=client_id).run() + + query, data, row_count = result["query"], result["data"], result["count"] + + quoted_csv_name = parse.quote(query.name) + response = CsvResponse( + data, headers=generate_download_headers("csv", quoted_csv_name) + ) + event_info = { + "event_type": "data_export", + "client_id": client_id, + "row_count": row_count, + "database": query.database.name, + "schema": query.schema, + "sql": query.sql, + "exported_format": "csv", + } + event_rep = repr(event_info) + logger.debug( + "CSV exported: %s", event_rep, extra={"superset_event": event_info} + ) + return response + + @expose("/results/") + @protect() + @statsd_metrics + @rison(sql_lab_get_results_schema) + @event_logger.log_this_with_context( + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}" + f".get_results", + log_to_statsd=False, + ) + def get_results(self, **kwargs: Any) -> FlaskResponse: + """Gets the result of a SQL query execution + --- + get: + summary: >- + Gets the result of a SQL query execution + parameters: + - in: query + name: q + content: + application/json: + schema: + $ref: '#/components/schemas/sql_lab_get_results_schema' + responses: + 200: + description: SQL query execution result + content: + application/json: + schema: + $ref: '#/components/schemas/QueryExecutionResponseSchema' + 400: + $ref: '#/components/responses/400' + 401: + $ref: '#/components/responses/401' + 403: + $ref: '#/components/responses/403' + 404: + $ref: '#/components/responses/404' + 410: + $ref: '#/components/responses/410' + 500: + $ref: '#/components/responses/500' + """ + params = kwargs["rison"] + key = params.get("key") + rows = params.get("rows") + result = SqlExecutionResultsCommand(key=key, rows=rows).run() + # return the result without special encoding + return json_success( + json.dumps( + result, default=utils.json_iso_dttm_ser, ignore_nan=True, encoding=None + ), + 200, + ) + + @expose("/execute/", methods=["POST"]) + @protect() + @statsd_metrics + @requires_json + @event_logger.log_this_with_context( + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}" + f".get_results", + log_to_statsd=False, + ) + def execute_sql_query(self) -> FlaskResponse: + """Executes a SQL query + --- + post: + description: >- + Starts the execution of a SQL query + requestBody: + description: SQL query and params + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ExecutePayloadSchema' + responses: + 200: + description: Query execution result + content: + application/json: + schema: + $ref: '#/components/schemas/QueryExecutionResponseSchema' + 202: + description: Query execution result, query still running + content: + application/json: + schema: + $ref: '#/components/schemas/QueryExecutionResponseSchema' + 400: + $ref: '#/components/responses/400' + 401: + $ref: '#/components/responses/401' + 403: + $ref: '#/components/responses/403' + 404: + $ref: '#/components/responses/404' + 500: + $ref: '#/components/responses/500' + """ + try: + self.execute_model_schema.load(request.json) + except ValidationError as error: + return self.response_400(message=error.messages) + + try: + log_params = { + "user_agent": cast(Optional[str], request.headers.get("USER_AGENT")) + } + execution_context = SqlJsonExecutionContext(request.json) + command = self._create_sql_json_command(execution_context, log_params) + command_result: CommandResult = command.run() + + response_status = ( + 202 + if command_result["status"] == SqlJsonExecutionStatus.QUERY_IS_RUNNING + else 200 + ) + # return the execution result without special encoding + return json_success(command_result["payload"], response_status) + except SqlLabException as ex: + payload = {"errors": [ex.to_dict()]} + + response_status = ( + 403 if isinstance(ex, QueryIsForbiddenToAccessException) else ex.status + ) + return self.response(response_status, **payload) + + @staticmethod + def _create_sql_json_command( + execution_context: SqlJsonExecutionContext, log_params: Optional[Dict[str, Any]] + ) -> ExecuteSqlCommand: + query_dao = QueryDAO() + sql_json_executor = SqlLabRestApi._create_sql_json_executor( + execution_context, query_dao + ) + execution_context_convertor = ExecutionContextConvertor() + execution_context_convertor.set_max_row_in_display( + int(config.get("DISPLAY_MAX_ROW")) # type: ignore + ) + return ExecuteSqlCommand( + execution_context, + query_dao, + DatabaseDAO(), + CanAccessQueryValidatorImpl(), + SqlQueryRenderImpl(get_template_processor), + sql_json_executor, + execution_context_convertor, + config["SQLLAB_CTAS_NO_LIMIT"], + log_params, + ) + + @staticmethod + def _create_sql_json_executor( + execution_context: SqlJsonExecutionContext, query_dao: QueryDAO + ) -> SqlJsonExecutor: + sql_json_executor: SqlJsonExecutor + if execution_context.is_run_asynchronous(): + sql_json_executor = ASynchronousSqlJsonExecutor(query_dao, get_sql_results) + else: + sql_json_executor = SynchronousSqlJsonExecutor( + query_dao, + get_sql_results, + config.get("SQLLAB_TIMEOUT"), # type: ignore + is_feature_enabled("SQLLAB_BACKEND_PERSISTENCE"), + ) + return sql_json_executor diff --git a/superset/sqllab/commands/__init__.py b/superset/sqllab/commands/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/superset/sqllab/commands/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/superset/sqllab/command.py b/superset/sqllab/commands/execute.py similarity index 96% rename from superset/sqllab/command.py rename to superset/sqllab/commands/execute.py index ce41eb6de230..35a761fab401 100644 --- a/superset/sqllab/command.py +++ b/superset/sqllab/commands/execute.py @@ -26,7 +26,11 @@ from superset.common.db_query_status import QueryStatus from superset.dao.exceptions import DAOCreateFailedError from superset.errors import SupersetErrorType -from superset.exceptions import SupersetErrorsException, SupersetGenericErrorException +from superset.exceptions import ( + SupersetErrorException, + SupersetErrorsException, + SupersetGenericErrorException, +) from superset.models.core import Database from superset.models.sql_lab import Query from superset.sqllab.command_status import SqlJsonExecutionStatus @@ -110,7 +114,9 @@ def run( # pylint: disable=too-many-statements,useless-suppression "status": status, "payload": self._execution_context_convertor.serialize_payload(), } - except (SqlLabException, SupersetErrorsException) as ex: + except (SupersetErrorException, SupersetErrorsException) as ex: + # to make sure we raising the original + # SupersetErrorsException || SupersetErrorsException raise ex except Exception as ex: raise SqlLabException(self._execution_context, exception=ex) from ex diff --git a/superset/sqllab/commands/export.py b/superset/sqllab/commands/export.py new file mode 100644 index 000000000000..e9559be3b97f --- /dev/null +++ b/superset/sqllab/commands/export.py @@ -0,0 +1,134 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from __future__ import annotations + +import logging +from typing import Any, cast, List, TypedDict + +import pandas as pd +from flask_babel import gettext as __ + +from superset import app, db, results_backend, results_backend_use_msgpack +from superset.commands.base import BaseCommand +from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from superset.exceptions import SupersetErrorException, SupersetSecurityException +from superset.models.sql_lab import Query +from superset.sql_parse import ParsedQuery +from superset.sqllab.limiting_factor import LimitingFactor +from superset.utils import core as utils, csv +from superset.views.utils import _deserialize_results_payload + +config = app.config + +logger = logging.getLogger(__name__) + + +class SqlExportResult(TypedDict): + query: Query + count: int + data: List[Any] + + +class SqlResultExportCommand(BaseCommand): + _client_id: str + _query: Query + + def __init__( + self, + client_id: str, + ) -> None: + self._client_id = client_id + + def validate(self) -> None: + self._query = ( + db.session.query(Query).filter_by(client_id=self._client_id).one_or_none() + ) + if self._query is None: + raise SupersetErrorException( + SupersetError( + message=__( + "The query associated with these results could not be found. " + "You need to re-run the original query." + ), + error_type=SupersetErrorType.RESULTS_BACKEND_ERROR, + level=ErrorLevel.ERROR, + ), + status=404, + ) + + try: + self._query.raise_for_access() + except SupersetSecurityException as ex: + raise SupersetErrorException( + SupersetError( + message=__("Cannot access the query"), + error_type=SupersetErrorType.QUERY_SECURITY_ACCESS_ERROR, + level=ErrorLevel.ERROR, + ), + status=403, + ) from ex + + def run( + self, + ) -> SqlExportResult: + self.validate() + blob = None + if results_backend and self._query.results_key: + logger.info( + "Fetching CSV from results backend [%s]", self._query.results_key + ) + blob = results_backend.get(self._query.results_key) + if blob: + logger.info("Decompressing") + payload = utils.zlib_decompress( + blob, decode=not results_backend_use_msgpack + ) + obj = _deserialize_results_payload( + payload, self._query, cast(bool, results_backend_use_msgpack) + ) + + df = pd.DataFrame( + data=obj["data"], + dtype=object, + columns=[c["name"] for c in obj["columns"]], + ) + + logger.info("Using pandas to convert to CSV") + else: + logger.info("Running a query to turn into CSV") + if self._query.select_sql: + sql = self._query.select_sql + limit = None + else: + sql = self._query.executed_sql + limit = ParsedQuery(sql).limit + if limit is not None and self._query.limiting_factor in { + LimitingFactor.QUERY, + LimitingFactor.DROPDOWN, + LimitingFactor.QUERY_AND_DROPDOWN, + }: + # remove extra row from `increased_limit` + limit -= 1 + df = self._query.database.get_df(sql, self._query.schema)[:limit] + + csv_data = csv.df_to_escaped_csv(df, index=False, **config["CSV_EXPORT"]) + + return { + "query": self._query, + "count": len(df.index), + "data": csv_data, + } diff --git a/superset/sqllab/commands/results.py b/superset/sqllab/commands/results.py new file mode 100644 index 000000000000..d6c415a09fef --- /dev/null +++ b/superset/sqllab/commands/results.py @@ -0,0 +1,130 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from __future__ import annotations + +import logging +from typing import Any, cast, Dict, Optional + +from flask_babel import gettext as __ + +from superset import app, db, results_backend, results_backend_use_msgpack +from superset.commands.base import BaseCommand +from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from superset.exceptions import SerializationError, SupersetErrorException +from superset.models.sql_lab import Query +from superset.sqllab.utils import apply_display_max_row_configuration_if_require +from superset.utils import core as utils +from superset.utils.dates import now_as_float +from superset.views.utils import _deserialize_results_payload + +config = app.config +SQLLAB_QUERY_COST_ESTIMATE_TIMEOUT = config["SQLLAB_QUERY_COST_ESTIMATE_TIMEOUT"] +stats_logger = config["STATS_LOGGER"] + +logger = logging.getLogger(__name__) + + +class SqlExecutionResultsCommand(BaseCommand): + _key: str + _rows: Optional[int] + _blob: Any + _query: Query + + def __init__( + self, + key: str, + rows: Optional[int] = None, + ) -> None: + self._key = key + self._rows = rows + + def validate(self) -> None: + if not results_backend: + raise SupersetErrorException( + SupersetError( + message=__("Results backend is not configured."), + error_type=SupersetErrorType.RESULTS_BACKEND_NOT_CONFIGURED_ERROR, + level=ErrorLevel.ERROR, + ) + ) + + read_from_results_backend_start = now_as_float() + self._blob = results_backend.get(self._key) + stats_logger.timing( + "sqllab.query.results_backend_read", + now_as_float() - read_from_results_backend_start, + ) + + if not self._blob: + raise SupersetErrorException( + SupersetError( + message=__( + "Data could not be retrieved from the results backend. You " + "need to re-run the original query." + ), + error_type=SupersetErrorType.RESULTS_BACKEND_ERROR, + level=ErrorLevel.ERROR, + ), + status=410, + ) + + self._query = ( + db.session.query(Query).filter_by(results_key=self._key).one_or_none() + ) + if self._query is None: + raise SupersetErrorException( + SupersetError( + message=__( + "The query associated with these results could not be found. " + "You need to re-run the original query." + ), + error_type=SupersetErrorType.RESULTS_BACKEND_ERROR, + level=ErrorLevel.ERROR, + ), + status=404, + ) + + def run( + self, + ) -> Dict[str, Any]: + """Runs arbitrary sql and returns data as json""" + self.validate() + payload = utils.zlib_decompress( + self._blob, decode=not results_backend_use_msgpack + ) + try: + obj = _deserialize_results_payload( + payload, self._query, cast(bool, results_backend_use_msgpack) + ) + except SerializationError as ex: + raise SupersetErrorException( + SupersetError( + message=__( + "Data could not be deserialized from the results backend. The " + "storage format might have changed, rendering the old data " + "stake. You need to re-run the original query." + ), + error_type=SupersetErrorType.RESULTS_BACKEND_ERROR, + level=ErrorLevel.ERROR, + ), + status=404, + ) from ex + + if self._rows: + obj = apply_display_max_row_configuration_if_require(obj, self._rows) + + return obj diff --git a/superset/sqllab/exceptions.py b/superset/sqllab/exceptions.py index ac632d731d1b..c0096d5db6b4 100644 --- a/superset/sqllab/exceptions.py +++ b/superset/sqllab/exceptions.py @@ -19,13 +19,13 @@ import os from typing import Optional, TYPE_CHECKING +from flask_babel import lazy_gettext as _ + from superset.errors import SupersetError, SupersetErrorType from superset.exceptions import SupersetException -MSG_FORMAT = "Failed to execute {}" - if TYPE_CHECKING: - from superset.utils.sqllab_execution_context import SqlJsonExecutionContext + from superset.sqllab.sqllab_execution_context import SqlJsonExecutionContext class SqlLabException(SupersetException): @@ -61,7 +61,10 @@ def __init__( # pylint: disable=too-many-arguments super().__init__(self._generate_message(), exception, error_type) def _generate_message(self) -> str: - msg = MSG_FORMAT.format(self.sql_json_execution_context.get_query_details()) + msg = _( + "Failed to execute %(query)s", + query=self.sql_json_execution_context.get_query_details(), + ) if self.failed_reason_msg: msg = msg + self.failed_reason_msg if self.suggestion_help_msg is not None: diff --git a/superset/sqllab/query_render.py b/superset/sqllab/query_render.py index c2f96542898d..2854a7e39077 100644 --- a/superset/sqllab/query_render.py +++ b/superset/sqllab/query_render.py @@ -25,7 +25,7 @@ from superset import is_feature_enabled from superset.errors import SupersetErrorType -from superset.sqllab.command import SqlQueryRender +from superset.sqllab.commands.execute import SqlQueryRender from superset.sqllab.exceptions import SqlLabException from superset.utils import core as utils @@ -35,7 +35,7 @@ from superset.jinja_context import BaseTemplateProcessor from superset.sqllab.sqllab_execution_context import SqlJsonExecutionContext -PARAMETER_MISSING_ERR = ( +PARAMETER_MISSING_ERR = __( "Please check your template parameters for syntax errors and make sure " "they match across your SQL query and Set Parameters. Then, try running " "your query again." diff --git a/superset/sqllab/schemas.py b/superset/sqllab/schemas.py new file mode 100644 index 000000000000..f238fda5c918 --- /dev/null +++ b/superset/sqllab/schemas.py @@ -0,0 +1,83 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from marshmallow import fields, Schema + +sql_lab_get_results_schema = { + "type": "object", + "properties": { + "key": {"type": "string"}, + }, + "required": ["key"], +} + + +class ExecutePayloadSchema(Schema): + database_id = fields.Integer(required=True) + sql = fields.String(required=True) + client_id = fields.String(allow_none=True) + queryLimit = fields.Integer(allow_none=True) + sql_editor_id = fields.String(allow_none=True) + schema = fields.String(allow_none=True) + tab = fields.String(allow_none=True) + ctas_method = fields.String(allow_none=True) + templateParams = fields.String(allow_none=True) + tmp_table_name = fields.String(allow_none=True) + select_as_cta = fields.Boolean(allow_none=True) + json = fields.Boolean(allow_none=True) + runAsync = fields.Boolean(allow_none=True) + expand_data = fields.Boolean(allow_none=True) + + +class QueryResultSchema(Schema): + changedOn = fields.DateTime() + changed_on = fields.String() + dbId = fields.Integer() + db = fields.String() # pylint: disable=invalid-name + endDttm = fields.Float() + errorMessage = fields.String(allow_none=True) + executedSql = fields.String() + id = fields.String() + queryId = fields.Integer() + limit = fields.Integer() + limitingFactor = fields.String() + progress = fields.Integer() + rows = fields.Integer() + schema = fields.String() + ctas = fields.Boolean() + serverId = fields.Integer() + sql = fields.String() + sqlEditorId = fields.String() + startDttm = fields.Float() + state = fields.String() + tab = fields.String() + tempSchema = fields.String(allow_none=True) + tempTable = fields.String(allow_none=True) + userId = fields.Integer() + user = fields.String() + resultsKey = fields.String() + trackingUrl = fields.String(allow_none=True) + extra = fields.Dict(keys=fields.String()) + + +class QueryExecutionResponseSchema(Schema): + status = fields.String() + data = fields.List(fields.Dict()) + columns = fields.List(fields.Dict()) + selected_columns = fields.List(fields.Dict()) + expanded_columns = fields.List(fields.Dict()) + query = fields.Nested(QueryResultSchema) + query_id = fields.Integer() diff --git a/superset/sqllab/sqllab_execution_context.py b/superset/sqllab/sqllab_execution_context.py index f8e9ac64dfa2..644c978b3276 100644 --- a/superset/sqllab/sqllab_execution_context.py +++ b/superset/sqllab/sqllab_execution_context.py @@ -28,7 +28,7 @@ from superset.models.sql_lab import Query from superset.sql_parse import CtasMethod from superset.utils import core as utils -from superset.utils.core import apply_max_row_limit +from superset.utils.core import apply_max_row_limit, get_user_id from superset.utils.dates import now_as_float from superset.views.utils import get_cta_schema_name @@ -64,7 +64,7 @@ def __init__(self, query_params: Dict[str, Any]): self.create_table_as_select = None self.database = None self._init_from_query_params(query_params) - self.user_id = self._get_user_id() + self.user_id = get_user_id() self.client_id_or_short_id = cast(str, self.client_id or utils.shortid()[:10]) def set_query(self, query: Query) -> None: @@ -111,12 +111,6 @@ def _get_limit_param(query_params: Dict[str, Any]) -> int: limit = 0 return limit - def _get_user_id(self) -> Optional[int]: # pylint: disable=no-self-use - try: - return g.user.get_id() if g.user else None - except RuntimeError: - return None - def is_run_asynchronous(self) -> bool: return self.async_flag diff --git a/superset/sqllab/validators.py b/superset/sqllab/validators.py index 726a2760e291..5bc8a622531c 100644 --- a/superset/sqllab/validators.py +++ b/superset/sqllab/validators.py @@ -20,7 +20,7 @@ from typing import TYPE_CHECKING from superset import security_manager -from superset.sqllab.command import CanAccessQueryValidator +from superset.sqllab.commands.execute import CanAccessQueryValidator if TYPE_CHECKING: from superset.models.sql_lab import Query diff --git a/superset/tags/__init__.py b/superset/tags/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/superset/tags/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/superset/tags/core.py b/superset/tags/core.py new file mode 100644 index 000000000000..6c4f56a2e66f --- /dev/null +++ b/superset/tags/core.py @@ -0,0 +1,89 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# pylint: disable=import-outside-toplevel + + +def register_sqla_event_listeners() -> None: + import sqlalchemy as sqla + + from superset.connectors.sqla.models import SqlaTable + from superset.models.core import FavStar + from superset.models.dashboard import Dashboard + from superset.models.slice import Slice + from superset.models.sql_lab import SavedQuery + from superset.tags.models import ( + ChartUpdater, + DashboardUpdater, + DatasetUpdater, + FavStarUpdater, + QueryUpdater, + ) + + sqla.event.listen(SqlaTable, "after_insert", DatasetUpdater.after_insert) + sqla.event.listen(SqlaTable, "after_update", DatasetUpdater.after_update) + sqla.event.listen(SqlaTable, "after_delete", DatasetUpdater.after_delete) + + sqla.event.listen(Slice, "after_insert", ChartUpdater.after_insert) + sqla.event.listen(Slice, "after_update", ChartUpdater.after_update) + sqla.event.listen(Slice, "after_delete", ChartUpdater.after_delete) + + sqla.event.listen(Dashboard, "after_insert", DashboardUpdater.after_insert) + sqla.event.listen(Dashboard, "after_update", DashboardUpdater.after_update) + sqla.event.listen(Dashboard, "after_delete", DashboardUpdater.after_delete) + + sqla.event.listen(FavStar, "after_insert", FavStarUpdater.after_insert) + sqla.event.listen(FavStar, "after_delete", FavStarUpdater.after_delete) + + sqla.event.listen(SavedQuery, "after_insert", QueryUpdater.after_insert) + sqla.event.listen(SavedQuery, "after_update", QueryUpdater.after_update) + sqla.event.listen(SavedQuery, "after_delete", QueryUpdater.after_delete) + + +def clear_sqla_event_listeners() -> None: + import sqlalchemy as sqla + + from superset.connectors.sqla.models import SqlaTable + from superset.models.core import FavStar + from superset.models.dashboard import Dashboard + from superset.models.slice import Slice + from superset.models.sql_lab import SavedQuery + from superset.tags.models import ( + ChartUpdater, + DashboardUpdater, + DatasetUpdater, + FavStarUpdater, + QueryUpdater, + ) + + sqla.event.remove(SqlaTable, "after_insert", DatasetUpdater.after_insert) + sqla.event.remove(SqlaTable, "after_update", DatasetUpdater.after_update) + sqla.event.remove(SqlaTable, "after_delete", DatasetUpdater.after_delete) + + sqla.event.remove(Slice, "after_insert", ChartUpdater.after_insert) + sqla.event.remove(Slice, "after_update", ChartUpdater.after_update) + sqla.event.remove(Slice, "after_delete", ChartUpdater.after_delete) + + sqla.event.remove(Dashboard, "after_insert", DashboardUpdater.after_insert) + sqla.event.remove(Dashboard, "after_update", DashboardUpdater.after_update) + sqla.event.remove(Dashboard, "after_delete", DashboardUpdater.after_delete) + + sqla.event.remove(FavStar, "after_insert", FavStarUpdater.after_insert) + sqla.event.remove(FavStar, "after_delete", FavStarUpdater.after_delete) + + sqla.event.remove(SavedQuery, "after_insert", QueryUpdater.after_insert) + sqla.event.remove(SavedQuery, "after_update", QueryUpdater.after_update) + sqla.event.remove(SavedQuery, "after_delete", QueryUpdater.after_delete) diff --git a/superset/models/tags.py b/superset/tags/models.py similarity index 84% rename from superset/models/tags.py rename to superset/tags/models.py index 528206e672f6..89505146e259 100644 --- a/superset/models/tags.py +++ b/superset/tags/models.py @@ -14,7 +14,13 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from __future__ import absolute_import, division, print_function, unicode_literals +from __future__ import ( + absolute_import, + annotations, + division, + print_function, + unicode_literals, +) import enum from typing import List, Optional, TYPE_CHECKING, Union @@ -28,6 +34,7 @@ from superset.models.helpers import AuditMixinNullable if TYPE_CHECKING: + from superset.connectors.sqla.models import SqlaTable from superset.models.core import FavStar from superset.models.dashboard import Dashboard from superset.models.slice import Slice @@ -41,7 +48,7 @@ class TagTypes(enum.Enum): """ Types for tags. - Objects (queries, charts and dashboards) will have with implicit tags based + Objects (queries, charts, dashboards, and datasets) will have with implicit tags based on metadata: types, owners and who favorited them. This way, user "alice" can find all their objects by querying for the tag `owner:alice`. """ @@ -64,11 +71,12 @@ class ObjectTypes(enum.Enum): query = 1 chart = 2 dashboard = 3 + dataset = 4 class Tag(Model, AuditMixinNullable): - """A tag attached to an object (query, chart or dashboard).""" + """A tag attached to an object (query, chart, dashboard, or dataset).""" __tablename__ = "tag" id = Column(Integer, primary_key=True) @@ -103,6 +111,7 @@ def get_object_type(class_name: str) -> ObjectTypes: "slice": ObjectTypes.chart, "dashboard": ObjectTypes.dashboard, "query": ObjectTypes.query, + "dataset": ObjectTypes.dataset, } try: return mapping[class_name.lower()] @@ -116,13 +125,15 @@ class ObjectUpdater: @classmethod def get_owners_ids( - cls, target: Union["Dashboard", "FavStar", "Slice"] + cls, target: Union[Dashboard, FavStar, Slice, Query, SqlaTable] ) -> List[int]: raise NotImplementedError("Subclass should implement `get_owners_ids`") @classmethod def _add_owners( - cls, session: Session, target: Union["Dashboard", "FavStar", "Slice"] + cls, + session: Session, + target: Union[Dashboard, FavStar, Slice, Query, SqlaTable], ) -> None: for owner_id in cls.get_owners_ids(target): name = "owner:{0}".format(owner_id) @@ -137,7 +148,7 @@ def after_insert( cls, _mapper: Mapper, connection: Connection, - target: Union["Dashboard", "FavStar", "Slice"], + target: Union[Dashboard, FavStar, Slice, Query, SqlaTable], ) -> None: session = Session(bind=connection) @@ -158,7 +169,7 @@ def after_update( cls, _mapper: Mapper, connection: Connection, - target: Union["Dashboard", "FavStar", "Slice"], + target: Union[Dashboard, FavStar, Slice, Query, SqlaTable], ) -> None: session = Session(bind=connection) @@ -187,7 +198,7 @@ def after_delete( cls, _mapper: Mapper, connection: Connection, - target: Union["Dashboard", "FavStar", "Slice"], + target: Union[Dashboard, FavStar, Slice, Query, SqlaTable], ) -> None: session = Session(bind=connection) @@ -205,7 +216,7 @@ class ChartUpdater(ObjectUpdater): object_type = "chart" @classmethod - def get_owners_ids(cls, target: "Slice") -> List[int]: + def get_owners_ids(cls, target: Slice) -> List[int]: return [owner.id for owner in target.owners] @@ -214,7 +225,7 @@ class DashboardUpdater(ObjectUpdater): object_type = "dashboard" @classmethod - def get_owners_ids(cls, target: "Dashboard") -> List[int]: + def get_owners_ids(cls, target: Dashboard) -> List[int]: return [owner.id for owner in target.owners] @@ -223,14 +234,23 @@ class QueryUpdater(ObjectUpdater): object_type = "query" @classmethod - def get_owners_ids(cls, target: "Query") -> List[int]: + def get_owners_ids(cls, target: Query) -> List[int]: return [target.user_id] +class DatasetUpdater(ObjectUpdater): + + object_type = "dataset" + + @classmethod + def get_owners_ids(cls, target: SqlaTable) -> List[int]: + return [owner.id for owner in target.owners] + + class FavStarUpdater: @classmethod def after_insert( - cls, _mapper: Mapper, connection: Connection, target: "FavStar" + cls, _mapper: Mapper, connection: Connection, target: FavStar ) -> None: session = Session(bind=connection) name = "favorited_by:{0}".format(target.user_id) @@ -246,7 +266,7 @@ def after_insert( @classmethod def after_delete( - cls, _mapper: Mapper, connection: Connection, target: "FavStar" + cls, _mapper: Mapper, connection: Connection, target: FavStar ) -> None: session = Session(bind=connection) name = "favorited_by:{0}".format(target.user_id) diff --git a/superset/tasks/async_queries.py b/superset/tasks/async_queries.py index 74adcd080c0c..1157c5fd37e1 100644 --- a/superset/tasks/async_queries.py +++ b/superset/tasks/async_queries.py @@ -33,6 +33,7 @@ security_manager, ) from superset.utils.cache import generate_cache_key, set_and_log_cache +from superset.utils.core import override_user from superset.views.utils import get_datasource_info, get_viz if TYPE_CHECKING: @@ -44,16 +45,6 @@ ] # TODO: new config key -def ensure_user_is_set(user_id: Optional[int]) -> None: - user_is_not_set = not (hasattr(g, "user") and g.user is not None) - if user_is_not_set and user_id is not None: - # pylint: disable=assigning-non-slot - g.user = security_manager.get_user_by_id(user_id) - elif user_is_not_set: - # pylint: disable=assigning-non-slot - g.user = security_manager.get_anonymous_user() - - def set_form_data(form_data: Dict[str, Any]) -> None: # pylint: disable=assigning-non-slot g.form_data = form_data @@ -76,30 +67,35 @@ def load_chart_data_into_cache( # pylint: disable=import-outside-toplevel from superset.charts.data.commands.get_data_command import ChartDataCommand - try: - ensure_user_is_set(job_metadata.get("user_id")) - set_form_data(form_data) - query_context = _create_query_context_from_form(form_data) - command = ChartDataCommand(query_context) - result = command.run(cache=True) - cache_key = result["cache_key"] - result_url = f"/api/v1/chart/data/{cache_key}" - async_query_manager.update_job( - job_metadata, - async_query_manager.STATUS_DONE, - result_url=result_url, - ) - except SoftTimeLimitExceeded as ex: - logger.warning("A timeout occurred while loading chart data, error: %s", ex) - raise ex - except Exception as ex: - # TODO: QueryContext should support SIP-40 style errors - error = ex.message if hasattr(ex, "message") else str(ex) # type: ignore # pylint: disable=no-member - errors = [{"message": error}] - async_query_manager.update_job( - job_metadata, async_query_manager.STATUS_ERROR, errors=errors - ) - raise ex + user = ( + security_manager.get_user_by_id(job_metadata.get("user_id")) + or security_manager.get_anonymous_user() + ) + + with override_user(user, force=False): + try: + set_form_data(form_data) + query_context = _create_query_context_from_form(form_data) + command = ChartDataCommand(query_context) + result = command.run(cache=True) + cache_key = result["cache_key"] + result_url = f"/api/v1/chart/data/{cache_key}" + async_query_manager.update_job( + job_metadata, + async_query_manager.STATUS_DONE, + result_url=result_url, + ) + except SoftTimeLimitExceeded as ex: + logger.warning("A timeout occurred while loading chart data, error: %s", ex) + raise ex + except Exception as ex: + # TODO: QueryContext should support SIP-40 style errors + error = ex.message if hasattr(ex, "message") else str(ex) # type: ignore # pylint: disable=no-member + errors = [{"message": error}] + async_query_manager.update_job( + job_metadata, async_query_manager.STATUS_ERROR, errors=errors + ) + raise ex @celery_app.task(name="load_explore_json_into_cache", soft_time_limit=query_timeout) @@ -110,53 +106,61 @@ def load_explore_json_into_cache( # pylint: disable=too-many-locals force: bool = False, ) -> None: cache_key_prefix = "ejr-" # ejr: explore_json request - try: - ensure_user_is_set(job_metadata.get("user_id")) - set_form_data(form_data) - datasource_id, datasource_type = get_datasource_info(None, None, form_data) - - # Perform a deep copy here so that below we can cache the original - # value of the form_data object. This is necessary since the viz - # objects modify the form_data object. If the modified version were - # to be cached here, it will lead to a cache miss when clients - # attempt to retrieve the value of the completed async query. - original_form_data = copy.deepcopy(form_data) - - viz_obj = get_viz( - datasource_type=cast(str, datasource_type), - datasource_id=datasource_id, - form_data=form_data, - force=force, - ) - # run query & cache results - payload = viz_obj.get_payload() - if viz_obj.has_error(payload): - raise SupersetVizException(errors=payload["errors"]) - - # Cache the original form_data value for async retrieval - cache_value = { - "form_data": original_form_data, - "response_type": response_type, - } - cache_key = generate_cache_key(cache_value, cache_key_prefix) - set_and_log_cache(cache_manager.cache, cache_key, cache_value) - result_url = f"/superset/explore_json/data/{cache_key}" - async_query_manager.update_job( - job_metadata, - async_query_manager.STATUS_DONE, - result_url=result_url, - ) - except SoftTimeLimitExceeded as ex: - logger.warning("A timeout occurred while loading explore json, error: %s", ex) - raise ex - except Exception as ex: - if isinstance(ex, SupersetVizException): - errors = ex.errors # pylint: disable=no-member - else: - error = ex.message if hasattr(ex, "message") else str(ex) # type: ignore # pylint: disable=no-member - errors = [error] - async_query_manager.update_job( - job_metadata, async_query_manager.STATUS_ERROR, errors=errors - ) - raise ex + user = ( + security_manager.get_user_by_id(job_metadata.get("user_id")) + or security_manager.get_anonymous_user() + ) + + with override_user(user, force=False): + try: + set_form_data(form_data) + datasource_id, datasource_type = get_datasource_info(None, None, form_data) + + # Perform a deep copy here so that below we can cache the original + # value of the form_data object. This is necessary since the viz + # objects modify the form_data object. If the modified version were + # to be cached here, it will lead to a cache miss when clients + # attempt to retrieve the value of the completed async query. + original_form_data = copy.deepcopy(form_data) + + viz_obj = get_viz( + datasource_type=cast(str, datasource_type), + datasource_id=datasource_id, + form_data=form_data, + force=force, + ) + # run query & cache results + payload = viz_obj.get_payload() + if viz_obj.has_error(payload): + raise SupersetVizException(errors=payload["errors"]) + + # Cache the original form_data value for async retrieval + cache_value = { + "form_data": original_form_data, + "response_type": response_type, + } + cache_key = generate_cache_key(cache_value, cache_key_prefix) + set_and_log_cache(cache_manager.cache, cache_key, cache_value) + result_url = f"/superset/explore_json/data/{cache_key}" + async_query_manager.update_job( + job_metadata, + async_query_manager.STATUS_DONE, + result_url=result_url, + ) + except SoftTimeLimitExceeded as ex: + logger.warning( + "A timeout occurred while loading explore json, error: %s", ex + ) + raise ex + except Exception as ex: + if isinstance(ex, SupersetVizException): + errors = ex.errors # pylint: disable=no-member + else: + error = ex.message if hasattr(ex, "message") else str(ex) # type: ignore # pylint: disable=no-member + errors = [error] + + async_query_manager.update_job( + job_metadata, async_query_manager.STATUS_ERROR, errors=errors + ) + raise ex diff --git a/superset/tasks/cache.py b/superset/tasks/cache.py index 137ec068e884..bdbf8add7eab 100644 --- a/superset/tasks/cache.py +++ b/superset/tasks/cache.py @@ -28,7 +28,7 @@ from superset.models.core import Log from superset.models.dashboard import Dashboard from superset.models.slice import Slice -from superset.models.tags import Tag, TaggedObject +from superset.tags.models import Tag, TaggedObject from superset.utils.date_parser import parse_human_datetime from superset.utils.machine_auth import MachineAuthProvider @@ -55,7 +55,7 @@ class Strategy: # pylint: disable=too-few-public-methods Strategies can be configured in `superset/config.py`: - CELERYBEAT_SCHEDULE = { + beat_schedule = { 'cache-warmup-hourly': { 'task': 'cache-warmup', 'schedule': crontab(minute=1, hour='*'), # @hourly @@ -82,7 +82,7 @@ class DummyStrategy(Strategy): # pylint: disable=too-few-public-methods This is a dummy strategy that will fetch all charts. Can be configured by: - CELERYBEAT_SCHEDULE = { + beat_schedule = { 'cache-warmup-hourly': { 'task': 'cache-warmup', 'schedule': crontab(minute=1, hour='*'), # @hourly @@ -105,7 +105,7 @@ class TopNDashboardsStrategy(Strategy): # pylint: disable=too-few-public-method """ Warm up charts in the top-n dashboards. - CELERYBEAT_SCHEDULE = { + beat_schedule = { 'cache-warmup-hourly': { 'task': 'cache-warmup', 'schedule': crontab(minute=1, hour='*'), # @hourly @@ -151,7 +151,7 @@ class DashboardTagsStrategy(Strategy): # pylint: disable=too-few-public-methods """ Warm up charts in dashboards with custom tags. - CELERYBEAT_SCHEDULE = { + beat_schedule = { 'cache-warmup-hourly': { 'task': 'cache-warmup', 'schedule': crontab(minute=1, hour='*'), # @hourly diff --git a/superset/tasks/exceptions.py b/superset/tasks/exceptions.py new file mode 100644 index 000000000000..6698661754e5 --- /dev/null +++ b/superset/tasks/exceptions.py @@ -0,0 +1,24 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from flask_babel import lazy_gettext as _ + +from superset.exceptions import SupersetException + + +class ExecutorNotFoundError(SupersetException): + message = _("Scheduled task executor not found") diff --git a/superset/tasks/scheduler.py b/superset/tasks/scheduler.py index 7f0ea61c990c..b3efa240fa52 100644 --- a/superset/tasks/scheduler.py +++ b/superset/tasks/scheduler.py @@ -16,6 +16,7 @@ # under the License. import logging +from celery import Celery from celery.exceptions import SoftTimeLimitExceeded from dateutil import parser @@ -28,6 +29,8 @@ from superset.reports.dao import ReportScheduleDAO from superset.tasks.cron_util import cron_schedule_window from superset.utils.celery import session_scope +from superset.utils.core import LoggerLevel +from superset.utils.log import get_logger_from_status logger = logging.getLogger(__name__) @@ -66,16 +69,21 @@ def scheduler() -> None: active_schedule.id, schedule, ), - **async_options + **async_options, ) -@celery_app.task(name="reports.execute") -def execute(report_schedule_id: int, scheduled_dttm: str) -> None: +@celery_app.task(name="reports.execute", bind=True) +def execute(self: Celery.task, report_schedule_id: int, scheduled_dttm: str) -> None: task_id = None try: task_id = execute.request.id scheduled_dttm_ = parser.parse(scheduled_dttm) + logger.info( + "Executing alert/report, task id: %s, scheduled_dttm: %s", + task_id, + scheduled_dttm, + ) AsyncExecuteReportScheduleCommand( task_id, report_schedule_id, @@ -85,10 +93,17 @@ def execute(report_schedule_id: int, scheduled_dttm: str) -> None: logger.exception( "An unexpected occurred while executing the report: %s", task_id ) - except CommandException: - logger.exception( - "A downstream exception occurred while generating" " a report: %s", task_id + self.update_state(state="FAILURE") + except CommandException as ex: + logger_func, level = get_logger_from_status(ex.status) + logger_func( + "A downstream {} occurred while generating a report: {}. {}".format( + level, task_id, ex.message + ), + exc_info=True, ) + if level == LoggerLevel.EXCEPTION: + self.update_state(state="FAILURE") @celery_app.task(name="reports.prune_log") diff --git a/superset/tasks/slack_util.py b/superset/tasks/slack_util.py index 2f44d9260527..652fd89b6f58 100644 --- a/superset/tasks/slack_util.py +++ b/superset/tasks/slack_util.py @@ -23,9 +23,9 @@ import backoff from flask import current_app -from slack import WebClient -from slack.errors import SlackApiError -from slack.web.slack_response import SlackResponse +from slack_sdk import WebClient +from slack_sdk.errors import SlackApiError +from slack_sdk.web.slack_response import SlackResponse # Globals logger = logging.getLogger("tasks.slack_util") diff --git a/superset/tasks/thumbnails.py b/superset/tasks/thumbnails.py index 94b83ddb372c..d76939a07e3a 100644 --- a/superset/tasks/thumbnails.py +++ b/superset/tasks/thumbnails.py @@ -18,14 +18,16 @@ """Utility functions used across Superset""" import logging -from typing import Optional +from typing import cast, Optional from flask import current_app from superset import security_manager, thumbnail_cache from superset.extensions import celery_app -from superset.utils.celery import session_scope +from superset.tasks.utils import get_executor +from superset.utils.core import override_user from superset.utils.screenshots import ChartScreenshot, DashboardScreenshot +from superset.utils.urls import get_url_path from superset.utils.webdriver import WindowSize logger = logging.getLogger(__name__) @@ -33,21 +35,29 @@ @celery_app.task(name="cache_chart_thumbnail", soft_time_limit=300) def cache_chart_thumbnail( - url: str, - digest: str, + current_user: Optional[str], + chart_id: int, force: bool = False, window_size: Optional[WindowSize] = None, thumb_size: Optional[WindowSize] = None, ) -> None: + # pylint: disable=import-outside-toplevel + from superset.models.slice import Slice + if not thumbnail_cache: logger.warning("No cache set, refusing to compute") return None + chart = cast(Slice, Slice.get(chart_id)) + url = get_url_path("Superset.slice", slice_id=chart.id) logger.info("Caching chart: %s", url) - screenshot = ChartScreenshot(url, digest) - with session_scope(nullpool=True) as session: - user = security_manager.get_user_by_username( - current_app.config["THUMBNAIL_SELENIUM_USER"], session=session - ) + _, username = get_executor( + executor_types=current_app.config["THUMBNAIL_EXECUTE_AS"], + model=chart, + current_user=current_user, + ) + user = security_manager.find_user(username) + with override_user(user): + screenshot = ChartScreenshot(url, chart.digest) screenshot.compute_and_cache( user=user, cache=thumbnail_cache, @@ -60,17 +70,29 @@ def cache_chart_thumbnail( @celery_app.task(name="cache_dashboard_thumbnail", soft_time_limit=300) def cache_dashboard_thumbnail( - url: str, digest: str, force: bool = False, thumb_size: Optional[WindowSize] = None + current_user: Optional[str], + dashboard_id: int, + force: bool = False, + thumb_size: Optional[WindowSize] = None, ) -> None: + # pylint: disable=import-outside-toplevel + from superset.models.dashboard import Dashboard + if not thumbnail_cache: logging.warning("No cache set, refusing to compute") return + dashboard = Dashboard.get(dashboard_id) + url = get_url_path("Superset.dashboard", dashboard_id_or_slug=dashboard.id) + logger.info("Caching dashboard: %s", url) - screenshot = DashboardScreenshot(url, digest) - with session_scope(nullpool=True) as session: - user = security_manager.get_user_by_username( - current_app.config["THUMBNAIL_SELENIUM_USER"], session=session - ) + _, username = get_executor( + executor_types=current_app.config["THUMBNAIL_EXECUTE_AS"], + model=dashboard, + current_user=current_user, + ) + user = security_manager.find_user(username) + with override_user(user): + screenshot = DashboardScreenshot(url, dashboard.digest) screenshot.compute_and_cache( user=user, cache=thumbnail_cache, diff --git a/superset/tasks/types.py b/superset/tasks/types.py new file mode 100644 index 000000000000..cc337a81edb6 --- /dev/null +++ b/superset/tasks/types.py @@ -0,0 +1,44 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from enum import Enum + + +class ExecutorType(str, Enum): + """ + Which user should scheduled tasks be executed as. Used as follows: + For Alerts & Reports: the "model" refers to the AlertSchedule object + For Thumbnails: The "model" refers to the Slice or Dashboard object + """ + + # See the THUMBNAIL_SELENIUM_USER config parameter + SELENIUM = "selenium" + # The creator of the model + CREATOR = "creator" + # The creator of the model, if found in the owners list + CREATOR_OWNER = "creator_owner" + # The currently logged in user. In the case of Alerts & Reports, this is always + # None. For Thumbnails, this is the user that requested the thumbnail + CURRENT_USER = "current_user" + # The last modifier of the model + MODIFIER = "modifier" + # The last modifier of the model, if found in the owners list + MODIFIER_OWNER = "modifier_owner" + # An owner of the model. If the last modifier is in the owners list, returns that + # user. If the modifier is not found, returns the creator if found in the owners + # list. Finally, if neither are present, returns the first user in the owners list. + OWNER = "owner" diff --git a/superset/tasks/utils.py b/superset/tasks/utils.py new file mode 100644 index 000000000000..9c1dab82202b --- /dev/null +++ b/superset/tasks/utils.py @@ -0,0 +1,94 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from __future__ import annotations + +from typing import List, Optional, Tuple, TYPE_CHECKING, Union + +from flask import current_app, g + +from superset.tasks.exceptions import ExecutorNotFoundError +from superset.tasks.types import ExecutorType + +if TYPE_CHECKING: + from superset.models.dashboard import Dashboard + from superset.models.slice import Slice + from superset.reports.models import ReportSchedule + + +# pylint: disable=too-many-branches +def get_executor( + executor_types: List[ExecutorType], + model: Union[Dashboard, ReportSchedule, Slice], + current_user: Optional[str] = None, +) -> Tuple[ExecutorType, str]: + """ + Extract the user that should be used to execute a scheduled task. Certain executor + types extract the user from the underlying object (e.g. CREATOR), the constant + Selenium user (SELENIUM), or the user that initiated the request. + + :param executor_types: The requested executor type in descending order. When the + first user is found it is returned. + :param model: The underlying object + :param current_user: The username of the user that initiated the task. For + thumbnails this is the user that requested the thumbnail, while for alerts + and reports this is None (=initiated by Celery). + :return: User to execute the report as + :raises ScheduledTaskExecutorNotFoundError: If no users were found in after + iterating through all entries in `executor_types` + """ + owners = model.owners + owner_dict = {owner.id: owner for owner in owners} + for executor_type in executor_types: + if executor_type == ExecutorType.SELENIUM: + return executor_type, current_app.config["THUMBNAIL_SELENIUM_USER"] + if executor_type == ExecutorType.CURRENT_USER and current_user: + return executor_type, current_user + if executor_type == ExecutorType.CREATOR_OWNER: + if (user := model.created_by) and (owner := owner_dict.get(user.id)): + return executor_type, owner.username + if executor_type == ExecutorType.CREATOR: + if user := model.created_by: + return executor_type, user.username + if executor_type == ExecutorType.MODIFIER_OWNER: + if (user := model.changed_by) and (owner := owner_dict.get(user.id)): + return executor_type, owner.username + if executor_type == ExecutorType.MODIFIER: + if user := model.changed_by: + return executor_type, user.username + if executor_type == ExecutorType.OWNER: + owners = model.owners + if len(owners) == 1: + return executor_type, owners[0].username + if len(owners) > 1: + if modifier := model.changed_by: + if modifier and (user := owner_dict.get(modifier.id)): + return executor_type, user.username + if creator := model.created_by: + if creator and (user := owner_dict.get(creator.id)): + return executor_type, user.username + return executor_type, owners[0].username + + raise ExecutorNotFoundError() + + +def get_current_user() -> Optional[str]: + user = g.user if hasattr(g, "user") and g.user else None + if user and not user.is_anonymous: + return user.username + + return None diff --git a/superset/templates/appbuilder/navbar_right.html b/superset/templates/appbuilder/navbar_right.html deleted file mode 100644 index 334e7ea2adaa..000000000000 --- a/superset/templates/appbuilder/navbar_right.html +++ /dev/null @@ -1,127 +0,0 @@ -{# - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -#} - -{% set bug_report_url = appbuilder.app.config['BUG_REPORT_URL'] %} -{% set documentation_url = appbuilder.app.config['DOCUMENTATION_URL'] %} -{% set documentation_text = appbuilder.app.config['DOCUMENTATION_TEXT'] %} -{% set documentation_icon = appbuilder.app.config['DOCUMENTATION_ICON'] %} -{% set version_string = appbuilder.app.config['VERSION_STRING'] %} -{% set version_sha = appbuilder.app.config['VERSION_SHA'] %} - -{% set locale = session['locale'] %} -{% if not locale %} - {% set locale = 'en' %} -{% endif %} - -{% if not current_user.is_anonymous %} - <li class="dropdown"> - <button type="button" style="margin-top: 12px; margin-right: 30px;" data-toggle="dropdown" class="dropdown-toggle btn btn-sm btn-primary"> - <i class="fa fa-plus"></i> {{ _("New") }} - </button> - <ul class="dropdown-menu"> - <li><a href="/superset/sqllab"><span class="fa fa-fw fa-search"></span> {{_("SQL Query")}}</a></li> - <li><a href="/chart/add"><span class="fa fa-fw fa-bar-chart"></span> {{_("Chart")}}</a></li> - <li><a href="/dashboard/new/"><span class="fa fa-fw fa-dashboard"></span> {{_("Dashboard")}}</a></li> - </ul> - </li> -{% endif %} -{% if documentation_url %} -<li> - <a - tabindex="-1" - href="{{ documentation_url }}" - title="{{ documentation_text }}" - target="_blank" - > - {% if documentation_icon %} - <img - width="100%" - src="{{ documentation_icon }}" - alt="{{ documentation_text }}" - /> - {% else %} - <i class="fa fa-question"></i>  - {% endif %} - </a> -</li> -{% endif %} -{% if bug_report_url %} -<li> - <a - tabindex="-1" - href="{{ bug_report_url }}" - target="_blank" - title="Report a bug" - > - <i class="fa fa-bug"></i>  - </a> -</li> -{% endif %} -{% if languages.keys()|length > 1 %} -<li class="dropdown"> - <a class="dropdown-toggle" data-toggle="dropdown" href="javascript:void(0)"> - <div class="f16"><i class="flag {{languages[locale].get('flag')}}"></i> <b class="caret"></b> - </div> - </a> - <ul class="dropdown-menu" id="language-picker"> - <li class="dropdown"> - {% for lang in languages %} - {% if lang != locale %} - <a tabindex="-1" href="{{appbuilder.get_url_for_locale(lang)}}"> - <div class="f16"> - <i class="flag {{languages[lang].get('flag')}}"></i> - {{languages[lang].get('name')}} - </div> - </a> - {% endif %} - {% endfor %} - </li> - </ul> -</li> -{% endif %} - -{% if not current_user.is_anonymous %} - <li class="dropdown"> - <a - class="dropdown-toggle" - data-toggle="dropdown" - title="{{g.user.get_full_name()}}" - href="javascript:void(0)" - > - <i class="fa fa-user"></i> <b class="caret"></b> - </a> - <ul class="dropdown-menu"> - <li><a href="/superset/profile/{{g.user.username}}"><span class="fa fa-fw fa-user"></span>{{_("Profile")}}</a></li> - <li><a href="{{appbuilder.get_url_for_userinfo}}"><span class="fa fa-fw fa-user"></span>{{_("Info")}}</a></li> - <li><a href="{{appbuilder.get_url_for_logout}}"><span class="fa fa-fw fa-sign-out"></span>{{_("Logout")}}</a></li> - {% if version_string or version_sha %} - <li class="fineprint"> - {% if version_string %} - <div>Version: {{version_string}}</div> - {% endif %} - {% if version_sha %} - <div>SHA: {{version_sha}}</div> - {% endif %} - </li> - {% endif %} - </ul> - </li> -{% else %} - <li><a href="{{appbuilder.get_url_for_login}}"> - <i class="fa fa-fw fa-sign-in"></i>{{_("Login")}}</a></li> -{% endif %} diff --git a/superset/templates/email/role_extended.txt b/superset/templates/email/role_extended.txt index 89ba1b0f722b..463fb32c9c46 100644 --- a/superset/templates/email/role_extended.txt +++ b/superset/templates/email/role_extended.txt @@ -20,7 +20,7 @@ Dear {{ user.username }}, <br> <a href={{ url_for('Superset.profile', username=granter.username, _external=True) }}> {{ granter.username }}</a> has extended the role {{ role.name }} to include -<a href={{ url_for('Superset.explore', datasource_type=datasource.type, datasource_id=datasource.id, _external=True) }}> +<a href={{ url_for('ExploreView.root', datasource_type=datasource.type, datasource_id=datasource.id, _external=True) }}> {{datasource.full_name}}</a> and granted you access to it. <br> <br> diff --git a/superset/templates/email/role_granted.txt b/superset/templates/email/role_granted.txt index 8027f41ac489..312a04947387 100644 --- a/superset/templates/email/role_granted.txt +++ b/superset/templates/email/role_granted.txt @@ -21,7 +21,7 @@ Dear {{ user.username }}, <a href={{ url_for('Superset.profile', username=granter.username, _external=True) }}> {{ granter.username }}</a> has granted you the role {{ role.name }} that gives access to the - <a href={{ url_for('Superset.explore', datasource_type=datasource.type, datasource_id=datasource.id, _external=True) }}> + <a href={{ url_for('ExploreView.root', datasource_type=datasource.type, datasource_id=datasource.id, _external=True) }}> {{datasource.full_name}}</a> <br> <br> diff --git a/superset/templates/superset/add_slice.html b/superset/templates/superset/add_slice.html deleted file mode 100644 index b287de64e869..000000000000 --- a/superset/templates/superset/add_slice.html +++ /dev/null @@ -1,35 +0,0 @@ -{# - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -#} -{% extends "superset/basic.html" %} - -{% block title %} - Add new chart -{% endblock %} - -{% block body %} - <div - id="app" - data-bootstrap="{{ bootstrap_data }}" - ></div> -{% endblock %} - -{% block tail_js %} - {{ super() }} - {{ js_bundle("addSlice") }} -{% endblock %} diff --git a/superset/templates/superset/basic.html b/superset/templates/superset/basic.html index fff57fdb9fa1..fdd2e8e0de52 100644 --- a/superset/templates/superset/basic.html +++ b/superset/templates/superset/basic.html @@ -40,7 +40,7 @@ rel="{{favicon.rel if favicon.rel else "icon"}}" type="{{favicon.type if favicon.type else "image/png"}}" {% if favicon.sizes %}sizes={{favicon.sizes}}{% endif %} - href="{{ assets_prefix }}{{favicon.href}}" + href="{{ "" if favicon.href.startswith("http") else assets_prefix }}{{favicon.href}}" > {% endfor %} <link rel="stylesheet" type="text/css" href="{{ assets_prefix }}/static/appbuilder/css/flags/flags16.css" /> diff --git a/superset/templates/superset/form_view/csv_macros.html b/superset/templates/superset/form_view/csv_macros.html new file mode 100644 index 000000000000..40c7bf54a0b2 --- /dev/null +++ b/superset/templates/superset/form_view/csv_macros.html @@ -0,0 +1,75 @@ +{# +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +#} +{% macro render_delimiter_field(field, begin_sep_label='', end_sep_label='', begin_sep_field='', end_sep_field='') %} + {% if field.id != 'csrf_token' %} + {% if field.type == 'HiddenField' %} + {{ field}} + {% else %} + {{begin_sep_label|safe}} + <label for="{{field.id}}" control-label> + {{ field.label.text }} + {% if field.flags.required %} + <strong style="color: red">*</strong> + {% endif %} + </label> + {{end_sep_label|safe}} + {{begin_sep_field|safe}} + {{ field(**kwargs)|safe }} + <input class="form-control col-sm-9" style="margin: 10px 0px; display: none;" id="otherInput" name="otherInput" placeholder="Type your delimiter here" type="text" value=""> + <span class="help-block">{{ field.description }}</span> + {% endif %} + {% if field.errors %} + <div class="alert alert-danger"> + {% for error in field.errors %} + {{ _(error) }} + {% endfor %} + </div> + {% endif %} + {{end_sep_field|safe}} + {% endif %} +{% endmacro %} + +{% macro render_collapsable_form_group(id, section_title='') %} + <div class="form-group" id="{{id}}"> + <div class="col-xs-12" style="padding: 0;"> + <table class="table table-bordered"> + <tbody> + <tr data-toggle="collapse" data-target="#collapsable-content-{{id}}" class="accordion-toggle"> + <td class="col-xs-12" role="button" style="border: none;"> + <i class="fa fa-chevron-down" style="color: #666666; margin-right: 8px; margin-left: 12px;"></i> + {{section_title}} + </td> + </tr> + + <tr class="collapse" id="collapsable-content-{{id}}"> + <td colspan="12" style="padding: 0;"> + <div> + <table class="table table-bordered" style="margin-bottom: 0; background-color: transparent; border: none;"> + <tbody> + {{ caller() }} + </tbody> + </table> + </div> + </td> + </tr> + </tbody> + </table> + </div> + </div> +{% endmacro %} diff --git a/superset/templates/superset/form_view/csv_scripts.html b/superset/templates/superset/form_view/csv_scripts.html new file mode 100644 index 000000000000..bb7b94b1a37f --- /dev/null +++ b/superset/templates/superset/form_view/csv_scripts.html @@ -0,0 +1,37 @@ +{# +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +#} +<script> + $('#delimiter').on('change', function () { + var delimiterOptions = $('#delimiter').val(); + if (delimiterOptions?.includes("other")) { + document.getElementById("otherInput").style.display = 'block'; + $('#otherInput').attr('required', 'required'); + } else { + document.getElementById("otherInput").style.display = 'none'; + $('#otherInput').removeAttr('required'); + } + }).change(); + + $(".collapse").on("hide.bs.collapse show.bs.collapse", e => { + $(e.target) + .prev() + .find("i:last-child") + .toggleClass("fa-chevron-up fa-chevron-down"); + }); +</script> diff --git a/superset/templates/superset/form_view/csv_to_database_view/edit.html b/superset/templates/superset/form_view/csv_to_database_view/edit.html index 2bec3aa12abb..b09f9bd3838b 100644 --- a/superset/templates/superset/form_view/csv_to_database_view/edit.html +++ b/superset/templates/superset/form_view/csv_to_database_view/edit.html @@ -16,10 +16,122 @@ specific language governing permissions and limitations under the License. #} +{% extends "appbuilder/base.html" %} +{% import 'appbuilder/general/lib.html' as lib %} +{% set begin_sep_label = '<td class="col-sm-2" style="border-left: 0; border-top: 0;">' %} + {% set end_sep_label = '</td>' %} +{% set begin_sep_field = '<td style="border-right: 0; border-top: 0;">' %} + {% set end_sep_field = '</td>' %} {% import 'superset/form_view/database_schemas_selector.html' as schemas_selector %} -{% extends 'appbuilder/general/model/edit.html' %} - +{% import 'superset/form_view/csv_scripts.html' as csv_scripts %} +{% import 'superset/form_view/csv_macros.html' as csv_macros %} +{% block content %} +{{ lib.panel_begin(title, "edit") }} +<div id="Home" class="tab-pane active"> + <form id="model_form" action="" method="post" enctype="multipart/form-data"> + {{form.hidden_tag()}} + <div class="form-group"> + <div class="col-md-12" style="padding: 0;"> + <table class="table table-bordered"> + <tbody> + <tr> + {{ lib.render_field(form.csv_file, begin_sep_label, end_sep_label, begin_sep_field, end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.table_name, begin_sep_label, end_sep_label, begin_sep_field, end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.database, begin_sep_label, end_sep_label, begin_sep_field, end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.schema, begin_sep_label, end_sep_label, begin_sep_field, end_sep_field) }} + </tr> + <tr> + {{ csv_macros.render_delimiter_field(form.delimiter, begin_sep_label, end_sep_label, begin_sep_field, end_sep_field) }} + </tr> + </tbody> + </table> + </div> + </div> + {% call csv_macros.render_collapsable_form_group("accordion1", "File Settings") %} + <tr> + {{ lib.render_field(form.if_exists, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.skip_initial_space, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.skip_blank_lines, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.parse_dates, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.infer_datetime_format, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.decimal, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.null_values, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + {% endcall %} + {% call csv_macros.render_collapsable_form_group("accordion2", "Columns") %} + <tr> + {{ lib.render_field(form.index_col, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.dataframe_index, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.index_label, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.use_cols, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + <tr> + {{ lib.render_field(form.overwrite_duplicate, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + {% endcall %} + {% call csv_macros.render_collapsable_form_group("accordion3", "Rows") %} + <tr> + {{ lib.render_field(form.header, begin_sep_label, end_sep_label, begin_sep_field, end_sep_field) + }} + </tr> + <tr> + {{ lib.render_field(form.nrows, begin_sep_label, end_sep_label, begin_sep_field, end_sep_field) + }} + </tr> + <tr> + {{ lib.render_field(form.skiprows, begin_sep_label, end_sep_label, begin_sep_field, + end_sep_field) }} + </tr> + {% endcall %} + <div class="form-group"> + <div class="col-xs-12" style="padding: 0;"> + {{ lib.render_form_controls() }} + </div> + </div> + </form> +</div> +{% endblock %} +{% block add_tail_js %} +<script src="{{url_for('appbuilder.static',filename='js/ab_keep_tab.js')}}"></script> +{% endblock %} {% block tail_js %} {{ super() }} {{ schemas_selector }} + {{ csv_scripts }} {% endblock %} diff --git a/superset/templates/superset/form_view/database_schemas_selector.html b/superset/templates/superset/form_view/database_schemas_selector.html index 73955d0174e6..b9efb68d7e5f 100644 --- a/superset/templates/superset/form_view/database_schemas_selector.html +++ b/superset/templates/superset/form_view/database_schemas_selector.html @@ -17,7 +17,7 @@ under the License. #} <script> - var db = $("#con"); + var db = $("#database"); var schema = $("#schema"); // this element is a text input diff --git a/superset/templates/superset/models/database/macros.html b/superset/templates/superset/models/database/macros.html index f1d07220ef52..f1f7a36cde72 100644 --- a/superset/templates/superset/models/database/macros.html +++ b/superset/templates/superset/models/database/macros.html @@ -22,7 +22,7 @@ .append('<button id="testconn" class="btn btn-sm btn-primary">{{ _("Test Connection") }}</button>'); $("#testconn").click(function(e) { e.preventDefault(); - var url = "/api/v1/database/test_connection"; + var url = "/api/v1/database/test_connection/"; var csrf_token = "{{ csrf_token() if csrf_token else '' }}"; $.ajaxSetup({ diff --git a/superset/templates/tail_js_custom_extra.html b/superset/templates/tail_js_custom_extra.html index 598905402750..92ad827614c4 100644 --- a/superset/templates/tail_js_custom_extra.html +++ b/superset/templates/tail_js_custom_extra.html @@ -18,7 +18,7 @@ #} {# - This file may be overriden in your custom deployment. + This file may be overridden in your custom deployment. It will be included in every view in superset and is a good place to include your custom frontend code, such as scripts to initialize google analytics, intercom, segment, etc. diff --git a/superset/temporary_cache/api.py b/superset/temporary_cache/api.py index bdbdda302e69..b6376c63c3b6 100644 --- a/superset/temporary_cache/api.py +++ b/superset/temporary_cache/api.py @@ -20,8 +20,7 @@ from apispec import APISpec from apispec.exceptions import DuplicateComponentNameError -from flask import g, request, Response -from flask_appbuilder.api import BaseApi +from flask import request, Response from marshmallow import ValidationError from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod @@ -34,12 +33,12 @@ TemporaryCachePostSchema, TemporaryCachePutSchema, ) -from superset.views.base_api import requires_json +from superset.views.base_api import BaseSupersetApi, requires_json logger = logging.getLogger(__name__) -class TemporaryCacheRestApi(BaseApi, ABC): +class TemporaryCacheRestApi(BaseSupersetApi, ABC): add_model_schema = TemporaryCachePostSchema() edit_model_schema = TemporaryCachePutSchema() method_permission_name = MODEL_API_RW_METHOD_PERMISSION_MAP @@ -70,9 +69,7 @@ def post(self, pk: int) -> Response: try: item = self.add_model_schema.load(request.json) tab_id = request.args.get("tab_id") - args = CommandParameters( - actor=g.user, resource_id=pk, value=item["value"], tab_id=tab_id - ) + args = CommandParameters(resource_id=pk, value=item["value"], tab_id=tab_id) key = self.get_create_command()(args).run() return self.response(201, key=key) except ValidationError as ex: @@ -88,7 +85,6 @@ def put(self, pk: int, key: str) -> Response: item = self.edit_model_schema.load(request.json) tab_id = request.args.get("tab_id") args = CommandParameters( - actor=g.user, resource_id=pk, key=key, value=item["value"], @@ -105,7 +101,7 @@ def put(self, pk: int, key: str) -> Response: def get(self, pk: int, key: str) -> Response: try: - args = CommandParameters(actor=g.user, resource_id=pk, key=key) + args = CommandParameters(resource_id=pk, key=key) value = self.get_get_command()(args).run() if not value: return self.response_404() @@ -117,7 +113,7 @@ def get(self, pk: int, key: str) -> Response: def delete(self, pk: int, key: str) -> Response: try: - args = CommandParameters(actor=g.user, resource_id=pk, key=key) + args = CommandParameters(resource_id=pk, key=key) result = self.get_delete_command()(args).run() if not result: return self.response_404() diff --git a/superset/temporary_cache/commands/parameters.py b/superset/temporary_cache/commands/parameters.py index 4d98167c3723..74b9c1c6321e 100644 --- a/superset/temporary_cache/commands/parameters.py +++ b/superset/temporary_cache/commands/parameters.py @@ -17,12 +17,9 @@ from dataclasses import dataclass from typing import Optional -from flask_appbuilder.security.sqla.models import User - @dataclass class CommandParameters: - actor: User resource_id: int tab_id: Optional[int] = None key: Optional[str] = None diff --git a/superset/thumbnails/__init__.py b/superset/thumbnails/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/superset/thumbnails/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/superset/thumbnails/digest.py b/superset/thumbnails/digest.py new file mode 100644 index 000000000000..fb209fcd5072 --- /dev/null +++ b/superset/thumbnails/digest.py @@ -0,0 +1,83 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING + +from flask import current_app + +from superset.tasks.types import ExecutorType +from superset.tasks.utils import get_current_user, get_executor +from superset.utils.hashing import md5_sha_from_str + +if TYPE_CHECKING: + from superset.models.dashboard import Dashboard + from superset.models.slice import Slice + +logger = logging.getLogger(__name__) + + +def _adjust_string_for_executor( + unique_string: str, + executor_type: ExecutorType, + executor: str, +) -> str: + """ + Add the executor to the unique string if the thumbnail is + user-specific. + """ + if executor_type == ExecutorType.CURRENT_USER: + # add the user id to the string to make it unique + unique_string = f"{unique_string}\n{executor}" + + return unique_string + + +def get_dashboard_digest(dashboard: Dashboard) -> str: + config = current_app.config + executor_type, executor = get_executor( + executor_types=config["THUMBNAIL_EXECUTE_AS"], + model=dashboard, + current_user=get_current_user(), + ) + if func := config["THUMBNAIL_DASHBOARD_DIGEST_FUNC"]: + return func(dashboard, executor_type, executor) + + unique_string = ( + f"{dashboard.id}\n{dashboard.charts}\n{dashboard.position_json}\n" + f"{dashboard.css}\n{dashboard.json_metadata}" + ) + + unique_string = _adjust_string_for_executor(unique_string, executor_type, executor) + return md5_sha_from_str(unique_string) + + +def get_chart_digest(chart: Slice) -> str: + config = current_app.config + executor_type, executor = get_executor( + executor_types=config["THUMBNAIL_EXECUTE_AS"], + model=chart, + current_user=get_current_user(), + ) + if func := config["THUMBNAIL_CHART_DIGEST_FUNC"]: + return func(chart, executor_type, executor) + + unique_string = f"{chart.params or ''}.{executor}" + unique_string = _adjust_string_for_executor(unique_string, executor_type, executor) + return md5_sha_from_str(unique_string) diff --git a/superset/translations/de/LC_MESSAGES/messages.json b/superset/translations/de/LC_MESSAGES/messages.json index 9abf6b6d8a7e..08678e6d0716 100644 --- a/superset/translations/de/LC_MESSAGES/messages.json +++ b/superset/translations/de/LC_MESSAGES/messages.json @@ -1963,7 +1963,7 @@ "Font size for the smallest value in the list": [ "Schriftgröße für den kleinsten Wert in der Liste" ], - "For Presto and Postgres, shows a button to compute cost before running a query.": [ + "For Bigquery, Presto and Postgres, shows a button to compute cost before running a query.": [ "Für Presto und Postgres wird ein Buttons angezeigt, um Kosten vor dem Ausführen einer Abfrage zu schätzen." ], "For regular filters, these are the roles this filter will be applied to. For base filters, these are the roles that the filter DOES NOT apply to, e.g. Admin if admin should see all data.": [ @@ -3988,7 +3988,7 @@ "The query associated with the results was deleted.": [ "Die den Ergebnissen zugeordnete Abfrage wurde gelöscht." ], - "The query associated with these results could not be find. You need to re-run the original query.": [ + "The query associated with these results could not be found. You need to re-run the original query.": [ "Die mit diesen Ergebnissen verknüpfte Abfrage konnte nicht gefunden werden. Sie müssen die ursprüngliche Abfrage erneut ausführen." ], "The query contains one or more malformed template parameters.": [ diff --git a/superset/translations/de/LC_MESSAGES/messages.po b/superset/translations/de/LC_MESSAGES/messages.po index 8726ceae19a2..54c069c1a312 100644 --- a/superset/translations/de/LC_MESSAGES/messages.po +++ b/superset/translations/de/LC_MESSAGES/messages.po @@ -1271,10 +1271,6 @@ msgstr "Ein Fehler ist aufgetreten" msgid "An error occurred saving dataset" msgstr "Beim Speichern des Datensatz ist ein Fehler aufgetreten" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "Beim Aktualisieren von Abfragen ist ein Fehler aufgetreten" - #: superset/key_value/commands/exceptions.py:33 msgid "An error occurred while accessing the value." msgstr "Beim Zugriff auf den Wert ist ein Fehler aufgetreten." @@ -5929,18 +5925,6 @@ msgstr "Filtertyp" msgid "Filter box" msgstr "Filterkomponente" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "Filtern nach Datenbank" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "Nach Status filtern" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "Filtern nach Benutzer*in" - #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 msgid "Filter configuration" msgstr "Filterkonfiguration" @@ -6114,7 +6098,7 @@ msgstr "Schriftgröße für den kleinsten Wert in der Liste" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " "query." msgstr "" "Für Presto und Postgres wird ein Buttons angezeigt, um Kosten vor dem " @@ -6822,7 +6806,6 @@ msgstr "Problem 1000 - Die Datenquelle ist zu groß, um sie abzufragen." msgid "Issue 1001 - The database is under an unusual load." msgstr "Problem 1001 - Die Datenbank ist ungewöhnlich belastet." -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 #: superset-frontend/src/components/DatabaseSelector/index.tsx:183 msgid "It seems you don't have access to any database" @@ -9495,10 +9478,6 @@ msgstr "Abfragename" msgid "Query preview" msgstr "Abfragen-Voransicht" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "Abfragen suchen" - #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 msgid "Query was stopped" msgstr "Abfrage wurde angehalten" @@ -10541,7 +10520,6 @@ msgid "Scoping" msgstr "Auswahlverfahren" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 #: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 @@ -12595,7 +12573,7 @@ msgstr "Die den Ergebnissen zugeordnete Abfrage wurde gelöscht." #: superset/views/core.py:2297 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" "Die mit diesen Ergebnissen verknüpfte Abfrage konnte nicht gefunden " @@ -15498,10 +15476,6 @@ msgstr "Zoomstufe der Karte" msgid "[Alert] %(label)s" msgstr "[Alarm] %(label)s" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "[Von]-" - #: superset/viz.py:2349 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" msgstr "" @@ -15521,10 +15495,6 @@ msgstr "[Fehlender Datensatz]" msgid "[Superset] Access to the datasource %(name)s was granted" msgstr "[Superset] Zugriff auf die Datenquelle %(name)s wurde gewährt" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "[Bis]-" - #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 msgid "[Untitled]" msgstr "[Unbenannt]" diff --git a/superset/translations/en/LC_MESSAGES/messages.po b/superset/translations/en/LC_MESSAGES/messages.po index 4fb9477b0ff3..6faf2b1c7565 100644 --- a/superset/translations/en/LC_MESSAGES/messages.po +++ b/superset/translations/en/LC_MESSAGES/messages.po @@ -1141,10 +1141,6 @@ msgstr "" msgid "An error occurred saving dataset" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "" - #: superset/key_value/commands/exceptions.py:33 msgid "An error occurred while accessing the value." msgstr "" @@ -3526,7 +3522,7 @@ msgstr "" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:154 msgid "" "D3 number format for numbers between -1.0 and 1.0, useful when you want " -"to have different siginificant digits for small and large numbers" +"to have different significant digits for small and large numbers" msgstr "" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:220 @@ -5521,18 +5517,6 @@ msgstr "" msgid "Filter box" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "" - #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 msgid "Filter configuration" msgstr "" @@ -5693,7 +5677,7 @@ msgstr "" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " "query." msgstr "" @@ -6345,7 +6329,6 @@ msgstr "" msgid "Issue 1001 - The database is under an unusual load." msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 #: superset-frontend/src/components/DatabaseSelector/index.tsx:183 msgid "It seems you don't have access to any database" @@ -8614,7 +8597,7 @@ msgid "Position of column level subtotal" msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:163 -msgid "Position of intermidiate node label on tree" +msgid "Position of intermediate node label on tree" msgstr "" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:293 @@ -8889,10 +8872,6 @@ msgstr "" msgid "Query preview" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "" - #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 msgid "Query was stopped" msgstr "" @@ -9885,7 +9864,6 @@ msgid "Scoping" msgstr "" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 #: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 @@ -10434,7 +10412,7 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:52 msgid "" -"Show hierarchical relationships of data, with with the value represented " +"Show hierarchical relationships of data, with the value represented " "by area, showing proportion and contribution to the whole." msgstr "" @@ -11737,7 +11715,7 @@ msgstr "" #: superset/views/core.py:2280 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" @@ -12160,7 +12138,7 @@ msgstr "" #: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:127 msgid "" -"This color scheme is being overriden by custom label colors.\n" +"This color scheme is being overridden by custom label colors.\n" " Check the JSON metadata in the Advanced settings" msgstr "" @@ -13434,7 +13412,7 @@ msgstr "" #: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:27 msgid "" "Visualizes how a single metric varies across a country's principal " -"subdivisions (states, provinces, etc) on a chloropleth map. Each " +"subdivisions (states, provinces, etc) on a choropleth map. Each " "subdivision's value is elevated when you hover over the corresponding " "geographic boundary." msgstr "" @@ -14280,10 +14258,6 @@ msgstr "" msgid "[Alert] %(label)s" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "" - #: superset/viz.py:2349 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" msgstr "" @@ -14301,10 +14275,6 @@ msgstr "" msgid "[Superset] Access to the datasource %(name)s was granted" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "" - #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 msgid "[Untitled]" msgstr "" diff --git a/superset/translations/es/LC_MESSAGES/messages.po b/superset/translations/es/LC_MESSAGES/messages.po index 54845502ec82..0b1d2361f3b1 100644 --- a/superset/translations/es/LC_MESSAGES/messages.po +++ b/superset/translations/es/LC_MESSAGES/messages.po @@ -1194,10 +1194,6 @@ msgstr "Se produjo un error" msgid "An error occurred saving dataset" msgstr "Se produjo un error al crear el origen de datos" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "" - #: superset/key_value/commands/exceptions.py:33 #, fuzzy msgid "An error occurred while accessing the value." @@ -5795,18 +5791,6 @@ msgstr "Filtrar por usuario" msgid "Filter box" msgstr "Caja de filtro" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "Filtrar por base de datos" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "Filtrar por estado" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "Filtrar por usuario" - #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 msgid "Filter configuration" msgstr "Configuración de filtros" @@ -5975,7 +5959,7 @@ msgstr "" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 #, fuzzy msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " "query." msgstr "Estimar el costo antes de ejecutar una consulta" @@ -6672,7 +6656,6 @@ msgstr "Issue 1000 - La fuente de datos es demasiado grande para consultar." msgid "Issue 1001 - The database is under an unusual load." msgstr "Issue 1001 - La base de datos tiene una carga inusualmente elevada." -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 #: superset-frontend/src/components/DatabaseSelector/index.tsx:183 msgid "It seems you don't have access to any database" @@ -9340,10 +9323,6 @@ msgstr "Nombre de la consulta" msgid "Query preview" msgstr "Previsualización de Datos" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "Cadena de búsqueda de consulta" - #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 #, fuzzy msgid "Query was stopped" @@ -10398,7 +10377,6 @@ msgid "Scoping" msgstr "" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 #: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 @@ -12380,7 +12358,7 @@ msgstr "" #: superset/views/core.py:2280 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" @@ -13258,7 +13236,8 @@ msgstr "Serie Temporal - Gráfico de Barras" msgid "" "Time-series Bar Charts are used to show the changes in a metric over time" " as a series of bars." -msgstr "" +msgstr "Los gráficos de barras en las series de tiempo se utilizan para mostrar" +" los cambios en las métricas con el paso del tiempo, en forma de barras." #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:69 #, fuzzy @@ -13283,19 +13262,21 @@ msgstr "Serie Temporal - Pivote de periodo" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:69 #, fuzzy msgid "Time-series Scatter Plot" -msgstr "Tabla de serie temporal" +msgstr "Gráfico de Dispersión de Puntos (Series de Tiempo)" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:59 msgid "" "Time-series Scatter Plot has time on the horizontal axis in linear units," " and the points are connected in order. It shows a statistical " "relationship between two variables." -msgstr "" +msgstr "Gráfico de Dispersión de Puntos (en Series de tiempo), muestra en el eje " +"horizontal el tiempo en unidades lineales, conectando los puntos en orden. Muestra" +" una relación estadística entre dos variables-" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:69 #, fuzzy msgid "Time-series Smooth Line" -msgstr "Tabla de serie temporal" +msgstr "Tabla de serie temporal Suavizada" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:59 msgid "" @@ -13306,7 +13287,7 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:60 #, fuzzy msgid "Time-series Stepped Line" -msgstr "Tabla de serie temporal" +msgstr "Tabla de serie temporal por pasos" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:50 msgid "" @@ -13315,6 +13296,11 @@ msgid "" "points. A step chart can be useful when you want to show the changes that" " occur at irregular intervals." msgstr "" +"Gráfico de Series por tiempo en Pasos (conocida como Tabla de Pasos) " +"es una variación del gráfico de Linea, en la cual la linea que forma la serie " +"de tiempo forma una serie de 'pasos' entre los puntos de intervalos de datos. " +"Una tabla de paso es útil cuando se quieren mostrar los cambios ocurridos en " +"intervalos regulares." #: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:25 msgid "Time-series Table" @@ -13327,6 +13313,11 @@ msgid "" " information as a series of data points connected by straight line " "segments. It is a basic type of chart common in many fields." msgstr "" +"El gráfico de linea (en series de tiempo) es un gráfico de linea utilizado " +"para visualizar medidas tomadas en intervalos de tiempo regulares. " +"El gráfico de linea es un tipo de gráfico que muestra información de " +"una serie de puntos de datos conectados por segmentos de lineas rectas. " +"Es un tipo básico de gráfico en la estadística." #: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:98 msgid "Timeout error" @@ -13378,7 +13369,7 @@ msgstr "Columna de Tiempo" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:45 #, fuzzy msgid "Title is required" -msgstr "El campo es obligatorio" +msgstr "El título es obligatorio" #: superset/dashboards/filters.py:33 msgid "Title or Slug" @@ -13426,7 +13417,7 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:439 msgid "Totals" -msgstr "" +msgstr "Totales" #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:820 msgid "Track job" @@ -13442,11 +13433,11 @@ msgstr "Seguir trabajo" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:67 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:76 msgid "Transformable" -msgstr "" +msgstr "Transformable" #: superset-frontend/src/dashboard/util/backgroundStyleOptions.ts:25 msgid "Transparent" -msgstr "" +msgstr "Transparente" #: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:110 msgid "Transpose Pivot" @@ -13454,7 +13445,7 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:173 msgid "Transpose pivot" -msgstr "" +msgstr "Transponer pivot" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:39 #, fuzzy @@ -13495,7 +13486,7 @@ msgstr "Modificado" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:226 msgid "Triangle" -msgstr "" +msgstr "Triángulo" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1168 msgid "Trigger Alert If..." @@ -13509,7 +13500,7 @@ msgstr "Disparar Alerta si..." #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:271 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:274 msgid "Truncate Y Axis" -msgstr "" +msgstr "Truncar el eje Y" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:343 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:258 @@ -13518,15 +13509,15 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:274 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:277 msgid "Truncate Y Axis. Can be overridden by specifying a min or max bound." -msgstr "" +msgstr "Truncar el eje Y. Puede ser sobreescrito al especificar un límite máximo o mínimo" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:58 msgid "Truncates the specified date to the accuracy specified by the date unit." -msgstr "" +msgstr "Trunca la fecha especificada a la precisión establecida en el formato de fecha" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:222 msgid "Try applying different filters or ensuring your datasource has data" -msgstr "" +msgstr "Intente aplicar filtros diferentes o asegúrese de que la fuente de datos tiene información" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:58 msgid "Tuesday" @@ -13592,7 +13583,7 @@ msgstr "Parámetros de URL" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:125 #, fuzzy msgid "URL could not be identified" -msgstr "El Gráfico no ha podido eliminarse" +msgstr "El Gráfico no ha podido identificarse" #: superset-frontend/src/explore/controlPanels/sections.tsx:60 msgid "URL parameters" @@ -13604,18 +13595,18 @@ msgstr "nombre para URL" #: superset-frontend/src/SqlLab/actions/sqlLab.js:531 msgid "Unable to add a new tab to the backend. Please contact your administrator." -msgstr "" +msgstr "No se pueden añadir nueva pestaña al back-end. Contacte al administrador." #: superset/db_engine_specs/presto.py:218 #, python-format msgid "Unable to connect to catalog named \"%(catalog_name)s\"." -msgstr "" +msgstr "No se puede conectar al catálogo \"%(catalog_name)s\"." #: superset/db_engine_specs/mysql.py:139 #: superset/db_engine_specs/postgres.py:145 #, python-format msgid "Unable to connect to database \"%(database)s\"." -msgstr "" +msgstr "No se puede conectar a la Base de Datos: \"%(database)s\ " #: superset/utils/date_parser.py:390 #, fuzzy, python-format @@ -13696,7 +13687,7 @@ msgstr "" #: superset-frontend/src/utils/getClientErrorObject.ts:55 #, fuzzy msgid "Unexpected error: " -msgstr "Error inesperado" +msgstr "Error inesperado: " #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:95 #, fuzzy @@ -13706,7 +13697,7 @@ msgstr "Error desconocido" #: superset/db_engine_specs/mysql.py:129 #, python-format msgid "Unknown MySQL server host \"%(hostname)s\"." -msgstr "" +msgstr "Host desconocido de MySQL: \"%(hostname)s\"" #: superset/db_engine_specs/presto.py:1005 msgid "Unknown Presto Error" @@ -13714,22 +13705,22 @@ msgstr "Error de Presto desconocido" #: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:111 msgid "Unknown Status" -msgstr "" +msgstr "EStado desconocido" #: superset/connectors/sqla/models.py:1121 #, python-format msgid "Unknown column used in orderby: %(col)s" -msgstr "" +msgstr "Columna desconocida utilizada al ordenar: %(col)s%" #: superset-frontend/src/SqlLab/actions/sqlLab.js:349 #: superset-frontend/src/SqlLab/actions/sqlLab.js:389 msgid "Unknown error" -msgstr "Error desconocido" +msgstr "Valor desconocido" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils/index.ts:45 #, fuzzy msgid "Unknown value" -msgstr "Error desconocido" +msgstr "Valor desconocido" #: superset/jinja_context.py:347 #, python-format @@ -13800,7 +13791,7 @@ msgstr "Subir" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:134 #, fuzzy msgid "Upload Credentials" -msgstr "Subir Excel" +msgstr "Subir Credenciales" #: superset/initialization/__init__.py:400 msgid "Upload Excel" @@ -13808,7 +13799,7 @@ msgstr "Subir Excel" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:102 msgid "Upload JSON file" -msgstr "" +msgstr "Subir un archivo JSON" #: superset/initialization/__init__.py:369 msgid "Upload a CSV" @@ -13834,19 +13825,19 @@ msgstr "Usar Pandas para interpretar el formato de fecha y hora automáticamente #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:207 msgid "Use a log scale" -msgstr "" +msgstr "Usar escala logarítimica" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:107 msgid "Use a log scale for the X-axis" -msgstr "" +msgstr "Usar escala logarítimica para el Eje X" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:230 msgid "Use a log scale for the Y-axis" -msgstr "" +msgstr "Usar escala logarítimica para el Eje Y" #: superset/db_engine_specs/base.py:1401 msgid "Use an encrypted connection to the database" -msgstr "" +msgstr "Usar una conexión encriptada a la base de datos" #: superset-frontend/src/components/Datasource/DatasourceModal.tsx:209 msgid "Use legacy datasource editor" @@ -13858,11 +13849,11 @@ msgstr "" #: superset-frontend/src/filters/components/Range/controlPanel.ts:68 msgid "Use only a single value." -msgstr "" +msgstr "Usar un único valor" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:124 msgid "Use the Advanced Analytics options below" -msgstr "" +msgstr "Usar la opción de Analítica Avanzada debajo " #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:136 msgid "" @@ -13877,7 +13868,7 @@ msgstr "Usa el botón 'editar' para cambiar este campo" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:176 #: superset-frontend/src/explore/controls.jsx:207 msgid "Use this to define a static color for all circles" -msgstr "" +msgstr "Use esto para definir un color estático para todos los círculos" #: superset/views/dynamic_plugins.py:48 msgid "" @@ -15068,10 +15059,6 @@ msgstr "" msgid "[Alert] %(label)s" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "[De]-" - #: superset/viz.py:2349 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" msgstr "Las columnas [Longitud] y [Latitud] deben estar presentes en [Group By]" @@ -15090,10 +15077,6 @@ msgstr "Cambiar fuente" msgid "[Superset] Access to the datasource %(name)s was granted" msgstr "Se ha otorgado Acceso [Superset] a la fuente de datos %(name)" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "[A]-" - #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 #, fuzzy, python-format msgid "[Untitled]" diff --git a/superset/translations/fr/LC_MESSAGES/messages.json b/superset/translations/fr/LC_MESSAGES/messages.json index 954b9d8d40b8..effeb47e4551 100644 --- a/superset/translations/fr/LC_MESSAGES/messages.json +++ b/superset/translations/fr/LC_MESSAGES/messages.json @@ -1380,7 +1380,7 @@ "Data could not be retrieved from the results backend. You need to re-run the original query.": [ "Impossible de récupérer les données depuis le backend. Rejouez la requête originale." ], - "The query associated with these results could not be find. You need to re-run the original query.": [ + "The query associated with these results could not be found. You need to re-run the original query.": [ "La requête associée à ces résultats n'a pu être trouvée. Rejouez la requête originale." ], "You are not authorized to see this query. If you think this is an error, please reach out to your administrator.": [ @@ -1923,8 +1923,8 @@ "Write a description for your query": [ "Ecrire une description à votre requête" ], - "Schedule query": ["Plannifier une requête"], - "Schedule": ["Plannifeir"], + "Schedule query": ["Planifier une requête"], + "Schedule": ["Planifier"], "There was an error with your request": [ "Il y avait une erreur avec vore requête" ], @@ -2280,7 +2280,7 @@ "OK": ["OK"], "Search all dashboards": ["Chercher tous les tableaux de bord"], "Edit Email Report": ["Modifier le rapport e-mail"], - "New Email Report": ["Nouveau rapoprt e-mail"], + "New Email Report": ["Nouveau rapport e-mail"], "Add": ["Ajouter"], "Message Content": ["Contenu du message"], "Text embedded in email": ["Text encapsulé dans l'e-mail"], @@ -2289,7 +2289,7 @@ "REPORT NAME ERROR": ["Erreur dans le nom du rapport"], "DESCRIPTION ERROR": ["Erreur de description"], "Scheduled reports will be sent to your email as a PNG": [ - "Les rapports planifiés seront envoyés à votre @ e-mail en PNG" + "Les rapports planifiés vous seront envoyés par e-mail en PNG" ], "Timezone": ["Fuseau horaire"], "Email reports active": ["Rapports par e-mail actifs"], @@ -3225,7 +3225,7 @@ "log": ["log"], "State": ["Etat"], "Execution ID": ["ID d'exécution"], - "Scheduled at (UTC)": ["Plannifié à (UTC)"], + "Scheduled at (UTC)": ["Planifié à (UTC)"], "Start at (UTC)": ["Début à (UTC)"], "Duration": ["Durée"], "Error message": ["Message d'erreur"], @@ -3419,7 +3419,7 @@ "Enable query cost estimation": [ "Activer l'estimation du coût de la requête" ], - "For Presto and Postgres, shows a button to compute cost before running a query.": [ + "For Bigquery, Presto and Postgres, shows a button to compute cost before running a query.": [ "Pour Presto et Postgres, affiche un bouton pour calculer le coût avant d'exécuter une requête." ], "Allow this database to be explored": [ diff --git a/superset/translations/fr/LC_MESSAGES/messages.po b/superset/translations/fr/LC_MESSAGES/messages.po index 5472d7459c74..694b6c4b1d6a 100644 --- a/superset/translations/fr/LC_MESSAGES/messages.po +++ b/superset/translations/fr/LC_MESSAGES/messages.po @@ -1242,10 +1242,6 @@ msgstr "Un erreur s'est produite" msgid "An error occurred saving dataset" msgstr "Une erreur s'est produite durant la sauvegarde du jeu de données" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "Une erreur s'est produite en rafaîchissant les requêtes" - #: superset/key_value/commands/exceptions.py:33 #, fuzzy msgid "An error occurred while accessing the value." @@ -5932,18 +5928,6 @@ msgstr "Type du filtre" msgid "Filter box" msgstr "Boite de filtrage" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "Filtrer par base de données" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "Filtrer par statut" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "Filtrer par utilisateur" - #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 msgid "Filter configuration" msgstr "Configuration du filtre" @@ -6118,7 +6102,7 @@ msgstr "" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " "query." msgstr "" "Pour Presto et Postgres, affiche un bouton pour calculer le coût avant " @@ -6837,7 +6821,6 @@ msgstr "Source de données trop volumineuse pour être interrogée." msgid "Issue 1001 - The database is under an unusual load." msgstr "La base de données est soumise à une charge inhabituelle." -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 #: superset-frontend/src/components/DatabaseSelector/index.tsx:183 msgid "It seems you don't have access to any database" @@ -9550,10 +9533,6 @@ msgstr "Nom de la requête" msgid "Query preview" msgstr "Prévisualisation de la requête" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "Chaîne de recherche" - #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 msgid "Query was stopped" msgstr "La requête a été arrêtée" @@ -10618,7 +10597,6 @@ msgid "Scoping" msgstr "Portée" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 #: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 @@ -12648,7 +12626,7 @@ msgstr "La requête associée aux résutlats a été supprimée." #: superset/views/core.py:2280 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" "La requête associée à ces résultats n'a pu être trouvée. Rejouez la " @@ -15466,10 +15444,6 @@ msgstr "" msgid "[Alert] %(label)s" msgstr "[Alert] %(label)s" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "[Depuis]-" - #: superset/viz.py:2349 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" msgstr "" @@ -15489,10 +15463,6 @@ msgstr "[jeu de données manquant]" msgid "[Superset] Access to the datasource %(name)s was granted" msgstr "[Superset] Accès à la source de données %(name)s accordé" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "[à]-" - #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 msgid "[Untitled]" msgstr "[Sans titre]" diff --git a/superset/translations/it/LC_MESSAGES/messages.po b/superset/translations/it/LC_MESSAGES/messages.po index 3873a4b5a892..d11c7b0021cc 100644 --- a/superset/translations/it/LC_MESSAGES/messages.po +++ b/superset/translations/it/LC_MESSAGES/messages.po @@ -1169,10 +1169,6 @@ msgstr "" msgid "An error occurred saving dataset" msgstr "Errore nel creare il datasource" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "Errore nel creare il datasource" - #: superset/key_value/commands/exceptions.py:33 #, fuzzy msgid "An error occurred while accessing the value." @@ -5672,18 +5668,6 @@ msgstr "Valore del filtro" msgid "Filter box" msgstr "Filtri" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "Mostra database" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "Valore del filtro" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "Valore del filtro" - #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 msgid "Filter configuration" msgstr "Controlli del filtro" @@ -5848,7 +5832,7 @@ msgstr "" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " "query." msgstr "" @@ -6519,7 +6503,6 @@ msgstr "" msgid "Issue 1001 - The database is under an unusual load." msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 #: superset-frontend/src/components/DatabaseSelector/index.tsx:183 msgid "It seems you don't have access to any database" @@ -9140,10 +9123,6 @@ msgstr "Ricerca Query" msgid "Query preview" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "Ricerca Query" - #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 #, fuzzy msgid "Query was stopped" @@ -10165,7 +10144,6 @@ msgid "Scoping" msgstr "" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 #: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 @@ -12087,7 +12065,7 @@ msgstr "" #: superset/views/core.py:2280 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" @@ -14708,10 +14686,6 @@ msgstr "" msgid "[Alert] %(label)s" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "" - #: superset/viz.py:2349 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" msgstr "" @@ -14730,10 +14704,6 @@ msgstr "Seleziona una destinazione" msgid "[Superset] Access to the datasource %(name)s was granted" msgstr "[Superset] Accesso al datasource $(name) concesso" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "" - #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 #, fuzzy, python-format msgid "[Untitled]" diff --git a/superset/translations/ja/LC_MESSAGES/messages.po b/superset/translations/ja/LC_MESSAGES/messages.po index d34ad5518cd6..1d95ed1afe4c 100644 --- a/superset/translations/ja/LC_MESSAGES/messages.po +++ b/superset/translations/ja/LC_MESSAGES/messages.po @@ -1162,10 +1162,6 @@ msgstr "エラーが発生しました" msgid "An error occurred saving dataset" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "" - #: superset/key_value/commands/exceptions.py:33 #, fuzzy msgid "An error occurred while accessing the value." @@ -5658,18 +5654,6 @@ msgstr "フィルタタイプ" msgid "Filter box" msgstr "フィルタボックス" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "" - #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 msgid "Filter configuration" msgstr "フィルタ構成" @@ -5833,7 +5817,7 @@ msgstr "" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " "query." msgstr "" @@ -6500,7 +6484,6 @@ msgstr "Issue 1000 - データ ソースが大きすぎてクエリを実行で msgid "Issue 1001 - The database is under an unusual load." msgstr "Issue 1001 - データベースに異常な負荷がかかっています。" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 #: superset-frontend/src/components/DatabaseSelector/index.tsx:183 msgid "It seems you don't have access to any database" @@ -9115,10 +9098,6 @@ msgstr "クエリ名" msgid "Query preview" msgstr "クエリプレビュー" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "" - #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 msgid "Query was stopped" msgstr "" @@ -10136,7 +10115,6 @@ msgid "Scoping" msgstr "スコープ" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 #: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 @@ -12055,7 +12033,7 @@ msgstr "" #: superset/views/core.py:2280 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" @@ -14672,10 +14650,6 @@ msgstr "" msgid "[Alert] %(label)s" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "" - #: superset/viz.py:2349 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" msgstr "" @@ -14693,10 +14667,6 @@ msgstr "[データセットが見つかりません]" msgid "[Superset] Access to the datasource %(name)s was granted" msgstr "[Superset] データソース %(name)s へのアクセスは許可されました" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "" - #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 msgid "[Untitled]" msgstr "" diff --git a/superset/translations/ko/LC_MESSAGES/messages.po b/superset/translations/ko/LC_MESSAGES/messages.po index 5b4530e0399d..bfcb59867d15 100644 --- a/superset/translations/ko/LC_MESSAGES/messages.po +++ b/superset/translations/ko/LC_MESSAGES/messages.po @@ -1160,10 +1160,6 @@ msgstr "" msgid "An error occurred saving dataset" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "" - #: superset/key_value/commands/exceptions.py:33 #, fuzzy, python-format msgid "An error occurred while accessing the value." @@ -5625,18 +5621,6 @@ msgstr "" msgid "Filter box" msgstr "필터" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "데이터베이스 선택" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "필터" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "필터" - #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 msgid "Filter configuration" msgstr "" @@ -5798,7 +5782,7 @@ msgstr "" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " "query." msgstr "" @@ -6469,7 +6453,6 @@ msgstr "이슈 1000 - 데이터 소스가 쿼리하기에 너무 큽니다." msgid "Issue 1001 - The database is under an unusual load." msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 #: superset-frontend/src/components/DatabaseSelector/index.tsx:183 msgid "It seems you don't have access to any database" @@ -9052,10 +9035,6 @@ msgstr "Query 검색" msgid "Query preview" msgstr "데이터 미리보기" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "Query 검색" - #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 msgid "Query was stopped" msgstr "" @@ -10067,7 +10046,6 @@ msgid "Scoping" msgstr "" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 #: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 @@ -11975,7 +11953,7 @@ msgstr "" #: superset/views/core.py:2280 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" @@ -14557,10 +14535,6 @@ msgstr "" msgid "[Alert] %(label)s" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "" - #: superset/viz.py:2349 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" msgstr "" @@ -14578,10 +14552,6 @@ msgstr "" msgid "[Superset] Access to the datasource %(name)s was granted" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "" - #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 msgid "[Untitled]" msgstr "" diff --git a/superset/translations/messages.pot b/superset/translations/messages.pot index 98c91df9b68c..ad475ef1e357 100644 --- a/superset/translations/messages.pot +++ b/superset/translations/messages.pot @@ -1147,10 +1147,6 @@ msgstr "" msgid "An error occurred saving dataset" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "" - #: superset/key_value/commands/exceptions.py:33 msgid "An error occurred while accessing the value." msgstr "" @@ -3532,7 +3528,7 @@ msgstr "" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:154 msgid "" "D3 number format for numbers between -1.0 and 1.0, useful when you want " -"to have different siginificant digits for small and large numbers" +"to have different significant digits for small and large numbers" msgstr "" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:220 @@ -5526,18 +5522,6 @@ msgstr "" msgid "Filter box" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "" - #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 msgid "Filter configuration" msgstr "" @@ -5698,7 +5682,7 @@ msgstr "" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " "query." msgstr "" @@ -6351,7 +6335,6 @@ msgstr "" msgid "Issue 1001 - The database is under an unusual load." msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 #: superset-frontend/src/components/DatabaseSelector/index.tsx:183 msgid "It seems you don't have access to any database" @@ -8621,7 +8604,7 @@ msgid "Position of column level subtotal" msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:163 -msgid "Position of intermidiate node label on tree" +msgid "Position of intermediate node label on tree" msgstr "" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:293 @@ -8896,10 +8879,6 @@ msgstr "" msgid "Query preview" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "" - #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 msgid "Query was stopped" msgstr "" @@ -9892,7 +9871,6 @@ msgid "Scoping" msgstr "" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 #: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 @@ -10440,7 +10418,7 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:52 msgid "" -"Show hierarchical relationships of data, with with the value represented " +"Show hierarchical relationships of data, with the value represented " "by area, showing proportion and contribution to the whole." msgstr "" @@ -11743,7 +11721,7 @@ msgstr "" #: superset/views/core.py:2280 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" @@ -12166,7 +12144,7 @@ msgstr "" #: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:127 msgid "" -"This color scheme is being overriden by custom label colors.\n" +"This color scheme is being overridden by custom label colors.\n" " Check the JSON metadata in the Advanced settings" msgstr "" @@ -13440,7 +13418,7 @@ msgstr "" #: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:27 msgid "" "Visualizes how a single metric varies across a country's principal " -"subdivisions (states, provinces, etc) on a chloropleth map. Each " +"subdivisions (states, provinces, etc) on a choropleth map. Each " "subdivision's value is elevated when you hover over the corresponding " "geographic boundary." msgstr "" @@ -14286,10 +14264,6 @@ msgstr "" msgid "[Alert] %(label)s" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "" - #: superset/viz.py:2349 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" msgstr "" @@ -14307,10 +14281,6 @@ msgstr "" msgid "[Superset] Access to the datasource %(name)s was granted" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "" - #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 msgid "[Untitled]" msgstr "" diff --git a/superset/translations/nl/LC_MESSAGES/messages.json b/superset/translations/nl/LC_MESSAGES/messages.json index 432ccca46b59..ece5bd80df9c 100644 --- a/superset/translations/nl/LC_MESSAGES/messages.json +++ b/superset/translations/nl/LC_MESSAGES/messages.json @@ -1256,7 +1256,7 @@ "Data could not be retrieved from the results backend. You need to re-run the original query.": [ "" ], - "The query associated with these results could not be find. You need to re-run the original query.": [ + "The query associated with these results could not be found. You need to re-run the original query.": [ "" ], "You are not authorized to see this query. If you think this is an error, please reach out to your administrator.": [ @@ -2447,6 +2447,8 @@ ], "X-axis": [""], "Dimension to use on x-axis.": [""], + "Y-axis": [""], + "Dimension to use on y-axis.": [""], "Percentage threshold": [""], "Minimum threshold in percentage points for showing labels.": [""], "Rich tooltip": [""], @@ -4478,7 +4480,7 @@ "Sta manipulatie van de database toe met niet-SELECT statements zoals UPDATE, DELETE, CREATE, enz." ], "Enable query cost estimation": [""], - "For Presto and Postgres, shows a button to compute cost before running a query.": [ + "For Bigquery, Presto and Postgres, shows a button to compute cost before running a query.": [ "" ], "Allow this database to be explored": [""], diff --git a/superset/translations/nl/LC_MESSAGES/messages.po b/superset/translations/nl/LC_MESSAGES/messages.po index c81d13bba446..2daaa619fdc8 100644 --- a/superset/translations/nl/LC_MESSAGES/messages.po +++ b/superset/translations/nl/LC_MESSAGES/messages.po @@ -2769,7 +2769,6 @@ msgid "Filter List" msgstr "Filter Lijst" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:261 #: superset-frontend/src/explore/components/DataTableControl/index.tsx:94 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 @@ -3369,7 +3368,7 @@ msgstr "" #: superset/views/core.py:2321 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" @@ -9922,39 +9921,10 @@ msgstr "SQL" msgid "No query history yet..." msgstr "Nog geen zoekgeschiedenis…" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:137 -msgid "An error occurred when refreshing queries" -msgstr "Er is een fout opgetreden bij het vernieuwen van de queries" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:185 #: superset-frontend/src/components/DatabaseSelector/index.tsx:184 msgid "It seems you don't have access to any database" msgstr "Het lijkt erop dat je geen toegang hebt tot een database" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:200 -msgid "Filter by user" -msgstr "Filter op gebruiker" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:209 -msgid "Filter by database" -msgstr "Filter op database" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:218 -msgid "Query search string" -msgstr "Query zoek string" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:224 -msgid "[From]-" -msgstr "[From]-" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:236 -msgid "[To]-" -msgstr "[To]-" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:245 -msgid "Filter by status" -msgstr "Filter op status" - #: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:117 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:54 #: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:142 @@ -15011,7 +14981,7 @@ msgstr "" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " "query." msgstr "" diff --git a/superset/translations/pt/LC_MESSAGES/message.po b/superset/translations/pt/LC_MESSAGES/message.po index b944475c5591..e06a21ce4f42 100644 --- a/superset/translations/pt/LC_MESSAGES/message.po +++ b/superset/translations/pt/LC_MESSAGES/message.po @@ -2033,7 +2033,6 @@ msgstr "Nenhum registo encontrado" msgid "Filter List" msgstr "Filtros" -#: superset-frontend/src/SqlLab/components/QuerySearch.jsx:296 #: superset-frontend/src/explore/components/DataTableControl.tsx:73 #: superset-frontend/src/explore/components/controls/VizTypeControl.jsx:226 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:398 @@ -3599,40 +3598,11 @@ msgstr "SQL" msgid "No query history yet..." msgstr "Ainda não há histórico de queries ..." -#: superset-frontend/src/SqlLab/components/QuerySearch.jsx:193 #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar.jsx:101 #: superset-frontend/src/components/DatabaseSelector.tsx:151 msgid "It seems you don't have access to any database" msgstr "Parece que não tem acesso a nenhuma base de dados" -#: superset-frontend/src/SqlLab/components/QuerySearch.jsx:220 -msgid "An error occurred when refreshing queries" -msgstr "Ocorreu um erro ao criar a origem dos dados" - -#: superset-frontend/src/SqlLab/components/QuerySearch.jsx:235 -msgid "Filter by user" -msgstr "Valor de filtro" - -#: superset-frontend/src/SqlLab/components/QuerySearch.jsx:244 -msgid "Filter by database" -msgstr "Selecione uma base de dados" - -#: superset-frontend/src/SqlLab/components/QuerySearch.jsx:253 -msgid "Query search string" -msgstr "Pesquisa de Query" - -#: superset-frontend/src/SqlLab/components/QuerySearch.jsx:259 -msgid "[From]-" -msgstr "[A partir de]-" - -#: superset-frontend/src/SqlLab/components/QuerySearch.jsx:271 -msgid "[To]-" -msgstr "[Para]-" - -#: superset-frontend/src/SqlLab/components/QuerySearch.jsx:280 -msgid "Filter by status" -msgstr "Valor de filtro" - #: superset-frontend/src/SqlLab/components/QueryTable.jsx:128 #: superset-frontend/src/dashboard/components/menu/MarkdownModeDropdown.jsx:34 #: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:134 diff --git a/superset/translations/pt_BR/LC_MESSAGES/messages.po b/superset/translations/pt_BR/LC_MESSAGES/messages.po index 2441b2c76832..77695a25b6db 100644 --- a/superset/translations/pt_BR/LC_MESSAGES/messages.po +++ b/superset/translations/pt_BR/LC_MESSAGES/messages.po @@ -1238,10 +1238,6 @@ msgstr "Ocorreu um erro" msgid "An error occurred saving dataset" msgstr "Ocorreu um erro ao salvar o conjunto de dados" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "Ocorreu um erro ao atualizar as consultas" - #: superset/key_value/commands/exceptions.py:33 #, fuzzy msgid "An error occurred while accessing the value." @@ -5928,18 +5924,6 @@ msgstr "Filtrar por usuário" msgid "Filter box" msgstr "Caixa de filtro" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "Filtrar por banco de dados" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "Filtrar por status" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "Filtrar por usuário" - #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 msgid "Filter configuration" msgstr "Configuração do filtro" @@ -6115,7 +6099,7 @@ msgstr "" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 #, fuzzy msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " "query." msgstr "Estima o custo antes de executar uma consulta" @@ -6830,7 +6814,6 @@ msgstr "Problema 1000 - A fonte de dados é muito grande para consulta." msgid "Issue 1001 - The database is under an unusual load." msgstr "Problema 1001 - O banco de dados está sob carga atípica." -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 #: superset-frontend/src/components/DatabaseSelector/index.tsx:183 msgid "It seems you don't have access to any database" @@ -9533,10 +9516,6 @@ msgstr "Nome da consulta" msgid "Query preview" msgstr "Pré-visualização da consulta" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "Texto da consulta de busca" - #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 #, fuzzy msgid "Query was stopped" @@ -10596,7 +10575,6 @@ msgid "Scoping" msgstr "Escopo" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 #: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 @@ -12619,7 +12597,7 @@ msgstr "" #: superset/views/core.py:2280 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" @@ -15404,10 +15382,6 @@ msgstr "" msgid "[Alert] %(label)s" msgstr "[Alert] %(label)s" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "[A partir de]-" - #: superset/viz.py:2349 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" msgstr "[Longitude] e as colunas [Latitude] devem estar presentes em [Group By]" @@ -15426,10 +15400,6 @@ msgstr "Mudar conjunto de dados" msgid "[Superset] Access to the datasource %(name)s was granted" msgstr "[Superset] O acesso à fonte de dados %(name) s foi concedido" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "[Para]-" - #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 #, fuzzy, python-format msgid "[Untitled]" diff --git a/superset/translations/ru/LC_MESSAGES/messages.json b/superset/translations/ru/LC_MESSAGES/messages.json index be3a0f1212e4..9f4009b692b8 100644 --- a/superset/translations/ru/LC_MESSAGES/messages.json +++ b/superset/translations/ru/LC_MESSAGES/messages.json @@ -2,2688 +2,5989 @@ "domain": "superset", "locale_data": { "superset": { + "22": ["22"], "": { "domain": "superset", - "plural_forms": "nplurals=1; plural=0;", + "plural_forms": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);", "lang": "ru" }, - "Home": ["Главная"], - "Annotation Layers": ["Слои аннотаций"], - "Manage": ["Управление"], - "Databases": ["Базы данных"], - "Data": ["БД"], - "Datasets": ["Датасеты"], - "Charts": ["Графики"], - "Dashboards": ["Дашборды"], - "Plugins": ["Плагины"], - "CSS Templates": ["Шаблоны CSS"], - "Row level security": ["Безопасность на уровне строк"], - "Security": ["Безопасность"], - "Import Dashboards": ["Импорт дашбордов"], - "SQL Editor": ["Редактор SQL"], - "SQL Lab": ["Лаборатория SQL"], - "Saved Queries": ["Сохраненные запросы"], - "Query History": ["История запросов"], - "Upload a CSV": ["Загрузить CSV"], - "Upload Excel": ["Загрузить файл Excel"], - "Action Log": ["Журнал Действий"], - "Dashboard Emails": ["Рассылка дашбордов"], - "Chart Email Schedules": ["Рассылка графиков"], - "Alerts": ["Оповещения"], - "Alerts & Reports": ["Оповещения и Рассылка"], - "Access requests": ["Запросы доступа"], - "Druid Datasources": ["Источники Данных Druid"], - "Druid Clusters": ["Список Кластеров Druid"], - "Scan New Datasources": ["Сканирование Новых Источников"], - "Refresh Druid Metadata": ["Обновить Метаданные Druid"], - "Issue 1000 - The datasource is too large to query.": [ - "Проблема 1000 - Источник данных слишком велик для запроса." + "\n This filter was inherited from the dashboard's context.\n It won't be saved when saving the chart.\n ": [ + "\n Фильтр был наследован из контекста дашборда.\n Он не будет сохранен при сохранении графика.\n " ], - "Issue 1001 - The database is under an unusual load.": [ - "Проблема 1001 - Необычная загрузка базы данных." + "\n Error: %(text)s\n ": [ + "\n Ошибка: %(text)s\n " ], - "Issue 1002 - The database returned an unexpected error.": [ - "Проблема 1002 - База данных вернула непредвиденную ошибку." + " (excluded)": [" (исключено)"], + " Set the opacity to 0 if you do not want to override the color specified in the GeoJSON": [ + " Установите прозрачность 0, если вы не хотите переписывать цвет, указанный в GeoJSON" ], - "Issue 1003 - There is a syntax error in the SQL query. Perhaps there was a misspelling or a typo.": [ - "Проблема 1003 - Ошибка в SQL-запросе. Возможно опечатка." + " a dashboard OR ": [" дашборд или "], + " a new one": [" новый"], + " expression which needs to adhere to the ": [ + ", который должен придерживаться " ], - "Issue 1004 - The column was deleted or renamed in the database.": [ - "Проблема 1004 - Столбец был удалён или переименован в базе данных." + " source code of Superset's sandboxed parser": [ + " исходный код sandboxed парсера Суперсета" ], - "Issue 1005 - The table was deleted or renamed in the database.": [ - "Проблема 1005 - Таблица была удалена или переименована в базе данных." + " standard to ensure that the lexicographical ordering\n coincides with the chronological ordering. If the\n timestamp format does not adhere to the ISO 8601 standard\n you will need to define an expression and type for\n transforming the string into a date or timestamp. Note\n currently time zones are not supported. If time is stored\n in epoch format, put `epoch_s` or `epoch_ms`. If no pattern\n is specified we fall back to using the optional defaults on a per\n database/column name level via the extra parameter.": [ + " стандарта для обеспечения того, чтобы лексикографический порядок совпадал с хронологическим порядком. Если формат временной метки не соответствует стандарту ISO 8601, вам нужно будет определить выражение и тип для преобразования строки в дату или временную метку. В настоящее время часовые пояса не поддерживаются. Если время хранится в формате эпохи, введите \\`epoch_s\\` или \\`epoch_ms\\`. Если шаблон не указан, будут использованы необязательные значения по умолчанию на уровне имен для каждой базы данных/столбца с помощью дополнительного параметра." ], - "Issue 1006 - One or more parameters specified in the query are missing.": [ - "Проблема 1006 - Отсутствуют один или несколько параметров, используемых в запросе." + " to add calculated columns": [" для добавления вычисляемых столбцов"], + " to add metrics": [" для добавления мер"], + " to edit or add columns and metrics.": [ + " для редактирования или добавления столбцов и мер." ], - "Invalid certificate": ["Недействительный сертификат"], - "Unsafe return type for function %(func)s: %(value_type)s": [ - "Небезопасный возвращаемый тип для функции %(func)s: %(value_type)s" + " to mark a column as a time column": [ + ", чтобы пометить столбец как столбец даты/времени" ], - "Unsupported return value for method %(name)s": [ - "Неподдерживаемое возвращаемое значение для метода %(name)s" + " to open SQL Lab. From there you can save the query as a dataset.": [ + " в Лаборатории SQL. Там вы сможете сохранить запрос как датасет." ], - "Unsafe template value for key %(key)s: %(value_type)s": [ - "Небезопасное значение для ключа шаблона %(key)s: %(value_type)s" + " to visualize your data.": [" для визуализации ваших данных."], + "!= (Is not equal)": ["!= (не равно)"], + "%(dialect)s cannot be used as a data source for security reasons.": [ + "%(dialect)s не может использоваться в качестве источника данных по соображениям безопасности." ], - "Unsupported template value for key %(key)s": [ - "Неподдерживаемое значение для ключа шаблона %(key)s" + "%(message)s\nThis may be triggered by: \n%(issues)s": [ + "%(message)s\nВозможные причины: \n%(issues)s" ], - "Only `SELECT` statements are allowed against this database": [ - "Для этой БД разрешены только выражения `SELECT`" + "%(name)s.csv": ["%(name)s.csv"], + "%(object)s does not exist in this database.": [ + "%(object)s не существует в этой базе данных." ], - "CTAS (create table as select) can only be run with a query where the last statement is a SELECT. Please make sure your query has a SELECT as its last statement. Then, try running your query again.": [ - "CTAS (create table as select) может быть выполнено только в запросе, последняя операция которого SELECT." + "%(other)s %(tableName)s will appear here": [ + "%(other)s %(tableName)s появятся здесь после добавления" ], - "CVAS (create view as select) can only be run with a query with a single SELECT statement. Please make sure your query has only a SELECT statement. Then, try running your query again.": [ - "может быть выполнено только в запросе, в котором есть только одна операция SELECT." + "%(prefix)s %(title)s": ["%(prefix)s %(title)s"], + "%(rows)d rows returned": ["Получено строк: %(rows)d"], + "%(subtitle)s\nThis may be triggered by:\n %(issue)s": [ + "%(subtitle)s\nВозможные причины:\n %(issue)s" ], - "Viz is missing a datasource": [ - "У визуализации отсутствует источник данных" + "%(suggestion)s instead of \"%(undefinedParameter)s?\"": [ + "%(suggestion)s вместо \"%(undefinedParameter)s\"?", + "%(firstSuggestions)s или %(lastSuggestion)s вместо \"%(undefinedParameter)s\"?", + "%(firstSuggestions)s или %(lastSuggestion)s вместо \"%(undefinedParameter)s\"?" ], - "Applied rolling window did not return any data. Please make sure the source query satisfies the minimum periods defined in the rolling window.": [ - "" + "%(user)s was granted the role %(role)s that gives access to the %(datasource)s": [ + "%(user)s была назначена роль %(role)s, которая дает доступ к %(datasource)s" ], - "From date cannot be larger than to date": [ - "Невозможно выбрать дату [from], которая позже текущего дня" + "%(user)s's profile": ["%(user)s - профиль"], + "%(validator)s was unable to check your query.\nPlease recheck your query.\nException: %(ex)s": [ + "%(validator)s не смог проверить ваш запрос.\nПожалуйста, перепроверьте ваш запрос.\nОшибка: %(ex)s" ], - "Cached value not found": ["Значение не найдено в кеше"], - "Columns missing in datasource: %(invalid_columns)s": [ - "В источнике данных отсутствуют столбцы: %(invalid_columns)s" + "%s Error": ["%s Ошибка"], + "%s PASSWORD": ["%s ПАРОЛЬ"], + "%s Selected": ["%s Выбрано"], + "%s Selected (%s Physical, %s Virtual)": [ + "%s Выбрано (%s Физические, %s Виртуальные)" ], - "Table View": ["Табличный вид"], - "You cannot use [Columns] in combination with [Group By]/[Metrics]/[Percentage Metrics]. Please choose one or the other.": [ - "Нельзя использовать [Столбцы] одновременно с [Группировка по][Показатели][Процентные показатели]. Пожалуйста, выберите что-то одно." + "%s Selected (Physical)": ["%s Выбрано (Физические)"], + "%s Selected (Virtual)": ["%s Выбрано (Виртуальные)"], + "%s aggregates(s)": ["Агрегатных функций: %s"], + "%s column(s)": ["Столбцов: %s"], + "%s operator(s)": ["%s параметр(ы)"], + "%s option": ["%s вариант", "%s варианта", "%s вариантов"], + "%s option(s)": ["%s вариант(ов)"], + "%s row": ["%s строка", "%s строки", "%s строк"], + "%s saved metric(s)": ["Сохраненная мер: %s"], + "%s updated": ["Обновлено: %s"], + "%s%s": ["%s%s"], + "%s-%s of %s": ["%s-%s из %s"], + "(Removed)": ["(Удалено)"], + "(deleted or invalid type)": ["(удалено или невалидный тип)"], + "(no description, click to see stack trace)": [ + "(нет описания, нажмите для просмотра трассировки стека)" ], - "Pick a granularity in the Time section or uncheck 'Include Time'": [ - "Выберите столбец с датой и необходимый период в секции «Время» или снимите флажок «Включая дату»" + "(optional) default value for the filter, when using the multiple option, you can use a semicolon-delimited list of options.": [ + "(опционально) значение по умолчанию для фильтра. Когда используются множественные значения, вы можете вставить список значений, разделённых символами точка с запятой" ], - "Time Table View": [""], - "Pick at least one metric": ["Выберите хотя бы один показатель"], - "When using 'Group By' you are limited to use a single metric": [ - "При использовании поля [Группировка] вы не ограничены использованием одного среза" + "), and they become available in your SQL (example:": [ + "), и они станут доступны в ваших SQL запросах (пример:" ], - "Pivot Table": ["Pivot Table"], - "Please choose at least one 'Group by' field ": [ - "Пожалуйста, выберите хотя бы один срез в поле ‘Группировка’ " + "*%(name)s*\n\n%(description)s\n\n<%(url)s|Explore in Superset>\n\n%(table)s\n": [ + "*%(name)s*\n\n%(description)s\n\n<%(url)s|Исследовать в Суперсете>\n\n%(table)s\n" ], - "Please choose at least one metric": [ - "Пожалуйста, выберите хотя бы один показатель" + "*%(name)s*\n\n%(description)s\n\nError: %(text)s\n": [ + "*%(name)s*\n\n%(description)s\n\nОшибка: %(text)s\n" ], - "Group By' and 'Columns' can't overlap": [ - "Нельзя использовать один и тот же срез в двух полях" - ], - "Treemap": ["Treemap"], - "Calendar Heatmap": ["Calendar Heatmap"], - "Bubble Chart": ["Bubble Chart"], - "Please use 3 different metric labels": [ - "Пожалуйста, выберите разные срезы данных для левой и правой оси" - ], - "Pick a metric for x, y and size": ["Выберите срез для X, Y и размер"], - "Bullet Chart": ["Bullet Chart"], - "Pick a metric to display": ["Выберите показатель для отображения"], - "Big Number with Trendline": ["Big Number with Trendline"], - "Pick a metric!": ["Выберите показатель!"], - "Big Number": ["Big Number"], - "Time Series - Line Chart": ["Time Series - Line Chart"], - "Pick a time granularity for your time series": [ - "Выберите период для временных рядов" + "+ %s more": ["+ еще %s"], + ",": [","], + "-- Note: Unless you save your query, these tabs will NOT persist if you clear your cookies or change browsers.\n\n": [ + "-- Примечание: Пока вы не сохраните ваш запрос, эти вкладки НЕ будут сохранены, если вы очистите куки или смените браузер.\n\n" ], - "An enclosed time range (both start and end) must be specified when using a Time Comparison.": [ - "" + ".": ["."], + "0 Selected": ["0 выбрано"], + "1 calendar day frequency": ["Дневная частота"], + "1 day": ["1 день"], + "1 day ago": ["1 день назад"], + "1 hour": ["1 час"], + "1 hourly frequency": ["Часовая частота"], + "1 minute": ["1 минута"], + "1 minutely frequency": ["Минутная частота"], + "1 month end frequency": ["Месячная частота (конец месяца)"], + "1 month start frequency": ["Месячная частота (начало месяца)"], + "1 week": ["1 неделя"], + "1 week ago": ["1 неделя назад"], + "1 week starting Monday (freq=W-MON)": [ + "1 неделя с началом в Понедельник (част=W-MON)" + ], + "1 week starting Sunday (freq=W-SUN)": [ + "1 неделя с началом в Воскресенье (част=W-SUN)" + ], + "1 year": ["1 год"], + "1 year ago": ["1 год назад"], + "1 year end frequency": ["Годовая частота (конец года)"], + "1 year start frequency": ["Годовая частота (начало года)"], + "10 minute": ["10 минут"], + "104 weeks": ["104 недели"], + "104 weeks ago": ["104 недели назад"], + "15 minute": ["15 минут"], + "156 weeks": ["156 недель"], + "156 weeks ago": ["156 недель назад"], + "1AS": ["1С"], + "1D": ["1Д"], + "1H": ["1Ч"], + "1M": ["1М"], + "1T": ["1МИН"], + "2 years": ["2 года"], + "2 years ago": ["2 года назад"], + "2/98 percentiles": ["2/98 перцентели"], + "28 days": ["28 дней"], + "28 days ago": ["28 дней назад"], + "2D": ["2D карты"], + "3 letter code of the country": ["3х буквенный код страны"], + "3 years": ["3 года"], + "3 years ago": ["3 года назад"], + "30 days": ["30 дней"], + "30 days ago": ["30 дней назад"], + "30 minute": ["30 минут"], + "30 minutes": ["30 минут"], + "30 second": ["30 секунд"], + "30 seconds": ["30 секунд"], + "3D": ["3D карты"], + "4 weeks (freq=4W-MON)": ["4 недели (част=4W-MON)"], + "5 minute": ["5 минут"], + "5 minutes": ["5 минут"], + "5 second": ["5 секунд"], + "5 seconds": ["5 секунд"], + "52 weeks": ["52 недели"], + "52 weeks ago": ["52 недели назад"], + "52 weeks starting Monday (freq=52W-MON)": [ + "52 недели с началом в Понедельник (част=52W-MON)" + ], + "6 hour": ["6 часов"], + "60 days": ["60 дней"], + "7 calendar day frequency": ["Недельная частота"], + "7 days": ["7 дней"], + "7D": ["7Д"], + "9/91 percentiles": ["9/91 перцентели"], + "90 days": ["90 дней"], + ":": [":"], + "< (Smaller than)": ["< (меньше чем)"], + "<= (Smaller or equal)": ["<= (меньше или равно)"], + "<enter SQL expression here>": ["<введите SQL выражение>"], + "<new column>": ["<новый столбец>"], + "<new metric>": ["<новая мера>"], + "<new spatial>": ["<новая пространственная мера>"], + "<no type>": ["<без типа>"], + "== (Is equal)": ["== (равно)"], + "> (Larger than)": ["> (больше чем)"], + ">= (Larger or equal)": [">= (больше или равно)"], + "A Big Number": ["Карточка"], + "A comma separated list of columns that should be parsed as dates": [ + "Разделённый запятыми список столбцов, которые должны быть интерпретированы как даты." ], - "Time Series - Multiple Line Charts": [ - "Time Series - Multiple Line Charts" + "A comma separated list of columns that should be parsed as dates.": [ + "Разделённый запятыми список столбцов, которые должны быть интерпретированы как даты." ], - "Time Series - Dual Axis Line Chart": [ - "Time Series - Dual Axis Line Chart" + "A comma-separated list of schemas that files are allowed to upload to.": [ + "Разделённый запятыми список схем, в которые можно загружать файлы." ], - "Pick a metric for left axis!": ["Выберите значение для левой оси!"], - "Pick a metric for right axis!": ["Выберите значение для правой оси!"], - "Please choose different metrics on left and right axis": [ - "Пожалуйста, выберите разные срезы данных для левой и правой оси" + "A database with the same name already exists.": [ + "База данных с таким же именем уже существует" ], - "Time Series - Bar Chart": ["Time Series - Bar Chart"], - "Time Series - Period Pivot": ["Time Series - Period Pivot"], - "Time Series - Percent Change": ["Time Series - Percent Change"], - "Time Series - Stacked": ["Time Series - Stacked"], - "Histogram": ["Histogram"], - "Must have at least one numeric column specified": [ - "Должен быть указан хотя бы один числовой столбец" + "A full URL pointing to the location of the built plugin (could be hosted on a CDN for example)": [ + "Полный URL, указывающий на местоположение плагина (например, ссылка на CDN)" ], - "Distribution - Bar Chart": ["Distribution - Bar Chart"], - "Can't have overlap between Series and Breakdowns": [ - "Срезы в полях [Столбцы данных] и [Ряды данных] должны быть разными" + "A handlebars template that is applied to the data": [ + "Шаблон handlebars, примененный к данным" ], - "Pick at least one field for [Series]": [ - "Выберите хотя бы одно значение для поля [Столбцы данных]" + "A human-friendly name": ["Человекочитаемое имя"], + "A list of domain names that can embed this dashboard. Leaving this field empty will allow embedding from any domain.": [ + "Список доменных имен, которые могут встраивать этот дашборд. Если оставить поле пустым, любой домен сможет сделать встраивание." ], - "Sunburst": ["Sunburst"], - "Sankey": ["Sankey"], - "Pick exactly 2 columns as [Source / Target]": [ - "Выберите ровно два среза в поле [Источник / Назначение]" + "A list of users who can alter the chart. Searchable by name or username.": [ + "Владельцы - это пользователи, которые могут изменять график" ], - "There's a loop in your Sankey, please provide a tree. Here's a faulty link: {}": [ - "В полях [Источника] и [Назначения] есть одинаковый срез данных - {}. Срезы не должны пересекаться!" + "A map of the world, that can indicate values in different countries.": [ + "Карта мира, на которой могут быть указаны значения в разных странах." ], - "Directed Force Layout": [""], - "Pick exactly 2 columns to 'Group By'": [ - "Выберите ровно два столбца в поле [Группировка]" + "A map that takes rendering circles with a variable radius at latitude/longitude coordinates": [ + "На карте отображаются маркеры переменного радиуса и цвета." ], - "Country Map": ["Карта Стран"], - "World Map": ["Карта Мира"], - "Filters": ["Фильтры"], - "Invalid filter configuration, please select a column": [""], - "Parallel Coordinates": [""], - "Heatmap": ["Heatmap"], - "Horizon Charts": ["Horizon Charts"], - "Mapbox": ["Mapbox"], - "[Longitude] and [Latitude] must be set": [ - "Столбцы [Долгота] и [Широта] должны присутствовать в поле [Группировка]" + "A metric to use for color": [ + "Показатель, используемый для расчета цвета" ], - "Must have a [Group By] column to have 'count' as the [Label]": [ - "Чтобы получить `count` как [Метку], должна быть заполнена [Группировка по]" + "A polar coordinate chart where the circle is broken into wedges of equal angle, and the value represented by any wedge is illustrated by its area, rather than its radius or sweep angle.": [ + "" ], - "Choice of [Label] must be present in [Group By]": [ - "Выбор для [Метки] должен присутствовать в [Группировке по]" + "A readable URL for your dashboard": ["Читаемый URL-адрес для дашборда"], + "A reference to the [Time] configuration, taking granularity into account": [ + "" ], - "Choice of [Point Radius] must be present in [Group By]": [ - "Срез [Радиуса точки] должен присутствовать в поле [Группировка]" + "A report named \"%(name)s\" already exists": [ + "Рассылка с именем \"%(name)s\" уже существует" ], - "[Longitude] and [Latitude] columns must be present in [Group By]": [ - "Столбцы [Долгота] и [Широта] должны присутствовать в поле [Группировка]" + "A reusable dataset will be saved with your chart.": [ + "Переиспользуемый датасет будет сохранен с вашим графиком." ], - "Deck.gl - Multiple Layers": ["Deck.gl - Multiple Layers"], - "Bad spatial key": [""], - "Invalid spatial point encountered: %s": [""], - "Encountered invalid NULL spatial entry, please consider filtering those out": [ - "" + "A screenshot of the dashboard will be sent to your email at": [ + "Скриншот дашборда будет отправлен на ваш электронный адрес" ], - "Deck.gl - Scatter plot": ["Deck.gl - Scatter plot"], - "Deck.gl - Screen Grid": ["Deck.gl - Screen Grid"], - "Deck.gl - 3D Grid": ["Deck.gl - 3D Grid"], - "Deck.gl - Paths": ["Deck.gl - Paths"], - "Deck.gl - Polygon": ["Deck.gl - Polygon"], - "Deck.gl - 3D HEX": ["Deck.gl - 3D HEX"], - "Deck.gl - GeoJSON": ["Deck.gl - GeoJSON"], - "Deck.gl - Arc": ["Deck.gl - Arc"], - "Event flow": ["Event flow"], - "Time Series - Paired t-test": ["Time Series - Paired t-test"], - "Time Series - Nightingale Rose Chart": [ - "Time Series - Nightingale Rose Chart" + "A set of parameters that become available in the query using Jinja templating syntax": [ + "Набор параметров, которые доступны в запросе через шаблонизацию Jinja." ], - "Partition Diagram": ["Partition Diagram"], - "Choose either fields to [Group By] and [Metrics] and/or [Percentage Metrics], or [Columns], not both": [ - "Выберите срез данных в полях [Показатели] или [Столбцы], но не в обоих одновременно" + "A time column must be specified when using a Time Comparison.": [ + "Столбец даты/времени должен быть указан при использовании сравнения по времени" ], - "Box Plot": ["Box Plot"], - "Distribution - NVD3 - Pie Chart": ["Distribution - NVD3 - Pie Chart"], - "iFrame": [""], - "Deleted %(num)d annotation layer": ["Удалено слоёв аннотации: %(num)d"], - "All Text": ["Весь текст"], - "Deleted %(num)d annotation": ["Удалено %(num)d аннотаций"], - "End date must be after start date": [ - "Невозможно выбрать дату [from], которая позже текущего дня" + "A time series chart that visualizes how a related metric from multiple groups vary over time. Each group is visualized using a different color.": [ + "Диаграмма временного ряда, которая визуализирует, как связанная метрика из нескольких групп изменяется с течением времени. Для каждой группы используется свой цвет." ], - "Short description must be unique for this layer": [ - "Краткое описание должно быть уникальным для этого слоя" + "A timeout occurred while executing the query.": [ + "Вышло время исполнения запроса." ], - "Annotations could not be deleted.": ["Аннотации не могут быть удалены."], - "Annotation not found.": ["Аннотация не найдена."], - "Annotation parameters are invalid.": [ - "Параметры аннотации недействительны." + "A timeout occurred while generating a csv.": [ + "Вышло время создания CSV файла." ], - "Annotation could not be created.": ["Аннотация не может быть создана."], - "Annotation could not be updated.": [ - "Аннотация не может быть обновлена." + "A timeout occurred while generating a dataframe.": [ + "Вышло время создания датафрейма." ], - "Annotation delete failed.": ["Удаление аннотации не удалось."], - "Annotation layer parameters are invalid.": [ - "Параметры слоя аннотации недействительны." + "A timeout occurred while taking a screenshot.": [ + "Вышло время создания скриншота." ], - "Annotation layer could not be deleted.": [ - "Слой аннотации не может быть удалён." + "A valid color scheme is required": [ + "Требуется корректная цветовая схема" ], - "Annotation layer could not be created.": [ - "Слой аннотаций не может быть создан." + "APPLY": ["ПРИМЕНИТЬ"], + "APR": ["АПР"], + "AQE": ["Асинхронные запросы"], + "AUG": ["АВГ"], + "AXIS TITLE MARGIN": ["ОТСТУП ЗАГОЛОВКА ОСИ"], + "AXIS TITLE POSITION": ["ПОЛОЖЕНИЕ ЗАГОЛОВКА ОСИ"], + "About": ["О программе"], + "Access": ["Доступ"], + "Access requests": ["Запросы доступа"], + "Access to user activity data is restricted": [ + "Запрещен доступ к истории действий пользователя" ], - "Annotation layer could not be updated.": [ - "Слой аннотаций не может быть обновлён." + "Access token": ["Токен доступа"], + "Access was requested": ["Доступ запрошен"], + "Action": ["Действие"], + "Action Log": ["Журнал действий"], + "Actions": ["Действия"], + "Active": ["Активен"], + "Actual Values": ["Фактические значения"], + "Actual time range": ["Фактический временной интервал"], + "Actual value": ["Фактическое значение"], + "Actual values": ["Фактические значения"], + "Adaptive formatting": ["Адаптивное форматирование"], + "Add": ["Добавить"], + "Add Alert": ["Добавить оповещение"], + "Add CSS Template": ["Добавить CSS шаблон"], + "Add CSS template": ["Добавить CSS шаблоны"], + "Add Chart": ["Добавить график"], + "Add Column": ["Добавить столбец"], + "Add Dashboard": ["Добавить дашборд"], + "Add Database": ["Добавить базу данных"], + "Add Dataset and Create Chart": ["Добавить датасет и создать график"], + "Add Log": ["Добавить запись"], + "Add Metric": ["Добавить меру"], + "Add Report": ["Добавить рассылку"], + "Add Saved Query": ["Добавить сохраненный запрос"], + "Add a Plugin": ["Добавить плагин"], + "Add a dataset": ["Добавить датасет"], + "Add a new tab": ["Новая вкладка"], + "Add a new tab to create SQL Query": [ + "Откройте новую вкладку для создания SQL запроса" + ], + "Add additional custom parameters": [ + "Добавление дополнительных пользовательских параметров" + ], + "Add an annotation layer": ["Добавить слой аннотации"], + "Add an item": ["Добавить запись"], + "Add and edit filters": ["Добавить и изменить фильтры"], + "Add annotation": ["Добавить аннотацию"], + "Add annotation layer": ["Добавить слой аннотации"], + "Add calculated columns to dataset in \"Edit datasource\" modal": [ + "Добавьте новые вычисляемые столбцы в датасет в настройках датасета" ], - "Annotation layer not found.": ["Слой аннотаций не найден."], - "Annotation layer delete failed.": ["Ошибка удаления слоя аннотаций."], - "Annotation layer has associated annotations.": [ - "Слой аннотаций имеет присвоенные аннотации." + "Add calculated temporal columns to dataset in \"Edit datasource\" modal": [ + "Добавьте новые столбцы формата дата/время в датасет в настройках датасета" ], - "Name must be unique": ["Имя должно быть уникальным"], - "Deleted %(num)d chart": ["Удалено %(num)d графиков"], - "Request is not JSON": ["Запрос не в формате JSON"], - "Request is incorrect: %(error)s": ["Запрос некорректен: %(error)s"], - "`confidence_interval` must be between 0 and 1 (exclusive)": [ - "`доверительный_интервал` должен быть между 0 и 1 (исключая)" + "Add dataset": ["Добавить датасет"], + "Add delivery method": ["Добавить способ оповещения"], + "Add extra connection information.": [ + "Дополнительная информация по подключению" ], - "lower percentile must be greater than 0 and less than 100. Must be lower than upper percentile.": [ - "нижний процентиль должен быть больше 0 и меньше верхнего процентиля." + "Add filter": ["Добавить фильтр"], + "Add filters and dividers": ["Добавить фильтры и разделители"], + "Add item": ["Добавить запись"], + "Add metric": ["Добавить меру"], + "Add metrics to dataset in \"Edit datasource\" modal": [ + "Добавьте меры в датасет в настройках датасета" + ], + "Add new color formatter": ["Добавить цветовое форматирование"], + "Add new formatter": ["Добавить форматирование"], + "Add notification method": ["Добавить способ уведомления"], + "Add required control values to preview chart": [ + "Добавьте обязательные значения для предпросмотра графика" + ], + "Add required control values to save chart": [ + "Добавьте обязательные значения для сохранения графика" + ], + "Add sheet": ["Добавить лист"], + "Add the name of the chart": ["Задайте имя графика"], + "Add the name of the dashboard": ["Задайте имя дашборда"], + "Add to dashboard": ["Добавить в дашборд"], + "Add/Edit Filters": ["Добавить/изменить фильтры"], + "Added": ["Добавлено"], + "Added to 1 dashboard": [ + "Добавлено в 1 дашборд", + "Добавлено в %s дашборда", + "Добавлено в %s дашбордов" + ], + "Additional Parameters": ["Дополнительные параметры"], + "Additional fields may be required": [""], + "Additional information": ["Дополнительная информация"], + "Additional metadata": ["Дополнительные метаданные"], + "Additional padding for legend.": ["Дополнительный отступ для легенды"], + "Additional parameters": ["Дополнительные параметры"], + "Additional settings.": ["Дополнительная настройка"], + "Additional text to add before or after the value, e.g. unit": [ + "Дополнительный текст перед значением, например, единица измерения" + ], + "Additive": ["Смешанный"], + "Adjust how this database will interact with SQL Lab.": [ + "Настройка взаимодействия базы данных с Лабораторией SQL" + ], + "Advanced": ["Продвинутая настройка"], + "Advanced Analytics": ["Расширенная аналитика"], + "Advanced Data type": ["Расширенный тип данных"], + "Advanced analytics": ["Расширенная аналитика"], + "Advanced analytics Query A": ["Расширенный анализ: запрос А"], + "Advanced analytics Query B": ["Расширенный анализ: запрос Б"], + "Advanced data type": ["Расширенный тип данных"], + "Advanced-Analytics": ["Продвинутая аналитика"], + "Aesthetic": ["Эстетично"], + "After": ["После"], + "Aggregate": ["Агрегация"], + "Aggregate Mean": ["Агрегированное среднее"], + "Aggregate Sum": ["Агрегированная сумма"], + "Aggregate function applied to the list of points in each cluster to produce the cluster label.": [ + "Агрегатная функция, применяемая для списка точек в каждом кластере для создания метки кластера." + ], + "Aggregate function to apply when pivoting and computing the total rows and columns": [ + "Агрегатная функция, применяемая для сводных таблиц и вычислении суммарных значений." + ], + "Aggregates data within the boundary of grid cells and maps the aggregated values to a dynamic color scale": [ + "" ], - "upper percentile must be greater than 0 and less than 100. Must be higher than lower percentile.": [ - "верхний процентиль должен быть больше нижнего процентиля и меньше 100." + "Aggregation function": ["Функция агрегирования"], + "Alert Triggered, In Grace Period": [ + "Оповещение сработало во время перерыва" ], - "`width` must be greater or equal to 0": [ - "`ширина` должна быть больше, чем 0" + "Alert condition": ["Условие оповещения"], + "Alert condition schedule": ["Расписание условия оповещения"], + "Alert ended grace period.": ["У оповещения закончился перерыв."], + "Alert failed": ["Оповещение не сработало"], + "Alert fired during grace period.": [ + "Оповещение сработало во время перерыва" ], - "`row_limit` must be greater than or equal to 1": [ - "`лимит_строк` должен быть больше или равен 1" + "Alert found an error while executing a query.": [ + "Возникла ошибка при выполнении запроса для оповещения." ], - "`row_offset` must be greater than or equal to 0": [ - "`смещение_строк` должно быть больше или равно 0" + "Alert name": ["Имя оповещения"], + "Alert on grace period": ["Оповещение во время перерыва"], + "Alert query returned a non-number value.": [ + "Запрос оповещения вернул нечисловое значение." ], - "There are associated alerts or reports: %s,": [ - "Существуют оповещения или рассылки: %s," + "Alert query returned more than one column.": [ + "Запрос оповещения вернул больше, чем один столбец." ], - "Database does not exist": ["База данных не существует"], - "Dashboards do not exist": ["Дашборды отсутствуют"], - "Datasource type is required when datasource_id is given": [ - "Тип источника данных обязателен, если задан ID" + "Alert query returned more than one column. %s columns returned": [ + "Запрос оповещения вернул больше, чем один столбец. Возвращено столбцов: %s" ], - "Chart parameters are invalid.": ["Параметры графика недействительны."], - "Chart could not be created.": ["График не может быть создан."], - "Chart could not be updated.": ["График не может быть обновлён."], - "Chart could not be deleted.": ["График не может быть удалён."], - "There are associated alerts or reports": [ - "Существуют привязанные оповещения или рассылки" + "Alert query returned more than one row.": [ + "Запрос оповещения вернул больше, чем одну строку." ], - "Changing this chart is forbidden": ["Изменение этого графика запрещено"], - "Charts could not be deleted.": ["Графики не могут быть удалены."], - "Import chart failed for an unknown reason": [ - "Импорт графика не удался по неизвестной причине" + "Alert query returned more than one row. %s rows returned": [ + "Запрос оповещения вернул больше, чем одну строку. Возвращено строк: %s" ], - "Database does not exist": ["База данных не существует"], - "Dashboards do not exist": ["Дашборды отсутствуют"], - "Datasource type is required when datasource_id is given": [ - "Тип источника данных обязателен, если задан ID" + "Alert running": ["Выполняется оповещение"], + "Alert triggered, notification sent": [ + "Сработало оповещение, уведомление отправлено" ], - "Chart parameters are invalid.": ["Параметры графика недействительны."], - "Chart could not be created.": ["График не может быть создан."], - "Chart could not be updated.": ["График не может быть обновлён."], - "Chart could not be deleted.": ["График не может быть удалён."], - "There are associated alerts or reports": [ - "Существуют привязанные оповещения или рассылки" + "Alert validator config error.": [ + "Неверная конфигурация валидатора оповещений." ], - "Changing this chart is forbidden": ["Изменение этого графика запрещено"], - "Charts could not be deleted.": ["Графики не могут быть удалены."], - "Import chart failed for an unknown reason": [ - "Импорт графика не удался по неизвестной причине" + "Alerts": ["Оповещения"], + "Alerts & Reports": ["Оповещения и отчеты"], + "Alerts & reports": ["Оповещения и отчеты"], + "Align +/-": ["Выровнять +/-"], + "All": ["Все"], + "All Text": ["Весь текст"], + "All charts": ["Все графики"], + "All filters": ["Все фильтры"], + "All filters (%(filterCount)d)": ["Все фильтры (%(filterCount)d)"], + "All panels": ["Все панели"], + "All panels with this column will be affected by this filter": [ + "Фильтр будет применён ко всем панелям с этим столбцом" ], - "Owners are invalid": ["Владельцы недействительны"], - "Dataset does not exist": ["Источник данных %(name)s уже существует"], - "`operation` property of post processing object undefined": [ - "Неопределено свойство `operation` объекта пост-процессинга" + "Allow CREATE TABLE AS": ["Разрешить CREATE TABLE AS"], + "Allow CREATE TABLE AS option in SQL Lab": [ + "Разрешить CREATE TABLE AS в Лаборатории SQL" ], - "Unsupported post processing operation: %(operation)s": [ - "Неподдерживаемая операция пост-процессинга: %(operation)s" + "Allow CREATE VIEW AS": ["Разрешить CREATE VIEW AS"], + "Allow CREATE VIEW AS option in SQL Lab": [ + "Разрешить CREATE VIEW AS в Лаборатории SQL" ], - "Adding new datasource [{}]": ["Добавление нового источника данных [{}]"], - "Refreshing datasource [{}]": ["Обновление источника данных [{}]"], - "Metric(s) {} must be aggregations.": [ - "Показатель(и) {} должны быть агрегированы." + "Allow Csv Upload": ["Разрешить загрузку CSV"], + "Allow DML": ["Разрешить DML"], + "Allow columns to be rearranged": ["Разрешить смену столбцов местами"], + "Allow creation of new tables based on queries": [ + "Разрешить создание новых таблиц на основе запросов" ], - "Unsupported extraction function: ": ["Неподдерживаемая функция: "], - "Columns": ["Столбцы"], - "Show Druid Column": ["Показать столбец Druid"], - "Add Druid Column": ["Добавить столбец Druid"], - "Edit Druid Column": ["Редактировать столбец Druid"], - "Column": ["Столбец"], - "Type": ["Тип"], - "Datasource": ["Источник данных"], - "Groupable": ["Группируемый"], - "Filterable": ["Фильтруемый"], - "Whether this column is exposed in the `Filters` section of the explore view.": [ - "Необходимо отметить, если столбец должен быть доступен в разделе «Фильтры»." + "Allow creation of new views based on queries": [ + "Разрешить создание новых представлений на основе запросов" ], - "Metrics": ["Показатели"], - "Show Druid Metric": ["Показать Druid Метрики"], - "Add Druid Metric": ["Добавить Druid Метрику"], - "Edit Druid Metric": ["Редактировать Druid Метрику"], - "Metric": ["Показатель"], - "Description": ["Описание"], - "Verbose Name": ["Полное имя"], - "JSON": ["JSON"], - "Druid Datasource": ["Druid - Источники Данных"], - "Warning Message": ["Предупреждающее сообщение"], - "Show Druid Cluster": ["Показать кластер Druid"], - "Add Druid Cluster": ["Добавить кластер Druid"], - "Edit Druid Cluster": ["Редактировать кластер Druid"], - "Cluster Name": ["Имя кластера"], - "Broker Host": ["Хост брокера"], - "Broker Port": ["Порт брокера"], - "Broker Username": ["Пользователь брокера"], - "Broker Password": ["Пароль брокера"], - "Broker Endpoint": ["Адрес брокера"], - "Cache Timeout": ["Тайм-аут кеша"], - "Metadata Last Refreshed": ["Метаданные обновлены"], - "Duration (in seconds) of the caching timeout for this cluster. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.": [ - "Тайм-аут кеша (в секундах) для этого кластера. Тайм-аут 0 означает, что кеш не может быть просрочен." - ], - "Druid supports basic authentication. See [auth](http://druid.io/docs/latest/design/auth.html) and druid-basic-security extension": [ - "Druid поддерживает обычную аутентификацию. См. [эту страницу](http://druid.io/docs/latest/design/auth.html) и расширения для druid-basic-security" - ], - "Show Druid Datasource": ["Показать источник данных Druid"], - "Add Druid Datasource": ["Добавить источник данных Druid"], - "Edit Druid Datasource": ["Редактировать источник данных Druid"], - "The list of charts associated with this table. By altering this datasource, you may change how these associated charts behave. Also note that charts need to point to a datasource, so this form will fail at saving if removing charts from a datasource. If you want to change the datasource for a chart, overwrite the chart from the 'explore view'": [ - "Список графиков, связанных с этой таблицей. Изменяя этот источник данных, можно изменить поведение связанных с ним графиков. Также обратите внимание, что графики должны указывать на источник данных, поэтому эта форма не будет сохранена при удалении срезов из источника данных. Если вы хотите изменить источник данных для среза, сделайте это в свойствах самого графика." + "Allow data manipulation language": [ + "Разрешить операции вставки, обновления и удаления данных" ], - "Timezone offset (in hours) for this datasource": [ - "Смещение часового пояса (в часах) для этого источника данных" + "Allow end user to drag-and-drop column headers to rearrange them. Note their changes won't persist for the next time they open the chart.": [ + "Разрешить конечному пользователю перемещать столбцы, удерживая их заголовки. Заметьте, такие изменения будут нейтрализованы при следующем обращении к дашборду." ], - "Time expression to use as a predicate when retrieving distinct values to populate the filter component. Only applies when `Enable Filter Select` is on. If you enter `7 days ago`, the distinct list of values in the filter will be populated based on the distinct value over the past week": [ - "Выражение времени для использования в качестве предиката при получении различных значений для заполнения компонента фильтра. Применяется только в том случае, если включен параметр «включить выбор фильтра». Если Вы введете «7 дней назад», то список различных значений в фильтре будет заполнен на основе определенного значения за последнюю неделю" + "Allow file uploads to database": [ + "Разрешить загрузку файлов в базу данных" ], - "Whether to populate the filter's dropdown in the explore view's filter section with a list of distinct values fetched from the backend on the fly": [ - "Получение списка фильтруемых значений, выполняя онлайн-запрос к серверу" + "Allow manipulation of the database using non-SELECT statements such as UPDATE, DELETE, CREATE, etc.": [ + "Разрешить управление базой данных, используя запросы UPDATE, DELETE, CREATE и т.п." ], - "Redirects to this endpoint when clicking on the datasource from the datasource list": [ - "Перенаправление на эту конечную точку при нажатии на источник данных из списка источников данных" + "Allow multiple selections": ["Разрешить множественный выбор"], + "Allow node selections": ["Разрешить выбор вершин"], + "Allow sending multiple polygons as a filter event": [""], + "Allow this database to be explored": [ + "Разрешить изучение этой базы данных" ], - "Duration (in seconds) of the caching timeout for this datasource. A timeout of 0 indicates that the cache never expires. Note this defaults to the cluster timeout if undefined.": [ - "Тайм-аут (в секундах) кеша для этого источника данных. Тайм-аут 0 означает, что кеш не может быть просрочен." + "Allow this database to be queried in SQL Lab": [ + "Разрешить запросы к этой базе данных в Лаборатории SQL" ], - "Associated Charts": ["Связанные графики"], - "Data Source": ["Источник данных"], - "Cluster": ["Кластер"], - "Owners": ["Владельцы"], - "Is Hidden": ["Скрыто"], - "Enable Filter Select": ["Включить выбор фильтра"], - "Default Endpoint": ["Адрес по-умолчанию"], - "Time Offset": ["Смещение времени"], - "Datasource Name": ["Имя источника данных"], - "Fetch Values From": ["Извлечь значения из"], - "Changed By": ["Изменено"], - "Modified": ["Изменено"], - "Refreshed metadata from cluster [{}]": [ - "Обновлённые метаданные из кластера [{}]" + "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in SQL Lab": [ + "Разрешить управление базой данных, используя запросы UPDATE, DELETE, CREATE и т.п. в Лаборатории SQL" ], - "Only `SELECT` statements are allowed": [ - "Допустимы только выражения `SELECT`" + "Allowed Domains (comma separated)": [ + "Разрешенные домены (разделить запятыми)" ], - "Only single queries supported": [ - "Поддерживаются только одиночные запросы" + "Alphabetical": ["В алфавитном порядке"], + "Also known as a box and whisker plot, this visualization compares the distributions of a related metric across multiple groups. The box in the middle emphasizes the mean, median, and inner 2 quartiles. The whiskers around each box visualize the min, max, range, and outer 2 quartiles.": [ + "" ], - "Error in jinja expression in fetch values predicate: %(msg)s": [""], - "Error in jinja expression in FROM clause: %(msg)s": [""], - "Virtual dataset query cannot consist of multiple statements": [ - "Виртуальный датасет не может содержать несколько выражений" + "Altered": ["Измененено"], + "An Error Occurred": ["Произошла ошибка"], + "An alert named \"%(name)s\" already exists": [ + "Оповещение с именем \"%(name)s\" уже существует" ], - "Virtual dataset query must be read-only": [ - "Виртуальный датасет должен быть read-only" + "An enclosed time range (both start and end) must be specified when using a Time Comparison.": [ + "При использовании сравнения времени необходимо указать закрытый временной интервал (как начало, так и конец)." ], - "Error in jinja expression in RLS filters: %(msg)s": [""], - "Datetime column not provided as part table configuration and is required by this type of chart": [ - "Для данного графика необходим временной ряд. Укажите столбец с датой в соответствующем поле раздела [Время]" + "An engine must be specified when passing individual parameters to a database.": [ + "Движок должен быть указан при передаче индивидуальных параметров к базе." ], - "Empty query?": ["Пустой запрос?"], - "Metric '%(metric)s' does not exist": [ - "Показатель ‘%(metric)s’ не существует" + "An error has occurred": ["Произошла ошибка"], + "An error occurred": ["Произошла ошибка"], + "An error occurred saving dataset": [ + "Произошла ошибка при сохранении датасета" ], - "Invalid filter operation type: %(op)s": [ - "Недействительный тип операции фильтра: %(op)s" + "An error occurred while accessing the value.": [ + "Произошла ошибка при доступе к значению" ], - "Error in jinja expression in WHERE clause: %(msg)s": [""], - "Error in jinja expression in HAVING clause: %(msg)s": [""], - "Show Column": ["Показать столбец"], - "Add Column": ["Добавить столбец"], - "Edit Column": ["Редактировать столбец"], - "Whether to make this column available as a [Time Granularity] option, column has to be DATETIME or DATETIME-like": [ - "Сделать этот столбец доступным в разделе [Время]. Столбец должен быть в формате DATETIME" + "An error occurred while collapsing the table schema. Please contact your administrator.": [ + "Произошла ошибка при сворачивании схемы. Пожалуйста, свяжитесь с администратором." ], - "The data type that was inferred by the database. It may be necessary to input a type manually for expression-defined columns in some cases. In most case users should not need to alter this.": [ - "Задать тип данных. В некоторых случаях может потребоваться ввести тип вручную для столбцов, которые формируются специальными запросами. В большинстве случаев изменять содержимое этого поля не обязательно." + "An error occurred while creating %ss: %s": [ + "Произошла ошибка при создании %sов: %s" ], - "Table": ["Таблица"], - "Expression": ["Выражение SQL"], - "Is temporal": ["Содержит дату /время"], - "Datetime Format": ["Формат Datetime"], - "Invalid date/timestamp format": ["Формат Даты / Времени"], - "Show Metric": ["Показать показатель"], - "Add Metric": ["Добавить показатель"], - "Edit Metric": ["Редактировать показатель"], - "SQL Expression": ["Выражение SQL"], - "D3 Format": ["Формат D3"], - "Extra": ["Дополнительные параметры"], - "Row level security filter": ["Фильтр на уровне строк"], - "Show Row level security filter": ["Показать фильтр на уровне строк"], - "Add Row level security filter": ["Добавить фильтр на уровне строк"], - "Edit Row level security filter": ["Править фильтр на уровне строк"], - "Regular filters add where clauses to queries if a user belongs to a role referenced in the filter. Base filters apply filters to all queries except the roles defined in the filter, and can be used to define what users can see if no RLS filters within a filter group apply to them.": [ - "" + "An error occurred while creating the data source": [ + "Произошла ошибка при создании источника данных" ], - "These are the tables this filter will be applied to.": [ - "Это таблицы, к которым будет применён фильтр." + "An error occurred while creating the value.": [ + "Произошла ошибка при создании значения" ], - "For regular filters, these are the roles this filter will be applied to. For base filters, these are the roles that the filter DOES NOT apply to, e.g. Admin if admin should see all data.": [ - "" + "An error occurred while deleting the value.": [ + "Произошла ошибка при удалении значения" ], - "Filters with the same group key will be ORed together within the group, while different filter groups will be ANDed together. Undefined group keys are treated as unique groups, i.e. are not grouped together. For example, if a table has three filters, of which two are for departments Finance and Marketing (group key = 'department'), and one refers to the region Europe (group key = 'region'), the filter clause would apply the filter (department = 'Finance' OR department = 'Marketing') AND (region = 'Europe').": [ - "" + "An error occurred while expanding the table schema. Please contact your administrator.": [ + "Произошла ошибка при разворачивании схемы. Пожалуйста, свяжитесь с администратором." ], - "This is the condition that will be added to the WHERE clause. For example, to only return rows for a particular client, you might define a regular filter with the clause `client_id = 9`. To display no rows unless a user belongs to a RLS filter role, a base filter can be created with the clause `1 = 0` (always false).": [ - "" + "An error occurred while fetching %s info: %s": [ + "Произошла ошибка при получении информации о %s: %s" ], - "Tables": ["Таблицы"], - "Roles": ["Роли"], - "Clause": ["Условие"], - "Creator": ["Автор"], - "Show Table": ["Показать таблицу"], - "Import a table definition": ["Импортировать определение таблицы"], - "Edit Table": ["Редактировать таблицу"], - "Name of the table that exists in the source database": [ - "Имя таблицы, которая существует в исходной базе данных" + "An error occurred while fetching %ss: %s": [ + "Произошла ошибка при получении: %s: %s" ], - "Schema, as used only in some databases like Postgres, Redshift and DB2": [ - "Схема, используется только в некоторых базах данных, таких как Postgres, Redshift и DB2" + "An error occurred while fetching available CSS templates": [ + "Произошла ошибка при получении доступных CSS-шаблонов" ], - "This fields acts a Superset view, meaning that Superset will run a query against this string as a subquery.": [ - "Это поле будет выполнять запрос в качестве подзапроса." + "An error occurred while fetching chart created by values: %s": [ + "Произошла ошибка при получении создателя графика: %s" ], - "Predicate applied when fetching distinct value to populate the filter control component. Supports jinja template syntax. Applies only when `Enable Filter Select` is on.": [ - "Предикат применяется при получении значений для компонента - «Фильтр». Поддерживает синтаксис jinja. Применяется только в том случае, если включен параметр «Включить Онлайн Фильтр»." + "An error occurred while fetching chart owners values: %s": [ + "Произошла ошибка при получении владельцев графика: %s" ], - "Redirects to this endpoint when clicking on the table from the table list": [ - "Перенаправление на эту конечную точку при нажатии на таблицу в общем списке" + "An error occurred while fetching created by values: %s": [ + "Произошла ошибка при построении графика: %s" ], - "Whether the table was generated by the 'Visualize' flow in SQL Lab": [ - "" + "An error occurred while fetching dashboard created by values: %s": [ + "Произошла ошибка при получении создателя дашборда: %s" ], - "A set of parameters that become available in the query using Jinja templating syntax": [ - "" + "An error occurred while fetching dashboard owner values: %s": [ + "Произошла ошибка при получении владельца дашборда: %s" ], - "Duration (in seconds) of the caching timeout for this table. A timeout of 0 indicates that the cache never expires. Note this defaults to the database timeout if undefined.": [ - "" + "An error occurred while fetching dashboards": [ + "Произошла ошибка при получении дашбордов" ], - "Database": ["База данных"], - "Last Changed": ["Последнее изменение"], - "Schema": ["Схема"], - "Offset": ["Смещение"], - "Table Name": ["Имя Таблицы"], - "Fetch Values Predicate": ["Извлечь Значения Предиката"], - "Main Datetime Column": ["Основной столбец с датой"], - "SQL Lab View": ["Лаборатория SQL"], - "Template parameters": ["Параметры шаблона"], - "The table was created. As part of this two-phase configuration process, you should now click the edit button by the new table to configure it.": [ - "Таблица была создана. Теперь нажмите на кнопку редактирования напротив новой таблицы, чтобы настроить её." - ], - "Refresh Metadata": ["Обновить метаданные"], - "Refresh column metadata": ["Обновить метаданные столбцов"], - "Metadata refreshed for the following table(s): %(tables)s": [ - "Метаданные обновлены для следующих таблиц: %(tables)s" - ], - "The following tables added new columns: %(tables)s": [""], - "The following tables removed columns: %(tables)s": [""], - "The following tables update column metadata: %(tables)s": [""], - "Unable to refresh metadata for the following table(s): %(tables)s": [ - "Метаданные обновлены для следующих таблиц: %(tables)s" - ], - "Deleted %(num)d css template": ["Удалено %(num)d шаблонов CSS"], - "CSS template could not be deleted.": [ - "Шаблон CSS не может быть удалён." - ], - "CSS template not found.": ["Шаблон CSS не найден."], - "Deleted %(num)d dashboard": ["Удалено %(num)d дашбордов"], - "Title or Slug": ["Заголовок"], - "Must be unique": ["Должно быть уникально"], - "Dashboard parameters are invalid.": [ - "Параметры дашборда недействительны." - ], - "Dashboard not found.": ["Дашборд не найден."], - "Dashboard could not be created.": ["Дашборд не может быть создан."], - "Dashboards could not be deleted.": ["Дашборды не могут быть удалены."], - "Dashboard could not be updated.": ["Дашборд не может быть обновлён."], - "Dashboard could not be deleted.": ["Дашборд не может быть удалён."], - "Changing this Dashboard is forbidden": [ - "Изменение этого дашборда запрещено" + "An error occurred while fetching dashboards: %s": [ + "Произошла ошибка при получении дашбордов: %s" ], - "Import dashboard failed for an unknown reason": [ - "Импорт дашборда не удался по неизвестной причине" + "An error occurred while fetching database related data: %s": [ + "Произошла ошибка при получении данных о базе данных: %s" ], - "No data in file": ["Нет данных в файле"], - "Table name undefined": ["Имя таблицы не определено"], - "Invalid connection string, a valid string usually follows: driver://user:password@database-host/database-name": [ - "Недействительная строка подключения, правильная строка обычно следует следующему шаблону: драйвер://пользователь:пароль@хостБД/имяБД" + "An error occurred while fetching database values: %s": [ + "Произошла ошибка при получении значений базы данных: %s" ], - "SQLite database cannot be used as a data source for security reasons.": [ - "БД SQLite не может быть использована как источник данных из-за потенциальных проблем с безопасностью." + "An error occurred while fetching dataset datasource values: %s": [ + "Произошла ошибка при получении значений датасета: %s" ], - "Field cannot be decoded by JSON. %(msg)s": [""], - "The metadata_params in Extra field is not configured correctly. The key %(key)s is invalid.": [ - "" + "An error occurred while fetching dataset owner values: %s": [ + "Произошла ошибка при получении владельца датасета: %s" ], - "Database parameters are invalid.": [ - "Параметры базы данных недействительны." + "An error occurred while fetching dataset related data": [ + "Произошла ошибка при получении метаданных датасета" ], - "A database with the same name already exists": [ - "Источник данных %(name)s уже существует" + "An error occurred while fetching dataset related data: %s": [ + "Произошла ошибка при получении данных о датасете: %s" ], - "Field is required": ["Поле обязательно"], - "Field cannot be decoded by JSON. %{json_error}s": [""], - "The metadata_params in Extra field is not configured correctly. The key %{key}s is invalid.": [ - "" + "An error occurred while fetching datasets: %s": [ + "Произошла ошибка при получении датасетов: %s" ], - "Database not found.": ["База данных не найдена."], - "Database could not be created.": ["База данных не может быть создана."], - "Database could not be updated.": [ - "База данных не может быть обновлена." + "An error occurred while fetching function names.": [ + "Произошла ошибка при получении имен функций" ], - "Connection failed, please check your connection settings": [ - "Подключение не удалось, пожалуйста, проверьте строку подключения" + "An error occurred while fetching owners values: %s": [ + "Произошла ошибка при получении владельцев графика: %s" ], - "Cannot delete a database that has tables attached": [ - "Невозможно удалить базу данных, для которой созданы таблицы" + "An error occurred while fetching schema values: %s": [ + "Произошла ошибка при извлечении значений схемы: %s" ], - "Database could not be deleted.": ["База данных не может быть удалена."], - "Stopped an unsafe database connection": [ - "Выберите любые столбцы для проверки метаданных" + "An error occurred while fetching tab state": [ + "Произошла ошибка при получении данных вкладки" ], - "Could not load database driver": [ - "Невозможно загрузить драйвер базы данных" + "An error occurred while fetching table metadata": [ + "Произошла ошибка при получении метаданных из таблицы" ], - "Unexpected error occurred, please check your logs for details": [ - "Произошла непредвиденная ошибка, пожалуйста, проверьте логи для подробностей" + "An error occurred while fetching table metadata. Please contact your administrator.": [ + "Произошла ошибка при получении метаданных таблицы. Пожалуйста, свяжитесь с администратором." ], - "Import database failed for an unknown reason": [ - "Импорт базы данных не удался по неизвестной причине" + "An error occurred while fetching user values: %s": [ + "Произошла ошибка при извлечении пользовательских значений: %s" ], - "Could not load database driver: {}": [ - "Невозможно загрузить драйвер базы данных: {}" + "An error occurred while hiding the left bar. Please contact your administrator.": [ + "Произошла ошибка при сворачивании левой панели. Пожалуйста, свяжитесь с администратором." ], - "Deleted %(num)d dataset": ["Удалено датасетов: %(num)d"], - "Null or Empty": ["Null или пусто"], - "Database not allowed to change": ["Базу данных не разрешено изменять"], - "One or more columns do not exist": [ - "Один или несколько столбцов не существуют" + "An error occurred while importing %s: %s": [ + "Произошла ошибка при попытке импортировать %s: %s" ], - "One or more columns are duplicated": [ - "Один или несколько столбцов-дубликатов" + "An error occurred while loading the SQL": [ + "Произошла ошибка при загрузке SQL" ], - "One or more columns already exist": [ - "Один или несколько столбцов уже существуют" + "An error occurred while opening Explore": [ + "Произошла ошибка при открытии режима исследования" ], - "One or more metrics do not exist": [ - "Выберите один или несколько показателей для отображения" + "An error occurred while parsing the key.": [ + "Произошла ошибка при парсинге ключа." ], - "One or more metrics are duplicated": [ - "Выберите один или несколько показателей для отображения" + "An error occurred while pruning logs ": [ + "Произошла ошибка при удалении журналов " ], - "One or more metrics already exist": [ - "Выберите один или несколько показателей для отображения" + "An error occurred while removing query. Please contact your administrator.": [ + "Произошла ошибка при удалении запроса. Пожалуйста, свяжитесь с администратором." ], - "Table [%(table_name)s] could not be found, please double check your database connection, schema, and table name": [ - "Не удалось найти таблицу [%(table_name)s]. Пожалуйста, проверьте подключение к базе данных, схему и имя таблицы" + "An error occurred while removing tab. Please contact your administrator.": [ + "Произошла ошибка при удалении вкладки. Пожалуйста, свяжитесь с администратором." ], - "Dataset parameters are invalid.": [ - "Параметры датасета недействительны." + "An error occurred while removing the table schema. Please contact your administrator.": [ + "Произошла ошибка при удалении схемы. Пожалуйста, свяжитесь с администратором." ], - "Dataset could not be created.": ["Датасет не может быть создан."], - "Dataset could not be updated.": ["Датасет не может быть обновлён."], - "Dataset could not be deleted.": ["Датасет не может быть удалён."], - "Dataset(s) could not be bulk deleted.": [ - "Датасет(ы) не может быть удален." + "An error occurred while rendering the visualization: %s": [ + "Произошла ошибка при построении графика: %s" ], - "Changing this dataset is forbidden": [ - "Изменение этого датасета запрещено" + "An error occurred while setting the active tab. Please contact your administrator.": [ + "Произошла ошибка при установке активной вкладки. Пожалуйста, свяжитесь с администратором." ], - "Import dataset failed for an unknown reason": [ - "Импорт датасета не удался по неизвестной причине" + "An error occurred while setting the tab autorun. Please contact your administrator.": [ + "Произошла ошибка при настройке автозапуска вкладки. Пожалуйста, свяжитесь с администратором." ], - "Unknown Presto Error": ["Неизвестная ошибка"], - "We can't seem to resolve the column \"%(column_name)s\" at line %(location)s.": [ - "" + "An error occurred while setting the tab database ID. Please contact your administrator.": [ + "Произошла ошибка при установке ID базы данных для вкладки. Пожалуйста, свяжитесь с администратором." ], - "The table \"%(table_name)s\" does not exist. A valid table must be used to run this query.": [ - "" + "An error occurred while setting the tab name. Please contact your administrator.": [ + "Произошла ошибка при настройке заголовка вкладки. Пожалуйста, свяжитесь с администратором." ], - "Deleted %(num)d saved query": ["Удалено %(num)d сохранённых запросов"], - "Saved queries could not be deleted.": [ - "Сохранённые запросы не могут быть удалены." + "An error occurred while setting the tab schema. Please contact your administrator.": [ + "Произошла ошибка при настройке схемы. Пожалуйста, свяжитесь с администратором." ], - "Saved query not found.": ["Сохранённый запрос не найден."], - "Deleted %(num)d report schedule": ["Удалено %(num)d рассылок"], - "Alert query returned more than one row. %s rows returned": [ - "Запрос от оповещения вернул больше одной строки. %s строк возвращено" + "An error occurred while setting the tab template parameters. Please contact your administrator.": [ + "Произошла ошибка при установке параметров шаблона вкладки. Пожалуйста, свяжитесь с администратором." ], - "Alert query returned more than one column. %s columns returned": [ - "Запрос от оповещения вернул больше одного столбца. %s столбцов возвращено" + "An error occurred while starring this chart": [ + "Произошла ошибка при добавлении графика в избранное" ], - "Dashboard does not exist": ["Дашборд не существует"], - "Chart does not exist": ["График не существует"], - "Database is required for alerts": [ - "База данных требуется для уведомлений" + "An error occurred while storing the latest query id in the backend. Please contact your administrator if this problem persists.": [ + "Возникла ошибка при попытке сохранения ID последнего запроса на сервере. Пожалуйста, обратитесь к вашему администратору, если проблема останется." ], - "Type is required": ["Тип обязателен"], - "Choose a chart or dashboard not both": ["Удалить график из дашборда"], - "Report Schedule parameters are invalid.": [ - "Параметры графика рассылки недействительны." + "An error occurred while storing your query in the backend. To avoid losing your changes, please save your query using the \"Save Query\" button.": [ + "Произошла ошибка при сохранении запроса на сервере. Чтобы сохранить изменения, пожалуйста, сохраните ваш запрос через кнопку \"Сохранить как\"." ], - "Report Schedule could not be deleted.": [ - "Рассылка не может быть удалена." + "An error occurred while updating the value.": [ + "Произошла ошибка при обновлении значения" ], - "Report Schedule could not be created.": [ - "Рассылка не может быть создана." + "An error occurred while upserting the value.": [ + "Произошла ошибка при вставке значения." ], - "Report Schedule could not be updated.": [ - "Рассылка не может быть обновлена." + "An unexpected error occurred": ["Произошла неожиданная ошибка"], + "An unknown error occurred. Please contact your Superset administrator": [ + "Произошла неизвестная ошибка. Пожалуйста, свяжитесь с администратором." ], - "Report Schedule not found.": ["График рассылки не найден."], - "Report Schedule delete failed.": [ - "Удаление графика рассылки не удалось." + "Anchor to": ["Привязать к"], + "Angle at which to end progress axis": [ + "Угол, под которым заканчивается ось прогресса" ], - "Report Schedule log prune failed.": [ - "Удаление журнала рассылки не удалось." + "Angle at which to start progress axis": [ + "Угол, с которого начинается ось прогресса" ], - "Report Schedule execution failed when generating a screenshot.": [ - "Ошибка при генерировании скриншота во время выполнения рассылки." + "Animation": ["Анимация"], + "Annotation": ["Аннотация"], + "Annotation Layer %s": ["Слой аннотаций %s"], + "Annotation Layers": ["Слои аннотаций"], + "Annotation Slice Configuration": ["Настройки аннотации из графика"], + "Annotation could not be created.": ["Не удалось создать аннотацию"], + "Annotation could not be updated.": ["Не удалось обновить аннотацию"], + "Annotation delete failed.": ["Не удалось удалить аннотацию"], + "Annotation layer": ["Слой аннотаций"], + "Annotation layer could not be created.": [ + "Не удалось создать слой аннотации." ], - "Report Schedule execution got an unexpected error.": [ - "Во время выполнения рассылки произошла непредвиденная ошибка." + "Annotation layer could not be deleted.": [ + "Не удалось удалить слой аннотации." ], - "Report Schedule is still working, refusing to re-compute.": [""], - "Report Schedule reached a working timeout.": [ - "Рассылка достигла тайм-аута в работе." + "Annotation layer could not be updated.": [ + "Не удалось обновить слой аннотации." ], - "Alert query returned more than one row.": [ - "Запрос для оповещения вернул больше одной строки." + "Annotation layer delete failed.": ["Не удалось удалить слой аннотаций"], + "Annotation layer description columns": [ + "Описательные столбцы слоя аннотаций." ], - "Alert validator config error.": [ - "Неверная конфигурация широты и долготы." + "Annotation layer has associated annotations.": [ + "Слои аннотаций имеет связанные аннотации" ], - "Alert query returned more than one column.": [ - "Запрос для оповещения вернул больше одного столбца." + "Annotation layer interval end": ["Конечный интервал слоя аннотации"], + "Annotation layer name": ["Имя слоя аннотаций"], + "Annotation layer not found.": ["Слой аннотации не найден"], + "Annotation layer opacity": ["Непрозрачность слоя аннотации"], + "Annotation layer parameters are invalid.": [ + "Параметры слоя аннотаций недействительны" ], - "Alert query returned a non-number value.": [ - "Запрос для оповещения вернул не число." + "Annotation layer stroke": ["Штрих слоя аннотации"], + "Annotation layer type": ["Тип слоя аннотации"], + "Annotation layer value": ["Значение слоя аннотации"], + "Annotation layers": ["Слои аннотаций"], + "Annotation layers are still loading.": ["Слои аннотаций загружаются."], + "Annotation name": ["Имя аннотации"], + "Annotation not found.": ["Аннотация не найдена."], + "Annotation parameters are invalid.": [ + "Параметры аннотации недействительны." ], - "Alert found an error while executing a query.": [ - "Обнаружена ошибка в запросе." + "Annotation source": ["Источник аннотации"], + "Annotation source type": ["Тип источника аннотации"], + "Annotation template created": ["Шаблон аннотации создан"], + "Annotation template updated": ["Шаблон аннотации обновлен"], + "Annotations and Layers": ["Аннотации и слои"], + "Annotations and layers": ["Аннотации и слои"], + "Annotations could not be deleted.": ["Не удалось удалить аннотации."], + "Any": ["Любой"], + "Any additional detail to show in the certification tooltip.": [ + "Любые дополнительные сведения для всплывающей подсказки" ], - "Alert fired during grace period.": [""], - "Alert ended grace period.": [""], - "Alert on grace period": [""], - "Report Schedule sellenium user not found": [ - "Пользователь Selenium для графика рассылки не найден" + "Any color palette selected here will override the colors applied to this dashboard's individual charts": [ + "Любая палитра, выбранная здесь, будет перезаписывать цвета, применённые к отдельным графикам этого дашборда" ], - "Report Schedule state not found": [ - "Не найдено состояние графика рассылки" + "Any databases that allow connections via SQL Alchemy URIs can be added. ": [ + "Любые базы данных, подключаемые через SQL Alchemy URI, могут быть добавлены. " ], - "Report schedule unexpected error": [ - "Неожиданная ошибка графика рассылки" + "Any databases that allow connections via SQL Alchemy URIs can be added. Learn about how to connect a database driver ": [ + "Любые базы данных, подключаемые через SQL Alchemy URI, могут быть добавлены. Узнайте больше о том, как подключить драйвер базы данных " ], - "Changing this report is forbidden": ["Изменение этого отчёта запрещено"], - "An error occurred while pruning logs ": [ - "Произошла ошибка при удалении журналов " + "Append": ["Добавить"], + "Applied Cross Filters (%d)": ["Применено кросс-фильтров: (%d)"], + "Applied Filters (%d)": ["Применено фильтров: (%d)"], + "Applied filters: %s": ["Применены фильтры: %s"], + "Applied rolling window did not return any data. Please make sure the source query satisfies the minimum periods defined in the rolling window.": [ + "Применное скользязее окно не вернуло данных. Убедитесь, что исходный запрос удовлетворяет минимальному количеству периодов скользящего окна." ], - "\n <b><a href=\"%(url)s\">Explore in Superset</a></b><p></p>\n <img src=\"cid:%(msgid)s\">\n ": [ - "\n <b><a href=“%(url)s”>Исследовать в Superset</a></b><p></p>\n <img src=“cid:%(msgid)s”>\n " + "Apply": ["Применить"], + "Apply conditional color formatting to metrics": [ + "Применить условное цветовое форматирование к мерам" ], - "%(prefix)s %(title)s": ["%(prefix)s %(title)s"], - "\n *%(name)s*\n\n <%(url)s|Explore in Superset>\n ": [ - "\n *%(name)s*\n\n <%(url)s|Исследовать в Superset>\n " + "Apply conditional color formatting to numeric columns": [ + "Применить условное цветовое форматирование к столбцам" ], - "\n *%(name)s*\n\n <%(url)s|Explore in Superset>\n ": [ - "\n *%(name)s*\n\n <%(url)s|Исследовать в Superset>\n " + "Apply filters": ["Применить фильтры"], + "Apply metrics on": ["Применить меры к"], + "Apply to all panels": ["Применить ко всем панелям"], + "Apply to specific panels": ["Применить к выбранным панелям"], + "April": ["Апрель"], + "Arc": ["Дуга"], + "Are you sure you intend to overwrite the following values?": [ + "Вы уверены, что хотите перезаписать эти значения?" ], - "<b><a href=\"%(url)s\">Explore in Superset</a></b><p></p>": [ - "<b><a href=“%(url)s”>Исследовать в Superset</a></b><p></p>" + "Are you sure you want to cancel?": ["Вы уверены, что хотите отменить?"], + "Are you sure you want to delete": ["Вы уверены, что хотите удалить"], + "Are you sure you want to delete %s?": [ + "Вы уверены, что хотите удалить %s?" ], - "%(name)s.csv": ["%(name)s.csv"], - "\n *%(slice_name)s*\n\n <%(slice_url_user_friendly)s|Explore in Superset>\n ": [ - "\n *%(slice_name)s*\n\n <%(slice_url_user_friendly)s|Исследовать в Superset>\n " + "Are you sure you want to delete the selected %s?": [ + "Вы уверены, что хотите удалить выбранные %s?" ], - "[Alert] %(label)s": ["[Оповещение] %(label)s"], - "New": ["Новый"], - "SQL Query": ["Сохранить запрос"], - "Chart": ["График"], - "Dashboard": ["Дашборд"], - "Profile": ["Профиль"], - "Info": ["Инфо"], - "Logout": ["Выход из системы"], - "Login": ["Вход в систему"], - "Record Count": ["Количество записей"], - "No records found": ["Записи не найдены"], - "Filter List": ["Фильтры"], - "Search": ["Поиск"], - "Refresh": ["Принудительное обновление"], - "Import dashboards": ["Импорт дашбордов"], - "Import Dashboard(s)": ["Импорт дашборда(ов)"], - "File": ["Файл"], - "Choose File": ["Выберите файл"], - "Upload": ["Загрузить"], - "No Access!": ["Нет доступа!"], - "You do not have permissions to access the datasource(s): %(name)s.": [ - "У вас нет разрешений на доступ к источнику(ам) данных: %(name)s." + "Are you sure you want to delete the selected annotations?": [ + "Вы уверены, что хотите удалить выбранные аннотации?" ], - "Request Permissions": ["Запросить права доступа"], - "Cancel": ["Отменить"], - "Use the edit buttom to change this field": [ - "Используйте кнопку правки для изменения этого поля" + "Are you sure you want to delete the selected charts?": [ + "Вы уверены, что хотите удалить выбранные графики?" ], - "Test Connection": ["Тестовое соединение"], - "[Superset] Access to the datasource %(name)s was granted": [ - "Доступ к базе данных предоставлен для пользователя — %(name)s" + "Are you sure you want to delete the selected dashboards?": [ + "Вы уверены, что хотите удалить выбранные дашборды?" ], - "Unable to find such a holiday: [{}]": [ - "Невозможно найти такой выходной день: [{}]" + "Are you sure you want to delete the selected datasets?": [ + "Вы уверены, что хотите удалить выбранные датасеты?" ], - "Referenced columns not available in DataFrame.": [ - "Ссылочные столбца недоступны в DataFrame." + "Are you sure you want to delete the selected layers?": [ + "Вы уверены, что хотите удалить выбранные слои?" ], - "Column referenced by aggregate is undefined: %(column)s": [ - "Столбец, на который ссылается агрегат, не определён: %(column)s" + "Are you sure you want to delete the selected queries?": [ + "Вы уверены, что хотите удалить выбранные запросы?" ], - "Operator undefined for aggregator: %(name)s": [""], - "Invalid numpy function: %(operator)s": [ - "Недействительная функция numpy: %(operator)s" + "Are you sure you want to delete the selected templates?": [ + "Вы уверены, что хотите удалить выбранные шаблоны?" ], - "Pivot operation requires at least one index": [""], - "Pivot operation must include at least one aggregate": [""], - "Undefined window for rolling operation": [""], - "Invalid rolling_type: %(type)s": [""], - "Invalid options for %(rolling_type)s: %(options)s": [""], - "Invalid cumulative operator: %(operator)s": [""], - "Invalid geohash string": ["Недействительная строка geohash"], - "Invalid longitude/latitude": ["Долгота и Широта [Конец]"], - "Invalid geodetic string": ["Недействительная строка geodetic"], - "`fbprophet` package not installed": ["`fbprophet` пакет не установлен"], - "Time grain missing": ["Период времени"], - "Unsupported time grain: %(time_grain)s": [ - "Недействительная гранулярность времени: %(time_grain)s" + "Are you sure you want to overwrite this dataset?": [ + "Вы уверены, что хотите перезаписать этот датасет?" ], - "Periods must be a positive integer value": [ - "Периоды должны быть положительными делами числами" + "Are you sure you want to proceed?": [ + "Вы уверены, что хотите продолжить?" ], - "Confidence interval must be between 0 and 1 (exclusive)": [ - "Доверительный интервал должен быть между 0 и 1 (исключая)" + "Are you sure you want to save and apply changes?": [ + "Вы уверены, что хотите сохранить и применить изменения?" ], - "DataFrame must include temporal column": [ - "DataFrame должен включать временной столбец" + "Area Chart": ["Диаграмма с областями"], + "Area Chart (legacy)": ["Диаграмма с областями (устарело)"], + "Area chart": ["Диаграмма с областями"], + "Area chart opacity": ["Непрозрачность диаграммы с областями"], + "Area charts are similar to line charts in that they represent variables with the same scale, but area charts stack the metrics on top of each other.": [ + "Диаграммы с областями похожи на линейные диаграммы в том смысле, что они отображают показатели с одинаковым масштабом, но диаграммы областей накладывают эти показатели друг на друга." ], - "DataFrame include at least one series": [ - "Пожалуйста, выберите хотя бы один показатель" + "Arrow": ["Стрела"], + "Assign a set of parameters as": ["Задайте набор параметров в формате"], + "Associated Charts": ["Связанные графики"], + "Async Execution": ["Асинхронное выполнение"], + "Asynchronous query execution": ["Асинхронное выполнение запросов"], + "August": ["Август"], + "Auto": ["Автоматически"], + "Auto Zoom": ["Авто масштабирование"], + "Autocomplete": ["Автозаполнение"], + "Autocomplete filters": ["Фильтры автозаполнения"], + "Autocomplete query predicate": ["Предикат запроса автозаполнения"], + "Automatic Color": ["Автоматический цвет"], + "Available sorting modes:": ["Доступные режимы сортировки:"], + "Average": ["Среднее"], + "Axis": ["Ось"], + "Axis Bounds": ["Границы оси"], + "Axis Format": ["Формат Оси"], + "Axis Title": ["Название оси"], + "Axis ascending": ["Ось по возрастанию"], + "Axis descending": ["Ось по убыванию"], + "BOOLEAN": ["Булевый (BOOLEAN)"], + "Back": ["Назад"], + "Back to all": ["Вернуться ко всем"], + "Backend": ["Драйвер"], + "Backward values": ["Предыдущие значения"], + "Bad formula.": ["Неверная формула."], + "Bad spatial key": ["Неподходящий пространственный ключ"], + "Bar": ["Столбчатая"], + "Bar Chart": ["Столбчатая диаграмма"], + "Bar Chart (legacy)": ["Столбчатая диаграмма (устарело)"], + "Bar Charts are used to show metrics as a series of bars.": [ + "Столбчатые диаграммы используются для отображения показателей в виде серии столбцов." + ], + "Bar Values": ["Значения столбцов"], + "Bar orientation": ["Направление столбцов"], + "Base layer map style": [""], + "Based on a metric": ["На основе меры"], + "Based on granularity, number of time periods to compare against": [ + "Основываясь на группировке времени, количество периодов времени для сравнения" + ], + "Basic": ["Базовая настройка"], + "Basic information": ["Основная информация"], + "Batch editing %d filters:": [ + "Множественное редактирование фильтров: %d" ], - "percentiles must be a list or tuple with two numeric values, of which the first is lower than the second value": [ - "процентили должны быть списками из кортежами из двух числовых значений, в которых первое значение меньше второго" + "Battery level over time": ["Уровень заряда батареи с течением времени"], + "Be careful.": ["Будьте осторожны."], + "Before": ["До"], + "Big Number": ["Карточка"], + "Big Number Font Size": ["Размер шрифта числа"], + "Big Number with Trendline": ["Карточка с трендовой линией"], + "Bottom": ["Снизу"], + "Bottom Margin": ["Нижний отступ"], + "Bottom left": ["Снизу слева"], + "Bottom margin, in pixels, allowing for more room for axis labels": [ + "Нижний отступ (в пикселях), дает больше пространства меткам оси" + ], + "Bottom right": ["Снизу справа"], + "Bottom to Top": ["Снизу вверх"], + "Bounds for the Y-axis. When left empty, the bounds are dynamically defined based on the min/max of the data. Note that this feature will only expand the axis range. It won't narrow the data's extent.": [ + "Границы для оси Y. Если оставить поле пустым, границы динамически определяются на основе минимального/максимального значения данных. Обратите внимание, что эта функция только расширит диапазон осей. Она не изменит размер графика." + ], + "Bounds for the axis. When left empty, the bounds are dynamically defined based on the min/max of the data. Note that this feature will only expand the axis range. It won't narrow the data's extent.": [ + "Границы для оси. Если оставить поле пустым, границы динамически определяются на основе минимального/максимального значения данных. Обратите внимание, что эта функция только расширит диапазон осей. Она не изменит размер графика." + ], + "Box Plot": ["Ящик с усами"], + "Bubble Chart": ["Пузырьковая диаграмма"], + "Bubble Color": ["Цвет пузыря"], + "Bubble Size": ["Размер пузыря"], + "Bubble size": ["Размер маркера"], + "Bucket break points": [""], + "Build": ["Сборка"], + "Bulk select": ["Множественный выбор"], + "Bullet Chart": ["Диаграмма-шкала"], + "Business": ["Бизнес"], + "Business Data Type": ["Тип данных бизнеса"], + "By default, each filter loads at most 1000 choices at the initial page load. Check this box if you have more than 1000 filter values and want to enable dynamically searching that loads filter values as users type (may add stress to your database).": [ + "По умолчанию, каждый фильтр загружает не больше 1000 элементов выбора при начальной загрузке страницы. Установите этот флаг, если у вас больше 1000 значений фильтра и вы хотите включить динамический поиск, который загружает значения по мере их ввода пользователем (может увеличить нагрузку на вашу базу данных)." ], - "User": ["Пользователь"], - "User Roles": ["Роли пользователей"], - "Database URL": ["URL базы данных"], - "Roles to grant": ["Роли для предоставления"], - "Created On": ["Дата создания"], - "List Observations": ["Список показателей"], - "Show Observation": [""], - "Error Message": ["Предупреждающее сообщение"], - "Log Retentions (days)": ["Время жизни журналов (в днях)"], - "A semicolon ';' delimited list of email addresses": [ - "Список адресов, разделённый точкой с запятой ‘;’" + "By key: use column names as sorting key": [ + "По ключу: использовать имена столбцов как ключ сортировки" ], - "How long to keep the logs around for this alert": [ - "Как долго хранить логи для данного оповещения" + "By key: use row names as sorting key": [ + "По ключу: использовать имена строк как ключ сортировки" ], - "Once an alert is triggered, how long, in seconds, before Superset nags you again.": [ - "После срабатывания оповещения, как долго Superset не должен надоедать снова." + "By value: use metric values as sorting key": [ + "По значению: использовать значения мер как ключ сортировки" ], - "A SQL statement that defines whether the alert should get triggered or not. The query is expected to return either NULL or a number value.": [ - "SQL-выражение, которое определяет сработало оповещение или нет. Запрос должен вернуть NULL или числовое значение." + "CANCEL": ["ОТМЕНА"], + "CREATE DATASET": ["СОЗДАТЬ ДАТАСЕТ"], + "CREATE TABLE AS": ["CREATE TABLE AS"], + "CREATE VIEW AS": ["CREATE VIEW AS"], + "CREATE VIEW statement": ["Выражение CREATE VIEW"], + "CRON Schedule": ["CRON расписание"], + "CRON expression": ["CRON выражение"], + "CSS": ["CSS"], + "CSS Styles": ["CSS стили"], + "CSS Templates": ["CSS шаблоны"], + "CSS applied to the chart": ["CSS, примененный к графику"], + "CSS template": ["CSS шаблон"], + "CSS template could not be deleted.": ["Не удалось удалить CSS шаблон."], + "CSS template name": ["Имя CSS шаблона"], + "CSS template not found.": ["CSS шаблон не найден."], + "CSS templates": ["CSS шаблоны"], + "CSV Upload": ["Загрузка CSV"], + "CSV file \"%(csv_filename)s\" uploaded to table \"%(table_name)s\" in database \"%(db_name)s\"": [ + "CSV файл \"%(csv_filename)s\" загружен в таблицу \"%(table_name)s\" в базе данных \"%(db_name)s\"" ], - "annotation start time or end time is required.": [ - "время начала или окончания аннотации обязательно." + "CSV to Database configuration": [ + "Конфигурация CSV файла для импорта в базу данных" ], - "Annotation end time must be no earlier than start time.": [ - "Конец интервала для аннотации должен быть не раньше начала." + "CSV upload": ["Загрузка CSV"], + "CTAS & CVAS SCHEMA": ["СХЕМА CTAS & CVAS"], + "CTAS (create table as select) can only be run with a query where the last statement is a SELECT. Please make sure your query has a SELECT as its last statement. Then, try running your query again.": [ + "CTAS (CREATE TABLE AS SELECT) может быть выполнен в запросе с единственным SELECT запросом. Пожалуйста, убедитесь, что запрос содержит только один SELECT запрос. Затем выполните запрос заново." ], - "Annotations": ["Аннотации"], - "Show Annotation": ["Аннотации"], - "Add Annotation": ["Добавить слой аннотации"], - "Edit Annotation": ["Аннотации"], - "Layer": ["Слой"], - "Label": ["Метка"], - "Start": ["Время начала"], - "End": ["Конец"], - "JSON Metadata": ["Параметры JSON"], - "Show Annotation Layer": ["Слои аннотаций"], - "Add Annotation Layer": ["Добавить слой аннотации"], - "Edit Annotation Layer": ["Добавить слой аннотации"], - "Name": ["Название"], - "Dataset %(name)s already exists": [ - "Источник данных %(name)s уже существует" + "CTAS Schema": ["Схема CTAS"], + "CVAS (create view as select) can only be run with a query with a single SELECT statement. Please make sure your query has only a SELECT statement. Then, try running your query again.": [ + "CVAS (CREATE VIEW AS SELECT) может быть выполнен в запросе с единственным SELECT запросом. Пожалуйста, убедитесь, что запрос содержит только один SELECT запрос. Затем выполните запрос заново." ], - "Table [%{table}s] could not be found, please double check your database connection, schema, and table name, error: {}": [ - "Не удалось найти таблицу [{}]. Проверьте подключение к базе данных, схему и имя таблицы." + "CVAS (create view as select) query has more than one statement.": [ + "CVAS (CREATE VIEW AS SELECT) запрос содержит больше одного запроса." ], - "json isn't valid": ["json не валиден"], - "Export to YAML": ["Экспорт в YAML"], - "Export to YAML?": ["Экспорт в YAML?"], - "Delete": ["Удалить"], - "Delete all Really?": ["Удалить все?"], - "Is favorite": ["В Избранном"], - "The data source seems to have been deleted": [ - "Источник данных, похоже, был удален" + "CVAS (create view as select) query is not a SELECT statement.": [ + "CVAS (CREATE VIEW AS SELECT) запрос не является SELECT запросом." ], - "The user seems to have been deleted": [ - "Пользователь, кажется, был удален" + "Cache Timeout": ["Время жизни кэша"], + "Cache Timeout (seconds)": ["Время жизни кэша (секунды)"], + "Cache timeout": ["Время жизни кэша"], + "Cached": ["Добавлено в кэш"], + "Cached %s": ["Добавлено в кэш %s"], + "Cached value not found": ["Кэшированное значение не найдено"], + "Calculate contribution per series or row": [ + "Вычислить вклад в общую сумму (долю) по категории или строке. Установливает формат показателя в проценты" ], - "Access was requested": ["Запрошен доступ"], - "The access requests seem to have been deleted": [ - "Запросы доступа, похоже, были удалены" + "Calculated column [%s] requires an expression": [ + "Для вычисляемого столбца [%s] требуется выражение" ], - "%(user)s was granted the role %(role)s that gives access to the %(datasource)s": [ - "%(user)s была предоставлена роль %(role)s, которая дает доступ к ресурсам %(datasource)s" + "Calculated columns": ["Вычисляемые столбцы"], + "Calculation type": ["Тип расчёта"], + "Calendar Heatmap": ["Календарная тепловая карта"], + "Can not move top level tab into nested tabs": [ + "Невозможно перенести вкладку верхнего уровня во вложенную вкладку" ], - "Role %(r)s was extended to provide the access to the datasource %(ds)s": [ - "Роль %(r) s была расширена для обеспечения доступа к источнику данных %(ds)s" + "Can select multiple values": ["Можно выбрать несколько значений"], + "Can't have overlap between Series and Breakdowns": [""], + "Cancel": ["Отмена"], + "Cancel query on window unload event": [ + "Отменять запрос при закрытии вкладки" ], - "You have no permission to approve this request": [ - "У вас нет разрешения на утверждение этого запроса" + "Cannot delete a database that has datasets attached": [ + "Невозможно удалить базу данных с подключенными датасетами" ], "Cannot import dashboard: %(db_error)s.\nMake sure to create the database before importing the dashboard.": [ - "Невозможно импортировать дашборд: %(db_error)s.\nУбедитесь, что перед импортом дашборда была создана база данных." - ], - "An unknown error occurred. Please contact your Superset administrator": [ - "Произошла неизвестная ошибка. Пожалуйста, свяжитесь с администратором Superset" + "Невозможно импортировать дашборд: %(db_error)s.\nУбедитесь, что база даннах создана перед импортированием дашборда." + ], + "Cannot load filter": ["Невозможно загрузить фильтр"], + "Cannot parse time string [%(human_readable)s]": [ + "Не удается разобрать временную строку [%(human_readable)s]" + ], + "Categorical": ["Категориальный"], + "Categorical Color": ["Цвет категории"], + "Categories to group by on the x-axis.": [ + "Категории для группировки по оси x" + ], + "Category": ["Категория"], + "Category Name": ["Имя категории"], + "Category and Percentage": ["Категория и процентная доля"], + "Category and Value": ["Категория и значение"], + "Category of target nodes": ["Категория целевых вершин"], + "Category, Value and Percentage": [ + "Категория, значение и процентная доля" + ], + "Cell Padding": ["Расстояние между ячейками"], + "Cell Radius": ["Радиус ячейки"], + "Cell Size": ["Размер ячейки"], + "Cell bars": ["Гистограммы в ячейках"], + "Cell content": ["Содержимое ячейки"], + "Cell limit": ["Лимит ячеек"], + "Center": ["По центру"], + "Centroid (Longitude and Latitude): ": ["Центроид (Долгота и Широта): "], + "Certification": ["Утверждение"], + "Certification details": ["Детали утверждения"], + "Certified": ["Утверждено"], + "Certified By": ["Кем утверждено"], + "Certified by": ["Кем утверждено"], + "Certified by %s": ["Утверждено: %s"], + "Change order of columns.": ["Сменить порядок столбцов."], + "Change order of rows.": ["Сменить порядок строк."], + "Changed By": ["Кем изменено"], + "Changed on": ["Дата изменения"], + "Changes saved.": ["Изменения сохранены."], + "Changing the dataset may break the chart if the chart relies on columns or metadata that does not exist in the target dataset": [ + "Изменение датасета может привести к тому, что график станет нерабочим, если график использует несуществующие в целевом датасете столбцы или метаданные" ], - "Error occurred when opening the chart: %(error)s": [ - "Произошла ошибка при открытии графика: %(error)s" + "Changing these settings will affect all charts using this dataset, including charts owned by other people.": [ + "Изменение этих настроек будет влиять на все графики, использующие этот датасет, включая графики других пользователей." ], - "You don't have the rights to ": ["У вас нет прав на "], - "alter this ": ["изменить этот "], - "chart": ["график"], - "create a ": ["создать "], - "Explore - %(table)s": ["Исследовать - %(table)s"], - "Chart [{}] has been saved": ["График [{}] был сохранён"], - "Chart [{}] has been overwritten": ["График [{}] был перезаписан"], - "dashboard": ["дашборд"], - "Chart [{}] was added to dashboard [{}]": [ - "График [{}] был добавлен к дашборду [{}]" + "Changing this Dashboard is forbidden": [ + "Запрещено изменять этот дашборд" ], - "Dashboard [{}] just got created and chart [{}] was added to it": [ - "Дашборд [{}] был создан, и на него был добавлен график [{}]" + "Changing this chart is forbidden": ["Запрещено изменять этот график"], + "Changing this control takes effect instantly": [ + "Изменение этого элемента применяется сразу" ], - "This dashboard was changed recently. Please reload dashboard to get latest version.": [ - "Этот дашборд был недавно изменён. Пожалуйста, перезагрузите дашборд, чтобы получить последнюю версию." + "Changing this dataset is forbidden": ["Запрещено изменять этот датасет"], + "Changing this dataset is forbidden.": [ + "Запрещено изменять этот датасет" ], - "Could not load database driver: %(driver_name)s": [ - "Невозможно загрузить драйвер базы данных: %(driver_name)s" + "Changing this datasource is forbidden": [ + "Запрещено изменять этот источник данных" ], - "Invalid connection string, a valid string usually follows:\n'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'": [ - "Недействительная строка подключения, правильная строка обычно следует следующему шаблону:\n‘драйвер://пользователь:пароль@хостБД/имяБД’" + "Changing this report is forbidden": ["Запрещено изменять эту рассылку"], + "Character to interpret as decimal point": [ + "Символ десятичного разделителя" ], - "Malformed request. slice_id or table_name and db_name arguments are expected": [ - "Неправильный запрос. Ожидаются аргументы slice_id или table_name и db_name" + "Character to interpret as decimal point.": [ + "Символ десятичного разделителя" ], + "Chart": ["График"], "Chart %(id)s not found": ["График %(id)s не найден"], - "Table %(table)s wasn't found in the database %(db)s": [ - "Таблица %(table)s не найдена в базе данных %(db)s" + "Chart Cache Timeout": ["Время жизни кэша графика"], + "Chart Data: %s": ["Данные графика: %s"], + "Chart ID": ["ID графика"], + "Chart Options": ["Свойства графика"], + "Chart Orientation": ["Ориентация графика"], + "Chart Owner: %s": [ + "Владелец графика: %s", + "Владельцы графика: %s", + "Владельцы графика: %s" + ], + "Chart Title": ["Название графика"], + "Chart [%s] has been overwritten": ["График [%s] перезаписан"], + "Chart [%s] has been saved": ["График [%s] сохранен"], + "Chart [%s] was added to dashboard [%s]": [ + "График [%s] добавлен в дашборд [%s]" + ], + "Chart [{}] has been overwritten": ["График [{}] перезаписан"], + "Chart [{}] has been saved": ["График [{}] сохранен"], + "Chart [{}] was added to dashboard [{}]": [ + "График [{}] добавлен в дашборд [{}]" + ], + "Chart cache timeout": ["Время жизни кэша графика"], + "Chart changes": ["Изменения графика"], + "Chart component that lets you add a custom filter UI in your dashboard. When added to dashboard, a filter box lets users specify specific values or ranges to filter charts by. The charts that each filter box is applied to can be fine tuned as well in the dashboard view.\n\n Note that this plugin is being replaced with the new Filters feature that lives in the dashboard view itself. It's easier to use and has more capabilities!": [ + "" ], - "Can't find User '%(name)s', please ask your admin to create one.": [ - "Не удалось найти пользователя ‘%(name)s’. Обратитесь к администратору, чтобы создать его." + "Chart could not be created.": ["Не удалось создать график"], + "Chart could not be deleted.": ["Не удалось удалить график"], + "Chart could not be updated.": ["Не удалось обновить график"], + "Chart does not exist": ["График не существует"], + "Chart has no query context saved. Please save the chart again.": [ + "На графике не сохранен контекст запроса. Пожалуйста, сохраните диаграмму еще раз." ], - "Can't find DruidCluster with cluster_name = '%(name)s'": [ - "Не удалось найти DruidCluster с именем cluster_name = ‘%(name)s’" + "Chart height": ["Высота графика"], + "Chart imported": ["График импортирован"], + "Chart name": ["Имя графика"], + "Chart options": ["Свойства графика"], + "Chart parameters are invalid.": ["Параметры графика недопустимы."], + "Chart properties updated": ["Свойства графика обновлены"], + "Chart title": ["Название графика"], + "Chart type": ["Тип графика"], + "Chart type requires a dataset": [ + "Для данного типа графика необходим датасет" ], - "Data could not be deserialized. You may want to re-run the query.": [""], - "%(validator)s was unable to check your query.\nPlease recheck your query.\nException: %(ex)s": [ + "Chart width": ["Ширина графика"], + "Charts": ["Графики"], + "Charts could not be deleted.": ["Не удалось удалить графики."], + "Check configuration": ["Проверить конфигурацию"], + "Check for sorting ascending": ["Выберит для сортировки по возрастанию"], + "Check if the Rose Chart should use segment area instead of segment radius for proportioning": [ "" ], - "Failed to start remote query on a worker. Tell your administrator to verify the availability of the message queue.": [ - "Не удалось начать выполнение запроса на воркере. Сообщите администратору о необходимости проверить доступность очереди сообщений." + "Check out this chart in dashboard:": [ + "Посмотреть этот график в дашборде:" ], - "Query record was not created as expected.": [ - "Запись запроса не была создана должным образом." + "Check out this chart: ": ["Посмотреть график: "], + "Check out this dashboard: ": ["Посмотреть дашборд: "], + "Check to apply filters instantly as they change instead of displaying [Apply] button": [ + "Установите флажок, чтобы применять фильтры мгновенно по мере их изменения вместо отображения кнопки [Применить]" ], - "The parameter %(parameters)s in your query is undefined.": [ - "Следующие параметры в запросе не определены: %(parameters)s." - ], - "%(user)s's profile": ["Профиль пользователя %(user)s"], - "Show CSS Template": ["Шаблоны CSS"], - "Add CSS Template": ["Шаблоны CSS"], - "Edit CSS Template": ["Шаблоны CSS"], - "Template Name": ["Имя Шаблона"], - "A human-friendly name": ["Понятное человеку имя"], - "Used internally to identify the plugin. Should be set to the package name from the pluginʼs package.json": [ - "Используется системой для идентификации плагина. Должно быть установлено в имя пакета, которое указано в файле package.json" + "Check to force date partitions to have the same height": [""], + "Check to include time column dropdown": [""], + "Check to include time grain dropdown": [""], + "Child label position": ["Положение метки дочернего элемента"], + "Choice of [Label] must be present in [Group By]": [ + "[Метка] должна присутствовать в [Группировать по]" ], - "A full URL pointing to the location of the built plugin (could be hosted on a CDN for example)": [ - "" + "Choice of [Point Radius] must be present in [Group By]": [ + "[Радиус точки] должен присутствовать в [Группировать по]" ], - "Custom Plugins": ["Пользовательское условие WHERE"], - "Custom Plugin": ["Пользовательский плагин"], - "Add a Plugin": ["Добавить плагин"], - "Edit Plugin": ["Редактировать плагин"], - "Schedule Email Reports for Dashboards": [ - "Запланировать рассылку по email для дашбордов" - ], - "Manage Email Reports for Dashboards": [ - "Управление рассылками для дашбордов" - ], - "Changed On": ["Изменено"], - "Active": ["Действия"], - "Crontab": [""], - "Recipients": ["Получатели"], - "Slack Channel": ["Канал Slack"], - "Deliver As Group": [""], - "Delivery Type": ["Тип Подписи"], - "Schedule Email Reports for Charts": [ - "Запланировать рассылку по email для графиков" - ], - "Manage Email Reports for Charts": [ - "Управление рассылкой email для графиков" - ], - "Email Format": ["Формат значения"], - "List Saved Query": ["Список сохраненных запросов"], - "Show Saved Query": ["Показать сохраненный запрос"], - "Add Saved Query": ["Добавить сохраненный запрос"], - "Edit Saved Query": ["Изменить сохраненный запрос"], - "End Time": ["Время окончания"], - "Pop Tab Link": ["Открыть"], - "Changed on": ["Изменено"], - "Could not determine datasource type": [ - "Невозможно определить тип источника данных" + "Choose File": ["Выберите файл"], + "Choose a chart or dashboard not both": [ + "Выберите график или дашборд, не обоих" + ], + "Choose a database...": ["Выберите базу данных..."], + "Choose a dataset": ["Выберите датасет"], + "Choose a metric for left axis": ["Выберите меру для левой оси"], + "Choose a metric for right axis": ["Выберите меру для правой оси"], + "Choose a number format": ["Выберите числовой формат"], + "Choose a source": ["Выберите источник"], + "Choose a source and a target": ["Выберите источник и цель"], + "Choose a target": ["Выберите цель"], + "Choose a unique name": [""], + "Choose chart type": ["Выберите тип графика"], + "Choose one of the available databases from the panel on the left.": [ + "Выберите одну из доступных баз данных из панели слева." + ], + "Choose one or more charts for left axis": [ + "Выберите один или несколько графиков для левой оси" + ], + "Choose one or more charts for right axis": [ + "Выберите один или несколько графиков для правой оси" ], - "Could not find viz object": ["Невозможно найти объект визуализации"], - "Show Chart": ["Показать график"], - "Add Chart": ["Добавить график"], - "Edit Chart": ["Редактировать график"], - "These parameters are generated dynamically when clicking the save or overwrite button in the explore view. This JSON object is exposed here for reference and for power users who may want to alter specific parameters.": [ - "Эти параметры генерируются автоматически при нажатии кнопки сохранения. Опытные пользователи могут изменить определенные объекты в формате JSON." + "Choose the annotation layer type": ["Выбрать тип слоя аннотации"], + "Choose the format for legend values": [ + "Выберите формат значений легенды" ], - "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.": [ - "Продолжительность (в секундах) таймаута кэширования для этого графика." + "Choose the position of the legend": ["Выберите позицию легенды"], + "Choose the source of your annotations": ["Выберите источник аннотаций"], + "Choose whether a country should be shaded by the metric, or assigned a color based on a categorical color palette": [ + "" ], - "Last Modified": ["Изменено"], - "Parameters": ["Параметры"], - "Visualization Type": ["Тип визуализации"], - "Show Dashboard": ["Показать дашборд"], - "Add Dashboard": ["Добавить дашборд"], - "Edit Dashboard": ["Редактировать дашборд"], - "This json object describes the positioning of the widgets in the dashboard. It is dynamically generated when adjusting the widgets size and positions by using drag & drop in the dashboard view": [ - "Этот объект JSON описывает расположение виджетов в дашборде. Он динамически генерируется при настройке размера и позиции виджетов в дашборде с помощью drag & drop" + "Chord Diagram": ["Хордовая диаграмма"], + "Chosen non-numeric column": ["Выбран нечисловой столбец"], + "Circle": ["Круг"], + "Circle -> Arrow": ["Круг -> Стрелка"], + "Circle -> Circle": ["Круг -> Круг"], + "Circle radar shape": ["Круглая форма радара"], + "Circular": ["Круглая форма"], + "Classic chart that visualizes how metrics change over time.": [ + "Классическая диаграмма для визуализации изменения показателей со временем." ], - "The CSS for individual dashboards can be altered here, or in the dashboard view where changes are immediately visible": [ - "В этом поле можно задать индивидуальный стиль для дашборда с помощью CSS" + "Classic row-by-column spreadsheet like view of a dataset. Use tables to showcase a view into the underlying data or to show aggregated metrics.": [ + "Классическое представление таблицы. Используйте таблицы для демонстрации отображения исходных или агрегированных данных." ], - "To get a readable URL for your dashboard": [ - "Получить читаемый URL-адрес для дашборда" + "Clause": ["Оператор"], + "Clear": ["Очистить"], + "Clear all": ["Сбросить фильтры"], + "Clear all data": ["Очистить все данные"], + "Clear form": ["Очистить форму"], + "Click on \"Create chart\" button in the control panel on the left to preview a visualization or": [ + "Нажмите на кнопку \"Создать график\" на панели управления слева для просмотра графика или" ], - "This JSON object is generated dynamically when clicking the save or overwrite button in the dashboard view. It is exposed here for reference and for power users who may want to alter specific parameters.": [ - "Этот JSON-объект генерируется автоматически при сохранении или перезаписи дашборда. Он размещён здесь справочно и для опытных пользователей." + "Click the button above to add a filter to the dashboard": [ + "Нажмите кнопку выше для добавления фильтров в дашборд" ], - "Owners is a list of users who can alter the dashboard.": [ - "Владельцы - это пользователи, которые могут изменять дашборд." + "Click the lock to make changes.": [ + "Нажмите на замок для внесения изменений" ], - "Determines whether or not this dashboard is visible in the list of all dashboards": [ - "Определяет видимость дашборда в списке всех дашбордов" - ], - "Title": ["Заголовок"], - "Slug": ["Читаемый URL"], - "Published": ["Опубликовано"], - "Position JSON": ["Позиция JSON"], - "CSS": ["CSS"], - "Underlying Tables": ["Базовые таблицы"], - "Export": ["Экспорт"], - "Export dashboards?": ["Экспортировать дашборд?"], - "Name of table to be created from csv data.": [ - "Имя таблицы, которая будет сформирована из данных csv." + "Click the lock to prevent further changes.": [ + "Нажмите на замок для запрета на внос изменений." ], - "CSV File": ["CSV-файл"], - "Select a CSV file to be uploaded to a database.": [ - "Выберите файл CSV, который будет загружен в БД." + "Click this link to switch to an alternate form that allows you to input the SQLAlchemy URL for this database manually.": [ + "Нажмите для переключения на альтернативную форму подключения, которая позволит вам вручную ввести SQLAlchemy URL для данной базы данных." ], - "Only the following file extensions are allowed: %(allowed_extensions)s": [ - "Разрешены файлы только в следующих расширениях: %(allowed_extensions)s" + "Click this link to switch to an alternate form that exposes only the required fields needed to connect this database.": [ + "Нажмите для переключения на альтернативную форму подключения, которая позволит вам ввести все данные в соответствующую форму для данной базы данных." ], - "Specify a schema (if database flavor supports this).": [ - "Укажите схему (если это поддерживается базой данных)." + "Click to cancel sorting": ["Нажмите для отмены сортировки"], + "Click to clear emitted filters": ["Нажмите для сброса кросс-фильтра"], + "Click to edit": ["Нажмите для редактирования"], + "Click to edit %s in a new tab": [ + "Нажмите для редактирования «%s» в новой вкладке" ], - "Delimiter": ["Разделитель"], - "Delimiter used by CSV file (for whitespace use \\s+).": [ - "Разделитель, используемый CSV-файлом (для пробелов используется \\s+)." + "Click to edit %s.": ["Нажмите для редактирования %s."], + "Click to edit chart.": ["Нажмите для редактирования графика."], + "Click to edit label": ["Нажмите для редактирования метки"], + "Click to favorite/unfavorite": ["Добавить в избранное"], + "Click to force-refresh": ["Нажмите для принудительного обновления"], + "Click to see difference": ["Нажмите для просмотра изменений"], + "Click to sort ascending": ["Нажмите для сортировки по возрастанию"], + "Click to sort descending": ["Нажмите для сортировки по убыванию"], + "Close": ["Закрыть"], + "Close all other tabs": ["Закрыть остальные вкладки"], + "Close tab": ["Закрыть вкладку"], + "Cluster label aggregator": ["Агрегатор меток кластера"], + "Clustering Radius": ["Радиус кластера"], + "Code": ["Редактор"], + "Collapse all": ["Свернуть всё"], + "Collapse data panel": ["Свернуть панель управления"], + "Collapse row": ["Свернуть строку"], + "Collapse tab content": ["Свернуть содержимое вкладки"], + "Collapse table preview": ["Свернуть предпросмотр таблицы"], + "Color": ["Цвет"], + "Color +/-": ["Раскрасить +/-"], + "Color Metric": ["Цвет меры"], + "Color Scheme": ["Цветовая схема"], + "Color Steps": ["Количество цветов"], + "Color bounds": ["Границы цвета"], + "Color by": ["Выбор цвета по"], + "Color metric": ["Мера для цвета"], + "Color of the target location": ["Цвет целевого местоположения"], + "Color scheme": ["Цветовая схема"], + "Color will be shaded based the normalized (0% to 100%) value of a given cell against the other cells in the selected range: ": [ + "" ], - "Table Exists": ["Метод добавления"], - "If table exists do one of the following: Fail (do nothing), Replace (drop and recreate table) or Append (insert data).": [ - "Если таблица уже существует, выполните одно из следующих действий: Fail (ничего не делать), Replace (удалить и заново создать таблицу) или Append (добавить данные)." + "Colors": ["Цвета"], + "Column": ["Столбец"], + "Column \"%(column)s\" is not numeric or does not exists in the query results.": [ + "Столбец \"%(column)s\" не является числовым или отсутствует в результатах запроса." ], - "Fail": ["Ошибка"], - "Replace": ["Заменить"], - "Append": ["Добавить"], - "Header Row": ["Строка заголовков"], - "Row containing the headers to use as column names (0 is first line of data). Leave empty if there is no header row.": [ - "Строка, содержащая заголовки для использования в качестве имен столбцов (0 - первая строка данных). Оставьте пустым, если строка заголовка отсутствует." + "Column Configuration": ["Свойства столбца"], + "Column Formatting": ["Форматирование столбца(ов)"], + "Column Label(s)": ["Метка(и) столбца(ов)"], + "Column containing ISO 3166-2 codes of region/province/department in your table.": [ + "Столбец, содержащий коды ISO 3166-2 региона/республики/области в вашей таблице" ], - "Index Column": ["Столбец индекса"], - "Column to use as the row labels of the dataframe. Leave empty if no index column.": [ - "Столбец для использования в качестве меток строк данных. Оставьте пустым, если столбец индекса отсутствует." + "Column containing latitude data": [ + "Столбец, содержащий данные о широте" ], - "Mangle Duplicate Columns": ["Дубликаты"], - "Specify duplicate columns as \"X.0, X.1\".": [ - "Если есть столбцы с одинаковым именем, то присвоить им порядковые номера - столбец1, столбец2, … и т.д." + "Column containing longitude data": [ + "Столбец, содержащий данные о долготе" ], - "Skip Initial Space": ["Убрать пробелы"], - "Skip spaces after delimiter.": ["Пропустить пробелы после разделителя."], - "Skip Rows": ["Игнорировать"], - "Number of rows to skip at start of file.": [ - "Количество первых строк, которые нужно проигнорировать." + "Column header tooltip": ["Всплывающая подсказка заголовка столбца"], + "Column is required": ["Столбец обязателен"], + "Column label for index column(s). If None is given and Dataframe Index is True, Index Names are used.": [ + "Метка для индексного(ых) столбца(ов). Если не задано и задан индекс датафрейма, будут использованы имена индексов." ], - "Rows to Read": ["Строки для чтения"], - "Number of rows of file to read.": ["Количество строк файла для чтения."], - "Skip Blank Lines": ["Пропустить пустые строки"], - "Skip blank lines rather than interpreting them as NaN values.": [ - "Пропустите пустые строки, а не интерпретировать их как значения NaN." + "Column label for index column(s). If None is given and Dataframe Index is checked, Index Names are used": [ + "Метка для индексного(ых) столбца(ов). Если не задано и задан индекс датафрейма, будут использованы имена индексов." ], - "Parse Dates": ["Разбор Дат"], - "A comma separated list of columns that should be parsed as dates.": [ - "Разделённый запятыми список столбцов, которые должен быть интерпретированы как даты." + "Column name": ["Имя столбца"], + "Column name [%s] is duplicated": [ + "Имя столбца [%s] является дубликатом" ], - "Infer Datetime Format": ["Формат даты и времени"], - "Use Pandas to interpret the datetime format automatically.": [ - "Используйте Pandas для автоматической интерпретации формата даты и времени." + "Column referenced by aggregate is undefined: %(column)s": [ + "Столбец, на который ссылается агрегат, не определен: %(column)s" ], - "Decimal Character": ["Десятичный символ"], - "Character to interpret as decimal point.": [ - "Символ, который интерпретируется как десятичная точка." + "Column select": ["Выбор столбца"], + "Column to use as the row labels of the dataframe. Leave empty if no index column": [ + "Столбец для использования в качестве метки для строки датафрейма. Оставьте пустым, если индексный столбец отсутствует." ], - "Dataframe Index": ["Индекс"], - "Write dataframe index as a column.": [ - "Записывайте индекс данных в виде столбца." + "Column to use as the row labels of the dataframe. Leave empty if no index column.": [ + "Столбец для использования в качестве метки для строки датафрейма. Оставьте пустым, если индексный столбец отсутствует." ], - "Column Label(s)": ["Обозначения столбцов"], - "Column label for index column(s). If None is given and Dataframe Index is True, Index Names are used.": [ - "Обозначение столбца для столбцов с индексами. Если поле пустое, а настройка [Индекс] включена, то используются имена индексов." + "Columnar File": ["Файл столбчатого формата"], + "Columnar file \"%(columnar_filename)s\" uploaded to table \"%(table_name)s\" in database \"%(db_name)s\"": [ + "Файл столбчатого формата \"%(columnar_filename)s\" загружен в таблицу \"%(table_name)s\" в базу данных \"%(db_name)s\"" ], - "Null values": ["Значение фильтра"], - "Json list of the values that should be treated as null. Examples: [\"\"], [\"None\", \"N/A\"], [\"nan\", \"null\"]. Warning: Hive database supports only single value. Use [\"\"] for empty string.": [ - "" + "Columnar to Database configuration": [ + "Конфигурация столбчатого файла для импорта в базу данных" ], - "Name of table to be created from excel data.": [ - "Имя таблицы, которая будет сформирована из данных csv." + "Columns": ["Столбцы"], + "Columns To Be Parsed as Dates": [ + "Список столбцов, которые должны быть интерпретированы как даты." ], - "Excel File": ["Файл Excel"], - "Select a Excel file to be uploaded to a database.": [ - "Выберите файл CSV, который будет загружен в БД." + "Columns To Read": ["Столбцы для чтения"], + "Columns missing in dataset: %(invalid_columns)s": [ + "Столбцы отсутствуют в датасете: %(invalid_columns)s" ], - "Sheet Name": ["Полное имя"], - "Strings used for sheet names (default is the first sheet).": [ - "Строки, используемые для имён листов (по-умолчанию это первый лист)." + "Columns missing in datasource: %(invalid_columns)s": [ + "Столбцы отсутствуют в источнике данных: %(invalid_columns)s" ], - "Show Database": ["Показать Базу Данных"], - "Add Database": ["Добавить Базу Данных"], - "Edit Database": ["Редактировать Базу Данных"], - "Expose this DB in SQL Lab": ["Показать базу данных в SQL Редакторе"], - "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.": [ - "" + "Columns subtotal position": ["Расположение столбцов подытогов"], + "Columns to calculate distribution across.": [""], + "Columns to display": ["Столбцы для отображения"], + "Columns to group by": ["Столбцы для группировки"], + "Columns to group by on the columns": [ + "Столбцы для группировки по столбцам" ], - "Allow CREATE TABLE AS option in SQL Lab": [ - "Разрешить выполнять инструкцию CREATE TABLE AS в редакторе SQL" + "Columns to group by on the rows": ["Столбцы для группировки по строкам"], + "Columns to show": ["Столбцы для отображения"], + "Combine Metrics": ["Объединить меры"], + "Combine metrics": ["Объединить меры"], + "Comma-separated color picks for the intervals, e.g. 1,2,4. Integers denote colors from the chosen color scheme and are 1-indexed. Length must be matching that of interval bounds.": [ + "Номера цветов, разделенные запятой, например, 1,2,4. Целые числа задают цвета из выбранной цветовой схемы и начинаются с 1 (не с нуля). Длина должна соответствовать границам интервала." ], - "Allow CREATE VIEW AS option in SQL Lab": [ - "Разрешить выполнять инструкцию CREATE TABLE AS в редакторе SQL" + "Comma-separated interval bounds, e.g. 2,4,5 for intervals 0-2, 2-4 and 4-5. Last number should match the value provided for MAX.": [ + "Границы интервала, разделенные запятой, например, 2,4,5 для интервалов 0-2, 2-4 и 4-5. Последнее число должно быть равно заданному максиму." ], - "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in SQL Lab": [ - "Позволяет пользователям запускать инструкции (UPDATE, DELETE, CREATE, …) без SELECT в редакторе SQL" + "Comparator option": [""], + "Compare multiple time series charts (as sparklines) and related metrics quickly.": [ + "Быстрое сравнение нескольких графиков временных рядов (в виде спарклайнов) и связанных с ними показателей." ], - "When allowing CREATE TABLE AS option in SQL Lab, this option forces the table to be created in this schema": [ - "При разрешении опции CREATE TABLE AS в редакторе SQL эта опция создаст таблицу в выбранной схеме" + "Compare the same summarized metric across multiple groups.": [ + "Сравнивает один и тот же обобщенный показатель в нескольких группах" ], - "If Presto, Trino or Drill all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them.<br/>If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.": [ - "Если вы используете Presto, все запросы в SQL-Редакторе будут выполняться от авторизованного пользователя, который должен иметь разрешение на их выполнение. <br/> Если включен Hive, то запросы будут выполняться через техническую учетную запись, но ассоциировать зарегистрированного пользователя можно через свойство hive.server2.proxy.user." + "Compares how a metric changes over time between different groups. Each group is mapped to a row and change over time is visualized bar lengths and color.": [ + "" ], - "Allow SQL Lab to fetch a list of all tables and all views across all database schemas. For large data warehouse with thousands of tables, this can be expensive and put strain on the system.": [ + "Compares metrics from different categories using bars. Bar lengths are used to indicate the magnitude of each value and color is used to differentiate groups.": [ "" ], - "Duration (in seconds) of the caching timeout for charts of this database. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.": [ + "Compares the lengths of time different activities take in a shared timeline view.": [ "" ], - "If selected, please set the schemas allowed for csv upload in Extra.": [ - "Если включено, выберите схему, в которую разрешено загружать CSV на вкладке “Дополнительно”." + "Comparison": ["Сравнение"], + "Comparison Period Lag": ["Временной лаг для сравнения"], + "Comparison suffix": ["Текст рядом с процентным изменением"], + "Compose multiple layers together to form complex visuals.": [ + "Объединяет несколько слоев вместе для формирования сложных визуальных эффектов." ], - "Expose in SQL Lab": ["Открыть в SQL редакторе"], - "Allow CREATE TABLE AS": ["Разрешить CREATE TABLE AS"], - "Allow CREATE VIEW AS": ["Разрешить CREATE TABLE AS"], - "Allow DML": ["Allow DML"], - "CTAS Schema": ["Схема по умолчанию"], - "SQLAlchemy URI": ["SQLAlchemy URI"], - "Chart Cache Timeout": ["Тайм-аут Кэша"], - "Secure Extra": ["Безопасность"], - "Root certificate": ["Корневой сертификат"], - "Async Execution": ["Асинхронное выполнение"], - "Impersonate the logged on user": ["Ассоциировать пользователя"], - "Allow Csv Upload": ["Разрешить загрузку CSV"], - "Allow Multi Schema Metadata Fetch": [""], - "Backend": [""], - "Extra field cannot be decoded by JSON. %(msg)s": [""], - "Invalid connection string, a valid string usually follows:'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'<p>Example:'postgresql://user:password@your-postgres-db/database'</p>": [ - "Недействительная строка подключения, правильная строка обычно следует следующему шаблону: драйвер://пользователь:пароль@хостБД/имяБД<p>Пример:’postgresql://user:password@your-postgres-db/database'</p>" + "Compute the contribution to the total": [ + "Вычислить вклад в общую сумму (долю)" ], - "CSV to Database configuration": ["Настройка CSV для БД"], - "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for csv uploads. Please contact your Superset Admin.": [ - "Схема “%(schema_name)s” в базе данных “%(database_name)s” не разрешена для загрузки CSV. Пожалуйста, свяжитесь с администратором Superset." + "Condition": ["Условие"], + "Conditional formatting": ["Условное форматирование"], + "Confidence interval": ["Доверительный интервал"], + "Confidence interval must be between 0 and 1 (exclusive)": [ + "Доверительный интервал должен быть между 0 и 1 (не включая концы)" ], - "You cannot specify a namespace both in the name of the table: \"%(csv_table.table)s\" and in the schema field: \"%(csv_table.schema)s\". Please remove one": [ - "Нельзя указывать область имён одновременно и в имени таблицы: “%(csv_table.table)s” и в поле схемы: “%(csv_table.schema)s”. Пожалуйста, удалите в одном из мест" + "Configuration": ["Конфигурация"], + "Configure Advanced Time Range ": [ + "Установить особый временной интервал " ], - "Unable to upload CSV file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ - "Невозможно загрузить CSV-файл \"%(filename)s\" таблицу \"%(table_name)s\" базы данных \"%(db_name)s”. Сообщение об ошибке: %(error_msg)s" + "Configure Time Range: Last...": [ + "Установить временной интервал: последний..." ], - "CSV file \"%(csv_filename)s\" uploaded to table \"%(table_name)s\" in database \"%(db_name)s\"": [ - "CSV-файл \"%(csv_filename)s\" загружен в таблицу \"%(table_name)s\" базы данных \"%(db_name)s\"" + "Configure Time Range: Previous...": [ + "Установить временной интервал: предыдущий..." ], - "Excel to Database configuration": ["Настройка CSV для БД"], - "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for excel uploads. Please contact your Superset Admin.": [ - "Схема “%(schema_name)s” в базе данных “%(database_name)s” не разрешена для загрузок Excel-файлов. Пожалуйста, свяжитесь с администратором Superset." + "Configure custom time range": [ + "Установить пользовательский временной интервал" ], - "You cannot specify a namespace both in the name of the table: \"%(excel_table.table)s\" and in the schema field: \"%(excel_table.schema)s\". Please remove one": [ - "" + "Configure filter scopes": ["Настроить область действия фильтра"], + "Configure the basics of your Annotation Layer.": [ + "Настройте слой аннотации." ], - "Unable to upload Excel file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ - "Невозможно загрузить Excel-файл \"%(filename)s\" в таблицу \"%(table_name)s\" базы данных \"%(db_name)s”. Сообщение об ошибке: %(error_msg)s" + "Configure this dashboard to embed it into an external web application.": [ + "Настройте этот дашборд для встраивания во внешнее веб-приложение" ], - "Excel file \"%(excel_filename)s\" uploaded to table \"%(table_name)s\" in database \"%(db_name)s\"": [ - "Excel-файл “%(excel_filename)s\" загружен в таблицу \"%(table_name)s\" базы данных \"%(db_name)s\"" - ], - "Logs": ["Журналы"], - "Show Log": ["Показать итоги"], - "Add Log": ["Добавить журнал"], - "Edit Log": ["Редактировать"], - "Action": ["Действия"], - "dttm": ["dttm"], - "Add item": ["Добавить фильтр"], - "The query couldn't be loaded": ["Запрос невозможно загрузить"], - "Your query has been scheduled. To see details of your query, navigate to Saved queries": [ - "Запрос был запланирован. Чтобы посмотреть детали запроса, перейдите в Сохранённые запросы" + "Configure your how you overlay is displayed here.": [ + "Настройка отображения слоя аннотации поверх графика." ], - "Your query could not be scheduled": [ - "Ваш запрос не может быть сохранен" + "Confirm overwrite": ["Подтвердить перезапись"], + "Confirm save": ["Подтвердить сохранение"], + "Connect": ["Подключить"], + "Connect Google Sheet": ["Подключить Google Таблицы"], + "Connect Google Sheets as tables to this database": [ + "Подключить Google Таблицы как таблицы для этой базы данных" ], - "Failed at retrieving results": ["Невозможно выполнить запрос"], - "An error occurred while storing the latest query id in the backend. Please contact your administrator if this problem persists.": [ - "" + "Connect a database": ["Подключиться к базе данных"], + "Connect database": ["Подключиться к базе данных"], + "Connect this database using the dynamic form instead": [ + "Подключиться к этой базе, используя динамичную форму" ], - "Unknown error": ["Неизвестная ошибка"], - "Query was stopped.": ["Запрос прерван."], - "Unable to migrate table schema state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ - "" + "Connect this database with a SQLAlchemy URI string instead": [ + "Подключиться к этой базе через SQLAlchemy URI" ], - "Unable to migrate query state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ - "" + "Connection": ["База данных"], + "Connection failed, please check your connection settings": [ + "Сбой подключения, пожалуйста, проверьте настройки вашего подключения" ], - "Unable to migrate query editor state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ - "" + "Connection looks good!": ["Соединение в порядке!"], + "Continue": ["Продолжить"], + "Continuous": ["Непрерывный"], + "Contribution": ["Режим относительных значений"], + "Contribution Mode": ["Режим относительных значений"], + "Control": ["Элемент"], + "Control labeled ": ["Значение с именем "], + "Controls labeled ": ["Значения с именами "], + "Coordinates": ["Координаты"], + "Copied to clipboard!": ["Скопировано в буфер обмена"], + "Copy": ["Копировать"], + "Copy SELECT statement to the clipboard": [ + "Скопировать выражение SELECT в буфер обмена" ], - "Unable to add a new tab to the backend. Please contact your administrator.": [ - "" + "Copy and Paste JSON credentials": ["Скопировать и вставить JSON данные"], + "Copy and paste the entire service account .json file here": [ + "Скопировать и вставить .json файл сервисного аккаунта сюда" ], - "Copy of %s": ["Копирование %s"], - "An error occurred while setting the active tab. Please contact your administrator.": [ - "Произошла ошибка при установке активной вкладки. Пожалуйста, свяжитесь с администратором." + "Copy link": ["Скопировать ссылку"], + "Copy message": ["Скопировать сообщение"], + "Copy of %s": ["Копия %s"], + "Copy partition query to clipboard": [ + "Скопировать часть запроса в буфер обмена" ], - "An error occurred while fetching tab state": [ - "Произошла ошибка при получении метаданных из таблицы" + "Copy permalink to clipboard": ["Скопировать ссылку в буфер обмена"], + "Copy query URL": ["Скопировать ссылку на запрос"], + "Copy query link to your clipboard": [ + "Скопировать ссылку на запрос в буфер обмена" ], - "An error occurred while removing tab. Please contact your administrator.": [ - "Произошла ошибка при удалении вкладки. Пожалуйста, свяжитесь с администратором." + "Copy the account name of that database you are trying to connect to.": [ + "Впишите имя профиля базы данных, к которой вы пытаетесь подключиться." ], - "An error occurred while removing query. Please contact your administrator.": [ - "Произошла ошибка при удалении запроса. Пожалуйста, свяжитесь с администратором." + "Copy the name of the database you are trying to connect to.": [ + "Впишите имя базы данных, к которой вы пытаетесь подключиться" ], - "An error occurred while setting the tab database ID. Please contact your administrator.": [ - "Произошла ошибка при установке ID базы данных для вкладки. Пожалуйста, свяжитесь с администратором." + "Copy to Clipboard": ["Скопировать в буфер обмена"], + "Copy to clipboard": ["Скопировать в буфер обмена"], + "Correlation": ["Корреляция"], + "Cost estimate": ["Прогноз затрат"], + "Could not determine datasource type": [ + "Не удалось определить тип источника данных" ], - "An error occurred while setting the tab schema. Please contact your administrator.": [ - "Произошла ошибка при настройке схемы вкладок. Пожалуйста, свяжитесь с администратором." + "Could not fetch all saved charts": [ + "Не удалось получить все сохраненные графики" ], - "An error occurred while setting the tab autorun. Please contact your administrator.": [ - "Произошла ошибка при настройке автозапуска вкладки. Пожалуйста, свяжитесь с администратором." + "Could not find viz object": ["Не удалось найти объект визуализации"], + "Could not load database driver": [ + "Не удалось загрузить драйвер базы данных" ], - "An error occurred while setting the tab title. Please contact your administrator.": [ - "Произошла ошибка при настройке заголовка вкладки. Пожалуйста, свяжитесь с администратором." + "Could not load database driver: %(driver_name)s": [ + "Не удалось загрузить драйвер базы данных: %(driver_name)s" ], - "Your query was saved": ["Ваш запрос был сохранен"], - "Your query could not be saved": ["Ваш запрос не может быть сохранен"], - "Your query was updated": ["Ваш запрос был сохранен"], - "Your query could not be updated": ["Ваш запрос не может быть сохранен"], - "An error occurred while storing your query in the backend. To avoid losing your changes, please save your query using the \"Save Query\" button.": [ - "Произошла ошибка при сохранении запроса в бэкенд. Чтобы сохранить изменения, пожалуйста, сохраните ваш запрос через кнопку “Сохранить запрос”." + "Could not load database driver: {}": [ + "Не удалось загрузить драйвер базы данных: {}" + ], + "Count": ["Количество"], + "Count Unique Values": ["Количество уникальных значений"], + "Count as Fraction of Columns": ["Количество, как доля от столбцов"], + "Count as Fraction of Rows": ["Количество, как доля от строк"], + "Count as Fraction of Total": ["Количество, как доля от целого"], + "Country": ["Страна"], + "Country Color Scheme": ["Цветовая схема страны"], + "Country Column": ["Столбец со страной"], + "Country Field Type": ["Тип поля страны"], + "Country Map": ["Карта Стран"], + "Create": ["Создать"], + "Create Chart": ["Создать график"], + "Create Dataset": ["Создать датасет"], + "Create a dataset": ["Создать датасет"], + "Create a dataset to begin visualizing your data as a chart or go to\n SQL Lab to query your data.": [ + "Создайте датасет для визуализации ваших данных на графике или перейдите в Лабораторию SQL для просмотра данных." + ], + "Create a new chart": ["Создать новый график"], + "Create chart": ["Создать график"], + "Create dataset": ["Создать датасет"], + "Create new chart": ["Создать новый график"], + "Create new filter set": ["Создать новый набор фильтров"], + "Create or select schema...": ["Создать или выбрать схему..."], + "Created": ["Создано"], + "Created On": ["Дата создания"], + "Created by": ["Кем создано"], + "Created by me": ["Создано мной"], + "Created content": ["Созданный контент"], + "Created on": ["Дата создания"], + "Creating SSH Tunnel failed for an unknown reason": [ + "Не удалось создать SSH туннель по неизвестной причине" ], - "An error occurred while setting the tab template parameters. Please contact your administrator.": [ - "Произошла ошибка при установке параметров шаблона вкладки. Пожалуйста, свяжитесь с администратором." + "Creating a data source and creating a new tab": [ + "Создание источника данных и добавление новой вкладки..." ], - "An error occurred while fetching table metadata": [ - "Произошла ошибка при получении метаданных из таблицы" + "Creator": ["Автор"], + "Crimson": ["Малиновый"], + "Cross Filter Scoping": ["Область действия кросс-фильтра"], + "Cross-filter scoping": ["Задать область действия кросс-фильтра"], + "Cumulative": ["С накоплением"], + "Currently rendered: %s": ["Сейчас отрисовано: %s"], + "Custom": ["Пользовательский"], + "Custom Plugin": ["Пользовательский плагин"], + "Custom Plugins": ["Пользовательские плагины"], + "Custom SQL": ["Через SQL"], + "Custom SQL ad-hoc metrics are not enabled for this dataset": [ + "Пользовательские ad-hoc меры SQL не разрешены для этого датасета" ], - "An error occurred while fetching table metadata. Please contact your administrator.": [ - "Произошла ошибка при получении метаданных таблицы. Пожалуйста, свяжитесь с администратором." + "Custom SQL fields cannot contain sub-queries.": [ + "Пользовательские поля SQL не могут содержать подзапросы." ], - "An error occurred while expanding the table schema. Please contact your administrator.": [ - "Произошла ошибка при разворачивании схемы. Пожалуйста, свяжитесь с администратором." + "Custom time filter plugin": ["Пользовательский плагин фильтра времени"], + "Customize": ["Кастомизация"], + "Customize Metrics": ["Настроить меры"], + "Customize columns": ["Настроить столбцы"], + "Cyclic dependency detected": ["Обнаружена циклическая зависимость"], + "D3 Format": ["Формат даты/времени"], + "D3 format": ["Формат даты/времени"], + "D3 format syntax: https://github.com/d3/d3-format": [ + "Формат D3: https://github.com/d3/d3-format." ], - "An error occurred while collapsing the table schema. Please contact your administrator.": [ - "Произошла ошибка при сворачивании схемы. Пожалуйста, свяжитесь с администратором." + "D3 number format for numbers between -1.0 and 1.0, useful when you want to have different siginificant digits for small and large numbers": [ + "Числовой формат D3 для чисел от -1 до 1, полезно, если вы работаете как с маленькими числами, где нужна точность, так и с большими целыми числами" ], - "An error occurred while removing the table schema. Please contact your administrator.": [ - "Произошла ошибка при удалении схемы. Пожалуйста, свяжитесь с администратором." + "D3 time format for datetime columns": [ + "Формат времени D3 для столбцов типа дата/время" ], - "Shared query": ["Общий запрос"], - "The datasource couldn't be loaded": ["Запрос невозможно загрузить"], - "An error occurred while creating the data source": [ - "Произошла ошибка при создании источника данных" + "D3 time format syntax: https://github.com/d3/d3-time-format": [ + "Формат времени D3: https://github.com/d3/d3-time-format." ], - "SQL Lab uses your browser's local storage to store queries and results.\n Currently, you are using ${currentUsage.toFixed(\n 2,\n )} KB out of ${LOCALSTORAGE_MAX_USAGE_KB} KB. storage space.\n To keep SQL Lab from crashing, please delete some query tabs.\n You can re-access these queries by using the Save feature before you delete the tab. Note that you will need to close other SQL Lab windows before you do this.": [ - "Лаборатория SQL использует хранилище локального кеша вашего браузера, чтобы сохранить запросы и результаты из вкладок.\n Сейчас вы используете ${currentUsage.toFixed(\n 2,\n )} KB из ${LOCALSTORAGE_MAX_USAGE_KB} KB пространства.\n Чтобы уберечь Лабораторию SQL от ошибок, пожалуйста, удалите неиспользуемые вкладки с запросами.\n Вы можете получить доступ к этим запросам позже, если сохраните их перед удалением вкладки. Обратите внимание, что перед удалением вкладок нужно будет закрыть другие окна с Лабораторией SQL." + "DATETIME": ["Дата/Время (DATETIME/TIMESTAMP)"], + "DB column %(col_name)s has unknown type: %(value_type)s": [""], + "DEC": ["ДЕК"], + "DELETE": ["УДАЛИТЬ"], + "DML": ["DML"], + "Daily seasonality": ["Дневная сезонность"], + "Dark": ["Темный"], + "Dark Cyan": ["Темно-голубой"], + "Dark mode": ["Темная тема"], + "Dashboard": ["Дашборд"], + "Dashboard [%s] just got created and chart [%s] was added to it": [ + "Дашборд [%s] был только что создан и график [%s] был добавлен в него" ], - "Estimate selected query cost": ["Выполнить выбранный запрос"], - "Estimate cost": ["Выполнить выбранный запрос"], - "Cost estimate": ["Прогноз затрат"], - "Creating a data source and creating a new tab": [ - "Создание источника данных и добавление новой вкладки" + "Dashboard [{}] just got created and chart [{}] was added to it": [ + "Дашборд [{}] был только что создан и график [{}] был добавлен в него" ], - "An error occurred": ["Произошла ошибка"], - "Explore the result set in the data exploration view": [ - "Исследовать набор данных" + "Dashboard could not be created.": ["Не удалось создать дашборд"], + "Dashboard could not be deleted.": ["Не удалось удалить дашборд"], + "Dashboard could not be updated.": ["Не удалось обновить дашборд"], + "Dashboard does not exist": ["Дашборд не существует"], + "Dashboard imported": ["Дашборд импортирован"], + "Dashboard parameters are invalid.": ["Неверные параметры дашборда"], + "Dashboard properties": ["Свойства дашборда"], + "Dashboard properties updated": ["Свойства дашборда обновлены"], + "Dashboard scheme": ["Схема дашборда"], + "Dashboard time range filters apply to temporal columns defined in\n the filter section of each chart. Add temporal columns to the chart\n filters to have this dashboard filter impact those charts.": [ + "" ], - "Explore": ["Обзор графика"], - "This query took %s seconds to run, ": [ - "Выполнение этого запроса заняло %s секунд, " + "Dashboard title": ["Название дашборда"], + "Dashboards": ["Дашборды"], + "Dashboards added to": ["Добавлено в дашборды"], + "Dashboards could not be deleted.": ["Не удалось удалить дашборды."], + "Dashboards do not exist": ["Дашборды не существуют"], + "Dashed": ["Штрих"], + "Data": ["Данные"], + "Data Table": ["Таблица"], + "Data Zoom": ["Масштабирование графика"], + "Data could not be deserialized from the results backend. The storage format might have changed, rendering the old data stake. You need to re-run the original query.": [ + "Не удалось распознать данные с сервера . Формат хранилища мог измениться, что привело к потере старых данных. Вам нужно повторно запустить исходный запрос." + ], + "Data could not be retrieved from the results backend. You need to re-run the original query.": [ + "Не найдены сохраненные результаты на сервере, необходимо повторно выполнить запрос." + ], + "Data has no time steps": [""], + "Data preview": ["Предпросмотр данных"], + "Data refreshed": ["Данные обновлены"], + "Data type": ["Тип данных"], + "DataFrame include at least one series": [""], + "DataFrame must include temporal column": [ + "Датафрейм должен включать временной столбец" ], - "and the explore view times out at %s seconds ": [ - "а тайм-аут интерфейса исследования %s секунд " + "Database": ["База данных"], + "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for columnar uploads. Please contact your Superset Admin.": [ + "Схема \"%(schema_name)s\" базы данных \"%(database_name)s\" не предназначена для загрузки файлов столбчатого формата. Пожалуйста, свяжитесь с администратором." ], - "following this flow will most likely lead to your query timing out. ": [ - "" + "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for csv uploads. Please contact your Superset Admin.": [ + "Схема \"%(schema_name)s\" базы данных \"%(database_name)s\" не предназначена для загрузки CSV файлов. Пожалуйста, свяжитесь с администратором." ], - "We recommend your summarize your data further before following that flow. ": [ - "" + "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for excel uploads. Please contact your Superset Admin.": [ + "Схема \"%(schema_name)s\" базы данных \"%(database_name)s\" не предназначена для загрузки Excel файлов. Пожалуйста, свяжитесь с администратором." ], - "If activated you can use the ": [""], - "feature to store a summarized data set that you can then explore.": [""], - "Column name(s) ": ["Имена столбца(ов) "], - "cannot be used as a column name. The column name/alias \"__timestamp\"\n is reserved for the main temporal expression, and column aliases ending with\n double underscores followed by a numeric value (e.g. \"my_col__1\") are reserved\n for deduplicating duplicate column names. Please use aliases to rename the\n invalid column names.": [ - "" + "Database Connections": ["Базы данных"], + "Database Creation Error": ["Ошибка создания базы данных"], + "Database URL": ["URL базы данных"], + "Database connected": ["Соединение с базой данных установлено"], + "Database could not be created.": ["Не удалось создать базу данных."], + "Database could not be deleted.": ["Не удалось удалить базу данных."], + "Database could not be updated.": ["Не удалось обновить базу данных."], + "Database does not allow data manipulation.": [ + "База данных не позволяет изменять свои данные." ], - "Raw SQL": ["Raw SQL"], - "Source SQL": ["Источник SQL"], - "SQL": ["SQL"], - "No query history yet...": ["История запросов пуста…"], - "It seems you don't have access to any database": [ - "Кажется у Вас нет доступа к базе данных" + "Database does not exist": ["База данных не существует"], + "Database does not support subqueries": [ + "База данных не поддерживает подзапросы" ], - "An error occurred when refreshing queries": [ - "Произошла ошибка при создании источника данных" + "Database driver for importing maybe not installed. Visit the Superset documentation page for installation instructions: ": [ + "Драйвер базы данных для импорта может быть не установлен. Изучите документацию Суперсета для инструкций по установке: " ], - "Filter by user": ["Значение фильтра"], - "Filter by database": ["Выберите базу данных"], - "Query search string": ["Поиск запросов"], - "[From]-": ["[С]-"], - "[To]-": ["[До]-"], - "Filter by status": ["Значение фильтра"], - "Edit": ["Редактировать"], - "View results": ["Посмотреть результаты"], - "Data preview": ["Предпросмотр данных"], - "Overwrite text in the editor with a query on this table": [ - "Перезаписать текст в редакторе с запросом к этой таблице" + "Database error": ["Ошибка базы данных"], + "Database is offline.": ["База данных сейчас оффлайн."], + "Database is required for alerts": [ + "Для оповещений требуется база данных" ], - "Run query in a new tab": ["Выполнить запрос на новой вкладке"], - "Remove query from log": ["Удалить запрос из журнала"], - "An error occurred saving dataset": [ - "Произошла ошибка при создании источника данных" + "Database name": ["Имя базы данных"], + "Database not allowed to change": [ + "База данных недоступна для изменений" ], - ".CSV": ["Экспорт в CSV"], - "Clipboard": ["Скопировать в буфер обмена"], - "Filter results": ["Результаты поиска"], - "Database error": ["Database Expression"], - "was created": ["создан"], - "Query in a new tab": ["Запрос в отдельной вкладке"], - "The query returned no data": ["Результат пуст"], - "Fetch data preview": ["Получить данные для просмотра"], - "Refetch results": ["Результаты поиска"], - "Track job": ["Отслеживать работу"], - "Stop": ["Стоп"], - "Run selection": ["Выполнить выбранный запрос"], - "Run": ["Выполнить"], - "Stop running (Ctrl + x)": ["Остановить (Ctrl + x)"], - "Stop running (Ctrl + e)": ["Остановить (Ctrl + e)"], - "Run query (Ctrl + Return)": ["Выполнить запрос (Ctrl + Return)"], - "Save & Explore": ["Сохранить и исследовать"], - "Overwrite & Explore": ["Перезаписать и исследовать"], - "Undefined": ["Не определено"], - "Save": ["Сохранить"], - "Save as": ["Сохранить как"], - "Save query": ["Сохранить запрос"], - "Save as new": ["Сохранить как новый"], - "Update": ["Обновить"], - "Label for your query": ["Метка для вашего запроса"], - "Write a description for your query": [ - "Заполните описание к вашему запросу" + "Database not found.": ["База данных не найдена."], + "Database not found: %(id)s": ["База данных не найдена: %(id)s"], + "Database parameters are invalid.": [ + "Параметры базы данных недействительны." ], - "Schedule query": ["Сохранить запрос"], - "Schedule": ["Расписание"], - "There was an error with your request": [ - "С вашим запросом произошла ошибка" + "Database passwords": ["Пароли базы данных"], + "Database port": ["Порт базы данных"], + "Database settings updated": ["Обновлены настройки базы данных"], + "Databases": ["Базы данных"], + "Dataframe Index": ["Индекс датафрейма"], + "Dataset": ["Датасет"], + "Dataset %(name)s already exists": ["Датасет %(name)s уже существует"], + "Dataset Name": ["Имя датасета"], + "Dataset column delete failed.": ["Не удалось удалить столбец датасета"], + "Dataset column not found.": ["Столбец датасета не найден"], + "Dataset could not be created.": ["Не удалось создать датасет"], + "Dataset could not be deleted.": ["Не удалось удалить датасет"], + "Dataset could not be duplicated.": ["Датасет не может быть дублирован."], + "Dataset could not be updated.": ["Не удалось обновить датасет"], + "Dataset does not exist": ["Датасет не существует"], + "Dataset imported": ["Импортирован датасет"], + "Dataset is required": ["Требуется датасет"], + "Dataset metric delete failed.": ["Не удалось удалить меру датасета."], + "Dataset metric not found.": ["Мера датасета не найдена."], + "Dataset name": ["Имя датасета"], + "Dataset parameters are invalid.": ["Параметры датасета неверны."], + "Dataset schema is invalid, caused by: %(error)s": [ + "Схема датасета невалидна, причина: %(error)s" ], - "Please save the query to enable sharing": [ - "Пожалуйста, сохраните запрос, чтобы включить функцию “поделиться”" + "Dataset(s) could not be bulk deleted.": [ + "Датасет(ы) не могут быть массово удалены." ], - "Copy link": ["Скопировать ссылку"], - "Copy query link to your clipboard": [ - "Скопировать часть запроса в буфер обмена" + "Datasets": ["Датасеты"], + "Datasets can be created from database tables or SQL queries. Select a database table to the left or ": [ + "Датасеты могут быть созданы из таблиц базы данных или SQL запросов. Выберите таблицу из базы данных слева или " ], - "Save the query to copy the link": [ - "Сохраните запрос, чтобы скопировать ссылку" + "Datasets do not contain a temporal column": [ + "Датасет не содержит столбца формата дата/время" ], - "No stored results found, you need to re-run your query": [ - "Не найдены сохранённые результаты, необходимо повторно выполнить запрос" + "Datasource": ["Источник данных"], + "Datasource & Chart Type": ["Источник данных и Тип графика"], + "Datasource does not exist": ["Источник данных не существует"], + "Datasource type is invalid": ["Тип источниках данных неверный"], + "Datasource type is required when datasource_id is given": [ + "Тип источника данных обязателен, когда дан идентификатор источника данных (datasource_id)" ], - "Run a query to display results here": [ - "Выполнить запрос для отображения результатов" + "Date Time Format": ["Формат даты и времени"], + "Date filter": ["Временной фильтр"], + "Date format": ["Форматы даты"], + "Date format string": ["Формат временной строки"], + "Date/Time": ["Дата/Время"], + "Datetime Format": ["Формат даты и времени"], + "Datetime column not provided as part table configuration and is required by this type of chart": [ + "Столбец даты/времени не предусмотрен в настройках таблицы и является обязательным для этого типа графика" ], - "Preview: `%s`": ["Предпросмотр %s"], - "Results": ["Результаты"], - "Query history": ["История запросов"], - "Run query": ["Выполнить запрос"], - "New tab": ["Закрыть вкладку"], - "Untitled query": ["Запрос без имени"], - "Stop query": ["Остановить запрос"], - "Schedule the query periodically": [ - "Запланировать периодическое выполнение запроса" + "Datetime format": ["Формат даты/времени"], + "Day": ["День"], + "Day (freq=D)": ["День (част=D)"], + "Days %s": ["Дней %s"], + "Db engine did not return all queried columns": [ + "драйвер базы данных вернул не все запрошенные столбцы" ], - "You must run the query successfully first": [ - "Сначала необходимо успешно выполнить запрос" + "Deactivate": ["Выключить"], + "December": ["Декабрь"], + "Decimal Character": ["Десятичный разделитель"], + "Deck.gl - 3D Grid": ["Deck.gl - 3D сетка"], + "Deck.gl - Arc": ["Deck.gl - Дуга"], + "Deck.gl - GeoJSON": ["Deck.gl - GeoJSON"], + "Deck.gl - Multiple Layers": ["Deck.gl - Многослойный"], + "Deck.gl - Polygon": ["Deck.gl - Полигон"], + "Deck.gl - Scatter plot": ["Deck.gl - Точечная диаграмма"], + "Default": ["По умолчанию"], + "Default Endpoint": ["Эндпоинт по умолчанию"], + "Default URL": ["URL по умолчанию"], + "Default URL to redirect to when accessing from the dataset list page": [ + "URL по умолчанию, на который будет выполнен редирект при доступе из страницы со списком датасетов" ], - "It appears that the number of rows in the query results displayed\n was limited on the server side to\n the %s limit.": [ - "" + "Default Value": ["Значение по умолчанию"], + "Default datetime": ["Дата и время по умолчанию"], + "Default latitude": ["Широта по умолчанию"], + "Default longitude": ["Долгота по умолчанию"], + "Default minimal column width in pixels, actual width may still be larger than this if other columns don't need much space": [ + "Минимальная ширина столбца (в пикселях). Реальная ширина по-прежнему может быть больше, чем указанная, если остальным столбцам не будет хватать места." ], - "CREATE TABLE AS": ["Разрешить CREATE TABLE AS"], - "CREATE VIEW AS": ["Разрешить CREATE TABLE AS"], - "Estimate the cost before running a query": [ - "Спрогнозировать время до выполнения запроса" + "Default value is required": ["Требуется значение по умолчанию"], + "Default value must be set when \"Filter has default value\" is checked": [ + "Значение по умолчанию должно быть выбрано, когда установлен флаг \"Фильтр имеет значение по умолчанию\"" ], - "Reset state": ["Сбросить текущее состояние"], - "Enter a new title for the tab": ["Введите название для таблицы"], - "Untitled Query %s": ["Запрос без имени %s"], - "Close tab": ["Закрыть вкладку"], - "Rename tab": ["Переименовать вкладку"], - "Expand tool bar": ["Показать панель инструментов"], - "Hide tool bar": ["Скрыть панель инструментов"], - "Close all other tabs": ["Закрыть все вкладки"], - "Duplicate tab": ["Дублировать вкладку"], - "Copy partition query to clipboard": [ - "Скопировать часть запроса в буфер обмена" + "Default value must be set when \"Filter value is required\" is checked": [ + "Значение по умолчанию должно быть выбрано, когда установлен флаг \"Требуется значение фильтра\"" ], - "latest partition:": ["последний раздел:"], - "Keys for table": ["Ключевые поля таблицы"], - "View keys & indexes (%s)": ["Посмотреть ключи и индексы (%s)"], - "Sort columns alphabetically": [ - "Отсортировать столбцы в алфавитном порядке" + "Default value set automatically when \"Select first filter value by default\" is checked": [ + "Значение по умолчанию задается автоматически, когда установлен флаг \"Сделать первое значение фильтра значением по умолчанию\"" ], - "Original table column order": [ - "Расположение столбцов как в исходной таблице" + "Define a function that receives the input and outputs the content for a tooltip": [ + "Задайте функцию, которая получает на вход содержимое всплывающей подсказки" ], - "Copy SELECT statement to the clipboard": [ - "Скопировать выражение SELECT в буфер обмена" + "Define a function that returns a URL to navigate to when user clicks": [ + "Задайте функцию, которая возвращает URL для навигации при пользовательском нажатии" ], - "Show CREATE VIEW statement": ["Показать выражение CREATE VIEW"], - "CREATE VIEW statement": ["Выражение CREATE VIEW"], - "Remove table preview": ["Убрать предпросмотр таблицы"], - "Assign a set of parameters as": [""], - "below (example:": [""], - "), and they become available in your SQL (example:": [""], - ") by using": [""], - "Edit template parameters": ["Изменить параметры шаблона"], - "Invalid JSON": ["Недопустимый формат json"], - "Create a new chart": ["Создать новый срез"], - "Choose a dataset": ["Выберите источник данных"], - "If the dataset you are looking for is not available in the list, follow the instructions on how to add it in the Superset tutorial.": [ - "Если датасет, который вы ищете не доступен в списке, следуйте инструкциям по добавлению его в руководстве по Superset." - ], - "Choose a visualization type": ["Выберите тип визуализации"], - "Create new chart": ["Создать новый график"], - "An error occurred while loading the SQL": [ - "Произошла ошибка при создании источника данных" + "Define a javascript function that receives the data array used in the visualization and is expected to return a modified version of that array. This can be used to alter properties of the data, filter, or enrich the array.": [ + "Определите функцию javascript, которая получает массив данных, используемый в визуализации, и, как ожидается, вернет измененную версию этого массива. Это может быть использовано для изменения свойств данных, фильтрации или расширения массива." ], - "Updating chart was stopped": ["Обновление графика остановлено"], - "An error occurred while rendering the visualization: %s": [ - "Произошла ошибка при построении графика: %s" + "Defines a rolling window function to apply, works along with the [Periods] text box": [ + "Определяет функцию скользящего окна для применения, работает вместе с текстовым полем [Периоды]" ], - "Network error.": ["Ошибка сети."], - "every": ["каждый"], - "every month": ["месяц"], - "every day of the month": ["каждый день месяца"], - "day of the month": ["день месяца"], - "every day of the week": ["каждый день недели"], - "day of the week": ["день недели"], - "every hour": ["каждый час"], - "every minute UTC": [""], - "year": ["год"], - "month": ["месяц"], - "week": ["неделя"], - "day": ["день"], - "hour": ["час"], - "minute": ["минута"], - "reboot": [""], - "Every": [""], - "in": ["в"], - "on": [""], - "and": [""], - "at": [""], - ":": [":"], - "minute(s) UTC": ["5 минут"], - "Invalid cron expression": [""], - "Clear": ["Очистить"], - "Sunday": ["Воскресенье"], - "Monday": ["Понедельник"], - "Tuesday": ["Вторник"], - "Wednesday": ["Среда"], - "Thursday": ["Четверг"], + "Defines how each series is broken down": [ + "Определяет разложение каждой категории" + ], + "Defines the grid size in pixels": [ + "Определяет размер сетки (в пикселях)" + ], + "Defines the grouping of entities. Each series is shown as a specific color on the chart and has a legend toggle": [ + "Группировка в ряды данных. Каждая категория отображается в виде определенного цвета на графике и имеет легенду" + ], + "Defines the size of the rolling window function, relative to the time granularity selected": [ + "Определяет размер функции скользящего окна относительно выбранной детализации по времени" + ], + "Defines whether the step should appear at the beginning, middle or end between two data points": [ + "Определяет, должен ли шаг отображаться в начале, середине или конце между двумя точками данных" + ], + "Delete": ["Удалить"], + "Delete %s?": ["Удалить %s?"], + "Delete Annotation?": ["Удалить аннотацию?"], + "Delete Database?": ["Удалить базу данных?"], + "Delete Dataset?": ["Удалить датасет?"], + "Delete Layer?": ["Удалить слой?"], + "Delete Query?": ["Удалить запрос?"], + "Delete Report?": ["Удалить рассылку?"], + "Delete Template?": ["Удалить шаблон?"], + "Delete all Really?": ["Действительно удалить все?"], + "Delete annotation": ["Удалить аннотацию"], + "Delete dashboard tab?": ["Удалить вкладку дашборда?"], + "Delete database": ["Удалить базу данных"], + "Delete email report": ["Удалить рассылку по email"], + "Delete query": ["Удалить запрос"], + "Delete template": ["Удалить шаблон"], + "Delete this container and save to remove this message.": [ + "Удалите этот контейнер и сохраните изменения, чтобы убрать это сообщение." + ], + "Deleted %(num)d annotation": [ + "Удалалена %(num)d аннотация", + "Удалалены %(num)d аннотации", + "Удалалено %(num)d аннотаций" + ], + "Deleted %(num)d annotation layer": [ + "Удалален %(num)d слой аннотаций", + "Удалалены %(num)d слоя аннотаций", + "Удалалено %(num)d слоев аннотаций" + ], + "Deleted %(num)d chart": [ + "Удален %(num)d график", + "Удалены %(num)d графика", + "Удалено %(num)d графиков" + ], + "Deleted %(num)d css template": [ + "Удален %(num)d CSS шаблон", + "Удалены %(num)d CSS шаблона", + "Удалено %(num)d CSS шаблонов" + ], + "Deleted %(num)d dashboard": [ + "Удален %(num)d дашборд", + "Удалены %(num)d дашборда", + "Удалено %(num)d дашбордов" + ], + "Deleted %(num)d dataset": [ + "Удален %(num)d датасет", + "Удалены %(num)d датасета", + "Удалено %(num)d датасетов" + ], + "Deleted %(num)d report schedule": [ + "Удалено %(num)d расписание рассылок", + "Удалены %(num)d расписания рассылок", + "Удалено %(num)d расписаний рассылок" + ], + "Deleted %(num)d saved query": [ + "Удален %(num)d сохраненный запрос", + "Удалены %(num)d сохраненных запроса", + "Удалено %(num)d сохраненных запросов" + ], + "Deleted: %s": ["Удалено: %s"], + "Deleting a tab will remove all content within it. You may still reverse this action with the": [ + "Удаление вкладки удалит все ее содержимое. Вы можете отменить это действие при помощи сочетания клавиш" + ], + "Delimited long & lat single column": [ + "Долгота и широта в одном столбце" + ], + "Delimiter": ["Разделитель"], + "Delivery method": ["Способ оповещения"], + "Demographics": ["Демография"], + "Density": ["Концентрация"], + "Dependent on": ["Зависит от"], + "Deprecated": ["Устарело"], + "Description": ["Описание"], + "Description (this can be seen in the list)": [ + "Описание (будет видно в списке)" + ], + "Description Columns": ["Описательные столбцы"], + "Description text that shows up below your Big Number": [ + "Описание, отображаемое под Карточкой" + ], + "Deselect all": ["Снять выделение"], + "Details of the certification": ["Детали утверждения"], + "Determines how whiskers and outliers are calculated.": [ + "Определяет формулу расчета \"усов\" и выбросов." + ], + "Determines whether or not this dashboard is visible in the list of all dashboards": [ + "Определяет, виден ли этот дашборд в списке всех дашбордов" + ], + "Diamond": ["Ромб"], + "Did you mean:": ["Возможно вы имели в виду:"], + "Difference": ["Разница"], + "Dim Gray": ["Тускло-серый"], + "Dimension": ["Измерение"], + "Dimension to use on x-axis.": ["Измерение для использования на оси X"], + "Dimension to use on y-axis.": ["Измерение для использования на оси Y"], + "Dimensions": ["Измерения"], + "Directed Force Layout": [""], + "Directional": ["Направленный"], + "Disable SQL Lab data preview queries": [ + "Отключить предпросмотр данных в Лаборатории SQL" + ], + "Disable data preview when fetching table metadata in SQL Lab. Useful to avoid browser performance issues when using databases with very wide tables.": [ + "Отключить предварительный просмотр данных при извлечении метаданных таблицы в SQL Lab. Полезно для избежания проблем с производительностью браузера при использовании баз данных с очень широкими таблицами." + ], + "Disable embedding?": ["Выключить встраивание?"], + "Disabled": ["Отключено"], + "Discard": ["Отменить изменения"], + "Discrete": ["Обособленный"], + "Display Name": ["Отображаемое имя"], + "Display column level total": ["Отображать общий итог по столбцу"], + "Display configuration": ["Настройки отображения"], + "Display metrics side by side within each column, as opposed to each column being displayed side by side for each metric.": [ + "Отображать меры рядом в каждом столбце, в отличие от отображения каждого столбца рядом для каждой меры." + ], + "Display row level total": ["Отображать общий итог по строке"], + "Display settings": ["Настройки отображения"], + "Display total row/column": ["Отобразить общую строку/столбец"], + "Displays connections between entities in a graph structure. Useful for mapping relationships and showing which nodes are important in a network. Graph charts can be configured to be force-directed or circulate. If your data has a geospatial component, try the deck.gl Arc chart.": [ + "" + ], + "Distribution": ["Распределение"], + "Distribution - Bar Chart": ["Распределение - Столбчатая диаграмма"], + "Divider": ["Разделитель"], + "Do you want a donut or a pie?": ["Круговая/кольцевая диаграмма"], + "Documentation": ["Документация"], + "Domain": ["Блок"], + "Donut": ["Кольцевая диаграмма"], + "Dotted": ["Пунктир"], + "Download": ["Сохранить"], + "Download as image": ["Сохранить как изображение"], + "Download to CSV": ["Сохранить в CSV"], + "Draft": ["Черновик"], + "Drag and drop components and charts to the dashboard": [ + "Переместите элементы оформления и графики на дашборд" + ], + "Drag and drop components to this tab": [ + "Переместите элементы оформления и графики в эту вкладку" + ], + "Draw a marker on data points. Only applicable for line types.": [ + "Отобразить маркеры на данных. Применимо только для линий." + ], + "Draw area under curves. Only applicable for line types.": [ + "Отобразить область под кривыми. Применимо только для линий\"" + ], + "Draw line from Pie to label when labels outside?": [ + "Проводит линию от диаграммы к метке, когда метки находятся снаружи" + ], + "Draw split lines for minor axis ticks": [ + "Рисует разделительные линии для небольших отметок оси" + ], + "Draw split lines for minor y-axis ticks": [ + "Рисует разделительные линии для небольших отметок оси Y" + ], + "Drill to detail": [""], + "Drill to detail by": [""], + "Drill to detail by value is not yet supported for this chart type.": [ + "" + ], + "Drill to detail is disabled because this chart does not group data by dimension value.": [ + "" + ], + "Drill to detail: %s": [""], + "Drop a column here or click": [ + "Перетащите столбец сюда", + "Перетащите столбцы сюда", + "Перетащите столбцы сюда" + ], + "Drop a column/metric here or click": [ + "Перетащите столбец/меру сюда", + "Перетащите столбцы/меры сюда", + "Перетащите столбцы/меры сюда" + ], + "Drop a temporal column here or click": [ + "Перетащите столбец формата дата/время сюда" + ], + "Drop column here": [ + "Перетащите столбец сюда", + "Перетащите столбцы сюда", + "Перетащите столбцы сюда" + ], + "Drop column or metric here": [ + "Перетащите столбец или меру сюда", + "Перетащите столбцы или меры сюда", + "Перетащите столбцы или меры сюда" + ], + "Drop columns here": ["Перетащите столбцы сюда"], + "Drop columns or metrics here": ["Перетащите столбцы или меры сюда"], + "Drop columns/metrics here or click": ["Перетащите столбцы/меры сюда"], + "Drop temporal column here": [ + "Перетащите столбец формата дата/время сюда" + ], + "Duplicate": ["Дублировать"], + "Duplicate column name(s): %(columns)s": [ + "Повторяющееся имя столбца(ов): %(columns)s" + ], + "Duplicate column/metric labels: %(labels)s. Please make sure all columns and metrics have a unique label.": [ + "Повторяющиеся метки столбцов/мер: %(labels)s. Пожалуйста, убедитесь, что все столбцы и меры имеют уникальную метку." + ], + "Duplicate dataset": ["Дублировать датасет"], + "Duplicate tab": ["Дублировать вкладку"], + "Duration": ["Продолжительность"], + "Duration (in seconds) of the caching timeout for charts of this database. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.": [ + "Продолжительность (в секундах) таймаута кэша для графиков этой базы данных. Таймаут 0 означает, что кэш никогда не очистится. Обратите внимание, что если значение не задано, применяется значение по умолчанию из основной конфигурации." + ], + "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the dataset's timeout if undefined.": [ + "Продолжительность (в секундах) таймаута кэша для этого графикаОбратите внимание, что если значение не задано, применяется значение таймаута датасета." + ], + "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.": [ + "Продолжительность (в секундах) таймаута кэша для этого графикаОбратите внимание, что если значение не задано, применяется значение источника данных/таблицы." + ], + "Duration (in seconds) of the caching timeout for this table. A timeout of 0 indicates that the cache never expires. Note this defaults to the database timeout if undefined.": [ + "Продолжительность (в секундах) таймаута кэша для этой таблицы. Обратите внимание, что если значение не задано, применяется значение базы данных." + ], + "Duration (in seconds) of the metadata caching timeout for schemas of this database. If left unset, the cache never expires.": [ + "Продолжительность (в секундах) таймаута кэша для схем этой базы данных. Обратите внимание, что если значение не задано, кэш никогда не очистится." + ], + "Duration (in seconds) of the metadata caching timeout for tables of this database. If left unset, the cache never expires. ": [ + "Продолжительность (в секундах) таймаута кэша для таблиц этой базы данных. Обратите внимание, что если значение не задано, кэш никогда не очистится." + ], + "Duration in ms (1.40008 => 1ms 400µs 80ns)": [ + "Продолжительность в мс (1.40008 => 1ms 400µs 80ns)" + ], + "Duration in ms (100.40008 => 100ms 400µs 80ns)": [ + "Продолжительность в мс (100.40008 => 100ms 400µs 80ns)" + ], + "Duration in ms (66000 => 1m 6s)": [ + "Продолжительность в мс (66000 => 1m 6s)" + ], + "Duration: %s": ["Продолжительность: %s"], + "Dynamic Aggregation Function": ["Динамическая агрегирующая функция"], + "Dynamically search all filter values": [ + "Динамически искать все значения фильтра" + ], + "ECharts": ["Графики Apache"], + "END (EXCLUSIVE)": ["КОНЕЦ (НЕ ВКЛЮЧИТЕЛЬНО)"], + "ERROR": ["ОШИБКА"], + "ERROR: %s": ["ОШИБКА: %s"], + "Edge length": ["Длина ребер"], + "Edge length between nodes": ["Длина ребер между вершинами"], + "Edge symbols": ["Оформление ребер"], + "Edge width": ["Толщина ребра"], + "Edit": ["Редактировать"], + "Edit Alert": ["Редактировать оповещение"], + "Edit CSS": ["Редактировать CSS"], + "Edit CSS Template": ["Редактировать CSS шаблон"], + "Edit CSS template properties": ["Редактировать свойств CSS шаблона"], + "Edit Chart": ["Редактировать график"], + "Edit Chart Properties": ["Редактировать свойства графика"], + "Edit Column": ["Редактировать столбец"], + "Edit Dashboard": ["Редактировать дашборд"], + "Edit Database": ["Редактировать Базу Данных"], + "Edit Dataset ": ["Редактировать датасет "], + "Edit Log": ["Редактировать запись"], + "Edit Metric": ["Редактировать меру"], + "Edit Plugin": ["Редактировать плагин"], + "Edit Report": ["Редактировать отчет"], + "Edit Saved Query": ["Редактировать сохраненный запрос"], + "Edit Table": ["Редактировать таблицу"], + "Edit annotation": ["Редактировать аннотацию"], + "Edit annotation layer": ["Редактировать слой аннотации"], + "Edit annotation layer properties": [ + "Редактировать свойства слоя аннотаций" + ], + "Edit chart": ["Редактировать график"], + "Edit chart properties": ["Редактировать свойства графика"], + "Edit dashboard": ["Редактировать дашборд"], + "Edit database": ["Редактировать Базу Данных"], + "Edit dataset": ["Редактировать датасет"], + "Edit email report": ["Редактировать рассылку"], + "Edit properties": ["Редактировать свойства"], + "Edit query": ["Редактировать запрос"], + "Edit template": ["Редактировать шаблон"], + "Edit template parameters": [ + "Редактировать параметры шаблонизации Jinja" + ], + "Edit the dashboard": ["Редактировать дашборд"], + "Edit time range": ["Изменить временной интервал"], + "Edited": ["Редактировано"], + "Editing 1 filter:": ["Редактирование 1 фильтра:"], + "Editing filter set:": ["Редактирование набора фильтров:"], + "Either the database is spelled incorrectly or does not exist.": [ + "Неверное или несуществующее имя базы данных." + ], + "Either the username \"%(username)s\" or the password is incorrect.": [ + "Неверное имя пользователя \"%(username)s\" или пароль." + ], + "Either the username \"%(username)s\", password, or database name \"%(database)s\" is incorrect.": [ + "Неверное имя пользователя \"%(username)s\", пароль или имя базы данных \"%(database)s\"." + ], + "Either the username or the password is wrong.": [ + "Неверное имя пользователя или пароль" + ], + "Email reports active": ["Включить рассылки"], + "Embed": ["Встроить"], + "Embed code": ["Встроенный код"], + "Embed dashboard": ["Встроить дашборд"], + "Embedding deactivated.": ["Встраивание отключено"], + "Emitted values": ["Отображаемые значения"], + "Emphasis": ["Акцент"], + "Employment and education": ["Трудоустройство и образование"], + "Empty circle": ["Пустой круг"], + "Empty collection": ["Пустая коллекция"], + "Empty query result": ["Пустой ответ запроса"], + "Empty query?": ["Пустой запрос?"], + "Empty row": [""], + "Enable 'Allow file uploads to database' in any database's settings": [ + "Включите \"Разрешить загрузку файлов в базу данных\" в настройках любой базы данных" + ], + "Enable data zooming controls": [ + "Включить элементы управления масштабированием данных" + ], + "Enable embedding": ["Разрешить встраивание"], + "Enable forecast": ["Включить прогноз в график"], + "Enable forecasting": ["Включить прогнозирование данных"], + "Enable graph roaming": ["Включить перемещение по графику"], + "Enable node dragging": ["Разрешить перемещение вершин"], + "Enable query cost estimation": ["Разрешить оценку стоимости запроса"], + "Enable server side pagination of results (experimental feature)": [ + "Включить серверную пагинацию результатов (экспериментально)" + ], + "Encountered invalid NULL spatial entry, please consider filtering those out": [ + "" + ], + "End": ["Конец"], + "End (Longitude, Latitude): ": ["Конец (Долгота, Широта)"], + "End Longitude & Latitude": ["Конечные Долгота и Широта"], + "End Time": ["Время окончания"], + "End angle": ["Конечный угол"], + "End date excluded from time range": [ + "Конечная дата исключена из временного интервала" + ], + "End date must be after start date": [ + "Конечная дата должна быть после начальной" + ], + "Engine \"%(engine)s\" cannot be configured through parameters.": [ + "Не удается настроить драйвер \"%(engine)s\" при данных параметрах." + ], + "Engine Parameters": ["Параметры драйвера"], + "Engine spec \"InvalidEngine\" does not support being configured via individual parameters.": [ + "" + ], + "Enter CA_BUNDLE": ["Введите CA_BUNDLE"], + "Enter Primary Credentials": ["Введите основные учетные данные"], + "Enter a delimiter for this data": ["Введите разделитель этих данных"], + "Enter a name for this sheet": ["Введите название для этого листа"], + "Enter a new title for the tab": ["Введите новое название для вкладки"], + "Enter duration in seconds": ["Введите время в секундах"], + "Enter fullscreen": ["Полноэкранный режим"], + "Enter the required %(dbModelName)s credentials": [ + "Введите обязательные данные для %(dbModelName)s" + ], + "Entity": ["Элемент"], + "Entity ID": ["ID элемента"], + "Equal Date Sizes": ["Одинаковые размеры дат"], + "Equal to (=)": [""], + "Error": ["Ошибка"], + "Error in jinja expression in HAVING clause: %(msg)s": [ + "Ошибка в jinja выражении в операторе HAVING: %(msg)s" + ], + "Error in jinja expression in RLS filters: %(msg)s": [ + "Ошибка в jinja выражении в RLS фильтрах: %(msg)s" + ], + "Error in jinja expression in WHERE clause: %(msg)s": [ + "Ошибка в jinja выражении в операторе WHERE: %(msg)s" + ], + "Error in jinja expression in fetch values predicate: %(msg)s": [ + "Ошибка в jinja выражении в предикате выборки значений: %(msg)s" + ], + "Error loading chart datasources. Filters may not work correctly.": [ + "Ошибка загрузки источников данных для графиков. Фильтры могут работать некорректно." + ], + "Error message": ["Сообщение об ошибке"], + "Error while fetching charts": ["Возникла ошибка при получении графиков"], + "Error while fetching data: %s": [ + "Возникла ошибка при получении данных: %s" + ], + "Error while rendering virtual dataset query: %(msg)s": [ + "Произошла ошибка при выполнении запроса виртуального датасета: %(msg)s" + ], + "Error: %(error)s": ["Ошибка: %(error)s"], + "Error: %(msg)s": ["Ошибка: %(msg)s"], + "Error: permalink state not found": [""], + "Estimate cost": ["Оценить стоимость запроса"], + "Estimate selected query cost": ["Оценить стоимость выбранного запроса"], + "Estimate the cost before running a query": [ + "Спрогнозировать стоимость до выполнения запроса" + ], + "Event": ["Событие"], + "Event Names": ["Имена событий"], + "Event definition": ["Определение события"], + "Event time column": ["Столбец формата дата/время"], + "Every": ["Каждый(ая)"], + "Evolution": ["Динамика"], + "Exact": ["Точное"], + "Example": ["Пример"], + "Examples": ["Примеры"], + "Excel File": ["Excel Файл"], + "Excel file \"%(excel_filename)s\" uploaded to table \"%(table_name)s\" in database \"%(db_name)s\"": [ + "Excel файл \"%(excel_filename)s\" загружен в таблицу \"%(table_name)s\" в базе данных \"%(db_name)s\"" + ], + "Excel to Database configuration": [ + "Конфигурация Excel файла для импорта в базу данных" + ], + "Exclude selected values": ["Исключить выбранные значения"], + "Executed SQL": ["Исполненный SQL"], + "Executed query": ["Выполненный запрос"], + "Execution ID": ["ID исполнения"], + "Execution log": ["Журнал Действий"], + "Existing dataset": ["Существующий датасет"], + "Exit fullscreen": ["Выйти из полноэкранного режима"], + "Expand": ["Расширить"], + "Expand all": ["Расширить все"], + "Expand data panel": ["Расширить панель данных"], + "Expand row": ["Развернуть строку"], + "Expand table preview": ["Расширить предпросмотр таблицы"], + "Expand tool bar": ["Показать панель инструментов"], + "Expects a formula with depending time parameter 'x'\n in milliseconds since epoch. mathjs is used to evaluate the formulas.\n Example: '2x+5'": [ + "Формула с зависимой переменной 'x' в милисекундах с 1970 года (Unix-время). Для рассчета используется mathjs. Например: '2x+5'" + ], + "Experimental": ["Экспериментальный"], + "Explore": ["Исследовать"], + "Explore - %(table)s": ["Исследовать - %(table)s"], + "Explore the result set in the data exploration view": [ + "Создать новый график на основе этих данных" + ], + "Export": ["Экспортировать"], + "Export dashboards?": ["Экспортировать дашборды?"], + "Export query": ["Экспорт запроса"], + "Export to .CSV": ["Экспорт в .CSV"], + "Export to .JSON": ["Экспорт в .JSON"], + "Export to YAML": ["Экспорт в YAML"], + "Export to YAML?": ["Экспортировать в YAML?"], + "Export to full .CSV": ["Экспорт в целый .CSV"], + "Export to original .CSV": ["Экспорт исходных данных в .CSV"], + "Export to pivoted .CSV": ["Экспорт сводной таблицы в .CSV"], + "Expose database in SQL Lab": [ + "Предоставить доступ к базе в Лаборатории SQL" + ], + "Expose in SQL Lab": ["Доступен в SQL редакторе"], + "Expose this DB in SQL Lab": [ + "Предоставить доступ к базе в Лаборатории SQL" + ], + "Expression": ["Выражение"], + "Extra": ["Дополнительные параметры"], + "Extra Controls": ["Дополнительные элементы управления"], + "Extra Parameters": ["Доп. параметры"], + "Extra data for JS": ["Доп. данные для JS"], + "Extra data to specify table metadata. Currently supports metadata of the format: `{ \"certification\": { \"certified_by\": \"Data Platform Team\", \"details\": \"This table is the source of truth.\" }, \"warning_markdown\": \"This is a warning.\" }`.": [ + "Дополнительные метаданные таблицы. В настоящий момент поддерживается следующий формат: `{ \"certification\": { \"certified_by\": \"Руководитель отдела\", \"details\": \"Эта таблица - источник правды.\" }, \"warning_markdown\": \"Это предупреждение.\" }`." + ], + "Extra field cannot be decoded by JSON. %(msg)s": [ + "Дополнительное поле не может быть декодировано с помощью JSON. %(msg)s" + ], + "Extra parameters for use in jinja templated queries": [ + "Дополнительные параметры для запросов, использующих шаблонизацию Jinja" + ], + "Extra parameters that any plugins can choose to set for use in Jinja templated queries": [ + "Дополнительные параметры для шаблонизации Jinja, которые могут быть использованы в графиках" + ], + "Extra url parameters for use in Jinja templated queries": [ + "Дополнительные url параметры для запросов, использующих шаблонизацию Jinja" + ], + "Extruded": [""], + "FEB": ["ФЕВ"], + "FRI": ["ПТ"], + "Factor": [""], + "Factor to multiply the metric by": ["Число, на которое умножается мера"], + "Fail": ["Ошибка"], + "Failed": ["Ошибка"], + "Failed at retrieving results": ["Невозможно выполнить запрос"], + "Failed at stopping query. %s": ["Не удалось остановить запрос. %s"], + "Failed to create report": ["Не удалось создать рассылку"], + "Failed to execute %(query)s": [""], + "Failed to load chart data": ["Не удалось загрузить данные графика"], + "Failed to load chart data.": ["Не удалось загрузить данные графика."], + "Failed to retrieve advanced type": [ + "Не удалось получить расширенный тип" + ], + "Failed to start remote query on a worker.": [ + "Не удалось запустить удаленный запрос на сервере." + ], + "Failed to update report": ["Не удалось обновить отчет"], + "Failed to verify select options: %s": [ + "Ошибка при проверке вариантов выбора: %s" + ], + "Favorite": ["Избранное"], + "Favorites": ["Избранное"], + "February": ["Февраль"], + "Fetch Values Predicate": [""], + "Fetch data preview": ["Получить данные для просмотра"], + "Fetched %s": ["Получено %s"], + "Fetching": ["Получение данных"], + "Field cannot be decoded by JSON. %(json_error)s": [ + "поле не может быть декодировано с помощью JSON. %(json_error)s" + ], + "Field cannot be decoded by JSON. %(msg)s": [ + "Поле не может быть декодировано с помощью JSON. %(msg)s" + ], + "Field is required": ["Поле обязательно к заполнению"], + "File": ["Файл"], + "Fill Color": ["Цвет заливки"], + "Fill all required fields to enable \"Default Value\"": [ + "Установить все требуемые флаги для включения \"Значения по умолчанию\"" + ], + "Fill method": ["Метод заполнения пропусков"], + "Filled": ["С заливкой"], + "Filter": ["Фильтр"], + "Filter Configuration": ["Конфигурация фильтра"], + "Filter List": ["Список фильтров"], + "Filter Settings": ["Настройки фильтра"], + "Filter Type": ["Тип фильтра"], + "Filter box": ["Фильтр-виджет"], + "Filter configuration": ["Настройки фильтра"], + "Filter configuration for the filter box": [ + "Настройки фильтра для \"Фильтр-виджета\"" + ], + "Filter has default value": ["Фильтр имеет значение по умолчанию"], + "Filter metadata changed in dashboard. It will not be applied.": [ + "Метаданные фильтра изменились в дашборде. Они не будут применены." + ], + "Filter name": ["Имя фильтра"], + "Filter only displays values relevant to selections made in other filters.": [ + "Фильтр предлагает только те значения, которые отобраны выбранными фильтрами" + ], + "Filter results": ["Фильтровать результаты"], + "Filter set already exists": ["Набор фильтров уже существует"], + "Filter set with this name already exists": [ + "Набор фильтров с этим именем уже существует" + ], + "Filter sets (%(filterSetCount)d)": [ + "Наборы фильтров (%(filterSetCount)d)" + ], + "Filter type": ["Тип фильтра"], + "Filter value (case sensitive)": [ + "Фильтровать значения (зависит от регистра)" + ], + "Filter value is required": ["Требуется значение фильтра"], + "Filter value list cannot be empty": [ + "Список для фильтрации не может быть пуст" + ], + "Filter your charts": ["Поиск"], + "Filterable": ["Фильтруемый"], + "Filters": ["Фильтры"], + "Filters (%d)": ["Фильтры (%d)"], + "Filters by columns": ["Фильтры по столбцам"], + "Filters by metrics": ["Фильтры по мерам"], + "Filters configuration": ["Конфигурация фильтров"], + "Filters out of scope (%d)": ["Фильтры вне рамок дашборда (%d)"], + "Filters with the same group key will be ORed together within the group, while different filter groups will be ANDed together. Undefined group keys are treated as unique groups, i.e. are not grouped together. For example, if a table has three filters, of which two are for departments Finance and Marketing (group key = 'department'), and one refers to the region Europe (group key = 'region'), the filter clause would apply the filter (department = 'Finance' OR department = 'Marketing') AND (region = 'Europe').": [ + "" + ], + "Finish": ["Завершить"], + "First": ["Первый"], + "Fix the trend line to the full time range specified in case filtered results do not include the start or end dates": [ + "Фиксирует линию тренда в полном временном интервале, указанном в случае, если отфильтрованные результаты не включают даты начала или окончания" + ], + "Fix to selected Time Range": ["Выбрать временной интервал"], + "Fixed": ["Фиксированный"], + "Fixed Color": ["Фиксированный цвет"], + "Fixed color": ["Фиксированный цвет"], + "Fixed point radius": ["Фиксированный радиус"], + "Flow": ["Поток"], + "Font size": ["Размер шрифта"], + "Font size for axis labels, detail value and other text elements": [ + "Размер шрифта для меток осей, значений деталей и других текстовых элементов" + ], + "Font size for the biggest value in the list": [ + "Размер шрифта для наибольшего значения в списке" + ], + "Font size for the smallest value in the list": [ + "Размер шрифта для наименьшего значения в списке" + ], + "For Bigquery, Presto and Postgres, shows a button to compute cost before running a query.": [ + "Для Bigquery, Presto и Postgres, показывать кнопку подсчета стоимости запроса перед его выполнением." + ], + "For further instructions, consult the": [ + "Для получения дальнейших инструкций обратитесь к" + ], + "For more information about objects are in context in the scope of this function, refer to the": [ + "" + ], + "For regular filters, these are the roles this filter will be applied to. For base filters, these are the roles that the filter DOES NOT apply to, e.g. Admin if admin should see all data.": [ + "" + ], + "Force": ["Силовой алгоритм"], + "Force all tables and views to be created in this schema when clicking CTAS or CVAS in SQL Lab.": [ + "Принудить создание новых таблиц через CTAS или CVAS в Лаборатории SQL в этой схеме при нажатии соответствующих кнопок" + ], + "Force date format": ["Принудительный перевод к формату дата/время"], + "Force refresh": ["Обновить"], + "Force refresh schema list": ["Принудительно обновить список схем"], + "Force refresh table list": ["Принудительно обновить список таблиц"], + "Forecast periods": ["Кол-во прогнозных периодов"], + "Foreign key": ["Внешний ключ"], + "Forest Green": ["Лесной зеленый"], + "Form data not found in cache, reverting to chart metadata.": [ + "Данные формы не найдены в кэше, возвращение к метаданным графика." + ], + "Form data not found in cache, reverting to dataset metadata.": [ + "Данные формы не найдены в кэше, возвращение к метаданным датасета." + ], + "Formattable": ["Форматируемый"], + "Formatted CSV attached in email": [ + "Форматированный CSV, прикрепленный к письму" + ], + "Formatted date": ["Форматированная дата"], + "Formatted value": ["Форматированное значение"], + "Formatting": ["Форматирование"], + "Formula": ["Формула"], + "Forward values": ["Будущие значения"], + "Found invalid orderby options": [""], + "Fraction digits": ["Десятичные знаки"], + "Frequency": ["Частота"], + "Friction": ["Трение"], + "Friction between nodes": ["Сила трения между вершинами"], "Friday": ["Пятница"], - "Saturday": ["Суббота"], + "From date cannot be larger than to date": [ + "Дата начала не может быть позже даты конца" + ], + "Full name": ["Полное имя"], + "Funnel Chart": ["Воронка"], + "Further customize how to display each column": [ + "Дальнейшая настройка отображения каждого столбца" + ], + "Further customize how to display each metric": [ + "Дальнейшая настройка отображения каждой меры" + ], + "GROUP BY": ["GROUP BY"], + "Gauge Chart": ["Индикаторная диаграмма"], + "General": ["Основные свойства"], + "Generating link, please wait..": [ + "Генерация ссылки, пожалуйста, ждите..." + ], + "Generic Chart": ["Общая диаграмма"], + "Geo": ["Карта"], + "GeoJson Column": ["Столбец GeoJson"], + "GeoJson Settings": ["Настройки GeoJson"], + "Geohash": ["Geohash"], + "Get the last date by the date unit.": [""], + "Get the specify date for the holiday": [""], + "Go to the edit mode to configure the dashboard and add charts": [ + "Перейдите в режим редактирования для изменения дашборда и добавьте графики" + ], + "Gold": ["Золотой"], + "Google Sheet Name and URL": ["Имя или URL Google Таблицы"], + "Grace period": ["Перерыв между оповещением"], + "Graph Chart": ["Сетевой график"], + "Graph layout": ["Формат сетевого графика"], + "Gravity": ["Гравитация"], + "Grid": ["Сетка"], + "Grid Size": ["Размер сетки"], + "Group By": ["Группировать по"], + "Group By filter plugin": [""], + "Group By' and 'Columns' can't overlap": [ + "Измерения и Столбцы не могут повторяться" + ], + "Group By, Metrics or Percentage Metrics must have a value": [ + "Измерения, Меры или Процентные меры должны иметь значение" + ], + "Group by": ["Группировать по"], + "Groupable": ["Группируемый"], + "Handlebars": ["Handlebars"], + "Handlebars Template": ["Шаблон Handlebars"], + "Hard value bounds applied for color coding. Is only relevant and applied when the normalization is applied against the whole heatmap.": [ + "" + ], + "Has created by": ["Создан(а)"], + "Header": ["Заголовок"], + "Header Row": ["Строка заголовка"], + "Heatmap": ["Тепловая карта"], + "Heatmap Options": ["Настройки тепловой карты"], + "Height": ["Высота"], + "Height of the sparkline": ["Высота спарклайна"], + "Hide Line": ["Скрыть линию"], + "Hide chart description": ["Скрыть описание графика"], + "Hide layer": ["Скрыть слой"], + "Hide password.": ["Скрыть пароль."], + "Hide tool bar": ["Скрыть панель инструментов"], + "Hides the Line for the time series": [""], + "Hierarchy": ["Иерархия"], + "Histogram": ["Гистограмма"], + "Home": ["Главная"], + "Horizontal": ["Горизонтально"], + "Horizontal (Top)": ["Горизонтально (сверху)"], + "Horizontal alignment": ["Выравнивание по горизонтали"], + "Host": ["Хост"], + "Hostname or IP address": ["Имя хоста или IP адрес"], + "Hour": ["Час"], + "Hours %s": ["Часов %s"], + "Hours offset": ["Смещение времени"], + "How do you want to enter service account credentials?": [""], + "How many buckets should the data be grouped in.": [""], + "How many periods into the future do we want to predict": [ + "На сколько периодов в будущем предсказывать" + ], + "How to display time shifts: as individual lines; as the difference between the main time series and each time shift; as the percentage change; or as the ratio between series and time shifts.": [ + "Как отображать смещения во времени: как отдельные линии; как абсолютную разницу между основным временным рядом и каждым смещением; как процентное изменение; или как соотношение между рядами и смещениями." + ], + "Huge": ["Огромный"], + "ISO 3166-2 Codes": ["Коды ISO 3166-2"], + "ISO 8601": ["ISO 8601"], + "Id": ["ID"], + "Id of root node of the tree.": ["Id корневой вершины дерева."], + "If Presto or Trino, all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them. If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.": [ + "Если вы используете Presto или Trino, все запросы в Лаборатории SQL будут выполняться от авторизованного пользователя, который должен иметь разрешение на их выполнение. Если включены Hive и hive.server2.enable.doAs, то запросы будут выполняться через техническую учетную запись, но имперсонировать зарегистрированного пользователя можно через свойство hive.server2.proxy.user." + ], + "If Presto, all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them.<br/>If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.": [ + "Если вы используете Presto, все запросы в Лаборатории SQL будут выполняться от авторизованного пользователя, который должен иметь разрешение на их выполнение. <br/> Если включены Hive и hive.server2.enable.doAs, то запросы будут выполняться через техническую учетную запись, но имперсонировать зарегистрированного пользователя можно через свойство hive.server2.proxy.user." + ], + "If Table Already Exists": ["Если таблица уже существует"], + "If a metric is specified, sorting will be done based on the metric value": [ + "Если мера задана, сортировка будет произведена на основании значений меры" + ], + "If duplicate columns are not overridden, they will be presented as \"X.1, X.2 ...X.x\"": [ + "Если повторяющиеся столбцы не перезаписываются, они будут представлены в формате \"X.0, X.1\"." + ], + "If selected, please set the schemas allowed for csv upload in Extra.": [ + "Если установлено, выберите схемы, в которые разрешена загрузка CSV на вкладке \"Дополнительно\"." + ], + "If table exists do one of the following: Fail (do nothing), Replace (drop and recreate table) or Append (insert data).": [ + "Если таблица уже существует, выберите действие: Ошибка (ничего не делать), Заменить (удалить и воссоздать таблицу) или Добавить (вставить данные)." + ], + "Ignore cache when generating screenshot": [ + "Игнорировать кэш при создании скриншота" + ], + "Ignore null locations": ["Игнорировать пустые локации"], + "Ignore time": ["Игнорировать время"], + "Image (PNG) embedded in email": [ + "Изображение (PNG), встроенное в email" + ], + "Image download failed, please refresh and try again.": [ + "Ошибка скачивания изображения, пожалуйста, обновите и попробуйте заново." + ], + "Impersonate logged in user (Presto, Trino, Drill, Hive, and GSheets)": [ + "Имперсонировать пользователя (Presto, Trino, Drill, Hive, и Google Таблицы)" + ], + "Impersonate the logged on user": ["Имперсонировать пользователя"], + "Import": ["Импорт"], + "Import %s": ["Импортировать %s"], + "Import Dashboard(s)": ["Импортировать дашборд(ы)"], + "Import Dashboards": ["Импортировать дашборды"], + "Import a table definition": [""], + "Import chart failed for an unknown reason": [ + "Не удалось импортировать график по неизвестной причине" + ], + "Import charts": ["Импортировать графики"], + "Import dashboard failed for an unknown reason": [ + "Не удалось импортировать дашборд по неизвестной причине" + ], + "Import dashboards": ["Импортировать дашборды"], + "Import database failed for an unknown reason": [ + "Не удалось импортировать базу данных по неизвестной причине" + ], + "Import database from file": ["Импортировать базу данных из файла"], + "Import dataset failed for an unknown reason": [ + "Не удалось импортировать датасет по неизвестной причине" + ], + "Import datasets": ["Импортировать датасеты"], + "Import queries": ["Импортировать запросы"], + "Import saved query failed for an unknown reason.": [ + "Не удалось импортировать сохраненный запрос по неизвестной причине" + ], + "Important! Select this if the table is not already sorted by entity id, else there is no guarantee that all events for each entity are returned.": [ + "" + ], + "Include Series": [""], + "Include a description that will be sent with your report": [ + "Описание, которое будет отправлено вместе с вашим отчетом" + ], + "Include series name as an axis": [ + "Включить имена категорий в качестве оси" + ], + "Include time": ["Включить время"], + "Incompatible Filters (%d)": ["Несовместимые фильтры (%d)"], + "Index": ["Индекс"], + "Index Column": ["Индесный столбец"], + "Info": ["Личные данные"], + "Inner Radius": ["Внутренний радиус"], + "Inner radius of donut hole": ["Внутренний радиус отверстия для кольца"], + "Input field supports custom rotation. e.g. 30 for 30°": [ + "Поле для ввода поддерживает пользовательские значения, например 30 для 30°" + ], + "Instant filtering": ["Мгновенная Фильтрация"], + "Intensity": ["Насыщенность"], + "Interpret Datetime Format Automatically": [ + "Автоматически интерпретировать формат дата/время" + ], + "Interpret the datetime format automatically": [ + "Автоматически интерпретировать формат дата/время" + ], + "Interval": ["Интервал"], + "Interval End column": ["Столбец с концом интервала"], + "Interval bounds": ["Граница интервала"], + "Interval colors": ["Цвета интервала"], + "Interval start column": ["Столбец с началом интервала"], + "Intervals": ["Интервалы"], + "Invalid JSON": ["Недопустимый формат JSON"], + "Invalid advanced data type: %(advanced_data_type)s": [ + "Невалидный расширенный тип данных: %(advanced_data_type)s" + ], + "Invalid certificate": ["Неверный сертификат"], + "Invalid connection string, a valid string usually follows:\n'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'": [ + "Недопустимая строка для подключения, валидная строка соответствует шаблону: ДРАЙВЕР://ИМЯ-ПОЛЬЗОВАТЕЛЯ:ПАРОЛЬ@ХОСТ/ИМЯ-БАЗЫ-ДАННЫХ" + ], + "Invalid connection string, a valid string usually follows: backend+driver://user:password@database-host/database-name": [ + "Недопустимая строка для подключения, валидная строка соответствует шаблону: драйвер://имя-пользователя:пароль@хост/имя-базы-данных" + ], + "Invalid connection string, a valid string usually follows:'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'<p>Example:'postgresql://user:password@your-postgres-db/database'</p>": [ + "Недопустимая строка для подключения, валидная строка соответствует шаблону:'ДРАЙВЕР://ИМЯ-ПОЛЬЗОВАТЕЛЯ:ПАРОЛЬ@ХОСТ/ИМЯ-БАЗЫ-ДАННЫХ'<p>Пример:'postgresql://user:password@postgres-db/database'</p>" + ], + "Invalid cron expression": ["Недопустимое CRON выражение"], + "Invalid cumulative operator: %(operator)s": [""], + "Invalid date/timestamp format": ["Недопустимый формат дата/время"], + "Invalid filter configuration, please select a column": [ + "Неверная конфигурация фильтра, пожалуйста, выберите столбец" + ], + "Invalid filter operation type: %(op)s": [""], + "Invalid geodetic string": [""], + "Invalid geohash string": [""], + "Invalid input": ["Недопустимые входные данные"], + "Invalid lat/long configuration.": [ + "Неверная конфигурация широты и долготы." + ], + "Invalid longitude/latitude": ["Недопустимые долгота/широта"], + "Invalid metric object: %(metric)s": [""], + "Invalid numpy function: %(operator)s": [ + "Недопустимая numpy функция: %(operator)s" + ], + "Invalid options for %(rolling_type)s: %(options)s": [ + "Недопустимые настройки для %(rolling_type)s: %(options)s" + ], + "Invalid permalink key": [""], + "Invalid result type: %(result_type)s": [ + "Недопустимый тип ответа: %(result_type)s" + ], + "Invalid rolling_type: %(type)s": [""], + "Invalid spatial point encountered: %s": [""], + "Invalid state.": [""], + "Invalid tab ids: %s(tab_ids)": [""], + "Inverse selection": ["Выбрать противоположные значения"], + "Invert current page": [""], + "Is certified": ["Одобрено"], + "Is dimension": ["Является измерением"], + "Is favorite": ["В избранном"], + "Is filterable": ["Фильтруемый"], + "Is temporal": ["Содержит дату/время"], + "Issue 1000 - The dataset is too large to query.": [ + "Ошибка 1000 - Источник данных слишком велик для запроса." + ], + "Issue 1001 - The database is under an unusual load.": [ + "Ошибка 1001 - Нетипичная загрузка базы данных." + ], + "It’s not recommended to truncate axis in Bar chart.": [ + "Не рекомендуется урезать интервал оси в столбчатой диаграмме" + ], + "JAN": ["ЯНВ"], + "JSON": ["JSON"], + "JSON Metadata": ["JSON Метаданные"], + "JSON metadata": ["JSON метаданные"], + "JSON metadata is invalid!": ["JSON метаданные не валидны!"], + "JSON string containing additional connection configuration. This is used to provide connection information for systems like Hive, Presto and BigQuery which do not conform to the username:password syntax normally used by SQLAlchemy.": [ + "JSON строка, содержащая дополнительную информацию о соединении. Это используется для указания информации о соединении с такими системами как Hive, Presto и BigQuery, которые не укладываются в шаблон \"пользователь:пароль\", который обычно используется в SQLAlchemy." + ], + "JUL": ["ИЮЛ"], + "JUN": ["ИЮН"], "January": ["Январь"], - "February": ["Февраль"], - "March": ["Март"], - "April": ["Апрель"], - "May": ["Май"], - "June": ["Июнь"], - "July": ["Июль"], - "August": ["Август"], - "September": ["Сентябрь"], - "October": ["Октябрь"], - "November": ["Ноябрь"], - "December": ["Декабрь"], - "SUN": ["ВС"], - "MON": ["ПН"], - "TUE": ["ВТ"], - "WED": ["СР"], - "THU": ["ЧТ"], - "FRI": ["ПТ"], - "SAT": ["СБ"], - "JAN": ["ЯНВ"], - "FEB": ["ФЕВ"], + "Javascript data interceptor": ["Javascript редактор данных"], + "Javascript onClick href": ["Javascript onClick href"], + "Javascript tooltip generator": [ + "Javascript генератор всплывающих подсказок" + ], + "Jinja templating": ["Шаблонизацию Jinja."], + "Json list of the column names that should be read": [ + "Список столбцов в формате JSON из файла, которые будут использованы." + ], + "Json list of the column names that should be read. If not None, only these columns will be read from the file.": [ + "Список столбцов в формате JSON из файла, которые будут использованы. Пример: [\"id\", \"name\", \"gender\", \"age\"]. Если в данном поле указаны названия столбцов, из файла будут загружены только указанные столбцы." + ], + "Json list of the values that should be treated as null. Examples: [\"\"] for empty strings, [\"None\", \"N/A\"], [\"nan\", \"null\"]. Warning: Hive database supports only a single value": [ + "Список JSON значений, которые следует рассматривать как нулевые. Примеры: [\"\"] для пустых строк, [\"None\", \"N/A\"], [\"nan\", \"null\"]. Предупреждение: База данных Hive поддерживает только одно значение." + ], + "Json list of the values that should be treated as null. Examples: [\"\"], [\"None\", \"N/A\"], [\"nan\", \"null\"]. Warning: Hive database supports only single value. Use [\"\"] for empty string.": [ + "Список JSON значений, которые следует рассматривать как нулевые. Примеры: [\"\"], [\"None\", \"N/A\"], [\"nan\", \"null\"]. Предупреждение: База данных Hive поддерживает только одно значение. Используйте [\"\"] для пустой строки." + ], + "July": ["Июль"], + "June": ["Июнь"], + "KPI": ["KPI"], + "Keep control settings?": ["Оставить прежние настройки?"], + "Keep editing": ["Продолжить редактирование"], + "Key": ["Ключ"], + "Kilometers": ["Километры"], + "LIMIT": ["ОГРАНИЧЕНИЕ"], + "Label": ["Метка"], + "Label Line": ["Линия метки"], + "Label Type": ["Тип метки"], + "Label already exists": ["Метка уже существует"], + "Label for your query": ["Метка для вашего запроса"], + "Label position": ["Положение метки"], + "Label threshold": ["Порог метки"], + "Labelling": ["Маркировка"], + "Labels": ["Метки"], + "Labels for the marker lines": ["Метки для линий маркера"], + "Labels for the markers": ["Метки для маркеров"], + "Labels for the ranges": ["Метки для диапазонов"], + "Large": ["Большой"], + "Last": ["Последний"], + "Last Changed": ["Дата изменения"], + "Last Modified": ["Дата изменения"], + "Last Updated %s": ["Дата изменения %s"], + "Last Updated %s by %s": ["Изменено %s пользователем %s"], + "Last available value seen on %s": ["Последнее доступное значение: %s"], + "Last modified": ["Последнее изменение"], + "Last modified by %s": ["Автор изменений %s"], + "Last run": ["Последнее изменение"], + "Latitude": ["Широта"], + "Latitude of default viewport": ["Широта для области просмотра"], + "Layer configuration": ["Настройки слоя"], + "Layout": ["Оформление"], + "Layout elements": ["Оформление"], + "Layout type of graph": [""], + "Layout type of tree": [""], + "Leaf nodes that represent fewer than this number of events will be initially hidden in the visualization": [ + "" + ], + "Least recently modified": ["Измененные давно"], + "Left": ["Слева"], + "Left Axis Format": ["Формат левой оси"], + "Left Axis Metric": ["Мера левой оси"], + "Left Axis chart(s)": ["График(и) по левой оси"], + "Left Margin": ["Левый отступ"], + "Left margin, in pixels, allowing for more room for axis labels": [ + "Левый отступ (в пикселях), дает больше пространства меткам оси" + ], + "Left to Right": ["Слева направо"], + "Left value": ["Левое значение"], + "Legacy": ["Устарел"], + "Legend": ["Легенда"], + "Legend Format": ["Формат легенды"], + "Legend Orientation": ["Ориентация легенды"], + "Legend Position": ["Расположение легенды"], + "Legend type": ["Тип легенды"], + "Less than (<)": [""], + "Lift percent precision": [""], + "Light": ["Светлый"], + "Light mode": ["Светлый режим"], + "Like": [""], + "Limit reached": ["Достигнут предел"], + "Limit selector values": [""], + "Limit type": ["Тип ограничения"], + "Limiting rows may result in incomplete data and misleading charts. Consider filtering or grouping source/target names instead.": [ + "" + ], + "Limits the number of cells that get retrieved.": [ + "Ограничивает количество извлекаемых ячеек" + ], + "Limits the number of rows that get displayed.": [ + "Ограничивает количество отображаемых строк" + ], + "Limits the number of series that get displayed. A joined subquery (or an extra phase where subqueries are not supported) is applied to limit the number of series that get fetched and rendered. This feature is useful when grouping by high cardinality column(s) though does increase the query complexity and cost.": [ + "Ограничивает количество отображаемых категорий. Эта опция полезна для столбцов с большим количеством уникальных значений, т.к. уменьшает сложность и стоимость запроса." + ], + "Line": ["Линейный"], + "Line Chart": ["Линейный график"], + "Line Chart (legacy)": ["Линейный график (устарело)"], + "Line Style": ["Тип линии"], + "Line chart is used to visualize measurements taken over a given category. Line chart is a type of chart which displays information as a series of data points connected by straight line segments. It is a basic type of chart common in many fields.": [ + "Линейная диаграмма используется для визуализации показателей, полученных в рамках одной категории. Линейная диаграмма - это тип диаграммы, который отображает информацию в виде ряда точек данных, соединенных прямыми отрезками. Это базовый тип диаграммы, распространенный во многих областях." + ], + "Line interpolation as defined by d3.js": [ + "Линейная интерполяция, определенная в d3.js" + ], + "Line width": ["Толщина линии"], + "Linear Color Scheme": ["Линейная цветовая схема"], + "Linear color scheme": ["Линейная цветовая схема"], + "Linear interpolation": ["Линейная интерполяция"], + "Link Copied!": ["Ссылка скопирована"], + "List Saved Query": [""], + "List Unique Values": ["Список уникальных значений"], + "List of extra columns made available in Javascript functions": [ + "Список дополнительных столбцов, доступных в функциях Javascript" + ], + "List of n+1 values for bucketing metric into n buckets.": [""], + "List of values to mark with lines": [ + "Список числовых значений для отображения в виде линий на графике. Например, 10,20,30" + ], + "List of values to mark with triangles": [ + "Список числовых значений для отображения в виде треугольников на графике. Например, 10,20,30" + ], + "List updated": ["Список обновлен"], + "Live CSS editor": ["Редактор CSS"], + "Live render": ["Мгновенная отрисовка"], + "Load a CSS template": ["Загрузить CSS шаблон"], + "Loaded data cached": ["Данные загружены в кэш"], + "Loaded from cache": ["Загружено из кэша"], + "Loading": ["Загрузка"], + "Loading...": ["Загрузка..."], + "Log Scale": ["Логарифмическая шкала"], + "Log retention": ["Хранение журнала"], + "Logarithmic axis": ["Логарифмическая ось"], + "Logarithmic scale on primary y-axis": [ + "Логарифмическая шкала для главной оси Y" + ], + "Logarithmic scale on secondary y-axis": [ + "Логарифмическая шкала для вторичной оси Y" + ], + "Logarithmic y-axis": ["Логарифмическая ось Y"], + "Login": ["Вход в систему"], + "Login with": ["Войти при помощи"], + "Logout": ["Выход из системы"], + "Logs": ["Записи"], + "Long dashed": ["Длинный штрих"], + "Longitude": ["Долгота"], + "Longitude & Latitude": ["Долгота и Широта"], + "Longitude & Latitude columns": ["Долгота и Широта"], + "Longitude and Latitude": ["Долгота и Широта"], + "Longitude of default viewport": ["Долгота для области просмотра"], "MAR": ["МАР"], - "APR": ["АПР"], "MAY": ["МАЙ"], - "JUN": ["ИЮН"], - "JUL": ["ИЮЛ"], - "AUG": ["АВГ"], - "SEP": ["СЕН"], - "OCT": ["ОКТ"], + "MON": ["ПН"], + "Main Datetime Column": ["Основной столбец с временем"], + "Make sure that the controls are configured properly and the datasource contains data for the selected time range": [ + "Убедитесь, что настройки графика верно сконфигурированы и источник данных содержит данные для выбранного временного интервала." + ], + "Malformed request. slice_id or table_name and db_name arguments are expected": [ + "Некорректный запрос. Ожидаются аргументы slice_id или table_name и db_name" + ], + "Manage": ["Управление"], + "Manage email report": ["Управление рассылкой по почте"], + "Manage your databases": ["Управляйте своими базами данных"], + "Mandatory": ["Обязательно"], + "Mangle Duplicate Columns": ["Управление повторяющимися столбцами"], + "Manually set min/max values for the y-axis.": [ + "Вручную задать мин./макс. значения для оси Y" + ], + "Map": ["Карта"], + "Map Style": ["Стиль карты"], + "MapBox": ["Mapbox"], + "Mapbox": ["Mapbox"], + "March": ["Март"], + "Margin": ["Отступ"], + "Mark a column as temporal in \"Edit datasource\" modal": [ + "Присвойте столбцу формат даты/времени в настройках датасета" + ], + "Marker": ["Маркер"], + "Marker Size": ["Размер маркера"], + "Marker labels": ["Метки маркера"], + "Marker line labels": ["Метки линий маркера"], + "Marker lines": ["Линии маркеров"], + "Marker size": ["Размер маркера"], + "Markers": ["Маркеры"], + "Markup type": ["Тип разметки"], + "Max": ["Максимум"], + "Max Bubble Size": ["Максимальный размер пузыря"], + "Max Events": ["Лимит событий"], + "Maximum": ["Максимум"], + "Maximum Font Size": ["Максимальный размер шрифта"], + "Maximum Radius": ["Максимальный радиус"], + "Maximum value on the gauge axis": ["Максимальное значение индикатора"], + "Maxium radius size of the circle, in pixels. As the zoom level changes, this insures that the circle respects this maximum radius.": [ + "Максимальный размер радиуса окружности (в пикселях). При изменении уровня масштабирования это гарантирует, что окружность соответствует этому максимальному радиусу" + ], + "May": ["Май"], + "Mean of values over specified period": [ + "Среднее значений за указанный период" + ], + "Mean values": ["Средние значения"], + "Median": ["Медиана"], + "Median edge width, the thickest edge will be 4 times thicker than the thinnest.": [ + "Медианная толщина ребра, самое толстое ребро будет в 4 раза толще самой тонкой." + ], + "Median node size, the largest node will be 4 times larger than the smallest": [ + "Медианный размер вершины, самая большая вершина будет в 4 раза больше самой маленькой." + ], + "Median values": ["Медианные значения"], + "Medium": ["Средний"], + "Menu actions trigger": [""], + "Message content": ["Содержимое сообщения"], + "Metadata": ["Метаданные"], + "Metadata Parameters": ["Параметры метаданных"], + "Metadata has been synced": ["Метаданные синхронизированы"], + "Method": ["Метод"], + "Metric": ["Мера"], + "Metric '%(metric)s' does not exist": ["Мера '%(metric)s' не существует"], + "Metric ascending": ["Мера по возрастанию"], + "Metric assigned to the [X] axis": ["Показатель, отраженный на оси X"], + "Metric assigned to the [Y] axis": ["Показатель, отраженный на оси Y"], + "Metric change in value from `since` to `until`": [ + "Изменение меры с `до` до `после`" + ], + "Metric descending": ["Мера по убыванию"], + "Metric factor change from `since` to `until`": [""], + "Metric for node values": ["Мера для значений вершин"], + "Metric name": ["Имя меры"], + "Metric name [%s] is duplicated": ["Дубль имени меры [%s]"], + "Metric percent change in value from `since` to `until`": [ + "Процентное изменение меры с `до` до `после`" + ], + "Metric that defines the size of the bubble": [ + "Показатель, определяющий размер пузяря" + ], + "Metric to display bottom title": [ + "Мера для отображения нижнего заголовка" + ], + "Metric to sort the results by": [ + "Показатель, по которому сортировать результаты" + ], + "Metric used as a weight for the grid's coloring": [ + "Мера, используемая как вес для раскрашивания сетки" + ], + "Metric used to calculate bubble size": [ + "Мера, используемая для расчета размера пузыря" + ], + "Metric used to control height": [ + "Мера, используемая для регулирования высоты" + ], + "Metric used to define how the top series are sorted if a series or cell limit is present. If undefined reverts to the first metric (where appropriate).": [ + "Мера, используемая для определения того, как сортируются верхние категории, если присутствует ограничение по категории или ячейке. Если не определено, возвращается к первой мере (где это уместно)." + ], + "Metric used to define how the top series are sorted if a series or row limit is present. If undefined reverts to the first metric (where appropriate).": [ + "Мера, используемая для определения того, как сортируются верхние категории, если присутствует ограничение по категории или строке. Если не определено, возвращается к первой мере (где это уместно)." + ], + "Metric used to order the limit if a series limit is present. If undefined reverts to the first metric (where appropriate).": [ + "" + ], + "Metrics": ["Меры"], + "Metrics for which percentage of total are to be displayed. Calculated from only data within the row limit.": [ + "Меры, для которых должен отображаться процент от общего числа. Вычисляется только из данных в пределах ограничения по строкам." + ], + "Middle": ["Середина"], + "Midnight": ["Полночь"], + "Miles": ["Мили"], + "Min": ["Минимум"], + "Min Periods": ["Минимальный период"], + "Min Width": ["Минимальная ширина"], + "Min periods": ["Минимальный период"], + "Min/max (no outliers)": ["Мин/макс (без выбросов)"], + "Mine": ["Мои"], + "Minimum": ["Минимум"], + "Minimum Font Size": ["Минимальный размер шрифта"], + "Minimum Radius": ["Минимальный радиус"], + "Minimum leaf node event count": [""], + "Minimum radius size of the circle, in pixels. As the zoom level changes, this insures that the circle respects this minimum radius.": [ + "Минимальный размер радиуса окружности (в пикселях). При изменении масштаба это гарантирует, что окружность соответствует этому минимальному радиусу." + ], + "Minimum threshold in percentage points for showing labels.": [ + "Минимальный порог в процентных пунктах для отображения меток" + ], + "Minimum value for label to be displayed on graph.": [ + "Минимальное значение метки для отображения на графике." + ], + "Minimum value on the gauge axis": ["Минимальное значение индикатора"], + "Minor Split Line": ["Разметка полотна линиями"], + "Minute": ["Минута"], + "Minutes %s": ["Минут %s"], + "Missing URL parameters": ["Пропущенные параметры URL"], + "Missing dataset": ["Отсутствующий датасет"], + "Mixed Chart": ["Смешанный график"], + "Mixed Time-Series": ["Смешанная диаграмма временных рядов"], + "Modified": ["Изменено"], + "Modified %s": ["Изменено %s"], + "Modified by": ["Кем изменено"], + "Modified columns: %s": ["Изменённые столбцы: %s"], + "Monday": ["Понедельник"], + "Month": ["Месяц"], + "Months %s": ["Месяцев %s"], + "More": ["Подробнее"], + "Move only": ["Только перемещение"], + "Moves the given set of dates by a specified interval.": [""], + "Multi-Dimensions": ["Многомерный"], + "Multi-Layers": ["Многослойный"], + "Multi-Levels": ["Многоуровневый"], + "Multi-Variables": ["Несколько переменных"], + "Multiple": ["Несколько"], + "Multiple Line Charts": ["Несколько линейных диаграмм"], + "Multiple file extensions are not allowed for columnar uploads. Please make sure all files are of the same extension.": [ + "Несколько расширений файлов столбчатого формата не разрешены к загрузке. Пожалуйста, убедитесь, что все файлы имеют одинаковое расширение." + ], + "Multiple filtering": ["Множественная фильтрация"], + "Multiple formats accepted, look the geopy.points Python library for more details": [ + "Для уточнения форматов и получения более подробной информации, посмотрите Python-библиотеку geopy.points" + ], + "Multiple selections allowed, otherwise filter is limited to a single value": [ + "Разрешён множественный выбор, иначе можно выбрать только одно значение фильтра" + ], + "Multiplier": ["Мультипликатор"], + "Must be unique": ["Должно быть уникальным"], + "Must choose either a chart or a dashboard": [ + "Выберите график или дашборд" + ], + "Must have a [Group By] column to have 'count' as the [Label]": [""], + "Must have at least one numeric column specified": [ + "Должен быть указан хотя бы один числовой столбец" + ], + "Must specify a value for filters with comparison operators": [ + "Необходимо указать значение для фильтров с операторами сравнения" + ], + "My beautiful colors": ["Мои красивые цвета"], + "My column": ["Мой столбец"], + "My metric": ["Моя мера"], + "N/A": ["Пусто"], + "NOT GROUPED BY": [""], "NOV": ["НОЯ"], - "DEC": ["ДЕК"], - "OK": [""], - "Click to see difference": ["Нажмите, чтобы увидеть разницу"], - "Altered": ["Изменения"], - "Chart changes": ["Изменения не сохранены"], - "Superset chart": ["График Superset"], - "Check out this chart in dashboard:": [ - "Посмотреть этот график в дашборде:" + "NOW": ["СЕЙЧАС"], + "NUMERIC": ["Числовой (NUMERIC/DECIMAL)"], + "Name": ["Имя"], + "Name is required": ["Имя обязательно"], + "Name must be unique": ["Имя должно быть уникальным"], + "Name of table to be created from columnar data.": [ + "Имя таблицы, созданной из файла столбчатого формата." + ], + "Name of table to be created from excel data.": [ + "Имя таблицы, созданной из Excel файла." + ], + "Name of table to be created with CSV file": [ + "Имя таблицы, созданной из CSV файла." + ], + "Name of the column containing the id of the parent node": [ + "Имя столбца, содержащее id родительской вершины" + ], + "Name of the id column": ["Имя столбца id"], + "Name of the source nodes": ["Имя исходных вершин"], + "Name of the table that exists in the source database": [ + "Имя таблицы, которая существует в базе данных" + ], + "Name of the target nodes": ["Имя конечных вершин"], + "Name your database": ["Дайте имя базе данных"], + "Need help? Learn how to connect your database": [ + "Нужна помощь? Узнайте, как подключаться к вашей базе данных" + ], + "Need help? Learn more about": ["Нужна помощь? Узнайте больше о"], + "Network error": ["Ошибка сети"], + "Network error.": ["Ошибка сети."], + "New chart": ["Новый график"], + "New columns added: %s": ["Добавленные столбцы: %s"], + "New dataset": ["Новый датасет"], + "New dataset name": ["Новое имя датасета"], + "New filter set": ["Новый набор фильтров"], + "New tab": ["Новая вкладка"], + "New tab (Ctrl + q)": ["Новая вкладка (CTRL + Q)"], + "New tab (Ctrl + t)": ["Новая вкладка (CTRL + T)"], + "Next": ["Следующий"], + "Nightingale Rose Chart": ["Диаграмма Найтингейл"], + "No": ["Нет"], + "No %s yet": ["Пока нет %s"], + "No Access!": ["Нет доступа!"], + "No Data": ["Нет данных"], + "No Results": ["Нет результатов"], + "No annotation layers": ["Нет слоев аннотаций"], + "No annotation layers yet": ["Пока нет слоев аннотаций"], + "No annotation yet": ["Пока нет аннотаций"], + "No applied filters": ["Фильтры не применены"], + "No available filters.": ["Нет доступных фильтров."], + "No charts": ["Нет графиков"], + "No columns": ["Нет столбцов"], + "No compatible columns found": ["Не найдено подходящих столбцов"], + "No dashboards": ["Нет дашбордов"], + "No data": ["Нет данных"], + "No data after filtering or data is NULL for the latest time record": [ + "Нет данных после фильтрации или данные отсутствуют за последний отрезок времени" + ], + "No data in file": ["В файле нет данных"], + "No database tables found": ["Не найдено таблиц в базе данных"], + "No databases match your search": [ + "Нет баз данных, удовлетворяющих вашему поиску" + ], + "No description available.": ["Описание отсутствует."], + "No favorite charts yet, go click on stars!": [ + "Пока нет избранных графиков, для добавления в избранное нажмите на звездочку рядом с графиком" + ], + "No favorite dashboards yet, go click on stars!": [ + "Пока нет избранных дашбордов, для добавления в избранное нажмите на звездочку рядом с дашбордом" + ], + "No filter": ["Без фильтрации"], + "No filter is selected.": ["Не выбраны фильтры."], + "No filters": ["Нет фильтров"], + "No filters are currently added": ["Не применено ни одного фильтра"], + "No filters are currently added to this dashboard.": [ + "Не применено ни одного фильтра к данному дашборду." + ], + "No form settings were maintained": [ + "Конфигурация графика не сохранилась" + ], + "No of Bins": ["Количество столбцов"], + "No records found": ["Записи не найдены"], + "No results": ["Нет результатов"], + "No results found": ["Записи не найдены"], + "No results match your filter criteria": [ + "Не найдено результатов по вашим критериям" + ], + "No results were returned for this query": [ + "Не было получено данных по этому запросу" + ], + "No results were returned for this query. If you expected results to be returned, ensure any filters are configured properly and the datasource contains data for the selected time range.": [ + "По этому запросу не было возвращено данных. Если вы ожидали увидеть результаты, убедитесь, что все фильтры настроены правильно и источник данных содержит записи для заданного временного интервала." + ], + "No rows were returned for this dataset": [ + "Не было получено данных для этого датасета" + ], + "No samples were returned for this dataset": [ + "Не было получено данных для этого датасета" + ], + "No saved expressions found": ["Не найдено сохраненных выражений"], + "No saved metrics found": ["Не найдено сохраненных мер"], + "No stored results found, you need to re-run your query": [ + "Не найдены сохраненные результаты, необходимо повторно выполнить запрос" + ], + "No such column found. To filter on a metric, try the Custom SQL tab.": [ + "Такой столбец не найден. Чтобы фильтровать по мере, попробуйте использовать вкладку Свой SQL." + ], + "No temporal columns found": ["Столбцы формата дата/время не найдены"], + "No time columns": ["Нет столбцов формата дата/время"], + "No validator found (configured for the engine)": [ + "Не найден валидатор (сконфигурированный для драйвера)" + ], + "No validator named {} found (configured for the {} engine)": [ + "Не найден валидатор с именем {} (сконфигурированный для драйвера {})" + ], + "Node label position": ["Расположение метки вершины"], + "Node select mode": ["Режим выбора вершин"], + "Node size": ["Размер вершины"], + "None": ["Пусто"], + "None -> Arrow": ["Ничего -> Стрелка"], + "None -> None": ["Ничего -> Ничего"], + "Normal": ["Обычный"], + "Normalize Across": [""], + "Normalized": ["Нормализовать"], + "Not Time Series": ["Не временные ряды"], + "Not added to any dashboard": ["Не добавлен ни в один дашборд"], + "Not available": ["Не доступно"], + "Not equal to (≠)": ["Не равно (≠)"], + "Not null": ["Не пусто"], + "Not triggered": ["Условие не выполнялось"], + "Not up to date": ["Не актуально"], + "Nothing triggered": ["Не срабатывало"], + "Notification method": ["Способ уведомления"], + "November": ["Ноябрь"], + "Now": ["Сейчас"], + "Null Values": ["Пустые значения"], + "Null imputation": ["Пустые значения"], + "Null or Empty": ["Null или Пусто"], + "Null values": ["Пустые значения"], + "Number Format": ["Числовой формат"], + "Number bounds used for color encoding from red to blue.\n Reverse the numbers for blue to red. To get pure red or blue,\n you can enter either only min or max.": [ + "" + ], + "Number format": ["Числовой формат"], + "Number format string": ["Числовой формат"], + "Number of buckets to group data": [""], + "Number of decimal digits to round numbers to": [ + "Кол-во десятичных разрядов для округления числа" + ], + "Number of decimal places with which to display lift values": [""], + "Number of decimal places with which to display p-values": [""], + "Number of periods to compare against": [ + "Количество периодов для сравнения" + ], + "Number of periods to ratio against": [ + "Количество периодов для сравнения" + ], + "Number of rows of file to read": ["Количество строк файла для чтения"], + "Number of rows of file to read.": ["Количество строк файла для чтения."], + "Number of rows to skip at start of file": [ + "Количество строк для пропуска в начале файла" + ], + "Number of rows to skip at start of file.": [ + "Количество строк для пропуска в начале файла." + ], + "Number of split segments on the axis": [ + "Количество разделенных сегментов на индикаторе" + ], + "Number of steps to take between ticks when displaying the X scale": [""], + "Number of steps to take between ticks when displaying the Y scale": [""], + "Numerical range": ["Числовой диапазон"], + "OCT": ["ОКТ"], + "OK": ["ОК"], + "OVERWRITE": ["ПЕРЕЗАПИСАТЬ"], + "October": ["Октябрь"], + "Offline": ["Оффлайн"], + "Offset": ["Смещение"], + "On Grace": ["На перерыве"], + "One or many columns to group by. High cardinality groupings should include a series limit to limit the number of fetched and rendered series.": [ + "Один или несколько столбцов для группировки. Столбцы с множеством уникальных значений должны включать порог количества категорий для снижения нагрузку на базу данных и на ускорения отображения графика." + ], + "One or many columns to group by. High cardinality groupings should include a sort by metric and series limit to limit the number of fetched and rendered series.": [ + "Один или несколько столбцов для группировки. Столбцы с множеством уникальных значений должны включать показатель для сортировки и порог количества значений для снижения нагрузку на базу данных и на ускорения отображения графика." + ], + "One or many columns to pivot as columns": [ + "Один или несколько столбцов, используемых в роли столбцов в сводной таблице" + ], + "One or many controls to group by. If grouping, latitude and longitude columns must be present.": [ + "" + ], + "One or many metrics to display": [ + "Выберите одну или несколько мер для отображения" + ], + "One or more columns already exist": [ + "Один или несколько столбцов уже существуют" + ], + "One or more columns are duplicated": [ + "Один или несколько столбцов дублируются" + ], + "One or more columns do not exist": [ + "Один или несколько столбцов не существуют" + ], + "One or more metrics already exist": [ + "Одна или несколько мер уже существуют" + ], + "One or more metrics are duplicated": [ + "Одна или несколько мер дублируются" + ], + "One or more metrics do not exist": [ + "Одна или несколько мер не существуют" + ], + "One or more parameters needed to configure a database are missing.": [ + "Один или несколько параметров, необходимых для настройки базы данных, отсутствуют" + ], + "One or more parameters specified in the query are malformatted.": [ + "Один или несколько параметров, указанных в запросе, неверно отформатированы" + ], + "One or more parameters specified in the query are missing.": [ + "Один или несколько параметров, указанных в запросе, отсутствуют" + ], + "One or more required fields are missing in the request. Please try again, and if the problem persists conctact your administrator.": [ + "" + ], + "One ore more annotation layers failed loading.": [ + "Один или несколько слоев аннотации не удалось загрузить." + ], + "Only SELECT statements are allowed against this database.": [ + "Только SELECT запросы доступны для этой базы данных." + ], + "Only Total": ["Только общий итог"], + "Only `SELECT` statements are allowed": [ + "Доступны только SELECT запросы" + ], + "Only selected panels will be affected by this filter": [ + "Фильтр будет применён только к выбранным панелям" + ], + "Only show the total value on the stacked chart, and not show on the selected category": [ + "Показывать только общий итог для столбцов с накоплением, и не показывать промежуточные итоги для каждой категории внутри столбца." + ], + "Only single queries supported": [ + "Поддерживаются только одиночные запросы" + ], + "Only the following file extensions are allowed: %(allowed_extensions)s": [ + "Доступные расширения файлов: %(allowed_extensions)s" + ], + "Oops! An error occurred!": ["Произошла ошибка!"], + "Opacity": ["Прозрачность"], + "Opacity of Area Chart. Also applies to confidence band.": [""], + "Opacity of all clusters, points, and labels. Between 0 and 1.": [ + "Непрозрачность всех кластеров, точек и меток. Между 0 и 1." + ], + "Opacity of area chart.": ["Непрозрачность диаграммы областей"], + "Opacity, expects values between 0 and 100": [ + "Непрозрачность, принимаются значения от 0 до 100" + ], + "Open Datasource tab": ["Открыть вкладку источника данных"], + "Open in SQL Lab": ["Открыть в SQL редакторе"], + "Open query in SQL Lab": ["Открыть в SQL редакторе"], + "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.": [ + "Работа с базой данных в асинхронном режиме означает, что запросы исполняются на удалённых воркерах, а не на веб-сервере Superset. Это подразумевает, что у вас есть установка с воркерами Celery. Обратитесь к документации по настройке за дополнительной информацией." + ], + "Operator": ["Оператор"], + "Operator undefined for aggregator: %(name)s": [ + "Оператор не определен для агрегатора: %(name)s" + ], + "Optional CA_BUNDLE contents to validate HTTPS requests. Only available on certain database engines.": [ + "Необязательное содержимое CA_BUNDLE для валидации HTTPS запросов. Доступно только в определенных драйверах баз данных" + ], + "Optional d3 date format string": ["Формат временной строки"], + "Optional d3 number format string": ["Формат числовой строки"], + "Optional name of the data column.": [ + "Необязательное имя столбца данныхэ" + ], + "Optional time column if time range should apply to another column than the default time column": [ + "" + ], + "Optional warning about use of this metric": [ + "Необязательное предупреждение об использовании этой меры" + ], + "Optionally add a detailed description": [""], + "Options": ["Опции"], + "Or choose from a list of other databases we support:": [ + "Или выберите из списка других поддерживаемых баз данных:" + ], + "Order by entity id": [""], + "Order results by selected columns": [ + "Упорядочить результаты по выбранным столбцам" + ], + "Ordering": ["Упорядочивание"], + "Orientation": ["Ориентация"], + "Orientation of bar chart": ["Ориентация диаграммы"], + "Orientation of tree": ["Ориентация дерева"], + "Original": ["Исходные данные"], + "Original table column order": [ + "Расположение столбцов как в исходной таблице" + ], + "Original value": ["Исходное значение"], + "Other": ["Прочее"], + "Outdoors": ["Туристический режим"], + "Outer Radius": ["Внешний радиус"], + "Outer edge of Pie chart": ["Внешний радиус круговой диаграммы"], + "Overlap": ["Перекрывание"], + "Overlay one or more timeseries from a relative time period. Expects relative time deltas in natural language (example: 24 hours, 7 days, 52 weeks, 365 days). Free text is supported.": [ + "Наложение одной или нескольких временных рядов из относительного периода времени." + ], + "Overlays a hexagonal grid on a map, and aggregates data within the boundary of each cell.": [ + "" + ], + "Override time grain": ["Переопределить единицу времени"], + "Override time range": ["Переопределить временной интервал"], + "Overwrite": ["Перезаписать"], + "Overwrite & Explore": ["Перезаписать и исследовать"], + "Overwrite Dashboard [%s]": ["Перезаписать дашборд [%s]"], + "Overwrite Duplicate Columns": ["Перезаписать повторяющиеся столбцы"], + "Overwrite existing": ["Перезаписать существующий"], + "Overwrite text in the editor with a query on this table": [ + "Вставить этот запрос в редактор SQL" + ], + "Owner": ["Владелец"], + "Owners": ["Владельцы"], + "Owners are invalid": ["Неверный список владельцев"], + "Owners is a list of users who can alter the dashboard.": [ + "Владельцы – это список пользователей, которые могут изменять дашборд." + ], + "Owners is a list of users who can alter the dashboard. Searchable by name or username.": [ + "Владельцы – это список пользователей, которые могут изменять дашборд. Можно искать по имени или никнейму." + ], + "Page length": ["Размер страницы"], + "Paired t-test Table": ["Таблица парного t-теста"], + "Pandas resample method": [ + "Метод ресемплирования данных библиотеки Pandas" + ], + "Pandas resample rule": [ + "Правило ресемплирования данных библиотеки Pandas" + ], + "Parallel Coordinates": [""], + "Parameter error": ["Ошибка параметра"], + "Parameters": ["Параметры"], + "Parameters ": ["Параметры "], + "Parameters related to the view and perspective on the map": [""], + "Parent": ["Родитель"], + "Parse Dates": ["Парсинг дат"], + "Part of a Whole": ["Покомпонентное сравнение"], + "Partition Limit": ["Количество разбиений"], + "Partition Threshold": [""], + "Partitions whose height to parent height proportions are below this value are pruned": [ + "" + ], + "Password": ["Пароль"], + "Paste Private Key here": [""], + "Paste the shareable Google Sheet URL here": [""], + "Pattern": ["Паттерн"], + "Percent Change": ["Процентное изменение"], + "Percentage": ["Процентная доля"], + "Percentage change": ["Процентное изменение"], + "Percentage metrics": ["Процентные меры"], + "Percentage threshold": ["Процентный порог"], + "Percentages": ["Проценты"], + "Performance": ["Производительность"], + "Period average": ["Среднее за период"], + "Periods": ["Периоды"], + "Periods must be a whole number": ["Периоды должны быть целым числом"], + "Person or group that has certified this chart.": [ + "Лицо или группа, которые утвердили этот график" + ], + "Person or group that has certified this dashboard.": [ + "Лицо или группа, которые утвердили этот дашборд" + ], + "Person or group that has certified this metric": [ + "Лицо или группа, которые утвердили этот показатель" + ], + "Physical": ["Физический"], + "Physical (table or view)": ["Физический (таблица или представление)"], + "Physical dataset": ["Физический датасет"], + "Pick a dimension from which categorical colors are defined": [ + "Выберите измерение, на основе которого определяются категориальные цвета" + ], + "Pick a granularity in the Time section or uncheck 'Include Time'": [ + "Выберите степень детализации в разделе Время или снимите флажок \"Включить время\"." + ], + "Pick a metric for left axis!": ["Выберите меру для левой оси"], + "Pick a metric for right axis!": ["Выберите меру для правой оси"], + "Pick a metric for x, y and size": ["Выберите меру для x, y и размера"], + "Pick a metric to display": ["Выберите меру для отображения"], + "Pick a metric!": ["Выберите меру!"], + "Pick a name to help you identify this database.": [ + "Выберите имя для базы данных." + ], + "Pick a nickname for how the database will display in Superset.": [ + "Выберите имя для базы данных, которое будет отображаться в Суперсете." + ], + "Pick a set of deck.gl charts to layer on top of one another": [""], + "Pick a time granularity for your time series": [ + "Выберите временную детализацию для вашего временного ряда" + ], + "Pick a title for you annotation.": [ + "Выберите название для вашей аннотации" + ], + "Pick at least one field for [Series]": [""], + "Pick at least one metric": ["Выберите хотя бы одну меру"], + "Pick exactly 2 columns as [Source / Target]": [""], + "Pick one or more columns that should be shown in the annotation. If you don't select a column all of them will be shown.": [ + "Выберите один или несколько столбцов, которые должны отображаться в аннотации. Если вы не выберите столбец, все столбцы будут отображены." + ], + "Pick your favorite markup language": [ + "Выберите свой любимый язык разметки" + ], + "Pie Chart": ["Круговая диаграмма"], + "Pie shape": ["Форма круговой диаграммы"], + "Pin": ["Закрепить"], + "Pivot Options": ["Параметры сводной таблицы"], + "Pivot Table": ["Сводная таблица"], + "Pivot Table (legacy)": ["Сводная таблица (устарело)"], + "Pivot operation must include at least one aggregate": [""], + "Pivot operation requires at least one index": [""], + "Pivoted": ["Сводные данные"], + "Pixel height of each series": ["Высота каждого ряда (в пикселях)"], + "Pixels": ["Пиксели"], + "Plain": ["Отобразить все"], + "Please DO NOT overwrite the \"filter_scopes\" key.": [""], + "Please apply filter changes": [ + "Пожалуйста, примените изменения фильтров" + ], + "Please check your query and confirm that all template parameters are surround by double braces, for example, \"{{ ds }}\". Then, try running your query again.": [ + "Пожалуйста, проверьте ваш запрос и подтвердите, что все параметры шаблона заключены в двойные фигурные скобки, например, \"{{ from_dttm }}\". Затем попробуйте повторно выполнить запрос." + ], + "Please check your query for syntax errors at or near \"%(syntax_error)s\". Then, try running your query again.": [ + "Пожалуйста, проверьте ваш запрос на синтаксические ошибки возле символа \"%(syntax_error)s\". Затем выполните запрос заново." + ], + "Please check your query for syntax errors near \"%(server_error)s\". Then, try running your query again.": [ + "Пожалуйста, проверьте ваш запрос на наличие синтаксических ошибок рядом с \"%(server_error)s\". Затем выполните запрос заново" + ], + "Please check your template parameters for syntax errors and make sure they match across your SQL query and Set Parameters. Then, try running your query again.": [ + "Пожалуйста, проверьте параметры вашего шаблона на наличие синтаксических ошибок и убедитесь, что они совпадают с вашим SQL-запросом и заданными параметрами. Затем попробуйте выполнить свой запрос еще раз." + ], + "Please choose at least one 'Group by' field": [ + "Выберите хотя бы одно поле \"Группировать по\"" + ], + "Please choose at least one metric": ["Выберите хотя бы одну меру"], + "Please choose different metrics on left and right axis": [ + "Выберите разные меры для левой и правой осей" + ], + "Please confirm": ["Пожалуйста, подтвердите действие"], + "Please confirm the overwrite values.": [""], + "Please enter a SQLAlchemy URI to test": [ + "Введите SQLAlchemy URI для тестирования" + ], + "Please filter set name": ["Введите имя набора фильтров"], + "Please re-enter the password.": ["Пожалуйста, введите пароль еще раз"], + "Please re-export your file and try importing again": [""], + "Please reach out to the Chart Owner for assistance.": [ + "Пожалуйста, обратитесь к создателю графика за помощью.", + "Пожалуйста, обратитесь к создателям графика за помощью.", + "Пожалуйста, обратитесь к создателям графика за помощью." + ], + "Please save the query to enable sharing": [ + "Пожалуйста, сохраните запрос, чтобы включить функцию \"поделиться\"" + ], + "Please save your chart first, then try creating a new email report.": [ + "Пожалуйста, сначала сохраните график перед тем, как создавать новую рассылку." + ], + "Please save your dashboard first, then try creating a new email report.": [ + "Пожалуйста, сначала сохраните дашборд перед тем, как создавать новую рассылку." + ], + "Please select both a Dataset and a Chart type to proceed": [ + "Пожалуйста, для продолжения выберите и датасет, и тип графика" + ], + "Please use 3 different metric labels": [""], + "Plot the distance (like flight paths) between origin and destination.": [ + "" + ], + "Plots the individual metrics for each row in the data vertically and links them together as a line. This chart is useful for comparing multiple metrics across all of the samples or rows in the data.": [ + "" + ], + "Plugins": ["Плагины"], + "Point Color": ["Цвет маркера"], + "Point Radius": ["Радиус маркера"], + "Point Radius Scale": ["Шкала радиуса маркера"], + "Point Radius Unit": ["Единица измерения радиуса маркера"], + "Point Size": ["Размер маркера"], + "Point Unit": ["Единица измерения маркера"], + "Point to your spatial columns": ["Указание на столбцы с расположением"], + "Points": ["Маркеры"], + "Points and clusters will update as the viewport is being changed": [ + "Точки и кластеры будут обновляться по мере изменения области просмотра" + ], + "Polygon Settings": ["Настройки полигона"], + "Popular": ["Популярно"], + "Populate \"Default value\" to enable this control": [""], + "Population age data": [""], + "Port": ["Порт"], + "Port %(port)s on hostname \"%(hostname)s\" refused the connection.": [ + "Порт %(port)s хоста \"%(hostname)s\" отказал в подключении." + ], + "Position of child node label on tree": [ + "Расположение метки дочерней вершины на дереве" + ], + "Position of column level subtotal": [ + "Расположение промежуточного итога на уровне столбца" + ], + "Position of intermidiate node label on tree": [""], + "Position of row level subtotal": [ + "Расположение промежуточного итога на уровне строки" + ], + "Powered by Apache Superset": ["На базе Apache Superset"], + "Pre-filter": ["Предварительная фильтрация"], + "Pre-filter available values": [ + "Предварительно выбрать доступные значения для фильтра" + ], + "Pre-filter is required": ["Предварительная фильтрация обязательна"], + "Predicate applied when fetching distinct value to populate the filter control component. Supports jinja template syntax. Applies only when `Enable Filter Select` is on.": [ + "" + ], + "Predictive": ["Прогноз"], + "Predictive Analytics": ["Предиктивная аналитика"], + "Prefix metric name with slice name": [""], + "Preview": ["Предпросмотр"], + "Preview: `%s`": ["Предпросмотр «%s»"], + "Previous": ["Предыдущий"], + "Previous Line": ["Предыдущая строка"], + "Primary": ["Первичная"], + "Primary Metric": ["Основная мера"], + "Primary key": ["Первичный ключ"], + "Primary or secondary y-axis": ["Первичная или вторичная ось Y"], + "Primary y-axis format": ["Формат первичной оси Y"], + "Private Key": ["Приватный ключ"], + "Private Key & Password": ["Приватный ключ и пароль"], + "Private Key Password": ["Пароль приватного ключа"], + "Proceed": ["Продолжить"], + "Profile": ["Профиль"], + "Profile picture provided by Gravatar": [ + "Изображение профиля, сгенерированное сервисом Gravatar" + ], + "Progress": ["Прогресс"], + "Progressive": ["Постепенный"], + "Propagate": [""], + "Proportional": ["Пропорция"], + "Public and privately shared sheets": [""], + "Publicly shared sheets only": [""], + "Published": ["Опубликовано"], + "Purple": ["Фиолетовый"], + "Put labels outside": ["Вынести метки наружу"], + "Put the labels outside of the pie?": [ + "Вынести метки за пределы диаграммы" + ], + "Put the labels outside the pie?": ["Вынести метки за пределы диаграммы"], + "Put your code here": [ + "Введите произвольный текст в формате html или markdown" + ], + "Python datetime string pattern": ["Шаблон строки даты и времени Python"], + "QUERY DATA IN SQL LAB": [""], + "Quarter": ["Квартал"], + "Quarters %s": ["Кварталов %s"], + "Query": ["Запрос"], + "Query %s: %s": ["Запрос %s: %s"], + "Query A": ["Запрос А"], + "Query B": ["Запрос Б"], + "Query History": ["История запросов"], + "Query does not exist": ["Запрос не существует"], + "Query history": ["История запросов"], + "Query imported": ["Запрос импортирован"], + "Query in a new tab": ["Запрос в отдельной вкладке"], + "Query is too complex and takes too long to run.": [ + "Запрос слишком тяжелый для выполнения и займет много времени." + ], + "Query mode": ["Режим запроса"], + "Query name": ["Имя запроса"], + "Query preview": ["Предпросмотр запроса"], + "Query was stopped": ["Запрос прерван"], + "Query was stopped.": ["Запрос прерван"], + "RANGE TYPE": ["ТИП ИНТЕРВАЛА"], + "RGB Color": ["Цвет RGB"], + "Radar": ["Радар"], + "Radar Chart": ["Диаграмма радар"], + "Radar render type, whether to display 'circle' shape.": [""], + "Radius in kilometers": ["Радиус в километрах"], + "Radius in meters": ["Радиус в метрах"], + "Radius in miles": ["Радиус в милях"], + "Ran %s": ["Запущен %s"], + "Range": ["Интервал"], + "Range filter": ["Диапазон"], + "Range filter plugin using AntD": [""], + "Range labels": ["Метки диапазона"], + "Ranges": ["Диапазоны"], + "Ranges to highlight with shading": [ + "Диапазоны для выделения с помощью затенения" + ], + "Ranking": ["Ранжирование"], + "Ratio": ["Отношение"], + "Raw records": ["Сырые записи"], + "Rebuild": [""], + "Recent activity": ["Последние действия"], + "Recently created charts, dashboards, and saved queries will appear here": [ + "Недавно созданные графики, дашборды и сохраненные запросы" + ], + "Recently edited charts, dashboards, and saved queries will appear here": [ + "Недавно измененные графики, дашборды и сохраненные запросы" + ], + "Recently modified": ["Измененные недавно"], + "Recently viewed charts, dashboards, and saved queries will appear here": [ + "Недавно просмотренные графики, дашборды и сохраненные запросы" + ], + "Recents": ["Недавние"], + "Recipients are separated by \",\" or \";\"": [ + "Получатели, разделенные \",\" или \";\"" + ], + "Recommended tags": ["Рекомендованные теги"], + "Record Count": ["Кол-во записей"], + "Rectangle": ["Прямоугольник"], + "Redirects to this endpoint when clicking on the table from the table list": [ + "" + ], + "Redo the action": ["Повторить действие"], + "Reduce X ticks": ["Уменьшить кол-во делений оси X"], + "Reduces the number of X-axis ticks to be rendered. If true, the x-axis will not overflow and labels may be missing. If false, a minimum width will be applied to columns and the width may overflow into an horizontal scroll.": [ + "Уменьшает количество отрисованных делений на оси X. Если флажок установлен, некоторые метки могут быть не отображены. " + ], + "Refer to the": ["Обратитесь к"], + "Referenced columns not available in DataFrame.": [""], + "Refetch results": ["Выполнить запрос повторно"], + "Refresh": ["Обновить"], + "Refresh dashboard": ["Обновить дашборд"], + "Refresh frequency": ["Частота обновления"], + "Refresh interval": ["Интервал обновления"], + "Refresh interval saved": ["Интервал обновления сохранен"], + "Refresh table list": ["Обновить список таблиц"], + "Refresh tables": ["Обновить таблицы"], + "Refresh the default values": ["Обновить значения по умолчанию"], + "Refreshing charts": ["Обновление графиков"], + "Refreshing columns": ["Обновление столбцов"], + "Relational": ["Относительный"], + "Relationships between community channels": [""], + "Relative Date/Time": ["Относительная дата/время"], + "Relative period": ["Относительный период"], + "Relative quantity": ["Относительное количество"], + "Reload": ["Обновить"], + "Remind me in 24 hours": ["Напомните мне через 24 часа"], + "Remove": ["Удалить"], + "Remove invalid filters": ["Удалить недействующие фильтры"], + "Remove item": ["Удалить элемент"], + "Remove query from log": ["Удалить запрос из истории"], + "Remove table preview": ["Убрать предпросмотр таблицы"], + "Removed columns: %s": ["Удалённые столбцы: %s"], + "Rename tab": ["Переименовать вкладку"], + "Rendering": ["Отрисовка"], + "Replace": ["Заменить"], + "Report": ["Отчет"], + "Report Name": ["Имя отчета"], + "Report Schedule could not be created.": [ + "Невозможно удалить расписание отчета." + ], + "Report Schedule could not be deleted.": [ + "Невозможно удалить расписание отчета." + ], + "Report Schedule could not be updated.": [ + "Невозможно обновить расписание отчета" + ], + "Report Schedule delete failed.": [ + "Ошибка при удалении расписания отчета." + ], + "Report Schedule execution failed when generating a csv.": [ + "Возникла ошибка при создании csv для отправки отчета" + ], + "Report Schedule execution failed when generating a dataframe.": [ + "Возникла ошибка при создании датафрейма для отправки отчета" + ], + "Report Schedule execution failed when generating a screenshot.": [ + "Возникла ошибка при создании скриншота для отправки отчета" + ], + "Report Schedule execution got an unexpected error.": [ + "Возникла неожиданная ошибка при отправке отчета" + ], + "Report Schedule is still working, refusing to re-compute.": [ + "Планировщик отчетов все еще работает, не имея возможности отправить отчет" + ], + "Report Schedule log prune failed.": [""], + "Report Schedule not found.": ["Расписание отчета не найдено"], + "Report Schedule parameters are invalid.": [ + "Параметры расписания отчета неверны." + ], + "Report Schedule reached a working timeout.": [ + "Достигнут таймаут для отчета" + ], + "Report Schedule state not found": [ + "Состояние расписания отчета не найдено" + ], + "Report a bug": ["Сообщить об ошибке"], + "Report failed": ["Рассылка не удалась"], + "Report name": ["Имя отчета"], + "Report schedule": ["Расписание отчета"], + "Report schedule client error": [ + "Возникла ошибка расписания отчета на стороне клиента" + ], + "Report schedule system error": [ + "Возникла ошибка расписания отчета на стороне системы" + ], + "Report schedule unexpected error": [ + "Неожиданная ошибка расписания отчета" + ], + "Report sending": ["Отчет выполняется"], + "Report sent": ["Отчет отправлен"], + "Report updated": ["Отчет обновлен"], + "Reports": ["Отчеты"], + "Repulsion": ["Отталкивание"], + "Repulsion strength between nodes": ["Сила отталкивания вершин"], + "Request Permissions": [""], + "Request is incorrect: %(error)s": ["Неверный запрос: %(error)s"], + "Request is not JSON": ["Запрос не является JSON"], + "Request missing data field.": ["В запросе отсутствует поле с данными."], + "Request timed out": ["Вышло время запроса"], + "Required": ["Обязательно"], + "Required control values have been removed": [ + "Обязательные значения были удалены" + ], + "Resample": ["Ресемплирование (изменение частоты данных)"], + "Resample method should in ": [""], + "Resample operation requires DatetimeIndex": [ + "Для ресемплирования требуется индекс формата дата/время" + ], + "Reset": ["Сбросить"], + "Reset state": ["Сбросить текущее состояние"], + "Resource already has an attached report.": [ + "Для этого компонента уже создан отчет." + ], + "Resource was not found.": ["Источник не был найден."], + "Restore Filter": ["Восстановить фильтр"], + "Results": ["Результаты"], + "Results %s": ["Результаты %s"], + "Results backend is not configured.": ["Results backend не нестроен"], + "Results backend needed for asynchronous queries is not configured.": [ + "Сервер, необходимый для асинхронных запросов, не настроен." + ], + "Return to specific datetime.": [""], + "Reverse Lat & Long": ["Поменять местами широту и долготу"], + "Reverse lat/long ": ["Поменять местами широту и долготу"], + "Rich Tooltip": ["Расширенная всплывающая подсказка"], + "Rich tooltip": ["Расширенная всплывающая подсказка"], + "Right": ["Справа"], + "Right Axis Format": ["Формат правой оси"], + "Right Axis Metric": ["Мера для правой оси"], + "Right Axis chart(s)": ["График(и) по правой оси"], + "Right axis metric": ["Мера для правой оси"], + "Right to Left": ["Справа налево"], + "Right value": ["Правое значение"], + "Right-click on a dimension value to drill to detail by that value.": [ + "" + ], + "Role": ["Роль"], + "Role %(r)s was extended to provide the access to the datasource %(ds)s": [ + "Роль %(r)s была расширена для предоставления доступа к источнику данных %(ds)s" + ], + "Roles": ["Роли"], + "Roles is a list which defines access to the dashboard. Granting a role access to a dashboard will bypass dataset level checks. If no roles are defined, then the dashboard is available to all roles.": [ + "Список ролей, определяющий доступ к дашборду. Предоставляя доступ определенной роли, пользователь сможет обойти ограничения своей роли. Если роли не указаны, дашборд доступен всем ролям." + ], + "Roles to grant": ["Роли для предоставления"], + "Rolling Function": ["Скользящая средняя"], + "Rolling Window": ["Скользящее окно"], + "Rolling function": ["Скользящая средняя"], + "Rolling window": ["Скользящее окно"], + "Root certificate": ["Корневой сертификат"], + "Root node id": [""], + "Rotate axis label": ["Повернуть метки осей"], + "Rotate x axis label": ["Повернуть метку оси X"], + "Rotation to apply to words in the cloud": [ + "Вращение для применения к словам в облаке" + ], + "Round cap": ["Закругление на концах"], + "Row": ["Строка"], + "Row Level Security": ["Безопасность на уровне строк"], + "Row containing the headers to use as column names (0 is first line of data). Leave empty if there is no header row": [ + "Строка, содержащая заголовки для использования в качестве имен столбцов (0, если первая строка в данных). Оставьте пустым, если заголовки отсутствуют" + ], + "Row containing the headers to use as column names (0 is first line of data). Leave empty if there is no header row.": [ + "Строка, содержащая заголовки для использования в качестве имен столбцов (0, если первая строка в данных). Оставьте пустым, если заголовки отсутствуют." + ], + "Row limit": ["Лимит строк"], + "Rows": ["Строки"], + "Rows per page, 0 means no pagination": [ + "Строчек на странице, 0 означает все строки" + ], + "Rows subtotal position": ["Расположение строк подытогов"], + "Rows to Read": ["Строки для чтения"], + "Rule": ["Правило"], + "Run": ["Выполнить"], + "Run a query to display query history": [ + "Выполните запрос для отображения истории" + ], + "Run a query to display results": [ + "Выполните запрос для отображения результатов" + ], + "Run in SQL Lab": ["Открыть в SQL редакторе"], + "Run query": ["Выполнить запрос"], + "Run query (Ctrl + Return)": ["Выполнить запрос (Ctrl + Enter)"], + "Run query in a new tab": ["Выполнить запрос на новой вкладке"], + "Run selection": ["Выполнить выбранное"], + "Running": ["Выполняется"], + "Running statement %(statement_num)s out of %(statement_count)s": [""], + "SAT": ["СБ"], + "SEP": ["СЕН"], + "SHA": [""], + "SQL": ["SQL"], + "SQL Copied!": ["SQL запрос скопирован!"], + "SQL Expression": ["SQL выражение"], + "SQL Lab": ["Лаборатория SQL"], + "SQL Lab View": [""], + "SQL Lab uses your browser's local storage to store queries and results.\nCurrently, you are using %(currentUsage)s KB out of %(maxStorage)d KB storage space.\nTo keep SQL Lab from crashing, please delete some query tabs.\nYou can re-access these queries by using the Save feature before you delete the tab.\nNote that you will need to close other SQL Lab windows before you do this.": [ + "SQL Lab использует локальное хранилище вашего браузера для хранения запросов и результатов.\nВ настоящее время вы используете %(currentUsage)s КБ из %(maxStorage)d КБ дискового пространства.\n Чтобы предотвратить сбой Лаборатории SQL, пожалуйста, удалите некоторые вкладки запросов.\n Вы можете повторно получить доступ к этим запросам, используя функцию сохранения перед удалением вкладки.\n Обратите внимание, что перед этим вам нужно будет закрыть другие окна Лаборатории SQL." + ], + "SQL Query": ["SQL запрос"], + "SQL expression": ["Выражение SQL"], + "SQL query": ["SQL запрос"], + "SQLAlchemy URI": ["SQLAlchemy URI"], + "SSH Host": [""], + "SSH Password": ["Пароль SSH"], + "SSH Port": ["SSH порт"], + "SSH Tunnel configuration parameters": [ + "Параметры конфигурации SSH туннеля" + ], + "SSH Tunnel could not be deleted.": ["Не удалось удалить SSH туннель."], + "SSH Tunnel could not be updated.": ["Не удалось обновить SSH туннель."], + "SSH Tunnel not found.": ["SSH туннель не найден."], + "SSH Tunnel parameters are invalid.": [ + "Параметры SSH туннеля недопустимы." + ], + "SSH Tunneling is not enabled": [""], + "SSL Mode \"require\" will be used.": [ + "Будет использовано шифрование SSL" + ], + "START (INCLUSIVE)": ["НАЧАЛО (ВКЛЮЧИТЕЛЬНО)"], + "STEP %(stepCurr)s OF %(stepLast)s": ["ШАГ %(stepCurr)s ИЗ %(stepLast)s"], + "STRING": ["Строчный (STRING/VARCHAR)"], + "SUN": ["ВС"], + "Sample Standard Deviation": ["Стандартное отклонение"], + "Sample Variance": ["Дисперсия"], + "Samples": ["Примеры данных"], + "Samples for dataset could not be retrieved.": [ + "Не удалось получить примеры записей датасета." + ], + "Samples for datasource could not be retrieved.": [ + "Не удалось получить примеры записей для источника данных." + ], + "Sankey": ["Санкей"], + "Sankey Diagram": ["Диаграмма Санкей"], + "Sankey Diagram with Loops": [""], + "Satellite": ["Спутник"], + "Satellite Streets": ["Гибридный режим"], + "Saturday": ["Суббота"], + "Save": ["Сохранить"], + "Save & Explore": ["Сохранить и исследовать"], + "Save & go to dashboard": ["Сохранить и перейти к дашборду"], + "Save & go to new dashboard": ["Сохранить и перейти к дашборду"], + "Save (Overwrite)": ["Сохранить (Перезаписать)"], + "Save as": ["Сохранить как"], + "Save as Dataset": ["Сохранить как датасет"], + "Save as dataset": ["Сохранить как датасет"], + "Save as new": ["Сохранить как новый"], + "Save as new chart": ["Сохранить как новый график"], + "Save as...": ["Сохранить как..."], + "Save as:": ["Сохранить как:"], + "Save changes": ["Сохранить изменения"], + "Save chart": ["Сохранить график"], + "Save dashboard": ["Сохранить дашборд"], + "Save dataset": ["Сохранить датасет"], + "Save for this session": ["Сохранить на время текущей сессии"], + "Save or Overwrite Dataset": ["Сохранить или перезаписать датасет"], + "Save query": ["Сохранить запрос"], + "Save the query to enable this feature": [ + "Сохраните запрос для включения этой опции" + ], + "Save this query as a virtual dataset to continue exploring": [ + "Сохраните данный запрос как виртуальный датасет для создания графика" + ], + "Save to new dashboard": ["Сохранить в новый дашборд"], + "Saved": ["Сохранено"], + "Saved Queries": ["Сохраненные запросы"], + "Saved expressions": ["Сохраненные выражения"], + "Saved metric": ["Сохраненная мера"], + "Saved queries": ["Сохраненные запросы"], + "Saved queries could not be deleted.": [ + "Не удалось удалить сохраненные запросы." + ], + "Saved query not found.": ["Сохраненный запрос не найден."], + "Saved query parameters are invalid.": [ + "Сохраненные параметры запроса недопустимы." + ], + "Scale and Move": ["Масштабирование и перемещение"], + "Scale only": ["Только масштабирование"], + "Scatter": ["Точечный"], + "Scatter Plot": ["Точечная диаграмма"], + "Scatter Plot has the horizontal axis in linear units, and the points are connected in order. It shows a statistical relationship between two variables.": [ + "" + ], + "Schedule": ["Расписание"], + "Schedule a new email report": ["Запланировать новую рассылку по почте"], + "Schedule email report": ["Запланировать рассылку по почте"], + "Schedule query": ["Сохранить запрос"], + "Schedule settings": ["Настройки расписания"], + "Schedule the query periodically": [ + "Запланировать периодическое выполнение запроса" + ], + "Scheduled": ["Запланировано"], + "Scheduled at (UTC)": ["Запланировано на (часовой пояс UTC)"], + "Scheduled task executor not found": [ + "Исполнитель регулярных отчетов не найден" + ], + "Schema": ["Схема"], + "Schema cache timeout": ["Время жизни кэша схемы"], + "Schema undefined": ["Схема не определена"], + "Schema, as used only in some databases like Postgres, Redshift and DB2": [ + "" + ], + "Schemas allowed for File upload": [ + "Схемы, в которые разрешена загрузка файлов" + ], + "Scope": ["Область"], + "Scoping": ["Область применения"], + "Scroll": ["Прокрутка"], + "Scroll down to the bottom to enable overwriting changes. ": [""], + "Search": ["Поиск"], + "Search / Filter": ["Поиск / Фильтр"], + "Search Metrics & Columns": ["Поиск по мерам и столбцам"], + "Search all charts": ["Поиск по всем графикам"], + "Search all filter options": ["Поиск по всем фильтрам"], + "Search box": ["Строка поиска"], + "Search by query text": ["Поиск по тексту запроса"], + "Search...": ["Поиск..."], + "Second": ["Секунда"], + "Secondary": ["Вторичная"], + "Secondary Metric": ["Вторичная мера"], + "Secondary y-axis format": ["Формат вторичной оси Y"], + "Secondary y-axis title": ["Название вторичной оси Y"], + "Seconds %s": ["Секунд %s"], + "Secure Extra": ["Доп. безопасность"], + "Secure extra": ["Безопасность"], + "Security": ["Безопасность"], + "Security & Access": ["Безопасность и Доступ"], + "See all %(tableName)s": ["Список %(tableName)s"], + "See less": ["Скрыть подробности"], + "See more": ["Подробнее"], + "See query details": ["Показать детали запроса"], + "See table schema": ["Таблица"], + "Select": ["Выбрать"], + "Select ...": ["Выбрать ..."], + "Select Delivery Method": ["Выберите способ оповещения"], + "Select Viz Type": ["Выберите тип визуализации"], + "Select a Columnar file to be uploaded to a database.": [ + "Выберите файл столбчатого формата, который будет загружен в базу данных." + ], + "Select a Excel file to be uploaded to a database.": [ + "Выберите Excel файл для загрузки в базу данных" + ], + "Select a column": ["Выберите столбец"], + "Select a dashboard": ["Выбрать дашборд"], + "Select a database table and create dataset": [ + "Выберите базу данных и создайте датасет" + ], + "Select a database table.": ["Выберите таблицу в базе данных."], + "Select a database to connect": ["Выберите базу данных для подключения"], + "Select a database to upload the file to": [ + "Выберите базу данных для загрузки файла" + ], + "Select a database to write a query": [ + "Выберите базу данных для написания запроса" + ], + "Select a dimension": ["Выберете измерение"], + "Select a file to be uploaded to the database": [ + "Выберите файл для загрузки в базу данных." + ], + "Select a schema if the database supports this": [ + "Укажите схему, если она поддерживается базой данных" + ], + "Select a visualization type": ["Выберите тип визуализации"], + "Select aggregate options": ["Выберите настройки агрегации"], + "Select all data": ["Выбрать все данные"], + "Select all items": ["Выбрать все записи"], + "Select any columns for metadata inspection": [""], + "Select charts": ["Выберите графики"], + "Select color scheme": ["Выберите цветовую схему"], + "Select column": ["Выберите столбец"], + "Select current page": ["Выбрать текущую страницу"], + "Select database & schema": ["Выберите базу данных и схему"], + "Select database or type database name": [ + "Выберите базу данных или введите ее имя" + ], + "Select database table": ["Выберите таблицу из базы данных"], + "Select databases require additional fields to be completed in the Advanced tab to successfully connect the database. Learn what requirements your databases has ": [ + "Некоторые базы данных требуют ручной настройки во вкладке Продвинутая настройка для успешного подключения. Вы можете ознакомиться с требованиями к вашей базе данных " + ], + "Select dataset source": ["Выберите источник датасета"], + "Select file": ["Выбрать файл"], + "Select filter": ["Селектор"], + "Select filter plugin using AntD": [""], + "Select first filter value by default": [ + "Сделать первое значение фильтра значением по умолчанию" + ], + "Select operator": ["Выбрать оператор"], + "Select or type a value": ["Выберите значение"], + "Select or type dataset name": ["Выберите/введите имя датасета"], + "Select owners": ["Выбрать владельцев"], + "Select saved metrics": ["Выберите сохраненные меры"], + "Select schema or type schema name": [ + "Выберите схему или введите ее имя" + ], + "Select scheme": ["Выберите схему"], + "Select start and end date": ["Выберите дату начала"], + "Select subject": [""], + "Select table or type table name": [ + "Выберите таблицу или введите ее имя" + ], + "Select the Annotation Layer you would like to use.": [ + "Выбрать слой аннотации, который вы хотите использовать." + ], + "Select the geojson column": ["Выберите geojson столбец"], + "Select the number of bins for the histogram": [ + "Выберите количество столбцов для гистограммы" + ], + "Select the numeric columns to draw the histogram": [ + "Выберите числовые столбцы для отрисовки гистограммы" + ], + "Select values in highlighted field(s) in the control panel. Then run the query by clicking on the %s button.": [ + "Выберите значения в обязательных полях на панели управления. Затем запустите запрос, нажав на кнопку %s." + ], + "Send as CSV": ["Отправить в формате CSV"], + "Send as PNG": ["Отправить в формате PNG"], + "Send as text": ["Отправить текстом"], + "Send range filter events to other charts": [""], + "September": ["Сентябрь"], + "Sequential": ["Последовательность"], + "Series": ["Ряд"], + "Series Height": ["Высота рядов"], + "Series Limit Sort By": ["Сортировка категорий по"], + "Series Style": ["Стиль категорий"], + "Series chart type (line, bar etc)": [""], + "Series limit": ["Лимит кол-ва категорий"], + "Server Page Length": ["Серверный размер страницы"], + "Server pagination": ["Серверная пагинация"], + "Service Account": ["Сервисный аккаунт"], + "Set auto-refresh interval": ["Задать интервал обновления"], + "Set filter mapping": ["Установить действие фильтра"], + "Set up an email report": ["Запланировать рассылку по почте"], + "Sets the hierarchy levels of the chart. Each level is\n represented by one ring with the innermost circle as the top of the hierarchy.": [ + "" + ], + "Settings": ["Настройки"], + "Settings for time series": ["Настройки временных рядов"], + "Share": ["Поделиться"], + "Share chart by email": ["Поделиться графиком по email"], + "Share permalink by email": ["Поделиться ссылкой по email"], + "Shared query": ["Общедоступный запрос"], + "Shared query fields": ["Поля общедоступного запроса"], + "Sheet Name": ["Имя листа"], + "Shift + Click to sort by multiple columns": [ + "Shift + Нажать для сортировки по нескольким столбцам" + ], + "Short description must be unique for this layer": [ + "Содержимое аннотации должно быть уникальным внутри слоя" + ], + "Should daily seasonality be applied. An integer value will specify Fourier order of seasonality.": [ + "Применяется дневная сезонность. Целочисленное значение будет указывать порядок сезонности Фурье." + ], + "Should weekly seasonality be applied. An integer value will specify Fourier order of seasonality.": [ + "Применяется недельная сезонность. Целочисленное значение будет указывать порядок сезонности Фурье." + ], + "Should yearly seasonality be applied. An integer value will specify Fourier order of seasonality.": [ + "Применяется годовая сезонность. Целочисленное значение будет указывать порядок сезонности Фурье." + ], + "Show Bubbles": ["Показать пузыри"], + "Show CREATE VIEW statement": ["Показать выражение CREATE VIEW"], + "Show CSS Template": ["Показать CSS шаблон"], + "Show Chart": ["Показать график"], + "Show Column": ["Показать столбец"], + "Show Dashboard": ["Показать дашборд"], + "Show Database": ["Показать базу данных"], + "Show Labels": ["Показывать метки"], + "Show Less...": ["Показать меньше..."], + "Show Log": ["Показать запись"], + "Show Markers": ["Показать маркеры"], + "Show Metric": ["Показатель меру"], + "Show Metric Names": ["Показать имена мер"], + "Show Range Filter": ["Показать фильтр Диапазон"], + "Show Saved Query": ["Показать сохраненный запрос"], + "Show Table": ["Показать таблицу"], + "Show Timestamp": ["Показать метку времени"], + "Show Total": ["Показать общий итог"], + "Show Trend Line": ["Показать трендовую линию"], + "Show Upper Labels": ["Показать верхние метки"], + "Show Value": ["Показать значение"], + "Show Values": ["Показать значения"], + "Show Y-axis": ["Показать ось Y"], + "Show Y-axis on the sparkline. Will display the manually set min/max if set or min/max values in the data otherwise.": [ + "Показывать ось Y на спарклайне." + ], + "Show all columns": ["Показать все столбцы"], + "Show all...": ["Показать все..."], + "Show axis line ticks": ["Показывать деления на оси"], + "Show cell bars": ["Наложить гистограммы на ячейки"], + "Show chart description": ["Показать описание графика"], + "Show columns total": ["Показать общий итог по столбцам"], + "Show data points as circle markers on the lines": [""], + "Show empty columns": ["Показывать пустые столбцы"], + "Show hierarchical relationships of data, with with the value represented by area, showing proportion and contribution to the whole.": [ + "Показывает иерархические взаимосвязи данных со значением, представленным областью, показывая пропорцию и вклад в целое." + ], + "Show info tooltip": ["Показать информационную подсказку"], + "Show label": ["Показывать метку"], + "Show labels when the node has children.": [ + "Показывать метки, когда у вершины есть дочерние элементы." + ], + "Show legend": ["Показывать легенду"], + "Show less columns": ["Показать меньше столбцов"], + "Show less...": ["Показать меньше..."], + "Show password.": ["Показать пароль."], + "Show percentage": ["Показывать долю"], + "Show pointer": ["Показывать указатель"], + "Show progress": ["Показывать прогресс"], + "Show rows total": ["Показать общий итог по строкам"], + "Show series values on the chart": [ + "Показать значения категорий на графике" + ], + "Show split lines": ["Показывать разделительные линии"], + "Show the value on top of the bar": [ + "Показать значение в верхней части столбца" + ], + "Show time column": ["Показать столбец времени"], + "Show total aggregations of selected metrics. Note that row limit does not apply to the result.": [ + "Показать общие итоговые значения выбранных показателей. Обратите внимание, что ограничение количества строк не применяется к результату." + ], + "Show totals": ["Показывать общий итог"], + "Showcases a single metric front-and-center. Big number is best used to call attention to a KPI or the one thing you want your audience to focus on.": [ + "Отображает один показатель по центру. Карточку лучше всего использовать, чтобы привлечь внимание к KPI." + ], + "Showcases a single number accompanied by a simple line chart, to call attention to an important metric along with its change over time or other dimension.": [ + "Отображает один показатель, сопровождаемый простой линейной диаграммой, чтобы привлечь внимание к KPI наряду с его изменением с течением времени или другим измерением." + ], + "Showcases how a metric changes as the funnel progresses. This classic chart is useful for visualizing drop-off between stages in a pipeline or lifecycle.": [ + "Отображает изменение показателя по мере сужения воронки. Эта классическая диаграмма полезна для визуализации перехода между этапами процесса или жизненного цикла." + ], + "Showcases the flow or link between categories using thickness of chords. The value and corresponding thickness can be different for each side.": [ + "" + ], + "Showcases the progress of a single metric against a given target. The higher the fill, the closer the metric is to the target.": [ + "Демонстрирует прогресс одного показателя по отношению к заданной цели. Чем больше заполнение, тем ближе показатель к целевому показателю." + ], + "Showing %s of %s": ["Отображено %s из %s"], + "Shows a list of all series available at that point in time": [ + "Показывает список всех данных, доступных в определенный момент времени" + ], + "Shows or hides markers for the time series": [ + "Показывает или скрывает маркеры для временных рядов" + ], + "Shows the composition of a dataset by segmenting a given rectangle as smaller rectangles with areas proportional to their value or contribution to the whole. Those rectangles may also, in turn, be further segmented hierarchically.": [ + "" + ], + "Significance Level": [""], + "Simple": ["Столбец"], + "Simple ad-hoc metrics are not enabled for this dataset": [""], + "Single": ["Один"], + "Single Metric": ["Одна мера"], + "Single Value": ["Единственное значение"], + "Single value": ["Единственное значение"], + "Single value type": ["Тип единственного значения"], + "Size of edge symbols": [""], + "Size of marker. Also applies to forecast observations.": [ + "Размер маркера. Также применяется к прогнозным значениям." + ], + "Sizes of vehicles": [""], + "Skip Blank Lines": ["Пропуск пустых строк"], + "Skip Initial Space": ["Пропуск начального пробела"], + "Skip Rows": ["Пропуск строк"], + "Skip blank lines rather than interpreting them as Not A Number values": [ + "Пропускать пустые строки, вместо их перевода в пустые строки (NaN)" + ], + "Skip spaces after delimiter": ["Пропускать пробелы после разделителя"], + "Slug": ["Читаемый URL"], + "Small": ["Маленький"], + "Small number format": ["Форматирование маленьких чисел"], + "Smooth Line": ["Гладкая линия"], + "Smooth-line is a variation of the line chart. Without angles and hard edges, Smooth-line sometimes looks smarter and more professional.": [ + "" + ], + "Solid": ["Сплошной"], + "Some roles do not exist": ["Некоторые роли не существуют"], + "Something went wrong.": [""], + "Sorry there was an error fetching database information: %s": [ + "К сожалению, произошла ошибка при получении информации о базе данных: %s" + ], + "Sorry there was an error fetching saved charts: ": [ + "Извините, произошла ошибка при загрузке графиков: " + ], + "Sorry, An error occurred": ["Извините, произошла ошибка"], + "Sorry, an error occurred": ["Извините, произошла ошибка"], + "Sorry, an unknown error occurred": [ + "Извините, произошла неизвестная ошибка" + ], + "Sorry, an unknown error occurred.": [ + "Извините, произошла неизвестная ошибка." + ], + "Sorry, something went wrong. Embedding could not be deactivated.": [ + "Извините, что-то пошло не так. Встраивание не может быть деактивировано." + ], + "Sorry, something went wrong. Try again later.": [ + "Извините, что-то пошло не так. Попробуйте еще раз позже." + ], + "Sorry, there appears to be no data": [ + "Извините, похоже, что данные отсутствуют" + ], + "Sorry, there was an error saving this dashboard: %s": [ + "Извините, произошла ошибка при сохранении дашборда: %s" + ], + "Sorry, your browser does not support copying.": [ + "Извините, Ваш браузер не поддерживание копирование. Используйте сочетание клавиш [CTRL + C] для WIN или [CMD + C] для MAC." + ], + "Sorry, your browser does not support copying. Use Ctrl / Cmd + C!": [ + "Извините, Ваш браузер не поддерживание копирование. Используйте сочетание клавиш [CTRL + C] для WIN или [CMD + C] для MAC!" + ], + "Sort": ["Сортировка"], + "Sort Bars": ["Сортировать столбцы"], + "Sort Descending": ["Сортировать по убыванию"], + "Sort Metric": ["Мера для сортировки"], + "Sort X Axis": ["Сортировка оси X"], + "Sort Y Axis": ["Сортировка оси Y"], + "Sort ascending": ["Сортировать по возрастанию"], + "Sort bars by x labels.": ["Сортировать столбцы по меткам на оси X"], + "Sort by": ["Сортировка"], + "Sort by %s": ["Сорт. по %s"], + "Sort by metric": ["Сортировка по мере"], + "Sort columns alphabetically": [ + "Отсортировать столбцы в алфавитном порядке" + ], + "Sort columns by": ["Сортировать столбцы по"], + "Sort descending": ["Сортировка по убыванию"], + "Sort filter values": ["Сортировать отфильтрованные значения"], + "Sort metric": ["Показатель для сортировки"], + "Sort rows by": ["Сортировка строк по"], + "Sort type": ["Тип сортировки"], + "Source": ["Источник"], + "Source / Target": ["Источник / Цель"], + "Source SQL": ["Исходный SQL"], + "Source category": ["Исходная категория"], + "Sparkline": ["Спарклайн"], + "Spatial": [""], + "Specific Date/Time": ["Конкретная дата/время"], + "Specify a schema (if database flavor supports this).": [ + "Укажите схему (если она поддерживается базой данных)." + ], + "Specify duplicate columns as \"X.0, X.1\".": [ + "Обозначить повторяющиеся столбцы как \"X.0, X.1\"." + ], + "Specify name to CREATE TABLE AS schema in: public": [ + "Укажите имя новой таблицы для CREATE TABLE AS" + ], + "Specify name to CREATE VIEW AS schema in: public": [ + "Укажите имя нового представления для CREATE VIEW AS" + ], + "Specify the database version. This should be used with Presto in order to enable query cost estimation.": [ + "Укажите версию базы данных. Это необходимо для Presto, чтобы включить оценку стоимости запроса" + ], + "Split number": ["Количество разделителей"], + "Square kilometers": ["Квадратные километры"], + "Square meters": ["Квадратные метры"], + "Square miles": ["Квадратные мили"], + "Stack": [""], + "Stack Trace:": [""], + "Stack series": ["Использовать накопление"], + "Stack series on top of each other": [ + "Совместить столбцы в один с накоплением" + ], + "Stacked": ["С наполнением"], + "Stacked Bars": ["Столбцы с накоплением"], + "Stacked Style": [""], + "Stacked style": [""], + "Standard time series": [""], + "Start": ["Начало"], + "Start (Longitude, Latitude): ": ["Старт (Долгота, Широта): "], + "Start Longitude & Latitude": ["Начальные долгота и широта"], + "Start angle": ["Начальный угол"], + "Start at (UTC)": ["Время начала (UTC)"], + "Start date included in time range": [ + "Начальная дата включена во временной интервал" + ], + "Start y-axis at 0": ["Начать ось Y с 0"], + "Start y-axis at zero. Uncheck to start y-axis at minimum value in the data.": [ + "Начать ось Y в нуле. Снимите флаг, чтобы ось Y начиналась на минимальном значении данных" + ], + "State": ["Состояние"], + "Statement %(statement_num)s out of %(statement_count)s": [""], + "Statistical": ["Статистический учет"], + "Status": ["Статус"], + "Step - end": [""], + "Step - middle": [""], + "Step - start": [""], + "Stepped-line graph (also called step chart) is a variation of line chart but with the line forming a series of steps between data points. A step chart can be useful when you want to show the changes that occur at irregular intervals.": [ + "" + ], + "Stop": ["Стоп"], + "Stop query": ["Остановить запрос"], + "Stop running (Ctrl + e)": ["Остановить выполнение (CTRL + X)"], + "Stop running (Ctrl + x)": ["Остановить выполнение (CTRL + X)"], + "Stopped an unsafe database connection": [""], + "Streets": ["Схема"], + "Strength to pull the graph toward center": [ + "Сила притяжения вершин к центру" + ], + "Stretched style": [""], + "Strings used for sheet names (default is the first sheet).": [ + "Имя листа (по умолчанию первый лист)" + ], + "Stroke Color": ["Цвет обводки"], + "Stroke Width": ["Ширина обводки"], + "Stroked": ["С обводкой"], + "Structural": ["Структура"], + "Style": ["Стиль"], + "Style the ends of the progress bar with a round cap": [ + "Оформление концов индикатора круглыми заглушками" + ], + "Subdomain": ["Подблок"], + "Subheader": ["Подзаголовок"], + "Subheader Font Size": ["Размер шрифта подзаголовка"], + "Submit": ["Отправить"], + "Subtotal": ["Подытог"], + "Success": ["Успешно"], + "Successfully changed dataset!": [""], + "Suffix to apply after the percentage display": [ + "Текст после отображения процентной доли" + ], + "Sum": ["Сумма"], + "Sum as Fraction of Columns": ["Сумма как доля столбцов"], + "Sum as Fraction of Rows": ["Сумма как доля строк"], + "Sum as Fraction of Total": ["Сумма как доля целого"], + "Sum of values over specified period": [ + "Сумма значений за обозначенный период" + ], + "Sum values": ["Суммарные значения"], + "Sunburst": ["Диаграмма Солнечные лучи"], + "Sunburst Chart": ["Диаграмма Солнечные лучи"], + "Sunday": ["Воскресенье"], + "Superset Chart": ["График Superset"], + "Superset Embedded SDK documentation.": [""], + "Superset chart": ["График Superset"], + "Superset dashboard": ["Дашборд Superset"], + "Superset encountered an error while running a command.": [ + "Суперсет столкнулся с ошибкой во время выполнения команды." + ], + "Superset encountered an unexpected error.": [ + "Суперсет столкнулся с неожиданной ошибкой." + ], + "Supported databases": ["Поддерживаемые базы данных"], + "Survey Responses": [""], + "Swap Groups and Columns": ["Поменять местами группы и столбцы"], + "Swap dataset": ["Сменить датасет"], + "Swap rows and columns": ["Поменять местами строки и столбцы"], + "Swiss army knife for visualizing data. Choose between step, line, scatter, and bar charts. This viz type has many customization options as well.": [ + "" + ], + "Swiss army knife for visualizing time series data. Choose between step, line, scatter, and bar charts. This viz type has many customization options as well.": [ + "" + ], + "Symbol": [""], + "Symbol of two ends of edge line": [""], + "Sync columns from source": ["Синхронизировать столбцы из источника"], + "Syntax": [""], + "TABLES": ["ТАБЛИЦЫ"], + "THU": ["ЧТ"], + "TUE": ["ВТ"], + "Tab name": ["Имя вкладки"], + "Tab title": ["Имя вкладки"], + "Table": ["Таблица"], + "Table %(table)s wasn't found in the database %(db)s": [""], + "Table Exists": ["Таблица существует"], + "Table Name": ["Имя таблицы"], + "Table [%(table_name)s] could not be found, please double check your database connection, schema, and table name": [ + "Не удается найти таблицу \"%(table_name)s\", пожалуйста, проверьте ваше соединение с базой данных, схему и имя таблицы" + ], + "Table [%{table}s] could not be found, please double check your database connection, schema, and table name, error: {}": [ + "Не удается найти таблицу \"%(table)s\", пожалуйста, проверьте ваше соединение с базой данных, схему и имя таблицы, ошибка: {}" + ], + "Table cache timeout": ["Время жизни кэша таблицы"], + "Table columns": ["Столбцы таблицы"], + "Table name cannot contain a schema": [ + "Имя таблицы не может содержать схему" + ], + "Table name undefined": ["Имя таблицы не определено"], + "Table that visualizes paired t-tests, which are used to understand statistical differences between groups.": [ + "Таблица, визуализирующая парные t-тесты, которые используются для нахождения статистических различий между группами." + ], + "Tables": ["Таблицы"], + "Tabs": ["Вкладки"], + "Tabular": ["Таблицы"], + "Tags": ["Теги"], + "Take your data points, and group them into \"bins\" to see where the densest areas of information lie": [ + "" + ], + "Target": ["Цель"], + "Target Color": ["Целевой цвет"], + "Target aspect ratio for treemap tiles.": [""], + "Target category": ["Целевая категория"], + "Target value": ["Целевое значение"], + "Template Name": ["Имя шаблона"], + "Template parameters": ["Параметры шаблона"], + "Templated link, it's possible to include {{ metric }} or other values coming from the controls.": [ + "Шаблонная ссылка, можно включить {{ metric }} или другие значения, поступающие из элементов управления." + ], + "Terminate running queries when browser window closed or navigated to another page. Available for Presto, Hive, MySQL, Postgres and Snowflake databases.": [ + "Завершать выполнение запросов после закрытия браузерной вкладки или пользователь переключился на другую вкладку. Доступно для баз данных Presto, Hive, MySQL, Postgres и Snowflake." + ], + "Test Connection": ["Тестовое соединение"], + "Test connection": ["Тестовое соединение"], + "Text": ["Текст"], + "Text align": ["Выравнивание текста"], + "Text embedded in email": ["Текст, включенный в email"], + "The CSS for individual dashboards can be altered here, or in the dashboard view where changes are immediately visible": [ + "" + ], + "The CTAS (create table as select) doesn't have a SELECT statement at the end. Please make sure your query has a SELECT as its last statement. Then, try running your query again.": [ + "CTAS (CREATE TABLE AS SELECT) не содержит SELECT запрос в конце. Пожалуйста, убедитесь, что ваш запрос имеет SELECT запрос в конце. Затем попробуйте повторно выполнить запрос." + ], + "The GeoJsonLayer takes in GeoJSON formatted data and renders it as interactive polygons, lines and points (circles, icons and/or texts).": [ + "Диаграмма принимает данные в формате GeoJSON и отображает их в виде интерактивных полигонов, линий и точек (кругов, значков и/или текста)." + ], + "The URL is missing the dataset_id or slice_id parameters.": [""], + "The X-axis is not on the filters list": [""], + "The X-axis is not on the filters list which will prevent it from being used in\n time range filters in dashboards. Would you like to add it to the filters list?": [ + "" + ], + "The access requests seem to have been deleted": [""], + "The annotation has been saved": ["Аннотация сохранена"], + "The annotation has been updated": ["Аннотация обновлена"], + "The category of source nodes used to assign colors. If a node is associated with more than one category, only the first will be used.": [ + "Категория исходных вершин предназначена для задания цветов. Если вершина связана более, чем с одной категорией, только первая будет использована." + ], + "The chart datasource does not exist": [ + "Источник данных графика не существует" + ], + "The chart does not exist": ["График не существует"], + "The classic. Great for showing how much of a company each investor gets, what demographics follow your blog, or what portion of the budget goes to the military industrial complex.\n\n Pie charts can be difficult to interpret precisely. If clarity of relative proportion is important, consider using a bar or other chart type instead.": [ + "Классическая круговая/кольцевая диаграмма." + ], + "The color for points and clusters in RGB": [ + "Цвет для маркеров и кластеров в RGB" + ], + "The color scheme for rendering chart": [ + "Цветовая схема, применяемая для раскрашивания графика" + ], + "The color scheme is determined by the related dashboard.\n Edit the color scheme in the dashboard properties.": [ + "Цветовая схема определена соответствующим дашбордом.\n Измените цветовую схему в свойствах дашборда." + ], + "The column header label": ["Заголовок столбца"], + "The column was deleted or renamed in the database.": [ + "Столбец был удален или переименован в базе данных." + ], + "The country code standard that Superset should expect to find in the [country] column": [ + "Код страны, который Суперсет ожидает найти в столбце со страной" + ], + "The dashboard has been saved": ["Дашборд сохранен"], + "The data source seems to have been deleted": [ + "Источник данных, похоже, был удален" + ], + "The data type that was inferred by the database. It may be necessary to input a type manually for expression-defined columns in some cases. In most case users should not need to alter this.": [ + "" + ], + "The database %s is linked to %s charts that appear on %s dashboards and users have %s SQL Lab tabs using this database open. Are you sure you want to continue? Deleting the database will break those objects.": [ + "База данных %s привязана к %s графику(-ам), который(-ые) используется(-ются) в %s дашборде(-ах), и пользователи имеют %s открытую(-ых) вкладку(-ок) в Лаборатории SQL. Вы уверены, что хотите продолжить? Удаление базы данных приведёт к неработоспособности этих компонентов." + ], + "The database columns that contains lines information": [""], + "The database is currently running too many queries.": [ + "В настоящий момент база данных обрабатывает слишком много запросов." + ], + "The database is under an unusual load.": [ + "Нетипично высокая загрузка базы данных" + ], + "The database referenced in this query was not found. Please contact an administrator for further assistance or try again.": [ + "База данных, указанная в этом запросе, не найдена. Пожалуйста, обратитесь к своему администратору или попробуйте еще раз." + ], + "The database returned an unexpected error.": [ + "База данных вернула неожиданную ошибку" + ], + "The database was deleted.": ["База данных была удалена"], + "The database was not found.": ["Не удалось найти базу данных"], + "The dataset %s is linked to %s charts that appear on %s dashboards. Are you sure you want to continue? Deleting the dataset will break those objects.": [ + "Датасет %s привязан к %s графику(-ам), который(-ые) используется(-ются) в %s дашборде(-ах). Вы уверены, что хотите продолжить? Удаление датасета приведёт к неработоспособности этих объектов." + ], + "The dataset associated with this chart no longer exists": [ + "Датасет, связанный с этим графиком, больше не существует" + ], + "The dataset configuration exposed here\n affects all the charts using this dataset.\n Be mindful that changing settings\n here may affect other charts\n in undesirable ways.": [ + "Представленная здесь конфигурация датасета\n влияет на все графики, использующие этот датасет.\n Помните, что изменение настроек\n может иметь неожиданный эффект\n на другие графики." + ], + "The dataset has been saved": ["Датасет сохранен"], + "The dataset linked to this chart may have been deleted.": [ + "Датасет, связанный с этим графиком, похоже, был удален." + ], + "The datasource couldn't be loaded": [ + "Невозможно загрузить источник данных" + ], + "The datasource is too large to query.": [ + "Источник данных слишком велик для запроса." + ], + "The description can be displayed as widget headers in the dashboard view. Supports markdown.": [ + "Описание может быть отображено как заголовок графика в дашборде. Поддерживает markdown-разметку" + ], + "The distance between cells, in pixels": [ + "Расстояние между ячейками (в пикселях)" + ], + "The duration of time in seconds before the cache is invalidated": [ + "Количество секунд до истечения срока действия кэша" + ], + "The engine_params object gets unpacked into the sqlalchemy.create_engine call.": [ + "Объект engine_params вызывает sqlalchemy.create_engine" + ], + "The following entries in `series_columns` are missing in `columns`: %(columns)s. ": [ + "" + ], + "The function to use when aggregating points into groups": [""], + "The host \"%(hostname)s\" might be down and can't be reached.": [ + "Хост \"%(hostname)s\" возможно, отключен, и с ним невозможно связаться" + ], + "The host \"%(hostname)s\" might be down, and can't be reached on port %(port)s.": [ + "Хост \"%(hostname)s\" возможно, отключен, и с ним невозможно связаться по порту %(port)s." + ], + "The host might be down, and can't be reached on the provided port.": [ + "Хост возможно, отключен, и с ним невозможно связаться по заданному порту." + ], + "The hostname \"%(hostname)s\" cannot be resolved.": [ + "Не удалось обнаружить хост \"%(hostname)s\"" + ], + "The hostname provided can't be resolved.": [ + "Не удалось обнаружить хост." + ], + "The id of the active chart": ["Идентификатор активного графика"], + "The list of charts associated with this table. By altering this datasource, you may change how these associated charts behave. Also note that charts need to point to a datasource, so this form will fail at saving if removing charts from a datasource. If you want to change the datasource for a chart, overwrite the chart from the 'explore view'": [ + "" + ], + "The maximum number of events to return, equivalent to the number of rows": [ + "Максимальное количество возвращаемых событий, эквивалентно количеству строк" + ], + "The maximum number of subdivisions of each group; lower values are pruned first": [ + "" + ], + "The maximum value of metrics. It is an optional configuration": [ + "Максимальное значение мер. Это необязательная настройка" + ], + "The metadata_params in Extra field is not configured correctly. The key %(key)s is invalid.": [ + "" + ], + "The metadata_params in Extra field is not configured correctly. The key %{key}s is invalid.": [ + "" + ], + "The metadata_params object gets unpacked into the sqlalchemy.MetaData call.": [ + "Объект metadata_params вызывает sqlalchemy.MetaData" + ], + "The minimum number of rolling periods required to show a value. For instance if you do a cumulative sum on 7 days you may want your \"Min Period\" to be 7, so that all data points shown are the total of 7 periods. This will hide the \"ramp up\" taking place over the first 7 periods": [ + "Минимальное количество скользящих периодов, необходимое для отображения значения. Например, если вы делаете накопительную сумму за 7 дней, вы можете указать, чтобы \"Минимальный период\" был равен 7, так что все показанные точки данных представляют собой общее количество 7 периодов." + ], + "The number color \"steps\"": ["Количество цветов в цветовой схеме"], + "The number of hours, negative or positive, to shift the time column. This can be used to move UTC time to local time.": [ + "Количество часов, отрицательное или положительное, для сдвига столбца формата дата/время. Это может быть использовано для приведения часового пояса UTC к местному времени." + ], + "The number of results displayed is limited to %(rows)d by the configuration DISPLAY_MAX_ROWS. Please add additional limits/filters or download to csv to see more rows up to the %(limit)d limit.": [ + "Количество отображаемых результатов ограничено %(rows)d переменной DISPLAY_MAX_ROWS. Пожалуйста, добавьте дополнительные ограничения/фильтры или загрузите в csv, чтобы увидеть больше строк до предела %(limit)d." + ], + "The number of results displayed is limited to %(rows)d. Please add additional limits/filters, download to csv, or contact an admin to see more rows up to the %(limit)d limit.": [ + "Количество отображаемых результатов ограничено %(rows)d. Пожалуйста, добавьте дополнительные ограничения/фильтры или загрузите в csv, чтобы увидеть больше строк до предела %(limit)d.\"" + ], + "The number of rows displayed is limited to %(rows)d by the limit dropdown.": [ + "Количество отображаемых строк ограничено: не более %(rows)d." + ], + "The number of rows displayed is limited to %(rows)d by the query": [ + "Количество отображаемых строк ограничено: не более %(rows)d." + ], + "The number of rows displayed is limited to %(rows)d by the query and limit dropdown.": [ + "Количество отображаемых строк ограничено: не более %(rows)d." + ], + "The number of seconds before expiring the cache": [ + "Количество секунд до истечения срока действия кэша" + ], + "The object does not exist in the given database.": [ + "Объект не существует в этой базе данных." + ], + "The parameter %(parameters)s in your query is undefined.": [ + "Параметр %(parameters)s в вашем запросе неопределен.", + "Следующие параметры неопределены в вашем запросе: %(parameters)s", + "Следующие параметры неопределены в вашем запросе: %(parameters)s" + ], + "The password provided for username \"%(username)s\" is incorrect.": [ + "Неверный пароль для пользователя \"%(username)s\"." + ], + "The password provided when connecting to a database is not valid.": [ + "Неверный пароль для базы данных." + ], + "The passwords for the databases below are needed in order to import them together with the charts. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "Для баз данных нужны пароли, чтобы импортировать их вместе с графиками. Пожалуйста, обратите внимание, что разделы \"Безопасность\" и \"Утверждение\" в настройках конфигурации базы данных отсутствуют в экспортируемых файлов и должны быть добавлены вручную после импорта, если необходимо." + ], + "The passwords for the databases below are needed in order to import them together with the dashboards. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "Для баз данных нужны пароли, чтобы импортировать их вместе с дашбордами. Пожалуйста, обратите внимание, что разделы \"Безопасность\" и \"Утверждение\" в настройках конфигурации базы данных отсутствуют в экспортируемых файлах и должны быть добавлены вручную после импорта, если необходимо." + ], + "The passwords for the databases below are needed in order to import them together with the datasets. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "Пароли к базам данных требуются, чтобы импортировать их вместе с датасетами. Пожалуйста, обратите внимание, что разделы \"Безопасность\" и \"Утверждение\" конфигурации базы данных отсутствуют в экспортируемых файлах и должны быть добавлены после импорта вручную, если необходимо." + ], + "The passwords for the databases below are needed in order to import them together with the saved queries. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "Для баз данных нужны пароли, чтобы импортировать их вместе с сохраненными запросами. Пожалуйста, обратите внимание, что разделы \"Безопасность\" и \"Утверждение\" в настройках конфигурации базы данных отсутствуют в экспортируемых файлах и должны быть добавлены вручную после импорта, если необходимо." + ], + "The passwords for the databases below are needed in order to import them. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in explore files and should be added manually after the import if they are needed.": [ + "Пароли к базам данных требуются, чтобы импортировать их. Пожалуйста, обратите внимание, что разделы \"Безопасность\" и \"Утверждение\" в настройках конфигурации базы данных отсутствуют в импортируемых файлах и должны быть добавлены вручную после импорта, если необходимо." + ], + "The pattern of timestamp format. For strings use ": [ + "Шаблон формата отметки времени (таймштампа). Для строк используйте " + ], + "The periodicity over which to pivot time. Users can provide\n \"Pandas\" offset alias.\n Click on the info bubble for more details on accepted \"freq\" expressions.": [ + "Периодичность для группировки по времени. Пользователи могут задавать собственную частоту. Для этого нажмите на иконку с информацией." + ], + "The pixel radius": ["Радиус ячейки (в пикселях)"], + "The pointer to a physical table (or view). Keep in mind that the chart is associated to this Superset logical table, and this logical table points the physical table referenced here.": [ + "Указатель на физическую таблицу (или представление). Следует помнить, что график связан с логической таблицей Superset, а эта логическая таблица указывает на физическую таблицу, указанную здесь." + ], + "The port is closed.": ["Порт закрыт."], + "The port number is invalid.": ["Недействительный порт."], + "The primary metric is used to define the arc segment sizes": [ + "Основная мера используется для определения размера сегмента дуги" + ], + "The provided `rows` argument is not a valid integer.": [""], + "The query associated with the results was deleted.": [ + "Запрос, связанный с результатами, был удален." + ], + "The query associated with these results could not be found. You need to re-run the original query.": [ + "" + ], + "The query contains one or more malformed template parameters.": [""], + "The query couldn't be loaded": ["Запрос невозможно загрузить"], + "The query has a syntax error.": ["Запрос имеет синтаксическую ошибку."], + "The query returned no data": ["Запрос не вернул данных"], + "The query was killed after %(sqllab_timeout)s seconds. It might be too complex, or the database might be under heavy load.": [ + "Запрос был прерван после %(sqllab_timeout)s секунд. Он мог быть слишком сложным, или база данных находилась под большой нагрузкой." + ], + "The radius (in pixels) the algorithm uses to define a cluster. Choose 0 to turn off clustering, but beware that a large number of points (>1000) will cause lag.": [ + "" + ], + "The radius of individual points (ones that are not in a cluster). Either a numerical column or `Auto`, which scales the point based on the largest cluster": [ + "Радиус маркеров (не находящихся в кластере). Выберите числовой столбец или `Автоматически`, который отмасштабирует маркеры по наибольшему маркеру." + ], + "The report has been created": ["Рассылка создана"], + "The results backend no longer has the data from the query.": [ + "Сервер не сохранил данные из этого запроса." + ], + "The results stored in the backend were stored in a different format, and no longer can be deserialized.": [ + "Данные, сохраненные на сервере, имели другой формат, и не могут быть распознаны." + ], + "The rich tooltip shows a list of all series for that point in time": [ + "Расширенная всплывающая подсказка показывает список всех категорий для этой точки." + ], + "The schema \"%(schema)s\" does not exist. A valid schema must be used to run this query.": [ + "" + ], + "The schema \"%(schema_name)s\" does not exist. A valid schema must be used to run this query.": [ + "" + ], + "The schema was deleted or renamed in the database.": [ + "Схема была удалена или переименована в базе данных." + ], + "The size of the square cell, in pixels": [ + "Размер квадратной ячейки (в пикселях)" + ], + "The submitted URL is not considered safe, only use URLs with the same domain as Superset.": [ + "" + ], + "The submitted payload has the incorrect format.": [ + "Загруженные данные имеют некорректный формат." + ], + "The submitted payload has the incorrect schema.": [ + "Загруженные данные имеют некорректную схему." + ], + "The table \"%(table)s\" does not exist. A valid table must be used to run this query.": [ + "Таблица \"%(table)s\" не существует. Для выполнения запроса должна использоваться существующая таблица" + ], + "The table \"%(table_name)s\" does not exist. A valid table must be used to run this query.": [ + "Таблица \"%(table_name)s\" не существует. Для выполнения запроса должна использоваться существующая таблица" + ], + "The table was created. As part of this two-phase configuration process, you should now click the edit button by the new table to configure it.": [ + "" + ], + "The table was deleted or renamed in the database.": [ + "Таблица была удалена или переименована в базе данных." + ], + "The time column for the visualization. Note that you can define arbitrary expression that return a DATETIME column in the table. Also note that the filter below is applied against this column or expression": [ + "Столбец данных формата дата/время. Вы можете определить произвольное выражение, которое будет возвращать столбец даты/времени в таблице. Фильтр ниже будет применён к этому столбцу или выражению" + ], + "The time granularity for the visualization. Note that you can type and use simple natural language as in `10 seconds`, `1 day` or `56 weeks`": [ + "Интервал времени, в границах которого строится график. Обратите внимание, что для определения диапазона времени, вы можете использовать естественный язык. Например, можно указать словосочетания - «10 seconds», «1 day» или «56 weeks»" + ], + "The time granularity for the visualization. Note that you can type and use simple natural language as in `10 seconds`,`1 day` or `56 weeks`": [ + "Интервал времени, в границах которого строится график. Обратите внимание, что для определения диапазона времени, вы можете использовать естественный язык. Например, можно указать словосочетания - «10 seconds», «1 day» или «56 weeks»" + ], + "The time granularity for the visualization. This applies a date transformation to alter your time column and defines a new time granularity. The options here are defined on a per database engine basis in the Superset source code.": [ + "Детализация времени для визуализации. Применяется преобразование столбца с датой/временем и определяется новая детализация (минута, день, год, и т.п.). Доступные варианты заданы в исходном коде Superset для каждого типа драйвера базы данных." + ], + "The time range for the visualization. All relative times, e.g. \"Last month\", \"Last 7 days\", \"now\", etc. are evaluated on the server using the server's local time (sans timezone). All tooltips and placeholder times are expressed in UTC (sans timezone). The timestamps are then evaluated by the database using the engine's local timezone. Note one can explicitly set the timezone per the ISO 8601 format if specifying either the start and/or end time.": [ + "Временной интервал для визуализации. Относительно время, например, \"Последний месяц\", \"Последние 7 дней\" и т.д. рассчитываются на сервере, используя локальное время сервера. Обратите внимание, что вы можете самостоятельно задать часовой пояс по формату ISO 8601 при пользовательской настройке, задав время начала и/или конца." + ], + "The time unit for each block. Should be a smaller unit than domain_granularity. Should be larger or equal to Time Grain": [ + "Единица времени для каждого подблока. Должна быть меньшей единицей, чем единица времени блока. Должно быть больше или равно единице времени" + ], + "The time unit used for the grouping of blocks": [ + "Единица времени для группировки блоков" + ], + "The type of visualization to display": [ + "Выберите необходимый тип визуализации" + ], + "The unit of measure for the specified point radius": [ + "Единица измерения для указанного радиуса маркера" + ], + "The user seems to have been deleted": [ + "Пользователь, похоже, был удален" + ], + "The username \"%(username)s\" does not exist.": [ + "Пользователь \"%(username)s\" не существует." + ], + "The username provided when connecting to a database is not valid.": [ + "Имя пользователя, указанное при подключении к базе данных, недействительно" + ], + "The way the ticks are laid out on the X-axis": [ + "Способ расположения делений по оси X" + ], + "The width of the lines": ["Ширина линий"], + "There are associated alerts or reports": [ + "Есть связанные оповещения или отчеты" + ], + "There are associated alerts or reports: %s,": [ + "Есть связанные оповещения или отчеты: %s" + ], + "There are no charts added to this dashboard": [ + "В этот дашборд еще не добавлен ни один график." + ], + "There are no components added to this tab": [ + "В этой вкладке нет компонентов" + ], + "There are no databases available": ["Нет доступных баз данных"], + "There are no filters in this dashboard.": [ + "В этом дашборде нет фильтров." + ], + "There are unsaved changes.": ["У вас есть несохраненные изменения."], + "There is a syntax error in the SQL query. Perhaps there was a misspelling or a typo.": [ + "В SQL-запросе имеется синтаксическая ошибка. Возможно, это орфографическая ошибка или опечатка." + ], + "There is no chart definition associated with this component, could it have been deleted?": [ + "С этим компонентом не связан ни один график, возможно, он был удален." + ], + "There is not enough space for this component. Try decreasing its width, or increasing the destination width.": [ + "Недостаточно пространства для этого компонента. Попробуйте уменьшить ширину или увеличить целевую ширину." + ], + "There was an error fetching the favorite status: %s": [ + "Произошла ошибка при получении статуса избранного: %s" + ], + "There was an error fetching your recent activity:": [ + "Произошла ошибка при получении вашей недавней активности:" + ], + "There was an error loading the dataset metadata": [ + "Возникла ошибка при загрузке метаданных датасета" + ], + "There was an error loading the schemas": [ + "Возникла ошибка при загрузке схем" + ], + "There was an error loading the tables": [ + "Возникла ошибка при загрузке таблиц" + ], + "There was an error saving the favorite status: %s": [ + "Произошла ошибка при сохранении статуса избранного: %s" + ], + "There was an error with your request": [ + "Произошла ошибка с вашим запросом" + ], + "There was an issue deleting %s: %s": [ + "Произошла ошибка при удалении %s: %s" + ], + "There was an issue deleting the selected %s: %s": [ + "Произошла ошибка при удалении выбранных %s: %s" + ], + "There was an issue deleting the selected annotations: %s": [ + "Произошла ошибка при удалении выбранных аннотаций: %s" + ], + "There was an issue deleting the selected charts: %s": [ + "Произошла ошибка при удалении выбранных графиков: %s" + ], + "There was an issue deleting the selected dashboards: ": [ + "Произошла ошибка при удалении выбранных дашбордов: " + ], + "There was an issue deleting the selected datasets: %s": [ + "Произошла ошибка при удалении выбранных датасетов: %s" + ], + "There was an issue deleting the selected layers: %s": [ + "Произошла ошибка при удалении выбранных слоёв: %s" + ], + "There was an issue deleting the selected queries: %s": [ + "Произошла ошибка при удалении выбранных запросов: %s" + ], + "There was an issue deleting the selected templates: %s": [ + "Произошла ошибка при удалении выбранных шаблонов: %s" + ], + "There was an issue deleting: %s": ["Произошла ошибка при удалении: %s"], + "There was an issue duplicating the dataset.": [ + "Произошла ошибка при дублировании датасета." + ], + "There was an issue duplicating the selected datasets: %s": [ + "Произошла ошибка при дублировании выбранных датасетов: %s" + ], + "There was an issue favoriting this dashboard.": [ + "Произошла ошибка при добавлении этого дашборда в избранное." ], - "Select ...": ["Выбрать …"], - "Loaded data cached": ["Данные были загружены в кэш"], - "Loaded from cache": ["Загружается из кэша"], - "Click to force-refresh": ["Нажмите для принудительного обновления"], - "cached": [""], - "Certified by %s": ["Сертифицирован: %s"], - "Copy to clipboard": ["Скопировать в буфер обмена"], - "Copied!": ["Скопировано!"], - "Sorry, your browser does not support copying. Use Ctrl / Cmd + C!": [ - "Извините, Ваш браузер не поддерживание копирование. Используйте сочетание клавиш [CTRL + C] для WIN или [CMD + C] для MAC!" + "There was an issue fetching reports attached to this dashboard.": [ + "Произошла ошибка с получением рассылок, связанных с этим дашбордом." ], - "Error while fetching schema list": ["Ошибка при получении списка схем"], - "Error while fetching database list": [ - "Ошибка при получении списка баз данных" - ], - "Database:": ["База данных:"], - "Select a database": ["Выберите базу данных"], - "Force refresh schema list": ["Принудительное обновление данных"], - "Select a schema (%s)": ["Выберите схему (%s)"], - "Schema:": ["Схема:"], - "datasource": ["источник данных"], - "schema": ["схема"], - "delete": ["удалить"], - "Type \"%s\" to confirm": ["Введите “%s” для подтверждения"], - "DELETE": ["DELETE"], - "Click to edit": ["Нажмите для редактирования"], - "You don't have the rights to alter this title.": [ - "Недостаточно прав для изменения заголовка." + "There was an issue fetching the favorite status of this dashboard.": [ + "Произошла ошибка с получением статуса избранного для этого дашборда." ], - "Unexpected error": ["Неожиданная ошибка"], - "Click to favorite/unfavorite": ["Отметить как избранное"], - "An error occurred while fetching dashboards": [ - "Произошла ошибка при создании источника данных" + "There was an issue fetching your chart: %s": [ + "Произошла ошибка при получении вашего графика: %s" ], - "Error while fetching table list": ["Ошибка при получении списка таблиц"], - "Select table or type table name": [""], - "Type to search ...": ["Введите для поиска…"], - "Select table ": ["Выберите таблицу "], - "Force refresh table list": ["Принудительное обновление данных"], - "See table schema": ["Выберите схему (%s)"], - "%s%s": [""], - "Share dashboard": ["Поделиться"], - "This may be triggered by:": ["Триггеры:"], - "Please reach out to the Chart Owner for assistance.": [ - "Пожалуйста, обратитесь к создателю графика за дополнительной информацией." + "There was an issue fetching your dashboards: %s": [ + "Произошла ошибка при получении вашего дашборда: %s" ], - "Chart Owner: %s": ["Параметры графика: %s"], - "%s Error": ["%s Ошибка"], - "See more": ["Подробности"], - "See less": ["Скрыть подробности"], - "Copy message": ["Предупреждающее сообщение"], - "Close": ["Закрыть"], - "This was triggered by:": ["Причина срабатывания:"], - "Did you mean:": [""], - "%(suggestion)s instead of \"%(undefinedParameter)s?\"": [""], - "Parameter error": ["Параметры"], - "We’re having trouble loading this visualization. Queries are set to timeout after %s second.": [ - "Возникла проблема при загрузке этой визуализации. Для запросов установлен тайм-аут %s секунд." + "There was an issue fetching your recent activity: %s": [ + "Произошла ошибка при получении вашей последней активности: %s" ], - "We’re having trouble loading these results. Queries are set to timeout after %s second.": [ - "Возникла проблема при загрузке результатов. Для запросов установлен тайм-аут %s секунд." + "There was an issue fetching your saved queries: %s": [ + "Произошла ошибка при получении ваших сохраненных запросов: %s" ], - "Timeout error": ["Тайм-аут"], - "Cell content": ["Созданный контент"], - "The import was successful": ["Неудачно"], - "OVERWRITE": ["OVERWRITE"], - "Overwrite": ["Перезаписать"], - "Import": ["Импорт"], - "Import %s": ["Импорт %s"], - "Last Updated %s": [""], - "%s Selected": ["%s Выбрано"], - "Deselect all": ["Выберите базу данных"], - "%s-%s of %s": [""], - "Settings": ["Настройки"], - "About": [""], - "SQL query": ["SQL-запрос"], - "There is not enough space for this component. Try decreasing its width, or increasing the destination width.": [ - "Недостаточно пространства для этого компонента. Попробуйте уменьшить ширину или увеличить целевую ширину." + "There was an issue previewing the selected query %s": [ + "Произошла ошибка при предпросмотре выбранного запроса %s" ], - "Can not move top level tab into nested tabs": [ - "Невозможно перенести вкладку верхнего уровня во вложенную вкладку" + "There was an issue previewing the selected query. %s": [ + "Произошла ошибка при предпросмотре выбранного запроса: %s" ], - "This chart has been moved to a different filter scope.": [ - "Этот график был перемещён в другой набор фильтров." + "There's a loop in your Sankey, please provide a tree. Here's a faulty link: {}": [ + "" ], - "There was an issue fetching the favorite status of this dashboard.": [ - "К сожалению, произошла ошибка при загрузке виджета." + "These are the tables this filter will be applied to.": [ + "Это таблицы, к которым будет применен этот фильтр." ], - "There was an issue favoriting this dashboard.": [ - "Произошла ошибка при добавлении этого дашборда в избранное." + "These filters apply to the values available in the dropdowns": [ + "Эти фильтры применяются к значениям, доступным в выпадающих списках" ], - "This dashboard is now ${nowPublished}": [ - "Этот дашборд теперь ${nowPublished}" + "These parameters are generated dynamically when clicking the save or overwrite button in the explore view. This JSON object is exposed here for reference and for power users who may want to alter specific parameters.": [ + "Эти параметры генерируются автоматически при нажатии кнопки сохранения. Опытные пользователи могут изменить определенные объекты в формате JSON." ], - "You do not have permissions to edit this dashboard.": [ - "У вас нет прав на редактирование этого дашборда: %(name)s." + "This JSON object is generated dynamically when clicking the save or overwrite button in the dashboard view. It is exposed here for reference and for power users who may want to alter specific parameters.": [ + "Этот JSON-объект генерируется автоматически при сохранении или перезаписи дашборда. Он размещён здесь справочно и для опытных пользователей." ], - "This dashboard was saved successfully.": ["Дашборд успешно сохранен."], - "Could not fetch all saved charts": [""], - "Sorry there was an error fetching saved charts: ": [ - "Извините, произошла ошибка при загрузке графиков: " + "This action will permanently delete %s.": [ + "Это действие навсегда удалит %s." ], - "Visualization": ["Визуализация"], - "Data source": ["Источник данных"], - "Added": ["Добавлено"], - "Components": ["Компоненты"], - "Any color palette selected here will override the colors applied to this dashboard's individual charts": [ - "Любая палитра, выбранная здесь, будет перезаписывать цвета, применённые к отдельным графикам этого дашборда" + "This action will permanently delete the layer.": [ + "Это действие навсегда удалит слой." ], - "Color scheme": ["Цветовая схема"], - "Load a template": ["Загрузить шаблон"], - "Load a CSS template": ["Загрузить шаблон стилей (CSS)"], - "Live CSS editor": ["Редактор CSS"], - "You have unsaved changes.": ["У вас есть несохраненные изменения."], - "This dashboard is currently force refreshing; the next force refresh will be in %s.": [ - "Для этого дашборда включено обновление; следующее обновление будет через %s." + "This action will permanently delete the saved query.": [ + "Это действие навсегда удалит сохранённый запрос." ], - "Your dashboard is too large. Please reduce the size before save it.": [ - "Дашборд слишком большой. Пожалуйста, уменьшите его размер перед сохранением." + "This action will permanently delete the template.": [ + "Это действие навсегда удалит шаблон." ], - "Discard changes": ["Отменить изменения"], - "An error occurred while fetching available CSS templates": [ - "Произошла ошибка при получении доступных CSS-шаблонов" + "This can be either an IP address (e.g. 127.0.0.1) or a domain name (e.g. mydatabase.com).": [ + "Это может быть как IP адрес (например, 127.0.0.1), так и доменное имя (например, моябазаданных.рф)." ], - "Superset dashboard": ["Дашборд Superset"], - "Check out this dashboard: ": ["Посмотреть дашборд: "], - "Refresh dashboard": ["Обновить дашборд"], - "Set auto-refresh interval": ["Интервал обновления"], - "Set filter mapping": ["Установить действие фильтра"], - "Edit dashboard properties": ["Редактировать свойства дашборда"], - "Edit CSS": ["Редактировать CSS"], - "Download as image": ["Сохранить как изображение"], - "Toggle fullscreen": ["Полноэкранный режим"], - "There is no chart definition associated with this component, could it have been deleted?": [ + "This chart has been moved to a different filter scope.": [ + "Этот график был перемещён в другой набор фильтров." + ], + "This chart is managed externally, and can't be edited in Superset": [""], + "This chart might be incompatible with the filter (datasets don't match)": [ + "Этот график может быть несовместим с этим фильтром (датасеты не совпадают)" + ], + "This chart type is not supported when using an unsaved query as a chart source. ": [ "" ], - "Delete this container and save to remove this message.": [ - "Удалите этот контейнер и сохраните изменения, чтобы убрать это сообщение." + "This color scheme is being overriden by custom label colors.\n Check the JSON metadata in the Advanced settings": [ + "" ], - "An error has occurred": ["Произошла ошибка"], - "You do not have permission to edit this dashboard": [ - "У вас нет доступа к этому источнику данных" + "This column might be incompatible with current dataset": [ + "Этот график может быть несовместим с этим датасетом" ], - "A valid color scheme is required": [ - "Требуется корректная цветовая схема" + "This column must contain date/time information.": [ + "В этом столбец должны быть данные формата дата/время." ], - "The dashboard has been saved": ["Дашборд сохранен"], - "Apply": ["Применить"], - "Dashboard properties": ["Свойства дашборда"], - "Basic information": ["Основная информация"], - "URL slug": ["Читаемый URL"], - "A readable URL for your dashboard": ["Читаемый URL-адрес для дашборда"], - "Access": ["Доступ"], - "Owners is a list of users who can alter the dashboard. Searchable by name or username.": [ - "Владельцы - это список пользователей, которые могут изменять дашборд." + "This controls whether the \"time_range\" field from the current\n view should be passed down to the chart containing the annotation data.": [ + "Должен ли временной интервал из этого представления переписать временной интервал графика, содержащего данные аннотации." ], - "Colors": ["Цвета"], - "Advanced": ["Дополнительно"], - "JSON metadata": ["JSON метаданные"], - "This dashboard is not published, it will not show up in the list of dashboards. Click here to publish this dashboard.": [ - "Этот дашборд не опубликован, он не будет отображён в списке дашбордов. Нажмите здесь, чтобы опубликовать этот дашборд." + "This controls whether the time grain field from the current\n view should be passed down to the chart containing the annotation data.": [ + "Должен ли единица времени из этой таблицы переписать единицу времени графика." + ], + "This dashboard is currently auto refreshing; the next auto refresh will be in %s.": [ + "В настоящий момент дашборд обновляется; следующее обновление будет через %s" + ], + "This dashboard is managed externally, and can't be edited in Superset": [ + "" ], "This dashboard is not published which means it will not show up in the list of dashboards. Favorite it to see it there or access it by using the URL directly.": [ "Этот дашборд не опубликован, что означает, что он не будет отображён в списке дашбордов. Добавьте его в избранное, чтобы увидеть там или воспользуйтесь доступом по прямой ссылке." ], + "This dashboard is not published, it will not show up in the list of dashboards. Click here to publish this dashboard.": [ + "Этот дашборд не опубликован, он не будет отображён в списке дашбордов. Нажмите, чтобы опубликовать этот дашборд." + ], + "This dashboard is now hidden": ["Дашборд теперь скрыт"], + "This dashboard is now published": ["Дашборд теперь опубликован"], "This dashboard is published. Click to make it a draft.": [ "Дашборд опубликован. Нажмите, чтобы сделать черновиком." ], - "Draft": ["Черновик"], - "Don't refresh": ["Не обновлять"], - "10 seconds": ["10 секунд"], - "30 seconds": ["30 секунд"], - "1 minute": ["1 минута"], - "5 minutes": ["5 минут"], - "30 minutes": ["30 минут"], - "1 hour": ["1 час"], - "6 hours": ["6 часов"], - "12 hours": ["12 часов"], - "24 hours": ["24 часа"], - "Refresh interval": ["Интервал обновления"], - "Refresh frequency": ["Частота"], - "Are you sure you want to proceed?": [ - "Вы уверены, что хотите продолжить?" + "This dashboard is ready to embed. In your application, pass the following id to the SDK:": [ + "" ], - "Save for this session": [""], - "You must pick a name for the new dashboard": [ - "Вы должны выбрать имя для нового дашборда" + "This dashboard was changed recently. Please reload dashboard to get latest version.": [ + "Этот дашборд был недавно изменен. Пожалуйста, обновите дашборд, чтобы увидеть изменения." ], - "Save dashboard": ["Сохранить дашборд"], - "Overwrite Dashboard [%s]": ["Перезаписать дашборд [%s]"], - "Save as:": ["Сохранить как:"], - "[dashboard name]": ["[название]"], - "also copy (duplicate) charts": [""], - "Filter your charts": ["Фильтровать графики"], - "Annotation layers are still loading.": ["Слои аннотаций загружаются."], - "One ore more annotation layers failed loading.": [ - "Один или несколько слоев аннотации не удалось загрузить." + "This dashboard was saved successfully.": ["Дашборд успешно сохранен"], + "This database is managed externally, and can't be edited in Superset": [ + "Эта база данных управляется извне и не может быть изменена в Суперсете" ], - "Cached %s": [""], - "Fetched %s": [""], - "Minimize chart": ["Свернуть график"], - "Maximize chart": ["Развернуть график"], - "Force refresh": ["Принудительное обновление"], - "Toggle chart description": ["Изменить описание графика"], - "View chart in Explore": ["Посмотреть график в режиме исследования"], - "Share chart": ["Поделиться графиком"], - "Export CSV": ["Экпспорт CSV"], - "Applied Filters (%d)": ["Применено фильтров (%d)"], - "Incompatible Filters (%d)": ["Несовместимые фильтры (%d)"], - "Unset Filters (%d)": ["Сбросить фильтры (%d)"], - "Search...": ["Поиск…"], - "No filter is selected.": ["Не выбраны фильтры."], - "Editing 1 filter:": [""], - "Batch editing %d filters:": [""], - "Configure filter scopes": ["Настроить области действия фильтра"], - "There are no filters in this dashboard.": [ - "В этом дашборде нет фильтров." + "This database table does not contain any data. Please select a different table.": [ + "" + ], + "This dataset is managed externally, and can't be edited in Superset": [ + "Этот датасет управляется извне и не может быть изменена в Суперсете" + ], + "This defines the element to be plotted on the chart": [ + "Элемент, который будет отражен на графике" + ], + "This defines the level of the hierarchy": [ + "Определяет уровень иерархии" + ], + "This fields acts a Superset view, meaning that Superset will run a query against this string as a subquery.": [ + "" + ], + "This filter doesn't exist in dashboard. It will not be applied.": [ + "Этот фильтр не существует в дашборде. Он не будет применен." + ], + "This filter is the last temporal filter. If you proceed,\n this chart won't be affected by time range filters in dashboards.": [ + "" + ], + "This filter might be incompatible with current dataset": [ + "Этот фильтр может быть несовместим с этим датасетом" + ], + "This filter set is identical to: \"%s\"": [ + "Этот набор фильтров идентичен \"%s\"" + ], + "This functionality is disabled in your environment for security reasons.": [ + "Эта функция отключена в вашей среде по соображениям безопасности." + ], + "This is the condition that will be added to the WHERE clause. For example, to only return rows for a particular client, you might define a regular filter with the clause `client_id = 9`. To display no rows unless a user belongs to a RLS filter role, a base filter can be created with the clause `1 = 0` (always false).": [ + "Это условие, которое будет добавлено к оператору WHERE. Например, чтобы возвращать строки только для определенного клиента, вы можете определить обычный фильтр с условием `client_id = 9`. Чтобы не отображать строки, если пользователь не принадлежит к роли фильтра RLS, можно создать базовый фильтр с предложением `1 = 0` (всегда false)." + ], + "This json object describes the positioning of the widgets in the dashboard. It is dynamically generated when adjusting the widgets size and positions by using drag & drop in the dashboard view": [ + "Этот JSON объект описывает расположение графиков в дашборде. Он генерируется динамически при изменении и перемещении графиков в дашборде." ], - "Expand all": ["Развернуть всё"], - "Collapse all": ["Свернуть всё"], "This markdown component has an error.": [ "Этот компонент содержит ошибки." ], "This markdown component has an error. Please revert your recent changes.": [ "Этот компонент содержит ошибки. Пожалуйста, отмените последние изменения." ], - "Delete dashboard tab?": ["Удалить вкладку дашборда?"], - "Divider": ["Разделитель"], - "Header": ["Строка заголовков"], - "Row": ["Строка"], - "Tabs": ["Вкладки"], - "Preview": ["Предпросмотр %s"], - "Yes, cancel": ["Да, отменить"], - "Keep editing": ["Продолжить редактирование"], - "Select parent filters": ["Выберите дату окончания"], - "Reset all": ["Сбросить текущее состояние"], - "You have removed this filter.": ["Вы удалили фильтр."], - "Restore filter": ["Фильтр результатов"], - "Filter name": ["Значение фильтра"], - "Name is required": ["Имя обязательно"], - "Datasource is required": ["Источники данных"], - "Field": ["Поле"], - "Parent filter": ["Временной фильтр"], - "None": [""], - "Apply changes instantly": ["Мгновенно применять изменения"], - "Allow multiple selections": ["Разрешить множественный фильтр"], - "Inverse selection": ["Инвертировать выбор"], - "Required": ["Обязательно"], - "Are you sure you want to cancel?": ["Вы уверены, что хотите отменить?"], - "will not be saved.": ["не будет сохранён."], - "Filter configuration and scoping": ["Фильтруемые срезы"], - "Add filter": ["Добавить фильтр"], - "(Removed)": ["(Удалено)"], - "Undo?": ["Отменить?"], - "Scoping": [""], - "Apply to all panels": ["Применить ко всем панелям"], - "Apply to specific panels": ["Применить к выбранным панелям"], - "Only selected panels will be affected by this filter": [ - "Фильтр будет применён только к выбранным панелям" + "This may be triggered by:": ["Возможные причины:"], + "This metric might be incompatible with current dataset": [ + "Эта мера может быть несовместима с этим датасетом" ], - "All panels with this column will be affected by this filter": [ - "Фильтр будет применён ко всем панелям с этим столбцом" + "This section contains options that allow for advanced analytical post processing of query results": [ + "В этом разделе содержатся параметры, которые позволяют производить аналитическую постобработку результатов запроса" ], - "All filters": ["Фильтры"], - "All charts": ["Все графики"], - "Warning! Changing the dataset may break the chart if the metadata does not exist.": [ - "Внимание! Изменение датасета может привести к тому, что график станет нерабочим, если будут отсутствовать метаданные." + "This section contains validation errors": [ + "В этом разделе содержатся ошибки валидации" ], - "Changing the dataset may break the chart if the chart relies on columns or metadata that does not exist in the target dataset": [ - "Изменения датасета может привести к тому, что график станет нерабочим, если график использует несуществующие в целевом датасете столбцы или метаданные" + "This session has encountered an interruption, and some controls may not work as intended. If you are the developer of this app, please check that the guest token is being generated correctly.": [ + "" ], - "dataset": ["датасет"], - "Change dataset": ["Выберите источник данных"], - "Warning!": ["Предупреждение!"], - "Search / Filter": ["Поиск / Фильтр"], - "Physical (table or view)": ["Физический (таблица или представление)"], - "Virtual (SQL)": ["Виртуальный (SQL)"], - "SQL expression": ["Выражение SQL"], - "Data type": ["Таблица Данных"], - "Datetime format": ["Формат Datetime"], - "The pattern of timestamp format. For strings use ": [""], - "Python datetime string pattern": [""], - " expression which needs to adhere to the ": [""], - "ISO 8601": ["ISO 8601"], - " standard to ensure that the lexicographical ordering\n coincides with the chronological ordering. If the\n timestamp format does not adhere to the ISO 8601 standard\n you will need to define an expression and type for\n transforming the string into a date or timestamp. Note\n currently time zones are not supported. If time is stored\n in epoch format, put `epoch_s` or `epoch_ms`. If no pattern\n is specified we fall back to using the optional defaults on a per\n database/column name level via the extra parameter.": [ + "This table already has a dataset": [""], + "This table already has a dataset associated with it. You can only associate one dataset with a table.\n": [ "" ], - "Is dimension": ["Измерение"], - "Is filterable": ["Фильтрующийся"], - "Modified columns: %s": ["Изменённые столбцы: %s"], - "Removed columns: %s": ["Удалённые столбцы: %s"], - "New columns added: %s": ["Добавленные столбцы: %s"], - "Metadata has been synced": ["Метаданные синхронизированы"], - "Column name [%s] is duplicated": ["Дубль имени столбца [%s]"], - "Metric name [%s] is duplicated": ["Дубль имения показателя [%s]"], - "Calculated column [%s] requires an expression": [ - "Для расчётного столбца [%s] требуется выражение" + "This value should be greater than the left target value": [ + "Это значение должно быть больше чем левое целевое значение" ], - "Basic": [""], - "Default URL": ["URL базы данных"], - "Default URL to redirect to when accessing from the dataset list page": [ - "URL по-умолчанию, на который будет выполнен редирект при доступе из страницы со списком датасетов" + "This value should be smaller than the right target value": [ + "Это значение должно быть больше чем правое целевое значение" ], - "Autocomplete filters": [""], - "Whether to populate autocomplete filters options": [ - "Включить фильтр на определенный интервал/диапазон времени" + "This visualization type is not supported.": [ + "Этот тип визуализации не поддерживается." ], - "Autocomplete query predicate": ["Извлечь Значения Предиката"], - "When using \"Autocomplete filters\", this can be used to improve performance of the query fetching the values. Use this option to apply a predicate (WHERE clause) to the query selecting the distinct values from the table. Typically the intent would be to limit the scan by applying a relative time filter on a partitioned or indexed time-related field.": [ + "This was triggered by:": [ + "Причина срабатывания:", + "Причины срабатывания", + "Причины срабатывания" + ], + "This will remove your current embed configuration.": [""], + "Threshold alpha level for determining significance": [ + "Пороговый альфа-уровень для определения значимости" + ], + "Threshold value should be double precision number": [ + "Пороговое значение должно быть числом двойной точности" + ], + "Thumbnails": ["Миниатюры"], + "Thursday": ["Четверг"], + "Time": ["Время"], + "Time Column": ["Столбец даты/времени"], + "Time Comparison": ["Сравнение по времени"], + "Time Format": ["Формат даты/времени"], + "Time Grain": ["Единица времени"], + "Time Granularity": ["Гранулярность времени"], + "Time Lag": ["Временной лаг"], + "Time Range": ["Временной интервал"], + "Time Ratio": ["Соотношение времени"], + "Time Series": ["Временной ряд"], + "Time Series - Bar Chart": ["Столбчатая диаграмма (временные ряды)"], + "Time Series - Dual Axis Line Chart": [ + "Диаграмма с двумя осями (временные ряды)" + ], + "Time Series - Line Chart": ["Линейная диаграмма (временные ряды)"], + "Time Series - Nightingale Rose Chart": [ + "Диаграмма Найтингейл (временные ряды)" + ], + "Time Series - Paired t-test": ["Парный t-test (временные ряды)"], + "Time Series - Percent Change": ["Процентное изменение (временные ряды)"], + "Time Series - Stacked": ["Диаграмма с накоплением (временные ряды)"], + "Time Series Options": ["Настройки временных рядов"], + "Time Shift": ["Временной сдвиг"], + "Time column": ["Столбец даты/времени"], + "Time column \"%(col)s\" does not exist in dataset": [ + "Столбец формата дата/время \"%(col)s\" не существует в датасете" + ], + "Time column filter plugin": [""], + "Time comparison": ["Столбец с датой"], + "Time delta in natural language\n (example: 24 hours, 7 days, 56 weeks, 365 days)": [ + "Временной сдвиг на естественном языке (например: 24 hours, 7 days, 56 weeks, 365 days)" + ], + "Time delta is ambiguous. Please specify [%(human_readable)s ago] or [%(human_readable)s later].": [ + "Неоднозначный временной сдвиг. Пожалуйста, укажите [%(human_readable)s до] или [%(human_readable)s после]." + ], + "Time filter": ["Временной фильтр"], + "Time format": ["Формат даты/времени"], + "Time grain": ["Единица времени"], + "Time grain missing": ["Единица времени отсутствует"], + "Time granularity": ["Гранулярность времени"], + "Time in seconds": ["Время в секундах"], + "Time lag": ["Временной лаг"], + "Time range": ["Временной интервал"], + "Time ratio": ["Соотношение времени"], + "Time related form attributes": ["Параметры, связанные со временем"], + "Time series": ["Временной ряд"], + "Time series columns": ["Столбцы временных рядов"], + "Time shift": ["Временной сдвиг"], + "Time string is ambiguous. Please specify [%(human_readable)s ago] or [%(human_readable)s later].": [ + "Временная строка неоднозначна. Пожалуйста, укажите [%(human_readable)s до] или [%(human_readable)s после]." + ], + "Time-series Area Chart": ["Диаграмма с областями (временные ряды)"], + "Time-series Area chart are similar to line chart in that they represent variables with the same scale, but area charts stack the metrics on top of each other. An area chart in Superset can be stream, stack, or expand.": [ + "Диаграмма с наполнением похожа на линейную диаграмму тем, что они представляют переменные с одинаковым масштабом, но диаграммы с наполнением накладывают показатели друг на друга." + ], + "Time-series Bar Chart": ["Столбчатая диаграмма"], + "Time-series Bar Chart (legacy)": ["Столбчатая диаграмма (устарело)"], + "Time-series Bar Charts are used to show the changes in a metric over time as a series of bars.": [ + "Столбчатые диаграммы временных рядов используются для отображения изменений меры с течением времени в виде серии столбцов." + ], + "Time-series Chart": ["Диаграмма (временные ряды)"], + "Time-series Line Chart": ["Линейная диаграмма (временные ряды)"], + "Time-series Percent Change": ["Процентное изменение (временные ряды)"], + "Time-series Scatter Plot": ["Точечная Диаграмма"], + "Time-series Scatter Plot has time on the horizontal axis in linear units, and the points are connected in order. It shows a statistical relationship between two variables.": [ + "На горизонтальной оси Точечной диаграммы откладывается время в линейных единицах, а точки соединяются по порядку. Он показывает статистическую зависимость между двумя переменными." + ], + "Time-series Smooth Line": [ + "Плавная линейная диаграмма (временные ряды)" + ], + "Time-series Smooth-line is a variation of the line chart. Without angles and hard edges, Smooth-line sometimes looks smarter and more professional.": [ "" ], - "Extra data to specify table metadata. Currently supports certification data of the format: `{ \"certification\": { \"certified_by\": \"Data Platform Team\", \"details\": \"This table is the source of truth.\" } }`.": [ + "Time-series Stepped Line": ["Диаграмма шагов (временные ряды)"], + "Time-series Stepped-line graph (also called step chart) is a variation of line chart but with the line forming a series of steps between data points. A step chart can be useful when you want to show the changes that occur at irregular intervals.": [ "" ], - "Owners of the dataset": ["Владельцы датасета"], - "Cache timeout": ["Тайм-аут Кэша"], - "The duration of time in seconds before the cache is invalidated": [ - "Количество секунд до истечения срока действия кэша" + "Time-series Table": ["Таблица временных рядов"], + "Time-series line chart is used to visualize repeated measurements taken over regular time intervals. Line chart is a type of chart which displays information as a series of data points connected by straight line segments. It is a basic type of chart common in many fields.": [ + "Линейная диаграмма временных рядов используется для визуализации повторяющихся измерений, происходящих через регулярные промежутки времени. Линейная диаграмма - это тип диаграммы, который отображает информацию в виде ряда точек данных, соединенных прямыми отрезками. Это базовый тип диаграммы, распространенный во многих областях." + ], + "Timeout error": ["Ошибка таймаута"], + "Timestamp format": ["Формат даты и времени"], + "Timezone": ["Часовой пояс"], + "Timezone offset (in hours) for this datasource": [ + "Смещение часового пояса (в часах) для этого источника данных" + ], + "Timezone selector": ["Выбор часового пояса"], + "Tiny": ["Крошечный"], + "Title": ["Заголовок"], + "Title Column": ["Столбец с названием"], + "Title is required": ["Название обязательно"], + "Title or Slug": ["Название или читаемый URL"], + "To filter on a metric, use Custom SQL tab.": [ + "Для фильтрации по мере используйте вкладку Свой SQL." + ], + "To get a readable URL for your dashboard": [ + "Для получения читаемого URL-адреса дашборда" + ], + "Too many columns to filter": ["Слишком много столбцов для фильтрации"], + "Tools": ["Инструменты"], + "Tooltip": ["Всплывающая подсказка"], + "Tooltip sort by metric": ["Сортировка данных подсказки по мере"], + "Tooltip time format": ["Формат времени всплывающей подсказки"], + "Top": ["Сверху"], + "Top left": ["Сверху слева"], + "Top right": ["Сверху справа"], + "Top to Bottom": ["Сверху вниз"], + "Total (%(aggfunc)s)": [""], + "Total (%(aggregatorName)s)": [""], + "Total: %s": ["Итого: %s"], + "Totals": ["Общая сумма"], + "Track job": ["Отслеживать работу"], + "Transformable": ["Трансформируемый"], + "Transparent": ["Прозрачный"], + "Transpose Pivot": ["Транспонировать таблицу"], + "Transpose pivot": ["Транспонировать таблицу"], + "Tree Chart": ["Древовидная диаграмма"], + "Tree layout": ["Оформление дерева"], + "Tree orientation": ["Ориентация дерева"], + "Treemap": ["Плоское дерево"], + "Treemap (legacy)": ["Плоское дерево (устарело)"], + "Trend": ["Тенденция"], + "Triangle": ["Треугольник"], + "Trigger Alert If...": ["Оповестить, если..."], + "Truncate Axis": ["Настройка интервала оси"], + "Truncate Metric": ["Убрать имя меры"], + "Truncate Y Axis": ["Урезать интервал оси Y"], + "Truncate Y Axis. Can be overridden by specifying a min or max bound.": [ + "Уменьшить интервал по умолчанию для оси Y. Необходимо задать минимальную и максимальную границы. Обратите внимание, что некоторые линии могут пропасть из области видимости." + ], + "Truncate long cells to the \"min width\" set above": [""], + "Truncates the specified date to the accuracy specified by the date unit.": [ + "Усекает указанную дату с точностью, указанной в единице измерения даты." + ], + "Try applying different filters or ensuring your datasource has data": [ + "Попробуйте использовать другие фильтры или убедитесь, что в вашем источнике данных есть данные" + ], + "Try different criteria to display results.": [ + "Попробуйте использовать другии критерии фильтрации" + ], + "Try selecting a different schema": [""], + "Tuesday": ["Вторник"], + "Type": ["Тип"], + "Type \"%s\" to confirm": ["Введите \"%s\" для подтверждения"], + "Type a value": ["Введите значение"], + "Type a value here": ["Введите значение здесь"], + "Type is required": ["Поле обязательно"], + "Type of Google Sheets allowed": ["Допустимый тип Google Таблиц"], + "Type of comparison, value difference or percentage": [ + "Тип сравнения, разница значений или доля" + ], + "Type or Select [%s]": ["Введите или выберите [%s]"], + "UI Configuration": ["Конфигурация UI"], + "URL": ["Ссылка (URL)"], + "URL Parameters": ["Параметры URL"], + "URL parameters": ["Параметры URL"], + "URL slug": ["Читаемый URL"], + "Unable to add a new tab to the backend. Please contact your administrator.": [ + "Не удается добавить новую вкладку на сервер. Пожалуйста, свяжитесь с администратором." + ], + "Unable to connect to catalog named \"%(catalog_name)s\".": [""], + "Unable to connect to database \"%(database)s\".": [ + "Невозможно подключиться к базе данных \"%(database)s\"." + ], + "Unable to connect. Verify that the following roles are set on the service account: \"BigQuery Data Viewer\", \"BigQuery Metadata Viewer\", \"BigQuery Job User\" and the following permissions are set \"bigquery.readsessions.create\", \"bigquery.readsessions.getData\"": [ + "" + ], + "Unable to create chart without a query id.": [""], + "Unable to find such a holiday: [%(holiday)s]": [ + "Не удалось найти такой праздник: [%(holiday)s]" + ], + "Unable to load columns for the selected table. Please select a different table.": [ + "Не удалось загрузить столбцы для выбранной таблицы. Пожалуйста, выберите другую таблицу." + ], + "Unable to migrate query editor state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ + "Не удается перенести состояние редактора запроса на сервер. Суперсет повторит попытку позже. Пожалуйста, свяжитесь с вашим администратором, если эта проблема не устранена." + ], + "Unable to migrate query state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ + "Не удается перенести состояние запроса на сервер. Суперсет повторит попытку позже. Пожалуйста, свяжитесь с вашим администратором, если эта проблема не устранена." + ], + "Unable to migrate table schema state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ + "Не удается перенести состояние схемы таблицы на сервер. Суперсет повторит попытку позже. Пожалуйста, свяжитесь с вашим администратором, если эта проблема не устранена." + ], + "Unable to process right-click on %s. Check you chart configuration.": [ + "Не удалось обработать ПКМ на %s. Проверьте настройки графика." + ], + "Unable to retrieve dashboard colors": [ + "Не удалось получать цветовую схему дашборда" + ], + "Unable to upload CSV file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ + "Не удалось загрузить CSV файл \"%(filename)s\" в таблицу \"%(table_name)s\" в базу данных \"%(db_name)s\". Ошибка: %(error_msg)s" + ], + "Unable to upload Columnar file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ + "Не удалось загрузить файл столбчатого типа \"%(filename)s\" в таблицу \"%(table_name)s\" в базу данных \"%(db_name)s\". Ошибка: %(error_msg)s" + ], + "Unable to upload Excel file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ + "Не удалось загрузить Excel файл \"%(filename)s\" в таблицу \"%(table_name)s\" в базу данных \"%(db_name)s\". Ошибка: %(error_msg)s" + ], + "Undefined": ["Не определено"], + "Undefined window for rolling operation": [ + "Неопределенное окно для скольжения" + ], + "Undo the action": ["Отменить действие"], + "Undo?": ["Отменить?"], + "Unexpected error": ["Неожиданная ошибка"], + "Unexpected error occurred, please check your logs for details": [ + "Возникла неожиданная ошибка, пожалуйста, проверьте историю действий для уточнения деталей" + ], + "Unexpected error: ": ["Неожиданная ошибка: "], + "Unknown": ["Неизвестно"], + "Unknown MySQL server host \"%(hostname)s\".": [ + "Неизвестный хост MySQL \"%(hostname)s\"." + ], + "Unknown Presto Error": ["Неизвестная ошибка Presto"], + "Unknown Status": ["Неизвестный статус"], + "Unknown column used in orderby: %(col)s": [ + "Неизвестный столбец использован для упорядочивания: %(col)s" + ], + "Unknown error": ["Неизвестная ошибка"], + "Unknown input format": ["Неизвестный формат ввода"], + "Unknown value": ["Неизвестная ошибка"], + "Unsafe return type for function %(func)s: %(value_type)s": [ + "Небезопасный возвращаемый тип для функции %(func)s: %(value_type)s" + ], + "Unsafe template value for key %(key)s: %(value_type)s": [ + "Небезопасное значение шаблона для ключа %(key)s: %(value_type)s" + ], + "Unset Filters (%d)": ["Сбросить фильтры (%d)"], + "Unsupported clause type: %(clause)s": [ + "Неподдерживаемый оператор: %(clause)s" + ], + "Unsupported post processing operation: %(operation)s": [ + "Неподдерживаемая операция постобработки: %(operation)s" ], - "Hours offset": ["Смещение часов"], - "Spatial": [""], - "virtual": [""], - "Dataset name": ["Наименование датасета"], - "When specifying SQL, the datasource acts as a view. Superset will use this statement as a subquery while grouping and filtering on the generated parent queries.": [ - "Когда указан SQL, источник данных работает как представление. Superset будет использовать это выражение в подзапросе, при необходимости группировки и фильтрации." + "Unsupported return value for method %(name)s": [ + "Неподдерживаемое значение для метода %(name)s" ], - "The JSON metric or post aggregation definition.": [""], - "Physical": [""], - "The pointer to a physical table (or view). Keep in mind that the chart is associated to this Superset logical table, and this logical table points the physical table referenced here.": [ - "Указатель на физическую таблицу (или представление). Следует помнить, что график связан с логической таблицей Superset, а эта логическая таблица указывает на физическую таблицу, указанную здесь." + "Unsupported template value for key %(key)s": [ + "Неподдерживаемое значение шаблона для ключа %(key)s" ], - "Click the lock to make changes.": [ - "Нажмите на замок, чтобы выполнить изменения." + "Unsupported time grain: %(time_grain)s": [ + "Неподдерживаемая единица времени: %(time_grain)s" ], - "Click the lock to prevent further changes.": [ - "Нажмите на замок, чтобы предотвратить будущие изменения." + "Untitled Dataset": ["Безымянный датасет"], + "Untitled query": ["Безымянный запрос"], + "Update": ["Обновить"], + "Update chart": ["Обновить график"], + "Updating chart was stopped": ["Обновление графика остановлено"], + "Upload": ["Загрузить"], + "Upload CSV": ["Загрузить CSV"], + "Upload CSV to database": ["Загрузить файл CSV в базу данных"], + "Upload Credentials": ["Загрузить учетные данные"], + "Upload Enabled": ["Загрузка включена"], + "Upload Excel file": ["Загрузить файл Excel"], + "Upload Excel file to database": ["Загрузить файл Excel в базу данных"], + "Upload JSON file": ["Загрузить JSON файл"], + "Upload columnar file": ["Загрузить файл столбчатого формата"], + "Upload columnar file to database": [ + "Загрузить файл столбчатого формата в базу данных" + ], + "Upload file to database": ["Загрузить файл в базу данных"], + "Use \"%(menuName)s\" menu instead.": [ + "Использовать меню \"%(menuName)s\" взамен." + ], + "Use %s to open in a new tab.": [ + "Используйте %s для открытия в отдельной вкладке." + ], + "Use Area Proportions": ["Использовать пропорции области"], + "Use Columns": ["Используемые столбцы"], + "Use a log scale": ["Использовать логарифмическую шкалу"], + "Use a log scale for the X-axis": [ + "Использовать логарифмическую шкалу для оси X" + ], + "Use a log scale for the Y-axis": [ + "Использовать логарифмическую шкалу для оси Y" + ], + "Use an encrypted connection to the database": [ + "Использовать зашифрованное соединение к Базе Данных" + ], + "Use another existing chart as a source for annotations and overlays.\n Your chart must be one of these visualization types: [%s]": [ + "" ], - "D3 format": ["Формат D3"], - "Warning message": ["Предупреждающее сообщение"], - "Warning message to display in the metric selector": [ - "Предупреждение для отображения на селекторе показателей" + "Use date formatting even when metric value is not a timestamp": [ + "Использовать перевод к формату дата/время даже если мера представляет другой тип данных" ], - "Certified by": ["Изменено"], - "Person or group that has certified this metric": [ - "Лицо или группа, которые сертифицировали данный показатель" + "Use legacy datasource editor": ["Использовать старый редактор"], + "Use metrics as a top level group for columns or for rows": [""], + "Use only a single value.": ["Используйте только одно значение."], + "Use the Advanced Analytics options below": [ + "Используйте настройки Расширенной аналитики ниже" ], - "Certification details": ["Детали сертификации"], - "Details of the certification": ["Детали сертификации"], - "Be careful.": ["Будьте осторожны."], - "Changing these settings will affect all charts using this dataset, including charts owned by other people.": [ - "Изменение этих настроек будет влиять на все графики, использующие этот датасет, включая графики других пользователей." + "Use the JSON file you automatically downloaded when creating your service account.": [ + "" ], - "Source": ["Источник"], - "Sync columns from source": ["Синхронизировать столбцы из источника"], - "Calculated columns": ["Расчётные столбцы"], - "The dataset has been saved": ["Источник данных, похоже, был удален"], - "The dataset configuration exposed here\n affects all the charts using this dataset.\n Be mindful that changing settings\n here may affect other charts\n in undesirable ways.": [ - "Здесь представлена конфигурация датасета\n влияет на все графики, использующие этот датасет.\n Помните, что изменение настроек\n может иметь неожиданный эффект\n на другие графики." + "Use the edit button to change this field": [ + "Используйте кнопку редактирования для изменения поля" ], - "Are you sure you want to save and apply changes?": [ - "Вы уверены, что хотите сохранить и применить изменения?" + "Use this section if you want a query that aggregates": [""], + "Use this section if you want to query atomic rows": [""], + "Use this to define a static color for all circles": [ + "Этот цвет используется для заливки" ], - "Confirm save": ["Подтвердить сохранение"], - "Edit Dataset ": ["Редактировать датасет "], - "Use legacy datasource editor": ["Использовать старый редактор"], - "Time range": ["Период времени"], - "Time column": ["Столбец с временем"], - "Time grain": ["Гранулярность времени"], - "Origin": ["Источник"], - "Time granularity": ["Гранулярность времени"], - "A reference to the [Time] configuration, taking granularity into account": [ + "Used internally to identify the plugin. Should be set to the package name from the pluginʼs package.json": [ "" ], - "Group by": ["Группировать по"], - "One or many controls to group by": [ - "Выберите один или несколько срезов в поле группировки данных" + "Used to summarize a set of data by grouping together multiple statistics along two axes. Examples: Sales numbers by region and month, tasks by status and assignee, active users by age and location.\n\n This chart is being deprecated and we recommend checking out Pivot Table V2 instead!": [ + "Используется для обобщения набора данных путем группировки нескольких показателей по двум осям. Примеры: показатели продаж по регионам и месяцам, задачи по статусу и назначенному лицу, активные пользователи по возрасту и местоположению.\n Этот график устарел, рекомендуется использовать график Сводная Таблица 2." ], - "One or many metrics to display": [ - "Выберите один или несколько показателей для отображения" + "Used to summarize a set of data by grouping together multiple statistics along two axes. Examples: Sales numbers by region and month, tasks by status and assignee, active users by age and location. Not the most visually stunning visualization, but highly informative and versatile.": [ + "Используется для обобщения набора данных путем группировки нескольких показателей по двум осям. Примеры: показатели продаж по регионам и месяцам, задачи по статусу и назначенному лицу, активные пользователи по возрасту и местоположению." ], - "Dataset": ["Датасет"], - "Visualization type": ["Тип визуализации"], - "The type of visualization to display": [ - "Выберите необходимый тип визуализации" + "User": ["Пользователь"], + "User Roles": ["Роли пользователя"], + "User doesn't have the proper permissions.": [ + "У пользователя нет надлежащего доступа." ], - "Fixed color": ["Фиксированный цвет"], - "Use this to define a static color for all circles": [ - "Используйте это цвет для заливки всех кругов одним цветом" + "User must select a value before applying the filter": [ + "Для использования фильтра пользователь будет обязан выбрать значение" ], - "Right axis metric": ["Показатель для правой оси"], - "Choose a metric for right axis": ["Выберите показатель для правой оси"], - "Linear color scheme": ["Цветовая схема"], - "Color metric": ["Цвет показателя"], - "A metric to use for color": [ - "Показатель, используемый для расчета цвета" + "User must select a value for this filter": [ + "Для использования фильтра пользователь будет обязан выбрать значение" ], - "One or many controls to pivot as columns": [ - "Выберите один или несколько срезов для отображения показателей в столбцах сводной таблицы" + "User query": ["Пользовательский запрос"], + "Username": ["Имя пользователя"], + "Uses a gauge to showcase progress of a metric towards a target. The position of the dial represents the progress and the terminal value in the gauge represents the target value.": [ + "Использует индикатор для демонстрации прогресса показателя в достижении цели. Положение циферблата показывает ход выполнения, а конечное значение на индикаторе представляет целевое значение." ], - "Defines the origin where time buckets start, accepts natural dates as in `now`, `sunday` or `1970-01-01`": [ + "Uses circles to visualize the flow of data through different stages of a system. Hover over individual paths in the visualization to understand the stages a value took. Useful for multi-stage, multi-group visualizing funnels and pipelines.": [ "" ], - "The time granularity for the visualization. Note that you can type and use simple natural language as in `10 seconds`, `1 day` or `56 weeks`": [ - "Интервал времени, в границах которого строится график. Обратите внимание, что для определения диапазона времени, вы можете использовать естественный язык. Например, можно указать словосочетания - «10 seconds», «1 day» или «56 weeks»" + "Value": ["Значение"], + "Value Domain": [""], + "Value Format": ["Формат значения"], + "Value bounds": ["Ограничения для значения"], + "Value format": ["Формат значения"], + "Value is required": ["Значение обязательно"], + "Value must be greater than 0": ["Значение должно быть больше 0"], + "Values are dependent on other filters": [ + "Значения зависят от других фильтров" + ], + "Values dependent on": ["Значения зависят от"], + "Values selected in other filters will affect the filter options to only show relevant values": [ + "" ], - "The time column for the visualization. Note that you can define arbitrary expression that return a DATETIME column in the table. Also note that the filter below is applied against this column or expression": [ - "Столбец данных с датой или временем. Вы можете определить произвольное выражение, которое будет возвращать столбец даты/времени в таблице. Фильтр ниже будет применён к этому столбцу или выражению" + "Vehicle Types": [""], + "Verbose Name": ["Удобочитаемое имя"], + "Version": ["Версия"], + "Version number": ["Номер версии"], + "Vertical": ["Вертикально"], + "Vertical (Left)": ["Вертикально (слева)"], + "Video game consoles": ["Игровые приставки"], + "View": ["Показать"], + "View All »": ["Смотреть все »"], + "View Dataset": ["Посмотреть датасет"], + "View all charts": ["Показать все графики"], + "View as table": ["Показать в виде таблицы"], + "View in SQL Lab": ["Открыть в Лаборатории SQL"], + "View keys & indexes (%s)": ["Показать ключи и индексы (%s)"], + "View query": ["Показать SQL запрос"], + "Viewed": ["Просмотрено"], + "Viewed %s": ["Просмотрено %s"], + "Viewport": ["Область просмотра"], + "Virtual": ["Виртуальный"], + "Virtual (SQL)": ["Виртуальный (SQL)"], + "Virtual dataset": ["Виртуальный датасет"], + "Virtual dataset query cannot be empty": [ + "Запрос виртуального датасета не может быть пустым" ], - "The time granularity for the visualization. This applies a date transformation to alter your time column and defines a new time granularity. The options here are defined on a per database engine basis in the Superset source code.": [ - "Гранулярность для визуализации. С помощью этого применяются преобразования к столбцу с датой/временем и определяет новую гранулярность (минута, день, год, и т.п.). Доступные опции определены в исходном коде Superset для каждого типа движка БД." + "Virtual dataset query cannot consist of multiple statements": [ + "Запрос виртуального датасета не может содержать несколько запросов" ], - "Last week": ["Последняя неделя"], - "The time range for the visualization. All relative times, e.g. \"Last month\", \"Last 7 days\", \"now\", etc. are evaluated on the server using the server's local time (sans timezone). All tooltips and placeholder times are expressed in UTC (sans timezone). The timestamps are then evaluated by the database using the engine's local timezone. Note one can explicitly set the timezone per the ISO 8601 format if specifying either the start and/or end time.": [ + "Virtual dataset query must be read-only": [ + "Запрос виртуального датасета должен быть доступен только для чтения" + ], + "Visual Tweaks": ["Визуальные настройки"], + "Visualization Type": ["Тип визуализации"], + "Visualization type": ["Тип визуализации"], + "Visualize a parallel set of metrics across multiple groups. Each group is visualized using its own line of points and each metric is represented as an edge in the chart.": [ "" ], - "Row limit": ["Лимит строк"], - "Series limit": ["Лимит кол-ва рядов"], - "Limits the number of time series that get displayed. A sub query (or an extra phase where sub queries are not supported) is applied to limit the number of time series that get fetched and displayed. This feature is useful when grouping by high cardinality dimension(s).": [ - "Ограничивает количество отображаемых временных рядов." + "Visualize a related metric across pairs of groups. Heatmaps excel at showcasing the correlation or strength between two groups. Color is used to emphasize the strength of the link between each pair of groups.": [ + "" ], - "Sort by": ["Сортировка"], - "Metric used to define the top series": [ - "Показатель, используемый для определения какие временные ряды будут отображаться при ограничении количества выводимых рядов" + "Visualize geospatial data like 3D buildings, landscapes, or objects in grid view.": [ + "Визуализирует геопространственные данные, такие как 3D-здания, ландшафты или объекты в виде сетки." ], - "Series": ["Ряд данных"], - "Defines the grouping of entities. Each series is shown as a specific color on the chart and has a legend toggle": [ - "Группировка в ряды данных. Каждый ряд отображается в виде определенного цвета на графике и имеет легенду" + "Visualize how a metric changes over time using bars. Add a group by column to visualize group level metrics and how they change over time.": [ + "Визуализирует изменение меры с течением времени, используя столбцы. Добавьте столбец для группировки, чтобы визуализировать показатели уровня группы и то, как они меняются с течением времени." ], - "Entity": ["Элемент"], - "This defines the element to be plotted on the chart": [ - "Элемент, который будет отражен на графике" + "Visualize multiple levels of hierarchy using a familiar tree-like structure.": [ + "Визуализирует несколько уровней иерархии, используя древовидную структуру." ], - "X Axis": ["Ось X"], - "Metric assigned to the [X] axis": ["Показатель, отраженный на оси X"], - "Y Axis": ["Ось Y"], - "Metric assigned to the [Y] axis": ["Показатель, отраженный на оси Y"], - "Bubble size": ["Размер маркера"], - "Y Axis Format": ["Формат Оси Y"], - "When `Calculation type` is set to \"Percentage change\", the Y Axis Format is forced to `.1%`": [ - "Когда `Тип расчёта` установлен в “Изменение процента”, формат оси Y устанавливается в `.1%`" + "Visualize two different series using the same x-axis. Note that both series can be visualized with a different chart type (e.g. 1 using bars and 1 using a line).": [ + "" ], - "The color scheme for rendering chart": [ - "Цветовая схема, применяемая для раскрашивания графика" + "Visualize two different time series using the same x-axis time range. This chart is being deprecated and we recommend using the Mixed Timeseries Chart instead!": [ + "" ], - "Color map": ["Цвет"], - "description": ["описание"], - "bolt": [""], - "Changing this control takes effect instantly": [ - "Изменение этого элемента применяется сразу" + "Visualize two different time series using the same x-axis. Note that each time series can be visualized differently (e.g. 1 using bars and 1 using a line).": [ + "" ], - "Customize": ["Настроить"], - "rows retrieved": ["строк получено"], - "Sorry, An error occurred": ["Извините, произошла ошибка"], - "No data": ["Метаданные"], - "View samples": ["Посмотреть примеры"], - "Search Metrics & Columns": ["Столбцы Временных Рядов"], - "Showing %s of %s": [""], - "New chart": ["Переместить график"], - "Edit properties": ["Редактирование свойств"], - "View query": ["Скопировать запрос"], - "Run in SQL Lab": ["Открыть в SQL редакторе"], - "Height": ["Высота"], - "Width": ["Ширина"], - "Export to .json": ["Экспортировать в JSON формат"], - "Export to .csv format": ["Экспортировать в CSV формат"], - "%s - untitled": ["%s - без названия"], - "Edit chart properties": ["Редактирование свойств"], - "Control labeled ": [""], - "Open Datasource tab": ["Открыть вкладку источника данных"], - "You do not have permission to edit this chart": [ - "У вас нет прав на редактирование этого графика" + "Visualizes 2 metrics as line plots using the same x-axis. This chart is useful for comparing metrics across the same time range.": [ + "" ], - "The description can be displayed as widget headers in the dashboard view. Supports markdown.": [ - "Описание может быть отображено как заголовок виджета в ракурсе дашбордов. Поддерживает markdown-разметку." + "Visualizes a metric across three dimensions of data in a single chart (X axis, Y axis, and bubble size). Bubbles from the same group can be showcased using bubble color.": [ + "" ], - "Configuration": ["Доля"], - "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the dataset's timeout if undefined.": [ - "Продолжительность (в секундах) таймаута кэширования для этого графика." + "Visualizes connected points, which form a path, on a map.": [ + "Визуализирует связанные точки, которые образуют путь, на карте." ], - "A list of users who can alter the chart. Searchable by name or username.": [ - "Владельцы - это пользователи, которые могут изменять график." + "Visualizes geographic areas from your data as polygons on a Mapbox rendered map. Polygons can be colored using a metric.": [ + "" ], - "rows": ["строк"], - "Limit reached": ["Достигнут предел"], - "**Select** a dashboard OR **create** a new one": [ - "**Выберите** дашборд ИЛИ **создайте** новый" + "Visualizes how a metric has changed over a time using a color scale and a calendar view. Gray values are used to indicate missing values and the linear color scheme is used to encode the magnitude of each day's value.": [ + "Визуализирует, как показатель изменился с течением времени, используя цветовую шкалу и календарь. Значения серого цвета используются для обозначения отсутствующих значений, а линейная цветовая схема используется для отображения величины значения каждого дня." ], - "Please enter a chart name": ["Введите имя графика"], - "Save chart": ["Сохранить график"], - "Save & go to dashboard": ["Сохранить и перейти к дашборду"], - "Save as new chart": ["Сохранить как новый график"], - "Save (Overwrite)": ["Сохранить (Перезаписать)"], - "Save as ...": ["Сохранить как …"], - "Chart name": ["Имя графика"], - "Add to dashboard": ["Добавить в дашборд"], - "Display configuration": ["Как отображать"], - "Configure your how you overlay is displayed here.": [ - "Настройте наложение здесь." + "Visualizes how a single metric varies across a country's principal subdivisions (states, provinces, etc) on a chloropleth map. Each subdivision's value is elevated when you hover over the corresponding geographic boundary.": [ + "" ], - "Style": ["Стиль"], - "Opacity": ["Прозрачность"], - "Color": ["Цвет"], - "Line width": ["Толщина линии"], - "Layer configuration": ["Конфигурация слоя"], - "Configure the basics of your Annotation Layer.": [ - "Настройте слой аннотации." + "Visualizes many different time-series objects in a single chart. This chart is being deprecated and we recommend using the Time-series Chart instead.": [ + "" ], - "Mandatory": [""], - "Hide layer": ["Скрыть слой"], - "Choose the annotation layer type": ["Выбрать тип слоя аннотации"], - "Annotation layer type": ["Тип слоя аннотации"], - "Remove": [""], - "Edit annotation layer": ["Редактировать слой аннотации"], - "Add annotation layer": ["Добавить слой аннотации"], - "`Min` value should be numeric or empty": [ - "Значение «Минимум» должно быть числовым или пустым" + "Visualizes the flow of different group's values through different stages of a system. New stages in the pipeline are visualized as nodes or layers. The thickness of the bars or edges represent the metric being visualized.": [ + "" ], - "`Max` value should be numeric or empty": [ - "Значение « Максимум» должно быть числовым или пустым" + "Visualizes the words in a column that appear the most often. Bigger font corresponds to higher frequency.": [ + "Визуализирует слова в столбце, которые появляются чаще всего. Более крупный шрифт соответствует более высокой частоте" ], - "Min": ["Минимум"], - "Max": ["Максимум"], - "Edit dataset": ["Редактировать датасет"], - "View in SQL Lab": ["Открыть в лаборатории SQL"], - "More dataset related options": ["Больше опций к датасету"], - "Superset supports smart date parsing. Strings like `3 weeks ago`, `last sunday`, or `2 weeks from now` can be used.": [ - "Superset поддерживает умную интерпретацию дат. Могут быть использованы такие строки как `3 weeks ago`, `last sunday`, или `2 weeks from now`." + "Viz is missing a datasource": [ + "У визуализации отсутствует источник данных" ], - "Default": ["Широта по умолчанию"], - "(optional) default value for the filter, when using the multiple option, you can use a semicolon-delimited list of options.": [ - "(опционально) значение по-умолчанию для фильтраю. Когда используются множественные значения, вы можете вставить список значений, разделённых символами точка с запятой" + "Viz type": ["Тип визуализации"], + "WED": ["СР"], + "Want to add a new database?": ["Хотите добавить новую базу данных?"], + "Warning": ["Предупреждение"], + "Warning Message": ["Предупреждение"], + "Warning!": ["Предупреждение!"], + "Warning! Changing the dataset may break the chart if the metadata does not exist.": [ + "Внимание! Изменение датасета может привести к тому, что график станет нерабочим, если будут отсутствовать метаданные." ], - "Sort metric": ["Показатель для сортировки"], - "Metric to sort the results by": [ - "Показатель, по которому сортировать результаты" + "Was unable to check your query": ["Не удалось проверить запрос"], + "We are unable to connect to your database. Click \"See more\" for database-provided information that may help troubleshoot the issue.": [ + "Не удалось подключиться к базе данных. Нажмите \"Подробнее\" для информации, предоставленной базой данных в ответ, для решения проблемы." ], - "Sort ascending": ["Направление сортировки"], - "Check for sorting ascending": [ - "Сортировка по убыванию или по возрастанию" + "We can't seem to resolve column \"%(column)s\" at line %(location)s.": [ + "Не удалось обнаружить столбец \"%(column)s\" в строке %(location)s." ], - "Multiple selections allowed, otherwise filter is limited to a single value": [ - "Разрешён множественный выбор, иначе можно выбрать только одно значение фильтра" + "We can't seem to resolve the column \"%(column_name)s\"": [ + "Не удалось обнаружить столбец \"%(column_name)s\"" ], - "Search all filter options": ["Поиск / Фильтр"], - "By default, each filter loads at most 1000 choices at the initial page load. Check this box if you have more than 1000 filter values and want to enable dynamically searching that loads filter values as users type (may add stress to your database).": [ - "По-умолчанию, каждый фильтр загружает не больше 1000 элементов выбора при начальной загрузке страницы. Установите этот флаг, если у вас больше 1000 значений фильтра и вы хотите включить динамический поиск, который загружает значения по мере их ввода пользователем (может увеличить нагрузку на вашу базу данных)." + "We can't seem to resolve the column \"%(column_name)s\" at line %(location)s.": [ + "Не удалось обнаружить столбец \"%(column_name)s\" в строке %(location)s." ], - "User must select a value for this filter": [ - "Пользователю нужно будет выбрать значение для этого фильтра" + "We have the following keys: %s": ["У нас есть следующие ключи: %s"], + "We were unable to active or deactivate this report.": [ + "Не удалось включить или выключить эту рассылку." ], - "Filter configuration": ["Фильтруемые срезы"], - "Error while fetching data": ["Возникла ошибка при получение данных"], - "No results found": ["Записи не найдены"], - "%s option(s)": ["%s параметр(ы)"], - "Invalid lat/long configuration.": [ - "Неверная конфигурация широты и долготы." + "We were unable to carry over any controls when switching to this new dataset.": [ + "Не удалось перенести настройки прошлого графика при переключении датасета." ], - "Reverse lat/long ": ["Поменять местами широту и долготу "], - "Longitude & Latitude columns": ["Долгота и Широта"], - "Delimited long & lat single column": [ - "Широта и Долгота в одном столбце с разделителем" + "We were unable to connect to your database named \"%(database)s\". Please verify your database name and try again.": [ + "Не удалось подключиться к вашей базе данных с именем \"%(database)s\". Пожалуйста, подтвердите имя вашей базы данных и попробуйте снова." ], - "Multiple formats accepted, look the geopy.points Python library for more details": [ - "Для уточнения форматов и получения более подробной информации, посмотрите Python-библиотеку geopy.points" + "Web": ["Сеть"], + "Wednesday": ["Среда"], + "Week": ["Неделя"], + "Week ending Saturday": ["Неделя, заканчивающаяся в субботу"], + "Week starting Monday": ["Неделя, начинающаяся в понедельник"], + "Week starting Sunday": ["Неделя, начинающаяся в воскресенье"], + "Week_ending Sunday": ["Неделя, заканчивающаяся в воскресенье"], + "Weekly Report": ["Еженедельный отчет"], + "Weekly Report for %s": ["Еженедельный отчет для %s"], + "Weekly seasonality": ["Недельная сезонность"], + "Weeks %s": ["Недель %s"], + "Weight": ["Вес"], + "We’re having trouble loading these results. Queries are set to timeout after %s second.": [ + "Возникла проблема при загрузке результатов. Для запросов установлен тайм-аут %s секунда.", + "Возникла проблема при загрузке результатов. Для запросов установлен тайм-аут %s секунды.", + "Возникла проблема при загрузке результатов. Для запросов установлен тайм-аут %s секунд." ], - "Geohash": ["Geohash"], - "textarea": ["текстовая область"], - "in modal": [""], - "Time series columns": ["Столбцы Временных Рядов"], - "This visualization type is not supported.": [ - "Этот тип визуализации не поддерживается." + "We’re having trouble loading this visualization. Queries are set to timeout after %s second.": [ + "Возникла проблема при загрузке этой визуализации. Для запросов установлен тайм-аут %s секунда.", + "Возникла проблема при загрузке этой визуализации. Для запросов установлен тайм-аут %s секунды.", + "Возникла проблема при загрузке этой визуализации. Для запросов установлен тайм-аут %s секунд." ], - "Click to change visualization type": ["Выберите тип визуализации"], - "Select a visualization type": ["Выберите тип визуализации"], - "Failed to verify select options: %s": [ - "Ошибка при проверке опций выбора: %s" + "What should be shown on the label?": ["Текст, отображаемый на метке"], + "What should happen if the table already exists": [ + "Что должно произойти, если таблица уже существует" ], - "RANGE TYPE": ["ТИП ИНТЕРВАЛА"], - "Actual time range": [""], - "CANCEL": ["ОТМЕНИТЬ"], - "APPLY": ["ПРИМЕНИТЬ"], - "Edit time range": ["Изменить параметры шаблона"], - "Configure advanced time range": ["Особый временной интервал"], - "START": ["НАЧАЛО"], - "END": ["КОНЕЦ"], - "Configure Time Range: Previous...": ["Предыдущие…"], - "Configure Time Range: Last...": ["Последние…"], - "Configure custom time range": ["Изменить параметры шаблона"], - "Relative quantity": ["Относительное количество"], - "Anchor to": ["Привязать к"], - "NOW": ["СЕЙЧАС"], - "Date/Time": ["Формат даты"], - "Simple": ["Простые"], - "Custom SQL": ["Через SQL"], - "No such column found. To filter on a metric, try the Custom SQL tab.": [ - "Такой столбец не найден. Чтобы фильтровать по показателю, попробуйте вкладку Через SQL." + "When `Calculation type` is set to \"Percentage change\", the Y Axis Format is forced to `.1%`": [ + "Когда `Тип расчёта` установлен в \"Процентное изменение\", формат оси Y устанавливается в `.1%`" ], - "%s column(s) and metric(s)": ["%s столбец(ы) и показатель(и)"], - "%s column(s)": ["Столбец(ы) %s"], - "To filter on a metric, use Custom SQL tab.": [ - "Фильтр на показателе, используйте вкладку Через SQL." + "When a secondary metric is provided, a linear color scale is used.": [ + "Когда предоставляется вторичная мера, используется линейная цветовая схема." ], - "%s operator(s)": ["%s параметр(ы)"], - "Type a value here": ["Введите значение здесь"], - "Filter value (case sensitive)": [ - "Фильтровать значения (зависит от регистра)" + "When allowing CREATE TABLE AS option in SQL Lab, this option forces the table to be created in this schema": [ + "При включении опции CREATE TABLE AS в Лаборатории SQL, новые таблицы будут добавлены в эту схему" ], - "choose WHERE or HAVING...": ["выберите WHERE или HAVING…"], - "Filters by columns": ["Фильтруемые срезы"], - "Filters by metrics": ["Список показателей"], - "\n This filter was inherited from the dashboard's context.\n It won't be saved when saving the chart.\n ": [ - "\n Фильтр был наследован из контекста дашборда.\n Это не будет сохранено при сохранении графика.\n " + "When checked, the map will zoom to your data after each query": [ + "Если отмечено, карта будет смасштабирована к вашим данным после каждого запроса" ], - "%s aggregates(s)": ["%s агрегат(ы)"], - "%s saved metric(s)": ["%s сохранённый показатель(и)"], - "Saved": ["Сохранить"], - "Saved metric": ["Сохранённый показатель"], - "column": ["столбец"], - "aggregate": ["агрегат"], - "My metric": ["Показатель"], - "Add metric": ["Добавить показатель"], - "Code": ["Редактор"], - "Markup type": ["Тип разметки"], - "Pick your favorite markup language": [ - "Выберите свой любимый язык разметки" + "When enabled, users are able to visualize SQL Lab results in Explore.": [ + "Если этот параметр включен, пользователи могут смотреть ответ запросов Лаборатории SQL в режиме исследования." ], - "Put your code here": [ - "Введите произвольный текст в формате html или markdown" + "When only a primary metric is provided, a categorical color scale is used.": [ + "Когда предоставляется только основная мера, используется категориальная цветовая схема." ], - "Query": ["Запрос"], - "URL": ["Ссылка (URL)"], - "Templated link, it's possible to include {{ metric }} or other values coming from the controls.": [ - "Шаблонная ссылка, можно включить {{ metric }} или другие значения, поступающие из элементов управления." + "When specifying SQL, the datasource acts as a view. Superset will use this statement as a subquery while grouping and filtering on the generated parent queries.": [ + "Когда указан SQL, источник данных работает как представление. Superset будет использовать это выражение в подзапросе, при необходимости группировки и фильтрации." ], - "Time": ["Время"], - "Time related form attributes": ["Параметры, связанные с временем"], - "Chart type": ["Тип графика"], - "Chart ID": ["График"], - "The id of the active chart": ["Идентификатор активного среза"], - "Cache Timeout (seconds)": ["Тайм-аут кэша (секунды)"], - "The number of seconds before expiring the cache": [ - "Количество секунд до истечения срока действия кэша" + "When using \"Autocomplete filters\", this can be used to improve performance of the query fetching the values. Use this option to apply a predicate (WHERE clause) to the query selecting the distinct values from the table. Typically the intent would be to limit the scan by applying a relative time filter on a partitioned or indexed time-related field.": [ + "При использовании \"Фильтров автозаполнения\" это может использоваться для улучшения быстродействия запроса. Используйте эту опцию для настройки предиката (оператор WHERE) запроса для уникальных значений из таблицы. Обычно целью является ограничение сканирования путем применения относительного временного фильтра к секционированному или индексированному полю типа дата/время." ], - "URL parameters": ["Параметры"], - "Extra parameters for use in jinja templated queries": [ - "Дополнительные параметры для запросов, использующих шаблоны jinja" + "When using 'Group By' you are limited to use a single metric": [ + "При использовании 'GROUP BY' вы ограничены использованием одной меры" ], - "Time range endpoints": ["Период времени"], - "Time range endpoints (SIP-15)": [""], - "Annotations and layers": ["Аннотация"], - "Sort descending": ["Сортировать"], - "Whether to sort descending or ascending": [ - "Сортировка по убыванию или по возрастанию" + "When using this option, default value can’t be set": [ + "При включении этой опции нельзя установить значение по умолчанию" ], - "Contribution": ["Доля"], - "Compute the contribution to the total": [ - "Вычислить вклад в общую сумму (долю). Установите формат показателя в проценты" + "Whether the progress bar overlaps when there are multiple groups of data": [ + "Индикатор прогресса накладывается при наличии нескольких групп данных" ], - "Advanced analytics": ["Расширенный анализ"], - "This section contains options that allow for advanced analytical post processing of query results": [ - "В этом разделе содержатся параметры, которые позволяют производить аналитическую пост-обработку результатов запроса" + "Whether the table was generated by the 'Visualize' flow in SQL Lab": [ + "" ], - "Rolling window": ["Rolling"], - "Rolling function": ["Rolling"], - "Defines a rolling window function to apply, works along with the [Periods] text box": [ - "Одна из функций (Rolling) библиотеки Pandas, которая определяет способ агрегации данных" + "Whether this column is exposed in the `Filters` section of the explore view.": [ + "" ], - "Periods": ["Период"], - "Defines the size of the rolling window function, relative to the time granularity selected": [ - "Одна из функций (Rolling) библиотеки Pandas, которая определяет период, к которому применяется функция агрегации" + "Whether to align background charts with both positive and negative values at 0": [ + "" ], - "Min periods": ["HIde Periods"], - "The minimum number of rolling periods required to show a value. For instance if you do a cumulative sum on 7 days you may want your \"Min Period\" to be 7, so that all data points shown are the total of 7 periods. This will hide the \"ramp up\" taking place over the first 7 periods": [ - "Скрыть необходимое количество периодов. Например, если вы делаете накопительную сумму показателя за 7 дней, но хотите скрыть нарастающий итог за первые 6 дней, то указав в данном столбце «6», вы скроете нарастание, происходящее в течение первых 6 периодов" + "Whether to align positive and negative values in cell bar chart at 0": [ + "Выравнивание гистограммы внутри ячеек по горизонтали слева" ], - "Time comparison": ["Столбец с датой"], - "Time shift": ["Временной сдвиг"], - "Overlay one or more timeseries from a relative time period. Expects relative time deltas in natural language (example: 24 hours, 7 days, 52 weeks, 365 days). Free text is supported.": [ - "" + "Whether to always show the annotation label": [ + "Всегда показывать метку аннотации" ], - "Calculation type": ["Тип расчёта"], - "How to display time shifts: as individual lines; as the absolute difference between the main time series and each time shift; as the percentage change; or as the ratio between series and time shifts.": [ - "Как отображать смещения во времени: как отдельные линии; как абсолютную разницу между основным временным рядом и каждым смещением; как процентное изменение; или как соотношение между рядами и смещениями." + "Whether to animate the progress and the value or just display them": [ + "Анимировать прогресс и значение или просто отображать их" ], - "Python functions": ["Python функции"], - "Rule": ["Правило"], - "Pandas resample rule": [ - "Одна из функций (Resample) библиотеки Pandas, которая определяет период, к которому применяется функция агрегации" + "Whether to apply a normal distribution based on rank on the color scale": [ + "Применять нормальное распределение на основе ранга в цветовой схеме" ], - "Method": ["Метод"], - "Pandas resample method": [ - "Одна из функций (Resample) библиотеки Pandas, которая определяет метод обработки данных" + "Whether to apply filter when items are clicked": [ + "Применять фильтр при щелчке по элементам" ], - "Favorites": ["Избранное"], - "Created content": ["Созданный контент"], - "Recent activity": ["Последние действия"], - "Security & Access": ["Безопасность и Доступ"], - "No charts": ["Переместить график"], - "No dashboards": ["Нет дашбордов"], - "No favorite charts yet, go click on stars!": [ - "В избранном нет графиков. Нажмите звёздочку для добавления!" + "Whether to colorize numeric values by if they are positive or negative": [ + "Окрашивать ячейки с числами в зависимости от их знака" ], - "No favorite dashboards yet, go click on stars!": [ - "В избранном нет дашбордов. Нажмите звёздочку для добавления!" + "Whether to display a bar chart background in table columns": [ + "Отображать гистограмм в колонках таблицы" ], - "Profile picture provided by Gravatar": [ - "Изображение профиля, сгенерированное сервисом Gravatar" + "Whether to display a legend for the chart": [ + "Отображать легенду для графика" ], - "joined": ["присоединился"], - "id:": ["идентификатор:"], - "There was an error fetching your recent activity:": [ - "К сожалению, произошла ошибка при загрузке виджета:" + "Whether to display bubbles on top of countries": [ + "Отображать пузыри поверх стран" ], - "Deleted: %s": ["Удалено: %s"], - "There was an issue deleting: %s": ["Произошла ошибка при удалении: %s"], - "There was an issue deleting %s: %s": [ - "Произошла ошибка при удалении %s: %s" + "Whether to display the aggregate count": [ + "Отображать совокупное количество" ], - "report": ["рассылка"], - "alert": ["предупреждение"], - "reports": ["рассылки"], - "alerts": ["предупреждения"], - "There was an issue deleting the selected %s: %s": [ - "Произошла ошибка при удалении выбранных %s: %s" + "Whether to display the interactive data table": [ + "Отображать интерактивную таблицу с данными" ], - "Last run": ["Последнее изменение"], - "Notification method": ["Добавить слой аннотации"], - "Execution log": ["Журнал Действий"], - "Actions": ["Действия"], - "Bulk select": ["Множественный выбор"], - "No %s yet": ["Пока нет %s"], - "Created by": ["Дата создания"], - "An error occurred while fetching created by values: %s": [ - "Произошла ошибка при построении графика: %s" + "Whether to display the labels.": ["Отображать метки"], + "Whether to display the labels. Note that the label only displays when the the 5% threshold.": [ + "Отображать метки. Обратите внимание, что метка отображается только при достижении порогового значения 5%." ], - "Status": ["Статус"], - "${AlertState.success}": ["${AlertState.success}"], - "${AlertState.working}": ["${AlertState.working}"], - "${AlertState.error}": ["${AlertState.error}"], - "${AlertState.noop}": ["${AlertState.noop}"], - "${AlertState.grace}": ["${AlertState.grace}"], - "Alerts & reports": ["Оповещения и рассылки"], - "Reports": ["Рассылки"], - "This action will permanently delete %s.": [ - "Это действие навсегда удалит %s." + "Whether to display the legend (toggles)": [ + "Отображать легенду (переключатель)" ], - "Delete %s?": ["Удалить %s?"], - "Please confirm": ["Пожалуйста, подтвердите"], - "Are you sure you want to delete the selected %s?": [ - "Вы уверены, что хотите удалить выбранные %s?" + "Whether to display the metric name as a title": [ + "Отображать имя меры как названия" ], - "< (Smaller than)": ["< (меньше чем)"], - "> (Larger than)": ["> (больше чем)"], - "<= (Smaller or equal)": ["<= (меньше или равно)"], - ">= (Larger or equal)": [">= (больше или равно)"], - "== (Is equal)": ["== (равно)"], - "!= (Is not equal)": ["!= (не равно)"], - "Not null": ["Не пусто"], - "30 days": ["30 дней"], - "60 days": ["60 дней"], - "90 days": ["90 дней"], - "Add notification method": ["Добавить слой аннотации"], - "Add delivery method": ["Добавить метод доставки"], - "Recipients are separated by \",\" or \";\"": [ - "Получатели, разделенные “,” или “;”" + "Whether to display the min and max values of the X-axis": [ + "Отображать минимальное и максимальное значение на оси X" ], - "Add": ["Добавить"], - "Edit ${isReport ? 'Report' : 'Alert'}": [ - "Править ${isReport ? ‘рассылку’ : ‘оповещение’}" + "Whether to display the min and max values of the Y-axis": [ + "Отображать минимальное и максимальное значение на оси Y" + ], + "Whether to display the numerical values within the cells": [ + "Отображение числовых значений в ячейках" + ], + "Whether to display the stroke": ["Отображение обводки"], + "Whether to display the time range interactive selector": [ + "Отображение интерактивного селектора временного интервала" ], - "Add ${isReport ? 'Report' : 'Alert'}": [ - "Добавить ${isReport ? ‘рассылку’ : ‘оповещение’}" + "Whether to display the timestamp": ["Отображение временную метку"], + "Whether to display the trend line": ["Отображение трендовой линии"], + "Whether to enable changing graph position and scaling.": [""], + "Whether to enable node dragging in force layout mode.": [ + "Включить перемещение вершин в режиме силового алгоритма." ], - "Report name": ["Имя Шаблона"], - "Alert name": ["Имя оповещения"], - "Alert condition": ["Условие оповещения"], - "Trigger Alert If...": ["Сделать оповещение, если…"], - "Value": ["Подписи"], - "Report schedule": ["Область просмотра"], - "Alert condition schedule": ["Расписание условия оповещения"], - "Schedule settings": ["Настройки расписания"], - "Log retention": ["Время жизни журнала"], - "Working timeout": [""], - "Time in seconds": ["Время в секундах"], - "Grace period": ["Период"], - "Message content": ["Содержимое сообщения"], - "log": ["журнал"], - "State": ["Состояние"], - "Scheduled at": ["Запланировано на"], - "Start at": ["Время начала"], - "Duration": ["Продолжительность"], - "Error message": ["Сообщение об ошибке"], - "${alertResource?.type}": ["${alertResource?.type}"], - "CRON expression": ["Выражение SQL"], - "Report sent": ["Рассылка отправлена"], - "Alert triggered, notification sent": [ - "Сработало оповещение, уведомление отправлено" + "Whether to fill the objects": ["Использовать заливку для объектов"], + "Whether to ignore locations that are null": [ + "Игнорировать местоположения, которые не содержат данных о расположении" ], - "Report sending": ["Выполняется рассылка"], - "Alert running": ["Выполняется оповещение"], - "Report failed": ["Рассылка не удалась"], - "Alert failed": ["Оповещение не удалось"], - "Nothing triggered": ["Ничего не сработало"], - "Alert Triggered, In Grace Period": ["Сработало оповещение"], - "${RecipientIconName.email}": ["${RecipientIconName.email}"], - "${RecipientIconName.slack}": ["${RecipientIconName.slack}"], - "annotation": ["аннотация"], - "There was an issue deleting the selected annotations: %s": [ - "Произошла ошибка при удалении выбранных аннотаций: %s" + "Whether to include a client-side search box": [ + "Отображение строки поиска" ], - "Edit annotation": ["Редактировать аннотацию"], - "Delete annotation": ["Удалить аннотацию"], - "Annotation": ["Аннотация"], - "No annotation yet": ["Пока нет аннотаций"], - "Annotation Layer ${annotationLayerName}": [ - "Слой аннотаций ${annotationLayerName}" + "Whether to include a time filter": [ + "Включить фильтр на определенный интервал/диапазон времени" ], - "Are you sure you want to delete ${annotationCurrentlyDeleting?.short_descr}?": [ - "Вы уверены, что хотите удалить ${annotationCurrentlyDeleting?.short_descr}?" + "Whether to include the percentage in the tooltip": [ + "Отображение процентной доли во всплывающей подсказке" ], - "Delete Annotation?": ["Удалить аннотацию?"], - "Are you sure you want to delete the selected annotations?": [ - "Вы уверены, что хотите удалить выбранные аннотации?" + "Whether to include the time granularity as defined in the time section": [ + "Добавляет столбец даты/времени с группировкой дат, как определено в разделе Время" ], - "Add annotation": ["Добавить слой аннотации"], - "Annotation name": ["Слои аннотаций"], - "date": ["дата"], - "Additional information": ["Дополнительные метаданные"], - "Description (this can be seen in the list)": [ - "Описание (будет видно в списке)" + "Whether to make the grid 3D": ["Сделать сетку 3D"], + "Whether to make the histogram cumulative": [ + "Сделать гистограмму нарастающей" ], - "annotation_layer": ["слой_аннотации"], - "Edit annotation layer properties": [ - "Редактировать свойства слоя аннотаций" + "Whether to make this column available as a [Time Granularity] option, column has to be DATETIME or DATETIME-like": [ + "" ], - "Annotation layer name": ["Имя слоя аннотаций"], - "Annotation layers": ["Слои аннотаций"], - "There was an issue deleting the selected layers: %s": [ - "Произошла ошибка при удалении выбранных слоёв: %s" + "Whether to normalize the histogram": ["Нормализовать гистограмму"], + "Whether to populate autocomplete filters options": [ + "Распространить настройки фильтров автозаполнения" ], - "Last modified": ["Изменено"], - "Created on": ["Дата создания"], - "Edit template": ["Загрузить шаблон"], - "Delete template": ["Загрузить шаблон"], - "Annotation layer": ["Слои аннотаций"], - "An error occurred while fetching dataset datasource values: %s": [ - "Произошла ошибка при получении значений датасета: %s" + "Whether to populate the filter's dropdown in the explore view's filter section with a list of distinct values fetched from the backend on the fly": [ + "" ], - "No annotation layers yet": ["Слои аннотаций"], - "This action will permanently delete the layer.": [ - "Это действие навсегда удалит слой." + "Whether to show extra controls or not. Extra controls include things like making mulitBar charts stacked or side by side.": [ + "Отображает дополнительные элементы управления на самом графике и позволяет менять отображение столбцов: без накопления и с ним." ], - "Delete Layer?": ["Удалить все?"], - "Are you sure you want to delete the selected layers?": [ - "Вы уверены, что хотите удалить выбранные слои?" + "Whether to show minor ticks on the axis": [ + "Отображение мелких отметок на оси" ], - "Are you sure you want to delete": ["Вы уверены, что хотите удалить"], - "Last modified %s": ["Изменено %s"], - "The passwords for the databases below are needed in order to import them together with the charts. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "Для баз данных нужны пароли, чтобы импортировать их вместе с графиками. Пожалуйста, обратите внимание, что разделы “Безопасность” и “Сертификат” в настройках конфигурации базы данных отсутствуют в экспортируемых файлов и должны быть добавлены вручную после импорта, если необходимо." + "Whether to show the pointer": ["Отображение указателя"], + "Whether to show the progress of gauge chart": [""], + "Whether to show the split lines on the axis": [ + "Отображение линий разделения на оси" ], - "You are importing one or more charts that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ - "Вы импортируете один или несколько графиков, которые уже существуют. Перезапись может привести к потере части вашей работы. Вы уверены, что хотите перезаписать?" + "Whether to sort descending or ascending": [ + "Сортировка по убыванию или по возрастанию" ], - "There was an issue deleting the selected charts: %s": [ - "Произошла ошибка при удалении выбранных графиков: %s" + "Whether to sort descending or ascending if a series limit is present": [ + "Сортировка по убыванию или по возрастанию, если есть ограничение на количество категорий" ], - "Modified by": ["Изменено"], - "Owner": ["Владелец"], - "An error occurred while fetching chart owners values: %s": [ - "Произошла ошибка при получении владельца графика: %s" + "Whether to sort descending or ascending on the X-Axis.": [ + "Сортировка по убыванию или по возрастанию для оси X" ], - "An error occurred while fetching chart created by values: %s": [ - "Произошла ошибка при получении создателя графика: %s" + "Whether to sort results by the selected metric in descending order.": [ + "Сортировка результатов по выбранной мере в порядке убывания" ], - "Viz type": ["Тип"], - "An error occurred while fetching chart dataset values: %s": [ - "Произошла ошибка при получении графиков датасета: %s" + "Whether to sort tooltip by the selected metric in descending order.": [ + "Сортировка выбранных мер по убыванию во всплывающей подсказке" ], - "Favorite": ["Избранное"], - "Yes": ["Да"], - "No": ["Нет"], - "Are you sure you want to delete the selected charts?": [ - "Вы уверены, что хотите удалить выбранные графики?" + "Whether to truncate metrics": [ + "Убирает меру (например, AVG(...)) с легенды рядом с именем измерения и из таблицы результатов" ], - "css_template": ["шаблон_css"], - "Edit CSS template properties": ["Редактирование свойств"], - "Add CSS template": ["Шаблоны CSS"], - "CSS template name": ["Имя Шаблона"], - "css": ["Css"], - "CSS templates": ["Шаблоны CSS"], - "There was an issue deleting the selected templates: %s": [ - "Произошла ошибка при удалении выбранных шаблонов: %s" + "Which country to plot the map for?": ["Выбор страны для графика"], + "Which relatives to highlight on hover": ["Подсвечивается при наведении"], + "Whisker/outlier options": ["Настройки усов/выбросов"], + "White": ["Белый"], + "Width": ["Ширина"], + "Width of the confidence interval. Should be between 0 and 1": [ + "Ширина доверительного интервала. Должна быть между 0 и 1" + ], + "Width of the sparkline": ["Ширина спарклайна"], + "Window must be > 0": ["Окно должно быть > 0"], + "With a subheader": ["С подзаголовком"], + "Word Cloud": ["Облако слов"], + "Word Rotation": ["Поворот текста"], + "Working": ["Обрабатывается"], + "Working timeout": ["Время на рассылку"], + "World Map": ["Карта Мира"], + "Write a description for your query": [ + "Заполните описание к вашему запросу" ], - "Last modified by %s": ["Автор изменений %s"], - "CSS template": ["Шаблоны CSS"], - "This action will permanently delete the template.": [ - "Это действие навсегда удалит шаблон." + "Write a handlebars template to render the data": [""], + "Write dataframe index as a column": [ + "Сделать индекс датафрейма столбцом." ], - "Delete Template?": ["Удалить шаблон?"], - "Are you sure you want to delete the selected templates?": [ - "Вы уверены, что хотите удалить выбранные шаблоны?" + "Write dataframe index as a column.": [ + "Сделать индекс датафрейма столбцом." ], - "The passwords for the databases below are needed in order to import them together with the dashboards. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "Для баз данных нужны пароли, чтобы импортировать их вместе с дашбордами. Пожалуйста, обратите внимание, что разделы “Безопасность” и “Сертификат” в настройках конфигурации базы данных отсутствуют в экспортируемых файлов и должны быть добавлены вручную после импорта, если необходимо." + "X AXIS TITLE BOTTOM MARGIN": ["Отступ снизу названия оси X"], + "X Axis": ["Ось X"], + "X Axis Format": ["Формат оси X"], + "X Axis Label": ["Метка оси X"], + "X Axis Title": ["Название оси X"], + "X Log Scale": ["Логарифмическая ось X"], + "X Tick Layout": ["Расположение делений оси X"], + "X bounds": ["Показывать границы оси X"], + "X-Axis Sort Ascending": ["Сортировать по возрастанию оси X"], + "X-Axis Sort By": [""], + "X-axis": ["Ось X"], + "XScale Interval": [""], + "Y 2 bounds": ["Границы оси Y 2"], + "Y AXIS TITLE MARGIN": ["Отступ названия оси Y"], + "Y AXIS TITLE POSITION": ["Положение названия оси Y"], + "Y Axis": ["Ось Y"], + "Y Axis 1": ["Ось Y 1"], + "Y Axis 2": ["Ось Y 2"], + "Y Axis 2 Bounds": ["Границы оси Y 2"], + "Y Axis Bounds": ["Границы оси Y"], + "Y Axis Format": ["Формат Оси Y"], + "Y Axis Label": ["Метка оси Y"], + "Y Axis Left": ["Ось Y слева"], + "Y Axis Right": ["Ось Y справа"], + "Y Axis Title": ["Название оси Y"], + "Y Log Scale": ["Логарифмическая ось Y"], + "Y bounds": ["Показывать границы оси Y"], + "Y-axis": ["Ось Y"], + "Y-axis bounds": ["Границы оси Y"], + "Year": ["Год"], + "Year (freq=AS)": ["Год (част=AS)"], + "Yearly seasonality": ["Годовая сезонность"], + "Years %s": ["Лет %s"], + "Yes": ["Да"], + "Yes, cancel": ["Да, отменить"], + "Yes, overwrite changes": ["Да, перезаписать изменения"], + "You are importing one or more charts that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "Вы импортируете один или несколько графиков, которые уже существуют. Перезапись может привести к потере части вашей работы. Вы уверены, что хотите перезаписать?" ], "You are importing one or more dashboards that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ "Вы импортируете один или несколько дашбордов, которые уже существуют. Перезапись может привести к потере части вашей работы. Вы уверены, что хотите перезаписать?" ], - "An error occurred while fetching dashboards: %s": [ - "Произошла ошибка при получении дашбордов: %s" - ], - "There was an issue deleting the selected dashboards: ": [ - "Произошла ошибка при удалении выбранных дашбордов: " + "You are importing one or more databases that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "Вы импортируете одну или несколько баз данных, которые уже существуют. Перезапись может привести к потере части вашей работы. Вы уверены, что хотите перезаписать?" ], - "An error occurred while fetching dashboard owner values: %s": [ - "Произошла ошибка при получении владельца дашборда: %s" + "You are importing one or more datasets that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "Вы импортируете один или несколько датасетов, которые уже существуют. Перезапись может привести к потере части вашей работы. Вы уверены, что хотите продолжить?" ], - "An error occurred while fetching dashboard created by values: %s": [ - "Произошла ошибка при получении создателя дашборда: %s" + "You are importing one or more saved queries that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "Вы импортируете один или несколько сохраненных запросов, которые уже существуют. Перезапись может привести к потере части вашей работы. Вы уверены, что хотите продолжить?" ], - "Unpublished": ["Неопубликованные"], - "Are you sure you want to delete the selected dashboards?": [ - "Вы уверены, что хотите удалить выбранные дашборды?" + "You are not authorized to see this query. If you think this is an error, please reach out to your administrator.": [ + "Вы не авторизованы для просмотра этого запроса. Если вы считаете, что это ошибка, пожалуйста, обратитесь к своему администратору" ], - "Sorry, your browser does not support copying.": [ - "Извините, Ваш браузер не поддерживание копирование. Используйте сочетание клавиш [CTRL + C] для WIN или [CMD + C] для MAC." + "You can": ["Вы можете"], + "You can add the components in the": ["Вы можете добавить компоненты в"], + "You can add the components in the edit mode.": [ + "Вы можете добавить компоненты в режиме редактирования." ], - "SQL Copied!": ["SQL скопирован!"], - "The passwords for the databases below are needed in order to import them. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "" + "You can create a new chart or use existing ones from the panel on the right": [ + "Вы можете создать новый график или использовать существующие из панели справа" ], - "You are importing one or more databases that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "You can preview the list of dashboards in the chart settings dropdown.": [ "" ], - "database": ["база данных"], - "An error occurred while fetching database related data: %s": [ - "Произошла ошибка при получении данных о базе данных: %s" - ], - "Asynchronous query execution": [""], - "AQE": ["AQE"], - "Allow data manipulation language": [ - "Разрешить язык манипулирования данными" + "You cannot use 45° tick layout along with the time range filter": [ + "Вы не можете использовать расположение делений под углом 45° при использовании временного фильтра" ], - "DML": ["DML"], - "CSV upload": ["Загрузить CSV"], - "Delete database": ["Выберите базу данных"], - "The database %s is linked to %s charts that appear on %s dashboards. Are you sure you want to continue? Deleting the database will break those objects.": [ - "" + "You cannot use [Columns] in combination with [Group By]/[Metrics]/[Percentage Metrics]. Please choose one or the other.": [ + "Вы не можете использовать [Столбцы] в сочетании с [Группировать по]/[Мерами]/[Процентными мерами]. Пожалуйста, выберите одно или другое." ], - "Delete Database?": ["Удалить базу данных?"], - "Please enter a SQLAlchemy URI to test": [ - "Введите SQLAlchemy URI для теста" + "You do not have permission to edit this chart": [ + "У вас нет прав на редактирование этого графика" ], - "Connection looks good!": ["Соединение в порядке!"], - "ERROR: Connection failed. ": ["ОШИБКА: Соединение не удалось."], - "Sorry there was an error fetching database information: %s": [ - "К сожалению, произошла ошибка при получении информации о базе данных: %s" + "You do not have permission to edit this dashboard": [ + "У вас нет прав на редактирование этого дашборда" ], - "Edit database": ["Редактировать Базу Данных"], - "Add database": ["Добавить Базу Данных"], - "Connection": ["Тестовое соединение"], - "Database name": ["Название таблицы"], - "Name your dataset": ["Назовите свой датасет"], - "dialect+driver://username:password@host:port/database": [ - "диалект+драйвер://пользователь:пароль@хост:порт/схема" + "You do not have permissions to access the datasource(s): %(name)s.": [ + "У вас нет доступа этого источника данных: %(name)s." ], - "Test connection": ["Тестовое соединение"], - "Refer to the ": ["Обратитесь сюда "], - "SQLAlchemy docs": ["SQLAlchemy URI"], - " for more information on how to structure your URI.": [ - " за подробной информацией по тому, как структурировать ваш URI" + "You do not have permissions to edit this dashboard.": [ + "У вас нет прав на редактирование этого дашборда." ], - "Performance": ["Производительность"], - "Chart cache timeout": ["Тайм-аут Кэша"], - "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.": [ - "Работа с базой данных в асинхронном режиме означает, что запросы исполняются на удалённых воркерах, а не на веб-сервере Superset. Это подразумевает, что у вас установка с воркерами Celery. Обратитесь к документации по настройке за дополнительной информацией." + "You don't have access to this chart.": [ + "Недостаточно прав для доступа к этому графику." ], - "SQL Lab settings": ["Лаборатория"], - "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...)": [ - "Позволяет пользователям запускать инструкции (UPDATE, DELETE, CREATE, …) без SELECT в редакторе SQL" + "You don't have access to this dashboard.": [ + "Недостаточно прав для доступа к этому дашборду." ], - "Allow multi schema metadata fetch": [""], - "CTAS schema": ["Схема по умолчанию"], - "When allowing CREATE TABLE AS option in SQL Lab, this option forces the table to be created in this schema.": [ - "При разрешении опции CREATE TABLE AS в лаборатории SQL, эта опция создаст таблицу в выбранной схеме." + "You don't have access to this dataset.": [ + "Недостаточно прав для доступа к этому датасету." ], - "Secure extra": ["Безопасность"], - "JSON string containing additional connection configuration.": [ - "Строка JSON, содержащая дополнительные параметры соединения." + "You don't have access to this embedded dashboard config.": [ + "У вас нет прав на редактирование этого встраиваемого дашборда." ], - "This is used to provide connection information for systems like Hive, Presto, and BigQuery, which do not conform to the username:password syntax normally used by SQLAlchemy.": [ - "Это используется для указания информации о соединении с такими системами как Hive, Presto и BigQuery, которые не укладываются в шаблон пользователь:пароль, который обычно используется в SQLAlchemy." + "You don't have any favorites yet!": ["У вас пока нет избранных!"], + "You don't have permission to modify the value.": [ + "Недостаточно прав для редактирования этого значения." ], - "Optional CA_BUNDLE contents to validate HTTPS requests. Only available on certain database engines.": [ - "" + "You don't have the rights to alter %(resource)s": [ + "Недостаточно прав для изменения %(resource)s" ], - "Impersonate Logged In User (Presto, Trino, Drill & Hive)": [ - "Ассоциировать пользователя" + "You don't have the rights to alter this chart": [ + "Недостаточно прав для изменения графика" ], - "If Presto, Trino or Drill all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them. If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.": [ - "Если вы используете Presto, все запросы в SQL-Редакторе будут выполняться от авторизованного пользователя, который должен иметь разрешение на их выполнение. <br/> Если включен Hive, то запросы будут выполняться через техническую учетную запись, но ассоциировать зарегистрированного пользователя можно через свойство hive.server2.proxy.user." + "You don't have the rights to alter this dashboard": [ + "Недостаточно прав для изменения дашборда" ], - "Allow data upload": ["Разрешить загрузку данных"], - "If selected, please set the schemas allowed for data upload in Extra.": [ - "Если установлено, выберите схемы, в которые разрешена загрузка на вкладке “Дополнительно”." + "You don't have the rights to alter this title.": [ + "Недостаточно прав для изменения названия." ], - "JSON string containing extra configuration elements.": [ - "Строка JSON, содержащая дополнительные элементы конфигурации." + "You don't have the rights to create a chart": [ + "Недостаточно прав для создания графика" ], - "1. The engine_params object gets unpacked into the sqlalchemy.create_engine call, while the metadata_params gets unpacked into the sqlalchemy.MetaData call.": [ - "" + "You don't have the rights to create a dashboard": [ + "Недостаточно прав для создания дашборда" ], - "2. The metadata_cache_timeout is a cache timeout setting in seconds for metadata fetch of this database. Specify it as \"metadata_cache_timeout\": {\"schema_cache_timeout\": 600, \"table_cache_timeout\": 600}. If unset, cache will not be enabled for the functionality. A timeout of 0 indicates that the cache never expires.": [ - "" + "You don't have the rights to download as csv": [ + "Недостаточно прав для скачивания в CSV" ], - "3. The schemas_allowed_for_file_upload is a comma separated list of schemas that CSVs are allowed to upload to. Specify it as \"schemas_allowed_for_file_upload\": [\"public\", \"csv_upload\"]. If database flavor does not support schema or any schema is allowed to be accessed, just leave the list empty.": [ - "" + "You have no permission to approve this request": [ + "Недостаточно прав для одобрения этого запроса" ], - "4. The version field is a string specifying this db's version. This should be used with Presto DBs so that the syntax is correct.": [ + "You have removed this filter.": ["Вы удалили фильтр."], + "You have unsaved changes.": ["У вас есть несохраненные изменения."], + "You have used all %(historyLength)s undo slots and will not be able to fully undo subsequent actions. You may save your current state to reset the history.": [ "" ], - "5. The allows_virtual_table_explore field is a boolean specifying whether or not the Explore button in SQL Lab results is shown.": [ - "" + "You must be a dataset owner in order to edit. Please reach out to a dataset owner to request modifications or edit access.": [ + "Вы должны быть владельцем датасета для его редактирования. Пожалуйста, обратитесь к владельцу с просьбой предоставить доступ." ], - "Error while saving dataset: %s": ["Ошибка при сохранении датасета: %s"], - "Add dataset": ["Добавить Базу Данных"], - "The passwords for the databases below are needed in order to import them together with the datasets. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "Пароли к базам данных требуются, чтобы импортировать их вместе с датасетами. Пожалуйста, обратите внимание, что разделы “Безопасность” и “Сертификат” конфигурации базы данных отсутствуют в экспортируемых файлах и должны быть добавлены после импорта вручную." + "You must pick a name for the new dashboard": [ + "Вы должны выбрать имя для нового дашборда" ], - "You are importing one or more datasets that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ - "Вы импортируете один или несколько датасетов, которые уже существуют. Перезапись может привести к потере части вашей работы. Вы уверены, что хотите продолжить?" + "You must run the query successfully first": [ + "Сначала необходимо успешно выполнить запрос" ], - "An error occurred while fetching dataset related data": [ - "Произошла ошибка при получении метаданных из таблицы" + "You need to configure HTML sanitization to use CSS": [""], + "You updated the values in the control panel, but the chart was not updated automatically. Run the query by clicking on the \"Update chart\" button or": [ + "Вы обновили значения в панели управления, но график не был обновлен автоматически. Сделайте запрос, нажав на кнопку \"Обновить график\" или" ], - "An error occurred while fetching dataset related data: %s": [ - "Произошла ошибка при получении данных о датасете: %s" + "You've changed datasets. Any controls with data (columns, metrics) that match this new dataset have been retained.": [ + "Вы изменили датасеты. Все элементы управления с данными (столбцами, мерами), которые соответствуют новому датасету, были сохранены." ], - "Physical dataset": ["Физический датасет"], - "Virtual dataset": ["Виртуальный датасет"], - "An error occurred while fetching dataset owner values: %s": [ - "Произошла ошибка при получении создателя датасета: %s" + "Your chart is not up to date": ["Ваш график не актуален"], + "Your chart is ready to go!": ["Ваш график готов!"], + "Your dashboard is too large. Please reduce its size before saving it.": [ + "Дашборд слишком большой. Пожалуйста, уменьшите его размер перед сохранением." ], - "An error occurred while fetching datasets: %s": [ - "Произошла ошибка при получении датасетов: %s" + "Your query could not be saved": ["Не удалось сохранить ваш запрос"], + "Your query could not be scheduled": [ + "Не удалось запланировать ваш запрос" ], - "An error occurred while fetching schema values: %s": [ - "Произошла ошибка при построении графика: %s" + "Your query could not be updated": ["Не удалось обновить ваш запрос"], + "Your query has been scheduled. To see details of your query, navigate to Saved queries": [ + "Запрос был запланирован. Чтобы посмотреть детали запроса, перейдите в Сохраненные запросы" ], - "There was an issue deleting the selected datasets: %s": [ - "Произошла ошибка при удалении выбранных датасетов: %s" + "Your query was not properly saved": [ + "Ваш запрос не был сохранен должным образом" ], - "The dataset %s is linked to %s charts that appear on %s dashboards. Are you sure you want to continue? Deleting the dataset will break those objects.": [ - "Датасет %s привязан к графикам %s, которые используются в дашбордах %s. Вы уверены, что хотите продолжить? Удаление датасета приведёт к неработоспособности этих объектов." + "Your query was saved": ["Ваш запрос был сохранен"], + "Your query was updated": ["Ваш запрос был сохранен"], + "Your report could not be deleted": ["Не удается удалить рассылку"], + "Zero imputation": ["Нулевые значения"], + "Zoom": ["Масштабирование"], + "Zoom level of the map": ["Уровень масштабирования карты"], + "[ untitled dashboard ]": ["[ безымянный дашборд ]"], + "[Longitude] and [Latitude] columns must be present in [Group By]": [ + "Столбцы [Долгота] и [Широта] должны присутствовать в [Группировать по]" ], - "Delete Dataset?": ["Удалить все?"], - "Are you sure you want to delete the selected datasets?": [ - "Вы уверены, что хотите удалить выбранные датасеты?" + "[Longitude] and [Latitude] must be set": [ + "[Долгота] и [Широта] должны быть заданы" ], - "0 Selected": ["Выполнить выбранный запрос"], - "%s Selected (Virtual)": ["%s Выбрано (Виртуальные)"], - "%s Selected (Physical)": ["%s Выбрано (Физические)"], - "%s Selected (%s Physical, %s Virtual)": [ - "%s Выбрано (%s Физические, %s Виртуальные)" + "[Missing Dataset]": ["[отсутствующий датасет]"], + "[Superset] Access to the datasource %(name)s was granted": [ + "[Суперсет] Предоставлен доступ к источнику данных %(name)s" ], - "There was an issue previewing the selected query. %s": [ - "Возникла ошибка при предпросмотре выбранных запросов: %s" + "[Untitled]": ["[Без названия]"], + "[dashboard name]": ["[имя дашборда]"], + "[desc]": [""], + "[optional] this secondary metric is used to define the color as a ratio against the primary metric. When omitted, the color is categorical and based on labels": [ + "[необязательно] вторичная мера используется для определения цвета как доли по отношению к основной мере. Если не выбрано, цвет задается согласно имени категории" ], - "Success": ["Успешно"], - "Failed": ["Ошибка"], - "Running": ["Выполняется"], - "Offline": [""], - "Scheduled": ["Запланировано"], - "Duration: %s": ["Продолжительность: %s"], - "Tab name": ["Имя Таблицы"], - "TABLES": ["ТАБЛИЦЫ"], - "Rows": ["Игнорировать"], - "Open query in SQL Lab": ["Открыть в SQL редакторе"], - "An error occurred while fetching database values: %s": [ - "Произошла ошибка при получении значений базы данных: %s" + "[untitled]": ["[без названия]"], + "`compare_columns` must have the same length as `source_columns`.": [""], + "`compare_type` must be `difference`, `percentage` or `ratio`": [""], + "`confidence_interval` must be between 0 and 1 (exclusive)": [ + "`доверительный_интервал` должен быть между 0 и 1 (не включая концы)" ], - "Search by query text": ["Поиск по тексту запроса"], - "Query preview": ["Предпросмотр данных"], - "Previous": ["Предпросмотр %s"], - "Next": ["След"], - "Open in SQL Lab": ["Открыть в SQL редакторе"], - "User query": ["Скопировать запрос"], - "Executed query": ["Выполнить выбранный запрос"], - "Saved queries": ["Сохраненные запросы"], - "There was an issue previewing the selected query %s": [ - "Произошла ошибка при предпросмотре выбранного запроса %s" + "`count` is COUNT(*) if a group by is used. Numerical columns will be aggregated with the aggregator. Non-numerical columns will be used to label points. Leave empty to get a count of points in each cluster.": [ + "" ], - "Link Copied!": ["Ссылка скопирована!"], - "There was an issue deleting the selected queries: %s": [ - "Произошла ошибка при удалении выбранных запросов: %s" + "`operation` property of post processing object undefined": [""], + "`prophet` package not installed": [""], + "`rename_columns` must have the same length as `columns`.": [""], + "`row_limit` must be greater than or equal to 0": [""], + "`row_offset` must be greater than or equal to 0": [""], + "`width` must be greater or equal to 0": [""], + "aggregate": ["агрегатная функция"], + "alert": ["оповещение"], + "alerts": ["оповещений"], + "all": ["Все"], + "also copy (duplicate) charts": [ + "также копировать (дублировать) графики" + ], + "ancestor": ["предок"], + "and": ["и"], + "annotation": ["аннотация"], + "annotation_layer": ["слой_аннотации"], + "asfreq": ["asfreq (без изменения)"], + "at": ["в"], + "auto": ["Автоматически"], + "auto (Smooth)": ["Автоматически (плавно)"], + "background": [""], + "below (example:": ["ниже (пример:"], + "between {down} and {up} {name}": [""], + "bfill": ["bfill (заполняет пропуски предыдущими значениями)"], + "bolt": [""], + "boolean type icon": [""], + "bottom": ["снизу"], + "button (cmd + z) until you save your changes.": [ + "(CTRL + Z), пока вы не сохраните изменения." ], - "Edit query": ["Редактировать запрос"], - "Copy query URL": ["Скопировать URL запроса"], - "Delete query": ["Удалить"], - "This action will permanently delete the saved query.": [ - "Это действие навсегда удалит сохранённый запрос." + "by using": [", используя"], + "cannot be empty": ["Необходимо заполнить"], + "chart": ["график"], + "charts": ["графики(ов)"], + "choose WHERE or HAVING...": ["выберите WHERE или HAVING..."], + "clear all filters": ["Сбросить все фильтры"], + "click here": ["нажмите сюда"], + "code ISO 3166-1 alpha-2 (cca2)": ["Код ISO 3166-1 alpha-2 (cca2)"], + "code ISO 3166-1 alpha-3 (cca3)": ["Код ISO 3166-1 alpha-3 (cca3)"], + "code International Olympic Committee (cioc)": [ + "Код Международного Олимпийского Комитета (cioc)" ], - "Delete Query?": ["Удалить запрос?"], - "Are you sure you want to delete the selected queries?": [ - "Вы уверены, что хотите удалить выбранные запросы?" + "column": ["столбец"], + "connecting to %(dbModelName)s.": ["подключении к %(dbModelName)s"], + "count": ["количество"], + "create": ["создать"], + "create a new chart": ["создать новый график"], + "create dataset from SQL query": ["создайте датасет из SQL запроса"], + "css": ["css"], + "css_template": ["шаблон_css"], + "cumsum": ["Кумулятивная сумма"], + "cumulative": ["кумулятивно"], + "dashboard": ["дашборд"], + "dashboards": ["дашборды(ов)"], + "database": ["база данных"], + "dataset": ["датасет"], + "dataset name": ["Имя датасета"], + "date": ["дата"], + "day": ["день"], + "day of the month": ["день месяца"], + "day of the week": ["день недели"], + "deck.gl 3D Hexagon": ["deck.gl 3D Шестигранники"], + "deck.gl Arc": ["deck.gl Дуга"], + "deck.gl Geojson": ["deck.gl GeoJSON"], + "deck.gl Grid": ["deck.gl Сетка"], + "deck.gl Multiple Layers": ["deck.gl Многослойный"], + "deck.gl Polygon": ["deck.gl Полигон"], + "deck.gl Scatterplot": ["deck.gl Точечная карта"], + "deckGL": ["Карта deckGL"], + "default": ["по умолчанию"], + "delete": ["удалить"], + "descendant": ["потомок"], + "description": ["описание"], + "dialect+driver://username:password@host:port/database": [ + "диалект+драйвер://пользователь:пароль@хост:порт/схема" ], - "Query name": ["Страна"], - "Edited": ["Редактировано"], - "Created": ["Создано"], - "Viewed": ["Просмотрено"], - "Examples": ["Примеры"], - "Mine": ["Мои"], - "Recently viewed charts, dashboards, and saved queries will appear here": [ - "Недавно просмотренные графики, дашборды и сохранённые запросы" + "draft": ["черновик"], + "dttm": ["Дата/время"], + "e.g. ********": ["например, ********"], + "e.g. 127.0.0.1": ["например, 127.0.0.1"], + "e.g. 5432": ["например, 5432"], + "e.g. AccountAdmin": [""], + "e.g. Analytics": ["например, Analytics"], + "e.g. compute_wh": [""], + "e.g. param1=value1¶m2=value2": [ + "например, параметр1=значение1&параметр2=значение2" + ], + "e.g. sql/protocolv1/o/12345": [""], + "e.g. world_population": ["например, health_medicine"], + "e.g. xy12345.us-east-2.aws": [""], + "e.g., a \"user id\" column": [ + "например, столбец \"идентификатор пользователя\"" + ], + "edit mode": ["режиме редактирования"], + "every": ["каждые"], + "every day of the month": ["каждый день месяца"], + "every day of the week": ["каждый день недели"], + "every hour": ["каждый час"], + "every minute": ["каждая минута"], + "every month": ["каждый месяц"], + "expand": ["развернуть"], + "explore": ["исследовать"], + "ffill": ["ffill (заполняет пропуски следующими значениями)"], + "filter_box will be deprecated in a future version of Superset. Please replace filter_box by dashboard filter components.": [ + "filter_box устарел и будет удален в будущей версии Суперсета. Пожалуйста, замените его фильтрами в левой панели дашборда." + ], + "flat": [""], + "for more information on how to structure your URI.": [ + " за подробной информацией по тому, как структурировать ваш URI" ], - "Recently created charts, dashboards, and saved queries will appear here": [ - "Недавно созданные графики, дашборды и сохранённые запросы" + "function type icon": [""], + "geohash (square)": [""], + "green": ["Зеленая"], + "heatmap": ["тепловая карта"], + "heatmap: values are normalized across the entire heatmap": [ + "тепловая карта: значения нормализованы внутри всей карты" ], - "Recent example charts, dashboards, and saved queries will appear here": [ - "Примеры графиков, дашбордов и сохранённых запросов" + "here": ["здесь"], + "hour": ["час"], + "id": ["идентификатор"], + "image-rendering CSS attribute of the canvas object that defines how the browser scales up the image": [ + "" ], - "Recently edited charts, dashboards, and saved queries will appear here": [ - "Недавно изменённые графики, дашборды и сохранённые запросы" + "in": ["в"], + "in modal": ["в модальном окне"], + "is expected to be a number": ["Ожидается число"], + "is expected to be an integer": ["Ожидается целое число"], + "joined": ["Присоединился"], + "json isn't valid": ["JSON не валиден"], + "key a-z": ["По алфавиту А-Я"], + "key z-a": ["По алфавиту Я-А"], + "label": ["метка"], + "last day": ["последний день"], + "last month": ["последний месяц"], + "last quarter": ["последний квартал"], + "last week": ["последняя неделя"], + "last year": ["последний год"], + "latest partition:": ["последний раздел:"], + "left": ["слева"], + "less than {min} {name}": [""], + "log": ["журнал"], + "lower percentile must be greater than 0 and less than 100. Must be lower than upper percentile.": [ + "Нижний процентиль должен быть больше 0 и меньше 100. Должен быть ниже верхнего процентиля" ], - "${tableName\n .split('')\n .slice(0, tableName.length - 1)\n .join('')}\n ": [ + "max": ["Максимум"], + "mean": ["Среднее"], + "median": ["Медиана"], + "metric": ["мера"], + "min": ["Минимум"], + "minute": ["минута"], + "minute(s)": ["минут"], + "month": ["месяц"], + "more than {max} {name}": [""], + "must have a value": ["значение обязательно"], + "name": ["имя"], + "no SQL validator is configured": ["не настроен ни один SQL валидатор"], + "no SQL validator is configured for {}": [ + "не настроен ни один SQL валидатор для {}" + ], + "numeric type icon": [""], + "nvd3": ["Графики nvd3"], + "on": ["по"], + "or use existing ones from the panel on the right": [ + "или использовать уже существующие из панели справа" + ], + "p-value precision": ["точность p-значения"], + "p1": ["p1"], + "p5": ["p5"], + "p95": ["p95"], + "p99": ["p99"], + "page_size.all": [""], + "page_size.entries": [""], + "page_size.show": [""], + "percentile (exclusive)": ["перцентиль (исключая)"], + "percentiles must be a list or tuple with two numeric values, of which the first is lower than the second value": [ "" ], - "You don't have any favorites yet!": ["У вас пока нет избранного!"], - "SQL Lab queries": ["Лаборатория"], - "${tableName}": ["Имя Таблицы"], + "permalink state not found": [""], + "pixelated (Sharp)": [""], + "previous calendar month": ["предыдущий календарный месяц"], + "previous calendar week": ["предыдущая календарная неделя"], + "previous calendar year": ["предыдущий календарный год"], + "published": ["опубликовано"], + "quarter": ["Квартал"], + "queries": ["запросы"], "query": ["запрос"], - "Share": ["Поделиться"], - "Last run %s": ["Последнее выполнение %s"], - "Recents": ["Последние"], - "Select start and end date": ["Выберите дату начала"], - "Type or Select [%s]": ["Выбрать [%s]"], - "Filter box": ["Фильтр"], - "Filters configuration": ["Изменение настроек таблицы"], - "Filter configuration for the filter box": ["Настройки фильтра"], - "Date filter": ["Временной фильтр"], - "Whether to include a time filter": [ - "Включить фильтр на определенный интервал/диапазон времени" + "random": ["случайно"], + "reboot": ["обновить"], + "recent": ["недавние"], + "recents": ["недавние(их)"], + "red": ["Красная"], + "report": ["рассылка"], + "reports": ["рассылки"], + "restore zoom": ["восстановить масштабирование"], + "right": ["справа"], + "saved queries": ["сохраненные(ых) запросы(ов)"], + "seconds": ["секунд"], + "series": ["категории"], + "series: Treat each series independently; overall: All series use the same scale; change: Show changes compared to the first data point in each series": [ + "" ], - "Instant filtering": ["Мгновенная Фильтрация"], - "Check to apply filters instantly as they change instead of displaying [Apply] button": [ + "std": ["Стандартное отклонение"], + "step-after": [""], + "step-before": [""], + "stream": ["поток"], + "string type icon": [""], + "sum": ["Сумма"], + "syntax.": [""], + "temporal type icon": [""], + "textarea": ["текстовая область"], + "to": ["по"], + "top": ["сверху"], + "undo": ["отмены"], + "unknown type icon": [""], + "upper percentile must be greater than 0 and less than 100. Must be higher than lower percentile.": [ "" ], - "Show SQL granularity dropdown": [""], - "Check to include SQL granularity dropdown": [""], - "Show SQL time column": ["Показать колонку Druid"], - "Check to include time column dropdown": [ - "Включить фильтр на определенный интервал/диапазон времени" + "value ascending": ["Значение по возрастанию"], + "value descending": ["Значение по убыванию"], + "var": ["Дисперсия"], + "variance": ["Дисперсия"], + "virtual": ["Виртуальный"], + "viz type": ["тип визуализации"], + "was created": ["создан(а)"], + "week": ["неделя"], + "week ending Saturday": ["неделя, заканчивающаяся в субботу"], + "week starting Sunday": ["неделя, начинающаяся в воскресенье"], + "x": ["x"], + "x: values are normalized within each column": [ + "x: значения нормализованы внутри каждого столбца" ], - "Show Druid granularity dropdown": [""], - "Check to include Druid granularity dropdown": [""], - "Show Druid time origin": ["Показать Druid Метрики"], - "Check to include time origin dropdown": [ - "Включить фильтр на определенный интервал/диапазон времени" + "y": ["y"], + "y: values are normalized within each row": [ + "y: значения нормализованы внутри каждой строки" ], - "Limit selector values": [""], - "These filters apply to the values available in the dropdowns": [""], - "Time-series Table": ["Таблица временных рядов"] + "year": ["год"], + "yellow": ["Желтая"], + "zoom area": ["область масштабирования"] } } } diff --git a/superset/translations/ru/LC_MESSAGES/messages.po b/superset/translations/ru/LC_MESSAGES/messages.po index 8cfde5eed55c..5df8aae967d6 100644 --- a/superset/translations/ru/LC_MESSAGES/messages.po +++ b/superset/translations/ru/LC_MESSAGES/messages.po @@ -17,19 +17,20 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-12-08 12:22+0800\n" -"PO-Revision-Date: 2021-04-29 02:41+0300\n" -"Last-Translator: Aleksandr Gordienko\n" +"POT-Creation-Date: 2023-02-06 11:42+0300\n" +"PO-Revision-Date: 2023-01-09 14:32+0300\n" +"Last-Translator: Artem Shumeiko\n" "Language: ru\n" "Language-Team: Russian <>\n" -"Plural-Forms: nplurals=1; plural=0\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.1\n" +"Generated-By: Babel 2.11.0\n" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/Option.tsx:68 -#: superset-frontend/src/explore/components/controls/OptionControls/index.tsx:323 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/Option.tsx:71 +#: superset-frontend/src/explore/components/controls/OptionControls/index.tsx:329 msgid "" "\n" " This filter was inherited from the dashboard's context.\n" @@ -38,69 +39,50 @@ msgid "" msgstr "" "\n" " Фильтр был наследован из контекста дашборда.\n" -" Это не будет сохранено при сохранении графика.\n" +" Он не будет сохранен при сохранении графика.\n" " " -#: superset/tasks/schedules.py:184 +#: superset/reports/notifications/email.py:89 #, python-format msgid "" "\n" -" <b><a href=\"%(url)s\">Explore in Superset</a></b><p></p>\n" -" <img src=\"cid:%(msgid)s\">\n" +" Error: %(text)s\n" " " msgstr "" "\n" -" <b><a href=“%(url)s”>Исследовать в Superset</a></b><p></p>\n" -" <img src=“cid:%(msgid)s”>\n" +" Ошибка: %(text)s\n" " " -#: superset/reports/notifications/email.py:60 -#, python-format -msgid "" -"\n" -" Error: %(text)s\n" -" " -msgstr "" +#: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:129 +msgid " (excluded)" +msgstr " (исключено)" -#: superset/tasks/schedules.py:159 -#, python-format +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:222 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:235 msgid "" -"\n" -" *%(name)s*\n" -"\n" -" <%(url)s|Explore in Superset>\n" -" " +" Set the opacity to 0 if you do not want to override the color specified " +"in the GeoJSON" msgstr "" -"\n" -" *%(name)s*\n" -"\n" -" <%(url)s|Исследовать в Superset>\n" -" " +" Установите прозрачность 0, если вы не хотите переписывать цвет, " +"указанный в GeoJSON" -#: superset/tasks/schedules.py:372 -#, python-format -msgid "" -"\n" -" *%(slice_name)s*\n" -"\n" -" <%(slice_url_user_friendly)s|Explore in Superset>\n" -" " -msgstr "" -"\n" -" *%(slice_name)s*\n" -"\n" -" <%(slice_url_user_friendly)s|Исследовать в Superset>\n" -" " +#: superset-frontend/src/explore/components/SaveModal.tsx:354 +msgid " a dashboard OR " +msgstr " дашборд или " -#: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:122 -msgid " (excluded)" -msgstr "" +#: superset-frontend/src/explore/components/SaveModal.tsx:356 +msgid " a new one" +msgstr " новый" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:235 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:302 msgid " expression which needs to adhere to the " -msgstr "" +msgstr ", который должен придерживаться " + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:48 +msgid " source code of Superset's sandboxed parser" +msgstr " исходный код sandboxed парсера Суперсета" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:239 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:306 msgid "" " standard to ensure that the lexicographical ordering\n" " coincides with the chronological ordering. If the\n" @@ -117,199 +99,260 @@ msgid "" "defaults on a per\n" " database/column name level via the extra parameter." msgstr "" +" стандарта для обеспечения того, чтобы лексикографический порядок " +"совпадал с хронологическим порядком. Если формат временной метки не " +"соответствует стандарту ISO 8601, вам нужно будет определить выражение и " +"тип для преобразования строки в дату или временную метку. В настоящее " +"время часовые пояса не поддерживаются. Если время хранится в формате " +"эпохи, введите \\`epoch_s\\` или \\`epoch_ms\\`. Если шаблон не указан, " +"будут использованы необязательные значения по умолчанию на уровне имен " +"для каждой базы данных/столбца с помощью дополнительного параметра." -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:111 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:332 +msgid " to add calculated columns" +msgstr " для добавления вычисляемых столбцов" + +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:397 +msgid " to add metrics" +msgstr " для добавления мер" + +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:381 +msgid " to edit or add columns and metrics." +msgstr " для редактирования или добавления столбцов и мер." + +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:321 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:356 +msgid " to mark a column as a time column" +msgstr ", чтобы пометить столбец как столбец даты/времени" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/MessageContent.tsx:46 +msgid " to open SQL Lab. From there you can save the query as a dataset." +msgstr " в Лаборатории SQL. Там вы сможете сохранить запрос как датасет." + +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:332 +msgid " to visualize your data." +msgstr " для визуализации ваших данных." + +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:109 msgid "!= (Is not equal)" msgstr "!= (не равно)" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:125 -msgid "" -"${tableName\n" -" .split('')\n" -" .slice(0, tableName.length - 1)\n" -" .join('')}\n" -" " -msgstr "" - #: superset/security/analytics_db_safety.py:44 -#, fuzzy, python-format +#, python-format msgid "%(dialect)s cannot be used as a data source for security reasons." msgstr "" -"БД SQLite не может быть использована как источник данных из-за " -"потенциальных проблем с безопасностью." +"%(dialect)s не может использоваться в качестве источника данных по " +"соображениям безопасности." -#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:84 -#, fuzzy, python-format +#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:83 +#, python-format msgid "" "%(message)s\n" "This may be triggered by: \n" "%(issues)s" -msgstr "Триггеры:" +msgstr "" +"%(message)s\n" +"Возможные причины: \n" +"%(issues)s" -#: superset/reports/notifications/email.py:122 superset/tasks/schedules.py:364 +#: superset/reports/notifications/email.py:174 #, python-format msgid "%(name)s.csv" msgstr "%(name)s.csv" -#: superset/db_engine_specs/snowflake.py:99 +#: superset/db_engine_specs/snowflake.py:108 #, python-format msgid "%(object)s does not exist in this database." -msgstr "" +msgstr "%(object)s не существует в этой базе данных." + +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:102 +#, python-format +msgid "%(other)s %(tableName)s will appear here" +msgstr "%(other)s %(tableName)s появятся здесь после добавления" -#: superset/reports/notifications/email.py:126 superset/tasks/schedules.py:296 -#: superset/tasks/schedules.py:465 +#: superset/reports/notifications/email.py:183 #, python-format msgid "%(prefix)s %(title)s" msgstr "%(prefix)s %(title)s" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:635 -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:642 -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:656 -#, fuzzy, python-format +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:342 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:360 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:374 +#, python-format msgid "%(rows)d rows returned" -msgstr "строк получено" +msgstr "Получено строк: %(rows)d" #: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:93 -#, fuzzy, python-format +#, python-format msgid "" "%(subtitle)s\n" "This may be triggered by:\n" " %(issue)s" -msgstr "Триггеры:" +msgstr "" +"%(subtitle)s\n" +"Возможные причины:\n" +" %(issue)s" #: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:88 #, python-format msgid "%(suggestion)s instead of \"%(undefinedParameter)s?\"" -msgstr "" - -#: superset/views/core.py:366 +msgid_plural "" +"%(firstSuggestions)s or %(lastSuggestion)s instead of " +"\"%(undefinedParameter)s\"?" +msgstr[0] "%(suggestion)s вместо \"%(undefinedParameter)s\"?" +msgstr[1] "" +"%(firstSuggestions)s или %(lastSuggestion)s вместо " +"\"%(undefinedParameter)s\"?" +msgstr[2] "" +"%(firstSuggestions)s или %(lastSuggestion)s вместо " +"\"%(undefinedParameter)s\"?" + +#: superset/views/core.py:382 #, python-format msgid "" "%(user)s was granted the role %(role)s that gives access to the " "%(datasource)s" msgstr "" -"%(user)s была предоставлена роль %(role)s, которая дает доступ к ресурсам" -" %(datasource)s" +"%(user)s была назначена роль %(role)s, которая дает доступ к " +"%(datasource)s" -#: superset/views/core.py:2773 +#: superset/views/core.py:2647 #, python-format msgid "%(user)s's profile" -msgstr "Профиль пользователя %(user)s" +msgstr "%(user)s - профиль" -#: superset/views/core.py:2442 +#: superset/databases/commands/validate_sql.py:73 superset/views/core.py:2302 #, python-format msgid "" "%(validator)s was unable to check your query.\n" "Please recheck your query.\n" "Exception: %(ex)s" msgstr "" +"%(validator)s не смог проверить ваш запрос.\n" +"Пожалуйста, перепроверьте ваш запрос.\n" +"Ошибка: %(ex)s" -#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:170 -#, python-format -msgid "%s - untitled" -msgstr "%s - без названия" - -#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:90 +#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:89 #, python-format msgid "%s Error" msgstr "%s Ошибка" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1184 +#, python-format +msgid "%s PASSWORD" +msgstr "%s ПАРОЛЬ" + #: superset-frontend/src/components/ListView/ListView.tsx:244 #, python-format msgid "%s Selected" msgstr "%s Выбрано" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:685 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:836 #, python-format msgid "%s Selected (%s Physical, %s Virtual)" msgstr "%s Выбрано (%s Физические, %s Виртуальные)" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:678 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:829 #, python-format msgid "%s Selected (Physical)" msgstr "%s Выбрано (Физические)" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:671 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:822 #, python-format msgid "%s Selected (Virtual)" msgstr "%s Выбрано (Виртуальные)" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:311 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:310 #, python-format msgid "%s aggregates(s)" -msgstr "%s агрегат(ы)" +msgstr "Агрегатных функций: %s" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:249 -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:270 -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:286 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:302 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:272 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:369 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:347 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:301 #, python-format msgid "%s column(s)" -msgstr "Столбец(ы) %s" +msgstr "Столбцов: %s" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:276 -#, python-format -msgid "%s column(s) and metric(s)" -msgstr "%s столбец(ы) и показатель(и)" - -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:297 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:357 #, python-format msgid "%s operator(s)" msgstr "%s параметр(ы)" -#: superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx:83 -#: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:256 -#: superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx:82 -#: superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx:92 -#, fuzzy, python-format +#: superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx:87 +#: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:264 +#: superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx:86 +#: superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx:96 +#, python-format msgid "%s option" -msgstr "%s параметр(ы)" +msgid_plural "%s options" +msgstr[0] "%s вариант" +msgstr[1] "%s варианта" +msgstr[2] "%s вариантов" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:252 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:322 #, python-format msgid "%s option(s)" -msgstr "%s параметр(ы)" +msgstr "%s вариант(ов)" + +#: superset-frontend/src/explore/components/RowCountLabel/index.tsx:43 +#, python-format +msgid "%s row" +msgid_plural "%s rows" +msgstr[0] "%s строка" +msgstr[1] "%s строки" +msgstr[2] "%s строк" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:320 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:319 #, python-format msgid "%s saved metric(s)" -msgstr "%s сохранённый показатель(и)" +msgstr "Сохраненная мер: %s" + +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:617 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:633 +#, python-format +msgid "%s updated" +msgstr "Обновлено: %s" -#: superset-frontend/src/components/URLShortLinkButton/index.jsx:59 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:123 +#: superset-frontend/src/SqlLab/utils/newQueryTabName.ts:43 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:127 #, python-format msgid "%s%s" -msgstr "" +msgstr "%s%s" -#: superset-frontend/src/components/ListView/ListView.tsx:419 -#: superset-frontend/src/components/TableView/TableView.tsx:237 +#: superset-frontend/src/components/ListView/ListView.tsx:438 +#: superset-frontend/src/components/TableView/TableView.tsx:250 #, python-format msgid "%s-%s of %s" -msgstr "" +msgstr "%s-%s из %s" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitleContainer.tsx:110 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitleContainer.tsx:115 msgid "(Removed)" msgstr "(Удалено)" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:637 -#, fuzzy -msgid "(deleted)" -msgstr "удалить" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:92 +msgid "(deleted or invalid type)" +msgstr "(удалено или невалидный тип)" -#: superset-frontend/src/utils/getClientErrorObject.ts:56 +#: superset-frontend/src/utils/getClientErrorObject.ts:76 msgid "(no description, click to see stack trace)" -msgstr "" +msgstr "(нет описания, нажмите для просмотра трассировки стека)" #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:168 msgid "" "(optional) default value for the filter, when using the multiple option, " "you can use a semicolon-delimited list of options." msgstr "" -"(опционально) значение по-умолчанию для фильтраю. Когда используются " +"(опционально) значение по умолчанию для фильтра. Когда используются " "множественные значения, вы можете вставить список значений, разделённых " "символами точка с запятой" -#: superset/reports/notifications/slack.py:50 +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:71 +msgid "), and they become available in your SQL (example:" +msgstr "), и они станут доступны в ваших SQL запросах (пример:" + +#: superset/reports/notifications/slack.py:71 #, python-format msgid "" "*%(name)s*\n" @@ -320,8 +363,15 @@ msgid "" "\n" "%(table)s\n" msgstr "" +"*%(name)s*\n" +"\n" +"%(description)s\n" +"\n" +"<%(url)s|Исследовать в Суперсете>\n" +"\n" +"%(table)s\n" -#: superset/reports/notifications/slack.py:67 +#: superset/reports/notifications/slack.py:88 #, python-format msgid "" "*%(name)s*\n" @@ -330,112 +380,352 @@ msgid "" "\n" "Error: %(text)s\n" msgstr "" +"*%(name)s*\n" +"\n" +"%(description)s\n" +"\n" +"Ошибка: %(text)s\n" + +#: superset-frontend/src/components/ListView/CrossLinksTooltip.tsx:64 +#, python-format +msgid "+ %s more" +msgstr "+ еще %s" -#: superset-frontend/src/explore/components/SaveModal.tsx:35 -msgid "**Select** a dashboard OR **create** a new one" -msgstr "**Выберите** дашборд ИЛИ **создайте** новый" +#: superset/views/database/forms.py:153 +msgid "," +msgstr "," -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:260 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:626 msgid "" "-- Note: Unless you save your query, these tabs will NOT persist if you " "clear your cookies or change browsers.\n" "\n" msgstr "" +"-- Примечание: Пока вы не сохраните ваш запрос, эти вкладки НЕ будут " +"сохранены, если вы очистите куки или смените браузер.\n" +"\n" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:668 -msgid "0 Selected" -msgstr "Выполнить выбранный запрос" +#: superset/views/database/forms.py:154 +msgid "." +msgstr "." -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:35 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:819 +msgid "0 Selected" +msgstr "0 выбрано" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:165 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:238 +msgid "1 calendar day frequency" +msgstr "Дневная частота" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:168 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:306 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:188 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:456 +#: superset-frontend/src/explore/controlPanels/sections.tsx:184 +#: superset-frontend/src/explore/controls.jsx:262 +msgid "1 day" +msgstr "1 день" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:112 +msgid "1 day ago" +msgstr "1 день назад" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:166 +#: superset-frontend/src/explore/controls.jsx:260 msgid "1 hour" msgstr "1 час" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:32 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:164 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:237 +msgid "1 hourly frequency" +msgstr "Часовая частота" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:163 +#: superset-frontend/src/explore/controls.jsx:257 msgid "1 minute" msgstr "1 минута" -#: superset/db_engine_specs/base.py:91 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:163 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:236 +msgid "1 minutely frequency" +msgstr "Минутная частота" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:168 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:241 +msgid "1 month end frequency" +msgstr "Месячная частота (конец месяца)" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:167 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:240 +msgid "1 month start frequency" +msgstr "Месячная частота (начало месяца)" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:307 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:189 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:457 +#: superset-frontend/src/explore/controlPanels/sections.tsx:185 +msgid "1 week" +msgstr "1 неделя" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:113 +msgid "1 week ago" +msgstr "1 неделя назад" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:62 +msgid "1 week starting Monday (freq=W-MON)" +msgstr "1 неделя с началом в Понедельник (част=W-MON)" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:61 +msgid "1 week starting Sunday (freq=W-SUN)" +msgstr "1 неделя с началом в Воскресенье (част=W-SUN)" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:311 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:193 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:461 +#: superset-frontend/src/explore/controlPanels/sections.tsx:189 +msgid "1 year" +msgstr "1 год" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:117 +msgid "1 year ago" +msgstr "1 год назад" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:170 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:243 +msgid "1 year end frequency" +msgstr "Годовая частота (конец года)" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:169 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:242 +msgid "1 year start frequency" +msgstr "Годовая частота (начало года)" + +#: superset/db_engine_specs/base.py:105 msgid "10 minute" -msgstr "1 минута" +msgstr "10 минут" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:30 -msgid "10 seconds" -msgstr "10 секунд" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:312 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:194 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:462 +#: superset-frontend/src/explore/controlPanels/sections.tsx:190 +msgid "104 weeks" +msgstr "104 недели" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:37 -msgid "12 hours" -msgstr "12 часов" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:118 +msgid "104 weeks ago" +msgstr "104 недели назад" -#: superset/db_engine_specs/base.py:92 -#, fuzzy +#: superset/db_engine_specs/base.py:106 msgid "15 minute" -msgstr "1 минута" +msgstr "15 минут" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:38 -msgid "24 hours" -msgstr "24 часа" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:314 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:196 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:464 +#: superset-frontend/src/explore/controlPanels/sections.tsx:192 +msgid "156 weeks" +msgstr "156 недель" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:32 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:120 +msgid "156 weeks ago" +msgstr "156 недель назад" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:360 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:242 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:512 +#: superset-frontend/src/explore/controlPanels/sections.tsx:238 +msgid "1AS" +msgstr "1С" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:357 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:239 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:509 +#: superset-frontend/src/explore/controlPanels/sections.tsx:235 +msgid "1D" +msgstr "1Д" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:356 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:238 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:508 +#: superset-frontend/src/explore/controlPanels/sections.tsx:234 +msgid "1H" +msgstr "1Ч" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:359 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:241 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:511 +#: superset-frontend/src/explore/controlPanels/sections.tsx:237 +msgid "1M" +msgstr "1М" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:355 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:237 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:507 +#: superset-frontend/src/explore/controlPanels/sections.tsx:233 +msgid "1T" +msgstr "1МИН" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:313 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:195 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:463 +#: superset-frontend/src/explore/controlPanels/sections.tsx:191 +msgid "2 years" +msgstr "2 года" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:119 +msgid "2 years ago" +msgstr "2 года назад" + +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:96 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:49 +msgid "2/98 percentiles" +msgstr "2/98 перцентели" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:126 +msgid "22" +msgstr "22" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:308 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:190 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:458 +#: superset-frontend/src/explore/controlPanels/sections.tsx:186 +msgid "28 days" +msgstr "28 дней" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:114 +msgid "28 days ago" +msgstr "28 дней назад" + +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:35 #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:35 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:37 msgid "2D" -msgstr "" +msgstr "2D карты" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:116 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:136 msgid "3 letter code of the country" -msgstr "каждый день месяца" +msgstr "3х буквенный код страны" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:128 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:315 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:197 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:465 +#: superset-frontend/src/explore/controlPanels/sections.tsx:193 +msgid "3 years" +msgstr "3 года" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:121 +msgid "3 years ago" +msgstr "3 года назад" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:309 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:191 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:459 +#: superset-frontend/src/explore/controlPanels/sections.tsx:187 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:124 msgid "30 days" msgstr "30 дней" -#: superset/db_engine_specs/base.py:93 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:115 +msgid "30 days ago" +msgstr "30 дней назад" + +#: superset/db_engine_specs/base.py:107 msgid "30 minute" msgstr "30 минут" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:34 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:165 +#: superset-frontend/src/explore/controls.jsx:259 msgid "30 minutes" msgstr "30 минут" -#: superset/db_engine_specs/base.py:88 -#, fuzzy +#: superset/db_engine_specs/base.py:102 msgid "30 second" msgstr "30 секунд" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:31 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:162 +#: superset-frontend/src/explore/controls.jsx:256 msgid "30 seconds" msgstr "30 секунд" -#: superset/db_engine_specs/base.py:90 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:35 +msgid "3D" +msgstr "3D карты" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:64 +msgid "4 weeks (freq=4W-MON)" +msgstr "4 недели (част=4W-MON)" + +#: superset/db_engine_specs/base.py:104 msgid "5 minute" msgstr "5 минут" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:33 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:164 +#: superset-frontend/src/explore/controls.jsx:258 msgid "5 minutes" msgstr "5 минут" -#: superset/db_engine_specs/base.py:87 -#, fuzzy +#: superset/db_engine_specs/base.py:101 msgid "5 second" -msgstr "30 секунд" - -#: superset/db_engine_specs/base.py:95 -#, fuzzy +msgstr "5 секунд" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:161 +#: superset-frontend/src/explore/controls.jsx:255 +msgid "5 seconds" +msgstr "5 секунд" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:310 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:192 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:460 +#: superset-frontend/src/explore/controlPanels/sections.tsx:188 +msgid "52 weeks" +msgstr "52 недели" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:116 +msgid "52 weeks ago" +msgstr "52 недели назад" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:60 +msgid "52 weeks starting Monday (freq=52W-MON)" +msgstr "52 недели с началом в Понедельник (част=52W-MON)" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:167 +#: superset-frontend/src/explore/controls.jsx:261 +#: superset/db_engine_specs/base.py:109 msgid "6 hour" msgstr "6 часов" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:36 -msgid "6 hours" -msgstr "6 часов" - -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:132 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:128 msgid "60 days" msgstr "60 дней" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:136 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:166 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:239 +msgid "7 calendar day frequency" +msgstr "Недельная частота" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:169 +#: superset-frontend/src/explore/controls.jsx:263 +msgid "7 days" +msgstr "7 дней" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:358 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:240 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:510 +#: superset-frontend/src/explore/controlPanels/sections.tsx:236 +msgid "7D" +msgstr "7Д" + +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:97 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:50 +msgid "9/91 percentiles" +msgstr "9/91 перцентели" + +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:132 msgid "90 days" msgstr "90 дней" @@ -443,24 +733,40 @@ msgstr "90 дней" msgid ":" msgstr ":" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:86 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:89 msgid "< (Smaller than)" msgstr "< (меньше чем)" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:96 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:97 msgid "<= (Smaller or equal)" msgstr "<= (меньше или равно)" -#: superset/tasks/schedules.py:171 superset/tasks/schedules.py:365 -#, python-format -msgid "<b><a href=\"%(url)s\">Explore in Superset</a></b><p></p>" -msgstr "<b><a href=“%(url)s”>Исследовать в Superset</a></b><p></p>" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1424 +msgid "<enter SQL expression here>" +msgstr "<введите SQL выражение>" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:494 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1421 +msgid "<new column>" +msgstr "<новый столбец>" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1259 +msgid "<new metric>" +msgstr "<новая мера>" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:979 +msgid "<new spatial>" +msgstr "<новая пространственная мера>" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:106 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:980 +msgid "<no type>" +msgstr "<без типа>" + +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:105 msgid "== (Is equal)" msgstr "== (равно)" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:91 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:93 msgid "> (Larger than)" msgstr "> (больше чем)" @@ -468,119 +774,145 @@ msgstr "> (больше чем)" msgid ">= (Larger or equal)" msgstr ">= (больше или равно)" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:35 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:34 msgid "A Big Number" -msgstr "Big Number" +msgstr "Карточка" -#: superset/views/alerts.py:195 -msgid "" -"A SQL statement that defines whether the alert should get triggered or " -"not. The query is expected to return either NULL or a number value." +#: superset/views/database/forms.py:184 +msgid "A comma separated list of columns that should be parsed as dates" msgstr "" -"SQL-выражение, которое определяет сработало оповещение или нет. Запрос " -"должен вернуть NULL или числовое значение." +"Разделённый запятыми список столбцов, которые должны быть " +"интерпретированы как даты." -#: superset/views/database/forms.py:204 superset/views/database/forms.py:341 +#: superset/views/database/forms.py:367 msgid "A comma separated list of columns that should be parsed as dates." msgstr "" -"Разделённый запятыми список столбцов, которые должен быть " +"Разделённый запятыми список столбцов, которые должны быть " "интерпретированы как даты." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:383 -#, fuzzy -msgid "A comma-separated list of schemas that CSVs are allowed to upload to." -msgstr "" -"Разделённый запятыми список столбцов, которые должен быть " -"интерпретированы как даты." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:433 +msgid "A comma-separated list of schemas that files are allowed to upload to." +msgstr "Разделённый запятыми список схем, в которые можно загружать файлы." #: superset/databases/commands/exceptions.py:42 -#, fuzzy msgid "A database with the same name already exists." -msgstr "Источник данных %(name)s уже существует" +msgstr "База данных с таким же именем уже существует" #: superset/views/dynamic_plugins.py:52 msgid "" "A full URL pointing to the location of the built plugin (could be hosted " "on a CDN for example)" msgstr "" +"Полный URL, указывающий на местоположение плагина (например, ссылка на " +"CDN)" + +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/handlebarTemplate.tsx:61 +msgid "A handlebars template that is applied to the data" +msgstr "Шаблон handlebars, примененный к данным" #: superset/views/dynamic_plugins.py:47 msgid "A human-friendly name" -msgstr "Понятное человеку имя" +msgstr "Человекочитаемое имя" -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:300 +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:195 +msgid "" +"A list of domain names that can embed this dashboard. Leaving this field " +"empty will allow embedding from any domain." +msgstr "" +"Список доменных имен, которые могут встраивать этот дашборд. Если " +"оставить поле пустым, любой домен сможет сделать встраивание." + +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:313 msgid "A list of users who can alter the chart. Searchable by name or username." -msgstr "Владельцы - это пользователи, которые могут изменять график." +msgstr "Владельцы - это пользователи, которые могут изменять график" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:29 msgid "A map of the world, that can indicate values in different countries." -msgstr "" +msgstr "Карта мира, на которой могут быть указаны значения в разных странах." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:161 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:209 -#: superset-frontend/src/explore/controls.jsx:238 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:27 +msgid "" +"A map that takes rendering circles with a variable radius at " +"latitude/longitude coordinates" +msgstr "На карте отображаются маркеры переменного радиуса и цвета." + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:230 +#: superset-frontend/src/explore/controls.jsx:237 msgid "A metric to use for color" msgstr "Показатель, используемый для расчета цвета" -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:26 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:28 msgid "" "A polar coordinate chart where the circle is broken into wedges of equal " "angle, and the value represented by any wedge is illustrated by its area," " rather than its radius or sweep angle." msgstr "" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:523 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:599 msgid "A readable URL for your dashboard" msgstr "Читаемый URL-адрес для дашборда" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:39 +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:45 #: superset-frontend/src/explore/controls.jsx:113 msgid "A reference to the [Time] configuration, taking granularity into account" msgstr "" -#: superset/views/alerts.py:189 -msgid "A semicolon ';' delimited list of email addresses" -msgstr "Список адресов, разделённый точкой с запятой ‘;’" +#: superset/reports/commands/exceptions.py:186 +#, python-format +msgid "A report named \"%(name)s\" already exists" +msgstr "Рассылка с именем \"%(name)s\" уже существует" + +#: superset-frontend/src/explore/components/SaveModal.tsx:327 +msgid "A reusable dataset will be saved with your chart." +msgstr "Переиспользуемый датасет будет сохранен с вашим графиком." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:789 -#: superset/connectors/sqla/views.py:469 +#: superset-frontend/src/components/ReportModal/index.tsx:303 +msgid "A screenshot of the dashboard will be sent to your email at" +msgstr "Скриншот дашборда будет отправлен на ваш электронный адрес" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:957 +#: superset/connectors/sqla/views.py:459 msgid "" "A set of parameters that become available in the query using Jinja " "templating syntax" +msgstr "Набор параметров, которые доступны в запросе через шаблонизацию Jinja." + +#: superset/common/query_context_processor.py:413 +msgid "A time column must be specified when using a Time Comparison." msgstr "" +"Столбец даты/времени должен быть указан при использовании сравнения по " +"времени" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:32 msgid "" "A time series chart that visualizes how a related metric from multiple " "groups vary over time. Each group is visualized using a different color." msgstr "" +"Диаграмма временного ряда, которая визуализирует, как связанная метрика " +"из нескольких групп изменяется с течением времени. Для каждой группы " +"используется свой цвет." -#: superset/reports/commands/exceptions.py:198 -#, fuzzy +#: superset/reports/commands/exceptions.py:223 msgid "A timeout occurred while executing the query." -msgstr "Обнаружена ошибка в запросе." +msgstr "Вышло время исполнения запроса." -#: superset/reports/commands/exceptions.py:206 -#, fuzzy +#: superset/reports/commands/exceptions.py:233 msgid "A timeout occurred while generating a csv." -msgstr "Произошла ошибка при получении метаданных из таблицы" +msgstr "Вышло время создания CSV файла." -#: superset/reports/commands/exceptions.py:210 -#, fuzzy +#: superset/reports/commands/exceptions.py:238 msgid "A timeout occurred while generating a dataframe." -msgstr "Произошла ошибка при создании источника данных" +msgstr "Вышло время создания датафрейма." -#: superset/reports/commands/exceptions.py:202 -#, fuzzy +#: superset/reports/commands/exceptions.py:228 msgid "A timeout occurred while taking a screenshot." -msgstr "Произошла ошибка при получении метаданных из таблицы" +msgstr "Вышло время создания скриншота." -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:168 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:280 msgid "A valid color scheme is required" msgstr "Требуется корректная цветовая схема" -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:344 +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:337 msgid "APPLY" msgstr "ПРИМЕНИТЬ" @@ -588,105 +920,127 @@ msgstr "ПРИМЕНИТЬ" msgid "APR" msgstr "АПР" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:239 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:404 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:309 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:475 msgid "AQE" -msgstr "AQE" +msgstr "Асинхронные запросы" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:98 msgid "AUG" msgstr "АВГ" -#: superset-frontend/src/components/Menu/MenuRight.tsx:176 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:79 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:110 +msgid "AXIS TITLE MARGIN" +msgstr "ОТСТУП ЗАГОЛОВКА ОСИ" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:127 +msgid "AXIS TITLE POSITION" +msgstr "ПОЛОЖЕНИЕ ЗАГОЛОВКА ОСИ" + +#: superset-frontend/src/views/components/RightMenu.tsx:508 msgid "About" -msgstr "" +msgstr "О программе" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:354 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:397 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:287 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:406 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:449 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:300 msgid "Access" msgstr "Доступ" -#: superset/initialization/__init__.py:491 +#: superset/initialization/__init__.py:411 msgid "Access requests" msgstr "Запросы доступа" -#: superset/views/core.py:300 +#: superset-frontend/src/components/TableLoader/index.tsx:91 +msgid "Access to user activity data is restricted" +msgstr "Запрещен доступ к истории действий пользователя" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:175 +msgid "Access token" +msgstr "Токен доступа" + +#: superset/views/core.py:315 msgid "Access was requested" -msgstr "Запрошен доступ" +msgstr "Доступ запрошен" #: superset/views/log/__init__.py:31 msgid "Action" -msgstr "Действия" +msgstr "Действие" -#: superset/initialization/__init__.py:419 +#: superset/initialization/__init__.py:373 msgid "Action Log" -msgstr "Журнал Действий" +msgstr "Журнал действий" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:335 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:189 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:249 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:420 +#: superset-frontend/src/pages/ChartList/index.tsx:539 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:405 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:203 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:246 #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:229 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:417 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:375 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:405 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:309 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:413 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:432 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:445 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:492 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:327 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:414 msgid "Actions" msgstr "Действия" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:290 -#: superset/views/schedules.py:240 superset/views/schedules.py:320 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:356 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:399 msgid "Active" -msgstr "Действия" +msgstr "Активен" -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:316 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:332 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:214 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:484 +msgid "Actual Values" +msgstr "Фактические значения" + +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:309 msgid "Actual time range" -msgstr "" +msgstr "Фактический временной интервал" + +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:64 +msgid "Actual value" +msgstr "Фактическое значение" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:140 +#: superset-frontend/src/explore/controlPanels/sections.tsx:210 +msgid "Actual values" +msgstr "Фактические значения" #: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:28 -#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:49 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:51 +#: superset-frontend/src/explore/controls.jsx:78 +#: superset-frontend/src/explore/controls.jsx:101 msgid "Adaptive formatting" -msgstr "Формат Datetime" - -#: superset-frontend/src/components/ReportModal/index.tsx:267 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitlePane.tsx:133 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1039 -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:273 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:226 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:220 -#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:119 +msgstr "Адаптивное форматирование" + +#: superset-frontend/src/components/ReportModal/index.tsx:223 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:390 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:272 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:230 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:218 msgid "Add" msgstr "Добавить" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1056 -#, fuzzy +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:394 msgid "Add Alert" -msgstr "оповещение" +msgstr "Добавить оповещение" -#: superset/views/annotations.py:60 -msgid "Add Annotation" -msgstr "Добавить слой аннотации" - -#: superset/views/annotations.py:119 -msgid "Add Annotation Layer" -msgstr "Добавить слой аннотации" - -#: superset/views/css_templates.py:38 +#: superset/views/css_templates.py:40 msgid "Add CSS Template" -msgstr "Шаблоны CSS" +msgstr "Добавить CSS шаблон" -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:232 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:230 msgid "Add CSS template" -msgstr "Шаблоны CSS" +msgstr "Добавить CSS шаблоны" #: superset/views/chart/mixin.py:28 msgid "Add Chart" msgstr "Добавить график" -#: superset/connectors/sqla/views.py:65 +#: superset/connectors/sqla/views.py:75 msgid "Add Column" msgstr "Добавить столбец" @@ -696,42 +1050,30 @@ msgstr "Добавить дашборд" #: superset/views/database/mixins.py:35 msgid "Add Database" -msgstr "Добавить Базу Данных" +msgstr "Добавить базу данных" -#: superset/connectors/druid/views.py:215 -msgid "Add Druid Cluster" -msgstr "Добавить кластер Druid" - -#: superset/connectors/druid/views.py:72 -msgid "Add Druid Column" -msgstr "Добавить столбец Druid" - -#: superset/connectors/druid/views.py:279 -msgid "Add Druid Datasource" -msgstr "Добавить источник данных Druid" - -#: superset/connectors/druid/views.py:161 -msgid "Add Druid Metric" -msgstr "Добавить Druid Метрику" +#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:151 +msgid "Add Dataset and Create Chart" +msgstr "Добавить датасет и создать график" #: superset/views/log/__init__.py:23 msgid "Add Log" -msgstr "Добавить журнал" +msgstr "Добавить запись" -#: superset/connectors/sqla/views.py:214 +#: superset/connectors/sqla/views.py:210 msgid "Add Metric" -msgstr "Добавить показатель" +msgstr "Добавить меру" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1055 -#, fuzzy +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:393 msgid "Add Report" -msgstr "рассылка" +msgstr "Добавить рассылку" -#: superset/connectors/sqla/views.py:316 +#: superset/connectors/sqla/views.py:293 +#, fuzzy msgid "Add Row level security filter" -msgstr "Добавить фильтр на уровне строк" +msgstr "Безопасность на уровне строк" -#: superset/views/sql_lab.py:41 +#: superset/views/sql_lab/views.py:54 msgid "Add Saved Query" msgstr "Добавить сохраненный запрос" @@ -739,267 +1081,374 @@ msgstr "Добавить сохраненный запрос" msgid "Add a Plugin" msgstr "Добавить плагин" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:175 -#, fuzzy +#: superset-frontend/src/pages/ChartCreation/index.tsx:344 +msgid "Add a dataset" +msgstr "Добавить датасет" + +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:262 +msgid "Add a new tab" +msgstr "Новая вкладка" + +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:286 +msgid "Add a new tab to create SQL Query" +msgstr "Откройте новую вкладку для создания SQL запроса" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:220 msgid "Add additional custom parameters" -msgstr "Изменить параметры шаблона" +msgstr "Добавление дополнительных пользовательских параметров" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:117 +msgid "Add an annotation layer" +msgstr "Добавить слой аннотации" #: superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:63 -#, fuzzy msgid "Add an item" -msgstr "Добавить фильтр" +msgstr "Добавить запись" -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:283 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx:571 +msgid "Add and edit filters" +msgstr "Добавить и изменить фильтры" + +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:282 msgid "Add annotation" -msgstr "Добавить слой аннотации" +msgstr "Добавить аннотацию" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:201 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:213 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:238 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:214 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:226 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:242 msgid "Add annotation layer" msgstr "Добавить слой аннотации" -#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:121 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:298 +msgid "Add calculated columns to dataset in \"Edit datasource\" modal" +msgstr "Добавьте новые вычисляемые столбцы в датасет в настройках датасета" + +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:295 +msgid "Add calculated temporal columns to dataset in \"Edit datasource\" modal" +msgstr "Добавьте новые столбцы формата дата/время в датасет в настройках датасета" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:153 msgid "Add dataset" -msgstr "Добавить Базу Данных" +msgstr "Добавить датасет" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:387 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:388 msgid "Add delivery method" -msgstr "Добавить метод доставки" +msgstr "Добавить способ оповещения" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:330 +msgid "Add extra connection information." +msgstr "Дополнительная информация по подключению" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx:367 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:167 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx:384 msgid "Add filter" msgstr "Добавить фильтр" -#: superset-frontend/src/CRUD/CollectionTable.tsx:417 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitlePane.tsx:109 +msgid "Add filters and dividers" +msgstr "Добавить фильтры и разделители" + +#: superset-frontend/src/components/Datasource/CollectionTable.tsx:458 msgid "Add item" -msgstr "Добавить фильтр" +msgstr "Добавить запись" #: superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.jsx:336 msgid "Add metric" -msgstr "Добавить показатель" +msgstr "Добавить меру" + +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:377 +msgid "Add metrics to dataset in \"Edit datasource\" modal" +msgstr "Добавьте меры в датасет в настройках датасета" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/ConditionalFormattingControl.tsx:176 msgid "Add new color formatter" -msgstr "" +msgstr "Добавить цветовое форматирование" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/ConditionalFormattingControl.tsx:169 msgid "Add new formatter" -msgstr "" +msgstr "Добавить форматирование" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:386 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:387 msgid "Add notification method" -msgstr "Добавить слой аннотации" +msgstr "Добавить способ уведомления" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:99 -#, fuzzy +#: superset-frontend/src/components/Chart/Chart.jsx:273 +msgid "Add required control values to preview chart" +msgstr "Добавьте обязательные значения для предпросмотра графика" + +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:254 +msgid "Add required control values to save chart" +msgstr "Добавьте обязательные значения для сохранения графика" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:107 msgid "Add sheet" -msgstr "Добавить Базу Данных" +msgstr "Добавить лист" -#: superset-frontend/src/explore/components/SaveModal.tsx:258 +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:219 +msgid "Add the name of the chart" +msgstr "Задайте имя графика" + +#: superset-frontend/src/dashboard/components/Header/index.jsx:517 +msgid "Add the name of the dashboard" +msgstr "Задайте имя дашборда" + +#: superset-frontend/src/explore/components/SaveModal.tsx:341 msgid "Add to dashboard" msgstr "Добавить в дашборд" -#: superset-frontend/src/dashboard/components/AddSliceCard.jsx:141 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx:126 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx:115 +msgid "Add/Edit Filters" +msgstr "Добавить/изменить фильтры" + +#: superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.tsx:122 +#: superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.tsx:149 msgid "Added" msgstr "Добавлено" -#: superset/connectors/druid/models.py:256 -msgid "Adding new datasource [{}]" -msgstr "Добавление нового источника данных [{}]" +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:174 +#, python-format +msgid "Added to 1 dashboard" +msgid_plural "Added to %s dashboards" +msgstr[0] "Добавлено в 1 дашборд" +msgstr[1] "Добавлено в %s дашборда" +msgstr[2] "Добавлено в %s дашбордов" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:173 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:218 msgid "Additional Parameters" -msgstr "Изменить параметры шаблона" +msgstr "Дополнительные параметры" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1631 +msgid "Additional fields may be required" +msgstr "" #: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:324 msgid "Additional information" -msgstr "Дополнительные метаданные" +msgstr "Дополнительная информация" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:96 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:95 msgid "Additional metadata" msgstr "Дополнительные метаданные" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:50 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:52 msgid "Additional padding for legend." -msgstr "Дополнительные метаданные" +msgstr "Дополнительный отступ для легенды" -#: superset/db_engine_specs/base.py:1398 -#, fuzzy +#: superset/db_engine_specs/base.py:1743 msgid "Additional parameters" -msgstr "Изменить параметры шаблона" +msgstr "Дополнительные параметры" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:166 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:444 +msgid "Additional settings." +msgstr "Дополнительная настройка" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:162 msgid "Additional text to add before or after the value, e.g. unit" -msgstr "" +msgstr "Дополнительный текст перед значением, например, единица измерения" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:40 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:40 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:45 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:39 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:57 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:43 -#, fuzzy msgid "Additive" -msgstr "Добавить фильтр" - -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:765 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:580 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:267 +msgstr "Смешанный" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:75 +msgid "Adjust how this database will interact with SQL Lab." +msgstr "Настройка взаимодействия базы данных с Лабораторией SQL" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:132 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/controlPanel.ts:91 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts:64 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:93 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/controlPanel.ts:76 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:186 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:153 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts:66 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:933 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:643 #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:34 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1146 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1655 msgid "Advanced" -msgstr "Дополнительно" +msgstr "Продвинутая настройка" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:122 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:242 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:125 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:148 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:375 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:115 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:235 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:117 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:385 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:169 msgid "Advanced Analytics" -msgstr "Расширенный анализ" +msgstr "Расширенная аналитика" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:285 +msgid "Advanced Data type" +msgstr "Расширенный тип данных" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:25 -#: superset-frontend/src/explore/controlPanels/sections.tsx:144 +#: superset-frontend/src/explore/controlPanels/sections.tsx:117 msgid "Advanced analytics" -msgstr "Расширенный анализ" +msgstr "Расширенная аналитика" -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:32 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:36 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:44 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:35 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:79 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:79 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:74 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:64 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:71 -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:124 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:289 +msgid "Advanced analytics Query A" +msgstr "Расширенный анализ: запрос А" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:291 +msgid "Advanced analytics Query B" +msgstr "Расширенный анализ: запрос Б" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:281 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:353 +msgid "Advanced data type" +msgstr "Расширенный тип данных" + +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:35 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:37 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:38 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:77 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:76 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:71 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:66 +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:130 msgid "Advanced-Analytics" -msgstr "Расширенный анализ" +msgstr "Продвинутая аналитика" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:36 #: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/index.js:33 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:44 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:35 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:39 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:70 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:41 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:78 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:65 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:80 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:80 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:75 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:74 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:74 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:65 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:72 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/index.ts:44 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:77 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:72 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:67 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:58 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:41 msgid "Aesthetic" -msgstr "" +msgstr "Эстетично" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:84 -#, fuzzy +#: superset-frontend/src/components/AlteredSliceTag/index.jsx:182 +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:82 msgid "After" -msgstr "дата" +msgstr "После" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:45 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:57 msgid "Aggregate" -msgstr "агрегат" +msgstr "Агрегация" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:91 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:84 msgid "Aggregate Mean" -msgstr "агрегат" +msgstr "Агрегированное среднее" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:96 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:89 msgid "Aggregate Sum" -msgstr "агрегат" +msgstr "Агрегированная сумма" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:182 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:194 msgid "" "Aggregate function applied to the list of points in each cluster to " "produce the cluster label." msgstr "" +"Агрегатная функция, применяемая для списка точек в каждом кластере для " +"создания метки кластера." -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:74 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:137 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:63 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:202 msgid "" "Aggregate function to apply when pivoting and computing the total rows " "and columns" msgstr "" +"Агрегатная функция, применяемая для сводных таблиц и вычислении суммарных" +" значений." -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:63 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:114 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:27 +msgid "" +"Aggregates data within the boundary of grid cells and maps the aggregated" +" values to a dynamic color scale" +msgstr "" + +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:52 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:176 msgid "Aggregation function" -msgstr "Python функции" +msgstr "Функция агрегирования" + +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:574 +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:162 +#, fuzzy +msgid "Alert" +msgstr "оповещение" #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:92 msgid "Alert Triggered, In Grace Period" -msgstr "Сработало оповещение" +msgstr "Оповещение сработало во время перерыва" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1123 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:400 msgid "Alert condition" msgstr "Условие оповещения" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1215 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:408 msgid "Alert condition schedule" msgstr "Расписание условия оповещения" -#: superset/reports/commands/exceptions.py:218 +#: superset/reports/commands/exceptions.py:248 msgid "Alert ended grace period." -msgstr "" +msgstr "У оповещения закончился перерыв." #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:82 msgid "Alert failed" -msgstr "Оповещение не удалось" +msgstr "Оповещение не сработало" -#: superset/reports/commands/exceptions.py:214 +#: superset/reports/commands/exceptions.py:243 msgid "Alert fired during grace period." -msgstr "" +msgstr "Оповещение сработало во время перерыва" -#: superset/reports/commands/exceptions.py:194 +#: superset/reports/commands/exceptions.py:218 msgid "Alert found an error while executing a query." -msgstr "Обнаружена ошибка в запросе." +msgstr "Возникла ошибка при выполнении запроса для оповещения." -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1064 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1072 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:396 msgid "Alert name" msgstr "Имя оповещения" -#: superset/reports/commands/exceptions.py:222 +#: superset/reports/commands/exceptions.py:253 msgid "Alert on grace period" -msgstr "" +msgstr "Оповещение во время перерыва" -#: superset/reports/commands/exceptions.py:190 +#: superset/reports/commands/exceptions.py:214 msgid "Alert query returned a non-number value." -msgstr "Запрос для оповещения вернул не число." +msgstr "Запрос оповещения вернул нечисловое значение." -#: superset/reports/commands/exceptions.py:186 +#: superset/reports/commands/exceptions.py:209 msgid "Alert query returned more than one column." -msgstr "Запрос для оповещения вернул больше одного столбца." +msgstr "Запрос оповещения вернул больше, чем один столбец." -#: superset/reports/commands/alert.py:105 +#: superset/reports/commands/alert.py:109 #, python-format msgid "Alert query returned more than one column. %s columns returned" -msgstr "Запрос от оповещения вернул больше одного столбца. %s столбцов возвращено" +msgstr "Запрос оповещения вернул больше, чем один столбец. Возвращено столбцов: %s" -#: superset/reports/commands/exceptions.py:177 +#: superset/reports/commands/exceptions.py:199 msgid "Alert query returned more than one row." -msgstr "Запрос для оповещения вернул больше одной строки." +msgstr "Запрос оповещения вернул больше, чем одну строку." -#: superset/reports/commands/alert.py:96 +#: superset/reports/commands/alert.py:100 #, python-format msgid "Alert query returned more than one row. %s rows returned" -msgstr "Запрос от оповещения вернул больше одной строки. %s строк возвращено" +msgstr "Запрос оповещения вернул больше, чем одну строку. Возвращено строк: %s" #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:75 msgid "Alert running" @@ -1009,164 +1458,177 @@ msgstr "Выполняется оповещение" msgid "Alert triggered, notification sent" msgstr "Сработало оповещение, уведомление отправлено" -#: superset/reports/commands/exceptions.py:182 +#: superset/reports/commands/exceptions.py:204 msgid "Alert validator config error." -msgstr "Неверная конфигурация широты и долготы." +msgstr "Неверная конфигурация валидатора оповещений." -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:436 -#: superset/initialization/__init__.py:468 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:535 msgid "Alerts" msgstr "Оповещения" -#: superset/initialization/__init__.py:480 +#: superset/initialization/__init__.py:390 msgid "Alerts & Reports" -msgstr "Оповещения и Рассылка" +msgstr "Оповещения и отчеты" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:432 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:520 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:524 msgid "Alerts & reports" -msgstr "Оповещения и рассылки" +msgstr "Оповещения и отчеты" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:127 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:427 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:116 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:438 msgid "Align +/-" -msgstr "" - -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:457 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:478 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:499 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:524 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:454 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:475 +msgstr "Выровнять +/-" + +#: superset-frontend/src/pages/ChartList/index.tsx:583 +#: superset-frontend/src/pages/ChartList/index.tsx:605 +#: superset-frontend/src/pages/ChartList/index.tsx:627 +#: superset-frontend/src/pages/ChartList/index.tsx:653 +#: superset-frontend/src/pages/ChartList/index.tsx:663 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:458 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:288 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:278 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:483 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:505 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:462 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:482 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:354 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:430 +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:211 msgid "All" -msgstr "" +msgstr "Все" #: superset/annotation_layers/annotations/filters.py:28 -#: superset/annotation_layers/filters.py:30 superset/charts/filters.py:31 +#: superset/annotation_layers/filters.py:30 superset/charts/filters.py:33 #: superset/css_templates/filters.py:28 -#: superset/queries/saved_queries/filters.py:31 superset/reports/filters.py:28 +#: superset/queries/saved_queries/filters.py:31 superset/reports/filters.py:44 msgid "All Text" msgstr "Весь текст" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx:60 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/useFilterScope.ts:69 #: superset-frontend/src/dashboard/util/getFilterScopeNodesTree.js:85 -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:122 +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:128 msgid "All charts" msgstr "Все графики" #: superset-frontend/src/dashboard/util/getFilterFieldNodesTree.js:44 msgid "All filters" -msgstr "Фильтры" +msgstr "Все фильтры" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx:326 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx:230 #, python-format msgid "All filters (%(filterCount)d)" -msgstr "" +msgstr "Все фильтры (%(filterCount)d)" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/state.ts:49 -#, fuzzy msgid "All panels" -msgstr "Применить ко всем панелям" +msgstr "Все панели" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:132 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:131 msgid "All panels with this column will be affected by this filter" msgstr "Фильтр будет применён ко всем панелям с этим столбцом" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:95 -#: superset/views/database/mixins.py:187 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:107 +#: superset/views/database/mixins.py:184 msgid "Allow CREATE TABLE AS" msgstr "Разрешить CREATE TABLE AS" -#: superset/views/database/mixins.py:113 +#: superset/views/database/mixins.py:112 msgid "Allow CREATE TABLE AS option in SQL Lab" -msgstr "Разрешить выполнять инструкцию CREATE TABLE AS в редакторе SQL" +msgstr "Разрешить CREATE TABLE AS в Лаборатории SQL" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:109 -#: superset/views/database/mixins.py:188 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:121 +#: superset/views/database/mixins.py:185 msgid "Allow CREATE VIEW AS" -msgstr "Разрешить CREATE TABLE AS" +msgstr "Разрешить CREATE VIEW AS" -#: superset/views/database/mixins.py:114 +#: superset/views/database/mixins.py:113 msgid "Allow CREATE VIEW AS option in SQL Lab" -msgstr "Разрешить выполнять инструкцию CREATE TABLE AS в редакторе SQL" +msgstr "Разрешить CREATE VIEW AS в Лаборатории SQL" -#: superset/views/database/mixins.py:201 +#: superset/views/database/mixins.py:198 msgid "Allow Csv Upload" msgstr "Разрешить загрузку CSV" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:142 -#: superset/views/database/mixins.py:189 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:154 +#: superset/views/database/mixins.py:186 msgid "Allow DML" -msgstr "Allow DML" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:158 -#: superset/views/database/mixins.py:203 -msgid "Allow Multi Schema Metadata Fetch" -msgstr "" +msgstr "Разрешить DML" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:161 -#: superset/views/database/mixins.py:170 -msgid "" -"Allow SQL Lab to fetch a list of all tables and all views across all " -"database schemas. For large data warehouse with thousands of tables, this" -" can be expensive and put strain on the system." -msgstr "" +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:464 +msgid "Allow columns to be rearranged" +msgstr "Разрешить смену столбцов местами" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:98 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:110 msgid "Allow creation of new tables based on queries" -msgstr "" +msgstr "Разрешить создание новых таблиц на основе запросов" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:112 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:124 msgid "Allow creation of new views based on queries" -msgstr "" +msgstr "Разрешить создание новых представлений на основе запросов" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:256 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:326 msgid "Allow data manipulation language" -msgstr "Разрешить язык манипулирования данными" +msgstr "Разрешить операции вставки, обновления и удаления данных" + +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:467 +msgid "" +"Allow end user to drag-and-drop column headers to rearrange them. Note " +"their changes won't persist for the next time they open the chart." +msgstr "" +"Разрешить конечному пользователю перемещать столбцы, удерживая их " +"заголовки. Заметьте, такие изменения будут нейтрализованы при следующем " +"обращении к дашборду." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:417 -msgid "Allow data upload" -msgstr "Разрешить загрузку данных" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:411 +msgid "Allow file uploads to database" +msgstr "Разрешить загрузку файлов в базу данных" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:145 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:157 msgid "" "Allow manipulation of the database using non-SELECT statements such as " "UPDATE, DELETE, CREATE, etc." msgstr "" +"Разрешить управление базой данных, используя запросы UPDATE, DELETE, " +"CREATE и т.п." #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:216 msgid "Allow multiple selections" -msgstr "Разрешить множественный фильтр" +msgstr "Разрешить множественный выбор" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:189 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:190 msgid "Allow node selections" -msgstr "Разрешить множественный фильтр" +msgstr "Разрешить выбор вершин" -#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:64 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:82 -msgid "Allow selecting multiple values" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:176 +msgid "Allow sending multiple polygons as a filter event" msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:192 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:186 msgid "Allow this database to be explored" -msgstr "" +msgstr "Разрешить изучение этой базы данных" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:79 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:91 msgid "Allow this database to be queried in SQL Lab" -msgstr "" +msgstr "Разрешить запросы к этой базе данных в Лаборатории SQL" -#: superset/views/database/mixins.py:115 +#: superset/views/database/mixins.py:114 msgid "" "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" " SQL Lab" msgstr "" -"Позволяет пользователям запускать инструкции (UPDATE, DELETE, CREATE, …) " -"без SELECT в редакторе SQL" +"Разрешить управление базой данных, используя запросы UPDATE, DELETE, " +"CREATE и т.п. в Лаборатории SQL" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:555 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:529 -#, fuzzy +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:193 +msgid "Allowed Domains (comma separated)" +msgstr "Разрешенные домены (разделить запятыми)" + +#: superset-frontend/src/pages/ChartList/index.tsx:696 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:555 msgid "Alphabetical" -msgstr "Отсортировать столбцы в алфавитном порядке" +msgstr "В алфавитном порядке" #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:50 msgid "" @@ -1176,51 +1638,60 @@ msgid "" "around each box visualize the min, max, range, and outer 2 quartiles." msgstr "" -#: superset-frontend/src/components/AlteredSliceTag/index.jsx:182 +#: superset-frontend/src/components/AlteredSliceTag/index.jsx:202 msgid "Altered" -msgstr "Изменения" +msgstr "Измененено" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/MessageContent.tsx:71 +msgid "An Error Occurred" +msgstr "Произошла ошибка" -#: superset/common/query_context_processor.py:257 superset/viz.py:1415 +#: superset/reports/commands/exceptions.py:188 +#, python-format +msgid "An alert named \"%(name)s\" already exists" +msgstr "Оповещение с именем \"%(name)s\" уже существует" + +#: superset/common/query_context_processor.py:322 superset/viz.py:1444 msgid "" "An enclosed time range (both start and end) must be specified when using " "a Time Comparison." msgstr "" +"При использовании сравнения времени необходимо указать закрытый временной" +" интервал (как начало, так и конец)." -#: superset/databases/schemas.py:299 +#: superset/databases/schemas.py:280 msgid "" "An engine must be specified when passing individual parameters to a " "database." -msgstr "" +msgstr "Движок должен быть указан при передаче индивидуальных параметров к базе." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:623 -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:140 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:69 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:116 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:785 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:137 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:108 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:115 #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx:46 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:64 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:67 msgid "An error has occurred" msgstr "Произошла ошибка" -#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:80 -#: superset-frontend/src/components/TableLoader/index.tsx:48 -#: superset-frontend/src/utils/getClientErrorObject.ts:135 +#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx:76 +#: superset-frontend/src/components/TableLoader/index.tsx:55 +#: superset-frontend/src/utils/getClientErrorObject.ts:197 msgid "An error occurred" msgstr "Произошла ошибка" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:347 +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:317 msgid "An error occurred saving dataset" -msgstr "Произошла ошибка при создании источника данных" +msgstr "Произошла ошибка при сохранении датасета" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "Произошла ошибка при создании источника данных" - -#: superset/key_value/commands/exceptions.py:33 -#, fuzzy +#: superset/dashboards/permalink/exceptions.py:31 +#: superset/explore/permalink/exceptions.py:31 +#: superset/key_value/exceptions.py:38 +#: superset/temporary_cache/commands/exceptions.py:33 msgid "An error occurred while accessing the value." -msgstr "Произошла ошибка при создании источника данных" +msgstr "Произошла ошибка при доступе к значению" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1165 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1342 msgid "" "An error occurred while collapsing the table schema. Please contact your " "administrator." @@ -1229,36 +1700,28 @@ msgstr "" "администратором." #: superset-frontend/src/views/CRUD/hooks.ts:301 -#, fuzzy, python-format +#, python-format msgid "An error occurred while creating %ss: %s" -msgstr "Произошла ошибка при получении датасетов: %s" +msgstr "Произошла ошибка при создании %sов: %s" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1313 -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1335 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1503 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1525 msgid "An error occurred while creating the data source" msgstr "Произошла ошибка при создании источника данных" -#: superset/key_value/commands/exceptions.py:29 -#, fuzzy +#: superset/dashboards/permalink/exceptions.py:27 +#: superset/explore/permalink/exceptions.py:27 +#: superset/key_value/exceptions.py:34 +#: superset/temporary_cache/commands/exceptions.py:29 msgid "An error occurred while creating the value." -msgstr "Произошла ошибка при создании источника данных" +msgstr "Произошла ошибка при создании значения" -#: superset/key_value/commands/exceptions.py:37 -#, fuzzy, python-format +#: superset/key_value/exceptions.py:42 +#: superset/temporary_cache/commands/exceptions.py:37 msgid "An error occurred while deleting the value." -msgstr "Произошла ошибка при построении графика: %s" - -#: superset-frontend/src/reports/actions/reports.js:138 -#, fuzzy -msgid "An error occurred while editing this report." -msgstr "Произошла ошибка при создании источника данных" - -#: superset-frontend/src/reports/actions/reports.js:120 -#, fuzzy, python-format -msgid "An error occurred while editing this report: %s" -msgstr "Произошла ошибка при получении датасетов: %s" +msgstr "Произошла ошибка при удалении значения" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1141 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1318 msgid "" "An error occurred while expanding the table schema. Please contact your " "administrator." @@ -1267,114 +1730,118 @@ msgstr "" "администратором." #: superset-frontend/src/views/CRUD/hooks.ts:103 -#, fuzzy, python-format +#, python-format msgid "An error occurred while fetching %s info: %s" -msgstr "Произошла ошибка при получении дашбордов: %s" +msgstr "Произошла ошибка при получении информации о %s: %s" #: superset-frontend/src/views/CRUD/hooks.ts:171 #: superset-frontend/src/views/CRUD/hooks.ts:258 -#: superset-frontend/src/views/CRUD/hooks.ts:344 -#, fuzzy, python-format +#: superset-frontend/src/views/CRUD/hooks.ts:346 +#, python-format msgid "An error occurred while fetching %ss: %s" -msgstr "Произошла ошибка при получении датасетов: %s" +msgstr "Произошла ошибка при получении: %s: %s" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:132 +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:135 msgid "An error occurred while fetching available CSS templates" msgstr "Произошла ошибка при получении доступных CSS-шаблонов" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:484 +#: superset-frontend/src/pages/ChartList/index.tsx:611 #, python-format msgid "An error occurred while fetching chart created by values: %s" msgstr "Произошла ошибка при получении создателя графика: %s" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:463 +#: superset-frontend/src/pages/ChartList/index.tsx:589 #, python-format msgid "An error occurred while fetching chart owners values: %s" -msgstr "Произошла ошибка при получении владельца графика: %s" +msgstr "Произошла ошибка при получении владельцев графика: %s" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:392 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:480 #, python-format msgid "An error occurred while fetching created by values: %s" msgstr "Произошла ошибка при построении графика: %s" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:481 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:511 #, python-format msgid "An error occurred while fetching dashboard created by values: %s" msgstr "Произошла ошибка при получении создателя дашборда: %s" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:460 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:489 #, python-format msgid "An error occurred while fetching dashboard owner values: %s" msgstr "Произошла ошибка при получении владельца дашборда: %s" -#: superset-frontend/src/components/OmniContainer/getDashboards.ts:48 +#: superset-frontend/src/pages/ChartList/index.tsx:290 msgid "An error occurred while fetching dashboards" -msgstr "Произошла ошибка при создании источника данных" +msgstr "Произошла ошибка при получении дашбордов" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:200 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:127 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:212 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:143 #, python-format msgid "An error occurred while fetching dashboards: %s" msgstr "Произошла ошибка при получении дашбордов: %s" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:129 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:145 #, python-format msgid "An error occurred while fetching database related data: %s" msgstr "Произошла ошибка при получении данных о базе данных: %s" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:341 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:360 #, python-format msgid "An error occurred while fetching database values: %s" msgstr "Произошла ошибка при получении значений базы данных: %s" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:295 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:282 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:434 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:293 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:283 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:436 #, python-format msgid "An error occurred while fetching dataset datasource values: %s" msgstr "Произошла ошибка при получении значений датасета: %s" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:426 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:514 #, python-format msgid "An error occurred while fetching dataset owner values: %s" -msgstr "Произошла ошибка при получении создателя датасета: %s" +msgstr "Произошла ошибка при получении владельца датасета: %s" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:184 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:226 msgid "An error occurred while fetching dataset related data" -msgstr "Произошла ошибка при получении метаданных из таблицы" +msgstr "Произошла ошибка при получении метаданных датасета" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:204 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:246 #, python-format msgid "An error occurred while fetching dataset related data: %s" msgstr "Произошла ошибка при получении данных о датасете: %s" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:445 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:534 #, python-format msgid "An error occurred while fetching datasets: %s" msgstr "Произошла ошибка при получении датасетов: %s" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1356 -#, fuzzy +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1555 msgid "An error occurred while fetching function names." -msgstr "Произошла ошибка при получении метаданных из таблицы" +msgstr "Произошла ошибка при получении имен функций" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:460 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:358 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:454 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:463 +#, python-format +msgid "An error occurred while fetching owners values: %s" +msgstr "Произошла ошибка при получении владельцев графика: %s" + +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:550 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:378 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:457 #, python-format msgid "An error occurred while fetching schema values: %s" -msgstr "Произошла ошибка при построении графика: %s" +msgstr "Произошла ошибка при извлечении значений схемы: %s" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:662 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:769 msgid "An error occurred while fetching tab state" -msgstr "Произошла ошибка при получении метаданных из таблицы" +msgstr "Произошла ошибка при получении данных вкладки" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1027 -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1052 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1173 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1198 msgid "An error occurred while fetching table metadata" msgstr "Произошла ошибка при получении метаданных из таблицы" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1093 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1270 msgid "" "An error occurred while fetching table metadata. Please contact your " "administrator." @@ -1382,47 +1849,54 @@ msgstr "" "Произошла ошибка при получении метаданных таблицы. Пожалуйста, свяжитесь " "с администратором." -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:375 -#, fuzzy, python-format +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:396 +#, python-format msgid "An error occurred while fetching user values: %s" -msgstr "Произошла ошибка при построении графика: %s" +msgstr "Произошла ошибка при извлечении пользовательских значений: %s" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:698 -#, fuzzy +#: superset-frontend/src/SqlLab/actions/sqlLab.js:805 msgid "" "An error occurred while hiding the left bar. Please contact your " "administrator." msgstr "" -"Произошла ошибка при разворачивании схемы. Пожалуйста, свяжитесь с " +"Произошла ошибка при сворачивании левой панели. Пожалуйста, свяжитесь с " "администратором." -#: superset-frontend/src/views/CRUD/hooks.ts:438 -#: superset-frontend/src/views/CRUD/hooks.ts:451 -#, fuzzy, python-format +#: superset-frontend/src/views/CRUD/hooks.ts:460 +#: superset-frontend/src/views/CRUD/hooks.ts:476 +#, python-format msgid "An error occurred while importing %s: %s" -msgstr "Произошла ошибка при удалении журналов " +msgstr "Произошла ошибка при попытке импортировать %s: %s" -#: superset-frontend/src/chart/chartAction.js:569 +#: superset-frontend/src/components/Chart/chartAction.js:579 msgid "An error occurred while loading the SQL" -msgstr "Произошла ошибка при создании источника данных" +msgstr "Произошла ошибка при загрузке SQL" + +#: superset-frontend/src/dashboard/components/gridComponents/Chart.jsx:343 +msgid "An error occurred while opening Explore" +msgstr "Произошла ошибка при открытии режима исследования" + +#: superset/key_value/exceptions.py:30 +msgid "An error occurred while parsing the key." +msgstr "Произошла ошибка при парсинге ключа." -#: superset/reports/commands/exceptions.py:242 +#: superset/reports/commands/exceptions.py:281 msgid "An error occurred while pruning logs " msgstr "Произошла ошибка при удалении журналов " -#: superset-frontend/src/SqlLab/actions/sqlLab.js:744 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:862 msgid "An error occurred while removing query. Please contact your administrator." msgstr "" "Произошла ошибка при удалении запроса. Пожалуйста, свяжитесь с " "администратором." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:720 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:827 msgid "An error occurred while removing tab. Please contact your administrator." msgstr "" "Произошла ошибка при удалении вкладки. Пожалуйста, свяжитесь с " "администратором." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1188 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1370 msgid "" "An error occurred while removing the table schema. Please contact your " "administrator." @@ -1430,12 +1904,12 @@ msgstr "" "Произошла ошибка при удалении схемы. Пожалуйста, свяжитесь с " "администратором." -#: superset-frontend/src/chart/chartReducer.ts:94 +#: superset-frontend/src/components/Chart/chartReducer.ts:95 #, python-format msgid "An error occurred while rendering the visualization: %s" msgstr "Произошла ошибка при построении графика: %s" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:575 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:680 msgid "" "An error occurred while setting the active tab. Please contact your " "administrator." @@ -1443,7 +1917,7 @@ msgstr "" "Произошла ошибка при установке активной вкладки. Пожалуйста, свяжитесь с " "администратором." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:825 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:949 msgid "" "An error occurred while setting the tab autorun. Please contact your " "administrator." @@ -1451,7 +1925,7 @@ msgstr "" "Произошла ошибка при настройке автозапуска вкладки. Пожалуйста, свяжитесь" " с администратором." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:767 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:885 msgid "" "An error occurred while setting the tab database ID. Please contact your " "administrator." @@ -1459,15 +1933,24 @@ msgstr "" "Произошла ошибка при установке ID базы данных для вкладки. Пожалуйста, " "свяжитесь с администратором." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:792 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:978 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1102 +msgid "" +"An error occurred while setting the tab name. Please contact your " +"administrator." +msgstr "" +"Произошла ошибка при настройке заголовка вкладки. Пожалуйста, свяжитесь с" +" администратором." + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:916 msgid "" "An error occurred while setting the tab schema. Please contact your " "administrator." msgstr "" -"Произошла ошибка при настройке схемы вкладок. Пожалуйста, свяжитесь с " +"Произошла ошибка при настройке схемы. Пожалуйста, свяжитесь с " "администратором." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:967 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1128 msgid "" "An error occurred while setting the tab template parameters. Please " "contact your administrator." @@ -1475,197 +1958,181 @@ msgstr "" "Произошла ошибка при установке параметров шаблона вкладки. Пожалуйста, " "свяжитесь с администратором." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:850 -#: superset-frontend/src/SqlLab/actions/sqlLab.js:941 -msgid "" -"An error occurred while setting the tab title. Please contact your " -"administrator." -msgstr "" -"Произошла ошибка при настройке заголовка вкладки. Пожалуйста, свяжитесь с" -" администратором." - -#: superset-frontend/src/explore/actions/exploreActions.ts:95 -#, fuzzy +#: superset-frontend/src/explore/actions/exploreActions.ts:88 msgid "An error occurred while starring this chart" -msgstr "Произошла ошибка при создании источника данных" +msgstr "Произошла ошибка при добавлении графика в избранное" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:232 -#: superset-frontend/src/SqlLab/actions/sqlLab.js:258 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:249 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:275 msgid "" "An error occurred while storing the latest query id in the backend. " "Please contact your administrator if this problem persists." msgstr "" +"Возникла ошибка при попытке сохранения ID последнего запроса на сервере. " +"Пожалуйста, обратитесь к вашему администратору, если проблема останется." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:908 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1069 msgid "" "An error occurred while storing your query in the backend. To avoid " "losing your changes, please save your query using the \"Save Query\" " "button." msgstr "" -"Произошла ошибка при сохранении запроса в бэкенд. Чтобы сохранить " -"изменения, пожалуйста, сохраните ваш запрос через кнопку “Сохранить " -"запрос”." +"Произошла ошибка при сохранении запроса на сервере. Чтобы сохранить " +"изменения, пожалуйста, сохраните ваш запрос через кнопку \"Сохранить " +"как\"." -#: superset/key_value/commands/exceptions.py:41 -#, fuzzy +#: superset/key_value/exceptions.py:46 +#: superset/temporary_cache/commands/exceptions.py:41 msgid "An error occurred while updating the value." -msgstr "Произошла ошибка при создании источника данных" +msgstr "Произошла ошибка при обновлении значения" -#: superset/views/core.py:711 +#: superset/key_value/exceptions.py:50 +msgid "An error occurred while upserting the value." +msgstr "Произошла ошибка при вставке значения." + +#: superset/databases/commands/exceptions.py:162 +msgid "An unexpected error occurred" +msgstr "Произошла неожиданная ошибка" + +#: superset/views/core.py:732 msgid "An unknown error occurred. Please contact your Superset administrator" -msgstr "" -"Произошла неизвестная ошибка. Пожалуйста, свяжитесь с администратором " -"Superset" +msgstr "Произошла неизвестная ошибка. Пожалуйста, свяжитесь с администратором." -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:223 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:235 msgid "Anchor to" msgstr "Привязать к" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:121 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:117 msgid "Angle at which to end progress axis" -msgstr "" +msgstr "Угол, под которым заканчивается ось прогресса" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:111 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:107 msgid "Angle at which to start progress axis" -msgstr "" +msgstr "Угол, с которого начинается ось прогресса" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:191 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:187 msgid "Animation" -msgstr "аннотация" +msgstr "Анимация" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:202 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:248 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:216 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:249 msgid "Annotation" msgstr "Аннотация" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:263 -msgid "Annotation Layer ${annotationLayerName}" -msgstr "Слой аннотаций ${annotationLayerName}" +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:259 +#, python-format +msgid "Annotation Layer %s" +msgstr "Слой аннотаций %s" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/annotationsAndLayers.tsx:35 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:124 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:271 -#: superset/initialization/__init__.py:229 superset/views/annotations.py:117 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/annotationsAndLayers.tsx:36 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:127 +#: superset/initialization/__init__.py:400 msgid "Annotation Layers" msgstr "Слои аннотаций" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:465 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:513 msgid "Annotation Slice Configuration" -msgstr "Фильтруемые срезы" - -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:758 -#, fuzzy -msgid "Annotation Source" -msgstr "аннотация" +msgstr "Настройки аннотации из графика" #: superset/annotation_layers/annotations/commands/exceptions.py:64 msgid "Annotation could not be created." -msgstr "Аннотация не может быть создана." +msgstr "Не удалось создать аннотацию" #: superset/annotation_layers/annotations/commands/exceptions.py:68 msgid "Annotation could not be updated." -msgstr "Аннотация не может быть обновлена." +msgstr "Не удалось обновить аннотацию" #: superset/annotation_layers/annotations/commands/exceptions.py:72 msgid "Annotation delete failed." -msgstr "Удаление аннотации не удалось." - -#: superset/views/annotations.py:47 -msgid "Annotation end time must be no earlier than start time." -msgstr "Конец интервала для аннотации должен быть не раньше начала." +msgstr "Не удалось удалить аннотацию" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:265 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:322 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:429 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:262 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:319 msgid "Annotation layer" -msgstr "Слои аннотаций" +msgstr "Слой аннотаций" #: superset/annotation_layers/commands/exceptions.py:37 msgid "Annotation layer could not be created." -msgstr "Слой аннотаций не может быть создан." +msgstr "Не удалось создать слой аннотации." #: superset/annotation_layers/commands/exceptions.py:33 msgid "Annotation layer could not be deleted." -msgstr "Слой аннотаций не может быть удалён." +msgstr "Не удалось удалить слой аннотации." #: superset/annotation_layers/commands/exceptions.py:41 msgid "Annotation layer could not be updated." -msgstr "Слой аннотаций не может быть обновлён." +msgstr "Не удалось обновить слой аннотации." #: superset/annotation_layers/commands/exceptions.py:49 msgid "Annotation layer delete failed." -msgstr "Ошибка удаления слоя аннотаций." +msgstr "Не удалось удалить слой аннотаций" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:517 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:565 msgid "Annotation layer description columns" -msgstr "Слой аннотаций не найден." +msgstr "Описательные столбцы слоя аннотаций." #: superset/annotation_layers/commands/exceptions.py:53 #: superset/annotation_layers/commands/exceptions.py:57 msgid "Annotation layer has associated annotations." -msgstr "Слой аннотаций имеет присвоенные аннотации." +msgstr "Слои аннотаций имеет связанные аннотации" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:492 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:540 msgid "Annotation layer interval end" -msgstr "Имя слоя аннотаций" +msgstr "Конечный интервал слоя аннотации" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:247 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:251 msgid "Annotation layer name" msgstr "Имя слоя аннотаций" #: superset/annotation_layers/commands/exceptions.py:45 msgid "Annotation layer not found." -msgstr "Слой аннотаций не найден." +msgstr "Слой аннотации не найден" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:634 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:682 msgid "Annotation layer opacity" -msgstr "Тип слоя аннотации" +msgstr "Непрозрачность слоя аннотации" #: superset/annotation_layers/commands/exceptions.py:29 msgid "Annotation layer parameters are invalid." -msgstr "Параметры слоя аннотации недействительны." +msgstr "Параметры слоя аннотаций недействительны" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:619 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:667 msgid "Annotation layer stroke" -msgstr "Тип слоя аннотации" +msgstr "Штрих слоя аннотации" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:472 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:520 #, fuzzy msgid "Annotation layer time column" msgstr "Тип слоя аннотации" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:506 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:554 #, fuzzy msgid "Annotation layer title column" -msgstr "Тип слоя аннотации" +msgstr "Название столбца слоя аннотации" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:743 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:746 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:793 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:796 msgid "Annotation layer type" msgstr "Тип слоя аннотации" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:403 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:450 msgid "Annotation layer value" -msgstr "Имя слоя аннотаций" +msgstr "Значение слоя аннотации" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:72 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:343 +#: superset-frontend/src/explore/controlPanels/sections.tsx:83 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:71 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:335 msgid "Annotation layers" msgstr "Слои аннотаций" -#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:45 +#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:58 msgid "Annotation layers are still loading." msgstr "Слои аннотаций загружаются." -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:292 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:291 msgid "Annotation name" -msgstr "Слои аннотаций" +msgstr "Имя аннотации" #: superset/annotation_layers/annotations/commands/exceptions.py:56 msgid "Annotation not found." @@ -1675,43 +2142,48 @@ msgstr "Аннотация не найдена." msgid "Annotation parameters are invalid." msgstr "Параметры аннотации недействительны." -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:755 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:808 +msgid "Annotation source" +msgstr "Источник аннотации" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:805 msgid "Annotation source type" -msgstr "Тип слоя аннотации" +msgstr "Тип источника аннотации" -#: superset/views/annotations.py:58 -msgid "Annotations" -msgstr "Аннотации" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:154 +msgid "Annotation template created" +msgstr "Шаблон аннотации создан" + +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:139 +msgid "Annotation template updated" +msgstr "Шаблон аннотации обновлен" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/annotationsAndLayers.tsx:25 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:113 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:261 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:116 msgid "Annotations and Layers" -msgstr "Аннотация" +msgstr "Аннотации и слои" -#: superset-frontend/src/explore/controlPanels/sections.tsx:91 +#: superset-frontend/src/explore/controlPanels/sections.tsx:72 msgid "Annotations and layers" -msgstr "Аннотация" +msgstr "Аннотации и слои" #: superset/annotation_layers/annotations/commands/exceptions.py:52 msgid "Annotations could not be deleted." -msgstr "Аннотации не могут быть удалены." +msgstr "Не удалось удалить аннотации." -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:441 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:535 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:438 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:496 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:509 -#, fuzzy +#: superset-frontend/src/pages/ChartList/index.tsx:566 +#: superset-frontend/src/pages/ChartList/index.tsx:675 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:459 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:527 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:541 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:574 msgid "Any" -msgstr "день" +msgstr "Любой" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:563 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:269 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:628 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:282 msgid "Any additional detail to show in the certification tooltip." -msgstr "" +msgstr "Любые дополнительные сведения для всплывающей подсказки" #: superset-frontend/src/dashboard/components/ColorSchemeControlWrapper.jsx:56 msgid "" @@ -1721,63 +2193,77 @@ msgstr "" "Любая палитра, выбранная здесь, будет перезаписывать цвета, применённые к" " отдельным графикам этого дашборда" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:702 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:903 msgid "Any databases that allow connections via SQL Alchemy URIs can be added. " msgstr "" +"Любые базы данных, подключаемые через SQL Alchemy URI, могут быть " +"добавлены. " -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:716 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:917 msgid "" "Any databases that allow connections via SQL Alchemy URIs can be added. " "Learn about how to connect a database driver " msgstr "" +"Любые базы данных, подключаемые через SQL Alchemy URI, могут быть " +"добавлены. Узнайте больше о том, как подключить драйвер базы данных " -#: superset/views/database/forms.py:147 superset/views/database/forms.py:300 -#: superset/views/database/forms.py:428 +#: superset/views/database/forms.py:169 superset/views/database/forms.py:326 +#: superset/views/database/forms.py:457 msgid "Append" msgstr "Добавить" -#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:186 -#, fuzzy, python-format +#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:187 +#, python-format msgid "Applied Cross Filters (%d)" -msgstr "Применено фильтров (%d)" +msgstr "Применено кросс-фильтров: (%d)" -#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:210 +#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:211 #, python-format msgid "Applied Filters (%d)" -msgstr "Применено фильтров (%d)" +msgstr "Применено фильтров: (%d)" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx:191 +#, python-format +msgid "Applied filters: %s" +msgstr "Применены фильтры: %s" -#: superset/viz.py:237 +#: superset/viz.py:245 msgid "" "Applied rolling window did not return any data. Please make sure the " "source query satisfies the minimum periods defined in the rolling window." msgstr "" +"Применное скользязее окно не вернуло данных. Убедитесь, что исходный " +"запрос удовлетворяет минимальному количеству периодов скользящего окна." -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:458 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx:144 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:788 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:103 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/index.tsx:142 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:839 #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:228 -#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:433 +#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:476 msgid "Apply" msgstr "Применить" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:321 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:386 msgid "Apply conditional color formatting to metrics" -msgstr "" +msgstr "Применить условное цветовое форматирование к мерам" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:474 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:501 msgid "Apply conditional color formatting to numeric columns" -msgstr "" +msgstr "Применить условное цветовое форматирование к столбцам" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:79 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/index.tsx:142 +msgid "Apply filters" +msgstr "Применить фильтры" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:116 msgid "Apply metrics on" -msgstr "Показатель" +msgstr "Применить меры к" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:123 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:122 msgid "Apply to all panels" msgstr "Применить ко всем панелям" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:125 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:124 msgid "Apply to specific panels" msgstr "Применить к выбранным панелям" @@ -1785,730 +2271,873 @@ msgstr "Применить к выбранным панелям" msgid "April" msgstr "Апрель" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:85 +msgid "Arc" +msgstr "Дуга" + +#: superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.tsx:163 +msgid "Are you sure you intend to overwrite the following values?" +msgstr "Вы уверены, что хотите перезаписать эти значения?" + #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:49 msgid "Are you sure you want to cancel?" msgstr "Вы уверены, что хотите отменить?" -#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:80 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:360 -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:108 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:358 +#: superset-frontend/src/pages/ChartList/ChartCard.tsx:83 +#: superset-frontend/src/pages/ChartList/index.tsx:479 +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:107 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:373 msgid "Are you sure you want to delete" msgstr "Вы уверены, что хотите удалить" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:286 -msgid "" -"Are you sure you want to delete " -"${annotationCurrentlyDeleting?.short_descr}?" -msgstr "" -"Вы уверены, что хотите удалить " -"${annotationCurrentlyDeleting?.short_descr}?" +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:282 +#, python-format +msgid "Are you sure you want to delete %s?" +msgstr "Вы уверены, что хотите удалить %s?" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:486 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:585 #, python-format msgid "Are you sure you want to delete the selected %s?" msgstr "Вы уверены, что хотите удалить выбранные %s?" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:301 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:298 msgid "Are you sure you want to delete the selected annotations?" msgstr "Вы уверены, что хотите удалить выбранные аннотации?" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:645 +#: superset-frontend/src/pages/ChartList/index.tsx:797 msgid "Are you sure you want to delete the selected charts?" msgstr "Вы уверены, что хотите удалить выбранные графики?" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:612 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:651 msgid "Are you sure you want to delete the selected dashboards?" msgstr "Вы уверены, что хотите удалить выбранные дашборды?" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:618 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:769 msgid "Are you sure you want to delete the selected datasets?" msgstr "Вы уверены, что хотите удалить выбранные датасеты?" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:366 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:358 msgid "Are you sure you want to delete the selected layers?" msgstr "Вы уверены, что хотите удалить выбранные слои?" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:500 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:504 msgid "Are you sure you want to delete the selected queries?" msgstr "Вы уверены, что хотите удалить выбранные запросы?" -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:326 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:328 msgid "Are you sure you want to delete the selected templates?" msgstr "Вы уверены, что хотите удалить выбранные шаблоны?" +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:426 +msgid "Are you sure you want to overwrite this dataset?" +msgstr "Вы уверены, что хотите перезаписать этот датасет?" + #: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:133 msgid "Are you sure you want to proceed?" msgstr "Вы уверены, что хотите продолжить?" -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:173 +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:500 +#, fuzzy +msgid "Are you sure you want to remove the last temporal filter?" +msgstr "Вы уверены, что хотите удалить выбранные шаблоны?" + +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:170 msgid "Are you sure you want to save and apply changes?" msgstr "Вы уверены, что хотите сохранить и применить изменения?" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:41 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:132 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:135 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:71 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:92 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:89 msgid "Area Chart" -msgstr "Поделиться графиком" +msgstr "Диаграмма с областями" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:168 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:41 +msgid "Area Chart (legacy)" +msgstr "Диаграмма с областями (устарело)" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:170 msgid "Area chart" -msgstr "Поделиться графиком" +msgstr "Диаграмма с областями" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:131 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:146 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:149 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:90 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:106 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:103 msgid "Area chart opacity" -msgstr "Поделиться графиком" +msgstr "Непрозрачность диаграммы с областями" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:238 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:57 +msgid "" +"Area charts are similar to line charts in that they represent variables " +"with the same scale, but area charts stack the metrics on top of each " +"other." +msgstr "" +"Диаграммы с областями похожи на линейные диаграммы в том смысле, что они " +"отображают показатели с одинаковым масштабом, но диаграммы областей " +"накладывают эти показатели друг на друга." + +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:239 msgid "Arrow" -msgstr "строк" +msgstr "Стрела" + +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:67 +msgid "Assign a set of parameters as" +msgstr "Задайте набор параметров в формате" -#: superset/connectors/druid/views.py:342 superset/connectors/sqla/views.py:487 +#: superset/connectors/sqla/views.py:477 msgid "Associated Charts" msgstr "Связанные графики" -#: superset/views/database/mixins.py:199 +#: superset/views/database/mixins.py:196 msgid "Async Execution" msgstr "Асинхронное выполнение" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:236 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:401 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:285 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:306 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:472 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:295 msgid "Asynchronous query execution" -msgstr "" +msgstr "Асинхронное выполнение запросов" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:73 msgid "August" msgstr "Август" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:523 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:127 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:146 +msgid "Auto" +msgstr "Автоматически" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:97 +msgid "Auto Zoom" +msgstr "Авто масштабирование" + +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:508 msgid "Autocomplete" -msgstr "" +msgstr "Автозаполнение" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:708 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:874 msgid "Autocomplete filters" -msgstr "" +msgstr "Фильтры автозаполнения" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:715 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:881 msgid "Autocomplete query predicate" -msgstr "Извлечь Значения Предиката" +msgstr "Предикат запроса автозаполнения" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:709 +msgid "Automatic Color" +msgstr "Автоматический цвет" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:242 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:270 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:307 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:335 msgid "Available sorting modes:" -msgstr "" +msgstr "Доступные режимы сортировки:" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:200 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:183 +msgid "Average" +msgstr "Среднее" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:196 msgid "Axis" -msgstr "Ось Y" +msgstr "Ось" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:36 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:241 +msgid "Axis Bounds" +msgstr "Границы оси" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:188 +msgid "Axis Format" +msgstr "Формат Оси" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:63 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:94 +msgid "Axis Title" +msgstr "Название оси" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:37 msgid "Axis ascending" -msgstr "Направление сортировки" +msgstr "Ось по возрастанию" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:37 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:38 msgid "Axis descending" -msgstr "Сортировать" +msgstr "Ось по убыванию" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:770 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:786 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:140 +msgid "BOOLEAN" +msgstr "Булевый (BOOLEAN)" + +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:366 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:989 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1006 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1026 msgid "Back" -msgstr "" +msgstr "Назад" + +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:181 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:262 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:264 +msgid "Back to all" +msgstr "Вернуться ко всем" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:227 -#: superset/views/database/mixins.py:204 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:297 +#: superset/views/database/mixins.py:200 msgid "Backend" -msgstr "" +msgstr "Драйвер" -#: superset/viz.py:2472 superset/viz.py:2508 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:188 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:262 +msgid "Backward values" +msgstr "Предыдущие значения" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:480 +msgid "Bad formula." +msgstr "Неверная формула." + +#: superset/viz.py:2506 superset/viz.py:2542 msgid "Bad spatial key" -msgstr "" +msgstr "Неподходящий пространственный ключ" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:85 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:38 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:46 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:144 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:88 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:77 msgid "Bar" -msgstr "" +msgstr "Столбчатая" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:38 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:43 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:78 msgid "Bar Chart" -msgstr "Поделиться графиком" +msgstr "Столбчатая диаграмма" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:294 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:43 +msgid "Bar Chart (legacy)" +msgstr "Столбчатая диаграмма (устарело)" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:63 +msgid "Bar Charts are used to show metrics as a series of bars." +msgstr "" +"Столбчатые диаграммы используются для отображения показателей в виде " +"серии столбцов." + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:314 msgid "Bar Values" -msgstr "Значение фильтра" +msgstr "Значения столбцов" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:227 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:276 +msgid "Bar orientation" +msgstr "Направление столбцов" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:239 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:382 msgid "Base layer map style" msgstr "" #: superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx:165 -#, fuzzy msgid "Based on a metric" -msgstr "Сохранённый показатель" +msgstr "На основе меры" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:50 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:56 msgid "Based on granularity, number of time periods to compare against" msgstr "" +"Основываясь на группировке времени, количество периодов времени для " +"сравнения" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:686 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:263 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1034 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:848 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1534 msgid "Basic" -msgstr "" +msgstr "Базовая настройка" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:497 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:229 -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:288 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:243 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:237 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:581 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:242 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:287 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:247 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:235 msgid "Basic information" msgstr "Основная информация" -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:486 +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:749 #, python-format msgid "Batch editing %d filters:" -msgstr "" +msgstr "Множественное редактирование фильтров: %d" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:36 msgid "Battery level over time" -msgstr "" +msgstr "Уровень заряда батареи с течением времени" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1175 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1335 msgid "Be careful." msgstr "Будьте осторожны." -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:76 -#, fuzzy +#: superset-frontend/src/components/AlteredSliceTag/index.jsx:178 +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:75 msgid "Before" -msgstr "Принудительное обновление" +msgstr "До" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:38 -#: superset/viz.py:1254 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:37 +#: superset/viz.py:1283 msgid "Big Number" -msgstr "Big Number" +msgstr "Карточка" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:28 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:28 msgid "Big Number Font Size" -msgstr "" +msgstr "Размер шрифта числа" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:34 -#: superset/viz.py:1220 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:36 +#: superset/viz.py:1249 msgid "Big Number with Trendline" -msgstr "Big Number with Trendline" +msgstr "Карточка с трендовой линией" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:290 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:84 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:355 msgid "Bottom" -msgstr "dttm" +msgstr "Снизу" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:212 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:187 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:226 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:194 msgid "Bottom Margin" -msgstr "" +msgstr "Нижний отступ" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:185 +msgid "Bottom left" +msgstr "Снизу слева" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:224 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:191 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:238 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:206 msgid "Bottom margin, in pixels, allowing for more room for axis labels" -msgstr "" +msgstr "Нижний отступ (в пикселях), дает больше пространства меткам оси" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:140 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:186 +msgid "Bottom right" +msgstr "Снизу справа" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:141 msgid "Bottom to Top" -msgstr "" +msgstr "Снизу вверх" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:241 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:257 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:357 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:272 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:235 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:215 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:232 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:288 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:291 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:261 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:277 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:373 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:261 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:248 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:192 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:192 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:245 msgid "" "Bounds for the Y-axis. When left empty, the bounds are dynamically " "defined based on the min/max of the data. Note that this feature will " "only expand the axis range. It won't narrow the data's extent." msgstr "" +"Границы для оси Y. Если оставить поле пустым, границы динамически " +"определяются на основе минимального/максимального значения данных. " +"Обратите внимание, что эта функция только расширит диапазон осей. Она не " +"изменит размер графика." + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:244 +msgid "" +"Bounds for the axis. When left empty, the bounds are dynamically defined " +"based on the min/max of the data. Note that this feature will only expand" +" the axis range. It won't narrow the data's extent." +msgstr "" +"Границы для оси. Если оставить поле пустым, границы динамически " +"определяются на основе минимального/максимального значения данных. " +"Обратите внимание, что эта функция только расширит диапазон осей. Она не " +"изменит размер графика." #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/BoxPlot/index.js:26 #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:54 #: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/createMetadata.ts:27 msgid "Box Plot" -msgstr "Box Plot" +msgstr "Ящик с усами" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:133 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:123 #, fuzzy msgid "Breakdowns" msgstr "Дата создания" -#: superset/connectors/druid/views.py:237 -msgid "Broker Endpoint" -msgstr "Адрес брокера" - -#: superset/connectors/druid/views.py:233 -msgid "Broker Host" -msgstr "Хост брокера" - -#: superset/connectors/druid/views.py:236 -msgid "Broker Password" -msgstr "Пароль брокера" - -#: superset/connectors/druid/views.py:234 -msgid "Broker Port" -msgstr "Порт брокера" - -#: superset/connectors/druid/views.py:235 -msgid "Broker Username" -msgstr "Пользователь брокера" - -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:30 -#: superset/viz.py:1139 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:32 +#: superset/viz.py:1168 msgid "Bubble Chart" -msgstr "Bubble Chart" +msgstr "Пузырьковая диаграмма" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:127 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:143 msgid "Bubble Color" -msgstr "Фиксированный цвет" +msgstr "Цвет пузыря" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:141 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:420 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:123 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:206 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:139 msgid "Bubble Size" -msgstr "Размер маркера" +msgstr "Размер пузыря" -#: superset-frontend/src/explore/controls.jsx:435 +#: superset-frontend/src/explore/controls.jsx:415 msgid "Bubble size" msgstr "Размер маркера" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:362 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:212 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:277 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:597 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:149 +msgid "Bucket break points" +msgstr "" + +#: superset-frontend/src/views/components/RightMenu.tsx:527 +msgid "Build" +msgstr "Сборка" + +#: superset-frontend/src/pages/ChartList/index.tsx:748 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:432 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:226 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:274 #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:262 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:572 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:495 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:169 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:611 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:600 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:168 msgid "Bulk select" msgstr "Множественный выбор" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:30 -#: superset/viz.py:1190 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:32 +#: superset/viz.py:1219 msgid "Bullet Chart" -msgstr "Bullet Chart" +msgstr "Диаграмма-шкала" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:32 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:34 #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:40 #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:35 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:41 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:31 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:54 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:45 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:55 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:33 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:40 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:56 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:48 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:58 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:44 msgid "Business" -msgstr "" +msgstr "Бизнес" + +#: superset/connectors/sqla/views.py:166 +msgid "Business Data Type" +msgstr "Тип данных бизнеса" #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:233 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:139 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:138 msgid "" "By default, each filter loads at most 1000 choices at the initial page " "load. Check this box if you have more than 1000 filter values and want to" " enable dynamically searching that loads filter values as users type (may" " add stress to your database)." msgstr "" -"По-умолчанию, каждый фильтр загружает не больше 1000 элементов выбора при" +"По умолчанию, каждый фильтр загружает не больше 1000 элементов выбора при" " начальной загрузке страницы. Установите этот флаг, если у вас больше " "1000 значений фильтра и вы хотите включить динамический поиск, который " "загружает значения по мере их ввода пользователем (может увеличить " "нагрузку на вашу базу данных)." -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:272 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:337 msgid "By key: use column names as sorting key" -msgstr "" +msgstr "По ключу: использовать имена столбцов как ключ сортировки" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:244 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:309 msgid "By key: use row names as sorting key" -msgstr "" +msgstr "По ключу: использовать имена строк как ключ сортировки" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:245 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:273 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:310 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:338 msgid "By value: use metric values as sorting key" -msgstr "" +msgstr "По значению: использовать значения мер как ключ сортировки" -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:334 +#: superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:242 +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:327 msgid "CANCEL" -msgstr "ОТМЕНИТЬ" +msgstr "ОТМЕНА" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:601 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1356 +msgid "CREATE DATASET" +msgstr "СОЗДАТЬ ДАТАСЕТ" + +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:563 msgid "CREATE TABLE AS" -msgstr "Разрешить CREATE TABLE AS" +msgstr "CREATE TABLE AS" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:614 +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:574 msgid "CREATE VIEW AS" -msgstr "Разрешить CREATE TABLE AS" +msgstr "CREATE VIEW AS" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:205 +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:234 msgid "CREATE VIEW statement" msgstr "Выражение CREATE VIEW" -#: superset-frontend/src/views/CRUD/alert/components/AlertReportCronScheduler.tsx:75 +#: superset-frontend/src/views/CRUD/alert/components/AlertReportCronScheduler.tsx:83 +msgid "CRON Schedule" +msgstr "CRON расписание" + +#: superset-frontend/src/views/CRUD/alert/components/AlertReportCronScheduler.tsx:94 msgid "CRON expression" -msgstr "Выражение SQL" +msgstr "CRON выражение" -#: superset-frontend/src/dashboard/components/CssEditor/index.jsx:104 +#: superset-frontend/src/dashboard/components/CssEditor/index.jsx:105 #: superset/views/dashboard/mixin.py:88 msgid "CSS" msgstr "CSS" -#: superset/initialization/__init__.py:265 superset/views/css_templates.py:36 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/style.tsx:75 +msgid "CSS Styles" +msgstr "CSS стили" + +#: superset/initialization/__init__.py:282 superset/views/css_templates.py:38 msgid "CSS Templates" -msgstr "Шаблоны CSS" +msgstr "CSS шаблоны" + +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/style.tsx:76 +msgid "CSS applied to the chart" +msgstr "CSS, примененный к графику" #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:249 msgid "CSS template" -msgstr "Шаблоны CSS" +msgstr "CSS шаблон" #: superset/css_templates/commands/exceptions.py:23 msgid "CSS template could not be deleted." -msgstr "Шаблон CSS не может быть удалён." +msgstr "Не удалось удалить CSS шаблон." -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:241 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:239 msgid "CSS template name" -msgstr "Имя Шаблона" +msgstr "Имя CSS шаблона" #: superset/css_templates/commands/exceptions.py:27 msgid "CSS template not found." -msgstr "Шаблон CSS не найден." +msgstr "CSS шаблон не найден." #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:71 #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:240 msgid "CSS templates" -msgstr "Шаблоны CSS" +msgstr "CSS шаблоны" -#: superset/views/database/forms.py:101 -msgid "CSV File" -msgstr "CSV-файл" +#: superset/views/database/forms.py:109 +msgid "CSV Upload" +msgstr "Загрузка CSV" -#: superset/views/database/views.py:252 +#: superset/views/database/views.py:287 #, python-format msgid "" "CSV file \"%(csv_filename)s\" uploaded to table \"%(table_name)s\" in " "database \"%(db_name)s\"" msgstr "" -"CSV-файл \"%(csv_filename)s\" загружен в таблицу \"%(table_name)s\" базы " -"данных \"%(db_name)s\"" +"CSV файл \"%(csv_filename)s\" загружен в таблицу \"%(table_name)s\" в " +"базе данных \"%(db_name)s\"" -#: superset/views/database/views.py:118 +#: superset/views/database/views.py:160 msgid "CSV to Database configuration" -msgstr "Настройка CSV для БД" +msgstr "Конфигурация CSV файла для импорта в базу данных" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:271 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:341 msgid "CSV upload" -msgstr "Загрузить CSV" +msgstr "Загрузка CSV" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:118 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:130 msgid "CTAS & CVAS SCHEMA" -msgstr "" +msgstr "СХЕМА CTAS & CVAS" -#: superset/sql_lab.py:405 +#: superset/sql_lab.py:440 msgid "" "CTAS (create table as select) can only be run with a query where the last" " statement is a SELECT. Please make sure your query has a SELECT as its " "last statement. Then, try running your query again." msgstr "" -"CTAS (create table as select) может быть выполнено только в запросе, " -"последняя операция которого SELECT." +"CTAS (CREATE TABLE AS SELECT) может быть выполнен в запросе с " +"единственным SELECT запросом. Пожалуйста, убедитесь, что запрос содержит " +"только один SELECT запрос. Затем выполните запрос заново." -#: superset/views/database/mixins.py:190 +#: superset/views/database/mixins.py:187 msgid "CTAS Schema" -msgstr "Схема по умолчанию" +msgstr "Схема CTAS" -#: superset/sql_lab.py:422 +#: superset/sql_lab.py:457 msgid "" "CVAS (create view as select) can only be run with a query with a single " "SELECT statement. Please make sure your query has only a SELECT " "statement. Then, try running your query again." msgstr "" -"может быть выполнено только в запросе, в котором есть только одна " -"операция SELECT." +"CVAS (CREATE VIEW AS SELECT) может быть выполнен в запросе с единственным" +" SELECT запросом. Пожалуйста, убедитесь, что запрос содержит только один " +"SELECT запрос. Затем выполните запрос заново." -#: superset/errors.py:123 +#: superset/errors.py:129 msgid "CVAS (create view as select) query has more than one statement." -msgstr "" +msgstr "CVAS (CREATE VIEW AS SELECT) запрос содержит больше одного запроса." -#: superset/errors.py:124 +#: superset/errors.py:130 msgid "CVAS (create view as select) query is not a SELECT statement." -msgstr "" +msgstr "CVAS (CREATE VIEW AS SELECT) запрос не является SELECT запросом." -#: superset/connectors/druid/views.py:239 -#: superset/connectors/druid/views.py:351 superset/connectors/sqla/views.py:497 -#: superset/views/chart/mixin.py:77 +#: superset/connectors/sqla/views.py:487 superset/views/chart/mixin.py:77 msgid "Cache Timeout" -msgstr "Тайм-аут кеша" +msgstr "Время жизни кэша" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:67 -#: superset-frontend/src/explore/controlPanels/sections.tsx:51 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:79 +#: superset-frontend/src/explore/controlPanels/sections.tsx:41 msgid "Cache Timeout (seconds)" -msgstr "Тайм-аут кэша (секунды)" +msgstr "Время жизни кэша (секунды)" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:771 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:278 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:939 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:291 msgid "Cache timeout" -msgstr "Тайм-аут Кэша" +msgstr "Время жизни кэша" + +#: superset-frontend/src/components/CachedLabel/index.tsx:51 +msgid "Cached" +msgstr "Добавлено в кэш" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:241 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:366 #, python-format msgid "Cached %s" -msgstr "" +msgstr "Добавлено в кэш %s" -#: superset/viz.py:539 +#: superset/viz.py:559 msgid "Cached value not found" -msgstr "Значение не найдено в кеше" +msgstr "Кэшированное значение не найдено" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:76 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:70 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:76 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:77 -#, fuzzy -msgid "Calculate contribution per series or total" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx:45 +msgid "Calculate contribution per series or row" msgstr "" -"Вычислить вклад в общую сумму (долю). Установите формат показателя в " -"проценты" +"Вычислить вклад в общую сумму (долю) по категории или строке. " +"Установливает формат показателя в проценты" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:667 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:829 #, python-format msgid "Calculated column [%s] requires an expression" -msgstr "Для расчётного столбца [%s] требуется выражение" +msgstr "Для вычисляемого столбца [%s] требуется выражение" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1241 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1403 msgid "Calculated columns" -msgstr "Расчётные столбцы" +msgstr "Вычисляемые столбцы" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:121 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:334 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:217 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:469 -#: superset-frontend/src/explore/controlPanels/sections.tsx:232 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:137 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:329 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:211 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:481 +#: superset-frontend/src/explore/controlPanels/sections.tsx:207 msgid "Calculation type" msgstr "Тип расчёта" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:30 -#: superset/viz.py:1048 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:32 +#: superset/viz.py:1077 msgid "Calendar Heatmap" -msgstr "Calendar Heatmap" +msgstr "Календарная тепловая карта" -#: superset-frontend/src/dashboard/actions/dashboardLayout.js:211 +#: superset-frontend/src/dashboard/actions/dashboardLayout.js:213 msgid "Can not move top level tab into nested tabs" msgstr "Невозможно перенести вкладку верхнего уровня во вложенную вкладку" -#: superset/views/core.py:2010 -#, python-format -msgid "Can't find DruidCluster with cluster_name = '%(name)s'" -msgstr "Не удалось найти DruidCluster с именем cluster_name = ‘%(name)s’" - -#: superset/views/core.py:1998 -#, python-format -msgid "Can't find User '%(name)s', please ask your admin to create one." -msgstr "" -"Не удалось найти пользователя ‘%(name)s’. Обратитесь к администратору, " -"чтобы создать его." +#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:59 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:77 +msgid "Can select multiple values" +msgstr "Можно выбрать несколько значений" -#: superset/viz.py:1778 +#: superset/viz.py:1807 msgid "Can't have overlap between Series and Breakdowns" -msgstr "Срезы в полях [Столбцы данных] и [Ряды данных] должны быть разными" +msgstr "" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:173 -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:218 -#: superset-frontend/src/components/Modal/Modal.tsx:240 -#: superset-frontend/src/components/ReportModal/index.tsx:259 -#: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:80 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:207 +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:737 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:263 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:181 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:222 +#: superset-frontend/src/components/Modal/Modal.tsx:262 +#: superset-frontend/src/components/ReportModal/index.tsx:214 +#: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:92 #: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:72 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:474 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:548 #: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:151 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:137 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:136 #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:76 #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:62 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:194 -#: superset-frontend/src/explore/components/SaveModal.tsx:179 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:775 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:200 +#: superset-frontend/src/explore/components/SaveModal.tsx:368 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:826 +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/Footer/index.tsx:121 #: superset/templates/superset/request_access.html:34 msgid "Cancel" -msgstr "Отменить" +msgstr "Отмена" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:304 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:314 msgid "Cancel query on window unload event" -msgstr "" - -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts:83 -msgid "Cannot create cyclic hierarchy" -msgstr "" +msgstr "Отменять запрос при закрытии вкладки" -#: superset/databases/commands/exceptions.py:109 -#, fuzzy +#: superset/databases/commands/exceptions.py:111 msgid "Cannot delete a database that has datasets attached" -msgstr "Невозможно удалить базу данных, для которой созданы таблицы" +msgstr "Невозможно удалить базу данных с подключенными датасетами" -#: superset/views/core.py:700 +#: superset/views/core.py:721 #, python-format msgid "" "Cannot import dashboard: %(db_error)s.\n" "Make sure to create the database before importing the dashboard." msgstr "" "Невозможно импортировать дашборд: %(db_error)s.\n" -"Убедитесь, что перед импортом дашборда была создана база данных." +"Убедитесь, что база даннах создана перед импортированием дашборда." -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx:242 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:944 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx:288 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1193 msgid "Cannot load filter" -msgstr "Временной фильтр" +msgstr "Невозможно загрузить фильтр" #: superset/charts/commands/exceptions.py:51 #, python-format msgid "Cannot parse time string [%(human_readable)s]" -msgstr "" +msgstr "Не удается разобрать временную строку [%(human_readable)s]" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:30 #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:38 #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:42 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:41 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:47 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:66 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:41 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:59 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:42 msgid "Categorical" -msgstr "" +msgstr "Категориальный" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:105 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:142 +msgid "Categorical Color" +msgstr "Цвет категории" -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:129 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:166 msgid "Categories to group by on the x-axis." -msgstr "" +msgstr "Категории для группировки по оси x" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:602 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/Scatter.jsx:46 +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:678 msgid "Category" -msgstr "" - -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:87 +msgstr "Категория" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:51 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:88 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:102 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:115 +msgid "Category Name" +msgstr "Имя категории" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:55 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:94 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:106 +msgid "Category and Percentage" +msgstr "Категория и процентная доля" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:54 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:91 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:105 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:110 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:117 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:100 +msgid "Category and Value" +msgstr "Категория и значение" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:88 msgid "Category of target nodes" -msgstr "" +msgstr "Категория целевых вершин" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:56 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:98 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:107 +msgid "Category, Value and Percentage" +msgstr "Категория, значение и процентная доля" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:103 msgid "Cell Padding" -msgstr "" +msgstr "Расстояние между ячейками" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:117 msgid "Cell Radius" -msgstr "" +msgstr "Радиус ячейки" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:91 -#, fuzzy msgid "Cell Size" -msgstr "Файл Excel" +msgstr "Размер ячейки" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:413 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:424 msgid "Cell bars" -msgstr "Все графики" +msgstr "Гистограммы в ячейках" -#: superset-frontend/src/components/FilterableTable/FilterableTable.tsx:319 +#: superset-frontend/src/components/FilterableTable/index.tsx:431 msgid "Cell content" -msgstr "Созданный контент" +msgstr "Содержимое ячейки" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:112 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:135 +msgid "Cell limit" +msgstr "Лимит ячеек" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:101 msgid "Center" -msgstr "Последние" +msgstr "По центру" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:533 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:252 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/Hex.jsx:33 +msgid "Centroid (Longitude and Latitude): " +msgstr "Центроид (Долгота и Широта): " + +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:608 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:265 msgid "Certification" -msgstr "Детали сертификации" - -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:270 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:275 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1079 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1085 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:553 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:555 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:263 +msgstr "Утверждение" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:337 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:342 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1229 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1235 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:622 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:276 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:279 msgid "Certification details" -msgstr "Детали сертификации" +msgstr "Детали утверждения" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:530 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:504 -#, fuzzy +#: superset-frontend/src/pages/ChartList/index.tsx:669 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:535 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:568 msgid "Certified" -msgstr "Изменено" +msgstr "Утверждено" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:259 -#, fuzzy +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:326 msgid "Certified By" -msgstr "Изменено" - -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:264 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1066 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1074 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:538 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:540 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:254 +msgstr "Кем утверждено" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:331 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1216 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1224 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:613 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:267 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:268 msgid "Certified by" -msgstr "Изменено" +msgstr "Кем утверждено" #: superset-frontend/packages/superset-ui-chart-controls/src/components/CertifiedIconWithTooltip.tsx:46 -#: superset-frontend/src/components/CertifiedIcon/index.tsx:42 +#: superset-frontend/src/components/CertifiedBadge/index.tsx:44 #, python-format msgid "Certified by %s" -msgstr "Сертифицирован: %s" +msgstr "Утверждено: %s" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:253 -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:195 -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:267 -msgid "Change dataset" -msgstr "Выберите источник данных" - -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:269 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:334 msgid "Change order of columns." -msgstr "" +msgstr "Сменить порядок столбцов." -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:241 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:306 msgid "Change order of rows." -msgstr "" +msgstr "Сменить порядок строк." -#: superset/connectors/druid/views.py:354 superset/connectors/sqla/views.py:489 +#: superset/connectors/sqla/views.py:479 msgid "Changed By" -msgstr "Изменено" - -#: superset/views/schedules.py:238 superset/views/schedules.py:318 -msgid "Changed On" -msgstr "Изменено" +msgstr "Кем изменено" -#: superset/views/sql_lab.py:75 +#: superset/views/sql_lab/views.py:88 msgid "Changed on" -msgstr "Изменено" +msgstr "Дата изменения" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:50 +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:80 +msgid "Changes saved." +msgstr "Изменения сохранены." + +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:51 msgid "" "Changing the dataset may break the chart if the chart relies on columns " "or metadata that does not exist in the target dataset" msgstr "" -"Изменения датасета может привести к тому, что график станет нерабочим, " +"Изменение датасета может привести к тому, что график станет нерабочим, " "если график использует несуществующие в целевом датасете столбцы или " "метаданные" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1176 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1336 msgid "" "Changing these settings will affect all charts using this dataset, " "including charts owned by other people." @@ -2518,155 +3147,185 @@ msgstr "" #: superset/dashboards/commands/exceptions.py:78 msgid "Changing this Dashboard is forbidden" -msgstr "Изменение этого дашборда запрещено" +msgstr "Запрещено изменять этот дашборд" -#: superset/charts/commands/exceptions.py:131 +#: superset/charts/commands/exceptions.py:135 msgid "Changing this chart is forbidden" -msgstr "Изменение этого графика запрещено" +msgstr "Запрещено изменять этот график" #: superset-frontend/packages/superset-ui-chart-controls/src/components/ControlHeader.tsx:75 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:40 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:55 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:68 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:83 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:98 -#: superset-frontend/src/explore/components/ControlHeader.jsx:77 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:45 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:60 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:73 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:88 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:103 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:66 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:97 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:114 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:131 +#: superset-frontend/src/explore/components/ControlHeader.tsx:123 msgid "Changing this control takes effect instantly" msgstr "Изменение этого элемента применяется сразу" -#: superset/datasets/commands/exceptions.py:177 +#: superset/datasets/commands/exceptions.py:181 msgid "Changing this dataset is forbidden" -msgstr "Изменение этого датасета запрещено" +msgstr "Запрещено изменять этот датасет" #: superset/datasets/columns/commands/exceptions.py:31 #: superset/datasets/metrics/commands/exceptions.py:31 -#, fuzzy msgid "Changing this dataset is forbidden." -msgstr "Изменение этого датасета запрещено" - -#: superset/reports/commands/exceptions.py:238 -msgid "Changing this report is forbidden" -msgstr "Изменение этого отчёта запрещено" +msgstr "Запрещено изменять этот датасет" -#: superset/views/database/forms.py:216 superset/views/database/forms.py:349 -msgid "Character to interpret as decimal point." -msgstr "Символ, который интерпретируется как десятичная точка." +#: superset/explore/exceptions.py:49 +msgid "Changing this datasource is forbidden" +msgstr "Запрещено изменять этот источник данных" -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:81 -#, fuzzy -msgid "Charge" -msgstr "график" +#: superset/reports/commands/exceptions.py:277 +msgid "Changing this report is forbidden" +msgstr "Запрещено изменять эту рассылку" -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:95 -msgid "Charge in the force layout" -msgstr "" +#: superset/views/database/forms.py:196 +msgid "Character to interpret as decimal point" +msgstr "Символ десятичного разделителя" -#: superset-frontend/src/components/Menu/MenuRight.tsx:39 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:387 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1297 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1300 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:261 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:607 -#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:208 -#: superset/templates/appbuilder/navbar_right.html:39 -#: superset/views/chart/mixin.py:85 superset/views/chart/views.py:108 -#: superset/views/schedules.py:316 +#: superset/views/database/forms.py:375 +msgid "Character to interpret as decimal point." +msgstr "Символ десятичного разделителя" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:432 +#: superset-frontend/src/pages/ChartList/index.tsx:360 +#: superset-frontend/src/pages/ChartList/index.tsx:758 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:418 +#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:191 +#: superset-frontend/src/views/components/RightMenu.tsx:217 +#: superset/views/chart/mixin.py:85 superset/views/chart/views.py:90 msgid "Chart" msgstr "График" -#: superset/views/core.py:1748 +#: superset/views/core.py:1713 #, python-format msgid "Chart %(id)s not found" msgstr "График %(id)s не найден" -#: superset/views/database/mixins.py:195 +#: superset/views/database/mixins.py:192 msgid "Chart Cache Timeout" -msgstr "Тайм-аут Кэша" +msgstr "Время жизни кэша графика" -#: superset/initialization/__init__.py:453 -msgid "Chart Email Schedules" -msgstr "Рассылка графиков" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:454 +#, python-format +msgid "Chart Data: %s" +msgstr "Данные графика: %s" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:58 -#: superset-frontend/src/explore/controlPanels/sections.tsx:42 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:70 +#: superset-frontend/src/explore/controlPanels/sections.tsx:32 msgid "Chart ID" -msgstr "График" +msgstr "ID графика" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:77 -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:49 -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:54 -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:48 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:75 -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:61 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:140 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:65 +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:53 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:55 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:61 +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:53 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:133 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:57 #: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:36 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:65 -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:49 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:53 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:139 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:88 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:69 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:43 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:42 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:48 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:77 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:85 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:78 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:31 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts:40 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:79 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts:44 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:70 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:35 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:49 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:54 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:39 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:81 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:69 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:75 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:279 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:72 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:83 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:103 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:100 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:80 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:97 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:103 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:104 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:61 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:35 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:58 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:131 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:106 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:72 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:73 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:295 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:71 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:61 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:62 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:300 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:61 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:57 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:57 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:60 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:60 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:31 +#: superset-frontend/src/explore/fixtures.tsx:34 +#: superset-frontend/src/explore/fixtures.tsx:77 +#: superset-frontend/src/explore/fixtures.tsx:86 msgid "Chart Options" -msgstr "Редактирование свойств" +msgstr "Свойства графика" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:267 +msgid "Chart Orientation" +msgstr "Ориентация графика" #: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:70 #: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:83 #, python-format msgid "Chart Owner: %s" -msgstr "Параметры графика: %s" +msgid_plural "Chart Owners: %s" +msgstr[0] "Владелец графика: %s" +msgstr[1] "Владельцы графика: %s" +msgstr[2] "Владельцы графика: %s" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:27 +#: superset-frontend/src/explore/components/ExploreViewContainer/index.jsx:611 #, fuzzy +msgid "Chart Source" +msgstr "Источник графика" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:32 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:289 msgid "Chart Title" -msgstr "Тип графика" +msgstr "Название графика" + +#: superset-frontend/src/explore/actions/saveModalActions.js:127 +#, python-format +msgid "Chart [%s] has been overwritten" +msgstr "График [%s] перезаписан" + +#: superset-frontend/src/explore/actions/saveModalActions.js:124 +#, python-format +msgid "Chart [%s] has been saved" +msgstr "График [%s] сохранен" + +#: superset-frontend/src/explore/actions/saveModalActions.js:145 +#, python-format +msgid "Chart [%s] was added to dashboard [%s]" +msgstr "График [%s] добавлен в дашборд [%s]" -#: superset/views/core.py:979 +#: superset/views/core.py:1072 msgid "Chart [{}] has been overwritten" -msgstr "График [{}] был перезаписан" +msgstr "График [{}] перезаписан" -#: superset/views/core.py:975 +#: superset/views/core.py:1068 msgid "Chart [{}] has been saved" -msgstr "График [{}] был сохранён" +msgstr "График [{}] сохранен" -#: superset/views/core.py:1006 +#: superset/views/core.py:1097 msgid "Chart [{}] was added to dashboard [{}]" -msgstr "График [{}] был добавлен к дашборду [{}]" +msgstr "График [{}] добавлен в дашборд [{}]" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:216 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:228 msgid "Chart cache timeout" -msgstr "Тайм-аут Кэша" +msgstr "Время жизни кэша графика" -#: superset-frontend/src/components/AlteredSliceTag/index.jsx:199 +#: superset-frontend/src/components/AlteredSliceTag/index.jsx:218 msgid "Chart changes" -msgstr "Изменения не сохранены" +msgstr "Изменения графика" -#: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:28 +#: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:30 msgid "" "Chart component that lets you add a custom filter UI in your dashboard. " "When added to dashboard, a filter box lets users specify specific values " @@ -2680,344 +3339,413 @@ msgstr "" #: superset/charts/commands/exceptions.py:115 msgid "Chart could not be created." -msgstr "График не может быть создан." +msgstr "Не удалось создать график" #: superset/charts/commands/exceptions.py:123 msgid "Chart could not be deleted." -msgstr "График не может быть удалён." +msgstr "Не удалось удалить график" #: superset/charts/commands/exceptions.py:119 msgid "Chart could not be updated." -msgstr "График не может быть обновлён." +msgstr "Не удалось обновить график" -#: superset/reports/commands/exceptions.py:53 +#: superset/reports/commands/exceptions.py:57 msgid "Chart does not exist" msgstr "График не существует" -#: superset/charts/data/api.py:125 +#: superset/charts/data/api.py:129 msgid "Chart has no query context saved. Please save the chart again." msgstr "" +"На графике не сохранен контекст запроса. Пожалуйста, сохраните диаграмму " +"еще раз." -#: superset-frontend/src/explore/components/SaveModal.tsx:247 +#: superset-frontend/src/explore/components/EmbedCodeContent.jsx:130 +msgid "Chart height" +msgstr "Высота графика" + +#: superset-frontend/src/pages/ChartList/index.tsx:219 +msgid "Chart imported" +msgstr "График импортирован" + +#: superset-frontend/src/explore/components/SaveModal.tsx:314 msgid "Chart name" msgstr "Имя графика" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:96 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:107 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:97 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:108 msgid "Chart options" -msgstr "Редактирование свойств" +msgstr "Свойства графика" #: superset/charts/commands/exceptions.py:111 msgid "Chart parameters are invalid." -msgstr "Параметры графика недействительны." +msgstr "Параметры графика недопустимы." -#: superset-frontend/src/explore/controlPanels/sections.tsx:32 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:165 +msgid "Chart properties updated" +msgstr "Свойства графика обновлены" + +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:220 +msgid "Chart title" +msgstr "Название графика" + +#: superset-frontend/src/pages/ChartList/index.tsx:622 msgid "Chart type" msgstr "Тип графика" -#: superset-frontend/src/dashboard/components/BuilderComponentPane.tsx:112 -#: superset-frontend/src/profile/components/CreatedContent.tsx:76 -#: superset-frontend/src/profile/components/Favorites.tsx:77 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:634 -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:306 -#: superset/initialization/__init__.py:246 superset/views/chart/mixin.py:26 +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:314 +msgid "Chart type requires a dataset" +msgstr "Для данного типа графика необходим датасет" + +#: superset-frontend/src/explore/components/EmbedCodeContent.jsx:139 +msgid "Chart width" +msgstr "Ширина графика" + +#: superset-frontend/src/dashboard/components/BuilderComponentPane/index.tsx:74 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx:65 +#: superset-frontend/src/pages/ChartList/index.tsx:786 +#: superset-frontend/src/profile/components/CreatedContent.tsx:104 +#: superset-frontend/src/profile/components/Favorites.tsx:87 +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:390 +#: superset/initialization/__init__.py:253 superset/views/chart/mixin.py:26 #: superset/views/dashboard/mixin.py:81 msgid "Charts" msgstr "Графики" -#: superset/charts/commands/exceptions.py:135 +#: superset/charts/commands/exceptions.py:139 msgid "Charts could not be deleted." -msgstr "Графики не могут быть удалены." +msgstr "Не удалось удалить графики." -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx:162 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:488 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:505 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx:182 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:516 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:533 msgid "Check configuration" -msgstr "Конфигурация слоя" +msgstr "Проверить конфигурацию" #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:206 #: superset-frontend/src/filters/components/Select/controlPanel.ts:68 msgid "Check for sorting ascending" -msgstr "Сортировка по убыванию или по возрастанию" +msgstr "Выберит для сортировки по возрастанию" -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:113 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:105 +#: superset-frontend/src/explore/controlUtils/controlUtils.test.tsx:114 +#: superset-frontend/src/explore/fixtures.tsx:44 msgid "" "Check if the Rose Chart should use segment area instead of segment radius" " for proportioning" msgstr "" -#: superset-frontend/src/components/AnchorLink/index.jsx:85 +#: superset-frontend/src/dashboard/components/AnchorLink/index.tsx:73 msgid "Check out this chart in dashboard:" msgstr "Посмотреть этот график в дашборде:" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:319 -#, fuzzy +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:499 msgid "Check out this chart: " -msgstr "Посмотреть дашборд: " +msgstr "Посмотреть график: " -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:220 +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:241 msgid "Check out this dashboard: " msgstr "Посмотреть дашборд: " -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:93 +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:63 msgid "" "Check to apply filters instantly as they change instead of displaying " "[Apply] button" msgstr "" +"Установите флажок, чтобы применять фильтры мгновенно по мере их изменения" +" вместо отображения кнопки [Применить]" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:219 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:212 msgid "Check to force date partitions to have the same height" msgstr "" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:35 -msgid "Check to include Druid granularity dropdown" -msgstr "" - -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:109 -#, fuzzy -msgid "Check to include SQL time grain dropdown" -msgstr "Включить фильтр на определенный интервал/диапазон времени" - -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:123 +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:87 msgid "Check to include time column dropdown" -msgstr "Включить фильтр на определенный интервал/диапазон времени" +msgstr "" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:110 -#, fuzzy +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:76 msgid "Check to include time grain dropdown" -msgstr "Включить фильтр на определенный интервал/диапазон времени" - -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:46 -msgid "Check to include time origin dropdown" -msgstr "Включить фильтр на определенный интервал/диапазон времени" +msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:173 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:174 msgid "Child label position" -msgstr "" +msgstr "Положение метки дочернего элемента" -#: superset/viz.py:2333 +#: superset/viz.py:2367 msgid "Choice of [Label] must be present in [Group By]" -msgstr "Выбор для [Метки] должен присутствовать в [Группировке по]" +msgstr "[Метка] должна присутствовать в [Группировать по]" -#: superset/viz.py:2341 +#: superset/viz.py:2375 msgid "Choice of [Point Radius] must be present in [Group By]" -msgstr "Срез [Радиуса точки] должен присутствовать в поле [Группировка]" +msgstr "[Радиус точки] должен присутствовать в [Группировать по]" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:150 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:151 #: superset/templates/superset/import_dashboards.html:47 msgid "Choose File" msgstr "Выберите файл" -#: superset/reports/commands/exceptions.py:80 +#: superset/reports/commands/exceptions.py:84 msgid "Choose a chart or dashboard not both" -msgstr "Удалить график из дашборда" +msgstr "Выберите график или дашборд, не обоих" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:674 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:874 msgid "Choose a database..." -msgstr "Выберите источник данных" +msgstr "Выберите базу данных..." -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:278 -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:288 +#: superset-frontend/src/pages/ChartCreation/index.tsx:377 +#: superset-frontend/src/pages/ChartCreation/index.tsx:388 msgid "Choose a dataset" -msgstr "Выберите источник данных" +msgstr "Выберите датасет" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:69 -#, fuzzy msgid "Choose a metric for left axis" -msgstr "Выберите показатель для правой оси" +msgstr "Выберите меру для левой оси" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:120 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:185 -#: superset-frontend/src/explore/controls.jsx:217 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:183 +#: superset-frontend/src/explore/controls.jsx:216 msgid "Choose a metric for right axis" -msgstr "Выберите показатель для правой оси" +msgstr "Выберите меру для правой оси" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:57 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:61 msgid "Choose a number format" -msgstr "Выберите показатель для правой оси" +msgstr "Выберите числовой формат" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:63 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:67 msgid "Choose a source" -msgstr "Выберите источник данных" +msgstr "Выберите источник" -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:105 #: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:44 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:34 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:38 msgid "Choose a source and a target" -msgstr "Выберите источник данных" +msgstr "Выберите источник и цель" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:69 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:73 msgid "Choose a target" -msgstr "Выберите источник данных" +msgstr "Выберите цель" -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:308 -#, fuzzy +#: superset/connectors/sqla/views.py:328 +msgid "Choose a unique name" +msgstr "" + +#: superset-frontend/src/pages/ChartCreation/index.tsx:397 msgid "Choose chart type" -msgstr "Тип графика" +msgstr "Выберите тип графика" + +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:723 +msgid "Choose one of the available databases from the panel on the left." +msgstr "Выберите одну из доступных баз данных из панели слева." #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:100 -#, fuzzy msgid "Choose one or more charts for left axis" -msgstr "Выберите показатель для правой оси" +msgstr "Выберите один или несколько графиков для левой оси" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:135 -#, fuzzy msgid "Choose one or more charts for right axis" -msgstr "Выберите показатель для правой оси" +msgstr "Выберите один или несколько графиков для правой оси" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:745 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:795 msgid "Choose the annotation layer type" msgstr "Выбрать тип слоя аннотации" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:757 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:163 +msgid "Choose the format for legend values" +msgstr "Выберите формат значений легенды" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:177 +msgid "Choose the position of the legend" +msgstr "Выберите позицию легенды" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:807 msgid "Choose the source of your annotations" -msgstr "Настройте слой аннотации." +msgstr "Выберите источник аннотаций" + +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:122 +msgid "" +"Choose whether a country should be shaded by the metric, or assigned a " +"color based on a categorical color palette" +msgstr "" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:34 msgid "Chord Diagram" -msgstr "" +msgstr "Хордовая диаграмма" -#: superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx:281 +#: superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx:306 msgid "Chosen non-numeric column" -msgstr "" +msgstr "Выбран нечисловой столбец" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:218 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:219 msgid "Circle" -msgstr "Файл" +msgstr "Круг" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:130 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:131 msgid "Circle -> Arrow" -msgstr "" +msgstr "Круг -> Стрелка" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:131 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:132 msgid "Circle -> Circle" -msgstr "" +msgstr "Круг -> Круг" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:198 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:200 msgid "Circle radar shape" -msgstr "" +msgstr "Круглая форма радара" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:37 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:33 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:112 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:40 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:36 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:113 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:42 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:67 msgid "Circular" -msgstr "" +msgstr "Круглая форма" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:32 msgid "Classic chart that visualizes how metrics change over time." -msgstr "" +msgstr "Классическая диаграмма для визуализации изменения показателей со временем." #: superset-frontend/plugins/plugin-chart-table/src/index.ts:37 msgid "" "Classic row-by-column spreadsheet like view of a dataset. Use tables to " "showcase a view into the underlying data or to show aggregated metrics." msgstr "" +"Классическое представление таблицы. Используйте таблицы для демонстрации " +"отображения исходных или агрегированных данных." -#: superset/connectors/sqla/views.py:369 +#: superset/connectors/sqla/views.py:366 msgid "Clause" -msgstr "Условие" +msgstr "Оператор" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:53 msgid "Clear" msgstr "Очистить" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx:133 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/index.tsx:152 msgid "Clear all" +msgstr "Сбросить фильтры" + +#: superset-frontend/src/components/Table/index.tsx:264 +msgid "Clear all data" +msgstr "Очистить все данные" + +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:675 +msgid "Clear form" +msgstr "Очистить форму" + +#: superset-frontend/src/components/Chart/Chart.jsx:292 +msgid "" +"Click on \"Create chart\" button in the control panel on the left to " +"preview a visualization or" msgstr "" +"Нажмите на кнопку \"Создать график\" на панели управления слева для " +"просмотра графика или" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:997 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx:251 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx:293 +msgid "Click the button above to add a filter to the dashboard" +msgstr "Нажмите кнопку выше для добавления фильтров в дашборд" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1012 msgid "Click the lock to make changes." -msgstr "Нажмите на замок, чтобы выполнить изменения." +msgstr "Нажмите на замок для внесения изменений" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1000 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1015 msgid "Click the lock to prevent further changes." -msgstr "Нажмите на замок, чтобы предотвратить будущие изменения." +msgstr "Нажмите на замок для запрета на внос изменений." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1306 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1854 msgid "" "Click this link to switch to an alternate form that allows you to input " "the SQLAlchemy URL for this database manually." msgstr "" +"Нажмите для переключения на альтернативную форму подключения, которая " +"позволит вам вручную ввести SQLAlchemy URL для данной базы данных." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1071 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1573 msgid "" "Click this link to switch to an alternate form that exposes only the " "required fields needed to connect this database." msgstr "" +"Нажмите для переключения на альтернативную форму подключения, которая " +"позволит вам ввести все данные в соответствующую форму для данной базы " +"данных." -#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:114 -msgid "Click to change visualization type" -msgstr "Выберите тип визуализации" +#: superset-frontend/src/components/Table/index.tsx:271 +msgid "Click to cancel sorting" +msgstr "Нажмите для отмены сортировки" -#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:151 +#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:256 msgid "Click to clear emitted filters" -msgstr "" +msgstr "Нажмите для сброса кросс-фильтра" -#: superset-frontend/src/components/EditableTitle/index.tsx:197 +#: superset-frontend/src/components/EditableTitle/index.tsx:211 msgid "Click to edit" msgstr "Нажмите для редактирования" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelectPopoverTitle.jsx:76 -#, fuzzy +#: superset-frontend/src/dashboard/util/getSliceHeaderTooltip.tsx:27 +#, python-format +msgid "Click to edit %s in a new tab" +msgstr "Нажмите для редактирования «%s» в новой вкладке" + +#: superset-frontend/src/dashboard/util/getSliceHeaderTooltip.tsx:32 +#, python-format +msgid "Click to edit %s." +msgstr "Нажмите для редактирования %s." + +#: superset-frontend/src/dashboard/util/getSliceHeaderTooltip.tsx:28 +#: superset-frontend/src/dashboard/util/getSliceHeaderTooltip.tsx:33 +msgid "Click to edit chart." +msgstr "Нажмите для редактирования графика." + +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelectPopoverTitle.jsx:81 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.tsx:105 msgid "Click to edit label" -msgstr "Нажмите для редактирования" +msgstr "Нажмите для редактирования метки" -#: superset-frontend/src/components/FaveStar/index.tsx:81 +#: superset-frontend/src/components/FaveStar/index.tsx:79 msgid "Click to favorite/unfavorite" -msgstr "Отметить как избранное" +msgstr "Добавить в избранное" #: superset-frontend/src/components/CachedLabel/TooltipContent.tsx:39 msgid "Click to force-refresh" msgstr "Нажмите для принудительного обновления" -#: superset-frontend/src/components/AlteredSliceTag/index.jsx:177 +#: superset-frontend/src/components/AlteredSliceTag/index.jsx:201 msgid "Click to see difference" -msgstr "Нажмите, чтобы увидеть разницу" +msgstr "Нажмите для просмотра изменений" -#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:192 -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:523 -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:307 +#: superset-frontend/src/components/Table/index.tsx:270 +msgid "Click to sort ascending" +msgstr "Нажмите для сортировки по возрастанию" + +#: superset-frontend/src/components/Table/index.tsx:269 +msgid "Click to sort descending" +msgstr "Нажмите для сортировки по убыванию" + +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailModal.tsx:52 +#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:209 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:223 +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:786 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:406 #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:247 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:476 -#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:337 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:805 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:487 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:339 +#: superset-frontend/src/explore/components/controls/ViewQueryModalFooter.tsx:36 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1047 msgid "Close" msgstr "Закрыть" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:360 +#: superset-frontend/src/SqlLab/components/SqlEditorTabHeader/index.tsx:133 msgid "Close all other tabs" -msgstr "Закрыть все вкладки" +msgstr "Закрыть остальные вкладки" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:339 +#: superset-frontend/src/SqlLab/components/SqlEditorTabHeader/index.tsx:103 msgid "Close tab" msgstr "Закрыть вкладку" -#: superset/connectors/druid/views.py:344 -msgid "Cluster" -msgstr "Кластер" - -#: superset/connectors/druid/views.py:232 -msgid "Cluster Name" -msgstr "Имя кластера" - -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:171 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:183 msgid "Cluster label aggregator" -msgstr "" +msgstr "Агрегатор меток кластера" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:74 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:84 msgid "Clustering Radius" -msgstr "" +msgstr "Радиус кластера" #: superset-frontend/src/explore/controlPanels/Separator.js:25 #: superset-frontend/src/explore/controlPanels/Separator.js:46 @@ -3028,244 +3756,316 @@ msgstr "Редактор" msgid "Collapse all" msgstr "Свернуть всё" -#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:152 -#, fuzzy +#: superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx:162 +msgid "Collapse data panel" +msgstr "Свернуть панель управления" + +#: superset-frontend/src/components/Table/index.tsx:268 +msgid "Collapse row" +msgstr "Свернуть строку" + +#: superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx:595 +msgid "Collapse tab content" +msgstr "Свернуть содержимое вкладки" + +#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx:198 msgid "Collapse table preview" -msgstr "Убрать предпросмотр таблицы" +msgstr "Свернуть предпросмотр таблицы" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:648 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:696 msgid "Color" msgstr "Цвет" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:137 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:439 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:126 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:450 msgid "Color +/-" -msgstr "" +msgstr "Раскрасить +/-" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:159 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:206 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:227 msgid "Color Metric" -msgstr "Цвет показателя" +msgstr "Цвет меры" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:108 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:474 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:111 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:337 msgid "Color Scheme" msgstr "Цветовая схема" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:129 -#, fuzzy msgid "Color Steps" -msgstr "Цветовая схема" +msgstr "Количество цветов" + +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:306 +msgid "Color bounds" +msgstr "Границы цвета" + +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:116 +msgid "Color by" +msgstr "Выбор цвета по" -#: superset-frontend/src/explore/controls.jsx:235 +#: superset-frontend/src/explore/controls.jsx:234 msgid "Color metric" -msgstr "Цвет показателя" +msgstr "Мера для цвета" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:93 +msgid "Color of the target location" +msgstr "Цвет целевого местоположения" -#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:50 +#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx:87 #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:214 #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:218 -#: superset-frontend/src/explore/controlPanels/sections.tsx:79 -#: superset-frontend/src/explore/controls.jsx:480 +#: superset-frontend/src/explore/controlPanels/sections.tsx:60 +#: superset-frontend/src/explore/controls.jsx:460 msgid "Color scheme" msgstr "Цветовая схема" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:172 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:176 msgid "" -"Color will be rendered based on a ratio of the cell against the sum of " -"across this criteria" +"Color will be shaded based the normalized (0% to 100%) value of a given " +"cell against the other cells in the selected range: " msgstr "" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:374 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:427 msgid "Colors" msgstr "Цвета" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:283 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:352 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:361 #: superset-frontend/src/dashboard/components/gridComponents/new/NewColumn.jsx:31 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:109 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:112 #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:204 -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:227 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:248 #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:137 #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:140 #: superset-frontend/src/explore/components/controls/SpatialControl.jsx:194 -#: superset/connectors/druid/views.py:91 superset/connectors/sqla/views.py:143 +#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:209 +#: superset-frontend/src/filters/components/Range/controlPanel.ts:39 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:49 +#: superset-frontend/src/filters/components/Time/controlPanel.ts:37 +#: superset/connectors/sqla/views.py:156 msgid "Column" msgstr "Столбец" -#: superset/utils/pandas_postprocessing.py:712 +#: superset/utils/pandas_postprocessing/contribution.py:59 #, python-format msgid "" "Column \"%(column)s\" is not numeric or does not exists in the query " "results." msgstr "" +"Столбец \"%(column)s\" не является числовым или отсутствует в результатах" +" запроса." + +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:361 +msgid "Column Configuration" +msgstr "Свойства столбца" -#: superset/views/database/forms.py:224 superset/views/database/forms.py:357 -#: superset/views/database/forms.py:445 +#: superset-frontend/src/explore/components/DataTableControl/index.tsx:194 +msgid "Column Formatting" +msgstr "Форматирование столбца(ов)" + +#: superset/views/database/forms.py:222 superset/views/database/forms.py:383 +#: superset/views/database/forms.py:474 msgid "Column Label(s)" -msgstr "Обозначения столбцов" +msgstr "Метка(и) столбца(ов)" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:79 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:80 msgid "" "Column containing ISO 3166-2 codes of region/province/department in your " "table." msgstr "" +"Столбец, содержащий коды ISO 3166-2 региона/республики/области в вашей " +"таблице" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:64 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:74 msgid "Column containing latitude data" -msgstr "" +msgstr "Столбец, содержащий данные о широте" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:64 msgid "Column containing longitude data" -msgstr "" +msgstr "Столбец, содержащий данные о долготе" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:115 -#, fuzzy +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:206 +msgid "Column header tooltip" +msgstr "Всплывающая подсказка заголовка столбца" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:118 msgid "Column is required" -msgstr "Имя обязательно" +msgstr "Столбец обязателен" -#: superset/views/database/forms.py:225 superset/views/database/forms.py:358 -#: superset/views/database/forms.py:446 +#: superset/views/database/forms.py:384 superset/views/database/forms.py:475 msgid "" "Column label for index column(s). If None is given and Dataframe Index is" " True, Index Names are used." msgstr "" -"Обозначение столбца для столбцов с индексами. Если поле пустое, а " -"настройка [Индекс] включена, то используются имена индексов." +"Метка для индексного(ых) столбца(ов). Если не задано и задан индекс " +"датафрейма, будут использованы имена индексов." + +#: superset/views/database/forms.py:223 +msgid "" +"Column label for index column(s). If None is given and Dataframe Index is" +" checked, Index Names are used" +msgstr "" +"Метка для индексного(ых) столбца(ов). Если не задано и задан индекс " +"датафрейма, будут использованы имена индексов." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:652 +#: superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx:77 +msgid "Column name" +msgstr "Имя столбца" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:814 #, python-format msgid "Column name [%s] is duplicated" -msgstr "Дубль имени столбца [%s]" - -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:139 -msgid "Column name(s) " -msgstr "Имена столбца(ов) " +msgstr "Имя столбца [%s] является дубликатом" -#: superset/utils/pandas_postprocessing.py:168 +#: superset/utils/pandas_postprocessing/utils.py:151 #, python-format msgid "Column referenced by aggregate is undefined: %(column)s" -msgstr "Столбец, на который ссылается агрегат, не определён: %(column)s" +msgstr "Столбец, на который ссылается агрегат, не определен: %(column)s" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:130 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:129 msgid "Column select" -msgstr "Выполнить выбранный запрос" +msgstr "Выбор столбца" + +#: superset/views/database/forms.py:211 +msgid "" +"Column to use as the row labels of the dataframe. Leave empty if no index" +" column" +msgstr "" +"Столбец для использования в качестве метки для строки датафрейма. " +"Оставьте пустым, если индексный столбец отсутствует." -#: superset/views/database/forms.py:163 superset/views/database/forms.py:316 +#: superset/views/database/forms.py:342 msgid "" "Column to use as the row labels of the dataframe. Leave empty if no index" " column." msgstr "" -"Столбец для использования в качестве меток строк данных. Оставьте пустым," -" если столбец индекса отсутствует." +"Столбец для использования в качестве метки для строки датафрейма. " +"Оставьте пустым, если индексный столбец отсутствует." -#: superset/views/database/forms.py:385 -#, fuzzy +#: superset/views/database/forms.py:414 msgid "Columnar File" -msgstr "столбец" +msgstr "Файл столбчатого формата" -#: superset/views/database/views.py:550 -#, fuzzy, python-format +#: superset/views/database/views.py:565 +#, python-format msgid "" "Columnar file \"%(columnar_filename)s\" uploaded to table " "\"%(table_name)s\" in database \"%(db_name)s\"" msgstr "" -"Excel-файл “%(excel_filename)s\" загружен в таблицу \"%(table_name)s\" " -"базы данных \"%(db_name)s\"" +"Файл столбчатого формата \"%(columnar_filename)s\" загружен в таблицу " +"\"%(table_name)s\" в базу данных \"%(db_name)s\"" -#: superset/views/database/views.py:414 -#, fuzzy +#: superset/views/database/views.py:440 msgid "Columnar to Database configuration" -msgstr "Настройка CSV для БД" - -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:55 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:214 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:36 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:59 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:82 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:101 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:124 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1207 -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:334 -#: superset-frontend/src/explore/controls.jsx:245 -#: superset/connectors/druid/views.py:70 superset/connectors/sqla/views.py:63 +msgstr "Конфигурация столбчатого файла для импорта в базу данных" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:110 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:33 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx:38 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx:62 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:52 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:119 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:102 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1367 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:431 +#: superset-frontend/src/explore/controls.jsx:244 +#: superset-frontend/src/explore/fixtures.tsx:97 +#: superset/connectors/sqla/views.py:73 msgid "Columns" msgstr "Столбцы" -#: superset/common/query_context_processor.py:114 superset/viz.py:554 +#: superset/views/database/forms.py:183 +msgid "Columns To Be Parsed as Dates" +msgstr "Список столбцов, которые должны быть интерпретированы как даты." + +#: superset/views/database/forms.py:231 +msgid "Columns To Read" +msgstr "Столбцы для чтения" + +#: superset/common/query_context_processor.py:130 +#, python-format +msgid "Columns missing in dataset: %(invalid_columns)s" +msgstr "Столбцы отсутствуют в датасете: %(invalid_columns)s" + +#: superset/viz.py:574 #, python-format msgid "Columns missing in datasource: %(invalid_columns)s" -msgstr "В источнике данных отсутствуют столбцы: %(invalid_columns)s" +msgstr "Столбцы отсутствуют в источнике данных: %(invalid_columns)s" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:302 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:367 msgid "Columns subtotal position" -msgstr "" +msgstr "Расположение столбцов подытогов" -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:134 -msgid "" -"Columns to calculate distribution across. Defaults to temporal column if " -"left empty." +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:171 +msgid "Columns to calculate distribution across." msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:44 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:45 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:54 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:102 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:125 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:45 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:46 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:55 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx:39 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx:63 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:103 +#: superset-frontend/src/explore/fixtures.tsx:99 msgid "Columns to display" -msgstr "Выберите показатель для отображения" +msgstr "Столбцы для отображения" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:43 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:42 msgid "Columns to group by" -msgstr "Выберите один или несколько срезов в поле группировки данных" +msgstr "Столбцы для группировки" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:60 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:53 msgid "Columns to group by on the columns" -msgstr "" +msgstr "Столбцы для группировки по столбцам" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:50 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:63 msgid "Columns to group by on the rows" -msgstr "" +msgstr "Столбцы для группировки по строкам" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:96 -#, fuzzy +#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:42 +msgid "Columns to show" +msgstr "Столбцы для отображения" + +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:85 msgid "Combine Metrics" -msgstr "Показатель для сортировки" +msgstr "Объединить меры" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:185 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:250 msgid "Combine metrics" -msgstr "Показатель для сортировки" +msgstr "Объединить меры" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:301 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:297 msgid "" "Comma-separated color picks for the intervals, e.g. 1,2,4. Integers " "denote colors from the chosen color scheme and are 1-indexed. Length must" " be matching that of interval bounds." msgstr "" +"Номера цветов, разделенные запятой, например, 1,2,4. Целые числа задают " +"цвета из выбранной цветовой схемы и начинаются с 1 (не с нуля). Длина " +"должна соответствовать границам интервала." -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:287 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:283 msgid "" "Comma-separated interval bounds, e.g. 2,4,5 for intervals 0-2, 2-4 and " "4-5. Last number should match the value provided for MAX." msgstr "" +"Границы интервала, разделенные запятой, например, 2,4,5 для интервалов " +"0-2, 2-4 и 4-5. Последнее число должно быть равно заданному максиму." -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:312 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:372 msgid "Comparator option" msgstr "" -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:26 +#: superset-frontend/src/visualizations/TimeTable/index.ts:28 msgid "" "Compare multiple time series charts (as sparklines) and related metrics " "quickly." msgstr "" +"Быстрое сравнение нескольких графиков временных рядов (в виде " +"спарклайнов) и связанных с ними показателей." -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:26 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:27 msgid "Compare the same summarized metric across multiple groups." -msgstr "" +msgstr "Сравнивает один и тот же обобщенный показатель в нескольких группах" #: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:28 msgid "" @@ -3274,433 +4074,509 @@ msgid "" "and color." msgstr "" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:30 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:35 msgid "" "Compares metrics from different categories using bars. Bar lengths are " "used to indicate the magnitude of each value and color is used to " "differentiate groups." msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:26 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:27 msgid "" "Compares the lengths of time different activities take in a shared " "timeline view." msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:33 -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:33 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:35 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:36 #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:30 #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:37 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:35 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:35 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:34 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:36 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:42 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:35 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:46 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:41 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:38 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:48 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:37 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:49 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:43 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:68 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:56 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:59 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:60 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:43 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:31 -#, fuzzy +#: superset-frontend/src/visualizations/TimeTable/index.ts:34 msgid "Comparison" -msgstr "Столбец с датой" +msgstr "Сравнение" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:48 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:54 msgid "Comparison Period Lag" -msgstr "" +msgstr "Временной лаг для сравнения" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:61 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:67 msgid "Comparison suffix" -msgstr "Столбец с датой" +msgstr "Текст рядом с процентным изменением" -#: superset-frontend/src/dashboard/components/BuilderComponentPane.tsx:102 -msgid "Components" -msgstr "Компоненты" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/index.js:27 +msgid "Compose multiple layers together to form complex visuals." +msgstr "" +"Объединяет несколько слоев вместе для формирования сложных визуальных " +"эффектов." -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:53 -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:56 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:59 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:57 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:72 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:367 -#: superset-frontend/src/explore/controlPanels/sections.tsx:136 +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:45 +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:48 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:52 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:49 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:63 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:377 +#: superset-frontend/src/explore/controlPanels/sections.tsx:109 msgid "Compute the contribution to the total" -msgstr "" -"Вычислить вклад в общую сумму (долю). Установите формат показателя в " -"проценты" +msgstr "Вычислить вклад в общую сумму (долю)" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1173 -#, fuzzy +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:404 msgid "Condition" -msgstr "Условие оповещения" +msgstr "Условие" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:320 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:473 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:385 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:500 msgid "Conditional formatting" -msgstr "Дополнительные метаданные" +msgstr "Условное форматирование" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:70 -#, fuzzy msgid "Confidence interval" -msgstr "Интервал обновления" +msgstr "Доверительный интервал" -#: superset/utils/pandas_postprocessing.py:827 +#: superset/utils/pandas_postprocessing/prophet.py:129 msgid "Confidence interval must be between 0 and 1 (exclusive)" -msgstr "Доверительный интервал должен быть между 0 и 1 (исключая)" +msgstr "Доверительный интервал должен быть между 0 и 1 (не включая концы)" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:252 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:276 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:289 msgid "Configuration" -msgstr "Доля" +msgstr "Конфигурация" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:58 -#, fuzzy msgid "Configure Advanced Time Range " -msgstr "Особый временной интервал" +msgstr "Установить особый временной интервал " -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CommonFrame.tsx:41 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CommonFrame.tsx:46 msgid "Configure Time Range: Last..." -msgstr "Последние…" +msgstr "Установить временной интервал: последний..." #: superset-frontend/src/explore/components/controls/DateFilterControl/components/CalendarFrame.tsx:46 msgid "Configure Time Range: Previous..." -msgstr "Предыдущие…" +msgstr "Установить временной интервал: предыдущий..." -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:111 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:125 msgid "Configure custom time range" -msgstr "Изменить параметры шаблона" +msgstr "Установить пользовательский временной интервал" -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:500 +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:763 msgid "Configure filter scopes" -msgstr "Настроить области действия фильтра" +msgstr "Настроить область действия фильтра" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:718 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:768 msgid "Configure the basics of your Annotation Layer." msgstr "Настройте слой аннотации." -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:616 +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:177 +msgid "Configure this dashboard to embed it into an external web application." +msgstr "Настройте этот дашборд для встраивания во внешнее веб-приложение" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:664 msgid "Configure your how you overlay is displayed here." -msgstr "Настройте наложение здесь." +msgstr "Настройка отображения слоя аннотации поверх графика." + +#: superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.tsx:132 +msgid "Confirm overwrite" +msgstr "Подтвердить перезапись" -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:179 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:176 msgid "Confirm save" msgstr "Подтвердить сохранение" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:777 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1006 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1193 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:997 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1035 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1467 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1506 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1701 msgid "Connect" -msgstr "Тестовое соединение" +msgstr "Подключить" + +#: superset-frontend/src/views/components/RightMenu.tsx:185 +msgid "Connect Google Sheet" +msgstr "Подключить Google Таблицы" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:41 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:40 msgid "Connect Google Sheets as tables to this database" -msgstr "" +msgstr "Подключить Google Таблицы как таблицы для этой базы данных" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1011 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1197 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1471 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1511 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1705 msgid "Connect a database" -msgstr "Выберите базу данных" +msgstr "Подключиться к базе данных" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1068 +#: superset-frontend/src/views/components/RightMenu.tsx:175 +msgid "Connect database" +msgstr "Подключиться к базе данных" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1570 msgid "Connect this database using the dynamic form instead" -msgstr "" +msgstr "Подключиться к этой базе, используя динамичную форму" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1301 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1849 msgid "Connect this database with a SQLAlchemy URI string instead" -msgstr "" +msgstr "Подключиться к этой базе через SQLAlchemy URI" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:224 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:225 msgid "Connection" -msgstr "Тестовое соединение" +msgstr "База данных" -#: superset/databases/commands/exceptions.py:105 -#: superset/databases/commands/exceptions.py:122 superset/views/core.py:1383 +#: superset/databases/commands/exceptions.py:107 +#: superset/databases/commands/exceptions.py:124 superset/views/core.py:1418 msgid "Connection failed, please check your connection settings" -msgstr "Подключение не удалось, пожалуйста, проверьте строку подключения" +msgstr "Сбой подключения, пожалуйста, проверьте настройки вашего подключения" -#: superset-frontend/src/views/CRUD/hooks.ts:625 +#: superset-frontend/src/views/CRUD/hooks.ts:653 msgid "Connection looks good!" msgstr "Соединение в порядке!" +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:674 +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:685 +msgid "Continue" +msgstr "Продолжить" + #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:46 msgid "Continuous" -msgstr "" +msgstr "Непрерывный" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:51 -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:54 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:57 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:55 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:70 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:365 -#: superset-frontend/src/explore/controlPanels/sections.tsx:134 +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:43 +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:46 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:50 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:47 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:61 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:375 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:72 +#: superset-frontend/src/explore/controlPanels/sections.tsx:107 msgid "Contribution" -msgstr "Доля" +msgstr "Режим относительных значений" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:69 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:69 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:70 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx:38 msgid "Contribution Mode" -msgstr "Доля" +msgstr "Режим относительных значений" + +#: superset-frontend/src/components/AlteredSliceTag/index.jsx:174 +msgid "Control" +msgstr "Элемент" -#: superset-frontend/src/explore/components/ExploreViewContainer.jsx:430 +#: superset-frontend/src/explore/components/ExploreViewContainer/index.jsx:513 msgid "Control labeled " -msgstr "" +msgstr "Значение с именем " -#: superset-frontend/src/explore/components/ExploreViewContainer.jsx:430 +#: superset-frontend/src/explore/components/ExploreViewContainer/index.jsx:513 msgid "Controls labeled " -msgstr "" +msgstr "Значения с именами " -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:57 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:34 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:60 msgid "Coordinates" -msgstr "Избранное" +msgstr "Координаты" -#: superset-frontend/src/components/CopyToClipboard/index.jsx:75 -#: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:53 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:113 -#, fuzzy +#: superset-frontend/src/components/CopyToClipboard/index.jsx:77 +#: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:68 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:185 msgid "Copied to clipboard!" -msgstr "Скопировать в буфер обмена" +msgstr "Скопировано в буфер обмена" -#: superset-frontend/src/explore/components/DataTableControl/index.tsx:48 +#: superset-frontend/src/components/CopyToClipboard/index.jsx:40 +#: superset-frontend/src/explore/components/DataTableControl/index.tsx:84 msgid "Copy" -msgstr "" +msgstr "Копировать" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:192 +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:221 msgid "Copy SELECT statement to the clipboard" msgstr "Скопировать выражение SELECT в буфер обмена" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:106 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:105 msgid "Copy and Paste JSON credentials" -msgstr "" +msgstr "Скопировать и вставить JSON данные" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:124 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:125 msgid "Copy and paste the entire service account .json file here" -msgstr "" - -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:316 -#, fuzzy -msgid "Copy chart URL" -msgstr "Переместить график" - -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:103 -#, fuzzy -msgid "Copy chart URL to clipboard" -msgstr "Скопировать часть запроса в буфер обмена" - -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:263 -#, fuzzy -msgid "Copy dashboard URL" -msgstr "Нет дашбордов" +msgstr "Скопировать и вставить .json файл сервисного аккаунта сюда" -#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:98 +#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:108 msgid "Copy link" msgstr "Скопировать ссылку" -#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:184 +#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:201 msgid "Copy message" -msgstr "Предупреждающее сообщение" +msgstr "Скопировать сообщение" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:548 -#: superset-frontend/src/SqlLab/reducers/sqlLab.js:74 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:653 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1443 +#: superset-frontend/src/SqlLab/reducers/sqlLab.js:107 #, python-format msgid "Copy of %s" -msgstr "Копирование %s" +msgstr "Копия %s" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:103 +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:136 msgid "Copy partition query to clipboard" msgstr "Скопировать часть запроса в буфер обмена" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:390 +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:335 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:496 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:340 +msgid "Copy permalink to clipboard" +msgstr "Скопировать ссылку в буфер обмена" + +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:391 msgid "Copy query URL" -msgstr "Скопировать URL запроса" +msgstr "Скопировать ссылку на запрос" -#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:88 +#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:98 msgid "Copy query link to your clipboard" -msgstr "Скопировать часть запроса в буфер обмена" +msgstr "Скопировать ссылку на запрос в буфер обмена" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/ValidatedInputField.tsx:26 msgid "Copy the account name of that database you are trying to connect to." -msgstr "" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:91 -msgid "Copy the name of the database you are trying to connect to." -msgstr "" +msgstr "Впишите имя профиля базы данных, к которой вы пытаетесь подключиться." -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:552 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:93 #, fuzzy +msgid "Copy the name of the HTTP Path of your cluster." +msgstr "Скопировать имя HTTP пути вашего кластера." + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:115 +msgid "Copy the name of the database you are trying to connect to." +msgstr "Впишите имя базы данных, к которой вы пытаетесь подключиться" + +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:270 msgid "Copy to Clipboard" msgstr "Скопировать в буфер обмена" -#: superset-frontend/src/components/CopyToClipboard/index.jsx:43 -#: superset-frontend/src/components/URLShortLinkButton/index.jsx:65 -#: superset-frontend/src/explore/components/EmbedCodeButton.jsx:106 +#: superset-frontend/src/components/CopyToClipboard/index.jsx:44 +#: superset-frontend/src/dashboard/components/URLShortLinkButton/index.tsx:89 msgid "Copy to clipboard" msgstr "Скопировать в буфер обмена" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:25 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:26 #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:28 #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:25 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:25 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:26 msgid "Correlation" -msgstr "Продолжительность" +msgstr "Корреляция" -#: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:95 +#: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:104 msgid "Cost estimate" msgstr "Прогноз затрат" -#: superset/views/utils.py:547 +#: superset/views/utils.py:497 msgid "Could not determine datasource type" -msgstr "Невозможно определить тип источника данных" +msgstr "Не удалось определить тип источника данных" -#: superset-frontend/src/dashboard/actions/sliceEntities.js:116 +#: superset-frontend/src/dashboard/actions/sliceEntities.js:127 #: superset-frontend/src/dashboard/reducers/sliceEntities.js:65 msgid "Could not fetch all saved charts" -msgstr "" +msgstr "Не удалось получить все сохраненные графики" -#: superset/views/utils.py:563 +#: superset/views/utils.py:513 msgid "Could not find viz object" -msgstr "Невозможно найти объект визуализации" +msgstr "Не удалось найти объект визуализации" -#: superset/databases/commands/exceptions.py:130 +#: superset/databases/commands/exceptions.py:132 msgid "Could not load database driver" -msgstr "Невозможно загрузить драйвер базы данных" +msgstr "Не удалось загрузить драйвер базы данных" -#: superset/views/core.py:1366 +#: superset/views/core.py:1401 #, python-format msgid "Could not load database driver: %(driver_name)s" -msgstr "Невозможно загрузить драйвер базы данных: %(driver_name)s" +msgstr "Не удалось загрузить драйвер базы данных: %(driver_name)s" -#: superset/databases/commands/test_connection.py:99 +#: superset/databases/commands/test_connection.py:180 msgid "Could not load database driver: {}" -msgstr "Невозможно загрузить драйвер базы данных: {}" +msgstr "Не удалось загрузить драйвер базы данных: {}" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:97 -msgid "Could not verify the host" -msgstr "" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:179 +msgid "Count" +msgstr "Количество" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:40 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:180 +msgid "Count Unique Values" +msgstr "Количество уникальных значений" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:198 +msgid "Count as Fraction of Columns" +msgstr "Количество, как доля от столбцов" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:195 +msgid "Count as Fraction of Rows" +msgstr "Количество, как доля от строк" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:194 +msgid "Count as Fraction of Total" +msgstr "Количество, как доля от целого" + +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:41 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:120 msgid "Country" -msgstr "Карта Стран" +msgstr "Страна" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:130 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:146 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:151 msgid "Country Color Scheme" -msgstr "Цветовая схема" +msgstr "Цветовая схема страны" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:115 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:135 msgid "Country Column" -msgstr "Фильтруемые срезы" +msgstr "Столбец со страной" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:39 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:41 msgid "Country Field Type" -msgstr "" +msgstr "Тип поля страны" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:30 -#: superset/viz.py:2007 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:33 +#: superset/viz.py:2041 msgid "Country Map" msgstr "Карта Стран" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:745 +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:754 #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:96 -#, fuzzy msgid "Create" -msgstr "создать " +msgstr "Создать" -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:275 +#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx:49 +msgid "Create Chart" +msgstr "Создать график" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/Footer/index.tsx:113 +msgid "Create Dataset" +msgstr "Создать датасет" + +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:379 +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:330 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:319 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:330 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:354 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:395 +msgid "Create a dataset" +msgstr "Создать датасет" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:124 +msgid "" +"Create a dataset to begin visualizing your data as a chart or go to\n" +" SQL Lab to query your data." +msgstr "" +"Создайте датасет для визуализации ваших данных на графике или перейдите в" +" Лабораторию SQL для просмотра данных." + +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:201 +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:224 +#: superset-frontend/src/pages/ChartCreation/index.tsx:374 msgid "Create a new chart" -msgstr "Создать новый срез" +msgstr "Создать новый график" + +#: superset-frontend/src/explore/components/RunQueryButton/index.tsx:54 +#: superset-frontend/src/utils/getChartRequiredFieldsMissingMessage.ts:22 +msgid "Create chart" +msgstr "Создать график" -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:330 +#: superset-frontend/src/views/components/RightMenu.tsx:180 +msgid "Create dataset" +msgstr "Создать датасет" + +#: superset-frontend/src/dashboard/components/SliceAdder.jsx:306 +#: superset-frontend/src/pages/ChartCreation/index.tsx:423 msgid "Create new chart" msgstr "Создать новый график" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:111 -#, fuzzy msgid "Create new filter set" -msgstr "Создать новый график" +msgstr "Создать новый набор фильтров" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:124 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:135 msgid "Create or select schema..." -msgstr "" +msgstr "Создать или выбрать схему..." -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:169 +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:161 msgid "Created" msgstr "Создано" -#: superset/views/access_requests.py:46 superset/views/schedules.py:237 -#: superset/views/schedules.py:317 +#: superset/views/access_requests.py:49 msgid "Created On" msgstr "Дата создания" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:383 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:212 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:286 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:333 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:474 +#: superset-frontend/src/components/MetadataBar/ContentConfig.tsx:92 +#: superset-frontend/src/pages/ChartList/index.tsx:452 +#: superset-frontend/src/pages/ChartList/index.tsx:600 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:314 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:470 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:209 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:283 #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:192 #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:273 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:323 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:471 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:292 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:338 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:500 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:362 msgid "Created by" -msgstr "Дата создания" +msgstr "Кем создано" + +#: superset/charts/filters.py:116 superset/dashboards/filters.py:54 +msgid "Created by me" +msgstr "Создано мной" #: superset-frontend/src/profile/components/App.tsx:62 msgid "Created content" msgstr "Созданный контент" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:205 +#: superset-frontend/src/components/MetadataBar/ContentConfig.tsx:94 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:202 #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:184 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:349 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:350 msgid "Created on" msgstr "Дата создания" -#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:72 +#: superset/databases/ssh_tunnel/commands/exceptions.py:46 +msgid "Creating SSH Tunnel failed for an unknown reason" +msgstr "Не удалось создать SSH туннель по неизвестной причине" + +#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx:70 msgid "Creating a data source and creating a new tab" -msgstr "Создание источника данных и добавление новой вкладки" +msgstr "Создание источника данных и добавление новой вкладки..." -#: superset/connectors/sqla/views.py:370 superset/views/chart/mixin.py:78 -#: superset/views/dashboard/mixin.py:85 superset/views/dashboard/views.py:157 -#: superset/views/database/mixins.py:192 +#: superset/connectors/sqla/views.py:367 superset/views/chart/mixin.py:78 +#: superset/views/dashboard/mixin.py:85 superset/views/dashboard/views.py:193 +#: superset/views/database/mixins.py:189 msgid "Creator" msgstr "Автор" -#: superset/views/schedules.py:241 superset/views/schedules.py:321 -msgid "Crontab" -msgstr "" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:47 +msgid "Crimson" +msgstr "Малиновый" -#: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:65 -#, fuzzy +#: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:77 msgid "Cross Filter Scoping" -msgstr "Установить действие фильтра" +msgstr "Область действия кросс-фильтра" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:349 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:485 msgid "Cross-filter scoping" -msgstr "" +msgstr "Задать область действия кросс-фильтра" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:153 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:139 msgid "Cumulative" -msgstr "Действия" +msgstr "С накоплением" + +#: superset-frontend/src/explore/components/controls/VizTypeControl/FastVizSwitcher.tsx:131 +#, python-format +msgid "Currently rendered: %s" +msgstr "Сейчас отрисовано: %s" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:33 -#, fuzzy msgid "Custom" -msgstr "Настроить" +msgstr "Пользовательский" #: superset/views/dynamic_plugins.py:59 msgid "Custom Plugin" @@ -3708,74 +4584,83 @@ msgstr "Пользовательский плагин" #: superset/views/dynamic_plugins.py:58 msgid "Custom Plugins" -msgstr "Пользовательское условие WHERE" +msgstr "Пользовательские плагины" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:283 -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:226 -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:229 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:440 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:443 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:383 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:232 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:451 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:454 msgid "Custom SQL" msgstr "Через SQL" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:222 -msgid "Custom SQL ad-hoc filters are not available for the native Druid connector" -msgstr "" - -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:432 -msgid "Custom SQL ad-hoc metrics are not available for the native Druid connector" -msgstr "" - -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:435 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:447 msgid "Custom SQL ad-hoc metrics are not enabled for this dataset" -msgstr "" +msgstr "Пользовательские ad-hoc меры SQL не разрешены для этого датасета" + +#: superset/connectors/sqla/utils.py:193 superset/errors.py:145 +#: superset/models/helpers.py:128 superset/models/helpers.py:849 +msgid "Custom SQL fields cannot contain sub-queries." +msgstr "Пользовательские поля SQL не могут содержать подзапросы." #: superset-frontend/src/filters/components/Time/index.ts:28 msgid "Custom time filter plugin" -msgstr "" +msgstr "Пользовательский плагин фильтра времени" -#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:417 +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:765 msgid "Customize" -msgstr "Настроить" +msgstr "Кастомизация" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:167 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:166 msgid "Customize Metrics" -msgstr "Настроить" +msgstr "Настроить меры" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:453 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:478 msgid "Customize columns" -msgstr "Расчётные столбцы" +msgstr "Настроить столбцы" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx:435 +msgid "Cyclic dependency detected" +msgstr "Обнаружена циклическая зависимость" -#: superset/connectors/sqla/views.py:261 +#: superset/connectors/sqla/views.py:257 msgid "D3 Format" -msgstr "Формат D3" +msgstr "Формат даты/времени" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:47 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:58 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:69 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1060 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1210 msgid "D3 format" -msgstr "Формат D3" +msgstr "Формат даты/времени" #: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:22 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:150 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:146 msgid "D3 format syntax: https://github.com/d3/d3-format" -msgstr "" +msgstr "Формат D3: https://github.com/d3/d3-format." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:154 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:150 msgid "" "D3 number format for numbers between -1.0 and 1.0, useful when you want " "to have different siginificant digits for small and large numbers" msgstr "" +"Числовой формат D3 для чисел от -1 до 1, полезно, если вы работаете как с" +" маленькими числами, где нужна точность, так и с большими целыми числами" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:220 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:377 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:285 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:388 msgid "D3 time format for datetime columns" -msgstr "" +msgstr "Формат времени D3 для столбцов типа дата/время" -#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:44 +#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:46 msgid "D3 time format syntax: https://github.com/d3/d3-time-format" +msgstr "Формат времени D3: https://github.com/d3/d3-time-format." + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:139 +msgid "DATETIME" +msgstr "Дата/Время (DATETIME/TIMESTAMP)" + +#: superset/utils/encrypt.py:117 +#, python-format +msgid "DB column %(col_name)s has unknown type: %(value_type)s" msgstr "" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:102 @@ -3783,931 +4668,1118 @@ msgid "DEC" msgstr "ДЕК" #: superset-frontend/src/components/DeleteModal/index.tsx:69 +#: superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:241 msgid "DELETE" -msgstr "DELETE" +msgstr "УДАЛИТЬ" -#: superset-frontend/src/components/ReportModal/index.tsx:345 -#, fuzzy -msgid "DESCRIPTION ERROR" -msgstr "описание" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:259 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:329 msgid "DML" msgstr "DML" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:123 +msgid "Daily seasonality" +msgstr "Дневная сезонность" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:229 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:375 +msgid "Dark" +msgstr "Темный" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:43 +msgid "Dark Cyan" +msgstr "Темно-голубой" + #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:31 msgid "Dark mode" -msgstr "" +msgstr "Темная тема" -#: superset-frontend/src/components/Menu/MenuRight.tsx:46 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1296 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1317 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:582 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:210 -#: superset/templates/appbuilder/navbar_right.html:40 -#: superset/views/dashboard/mixin.py:78 superset/views/dashboard/views.py:155 -#: superset/views/schedules.py:236 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:417 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:621 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:189 +#: superset-frontend/src/views/components/RightMenu.tsx:226 +#: superset/views/dashboard/mixin.py:78 superset/views/dashboard/views.py:191 msgid "Dashboard" msgstr "Дашборд" -#: superset/initialization/__init__.py:444 -msgid "Dashboard Emails" -msgstr "Рассылка дашбордов" +#: superset-frontend/src/explore/actions/saveModalActions.js:135 +#, python-format +msgid "Dashboard [%s] just got created and chart [%s] was added to it" +msgstr "Дашборд [%s] был только что создан и график [%s] был добавлен в него" -#: superset/views/core.py:1028 +#: superset/views/core.py:1117 msgid "Dashboard [{}] just got created and chart [{}] was added to it" -msgstr "Дашборд [{}] был создан, и на него был добавлен график [{}]" +msgstr "Дашборд [{}] был только что создан и график [{}] был добавлен в него" #: superset/dashboards/commands/exceptions.py:54 msgid "Dashboard could not be created." -msgstr "Дашборд не может быть создан." +msgstr "Не удалось создать дашборд" #: superset/dashboards/commands/exceptions.py:70 msgid "Dashboard could not be deleted." -msgstr "Дашборд не может быть удалён." +msgstr "Не удалось удалить дашборд" #: superset/dashboards/commands/exceptions.py:66 msgid "Dashboard could not be updated." -msgstr "Дашборд не может быть обновлён." +msgstr "Не удалось обновить дашборд" -#: superset/reports/commands/exceptions.py:44 +#: superset/reports/commands/exceptions.py:48 msgid "Dashboard does not exist" msgstr "Дашборд не существует" +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:152 +msgid "Dashboard imported" +msgstr "Дашборд импортирован" + #: superset/dashboards/commands/exceptions.py:43 msgid "Dashboard parameters are invalid." -msgstr "Параметры дашборда недействительны." +msgstr "Неверные параметры дашборда" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:464 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:538 msgid "Dashboard properties" msgstr "Свойства дашборда" -#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:153 -#, fuzzy +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:374 +msgid "Dashboard properties updated" +msgstr "Свойства дашборда обновлены" + +#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx:117 msgid "Dashboard scheme" -msgstr "[название]" +msgstr "Схема дашборда" -#: superset-frontend/src/profile/components/CreatedContent.tsx:73 -#: superset-frontend/src/profile/components/Favorites.tsx:74 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:609 -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:294 -#: superset/initialization/__init__.py:238 superset/views/chart/mixin.py:79 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:813 +msgid "" +"Dashboard time range filters apply to temporal columns defined in\n" +" the filter section of each chart. Add temporal columns to the " +"chart\n" +" filters to have this dashboard filter impact those charts." +msgstr "" + +#: superset-frontend/src/dashboard/components/Header/index.jsx:518 +msgid "Dashboard title" +msgstr "Название дашборда" + +#: superset-frontend/src/pages/ChartList/index.tsx:658 +#: superset-frontend/src/profile/components/CreatedContent.tsx:101 +#: superset-frontend/src/profile/components/Favorites.tsx:84 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:648 +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:376 +#: superset/initialization/__init__.py:245 superset/views/chart/mixin.py:79 #: superset/views/dashboard/mixin.py:25 msgid "Dashboards" msgstr "Дашборды" +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:282 +#: superset-frontend/src/pages/ChartList/index.tsx:402 +msgid "Dashboards added to" +msgstr "Добавлено в дашборды" + #: superset/dashboards/commands/exceptions.py:58 msgid "Dashboards could not be deleted." -msgstr "Дашборды не могут быть удалены." +msgstr "Не удалось удалить дашборды." #: superset/charts/commands/exceptions.py:91 msgid "Dashboards do not exist" -msgstr "Дашборды отсутствуют" +msgstr "Дашборды не существуют" -#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:401 -#: superset-frontend/src/explore/components/DataTablesPane/index.tsx:388 -#: superset-frontend/src/views/CRUD/data/common.ts:22 -#: superset/initialization/__init__.py:354 -#: superset/initialization/__init__.py:363 -#: superset/initialization/__init__.py:373 -#: superset/initialization/__init__.py:387 -#: superset/initialization/__init__.py:404 -#: superset/initialization/__init__.py:509 -#: superset/initialization/__init__.py:519 -#: superset/initialization/__init__.py:532 -#: superset/initialization/__init__.py:545 -msgid "Data" -msgstr "БД" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:673 +msgid "Dashed" +msgstr "Штрих" -#: superset/connectors/druid/views.py:343 -msgid "Data Source" -msgstr "Источник данных" +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:708 +#: superset-frontend/src/views/components/RightMenu.tsx:171 +#: superset/initialization/__init__.py:240 +msgid "Data" +msgstr "Данные" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:57 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:47 msgid "Data Table" -msgstr "Редактировать таблицу" +msgstr "Таблица" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:290 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:181 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:142 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:122 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:139 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:197 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:200 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:306 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:170 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:310 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:157 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:99 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:99 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:154 msgid "Data Zoom" -msgstr "" +msgstr "Масштабирование графика" -#: superset/views/core.py:2313 +#: superset/sqllab/commands/results.py:117 superset/views/core.py:2170 msgid "" "Data could not be deserialized from the results backend. The storage " "format might have changed, rendering the old data stake. You need to re-" "run the original query." msgstr "" +"Не удалось распознать данные с сервера . Формат хранилища мог измениться," +" что привело к потере старых данных. Вам нужно повторно запустить " +"исходный запрос." -#: superset/views/core.py:2266 -#, fuzzy +#: superset/sqllab/commands/results.py:76 superset/views/core.py:2123 msgid "" "Data could not be retrieved from the results backend. You need to re-run " "the original query." -msgstr "Не найдены сохранённые результаты, необходимо повторно выполнить запрос" +msgstr "" +"Не найдены сохраненные результаты на сервере, необходимо повторно " +"выполнить запрос." + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/components/PlaySlider.jsx:182 +msgid "Data has no time steps" +msgstr "" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:219 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:233 msgid "Data preview" msgstr "Предпросмотр данных" -#: superset-frontend/src/dashboard/components/AddSliceCard.jsx:136 -msgid "Data source" -msgstr "Источник данных" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:288 +msgid "Data refreshed" +msgstr "Данные обновлены" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:213 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:216 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:284 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:266 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:269 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:354 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:362 msgid "Data type" -msgstr "Таблица Данных" +msgstr "Тип данных" -#: superset/utils/pandas_postprocessing.py:832 +#: superset/utils/pandas_postprocessing/prophet.py:134 msgid "DataFrame include at least one series" -msgstr "Пожалуйста, выберите хотя бы один показатель" +msgstr "" -#: superset/utils/pandas_postprocessing.py:830 +#: superset/utils/pandas_postprocessing/prophet.py:132 msgid "DataFrame must include temporal column" -msgstr "DataFrame должен включать временной столбец" - -#: superset-frontend/src/components/DatabaseSelector/index.tsx:271 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1127 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1132 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:179 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:223 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:294 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:436 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:223 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:331 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:277 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:424 -#: superset/connectors/sqla/views.py:490 superset/connectors/sqla/views.py:491 +msgstr "Датафрейм должен включать временной столбец" + +#: superset-frontend/src/components/DatabaseSelector/index.tsx:296 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:401 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:264 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:293 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:353 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:524 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:241 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:349 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:278 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:425 +#: superset/connectors/sqla/views.py:480 superset/connectors/sqla/views.py:481 #: superset/templates/superset/import_dashboards.html:53 -#: superset/views/database/forms.py:120 superset/views/database/forms.py:279 -#: superset/views/database/forms.py:407 superset/views/database/mixins.py:191 -#: superset/views/sql_lab.py:70 +#: superset/views/database/forms.py:137 superset/views/database/forms.py:305 +#: superset/views/database/forms.py:436 superset/views/database/mixins.py:188 +#: superset/views/sql_lab/views.py:83 msgid "Database" msgstr "База данных" -#: superset/views/database/views.py:452 -#, fuzzy, python-format +#: superset/views/database/views.py:478 +#, python-format msgid "" "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed " "for columnar uploads. Please contact your Superset Admin." msgstr "" -"Схема “%(schema_name)s” в базе данных “%(database_name)s” не разрешена " -"для загрузок Excel-файлов. Пожалуйста, свяжитесь с администратором " -"Superset." +"Схема \"%(schema_name)s\" базы данных \"%(database_name)s\" не " +"предназначена для загрузки файлов столбчатого формата. Пожалуйста, " +"свяжитесь с администратором." -#: superset/views/database/views.py:136 +#: superset/views/database/views.py:179 #, python-format msgid "" "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed " "for csv uploads. Please contact your Superset Admin." msgstr "" -"Схема “%(schema_name)s” в базе данных “%(database_name)s” не разрешена " -"для загрузки CSV. Пожалуйста, свяжитесь с администратором Superset." +"Схема \"%(schema_name)s\" базы данных \"%(database_name)s\" не " +"предназначена для загрузки CSV файлов. Пожалуйста, свяжитесь с " +"администратором." -#: superset/views/database/views.py:283 +#: superset/views/database/views.py:318 #, python-format msgid "" "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed " "for excel uploads. Please contact your Superset Admin." msgstr "" -"Схема “%(schema_name)s” в базе данных “%(database_name)s” не разрешена " -"для загрузок Excel-файлов. Пожалуйста, свяжитесь с администратором " -"Superset." +"Схема \"%(schema_name)s\" базы данных \"%(database_name)s\" не " +"предназначена для загрузки Excel файлов. Пожалуйста, свяжитесь с " +"администратором." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:910 -#, fuzzy +#: superset/initialization/__init__.py:237 +msgid "Database Connections" +msgstr "Базы данных" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1294 msgid "Database Creation Error" -msgstr "Database Expression" +msgstr "Ошибка создания базы данных" -#: superset/views/access_requests.py:43 +#: superset/views/access_requests.py:46 msgid "Database URL" msgstr "URL базы данных" -#: superset/databases/commands/exceptions.py:95 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:122 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:780 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:799 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1085 +msgid "Database connected" +msgstr "Соединение с базой данных установлено" + +#: superset/databases/commands/exceptions.py:96 msgid "Database could not be created." -msgstr "База данных не может быть создана." +msgstr "Не удалось создать базу данных." -#: superset/databases/commands/exceptions.py:113 +#: superset/databases/commands/exceptions.py:115 msgid "Database could not be deleted." -msgstr "База данных не может быть удалена." +msgstr "Не удалось удалить базу данных." -#: superset/databases/commands/exceptions.py:99 +#: superset/databases/commands/exceptions.py:100 msgid "Database could not be updated." -msgstr "База данных не может быть обновлена." +msgstr "Не удалось обновить базу данных." -#: superset/errors.py:117 +#: superset/errors.py:123 msgid "Database does not allow data manipulation." -msgstr "" +msgstr "База данных не позволяет изменять свои данные." #: superset/charts/commands/exceptions.py:82 #: superset/datasets/commands/exceptions.py:41 -#: superset/reports/commands/exceptions.py:35 +#: superset/reports/commands/exceptions.py:39 msgid "Database does not exist" msgstr "База данных не существует" -#: superset/connectors/sqla/models.py:1478 -#, fuzzy +#: superset/connectors/sqla/models.py:1766 superset/models/helpers.py:1951 msgid "Database does not support subqueries" -msgstr "База данных не существует" +msgstr "База данных не поддерживает подзапросы" + +#: superset-frontend/src/components/ImportModal/ErrorAlert.tsx:51 +msgid "" +"Database driver for importing maybe not installed. Visit the Superset " +"documentation page for installation instructions: " +msgstr "" +"Драйвер базы данных для импорта может быть не установлен. Изучите " +"документацию Суперсета для инструкций по установке: " -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:688 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:426 msgid "Database error" -msgstr "Database Expression" +msgstr "Ошибка базы данных" -#: superset/databases/commands/validate.py:136 -#, fuzzy +#: superset/databases/commands/validate.py:124 msgid "Database is offline." -msgstr "Название таблицы" +msgstr "База данных сейчас оффлайн." -#: superset/reports/commands/exceptions.py:62 +#: superset/reports/commands/exceptions.py:66 msgid "Database is required for alerts" -msgstr "База данных требуется для уведомлений" +msgstr "Для оповещений требуется база данных" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:89 -#: superset/db_engine_specs/base.py:1396 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:113 +#: superset/db_engine_specs/base.py:1741 msgid "Database name" -msgstr "Название таблицы" +msgstr "Имя базы данных" #: superset/datasets/commands/exceptions.py:50 msgid "Database not allowed to change" -msgstr "Базу данных не разрешено изменять" +msgstr "База данных недоступна для изменений" -#: superset/databases/commands/exceptions.py:91 +#: superset/databases/commands/exceptions.py:92 msgid "Database not found." msgstr "База данных не найдена." +#: superset/views/core.py:1174 +#, python-format +msgid "Database not found: %(id)s" +msgstr "База данных не найдена: %(id)s" + #: superset/databases/commands/exceptions.py:32 msgid "Database parameters are invalid." msgstr "Параметры базы данных недействительны." -#: superset/db_engine_specs/base.py:1393 -#, fuzzy +#: superset-frontend/src/components/ImportModal/index.tsx:219 +msgid "Database passwords" +msgstr "Пароли базы данных" + +#: superset/db_engine_specs/base.py:1738 +#: superset/db_engine_specs/databricks.py:52 msgid "Database port" -msgstr "база данных" +msgstr "Порт базы данных" -#: superset-frontend/src/profile/components/Security.tsx:46 -#: superset-frontend/src/views/CRUD/data/common.ts:26 -#: superset/initialization/__init__.py:351 superset/views/database/mixins.py:33 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:764 +msgid "Database settings updated" +msgstr "Обновлены настройки базы данных" + +#: superset-frontend/src/profile/components/Security.tsx:47 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:255 +#: superset/views/database/mixins.py:33 msgid "Databases" msgstr "Базы данных" -#: superset/views/database/forms.py:221 superset/views/database/forms.py:354 -#: superset/views/database/forms.py:442 +#: superset/views/database/forms.py:219 superset/views/database/forms.py:380 +#: superset/views/database/forms.py:471 msgid "Dataframe Index" -msgstr "Индекс" +msgstr "Индекс датафрейма" -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:284 +#: superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.tsx:267 #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx:89 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:833 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:862 -#: superset-frontend/src/explore/components/ExploreViewContainer.jsx:521 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:823 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:852 #: superset-frontend/src/explore/controls.jsx:189 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:283 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:520 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:505 +#: superset-frontend/src/pages/ChartCreation/index.tsx:383 +#: superset-frontend/src/pages/ChartList/index.tsx:382 +#: superset-frontend/src/pages/ChartList/index.tsx:648 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:630 msgid "Dataset" msgstr "Датасет" #: superset/datasets/commands/exceptions.py:32 #, python-format msgid "Dataset %(name)s already exists" -msgstr "Источник данных %(name)s уже существует" +msgstr "Датасет %(name)s уже существует" + +#: superset-frontend/src/explore/components/SaveModal.tsx:325 +msgid "Dataset Name" +msgstr "Имя датасета" #: superset/datasets/columns/commands/exceptions.py:27 -#, fuzzy msgid "Dataset column delete failed." -msgstr "Удаление аннотации не удалось." +msgstr "Не удалось удалить столбец датасета" #: superset/datasets/columns/commands/exceptions.py:23 -#, fuzzy msgid "Dataset column not found." -msgstr "База данных не найдена." +msgstr "Столбец датасета не найден" #: superset/datasets/commands/exceptions.py:157 msgid "Dataset could not be created." -msgstr "Датасет не может быть создан." +msgstr "Не удалось создать датасет" #: superset/datasets/commands/exceptions.py:165 msgid "Dataset could not be deleted." -msgstr "Датасет не может быть удалён." +msgstr "Не удалось удалить датасет" + +#: superset/datasets/commands/exceptions.py:193 +msgid "Dataset could not be duplicated." +msgstr "Датасет не может быть дублирован." #: superset/datasets/commands/exceptions.py:161 #: superset/datasets/commands/exceptions.py:173 msgid "Dataset could not be updated." -msgstr "Датасет не может быть обновлён." +msgstr "Не удалось обновить датасет" -#: superset/commands/exceptions.py:119 #: superset/datasets/commands/exceptions.py:149 msgid "Dataset does not exist" -msgstr "Источник данных %(name)s уже существует" +msgstr "Датасет не существует" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:843 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:183 +msgid "Dataset imported" +msgstr "Импортирован датасет" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:833 msgid "Dataset is required" -msgstr "Источники данных" +msgstr "Требуется датасет" #: superset/datasets/metrics/commands/exceptions.py:27 -#, fuzzy msgid "Dataset metric delete failed." -msgstr "Удаление аннотации не удалось." +msgstr "Не удалось удалить меру датасета." #: superset/datasets/metrics/commands/exceptions.py:23 -#, fuzzy msgid "Dataset metric not found." -msgstr "База данных не найдена." +msgstr "Мера датасета не найдена." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:881 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:888 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1066 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1073 msgid "Dataset name" -msgstr "Наименование датасета" +msgstr "Имя датасета" #: superset/datasets/commands/exceptions.py:153 msgid "Dataset parameters are invalid." -msgstr "Параметры датасета недействительны." +msgstr "Параметры датасета неверны." + +#: superset/dashboards/api.py:405 +#, python-format +msgid "Dataset schema is invalid, caused by: %(error)s" +msgstr "Схема датасета невалидна, причина: %(error)s" #: superset/datasets/commands/exceptions.py:169 msgid "Dataset(s) could not be bulk deleted." -msgstr "Датасет(ы) не может быть удален." +msgstr "Датасет(ы) не могут быть массово удалены." -#: superset-frontend/src/profile/components/Security.tsx:60 -#: superset-frontend/src/views/CRUD/data/common.ts:32 -#: superset/initialization/__init__.py:359 +#: superset-frontend/src/profile/components/Security.tsx:61 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:593 +#: superset/initialization/__init__.py:261 msgid "Datasets" msgstr "Датасеты" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:809 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/MessageContent.tsx:42 +msgid "" +"Datasets can be created from database tables or SQL queries. Select a " +"database table to the left or " +msgstr "" +"Датасеты могут быть созданы из таблиц базы данных или SQL запросов. " +"Выберите таблицу из базы данных слева или " + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:792 msgid "Datasets do not contain a temporal column" -msgstr "DataFrame должен включать временной столбец" +msgstr "Датасет не содержит столбца формата дата/время" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:157 -#: superset/connectors/druid/views.py:93 superset/views/access_requests.py:44 -#: superset/views/chart/mixin.py:80 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:110 +#: superset/views/access_requests.py:47 superset/views/chart/mixin.py:80 msgid "Datasource" msgstr "Источник данных" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:48 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:60 msgid "Datasource & Chart Type" -msgstr "Имя источника данных" +msgstr "Источник данных и Тип графика" -#: superset/connectors/druid/views.py:352 -msgid "Datasource Name" -msgstr "Имя источника данных" +#: superset/commands/exceptions.py:131 +msgid "Datasource does not exist" +msgstr "Источник данных не существует" -#: superset/connectors/connector_registry.py:99 -#, fuzzy, python-format -msgid "Datasource id not found: %(id)s" -msgstr "База данных не найдена." +#: superset/commands/exceptions.py:123 +msgid "Datasource type is invalid" +msgstr "Тип источниках данных неверный" #: superset/charts/commands/exceptions.py:101 msgid "Datasource type is required when datasource_id is given" -msgstr "Тип источника данных обязателен, если задан ID" +msgstr "" +"Тип источника данных обязателен, когда дан идентификатор источника данных" +" (datasource_id)" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:163 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:87 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:156 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:79 msgid "Date Time Format" -msgstr "Формат Datetime" +msgstr "Формат даты и времени" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:79 +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:49 msgid "Date filter" msgstr "Временной фильтр" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:142 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:115 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:131 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:70 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:144 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:152 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:136 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:153 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:129 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:216 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:152 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:145 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:128 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:281 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:328 msgid "Date format" -msgstr "Формат Datetime" +msgstr "Форматы даты" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:235 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:334 +msgid "Date format string" +msgstr "Формат временной строки" + +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:247 msgid "Date/Time" -msgstr "Формат даты" +msgstr "Дата/Время" -#: superset/connectors/sqla/views.py:151 +#: superset/connectors/sqla/views.py:164 msgid "Datetime Format" -msgstr "Формат Datetime" +msgstr "Формат даты и времени" -#: superset/connectors/sqla/models.py:1062 +#: superset/connectors/sqla/models.py:1219 superset/models/helpers.py:1412 msgid "" "Datetime column not provided as part table configuration and is required " "by this type of chart" msgstr "" -"Для данного графика необходим временной ряд. Укажите столбец с датой в " -"соответствующем поле раздела [Время]" +"Столбец даты/времени не предусмотрен в настройках таблицы и является " +"обязательным для этого типа графика" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:227 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:294 msgid "Datetime format" -msgstr "Формат Datetime" +msgstr "Формат даты/времени" -#: superset/db_engine_specs/base.py:96 -#, fuzzy +#: superset/db_engine_specs/base.py:110 msgid "Day" -msgstr "день" +msgstr "День" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:66 -#, fuzzy, python-format +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:63 +msgid "Day (freq=D)" +msgstr "День (част=D)" + +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:65 +#, python-format msgid "Days %s" -msgstr "день" +msgstr "Дней %s" -#: superset/connectors/sqla/models.py:1593 +#: superset/connectors/sqla/models.py:1890 superset/models/helpers.py:973 msgid "Db engine did not return all queried columns" -msgstr "" +msgstr "драйвер базы данных вернул не все запрошенные столбцы" + +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:215 +msgid "Deactivate" +msgstr "Выключить" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:77 msgid "December" msgstr "Декабрь" -#: superset/views/database/forms.py:214 superset/views/database/forms.py:347 +#: superset/views/database/forms.py:194 superset/views/database/forms.py:373 msgid "Decimal Character" -msgstr "Десятичный символ" +msgstr "Десятичный разделитель" -#: superset/viz.py:2706 +#: superset/viz.py:2740 msgid "Deck.gl - 3D Grid" -msgstr "Deck.gl - 3D Grid" +msgstr "Deck.gl - 3D сетка" -#: superset/viz.py:2822 +#: superset/viz.py:2856 +#, fuzzy msgid "Deck.gl - 3D HEX" msgstr "Deck.gl - 3D HEX" -#: superset/viz.py:2862 +#: superset/viz.py:2896 msgid "Deck.gl - Arc" -msgstr "Deck.gl - Arc" +msgstr "Deck.gl - Дуга" -#: superset/viz.py:2843 +#: superset/viz.py:2877 msgid "Deck.gl - GeoJSON" msgstr "Deck.gl - GeoJSON" -#: superset/viz.py:2431 +#: superset/viz.py:2465 msgid "Deck.gl - Multiple Layers" -msgstr "Deck.gl - Multiple Layers" +msgstr "Deck.gl - Многослойный" -#: superset/viz.py:2738 +#: superset/viz.py:2772 +#, fuzzy msgid "Deck.gl - Paths" msgstr "Deck.gl - Paths" -#: superset/viz.py:2789 +#: superset/viz.py:2823 msgid "Deck.gl - Polygon" -msgstr "Deck.gl - Polygon" +msgstr "Deck.gl - Полигон" -#: superset/viz.py:2625 +#: superset/viz.py:2659 msgid "Deck.gl - Scatter plot" -msgstr "Deck.gl - Scatter plot" +msgstr "Deck.gl - Точечная диаграмма" -#: superset/viz.py:2677 +#: superset/viz.py:2711 +#, fuzzy msgid "Deck.gl - Screen Grid" msgstr "Deck.gl - Screen Grid" #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:167 msgid "Default" -msgstr "Широта по умолчанию" +msgstr "По умолчанию" -#: superset/connectors/druid/views.py:349 superset/connectors/sqla/views.py:495 +#: superset/connectors/sqla/views.py:485 msgid "Default Endpoint" -msgstr "Адрес по-умолчанию" +msgstr "Эндпоинт по умолчанию" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:699 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:865 msgid "Default URL" -msgstr "URL базы данных" +msgstr "URL по умолчанию" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:700 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:866 msgid "Default URL to redirect to when accessing from the dataset list page" msgstr "" -"URL по-умолчанию, на который будет выполнен редирект при доступе из " +"URL по умолчанию, на который будет выполнен редирект при доступе из " "страницы со списком датасетов" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:907 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1156 msgid "Default Value" -msgstr "Значение фильтра" +msgstr "Значение по умолчанию" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:357 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:365 +msgid "Default datetime" +msgstr "Дата и время по умолчанию" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:290 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:295 msgid "Default latitude" -msgstr "" +msgstr "Широта по умолчанию" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:276 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:281 msgid "Default longitude" -msgstr "" +msgstr "Долгота по умолчанию" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:91 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:80 msgid "" "Default minimal column width in pixels, actual width may still be larger " "than this if other columns don't need much space" msgstr "" +"Минимальная ширина столбца (в пикселях). Реальная ширина по-прежнему " +"может быть больше, чем указанная, если остальным столбцам не будет " +"хватать места." -#: superset-frontend/src/filters/components/Select/controlPanel.ts:105 -msgid "Default to first item" -msgstr "" - -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:936 -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:222 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1185 msgid "Default value is required" -msgstr "Источники данных" +msgstr "Требуется значение по умолчанию" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:95 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:96 msgid "Default value must be set when \"Filter has default value\" is checked" msgstr "" +"Значение по умолчанию должно быть выбрано, когда установлен флаг \"Фильтр" +" имеет значение по умолчанию\"" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:92 +msgid "Default value must be set when \"Filter value is required\" is checked" +msgstr "" +"Значение по умолчанию должно быть выбрано, когда установлен флаг " +"\"Требуется значение фильтра\"" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:88 +msgid "" +"Default value set automatically when \"Select first filter value by " +"default\" is checked" +msgstr "" +"Значение по умолчанию задается автоматически, когда установлен флаг " +"\"Сделать первое значение фильтра значением по умолчанию\"" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:93 -msgid "Default value must be set when \"Required\" is checked" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:145 +msgid "" +"Define a function that receives the input and outputs the content for a " +"tooltip" +msgstr "Задайте функцию, которая получает на вход содержимое всплывающей подсказки" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:155 +msgid "Define a function that returns a URL to navigate to when user clicks" msgstr "" +"Задайте функцию, которая возвращает URL для навигации при " +"пользовательском нажатии" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:89 -msgid "Default value set automatically when \"Default to first item\" is checked" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:133 +msgid "" +"Define a javascript function that receives the data array used in the " +"visualization and is expected to return a modified version of that array." +" This can be used to alter properties of the data, filter, or enrich the " +"array." msgstr "" +"Определите функцию javascript, которая получает массив данных, " +"используемый в визуализации, и, как ожидается, вернет измененную версию " +"этого массива. Это может быть использовано для изменения свойств данных, " +"фильтрации или расширения массива." #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:44 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:266 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:149 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:167 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:398 -#: superset-frontend/src/explore/controlPanels/sections.tsx:167 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:259 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:141 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:408 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:188 +#: superset-frontend/src/explore/controlPanels/sections.tsx:140 msgid "" "Defines a rolling window function to apply, works along with the " "[Periods] text box" msgstr "" -"Одна из функций (Rolling) библиотеки Pandas, которая определяет способ " -"агрегации данных" +"Определяет функцию скользящего окна для применения, работает вместе с " +"текстовым полем [Периоды]" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:134 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:124 msgid "Defines how each series is broken down" -msgstr "" +msgstr "Определяет разложение каждой категории" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:64 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:388 -#: superset-frontend/src/explore/controls.jsx:403 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:285 +msgid "Defines the grid size in pixels" +msgstr "Определяет размер сетки (в пикселях)" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:119 +#: superset-frontend/src/explore/controls.jsx:383 msgid "" "Defines the grouping of entities. Each series is shown as a specific " "color on the chart and has a legend toggle" msgstr "" -"Группировка в ряды данных. Каждый ряд отображается в виде определенного " -"цвета на графике и имеет легенду" - -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:227 -#: superset-frontend/src/explore/controls.jsx:258 -msgid "" -"Defines the origin where time buckets start, accepts natural dates as in " -"`now`, `sunday` or `1970-01-01`" -msgstr "" +"Группировка в ряды данных. Каждая категория отображается в виде " +"определенного цвета на графике и имеет легенду" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:58 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:280 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:163 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:181 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:412 -#: superset-frontend/src/explore/controlPanels/sections.tsx:179 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:273 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:155 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:422 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:202 +#: superset-frontend/src/explore/controlPanels/sections.tsx:152 msgid "" "Defines the size of the rolling window function, relative to the time " "granularity selected" msgstr "" -"Одна из функций (Rolling) библиотеки Pandas, которая определяет период, к" -" которому применяется функция агрегации" +"Определяет размер функции скользящего окна относительно выбранной " +"детализации по времени" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:120 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:77 msgid "" "Defines whether the step should appear at the beginning, middle or end " "between two data points" msgstr "" +"Определяет, должен ли шаг отображаться в начале, середине или конце между" +" двумя точками данных" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:82 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:325 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:497 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:310 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:374 -#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:103 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:369 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:653 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:336 -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:131 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:367 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:622 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:357 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:628 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:508 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:238 -#: superset/views/base.py:595 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:90 +#: superset-frontend/src/pages/ChartList/ChartCard.tsx:106 +#: superset-frontend/src/pages/ChartList/index.tsx:488 +#: superset-frontend/src/pages/ChartList/index.tsx:805 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:395 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:596 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:307 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:366 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:338 +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:130 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:382 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:661 +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/index.tsx:59 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:422 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:779 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:512 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:220 +#: superset/views/base.py:659 msgid "Delete" msgstr "Удалить" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:481 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:580 #, python-format msgid "Delete %s?" msgstr "Удалить %s?" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:296 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:293 msgid "Delete Annotation?" msgstr "Удалить аннотацию?" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:453 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:526 msgid "Delete Database?" msgstr "Удалить базу данных?" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:605 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:751 msgid "Delete Dataset?" -msgstr "Удалить все?" +msgstr "Удалить датасет?" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:361 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:353 msgid "Delete Layer?" -msgstr "Удалить все?" +msgstr "Удалить слой?" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:485 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:261 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:489 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:243 msgid "Delete Query?" msgstr "Удалить запрос?" -#: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:110 -#, fuzzy +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:322 msgid "Delete Report?" -msgstr "Удалить шаблон?" +msgstr "Удалить рассылку?" -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:321 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:323 msgid "Delete Template?" msgstr "Удалить шаблон?" -#: superset/views/base.py:595 +#: superset/views/base.py:659 msgid "Delete all Really?" -msgstr "Удалить все?" +msgstr "Действительно удалить все?" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:181 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:195 msgid "Delete annotation" msgstr "Удалить аннотацию" -#: superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:202 +#: superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:224 msgid "Delete dashboard tab?" msgstr "Удалить вкладку дашборда?" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:332 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:402 msgid "Delete database" -msgstr "Выберите базу данных" +msgstr "Удалить базу данных" -#: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:78 -#, fuzzy +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:219 +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:257 msgid "Delete email report" -msgstr "Оповещения и рассылки" +msgstr "Удалить рассылку по email" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:404 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:405 msgid "Delete query" -msgstr "Удалить" +msgstr "Удалить запрос" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:239 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:236 #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:219 msgid "Delete template" -msgstr "Загрузить шаблон" +msgstr "Удалить шаблон" #: superset-frontend/src/dashboard/components/MissingChart.jsx:36 msgid "Delete this container and save to remove this message." msgstr "Удалите этот контейнер и сохраните изменения, чтобы убрать это сообщение." -#: superset/annotation_layers/annotations/api.py:502 +#: superset/annotation_layers/annotations/api.py:504 #, python-format msgid "Deleted %(num)d annotation" msgid_plural "Deleted %(num)d annotations" -msgstr[0] "Удалено %(num)d аннотаций" +msgstr[0] "Удалалена %(num)d аннотация" +msgstr[1] "Удалалены %(num)d аннотации" +msgstr[2] "Удалалено %(num)d аннотаций" -#: superset/annotation_layers/api.py:353 +#: superset/annotation_layers/api.py:355 #, python-format msgid "Deleted %(num)d annotation layer" msgid_plural "Deleted %(num)d annotation layers" -msgstr[0] "Удалено слоёв аннотации: %(num)d" +msgstr[0] "Удалален %(num)d слой аннотаций" +msgstr[1] "Удалалены %(num)d слоя аннотаций" +msgstr[2] "Удалалено %(num)d слоев аннотаций" -#: superset/charts/api.py:480 +#: superset/charts/api.py:501 #, python-format msgid "Deleted %(num)d chart" msgid_plural "Deleted %(num)d charts" -msgstr[0] "Удалено %(num)d графиков" +msgstr[0] "Удален %(num)d график" +msgstr[1] "Удалены %(num)d графика" +msgstr[2] "Удалено %(num)d графиков" -#: superset/css_templates/api.py:137 +#: superset/css_templates/api.py:139 #, python-format msgid "Deleted %(num)d css template" msgid_plural "Deleted %(num)d css templates" -msgstr[0] "Удалено %(num)d шаблонов CSS" +msgstr[0] "Удален %(num)d CSS шаблон" +msgstr[1] "Удалены %(num)d CSS шаблона" +msgstr[2] "Удалено %(num)d CSS шаблонов" -#: superset/dashboards/api.py:674 +#: superset/dashboards/api.py:735 #, python-format msgid "Deleted %(num)d dashboard" msgid_plural "Deleted %(num)d dashboards" -msgstr[0] "Удалено %(num)d дашбордов" +msgstr[0] "Удален %(num)d дашборд" +msgstr[1] "Удалены %(num)d дашборда" +msgstr[2] "Удалено %(num)d дашбордов" -#: superset/datasets/api.py:666 +#: superset/datasets/api.py:780 #, python-format msgid "Deleted %(num)d dataset" msgid_plural "Deleted %(num)d datasets" -msgstr[0] "Удалено датасетов: %(num)d" +msgstr[0] "Удален %(num)d датасет" +msgstr[1] "Удалены %(num)d датасета" +msgstr[2] "Удалено %(num)d датасетов" -#: superset/reports/api.py:452 +#: superset/reports/api.py:502 #, python-format msgid "Deleted %(num)d report schedule" msgid_plural "Deleted %(num)d report schedules" -msgstr[0] "Удалено %(num)d рассылок" +msgstr[0] "Удалено %(num)d расписание рассылок" +msgstr[1] "Удалены %(num)d расписания рассылок" +msgstr[2] "Удалено %(num)d расписаний рассылок" -#: superset/queries/saved_queries/api.py:197 +#: superset/queries/saved_queries/api.py:213 #, python-format msgid "Deleted %(num)d saved query" msgid_plural "Deleted %(num)d saved queries" -msgstr[0] "Удалено %(num)d сохранённых запросов" +msgstr[0] "Удален %(num)d сохраненный запрос" +msgstr[1] "Удалены %(num)d сохраненных запроса" +msgstr[2] "Удалено %(num)d сохраненных запросов" -#: superset-frontend/src/reports/actions/reports.js:176 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:162 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:103 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:91 +#: superset-frontend/src/reports/actions/reports.js:156 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:184 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:117 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:90 #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:93 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:142 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:546 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:232 -#: superset-frontend/src/views/CRUD/utils.tsx:246 -#: superset-frontend/src/views/CRUD/utils.tsx:285 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:158 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:675 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:233 +#: superset-frontend/src/views/CRUD/utils.tsx:268 +#: superset-frontend/src/views/CRUD/utils.tsx:307 #: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:172 #, python-format msgid "Deleted: %s" msgstr "Удалено: %s" +#: superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:227 +msgid "" +"Deleting a tab will remove all content within it. You may still reverse " +"this action with the" +msgstr "" +"Удаление вкладки удалит все ее содержимое. Вы можете отменить это " +"действие при помощи сочетания клавиш" + #: superset-frontend/src/explore/components/controls/SpatialControl.jsx:184 msgid "Delimited long & lat single column" -msgstr "Широта и Долгота в одном столбце с разделителем" +msgstr "Долгота и широта в одном столбце" -#: superset/views/database/forms.py:132 +#: superset/views/database/forms.py:150 msgid "Delimiter" msgstr "Разделитель" -#: superset/views/database/forms.py:133 -msgid "Delimiter used by CSV file (for whitespace use \\s+)." -msgstr "Разделитель, используемый CSV-файлом (для пробелов используется \\s+)." - -#: superset/views/schedules.py:244 superset/views/schedules.py:324 -msgid "Deliver As Group" -msgstr "" - -#: superset/views/schedules.py:245 superset/views/schedules.py:325 -msgid "Delivery Type" -msgstr "Тип Подписи" - #: superset-frontend/src/views/CRUD/alert/components/NotificationMethod.tsx:124 -#, fuzzy msgid "Delivery method" -msgstr "Добавить метод доставки" +msgstr "Способ оповещения" #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:33 msgid "Demographics" -msgstr "" +msgstr "Демография" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:43 #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:38 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:40 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:38 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:45 -#, fuzzy msgid "Density" -msgstr "Элемент" +msgstr "Концентрация" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/DependenciesRow.tsx:90 +msgid "Dependent on" +msgstr "Зависит от" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:55 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:38 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:40 msgid "Deprecated" -msgstr "Создано" +msgstr "Устарело" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:42 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:47 +#: superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx:83 +#: superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx:114 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:46 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:44 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:51 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:44 -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:131 -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:163 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:202 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:206 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:692 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1050 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1054 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:52 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:994 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:243 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1100 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1106 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:147 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:157 -#: superset/connectors/druid/views.py:188 -#: superset/connectors/druid/views.py:345 superset/connectors/sqla/views.py:145 -#: superset/connectors/sqla/views.py:256 superset/connectors/sqla/views.py:502 -#: superset/views/annotations.py:78 superset/views/annotations.py:126 -#: superset/views/chart/mixin.py:81 superset/views/sql_lab.py:71 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:158 +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:183 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:255 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:259 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:854 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1200 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1204 +#: superset-frontend/src/components/ReportModal/index.tsx:288 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:51 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1125 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:256 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:398 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:161 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:154 +#: superset/connectors/sqla/views.py:158 superset/connectors/sqla/views.py:252 +#: superset/connectors/sqla/views.py:363 superset/connectors/sqla/views.py:492 +#: superset/views/chart/mixin.py:81 superset/views/sql_lab/views.py:84 msgid "Description" msgstr "Описание" #: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:331 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:262 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:266 msgid "Description (this can be seen in the list)" msgstr "Описание (будет видно в списке)" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:520 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:568 msgid "Description Columns" -msgstr "описание" +msgstr "Описательные столбцы" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:48 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:49 msgid "Description text that shows up below your Big Number" -msgstr "" +msgstr "Описание, отображаемое под Карточкой" -#: superset-frontend/src/components/ListView/ListView.tsx:348 +#: superset-frontend/src/components/ListView/ListView.tsx:358 msgid "Deselect all" -msgstr "Выберите базу данных" +msgstr "Снять выделение" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:271 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1081 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:338 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1231 msgid "Details of the certification" -msgstr "Детали сертификации" +msgstr "Детали утверждения" -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:53 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:47 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:90 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:43 msgid "Determines how whiskers and outliers are calculated." -msgstr "" +msgstr "Определяет формулу расчета \"усов\" и выбросов." #: superset/views/dashboard/mixin.py:71 msgid "" "Determines whether or not this dashboard is visible in the list of all " "dashboards" -msgstr "Определяет видимость дашборда в списке всех дашбордов" +msgstr "Определяет, виден ли этот дашборд в списке всех дашбордов" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:230 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:231 msgid "Diamond" -msgstr "" +msgstr "Ромб" #: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:77 msgid "Did you mean:" -msgstr "" +msgstr "Возможно вы имели в виду:" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:101 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:141 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:94 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:333 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:215 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:485 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:65 +#: superset-frontend/src/explore/controlPanels/sections.tsx:211 msgid "Difference" -msgstr "Нажмите, чтобы увидеть разницу" +msgstr "Разница" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:46 +msgid "Dim Gray" +msgstr "Тускло-серый" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:116 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:110 +msgid "Dimension" +msgstr "Измерение" -#: superset/viz.py:1968 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/mixins.tsx:35 +msgid "Dimension to use on x-axis." +msgstr "Измерение для использования на оси X" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/mixins.tsx:34 +msgid "Dimension to use on y-axis." +msgstr "Измерение для использования на оси Y" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:67 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:165 +#: superset-frontend/src/explore/controls.jsx:123 +#: superset-frontend/src/explore/controls.jsx:380 +msgid "Dimensions" +msgstr "Измерения" + +#: superset/viz.py:2002 msgid "Directed Force Layout" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:34 #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:39 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:42 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:44 msgid "Directional" -msgstr "описание" +msgstr "Направленный" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:165 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:185 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:274 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:202 +msgid "Disable SQL Lab data preview queries" +msgstr "Отключить предпросмотр данных в Лаборатории SQL" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:205 +msgid "" +"Disable data preview when fetching table metadata in SQL Lab. Useful to " +"avoid browser performance issues when using databases with very wide " +"tables." +msgstr "" +"Отключить предварительный просмотр данных при извлечении метаданных " +"таблицы в SQL Lab. Полезно для избежания проблем с производительностью " +"браузера при использовании баз данных с очень широкими таблицами." + +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:98 +msgid "Disable embedding?" +msgstr "Выключить встраивание?" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:166 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:186 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:275 msgid "Disabled" -msgstr "Редактировать таблицу" +msgstr "Отключено" -#: superset-frontend/src/dashboard/components/Header/index.jsx:579 -msgid "Discard changes" +#: superset-frontend/src/dashboard/components/Header/index.jsx:598 +#: superset-frontend/src/dashboard/components/Header/index.jsx:600 +msgid "Discard" msgstr "Отменить изменения" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:43 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:49 msgid "Discrete" -msgstr "создан" +msgstr "Обособленный" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:149 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:42 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:194 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:57 msgid "Display Name" -msgstr "Значение фильтра" +msgstr "Отображаемое имя" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:164 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:229 msgid "Display column level total" -msgstr "" +msgstr "Отображать общий итог по столбцу" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:615 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:663 msgid "Display configuration" -msgstr "Как отображать" +msgstr "Настройки отображения" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:98 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:187 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:87 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:252 msgid "" "Display metrics side by side within each column, as opposed to each " "column being displayed side by side for each metric." msgstr "" +"Отображать меры рядом в каждом столбце, в отличие от отображения каждого " +"столбца рядом для каждой меры." -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:152 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:217 msgid "Display row level total" -msgstr "" +msgstr "Отображать общий итог по строке" + +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:38 +msgid "Display settings" +msgstr "Настройки отображения" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:89 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:78 msgid "Display total row/column" -msgstr "" +msgstr "Отобразить общую строку/столбец" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:34 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:35 msgid "" "Displays connections between entities in a graph structure. Useful for " "mapping relationships and showing which nodes are important in a network." @@ -4715,7 +5787,7 @@ msgid "" "your data has a geospatial component, try the deck.gl Arc chart." msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:132 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:169 #, fuzzy msgid "Distribute across" msgstr "Выполнить выбранный запрос" @@ -4724,341 +5796,392 @@ msgstr "Выполнить выбранный запрос" #: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:26 #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:48 #: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/createMetadata.ts:25 -#, fuzzy msgid "Distribution" -msgstr "Доля" +msgstr "Распределение" -#: superset/viz.py:1769 +#: superset/viz.py:1798 msgid "Distribution - Bar Chart" -msgstr "Distribution - Bar Chart" +msgstr "Распределение - Столбчатая диаграмма" #: superset-frontend/src/dashboard/components/gridComponents/new/NewDivider.jsx:31 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitlePane.tsx:57 msgid "Divider" msgstr "Разделитель" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:86 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:211 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:223 msgid "Do you want a donut or a pie?" -msgstr "" +msgstr "Круговая/кольцевая диаграмма" -#: superset-frontend/src/components/Menu/MenuRight.tsx:214 -#, fuzzy +#: superset-frontend/src/views/components/RightMenu.tsx:547 msgid "Documentation" -msgstr "аннотация" +msgstr "Документация" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:40 msgid "Domain" -msgstr "" - -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:29 -msgid "Don't refresh" -msgstr "Не обновлять" +msgstr "Блок" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:83 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:208 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:220 msgid "Donut" -msgstr "месяц" +msgstr "Кольцевая диаграмма" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:675 +msgid "Dotted" +msgstr "Пунктир" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:319 -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:328 -#: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:105 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:508 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:292 +msgid "Download" +msgstr "Сохранить" + +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:323 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:532 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:329 msgid "Download as image" msgstr "Сохранить как изображение" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:543 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:261 msgid "Download to CSV" -msgstr "" +msgstr "Сохранить в CSV" #: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:72 #: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:83 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:301 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:499 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:316 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:530 msgid "Draft" msgstr "Черновик" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:214 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:152 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:113 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:93 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:110 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:168 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:171 +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:194 +msgid "Drag and drop components and charts to the dashboard" +msgstr "Переместите элементы оформления и графики на дашборд" + +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:217 +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:185 +msgid "Drag and drop components to this tab" +msgstr "Переместите элементы оформления и графики в эту вкладку" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:216 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:141 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:128 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:70 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:70 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:125 msgid "Draw a marker on data points. Only applicable for line types." -msgstr "" +msgstr "Отобразить маркеры на данных. Применимо только для линий." -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:171 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:135 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:138 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:173 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:95 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:92 msgid "Draw area under curves. Only applicable for line types." -msgstr "" +msgstr "Отобразить область под кривыми. Применимо только для линий\"" #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:178 msgid "Draw line from Pie to label when labels outside?" +msgstr "Проводит линию от диаграммы к метке, когда метки находятся снаружи" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:216 +msgid "Draw split lines for minor axis ticks" +msgstr "Рисует разделительные линии для небольших отметок оси" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:347 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:235 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:222 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:166 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:166 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:219 +msgid "Draw split lines for minor y-axis ticks" +msgstr "Рисует разделительные линии для небольших отметок оси Y" + +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx:142 +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx:157 +msgid "Drill to detail" msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:331 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:246 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:209 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:189 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:206 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:262 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:265 -msgid "Draw split lines for minor y-axis ticks" +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx:166 +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx:179 +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx:198 +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx:229 +msgid "Drill to detail by" msgstr "" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx:217 -msgid "Drop a column here or click" +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx:168 +msgid "Drill to detail by value is not yet supported for this chart type." msgstr "" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx:367 -msgid "Drop a column/metric here or click" +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx:144 +msgid "" +"Drill to detail is disabled because this chart does not group data by " +"dimension value." msgstr "" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx:222 -msgid "Drop column here" +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailModal.tsx:99 +#, python-format +msgid "Drill to detail: %s" msgstr "" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx:372 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx:206 +msgid "Drop a column here or click" +msgid_plural "Drop columns here or click" +msgstr[0] "Перетащите столбец сюда" +msgstr[1] "Перетащите столбцы сюда" +msgstr[2] "Перетащите столбцы сюда" + +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx:335 +msgid "Drop a column/metric here or click" +msgid_plural "Drop columns/metrics here or click" +msgstr[0] "Перетащите столбец/меру сюда" +msgstr[1] "Перетащите столбцы/меры сюда" +msgstr[2] "Перетащите столбцы/меры сюда" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:248 +msgid "Drop a temporal column here or click" +msgstr "Перетащите столбец формата дата/время сюда" + +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx:216 +msgid "Drop column here" +msgid_plural "Drop columns here" +msgstr[0] "Перетащите столбец сюда" +msgstr[1] "Перетащите столбцы сюда" +msgstr[2] "Перетащите столбцы сюда" + +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx:340 msgid "Drop column or metric here" -msgstr "" +msgid_plural "Drop columns or metrics here" +msgstr[0] "Перетащите столбец или меру сюда" +msgstr[1] "Перетащите столбцы или меры сюда" +msgstr[2] "Перетащите столбцы или меры сюда" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndSelectLabel.tsx:80 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndSelectLabel.tsx:83 msgid "Drop columns here" -msgstr "" +msgstr "Перетащите столбцы сюда" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx:389 -#, fuzzy, python-format +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx:417 msgid "Drop columns or metrics here" -msgstr "%s столбец(ы) и показатель(и)" +msgstr "Перетащите столбцы или меры сюда" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx:388 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx:416 msgid "Drop columns/metrics here or click" -msgstr "" +msgstr "Перетащите столбцы/меры сюда" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:176 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:247 msgid "Drop temporal column here" -msgstr "" - -#: superset/connectors/druid/views.py:213 -#: superset/initialization/__init__.py:516 -msgid "Druid Clusters" -msgstr "Список Кластеров Druid" - -#: superset/connectors/druid/views.py:192 -msgid "Druid Datasource" -msgstr "Druid - Источники Данных" - -#: superset/connectors/druid/views.py:277 -#: superset/initialization/__init__.py:507 -msgid "Druid Datasources" -msgstr "Источники Данных Druid" - -#: superset/connectors/druid/views.py:248 -#: superset/connectors/druid/views.py:253 -msgid "" -"Druid supports basic authentication. See " -"[auth](http://druid.io/docs/latest/design/auth.html) and druid-basic-" -"security extension" -msgstr "" -"Druid поддерживает обычную аутентификацию. См. [эту " -"страницу](http://druid.io/docs/latest/design/auth.html) и расширения для " -"druid-basic-security" +msgstr "Перетащите столбец формата дата/время сюда" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:30 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:32 #, fuzzy msgid "Dual Line Chart" msgstr "Bullet Chart" -#: superset/views/datasource/views.py:119 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:476 +#: superset-frontend/src/views/CRUD/data/dataset/DuplicateDatasetModal.tsx:64 +msgid "Duplicate" +msgstr "Дублировать" + +#: superset/views/datasource/views.py:122 #, python-format msgid "Duplicate column name(s): %(columns)s" -msgstr "" +msgstr "Повторяющееся имя столбца(ов): %(columns)s" -#: superset/common/query_object.py:284 +#: superset/common/query_object.py:291 #, python-format msgid "" "Duplicate column/metric labels: %(labels)s. Please make sure all columns " "and metrics have a unique label." msgstr "" +"Повторяющиеся метки столбцов/мер: %(labels)s. Пожалуйста, убедитесь, что " +"все столбцы и меры имеют уникальную метку." -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:366 +#: superset-frontend/src/views/CRUD/data/dataset/DuplicateDatasetModal.tsx:61 +msgid "Duplicate dataset" +msgstr "Дублировать датасет" + +#: superset-frontend/src/SqlLab/components/SqlEditorTabHeader/index.tsx:143 msgid "Duplicate tab" msgstr "Дублировать вкладку" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:135 +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:138 msgid "Duration" msgstr "Продолжительность" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:227 -#: superset/views/database/mixins.py:175 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:239 +#: superset/views/database/mixins.py:172 msgid "" "Duration (in seconds) of the caching timeout for charts of this database." " A timeout of 0 indicates that the cache never expires. Note this " "defaults to the global timeout if undefined." msgstr "" +"Продолжительность (в секундах) таймаута кэша для графиков этой базы " +"данных. Таймаут 0 означает, что кэш никогда не очистится. Обратите " +"внимание, что если значение не задано, применяется значение по умолчанию " +"из основной конфигурации." -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:282 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:295 msgid "" "Duration (in seconds) of the caching timeout for this chart. Note this " "defaults to the dataset's timeout if undefined." -msgstr "Продолжительность (в секундах) таймаута кэширования для этого графика." +msgstr "" +"Продолжительность (в секундах) таймаута кэша для этого графикаОбратите " +"внимание, что если значение не задано, применяется значение таймаута " +"датасета." #: superset/views/chart/mixin.py:70 msgid "" "Duration (in seconds) of the caching timeout for this chart. Note this " "defaults to the datasource/table timeout if undefined." -msgstr "Продолжительность (в секундах) таймаута кэширования для этого графика." +msgstr "" +"Продолжительность (в секундах) таймаута кэша для этого графикаОбратите " +"внимание, что если значение не задано, применяется значение источника " +"данных/таблицы." -#: superset/connectors/druid/views.py:243 -msgid "" -"Duration (in seconds) of the caching timeout for this cluster. A timeout " -"of 0 indicates that the cache never expires. Note this defaults to the " -"global timeout if undefined." -msgstr "" -"Тайм-аут кеша (в секундах) для этого кластера. Тайм-аут 0 означает, что " -"кеш не может быть просрочен." - -#: superset/connectors/druid/views.py:334 -msgid "" -"Duration (in seconds) of the caching timeout for this datasource. A " -"timeout of 0 indicates that the cache never expires. Note this defaults " -"to the cluster timeout if undefined." -msgstr "" -"Тайм-аут (в секундах) кеша для этого источника данных. Тайм-аут 0 " -"означает, что кеш не может быть просрочен." - -#: superset/connectors/sqla/views.py:473 +#: superset/connectors/sqla/views.py:463 msgid "" "Duration (in seconds) of the caching timeout for this table. A timeout of" " 0 indicates that the cache never expires. Note this defaults to the " "database timeout if undefined." msgstr "" +"Продолжительность (в секундах) таймаута кэша для этой таблицы. Обратите " +"внимание, что если значение не задано, применяется значение базы данных." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:250 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:261 msgid "" "Duration (in seconds) of the metadata caching timeout for schemas of this" " database. If left unset, the cache never expires." msgstr "" -"Тайм-аут (в секундах) кеша для этого источника данных. Тайм-аут 0 " -"означает, что кеш не может быть просрочен." +"Продолжительность (в секундах) таймаута кэша для схем этой базы данных. " +"Обратите внимание, что если значение не задано, кэш никогда не очистится." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:272 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:282 msgid "" "Duration (in seconds) of the metadata caching timeout for tables of this " "database. If left unset, the cache never expires. " msgstr "" -"Тайм-аут (в секундах) кеша для этого источника данных. Тайм-аут 0 " -"означает, что кеш не может быть просрочен." +"Продолжительность (в секундах) таймаута кэша для таблиц этой базы данных." +" Обратите внимание, что если значение не задано, кэш никогда не " +"очистится." -#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:41 +#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:43 msgid "Duration in ms (1.40008 => 1ms 400µs 80ns)" -msgstr "" +msgstr "Продолжительность в мс (1.40008 => 1ms 400µs 80ns)" + +#: superset-frontend/src/explore/controls.jsx:90 +msgid "Duration in ms (100.40008 => 100ms 400µs 80ns)" +msgstr "Продолжительность в мс (100.40008 => 100ms 400µs 80ns)" -#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:40 +#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:42 +#: superset-frontend/src/explore/controls.jsx:89 msgid "Duration in ms (66000 => 1m 6s)" -msgstr "" +msgstr "Продолжительность в мс (66000 => 1m 6s)" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:205 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:223 #, python-format msgid "Duration: %s" msgstr "Продолжительность: %s" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:66 +msgid "Dynamic Aggregation Function" +msgstr "Динамическая агрегирующая функция" + +#: superset-frontend/src/filters/components/Select/controlPanel.ts:136 +msgid "Dynamically search all filter values" +msgstr "Динамически искать все значения фильтра" + #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:55 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:55 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:47 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:43 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:71 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:57 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:50 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:45 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:79 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:72 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:61 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:77 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:77 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:72 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:71 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:71 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:62 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:64 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/index.ts:43 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:74 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:79 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:78 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:78 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:69 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:42 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:61 -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:124 -#, fuzzy +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:130 msgid "ECharts" -msgstr "график" +msgstr "Графики Apache" + +#: superset/reports/notifications/email.py:131 +#, fuzzy +msgid "EMAIL_REPORTS_CTA" +msgstr "Включить рассылки" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:76 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:169 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:176 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:182 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:189 msgid "END (EXCLUSIVE)" -msgstr "" +msgstr "КОНЕЦ (НЕ ВКЛЮЧИТЕЛЬНО)" + +#: superset-frontend/packages/superset-ui-core/src/chart/components/SuperChartCore.tsx:171 +msgid "ERROR" +msgstr "ОШИБКА" -#: superset-frontend/src/views/CRUD/hooks.ts:628 +#: superset-frontend/src/views/CRUD/hooks.ts:656 #, python-format msgid "ERROR: %s" -msgstr "" +msgstr "ОШИБКА: %s" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:241 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:242 msgid "Edge length" -msgstr "" +msgstr "Длина ребер" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:247 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:248 msgid "Edge length between nodes" -msgstr "" +msgstr "Длина ребер между вершинами" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:124 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:125 msgid "Edge symbols" -msgstr "" +msgstr "Оформление ребер" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:226 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:227 msgid "Edge width" -msgstr "Толщина линии" +msgstr "Толщина ребра" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:197 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:211 #: superset-frontend/src/dashboard/components/menu/MarkdownModeDropdown.tsx:35 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:75 -#: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:121 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:316 -#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:128 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:404 -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:85 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:401 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:358 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:389 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:219 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:83 +#: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:144 +#: superset-frontend/src/pages/ChartList/ChartCard.tsx:131 +#: superset-frontend/src/pages/ChartList/index.tsx:523 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:386 +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:84 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:416 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:428 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:456 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:201 msgid "Edit" msgstr "Редактировать" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1053 -#, fuzzy +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:392 msgid "Edit Alert" -msgstr "Редактировать таблицу" - -#: superset/views/annotations.py:61 -msgid "Edit Annotation" -msgstr "Аннотации" - -#: superset/views/annotations.py:120 -msgid "Edit Annotation Layer" -msgstr "Добавить слой аннотации" +msgstr "Редактировать оповещение" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:309 +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:285 msgid "Edit CSS" msgstr "Редактировать CSS" -#: superset/views/css_templates.py:39 +#: superset/views/css_templates.py:41 msgid "Edit CSS Template" -msgstr "Шаблоны CSS" +msgstr "Редактировать CSS шаблон" -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:231 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:229 msgid "Edit CSS template properties" -msgstr "Редактирование свойств" +msgstr "Редактировать свойств CSS шаблона" #: superset/views/chart/mixin.py:29 msgid "Edit Chart" msgstr "Редактировать график" -#: superset/connectors/sqla/views.py:66 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:190 +msgid "Edit Chart Properties" +msgstr "Редактировать свойства графика" + +#: superset/connectors/sqla/views.py:76 msgid "Edit Column" msgstr "Редактировать столбец" @@ -5070,535 +6193,618 @@ msgstr "Редактировать дашборд" msgid "Edit Database" msgstr "Редактировать Базу Данных" -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:192 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:195 msgid "Edit Dataset " msgstr "Редактировать датасет " -#: superset/connectors/druid/views.py:216 -msgid "Edit Druid Cluster" -msgstr "Редактировать кластер Druid" - -#: superset/connectors/druid/views.py:73 -msgid "Edit Druid Column" -msgstr "Редактировать столбец Druid" - -#: superset/connectors/druid/views.py:280 -msgid "Edit Druid Datasource" -msgstr "Редактировать источник данных Druid" - -#: superset/connectors/druid/views.py:162 -msgid "Edit Druid Metric" -msgstr "Редактировать Druid Метрику" - -#: superset-frontend/src/components/ReportModal/index.tsx:251 -msgid "Edit Email Report" -msgstr "" - #: superset/views/log/__init__.py:24 msgid "Edit Log" -msgstr "Редактировать" +msgstr "Редактировать запись" -#: superset/connectors/sqla/views.py:215 +#: superset/connectors/sqla/views.py:211 msgid "Edit Metric" -msgstr "Редактировать показатель" +msgstr "Редактировать меру" #: superset/views/dynamic_plugins.py:61 msgid "Edit Plugin" msgstr "Редактировать плагин" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1051 -#, fuzzy +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:391 msgid "Edit Report" -msgstr "рассылка" +msgstr "Редактировать отчет" -#: superset/connectors/sqla/views.py:317 +#: superset/connectors/sqla/views.py:294 +#, fuzzy msgid "Edit Row level security filter" -msgstr "Править фильтр на уровне строк" +msgstr "Безопасность на уровне строк" -#: superset/views/sql_lab.py:42 +#: superset/views/sql_lab/views.py:55 msgid "Edit Saved Query" -msgstr "Изменить сохраненный запрос" +msgstr "Редактировать сохраненный запрос" -#: superset/connectors/sqla/views.py:398 +#: superset/connectors/sqla/views.py:388 msgid "Edit Table" msgstr "Редактировать таблицу" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:174 -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:283 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:188 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:282 msgid "Edit annotation" msgstr "Редактировать аннотацию" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:170 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:184 msgid "Edit annotation layer" msgstr "Редактировать слой аннотации" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:237 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:241 msgid "Edit annotation layer properties" msgstr "Редактировать свойства слоя аннотаций" -#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:305 -#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:308 +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailModal.tsx:44 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:216 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:422 +msgid "Edit chart" +msgstr "Редактировать график" + +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:278 msgid "Edit chart properties" -msgstr "Редактирование свойств" +msgstr "Редактировать свойства графика" -#: superset-frontend/src/dashboard/components/Header/index.jsx:605 -#, fuzzy +#: superset-frontend/src/dashboard/components/Header/index.jsx:632 +#: superset-frontend/src/dashboard/components/Header/index.jsx:634 msgid "Edit dashboard" msgstr "Редактировать дашборд" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:302 -msgid "Edit dashboard properties" -msgstr "Редактировать свойства дашборда" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1011 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1511 msgid "Edit database" msgstr "Редактировать Базу Данных" -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:192 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:288 msgid "Edit dataset" msgstr "Редактировать датасет" -#: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:73 +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:216 +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:251 +#: superset-frontend/src/components/ReportModal/index.tsx:206 msgid "Edit email report" -msgstr "" +msgstr "Редактировать рассылку" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/ConditionalFormattingControl.tsx:151 #, fuzzy msgid "Edit formatter" msgstr "Формат D3" -#: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:80 +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:279 msgid "Edit properties" -msgstr "Редактирование свойств" +msgstr "Редактировать свойства" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:383 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:384 msgid "Edit query" msgstr "Редактировать запрос" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:230 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:227 #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:210 msgid "Edit template" -msgstr "Загрузить шаблон" +msgstr "Редактировать шаблон" -#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:99 +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:104 msgid "Edit template parameters" -msgstr "Изменить параметры шаблона" +msgstr "Редактировать параметры шаблонизации Jinja" + +#: superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx:717 +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:242 +msgid "Edit the dashboard" +msgstr "Редактировать дашборд" -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:353 +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:346 msgid "Edit time range" -msgstr "Изменить параметры шаблона" +msgstr "Изменить временной интервал" -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:161 +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:153 msgid "Edited" msgstr "Редактировано" -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:484 +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:747 msgid "Editing 1 filter:" -msgstr "" +msgstr "Редактирование 1 фильтра:" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:119 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:118 msgid "Editing filter set:" -msgstr "" +msgstr "Редактирование набора фильтров:" -#: superset/errors.py:110 +#: superset/errors.py:116 msgid "Either the database is spelled incorrectly or does not exist." -msgstr "" +msgstr "Неверное или несуществующее имя базы данных." -#: superset/db_engine_specs/mysql.py:124 superset/db_engine_specs/presto.py:195 -#: superset/db_engine_specs/redshift.py:63 +#: superset/db_engine_specs/mysql.py:148 superset/db_engine_specs/presto.py:627 +#: superset/db_engine_specs/redshift.py:67 #, python-format msgid "Either the username \"%(username)s\" or the password is incorrect." -msgstr "" +msgstr "Неверное имя пользователя \"%(username)s\" или пароль." -#: superset/db_engine_specs/mssql.py:74 +#: superset/db_engine_specs/mssql.py:85 #, python-format msgid "" "Either the username \"%(username)s\", password, or database name " "\"%(database)s\" is incorrect." msgstr "" +"Неверное имя пользователя \"%(username)s\", пароль или имя базы данных " +"\"%(database)s\"." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:114 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:118 -msgid "Either the username or password is incorrect." -msgstr "" - -#: superset/errors.py:109 +#: superset/errors.py:115 msgid "Either the username or the password is wrong." -msgstr "" +msgstr "Неверное имя пользователя или пароль" -#: superset/views/schedules.py:326 -msgid "Email Format" -msgstr "Формат значения" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:88 +#, fuzzy +msgid "Elevation" +msgstr "Продолжительность" -#: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:64 +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:212 +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:241 msgid "Email reports active" -msgstr "" +msgstr "Включить рассылки" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:47 -#, fuzzy -msgid "Emit Target" -msgstr "Редактировать датасет" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:244 +msgid "Embed" +msgstr "Встроить" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/emitFilterControl.tsx:30 -#, fuzzy -msgid "Emit dashboard cross filters" -msgstr "Редактировать свойства дашборда" +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:349 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:351 +msgid "Embed code" +msgstr "Встроенный код" + +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:350 +msgid "Embed dashboard" +msgstr "Встроить дашборд" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/emitFilterControl.tsx:33 +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:108 +msgid "Embedding deactivated." +msgstr "Встраивание отключено" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:163 #, fuzzy -msgid "Emit dashboard cross filters." -msgstr "Редактировать свойства дашборда" +msgid "Emit Filter Events" +msgstr "Фильтрующийся" -#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:95 +#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:179 msgid "Emitted values" -msgstr "" +msgstr "Отображаемые значения" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:191 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:192 msgid "Emphasis" -msgstr "" +msgstr "Акцент" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:36 msgid "Employment and education" -msgstr "" +msgstr "Трудоустройство и образование" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:214 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:215 msgid "Empty circle" -msgstr "" +msgstr "Пустой круг" #: superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:59 -#, fuzzy msgid "Empty collection" -msgstr "Тестовое соединение" +msgstr "Пустая коллекция" + +#: superset-frontend/src/dashboard/components/gridComponents/Column.jsx:220 +#, fuzzy +msgid "Empty column" +msgstr "Показывать пустые столбцы" -#: superset/connectors/sqla/models.py:1068 +#: superset/charts/data/api.py:362 +msgid "Empty query result" +msgstr "Пустой ответ запроса" + +#: superset/connectors/sqla/models.py:1225 superset/models/helpers.py:1418 msgid "Empty query?" msgstr "Пустой запрос?" -#: superset/connectors/druid/views.py:348 superset/connectors/sqla/views.py:493 +#: superset-frontend/src/dashboard/components/gridComponents/Row.jsx:250 +msgid "Empty row" +msgstr "" + +#: superset-frontend/src/views/components/RightMenu.tsx:305 +#: superset-frontend/src/views/components/SubMenu.tsx:304 +msgid "Enable 'Allow file uploads to database' in any database's settings" +msgstr "" +"Включите \"Разрешить загрузку файлов в базу данных\" в настройках любой " +"базы данных" + +#: superset/connectors/sqla/views.py:483 +#, fuzzy msgid "Enable Filter Select" -msgstr "Включить выбор фильтра" - -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:293 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:184 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:145 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:125 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:142 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:200 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:203 +msgstr "Настроить области действия фильтра" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/index.tsx:139 +#, fuzzy +msgid "Enable cross-filtering" +msgstr "Задать область действия кросс-фильтра" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:309 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:173 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:313 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:160 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:102 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:102 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:157 msgid "Enable data zooming controls" -msgstr "" +msgstr "Включить элементы управления масштабированием данных" + +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:232 +msgid "Enable embedding" +msgstr "Разрешить встраивание" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:44 msgid "Enable forecast" -msgstr "" +msgstr "Включить прогноз в график" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:47 msgid "Enable forecasting" -msgstr "" +msgstr "Включить прогнозирование данных" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:161 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:270 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:162 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:271 msgid "Enable graph roaming" -msgstr "" +msgstr "Включить перемещение по графику" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:141 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:142 msgid "Enable node dragging" -msgstr "" +msgstr "Разрешить перемещение вершин" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:176 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:170 msgid "Enable query cost estimation" -msgstr "" +msgstr "Разрешить оценку стоимости запроса" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:290 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/pagination.tsx:36 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:299 msgid "Enable server side pagination of results (experimental feature)" -msgstr "" +msgstr "Включить серверную пагинацию результатов (экспериментально)" -#: superset/viz.py:2530 +#: superset/viz.py:2564 msgid "" "Encountered invalid NULL spatial entry," " please consider filtering those " "out" msgstr "" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:164 -#: superset/views/annotations.py:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:75 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:178 msgid "End" msgstr "Конец" -#: superset/views/sql_lab.py:73 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/Arc.jsx:44 +msgid "End (Longitude, Latitude): " +msgstr "Конец (Долгота, Широта)" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:64 +msgid "End Longitude & Latitude" +msgstr "Конечные Долгота и Широта" + +#: superset/views/sql_lab/views.py:86 msgid "End Time" msgstr "Время окончания" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:120 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:116 msgid "End angle" -msgstr "Период времени" +msgstr "Конечный угол" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:78 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:171 +#: superset-frontend/src/components/ListView/Filters/DateRange.tsx:67 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:307 #, fuzzy +msgid "End date" +msgstr "Отправить текстом" + +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:78 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:184 msgid "End date excluded from time range" -msgstr "Изменить параметры шаблона" +msgstr "Конечная дата исключена из временного интервала" #: superset/annotation_layers/annotations/commands/exceptions.py:35 msgid "End date must be after start date" -msgstr "Невозможно выбрать дату [from], которая позже текущего дня" +msgstr "Конечная дата должна быть после начальной" -#: superset/databases/commands/validate.py:71 +#: superset/databases/commands/validate.py:59 #, python-format msgid "Engine \"%(engine)s\" cannot be configured through parameters." -msgstr "" - -#: superset/databases/commands/validate.py:59 superset/databases/schemas.py:308 -#, python-format -msgid "Engine \"%(engine)s\" is not a valid engine." -msgstr "" +msgstr "Не удается настроить драйвер \"%(engine)s\" при данных параметрах." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:459 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:464 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:476 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:480 msgid "Engine Parameters" -msgstr "Параметры шаблона" +msgstr "Параметры драйвера" -#: superset/databases/schemas.py:272 +#: superset/databases/schemas.py:293 msgid "" "Engine spec \"InvalidEngine\" does not support being configured via " "individual parameters." msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:356 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:366 msgid "Enter CA_BUNDLE" -msgstr "" +msgstr "Введите CA_BUNDLE" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:55 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:98 +msgid "Enter Primary Credentials" +msgstr "Введите основные учетные данные" + +#: superset/views/database/forms.py:151 +msgid "Enter a delimiter for this data" +msgstr "Введите разделитель этих данных" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:54 msgid "Enter a name for this sheet" -msgstr "Введите название для таблицы" +msgstr "Введите название для этого листа" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:238 +#: superset-frontend/src/SqlLab/components/SqlEditorTabHeader/index.tsx:82 msgid "Enter a new title for the tab" -msgstr "Введите название для таблицы" +msgstr "Введите новое название для вкладки" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:222 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:244 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:266 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:234 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:255 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:276 msgid "Enter duration in seconds" -msgstr "Время в секундах" +msgstr "Введите время в секундах" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:327 -#, fuzzy +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:271 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:384 msgid "Enter fullscreen" msgstr "Полноэкранный режим" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:73 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:397 -#: superset-frontend/src/explore/controls.jsx:412 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:141 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:184 +#, python-format +msgid "Enter the required %(dbModelName)s credentials" +msgstr "Введите обязательные данные для %(dbModelName)s" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:128 +#: superset-frontend/src/explore/controls.jsx:392 msgid "Entity" msgstr "Элемент" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:125 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:124 msgid "Entity ID" -msgstr "Элемент" +msgstr "ID элемента" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:216 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:209 msgid "Equal Date Sizes" +msgstr "Одинаковые размеры дат" + +#: superset-frontend/src/explore/constants.ts:59 +msgid "Equal to (=)" msgstr "" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:56 -#, fuzzy, python-format +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:136 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:120 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:279 +#: superset-frontend/src/explore/components/EmbedCodeContent.jsx:57 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:72 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:65 msgid "Error" -msgstr "%s Ошибка" - -#: superset/views/alerts.py:83 -msgid "Error Message" -msgstr "Предупреждающее сообщение" +msgstr "Ошибка" -#: superset/connectors/sqla/models.py:1349 +#: superset/connectors/sqla/models.py:1623 superset/models/helpers.py:1828 #, python-format msgid "Error in jinja expression in HAVING clause: %(msg)s" -msgstr "" +msgstr "Ошибка в jinja выражении в операторе HAVING: %(msg)s" -#: superset/connectors/sqla/models.py:976 +#: superset/connectors/sqla/models.py:1129 #, python-format msgid "Error in jinja expression in RLS filters: %(msg)s" -msgstr "" +msgstr "Ошибка в jinja выражении в RLS фильтрах: %(msg)s" -#: superset/connectors/sqla/models.py:1337 +#: superset/connectors/sqla/models.py:1606 superset/models/helpers.py:1816 #, python-format msgid "Error in jinja expression in WHERE clause: %(msg)s" -msgstr "" +msgstr "Ошибка в jinja выражении в операторе WHERE: %(msg)s" -#: superset/connectors/sqla/models.py:735 +#: superset/connectors/sqla/models.py:824 #, python-format msgid "Error in jinja expression in fetch values predicate: %(msg)s" -msgstr "" +msgstr "Ошибка в jinja выражении в предикате выборки значений: %(msg)s" -#: superset-frontend/src/dashboard/containers/DashboardPage.tsx:190 +#: superset-frontend/src/dashboard/containers/DashboardPage.tsx:356 msgid "Error loading chart datasources. Filters may not work correctly." msgstr "" +"Ошибка загрузки источников данных для графиков. Фильтры могут работать " +"некорректно." -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:144 +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:147 msgid "Error message" msgstr "Сообщение об ошибке" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/controlPanel.js:46 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:104 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:139 -#, fuzzy msgid "Error while fetching charts" -msgstr "Возникла ошибка при получение данных" +msgstr "Возникла ошибка при получении графиков" #: superset-frontend/src/explore/components/controls/SelectAsyncControl/index.tsx:89 -#, fuzzy, python-format +#, python-format msgid "Error while fetching data: %s" -msgstr "Возникла ошибка при получение данных" +msgstr "Возникла ошибка при получении данных: %s" -#: superset/connectors/sqla/models.py:842 -#, fuzzy, python-format +#: superset/connectors/sqla/models.py:944 superset/models/helpers.py:1014 +#, python-format msgid "Error while rendering virtual dataset query: %(msg)s" -msgstr "Ошибка при сохранении датасета: %s" +msgstr "Произошла ошибка при выполнении запроса виртуального датасета: %(msg)s" + +#: superset/charts/data/commands/get_data_command.py:55 +#, python-format +msgid "Error: %(error)s" +msgstr "Ошибка: %(error)s" + +#: superset/views/core.py:818 superset/views/core.py:1897 +#, python-format +msgid "Error: %(msg)s" +msgstr "Ошибка: %(msg)s" + +#: superset/views/core.py:815 +msgid "Error: permalink state not found" +msgstr "" -#: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:91 +#: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:100 msgid "Estimate cost" -msgstr "Выполнить выбранный запрос" +msgstr "Оценить стоимость запроса" -#: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:90 +#: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:99 msgid "Estimate selected query cost" -msgstr "Выполнить выбранный запрос" +msgstr "Оценить стоимость выбранного запроса" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:648 +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:599 msgid "Estimate the cost before running a query" -msgstr "Спрогнозировать время до выполнения запроса" +msgstr "Спрогнозировать стоимость до выполнения запроса" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/vendor/superset/AnnotationTypes.js:37 +#: superset-frontend/src/modules/AnnotationTypes.js:36 +msgid "Event" +msgstr "Событие" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:29 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:31 #, fuzzy msgid "Event Flow" msgstr "Event flow" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:43 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:44 msgid "Event Names" -msgstr "Полное имя" +msgstr "Имена событий" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:35 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:36 msgid "Event definition" -msgstr "" +msgstr "Определение события" -#: superset/viz.py:2896 +#: superset/viz.py:2930 +#, fuzzy msgid "Event flow" msgstr "Event flow" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:478 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:526 msgid "Event time column" -msgstr "Столбец с временем" +msgstr "Столбец формата дата/время" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:43 msgid "Every" -msgstr "" +msgstr "Каждый(ая)" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:30 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:29 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:25 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:26 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:26 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:30 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:26 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:25 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:56 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:59 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:58 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:57 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:57 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:48 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:57 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:58 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:54 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:60 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:59 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:58 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:58 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:49 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:48 msgid "Evolution" -msgstr "" +msgstr "Динамика" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1263 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1105 msgid "Exact" -msgstr "След" +msgstr "Точное" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:34 #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:49 #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:67 #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:81 #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:95 -#, fuzzy msgid "Example" -msgstr "Примеры" - -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:92 -#, python-format -msgid "Example %(tableName)s will appear here" -msgstr "" +msgstr "Пример" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:759 -#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:180 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:178 +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:853 +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:214 msgid "Examples" msgstr "Примеры" -#: superset/views/database/forms.py:252 +#: superset/views/database/forms.py:278 msgid "Excel File" -msgstr "Файл Excel" +msgstr "Excel Файл" -#: superset/views/database/views.py:398 +#: superset/views/database/views.py:424 #, python-format msgid "" "Excel file \"%(excel_filename)s\" uploaded to table \"%(table_name)s\" in" " database \"%(db_name)s\"" msgstr "" -"Excel-файл “%(excel_filename)s\" загружен в таблицу \"%(table_name)s\" " -"базы данных \"%(db_name)s\"" +"Excel файл \"%(excel_filename)s\" загружен в таблицу \"%(table_name)s\" в" +" базе данных \"%(db_name)s\"" -#: superset/views/database/views.py:268 +#: superset/views/database/views.py:303 msgid "Excel to Database configuration" -msgstr "Настройка CSV для БД" +msgstr "Конфигурация Excel файла для импорта в базу данных" -#: superset-frontend/src/filters/components/Select/controlPanel.ts:126 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:125 msgid "Exclude selected values" -msgstr "" +msgstr "Исключить выбранные значения" #: superset-frontend/src/SqlLab/components/HighlightedSql/index.tsx:82 -#, fuzzy msgid "Executed SQL" -msgstr "Выполнить выбранный запрос" +msgstr "Исполненный SQL" -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:162 +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:164 msgid "Executed query" -msgstr "Выполнить выбранный запрос" +msgstr "Выполненный запрос" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:105 -#, fuzzy +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:108 msgid "Execution ID" -msgstr "Журнал Действий" +msgstr "ID исполнения" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:307 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:377 msgid "Execution log" msgstr "Журнал Действий" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:326 -#, fuzzy +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:411 +msgid "Existing dataset" +msgstr "Существующий датасет" + +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:270 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:383 msgid "Exit fullscreen" -msgstr "Полноэкранный режим" +msgstr "Выйти из полноэкранного режима" + +#: superset-frontend/plugins/plugin-chart-echarts/src/constants.ts:83 +msgid "Expand" +msgstr "Расширить" #: superset-frontend/src/dashboard/components/filterscope/treeIcons.jsx:36 msgid "Expand all" -msgstr "Развернуть всё" +msgstr "Расширить все" -#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:152 -#, fuzzy +#: superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx:167 +msgid "Expand data panel" +msgstr "Расширить панель данных" + +#: superset-frontend/src/components/Table/index.tsx:267 +msgid "Expand row" +msgstr "Развернуть строку" + +#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx:198 msgid "Expand table preview" -msgstr "Убрать предпросмотр таблицы" +msgstr "Расширить предпросмотр таблицы" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:351 +#: superset-frontend/src/SqlLab/components/SqlEditorTabHeader/index.tsx:123 msgid "Expand tool bar" msgstr "Показать панель инструментов" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:72 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:443 +msgid "" +"Expects a formula with depending time parameter 'x'\n" +" in milliseconds since epoch. mathjs is used to evaluate the " +"formulas.\n" +" Example: '2x+5'" +msgstr "" +"Формула с зависимой переменной 'x' в милисекундах с 1970 года " +"(Unix-время). Для рассчета используется mathjs. Например: '2x+5'" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:38 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:37 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:80 #: superset-frontend/src/filters/components/GroupBy/index.ts:31 #: superset-frontend/src/filters/components/Range/index.ts:31 #: superset-frontend/src/filters/components/Select/index.ts:32 @@ -5606,139 +6812,152 @@ msgstr "Показать панель инструментов" #: superset-frontend/src/filters/components/TimeColumn/index.ts:31 #: superset-frontend/src/filters/components/TimeGrain/index.ts:31 msgid "Experimental" -msgstr "" +msgstr "Экспериментальный" -#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:98 -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:168 -#: superset/views/core.py:883 +#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx:91 +#: superset/views/core.py:985 msgid "Explore" -msgstr "Обзор графика" +msgstr "Исследовать" -#: superset/views/core.py:881 +#: superset/views/core.py:983 #, python-format msgid "Explore - %(table)s" msgstr "Исследовать - %(table)s" -#: superset/reports/notifications/email.py:91 -msgid "Explore in Superset" -msgstr "" - -#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:91 -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:161 +#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx:84 +#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx:41 msgid "Explore the result set in the data exploration view" -msgstr "Исследовать набор данных" - -#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:116 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:388 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:661 -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:98 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:385 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:630 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:342 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:373 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:636 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:516 -#: superset/views/dashboard/views.py:67 +msgstr "Создать новый график на основе этих данных" + +#: superset-frontend/src/pages/ChartList/ChartCard.tsx:119 +#: superset-frontend/src/pages/ChartList/index.tsx:507 +#: superset-frontend/src/pages/ChartList/index.tsx:813 +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:97 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:400 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:669 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:412 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:438 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:787 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:520 +#: superset/views/dashboard/views.py:65 msgid "Export" -msgstr "Экспорт" +msgstr "Экспортировать" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:333 -msgid "Export CSV" -msgstr "Экпспорт CSV" - -#: superset/views/dashboard/views.py:67 +#: superset/views/dashboard/views.py:65 msgid "Export dashboards?" -msgstr "Экспортировать дашборд?" - -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:341 -msgid "Export full CSV" -msgstr "" +msgstr "Экспортировать дашборды?" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:397 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:398 msgid "Export query" -msgstr "Скопировать запрос" +msgstr "Экспорт запроса" -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:202 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:210 -#, fuzzy -msgid "Export to .CSV format" -msgstr "Экспортировать в CSV формат" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:513 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:316 +msgid "Export to .CSV" +msgstr "Экспорт в .CSV" + +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:323 +msgid "Export to .JSON" +msgstr "Экспорт в .JSON" -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:182 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:335 #, fuzzy -msgid "Export to .JSON format" -msgstr "Экспортировать в CSV формат" +msgid "Export to Excel" +msgstr "Экспорт в YAML" -#: superset/views/base.py:538 +#: superset/views/base.py:602 msgid "Export to YAML" msgstr "Экспорт в YAML" -#: superset/views/base.py:538 +#: superset/views/base.py:602 msgid "Export to YAML?" -msgstr "Экспорт в YAML?" +msgstr "Экспортировать в YAML?" + +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:524 +msgid "Export to full .CSV" +msgstr "Экспорт в целый .CSV" + +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:300 +msgid "Export to original .CSV" +msgstr "Экспорт исходных данных в .CSV" + +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:307 +msgid "Export to pivoted .CSV" +msgstr "Экспорт сводной таблицы в .CSV" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:76 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:88 msgid "Expose database in SQL Lab" -msgstr "" +msgstr "Предоставить доступ к базе в Лаборатории SQL" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:281 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:387 -#: superset/views/database/mixins.py:186 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:351 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:457 +#: superset/views/database/mixins.py:183 msgid "Expose in SQL Lab" -msgstr "Открыть в SQL редакторе" +msgstr "Доступен в SQL редакторе" -#: superset/views/database/mixins.py:104 +#: superset/views/database/mixins.py:103 msgid "Expose this DB in SQL Lab" -msgstr "Показать базу данных в SQL Редакторе" +msgstr "Предоставить доступ к базе в Лаборатории SQL" -#: superset/connectors/sqla/views.py:149 +#: superset/connectors/sqla/views.py:162 msgid "Expression" -msgstr "Выражение SQL" +msgstr "Выражение" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:735 -#: superset/connectors/sqla/views.py:262 superset/connectors/sqla/views.py:505 -#: superset/views/database/mixins.py:196 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:902 +#: superset/connectors/sqla/views.py:258 superset/connectors/sqla/views.py:495 +#: superset/views/database/mixins.py:193 msgid "Extra" msgstr "Дополнительные параметры" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:160 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:167 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:122 msgid "Extra Controls" -msgstr "" +msgstr "Дополнительные элементы управления" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:87 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:99 msgid "Extra Parameters" -msgstr "Параметры шаблона" +msgstr "Доп. параметры" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:736 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:121 +msgid "Extra data for JS" +msgstr "Доп. данные для JS" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:903 msgid "" "Extra data to specify table metadata. Currently supports metadata of the " "format: `{ \"certification\": { \"certified_by\": \"Data Platform Team\"," " \"details\": \"This table is the source of truth.\" }, " "\"warning_markdown\": \"This is a warning.\" }`." msgstr "" +"Дополнительные метаданные таблицы. В настоящий момент поддерживается " +"следующий формат: `{ \"certification\": { \"certified_by\": " +"\"Руководитель отдела\", \"details\": \"Эта таблица - источник правды.\" " +"}, \"warning_markdown\": \"Это предупреждение.\" }`." -#: superset/views/database/mixins.py:244 superset/views/database/mixins.py:268 +#: superset/views/database/mixins.py:240 superset/views/database/mixins.py:264 #, python-format msgid "Extra field cannot be decoded by JSON. %(msg)s" -msgstr "" +msgstr "Дополнительное поле не может быть декодировано с помощью JSON. %(msg)s" -#: superset-frontend/src/explore/controlPanels/sections.tsx:62 +#: superset-frontend/src/explore/controlPanels/sections.tsx:52 msgid "Extra parameters for use in jinja templated queries" -msgstr "Дополнительные параметры для запросов, использующих шаблоны jinja" +msgstr "Дополнительные параметры для запросов, использующих шаблонизацию Jinja" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:89 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:101 msgid "" "Extra parameters that any plugins can choose to set for use in Jinja " "templated queries" -msgstr "Дополнительные параметры для запросов, использующих шаблоны jinja" +msgstr "" +"Дополнительные параметры для шаблонизации Jinja, которые могут быть " +"использованы в графиках" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:78 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:90 msgid "Extra url parameters for use in Jinja templated queries" -msgstr "Дополнительные параметры для запросов, использующих шаблоны jinja" +msgstr "Дополнительные url параметры для запросов, использующих шаблонизацию Jinja" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:270 +msgid "Extruded" +msgstr "" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:92 msgid "FEB" @@ -5748,45 +6967,73 @@ msgstr "ФЕВ" msgid "FRI" msgstr "ПТ" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:115 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:108 msgid "Factor" -msgstr "Октябрь" +msgstr "" -#: superset/views/database/forms.py:145 superset/views/database/forms.py:298 -#: superset/views/database/forms.py:426 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:337 +msgid "Factor to multiply the metric by" +msgstr "Число, на которое умножается мера" + +#: superset/views/database/forms.py:167 superset/views/database/forms.py:324 +#: superset/views/database/forms.py:455 msgid "Fail" msgstr "Ошибка" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:69 -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:75 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:153 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:120 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:126 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:168 msgid "Failed" msgstr "Ошибка" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:194 -#: superset-frontend/src/SqlLab/actions/sqlLab.js:305 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:208 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:324 msgid "Failed at retrieving results" msgstr "Невозможно выполнить запрос" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:409 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:470 #, python-format msgid "Failed at stopping query. %s" +msgstr "Не удалось остановить запрос. %s" + +#: superset-frontend/src/components/ReportModal/index.tsx:337 +msgid "Failed to create report" +msgstr "Не удалось создать рассылку" + +#: superset/sqllab/exceptions.py:66 +#, python-format +msgid "Failed to execute %(query)s" msgstr "" -#: superset/errors.py:137 superset/sqllab/sql_json_executer.py:194 +#: superset-frontend/src/explore/ExplorePage.tsx:57 +msgid "Failed to load chart data" +msgstr "Не удалось загрузить данные графика" + +#: superset-frontend/src/explore/ExplorePage.tsx:69 +msgid "Failed to load chart data." +msgstr "Не удалось загрузить данные графика." + +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/useAdvancedDataTypes.ts:70 +msgid "Failed to retrieve advanced type" +msgstr "Не удалось получить расширенный тип" + +#: superset/errors.py:143 superset/sqllab/sql_json_executer.py:190 msgid "Failed to start remote query on a worker." -msgstr "" +msgstr "Не удалось запустить удаленный запрос на сервере." + +#: superset-frontend/src/components/ReportModal/index.tsx:336 +msgid "Failed to update report" +msgstr "Не удалось обновить отчет" #: superset-frontend/src/explore/components/controls/withAsyncVerification.tsx:201 #, python-format msgid "Failed to verify select options: %s" -msgstr "Ошибка при проверке опций выбора: %s" +msgstr "Ошибка при проверке вариантов выбора: %s" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:436 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:433 -#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:162 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:159 +#: superset-frontend/src/pages/ChartList/index.tsx:560 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:453 +#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:145 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:151 msgid "Favorite" msgstr "Избранное" @@ -5798,180 +7045,195 @@ msgstr "Избранное" msgid "February" msgstr "Февраль" -#: superset/connectors/druid/views.py:353 -msgid "Fetch Values From" -msgstr "Извлечь значения из" - -#: superset/connectors/sqla/views.py:499 +#: superset/connectors/sqla/views.py:489 msgid "Fetch Values Predicate" -msgstr "Извлечь Значения Предиката" +msgstr "" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:788 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:535 msgid "Fetch data preview" msgstr "Получить данные для просмотра" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:244 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:369 #, python-format msgid "Fetched %s" -msgstr "" +msgstr "Получено %s" + +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:138 +msgid "Fetching" +msgstr "Получение данных" -#: superset/databases/commands/exceptions.py:62 +#: superset/databases/commands/exceptions.py:63 #, python-format msgid "Field cannot be decoded by JSON. %(json_error)s" -msgstr "" +msgstr "поле не может быть декодировано с помощью JSON. %(json_error)s" -#: superset/databases/schemas.py:183 superset/databases/schemas.py:198 +#: superset/databases/schemas.py:194 superset/databases/schemas.py:209 #, python-format msgid "Field cannot be decoded by JSON. %(msg)s" -msgstr "" +msgstr "Поле не может быть декодировано с помощью JSON. %(msg)s" #: superset/databases/commands/exceptions.py:50 +#: superset/databases/ssh_tunnel/commands/exceptions.py:57 msgid "Field is required" -msgstr "Поле обязательно" +msgstr "Поле обязательно к заполнению" #: superset/templates/superset/import_dashboards.html:37 msgid "File" msgstr "Файл" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:982 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:221 +msgid "Fill Color" +msgstr "Цвет заливки" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1231 msgid "Fill all required fields to enable \"Default Value\"" -msgstr "" +msgstr "Установить все требуемые флаги для включения \"Значения по умолчанию\"" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:166 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:181 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:255 msgid "Fill method" -msgstr "Добавить слой аннотации" +msgstr "Метод заполнения пропусков" -#: superset-frontend/src/components/ListView/Filters/Select.tsx:77 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:248 +msgid "Filled" +msgstr "С заливкой" + +#: superset-frontend/src/components/ListView/Filters/Select.tsx:93 +#: superset-frontend/src/components/ListView/Filters/Select.tsx:106 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitlePane.tsx:56 msgid "Filter" -msgstr "Фильтры" +msgstr "Фильтр" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:288 +msgid "Filter Configuration" +msgstr "Конфигурация фильтра" #: superset/templates/appbuilder/general/widgets/search.html:24 msgid "Filter List" -msgstr "Фильтры" +msgstr "Список фильтров" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:787 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:292 +msgid "Filter Settings" +msgstr "Настройки фильтра" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:770 msgid "Filter Type" -msgstr "Значение фильтра" +msgstr "Тип фильтра" -#: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:26 +#: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:28 msgid "Filter box" -msgstr "Фильтр" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "Выберите базу данных" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "Значение фильтра" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "Значение фильтра" +msgstr "Фильтр-виджет" -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:281 msgid "Filter configuration" -msgstr "Фильтруемые срезы" +msgstr "Настройки фильтра" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:66 +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:36 msgid "Filter configuration for the filter box" -msgstr "Настройки фильтра" +msgstr "Настройки фильтра для \"Фильтр-виджета\"" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:895 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1139 msgid "Filter has default value" -msgstr "" +msgstr "Фильтр имеет значение по умолчанию" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1010 -msgid "Filter is hierarchical" -msgstr "" +#: superset-frontend/src/components/Table/index.tsx:255 +#, fuzzy +msgid "Filter menu" +msgstr "Имя фильтра" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:109 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:113 msgid "Filter metadata changed in dashboard. It will not be applied." -msgstr "" +msgstr "Метаданные фильтра изменились в дашборде. Они не будут применены." -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:777 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:760 msgid "Filter name" -msgstr "Значение фильтра" +msgstr "Имя фильтра" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/DependenciesRow.tsx:92 +msgid "Filter only displays values relevant to selections made in other filters." +msgstr "" +"Фильтр предлагает только те значения, которые отобраны выбранными " +"фильтрами" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:563 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:286 msgid "Filter results" -msgstr "Результаты поиска" +msgstr "Фильтровать результаты" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:144 -#, fuzzy, python-format +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:143 msgid "Filter set already exists" -msgstr "Источник данных %(name)s уже существует" +msgstr "Набор фильтров уже существует" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:143 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:142 #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:83 -#, fuzzy msgid "Filter set with this name already exists" -msgstr "Источник данных %(name)s уже существует" +msgstr "Набор фильтров с этим именем уже существует" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx:348 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx:269 #, python-format msgid "Filter sets (%(filterSetCount)d)" -msgstr "" +msgstr "Наборы фильтров (%(filterSetCount)d)" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:791 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/TypeRow.tsx:31 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:774 msgid "Filter type" -msgstr "Значение фильтра" +msgstr "Тип фильтра" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:417 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:530 msgid "Filter value (case sensitive)" msgstr "Фильтровать значения (зависит от регистра)" -#: superset/connectors/sqla/models.py:1278 +#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:72 +#: superset-frontend/src/filters/components/Range/controlPanel.ts:55 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:90 +#: superset-frontend/src/filters/components/Time/controlPanel.ts:53 +#: superset-frontend/src/filters/components/TimeColumn/controlPanel.ts:33 +#: superset-frontend/src/filters/components/TimeGrain/controlPanel.ts:33 +msgid "Filter value is required" +msgstr "Требуется значение фильтра" + +#: superset/connectors/sqla/models.py:1522 superset/models/helpers.py:1739 msgid "Filter value list cannot be empty" -msgstr "" +msgstr "Список для фильтрации не может быть пуст" -#: superset-frontend/src/dashboard/components/SliceAdder.jsx:245 +#: superset-frontend/src/dashboard/components/SliceAdder.jsx:311 msgid "Filter your charts" -msgstr "Фильтровать графики" +msgstr "Поиск" -#: superset/connectors/druid/views.py:95 superset/connectors/sqla/views.py:147 +#: superset/connectors/sqla/views.py:160 msgid "Filterable" msgstr "Фильтруемый" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:82 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:459 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx:103 -#: superset-frontend/src/explore/controls.jsx:466 superset/viz.py:2105 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:139 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx:109 +#: superset-frontend/src/explore/controls.jsx:446 +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:35 +#: superset/viz.py:2139 msgid "Filters" msgstr "Фильтры" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:84 -#, fuzzy, python-format +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:88 +#, python-format msgid "Filters (%d)" -msgstr "Сбросить фильтры (%d)" +msgstr "Фильтры (%d)" #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:134 msgid "Filters by columns" -msgstr "Фильтруемые срезы" +msgstr "Фильтры по столбцам" #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:136 msgid "Filters by metrics" -msgstr "Список показателей" +msgstr "Фильтры по мерам" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:57 +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:27 msgid "Filters configuration" -msgstr "Изменение настроек таблицы" - -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx:467 -#, fuzzy -msgid "Filters configuration and scoping" -msgstr "Фильтруемые срезы" +msgstr "Конфигурация фильтров" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx:159 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FiltersOutOfScopeCollapsible/index.tsx:83 #, python-format msgid "Filters out of scope (%d)" -msgstr "" +msgstr "Фильтры вне рамок дашборда (%d)" -#: superset/connectors/sqla/views.py:348 +#: superset/connectors/sqla/views.py:343 msgid "" "Filters with the same group key will be ORed together within the group, " "while different filter groups will be ANDed together. Undefined group " @@ -5983,172 +7245,256 @@ msgid "" " 'Europe')." msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:794 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:808 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1193 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1015 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1063 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1701 msgid "Finish" -msgstr "" +msgstr "Завершить" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:124 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:189 +msgid "First" +msgstr "Первый" + +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:116 msgid "" "Fix the trend line to the full time range specified in case filtered " "results do not include the start or end dates" msgstr "" +"Фиксирует линию тренда в полном временном интервале, указанном в случае, " +"если отфильтрованные результаты не включают даты начала или окончания" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:123 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:115 msgid "Fix to selected Time Range" -msgstr "Особый временной интервал" +msgstr "Выбрать временной интервал" #: superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx:149 -#, fuzzy msgid "Fixed" -msgstr "Изменено" +msgstr "Фиксированный" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:175 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:129 msgid "Fixed Color" msgstr "Фиксированный цвет" -#: superset-frontend/src/explore/controls.jsx:206 +#: superset-frontend/src/explore/controls.jsx:205 msgid "Fixed color" msgstr "Фиксированный цвет" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:322 +msgid "Fixed point radius" +msgstr "Фиксированный радиус" + #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:26 -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:24 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:25 #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:27 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:32 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:33 msgid "Flow" -msgstr "" +msgstr "Поток" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:133 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:129 msgid "Font size" -msgstr "" +msgstr "Размер шрифта" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:134 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:130 msgid "Font size for axis labels, detail value and other text elements" msgstr "" +"Размер шрифта для меток осей, значений деталей и других текстовых " +"элементов" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:71 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:75 msgid "Font size for the biggest value in the list" -msgstr "" +msgstr "Размер шрифта для наибольшего значения в списке" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:60 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:64 msgid "Font size for the smallest value in the list" +msgstr "Размер шрифта для наименьшего значения в списке" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:173 +msgid "" +"For Bigquery, Presto and Postgres, shows a button to compute cost before " +"running a query." msgstr "" +"Для Bigquery, Presto и Postgres, показывать кнопку подсчета стоимости " +"запроса перед его выполнением." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 -#, fuzzy +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:183 +msgid "For further instructions, consult the" +msgstr "Для получения дальнейших инструкций обратитесь к" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:45 msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " -"query." -msgstr "Спрогнозировать время до выполнения запроса" +"For more information about objects are in context in the scope of this " +"function, refer to the" +msgstr "" -#: superset/connectors/sqla/views.py:342 +#: superset/connectors/sqla/views.py:337 msgid "" "For regular filters, these are the roles this filter will be applied to. " "For base filters, these are the roles that the filter DOES NOT apply to, " "e.g. Admin if admin should see all data." msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:111 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:112 msgid "Force" -msgstr "Источник" +msgstr "Силовой алгоритм" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:129 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:141 msgid "" "Force all tables and views to be created in this schema when clicking " "CTAS or CVAS in SQL Lab." msgstr "" +"Принудить создание новых таблиц через CTAS или CVAS в Лаборатории SQL в " +"этой схеме при нажатии соответствующих кнопок" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:270 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:157 +msgid "Force date format" +msgstr "Принудительный перевод к формату дата/время" + +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:398 msgid "Force refresh" -msgstr "Принудительное обновление" +msgstr "Обновить" -#: superset-frontend/src/components/DatabaseSelector/index.tsx:287 +#: superset-frontend/src/components/DatabaseSelector/index.tsx:313 msgid "Force refresh schema list" -msgstr "Принудительное обновление данных" +msgstr "Принудительно обновить список схем" -#: superset-frontend/src/components/TableSelector/index.tsx:317 +#: superset-frontend/src/components/TableSelector/index.tsx:340 msgid "Force refresh table list" -msgstr "Принудительное обновление данных" - -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/index.js:27 -msgid "Force-directed Graph" -msgstr "" +msgstr "Принудительно обновить список таблиц" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:56 -#, fuzzy msgid "Forecast periods" -msgstr "Период" +msgstr "Кол-во прогнозных периодов" + +#: superset-frontend/src/SqlLab/components/ColumnElement/index.tsx:64 +msgid "Foreign key" +msgstr "Внешний ключ" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:48 +msgid "Forest Green" +msgstr "Лесной зеленый" + +#: superset/explore/commands/get.py:87 superset/views/core.py:832 +msgid "Form data not found in cache, reverting to chart metadata." +msgstr "Данные формы не найдены в кэше, возвращение к метаданным графика." -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:37 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:42 +#: superset/explore/commands/get.py:95 superset/views/core.py:838 +msgid "Form data not found in cache, reverting to dataset metadata." +msgstr "Данные формы не найдены в кэше, возвращение к метаданным датасета." + +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:41 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:39 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:45 -#, fuzzy msgid "Formattable" -msgstr "Ключевые поля таблицы" +msgstr "Форматируемый" -#: superset-frontend/src/components/ReportModal/index.tsx:296 +#: superset-frontend/src/components/ReportModal/index.tsx:249 msgid "Formatted CSV attached in email" -msgstr "" +msgstr "Форматированный CSV, прикрепленный к письму" + +#: superset-frontend/src/explore/components/DataTableControl/index.tsx:142 +msgid "Formatted date" +msgstr "Форматированная дата" + +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.tsx:137 +msgid "Formatted value" +msgstr "Форматированное значение" + +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.tsx:133 +msgid "Formatting" +msgstr "Форматирование" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/vendor/superset/AnnotationTypes.js:33 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:442 +#: superset-frontend/src/modules/AnnotationTypes.js:32 +msgid "Formula" +msgstr "Формула" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:187 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:261 +msgid "Forward values" +msgstr "Будущие значения" #: superset-frontend/packages/superset-ui-core/src/query/extractQueryFields.ts:130 msgid "Found invalid orderby options" msgstr "" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:80 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:69 msgid "Fraction digits" -msgstr "" +msgstr "Десятичные знаки" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:53 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:54 msgid "Frequency" msgstr "Частота" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:304 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:305 msgid "Friction" -msgstr "Действия" +msgstr "Трение" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:310 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:311 msgid "Friction between nodes" -msgstr "" +msgstr "Сила трения между вершинами" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:61 msgid "Friday" msgstr "Пятница" -#: superset/utils/date_parser.py:264 superset/viz.py:370 +#: superset/utils/date_parser.py:267 superset/viz.py:390 msgid "From date cannot be larger than to date" -msgstr "Невозможно выбрать дату [from], которая позже текущего дня" +msgstr "Дата начала не может быть позже даты конца" -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:52 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:44 +msgid "Full name" +msgstr "Полное имя" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:54 msgid "Funnel Chart" -msgstr "Переместить график" +msgstr "Воронка" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:454 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:479 msgid "Further customize how to display each column" -msgstr "" +msgstr "Дальнейшая настройка отображения каждого столбца" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:168 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:167 msgid "Further customize how to display each metric" -msgstr "" +msgstr "Дальнейшая настройка отображения каждой меры" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:42 -#, fuzzy +#: superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx:38 +msgid "GROUP BY" +msgstr "GROUP BY" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:45 msgid "Gauge Chart" -msgstr "Сохранить график" +msgstr "Индикаторная диаграмма" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:78 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:76 msgid "General" -msgstr "" +msgstr "Основные свойства" + +#: superset-frontend/src/explore/components/EmbedCodeContent.jsx:82 +msgid "Generating link, please wait.." +msgstr "Генерация ссылки, пожалуйста, ждите..." -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:34 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:64 +msgid "Generic Chart" +msgstr "Общая диаграмма" + +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:37 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:37 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:38 msgid "Geo" -msgstr "" +msgstr "Карта" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:390 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/sharedDndControls.jsx:36 +msgid "GeoJson Column" +msgstr "Столбец GeoJson" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/controlPanel.ts:68 +msgid "GeoJson Settings" +msgstr "Настройки GeoJson" #: superset-frontend/src/explore/components/controls/SpatialControl.jsx:203 msgid "Geohash" @@ -6162,30 +7508,54 @@ msgstr "" msgid "Get the specify date for the holiday" msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:47 +#: superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx:713 +msgid "Go to the edit mode to configure the dashboard and add charts" +msgstr "Перейдите в режим редактирования для изменения дашборда и добавьте графики" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:45 +msgid "Gold" +msgstr "Золотой" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:46 msgid "Google Sheet Name and URL" -msgstr "" +msgstr "Имя или URL Google Таблицы" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1275 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:415 msgid "Grace period" -msgstr "Период" +msgstr "Перерыв между оповещением" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:37 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:39 msgid "Graph Chart" -msgstr "Сохранить график" +msgstr "Сетевой график" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:108 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:109 msgid "Graph layout" -msgstr "" +msgstr "Формат сетевого графика" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:262 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:263 msgid "Gravity" -msgstr "" +msgstr "Гравитация" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:299 -#: superset-frontend/src/filters/components/GroupBy/index.ts:28 +#: superset-frontend/src/explore/constants.ts:68 +#, fuzzy +msgid "Greater or equal (>=)" +msgstr ">= (больше или равно)" + +#: superset-frontend/src/explore/constants.ts:66 #, fuzzy +msgid "Greater than (>)" +msgstr "Агрегированное среднее" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts:61 +msgid "Grid" +msgstr "Сетка" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:281 +msgid "Grid Size" +msgstr "Размер сетки" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:320 +#: superset-frontend/src/filters/components/GroupBy/index.ts:28 msgid "Group By" msgstr "Группировать по" @@ -6193,72 +7563,107 @@ msgstr "Группировать по" msgid "Group By filter plugin" msgstr "" -#: superset/viz.py:895 +#: superset/viz.py:924 msgid "Group By' and 'Columns' can't overlap" -msgstr "Нельзя использовать один и тот же срез в двух полях" +msgstr "Измерения и Столбцы не могут повторяться" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:83 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/shared.ts:59 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:84 msgid "Group By, Metrics or Percentage Metrics must have a value" -msgstr "" +msgstr "Измерения, Меры или Процентные меры должны иметь значение" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:31 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:99 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:42 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:299 -#: superset-frontend/src/explore/controls.jsx:123 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:320 msgid "Group by" msgstr "Группировать по" -#: superset/connectors/druid/views.py:94 superset/connectors/sqla/views.py:146 +#: superset/connectors/sqla/views.py:159 msgid "Groupable" msgstr "Группируемый" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:238 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/index.ts:41 +msgid "Handlebars" +msgstr "Handlebars" + +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/handlebarTemplate.tsx:60 +msgid "Handlebars Template" +msgstr "Шаблон Handlebars" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:252 msgid "" "Hard value bounds applied for color coding. Is only relevant and applied " "when the normalization is applied against the whole heatmap." msgstr "" +#: superset/charts/filters.py:104 superset/dashboards/filters.py:242 +msgid "Has created by" +msgstr "Создан(а)" + #: superset-frontend/src/dashboard/components/gridComponents/new/NewHeader.jsx:31 msgid "Header" -msgstr "Строка заголовков" +msgstr "Заголовок" -#: superset/views/database/forms.py:152 superset/views/database/forms.py:305 +#: superset/views/database/forms.py:244 superset/views/database/forms.py:331 msgid "Header Row" -msgstr "Строка заголовков" +msgstr "Строка заголовка" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:38 -#: superset/viz.py:2212 +#: superset/viz.py:2246 msgid "Heatmap" -msgstr "Heatmap" +msgstr "Тепловая карта" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:104 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:105 msgid "Heatmap Options" -msgstr "" +msgstr "Настройки тепловой карты" -#: superset-frontend/src/explore/components/EmbedCodeButton.jsx:116 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/Grid.jsx:39 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts:75 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/Hex.jsx:38 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:239 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:245 msgid "Height" msgstr "Высота" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:730 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:240 +msgid "Height of the sparkline" +msgstr "Высота спарклайна" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:734 +msgid "Hide Line" +msgstr "Скрыть линию" + +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:411 +msgid "Hide chart description" +msgstr "Скрыть описание графика" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:780 msgid "Hide layer" msgstr "Скрыть слой" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:351 +#: superset-frontend/src/components/Form/LabeledErrorBoundInput.tsx:136 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:196 +msgid "Hide password." +msgstr "Скрыть пароль." + +#: superset-frontend/src/SqlLab/components/SqlEditorTabHeader/index.tsx:123 msgid "Hide tool bar" msgstr "Скрыть панель инструментов" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:81 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:735 +msgid "Hides the Line for the time series" +msgstr "" + +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:96 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:193 msgid "Hierarchy" -msgstr "Поиск" +msgstr "Иерархия" #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:37 -#: superset/viz.py:1711 +#: superset/viz.py:1740 msgid "Histogram" -msgstr "Histogram" +msgstr "Гистограмма" -#: superset/initialization/__init__.py:222 +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:345 +#: superset/initialization/__init__.py:229 msgid "Home" msgstr "Главная" @@ -6267,54 +7672,61 @@ msgstr "Главная" msgid "Horizon Chart" msgstr "Horizon Charts" -#: superset/viz.py:2273 +#: superset/viz.py:2307 +#, fuzzy msgid "Horizon Charts" msgstr "Horizon Charts" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:106 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:280 +msgid "Horizontal" +msgstr "Горизонтально" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/index.tsx:166 +msgid "Horizontal (Top)" +msgstr "Горизонтально (сверху)" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:95 msgid "Horizontal alignment" -msgstr "" +msgstr "Выравнивание по горизонтали" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:47 msgid "Host" -msgstr "" +msgstr "Хост" -#: superset/db_engine_specs/base.py:1390 +#: superset/db_engine_specs/base.py:1735 msgid "Hostname or IP address" -msgstr "" +msgstr "Имя хоста или IP адрес" -#: superset/db_engine_specs/base.py:94 -#, fuzzy +#: superset/db_engine_specs/base.py:108 msgid "Hour" -msgstr "час" +msgstr "Час" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:65 -#, fuzzy, python-format +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:64 +#, python-format msgid "Hours %s" -msgstr "час" +msgstr "Часов %s" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:779 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:947 msgid "Hours offset" -msgstr "Смещение часов" +msgstr "Смещение времени" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:94 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:93 msgid "How do you want to enter service account credentials?" msgstr "" -#: superset/views/alerts.py:190 -msgid "How long to keep the logs around for this alert" -msgstr "Как долго хранить логи для данного оповещения" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:139 +msgid "How many buckets should the data be grouped in." +msgstr "" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:59 msgid "How many periods into the future do we want to predict" -msgstr "" +msgstr "На сколько периодов в будущем предсказывать" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:129 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:342 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:225 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:477 -#: superset-frontend/src/explore/controlPanels/sections.tsx:240 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:145 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:337 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:219 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:489 +#: superset-frontend/src/explore/controlPanels/sections.tsx:215 msgid "" "How to display time shifts: as individual lines; as the difference " "between the main time series and each time shift; as the percentage " @@ -6324,30 +7736,28 @@ msgstr "" "разницу между основным временным рядом и каждым смещением; как процентное" " изменение; или как соотношение между рядами и смещениями." -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:51 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:85 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:51 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:85 msgid "Huge" -msgstr "" +msgstr "Огромный" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:78 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:79 msgid "ISO 3166-2 Codes" -msgstr "" +msgstr "Коды ISO 3166-2" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:237 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:304 msgid "ISO 8601" msgstr "ISO 8601" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:50 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:51 msgid "Id" -msgstr "идентификатор:" +msgstr "ID" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:85 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:86 msgid "Id of root node of the tree." -msgstr "" +msgstr "Id корневой вершины дерева." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:400 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:391 msgid "" "If Presto or Trino, all the queries in SQL Lab are going to be executed " "as the currently logged on user who must have permission to run them. If " @@ -6355,13 +7765,14 @@ msgid "" "service account, but impersonate the currently logged on user via " "hive.server2.proxy.user property." msgstr "" -"Если вы используете Presto, все запросы в SQL-Редакторе будут выполняться" -" от авторизованного пользователя, который должен иметь разрешение на их " -"выполнение. <br/> Если включен Hive, то запросы будут выполняться через " -"техническую учетную запись, но ассоциировать зарегистрированного " -"пользователя можно через свойство hive.server2.proxy.user." +"Если вы используете Presto или Trino, все запросы в Лаборатории SQL будут" +" выполняться от авторизованного пользователя, который должен иметь " +"разрешение на их выполнение. Если включены Hive и " +"hive.server2.enable.doAs, то запросы будут выполняться через техническую " +"учетную запись, но имперсонировать зарегистрированного пользователя можно" +" через свойство hive.server2.proxy.user." -#: superset/views/database/mixins.py:163 +#: superset/views/database/mixins.py:165 msgid "" "If Presto, all the queries in SQL Lab are going to be executed as the " "currently logged on user who must have permission to run them.<br/>If " @@ -6369,270 +7780,273 @@ msgid "" "service account, but impersonate the currently logged on user via " "hive.server2.proxy.user property." msgstr "" -"Если вы используете Presto, все запросы в SQL-Редакторе будут выполняться" -" от авторизованного пользователя, который должен иметь разрешение на их " -"выполнение. <br/> Если включен Hive, то запросы будут выполняться через " -"техническую учетную запись, но ассоциировать зарегистрированного " -"пользователя можно через свойство hive.server2.proxy.user." +"Если вы используете Presto, все запросы в Лаборатории SQL будут " +"выполняться от авторизованного пользователя, который должен иметь " +"разрешение на их выполнение. <br/> Если включены Hive и " +"hive.server2.enable.doAs, то запросы будут выполняться через техническую " +"учетную запись, но имперсонировать зарегистрированного пользователя можно" +" через свойство hive.server2.proxy.user." + +#: superset/views/database/forms.py:164 +msgid "If Table Already Exists" +msgstr "Если таблица уже существует" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1201 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1043 msgid "If a metric is specified, sorting will be done based on the metric value" -msgstr "" +msgstr "Если мера задана, сортировка будет произведена на основании значений меры" -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:121 -msgid "If activated you can use the " +#: superset/views/database/forms.py:238 +msgid "" +"If duplicate columns are not overridden, they will be presented as \"X.1," +" X.2 ...X.x\"" msgstr "" +"Если повторяющиеся столбцы не перезаписываются, они будут представлены в " +"формате \"X.0, X.1\"." -#: superset/views/database/mixins.py:180 +#: superset/views/database/mixins.py:177 msgid "If selected, please set the schemas allowed for csv upload in Extra." msgstr "" -"Если включено, выберите схему, в которую разрешено загружать CSV на " -"вкладке “Дополнительно”." +"Если установлено, выберите схемы, в которые разрешена загрузка CSV на " +"вкладке \"Дополнительно\"." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:420 -msgid "If selected, please set the schemas allowed for data upload in Extra." -msgstr "" -"Если установлено, выберите схемы, в которые разрешена загрузка на вкладке" -" “Дополнительно”." - -#: superset/views/database/forms.py:139 superset/views/database/forms.py:292 -#: superset/views/database/forms.py:420 +#: superset/views/database/forms.py:318 superset/views/database/forms.py:449 msgid "" "If table exists do one of the following: Fail (do nothing), Replace (drop" " and recreate table) or Append (insert data)." msgstr "" -"Если таблица уже существует, выполните одно из следующих действий: Fail " -"(ничего не делать), Replace (удалить и заново создать таблицу) или Append" -" (добавить данные)." +"Если таблица уже существует, выберите действие: Ошибка (ничего не " +"делать), Заменить (удалить и воссоздать таблицу) или Добавить (вставить " +"данные)." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:48 -msgid "" -"If you wish to specify a different target column than the original " -"column, it can be entered here" -msgstr "" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:422 +msgid "Ignore cache when generating screenshot" +msgstr "Игнорировать кэш при создании скриншота" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:83 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:87 +msgid "Ignore null locations" +msgstr "Игнорировать пустые локации" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:76 msgid "Ignore time" -msgstr "" +msgstr "Игнорировать время" -#: superset-frontend/src/components/ReportModal/index.tsx:293 +#: superset-frontend/src/components/ReportModal/index.tsx:246 msgid "Image (PNG) embedded in email" -msgstr "" +msgstr "Изображение (PNG), встроенное в email" -#: superset-frontend/src/utils/downloadAsImage.ts:63 +#: superset-frontend/src/utils/downloadAsImage.ts:55 msgid "Image download failed, please refresh and try again." -msgstr "" +msgstr "Ошибка скачивания изображения, пожалуйста, обновите и попробуйте заново." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:395 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:386 msgid "Impersonate logged in user (Presto, Trino, Drill, Hive, and GSheets)" -msgstr "Ассоциировать пользователя" +msgstr "" +"Имперсонировать пользователя (Presto, Trino, Drill, Hive, и Google " +"Таблицы)" -#: superset/views/database/mixins.py:200 +#: superset/views/database/mixins.py:197 msgid "Impersonate the logged on user" -msgstr "Ассоциировать пользователя" +msgstr "Имперсонировать пользователя" -#: superset-frontend/src/components/ImportModal/index.tsx:282 +#: superset-frontend/src/components/ImportModal/index.tsx:281 msgid "Import" msgstr "Импорт" -#: superset-frontend/src/components/ImportModal/index.tsx:286 +#: superset-frontend/src/components/ImportModal/index.tsx:285 #, python-format msgid "Import %s" -msgstr "Импорт %s" +msgstr "Импортировать %s" #: superset/templates/superset/import_dashboards.html:26 msgid "Import Dashboard(s)" -msgstr "Импорт дашборда(ов)" +msgstr "Импортировать дашборд(ы)" -#: superset/initialization/__init__.py:314 +#: superset/initialization/__init__.py:332 msgid "Import Dashboards" -msgstr "Импорт дашбордов" +msgstr "Импортировать дашборды" -#: superset/connectors/sqla/views.py:397 +#: superset/connectors/sqla/views.py:387 msgid "Import a table definition" -msgstr "Импортировать определение таблицы" +msgstr "" -#: superset/charts/commands/exceptions.py:151 +#: superset/charts/commands/exceptions.py:155 msgid "Import chart failed for an unknown reason" -msgstr "Импорт графика не удался по неизвестной причине" +msgstr "Не удалось импортировать график по неизвестной причине" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:621 -#, fuzzy +#: superset-frontend/src/pages/ChartList/index.tsx:772 msgid "Import charts" -msgstr "Переместить график" +msgstr "Импортировать графики" #: superset/dashboards/commands/exceptions.py:82 msgid "Import dashboard failed for an unknown reason" -msgstr "Импорт дашборда не удался по неизвестной причине" +msgstr "Не удалось импортировать дашборд по неизвестной причине" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:596 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:635 #: superset/templates/superset/import_dashboards.html:21 msgid "Import dashboards" -msgstr "Импорт дашбордов" +msgstr "Импортировать дашборды" -#: superset/databases/commands/exceptions.py:139 +#: superset/databases/commands/exceptions.py:171 msgid "Import database failed for an unknown reason" -msgstr "Импорт базы данных не удался по неизвестной причине" +msgstr "Не удалось импортировать базу данных по неизвестной причине" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:195 -#, fuzzy -msgid "Import databases" -msgstr "Редактировать Базу Данных" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1756 +msgid "Import database from file" +msgstr "Импортировать базу данных из файла" -#: superset/datasets/commands/exceptions.py:181 +#: superset/datasets/commands/exceptions.py:185 msgid "Import dataset failed for an unknown reason" -msgstr "Импорт датасета не удался по неизвестной причине" +msgstr "Не удалось импортировать датасет по неизвестной причине" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:517 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:642 msgid "Import datasets" -msgstr "Редактировать датасет" +msgstr "Импортировать датасеты" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:190 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:189 msgid "Import queries" -msgstr "Пустой запрос?" +msgstr "Импортировать запросы" #: superset/queries/saved_queries/commands/exceptions.py:36 -#, fuzzy msgid "Import saved query failed for an unknown reason." -msgstr "Импорт графика не удался по неизвестной причине" +msgstr "Не удалось импортировать сохраненный запрос по неизвестной причине" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:64 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:63 msgid "" "Important! Select this if the table is not already sorted by entity id, " "else there is no guarantee that all events for each entity are returned." msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:67 +#: superset-frontend/src/explore/constants.ts:71 +#, fuzzy +msgid "In" +msgstr "в" + +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:57 msgid "Include Series" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:70 +#: superset-frontend/src/components/ReportModal/index.tsx:289 +msgid "Include a description that will be sent with your report" +msgstr "Описание, которое будет отправлено вместе с вашим отчетом" + +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:60 msgid "Include series name as an axis" -msgstr "" +msgstr "Включить имена категорий в качестве оси" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:325 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/includeTime.ts:27 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:335 msgid "Include time" -msgstr "Время окончания" +msgstr "Включить время" -#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:231 +#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:232 #, python-format msgid "Incompatible Filters (%d)" msgstr "Несовместимые фильтры (%d)" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:121 -msgid "Incorrect Fields" -msgstr "" +#: superset-frontend/src/SqlLab/components/ColumnElement/index.tsx:65 +msgid "Index" +msgstr "Индекс" -#: superset/views/database/forms.py:162 superset/views/database/forms.py:315 +#: superset/views/database/forms.py:210 superset/views/database/forms.py:341 msgid "Index Column" -msgstr "Столбец индекса" +msgstr "Индесный столбец" -#: superset/views/database/forms.py:210 -msgid "Infer Datetime Format" -msgstr "Формат даты и времени" - -#: superset-frontend/src/components/Menu/MenuRight.tsx:166 -#: superset/templates/appbuilder/navbar_right.html:110 +#: superset-frontend/src/views/components/RightMenu.tsx:498 msgid "Info" -msgstr "Инфо" +msgstr "Личные данные" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:220 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:232 msgid "Inner Radius" -msgstr "" +msgstr "Внутренний радиус" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:226 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:238 msgid "Inner radius of donut hole" -msgstr "" - -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:314 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:216 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:177 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:158 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:174 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:232 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:235 +msgstr "Внутренний радиус отверстия для кольца" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:330 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:205 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:175 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:192 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:135 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:134 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:189 msgid "Input field supports custom rotation. e.g. 30 for 30°" -msgstr "" +msgstr "Поле для ввода поддерживает пользовательские значения, например 30 для 30°" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:90 +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:60 msgid "Instant filtering" msgstr "Мгновенная Фильтрация" -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:293 -msgid "Instructions to add a dataset are available in the Superset tutorial." -msgstr "" - -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:34 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:36 #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:41 #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:36 #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:38 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:39 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:36 msgid "Intensity" -msgstr "Элемент" +msgstr "Насыщенность" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:495 -#, fuzzy +#: superset/views/database/forms.py:190 +msgid "Interpret Datetime Format Automatically" +msgstr "Автоматически интерпретировать формат дата/время" + +#: superset/views/database/forms.py:191 +msgid "Interpret the datetime format automatically" +msgstr "Автоматически интерпретировать формат дата/время" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/vendor/superset/AnnotationTypes.js:42 +#: superset-frontend/src/modules/AnnotationTypes.js:41 +msgid "Interval" +msgstr "Интервал" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:543 msgid "Interval End column" -msgstr "Фильтруемые срезы" +msgstr "Столбец с концом интервала" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:286 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:282 msgid "Interval bounds" -msgstr "Фильтруемые срезы" +msgstr "Граница интервала" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:300 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:296 msgid "Interval colors" -msgstr "Цветовая схема" +msgstr "Цвета интервала" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:477 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:525 msgid "Interval start column" -msgstr "Фильтруемые срезы" +msgstr "Столбец с началом интервала" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:280 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:276 msgid "Intervals" -msgstr "Интервал обновления" +msgstr "Интервалы" -#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:109 +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:114 msgid "Invalid JSON" -msgstr "Недопустимый формат json" +msgstr "Недопустимый формат JSON" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:107 -msgid "Invalid Port Number" -msgstr "" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:113 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:117 -#, fuzzy -msgid "Invalid account information" -msgstr "Основная информация" +#: superset/advanced_data_type/api.py:100 +#, python-format +msgid "Invalid advanced data type: %(advanced_data_type)s" +msgstr "Невалидный расширенный тип данных: %(advanced_data_type)s" -#: superset/databases/schemas.py:170 superset/exceptions.py:182 +#: superset/databases/schemas.py:181 superset/exceptions.py:196 msgid "Invalid certificate" -msgstr "Недействительный сертификат" +msgstr "Неверный сертификат" -#: superset/views/core.py:1375 +#: superset/views/core.py:1410 msgid "" "Invalid connection string, a valid string usually follows:\n" "'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'" msgstr "" -"Недействительная строка подключения, правильная строка обычно следует " -"следующему шаблону:\n" -"‘драйвер://пользователь:пароль@хостБД/имяБД’" +"Недопустимая строка для подключения, валидная строка соответствует " +"шаблону: ДРАЙВЕР://ИМЯ-ПОЛЬЗОВАТЕЛЯ:ПАРОЛЬ@ХОСТ/ИМЯ-БАЗЫ-ДАННЫХ" -#: superset/databases/schemas.py:148 +#: superset/databases/schemas.py:159 msgid "" "Invalid connection string, a valid string usually follows: " -"driver://user:password@database-host/database-name" +"backend+driver://user:password@database-host/database-name" msgstr "" -"Недействительная строка подключения, правильная строка обычно следует " -"следующему шаблону: драйвер://пользователь:пароль@хостБД/имяБД" +"Недопустимая строка для подключения, валидная строка соответствует " +"шаблону: драйвер://имя-пользователя:пароль@хост/имя-базы-данных" #: superset/views/database/validators.py:40 msgid "" @@ -6641,157 +8055,195 @@ msgid "" "NAME'<p>Example:'postgresql://user:password@your-postgres-" "db/database'</p>" msgstr "" -"Недействительная строка подключения, правильная строка обычно следует " -"следующему шаблону: " -"драйвер://пользователь:пароль@хостБД/имяБД<p>Пример:’postgresql://user:password" -"@your-postgres-db/database'</p>" +"Недопустимая строка для подключения, валидная строка соответствует " +"шаблону:'ДРАЙВЕР://ИМЯ-ПОЛЬЗОВАТЕЛЯ:ПАРОЛЬ@ХОСТ/ИМЯ-БАЗЫ-ДАННЫХ'<p>Пример:'postgresql://user:password" +"@postgres-db/database'</p>" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:52 msgid "Invalid cron expression" -msgstr "" +msgstr "Недопустимое CRON выражение" -#: superset/utils/pandas_postprocessing.py:578 +#: superset/utils/pandas_postprocessing/cum.py:55 #, python-format msgid "Invalid cumulative operator: %(operator)s" msgstr "" -#: superset/connectors/sqla/views.py:168 superset/datasets/schemas.py:39 +#: superset/connectors/sqla/views.py:182 superset/datasets/schemas.py:44 msgid "Invalid date/timestamp format" -msgstr "Формат Даты / Времени" +msgstr "Недопустимый формат дата/время" -#: superset/viz.py:2123 +#: superset/viz.py:2157 msgid "Invalid filter configuration, please select a column" -msgstr "" +msgstr "Неверная конфигурация фильтра, пожалуйста, выберите столбец" -#: superset/connectors/sqla/models.py:1326 +#: superset/connectors/sqla/models.py:1596 superset/models/helpers.py:1805 #, python-format msgid "Invalid filter operation type: %(op)s" -msgstr "Недействительный тип операции фильтра: %(op)s" +msgstr "" -#: superset/utils/pandas_postprocessing.py:679 +#: superset/utils/pandas_postprocessing/geography.py:118 msgid "Invalid geodetic string" -msgstr "Недействительная строка geodetic" +msgstr "" -#: superset/utils/pandas_postprocessing.py:614 +#: superset/utils/pandas_postprocessing/geography.py:49 msgid "Invalid geohash string" -msgstr "Недействительная строка geohash" +msgstr "" + +#: superset-frontend/src/utils/getClientErrorObject.ts:65 +msgid "Invalid input" +msgstr "Недопустимые входные данные" #: superset-frontend/src/explore/components/controls/SpatialControl.jsx:82 msgid "Invalid lat/long configuration." msgstr "Неверная конфигурация широты и долготы." -#: superset/utils/pandas_postprocessing.py:637 +#: superset/utils/pandas_postprocessing/geography.py:76 msgid "Invalid longitude/latitude" -msgstr "Долгота и Широта [Конец]" +msgstr "Недопустимые долгота/широта" -#: superset/utils/core.py:1318 -#, fuzzy -msgid "Invalid metric object" -msgstr "Недействительный сертификат" +#: superset/utils/core.py:1363 +#, python-format +msgid "Invalid metric object: %(metric)s" +msgstr "" -#: superset/utils/pandas_postprocessing.py:184 +#: superset/utils/pandas_postprocessing/utils.py:170 #, python-format msgid "Invalid numpy function: %(operator)s" -msgstr "Недействительная функция numpy: %(operator)s" +msgstr "Недопустимая numpy функция: %(operator)s" -#: superset/utils/pandas_postprocessing.py:414 +#: superset/utils/pandas_postprocessing/rolling.py:90 #, python-format msgid "Invalid options for %(rolling_type)s: %(options)s" +msgstr "Недопустимые настройки для %(rolling_type)s: %(options)s" + +#: superset/key_value/utils.py:60 +msgid "Invalid permalink key" msgstr "" -#: superset/common/query_actions.py:192 +#: superset/common/query_actions.py:230 #, python-format msgid "Invalid result type: %(result_type)s" -msgstr "" +msgstr "Недопустимый тип ответа: %(result_type)s" -#: superset/utils/pandas_postprocessing.py:408 +#: superset/utils/pandas_postprocessing/rolling.py:84 #, python-format msgid "Invalid rolling_type: %(type)s" msgstr "" -#: superset/viz.py:2493 +#: superset/viz.py:2527 #, python-format msgid "Invalid spatial point encountered: %s" msgstr "" -#: superset-frontend/src/filters/components/Select/controlPanel.ts:124 +#: superset/dashboards/permalink/exceptions.py:23 +#: superset/explore/permalink/exceptions.py:23 +msgid "Invalid state." +msgstr "" + +#: superset/reports/commands/create.py:144 +#, python-format +msgid "Invalid tab ids: %s(tab_ids)" +msgstr "" + +#: superset-frontend/src/filters/components/Select/controlPanel.ts:123 msgid "Inverse selection" -msgstr "Инвертировать выбор" +msgstr "Выбрать противоположные значения" -#: superset/connectors/druid/views.py:347 -msgid "Is Hidden" -msgstr "Скрыто" +#: superset-frontend/src/components/Table/index.tsx:263 +msgid "Invert current page" +msgstr "" -#: superset/charts/filters.py:63 superset/dashboards/filters.py:168 -#, fuzzy +#: superset/charts/filters.py:65 superset/dashboards/filters.py:216 +#: superset/datasets/filters.py:39 msgid "Is certified" -msgstr "Изменено" +msgstr "Одобрено" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:285 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:355 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:363 msgid "Is dimension" -msgstr "Измерение" +msgstr "Является измерением" + +#: superset-frontend/src/explore/constants.ts:89 +#, fuzzy +msgid "Is false" +msgstr "Отключено" -#: superset/views/base_api.py:107 +#: superset/views/base_api.py:138 msgid "Is favorite" -msgstr "В Избранном" +msgstr "В избранном" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:287 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:358 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:366 msgid "Is filterable" -msgstr "Фильтрующийся" - -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:286 -#: superset/connectors/sqla/views.py:150 -msgid "Is temporal" -msgstr "Содержит дату /время" +msgstr "Фильтруемый" -#: superset-frontend/src/utils/getClientErrorObject.ts:112 +#: superset-frontend/src/explore/constants.ts:80 #, fuzzy +msgid "Is not null" +msgstr "Не пусто" + +#: superset-frontend/src/explore/constants.ts:83 +#, fuzzy +msgid "Is null" +msgstr "Не пусто" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:356 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:364 +#: superset/connectors/sqla/views.py:163 +msgid "Is temporal" +msgstr "Содержит дату/время" + +#: superset-frontend/src/explore/constants.ts:88 +#, fuzzy +msgid "Is true" +msgstr "поток" + +#: superset-frontend/src/utils/getClientErrorObject.ts:153 msgid "Issue 1000 - The dataset is too large to query." -msgstr "Проблема 1000 - Источник данных слишком велик для запроса." +msgstr "Ошибка 1000 - Источник данных слишком велик для запроса." -#: superset-frontend/src/utils/getClientErrorObject.ts:118 +#: superset-frontend/src/utils/getClientErrorObject.ts:157 msgid "Issue 1001 - The database is under an unusual load." -msgstr "Проблема 1001 - Необычная загрузка базы данных." - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 -#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 -#: superset-frontend/src/components/DatabaseSelector/index.tsx:183 -msgid "It seems you don't have access to any database" -msgstr "Кажется у Вас нет доступа к базе данных" +msgstr "Ошибка 1001 - Нетипичная загрузка базы данных." -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:221 -msgid "It’s not recommended to truncate y-axis in Bar chart." -msgstr "" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:230 +msgid "It’s not recommended to truncate axis in Bar chart." +msgstr "Не рекомендуется урезать интервал оси в столбчатой диаграмме" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:91 msgid "JAN" msgstr "ЯНВ" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:918 -#: superset/connectors/druid/views.py:191 superset/views/log/__init__.py:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/controlPanel.ts:56 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:351 +#: superset/views/log/__init__.py:33 msgid "JSON" msgstr "JSON" -#: superset/views/annotations.py:81 superset/views/dashboard/mixin.py:89 +#: superset/views/dashboard/mixin.py:89 msgid "JSON Metadata" -msgstr "Параметры JSON" +msgstr "JSON Метаданные" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:584 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:648 #: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:336 msgid "JSON metadata" msgstr "JSON метаданные" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:341 -#, fuzzy +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:314 +msgid "JSON metadata is invalid!" +msgstr "JSON метаданные не валидны!" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:351 msgid "" "JSON string containing additional connection configuration. This is used " "to provide connection information for systems like Hive, Presto and " "BigQuery which do not conform to the username:password syntax normally " "used by SQLAlchemy." msgstr "" -"Это используется для указания информации о соединении с такими системами " -"как Hive, Presto и BigQuery, которые не укладываются в шаблон " -"пользователь:пароль, который обычно используется в SQLAlchemy." +"JSON строка, содержащая дополнительную информацию о соединении. Это " +"используется для указания информации о соединении с такими системами как " +"Hive, Presto и BigQuery, которые не укладываются в шаблон " +"\"пользователь:пароль\", который обычно используется в SQLAlchemy." #: superset-frontend/src/components/CronPicker/CronPicker.tsx:97 msgid "JUL" @@ -6805,18 +8257,56 @@ msgstr "ИЮН" msgid "January" msgstr "Январь" -#: superset/views/database/forms.py:177 superset/views/database/forms.py:435 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:132 +msgid "Javascript data interceptor" +msgstr "Javascript редактор данных" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:154 +msgid "Javascript onClick href" +msgstr "Javascript onClick href" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:144 +msgid "Javascript tooltip generator" +msgstr "Javascript генератор всплывающих подсказок" + +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:78 +msgid "Jinja templating" +msgstr "Шаблонизацию Jinja." + +#: superset/views/database/forms.py:233 +msgid "Json list of the column names that should be read" +msgstr "Список столбцов в формате JSON из файла, которые будут использованы." + +#: superset/views/database/forms.py:464 msgid "" "Json list of the column names that should be read. If not None, only " "these columns will be read from the file." msgstr "" +"Список столбцов в формате JSON из файла, которые будут использованы. " +"Пример: [\"id\", \"name\", \"gender\", \"age\"]. Если в данном поле " +"указаны названия столбцов, из файла будут загружены только указанные " +"столбцы." -#: superset/views/database/forms.py:235 superset/views/database/forms.py:368 +#: superset/views/database/forms.py:203 +msgid "" +"Json list of the values that should be treated as null. Examples: [\"\"] " +"for empty strings, [\"None\", \"N/A\"], [\"nan\", \"null\"]. Warning: " +"Hive database supports only a single value" +msgstr "" +"Список JSON значений, которые следует рассматривать как нулевые. Примеры:" +" [\"\"] для пустых строк, [\"None\", \"N/A\"], [\"nan\", \"null\"]. " +"Предупреждение: База данных Hive поддерживает только одно значение." + +#: superset/views/database/forms.py:394 msgid "" "Json list of the values that should be treated as null. Examples: [\"\"]," " [\"None\", \"N/A\"], [\"nan\", \"null\"]. Warning: Hive database " "supports only single value. Use [\"\"] for empty string." msgstr "" +"Список JSON значений, которые следует рассматривать как нулевые. Примеры:" +" [\"\"], [\"None\", \"N/A\"], [\"nan\", \"null\"]. Предупреждение: База " +"данных Hive поддерживает только одно значение. Используйте [\"\"] для " +"пустой строки." #: superset-frontend/src/components/CronPicker/CronPicker.tsx:72 msgid "July" @@ -6826,453 +8316,584 @@ msgstr "Июль" msgid "June" msgstr "Июнь" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:29 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:30 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:25 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:47 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:37 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:26 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:29 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:31 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:48 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:39 msgid "KPI" -msgstr "" +msgstr "KPI" + +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:668 +msgid "Keep control settings?" +msgstr "Оставить прежние настройки?" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/CancelConfirmationAlert.tsx:56 msgid "Keep editing" msgstr "Продолжить редактирование" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:157 -msgid "Keys for table" -msgstr "Ключевые поля таблицы" +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:98 +msgid "Key" +msgstr "Ключ" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:145 +msgid "Kilometers" +msgstr "Километры" + +#: superset-frontend/src/SqlLab/components/QueryLimitSelect/index.tsx:101 +msgid "LIMIT" +msgstr "ОГРАНИЧЕНИЕ" -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:149 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:192 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:196 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1037 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1045 +#: superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx:80 +#: superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx:109 +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:169 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:245 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:249 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1192 #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:157 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:143 -#: superset/views/annotations.py:77 superset/views/sql_lab.py:68 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:195 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:201 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:157 +#: superset/views/sql_lab/views.py:81 msgid "Label" msgstr "Метка" #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:175 msgid "Label Line" -msgstr "" +msgstr "Линия метки" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:47 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:85 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:99 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:106 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:95 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:98 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:105 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:111 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:94 msgid "Label Type" -msgstr "Таблица Данных" +msgstr "Тип метки" + +#: superset/utils/pandas_postprocessing/rename.py:53 +msgid "Label already exists" +msgstr "Метка уже существует" -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:152 +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:172 msgid "Label for your query" msgstr "Метка для вашего запроса" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:123 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:122 msgid "Label position" -msgstr "последний раздел:" +msgstr "Положение метки" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:198 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:199 msgid "Label threshold" -msgstr "" +msgstr "Порог метки" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:144 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:156 msgid "Labelling" -msgstr "" +msgstr "Маркировка" -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:79 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:93 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:88 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:65 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:78 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:92 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:87 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:66 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:64 msgid "Labels" -msgstr "Метка" +msgstr "Метки" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:90 msgid "Labels for the marker lines" -msgstr "" +msgstr "Метки для линий маркера" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:70 msgid "Labels for the markers" -msgstr "" +msgstr "Метки для маркеров" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:50 msgid "Labels for the ranges" -msgstr "" +msgstr "Метки для диапазонов" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:47 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:47 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:81 #: superset-frontend/src/dashboard/util/headerStyleOptions.ts:35 -#, fuzzy msgid "Large" -msgstr "Поделиться" +msgstr "Большой" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:190 #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:31 -#, fuzzy msgid "Last" -msgstr "Условие" +msgstr "Последний" -#: superset/connectors/sqla/views.py:492 superset/views/database/mixins.py:193 +#: superset/connectors/sqla/views.py:482 superset/views/database/mixins.py:190 msgid "Last Changed" -msgstr "Последнее изменение" +msgstr "Дата изменения" #: superset/views/chart/mixin.py:82 msgid "Last Modified" -msgstr "Изменено" +msgstr "Дата изменения" #: superset-frontend/src/components/LastUpdated/index.tsx:74 #, python-format msgid "Last Updated %s" -msgstr "" +msgstr "Дата изменения %s" + +#: superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.tsx:182 +#, python-format +msgid "Last Updated %s by %s" +msgstr "Изменено %s пользователем %s" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:149 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx:86 #, python-format msgid "Last available value seen on %s" -msgstr "" +msgstr "Последнее доступное значение: %s" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:180 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:317 +#: superset-frontend/src/components/MetadataBar/ContentConfig.tsx:80 +#: superset-frontend/src/pages/ChartList/index.tsx:436 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:177 #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:158 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:307 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:377 msgid "Last modified" -msgstr "Изменено" +msgstr "Последнее изменение" #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:151 #, python-format msgid "Last modified by %s" msgstr "Автор изменений %s" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:228 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:268 msgid "Last run" msgstr "Последнее изменение" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:63 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:73 +#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:178 msgid "Latitude" -msgstr "" +msgstr "Широта" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:294 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:299 msgid "Latitude of default viewport" -msgstr "" - -#: superset/views/annotations.py:76 -msgid "Layer" -msgstr "Слой" +msgstr "Широта для области просмотра" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:717 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:767 msgid "Layer configuration" -msgstr "Конфигурация слоя" +msgstr "Настройки слоя" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:101 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:110 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:102 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:111 msgid "Layout" -msgstr "" +msgstr "Оформление" + +#: superset-frontend/src/dashboard/components/BuilderComponentPane/index.tsx:81 +msgid "Layout elements" +msgstr "Оформление" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:114 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:115 msgid "Layout type of graph" msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:123 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:246 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:124 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:247 msgid "Layout type of tree" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:81 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:80 msgid "" "Leaf nodes that represent fewer than this number of events will be " "initially hidden in the visualization" msgstr "" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:567 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:541 -#, fuzzy +#: superset-frontend/src/pages/ChartList/index.tsx:708 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:567 msgid "Least recently modified" -msgstr "Изменено" +msgstr "Измененные давно" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:111 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:306 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:28 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:100 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:85 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:371 msgid "Left" -msgstr "оповещение" +msgstr "Слева" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:72 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:166 -#, fuzzy msgid "Left Axis Format" -msgstr "Формат Оси Y" +msgstr "Формат левой оси" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:68 -#, fuzzy msgid "Left Axis Metric" -msgstr "Показатель для правой оси" +msgstr "Мера левой оси" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:97 -#, fuzzy, python-format msgid "Left Axis chart(s)" -msgstr "Выберите схему (%s)" +msgstr "График(и) по левой оси" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:187 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:77 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:201 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:76 msgid "Left Margin" -msgstr "" +msgstr "Левый отступ" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:199 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:81 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:213 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:88 msgid "Left margin, in pixels, allowing for more room for axis labels" -msgstr "" +msgstr "Левый отступ (в пикселях), дает больше пространства меткам оси" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:137 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:138 msgid "Left to Right" -msgstr "" +msgstr "Слева направо" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:147 -#, fuzzy +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:144 msgid "Left value" -msgstr "Значение фильтра" +msgstr "Левое значение" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:38 -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:30 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:32 #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:42 #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 #: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:33 #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:37 #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:30 -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:31 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:31 +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:34 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:30 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:33 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:34 #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:40 #: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:43 #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:39 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:43 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:47 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:35 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:31 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:32 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:44 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:31 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:37 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:34 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:50 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:33 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:35 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:29 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:32 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:42 +#: superset-frontend/src/visualizations/TimeTable/index.ts:35 msgid "Legacy" -msgstr "" +msgstr "Устарел" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:154 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:275 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:129 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:149 -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:95 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:289 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:115 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:156 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:97 msgid "Legend" -msgstr "Изменения" +msgstr "Легенда" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:68 -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:88 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:162 +msgid "Legend Format" +msgstr "Формат легенды" + +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:90 +msgid "Legend Orientation" +msgstr "Ориентация легенды" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:176 +msgid "Legend Position" +msgstr "Расположение легенды" + +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:70 msgid "Legend type" +msgstr "Тип легенды" + +#: superset-frontend/src/explore/constants.ts:63 +#, fuzzy +msgid "Less or equal (<=)" +msgstr "<= (меньше или равно)" + +#: superset-frontend/src/explore/constants.ts:61 +msgid "Less than (<)" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:98 +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:90 msgid "Lift percent precision" msgstr "" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:230 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:376 +msgid "Light" +msgstr "Светлый" + #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:30 msgid "Light mode" +msgstr "Светлый режим" + +#: superset-frontend/src/explore/constants.ts:73 +msgid "Like" msgstr "" -#: superset-frontend/src/explore/components/RowCountLabel.jsx:45 +#: superset-frontend/src/explore/constants.ts:75 +#, fuzzy +msgid "Like (case insensitive)" +msgstr "Фильтровать значения (зависит от регистра)" + +#: superset-frontend/src/explore/components/RowCountLabel/index.tsx:49 msgid "Limit reached" msgstr "Достигнут предел" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:134 +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:97 msgid "Limit selector values" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:44 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:98 +msgid "Limit type" +msgstr "Тип ограничения" + +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:48 msgid "" "Limiting rows may result in incomplete data and misleading charts. " "Consider filtering or grouping source/target names instead." msgstr "" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:335 -#: superset-frontend/src/explore/controls.jsx:364 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:136 +msgid "Limits the number of cells that get retrieved." +msgstr "Ограничивает количество извлекаемых ячеек" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:251 +#: superset-frontend/src/explore/controls.jsx:344 msgid "Limits the number of rows that get displayed." -msgstr "" +msgstr "Ограничивает количество отображаемых строк" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:345 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:359 -#: superset-frontend/src/explore/controls.jsx:374 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:274 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:289 +#: superset-frontend/src/explore/controls.jsx:354 msgid "" "Limits the number of series that get displayed. A joined subquery (or an " "extra phase where subqueries are not supported) is applied to limit the " "number of series that get fetched and rendered. This feature is useful " "when grouping by high cardinality column(s) though does increase the " "query complexity and cost." -msgstr "Ограничивает количество отображаемых временных рядов." +msgstr "" +"Ограничивает количество отображаемых категорий. Эта опция полезна для " +"столбцов с большим количеством уникальных значений, т.к. уменьшает " +"сложность и стоимость запроса." -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:38 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:48 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:37 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:82 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:76 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:76 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:73 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:39 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:40 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:141 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:75 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:79 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:74 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:68 msgid "Line" -msgstr "Мои" +msgstr "Линейный" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:38 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:76 #: superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts:26 -#, fuzzy msgid "Line Chart" -msgstr "Свернуть график" +msgstr "Линейный график" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:38 +msgid "Line Chart (legacy)" +msgstr "Линейный график (устарело)" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:113 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:120 msgid "Line Style" +msgstr "Тип линии" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:62 +msgid "" +"Line chart is used to visualize measurements taken over a given category." +" Line chart is a type of chart which displays information as a series of " +"data points connected by straight line segments. It is a basic type of " +"chart common in many fields." msgstr "" +"Линейная диаграмма используется для визуализации показателей, полученных " +"в рамках одной категории. Линейная диаграмма - это тип диаграммы, который" +" отображает информацию в виде ряда точек данных, соединенных прямыми " +"отрезками. Это базовый тип диаграммы, распространенный во многих " +"областях." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:124 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:131 msgid "Line interpolation as defined by d3.js" -msgstr "" +msgstr "Линейная интерполяция, определенная в d3.js" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:667 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:210 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:715 msgid "Line width" msgstr "Толщина линии" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:190 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:137 msgid "Linear Color Scheme" -msgstr "Цветовая схема" +msgstr "Линейная цветовая схема" -#: superset-frontend/src/explore/controls.jsx:222 +#: superset-frontend/src/explore/controls.jsx:221 msgid "Linear color scheme" -msgstr "Цветовая схема" +msgstr "Линейная цветовая схема" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:186 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:260 +msgid "Linear interpolation" +msgstr "Линейная интерполяция" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:196 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/sharedDndControls.jsx:27 +#, fuzzy +msgid "Lines column" +msgstr "Столбец с временем" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:345 +#, fuzzy +msgid "Lines encoding" +msgstr "Направление сортировки" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:216 -#: superset-frontend/src/views/CRUD/hooks.ts:601 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:217 +#: superset-frontend/src/views/CRUD/hooks.ts:629 msgid "Link Copied!" -msgstr "Ссылка скопирована!" +msgstr "Ссылка скопирована" -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:58 -msgid "Link Length" +#: superset/views/sql_lab/views.py:52 +msgid "List Saved Query" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:70 -msgid "Link length in the force layout" -msgstr "" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:181 +msgid "List Unique Values" +msgstr "Список уникальных значений" -#: superset/views/alerts.py:75 -msgid "List Observations" -msgstr "Список показателей" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:123 +msgid "List of extra columns made available in Javascript functions" +msgstr "Список дополнительных столбцов, доступных в функциях Javascript" -#: superset/views/sql_lab.py:39 -msgid "List Saved Query" -msgstr "Список сохраненных запросов" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:151 +msgid "List of n+1 values for bucketing metric into n buckets." +msgstr "" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:81 msgid "List of values to mark with lines" msgstr "" +"Список числовых значений для отображения в виде линий на графике. " +"Например, 10,20,30" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:61 msgid "List of values to mark with triangles" msgstr "" +"Список числовых значений для отображения в виде треугольников на графике." +" Например, 10,20,30" + +#: superset-frontend/src/components/DatabaseSelector/index.tsx:251 +#, fuzzy +msgid "List refreshed" +msgstr "Данные обновлены" -#: superset-frontend/src/dashboard/components/CssEditor/index.jsx:108 +#: superset-frontend/src/components/TableSelector/index.tsx:190 +msgid "List updated" +msgstr "Список обновлен" + +#: superset-frontend/src/dashboard/components/CssEditor/index.jsx:109 msgid "Live CSS editor" msgstr "Редактор CSS" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:199 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:211 msgid "Live render" -msgstr "" +msgstr "Мгновенная отрисовка" -#: superset-frontend/src/dashboard/components/CssEditor/index.jsx:93 +#: superset-frontend/src/dashboard/components/CssEditor/index.jsx:94 msgid "Load a CSS template" -msgstr "Загрузить шаблон стилей (CSS)" +msgstr "Загрузить CSS шаблон" #: superset-frontend/src/components/CachedLabel/TooltipContent.tsx:30 msgid "Loaded data cached" -msgstr "Данные были загружены в кэш" +msgstr "Данные загружены в кэш" #: superset-frontend/src/components/CachedLabel/TooltipContent.tsx:34 msgid "Loaded from cache" -msgstr "Загружается из кэша" - -#: superset-frontend/src/components/Select/Select.tsx:603 -#: superset-frontend/src/components/Select/Select.tsx:714 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:110 +msgstr "Загружено из кэша" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.tsx:177 +msgid "Loading" +msgstr "Загрузка" + +#: superset-frontend/plugins/plugin-chart-handlebars/src/components/Handlebars/HandlebarsViewer.tsx:74 +#: superset-frontend/src/components/Select/AsyncSelect.tsx:495 +#: superset-frontend/src/components/Select/Select.tsx:452 +#: superset-frontend/src/components/Select/utils.tsx:152 +#: superset-frontend/src/dashboard/components/gridComponents/DynamicComponent.tsx:165 +#: superset-frontend/src/explore/components/RowCountLabel/index.tsx:40 msgid "Loading..." -msgstr "" +msgstr "Загрузка..." -#: superset/views/alerts.py:180 -msgid "Log Retentions (days)" -msgstr "Время жизни журналов (в днях)" - -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:204 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:197 msgid "Log Scale" -msgstr "" +msgstr "Логарифмическая шкала" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1238 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1243 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1244 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:411 msgid "Log retention" -msgstr "Время жизни журнала" +msgstr "Хранение журнала" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:383 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:199 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:202 +msgid "Logarithmic axis" +msgstr "Логарифмическая ось" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:399 msgid "Logarithmic scale on primary y-axis" -msgstr "" +msgstr "Логарифмическая шкала для главной оси Y" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:416 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:432 msgid "Logarithmic scale on secondary y-axis" -msgstr "" - -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:380 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:404 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:413 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:231 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:234 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:194 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:197 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:174 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:177 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:191 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:194 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:247 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:250 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:250 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:253 +msgstr "Логарифмическая шкала для вторичной оси Y" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:396 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:420 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:429 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:220 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:223 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:207 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:210 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:151 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:154 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:151 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:154 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:204 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:207 msgid "Logarithmic y-axis" -msgstr "" +msgstr "Логарифмическая ось Y" -#: superset-frontend/src/components/Menu/MenuRight.tsx:233 -#: superset/templates/appbuilder/navbar_right.html:126 +#: superset-frontend/src/views/components/RightMenu.tsx:578 msgid "Login" msgstr "Вход в систему" -#: superset-frontend/src/components/Menu/MenuRight.tsx:170 -#: superset/templates/appbuilder/navbar_right.html:111 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:155 +msgid "Login with" +msgstr "Войти при помощи" + +#: superset-frontend/src/views/components/RightMenu.tsx:502 msgid "Logout" msgstr "Выход из системы" #: superset/views/log/__init__.py:21 msgid "Logs" -msgstr "Журналы" +msgstr "Записи" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:674 +msgid "Long dashed" +msgstr "Длинный штрих" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:53 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:63 +#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:174 msgid "Longitude" -msgstr "" +msgstr "Долгота" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:307 +msgid "Longitude & Latitude" +msgstr "Долгота и Широта" #: superset-frontend/src/explore/components/controls/SpatialControl.jsx:168 msgid "Longitude & Latitude columns" msgstr "Долгота и Широта" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:280 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/Grid.jsx:34 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/Scatter.jsx:40 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/Screengrid.jsx:44 +msgid "Longitude and Latitude" +msgstr "Долгота и Широта" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:285 msgid "Longitude of default viewport" -msgstr "" +msgstr "Долгота для области просмотра" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:93 msgid "MAR" @@ -7286,62 +8907,88 @@ msgstr "МАЙ" msgid "MON" msgstr "ПН" -#: superset/connectors/sqla/views.py:501 +#: superset/connectors/sqla/views.py:491 msgid "Main Datetime Column" -msgstr "Основной столбец с датой" +msgstr "Основной столбец с временем" + +#: superset-frontend/src/components/Chart/ChartRenderer.jsx:282 +msgid "" +"Make sure that the controls are configured properly and the datasource " +"contains data for the selected time range" +msgstr "" +"Убедитесь, что настройки графика верно сконфигурированы и источник данных" +" содержит данные для выбранного временного интервала." -#: superset/views/core.py:1738 +#: superset/views/core.py:1703 msgid "" "Malformed request. slice_id or table_name and db_name arguments are " "expected" -msgstr "Неправильный запрос. Ожидаются аргументы slice_id или table_name и db_name" - -#: superset/initialization/__init__.py:232 -#: superset/initialization/__init__.py:256 -#: superset/initialization/__init__.py:268 -#: superset/initialization/__init__.py:318 -#: superset/initialization/__init__.py:446 -#: superset/initialization/__init__.py:455 -#: superset/initialization/__init__.py:470 -#: superset/initialization/__init__.py:482 +msgstr "Некорректный запрос. Ожидаются аргументы slice_id или table_name и db_name" + +#: superset/initialization/__init__.py:273 +#: superset/initialization/__init__.py:285 +#: superset/initialization/__init__.py:336 +#: superset/initialization/__init__.py:392 +#: superset/initialization/__init__.py:405 msgid "Manage" msgstr "Управление" -#: superset/views/schedules.py:276 -msgid "Manage Email Reports for Charts" -msgstr "Управление рассылкой email для графиков" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:357 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:368 +msgid "Manage email report" +msgstr "Управление рассылкой по почте" -#: superset/views/schedules.py:198 -msgid "Manage Email Reports for Dashboards" -msgstr "Управление рассылками для дашбордов" +#: superset-frontend/src/components/EmptyState/index.tsx:236 +msgid "Manage your databases" +msgstr "Управляйте своими базами данных" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:726 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:763 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:776 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:814 msgid "Mandatory" -msgstr "" +msgstr "Обязательно" -#: superset/views/database/forms.py:171 superset/views/database/forms.py:324 +#: superset/views/database/forms.py:350 msgid "Mangle Duplicate Columns" -msgstr "Дубликаты" +msgstr "Управление повторяющимися столбцами" + +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:297 +msgid "Manually set min/max values for the y-axis." +msgstr "Вручную задать мин./макс. значения для оси Y" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:25 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:27 #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:26 #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:27 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/controlPanel.js:27 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:78 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/controlPanel.ts:64 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/controlPanel.ts:67 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:98 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:63 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:25 msgid "Map" -msgstr "Treemap" +msgstr "Карта" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:212 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:224 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:370 msgid "Map Style" -msgstr "Тип разметки" +msgstr "Стиль карты" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:33 -#, fuzzy msgid "MapBox" msgstr "Mapbox" -#: superset/viz.py:2285 +#: superset/viz.py:2319 msgid "Mapbox" msgstr "Mapbox" @@ -7349,391 +8996,446 @@ msgstr "Mapbox" msgid "March" msgstr "Март" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:46 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:48 msgid "Margin" -msgstr "Источник" - -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:211 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:149 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:110 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:90 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:107 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:165 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:168 +msgstr "Отступ" + +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:346 +msgid "Mark a column as temporal in \"Edit datasource\" modal" +msgstr "Присвойте столбцу формат даты/времени в настройках датасета" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:213 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:138 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:125 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:67 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:67 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:122 msgid "Marker" -msgstr "" +msgstr "Маркер" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:163 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:124 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:104 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:121 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:179 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:182 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:152 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:139 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:136 msgid "Marker Size" -msgstr "" +msgstr "Размер маркера" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:68 -#, fuzzy, python-format msgid "Marker labels" -msgstr "[Оповещение] %(label)s" +msgstr "Метки маркера" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:88 msgid "Marker line labels" -msgstr "" +msgstr "Метки линий маркера" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:79 msgid "Marker lines" -msgstr "" +msgstr "Линии маркеров" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:225 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:227 msgid "Marker size" -msgstr "" +msgstr "Размер маркера" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:59 -#, fuzzy msgid "Markers" -msgstr "оповещения" +msgstr "Маркеры" #: superset-frontend/src/explore/controlPanels/Separator.js:32 msgid "Markup type" msgstr "Тип разметки" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:100 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:96 #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:48 -#: superset-frontend/src/explore/components/controls/BoundsControl.jsx:118 +#: superset-frontend/src/explore/components/controls/BoundsControl.tsx:96 msgid "Max" msgstr "Максимум" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:94 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:59 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:96 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:60 msgid "Max Bubble Size" -msgstr "Размер маркера" +msgstr "Максимальный размер пузыря" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:129 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:128 msgid "Max Events" -msgstr "" - -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:257 -msgid "Maximize chart" -msgstr "Развернуть график" +msgstr "Лимит событий" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1266 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:188 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1108 msgid "Maximum" -msgstr "" +msgstr "Максимум" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:68 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:72 msgid "Maximum Font Size" -msgstr "" +msgstr "Максимальный размер шрифта" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:116 +msgid "Maximum Radius" +msgstr "Максимальный радиус" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:101 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:97 msgid "Maximum value on the gauge axis" +msgstr "Максимальное значение индикатора" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:121 +msgid "" +"Maxium radius size of the circle, in pixels. As the zoom level changes, " +"this insures that the circle respects this maximum radius." msgstr "" +"Максимальный размер радиуса окружности (в пикселях). При изменении уровня" +" масштабирования это гарантирует, что окружность соответствует этому " +"максимальному радиусу" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:70 msgid "May" msgstr "Май" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:93 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:86 msgid "Mean of values over specified period" -msgstr "" +msgstr "Среднее значений за указанный период" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:230 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:190 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:264 +msgid "Mean values" +msgstr "Средние значения" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:184 +msgid "Median" +msgstr "Медиана" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:231 msgid "" "Median edge width, the thickest edge will be 4 times thicker than the " "thinnest." msgstr "" +"Медианная толщина ребра, самое толстое ребро будет в 4 раза толще самой " +"тонкой." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:217 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:218 msgid "" "Median node size, the largest node will be 4 times larger than the " "smallest" msgstr "" +"Медианный размер вершины, самая большая вершина будет в 4 раза больше " +"самой маленькой." + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:189 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:263 +msgid "Median values" +msgstr "Медианные значения" #: superset-frontend/src/dashboard/util/headerStyleOptions.ts:30 msgid "Medium" -msgstr "" +msgstr "Средний" -#: superset-frontend/src/components/ReportModal/index.tsx:275 -#, fuzzy -msgid "Message Content" -msgstr "Содержимое сообщения" +#: superset-frontend/src/components/PageHeaderWithActions/index.tsx:160 +msgid "Menu actions trigger" +msgstr "" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1292 +#: superset-frontend/src/components/ReportModal/index.tsx:231 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:416 msgid "Message content" msgstr "Содержимое сообщения" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:105 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:104 msgid "Metadata" -msgstr "JSON метаданные" - -#: superset/connectors/druid/views.py:240 -msgid "Metadata Last Refreshed" -msgstr "Метаданные обновлены" +msgstr "Метаданные" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:437 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:442 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:450 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:454 msgid "Metadata Parameters" -msgstr "Параметры шаблона" +msgstr "Параметры метаданных" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:617 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:779 msgid "Metadata has been synced" msgstr "Метаданные синхронизированы" -#: superset/connectors/sqla/views.py:602 -#, python-format -msgid "Metadata refreshed for the following table(s): %(tables)s" -msgstr "Метаданные обновлены для следующих таблиц: %(tables)s" - -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:378 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:261 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:506 -#: superset-frontend/src/explore/controlPanels/sections.tsx:268 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:370 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:252 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:524 +#: superset-frontend/src/explore/controlPanels/sections.tsx:248 msgid "Method" msgstr "Метод" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:113 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:114 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:151 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:152 -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:84 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:97 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1036 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:175 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:176 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/Calendar.js:88 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:85 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:119 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:98 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1191 #: superset-frontend/src/explore/controls.jsx:167 #: superset-frontend/src/explore/controls.jsx:168 -#: superset/connectors/druid/views.py:187 superset/connectors/sqla/views.py:255 +#: superset-frontend/src/visualizations/TimeTable/TimeTable.jsx:122 +#: superset/connectors/sqla/views.py:251 msgid "Metric" -msgstr "Показатель" +msgstr "Мера" -#: superset/connectors/sqla/models.py:1079 -#: superset/connectors/sqla/models.py:1509 +#: superset/connectors/sqla/models.py:1246 +#: superset/connectors/sqla/models.py:1801 superset/models/helpers.py:1177 +#: superset/models/helpers.py:1433 #, python-format msgid "Metric '%(metric)s' does not exist" -msgstr "Показатель ‘%(metric)s’ не существует" +msgstr "Мера '%(metric)s' не существует" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:38 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:39 msgid "Metric ascending" -msgstr "Направление сортировки" +msgstr "Мера по возрастанию" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:148 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:407 -#: superset-frontend/src/explore/controls.jsx:422 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:214 +#: superset-frontend/src/explore/controls.jsx:402 msgid "Metric assigned to the [X] axis" msgstr "Показатель, отраженный на оси X" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:154 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:415 -#: superset-frontend/src/explore/controls.jsx:430 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:221 +#: superset-frontend/src/explore/controls.jsx:410 msgid "Metric assigned to the [Y] axis" msgstr "Показатель, отраженный на оси Y" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:103 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:96 msgid "Metric change in value from `since` to `until`" -msgstr "" +msgstr "Изменение меры с `до` до `после`" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:39 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:40 msgid "Metric descending" -msgstr "Сортировать" +msgstr "Мера по убыванию" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:117 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:110 msgid "Metric factor change from `since` to `until`" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:119 -#, fuzzy -msgid "Metric for Color" -msgstr "Показатель, используемый для расчета цвета" - -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:98 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:99 msgid "Metric for node values" -msgstr "" +msgstr "Мера для значений вершин" + +#: superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx:106 +msgid "Metric name" +msgstr "Имя меры" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:658 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:820 #, python-format msgid "Metric name [%s] is duplicated" -msgstr "Дубль имения показателя [%s]" +msgstr "Дубль имени меры [%s]" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:110 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:103 msgid "Metric percent change in value from `since` to `until`" -msgstr "" - -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:120 -msgid "Metric that defines the color of the country" -msgstr "" +msgstr "Процентное изменение меры с `до` до `после`" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:124 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:140 msgid "Metric that defines the size of the bubble" -msgstr "" +msgstr "Показатель, определяющий размер пузяря" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:85 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:86 msgid "Metric to display bottom title" -msgstr "Выберите показатель для отображения" +msgstr "Мера для отображения нижнего заголовка" #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:185 msgid "Metric to sort the results by" msgstr "Показатель, по которому сортировать результаты" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:142 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:421 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts:78 +msgid "Metric used as a weight for the grid's coloring" +msgstr "Мера, используемая как вес для раскрашивания сетки" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:207 msgid "Metric used to calculate bubble size" +msgstr "Мера, используемая для расчета размера пузыря" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts:76 +msgid "Metric used to control height" +msgstr "Мера, используемая для регулирования высоты" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:146 +msgid "" +"Metric used to define how the top series are sorted if a series or cell " +"limit is present. If undefined reverts to the first metric (where " +"appropriate)." msgstr "" +"Мера, используемая для определения того, как сортируются верхние " +"категории, если присутствует ограничение по категории или ячейке. Если не" +" определено, возвращается к первой мере (где это уместно)." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:127 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:371 -#: superset-frontend/src/explore/controls.jsx:387 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:192 +#: superset-frontend/src/explore/controls.jsx:367 msgid "" "Metric used to define how the top series are sorted if a series or row " "limit is present. If undefined reverts to the first metric (where " "appropriate)." msgstr "" +"Мера, используемая для определения того, как сортируются верхние " +"категории, если присутствует ограничение по категории или строке. Если не" +" определено, возвращается к первой мере (где это уместно)." -#: superset/connectors/druid/models.py:1072 -msgid "Metric(s) {} must be aggregations." -msgstr "Показатель(и) {} должны быть агрегированы." +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:55 +msgid "" +"Metric used to order the limit if a series limit is present. If undefined" +" reverts to the first metric (where appropriate)." +msgstr "" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:99 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:137 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1196 -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:301 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:161 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1356 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:394 #: superset-frontend/src/explore/controls.jsx:152 -#: superset/connectors/druid/views.py:159 superset/connectors/sqla/views.py:212 +#: superset/connectors/sqla/views.py:208 msgid "Metrics" -msgstr "Показатели" +msgstr "Меры" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:148 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/metrics.tsx:34 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:126 msgid "" "Metrics for which percentage of total are to be displayed. Calculated " "from only data within the row limit." msgstr "" +"Меры, для которых должен отображаться процент от общего числа. " +"Вычисляется только из данных в пределах ограничения по строкам." -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:93 -msgid "Midnight" -msgstr "" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:74 +msgid "Middle" +msgstr "Середина" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:88 -#: superset-frontend/src/explore/components/controls/BoundsControl.jsx:112 +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:90 +msgid "Midnight" +msgstr "Полночь" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:144 +msgid "Miles" +msgstr "Мили" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:85 +#: superset-frontend/src/explore/components/controls/BoundsControl.tsx:88 msgid "Min" msgstr "Минимум" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:290 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:173 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:193 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:424 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:283 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:165 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:434 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:214 msgid "Min Periods" -msgstr "HIde Periods" +msgstr "Минимальный период" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:90 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:79 msgid "Min Width" -msgstr "Толщина линии" +msgstr "Минимальная ширина" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:73 -#: superset-frontend/src/explore/controlPanels/sections.tsx:189 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:80 +#: superset-frontend/src/explore/controlPanels/sections.tsx:162 msgid "Min periods" -msgstr "HIde Periods" +msgstr "Минимальный период" + +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:95 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:48 +msgid "Min/max (no outliers)" +msgstr "Мин/макс (без выбросов)" -#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:170 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:167 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:278 +#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:153 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:159 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:251 msgid "Mine" msgstr "Мои" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:257 -msgid "Minimize chart" -msgstr "Свернуть график" - -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1260 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:187 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1102 msgid "Minimum" -msgstr "минута" +msgstr "Минимум" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:57 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:61 msgid "Minimum Font Size" -msgstr "" +msgstr "Минимальный размер шрифта" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:101 +msgid "Minimum Radius" +msgstr "Минимальный радиус" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:78 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:77 msgid "Minimum leaf node event count" msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:85 -msgid "Minimum threshold in percentage points for showing labels." +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:106 +msgid "" +"Minimum radius size of the circle, in pixels. As the zoom level changes, " +"this insures that the circle respects this minimum radius." msgstr "" +"Минимальный размер радиуса окружности (в пикселях). При изменении " +"масштаба это гарантирует, что окружность соответствует этому минимальному" +" радиусу." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:202 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:88 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:149 +msgid "Minimum threshold in percentage points for showing labels." +msgstr "Минимальный порог в процентных пунктах для отображения меток" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:203 msgid "Minimum value for label to be displayed on graph." -msgstr "" +msgstr "Минимальное значение метки для отображения на графике." -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:89 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:86 msgid "Minimum value on the gauge axis" -msgstr "" - -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:328 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:243 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:206 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:186 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:203 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:259 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:262 +msgstr "Минимальное значение индикатора" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:344 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:232 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:213 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:219 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:163 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:163 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:216 msgid "Minor Split Line" -msgstr "" +msgstr "Разметка полотна линиями" -#: superset/db_engine_specs/base.py:89 -#, fuzzy +#: superset/db_engine_specs/base.py:103 msgid "Minute" -msgstr "минута" +msgstr "Минута" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:64 -#, fuzzy, python-format +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:63 +#, python-format msgid "Minutes %s" -msgstr "минута" +msgstr "Минут %s" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:93 -#, fuzzy -msgid "Missing Required Fields" -msgstr "Имя обязательно" +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:401 +msgid "Missing URL parameters" +msgstr "Пропущенные параметры URL" #: superset-frontend/src/components/ErrorMessage/DatasetNotFoundErrorMessage.tsx:34 -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:251 -#, fuzzy +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:363 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:419 msgid "Missing dataset" -msgstr "Выберите источник данных" +msgstr "Отсутствующий датасет" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:67 -msgid "Mixed Time-Series" -msgstr "" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:74 +msgid "Mixed Chart" +msgstr "Смешанный график" -#: superset-frontend/src/dashboard/components/AddSliceCard.jsx:128 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:312 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:309 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:359 -#: superset/connectors/druid/views.py:355 superset/connectors/sqla/views.py:371 -#: superset/connectors/sqla/views.py:506 superset/views/dashboard/mixin.py:86 -#: superset/views/dashboard/views.py:158 superset/views/database/mixins.py:202 -#: superset/views/sql_lab.py:72 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:74 +msgid "Mixed Time-Series" +msgstr "Смешанная диаграмма временных рядов" + +#: superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.tsx:278 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:336 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:327 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:368 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:360 +#: superset/connectors/sqla/views.py:368 superset/connectors/sqla/views.py:496 +#: superset/views/dashboard/mixin.py:86 superset/views/dashboard/views.py:194 +#: superset/views/database/mixins.py:199 superset/views/sql_lab/views.py:85 msgid "Modified" msgstr "Изменено" -#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:155 -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:164 -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:130 -#, fuzzy, python-format +#: superset-frontend/src/pages/ChartList/ChartCard.tsx:158 +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:163 +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:123 +#, python-format msgid "Modified %s" msgstr "Изменено %s" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:303 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:291 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:319 +#: superset-frontend/src/components/MetadataBar/ContentConfig.tsx:81 +#: superset-frontend/src/pages/ChartList/index.tsx:422 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:306 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:378 msgid "Modified by" -msgstr "Изменено" +msgstr "Кем изменено" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:604 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:766 #, python-format msgid "Modified columns: %s" msgstr "Изменённые столбцы: %s" @@ -7742,71 +9444,82 @@ msgstr "Изменённые столбцы: %s" msgid "Monday" msgstr "Понедельник" -#: superset/db_engine_specs/base.py:98 -#, fuzzy +#: superset/db_engine_specs/base.py:112 msgid "Month" -msgstr "месяц" +msgstr "Месяц" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:68 -#, fuzzy, python-format +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:67 +#, python-format msgid "Months %s" -msgstr "месяц" +msgstr "Месяцев %s" -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:238 -msgid "More dataset related options" -msgstr "Больше опций к датасету" +#: superset-frontend/src/components/DropdownContainer/index.tsx:122 +msgid "More" +msgstr "Подробнее" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:167 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:276 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx:182 +#, fuzzy +msgid "More filters" +msgstr "Временной фильтр" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:168 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:277 msgid "Move only" -msgstr "" +msgstr "Только перемещение" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:43 msgid "Moves the given set of dates by a specified interval." msgstr "" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:40 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:32 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:34 msgid "Multi-Dimensions" -msgstr "Измерение" +msgstr "Многомерный" -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:34 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:37 #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:41 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:37 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/index.js:31 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:39 msgid "Multi-Layers" -msgstr "" +msgstr "Многослойный" #: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:44 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/index.ts:45 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:43 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:62 msgid "Multi-Levels" -msgstr "" +msgstr "Многоуровневый" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:42 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:32 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:44 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:74 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:58 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:30 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:34 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:47 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:61 +#: superset-frontend/src/visualizations/TimeTable/index.ts:33 msgid "Multi-Variables" -msgstr "" +msgstr "Несколько переменных" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:187 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:188 msgid "Multiple" -msgstr "" +msgstr "Несколько" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:30 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:32 msgid "Multiple Line Charts" -msgstr "Time Series - Multiple Line Charts" +msgstr "Несколько линейных диаграмм" -#: superset/views/database/views.py:439 +#: superset/views/database/views.py:465 msgid "" "Multiple file extensions are not allowed for columnar uploads. Please " "make sure all files are of the same extension." msgstr "" +"Несколько расширений файлов столбчатого формата не разрешены к загрузке. " +"Пожалуйста, убедитесь, что все файлы имеют одинаковое расширение." + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:173 +msgid "Multiple filtering" +msgstr "Множественная фильтрация" #: superset-frontend/src/explore/components/controls/SpatialControl.jsx:185 msgid "" @@ -7816,183 +9529,213 @@ msgstr "" "Для уточнения форматов и получения более подробной информации, посмотрите" " Python-библиотеку geopy.points" -#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:59 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:77 -#, fuzzy -msgid "Multiple select" -msgstr "Разрешить множественный фильтр" - #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:218 msgid "Multiple selections allowed, otherwise filter is limited to a single value" msgstr "" "Разрешён множественный выбор, иначе можно выбрать только одно значение " "фильтра" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:333 +msgid "Multiplier" +msgstr "Мультипликатор" + #: superset/dashboards/commands/exceptions.py:39 msgid "Must be unique" -msgstr "Должно быть уникально" +msgstr "Должно быть уникальным" + +#: superset/reports/commands/exceptions.py:94 +msgid "Must choose either a chart or a dashboard" +msgstr "Выберите график или дашборд" -#: superset/viz.py:2309 +#: superset/viz.py:2343 msgid "Must have a [Group By] column to have 'count' as the [Label]" -msgstr "Чтобы получить `count` как [Метку], должна быть заполнена [Группировка по]" +msgstr "" -#: superset/viz.py:1720 +#: superset/viz.py:1749 msgid "Must have at least one numeric column specified" msgstr "Должен быть указан хотя бы один числовой столбец" -#: superset/connectors/sqla/models.py:1303 +#: superset/connectors/sqla/models.py:1555 superset/models/helpers.py:1765 msgid "Must specify a value for filters with comparison operators" -msgstr "" +msgstr "Необходимо указать значение для фильтров с операторами сравнения" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx:47 -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelectPopoverTitle.jsx:59 -#, fuzzy +#: superset-frontend/src/explore/controlUtils/controlUtils.test.tsx:74 +msgid "My beautiful colors" +msgstr "Мои красивые цвета" + +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx:41 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelectPopoverTitle.jsx:65 msgid "My column" -msgstr "столбец" +msgstr "Мой столбец" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.jsx:73 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.tsx:55 msgid "My metric" -msgstr "Показатель" +msgstr "Моя мера" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:76 +#: superset-frontend/src/constants.ts:147 +#: superset-frontend/src/explore/components/DataTableControl/index.tsx:239 msgid "N/A" +msgstr "Пусто" + +#: superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx:52 +msgid "NOT GROUPED BY" msgstr "" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:101 msgid "NOV" msgstr "НОЯ" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:232 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:244 msgid "NOW" msgstr "СЕЙЧАС" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:72 -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:123 -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:211 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:230 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:232 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:722 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:233 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:131 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:138 +msgid "NUMERIC" +msgstr "Числовой (NUMERIC/DECIMAL)" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:73 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:150 +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:760 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:212 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:243 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:245 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:772 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:273 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:130 #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:131 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:279 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:273 -#: superset/views/annotations.py:126 superset/views/chart/mixin.py:86 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:338 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:274 +#: superset/connectors/sqla/views.py:362 superset/views/chart/mixin.py:86 msgid "Name" -msgstr "Название" +msgstr "Имя" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:779 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:785 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:762 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:768 msgid "Name is required" msgstr "Имя обязательно" #: superset/annotation_layers/commands/exceptions.py:66 -#: superset/reports/commands/exceptions.py:167 msgid "Name must be unique" msgstr "Имя должно быть уникальным" -#: superset/views/database/forms.py:380 -#, fuzzy +#: superset/views/database/forms.py:406 msgid "Name of table to be created from columnar data." -msgstr "Имя таблицы, которая будет сформирована из данных csv." - -#: superset/views/database/forms.py:96 -msgid "Name of table to be created from csv data." -msgstr "Имя таблицы, которая будет сформирована из данных csv." +msgstr "Имя таблицы, созданной из файла столбчатого формата." -#: superset/views/database/forms.py:247 +#: superset/views/database/forms.py:270 msgid "Name of table to be created from excel data." -msgstr "Имя таблицы, которая будет сформирована из данных csv." +msgstr "Имя таблицы, созданной из Excel файла." -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:61 +#: superset/views/database/forms.py:129 +msgid "Name of table to be created with CSV file" +msgstr "Имя таблицы, созданной из CSV файла." + +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:62 msgid "Name of the column containing the id of the parent node" -msgstr "" +msgstr "Имя столбца, содержащее id родительской вершины" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:51 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:52 msgid "Name of the id column" -msgstr "Столбцы Временных Рядов" +msgstr "Имя столбца id" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:53 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:54 msgid "Name of the source nodes" -msgstr "" +msgstr "Имя исходных вершин" -#: superset/connectors/sqla/views.py:439 +#: superset/connectors/sqla/views.py:429 msgid "Name of the table that exists in the source database" -msgstr "Имя таблицы, которая существует в исходной базе данных" +msgstr "Имя таблицы, которая существует в базе данных" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:63 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:64 msgid "Name of the target nodes" -msgstr "Владельцы датасета" +msgstr "Имя конечных вершин" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:51 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:66 msgid "Name your database" -msgstr "Назовите свой датасет" +msgstr "Дайте имя базе данных" -#: superset-frontend/src/chart/chartReducer.ts:106 -#: superset-frontend/src/chart/chartReducer.ts:170 -msgid "Network error." -msgstr "Ошибка сети." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:100 +msgid "Need help? Learn how to connect your database" +msgstr "Нужна помощь? Узнайте, как подключаться к вашей базе данных" -#: superset/templates/appbuilder/navbar_right.html:35 -msgid "New" -msgstr "Новый" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:146 +msgid "Need help? Learn more about" +msgstr "Нужна помощь? Узнайте больше о" -#: superset-frontend/src/components/ReportModal/index.tsx:251 -msgid "New Email Report" -msgstr "" +#: superset-frontend/src/utils/getClientErrorObject.ts:132 +msgid "Network error" +msgstr "Ошибка сети" + +#: superset-frontend/src/components/Chart/chartReducer.ts:107 +#: superset-frontend/src/components/Chart/chartReducer.ts:168 +msgid "Network error." +msgstr "Ошибка сети." -#: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:61 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:223 msgid "New chart" -msgstr "Переместить график" +msgstr "Новый график" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:614 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:776 #, python-format msgid "New columns added: %s" msgstr "Добавленные столбцы: %s" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx:81 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/index.tsx:36 +msgid "New dataset" +msgstr "Новый датасет" + +#: superset-frontend/src/views/CRUD/data/dataset/DuplicateDatasetModal.tsx:66 +msgid "New dataset name" +msgstr "Новое имя датасета" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx:90 msgid "New filter set" -msgstr "Настроить области действия фильтра" +msgstr "Новый набор фильтров" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:327 +#: superset-frontend/src/dashboard/util/newComponentFactory.js:49 +#, fuzzy +msgid "New header" +msgstr "Подзаголовок" + +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:320 msgid "New tab" -msgstr "Закрыть вкладку" +msgstr "Новая вкладка" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:420 +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:268 +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:310 msgid "New tab (Ctrl + q)" -msgstr "" +msgstr "Новая вкладка (CTRL + Q)" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:421 +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:269 +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:311 msgid "New tab (Ctrl + t)" -msgstr "" +msgstr "Новая вкладка (CTRL + T)" -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:133 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:113 +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:134 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:114 msgid "Next" -msgstr "След" +msgstr "Следующий" -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:29 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:32 msgid "Nightingale Rose Chart" -msgstr "Time Series - Nightingale Rose Chart" - -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:444 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:538 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:441 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:512 +msgstr "Диаграмма Найтингейл" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:89 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:108 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:127 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:145 +#: superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.tsx:143 +#: superset-frontend/src/pages/ChartList/index.tsx:569 +#: superset-frontend/src/pages/ChartList/index.tsx:678 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:462 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:544 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:465 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:485 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:577 msgid "No" msgstr "Нет" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:74 -#, python-format -msgid "No %(tableName)s yet" -msgstr "" - -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:376 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:440 #, python-format msgid "No %s yet" msgstr "Пока нет %s" @@ -8001,349 +9744,539 @@ msgstr "Пока нет %s" msgid "No Access!" msgstr "Нет доступа!" -#: superset-frontend/src/components/ListView/ListView.tsx:398 -#, fuzzy +#: superset-frontend/src/components/ListView/ListView.tsx:417 +#: superset-frontend/src/profile/components/RecentActivity.tsx:52 msgid "No Data" -msgstr "Метаданные" +msgstr "Нет данных" -#: superset-frontend/packages/superset-ui-core/src/chart/components/NoResultsComponent.tsx:75 -#, fuzzy +#: superset-frontend/packages/superset-ui-core/src/chart/components/NoResultsComponent.tsx:78 msgid "No Results" -msgstr "Посмотреть результаты" +msgstr "Нет результатов" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:328 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:114 +msgid "No annotation layers" +msgstr "Нет слоев аннотаций" + +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:314 msgid "No annotation layers yet" -msgstr "Слои аннотаций" +msgstr "Пока нет слоев аннотаций" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:254 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:242 msgid "No annotation yet" msgstr "Пока нет аннотаций" -#: superset-frontend/src/profile/components/CreatedContent.tsx:45 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx:186 +msgid "No applied filters" +msgstr "Фильтры не применены" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:148 +msgid "No available filters." +msgstr "Нет доступных фильтров." + +#: superset-frontend/src/profile/components/CreatedContent.tsx:61 msgid "No charts" -msgstr "Переместить график" +msgstr "Нет графиков" -#: superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx:82 +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:34 #, fuzzy +msgid "No charts yet" +msgstr "Нет графиков" + +#: superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx:86 msgid "No columns" -msgstr "столбец" +msgstr "Нет столбцов" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:134 -#, fuzzy, python-format +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:133 msgid "No compatible columns found" -msgstr "Несовместимые фильтры (%d)" +msgstr "Не найдено подходящих столбцов" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx:93 +#, fuzzy +msgid "No compatible datasets found" +msgstr "Не найдено подходящих столбцов" + +#: superset-frontend/src/components/DatabaseSelector/index.tsx:324 +#, fuzzy +msgid "No compatible schema found" +msgstr "Не найдено подходящих столбцов" -#: superset-frontend/src/profile/components/CreatedContent.tsx:63 +#: superset-frontend/src/profile/components/CreatedContent.tsx:91 msgid "No dashboards" msgstr "Нет дашбордов" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:189 -#: superset-frontend/src/explore/components/DataTablesPane/index.tsx:146 -#: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:255 -#: superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx:91 +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:35 +#, fuzzy +msgid "No dashboards yet" +msgstr "Нет дашбордов" + +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx:133 +#: superset-frontend/src/components/Table/index.tsx:261 +#: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:263 +#: superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx:95 msgid "No data" -msgstr "Метаданные" +msgstr "Нет данных" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:219 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx:171 msgid "No data after filtering or data is NULL for the latest time record" msgstr "" +"Нет данных после фильтрации или данные отсутствуют за последний отрезок " +"времени" -#: superset/dashboards/commands/importers/v0.py:321 +#: superset/dashboards/commands/importers/v0.py:304 msgid "No data in file" -msgstr "Нет данных в файле" +msgstr "В файле нет данных" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:752 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/index.tsx:247 +msgid "No database tables found" +msgstr "Не найдено таблиц в базе данных" + +#: superset-frontend/src/components/EmptyState/index.tsx:234 +msgid "No databases match your search" +msgstr "Нет баз данных, удовлетворяющих вашему поиску" + +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:846 msgid "No description available." -msgstr "описание" +msgstr "Описание отсутствует." #: superset-frontend/src/profile/components/Favorites.tsx:46 msgid "No favorite charts yet, go click on stars!" -msgstr "В избранном нет графиков. Нажмите звёздочку для добавления!" +msgstr "" +"Пока нет избранных графиков, для добавления в избранное нажмите на " +"звездочку рядом с графиком" -#: superset-frontend/src/profile/components/Favorites.tsx:64 +#: superset-frontend/src/profile/components/Favorites.tsx:74 msgid "No favorite dashboards yet, go click on stars!" -msgstr "В избранном нет дашбордов. Нажмите звёздочку для добавления!" +msgstr "" +"Пока нет избранных дашбордов, для добавления в избранное нажмите на " +"звездочку рядом с дашбордом" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:313 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:948 #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:35 -#: superset-frontend/src/explore/controls.jsx:342 -#, fuzzy +#: superset-frontend/src/explore/controls.jsx:326 msgid "No filter" -msgstr "Добавить фильтр" +msgstr "Без фильтрации" -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:483 +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:746 msgid "No filter is selected." msgstr "Не выбраны фильтры." -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:86 -#, fuzzy, python-format +#: superset-frontend/src/components/Table/index.tsx:258 +msgid "No filters" +msgstr "Нет фильтров" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx:247 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx:289 +msgid "No filters are currently added" +msgstr "Не применено ни одного фильтра" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx:121 +msgid "No filters are currently added to this dashboard." +msgstr "Не применено ни одного фильтра к данному дашборду." + +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:680 +msgid "No form settings were maintained" +msgstr "Конфигурация графика не сохранилась" + +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:201 +#, fuzzy +msgid "No matching records found" +msgstr "Записи не найдены" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:72 msgid "No of Bins" -msgstr "Копирование %s" +msgstr "Количество столбцов" -#: superset-frontend/src/SqlLab/components/QueryHistory/index.tsx:49 -msgid "No query history yet..." -msgstr "История запросов пуста…" +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:36 +#, fuzzy +msgid "No recents yet" +msgstr "недавние(их)" -#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:494 +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:201 #: superset/templates/appbuilder/general/widgets/base_list.html:64 msgid "No records found" msgstr "Записи не найдены" -#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:400 +#: superset-frontend/src/explore/components/DataTablesPane/components/SamplesPane.tsx:137 +#: superset-frontend/src/explore/components/DataTablesPane/components/SingleQueryResultPane.tsx:64 +msgid "No results" +msgstr "Нет результатов" + +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/DashboardsSubMenu.tsx:127 +#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:425 msgid "No results found" msgstr "Записи не найдены" -#: superset-frontend/packages/superset-ui-core/src/chart/components/NoResultsComponent.tsx:63 +#: superset-frontend/src/components/ListView/ListView.tsx:408 +msgid "No results match your filter criteria" +msgstr "Не найдено результатов по вашим критериям" + +#: superset-frontend/src/components/Chart/ChartRenderer.jsx:279 +#: superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx:133 +msgid "No results were returned for this query" +msgstr "Не было получено данных по этому запросу" + +#: superset-frontend/packages/superset-ui-core/src/chart/components/NoResultsComponent.tsx:65 msgid "" "No results were returned for this query. If you expected results to be " "returned, ensure any filters are configured properly and the datasource " "contains data for the selected time range." msgstr "" +"По этому запросу не было возвращено данных. Если вы ожидали увидеть " +"результаты, убедитесь, что все фильтры настроены правильно и источник " +"данных содержит записи для заданного временного интервала." + +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.tsx:291 +msgid "No rows were returned for this dataset" +msgstr "Не было получено данных для этого датасета" + +#: superset-frontend/src/explore/components/DataTablesPane/components/SamplesPane.tsx:119 +msgid "No samples were returned for this dataset" +msgstr "Не было получено данных для этого датасета" + +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:291 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:309 +msgid "No saved expressions found" +msgstr "Не найдено сохраненных выражений" -#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:133 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:376 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:384 +msgid "No saved metrics found" +msgstr "Не найдено сохраненных мер" + +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:37 +#, fuzzy +msgid "No saved queries yet" +msgstr "сохраненные(ых) запросы(ов)" + +#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:173 msgid "No stored results found, you need to re-run your query" -msgstr "Не найдены сохранённые результаты, необходимо повторно выполнить запрос" +msgstr "Не найдены сохраненные результаты, необходимо повторно выполнить запрос" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:268 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:338 msgid "No such column found. To filter on a metric, try the Custom SQL tab." msgstr "" -"Такой столбец не найден. Чтобы фильтровать по показателю, попробуйте " -"вкладку Через SQL." +"Такой столбец не найден. Чтобы фильтровать по мере, попробуйте " +"использовать вкладку Свой SQL." -#: superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx:81 +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/MessageContent.tsx:67 #, fuzzy +msgid "No table columns" +msgstr "Нет столбцов формата дата/время" + +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:290 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:308 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:343 +msgid "No temporal columns found" +msgstr "Столбцы формата дата/время не найдены" + +#: superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx:85 msgid "No time columns" -msgstr "Столбец с временем" +msgstr "Нет столбцов формата дата/время" + +#: superset/databases/commands/exceptions.py:152 +msgid "No validator found (configured for the engine)" +msgstr "Не найден валидатор (сконфигурированный для драйвера)" + +#: superset/databases/commands/validate_sql.py:114 +msgid "No validator named {} found (configured for the {} engine)" +msgstr "Не найден валидатор с именем {} (сконфигурированный для драйвера {})" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:155 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:156 msgid "Node label position" -msgstr "" +msgstr "Расположение метки вершины" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:182 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:183 msgid "Node select mode" -msgstr "Выполнить выбранный запрос" +msgstr "Режим выбора вершин" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:213 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:214 msgid "Node size" -msgstr "Размер маркера" +msgstr "Размер вершины" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:41 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:242 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:120 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:644 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:124 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx:41 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:187 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:270 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:286 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:253 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:135 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:182 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:402 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:182 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:243 +#: superset-frontend/plugins/plugin-chart-echarts/src/constants.ts:81 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:124 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx:83 +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:196 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:559 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:48 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/DashboardsSubMenu.tsx:138 +#: superset-frontend/src/explore/controlPanels/sections.tsx:134 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:120 msgid "None" -msgstr "" +msgstr "Пусто" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:129 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:130 msgid "None -> Arrow" -msgstr "" +msgstr "Ничего -> Стрелка" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:128 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:129 msgid "None -> None" -msgstr "" +msgstr "Ничего -> Ничего" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:43 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:77 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:43 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:77 msgid "Normal" -msgstr "" +msgstr "Обычный" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:165 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:166 msgid "Normalize Across" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:315 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:141 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:329 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:127 msgid "Normalized" -msgstr "" +msgstr "Нормализовать" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:81 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:74 msgid "Not Time Series" -msgstr "Изменить параметры шаблона" +msgstr "Не временные ряды" + +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:180 +msgid "Not added to any dashboard" +msgstr "Не добавлен ни в один дашборд" + +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.tsx:328 +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:191 +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:195 +msgid "Not available" +msgstr "Не доступно" + +#: superset-frontend/src/explore/constants.ts:60 +msgid "Not equal to (≠)" +msgstr "Не равно (≠)" + +#: superset-frontend/src/explore/constants.ts:72 +#, fuzzy +msgid "Not in" +msgstr "аннотация" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:116 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:113 msgid "Not null" msgstr "Не пусто" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:57 -#, fuzzy +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:66 msgid "Not triggered" -msgstr "Ничего не сработало" +msgstr "Условие не выполнялось" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:152 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx:89 msgid "Not up to date" -msgstr "" +msgstr "Не актуально" #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:87 #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:97 msgid "Nothing triggered" -msgstr "Ничего не сработало" +msgstr "Не срабатывало" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:260 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1348 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:303 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:423 msgid "Notification method" -msgstr "Добавить слой аннотации" +msgstr "Способ уведомления" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:76 msgid "November" msgstr "Ноябрь" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:92 -#, fuzzy +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:89 msgid "Now" -msgstr "Строка" +msgstr "Сейчас" + +#: superset/views/database/forms.py:201 +msgid "Null Values" +msgstr "Пустые значения" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:184 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:258 +msgid "Null imputation" +msgstr "Пустые значения" #: superset/datasets/filters.py:26 msgid "Null or Empty" -msgstr "Null или пусто" +msgstr "Null или Пусто" -#: superset/views/database/forms.py:233 superset/views/database/forms.py:366 +#: superset/views/database/forms.py:392 msgid "Null values" -msgstr "Значение фильтра" +msgstr "Пустые значения" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:191 -#, fuzzy msgid "Number Format" -msgstr "Формат D3" +msgstr "Числовой формат" + +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:307 +msgid "" +"Number bounds used for color encoding from red to blue.\n" +" Reverse the numbers for blue to red. To get pure red or " +"blue,\n" +" you can enter either only min or max." +msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:56 -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:64 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:151 -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:128 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:75 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:77 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:210 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:95 +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:60 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:65 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:144 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:117 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:67 +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:67 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:99 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:112 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:149 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:120 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:137 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:113 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:97 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:276 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:136 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:111 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:145 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:119 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:136 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:129 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:112 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:317 msgid "Number format" -msgstr "Формат D3" +msgstr "Числовой формат" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:81 -msgid "Number of decimal digits to round numbers to" +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:323 +msgid "Number format string" +msgstr "Числовой формат" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:136 +msgid "Number of buckets to group data" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:100 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:70 +msgid "Number of decimal digits to round numbers to" +msgstr "Кол-во десятичных разрядов для округления числа" + +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:92 msgid "Number of decimal places with which to display lift values" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:87 +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:79 msgid "Number of decimal places with which to display p-values" msgstr "" -#: superset/views/database/forms.py:194 superset/views/database/forms.py:335 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:251 +msgid "Number of periods to compare against" +msgstr "Количество периодов для сравнения" + +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:262 +msgid "Number of periods to ratio against" +msgstr "Количество периодов для сравнения" + +#: superset/views/database/forms.py:255 +msgid "Number of rows of file to read" +msgstr "Количество строк файла для чтения" + +#: superset/views/database/forms.py:361 msgid "Number of rows of file to read." msgstr "Количество строк файла для чтения." -#: superset/views/database/forms.py:188 superset/views/database/forms.py:329 +#: superset/views/database/forms.py:261 +msgid "Number of rows to skip at start of file" +msgstr "Количество строк для пропуска в начале файла" + +#: superset/views/database/forms.py:355 msgid "Number of rows to skip at start of file." -msgstr "Количество первых строк, которые нужно проигнорировать." +msgstr "Количество строк для пропуска в начале файла." -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:231 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:227 msgid "Number of split segments on the axis" -msgstr "" +msgstr "Количество разделенных сегментов на индикаторе" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:119 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:120 msgid "Number of steps to take between ticks when displaying the X scale" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:135 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:136 msgid "Number of steps to take between ticks when displaying the Y scale" msgstr "" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:295 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:316 msgid "Numerical range" -msgstr "Период времени" +msgstr "Числовой диапазон" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:100 msgid "OCT" msgstr "ОКТ" -#: superset-frontend/src/components/Modal/Modal.tsx:198 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:797 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:180 +#: superset-frontend/src/components/Modal/Modal.tsx:231 +#: superset-frontend/src/components/Table/index.tsx:256 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:848 msgid "OK" -msgstr "" +msgstr "ОК" -#: superset-frontend/src/components/ImportModal/index.tsx:210 +#: superset-frontend/src/components/ImportModal/index.tsx:209 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1206 msgid "OVERWRITE" -msgstr "OVERWRITE" +msgstr "ПЕРЕЗАПИСАТЬ" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:75 msgid "October" msgstr "Октябрь" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:93 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:163 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:144 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:178 msgid "Offline" -msgstr "" +msgstr "Оффлайн" -#: superset/connectors/sqla/views.py:496 +#: superset/connectors/sqla/views.py:486 msgid "Offset" msgstr "Смещение" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:58 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:67 msgid "On Grace" -msgstr "" - -#: superset/views/alerts.py:191 -msgid "" -"Once an alert is triggered, how long, in seconds, before Superset nags " -"you again." -msgstr "" -"После срабатывания оповещения, как долго Superset не должен надоедать " -"снова." +msgstr "На перерыве" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:33 #: superset-frontend/src/explore/controls.jsx:126 msgid "" "One or many columns to group by. High cardinality groupings should " "include a series limit to limit the number of fetched and rendered " "series." msgstr "" +"Один или несколько столбцов для группировки. Столбцы с множеством " +"уникальных значений должны включать порог количества категорий для " +"снижения нагрузку на базу данных и на ускорения отображения графика." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:105 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:73 msgid "" "One or many columns to group by. High cardinality groupings should " "include a sort by metric and series limit to limit the number of fetched " "and rendered series." msgstr "" +"Один или несколько столбцов для группировки. Столбцы с множеством " +"уникальных значений должны включать показатель для сортировки и порог " +"количества значений для снижения нагрузку на базу данных и на ускорения " +"отображения графика." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:56 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:215 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:111 msgid "One or many columns to pivot as columns" msgstr "" -"Выберите один или несколько срезов для отображения показателей в столбцах" -" сводной таблицы" +"Один или несколько столбцов, используемых в роли столбцов в сводной " +"таблице" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:323 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:328 msgid "" "One or many controls to group by. If grouping, latitude and longitude " "columns must be present." msgstr "" -#: superset-frontend/src/explore/controls.jsx:246 +#: superset-frontend/src/explore/controls.jsx:245 +#, fuzzy msgid "One or many controls to pivot as columns" msgstr "" -"Выберите один или несколько срезов для отображения показателей в столбцах" -" сводной таблицы" +"Выберите один или несколько ... для отображения показателей в столбцах " +"сводной таблицы" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:107 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:145 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:169 #: superset-frontend/src/explore/controls.jsx:162 msgid "One or many metrics to display" -msgstr "Выберите один или несколько показателей для отображения" +msgstr "Выберите одну или несколько мер для отображения" #: superset/datasets/commands/exceptions.py:90 msgid "One or more columns already exist" @@ -8351,7 +10284,7 @@ msgstr "Один или несколько столбцов уже сущест #: superset/datasets/commands/exceptions.py:80 msgid "One or more columns are duplicated" -msgstr "Один или несколько столбцов-дубликатов" +msgstr "Один или несколько столбцов дублируются" #: superset/datasets/commands/exceptions.py:70 msgid "One or more columns do not exist" @@ -8359,122 +10292,121 @@ msgstr "Один или несколько столбцов не существ #: superset/datasets/commands/exceptions.py:119 msgid "One or more metrics already exist" -msgstr "Выберите один или несколько показателей для отображения" +msgstr "Одна или несколько мер уже существуют" #: superset/datasets/commands/exceptions.py:109 msgid "One or more metrics are duplicated" -msgstr "Выберите один или несколько показателей для отображения" +msgstr "Одна или несколько мер дублируются" #: superset/datasets/commands/exceptions.py:99 msgid "One or more metrics do not exist" -msgstr "Выберите один или несколько показателей для отображения" +msgstr "Одна или несколько мер не существуют" -#: superset/errors.py:113 -#, fuzzy +#: superset/errors.py:119 msgid "One or more parameters needed to configure a database are missing." msgstr "" -"Проблема 1006 - Отсутствуют один или несколько параметров, используемых в" -" запросе." +"Один или несколько параметров, необходимых для настройки базы данных, " +"отсутствуют" -#: superset/errors.py:127 -#, fuzzy +#: superset/errors.py:133 msgid "One or more parameters specified in the query are malformatted." msgstr "" -"Проблема 1006 - Отсутствуют один или несколько параметров, используемых в" -" запросе." +"Один или несколько параметров, указанных в запросе, неверно " +"отформатированы" -#: superset/errors.py:101 -#, fuzzy +#: superset/errors.py:107 msgid "One or more parameters specified in the query are missing." -msgstr "" -"Проблема 1006 - Отсутствуют один или несколько параметров, используемых в" -" запросе." +msgstr "Один или несколько параметров, указанных в запросе, отсутствуют" -#: superset/views/core.py:2075 +#: superset/views/core.py:1970 msgid "" "One or more required fields are missing in the request. Please try again," " and if the problem persists conctact your administrator." msgstr "" -#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:46 +#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:59 msgid "One ore more annotation layers failed loading." msgstr "Один или несколько слоев аннотации не удалось загрузить." -#: superset/sql_lab.py:201 -#, fuzzy +#: superset/sql_lab.py:230 msgid "Only SELECT statements are allowed against this database." -msgstr "Для этой БД разрешены только выражения `SELECT`" +msgstr "Только SELECT запросы доступны для этой базы данных." -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:128 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:130 msgid "Only Total" -msgstr "" +msgstr "Только общий итог" -#: superset/connectors/sqla/utils.py:96 +#: superset/connectors/sqla/utils.py:122 msgid "Only `SELECT` statements are allowed" -msgstr "Допустимы только выражения `SELECT`" +msgstr "Доступны только SELECT запросы" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:131 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:130 msgid "Only selected panels will be affected by this filter" msgstr "Фильтр будет применён только к выбранным панелям" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:131 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:133 msgid "" "Only show the total value on the stacked chart, and not show on the " "selected category" msgstr "" +"Показывать только общий итог для столбцов с накоплением, и не показывать " +"промежуточные итоги для каждой категории внутри столбца." -#: superset/connectors/sqla/utils.py:105 +#: superset/connectors/sqla/utils.py:131 msgid "Only single queries supported" msgstr "Поддерживаются только одиночные запросы" -#: superset/views/database/forms.py:111 superset/views/database/forms.py:262 -#: superset/views/database/forms.py:397 +#: superset/views/database/forms.py:119 superset/views/database/forms.py:288 +#: superset/views/database/forms.py:426 #, python-format msgid "Only the following file extensions are allowed: %(allowed_extensions)s" -msgstr "Разрешены файлы только в следующих расширениях: %(allowed_extensions)s" +msgstr "Доступные расширения файлов: %(allowed_extensions)s" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:236 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:196 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:636 +#: superset-frontend/packages/superset-ui-core/src/chart/components/FallbackComponent.tsx:45 +msgid "Oops! An error occurred!" +msgstr "Произошла ошибка!" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:248 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:119 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:198 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:684 msgid "Opacity" msgstr "Прозрачность" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:137 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:152 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:155 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:96 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:112 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:109 msgid "Opacity of Area Chart. Also applies to confidence band." msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:239 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:251 msgid "Opacity of all clusters, points, and labels. Between 0 and 1." -msgstr "" +msgstr "Непрозрачность всех кластеров, точек и меток. Между 0 и 1." -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:202 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:204 msgid "Opacity of area chart." -msgstr "" +msgstr "Непрозрачность диаграммы областей" -#: superset-frontend/src/explore/components/ExploreViewContainer.jsx:550 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:125 +msgid "Opacity, expects values between 0 and 100" +msgstr "Непрозрачность, принимаются значения от 0 до 100" + +#: superset-frontend/src/explore/components/ExploreViewContainer/index.jsx:643 msgid "Open Datasource tab" msgstr "Открыть вкладку источника данных" -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:141 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:121 +#: superset-frontend/src/explore/components/controls/ViewQueryModalFooter.tsx:38 +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:142 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:122 msgid "Open in SQL Lab" msgstr "Открыть в SQL редакторе" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:317 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:335 msgid "Open query in SQL Lab" msgstr "Открыть в SQL редакторе" -#: superset/views/database/mixins.py:105 -msgid "" -"Operate the database in asynchronous mode, meaning that the queries are " -"executed on remote workers as opposed to on the web server itself. This " -"assumes that you have a Celery worker setup as well as a results backend." -" Refer to the installation docs for more information." -msgstr "" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:288 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:298 +#: superset/views/database/mixins.py:104 msgid "" "Operate the database in asynchronous mode, meaning that the queries are " "executed on remote workers as opposed to on the web server itself. This " @@ -8483,429 +10415,538 @@ msgid "" msgstr "" "Работа с базой данных в асинхронном режиме означает, что запросы " "исполняются на удалённых воркерах, а не на веб-сервере Superset. Это " -"подразумевает, что у вас установка с воркерами Celery. Обратитесь к " +"подразумевает, что у вас есть установка с воркерами Celery. Обратитесь к " "документации по настройке за дополнительной информацией." -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:125 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:126 #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:130 -#, fuzzy, python-format msgid "Operator" -msgstr "%s параметр(ы)" +msgstr "Оператор" -#: superset/utils/pandas_postprocessing.py:175 +#: superset/utils/pandas_postprocessing/utils.py:158 #, python-format msgid "Operator undefined for aggregator: %(name)s" -msgstr "" +msgstr "Оператор не определен для агрегатора: %(name)s" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:361 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:371 msgid "" "Optional CA_BUNDLE contents to validate HTTPS requests. Only available on" " certain database engines." msgstr "" +"Необязательное содержимое CA_BUNDLE для валидации HTTPS запросов. " +"Доступно только в определенных драйверах баз данных" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:73 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:329 +msgid "Optional d3 date format string" +msgstr "Формат временной строки" + +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:318 +msgid "Optional d3 number format string" +msgstr "Формат числовой строки" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:74 msgid "Optional name of the data column." -msgstr "" +msgstr "Необязательное имя столбца данныхэ" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1135 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:977 msgid "" "Optional time column if time range should apply to another column than " "the default time column" msgstr "" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1092 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1242 msgid "Optional warning about use of this metric" +msgstr "Необязательное предупреждение об использовании этой меры" + +#: superset/connectors/sqla/views.py:329 +msgid "Optionally add a detailed description" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:49 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:75 -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:119 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:72 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:39 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:37 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:105 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:198 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:363 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:48 -#, fuzzy, python-format +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:39 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:68 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:108 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:74 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:45 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controlPanel.tsx:70 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:167 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:263 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:374 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:52 +#: superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx:67 msgid "Options" -msgstr "%s параметр(ы)" +msgstr "Опции" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:668 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:868 msgid "Or choose from a list of other databases we support:" -msgstr "" +msgstr "Или выберите из списка других поддерживаемых баз данных:" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:63 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:62 msgid "Order by entity id" msgstr "" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:272 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/orderBy.tsx:29 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:278 msgid "Order results by selected columns" -msgstr "" +msgstr "Упорядочить результаты по выбранным столбцам" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:271 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/orderBy.tsx:28 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:277 msgid "Ordering" -msgstr "Сортировать" +msgstr "Упорядочивание" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:142 -msgid "Orientation of tree" -msgstr "" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:81 +msgid "Orientation" +msgstr "Ориентация" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:27 -#: superset-frontend/src/explore/constants.ts:116 -msgid "Origin" -msgstr "Источник" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:282 +msgid "Orientation of bar chart" +msgstr "Ориентация диаграммы" -#: superset-frontend/src/explore/components/ExportToCSVDropdown/index.tsx:74 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/index.tsx:158 #, fuzzy +msgid "Orientation of filter bar" +msgstr "Ориентация дерева" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:143 +msgid "Orientation of tree" +msgstr "Ориентация дерева" + +#: superset-frontend/src/explore/components/ExportToCSVDropdown/index.tsx:75 msgid "Original" -msgstr "Источник" +msgstr "Исходные данные" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:183 +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:212 msgid "Original table column order" msgstr "Расположение столбцов как в исходной таблице" #: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:29 -#: superset/db_engine_specs/base.py:85 +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.tsx:135 +#: superset-frontend/src/explore/components/DataTableControl/index.tsx:143 +#: superset-frontend/src/explore/controls.jsx:79 msgid "Original value" -msgstr "" +msgstr "Исходное значение" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:120 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:121 +#, fuzzy msgid "Orthogonal" -msgstr "" +msgstr "Перпендикулярно" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:120 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:687 -#, fuzzy +# здесь идет речь про прочие категории графиков, помимо основных категорий +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:126 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:443 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:888 +#: superset/views/database/forms.py:155 superset/views/database/forms.py:161 msgid "Other" -msgstr "месяц" +msgstr "Прочее" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:236 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:379 +msgid "Outdoors" +msgstr "Туристический режим" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:193 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:205 msgid "Outer Radius" -msgstr "" +msgstr "Внешний радиус" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:199 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:211 msgid "Outer edge of Pie chart" -msgstr "Идентификатор активного среза" +msgstr "Внешний радиус круговой диаграммы" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:257 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:253 msgid "Overlap" -msgstr "Карта Мира" +msgstr "Перекрывание" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:107 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:322 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:205 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:455 -#: superset-frontend/src/explore/controlPanels/sections.tsx:220 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:123 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:199 msgid "" "Overlay one or more timeseries from a relative time period. Expects " "relative time deltas in natural language (example: 24 hours, 7 days, 52 " "weeks, 365 days). Free text is supported." msgstr "" +"Наложение одной или нескольких временных рядов из относительного периода " +"времени." + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:317 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:467 +#: superset-frontend/src/explore/controlPanels/sections.tsx:195 +#, fuzzy +msgid "" +"Overlay one or more timeseries from a relative time period. Expects " +"relative time deltas in natural language (example: 24 hours, 7 days, 52 " +"weeks, 365 days). Free text is supported." +msgstr "" +"Наложение одной или нескольких временных рядов из относительного периода " +"времени." + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:27 +msgid "" +"Overlays a hexagonal grid on a map, and aggregates data within the " +"boundary of each cell." +msgstr "" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:600 +msgid "Override time grain" +msgstr "Переопределить единицу времени" -#: superset-frontend/src/components/ImportModal/index.tsx:282 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:582 +msgid "Override time range" +msgstr "Переопределить временной интервал" + +#: superset-frontend/src/components/ImportModal/index.tsx:281 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:492 +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:458 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:464 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx:148 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx:245 msgid "Overwrite" msgstr "Перезаписать" -#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:120 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:246 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:193 msgid "Overwrite & Explore" msgstr "Перезаписать и исследовать" -#: superset-frontend/src/dashboard/components/SaveModal.tsx:191 +#: superset-frontend/src/dashboard/components/SaveModal.tsx:183 #, python-format msgid "Overwrite Dashboard [%s]" msgstr "Перезаписать дашборд [%s]" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:264 +#: superset/views/database/forms.py:237 +msgid "Overwrite Duplicate Columns" +msgstr "Перезаписать повторяющиеся столбцы" + +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:404 +msgid "Overwrite existing" +msgstr "Перезаписать существующий" + +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:272 msgid "Overwrite text in the editor with a query on this table" -msgstr "Перезаписать текст в редакторе с запросом к этой таблице" +msgstr "Вставить этот запрос в редактор SQL" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:453 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:450 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:417 +#: superset-frontend/src/pages/ChartList/index.tsx:578 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:453 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:478 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:504 msgid "Owner" msgstr "Владелец" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:234 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:399 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:355 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:358 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:402 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:405 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:168 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:276 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1079 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1084 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:334 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:334 -#: superset/connectors/druid/views.py:346 superset/connectors/sqla/views.py:500 -#: superset/views/chart/mixin.py:83 superset/views/dashboard/mixin.py:82 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:235 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:561 +#: superset-frontend/src/components/MetadataBar/ContentConfig.tsx:93 +#: superset-frontend/src/dashboard/components/PropertiesModal/PropertiesModal.test.tsx:406 +#: superset-frontend/src/dashboard/components/PropertiesModal/PropertiesModal.test.tsx:420 +#: superset-frontend/src/dashboard/components/PropertiesModal/PropertiesModal.test.tsx:439 +#: superset-frontend/src/dashboard/components/PropertiesModal/PropertiesModal.test.tsx:453 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:407 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:410 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:454 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:457 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:174 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:325 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:397 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:349 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:393 +#: superset/connectors/sqla/views.py:490 superset/views/chart/mixin.py:83 +#: superset/views/dashboard/mixin.py:82 msgid "Owners" msgstr "Владельцы" -#: superset/commands/exceptions.py:105 +#: superset/commands/exceptions.py:108 #: superset/datasets/commands/exceptions.py:144 msgid "Owners are invalid" -msgstr "Владельцы недействительны" +msgstr "Неверный список владельцев" #: superset/views/dashboard/mixin.py:65 msgid "Owners is a list of users who can alter the dashboard." -msgstr "Владельцы - это пользователи, которые могут изменять дашборд." +msgstr "Владельцы – это список пользователей, которые могут изменять дашборд." -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:367 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:414 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:421 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:468 msgid "" "Owners is a list of users who can alter the dashboard. Searchable by name" " or username." -msgstr "Владельцы - это список пользователей, которые могут изменять дашборд." +msgstr "" +"Владельцы – это список пользователей, которые могут изменять дашборд. " +"Можно искать по имени или никнейму." -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:388 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:399 msgid "Page length" -msgstr "" +msgstr "Размер страницы" #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:29 msgid "Paired t-test Table" -msgstr "" - -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:177 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:388 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:271 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:516 -#: superset-frontend/src/explore/controlPanels/sections.tsx:278 +msgstr "Таблица парного t-теста" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:193 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:380 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:262 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:534 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:267 +#: superset-frontend/src/explore/controlPanels/sections.tsx:258 msgid "Pandas resample method" -msgstr "" -"Одна из функций (Resample) библиотеки Pandas, которая определяет метод " -"обработки данных" +msgstr "Метод ресемплирования данных библиотеки Pandas" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:156 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:370 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:253 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:496 -#: superset-frontend/src/explore/controlPanels/sections.tsx:260 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:172 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:362 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:244 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:514 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:245 +#: superset-frontend/src/explore/controlPanels/sections.tsx:240 msgid "Pandas resample rule" -msgstr "" -"Одна из функций (Resample) библиотеки Pandas, которая определяет период, " -"к которому применяется функция агрегации" +msgstr "Правило ресемплирования данных библиотеки Pandas" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:30 -#: superset/viz.py:2182 +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:33 +#: superset/viz.py:2216 msgid "Parallel Coordinates" msgstr "" #: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:116 msgid "Parameter error" -msgstr "Параметры" +msgstr "Ошибка параметра" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:64 +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:56 #: superset/views/chart/mixin.py:84 msgid "Parameters" msgstr "Параметры" -#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:103 -#, fuzzy +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:108 msgid "Parameters " -msgstr "Параметры" +msgstr "Параметры " -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:60 -msgid "Parent" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:295 +msgid "Parameters related to the view and perspective on the map" msgstr "" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:643 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1037 -msgid "Parent filter" -msgstr "Временной фильтр" - -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1045 -#, fuzzy -msgid "Parent filter is required" -msgstr "Тип обязателен" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:61 +msgid "Parent" +msgstr "Родитель" -#: superset/views/database/forms.py:203 superset/views/database/forms.py:340 +#: superset/views/database/forms.py:366 msgid "Parse Dates" -msgstr "Разбор Дат" +msgstr "Парсинг дат" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:25 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:26 #: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:26 #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:29 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:51 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/index.ts:35 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:33 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:50 msgid "Part of a Whole" -msgstr "" +msgstr "Покомпонентное сравнение" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:27 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:29 #, fuzzy msgid "Partition Chart" msgstr "Partition Diagram" -#: superset/viz.py:3035 +#: superset/viz.py:3069 +#, fuzzy msgid "Partition Diagram" msgstr "Partition Diagram" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:176 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:169 msgid "Partition Limit" -msgstr "Partition Diagram" +msgstr "Количество разбиений" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:189 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:182 msgid "Partition Threshold" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:192 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:185 msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:130 -#: superset/db_engine_specs/base.py:1389 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:154 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:168 +#: superset/db_engine_specs/base.py:1734 msgid "Password" -msgstr "Пароль брокера" +msgstr "Пароль" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:221 +msgid "Paste Private Key here" +msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:79 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:120 +#, fuzzy +msgid "Paste content of service credentials JSON file here" +msgstr "Скопировать и вставить .json файл сервисного аккаунта сюда" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:87 msgid "Paste the shareable Google Sheet URL here" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:35 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:37 #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:35 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:38 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:46 -#, fuzzy msgid "Pattern" -msgstr "Обновить" +msgstr "Паттерн" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:108 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:101 msgid "Percent Change" -msgstr "Изменения не сохранены" +msgstr "Процентное изменение" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:147 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:53 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:90 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:104 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:66 +msgid "Percentage" +msgstr "Процентная доля" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:142 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:334 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:216 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:486 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:67 +#: superset-frontend/src/explore/controlPanels/sections.tsx:212 +msgid "Percentage change" +msgstr "Процентное изменение" + +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/metrics.tsx:33 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:125 msgid "Percentage metrics" -msgstr "Показатель для сортировки" +msgstr "Процентные меры" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:145 msgid "Percentage threshold" -msgstr "" +msgstr "Процентный порог" #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:41 #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:45 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:39 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:44 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:49 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:42 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:38 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:43 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:40 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:51 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:43 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:41 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:69 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:63 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:33 -#, fuzzy +#: superset-frontend/src/visualizations/TimeTable/index.ts:36 msgid "Percentages" -msgstr "Последние" +msgstr "Проценты" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:219 +msgid "Performance" +msgstr "Производительность" + +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:74 +msgid "Period average" +msgstr "Среднее за период" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:56 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:278 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:161 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:179 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:410 -#: superset-frontend/src/explore/controlPanels/sections.tsx:177 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:271 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:153 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:420 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:200 +#: superset-frontend/src/explore/controlPanels/sections.tsx:150 msgid "Periods" -msgstr "Период" +msgstr "Периоды" -#: superset/utils/pandas_postprocessing.py:824 -msgid "Periods must be a positive integer value" -msgstr "Периоды должны быть положительными делами числами" +#: superset/utils/pandas_postprocessing/prophet.py:126 +msgid "Periods must be a whole number" +msgstr "Периоды должны быть целым числом" -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:258 -#, fuzzy +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:271 msgid "Person or group that has certified this chart." -msgstr "Лицо или группа, которые сертифицировали данный показатель" +msgstr "Лицо или группа, которые утвердили этот график" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:548 -#, fuzzy +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:617 msgid "Person or group that has certified this dashboard." -msgstr "Лицо или группа, которые сертифицировали данный показатель" +msgstr "Лицо или группа, которые утвердили этот дашборд" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:260 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1068 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:327 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1218 msgid "Person or group that has certified this metric" -msgstr "Лицо или группа, которые сертифицировали данный показатель" +msgstr "Лицо или группа, которые утвердили этот показатель" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:936 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1108 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:564 msgid "Physical" -msgstr "" +msgstr "Физический" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:132 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:144 msgid "Physical (table or view)" msgstr "Физический (таблица или представление)" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:223 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:277 msgid "Physical dataset" msgstr "Физический датасет" -#: superset/viz.py:742 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:106 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:143 +msgid "Pick a dimension from which categorical colors are defined" +msgstr "Выберите измерение, на основе которого определяются категориальные цвета" + +#: superset/viz.py:766 msgid "Pick a granularity in the Time section or uncheck 'Include Time'" msgstr "" -"Выберите столбец с датой и необходимый период в секции «Время» или " -"снимите флажок «Включая дату»" +"Выберите степень детализации в разделе Время или снимите флажок " +"\"Включить время\"." -#: superset/viz.py:1573 +#: superset/viz.py:1602 msgid "Pick a metric for left axis!" -msgstr "Выберите значение для левой оси!" +msgstr "Выберите меру для левой оси" -#: superset/viz.py:1575 +#: superset/viz.py:1604 msgid "Pick a metric for right axis!" -msgstr "Выберите значение для правой оси!" +msgstr "Выберите меру для правой оси" -#: superset/viz.py:1163 +#: superset/viz.py:1192 msgid "Pick a metric for x, y and size" -msgstr "Выберите срез для X, Y и размер" +msgstr "Выберите меру для x, y и размера" -#: superset/viz.py:1202 +#: superset/viz.py:1231 msgid "Pick a metric to display" -msgstr "Выберите показатель для отображения" +msgstr "Выберите меру для отображения" -#: superset/viz.py:1228 superset/viz.py:1262 +#: superset/viz.py:1257 superset/viz.py:1291 msgid "Pick a metric!" -msgstr "Выберите показатель!" +msgstr "Выберите меру!" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:56 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:71 msgid "Pick a name to help you identify this database." -msgstr "" +msgstr "Выберите имя для базы данных." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:151 -msgid "Pick a nickname for this database to display as in Superset." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:196 +msgid "Pick a nickname for how the database will display in Superset." +msgstr "Выберите имя для базы данных, которое будет отображаться в Суперсете." + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/controlPanel.js:40 +msgid "Pick a set of deck.gl charts to layer on top of one another" msgstr "" -#: superset/viz.py:1358 superset/viz.py:1621 +#: superset/viz.py:1387 superset/viz.py:1650 msgid "Pick a time granularity for your time series" -msgstr "Выберите период для временных рядов" +msgstr "Выберите временную детализацию для вашего временного ряда" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:510 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:558 msgid "Pick a title for you annotation." -msgstr "" +msgstr "Выберите название для вашей аннотации" -#: superset/viz.py:1783 +#: superset/viz.py:1812 msgid "Pick at least one field for [Series]" -msgstr "Выберите хотя бы одно значение для поля [Столбцы данных]" +msgstr "" -#: superset/viz.py:830 superset/viz.py:1781 +#: superset/viz.py:854 superset/viz.py:1810 msgid "Pick at least one metric" -msgstr "Выберите хотя бы один показатель" +msgstr "Выберите хотя бы одну меру" -#: superset/viz.py:1911 +#: superset/viz.py:1940 msgid "Pick exactly 2 columns as [Source / Target]" -msgstr "Выберите ровно два среза в поле [Источник / Назначение]" +msgstr "" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:521 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:569 msgid "" "Pick one or more columns that should be shown in the annotation. If you " "don't select a column all of them will be shown." msgstr "" +"Выберите один или несколько столбцов, которые должны отображаться в " +"аннотации. Если вы не выберите столбец, все столбцы будут отображены." #: superset-frontend/src/explore/controlPanels/Separator.js:37 msgid "Pick your favorite markup language" @@ -8913,209 +10954,282 @@ msgstr "Выберите свой любимый язык разметки" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/index.js:27 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:63 -#, fuzzy msgid "Pie Chart" -msgstr "Переместить график" +msgstr "Круговая диаграмма" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:187 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:199 msgid "Pie shape" -msgstr "Посмотреть примеры" +msgstr "Форма круговой диаграммы" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:234 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:235 msgid "Pin" -msgstr "в" +msgstr "Закрепить" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:56 -#, fuzzy, python-format +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:45 msgid "Pivot Options" -msgstr "%s параметр(ы)" +msgstr "Параметры сводной таблицы" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:30 -#: superset/viz.py:862 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:56 +#: superset/viz.py:891 msgid "Pivot Table" -msgstr "Pivot Table" +msgstr "Сводная таблица" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:54 -#, fuzzy -msgid "Pivot Table v2" -msgstr "Pivot Table" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:32 +msgid "Pivot Table (legacy)" +msgstr "Сводная таблица (устарело)" -#: superset/utils/pandas_postprocessing.py:260 +#: superset/utils/pandas_postprocessing/pivot.py:70 msgid "Pivot operation must include at least one aggregate" msgstr "" -#: superset/utils/pandas_postprocessing.py:256 +#: superset/utils/pandas_postprocessing/pivot.py:66 msgid "Pivot operation requires at least one index" msgstr "" -#: superset-frontend/src/explore/components/ExportToCSVDropdown/index.tsx:80 -#, fuzzy +#: superset-frontend/src/explore/components/ExportToCSVDropdown/index.tsx:81 msgid "Pivoted" -msgstr "Редактировано" +msgstr "Сводные данные" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:83 +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:75 msgid "Pixel height of each series" +msgstr "Высота каждого ряда (в пикселях)" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:143 +msgid "Pixels" +msgstr "Пиксели" + +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:66 +msgid "Plain" +msgstr "Отобразить все" + +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:667 +msgid "Please DO NOT overwrite the \"filter_scopes\" key." msgstr "" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils/index.ts:28 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils/index.ts:26 msgid "Please apply filter changes" -msgstr "" +msgstr "Пожалуйста, примените изменения фильтров" -#: superset/sqllab/query_render.py:116 +#: superset/sqllab/query_render.py:121 msgid "" "Please check your query and confirm that all template parameters are " "surround by double braces, for example, \"{{ ds }}\". Then, try running " "your query again." msgstr "" +"Пожалуйста, проверьте ваш запрос и подтвердите, что все параметры шаблона" +" заключены в двойные фигурные скобки, например, \"{{ from_dttm }}\". " +"Затем попробуйте повторно выполнить запрос." -#: superset/db_engine_specs/athena.py:55 -#: superset/db_engine_specs/bigquery.py:179 -#: superset/db_engine_specs/postgres.py:158 -#: superset/db_engine_specs/snowflake.py:104 +#: superset/db_engine_specs/athena.py:56 +#: superset/db_engine_specs/bigquery.py:191 +#: superset/db_engine_specs/postgres.py:140 +#: superset/db_engine_specs/snowflake.py:113 #, python-format msgid "" "Please check your query for syntax errors at or near " "\"%(syntax_error)s\". Then, try running your query again." msgstr "" +"Пожалуйста, проверьте ваш запрос на синтаксические ошибки возле символа " +"\"%(syntax_error)s\". Затем выполните запрос заново." -#: superset/db_engine_specs/gsheets.py:74 superset/db_engine_specs/mysql.py:144 +#: superset/db_engine_specs/gsheets.py:80 superset/db_engine_specs/mysql.py:168 #, python-format msgid "" "Please check your query for syntax errors near \"%(server_error)s\". " "Then, try running your query again." msgstr "" +"Пожалуйста, проверьте ваш запрос на наличие синтаксических ошибок рядом с" +" \"%(server_error)s\". Затем выполните запрос заново" + +#: superset/sqllab/query_render.py:38 superset/views/core.py:197 +msgid "" +"Please check your template parameters for syntax errors and make sure " +"they match across your SQL query and Set Parameters. Then, try running " +"your query again." +msgstr "" +"Пожалуйста, проверьте параметры вашего шаблона на наличие синтаксических " +"ошибок и убедитесь, что они совпадают с вашим SQL-запросом и заданными " +"параметрами. Затем попробуйте выполнить свой запрос еще раз." -#: superset/viz.py:879 -msgid "Please choose at least one 'Group by' field " -msgstr "Пожалуйста, выберите хотя бы один срез в поле ‘Группировка’ " +#: superset/viz.py:908 +msgid "Please choose at least one 'Group by' field" +msgstr "Выберите хотя бы одно поле \"Группировать по\"" -#: superset/viz.py:891 +#: superset/viz.py:3227 +#, fuzzy +msgid "Please choose at least one groupby" +msgstr "Выберите хотя бы одно поле \"Группировать по\"" + +#: superset/viz.py:920 msgid "Please choose at least one metric" -msgstr "Пожалуйста, выберите хотя бы один показатель" +msgstr "Выберите хотя бы одну меру" -#: superset/viz.py:1578 +#: superset/viz.py:1607 msgid "Please choose different metrics on left and right axis" -msgstr "Пожалуйста, выберите разные срезы данных для левой и правой оси" +msgstr "Выберите разные меры для левой и правой осей" + +#: superset-frontend/src/pages/ChartList/ChartCard.tsx:80 +#: superset-frontend/src/pages/ChartList/index.tsx:476 +#: superset-frontend/src/pages/ChartList/index.tsx:796 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:584 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:297 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:357 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:327 +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:104 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:370 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:650 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:768 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:503 +msgid "Please confirm" +msgstr "Пожалуйста, подтвердите действие" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:94 -msgid "Please complete all required fields." +#: superset-frontend/src/dashboard/actions/dashboardState.js:442 +msgid "Please confirm the overwrite values." msgstr "" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:485 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:300 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:365 -#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:77 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:357 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:644 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:325 -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:105 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:355 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:611 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:617 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:499 -msgid "Please confirm" -msgstr "Пожалуйста, подтвердите" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:485 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:597 msgid "Please enter a SQLAlchemy URI to test" -msgstr "Введите SQLAlchemy URI для теста" - -#: superset-frontend/src/explore/components/SaveModal.tsx:133 -msgid "Please enter a chart name" -msgstr "Введите имя графика" +msgstr "Введите SQLAlchemy URI для тестирования" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:81 -#, fuzzy msgid "Please filter set name" -msgstr "Введите имя графика" +msgstr "Введите имя набора фильтров" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:122 -msgid "Please make sure all fields are filled out correctly" -msgstr "" - -#: superset/db_engine_specs/postgres.py:122 +#: superset/db_engine_specs/postgres.py:104 msgid "Please re-enter the password." +msgstr "Пожалуйста, введите пароль еще раз" + +#: superset-frontend/src/views/CRUD/hooks.ts:423 +msgid "Please re-export your file and try importing again" msgstr "" #: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:59 #: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:72 msgid "Please reach out to the Chart Owner for assistance." -msgstr "Пожалуйста, обратитесь к создателю графика за дополнительной информацией." +msgid_plural "Please reach out to the Chart Owners for assistance." +msgstr[0] "Пожалуйста, обратитесь к создателю графика за помощью." +msgstr[1] "Пожалуйста, обратитесь к создателям графика за помощью." +msgstr[2] "Пожалуйста, обратитесь к создателям графика за помощью." -#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:75 +#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:85 msgid "Please save the query to enable sharing" -msgstr "Пожалуйста, сохраните запрос, чтобы включить функцию “поделиться”" +msgstr "Пожалуйста, сохраните запрос, чтобы включить функцию \"поделиться\"" -#: superset/reports/commands/exceptions.py:90 +#: superset/reports/commands/exceptions.py:105 msgid "Please save your chart first, then try creating a new email report." msgstr "" +"Пожалуйста, сначала сохраните график перед тем, как создавать новую " +"рассылку." -#: superset/reports/commands/exceptions.py:102 +#: superset/reports/commands/exceptions.py:117 msgid "Please save your dashboard first, then try creating a new email report." msgstr "" +"Пожалуйста, сначала сохраните дашборд перед тем, как создавать новую " +"рассылку." -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:322 +#: superset-frontend/src/pages/ChartCreation/index.tsx:415 msgid "Please select both a Dataset and a Chart type to proceed" -msgstr "" +msgstr "Пожалуйста, для продолжения выберите и датасет, и тип графика" -#: superset/viz.py:1161 +#: superset/viz.py:1190 msgid "Please use 3 different metric labels" -msgstr "Пожалуйста, выберите разные срезы данных для левой и правой оси" +msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:104 -msgid "Please verify that port is open to connect." +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:27 +msgid "Plot the distance (like flight paths) between origin and destination." msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:27 +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:29 msgid "" "Plots the individual metrics for each row in the data vertically and " "links them together as a line. This chart is useful for comparing " "multiple metrics across all of the samples or rows in the data." msgstr "" -#: superset/initialization/__init__.py:254 +#: superset/initialization/__init__.py:271 msgid "Plugins" msgstr "Плагины" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:108 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:132 +msgid "Point Color" +msgstr "Цвет маркера" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:118 msgid "Point Radius" -msgstr "" +msgstr "Радиус маркера" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/controlPanel.ts:80 +msgid "Point Radius Scale" +msgstr "Шкала радиуса маркера" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:132 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:140 msgid "Point Radius Unit" -msgstr "" +msgstr "Единица измерения радиуса маркера" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:101 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:71 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:320 +msgid "Point Size" +msgstr "Размер маркера" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:79 +msgid "Point Unit" +msgstr "Единица измерения маркера" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:66 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:309 +msgid "Point to your spatial columns" +msgstr "Указание на столбцы с расположением" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:111 msgid "Points" -msgstr "Компоненты" +msgstr "Маркеры" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:201 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:213 msgid "Points and clusters will update as the viewport is being changed" -msgstr "" +msgstr "Точки и кластеры будут обновляться по мере изменения области просмотра" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:68 +#, fuzzy +msgid "Polygon Column" +msgstr "столбец" -#: superset/views/sql_lab.py:74 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:77 +#, fuzzy +msgid "Polygon Encoding" +msgstr "Выполняется рассылка" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:106 +msgid "Polygon Settings" +msgstr "Настройки полигона" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/controlPanel.ts:55 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:350 +#, fuzzy +msgid "Polyline" +msgstr "Линия" + +#: superset/views/sql_lab/views.py:87 +#, fuzzy msgid "Pop Tab Link" -msgstr "Открыть" +msgstr "Скопировать ссылку" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:44 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:40 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:46 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:52 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:44 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:42 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:70 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:85 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:86 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:77 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:78 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:89 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:85 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:57 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:47 -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:124 +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:130 msgid "Popular" -msgstr "" +msgstr "Популярно" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:170 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:173 msgid "Populate \"Default value\" to enable this control" msgstr "" @@ -9123,85 +11237,77 @@ msgstr "" msgid "Population age data" msgstr "" -#: superset/db_engine_specs/mssql.py:87 -#: superset/db_engine_specs/postgres.py:132 -#: superset/db_engine_specs/presto.py:213 -#: superset/db_engine_specs/redshift.py:73 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:69 +msgid "Port" +msgstr "Порт" + +#: superset/db_engine_specs/mssql.py:98 +#: superset/db_engine_specs/postgres.py:114 +#: superset/db_engine_specs/presto.py:645 +#: superset/db_engine_specs/redshift.py:77 #, python-format msgid "Port %(port)s on hostname \"%(hostname)s\" refused the connection." -msgstr "" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:103 -#, fuzzy -msgid "Port is closed" -msgstr "Рассылка не удалась" +msgstr "Порт %(port)s хоста \"%(hostname)s\" отказал в подключении." #: superset/views/dashboard/mixin.py:87 +#, fuzzy msgid "Position JSON" -msgstr "Позиция JSON" +msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:181 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:182 msgid "Position of child node label on tree" -msgstr "" +msgstr "Расположение метки дочерней вершины на дереве" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:310 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:375 msgid "Position of column level subtotal" -msgstr "" +msgstr "Расположение промежуточного итога на уровне столбца" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:163 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:164 msgid "Position of intermidiate node label on tree" msgstr "" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:293 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:358 msgid "Position of row level subtotal" -msgstr "" +msgstr "Расположение промежуточного итога на уровне строки" -#: superset-frontend/src/components/Menu/MenuRight.tsx:180 +#: superset-frontend/src/views/components/RightMenu.tsx:512 msgid "Powered by Apache Superset" -msgstr "" +msgstr "На базе Apache Superset" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1096 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:937 msgid "Pre-filter" -msgstr "Временной фильтр" +msgstr "Предварительная фильтрация" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1061 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:902 msgid "Pre-filter available values" -msgstr "" +msgstr "Предварительно выбрать доступные значения для фильтра" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:623 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:652 msgid "Pre-filter is required" -msgstr "Тип обязателен" +msgstr "Предварительная фильтрация обязательна" -#: superset/connectors/sqla/views.py:451 +#: superset/connectors/sqla/views.py:441 msgid "" "Predicate applied when fetching distinct value to populate the filter " "control component. Supports jinja template syntax. Applies only when " "`Enable Filter Select` is on." msgstr "" -"Предикат применяется при получении значений для компонента - «Фильтр». " -"Поддерживает синтаксис jinja. Применяется только в том случае, если " -"включен параметр «Включить Онлайн Фильтр»." #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:44 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:39 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:75 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:78 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:78 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:72 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:72 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:74 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:41 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:75 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:79 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:79 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:70 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:69 msgid "Predictive" -msgstr "Действия" +msgstr "Прогноз" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:36 -#, fuzzy msgid "Predictive Analytics" -msgstr "Расширенный анализ" +msgstr "Предиктивная аналитика" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:64 msgid "Prefix metric name with slice name" @@ -9209,39 +11315,61 @@ msgstr "" #: superset-frontend/src/dashboard/components/menu/MarkdownModeDropdown.tsx:39 msgid "Preview" -msgstr "Предпросмотр %s" +msgstr "Предпросмотр" -#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:166 +#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:209 #, python-format msgid "Preview: `%s`" -msgstr "Предпросмотр %s" +msgstr "Предпросмотр «%s»" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:32 -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:125 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:105 +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:126 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:106 msgid "Previous" -msgstr "Предпросмотр %s" +msgstr "Предыдущий" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:243 -#, fuzzy +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:337 +msgid "Previous Line" +msgstr "Предыдущая строка" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:245 msgid "Primary" -msgstr "Пятница" +msgstr "Первичная" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:56 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:61 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:158 msgid "Primary Metric" -msgstr "Показатель" +msgstr "Основная мера" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:248 +#: superset-frontend/src/SqlLab/components/ColumnElement/index.tsx:63 +msgid "Primary key" +msgstr "Первичный ключ" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:251 msgid "Primary or secondary y-axis" -msgstr "" +msgstr "Первичная или вторичная ось Y" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:371 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:387 msgid "Primary y-axis format" -msgstr "" +msgstr "Формат первичной оси Y" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:217 +msgid "Private Key" +msgstr "Приватный ключ" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:174 +msgid "Private Key & Password" +msgstr "Приватный ключ и пароль" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:234 +msgid "Private Key Password" +msgstr "Пароль приватного ключа" -#: superset-frontend/src/components/Menu/MenuRight.tsx:161 -#: superset/templates/appbuilder/navbar_right.html:109 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:269 +msgid "Proceed" +msgstr "Продолжить" + +#: superset-frontend/src/views/components/RightMenu.tsx:493 msgid "Profile" msgstr "Профиль" @@ -9249,258 +11377,269 @@ msgstr "Профиль" msgid "Profile picture provided by Gravatar" msgstr "Изображение профиля, сгенерированное сервисом Gravatar" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:239 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:235 msgid "Progress" -msgstr "" +msgstr "Прогресс" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:30 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:56 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:32 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:58 msgid "Progressive" -msgstr "" +msgstr "Постепенный" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:55 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:59 msgid "Propagate" msgstr "" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:39 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:30 #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:42 #: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:46 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:50 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:43 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:44 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:71 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/index.ts:46 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:64 msgid "Proportional" -msgstr "" +msgstr "Пропорция" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:86 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:85 msgid "Public and privately shared sheets" msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:83 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:82 msgid "Publicly shared sheets only" msgstr "" #: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:101 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:301 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:498 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:316 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:529 #: superset/views/dashboard/mixin.py:84 msgid "Published" msgstr "Опубликовано" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:44 +msgid "Purple" +msgstr "Фиолетовый" + #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:109 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:161 msgid "Put labels outside" -msgstr "" +msgstr "Вынести метки наружу" #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:164 msgid "Put the labels outside of the pie?" -msgstr "" +msgstr "Вынести метки за пределы диаграммы" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:112 msgid "Put the labels outside the pie?" -msgstr "" +msgstr "Вынести метки за пределы диаграммы" #: superset-frontend/src/explore/controlPanels/Separator.js:47 msgid "Put your code here" msgstr "Введите произвольный текст в формате html или markdown" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:351 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:234 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:485 -#, fuzzy -msgid "Python Functions" -msgstr "Python функции" - -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:233 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:300 msgid "Python datetime string pattern" +msgstr "Шаблон строки даты и времени Python" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1367 +msgid "QUERY DATA IN SQL LAB" msgstr "" -#: superset-frontend/src/explore/controlPanels/sections.tsx:248 -msgid "Python functions" -msgstr "Python функции" - -#: superset/db_engine_specs/base.py:99 -#, fuzzy +#: superset/db_engine_specs/base.py:113 msgid "Quarter" -msgstr "запрос" +msgstr "Квартал" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:69 -#, fuzzy, python-format +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:68 +#, python-format msgid "Quarters %s" -msgstr "Параметры графика: %s" +msgstr "Кварталов %s" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/echartsTimeSeriesQuery.tsx:41 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/echartsTimeSeriesQuery.tsx:51 #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:32 -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:32 -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:91 -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:65 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:60 +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:30 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:33 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:90 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:66 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:46 #: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:30 -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:45 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:55 #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:26 #: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:26 #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:36 -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:33 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:32 #: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:34 #: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:26 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:30 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:31 #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:31 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:30 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:34 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:32 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:44 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:32 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/controlPanel.js:63 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:44 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts:43 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:43 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/controlPanel.ts:41 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:60 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts:43 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:45 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:46 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:60 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:158 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:341 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:361 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:29 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:43 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:34 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:44 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:33 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:35 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:43 #: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:41 #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:34 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:44 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:45 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:48 #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:59 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:56 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:52 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:53 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:59 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:60 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:42 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:38 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:43 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:38 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:41 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:179 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:26 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:30 -#: superset-frontend/src/explore/controlPanels/TimeTable.js:26 -#: superset-frontend/src/explore/controlPanels/sections.tsx:113 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controlPanel.tsx:53 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:44 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:152 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:30 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:26 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1453 +#: superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx:62 +#: superset-frontend/src/explore/controlPanels/sections.tsx:94 #: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:34 #: superset-frontend/src/filters/components/Range/controlPanel.ts:31 #: superset-frontend/src/filters/components/Select/controlPanel.ts:41 #: superset-frontend/src/filters/components/Time/controlPanel.ts:29 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:178 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:177 +#: superset-frontend/src/visualizations/TimeTable/controlPanel.js:26 msgid "Query" msgstr "Запрос" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:253 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:378 #, python-format msgid "Query %s: %s" -msgstr "" +msgstr "Запрос %s: %s" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:258 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:283 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:288 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:299 msgid "Query A" -msgstr "запрос" +msgstr "Запрос А" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:259 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:284 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:290 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:300 msgid "Query B" -msgstr "запрос" +msgstr "Запрос Б" -#: superset/initialization/__init__.py:341 +#: superset/initialization/__init__.py:361 msgid "Query History" msgstr "История запросов" -#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:197 -#: superset-frontend/src/views/CRUD/data/common.ts:44 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:89 +#: superset/commands/exceptions.py:138 +msgid "Query does not exist" +msgstr "Запрос не существует" + +#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:244 +#: superset-frontend/src/views/CRUD/data/common.ts:32 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:95 msgid "Query history" msgstr "История запросов" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:722 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:128 +msgid "Query imported" +msgstr "Запрос импортирован" + +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:462 msgid "Query in a new tab" msgstr "Запрос в отдельной вкладке" -#: superset/errors.py:125 +#: superset/errors.py:131 msgid "Query is too complex and takes too long to run." -msgstr "" +msgstr "Запрос слишком тяжелый для выполнения и займет много времени." -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:89 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/queryMode.tsx:29 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:90 msgid "Query mode" -msgstr "Имя запроса" +msgstr "Режим запроса" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:125 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:127 msgid "Query name" msgstr "Имя запроса" +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:323 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:325 #: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:117 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:376 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:377 #: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:97 msgid "Query preview" -msgstr "Предпросмотр данных" +msgstr "Предпросмотр запроса" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "Поиск запросов" - -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 -#, fuzzy +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:419 msgid "Query was stopped" -msgstr "Запрос прерван." +msgstr "Запрос прерван" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:407 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:468 msgid "Query was stopped." -msgstr "Запрос прерван." +msgstr "Запрос прерван" -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:292 -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:294 +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:284 +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:286 msgid "RANGE TYPE" msgstr "ТИП ИНТЕРВАЛА" -#: superset-frontend/src/components/ReportModal/index.tsx:327 -#, fuzzy -msgid "REPORT NAME ERROR" -msgstr "Имя Шаблона" - -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:251 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:263 msgid "RGB Color" -msgstr "Фиксированный цвет" +msgstr "Цвет RGB" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:161 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:160 msgid "Radar" -msgstr "" +msgstr "Радар" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:53 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:56 msgid "Radar Chart" -msgstr "Поделиться графиком" +msgstr "Диаграмма радар" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:201 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:203 msgid "Radar render type, whether to display 'circle' shape." msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:121 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:122 #, fuzzy msgid "Radial" msgstr "Ошибка" -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:318 -#, fuzzy, python-format +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:87 +msgid "Radius in kilometers" +msgstr "Радиус в километрах" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:86 +msgid "Radius in meters" +msgstr "Радиус в метрах" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:88 +msgid "Radius in miles" +msgstr "Радиус в милях" + +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:292 +#, python-format msgid "Ran %s" -msgstr "Продолжительность: %s" +msgstr "Запущен %s" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:35 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:38 #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:55 -#, fuzzy msgid "Range" -msgstr "Управление" +msgstr "Интервал" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:295 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:316 #: superset-frontend/src/filters/components/Range/index.ts:28 -#, fuzzy msgid "Range filter" -msgstr "Временной фильтр" +msgstr "Диапазон" #: superset-frontend/src/filters/components/Range/index.ts:29 msgid "Range filter plugin using AntD" @@ -9508,41 +11647,43 @@ msgstr "" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:48 msgid "Range labels" -msgstr "" +msgstr "Метки диапазона" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:39 -#, fuzzy msgid "Ranges" -msgstr "Управление" +msgstr "Диапазоны" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:41 msgid "Ranges to highlight with shading" -msgstr "" +msgstr "Диапазоны для выделения с помощью затенения" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:25 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:25 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:28 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:48 +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:27 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:27 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:33 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:50 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:33 -#, fuzzy msgid "Ranking" -msgstr "Предупреждение!" +msgstr "Ранжирование" -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:63 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:143 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:335 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:217 +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:53 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:487 +#: superset-frontend/src/explore/controlPanels/sections.tsx:213 msgid "Ratio" -msgstr "Продолжительность" +msgstr "Отношение" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:46 +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:58 msgid "Raw records" -msgstr "" +msgstr "Сырые записи" #: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:64 #, fuzzy msgid "Ready to review filters in this dashboard?" msgstr "В этом дашборде нет фильтров." -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:78 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:86 msgid "Rebuild" msgstr "" @@ -9550,618 +11691,694 @@ msgstr "" msgid "Recent activity" msgstr "Последние действия" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:86 +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:95 msgid "Recently created charts, dashboards, and saved queries will appear here" -msgstr "Недавно созданные графики, дашборды и сохранённые запросы" +msgstr "Недавно созданные графики, дашборды и сохраненные запросы" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:96 +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:106 msgid "Recently edited charts, dashboards, and saved queries will appear here" -msgstr "Недавно изменённые графики, дашборды и сохранённые запросы" +msgstr "Недавно измененные графики, дашборды и сохраненные запросы" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:561 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:535 -#, fuzzy +#: superset-frontend/src/pages/ChartList/index.tsx:702 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:561 msgid "Recently modified" -msgstr "Изменено" +msgstr "Измененные недавно" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:81 +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:90 msgid "Recently viewed charts, dashboards, and saved queries will appear here" -msgstr "Недавно просмотренные графики, дашборды и сохранённые запросы" +msgstr "Недавно просмотренные графики, дашборды и сохраненные запросы" -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:277 +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:359 msgid "Recents" -msgstr "Последние" - -#: superset/views/schedules.py:242 superset/views/schedules.py:322 -msgid "Recipients" -msgstr "Получатели" +msgstr "Недавние" #: superset-frontend/src/views/CRUD/alert/components/NotificationMethod.tsx:160 msgid "Recipients are separated by \",\" or \";\"" -msgstr "Получатели, разделенные “,” или “;”" +msgstr "Получатели, разделенные \",\" или \";\"" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:597 +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:673 msgid "Recommended tags" -msgstr "" +msgstr "Рекомендованные теги" #: superset/templates/appbuilder/general/widgets/base_list.html:55 msgid "Record Count" -msgstr "Количество записей" +msgstr "Кол-во записей" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:222 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:223 msgid "Rectangle" -msgstr "" - -#: superset/connectors/druid/views.py:330 -msgid "" -"Redirects to this endpoint when clicking on the datasource from the " -"datasource list" -msgstr "" -"Перенаправление на эту конечную точку при нажатии на источник данных из " -"списка источников данных" +msgstr "Прямоугольник" -#: superset/connectors/sqla/views.py:457 +#: superset/connectors/sqla/views.py:447 msgid "Redirects to this endpoint when clicking on the table from the table list" msgstr "" -"Перенаправление на эту конечную точку при нажатии на таблицу в общем " -"списке" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:316 +#: superset-frontend/src/dashboard/components/Header/index.jsx:573 +msgid "Redo the action" +msgstr "Повторить действие" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:336 msgid "Reduce X ticks" -msgstr "" +msgstr "Уменьшить кол-во делений оси X" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:319 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:339 msgid "" "Reduces the number of X-axis ticks to be rendered. If true, the x-axis " "will not overflow and labels may be missing. If false, a minimum width " "will be applied to columns and the width may overflow into an horizontal " "scroll." msgstr "" +"Уменьшает количество отрисованных делений на оси X. Если флажок " +"установлен, некоторые метки могут быть не отображены. " -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:78 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:93 msgid "Refer to the" -msgstr "Обратитесь сюда " +msgstr "Обратитесь к" -#: superset/utils/pandas_postprocessing.py:143 +#: superset/utils/pandas_postprocessing/utils.py:125 msgid "Referenced columns not available in DataFrame." -msgstr "Ссылочные столбца недоступны в DataFrame." +msgstr "" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:799 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:546 msgid "Refetch results" -msgstr "Результаты поиска" +msgstr "Выполнить запрос повторно" #: superset/templates/appbuilder/general/widgets/search.html:57 msgid "Refresh" -msgstr "Принудительное обновление" - -#: superset/initialization/__init__.py:542 -msgid "Refresh Druid Metadata" -msgstr "Обновить Метаданные Druid" - -#: superset/connectors/sqla/views.py:565 -msgid "Refresh Metadata" -msgstr "Обновить метаданные" - -#: superset/connectors/sqla/views.py:565 -msgid "Refresh column metadata" -msgstr "Обновить метаданные столбцов" +msgstr "Обновить" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:276 +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:261 msgid "Refresh dashboard" msgstr "Обновить дашборд" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:117 +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:114 msgid "Refresh frequency" -msgstr "Частота" +msgstr "Частота обновления" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:114 -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:119 +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:111 +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:116 msgid "Refresh interval" msgstr "Интервал обновления" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:976 +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:79 +msgid "Refresh interval saved" +msgstr "Интервал обновления сохранен" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/index.tsx:250 +msgid "Refresh table list" +msgstr "Обновить список таблиц" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/index.tsx:251 +msgid "Refresh tables" +msgstr "Обновить таблицы" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1225 msgid "Refresh the default values" -msgstr "" +msgstr "Обновить значения по умолчанию" -#: superset/connectors/druid/views.py:420 -msgid "Refreshed metadata from cluster [{}]" -msgstr "Обновлённые метаданные из кластера [{}]" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:168 +msgid "Refreshing charts" +msgstr "Обновление графиков" -#: superset/connectors/druid/models.py:259 -msgid "Refreshing datasource [{}]" -msgstr "Обновление источника данных [{}]" +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.tsx:175 +msgid "Refreshing columns" +msgstr "Обновление столбцов" -#: superset/connectors/sqla/views.py:335 +#: superset-frontend/src/explore/constants.ts:78 +#, fuzzy +msgid "Regex" +msgstr "Зеленая" + +#: superset/connectors/sqla/views.py:330 +#, fuzzy msgid "" "Regular filters add where clauses to queries if a user belongs to a role " "referenced in the filter. Base filters apply filters to all queries " "except the roles defined in the filter, and can be used to define what " "users can see if no RLS filters within a filter group apply to them." msgstr "" +"Обычные фильтры добавляют операторы where к запросам, если пользователь " +"принадлежит к роли, на которую ссылается фильтр. Базовые фильтры " +"применяют фильтры ко всем запросам, кроме ролей, определенных в фильтре, " +"и могут использоваться для определения того, что пользователи могут " +"видеть, если к ним не применяются фильтры RLS в группе фильтров." #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:40 -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:34 #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:43 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:44 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:33 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:46 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:44 -#, fuzzy msgid "Relational" -msgstr "Продолжительность" +msgstr "Относительный" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:32 #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:35 msgid "Relationships between community channels" msgstr "" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:91 -#, fuzzy +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:88 msgid "Relative Date/Time" -msgstr "Относительное количество" +msgstr "Относительная дата/время" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:157 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:210 -#, fuzzy +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:171 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:223 msgid "Relative period" -msgstr "Период" +msgstr "Относительный период" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:145 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:198 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:159 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:211 msgid "Relative quantity" msgstr "Относительное количество" +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailTableControls.tsx:133 +msgid "Reload" +msgstr "Обновить" + #: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:69 msgid "Remind me in 24 hours" -msgstr "" +msgstr "Напомните мне через 24 часа" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:779 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:830 msgid "Remove" -msgstr "" +msgstr "Удалить" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:77 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:85 msgid "Remove invalid filters" -msgstr "" +msgstr "Удалить недействующие фильтры" #: superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:142 msgid "Remove item" -msgstr "" +msgstr "Удалить элемент" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:282 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:288 msgid "Remove query from log" -msgstr "Удалить запрос из журнала" +msgstr "Удалить запрос из истории" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:211 +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:240 msgid "Remove table preview" msgstr "Убрать предпросмотр таблицы" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:609 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:771 #, python-format msgid "Removed columns: %s" msgstr "Удалённые столбцы: %s" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:345 +#: superset-frontend/src/SqlLab/components/SqlEditorTabHeader/index.tsx:113 msgid "Rename tab" msgstr "Переименовать вкладку" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:146 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:147 msgid "Rendering" -msgstr "Направление сортировки" +msgstr "Отрисовка" -#: superset/views/database/forms.py:146 superset/views/database/forms.py:299 -#: superset/views/database/forms.py:427 +#: superset/views/database/forms.py:168 superset/views/database/forms.py:325 +#: superset/views/database/forms.py:456 msgid "Replace" msgstr "Заменить" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:36 -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:36 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:41 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:46 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:31 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:57 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:48 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:59 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:38 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:39 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:33 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:45 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:43 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:59 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:51 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:62 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:57 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:48 -#, fuzzy +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:574 +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:163 msgid "Report" -msgstr "рассылка" +msgstr "Отчет" -#: superset/reports/commands/exceptions.py:118 +#: superset-frontend/src/components/ReportModal/index.tsx:276 +msgid "Report Name" +msgstr "Имя отчета" + +#: superset/reports/commands/exceptions.py:134 msgid "Report Schedule could not be created." -msgstr "Рассылка не может быть создана." +msgstr "Невозможно удалить расписание отчета." -#: superset/reports/commands/exceptions.py:114 +#: superset/reports/commands/exceptions.py:130 msgid "Report Schedule could not be deleted." -msgstr "Рассылка не может быть удалена." +msgstr "Невозможно удалить расписание отчета." -#: superset/reports/commands/exceptions.py:122 +#: superset/reports/commands/exceptions.py:138 msgid "Report Schedule could not be updated." -msgstr "Рассылка не может быть обновлена." +msgstr "Невозможно обновить расписание отчета" -#: superset/reports/commands/exceptions.py:130 +#: superset/reports/commands/exceptions.py:147 msgid "Report Schedule delete failed." -msgstr "Удаление графика рассылки не удалось." +msgstr "Ошибка при удалении расписания отчета." -#: superset/reports/commands/exceptions.py:142 -#, fuzzy +#: superset/reports/commands/exceptions.py:159 msgid "Report Schedule execution failed when generating a csv." -msgstr "Ошибка при генерировании скриншота во время выполнения рассылки." +msgstr "Возникла ошибка при создании csv для отправки отчета" -#: superset/reports/commands/exceptions.py:146 -#, fuzzy +#: superset/reports/commands/exceptions.py:163 msgid "Report Schedule execution failed when generating a dataframe." -msgstr "Ошибка при генерировании скриншота во время выполнения рассылки." +msgstr "Возникла ошибка при создании датафрейма для отправки отчета" -#: superset/reports/commands/exceptions.py:138 +#: superset/reports/commands/exceptions.py:155 msgid "Report Schedule execution failed when generating a screenshot." -msgstr "Ошибка при генерировании скриншота во время выполнения рассылки." +msgstr "Возникла ошибка при создании скриншота для отправки отчета" -#: superset/reports/commands/exceptions.py:150 +#: superset/reports/commands/exceptions.py:167 msgid "Report Schedule execution got an unexpected error." -msgstr "Во время выполнения рассылки произошла непредвиденная ошибка." +msgstr "Возникла неожиданная ошибка при отправке отчета" -#: superset/reports/commands/exceptions.py:154 +#: superset/reports/commands/exceptions.py:172 msgid "Report Schedule is still working, refusing to re-compute." -msgstr "" +msgstr "Планировщик отчетов все еще работает, не имея возможности отправить отчет" -#: superset/reports/commands/exceptions.py:134 +#: superset/reports/commands/exceptions.py:151 msgid "Report Schedule log prune failed." -msgstr "Удаление журнала рассылки не удалось." +msgstr "" -#: superset/reports/commands/exceptions.py:126 +#: superset/reports/commands/exceptions.py:143 msgid "Report Schedule not found." -msgstr "График рассылки не найден." +msgstr "Расписание отчета не найдено" -#: superset/reports/commands/exceptions.py:110 +#: superset/reports/commands/exceptions.py:126 msgid "Report Schedule parameters are invalid." -msgstr "Параметры графика рассылки недействительны." +msgstr "Параметры расписания отчета неверны." -#: superset/reports/commands/exceptions.py:158 +#: superset/reports/commands/exceptions.py:177 msgid "Report Schedule reached a working timeout." -msgstr "Рассылка достигла тайм-аута в работе." - -#: superset/reports/commands/exceptions.py:226 -msgid "Report Schedule sellenium user not found" -msgstr "Пользователь Selenium для графика рассылки не найден" +msgstr "Достигнут таймаут для отчета" -#: superset/reports/commands/exceptions.py:230 +#: superset/reports/commands/exceptions.py:257 msgid "Report Schedule state not found" -msgstr "Не найдено состояние графика рассылки" +msgstr "Состояние расписания отчета не найдено" -#: superset-frontend/src/components/Menu/MenuRight.tsx:225 -#, fuzzy +#: superset-frontend/src/views/components/RightMenu.tsx:564 msgid "Report a bug" -msgstr "рассылка" +msgstr "Сообщить об ошибке" #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:81 msgid "Report failed" msgstr "Рассылка не удалась" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1064 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1072 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:395 msgid "Report name" -msgstr "Имя Шаблона" +msgstr "Имя отчета" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1214 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:407 msgid "Report schedule" -msgstr "Область просмотра" +msgstr "Расписание отчета" + +#: superset/reports/commands/exceptions.py:268 +msgid "Report schedule client error" +msgstr "Возникла ошибка расписания отчета на стороне клиента" -#: superset/reports/commands/exceptions.py:234 +#: superset/reports/commands/exceptions.py:262 +msgid "Report schedule system error" +msgstr "Возникла ошибка расписания отчета на стороне системы" + +#: superset/reports/commands/exceptions.py:272 msgid "Report schedule unexpected error" -msgstr "Неожиданная ошибка графика рассылки" +msgstr "Неожиданная ошибка расписания отчета" #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:74 msgid "Report sending" -msgstr "Выполняется рассылка" +msgstr "Отчет выполняется" #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:67 msgid "Report sent" -msgstr "Рассылка отправлена" +msgstr "Отчет отправлен" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:443 +#: superset-frontend/src/reports/actions/reports.js:121 +msgid "Report updated" +msgstr "Отчет обновлен" + +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:542 msgid "Reports" -msgstr "Рассылки" +msgstr "Отчеты" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:283 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:284 msgid "Repulsion" -msgstr "Выражение SQL" +msgstr "Отталкивание" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:289 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:290 msgid "Repulsion strength between nodes" -msgstr "" +msgstr "Сила отталкивания вершин" #: superset/templates/superset/request_access.html:31 msgid "Request Permissions" -msgstr "Запросить права доступа" +msgstr "" -#: superset/charts/data/api.py:145 superset/charts/data/api.py:233 -#: superset/charts/data/api.py:297 +#: superset/charts/data/api.py:152 superset/charts/data/api.py:242 +#: superset/charts/data/api.py:308 #, python-format msgid "Request is incorrect: %(error)s" -msgstr "Запрос некорректен: %(error)s" +msgstr "Неверный запрос: %(error)s" -#: superset/charts/data/api.py:222 +#: superset/charts/data/api.py:229 msgid "Request is not JSON" -msgstr "Запрос не в формате JSON" +msgstr "Запрос не является JSON" -#: superset/views/datasource/views.py:71 +#: superset/views/datasource/views.py:75 msgid "Request missing data field." -msgstr "" +msgstr "В запросе отсутствует поле с данными." -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:93 -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:97 -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:104 +#: superset-frontend/src/utils/getClientErrorObject.ts:144 +msgid "Request timed out" +msgstr "Вышло время запроса" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:94 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:98 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:105 #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:252 -#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:73 -#: superset-frontend/src/filters/components/Range/controlPanel.ts:55 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:91 -#: superset-frontend/src/filters/components/Time/controlPanel.ts:53 -#: superset-frontend/src/filters/components/TimeColumn/controlPanel.ts:33 -#: superset-frontend/src/filters/components/TimeGrain/controlPanel.ts:33 msgid "Required" msgstr "Обязательно" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:137 -#, fuzzy +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:341 +msgid "Required control values have been removed" +msgstr "Обязательные значения были удалены" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:153 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:345 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:227 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:497 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:226 +#: superset-frontend/src/explore/controlPanels/sections.tsx:223 msgid "Resample" -msgstr "Посмотреть примеры" +msgstr "Ресемплирование (изменение частоты данных)" + +#: superset/utils/pandas_postprocessing/resample.py:46 +msgid "Resample method should in " +msgstr "" -#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:231 +#: superset/utils/pandas_postprocessing/resample.py:43 +msgid "Resample operation requires DatetimeIndex" +msgstr "Для ресемплирования требуется индекс формата дата/время" + +#: superset-frontend/src/components/Table/index.tsx:257 +msgid "Reset" +msgstr "Сбросить" + +#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx:289 msgid "Reset state" msgstr "Сбросить текущее состояние" +#: superset/reports/commands/exceptions.py:194 +msgid "Resource already has an attached report." +msgstr "Для этого компонента уже создан отчет." + +#: superset/temporary_cache/commands/exceptions.py:49 +msgid "Resource was not found." +msgstr "Источник не был найден." + #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/RemovedFilter.tsx:46 -#, fuzzy msgid "Restore Filter" -msgstr "Фильтр результатов" +msgstr "Восстановить фильтр" -#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:194 +#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:241 +#: superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx:204 +#: superset-frontend/src/explore/components/DataTablesPane/components/ResultsPaneOnDashboard.tsx:76 msgid "Results" msgstr "Результаты" -#: superset/sql_lab.py:375 superset/views/core.py:2251 +#: superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx:212 +#: superset-frontend/src/explore/components/DataTablesPane/components/ResultsPaneOnDashboard.tsx:84 +#, python-format +msgid "Results %s" +msgstr "Результаты %s" + +#: superset/sql_lab.py:410 superset/sqllab/commands/results.py:60 +#: superset/views/core.py:2108 msgid "Results backend is not configured." -msgstr "" +msgstr "Results backend не нестроен" -#: superset/errors.py:116 +#: superset/errors.py:122 msgid "Results backend needed for asynchronous queries is not configured." -msgstr "" +msgstr "Сервер, необходимый для асинхронных запросов, не настроен." #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:29 msgid "Return to specific datetime." msgstr "" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:361 +msgid "Reverse Lat & Long" +msgstr "Поменять местами широту и долготу" + #: superset-frontend/src/explore/components/controls/SpatialControl.jsx:155 msgid "Reverse lat/long " -msgstr "Поменять местами широту и долготу " +msgstr "Поменять местами широту и долготу" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:230 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:100 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:281 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:223 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:92 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:301 msgid "Rich Tooltip" -msgstr "" +msgstr "Расширенная всплывающая подсказка" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:149 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:175 msgid "Rich tooltip" -msgstr "" +msgstr "Расширенная всплывающая подсказка" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:113 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:307 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:102 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:86 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:372 msgid "Right" -msgstr "Высота" +msgstr "Справа" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:53 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:52 msgid "Right Axis Format" -msgstr "Показатель для правой оси" +msgstr "Формат правой оси" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:119 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:183 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:181 msgid "Right Axis Metric" -msgstr "Показатель для правой оси" +msgstr "Мера для правой оси" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:132 -#, fuzzy msgid "Right Axis chart(s)" -msgstr "Показатель для правой оси" +msgstr "График(и) по правой оси" -#: superset-frontend/src/explore/controls.jsx:215 +#: superset-frontend/src/explore/controls.jsx:214 msgid "Right axis metric" -msgstr "Показатель для правой оси" +msgstr "Мера для правой оси" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:138 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:139 msgid "Right to Left" -msgstr "" +msgstr "Справа налево" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:160 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:157 msgid "Right value" +msgstr "Правое значение" + +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx:231 +msgid "Right-click on a dimension value to drill to detail by that value." msgstr "" -#: superset/dashboards/filters.py:153 -#, fuzzy +#: superset/dashboards/filters.py:199 msgid "Role" -msgstr "Профиль" +msgstr "Роль" -#: superset/views/core.py:389 +#: superset/views/core.py:405 #, python-format msgid "Role %(r)s was extended to provide the access to the datasource %(ds)s" msgstr "" -"Роль %(r) s была расширена для обеспечения доступа к источнику данных " +"Роль %(r)s была расширена для предоставления доступа к источнику данных " "%(ds)s" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:421 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:424 +#: superset-frontend/src/dashboard/components/PropertiesModal/PropertiesModal.test.tsx:373 +#: superset-frontend/src/dashboard/components/PropertiesModal/PropertiesModal.test.tsx:387 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:474 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:477 #: superset-frontend/src/profile/components/Security.tsx:35 -#: superset/connectors/sqla/views.py:368 superset/views/dashboard/mixin.py:83 +#: superset/connectors/sqla/views.py:365 superset/views/dashboard/mixin.py:83 msgid "Roles" msgstr "Роли" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:433 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:488 msgid "" "Roles is a list which defines access to the dashboard. Granting a role " -"access to a dashboard will bypass dataset level checks. If no roles " -"defined then the dashboard is available to all roles." +"access to a dashboard will bypass dataset level checks. If no roles are " +"defined, then the dashboard is available to all roles." msgstr "" +"Список ролей, определяющий доступ к дашборду. Предоставляя доступ " +"определенной роли, пользователь сможет обойти ограничения своей роли. " +"Если роли не указаны, дашборд доступен всем ролям." #: superset/views/dashboard/mixin.py:66 +#, fuzzy msgid "" "Roles is a list which defines access to the dashboard. Granting a role " -"access to a dashboard will bypass dataset level checks.If no roles " +"access to a dashboard will bypass dataset level checks.If no roles are " "defined then the dashboard is available to all roles." msgstr "" +"Список ролей, определяющий доступ к дашборду. Предоставляя доступ " +"определенной роли, пользователь сможет обойти ограничения своей роли. " +"Если роли не указаны, дашборд доступен всем ролям." -#: superset/views/access_requests.py:45 +#: superset/views/access_requests.py:48 msgid "Roles to grant" msgstr "Роли для предоставления" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:257 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:140 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:158 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:389 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:250 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:132 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:399 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:179 msgid "Rolling Function" -msgstr "Rolling" +msgstr "Скользящая средняя" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:251 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:134 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:152 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:383 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:244 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:126 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:393 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:173 msgid "Rolling Window" -msgstr "Rolling" +msgstr "Скользящее окно" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:39 -#: superset-frontend/src/explore/controlPanels/sections.tsx:158 +#: superset-frontend/src/explore/controlPanels/sections.tsx:131 msgid "Rolling function" -msgstr "Rolling" +msgstr "Скользящая средняя" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:33 -#: superset-frontend/src/explore/controlPanels/sections.tsx:152 +#: superset-frontend/src/explore/controlPanels/sections.tsx:125 msgid "Rolling window" -msgstr "Rolling" +msgstr "Скользящее окно" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:351 -#: superset/views/database/mixins.py:198 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:361 +#: superset/views/database/mixins.py:195 msgid "Root certificate" msgstr "Корневой сертификат" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:85 msgid "Root node id" msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:307 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:209 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:170 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:151 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:167 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:225 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:228 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:168 +msgid "Rotate axis label" +msgstr "Повернуть метки осей" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:323 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:198 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:185 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:128 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:127 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:182 msgid "Rotate x axis label" -msgstr "" +msgstr "Повернуть метку оси X" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:89 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:93 msgid "Rotation to apply to words in the cloud" -msgstr "" +msgstr "Вращение для применения к словам в облаке" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:271 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:267 msgid "Round cap" -msgstr "Карта Стран" +msgstr "Закругление на концах" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx:42 #: superset-frontend/src/dashboard/components/gridComponents/new/NewRow.jsx:31 msgid "Row" msgstr "Строка" -#: superset/initialization/__init__.py:274 -#, fuzzy +#: superset/initialization/__init__.py:291 msgid "Row Level Security" msgstr "Безопасность на уровне строк" -#: superset/views/database/forms.py:153 superset/views/database/forms.py:306 +#: superset/views/database/forms.py:245 +msgid "" +"Row containing the headers to use as column names (0 is first line of " +"data). Leave empty if there is no header row" +msgstr "" +"Строка, содержащая заголовки для использования в качестве имен столбцов " +"(0, если первая строка в данных). Оставьте пустым, если заголовки " +"отсутствуют" + +#: superset/views/database/forms.py:332 msgid "" "Row containing the headers to use as column names (0 is first line of " "data). Leave empty if there is no header row." msgstr "" "Строка, содержащая заголовки для использования в качестве имен столбцов " -"(0 - первая строка данных). Оставьте пустым, если строка заголовка " -"отсутствует." +"(0, если первая строка в данных). Оставьте пустым, если заголовки " +"отсутствуют." -#: superset/connectors/sqla/views.py:314 +#: superset/connectors/sqla/views.py:291 +#, fuzzy msgid "Row level security filter" -msgstr "Фильтр на уровне строк" +msgstr "Безопасность на уровне строк" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:331 -#: superset-frontend/src/explore/controls.jsx:360 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:247 +#: superset-frontend/src/explore/controls.jsx:340 msgid "Row limit" msgstr "Лимит строк" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:49 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:83 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:289 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:62 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:120 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:307 msgid "Rows" -msgstr "Игнорировать" +msgstr "Строки" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:314 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:391 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/pagination.tsx:53 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:324 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:402 msgid "Rows per page, 0 means no pagination" -msgstr "" +msgstr "Строчек на странице, 0 означает все строки" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:285 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:350 msgid "Rows subtotal position" -msgstr "" +msgstr "Расположение строк подытогов" -#: superset/views/database/forms.py:193 superset/views/database/forms.py:334 +#: superset/views/database/forms.py:254 superset/views/database/forms.py:360 msgid "Rows to Read" msgstr "Строки для чтения" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:144 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:360 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:243 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:493 -#: superset-frontend/src/explore/controlPanels/sections.tsx:257 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:160 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:352 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:234 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:504 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:233 +#: superset-frontend/src/explore/controlPanels/sections.tsx:230 msgid "Rule" msgstr "Правило" -#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:56 -#: superset-frontend/src/explore/components/QueryAndSaveBtns.jsx:76 +#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:53 msgid "Run" msgstr "Выполнить" -#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:157 -msgid "Run a query to display results here" -msgstr "Выполнить запрос для отображения результатов" +#: superset-frontend/src/SqlLab/components/QueryHistory/index.tsx:65 +msgid "Run a query to display query history" +msgstr "Выполните запрос для отображения истории" + +#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:197 +#: superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx:109 +msgid "Run a query to display results" +msgstr "Выполните запрос для отображения результатов" -#: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:101 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:407 msgid "Run in SQL Lab" msgstr "Открыть в SQL редакторе" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:307 -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:317 -#: superset-frontend/src/chart/Chart.jsx:280 +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:300 +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:310 msgid "Run query" msgstr "Выполнить запрос" -#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:116 +#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:132 msgid "Run query (Ctrl + Return)" -msgstr "Выполнить запрос (Ctrl + Return)" +msgstr "Выполнить запрос (Ctrl + Enter)" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:273 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:281 msgid "Run query in a new tab" msgstr "Выполнить запрос на новой вкладке" -#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:54 +#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:51 msgid "Run selection" -msgstr "Выполнить выбранный запрос" +msgstr "Выполнить выбранное" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:81 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:158 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:132 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:173 msgid "Running" msgstr "Выполняется" +#: superset/sql_lab.py:488 +#, python-format +msgid "Running statement %(statement_num)s out of %(statement_count)s" +msgstr "" + #: superset-frontend/src/components/CronPicker/CronPicker.tsx:87 msgid "SAT" msgstr "СБ" @@ -10170,34 +12387,38 @@ msgstr "СБ" msgid "SEP" msgstr "СЕН" +#: superset-frontend/src/views/components/RightMenu.tsx:522 +msgid "SHA" +msgstr "" + #: superset-frontend/src/SqlLab/components/HighlightedSql/index.tsx:101 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:897 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:294 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1082 +#: superset-frontend/src/views/CRUD/data/common.ts:22 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:312 +#: superset/initialization/__init__.py:349 +#: superset/initialization/__init__.py:357 +#: superset/initialization/__init__.py:366 msgid "SQL" msgstr "SQL" #: superset-frontend/src/views/CRUD/data/components/SyntaxHighlighterCopy/index.tsx:71 msgid "SQL Copied!" -msgstr "SQL скопирован!" +msgstr "SQL запрос скопирован!" -#: superset/initialization/__init__.py:326 -msgid "SQL Editor" -msgstr "Редактор SQL" - -#: superset/connectors/sqla/views.py:259 +#: superset/connectors/sqla/views.py:255 msgid "SQL Expression" -msgstr "Выражение SQL" +msgstr "SQL выражение" -#: superset/initialization/__init__.py:331 -#: superset/initialization/__init__.py:346 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:73 +#: superset/initialization/__init__.py:344 msgid "SQL Lab" msgstr "Лаборатория SQL" -#: superset/connectors/sqla/views.py:503 +#: superset/connectors/sqla/views.py:493 msgid "SQL Lab View" -msgstr "Лаборатория SQL" +msgstr "" -#: superset-frontend/src/SqlLab/components/App/index.jsx:91 +#: superset-frontend/src/SqlLab/components/App/index.jsx:152 #, python-format msgid "" "SQL Lab uses your browser's local storage to store queries and results.\n" @@ -10208,376 +12429,516 @@ msgid "" "delete the tab.\n" "Note that you will need to close other SQL Lab windows before you do this." msgstr "" - -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1150 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:287 -#: superset/templates/appbuilder/navbar_right.html:38 +"SQL Lab использует локальное хранилище вашего браузера для хранения " +"запросов и результатов.\n" +"В настоящее время вы используете %(currentUsage)s КБ из %(maxStorage)d КБ" +" дискового пространства.\n" +" Чтобы предотвратить сбой Лаборатории SQL, пожалуйста, удалите некоторые " +"вкладки запросов.\n" +" Вы можете повторно получить доступ к этим запросам, используя функцию " +"сохранения перед удалением вкладки.\n" +" Обратите внимание, что перед этим вам нужно будет закрыть другие окна " +"Лаборатории SQL." + +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:402 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:261 msgid "SQL Query" -msgstr "Сохранить запрос" +msgstr "SQL запрос" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:181 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1038 +#: superset-frontend/packages/superset-ui-chart-controls/src/components/SQLPopover.tsx:64 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:233 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1193 msgid "SQL expression" msgstr "Выражение SQL" -#: superset-frontend/src/components/Menu/MenuRight.tsx:32 -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:124 +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:141 +#: superset-frontend/src/views/components/RightMenu.tsx:210 msgid "SQL query" -msgstr "SQL-запрос" +msgstr "SQL запрос" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:61 -#: superset/views/database/mixins.py:194 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:76 +#: superset/views/database/mixins.py:191 msgid "SQLAlchemy URI" msgstr "SQLAlchemy URI" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:202 -msgid "SSL Mode \"require\" will be used." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:106 +msgid "SSH Host" +msgstr "" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:186 +msgid "SSH Password" +msgstr "Пароль SSH" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:121 +msgid "SSH Port" +msgstr "SSH порт" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:95 +msgid "SSH Tunnel configuration parameters" +msgstr "Параметры конфигурации SSH туннеля" + +#: superset/databases/ssh_tunnel/commands/exceptions.py:29 +msgid "SSH Tunnel could not be deleted." +msgstr "Не удалось удалить SSH туннель." + +#: superset/databases/ssh_tunnel/commands/exceptions.py:42 +msgid "SSH Tunnel could not be updated." +msgstr "Не удалось обновить SSH туннель." + +#: superset/databases/ssh_tunnel/commands/exceptions.py:34 +msgid "SSH Tunnel not found." +msgstr "SSH туннель не найден." + +#: superset/databases/ssh_tunnel/commands/exceptions.py:38 +msgid "SSH Tunnel parameters are invalid." +msgstr "Параметры SSH туннеля недопустимы." + +#: superset/databases/ssh_tunnel/commands/exceptions.py:51 +msgid "SSH Tunneling is not enabled" msgstr "" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:247 +msgid "SSL Mode \"require\" will be used." +msgstr "Будет использовано шифрование SSL" + #: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:64 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:115 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:122 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:129 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:136 msgid "START (INCLUSIVE)" -msgstr "" +msgstr "НАЧАЛО (ВКЛЮЧИТЕЛЬНО)" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:93 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:117 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:135 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:164 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:178 +#, python-format +msgid "STEP %(stepCurr)s OF %(stepLast)s" +msgstr "ШАГ %(stepCurr)s ИЗ %(stepLast)s" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:137 +msgid "STRING" +msgstr "Строчный (STRING/VARCHAR)" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:81 msgid "SUN" msgstr "ВС" -#: superset/viz.py:1903 -msgid "Sankey" -msgstr "Sankey" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:186 +msgid "Sample Standard Deviation" +msgstr "Стандартное отклонение" -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:36 -msgid "Sankey Diagram" -msgstr "" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:185 +msgid "Sample Variance" +msgstr "Дисперсия" -#: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/index.js:27 +#: superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx:231 +msgid "Samples" +msgstr "Примеры данных" + +#: superset/datasets/commands/exceptions.py:177 +msgid "Samples for dataset could not be retrieved." +msgstr "Не удалось получить примеры записей датасета." + +#: superset/explore/exceptions.py:45 +msgid "Samples for datasource could not be retrieved." +msgstr "Не удалось получить примеры записей для источника данных." + +#: superset/viz.py:1932 +msgid "Sankey" +msgstr "Санкей" + +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:36 +msgid "Sankey Diagram" +msgstr "Диаграмма Санкей" + +#: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/index.js:27 msgid "Sankey Diagram with Loops" msgstr "" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:235 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:378 +msgid "Satellite" +msgstr "Спутник" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:233 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:377 +msgid "Satellite Streets" +msgstr "Гибридный режим" + #: superset-frontend/src/components/CronPicker/CronPicker.tsx:62 msgid "Saturday" msgstr "Суббота" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:160 -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:166 -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:181 -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:227 -#: superset-frontend/src/components/ReportModal/index.tsx:267 -#: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:88 -#: superset-frontend/src/dashboard/components/Header/index.jsx:588 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:458 +#: superset-frontend/src/SqlLab/components/SaveDatasetActionButton/index.tsx:66 +#: superset-frontend/src/SqlLab/components/SaveDatasetActionButton/index.tsx:80 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:200 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:215 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:242 +#: superset-frontend/src/components/ReportModal/index.tsx:223 +#: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:100 +#: superset-frontend/src/dashboard/components/Header/index.jsx:609 +#: superset-frontend/src/dashboard/components/Header/index.jsx:611 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:103 #: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:148 -#: superset-frontend/src/dashboard/components/SaveModal.tsx:224 -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:531 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:157 +#: superset-frontend/src/dashboard/components/SaveModal.tsx:216 +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:794 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:156 #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:71 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:205 -#: superset-frontend/src/explore/components/QueryAndSaveBtns.jsx:112 -#: superset-frontend/src/explore/components/SaveModal.tsx:202 -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:318 -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:260 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:488 -#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:345 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1039 -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:273 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:226 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:220 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1006 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:491 +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:268 +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:457 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:218 +#: superset-frontend/src/explore/components/SaveModal.tsx:402 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:463 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:416 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx:147 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:262 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:497 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx:244 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:347 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:389 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:272 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:230 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:218 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1506 +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/index.tsx:52 msgid "Save" msgstr "Сохранить" -#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:108 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:245 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:192 msgid "Save & Explore" msgstr "Сохранить и исследовать" -#: superset-frontend/src/explore/components/SaveModal.tsx:190 +#: superset-frontend/src/explore/components/SaveModal.tsx:383 msgid "Save & go to dashboard" msgstr "Сохранить и перейти к дашборду" -#: superset-frontend/src/explore/components/SaveModal.tsx:234 +#: superset-frontend/src/explore/components/SaveModal.tsx:382 +msgid "Save & go to new dashboard" +msgstr "Сохранить и перейти к дашборду" + +#: superset-frontend/src/explore/components/SaveModal.tsx:302 msgid "Save (Overwrite)" msgstr "Сохранить (Перезаписать)" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:160 -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:166 -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:254 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:200 +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:312 msgid "Save as" msgstr "Сохранить как" -#: superset-frontend/src/explore/components/SaveModal.tsx:243 -msgid "Save as ..." -msgstr "Сохранить как …" +#: superset-frontend/src/explore/components/controls/ViewQueryModalFooter.tsx:37 +msgid "Save as Dataset" +msgstr "Сохранить как датасет" + +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:345 +msgid "Save as dataset" +msgstr "Сохранить как датасет" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:181 +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:394 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:215 msgid "Save as new" msgstr "Сохранить как новый" -#: superset-frontend/src/explore/components/SaveModal.tsx:201 +#: superset-frontend/src/explore/components/SaveModal.tsx:399 msgid "Save as new chart" msgstr "Сохранить как новый график" -#: superset-frontend/src/dashboard/components/SaveModal.tsx:199 +#: superset-frontend/src/explore/components/SaveModal.tsx:310 +msgid "Save as..." +msgstr "Сохранить как..." + +#: superset-frontend/src/dashboard/components/SaveModal.tsx:191 msgid "Save as:" msgstr "Сохранить как:" -#: superset-frontend/src/explore/components/SaveModal.tsx:171 +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:223 +msgid "Save changes" +msgstr "Сохранить изменения" + +#: superset-frontend/src/explore/components/SaveModal.tsx:419 msgid "Save chart" msgstr "Сохранить график" -#: superset-frontend/src/dashboard/components/SaveModal.tsx:182 +#: superset-frontend/src/dashboard/components/SaveModal.tsx:174 msgid "Save dashboard" msgstr "Сохранить дашборд" +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:107 +msgid "Save dataset" +msgstr "Сохранить датасет" + #: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:148 msgid "Save for this session" -msgstr "" +msgstr "Сохранить на время текущей сессии" + +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:350 +msgid "Save or Overwrite Dataset" +msgstr "Сохранить или перезаписать датасет" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:169 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:203 msgid "Save query" msgstr "Сохранить запрос" -#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:89 -#, fuzzy +#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:99 msgid "Save the query to enable this feature" -msgstr "Пожалуйста, сохраните запрос, чтобы включить функцию “поделиться”" +msgstr "Сохраните запрос для включения этой опции" + +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:247 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:465 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx:149 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx:246 +msgid "Save this query as a virtual dataset to continue exploring" +msgstr "Сохраните данный запрос как виртуальный датасет для создания графика" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:241 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:368 +#: superset-frontend/src/explore/components/SaveModal.tsx:401 +msgid "Save to new dashboard" +msgstr "Сохранить в новый дашборд" + +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:263 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:358 msgid "Saved" -msgstr "Сохранить" +msgstr "Сохранено" -#: superset/initialization/__init__.py:334 +#: superset/initialization/__init__.py:353 msgid "Saved Queries" msgstr "Сохраненные запросы" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:226 -#, fuzzy +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:247 msgid "Saved expressions" -msgstr "Выражение SQL" +msgstr "Сохраненные выражения" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:369 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:360 msgid "Saved metric" -msgstr "Сохранённый показатель" +msgstr "Сохраненная мера" -#: superset-frontend/src/views/CRUD/data/common.ts:38 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:108 -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:318 +#: superset-frontend/src/views/CRUD/data/common.ts:26 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:106 +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:405 msgid "Saved queries" msgstr "Сохраненные запросы" #: superset/queries/saved_queries/commands/exceptions.py:28 msgid "Saved queries could not be deleted." -msgstr "Сохранённые запросы не могут быть удалены." +msgstr "Не удалось удалить сохраненные запросы." #: superset/queries/saved_queries/commands/exceptions.py:32 msgid "Saved query not found." -msgstr "Сохранённый запрос не найден." +msgstr "Сохраненный запрос не найден." #: superset/queries/saved_queries/commands/exceptions.py:40 -#, fuzzy msgid "Saved query parameters are invalid." -msgstr "Параметры графика недействительны." +msgstr "Сохраненные параметры запроса недопустимы." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:168 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:277 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:169 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:278 msgid "Scale and Move" -msgstr "" +msgstr "Масштабирование и перемещение" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:166 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:275 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:167 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:276 msgid "Scale only" -msgstr "" - -#: superset/initialization/__init__.py:529 -msgid "Scan New Datasources" -msgstr "Сканирование Новых Источников" +msgstr "Только масштабирование" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:39 #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:43 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:36 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:77 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:38 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:142 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:75 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:84 msgid "Scatter" -msgstr "" +msgstr "Точечный" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:75 #: superset-frontend/plugins/preset-chart-xy/src/ScatterPlot/createMetadata.ts:26 -#, fuzzy msgid "Scatter Plot" -msgstr "Deck.gl - Scatter plot" +msgstr "Точечная диаграмма" -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:221 -#: superset-frontend/src/components/ReportModal/index.tsx:357 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:237 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:61 +msgid "" +"Scatter Plot has the horizontal axis in linear units, and the points are " +"connected in order. It shows a statistical relationship between two " +"variables." +msgstr "" + +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:239 +#: superset-frontend/src/components/ReportModal/index.tsx:300 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:277 msgid "Schedule" msgstr "Расписание" -#: superset/views/schedules.py:274 -msgid "Schedule Email Reports for Charts" -msgstr "Запланировать рассылку по email для графиков" - -#: superset/views/schedules.py:196 -msgid "Schedule Email Reports for Dashboards" -msgstr "Запланировать рассылку по email для дашбордов" +#: superset-frontend/src/components/ReportModal/index.tsx:206 +msgid "Schedule a new email report" +msgstr "Запланировать новую рассылку по почте" -#: superset-frontend/src/dashboard/components/Header/index.jsx:423 -#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:218 -#, fuzzy +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:284 msgid "Schedule email report" -msgstr "Запланировать рассылку по email для графиков" +msgstr "Запланировать рассылку по почте" -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:211 +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:229 msgid "Schedule query" msgstr "Сохранить запрос" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1234 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:410 msgid "Schedule settings" msgstr "Настройки расписания" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:517 +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:502 msgid "Schedule the query periodically" msgstr "Запланировать периодическое выполнение запроса" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:99 -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:105 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:168 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:150 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:156 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:186 msgid "Scheduled" msgstr "Запланировано" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:117 -#, fuzzy +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:120 msgid "Scheduled at (UTC)" -msgstr "Запланировано на" +msgstr "Запланировано на (часовой пояс UTC)" -#: superset-frontend/src/components/ReportModal/index.tsx:359 -msgid "Scheduled reports will be sent to your email as a PNG" -msgstr "" +#: superset/tasks/exceptions.py:24 +msgid "Scheduled task executor not found" +msgstr "Исполнитель регулярных отчетов не найден" -#: superset-frontend/src/components/DatabaseSelector/index.tsx:295 -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:220 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:299 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:451 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:232 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:287 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:444 -#: superset/connectors/sqla/views.py:494 superset/views/database/forms.py:126 -#: superset/views/database/forms.py:285 superset/views/database/forms.py:413 +#: superset-frontend/src/components/DatabaseSelector/index.tsx:320 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:221 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:358 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:540 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:250 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:288 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:446 +#: superset/connectors/sqla/views.py:484 superset/views/database/forms.py:144 +#: superset/views/database/forms.py:311 superset/views/database/forms.py:442 msgid "Schema" msgstr "Схема" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:235 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:247 msgid "Schema cache timeout" -msgstr "Тайм-аут Кэша" +msgstr "Время жизни кэша схемы" -#: superset/connectors/sqla/views.py:440 +#: superset/views/core.py:1159 +msgid "Schema undefined" +msgstr "Схема не определена" + +#: superset/connectors/sqla/views.py:430 msgid "Schema, as used only in some databases like Postgres, Redshift and DB2" msgstr "" -"Схема, используется только в некоторых базах данных, таких как Postgres, " -"Redshift и DB2" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:369 -#, fuzzy -msgid "Schemas allowed for CSV upload" -msgstr "" -"Если включено, выберите схему, в которую разрешено загружать CSV на " -"вкладке “Дополнительно”." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:419 +msgid "Schemas allowed for File upload" +msgstr "Схемы, в которые разрешена загрузка файлов" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx:72 +msgid "Scope" +msgstr "Область" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:256 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:281 msgid "Scoping" +msgstr "Область применения" + +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:65 +msgid "Scroll" +msgstr "Прокрутка" + +#: superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.tsx:135 +msgid "Scroll down to the bottom to enable overwriting changes. " msgstr "" -#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 -#: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:542 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:292 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:516 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:417 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:477 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:461 +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:157 +#: superset-frontend/src/explore/components/DataTableControl/index.tsx:107 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/DashboardsSubMenu.tsx:59 +#: superset-frontend/src/pages/ChartList/index.tsx:682 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:508 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:303 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:293 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:471 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:489 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:581 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:464 #: superset/templates/appbuilder/general/widgets/search.html:40 msgid "Search" msgstr "Поиск" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:293 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:294 msgid "Search / Filter" msgstr "Поиск / Фильтр" -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:291 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:361 msgid "Search Metrics & Columns" -msgstr "Столбцы Временных Рядов" +msgstr "Поиск по мерам и столбцам" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:703 -#, fuzzy +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:779 msgid "Search all charts" -msgstr "Все графики" - -#: superset-frontend/src/components/OmniContainer/index.tsx:102 -#, fuzzy -msgid "Search all dashboards" -msgstr "Обновить дашборд" +msgstr "Поиск по всем графикам" #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:232 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:137 msgid "Search all filter options" -msgstr "Поиск / Фильтр" +msgstr "Поиск по всем фильтрам" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:403 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:414 msgid "Search box" -msgstr "Поиск" +msgstr "Строка поиска" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:388 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:410 msgid "Search by query text" msgstr "Поиск по тексту запроса" -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:452 -msgid "Search..." -msgstr "Поиск…" +#: superset-frontend/src/components/Table/index.tsx:260 +#, fuzzy +msgid "Search in filters" +msgstr "Поиск / Фильтр" -#: superset/db_engine_specs/base.py:86 +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/index.tsx:252 #, fuzzy +msgid "Search tables" +msgstr "Показать в виде таблицы" + +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:715 +msgid "Search..." +msgstr "Поиск..." + +#: superset/db_engine_specs/base.py:100 msgid "Second" -msgstr "30 секунд" +msgstr "Секунда" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:244 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:246 msgid "Secondary" -msgstr "Понедельник" +msgstr "Вторичная" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:62 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:67 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:164 msgid "Secondary Metric" -msgstr "Показатель для сортировки" +msgstr "Вторичная мера" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:392 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:408 msgid "Secondary y-axis format" -msgstr "" +msgstr "Формат вторичной оси Y" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:401 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:417 msgid "Secondary y-axis title" -msgstr "" +msgstr "Название вторичной оси Y" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:63 -#, fuzzy, python-format +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:62 +#, python-format msgid "Seconds %s" -msgstr "30 секунд" +msgstr "Секунд %s" -#: superset/views/database/mixins.py:197 +#: superset/views/database/mixins.py:194 msgid "Secure Extra" -msgstr "Безопасность" +msgstr "Доп. безопасность" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:326 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:331 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:336 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:341 msgid "Secure extra" msgstr "Безопасность" -#: superset/initialization/__init__.py:276 -#: superset/initialization/__init__.py:421 -#: superset/initialization/__init__.py:493 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:329 +#: superset/initialization/__init__.py:293 +#: superset/initialization/__init__.py:375 +#: superset/initialization/__init__.py:413 msgid "Security" msgstr "Безопасность" @@ -10585,196 +12946,264 @@ msgstr "Безопасность" msgid "Security & Access" msgstr "Безопасность и Доступ" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:157 -#, fuzzy, python-format +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:173 +#, python-format msgid "See all %(tableName)s" -msgstr "Исследовать - %(table)s" +msgstr "Список %(tableName)s" -#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:155 +#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:172 msgid "See less" msgstr "Скрыть подробности" -#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:126 +#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:128 #: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:142 +#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:159 msgid "See more" -msgstr "Подробности" +msgstr "Подробнее" + +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:409 +msgid "See query details" +msgstr "Показать детали запроса" -#: superset-frontend/src/components/TableSelector/index.tsx:291 +#: superset-frontend/src/components/TableSelector/index.tsx:311 msgid "See table schema" -msgstr "Выберите схему (%s)" +msgstr "Таблица" -#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:132 -#, fuzzy +#: superset-frontend/src/explore/components/SaveModal.tsx:353 +#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:135 msgid "Select" -msgstr "Множественный выбор" +msgstr "Выбрать" #: superset-frontend/src/components/AsyncSelect/index.jsx:41 -#: superset-frontend/src/components/Select/Select.tsx:290 +#: superset-frontend/src/components/Select/AsyncSelect.tsx:123 +#: superset-frontend/src/components/Select/Select.tsx:100 #: superset-frontend/src/explore/components/controls/SelectAsyncControl/index.tsx:106 -#: superset-frontend/src/explore/components/controls/SelectControl.jsx:227 +#: superset-frontend/src/explore/components/controls/SelectControl.jsx:230 msgid "Select ..." -msgstr "Выбрать …" +msgstr "Выбрать ..." #: superset-frontend/src/views/CRUD/alert/components/NotificationMethod.tsx:127 -#, fuzzy msgid "Select Delivery Method" -msgstr "Добавить метод доставки" +msgstr "Выберите способ оповещения" -#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:106 -#, fuzzy +#: superset-frontend/src/explore/components/controls/VizTypeControl/FastVizSwitcher.tsx:94 msgid "Select Viz Type" msgstr "Выберите тип визуализации" -#: superset/views/database/forms.py:102 -msgid "Select a CSV file to be uploaded to a database." -msgstr "Выберите файл CSV, который будет загружен в БД." - -#: superset/views/database/forms.py:386 -#, fuzzy +#: superset/views/database/forms.py:415 msgid "Select a Columnar file to be uploaded to a database." -msgstr "Выберите файл CSV, который будет загружен в БД." +msgstr "Выберите файл столбчатого формата, который будет загружен в базу данных." -#: superset/views/database/forms.py:253 +#: superset/views/database/forms.py:279 msgid "Select a Excel file to be uploaded to a database." -msgstr "Выберите файл CSV, который будет загружен в БД." +msgstr "Выберите Excel файл для загрузки в базу данных" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:133 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:132 msgid "Select a column" -msgstr "Выберите базу данных" +msgstr "Выберите столбец" -#: superset-frontend/src/explore/components/SaveModal.tsx:264 -#, fuzzy +#: superset-frontend/src/explore/components/SaveModal.tsx:347 msgid "Select a dashboard" -msgstr "Дашборд Superset" +msgstr "Выбрать дашборд" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/index.tsx:39 +msgid "Select a database table and create dataset" +msgstr "Выберите базу данных и создайте датасет" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/Footer/index.tsx:91 +msgid "Select a database table." +msgstr "Выберите таблицу в базе данных." + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:169 +msgid "Select a database to connect" +msgstr "Выберите базу данных для подключения" + +#: superset/views/database/forms.py:138 +msgid "Select a database to upload the file to" +msgstr "Выберите базу данных для загрузки файла" + +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:722 +msgid "Select a database to write a query" +msgstr "Выберите базу данных для написания запроса" -#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:131 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:111 +msgid "Select a dimension" +msgstr "Выберете измерение" + +#: superset/views/database/forms.py:110 +msgid "Select a file to be uploaded to the database" +msgstr "Выберите файл для загрузки в базу данных." + +#: superset/views/database/forms.py:145 +msgid "Select a schema if the database supports this" +msgstr "Укажите схему, если она поддерживается базой данных" + +#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:134 msgid "Select a visualization type" msgstr "Выберите тип визуализации" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:310 -#, fuzzy, python-format +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:309 msgid "Select aggregate options" -msgstr "%s агрегат(ы)" +msgstr "Выберите настройки агрегации" + +#: superset-frontend/src/components/Table/index.tsx:265 +msgid "Select all data" +msgstr "Выбрать все данные" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:107 +#: superset-frontend/src/components/Table/index.tsx:259 +msgid "Select all items" +msgstr "Выбрать все записи" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:106 msgid "Select any columns for metadata inspection" msgstr "" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/controlPanel.js:45 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:103 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:138 -#, fuzzy msgid "Select charts" -msgstr "Все графики" +msgstr "Выберите графики" -#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:188 -#, fuzzy +#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx:177 msgid "Select color scheme" -msgstr "Цветовая схема" +msgstr "Выберите цветовую схему" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:208 #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:63 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:301 -#, fuzzy +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:300 msgid "Select column" -msgstr "Столбец с временем" +msgstr "Выберите столбец" + +#: superset-frontend/src/components/Table/index.tsx:262 +msgid "Select current page" +msgstr "Выбрать текущую страницу" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/index.tsx:245 +msgid "Select database & schema" +msgstr "Выберите базу данных и схему" -#: superset-frontend/src/components/DatabaseSelector/index.tsx:268 -#: superset-frontend/src/components/DatabaseSelector/index.tsx:275 +#: superset-frontend/src/components/DatabaseSelector/index.tsx:293 +#: superset-frontend/src/components/DatabaseSelector/index.tsx:301 msgid "Select database or type database name" -msgstr "" +msgstr "Выберите базу данных или введите ее имя" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1127 +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/index.tsx:249 +msgid "Select database table" +msgstr "Выберите таблицу из базы данных" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1635 msgid "" "Select databases require additional fields to be completed in the " "Advanced tab to successfully connect the database. Learn what " "requirements your databases has " msgstr "" +"Некоторые базы данных требуют ручной настройки во вкладке Продвинутая " +"настройка для успешного подключения. Вы можете ознакомиться с " +"требованиями к вашей базе данных " + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/MessageContent.tsx:66 +msgid "Select dataset source" +msgstr "Выберите источник датасета" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:294 +#: superset-frontend/src/components/ImportModal/index.tsx:300 +msgid "Select file" +msgstr "Выбрать файл" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:315 #: superset-frontend/src/filters/components/Select/index.ts:28 -#, fuzzy msgid "Select filter" -msgstr "Выберите дату окончания" +msgstr "Селектор" #: superset-frontend/src/filters/components/Select/index.ts:29 msgid "Select filter plugin using AntD" msgstr "" -#: superset-frontend/src/filters/components/Select/controlPanel.ts:111 -msgid "" -"Select first item by default (when using this option, default value can’t" -" be set)" -msgstr "" +#: superset-frontend/src/filters/components/Select/controlPanel.ts:104 +msgid "Select first filter value by default" +msgstr "Сделать первое значение фильтра значением по умолчанию" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:303 -#, fuzzy, python-format +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:363 msgid "Select operator" -msgstr "%s параметр(ы)" +msgstr "Выбрать оператор" -#: superset-frontend/src/components/ListView/Filters/Select.tsx:84 +#: superset-frontend/src/components/ListView/Filters/Select.tsx:99 +#: superset-frontend/src/components/ListView/Filters/Select.tsx:113 msgid "Select or type a value" -msgstr "" +msgstr "Выберите значение" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:393 -#, fuzzy -msgid "Select owners" -msgstr "Выполнить выбранный запрос" +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:410 +msgid "Select or type dataset name" +msgstr "Выберите/введите имя датасета" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadePopover/index.tsx:177 -msgid "Select parent filters" -msgstr "Выберите дату окончания" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:555 +msgid "Select owners" +msgstr "Выбрать владельцев" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:319 -#, fuzzy, python-format +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:318 msgid "Select saved metrics" -msgstr "%s сохранённый показатель(и)" +msgstr "Выберите сохраненные меры" -#: superset-frontend/src/components/DatabaseSelector/index.tsx:293 -#: superset-frontend/src/components/DatabaseSelector/index.tsx:300 +#: superset-frontend/src/components/DatabaseSelector/index.tsx:318 +#: superset-frontend/src/components/DatabaseSelector/index.tsx:325 msgid "Select schema or type schema name" -msgstr "" +msgstr "Выберите схему или введите ее имя" -#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:194 -#, fuzzy, python-format +#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx:183 msgid "Select scheme" -msgstr "Выберите схему (%s)" +msgstr "Выберите схему" -#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:273 +#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:304 msgid "Select start and end date" msgstr "Выберите дату начала" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:265 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:335 msgid "Select subject" msgstr "" -#: superset-frontend/src/components/TableSelector/index.tsx:298 -#: superset-frontend/src/components/TableSelector/index.tsx:308 +#: superset-frontend/src/components/TableSelector/index.tsx:318 +#: superset-frontend/src/components/TableSelector/index.tsx:329 msgid "Select table or type table name" -msgstr "" +msgstr "Выберите таблицу или введите ее имя" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:430 +msgid "Select the Annotation Layer you would like to use." +msgstr "Выбрать слой аннотации, который вы хотите использовать." -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:98 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:392 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/sharedDndControls.jsx:37 +msgid "Select the geojson column" +msgstr "Выберите geojson столбец" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:84 msgid "Select the number of bins for the histogram" -msgstr "" +msgstr "Выберите количество столбцов для гистограммы" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:38 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:48 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:34 msgid "Select the numeric columns to draw the histogram" +msgstr "Выберите числовые столбцы для отрисовки гистограммы" + +#: superset-frontend/src/utils/getChartRequiredFieldsMissingMessage.ts:26 +#, python-format +msgid "" +"Select values in highlighted field(s) in the control panel. Then run the " +"query by clicking on the %s button." msgstr "" +"Выберите значения в обязательных полях на панели управления. Затем " +"запустите запрос, нажав на кнопку %s." -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1340 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:420 msgid "Send as CSV" -msgstr "" +msgstr "Отправить в формате CSV" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1339 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:419 msgid "Send as PNG" -msgstr "" +msgstr "Отправить в формате PNG" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1342 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:421 msgid "Send as text" -msgstr "" +msgstr "Отправить текстом" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:58 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:62 msgid "Send range filter events to other charts" msgstr "" @@ -10782,147 +13211,178 @@ msgstr "" msgid "September" msgstr "Сентябрь" -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:58 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:60 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:49 msgid "Sequential" -msgstr "" +msgstr "Последовательность" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:61 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:385 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:119 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:128 -#: superset-frontend/src/explore/controls.jsx:400 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx:43 msgid "Series" -msgstr "Ряд данных" +msgstr "Ряд" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:71 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:63 msgid "Series Height" -msgstr "Лимит кол-ва рядов" +msgstr "Высота рядов" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:112 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:113 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:54 +msgid "Series Limit Sort By" +msgstr "Сортировка категорий по" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:73 #, fuzzy +msgid "Series Limit Sort Descending" +msgstr "Сортировать" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:71 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:70 msgid "Series Style" -msgstr "Таблица временных рядов" +msgstr "Стиль категорий" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:147 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:122 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:125 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:149 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:82 msgid "Series chart type (line, bar etc)" msgstr "" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:341 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:356 -#: superset-frontend/src/explore/controls.jsx:370 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:269 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:285 +#: superset-frontend/src/explore/controls.jsx:350 msgid "Series limit" -msgstr "Лимит кол-ва рядов" +msgstr "Лимит кол-ва категорий" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:135 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:137 #, fuzzy msgid "Series type" -msgstr "Тип" +msgstr "Тип рядов" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:311 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/pagination.tsx:50 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:321 msgid "Server Page Length" -msgstr "" +msgstr "Серверный размер страницы" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:289 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/pagination.tsx:35 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:298 msgid "Server pagination" -msgstr "" +msgstr "Серверная пагинация" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:115 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:114 msgid "Service Account" -msgstr "" +msgstr "Сервисный аккаунт" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:286 +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:400 msgid "Set auto-refresh interval" -msgstr "Интервал обновления" +msgstr "Задать интервал обновления" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:295 +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:386 msgid "Set filter mapping" msgstr "Установить действие фильтра" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1264 -#: superset-frontend/src/components/Menu/MenuRight.tsx:133 +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:228 +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:232 +msgid "Set up an email report" +msgstr "Запланировать рассылку по почте" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:194 +msgid "" +"Sets the hierarchy levels of the chart. Each level is\n" +" represented by one ring with the innermost circle as the top of " +"the hierarchy." +msgstr "" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1430 +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:190 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:277 +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/index.tsx:58 +#: superset-frontend/src/views/components/RightMenu.tsx:455 msgid "Settings" msgstr "Настройки" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:133 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:126 msgid "Settings for time series" -msgstr "" +msgstr "Настройки временных рядов" -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:229 +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:331 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:492 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:338 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:211 msgid "Share" msgstr "Поделиться" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:317 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:175 -#, fuzzy +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:497 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:343 msgid "Share chart by email" -msgstr "Поделиться графиком" +msgstr "Поделиться графиком по email" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:264 -#, fuzzy -msgid "Share dashboard by email" -msgstr "Поделиться" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:336 +msgid "Share permalink by email" +msgstr "Поделиться ссылкой по email" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1221 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1403 msgid "Shared query" -msgstr "Общий запрос" +msgstr "Общедоступный запрос" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:283 +msgid "Shared query fields" +msgstr "Поля общедоступного запроса" -#: superset/views/database/forms.py:272 +#: superset/views/database/forms.py:298 msgid "Sheet Name" -msgstr "Полное имя" +msgstr "Имя листа" + +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:510 +msgid "Shift + Click to sort by multiple columns" +msgstr "Shift + Нажать для сортировки по нескольким столбцам" #: superset/annotation_layers/annotations/commands/exceptions.py:46 msgid "Short description must be unique for this layer" -msgstr "Краткое описание должно быть уникальным для этого слоя" +msgstr "Содержимое аннотации должно быть уникальным внутри слоя" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:126 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:130 msgid "" "Should daily seasonality be applied. An integer value will specify " "Fourier order of seasonality." msgstr "" +"Применяется дневная сезонность. Целочисленное значение будет указывать " +"порядок сезонности Фурье." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:109 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:111 msgid "" "Should weekly seasonality be applied. An integer value will specify " "Fourier order of seasonality." msgstr "" +"Применяется недельная сезонность. Целочисленное значение будет указывать " +"порядок сезонности Фурье." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:90 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:92 msgid "" "Should yearly seasonality be applied. An integer value will specify " "Fourier order of seasonality." msgstr "" +"Применяется годовая сезонность. Целочисленное значение будет указывать " +"порядок сезонности Фурье." -#: superset/views/annotations.py:59 -msgid "Show Annotation" -msgstr "Аннотации" - -#: superset/views/annotations.py:118 -msgid "Show Annotation Layer" -msgstr "Слои аннотаций" - -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:80 +#: superset-frontend/plugins/plugin-chart-table/src/DataTable/components/SelectPageSize.tsx:38 #, fuzzy +msgid "Show" +msgstr "%s строка" + +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:82 msgid "Show Bubbles" -msgstr "Показать таблицу" +msgstr "Показать пузыри" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:204 +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:233 msgid "Show CREATE VIEW statement" msgstr "Показать выражение CREATE VIEW" -#: superset/views/css_templates.py:37 +#: superset/views/css_templates.py:39 msgid "Show CSS Template" -msgstr "Шаблоны CSS" +msgstr "Показать CSS шаблон" #: superset/views/chart/mixin.py:27 msgid "Show Chart" msgstr "Показать график" -#: superset/connectors/sqla/views.py:64 +#: superset/connectors/sqla/views.py:74 msgid "Show Column" msgstr "Показать столбец" @@ -10932,245 +13392,243 @@ msgstr "Показать дашборд" #: superset/views/database/mixins.py:34 msgid "Show Database" -msgstr "Показать Базу Данных" - -#: superset/connectors/druid/views.py:214 -msgid "Show Druid Cluster" -msgstr "Показать кластер Druid" - -#: superset/connectors/druid/views.py:71 -msgid "Show Druid Column" -msgstr "Показать столбец Druid" - -#: superset/connectors/druid/views.py:278 -msgid "Show Druid Datasource" -msgstr "Показать источник данных Druid" - -#: superset/connectors/druid/views.py:160 -msgid "Show Druid Metric" -msgstr "Показать Druid Метрики" - -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:33 -msgid "Show Druid granularity dropdown" -msgstr "" - -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:44 -msgid "Show Druid time origin" -msgstr "Показать Druid Метрики" +msgstr "Показать базу данных" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:96 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:127 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:126 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:149 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:94 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:71 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:93 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:72 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:70 msgid "Show Labels" -msgstr "Показать таблицу" +msgstr "Показывать метки" -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:359 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:459 msgid "Show Less..." -msgstr "" +msgstr "Показать меньше..." #: superset/views/log/__init__.py:22 msgid "Show Log" -msgstr "Показать итоги" +msgstr "Показать запись" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:64 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:63 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:724 msgid "Show Markers" -msgstr "" +msgstr "Показать маркеры" -#: superset/connectors/sqla/views.py:213 +#: superset/connectors/sqla/views.py:209 msgid "Show Metric" -msgstr "Показать показатель" +msgstr "Показатель меру" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:178 -#, fuzzy msgid "Show Metric Names" -msgstr "Показать показатель" - -#: superset/views/alerts.py:76 -msgid "Show Observation" -msgstr "" +msgstr "Показать имена мер" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:132 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:139 msgid "Show Range Filter" -msgstr "Фильтр результатов" +msgstr "Показать фильтр Диапазон" -#: superset/connectors/sqla/views.py:315 -msgid "Show Row level security filter" -msgstr "Показать фильтр на уровне строк" - -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:120 -msgid "Show SQL time column" -msgstr "Показать колонку Druid" - -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:105 +#: superset/connectors/sqla/views.py:292 #, fuzzy -msgid "Show SQL time grain dropdown" -msgstr "Включить фильтр на определенный интервал/диапазон времени" +msgid "Show Row level security filter" +msgstr "Безопасность на уровне строк" -#: superset/views/sql_lab.py:40 +#: superset/views/sql_lab/views.py:53 msgid "Show Saved Query" msgstr "Показать сохраненный запрос" -#: superset/connectors/sqla/views.py:396 +#: superset/connectors/sqla/views.py:386 msgid "Show Table" msgstr "Показать таблицу" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:85 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:77 msgid "Show Timestamp" -msgstr "" +msgstr "Показать метку времени" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:191 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:99 +msgid "Show Total" +msgstr "Показать общий итог" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:97 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:89 msgid "Show Trend Line" -msgstr "" +msgstr "Показать трендовую линию" -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:82 msgid "Show Upper Labels" -msgstr "" +msgstr "Показать верхние метки" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:106 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:108 msgid "Show Value" -msgstr "Показать таблицу" +msgstr "Показать значение" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:164 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:301 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:182 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:315 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:184 msgid "Show Values" -msgstr "Показать таблицу" +msgstr "Показать значения" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx:173 -#, fuzzy +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:284 +msgid "Show Y-axis" +msgstr "Показать ось Y" + +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:285 +msgid "" +"Show Y-axis on the sparkline. Will display the manually set min/max if " +"set or min/max values in the data otherwise." +msgstr "Показывать ось Y на спарклайне." + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx:156 msgid "Show all columns" -msgstr "Показать столбец" +msgstr "Показать все столбцы" -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:326 -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:359 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:422 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:459 msgid "Show all..." -msgstr "" +msgstr "Показать все..." -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:206 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:202 msgid "Show axis line ticks" -msgstr "" +msgstr "Показывать деления на оси" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:119 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:108 msgid "Show cell bars" -msgstr "" +msgstr "Наложить гистограммы на ячейки" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:161 -#, fuzzy +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:412 +msgid "Show chart description" +msgstr "Показать описание графика" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:226 msgid "Show columns total" -msgstr "Показать столбец" +msgstr "Показать общий итог по столбцам" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:67 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:66 msgid "Show data points as circle markers on the lines" msgstr "" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:357 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:359 +msgid "Show empty columns" +msgstr "Показывать пустые столбцы" + #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:52 msgid "" "Show hierarchical relationships of data, with with the value represented " "by area, showing proportion and contribution to the whole." msgstr "" +"Показывает иерархические взаимосвязи данных со значением, представленным " +"областью, показывая пропорцию и вклад в целое." -#: superset-frontend/packages/superset-ui-chart-controls/src/components/InfoTooltipWithTrigger.tsx:50 +#: superset-frontend/packages/superset-ui-chart-controls/src/components/InfoTooltipWithTrigger.tsx:52 msgid "Show info tooltip" -msgstr "" +msgstr "Показать информационную подсказку" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:736 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:786 msgid "Show label" -msgstr "Показать таблицу" +msgstr "Показывать метку" -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:86 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:85 msgid "Show labels when the node has children." -msgstr "" +msgstr "Показывать метки, когда у вершины есть дочерние элементы." -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:35 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:37 msgid "Show legend" -msgstr "" +msgstr "Показывать легенду" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx:168 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx:151 msgid "Show less columns" -msgstr "Показать колонку Druid" +msgstr "Показать меньше столбцов" -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:326 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:422 msgid "Show less..." -msgstr "" +msgstr "Показать меньше..." + +#: superset-frontend/src/components/Form/LabeledErrorBoundInput.tsx:140 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:200 +msgid "Show password." +msgstr "Показать пароль." -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:287 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:301 msgid "Show percentage" -msgstr "" +msgstr "Показывать долю" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:179 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:175 msgid "Show pointer" -msgstr "" +msgstr "Показывать указатель" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:245 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:241 msgid "Show progress" -msgstr "Свойства дашборда" +msgstr "Показывать прогресс" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:149 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:214 msgid "Show rows total" -msgstr "" +msgstr "Показать общий итог по строкам" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:109 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:111 msgid "Show series values on the chart" -msgstr "" +msgstr "Показать значения категорий на графике" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:218 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:214 msgid "Show split lines" -msgstr "" +msgstr "Показывать разделительные линии" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:297 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:317 msgid "Show the value on top of the bar" -msgstr "" +msgstr "Показать значение в верхней части столбца" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:121 -#, fuzzy +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:85 msgid "Show time column" -msgstr "Показать колонку Druid" +msgstr "Показать столбец времени" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:106 +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:74 #, fuzzy msgid "Show time grain dropdown" -msgstr "Включить фильтр на определенный интервал/диапазон времени" +msgstr "Включить фильтр на определенный интервал времени" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:351 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/metrics.tsx:107 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:363 msgid "" "Show total aggregations of selected metrics. Note that row limit does not" " apply to the result." msgstr "" +"Показать общие итоговые значения выбранных показателей. Обратите " +"внимание, что ограничение количества строк не применяется к результату." -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:87 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:349 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:76 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/metrics.tsx:105 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:361 msgid "Show totals" -msgstr "" +msgstr "Показывать общий итог" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:31 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:30 msgid "" "Showcases a single metric front-and-center. Big number is best used to " "call attention to a KPI or the one thing you want your audience to focus " "on." msgstr "" +"Отображает один показатель по центру. Карточку лучше всего использовать, " +"чтобы привлечь внимание к KPI." -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:30 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:32 msgid "" "Showcases a single number accompanied by a simple line chart, to call " "attention to an important metric along with its change over time or other" " dimension." msgstr "" +"Отображает один показатель, сопровождаемый простой линейной диаграммой, " +"чтобы привлечь внимание к KPI наряду с его изменением с течением времени " +"или другим измерением." -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:49 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:50 msgid "" "Showcases how a metric changes as the funnel progresses. This classic " "chart is useful for visualizing drop-off between stages in a pipeline or " "lifecycle." msgstr "" +"Отображает изменение показателя по мере сужения воронки. Эта классическая" +" диаграмма полезна для визуализации перехода между этапами процесса или " +"жизненного цикла." #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:28 msgid "" @@ -11178,21 +13636,27 @@ msgid "" "The value and corresponding thickness can be different for each side." msgstr "" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:27 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:28 msgid "" "Showcases the progress of a single metric against a given target. The " "higher the fill, the closer the metric is to the target." msgstr "" +"Демонстрирует прогресс одного показателя по отношению к заданной цели. " +"Чем больше заполнение, тем ближе показатель к целевому показателю." -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:305 -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:338 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:398 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:435 #, python-format msgid "Showing %s of %s" -msgstr "" +msgstr "Отображено %s из %s" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:152 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:178 msgid "Shows a list of all series available at that point in time" -msgstr "" +msgstr "Показывает список всех данных, доступных в определенный момент времени" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:725 +msgid "Shows or hides markers for the time series" +msgstr "Показывает или скрывает маркеры для временных рядов" #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:31 msgid "" @@ -11202,146 +13666,180 @@ msgid "" "hierarchically." msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:72 +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:64 msgid "Significance Level" msgstr "" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:262 -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:201 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:394 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:397 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:339 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:213 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:412 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:415 msgid "Simple" -msgstr "Простые" +msgstr "Столбец" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:390 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:408 msgid "Simple ad-hoc metrics are not enabled for this dataset" msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:186 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:187 msgid "Single" -msgstr "Мои" +msgstr "Один" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:45 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:46 -#, fuzzy msgid "Single Metric" -msgstr "Список показателей" +msgstr "Одна мера" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1234 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1076 msgid "Single Value" -msgstr "Значение фильтра" +msgstr "Единственное значение" -#: superset-frontend/src/filters/components/Range/controlPanel.ts:65 -#, fuzzy +#: superset-frontend/src/filters/components/Range/controlPanel.ts:67 msgid "Single value" -msgstr "Значение фильтра" +msgstr "Единственное значение" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1251 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1093 msgid "Single value type" -msgstr "" +msgstr "Тип единственного значения" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:261 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:262 msgid "Size of edge symbols" msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:230 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:168 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:129 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:109 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:126 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:184 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:187 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:232 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:157 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:144 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:86 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:86 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:141 msgid "Size of marker. Also applies to forecast observations." -msgstr "" +msgstr "Размер маркера. Также применяется к прогнозным значениям." #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:34 msgid "Sizes of vehicles" msgstr "" -#: superset/views/database/forms.py:199 +#: superset/views/database/forms.py:177 msgid "Skip Blank Lines" -msgstr "Пропустить пустые строки" +msgstr "Пропуск пустых строк" -#: superset/views/database/forms.py:184 +#: superset/views/database/forms.py:174 msgid "Skip Initial Space" -msgstr "Убрать пробелы" +msgstr "Пропуск начального пробела" -#: superset/views/database/forms.py:187 superset/views/database/forms.py:328 +#: superset/views/database/forms.py:260 superset/views/database/forms.py:354 msgid "Skip Rows" -msgstr "Игнорировать" - -#: superset/views/database/forms.py:200 -msgid "Skip blank lines rather than interpreting them as NaN values." -msgstr "Пропустите пустые строки, а не интерпретировать их как значения NaN." +msgstr "Пропуск строк" -#: superset/views/database/forms.py:184 -msgid "Skip spaces after delimiter." -msgstr "Пропустить пробелы после разделителя." +#: superset/views/database/forms.py:178 +msgid "Skip blank lines rather than interpreting them as Not A Number values" +msgstr "Пропускать пустые строки, вместо их перевода в пустые строки (NaN)" -#: superset/views/schedules.py:243 superset/views/schedules.py:323 -msgid "Slack Channel" -msgstr "Канал Slack" +#: superset/views/database/forms.py:174 +msgid "Skip spaces after delimiter" +msgstr "Пропускать пробелы после разделителя" #: superset/views/dashboard/mixin.py:80 msgid "Slug" msgstr "Читаемый URL" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:39 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:73 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:39 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:73 #: superset-frontend/src/dashboard/util/headerStyleOptions.ts:25 msgid "Small" -msgstr "" +msgstr "Маленький" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:153 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:149 msgid "Small number format" +msgstr "Форматирование маленьких чисел" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:143 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:76 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:76 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:75 +msgid "Smooth Line" +msgstr "Гладкая линия" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:61 +msgid "" +"Smooth-line is a variation of the line chart. Without angles and hard " +"edges, Smooth-line sometimes looks smarter and more professional." msgstr "" -#: superset/commands/exceptions.py:112 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:672 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:687 +msgid "Solid" +msgstr "Сплошной" + +#: superset/commands/exceptions.py:115 msgid "Some roles do not exist" -msgstr "Дашборды отсутствуют" +msgstr "Некоторые роли не существуют" + +#: superset-frontend/src/dashboard/components/URLShortLinkButton/index.tsx:64 +msgid "Something went wrong." +msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:623 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:814 #, python-format msgid "Sorry there was an error fetching database information: %s" msgstr "К сожалению, произошла ошибка при получении информации о базе данных: %s" -#: superset-frontend/src/dashboard/actions/sliceEntities.js:121 +#: superset-frontend/src/dashboard/actions/sliceEntities.js:131 msgid "Sorry there was an error fetching saved charts: " msgstr "Извините, произошла ошибка при загрузке графиков: " -#: superset-frontend/src/explore/components/DataTablesPane/index.tsx:273 -#: superset-frontend/src/explore/components/controls/ViewQueryModal.tsx:84 +#: superset-frontend/src/explore/components/controls/ViewQueryModal.tsx:64 msgid "Sorry, An error occurred" msgstr "Извините, произошла ошибка" -#: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:65 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:126 +#: superset-frontend/src/components/Chart/chartAction.js:639 +#: superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx:89 +msgid "Sorry, an error occurred" +msgstr "Извините, произошла ошибка" + +#: superset-frontend/src/dashboard/actions/dashboardState.js:357 +msgid "Sorry, an unknown error occurred" +msgstr "Извините, произошла неизвестная ошибка" + +#: superset-frontend/src/utils/getClientErrorObject.ts:97 +msgid "Sorry, an unknown error occurred." +msgstr "Извините, произошла неизвестная ошибка." + +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:114 +msgid "Sorry, something went wrong. Embedding could not be deactivated." +msgstr "Извините, что-то пошло не так. Встраивание не может быть деактивировано." + +#: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:71 +#: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:84 +#: superset-frontend/src/explore/components/EmbedCodeContent.jsx:58 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:130 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:187 msgid "Sorry, something went wrong. Try again later." -msgstr "" +msgstr "Извините, что-то пошло не так. Попробуйте еще раз позже." #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/EventFlow.tsx:50 msgid "Sorry, there appears to be no data" -msgstr "" +msgstr "Извините, похоже, что данные отсутствуют" -#: superset-frontend/src/dashboard/actions/dashboardState.js:238 +#: superset-frontend/src/utils/getClientErrorObject.ts:100 #, fuzzy, python-format +msgid "Sorry, there was an error saving this %s: %s" +msgstr "Извините, произошла ошибка при сохранении дашборда: %s" + +#: superset-frontend/src/dashboard/actions/dashboardState.js:360 +#, python-format msgid "Sorry, there was an error saving this dashboard: %s" -msgstr "Извините, произошла ошибка при загрузке графиков: " +msgstr "Извините, произошла ошибка при сохранении дашборда: %s" -#: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:55 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:115 #: superset-frontend/src/views/CRUD/data/components/SyntaxHighlighterCopy/index.tsx:76 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:219 -#: superset-frontend/src/views/CRUD/hooks.ts:604 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:220 +#: superset-frontend/src/views/CRUD/hooks.ts:632 msgid "Sorry, your browser does not support copying." msgstr "" "Извините, Ваш браузер не поддерживание копирование. Используйте сочетание" " клавиш [CTRL + C] для WIN или [CMD + C] для MAC." -#: superset-frontend/src/components/CopyToClipboard/index.jsx:79 +#: superset-frontend/src/components/CopyToClipboard/index.jsx:81 msgid "Sorry, your browser does not support copying. Use Ctrl / Cmd + C!" msgstr "" "Извините, Ваш браузер не поддерживание копирование. Используйте сочетание" @@ -11349,199 +13847,206 @@ msgstr "" #: superset-frontend/src/components/ListView/CardSortSelect.tsx:82 #: superset-frontend/src/components/ListView/CardSortSelect.tsx:83 -#, fuzzy +#: superset-frontend/src/components/Table/index.tsx:266 msgid "Sort" -msgstr "рассылка" +msgstr "Сортировка" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:92 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:83 msgid "Sort Bars" -msgstr "Сортировка" +msgstr "Сортировать столбцы" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:42 -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:45 -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:40 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:48 -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:47 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:46 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:44 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:59 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:354 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:105 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:89 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:86 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:83 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:89 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:90 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:256 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:98 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:158 msgid "Sort Descending" -msgstr "Сортировать" +msgstr "Сортировать по убыванию" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1198 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1040 msgid "Sort Metric" -msgstr "Показатель для сортировки" +msgstr "Мера для сортировки" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:251 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:265 msgid "Sort X Axis" -msgstr "" +msgstr "Сортировка оси X" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:263 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:277 msgid "Sort Y Axis" -msgstr "" +msgstr "Сортировка оси Y" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1188 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1030 #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:205 #: superset-frontend/src/filters/components/Select/controlPanel.ts:66 msgid "Sort ascending" -msgstr "Направление сортировки" +msgstr "Сортировать по возрастанию" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:95 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:86 msgid "Sort bars by x labels." -msgstr "" +msgstr "Сортировать столбцы по меткам на оси X" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:125 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:369 -#: superset-frontend/src/dashboard/components/SliceAdder.jsx:259 -#: superset-frontend/src/explore/controls.jsx:384 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:190 +#: superset-frontend/src/dashboard/components/SliceAdder.jsx:325 +#: superset-frontend/src/explore/controls.jsx:364 msgid "Sort by" msgstr "Сортировка" -#: superset-frontend/src/dashboard/components/SliceAdder.jsx:256 -#, fuzzy, python-format +#: superset-frontend/src/dashboard/components/SliceAdder.jsx:322 +#, python-format msgid "Sort by %s" -msgstr "Сортировка" - -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:39 -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:38 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:94 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:55 -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:39 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:62 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:65 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:62 +msgstr "Сорт. по %s" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:43 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:95 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:59 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:44 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:64 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:62 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:63 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:61 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:51 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:49 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:38 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:42 msgid "Sort by metric" -msgstr "Показатель для сортировки" +msgstr "Сортировка по мере" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:184 +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:213 msgid "Sort columns alphabetically" msgstr "Отсортировать столбцы в алфавитном порядке" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:257 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:322 msgid "Sort columns by" -msgstr "Отсортировать столбцы в алфавитном порядке" +msgstr "Сортировать столбцы по" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/legacySortBy.tsx:29 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:337 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1189 -#: superset-frontend/src/explore/controlPanels/sections.tsx:125 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/orderBy.tsx:46 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:348 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1031 msgid "Sort descending" -msgstr "Сортировать" +msgstr "Сортировка по убыванию" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1167 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1009 msgid "Sort filter values" -msgstr "Фильтрующийся" +msgstr "Сортировать отфильтрованные значения" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1211 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1053 #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:184 #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:188 msgid "Sort metric" msgstr "Показатель для сортировки" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:229 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:294 msgid "Sort rows by" -msgstr "Сортировка" +msgstr "Сортировка строк по" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1181 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1023 msgid "Sort type" -msgstr "Тип графика" +msgstr "Тип сортировки" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:60 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:52 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1189 +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:64 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:53 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1349 msgid "Source" msgstr "Источник" -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:104 #: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:43 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:33 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:37 msgid "Source / Target" -msgstr "Имя источника данных" +msgstr "Источник / Цель" #: superset-frontend/src/SqlLab/components/HighlightedSql/index.tsx:76 msgid "Source SQL" -msgstr "Источник SQL" +msgstr "Исходный SQL" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:73 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:74 msgid "Source category" -msgstr "Имя источника данных" +msgstr "Исходная категория" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:804 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:73 +msgid "Sparkline" +msgstr "Спарклайн" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:972 msgid "Spatial" msgstr "" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:90 +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:87 msgid "Specific Date/Time" -msgstr "" +msgstr "Конкретная дата/время" -#: superset/views/database/forms.py:127 superset/views/database/forms.py:286 -#: superset/views/database/forms.py:414 +#: superset/views/database/forms.py:312 superset/views/database/forms.py:443 msgid "Specify a schema (if database flavor supports this)." -msgstr "Укажите схему (если это поддерживается базой данных)." +msgstr "Укажите схему (если она поддерживается базой данных)." -#: superset/views/database/forms.py:172 superset/views/database/forms.py:325 +#: superset/views/database/forms.py:351 msgid "Specify duplicate columns as \"X.0, X.1\"." -msgstr "" -"Если есть столбцы с одинаковым именем, то присвоить им порядковые номера " -"- столбец1, столбец2, … и т.д." +msgstr "Обозначить повторяющиеся столбцы как \"X.0, X.1\"." + +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:689 +msgid "Specify name to CREATE TABLE AS schema in: public" +msgstr "Укажите имя новой таблицы для CREATE TABLE AS" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:494 +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:688 +msgid "Specify name to CREATE VIEW AS schema in: public" +msgstr "Укажите имя нового представления для CREATE VIEW AS" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:515 msgid "" "Specify the database version. This should be used with Presto in order to" " enable query cost estimation." msgstr "" +"Укажите версию базы данных. Это необходимо для Presto, чтобы включить " +"оценку стоимости запроса" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:230 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:226 msgid "Split number" -msgstr "Big Number" +msgstr "Количество разделителей" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:156 -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:117 -msgid "Stack series" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:84 +msgid "Square kilometers" +msgstr "Квадратные километры" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:83 +msgid "Square meters" +msgstr "Квадратные метры" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:85 +msgid "Square miles" +msgstr "Квадратные мили" + +#: superset-frontend/plugins/plugin-chart-echarts/src/constants.ts:82 +msgid "Stack" msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:159 -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:120 -msgid "Stack series on top of each other" +#: superset-frontend/packages/superset-ui-core/src/chart/components/FallbackComponent.tsx:51 +msgid "Stack Trace:" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:37 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:158 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:119 +msgid "Stack series" +msgstr "Использовать накопление" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:161 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:112 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:122 +msgid "Stack series on top of each other" +msgstr "Совместить столбцы в один с накоплением" + +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:40 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:51 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:40 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:47 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:84 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:83 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:68 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:41 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:53 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:86 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:75 msgid "Stacked" -msgstr "" +msgstr "С наполнением" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:305 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:325 msgid "Stacked Bars" -msgstr "" +msgstr "Столбцы с накоплением" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:52 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:108 +#: superset-frontend/src/explore/fixtures.tsx:58 msgid "Stacked Style" msgstr "" @@ -11549,210 +14054,333 @@ msgstr "" msgid "Stacked style" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:88 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:81 msgid "Standard time series" msgstr "" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:155 -#: superset/views/annotations.py:79 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:73 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:169 msgid "Start" -msgstr "Время начала" +msgstr "Начало" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/Arc.jsx:40 +msgid "Start (Longitude, Latitude): " +msgstr "Старт (Долгота, Широта): " + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:52 +msgid "Start Longitude & Latitude" +msgstr "Начальные долгота и широта" #: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:79 #, fuzzy msgid "Start Review" -msgstr "Предпросмотр данных" +msgstr "Начать предпросмотр" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:110 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:106 msgid "Start angle" -msgstr "Изменения не сохранены" +msgstr "Начальный угол" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:125 -#, fuzzy +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:128 msgid "Start at (UTC)" -msgstr "Время начала" +msgstr "Время начала (UTC)" + +#: superset-frontend/src/components/ListView/Filters/DateRange.tsx:67 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:307 +#, fuzzy +msgid "Start date" +msgstr "Начальный угол" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:66 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:117 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:131 msgid "Start date included in time range" -msgstr "" +msgstr "Начальная дата включена во временной интервал" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:109 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:101 msgid "Start y-axis at 0" -msgstr "" +msgstr "Начать ось Y с 0" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:112 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:104 msgid "" "Start y-axis at zero. Uncheck to start y-axis at minimum value in the " "data." msgstr "" +"Начать ось Y в нуле. Снимите флаг, чтобы ось Y начиналась на минимальном " +"значении данных" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:94 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:348 +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:97 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:367 msgid "State" msgstr "Состояние" +#: superset/sql_lab.py:511 +#, python-format +msgid "Statement %(statement_num)s out of %(statement_count)s" +msgstr "" + #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:30 #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:55 msgid "Statistical" -msgstr "" +msgstr "Статистический учет" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:399 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:302 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:492 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:487 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:317 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:522 msgid "Status" msgstr "Статус" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:112 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:147 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:79 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:80 +msgid "Step - end" +msgstr "" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:146 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:78 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:79 +msgid "Step - middle" +msgstr "" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:145 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:77 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:78 +msgid "Step - start" +msgstr "" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:69 #, fuzzy msgid "Step type" msgstr "Таблица Данных" -#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:49 -#: superset-frontend/src/explore/components/QueryAndSaveBtns.jsx:66 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:66 +#, fuzzy +msgid "Stepped Line" +msgstr "Таблица временных рядов" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:52 +msgid "" +"Stepped-line graph (also called step chart) is a variation of line chart " +"but with the line forming a series of steps between data points. A step " +"chart can be useful when you want to show the changes that occur at " +"irregular intervals." +msgstr "" + +#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:46 +#: superset-frontend/src/explore/components/RunQueryButton/index.tsx:45 msgid "Stop" msgstr "Стоп" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:339 +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:328 msgid "Stop query" msgstr "Остановить запрос" +#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:116 +msgid "Stop running (Ctrl + e)" +msgstr "Остановить выполнение (CTRL + X)" + #: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:115 msgid "Stop running (Ctrl + x)" -msgstr "Остановить (Ctrl + x)" +msgstr "Остановить выполнение (CTRL + X)" -#: superset/databases/commands/exceptions.py:126 +#: superset/databases/commands/exceptions.py:128 msgid "Stopped an unsafe database connection" -msgstr "Выберите любые столбцы для проверки метаданных" +msgstr "" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:228 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:374 +msgid "Streets" +msgstr "Схема" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:268 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:269 msgid "Strength to pull the graph toward center" -msgstr "" +msgstr "Сила притяжения вершин к центру" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:36 msgid "Stretched style" msgstr "" -#: superset/views/database/forms.py:273 +#: superset/views/database/forms.py:299 msgid "Strings used for sheet names (default is the first sheet)." -msgstr "Строки, используемые для имён листов (по-умолчанию это первый лист)." +msgstr "Имя листа (по умолчанию первый лист)" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:45 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:234 +msgid "Stroke Color" +msgstr "Цвет обводки" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:119 +msgid "Stroke Width" +msgstr "Ширина обводки" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:259 +msgid "Stroked" +msgstr "С обводкой" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:47 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:45 msgid "Structural" -msgstr "" +msgstr "Структура" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:621 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:669 msgid "Style" msgstr "Стиль" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:272 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:268 msgid "Style the ends of the progress bar with a round cap" -msgstr "" +msgstr "Оформление концов индикатора круглыми заглушками" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:56 msgid "Subdomain" -msgstr "" +msgstr "Подблок" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:46 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:47 msgid "Subheader" -msgstr "Строка заголовков" +msgstr "Подзаголовок" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:62 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:62 msgid "Subheader Font Size" -msgstr "" - -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:63 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:54 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:142 +msgstr "Размер шрифта подзаголовка" + +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:209 +msgid "Submit" +msgstr "Отправить" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx:466 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx:666 +#: superset/charts/post_processing.py:160 +#: superset/charts/post_processing.py:177 +msgid "Subtotal" +msgstr "Подытог" + +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:114 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:63 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:154 msgid "Success" msgstr "Успешно" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:62 -msgid "Suffix to apply after the percentage display" +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:193 +msgid "Successfully changed dataset!" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:98 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:68 +msgid "Suffix to apply after the percentage display" +msgstr "Текст после отображения процентной доли" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:182 +msgid "Sum" +msgstr "Сумма" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:193 +msgid "Sum as Fraction of Columns" +msgstr "Сумма как доля столбцов" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:192 +msgid "Sum as Fraction of Rows" +msgstr "Сумма как доля строк" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:191 +msgid "Sum as Fraction of Total" +msgstr "Сумма как доля целого" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:91 msgid "Sum of values over specified period" -msgstr "" +msgstr "Сумма значений за обозначенный период" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:191 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:265 +msgid "Sum values" +msgstr "Суммарные значения" -#: superset/viz.py:1856 +#: superset/viz.py:1885 msgid "Sunburst" -msgstr "Sunburst" +msgstr "Диаграмма Солнечные лучи" #: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:32 -#, fuzzy msgid "Sunburst Chart" -msgstr "График Superset" +msgstr "Диаграмма Солнечные лучи" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/index.ts:41 +#, fuzzy +msgid "Sunburst Chart v2" +msgstr "Диаграмма Солнечные лучи" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:56 msgid "Sunday" msgstr "Воскресенье" -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:121 -#, fuzzy +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:125 msgid "Superset Chart" msgstr "График Superset" -#: superset-frontend/src/components/AnchorLink/index.jsx:84 -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:318 +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:187 +msgid "Superset Embedded SDK documentation." +msgstr "" + +#: superset-frontend/src/dashboard/components/AnchorLink/index.tsx:72 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:498 msgid "Superset chart" msgstr "График Superset" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:218 +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:239 msgid "Superset dashboard" msgstr "Дашборд Superset" -#: superset/errors.py:105 -#, fuzzy +#: superset/errors.py:111 msgid "Superset encountered an error while running a command." -msgstr "Обнаружена ошибка в запросе." +msgstr "Суперсет столкнулся с ошибкой во время выполнения команды." -#: superset/errors.py:106 -#, fuzzy +#: superset/errors.py:112 msgid "Superset encountered an unexpected error." -msgstr "Неожиданная ошибка графика рассылки" +msgstr "Суперсет столкнулся с неожиданной ошибкой." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:670 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:870 msgid "Supported databases" -msgstr "Выберите базу данных" +msgstr "Поддерживаемые базы данных" #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:34 msgid "Survey Responses" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:112 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:101 msgid "Swap Groups and Columns" -msgstr "" +msgstr "Поменять местами группы и столбцы" + +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:254 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:311 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:435 +msgid "Swap dataset" +msgstr "Сменить датасет" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:175 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:240 msgid "Swap rows and columns" +msgstr "Поменять местами строки и столбцы" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:51 +msgid "" +"Swiss army knife for visualizing data. Choose between step, line, " +"scatter, and bar charts. This viz type has many customization options as " +"well." msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:59 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:54 msgid "" -"Swiss army knife for visualizing time series data. Choose between step, " +"Swiss army knife for visualizing time series data. Choose between step, " "line, scatter, and bar charts. This viz type has many customization " "options as well." msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:210 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:211 msgid "Symbol" msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:125 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:126 msgid "Symbol of two ends of edge line" msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:255 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:256 #, fuzzy msgid "Symbol size" msgstr "Размер маркера" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1223 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1383 msgid "Sync columns from source" msgstr "Синхронизировать столбцы из источника" @@ -11764,11 +14392,21 @@ msgstr "Синхронизировать столбцы из источника" msgid "Syntax" msgstr "" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:250 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:305 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:268 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:306 msgid "TABLES" msgstr "ТАБЛИЦЫ" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:279 +#, fuzzy +msgid "TEMPORAL X-AXIS" +msgstr "Содержит дату/время" + +#: superset-frontend/src/explore/constants.ts:91 +#, fuzzy +msgid "TEMPORAL_RANGE" +msgstr "Содержит дату/время" + #: superset-frontend/src/components/CronPicker/CronPicker.tsx:85 msgid "THU" msgstr "ЧТ" @@ -11777,45 +14415,45 @@ msgstr "ЧТ" msgid "TUE" msgstr "ВТ" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:218 -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:145 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:236 +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:147 msgid "Tab name" -msgstr "Имя Таблицы" +msgstr "Имя вкладки" -#: superset-frontend/src/dashboard/util/newComponentFactory.js:56 -#: superset-frontend/src/dashboard/util/newComponentFactory.js:57 +#: superset-frontend/src/dashboard/util/newComponentFactory.js:58 +#: superset-frontend/src/dashboard/util/newComponentFactory.js:59 msgid "Tab title" -msgstr "" +msgstr "Имя вкладки" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:25 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:50 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:26 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:51 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:35 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:41 -#: superset-frontend/src/components/TableSelector/index.tsx:293 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:24 -#: superset/connectors/sqla/views.py:148 superset/connectors/sqla/views.py:260 -#: superset/connectors/sqla/views.py:488 superset/views/chart/mixin.py:87 +#: superset-frontend/src/components/TableSelector/index.tsx:313 +#: superset-frontend/src/visualizations/TimeTable/index.ts:26 +#: superset/connectors/sqla/views.py:161 superset/connectors/sqla/views.py:256 +#: superset/connectors/sqla/views.py:478 superset/views/chart/mixin.py:87 msgid "Table" msgstr "Таблица" -#: superset/views/core.py:1761 +#: superset/views/core.py:1726 #, python-format msgid "Table %(table)s wasn't found in the database %(db)s" -msgstr "Таблица %(table)s не найдена в базе данных %(db)s" +msgstr "" -#: superset/views/database/forms.py:138 superset/views/database/forms.py:291 -#: superset/views/database/forms.py:419 +#: superset/views/database/forms.py:317 superset/views/database/forms.py:448 msgid "Table Exists" -msgstr "Метод добавления" +msgstr "Таблица существует" -#: superset/connectors/sqla/views.py:498 superset/views/database/forms.py:95 -#: superset/views/database/forms.py:246 superset/views/database/forms.py:379 +#: superset/connectors/sqla/views.py:488 superset/views/database/forms.py:128 +#: superset/views/database/forms.py:269 superset/views/database/forms.py:405 msgid "Table Name" -msgstr "Имя Таблицы" +msgstr "Имя таблицы" -#: superset/viz.py:671 +#: superset/viz.py:695 +#, fuzzy msgid "Table View" -msgstr "Табличный вид" +msgstr "Убрать предпросмотр таблицы" #: superset/datasets/commands/exceptions.py:130 #, python-format @@ -11823,23 +14461,36 @@ msgid "" "Table [%(table_name)s] could not be found, please double check your " "database connection, schema, and table name" msgstr "" -"Не удалось найти таблицу [%(table_name)s]. Пожалуйста, проверьте " -"подключение к базе данных, схему и имя таблицы" +"Не удается найти таблицу \"%(table_name)s\", пожалуйста, проверьте ваше " +"соединение с базой данных, схему и имя таблицы" -#: superset/views/base.py:251 +#: superset/views/base.py:293 msgid "" "Table [%{table}s] could not be found, please double check your database " "connection, schema, and table name, error: {}" msgstr "" -"Не удалось найти таблицу [{}]. Проверьте подключение к базе данных, схему" -" и имя таблицы." +"Не удается найти таблицу \"%(table)s\", пожалуйста, проверьте ваше " +"соединение с базой данных, схему и имя таблицы, ошибка: {}" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:257 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:268 msgid "Table cache timeout" -msgstr "Тайм-аут Кэша" +msgstr "Время жизни кэша таблицы" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.tsx:176 +msgid "Table columns" +msgstr "Столбцы таблицы" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/index.tsx:246 +#, fuzzy +msgid "Table loading" +msgstr "Загрузка таблицы" + +#: superset/views/database/forms.py:132 superset/views/database/forms.py:273 +#: superset/views/database/forms.py:409 +msgid "Table name cannot contain a schema" +msgstr "Имя таблицы не может содержать схему" -#: superset/databases/decorators.py:46 +#: superset/databases/decorators.py:47 msgid "Table name undefined" msgstr "Имя таблицы не определено" @@ -11848,28 +14499,31 @@ msgid "" "Table that visualizes paired t-tests, which are used to understand " "statistical differences between groups." msgstr "" +"Таблица, визуализирующая парные t-тесты, которые используются для " +"нахождения статистических различий между группами." -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:269 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:324 -#: superset/connectors/sqla/views.py:367 superset/connectors/sqla/views.py:395 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:287 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:325 +#: superset/connectors/sqla/views.py:364 superset/connectors/sqla/views.py:385 msgid "Tables" msgstr "Таблицы" #: superset-frontend/src/dashboard/components/gridComponents/new/NewTabs.jsx:31 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx:64 msgid "Tabs" msgstr "Вкладки" #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:30 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:57 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:50 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:34 +#: superset-frontend/src/visualizations/TimeTable/index.ts:37 msgid "Tabular" -msgstr "" +msgstr "Таблицы" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:607 -#, fuzzy +#: superset-frontend/src/components/MetadataBar/ContentConfig.tsx:126 +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:683 msgid "Tags" -msgstr "Статус" +msgstr "Теги" #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:29 msgid "" @@ -11877,37 +14531,38 @@ msgid "" "densest areas of information lie" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:62 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:70 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:63 msgid "Target" -msgstr "Время начала" +msgstr "Цель" -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:67 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:92 +msgid "Target Color" +msgstr "Целевой цвет" + +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:57 msgid "Target aspect ratio for treemap tiles." msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:86 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:87 msgid "Target category" -msgstr "Время начала" +msgstr "Целевая категория" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:176 -#, fuzzy +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:173 msgid "Target value" -msgstr "Время начала" +msgstr "Целевое значение" -#: superset/views/css_templates.py:44 +#: superset/views/css_templates.py:46 msgid "Template Name" -msgstr "Имя Шаблона" +msgstr "Имя шаблона" -#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:94 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:788 -#: superset/connectors/sqla/views.py:504 +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:99 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:956 +#: superset/connectors/sqla/views.py:494 msgid "Template parameters" msgstr "Параметры шаблона" -#: superset-frontend/src/explore/controlPanels/TimeTable.js:52 +#: superset-frontend/src/visualizations/TimeTable/controlPanel.js:52 msgid "" "Templated link, it's possible to include {{ metric }} or other values " "coming from the controls." @@ -11915,87 +14570,102 @@ msgstr "" "Шаблонная ссылка, можно включить {{ metric }} или другие значения, " "поступающие из элементов управления." -#: superset/models/sql_types/base.py:54 -#, python-format -msgid "Temporal expression not supported for type: %(col_type)s" -msgstr "" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:307 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:317 msgid "" "Terminate running queries when browser window closed or navigated to " "another page. Available for Presto, Hive, MySQL, Postgres and Snowflake " "databases." msgstr "" +"Завершать выполнение запросов после закрытия браузерной вкладки или " +"пользователь переключился на другую вкладку. Доступно для баз данных " +"Presto, Hive, MySQL, Postgres и Snowflake." #: superset/templates/superset/models/database/macros.html:22 msgid "Test Connection" msgstr "Тестовое соединение" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:95 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:112 msgid "Test connection" msgstr "Тестовое соединение" -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:35 -#, fuzzy +#: superset-frontend/src/dashboard/components/gridComponents/new/NewMarkdown.jsx:31 +#: superset-frontend/src/visualizations/TimeTable/index.ts:38 msgid "Text" -msgstr "След" +msgstr "Текст" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:105 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:94 msgid "Text align" -msgstr "" +msgstr "Выравнивание текста" -#: superset-frontend/src/components/ReportModal/index.tsx:289 +#: superset-frontend/src/components/ReportModal/index.tsx:242 msgid "Text embedded in email" -msgstr "" +msgstr "Текст, включенный в email" #: superset/views/dashboard/mixin.py:53 msgid "" "The CSS for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" -msgstr "В этом поле можно задать индивидуальный стиль для дашборда с помощью CSS" +msgstr "" -#: superset/errors.py:118 -#, fuzzy +#: superset/errors.py:124 msgid "" "The CTAS (create table as select) doesn't have a SELECT statement at the " "end. Please make sure your query has a SELECT as its last statement. " "Then, try running your query again." msgstr "" -"CTAS (create table as select) может быть выполнено только в запросе, " -"последняя операция которого SELECT." +"CTAS (CREATE TABLE AS SELECT) не содержит SELECT запрос в конце. " +"Пожалуйста, убедитесь, что ваш запрос имеет SELECT запрос в конце. Затем " +"попробуйте повторно выполнить запрос." + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/index.js:27 +msgid "" +"The GeoJsonLayer takes in GeoJSON formatted data and renders it as " +"interactive polygons, lines and points (circles, icons and/or texts)." +msgstr "" +"Диаграмма принимает данные в формате GeoJSON и отображает их в виде " +"интерактивных полигонов, линий и точек (кругов, значков и/или текста)." + +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:406 +msgid "The URL is missing the dataset_id or slice_id parameters." +msgstr "" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:921 -msgid "The JSON metric or post aggregation definition." +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:307 +msgid "The X-axis is not on the filters list" msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:126 +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:309 msgid "" -"The URL could not be identified. Please check for typos and make sure " -"that \"Type of google sheet allowed\" selection matches the input" +"The X-axis is not on the filters list which will prevent it from being " +"used in\n" +" time range filters in dashboards. Would you like to add it to" +" the filters list?" msgstr "" -#: superset/views/core.py:354 +#: superset/views/core.py:370 msgid "The access requests seem to have been deleted" -msgstr "Запросы доступа, похоже, были удалены" +msgstr "" #: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:168 -#, fuzzy msgid "The annotation has been saved" -msgstr "Дашборд сохранен" +msgstr "Аннотация сохранена" #: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:152 -#, fuzzy msgid "The annotation has been updated" -msgstr "Аннотация не может быть обновлена." +msgstr "Аннотация обновлена" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:74 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:75 msgid "" "The category of source nodes used to assign colors. If a node is " "associated with more than one category, only the first will be used." msgstr "" +"Категория исходных вершин предназначена для задания цветов. Если вершина " +"связана более, чем с одной категорией, только первая будет использована." -#: superset/common/query_context_processor.py:449 -#, fuzzy +#: superset/common/query_context_processor.py:582 +msgid "The chart datasource does not exist" +msgstr "Источник данных графика не существует" + +#: superset/common/query_context_processor.py:580 msgid "The chart does not exist" msgstr "График не существует" @@ -12008,109 +14678,117 @@ msgid "" " Pie charts can be difficult to interpret precisely. If clarity of" " relative proportion is important, consider using a bar or other chart " "type instead." -msgstr "" +msgstr "Классическая круговая/кольцевая диаграмма." -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:261 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:266 msgid "The color for points and clusters in RGB" -msgstr "" +msgstr "Цвет для маркеров и кластеров в RGB" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:478 -#: superset-frontend/src/explore/controls.jsx:484 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:341 +#: superset-frontend/src/explore/controls.jsx:464 msgid "The color scheme for rendering chart" msgstr "Цветовая схема, применяемая для раскрашивания графика" -#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:66 +#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx:55 msgid "" "The color scheme is determined by the related dashboard.\n" -" Edit the color scheme in the dashboard properties." +" Edit the color scheme in the dashboard properties." msgstr "" +"Цветовая схема определена соответствующим дашбордом.\n" +" Измените цветовую схему в свойствах дашборда." -#: superset/errors.py:99 -#, fuzzy +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:196 +msgid "The column header label" +msgstr "Заголовок столбца" + +#: superset/errors.py:105 msgid "The column was deleted or renamed in the database." -msgstr "Проблема 1004 - Столбец был удалён или переименован в базе данных." +msgstr "Столбец был удален или переименован в базе данных." -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:47 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:49 msgid "" "The country code standard that Superset should expect to find in the " "[country] column" -msgstr "" +msgstr "Код страны, который Суперсет ожидает найти в столбце со страной" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:327 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:392 msgid "The dashboard has been saved" msgstr "Дашборд сохранен" -#: superset/views/core.py:182 +#: superset/views/core.py:195 msgid "The data source seems to have been deleted" msgstr "Источник данных, похоже, был удален" -#: superset/connectors/sqla/views.py:103 +#: superset/connectors/sqla/views.py:116 msgid "" "The data type that was inferred by the database. It may be necessary to " "input a type manually for expression-defined columns in some cases. In " "most case users should not need to alter this." msgstr "" -"Задать тип данных. В некоторых случаях может потребоваться ввести тип " -"вручную для столбцов, которые формируются специальными запросами. В " -"большинстве случаев изменять содержимое этого поля не обязательно." -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:439 -#, fuzzy, python-format +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:512 +#, python-format msgid "" "The database %s is linked to %s charts that appear on %s dashboards and " "users have %s SQL Lab tabs using this database open. Are you sure you " "want to continue? Deleting the database will break those objects." msgstr "" -"Датасет %s привязан к графикам %s, которые используются в дашбордах %s. " -"Вы уверены, что хотите продолжить? Удаление датасета приведёт к " -"неработоспособности этих объектов." +"База данных %s привязана к %s графику(-ам), который(-ые) " +"используется(-ются) в %s дашборде(-ах), и пользователи имеют %s " +"открытую(-ых) вкладку(-ок) в Лаборатории SQL. Вы уверены, что хотите " +"продолжить? Удаление базы данных приведёт к неработоспособности этих " +"компонентов." -#: superset/errors.py:126 -msgid "The database is currently running too many queries." +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:198 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/sharedDndControls.jsx:28 +msgid "The database columns that contains lines information" msgstr "" -#: superset/errors.py:93 -#, fuzzy +#: superset/errors.py:132 +msgid "The database is currently running too many queries." +msgstr "В настоящий момент база данных обрабатывает слишком много запросов." + +#: superset/errors.py:99 msgid "The database is under an unusual load." -msgstr "Проблема 1001 - Необычная загрузка базы данных." +msgstr "Нетипично высокая загрузка базы данных" -#: superset/sqllab/command.py:149 +#: superset/sqllab/commands/execute.py:168 msgid "" "The database referenced in this query was not found. Please contact an " "administrator for further assistance or try again." msgstr "" +"База данных, указанная в этом запросе, не найдена. Пожалуйста, обратитесь" +" к своему администратору или попробуйте еще раз." -#: superset/errors.py:94 -#, fuzzy +#: superset/errors.py:100 msgid "The database returned an unexpected error." -msgstr "Проблема 1002 - База данных вернула непредвиденную ошибку." +msgstr "База данных вернула неожиданную ошибку" -#: superset/errors.py:138 -#, fuzzy +#: superset/errors.py:144 msgid "The database was deleted." -msgstr "Источник данных, похоже, был удален" +msgstr "База данных была удалена" -#: superset/views/core.py:2085 superset/views/core.py:2155 -#, fuzzy +#: superset/datasets/commands/duplicate.py:60 superset/views/core.py:1980 msgid "The database was not found." -msgstr "База данных не найдена." +msgstr "Не удалось найти базу данных" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:592 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:738 #, python-format msgid "" "The dataset %s is linked to %s charts that appear on %s dashboards. Are " "you sure you want to continue? Deleting the dataset will break those " "objects." msgstr "" -"Датасет %s привязан к графикам %s, которые используются в дашбордах %s. " -"Вы уверены, что хотите продолжить? Удаление датасета приведёт к " -"неработоспособности этих объектов." +"Датасет %s привязан к %s графику(-ам), который(-ые) используется(-ются) в" +" %s дашборде(-ах). Вы уверены, что хотите продолжить? Удаление датасета " +"приведёт к неработоспособности этих объектов." -#: superset-frontend/src/chart/Chart.jsx:73 superset/views/utils.py:268 +#: superset-frontend/src/components/Chart/Chart.jsx:84 +#: superset/views/utils.py:273 msgid "The dataset associated with this chart no longer exists" -msgstr "" +msgstr "Датасет, связанный с этим графиком, больше не существует" -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:167 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:164 msgid "" "The dataset configuration exposed here\n" " affects all the charts using this dataset.\n" @@ -12118,120 +14796,106 @@ msgid "" " here may affect other charts\n" " in undesirable ways." msgstr "" -"Здесь представлена конфигурация датасета\n" +"Представленная здесь конфигурация датасета\n" " влияет на все графики, использующие этот датасет.\n" " Помните, что изменение настроек\n" " может иметь неожиданный эффект\n" " на другие графики." -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:128 -#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:109 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:125 +#: superset-frontend/src/pages/ChartCreation/index.tsx:252 msgid "The dataset has been saved" -msgstr "Источник данных, похоже, был удален" +msgstr "Датасет сохранен" -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:256 -#, fuzzy +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:424 msgid "The dataset linked to this chart may have been deleted." -msgstr "Источник данных, похоже, был удален" +msgstr "Датасет, связанный с этим графиком, похоже, был удален." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1283 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1470 msgid "The datasource couldn't be loaded" -msgstr "Запрос невозможно загрузить" +msgstr "Невозможно загрузить источник данных" -#: superset/errors.py:92 -#, fuzzy +#: superset/errors.py:98 msgid "The datasource is too large to query." -msgstr "Проблема 1000 - Источник данных слишком велик для запроса." +msgstr "Источник данных слишком велик для запроса." -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:247 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:260 msgid "" "The description can be displayed as widget headers in the dashboard view." " Supports markdown." msgstr "" -"Описание может быть отображено как заголовок виджета в ракурсе дашбордов." -" Поддерживает markdown-разметку." +"Описание может быть отображено как заголовок графика в дашборде. " +"Поддерживает markdown-разметку" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:104 msgid "The distance between cells, in pixels" -msgstr "" +msgstr "Расстояние между ячейками (в пикселях)" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:772 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:940 msgid "The duration of time in seconds before the cache is invalidated" msgstr "Количество секунд до истечения срока действия кэша" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:474 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:348 +#, fuzzy +msgid "The encoding format of the lines" +msgstr "Показатель, по которому сортировать результаты" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:495 msgid "" "The engine_params object gets unpacked into the sqlalchemy.create_engine " "call." -msgstr "" +msgstr "Объект engine_params вызывает sqlalchemy.create_engine" -#: superset/common/query_object.py:295 +#: superset/common/query_object.py:313 #, python-format msgid "" "The following entries in `series_columns` are missing in `columns`: " "%(columns)s. " msgstr "" -#: superset/connectors/sqla/views.py:612 -#, python-format -msgid "The following tables added new columns: %(tables)s" -msgstr "" - -#: superset/connectors/sqla/views.py:623 -#, python-format -msgid "The following tables removed columns: %(tables)s" -msgstr "" - -#: superset/connectors/sqla/views.py:634 -#, python-format -msgid "The following tables update column metadata: %(tables)s" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:67 +msgid "The function to use when aggregating points into groups" msgstr "" -#: superset/db_engine_specs/mysql.py:134 +#: superset/db_engine_specs/mysql.py:158 #, python-format msgid "The host \"%(hostname)s\" might be down and can't be reached." -msgstr "" +msgstr "Хост \"%(hostname)s\" возможно, отключен, и с ним невозможно связаться" -#: superset/db_engine_specs/mssql.py:92 -#: superset/db_engine_specs/postgres.py:137 -#: superset/db_engine_specs/presto.py:205 -#: superset/db_engine_specs/redshift.py:78 +#: superset/db_engine_specs/mssql.py:103 +#: superset/db_engine_specs/postgres.py:119 +#: superset/db_engine_specs/presto.py:637 +#: superset/db_engine_specs/redshift.py:82 #, python-format msgid "" "The host \"%(hostname)s\" might be down, and can't be reached on port " "%(port)s." msgstr "" +"Хост \"%(hostname)s\" возможно, отключен, и с ним невозможно связаться по" +" порту %(port)s." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:98 -msgid "The host is invalid. Please verify that this field is entered correctly." -msgstr "" - -#: superset/errors.py:104 +#: superset/errors.py:110 msgid "The host might be down, and can't be reached on the provided port." -msgstr "" +msgstr "Хост возможно, отключен, и с ним невозможно связаться по заданному порту." -#: superset/db_engine_specs/mssql.py:82 -#: superset/db_engine_specs/postgres.py:127 -#: superset/db_engine_specs/presto.py:200 -#: superset/db_engine_specs/redshift.py:68 +#: superset/db_engine_specs/mssql.py:93 +#: superset/db_engine_specs/postgres.py:109 +#: superset/db_engine_specs/presto.py:632 +#: superset/db_engine_specs/redshift.py:72 #, python-format msgid "The hostname \"%(hostname)s\" cannot be resolved." -msgstr "" +msgstr "Не удалось обнаружить хост \"%(hostname)s\"" -#: superset/errors.py:102 +#: superset/errors.py:108 msgid "The hostname provided can't be resolved." -msgstr "" +msgstr "Не удалось обнаружить хост." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:60 -#: superset-frontend/src/explore/controlPanels/sections.tsx:44 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:72 +#: superset-frontend/src/explore/controlPanels/sections.tsx:34 msgid "The id of the active chart" -msgstr "Идентификатор активного среза" +msgstr "Идентификатор активного графика" -#: superset-frontend/src/components/ImportModal/index.tsx:187 -msgid "The import was successful" -msgstr "Неудачно" - -#: superset/connectors/druid/views.py:303 superset/connectors/sqla/views.py:429 +#: superset/connectors/sqla/views.py:419 msgid "" "The list of charts associated with this table. By altering this " "datasource, you may change how these associated charts behave. Also note " @@ -12239,18 +14903,14 @@ msgid "" "saving if removing charts from a datasource. If you want to change the " "datasource for a chart, overwrite the chart from the 'explore view'" msgstr "" -"Список графиков, связанных с этой таблицей. Изменяя этот источник данных," -" можно изменить поведение связанных с ним графиков. Также обратите " -"внимание, что графики должны указывать на источник данных, поэтому эта " -"форма не будет сохранена при удалении срезов из источника данных. Если вы" -" хотите изменить источник данных для среза, сделайте это в свойствах " -"самого графика." -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:130 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:129 msgid "The maximum number of events to return, equivalent to the number of rows" msgstr "" +"Максимальное количество возвращаемых событий, эквивалентно количеству " +"строк" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:179 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:172 msgid "" "The maximum number of subdivisions of each group; lower values are pruned" " first" @@ -12258,34 +14918,34 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:49 msgid "The maximum value of metrics. It is an optional configuration" -msgstr "" +msgstr "Максимальное значение мер. Это необязательная настройка" -#: superset/databases/schemas.py:206 +#: superset/databases/schemas.py:217 #, python-format msgid "" "The metadata_params in Extra field is not configured correctly. The key " "%(key)s is invalid." msgstr "" -#: superset/databases/commands/exceptions.py:79 -#: superset/views/database/mixins.py:252 +#: superset/databases/commands/exceptions.py:80 +#: superset/views/database/mixins.py:248 msgid "" "The metadata_params in Extra field is not configured correctly. The key " "%{key}s is invalid." msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:452 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:469 msgid "" "The metadata_params object gets unpacked into the sqlalchemy.MetaData " "call." -msgstr "" +msgstr "Объект metadata_params вызывает sqlalchemy.MetaData" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:75 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:292 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:175 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:195 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:426 -#: superset-frontend/src/explore/controlPanels/sections.tsx:191 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:82 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:285 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:167 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:436 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:216 +#: superset-frontend/src/explore/controlPanels/sections.tsx:164 msgid "" "The minimum number of rolling periods required to show a value. For " "instance if you do a cumulative sum on 7 days you may want your \"Min " @@ -12293,85 +14953,95 @@ msgid "" "periods. This will hide the \"ramp up\" taking place over the first 7 " "periods" msgstr "" -"Скрыть необходимое количество периодов. Например, если вы делаете " -"накопительную сумму показателя за 7 дней, но хотите скрыть нарастающий " -"итог за первые 6 дней, то указав в данном столбце «6», вы скроете " -"нарастание, происходящее в течение первых 6 периодов" +"Минимальное количество скользящих периодов, необходимое для отображения " +"значения. Например, если вы делаете накопительную сумму за 7 дней, вы " +"можете указать, чтобы \"Минимальный период\" был равен 7, так что все " +"показанные точки данных представляют собой общее количество 7 периодов." #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:130 msgid "The number color \"steps\"" -msgstr "" +msgstr "Количество цветов в цветовой схеме" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:781 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:949 msgid "" "The number of hours, negative or positive, to shift the time column. This" " can be used to move UTC time to local time." msgstr "" +"Количество часов, отрицательное или положительное, для сдвига столбца " +"формата дата/время. Это может быть использовано для приведения часового " +"пояса UTC к местному времени." -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:583 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:305 #, python-format msgid "" "The number of results displayed is limited to %(rows)d by the " "configuration DISPLAY_MAX_ROWS. Please add additional limits/filters or " "download to csv to see more rows up to the %(limit)d limit." msgstr "" +"Количество отображаемых результатов ограничено %(rows)d переменной " +"DISPLAY_MAX_ROWS. Пожалуйста, добавьте дополнительные ограничения/фильтры" +" или загрузите в csv, чтобы увидеть больше строк до предела %(limit)d." -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:589 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:311 #, python-format msgid "" "The number of results displayed is limited to %(rows)d. Please add " "additional limits/filters, download to csv, or contact an admin to see " "more rows up to the %(limit)d limit." msgstr "" +"Количество отображаемых результатов ограничено %(rows)d. Пожалуйста, " +"добавьте дополнительные ограничения/фильтры или загрузите в csv, чтобы " +"увидеть больше строк до предела %(limit)d.\"" + +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:362 +#, fuzzy, python-format +msgid "The number of rows displayed is limited to %(rows)d by the dropdown." +msgstr "Количество отображаемых строк ограничено: не более %(rows)d." -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:615 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:331 #, python-format msgid "The number of rows displayed is limited to %(rows)d by the limit dropdown." -msgstr "" +msgstr "Количество отображаемых строк ограничено: не более %(rows)d." -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:603 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:323 #, python-format msgid "The number of rows displayed is limited to %(rows)d by the query" -msgstr "" +msgstr "Количество отображаемых строк ограничено: не более %(rows)d." -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:624 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:336 #, python-format msgid "" "The number of rows displayed is limited to %(rows)d by the query and " "limit dropdown." -msgstr "" - -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:644 -#, python-format -msgid "The number of rows displayed is limited to %s by the dropdown." -msgstr "" +msgstr "Количество отображаемых строк ограничено: не более %(rows)d." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:69 -#: superset-frontend/src/explore/controlPanels/sections.tsx:53 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:81 +#: superset-frontend/src/explore/controlPanels/sections.tsx:43 msgid "The number of seconds before expiring the cache" msgstr "Количество секунд до истечения срока действия кэша" -#: superset/errors.py:128 -#, fuzzy +#: superset/errors.py:134 msgid "The object does not exist in the given database." -msgstr "Имя таблицы, которая существует в исходной базе данных" +msgstr "Объект не существует в этой базе данных." #: superset/sqllab/query_render.py:97 #, python-format msgid "The parameter %(parameters)s in your query is undefined." msgid_plural "The following parameters in your query are undefined: %(parameters)s." -msgstr[0] "Следующие параметры в запросе не определены: %(parameters)s." +msgstr[0] "Параметр %(parameters)s в вашем запросе неопределен." +msgstr[1] "Следующие параметры неопределены в вашем запросе: %(parameters)s" +msgstr[2] "Следующие параметры неопределены в вашем запросе: %(parameters)s" -#: superset/db_engine_specs/postgres.py:117 +#: superset/db_engine_specs/postgres.py:99 #, python-format msgid "The password provided for username \"%(username)s\" is incorrect." -msgstr "" +msgstr "Неверный пароль для пользователя \"%(username)s\"." -#: superset/errors.py:108 +#: superset/errors.py:114 msgid "The password provided when connecting to a database is not valid." -msgstr "" +msgstr "Неверный пароль для базы данных." -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:65 +#: superset-frontend/src/pages/ChartList/index.tsx:89 msgid "" "The passwords for the databases below are needed in order to import them " "together with the charts. Please note that the \"Secure Extra\" and " @@ -12380,9 +15050,10 @@ msgid "" "needed." msgstr "" "Для баз данных нужны пароли, чтобы импортировать их вместе с графиками. " -"Пожалуйста, обратите внимание, что разделы “Безопасность” и “Сертификат” " -"в настройках конфигурации базы данных отсутствуют в экспортируемых файлов" -" и должны быть добавлены вручную после импорта, если необходимо." +"Пожалуйста, обратите внимание, что разделы \"Безопасность\" и " +"\"Утверждение\" в настройках конфигурации базы данных отсутствуют в " +"экспортируемых файлов и должны быть добавлены вручную после импорта, если" +" необходимо." #: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:57 msgid "" @@ -12393,9 +15064,10 @@ msgid "" "needed." msgstr "" "Для баз данных нужны пароли, чтобы импортировать их вместе с дашбордами. " -"Пожалуйста, обратите внимание, что разделы “Безопасность” и “Сертификат” " -"в настройках конфигурации базы данных отсутствуют в экспортируемых файлов" -" и должны быть добавлены вручную после импорта, если необходимо." +"Пожалуйста, обратите внимание, что разделы \"Безопасность\" и " +"\"Утверждение\" в настройках конфигурации базы данных отсутствуют в " +"экспортируемых файлах и должны быть добавлены вручную после импорта, если" +" необходимо." #: superset-frontend/src/views/CRUD/data/dataset/constants.ts:23 msgid "" @@ -12406,12 +15078,11 @@ msgid "" "needed." msgstr "" "Пароли к базам данных требуются, чтобы импортировать их вместе с " -"датасетами. Пожалуйста, обратите внимание, что разделы “Безопасность” и " -"“Сертификат” конфигурации базы данных отсутствуют в экспортируемых файлах" -" и должны быть добавлены после импорта вручную." +"датасетами. Пожалуйста, обратите внимание, что разделы \"Безопасность\" и" +" \"Утверждение\" конфигурации базы данных отсутствуют в экспортируемых " +"файлах и должны быть добавлены после импорта вручную, если необходимо." -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:56 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:57 msgid "" "The passwords for the databases below are needed in order to import them " "together with the saved queries. Please note that the \"Secure Extra\" " @@ -12419,36 +15090,43 @@ msgid "" "present in export files, and should be added manually after the import if" " they are needed." msgstr "" -"Для баз данных нужны пароли, чтобы импортировать их вместе с графиками. " -"Пожалуйста, обратите внимание, что разделы “Безопасность” и “Сертификат” " -"в настройках конфигурации базы данных отсутствуют в экспортируемых файлов" -" и должны быть добавлены вручную после импорта, если необходимо." +"Для баз данных нужны пароли, чтобы импортировать их вместе с сохраненными" +" запросами. Пожалуйста, обратите внимание, что разделы \"Безопасность\" и" +" \"Утверждение\" в настройках конфигурации базы данных отсутствуют в " +"экспортируемых файлах и должны быть добавлены вручную после импорта, если" +" необходимо." -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:39 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1169 msgid "" "The passwords for the databases below are needed in order to import them." " Please note that the \"Secure Extra\" and \"Certificate\" sections of " -"the database configuration are not present in export files, and should be" +"the database configuration are not present in explore files and should be" " added manually after the import if they are needed." msgstr "" +"Пароли к базам данных требуются, чтобы импортировать их. Пожалуйста, " +"обратите внимание, что разделы \"Безопасность\" и \"Утверждение\" в " +"настройках конфигурации базы данных отсутствуют в импортируемых файлах и " +"должны быть добавлены вручную после импорта, если необходимо." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:231 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:298 msgid "The pattern of timestamp format. For strings use " -msgstr "" +msgstr "Шаблон формата отметки времени (таймштампа). Для строк используйте " -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:65 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:66 msgid "" "The periodicity over which to pivot time. Users can provide\n" " \"Pandas\" offset alias.\n" " Click on the info bubble for more details on accepted " "\"freq\" expressions." msgstr "" +"Периодичность для группировки по времени. Пользователи могут задавать " +"собственную частоту. Для этого нажмите на иконку с информацией." #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:118 msgid "The pixel radius" -msgstr "" +msgstr "Радиус ячейки (в пикселях)" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:977 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1149 msgid "" "The pointer to a physical table (or view). Keep in mind that the chart is" " associated to this Superset logical table, and this logical table points" @@ -12458,172 +15136,175 @@ msgstr "" " график связан с логической таблицей Superset, а эта логическая таблица " "указывает на физическую таблицу, указанную здесь." -#: superset/errors.py:103 -#, fuzzy +#: superset/errors.py:109 msgid "The port is closed." -msgstr "Рассылка не удалась" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:108 -#, fuzzy -msgid "The port must be a whole number less than or equal to 65535." -msgstr "`лимит_строк` должен быть больше или равен 1" +msgstr "Порт закрыт." -#: superset/errors.py:136 -#, fuzzy +#: superset/errors.py:142 msgid "The port number is invalid." -msgstr "Параметры базы данных недействительны." +msgstr "Недействительный порт." -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:57 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:62 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:159 msgid "The primary metric is used to define the arc segment sizes" -msgstr "" -"Показатель, используемый для определения какие временные ряды будут " -"отображаться при ограничении количества выводимых рядов" +msgstr "Основная мера используется для определения размера сегмента дуги" -#: superset/views/core.py:2330 +#: superset/views/core.py:2187 msgid "The provided `rows` argument is not a valid integer." msgstr "" -#: superset/errors.py:131 +#: superset/errors.py:137 msgid "The query associated with the results was deleted." -msgstr "" +msgstr "Запрос, связанный с результатами, был удален." -#: superset/views/core.py:2280 +#: superset/sqllab/commands/results.py:92 superset/views/core.py:2137 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" -#: superset/sqllab/query_render.py:113 +#: superset/sqllab/query_render.py:118 msgid "The query contains one or more malformed template parameters." msgstr "" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:106 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:107 msgid "The query couldn't be loaded" msgstr "Запрос невозможно загрузить" -#: superset/errors.py:129 +#: superset/errors.py:135 msgid "The query has a syntax error." -msgstr "" +msgstr "Запрос имеет синтаксическую ошибку." -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:771 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:516 msgid "The query returned no data" -msgstr "Результат пуст" +msgstr "Запрос не вернул данных" -#: superset/sql_lab.py:265 +#: superset/sql_lab.py:301 #, python-format msgid "" "The query was killed after %(sqllab_timeout)s seconds. It might be too " "complex, or the database might be under heavy load." msgstr "" +"Запрос был прерван после %(sqllab_timeout)s секунд. Он мог быть слишком " +"сложным, или база данных находилась под большой нагрузкой." -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:87 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:97 msgid "" "The radius (in pixels) the algorithm uses to define a cluster. Choose 0 " "to turn off clustering, but beware that a large number of points (>1000) " "will cause lag." msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:110 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:120 msgid "" "The radius of individual points (ones that are not in a cluster). Either " "a numerical column or `Auto`, which scales the point based on the largest" " cluster" msgstr "" +"Радиус маркеров (не находящихся в кластере). Выберите числовой столбец " +"или `Автоматически`, который отмасштабирует маркеры по наибольшему " +"маркеру." -#: superset-frontend/src/reports/actions/reports.js:111 -#, fuzzy +#: superset-frontend/src/reports/actions/reports.js:110 msgid "The report has been created" -msgstr "Источник данных, похоже, был удален" +msgstr "Рассылка создана" -#: superset/errors.py:130 +#: superset/errors.py:136 msgid "The results backend no longer has the data from the query." -msgstr "" +msgstr "Сервер не сохранил данные из этого запроса." -#: superset/errors.py:132 +#: superset/errors.py:138 msgid "" "The results stored in the backend were stored in a different format, and " "no longer can be deserialized." msgstr "" +"Данные, сохраненные на сервере, имели другой формат, и не могут быть " +"распознаны." -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:233 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:103 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:284 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:226 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:95 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:304 msgid "The rich tooltip shows a list of all series for that point in time" msgstr "" +"Расширенная всплывающая подсказка показывает список всех категорий для " +"этой точки." -#: superset/db_engine_specs/bigquery.py:171 +#: superset/db_engine_specs/bigquery.py:183 #, python-format msgid "" "The schema \"%(schema)s\" does not exist. A valid schema must be used to " "run this query." msgstr "" -#: superset/db_engine_specs/presto.py:187 +#: superset/db_engine_specs/presto.py:619 #, python-format msgid "" "The schema \"%(schema_name)s\" does not exist. A valid schema must be " "used to run this query." msgstr "" -#: superset/errors.py:111 -#, fuzzy +#: superset/errors.py:117 msgid "The schema was deleted or renamed in the database." -msgstr "Проблема 1004 - Столбец был удалён или переименован в базе данных." +msgstr "Схема была удалена или переименована в базе данных." #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:92 msgid "The size of the square cell, in pixels" +msgstr "Размер квадратной ячейки (в пикселях)" + +#: superset/views/datasource/views.py:88 +msgid "" +"The submitted URL is not considered safe, only use URLs with the same " +"domain as Superset." msgstr "" -#: superset/errors.py:114 +#: superset/errors.py:120 msgid "The submitted payload has the incorrect format." -msgstr "" +msgstr "Загруженные данные имеют некорректный формат." -#: superset/errors.py:115 +#: superset/errors.py:121 msgid "The submitted payload has the incorrect schema." -msgstr "" +msgstr "Загруженные данные имеют некорректную схему." -#: superset/db_engine_specs/bigquery.py:158 +#: superset/db_engine_specs/bigquery.py:170 #, python-format msgid "" "The table \"%(table)s\" does not exist. A valid table must be used to run" " this query." msgstr "" +"Таблица \"%(table)s\" не существует. Для выполнения запроса должна " +"использоваться существующая таблица" -#: superset/db_engine_specs/presto.py:179 +#: superset/db_engine_specs/presto.py:611 #, python-format msgid "" "The table \"%(table_name)s\" does not exist. A valid table must be used " "to run this query." msgstr "" +"Таблица \"%(table_name)s\" не существует. Для выполнения запроса должна " +"использоваться существующая таблица" -#: superset/connectors/sqla/views.py:540 +#: superset/connectors/sqla/views.py:517 msgid "" "The table was created. As part of this two-phase configuration process, " "you should now click the edit button by the new table to configure it." msgstr "" -"Таблица была создана. Теперь нажмите на кнопку редактирования напротив " -"новой таблицы, чтобы настроить её." -#: superset/errors.py:100 -#, fuzzy +#: superset/errors.py:106 msgid "The table was deleted or renamed in the database." -msgstr "Проблема 1005 - Таблица была удалена или переименована в базе данных." +msgstr "Таблица была удалена или переименована в базе данных." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:167 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:266 -#: superset-frontend/src/explore/controls.jsx:297 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:237 +#: superset-frontend/src/explore/controls.jsx:281 msgid "" "The time column for the visualization. Note that you can define arbitrary" " expression that return a DATETIME column in the table. Also note that " "the filter below is applied against this column or expression" msgstr "" -"Столбец данных с датой или временем. Вы можете определить произвольное " +"Столбец данных формата дата/время. Вы можете определить произвольное " "выражение, которое будет возвращать столбец даты/времени в таблице. " "Фильтр ниже будет применён к этому столбцу или выражению" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:256 -#: superset-frontend/src/explore/controls.jsx:287 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:177 msgid "" "The time granularity for the visualization. Note that you can type and " "use simple natural language as in `10 seconds`, `1 day` or `56 weeks`" @@ -12633,21 +15314,31 @@ msgstr "" "естественный язык. Например, можно указать словосочетания - «10 seconds»," " «1 day» или «56 weeks»" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:297 -#: superset-frontend/src/explore/controls.jsx:326 +#: superset-frontend/src/explore/controls.jsx:271 +msgid "" +"The time granularity for the visualization. Note that you can type and " +"use simple natural language as in `10 seconds`,`1 day` or `56 weeks`" +msgstr "" +"Интервал времени, в границах которого строится график. Обратите внимание," +" что для определения диапазона времени, вы можете использовать " +"естественный язык. Например, можно указать словосочетания - «10 seconds»," +" «1 day» или «56 weeks»" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:200 +#: superset-frontend/src/explore/controls.jsx:310 msgid "" "The time granularity for the visualization. This applies a date " "transformation to alter your time column and defines a new time " "granularity. The options here are defined on a per database engine basis " "in the Superset source code." msgstr "" -"Гранулярность для визуализации. С помощью этого применяются " -"преобразования к столбцу с датой/временем и определяет новую " -"гранулярность (минута, день, год, и т.п.). Доступные опции определены в " -"исходном коде Superset для каждого типа движка БД." +"Детализация времени для визуализации. Применяется преобразование столбца " +"с датой/временем и определяется новая детализация (минута, день, год, и " +"т.п.). Доступные варианты заданы в исходном коде Superset для каждого " +"типа драйвера базы данных." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:314 -#: superset-frontend/src/explore/controls.jsx:343 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:234 +#: superset-frontend/src/explore/controls.jsx:327 msgid "" "The time range for the visualization. All relative times, e.g. \"Last " "month\", \"Last 7 days\", \"now\", etc. are evaluated on the server using" @@ -12657,85 +15348,110 @@ msgid "" " explicitly set the timezone per the ISO 8601 format if specifying either" " the start and/or end time." msgstr "" +"Временной интервал для визуализации. Относительно время, например, " +"\"Последний месяц\", \"Последние 7 дней\" и т.д. рассчитываются на " +"сервере, используя локальное время сервера. Обратите внимание, что вы " +"можете самостоятельно задать часовой пояс по формату ISO 8601 при " +"пользовательской настройке, задав время начала и/или конца." #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:65 msgid "" "The time unit for each block. Should be a smaller unit than " "domain_granularity. Should be larger or equal to Time Grain" msgstr "" +"Единица времени для каждого подблока. Должна быть меньшей единицей, чем " +"единица времени блока. Должно быть больше или равно единице времени" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:49 msgid "The time unit used for the grouping of blocks" -msgstr "" +msgstr "Единица времени для группировки блоков" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:170 -#: superset-frontend/src/explore/controls.jsx:202 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:124 +#: superset-frontend/src/explore/controls.jsx:201 msgid "The type of visualization to display" msgstr "Выберите необходимый тип визуализации" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:135 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:147 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:90 msgid "The unit of measure for the specified point radius" -msgstr "" +msgstr "Единица измерения для указанного радиуса маркера" -#: superset/views/core.py:183 +#: superset/views/core.py:196 msgid "The user seems to have been deleted" -msgstr "Пользователь, кажется, был удален" +msgstr "Пользователь, похоже, был удален" -#: superset/db_engine_specs/postgres.py:112 -#, fuzzy, python-format +#: superset/db_engine_specs/postgres.py:94 +#, python-format msgid "The username \"%(username)s\" does not exist." -msgstr "Показатель ‘%(metric)s’ не существует" +msgstr "Пользователь \"%(username)s\" не существует." -#: superset/errors.py:107 +#: superset/errors.py:113 msgid "The username provided when connecting to a database is not valid." -msgstr "" +msgstr "Имя пользователя, указанное при подключении к базе данных, недействительно" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:206 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:89 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:72 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:226 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:126 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:68 msgid "The way the ticks are laid out on the X-axis" -msgstr "" +msgstr "Способ расположения делений по оси X" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:214 +msgid "The width of the lines" +msgstr "Ширина линий" #: superset/charts/commands/exceptions.py:127 -#: superset/charts/commands/exceptions.py:147 +#: superset/charts/commands/exceptions.py:151 #: superset/dashboards/commands/exceptions.py:62 #: superset/dashboards/commands/exceptions.py:74 -#: superset/databases/commands/exceptions.py:117 +#: superset/databases/commands/exceptions.py:119 msgid "There are associated alerts or reports" -msgstr "Существуют привязанные оповещения или рассылки" +msgstr "Есть связанные оповещения или отчеты" -#: superset/charts/commands/bulk_delete.py:64 -#: superset/charts/commands/delete.py:68 -#: superset/dashboards/commands/bulk_delete.py:65 -#: superset/dashboards/commands/delete.py:66 -#: superset/databases/commands/delete.py:65 +#: superset/charts/commands/bulk_delete.py:62 +#: superset/charts/commands/delete.py:66 +#: superset/dashboards/commands/bulk_delete.py:63 +#: superset/dashboards/commands/delete.py:64 +#: superset/databases/commands/delete.py:63 #, python-format msgid "There are associated alerts or reports: %s," -msgstr "Существуют оповещения или рассылки: %s," +msgstr "Есть связанные оповещения или отчеты: %s" + +#: superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx:710 +msgid "There are no charts added to this dashboard" +msgstr "В этот дашборд еще не добавлен ни один график." + +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:238 +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:186 +msgid "There are no components added to this tab" +msgstr "В этой вкладке нет компонентов" + +#: superset-frontend/src/components/EmptyState/index.tsx:235 +msgid "There are no databases available" +msgstr "Нет доступных баз данных" -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:507 +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:770 msgid "There are no filters in this dashboard." msgstr "В этом дашборде нет фильтров." #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:45 -#, fuzzy msgid "There are unsaved changes." msgstr "У вас есть несохраненные изменения." -#: superset/errors.py:95 -#, fuzzy +#: superset/errors.py:101 msgid "" "There is a syntax error in the SQL query. Perhaps there was a misspelling" " or a typo." -msgstr "Проблема 1003 - Ошибка в SQL-запросе. Возможно опечатка." +msgstr "" +"В SQL-запросе имеется синтаксическая ошибка. Возможно, это " +"орфографическая ошибка или опечатка." #: superset-frontend/src/dashboard/components/MissingChart.jsx:31 msgid "" "There is no chart definition associated with this component, could it " "have been deleted?" -msgstr "" +msgstr "С этим компонентом не связан ни один график, возможно, он был удален." -#: superset-frontend/src/dashboard/actions/dashboardLayout.js:180 +#: superset-frontend/src/dashboard/actions/dashboardLayout.js:182 msgid "" "There is not enough space for this component. Try decreasing its width, " "or increasing the destination width." @@ -12743,77 +15459,79 @@ msgstr "" "Недостаточно пространства для этого компонента. Попробуйте уменьшить " "ширину или увеличить целевую ширину." -#: superset-frontend/src/views/CRUD/hooks.ts:522 -#, fuzzy, python-format +#: superset-frontend/src/views/CRUD/hooks.ts:547 +#, python-format msgid "There was an error fetching the favorite status: %s" -msgstr "К сожалению, произошла ошибка при загрузке виджета." +msgstr "Произошла ошибка при получении статуса избранного: %s" -#: superset-frontend/src/views/CRUD/utils.tsx:181 +#: superset-frontend/src/views/CRUD/utils.tsx:205 msgid "There was an error fetching your recent activity:" -msgstr "К сожалению, произошла ошибка при загрузке виджета:" +msgstr "Произошла ошибка при получении вашей недавней активности:" -#: superset-frontend/src/components/DatabaseSelector/index.tsx:230 -#, fuzzy +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailPane.tsx:375 +msgid "There was an error loading the dataset metadata" +msgstr "Возникла ошибка при загрузке метаданных датасета" + +#: superset-frontend/src/components/DatabaseSelector/index.tsx:258 msgid "There was an error loading the schemas" -msgstr "Извините, произошла ошибка при загрузке графиков: " +msgstr "Возникла ошибка при загрузке схем" -#: superset-frontend/src/components/TableSelector/index.tsx:218 -#, fuzzy +#: superset-frontend/src/components/TableSelector/index.tsx:197 msgid "There was an error loading the tables" -msgstr "С вашим запросом произошла ошибка" +msgstr "Возникла ошибка при загрузке таблиц" -#: superset-frontend/src/views/CRUD/hooks.ts:543 -#, fuzzy, python-format +#: superset-frontend/src/views/CRUD/hooks.ts:568 +#, python-format msgid "There was an error saving the favorite status: %s" -msgstr "К сожалению, произошла ошибка при загрузке виджета." +msgstr "Произошла ошибка при сохранении статуса избранного: %s" -#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:61 +#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:71 msgid "There was an error with your request" -msgstr "С вашим запросом произошла ошибка" +msgstr "Произошла ошибка с вашим запросом" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:165 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:107 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:94 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:187 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:121 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:93 #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:97 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:148 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:550 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:235 -#: superset-frontend/src/views/CRUD/utils.tsx:289 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:164 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:679 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:236 +#: superset-frontend/src/views/CRUD/utils.tsx:311 #: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:175 #, python-format msgid "There was an issue deleting %s: %s" msgstr "Произошла ошибка при удалении %s: %s" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:180 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:202 #, python-format msgid "There was an issue deleting the selected %s: %s" msgstr "Произошла ошибка при удалении выбранных %s: %s" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:127 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:141 #, python-format msgid "There was an issue deleting the selected annotations: %s" msgstr "Произошла ошибка при удалении выбранных аннотаций: %s" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:209 +#: superset-frontend/src/pages/ChartList/index.tsx:254 #, python-format msgid "There was an issue deleting the selected charts: %s" msgstr "Произошла ошибка при удалении выбранных графиков: %s" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:226 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:238 msgid "There was an issue deleting the selected dashboards: " msgstr "Произошла ошибка при удалении выбранных дашбордов: " -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:568 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:697 #, python-format msgid "There was an issue deleting the selected datasets: %s" msgstr "Произошла ошибка при удалении выбранных датасетов: %s" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:111 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:110 #, python-format msgid "There was an issue deleting the selected layers: %s" msgstr "Произошла ошибка при удалении выбранных слоёв: %s" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:262 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:263 #, python-format msgid "There was an issue deleting the selected queries: %s" msgstr "Произошла ошибка при удалении выбранных запросов: %s" @@ -12823,69 +15541,75 @@ msgstr "Произошла ошибка при удалении выбранны msgid "There was an issue deleting the selected templates: %s" msgstr "Произошла ошибка при удалении выбранных шаблонов: %s" -#: superset-frontend/src/views/CRUD/utils.tsx:249 +#: superset-frontend/src/views/CRUD/utils.tsx:271 #, python-format msgid "There was an issue deleting: %s" msgstr "Произошла ошибка при удалении: %s" -#: superset-frontend/src/dashboard/actions/dashboardState.js:100 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:705 +msgid "There was an issue duplicating the dataset." +msgstr "Произошла ошибка при дублировании датасета." + +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:721 +#, python-format +msgid "There was an issue duplicating the selected datasets: %s" +msgstr "Произошла ошибка при дублировании выбранных датасетов: %s" + +#: superset-frontend/src/dashboard/actions/dashboardState.js:121 msgid "There was an issue favoriting this dashboard." msgstr "Произошла ошибка при добавлении этого дашборда в избранное." #: superset-frontend/src/reports/actions/reports.js:68 -#, fuzzy msgid "There was an issue fetching reports attached to this dashboard." -msgstr "К сожалению, произошла ошибка при загрузке виджета." +msgstr "Произошла ошибка с получением рассылок, связанных с этим дашбордом." -#: superset-frontend/src/dashboard/actions/dashboardState.js:79 +#: superset-frontend/src/dashboard/actions/dashboardState.js:100 msgid "There was an issue fetching the favorite status of this dashboard." -msgstr "К сожалению, произошла ошибка при загрузке виджета." +msgstr "Произошла ошибка с получением статуса избранного для этого дашборда." -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:195 -#, fuzzy, python-format +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:287 +#, python-format +msgid "There was an issue fetching your chart: %s" +msgstr "Произошла ошибка при получении вашего графика: %s" + +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:276 +#, python-format +msgid "There was an issue fetching your dashboards: %s" +msgstr "Произошла ошибка при получении вашего дашборда: %s" + +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:254 +#, python-format msgid "There was an issue fetching your recent activity: %s" -msgstr "К сожалению, произошла ошибка при загрузке виджета:" +msgstr "Произошла ошибка при получении вашей последней активности: %s" + +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:299 +#, python-format +msgid "There was an issue fetching your saved queries: %s" +msgstr "Произошла ошибка при получении ваших сохраненных запросов: %s" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:152 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:151 #, python-format msgid "There was an issue previewing the selected query %s" msgstr "Произошла ошибка при предпросмотре выбранного запроса %s" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:109 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:115 #, python-format msgid "There was an issue previewing the selected query. %s" -msgstr "Возникла ошибка при предпросмотре выбранных запросов: %s" - -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:222 -#, fuzzy, python-format -msgid "There was an issues fetching your chart: %s" -msgstr "Произошла ошибка при удалении: %s" +msgstr "Произошла ошибка при предпросмотре выбранного запроса: %s" -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:211 -#, fuzzy, python-format -msgid "There was an issues fetching your dashboards: %s" -msgstr "Произошла ошибка при удалении выбранных дашбордов: " - -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:233 -#, fuzzy, python-format -msgid "There was an issues fetching your saved queries: %s" -msgstr "Произошла ошибка при удалении выбранных запросов: %s" - -#: superset/viz.py:1955 +#: superset/viz.py:1989 msgid "" "There's a loop in your Sankey, please provide a tree. Here's a faulty " "link: {}" msgstr "" -"В полях [Источника] и [Назначения] есть одинаковый срез данных - {}. " -"Срезы не должны пересекаться!" -#: superset/connectors/sqla/views.py:341 +#: superset/connectors/sqla/views.py:336 msgid "These are the tables this filter will be applied to." -msgstr "Это таблицы, к которым будет применён фильтр." +msgstr "Это таблицы, к которым будет применен этот фильтр." -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:135 +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:98 msgid "These filters apply to the values available in the dropdowns" -msgstr "" +msgstr "Эти фильтры применяются к значениям, доступным в выпадающих списках" #: superset/views/chart/mixin.py:64 msgid "" @@ -12897,7 +15621,7 @@ msgstr "" "Эти параметры генерируются автоматически при нажатии кнопки сохранения. " "Опытные пользователи могут изменить определенные объекты в формате JSON." -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:597 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:661 #: superset/views/dashboard/mixin.py:59 msgid "" "This JSON object is generated dynamically when clicking the save or " @@ -12907,22 +15631,22 @@ msgstr "" "Этот JSON-объект генерируется автоматически при сохранении или перезаписи" " дашборда. Он размещён здесь справочно и для опытных пользователей." -#: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:99 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:470 +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:311 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:569 #, python-format msgid "This action will permanently delete %s." msgstr "Это действие навсегда удалит %s." -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:353 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:345 msgid "This action will permanently delete the layer." msgstr "Это действие навсегда удалит слой." -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:475 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:249 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:479 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:231 msgid "This action will permanently delete the saved query." msgstr "Это действие навсегда удалит сохранённый запрос." -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:313 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:315 msgid "This action will permanently delete the template." msgstr "Это действие навсегда удалит шаблон." @@ -12931,34 +15655,72 @@ msgid "" "This can be either an IP address (e.g. 127.0.0.1) or a domain name (e.g. " "mydatabase.com)." msgstr "" +"Это может быть как IP адрес (например, 127.0.0.1), так и доменное имя " +"(например, моябазаданных.рф)." -#: superset-frontend/src/dashboard/actions/dashboardLayout.js:258 +#: superset-frontend/src/dashboard/actions/dashboardLayout.js:260 msgid "This chart has been moved to a different filter scope." msgstr "Этот график был перемещён в другой набор фильтров." -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.ts:56 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:211 +msgid "This chart is managed externally, and can't be edited in Superset" +msgstr "" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.ts:61 msgid "This chart might be incompatible with the filter (datasets don't match)" +msgstr "Этот график может быть несовместим с этим фильтром (датасеты не совпадают)" + +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:321 +msgid "" +"This chart type is not supported when using an unsaved query as a chart " +"source. " msgstr "" -#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:127 +#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx:50 msgid "" "This color scheme is being overriden by custom label colors.\n" -" Check the JSON metadata in the Advanced settings" +" Check the JSON metadata in the Advanced settings" msgstr "" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:480 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:496 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx:121 +msgid "This column might be incompatible with current dataset" +msgstr "Этот график может быть несовместим с этим датасетом" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:528 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:544 msgid "This column must contain date/time information." +msgstr "В этом столбец должны быть данные формата дата/время." + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:583 +msgid "" +"This controls whether the \"time_range\" field from the current\n" +" view should be passed down to the chart containing the " +"annotation data." msgstr "" +"Должен ли временной интервал из этого представления переписать временной " +"интервал графика, содержащего данные аннотации." -#: superset-frontend/src/dashboard/components/Header/index.jsx:303 -#, fuzzy, python-format +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:601 +msgid "" +"This controls whether the time grain field from the current\n" +" view should be passed down to the chart containing the " +"annotation data." +msgstr "" +"Должен ли единица времени из этой таблицы переписать единицу времени " +"графика." + +#: superset-frontend/src/dashboard/components/Header/index.jsx:320 +#, python-format msgid "" "This dashboard is currently auto refreshing; the next auto refresh will " "be in %s." msgstr "" -"Для этого дашборда включено обновление; следующее обновление будет через " -"%s." +"В настоящий момент дашборд обновляется; следующее обновление будет через " +"%s" + +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:560 +msgid "This dashboard is managed externally, and can't be edited in Superset" +msgstr "" #: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:38 msgid "" @@ -12976,70 +15738,93 @@ msgid "" "dashboards. Click here to publish this dashboard." msgstr "" "Этот дашборд не опубликован, он не будет отображён в списке дашбордов. " -"Нажмите здесь, чтобы опубликовать этот дашборд." +"Нажмите, чтобы опубликовать этот дашборд." -#: superset-frontend/src/dashboard/actions/dashboardState.js:125 -#, fuzzy +#: superset-frontend/src/dashboard/actions/dashboardState.js:146 msgid "This dashboard is now hidden" -msgstr "Изменение этого дашборда запрещено" +msgstr "Дашборд теперь скрыт" -#: superset-frontend/src/dashboard/actions/dashboardState.js:124 -#, fuzzy +#: superset-frontend/src/dashboard/actions/dashboardState.js:145 msgid "This dashboard is now published" -msgstr "Этот дашборд теперь ${nowPublished}" +msgstr "Дашборд теперь опубликован" #: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:43 msgid "This dashboard is published. Click to make it a draft." msgstr "Дашборд опубликован. Нажмите, чтобы сделать черновиком." -#: superset/views/core.py:1273 +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:168 +msgid "" +"This dashboard is ready to embed. In your application, pass the following" +" id to the SDK:" +msgstr "" + +#: superset/views/core.py:1311 msgid "" "This dashboard was changed recently. Please reload dashboard to get " "latest version." msgstr "" -"Этот дашборд был недавно изменён. Пожалуйста, перезагрузите дашборд, " -"чтобы получить последнюю версию." +"Этот дашборд был недавно изменен. Пожалуйста, обновите дашборд, чтобы " +"увидеть изменения." -#: superset-frontend/src/dashboard/actions/dashboardState.js:231 +#: superset-frontend/src/dashboard/actions/dashboardState.js:311 +#: superset-frontend/src/dashboard/actions/dashboardState.js:350 msgid "This dashboard was saved successfully." -msgstr "Дашборд успешно сохранен." +msgstr "Дашборд успешно сохранен" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1057 +msgid "This database is managed externally, and can't be edited in Superset" +msgstr "Эта база данных управляется извне и не может быть изменена в Суперсете" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/MessageContent.tsx:68 +msgid "" +"This database table does not contain any data. Please select a different " +"table." +msgstr "" + +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:236 +msgid "This dataset is managed externally, and can't be edited in Superset" +msgstr "Этот датасет управляется извне и не может быть изменена в Суперсете" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:77 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:401 -#: superset-frontend/src/explore/controls.jsx:416 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:132 +#: superset-frontend/src/explore/controls.jsx:396 msgid "This defines the element to be plotted on the chart" msgstr "Элемент, который будет отражен на графике" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:82 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:97 msgid "This defines the level of the hierarchy" -msgstr "Элемент, который будет отражен на графике" - -#: superset/views/alerts.py:232 superset/views/schedules.py:253 -#: superset/views/schedules.py:334 -msgid "" -"This feature is deprecated and will be removed on 2.0. Take a look at the" -" replacement feature <a " -"href='https://superset.apache.org/docs/installation/alerts-" -"reports'>Alerts & Reports documentation</a>" -msgstr "" +msgstr "Определяет уровень иерархии" -#: superset/connectors/sqla/views.py:447 +#: superset/connectors/sqla/views.py:437 msgid "" "This fields acts a Superset view, meaning that Superset will run a query " "against this string as a subquery." -msgstr "Это поле будет выполнять запрос в качестве подзапроса." +msgstr "" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:105 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:109 msgid "This filter doesn't exist in dashboard. It will not be applied." +msgstr "Этот фильтр не существует в дашборде. Он не будет применен." + +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:503 +msgid "" +"This filter is the last temporal filter. If you proceed,\n" +" this chart won't be affected by time range filters in " +"dashboards." msgstr "" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:165 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndAdhocFilterOption.tsx:72 +msgid "This filter might be incompatible with current dataset" +msgstr "Этот фильтр может быть несовместим с этим датасетом" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:164 #, python-format msgid "This filter set is identical to: \"%s\"" -msgstr "" +msgstr "Этот набор фильтров идентичен \"%s\"" -#: superset/connectors/sqla/views.py:358 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:75 +msgid "This functionality is disabled in your environment for security reasons." +msgstr "Эта функция отключена в вашей среде по соображениям безопасности." + +#: superset/connectors/sqla/views.py:353 msgid "" "This is the condition that will be added to the WHERE clause. For " "example, to only return rows for a particular client, you might define a " @@ -13047,6 +15832,11 @@ msgid "" " a user belongs to a RLS filter role, a base filter can be created with " "the clause `1 = 0` (always false)." msgstr "" +"Это условие, которое будет добавлено к оператору WHERE. Например, чтобы " +"возвращать строки только для определенного клиента, вы можете определить " +"обычный фильтр с условием `client_id = 9`. Чтобы не отображать строки, " +"если пользователь не принадлежит к роли фильтра RLS, можно создать " +"базовый фильтр с предложением `1 = 0` (всегда false)." #: superset/views/dashboard/mixin.py:47 msgid "" @@ -13054,291 +15844,324 @@ msgid "" "dashboard. It is dynamically generated when adjusting the widgets size " "and positions by using drag & drop in the dashboard view" msgstr "" -"Этот объект JSON описывает расположение виджетов в дашборде. Он " -"динамически генерируется при настройке размера и позиции виджетов в " -"дашборде с помощью drag & drop" +"Этот JSON объект описывает расположение графиков в дашборде. Он " +"генерируется динамически при изменении и перемещении графиков в дашборде." -#: superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx:80 +#: superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx:84 msgid "This markdown component has an error." msgstr "Этот компонент содержит ошибки." -#: superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx:167 +#: superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx:202 msgid "This markdown component has an error. Please revert your recent changes." msgstr "Этот компонент содержит ошибки. Пожалуйста, отмените последние изменения." #: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:47 #: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:62 msgid "This may be triggered by:" -msgstr "Триггеры:" +msgstr "Возможные причины:" -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:109 -#, python-format -msgid "This query took %s seconds to run, " -msgstr "Выполнение этого запроса заняло %s секунд, " +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx:258 +msgid "This metric might be incompatible with current dataset" +msgstr "Эта мера может быть несовместима с этим датасетом" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:466 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:514 +#, fuzzy msgid "" "This section allows you to configure how to use the slice\n" -" to generate annotations." +" to generate annotations." msgstr "" +"Этот раздел позволяет вам настроить использования графика для создания " +"аннотаций." #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:27 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:244 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:127 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:377 -#: superset-frontend/src/explore/controlPanels/sections.tsx:146 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:237 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:119 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:387 +#: superset-frontend/src/explore/controlPanels/sections.tsx:119 msgid "" "This section contains options that allow for advanced analytical post " "processing of query results" msgstr "" "В этом разделе содержатся параметры, которые позволяют производить " -"аналитическую пост-обработку результатов запроса" +"аналитическую постобработку результатов запроса" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:84 -msgid "This value should be greater than the left target value" +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:583 +msgid "This section contains validation errors" +msgstr "В этом разделе содержатся ошибки валидации" + +#: superset-frontend/src/embedded/index.tsx:109 +msgid "" +"This session has encountered an interruption, and some controls may not " +"work as intended. If you are the developer of this app, please check that" +" the guest token is being generated correctly." msgstr "" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:79 -msgid "This value should be smaller than the right target value" +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.tsx:234 +msgid "This table already has a dataset" +msgstr "" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.tsx:224 +msgid "" +"This table already has a dataset associated with it. You can only " +"associate one dataset with a table.\n" msgstr "" -#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:67 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:85 +msgid "This value should be greater than the left target value" +msgstr "Это значение должно быть больше чем левое целевое значение" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:80 +msgid "This value should be smaller than the right target value" +msgstr "Это значение должно быть больше чем правое целевое значение" + +#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:66 msgid "This visualization type is not supported." msgstr "Этот тип визуализации не поддерживается." #: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:61 msgid "This was triggered by:" -msgstr "Причина срабатывания:" +msgid_plural "This may be triggered by:" +msgstr[0] "Причина срабатывания:" +msgstr[1] "Причины срабатывания" +msgstr[2] "Причины срабатывания" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:74 -msgid "Threshold alpha level for determining significance" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:99 +msgid "This will remove your current embed configuration." msgstr "" +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:66 +msgid "Threshold alpha level for determining significance" +msgstr "Пороговый альфа-уровень для определения значимости" + +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:406 +msgid "Threshold value should be double precision number" +msgstr "Пороговое значение должно быть числом двойной точности" + +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:349 +msgid "Thumbnails" +msgstr "Миниатюры" + #: superset-frontend/src/components/CronPicker/CronPicker.tsx:60 msgid "Thursday" msgstr "Четверг" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:32 +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:38 #: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:26 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:36 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:39 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:52 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:38 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:37 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:33 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:39 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:39 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:35 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:38 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:29 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:76 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:81 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:81 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:75 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:75 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:75 -#: superset-frontend/src/explore/controlPanels/sections.tsx:25 -#: superset-frontend/src/explore/controlPanels/sections.tsx:84 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:182 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:78 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:73 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:70 +#: superset-frontend/src/explore/controlPanels/sections.tsx:65 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:200 msgid "Time" msgstr "Время" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:25 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:32 msgid "Time Column" -msgstr "Столбец с временем" +msgstr "Столбец даты/времени" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:303 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:186 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:436 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:296 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:178 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:446 msgid "Time Comparison" -msgstr "Столбец с датой" +msgstr "Сравнение по времени" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:141 -#, fuzzy msgid "Time Format" -msgstr "Формат Datetime" +msgstr "Формат даты/времени" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:26 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:33 msgid "Time Grain" -msgstr "Гранулярность времени" +msgstr "Единица времени" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:28 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:34 msgid "Time Granularity" msgstr "Гранулярность времени" -#: superset/connectors/druid/views.py:350 -msgid "Time Offset" -msgstr "Смещение времени" +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:256 +msgid "Time Lag" +msgstr "Временной лаг" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:24 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:31 +#: superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocFilter.tsx:43 msgid "Time Range" -msgstr "Период времени" +msgstr "Временной интервал" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:86 -#, fuzzy +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:267 +msgid "Time Ratio" +msgstr "Соотношение времени" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:79 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/vendor/superset/AnnotationTypes.js:47 msgid "Time Series" -msgstr "Столбцы Временных Рядов" +msgstr "Временной ряд" -#: superset/viz.py:1638 +#: superset/viz.py:1667 msgid "Time Series - Bar Chart" -msgstr "Time Series - Bar Chart" +msgstr "Столбчатая диаграмма (временные ряды)" -#: superset/viz.py:1564 +#: superset/viz.py:1593 msgid "Time Series - Dual Axis Line Chart" -msgstr "Time Series - Dual Axis Line Chart" +msgstr "Диаграмма с двумя осями (временные ряды)" -#: superset/viz.py:1276 +#: superset/viz.py:1305 msgid "Time Series - Line Chart" -msgstr "Time Series - Line Chart" +msgstr "Линейная диаграмма (временные ряды)" -#: superset/viz.py:1486 +#: superset/viz.py:1515 +#, fuzzy msgid "Time Series - Multiple Line Charts" -msgstr "Time Series - Multiple Line Charts" +msgstr "Multiple Line Charts (временные ряды)" -#: superset/viz.py:3000 +#: superset/viz.py:3034 msgid "Time Series - Nightingale Rose Chart" -msgstr "Time Series - Nightingale Rose Chart" +msgstr "Диаграмма Найтингейл (временные ряды)" -#: superset/viz.py:2928 +#: superset/viz.py:2962 msgid "Time Series - Paired t-test" -msgstr "Time Series - Paired t-test" +msgstr "Парный t-test (временные ряды)" -#: superset/viz.py:1693 +#: superset/viz.py:1722 msgid "Time Series - Percent Change" -msgstr "Time Series - Percent Change" +msgstr "Процентное изменение (временные ряды)" -#: superset/viz.py:1647 +#: superset/viz.py:1676 +#, fuzzy msgid "Time Series - Period Pivot" -msgstr "Time Series - Period Pivot" +msgstr "Period Pivot (временные ряды)" -#: superset/viz.py:1701 +#: superset/viz.py:1730 msgid "Time Series - Stacked" -msgstr "Time Series - Stacked" +msgstr "Диаграмма с накоплением (временные ряды)" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:67 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:60 msgid "Time Series Options" -msgstr "Столбцы Временных Рядов" +msgstr "Настройки временных рядов" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:311 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:194 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:444 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:304 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:186 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:454 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:623 msgid "Time Shift" msgstr "Временной сдвиг" -#: superset/viz.py:822 +#: superset/viz.py:846 +#, fuzzy msgid "Time Table View" -msgstr "" +msgstr "Убрать предпросмотр таблицы" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:297 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1132 -#: superset-frontend/src/explore/constants.ts:114 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:318 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:974 +#: superset-frontend/src/explore/constants.ts:133 #: superset-frontend/src/filters/components/TimeColumn/index.ts:28 msgid "Time column" -msgstr "Столбец с временем" +msgstr "Столбец даты/времени" -#: superset/connectors/sqla/models.py:1173 +#: superset/connectors/sqla/models.py:1374 superset/models/helpers.py:1560 #, python-format msgid "Time column \"%(col)s\" does not exist in dataset" -msgstr "" +msgstr "Столбец формата дата/время \"%(col)s\" не существует в датасете" #: superset-frontend/src/filters/components/TimeColumn/index.ts:29 msgid "Time column filter plugin" msgstr "" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:88 -#: superset-frontend/src/explore/controlPanels/sections.tsx:201 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:102 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:71 +#: superset-frontend/src/explore/controlPanels/sections.tsx:174 msgid "Time comparison" msgstr "Столбец с датой" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:624 +msgid "" +"Time delta in natural language\n" +" (example: 24 hours, 7 days, 56 weeks, 365 days)" +msgstr "" +"Временной сдвиг на естественном языке (например: 24 hours, 7 days, 56 " +"weeks, 365 days)" + #: superset/charts/commands/exceptions.py:66 #, python-format msgid "" "Time delta is ambiguous. Please specify [%(human_readable)s ago] or " "[%(human_readable)s later]." msgstr "" +"Неоднозначный временной сдвиг. Пожалуйста, укажите [%(human_readable)s " +"до] или [%(human_readable)s после]." -#: superset/connectors/druid/views.py:317 -msgid "" -"Time expression to use as a predicate when retrieving distinct values to " -"populate the filter component. Only applies when `Enable Filter Select` " -"is on. If you enter `7 days ago`, the distinct list of values in the " -"filter will be populated based on the distinct value over the past week" -msgstr "" -"Выражение времени для использования в качестве предиката при получении " -"различных значений для заполнения компонента фильтра. Применяется только " -"в том случае, если включен параметр «включить выбор фильтра». Если Вы " -"введете «7 дней назад», то список различных значений в фильтре будет " -"заполнен на основе определенного значения за последнюю неделю" - -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:296 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:317 #: superset-frontend/src/filters/components/Time/index.ts:27 -#, fuzzy msgid "Time filter" msgstr "Временной фильтр" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:450 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:326 msgid "Time format" -msgstr "Формат Datetime" +msgstr "Формат даты/времени" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:298 -#: superset-frontend/src/explore/constants.ts:115 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:319 +#: superset-frontend/src/explore/constants.ts:134 #: superset-frontend/src/filters/components/TimeGrain/index.ts:28 msgid "Time grain" -msgstr "Гранулярность времени" +msgstr "Единица времени" #: superset-frontend/src/filters/components/TimeGrain/index.ts:29 #, fuzzy msgid "Time grain filter plugin" msgstr "Период времени" -#: superset/utils/pandas_postprocessing.py:815 +#: superset/utils/pandas_postprocessing/prophet.py:114 msgid "Time grain missing" -msgstr "Период времени" +msgstr "Единица времени отсутствует" -#: superset-frontend/src/explore/constants.ts:117 +#: superset-frontend/src/explore/constants.ts:135 msgid "Time granularity" msgstr "Гранулярность времени" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1267 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1282 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:413 msgid "Time in seconds" msgstr "Время в секундах" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:296 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1105 -#: superset-frontend/src/explore/constants.ts:113 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:382 -msgid "Time range" -msgstr "Период времени" +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:250 +msgid "Time lag" +msgstr "Временной лаг" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:98 -#: superset-frontend/src/explore/controlPanels/sections.tsx:69 -msgid "Time range endpoints" -msgstr "Период времени" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:317 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:946 +#: superset-frontend/src/explore/constants.ts:132 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:403 +msgid "Time range" +msgstr "Временной интервал" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:100 -#: superset-frontend/src/explore/controlPanels/sections.tsx:71 -msgid "Time range endpoints (SIP-15)" -msgstr "" +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:261 +msgid "Time ratio" +msgstr "Соотношение времени" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:28 -#: superset-frontend/src/explore/controlPanels/sections.tsx:27 -#: superset-frontend/src/explore/controlPanels/sections.tsx:85 +#: superset-frontend/src/explore/controlPanels/sections.tsx:66 msgid "Time related form attributes" -msgstr "Параметры, связанные с временем" +msgstr "Параметры, связанные со временем" + +#: superset-frontend/src/modules/AnnotationTypes.js:46 +msgid "Time series" +msgstr "Временной ряд" #: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:48 -#: superset-frontend/src/explore/controlPanels/TimeTable.js:38 +#: superset-frontend/src/visualizations/TimeTable/controlPanel.js:38 msgid "Time series columns" -msgstr "Столбцы Временных Рядов" +msgstr "Столбцы временных рядов" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:96 -#: superset-frontend/src/explore/controlPanels/sections.tsx:209 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:110 +#: superset-frontend/src/explore/controlPanels/sections.tsx:182 msgid "Time shift" msgstr "Временной сдвиг" @@ -13348,84 +16171,86 @@ msgid "" "Time string is ambiguous. Please specify [%(human_readable)s ago] or " "[%(human_readable)s later]." msgstr "" +"Временная строка неоднозначна. Пожалуйста, укажите [%(human_readable)s " +"до] или [%(human_readable)s после]." -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:75 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:72 msgid "Time-series Area Chart" -msgstr "Time Series - Bar Chart" +msgstr "Диаграмма с областями (временные ряды)" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:65 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:60 msgid "" "Time-series Area chart are similar to line chart in that they represent " "variables with the same scale, but area charts stack the metrics on top " "of each other. An area chart in Superset can be stream, stack, or expand." msgstr "" +"Диаграмма с наполнением похожа на линейную диаграмму тем, что они " +"представляют переменные с одинаковым масштабом, но диаграммы с " +"наполнением накладывают показатели друг на друга." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:35 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:78 msgid "Time-series Bar Chart" -msgstr "Time Series - Bar Chart" +msgstr "Столбчатая диаграмма" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:75 -#, fuzzy -msgid "Time-series Bar Chart v2" -msgstr "Time Series - Bar Chart" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:35 +msgid "Time-series Bar Chart (legacy)" +msgstr "Столбчатая диаграмма (устарело)" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:61 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:64 msgid "" "Time-series Bar Charts are used to show the changes in a metric over time" " as a series of bars." msgstr "" +"Столбчатые диаграммы временных рядов используются для отображения " +"изменений меры с течением времени в виде серии столбцов." -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:69 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:64 msgid "Time-series Chart" -msgstr "Таблица временных рядов" +msgstr "Диаграмма (временные ряды)" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:70 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:77 msgid "Time-series Line Chart" -msgstr "Time Series - Line Chart" +msgstr "Линейная диаграмма (временные ряды)" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:30 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:32 msgid "Time-series Percent Change" -msgstr "Time Series - Percent Change" +msgstr "Процентное изменение (временные ряды)" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:28 #, fuzzy msgid "Time-series Period Pivot" msgstr "Time Series - Period Pivot" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:69 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:76 msgid "Time-series Scatter Plot" -msgstr "Таблица временных рядов" +msgstr "Точечная Диаграмма" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:59 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:64 msgid "" "Time-series Scatter Plot has time on the horizontal axis in linear units," " and the points are connected in order. It shows a statistical " "relationship between two variables." msgstr "" +"На горизонтальной оси Точечной диаграммы откладывается время в линейных " +"единицах, а точки соединяются по порядку. Он показывает статистическую " +"зависимость между двумя переменными." -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:69 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:76 msgid "Time-series Smooth Line" -msgstr "Таблица временных рядов" +msgstr "Плавная линейная диаграмма (временные ряды)" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:59 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:64 msgid "" -"Time-series Smooth-line is a variation of line chart. Without angles and " -"hard edges, Smooth-line looks more smarter and more professional." +"Time-series Smooth-line is a variation of the line chart. Without angles " +"and hard edges, Smooth-line sometimes looks smarter and more " +"professional." msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:60 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:67 msgid "Time-series Stepped Line" -msgstr "Таблица временных рядов" +msgstr "Диаграмма шагов (временные ряды)" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:50 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:55 msgid "" "Time-series Stepped-line graph (also called step chart) is a variation of" " line chart but with the line forming a series of steps between data " @@ -13433,259 +16258,319 @@ msgid "" " occur at irregular intervals." msgstr "" -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:25 +#: superset-frontend/src/visualizations/TimeTable/index.ts:27 msgid "Time-series Table" msgstr "Таблица временных рядов" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:60 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:65 msgid "" "Time-series line chart is used to visualize repeated measurements taken " "over regular time intervals. Line chart is a type of chart which displays" " information as a series of data points connected by straight line " "segments. It is a basic type of chart common in many fields." msgstr "" +"Линейная диаграмма временных рядов используется для визуализации " +"повторяющихся измерений, происходящих через регулярные промежутки " +"времени. Линейная диаграмма - это тип диаграммы, который отображает " +"информацию в виде ряда точек данных, соединенных прямыми отрезками. Это " +"базовый тип диаграммы, распространенный во многих областях." #: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:98 msgid "Timeout error" -msgstr "Тайм-аут" - -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:60 -#, fuzzy -msgid "Timestamp Format" -msgstr "Формат Даты / Времени" +msgstr "Ошибка таймаута" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:73 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:372 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:383 msgid "Timestamp format" -msgstr "Формат Даты / Времени" +msgstr "Формат даты и времени" -#: superset-frontend/src/components/ReportModal/index.tsx:378 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1223 +#: superset-frontend/src/components/ReportModal/index.tsx:320 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:409 msgid "Timezone" -msgstr "" +msgstr "Часовой пояс" -#: superset/connectors/druid/views.py:312 superset/connectors/sqla/views.py:438 +#: superset/connectors/sqla/views.py:428 msgid "Timezone offset (in hours) for this datasource" msgstr "Смещение часового пояса (в часах) для этого источника данных" -#: superset-frontend/src/components/TimezoneSelector/index.tsx:120 -#, fuzzy +#: superset-frontend/src/components/TimezoneSelector/index.tsx:129 msgid "Timezone selector" -msgstr "Выполнить выбранный запрос" +msgstr "Выбор часового пояса" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:35 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:69 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:35 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:69 msgid "Tiny" -msgstr "в" - -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:502 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:42 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:278 -#: superset/views/dashboard/mixin.py:79 superset/views/dashboard/views.py:156 +msgstr "Крошечный" + +#: superset-frontend/src/components/DynamicEditableTitle/index.tsx:186 +#: superset-frontend/src/components/DynamicEditableTitle/index.tsx:207 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:586 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:41 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:288 +#: superset/views/dashboard/mixin.py:79 superset/views/dashboard/views.py:192 msgid "Title" msgstr "Заголовок" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:509 -#, fuzzy +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:557 msgid "Title Column" -msgstr "Столбец с временем" +msgstr "Столбец с названием" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:45 -#, fuzzy +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:44 msgid "Title is required" -msgstr "Поле обязательно" +msgstr "Название обязательно" -#: superset/dashboards/filters.py:33 +#: superset/dashboards/filters.py:38 msgid "Title or Slug" -msgstr "Заголовок" +msgstr "Название или читаемый URL" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:287 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:348 msgid "To filter on a metric, use Custom SQL tab." -msgstr "Фильтр на показателе, используйте вкладку Через SQL." +msgstr "Для фильтрации по мере используйте вкладку Свой SQL." #: superset/views/dashboard/mixin.py:58 msgid "To get a readable URL for your dashboard" -msgstr "Получить читаемый URL-адрес для дашборда" +msgstr "Для получения читаемого URL-адреса дашборда" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:280 -msgid "Toggle chart description" -msgstr "Изменить описание графика" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:285 +msgid "Too many columns to filter" +msgstr "Слишком много столбцов для фильтрации" -#: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:25 -#, fuzzy +#: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:27 msgid "Tools" -msgstr "Роли" +msgstr "Инструменты" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:184 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:210 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:205 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:211 msgid "Tooltip" -msgstr "" +msgstr "Всплывающая подсказка" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:172 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:198 msgid "Tooltip sort by metric" -msgstr "Список показателей" +msgstr "Сортировка данных подсказки по мере" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:162 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:188 msgid "Tooltip time format" -msgstr "Формат Datetime" +msgstr "Формат времени всплывающей подсказки" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:289 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:29 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:83 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:354 msgid "Top" -msgstr "Стоп" +msgstr "Сверху" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:139 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:183 +msgid "Top left" +msgstr "Сверху слева" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:184 +msgid "Top right" +msgstr "Сверху справа" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:140 msgid "Top to Bottom" +msgstr "Сверху вниз" + +#: superset/charts/post_processing.py:72 +#, python-format +msgid "Total (%(aggfunc)s)" msgstr "" -#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:439 -msgid "Totals" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx:491 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx:556 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx:772 +#, python-format +msgid "Total (%(aggregatorName)s)" msgstr "" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:820 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/transformProps.ts:326 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/transformProps.ts:359 +#, python-format +msgid "Total: %s" +msgstr "Итого: %s" + +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:550 +msgid "Totals" +msgstr "Общая сумма" + +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:408 msgid "Track job" msgstr "Отслеживать работу" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:40 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:46 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:77 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:83 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:82 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:76 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:77 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:67 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:76 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:48 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:85 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:74 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:71 msgid "Transformable" -msgstr "" +msgstr "Трансформируемый" #: superset-frontend/src/dashboard/util/backgroundStyleOptions.ts:25 msgid "Transparent" -msgstr "" +msgstr "Прозрачный" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:110 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:99 msgid "Transpose Pivot" -msgstr "" +msgstr "Транспонировать таблицу" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:173 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:238 msgid "Transpose pivot" -msgstr "" +msgstr "Транспонировать таблицу" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:39 -#, fuzzy msgid "Tree Chart" -msgstr "Поделиться графиком" +msgstr "Древовидная диаграмма" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:117 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:118 msgid "Tree layout" -msgstr "" +msgstr "Оформление дерева" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:134 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:135 msgid "Tree orientation" -msgstr "Удалить аннотацию" +msgstr "Ориентация дерева" -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:40 -#: superset/viz.py:1003 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:56 +#: superset/viz.py:1032 msgid "Treemap" -msgstr "Treemap" +msgstr "Плоское дерево" -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:56 -#, fuzzy -msgid "Treemap v2" -msgstr "Treemap" +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:40 +msgid "Treemap (legacy)" +msgstr "Плоское дерево (устарело)" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:37 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:37 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:43 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:39 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:40 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:53 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:39 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:38 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:40 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:59 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:36 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:40 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:40 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:42 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:45 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:61 +#: superset-frontend/src/visualizations/TimeTable/index.ts:39 msgid "Trend" -msgstr "Изменения" +msgstr "Тенденция" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:226 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:227 msgid "Triangle" -msgstr "" +msgstr "Треугольник" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1168 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:403 msgid "Trigger Alert If..." -msgstr "Сделать оповещение, если…" - -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:340 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:255 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:218 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:198 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:215 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:271 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:274 +msgstr "Оповестить, если..." + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:227 +msgid "Truncate Axis" +msgstr "Настройка интервала оси" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:136 +#, fuzzy +msgid "Truncate Cells" +msgstr "Настройка интервала оси" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:350 +msgid "Truncate Metric" +msgstr "Убрать имя меры" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:356 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:244 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:231 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:175 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:175 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:228 msgid "Truncate Y Axis" +msgstr "Урезать интервал оси Y" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:359 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:247 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:234 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:178 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:178 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:231 +msgid "Truncate Y Axis. Can be overridden by specifying a min or max bound." msgstr "" +"Уменьшить интервал по умолчанию для оси Y. Необходимо задать минимальную " +"и максимальную границы. Обратите внимание, что некоторые линии могут " +"пропасть из области видимости." -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:343 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:258 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:201 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:218 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:274 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:277 -msgid "Truncate Y Axis. Can be overridden by specifying a min or max bound." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:137 +msgid "Truncate long cells to the \"min width\" set above" msgstr "" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:58 msgid "Truncates the specified date to the accuracy specified by the date unit." -msgstr "" +msgstr "Усекает указанную дату с точностью, указанной в единице измерения даты." -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:222 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx:174 msgid "Try applying different filters or ensuring your datasource has data" msgstr "" +"Попробуйте использовать другие фильтры или убедитесь, что в вашем " +"источнике данных есть данные" + +#: superset-frontend/src/components/ListView/ListView.tsx:409 +msgid "Try different criteria to display results." +msgstr "Попробуйте использовать другии критерии фильтрации" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/LeftPanel/index.tsx:248 +msgid "Try selecting a different schema" +msgstr "" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:58 msgid "Tuesday" msgstr "Вторник" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:215 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:94 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:47 +#, fuzzy +msgid "Tukey" +msgstr "запрос" + +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:63 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:216 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:215 #: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:219 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:272 #: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:276 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:288 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:466 -#: superset/connectors/druid/views.py:92 superset/connectors/druid/views.py:190 -#: superset/connectors/sqla/views.py:152 superset/connectors/sqla/views.py:258 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:347 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:556 +#: superset/connectors/sqla/views.py:165 superset/connectors/sqla/views.py:254 msgid "Type" msgstr "Тип" #: superset-frontend/src/components/DeleteModal/index.tsx:92 -#: superset-frontend/src/components/ImportModal/index.tsx:253 +#: superset-frontend/src/components/ImportModal/index.tsx:252 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1232 #, python-format msgid "Type \"%s\" to confirm" -msgstr "Введите “%s” для подтверждения" +msgstr "Введите \"%s\" для подтверждения" -#: superset-frontend/src/components/ListView/Filters/Search.tsx:71 -#, fuzzy +#: superset-frontend/src/components/ListView/Filters/Search.tsx:75 msgid "Type a value" -msgstr "Введите значение здесь" +msgstr "Введите значение" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:319 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:379 msgid "Type a value here" msgstr "Введите значение здесь" -#: superset/reports/commands/exceptions.py:71 +#: superset/reports/commands/exceptions.py:75 msgid "Type is required" -msgstr "Тип обязателен" +msgstr "Поле обязательно" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:73 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:72 msgid "Type of Google Sheets allowed" -msgstr "" +msgstr "Допустимый тип Google Таблиц" -#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:379 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:216 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:273 +msgid "Type of comparison, value difference or percentage" +msgstr "Тип сравнения, разница значений или доля" + +#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:404 #, python-format msgid "Type or Select [%s]" -msgstr "Выбрать [%s]" +msgstr "Введите или выберите [%s]" #: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:51 #: superset-frontend/src/filters/components/Range/controlPanel.ts:47 @@ -13693,226 +16578,267 @@ msgstr "Выбрать [%s]" #: superset-frontend/src/filters/components/Time/controlPanel.ts:45 #: superset-frontend/src/filters/components/TimeColumn/controlPanel.ts:25 #: superset-frontend/src/filters/components/TimeGrain/controlPanel.ts:25 -#, fuzzy msgid "UI Configuration" -msgstr "Фильтруемые срезы" +msgstr "Конфигурация UI" -#: superset-frontend/src/explore/controlPanels/TimeTable.js:51 +#: superset-frontend/src/visualizations/TimeTable/controlPanel.js:51 msgid "URL" msgstr "Ссылка (URL)" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:76 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:88 msgid "URL Parameters" -msgstr "Параметры" +msgstr "Параметры URL" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:125 -#, fuzzy -msgid "URL could not be identified" -msgstr "График не может быть удалён." - -#: superset-frontend/src/explore/controlPanels/sections.tsx:60 +#: superset-frontend/src/explore/controlPanels/sections.tsx:50 msgid "URL parameters" -msgstr "Параметры" +msgstr "Параметры URL" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:514 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:595 msgid "URL slug" msgstr "Читаемый URL" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:531 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:592 msgid "Unable to add a new tab to the backend. Please contact your administrator." msgstr "" +"Не удается добавить новую вкладку на сервер. Пожалуйста, свяжитесь с " +"администратором." -#: superset/db_engine_specs/presto.py:218 +#: superset/db_engine_specs/presto.py:650 #, python-format msgid "Unable to connect to catalog named \"%(catalog_name)s\"." msgstr "" -#: superset/db_engine_specs/mysql.py:139 -#: superset/db_engine_specs/postgres.py:145 +#: superset/db_engine_specs/mysql.py:163 +#: superset/db_engine_specs/postgres.py:127 #, python-format msgid "Unable to connect to database \"%(database)s\"." +msgstr "Невозможно подключиться к базе данных \"%(database)s\"." + +#: superset/db_engine_specs/bigquery.py:158 +msgid "" +"Unable to connect. Verify that the following roles are set on the service" +" account: \"BigQuery Data Viewer\", \"BigQuery Metadata Viewer\", " +"\"BigQuery Job User\" and the following permissions are set " +"\"bigquery.readsessions.create\", \"bigquery.readsessions.getData\"" msgstr "" -#: superset/utils/date_parser.py:390 -#, fuzzy, python-format +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:218 +msgid "Unable to create chart without a query id." +msgstr "" + +#: superset/utils/date_parser.py:393 +#, python-format msgid "Unable to find such a holiday: [%(holiday)s]" -msgstr "Невозможно найти такой выходной день: [{}]" +msgstr "Не удалось найти такой праздник: [%(holiday)s]" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/MessageContent.tsx:72 +msgid "" +"Unable to load columns for the selected table. Please select a different " +"table." +msgstr "" +"Не удалось загрузить столбцы для выбранной таблицы. Пожалуйста, выберите " +"другую таблицу." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:498 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:559 msgid "" "Unable to migrate query editor state to backend. Superset will retry " "later. Please contact your administrator if this problem persists." msgstr "" +"Не удается перенести состояние редактора запроса на сервер. Суперсет " +"повторит попытку позже. Пожалуйста, свяжитесь с вашим администратором, " +"если эта проблема не устранена." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:452 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:513 msgid "" "Unable to migrate query state to backend. Superset will retry later. " "Please contact your administrator if this problem persists." msgstr "" +"Не удается перенести состояние запроса на сервер. Суперсет повторит " +"попытку позже. Пожалуйста, свяжитесь с вашим администратором, если эта " +"проблема не устранена." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:434 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:495 msgid "" "Unable to migrate table schema state to backend. Superset will retry " "later. Please contact your administrator if this problem persists." msgstr "" +"Не удается перенести состояние схемы таблицы на сервер. Суперсет повторит" +" попытку позже. Пожалуйста, свяжитесь с вашим администратором, если эта " +"проблема не устранена." -#: superset/connectors/sqla/views.py:641 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/WorldMap.js:128 #, python-format -msgid "Unable to refresh metadata for the following table(s): %(tables)s" -msgstr "Метаданные обновлены для следующих таблиц: %(tables)s" +msgid "Unable to process right-click on %s. Check you chart configuration." +msgstr "Не удалось обработать ПКМ на %s. Проверьте настройки графика." + +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:126 +msgid "Unable to retrieve dashboard colors" +msgstr "Не удалось получать цветовую схему дашборда" -#: superset/views/database/views.py:240 +#: superset/views/database/views.py:275 #, python-format msgid "" "Unable to upload CSV file \"%(filename)s\" to table \"%(table_name)s\" in" " database \"%(db_name)s\". Error message: %(error_msg)s" msgstr "" -"Невозможно загрузить CSV-файл \"%(filename)s\" таблицу \"%(table_name)s\"" -" базы данных \"%(db_name)s”. Сообщение об ошибке: %(error_msg)s" +"Не удалось загрузить CSV файл \"%(filename)s\" в таблицу " +"\"%(table_name)s\" в базу данных \"%(db_name)s\". Ошибка: %(error_msg)s" -#: superset/views/database/views.py:538 -#, fuzzy, python-format +#: superset/views/database/views.py:553 +#, python-format msgid "" "Unable to upload Columnar file \"%(filename)s\" to table " "\"%(table_name)s\" in database \"%(db_name)s\". Error message: " "%(error_msg)s" msgstr "" -"Невозможно загрузить Excel-файл \"%(filename)s\" в таблицу " -"\"%(table_name)s\" базы данных \"%(db_name)s”. Сообщение об ошибке: " -"%(error_msg)s" +"Не удалось загрузить файл столбчатого типа \"%(filename)s\" в таблицу " +"\"%(table_name)s\" в базу данных \"%(db_name)s\". Ошибка: %(error_msg)s" -#: superset/views/database/views.py:386 +#: superset/views/database/views.py:412 #, python-format msgid "" "Unable to upload Excel file \"%(filename)s\" to table \"%(table_name)s\" " "in database \"%(db_name)s\". Error message: %(error_msg)s" msgstr "" -"Невозможно загрузить Excel-файл \"%(filename)s\" в таблицу " -"\"%(table_name)s\" базы данных \"%(db_name)s”. Сообщение об ошибке: " -"%(error_msg)s" +"Не удалось загрузить Excel файл \"%(filename)s\" в таблицу " +"\"%(table_name)s\" в базу данных \"%(db_name)s\". Ошибка: %(error_msg)s" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:75 -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:114 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:94 +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:134 msgid "Undefined" msgstr "Не определено" -#: superset/utils/pandas_postprocessing.py:391 +#: superset/utils/pandas_postprocessing/rolling.py:67 msgid "Undefined window for rolling operation" -msgstr "" +msgstr "Неопределенное окно для скольжения" + +#: superset-frontend/src/dashboard/components/Header/index.jsx:553 +msgid "Undo the action" +msgstr "Отменить действие" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitleContainer.tsx:126 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitleContainer.tsx:131 msgid "Undo?" msgstr "Отменить?" #: superset-frontend/src/components/ErrorBoundary/index.jsx:51 -#: superset-frontend/src/components/ErrorMessage/ErrorMessageWithStackTrace.tsx:26 +#: superset-frontend/src/components/ErrorMessage/ErrorMessageWithStackTrace.tsx:25 msgid "Unexpected error" msgstr "Неожиданная ошибка" -#: superset/databases/commands/exceptions.py:135 superset/views/core.py:1391 +#: superset/databases/commands/exceptions.py:137 +#: superset/databases/commands/exceptions.py:142 superset/views/core.py:1426 msgid "Unexpected error occurred, please check your logs for details" msgstr "" -"Произошла непредвиденная ошибка, пожалуйста, проверьте логи для " -"подробностей" +"Возникла неожиданная ошибка, пожалуйста, проверьте историю действий для " +"уточнения деталей" -#: superset-frontend/src/utils/getClientErrorObject.ts:55 -#, fuzzy +#: superset-frontend/src/utils/getClientErrorObject.ts:75 msgid "Unexpected error: " -msgstr "Неожиданная ошибка" +msgstr "Неожиданная ошибка: " -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:95 -#, fuzzy +#: superset/views/api.py:109 +#, fuzzy, python-format +msgid "Unexpected time range: %s" +msgstr "Неожиданная ошибка: " + +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:88 msgid "Unknown" -msgstr "Неизвестная ошибка" +msgstr "Неизвестно" -#: superset/db_engine_specs/mysql.py:129 +#: superset/db_engine_specs/mysql.py:153 #, python-format msgid "Unknown MySQL server host \"%(hostname)s\"." -msgstr "" +msgstr "Неизвестный хост MySQL \"%(hostname)s\"." -#: superset/db_engine_specs/presto.py:1005 +#: superset/db_engine_specs/presto.py:1281 msgid "Unknown Presto Error" -msgstr "Неизвестная ошибка" +msgstr "Неизвестная ошибка Presto" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:111 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:162 msgid "Unknown Status" -msgstr "" +msgstr "Неизвестный статус" -#: superset/connectors/sqla/models.py:1121 +#: superset/connectors/sqla/models.py:1299 superset/models/helpers.py:1483 #, python-format msgid "Unknown column used in orderby: %(col)s" -msgstr "" +msgstr "Неизвестный столбец использован для упорядочивания: %(col)s" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:349 -#: superset-frontend/src/SqlLab/actions/sqlLab.js:389 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:372 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:450 msgid "Unknown error" msgstr "Неизвестная ошибка" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils/index.ts:45 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/utilities.js:842 +msgid "Unknown input format" +msgstr "Неизвестный формат ввода" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils/index.ts:43 msgid "Unknown value" msgstr "Неизвестная ошибка" -#: superset/jinja_context.py:347 +#: superset/jinja_context.py:353 #, python-format msgid "Unsafe return type for function %(func)s: %(value_type)s" msgstr "Небезопасный возвращаемый тип для функции %(func)s: %(value_type)s" -#: superset/jinja_context.py:371 +#: superset/jinja_context.py:380 #, python-format msgid "Unsafe template value for key %(key)s: %(value_type)s" -msgstr "Небезопасное значение для ключа шаблона %(key)s: %(value_type)s" +msgstr "Небезопасное значение шаблона для ключа %(key)s: %(value_type)s" -#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:255 +#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:256 #, python-format msgid "Unset Filters (%d)" msgstr "Сбросить фильтры (%d)" -#: superset/utils/core.py:1048 +#: superset/utils/core.py:1103 #, python-format msgid "Unsupported clause type: %(clause)s" -msgstr "" - -#: superset/connectors/druid/models.py:1492 -msgid "Unsupported extraction function: " -msgstr "Неподдерживаемая функция: " +msgstr "Неподдерживаемый оператор: %(clause)s" -#: superset/common/query_object.py:392 +#: superset/common/query_object.py:438 #, python-format msgid "Unsupported post processing operation: %(operation)s" -msgstr "Неподдерживаемая операция пост-процессинга: %(operation)s" +msgstr "Неподдерживаемая операция постобработки: %(operation)s" -#: superset/jinja_context.py:358 +#: superset/jinja_context.py:364 #, python-format msgid "Unsupported return value for method %(name)s" -msgstr "Неподдерживаемое возвращаемое значение для метода %(name)s" +msgstr "Неподдерживаемое значение для метода %(name)s" -#: superset/jinja_context.py:382 +#: superset/jinja_context.py:391 #, python-format msgid "Unsupported template value for key %(key)s" -msgstr "Неподдерживаемое значение для ключа шаблона %(key)s" +msgstr "Неподдерживаемое значение шаблона для ключа %(key)s" -#: superset/utils/pandas_postprocessing.py:818 +#: superset/utils/pandas_postprocessing/prophet.py:117 #, python-format msgid "Unsupported time grain: %(time_grain)s" -msgstr "Недействительная гранулярность времени: %(time_grain)s" +msgstr "Неподдерживаемая единица времени: %(time_grain)s" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:264 -#, python-format -msgid "Untitled Query %s" -msgstr "Запрос без имени %s" +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:148 +msgid "Untitled Dataset" +msgstr "Безымянный датасет" + +#: superset/views/sql_lab/views.py:148 +#, fuzzy +msgid "Untitled Query" +msgstr "Безымянный запрос" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:331 #: superset-frontend/src/SqlLab/reducers/getInitialState.js:44 msgid "Untitled query" -msgstr "Запрос без имени" +msgstr "Безымянный запрос" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:190 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:224 msgid "Update" msgstr "Обновить" -#: superset-frontend/src/chart/chartReducer.ts:82 +#: superset-frontend/src/explore/components/RunQueryButton/index.tsx:54 +#: superset-frontend/src/utils/getChartRequiredFieldsMissingMessage.ts:23 +msgid "Update chart" +msgstr "Обновить график" + +#: superset-frontend/src/components/Chart/chartReducer.ts:83 msgid "Updating chart was stopped" msgstr "Обновление графика остановлено" @@ -13920,99 +16846,143 @@ msgstr "Обновление графика остановлено" msgid "Upload" msgstr "Загрузить" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:134 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:199 +msgid "Upload CSV" +msgstr "Загрузить CSV" + +#: superset-frontend/src/views/components/RightMenu.tsx:190 +msgid "Upload CSV to database" +msgstr "Загрузить файл CSV в базу данных" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:135 msgid "Upload Credentials" -msgstr "Загрузить файл Excel" +msgstr "Загрузить учетные данные" -#: superset/initialization/__init__.py:400 -msgid "Upload Excel" +#: superset/databases/filters.py:66 +msgid "Upload Enabled" +msgstr "Загрузка включена" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:213 +msgid "Upload Excel file" msgstr "Загрузить файл Excel" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:102 +#: superset-frontend/src/views/components/RightMenu.tsx:202 +msgid "Upload Excel file to database" +msgstr "Загрузить файл Excel в базу данных" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:101 msgid "Upload JSON file" -msgstr "" +msgstr "Загрузить JSON файл" -#: superset/initialization/__init__.py:369 -msgid "Upload a CSV" -msgstr "Загрузить CSV" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:206 +msgid "Upload columnar file" +msgstr "Загрузить файл столбчатого формата" -#: superset/initialization/__init__.py:383 -msgid "Upload a Columnar File" -msgstr "" +#: superset-frontend/src/views/components/RightMenu.tsx:196 +msgid "Upload columnar file to database" +msgstr "Загрузить файл столбчатого формата в базу данных" -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:112 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:196 +msgid "Upload file to database" +msgstr "Загрузить файл в базу данных" + +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:674 +#, python-format +msgid "Use \"%(menuName)s\" menu instead." +msgstr "Использовать меню \"%(menuName)s\" взамен." + +#: superset-frontend/src/dashboard/util/getSliceHeaderTooltip.tsx:34 +#, python-format +msgid "Use %s to open in a new tab." +msgstr "Используйте %s для открытия в отдельной вкладке." + +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:104 +#: superset-frontend/src/explore/controlUtils/controlUtils.test.tsx:113 +#: superset-frontend/src/explore/fixtures.tsx:43 msgid "Use Area Proportions" -msgstr "Свойства дашборда" +msgstr "Использовать пропорции области" -#: superset/views/database/forms.py:175 superset/views/database/forms.py:433 -#, fuzzy, python-format +#: superset/views/database/forms.py:462 msgid "Use Columns" -msgstr "Столбец(ы) %s" - -#: superset/views/database/forms.py:211 -msgid "Use Pandas to interpret the datetime format automatically." -msgstr "" -"Используйте Pandas для автоматической интерпретации формата даты и " -"времени." +msgstr "Используемые столбцы" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:207 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:200 msgid "Use a log scale" -msgstr "" +msgstr "Использовать логарифмическую шкалу" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:107 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:108 msgid "Use a log scale for the X-axis" -msgstr "" +msgstr "Использовать логарифмическую шкалу для оси X" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:230 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:250 msgid "Use a log scale for the Y-axis" -msgstr "" +msgstr "Использовать логарифмическую шкалу для оси Y" -#: superset/db_engine_specs/base.py:1401 +#: superset/db_engine_specs/base.py:1746 +#: superset/db_engine_specs/databricks.py:57 msgid "Use an encrypted connection to the database" +msgstr "Использовать зашифрованное соединение к Базе Данных" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:438 +#, python-format +msgid "" +"Use another existing chart as a source for annotations and overlays.\n" +" Your chart must be one of these visualization types: [%s]" +msgstr "" + +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:86 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:160 +msgid "Use date formatting even when metric value is not a timestamp" msgstr "" +"Использовать перевод к формату дата/время даже если мера представляет " +"другой тип данных" -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:209 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:213 msgid "Use legacy datasource editor" msgstr "Использовать старый редактор" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:85 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:122 msgid "Use metrics as a top level group for columns or for rows" msgstr "" -#: superset-frontend/src/filters/components/Range/controlPanel.ts:68 +#: superset-frontend/src/filters/components/Range/controlPanel.ts:70 msgid "Use only a single value." -msgstr "" +msgstr "Используйте только одно значение." -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:124 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:117 msgid "Use the Advanced Analytics options below" -msgstr "" +msgstr "Используйте настройки Расширенной аналитики ниже" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:136 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:137 msgid "" "Use the JSON file you automatically downloaded when creating your service" " account." msgstr "" #: superset/templates/superset/fab_overrides/list_with_checkboxes.html:82 -msgid "Use the edit buttom to change this field" -msgstr "Используйте кнопку правки для изменения этого поля" +msgid "Use the edit button to change this field" +msgstr "Используйте кнопку редактирования для изменения поля" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:176 -#: superset-frontend/src/explore/controls.jsx:207 +#: superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx:39 +msgid "Use this section if you want a query that aggregates" +msgstr "" + +#: superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx:53 +msgid "Use this section if you want to query atomic rows" +msgstr "" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:130 +#: superset-frontend/src/explore/controls.jsx:206 msgid "Use this to define a static color for all circles" -msgstr "Используйте это цвет для заливки всех кругов одним цветом" +msgstr "Этот цвет используется для заливки" #: superset/views/dynamic_plugins.py:48 msgid "" "Used internally to identify the plugin. Should be set to the package name" " from the pluginʼs package.json" msgstr "" -"Используется системой для идентификации плагина. Должно быть установлено " -"в имя пакета, которое указано в файле package.json" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:27 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:28 msgid "" "Used to summarize a set of data by grouping together multiple statistics " "along two axes. Examples: Sales numbers by region and month, tasks by " @@ -14021,69 +16991,75 @@ msgid "" " This chart is being deprecated and we recommend checking out Pivot " "Table V2 instead!" msgstr "" +"Используется для обобщения набора данных путем группировки нескольких " +"показателей по двум осям. Примеры: показатели продаж по регионам и " +"месяцам, задачи по статусу и назначенному лицу, активные пользователи по " +"возрасту и местоположению.\n" +" Этот график устарел, рекомендуется использовать график Сводная Таблица 2." -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:51 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:52 msgid "" "Used to summarize a set of data by grouping together multiple statistics " "along two axes. Examples: Sales numbers by region and month, tasks by " "status and assignee, active users by age and location. Not the most " "visually stunning visualization, but highly informative and versatile." msgstr "" +"Используется для обобщения набора данных путем группировки нескольких " +"показателей по двум осям. Примеры: показатели продаж по регионам и " +"месяцам, задачи по статусу и назначенному лицу, активные пользователи по " +"возрасту и местоположению." -#: superset-frontend/src/components/Menu/MenuRight.tsx:158 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:275 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:365 -#: superset/views/access_requests.py:41 superset/views/log/__init__.py:30 -#: superset/views/schedules.py:239 superset/views/schedules.py:319 -#: superset/views/sql_lab.py:69 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:293 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:385 +#: superset-frontend/src/views/components/RightMenu.tsx:490 +#: superset/views/access_requests.py:44 superset/views/log/__init__.py:30 +#: superset/views/sql_lab/views.py:82 msgid "User" msgstr "Пользователь" -#: superset/views/access_requests.py:42 +#: superset/views/access_requests.py:45 msgid "User Roles" -msgstr "Роли пользователей" +msgstr "Роли пользователя" -#: superset/errors.py:112 -#, fuzzy +#: superset/errors.py:118 msgid "User doesn't have the proper permissions." -msgstr "У вас нет прав на " - -#: superset-frontend/src/filters/components/Select/controlPanel.ts:94 -#, fuzzy -msgid "User must select a value before applying the filter" -msgstr "Пользователю нужно будет выбрать значение для этого фильтра" - -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:253 -msgid "User must select a value for this filter" -msgstr "Пользователю нужно будет выбрать значение для этого фильтра" +msgstr "У пользователя нет надлежащего доступа." -#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:76 +#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:75 #: superset-frontend/src/filters/components/Range/controlPanel.ts:58 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:93 #: superset-frontend/src/filters/components/Time/controlPanel.ts:56 #: superset-frontend/src/filters/components/TimeColumn/controlPanel.ts:36 #: superset-frontend/src/filters/components/TimeGrain/controlPanel.ts:36 -#, fuzzy -msgid "User must select a value for this filter." -msgstr "Пользователю нужно будет выбрать значение для этого фильтра" +msgid "User must select a value before applying the filter" +msgstr "Для использования фильтра пользователь будет обязан выбрать значение" + +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:253 +msgid "User must select a value for this filter" +msgstr "Для использования фильтра пользователь будет обязан выбрать значение" -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:154 +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:156 msgid "User query" -msgstr "Скопировать запрос" +msgstr "Пользовательский запрос" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:109 -#: superset/db_engine_specs/base.py:1388 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:133 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:138 +#: superset/db_engine_specs/base.py:1733 msgid "Username" -msgstr "Имя запроса" +msgstr "Имя пользователя" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:39 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:41 msgid "" "Uses a gauge to showcase progress of a metric towards a target. The " "position of the dial represents the progress and the terminal value in " "the gauge represents the target value." msgstr "" +"Использует индикатор для демонстрации прогресса показателя в достижении " +"цели. Положение циферблата показывает ход выполнения, а конечное значение" +" на индикаторе представляет целевое значение." #: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:28 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/index.ts:37 msgid "" "Uses circles to visualize the flow of data through different stages of a " "system. Hover over individual paths in the visualization to understand " @@ -14091,161 +17067,185 @@ msgid "" "funnels and pipelines." msgstr "" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:294 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1186 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1202 -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:140 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:52 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:89 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:103 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:109 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:116 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:99 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:315 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:405 +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:143 msgid "Value" -msgstr "Подписи" +msgstr "Значение" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:91 +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:83 msgid "Value Domain" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:329 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:343 msgid "Value Format" msgstr "Формат значения" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:235 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:249 msgid "Value bounds" -msgstr "" +msgstr "Ограничения для значения" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:165 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:206 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:161 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:271 msgid "Value format" msgstr "Формат значения" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx:75 -#, fuzzy msgid "Value is required" -msgstr "Имя обязательно" +msgstr "Значение обязательно" -#: superset/reports/schemas.py:185 superset/reports/schemas.py:191 -#: superset/reports/schemas.py:197 superset/reports/schemas.py:275 -#: superset/reports/schemas.py:281 superset/reports/schemas.py:288 -#, fuzzy +#: superset/reports/schemas.py:186 superset/reports/schemas.py:192 +#: superset/reports/schemas.py:198 superset/reports/schemas.py:280 +#: superset/reports/schemas.py:286 superset/reports/schemas.py:293 msgid "Value must be greater than 0" -msgstr "`смещение_строк` должно быть больше или равно 0" +msgstr "Значение должно быть больше 0" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:194 +msgid "Values are dependent on other filters" +msgstr "Значения зависят от других фильтров" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:201 +msgid "Values dependent on" +msgstr "Значения зависят от" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:197 +msgid "" +"Values selected in other filters will affect the filter options to only " +"show relevant values" +msgstr "" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:39 msgid "Vehicle Types" msgstr "" -#: superset/connectors/druid/views.py:189 -#: superset/connectors/druid/views.py:238 superset/connectors/sqla/views.py:144 -#: superset/connectors/sqla/views.py:257 +#: superset/connectors/sqla/views.py:157 superset/connectors/sqla/views.py:253 msgid "Verbose Name" -msgstr "Полное имя" +msgstr "Удобочитаемое имя" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:482 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:503 +#: superset-frontend/src/views/components/RightMenu.tsx:517 msgid "Version" -msgstr "" +msgstr "Версия" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:489 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:509 msgid "Version number" -msgstr "" +msgstr "Номер версии" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:41 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:48 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:84 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:42 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:54 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:279 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:87 msgid "Vertical" -msgstr "" +msgstr "Вертикально" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBarSettings/index.tsx:162 +msgid "Vertical (Left)" +msgstr "Вертикально (слева)" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:38 msgid "Video game consoles" -msgstr "" +msgstr "Игровые приставки" + +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:230 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:386 +msgid "View" +msgstr "Показать" -#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:217 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:219 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:296 +#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:200 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:198 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:270 msgid "View All »" -msgstr "" +msgstr "Смотреть все »" + +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/DatasetPanel.tsx:227 +msgid "View Dataset" +msgstr "Посмотреть датасет" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:287 -msgid "View chart in Explore" -msgstr "Посмотреть график в режиме исследования" +#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:128 +msgid "View all charts" +msgstr "Показать все графики" -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:197 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:451 +msgid "View as table" +msgstr "Показать в виде таблицы" + +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:313 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:343 msgid "View in SQL Lab" -msgstr "Открыть в лаборатории SQL" +msgstr "Открыть в Лаборатории SQL" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:166 +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:195 #, python-format msgid "View keys & indexes (%s)" -msgstr "Посмотреть ключи и индексы (%s)" +msgstr "Показать ключи и индексы (%s)" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:296 -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:298 -#: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:86 -#: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:88 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:432 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:434 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:394 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:396 msgid "View query" -msgstr "Скопировать запрос" - -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:216 -#: superset-frontend/src/explore/components/DataTablesPane/index.tsx:396 -msgid "View results" -msgstr "Посмотреть результаты" +msgstr "Показать SQL запрос" -#: superset-frontend/src/explore/components/DataTablesPane/index.tsx:409 -msgid "View samples" -msgstr "Посмотреть примеры" - -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:180 +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:172 msgid "Viewed" msgstr "Просмотрено" -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:124 -#, fuzzy, python-format +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:117 +#, python-format msgid "Viewed %s" -msgstr "Просмотрено" +msgstr "Просмотрено %s" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:268 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:273 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:293 +#: superset-frontend/src/explore/components/controls/ViewportControl.jsx:111 msgid "Viewport" -msgstr "рассылка" +msgstr "Область просмотра" + +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:563 +msgid "Virtual" +msgstr "Виртуальный" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:133 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:145 msgid "Virtual (SQL)" msgstr "Виртуальный (SQL)" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:231 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:285 msgid "Virtual dataset" msgstr "Виртуальный датасет" -#: superset/connectors/sqla/models.py:849 superset/connectors/sqla/utils.py:83 -#, fuzzy +#: superset/connectors/sqla/models.py:951 superset/connectors/sqla/utils.py:110 +#: superset/models/helpers.py:1021 msgid "Virtual dataset query cannot be empty" -msgstr "Виртуальный датасет должен быть read-only" +msgstr "Запрос виртуального датасета не может быть пустым" -#: superset/connectors/sqla/models.py:852 +#: superset/connectors/sqla/models.py:954 superset/models/helpers.py:1024 msgid "Virtual dataset query cannot consist of multiple statements" -msgstr "Виртуальный датасет не может содержать несколько выражений" +msgstr "Запрос виртуального датасета не может содержать несколько запросов" -#: superset/connectors/sqla/models.py:825 +#: superset/connectors/sqla/models.py:919 superset/models/helpers.py:1047 msgid "Virtual dataset query must be read-only" -msgstr "Виртуальный датасет должен быть read-only" +msgstr "Запрос виртуального датасета должен быть доступен только для чтения" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:192 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:204 msgid "Visual Tweaks" -msgstr "" +msgstr "Визуальные настройки" -#: superset-frontend/src/dashboard/components/AddSliceCard.jsx:132 -msgid "Visualization" -msgstr "Визуализация" - -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:168 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:122 #: superset/views/chart/mixin.py:88 msgid "Visualization Type" msgstr "Тип визуализации" -#: superset-frontend/src/explore/controls.jsx:200 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:270 +#: superset-frontend/src/pages/ChartList/index.tsx:369 msgid "Visualization type" msgstr "Тип визуализации" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:50 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:52 msgid "" "Visualize a parallel set of metrics across multiple groups. Each group is" " visualized using its own line of points and each metric is represented " @@ -14259,53 +17259,85 @@ msgid "" "to emphasize the strength of the link between each pair of groups." msgstr "" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:27 +msgid "" +"Visualize geospatial data like 3D buildings, landscapes, or objects in " +"grid view." +msgstr "" +"Визуализирует геопространственные данные, такие как 3D-здания, ландшафты " +"или объекты в виде сетки." + #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:31 msgid "" "Visualize how a metric changes over time using bars. Add a group by " "column to visualize group level metrics and how they change over time." msgstr "" +"Визуализирует изменение меры с течением времени, используя столбцы. " +"Добавьте столбец для группировки, чтобы визуализировать показатели уровня" +" группы и то, как они меняются с течением времени." #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:35 msgid "" "Visualize multiple levels of hierarchy using a familiar tree-like " "structure." -msgstr "" +msgstr "Визуализирует несколько уровней иерархии, используя древовидную структуру." -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:58 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:61 msgid "" -"Visualize two different time series using the same x-axis time range. " -"Note that each time series can be visualized differently (e.g. 1 using " -"bars and 1 using a line)." +"Visualize two different series using the same x-axis. Note that both " +"series can be visualized with a different chart type (e.g. 1 using bars " +"and 1 using a line)." msgstr "" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:27 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:28 msgid "" "Visualize two different time series using the same x-axis time range. " "This chart is being deprecated and we recommend using the Mixed " "Timeseries Chart instead!" msgstr "" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:27 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:64 +msgid "" +"Visualize two different time series using the same x-axis. Note that each" +" time series can be visualized differently (e.g. 1 using bars and 1 using" +" a line)." +msgstr "" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:28 msgid "" "Visualizes 2 metrics as line plots using the same x-axis. This chart is " "useful for comparing metrics across the same time range." msgstr "" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:27 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:28 msgid "" "Visualizes a metric across three dimensions of data in a single chart (X " "axis, Y axis, and bubble size). Bubbles from the same group can be " "showcased using bubble color." msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:27 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/index.js:27 +msgid "Visualizes connected points, which form a path, on a map." +msgstr "Визуализирует связанные точки, которые образуют путь, на карте." + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:27 +msgid "" +"Visualizes geographic areas from your data as polygons on a Mapbox " +"rendered map. Polygons can be colored using a metric." +msgstr "" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:28 msgid "" "Visualizes how a metric has changed over a time using a color scale and a" " calendar view. Gray values are used to indicate missing values and the " "linear color scheme is used to encode the magnitude of each day's value." msgstr "" +"Визуализирует, как показатель изменился с течением времени, используя " +"цветовую шкалу и календарь. Значения серого цвета используются для " +"обозначения отсутствующих значений, а линейная цветовая схема " +"используется для отображения величины значения каждого дня." -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:27 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:29 msgid "" "Visualizes how a single metric varies across a country's principal " "subdivisions (states, provinces, etc) on a chloropleth map. Each " @@ -14313,7 +17345,7 @@ msgid "" "geographic boundary." msgstr "" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:27 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:28 msgid "" "Visualizes many different time-series objects in a single chart. This " "chart is being deprecated and we recommend using the Time-series Chart " @@ -14333,37 +17365,38 @@ msgid "" "Visualizes the words in a column that appear the most often. Bigger font " "corresponds to higher frequency." msgstr "" +"Визуализирует слова в столбце, которые появляются чаще всего. Более " +"крупный шрифт соответствует более высокой частоте" -#: superset/viz.py:133 +#: superset/viz.py:141 msgid "Viz is missing a datasource" msgstr "У визуализации отсутствует источник данных" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:495 +#: superset-frontend/src/dashboard/components/AddSliceCard/AddSliceCard.tsx:265 msgid "Viz type" -msgstr "Тип" +msgstr "Тип визуализации" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:84 msgid "WED" msgstr "СР" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:697 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:898 msgid "Want to add a new database?" -msgstr "" +msgstr "Хотите добавить новую базу данных?" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1090 -#, fuzzy +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1240 msgid "Warning" -msgstr "Предупреждение!" +msgstr "Предупреждение" -#: superset/connectors/druid/views.py:193 superset/connectors/sqla/views.py:263 +#: superset/connectors/sqla/views.py:259 msgid "Warning Message" -msgstr "Предупреждающее сообщение" +msgstr "Предупреждение" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:285 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:286 msgid "Warning!" msgstr "Предупреждение!" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:46 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:47 msgid "" "Warning! Changing the dataset may break the chart if the metadata does " "not exist." @@ -14371,85 +17404,129 @@ msgstr "" "Внимание! Изменение датасета может привести к тому, что график станет " "нерабочим, если будут отсутствовать метаданные." -#: superset/db_engine_specs/bigquery.py:166 +#: superset/databases/commands/exceptions.py:157 +#: superset/databases/commands/exceptions.py:167 +msgid "Was unable to check your query" +msgstr "Не удалось проверить запрос" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1295 +msgid "" +"We are unable to connect to your database. Click \"See more\" for " +"database-provided information that may help troubleshoot the issue." +msgstr "" +"Не удалось подключиться к базе данных. Нажмите \"Подробнее\" для " +"информации, предоставленной базой данных в ответ, для решения проблемы." + +#: superset/db_engine_specs/bigquery.py:178 #, python-format msgid "We can't seem to resolve column \"%(column)s\" at line %(location)s." -msgstr "" +msgstr "Не удалось обнаружить столбец \"%(column)s\" в строке %(location)s." -#: superset/db_engine_specs/sqlite.py:63 +#: superset/db_engine_specs/duckdb.py:56 superset/db_engine_specs/sqlite.py:65 #, python-format msgid "We can't seem to resolve the column \"%(column_name)s\"" -msgstr "" +msgstr "Не удалось обнаружить столбец \"%(column_name)s\"" -#: superset/db_engine_specs/postgres.py:150 -#: superset/db_engine_specs/presto.py:171 +#: superset/db_engine_specs/postgres.py:132 +#: superset/db_engine_specs/presto.py:603 #, python-format msgid "" "We can't seem to resolve the column \"%(column_name)s\" at line " "%(location)s." -msgstr "" +msgstr "Не удалось обнаружить столбец \"%(column_name)s\" в строке %(location)s." -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:118 -msgid "We recommend your summarize your data further before following that flow. " -msgstr "" +#: superset-frontend/src/visualizations/dashboardComponents/ExampleComponent/ExampleComponent.tsx:29 +#, python-format +msgid "We have the following keys: %s" +msgstr "У нас есть следующие ключи: %s" -#: superset-frontend/src/reports/actions/reports.js:156 +#: superset-frontend/src/reports/actions/reports.js:136 msgid "We were unable to active or deactivate this report." -msgstr "" +msgstr "Не удалось включить или выключить эту рассылку." -#: superset/db_engine_specs/redshift.py:86 +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:681 +msgid "" +"We were unable to carry over any controls when switching to this new " +"dataset." +msgstr "Не удалось перенести настройки прошлого графика при переключении датасета." + +#: superset/db_engine_specs/redshift.py:90 #, python-format msgid "" "We were unable to connect to your database named \"%(database)s\". Please" " verify your database name and try again." msgstr "" +"Не удалось подключиться к вашей базе данных с именем \"%(database)s\". " +"Пожалуйста, подтвердите имя вашей базы данных и попробуйте снова." -#: superset/db_engine_specs/bigquery.py:149 -msgid "" -"We were unable to connect to your database. Please confirm that your " -"service account has the Viewer and Job User roles on the project." -msgstr "" - -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:60 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/index.js:31 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:63 msgid "Web" -msgstr "" +msgstr "Сеть" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:59 msgid "Wednesday" msgstr "Среда" -#: superset/db_engine_specs/base.py:97 -#, fuzzy +#: superset/db_engine_specs/base.py:111 msgid "Week" -msgstr "неделя" +msgstr "Неделя" -#: superset/db_engine_specs/base.py:103 +#: superset/db_engine_specs/base.py:117 msgid "Week ending Saturday" -msgstr "" +msgstr "Неделя, заканчивающаяся в субботу" -#: superset/db_engine_specs/base.py:102 +#: superset/db_engine_specs/base.py:116 msgid "Week starting Monday" -msgstr "" +msgstr "Неделя, начинающаяся в понедельник" -#: superset/db_engine_specs/base.py:101 +#: superset/db_engine_specs/base.py:115 msgid "Week starting Sunday" -msgstr "" +msgstr "Неделя, начинающаяся в воскресенье" -#: superset/db_engine_specs/base.py:104 +#: superset/db_engine_specs/base.py:118 msgid "Week_ending Sunday" -msgstr "" +msgstr "Неделя, заканчивающаяся в воскресенье" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:67 -#, fuzzy, python-format +#: superset-frontend/src/components/ReportModal/index.tsx:120 +msgid "Weekly Report" +msgstr "Еженедельный отчет" + +#: superset-frontend/src/components/ReportModal/index.tsx:119 +#, python-format +msgid "Weekly Report for %s" +msgstr "Еженедельный отчет для %s" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:104 +msgid "Weekly seasonality" +msgstr "Недельная сезонность" + +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:66 +#, python-format msgid "Weeks %s" -msgstr "неделя" +msgstr "Недель %s" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/Screengrid.jsx:49 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts:77 +msgid "Weight" +msgstr "Вес" #: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:52 #, python-format msgid "" "We’re having trouble loading these results. Queries are set to timeout " "after %s second." -msgstr "" +msgid_plural "" +"We’re having trouble loading these results. Queries are set to timeout " +"after %s seconds." +msgstr[0] "" +"Возникла проблема при загрузке результатов. Для запросов установлен " +"тайм-аут %s секунда." +msgstr[1] "" +"Возникла проблема при загрузке результатов. Для запросов установлен " +"тайм-аут %s секунды." +msgstr[2] "" "Возникла проблема при загрузке результатов. Для запросов установлен " "тайм-аут %s секунд." @@ -14458,48 +17535,75 @@ msgstr "" msgid "" "We’re having trouble loading this visualization. Queries are set to " "timeout after %s second." -msgstr "" +msgid_plural "" +"We’re having trouble loading this visualization. Queries are set to " +"timeout after %s seconds." +msgstr[0] "" +"Возникла проблема при загрузке этой визуализации. Для запросов установлен" +" тайм-аут %s секунда." +msgstr[1] "" +"Возникла проблема при загрузке этой визуализации. Для запросов установлен" +" тайм-аут %s секунды." +msgstr[2] "" "Возникла проблема при загрузке этой визуализации. Для запросов установлен" " тайм-аут %s секунд." #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:58 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:102 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:110 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:113 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:103 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:101 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:109 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:112 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:119 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:102 msgid "What should be shown on the label?" -msgstr "" +msgstr "Текст, отображаемый на метке" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:437 -#: superset-frontend/src/explore/controls.jsx:454 +#: superset/views/database/forms.py:165 +msgid "What should happen if the table already exists" +msgstr "Что должно произойти, если таблица уже существует" + +#: superset-frontend/src/explore/controls.jsx:434 msgid "" "When `Calculation type` is set to \"Percentage change\", the Y Axis " "Format is forced to `.1%`" msgstr "" -"Когда `Тип расчёта` установлен в “Изменение процента”, формат оси Y " +"Когда `Тип расчёта` установлен в \"Процентное изменение\", формат оси Y " "устанавливается в `.1%`" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:76 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:86 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:183 msgid "When a secondary metric is provided, a linear color scale is used." msgstr "" +"Когда предоставляется вторичная мера, используется линейная цветовая " +"схема." -#: superset/views/database/mixins.py:120 +#: superset/views/database/mixins.py:119 msgid "" "When allowing CREATE TABLE AS option in SQL Lab, this option forces the " "table to be created in this schema" msgstr "" -"При разрешении опции CREATE TABLE AS в редакторе SQL эта опция создаст " -"таблицу в выбранной схеме" +"При включении опции CREATE TABLE AS в Лаборатории SQL, новые таблицы " +"будут добавлены в эту схему" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:100 +msgid "When checked, the map will zoom to your data after each query" +msgstr "" +"Если отмечено, карта будет смасштабирована к вашим данным после каждого " +"запроса" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:195 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:189 msgid "When enabled, users are able to visualize SQL Lab results in Explore." msgstr "" +"Если этот параметр включен, пользователи могут смотреть ответ запросов " +"Лаборатории SQL в режиме исследования." -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:71 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:76 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:173 msgid "When only a primary metric is provided, a categorical color scale is used." msgstr "" +"Когда предоставляется только основная мера, используется категориальная " +"цветовая схема." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:898 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1083 msgid "" "When specifying SQL, the datasource acts as a view. Superset will use " "this statement as a subquery while grouping and filtering on the " @@ -14509,7 +17613,7 @@ msgstr "" "будет использовать это выражение в подзапросе, при необходимости " "группировки и фильтрации." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:716 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:882 msgid "" "When using \"Autocomplete filters\", this can be used to improve " "performance of the query fetching the values. Use this option to apply a " @@ -14517,483 +17621,552 @@ msgid "" "the table. Typically the intent would be to limit the scan by applying a " "relative time filter on a partitioned or indexed time-related field." msgstr "" +"При использовании \"Фильтров автозаполнения\" это может использоваться " +"для улучшения быстродействия запроса. Используйте эту опцию для настройки" +" предиката (оператор WHERE) запроса для уникальных значений из таблицы. " +"Обычно целью является ограничение сканирования путем применения " +"относительного временного фильтра к секционированному или " +"индексированному полю типа дата/время." -#: superset/viz.py:834 +#: superset/viz.py:858 msgid "When using 'Group By' you are limited to use a single metric" -msgstr "" -"При использовании поля [Группировка] вы не ограничены использованием " -"одного среза" +msgstr "При использовании 'GROUP BY' вы ограничены использованием одной меры" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:258 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:110 +msgid "When using this option, default value can’t be set" +msgstr "При включении этой опции нельзя установить значение по умолчанию" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:254 msgid "Whether the progress bar overlaps when there are multiple groups of data" -msgstr "" +msgstr "Индикатор прогресса накладывается при наличии нескольких групп данных" -#: superset/connectors/sqla/views.py:466 +#: superset/connectors/sqla/views.py:456 msgid "Whether the table was generated by the 'Visualize' flow in SQL Lab" msgstr "" -#: superset/connectors/druid/views.py:98 superset/connectors/sqla/views.py:99 +#: superset/connectors/sqla/views.py:112 msgid "" "Whether this column is exposed in the `Filters` section of the explore " "view." msgstr "" -"Необходимо отметить, если столбец должен быть доступен в разделе " -"«Фильтры»." -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:430 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:441 msgid "" "Whether to align background charts with both positive and negative values" " at 0" msgstr "" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:128 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:117 msgid "Whether to align positive and negative values in cell bar chart at 0" -msgstr "" +msgstr "Выравнивание гистограммы внутри ячеек по горизонтали слева" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:739 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:789 msgid "Whether to always show the annotation label" -msgstr "" +msgstr "Всегда показывать метку аннотации" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:192 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:188 msgid "Whether to animate the progress and the value or just display them" -msgstr "" +msgstr "Анимировать прогресс и значение или просто отображать их" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:317 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:331 msgid "Whether to apply a normal distribution based on rank on the color scale" -msgstr "" +msgstr "Применять нормальное распределение на основе ранга в цветовой схеме" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:138 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:442 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:166 +msgid "Whether to apply filter when items are clicked" +msgstr "Применять фильтр при щелчке по элементам" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:127 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:453 msgid "Whether to colorize numeric values by if they are positive or negative" -msgstr "" +msgstr "Окрашивать ячейки с числами в зависимости от их знака" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:120 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:416 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:109 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:427 msgid "Whether to display a bar chart background in table columns" -msgstr "" +msgstr "Отображать гистограмм в колонках таблицы" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:38 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:40 msgid "Whether to display a legend for the chart" -msgstr "" +msgstr "Отображать легенду для графика" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:83 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:85 msgid "Whether to display bubbles on top of countries" -msgstr "" +msgstr "Отображать пузыри поверх стран" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:60 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:194 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:102 +msgid "Whether to display the aggregate count" +msgstr "Отображать совокупное количество" + +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:50 msgid "Whether to display the interactive data table" -msgstr "" +msgstr "Отображать интерактивную таблицу с данными" -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:130 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:129 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:152 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:97 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:74 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:96 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:75 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:73 msgid "Whether to display the labels." -msgstr "" +msgstr "Отображать метки" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:99 msgid "" "Whether to display the labels. Note that the label only displays when the" " the 5% threshold." msgstr "" +"Отображать метки. Обратите внимание, что метка отображается только при " +"достижении порогового значения 5%." #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:157 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:278 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:132 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:152 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:292 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:118 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:159 msgid "Whether to display the legend (toggles)" -msgstr "" +msgstr "Отображать легенду (переключатель)" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:181 msgid "Whether to display the metric name as a title" -msgstr "" +msgstr "Отображать имя меры как названия" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:273 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:293 msgid "Whether to display the min and max values of the X-axis" -msgstr "" +msgstr "Отображать минимальное и максимальное значение на оси X" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:94 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:105 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:101 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:112 msgid "Whether to display the min and max values of the Y-axis" -msgstr "" +msgstr "Отображать минимальное и максимальное значение на оси Y" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:167 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:304 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:185 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:318 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:187 msgid "Whether to display the numerical values within the cells" -msgstr "" +msgstr "Отображение числовых значений в ячейках" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:141 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:261 +msgid "Whether to display the stroke" +msgstr "Отображение обводки" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:148 msgid "Whether to display the time range interactive selector" -msgstr "Предупреждение для отображения на селекторе показателей" +msgstr "Отображение интерактивного селектора временного интервала" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:88 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:80 msgid "Whether to display the timestamp" -msgstr "" +msgstr "Отображение временную метку" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:100 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:92 msgid "Whether to display the trend line" -msgstr "" +msgstr "Отображение трендовой линии" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:170 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:279 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:171 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:280 msgid "Whether to enable changing graph position and scaling." msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:144 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:145 msgid "Whether to enable node dragging in force layout mode." -msgstr "" +msgstr "Включить перемещение вершин в режиме силового алгоритма." -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:63 -#, fuzzy -msgid "Whether to format the timestamp" -msgstr "Показатель, по которому сортировать результаты" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:250 +msgid "Whether to fill the objects" +msgstr "Использовать заливку для объектов" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:406 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:89 +msgid "Whether to ignore locations that are null" +msgstr "Игнорировать местоположения, которые не содержат данных о расположении" + +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:417 msgid "Whether to include a client-side search box" -msgstr "Включить фильтр на определенный интервал/диапазон времени" +msgstr "Отображение строки поиска" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:81 +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:51 msgid "Whether to include a time filter" msgstr "Включить фильтр на определенный интервал/диапазон времени" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:289 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:303 msgid "Whether to include the percentage in the tooltip" -msgstr "Включить фильтр на определенный интервал/диапазон времени" +msgstr "Отображение процентной доли во всплывающей подсказке" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:326 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/includeTime.ts:28 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:336 msgid "Whether to include the time granularity as defined in the time section" msgstr "" +"Добавляет столбец даты/времени с группировкой дат, как определено в " +"разделе Время" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:155 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:273 +msgid "Whether to make the grid 3D" +msgstr "Сделать сетку 3D" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:141 msgid "Whether to make the histogram cumulative" -msgstr "" +msgstr "Сделать гистограмму нарастающей" -#: superset/connectors/sqla/views.py:94 +#: superset/connectors/sqla/views.py:107 msgid "" "Whether to make this column available as a [Time Granularity] option, " "column has to be DATETIME or DATETIME-like" msgstr "" -"Сделать этот столбец доступным в разделе [Время]. Столбец должен быть в " -"формате DATETIME" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:143 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:129 msgid "Whether to normalize the histogram" -msgstr "" +msgstr "Нормализовать гистограмму" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:709 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:875 msgid "Whether to populate autocomplete filters options" -msgstr "Включить фильтр на определенный интервал/диапазон времени" +msgstr "Распространить настройки фильтров автозаполнения" -#: superset/connectors/druid/views.py:325 superset/connectors/sqla/views.py:461 +#: superset/connectors/sqla/views.py:451 msgid "" "Whether to populate the filter's dropdown in the explore view's filter " "section with a list of distinct values fetched from the backend on the " "fly" -msgstr "Получение списка фильтруемых значений, выполняя онлайн-запрос к серверу" +msgstr "" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:163 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:170 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:125 msgid "" "Whether to show extra controls or not. Extra controls include things like" " making mulitBar charts stacked or side by side." msgstr "" +"Отображает дополнительные элементы управления на самом графике и " +"позволяет менять отображение столбцов: без накопления и с ним." -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:207 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:203 msgid "Whether to show minor ticks on the axis" -msgstr "" +msgstr "Отображение мелких отметок на оси" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:180 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:176 msgid "Whether to show the pointer" -msgstr "" +msgstr "Отображение указателя" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:246 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:242 msgid "Whether to show the progress of gauge chart" msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:219 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:215 msgid "Whether to show the split lines on the axis" -msgstr "" +msgstr "Отображение линий разделения на оси" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:44 -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:47 -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:42 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:50 -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:49 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:48 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:46 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:61 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:356 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:107 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:91 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:88 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:68 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:85 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:91 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:92 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:339 -#: superset-frontend/src/explore/controlPanels/sections.tsx:127 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:258 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:100 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/orderBy.tsx:48 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:160 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:350 msgid "Whether to sort descending or ascending" msgstr "Сортировка по убыванию или по возрастанию" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/legacySortBy.tsx:31 -#, fuzzy -msgid "" -"Whether to sort descending or ascending. Takes effect only when \"Sort " -"by\" is set" -msgstr "Сортировка по убыванию или по возрастанию" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:75 +msgid "Whether to sort descending or ascending if a series limit is present" +msgstr "" +"Сортировка по убыванию или по возрастанию, если есть ограничение на " +"количество категорий" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:40 -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:39 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:95 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:56 -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:40 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:64 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:63 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx:63 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx:119 +msgid "Whether to sort descending or ascending on the X-Axis." +msgstr "Сортировка по убыванию или по возрастанию для оси X" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:44 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:96 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:60 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:45 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:65 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:63 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:64 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:62 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:52 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:50 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:39 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:43 msgid "Whether to sort results by the selected metric in descending order." -msgstr "" +msgstr "Сортировка результатов по выбранной мере в порядке убывания" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:175 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:201 msgid "Whether to sort tooltip by the selected metric in descending order." +msgstr "Сортировка выбранных мер по убыванию во всплывающей подсказке" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:352 +msgid "Whether to truncate metrics" msgstr "" +"Убирает меру (например, AVG(...)) с легенды рядом с именем измерения и из" +" таблицы результатов" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:43 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:44 msgid "Which country to plot the map for?" -msgstr "" +msgstr "Выбор страны для графика" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:197 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:198 msgid "Which relatives to highlight on hover" -msgstr "" +msgstr "Подсвечивается при наведении" -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:51 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:45 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:88 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:41 msgid "Whisker/outlier options" -msgstr "" +msgstr "Настройки усов/выбросов" #: superset-frontend/src/dashboard/util/backgroundStyleOptions.ts:30 -#, fuzzy msgid "White" -msgstr "Заголовок" +msgstr "Белый" -#: superset-frontend/src/explore/components/EmbedCodeButton.jsx:130 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:228 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:234 msgid "Width" msgstr "Ширина" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:73 -#, fuzzy msgid "Width of the confidence interval. Should be between 0 and 1" -msgstr "Доверительный интервал должен быть между 0 и 1 (исключая)" +msgstr "Ширина доверительного интервала. Должна быть между 0 и 1" -#: superset/utils/pandas_postprocessing.py:393 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:229 +msgid "Width of the sparkline" +msgstr "Ширина спарклайна" + +#: superset/utils/pandas_postprocessing/rolling.py:69 msgid "Window must be > 0" -msgstr "" +msgstr "Окно должно быть > 0" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:36 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:35 msgid "With a subheader" -msgstr "" +msgstr "С подзаголовком" #: superset-frontend/plugins/plugin-chart-word-cloud/src/legacyPlugin/index.ts:29 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:39 msgid "Word Cloud" -msgstr "" +msgstr "Облако слов" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:80 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:84 msgid "Word Rotation" -msgstr "Добавить слой аннотации" +msgstr "Поворот текста" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:55 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:64 msgid "Working" -msgstr "" +msgstr "Обрабатывается" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1258 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:412 msgid "Working timeout" -msgstr "" +msgstr "Время на рассылку" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:33 -#: superset/viz.py:2042 +#: superset/viz.py:2076 msgid "World Map" msgstr "Карта Мира" -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:166 +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:186 msgid "Write a description for your query" msgstr "Заполните описание к вашему запросу" -#: superset/views/database/forms.py:221 superset/views/database/forms.py:354 -#: superset/views/database/forms.py:442 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/index.ts:40 +msgid "Write a handlebars template to render the data" +msgstr "" + +#: superset/views/database/forms.py:219 +msgid "Write dataframe index as a column" +msgstr "Сделать индекс датафрейма столбцом." + +#: superset/views/database/forms.py:380 superset/views/database/forms.py:471 msgid "Write dataframe index as a column." -msgstr "Записывайте индекс данных в виде столбца." +msgstr "Сделать индекс датафрейма столбцом." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:51 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:56 msgid "X AXIS TITLE BOTTOM MARGIN" -msgstr "" +msgstr "Отступ снизу названия оси X" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:31 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:147 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:406 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:36 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:213 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:74 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:69 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:63 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:83 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:107 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:69 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:100 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:84 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts:49 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:98 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:73 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:77 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:90 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:298 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:189 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:150 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:130 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:147 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:205 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:208 -#: superset-frontend/src/explore/controls.jsx:421 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:91 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:314 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:178 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:293 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:318 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:165 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:107 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:107 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:162 +#: superset-frontend/src/explore/controls.jsx:401 msgid "X Axis" msgstr "Ось X" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:215 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:235 msgid "X Axis Format" -msgstr "Формат Оси Y" +msgstr "Формат оси X" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:107 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:175 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:93 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:182 msgid "X Axis Label" -msgstr "" +msgstr "Метка оси X" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:37 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:42 msgid "X Axis Title" -msgstr "" +msgstr "Название оси X" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:104 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:105 msgid "X Log Scale" -msgstr "" +msgstr "Логарифмическая ось X" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:201 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:78 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:62 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:216 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:115 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:58 msgid "X Tick Layout" -msgstr "" +msgstr "Расположение делений оси X" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:270 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:290 msgid "X bounds" +msgstr "Показывать границы оси X" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx:117 +msgid "X-Axis Sort Ascending" +msgstr "Сортировать по возрастанию оси X" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/customControls.tsx:62 +msgid "X-Axis Sort By" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:114 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/mixins.tsx:35 +msgid "X-axis" +msgstr "Ось X" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:115 msgid "XScale Interval" -msgstr "Интервал обновления" +msgstr "" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:102 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:109 msgid "Y 2 bounds" -msgstr "" +msgstr "Границы оси Y 2" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:79 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:84 msgid "Y AXIS TITLE MARGIN" -msgstr "" +msgstr "Отступ названия оси Y" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:94 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:99 msgid "Y AXIS TITLE POSITION" -msgstr "" +msgstr "Положение названия оси Y" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:59 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:153 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:413 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:64 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:220 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:83 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:79 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:75 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:115 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts:54 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:80 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:109 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:241 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:322 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:224 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:186 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:167 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:183 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:240 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:243 -#: superset-frontend/src/explore/controls.jsx:428 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:112 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:116 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts:58 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:84 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:110 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:243 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:338 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:213 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:295 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:321 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:200 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:144 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:143 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:197 +#: superset-frontend/src/explore/controls.jsx:408 msgid "Y Axis" msgstr "Ось Y" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:40 msgid "Y Axis 1" -msgstr "" +msgstr "Ось Y 1" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:50 msgid "Y Axis 2" -msgstr "" +msgstr "Ось Y 2" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:254 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:274 msgid "Y Axis 2 Bounds" -msgstr "" +msgstr "Границы оси Y 2" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:238 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:354 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:269 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:232 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:212 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:229 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:285 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:288 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:258 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:370 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:258 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/controlPanel.tsx:245 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:189 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/controlPanel.tsx:189 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:242 msgid "Y Axis Bounds" -msgstr "" +msgstr "Границы оси Y" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:428 -#: superset-frontend/src/explore/controls.jsx:442 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:301 +#: superset-frontend/src/explore/controls.jsx:422 msgid "Y Axis Format" msgstr "Формат Оси Y" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:118 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:333 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:104 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:353 msgid "Y Axis Label" -msgstr "" +msgstr "Метка оси Y" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:88 msgid "Y Axis Left" -msgstr "" +msgstr "Ось Y слева" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:123 msgid "Y Axis Right" -msgstr "" +msgstr "Ось Y справа" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:65 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:70 msgid "Y Axis Title" -msgstr "" +msgstr "Название оси Y" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:227 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:247 msgid "Y Log Scale" -msgstr "" +msgstr "Логарифмическая ось Y" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:91 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:98 msgid "Y bounds" -msgstr "" +msgstr "Показывать границы оси Y" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/mixins.tsx:34 +msgid "Y-axis" +msgstr "Ось Y" + +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:296 +msgid "Y-axis bounds" +msgstr "Границы оси Y" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:130 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:131 #, fuzzy msgid "YScale Interval" msgstr "Интервал обновления" -#: superset/db_engine_specs/base.py:100 -#, fuzzy +#: superset/db_engine_specs/base.py:114 msgid "Year" -msgstr "год" +msgstr "Год" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:70 -#, fuzzy, python-format +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:59 +msgid "Year (freq=AS)" +msgstr "Год (част=AS)" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:85 +msgid "Yearly seasonality" +msgstr "Годовая сезонность" + +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:69 +#, python-format msgid "Years %s" -msgstr "год" +msgstr "Лет %s" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:443 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:537 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:440 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:511 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:88 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:107 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:126 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:144 +#: superset-frontend/src/pages/ChartList/index.tsx:568 +#: superset-frontend/src/pages/ChartList/index.tsx:677 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:461 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:543 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:464 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:484 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:576 msgid "Yes" msgstr "Да" @@ -15001,7 +18174,12 @@ msgstr "Да" msgid "Yes, cancel" msgstr "Да, отменить" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:72 +#: superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.tsx:154 +#: superset-frontend/src/dashboard/components/OverwriteConfirm/OverwriteConfirmModal.tsx:199 +msgid "Yes, overwrite changes" +msgstr "Да, перезаписать изменения" + +#: superset-frontend/src/pages/ChartList/index.tsx:96 msgid "" "You are importing one or more charts that already exist. Overwriting " "might cause you to lose some of your work. Are you sure you want to " @@ -15021,12 +18199,15 @@ msgstr "" "Перезапись может привести к потере части вашей работы. Вы уверены, что " "хотите перезаписать?" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:45 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1221 msgid "" "You are importing one or more databases that already exist. Overwriting " "might cause you to lose some of your work. Are you sure you want to " "overwrite?" msgstr "" +"Вы импортируете одну или несколько баз данных, которые уже существуют. " +"Перезапись может привести к потере части вашей работы. Вы уверены, что " +"хотите перезаписать?" #: superset-frontend/src/views/CRUD/data/dataset/constants.ts:30 msgid "" @@ -15038,425 +18219,608 @@ msgstr "" "Перезапись может привести к потере части вашей работы. Вы уверены, что " "хотите продолжить?" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:63 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:64 msgid "" "You are importing one or more saved queries that already exist. " "Overwriting might cause you to lose some of your work. Are you sure you " "want to overwrite?" msgstr "" -"Вы импортируете один или несколько графиков, которые уже существуют. " -"Перезапись может привести к потере части вашей работы. Вы уверены, что " -"хотите перезаписать?" - -#: superset/views/core.py:2175 -msgid "" -"You are not authorized to fetch samples from this table. If you think " -"this is an error, please reach out to your administrator." -msgstr "" +"Вы импортируете один или несколько сохраненных запросов, которые уже " +"существуют. Перезапись может привести к потере части вашей работы. Вы " +"уверены, что хотите продолжить?" -#: superset/views/core.py:2295 +#: superset/views/core.py:2152 msgid "" "You are not authorized to see this query. If you think this is an error, " "please reach out to your administrator." msgstr "" +"Вы не авторизованы для просмотра этого запроса. Если вы считаете, что это" +" ошибка, пожалуйста, обратитесь к своему администратору" -#: superset/views/database/views.py:463 -#, fuzzy -msgid "" -"You cannot specify a namespace both in the name of the table: " -"\"%(columnar_table.table)s\" and in the schema field: " -"\"%(columnar_table.schema)s\". Please remove one" -msgstr "" -"Нельзя указывать область имён одновременно и в имени таблицы: " -"“%(csv_table.table)s” и в поле схемы: “%(csv_table.schema)s”. Пожалуйста," -" удалите в одном из мест" +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:192 +msgid "You can" +msgstr "Вы можете" + +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:204 +msgid "You can add the components in the" +msgstr "Вы можете добавить компоненты в" + +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:240 +msgid "You can add the components in the edit mode." +msgstr "Вы можете добавить компоненты в режиме редактирования." -#: superset/views/database/views.py:146 +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:195 +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:218 msgid "" -"You cannot specify a namespace both in the name of the table: " -"\"%(csv_table.table)s\" and in the schema field: " -"\"%(csv_table.schema)s\". Please remove one" +"You can create a new chart or use existing ones from the panel on the " +"right" msgstr "" -"Нельзя указывать область имён одновременно и в имени таблицы: " -"“%(csv_table.table)s” и в поле схемы: “%(csv_table.schema)s”. Пожалуйста," -" удалите в одном из мест" +"Вы можете создать новый график или использовать существующие из панели " +"справа" -#: superset/views/database/views.py:293 -msgid "" -"You cannot specify a namespace both in the name of the table: " -"\"%(excel_table.table)s\" and in the schema field: " -"\"%(excel_table.schema)s\". Please remove one" +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:183 +msgid "You can preview the list of dashboards in the chart settings dropdown." msgstr "" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Vis.js:366 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Vis.js:367 msgid "You cannot use 45° tick layout along with the time range filter" msgstr "" +"Вы не можете использовать расположение делений под углом 45° при " +"использовании временного фильтра" -#: superset/viz.py:696 +#: superset/viz.py:720 msgid "" "You cannot use [Columns] in combination with [Group " "By]/[Metrics]/[Percentage Metrics]. Please choose one or the other." msgstr "" -"Нельзя использовать [Столбцы] одновременно с [Группировка " -"по][Показатели][Процентные показатели]. Пожалуйста, выберите что-то одно." +"Вы не можете использовать [Столбцы] в сочетании с [Группировать " +"по]/[Мерами]/[Процентными мерами]. Пожалуйста, выберите одно или другое." + +#: superset-frontend/src/utils/getClientErrorObject.ts:107 +#, fuzzy, python-format +msgid "You do not have permission to edit this %s" +msgstr "У вас нет прав на редактирование этого графика" -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:66 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:69 msgid "You do not have permission to edit this chart" msgstr "У вас нет прав на редактирование этого графика" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:77 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:118 +#: superset-frontend/src/dashboard/actions/dashboardState.js:366 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:115 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:117 #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx:48 msgid "You do not have permission to edit this dashboard" -msgstr "У вас нет доступа к этому источнику данных" +msgstr "У вас нет прав на редактирование этого дашборда" #: superset/templates/superset/request_access.html:25 #, python-format msgid "You do not have permissions to access the datasource(s): %(name)s." -msgstr "У вас нет разрешений на доступ к источнику(ам) данных: %(name)s." +msgstr "У вас нет доступа этого источника данных: %(name)s." -#: superset-frontend/src/dashboard/actions/dashboardState.js:133 +#: superset-frontend/src/dashboard/actions/dashboardState.js:154 msgid "You do not have permissions to edit this dashboard." -msgstr "У вас нет прав на редактирование этого дашборда: %(name)s." +msgstr "У вас нет прав на редактирование этого дашборда." + +#: superset/charts/commands/exceptions.py:131 +msgid "You don't have access to this chart." +msgstr "Недостаточно прав для доступа к этому графику." #: superset/dashboards/commands/exceptions.py:86 -#, fuzzy msgid "You don't have access to this dashboard." -msgstr "У вас нет прав на редактирование этого дашборда: %(name)s." +msgstr "Недостаточно прав для доступа к этому дашборду." + +#: superset/datasets/commands/exceptions.py:189 +msgid "You don't have access to this dataset." +msgstr "Недостаточно прав для доступа к этому датасету." -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:144 +#: superset/embedded_dashboard/commands/exceptions.py:34 +msgid "You don't have access to this embedded dashboard config." +msgstr "У вас нет прав на редактирование этого встраиваемого дашборда." + +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:160 msgid "You don't have any favorites yet!" -msgstr "У вас пока нет избранного!" +msgstr "У вас пока нет избранных!" -#: superset/key_value/commands/exceptions.py:45 -#, fuzzy +#: superset/key_value/exceptions.py:54 +#: superset/temporary_cache/commands/exceptions.py:45 msgid "You don't have permission to modify the value." -msgstr "У вас нет прав на редактирование этого графика" +msgstr "Недостаточно прав для редактирования этого значения." + +#: superset/security/manager.py:2219 +#, python-format +msgid "You don't have the rights to alter %(resource)s" +msgstr "Недостаточно прав для изменения %(resource)s" + +#: superset/views/core.py:921 +msgid "You don't have the rights to alter this chart" +msgstr "Недостаточно прав для изменения графика" -#: superset/views/core.py:618 superset/views/core.py:823 -#: superset/views/core.py:829 superset/views/core.py:999 -#: superset/views/core.py:1017 -msgid "You don't have the rights to " -msgstr "У вас нет прав на " +#: superset/views/core.py:1092 +msgid "You don't have the rights to alter this dashboard" +msgstr "Недостаточно прав для изменения дашборда" -#: superset-frontend/src/components/EditableTitle/index.tsx:199 +#: superset-frontend/src/components/EditableTitle/index.tsx:213 msgid "You don't have the rights to alter this title." -msgstr "Недостаточно прав для изменения заголовка." +msgstr "Недостаточно прав для изменения названия." + +#: superset/views/core.py:927 +msgid "You don't have the rights to create a chart" +msgstr "Недостаточно прав для создания графика" + +#: superset/views/core.py:1108 +msgid "You don't have the rights to create a dashboard" +msgstr "Недостаточно прав для создания дашборда" -#: superset/views/core.py:406 +#: superset/views/core.py:642 +msgid "You don't have the rights to download as csv" +msgstr "Недостаточно прав для скачивания в CSV" + +#: superset/views/core.py:422 msgid "You have no permission to approve this request" -msgstr "У вас нет разрешения на утверждение этого запроса" +msgstr "Недостаточно прав для одобрения этого запроса" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/RemovedFilter.tsx:39 msgid "You have removed this filter." msgstr "Вы удалили фильтр." -#: superset-frontend/src/dashboard/components/Dashboard.jsx:88 +#: superset-frontend/src/dashboard/components/Dashboard.jsx:87 msgid "You have unsaved changes." msgstr "У вас есть несохраненные изменения." -#: superset-frontend/src/dashboard/components/SaveModal.tsx:160 +#: superset-frontend/src/dashboard/actions/dashboardState.js:655 +#, python-format +msgid "" +"You have used all %(historyLength)s undo slots and will not be able to " +"fully undo subsequent actions. You may save your current state to reset " +"the history." +msgstr "" + +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:300 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:457 +msgid "" +"You must be a dataset owner in order to edit. Please reach out to a " +"dataset owner to request modifications or edit access." +msgstr "" +"Вы должны быть владельцем датасета для его редактирования. Пожалуйста, " +"обратитесь к владельцу с просьбой предоставить доступ." + +#: superset-frontend/src/dashboard/components/SaveModal.tsx:152 msgid "You must pick a name for the new dashboard" msgstr "Вы должны выбрать имя для нового дашборда" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:518 +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:503 msgid "You must run the query successfully first" msgstr "Сначала необходимо успешно выполнить запрос" -#: superset-frontend/src/dashboard/components/Header/index.jsx:382 -#, fuzzy -msgid "Your dashboard is too large. Please reduce its size before saving it." +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/style.tsx:53 +msgid "You need to configure HTML sanitization to use CSS" msgstr "" -"Дашборд слишком большой. Пожалуйста, уменьшите его размер перед " -"сохранением." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:876 -msgid "Your query could not be saved" -msgstr "Ваш запрос не может быть сохранен" +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:349 +msgid "" +"You updated the values in the control panel, but the chart was not " +"updated automatically. Run the query by clicking on the \"Update chart\" " +"button or" +msgstr "" +"Вы обновили значения в панели управления, но график не был обновлен " +"автоматически. Сделайте запрос, нажав на кнопку \"Обновить график\" или" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:166 +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:669 +msgid "" +"You've changed datasets. Any controls with data (columns, metrics) that " +"match this new dataset have been retained." +msgstr "" +"Вы изменили датасеты. Все элементы управления с данными (столбцами, " +"мерами), которые соответствуют новому датасету, были сохранены." + +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:342 +msgid "Your chart is not up to date" +msgstr "Ваш график не актуален" + +#: superset-frontend/src/components/Chart/Chart.jsx:289 +msgid "Your chart is ready to go!" +msgstr "Ваш график готов!" + +#: superset-frontend/src/dashboard/components/Header/index.jsx:409 +msgid "Your dashboard is too large. Please reduce its size before saving it." +msgstr "" +"Дашборд слишком большой. Пожалуйста, уменьшите его размер перед " +"сохранением." + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1010 +msgid "Your query could not be saved" +msgstr "Не удалось сохранить ваш запрос" + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:178 msgid "Your query could not be scheduled" -msgstr "Ваш запрос не может быть сохранен" +msgstr "Не удалось запланировать ваш запрос" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:892 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1045 msgid "Your query could not be updated" -msgstr "Ваш запрос не может быть сохранен" +msgstr "Не удалось обновить ваш запрос" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:159 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:171 msgid "" "Your query has been scheduled. To see details of your query, navigate to " "Saved queries" msgstr "" "Запрос был запланирован. Чтобы посмотреть детали запроса, перейдите в " -"Сохранённые запросы" +"Сохраненные запросы" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:872 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1025 +msgid "Your query was not properly saved" +msgstr "Ваш запрос не был сохранен должным образом" + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1028 msgid "Your query was saved" msgstr "Ваш запрос был сохранен" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:888 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1041 msgid "Your query was updated" msgstr "Ваш запрос был сохранен" -#: superset-frontend/src/reports/actions/reports.js:172 -#, fuzzy +#: superset-frontend/src/reports/actions/reports.js:152 msgid "Your report could not be deleted" -msgstr "График не может быть удалён." +msgstr "Не удается удалить рассылку" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:306 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:185 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:259 +msgid "Zero imputation" +msgstr "Нулевые значения" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:311 msgid "Zoom" -msgstr "" +msgstr "Масштабирование" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:310 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:315 msgid "Zoom level of the map" -msgstr "" - -#: superset/tasks/schedules.py:658 -#, python-format -msgid "[Alert] %(label)s" -msgstr "[Оповещение] %(label)s" +msgstr "Уровень масштабирования карты" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "[С]-" +#: superset-frontend/src/dashboard/actions/dashboardState.js:254 +msgid "[ untitled dashboard ]" +msgstr "[ безымянный дашборд ]" -#: superset/viz.py:2349 +#: superset/viz.py:2383 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" -msgstr "Столбцы [Долгота] и [Широта] должны присутствовать в поле [Группировка]" +msgstr "Столбцы [Долгота] и [Широта] должны присутствовать в [Группировать по]" -#: superset/viz.py:2299 +#: superset/viz.py:2333 msgid "[Longitude] and [Latitude] must be set" -msgstr "Столбцы [Долгота] и [Широта] должны присутствовать в поле [Группировка]" +msgstr "[Долгота] и [Широта] должны быть заданы" -#: superset/views/core.py:783 -#, fuzzy +#: superset/explore/commands/get.py:121 superset/views/core.py:868 msgid "[Missing Dataset]" -msgstr "Выберите источник данных" +msgstr "[отсутствующий датасет]" -#: superset/utils/core.py:864 +#: superset/utils/core.py:907 #, python-format msgid "[Superset] Access to the datasource %(name)s was granted" -msgstr "Доступ к базе данных предоставлен для пользователя — %(name)s" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "[До]-" +msgstr "[Суперсет] Предоставлен доступ к источнику данных %(name)s" -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 -#, fuzzy, python-format +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:87 msgid "[Untitled]" -msgstr "%s - без названия" +msgstr "[Без названия]" + +#: superset/connectors/base/models.py:252 superset/models/sql_lab.py:228 +#, fuzzy +msgid "[asc]" +msgstr "Базовая настройка" + +#: superset-frontend/src/dashboard/components/SaveModal.tsx:84 +#, fuzzy +msgid "[copy]" +msgstr "Копировать" -#: superset-frontend/src/dashboard/components/SaveModal.tsx:203 +#: superset-frontend/src/dashboard/components/SaveModal.tsx:195 msgid "[dashboard name]" -msgstr "[название]" +msgstr "[имя дашборда]" + +#: superset/connectors/base/models.py:255 superset/models/sql_lab.py:231 +msgid "[desc]" +msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:64 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:69 +#: superset-frontend/plugins/plugin-chart-echarts/src/Sunburst/controlPanel.tsx:166 msgid "" "[optional] this secondary metric is used to define the color as a ratio " "against the primary metric. When omitted, the color is categorical and " "based on labels" msgstr "" +"[необязательно] вторичная мера используется для определения цвета как " +"доли по отношению к основной мере. Если не выбрано, цвет задается " +"согласно имени категории" -#: superset/utils/pandas_postprocessing.py:519 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx:265 +msgid "[untitled]" +msgstr "[без названия]" + +#: superset/utils/pandas_postprocessing/compare.py:53 msgid "`compare_columns` must have the same length as `source_columns`." msgstr "" -#: superset/utils/pandas_postprocessing.py:523 +#: superset/utils/pandas_postprocessing/compare.py:57 msgid "`compare_type` must be `difference`, `percentage` or `ratio`" msgstr "" -#: superset/charts/schemas.py:557 +#: superset/charts/schemas.py:567 msgid "`confidence_interval` must be between 0 and 1 (exclusive)" -msgstr "`доверительный_интервал` должен быть между 0 и 1 (исключая)" +msgstr "`доверительный_интервал` должен быть между 0 и 1 (не включая концы)" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:154 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:166 msgid "" "`count` is COUNT(*) if a group by is used. Numerical columns will be " "aggregated with the aggregator. Non-numerical columns will be used to " "label points. Leave empty to get a count of points in each cluster." msgstr "" -#: superset/common/query_object.py:388 +#: superset/common/query_object.py:434 msgid "`operation` property of post processing object undefined" -msgstr "Неопределено свойство `operation` объекта пост-процессинга" +msgstr "" -#: superset/utils/pandas_postprocessing.py:765 -#, fuzzy +#: superset/utils/pandas_postprocessing/prophet.py:61 msgid "`prophet` package not installed" -msgstr "`fbprophet` пакет не установлен" +msgstr "" -#: superset/utils/pandas_postprocessing.py:722 +#: superset/utils/pandas_postprocessing/contribution.py:69 msgid "`rename_columns` must have the same length as `columns`." msgstr "" -#: superset/charts/schemas.py:1070 -#, fuzzy +#: superset/charts/schemas.py:1109 msgid "`row_limit` must be greater than or equal to 0" -msgstr "`лимит_строк` должен быть больше или равен 1" +msgstr "" -#: superset/charts/schemas.py:1077 +#: superset/charts/schemas.py:1116 msgid "`row_offset` must be greater than or equal to 0" -msgstr "`смещение_строк` должно быть больше или равно 0" +msgstr "" -#: superset/charts/schemas.py:932 +#: superset/charts/schemas.py:967 msgid "`width` must be greater or equal to 0" -msgstr "`ширина` должна быть больше, чем 0" +msgstr "" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:413 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:431 msgid "aggregate" -msgstr "агрегат" +msgstr "агрегатная функция" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:90 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:111 msgid "alert" msgstr "оповещение" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:91 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:112 msgid "alerts" -msgstr "оповещения" +msgstr "оповещений" -#: superset-frontend/src/dashboard/components/SaveModal.tsx:213 -msgid "also copy (duplicate) charts" -msgstr "" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:160 +#: superset-frontend/src/components/Chart/DrillDetail/DrillDetailMenuItems.tsx:218 +#: superset-frontend/src/explore/controls.jsx:254 +msgid "all" +msgstr "Все" -#: superset/views/core.py:823 superset/views/core.py:1000 -msgid "alter this " -msgstr "изменить этот " +#: superset-frontend/src/dashboard/components/SaveModal.tsx:205 +msgid "also copy (duplicate) charts" +msgstr "также копировать (дублировать) графики" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:194 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:195 msgid "ancestor" -msgstr "" +msgstr "предок" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:47 msgid "and" -msgstr "" - -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:111 -#, python-format -msgid "and the explore view times out at %s seconds " -msgstr "а тайм-аут интерфейса исследования %s секунд " +msgstr "и" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:64 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:78 #: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:106 msgid "annotation" msgstr "аннотация" -#: superset/views/annotations.py:40 -msgid "annotation start time or end time is required." -msgstr "время начала или окончания аннотации обязательно." - -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:102 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:104 msgid "annotation_layer" msgstr "слой_аннотации" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:373 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:255 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:527 +#: superset-frontend/src/explore/controlPanels/sections.tsx:251 +msgid "asfreq" +msgstr "asfreq (без изменения)" + #: superset-frontend/src/components/CronPicker/CronPicker.tsx:48 #: superset-frontend/src/components/CronPicker/CronPicker.tsx:50 msgid "at" +msgstr "в" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:84 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:203 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:228 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:78 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:196 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:218 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:117 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:53 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:60 +msgid "auto" +msgstr "Автоматически" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:151 +msgid "auto (Smooth)" +msgstr "Автоматически (плавно)" + +#: superset-frontend/src/dashboard/components/menu/BackgroundStyleDropdown.tsx:76 +msgid "background" +msgstr "" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:124 +#, fuzzy +msgid "basis" +msgstr "Акцент" + +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:69 +msgid "below (example:" +msgstr "ниже (пример:" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/vendor/cal-heatmap.js:260 +msgid "between {down} and {up} {name}" msgstr "" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:374 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:256 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:528 +#: superset-frontend/src/explore/controlPanels/sections.tsx:252 +msgid "bfill" +msgstr "bfill (заполняет пропуски предыдущими значениями)" + #: superset-frontend/packages/superset-ui-chart-controls/src/components/ControlHeader.tsx:74 -#: superset-frontend/src/explore/components/ControlHeader.jsx:76 +#: superset-frontend/src/explore/components/ControlHeader.tsx:122 msgid "bolt" msgstr "" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:161 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:179 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx:63 +msgid "boolean type icon" +msgstr "" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:162 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:180 msgid "bottom" -msgstr "dttm" +msgstr "снизу" -#: superset-frontend/src/components/CachedLabel/index.tsx:51 -msgid "cached" -msgstr "" +#: superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:232 +msgid "button (cmd + z) until you save your changes." +msgstr "(CTRL + Z), пока вы не сохраните изменения." + +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:72 +msgid "by using" +msgstr ", используя" #: superset-frontend/packages/superset-ui-core/src/validator/validateNonEmpty.ts:29 msgid "cannot be empty" -msgstr "" +msgstr "Необходимо заполнить" -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:143 -msgid "" -"cannot be used as a column name. The column name/alias \"__timestamp\"\n" -" is reserved for the main temporal expression, and column " -"aliases ending with\n" -" double underscores followed by a numeric value (e.g. " -"\"my_col__1\") are reserved\n" -" for deduplicating duplicate column names. Please use aliases to" -" rename the\n" -" invalid column names." -msgstr "" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:125 +#, fuzzy +msgid "cardinal" +msgstr "Ошибка" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:146 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:699 -#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:81 -#: superset/views/core.py:823 superset/views/core.py:829 +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:87 +#, fuzzy +msgid "change" +msgstr "изменение" + +#: superset-frontend/src/pages/ChartList/index.tsx:183 +#: superset-frontend/src/pages/ChartList/index.tsx:851 +#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:89 msgid "chart" msgstr "график" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:26 -#, fuzzy +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:27 msgid "charts" -msgstr "график" +msgstr "графики(ов)" #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:101 msgid "choose WHERE or HAVING..." -msgstr "выберите WHERE или HAVING…" +msgstr "выберите WHERE или HAVING..." + +#: superset-frontend/src/components/ListView/ListView.tsx:412 +msgid "clear all filters" +msgstr "Сбросить все фильтры" + +#: superset-frontend/src/components/Chart/Chart.jsx:296 +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:353 +msgid "click here" +msgstr "нажмите сюда" + +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:46 +msgid "code ISO 3166-1 alpha-2 (cca2)" +msgstr "Код ISO 3166-1 alpha-2 (cca2)" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:402 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:47 +msgid "code ISO 3166-1 alpha-3 (cca3)" +msgstr "Код ISO 3166-1 alpha-3 (cca3)" + +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:45 +msgid "code International Olympic Committee (cioc)" +msgstr "Код Международного Олимпийского Комитета (cioc)" + +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:420 msgid "column" msgstr "столбец" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:116 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:152 +#, python-format +msgid "connecting to %(dbModelName)s." +msgstr "подключении к %(dbModelName)s" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:117 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:79 msgid "count" -msgstr "столбец" +msgstr "количество" + +#: superset-frontend/src/explore/components/SaveModal.tsx:355 +msgid "create" +msgstr "создать" -#: superset/views/core.py:829 superset/views/core.py:1018 -msgid "create a " -msgstr "создать " +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:198 +msgid "create a new chart" +msgstr "создать новый график" -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:253 +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/DatasetPanel/MessageContent.tsx:45 +msgid "create dataset from SQL query" +msgstr "создайте датасет из SQL запроса" + +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:251 msgid "css" -msgstr "Css" +msgstr "css" #: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:91 msgid "css_template" msgstr "шаблон_css" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:120 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:257 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:139 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:406 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:186 +#: superset-frontend/src/explore/controlPanels/sections.tsx:138 +msgid "cumsum" +msgstr "Кумулятивная сумма" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:121 msgid "cumulative" -msgstr "Действия" +msgstr "кумулятивно" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:115 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:678 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:77 -#: superset/views/core.py:1001 superset/views/core.py:1019 +#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx:115 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:121 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:717 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:75 msgid "dashboard" msgstr "дашборд" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:27 -#, fuzzy +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:28 msgid "dashboards" -msgstr "дашборд" +msgstr "дашборды(ов)" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:89 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:471 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:464 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:91 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:537 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:665 msgid "database" msgstr "база данных" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:116 -#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:61 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:123 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:699 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:117 +#: superset-frontend/src/dashboard/components/SliceAdder.jsx:75 +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/Footer/index.tsx:60 +#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:71 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:153 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:850 msgid "dataset" msgstr "датасет" -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:304 +#: superset-frontend/src/views/CRUD/data/dataset/AddDataset/Header/index.tsx:83 +msgid "dataset name" +msgstr "Имя датасета" + +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:303 msgid "date" msgstr "дата" +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:44 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:61 #: superset-frontend/src/components/CronPicker/CronPicker.tsx:39 msgid "day" msgstr "день" @@ -15469,74 +18833,167 @@ msgstr "день месяца" msgid "day of the week" msgstr "день недели" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:30 +msgid "deck.gl 3D Hexagon" +msgstr "deck.gl 3D Шестигранники" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:30 +msgid "deck.gl Arc" +msgstr "deck.gl Дуга" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/index.js:30 +msgid "deck.gl Geojson" +msgstr "deck.gl GeoJSON" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:30 +msgid "deck.gl Grid" +msgstr "deck.gl Сетка" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/index.js:28 +msgid "deck.gl Multiple Layers" +msgstr "deck.gl Многослойный" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/index.js:28 +#, fuzzy +msgid "deck.gl Path" +msgstr "" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:30 +msgid "deck.gl Polygon" +msgstr "deck.gl Полигон" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:30 +msgid "deck.gl Scatterplot" +msgstr "deck.gl Точечная карта" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:30 +#, fuzzy +msgid "deck.gl Screen Grid" +msgstr "deck.gl Screen Grid" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/controlPanel.js:37 +#, fuzzy +msgid "deck.gl charts" +msgstr "" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/index.js:31 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/index.js:31 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:34 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:34 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:34 +msgid "deckGL" +msgstr "Карта deckGL" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:87 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:106 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:125 +msgid "default" +msgstr "по умолчанию" + #: superset-frontend/src/components/DeleteModal/index.tsx:84 msgid "delete" msgstr "удалить" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:195 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:196 msgid "descendant" -msgstr "Сортировать" +msgstr "потомок" #: superset-frontend/packages/superset-ui-chart-controls/src/components/ControlHeader.tsx:64 -#: superset-frontend/src/explore/components/ControlHeader.jsx:66 #: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:327 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:258 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:262 msgid "description" msgstr "описание" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:71 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:81 +#, fuzzy +msgid "deviation" +msgstr "Продолжительность" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:86 msgid "dialect+driver://username:password@host:port/database" msgstr "диалект+драйвер://пользователь:пароль@хост:порт/схема" -#: superset/views/core.py:618 -#, fuzzy -msgid "download as csv" -msgstr "Сохранить как изображение" - -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:153 -#, fuzzy +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:152 msgid "draft" -msgstr "Черновик" +msgstr "черновик" #: superset/views/log/__init__.py:32 msgid "dttm" -msgstr "dttm" +msgstr "Дата/время" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:129 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:153 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:174 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:190 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:238 msgid "e.g. ********" -msgstr "" +msgstr "например, ********" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:45 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:111 msgid "e.g. 127.0.0.1" -msgstr "" +msgstr "например, 127.0.0.1" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:67 msgid "e.g. 5432" +msgstr "например, 5432" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/ValidatedInputField.tsx:36 +msgid "e.g. AccountAdmin" msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:108 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:132 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SSHTunnelForm.tsx:143 msgid "e.g. Analytics" -msgstr "Расширенный анализ" +msgstr "например, Analytics" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:172 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/ValidatedInputField.tsx:32 +msgid "e.g. compute_wh" +msgstr "" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:217 msgid "e.g. param1=value1¶m2=value2" +msgstr "например, параметр1=значение1&параметр2=значение2" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:90 +msgid "e.g. sql/protocolv1/o/12345" msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:88 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:112 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/ValidatedInputField.tsx:29 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:630 msgid "e.g. world_population" +msgstr "например, health_medicine" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:628 +msgid "e.g. xy12345.us-east-2.aws" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:126 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:125 msgid "e.g., a \"user id\" column" -msgstr "Столбцы Временных Рядов" +msgstr "например, столбец \"идентификатор пользователя\"" + +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:210 +msgid "edit mode" +msgstr "режиме редактирования" + +#: superset-frontend/plugins/plugin-chart-table/src/DataTable/components/SelectPageSize.tsx:58 +#, fuzzy +msgid "entries" +msgstr "категории" + +#: superset/connectors/sqla/models.py:1510 superset/models/helpers.py:1727 +#, fuzzy +msgid "error_message" +msgstr "Сообщение об ошибке" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:27 #: superset-frontend/src/components/CronPicker/CronPicker.tsx:35 msgid "every" -msgstr "каждый" +msgstr "каждые" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:29 msgid "every day of the month" @@ -15551,58 +19008,101 @@ msgid "every hour" msgstr "каждый час" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:34 -#, fuzzy msgid "every minute" -msgstr "месяц" +msgstr "каждая минута" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:28 msgid "every month" -msgstr "месяц" +msgstr "каждый месяц" -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:123 -msgid "feature to store a summarized data set that you can then explore." -msgstr "" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:57 +#: superset-frontend/src/explore/fixtures.tsx:63 +msgid "expand" +msgstr "развернуть" + +#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx:89 +#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx:47 +msgid "explore" +msgstr "исследовать" + +#: superset-frontend/src/SqlLab/constants.ts:33 +#: superset-frontend/src/SqlLab/constants.ts:51 +#, fuzzy +msgid "failed" +msgstr "Ошибка" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:87 +#: superset-frontend/src/SqlLab/constants.ts:35 #, fuzzy msgid "fetching" -msgstr "Настройки" +msgstr "Получение данных" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:375 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:257 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:529 +#: superset-frontend/src/explore/controlPanels/sections.tsx:253 +msgid "ffill" +msgstr "ffill (заполняет пропуски следующими значениями)" #: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:86 -#: superset-frontend/src/dashboard/containers/DashboardPage.tsx:143 +#: superset-frontend/src/dashboard/containers/DashboardPage.tsx:262 msgid "" "filter_box will be deprecated in a future version of Superset. Please " "replace filter_box by dashboard filter components." msgstr "" +"filter_box устарел и будет удален в будущей версии Суперсета. Пожалуйста," +" замените его фильтрами в левой панели дашборда." -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:115 -msgid "following this flow will most likely lead to your query timing out. " +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:219 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:118 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:87 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:61 +msgid "flat" msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:86 -#, fuzzy +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:101 msgid "for more information on how to structure your URI." msgstr " за подробной информацией по тому, как структурировать ваш URI" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:41 -msgid "green" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx:57 +msgid "function type icon" msgstr "" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:724 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1136 -#, fuzzy +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:352 +msgid "geohash (square)" +msgstr "" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:42 +msgid "green" +msgstr "Зеленая" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:168 +msgid "heatmap" +msgstr "тепловая карта" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:184 +msgid "heatmap: values are normalized across the entire heatmap" +msgstr "тепловая карта: значения нормализованы внутри всей карты" + +#: superset-frontend/src/components/EmptyState/index.tsx:237 +#: superset-frontend/src/components/ImportModal/ErrorAlert.tsx:60 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:123 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ModalHeader.tsx:106 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:925 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1644 msgid "here" -msgstr "Поделиться" +msgstr "здесь" +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:43 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:60 #: superset-frontend/src/components/CronPicker/CronPicker.tsx:40 msgid "hour" msgstr "час" -#: superset-frontend/src/profile/components/UserInfo.tsx:75 -msgid "id:" -msgstr "идентификатор:" +#: superset-frontend/src/profile/components/UserInfo.tsx:76 +msgid "id" +msgstr "идентификатор" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:153 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:154 msgid "" "image-rendering CSS attribute of the canvas object that defines how the " "browser scales up the image" @@ -15612,280 +19112,571 @@ msgstr "" msgid "in" msgstr "в" -#: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:122 +#: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:145 msgid "in modal" -msgstr "" +msgstr "в модальном окне" #: superset-frontend/packages/superset-ui-core/src/validator/legacyValidateNumber.ts:28 #: superset-frontend/packages/superset-ui-core/src/validator/validateNumber.ts:32 msgid "is expected to be a number" -msgstr "" +msgstr "Ожидается число" #: superset-frontend/packages/superset-ui-core/src/validator/legacyValidateInteger.ts:31 #: superset-frontend/packages/superset-ui-core/src/validator/validateInteger.ts:32 msgid "is expected to be an integer" -msgstr "" +msgstr "Ожидается целое число" #: superset-frontend/src/profile/components/UserInfo.tsx:64 msgid "joined" -msgstr "присоединился" +msgstr "Присоединился" -#: superset/views/base.py:527 +#: superset/views/base.py:591 msgid "json isn't valid" -msgstr "json не валиден" +msgstr "JSON не валиден" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:233 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:261 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:298 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:326 msgid "key a-z" -msgstr "" +msgstr "По алфавиту А-Я" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:234 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:262 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:299 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:327 msgid "key z-a" -msgstr "" +msgstr "По алфавиту Я-А" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:152 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:164 msgid "label" -msgstr "Метка" +msgstr "метка" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:39 -#, fuzzy msgid "last day" -msgstr "Суббота" +msgstr "последний день" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:41 -#, fuzzy msgid "last month" -msgstr "месяц" +msgstr "последний месяц" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:42 msgid "last quarter" -msgstr "" +msgstr "последний квартал" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:40 -#, fuzzy msgid "last week" -msgstr "Последняя неделя" +msgstr "последняя неделя" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:43 -#, fuzzy msgid "last year" -msgstr "Кластер" +msgstr "последний год" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:120 +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:153 msgid "latest partition:" msgstr "последний раздел:" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:158 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:176 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:159 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:177 msgid "left" -msgstr "оповещение" +msgstr "слева" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:63 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/vendor/cal-heatmap.js:259 +msgid "less than {min} {name}" +msgstr "" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:123 +#, fuzzy +msgid "linear" +msgstr "" + +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:66 msgid "log" msgstr "журнал" -#: superset/charts/schemas.py:624 +#: superset/charts/schemas.py:639 msgid "" "lower percentile must be greater than 0 and less than 100. Must be lower " "than upper percentile." -msgstr "нижний процентиль должен быть больше 0 и меньше верхнего процентиля." +msgstr "" +"Нижний процентиль должен быть больше 0 и меньше 100. Должен быть ниже " +"верхнего процентиля" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:189 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:58 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:76 +#: superset-frontend/src/filters/components/Range/buildQuery.ts:69 +msgid "max" +msgstr "Максимум" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:187 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:254 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:377 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:56 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:136 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:259 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:77 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:403 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:531 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:183 +#: superset-frontend/src/explore/controlPanels/sections.tsx:135 +#: superset-frontend/src/explore/controlPanels/sections.tsx:255 +msgid "mean" +msgstr "Среднее" + +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:376 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:258 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:78 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:530 +#: superset-frontend/src/explore/controlPanels/sections.tsx:254 +msgid "median" +msgstr "Медиана" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/PivotTableChart.tsx:59 +#: superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx:136 +msgid "metric" +msgstr "мера" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:59 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:188 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:57 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:75 +#: superset-frontend/src/filters/components/Range/buildQuery.ts:58 +msgid "min" +msgstr "Минимум" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:41 msgid "minute" msgstr "минута" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:51 -#, fuzzy msgid "minute(s)" -msgstr "5 минут" +msgstr "минут" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:126 +#, fuzzy +msgid "monotone" +msgstr "Гладкая линия" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:173 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:46 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:63 #: superset-frontend/src/components/CronPicker/CronPicker.tsx:37 +#: superset-frontend/src/explore/controls.jsx:267 msgid "month" msgstr "месяц" +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/vendor/cal-heatmap.js:261 +msgid "more than {max} {name}" +msgstr "" + +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx:53 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx:78 #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:116 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:138 msgid "must have a value" +msgstr "значение обязательно" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/Polygon.jsx:63 +#: superset-frontend/src/dashboard/components/SliceAdder.jsx:73 +msgid "name" +msgstr "имя" + +#: superset/databases/commands/exceptions.py:147 +msgid "no SQL validator is configured" +msgstr "не настроен ни один SQL валидатор" + +#: superset/databases/commands/validate_sql.py:101 +msgid "no SQL validator is configured for {}" +msgstr "не настроен ни один SQL валидатор для {}" + +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx:61 +msgid "numeric type icon" msgstr "" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:54 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:39 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:31 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:34 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:49 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:46 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:41 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:55 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:33 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:34 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:36 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:29 msgid "nvd3" -msgstr "" +msgstr "Графики nvd3" + +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/Sunburst.js:388 +#, fuzzy +msgid "of parent" +msgstr "Родитель" + +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/Sunburst.js:386 +#, fuzzy +msgid "of total" +msgstr "Показывать общий итог" + +#: superset-frontend/src/SqlLab/constants.ts:32 +#: superset-frontend/src/SqlLab/constants.ts:53 +#, fuzzy +msgid "offline" +msgstr "Оффлайн" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:45 #: superset-frontend/src/components/CronPicker/CronPicker.tsx:46 msgid "on" -msgstr "" +msgstr "по" + +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:200 +msgid "or use existing ones from the panel on the right" +msgstr "или использовать уже существующие из панели справа" -#: superset/charts/schemas.py:1098 +#: superset/charts/schemas.py:1138 #, fuzzy msgid "orderby column must be populated" msgstr "Ваш запрос не может быть сохранен" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:85 +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:86 +#, fuzzy +msgid "overall" +msgstr "Сбросить фильтры" + +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:77 msgid "p-value precision" -msgstr "" +msgstr "точность p-значения" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:82 +msgid "p1" +msgstr "p1" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:83 +msgid "p5" +msgstr "p5" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:84 +msgid "p95" +msgstr "p95" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:85 +msgid "p99" +msgstr "p99" + +#: superset-frontend/plugins/plugin-chart-handlebars/src/consts.ts:24 #: superset-frontend/plugins/plugin-chart-table/src/consts.ts:26 msgid "page_size.all" msgstr "" -#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:159 +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:195 msgid "page_size.entries" msgstr "" -#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:139 +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:175 msgid "page_size.show" msgstr "" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:124 +#: superset-frontend/src/SqlLab/constants.ts:34 +#: superset-frontend/src/SqlLab/constants.ts:54 +#, fuzzy +msgid "pending" +msgstr "Отрисовка" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:125 msgid "percentile (exclusive)" -msgstr "" +msgstr "перцентиль (исключая)" -#: superset/utils/pandas_postprocessing.py:921 +#: superset/utils/pandas_postprocessing/boxplot.py:88 msgid "" "percentiles must be a list or tuple with two numeric values, of which the" " first is lower than the second value" msgstr "" -"процентили должны быть списками из кортежами из двух числовых значений, в" -" которых первое значение меньше второго" + +#: superset/views/core.py:1900 +msgid "permalink state not found" +msgstr "" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:150 +msgid "pixelated (Sharp)" +msgstr "" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:53 msgid "previous calendar month" -msgstr "" +msgstr "предыдущий календарный месяц" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:50 msgid "previous calendar week" -msgstr "" +msgstr "предыдущая календарная неделя" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:56 +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:55 msgid "previous calendar year" -msgstr "" +msgstr "предыдущий календарный год" -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:153 -#, fuzzy +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:152 msgid "published" -msgstr "Неопубликованные" +msgstr "опубликовано" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:543 -#, fuzzy +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:174 +#: superset-frontend/src/explore/controls.jsx:268 +msgid "quarter" +msgstr "Квартал" + +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:547 msgid "queries" -msgstr "Ряд данных" +msgstr "запросы" -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:129 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:131 msgid "query" msgstr "запрос" +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:86 +msgid "random" +msgstr "случайно" + #: superset-frontend/src/components/CronPicker/CronPicker.tsx:42 msgid "reboot" -msgstr "" +msgstr "обновить" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:28 -#, fuzzy +#: superset-frontend/src/dashboard/components/SliceAdder.jsx:76 +msgid "recent" +msgstr "недавние" + +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:29 msgid "recents" -msgstr "Последние" +msgstr "недавние(их)" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:43 -#, fuzzy +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:44 msgid "red" -msgstr "Создано" +msgstr "Красная" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:90 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:484 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:111 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:544 msgid "report" msgstr "рассылка" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:91 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:117 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:126 -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:72 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:112 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:139 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:148 +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:75 msgid "reports" msgstr "рассылки" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:160 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:178 -#, fuzzy -msgid "right" -msgstr "Высота" - -#: superset-frontend/src/explore/components/RowCountLabel.jsx:35 -msgid "rows" -msgstr "строк" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts:432 +msgid "restore zoom" +msgstr "восстановить масштабирование" -#: superset-frontend/src/explore/components/DataTableControl/index.tsx:96 -msgid "rows retrieved" -msgstr "строк получено" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:161 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:179 +msgid "right" +msgstr "справа" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:29 +#: superset-frontend/src/SqlLab/constants.ts:36 +#: superset-frontend/src/SqlLab/constants.ts:52 #, fuzzy +msgid "running" +msgstr "Выполняется" + +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:30 msgid "saved queries" -msgstr "Сохраненные запросы" +msgstr "сохраненные(ых) запросы(ов)" -#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:124 -msgid "search.num_records" -msgstr "" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:414 +msgid "seconds" +msgstr "секунд" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:98 +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:85 +msgid "series" +msgstr "категории" + +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:90 msgid "" "series: Treat each series independently; overall: All series use the same" " scale; change: Show changes compared to the first data point in each " "series" msgstr "" -#: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:92 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:88 +#, fuzzy +msgid "square" +msgstr "последний квартал" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:55 +#: superset-frontend/src/explore/fixtures.tsx:61 +#, fuzzy +msgid "stack" +msgstr "С наполнением" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:221 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:121 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:63 +#, fuzzy +msgid "staggered" +msgstr "Запущен" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:190 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:256 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:59 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:138 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:405 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:185 +#: superset-frontend/src/explore/controlPanels/sections.tsx:137 +msgid "std" +msgstr "Стандартное отклонение" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:128 +msgid "step-after" +msgstr "" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:127 +msgid "step-before" +msgstr "" + +#: superset-frontend/src/SqlLab/constants.ts:37 +#, fuzzy +msgid "stopped" +msgstr "Добавить" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:56 +#: superset-frontend/src/explore/fixtures.tsx:62 +msgid "stream" +msgstr "поток" + +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx:59 +msgid "string type icon" +msgstr "" + +#: superset-frontend/src/SqlLab/constants.ts:38 +#: superset-frontend/src/SqlLab/constants.ts:50 +#, fuzzy +msgid "success" +msgstr "Успешно" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:186 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:255 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:378 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:55 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:137 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:260 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:74 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:404 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:532 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:184 +#: superset-frontend/src/explore/controlPanels/sections.tsx:136 +#: superset-frontend/src/explore/controlPanels/sections.tsx:256 +msgid "sum" +msgstr "Сумма" + +# Не нужно переводить +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:80 +msgid "syntax." +msgstr "" + +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx:65 +msgid "temporal type icon" +msgstr "" + +#: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:115 msgid "textarea" msgstr "текстовая область" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:159 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:177 -#, fuzzy +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:114 +msgid "to" +msgstr "по" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:160 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:178 msgid "top" -msgstr "Стоп" +msgstr "сверху" -#: superset/charts/schemas.py:639 +#: superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:231 +msgid "undo" +msgstr "отмены" + +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx:53 +msgid "unknown type icon" +msgstr "" + +#: superset/charts/schemas.py:654 msgid "" "upper percentile must be greater than 0 and less than 100. Must be higher" " than lower percentile." -msgstr "верхний процентиль должен быть больше нижнего процентиля и меньше 100." +msgstr "" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:235 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:263 +#: superset-frontend/src/explore/constants.ts:85 #, fuzzy +msgid "use latest_partition template" +msgstr "последний раздел:" + +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:300 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:328 msgid "value ascending" -msgstr "Направление сортировки" +msgstr "Значение по возрастанию" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:236 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:264 -#, fuzzy +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:301 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:329 msgid "value descending" -msgstr "Сортировать" +msgstr "Значение по убыванию" + +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:191 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:60 +msgid "var" +msgstr "Дисперсия" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:80 +msgid "variance" +msgstr "Дисперсия" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:857 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1042 msgid "virtual" -msgstr "" +msgstr "Виртуальный" + +#: superset-frontend/src/dashboard/components/SliceAdder.jsx:74 +msgid "viz type" +msgstr "тип визуализации" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:715 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:455 msgid "was created" -msgstr "создан" +msgstr "создан(а)" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:170 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:45 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:62 #: superset-frontend/src/components/CronPicker/CronPicker.tsx:38 +#: superset-frontend/src/explore/controls.jsx:264 msgid "week" msgstr "неделя" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:172 +#: superset-frontend/src/explore/controls.jsx:266 +msgid "week ending Saturday" +msgstr "неделя, заканчивающаяся в субботу" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:171 +#: superset-frontend/src/explore/controls.jsx:265 +msgid "week starting Sunday" +msgstr "неделя, начинающаяся в воскресенье" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:169 +msgid "x" +msgstr "x" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:181 +msgid "x: values are normalized within each column" +msgstr "x: значения нормализованы внутри каждого столбца" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:170 +msgid "y" +msgstr "y" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.tsx:182 +msgid "y: values are normalized within each row" +msgstr "y: значения нормализованы внутри каждой строки" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx:175 +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:47 #: superset-frontend/src/components/CronPicker/CronPicker.tsx:36 +#: superset-frontend/src/explore/controls.jsx:269 msgid "year" msgstr "год" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:42 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:43 msgid "yellow" -msgstr "" +msgstr "Желтая" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts:431 +msgid "zoom area" +msgstr "область масштабирования" diff --git a/superset/translations/sk/LC_MESSAGES/messages.po b/superset/translations/sk/LC_MESSAGES/messages.po index 6429587f83a5..9e8eea66a469 100644 --- a/superset/translations/sk/LC_MESSAGES/messages.po +++ b/superset/translations/sk/LC_MESSAGES/messages.po @@ -1141,10 +1141,6 @@ msgstr "" msgid "An error occurred saving dataset" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "" - #: superset/key_value/commands/exceptions.py:33 msgid "An error occurred while accessing the value." msgstr "" @@ -5538,18 +5534,6 @@ msgstr "" msgid "Filter box" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "" - #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 msgid "Filter configuration" msgstr "" @@ -5710,7 +5694,7 @@ msgstr "" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " "query." msgstr "" @@ -6362,7 +6346,6 @@ msgstr "" msgid "Issue 1001 - The database is under an unusual load." msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 #: superset-frontend/src/components/DatabaseSelector/index.tsx:183 msgid "It seems you don't have access to any database" @@ -8906,10 +8889,6 @@ msgstr "" msgid "Query preview" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "" - #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 msgid "Query was stopped" msgstr "" @@ -9906,7 +9885,6 @@ msgid "Scoping" msgstr "" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 #: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 @@ -11760,7 +11738,7 @@ msgstr "" #: superset/views/core.py:2280 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" @@ -14304,10 +14282,6 @@ msgstr "" msgid "[Alert] %(label)s" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "" - #: superset/viz.py:2349 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" msgstr "" @@ -14325,10 +14299,6 @@ msgstr "" msgid "[Superset] Access to the datasource %(name)s was granted" msgstr "" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "" - #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 msgid "[Untitled]" msgstr "" diff --git a/superset/translations/sl/LC_MESSAGES/messages.json b/superset/translations/sl/LC_MESSAGES/messages.json index ab5e2067a710..ca9a838bf28d 100644 --- a/superset/translations/sl/LC_MESSAGES/messages.json +++ b/superset/translations/sl/LC_MESSAGES/messages.json @@ -110,6 +110,9 @@ "Na delavcu ni bilo mogoče zagnati oddaljene poizvedbe." ], "The database was deleted.": ["Podatkovna baza je bila izbrisana."], + "Custom SQL fields cannot contain sub-queries.": [ + "Prilagojena SQL-polja ne smejo vsebovati podpoizvedb." + ], "Invalid certificate": ["Neveljaven certifikat"], "Unsafe return type for function %(func)s: %(value_type)s": [ "Nevaren tip rezultata, ki ga vrne funkcija %(func)s: %(value_type)s" @@ -274,6 +277,9 @@ "Časovna vrsta - Nightingale Rose grafikon" ], "Partition Diagram": ["Grafikon s pravokotniki"], + "Invalid advanced data type: %(advanced_data_type)s": [ + "Neveljaven napreden tip rezultata: %(advanced_data_type)s" + ], "Deleted %(num)d annotation layer": [ "Izbrisan je %(num)d sloj z oznakami", "Izbrisana sta %(num)d sloja z oznakami", @@ -323,6 +329,7 @@ "Izbrisani so %(num)d grafikoni", "Izbrisanih je %(num)d grafikonov" ], + "Is certified": ["Certificiran"], "`confidence_interval` must be between 0 and 1 (exclusive)": [ "`confidence_interval` mora biti med 0 in 1 (odprt)" ], @@ -368,6 +375,9 @@ "There are associated alerts or reports": [ "Prisotna so povezana opozorila in poročila" ], + "You don't have access to this chart.": [ + "Nimate dostopa do tega grafikona." + ], "Changing this chart is forbidden": [ "Spreminjanje tega grafikona ni dovoljeno" ], @@ -380,9 +390,12 @@ ], "Request is incorrect: %(error)s": ["Zahtevek je napačen: %(error)s"], "Request is not JSON": ["Zahtevek ni JSON"], + "Empty query result": ["Rezultat prazne poizvedbe"], "Owners are invalid": ["Lastniki niso veljavni"], "Some roles do not exist": ["Nekatere vloge ne obstajajo"], - "Dataset does not exist": ["Podatkovni set ne obstaja"], + "Datasource type is invalid": ["Neveljaven tip podatkovnega vira"], + "Datasource does not exist": ["Podatkovni vir ne obstaja"], + "Query does not exist": ["Poizvedba ne obstaja"], "Invalid result type: %(result_type)s": [ "Neveljaven tip rezultata: %(result_type)s" ], @@ -402,89 +415,6 @@ "Datasource id not found: %(id)s": [ "ID podatkovnega vira ni bil najden: %(id)s" ], - "Adding new datasource [{}]": ["Dodajanje novega podatkovnega vira [{}]"], - "Refreshing datasource [{}]": ["Osveževanje podatkovnega vira [{}]"], - "Metric(s) {} must be aggregations.": ["Mere {} morajo biti agregacije."], - "Unsupported extraction function: ": [ - "Nepodprta ekstrakcijska funkcija: " - ], - "Columns": ["Stolpci"], - "Show Druid Column": ["Pokaži Druid stolpec"], - "Add Druid Column": ["Dodaj Druid stolpec"], - "Edit Druid Column": ["Uredi Druid stolpec"], - "Column": ["Stolpec"], - "Type": ["Tip"], - "Datasource": ["Podatkovni vir"], - "Groupable": ["Združevanje"], - "Filterable": ["Filtriranje"], - "Whether this column is exposed in the `Filters` section of the explore view.": [ - "Če želite, da je ta stolpec na voljo v sekciji `Filtri` v raziskovalnem pogledu." - ], - "Metrics": ["Mere"], - "Show Druid Metric": ["Prikaži Druid mere"], - "Add Druid Metric": ["Dodaj Druid mere"], - "Edit Druid Metric": ["Uredi Druid mere"], - "Metric": ["Mera"], - "Description": ["Opis"], - "Verbose Name": ["Podrobno ime"], - "JSON": ["JSON"], - "Druid Datasource": ["Podatkovni vir Druid"], - "Warning Message": ["Opozorilo"], - "Druid Clusters": ["Druid gruče"], - "Show Druid Cluster": ["Pokaži Druid gručo"], - "Add Druid Cluster": ["Dodaj Druid gručo"], - "Edit Druid Cluster": ["Uredi Druid gručo"], - "Cluster Name": ["Ime gruče"], - "Broker Host": ["Gostitelj posrednika"], - "Broker Port": ["Vrata posrednika"], - "Broker Username": ["Uporabniško ime posrednika"], - "Broker Password": ["Geslo posrednika"], - "Broker Endpoint": ["Končna točka posrednika"], - "Cache Timeout": ["Trajanje predpomnilnika"], - "Metadata Last Refreshed": ["Meta-podatki nazadnje osveženi"], - "Duration (in seconds) of the caching timeout for this cluster. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.": [ - "Trajanje (v sekundah) predpomnjenja za to gručo. Vrednost 0 označuje, da predpomnilnik nikoli ne poteče. V primeru, da ni definirano, ima globalno nastavitev trajanja." - ], - "Druid supports basic authentication. See [auth](http://druid.io/docs/latest/design/auth.html) and druid-basic-security extension": [ - "Druid podpira osnovno avtentikacijo. Glejte [auth](http://druid.io/docs/latest/design/auth.html) in razširitev druid-basic-security" - ], - "Druid Datasources": ["Druid podatkovni viri"], - "Show Druid Datasource": ["Prikaži podatkovni vir za Druid"], - "Add Druid Datasource": ["Dodaj podatkovni vir za Druid"], - "Edit Druid Datasource": ["Uredi podatkovni vir za Druid"], - "The list of charts associated with this table. By altering this datasource, you may change how these associated charts behave. Also note that charts need to point to a datasource, so this form will fail at saving if removing charts from a datasource. If you want to change the datasource for a chart, overwrite the chart from the 'explore view'": [ - "Seznam grafikonov, povezanih s to tabelo. S spreminjanjem podatkovnega vira lahko spremenite, kako se povezani grafikoni obnašajo. Poleg tega morajo biti grafikoni povezani s podatkovnim virom. Če odstranite grafikon s podatkovnega vira ne bo mogoče shraniti tega vnosa. Če želite spremeniti podatkovni vir grafikona, prepišite grafikon v raziskovalnem pogledu." - ], - "Timezone offset (in hours) for this datasource": [ - "Razlika časovnega pasu (v urah) za ta podatkovni vir" - ], - "Time expression to use as a predicate when retrieving distinct values to populate the filter component. Only applies when `Enable Filter Select` is on. If you enter `7 days ago`, the distinct list of values in the filter will be populated based on the distinct value over the past week": [ - "Prednastavljeni časovni izraz za pridobitev različnih vrednosti filtrirne komponente. Upošteva se le v primeru, da je vključeno `Omogoči izbiro filtra`. Če vnesete `7 days ago`, bo seznam vrednosti filtra napolnjen na podlagi različnih vrednosti v prejšnjem tednu" - ], - "Whether to populate the filter's dropdown in the explore view's filter section with a list of distinct values fetched from the backend on the fly": [ - "Če želite napolniti spustni seznam filtra v raziskovalnem pogledu filtrske sekcije z različnimi vrednostmi, pridobljenimi sproti v ozadju" - ], - "Redirects to this endpoint when clicking on the datasource from the datasource list": [ - "Preusmeri v to končno točko, ko kliknete na podatkovni vir v seznamu podatkovnih virov" - ], - "Duration (in seconds) of the caching timeout for this datasource. A timeout of 0 indicates that the cache never expires. Note this defaults to the cluster timeout if undefined.": [ - "Trajanje (v sekundah) predpomnjenja za ta podatkovni vir. Vrednost 0 označuje, da predpomnilnik nikoli ne poteče. V primeru, da ni definirano, ima nastavitev trajanja za gručo." - ], - "Associated Charts": ["Povezani grafikoni"], - "Data Source": ["Podatkovni vir"], - "Cluster": ["Gruča"], - "Owners": ["Lastniki"], - "Is Hidden": ["Skrito"], - "Enable Filter Select": ["Omogoči izbiro filtra"], - "Default Endpoint": ["Privzeta končna točka"], - "Time Offset": ["Časovni zamik"], - "Datasource Name": ["Ime podatkovnega vira"], - "Fetch Values From": ["Pridobi vrednosti iz"], - "Changed By": ["Spremenil"], - "Modified": ["Spremenjeno"], - "Refreshed metadata from cluster [{}]": [ - "Osveženi meta-podatki iz gruče [{}]" - ], "Error in jinja expression in fetch values predicate: %(msg)s": [ "Napaka v jinja izrazu za pridobivanje vrednosti predikatov: %(msg)s" ], @@ -514,6 +444,7 @@ "Time column \"%(col)s\" does not exist in dataset": [ "Časovni stolpec \"%(col)s\" ne obstaja v podatkovnem setu" ], + "error_message": ["error_message"], "Filter value list cannot be empty": [ "Seznam vrednosti filtra ne sme biti prazen" ], @@ -539,26 +470,40 @@ "Dovoljeni so le `SELECT` stavki" ], "Only single queries supported": ["Podprte so le enojne poizvedbe"], + "Columns": ["Stolpci"], "Show Column": ["Pokaži stolpec"], "Add Column": ["Dodaj stolpec"], "Edit Column": ["Uredi stolpec"], "Whether to make this column available as a [Time Granularity] option, column has to be DATETIME or DATETIME-like": [ "Če želite, da bo ta stolpec na razpolago kot možnost [Granulacija časa]. Stolpec mora biti tipa DATETIME ali DATETIME-like" ], + "Whether this column is exposed in the `Filters` section of the explore view.": [ + "Če želite, da je ta stolpec na voljo v sekciji `Filtri` v raziskovalnem pogledu." + ], "The data type that was inferred by the database. It may be necessary to input a type manually for expression-defined columns in some cases. In most case users should not need to alter this.": [ "Podatkovni tip, ki izvira iz podatkovne baze. V nekaterih primerih je potrebno ročno vnesti tip za stolpce, ki temeljijo na izrazih. V večini primerov uporabniku tega ni potrebno spreminjati." ], + "Column": ["Stolpec"], + "Verbose Name": ["Podrobno ime"], + "Description": ["Opis"], + "Groupable": ["Združevanje"], + "Filterable": ["Filtriranje"], "Table": ["Tabela"], "Expression": ["Izraz"], "Is temporal": ["Časoven"], "Datetime Format": ["Oblika zapisa datuma,časa"], + "Type": ["Tip"], + "Business Data Type": ["Poslovni podatkovni tip"], "Invalid date/timestamp format": ["Neveljaven zapis datuma/časa"], + "Metrics": ["Mere"], "Show Metric": ["Pokaži mero"], "Add Metric": ["Dodaj mero"], "Edit Metric": ["Uredi mero"], + "Metric": ["Mera"], "SQL Expression": ["SQL izraz"], "D3 Format": ["D3 zapis"], "Extra": ["Dodatno"], + "Warning Message": ["Opozorilo"], "Row level security filter": ["Filter za varnost na nivoju vrstic"], "Show Row level security filter": [ "Prikaži filter za varnost na nivoju vrstic" @@ -588,9 +533,16 @@ "Roles": ["Vloge"], "Clause": ["Stavek"], "Creator": ["Avtor"], + "Modified": ["Spremenjeno"], "Show Table": ["Prikaži tabelo"], "Import a table definition": ["Uvozi definicijo tabele"], "Edit Table": ["Uredi tabelo"], + "The list of charts associated with this table. By altering this datasource, you may change how these associated charts behave. Also note that charts need to point to a datasource, so this form will fail at saving if removing charts from a datasource. If you want to change the datasource for a chart, overwrite the chart from the 'explore view'": [ + "Seznam grafikonov, povezanih s to tabelo. S spreminjanjem podatkovnega vira lahko spremenite, kako se povezani grafikoni obnašajo. Poleg tega morajo biti grafikoni povezani s podatkovnim virom. Če odstranite grafikon s podatkovnega vira ne bo mogoče shraniti tega vnosa. Če želite spremeniti podatkovni vir grafikona, prepišite grafikon v raziskovalnem pogledu." + ], + "Timezone offset (in hours) for this datasource": [ + "Razlika časovnega pasu (v urah) za ta podatkovni vir" + ], "Name of the table that exists in the source database": [ "Ime tabele, ki obstaja v izvorni podatkovni bazi" ], @@ -606,6 +558,9 @@ "Redirects to this endpoint when clicking on the table from the table list": [ "Preusmeri v to končno točko, ko kliknete na tabelo v seznamu tabel" ], + "Whether to populate the filter's dropdown in the explore view's filter section with a list of distinct values fetched from the backend on the fly": [ + "Če želite napolniti spustni seznam filtra v raziskovalnem pogledu filtrske sekcije z različnimi vrednostmi, pridobljenimi sproti v ozadju" + ], "Whether the table was generated by the 'Visualize' flow in SQL Lab": [ "Če želite, da je tabela ustvarjena s postopkom 'Vizualizacija' v SQL laboratoriju" ], @@ -615,35 +570,24 @@ "Duration (in seconds) of the caching timeout for this table. A timeout of 0 indicates that the cache never expires. Note this defaults to the database timeout if undefined.": [ "Trajanje (v sekundah) predpomnjenja za to tabelo. Vrednost 0 označuje, da predpomnilnik nikoli ne poteče. V primeru, da ni definirano, ima nastavitev trajanja za podatkovno bazo." ], + "Associated Charts": ["Povezani grafikoni"], + "Changed By": ["Spremenil"], "Database": ["Podatkovna baza"], "Last Changed": ["Zadnja sprememba"], + "Enable Filter Select": ["Omogoči izbiro filtra"], "Schema": ["Shema"], + "Default Endpoint": ["Privzeta končna točka"], "Offset": ["Odmik"], + "Cache Timeout": ["Trajanje predpomnilnika"], "Table Name": ["Ime tabele"], "Fetch Values Predicate": ["Pridobi vrednosti predikatov"], + "Owners": ["Lastniki"], "Main Datetime Column": ["Glavni stolpec Datum-Čas"], "SQL Lab View": ["Pogled SQL laboratorija"], "Template parameters": ["Parametri predlog"], "The table was created. As part of this two-phase configuration process, you should now click the edit button by the new table to configure it.": [ "Tabela je ustvarjena. Sedaj morate v tem dvodelnem postopku klikniti gumb za urejanje nove tabele." ], - "Refresh Metadata": ["Osveži metapodatke"], - "Refresh column metadata": ["Osveži metapodatke stolpca"], - "Metadata refreshed for the following table(s): %(tables)s": [ - "Metapodatki osveženi za naslednje tabele: %(tables)s" - ], - "The following tables added new columns: %(tables)s": [ - "Nove stolpce so dodale naslednje tabele: %(tables)s" - ], - "The following tables removed columns: %(tables)s": [ - "Stolpce so odstranile naslednje tabele: %(tables)s" - ], - "The following tables update column metadata: %(tables)s": [ - "Metapodatke stolpcev so posodobile naslednje tabele: %(tables)s" - ], - "Unable to refresh metadata for the following table(s): %(tables)s": [ - "Ni mogoče osvežiti metapodatkov za naslednje tabele: %(tables)s" - ], "Deleted %(num)d css template": [ "Izbrisana %(num)d css predloga", "Izbrisani %(num)d css predlogi", @@ -661,6 +605,7 @@ "Izbrisanih je %(num)d nadzornih plošč" ], "Title or Slug": ["Naslov ali `Slug`"], + "Created by me": ["Ustvarjeno z moje strani"], "Role": ["Vloga"], "Must be unique": ["Mora biti unikaten"], "Dashboard parameters are invalid.": [ @@ -688,7 +633,15 @@ "Nimate dostopa do te nadzorne plošče." ], "No data in file": ["V datoteki ni podatkov"], + "Invalid state.": ["Neveljavno stanje."], + "An error occurred while creating the value.": [ + "Pri ustvarjanju vrednosti je prišlo do težave." + ], + "An error occurred while accessing the value.": [ + "Pri dostopanju do vednosti je prišlo do težave." + ], "Table name undefined": ["Ime tabele ni definirano"], + "Upload Enabled": ["Nalaganje omogočeno"], "Invalid connection string, a valid string usually follows: driver://user:password@database-host/database-name": [ "Neveljaven niz povezave - veljaven niz običajno sledi: driver://user:password@database-host/database-name" ], @@ -714,8 +667,8 @@ "Podatkovna baza z enakim imenom že obstaja." ], "Field is required": ["Polje je obvezno"], - "Field cannot be decoded by JSON. %{json_error}s": [ - "Polja ni mogoče dekodirati z JSON. %{json_error}s" + "Field cannot be decoded by JSON. %(json_error)s": [ + "Polja ni mogoče dekodirati z JSON. %(json_error)s" ], "The metadata_params in Extra field is not configured correctly. The key %{key}s is invalid.": [ "Metadata_params v polju Dodatno niso pravilno nastavljeni. Ključ %{key}s je neveljaven." @@ -745,6 +698,12 @@ "Unexpected error occurred, please check your logs for details": [ "Zgodila se je nepričakovana napaka. Podrobnosti preverite v dnevnikih" ], + "no SQL validator is configured": ["SQL potrjevalnik ni nastavljen"], + "No validator found (configured for the engine)": [ + "Potrjevalnik ni najden (nastavljen za podatkovno bazo)" + ], + "Was unable to check your query": ["Poizvedbe ni bilo mogoče preveriti"], + "An unexpected error occurred": ["Prišlo je do nepričakovane napake"], "Import database failed for an unknown reason": [ "Uvoz podatkovne baze ni uspel zaradi neznanega razloga" ], @@ -755,6 +714,15 @@ "Podatkovne baze tipa \"%(engine)s\" ni mogoče konfigurirati s parametri." ], "Database is offline.": ["Podatkovna baza ni povezana."], + "%(validator)s was unable to check your query.\nPlease recheck your query.\nException: %(ex)s": [ + "%(validator)s ni mogel preveriti vaše poizvedbe.\nPonovno preverite poizvedbo.\nIzjema: %(ex)s" + ], + "no SQL validator is configured for {}": [ + "SQL potrjevalnik ni nastavljen za {}" + ], + "No validator named {} found (configured for the {} engine)": [ + "Potrjevalnik {} ni bil najden (nastavljen za podatkovno bazo {})" + ], "Deleted %(num)d dataset": [ "Izbrisan %(num)d podatkovni set", "Izbrisana %(num)d podatkovna niza", @@ -784,6 +752,7 @@ "Table [%(table_name)s] could not be found, please double check your database connection, schema, and table name": [ "Tabele [%(table_name)s] ni mogoče najti. Preverite povezavo, shemo in ime podatkovne baze" ], + "Dataset does not exist": ["Podatkovni set ne obstaja"], "Dataset parameters are invalid.": [ "Parametri podatkovnega seta so neveljavni." ], @@ -799,12 +768,18 @@ "Dataset(s) could not be bulk deleted.": [ "Podatkovnih nizov ni mogoče množično izbrisati." ], + "Samples for dataset could not be retrieved.": [ + "Vzorcev za podatkovni set ni bilo mogoče pridobiti." + ], "Changing this dataset is forbidden": [ "Spreminjanje tega podatkovnega seta ni dovoljeno" ], "Import dataset failed for an unknown reason": [ "Uvoz podatkovnega seta ni uspel zaradi neznanega razloga" ], + "You don't have access to this dataset.": [ + "Nimate dostopa do tega podatkovnega seta." + ], "Dataset metric not found.": ["Mer podatkovnega seta ni najdena."], "Dataset metric delete failed.": [ "Brisanje mere podatkovnega seta ni uspelo." @@ -853,6 +828,9 @@ "The schema \"%(schema)s\" does not exist. A valid schema must be used to run this query.": [ "Shema \"%(schema)s\" ne obstaja. Za poizvedbo mora biti uporabljena veljavna shema." ], + "We can't seem to resolve the column \"%(column_name)s\"": [ + "Zdi se, da ni mogoče razrešiti stolpca \"%(column_name)s\"" + ], "Please check your query for syntax errors near \"%(server_error)s\". Then, try running your query again.": [ "Preverite, če ima vaša poizvedba sintaktične napake pri \"%(server_error)s\". Potem ponovno poženite poizvedbo." ], @@ -906,8 +884,8 @@ "%(object)s does not exist in this database.": [ "%(object)s ne obstaja v tej podatkovni bazi." ], - "We can't seem to resolve the column \"%(column_name)s\"": [ - "Zdi se, da ni mogoče razrešiti stolpca \"%(column_name)s\"" + "You don't have access to this embedded dashboard config.": [ + "Nimate dostopa do konfiguracije te vgrajene nadzorne plošče." ], "Home": ["Domov"], "Annotation Layers": ["Sloji z oznakami"], @@ -926,20 +904,22 @@ "Databases": ["Podatkovne baze"], "Data": ["Podatki"], "Datasets": ["Podatkovni seti"], - "Upload a CSV": ["Naloži CSV"], - "Upload a Columnar File": ["Naloži datoteko s stolpci"], - "Upload Excel": ["Naloži Excel"], "Action Log": ["Dnevnik aktivnosti"], - "Dashboard Emails": ["E-pošta za nadzorno ploščo"], - "Chart Email Schedules": ["Urniki za e-pošto grafikonov"], - "Alerts": ["Opozorila"], "Alerts & Reports": ["Opozorila in poročila"], "Access requests": ["Zahteve za dostop"], - "Scan New Datasources": ["Preišči nove podatkovne vire"], - "Refresh Druid Metadata": ["Osveži metapodatke za Druid"], - "Temporal expression not supported for type: %(col_type)s": [ - "Časovni izraz ni podprt za podatkovne tipe: %(col_type)s" + "An error occurred while parsing the key.": [ + "Pri branju ključa je prišlo do težave." + ], + "An error occurred while deleting the value.": [ + "Pri brisanju vrednosti je prišlo do napake." + ], + "An error occurred while updating the value.": [ + "Pri posodabljanju vrednosti je prišlo do težave." + ], + "You don't have permission to modify the value.": [ + "Nimate dovoljenja za spreminjanje vrednosti." ], + "Invalid permalink key": ["Neveljaven ključ povezave"], "Deleted %(num)d saved query": [ "Izbrisana %(num)d shranjena poizvedba", "Izbrisani %(num)d shranjeni poizvedbi", @@ -964,10 +944,10 @@ ], "Value must be greater than 0": ["Vrednost mora biti večja od 0"], "Alert query returned more than one row. %s rows returned": [ - "Opozorilna poizvedba je vrnila več kot eno vrstico. Število vrnjenih vrstic: %s" + "Poizvedba za opozorilo je vrnila več kot eno vrstico. Št. vrnjenih vrstic: %s" ], "Alert query returned more than one column. %s columns returned": [ - "Opozorilna poizvedba je vrnila več kot en stolpec. Število vrnjenih stolpcev: %s" + "Poizvedba za opozorilo je vrnila več kot en stolpec. Število vrnjenih stolpcev: %s" ], "Dashboard does not exist": ["Nadzorna plošča ne obstaja"], "Chart does not exist": ["Grafikon ne obstaja"], @@ -1019,17 +999,26 @@ "Report Schedule reached a working timeout.": [ "Urnik poročanja je dosegel mejo časa izvedbe." ], + "A report named \"%(name)s\" already exists": [ + "Poročilo poimenovano %(name)s že obstaja" + ], + "An alert named \"%(name)s\" already exists": [ + "Opozorilo poimenovano %(name)s že obstaja" + ], + "Resource already has an attached report.": [ + "Vir že ima povezano poročilo." + ], "Alert query returned more than one row.": [ - "Opozorilna poizvedba je vrnila več kot eno vrstico." + "Poizvedba za opozorilo je vrnila več kot eno vrstico." ], "Alert validator config error.": [ "Napaka nastavitev potrjevalnika opozoril." ], "Alert query returned more than one column.": [ - "Opozorilna poizvedba je vrnila več kot en stolpec." + "Poizvedba za opozorilo je vrnila več kot en stolpec." ], "Alert query returned a non-number value.": [ - "Opozorilna poizvedba je vrnila neštevilsko vrednost." + "Poizvedba za opozorilo je vrnila neštevilsko vrednost." ], "Alert found an error while executing a query.": [ "Opozorilo je našlo napako pri izvajanju poizvedbe." @@ -1094,19 +1083,6 @@ "Please check your query and confirm that all template parameters are surround by double braces, for example, \"{{ ds }}\". Then, try running your query again.": [ "V poizvedbi preverite, da so vsi parametri obdani z dvojnimi oklepaji, npr. \"{{ ds }}\". Potem poskusite ponovno." ], - "\n *%(name)s*\n\n <%(url)s|Explore in Superset>\n ": [ - "\n *%(name)s*\n\n <%(url)s|Razišči v Supersetu>\n " - ], - "<b><a href=\"%(url)s\">Explore in Superset</a></b><p></p>": [ - "<b><a href=\"%(url)s\">Razišči v Supersetu</a></b><p></p>" - ], - "\n <b><a href=\"%(url)s\">Explore in Superset</a></b><p></p>\n <img src=\"cid:%(msgid)s\">\n ": [ - "\n <b><a href=\"%(url)s\">Razišči v Supersetu</a></b><p></p>\n <img src=\"cid:%(msgid)s\">\n " - ], - "\n *%(slice_name)s*\n\n <%(slice_url_user_friendly)s|Explore in Superset>\n ": [ - "\n *%(slice_name)s*\n\n <%(slice_url_user_friendly)s|Razišči v Supersetu>\n " - ], - "[Alert] %(label)s": ["[Alert] %(label)s"], "New": ["Nov"], "SQL Query": ["SQL poizvedba"], "Chart": ["Grafikon"], @@ -1131,10 +1107,11 @@ ], "Request Permissions": ["Zahtevaj dovoljenja"], "Cancel": ["Prekliči"], - "Use the edit buttom to change this field": [ + "Use the edit button to change this field": [ "Za spreminjanje tega polja uporabite gumb za urejanje" ], "Test Connection": ["Preizkusi povezavo"], + "Resource was not found.": ["Vir ni bil najden."], "[Superset] Access to the datasource %(name)s was granted": [ "[Superset] dostop do podatkovnega vira %(name)s je odobren" ], @@ -1145,31 +1122,8 @@ "Unable to find such a holiday: [%(holiday)s]": [ "Ni mogoče najti takšnega praznika: [%(holiday)s]" ], - "Referenced columns not available in DataFrame.": [ - "Referencirani stolpci niso razpoložljivi v Dataframe-u." - ], - "Column referenced by aggregate is undefined: %(column)s": [ - "Stolpec referenciran z agregacijo ni definiran: %(column)s" - ], - "Operator undefined for aggregator: %(name)s": [ - "Operand ni definiran za agregatorja: %(name)s" - ], - "Invalid numpy function: %(operator)s": [ - "Neveljavna numpy funkcija: %(operator)s" - ], - "Pivot operation requires at least one index": [ - "Vrtilna operacija zahteva vsaj en indeks" - ], - "Pivot operation must include at least one aggregate": [ - "Vrtilna operacija mora vsebovati vsaj en agregat" - ], - "Undefined window for rolling operation": [ - "Nedefinirano okno za drsečo operacijo" - ], - "Window must be > 0": ["Okno mora biti > 0"], - "Invalid rolling_type: %(type)s": ["Neveljaven rolling_type: %(type)s"], - "Invalid options for %(rolling_type)s: %(options)s": [ - "Neveljavne možnosti za %(rolling_type)s: %(options)s" + "percentiles must be a list or tuple with two numeric values, of which the first is lower than the second value": [ + "percentili morajo biti tipa list ali tuple z vsaj dvema numeričnima vrednostma, pri čemer je prva manjša od druge" ], "`compare_columns` must have the same length as `source_columns`.": [ "`compare_columns` morajo imeti enako dolžino kot `source_columns`." @@ -1177,26 +1131,30 @@ "`compare_type` must be `difference`, `percentage` or `ratio`": [ "`compare_type` mora biti `difference`, `percentage` ali `ratio`" ], + "Column \"%(column)s\" is not numeric or does not exists in the query results.": [ + "Stolpec \"%(column)s\" ni numeričen ali ne obstaja v rezultatu poizvedbe." + ], + "`rename_columns` must have the same length as `columns`.": [ + "`rename_columns` morajo imeti enako dolžino kot `columns`." + ], "Invalid cumulative operator: %(operator)s": [ "Neveljaven kumulativni operand: %(operator)s" ], "Invalid geohash string": ["Neveljaven niz za geohash"], "Invalid longitude/latitude": ["Neveljavna zemljepisna dolžina/širina"], "Invalid geodetic string": ["Neveljaven geodetski niz"], - "Column \"%(column)s\" is not numeric or does not exists in the query results.": [ - "Stolpec \"%(column)s\" ni numeričen ali ne obstaja v rezultatu poizvedbe." + "Pivot operation requires at least one index": [ + "Vrtilna operacija zahteva vsaj en indeks" ], - "`rename_columns` must have the same length as `columns`.": [ - "`rename_columns` morajo imeti enako dolžino kot `columns`." + "Pivot operation must include at least one aggregate": [ + "Vrtilna operacija mora vsebovati vsaj en agregat" ], "`prophet` package not installed": ["Knjižnica `prophet` ni nameščena"], "Time grain missing": ["Časovna granulacija manjka"], "Unsupported time grain: %(time_grain)s": [ "Nepodprta časovna granulacija: %(time_grain)s" ], - "Periods must be a positive integer value": [ - "Periode morajo biti pozitivno celo število" - ], + "Periods must be a whole number": ["Periode morajo biti celo število"], "Confidence interval must be between 0 and 1 (exclusive)": [ "Interval zaupanja mora biti med 0 in 1 (odprt)" ], @@ -1206,33 +1164,37 @@ "DataFrame include at least one series": [ "DataFrame vsebuje vsaj eno serijo" ], - "percentiles must be a list or tuple with two numeric values, of which the first is lower than the second value": [ - "percentili morajo biti tipa list ali tuple z vsaj dvema numeričnima vrednostma, pri čemer je prva manjša od druge" + "Label already exists": ["Oznaka že obstaja"], + "Resample operation requires DatetimeIndex": [ + "Prevzorčevalna operacija zahteva indeks tipa datumčas" ], - "User": ["Uporabnik"], - "User Roles": ["Vloge uporabnikov"], - "Database URL": ["URL podatkovne baze"], - "Roles to grant": ["Vloge za dovoljevanje"], - "Created On": ["Ustvarjeno"], - "List Observations": ["Naštej opažanja"], - "Show Observation": ["Prikaži opažanja"], - "Error Message": ["Sporočilo napake"], - "Log Retentions (days)": ["Ohranjanje dnevnika (dnevi)"], - "A semicolon ';' delimited list of email addresses": [ - "S podpičjem ';' ločen seznam naslovov e-pošte" + "Resample method should in ": ["Metoda za prevzorčenje v Pandas mora "], + "Undefined window for rolling operation": [ + "Nedefinirano okno za drsečo operacijo" + ], + "Window must be > 0": ["Okno mora biti > 0"], + "Invalid rolling_type: %(type)s": ["Neveljaven rolling_type: %(type)s"], + "Invalid options for %(rolling_type)s: %(options)s": [ + "Neveljavne možnosti za %(rolling_type)s: %(options)s" ], - "How long to keep the logs around for this alert": [ - "Kako dolgo ohraniti dnevnike za to opozorilo" + "Referenced columns not available in DataFrame.": [ + "Referencirani stolpci niso razpoložljivi v Dataframe-u." ], - "Once an alert is triggered, how long, in seconds, before Superset nags you again.": [ - "Kako dolgo naj traja (v sekundah), da vas Superset ponovno opomni, ko je opozorilo sproženo." + "Column referenced by aggregate is undefined: %(column)s": [ + "Stolpec referenciran z agregacijo ni definiran: %(column)s" ], - "A SQL statement that defines whether the alert should get triggered or not. The query is expected to return either NULL or a number value.": [ - "SQL izraz, ki definira ali naj se opozorilo sproži ali ne. Od poizvedbe se pričakuje, da vrne bodisi NULL bodisi številsko vrednost." + "Operator undefined for aggregator: %(name)s": [ + "Operand ni definiran za agregatorja: %(name)s" ], - "This feature is deprecated and will be removed on 2.0. Take a look at the replacement feature <a href='https://superset.apache.org/docs/installation/alerts-reports'>Alerts & Reports documentation</a>": [ - "Ta funkcija je zastarela in bo odstranjena v verziji 2.0. Oglejte si zamenjavo <a href='https://superset.apache.org/docs/installation/alerts-reports'>Dokumentacija za Opozorila & Poročila</a>" + "Invalid numpy function: %(operator)s": [ + "Neveljavna numpy funkcija: %(operator)s" ], + "User": ["Uporabnik"], + "User Roles": ["Vloge uporabnikov"], + "Database URL": ["URL podatkovne baze"], + "Datasource": ["Podatkovni vir"], + "Roles to grant": ["Vloge za dovoljevanje"], + "Created On": ["Ustvarjeno"], "annotation start time or end time is required.": [ "začetni in končni čas oznake je obvezen." ], @@ -1288,6 +1250,16 @@ "An unknown error occurred. Please contact your Superset administrator": [ "Zgodila se je neznana napaka. Kontaktirajte svojega administratorja za Superset" ], + "Error: permalink state not found": [ + "Napaka: stanje povezave ni najdeno" + ], + "Error: %(msg)s": ["Napaka: %(msg)s"], + "Form data not found in cache, reverting to chart metadata.": [ + "Podatkov ni mogoče najti v predpomnilniku. Uporabljeni bodo metapodatki grafikona." + ], + "Form data not found in cache, reverting to dataset metadata.": [ + "Podatkov ni mogoče najti v predpomnilniku. Uporabljeni bodo metapodatki podatkovnega seta." + ], "[Missing Dataset]": ["[Manjka podatkovni set]"], "alter this ": ["spreminjanje tega "], "chart": ["grafikona"], @@ -1319,23 +1291,15 @@ "Table %(table)s wasn't found in the database %(db)s": [ "Tabela %(table)s ni bila najdena v podatkovni bazi %(db)s" ], - "Can't find User '%(name)s', please ask your admin to create one.": [ - "Uporabnika '%(name)s' ni mogoče najti. Prosite administratorja, da ga ustvari." - ], - "Can't find DruidCluster with cluster_name = '%(name)s'": [ - "Ni mogoče najti DruidCluster s cluster_name = '%(name)s'" - ], + "permalink state not found": ["stanje povezave ni najdeno"], "One or more required fields are missing in the request. Please try again, and if the problem persists conctact your administrator.": [ "Eno ali več zahtevanih polj manjka v zahtevi. Poskusite znova, če težava ostane, kontaktirajte administratorja." ], "The database was not found.": ["Podatkovna baza ni bila najdena."], - "You are not authorized to fetch samples from this table. If you think this is an error, please reach out to your administrator.": [ - "Nimate dovoljenja za pridobitev vzorcev iz te tabele. Če menite, da je to napaka, kontaktirajte administratorja." - ], "Data could not be retrieved from the results backend. You need to re-run the original query.": [ "Podatkov ni bilo mogoče pridobiti iz zalednega sistema rezultatov. Ponovno morate zagnati izvorno poizvedbo." ], - "The query associated with these results could not be find. You need to re-run the original query.": [ + "The query associated with these results could not be found. You need to re-run the original query.": [ "Poizvedbe, povezane s temi rezultati, ni bilo mogoče najti. Ponovno morate zagnati izvorno poizvedbo." ], "You are not authorized to see this query. If you think this is an error, please reach out to your administrator.": [ @@ -1347,9 +1311,6 @@ "The provided `rows` argument is not a valid integer.": [ "Podani argument `rows` ni veljavno celo število." ], - "%(validator)s was unable to check your query.\nPlease recheck your query.\nException: %(ex)s": [ - "%(validator)s ni mogel preveriti vaše poizvedbe.\nPonovno preverite poizvedbo.\nIzjema: %(ex)s" - ], "%(user)s's profile": ["Profil uporabnika: %(user)s"], "Show CSS Template": ["Prikaži CSS predlogo"], "Add CSS Template": ["Dodaj CSS predlogo"], @@ -1366,26 +1327,6 @@ "Custom Plugin": ["Prilagojeni vtičnik"], "Add a Plugin": ["Dodaj vtičnik"], "Edit Plugin": ["Uredi vtičnik"], - "Schedule Email Reports for Dashboards": [ - "Razporedi e-poštna poročila za nadzorne plošče" - ], - "Manage Email Reports for Dashboards": [ - "Upravljaj e-poštna poročila za nadzorne plošče" - ], - "Changed On": ["Spremenjeno"], - "Active": ["Aktiven"], - "Crontab": ["Crontab"], - "Recipients": ["Prejemniki"], - "Slack Channel": ["Slack Channel"], - "Deliver As Group": ["Dostavi kot skupino"], - "Delivery Type": ["Tip dostave"], - "Schedule Email Reports for Charts": [ - "Razporedi e-poštna poročila za grafikone" - ], - "Manage Email Reports for Charts": [ - "Upravljaj e-poštna poročila za grafikone" - ], - "Email Format": ["Oblika e-pošte"], "List Saved Query": ["Seznam shranjenih poizvedb"], "Show Saved Query": ["Prikaži shranjeno poizvedbo"], "Add Saved Query": ["Dodaj shranjeno poizvedbo"], @@ -1448,6 +1389,9 @@ "Name of table to be created from csv data.": [ "Ime tabele, ki bo ustvarjena iz CSV podatkov." ], + "Table name cannot contain a schema": [ + "Ime tabele ne sme vsebovati sheme" + ], "CSV File": ["CSV datoteka"], "Select a CSV file to be uploaded to a database.": [ "Izberite CSV datoteko, ki bo naložena v podatkovno bazo." @@ -1604,9 +1548,6 @@ "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for csv uploads. Please contact your Superset Admin.": [ "Shema \"%(schema_name)s\" podatkovne baze \"%(database_name)s\" ni dovoljena za nalaganje CSV. Kontaktirajte administratorja za Superset." ], - "You cannot specify a namespace both in the name of the table: \"%(csv_table.table)s\" and in the schema field: \"%(csv_table.schema)s\". Please remove one": [ - "Imenskega prostora ni mogoče podati hkrati v tabeli: \"%(csv_table.table)s\" in polju sheme: \"%(csv_table.schema)s\". Odstranite enega" - ], "Unable to upload CSV file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ "CSV datoteke \"%(filename)s\" ni mogoče naložiti v tabelo \"%(table_name)s\" v podatkovni bazi \"%(db_name)s\". Sporočilo napake: %(error_msg)s" ], @@ -1619,9 +1560,6 @@ "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for excel uploads. Please contact your Superset Admin.": [ "Shema \"%(schema_name)s\" podatkovne baze \"%(database_name)s\" ni dovoljena za nalaganje Excel datotek. Kontaktirajte administratorja za Superset." ], - "You cannot specify a namespace both in the name of the table: \"%(excel_table.table)s\" and in the schema field: \"%(excel_table.schema)s\". Please remove one": [ - "Imenskega prostora ni mogoče podati hkrati v tabeli: \"%(excel_table.table)s\" in polju sheme: \"%(excel_table.schema)s\". Odstranite enega" - ], "Unable to upload Excel file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ "Excel datoteke \"%(filename)s\" ni mogoče naložiti v tabelo \"%(table_name)s\" v podatkovni bazi \"%(db_name)s\". Sporočilo napake: %(error_msg)s" ], @@ -1637,9 +1575,6 @@ "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for columnar uploads. Please contact your Superset Admin.": [ "Shema \"%(schema_name)s\" podatkovne baze \"%(database_name)s\" ni dovoljena za nalaganje stolpčnih datotek. Kontaktirajte administratorja za Superset." ], - "You cannot specify a namespace both in the name of the table: \"%(columnar_table.table)s\" and in the schema field: \"%(columnar_table.schema)s\". Please remove one": [ - "Imenskega prostora ni mogoče podati hkrati v imenu tabele: \"%(columnar_table.table)s\" in polju sheme: \"%(columnar_table.schema)s\". Odstranite enega" - ], "Unable to upload Columnar file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ "Stolpčne datoteke \"%(filename)s\" ni mogoče naložiti v tabelo \"%(table_name)s\" v podatkovni bazi \"%(db_name)s\". Sporočilo napake: %(error_msg)s" ], @@ -1656,3568 +1591,3910 @@ "Edit Log": ["Uredi dnevnik"], "Action": ["Aktivnost"], "dttm": ["dttm"], - "Add item": ["Dodaj"], - "The query couldn't be loaded": ["Poizvedbe ni mogoče naložiti"], - "Your query has been scheduled. To see details of your query, navigate to Saved queries": [ - "Vaša poizvedba je v urniku. Za ogled podrobnosti poizvedbe pojdite na shranjene poizvedbe" - ], - "Your query could not be scheduled": [ - "Vaše poizvedbe ni mogoče uvrstiti v urnik" - ], - "Failed at retrieving results": ["Napaka pri pridobivanju rezultatov"], - "An error occurred while storing the latest query id in the backend. Please contact your administrator if this problem persists.": [ - "Pri shranjevanju zadnjega id-ja poizvedbe v sistem je prišlo do napake. Če se težava ponavlja, kontaktirajte administratorja." + "JSON": ["JSON"], + "Time Range": ["Časovno obdobje"], + "Time Column": ["Časovni stolpec"], + "Time Grain": ["Granulacija časa"], + "Origin": ["Izhodišče"], + "Time Granularity": ["Granulacija časa"], + "Time": ["Čas"], + "A reference to the [Time] configuration, taking granularity into account": [ + "Sklic na nastavitve za [Čas], ki upošteva granulacijo" ], - "Unknown error": ["Neznana napaka"], - "Query was stopped.": ["Poizvedba je bila ustavljena."], - "Unable to migrate table schema state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ - "Stanja sheme tabele ni mogoče prenesti v sistem. Superset bo ponovil poskus kasneje. Če se težava ponavlja, kontaktirajte administratorja." + "Aggregate": ["Agregacija"], + "Raw records": ["Surovi podatki"], + "Certified by %s": ["Certificiral/a %s"], + "description": ["opis"], + "bolt": ["vijak"], + "Changing this control takes effect instantly": [ + "Sprememba tega kontrolnika se odrazi takoj" ], - "Unable to migrate query state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ - "Stanja poizvedbe ni mogoče prenesti v sistem. Superset bo ponovil poskus kasneje. Če se težava ponavlja, kontaktirajte administratorja." + "Show info tooltip": ["Prikaži opis orodja"], + "SQL expression": ["SQL izraz"], + "Column name": ["Ime stolpca"], + "Metric name": ["Ime mere"], + "unknown type icon": ["ikona neznanega tipa"], + "function type icon": ["ikona funkcijskega tipa"], + "string type icon": ["ikona znakovnega tipa"], + "numeric type icon": ["ikona numeričnega tipa"], + "boolean type icon": ["ikona binarnega tipa"], + "temporal type icon": ["ikona časovnega tipa"], + "Advanced analytics": ["Napredna analitika"], + "This section contains options that allow for advanced analytical post processing of query results": [ + "Ta sekcija vsebuje možnosti, ki omogočajo napredno analitično poprocesiranje rezultatov poizvedb" ], - "Unable to migrate query editor state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ - "Stanja urejevalnika poizvedb ni mogoče prenesti v sistem. Superset bo ponovil poskus kasneje. Če se težava ponavlja, kontaktirajte administratorja." + "Rolling window": ["Drseče okno"], + "Rolling function": ["Drseča funkcija"], + "None": ["Brez"], + "Defines a rolling window function to apply, works along with the [Periods] text box": [ + "Določi funkcijo drsečega okna. Dela skupaj s tekstovnim okvirjem [Obdobja]" ], - "Unable to add a new tab to the backend. Please contact your administrator.": [ - "Novega zavihka ni mogoče dodati v sistem. Kontaktirajte administratorja." + "Periods": ["Št. period"], + "Defines the size of the rolling window function, relative to the time granularity selected": [ + "Določi velikost funkcije drsečega okna, glede na izbrano granulacijo časa" ], - "Copy of %s": ["Kopija %s"], - "An error occurred while setting the active tab. Please contact your administrator.": [ - "Pri določanju aktivnega zavihka je prišlo do napake. Kontaktirajte administratorja." + "Min periods": ["Min. št. period"], + "The minimum number of rolling periods required to show a value. For instance if you do a cumulative sum on 7 days you may want your \"Min Period\" to be 7, so that all data points shown are the total of 7 periods. This will hide the \"ramp up\" taking place over the first 7 periods": [ + "Minimalno število drsečih obdobij, potrebnih za prikaz vrednosti. Če računate kumulativno vsoto 7-dnevnega obdobja, boste nastavili \"Min. št. period\" na 7. Tako bodo vse prikazane točke skupaj obsegale 7 obdobij. To bo prikrilo rampo, ki bi trajala prvih 7 obdobij" ], - "An error occurred while fetching tab state": [ - "Pri pridobivanju stanja zavihka je prišlo do napake" + "Time comparison": ["Časovna primerjava"], + "Time shift": ["Časovni zamik"], + "Overlay one or more timeseries from a relative time period. Expects relative time deltas in natural language (example: 24 hours, 7 days, 52 weeks, 365 days). Free text is supported.": [ + "Zamaknite eno ali več časovnih vrst za relativno časovno obdobje. Vnaša se relativne časovne razlike v naravnem jeziku (npr. 24 ur, 7 dni, 52 tednov, 365 dni). Prosto besedilo je podprto." ], - "An error occurred while hiding the left bar. Please contact your administrator.": [ - "Pri skrivanju leve vrstice je prišlo do napake. Kontaktirajte administratorja." + "Calculation type": ["Tip izračuna"], + "How to display time shifts: as individual lines; as the difference between the main time series and each time shift; as the percentage change; or as the ratio between series and time shifts.": [ + "Način prikaza časovnih zamikov: kot samostojne črte; kot razlike med osnovno časovno vrsto in vsakim časovnim zamikom; kot procentualna sprememba; kot razmerje med vrsto in časovnim zamikom." ], - "An error occurred while removing tab. Please contact your administrator.": [ - "Pri odstranjevanju zavihka je prišlo do napake. Kontaktirajte administratorja." + "Resample": ["Prevzorči"], + "Rule": ["Pravilo"], + "Pandas resample rule": ["Pravilo za prevzorčenje v Pandas"], + "Fill method": ["Način polnjenja"], + "Pandas resample method": ["Metoda za prevzorčenje v Pandas"], + "Annotations and Layers": ["Oznake in sloji"], + "Chart Title": ["Naslov grafikona"], + "X Axis": ["X os"], + "X Axis Title": ["Naslov X osi"], + "X AXIS TITLE BOTTOM MARGIN": ["SPODNJA OBROBA NASLOVA X OSI"], + "Y Axis": ["Y os"], + "Y Axis Title": ["Naslov Y osi"], + "Y AXIS TITLE MARGIN": ["OBROBA NASLOVA Y OSI"], + "Y AXIS TITLE POSITION": ["POZICIJA NASLOVA Y OSI"], + "Predictive Analytics": ["Prediktivna analitika"], + "Enable forecast": ["Omogoči napoved"], + "Enable forecasting": ["Omogoči napovedovanje"], + "Forecast periods": ["Periode napovedi"], + "How many periods into the future do we want to predict": [ + "Za koliko period v prihodnosti želite napoved" ], - "An error occurred while removing query. Please contact your administrator.": [ - "Pri odstranjevanju poizvedbe je prišlo do napake. Kontaktirajte administratorja." + "Confidence interval": ["Interval zaupanja"], + "Width of the confidence interval. Should be between 0 and 1": [ + "Širina intervala zaupanja. Mora bit med 0 in 1" ], - "An error occurred while setting the tab database ID. Please contact your administrator.": [ - "Pri določanju ID-ja v podatkovne baze za zavihek je prišlo do napake. Kontaktirajte administratorja." + "Should yearly seasonality be applied. An integer value will specify Fourier order of seasonality.": [ + "Če želite letno sezonskost. Celo število določa Fourier-jev red sezonskosti." ], - "An error occurred while setting the tab schema. Please contact your administrator.": [ - "Pri določanju sheme zavihka je prišlo do napake. Kontaktirajte administratorja." + "Should weekly seasonality be applied. An integer value will specify Fourier order of seasonality.": [ + "Če želite tedensko sezonskost. Celo število določa Fourier-jev red sezonskosti." ], - "An error occurred while setting the tab autorun. Please contact your administrator.": [ - "Pri določanju samodejnega zagona zavihka je prišlo do napake. Kontaktirajte administratorja." + "Should daily seasonality be applied. An integer value will specify Fourier order of seasonality.": [ + "Če želite dnevno sezonskost. Celo število določa Fourier-jev red sezonskosti." ], - "An error occurred while setting the tab title. Please contact your administrator.": [ - "Pri določanju naslova zavihka je prišlo do napake. Kontaktirajte administratorja." + "Time related form attributes": ["S časom povezani atributi prikaza"], + "Datasource & Chart Type": ["Tip podatkovnega vira in grafikona"], + "Chart ID": ["ID grafikona"], + "The id of the active chart": ["Identifikator aktivnega grafikona"], + "Cache Timeout (seconds)": ["Trajanje predpomnilnika (sekunde)"], + "The number of seconds before expiring the cache": [ + "Trajanje (v sekundah) do razveljavitve predpomnilnika" ], - "Your query was saved": ["Vaša poizvedba je shranjena"], - "Your query could not be saved": ["Vaše poizvedbe ni mogoče shraniti"], - "Your query was updated": ["Vaša poizvedba je posodobljena"], - "Your query could not be updated": [ - "Vaše poizvedbe ni mogoče posodobiti" + "URL Parameters": ["Parametri URL"], + "Extra url parameters for use in Jinja templated queries": [ + "Dodatni parametri za poizvedbe z Jinja predlogami" ], - "An error occurred while storing your query in the backend. To avoid losing your changes, please save your query using the \"Save Query\" button.": [ - "Pri shranjevanju vaše poizvedbe v sistem je prišlo do napake. Da ne izgubite sprememb, shranite poizvedbo z gumbom \"Shrani poizvedbo\"." + "Extra Parameters": ["Dodatni parametri"], + "Extra parameters that any plugins can choose to set for use in Jinja templated queries": [ + "Dodatni parametri, ki jih lahko uporabi kateri koli vtičnik za poizvedbe z Jinja predlogami" ], - "An error occurred while setting the tab template parameters. Please contact your administrator.": [ - "Pri določanju parametrov predloge zavihka je prišlo do napake. Kontaktirajte administratorja." + "Color Scheme": ["Barvna shema"], + "Dimensions": ["Dimenzije"], + "One or many columns to group by. High cardinality groupings should include a series limit to limit the number of fetched and rendered series.": [ + "Eden ali več stolpcev za združevanje. Združevanje z visoko kardinalnostjo naj vsebuje omejitev serij, s čimer omejite število pridobljenih in prikazanih serij." ], - "An error occurred while fetching table metadata": [ - "Pri pridobivanju metapodatkov tabele je prišlo do napake" + "One or many columns to pivot as columns": [ + "En ali več stolpcev za stolpčno vrtenje" ], - "An error occurred while fetching table metadata. Please contact your administrator.": [ - "Pri pridobivanju metapodatkov tabele je prišlo do napake. Kontaktirajte administratorja." + "Defines the grouping of entities. Each series is shown as a specific color on the chart and has a legend toggle": [ + "Določa združevanje entitet. Vsak niz je na grafikonu prikazan z določeno barvo in ima lahko prikazano legendo" ], - "An error occurred while expanding the table schema. Please contact your administrator.": [ - "Pri širitvi sheme tabele je prišlo do napake. Kontaktirajte administratorja." + "Entity": ["Entiteta"], + "This defines the element to be plotted on the chart": [ + "Določa element, ki bo izrisan na grafikonu" ], - "An error occurred while collapsing the table schema. Please contact your administrator.": [ - "Pri krčenju sheme tabele je prišlo do napake. Kontaktirajte administratorja." + "One or many metrics to display": ["Ena ali več mer za prikaz"], + "Right Axis Metric": ["Mera desne osi"], + "Choose a metric for right axis": ["Izberite mero za desno os"], + "Sort by": ["Razvrščanje"], + "Metric used to define how the top series are sorted if a series or row limit is present. If undefined reverts to the first metric (where appropriate).": [ + "Mera, ki določa kako so razvrščene prve serije, če je določena omejitev serij ali vrstic. Če ni določena, se uporabi prva mera (kjer je ustrezno)." ], - "An error occurred while removing the table schema. Please contact your administrator.": [ - "Pri odstranjevanju sheme tabele je prišlo do napake. Kontaktirajte administratorja." + "Bubble Size": ["Velikost mehurčka"], + "Metric used to calculate bubble size": [ + "Mera za izračun velikosti mehurčkov" ], - "Shared query": ["Deljene poizvedbe"], - "The datasource couldn't be loaded": [ - "Podatkovnega vira ni mogoče naložiti" + "Metric assigned to the [X] axis": ["Mera za [X] os"], + "Metric assigned to the [Y] axis": ["Mera za [Y] os"], + "Color Metric": ["Mera za barvo"], + "A metric to use for color": ["Mera za barvo"], + "The time column for the visualization. Note that you can define arbitrary expression that return a DATETIME column in the table. Also note that the filter below is applied against this column or expression": [ + "Časovni stolpec za vizualizacijo. Določite lahko poljuben izraz, ki vrne DATETIME stolpec v tabeli. Spodnji filter se nanaša na ta stolpec ali izraz" ], - "An error occurred while creating the data source": [ - "Pri ustvarjanju podatkovnega vira je prišlo do težave" + "Drop temporal column here": ["Spustite časovni stolpec sem"], + "Enable dashboard cross filters": [ + "Omogoči medsebojne filtre nadzorne plošče" ], - "An error occurred while fetching function names.": [ - "Pri pridobivanju imen funkcij je prišlo do napake." + "One or many columns to group by. High cardinality groupings should include a sort by metric and series limit to limit the number of fetched and rendered series.": [ + "Eden ali več stolpcev za združevanje. Združevanje z visoko kardinalnostjo naj vsebuje mero za razvrščanje in omjitev serij, s čimer omejite število pridobljenih in prikazanih serij." ], - "SQL Lab uses your browser's local storage to store queries and results.\n Currently, you are using ${currentUsage.toFixed(\r\n 2,\r\n )} KB out of ${LOCALSTORAGE_MAX_USAGE_KB} KB. storage space.\n To keep SQL Lab from crashing, please delete some query tabs.\n You can re-access these queries by using the Save feature before you delete the tab. Note that you will need to close other SQL Lab windows before you do this.": [ - "SQL laboratorij za shranjevanje poizvedb in rezultatov uporablja brskalnikovo lokalno shrambo.\nTrenutno uporabljate ${currentUsage.toFixed(\r\n 2,\r\n )} KB od ${LOCALSTORAGE_MAX_USAGE_KB} KB prostora shrambe.\nDa se izognete sesutju SQL laboratorija, izbrišite nekaj zavihkov s poizvedbami.\nTe poizvedbe lahko ponovno uporabite, tako da jih pred izbrisom shranite. Preden storite to, boste morali zapreti druga okna SQL laboratorija." + "The type of visualization to display": ["Tip vizualizacije za prikaz"], + "Fixed Color": ["Izbrana barva"], + "Use this to define a static color for all circles": [ + "S tem definirate določeno barvo za vse kroge" ], - "Estimate selected query cost": ["Oceni potratnost izbrane poizvedbe"], - "Estimate cost": ["Oceni potratnost"], - "Cost estimate": ["Ocena potratnosti"], - "Creating a data source and creating a new tab": [ - "Ustvarjanje podatkovnega vira in novega zavihka" + "Linear Color Scheme": ["Linearna barvna shema"], + "Defines the origin where time buckets start, accepts natural dates as in `now`, `sunday` or `1970-01-01`": [ + "Določa izhodišče, kadar se začnejo časovni razdelki. Sprejema naravne zapise kot so `zdaj`, `nedelja` ali `1970-01-01`" ], - "An error occurred": ["Prišlo je do napake"], - "Explore the result set in the data exploration view": [ - "Raziščite rezultate v pogledu raziskovanja podatkov" + "The time granularity for the visualization. Note that you can type and use simple natural language as in `10 seconds`, `1 day` or `56 weeks`": [ + "Granulacija časa za vizualizacijo. Uporabite lahko vnos z naravnim jezikom, kot npr. `10 sekund`, `1 dni` ali `56 tednov`" ], - "This query took %s seconds to run, ": [ - "Trajanje poizvedbe v sekundah: %s, " + "The time granularity for the visualization. This applies a date transformation to alter your time column and defines a new time granularity. The options here are defined on a per database engine basis in the Superset source code.": [ + "Granulacija časa za to vizualizacijo. Izvede transformacijo podatkov, ki spremeni vaš časovni stolpec in določi novo časovno granulacija. Ta možnost je definirana na ravni sistema podatkovne baze v izvorni kodi Superseta." ], - "and the explore view times out at %s seconds ": [ - "čas izteka raziskovalnega pogleda v sekundah: %s " + "No filter": ["Brez filtra"], + "The time range for the visualization. All relative times, e.g. \"Last month\", \"Last 7 days\", \"now\", etc. are evaluated on the server using the server's local time (sans timezone). All tooltips and placeholder times are expressed in UTC (sans timezone). The timestamps are then evaluated by the database using the engine's local timezone. Note one can explicitly set the timezone per the ISO 8601 format if specifying either the start and/or end time.": [ + "Časovno obdobje za vizualizacijo. Vsi relativni časi, kot npr. \"Zadnji mesec\", Zadnjih 7 dni\", \"Zdaj\" so izračunani na strežniku z njegovim lokalnim časom. Vsi opisi orodij in časi so izraženi v UTC. Časovne značke se nato izračunajo v podatkovni bazi z njenim lokalnim časovnim pasom. Eksplicitno lahko nastavite časovni pas v ISO 8601 formatu, če določite čas začetka ali konca." ], - "following this flow will most likely lead to your query timing out. ": [ - "s takšnim potekom, bo poizvedba najverjetneje potekla. " + "Row limit": ["Omejitev števila vrstic"], + "Limits the number of rows that get displayed.": [ + "Omeji število vrstic za prikaz." ], - "We recommend your summarize your data further before following that flow. ": [ - "Priporočamo, da zahtevane podatke pred nadaljevanjem strnete. " + "Sort Descending": ["Razvrsti padajoče"], + "Whether to sort descending or ascending": [ + "Če želite padajoče ali naraščajoče razvrščanje" ], - "If activated you can use the ": ["Če je aktivirana, lahko uporabite "], - "feature to store a summarized data set that you can then explore.": [ - "funkcijo shranjevanja strnjenega podatkovnega seta, ki ga lahko raziščete." + "Series limit": ["Omejitev števila serij"], + "Limits the number of series that get displayed. A joined subquery (or an extra phase where subqueries are not supported) is applied to limit the number of series that get fetched and rendered. This feature is useful when grouping by high cardinality column(s) though does increase the query complexity and cost.": [ + "Omeji število časovnih vrst za prikaz. S podpoizvedbo (ali dodatno fazo, kjer podpoizvedbe niso podprte) se omeji število časovnih vrst, ki bodo pridobljene za prikaz. Ta funkcija je uporabna pri združevanju s stolpci z veliko kardinalnostjo, vendar poveča kompleksnost poizvedbe." ], - "Column name(s) ": ["Imena stolpcev "], - "cannot be used as a column name. The column name/alias \"__timestamp\"\r\n is reserved for the main temporal expression, and column aliases ending with\r\n double underscores followed by a numeric value (e.g. \"my_col__1\") are reserved\r\n for deduplicating duplicate column names. Please use aliases to rename the\r\n invalid column names.": [ - "ni mogoče uporabiti kot imena stolpcev. Ime stolpca \"__timestamp\"\r\n je rezervirano za glavni časovni izraz. Imena stolpcev, ki se končajo z\r\n dvojnim podčrtajem, ki mu sledi številska vrednost (npr. \"moj_stolpec__1\") so rezervirana\r\n za deduplikacijo duplikatov imen stolpcev. Za preimenovanje neustreznih imen\r\n uporabite psevdonime." + "Y Axis Format": ["Oblika Y osi"], + "Time format": ["Oblika zapisa časa"], + "The color scheme for rendering chart": [ + "Barvna shema za izris grafikona" ], - "Source SQL": ["Izvorni SQL"], - "Executed SQL": ["Izvedena poizvedba"], - "SQL": ["SQL"], - "No query history yet...": ["Zgodovine poizvedb še ni."], - "An error occurred when refreshing queries": [ - "Pri osveževanju poizvedb je prišlo do napake" + "Truncate Metric": ["Odstrani mero"], + "Whether to truncate metrics": ["Če želite odstraniti naziv mere"], + "Sort descending": ["Razvrsti padajoče"], + "Whether to sort descending or ascending. Takes effect only when \"Sort by\" is set": [ + "Če želite padajoče ali naraščajoče razvrščanje. Učinkuje samo, ko je vključen \"Sort by\"" ], - "It seems you don't have access to any database": [ - "Zdi se, da nimate dostopa do nobene podatkovne baz" + "Show less columns": ["Prikaži manj stolpcev"], + "Show all columns": ["Prikaži vse stolpce"], + "Emit Target": ["Cilj oddajanja"], + "If you wish to specify a different target column than the original column, it can be entered here": [ + "Če želite nastaviti drug ciljni stolpec od izvornega, ga lahko vnesete tukaj" ], - "Filter by user": ["Filtriraj po uporabniku"], - "Filter by database": ["Filtriraj po podatkovni bazi"], - "Query search string": ["Iskalni niz za poizvedbo"], - "[From]-": ["[Od]-"], - "[To]-": ["[Do]-"], - "Filter by status": ["Filtriraj po statusu"], - "Success": ["Uspelo"], - "Failed": ["Ni uspelo"], - "Running": ["V teku"], - "fetching": ["pridobivam"], - "Offline": ["Offline"], - "Scheduled": ["V urniku"], - "Unknown Status": ["Neznan status"], - "Edit": ["Urejanje"], - "View results": ["Ogled rezultatov"], - "Data preview": ["Ogled podatkov"], - "Overwrite text in the editor with a query on this table": [ - "Besedilo v urejevalniku prepišite s poizvedbo na to tabelo" + "D3 format": ["D3 format"], + "Fraction digits": ["Število decimalk"], + "Number of decimal digits to round numbers to": [ + "Število decimalnih mest za zaokroževanje števil" ], - "Run query in a new tab": ["Zaženi poizvedbo v novem zavihku"], - "Remove query from log": ["Odstrani poizvedbo iz dnevnika"], - "An error occurred saving dataset": [ - "Pri shranjevanju podatkovnega seta je prišlo do napake" + "Min Width": ["Min. širina"], + "Default minimal column width in pixels, actual width may still be larger than this if other columns don't need much space": [ + "Privzeta min. širina stolpca v pikslih. Dejanska širina bo lahko večja, če drugi stolpci ne potrebujejo veliko prostora" ], - "Download to CSV": ["Izvozi kot CSV"], - "Copy to Clipboard": ["Kopiraj na odložišče"], - "Filter results": ["Filtriraj rezultate"], - "The number of results displayed is limited to %(rows)d by the configuration DISPLAY_MAX_ROWS. ": [ - "Število prikazanih rezultatov je omejeno na %(rows)d preko parametra DISPLAY_MAX_ROWS. " + "Text align": ["Poravnava besedila"], + "Horizontal alignment": ["Vodoravna poravnava"], + "Left": ["Levo"], + "Center": ["Na sredino"], + "Right": ["Desno"], + "Show cell bars": ["Prikaži stolp. graf v celicah"], + "Whether to display a bar chart background in table columns": [ + "Če želite omogočiti prikaz manjših stolpčnih grafikonov v ozadju stolpcev tabele" ], - "Please add additional limits/filters or download to csv to see more rows up to ": [ - "Dodajte omejitve/filtre ali izvozite csv, če želite videti več vrstic do " + "Align +/-": ["Poravnaj +/-"], + "Whether to align positive and negative values in cell bar chart at 0": [ + "Če želite poravnati pozitivne in negativne vrednosti v stolpčnem grafikonu celic pri 0" ], - "the %(limit)d limit.": ["omejitve %(limit)d ."], - "The number of results displayed is limited to %(rows)d. ": [ - "Število prikazanih rezultatov je omejeno na %(rows)d. " + "Color +/-": ["Barva +/-"], + "Whether to colorize numeric values by if they are positive or negative": [ + "Če želite obarvati številske vrednosti, ko so le-te pozitivne ali negativne" ], - "Please add additional limits/filters, download to csv, or contact an admin ": [ - "Dodajte omejitve/filtre ali izvozite csv oz. kontaktirajte administratorja " + "Small number format": ["Oblika zapisa majhnih števil"], + "D3 number format for numbers between -1.0 and 1.0, useful when you want to have different siginificant digits for small and large numbers": [ + "D3 oblika zapisa za števila med -1.0 in 1.0. Uporabno, če želite različno število števk za majhna in velika števila" ], - "to see more rows up to the %(limit)d limit.": [ - "za prikaz več vrstic, kot je omejitev %(limit)d ." + "D3 format syntax: https://github.com/d3/d3-format": [ + "Sintaksa D3 formata: https://github.com/d3/d3-format" ], - "The number of rows displayed is limited to %(rows)d by the query": [ - "Število prikazanih vrstic je omejeno na %(rows)d s poizvedbo" + "Adaptive formatting": ["Adaptivno oblikovanje"], + "Duration in ms (66000 => 1m 6s)": ["Trajanje v ms (66000 => 1m 6s)"], + "Duration in ms (1.40008 => 1ms 400µs 80ns)": [ + "Trajanje v ms (1.40008 => 1ms 400µs 80ns)" ], - "The number of rows displayed is limited to %(rows)d by the limit dropdown.": [ - "Število prikazanih rezultatov je omejeno na %(rows)d s poizvedbo." + "D3 time format syntax: https://github.com/d3/d3-time-format": [ + "Sintaksa D3 časovnega formata:: https://github.com/d3/d3-time-format" ], - "The number of rows displayed is limited to %(rows)d by the query and limit dropdown.": [ - "Število prikazanih vrstic je omejeno na %(rows)d s poizvedbo in spustnim izbirnikom omejitev." + "No results were returned for this query. If you expected results to be returned, ensure any filters are configured properly and the datasource contains data for the selected time range.": [ + "Poizvedba ni vrnila rezultatov. Če ste pričakovali rezultate, poskrbite, da so filtri pravilno nastavljeni in podatkovni vir vsebuje podatke za izbrano časovno obdobje." ], - "%(rows)d rows returned": ["%(rows)d vrnjenih vrstic"], - "The number of rows displayed is limited to %s by the dropdown.": [ - "Število prikazanih vrstic je omejeno na %s s spustnim izbirnikom." + "No Results": ["Ni rezultatov"], + "Found invalid orderby options": [ + "Najdene so neveljavne možnosti razvrščanja" ], - "Query was stopped": ["Poizvedba je bila ustavljena"], - "Database error": ["Napaka podatkovne baze"], - "was created": ["ustvarjeno"], - "Query in a new tab": ["Poizvedba v novem zavihku"], - "The query returned no data": ["Poizvedba ni vrnila podatkov"], - "Fetch data preview": ["Pridobi predogled podatkov"], - "Refetch results": ["Ponovno pridobi rezultate"], - "Track job": ["Sledi opravilom"], - "Stop": ["Ustavi"], - "Run selection": ["Zaženi izbrano"], - "Run": ["Zaženi"], - "Stop running (Ctrl + x)": ["Ustavi (Ctrl + x)"], - "Stop running (Ctrl + e)": ["Ustavi (Ctrl + e)"], - "Run query (Ctrl + Return)": ["Zaženi poizvedbo (Ctrl + Return)"], - "Save & Explore": ["Shrani & Razišči"], - "Overwrite & Explore": ["Prepiši & Razišči"], - "Undefined": ["Ni definirano"], - "Save": ["Shrani"], - "Save as": ["Shrani kot"], - "Save query": ["Shrani poizvedbo"], - "Save as new": ["Shrani kot novo"], - "Update": ["Posodobi"], - "Label for your query": ["Ime vaše poizvedbe"], - "Write a description for your query": ["Dodajte opis vaše poizvedbe"], - "Schedule query": ["Urnik poizvedb"], - "Schedule": ["Urnik"], - "There was an error with your request": [ - "Pri zahtevi je prišlo do napake" + "is expected to be an integer": ["pričakovano je celo število"], + "is expected to be a number": ["pričakovano je število"], + "cannot be empty": ["ne sme biti prazno"], + "Query": ["Poizvedba"], + "Domain": ["Domena"], + "The time unit used for the grouping of blocks": [ + "Časovna enota za združevanje blokov" ], - "Please save the query to enable sharing": [ - "Shranite poizvedbo za deljenje" + "Subdomain": ["Poddomena"], + "The time unit for each block. Should be a smaller unit than domain_granularity. Should be larger or equal to Time Grain": [ + "Časovna enota za vsak blok. Mora biti manjša enota kot domenska_granulacija. Mora biti večja ali enaka Granulaciji časa" ], - "Copy query link to your clipboard": [ - "Kopiraj povezavo do poizvedbe v odložišče" + "Chart Options": ["Možnosti grafikona"], + "Cell Size": ["Velikost celice"], + "The size of the square cell, in pixels": [ + "Velikost kvadratne celice v pikslih" ], - "Save the query to enable this feature": [ - "Za omogočenje te funkcije shranite poizvedbo" + "Cell Padding": ["Razmak med celicami"], + "The distance between cells, in pixels": [ + "Razdalja med celicami v pikslih" ], - "Copy link": ["Kopiraj povezavo"], - "No stored results found, you need to re-run your query": [ - "Rezultatov še ni shranjenih, ponovno morate zagnati poizvedbo" + "Cell Radius": ["Polmer celice"], + "The pixel radius": ["Polmer piksla"], + "Color Steps": ["Barvni koraki"], + "The number color \"steps\"": ["Število barvnih korakov"], + "Time Format": ["Oblika zapisa časa"], + "Legend": ["Legenda"], + "Whether to display the legend (toggles)": [ + "Preklapljanje prikaza legende" ], - "Run a query to display results here": [ - "Za prikaz rezultatov morate zagnati poizvedbo" + "Show Values": ["Pokaži vrednosti"], + "Whether to display the numerical values within the cells": [ + "Če želite v celicah prikazati numerične vrednosti" ], - "Preview: `%s`": ["Predogled: `%s`"], - "Results": ["Rezultati"], - "Query history": ["Zgodovina poizvedb"], - "Run query": ["Zaženi poizvedbo"], - "New tab": ["Nov zavihek"], - "Untitled query": ["Neimenovana poizvedba"], - "Stop query": ["Ustavi poizvedbo"], - "Schedule the query periodically": ["Periodično zaganjaj poizvedbo"], - "You must run the query successfully first": [ - "Najprej morate uspešno izvesti poizvedbo" + "Show Metric Names": ["Pokaži imena mer"], + "Whether to display the metric name as a title": [ + "Če želite prikazati ime mere kot naslov" ], - "Autocomplete": ["Samodokončaj"], - "CREATE TABLE AS": ["CREATE TABLE AS"], - "CREATE VIEW AS": ["CREATE VIEW AS"], - "Estimate the cost before running a query": [ - "Oceni potratnost pred zagonom poizvedbe" + "Number Format": ["Oblika zapisa števila"], + "Correlation": ["Korelacija"], + "Visualizes how a metric has changed over a time using a color scale and a calendar view. Gray values are used to indicate missing values and the linear color scheme is used to encode the magnitude of each day's value.": [ + "Prikaže kako se je mera spreminjala s časom s pomočjo barvne lestvice in koledarskega pogleda. Sive vrednosti ponazarjajo manjkajoče vrednosti. Amplituda dnevnih vrednosti je ponazorjena z linearno barvno shemo." ], - "${isActive ? 'Collapse' : 'Expand'} table preview": [ - "${isActive ? 'Collapse' : 'Expand'} predogled tabele" + "Business": ["Aktivnost"], + "Comparison": ["Primerjava"], + "Intensity": ["Intenzivnost"], + "Pattern": ["Vzorec"], + "Report": ["Poročilo"], + "Trend": ["Trend"], + "Sort by metric": ["Mera za razvrščanje"], + "Whether to sort results by the selected metric in descending order.": [ + "Če želite padajoče razvrstiti rezultate z izbrano mero." ], - "Reset state": ["Ponastavi stanje"], - "Enter a new title for the tab": ["Vnesite novo naslov zavihka"], - "Untitled Query %s": ["Neimenovana poizvedba %s"], - "Close tab": ["Zapri zavihek"], - "Rename tab": ["Preimenuj zavihek"], - "Expand tool bar": ["Razširi orodno vrstico"], - "Hide tool bar": ["Skrij orodno vrstico"], - "Close all other tabs": ["Zapri vse ostale zavihke"], - "Duplicate tab": ["Podvoji zavihek"], - "New tab (Ctrl + q)": ["Nov zavihek (Ctrl + q)"], - "New tab (Ctrl + t)": ["Nov zavihek (Ctrl + t)"], - "Copy partition query to clipboard": [ - "Kopiraj particijsko poizvedbo na odložišče" + "Number format": ["Oblika zapisa števila"], + "Choose a number format": ["Izberite obliko zapisa števila"], + "Source": ["Izvor"], + "Choose a source": ["Izberite izvor"], + "Target": ["Cilj"], + "Choose a target": ["Izberite cilj"], + "Flow": ["Potek"], + "Showcases the flow or link between categories using thickness of chords. The value and corresponding thickness can be different for each side.": [ + "Prikaže potek ali povezave med kategorijami z debelino tetiv. Vrednost in debelina sta lahko različni za vsako stran." ], - "latest partition:": ["zadnja particija:"], - "Keys for table": ["Ključi za tabele"], - "View keys & indexes (%s)": ["Ogled ključev in indeksov (%s)"], - "Original table column order": ["Vrstni red stolpcev izvorne tabele"], - "Sort columns alphabetically": ["Razvrsti stolpce po abecedi"], - "Copy SELECT statement to the clipboard": [ - "Kopiraj stavek SELECT na odložišče" + "Relationships between community channels": [ + "Razmerja med skupnostnimi kanali" ], - "Show CREATE VIEW statement": ["Prikaži CREATE VIEW stavek"], - "CREATE VIEW statement": ["CREATE VIEW stavek"], - "Remove table preview": ["Odstrani predogled tabele"], - "Edit template parameters": ["Uredi parametre predloge"], - "Invalid JSON": ["Neveljaven JSON"], - "Create a new chart": ["Ustvari nov grafikon"], - "Choose a dataset": ["Izberite podatkovni set"], - "Dataset": ["Podatkovni set"], - "Instructions to add a dataset are available in the Superset tutorial.": [ - "Navodila za dodajanje podatkovnega seta so v vodiču za Superset." + "Chord Diagram": ["Tetivni grafikon"], + "Aesthetic": ["Estetika"], + "Circular": ["Krožno"], + "Legacy": ["Staro"], + "Proportional": ["Proporcionalno"], + "Relational": ["Relacijsko"], + "Country": ["Država"], + "Which country to plot the map for?": [ + "Za katero državo želite grafikon?" ], - "Choose chart type": ["Izberite tip grafikona"], - "Please select both a Dataset and a Chart type to proceed": [ - "Za nadaljevanje izberite podatkovni set in tip grafikona" + "ISO 3166-2 Codes": ["Oznake po ISO 3166-2"], + "Column containing ISO 3166-2 codes of region/province/department in your table.": [ + "Stolpec, ki vsebuje ISO 3166-2 oznake regij/provinc/departmajev v vaši tabeli." + ], + "Metric to display bottom title": ["Mera za prikaz spodnjega naslova"], + "Map": ["Zemljevid"], + "Visualizes how a single metric varies across a country's principal subdivisions (states, provinces, etc) on a chloropleth map. Each subdivision's value is elevated when you hover over the corresponding geographic boundary.": [ + "Prikaže kako se posamezna mera spreminja glede na območja države (dežele, province, itd.) na kloropletnem zemljevidu. Vsak podrazdelek se dvigne, ko z miško preidete mejo njegovega območja." + ], + "2D": ["2D"], + "Geo": ["Geo"], + "Range": ["Doseg"], + "Stacked": ["Naložen"], + "Sorry, there appears to be no data": ["Ni podatkov"], + "Event definition": ["Definicija dogodka"], + "Event Names": ["Imena dogodkov"], + "Columns to display": ["Stolpci za prikaz"], + "Order by entity id": ["Uredi po ID entitete"], + "Important! Select this if the table is not already sorted by entity id, else there is no guarantee that all events for each entity are returned.": [ + "Pomembno! Izberite, če tabela še ni razvrščena po ID entitete, v nasprotnem primeru ni nujno, da bodo vrnjeni vsi dogodki za posamezno entiteto." + ], + "Minimum leaf node event count": ["Min. število dogodkov za list"], + "Leaf nodes that represent fewer than this number of events will be initially hidden in the visualization": [ + "Listna vozlišča, ki predstavljajo manjše število dogodkov od te vrednosti, bodo v vizualizaciji skrita" + ], + "Additional metadata": ["Dodatni metapodatki"], + "Metadata": ["Metapodatki"], + "Select any columns for metadata inspection": [ + "Izberite poljubne stolpce za pregled metapodatkov" + ], + "Entity ID": ["ID entitete"], + "e.g., a \"user id\" column": ["t.j. stolpec \"id uporabnika\""], + "Max Events": ["Max. dogodkov"], + "The maximum number of events to return, equivalent to the number of rows": [ + "Največje število dogodkov, ki bodo vrnjeni - enako številu vrstic" + ], + "Compares the lengths of time different activities take in a shared timeline view.": [ + "Primerja dolžine časovno različnih aktivnosti na skupni časovnici." + ], + "Event Flow": ["Potek dogodkov"], + "Progressive": ["Progresivno"], + "Axis ascending": ["Naraščajoča os"], + "Axis descending": ["Padajoča os"], + "Metric ascending": ["Naraščajoča mera"], + "Metric descending": ["Padajoča mera"], + "Heatmap Options": ["Možnosti toplotnega prikaza"], + "XScale Interval": ["Interval X-osi"], + "Number of steps to take between ticks when displaying the X scale": [ + "Število korakov med oznakami pri prikazu X-osi" + ], + "YScale Interval": ["Interval Y-osi"], + "Number of steps to take between ticks when displaying the Y scale": [ + "Število korakov med oznakami pri prikazu Y-osi" + ], + "Rendering": ["Izris"], + "image-rendering CSS attribute of the canvas object that defines how the browser scales up the image": [ + "atribut CSS za izris objekta platna, ki določa, kako brskalnik poveča sliko" + ], + "Normalize Across": ["Normiraj glede na"], + "Color will be rendered based on a ratio of the cell against the sum of across this criteria": [ + "Barva bo prikazana na osnovi razmerja med celico in vsoto glede na ta kriterij" + ], + "Left Margin": ["Levi rob"], + "Left margin, in pixels, allowing for more room for axis labels": [ + "Levi rob, v pikslih, s katerim povečamo prostor za oznake osi" + ], + "Bottom Margin": ["Spodnji rob"], + "Bottom margin, in pixels, allowing for more room for axis labels": [ + "Spodnji rob, v pikslih, s katerim povečamo prostor za oznake osi" + ], + "Value bounds": ["Meje vrednosti"], + "Hard value bounds applied for color coding. Is only relevant and applied when the normalization is applied against the whole heatmap.": [ + "Mejne vrednosti za barvno lestvico. Upošteva se le, če je normiranje uporabljeno glede na celotni toplotni prikaz." + ], + "Sort X Axis": ["Razvrsti X-os"], + "Sort Y Axis": ["Razvrsti Y-os"], + "Show percentage": ["Prikaži procente"], + "Whether to include the percentage in the tooltip": [ + "Če želite prikaz procentov v opisu orodja" + ], + "Normalized": ["Normiran"], + "Whether to apply a normal distribution based on rank on the color scale": [ + "Če želite uporabiti normalno porazdelitev glede na stopnjo na barvni lestvici" + ], + "Value Format": ["Oblika zapisa vrednosti"], + "Visualize a related metric across pairs of groups. Heatmaps excel at showcasing the correlation or strength between two groups. Color is used to emphasize the strength of the link between each pair of groups.": [ + "Vizualizacija povezanih mer med pari skupin." + ], + "Sizes of vehicles": ["Velikosti vozil"], + "Employment and education": ["Zaposlitev in izobrazba"], + "Density": ["Gostota"], + "Predictive": ["Prediktivno"], + "Single Metric": ["Ena mera"], + "count": ["število"], + "cumulative": ["kumulativno"], + "percentile (exclusive)": ["percentil (ekskluzivno)"], + "Select the numeric columns to draw the histogram": [ + "Izberite numerične stolpce za izris histograma" + ], + "No of Bins": ["Št. razdelkov"], + "Select the number of bins for the histogram": [ + "Izberite število razdelkov za histogram" + ], + "X Axis Label": ["Naslov X osi"], + "Y Axis Label": ["Naslov Y osi"], + "Whether to normalize the histogram": ["Če želite normirati histogram"], + "Cumulative": ["Kumulativno"], + "Whether to make the histogram cumulative": [ + "Če želite kumulativni histogram" + ], + "Distribution": ["Porazdelitev"], + "Take your data points, and group them into \"bins\" to see where the densest areas of information lie": [ + "Vzame podatkovne točke in jih razporedi v razdelke, kjer se vidi območja z največjo gostoto informacij" + ], + "Population age data": ["Podatki starosti populacije"], + "Contribution": ["Prispevek"], + "Compute the contribution to the total": ["Izračunaj prispevek k celoti"], + "Series Height": ["Višina serije"], + "Pixel height of each series": ["Višina vsake serije v pikslih"], + "Value Domain": ["Domena vrednosti"], + "series: Treat each series independently; overall: All series use the same scale; change: Show changes compared to the first data point in each series": [ + "serije: Obravnavaj vsako podatkovno serijo neodvisno; skupno: Vse vrste uporabljajo enako skalo; razlika: Pokaži razlike glede na prvo točko vsake serije" + ], + "Compares how a metric changes over time between different groups. Each group is mapped to a row and change over time is visualized bar lengths and color.": [ + "Primerja kako se mera spreminja s časom med različnimi skupinami. Vsaka skupina predstavlja eno vrstico, časovne spremembe pa so prikazane z dolžino stolpcev in barvami." + ], + "Horizon Chart": ["Horizontni grafikon"], + "Longitude": ["Dolžina"], + "Column containing longitude data": [ + "Stolpec s podatki zemljepisne dolžine" + ], + "Latitude": ["Širina"], + "Column containing latitude data": [ + "Stolpec s podatki zemljepisne širine" + ], + "Clustering Radius": ["Radij gručenja"], + "The radius (in pixels) the algorithm uses to define a cluster. Choose 0 to turn off clustering, but beware that a large number of points (>1000) will cause lag.": [ + "Radij (v pikslih), s katerim algoritem definira gručo. Izberite 0 za izklop gručenja - veliko število točk (>1000) bo povzročilo upočasnitev." + ], + "Points": ["Točke"], + "Point Radius": ["Radij točk"], + "The radius of individual points (ones that are not in a cluster). Either a numerical column or `Auto`, which scales the point based on the largest cluster": [ + "Radij posameznih točk (tistih, ki niso v gruči). Numerični stolpec ali `Auto` (skalira točke na osnovi največje gruče)" + ], + "Point Radius Unit": ["Enota radija točk"], + "The unit of measure for the specified point radius": [ + "Enota merila za definiran radij točk" + ], + "Labelling": ["Oznake"], + "label": ["oznaka"], + "`count` is COUNT(*) if a group by is used. Numerical columns will be aggregated with the aggregator. Non-numerical columns will be used to label points. Leave empty to get a count of points in each cluster.": [ + "`število` je COUNT(*), če je uporabljeno združevanje (group by). Numerični stolpci bodo agregirani z agregatorjem. Ne-numerični stolpci, bodo uporabljeni za oznake točk. Pustite prazno, da dobite število točk v posamezni gruči." + ], + "Cluster label aggregator": ["Agregator za oznako gruče"], + "Aggregate function applied to the list of points in each cluster to produce the cluster label.": [ + "Agregacijska funkcija za seznam točk v vsaki gruči, s katero se ustvari oznaka gruče." + ], + "Visual Tweaks": ["Nastavitve izgleda"], + "Live render": ["Sprotni izris"], + "Points and clusters will update as the viewport is being changed": [ + "Točke in gruče se bodo posodabljale, če se bo spremenil pogled" + ], + "Map Style": ["Slog zemljevida"], + "Base layer map style": ["Slog osnovnega sloja zemljevida"], + "Opacity": ["Prosojnost"], + "Opacity of all clusters, points, and labels. Between 0 and 1.": [ + "Prosojnost vseh gruč, točk in oznak (vrednost med 0 in 1)." + ], + "RGB Color": ["RGB barva"], + "The color for points and clusters in RGB": [ + "Barva točk in gruč v RGB zapisu" + ], + "Viewport": ["Pogled"], + "Default longitude": ["Privzeta dolžina"], + "Longitude of default viewport": ["Dolžina privzetega pogleda"], + "Default latitude": ["Privzeta širina"], + "Latitude of default viewport": ["Širina privzetega pogleda"], + "Zoom": ["Povečava"], + "Zoom level of the map": ["Stopnja povečave zemljevida"], + "One or many controls to group by. If grouping, latitude and longitude columns must be present.": [ + "Eden ali več kontrolnikov za združevanje. Pri združevanju morata biti prisotna stolpca širine in dolžine." + ], + "Light mode": ["Svetli način"], + "Dark mode": ["Temni način"], + "MapBox": ["MapBox"], + "Scatter": ["Raztreseni"], + "Transformable": ["Prilagodljiv"], + "Significance Level": ["Stopnja značilnosti"], + "Threshold alpha level for determining significance": [ + "Mejna vrednost alfa za določanje značilnosti" + ], + "p-value precision": ["točnost p-vrednosti"], + "Number of decimal places with which to display p-values": [ + "Število decimalnih mest za prikaz p-vrednosti" + ], + "Lift percent precision": ["Točnost procentualnega dviga"], + "Number of decimal places with which to display lift values": [ + "Število decimalnih mest za prikaz vrednosti dviga" + ], + "Table that visualizes paired t-tests, which are used to understand statistical differences between groups.": [ + "Tabela, ki prikazuje uparjene t-teste, ki se uporabljajo za prikaz statističnih razlik med skupinami." + ], + "Paired t-test Table": ["Tabela t-testa za odvisne vzorce"], + "Statistical": ["Statistično"], + "Tabular": ["Tabelarično"], + "Options": ["Možnosti"], + "Data Table": ["Tabela podatkov"], + "Whether to display the interactive data table": [ + "Če želite prikaz interaktivne podatkovne tabele" + ], + "Include Series": ["Vključi serijo"], + "Include series name as an axis": [ + "Vključi ime podatkovne serije v naslov osi" + ], + "Ranking": ["Rangiranje"], + "Plots the individual metrics for each row in the data vertically and links them together as a line. This chart is useful for comparing multiple metrics across all of the samples or rows in the data.": [ + "Izriše posamezne mere za vsako vrstico podatkov navpično in jih med seboj poveže kot črto. Grafikon je uporaben za primerjavo več mer med vsemi vzorci ali vrsticami podatkov." + ], + "Coordinates": ["Koordinate"], + "Directional": ["Usmerjeni"], + "Time Series Options": ["Možnosti časovne vrste"], + "Not Time Series": ["Ni časovna vrsta"], + "Ignore time": ["Ne upoštevaj časa"], + "Time Series": ["Časovna vrsta"], + "Standard time series": ["Standardna časovna vrsta"], + "Aggregate Mean": ["Agregirano povprečje"], + "Mean of values over specified period": [ + "Povprečna vrednost v dani periodi" + ], + "Aggregate Sum": ["Agregirana vsota"], + "Sum of values over specified period": ["Vsota vrednosti v dani periodi"], + "Difference": ["Razlika"], + "Metric change in value from `since` to `until`": [ + "Sprememba mere od vrednosti \"OD\" do \"DO\"" + ], + "Percent Change": ["Procentualna sprememba"], + "Metric percent change in value from `since` to `until`": [ + "Procentualna sprememba mere od vrednosti \"OD\" do \"DO\"" + ], + "Factor": ["Faktor"], + "Metric factor change from `since` to `until`": [ + "Sprememba faktorja mere od vrednosti \"OD\" do \"DO\"" + ], + "Advanced Analytics": ["Napredna analitika"], + "Use the Advanced Analytics options below": [ + "Uporabite spodnje možnosti napredne analitike" + ], + "Settings for time series": ["Nastavitve časovne vrste"], + "Date Time Format": ["Oblika zapisa Datum-Časa"], + "Partition Limit": ["Omejitev particij"], + "The maximum number of subdivisions of each group; lower values are pruned first": [ + "Največje število podrazdelkov posamezne skupine; nižje vrednosti so zanemarjene prve" + ], + "Partition Threshold": ["Prag particije"], + "Partitions whose height to parent height proportions are below this value are pruned": [ + "Particije z nižjim razmerjem med njihovo višino in dolžino starša so zanemarjene" + ], + "Log Scale": ["Logaritemska skala"], + "Use a log scale": ["Uporabi logaritemsko skalo"], + "Equal Date Sizes": ["Enaki datumi"], + "Check to force date partitions to have the same height": [ + "Če želite, da imajo datumske particije enako višino" + ], + "Rich Tooltip": ["Podroben opis orodja"], + "The rich tooltip shows a list of all series for that point in time": [ + "Podroben opis orodja prikaže seznam vseh podatkovnih serij za posamezno časovno točko" + ], + "Rolling Window": ["Drseče okno"], + "Rolling Function": ["Drseča funkcija"], + "Min Periods": ["Min. št. period"], + "Time Comparison": ["Časovna primerjava"], + "Time Shift": ["Časovni zamik"], + "Method": ["Metoda"], + "Part of a Whole": ["Del celote"], + "Compare the same summarized metric across multiple groups.": [ + "Primerja isto mero med različnimi skupinami." ], - "Create new chart": ["Ustvari nov grafikon"], - "An error occurred while loading the SQL": [ - "Pri nalaganju SQL je prišlo do napake" + "Partition Chart": ["Grafikon razdelkov"], + "Categorical": ["Kategorični"], + "Pivot Options": ["Vrtilne možnosti"], + "Aggregation function": ["Agregacijska funkcija"], + "Aggregate function to apply when pivoting and computing the total rows and columns": [ + "Agregacijska funkcija za vrtenje in izračun vseh vrstic in stolpcev" ], - "Updating chart was stopped": [ - "Posodabljanje grafikona je bilo ustavljeno" + "Show totals": ["Pokaži vsote"], + "Display total row/column": ["Pokaži vsote vrstic/stolpcev"], + "Combine Metrics": ["Združuj mere"], + "Display metrics side by side within each column, as opposed to each column being displayed side by side for each metric.": [ + "Prikazuj mere eno ob drugi ob vsakem stolpcu, drugače je vsak stolpec prikazan en ob drugem za vsako mero." ], - "An error occurred while rendering the visualization: %s": [ - "Pri prikazovanju vizualizacije je prišlo do napake: %s" + "Transpose Pivot": ["Transponirano vrtenje"], + "Swap Groups and Columns": ["Zamenjaj Skupine in Stolpce"], + "Date format": ["Oblika zapisa datuma"], + "Used to summarize a set of data by grouping together multiple statistics along two axes. Examples: Sales numbers by region and month, tasks by status and assignee, active users by age and location.\n\n This chart is being deprecated and we recommend checking out Pivot Table V2 instead!": [ + "Uporablja se za predstavitev podatkov z združevanjem različnih statistik na dveh oseh. Npr. Prodaja po regijah in mesecih, Naloge po statusih in izvajalcih, aktivni uporabniki po starosti in lokaciji.\n\n Ta grafikon se opušča. Priporočamo uporabo Vrtilne tabele V2!" ], - "Network error.": ["Napaka omrežja."], - "Click to see difference": ["Kliknite za prikaz razlike"], - "Altered": ["Spremenjeno"], - "Chart changes": ["Spremembe grafikona"], - "Superset chart": ["Superset grafikon"], - "Check out this chart in dashboard:": [ - "Preizkusite ta grafikon v nadzorni plošči:" + "Use Area Proportions": ["Uporabi razmerje površin"], + "Check if the Rose Chart should use segment area instead of segment radius for proportioning": [ + "Če želite, da grafikon \"Rose\" uporablja površino segmenta namesto radija za proporcioniranje" ], - "Select ...": ["Izberite ..."], - "Loaded data cached": ["Podatki so naloženi v predpomnilnik"], - "Loaded from cache": ["Naloženo iz predpomnilnika"], - "Click to force-refresh": ["Kliknite za prisilno osvežitev"], - "cached": ["predpomnjen"], - "Certified by %s": ["Certificiral/a %s"], - "Copy to clipboard": ["Kopiraj na odložišče"], - "Copied to clipboard!": ["Kopirano na odložišče!"], - "Sorry, your browser does not support copying. Use Ctrl / Cmd + C!": [ - "Vaš brskalnik ne podpira kopiranja. Uporabite Ctrl / Cmd + C!" + "A polar coordinate chart where the circle is broken into wedges of equal angle, and the value represented by any wedge is illustrated by its area, rather than its radius or sweep angle.": [ + "Grafikon s polarnimi koordinatami, kjer je krog razdeljen na enakokotne izseke, vrednosti pa so ponazorjene s ploščino izseka (namesto polmera ali kota)." ], - "every": ["vsak"], - "every month": ["vsak mesec"], - "every day of the month": ["vsak dan v mesecu"], - "day of the month": ["dan v mesecu"], - "every day of the week": ["vsak dan v tednu"], - "day of the week": ["dan v tednu"], - "every hour": ["vsako uro"], - "every minute": ["vsako minuto"], - "year": ["leto"], - "month": ["mesec"], - "week": ["teden"], - "day": ["dan"], - "hour": ["ura"], - "minute": ["minuta"], - "reboot": ["ponovni zagon"], - "Every": ["Vsak"], - "in": ["v"], - "on": ["v"], - "and": ["in"], - "at": ["ob"], - ":": [":"], - "minute(s)": ["minuta/e"], - "Invalid cron expression": ["Neveljaven cron izraz"], - "Clear": ["Počisti"], - "Sunday": ["Nedelja"], - "Monday": ["Ponedeljek"], - "Tuesday": ["Torek"], - "Wednesday": ["Sreda"], - "Thursday": ["Četrtek"], - "Friday": ["Petek"], - "Saturday": ["Sobota"], - "January": ["Januar"], - "February": ["Februar"], - "March": ["Marec"], - "April": ["April"], - "May": ["Maj"], - "June": ["Junij"], - "July": ["Julij"], - "August": ["Avgust"], - "September": ["September"], - "October": ["Oktober"], - "November": ["November"], - "December": ["December"], - "SUN": ["NED"], - "MON": ["PON"], - "TUE": ["TOR"], - "WED": ["SRE"], - "THU": ["ČET"], - "FRI": ["PET"], - "SAT": ["SOB"], - "JAN": ["JAN"], - "FEB": ["FEB"], - "MAR": ["MAR"], - "APR": ["APR"], - "MAY": ["MAJ"], - "JUN": ["JUN"], - "JUL": ["JUL"], - "AUG": ["AVG"], - "SEP": ["SEP"], - "OCT": ["OKT"], - "NOV": ["NOV"], - "DEC": ["DEC"], - "There was an error loading the schemas": ["Napaka pri nalaganju shem"], - "Select database or type database name": [ - "Izberite ali vnesite ime podatkovne baze" + "Nightingale Rose Chart": ["Nightingale Rose grafikon"], + "Advanced-Analytics": ["Napredna analitika"], + "Multi-Layers": ["Večplastni"], + "Source / Target": ["Izhodišče/Cilj"], + "Choose a source and a target": ["Izberite izhodišče in cilj"], + "Limiting rows may result in incomplete data and misleading charts. Consider filtering or grouping source/target names instead.": [ + "Omejitev vrstic lahko povzroči nepopolne podatke in zavajajoč grafikon. Premislite o uporabi filtriranja ali združevanja imen izvorov/ciljev." ], - "Force refresh schema list": ["Osveži seznam shem"], - "Select schema or type schema name": ["Izberite ali vnesite ime sheme"], - "Warning! Changing the dataset may break the chart if the metadata does not exist.": [ - "Opozorilo! Sprememba podatkovnega seta lahko pokvari grafikon, če metapodatki ne obstajajo." + "Visualizes the flow of different group's values through different stages of a system. New stages in the pipeline are visualized as nodes or layers. The thickness of the bars or edges represent the metric being visualized.": [ + "Prikaže potek vrednosti različnih skupin na različnih nivojih sistema. Novi nivoji so prikazani kot točke ali plasti. Debelina stolpcev ali povezav predstavlja prikazano mero." ], - "Changing the dataset may break the chart if the chart relies on columns or metadata that does not exist in the target dataset": [ - "Sprememba podatkovnega seta lahko pokvari grafikon, če se le-ta zanaša na stolpce ali metapodatke, ki ne obstajajo v ciljnem podatkovnem nizu" + "Demographics": ["Demografija"], + "Survey Responses": ["Rezultati anket"], + "Sankey Diagram": ["Sankey grafikon"], + "Percentages": ["Procenti"], + "Sankey Diagram with Loops": ["Sankey grafikon z zankami"], + "Primary Metric": ["Primarna mera"], + "The primary metric is used to define the arc segment sizes": [ + "Primarna mera določa velikost lokov segmentov" ], - "dataset": ["podatkovni set"], - "Connection": ["Povezava"], - "Change dataset": ["Spremeni podatkovni set"], - "Warning!": ["Opozorilo!"], - "Search / Filter": ["Iskanje / Filter"], - "Physical (table or view)": ["Fizičen (tabela ali pogled)"], - "Virtual (SQL)": ["Virtualen (SQL)"], - "SQL expression": ["SQL izraz"], - "Data type": ["Tip podatka"], - "Datetime format": ["Oblika datum-časa"], - "The pattern of timestamp format. For strings use ": [ - "Vzorec zapisa časovne značke. Za znakovne nize uporabite " + "Secondary Metric": ["Sekundarna mera"], + "[optional] this secondary metric is used to define the color as a ratio against the primary metric. When omitted, the color is categorical and based on labels": [ + "[opcijsko] sekundarna mera določa barvo kot razmerje do primarne mere. Če je izpuščena, je barva določena kategorično na podlagi oznak" ], - "Python datetime string pattern": ["Pythonov vzorec zapisa datum-časa"], - " expression which needs to adhere to the ": [" , ki mora upoštevati "], - "ISO 8601": ["ISO 8601"], - " standard to ensure that the lexicographical ordering\r\n coincides with the chronological ordering. If the\r\n timestamp format does not adhere to the ISO 8601 standard\r\n you will need to define an expression and type for\r\n transforming the string into a date or timestamp. Note\r\n currently time zones are not supported. If time is stored\r\n in epoch format, put `epoch_s` or `epoch_ms`. If no pattern\r\n is specified we fall back to using the optional defaults on a per\r\n database/column name level via the extra parameter.": [ - " standard, ki zagotavlja, de se leksikografsko razvrščanje\r\n sklada s kronološkim razvrščanjem. Če oblika\r\n časovne značke ni v skladu s standardom ISO 8601,\r\n boste morali definirati izraz in tip za transformacijo\r\n znakovnega niza v datum ali časovno značko.\r\n Trenutno časovni pasovi niso podprti.\r\n Če je čas shranjen v obliki epohe, dodajte `epoch_s` ali `epoch_ms`.\r\n Če ni podan vzorec, se uporabijo privzete vrednosti na podlagi imena\r\n podatkovne baze oz. stolpca s pomočjo dodatnega parametra." + "When only a primary metric is provided, a categorical color scale is used.": [ + "Če je podana samo primarna metrika, je uporabljena kategorična barvna skala." ], - "Certified By": ["Certificiral/a"], - "Person or group that has certified this metric": [ - "Oseba ali skupina, ki je certificirala to mero" + "When a secondary metric is provided, a linear color scale is used.": [ + "Če je podana sekundarna metrika, je uporabljena linearna barvna skala." ], - "Certified by": ["Certificiral/a"], - "Certification details": ["Podrobnosti certifikacije"], - "Details of the certification": ["Podrobnosti certifikacije"], - "Is dimension": ["Dimenzija"], - "Is filterable": ["Filtriranje"], - "Select owners": ["Izberite lastnike"], - "Modified columns: %s": ["Spremenjeni stolpci: %s"], - "Removed columns: %s": ["Odstranjeni stolpci: %s"], - "New columns added: %s": ["Dodani novi stolpci: %s"], - "Metadata has been synced": ["Metapodatki so sinhronizirani"], - "An error has occurred": ["Prišlo je do napake"], - "Column name [%s] is duplicated": ["Ime stolpca [%s] je podvojeno"], - "Metric name [%s] is duplicated": ["Ime mere [%s] je podvojeno"], - "Calculated column [%s] requires an expression": [ - "Izračunan stolpec [%s] zahteva izraz" + "Hierarchy": ["Hierarhija"], + "This defines the level of the hierarchy": ["Določa stopnjo hierarhije"], + "Uses circles to visualize the flow of data through different stages of a system. Hover over individual paths in the visualization to understand the stages a value took. Useful for multi-stage, multi-group visualizing funnels and pipelines.": [ + "S pomočjo krogov prikaže potek podatkov na različnih nivojih sistema. S premikom kurzorja prikaže vrednosti na posameznem nivoju. Uporabno za večnivojsko, večskupinsko vizualizacijo." ], - "Basic": ["Osnovno"], - "Default URL": ["Privzeti URL"], - "Default URL to redirect to when accessing from the dataset list page": [ - "Privzeti URL za preusmeritev, ko dostopate iz strani s seznamom podatkovnih setov" + "Sunburst Chart": ["Večnivojski tortni grafikon"], + "Multi-Levels": ["Večplastni"], + "Ratio": ["Razmerje"], + "Target aspect ratio for treemap tiles.": [ + "Ciljno razmerje za razdelke drevesnega grafikona." ], - "Autocomplete filters": ["Samodokončaj filtre"], - "Whether to populate autocomplete filters options": [ - "Če želite napolniti možnosti za samodokončanje filtrov" + "Shows the composition of a dataset by segmenting a given rectangle as smaller rectangles with areas proportional to their value or contribution to the whole. Those rectangles may also, in turn, be further segmented hierarchically.": [ + "Prikaže zgradbo podatkovnega seta na podlagi segmentacije danega pravokotnika na manjše pravokotnike, pri čemer je ploščina sorazmerna vrednostim oz. deležem. Pravokotniki se lahko dodatno hierarhično segmentirajo." ], - "Autocomplete query predicate": ["Predikat za samodokončanje poizvedb"], - "When using \"Autocomplete filters\", this can be used to improve performance of the query fetching the values. Use this option to apply a predicate (WHERE clause) to the query selecting the distinct values from the table. Typically the intent would be to limit the scan by applying a relative time filter on a partitioned or indexed time-related field.": [ - "Ko uporabljate \"Samodokončaj filtre\", lahko s tem izboljšate hitrost pridobivanja rezultatov s poizvedbo. Z uporabo te možnosti dodate predikat (WHERE stavek) k poizvedbi za izbiro različnih vrednosti iz tabele. Običajno je namen omejiti poizvedbo z uporabo filtra za relativni čas na particioniranem ali indeksiranem časovnem polju." + "Country Field Type": ["Tip polja za države"], + "The country code standard that Superset should expect to find in the [country] column": [ + "Standard za oznake držav, ki bodo podane v stolpcu z državami" ], - "Extra data to specify table metadata. Currently supports metadata of the format: `{ \"certification\": { \"certified_by\": \"Data Platform Team\", \"details\": \"This table is the source of truth.\" }, \"warning_markdown\": \"This is a warning.\" }`.": [ - "Dodatni podatki za tabelo metapodatkov. Trenutno je podprta naslednja oblika zapisa metapodatkov: `{ \"certification\": { \"certified_by\": \"Tim za razvoj\", \"details\": \"Ta tabela je vir resnice.\" }, \"warning_markdown\": \"To je opozorilo.\" }`." + "Show Bubbles": ["Prikaži mehurčke"], + "Whether to display bubbles on top of countries": [ + "Če želite prikaz mehurčkov nad državami" ], - "Advanced": ["Napredno"], - "Cache timeout": ["Časovna omejitev predpomnilnika"], - "The duration of time in seconds before the cache is invalidated": [ - "Trajanje (v sekundah) do razveljavitve predpomnilnika" + "Max Bubble Size": ["Max. velikost mehurčka"], + "Color by": ["Barva glede na"], + "Choose whether a country should be shaded by the metric, or assigned a color based on a categorical color palette": [ + "Izberite, če želite barvanje držav glede na mero ali kategorično določeno barvno paleto" ], - "Hours offset": ["Urni premik"], - "The number of hours, negative or positive, to shift the time column. This can be used to move UTC time to local time.": [ - "Število ur, negativno ali pozitivno, za zamik časovnega stolpca. Na ta način je mogoče UTC čas prestaviti na lokalni čas." + "Country Column": ["Stolpec z državami"], + "3 letter code of the country": ["Tričrkovna oznaka države"], + "Metric that defines the size of the bubble": [ + "Mera, ki določa velikost mehurčka" ], - "Spatial": ["Prostorski"], - "virtual": ["virtualni"], - "Dataset name": ["Ime podatkovnega seta"], - "When specifying SQL, the datasource acts as a view. Superset will use this statement as a subquery while grouping and filtering on the generated parent queries.": [ - "Ko podajate SQL, se podatkovni vir obnaša kot pogled (view). Superset bo ta zapis uporabil kot podpoizvedbo, pri čemer bo združeval in filtriral na podlagi ustvarjenih starševskih poizvedb." + "Bubble Color": ["Barva mehurčka"], + "Country Color Scheme": ["Barvna shema držav"], + "A map of the world, that can indicate values in different countries.": [ + "Zemljevid sveta, ki lahko prikazuje vrednosti po državah." ], - "The JSON metric or post aggregation definition.": [ - "JSON mera ali po-agregacijska definicija." + "Multi-Dimensions": ["Večdimenzionalni"], + "Multi-Variables": ["Več spremenljivk"], + "Popular": ["Priljubljeni"], + "deck.gl charts": ["grafikoni deck.gl"], + "Pick a set of deck.gl charts to layer on top of one another": [ + "Izberite nabor deck.gl grafikonov, ki bodo nanizani en na drugem" ], - "Physical": ["Fizičen"], - "The pointer to a physical table (or view). Keep in mind that the chart is associated to this Superset logical table, and this logical table points the physical table referenced here.": [ - "Kazalec na fizično tabelo (ali pogled). Grafikon je povezan s to Supersetovo logično tabelo, ki kaže na tukaj referencirano fizično tabelo." + "Select charts": ["Izberi grafikone"], + "Error while fetching charts": ["Napaka pri pridobivanju grafikonov"], + "Compose multiple layers together to form complex visuals.": [ + "Združi več plasti za oblikovanje kompleksnih vizualizacij." ], - "Click the lock to make changes.": [ - "Kliknite ključavnico, da omogočite spreminjanje." + "deck.gl Multiple Layers": ["deck.gl - večplastni grafikon"], + "deckGL": ["deckGL"], + "Data has no time steps": ["Podatki nimajo časovnih korakov"], + "Start Longitude & Latitude": ["Začetna Dolž. in Širina"], + "Point to your spatial columns": [ + "Pokažite na stolpec z lokacijskimi podatki" ], - "Click the lock to prevent further changes.": [ - "Kliknite ključavnico, da onemogočite spreminjanje." + "End Longitude & Latitude": ["Končna Dolž. in Širina"], + "Arc": ["Lok"], + "Target Color": ["Ciljna barva"], + "Color of the target location": ["Barva ciljne lokacije"], + "Categorical Color": ["Kategorična barva"], + "Pick a dimension from which categorical colors are defined": [ + "Izberite dimenzijo, ki bo določala kategorične barve" + ], + "Stroke Width": ["Debelina obrobe"], + "Advanced": ["Napredno"], + "Plot the distance (like flight paths) between origin and destination.": [ + "Izriši razdalje (kot letalske koridorje) med izhodiščem in ciljem." ], - "D3 format": ["D3 format"], - "Warning": ["Opozorilo"], - "Optional warning about use of this metric": [ - "Opcijsko opozorilo za uporabo te mere" + "deck.gl Arc": ["deck.gl - grafikon lokov"], + "3D": ["3D"], + "Web": ["Mreža"], + "GeoJson Settings": ["GeoJson nastavitve"], + "Point Radius Scale": ["Skaliranje radija točk"], + "The GeoJsonLayer takes in GeoJSON formatted data and renders it as interactive polygons, lines and points (circles, icons and/or texts).": [ + "GeoJsonLayer uporablja podatke v formatu GeoJSON in jih izriše kot interaktivne poligone, črte in točke (krogi, ikone in/ali besedila)." ], - "Be careful.": ["Bodite previdni."], - "Changing these settings will affect all charts using this dataset, including charts owned by other people.": [ - "Spreminjanje teh nastavitev bo vplivalo na vse grafikone, ki uporabljajo ta podatkovni set, vključno z grafikoni v lasti drugih oseb." + "deck.gl Geojson": ["deck.gl - GeoJson grafikon"], + "Height": ["Višina"], + "Metric used to control height": ["Mera za določanje višine"], + "Visualize geospatial data like 3D buildings, landscapes, or objects in grid view.": [ + "Prikaz geoprostorskih podatkov kot so 3D zgradbe, parcele ali objekti v mrežnem pogledu." ], - "Source": ["Izvor"], - "Sync columns from source": ["Sinhroniziraj stolpce z virom"], - "Calculated columns": ["Izračunani stolpci"], - "Settings": ["Nastavitve"], - "The dataset has been saved": ["Podatkovni set je shranjen"], - "The dataset configuration exposed here\r\n affects all the charts using this dataset.\r\n Be mindful that changing settings\r\n here may affect other charts\r\n in undesirable ways.": [ - "Tukaj prikazane nastavitve podatkovnega seta\r\n vplivajo na vse grafikone, ki uporabljajo\r\n ta podatkovni set. Spreminjanje\r\n nastavitev lahko nezaželeno vpliva\r\n na druge grafikone." + "deck.gl Grid": ["deck.gl - grafikon mreže"], + "Experimental": ["Eksperimentalno"], + "Dynamic Aggregation Function": ["Dinamična agregacijska funkcija"], + "The function to use when aggregating points into groups": [ + "Funkcija za agregacijo točk v skupine" ], - "Are you sure you want to save and apply changes?": [ - "Ali resnično želite shraniti in uporabiti spremembe?" + "Overlays a hexagonal grid on a map, and aggregates data within the boundary of each cell.": [ + "Prikaže šestkotno mrežo na zemljevidu in agregira podatke znotraj meja vsake celice." ], - "Confirm save": ["Potrdite shranjevanje"], - "Edit Dataset ": ["Uredi podatkovni set "], - "Use legacy datasource editor": [ - "Uporabi starejši urejevalnik podatkovnega vira" + "deck.gl 3D Hexagon": ["deck.gl - grafikon 3D šestkotnikov"], + "Visualizes connected points, which form a path, on a map.": [ + "Na zemljevidu prikaže povezane točke, ki tvorijo pot." ], - "DELETE": ["IZBRIŠI"], - "delete": ["izbriši"], - "Type \"%s\" to confirm": ["Vnesite \"%s\" za potrditev"], - "Click to edit": ["Kliknite za urejanje"], - "You don't have the rights to alter this title.": [ - "Nimate pravic za spreminjanje tega naslova." + "deck.gl Path": ["deck.gl - grafikon poti"], + "Polygon Column": ["Stolpec poligonov"], + "Polygon Encoding": ["Kodiranje poligonov"], + "Elevation": ["Višina"], + "Polygon Settings": ["Nastavitve poligonov"], + "Opacity, expects values between 0 and 100": [ + "Prosojnost, vnesite vrednosti med 0 in 100" ], - "Unexpected error": ["Nepričakovana napaka"], - "This may be triggered by:": ["To je lahko sproženo z/s:"], - "Please reach out to the Chart Owner for assistance.": [ - "Za pomoč se obrnite na lastnika grafikona." + "Number of buckets to group data": [ + "Število razdelkov za združevanje podatkov" ], - "Chart Owner: %s": ["Lastnik grafikona: %s"], - "%s Error": ["%s napaka"], - "Missing dataset": ["Manjka podatkovni set"], - "See more": ["Oglejte si več"], - "See less": ["Oglejte si manj"], - "Copy message": ["Kopiraj sporočilo"], - "Close": ["Zapri"], - "This was triggered by:": ["To je bilo sproženo z/s:"], - "Did you mean:": ["Ste mislili:"], - "%(suggestion)s instead of \"%(undefinedParameter)s?\"": [ - "%(suggestion)s namesto \"%(undefinedParameter)s?\"" + "How many buckets should the data be grouped in.": [ + "V koliko razdelkov bodo razvrščeni podatki." ], - "Parameter error": ["Napaka parametra"], - "We’re having trouble loading this visualization. Queries are set to timeout after %s second.": [ - "Težava pri nalaganju vizualizacije. Časovni iztek poizvedb je nastavljen na %s sekund." + "Bucket break points": ["Točke za razčlenitev razdelkov"], + "List of n+1 values for bucketing metric into n buckets.": [ + "Seznam n+1 vrednosti za mero razvrščanja v n razdelkov." ], - "We’re having trouble loading these results. Queries are set to timeout after %s second.": [ - "Težava pri nalaganju rezultatov. Časovni iztek poizvedb je nastavljen na %s sekund." + "Emit Filter Events": ["Oddajaj dogodke filtrov"], + "Whether to apply filter when items are clicked": [ + "Če želite uporabiti filter, ko kliknete na elemente" ], - "Timeout error": ["Napaka pretečenega časa"], - "Click to favorite/unfavorite": [ - "Kliknite za priljubljeno/nepriljubljeno" + "Multiple filtering": ["Večkratno filtriranje"], + "Allow sending multiple polygons as a filter event": [ + "Dovoli pošiljanje več poligonov kot dogodek filtra" ], - "Cell content": ["Vsebina celice"], - "The import was successful": ["Uvoz je uspel"], - "OVERWRITE": ["OVERWRITE"], - "Overwrite": ["Prepiši"], - "Import": ["Uvozi"], - "Import %s": ["Uvozi %s"], - "Last Updated %s": ["Zadnja posodobitev %s"], - "Sort": ["Razvrsti"], - "%s Selected": ["Izbranih: %s"], - "Deselect all": ["Počisti izbor"], - "No Data": ["Ni podatkov"], - "%s-%s of %s": ["%s-%s od %s"], - "Type a value": ["Vnesite vrednost"], - "Filter": ["Filter"], - "Select or type a value": ["Izberite ali vnesite vrednost"], - "SQL query": ["SQL poizvedba"], - "About": ["O programu"], - "Powered by Apache Superset": ["Omogoča Apache Superset"], - "Documentation": ["Dokumentacija"], - "Report a bug": ["Sporočite napako"], - "OK": ["OK"], - "An error occurred while fetching dashboards": [ - "Prišlo je do napake pri pridobivanju nadzornih plošč" + "Visualizes geographic areas from your data as polygons on a Mapbox rendered map. Polygons can be colored using a metric.": [ + "Prikaže geografsko območje kot poligone na zemljevidu zagotovljenim preko storitve Mapbox. Poligoni so lahko obarvani glede na mero." ], - "Search all dashboards": ["Išči vse nadzorne plošče"], - "Edit Email Report": ["Uredi e-poštno poročilo"], - "New Email Report": ["Novo e-poštno poročilo"], - "Add": ["Dodaj"], - "Message Content": ["Vsebina sporočila"], - "Text embedded in email": ["Besedilo vključeno v e-pošto"], - "Image (PNG) embedded in email": ["Slika (PNG) vključena v e-pošto"], - "Formatted CSV attached in email": ["Oblikovan CSV pripet e-pošti"], - "REPORT NAME ERROR": ["NAPAKA NAZIVA POROČILA"], - "DESCRIPTION ERROR": ["NAPAKA OPISA"], - "Scheduled reports will be sent to your email as a PNG": [ - "Poročila na urniku bodo poslana na vaš e-naslov kot PNG" + "deck.gl Polygon": ["deck.gl - grafikon poligonov"], + "Point Size": ["Velikost točke"], + "Point Unit": ["Enota točke"], + "Minimum Radius": ["Min. polmer"], + "Minimum radius size of the circle, in pixels. As the zoom level changes, this insures that the circle respects this minimum radius.": [ + "Minimalni polmer kroga v pikslih. S tem je določen minimalni polmer kroga, ko se spreminja stopnja povečave." ], - "Timezone": ["Časovni pas"], - "Email reports active": ["E-poštna poročila aktivna"], - "Edit email report": ["Uredi e-poštno poročilo"], - "Delete email report": ["Izbriši e-poštno poročilo"], - "This action will permanently delete %s.": [ - "S tem dejanjem boste trajno izbrisali %s." + "Maximum Radius": ["Max. polmer"], + "Maxium radius size of the circle, in pixels. As the zoom level changes, this insures that the circle respects this maximum radius.": [ + "Maksimalni polmer kroga v pikslih. S tem je določen maksimalni polmer kroga, ko se spreminja stopnja povečave." ], - "Delete Report?": ["Izbrišem poročilo?"], - "Loading...": ["Nalagam ..."], - "There was an error loading the tables": ["Napaka pri nalaganju tabel"], - "See table schema": ["Ogled sheme tabele"], - "Select table or type table name": ["Izberite ali vnesite ime tabele"], - "Force refresh table list": ["Osveži seznam tabel"], - "Timezone selector": ["Izbira časovnega pasa"], - "%s%s": ["%s%s"], - "There is not enough space for this component. Try decreasing its width, or increasing the destination width.": [ - "Za to komponento ni dovolj prostora. Poskusite zmanjšati širino ali pa povečati širino cilja." + "Point Color": ["Barva točke"], + "A map that takes rendering circles with a variable radius at latitude/longitude coordinates": [ + "Zemljevid, ki na zemljepisnih koordinatah prikazuje kroge s spremenljivim polmerom" ], - "Can not move top level tab into nested tabs": [ - "Najvišjega zavihka ni mogoče premakniti v gnezdene zavihke" + "deck.gl Scatterplot": ["deck.gl - raztreseni grafikon"], + "Grid": ["Mreža"], + "Weight": ["Utež"], + "Metric used as a weight for the grid's coloring": [ + "Mera, ki služi kot utež za barvo mreže" ], - "This chart has been moved to a different filter scope.": [ - "Ta grafikon je bil prestavljen v drug doseg filtrov." + "Aggregates data within the boundary of grid cells and maps the aggregated values to a dynamic color scale": [ + "Agregira podatke znotraj meja celic in agregirane vrednosti ponazori z dinamično barvno lestvico" ], - "There was an issue fetching the favorite status of this dashboard.": [ - "Pri pridobivanju statusa \"priljubljeno\" za to nadzorno ploščo je prišlo do težave." + "deck.gl Screen Grid": ["deck.gl - grafikon mreže"], + "For more information about objects are in context in the scope of this function, refer to the": [ + "Za dodatne informacije o objektih v kontekstu te funkcije si oglejte" ], - "There was an issue favoriting this dashboard.": [ - "Pri uvrščanju nadzorne plošče med priljubljene je prišlo do težave." + " source code of Superset's sandboxed parser": [ + " izvorno kodo za Supersetov \"sandboxed parser\"" ], - "This dashboard is now ${nowPublished}": [ - "Ta nadzorna plošča je sedaj ${nowPublished}" + "This functionality is disabled in your environment for security reasons.": [ + "Ta funkcionalnost je v vašem okolju onemogočena zaradi varnosti." ], - "You do not have permissions to edit this dashboard.": [ - "Nimate dovoljenj za urejanje te nadzorne plošče." + "Ignore null locations": ["Izpusti prazne lokacije"], + "Whether to ignore locations that are null": [ + "Če ne želite upoštevati praznih (NULL) lokacij" ], - "This dashboard was saved successfully.": [ - "Nadzorna plošča je bila uspešno shranjena." + "Auto Zoom": ["Samodejna povečava"], + "When checked, the map will zoom to your data after each query": [ + "Če želite, da se zemljevid prilagodi vašim podatkom po vsaki poizvedbi" ], - "Could not fetch all saved charts": [ - "Vseh shranjenih grafikonov ni bilo mogoče pridobiti" + "Dimension": ["Dimenzija"], + "Select a dimension": ["Izberite dimenzijo"], + "Extra data for JS": ["Dodatni podatki za JS"], + "List of extra columns made available in Javascript functions": [ + "Seznam dodatnih podatkov, ki so na razpolago v Javascript funkcijah" ], - "Sorry there was an error fetching saved charts: ": [ - "Prišlo je do napake pri pridobivanju shranjenih grafikonov: " + "Javascript data interceptor": ["Javascript prestreznik podatkov"], + "Define a javascript function that receives the data array used in the visualization and is expected to return a modified version of that array. This can be used to alter properties of the data, filter, or enrich the array.": [ + "Določite Javascript funkcijo, ki sprejme podatkovni niz za vizualizacijo in vrne spremenjeno verzijo tega niza. Lahko se uporabi za spreminjanje lastnosti podatkov, filtra ali obogatitve niza." ], - "Visualization": ["Vizualizacija"], - "Data source": ["Podatkovni vir"], - "Added": ["Dodano"], - "Components": ["Komponente"], - "Any color palette selected here will override the colors applied to this dashboard's individual charts": [ - "Na tem mestu izbrana barvna shema bo nadomestila barve posameznih grafikonov v tej nadzorni plošči" + "Javascript tooltip generator": ["Javascript generator opisa orodja"], + "Define a function that receives the input and outputs the content for a tooltip": [ + "Določite funkcijo, ki sprejme vhodne podatke in vrne vsebino opisa orodja" ], - "Color scheme": ["Barvna shema"], - "You have unsaved changes.": ["Imate neshranjene spremembe."], - "Ready to review filters in this dashboard?": [ - "Ste pripravljeni za pregled filtrov v tej nadzorni plošči?" + "Javascript onClick href": ["Javascript onClick href"], + "Define a function that returns a URL to navigate to when user clicks": [ + "Določite funkcijo, ki vrne URL za navigacijo, ko uporabnik klikne" ], - "Remind me in 24 hours": ["Opomni me čez 24 ur"], - "Start Review": ["Začetek pregleda"], - "filter_box will be deprecated in a future version of Superset. Please replace filter_box by dashboard filter components.": [ - "Element filter_box bo v prihodnjih verzijah Superseta opuščen. Nadomestite ga s filtri nadzorne plošče." + "Legend Format": ["Oblika legende"], + "Choose the format for legend values": [ + "Izberite obliko vrednosti legende" ], - "There is no chart definition associated with this component, could it have been deleted?": [ - "S to komponento ni povezana nobena definicija grafikona. Ali je bila izbrisana?" + "Legend Position": ["Položaj legende"], + "Choose the position of the legend": ["Izberite položaj legende"], + "Lines column": ["Stolpec črt"], + "The database columns that contains lines information": [ + "Stolpec v podatkovni bazi, ki vsebuje podatke črt" ], - "Delete this container and save to remove this message.": [ - "Izbrišite ta okvir in shranite za odpravo tega sporočila." + "Line width": ["Debelina črte"], + "The width of the lines": ["Debelina črt"], + "Fill Color": ["Barva polnila"], + " Set the opacity to 0 if you do not want to override the color specified in the GeoJSON": [ + " Nastavite prosojnost na 0, če želite obdržati barvo določeno v GeoJSON" ], - "Don't refresh": ["Ne osvežuj"], - "10 seconds": ["10 sekund"], - "30 seconds": ["30 sekund"], - "1 minute": ["1 minuta"], - "5 minutes": ["5 minut"], - "30 minutes": ["30 minut"], - "1 hour": ["1 ura"], - "6 hours": ["6 ur"], - "12 hours": ["12 ur"], - "24 hours": ["24 ur"], - "Refresh interval": ["Interval osveževanja"], - "Refresh frequency": ["Frekvenca osveževanja"], - "Are you sure you want to proceed?": ["Ali želite nadaljevati?"], - "Save for this session": ["Shranite za to sejo"], - "You must pick a name for the new dashboard": [ - "Izbrati morate ime nove nadzorne plošče" + "Stroke Color": ["Barva obrobe"], + "Filled": ["Zapolnjeno"], + "Whether to fill the objects": ["Če želite zapolniti objekte"], + "Stroked": ["Obrobljeno"], + "Whether to display the stroke": ["Če želite prikazati obrobe"], + "Extruded": ["Relief"], + "Grid Size": ["Velikost mreže"], + "Defines the grid size in pixels": ["Določa velikost mreže v pikslih"], + "Parameters related to the view and perspective on the map": [ + "Parametri povezani s pogledom in perspektivo zemljevida" ], - "Save dashboard": ["Shrani nadzorno ploščo"], - "Overwrite Dashboard [%s]": ["Prepiši nadzorno ploščo [%s]"], - "Save as:": ["Shrani kot:"], - "[dashboard name]": ["[ime nadzorne plošče]"], - "also copy (duplicate) charts": ["kopiraj (podvoji) tudi grafikone"], - "Filter your charts": ["Filtriraj grafikone"], - "Sort by": ["Razvrščanje"], - "Cross Filter Scoping": ["Doseg medsebojnega filtra"], - "Load a CSS template": ["Naloži CSS predlogo"], - "Live CSS editor": ["CSS urejevalnik v živo"], - "Applied Cross Filters (%d)": ["Uporabljeni medsebojni filtri (%d)"], - "Applied Filters (%d)": ["Uporabljeni filtri (%d)"], - "Incompatible Filters (%d)": ["Neskladni filtri (%d)"], - "Unset Filters (%d)": ["Neuporabljeni filtri (%d)"], - "This dashboard is currently auto refreshing; the next auto refresh will be in %s.": [ - "Nadzorna plošča se trenutno samodejno osvežuje. Naslednja samodejna osvežitev bo čez %s." + "Longitude & Latitude": ["Dolžina in širina"], + "Fixed point radius": ["Fiksni radij točk"], + "Multiplier": ["Množitelj"], + "Factor to multiply the metric by": ["Faktor, s katerim množite mero"], + "Lines encoding": ["Kodiranje črt"], + "The encoding format of the lines": ["Oblika kodiranja črt"], + "Reverse Lat & Long": ["Zamenjaj širino in dolžino"], + "GeoJson Column": ["GeoJson stolpec"], + "Select the geojson column": ["Izberite geojson stolpec"], + "Right Axis Format": ["Oblika desne osi"], + "Show Markers": ["Prikaži markerje"], + "Show data points as circle markers on the lines": [ + "Pokaži točke kot krožne markerje na krivuljah" ], - "Your dashboard is too large. Please reduce its size before saving it.": [ - "Vaša nadzorna plošča je prevelika. Pred shranjevanjem jo zmanjšajte." + "Y bounds": ["Y meje"], + "Whether to display the min and max values of the Y-axis": [ + "Če želite prikaz min. in max. vrednosti Y-osi" ], - "Schedule email report": ["Dodaj e-poštno poročilo na urnik"], - "Discard changes": ["Zavrzi spremembe"], - "Edit dashboard": ["Uredi nadzorno ploščo"], - "An error occurred while fetching available CSS templates": [ - "Pri pridobivanju CSS predlog je prišlo do napake" + "Y 2 bounds": ["Meje Y 2"], + "Line Style": ["Slog črte"], + "Line interpolation as defined by d3.js": [ + "Interpolacija krivulje na osnovi d3.js" ], - "Superset dashboard": ["Superset nadzorna plošča"], - "Check out this dashboard: ": ["Preizkusite to nadzorno ploščo: "], - "Copy dashboard URL": ["Kopiraj URL nadzorne plošče"], - "Share dashboard by email": ["Deli nadzorno ploščo po e-pošti"], - "Refresh dashboard": ["Osveži nadzorno ploščo"], - "Set auto-refresh interval": ["Nastavi interval samodejnega osveževanja"], - "Set filter mapping": ["Nastavi shemo filtrov"], - "Edit dashboard properties": ["Uredi lastnosti nadzorne plošče"], - "Edit CSS": ["Uredi CSS"], - "Download as image": ["Izvozi kot sliko"], - "Exit fullscreen": ["Izhod iz celozaslonskega načina"], - "Enter fullscreen": ["Vklopi celozaslonski način"], - "You do not have permission to edit this dashboard": [ - "Nimate dovoljenja za urejanje te nadzorne plošče" + "Show Range Filter": ["Pokaži filter obdobja"], + "Whether to display the time range interactive selector": [ + "Če želite prikaz interaktivnega izbirnika časovnega obdobja" ], - "A valid color scheme is required": [ - "Zahtevana je veljavna barvna shema" + "Extra Controls": ["Dodatni kontrolniki"], + "Whether to show extra controls or not. Extra controls include things like making mulitBar charts stacked or side by side.": [ + "Če želite prikaz dodatnih kontrolnikov. Dodatni kontrolniki vključujejo možnost izdelave večstolpčnih grafikonov, naloženih ali drug ob drugem." ], - "The dashboard has been saved": ["Nadzorna plošča je bila shranjena"], - "Access": ["Dostop"], - "Owners is a list of users who can alter the dashboard. Searchable by name or username.": [ - "\"Lastniki\" je seznam uporabnikov, ki lahko spreminjajo nadzorno ploščo. Iskanje je možno po imenu ali uporabniškem imenu." + "X Tick Layout": ["Postavitev oznak na X-osi"], + "The way the ticks are laid out on the X-axis": [ + "Način razporeditve oznak na X-osi" ], - "Colors": ["Barve"], - "Roles is a list which defines access to the dashboard. Granting a role access to a dashboard will bypass dataset level checks. If no roles defined then the dashboard is available to all roles.": [ - "\"Vloge\" je seznam, ki definira dostop do nadzorne plošče. Dodelitev vloge za dostop do nadzorne plošče bo obšlo preverjanje na nivoju podatkovnega seta. Če vloga ni definirana, bo nadzorna plošča dostopna vsem vlogam." + "X Axis Format": ["Oblika X-osi"], + "Y Log Scale": ["Logaritemska Y-os"], + "Use a log scale for the Y-axis": ["Uporabi logaritemsko skalo za Y-os"], + "Y Axis Bounds": ["Meje Y-osi"], + "Bounds for the Y-axis. When left empty, the bounds are dynamically defined based on the min/max of the data. Note that this feature will only expand the axis range. It won't narrow the data's extent.": [ + "Meje Y-osi. Če je prazno, se meje nastavijo dinamično na podlagi min./max. vrednosti podatkov. Funkcija omeji le prikaz, obseg podatkov pa ostane enak." ], - "Apply": ["Uporabi"], - "Dashboard properties": ["Lastnosti nadzorne plošče"], - "Basic information": ["Osnovne informacije"], - "URL slug": ["URL slug"], - "A readable URL for your dashboard": [ - "Berljiv URL za vašo nadzorno ploščo" + "Y Axis 2 Bounds": ["Meje Y 2-osi"], + "X bounds": ["Meje X-osi"], + "Whether to display the min and max values of the X-axis": [ + "Če želite prikaz min. in max. vrednosti X-osi" ], - "JSON metadata": ["JSON metapodatki"], - "This dashboard is not published, it will not show up in the list of dashboards. Click here to publish this dashboard.": [ - "Ta nadzorna plošča ni objavljena in se ne bo prikazala na seznamu nadzornih plošč. Kliknite tukaj za njeno objavo." + "Bar Values": ["Vrednosti stolpcev"], + "Show the value on top of the bar": [ + "Prikaži vrednosti na vrhu stolpcev" ], - "This dashboard is not published which means it will not show up in the list of dashboards. Favorite it to see it there or access it by using the URL directly.": [ - "Ta nadzorna plošča ni objavljena in se ne bo prikazala na seznamu nadzornih plošč. Uvrstite jo med priljubljene, da jo boste videli tam, ali pa uporabite URL za neposredni dostop." + "Stacked Bars": ["Naloženi stolpci"], + "Reduce X ticks": ["Manj oznak X-osi"], + "Reduces the number of X-axis ticks to be rendered. If true, the x-axis will not overflow and labels may be missing. If false, a minimum width will be applied to columns and the width may overflow into an horizontal scroll.": [ + "Zmanjša število izrisanih oznak na X-osi. Če je vklopljeno, se x-os ne bo prelila in lahko oznake manjkajo. Če je izklopljeno, bo upoštevana min. širina stolpcev, ki pa se lahko prelije v horizontalni drsnik." ], - "This dashboard is published. Click to make it a draft.": [ - "Ta nadzorna plošča je objavljena. Kliknite, da jo uvrstite med osnutke." + "You cannot use 45° tick layout along with the time range filter": [ + "Skupaj s filtriranjem časovnega obdobja ne morete uporabiti oznak pod 45° kotom" ], - "Draft": ["Osnutek"], - "Annotation layers are still loading.": [ - "Sloj z oznakami se še vedno nalaga." + "Stacked Style": ["Slog nalaganja"], + "Evolution": ["Evolucija"], + "A time series chart that visualizes how a related metric from multiple groups vary over time. Each group is visualized using a different color.": [ + "Grafikon časovne vrste, ki prikaže kako se povezane mere skupin spreminjajo skozi čas. Vsaka skupina je prikazana s svojo barvo." ], - "One ore more annotation layers failed loading.": [ - "Eden ali več slojev z oznakami se ni naložil." + "Stretched style": ["Raztegnjen slog"], + "Stacked style": ["Naložen slog"], + "Video game consoles": ["Igralne konzole"], + "Vehicle Types": ["Vrste vozil"], + "Area Chart": ["Ploščinski grafikon"], + "Continuous": ["Zvezno"], + "Line": ["Črta"], + "nvd3": ["nvd3"], + "Deprecated": ["Zastarelo"], + "Series Limit Sort By": ["Razvrščanje omejitev serije"], + "Metric used to order the limit if a series limit is present. If undefined reverts to the first metric (where appropriate).": [ + "Mera, ki določa kako je razvrščena meja, če je določena omejitev serij. Če ni določena, se uporabi prva mera (kjer je to ustrezno)." ], - "Emitted values": ["Oddane vrednosti"], - "Click to clear emitted filters": ["S klikom počistite oddane filtre"], - "Cached %s": ["Predpomnjeno %s"], - "Fetched %s": ["Pridobljeno %s"], - "Minimize chart": ["Pomanjšaj grafikon"], - "Maximize chart": ["Povečaj grafikon"], - "Force refresh": ["Osveži"], - "Toggle chart description": ["Preklopi opis grafikona"], - "View chart in Explore": ["Ogled grafikona v Raziskovalcu"], - "View query": ["Ogled poizvedbe"], - "Copy chart URL": ["Kopiraj URL grafikona"], - "Share chart by email": ["Deli grafikon po e-pošti"], - "Check out this chart: ": ["Preizkusite ta grafikon: "], - "Export CSV": ["Izvozi CSV"], - "Export full CSV": ["Izvozi celoten CSV"], - "Cross-filter scoping": ["Doseg medsebojnega filtra"], - "Search...": ["Iskanje ..."], - "No filter is selected.": ["Noben filter ni izbran."], - "Editing 1 filter:": ["Urejanje enega filtra:"], - "Batch editing %d filters:": ["Skupinsko urejanje %d filtrov:"], - "Configure filter scopes": ["Nastavi doseg filtrov"], - "There are no filters in this dashboard.": [ - "V nadzorni plošči ni filtrov." + "Series Limit Sort Descending": ["Razvrsti padajoče"], + "Whether to sort descending or ascending if a series limit is present": [ + "Če želite padajoče ali naraščajoče razvrščanje, ko je prisotna omejitev serije" ], - "Expand all": ["Razširi vse"], - "Collapse all": ["Skrči vse"], - "This markdown component has an error.": [ - "Markdown komponenta ima napako." + "Visualize how a metric changes over time using bars. Add a group by column to visualize group level metrics and how they change over time.": [ + "Prikaže spreminjanje mere skozi čas s pomočjo stolpcev. Z dodajanjem stolpcev za združevanje prikaže mere skupin in njihovo spreminjanje." ], - "This markdown component has an error. Please revert your recent changes.": [ - "Markdown komponenta ima napako. Povrnite nedavne spremembe." + "Time-series Bar Chart": ["Stolpčni grafikon za časovno vrsto"], + "Bar": ["Stolpec"], + "Vertical": ["Navpično"], + "Box Plot": ["Box Plot"], + "X Log Scale": ["Logaritemska X-os"], + "Use a log scale for the X-axis": ["Uporabi logaritemsko skalo za X-os"], + "Visualizes a metric across three dimensions of data in a single chart (X axis, Y axis, and bubble size). Bubbles from the same group can be showcased using bubble color.": [ + "Prikaže mero v treh dimenzijah podatkov na istem grafikonu (x os, y os, velikost mehurčka). Mehurčki v isti skupini so predstavljeni z barvo." ], - "Delete dashboard tab?": ["Ali izbrišem zavihek nadzorne plošče?"], - "Divider": ["Ločilnik"], - "Header": ["Glava"], - "Row": ["Vrstica"], - "Tabs": ["Zavihki"], - "Preview": ["Predogled"], - "Sorry, your browser does not support copying.": [ - "Vaš brskalnik ne podpira kopiranja." + "Ranges": ["Razponi"], + "Ranges to highlight with shading": ["Razponi za označitev s senčenjem"], + "Range labels": ["Oznake razponov"], + "Labels for the ranges": ["Oznake za razpone"], + "Markers": ["Markerji"], + "List of values to mark with triangles": [ + "Seznam vrednosti, ki bodo markirane s trikotniki" ], - "Sorry, something went wrong. Try again later.": [ - "Nekaj je šlo narobe. Poskusite ponovno kasneje." + "Marker labels": ["Oznake markerjev"], + "Labels for the markers": ["Oznake za markerje"], + "Marker lines": ["Markirne črtice"], + "List of values to mark with lines": [ + "Seznam vrednosti, ki bodo markirane s črticami" ], - "All Filters (${filterValues.length})": [ - "Vsi filtri (${filterValues.length})" + "Marker line labels": ["Oznake markirnih črtic"], + "Labels for the marker lines": ["Oznake za markirne črtice"], + "KPI": ["KPI"], + "Showcases the progress of a single metric against a given target. The higher the fill, the closer the metric is to the target.": [ + "Prikaže napredovanje posamezne mere glede na cilj. Večja napolnjenost, pomeni, da je mera bližje cilju." ], - "Filter Sets (${filterSetFilterValues.length})": [ - "Nastavljeni filtri (${filterSetFilterValues.length})" + "Visualizes many different time-series objects in a single chart. This chart is being deprecated and we recommend using the Time-series Chart instead.": [ + "Prikaže več različnih časovnih vrst na istem grafikonu. Grafikon se opušča, zato priporočamo uporabo Grafikona časovne vrste." ], - "Select parent filters": ["Izberi starševske filtre"], - "Check configuration": ["Preveri nastavitve"], - "Cannot load filter": ["Filtra ni mogoče naložiti"], - "Editing filter set:": ["Urejanje seta filtrov:"], - "Filter set with this name already exists": [ - "Set filtrov z enakim imenom že obstaja" + "Time-series Percent Change": ["Časovna vrsta - Procentualna sprememba"], + "Sort Bars": ["Uredi stolpce"], + "Sort bars by x labels.": ["Uredi stolpce po x-oznakah."], + "Breakdowns": ["Razčlenitev"], + "Defines how each series is broken down": [ + "Določa, kako se vsaka podatkovna serija razčleni" ], - "Filter set already exists": ["Set filtrov že obstaja"], - "This filter set is identical to: \"%s\"": [ - "Ta set filtrov je enak: \"%s\"" + "Compares metrics from different categories using bars. Bar lengths are used to indicate the magnitude of each value and color is used to differentiate groups.": [ + "Primerjava mer različnih kategorij s pomočjo stolpcev. Dolžina stolpca prestavlja višino vrednosti, z barvami pa so ločene skupine." ], - "Remove invalid filters": ["Odstrani neveljavne filtre"], - "Rebuild": ["Obnovi"], - "Filters (%d)": ["Filtri (%d)"], - "This filter doesn't exist in dashboard. It will not be applied.": [ - "Ta filter ne obstaja v nadzorni plošči in ne bo uveljavljen." + "Bar Chart": ["Stolpčni grafikon"], + "Additive": ["Aditivno"], + "Discrete": ["Diskretno"], + "Y Axis 1": ["Y-os 1"], + "Y Axis 2": ["Y-os 2"], + "Left Axis Metric": ["Mera za levo os"], + "Choose a metric for left axis": ["Izberite mero za levo os"], + "Left Axis Format": ["Oblika leve osi"], + "Visualizes 2 metrics as line plots using the same x-axis. This chart is useful for comparing metrics across the same time range.": [ + "Prikaže dve meri na črtnem grafu z isto x-osjo. Grafikon je uporaben za primerjavo mer v istem časovnem obdobju." ], - "Filter metadata changed in dashboard. It will not be applied.": [ - "Metapodatki filtra so se spremenili v nadzorni plošči. Ne bo uveljavljen." + "Dual Line Chart": ["Grafikon z dvojno krivuljo"], + "Propagate": ["Razširi"], + "Send range filter events to other charts": [ + "Pošlji dogodke filtra obdobja na druge grafikone" ], - "None": ["Brez"], - "Please filter set name": ["Vnesite ime seta filtrov"], - "Create": ["Ustvari"], - "Create new filter set": ["Ustvarite nov set filtrov"], - "New filter set": ["Nov set filtrov"], - "Please apply filter changes": ["Potrdite spremembe filtra"], - "Unknown value": ["Neznana vrednost"], - "Clear all": ["Počisti vse"], - "(Removed)": ["(Odstranjeno)"], - "Undo?": ["Povrni?"], - "Add filter": ["Dodaj filter"], - "[untitled]": ["[neimenovana]"], - "Filters configuration and scoping": ["Nastavitve in doseg filtrov"], - "Cannot create cyclic hierarchy": [ - "Ciklične hierarhije ni mogoče ustvariti" + "Classic chart that visualizes how metrics change over time.": [ + "Standardni grafikon za prikaz spreminjanje mere skozi čas." ], - "Column select": ["Izbira stolpca"], - "Select a column": ["Izberite stolpec"], - "No compatible columns found": ["Ni najdenih skladnih stolpcev"], - "Value is required": ["Zahtevana je vrednost"], - "Configuration": ["Nastavitve"], - "Scoping": ["Doseg"], - "Select filter": ["Izbirni filter"], - "Value": ["Vrednost"], - "Range filter": ["Filter obdobja"], - "Numerical range": ["Številski obseg"], - "Time filter": ["Časovni filter"], - "Time range": ["Časovno obdobje"], - "Time column": ["Časovni stolpec"], - "Time grain": ["Granulacija časa"], - "Group By": ["Združevanje (Group by)"], - "Group by": ["Združevanje (Group by)"], - "Pre-filter is required": ["Zahtevan je predfilter"], - "(deleted)": ["(izbrisano)"], - "Parent filter": ["Nadrejeni filter"], - "Filter name": ["Ime filtra"], - "Name is required": ["Zahtevano je ime"], - "Filter Type": ["Tip filtra"], - "Filter type": ["Tip filtra"], - "Datasets do not contain a temporal column": [ - "Podatkovni seti ne vsebujejo časovnega stolpca" + "Battery level over time": ["Napolnjenost baterije skozi čas"], + "Line Chart": ["Črtni grafikon"], + "Prefix metric name with slice name": ["Imenu mere pripni ime rezine"], + "Y Axis Left": ["Y-os levo"], + "Left Axis chart(s)": ["Grafikoni leve osi"], + "Choose one or more charts for left axis": [ + "Izberite enega ali več grafikonov za levo os" ], - "Dataset is required": ["Zahtevan je podatkovni set"], - "Filter has default value": ["Filter ima privzeto vrednost"], - "Default Value": ["Privzeta vrednost"], - "Default value is required": ["Zahtevana je privzeta vrednost"], - "Refresh the default values": ["Osveži privzete vrednosti"], - "Fill all required fields to enable \"Default Value\"": [ - "Izpolnite vsa polja, da omogočite \"Privzeto vrednost\"" + "Y Axis Right": ["Y-os desno"], + "Right Axis chart(s)": ["Grafikoni desne osi"], + "Choose one or more charts for right axis": [ + "Izberite enega ali več grafikonov za desno os" + ], + "Visualize two different time series using the same x-axis time range. This chart is being deprecated and we recommend using the Mixed Timeseries Chart instead!": [ + "Prikaže dve različni časovni vrsti z isto x-osjo oz. časovnim obdobjem. Grafikon se opušča, zato priporočamo uporabo kombiniranega grafikona časovne vrste!" ], - "Filter is hierarchical": ["Filter je hierarhičen"], - "Parent filter is required": ["Zahtevan je nadrejeni filter"], - "Pre-filter available values": ["Predfiltriraj razpoložljive vrednosti"], - "Pre-filter": ["Predfilter"], - "Optional time column if time range should apply to another column than the default time column": [ - "Izbirni časovni stolpec se mora nanašati na drug stolpec kot privzeti časovni stolpec" + "Multiple Line Charts": ["Veččrtni grafikon"], + "Label Type": ["Oblika oznake"], + "What should be shown on the label?": ["Kaj bo prikazano na oznaki?"], + "Donut": ["Kolobar"], + "Do you want a donut or a pie?": ["Želite kolobar ali torto?"], + "Show Labels": ["Pokaži oznake"], + "Whether to display the labels. Note that the label only displays when the the 5% threshold.": [ + "Če želite prikazati oznake. Oznake so prikazane le pri vsaj 5-odstotnem pragu." ], - "Sort filter values": ["Razvrsti vrednosti filtra"], - "Sort type": ["Način razvrščanja"], - "Sort ascending": ["Razvrsti naraščajoče"], - "Sort descending": ["Razvrsti padajoče"], - "Sort Metric": ["Mera za razvrščanje"], - "If a metric is specified, sorting will be done based on the metric value": [ - "Če je določena mera, bo razvrščanje izvedeno na podlagi vrednosti mere" + "Put labels outside": ["Postavi oznake zunaj"], + "Put the labels outside the pie?": ["Postavim oznake zunaj torte?"], + "Pie Chart": ["Tortni grafikon"], + "Frequency": ["Frekvenca"], + "The periodicity over which to pivot time. Users can provide\n \"Pandas\" offset alias.\n Click on the info bubble for more details on accepted \"freq\" expressions.": [ + "Periodičnost za vrtenje časa. Uporabnik lahko poda\n psevdonim za zamik v \"Pandas\".\n Kliknite na mehurček za podrobnosti dovoljenih izrazov za \"freq\"." ], - "Sort metric": ["Mera za razvrščanje"], - "You have removed this filter.": ["Odstranili ste ta filter."], - "Restore Filter": ["Povrni filter"], - "${mainControlItem.config?.label}": ["${mainControlItem.config?.label}"], - "Column is required": ["Zahtevan je stolpec"], - "Populate \"Default value\" to enable this control": [ - "Izpolnite \"Privzeto vrednost\", da omogočite ta kontrolnik" + "Time-series Period Pivot": ["Časovna serija - Vrtenje periode"], + "Stack": ["Naloži"], + "Expand": ["Razširi"], + "Show legend": ["Prikaži legendo"], + "Whether to display a legend for the chart": [ + "Če želite prikaz legende za grafikon" ], - "Default value set automatically when \"Default to first item\" is checked": [ - "Privzeta vrednost je samodejno izbrana, če je izbrano \"Privzet prvi element\"" + "Margin": ["Rob"], + "Additional padding for legend.": ["Dodatni razmak za legendo."], + "Legend type": ["Tip legende"], + "Show Value": ["Prikaži vrednost"], + "Show series values on the chart": [ + "Na grafikonu prikaži vrednosti serij" ], - "Default value must be set when \"Required\" is checked": [ - "Privzeta vrednost mora biti določena, če je izbrano \"Obvezno\"" + "Stack series": ["Nalagaj serije"], + "Stack series on top of each other": ["Nalagaj serije eno na drugo"], + "Only Total": ["Samo vsota"], + "Only show the total value on the stacked chart, and not show on the selected category": [ + "Na naloženem grafikonu prikaži samo skupno vsoto, za izbrane kategorije pa ne" ], - "Default value must be set when \"Filter has default value\" is checked": [ - "Privzeta vrednost mora biti določena, če je izbrano \"Filter ima privzeto vrednost\"" + "X-axis": ["X-os"], + "Dimension to use on x-axis.": ["Dimenzija z x-os."], + "Percentage threshold": ["Procentualni prag"], + "Minimum threshold in percentage points for showing labels.": [ + "Minimalni prag v odstotnih točkah za prikaz oznak." ], - "Apply to all panels": ["Uporabi za vse panele"], - "Apply to specific panels": ["Uporabi za določene panele"], - "Only selected panels will be affected by this filter": [ - "Ta filter bo vplival le na izbrane panele" + "Rich tooltip": ["Podroben opis orodja"], + "Shows a list of all series available at that point in time": [ + "Prikaže seznam vseh razpoložljivih podatkovnih serij za istočasno točko" ], - "All panels with this column will be affected by this filter": [ - "Ta filter bo vplival na vse panele s tem stolpcem" + "Tooltip time format": ["Oblika zapisa časa v opisu orodja"], + "Tooltip sort by metric": ["Mera za razvrščanje opisa orodja"], + "Whether to sort tooltip by the selected metric in descending order.": [ + "Če želite padajoče razvrstiti opis orodja z izbrano mero." ], - "All panels": ["Vsi paneli"], - "This chart might be incompatible with the filter (datasets don't match)": [ - "Ta grafikon je lahko nekompatibilen s filtrom (podatkovni seti se ne ujemajo)" + "Tooltip": ["Opis orodja"], + "Last available value seen on %s": [ + "Zadnja razpoložljiva vrednost na %s" ], - "Keep editing": ["Nadaljuj z urejanjem"], - "Yes, cancel": ["Da, prekini"], - "There are unsaved changes.": ["Imate neshranjene spremembe."], - "Are you sure you want to cancel?": ["Ali želite prekiniti?"], - "Error loading chart datasources. Filters may not work correctly.": [ - "Napaka pri nalaganju podatkovnih virov grafikona. Filtri lahko ne delujejo pravilno." + "Not up to date": ["Ni posodobljeno"], + "No data": ["Ni podatkov"], + "No data after filtering or data is NULL for the latest time record": [ + "Ni podatkov po filtriranju ali pa imajo vrednost NULL za zadnji časovni zapis" ], - "Transparent": ["Prozorno"], - "White": ["Belo"], - "All filters": ["Vsi filtri"], - "All charts": ["Vsi grafikoni"], + "Try applying different filters or ensuring your datasource has data": [ + "Poskusite uporabiti druge filtre oz. zagotovite, da so v podatkovnem viru podatki" + ], + "Big Number Font Size": ["Velikost pisave Velike številke"], + "Tiny": ["Drobna"], "Small": ["Majhno"], - "Medium": ["Srednje"], + "Normal": ["Normalna"], "Large": ["Veliko"], - "Tab title": ["Naslov zavihka"], - "Origin": ["Izhodišče"], - "Time granularity": ["Granulacija časa"], - "A reference to the [Time] configuration, taking granularity into account": [ - "Sklic na nastavitve za [Čas], ki upošteva granulacijo" + "Huge": ["Ogromna"], + "Subheader Font Size": ["Velikost pisave podnaslova"], + "Display settings": ["Nastavitve prikaza"], + "Subheader": ["Podnaslov"], + "Description text that shows up below your Big Number": [ + "Besedilo, ki se prikaže pod veliko številko" ], - "One or many columns to group by. High cardinality groupings should include a series limit to limit the number of fetched and rendered series.": [ - "Eden ali več stolpcev za združevanje. Združevanje z visoko kardinalnostjo naj vsebuje omejitev serij, s čimer omejite število pridobljenih in prikazanih serij." + "Force date format": ["Vsili obliko zapisa datuma"], + "Use date formatting even when metric value is not a timestamp": [ + "Oblikovanje datuma uporabi tudi, ko vrednost mere ni časovna značka" ], - "One or many metrics to display": ["Ena ali več mer za prikaz"], - "Visualization type": ["Tip vizualizacije"], - "The type of visualization to display": ["Tip vizualizacije za prikaz"], - "Fixed color": ["Izbrana barva"], - "Use this to define a static color for all circles": [ - "S tem definirate določeno barvo za vse kroge" + "Showcases a single metric front-and-center. Big number is best used to call attention to a KPI or the one thing you want your audience to focus on.": [ + "Prikaže eno vrednost. Velika številka je primerna za poudarek KPI-ja ali vrednosti, na katero želite usmeriti pozornost." ], - "Right axis metric": ["Mera desne osi"], - "Choose a metric for right axis": ["Izberite mero za desno os"], - "Linear color scheme": ["Linearna barvna shema"], - "Color metric": ["P"], - "A metric to use for color": ["Mera za barvo"], - "One or many controls to pivot as columns": [ - "En ali več kontrolnikov za stolpčno vrtenje" + "A Big Number": ["Velika številka"], + "With a subheader": ["S podnaslovom"], + "Formattable": ["Prilagodljiv"], + "Comparison Period Lag": ["Zaostanek obdobja za primerjavo"], + "Based on granularity, number of time periods to compare against": [ + "Na osnovi granulacije, število časovnih obdobij za primerjavo" ], - "Defines the origin where time buckets start, accepts natural dates as in `now`, `sunday` or `1970-01-01`": [ - "Določa izhodišče, kadar se začnejo časovni razdelki. Sprejema naravne zapise kot so `zdaj`, `nedelja` ali `1970-01-01`" + "Comparison suffix": ["Pripona za primerjavo"], + "Suffix to apply after the percentage display": [ + "Pripona za prikaz procenta" ], - "The time granularity for the visualization. Note that you can type and use simple natural language as in `10 seconds`, `1 day` or `56 weeks`": [ - "Granulacija časa za vizualizacijo. Uporabite lahko vnos z naravnim jezikom, kot npr. `10 sekund`, `1 dni` ali `56 tednov`" + "Show Timestamp": ["Prikaži časovno značko"], + "Whether to display the timestamp": [ + "Če želite prikazati časovno značko" ], - "The time column for the visualization. Note that you can define arbitrary expression that return a DATETIME column in the table. Also note that the filter below is applied against this column or expression": [ - "Časovni stolpec za vizualizacijo. Določite lahko poljuben izraz, ki vrne DATETIME stolpec v tabeli. Spodnji filter se nanaša na ta stolpec ali izraz" + "Show Trend Line": ["Pokaži trendno črto"], + "Whether to display the trend line": ["Če želite prikazati trendno črto"], + "Start y-axis at 0": ["Začni y-os z 0"], + "Start y-axis at zero. Uncheck to start y-axis at minimum value in the data.": [ + "Začni y-os z nič. Ne izberite, če želite, da se y-os začne z najmanjšo vrednostjo podatkov." ], - "The time granularity for the visualization. This applies a date transformation to alter your time column and defines a new time granularity. The options here are defined on a per database engine basis in the Superset source code.": [ - "Granulacija časa za to vizualizacijo. Izvede transformacijo podatkov, ki spremeni vaš časovni stolpec in določi novo časovno granulacija. Ta možnost je definirana na ravni sistema podatkovne baze v izvorni kodi Superseta." + "Fix to selected Time Range": ["Nastavi na izbrano časovno obdobje"], + "Fix the trend line to the full time range specified in case filtered results do not include the start or end dates": [ + "Trendno črto nastavite na izbrano obdobje, v primeru, da filtrirani rezultati ne vsebujejo začetnega in/ali končnega datuma" ], - "No filter": ["Brez filtra"], - "The time range for the visualization. All relative times, e.g. \"Last month\", \"Last 7 days\", \"now\", etc. are evaluated on the server using the server's local time (sans timezone). All tooltips and placeholder times are expressed in UTC (sans timezone). The timestamps are then evaluated by the database using the engine's local timezone. Note one can explicitly set the timezone per the ISO 8601 format if specifying either the start and/or end time.": [ - "Časovno obdobje za vizualizacijo. Vsi relativni časi, kot npr. \"Zadnji mesec\", Zadnjih 7 dni\", \"Zdaj\" so izračunani na strežniku z njegovim lokalnim časom. Vsi opisi orodij in časi so izraženi v UTC. Časovne značke se nato izračunajo v podatkovni bazi z njenim lokalnim časovnim pasom. Eksplicitno lahko nastavite časovni pas v ISO 8601 formatu, če določite čas začetka ali konca." + "Showcases a single number accompanied by a simple line chart, to call attention to an important metric along with its change over time or other dimension.": [ + "Prikaže eno vrednost skupaj s preprostim črtnim grafikonom, za poudarek pomembne mere skupaj z njeno časovno spremembo." ], - "Row limit": ["Omejitev št. vrstic"], - "Limits the number of rows that get displayed.": [ - "Omeji število vrstic za prikaz." + "Whisker/outlier options": ["Možnosti grafikona kvantilov"], + "Determines how whiskers and outliers are calculated.": [ + "Določa kako so izračunani kvantili in izstopajoče vrednosti." ], - "Series limit": ["Omejitev št. serij"], - "Limits the number of series that get displayed. A joined subquery (or an extra phase where subqueries are not supported) is applied to limit the number of series that get fetched and rendered. This feature is useful when grouping by high cardinality column(s) though does increase the query complexity and cost.": [ - "Omeji število časovnih vrst za prikaz. S podpoizvedbo (ali dodatno fazo, kjer podpoizvedbe niso podprte) se omeji število časovnih vrst, ki bodo pridobljene za prikaz. Ta funkcija je uporabna pri združevanju s stolpci z veliko kardinalnostjo, vendar poveča kompleksnost poizvedbe." + "Categories to group by on the x-axis.": [ + "Kategorije za združevanje po x-osi." ], - "Metric used to define how the top series are sorted if a series or row limit is present. If undefined reverts to the first metric (where appropriate).": [ - "Mera, ki določa kako so razvrščene prve serije, če je določena omejitev serij ali vrstic. Če ni določena, se uporabi prva mera (kjer je ustrezno)." + "Distribute across": ["Porazdeli glede na"], + "Columns to calculate distribution across. Defaults to temporal column if left empty.": [ + "Stolpci za izračun porazdelitve. Privzeto je izbran časovni stolpec (če je prazno)." ], - "Series": ["Niz"], - "Defines the grouping of entities. Each series is shown as a specific color on the chart and has a legend toggle": [ - "Določa združevanje entitet. Vsak niz je na grafikonu prikazan z določeno barvo in ima lahko prikazano legendo" + "Also known as a box and whisker plot, this visualization compares the distributions of a related metric across multiple groups. The box in the middle emphasizes the mean, median, and inner 2 quartiles. The whiskers around each box visualize the min, max, range, and outer 2 quartiles.": [ + "Znan tudi kot grafikon škatla z brki. prikaže primerjavo porazdelitev povezanih mer v različnih skupinah. Škatla na sredini predstavlja povprečje, mediano in notranja 2 kvartila. Brki na vsaki škatli prikazujejo minimum, maksimum, območje in zunanja dva kvartila." ], - "Entity": ["Entiteta"], - "This defines the element to be plotted on the chart": [ - "Določa element, ki bo izrisan na grafikonu" + "ECharts": ["ECharts"], + "Labels": ["Oznake"], + "Whether to display the labels.": ["Če želite prikaz oznak."], + "Showcases how a metric changes as the funnel progresses. This classic chart is useful for visualizing drop-off between stages in a pipeline or lifecycle.": [ + "Prikaže kako se mera spreminja, ko lijak napreduje. Standardni grafikon za prikaz sprememb med nivoji v procesu ali življenjskem ciklu." ], - "X Axis": ["X os"], - "Metric assigned to the [X] axis": ["Mera za [X] os"], - "Y Axis": ["Y os"], - "Metric assigned to the [Y] axis": ["Mera za [Y] os"], - "Bubble size": ["Velikost mehurčka"], - "Y Axis Format": ["Oblika Y osi"], - "When `Calculation type` is set to \"Percentage change\", the Y Axis Format is forced to `.1%`": [ - "Če je `Vrsta izračuna` nastavljena na \"Procentualna sprememba\", bo oblika Y-osi vsiljena na `.1%`" + "Funnel Chart": ["Lijakasti grafikon"], + "Sequential": ["Sekvenčni"], + "Columns to group by": ["Stolpci za združevanje"], + "General": ["Splošno"], + "Min": ["Min"], + "Minimum value on the gauge axis": ["Najmanjša vrednost na številčnici"], + "Max": ["Max"], + "Maximum value on the gauge axis": ["Največja vrednost na številčnici"], + "Start angle": ["Začetni kot"], + "Angle at which to start progress axis": [ + "Kot, pri katerem se začne os območja" ], - "The color scheme for rendering chart": [ - "Barvna shema za izris grafikona" + "End angle": ["Končni kot"], + "Angle at which to end progress axis": [ + "Kot, pri katerem se konča os območja" ], - "An error occurred while starring this chart": [ - "Pri ocenjevanju grafikona je prišlo do napake" + "Font size": ["Velikost pisave"], + "Font size for axis labels, detail value and other text elements": [ + "Velikost pisave za oznake osi, podrobnosti in druge besedilne elemente" ], - "description": ["opis"], - "bolt": ["vijak"], - "Changing this control takes effect instantly": [ - "Sprememba tega kontrolnika se odrazi takoj" + "Value format": ["Oblika zapisa vrednosti"], + "Additional text to add before or after the value, e.g. unit": [ + "Dodatno besedilo, ki ga dodate pred ali za vrednost, npr. enota" ], - "Customize": ["Prilagodi"], - "Height": ["Višina"], - "Width": ["Širina"], - "Copy chart URL to clipboard": ["Kopiraj URL grafikona na odložišče"], - "Superset Chart": ["Superset grafikon"], - "Export to .JSON format": ["Izvozi v .json format"], - "Export to .CSV format": ["Izvozi v .csv format"], - "Controls labeled ": ["Kontrolniki imenovani "], - "Control labeled ": ["Nastavitev "], - "Open Datasource tab": ["Odpri zavihek s podatkovnim virom"], - "rows": ["vrstic"], - "Limit reached": ["Omejitev dosežena"], - "**Select** a dashboard OR **create** a new one": [ - "**Izberite** nadzorno ploščo ALI **ustvarite** novo" + "Show pointer": ["Prikaži kazalec"], + "Whether to show the pointer": ["Če želite prikazati kazalec"], + "Animation": ["Animacija"], + "Whether to animate the progress and the value or just display them": [ + "Če želite animiran prikaz grafikona" ], - "Please enter a chart name": ["Vnesite ime grafikona"], - "Save chart": ["Shrani grafikon"], - "Save & go to dashboard": ["Shrani in pojdi na nadzorno ploščo"], - "Save as new chart": ["Shrani kot nov grafikon"], - "Save (Overwrite)": ["Shrani (prepiši)"], - "Save as ...": ["Shrani kot ..."], - "Chart name": ["Ime grafikona"], - "Add to dashboard": ["Dodaj na nadzorno ploščo"], - "Select a dashboard": ["Izberite nadzorno ploščo"], - "Copy": ["Kopiraj"], - "rows retrieved": ["vrnjenih vrstic"], - "Sorry, An error occurred": ["Prišlo je do napake"], - "No data": ["Ni podatkov"], - "View samples": ["Ogled vzorcev"], - "Search Metrics & Columns": ["Iskanje mer in stolpcev"], - "Showing %s of %s": ["Prikazanih %s od %s"], - "Show less...": ["Prikaži manj..."], - "Show all...": ["Prikaži vse..."], - "Show Less...": ["Prikaži manj..."], - "New chart": ["Nov grafikon"], - "Edit properties": ["Uredi lastnosti"], - "Run in SQL Lab": ["Zaženi v SQL laboratoriju"], - "%s - untitled": ["%s - neimenovan"], - "Edit chart properties": ["Uredi lastnosti grafikona"], - "You do not have permission to edit this chart": [ - "Nimate dovoljenja za urejanje tega grafikona" + "Axis": ["Os"], + "Show axis line ticks": ["Prikaži oznake na X-osi"], + "Whether to show minor ticks on the axis": [ + "Če želite prikaz manjših oznak na osi" + ], + "Show split lines": ["Prikaži razdelitvene črte"], + "Whether to show the split lines on the axis": [ + "Če želite prikazati razdelitvene črte na osi" ], - "The description can be displayed as widget headers in the dashboard view. Supports markdown.": [ - "Opis je lahko prikazan kot glava gradnika in pogledu nadzorne plošče. Podpira markdown." + "Split number": ["Število razdelitev"], + "Number of split segments on the axis": ["Število razdelkov na osi"], + "Progress": ["Območje"], + "Show progress": ["Prikaži območje"], + "Whether to show the progress of gauge chart": [ + "Prikaži merilno območje števčnega grafikona" ], - "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the dataset's timeout if undefined.": [ - "Časovna veljavnost (v sekundah) predpomnjenja za ta grafikon. Če ni definirana, je uporabljena vrednost za podatkovni set." + "Overlap": ["Prekrivanje"], + "Whether the progress bar overlaps when there are multiple groups of data": [ + "Če želite prekrivanje območij, ko imate več skupin podatkov" ], - "A list of users who can alter the chart. Searchable by name or username.": [ - "Seznam uporabnikov, ki lahko spreminjajo ta grafikon. Možno je iskanje po imenu ali uporabniškem imenu." + "Round cap": ["Zaobljeni konci"], + "Style the ends of the progress bar with a round cap": [ + "Zaobljena oblika koncev območja" ], - "Min": ["Min"], - "Max": ["Max"], - "Select color scheme": ["Izberite barvno shemo"], - "Invalid lat/long configuration.": [ - "Neveljavna nastavitev zemljepisne dolžine/širine." + "Intervals": ["Intervali"], + "Interval bounds": ["Meje intervalov"], + "Comma-separated interval bounds, e.g. 2,4,5 for intervals 0-2, 2-4 and 4-5. Last number should match the value provided for MAX.": [ + "Z vejico ločeni intervali, npr. 2,4,5 za intervale 0-2, 2-4 in 4-5. Zadnja številka naj bo enaka vrednosti za MAX." ], - "Reverse lat/long ": ["Zamenjaj zemljepisno dolžino/širino "], - "Longitude & Latitude columns": ["Stolpci zemljepisne dolžine in širine"], - "Delimited long & lat single column": [ - "En stolpec z ločenima zemljepisno dolžino in širino" + "Interval colors": ["Barve intervalov"], + "Comma-separated color picks for the intervals, e.g. 1,2,4. Integers denote colors from the chosen color scheme and are 1-indexed. Length must be matching that of interval bounds.": [ + "Z vejico ločene barve za intervale, npr. 1,2,4. Cela števila predstavljajo barve iz barvne sheme (začnejo se z 1). Dolžina mora ustrezati mejam intervala." ], - "Multiple formats accepted, look the geopy.points Python library for more details": [ - "Sprejema različne zapise - podrobnosti najdete v Pythonovi knjižnici geopy.points" + "Uses a gauge to showcase progress of a metric towards a target. The position of the dial represents the progress and the terminal value in the gauge represents the target value.": [ + "Uporablja števec za prikaz napredovanja mere k ciljni vrednosti. Položaj kazalca predstavlja napredek, končna vrednost na števcu pa ciljno vrednost." ], - "Geohash": ["Geohash"], - "textarea": ["področje besedila"], - "in modal": ["v modalnem"], - "Failed to verify select options: %s": [ - "Preverjanje možnosti izbire ni uspelo: %s" + "Gauge Chart": ["Števčni grafikon"], + "Name of the source nodes": ["Imena izvornih vozlišč"], + "Name of the target nodes": ["Imena ciljnih vozlišč"], + "Source category": ["Kategorija izvora"], + "The category of source nodes used to assign colors. If a node is associated with more than one category, only the first will be used.": [ + "Kategorija izvornih vozlišč, na podlagi katere je določena barva. Če je vozlišče povezano z več kot eno kategorijo, bo uporabljena samo prva." ], - "Annotation layer value": ["Vrednost sloja z oznakami"], - "Annotation Slice Configuration": ["Nastavitve rezine z oznakami"], - "This section allows you to configure how to use the slice\r\n to generate annotations.": [ - "V tem sklopu lahko nastavite način uporabe rezine\r\n za ustvarjanje oznak." + "Target category": ["Kategorija cilja"], + "Category of target nodes": ["Kategorija ciljnih vozlišč"], + "Chart options": ["Možnosti grafikona"], + "Layout": ["Izgled"], + "Graph layout": ["Izgled grafikona"], + "Force": ["Sila"], + "Layout type of graph": ["Tip izgleda grafikona"], + "Edge symbols": ["Simboli povezav"], + "Symbol of two ends of edge line": ["Simbol za konca povezave"], + "None -> None": ["Brez -> Brez"], + "None -> Arrow": ["Brez -> Puščica"], + "Circle -> Arrow": ["Krog -> Puščica"], + "Circle -> Circle": ["Krog -> Krog"], + "Enable node dragging": ["Omogoči premikanje vozlišč"], + "Whether to enable node dragging in force layout mode.": [ + "Če želite omogočiti premikanje vozlišč v načinu vsiljenega prikaza." ], - "Annotation layer time column": ["Časovni stolpec sloja z oznakami"], - "Interval start column": ["Stolpec začetka intervala"], - "Event time column": ["Stolpec časa dogodka"], - "This column must contain date/time information.": [ - "Ta stolpec mora vsebovati informacijo o datumu/času." + "Enable graph roaming": ["Omogoči preoblikovanje grafikona"], + "Disabled": ["Onemogočeno"], + "Scale only": ["Samo povečava"], + "Move only": ["Samo premikanje"], + "Scale and Move": ["Povečava in premikanje"], + "Whether to enable changing graph position and scaling.": [ + "Če želite omogočiti premikanje in povečevanje/zmanjševanje grafikona." ], - "Annotation layer interval end": ["Konec intervala sloja z oznakami"], - "Interval End column": ["Stolpec konca intervala"], - "Annotation layer title column": ["Stolpec z naslovom sloja z oznakami"], - "Title Column": ["Stolpec z naslovi"], - "Pick a title for you annotation.": ["Izberite naslov za oznako."], - "Annotation layer description columns": [ - "Stolpci z opisi slojev z oznakami" + "Node select mode": ["Način izbire vozlišč"], + "Single": ["Posamezno"], + "Multiple": ["Več"], + "Allow node selections": ["Dovoli izbiro vozlišča"], + "Label threshold": ["Prag oznak"], + "Minimum value for label to be displayed on graph.": [ + "Najmanjša vrednost, za katero bo na grafikonu prikazana oznaka." ], - "Description Columns": ["Stolpci z opisi"], - "Pick one or more columns that should be shown in the annotation. If you don't select a column all of them will be shown.": [ - "Izberite enega ali več stolpcev, ki bodo prikazani v oznakah. Če ne izberete stolpca, bodo prikazani vsi." + "Node size": ["Velikost vozlišča"], + "Median node size, the largest node will be 4 times larger than the smallest": [ + "Mediana velikosti vozlišča. Največje vozlišče bo 4-krat večje od najmanjšega" ], - "Display configuration": ["Prikaži nastavitve"], - "Configure your how you overlay is displayed here.": [ - "Nastavite kako se tukaj prikazuje vrhnja plast." + "Edge width": ["Debelina povezave"], + "Median edge width, the thickest edge will be 4 times thicker than the thinnest.": [ + "Mediana debeline povezave. Najdebelejša povezava bo 4-krat debelejša od najtanjše." ], - "Annotation layer stroke": ["Obroba sloja z oznakami"], - "Style": ["Slog"], - "Annotation layer opacity": ["Prosojnost sloja z oznakami"], - "Opacity": ["Prosojnost"], - "Color": ["Barva"], - "Line width": ["Debelina črte"], - "Layer configuration": ["Nastavitve sloja"], - "Configure the basics of your Annotation Layer.": [ - "Osnovne nastavitve sloja z oznakami." + "Edge length": ["Dolžina povezave"], + "Edge length between nodes": ["Dolžina povezave med vozlišči"], + "Gravity": ["Gravitacija"], + "Strength to pull the graph toward center": [ + "Sila privlačnosti med grafikonom in središčem" ], - "Mandatory": ["Obvezno"], - "Hide layer": ["Skrij sloj"], - "Annotation layer type": ["Tip sloja z oznakami"], - "Choose the annotation layer type": ["Izberite tip sloja z oznakami"], - "Annotation source type": ["Tip vira oznak"], - "Choose the source of your annotations": ["Izberite vir svojih oznak"], - "Annotation Source": ["Vir oznak"], - "Remove": ["Odstrani"], - "Edit annotation layer": ["Uredi sloj z oznakami"], - "Add annotation layer": ["Dodaj sloj z oznakami"], - "Empty collection": ["Prazen izbor"], - "Add an item": ["Dodaj element"], - "Remove item": ["Odstrani element"], - "Edit formatter": ["Uredi oblikovanje"], - "Add new formatter": ["Dodaj novo oblikovanje"], - "Add new color formatter": ["Dodaj novo oblikovanje barve"], - "green": ["zelena"], - "yellow": ["rumena"], - "red": ["rdeča"], - "This value should be smaller than the right target value": [ - "Ta vrednost mora biti manjša od desne ciljne vrednosti" + "Repulsion": ["Odbijanje"], + "Repulsion strength between nodes": ["Odbojna sila med vozlišči"], + "Friction": ["Trenje"], + "Friction between nodes": ["Trenje med vozlišči"], + "Displays connections between entities in a graph structure. Useful for mapping relationships and showing which nodes are important in a network. Graph charts can be configured to be force-directed or circulate. If your data has a geospatial component, try the deck.gl Arc chart.": [ + "Prikaže povezave med entitetami v strukturi grafa. Uporabno za prikaz razmerij in pomembnih točk v omrežju. Grafikon je lahko krožnega tipa ali z usmerjenimi silami. Če imajo podatki geoprostorsko komponento, poskusite grafikon decl.gl - Arc." ], - "This value should be greater than the left target value": [ - "Ta vrednost mora biti večja od leve ciljne vrednosti" + "Graph Chart": ["Graf"], + "Structural": ["Strukturni"], + "Series type": ["Tip serije"], + "Series chart type (line, bar etc)": [ + "Tip grafikona za posamezno podatkovno serijo (črtni, stolpčni, ...)" ], - "Required": ["Obvezno"], - "Operator": ["Operator"], - "Left value": ["Leva vrednost"], - "Right value": ["Desna vrednost"], - "Target value": ["Ciljna vrednost"], - "Select column": ["Izberite stolpec"], - "Edit dataset": ["Uredi podatkovni set"], - "View in SQL Lab": ["Ogled v SQL laboratoriju"], - "More dataset related options": ["Več nastavitev za podatkovni set"], - "The dataset linked to this chart may have been deleted.": [ - "Podatkovni set, povezan s tem grafikonom, je bil izbrisan." + "Area chart": ["Ploščinski grafikon"], + "Draw area under curves. Only applicable for line types.": [ + "Izriši površino pod krivuljo. Samo za črtne grafikone." ], - "RANGE TYPE": ["TIP OBDOBJA"], - "Actual time range": ["Dejansko časovno obdobje"], - "CANCEL": ["PREKINI"], - "APPLY": ["UPORABI"], - "Edit time range": ["Uredi časovno obdobje"], - "Configure Advanced Time Range ": ["Nastavi napredno časovno obdobje "], - "START (INCLUSIVE)": ["ZAČETEK (VKLJUČEN)"], - "Start date included in time range": [ - "Začetni datum je vključen v časovno obdobje" + "Opacity of area chart.": ["Prosojnost ploščinskega grafikona."], + "Marker": ["Marker"], + "Draw a marker on data points. Only applicable for line types.": [ + "Nariši markerje na točke grafikona. Samo za črtne grafikone." ], - "END (EXCLUSIVE)": ["KONEC (NI VKLJUČEN)"], - "End date excluded from time range": [ - "Končni datum ni vključen v časovno obdobje" + "Marker size": ["Velikost markerja"], + "Size of marker. Also applies to forecast observations.": [ + "Velikost markerja. Upošteva se tudi za napovedi." ], - "Configure Time Range: Previous...": [ - "Nastavi časovno obdobje: Prejšnji ..." + "Primary": ["Primarna"], + "Secondary": ["Sekundarna"], + "Primary or secondary y-axis": ["Primarna ali sekundarna y-os"], + "Shared query fields": ["Polja deljenih poizvedb"], + "Query A": ["Poizvedba A"], + "Advanced analytics Query A": ["Poizvedba A za napredno analitiko"], + "Query B": ["Poizvedba B"], + "Advanced analytics Query B": ["Poizvedba B za napredno analitiko"], + "Data Zoom": ["Zoom funkcija"], + "Enable data zooming controls": [ + "Omogoči kontrolnik za povečavo podatkov" ], - "Configure Time Range: Last...": ["Nastavi časovno obdobje: Zadnji ..."], - "Configure custom time range": ["Nastavi prilagojeno časovno obdobje"], - "Relative quantity": ["Relativne vrednosti"], - "Relative period": ["Relativno obdobje"], - "Anchor to": ["Sidraj na"], - "NOW": ["ZDAJ"], - "Date/Time": ["Datum/Čas"], - "Return to specific datetime.": ["Vrne določen datum-čas."], - "Syntax": ["Sintaksa"], - "Example": ["Primer"], - "Moves the given set of dates by a specified interval.": [ - "Premakne dani nabor datumov za definirano obdobje." + "Rotate x axis label": ["Zavrti oznako x-osi"], + "Input field supports custom rotation. e.g. 30 for 30°": [ + "Vnosno polje omogoča poljubno rotacijo (vnesite 30 za 30°)" ], - "Truncates the specified date to the accuracy specified by the date unit.": [ - "Zaokroži določen datum, glede na natančnost, definirano s časovno enoto." + "Minor Split Line": ["Manjša ločilna črta"], + "Draw split lines for minor y-axis ticks": [ + "Izriši ločilne črte za pomožne oznake y-osi" ], - "Get the last date by the date unit.": [ - "Pridobi zadnji datum glede na časovno enoto." + "Truncate Y Axis": ["Prireži Y-os"], + "Truncate Y Axis. Can be overridden by specifying a min or max bound.": [ + "Prireži Y-os. Če določite spodnjo ali zgornjo mejo, preprečite prirezovanje." ], - "Get the specify date for the holiday": ["Določi datum praznika"], - "Last": ["Zadnji"], - "Previous": ["Prejšnji"], - "Custom": ["Prilagojen"], - "last day": ["zadnji dan"], - "last week": ["zadnji teden"], - "last month": ["zadnji mesec"], - "last quarter": ["zadnje četrletje"], - "last year": ["zadnje leto"], - "previous calendar week": ["prejšnji koledarski teden"], - "previous calendar month": ["prejšnji koledarski mesec"], - "previous calendar year": ["prejšnje koledarsko leto"], - "Before": ["PRED"], - "After": ["PO"], - "Specific Date/Time": ["Fiksen Datum/Čas"], - "Relative Date/Time": ["Relativen Datum/Čas"], - "Now": ["Zdaj"], - "Midnight": ["Polnoč"], - "Saved expressions": ["Shranjeni izrazi"], - "Saved": ["Shranjeno"], - "%s column(s)": ["Stolpci: %s"], - "Simple": ["Preprosto"], - "Drop a column here or click": ["Spustite stolpec sem ali kliknite"], - "Drop column here": ["Spustite stolpec sem"], - "Drop columns/metrics here or click": [ - "Spustite stolpce/mere sem ali kliknite" + "Primary y-axis format": ["Oblika primarne y-osi"], + "Logarithmic y-axis": ["Logaritemska y-os"], + "Logarithmic scale on primary y-axis": [ + "Logaritemska skala na primarni y-osi" + ], + "Secondary y-axis format": ["Oblika sekundarne y-osi"], + "Secondary y-axis title": ["Naslov sekundarne y-osi"], + "Logarithmic scale on secondary y-axis": [ + "Logaritemska skala na sekundarni y-osi" + ], + "Visualize two different series using the same x-axis. Note that both series can be visualized with a different chart type (e.g. 1 using bars and 1 using a line).": [ + "Prikaže dva različna niza na isti x-osi. Niza sta lahko prikazana z različnim tipom grafikona (npr. en s stolpci in drug s črto)." + ], + "Visualize two different time series using the same x-axis. Note that each time series can be visualized differently (e.g. 1 using bars and 1 using a line).": [ + "Prikaže dve različni časovni vrsti na isti x-osi. Časovni vrsti sta lahko prikazani različno (npr. ena s stolpci in druga s črto)." ], - "Drop columns or metrics here": ["Spustite stolpce ali mere sem"], - "Drop a column/metric here or click": [ - "Spustite stolpec/mero sem ali kliknite" + "Mixed Chart": ["Kombinirani grafikon"], + "Mixed Time-Series": ["Kombiniran grafikon časovne vrste"], + "Put the labels outside of the pie?": ["Postavim oznake zunaj torte?"], + "Label Line": ["Črta oznake"], + "Draw line from Pie to label when labels outside?": [ + "Ali želite črto do oznake, ko so le-te zunaj?" ], - "Drop column or metric here": ["Spustite stolpec ali mero sem"], - "Drop columns here": ["Spustite stolpce sem"], - "\r\n This filter was inherited from the dashboard's context.\r\n It won't be saved when saving the chart.\r\n ": [ - "\r\n Ta filter izvira iz konteksta nadzorne plošče.\r\n Pri shranjevanju grafikona se ne bo shranil.\r\n " + "Show Total": ["Pokaži vsoto"], + "Whether to display the aggregate count": [ + "Če želite prikazati agregirano število" ], - "Default": ["Privzeto"], - "(optional) default value for the filter, when using the multiple option, you can use a semicolon-delimited list of options.": [ - "(opcijsko) privzeta vrednost za filter, če uporabite opcijo izbire večih , lahko uporabite seznam nastavitev ločen s podpičji." + "Pie shape": ["Oblika torte"], + "Outer Radius": ["Zunanji polmer"], + "Outer edge of Pie chart": ["Zunanji rob tortnega grafikona"], + "Inner Radius": ["Notranji polmer"], + "Inner radius of donut hole": ["Notranji polmer kolobarja"], + "The classic. Great for showing how much of a company each investor gets, what demographics follow your blog, or what portion of the budget goes to the military industrial complex.\n\n Pie charts can be difficult to interpret precisely. If clarity of relative proportion is important, consider using a bar or other chart type instead.": [ + "Standardni grafikon za prikaz deležev. Tortne grafikone je težje natančno interpretirati, takrat lahko uporabite npr. stolpčni grafikon." ], - "Metric to sort the results by": ["Mera za razvrščanje rezultatov"], - "Check for sorting ascending": ["Označi za naraščajoče razvrščanje"], - "Allow multiple selections": ["Dovoli več izbir"], - "Multiple selections allowed, otherwise filter is limited to a single value": [ - "Lahko izberete več elementov, drugače pa je filter omejen na eno vrednost" + "Total: %s": ["Vsota: %s"], + "The maximum value of metrics. It is an optional configuration": [ + "Največja vrednost mere. To je opcijska nastavitev" ], - "Search all filter options": ["Poišči vse možnosti filtra"], - "By default, each filter loads at most 1000 choices at the initial page load. Check this box if you have more than 1000 filter values and want to enable dynamically searching that loads filter values as users type (may add stress to your database).": [ - "Privzeto vsak filter pri nalaganju začetne strani naloži največ 1000 možnosti. Označite polje, če imate več kot 1000 vrednosti filtra in želite omogočiti dinamično iskanje, ki nalaga vrednosti filtra ko uporabnik tipka (to lahko preobremeni vašo podatkovno bazo)." + "Label position": ["Položaj oznake"], + "Radar": ["Radar"], + "Customize Metrics": ["Prilagodi mere"], + "Further customize how to display each metric": [ + "Dodatne prilagoditve prikaza posameznih mer" ], - "User must select a value for this filter": [ - "Uporabnik mora izbrati vrednost za ta filter" + "Circle radar shape": ["Okrogla oblika radarja"], + "Radar render type, whether to display 'circle' shape.": [ + "Način prikaza radarja - če se prikaže okrogla oblika." ], - "Filter configuration": ["Nastavitve filtra"], - "Custom SQL ad-hoc filters are not available for the native Druid connector": [ - "Ad-hoc SQL filtri po meri niso na voljo za nativni konektor za Druid" + "Visualize a parallel set of metrics across multiple groups. Each group is visualized using its own line of points and each metric is represented as an edge in the chart.": [ + "Prikaže vzporedni nabor mer za različne skupine. Vsaka skupina je prikazana s svojim naborom točk in vsaka mera s povezavo na grafikonu." ], - "Custom SQL": ["Prilagojen SQL"], - "%s option(s)": ["Možnosti: %s"], - "Select subject": ["Izberite zadevo"], - "No such column found. To filter on a metric, try the Custom SQL tab.": [ - "Tak stolpec ni najden. Za filtriranje po meri uporabite prilagojen SQL zavihek." + "Radar Chart": ["Radarski grafikon"], + "Contribution Mode": ["Način deležev"], + "Calculate contribution per series or row": [ + "Izračunaj delež za serijo ali vrstico" ], - "%s column(s) and metric(s)": ["Stolpcev in mer: %s"], - "To filter on a metric, use Custom SQL tab.": [ - "Za filtriranje po meri uporabite prilagojen SQL zavihek." + "Series Style": ["Slog serije"], + "Area chart opacity": ["Prosojnost ploščinskega grafikona"], + "Opacity of Area Chart. Also applies to confidence band.": [ + "Prosojnost ploščinskega grafikona. Upošteva se tudi za interval zaupanja." ], - "%s operator(s)": ["Operatorji: %s"], - "Select operator": ["Izberite operator"], - "Comparator option": ["Možnosti komparatorja"], - "Type a value here": ["Vnesite vrednost sem"], - "Filter value (case sensitive)": [ - "Vrednost filtra (razlik. velikih/malih črk)" + "Marker Size": ["Velikost markerja"], + "Swiss army knife for visualizing data. Choose between step, line, scatter, and bar charts. This viz type has many customization options as well.": [ + "Univerzalni grafikon za vizualizacijo podatkov. Izbirajte med stopničastimi, črtnimi, raztresenimi in stolpčnimi grafikoni. Grafikon ima širok nabor prilagoditev." ], - "choose WHERE or HAVING...": ["izberite WHERE ali HAVING..."], - "Filters by columns": ["Filtrira po stolpcu"], - "Filters by metrics": ["Filtrira po merah"], - "Fixed": ["Fiksno"], - "Based on a metric": ["Osnovan na meri"], - "My metric": ["Moja mera"], - "Add metric": ["Dodaj mero"], - "Select aggregate options": ["Izberite agregacijske možnosti"], - "%s aggregates(s)": ["Agreg. funkcije: %s"], - "Select saved metrics": ["Izberite shranjene mere"], - "%s saved metric(s)": ["Shranjene mere: %s"], - "Saved metric": ["Shranjena mera"], - "Simple ad-hoc metrics are not enabled for this dataset": [ - "Preproste ad-hoc mere za ta podatkovni set niso omogočene" + "Swiss army knife for visualizing time series data. Choose between step, line, scatter, and bar charts. This viz type has many customization options as well.": [ + "Univerzalni grafikon za prikaz časovnih vrst. Izbirajte med stopničnimi, črtnimi, raztresenimi in stolpčnimi grafikoni. Grafikon ima širok nabor prilagoditev." ], - "column": ["stolpec"], - "aggregate": ["agregacija"], - "Custom SQL ad-hoc metrics are not available for the native Druid connector": [ - "Ad-hoc SQL mere po meri niso na voljo za nativni konektor za Druid" + "Generic Chart": ["Generičen grafikon"], + "Time-series Chart": ["Grafikon časovne vrste"], + "zoom area": ["približaj območje"], + "restore zoom": ["ponastavi prikaz"], + "Area charts are similar to line charts in that they represent variables with the same scale, but area charts stack the metrics on top of each other.": [ + "Ploščinski grafikoni so podobni črtnim grafikonom, saj predstavljajo spremenljivke v istem razmerju, vendar se pri ploščinskih grafikonih mere nalagajo ena na drugo." ], - "Custom SQL ad-hoc metrics are not enabled for this dataset": [ - "Ad-hoc SQL mere po meri za ta podatkovni set niso omogočene" + "Time-series Area chart are similar to line chart in that they represent variables with the same scale, but area charts stack the metrics on top of each other. An area chart in Superset can be stream, stack, or expand.": [ + "Ploščinski grafikoni časovne vrste so podobni črtnim grafikonom, saj predstavljajo spremenljivke v istem razmerju, vendar se pri ploščinskih grafikonih mere nalagajo ena na drugo." ], - "Time series columns": ["Stolpci s časovnimi vrstami"], - "Other": ["Ostali"], - "Popular": ["Priljubljeni"], - "ECharts": ["ECharts"], - "Advanced-Analytics": ["Napredna analitika"], - "Recommended tags": ["Priporočene značke"], - "Category": ["Kategorija"], - "Tags": ["Značke"], - "Search all charts": ["Išči vse grafikone"], - "No description available.": ["Opisa ni na razpolago."], - "Examples": ["Vzorci"], - "This visualization type is not supported.": [ - "Ta tip vizualizacije ni podprt." + "Area Chart v2": ["Ploščinski grafikon v2"], + "Time-series Area Chart": ["Ploščinski grafikon časovne vrste"], + "Axis Title": ["Naslov osi"], + "AXIS TITLE MARGIN": ["OBROBA OZNAKE OSI"], + "AXIS TITLE POSITION": ["POLOŽAJ OZNAKE OSI"], + "Rotate axis label": ["Zavrti oznako osi"], + "Axis Format": ["Oblika osi"], + "Logarithmic axis": ["Logaritemska os"], + "Draw split lines for minor axis ticks": [ + "Izriši ločilne črte za pomožne oznake osi" + ], + "Truncate Axis": ["Prireži os"], + "It’s not recommended to truncate axis in Bar chart.": [ + "V stolpčnem grafikonu ni priporočljivo omejiti osi." + ], + "Axis Bounds": ["Meje osi"], + "Bounds for the axis. When left empty, the bounds are dynamically defined based on the min/max of the data. Note that this feature will only expand the axis range. It won't narrow the data's extent.": [ + "Meje osi. Če je prazno, se meje nastavijo dinamično na podlagi min./max. vrednosti podatkov. Funkcija omeji le prikaz, obseg podatkov pa ostane enak." + ], + "Chart Orientation": ["Orientacija grafikona"], + "Bar orientation": ["Orientacija stolpcev"], + "Horizontal": ["Vodoravno"], + "Orientation of bar chart": ["Orientacija stolpčnega grafikona"], + "Bar Charts are used to show metrics as a series of bars.": [ + "Stolpčni grafikoni se uporabljajo za prikaz mer z nizi stolpcev." ], - "Select Viz Type": ["Izberite tip vizualizacije"], - "Click to change visualization type": [ - "Kliknite za spremembo tipa vizualizacije" + "Time-series Bar Charts are used to show the changes in a metric over time as a series of bars.": [ + "Stolpčni grafikoni časovne vrste se uporabljajo za prikaz sprememb mere skozi čas s pomočjo niza stolpcev." ], - "Select a visualization type": ["Izberite tip vizualizacije"], - "Select": ["Izberi"], - "Code": ["Koda"], - "Markup type": ["Tip označevanja"], - "Pick your favorite markup language": [ - "Izberite svoj priljubljen označevalni jezik" + "Bar Chart v2": ["Stolpčni grafikon v2"], + "Time-series Bar Chart v2": ["Stolpčni grafikon časovne vrste v2"], + "Line chart is used to visualize measurements taken over a given category. Line chart is a type of chart which displays information as a series of data points connected by straight line segments. It is a basic type of chart common in many fields.": [ + "Črtni grafikon se uporablja se za vizualizacijo meritev zajetih skozi čas. Posamezne točke so med seboj povezane z ravnimi črtami." ], - "Put your code here": ["Vstavite svojo kodo sem"], - "Query": ["Poizvedba"], - "URL": ["URL"], - "Templated link, it's possible to include {{ metric }} or other values coming from the controls.": [ - "Vzorčna povezava, vključiti je mogoče {{ metric }} ali drugo vrednost iz kontrolnikov." + "Time-series line chart is used to visualize repeated measurements taken over regular time intervals. Line chart is a type of chart which displays information as a series of data points connected by straight line segments. It is a basic type of chart common in many fields.": [ + "Črtni grafikon časovne vrste je osnovni grafikon, ki se uporablja na različnih področjih. Uporablja se za vizualizacijo meritev zajetih skozi čas. Posamezne točke so med seboj povezane z ravnimi črtami." ], - "Time": ["Čas"], - "Time related form attributes": ["S časom povezani atributi prikaza"], - "Chart type": ["Tip grafikona"], - "Chart ID": ["ID grafikona"], - "The id of the active chart": ["Identifikator aktivnega grafikona"], - "Cache Timeout (seconds)": ["Trajanje predpomnilnika (sekunde)"], - "The number of seconds before expiring the cache": [ - "Trajanje (v sekundah) do razveljavitve predpomnilnika" + "Time-series Line Chart": ["Črtni grafikon časovne vrste"], + "Scatter Plot has the horizontal axis in linear units, and the points are connected in order. It shows a statistical relationship between two variables.": [ + "Raztreseni grafikon ima vodoravno os v linearnih enotah, prikazuje podatkovne točke v povezanem redu in prikazuje statistično razmerje med dvema spremenljivkama." ], - "URL parameters": ["Parametri URL"], - "Extra parameters for use in jinja templated queries": [ - "Dodatni parametri za poizvedbe z jinja predlogami" + "Time-series Scatter Plot has time on the horizontal axis in linear units, and the points are connected in order. It shows a statistical relationship between two variables.": [ + "Raztreseni grafikon časovne vrste prikazuje podatkovne točke v povezanem redu in prikazuje statistično razmerje med spremenljivkami." ], - "Time range endpoints": ["Krajne točke časovnega obdobja"], - "Time range endpoints (SIP-15)": [ - "Krajne točke časovnega obdobja (SIP-15)" + "Scatter Plot": ["Raztreseni grafikon"], + "Time-series Scatter Plot": ["Raztreseni grafikon časovne vrste"], + "Smooth-line is a variation of the line chart. Without angles and hard edges, Smooth-line sometimes looks smarter and more professional.": [ + "Zglajeni črtni grafikon je izpeljanka črtnega grafikona, ki zgladi ostre robove krivulje." ], - "Annotations and layers": ["Oznake in sloji"], - "Whether to sort descending or ascending": [ - "Če želite padajoče ali naraščajoče razvrščanje" + "Time-series Smooth-line is a variation of the line chart. Without angles and hard edges, Smooth-line sometimes looks smarter and more professional.": [ + "Zglajeni grafikon časovne vrste je izpeljanka črtnega grafikona, ki zgladi ostre robove krivulje." ], - "Contribution": ["Prispevek"], - "Compute the contribution to the total": ["Izračunaj prispevek k celoti"], - "Advanced analytics": ["Napredna analitika"], - "This section contains options that allow for advanced analytical post processing of query results": [ - "Ta sekcija vsebuje možnosti, ki omogočajo napredno analitično poprocesiranje rezultatov poizvedb" + "Smooth Line": ["Zglajena črta"], + "Time-series Smooth Line": ["Zglajeni črtni grafikon časovne vrste"], + "Step type": ["Stopnični tip"], + "Defines whether the step should appear at the beginning, middle or end between two data points": [ + "Določa, če se na začetku, na sredini ali na koncu pojavi stopnica med dvema točkama" ], - "Rolling window": ["Drseče okno"], - "Rolling function": ["Drseča funkcija"], - "Defines a rolling window function to apply, works along with the [Periods] text box": [ - "Določi funkcijo drsečega okna. Dela skupaj s tekstovnim okvirjem [Obdobja]" + "Stepped-line graph (also called step chart) is a variation of line chart but with the line forming a series of steps between data points. A step chart can be useful when you want to show the changes that occur at irregular intervals.": [ + "Stopničasti grafikon je izpeljanka črtnega grafikona, pri čemer krivuljo tvorijo stopnice med posameznimi točkami. Koristen je za prikaz sprememb na posameznih intervalih." ], - "Periods": ["Št. period"], - "Defines the size of the rolling window function, relative to the time granularity selected": [ - "Določi velikost funkcije drsečega okna, glede na izbrano granulacijo časa" + "Time-series Stepped-line graph (also called step chart) is a variation of line chart but with the line forming a series of steps between data points. A step chart can be useful when you want to show the changes that occur at irregular intervals.": [ + "Stopnični grafikon časovne vrste je izpeljanka črtnega grafikona, pri čemer krivuljo tvorijo stopnice med posameznimi točkami. Koristen je za prikaz sprememb na posameznih intervalih." ], - "Min periods": ["Min. št. period"], - "The minimum number of rolling periods required to show a value. For instance if you do a cumulative sum on 7 days you may want your \"Min Period\" to be 7, so that all data points shown are the total of 7 periods. This will hide the \"ramp up\" taking place over the first 7 periods": [ - "Minimalno število drsečih obdobij, potrebnih za prikaz vrednosti. Če računate kumulativno vsoto 7-dnevnega obdobja, boste nastavili \"Min. št. period\" na 7. Tako bodo vse prikazane točke skupaj obsegale 7 obdobij. To bo prikrilo rampo, ki bi trajala prvih 7 obdobij" + "Stepped Line": ["Stopničasta črta"], + "Time-series Stepped Line": ["Stopnični črtni grafikon časovne vrste"], + "Id": ["Id"], + "Name of the id column": ["Naziv id-stolpca"], + "Parent": ["Nadrejeni"], + "Name of the column containing the id of the parent node": [ + "Ime stolpca, ki vsebuje id nadrejenega vozlišča" ], - "Time comparison": ["Časovna primerjava"], - "Time shift": ["Časovni zamik"], - "Overlay one or more timeseries from a relative time period. Expects relative time deltas in natural language (example: 24 hours, 7 days, 52 weeks, 365 days). Free text is supported.": [ - "Zamaknite eno ali več časovnih vrst za relativno časovno obdobje. Vnaša se relativne časovne razlike v naravnem jeziku (npr. 24 ur, 7 dni, 52 tednov, 365 dni). Prosto besedilo je podprto." + "Optional name of the data column.": [ + "Opcijsko ime podatkovnega stolpca." ], - "Calculation type": ["Tip izračuna"], - "How to display time shifts: as individual lines; as the difference between the main time series and each time shift; as the percentage change; or as the ratio between series and time shifts.": [ - "Način prikaza časovnih zamikov: kot samostojne črte; kot razlike med osnovno časovno vrsto in vsakim časovnim zamikom; kot procentualna sprememba; kot razmerje med vrsto in časovnim zamikom." + "Root node id": ["Id korenskega vozlišča"], + "Id of root node of the tree.": ["Id korenskega vozlišča drevesa."], + "Metric for node values": ["Mera za vrednosti vozlišč"], + "Tree layout": ["Oblika drevesa"], + "Orthogonal": ["Pravokotna"], + "Radial": ["Radialna"], + "Layout type of tree": ["Način izgleda drevesa"], + "Tree orientation": ["Orientacija drevesa"], + "Left to Right": ["Iz leve proti desni"], + "Right to Left": ["Iz desne proti levi"], + "Top to Bottom": ["Iz vrha proti dnu"], + "Bottom to Top": ["Iz dna proti vrhu"], + "Orientation of tree": ["Orientacija drevesa"], + "Node label position": ["Položaj oznake vozlišča"], + "left": ["levo"], + "top": ["zgoraj"], + "right": ["desno"], + "bottom": ["spodaj"], + "Position of intermidiate node label on tree": [ + "Položaj vmesne oznake vozlišča na drevesu" ], - "Python functions": ["Pythonove funkcije"], - "Rule": ["Pravilo"], - "Pandas resample rule": ["Pravilo za prevzorčenje v Pandas"], - "Method": ["Metoda"], - "Pandas resample method": ["Metoda za prevzorčenje v Pandas"], - "No columns": ["Brez stolpcev"], - "%s option": ["%s možnost"], - "UI Configuration": ["UI nastavitve"], - "Multiple select": ["Več izborov"], - "Allow selecting multiple values": ["Dovoli izbiro več vrednosti"], - "User must select a value for this filter.": [ - "Uporabnik mora izbrati vrednost za ta filter." + "Child label position": ["Položaj podrejene oznake"], + "Position of child node label on tree": [ + "Položaj oznake podrejenega vozlišča na drevesu" ], - "Group By filter plugin": ["Vtičnik za filter za združevanje"], - "Experimental": ["Eksperimentalno"], - "Chosen non-numeric column": ["Izbran ne-numeričen stolpec"], - "Range filter plugin using AntD": [ - "Vtičnik za filter obdobja z uporabo AntD" + "Emphasis": ["Poudari"], + "ancestor": ["nadrejeni"], + "descendant": ["podrejeni"], + "Which relatives to highlight on hover": [ + "Kateri element se poudari na prehodu z miško" ], - "User must select a value before applying the filter": [ - "Uporabnik mora izbrati vrednost pred uporabo filtra" + "Symbol": ["Simbol"], + "Empty circle": ["Prazen krog"], + "Circle": ["Krog"], + "Rectangle": ["Pravokotnik"], + "Triangle": ["Trikotnik"], + "Diamond": ["Karo"], + "Pin": ["Žebljiček"], + "Arrow": ["Puščica"], + "Symbol size": ["Velikost simbola"], + "Size of edge symbols": ["Velikost simbola povezave"], + "Visualize multiple levels of hierarchy using a familiar tree-like structure.": [ + "Prikaz več hierarhičnih nivojev z drevesno strukturo." + ], + "Tree Chart": ["Drevesni grafikon"], + "Show Upper Labels": ["Prikaži zgornje oznake"], + "Show labels when the node has children.": [ + "Prikaži oznake, ko ima vozlišče podrejene elemente." + ], + "Show hierarchical relationships of data, with with the value represented by area, showing proportion and contribution to the whole.": [ + "Prikaže hierarhična razmerja podatkov, pri čemer je vrednost ponazorjena s ploščino, in deleže oz. prispevke k celoti." ], - "Default to first item": ["Privzet prvi element"], - "Select first item by default (when using this option, default value can’t be set)": [ - "Izberi prvi element kot privzet (ko uporabljate to možnost, privzete vrednost ni mogoče nastaviti)" + "Treemap v2": ["Drevesni grafikon s pravokotniki v2"], + "page_size.all": ["page_size.all"], + "Handlebars": ["Handlebars"], + "must have a value": ["mora imeti vrednost"], + "Handlebars Template": ["Predloga za Handlebars"], + "A handlebars template that is applied to the data": [ + "Predloga za Handlebars, ki je uporabljena za podatke" + ], + "Include time": ["Vključi čas"], + "Whether to include the time granularity as defined in the time section": [ + "Če želite vključiti granulacijo časa, ki je določena v sekciji Čas" + ], + "Percentage metrics": ["Procentualne mere"], + "Metrics for which percentage of total are to be displayed. Calculated from only data within the row limit.": [ + "Mera, za katero je prikazan odstotek od celote. Izračunan je samo iz podatkov znotraj omejitve števila vrstic." + ], + "Show total aggregations of selected metrics. Note that row limit does not apply to the result.": [ + "Prikaži skupno agregacijo izbrane mere. Omejitev števila vrstic ne vpliva na rezultat." + ], + "Ordering": ["Razvrščanje"], + "Order results by selected columns": [ + "Razvrsti rezultate glede na izbrani stolpec" ], - "Inverse selection": ["Invertiraj izbiro"], - "Exclude selected values": ["Izloči izbrane vrednosti"], - "Select filter plugin using AntD": [ - "Izberite Vtičnik za filter z uporabo AntD" + "Server pagination": ["Paginacija na strani strežnika"], + "Enable server side pagination of results (experimental feature)": [ + "Omogoči številčenje strani rezultatov na strani strežnika (preizkusna funkcija)" ], - "Custom time filter plugin": ["Prilagojeni vtičnik za časovni filter"], - "No time columns": ["Ni časovnih stolpcev"], - "Time column filter plugin": ["Vtičnik za časovni filter"], - "Time grain filter plugin": ["Vtičnik za filter časovne granulacije"], - "Favorites": ["Priljubljene"], - "Created content": ["Ustvarjena vsebina"], - "Recent activity": ["Nedavna aktivnost"], - "Security & Access": ["Varnost in Dostopi"], - "No charts": ["Ni grafikonov"], - "No dashboards": ["Ni nadzornih plošč"], - "No favorite charts yet, go click on stars!": [ - "Priljubljenih grafikonov še ni. Kliknite na zvezdice!" + "Server Page Length": ["Dolžina strani strežnika"], + "Rows per page, 0 means no pagination": [ + "Vrstic na stran (0 pomeni brez številčenja strani)" ], - "No favorite dashboards yet, go click on stars!": [ - "Priljubljenih nadzornih plošč še ni. Kliknite na zvezdice!" + "Query mode": ["Poizvedbeni način"], + "Group By, Metrics or Percentage Metrics must have a value": [ + "Združevanje, Mera ali Procentualna mera morajo imeti vrednost" ], - "Profile picture provided by Gravatar": [ - "Profilno sliko je zagotovil Gravatar" + "CSS Styles": ["CSS slogi"], + "CSS applied to the chart": ["CSS slogi uporabljeni za grafikon"], + "Columns to group by on the columns": ["Stolpci za združevanje stolpcev"], + "Rows": ["Vrstice"], + "Columns to group by on the rows": ["Stolpci za združevanje vrstic"], + "Apply metrics on": ["Uporabi mero na"], + "Use metrics as a top level group for columns or for rows": [ + "Uporabi mere kot vrhovni nivo grupiranja za stolpce ali vrstice" ], - "joined": ["pridružen"], - "id:": ["id:"], - "There was an issue fetching reports attached to this dashboard.": [ - "Pri pridobivanju poročil za to nadzorno ploščo je prišlo do težave." + "Cell limit": ["Omejitev celice"], + "Limits the number of cells that get retrieved.": [ + "Omeji število pridobljenih celic." ], - "The report has been created": ["Poročilo je bilo ustvarjeno"], - "An error occurred while editing this report: %s": [ - "Pri urejanju tega poročila je prišlo do napake: %s" + "Metric used to define how the top series are sorted if a series or cell limit is present. If undefined reverts to the first metric (where appropriate).": [ + "Mera, ki določa kako so razvrščene prve serije, če je določena omejitev serij ali vrstic. Če ni določena, se uporabi prva mera (kjer je ustrezno)." ], - "An error occurred while editing this report.": [ - "Pri urejanju tega poročila je prišlo do napake." + "Show rows total": ["Prikaži vsoto vrstic"], + "Display row level total": ["Prikaži vsote na nivoju vrstic"], + "Show columns total": ["Prikaži vsoto stolpcev"], + "Display column level total": ["Prikaži vsote na nivoju stolpcev"], + "Transpose pivot": ["Transponirano vrtenje"], + "Swap rows and columns": ["Zamenjaj vrstice in stolpce"], + "Combine metrics": ["Združuj mere"], + "D3 time format for datetime columns": [ + "D3 oblika zapisa za časovne stolpce" ], - "We were unable to active or deactivate this report.": [ - "Aktiviranje ali deaktiviranje poročila ni uspelo." + "Sort rows by": ["Razvrsti vrstice"], + "key a-z": ["a - ž"], + "key z-a": ["ž - a"], + "value ascending": ["0 - 9"], + "value descending": ["9 - 0"], + "Change order of rows.": ["Spremeni vrstni red vrstic."], + "Available sorting modes:": ["Razpoložljivi načini razvrščanja:"], + "By key: use row names as sorting key": [ + "Po ključu: za razvrščanje uporabite imena vrstic" ], - "Your report could not be deleted": [ - "Vašega poročila ni mogoče izbrisati" + "By value: use metric values as sorting key": [ + "Po vrednosti: za razvrščanje uporabite vrednosti mere" ], - "Deleted: %s": ["Izbrisano: %s"], - "Image download failed, please refresh and try again.": [ - "Prenos slike ni uspel. Osvežite in poskusite ponovno." + "Sort columns by": ["Razvrsti stolpce"], + "Change order of columns.": ["Spremeni vrstni red stolpcev."], + "By key: use column names as sorting key": [ + "Po ključu: za razvrščanje uporabite imena stolpcev" ], - "Unexpected error: ": ["Nepričakovana napaka: "], - "(no description, click to see stack trace)": [ - "(ni opisa, kliknite za ogled zapisov)" + "Rows subtotal position": ["Položaj vsot vrstic"], + "Top": ["Zgoraj"], + "Bottom": ["Spodaj"], + "Position of row level subtotal": ["Položaj vsot na nivoju vrstic"], + "Columns subtotal position": ["Položaj delnih vsot stolpcev"], + "Position of column level subtotal": ["Položaj vsot na nivoju stolpcev"], + "Conditional formatting": ["Pogojno oblikovanje"], + "Apply conditional color formatting to metrics": [ + "Za mere uporabi pogojno oblikovanje z barvami" ], - "Issue 1000 - The dataset is too large to query.": [ - "Težava 1000 - podatkovni vir je prevelik za poizvedbo." + "Used to summarize a set of data by grouping together multiple statistics along two axes. Examples: Sales numbers by region and month, tasks by status and assignee, active users by age and location. Not the most visually stunning visualization, but highly informative and versatile.": [ + "Ponazori podatke na podlagi združevanja več statistik vzdolž dveh osi. Npr. prodaja po regijah in mesecih, opravila po statusih in izvajalcih, itd." ], - "Issue 1001 - The database is under an unusual load.": [ - "Težava 1001 - podatkovni vir je neobičajno obremenjen." + "Pivot Table v2": ["Vrtilna tabela v2"], + "Unknown input format": ["Neznana oblika vnosa"], + "search.num_records": ["search.num_records"], + "page_size.show": ["page_size.show"], + "page_size.entries": ["page_size.entries"], + "Totals": ["Vsote"], + "Timestamp format": ["Oblika zapisa časovne značke"], + "Page length": ["Dolžina strani"], + "Search box": ["Iskalno polje"], + "Whether to include a client-side search box": [ + "Če želite vključiti iskalno polje za uporabnika" ], - "An error occurred while fetching %s info: %s": [ - "Napaka pri pridobivanju informacij za %s: %s" + "Cell bars": ["Stolp. graf v celicah"], + "Whether to align background charts with both positive and negative values at 0": [ + "Če želite poravnati graf v ozadju celic za negativne in pozitivne vrednosti okrog 0" ], - "An error occurred while fetching %ss: %s": [ - "Napaka pri pridobivanju informacij za %s: %s" + "Allow columns to be rearranged": ["Omogoči razvrščanje stolpcev"], + "Allow end user to drag-and-drop column headers to rearrange them. Note their changes won't persist for the next time they open the chart.": [ + "Uporabniku omogočite, da s potegom razvrsti stolpce. Sprememba se ne bo ohranila, ko bo grafikon ponovno naložen." ], - "An error occurred while creating %ss: %s": [ - "Napaka pri ustvarjanju %s: %s" + "Customize columns": ["Prilagodi stolpce"], + "Further customize how to display each column": [ + "Dodatne prilagoditve prikaza posameznih stolpcev" ], - "An error occurred while importing %s: %s": [ - "Napaka pri uvažanju %s: %s" + "Apply conditional color formatting to numeric columns": [ + "Za numerične stolpce uporabi pogojno oblikovanje z barvami" ], - "There was an error fetching the favorite status: %s": [ - "Napaka pri pridobivanju statusa \"Priljubljeno\": %s" + "Classic row-by-column spreadsheet like view of a dataset. Use tables to showcase a view into the underlying data or to show aggregated metrics.": [ + "Standardna razpredelnica za prikaz podatkovnega seta." ], - "There was an error saving the favorite status: %s": [ - "Napaka pri shranjevanju statusa \"Priljubljeno\": %s" + "Word Cloud": ["Oblak besed"], + "Minimum Font Size": ["Min. velikost pisave"], + "Font size for the smallest value in the list": [ + "Velikost pisave za najmanjšo vrednost na seznamu" ], - "Link Copied!": ["Povezava kopirana!"], - "Connection looks good!": ["Povezava izgleda v redu!"], - "${t('ERROR: ')}${parsedErrorMessage(errMsg)}": [ - "${t('NAPAKA: ')}${parsedErrorMessage(errMsg)}" + "Maximum Font Size": ["Max. velikost pisave"], + "Font size for the biggest value in the list": [ + "Velikost pisave za največjo vrednost na seznamu" ], - "There was an error fetching your recent activity:": [ - "Pri pridobivanju nedavnih aktivnosti je prišlo do napake:" + "Word Rotation": ["Vrtenje besed"], + "Rotation to apply to words in the cloud": [ + "Če želite vrtenje besed v oblaku" ], - "There was an issue deleting: %s": ["Težava pri brisanju: %s"], - "There was an issue deleting %s: %s": ["Težava pri brisanju %s: %s"], - "report": ["poročilo"], - "alert": ["opozorilo"], - "reports": ["poročila"], - "alerts": ["opozorila"], - "There was an issue deleting the selected %s: %s": [ - "Težava pri brisanju izbranih %s: %s" + "Visualizes the words in a column that appear the most often. Bigger font corresponds to higher frequency.": [ + "Prikaže besede v stolpcu, glede na pogostost pojavljanja. Večja pisava pomeni večjo frekvenco." ], - "Last run": ["Zadnji zagon"], - "Notification method": ["Način obveščanja"], - "Execution log": ["Dnevnik izvajanja"], - "Actions": ["Aktivnosti"], - "Bulk select": ["Izberi hkrati"], - "No %s yet": ["%s še ne obstajajo"], - "Created by": ["Ustvaril"], - "An error occurred while fetching created by values: %s": [ - "Pri pridobivanju vrednosti \"Ustvaril\" je prišlo do napake: %s" + "The query couldn't be loaded": ["Poizvedbe ni mogoče naložiti"], + "Your query has been scheduled. To see details of your query, navigate to Saved queries": [ + "Vaša poizvedba je v urniku. Za ogled podrobnosti poizvedbe pojdite na shranjene poizvedbe" ], - "Status": ["Status"], - "${AlertState.success}": ["${AlertState.success}"], - "${AlertState.working}": ["${AlertState.working}"], - "${AlertState.error}": ["${AlertState.error}"], - "${AlertState.noop}": ["${AlertState.noop}"], - "${AlertState.grace}": ["${AlertState.grace}"], - "Alerts & reports": ["Opozorila in poročila"], - "Reports": ["Poročila"], - "Delete %s?": ["Izbrišem %s?"], - "Please confirm": ["Prosim, potrdite"], - "Are you sure you want to delete the selected %s?": [ - "Ali ste prepričani, da želite izbrisati izbrane %s?" + "Your query could not be scheduled": [ + "Vaše poizvedbe ni mogoče uvrstiti v urnik" ], - "< (Smaller than)": ["< (manjše kot)"], - "> (Larger than)": ["> (večje kot)"], - "<= (Smaller or equal)": ["<= (manjše ali enako)"], - ">= (Larger or equal)": [">= (večje ali enako)"], - "== (Is equal)": ["== (je enako)"], - "!= (Is not equal)": ["!= (ni enako)"], - "Not null": ["Ni nič (null)"], - "30 days": ["30 dni"], - "60 days": ["60 dni"], - "90 days": ["90 dni"], - "Add notification method": ["Dodajte način obveščanja"], - "Add delivery method": ["Dodajte način dostave"], - "Edit ${isReport ? 'Report' : 'Alert'}": [ - "Uredi ${isReport ? 'Report' : 'Alert'}" + "Failed at retrieving results": ["Napaka pri pridobivanju rezultatov"], + "An error occurred while storing the latest query id in the backend. Please contact your administrator if this problem persists.": [ + "Pri shranjevanju zadnjega id-ja poizvedbe v sistem je prišlo do napake. Če se težava ponavlja, kontaktirajte administratorja." ], - "Add ${isReport ? 'Report' : 'Alert'}": [ - "Add ${isReport ? 'Report' : 'Alert'}" + "Unknown error": ["Neznana napaka"], + "Query was stopped.": ["Poizvedba je bila ustavljena."], + "Failed at stopping query. %s": ["Neuspešno ustavljanje poizvedbe. %s"], + "Unable to migrate table schema state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ + "Stanja sheme tabele ni mogoče prenesti v sistem. Superset bo ponovil poskus kasneje. Če se težava ponavlja, kontaktirajte administratorja." ], - "Report name": ["Naslov poročila"], - "Alert name": ["Naslov opozorila"], - "Alert condition": ["Status opozorila"], - "Trigger Alert If...": ["Sproži opozorilo v primeru ..."], - "Condition": ["Pogoj"], - "Report schedule": ["Urnik poročanja"], - "Alert condition schedule": ["Urnik statusov opozoril"], - "Schedule settings": ["Nastavitve urnika"], - "Log retention": ["Hranjenje dnevnikov"], - "Working timeout": ["Pretek delovanja"], - "Time in seconds": ["Čas v sekundah"], - "Grace period": ["Obdobje mirovanja"], - "Message content": ["Vsebina sporočila"], - "Send as PNG": ["Pošlji kot PNG"], - "Send as CSV": ["Pošlji kot CSV"], - "Send as text": ["Pošlji kot besedilo"], - "log": ["dnevnik"], - "State": ["Status"], - "Execution ID": ["ID izvedbe"], - "Scheduled at (UTC)": ["Izvede se ob (UTC)"], - "Start at (UTC)": ["Zažene se ob (UTC)"], - "Duration": ["Trajanje"], - "Error message": ["Sporočilo napake"], - "${alertResource?.type}": ["${alertResource?.type}"], - "CRON expression": ["Izraz CRON"], - "Report sent": ["Poročilo poslano"], - "Alert triggered, notification sent": [ - "Opozorilo sproženo, obvestilo poslano" + "Unable to migrate query state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ + "Stanja poizvedbe ni mogoče prenesti v sistem. Superset bo ponovil poskus kasneje. Če se težava ponavlja, kontaktirajte administratorja." ], - "Report sending": ["Pošiljanje poročila"], - "Alert running": ["Opozorilo aktivno"], - "Report failed": ["Poročilo ni uspelo"], - "Alert failed": ["Opozorilo ni uspelo"], - "Nothing triggered": ["Ni ni sproženo"], - "Alert Triggered, In Grace Period": [ - "Opozorilo sproženo, v obdobju mirovanja" + "Unable to migrate query editor state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ + "Stanja urejevalnika poizvedb ni mogoče prenesti v sistem. Superset bo ponovil poskus kasneje. Če se težava ponavlja, kontaktirajte administratorja." ], - "Delivery method": ["Način dostave"], - "Select Delivery Method": ["Izberite način dostave"], - "Recipients are separated by \",\" or \";\"": [ - "Prejemniki so ločeni z \",\" ali \";\"" + "Unable to add a new tab to the backend. Please contact your administrator.": [ + "Novega zavihka ni mogoče dodati v sistem. Kontaktirajte administratorja." ], - "${RecipientIconName.email}": ["${RecipientIconName.email}"], - "${RecipientIconName.slack}": ["${RecipientIconName.slack}"], - "annotation": ["oznaka"], - "There was an issue deleting the selected annotations: %s": [ - "Pri brisanju izbranih oznak je prišlo do težave: %s" + "Copy of %s": ["Kopija %s"], + "An error occurred while setting the active tab. Please contact your administrator.": [ + "Pri določanju aktivnega zavihka je prišlo do napake. Kontaktirajte administratorja." ], - "Edit annotation": ["Uredi oznako"], - "Delete annotation": ["Izbriši oznako"], - "Annotation": ["Oznaka"], - "No annotation yet": ["Oznak še ni"], - "Annotation Layer ${annotationLayerName}": [ - "Sloj z oznakami ${annotationLayerName}" + "An error occurred while fetching tab state": [ + "Pri pridobivanju stanja zavihka je prišlo do napake" ], - "Are you sure you want to delete ${annotationCurrentlyDeleting?.short_descr}?": [ - "Ste prepričani, da želite izbrisati ${annotationCurrentlyDeleting?.short_descr}?" + "An error occurred while hiding the left bar. Please contact your administrator.": [ + "Pri skrivanju leve vrstice je prišlo do napake. Kontaktirajte administratorja." ], - "Delete Annotation?": ["Izbrišem oznako?"], - "Are you sure you want to delete the selected annotations?": [ - "Ali ste prepričani, da želite izbrisati izbrane oznake?" + "An error occurred while removing tab. Please contact your administrator.": [ + "Pri odstranjevanju zavihka je prišlo do napake. Kontaktirajte administratorja." ], - "The annotation has been updated": ["Označba je bila posodobljena"], - "The annotation has been saved": ["Označba je bila shranjena"], - "Add annotation": ["Dodaj oznako"], - "Annotation name": ["Ime oznake"], - "date": ["datum"], - "Additional information": ["Dodatne informacije"], - "Description (this can be seen in the list)": [ - "Opis (lahko je viden na seznamu)" + "An error occurred while removing query. Please contact your administrator.": [ + "Pri odstranjevanju poizvedbe je prišlo do napake. Kontaktirajte administratorja." ], - "annotation_layer": ["annotation_layer"], - "Edit annotation layer properties": ["Uredi lastnosti sloja z oznakami"], - "Annotation layer name": ["Ime sloja z oznakami"], - "Annotation layers": ["Sloji z oznakami"], - "There was an issue deleting the selected layers: %s": [ - "Pri brisanju izbranih slojev je prišlo do težave: %s" + "An error occurred while setting the tab database ID. Please contact your administrator.": [ + "Pri določanju ID-ja v podatkovne baze za zavihek je prišlo do napake. Kontaktirajte administratorja." ], - "Last modified": ["Zadnja sprememba"], - "Created on": ["Ustvarjeno"], - "Edit template": ["Uredi predlogo"], - "Delete template": ["Izbriši predlogo"], - "Annotation layer": ["Sloj z oznakami"], - "An error occurred while fetching dataset datasource values: %s": [ - "Pri pridobivanju vrednosti podatkovnega vira podatkovnega seta je prišlo do napake: %s" + "An error occurred while setting the tab schema. Please contact your administrator.": [ + "Pri določanju sheme zavihka je prišlo do napake. Kontaktirajte administratorja." ], - "No annotation layers yet": ["Slojev z oznakami še ni"], - "This action will permanently delete the layer.": [ - "S tem dejanjem boste trajno izbrisali sloj." + "An error occurred while setting the tab autorun. Please contact your administrator.": [ + "Pri določanju samodejnega zagona zavihka je prišlo do napake. Kontaktirajte administratorja." ], - "Delete Layer?": ["Izbrišem sloj?"], - "Are you sure you want to delete the selected layers?": [ - "Ali ste prepričani, da želite izbrisati izbrane sloje?" + "An error occurred while setting the tab title. Please contact your administrator.": [ + "Pri določanju naslova zavihka je prišlo do napake. Kontaktirajte administratorja." ], - "Are you sure you want to delete": [ - "Ali ste prepričani, da želite izbrisati" + "Your query could not be saved": ["Vaše poizvedbe ni mogoče shraniti"], + "Your query was not properly saved": [ + "Vaša poizvedba ni bila pravilno shranjena" ], - "Modified %s": ["Zadnja sprememba %s"], - "The passwords for the databases below are needed in order to import them together with the charts. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj z grafikoni. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če je to potrebno." + "Your query was saved": ["Vaša poizvedba je shranjena"], + "Your query was updated": ["Vaša poizvedba je posodobljena"], + "Your query could not be updated": [ + "Vaše poizvedbe ni mogoče posodobiti" ], - "You are importing one or more charts that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ - "Uvažate enega ali več grafikonov, ki že obstajajo. S prepisom lahko izgubite podatke. Ali ste prepričani, da želite prepisati?" + "An error occurred while storing your query in the backend. To avoid losing your changes, please save your query using the \"Save Query\" button.": [ + "Pri shranjevanju vaše poizvedbe v sistem je prišlo do napake. Da ne izgubite sprememb, shranite poizvedbo z gumbom \"Shrani poizvedbo\"." ], - "There was an issue deleting the selected charts: %s": [ - "Pri brisanju izbranih grafikonov je prišlo do težave: %s" + "An error occurred while setting the tab template parameters. Please contact your administrator.": [ + "Pri določanju parametrov predloge zavihka je prišlo do napake. Kontaktirajte administratorja." ], - "Modified by": ["Spremenil"], - "Favorite": ["Priljubljene"], - "Any": ["Katerikoli"], - "Yes": ["Da"], - "No": ["Ne"], - "Owner": ["Lastnik"], - "All": ["Vsi"], - "An error occurred while fetching chart owners values: %s": [ - "Pri pridobivanju polja lastnik grafikona je prišlo do napake: %s" + "An error occurred while fetching table metadata": [ + "Pri pridobivanju metapodatkov tabele je prišlo do napake" ], - "An error occurred while fetching chart created by values: %s": [ - "Pri pridobivanju polja Grafikon ustvaril je prišlo do napake: %s" + "An error occurred while fetching table metadata. Please contact your administrator.": [ + "Pri pridobivanju metapodatkov tabele je prišlo do napake. Kontaktirajte administratorja." ], - "Viz type": ["Tip vizualizacije"], - "Alphabetical": ["Po abecedi"], - "Recently modified": ["Nedavno spremenjeno"], - "Least recently modified": ["Zadnje spremenjeno"], - "Import charts": ["Uvozi grafikone"], - "Are you sure you want to delete the selected charts?": [ - "Ali ste prepričani, da želite izbrisati izbrane grafikone?" + "An error occurred while expanding the table schema. Please contact your administrator.": [ + "Pri širitvi sheme tabele je prišlo do napake. Kontaktirajte administratorja." ], - "css_template": ["css_template"], - "Edit CSS template properties": ["Uredi lastnosti CSS predloge"], - "Add CSS template": ["Dodaj CSS predlogo"], - "CSS template name": ["Ime CSS predloge"], - "css": ["css"], - "CSS templates": ["CSS predloge"], - "There was an issue deleting the selected templates: %s": [ - "Pri brisanju izbranih predlog je prišlo do težave: %s" + "An error occurred while collapsing the table schema. Please contact your administrator.": [ + "Pri krčenju sheme tabele je prišlo do napake. Kontaktirajte administratorja." ], - "Last modified by %s": ["Nazadnje spremenil %s"], - "CSS template": ["CSS predloga"], - "This action will permanently delete the template.": [ - "S tem dejanjem boste trajno izbrisali predlogo." + "An error occurred while removing the table schema. Please contact your administrator.": [ + "Pri odstranjevanju sheme tabele je prišlo do napake. Kontaktirajte administratorja." ], - "Delete Template?": ["Izbrišem predlogo?"], - "Are you sure you want to delete the selected templates?": [ - "Ali ste prepričani, da želite izbrisati izbrane predloge?" + "Shared query": ["Deljene poizvedbe"], + "The datasource couldn't be loaded": [ + "Podatkovnega vira ni mogoče naložiti" ], - "published": ["objavljeno"], - "draft": ["osnutek"], - "The passwords for the databases below are needed in order to import them together with the dashboards. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj z nadzornimi ploščami. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če je to potrebno." + "An error occurred while creating the data source": [ + "Pri ustvarjanju podatkovnega vira je prišlo do težave" ], - "You are importing one or more dashboards that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ - "Uvažate eno ali več nadzornih plošč, ki že obstajajo. S prepisom lahko izgubite podatke. Ali ste prepričani, da želite prepisati?" + "An error occurred while fetching function names.": [ + "Pri pridobivanju imen funkcij je prišlo do napake." ], - "An error occurred while fetching dashboards: %s": [ - "Prišlo je do napake pri pridobivanju nadzornih plošč: %s" + "SQL Lab uses your browser's local storage to store queries and results.\nCurrently, you are using %(currentUsage)s KB out of %(maxStorage)d KB storage space.\nTo keep SQL Lab from crashing, please delete some query tabs.\nYou can re-access these queries by using the Save feature before you delete the tab.\nNote that you will need to close other SQL Lab windows before you do this.": [ + "SQL laboratorij uporablja lokalno shrambo brskalnika za shranjevanje poizvedb in rezultatov.\nTrenutno uporabljate %(currentUsage)s KB od %(maxStorage)d KB prostora.\nDa preprečite sesutje SQL laba, izbrišite nekaj zavihkov s poizvedbami.\nPoizvedbe lahko ponovno pridobite, če pred brisanjem uporabite funkcijo Shrani.\nPred tem morate zapreti druga okna SQL laboratorija." ], - "There was an issue deleting the selected dashboards: ": [ - "Pri brisanju izbranih nadzornih plošč je prišlo do težave: " + "Estimate selected query cost": ["Oceni potratnost izbrane poizvedbe"], + "Estimate cost": ["Oceni potratnost"], + "Cost estimate": ["Ocena potratnosti"], + "Creating a data source and creating a new tab": [ + "Ustvarjanje podatkovnega vira in novega zavihka" ], - "An error occurred while fetching dashboard owner values: %s": [ - "Pri pridobivanju polja lastnik nadzorne plošče je prišlo do napake: %s" + "An error occurred": ["Prišlo je do napake"], + "Explore the result set in the data exploration view": [ + "Raziščite rezultate v pogledu raziskovanja podatkov" ], - "An error occurred while fetching dashboard created by values: %s": [ - "Pri pridobivanju polja Nadzorno ploščo ustvaril je prišlo do napake: %s" + "Create Chart": ["Ustvarite grafikon"], + "Source SQL": ["Izvorni SQL"], + "Executed SQL": ["Izvedena poizvedba"], + "SQL": ["SQL"], + "Run a query to display query history": [ + "Za prikaz zgodovine poizvedb zaženite poizvedbo" ], - "Are you sure you want to delete the selected dashboards?": [ - "Ali ste prepričani, da želite izbrisati izbrane nadzorne plošče?" + "An error occurred when refreshing queries": [ + "Pri osveževanju poizvedb je prišlo do napake" ], - "Saved queries": ["Shranjene poizvedbe"], - "SQL Copied!": ["SQL kopiran!"], - "The passwords for the databases below are needed in order to import them. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "Gesla za spodnje podatkovne baze so potrebna za njihov uvoz. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če je to potrebno." + "It seems you don't have access to any database": [ + "Zdi se, da nimate dostopa do nobene podatkovne baz" ], - "You are importing one or more databases that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ - "Uvažate eno ali več podatkovnih baz, ki že obstajajo. S prepisom lahko izgubite podatke. Ali ste prepričani, da želite prepisati?" + "Filter by user": ["Filtriraj po uporabniku"], + "Filter by database": ["Filtriraj po podatkovni bazi"], + "Query search string": ["Iskalni niz za poizvedbo"], + "[From]-": ["[Od]-"], + "[To]-": ["[Do]-"], + "Filter by status": ["Filtriraj po statusu"], + "Success": ["Uspelo"], + "Failed": ["Ni uspelo"], + "Running": ["V teku"], + "Fetching": ["Pridobivam"], + "Offline": ["Offline"], + "Scheduled": ["V urniku"], + "Unknown Status": ["Neznan status"], + "Edit": ["Urejanje"], + "View": ["Pogled"], + "Data preview": ["Ogled podatkov"], + "Overwrite text in the editor with a query on this table": [ + "Besedilo v urejevalniku prepišite s poizvedbo na to tabelo" ], - "database": ["podatkovna baza"], - "An error occurred while fetching database related data: %s": [ - "Pri pridobivanju podatkov iz podatkovne baze je prišlo do napake: %s" + "Run query in a new tab": ["Zaženi poizvedbo v novem zavihku"], + "Remove query from log": ["Odstrani poizvedbo iz dnevnika"], + "Save & Explore": ["Shrani & Razišči"], + "Overwrite & Explore": ["Prepiši & Razišči"], + "Save this query as a virtual dataset to continue exploring": [ + "Shranite poizvedbo kot virtualni podatkovni set" ], - "Import databases": ["Uvozi podatkovne baze"], - "Asynchronous query execution": ["Asinhroni zagon poizvedb"], - "AQE": ["AQE"], - "Allow data manipulation language": [ - "Dovoli jezik za manipulacijo podatkov (DML)" + "Download to CSV": ["Izvozi kot CSV"], + "Copy to Clipboard": ["Kopiraj na odložišče"], + "Too many columns to filter": ["Preveč stolpcev za filtriranje"], + "Filter results": ["Filtriraj rezultate"], + "The number of results displayed is limited to %(rows)d by the configuration DISPLAY_MAX_ROWS. Please add additional limits/filters or download to csv to see more rows up to the %(limit)d limit.": [ + "Število prikazanih rezultatov je omejeno na %(rows)d na podlagi parametra DISPLAY_MAX_ROWS. V csv dodajte dodatne omejitve/filtre, da boste lahko videli več vrstic do meje %(limit)d ." ], - "DML": ["DML"], - "CSV upload": ["Nalaganje CSV"], - "Delete database": ["Izbriši podatkovno bazo"], - "The database %s is linked to %s charts that appear on %s dashboards and users have %s SQL Lab tabs using this database open. Are you sure you want to continue? Deleting the database will break those objects.": [ - "Podatkovna baza %s je povezana z grafikoni %s, ki so prisotni na nadzorni plošči %s in uporabniki imajo odprtih %s zavihkov SQL laboratorija. Ali želite nadaljevati? Izbris podatkovne baze bo pokvaril te objekte." + "The number of results displayed is limited to %(rows)d. Please add additional limits/filters, download to csv, or contact an admin to see more rows up to the %(limit)d limit.": [ + "Število prikazanih rezultatov je omejeno na %(rows)d . V csv dodajte dodatne omejitve/filtre, da boste lahko videli več vrstic do meje %(limit)d ." ], - "Delete Database?": ["Izbrišem podatkovno bazo?"], - "Expose database in SQL Lab": [ - "Razkrij podatkovno bazo v SQL laboratoriju" + "The number of rows displayed is limited to %(rows)d by the query": [ + "Število prikazanih vrstic je omejeno na %(rows)d s poizvedbo" ], - "Allow this database to be queried in SQL Lab": [ - "Dovoli poizvedbo na to podatkovno bazo v SQL laboratoriju" + "The number of rows displayed is limited to %(rows)d by the limit dropdown.": [ + "Število prikazanih rezultatov je omejeno na %(rows)d s poizvedbo." ], - "Allow creation of new tables based on queries": [ - "Dovoli ustvarjanje novih tabel s poizvedbami" + "The number of rows displayed is limited to %(rows)d by the query and limit dropdown.": [ + "Število prikazanih vrstic je omejeno na %(rows)d s poizvedbo in spustnim izbirnikom omejitev." ], - "Allow creation of new views based on queries": [ - "Dovoli ustvarjanje novih pogledov s poizvedbami" + "%(rows)d rows returned": ["%(rows)d vrnjenih vrstic"], + "The number of rows displayed is limited to %s by the dropdown.": [ + "Število prikazanih vrstic je omejeno na %s s spustnim izbirnikom." ], - "CTAS & CVAS SCHEMA": ["CTAS & CVAS SHEMA"], - "Create or select schema...": ["Ustvarite ali izberite shemo..."], - "Force all tables and views to be created in this schema when clicking CTAS or CVAS in SQL Lab.": [ - "Vsilite, da bodo vse tabele in pogledi ustvarjeni s to shemo, ko kliknete CTAS ali CVAS v SQL laboratoriju." + "Query was stopped": ["Poizvedba je bila ustavljena"], + "Database error": ["Napaka podatkovne baze"], + "was created": ["ustvarjeno"], + "Query in a new tab": ["Poizvedba v novem zavihku"], + "The query returned no data": ["Poizvedba ni vrnila podatkov"], + "Fetch data preview": ["Pridobi predogled podatkov"], + "Refetch results": ["Ponovno pridobi rezultate"], + "Track job": ["Sledi opravilom"], + "Stop": ["Ustavi"], + "Run selection": ["Zaženi izbrano"], + "Run": ["Zaženi"], + "Stop running (Ctrl + x)": ["Ustavi (Ctrl + x)"], + "Stop running (Ctrl + e)": ["Ustavi (Ctrl + e)"], + "Run query (Ctrl + Return)": ["Zaženi poizvedbo (Ctrl + Return)"], + "An error occurred saving dataset": [ + "Pri shranjevanju podatkovnega seta je prišlo do napake" ], - "Allow manipulation of the database using non-SELECT statements such as UPDATE, DELETE, CREATE, etc.": [ - "Dovoli manipulacije podatkovne baze z uporabo ne-SELECT stavkov, kot so UPDATE, DELETE, CREATE, itd." + "Save or Overwrite Dataset": ["Shrani ali prepiši podatkovni set"], + "Save as new": ["Shrani kot novo"], + "Overwrite existing": ["Prepiši obstoječe"], + "Select or type dataset name": [ + "Izberite ali vnesite naziv podatkovnega seta" ], - "Enable query cost estimation": [ - "Omogoči ocenjevanje potratnosti poizvedbe" + "Are you sure you want to overwrite this dataset?": [ + "Ali ste prepričani, da želite prepisati podatkovni set?" ], - "For Presto and Postgres, shows a button to compute cost before running a query.": [ + "For Bigquery, Presto and Postgres, shows a button to compute cost before running a query.": [ "Za Presto in Postgres prikaže gumb za izračun potratnosti pred zagonom poizvedbe." ], - "Allow this database to be explored": [ - "Dovoli raziskovanje te podatkovne baze" + "Please save the query to enable sharing": [ + "Shranite poizvedbo za deljenje" ], - "When enabled, users are able to visualize SQL Lab results in Explore.": [ - "Ko je omogočeno, lahko uporabniki prikazujejo rezultate SQL laboratorija v raziskovalcu." + "Copy query link to your clipboard": [ + "Kopiraj povezavo do poizvedbe v odložišče" ], - "Chart cache timeout": ["Trajanje predpomnilnika grafikona"], - "Enter duration in seconds": ["Vnesite trajanje v sekundah"], - "Schema cache timeout": ["Trajanje prepomnilnika sheme"], - "Duration (in seconds) of the metadata caching timeout for schemas of this database. If left unset, the cache never expires.": [ - "Trajanje (v sekundah) predpomnilnika metapodatkov za sheme v tej podatkovni bazi. Če ni nastavljeno, predpomnilnik ne poteče." + "Save the query to enable this feature": [ + "Za omogočenje te funkcije shranite poizvedbo" ], - "Table cache timeout": ["Trajanje predpomnilnika tabele"], - "Duration (in seconds) of the metadata caching timeout for tables of this database. If left unset, the cache never expires. ": [ - "Trajanje (v sekundah) predpomnilnika metapodatkov za tabele v tej podatkovni bazi. Če ni nastavljeno, predpomnilnik ne poteče. " + "Copy link": ["Kopiraj povezavo"], + "No stored results found, you need to re-run your query": [ + "Rezultatov še ni shranjenih, ponovno morate zagnati poizvedbo" ], - "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.": [ - "Upravljanje podatkovne baze v asinhronem načinu pomeni, da se poizvedbe zaženejo na oddaljenih »delavcih« in ne na samem spletnem strežniku. S tem je predpostavljeno, da imate nastavljenega »delavca« za Celery in zaledni sistem za rezultate. Več informacij je v navodilih za namestitev." + "Run a query to display results": [ + "Za prikaz rezultatov morate zagnati poizvedbo" ], - "Cancel query on window unload event": [ - "Prekini poizvedbo pri dogodku zaprtja okna (window unload event)" + "Preview: `%s`": ["Predogled: `%s`"], + "Results": ["Rezultati"], + "Query history": ["Zgodovina poizvedb"], + "Run query": ["Zaženi poizvedbo"], + "New tab": ["Nov zavihek"], + "Stop query": ["Ustavi poizvedbo"], + "Previous Line": ["Prejšnja linija"], + "Schedule the query periodically": ["Periodično zaganjaj poizvedbo"], + "You must run the query successfully first": [ + "Najprej morate uspešno izvesti poizvedbo" ], - "Terminate running queries when browser window closed or navigated to another page. Available for Presto, Hive, MySQL, Postgres and Snowflake databases.": [ - "Ustavi zagnane poizvedbe, ko se zapre okno brskalnika ali gre na drugo stran. na razpolago za Presto, Hive, MySQL, Postgres in Snowflake podatkovne baze." + "Autocomplete": ["Samodokončaj"], + "CREATE TABLE AS": ["CREATE TABLE AS"], + "CREATE VIEW AS": ["CREATE VIEW AS"], + "Estimate the cost before running a query": [ + "Oceni potratnost pred zagonom poizvedbe" ], - "Secure extra": ["Dodatna varnost"], - "JSON string containing additional connection configuration. This is used to provide connection information for systems like Hive, Presto and BigQuery which do not conform to the username:password syntax normally used by SQLAlchemy.": [ - "JSON niz, ki vsebuje dodatno konfiguracijo povezave. Uporablja se za zagotavljanje dodatnih informacij povezave za sisteme kot sta Presto in BigQuery, ki nista skladna s sintakso username:password, ki jo običajno uporablja SQLAlchemy." + "Select a database to write a query": [ + "Izberite podatkovno bazo za poizvedbo" + ], + "Choose one of the available databases from the panel on the left.": [ + "Izberite eno od razpoložljivih podatkovnih baz v panelu na levi." + ], + "Collapse table preview": ["Zapri predogled tabele"], + "Expand table preview": ["Odpri predogled tabele"], + "No databases match your search": [ + "Nobena podatkovna baza ne ustreza iskanju" + ], + "There are no databases available": ["Podatkovnih baz ni na voljo"], + "Manage your databases": ["Upravljajte podatkovne baze"], + "here": ["tukaj"], + "Reset state": ["Ponastavi stanje"], + "Enter a new title for the tab": ["Vnesite novo naslov zavihka"], + "-- Note: Unless you save your query, these tabs will NOT persist if you clear your cookies or change browsers.\n\n": [ + "-- Opomba: Če ne shranite poizvedbe, se ti zavihki NE bodo ohranili, ko boste počistili piškote ali zamenjali brskalnik.\n\n" + ], + "Close tab": ["Zapri zavihek"], + "Rename tab": ["Preimenuj zavihek"], + "Expand tool bar": ["Razširi orodno vrstico"], + "Hide tool bar": ["Skrij orodno vrstico"], + "Close all other tabs": ["Zapri vse ostale zavihke"], + "Duplicate tab": ["Podvoji zavihek"], + "Add a new tab": ["Dodaj nov zavihek"], + "New tab (Ctrl + q)": ["Nov zavihek (Ctrl + q)"], + "New tab (Ctrl + t)": ["Nov zavihek (Ctrl + t)"], + "Add a new tab to create SQL Query": [ + "Dodaj nov zavihek za SQL-poizvedbo" ], - "Enter CA_BUNDLE": ["Vnesite CA_BUNDLE"], - "Optional CA_BUNDLE contents to validate HTTPS requests. Only available on certain database engines.": [ - "Opcijska CA_BUNDLE vsebina, za potrjevanje HTTPS zahtev. Razpoložljivo le na določenih sistemih podatkovnih baz." + "Copy partition query to clipboard": [ + "Kopiraj particijsko poizvedbo na odložišče" ], - "Schemas allowed for CSV upload": ["Dovoljene sheme za nalaganje CSV"], - "A comma-separated list of schemas that CSVs are allowed to upload to.": [ - "Z vejicami ločen seznam shem, kjer je dovoljeno nalaganje CSV-jev." + "latest partition:": ["zadnja particija:"], + "Keys for table": ["Ključi za tabele"], + "View keys & indexes (%s)": ["Ogled ključev in indeksov (%s)"], + "Original table column order": ["Vrstni red stolpcev izvorne tabele"], + "Sort columns alphabetically": ["Razvrsti stolpce po abecedi"], + "Copy SELECT statement to the clipboard": [ + "Kopiraj stavek SELECT na odložišče" ], - "Impersonate logged in user (Presto, Trino, Drill, Hive, and GSheets)": [ - "Predstavljanje kot prijavljeni uporabnik (Presto, Trino, Drill, Hive in GSheets)" + "Show CREATE VIEW statement": ["Prikaži CREATE VIEW stavek"], + "CREATE VIEW statement": ["CREATE VIEW stavek"], + "Remove table preview": ["Odstrani predogled tabele"], + "Edit template parameters": ["Uredi parametre predloge"], + "Parameters ": ["Parametri "], + "Invalid JSON": ["Neveljaven JSON"], + "Untitled query": ["Neimenovana poizvedba"], + "%s%s": ["%s%s"], + "Create a new chart": ["Ustvari nov grafikon"], + "Choose a dataset": ["Izberite podatkovni set"], + "Dataset": ["Podatkovni set"], + "Instructions to add a dataset are available in the Superset tutorial.": [ + "Navodila za dodajanje podatkovnega seta so v vodiču za Superset." ], - "If Presto or Trino, all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them. If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.": [ - "V primeru Presto ali Trino se vse poizvedbe v SQL laboratoriju zaženejo pod trenutno prijavljenim uporabnikom, ki mora imeti pravice za poganjanje. Če je omogočen Hive in hive.server2.enable.doAs, poizvedbe tečejo pod servisnim računom, vendar je trenutno prijavljen uporabnik predstavljen z lastnostjo hive.server2.proxy.user." + "Choose chart type": ["Izberite tip grafikona"], + "Please select both a Dataset and a Chart type to proceed": [ + "Za nadaljevanje izberite podatkovni set in tip grafikona" ], - "Allow data upload": ["Dovoli nalaganje podatkov"], - "If selected, please set the schemas allowed for data upload in Extra.": [ - "Če je izbrano, nastavite dovoljene sheme za nalaganje podatkov v Dodatno." + "Create new chart": ["Ustvari nov grafikon"], + "Click to see difference": ["Kliknite za prikaz razlike"], + "Altered": ["Spremenjeno"], + "Chart changes": ["Spremembe grafikona"], + "Select ...": ["Izberite ..."], + "Loaded data cached": ["Podatki so naloženi v predpomnilnik"], + "Loaded from cache": ["Naloženo iz predpomnilnika"], + "Click to force-refresh": ["Kliknite za prisilno osvežitev"], + "Cached": ["Predpomnjeno"], + "Add required control values to preview chart": [ + "Dodaj potrebne parametre za predogled grafikona" ], - "Metadata Parameters": ["Parametri metapodatkov"], - "The metadata_params object gets unpacked into the sqlalchemy.MetaData call.": [ - "Objekt metadata_params se razpakira v klic sqlalchemy.MetaData." + "Your chart is ready to go!": ["Grafikon je pripravljen!"], + "Click on \"Create chart\" button in the control panel on the left to preview a visualization or": [ + "Kliknite na gumb \"Ustvari grafikon\" v kontrolni plošči na levi za predogled ali" ], - "Engine Parameters": ["Parametri podatkovne baze"], - "The engine_params object gets unpacked into the sqlalchemy.create_engine call.": [ - "Objekt engine_params se razširi v klic sqlalchemy.create_engine." + "click here": ["kliknite tukaj"], + "No results were returned for this query": [ + "Poizvedba ni vrnila rezultatov" ], - "Version": ["Verzija"], - "Version number": ["Številka verzije"], - "Specify the database version. This should be used with Presto in order to enable query cost estimation.": [ - "Podajte verzijo podatkovne baze. Uporablja se s Presto, za potrebe ocenjevanja potratnosti poizvedbe." + "Make sure that the controls are configured properly and the datasource contains data for the selected time range": [ + "Poskrbite, da so kontrolniki pravilno nastavljeni in podatkovni vir vsebuje podatke za izbrano časovno obdobje" ], - "Display Name": ["Ime za prikaz"], - "Name your database": ["Poimenujte podatkovno bazo"], - "Pick a name to help you identify this database.": [ - "Izberite ime za lažjo prepoznavo podatkovne baze." + "An error occurred while loading the SQL": [ + "Pri nalaganju SQL je prišlo do napake" ], - "dialect+driver://username:password@host:port/database": [ - "dialect+driver://username:password@host:port/database" + "Sorry, an error occurred": ["Prišlo je do napake"], + "Updating chart was stopped": [ + "Posodabljanje grafikona je bilo ustavljeno" ], - "Refer to the": ["Obrnite se na"], - "for more information on how to structure your URI.": [ - "za več informacij o oblikovanju URI." + "An error occurred while rendering the visualization: %s": [ + "Pri prikazovanju vizualizacije je prišlo do napake: %s" ], - "Test connection": ["Preizkus povezave"], - "Please enter a SQLAlchemy URI to test": [ - "Vnesite SQLAlchemy URI za test" + "Network error.": ["Napaka omrežja."], + "Copy to clipboard": ["Kopiraj na odložišče"], + "Copied to clipboard!": ["Kopirano na odložišče!"], + "Sorry, your browser does not support copying. Use Ctrl / Cmd + C!": [ + "Vaš brskalnik ne podpira kopiranja. Uporabite Ctrl / Cmd + C!" ], - "Sorry there was an error fetching database information: %s": [ - "Pri pridobivanju informacij o podatkovni bazi je prišlo do napake: %s" + "every": ["vsak"], + "every month": ["vsak mesec"], + "every day of the month": ["vsak dan v mesecu"], + "day of the month": ["dan v mesecu"], + "every day of the week": ["vsak dan v tednu"], + "day of the week": ["dan v tednu"], + "every hour": ["vsako uro"], + "every minute": ["vsako minuto"], + "year": ["leto"], + "month": ["mesec"], + "week": ["teden"], + "day": ["dan"], + "hour": ["ura"], + "minute": ["minuta"], + "reboot": ["ponovni zagon"], + "Every": ["Vsak"], + "in": ["v"], + "on": ["v"], + "and": ["in"], + "at": ["ob"], + ":": [":"], + "minute(s)": ["minuta/e"], + "Invalid cron expression": ["Neveljaven cron izraz"], + "Clear": ["Počisti"], + "Sunday": ["Nedelja"], + "Monday": ["Ponedeljek"], + "Tuesday": ["Torek"], + "Wednesday": ["Sreda"], + "Thursday": ["Četrtek"], + "Friday": ["Petek"], + "Saturday": ["Sobota"], + "January": ["Januar"], + "February": ["Februar"], + "March": ["Marec"], + "April": ["April"], + "May": ["Maj"], + "June": ["Junij"], + "July": ["Julij"], + "August": ["Avgust"], + "September": ["September"], + "October": ["Oktober"], + "November": ["November"], + "December": ["December"], + "SUN": ["NED"], + "MON": ["PON"], + "TUE": ["TOR"], + "WED": ["SRE"], + "THU": ["ČET"], + "FRI": ["PET"], + "SAT": ["SOB"], + "JAN": ["JAN"], + "FEB": ["FEB"], + "MAR": ["MAR"], + "APR": ["APR"], + "MAY": ["MAJ"], + "JUN": ["JUN"], + "JUL": ["JUL"], + "AUG": ["AVG"], + "SEP": ["SEP"], + "OCT": ["OKT"], + "NOV": ["NOV"], + "DEC": ["DEC"], + "There was an error loading the schemas": ["Napaka pri nalaganju shem"], + "Select database or type database name": [ + "Izberite ali vnesite ime podatkovne baze" ], - "Want to add a new database?": ["Želite dodati novo podatkovno bazo?"], - "Connect": ["Poveži"], - "Edit database": ["Uredi podatkovno bazo"], - "Connect a database": ["Poveži se s podatkovno bazo"], - "Click this link to switch to an alternate form that exposes only the required fields needed to connect this database.": [ - "Kliknite to povezavo za drugo vnosno formo, ki prikaže samo zahtevana polja za povezavo s podatkovno bazo." + "Force refresh schema list": ["Osveži seznam shem"], + "Select schema or type schema name": ["Izberite ali vnesite ime sheme"], + "Warning! Changing the dataset may break the chart if the metadata does not exist.": [ + "Opozorilo! Sprememba podatkovnega seta lahko pokvari grafikon, če metapodatki ne obstajajo." ], - "Finish": ["Končaj"], - "Click this link to switch to an alternate form that allows you to input the SQLAlchemy URL for this database manually.": [ - "Kliknite to povezavo za drugo vnosno formo, ki omogoča ročni vnos SQLAlchemy URL-ja za to podatkovno bazo." + "Changing the dataset may break the chart if the chart relies on columns or metadata that does not exist in the target dataset": [ + "Sprememba podatkovnega seta lahko pokvari grafikon, če se le-ta zanaša na stolpce ali metapodatke, ki ne obstajajo v ciljnem podatkovnem nizu" ], - "This can be either an IP address (e.g. 127.0.0.1) or a domain name (e.g. mydatabase.com).": [ - "To je lahko bodisi IP naslov (npr. 127.0.0.1) bodisi ime domene (npr. mydatabase.com)." + "dataset": ["podatkovni set"], + "Connection": ["Povezava"], + "Change dataset": ["Spremeni podatkovni set"], + "Warning!": ["Opozorilo!"], + "Search / Filter": ["Iskanje / Filter"], + "Add item": ["Dodaj"], + "Physical (table or view)": ["Fizičen (tabela ali pogled)"], + "Virtual (SQL)": ["Virtualen (SQL)"], + "Data type": ["Tip podatka"], + "Advanced data type": ["Napredni podatkovni tip"], + "Advanced Data type": ["Napredni podatkovni tip"], + "Datetime format": ["Oblika datum-časa"], + "The pattern of timestamp format. For strings use ": [ + "Vzorec zapisa časovne značke. Za znakovne nize uporabite " ], - "Copy the name of the database you are trying to connect to.": [ - "Kopirajte ime podatkovne baze, s katero se skušate povezati." + "Python datetime string pattern": ["Pythonov vzorec zapisa datum-časa"], + " expression which needs to adhere to the ": [" , ki mora upoštevati "], + "ISO 8601": ["ISO 8601"], + " standard to ensure that the lexicographical ordering\n coincides with the chronological ordering. If the\n timestamp format does not adhere to the ISO 8601 standard\n you will need to define an expression and type for\n transforming the string into a date or timestamp. Note\n currently time zones are not supported. If time is stored\n in epoch format, put `epoch_s` or `epoch_ms`. If no pattern\n is specified we fall back to using the optional defaults on a per\n database/column name level via the extra parameter.": [ + " standard, ki zagotavlja, de se leksikografsko razvrščanje\n sklada s kronološkim razvrščanjem. Če oblika\n časovne značke ni v skladu s standardom ISO 8601,\n boste morali definirati izraz in tip za transformacijo\n znakovnega niza v datum ali časovno značko.\n Trenutno časovni pasovi niso podprti.\n Če je čas shranjen v obliki epohe, dodajte `epoch_s` ali `epoch_ms`.\n Če ni podan vzorec, se uporabijo privzete vrednosti na podlagi imena\n podatkovne baze oz. stolpca s pomočjo dodatnega parametra." ], - "Pick a nickname for this database to display as in Superset.": [ - "Izberite vzdevek za to podatkovno bazo, ki bo prikazan v Supersetu." + "Certified By": ["Certificiral/a"], + "Person or group that has certified this metric": [ + "Oseba ali skupina, ki je certificirala to mero" ], - "Add additional custom parameters": ["Dodaj dodatne parametre po meri"], - "SSL Mode \"require\" will be used.": [ - "Uporabljen bo SSL način \"require\"." + "Certified by": ["Certificiral/a"], + "Certification details": ["Podrobnosti certifikacije"], + "Details of the certification": ["Podrobnosti certifikacije"], + "Is dimension": ["Dimenzija"], + "Default datetime": ["Privzet datumčas"], + "Is filterable": ["Filtriranje"], + "Select owners": ["Izberite lastnike"], + "Modified columns: %s": ["Spremenjeni stolpci: %s"], + "Removed columns: %s": ["Odstranjeni stolpci: %s"], + "New columns added: %s": ["Dodani novi stolpci: %s"], + "Metadata has been synced": ["Metapodatki so sinhronizirani"], + "An error has occurred": ["Prišlo je do napake"], + "Column name [%s] is duplicated": ["Ime stolpca [%s] je podvojeno"], + "Metric name [%s] is duplicated": ["Ime mere [%s] je podvojeno"], + "Calculated column [%s] requires an expression": [ + "Izračunan stolpec [%s] zahteva izraz" ], - "Type of Google Sheets allowed": ["Dovoljeni tipi Googlovih preglednic"], - "Publicly shared sheets only": ["Samo javno deljene preglednice"], - "Public and privately shared sheets": [ - "Javno in zasebno deljene preglednice" + "Basic": ["Osnovno"], + "Default URL": ["Privzeti URL"], + "Default URL to redirect to when accessing from the dataset list page": [ + "Privzeti URL za preusmeritev, ko dostopate iz strani s seznamom podatkovnih setov" ], - "How do you want to enter service account credentials?": [ - "Kako želite vnesti prijavne podatke servisnega računa?" + "Autocomplete filters": ["Samodokončaj filtre"], + "Whether to populate autocomplete filters options": [ + "Če želite napolniti možnosti za samodokončanje filtrov" ], - "Upload JSON file": ["Naloži JSON datoteko"], - "Copy and Paste JSON credentials": [ - "Kopiraj in prilepi JSON prijavne podatke" + "Autocomplete query predicate": ["Predikat za samodokončanje poizvedb"], + "When using \"Autocomplete filters\", this can be used to improve performance of the query fetching the values. Use this option to apply a predicate (WHERE clause) to the query selecting the distinct values from the table. Typically the intent would be to limit the scan by applying a relative time filter on a partitioned or indexed time-related field.": [ + "Ko uporabljate \"Samodokončaj filtre\", lahko s tem izboljšate hitrost pridobivanja rezultatov s poizvedbo. Z uporabo te možnosti dodate predikat (WHERE stavek) k poizvedbi za izbiro različnih vrednosti iz tabele. Običajno je namen omejiti poizvedbo z uporabo filtra za relativni čas na particioniranem ali indeksiranem časovnem polju." ], - "Service Account": ["Servisni račun"], - "Copy and paste the entire service account .json file here": [ - "Tukaj kopirajte in prilepite celotno json datoteko servisnega računa" + "Extra data to specify table metadata. Currently supports metadata of the format: `{ \"certification\": { \"certified_by\": \"Data Platform Team\", \"details\": \"This table is the source of truth.\" }, \"warning_markdown\": \"This is a warning.\" }`.": [ + "Dodatni podatki za tabelo metapodatkov. Trenutno je podprta naslednja oblika zapisa metapodatkov: `{ \"certification\": { \"certified_by\": \"Tim za razvoj\", \"details\": \"Ta tabela je vir resnice.\" }, \"warning_markdown\": \"To je opozorilo.\" }`." ], - "Upload Credentials": ["Naloži prijavne podatke"], - "Use the JSON file you automatically downloaded when creating your service account.": [ - "Uporabite JSON datoteko, ki ste jo prenesli pri ustvarjanju servisnega računa." + "Cache timeout": ["Časovna omejitev predpomnilnika"], + "The duration of time in seconds before the cache is invalidated": [ + "Trajanje (v sekundah) do razveljavitve predpomnilnika" ], - "Connect Google Sheets as tables to this database": [ - "Googlove preglednice poveži s to podatkovno bazo kot tabele" + "Hours offset": ["Urni premik"], + "The number of hours, negative or positive, to shift the time column. This can be used to move UTC time to local time.": [ + "Število ur, negativno ali pozitivno, za zamik časovnega stolpca. Na ta način je mogoče UTC čas prestaviti na lokalni čas." ], - "Google Sheet Name and URL": ["Ime Googlove preglednice in URL"], - "Enter a name for this sheet": ["Vnesite ime te preglednice"], - "Paste the shareable Google Sheet URL here": [ - "Prilepite deljeni URL Googlove preglednice sem" + "Spatial": ["Prostorski"], + "Click the lock to make changes.": [ + "Kliknite ključavnico, da omogočite spreminjanje." ], - "Add sheet": ["Dodaj preglednico"], - "Copy the account name of that database you are trying to connect to.": [ - "Kopirajte ime računa podatkovne baze, s katero se skušate povezati." + "Click the lock to prevent further changes.": [ + "Kliknite ključavnico, da onemogočite spreminjanje." ], - "Add dataset": ["Dodaj podatkovni set"], - "An error occurred while fetching dataset related data": [ - "Napaka pri pridobivanju podatkov iz podatkovnega seta" + "virtual": ["virtualni"], + "Dataset name": ["Ime podatkovnega seta"], + "When specifying SQL, the datasource acts as a view. Superset will use this statement as a subquery while grouping and filtering on the generated parent queries.": [ + "Ko podajate SQL, se podatkovni vir obnaša kot pogled (view). Superset bo ta zapis uporabil kot podpoizvedbo, pri čemer bo združeval in filtriral na podlagi ustvarjenih starševskih poizvedb." ], - "An error occurred while fetching dataset related data: %s": [ - "Napaka pri pridobivanju podatkov iz podatkovnega seta: %s" + "The JSON metric or post aggregation definition.": [ + "JSON mera ali po-agregacijska definicija." ], - "Physical dataset": ["Fizičen podatkovni set"], - "Virtual dataset": ["Virtualen podatkovni set"], - "An error occurred while fetching dataset owner values: %s": [ - "Pri pridobivanju polja lastnik podatkovnega seta je prišlo do napake: %s" + "Physical": ["Fizičen"], + "The pointer to a physical table (or view). Keep in mind that the chart is associated to this Superset logical table, and this logical table points the physical table referenced here.": [ + "Kazalec na fizično tabelo (ali pogled). Grafikon je povezan s to Supersetovo logično tabelo, ki kaže na tukaj referencirano fizično tabelo." ], - "An error occurred while fetching datasets: %s": [ - "Prišlo je do napake pri pridobivanju podatkovnih setov: %s" + "Warning": ["Opozorilo"], + "Optional warning about use of this metric": [ + "Opcijsko opozorilo za uporabo te mere" ], - "An error occurred while fetching schema values: %s": [ - "Pri pridobivanju vrednosti shem je prišlo do napake: %s" + "Be careful.": ["Bodite previdni."], + "Changing these settings will affect all charts using this dataset, including charts owned by other people.": [ + "Spreminjanje teh nastavitev bo vplivalo na vse grafikone, ki uporabljajo ta podatkovni set, vključno z grafikoni v lasti drugih oseb." ], - "Import datasets": ["Uvozi podatkovne sete"], - "There was an issue deleting the selected datasets: %s": [ - "Pri brisanju izbranih podatkovnih setov je prišlo do težave: %s" + "Sync columns from source": ["Sinhroniziraj stolpce z virom"], + "Calculated columns": ["Izračunani stolpci"], + "Settings": ["Nastavitve"], + "The dataset has been saved": ["Podatkovni set je shranjen"], + "The dataset configuration exposed here\n affects all the charts using this dataset.\n Be mindful that changing settings\n here may affect other charts\n in undesirable ways.": [ + "Tukaj prikazane nastavitve podatkovnega seta\n vplivajo na vse grafikone, ki uporabljajo\n ta podatkovni set. Spreminjanje\n nastavitev lahko nezaželeno vpliva\n na druge grafikone." ], - "The dataset %s is linked to %s charts that appear on %s dashboards. Are you sure you want to continue? Deleting the dataset will break those objects.": [ - "Podatkovni set %s je povezan z grafikoni %s, ki so prisotni na nadzorni plošči %s. Ali želite nadaljevati? Izbris podatkovnega seta bo pokvaril te objekte." + "Are you sure you want to save and apply changes?": [ + "Ali resnično želite shraniti in uporabiti spremembe?" ], - "Delete Dataset?": ["Izbrišem podatkovni set?"], - "Are you sure you want to delete the selected datasets?": [ - "Ali ste prepričani, da želite izbrisati izbrane podatkovne sete?" + "Confirm save": ["Potrdite shranjevanje"], + "Edit Dataset ": ["Uredi podatkovni set "], + "Use legacy datasource editor": [ + "Uporabi starejši urejevalnik podatkovnega vira" ], - "0 Selected": ["Izbranih: 0"], - "%s Selected (Virtual)": ["Izbranih: %s (virtualni)"], - "%s Selected (Physical)": ["Izbranih: %s (fizični)"], - "%s Selected (%s Physical, %s Virtual)": [ - "Izbranih: %s (fizični: %s, virtualni: %s)" + "This dataset is managed externally, and can't be edited in Superset": [ + "Ta podatkovni set se ne ureja znotraj Superseta" ], - "The passwords for the databases below are needed in order to import them together with the datasets. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj s podatkovnimi seti. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če je to potrebno." + "DELETE": ["IZBRIŠI"], + "delete": ["izbriši"], + "Type \"%s\" to confirm": ["Vnesite \"%s\" za potrditev"], + "Click to edit": ["Kliknite za urejanje"], + "You don't have the rights to alter this title.": [ + "Nimate pravic za spreminjanje tega naslova." ], - "You are importing one or more datasets that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ - "Uvažate enega ali več podatkovnih setov, ki že obstajajo. S prepisom lahko izgubite podatke. Ali ste prepričani, da želite prepisati?" + "Unexpected error": ["Nepričakovana napaka"], + "This may be triggered by:": ["To je lahko sproženo z/s:"], + "Please reach out to the Chart Owner for assistance.": [ + "Za pomoč se obrnite na lastnika grafikona." ], - "There was an issue previewing the selected query. %s": [ - "Pri predogledu izbrane poizvedbe je prišlo do težave. %s" + "Chart Owner: %s": ["Lastnik grafikona: %s"], + "%(message)s\nThis may be triggered by: \n%(issues)s": [ + "%(message)s\nTo je lahko sproženo z/s: \n%(issues)s" ], - "Duration: %s": ["Trajanje: %s"], - "Tab name": ["Naslov zavihka"], - "TABLES": ["TABELE"], - "Rows": ["Vrstice"], - "Open query in SQL Lab": ["Odpri poizvedbo v SQL laboratoriju"], - "An error occurred while fetching database values: %s": [ - "Pri pridobivanju vrednosti podatkovne baze je prišlo do napake: %s" + "%s Error": ["%s napaka"], + "Missing dataset": ["Manjka podatkovni set"], + "See more": ["Oglejte si več"], + "See less": ["Oglejte si manj"], + "Copy message": ["Kopiraj sporočilo"], + "Close": ["Zapri"], + "This was triggered by:": ["To je bilo sproženo z/s:"], + "Did you mean:": ["Ste mislili:"], + "%(suggestion)s instead of \"%(undefinedParameter)s?\"": [ + "%(suggestion)s namesto \"%(undefinedParameter)s?\"" ], - "An error occurred while fetching user values: %s": [ - "Pri pridobivanju vrednosti uporabnika je prišlo do napake: %s" + "Parameter error": ["Napaka parametra"], + "We’re having trouble loading this visualization. Queries are set to timeout after %s second.": [ + "Težava pri nalaganju vizualizacije. Časovni iztek poizvedb je nastavljen na %s sekund." ], - "Search by query text": ["Išči z besedilom poizvedbe"], - "Query preview": ["Predogled poizvedbe"], - "Next": ["Naslednji"], - "Open in SQL Lab": ["Odpri v SQL laboratoriju"], - "User query": ["Uporabnikova poizvedba"], - "Executed query": ["Zagnana poizvedba"], - "The passwords for the databases below are needed in order to import them together with the saved queries. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj s shranjenimi poizvedbami. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če je to potrebno." + "We’re having trouble loading these results. Queries are set to timeout after %s second.": [ + "Težava pri nalaganju rezultatov. Časovni iztek poizvedb je nastavljen na %s sekund." ], - "You are importing one or more saved queries that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ - "Uvažate eno ali več shranjenih poizvedb, ki že obstajajo. S prepisom lahko izgubite podatke. Ali ste prepričani, da želite prepisati?" + "%(subtitle)s\nThis may be triggered by:\n %(issue)s": [ + "%(subtitle)s\nTo je lahko sproženo z/s: \n %(issue)s" ], - "There was an issue previewing the selected query %s": [ - "Do težave je prišlo pri predogledu izbrane poizvedbe %s" + "Timeout error": ["Napaka pretečenega časa"], + "Click to favorite/unfavorite": [ + "Kliknite za priljubljeno/nepriljubljeno" ], - "Import queries": ["Uvozi poizvedbe"], - "There was an issue deleting the selected queries: %s": [ - "Do težave je prišlo pri brisanju izbranih poizvedb: %s" + "Cell content": ["Vsebina celice"], + "Database driver for importing maybe not installed. Visit the Superset documentation page for installation instructions:": [ + "Gonilnik podatkovne baze za uvoz ni nameščen. Za navodila pojdite na dokumentacijo Superseta:" ], - "Edit query": ["Uredi poizvedbo"], - "Copy query URL": ["Kopiraj URL poizvedbe"], - "Export query": ["Izvozi poizvedbe"], - "Delete query": ["Izbriši poizvedbo"], - "This action will permanently delete the saved query.": [ - "S tem dejanjem boste trajno izbrisali shranjeno poizvedbo." + "OVERWRITE": ["OVERWRITE"], + "Overwrite": ["Prepiši"], + "Import": ["Uvozi"], + "Import %s": ["Uvozi %s"], + "Last Updated %s": ["Zadnja posodobitev %s"], + "Sort": ["Razvrsti"], + "%s Selected": ["Izbranih: %s"], + "Deselect all": ["Počisti izbor"], + "No results match your filter criteria": [ + "Noben rezultat ne ustreza vašim kriterijem" ], - "Delete Query?": ["Izbrišem poizvedbo?"], - "Are you sure you want to delete the selected queries?": [ - "Ali ste prepričani, da želite izbrisati izbrane poizvedbe?" + "Try different criteria to display results.": [ + "Za prikaz rezultatov poskusite z drugačnimi kriteriji." ], - "queries": ["poizvedbe"], - "Query name": ["Ime poizvedbe"], - "[Untitled]": ["[Neimenovana]"], - "Unknown": ["Neznano"], - "Edited": ["Urejane"], - "Created": ["Ustvarjene"], - "Viewed": ["Ogledane"], - "Mine": ["Moje"], - "Recently viewed charts, dashboards, and saved queries will appear here": [ - "Nedavno ogledani grafikoni, nadzorne plošče in shranjene poizvedbe bodo prikazane tukaj" + "clear all filters": ["počisti vse filtre"], + "No Data": ["Ni podatkov"], + "%s-%s of %s": ["%s-%s od %s"], + "Type a value": ["Vnesite vrednost"], + "Filter": ["Filter"], + "Select or type a value": ["Izberite ali vnesite vrednost"], + "OK": ["OK"], + "Menu actions trigger": ["Preklapljanje funkcionalnosti menijev"], + "Weekly Report for %s": ["Tedensko poročilo za %s"], + "Weekly Report": ["Tedensko poročilo"], + "Edit email report": ["Uredi e-poštno poročilo"], + "Schedule a new email report": ["Dodaj novo e-poštno poročilo na urnik"], + "Add": ["Dodaj"], + "Message content": ["Vsebina sporočila"], + "Text embedded in email": ["Besedilo vključeno v e-pošto"], + "Image (PNG) embedded in email": ["Slika (PNG) vključena v e-pošto"], + "Formatted CSV attached in email": ["Oblikovan CSV pripet e-pošti"], + "Include a description that will be sent with your report": [ + "Vključite opis, ki bo vključen v poročilo" ], - "Recently created charts, dashboards, and saved queries will appear here": [ - "Nedavno ustvarjeni grafikoni, nadzorne plošče in shranjene poizvedbe bodo prikazane tukaj" + "A screenshot of the dashboard will be sent to your email at": [ + "Zaslonska slika nadzorne plošče bo poslana na vaš e-naslov ob" ], - "Example ${tableName.toLowerCase()} will appear here": [ - "Primer ${tableName.toLowerCase()} se bo prikazal tukaj" + "Timezone": ["Časovni pas"], + "Failed to update report": ["Posodabljanje poročila neuspešno"], + "Failed to create report": ["Ustvarjanje poročila nesupešno"], + "Email reports active": ["E-poštna poročila aktivna"], + "Delete email report": ["Izbriši e-poštno poročilo"], + "Set up an email report": ["Nastavite e-poštno poročilo"], + "Schedule email report": ["Dodaj e-poštno poročilo na urnik"], + "This action will permanently delete %s.": [ + "S tem dejanjem boste trajno izbrisali %s." ], - "Recently edited charts, dashboards, and saved queries will appear here": [ - "Nedavno urejani grafikoni, nadzorne plošče in shranjene poizvedbe bodo prikazane tukaj" + "Delete Report?": ["Izbrišem poročilo?"], + "Loading...": ["Nalagam ..."], + "Access to user activity data is restricted": [ + "Dostop do aktivnosti uporabnikov je omejen" ], - "${tableName\r\n .split('')\r\n .slice(0, tableName.length - 1)\r\n .join('')}\r\n ": [ - "${tableName\r\n .split('')\r\n .slice(0, tableName.length - 1)\r\n .join('')}\r\n " + "There was an error loading the tables": ["Napaka pri nalaganju tabel"], + "See table schema": ["Ogled sheme tabele"], + "Select table or type table name": ["Izberite ali vnesite ime tabele"], + "Force refresh table list": ["Osveži seznam tabel"], + "Timezone selector": ["Izbira časovnega pasa"], + "There is not enough space for this component. Try decreasing its width, or increasing the destination width.": [ + "Za to komponento ni dovolj prostora. Poskusite zmanjšati širino ali pa povečati širino cilja." ], - "You don't have any favorites yet!": ["Priljubljenih še niste izbrali!"], - "SQL Lab queries": ["Poizvedbe SQL laboratorija"], - "${tableName}": ["${tableName}"], - "query": ["poizvedba"], - "Share": ["Deljenje"], - "Ran %s": ["Pretečeno %s"], - "There was an issue fetching your recent activity: %s": [ - "Pri pridobivanju vaše nedavne aktivnosti je prišlo do napake: %s" + "Can not move top level tab into nested tabs": [ + "Najvišjega zavihka ni mogoče premakniti v gnezdene zavihke" ], - "There was an issues fetching your dashboards: %s": [ - "Prišlo je do napake pri pridobivanju nadzornih plošč: %s" + "This chart has been moved to a different filter scope.": [ + "Ta grafikon je bil prestavljen v drug doseg filtrov." ], - "There was an issues fetching your chart: %s": [ - "Prišlo je do napake pri pridobivanju grafikona: %s" + "There was an issue fetching the favorite status of this dashboard.": [ + "Pri pridobivanju statusa \"priljubljeno\" za to nadzorno ploščo je prišlo do težave." ], - "There was an issues fetching your saved queries: %s": [ - "Prišlo je do napake pri pridobivanju shranjenih poizvedb: %s" + "There was an issue favoriting this dashboard.": [ + "Pri uvrščanju nadzorne plošče med priljubljene je prišlo do težave." ], - "Recents": ["Nedavno"], - "Select start and end date": ["Izberite začetni in končni datum"], - "Type or Select [%s]": ["Vnesite ali izberite [%s]"], - "No results found": ["Rezultati niso najdeni"], - "Tools": ["Orodja"], - "Filter box": ["Izbirnik za filtriranje"], - "Chart component that lets you add a custom filter UI in your dashboard. When added to dashboard, a filter box lets users specify specific values or ranges to filter charts by. The charts that each filter box is applied to can be fine tuned as well in the dashboard view.\r\n\r\n Note that this plugin is being replaced with the new Filters feature that lives in the dashboard view itself. It's easier to use and has more capabilities!": [ - "Komponenta grafikona, ki omogoča dodajanje vmesnika filtrov po meri v nadzorno ploščo. Ko je dodana na nadzorno ploščo, lahko uporabnik določi poljubne vrednosti ali obsege filtrov. Grafikoni, na katere se nanašajo filtri, so lahko precizno izbrani tudi v pogledu nadzorne plošče.\r\n\r\n Vedite, da bo ta vtičnik v prihodnosti zamenjan z novim konceptom filtrov, ki bodo živeli v kontekstu same nadzorne plošče in bodo zmogljivejši ter enostavnejši za uporabo!" + "This dashboard is now published": [ + "Ta nadzorna plošča je sedaj objavljena" ], - "Show Druid granularity dropdown": [ - "Prikaži spustni seznam za Druid granulacijo" + "This dashboard is now hidden": ["Ta nadzorna plošča je sedaj skrita"], + "You do not have permissions to edit this dashboard.": [ + "Nimate dovoljenj za urejanje te nadzorne plošče." ], - "Check to include Druid granularity dropdown": [ - "Izberite za vključitev spustnega seznama za Druid granulacijo" + "[ untitled dashboard ]": ["[ neimenovana nadzorna plošča ]"], + "This dashboard was saved successfully.": [ + "Nadzorna plošča je bila uspešno shranjena." ], - "Show Druid time origin": ["Prikaži časovno izhodišče za Druid"], - "Check to include time origin dropdown": [ - "Izberi za vključitev spustnega seznama za časovno izhodišče" + "Sorry, an unknown error occured": ["Prišlo je do neznane napake"], + "Sorry, there was an error saving this dashboard: %s": [ + "Prišlo je do napake pri shranjevanju nadzorne plošče: %s" ], - "Filters configuration": ["Nastavitve filtrov"], - "Filter configuration for the filter box": ["Nastavitve za polje filtra"], - "Date filter": ["Filter po datumu"], - "Whether to include a time filter": [ - "Če želite vključiti časovni filter" + "You do not have permission to edit this dashboard": [ + "Nimate dovoljenja za urejanje te nadzorne plošče" ], - "Instant filtering": ["Takojšnje filtriranje"], - "Check to apply filters instantly as they change instead of displaying [Apply] button": [ - "Izberite za takojšnjo uporabo filtrov, ko se spremenijo, brez prikazovanja gumba Uveljavi" + "Could not fetch all saved charts": [ + "Vseh shranjenih grafikonov ni bilo mogoče pridobiti" ], - "Show SQL time grain dropdown": [ - "Prikaži SQL spustni seznam za časovno granulacijo" + "Sorry there was an error fetching saved charts: ": [ + "Prišlo je do napake pri pridobivanju shranjenih grafikonov: " ], - "Show time grain dropdown": [ - "Prikaži spustni seznam za časovno granulacijo" + "Visualization": ["Vizualizacija"], + "Data source": ["Podatkovni vir"], + "Added": ["Dodano"], + "Any color palette selected here will override the colors applied to this dashboard's individual charts": [ + "Na tem mestu izbrana barvna shema bo nadomestila barve posameznih grafikonov v tej nadzorni plošči" ], - "Check to include SQL time grain dropdown": [ - "Izberite za vključitev spustnega seznama za časovno granulacijo SQL" + "You have unsaved changes.": ["Imate neshranjene spremembe."], + "Changes saved.": ["Spremembe shranjene."], + "Disable embedding?": ["Onemogočite vgrajevanje?"], + "This will remove your current embed configuration.": [ + "To bo odstranilo trenutno konfiguracijo za vgrajevanje." ], - "Check to include time grain dropdown": [ - "Izberite za vključitev spustnega seznama za časovno granullacijo" + "Embedding deactivated.": ["Vgrajevanje deaktivirano."], + "Sorry, something went wrong. Embedding could not be deactivated.": [ + "Nekaj je šlo narobe. Vgrajevanja ni mogoče deaktivirati." ], - "Show SQL time column": ["Prikaži stolpec SQL čas"], - "Show time column": ["Prikaži časovni stolpec"], - "Check to include time column dropdown": [ - "Izberite za vključitev časovnega stolpca v spustni seznam" + "This dashboard is ready to embed. In your application, pass the following id to the SDK:": [ + "Nadzorna plošča je pripravljena za vgradnjo. V svoji aplikaciji v SDK vključite naslednji ID:" ], - "Limit selector values": ["Omeji vrednosti izbirnikov"], - "These filters apply to the values available in the dropdowns": [ - "Ti filtri se nanašajo na vrednosti v spustnih seznamih" + "Configure this dashboard to embed it into an external web application.": [ + "Nastavite nadzorno ploščo za vgradnjo v zunanjo spletno aplikacijo." ], - "Time-series Table": ["Tabela s časovno vrsto"], - "Compare multiple time series charts (as sparklines) and related metrics quickly.": [ - "Hitra primerjava več grafikonov časovnih vrst (sparkline način) in povezanih mer." + "For further instructions, consult the": [ + "Za nadaljnja navodila se posvetujte z" ], - "Multi-Variables": ["Več spremenljivk"], - "Comparison": ["Primerjava"], - "Legacy": ["Staro"], - "Percentages": ["Procenti"], - "Tabular": ["Tabelarično"], - "Text": ["Besedilo"], - "Trend": ["Trend"], - "Time Range": ["Časovno obdobje"], - "Time Column": ["Časovni stolpec"], - "Time Grain": ["Granulacija časa"], - "Time Granularity": ["Granulacija časa"], - "Aggregate": ["Agregacija"], - "Raw records": ["Surovi podatki"], - "Show info tooltip": ["Prikaži opis orodja"], - "Resample": ["Prevzorči"], - "Fill method": ["Način polnjenja"], - "Annotations and Layers": ["Oznake in sloji"], - "Chart Title": ["Naslov grafikona"], - "X Axis Title": ["Naslov X osi"], - "X AXIS TITLE BOTTOM MARGIN": ["SPODNJA OBROBA NASLOVA X OSI"], - "Y Axis Title": ["Naslov Y osi"], - "Y AXIS TITLE MARGIN": ["OBROBA NASLOVA Y OSI"], - "Y AXIS TITLE POSITION": ["POZICIJA NASLOVA Y OSI"], - "Predictive Analytics": ["Prediktivna analitika"], - "Enable forecast": ["Omogoči napoved"], - "Enable forecasting": ["Omogoči napovedovanje"], - "Forecast periods": ["Periode napovedi"], - "How many periods into the future do we want to predict": [ - "Za koliko period v prihodnosti želite napoved" + "Superset Embedded SDK documentation.": [ + "Dokumentacija SDK za vgrajevanje." ], - "Confidence interval": ["Interval zaupanja"], - "Width of the confidence interval. Should be between 0 and 1": [ - "Širina intervala zaupanja. Mora bit med 0 in 1" + "Allowed Domains (comma separated)": [ + "Dovoljene domene (ločeno z vejico)" ], - "Should yearly seasonality be applied. An integer value will specify Fourier order of seasonality.": [ - "Če želite letno sezonskost. Celo število določa Fourier-jev red sezonskosti." + "A list of domain names that can embed this dashboard. Leaving this field empty will allow embedding from any domain.": [ + "Seznam imen domen, ki lahko vgradijo to nadzorno ploščo. Če polje ostane prazno, je vgrajevanje dovoljeno iz vseh domen." ], - "Should weekly seasonality be applied. An integer value will specify Fourier order of seasonality.": [ - "Če želite tedensko sezonskost. Celo število določa Fourier-jev red sezonskosti." + "Deactivate": ["Deaktiviraj"], + "Save changes": ["Shrani spremembe"], + "Enable embedding": ["Omogoči vgrajevanje"], + "Embed": ["Vgradi"], + "Drag and drop components and charts to the dashboard": [ + "Povlecite in spustite elemente in grafikone na nadzorno ploščo" ], - "Should daily seasonality be applied. An integer value will specify Fourier order of seasonality.": [ - "Če želite dnevno sezonskost. Celo število določa Fourier-jev red sezonskosti." + "You can create a new chart or use existing ones from the panel on the right": [ + "Ustvarite lahko nove grafikone ali uporabite obstoječe iz panela na desni" ], - "Datasource & Chart Type": ["Tip podatkovnega vira in grafikona"], - "URL Parameters": ["Parametri URL"], - "Extra url parameters for use in Jinja templated queries": [ - "Dodatni parametri za poizvedbe z Jinja predlogami" + "Drag and drop components to this tab": [ + "Povlecite in spustite elemente na zavihek" ], - "Extra Parameters": ["Dodatni parametri"], - "Extra parameters that any plugins can choose to set for use in Jinja templated queries": [ - "Dodatni parametri, ki jih lahko uporabi kateri koli vtičnik za poizvedbe z Jinja predlogami" + "There are no components added to this tab": [ + "Na zavihek niso bili dodani elementi" ], - "Color Scheme": ["Barvna shema"], - "One or many columns to pivot as columns": [ - "En ali več stolpcev za stolpčno vrtenje" + "You can add the components in the edit mode.": [ + "Elemente lahko dodate v načinu urejanja." ], - "Right Axis Metric": ["Mera desne osi"], - "Bubble Size": ["Velikost mehurčka"], - "Metric used to calculate bubble size": [ - "Mera za izračun velikosti mehurčkov" + "Edit the dashboard": ["Uredi nadzorno ploščo"], + "Ready to review filters in this dashboard?": [ + "Ste pripravljeni za pregled filtrov v tej nadzorni plošči?" ], - "Color Metric": ["Mera za barvo"], - "Drop temporal column here": ["Spustite časovni stolpec sem"], - "Emit dashboard cross filters": [ - "Oddajaj medsebojne filtre nadzorne plošče" + "Remind me in 24 hours": ["Opomni me čez 24 ur"], + "Start Review": ["Začetek pregleda"], + "filter_box will be deprecated in a future version of Superset. Please replace filter_box by dashboard filter components.": [ + "Element filter_box bo v prihodnjih verzijah Superseta opuščen. Nadomestite ga s filtri nadzorne plošče." ], - "Emit dashboard cross filters.": [ - "Oddajaj medsebojne filtre nadzorne plošče." + "There is no chart definition associated with this component, could it have been deleted?": [ + "S to komponento ni povezana nobena definicija grafikona. Ali je bila izbrisana?" ], - "One or many columns to group by. High cardinality groupings should include a sort by metric and series limit to limit the number of fetched and rendered series.": [ - "Eden ali več stolpcev za združevanje. Združevanje z visoko kardinalnostjo naj vsebuje mero za razvrščanje in omjitev serij, s čimer omejite število pridobljenih in prikazanih serij." + "Delete this container and save to remove this message.": [ + "Izbrišite ta okvir in shranite za odpravo tega sporočila." ], - "Fixed Color": ["Izbrana barva"], - "Linear Color Scheme": ["Linearna barvna shema"], - "Time format": ["Oblika zapisa časa"], - "Whether to sort descending or ascending. Takes effect only when \"Sort by\" is set": [ - "Če želite padajoče ali naraščajoče razvrščanje. Učinkuje samo, ko je vključen \"Sort by\"" + "Don't refresh": ["Ne osvežuj"], + "10 seconds": ["10 sekund"], + "30 seconds": ["30 sekund"], + "1 minute": ["1 minuta"], + "5 minutes": ["5 minut"], + "30 minutes": ["30 minut"], + "1 hour": ["1 ura"], + "6 hours": ["6 ur"], + "12 hours": ["12 ur"], + "24 hours": ["24 ur"], + "Refresh interval saved": ["Interval osveževanja shranjen"], + "Refresh interval": ["Interval osveževanja"], + "Refresh frequency": ["Frekvenca osveževanja"], + "Are you sure you want to proceed?": ["Ali želite nadaljevati?"], + "Save for this session": ["Shranite za to sejo"], + "You must pick a name for the new dashboard": [ + "Izbrati morate ime nove nadzorne plošče" ], - "Show less columns": ["Prikaži manj stolpcev"], - "Show all columns": ["Prikaži vse stolpce"], - "Emit Target": ["Cilj oddajanja"], - "If you wish to specify a different target column than the original column, it can be entered here": [ - "Če želite nastaviti drug ciljni stolpec od izvornega, ga lahko vnesete tukaj" + "Save dashboard": ["Shrani nadzorno ploščo"], + "Overwrite Dashboard [%s]": ["Prepiši nadzorno ploščo [%s]"], + "Save as:": ["Shrani kot:"], + "[dashboard name]": ["[ime nadzorne plošče]"], + "also copy (duplicate) charts": ["kopiraj (podvoji) tudi grafikone"], + "Filter your charts": ["Filtriraj grafikone"], + "Sort by %s": ["Razvrščanje po %s"], + "Superset chart": ["Superset grafikon"], + "Check out this chart in dashboard:": [ + "Preizkusite ta grafikon v nadzorni plošči:" ], - "Fraction digits": ["Število decimalk"], - "Number of decimal digits to round numbers to": [ - "Število decimalnih mest za zaokroževanje števil" + "Layout elements": ["Postavitev elementov"], + "Cross Filter Scoping": ["Doseg medsebojnega filtra"], + "Load a CSS template": ["Naloži CSS predlogo"], + "Live CSS editor": ["CSS urejevalnik v živo"], + "There are no charts added to this dashboard": [ + "V nadzorni plošči ni grafikonov" ], - "Min Width": ["Min. širina"], - "Default minimal column width in pixels, actual width may still be larger than this if other columns don't need much space": [ - "Privzeta min. širina stolpca v pikslih. Dejanska širina bo lahko večja, če drugi stolpci ne potrebujejo veliko prostora" + "Go to the edit mode to configure the dashboard and add charts": [ + "Za nastavitve nadzorne plošče in dodajanje grafikonov pojdite v način urejanja" ], - "Text align": ["Poravnava besedila"], - "Horizontal alignment": ["Vodoravna poravnava"], - "Left": ["Levo"], - "Center": ["Na sredino"], - "Right": ["Desno"], - "Show cell bars": ["Prikaži stolp. graf v celicah"], - "Whether to display a bar chart background in table columns": [ - "Če želite omogočiti prikaz manjših stolpčnih grafikonov v ozadju stolpcev tabele" + "Applied Cross Filters (%d)": ["Uporabljeni medsebojni filtri (%d)"], + "Applied Filters (%d)": ["Uporabljeni filtri (%d)"], + "Incompatible Filters (%d)": ["Neskladni filtri (%d)"], + "Unset Filters (%d)": ["Neuporabljeni filtri (%d)"], + "This dashboard is currently auto refreshing; the next auto refresh will be in %s.": [ + "Nadzorna plošča se trenutno samodejno osvežuje. Naslednja samodejna osvežitev bo čez %s." ], - "Align +/-": ["Poravnaj +/-"], - "Whether to align positive and negative values in cell bar chart at 0": [ - "Če želite poravnati pozitivne in negativne vrednosti v stolpčnem grafikonu celic pri 0" + "Your dashboard is too large. Please reduce its size before saving it.": [ + "Vaša nadzorna plošča je prevelika. Pred shranjevanjem jo zmanjšajte." ], - "Color +/-": ["Barva +/-"], - "Whether to colorize numeric values by if they are positive or negative": [ - "Če želite obarvati številske vrednosti, ko so le-te pozitivne ali negativne" + "Add the name of the dashboard": ["Dodajte naziv nadzorne plošče"], + "Dashboard title": ["Naziv nadzorne plošče"], + "Undo the action": ["Razveljavi dejanje"], + "Redo the action": ["Ponovno uveljavi dejanje"], + "Discard": ["Zavrzi"], + "Edit dashboard": ["Uredi nadzorno ploščo"], + "An error occurred while fetching available CSS templates": [ + "Pri pridobivanju CSS predlog je prišlo do napake" ], - "Small number format": ["Oblika zapisa majhnih števil"], - "D3 number format for numbers between -1.0 and 1.0, useful when you want to have different siginificant digits for small and large numbers": [ - "D3 oblika zapisa za števila med -1.0 in 1.0. Uporabno, če želite različno število števk za majhna in velika števila" + "Refreshing charts": ["Osveževanje grafikonov"], + "Superset dashboard": ["Superset nadzorna plošča"], + "Check out this dashboard: ": ["Preizkusite to nadzorno ploščo: "], + "Refresh dashboard": ["Osveži nadzorno ploščo"], + "Exit fullscreen": ["Izhod iz celozaslonskega načina"], + "Enter fullscreen": ["Vklopi celozaslonski način"], + "Edit properties": ["Uredi lastnosti"], + "Edit CSS": ["Uredi CSS"], + "Download as image": ["Izvozi kot sliko"], + "Share": ["Deljenje"], + "Copy permalink to clipboard": ["Kopiraj povezavo v odložišče"], + "Share permalink by email": ["Deli povezavo po e-pošti"], + "Embed dashboard": ["Vgradi nadzorno ploščo"], + "Manage email report": ["Upravljaj e-poštno poročilo"], + "Set filter mapping": ["Nastavi shemo filtrov"], + "Set auto-refresh interval": ["Nastavi interval samodejnega osveževanja"], + "Apply": ["Uporabi"], + "A valid color scheme is required": [ + "Zahtevana je veljavna barvna shema" ], - "D3 format syntax: https://github.com/d3/d3-format": [ - "Sintaksa D3 formata: https://github.com/d3/d3-format" + "Dashboard properties updated": [ + "Lastnosti nadzorne plošče posodobljene" ], - "Adaptive formatting": ["Adaptivno oblikovanje"], - "Duration in ms (66000 => 1m 6s)": ["Trajanje v ms (66000 => 1m 6s)"], - "Duration in ms (1.40008 => 1ms 400µs 80ns)": [ - "Trajanje v ms (1.40008 => 1ms 400µs 80ns)" + "The dashboard has been saved": ["Nadzorna plošča je bila shranjena"], + "Access": ["Dostop"], + "Owners is a list of users who can alter the dashboard. Searchable by name or username.": [ + "\"Lastniki\" je seznam uporabnikov, ki lahko spreminjajo nadzorno ploščo. Iskanje je možno po imenu ali uporabniškem imenu." ], - "D3 time format syntax: https://github.com/d3/d3-time-format": [ - "Sintaksa D3 časovnega formata:: https://github.com/d3/d3-time-format" + "Colors": ["Barve"], + "Roles is a list which defines access to the dashboard. Granting a role access to a dashboard will bypass dataset level checks. If no roles are defined, then the dashboard is available to all roles.": [ + "\"Vloge\" je seznam, ki definira dostop do nadzorne plošče. Dodelitev vloge za dostop do nadzorne plošče bo obšlo preverjanje na nivoju podatkovnega seta. Če vloga ni definirana, bo nadzorna plošča dostopna vsem vlogam." ], - "No results were returned for this query. If you expected results to be returned, ensure any filters are configured properly and the datasource contains data for the selected time range.": [ - "Poizvedba ni vrnila rezultatov. Če ste pričakovali rezultate, poskrbite, da so filtri pravilno nastavljeni in podatkovni vir vsebuje podatke za izbrano časovno obdobje." + "Dashboard properties": ["Lastnosti nadzorne plošče"], + "This dashboard is managed externally, and can't be edited in Superset": [ + "Ta nadzorna plošča se ne ureja znotraj Superseta" ], - "No Results": ["Ni rezultatov"], - "Found invalid orderby options": [ - "Najdene so neveljavne možnosti razvrščanja" + "Basic information": ["Osnovne informacije"], + "URL slug": ["URL slug"], + "A readable URL for your dashboard": [ + "Berljiv URL za vašo nadzorno ploščo" ], - "is expected to be an integer": ["pričakovano je celo število"], - "is expected to be a number": ["pričakovano je število"], - "cannot be empty": ["ne sme biti prazno"], - "haha": ["haha"], - "foo": ["foo"], - "bar": ["bar"], - "yes": ["da"], - "second": ["sekunda"], - "ox": ["ox"], - "Domain": ["Domena"], - "The time unit used for the grouping of blocks": [ - "Časovna enota za združevanje blokov" + "Certification": ["Certifikacija"], + "Person or group that has certified this dashboard.": [ + "Oseba ali skupina, ki je certificirala to nadzorno ploščo." ], - "Subdomain": ["Poddomena"], - "The time unit for each block. Should be a smaller unit than domain_granularity. Should be larger or equal to Time Grain": [ - "Časovna enota za vsak blok. Mora biti manjša enota kot domenska_granulacija. Mora biti večja ali enaka Granulaciji časa" + "Any additional detail to show in the certification tooltip.": [ + "Dodatne podrobnosti za prikaz v certifikacijskem orodju." ], - "Chart Options": ["Možnosti grafikona"], - "Cell Size": ["Velikost celice"], - "The size of the square cell, in pixels": [ - "Velikost kvadratne celice v pikslih" + "JSON metadata": ["JSON metapodatki"], + "This dashboard is not published, it will not show up in the list of dashboards. Click here to publish this dashboard.": [ + "Ta nadzorna plošča ni objavljena in se ne bo prikazala na seznamu nadzornih plošč. Kliknite tukaj za njeno objavo." ], - "Cell Padding": ["Razmak med celicami"], - "The distance between cells, in pixels": [ - "Razdalja med celicami v pikslih" + "This dashboard is not published which means it will not show up in the list of dashboards. Favorite it to see it there or access it by using the URL directly.": [ + "Ta nadzorna plošča ni objavljena in se ne bo prikazala na seznamu nadzornih plošč. Uvrstite jo med priljubljene, da jo boste videli tam, ali pa uporabite URL za neposredni dostop." ], - "Cell Radius": ["Polmer celice"], - "The pixel radius": ["Polmer piksla"], - "Color Steps": ["Barvni koraki"], - "The number color \"steps\"": ["Število barvnih korakov"], - "Time Format": ["Oblika zapisa časa"], - "Legend": ["Legenda"], - "Whether to display the legend (toggles)": [ - "Preklapljanje prikaza legende" + "This dashboard is published. Click to make it a draft.": [ + "Ta nadzorna plošča je objavljena. Kliknite, da jo uvrstite med osnutke." ], - "Show Values": ["Pokaži vrednosti"], - "Whether to display the numerical values within the cells": [ - "Če želite v celicah prikazati numerične vrednosti" + "Draft": ["Osnutek"], + "Annotation layers are still loading.": [ + "Sloj z oznakami se še vedno nalaga." ], - "Show Metric Names": ["Pokaži imena mer"], - "Whether to display the metric name as a title": [ - "Če želite prikazati ime mere kot naslov" + "One ore more annotation layers failed loading.": [ + "Eden ali več slojev z oznakami se ni naložil." ], - "Number Format": ["Oblika zapisa števila"], - "Correlation": ["Korelacija"], - "Visualizes how a metric has changed over a time using a color scale and a calendar view. Gray values are used to indicate missing values and the linear color scheme is used to encode the magnitude of each day's value.": [ - "Prikaže kako se je mera spreminjala s časom s pomočjo barvne lestvice in koledarskega pogleda. Sive vrednosti ponazarjajo manjkajoče vrednosti. Amplituda dnevnih vrednosti je ponazorjena z linearno barvno shemo." + "Emitted values": ["Oddane vrednosti"], + "Click to edit %s in a new tab": [ + "Kliknite za urejanje %s v novem zavihku" ], - "Business": ["Aktivnost"], - "Intensity": ["Intenzivnost"], - "Pattern": ["Vzorec"], - "Report": ["Poročilo"], - "Sort by metric": ["Mera za razvrščanje"], - "Whether to sort results by the selected metric in descending order.": [ - "Če želite padajoče razvrstiti rezultate z izbrano mero." + "Click to edit chart in a new tab": [ + "Kliknite za urejanje grafikona v novem zavihku" ], - "Number format": ["Oblika zapisa števila"], - "Choose a number format": ["Izberite obliko zapisa števila"], - "Choose a source": ["Izberite izvor"], - "Target": ["Cilj"], - "Choose a target": ["Izberite cilj"], - "Flow": ["Potek"], - "Showcases the flow or link between categories using thickness of chords. The value and corresponding thickness can be different for each side.": [ - "Prikaže potek ali povezave med kategorijami z debelino tetiv. Vrednost in debelina sta lahko različni za vsako stran." + "Click to clear emitted filters": ["S klikom počistite oddane filtre"], + "Data refreshed": ["Podatki osveženi"], + "Cached %s": ["Predpomnjeno %s"], + "Fetched %s": ["Pridobljeno %s"], + "Query %s: %s": ["Poizvedba %s: %s"], + "Force refresh": ["Osveži"], + "Hide chart description": ["Skrij opis grafikona"], + "Show chart description": ["Prikaži opis grafikona"], + "Edit chart": ["Uredi grafikon"], + "View query": ["Ogled poizvedbe"], + "Drill to detail": ["Vrtaj v podrobnosti"], + "Chart Data: %s": ["Podatki grafikona: %s"], + "Cross-filter scoping": ["Doseg medsebojnega filtra"], + "Share chart by email": ["Deli grafikon po e-pošti"], + "Check out this chart: ": ["Preizkusite ta grafikon: "], + "Download": ["Prenos"], + "Export to .CSV": ["Izvozi v .CSV"], + "Export to full .CSV": ["Izvozi v celoten .CSV"], + "Search...": ["Iskanje ..."], + "No filter is selected.": ["Noben filter ni izbran."], + "Editing 1 filter:": ["Urejanje enega filtra:"], + "Batch editing %d filters:": ["Skupinsko urejanje %d filtrov:"], + "Configure filter scopes": ["Nastavi doseg filtrov"], + "There are no filters in this dashboard.": [ + "V nadzorni plošči ni filtrov." ], - "Relationships between community channels": [ - "Razmerja med skupnostnimi kanali" + "Expand all": ["Razširi vse"], + "Collapse all": ["Skrči vse"], + "An error occurred while opening Explore": [ + "Pri odpiranju Raziskovalca je prišlo do napake" ], - "Chord Diagram": ["Tetivni grafikon"], - "Aesthetic": ["Estetika"], - "Circular": ["Krožno"], - "Proportional": ["Proporcionalno"], - "Relational": ["Relacijsko"], - "Country": ["Država"], - "Which country to plot the map for?": [ - "Za katero državo želite grafikon?" + "This markdown component has an error.": [ + "Markdown komponenta ima napako." ], - "ISO 3166-2 Codes": ["Oznake po ISO 3166-2"], - "Column containing ISO 3166-2 codes of region/province/department in your table.": [ - "Stolpec, ki vsebuje ISO 3166-2 oznake regij/provinc/departmajev v vaši tabeli." + "This markdown component has an error. Please revert your recent changes.": [ + "Markdown komponenta ima napako. Povrnite nedavne spremembe." ], - "Metric to display bottom title": ["Mera za prikaz spodnjega naslova"], - "Map": ["Zemljevid"], - "Visualizes how a single metric varies across a country's principal subdivisions (states, provinces, etc) on a chloropleth map. Each subdivision's value is elevated when you hover over the corresponding geographic boundary.": [ - "Prikaže kako se posamezna mera spreminja glede na območja države (dežele, province, itd.) na kloropletnem zemljevidu. Vsak podrazdelek se dvigne, ko z miško preidete mejo njegovega območja." + "You can": ["Lahko"], + "create a new chart": ["ustvarite nov grafikon"], + "or use existing ones from the panel on the right": [ + "ali uporabite obstoječe iz panela na desni" ], - "2D": ["2D"], - "Geo": ["Geo"], - "Range": ["Doseg"], - "Stacked": ["Naložen"], - "Sorry, there appears to be no data": ["Ni podatkov"], - "Event definition": ["Definicija dogodka"], - "Event Names": ["Imena dogodkov"], - "Columns to display": ["Stolpci za prikaz"], - "Order by entity id": ["Uredi po ID entitete"], - "Important! Select this if the table is not already sorted by entity id, else there is no guarantee that all events for each entity are returned.": [ - "Pomembno! Izberite, če tabela še ni razvrščena po ID entitete, v nasprotnem primeru ni nujno, da bodo vrnjeni vsi dogodki za posamezno entiteto." + "You can add the components in the": ["Lahko dodate elemente v"], + "edit mode": ["načinu urejanja"], + "Delete dashboard tab?": ["Ali izbrišem zavihek nadzorne plošče?"], + "Divider": ["Ločilnik"], + "Header": ["Glava"], + "Row": ["Vrstica"], + "Tabs": ["Zavihki"], + "Preview": ["Predogled"], + "Sorry, something went wrong. Try again later.": [ + "Nekaj je šlo narobe. Poskusite ponovno kasneje." ], - "Minimum leaf node event count": ["Min. število dogodkov za list"], - "Leaf nodes that represent fewer than this number of events will be initially hidden in the visualization": [ - "Listna vozlišča, ki predstavljajo manjše število dogodkov od te vrednosti, bodo v vizualizaciji skrita" + "All filters (%(filterCount)d)": ["Vsi filtri (%(filterCount)d)"], + "No filters are currently added": ["Trenutno ni dodanih filtrov"], + "Click the button above to add a filter to the dashboard": [ + "S klikom gumba zgoraj dodate filter na nadzorno ploščo" ], - "Additional metadata": ["Dodatni metapodatki"], - "Metadata": ["Metapodatki"], - "Select any columns for metadata inspection": [ - "Izberite poljubne stolpce za pregled metapodatkov" + "Filter sets (%(filterSetCount)d)": [ + "Nastavljeni filtri (%(filterSetCount)d)" ], - "Entity ID": ["ID entitete"], - "e.g., a \"user id\" column": ["t.j. stolpec \"id uporabnika\""], - "Max Events": ["Max. dogodkov"], - "The maximum number of events to return, equivalent to the number of rows": [ - "Največje število dogodkov, ki bodo vrnjeni - enako številu vrstic" + "Apply filters": ["Uporabi filtre"], + "Clear all": ["Počisti vse"], + "Filters out of scope (%d)": ["Filtri izven dosega (%d)"], + "Check configuration": ["Preveri nastavitve"], + "Cannot load filter": ["Filtra ni mogoče naložiti"], + "Editing filter set:": ["Urejanje seta filtrov:"], + "Filter set with this name already exists": [ + "Set filtrov z enakim imenom že obstaja" ], - "Compares the lengths of time different activities take in a shared timeline view.": [ - "Primerja dolžine časovno različnih aktivnosti na skupni časovnici." + "Filter set already exists": ["Set filtrov že obstaja"], + "This filter set is identical to: \"%s\"": [ + "Ta set filtrov je enak: \"%s\"" ], - "Event Flow": ["Potek dogodkov"], - "Progressive": ["Progresivno"], - "Link Length": ["Dolžina povezave"], - "Link length in the force layout": ["Dolžina povezave v postavitvi sil"], - "Charge": ["Naboj"], - "Charge in the force layout": ["Naboj v postavitvi sil"], - "Source / Target": ["Izhodišče/Cilj"], - "Choose a source and a target": ["Izberite izhodišče in cilj"], - "Force-directed Graph": ["Graf usmerjenih sil"], - "Axis ascending": ["Naraščajoča os"], - "Axis descending": ["Padajoča os"], - "Metric ascending": ["Naraščajoča mera"], - "Metric descending": ["Padajoča mera"], - "Heatmap Options": ["Možnosti toplotnega prikaza"], - "XScale Interval": ["Interval X-osi"], - "Number of steps to take between ticks when displaying the X scale": [ - "Število korakov med oznakami pri prikazu X-osi" + "Remove invalid filters": ["Odstrani neveljavne filtre"], + "Rebuild": ["Obnovi"], + "Filters (%d)": ["Filtri (%d)"], + "This filter doesn't exist in dashboard. It will not be applied.": [ + "Ta filter ne obstaja v nadzorni plošči in ne bo uveljavljen." ], - "YScale Interval": ["Interval Y-osi"], - "Number of steps to take between ticks when displaying the Y scale": [ - "Število korakov med oznakami pri prikazu Y-osi" + "Filter metadata changed in dashboard. It will not be applied.": [ + "Metapodatki filtra so se spremenili v nadzorni plošči. Ne bo uveljavljen." ], - "Rendering": ["Izris"], - "image-rendering CSS attribute of the canvas object that defines how the browser scales up the image": [ - "atribut CSS za izris objekta platna, ki določa, kako brskalnik poveča sliko" + "Please filter set name": ["Vnesite ime seta filtrov"], + "Create": ["Ustvari"], + "Create new filter set": ["Ustvarite nov set filtrov"], + "New filter set": ["Nov set filtrov"], + "Please apply filter changes": ["Potrdite spremembe filtra"], + "Unknown value": ["Neznana vrednost"], + "Add/Edit Filters": ["Dodaj/uredi filter"], + "Dependent on": ["Odvisen od"], + "Filter only displays values relevant to selections made in other filters.": [ + "Filter prikazuje samo vrednosti vezane na izbire v drugih filtrih." ], - "Normalize Across": ["Normiraj glede na"], - "Color will be rendered based on a ratio of the cell against the sum of across this criteria": [ - "Barva bo prikazana na osnovi razmerja med celico in vsoto glede na ta kriterij" + "All charts": ["Vsi grafikoni"], + "Scope": ["Doseg"], + "Filter type": ["Tip filtra"], + "Title is required": ["Naslov je obvezen"], + "(Removed)": ["(Odstranjeno)"], + "Undo?": ["Povrni?"], + "Add filters and dividers": ["Dodaj filtre in ločilnike"], + "[untitled]": ["[neimenovana]"], + "Cyclic dependency detected": ["Zaznana krožna odvisnost"], + "Add and edit filters": ["Dodaj in uredi filtre"], + "Column select": ["Izbira stolpca"], + "Select a column": ["Izberite stolpec"], + "No compatible columns found": ["Ni najdenih skladnih stolpcev"], + "Value is required": ["Zahtevana je vrednost"], + "(deleted or invalid type)": ["(izbrisan ali neveljaven tip)"], + "Limit type": ["Tip omejitve"], + "No available filters.": ["Ni razpoložljivih filtrov."], + "Add filter": ["Dodaj filter"], + "Values are dependent on other filters": [ + "Vrednosti so odvisne od drugih filtrov" ], - "Left Margin": ["Levi rob"], - "Left margin, in pixels, allowing for more room for axis labels": [ - "Levi rob, v pikslih, s katerim povečamo prostor za oznake osi" + "Values selected in other filters will affect the filter options to only show relevant values": [ + "Vrednosti izbrane v drugih filtrih bodo vplivale na možnosti filtra" ], - "Bottom Margin": ["Spodnji rob"], - "Bottom margin, in pixels, allowing for more room for axis labels": [ - "Spodnji rob, v pikslih, s katerim povečamo prostor za oznake osi" + "Values dependent on": ["Vrednosti so odvisne od"], + "Scoping": ["Doseg"], + "Filter Configuration": ["Nastavitve filtra"], + "Filter Settings": ["Nastavitve filtra"], + "Select filter": ["Izbirni filter"], + "Value": ["Vrednost"], + "Range filter": ["Filter obdobja"], + "Numerical range": ["Številski obseg"], + "Time filter": ["Časovni filter"], + "Time range": ["Časovno obdobje"], + "Time column": ["Časovni stolpec"], + "Time grain": ["Granulacija časa"], + "Group By": ["Združevanje (Group by)"], + "Group by": ["Združevanje (Group by)"], + "Pre-filter is required": ["Zahtevan je predfilter"], + "Filter name": ["Ime filtra"], + "Name is required": ["Zahtevano je ime"], + "Filter Type": ["Tip filtra"], + "Datasets do not contain a temporal column": [ + "Podatkovni seti ne vsebujejo časovnega stolpca" ], - "Value bounds": ["Meje vrednosti"], - "Hard value bounds applied for color coding. Is only relevant and applied when the normalization is applied against the whole heatmap.": [ - "Mejne vrednosti za barvno lestvico. Upošteva se le, če je normiranje uporabljeno glede na celotni toplotni prikaz." + "Dataset is required": ["Zahtevan je podatkovni set"], + "Pre-filter available values": ["Predfiltriraj razpoložljive vrednosti"], + "Pre-filter": ["Predfilter"], + "Optional time column if time range should apply to another column than the default time column": [ + "Izbirni časovni stolpec se mora nanašati na drug stolpec kot privzeti časovni stolpec" ], - "Sort X Axis": ["Razvrsti X-os"], - "Sort Y Axis": ["Razvrsti Y-os"], - "Show percentage": ["Prikaži procente"], - "Whether to include the percentage in the tooltip": [ - "Če želite prikaz procentov v opisu orodja" + "Sort filter values": ["Razvrsti vrednosti filtra"], + "Sort type": ["Način razvrščanja"], + "Sort ascending": ["Razvrsti naraščajoče"], + "Sort Metric": ["Mera za razvrščanje"], + "If a metric is specified, sorting will be done based on the metric value": [ + "Če je določena mera, bo razvrščanje izvedeno na podlagi vrednosti mere" ], - "Normalized": ["Normiran"], - "Whether to apply a normal distribution based on rank on the color scale": [ - "Če želite uporabiti normalno porazdelitev glede na stopnjo na barvni lestvici" + "Sort metric": ["Mera za razvrščanje"], + "Single Value": ["Ena vrednost"], + "Single value type": ["Tip z eno vrednostjo"], + "Minimum": ["Minimum"], + "Exact": ["Natančno"], + "Maximum": ["Maksimum"], + "Filter has default value": ["Filter ima privzeto vrednost"], + "Default Value": ["Privzeta vrednost"], + "Default value is required": ["Zahtevana je privzeta vrednost"], + "Refresh the default values": ["Osveži privzete vrednosti"], + "Fill all required fields to enable \"Default Value\"": [ + "Izpolnite vsa polja, da omogočite \"Privzeto vrednost\"" ], - "Value Format": ["Oblika zapisa vrednosti"], - "Visualize a related metric across pairs of groups. Heatmaps excel at showcasing the correlation or strength between two groups. Color is used to emphasize the strength of the link between each pair of groups.": [ - "Vizualizacija povezanih mer med pari skupin." + "You have removed this filter.": ["Odstranili ste ta filter."], + "Restore Filter": ["Povrni filter"], + "Column is required": ["Zahtevan je stolpec"], + "Populate \"Default value\" to enable this control": [ + "Izpolnite \"Privzeto vrednost\", da omogočite ta kontrolnik" ], - "Sizes of vehicles": ["Velikosti vozil"], - "Employment and education": ["Zaposlitev in izobrazba"], - "Density": ["Gostota"], - "Predictive": ["Prediktivno"], - "Single Metric": ["Ena mera"], - "count": ["število"], - "cumulative": ["kumulativno"], - "percentile (exclusive)": ["percentil (ekskluzivno)"], - "Select the numeric columns to draw the histogram": [ - "Izberite numerične stolpce za izris histograma" + "Default value set automatically when \"Select first filter value by default\" is checked": [ + "Privzeta vrednost je samodejno izbrana, če je izbrano \"Prvi element je izbran kot privzet\"" ], - "No of Bins": ["Št. razdelkov"], - "Select the number of bins for the histogram": [ - "Izberite število razdelkov za histogram" + "Default value must be set when \"Filter value is required\" is checked": [ + "Privzeta vrednost mora biti določena, če je izbrano \"Vrednost filtra obvezna\"" ], - "X Axis Label": ["Naslov X osi"], - "Y Axis Label": ["Naslov Y osi"], - "Whether to normalize the histogram": ["Če želite normirati histogram"], - "Cumulative": ["Kumulativno"], - "Whether to make the histogram cumulative": [ - "Če želite kumulativni histogram" + "Default value must be set when \"Filter has default value\" is checked": [ + "Privzeta vrednost mora biti določena, če je izbrano \"Filter ima privzeto vrednost\"" ], - "Distribution": ["Porazdelitev"], - "Take your data points, and group them into \"bins\" to see where the densest areas of information lie": [ - "Vzame podatkovne točke in jih razporedi v razdelke, kjer se vidi območja z največjo gostoto informacij" + "Apply to all panels": ["Uporabi za vse panele"], + "Apply to specific panels": ["Uporabi za določene panele"], + "Only selected panels will be affected by this filter": [ + "Ta filter bo vplival le na izbrane panele" ], - "Population age data": ["Podatki starosti populacije"], - "Sort Descending": ["Razvrsti padajoče"], - "Series Height": ["Višina serije"], - "Pixel height of each series": ["Višina vsake serije v pikslih"], - "Value Domain": ["Domena vrednosti"], - "series: Treat each series independently; overall: All series use the same scale; change: Show changes compared to the first data point in each series": [ - "serije: Obravnavaj vsako podatkovno serijo neodvisno; skupno: Vse vrste uporabljajo enako skalo; razlika: Pokaži razlike glede na prvo točko vsake serije" + "All panels with this column will be affected by this filter": [ + "Ta filter bo vplival na vse panele s tem stolpcem" ], - "Compares how a metric changes over time between different groups. Each group is mapped to a row and change over time is visualized bar lengths and color.": [ - "Primerja kako se mera spreminja s časom med različnimi skupinami. Vsaka skupina predstavlja eno vrstico, časovne spremembe pa so prikazane z dolžino stolpcev in barvami." + "All panels": ["Vsi paneli"], + "This chart might be incompatible with the filter (datasets don't match)": [ + "Ta grafikon je lahko nekompatibilen s filtrom (podatkovni seti se ne ujemajo)" ], - "Horizon Chart": ["Horizontni grafikon"], - "Longitude": ["Dolžina"], - "Column containing longitude data": [ - "Stolpec s podatki zemljepisne dolžine" + "Keep editing": ["Nadaljuj z urejanjem"], + "Yes, cancel": ["Da, prekini"], + "There are unsaved changes.": ["Imate neshranjene spremembe."], + "Are you sure you want to cancel?": ["Ali želite prekiniti?"], + "Error loading chart datasources. Filters may not work correctly.": [ + "Napaka pri nalaganju podatkovnih virov grafikona. Filtri lahko ne delujejo pravilno." ], - "Latitude": ["Širina"], - "Column containing latitude data": [ - "Stolpec s podatki zemljepisne širine" + "Transparent": ["Prozorno"], + "White": ["Belo"], + "All filters": ["Vsi filtri"], + "Medium": ["Srednje"], + "Tab title": ["Naslov zavihka"], + "This session has encountered an interruption, and some controls may not work as intended. If you are the developer of this app, please check that the guest token is being generated correctly.": [ + "Ta seja je bila prekinjena in nekateri kontrolniki mogoče ne delujejo kot bi morali. Če ste razvijalec te aplikacije, preverite, da je žeton za gosta pravilno generiran." ], - "Clustering Radius": ["Radij gručenja"], - "The radius (in pixels) the algorithm uses to define a cluster. Choose 0 to turn off clustering, but beware that a large number of points (>1000) will cause lag.": [ - "Radij (v pikslih), s katerim algoritem definira gručo. Izberite 0 za izklop gručenja - veliko število točk (>1000) bo povzročilo upočasnitev." + "Time granularity": ["Granulacija časa"], + "Visualization type": ["Tip vizualizacije"], + "Fixed color": ["Izbrana barva"], + "Right axis metric": ["Mera desne osi"], + "Linear color scheme": ["Linearna barvna shema"], + "Color metric": ["P"], + "One or many controls to pivot as columns": [ + "En ali več kontrolnikov za stolpčno vrtenje" ], - "Points": ["Točke"], - "Point Radius": ["Radij točk"], - "The radius of individual points (ones that are not in a cluster). Either a numerical column or `Auto`, which scales the point based on the largest cluster": [ - "Radij posameznih točk (tistih, ki niso v gruči). Numerični stolpec ali `Auto` (skalira točke na osnovi največje gruče)" + "Bubble size": ["Velikost mehurčka"], + "When `Calculation type` is set to \"Percentage change\", the Y Axis Format is forced to `.1%`": [ + "Če je `Vrsta izračuna` nastavljena na \"Procentualna sprememba\", bo oblika Y-osi vsiljena na `.1%`" ], - "Point Radius Unit": ["Enota radija točk"], - "The unit of measure for the specified point radius": [ - "Enota merila za definiran radij točk" + "Color scheme": ["Barvna shema"], + "An error occurred while starring this chart": [ + "Pri ocenjevanju grafikona je prišlo do napake" ], - "Labelling": ["Oznake"], - "label": ["oznaka"], - "`count` is COUNT(*) if a group by is used. Numerical columns will be aggregated with the aggregator. Non-numerical columns will be used to label points. Leave empty to get a count of points in each cluster.": [ - "`število` je COUNT(*), če je uporabljeno združevanje (group by). Numerični stolpci bodo agregirani z agregatorjem. Ne-numerični stolpci, bodo uporabljeni za oznake točk. Pustite prazno, da dobite število točk v posamezni gruči." + "GROUP BY": ["GROUP BY"], + "Use this section if you want a query that aggregates": [ + "Ta sklop uporabite če želite poizvedbo za agregacijo" ], - "Cluster label aggregator": ["Agregator za oznako gruče"], - "Aggregate function applied to the list of points in each cluster to produce the cluster label.": [ - "Agregacijska funkcija za seznam točk v vsaki gruči, s katero se ustvari oznaka gruče." + "NOT GROUPED BY": ["NOT GROUPED BY"], + "Use this section if you want to query atomic rows": [ + "Ta sklop uporabite, če želite poizvedbo za posamezne vrstice" ], - "Visual Tweaks": ["Nastavitve izgleda"], - "Live render": ["Sprotni izris"], - "Points and clusters will update as the viewport is being changed": [ - "Točke in gruče se bodo posodabljale, če se bo spremenil pogled" + "Keep control settings?": ["Obdržim nastavitve kontrolnika?"], + "You've changed datasets. Any controls with data (columns, metrics) that match this new dataset have been retained.": [ + "Spremenili ste podatkovne sete. Vsi kontrolniki nad podatki (stolpci, mere), ki se ujemajo z novim podatkovnim setom, se bodo ohranili." ], - "Map Style": ["Slog zemljevida"], - "Base layer map style": ["Slog osnovnega sloja zemljevida"], - "Opacity of all clusters, points, and labels. Between 0 and 1.": [ - "Prosojnost vseh gruč, točk in oznak (vrednost med 0 in 1)." + "Continue": ["Nadaljuj"], + "Clear form": ["Počisti polja"], + "No form settings were maintained": ["Nastavitve forme se niso ohranile"], + "We were unable to carry over any controls when switching to this new dataset.": [ + "Prenos kontrolnikov pri preklopu na nov podatkovni set ni bil uspešen." ], - "RGB Color": ["RGB barva"], - "The color for points and clusters in RGB": [ - "Barva točk in gruč v RGB zapisu" + "Customize": ["Prilagodi"], + "Error": ["Napaka"], + "Generating link, please wait..": [ + "Ustvarjam povezavo, prosim počakajte..." ], - "Viewport": ["Pogled"], - "Default longitude": ["Privzeta dolžina"], - "Longitude of default viewport": ["Dolžina privzetega pogleda"], - "Default latitude": ["Privzeta širina"], - "Latitude of default viewport": ["Širina privzetega pogleda"], - "Zoom": ["Povečava"], - "Zoom level of the map": ["Stopnja povečave zemljevida"], - "One or many controls to group by. If grouping, latitude and longitude columns must be present.": [ - "Eden ali več kontrolnikov za združevanje. Pri združevanju morata biti prisotna stolpca širine in dolžine." + "Chart height": ["Višina grafikona"], + "Chart width": ["Širina grafikona"], + "Required control values have been removed": [ + "Zahtevane kontrolne vrednosti so bile odstranjene" + ], + "Your chart is not up to date": ["Grafikon ni aktualen"], + "You updated the values in the control panel, but the chart was not updated automatically. Run the query by clicking on the \"Update chart\" button or": [ + "Posodobili ste vrednosti v kontrolni plošči, vendar se grafikon ni samodejno posodobil. Zaženite poizvedbo z gumbom \"Posodobi grafikon\" ali" + ], + "**Select** a dashboard OR **create** a new one": [ + "**Izberite** nadzorno ploščo ALI **ustvarite** novo" + ], + "Please enter a chart name": ["Vnesite ime grafikona"], + "Save chart": ["Shrani grafikon"], + "Save & go to new dashboard": ["Shrani in pojdi na novo nadzorno ploščo"], + "Save & go to dashboard": ["Shrani in pojdi na nadzorno ploščo"], + "Save as new chart": ["Shrani kot nov grafikon"], + "Save to new dashboard": ["Shrani v novo nadzorno ploščo"], + "Save (Overwrite)": ["Shrani (prepiši)"], + "Save as...": ["Shrani kot ..."], + "Chart name": ["Ime grafikona"], + "Add to dashboard": ["Dodaj na nadzorno ploščo"], + "Select a dashboard": ["Izberite nadzorno ploščo"], + "Copy": ["Kopiraj"], + "Formatted date": ["Oblikovan datum"], + "Column Formatting": ["Oblikovanje stolpca"], + "N/A": ["N/A"], + "Collapse data panel": ["Skrij podatkovni panel"], + "Expand data panel": ["Razširi podatkovni panel"], + "Results %s": ["Rezultati %s"], + "Samples": ["Vzorci"], + "No samples were returned for this dataset": [ + "Za podatkovni set ni vrnjenih vzorcev" + ], + "No results": ["Ni rezultatov"], + "Search Metrics & Columns": ["Iskanje mer in stolpcev"], + "Create a dataset": ["Ustvarite podatkovni set"], + " to edit or add columns and metrics.": [ + " za urejanje ali dodajanje stolpcev in mer." ], - "Light mode": ["Svetli način"], - "Dark mode": ["Temni način"], - "MapBox": ["MapBox"], - "Scatter": ["Raztreseni"], - "Transformable": ["Prilagodljiv"], - "Significance Level": ["Stopnja značilnosti"], - "Threshold alpha level for determining significance": [ - "Mejna vrednost alfa za določanje značilnosti" + "Showing %s of %s": ["Prikazanih %s od %s"], + "Show less...": ["Prikaži manj..."], + "Show all...": ["Prikaži vse..."], + "Show Less...": ["Prikaži manj..."], + "Add the name of the chart": ["Dodajte naslov grafikona"], + "Chart title": ["Naslov grafikona"], + "Add required control values to save chart": [ + "Dodaj potrebne parametre za shranjenje grafikona" ], - "p-value precision": ["točnost p-vrednosti"], - "Number of decimal places with which to display p-values": [ - "Število decimalnih mest za prikaz p-vrednosti" + "Controls labeled ": ["Kontrolniki imenovani "], + "Control labeled ": ["Nastavitev "], + "Open Datasource tab": ["Odpri zavihek s podatkovnim virom"], + "Original": ["Izvoren"], + "Pivoted": ["Vrtilni"], + "You do not have permission to edit this chart": [ + "Nimate dovoljenja za urejanje tega grafikona" ], - "Lift percent precision": ["Točnost procentualnega dviga"], - "Number of decimal places with which to display lift values": [ - "Število decimalnih mest za prikaz vrednosti dviga" + "Chart properties updated": ["Lastnosti grafikona posodobljene"], + "This chart is managed externally, and can't be edited in Superset": [ + "Ta grafikon se ne ureja znotraj Superseta" ], - "Table that visualizes paired t-tests, which are used to understand statistical differences between groups.": [ - "Tabela, ki prikazuje uparjene t-teste, ki se uporabljajo za prikaz statističnih razlik med skupinami." + "The description can be displayed as widget headers in the dashboard view. Supports markdown.": [ + "Opis je lahko prikazan kot glava gradnika in pogledu nadzorne plošče. Podpira markdown." ], - "Paired t-test Table": ["Tabela t-testa za odvisne vzorce"], - "Statistical": ["Statistično"], - "Options": ["Možnosti"], - "Data Table": ["Tabela podatkov"], - "Whether to display the interactive data table": [ - "Če želite prikaz interaktivne podatkovne tabele" + "Person or group that has certified this chart.": [ + "Oseba ali skupina, ki je certificirala ta grafikon." ], - "Include Series": ["Vključi serijo"], - "Include series name as an axis": [ - "Vključi ime podatkovne serije v naslov osi" + "Configuration": ["Nastavitve"], + "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the dataset's timeout if undefined.": [ + "Časovna veljavnost (v sekundah) predpomnjenja za ta grafikon. Če ni definirana, je uporabljena vrednost za podatkovni set." ], - "Ranking": ["Rangiranje"], - "Plots the individual metrics for each row in the data vertically and links them together as a line. This chart is useful for comparing multiple metrics across all of the samples or rows in the data.": [ - "Izriše posamezne mere za vsako vrstico podatkov navpično in jih med seboj poveže kot črto. Grafikon je uporaben za primerjavo več mer med vsemi vzorci ali vrsticami podatkov." + "A list of users who can alter the chart. Searchable by name or username.": [ + "Seznam uporabnikov, ki lahko spreminjajo ta grafikon. Možno je iskanje po imenu ali uporabniškem imenu." ], - "Coordinates": ["Koordinate"], - "Directional": ["Usmerjeni"], - "Time Series Options": ["Možnosti časovne vrste"], - "Not Time Series": ["Ni časovna vrsta"], - "Ignore time": ["Ne upoštevaj časa"], - "Time Series": ["Časovna vrsta"], - "Standard time series": ["Standardna časovna vrsta"], - "Aggregate Mean": ["Agregirano povprečje"], - "Mean of values over specified period": [ - "Povprečna vrednost v dani periodi" + "%s row": ["%s vrstica"], + "Limit reached": ["Omejitev dosežena"], + "Create chart": ["Ustvari grafikon"], + "Update chart": ["Posodobi grafikon"], + "Invalid lat/long configuration.": [ + "Neveljavna nastavitev zemljepisne dolžine/širine." ], - "Aggregate Sum": ["Agregirana vsota"], - "Sum of values over specified period": ["Vsota vrednosti v dani periodi"], - "Difference": ["Razlika"], - "Metric change in value from `since` to `until`": [ - "Sprememba mere od vrednosti \"OD\" do \"DO\"" + "Reverse lat/long ": ["Zamenjaj zemljepisno dolžino/širino "], + "Longitude & Latitude columns": ["Stolpci zemljepisne dolžine in širine"], + "Delimited long & lat single column": [ + "En stolpec z ločenima zemljepisno dolžino in širino" ], - "Percent Change": ["Procentualna sprememba"], - "Metric percent change in value from `since` to `until`": [ - "Procentualna sprememba mere od vrednosti \"OD\" do \"DO\"" + "Multiple formats accepted, look the geopy.points Python library for more details": [ + "Sprejema različne zapise - podrobnosti najdete v Pythonovi knjižnici geopy.points" ], - "Factor": ["Faktor"], - "Metric factor change from `since` to `until`": [ - "Sprememba faktorja mere od vrednosti \"OD\" do \"DO\"" + "Geohash": ["Geohash"], + "textarea": ["področje besedila"], + "in modal": ["v modalnem oknu"], + "Sorry, An error occurred": ["Prišlo je do napake"], + "Failed to verify select options: %s": [ + "Preverjanje možnosti izbire ni uspelo: %s" ], - "Advanced Analytics": ["Napredna analitika"], - "Use the Advanced Analytics options below": [ - "Uporabite spodnje možnosti napredne analitike" + "No annotation layers": ["Ni slojev z oznakami"], + "Add an annotation layer": ["Dodaj sloj z oznakami"], + "Use another existing chart as a source for annotations and overlays.\n Your chart must be one of these visualization types: [%s]": [ + "Uporabite enega izmed obstoječih grafikonov kot vir oznak.\n Grafikon mora biti naslednjega tipa: [%s]" ], - "Settings for time series": ["Nastavitve časovne vrste"], - "Date Time Format": ["Oblika zapisa Datum-Časa"], - "Partition Limit": ["Omejitev particij"], - "The maximum number of subdivisions of each group; lower values are pruned first": [ - "Največje število podrazdelkov posamezne skupine; nižje vrednosti so zanemarjene prve" + "Annotation layer value": ["Vrednost sloja z oznakami"], + "Annotation Slice Configuration": ["Nastavitve rezine z oznakami"], + "This section allows you to configure how to use the slice\n to generate annotations.": [ + "V tem sklopu lahko nastavite način uporabe rezine\n za ustvarjanje oznak." ], - "Partition Threshold": ["Prag particije"], - "Partitions whose height to parent height proportions are below this value are pruned": [ - "Particije z nižjim razmerjem med njihovo višino in dolžino starša so zanemarjene" + "Annotation layer time column": ["Časovni stolpec sloja z oznakami"], + "Interval start column": ["Stolpec začetka intervala"], + "Event time column": ["Stolpec časa dogodka"], + "This column must contain date/time information.": [ + "Ta stolpec mora vsebovati informacijo o datumu/času." ], - "Log Scale": ["Logaritemska skala"], - "Use a log scale": ["Uporabi logaritemsko skalo"], - "Equal Date Sizes": ["Enaki datumi"], - "Check to force date partitions to have the same height": [ - "Če želite, da imajo datumske particije enako višino" + "Annotation layer interval end": ["Konec intervala sloja z oznakami"], + "Interval End column": ["Stolpec konca intervala"], + "Annotation layer title column": ["Stolpec z naslovom sloja z oznakami"], + "Title Column": ["Stolpec z naslovi"], + "Pick a title for you annotation.": ["Izberite naslov za oznako."], + "Annotation layer description columns": [ + "Stolpci z opisi slojev z oznakami" ], - "Rich Tooltip": ["Podroben opis orodja"], - "The rich tooltip shows a list of all series for that point in time": [ - "Podroben opis orodja prikaže seznam vseh podatkovnih serij za posamezno časovno točko" + "Description Columns": ["Stolpci z opisi"], + "Pick one or more columns that should be shown in the annotation. If you don't select a column all of them will be shown.": [ + "Izberite enega ali več stolpcev, ki bodo prikazani v oznakah. Če ne izberete stolpca, bodo prikazani vsi." ], - "Rolling Window": ["Drseče okno"], - "Rolling Function": ["Drseča funkcija"], - "Min Periods": ["Min. št. period"], - "Time Comparison": ["Časovna primerjava"], - "Time Shift": ["Časovni zamik"], - "Python Functions": ["Pythonove funkcije"], - "Part of a Whole": ["Del celote"], - "Compare the same summarized metric across multiple groups.": [ - "Primerja isto mero med različnimi skupinami." + "Display configuration": ["Prikaži nastavitve"], + "Configure your how you overlay is displayed here.": [ + "Nastavite kako se tukaj prikazuje vrhnja plast." ], - "Partition Chart": ["Grafikon razdelkov"], - "Categorical": ["Kategorični"], - "Pivot Options": ["Vrtilne možnosti"], - "Aggregation function": ["Agregacijska funkcija"], - "Aggregate function to apply when pivoting and computing the total rows and columns": [ - "Agregacijska funkcija za vrtenje in izračun vseh vrstic in stolpcev" + "Annotation layer stroke": ["Obroba sloja z oznakami"], + "Style": ["Slog"], + "Annotation layer opacity": ["Prosojnost sloja z oznakami"], + "Color": ["Barva"], + "Layer configuration": ["Nastavitve sloja"], + "Configure the basics of your Annotation Layer.": [ + "Osnovne nastavitve sloja z oznakami." ], - "Show totals": ["Pokaži vsote"], - "Display total row/column": ["Pokaži vsote vrstic/stolpcev"], - "Combine Metrics": ["Združuj mere"], - "Display metrics side by side within each column, as opposed to each column being displayed side by side for each metric.": [ - "Prikazuj mere eno ob drugi ob vsakem stolpcu, drugače je vsak stolpec prikazan en ob drugem za vsako mero." + "Mandatory": ["Obvezno"], + "Hide layer": ["Skrij sloj"], + "Show label": ["Pokaži oznako"], + "Whether to always show the annotation label": [ + "Če želite vedno prikazati naslov oznake" ], - "Transpose Pivot": ["Transponirano vrtenje"], - "Swap Groups and Columns": ["Zamenjaj Skupine in Stolpce"], - "Date format": ["Oblika zapisa datuma"], - "Used to summarize a set of data by grouping together multiple statistics along two axes. Examples: Sales numbers by region and month, tasks by status and assignee, active users by age and location.\r\n\r\n This chart is being deprecated and we recommend checking out Pivot Table V2 instead!": [ - "Uporablja se za predstavitev podatkov z združevanjem različnih statistik na dveh oseh. Npr. Prodaja po regijah in mesecih, Naloge po statusih in izvajalcih, aktivni uporabniki po starosti in lokaciji.\r\n\r\n Ta grafikon se opušča. Priporočamo uporabo Vrtilne tabele V2!" + "Annotation layer type": ["Tip sloja z oznakami"], + "Choose the annotation layer type": ["Izberite tip sloja z oznakami"], + "Annotation source type": ["Tip vira oznak"], + "Choose the source of your annotations": ["Izberite vir svojih oznak"], + "Annotation source": ["Vir oznak"], + "Remove": ["Odstrani"], + "Edit annotation layer": ["Uredi sloj z oznakami"], + "Add annotation layer": ["Dodaj sloj z oznakami"], + "Empty collection": ["Prazen izbor"], + "Add an item": ["Dodaj element"], + "Remove item": ["Odstrani element"], + "The color scheme is determined by the related dashboard.\n Edit the color scheme in the dashboard properties.": [ + "Barvna shema je določena s povezano nadzorno ploščo.\n Barvno shemo uredite v nastavitvah nadzorne plošče." ], - "Use Area Proportions": ["Uporabi razmerje površin"], - "Check if the Rose Chart should use segment area instead of segment radius for proportioning": [ - "Če želite, da grafikon \"Rose\" uporablja površino segmenta namesto radija za proporcioniranje" + "This color scheme is being overriden by custom label colors.\n Check the JSON metadata in the Advanced settings": [ + "Barvna shema je bila preglasovana z barvo oznake po meri.\n Preverite JSON metapodatke v naprednih nastavitvah" ], - "A polar coordinate chart where the circle is broken into wedges of equal angle, and the value represented by any wedge is illustrated by its area, rather than its radius or sweep angle.": [ - "Grafikon s polarnimi koordinatami, kjer je krog razdeljen na enakokotne izseke, vrednosti pa so ponazorjene s ploščino izseka (namesto polmera ali kota)." + "Dashboard scheme": ["Shema nadzorne plošče"], + "Select color scheme": ["Izberite barvno shemo"], + "Select scheme": ["Izberite shemo"], + "Edit formatter": ["Uredi oblikovanje"], + "Add new formatter": ["Dodaj novo oblikovanje"], + "Add new color formatter": ["Dodaj novo oblikovanje barve"], + "green": ["zelena"], + "yellow": ["rumena"], + "red": ["rdeča"], + "This value should be smaller than the right target value": [ + "Ta vrednost mora biti manjša od desne ciljne vrednosti" ], - "Nightingale Rose Chart": ["Nightingale Rose grafikon"], - "Multi-Layers": ["Večplastni"], - "Limiting rows may result in incomplete data and misleading charts. Consider filtering or grouping source/target names instead.": [ - "Omejitev vrstic lahko povzroči nepopolne podatke in zavajajoč grafikon. Premislite o uporabi filtriranja ali združevanja imen izvorov/ciljev." + "This value should be greater than the left target value": [ + "Ta vrednost mora biti večja od leve ciljne vrednosti" ], - "Visualizes the flow of different group's values through different stages of a system. New stages in the pipeline are visualized as nodes or layers. The thickness of the bars or edges represent the metric being visualized.": [ - "Prikaže potek vrednosti različnih skupin na različnih nivojih sistema. Novi nivoji so prikazani kot točke ali plasti. Debelina stolpcev ali povezav predstavlja prikazano mero." + "Required": ["Obvezno"], + "Operator": ["Operator"], + "Left value": ["Leva vrednost"], + "Right value": ["Desna vrednost"], + "Target value": ["Ciljna vrednost"], + "Select column": ["Izberite stolpec"], + "Edit dataset": ["Uredi podatkovni set"], + "You must be a dataset owner in order to edit. Please reach out to a dataset owner to request modifications or edit access.": [ + "Za urejanje morate biti lastnik podatkovnega seta. Za dostop do urejanja kontaktirajte lastnika podatkovnega seta." ], - "Demographics": ["Demografija"], - "Survey Responses": ["Rezultati anket"], - "Sankey Diagram": ["Sankey grafikon"], - "Sankey Diagram with Loops": ["Sankey grafikon z zankami"], - "Primary Metric": ["Primarna mera"], - "The primary metric is used to define the arc segment sizes": [ - "Primarna mera določa velikost lokov segmentov" + "View in SQL Lab": ["Ogled v SQL laboratoriju"], + "Query preview": ["Predogled poizvedbe"], + "Save as dataset": ["Shrani kot podatkovni set"], + "More dataset related options": ["Več nastavitev za podatkovni set"], + "Missing URL parameters": ["Manjkajo parametri URL-ja"], + "The URL is missing the dataset_id or slice_id parameters.": [ + "V URL-ju manjkata parametra dataset_id ali slice_id." ], - "Secondary Metric": ["Sekundarna mera"], - "[optional] this secondary metric is used to define the color as a ratio against the primary metric. When omitted, the color is categorical and based on labels": [ - "[opcijsko] sekundarna mera določa barvo kot razmerje do primarne mere. Če je izpuščena, je barva določena kategorično na podlagi oznak" + "The dataset linked to this chart may have been deleted.": [ + "Podatkovni set, povezan s tem grafikonom, je bil izbrisan." ], - "When only a primary metric is provided, a categorical color scale is used.": [ - "Če je podana samo primarna metrika, je uporabljena kategorična barvna skala." + "RANGE TYPE": ["TIP OBDOBJA"], + "Actual time range": ["Dejansko časovno obdobje"], + "CANCEL": ["PREKINI"], + "APPLY": ["UPORABI"], + "Edit time range": ["Uredi časovno obdobje"], + "Configure Advanced Time Range ": ["Nastavi napredno časovno obdobje "], + "START (INCLUSIVE)": ["ZAČETEK (VKLJUČEN)"], + "Start date included in time range": [ + "Začetni datum je vključen v časovno obdobje" ], - "When a secondary metric is provided, a linear color scale is used.": [ - "Če je podana sekundarna metrika, je uporabljena linearna barvna skala." + "END (EXCLUSIVE)": ["KONEC (NI VKLJUČEN)"], + "End date excluded from time range": [ + "Končni datum ni vključen v časovno obdobje" ], - "Hierarchy": ["Hierarhija"], - "This defines the level of the hierarchy": ["Določa stopnjo hierarhije"], - "Uses circles to visualize the flow of data through different stages of a system. Hover over individual paths in the visualization to understand the stages a value took. Useful for multi-stage, multi-group visualizing funnels and pipelines.": [ - "S pomočjo krogov prikaže potek podatkov na različnih nivojih sistema. S premikom kurzorja prikaže vrednosti na posameznem nivoju. Uporabno za večnivojsko, večskupinsko vizualizacijo." + "Configure Time Range: Previous...": [ + "Nastavi časovno obdobje: Prejšnji ..." ], - "Sunburst Chart": ["Večnivojski tortni grafikon"], - "Multi-Levels": ["Večplastni"], - "Time Series Columns": ["Stolpci s časovnimi vrstami"], - "Compare multiple time series charts (as sparklines) and related metrics quickly. ": [ - "Hitra primerjava več grafikonov časovnih vrst (sparkline način) in povezanih mer. " + "Configure Time Range: Last...": ["Nastavi časovno obdobje: Zadnji ..."], + "Configure custom time range": ["Nastavi prilagojeno časovno obdobje"], + "Relative quantity": ["Relativne vrednosti"], + "Relative period": ["Relativno obdobje"], + "Anchor to": ["Sidraj na"], + "NOW": ["ZDAJ"], + "Date/Time": ["Datum/Čas"], + "Return to specific datetime.": ["Vrne določen datum-čas."], + "Syntax": ["Sintaksa"], + "Example": ["Primer"], + "Moves the given set of dates by a specified interval.": [ + "Premakne dani nabor datumov za definirano obdobje." ], - "Ratio": ["Razmerje"], - "Target aspect ratio for treemap tiles.": [ - "Ciljno razmerje za razdelke drevesnega grafikona." + "Truncates the specified date to the accuracy specified by the date unit.": [ + "Zaokroži določen datum, glede na natančnost, definirano s časovno enoto." + ], + "Get the last date by the date unit.": [ + "Pridobi zadnji datum glede na časovno enoto." + ], + "Get the specify date for the holiday": ["Določi datum praznika"], + "Last": ["Zadnji"], + "Previous": ["Prejšnji"], + "Custom": ["Prilagojen"], + "last day": ["zadnji dan"], + "last week": ["zadnji teden"], + "last month": ["zadnji mesec"], + "last quarter": ["zadnje četrletje"], + "last year": ["zadnje leto"], + "previous calendar week": ["prejšnji koledarski teden"], + "previous calendar month": ["prejšnji koledarski mesec"], + "previous calendar year": ["prejšnje koledarsko leto"], + "Seconds %s": ["Sekunde %s"], + "Minutes %s": ["Minute %s"], + "Hours %s": ["Ure %s"], + "Days %s": ["Dnevi %s"], + "Weeks %s": ["Tedni %s"], + "Months %s": ["Meseci %s"], + "Quarters %s": ["Četrtletja %s"], + "Years %s": ["Leta %s"], + "Before": ["PRED"], + "After": ["PO"], + "Specific Date/Time": ["Fiksen Datum/Čas"], + "Relative Date/Time": ["Relativen Datum/Čas"], + "Now": ["Zdaj"], + "Midnight": ["Polnoč"], + "Saved expressions": ["Shranjeni izrazi"], + "Saved": ["Shranjeno"], + "%s column(s)": ["Stolpci: %s"], + "No temporal columns found": ["Ni najdenih časovnih stolpcev"], + "No saved expressions found": ["Shranjeni izrazi niso najdeni"], + "Add calculated temporal columns to dataset in \"Edit datasource\" modal": [ + "Dodaj izračunan časovni stolpec v podatkovni set v oknu \"Uredi podatkovni vir\"" ], - "Shows the composition of a dataset by segmenting a given rectangle as smaller rectangles with areas proportional to their value or contribution to the whole. Those rectangles may also, in turn, be further segmented hierarchically.": [ - "Prikaže zgradbo podatkovnega seta na podlagi segmentacije danega pravokotnika na manjše pravokotnike, pri čemer je ploščina sorazmerna vrednostim oz. deležem. Pravokotniki se lahko dodatno hierarhično segmentirajo." + "Add calculated columns to dataset in \"Edit datasource\" modal": [ + "Dodaj izračunan stolpec v podatkovni set v oknu \"Uredi podatkovni vir\"" ], - "Country Field Type": ["Tip polja za države"], - "The country code standard that Superset should expect to find in the [country] column": [ - "Standard za oznake držav, ki bodo podane v stolpcu z državami" + "Simple": ["Preprosto"], + "Mark a column as temporal in \"Edit datasource\" modal": [ + "Označite stolpec kot časoven preko okna \"Uredi podatkovni vir\"" ], - "Show Bubbles": ["Prikaži mehurčke"], - "Whether to display bubbles on top of countries": [ - "Če želite prikaz mehurčkov nad državami" + "Custom SQL": ["Prilagojen SQL"], + "My column": ["Moj stolpec"], + "Drop a column here or click": ["Spustite stolpec sem ali kliknite"], + "Drop column here": ["Spustite stolpec sem"], + "Click to edit label": ["Kliknite za urejanje oznake"], + "Drop columns/metrics here or click": [ + "Spustite stolpce/mere sem ali kliknite" ], - "Max Bubble Size": ["Max. velikost mehurčka"], - "Country Column": ["Stolpec z državami"], - "3 letter code of the country": ["Tričrkovna oznaka države"], - "Metric for Color": ["Mera za barvo"], - "Metric that defines the color of the country": [ - "Mera, ki določa barvo države" + "Drop columns or metrics here": ["Spustite stolpce ali mere sem"], + "Drop a column/metric here or click": [ + "Spustite stolpec/mero sem ali kliknite" ], - "Metric that defines the size of the bubble": [ - "Mera, ki določa velikost mehurčka" + "Drop column or metric here": ["Spustite stolpec ali mero sem"], + "Drop columns here": ["Spustite stolpce sem"], + "\n This filter was inherited from the dashboard's context.\n It won't be saved when saving the chart.\n ": [ + "\n Ta filter izvira iz konteksta nadzorne plošče.\n Pri shranjevanju grafikona se ne bo shranil.\n " ], - "Bubble Color": ["Barva mehurčka"], - "Country Color Scheme": ["Barvna shema držav"], - "A map of the world, that can indicate values in different countries.": [ - "Zemljevid sveta, ki lahko prikazuje vrednosti po državah." + "Default": ["Privzeto"], + "(optional) default value for the filter, when using the multiple option, you can use a semicolon-delimited list of options.": [ + "(opcijsko) privzeta vrednost za filter, če uporabite opcijo izbire večih , lahko uporabite seznam nastavitev ločen s podpičji." ], - "Multi-Dimensions": ["Večdimenzionalni"], - "Big Number Font Size": ["Velikost pisave Velike številke"], - "Tiny": ["Drobna"], - "Normal": ["Normalna"], - "Huge": ["Ogromna"], - "Subheader Font Size": ["Velikost pisave podnaslova"], - "N/A": ["N/A"], - "Last available value seen on %s": [ - "Zadnja razpoložljiva vrednost na %s" + "Metric to sort the results by": ["Mera za razvrščanje rezultatov"], + "Check for sorting ascending": ["Označi za naraščajoče razvrščanje"], + "Allow multiple selections": ["Dovoli več izbir"], + "Multiple selections allowed, otherwise filter is limited to a single value": [ + "Lahko izberete več elementov, drugače pa je filter omejen na eno vrednost" ], - "Not up to date": ["Ni posodobljeno"], - "No data after filtering or data is NULL for the latest time record": [ - "Ni podatkov po filtriranju ali pa imajo vrednost NULL za zadnji časovni zapis" + "Search all filter options": ["Poišči vse možnosti filtra"], + "By default, each filter loads at most 1000 choices at the initial page load. Check this box if you have more than 1000 filter values and want to enable dynamically searching that loads filter values as users type (may add stress to your database).": [ + "Privzeto vsak filter pri nalaganju začetne strani naloži največ 1000 možnosti. Označite polje, če imate več kot 1000 vrednosti filtra in želite omogočiti dinamično iskanje, ki nalaga vrednosti filtra ko uporabnik tipka (to lahko preobremeni vašo podatkovno bazo)." ], - "Try applying different filters or ensuring your datasource has data": [ - "Poskusite uporabiti druge filtre oz. zagotovite, da so v podatkovnem viru podatki" + "User must select a value for this filter": [ + "Uporabnik mora izbrati vrednost za ta filter" ], - "Comparison Period Lag": ["Zaostanek obdobja za primerjavo"], - "Based on granularity, number of time periods to compare against": [ - "Na osnovi granulacije, število časovnih obdobij za primerjavo" + "Filter configuration": ["Nastavitve filtra"], + "Custom SQL ad-hoc filters are not available for the native Druid connector": [ + "Ad-hoc SQL filtri po meri niso na voljo za nativni konektor za Druid" ], - "Comparison suffix": ["Pripona za primerjavo"], - "Suffix to apply after the percentage display": [ - "Pripona za prikaz procenta" + "%s option(s)": ["Možnosti: %s"], + "Select subject": ["Izberite zadevo"], + "No such column found. To filter on a metric, try the Custom SQL tab.": [ + "Tak stolpec ni najden. Za filtriranje po meri uporabite prilagojen SQL zavihek." ], - "Timestamp format": ["Oblika zapisa časovne značke"], - "Show Timestamp": ["Prikaži časovno značko"], - "Whether to display the timestamp": [ - "Če želite prikazati časovno značko" + "%s column(s) and metric(s)": ["Stolpcev in mer: %s"], + "To filter on a metric, use Custom SQL tab.": [ + "Za filtriranje po meri uporabite prilagojen SQL zavihek." ], - "Show Trend Line": ["Pokaži trendno črto"], - "Whether to display the trend line": ["Če želite prikazati trendno črto"], - "Start y-axis at 0": ["Začni y-os z 0"], - "Start y-axis at zero. Uncheck to start y-axis at minimum value in the data.": [ - "Začni y-os z nič. Ne izberite, če želite, da se y-os začne z najmanjšo vrednostjo podatkov." + "%s operator(s)": ["Operatorji: %s"], + "Select operator": ["Izberite operator"], + "Comparator option": ["Možnosti komparatorja"], + "Type a value here": ["Vnesite vrednost sem"], + "Filter value (case sensitive)": [ + "Vrednost filtra (razlik. velikih/malih črk)" ], - "Fix to selected Time Range": ["Nastavi na izbrano časovno obdobje"], - "Fix the trend line to the full time range specified in case filtered results do not include the start or end dates": [ - "Trendno črto nastavite na izbrano obdobje, v primeru, da filtrirani rezultati ne vsebujejo začetnega in/ali končnega datuma" + "Failed to retrieve advanced type": [ + "Napaka pri pridobivanju naprednega tipa" ], - "KPI": ["KPI"], - "Showcases a single number accompanied by a simple line chart, to call attention to an important metric along with its change over time or other dimension.": [ - "Prikaže eno vrednost skupaj s preprostim črtnim grafikonom, za poudarek pomembne mere skupaj z njeno časovno spremembo." + "choose WHERE or HAVING...": ["izberite WHERE ali HAVING..."], + "Filters by columns": ["Filtrira po stolpcu"], + "Filters by metrics": ["Filtrira po merah"], + "Fixed": ["Fiksno"], + "Based on a metric": ["Osnovan na meri"], + "My metric": ["Moja mera"], + "Add metric": ["Dodaj mero"], + "Select aggregate options": ["Izberite agregacijske možnosti"], + "%s aggregates(s)": ["Agreg. funkcije: %s"], + "Select saved metrics": ["Izberite shranjene mere"], + "%s saved metric(s)": ["Shranjene mere: %s"], + "Saved metric": ["Shranjena mera"], + "No saved metrics found": ["Shranjene mere niso najdene"], + "Add metrics to dataset in \"Edit datasource\" modal": [ + "Dodaj mero v podatkovni set v oknu \"Uredi podatkovni vir\"" ], - "Formattable": ["Prilagodljiv"], - "Line": ["Črta"], - "Subheader": ["Podnaslov"], - "Description text that shows up below your Big Number": [ - "Besedilo, ki se prikaže pod veliko številko" + "Simple ad-hoc metrics are not enabled for this dataset": [ + "Preproste ad-hoc mere za ta podatkovni set niso omogočene" ], - "Timestamp Format": ["Oblika časovne značke"], - "Whether to format the timestamp": [ - "Če želite oblikovati časovno značko" + "column": ["stolpec"], + "aggregate": ["agregacija"], + "Custom SQL ad-hoc metrics are not available for the native Druid connector": [ + "Ad-hoc SQL mere po meri niso na voljo za nativni konektor za Druid" ], - "Showcases a single metric front-and-center. Big number is best used to call attention to a KPI or the one thing you want your audience to focus on.": [ - "Prikaže eno vrednost. Velika številka je primerna za poudarek KPI-ja ali vrednosti, na katero želite usmeriti pozornost." + "Custom SQL ad-hoc metrics are not enabled for this dataset": [ + "Ad-hoc SQL mere po meri za ta podatkovni set niso omogočene" ], - "A Big Number": ["Velika številka"], - "With a subheader": ["S podnaslovom"], - "Additive": ["Aditivno"], - "Right Axis Format": ["Oblika desne osi"], - "Show Markers": ["Prikaži markerje"], - "Show data points as circle markers on the lines": [ - "Pokaži točke kot krožne markerje na krivuljah" + "Error while fetching data: %s": ["Napaka pri pridobivanju podatkov: %s"], + "Time series columns": ["Stolpci s časovnimi vrstami"], + "Select Viz Type": ["Izberite tip vizualizacije"], + "Currently rendered: %s": ["Trenutno izrisano: %s"], + "Other": ["Ostali"], + "Recommended tags": ["Priporočene značke"], + "Category": ["Kategorija"], + "Tags": ["Značke"], + "Search all charts": ["Išči vse grafikone"], + "No description available.": ["Opisa ni na razpolago."], + "Examples": ["Vzorci"], + "This visualization type is not supported.": [ + "Ta tip vizualizacije ni podprt." ], - "Y bounds": ["Y meje"], - "Whether to display the min and max values of the Y-axis": [ - "Če želite prikaz min. in max. vrednosti Y-osi" + "View all charts": ["Pokaži vse grafikone"], + "Select a visualization type": ["Izberite tip vizualizacije"], + "Select": ["Izberi"], + "Superset Chart": ["Superset grafikon"], + "New chart": ["Nov grafikon"], + "Edit chart properties": ["Uredi lastnosti grafikona"], + "Export to original .CSV": ["Izvozi v izvorni .CSV"], + "Export to pivoted .CSV": ["Izvozi v vrtilni .CSV"], + "Export to .JSON": ["Izvozi v .JSON"], + "Embed code": ["Vgradi kodo"], + "Run in SQL Lab": ["Zaženi v SQL laboratoriju"], + "Code": ["Koda"], + "Markup type": ["Tip označevanja"], + "Pick your favorite markup language": [ + "Izberite svoj priljubljen označevalni jezik" ], - "Y 2 bounds": ["Meje Y 2"], - "Line Style": ["Slog črte"], - "Line interpolation as defined by d3.js": [ - "Interpolacija krivulje na osnovi d3.js" + "Put your code here": ["Vstavite svojo kodo sem"], + "URL parameters": ["Parametri URL"], + "Extra parameters for use in jinja templated queries": [ + "Dodatni parametri za poizvedbe z jinja predlogami" ], - "Show Range Filter": ["Pokaži filter obdobja"], - "Whether to display the time range interactive selector": [ - "Če želite prikaz interaktivnega izbirnika časovnega obdobja" + "Annotations and layers": ["Oznake in sloji"], + "My beautiful colors": ["Moje čudovite barve"], + "No columns": ["Brez stolpcev"], + "%s option": ["%s možnost"], + "UI Configuration": ["UI nastavitve"], + "Can select multiple values": ["Dovoli izbiro več vrednosti"], + "Filter value is required": ["Vrednost filtra je obvezna"], + "User must select a value before applying the filter": [ + "Uporabnik mora izbrati vrednost pred uporabo filtra" ], - "Extra Controls": ["Dodatni kontrolniki"], - "Whether to show extra controls or not. Extra controls include things like making mulitBar charts stacked or side by side.": [ - "Če želite prikaz dodatnih kontrolnikov. Dodatni kontrolniki vključujejo možnost izdelave večstolpčnih grafikonov, naloženih ali drug ob drugem." + "Group By filter plugin": ["Vtičnik za filter za združevanje"], + "Chosen non-numeric column": ["Izbran ne-numeričen stolpec"], + "Single value": ["Ena vrednost"], + "Use only a single value.": ["Uporabite le eno vrednost."], + "Range filter plugin using AntD": [ + "Vtičnik za filter obdobja z uporabo AntD" ], - "X Tick Layout": ["Postavitev oznak na X-osi"], - "The way the ticks are laid out on the X-axis": [ - "Način razporeditve oznak na X-osi" + " (excluded)": [" (ni vključeno)"], + "Select first filter value by default": [ + "Izberi prvo vrednost kot privzeto" ], - "X Axis Format": ["Oblika X-osi"], - "Y Log Scale": ["Logaritemska Y-os"], - "Use a log scale for the Y-axis": ["Uporabi logaritemsko skalo za Y-os"], - "Y Axis Bounds": ["Meje Y-osi"], - "Bounds for the Y-axis. When left empty, the bounds are dynamically defined based on the min/max of the data. Note that this feature will only expand the axis range. It won't narrow the data's extent.": [ - "Meje Y-osi. Če je prazno, se meje nastavijo dinamično na podlagi min./max. vrednosti podatkov. Funkcija omeji le prikaz, obseg podatkov pa ostane enak." + "When using this option, default value can’t be set": [ + "Če uporabite to možnost, privzeta vrednost ne more biti nastavljena" ], - "Y Axis 2 Bounds": ["Meje Y 2-osi"], - "X bounds": ["Meje X-osi"], - "Whether to display the min and max values of the X-axis": [ - "Če želite prikaz min. in max. vrednosti X-osi" + "Inverse selection": ["Invertiraj izbiro"], + "Exclude selected values": ["Izloči izbrane vrednosti"], + "Dynamically search all filter values": [ + "Dinamično poišče vse možnosti filtra" ], - "Bar Values": ["Vrednosti stolpcev"], - "Show the value on top of the bar": [ - "Prikaži vrednosti na vrhu stolpcev" + "Select filter plugin using AntD": [ + "Izberite Vtičnik za filter z uporabo AntD" ], - "Stacked Bars": ["Naloženi stolpci"], - "Reduce X ticks": ["Manj oznak X-osi"], - "Reduces the number of X-axis ticks to be rendered. If true, the x-axis will not overflow and labels may be missing. If false, a minimum width will be applied to columns and the width may overflow into an horizontal scroll.": [ - "Zmanjša število izrisanih oznak na X-osi. Če je vklopljeno, se x-os ne bo prelila in lahko oznake manjkajo. Če je izklopljeno, bo upoštevana min. širina stolpcev, ki pa se lahko prelije v horizontalni drsnik." + "Custom time filter plugin": ["Prilagojeni vtičnik za časovni filter"], + "No time columns": ["Ni časovnih stolpcev"], + "Time column filter plugin": ["Vtičnik za časovni filter"], + "Time grain filter plugin": ["Vtičnik za filter časovne granulacije"], + "Favorites": ["Priljubljene"], + "Created content": ["Ustvarjena vsebina"], + "Recent activity": ["Nedavna aktivnost"], + "Security & Access": ["Varnost in Dostopi"], + "No charts": ["Ni grafikonov"], + "No dashboards": ["Ni nadzornih plošč"], + "No favorite charts yet, go click on stars!": [ + "Priljubljenih grafikonov še ni. Kliknite na zvezdice!" ], - "You cannot use 45° tick layout along with the time range filter": [ - "Skupaj s filtriranjem časovnega obdobja ne morete uporabiti oznak pod 45° kotom" + "No favorite dashboards yet, go click on stars!": [ + "Priljubljenih nadzornih plošč še ni. Kliknite na zvezdice!" ], - "Stacked Style": ["Slog nalaganja"], - "Evolution": ["Evolucija"], - "A time series chart that visualizes how a related metric from multiple groups vary over time. Each group is visualized using a different color.": [ - "Grafikon časovne vrste, ki prikaže kako se povezane mere skupin spreminjajo skozi čas. Vsaka skupina je prikazana s svojo barvo." + "Profile picture provided by Gravatar": [ + "Profilno sliko je zagotovil Gravatar" ], - "Stretched style": ["Raztegnjen slog"], - "Stacked style": ["Naložen slog"], - "Video game consoles": ["Igralne konzole"], - "Vehicle Types": ["Vrste vozil"], - "Area Chart": ["Ploščinski grafikon"], - "Continuous": ["Zvezno"], - "nvd3": ["nvd3"], - "Deprecated": ["Zastarelo"], - "Visualize how a metric changes over time using bars. Add a group by column to visualize group level metrics and how they change over time.": [ - "Prikaže spreminjanje mere skozi čas s pomočjo stolpcev. Z dodajanjem stolpcev za združevanje prikaže mere skupin in njihovo spreminjanje." + "joined": ["pridružen"], + "id:": ["id:"], + "There was an issue fetching reports attached to this dashboard.": [ + "Pri pridobivanju poročil za to nadzorno ploščo je prišlo do težave." ], - "Time-series Bar Chart": ["Stolpčni grafikon za časovno vrsto"], - "Vertical": ["Navpično"], - "Box Plot": ["Box Plot"], - "X Log Scale": ["Logaritemska X-os"], - "Use a log scale for the X-axis": ["Uporabi logaritemsko skalo za X-os"], - "Visualizes a metric across three dimensions of data in a single chart (X axis, Y axis, and bubble size). Bubbles from the same group can be showcased using bubble color.": [ - "Prikaže mero v treh dimenzijah podatkov na istem grafikonu (x os, y os, velikost mehurčka). Mehurčki v isti skupini so predstavljeni z barvo." + "The report has been created": ["Poročilo je bilo ustvarjeno"], + "Report updated": ["Poročilo posodobljeno"], + "We were unable to active or deactivate this report.": [ + "Aktiviranje ali deaktiviranje poročila ni uspelo." ], - "Ranges": ["Razponi"], - "Ranges to highlight with shading": ["Razponi za označitev s senčenjem"], - "Range labels": ["Oznake razponov"], - "Labels for the ranges": ["Oznake za razpone"], - "Markers": ["Markerji"], - "List of values to mark with triangles": [ - "Seznam vrednosti, ki bodo markirane s trikotniki" + "Your report could not be deleted": [ + "Vašega poročila ni mogoče izbrisati" ], - "Marker labels": ["Oznake markerjev"], - "Labels for the markers": ["Oznake za markerje"], - "Marker lines": ["Markirne črtice"], - "List of values to mark with lines": [ - "Seznam vrednosti, ki bodo markirane s črticami" + "Deleted: %s": ["Izbrisano: %s"], + "Image download failed, please refresh and try again.": [ + "Prenos slike ni uspel. Osvežite in poskusite ponovno." ], - "Marker line labels": ["Oznake markirnih črtic"], - "Labels for the marker lines": ["Oznake za markirne črtice"], - "Showcases the progress of a single metric against a given target. The higher the fill, the closer the metric is to the target.": [ - "Prikaže napredovanje posamezne mere glede na cilj. Večja napolnjenost, pomeni, da je mera bližje cilju." + "Select values in highlighted field(s) in the control panel. Then run the query by clicking on the %s button.": [ + "Izberite vrednosti v osvetljenih poljih na levi strani kontrolnika in zaženite poizvedbo z gumbom %s." ], - "Visualizes many different time-series objects in a single chart. This chart is being deprecated and we recommend using the Time-series Chart instead.": [ - "Prikaže več različnih časovnih vrst na istem grafikonu. Grafikon se opušča, zato priporočamo uporabo Grafikona časovne vrste." + "Invalid input": ["Neveljaven vnos"], + "Unexpected error: ": ["Nepričakovana napaka: "], + "(no description, click to see stack trace)": [ + "(ni opisa, kliknite za ogled zapisov)" ], - "Time-series Percent Change": ["Časovna vrsta - Procentualna sprememba"], - "Sort Bars": ["Uredi stolpce"], - "Sort bars by x labels.": ["Uredi stolpce po x-oznakah."], - "Breakdowns": ["Razčlenitev"], - "Defines how each series is broken down": [ - "Določa, kako se vsaka podatkovna serija razčleni" + "Network error": ["Napaka omrežja"], + "Request timed out": ["Zahtevek pretečen"], + "Issue 1000 - The dataset is too large to query.": [ + "Težava 1000 - podatkovni vir je prevelik za poizvedbo." ], - "Compares metrics from different categories using bars. Bar lengths are used to indicate the magnitude of each value and color is used to differentiate groups.": [ - "Primerjava mer različnih kategorij s pomočjo stolpcev. Dolžina stolpca prestavlja višino vrednosti, z barvami pa so ločene skupine." + "Issue 1001 - The database is under an unusual load.": [ + "Težava 1001 - podatkovni vir je neobičajno obremenjen." ], - "Bar Chart": ["Stolpčni grafikon"], - "Discrete": ["Diskretno"], - "Y Axis 1": ["Y-os 1"], - "Y Axis 2": ["Y-os 2"], - "Left Axis Metric": ["Mera za levo os"], - "Choose a metric for left axis": ["Izberite mero za levo os"], - "Left Axis Format": ["Oblika leve osi"], - "Visualizes 2 metrics as line plots using the same x-axis. This chart is useful for comparing metrics across the same time range.": [ - "Prikaže dve meri na črtnem grafu z isto x-osjo. Grafikon je uporaben za primerjavo mer v istem časovnem obdobju." + "An error occurred while fetching %s info: %s": [ + "Napaka pri pridobivanju informacij za %s: %s" ], - "Dual Line Chart": ["Grafikon z dvojno krivuljo"], - "Propagate": ["Razširi"], - "Send range filter events to other charts": [ - "Pošlji dogodke filtra obdobja na druge grafikone" + "An error occurred while fetching %ss: %s": [ + "Napaka pri pridobivanju informacij za %s: %s" ], - "Classic chart that visualizes how metrics change over time.": [ - "Standardni grafikon za prikaz spreminjanje mere skozi čas." + "An error occurred while creating %ss: %s": [ + "Napaka pri ustvarjanju %s: %s" ], - "Battery level over time": ["Napolnjenost baterije skozi čas"], - "Line Chart": ["Črtni grafikon"], - "Prefix metric name with slice name": ["Imenu mere pripni ime rezine"], - "Y Axis Left": ["Y-os levo"], - "Left Axis chart(s)": ["Grafikoni leve osi"], - "Choose one or more charts for left axis": [ - "Izberite enega ali več grafikonov za levo os" + "An error occurred while importing %s: %s": [ + "Napaka pri uvažanju %s: %s" ], - "Select charts": ["Izberi grafikone"], - "Error while fetching charts": ["Napaka pri pridobivanju grafikonov"], - "Y Axis Right": ["Y-os desno"], - "Right Axis chart(s)": ["Grafikoni desne osi"], - "Choose one or more charts for right axis": [ - "Izberite enega ali več grafikonov za desno os" + "There was an error fetching the favorite status: %s": [ + "Napaka pri pridobivanju statusa \"Priljubljeno\": %s" ], - "Visualize two different time series using the same x-axis time range. This chart is being deprecated and we recommend using the Mixed Timeseries Chart instead!": [ - "Prikaže dve različni časovni vrsti z isto x-osjo oz. časovnim obdobjem. Grafikon se opušča, zato priporočamo uporabo kombiniranega grafikona časovne vrste!" + "There was an error saving the favorite status: %s": [ + "Napaka pri shranjevanju statusa \"Priljubljeno\": %s" ], - "Multiple Line Charts": ["Veččrtni grafikon"], - "Label Type": ["Oblika oznake"], - "What should be shown on the label?": ["Kaj bo prikazano na oznaki?"], - "Donut": ["Kolobar"], - "Do you want a donut or a pie?": ["Želite kolobar ali torto?"], - "Show Labels": ["Pokaži oznake"], - "Whether to display the labels. Note that the label only displays when the the 5% threshold.": [ - "Če želite prikazati oznake. Oznake so prikazane le pri vsaj 5-odstotnem pragu." + "Link Copied!": ["Povezava kopirana!"], + "Sorry, your browser does not support copying.": [ + "Vaš brskalnik ne podpira kopiranja." ], - "Put labels outside": ["Postavi oznake zunaj"], - "Put the labels outside the pie?": ["Postavim oznake zunaj torte?"], - "Pie Chart": ["Tortni grafikon"], - "Frequency": ["Frekvenca"], - "The periodicity over which to pivot time. Users can provide\r\n \"Pandas\" offset alias.\r\n Click on the info bubble for more details on accepted \"freq\" expressions.": [ - "Periodičnost za vrtenje časa. Uporabnik lahko poda\n psevdonim za zamik v \"Pandas\".\n Kliknite na mehurček za podrobnosti dovoljenih izrazov za \"freq\"." + "Connection looks good!": ["Povezava izgleda v redu!"], + "ERROR: %s": ["NAPAKA: %s"], + "There was an error fetching your recent activity:": [ + "Pri pridobivanju nedavnih aktivnosti je prišlo do napake:" ], - "Time-series Period Pivot": ["Časovna serija - Vrtenje periode"], - "Show legend": ["Prikaži legendo"], - "Whether to display a legend for the chart": [ - "Če želite prikaz legende za grafikon" + "There was an issue deleting: %s": ["Težava pri brisanju: %s"], + "There was an issue deleting %s: %s": ["Težava pri brisanju %s: %s"], + "Working": ["Delam"], + "Not triggered": ["Ni sproženo"], + "On Grace": ["V mirovanju"], + "report": ["poročilo"], + "alert": ["opozorilo"], + "reports": ["poročila"], + "alerts": ["opozorila"], + "There was an issue deleting the selected %s: %s": [ + "Težava pri brisanju izbranih %s: %s" ], - "Margin": ["Rob"], - "Additional padding for legend.": ["Dodatni razmak za legendo."], - "Legend type": ["Tip legende"], - "Show Value": ["Prikaži vrednost"], - "Show series values on the chart": [ - "Na grafikonu prikaži vrednosti serij" + "Last run": ["Zadnji zagon"], + "Notification method": ["Način obveščanja"], + "Created by": ["Ustvaril"], + "Active": ["Aktiven"], + "Execution log": ["Dnevnik izvajanja"], + "Actions": ["Aktivnosti"], + "Bulk select": ["Izberi hkrati"], + "No %s yet": ["%s še ne obstajajo"], + "Owner": ["Lastnik"], + "An error occurred while fetching owners values: %s": [ + "Pri pridobivanju polja lastnik je prišlo do napake: %s" ], - "Stack series": ["Nalagaj serije"], - "Stack series on top of each other": ["Nalagaj serije eno na drugo"], - "Only Total": ["Samo vsota"], - "Only show the total value on the stacked chart, and not show on the selected category": [ - "Na naloženem grafikonu prikaži samo skupno vsoto, za izbrane kategorije pa ne" + "An error occurred while fetching created by values: %s": [ + "Pri pridobivanju vrednosti \"Ustvaril\" je prišlo do napake: %s" ], - "Rich tooltip": ["Podroben opis orodja"], - "Shows a list of all series available at that point in time": [ - "Prikaže seznam vseh razpoložljivih podatkovnih serij za istočasno točko" + "Status": ["Status"], + "Alerts & reports": ["Opozorila in poročila"], + "Alerts": ["Opozorila"], + "Reports": ["Poročila"], + "Delete %s?": ["Izbrišem %s?"], + "Please confirm": ["Prosim, potrdite"], + "Are you sure you want to delete the selected %s?": [ + "Ali ste prepričani, da želite izbrisati izbrane %s?" ], - "Tooltip time format": ["Oblika zapisa časa v opisu orodja"], - "Tooltip sort by metric": ["Mera za razvrščanje opisa orodja"], - "Whether to sort tooltip by the selected metric in descending order.": [ - "Če želite padajoče razvrstiti opis orodja z izbrano mero." + "< (Smaller than)": ["< (manjše kot)"], + "> (Larger than)": ["> (večje kot)"], + "<= (Smaller or equal)": ["<= (manjše ali enako)"], + ">= (Larger or equal)": [">= (večje ali enako)"], + "== (Is equal)": ["== (je enako)"], + "!= (Is not equal)": ["!= (ni enako)"], + "Not null": ["Ni nič (null)"], + "30 days": ["30 dni"], + "60 days": ["60 dni"], + "90 days": ["90 dni"], + "Add notification method": ["Dodajte način obveščanja"], + "Add delivery method": ["Dodajte način dostave"], + "%s updated": ["%s posodobljeni"], + "Edit Report": ["Uredi poročilo"], + "Edit Alert": ["Uredi opozorilo"], + "Add Report": ["Dodaj poročilo"], + "Add Alert": ["Dodaj opozorilo"], + "Report name": ["Naslov poročila"], + "Alert name": ["Naslov opozorila"], + "Alert condition": ["Status opozorila"], + "Trigger Alert If...": ["Sproži opozorilo v primeru ..."], + "Condition": ["Pogoj"], + "Threshold value should be double precision number": [ + "Mejna vrednost naj bo število z dvojno natančnostjo (double)" ], - "Tooltip": ["Opis orodja"], - "Whisker/outlier options": ["Možnosti grafikona kvantilov"], - "Determines how whiskers and outliers are calculated.": [ - "Določa kako so izračunani kvantili in izstopajoče vrednosti." + "Report schedule": ["Urnik poročanja"], + "Alert condition schedule": ["Urnik statusov opozoril"], + "Schedule settings": ["Nastavitve urnika"], + "Log retention": ["Hranjenje dnevnikov"], + "Working timeout": ["Pretek delovanja"], + "Time in seconds": ["Čas v sekundah"], + "Grace period": ["Obdobje mirovanja"], + "Send as PNG": ["Pošlji kot PNG"], + "Send as CSV": ["Pošlji kot CSV"], + "Send as text": ["Pošlji kot besedilo"], + "log": ["dnevnik"], + "State": ["Status"], + "Execution ID": ["ID izvedbe"], + "Scheduled at (UTC)": ["Izvede se ob (UTC)"], + "Start at (UTC)": ["Zažene se ob (UTC)"], + "Duration": ["Trajanje"], + "Error message": ["Sporočilo napake"], + "CRON expression": ["Izraz CRON"], + "Report sent": ["Poročilo poslano"], + "Alert triggered, notification sent": [ + "Opozorilo sproženo, obvestilo poslano" ], - "Categories to group by on the x-axis.": [ - "Kategorije za združevanje po x-osi." + "Report sending": ["Pošiljanje poročila"], + "Alert running": ["Opozorilo aktivno"], + "Report failed": ["Poročilo ni uspelo"], + "Alert failed": ["Opozorilo ni uspelo"], + "Nothing triggered": ["Ni ni sproženo"], + "Alert Triggered, In Grace Period": [ + "Opozorilo sproženo, v obdobju mirovanja" ], - "Distribute across": ["Porazdeli glede na"], - "Columns to calculate distribution across. Defaults to temporal column if left empty.": [ - "Stolpci za izračun porazdelitve. Privzeto je izbran časovni stolpec (če je prazno)." + "Delivery method": ["Način dostave"], + "Select Delivery Method": ["Izberite način dostave"], + "Recipients are separated by \",\" or \";\"": [ + "Prejemniki so ločeni z \",\" ali \";\"" ], - "Also known as a box and whisker plot, this visualization compares the distributions of a related metric across multiple groups. The box in the middle emphasizes the mean, median, and inner 2 quartiles. The whiskers around each box visualize the min, max, range, and outer 2 quartiles.": [ - "Znan tudi kot grafikon škatla z brki. prikaže primerjavo porazdelitev povezanih mer v različnih skupinah. Škatla na sredini predstavlja povprečje, mediano in notranja 2 kvartila. Brki na vsaki škatli prikazujejo minimum, maksimum, območje in zunanja dva kvartila." + "annotation": ["oznaka"], + "There was an issue deleting the selected annotations: %s": [ + "Pri brisanju izbranih oznak je prišlo do težave: %s" ], - "Labels": ["Oznake"], - "Whether to display the labels.": ["Če želite prikaz oznak."], - "Showcases how a metric changes as the funnel progresses. This classic chart is useful for visualizing drop-off between stages in a pipeline or lifecycle.": [ - "Prikaže kako se mera spreminja, ko lijak napreduje. Standardni grafikon za prikaz sprememb med nivoji v procesu ali življenjskem ciklu." + "Edit annotation": ["Uredi oznako"], + "Delete annotation": ["Izbriši oznako"], + "Annotation": ["Oznaka"], + "No annotation yet": ["Oznak še ni"], + "Annotation Layer %s": ["Sloj z oznakami %s"], + "Are you sure you want to delete %s?": [ + "Ali ste prepričani, da želite izbrisati %s?" ], - "Funnel Chart": ["Lijakasti grafikon"], - "Sequential": ["Sekvenčni"], - "Columns to group by": ["Stolpci za združevanje"], - "General": ["Splošno"], - "Minimum value on the gauge axis": ["Najmanjša vrednost na številčnici"], - "Maximum value on the gauge axis": ["Največja vrednost na številčnici"], - "Start angle": ["Začetni kot"], - "Angle at which to start progress axis": [ - "Kot, pri katerem se začne os območja" + "Delete Annotation?": ["Izbrišem oznako?"], + "Are you sure you want to delete the selected annotations?": [ + "Ali ste prepričani, da želite izbrisati izbrane oznake?" ], - "End angle": ["Končni kot"], - "Angle at which to end progress axis": [ - "Kot, pri katerem se konča os območja" + "The annotation has been updated": ["Označba je bila posodobljena"], + "The annotation has been saved": ["Označba je bila shranjena"], + "Add annotation": ["Dodaj oznako"], + "Annotation name": ["Ime oznake"], + "date": ["datum"], + "Additional information": ["Dodatne informacije"], + "Description (this can be seen in the list)": [ + "Opis (lahko je viden na seznamu)" + ], + "annotation_layer": ["annotation_layer"], + "Annotation template updated": ["Predloga oznake posodobljena"], + "Annotation template created": ["Predloga oznake ustvarjena"], + "Edit annotation layer properties": ["Uredi lastnosti sloja z oznakami"], + "Annotation layer name": ["Ime sloja z oznakami"], + "Annotation layers": ["Sloji z oznakami"], + "There was an issue deleting the selected layers: %s": [ + "Pri brisanju izbranih slojev je prišlo do težave: %s" + ], + "Last modified": ["Zadnja sprememba"], + "Created on": ["Ustvarjeno"], + "Edit template": ["Uredi predlogo"], + "Delete template": ["Izbriši predlogo"], + "Annotation layer": ["Sloj z oznakami"], + "An error occurred while fetching dataset datasource values: %s": [ + "Pri pridobivanju vrednosti podatkovnega vira podatkovnega seta je prišlo do napake: %s" ], - "Font size": ["Velikost pisave"], - "Font size for axis labels, detail value and other text elements": [ - "Velikost pisave za oznake osi, podrobnosti in druge besedilne elemente" + "No annotation layers yet": ["Slojev z oznakami še ni"], + "This action will permanently delete the layer.": [ + "S tem dejanjem boste trajno izbrisali sloj." ], - "Value format": ["Oblika zapisa vrednosti"], - "Additional text to add before or after the value, e.g. unit": [ - "Dodatno besedilo, ki ga dodate pred ali za vrednost, npr. enota" + "Delete Layer?": ["Izbrišem sloj?"], + "Are you sure you want to delete the selected layers?": [ + "Ali ste prepričani, da želite izbrisati izbrane sloje?" ], - "Show pointer": ["Prikaži kazalec"], - "Whether to show the pointer": ["Če želite prikazati kazalec"], - "Animation": ["Animacija"], - "Whether to animate the progress and the value or just display them": [ - "Če želite animiran prikaz grafikona" + "Are you sure you want to delete": [ + "Ali ste prepričani, da želite izbrisati" ], - "Axis": ["Os"], - "Show axis line ticks": ["Prikaži oznake na X-osi"], - "Whether to show minor ticks on the axis": [ - "Če želite prikaz manjših oznak na osi" + "Modified %s": ["Zadnja sprememba %s"], + "The passwords for the databases below are needed in order to import them together with the charts. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj z grafikoni. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če je to potrebno." ], - "Show split lines": ["Prikaži razdelitvene črte"], - "Whether to show the split lines on the axis": [ - "Če želite prikazati razdelitvene črte na osi" + "You are importing one or more charts that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "Uvažate enega ali več grafikonov, ki že obstajajo. S prepisom lahko izgubite podatke. Ali ste prepričani, da želite prepisati?" ], - "Split number": ["Število razdelitev"], - "Number of split segments on the axis": ["Število razdelkov na osi"], - "Progress": ["Območje"], - "Show progress": ["Prikaži območje"], - "Whether to show the progress of gauge chart": [ - "Prikaži merilno območje števčnega grafikona" + "Chart imported": ["Grafikon uvožen"], + "There was an issue deleting the selected charts: %s": [ + "Pri brisanju izbranih grafikonov je prišlo do težave: %s" ], - "Overlap": ["Prekrivanje"], - "Whether the progress bar overlaps when there are multiple groups of data": [ - "Če želite prekrivanje območij, ko imate več skupin podatkov" + "Modified by": ["Spremenil"], + "Favorite": ["Priljubljene"], + "Any": ["Katerikoli"], + "Yes": ["Da"], + "No": ["Ne"], + "All": ["Vsi"], + "An error occurred while fetching chart owners values: %s": [ + "Pri pridobivanju polja lastnik grafikona je prišlo do napake: %s" ], - "Round cap": ["Zaobljeni konci"], - "Style the ends of the progress bar with a round cap": [ - "Zaobljena oblika koncev območja" + "An error occurred while fetching chart created by values: %s": [ + "Pri pridobivanju polja Grafikon ustvaril je prišlo do napake: %s" ], - "Intervals": ["Intervali"], - "Interval bounds": ["Meje intervalov"], - "Comma-separated interval bounds, e.g. 2,4,5 for intervals 0-2, 2-4 and 4-5. Last number should match the value provided for MAX.": [ - "Z vejico ločeni intervali, npr. 2,4,5 za intervale 0-2, 2-4 in 4-5. Zadnja številka naj bo enaka vrednosti za MAX." + "Chart type": ["Tip grafikona"], + "Certified": ["Certificirano"], + "Alphabetical": ["Po abecedi"], + "Recently modified": ["Nedavno spremenjeno"], + "Least recently modified": ["Zadnje spremenjeno"], + "Import charts": ["Uvozi grafikone"], + "Are you sure you want to delete the selected charts?": [ + "Ali ste prepričani, da želite izbrisati izbrane grafikone?" ], - "Interval colors": ["Barve intervalov"], - "Comma-separated color picks for the intervals, e.g. 1,2,4. Integers denote colors from the chosen color scheme and are 1-indexed. Length must be matching that of interval bounds.": [ - "Z vejico ločene barve za intervale, npr. 1,2,4. Cela števila predstavljajo barve iz barvne sheme (začnejo se z 1). Dolžina mora ustrezati mejam intervala." + "css_template": ["css_template"], + "Edit CSS template properties": ["Uredi lastnosti CSS predloge"], + "Add CSS template": ["Dodaj CSS predlogo"], + "CSS template name": ["Ime CSS predloge"], + "css": ["css"], + "CSS templates": ["CSS predloge"], + "There was an issue deleting the selected templates: %s": [ + "Pri brisanju izbranih predlog je prišlo do težave: %s" ], - "Uses a gauge to showcase progress of a metric towards a target. The position of the dial represents the progress and the terminal value in the gauge represents the target value.": [ - "Uporablja števec za prikaz napredovanja mere k ciljni vrednosti. Položaj kazalca predstavlja napredek, končna vrednost na števcu pa ciljno vrednost." + "Last modified by %s": ["Nazadnje spremenil %s"], + "CSS template": ["CSS predloga"], + "This action will permanently delete the template.": [ + "S tem dejanjem boste trajno izbrisali predlogo." ], - "Gauge Chart": ["Števčni grafikon"], - "Name of the source nodes": ["Imena izvornih vozlišč"], - "Name of the target nodes": ["Imena ciljnih vozlišč"], - "Source category": ["Kategorija izvora"], - "The category of source nodes used to assign colors. If a node is associated with more than one category, only the first will be used.": [ - "Kategorija izvornih vozlišč, na podlagi katere je določena barva. Če je vozlišče povezano z več kot eno kategorijo, bo uporabljena samo prva." + "Delete Template?": ["Izbrišem predlogo?"], + "Are you sure you want to delete the selected templates?": [ + "Ali ste prepričani, da želite izbrisati izbrane predloge?" ], - "Target category": ["Kategorija cilja"], - "Category of target nodes": ["Kategorija ciljnih vozlišč"], - "Chart options": ["Možnosti grafikona"], - "Layout": ["Izgled"], - "Graph layout": ["Izgled grafikona"], - "Force": ["Sila"], - "Layout type of graph": ["Tip izgleda grafikona"], - "Edge symbols": ["Simboli povezav"], - "Symbol of two ends of edge line": ["Simbol za konca povezave"], - "None -> None": ["Brez -> Brez"], - "None -> Arrow": ["Brez -> Puščica"], - "Circle -> Arrow": ["Krog -> Puščica"], - "Circle -> Circle": ["Krog -> Krog"], - "Enable node dragging": ["Omogoči premikanje vozlišč"], - "Whether to enable node dragging in force layout mode.": [ - "Če želite omogočiti premikanje vozlišč v načinu vsiljenega prikaza." + "published": ["objavljeno"], + "draft": ["osnutek"], + "The passwords for the databases below are needed in order to import them together with the dashboards. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj z nadzornimi ploščami. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če je to potrebno." ], - "Enable graph roaming": ["Omogoči preoblikovanje grafikona"], - "Disabled": ["Onemogočeno"], - "Scale only": ["Samo povečava"], - "Move only": ["Samo premikanje"], - "Scale and Move": ["Povečava in premikanje"], - "Whether to enable changing graph position and scaling.": [ - "Če želite omogočiti premikanje in povečevanje/zmanjševanje grafikona." + "You are importing one or more dashboards that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "Uvažate eno ali več nadzornih plošč, ki že obstajajo. S prepisom lahko izgubite podatke. Ali ste prepričani, da želite prepisati?" ], - "Node select mode": ["Način izbire vozlišč"], - "Single": ["Posamezno"], - "Multiple": ["Več"], - "Allow node selections": ["Dovoli izbiro vozlišča"], - "Label threshold": ["Prag oznak"], - "Minimum value for label to be displayed on graph.": [ - "Najmanjša vrednost, za katero bo na grafikonu prikazana oznaka." + "Dashboard imported": ["Nadzorna plošča uvožena"], + "An error occurred while fetching dashboards: %s": [ + "Prišlo je do napake pri pridobivanju nadzornih plošč: %s" ], - "Node size": ["Velikost vozlišča"], - "Median node size, the largest node will be 4 times larger than the smallest": [ - "Mediana velikosti vozlišča. Največje vozlišče bo 4-krat večje od najmanjšega" + "There was an issue deleting the selected dashboards: ": [ + "Pri brisanju izbranih nadzornih plošč je prišlo do težave: " ], - "Edge width": ["Debelina povezave"], - "Median edge width, the thickest edge will be 4 times thicker than the thinnest.": [ - "Mediana debeline povezave. Najdebelejša povezava bo 4-krat debelejša od najtanjše." + "An error occurred while fetching dashboard owner values: %s": [ + "Pri pridobivanju polja lastnik nadzorne plošče je prišlo do napake: %s" ], - "Edge length": ["Dolžina povezave"], - "Edge length between nodes": ["Dolžina povezave med vozlišči"], - "Gravity": ["Gravitacija"], - "Strength to pull the graph toward center": [ - "Sila privlačnosti med grafikonom in središčem" + "An error occurred while fetching dashboard created by values: %s": [ + "Pri pridobivanju polja Nadzorno ploščo ustvaril je prišlo do napake: %s" ], - "Repulsion": ["Odbijanje"], - "Repulsion strength between nodes": ["Odbojna sila med vozlišči"], - "Friction": ["Trenje"], - "Friction between nodes": ["Trenje med vozlišči"], - "Displays connections between entities in a graph structure. Useful for mapping relationships and showing which nodes are important in a network. Graph charts can be configured to be force-directed or circulate. If your data has a geospatial component, try the deck.gl Arc chart.": [ - "Prikaže povezave med entitetami v strukturi grafa. Uporabno za prikaz razmerij in pomembnih točk v omrežju. Grafikon je lahko krožnega tipa ali z usmerjenimi silami. Če imajo podatki geoprostorsko komponento, poskusite grafikon decl.gl - Arc." + "Are you sure you want to delete the selected dashboards?": [ + "Ali ste prepričani, da želite izbrisati izbrane nadzorne plošče?" ], - "Graph Chart": ["Graf"], - "Structural": ["Strukturni"], - "Series type": ["Tip serije"], - "Series chart type (line, bar etc)": [ - "Tip grafikona za posamezno podatkovno serijo (črtni, stolpčni, ...)" + "Saved queries": ["Shranjene poizvedbe"], + "SQL Copied!": ["SQL kopiran!"], + "database": ["podatkovna baza"], + "An error occurred while fetching database related data: %s": [ + "Pri pridobivanju podatkov iz podatkovne baze je prišlo do napake: %s" ], - "Area chart": ["Ploščinski grafikon"], - "Draw area under curves. Only applicable for line types.": [ - "Izriši površino pod krivuljo. Samo za črtne grafikone." + "Upload file to database": ["Naloži datoteko v podatkovno bazo"], + "Upload CSV": ["Naloži CSV"], + "Upload columnar file": ["Naloži datoteko s stolpci"], + "Upload Excel file": ["Naloži Excel-ovo datoteko"], + "Asynchronous query execution": ["Asinhroni zagon poizvedb"], + "AQE": ["AQE"], + "Allow data manipulation language": [ + "Dovoli jezik za manipulacijo podatkov (DML)" ], - "Opacity of area chart.": ["Prosojnost ploščinskega grafikona."], - "Marker": ["Marker"], - "Draw a marker on data points. Only applicable for line types.": [ - "Nariši markerje na točke grafikona. Samo za črtne grafikone." + "DML": ["DML"], + "CSV upload": ["Nalaganje CSV"], + "Delete database": ["Izbriši podatkovno bazo"], + "The database %s is linked to %s charts that appear on %s dashboards and users have %s SQL Lab tabs using this database open. Are you sure you want to continue? Deleting the database will break those objects.": [ + "Podatkovna baza %s je povezana z grafikoni %s, ki so prisotni na nadzorni plošči %s in uporabniki imajo odprtih %s zavihkov SQL laboratorija. Ali želite nadaljevati? Izbris podatkovne baze bo pokvaril te objekte." ], - "Marker size": ["Velikost markerja"], - "Size of marker. Also applies to forecast observations.": [ - "Velikost markerja. Upošteva se tudi za napovedi." + "Delete Database?": ["Izbrišem podatkovno bazo?"], + "Expose database in SQL Lab": [ + "Razkrij podatkovno bazo v SQL laboratoriju" ], - "Primary": ["Primarna"], - "Secondary": ["Sekundarna"], - "Primary or secondary y-axis": ["Primarna ali sekundarna y-os"], - "Query A": ["Poizvedba A"], - "Query B": ["Poizvedba B"], - "Data Zoom": ["Zoom funkcija"], - "Enable data zooming controls": [ - "Omogoči kontrolnik za povečavo podatkov" + "Allow this database to be queried in SQL Lab": [ + "Dovoli poizvedbo na to podatkovno bazo v SQL laboratoriju" ], - "Rotate x axis label": ["Zavrti oznako x-osi"], - "Input field supports custom rotation. e.g. 30 for 30°": [ - "Vnosno polje omogoča poljubno rotacijo (vnesite 30 za 30°)" + "Allow creation of new tables based on queries": [ + "Dovoli ustvarjanje novih tabel s poizvedbami" ], - "Minor Split Line": ["Manjša ločilna črta"], - "Draw split lines for minor y-axis ticks": [ - "Izriši ločilne črte za pomožne oznake y-osi" + "Allow creation of new views based on queries": [ + "Dovoli ustvarjanje novih pogledov s poizvedbami" ], - "Truncate Y Axis": ["Prireži Y-os"], - "Truncate Y Axis. Can be overridden by specifying a min or max bound.": [ - "Prireži Y-os. Če določite spodnjo ali zgornjo mejo, preprečite prirezovanje." + "CTAS & CVAS SCHEMA": ["CTAS & CVAS SHEMA"], + "Create or select schema...": ["Ustvarite ali izberite shemo..."], + "Force all tables and views to be created in this schema when clicking CTAS or CVAS in SQL Lab.": [ + "Vsilite, da bodo vse tabele in pogledi ustvarjeni s to shemo, ko kliknete CTAS ali CVAS v SQL laboratoriju." ], - "Primary y-axis format": ["Oblika primarne y-osi"], - "Logarithmic y-axis": ["Logaritemska y-os"], - "Logarithmic scale on primary y-axis": [ - "Logaritemska skala na primarni y-osi" + "Allow manipulation of the database using non-SELECT statements such as UPDATE, DELETE, CREATE, etc.": [ + "Dovoli manipulacije podatkovne baze z uporabo ne-SELECT stavkov, kot so UPDATE, DELETE, CREATE, itd." ], - "Secondary y-axis format": ["Oblika sekundarne y-osi"], - "Secondary y-axis title": ["Naslov sekundarne y-osi"], - "Logarithmic scale on secondary y-axis": [ - "Logaritemska skala na sekundarni y-osi" + "Enable query cost estimation": [ + "Omogoči ocenjevanje potratnosti poizvedbe" ], - "Visualize two different time series using the same x-axis time range. Note that each time series can be visualized differently (e.g. 1 using bars and 1 using a line).": [ - "Prikaže dve različni časovni vrsti na isti x-osi. Časovni vrsti sta lahko prikazani različno (npr. ena s stolpci in druga s črto)." + "For Bigquery, Presto and Postgres, shows a button to compute cost before running a query.": [ + "Za Presto in Postgres prikaže gumb za izračun potratnosti pred zagonom poizvedbe." ], - "Mixed Time-Series": ["Kombiniran grafikon časovne vrste"], - "Percentage threshold": ["Procentualni prag"], - "Minimum threshold in percentage points for showing labels.": [ - "Minimalni prag v odstotnih točkah za prikaz oznak." + "Allow this database to be explored": [ + "Dovoli raziskovanje te podatkovne baze" ], - "Put the labels outside of the pie?": ["Postavim oznake zunaj torte?"], - "Label Line": ["Črta oznake"], - "Draw line from Pie to label when labels outside?": [ - "Ali želite črto do oznake, ko so le-te zunaj?" + "When enabled, users are able to visualize SQL Lab results in Explore.": [ + "Ko je omogočeno, lahko uporabniki prikazujejo rezultate SQL laboratorija v raziskovalcu." ], - "Pie shape": ["Oblika torte"], - "Outer Radius": ["Zunanji polmer"], - "Outer edge of Pie chart": ["Zunanji rob tortnega grafikona"], - "Inner Radius": ["Notranji polmer"], - "Inner radius of donut hole": ["Notranji polmer kolobarja"], - "The classic. Great for showing how much of a company each investor gets, what demographics follow your blog, or what portion of the budget goes to the military industrial complex.\r\n\r\n Pie charts can be difficult to interpret precisely. If clarity of relative proportion is important, consider using a bar or other chart type instead.": [ - "Standardni grafikon za prikaz deležev. Tortne grafikone je težje natančno interpretirati, takrat lahko uporabite npr. stolpčni grafikon." + "Disable SQL Lab data preview queries": [ + "Izključite poizvedbe za predogled podatkov v SQL Laboratoriju" ], - "The maximum value of metrics. It is an optional configuration": [ - "Največja vrednost mere. To je opcijska nastavitev" + "Disable data preview when fetching table metadata in SQL Lab. Useful to avoid browser performance issues when using databases with very wide tables.": [ + "Izključite predogled podatkov pri pridobivanju metapodatkov v SQL laboratoriju. S tem se zmanjša obremenitev brskalnika pri podatkovnih bazah z zelo širokimi tabelami." ], - "Label position": ["Položaj oznake"], - "Radar": ["Radar"], - "Customize Metrics": ["Prilagodi mere"], - "Further customize how to display each metric": [ - "Dodatne prilagoditve prikaza posameznih mer" + "Chart cache timeout": ["Trajanje predpomnilnika grafikona"], + "Enter duration in seconds": ["Vnesite trajanje v sekundah"], + "Schema cache timeout": ["Trajanje prepomnilnika sheme"], + "Duration (in seconds) of the metadata caching timeout for schemas of this database. If left unset, the cache never expires.": [ + "Trajanje (v sekundah) predpomnilnika metapodatkov za sheme v tej podatkovni bazi. Če ni nastavljeno, predpomnilnik ne poteče." ], - "Circle radar shape": ["Okrogla oblika radarja"], - "Radar render type, whether to display 'circle' shape.": [ - "Način prikaza radarja - če se prikaže okrogla oblika." + "Table cache timeout": ["Trajanje predpomnilnika tabele"], + "Duration (in seconds) of the metadata caching timeout for tables of this database. If left unset, the cache never expires. ": [ + "Trajanje (v sekundah) predpomnilnika metapodatkov za tabele v tej podatkovni bazi. Če ni nastavljeno, predpomnilnik ne poteče. " ], - "Visualize a parallel set of metrics across multiple groups. Each group is visualized using its own line of points and each metric is represented as an edge in the chart.": [ - "Prikaže vzporedni nabor mer za različne skupine. Vsaka skupina je prikazana s svojim naborom točk in vsaka mera s povezavo na grafikonu." + "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.": [ + "Upravljanje podatkovne baze v asinhronem načinu pomeni, da se poizvedbe zaženejo na oddaljenih »delavcih« in ne na samem spletnem strežniku. S tem je predpostavljeno, da imate nastavljenega »delavca« za Celery in zaledni sistem za rezultate. Več informacij je v navodilih za namestitev." ], - "Radar Chart": ["Radarski grafikon"], - "Web": ["Mreža"], - "Contribution Mode": ["Način deležev"], - "Calculate contribution per series or total": [ - "Izračunaj delež za podatkovno serijo ali skupnega" + "Cancel query on window unload event": [ + "Prekini poizvedbo pri dogodku zaprtja okna (window unload event)" ], - "Series Style": ["Slog serije"], - "Area chart opacity": ["Prosojnost ploščinskega grafikona"], - "Opacity of Area Chart. Also applies to confidence band.": [ - "Prosojnost ploščinskega grafikona. Upošteva se tudi za interval zaupanja." + "Terminate running queries when browser window closed or navigated to another page. Available for Presto, Hive, MySQL, Postgres and Snowflake databases.": [ + "Ustavi zagnane poizvedbe, ko se zapre okno brskalnika ali gre na drugo stran. na razpolago za Presto, Hive, MySQL, Postgres in Snowflake podatkovne baze." ], - "Marker Size": ["Velikost markerja"], - "Swiss army knife for visualizing time series data. Choose between step, line, scatter, and bar charts. This viz type has many customization options as well.": [ - "Univerzalni grafikon za prikaz časovnih vrst. Izbirajte med stopničnimi, črtnimi, raztresenimi in stolpčnimi grafikoni. Grafikon ima širok nabor prilagoditev." + "Secure extra": ["Dodatna varnost"], + "JSON string containing additional connection configuration. This is used to provide connection information for systems like Hive, Presto and BigQuery which do not conform to the username:password syntax normally used by SQLAlchemy.": [ + "JSON niz, ki vsebuje dodatno konfiguracijo povezave. Uporablja se za zagotavljanje dodatnih informacij povezave za sisteme kot sta Presto in BigQuery, ki nista skladna s sintakso username:password, ki jo običajno uporablja SQLAlchemy." ], - "Time-series Chart": ["Grafikon časovne vrste"], - "Time-series Area chart are similar to line chart in that they represent variables with the same scale, but area charts stack the metrics on top of each other. An area chart in Superset can be stream, stack, or expand.": [ - "Ploščinski grafikoni časovne vrste so podobni črtnim grafikonom, saj predstavljajo spremenljivke v istem razmerju, vendar se pri ploščinskih grafikonih mere nalagajo ena na drugo." + "Enter CA_BUNDLE": ["Vnesite CA_BUNDLE"], + "Optional CA_BUNDLE contents to validate HTTPS requests. Only available on certain database engines.": [ + "Opcijska CA_BUNDLE vsebina, za potrjevanje HTTPS zahtev. Razpoložljivo le na določenih sistemih podatkovnih baz." ], - "Time-series Area Chart": ["Ploščinski grafikon časovne vrste"], - "It’s not recommended to truncate y-axis in Bar chart.": [ - "V stolpčnem grafikonu ni priporočljivo omejiti y-osi." + "Schemas allowed for CSV upload": ["Dovoljene sheme za nalaganje CSV"], + "A comma-separated list of schemas that CSVs are allowed to upload to.": [ + "Z vejicami ločen seznam shem, kjer je dovoljeno nalaganje CSV-jev." ], - "Time-series Bar Charts are used to show the changes in a metric over time as a series of bars.": [ - "Stolpčni grafikoni časovne vrste se uporabljajo za prikaz sprememb mere skozi čas s pomočjo niza stolpcev." + "Impersonate logged in user (Presto, Trino, Drill, Hive, and GSheets)": [ + "Predstavljanje kot prijavljeni uporabnik (Presto, Trino, Drill, Hive in GSheets)" ], - "Time-series Bar Chart v2": ["Stolpčni grafikon časovne vrste v2"], - "Bar": ["Stolpec"], - "Time-series line chart is used to visualize repeated measurements taken over regular time intervals. Line chart is a type of chart which displays information as a series of data points connected by straight line segments. It is a basic type of chart common in many fields.": [ - "Črtni grafikon časovne vrste je osnovni grafikon, ki se uporablja na različnih področjih. Uporablja se za vizualizacijo meritev zajetih skozi čas. Posamezne točke so med seboj povezane z ravnimi črtami." + "If Presto or Trino, all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them. If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.": [ + "V primeru Presto ali Trino se vse poizvedbe v SQL laboratoriju zaženejo pod trenutno prijavljenim uporabnikom, ki mora imeti pravice za poganjanje. Če je omogočen Hive in hive.server2.enable.doAs, poizvedbe tečejo pod servisnim računom, vendar je trenutno prijavljen uporabnik predstavljen z lastnostjo hive.server2.proxy.user." ], - "Time-series Line Chart": ["Črtni grafikon časovne vrste"], - "Time-series Scatter Plot has time on the horizontal axis in linear units, and the points are connected in order. It shows a statistical relationship between two variables.": [ - "Raztreseni grafikon časovne vrste prikazuje podatkovne točke v povezanem redu in prikazuje statistično razmerje med spremenljivkami." + "Allow data upload": ["Dovoli nalaganje podatkov"], + "If selected, please set the schemas allowed for data upload in Extra.": [ + "Če je izbrano, nastavite dovoljene sheme za nalaganje podatkov v Dodatno." ], - "Time-series Scatter Plot": ["Raztreseni grafikon časovne vrste"], - "Time-series Smooth-line is a variation of line chart. Without angles and hard edges, Smooth-line looks more smarter and more professional.": [ - "Zglajeni grafikon časovne vrste je izpeljanka črtnega grafikona, ki zgladi ostre robove krivulje." + "Metadata Parameters": ["Parametri metapodatkov"], + "The metadata_params object gets unpacked into the sqlalchemy.MetaData call.": [ + "Objekt metadata_params se razpakira v klic sqlalchemy.MetaData." ], - "Time-series Smooth Line": ["Zglajeni črtni grafikon časovne vrste"], - "Step type": ["Stopnični tip"], - "Defines whether the step should appear at the beginning, middle or end between two data points": [ - "Določa, če se na začetku, na sredini ali na koncu pojavi stopnica med dvema točkama" + "Engine Parameters": ["Parametri podatkovne baze"], + "The engine_params object gets unpacked into the sqlalchemy.create_engine call.": [ + "Objekt engine_params se razširi v klic sqlalchemy.create_engine." ], - "Time-series Stepped-line graph (also called step chart) is a variation of line chart but with the line forming a series of steps between data points. A step chart can be useful when you want to show the changes that occur at irregular intervals.": [ - "Stopnični grafikon časovne vrste je izpeljanka črtnega grafikona, pri čemer krivuljo tvorijo stopnice med posameznimi točkami. Koristen je za prikaz sprememb na posameznih intervalih." + "Version": ["Verzija"], + "Version number": ["Številka verzije"], + "Specify the database version. This should be used with Presto in order to enable query cost estimation.": [ + "Podajte verzijo podatkovne baze. Uporablja se s Presto, za potrebe ocenjevanja potratnosti poizvedbe." ], - "Time-series Stepped Line": ["Stopnični črtni grafikon časovne vrste"], - "Id": ["Id"], - "Name of the id column": ["Naziv id-stolpca"], - "Parent": ["Nadrejeni"], - "Name of the column containing the id of the parent node": [ - "Ime stolpca, ki vsebuje id nadrejenega vozlišča" + "Display Name": ["Ime za prikaz"], + "Name your database": ["Poimenujte podatkovno bazo"], + "Pick a name to help you identify this database.": [ + "Izberite ime za lažjo prepoznavo podatkovne baze." ], - "Optional name of the data column.": [ - "Opcijsko ime podatkovnega stolpca." + "dialect+driver://username:password@host:port/database": [ + "dialect+driver://username:password@host:port/database" ], - "Root node id": ["Id korenskega vozlišča"], - "Id of root node of the tree.": ["Id korenskega vozlišča drevesa."], - "Metric for node values": ["Mera za vrednosti vozlišč"], - "Tree layout": ["Oblika drevesa"], - "Orthogonal": ["Pravokotna"], - "Radial": ["Radialna"], - "Layout type of tree": ["Način izgleda drevesa"], - "Tree orientation": ["Orientacija drevesa"], - "Left to Right": ["Iz leve proti desni"], - "Right to Left": ["Iz desne proti levi"], - "Top to Bottom": ["Iz vrha proti dnu"], - "Bottom to Top": ["Iz dna proti vrhu"], - "Orientation of tree": ["Orientacija drevesa"], - "Node label position": ["Položaj oznake vozlišča"], - "left": ["levo"], - "top": ["zgoraj"], - "right": ["desno"], - "bottom": ["spodaj"], - "Position of intermidiate node label on tree": [ - "Položaj vmesne oznake vozlišča na drevesu" + "Refer to the": ["Obrnite se na"], + "for more information on how to structure your URI.": [ + "za več informacij o oblikovanju URI." ], - "Child label position": ["Položaj podrejene oznake"], - "Position of child node label on tree": [ - "Položaj oznake podrejenega vozlišča na drevesu" + "Test connection": ["Preizkus povezave"], + "Please enter a SQLAlchemy URI to test": [ + "Vnesite SQLAlchemy URI za test" ], - "Emphasis": ["Poudari"], - "ancestor": ["nadrejeni"], - "descendant": ["podrejeni"], - "Which relatives to highlight on hover": [ - "Kateri element se poudari na prehodu z miško" + "Database settings updated": ["Nastavitve podatkovne baze posodobljene"], + "Database connected": ["Podatkovna baza povezana"], + "Sorry there was an error fetching database information: %s": [ + "Pri pridobivanju informacij o podatkovni bazi je prišlo do napake: %s" ], - "Symbol": ["Simbol"], - "Empty circle": ["Prazen krog"], - "Circle": ["Krog"], - "Rectangle": ["Pravokotnik"], - "Triangle": ["Trikotnik"], - "Diamond": ["Karo"], - "Pin": ["Žebljiček"], - "Arrow": ["Puščica"], - "Symbol size": ["Velikost simbola"], - "Size of edge symbols": ["Velikost simbola povezave"], - "Visualize multiple levels of hierarchy using a familiar tree-like structure.": [ - "Prikaz več hierarhičnih nivojev z drevesno strukturo." + "Or choose from a list of other databases we support:": [ + "Ali izberite iz seznama drugih podatkovnih baz, ki jih podpiramo:" ], - "Tree Chart": ["Drevesni grafikon"], - "Show Upper Labels": ["Prikaži zgornje oznake"], - "Show labels when the node has children.": [ - "Prikaži oznake, ko ima vozlišče podrejene elemente." + "Supported databases": ["Podprte podatkovne baze"], + "Choose a database...": ["Izberite podatkovno bazo..."], + "Want to add a new database?": ["Želite dodati novo podatkovno bazo?"], + "Any databases that allow connections via SQL Alchemy URIs can be added. ": [ + "Dodate lahko katerokoli podatkovno bazo, ki podpira konekcije z SQL Alchemy URI-ji. " ], - "Show hierarchical relationships of data, with with the value represented by area, showing proportion and contribution to the whole.": [ - "Prikaže hierarhična razmerja podatkov, pri čemer je vrednost ponazorjena s ploščino, in deleže oz. prispevke k celoti." + "Any databases that allow connections via SQL Alchemy URIs can be added. Learn about how to connect a database driver ": [ + "Dodate lahko katerokoli podatkovno bazo, ki podpira konekcije z SQL Alchemy URI-ji. Naučite se kako povezati gonilnik podatkovne baze " ], - "Treemap v2": ["Drevesni grafikon s pravokotniki v2"], - "Columns to group by on the rows": ["Stolpci za združevanje vrstic"], - "Columns to group by on the columns": ["Stolpci za združevanje stolpcev"], - "Apply metrics on": ["Uporabi mero na"], - "Use metrics as a top level group for columns or for rows": [ - "Uporabi mere kot vrhovni nivo grupiranja za stolpce ali vrstice" + "Back": ["Nazaj"], + "Connect": ["Poveži"], + "Finish": ["Zaključi"], + "This database is managed externally, and can't be edited in Superset": [ + "Ta podatkovna baza se ne ureja znotraj Superseta" ], - "Show rows total": ["Prikaži vsoto vrstic"], - "Display row level total": ["Prikaži vsote na nivoju vrstic"], - "Show columns total": ["Prikaži vsoto stolpcev"], - "Display column level total": ["Prikaži vsote na nivoju stolpcev"], - "Transpose pivot": ["Transponirano vrtenje"], - "Swap rows and columns": ["Zamenjaj vrstice in stolpce"], - "Combine metrics": ["Združuj mere"], - "D3 time format for datetime columns": [ - "D3 oblika zapisa za časovne stolpce" + "The passwords for the databases below are needed in order to import them. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in explore files and should be added manually after the import if they are needed.": [ + "Gesla za spodnje podatkovne baze so potrebna za njihov uvoz. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če je to potrebno." ], - "Rows sort by": ["Razvrsti vrstice"], - "key a-z": ["a - ž"], - "key z-a": ["ž - a"], - "value ascending": ["0 - 9"], - "value descending": ["9 - 0"], - "Order of rows": ["Vrstni red vrstic"], - "Cols sort by": ["Razvrsti stolpce"], - "Order of columns": ["Vrstni red stolpcev"], - "Rows subtotal position": ["Položaj vsot vrstic"], - "Top": ["Zgoraj"], - "Bottom": ["Spodaj"], - "Position of row level subtotal": ["Položaj vsot na nivoju vrstic"], - "Cols subtotal position": ["Položaj vsot stolpcev"], - "Position of column level subtotal": ["Položaj vsot na nivoju stolpcev"], - "Conditional formatting": ["Pogojno oblikovanje"], - "Apply conditional color formatting to metrics": [ - "Za mere uporabi pogojno oblikovanje z barvami" + "%s PASSWORD": ["%s GESLO"], + "You are importing one or more databases that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "Uvažate eno ali več podatkovnih baz, ki že obstajajo. S prepisom lahko izgubite podatke. Ali ste prepričani, da želite prepisati?" ], - "Used to summarize a set of data by grouping together multiple statistics along two axes. Examples: Sales numbers by region and month, tasks by status and assignee, active users by age and location. Not the most visually stunning visualization, but highly informative and versatile.": [ - "Ponazori podatke na podlagi združevanja več statistik vzdolž dveh osi. Npr. prodaja po regijah in mesecih, opravila po statusih in izvajalcih, itd." + "TYPE \"OVERWRITE\" TO CONFIRM": ["VNESITE \"PREPIŠI\" ZA POTRDITEV"], + "Database Creation Error": ["Napaka pri ustvarjanju podatkovne baze"], + "Connect a database": ["Poveži se s podatkovno bazo"], + "Edit database": ["Uredi podatkovno bazo"], + "Connect this database using the dynamic form instead": [ + "S podatkovno bazo se povežite z dinamičnim obrazcem" ], - "Pivot Table v2": ["Vrtilna tabela v2"], - "search.num_records": ["search.num_records"], - "page_size.show": ["page_size.show"], - "page_size.entries": ["page_size.entries"], - "Totals": ["Vsote"], - "page_size.all": ["page_size.all"], - "Group By, Metrics or Percentage Metrics must have a value": [ - "Združevanje, Mera ali Procentualna mera morajo imeti vrednost" + "Click this link to switch to an alternate form that exposes only the required fields needed to connect this database.": [ + "Kliknite to povezavo za drugo vnosno formo, ki prikaže samo zahtevana polja za povezavo s podatkovno bazo." ], - "Query mode": ["Poizvedbeni način"], - "must have a value": ["mora imeti vrednost"], - "Percentage metrics": ["Procentualne mere"], - "Metrics for which percentage of total are to be displayed. Calculated from only data within the row limit.": [ - "Mera, za katero je prikazan odstotek od celote. Izračunan je samo iz podatkov znotraj omejitve števila vrstic." + "Select databases require additional fields to be completed in the Advanced tab to successfully connect the database. Learn what requirements your databases has ": [ + "Izbira podatkovnih baz za uspešno povezavo zahteva izpolnitev dodatnih polj v zavihku Napredno. Naučite se, kaj zahteva vaša podatkovna baza " ], - "Ordering": ["Razvrščanje"], - "Order results by selected columns": [ - "Razvrsti rezultate glede na izbrani stolpec" + "Import database from file": ["Uvozi podatkovno bazo iz datoteke"], + "Connect this database with a SQLAlchemy URI string instead": [ + "S to podatkovno bazo se raje povežite z SQLAlchemy URI nizom" ], - "Server pagination": ["Paginacija na strani strežnika"], - "Enable server side pagination of results (experimental feature)": [ - "Omogoči številčenje strani rezultatov na strani strežnika (preizkusna funkcija)" + "Click this link to switch to an alternate form that allows you to input the SQLAlchemy URL for this database manually.": [ + "Kliknite to povezavo za drugo vnosno formo, ki omogoča ročni vnos SQLAlchemy URL-ja za to podatkovno bazo." ], - "Server Page Length": ["Dolžina strani strežnika"], - "Rows per page, 0 means no pagination": [ - "Vrstic na stran (0 pomeni brez številčenja strani)" + "This can be either an IP address (e.g. 127.0.0.1) or a domain name (e.g. mydatabase.com).": [ + "To je lahko bodisi IP naslov (npr. 127.0.0.1) bodisi ime domene (npr. mydatabase.com)." ], - "Include time": ["Vključi čas"], - "Whether to include the time granularity as defined in the time section": [ - "Če želite vključiti granulacijo časa, ki je določena v sekciji Čas" + "e.g. 127.0.0.1": ["npr. 127.0.0.1"], + "Host": ["Gostitelj"], + "e.g. 5432": ["npr. 5432"], + "e.g. world_population": ["npr. world_population"], + "Copy the name of the database you are trying to connect to.": [ + "Kopirajte ime podatkovne baze, s katero se skušate povezati." ], - "Show total aggregations of selected metrics. Note that row limit does not apply to the result.": [ - "Prikaži skupno agregacijo izbrane mere. Omejitev števila vrstic ne vpliva na rezultat." + "e.g. Analytics": ["npr. Analitika"], + "e.g. ********": ["npr. ********"], + "Pick a nickname for this database to display as in Superset.": [ + "Izberite vzdevek za to podatkovno bazo, ki bo prikazan v Supersetu." ], - "Page length": ["Dolžina strani"], - "Search box": ["Iskalno polje"], - "Whether to include a client-side search box": [ - "Če želite vključiti iskalno polje za uporabnika" + "e.g. param1=value1¶m2=value2": ["npr. param1=value1¶m2=value2"], + "Additional Parameters": ["Dodatni parametri"], + "Add additional custom parameters": ["Dodaj dodatne parametre po meri"], + "SSL Mode \"require\" will be used.": [ + "Uporabljen bo SSL način tipa \"require\"." ], - "Cell bars": ["Stolp. graf v celicah"], - "Whether to align background charts with both positive and negative values at 0": [ - "Če želite poravnati graf v ozadju celic za negativne in pozitivne vrednosti okrog 0" + "Type of Google Sheets allowed": ["Dovoljeni tipi Googlovih preglednic"], + "Publicly shared sheets only": ["Samo javno deljene preglednice"], + "Public and privately shared sheets": [ + "Javno in zasebno deljene preglednice" ], - "Customize columns": ["Prilagodi stolpce"], - "Further customize how to display each column": [ - "Dodatne prilagoditve prikaza posameznih stolpcev" + "How do you want to enter service account credentials?": [ + "Kako želite vnesti prijavne podatke servisnega računa?" ], - "Apply conditional color formatting to numeric columns": [ - "Za numerične stolpce uporabi pogojno oblikovanje z barvami" + "Upload JSON file": ["Naloži JSON datoteko"], + "Copy and Paste JSON credentials": [ + "Kopiraj in prilepi JSON prijavne podatke" ], - "Classic row-by-column spreadsheet like view of a dataset. Use tables to showcase a view into the underlying data or to show aggregated metrics.": [ - "Standardna razpredelnica za prikaz podatkovnega seta." + "Service Account": ["Servisni račun"], + "Copy and paste the entire service account .json file here": [ + "Tukaj kopirajte in prilepite celotno json datoteko servisnega računa" ], - "Word Cloud": ["Oblak besed"], - "Minimum Font Size": ["Min. velikost pisave"], - "Font size for the smallest value in the list": [ - "Velikost pisave za najmanjšo vrednost na seznamu" + "Upload Credentials": ["Naloži prijavne podatke"], + "Use the JSON file you automatically downloaded when creating your service account.": [ + "Uporabite JSON datoteko, ki ste jo prenesli pri ustvarjanju servisnega računa." ], - "Maximum Font Size": ["Max. velikost pisave"], - "Font size for the biggest value in the list": [ - "Velikost pisave za največjo vrednost na seznamu" + "Connect Google Sheets as tables to this database": [ + "Googlove preglednice poveži s to podatkovno bazo kot tabele" ], - "Word Rotation": ["Vrtenje besed"], - "Rotation to apply to words in the cloud": [ - "Če želite vrtenje besed v oblaku" + "Google Sheet Name and URL": ["Ime Googlove preglednice in URL"], + "Enter a name for this sheet": ["Vnesite ime te preglednice"], + "Paste the shareable Google Sheet URL here": [ + "Prilepite deljeni URL Googlove preglednice sem" ], - "Visualizes the words in a column that appear the most often. Bigger font corresponds to higher frequency.": [ - "Prikaže besede v stolpcu, glede na pogostost pojavljanja. Večja pisava pomeni večjo frekvenco." + "Add sheet": ["Dodaj preglednico"], + "Copy the account name of that database you are trying to connect to.": [ + "Kopirajte ime računa podatkovne baze, s katero se skušate povezati." ], - "Scatter Plot": ["Raztreseni grafikon"], - "Hide Mini Map": ["Skrij majhen zemljevid"], - "Show Mini Map": ["Prikaži majhen zemljevid"], - "Choropleth Map": ["Koroplet zemljevid"], - "ChoroplethMap": ["ChoroplethMap"], - "Icicle Event Chart": ["Grafikon Icicle dogodkov"], - "deck.gl charts": ["grafikoni deck.gl"], - "Pick a set of deck.gl charts to layer on top of one another": [ - "Izberite nabor deck.gl grafikonov, ki bodo nanizani en na drugem" + "Add dataset": ["Dodaj podatkovni set"], + "Dataset imported": ["Podatkovni set uvožen"], + "An error occurred while fetching dataset related data": [ + "Napaka pri pridobivanju podatkov iz podatkovnega seta" ], - "Compose multiple layers together to form complex visuals.": [ - "Združi več plasti za oblikovanje kompleksnih vizualizacij." + "An error occurred while fetching dataset related data: %s": [ + "Napaka pri pridobivanju podatkov iz podatkovnega seta: %s" ], - "deck.gl Multiple Layers": ["deck.gl - Večplastni grafikon"], - "deckGL": ["deckGL"], - "Data has no time steps": ["Podatki nimajo časovnih korakov"], - "Start Longitude & Latitude": ["Začetna Dolž. in Širina"], - "Point to your spatial columns": [ - "Pokažite na stolpec z lokacijskimi podatki" + "Physical dataset": ["Fizičen podatkovni set"], + "Virtual dataset": ["Virtualen podatkovni set"], + "An error occurred while fetching dataset owner values: %s": [ + "Pri pridobivanju polja lastnik podatkovnega seta je prišlo do napake: %s" ], - "End Longitude & Latitude": ["Končna Dolž. in Širina"], - "Arc": ["Lok"], - "Target Color": ["Ciljna barva"], - "Color of the target location": ["Barva ciljne lokacije"], - "Categorical Color": ["Kategorična barva"], - "Pick a dimension from which categorical colors are defined": [ - "Izberite dimenzijo, ki bo določala kategorične barve" + "An error occurred while fetching datasets: %s": [ + "Prišlo je do napake pri pridobivanju podatkovnih setov: %s" ], - "Stroke Width": ["Debelina obrobe"], - "Plot the distance (like flight paths) between origin and destination.": [ - "Izriši razdalje (kot letalske koridorje) med izhodiščem in ciljem." + "An error occurred while fetching schema values: %s": [ + "Pri pridobivanju vrednosti shem je prišlo do napake: %s" ], - "deck.gl Arc": ["deck.gl - Lok"], - "3D": ["3D"], - "GeoJson Settings": ["GeoJson nastavitve"], - "Point Radius Scale": ["Skaliranje radija točk"], - "The GeoJsonLayer takes in GeoJSON formatted data and renders it as interactive polygons, lines and points (circles, icons and/or texts).": [ - "GeoJsonLayer uporablja podatke v formatu GeoJSON in jih izriše kot interaktivne poligone, črte in točke (krogi, ikone in/ali besedila)." + "Import datasets": ["Uvozi podatkovne sete"], + "There was an issue deleting the selected datasets: %s": [ + "Pri brisanju izbranih podatkovnih setov je prišlo do težave: %s" ], - "deck.gl Geojson": ["deck.gl - GeoJSON"], - "Metric used to control height": ["Mera za določanje višine"], - "Visualize geospatial data like 3D buildings, landscapes, or objects in grid view.": [ - "Prikaz geoprostorskih podatkov kot so 3D zgradbe, parcele ali objekti v mrežnem pogledu." + "The dataset %s is linked to %s charts that appear on %s dashboards. Are you sure you want to continue? Deleting the dataset will break those objects.": [ + "Podatkovni set %s je povezan z grafikoni %s, ki so prisotni na nadzorni plošči %s. Ali želite nadaljevati? Izbris podatkovnega seta bo pokvaril te objekte." ], - "deck.gl Grid": ["deck.gl - Mreža"], - "Dynamic Aggregation Function": ["Dinamična agregacijska funkcija"], - "The function to use when aggregating points into groups": [ - "Funkcija za agregacijo točk v skupine" + "Delete Dataset?": ["Izbrišem podatkovni set?"], + "Are you sure you want to delete the selected datasets?": [ + "Ali ste prepričani, da želite izbrisati izbrane podatkovne sete?" ], - "Overlays a hexagonal grid on a map, and aggregates data within the boundary of each cell.": [ - "Prikaže šestkotno mrežo na zemljevidu in agregira podatke znotraj meja vsake celice." + "0 Selected": ["Izbranih: 0"], + "%s Selected (Virtual)": ["Izbranih: %s (virtualni)"], + "%s Selected (Physical)": ["Izbranih: %s (fizični)"], + "%s Selected (%s Physical, %s Virtual)": [ + "Izbranih: %s (fizični: %s, virtualni: %s)" ], - "deck.gl 3D Hexagon": ["deck.gl - 3D HEX"], - "Visualizes connected points, which form a path, on a map.": [ - "Na zemljevidu prikaže povezane točke, ki tvorijo pot." + "The passwords for the databases below are needed in order to import them together with the datasets. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj s podatkovnimi seti. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če je to potrebno." ], - "deck.gl Path": ["deck.gl - Poti"], - "Polygon Column": ["Stolpec poligonov"], - "Polygon Encoding": ["Kodiranje poligonov"], - "Elevation": ["Višina"], - "Polygon Settings": ["Nastavitve poligonov"], - "Opacity, expects values between 0 and 100": [ - "Prosojnost, vnesite vrednosti med 0 in 100" + "You are importing one or more datasets that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "Uvažate enega ali več podatkovnih setov, ki že obstajajo. S prepisom lahko izgubite podatke. Ali ste prepričani, da želite prepisati?" ], - "Number of buckets to group data": [ - "Število razdelkov za združevanje podatkov" + "There was an issue previewing the selected query. %s": [ + "Pri predogledu izbrane poizvedbe je prišlo do težave. %s" ], - "How many buckets should the data be grouped in.": [ - "V koliko razdelkov bodo razvrščeni podatki." + "Duration: %s": ["Trajanje: %s"], + "Tab name": ["Naslov zavihka"], + "TABLES": ["TABELE"], + "Open query in SQL Lab": ["Odpri poizvedbo v SQL laboratoriju"], + "An error occurred while fetching database values: %s": [ + "Pri pridobivanju vrednosti podatkovne baze je prišlo do napake: %s" ], - "Bucket break points": ["Točke za razčlenitev razdelkov"], - "List of n+1 values for bucketing metric into n buckets.": [ - "Seznam n+1 vrednosti za mero razvrščanja v n razdelkov." + "An error occurred while fetching user values: %s": [ + "Pri pridobivanju vrednosti uporabnika je prišlo do napake: %s" ], - "Emit Filter Events": ["Prikaži dogodke filtrov"], - "Whether to apply filter when items are clicked": [ - "Če želite uporabiti filter, ko kliknete na elemente" + "Search by query text": ["Išči z besedilom poizvedbe"], + "Next": ["Naslednji"], + "Open in SQL Lab": ["Odpri v SQL laboratoriju"], + "User query": ["Uporabnikova poizvedba"], + "Executed query": ["Zagnana poizvedba"], + "The passwords for the databases below are needed in order to import them together with the saved queries. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj s shranjenimi poizvedbami. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če je to potrebno." ], - "Multiple filtering": ["Večkratno filtriranje"], - "Allow sending multiple polygons as a filter event": [ - "Dovoli pošiljanje več poligonov kot dogodek filtra" + "You are importing one or more saved queries that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "Uvažate eno ali več shranjenih poizvedb, ki že obstajajo. S prepisom lahko izgubite podatke. Ali ste prepričani, da želite prepisati?" ], - "Visualizes geographic areas from your data as polygons on a Mapbox rendered map. Polygons can be colored using a metric.": [ - "Prikaže geografsko območje kot poligone na zemljevidu zagotovljenim preko storitve Mapbox. Poligoni so lahko obarvani glede na mero." + "Query imported": ["Poizvedba uvožena"], + "There was an issue previewing the selected query %s": [ + "Do težave je prišlo pri predogledu izbrane poizvedbe %s" ], - "deck.gl Polygon": ["deck.gl - Poligon"], - "Point Size": ["Velikost točke"], - "Point Unit": ["Enota točke"], - "Minimum Radius": ["Min. polmer"], - "Minimum radius size of the circle, in pixels. As the zoom level changes, this insures that the circle respects this minimum radius.": [ - "Minimalni polmer kroga v pikslih. S tem je določen min. polmer kroga, ko se spreminja stopnja povečave." + "Import queries": ["Uvozi poizvedbe"], + "There was an issue deleting the selected queries: %s": [ + "Do težave je prišlo pri brisanju izbranih poizvedb: %s" ], - "Maximum Radius": ["Max. polmer"], - "Maxium radius size of the circle, in pixels. As the zoom level changes, this insures that the circle respects this maximum radius.": [ - "Maksimalni polmer kroga v pikslih. S tem je določen max. polmer kroga, ko se spreminja stopnja povečave." + "Edit query": ["Uredi poizvedbo"], + "Copy query URL": ["Kopiraj URL poizvedbe"], + "Export query": ["Izvozi poizvedbe"], + "Delete query": ["Izbriši poizvedbo"], + "This action will permanently delete the saved query.": [ + "S tem dejanjem boste trajno izbrisali shranjeno poizvedbo." ], - "Point Color": ["Barva točke"], - "A map that takes rendering circles with a variable radius at latitude/longitude coordinates": [ - "Zemljevid, ki na zemljepisnih koordinatah prikazuje kroge s spremenljivim polmerom" + "Delete Query?": ["Izbrišem poizvedbo?"], + "Are you sure you want to delete the selected queries?": [ + "Ali ste prepričani, da želite izbrisati izbrane poizvedbe?" ], - "deck.gl Scatterplot": ["deck.gl - Raztreseni grafikon"], - "Grid": ["Mreža"], - "Weight": ["Utež"], - "Metric used as a weight for the grid's coloring": [ - "Mera, ki služi kot utež za barvo mreže" + "queries": ["poizvedbe"], + "Query name": ["Ime poizvedbe"], + "[Untitled]": ["[Neimenovana]"], + "Unknown": ["Neznano"], + "Viewed %s": ["Ogledane %s"], + "Edited": ["Urejane"], + "Created": ["Ustvarjene"], + "Viewed": ["Ogledane"], + "Mine": ["Moje"], + "View All »": ["Poglejte vse »"], + "charts": ["grafikoni"], + "dashboards": ["nadzorne plošče"], + "recents": ["nedavne"], + "saved queries": ["shranjene poizvedbe"], + "No %(tableName)s yet": ["%(tableName)s še ni"], + "Recently viewed charts, dashboards, and saved queries will appear here": [ + "Nedavno ogledani grafikoni, nadzorne plošče in shranjene poizvedbe bodo prikazane tukaj" ], - "Aggregates data within the boundary of grid cells and maps the aggregated values to a dynamic color scale": [ - "Agregira podatke znotraj meja celic in agregiranim vrednostim pripiše barvno lestvico" + "Recently created charts, dashboards, and saved queries will appear here": [ + "Nedavno ustvarjeni grafikoni, nadzorne plošče in shranjene poizvedbe bodo prikazane tukaj" ], - "deck.gl Screen Grid": ["deck.gl - Mreža"], - "For more information about objects are in context in the scope of this function, refer to the": [ - "Za dodatne informacije o objektih v kontekstu te funkcije si oglejte" + "Example %(tableName)s will appear here": [ + "Primer %(tableName)s se bo prikazal tukaj" ], - " source code of Superset's sandboxed parser": [ - " izvorno kodo za Supersetov \"sandboxed parser\"" + "Recently edited charts, dashboards, and saved queries will appear here": [ + "Nedavno urejani grafikoni, nadzorne plošče in shranjene poizvedbe bodo prikazane tukaj" ], - "This functionality is disabled in your environment for security reasons.": [ - "Ta funkcionalnost je v vašem okolju onemogočena zaradi varnosti." + "SQL query": ["SQL poizvedba"], + "You don't have any favorites yet!": ["Priljubljenih še niste izbrali!"], + "See all %(tableName)s": ["Poglej vse %(tableName)s"], + "query": ["poizvedba"], + "Ran %s": ["Pretečeno %s"], + "There was an issue fetching your recent activity: %s": [ + "Pri pridobivanju vaše nedavne aktivnosti je prišlo do napake: %s" ], - "Ignore null locations": ["Izpusti prazne lokacije"], - "Whether to ignore locations that are null": [ - "Če ne želite upoštevati praznih (NULL) lokacij" + "There was an issue fetching your dashboards: %s": [ + "Prišlo je do napake pri pridobivanju nadzornih plošč: %s" ], - "Auto Zoom": ["Samodejna povečava"], - "When checked, the map will zoom to your data after each query": [ - "Če želite, da se zemljevid prilagodi vašim podatkom po vsaki poizvedbi" + "There was an issue fetching your chart: %s": [ + "Prišlo je do napake pri pridobivanju grafikona: %s" ], - "Dimension": ["Dimenzija"], - "Select a dimension": ["Izberite dimenzijo"], - "Extra data for JS": ["Dodatni podatki za JS"], - "List of extra columns made available in Javascript functions": [ - "Seznam dodatnih podatkov, ki so na razpolago v Javascript funkcijah" + "There was an issues fetching your saved queries: %s": [ + "Prišlo je do napake pri pridobivanju shranjenih poizvedb: %s" ], - "Javascript data interceptor": ["Javascript prestreznik podatkov"], - "Define a javascript function that receives the data array used in the visualization and is expected to return a modified version of that array. This can be used to alter properties of the data, filter, or enrich the array.": [ - "Določite Javascript funkcijo, ki sprejme podatkovni niz za vizualizacijo in vrne spremenjeno verzijo tega niza. Lahko se uporabi za spreminjanje lastnosti podatkov, filtra ali obogatitve niza." + "Recents": ["Nedavno"], + "Connect database": ["Poveži se s podatkovno bazo"], + "Connect Google Sheet": ["Povežite Googlovo preglednico"], + "Upload CSV to database": ["Naloži CSV v podatkovno bazo"], + "Upload columnar file to database": [ + "Naloži datoteko s stolpci v podatkovno bazo" ], - "Javascript tooltip generator": ["Javascript generator opisa orodja"], - "Define a function that receives the input and outputs the content for a tooltip": [ - "Določite funkcijo, ki sprejme vhodne podatke in vrne vsebino opisa orodja" + "Upload Excel file to database": [ + "Naloži Excel-ovo datoteko v podatkovno bazo" ], - "Javascript onClick href": ["Javascript onClick href"], - "Define a function that returns a URL to navigate to when user clicks": [ - "Določite funkcijo, ki vrne URL za navigacijo, ko uporabnik klikne" + "Enable 'Allow data upload' in any database's settings": [ + "Omogoči 'Dovoli nalaganje podatkov' za vse podatkovne baze" ], - "Legend Format": ["Oblika legende"], - "Choose the format for legend values": [ - "Izberite obliko vrednosti legende" + "About": ["O programu"], + "Powered by Apache Superset": ["Omogoča Apache Superset"], + "Documentation": ["Dokumentacija"], + "Report a bug": ["Sporočite napako"], + "Select start and end date": ["Izberite začetni in končni datum"], + "Type or Select [%s]": ["Vnesite ali izberite [%s]"], + "No results found": ["Rezultati niso najdeni"], + "Tools": ["Orodja"], + "Filter box": ["Izbirnik za filtriranje"], + "Chart component that lets you add a custom filter UI in your dashboard. When added to dashboard, a filter box lets users specify specific values or ranges to filter charts by. The charts that each filter box is applied to can be fine tuned as well in the dashboard view.\n\n Note that this plugin is being replaced with the new Filters feature that lives in the dashboard view itself. It's easier to use and has more capabilities!": [ + "Komponenta grafikona, ki omogoča dodajanje vmesnika filtrov po meri v nadzorno ploščo. Ko je dodana na nadzorno ploščo, lahko uporabnik določi poljubne vrednosti ali obsege filtrov. Grafikoni, na katere se nanašajo filtri, so lahko precizno izbrani tudi v pogledu nadzorne plošče.\n\n Vedite, da bo ta vtičnik v prihodnosti zamenjan z novim konceptom filtrov, ki bodo živeli v kontekstu same nadzorne plošče in bodo zmogljivejši ter enostavnejši za uporabo!" ], - "Legend Position": ["Položaj legende"], - "Choose the position of the legend": ["Izberite položaj legende"], - "Lines column": ["Stolpec črt"], - "The database columns that contains lines information": [ - "Stolpec v podatkovni bazi, ki vsebuje podatke črt" + "Filters configuration": ["Nastavitve filtrov"], + "Filter configuration for the filter box": ["Nastavitve za polje filtra"], + "Date filter": ["Filter po datumu"], + "Whether to include a time filter": [ + "Če želite vključiti časovni filter" ], - "The width of the lines": ["Debelina črt"], - "Fill Color": ["Barva polnila"], - " Set the opacity to 0 if you do not want to override the color specified in the GeoJSON": [ - " Nastavite prosojnost na 0, če želite obdržati barvo določeno v GeoJSON" + "Instant filtering": ["Takojšnje filtriranje"], + "Check to apply filters instantly as they change instead of displaying [Apply] button": [ + "Izberite za takojšnjo uporabo filtrov, ko se spremenijo, brez prikazovanja gumba Uveljavi" ], - "Stroke Color": ["Barva obrobe"], - "Filled": ["Zapolnjeno"], - "Whether to fill the objects": ["Če želite zapolniti objekte"], - "Stroked": ["Obrobljeno"], - "Whether to display the stroke": ["Če želite prikazati obrobe"], - "Extruded": ["Relief"], - "Grid Size": ["Velikost mreže"], - "Defines the grid size in pixels": ["Določa velikost mreže v pikslih"], - "Parameters related to the view and perspective on the map": [ - "Parametri povezani s pogledom in perspektivo zemljevida" + "Limit selector values": ["Omeji vrednosti izbirnikov"], + "These filters apply to the values available in the dropdowns": [ + "Ti filtri se nanašajo na vrednosti v spustnih seznamih" ], - "Longitude & Latitude": ["Dolžina in širina"], - "Fixed point radius": ["Fiksni radij točk"], - "Multiplier": ["Množitelj"], - "Factor to multiply the metric by": ["Faktor, s katerim množite mero"], - "Lines encoding": ["Kodiranje črt"], - "The encoding format of the lines": ["Oblika kodiranja črt"], - "Reverse Lat & Long": ["Zamenjaj Dolž. in Širino"], - "GeoJson Column": ["GeoJson stolpec"], - "Select the geojson column": ["Izberite geojson stolpec"], - "Kepler.gl": ["Kepler.gl"], - "List Users": ["Seznam uporabnikov"], - "List Roles": ["Seznam vlog"], - "Your user information": ["Vaše uporabniške informacije"], - "User info": ["Informacije o uporabniku"], - "User Name": ["Uporabniško ime"], - "Is Active?": ["Aktiven?"], - "Login count": ["Število prijav"], - "Personal Info": ["Osebne informacije"], - "First Name": ["Ime"], - "Last Name": ["Priimek"], - "Email": ["E-pošta"], - "Audit Info": ["Revizijske informacije"], - "Last login": ["Zadnja prijava"], - "Failed login count": ["Število neuspešnih prijav"], - "Changed by": ["Spremenil"], - "Reset Password": ["Ponastavi geslo"], - "Show User": ["Prikaži uporabnika"], - "Username valid for authentication on DB or LDAP, unused for OID auth": [ - "Uporabniško ime za DB ali LDAP avtentikacijo. Ni uporabljeno za OID avtentikacijo" - ], - "It's not a good policy to remove a user, just make it inactive": [ - "Izbris uporabnika ni dobra praksa, raje ga deaktivirajte" - ], - "The user's email, this will also be used for OID auth": [ - "Uporabnikov e-naslov, uporabljen bo tudi za OID avtentikacijo" - ], - "The user role on the application, this will associate with a list of permissions": [ - "Uporabnikova vloga v tej aplikaciji, povezana bo s seznamom dovoljenj" - ], - "User confirmation needed": ["Potrebna je potrditev s strani uporabnika"], - "You sure you want to delete this item?": [ - "Ste prepričani, da želite izbrisati ta vnos?" - ], - "Reset my password": ["Ponastavi geslo"], - "Reset Password Form": ["Obrazec za ponastavitev gesla"], - "Please use a good password policy, this application does not check this for you": [ - "Uporabite varno geslo. Ta aplikacija tega ne bo preverila" - ], - "Confirm Password": ["Potrdite geslo"], - "Please rewrite the password to confirm": [ - "Ponovno vpišite geslo za potrditev" + "URL": ["URL"], + "Templated link, it's possible to include {{ metric }} or other values coming from the controls.": [ + "Vzorčna povezava, vključiti je mogoče {{ metric }} ali drugo vrednost iz kontrolnikov." ], - "Back": ["Nazaj"], - "Edit User": ["Uredite uporabnika"], - "Edit User Information": ["Uredite informacije o uporabniku"], - "Write the user first name or names": ["Vpišite ime uporabnika"], - "Write the user last name": ["Vpišite priimek uporabnika"], - "Embed code": ["Vstavi kodo"], - "creator": ["avtor"], - "favorited": ["priljubljeno"], - "name": ["ime"], - "type": ["tip"], - "time": ["čas"], - "Toggle SortBy": ["Preklopite razvrščanje"], - "Page size": ["Velikost strani"], - "Edit record": ["Uredi zapis"], - "Delete record": ["Izbriši zapis"], - "Show record": ["Pokaži zapis"], - "Orientation": ["Postavitev"], - "Scroll": ["Drsnik"], - "Plain": ["Celotna"] + "Time-series Table": ["Tabela s časovno vrsto"], + "Compare multiple time series charts (as sparklines) and related metrics quickly.": [ + "Hitra primerjava več grafikonov časovnih vrst (sparkline način) in povezanih mer." + ], + "Text": ["Besedilo"], + "We have the following keys: %s": ["Imamo naslednje ključe: %s"] } } } diff --git a/superset/translations/sl/LC_MESSAGES/messages.po b/superset/translations/sl/LC_MESSAGES/messages.po index 2c9ad7bfcb09..c9b76c8afe8d 100644 --- a/superset/translations/sl/LC_MESSAGES/messages.po +++ b/superset/translations/sl/LC_MESSAGES/messages.po @@ -15,6817 +15,7831 @@ # under the License. msgid "" msgstr "" -"Project-Id-Version: Superset\n" +"Project-Id-Version: Superset\n" "Report-Msgid-Bugs-To: dkrat7 @github.com\n" -"POT-Creation-Date: 2021-12-08 12:22+0800\n" -"PO-Revision-Date: 2021-11-13 21:21+0100\n" +"POT-Creation-Date: 2022-06-19 18:59+0200\n" +"PO-Revision-Date: 2022-06-19 20:59+0200\n" "Last-Translator: dkrat7 <dkrat7 @github.com>\n" "Language: sl_SI\n" "Language-Team: \n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100>=3 " -"&& n%100<=4 ? 2 : 3)\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100>=3 && n" +"%100<=4 ? 2 : 3);\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.9.1\n" +"X-Generator: Poedit 2.3\n" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/Option.tsx:68 -#: superset-frontend/src/explore/components/controls/OptionControls/index.tsx:323 -#, fuzzy -msgid "" -"\n" -" This filter was inherited from the dashboard's context.\n" -" It won't be saved when saving the chart.\n" -" " -msgstr "" -"\r\n" -" Ta filter izvira iz konteksta nadzorne plošče.\r\n" -" Pri shranjevanju grafikona se ne bo shranil.\r\n" -" " +#: superset/errors.py:95 +msgid "The datasource is too large to query." +msgstr "Podatkovni vir je prevelik za poizvedbo." -#: superset/tasks/schedules.py:184 -#, python-format -msgid "" -"\n" -" <b><a href=\"%(url)s\">Explore in Superset</a></b><p></p>\n" -" <img src=\"cid:%(msgid)s\">\n" -" " -msgstr "" -"\n" -" <b><a href=\"%(url)s\">Razišči v Supersetu</a></b><p></p>\n" -" <img src=\"cid:%(msgid)s\">\n" -" " +#: superset/errors.py:96 +msgid "The database is under an unusual load." +msgstr "Podatkovni vir je neobičajno obremenjen." -#: superset/reports/notifications/email.py:60 -#, python-format -msgid "" -"\n" -" Error: %(text)s\n" -" " -msgstr "" -"\n" -" Napaka: %(text)s\n" -" " +#: superset/errors.py:97 +msgid "The database returned an unexpected error." +msgstr "Podatkovna baza je vrnila nepričakovano napako." -#: superset/tasks/schedules.py:159 -#, python-format +#: superset/errors.py:98 msgid "" -"\n" -" *%(name)s*\n" -"\n" -" <%(url)s|Explore in Superset>\n" -" " -msgstr "" -"\n" -" *%(name)s*\n" -"\n" -" <%(url)s|Razišči v Supersetu>\n" -" " +"There is a syntax error in the SQL query. Perhaps there was a misspelling or a " +"typo." +msgstr "V SQL-poizvedbi je sintaktična napaka. Mogoče ste se zatipkali." -#: superset/tasks/schedules.py:372 -#, python-format -msgid "" -"\n" -" *%(slice_name)s*\n" -"\n" -" <%(slice_url_user_friendly)s|Explore in Superset>\n" -" " -msgstr "" -"\n" -" *%(slice_name)s*\n" -"\n" -" <%(slice_url_user_friendly)s|Razišči v Supersetu>\n" -" " +#: superset/errors.py:102 +msgid "The column was deleted or renamed in the database." +msgstr "Stolpec je bil izbrisan ali preimenovan v podatkovni bazi." -#: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:122 -msgid " (excluded)" -msgstr "" +#: superset/errors.py:103 +msgid "The table was deleted or renamed in the database." +msgstr "Tabela je bila izbrisana ali preimenovana v podatkovni bazi." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:235 -msgid " expression which needs to adhere to the " -msgstr " , ki mora upoštevati " +#: superset/errors.py:104 +msgid "One or more parameters specified in the query are missing." +msgstr "En ali več parametrov v SQL-poizvedbi manjka." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:239 -#, fuzzy -msgid "" -" standard to ensure that the lexicographical ordering\n" -" coincides with the chronological ordering. If the\n" -" timestamp format does not adhere to the ISO 8601 " -"standard\n" -" you will need to define an expression and type for\n" -" transforming the string into a date or timestamp. " -"Note\n" -" currently time zones are not supported. If time is " -"stored\n" -" in epoch format, put `epoch_s` or `epoch_ms`. If no" -" pattern\n" -" is specified we fall back to using the optional " -"defaults on a per\n" -" database/column name level via the extra parameter." -msgstr "" -" standard, ki zagotavlja, de se leksikografsko razvrščanje\r\n" -" sklada s kronološkim razvrščanjem. Če oblika\r\n" -" časovne značke ni v skladu s standardom ISO 8601," -"\r\n" -" boste morali definirati izraz in tip za " -"transformacijo\r\n" -" znakovnega niza v datum ali časovno značko.\r\n" -" Trenutno časovni pasovi niso podprti.\r\n" -" Če je čas shranjen v obliki epohe, dodajte " -"`epoch_s` ali `epoch_ms`.\r\n" -" Če ni podan vzorec, se uporabijo privzete vrednosti" -" na podlagi imena\r\n" -" podatkovne baze oz. stolpca s pomočjo dodatnega " -"parametra." - -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:111 -msgid "!= (Is not equal)" -msgstr "!= (ni enako)" +#: superset/errors.py:105 +msgid "The hostname provided can't be resolved." +msgstr "Imena gostitelja ni mogoče razrešiti." -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:125 -#, fuzzy -msgid "" -"${tableName\n" -" .split('')\n" -" .slice(0, tableName.length - 1)\n" -" .join('')}\n" -" " -msgstr "" -"${tableName\r\n" -" .split('')\r\n" -" .slice(0, tableName.length - 1)\r\n" -" .join('')}\r\n" -" " +#: superset/errors.py:106 +msgid "The port is closed." +msgstr "Vrata so zaprta." -#: superset/security/analytics_db_safety.py:44 -#, python-format -msgid "%(dialect)s cannot be used as a data source for security reasons." -msgstr "" -"%(dialect)s ni mogoče uporabiti kot podatkovni vir zaradi varnostnih " -"razlogov." +#: superset/errors.py:107 +msgid "The host might be down, and can't be reached on the provided port." +msgstr "Gostitelj mogoče ne deluje in ga ni mogoče doseči preko podanih vrat." -#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:84 -#, fuzzy, python-format -msgid "" -"%(message)s\n" -"This may be triggered by: \n" -"%(issues)s" -msgstr "To je lahko sproženo z/s:" +#: superset/errors.py:108 +msgid "Superset encountered an error while running a command." +msgstr "Superset je naletel na napako pri izvajanju ukaza." -#: superset/reports/notifications/email.py:122 superset/tasks/schedules.py:364 -#, python-format -msgid "%(name)s.csv" -msgstr "%(name)s.csv" +#: superset/errors.py:109 +msgid "Superset encountered an unexpected error." +msgstr "Superset je naletel na nepričakovano napako." -#: superset/db_engine_specs/snowflake.py:99 -#, python-format -msgid "%(object)s does not exist in this database." -msgstr "%(object)s ne obstaja v tej podatkovni bazi." +#: superset/errors.py:110 +msgid "The username provided when connecting to a database is not valid." +msgstr "Uporabniško ime za povezavo s podatkovno bazo je neveljavno." -#: superset/reports/notifications/email.py:126 superset/tasks/schedules.py:296 -#: superset/tasks/schedules.py:465 -#, python-format -msgid "%(prefix)s %(title)s" -msgstr "%(prefix)s %(title)s" +#: superset/errors.py:111 +msgid "The password provided when connecting to a database is not valid." +msgstr "Geslo za povezavo s podatkovno bazo je neveljavno." -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:635 -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:642 -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:656 -#, python-format -msgid "%(rows)d rows returned" -msgstr "%(rows)d vrnjenih vrstic" +#: superset/errors.py:112 +msgid "Either the username or the password is wrong." +msgstr "Uporabniško ime ali/in geslo sta napačna." -#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:93 -#, fuzzy, python-format -msgid "" -"%(subtitle)s\n" -"This may be triggered by:\n" -" %(issue)s" -msgstr "To je lahko sproženo z/s:" +#: superset/errors.py:113 +msgid "Either the database is spelled incorrectly or does not exist." +msgstr "Ime podatkovne baze je zapisano napačno ali pa ne obstaja." -#: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:88 -#, python-format -msgid "%(suggestion)s instead of \"%(undefinedParameter)s?\"" -msgstr "%(suggestion)s namesto \"%(undefinedParameter)s?\"" +#: superset/errors.py:114 +msgid "The schema was deleted or renamed in the database." +msgstr "Shema je bila izbrisana ali preimenovana v podatkovni bazi." -#: superset/views/core.py:366 -#, python-format -msgid "" -"%(user)s was granted the role %(role)s that gives access to the " -"%(datasource)s" +#: superset/errors.py:115 +msgid "User doesn't have the proper permissions." +msgstr "Uporabnik nima ustreznih dovoljenj." + +#: superset/errors.py:116 +msgid "One or more parameters needed to configure a database are missing." +msgstr "En ali več parametrov, potrebnih za nastavitev podatkovne baze, manjka." + +#: superset/errors.py:117 +msgid "The submitted payload has the incorrect format." +msgstr "Podani podatki so v neustrezni obliki." + +#: superset/errors.py:118 +msgid "The submitted payload has the incorrect schema." +msgstr "Podani podatki imajo neustrezno shemo." + +#: superset/errors.py:119 +msgid "Results backend needed for asynchronous queries is not configured." msgstr "" -"Uporabniku %(user)s je bila dodeljena vloga %(role)s, ki omogoča dostop " -"do %(datasource)s" +"Zaledni sistem za rezultate, potreben za asinhrone poizvedbe, ni konfiguriran." -#: superset/views/core.py:2773 -#, python-format -msgid "%(user)s's profile" -msgstr "Profil uporabnika: %(user)s" +#: superset/errors.py:120 +msgid "Database does not allow data manipulation." +msgstr "Podatkovna baza ne dovoljuje manipulacije podatkov." -#: superset/views/core.py:2442 -#, python-format +#: superset/errors.py:121 msgid "" -"%(validator)s was unable to check your query.\n" -"Please recheck your query.\n" -"Exception: %(ex)s" +"The CTAS (create table as select) doesn't have a SELECT statement at the end. " +"Please make sure your query has a SELECT as its last statement. Then, try running " +"your query again." msgstr "" -"%(validator)s ni mogel preveriti vaše poizvedbe.\n" -"Ponovno preverite poizvedbo.\n" -"Izjema: %(ex)s" +"CTAS (create table as select) na koncu nima SELECT stavka. Poskrbite, da bo v " +"poizvedbi SELECT zadnji stavek. Potem ponovno poženite poizvedbo." -#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:170 -#, python-format -msgid "%s - untitled" -msgstr "%s - neimenovan" +#: superset/errors.py:126 +msgid "CVAS (create view as select) query has more than one statement." +msgstr "CVAS (create view as select) poizvedba ima več kot en stavek." -#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:90 -#, python-format -msgid "%s Error" -msgstr "%s napaka" +#: superset/errors.py:127 +msgid "CVAS (create view as select) query is not a SELECT statement." +msgstr "CVAS (create view as select) poizvedba ni SELECT stavek." -#: superset-frontend/src/components/ListView/ListView.tsx:244 -#, python-format -msgid "%s Selected" -msgstr "Izbranih: %s" +#: superset/errors.py:128 +msgid "Query is too complex and takes too long to run." +msgstr "Poizvedba je prekompleksna in se izvaja predolgo." -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:685 -#, python-format -msgid "%s Selected (%s Physical, %s Virtual)" -msgstr "Izbranih: %s (fizični: %s, virtualni: %s)" +#: superset/errors.py:129 +msgid "The database is currently running too many queries." +msgstr "Podatkovna baza trenutno izvaja preveč poizvedb." -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:678 -#, python-format -msgid "%s Selected (Physical)" -msgstr "Izbranih: %s (fizični)" +#: superset/errors.py:130 +msgid "One or more parameters specified in the query are malformatted." +msgstr "En ali več parametrov v SQL-poizvedbi ima napačno obliko." -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:671 -#, python-format -msgid "%s Selected (Virtual)" -msgstr "Izbranih: %s (virtualni)" +#: superset/errors.py:131 +msgid "The object does not exist in the given database." +msgstr "Objekt ne obstaja v podani podatkovni bazi." -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:311 -#, python-format -msgid "%s aggregates(s)" -msgstr "Agreg. funkcije: %s" +#: superset/errors.py:132 +msgid "The query has a syntax error." +msgstr "Poizvedba ima sintaktično napako." -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:249 -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:270 -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:286 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:302 -#, python-format -msgid "%s column(s)" -msgstr "Stolpci: %s" +#: superset/errors.py:133 +msgid "The results backend no longer has the data from the query." +msgstr "Zaledni sistem rezultatov nima več podatkov iz poizvedbe." -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:276 -#, python-format -msgid "%s column(s) and metric(s)" -msgstr "Stolpcev in mer: %s" +#: superset/errors.py:134 +msgid "The query associated with the results was deleted." +msgstr "Poizvedba, povezana z rezultati, je bila izbrisana." -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:297 -#, python-format -msgid "%s operator(s)" -msgstr "Operatorji: %s" +#: superset/errors.py:135 +msgid "" +"The results stored in the backend were stored in a different format, and no " +"longer can be deserialized." +msgstr "" +"Rezultati v zalednem sistemu so bili shranjeni v drugačni obliki in jih ni več " +"mogoče deserializirati." -#: superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx:83 -#: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:256 -#: superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx:82 -#: superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx:92 -#, python-format -msgid "%s option" -msgstr "%s možnost" +#: superset/errors.py:139 +msgid "The port number is invalid." +msgstr "Številka vrat je neveljavna." -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:252 -#, python-format -msgid "%s option(s)" -msgstr "Možnosti: %s" +#: superset/errors.py:140 superset/sqllab/sql_json_executer.py:190 +msgid "Failed to start remote query on a worker." +msgstr "Na delavcu ni bilo mogoče zagnati oddaljene poizvedbe." + +#: superset/errors.py:141 +msgid "The database was deleted." +msgstr "Podatkovna baza je bila izbrisana." + +#: superset/connectors/sqla/utils.py:175 superset/errors.py:142 +msgid "Custom SQL fields cannot contain sub-queries." +msgstr "Prilagojena SQL-polja ne smejo vsebovati podpoizvedb." + +#: superset/databases/schemas.py:173 superset/exceptions.py:188 +msgid "Invalid certificate" +msgstr "Neveljaven certifikat" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:320 +#: superset/jinja_context.py:348 #, python-format -msgid "%s saved metric(s)" -msgstr "Shranjene mere: %s" +msgid "Unsafe return type for function %(func)s: %(value_type)s" +msgstr "Nevaren tip rezultata, ki ga vrne funkcija %(func)s: %(value_type)s" -#: superset-frontend/src/components/URLShortLinkButton/index.jsx:59 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:123 +#: superset/jinja_context.py:359 #, python-format -msgid "%s%s" -msgstr "%s%s" +msgid "Unsupported return value for method %(name)s" +msgstr "Nepodprt rezultat vračanja za metodo %(name)s" -#: superset-frontend/src/components/ListView/ListView.tsx:419 -#: superset-frontend/src/components/TableView/TableView.tsx:237 +#: superset/jinja_context.py:375 #, python-format -msgid "%s-%s of %s" -msgstr "%s-%s od %s" +msgid "Unsafe template value for key %(key)s: %(value_type)s" +msgstr "Nevaren vzorec za ključ %(key)s: %(value_type)s" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitleContainer.tsx:110 -msgid "(Removed)" -msgstr "(Odstranjeno)" +#: superset/jinja_context.py:386 +#, python-format +msgid "Unsupported template value for key %(key)s" +msgstr "Nepodprta vrednost vzorca za ključ %(key)s" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:637 -msgid "(deleted)" -msgstr "(izbrisano)" +#: superset/sql_lab.py:225 +msgid "Only SELECT statements are allowed against this database." +msgstr "Za to podatkovno bazo so dovoljeni le `SELECT` stavki." -#: superset-frontend/src/utils/getClientErrorObject.ts:56 -msgid "(no description, click to see stack trace)" -msgstr "(ni opisa, kliknite za ogled zapisov)" - -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:168 +#: superset/sql_lab.py:294 +#, python-format msgid "" -"(optional) default value for the filter, when using the multiple option, " -"you can use a semicolon-delimited list of options." +"The query was killed after %(sqllab_timeout)s seconds. It might be too complex, " +"or the database might be under heavy load." msgstr "" -"(opcijsko) privzeta vrednost za filter, če uporabite opcijo izbire večih " -", lahko uporabite seznam nastavitev ločen s podpičji." +"Poizvedba je bila ustavljena po %(sqllab_timeout)s sekundah. Lahko je " +"prekompleksna ali pa je podatkovna baza preobremenjena." -#: superset/reports/notifications/slack.py:50 -#, python-format +#: superset/sql_lab.py:404 superset/views/core.py:2178 +msgid "Results backend is not configured." +msgstr "Zaledni sistem rezultatov ni konfiguriran." + +#: superset/sql_lab.py:434 msgid "" -"*%(name)s*\n" -"\n" -"%(description)s\n" -"\n" -"<%(url)s|Explore in Superset>\n" -"\n" -"%(table)s\n" +"CTAS (create table as select) can only be run with a query where the last " +"statement is a SELECT. Please make sure your query has a SELECT as its last " +"statement. Then, try running your query again." msgstr "" -"*%(name)s*\n" -"\n" -"%(description)s\n" -"\n" -"<%(url)s|Razišči v Supersetu>\n" -"\n" -"%(table)s\n" +"CTAS (create table as select) lahko izvajate le v poizvedbah, kjer je zadnji " +"stavek SELECT. Poskrbite, da bo zadnji stavek v vaši poizvedbi SELECT in " +"poskusite ponovno zagnati poizvedbo." -#: superset/reports/notifications/slack.py:67 -#, python-format +#: superset/sql_lab.py:451 msgid "" -"*%(name)s*\n" -"\n" -"%(description)s\n" -"\n" -"Error: %(text)s\n" +"CVAS (create view as select) can only be run with a query with a single SELECT " +"statement. Please make sure your query has only a SELECT statement. Then, try " +"running your query again." msgstr "" -"*%(name)s*\n" -"\n" -"%(description)s\n" -"\n" -"napaka: %(text)s\n" +"CVAS (create view as select) lahko izvajate le v poizvedbah z enim SELECT " +"stavkom. Poskrbite, da bo v vaši poizvedbi le en SELECT stavek in poskusite " +"ponovno zagnati poizvedbo." -#: superset-frontend/src/explore/components/SaveModal.tsx:35 -msgid "**Select** a dashboard OR **create** a new one" -msgstr "**Izberite** nadzorno ploščo ALI **ustvarite** novo" +#: superset/viz.py:140 +msgid "Viz is missing a datasource" +msgstr "Vizualizaciji manjka podatkovni vir" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:260 +#: superset/viz.py:244 msgid "" -"-- Note: Unless you save your query, these tabs will NOT persist if you " -"clear your cookies or change browsers.\n" -"\n" +"Applied rolling window did not return any data. Please make sure the source query " +"satisfies the minimum periods defined in the rolling window." msgstr "" +"Izbrano drseče okno ni vrnilo podatkov. Poskrbite, da izvorna poizvedba ustreza " +"minimalni periodi drsečega okna." -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:668 -msgid "0 Selected" -msgstr "Izbranih: 0" - -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:35 -msgid "1 hour" -msgstr "1 ura" +#: superset/utils/date_parser.py:267 superset/viz.py:383 +msgid "From date cannot be larger than to date" +msgstr "Začetni datum ne sme biti večji od končnega datuma" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:32 -msgid "1 minute" -msgstr "1 minuta" +#: superset/viz.py:554 +msgid "Cached value not found" +msgstr "Predpomnjena vrednost ni najdena" -#: superset/db_engine_specs/base.py:91 -msgid "10 minute" -msgstr "10 minut" +#: superset/common/query_context_processor.py:121 superset/viz.py:569 +#, python-format +msgid "Columns missing in datasource: %(invalid_columns)s" +msgstr "V podatkovnem viru manjkajo stolpci: %(invalid_columns)s" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:30 -msgid "10 seconds" -msgstr "10 sekund" +#: superset/viz.py:690 +msgid "Table View" +msgstr "Tabelarični pogled" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:37 -msgid "12 hours" -msgstr "12 ur" +#: superset/viz.py:715 +msgid "" +"You cannot use [Columns] in combination with [Group By]/[Metrics]/[Percentage " +"Metrics]. Please choose one or the other." +msgstr "" +"Ne smete uporabiti [Stolpci] v kombinaciji z [Združevanje]/[Mere]/[Procentualne " +"mere]. Izberite eno ali drugo." -#: superset/db_engine_specs/base.py:92 -msgid "15 minute" -msgstr "15 minut" +#: superset/viz.py:761 +msgid "Pick a granularity in the Time section or uncheck 'Include Time'" +msgstr "Izberite granulacijo v razdelku 'Čas' ali odstranite 'Vključi čas'" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:38 -msgid "24 hours" -msgstr "24 ur" +#: superset/viz.py:841 +msgid "Time Table View" +msgstr "Pogled urnika" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:32 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:35 -msgid "2D" -msgstr "2D" +#: superset/viz.py:849 superset/viz.py:1805 +msgid "Pick at least one metric" +msgstr "Izberite vsaj eno mero" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:116 -msgid "3 letter code of the country" -msgstr "Tričrkovna oznaka države" +#: superset/viz.py:853 +msgid "When using 'Group By' you are limited to use a single metric" +msgstr "Ko uporabljate 'Group By', ste omejeni na uporabo ene mere" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:128 -msgid "30 days" -msgstr "30 dni" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:30 +#: superset/viz.py:886 +msgid "Pivot Table" +msgstr "Vrtilna tabela" -#: superset/db_engine_specs/base.py:93 -msgid "30 minute" -msgstr "30 minut" +#: superset/viz.py:903 +msgid "Please choose at least one 'Group by' field " +msgstr "Izberite vsaj eno 'Group by' polje " -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:34 -msgid "30 minutes" -msgstr "30 minut" +#: superset/viz.py:915 +msgid "Please choose at least one metric" +msgstr "Izberite vsaj eno mero" -#: superset/db_engine_specs/base.py:88 -msgid "30 second" -msgstr "30 sekund" +#: superset/viz.py:919 +msgid "Group By' and 'Columns' can't overlap" +msgstr "'Združevanje' in 'Stolpci' se ne smeta prekrivati" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:31 -msgid "30 seconds" -msgstr "30 sekund" +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:40 +#: superset/viz.py:1027 +msgid "Treemap" +msgstr "Drevesni grafikon s pravokotniki" -#: superset/db_engine_specs/base.py:90 -msgid "5 minute" -msgstr "5 minut" +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:30 +#: superset/viz.py:1072 +msgid "Calendar Heatmap" +msgstr "Koledarska barvna lestvica" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:33 -msgid "5 minutes" -msgstr "5 minut" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:30 +#: superset/viz.py:1163 +msgid "Bubble Chart" +msgstr "Mehurčkasti grafikon" -#: superset/db_engine_specs/base.py:87 -msgid "5 second" -msgstr "5 sekund" +#: superset/viz.py:1185 +msgid "Please use 3 different metric labels" +msgstr "Uporabite 3 različne oznake mer" -#: superset/db_engine_specs/base.py:95 -msgid "6 hour" -msgstr "6 ur" +#: superset/viz.py:1187 +msgid "Pick a metric for x, y and size" +msgstr "Izberite mere za x, y in velikost" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:36 -msgid "6 hours" -msgstr "6 ur" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:30 +#: superset/viz.py:1214 +msgid "Bullet Chart" +msgstr "'Bullet' grafikon" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:132 -msgid "60 days" -msgstr "60 dni" +#: superset/viz.py:1226 +msgid "Pick a metric to display" +msgstr "Izberite mero za prikaz" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:136 -msgid "90 days" -msgstr "90 dni" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:36 +#: superset/viz.py:1244 +msgid "Big Number with Trendline" +msgstr "Velika številka s trendno krivuljo" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:49 -msgid ":" -msgstr ":" +#: superset/viz.py:1252 superset/viz.py:1286 +msgid "Pick a metric!" +msgstr "Izberite mero!" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:86 -msgid "< (Smaller than)" -msgstr "< (manjše kot)" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:37 +#: superset/viz.py:1278 +msgid "Big Number" +msgstr "Velika številka" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:96 -msgid "<= (Smaller or equal)" -msgstr "<= (manjše ali enako)" +#: superset/viz.py:1300 +msgid "Time Series - Line Chart" +msgstr "Časovna vrsta - Črtni grafikon" -#: superset/tasks/schedules.py:171 superset/tasks/schedules.py:365 -#, python-format -msgid "<b><a href=\"%(url)s\">Explore in Superset</a></b><p></p>" -msgstr "<b><a href=\"%(url)s\">Razišči v Supersetu</a></b><p></p>" +#: superset/viz.py:1382 superset/viz.py:1645 +msgid "Pick a time granularity for your time series" +msgstr "Izberite granulacijo časa za časovno vrsto" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:106 -msgid "== (Is equal)" -msgstr "== (je enako)" +#: superset/common/query_context_processor.py:272 superset/viz.py:1439 +msgid "" +"An enclosed time range (both start and end) must be specified when using a Time " +"Comparison." +msgstr "" +"Pri časovni primerjavi mora biti določeno zaprto časovno obdobje (s časom začetka " +"in konca)." -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:91 -msgid "> (Larger than)" -msgstr "> (večje kot)" +#: superset/viz.py:1510 +msgid "Time Series - Multiple Line Charts" +msgstr "Časovna vrsta - Veččrtni grafikon" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:101 -msgid ">= (Larger or equal)" -msgstr ">= (večje ali enako)" +#: superset/viz.py:1588 +msgid "Time Series - Dual Axis Line Chart" +msgstr "Časovna vrsta - Črtni grafikon z dvojno osjo" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:35 -msgid "A Big Number" -msgstr "Velika številka" +#: superset/viz.py:1597 +msgid "Pick a metric for left axis!" +msgstr "Izberite mero za levo os!" -#: superset/views/alerts.py:195 -msgid "" -"A SQL statement that defines whether the alert should get triggered or " -"not. The query is expected to return either NULL or a number value." -msgstr "" -"SQL izraz, ki definira ali naj se opozorilo sproži ali ne. Od poizvedbe " -"se pričakuje, da vrne bodisi NULL bodisi številsko vrednost." +#: superset/viz.py:1599 +msgid "Pick a metric for right axis!" +msgstr "Izberite mero za desno os!" -#: superset/views/database/forms.py:204 superset/views/database/forms.py:341 -msgid "A comma separated list of columns that should be parsed as dates." -msgstr "Z vejico ločen seznam stolpcev, v katerih bodo prepoznani datumi." +#: superset/viz.py:1602 +msgid "Please choose different metrics on left and right axis" +msgstr "Izberite različni meri za levo in desno os" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:383 -msgid "A comma-separated list of schemas that CSVs are allowed to upload to." -msgstr "Z vejicami ločen seznam shem, kjer je dovoljeno nalaganje CSV-jev." +#: superset/viz.py:1662 +msgid "Time Series - Bar Chart" +msgstr "Časovna vrsta - Stolpčni grafikon" -#: superset/databases/commands/exceptions.py:42 -msgid "A database with the same name already exists." -msgstr "Podatkovna baza z enakim imenom že obstaja." +#: superset/viz.py:1671 +msgid "Time Series - Period Pivot" +msgstr "Časovna vrsta - Vrtenje period" -#: superset/views/dynamic_plugins.py:52 -msgid "" -"A full URL pointing to the location of the built plugin (could be hosted " -"on a CDN for example)" -msgstr "" -"Celoten URL, ki kaže na lokacijo zgrajenega vtičnika (lahko gostuje npr. " -"na CDN)" +#: superset/viz.py:1717 +msgid "Time Series - Percent Change" +msgstr "Časovna vrsta - Procentualna sprememba" -#: superset/views/dynamic_plugins.py:47 -msgid "A human-friendly name" -msgstr "Človeku prijazno ime" +#: superset/viz.py:1725 +msgid "Time Series - Stacked" +msgstr "Časovna vrsta - Naložen graf" -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:300 -msgid "A list of users who can alter the chart. Searchable by name or username." -msgstr "" -"Seznam uporabnikov, ki lahko spreminjajo ta grafikon. Možno je iskanje po" -" imenu ali uporabniškem imenu." +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:37 +#: superset/viz.py:1735 +msgid "Histogram" +msgstr "Histogram" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:29 -msgid "A map of the world, that can indicate values in different countries." -msgstr "Zemljevid sveta, ki lahko prikazuje vrednosti po državah." +#: superset/viz.py:1744 +msgid "Must have at least one numeric column specified" +msgstr "Definiran mora biti vsaj en numerični stolpec" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:161 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:209 -#: superset-frontend/src/explore/controls.jsx:238 -msgid "A metric to use for color" -msgstr "Mera za barvo" +#: superset/viz.py:1793 +msgid "Distribution - Bar Chart" +msgstr "Porazdelitev - Stolpčni grafikon" -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:26 -msgid "" -"A polar coordinate chart where the circle is broken into wedges of equal " -"angle, and the value represented by any wedge is illustrated by its area," -" rather than its radius or sweep angle." -msgstr "" -"Grafikon s polarnimi koordinatami, kjer je krog razdeljen na enakokotne " -"izseke, vrednosti pa so ponazorjene s ploščino izseka (namesto polmera " -"ali kota)." +#: superset/viz.py:1802 +msgid "Can't have overlap between Series and Breakdowns" +msgstr "Ne sme imeti prekrivanja med podatkovnimi serijami in členitvami" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:523 -msgid "A readable URL for your dashboard" -msgstr "Berljiv URL za vašo nadzorno ploščo" +#: superset/viz.py:1807 +msgid "Pick at least one field for [Series]" +msgstr "Izberite vsaj eno polje za [Serije]" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:39 -#: superset-frontend/src/explore/controls.jsx:113 -msgid "A reference to the [Time] configuration, taking granularity into account" -msgstr "Sklic na nastavitve za [Čas], ki upošteva granulacijo" +#: superset/viz.py:1880 +msgid "Sunburst" +msgstr "Sunburst" -#: superset/views/alerts.py:189 -msgid "A semicolon ';' delimited list of email addresses" -msgstr "S podpičjem ';' ločen seznam naslovov e-pošte" +#: superset/viz.py:1927 +msgid "Sankey" +msgstr "Sankey" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:789 -#: superset/connectors/sqla/views.py:469 -msgid "" -"A set of parameters that become available in the query using Jinja " -"templating syntax" -msgstr "" -"Nabor parametrov, ki postanejo razpoložljivi za poizvedbo z uporabo " -"sintakse za Jinja predloge" +#: superset/viz.py:1935 +msgid "Pick exactly 2 columns as [Source / Target]" +msgstr "Izberite natanko dva stolpca za [Izvor / Cilj]" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:32 +#: superset/viz.py:1984 msgid "" -"A time series chart that visualizes how a related metric from multiple " -"groups vary over time. Each group is visualized using a different color." -msgstr "" -"Grafikon časovne vrste, ki prikaže kako se povezane mere skupin " -"spreminjajo skozi čas. Vsaka skupina je prikazana s svojo barvo." +"There's a loop in your Sankey, please provide a tree. Here's a faulty link: {}" +msgstr "V 'Sankey' je zanka, določite drevo. To je okvarjena povezava: {}" -#: superset/reports/commands/exceptions.py:198 -msgid "A timeout occurred while executing the query." -msgstr "Pri izvajanju poizvedbe je potekel čas." +#: superset/viz.py:1997 +msgid "Directed Force Layout" +msgstr "Izgled usmerjene sile" -#: superset/reports/commands/exceptions.py:206 -msgid "A timeout occurred while generating a csv." -msgstr "Pri ustvarjanju csv je potekel čas." - -#: superset/reports/commands/exceptions.py:210 -msgid "A timeout occurred while generating a dataframe." -msgstr "Pri ustvarjanju podatkovnega okvira je potekel čas." - -#: superset/reports/commands/exceptions.py:202 -msgid "A timeout occurred while taking a screenshot." -msgstr "Pri ustvarjanju zaslonske slike je potekel čas." +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:30 +#: superset/viz.py:2036 +msgid "Country Map" +msgstr "Zemljevid držav" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:168 -msgid "A valid color scheme is required" -msgstr "Zahtevana je veljavna barvna shema" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:33 +#: superset/viz.py:2071 +msgid "World Map" +msgstr "Zemljevid sveta" -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:344 -msgid "APPLY" -msgstr "UPORABI" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:95 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:508 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx:88 +#: superset-frontend/src/explore/controls.jsx:462 superset/viz.py:2134 +msgid "Filters" +msgstr "Filtri" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:94 -msgid "APR" -msgstr "APR" +#: superset/viz.py:2152 +msgid "Invalid filter configuration, please select a column" +msgstr "Neveljavna nastavitev filtrov, izberite stolpec" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:239 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:404 -msgid "AQE" -msgstr "AQE" +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:30 +#: superset/viz.py:2211 +msgid "Parallel Coordinates" +msgstr "Vzporedne koordinate" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:98 -msgid "AUG" -msgstr "AVG" +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:38 +#: superset/viz.py:2241 +msgid "Heatmap" +msgstr "Toplotni prikaz" -#: superset-frontend/src/components/Menu/MenuRight.tsx:176 -msgid "About" -msgstr "O programu" +#: superset/viz.py:2302 +msgid "Horizon Charts" +msgstr "Horizontni grafikon" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:354 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:397 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:287 -msgid "Access" -msgstr "Dostop" +#: superset/viz.py:2314 +msgid "Mapbox" +msgstr "Mapbox" -#: superset/initialization/__init__.py:491 -msgid "Access requests" -msgstr "Zahteve za dostop" +#: superset/viz.py:2328 +msgid "[Longitude] and [Latitude] must be set" +msgstr "[Zemljepisna dolžina] in [Zemljepisna širina] morata biti nastavljeni" -#: superset/views/core.py:300 -msgid "Access was requested" -msgstr "Zahtevan je bil dostop" +#: superset/viz.py:2338 +msgid "Must have a [Group By] column to have 'count' as the [Label]" +msgstr "Mora imeti stolpec [Združevanje], da ima število (count) kot [Oznaka]" -#: superset/views/log/__init__.py:31 -msgid "Action" -msgstr "Aktivnost" +#: superset/viz.py:2362 +msgid "Choice of [Label] must be present in [Group By]" +msgstr "Izbira [Oznaka] mora biti prisotna v [Združevanje]" -#: superset/initialization/__init__.py:419 -msgid "Action Log" -msgstr "Dnevnik aktivnosti" +#: superset/viz.py:2370 +msgid "Choice of [Point Radius] must be present in [Group By]" +msgstr "Izbran [Point Radius] mora biti prisoten v [Združevanje]" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:335 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:189 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:249 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:420 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:229 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:417 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:375 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:405 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:309 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:413 -msgid "Actions" -msgstr "Aktivnosti" +#: superset/viz.py:2378 +msgid "[Longitude] and [Latitude] columns must be present in [Group By]" +msgstr "" +"Stolpca [Zemljepisna dolžina] in [Zemljepisna širina] morata biti prisotna v " +"[Združevanje]" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:290 -#: superset/views/schedules.py:240 superset/views/schedules.py:320 -msgid "Active" -msgstr "Aktiven" +#: superset/viz.py:2460 +msgid "Deck.gl - Multiple Layers" +msgstr "Deck.gl - Večplastni" -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:316 -msgid "Actual time range" -msgstr "Dejansko časovno obdobje" +#: superset/viz.py:2501 superset/viz.py:2537 +msgid "Bad spatial key" +msgstr "Neustrezen prostorski ključ" -#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:28 -#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:49 -msgid "Adaptive formatting" -msgstr "Adaptivno oblikovanje" +#: superset/viz.py:2522 +#, python-format +msgid "Invalid spatial point encountered: %s" +msgstr "Neustrezna prostorska točka: %s" -#: superset-frontend/src/components/ReportModal/index.tsx:267 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitlePane.tsx:133 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1039 -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:273 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:226 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:220 -#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:119 -msgid "Add" -msgstr "Dodaj" +#: superset/viz.py:2559 +msgid "" +"Encountered invalid NULL spatial entry, " +"please consider filtering those out" +msgstr "" +"Prišlo je do neveljavnega NULL prostorskega " +"vnosa, poskusite ga izločiti s filtrom" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1056 -#, fuzzy -msgid "Add Alert" -msgstr "opozorilo" +#: superset/viz.py:2654 +msgid "Deck.gl - Scatter plot" +msgstr "Deck.gl - Raztreseni graf" -#: superset/views/annotations.py:60 -msgid "Add Annotation" -msgstr "Dodaj oznako" +#: superset/viz.py:2706 +msgid "Deck.gl - Screen Grid" +msgstr "Deck.gl - Mreža" -#: superset/views/annotations.py:119 -msgid "Add Annotation Layer" -msgstr "Dodaj sloj z oznakami" +#: superset/viz.py:2735 +msgid "Deck.gl - 3D Grid" +msgstr "Deck.gl - 3D mreža" -#: superset/views/css_templates.py:38 -msgid "Add CSS Template" -msgstr "Dodaj CSS predlogo" +#: superset/viz.py:2767 +msgid "Deck.gl - Paths" +msgstr "Deck.gl - Poti" -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:232 -msgid "Add CSS template" -msgstr "Dodaj CSS predlogo" +#: superset/viz.py:2818 +msgid "Deck.gl - Polygon" +msgstr "Deck.gl - Poligon" -#: superset/views/chart/mixin.py:28 -msgid "Add Chart" -msgstr "Dodaj grafikon" +#: superset/viz.py:2851 +msgid "Deck.gl - 3D HEX" +msgstr "Deck.gl - 3D HEX" -#: superset/connectors/sqla/views.py:65 -msgid "Add Column" -msgstr "Dodaj stolpec" +#: superset/viz.py:2872 +msgid "Deck.gl - GeoJSON" +msgstr "Deck.gl - GeoJSON" -#: superset/views/dashboard/mixin.py:27 -msgid "Add Dashboard" -msgstr "Dodaj nadzorno ploščo" +#: superset/viz.py:2891 +msgid "Deck.gl - Arc" +msgstr "Deck.gl - Arc" -#: superset/views/database/mixins.py:35 -msgid "Add Database" -msgstr "Dodaj podatkovno bazo" +#: superset/viz.py:2925 +msgid "Event flow" +msgstr "Potek dogodkov" -#: superset/connectors/druid/views.py:215 -msgid "Add Druid Cluster" -msgstr "Dodaj Druid gručo" +#: superset/viz.py:2957 +msgid "Time Series - Paired t-test" +msgstr "Časovna vrsta - t-test za odvisne vzorce" -#: superset/connectors/druid/views.py:72 -msgid "Add Druid Column" -msgstr "Dodaj Druid stolpec" +#: superset/viz.py:3029 +msgid "Time Series - Nightingale Rose Chart" +msgstr "Časovna vrsta - Nightingale Rose grafikon" -#: superset/connectors/druid/views.py:279 -msgid "Add Druid Datasource" -msgstr "Dodaj podatkovni vir za Druid" +#: superset/viz.py:3064 +msgid "Partition Diagram" +msgstr "Grafikon s pravokotniki" -#: superset/connectors/druid/views.py:161 -msgid "Add Druid Metric" -msgstr "Dodaj Druid mere" +#: superset/advanced_data_type/api.py:100 +#, python-format +msgid "Invalid advanced data type: %(advanced_data_type)s" +msgstr "Neveljaven napreden tip rezultata: %(advanced_data_type)s" -#: superset/views/log/__init__.py:23 -msgid "Add Log" -msgstr "Dodaj dnevnik" +#: superset/annotation_layers/api.py:355 +#, python-format +msgid "Deleted %(num)d annotation layer" +msgid_plural "Deleted %(num)d annotation layers" +msgstr[0] "Izbrisan je %(num)d sloj z oznakami" +msgstr[1] "Izbrisana sta %(num)d sloja z oznakami" +msgstr[2] "Izbrisanih so %(num)d sloji z oznakami" +msgstr[3] "Izbrisanih je %(num)d slojev z oznakami" -#: superset/connectors/sqla/views.py:214 -msgid "Add Metric" -msgstr "Dodaj mero" +#: superset/annotation_layers/annotations/filters.py:28 +#: superset/annotation_layers/filters.py:30 superset/charts/filters.py:31 +#: superset/css_templates/filters.py:28 superset/queries/saved_queries/filters.py:31 +#: superset/reports/filters.py:28 +msgid "All Text" +msgstr "Celotno besedilo" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1055 -#, fuzzy -msgid "Add Report" -msgstr "poročilo" +#: superset/annotation_layers/annotations/api.py:504 +#, python-format +msgid "Deleted %(num)d annotation" +msgid_plural "Deleted %(num)d annotations" +msgstr[0] "Izbrisana je %(num)d oznaka" +msgstr[1] "Izbrisani sta %(num)d oznaki" +msgstr[2] "Izbrisane so %(num)d oznake" +msgstr[3] "Izbrisanih je %(num)d oznak" -#: superset/connectors/sqla/views.py:316 -msgid "Add Row level security filter" -msgstr "Dodaj filter za varnost na nivoju vrstic" +#: superset/annotation_layers/annotations/commands/exceptions.py:35 +msgid "End date must be after start date" +msgstr "Končni datum mora biti za začetnim" -#: superset/views/sql_lab.py:41 -msgid "Add Saved Query" -msgstr "Dodaj shranjeno poizvedbo" +#: superset/annotation_layers/annotations/commands/exceptions.py:46 +msgid "Short description must be unique for this layer" +msgstr "Kratek opis mora biti za ta sloj unikaten" -#: superset/views/dynamic_plugins.py:60 -msgid "Add a Plugin" -msgstr "Dodaj vtičnik" +#: superset/annotation_layers/annotations/commands/exceptions.py:52 +msgid "Annotations could not be deleted." +msgstr "Oznak ni mogoče izbrisati." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:175 -msgid "Add additional custom parameters" -msgstr "Dodaj dodatne parametre po meri" +#: superset/annotation_layers/annotations/commands/exceptions.py:56 +msgid "Annotation not found." +msgstr "Oznaka ni najdena." -#: superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:63 -msgid "Add an item" -msgstr "Dodaj element" +#: superset/annotation_layers/annotations/commands/exceptions.py:60 +msgid "Annotation parameters are invalid." +msgstr "Parametri oznak so neveljavni." -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:283 -msgid "Add annotation" -msgstr "Dodaj oznako" +#: superset/annotation_layers/annotations/commands/exceptions.py:64 +msgid "Annotation could not be created." +msgstr "Oznake ni mogoče ustvariti." -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:201 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:213 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:238 -msgid "Add annotation layer" -msgstr "Dodaj sloj z oznakami" +#: superset/annotation_layers/annotations/commands/exceptions.py:68 +msgid "Annotation could not be updated." +msgstr "Oznake ni mogoče posodobiti." -#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:121 -msgid "Add dataset" -msgstr "Dodaj podatkovni set" +#: superset/annotation_layers/annotations/commands/exceptions.py:72 +msgid "Annotation delete failed." +msgstr "Izbris oznake ni uspel." -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:387 -msgid "Add delivery method" -msgstr "Dodajte način dostave" +#: superset/annotation_layers/commands/exceptions.py:29 +msgid "Annotation layer parameters are invalid." +msgstr "Parametri sloja z oznakami so neveljavni." -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx:367 -msgid "Add filter" -msgstr "Dodaj filter" +#: superset/annotation_layers/commands/exceptions.py:33 +msgid "Annotation layer could not be deleted." +msgstr "Sloja z oznakami ni mogoče izbrisati." -#: superset-frontend/src/CRUD/CollectionTable.tsx:417 -msgid "Add item" -msgstr "Dodaj" +#: superset/annotation_layers/commands/exceptions.py:37 +msgid "Annotation layer could not be created." +msgstr "Sloja z oznakami ni mogoče ustvariti." -#: superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.jsx:336 -msgid "Add metric" -msgstr "Dodaj mero" +#: superset/annotation_layers/commands/exceptions.py:41 +msgid "Annotation layer could not be updated." +msgstr "Sloja z oznakami ni mogoče posodobiti." -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/ConditionalFormattingControl.tsx:176 -msgid "Add new color formatter" -msgstr "Dodaj novo oblikovanje barve" +#: superset/annotation_layers/commands/exceptions.py:45 +msgid "Annotation layer not found." +msgstr "Sloja z oznakami ni mogoče najti." -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/ConditionalFormattingControl.tsx:169 -msgid "Add new formatter" -msgstr "Dodaj novo oblikovanje" +#: superset/annotation_layers/commands/exceptions.py:49 +msgid "Annotation layer delete failed." +msgstr "Izbris sloja z oznakami ni uspel." -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:386 -msgid "Add notification method" -msgstr "Dodajte način obveščanja" +#: superset/annotation_layers/commands/exceptions.py:53 +#: superset/annotation_layers/commands/exceptions.py:57 +msgid "Annotation layer has associated annotations." +msgstr "Sloj z oznakami ima povezane oznake." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:99 -msgid "Add sheet" -msgstr "Dodaj preglednico" +#: superset/annotation_layers/commands/exceptions.py:66 +msgid "Name must be unique" +msgstr "Ime mora biti unikatno" -#: superset-frontend/src/explore/components/SaveModal.tsx:258 -msgid "Add to dashboard" -msgstr "Dodaj na nadzorno ploščo" +#: superset/charts/api.py:483 +#, python-format +msgid "Deleted %(num)d chart" +msgid_plural "Deleted %(num)d charts" +msgstr[0] "Izbrisan je %(num)d grafikon" +msgstr[1] "Izbrisana sta %(num)d grafikona" +msgstr[2] "Izbrisani so %(num)d grafikoni" +msgstr[3] "Izbrisanih je %(num)d grafikonov" -#: superset-frontend/src/dashboard/components/AddSliceCard.jsx:141 -msgid "Added" -msgstr "Dodano" +#: superset/charts/filters.py:63 superset/dashboards/filters.py:219 +#: superset/datasets/filters.py:39 +msgid "Is certified" +msgstr "Certificiran" -#: superset/connectors/druid/models.py:256 -msgid "Adding new datasource [{}]" -msgstr "Dodajanje novega podatkovnega vira [{}]" +#: superset/charts/schemas.py:566 +msgid "`confidence_interval` must be between 0 and 1 (exclusive)" +msgstr "`confidence_interval` mora biti med 0 in 1 (odprt)" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:173 -#, fuzzy -msgid "Additional Parameters" -msgstr "Dodatni parametri" +#: superset/charts/schemas.py:638 +msgid "" +"lower percentile must be greater than 0 and less than 100. Must be lower than " +"upper percentile." +msgstr "" +"spodnji percentil mora biti večji od 0 in manjši od 100 ter mora biti manjši od " +"zgornjega percentila." -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:324 -msgid "Additional information" -msgstr "Dodatne informacije" +#: superset/charts/schemas.py:653 +msgid "" +"upper percentile must be greater than 0 and less than 100. Must be higher than " +"lower percentile." +msgstr "" +"zgornji percentil mora biti večji od 0 in manjši od 100 ter mora biti večji od " +"spodnjega percentila." -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:96 -msgid "Additional metadata" -msgstr "Dodatni metapodatki" +#: superset/charts/schemas.py:968 +msgid "`width` must be greater or equal to 0" +msgstr "`width` mora biti večja ali enaka 0" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:50 -msgid "Additional padding for legend." -msgstr "Dodatni razmak za legendo." +#: superset/charts/schemas.py:1110 +msgid "`row_limit` must be greater than or equal to 0" +msgstr "`row_limit` mora biti večja ali enaka 0" -#: superset/db_engine_specs/base.py:1398 -msgid "Additional parameters" -msgstr "Dodatni parametri" +#: superset/charts/schemas.py:1117 +msgid "`row_offset` must be greater than or equal to 0" +msgstr "`row_offset` mora biti večja ali enaka 1" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:166 -msgid "Additional text to add before or after the value, e.g. unit" -msgstr "Dodatno besedilo, ki ga dodate pred ali za vrednost, npr. enota" +#: superset/charts/schemas.py:1139 +msgid "orderby column must be populated" +msgstr "stolpec za razvrščanje (orderby) mora biti izpolnjen" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:40 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:40 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 -#: superset-frontend/plugins/plugin-chart-table/src/index.ts:43 -msgid "Additive" -msgstr "Aditivno" +#: superset/charts/commands/bulk_delete.py:64 superset/charts/commands/delete.py:68 +#: superset/dashboards/commands/bulk_delete.py:65 +#: superset/dashboards/commands/delete.py:66 +#: superset/databases/commands/delete.py:65 +#, python-format +msgid "There are associated alerts or reports: %s," +msgstr "Prisotna so opozorila in poročila: %s," -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:765 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:580 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:267 -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:34 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1146 -msgid "Advanced" -msgstr "Napredno" +#: superset/charts/commands/exceptions.py:38 +#, python-format +msgid "" +"Time string is ambiguous. Please specify [%(human_readable)s ago] or " +"[%(human_readable)s later]." +msgstr "" +"Časovni niz je nejasen. Podajte [%(human_readable)s ago] ali [%(human_readable)s " +"later]." -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:122 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:242 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:125 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:148 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:375 -msgid "Advanced Analytics" -msgstr "Napredna analitika" +#: superset/charts/commands/exceptions.py:51 +#, python-format +msgid "Cannot parse time string [%(human_readable)s]" +msgstr "Ni mogoče razčleniti časovnega izraza [%(human_readable)s]" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:25 -#: superset-frontend/src/explore/controlPanels/sections.tsx:144 -msgid "Advanced analytics" -msgstr "Napredna analitika" +#: superset/charts/commands/exceptions.py:66 +#, python-format +msgid "" +"Time delta is ambiguous. Please specify [%(human_readable)s ago] or " +"[%(human_readable)s later]." +msgstr "" +"Časovna razlika je nejasna. Podajte [%(human_readable)s ago] ali " +"[%(human_readable)s later]." -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:32 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:36 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:44 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:35 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:79 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:79 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:74 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:64 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:71 -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:124 -msgid "Advanced-Analytics" -msgstr "Napredna analitika" +#: superset/charts/commands/exceptions.py:82 +#: superset/datasets/commands/exceptions.py:41 +#: superset/reports/commands/exceptions.py:36 +msgid "Database does not exist" +msgstr "Podatkovna baza ne obstaja" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:36 -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:36 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:44 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:33 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:39 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:70 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:65 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:80 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:80 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:75 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:74 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:74 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:65 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:72 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:58 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:41 -msgid "Aesthetic" -msgstr "Estetika" +#: superset/charts/commands/exceptions.py:91 +msgid "Dashboards do not exist" +msgstr "Nadzorna plošča ne obstaja" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:84 -msgid "After" -msgstr "PO" +#: superset/charts/commands/exceptions.py:101 +msgid "Datasource type is required when datasource_id is given" +msgstr "Ko se podaja datasource_id, je potreben tip podatkovnega vira" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:45 -msgid "Aggregate" -msgstr "Agregacija" +#: superset/charts/commands/exceptions.py:111 +msgid "Chart parameters are invalid." +msgstr "Parametri grafikona so neveljavni." -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:91 -msgid "Aggregate Mean" -msgstr "Agregirano povprečje" +#: superset/charts/commands/exceptions.py:115 +msgid "Chart could not be created." +msgstr "Grafikona ni mogoče ustvariti." -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:96 -msgid "Aggregate Sum" -msgstr "Agregirana vsota" +#: superset/charts/commands/exceptions.py:119 +msgid "Chart could not be updated." +msgstr "Grafikona ni mogoče posodobiti." -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:182 -msgid "" -"Aggregate function applied to the list of points in each cluster to " -"produce the cluster label." -msgstr "" -"Agregacijska funkcija za seznam točk v vsaki gruči, s katero se ustvari " -"oznaka gruče." +#: superset/charts/commands/exceptions.py:123 +msgid "Chart could not be deleted." +msgstr "Grafikona ni mogoče izbrisati." -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:74 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:137 -msgid "" -"Aggregate function to apply when pivoting and computing the total rows " -"and columns" -msgstr "Agregacijska funkcija za vrtenje in izračun vseh vrstic in stolpcev" +#: superset/charts/commands/exceptions.py:127 +#: superset/charts/commands/exceptions.py:151 +#: superset/dashboards/commands/exceptions.py:62 +#: superset/dashboards/commands/exceptions.py:74 +#: superset/databases/commands/exceptions.py:119 +msgid "There are associated alerts or reports" +msgstr "Prisotna so povezana opozorila in poročila" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:63 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:114 -msgid "Aggregation function" -msgstr "Agregacijska funkcija" +#: superset/charts/commands/exceptions.py:131 +msgid "You don't have access to this chart." +msgstr "Nimate dostopa do tega grafikona." -#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:92 -msgid "Alert Triggered, In Grace Period" -msgstr "Opozorilo sproženo, v obdobju mirovanja" +#: superset/charts/commands/exceptions.py:135 +msgid "Changing this chart is forbidden" +msgstr "Spreminjanje tega grafikona ni dovoljeno" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1123 -msgid "Alert condition" -msgstr "Status opozorila" +#: superset/charts/commands/exceptions.py:139 +msgid "Charts could not be deleted." +msgstr "Grafikonov ni mogoče izbrisati." -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1215 -msgid "Alert condition schedule" -msgstr "Urnik statusov opozoril" +#: superset/charts/commands/exceptions.py:155 +msgid "Import chart failed for an unknown reason" +msgstr "Uvoz grafikona ni uspel zaradi neznanega razloga" -#: superset/reports/commands/exceptions.py:218 -msgid "Alert ended grace period." -msgstr "Opozorilo je končalo obdobje mirovanja." +#: superset/charts/data/api.py:123 +msgid "Chart has no query context saved. Please save the chart again." +msgstr "Grafikon nima shranjenega konteksta poizvedbe. Ponovno shranite grafikon." -#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:82 -msgid "Alert failed" -msgstr "Opozorilo ni uspelo" +#: superset/charts/data/api.py:143 superset/charts/data/api.py:231 +#: superset/charts/data/api.py:297 +#, python-format +msgid "Request is incorrect: %(error)s" +msgstr "Zahtevek je napačen: %(error)s" -#: superset/reports/commands/exceptions.py:214 -msgid "Alert fired during grace period." -msgstr "Opozorilo sproženo med obdobjem mirovanja." +#: superset/charts/data/api.py:220 +msgid "Request is not JSON" +msgstr "Zahtevek ni JSON" -#: superset/reports/commands/exceptions.py:194 -msgid "Alert found an error while executing a query." -msgstr "Opozorilo je našlo napako pri izvajanju poizvedbe." +#: superset/charts/data/api.py:351 +msgid "Empty query result" +msgstr "Rezultat prazne poizvedbe" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1064 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1072 -msgid "Alert name" -msgstr "Naslov opozorila" +#: superset/commands/exceptions.py:108 superset/datasets/commands/exceptions.py:144 +msgid "Owners are invalid" +msgstr "Lastniki niso veljavni" -#: superset/reports/commands/exceptions.py:222 -msgid "Alert on grace period" -msgstr "Opozorilo v obdobju mirovanja" +#: superset/commands/exceptions.py:115 +msgid "Some roles do not exist" +msgstr "Nekatere vloge ne obstajajo" -#: superset/reports/commands/exceptions.py:190 -msgid "Alert query returned a non-number value." -msgstr "Opozorilna poizvedba je vrnila neštevilsko vrednost." +#: superset/commands/exceptions.py:123 +msgid "Datasource type is invalid" +msgstr "Neveljaven tip podatkovnega vira" -#: superset/reports/commands/exceptions.py:186 -msgid "Alert query returned more than one column." -msgstr "Opozorilna poizvedba je vrnila več kot en stolpec." +#: superset/commands/exceptions.py:131 +msgid "Datasource does not exist" +msgstr "Podatkovni vir ne obstaja" -#: superset/reports/commands/alert.py:105 +#: superset/commands/exceptions.py:138 +msgid "Query does not exist" +msgstr "Poizvedba ne obstaja" + +#: superset/common/query_actions.py:202 #, python-format -msgid "Alert query returned more than one column. %s columns returned" -msgstr "" -"Opozorilna poizvedba je vrnila več kot en stolpec. Število vrnjenih " -"stolpcev: %s" +msgid "Invalid result type: %(result_type)s" +msgstr "Neveljaven tip rezultata: %(result_type)s" -#: superset/reports/commands/exceptions.py:177 -msgid "Alert query returned more than one row." -msgstr "Opozorilna poizvedba je vrnila več kot eno vrstico." +#: superset/common/query_context_processor.py:475 +msgid "The chart does not exist" +msgstr "Grafikon ne obstaja" -#: superset/reports/commands/alert.py:96 +#: superset/common/query_object.py:292 #, python-format -msgid "Alert query returned more than one row. %s rows returned" +msgid "" +"Duplicate column/metric labels: %(labels)s. Please make sure all columns and " +"metrics have a unique label." msgstr "" -"Opozorilna poizvedba je vrnila več kot eno vrstico. Število vrnjenih " -"vrstic: %s" +"Podvojene oznake stolpcev/mer: %(labels)s. Poskrbite, da bodo imeli stolpci in " +"mere unikatne oznake." -#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:75 -msgid "Alert running" -msgstr "Opozorilo aktivno" +#: superset/common/query_object.py:314 +#, python-format +msgid "" +"The following entries in `series_columns` are missing in `columns`: %(columns)s. " +msgstr "V 'columns' manjkajo naslednji vnosi iz 'series_columns': %(columns)s. " -#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:68 -msgid "Alert triggered, notification sent" -msgstr "Opozorilo sproženo, obvestilo poslano" +#: superset/common/query_object.py:416 +msgid "`operation` property of post processing object undefined" +msgstr "Lastnost `operation` poprocesirnega objekta ni definirana" -#: superset/reports/commands/exceptions.py:182 -msgid "Alert validator config error." -msgstr "Napaka nastavitev potrjevalnika opozoril." +#: superset/common/query_object.py:420 +#, python-format +msgid "Unsupported post processing operation: %(operation)s" +msgstr "Nepodprta poprocesirna operacija: %(operation)s" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:436 -#: superset/initialization/__init__.py:468 -msgid "Alerts" -msgstr "Opozorila" +#: superset/connectors/connector_registry.py:99 +#, python-format +msgid "Datasource id not found: %(id)s" +msgstr "ID podatkovnega vira ni bil najden: %(id)s" -#: superset/initialization/__init__.py:480 -msgid "Alerts & Reports" -msgstr "Opozorila in poročila" +#: superset/connectors/sqla/models.py:899 +#, python-format +msgid "Error in jinja expression in fetch values predicate: %(msg)s" +msgstr "Napaka v jinja izrazu za pridobivanje vrednosti predikatov: %(msg)s" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:432 -msgid "Alerts & reports" -msgstr "Opozorila in poročila" +#: superset/connectors/sqla/models.py:989 +msgid "Virtual dataset query must be read-only" +msgstr "Poizvedba na virtualnem podatkovnem setu mora biti samo za branje" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:127 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:427 -msgid "Align +/-" -msgstr "Poravnaj +/-" +#: superset/connectors/sqla/models.py:1014 +#, python-format +msgid "Error while rendering virtual dataset query: %(msg)s" +msgstr "Napaka pri izvajanju poizvedbe virtualnega podatkovnega seta: %(msg)s" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:457 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:478 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:499 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:524 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:454 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:475 -msgid "All" -msgstr "Vsi" +#: superset/connectors/sqla/models.py:1021 superset/connectors/sqla/utils.py:109 +msgid "Virtual dataset query cannot be empty" +msgstr "Poizvedba na virtualnem podatkovnem setu ne sme biti prazna" -#: superset/annotation_layers/annotations/filters.py:28 -#: superset/annotation_layers/filters.py:30 superset/charts/filters.py:31 -#: superset/css_templates/filters.py:28 -#: superset/queries/saved_queries/filters.py:31 superset/reports/filters.py:28 -msgid "All Text" -msgstr "Celotno besedilo" +#: superset/connectors/sqla/models.py:1024 +msgid "Virtual dataset query cannot consist of multiple statements" +msgstr "" +"Poizvedba na virtualnem podatkovnem setu ne sme biti sestavljena iz več stavkov" -#: superset-frontend/src/dashboard/util/getFilterScopeNodesTree.js:85 -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:122 -msgid "All charts" -msgstr "Vsi grafikoni" +#: superset/connectors/sqla/models.py:1176 +#, python-format +msgid "Error in jinja expression in RLS filters: %(msg)s" +msgstr "Napaka v jinja izrazu RLS filtrov: %(msg)s" -#: superset-frontend/src/dashboard/util/getFilterFieldNodesTree.js:44 -msgid "All filters" -msgstr "Vsi filtri" - -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx:326 -#, fuzzy, python-format -msgid "All filters (%(filterCount)d)" -msgstr "Vsi filtri (${filterValues.length})" - -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/state.ts:49 -msgid "All panels" -msgstr "Vsi paneli" - -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:132 -msgid "All panels with this column will be affected by this filter" -msgstr "Ta filter bo vplival na vse panele s tem stolpcem" +#: superset/connectors/sqla/models.py:1265 +msgid "" +"Datetime column not provided as part table configuration and is required by this " +"type of chart" +msgstr "" +"Stolpec datum-čas ni podan kot del tabele, čeprav mora biti za ta tip grafikona" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:95 -#: superset/views/database/mixins.py:187 -msgid "Allow CREATE TABLE AS" -msgstr "Dovoli CREATE TABLE AS" +#: superset/connectors/sqla/models.py:1271 +msgid "Empty query?" +msgstr "Prazna poizvedba?" -#: superset/views/database/mixins.py:113 -msgid "Allow CREATE TABLE AS option in SQL Lab" -msgstr "Dovoli opcijo CREATE TABLE AS v SQL laboratoriju" +#: superset/connectors/sqla/models.py:1288 superset/connectors/sqla/models.py:1768 +#, python-format +msgid "Metric '%(metric)s' does not exist" +msgstr "Mera '%(metric)s' ne obstaja" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:109 -#: superset/views/database/mixins.py:188 -msgid "Allow CREATE VIEW AS" -msgstr "Dovoli CREATE VIEW AS" +#: superset/connectors/sqla/models.py:1337 +#, python-format +msgid "Unknown column used in orderby: %(col)s" +msgstr "Za razvrščanje je uporabljen neznan stolpec: %(col)s" -#: superset/views/database/mixins.py:114 -msgid "Allow CREATE VIEW AS option in SQL Lab" -msgstr "Dovoli opcijo CREATE VIEW AS v SQL laboratoriju" +#: superset/connectors/sqla/models.py:1397 +#, python-format +msgid "Time column \"%(col)s\" does not exist in dataset" +msgstr "Časovni stolpec \"%(col)s\" ne obstaja v podatkovnem setu" -#: superset/views/database/mixins.py:201 -msgid "Allow Csv Upload" -msgstr "Dovoli nalaganje CSV" +#: superset/connectors/sqla/models.py:1523 +msgid "error_message" +msgstr "error_message" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:142 -#: superset/views/database/mixins.py:189 -msgid "Allow DML" -msgstr "Dovoli DML" +#: superset/connectors/sqla/models.py:1535 +msgid "Filter value list cannot be empty" +msgstr "Seznam vrednosti filtra ne sme biti prazen" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:158 -#: superset/views/database/mixins.py:203 -msgid "Allow Multi Schema Metadata Fetch" -msgstr "Dovoli pridobivanje metapodatkov z več shemami" +#: superset/connectors/sqla/models.py:1561 +msgid "Must specify a value for filters with comparison operators" +msgstr "Potrebno je podati vrednost za filter s primerjalnim operandom" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:161 -#: superset/views/database/mixins.py:170 -msgid "" -"Allow SQL Lab to fetch a list of all tables and all views across all " -"database schemas. For large data warehouse with thousands of tables, this" -" can be expensive and put strain on the system." -msgstr "" -"Dovoli SQL laboratoriju, da pridobi seznam vseh tabel in pogledov iz vseh" -" shem podatkovne baze. Pri velikih podatkovnih skladiščih s tisoči tabel " -"je to lahko potratno in obremeni sistem." +#: superset/connectors/sqla/models.py:1584 +#, python-format +msgid "Invalid filter operation type: %(op)s" +msgstr "Neveljaven tip operacije filtra: %(op)s" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:98 -msgid "Allow creation of new tables based on queries" -msgstr "Dovoli ustvarjanje novih tabel s poizvedbami" +#: superset/connectors/sqla/models.py:1594 +#, python-format +msgid "Error in jinja expression in WHERE clause: %(msg)s" +msgstr "Napaka v jinja izrazu WHERE stavka: %(msg)s" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:112 -msgid "Allow creation of new views based on queries" -msgstr "Dovoli ustvarjanje novih pogledov s poizvedbami" +#: superset/connectors/sqla/models.py:1606 +#, python-format +msgid "Error in jinja expression in HAVING clause: %(msg)s" +msgstr "Napaka v jinja izrazu HAVING stavka: %(msg)s" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:256 -msgid "Allow data manipulation language" -msgstr "Dovoli jezik za manipulacijo podatkov (DML)" +#: superset/connectors/sqla/models.py:1736 +msgid "Database does not support subqueries" +msgstr "Podatkovna baza ne podpira podpoizvedb" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:417 -msgid "Allow data upload" -msgstr "Dovoli nalaganje podatkov" +#: superset/connectors/sqla/models.py:1857 +msgid "Db engine did not return all queried columns" +msgstr "Sitem podatkovne baze ni vrnil vse stolpcev poizvedbe" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:145 -msgid "" -"Allow manipulation of the database using non-SELECT statements such as " -"UPDATE, DELETE, CREATE, etc." -msgstr "" -"Dovoli manipulacije podatkovne baze z uporabo ne-SELECT stavkov, kot so " -"UPDATE, DELETE, CREATE, itd." +#: superset/connectors/sqla/utils.py:122 +msgid "Only `SELECT` statements are allowed" +msgstr "Dovoljeni so le `SELECT` stavki" -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:216 -msgid "Allow multiple selections" -msgstr "Dovoli več izbir" +#: superset/connectors/sqla/utils.py:131 +msgid "Only single queries supported" +msgstr "Podprte so le enojne poizvedbe" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:189 -msgid "Allow node selections" -msgstr "Dovoli izbiro vozlišča" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:68 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:238 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:36 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx:38 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx:62 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:50 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:84 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:104 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:128 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1364 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:389 +#: superset-frontend/src/explore/controls.jsx:245 +#: superset-frontend/src/explore/fixtures.tsx:96 +#: superset/connectors/sqla/views.py:57 +msgid "Columns" +msgstr "Stolpci" -#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:64 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:82 -msgid "Allow selecting multiple values" -msgstr "Dovoli izbiro več vrednosti" +#: superset/connectors/sqla/views.py:58 +msgid "Show Column" +msgstr "Pokaži stolpec" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:192 -msgid "Allow this database to be explored" -msgstr "Dovoli raziskovanje te podatkovne baze" +#: superset/connectors/sqla/views.py:59 +msgid "Add Column" +msgstr "Dodaj stolpec" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:79 -msgid "Allow this database to be queried in SQL Lab" -msgstr "Dovoli poizvedbo na to podatkovno bazo v SQL laboratoriju" +#: superset/connectors/sqla/views.py:60 +msgid "Edit Column" +msgstr "Uredi stolpec" -#: superset/views/database/mixins.py:115 +#: superset/connectors/sqla/views.py:90 msgid "" -"Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in" -" SQL Lab" +"Whether to make this column available as a [Time Granularity] option, column has " +"to be DATETIME or DATETIME-like" msgstr "" -"Dovoli uporabnikom poganjanje ne-SELECT stavkov (UPDATE, DELETE, CREATE, " -"...) v SQL laboratoriju" - -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:555 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:529 -msgid "Alphabetical" -msgstr "Po abecedi" +"Če želite, da bo ta stolpec na razpolago kot možnost [Granulacija časa]. Stolpec " +"mora biti tipa DATETIME ali DATETIME-like" -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:50 -msgid "" -"Also known as a box and whisker plot, this visualization compares the " -"distributions of a related metric across multiple groups. The box in the " -"middle emphasizes the mean, median, and inner 2 quartiles. The whiskers " -"around each box visualize the min, max, range, and outer 2 quartiles." +#: superset/connectors/sqla/views.py:95 +msgid "Whether this column is exposed in the `Filters` section of the explore view." msgstr "" -"Znan tudi kot grafikon škatla z brki. prikaže primerjavo porazdelitev " -"povezanih mer v različnih skupinah. Škatla na sredini predstavlja " -"povprečje, mediano in notranja 2 kvartila. Brki na vsaki škatli " -"prikazujejo minimum, maksimum, območje in zunanja dva kvartila." +"Če želite, da je ta stolpec na voljo v sekciji `Filtri` v raziskovalnem pogledu." -#: superset-frontend/src/components/AlteredSliceTag/index.jsx:182 -msgid "Altered" -msgstr "Spremenjeno" - -#: superset/common/query_context_processor.py:257 superset/viz.py:1415 +#: superset/connectors/sqla/views.py:99 msgid "" -"An enclosed time range (both start and end) must be specified when using " -"a Time Comparison." +"The data type that was inferred by the database. It may be necessary to input a " +"type manually for expression-defined columns in some cases. In most case users " +"should not need to alter this." msgstr "" -"Pri časovni primerjavi mora biti določeno zaprto časovno obdobje (s časom" -" začetka in konca)." +"Podatkovni tip, ki izvira iz podatkovne baze. V nekaterih primerih je potrebno " +"ročno vnesti tip za stolpce, ki temeljijo na izrazih. V večini primerov " +"uporabniku tega ni potrebno spreminjati." -#: superset/databases/schemas.py:299 -msgid "" -"An engine must be specified when passing individual parameters to a " -"database." -msgstr "" -"Pri podajanju posameznih parametrov podatkovne baze mora biti podan njen " -"tip." +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:351 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:360 +#: superset-frontend/src/dashboard/components/gridComponents/new/NewColumn.jsx:31 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:112 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:204 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:231 +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:137 +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:140 +#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:194 +#: superset/connectors/sqla/views.py:139 +msgid "Column" +msgstr "Stolpec" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:623 -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:140 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:69 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:116 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx:46 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:64 -msgid "An error has occurred" -msgstr "Prišlo je do napake" +#: superset/connectors/sqla/views.py:140 superset/connectors/sqla/views.py:233 +msgid "Verbose Name" +msgstr "Podrobno ime" -#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:80 -#: superset-frontend/src/components/TableLoader/index.tsx:48 -#: superset-frontend/src/utils/getClientErrorObject.ts:135 -msgid "An error occurred" -msgstr "Prišlo je do napake" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx:85 +#: superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx:116 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:46 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:44 +#: superset-frontend/plugins/plugin-chart-table/src/index.ts:51 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:44 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:137 +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:183 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:254 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:258 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:852 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1205 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1209 +#: superset-frontend/src/components/ReportModal/index.tsx:288 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:51 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1102 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:255 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1118 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1124 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:161 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:156 +#: superset/connectors/sqla/views.py:141 superset/connectors/sqla/views.py:232 +#: superset/connectors/sqla/views.py:448 superset/views/annotations.py:77 +#: superset/views/annotations.py:122 superset/views/chart/mixin.py:81 +#: superset/views/sql_lab.py:76 +msgid "Description" +msgstr "Opis" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:347 -msgid "An error occurred saving dataset" -msgstr "Pri shranjevanju podatkovnega seta je prišlo do napake" +#: superset/connectors/sqla/views.py:142 +msgid "Groupable" +msgstr "Združevanje" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "Pri osveževanju poizvedb je prišlo do napake" +#: superset/connectors/sqla/views.py:143 +msgid "Filterable" +msgstr "Filtriranje" -#: superset/key_value/commands/exceptions.py:33 -#, fuzzy -msgid "An error occurred while accessing the value." -msgstr "Pri ustvarjanju podatkovnega vira je prišlo do težave" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:25 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:50 +#: superset-frontend/plugins/plugin-chart-table/src/index.ts:35 +#: superset-frontend/plugins/plugin-chart-table/src/index.ts:41 +#: superset-frontend/src/components/TableSelector/index.tsx:326 +#: superset-frontend/src/visualizations/TimeTable/index.ts:25 +#: superset/connectors/sqla/views.py:144 superset/connectors/sqla/views.py:236 +#: superset/connectors/sqla/views.py:434 superset/views/chart/mixin.py:87 +msgid "Table" +msgstr "Tabela" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1165 -msgid "" -"An error occurred while collapsing the table schema. Please contact your " -"administrator." -msgstr "" -"Pri krčenju sheme tabele je prišlo do napake. Kontaktirajte " -"administratorja." +#: superset/connectors/sqla/views.py:145 +msgid "Expression" +msgstr "Izraz" -#: superset-frontend/src/views/CRUD/hooks.ts:301 -#, python-format -msgid "An error occurred while creating %ss: %s" -msgstr "Napaka pri ustvarjanju %s: %s" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:355 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:363 +#: superset/connectors/sqla/views.py:146 +msgid "Is temporal" +msgstr "Časoven" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1313 -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1335 -msgid "An error occurred while creating the data source" -msgstr "Pri ustvarjanju podatkovnega vira je prišlo do težave" +#: superset/connectors/sqla/views.py:147 +msgid "Datetime Format" +msgstr "Oblika zapisa datuma,časa" -#: superset/key_value/commands/exceptions.py:29 -#, fuzzy -msgid "An error occurred while creating the value." -msgstr "Pri ustvarjanju podatkovnega vira je prišlo do težave" +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:216 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:219 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:276 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:320 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:509 +#: superset/connectors/sqla/views.py:148 superset/connectors/sqla/views.py:234 +msgid "Type" +msgstr "Tip" -#: superset/key_value/commands/exceptions.py:37 -#, fuzzy, python-format -msgid "An error occurred while deleting the value." -msgstr "Pri pridobivanju vrednosti shem je prišlo do napake: %s" +#: superset/connectors/sqla/views.py:149 +msgid "Business Data Type" +msgstr "Poslovni podatkovni tip" -#: superset-frontend/src/reports/actions/reports.js:138 -msgid "An error occurred while editing this report." -msgstr "Pri urejanju tega poročila je prišlo do napake." +#: superset/connectors/sqla/views.py:165 superset/datasets/schemas.py:44 +msgid "Invalid date/timestamp format" +msgstr "Neveljaven zapis datuma/časa" -#: superset-frontend/src/reports/actions/reports.js:120 -#, python-format -msgid "An error occurred while editing this report: %s" -msgstr "Pri urejanju tega poročila je prišlo do napake: %s" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:114 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:157 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1353 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:353 +#: superset-frontend/src/explore/controls.jsx:152 +#: superset/connectors/sqla/views.py:188 +msgid "Metrics" +msgstr "Mere" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1141 -msgid "" -"An error occurred while expanding the table schema. Please contact your " -"administrator." -msgstr "" -"Pri širitvi sheme tabele je prišlo do napake. Kontaktirajte " -"administratorja." +#: superset/connectors/sqla/views.py:189 +msgid "Show Metric" +msgstr "Pokaži mero" -#: superset-frontend/src/views/CRUD/hooks.ts:103 -#, python-format -msgid "An error occurred while fetching %s info: %s" -msgstr "Napaka pri pridobivanju informacij za %s: %s" +#: superset/connectors/sqla/views.py:190 +msgid "Add Metric" +msgstr "Dodaj mero" -#: superset-frontend/src/views/CRUD/hooks.ts:171 -#: superset-frontend/src/views/CRUD/hooks.ts:258 -#: superset-frontend/src/views/CRUD/hooks.ts:344 -#, python-format -msgid "An error occurred while fetching %ss: %s" -msgstr "Napaka pri pridobivanju informacij za %s: %s" +#: superset/connectors/sqla/views.py:191 +msgid "Edit Metric" +msgstr "Uredi mero" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:132 -msgid "An error occurred while fetching available CSS templates" -msgstr "Pri pridobivanju CSS predlog je prišlo do napake" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:128 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:129 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:171 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:172 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:84 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:118 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:97 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1196 +#: superset-frontend/src/explore/controls.jsx:167 +#: superset-frontend/src/explore/controls.jsx:168 +#: superset/connectors/sqla/views.py:231 +msgid "Metric" +msgstr "Mera" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:484 -#, python-format -msgid "An error occurred while fetching chart created by values: %s" -msgstr "Pri pridobivanju polja Grafikon ustvaril je prišlo do napake: %s" +#: superset/connectors/sqla/views.py:235 +msgid "SQL Expression" +msgstr "SQL izraz" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:463 -#, python-format -msgid "An error occurred while fetching chart owners values: %s" -msgstr "Pri pridobivanju polja lastnik grafikona je prišlo do napake: %s" +#: superset/connectors/sqla/views.py:237 +msgid "D3 Format" +msgstr "D3 zapis" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:392 -#, python-format -msgid "An error occurred while fetching created by values: %s" -msgstr "Pri pridobivanju vrednosti \"Ustvaril\" je prišlo do napake: %s" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:895 +#: superset/connectors/sqla/views.py:238 superset/connectors/sqla/views.py:451 +#: superset/views/database/mixins.py:199 +msgid "Extra" +msgstr "Dodatno" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:481 -#, python-format -msgid "An error occurred while fetching dashboard created by values: %s" -msgstr "Pri pridobivanju polja Nadzorno ploščo ustvaril je prišlo do napake: %s" +#: superset/connectors/sqla/views.py:239 +msgid "Warning Message" +msgstr "Opozorilo" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:460 -#, python-format -msgid "An error occurred while fetching dashboard owner values: %s" -msgstr "Pri pridobivanju polja lastnik nadzorne plošče je prišlo do napake: %s" +#: superset/connectors/sqla/views.py:269 +msgid "Row level security filter" +msgstr "Filter za varnost na nivoju vrstic" -#: superset-frontend/src/components/OmniContainer/getDashboards.ts:48 -msgid "An error occurred while fetching dashboards" -msgstr "Prišlo je do napake pri pridobivanju nadzornih plošč" +#: superset/connectors/sqla/views.py:270 +msgid "Show Row level security filter" +msgstr "Prikaži filter za varnost na nivoju vrstic" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:200 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:127 -#, python-format -msgid "An error occurred while fetching dashboards: %s" -msgstr "Prišlo je do napake pri pridobivanju nadzornih plošč: %s" +#: superset/connectors/sqla/views.py:271 +msgid "Add Row level security filter" +msgstr "Dodaj filter za varnost na nivoju vrstic" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:129 -#, python-format -msgid "An error occurred while fetching database related data: %s" -msgstr "Pri pridobivanju podatkov iz podatkovne baze je prišlo do napake: %s" +#: superset/connectors/sqla/views.py:272 +msgid "Edit Row level security filter" +msgstr "Uredi filter za varnost na nivoju vrstic" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:341 -#, python-format -msgid "An error occurred while fetching database values: %s" -msgstr "Pri pridobivanju vrednosti podatkovne baze je prišlo do napake: %s" +#: superset/connectors/sqla/views.py:290 +msgid "" +"Regular filters add where clauses to queries if a user belongs to a role " +"referenced in the filter. Base filters apply filters to all queries except the " +"roles defined in the filter, and can be used to define what users can see if no " +"RLS filters within a filter group apply to them." +msgstr "" +"Navadni filtri dodajo WHERE stavek v poizvedbe, če ima uporabnik vlogo podano v " +"filtru. Osnovni filtri filtrirajo vse poizvedbe, razen vlog, definiranih v " +"filtru, in jih je mogoče uporabiti za nastavitev tega kaj uporabnik vidi, če v " +"skupini filtrov ni RLS-filtrov, ki bi se nanašali nanje." -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:295 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:282 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:434 -#, python-format -msgid "An error occurred while fetching dataset datasource values: %s" +#: superset/connectors/sqla/views.py:296 +msgid "These are the tables this filter will be applied to." +msgstr "To so tabele, na katere se nanaša ta filter." + +#: superset/connectors/sqla/views.py:297 +msgid "" +"For regular filters, these are the roles this filter will be applied to. For base " +"filters, these are the roles that the filter DOES NOT apply to, e.g. Admin if " +"admin should see all data." msgstr "" -"Pri pridobivanju vrednosti podatkovnega vira podatkovnega seta je prišlo " -"do napake: %s" +"Za regularne filtre so te vloge tiste, ki bodo filtrirane. Za osnovne filtre, so " +"te vloge tiste, ki NE bodo filtrirane, npr. Admin, če naj administrator vidi vse " +"podatke." -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:426 -#, python-format -msgid "An error occurred while fetching dataset owner values: %s" -msgstr "Pri pridobivanju polja lastnik podatkovnega seta je prišlo do napake: %s" +#: superset/connectors/sqla/views.py:303 +msgid "" +"Filters with the same group key will be ORed together within the group, while " +"different filter groups will be ANDed together. Undefined group keys are treated " +"as unique groups, i.e. are not grouped together. For example, if a table has " +"three filters, of which two are for departments Finance and Marketing (group key " +"= 'department'), and one refers to the region Europe (group key = 'region'), the " +"filter clause would apply the filter (department = 'Finance' OR department = " +"'Marketing') AND (region = 'Europe')." +msgstr "" +"Filtri z enakim skupinskim ključem bodo znotraj skupine združeni z OR funkcijo, " +"medtem ko bodo različne skupine združene z AND funkcijo. Nedefinirani skupinski " +"ključi so obravnavani kot unikatne skupine in niso združeni v svojo skupino. " +"Npr., če ima tabela tri filtre, pri čemer sta dva za oddelka marketinga in financ " +"(skupinski ključ = 'oddelek') tretji pa se nanaša na regijo Evropa (skupinski " +"ključ = 'regija'), bo filtrski izraz (oddelek = 'Finance' OR oddelek = " +"'Marketing') AND (regija = 'Evropa')." -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:184 -msgid "An error occurred while fetching dataset related data" -msgstr "Napaka pri pridobivanju podatkov iz podatkovnega seta" +#: superset/connectors/sqla/views.py:313 +msgid "" +"This is the condition that will be added to the WHERE clause. For example, to " +"only return rows for a particular client, you might define a regular filter with " +"the clause `client_id = 9`. To display no rows unless a user belongs to a RLS " +"filter role, a base filter can be created with the clause `1 = 0` (always false)." +msgstr "" +"To je pogoj, ki bo dodan WHERE stavku. Npr., če želite dobiti vrstice za določeno " +"stranko, lahko definirate regularni filter z izrazom 'id_stranke = 9'. Če ne " +"želimo prikazati vrstic, razen če uporabnik pripada RLS vlogi, lahko filter " +"ustvarimo z izrazom `1 = 0` (vedno neresnično)." -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:204 -#, python-format -msgid "An error occurred while fetching dataset related data: %s" -msgstr "Napaka pri pridobivanju podatkov iz podatkovnega seta: %s" +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:269 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:326 +#: superset/connectors/sqla/views.py:322 superset/connectors/sqla/views.py:341 +msgid "Tables" +msgstr "Tabele" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:445 -#, python-format -msgid "An error occurred while fetching datasets: %s" -msgstr "Prišlo je do napake pri pridobivanju podatkovnih setov: %s" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:439 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:442 +#: superset-frontend/src/profile/components/Security.tsx:35 +#: superset/connectors/sqla/views.py:323 superset/views/dashboard/mixin.py:83 +msgid "Roles" +msgstr "Vloge" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1356 -msgid "An error occurred while fetching function names." -msgstr "Pri pridobivanju imen funkcij je prišlo do napake." +#: superset/connectors/sqla/views.py:324 +msgid "Clause" +msgstr "Stavek" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:460 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:358 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:454 -#, python-format -msgid "An error occurred while fetching schema values: %s" -msgstr "Pri pridobivanju vrednosti shem je prišlo do napake: %s" +#: superset/connectors/sqla/views.py:325 superset/views/chart/mixin.py:78 +#: superset/views/dashboard/mixin.py:85 superset/views/dashboard/views.py:196 +#: superset/views/database/mixins.py:195 +msgid "Creator" +msgstr "Avtor" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:662 -msgid "An error occurred while fetching tab state" -msgstr "Pri pridobivanju stanja zavihka je prišlo do napake" +#: superset-frontend/src/dashboard/components/AddSliceCard.jsx:127 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:295 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:315 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:341 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:361 +#: superset/connectors/sqla/views.py:326 superset/connectors/sqla/views.py:452 +#: superset/views/dashboard/mixin.py:86 superset/views/dashboard/views.py:197 +#: superset/views/database/mixins.py:205 superset/views/sql_lab.py:77 +msgid "Modified" +msgstr "Spremenjeno" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1027 -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1052 -msgid "An error occurred while fetching table metadata" -msgstr "Pri pridobivanju metapodatkov tabele je prišlo do napake" +#: superset/connectors/sqla/views.py:342 +msgid "Show Table" +msgstr "Prikaži tabelo" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1093 -msgid "" -"An error occurred while fetching table metadata. Please contact your " -"administrator." -msgstr "" -"Pri pridobivanju metapodatkov tabele je prišlo do napake. Kontaktirajte " -"administratorja." +#: superset/connectors/sqla/views.py:343 +msgid "Import a table definition" +msgstr "Uvozi definicijo tabele" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:375 -#, python-format -msgid "An error occurred while fetching user values: %s" -msgstr "Pri pridobivanju vrednosti uporabnika je prišlo do napake: %s" +#: superset/connectors/sqla/views.py:344 +msgid "Edit Table" +msgstr "Uredi tabelo" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:698 +#: superset/connectors/sqla/views.py:375 msgid "" -"An error occurred while hiding the left bar. Please contact your " -"administrator." +"The list of charts associated with this table. By altering this datasource, you " +"may change how these associated charts behave. Also note that charts need to " +"point to a datasource, so this form will fail at saving if removing charts from a " +"datasource. If you want to change the datasource for a chart, overwrite the chart " +"from the 'explore view'" msgstr "" -"Pri skrivanju leve vrstice je prišlo do napake. Kontaktirajte " -"administratorja." +"Seznam grafikonov, povezanih s to tabelo. S spreminjanjem podatkovnega vira lahko " +"spremenite, kako se povezani grafikoni obnašajo. Poleg tega morajo biti grafikoni " +"povezani s podatkovnim virom. Če odstranite grafikon s podatkovnega vira ne bo " +"mogoče shraniti tega vnosa. Če želite spremeniti podatkovni vir grafikona, " +"prepišite grafikon v raziskovalnem pogledu." -#: superset-frontend/src/views/CRUD/hooks.ts:438 -#: superset-frontend/src/views/CRUD/hooks.ts:451 -#, python-format -msgid "An error occurred while importing %s: %s" -msgstr "Napaka pri uvažanju %s: %s" - -#: superset-frontend/src/chart/chartAction.js:569 -msgid "An error occurred while loading the SQL" -msgstr "Pri nalaganju SQL je prišlo do napake" +#: superset/connectors/sqla/views.py:384 +msgid "Timezone offset (in hours) for this datasource" +msgstr "Razlika časovnega pasu (v urah) za ta podatkovni vir" -#: superset/reports/commands/exceptions.py:242 -msgid "An error occurred while pruning logs " -msgstr "Pri krajšanju dnevnikov je prišlo do napake " +#: superset/connectors/sqla/views.py:385 +msgid "Name of the table that exists in the source database" +msgstr "Ime tabele, ki obstaja v izvorni podatkovni bazi" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:744 -msgid "An error occurred while removing query. Please contact your administrator." +#: superset/connectors/sqla/views.py:386 +msgid "Schema, as used only in some databases like Postgres, Redshift and DB2" msgstr "" -"Pri odstranjevanju poizvedbe je prišlo do napake. Kontaktirajte " -"administratorja." +"Shema, ki se uporablja pri nekaterih podatkovnih bazah, kot so Postgres, Redshift " +"in DB2" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:720 -msgid "An error occurred while removing tab. Please contact your administrator." +#: superset/connectors/sqla/views.py:393 +msgid "" +"This fields acts a Superset view, meaning that Superset will run a query against " +"this string as a subquery." msgstr "" -"Pri odstranjevanju zavihka je prišlo do napake. Kontaktirajte " -"administratorja." +"To polje se obnaša kot Supersetov pogled, kar pomeni, da bo Superset izvedel " +"poizvedbo za ta niz kot podpoizvedbo." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1188 +#: superset/connectors/sqla/views.py:397 msgid "" -"An error occurred while removing the table schema. Please contact your " -"administrator." +"Predicate applied when fetching distinct value to populate the filter control " +"component. Supports jinja template syntax. Applies only when `Enable Filter " +"Select` is on." msgstr "" -"Pri odstranjevanju sheme tabele je prišlo do napake. Kontaktirajte " -"administratorja." +"Privzeta vrednost za pridobivanje različnih vrednost pri oblikovanju filtrov. " +"Podpira sintakso za jinja predloge. Potrebno le, ko je vključeno `Omogoči izbiro " +"filtra`." -#: superset-frontend/src/chart/chartReducer.ts:94 -#, python-format -msgid "An error occurred while rendering the visualization: %s" -msgstr "Pri prikazovanju vizualizacije je prišlo do napake: %s" +#: superset/connectors/sqla/views.py:403 +msgid "Redirects to this endpoint when clicking on the table from the table list" +msgstr "Preusmeri v to končno točko, ko kliknete na tabelo v seznamu tabel" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:575 +#: superset/connectors/sqla/views.py:407 msgid "" -"An error occurred while setting the active tab. Please contact your " -"administrator." +"Whether to populate the filter's dropdown in the explore view's filter section " +"with a list of distinct values fetched from the backend on the fly" msgstr "" -"Pri določanju aktivnega zavihka je prišlo do napake. Kontaktirajte " -"administratorja." +"Če želite napolniti spustni seznam filtra v raziskovalnem pogledu filtrske " +"sekcije z različnimi vrednostmi, pridobljenimi sproti v ozadju" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:825 -msgid "" -"An error occurred while setting the tab autorun. Please contact your " -"administrator." +#: superset/connectors/sqla/views.py:412 +msgid "Whether the table was generated by the 'Visualize' flow in SQL Lab" msgstr "" -"Pri določanju samodejnega zagona zavihka je prišlo do napake. " -"Kontaktirajte administratorja." +"Če želite, da je tabela ustvarjena s postopkom 'Vizualizacija' v SQL laboratoriju" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:767 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:949 +#: superset/connectors/sqla/views.py:415 msgid "" -"An error occurred while setting the tab database ID. Please contact your " -"administrator." +"A set of parameters that become available in the query using Jinja templating " +"syntax" msgstr "" -"Pri določanju ID-ja v podatkovne baze za zavihek je prišlo do napake. " -"Kontaktirajte administratorja." +"Nabor parametrov, ki postanejo razpoložljivi za poizvedbo z uporabo sintakse za " +"Jinja predloge" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:792 +#: superset/connectors/sqla/views.py:419 msgid "" -"An error occurred while setting the tab schema. Please contact your " -"administrator." +"Duration (in seconds) of the caching timeout for this table. A timeout of 0 " +"indicates that the cache never expires. Note this defaults to the database " +"timeout if undefined." msgstr "" -"Pri določanju sheme zavihka je prišlo do napake. Kontaktirajte " -"administratorja." +"Trajanje (v sekundah) predpomnjenja za to tabelo. Vrednost 0 označuje, da " +"predpomnilnik nikoli ne poteče. V primeru, da ni definirano, ima nastavitev " +"trajanja za podatkovno bazo." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:967 -msgid "" -"An error occurred while setting the tab template parameters. Please " -"contact your administrator." -msgstr "" -"Pri določanju parametrov predloge zavihka je prišlo do napake. " -"Kontaktirajte administratorja." +#: superset/connectors/sqla/views.py:433 +msgid "Associated Charts" +msgstr "Povezani grafikoni" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:850 -#: superset-frontend/src/SqlLab/actions/sqlLab.js:941 -msgid "" -"An error occurred while setting the tab title. Please contact your " -"administrator." -msgstr "" -"Pri določanju naslova zavihka je prišlo do napake. Kontaktirajte " -"administratorja." +#: superset/connectors/sqla/views.py:435 +msgid "Changed By" +msgstr "Spremenil" -#: superset-frontend/src/explore/actions/exploreActions.ts:95 -msgid "An error occurred while starring this chart" -msgstr "Pri ocenjevanju grafikona je prišlo do napake" +#: superset-frontend/src/components/DatabaseSelector/index.tsx:279 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1145 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1150 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:251 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:280 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:326 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:479 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:223 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:331 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:279 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:426 +#: superset/connectors/sqla/views.py:436 superset/connectors/sqla/views.py:437 +#: superset/templates/superset/import_dashboards.html:53 +#: superset/views/database/forms.py:123 superset/views/database/forms.py:285 +#: superset/views/database/forms.py:416 superset/views/database/mixins.py:194 +#: superset/views/sql_lab.py:75 +msgid "Database" +msgstr "Podatkovna baza" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:232 -#: superset-frontend/src/SqlLab/actions/sqlLab.js:258 -msgid "" -"An error occurred while storing the latest query id in the backend. " -"Please contact your administrator if this problem persists." -msgstr "" -"Pri shranjevanju zadnjega id-ja poizvedbe v sistem je prišlo do napake. " -"Če se težava ponavlja, kontaktirajte administratorja." +#: superset/connectors/sqla/views.py:438 superset/views/database/mixins.py:196 +msgid "Last Changed" +msgstr "Zadnja sprememba" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:908 -msgid "" -"An error occurred while storing your query in the backend. To avoid " -"losing your changes, please save your query using the \"Save Query\" " -"button." -msgstr "" -"Pri shranjevanju vaše poizvedbe v sistem je prišlo do napake. Da ne " -"izgubite sprememb, shranite poizvedbo z gumbom \"Shrani poizvedbo\"." +#: superset/connectors/sqla/views.py:439 +msgid "Enable Filter Select" +msgstr "Omogoči izbiro filtra" -#: superset/key_value/commands/exceptions.py:41 -#, fuzzy -msgid "An error occurred while updating the value." -msgstr "Pri ustvarjanju podatkovnega vira je prišlo do težave" +#: superset-frontend/src/components/DatabaseSelector/index.tsx:303 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:221 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:331 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:494 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:232 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:289 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:446 +#: superset/connectors/sqla/views.py:440 superset/views/database/forms.py:129 +#: superset/views/database/forms.py:291 superset/views/database/forms.py:422 +msgid "Schema" +msgstr "Shema" -#: superset/views/core.py:711 -msgid "An unknown error occurred. Please contact your Superset administrator" -msgstr "" -"Zgodila se je neznana napaka. Kontaktirajte svojega administratorja za " -"Superset" +#: superset/connectors/sqla/views.py:441 +msgid "Default Endpoint" +msgstr "Privzeta končna točka" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:223 -msgid "Anchor to" -msgstr "Sidraj na" +#: superset/connectors/sqla/views.py:442 +msgid "Offset" +msgstr "Odmik" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:121 -msgid "Angle at which to end progress axis" -msgstr "Kot, pri katerem se konča os območja" +#: superset/connectors/sqla/views.py:443 superset/views/chart/mixin.py:77 +msgid "Cache Timeout" +msgstr "Trajanje predpomnilnika" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:111 -msgid "Angle at which to start progress axis" -msgstr "Kot, pri katerem se začne os območja" +#: superset/connectors/sqla/views.py:444 superset/views/database/forms.py:95 +#: superset/views/database/forms.py:249 superset/views/database/forms.py:385 +msgid "Table Name" +msgstr "Ime tabele" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:191 -msgid "Animation" -msgstr "Animacija" +#: superset/connectors/sqla/views.py:445 +msgid "Fetch Values Predicate" +msgstr "Pridobi vrednosti predikatov" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:202 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:248 -msgid "Annotation" -msgstr "Oznaka" +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:235 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:558 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:372 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:375 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:419 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:422 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:173 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:284 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1097 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1102 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:337 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:366 +#: superset/connectors/sqla/views.py:446 superset/views/chart/mixin.py:83 +#: superset/views/dashboard/mixin.py:82 +msgid "Owners" +msgstr "Lastniki" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:263 -msgid "Annotation Layer ${annotationLayerName}" -msgstr "Sloj z oznakami ${annotationLayerName}" +#: superset/connectors/sqla/views.py:447 +msgid "Main Datetime Column" +msgstr "Glavni stolpec Datum-Čas" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/annotationsAndLayers.tsx:35 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:124 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:271 -#: superset/initialization/__init__.py:229 superset/views/annotations.py:117 -msgid "Annotation Layers" -msgstr "Sloji z oznakami" +#: superset/connectors/sqla/views.py:449 +msgid "SQL Lab View" +msgstr "Pogled SQL laboratorija" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:465 -msgid "Annotation Slice Configuration" -msgstr "Nastavitve rezine z oznakami" +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:93 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:948 +#: superset/connectors/sqla/views.py:450 +msgid "Template parameters" +msgstr "Parametri predlog" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:758 -msgid "Annotation Source" -msgstr "Vir oznak" +#: superset/connectors/sqla/views.py:473 +msgid "" +"The table was created. As part of this two-phase configuration process, you " +"should now click the edit button by the new table to configure it." +msgstr "" +"Tabela je ustvarjena. Sedaj morate v tem dvodelnem postopku klikniti gumb za " +"urejanje nove tabele." -#: superset/annotation_layers/annotations/commands/exceptions.py:64 -msgid "Annotation could not be created." -msgstr "Oznake ni mogoče ustvariti." +#: superset/css_templates/api.py:139 +#, python-format +msgid "Deleted %(num)d css template" +msgid_plural "Deleted %(num)d css templates" +msgstr[0] "Izbrisana %(num)d css predloga" +msgstr[1] "Izbrisani %(num)d css predlogi" +msgstr[2] "Izbrisane %(num)d css predloge" +msgstr[3] "Izbrisanih %(num)d css predlog" -#: superset/annotation_layers/annotations/commands/exceptions.py:68 -msgid "Annotation could not be updated." -msgstr "Oznake ni mogoče posodobiti." +#: superset/css_templates/commands/exceptions.py:23 +msgid "CSS template could not be deleted." +msgstr "CSS predloge ni mogoče izbrisati." -#: superset/annotation_layers/annotations/commands/exceptions.py:72 -msgid "Annotation delete failed." -msgstr "Izbris oznake ni uspel." +#: superset/css_templates/commands/exceptions.py:27 +msgid "CSS template not found." +msgstr "CSS predloga ni najdena." -#: superset/views/annotations.py:47 -msgid "Annotation end time must be no earlier than start time." -msgstr "Končni čas oznake ne sem biti pred začetnim." +#: superset/dashboards/api.py:713 +#, python-format +msgid "Deleted %(num)d dashboard" +msgid_plural "Deleted %(num)d dashboards" +msgstr[0] "Izbrisana je %(num)d nadzorna plošča" +msgstr[1] "Izbrisani sta %(num)d nadzorni plošči" +msgstr[2] "Izbrisane so %(num)d nadzorne plošče" +msgstr[3] "Izbrisanih je %(num)d nadzornih plošč" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:265 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:322 -msgid "Annotation layer" -msgstr "Sloj z oznakami" +#: superset/dashboards/filters.py:37 +msgid "Title or Slug" +msgstr "Naslov ali `Slug`" -#: superset/annotation_layers/commands/exceptions.py:37 -msgid "Annotation layer could not be created." -msgstr "Sloja z oznakami ni mogoče ustvariti." +#: superset/dashboards/filters.py:53 +msgid "Created by me" +msgstr "Ustvarjeno z moje strani" -#: superset/annotation_layers/commands/exceptions.py:33 -msgid "Annotation layer could not be deleted." -msgstr "Sloja z oznakami ni mogoče izbrisati." +#: superset/dashboards/filters.py:202 +msgid "Role" +msgstr "Vloga" -#: superset/annotation_layers/commands/exceptions.py:41 -msgid "Annotation layer could not be updated." -msgstr "Sloja z oznakami ni mogoče posodobiti." +#: superset/dashboards/commands/exceptions.py:39 +msgid "Must be unique" +msgstr "Mora biti unikaten" -#: superset/annotation_layers/commands/exceptions.py:49 -msgid "Annotation layer delete failed." -msgstr "Izbris sloja z oznakami ni uspel." +#: superset/dashboards/commands/exceptions.py:43 +msgid "Dashboard parameters are invalid." +msgstr "Parametri nadzorne plošče so neveljavni." -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:517 -msgid "Annotation layer description columns" -msgstr "Stolpci z opisi slojev z oznakami" +#: superset/dashboards/commands/exceptions.py:54 +msgid "Dashboard could not be created." +msgstr "Nadzorne plošče ni mogoče ustvariti." -#: superset/annotation_layers/commands/exceptions.py:53 -#: superset/annotation_layers/commands/exceptions.py:57 -msgid "Annotation layer has associated annotations." -msgstr "Sloj z oznakami ima povezane oznake." - -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:492 -msgid "Annotation layer interval end" -msgstr "Konec intervala sloja z oznakami" - -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:247 -msgid "Annotation layer name" -msgstr "Ime sloja z oznakami" - -#: superset/annotation_layers/commands/exceptions.py:45 -msgid "Annotation layer not found." -msgstr "Sloja z oznakami ni mogoče najti." - -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:634 -msgid "Annotation layer opacity" -msgstr "Prosojnost sloja z oznakami" - -#: superset/annotation_layers/commands/exceptions.py:29 -msgid "Annotation layer parameters are invalid." -msgstr "Parametri sloja z oznakami so neveljavni." - -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:619 -msgid "Annotation layer stroke" -msgstr "Obroba sloja z oznakami" - -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:472 -msgid "Annotation layer time column" -msgstr "Časovni stolpec sloja z oznakami" - -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:506 -msgid "Annotation layer title column" -msgstr "Stolpec z naslovom sloja z oznakami" - -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:743 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:746 -msgid "Annotation layer type" -msgstr "Tip sloja z oznakami" - -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:403 -msgid "Annotation layer value" -msgstr "Vrednost sloja z oznakami" +#: superset/dashboards/commands/exceptions.py:58 +msgid "Dashboards could not be deleted." +msgstr "Nadzornih plošč ni mogoče izbrisati." -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:72 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:343 -msgid "Annotation layers" -msgstr "Sloji z oznakami" +#: superset/dashboards/commands/exceptions.py:66 +msgid "Dashboard could not be updated." +msgstr "Nadzorne plošče ni mogoče posodobiti." -#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:45 -msgid "Annotation layers are still loading." -msgstr "Sloj z oznakami se še vedno nalaga." +#: superset/dashboards/commands/exceptions.py:70 +msgid "Dashboard could not be deleted." +msgstr "Nadzorne plošče ni mogoče izbrisati." -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:292 -msgid "Annotation name" -msgstr "Ime oznake" +#: superset/dashboards/commands/exceptions.py:78 +msgid "Changing this Dashboard is forbidden" +msgstr "Spreminjanje te nadzorne plošče ni dovoljeno" -#: superset/annotation_layers/annotations/commands/exceptions.py:56 -msgid "Annotation not found." -msgstr "Oznaka ni najdena." +#: superset/dashboards/commands/exceptions.py:82 +msgid "Import dashboard failed for an unknown reason" +msgstr "Uvoz nadzorne plošče ni uspel zaradi neznanega razloga" -#: superset/annotation_layers/annotations/commands/exceptions.py:60 -msgid "Annotation parameters are invalid." -msgstr "Parametri oznak so neveljavni." +#: superset/dashboards/commands/exceptions.py:86 +msgid "You don't have access to this dashboard." +msgstr "Nimate dostopa do te nadzorne plošče." -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:755 -msgid "Annotation source type" -msgstr "Tip vira oznak" +#: superset/dashboards/commands/importers/v0.py:305 +msgid "No data in file" +msgstr "V datoteki ni podatkov" -#: superset/views/annotations.py:58 -msgid "Annotations" -msgstr "Oznake" +#: superset/dashboards/permalink/exceptions.py:23 +#: superset/explore/permalink/exceptions.py:23 +msgid "Invalid state." +msgstr "Neveljavno stanje." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/annotationsAndLayers.tsx:25 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:113 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:261 -msgid "Annotations and Layers" -msgstr "Oznake in sloji" +#: superset/dashboards/permalink/exceptions.py:27 +#: superset/explore/permalink/exceptions.py:27 superset/key_value/exceptions.py:34 +#: superset/temporary_cache/commands/exceptions.py:29 +msgid "An error occurred while creating the value." +msgstr "Pri ustvarjanju vrednosti je prišlo do težave." -#: superset-frontend/src/explore/controlPanels/sections.tsx:91 -msgid "Annotations and layers" -msgstr "Oznake in sloji" +#: superset/dashboards/permalink/exceptions.py:31 +#: superset/explore/permalink/exceptions.py:31 superset/key_value/exceptions.py:38 +#: superset/temporary_cache/commands/exceptions.py:33 +msgid "An error occurred while accessing the value." +msgstr "Pri dostopanju do vednosti je prišlo do težave." -#: superset/annotation_layers/annotations/commands/exceptions.py:52 -msgid "Annotations could not be deleted." -msgstr "Oznak ni mogoče izbrisati." +#: superset/databases/decorators.py:46 +msgid "Table name undefined" +msgstr "Ime tabele ni definirano" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:441 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:535 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:438 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:496 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:509 -msgid "Any" -msgstr "Katerikoli" +#: superset/databases/filters.py:66 +msgid "Upload Enabled" +msgstr "Nalaganje omogočeno" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:563 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:269 -msgid "Any additional detail to show in the certification tooltip." +#: superset/databases/schemas.py:151 +msgid "" +"Invalid connection string, a valid string usually follows: driver://user:" +"password@database-host/database-name" msgstr "" +"Neveljaven niz povezave - veljaven niz običajno sledi: driver://user:" +"password@database-host/database-name" -#: superset-frontend/src/dashboard/components/ColorSchemeControlWrapper.jsx:56 +#: superset/databases/schemas.py:186 superset/databases/schemas.py:201 +#, python-format +msgid "Field cannot be decoded by JSON. %(msg)s" +msgstr "Polja ni mogoče dekodirati z JSON. %(msg)s" + +#: superset/databases/schemas.py:209 +#, python-format msgid "" -"Any color palette selected here will override the colors applied to this " -"dashboard's individual charts" +"The metadata_params in Extra field is not configured correctly. The key %(key)s " +"is invalid." msgstr "" -"Na tem mestu izbrana barvna shema bo nadomestila barve posameznih " -"grafikonov v tej nadzorni plošči" +"Metadata_params v polju Dodatno niso pravilno nastavljeni. Ključ %(key)s je " +"neveljaven." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:702 -msgid "Any databases that allow connections via SQL Alchemy URIs can be added. " +#: superset/databases/schemas.py:275 +msgid "" +"Engine spec \"InvalidEngine\" does not support being configured via individual " +"parameters." msgstr "" +"Specifikacija baze \"InvalidEngine\" ne podpira konfiguracije s posameznimi " +"parametri." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:716 +#: superset/databases/schemas.py:302 msgid "" -"Any databases that allow connections via SQL Alchemy URIs can be added. " -"Learn about how to connect a database driver " +"An engine must be specified when passing individual parameters to a database." msgstr "" +"Pri podajanju posameznih parametrov podatkovne baze mora biti podan njen tip." -#: superset/views/database/forms.py:147 superset/views/database/forms.py:300 -#: superset/views/database/forms.py:428 -msgid "Append" -msgstr "Dodaj" - -#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:186 +#: superset/databases/commands/validate.py:60 superset/databases/schemas.py:312 #, python-format -msgid "Applied Cross Filters (%d)" -msgstr "Uporabljeni medsebojni filtri (%d)" +msgid "Engine \"%(engine)s\" is not a valid engine." +msgstr "\"%(engine)s\" ni veljaven tip podatkovne baze." -#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:210 +#: superset/databases/commands/exceptions.py:32 +msgid "Database parameters are invalid." +msgstr "Parametri podatkovne baze so neveljavni." + +#: superset/databases/commands/exceptions.py:42 +msgid "A database with the same name already exists." +msgstr "Podatkovna baza z enakim imenom že obstaja." + +#: superset/databases/commands/exceptions.py:50 +msgid "Field is required" +msgstr "Polje je obvezno" + +#: superset/databases/commands/exceptions.py:63 #, python-format -msgid "Applied Filters (%d)" -msgstr "Uporabljeni filtri (%d)" +msgid "Field cannot be decoded by JSON. %(json_error)s" +msgstr "Polja ni mogoče dekodirati z JSON. %(json_error)s" -#: superset/viz.py:237 +#: superset/databases/commands/exceptions.py:80 +#: superset/views/database/mixins.py:255 msgid "" -"Applied rolling window did not return any data. Please make sure the " -"source query satisfies the minimum periods defined in the rolling window." +"The metadata_params in Extra field is not configured correctly. The key %{key}s " +"is invalid." msgstr "" -"Izbrano drseče okno ni vrnilo podatkov. Poskrbite, da izvorna poizvedba " -"ustreza minimalni periodi drsečega okna." +"Metadata_params v polju Dodatno niso pravilno nastavljeni. Ključ %{key}s je " +"neveljaven." -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:458 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx:144 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:788 -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:228 -#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:433 -msgid "Apply" -msgstr "Uporabi" +#: superset/databases/commands/exceptions.py:92 +msgid "Database not found." +msgstr "Podatkovna baza ni najdena." -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:321 -msgid "Apply conditional color formatting to metrics" -msgstr "Za mere uporabi pogojno oblikovanje z barvami" +#: superset/databases/commands/exceptions.py:96 +msgid "Database could not be created." +msgstr "Podatkovne baze ni mogoče ustvariti." -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:474 -msgid "Apply conditional color formatting to numeric columns" -msgstr "Za numerične stolpce uporabi pogojno oblikovanje z barvami" +#: superset/databases/commands/exceptions.py:100 +msgid "Database could not be updated." +msgstr "Podatkovne baze ni mogoče posodobiti." -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:79 -msgid "Apply metrics on" -msgstr "Uporabi mero na" +#: superset/databases/commands/exceptions.py:107 +#: superset/databases/commands/exceptions.py:124 superset/views/core.py:1403 +msgid "Connection failed, please check your connection settings" +msgstr "Povezava neuspešna. Preverite nastavitve povezave" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:123 -msgid "Apply to all panels" -msgstr "Uporabi za vse panele" +#: superset/databases/commands/exceptions.py:111 +msgid "Cannot delete a database that has datasets attached" +msgstr "Podatkovne baze s povezanimi podatkovnimi viri ni mogoče izbrisati" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:125 -msgid "Apply to specific panels" -msgstr "Uporabi za določene panele" +#: superset/databases/commands/exceptions.py:115 +msgid "Database could not be deleted." +msgstr "Podatkovne baze ni mogoče izbrisati." -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:69 -msgid "April" -msgstr "April" +#: superset/databases/commands/exceptions.py:128 +msgid "Stopped an unsafe database connection" +msgstr "Nevarna povezava s podatkovno bazo je bila ustavljena" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:49 -msgid "Are you sure you want to cancel?" -msgstr "Ali želite prekiniti?" +#: superset/databases/commands/exceptions.py:132 +msgid "Could not load database driver" +msgstr "Ni mogoče naložiti gonilnika podatkovne baze" -#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:80 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:360 -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:108 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:358 -msgid "Are you sure you want to delete" -msgstr "Ali ste prepričani, da želite izbrisati" +#: superset/databases/commands/exceptions.py:137 superset/views/core.py:1411 +msgid "Unexpected error occurred, please check your logs for details" +msgstr "Zgodila se je nepričakovana napaka. Podrobnosti preverite v dnevnikih" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:286 -msgid "" -"Are you sure you want to delete " -"${annotationCurrentlyDeleting?.short_descr}?" -msgstr "" -"Ste prepričani, da želite izbrisati " -"${annotationCurrentlyDeleting?.short_descr}?" +#: superset/databases/commands/exceptions.py:142 +msgid "no SQL validator is configured" +msgstr "SQL potrjevalnik ni nastavljen" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:486 -#, python-format -msgid "Are you sure you want to delete the selected %s?" -msgstr "Ali ste prepričani, da želite izbrisati izbrane %s?" +#: superset/databases/commands/exceptions.py:147 +msgid "No validator found (configured for the engine)" +msgstr "Potrjevalnik ni najden (nastavljen za podatkovno bazo)" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:301 -msgid "Are you sure you want to delete the selected annotations?" -msgstr "Ali ste prepričani, da želite izbrisati izbrane oznake?" +#: superset/databases/commands/exceptions.py:152 +#: superset/databases/commands/exceptions.py:162 +msgid "Was unable to check your query" +msgstr "Poizvedbe ni bilo mogoče preveriti" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:645 -msgid "Are you sure you want to delete the selected charts?" -msgstr "Ali ste prepričani, da želite izbrisati izbrane grafikone?" +#: superset/databases/commands/exceptions.py:157 +msgid "An unexpected error occurred" +msgstr "Prišlo je do nepričakovane napake" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:612 -msgid "Are you sure you want to delete the selected dashboards?" -msgstr "Ali ste prepričani, da želite izbrisati izbrane nadzorne plošče?" +#: superset/databases/commands/exceptions.py:166 +msgid "Import database failed for an unknown reason" +msgstr "Uvoz podatkovne baze ni uspel zaradi neznanega razloga" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:618 -msgid "Are you sure you want to delete the selected datasets?" -msgstr "Ali ste prepričani, da želite izbrisati izbrane podatkovne sete?" +#: superset/databases/commands/test_connection.py:134 +msgid "Could not load database driver: {}" +msgstr "Ni mogoče naložiti gonilnika podatkovne baze: {}" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:366 -msgid "Are you sure you want to delete the selected layers?" -msgstr "Ali ste prepričani, da želite izbrisati izbrane sloje?" +#: superset/databases/commands/validate.py:73 +#, python-format +msgid "Engine \"%(engine)s\" cannot be configured through parameters." +msgstr "Podatkovne baze tipa \"%(engine)s\" ni mogoče konfigurirati s parametri." -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:500 -msgid "Are you sure you want to delete the selected queries?" -msgstr "Ali ste prepričani, da želite izbrisati izbrane poizvedbe?" +#: superset/databases/commands/validate.py:140 +msgid "Database is offline." +msgstr "Podatkovna baza ni povezana." -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:326 -msgid "Are you sure you want to delete the selected templates?" -msgstr "Ali ste prepričani, da želite izbrisati izbrane predloge?" +#: superset/databases/commands/validate_sql.py:73 superset/views/core.py:2372 +#, python-format +msgid "" +"%(validator)s was unable to check your query.\n" +"Please recheck your query.\n" +"Exception: %(ex)s" +msgstr "" +"%(validator)s ni mogel preveriti vaše poizvedbe.\n" +"Ponovno preverite poizvedbo.\n" +"Izjema: %(ex)s" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:133 -msgid "Are you sure you want to proceed?" -msgstr "Ali želite nadaljevati?" +#: superset/databases/commands/validate_sql.py:101 +msgid "no SQL validator is configured for {}" +msgstr "SQL potrjevalnik ni nastavljen za {}" -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:173 -msgid "Are you sure you want to save and apply changes?" -msgstr "Ali resnično želite shraniti in uporabiti spremembe?" +#: superset/databases/commands/validate_sql.py:114 +msgid "No validator named {} found (configured for the {} engine)" +msgstr "Potrjevalnik {} ni bil najden (nastavljen za podatkovno bazo {})" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:41 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:132 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:135 -msgid "Area Chart" -msgstr "Ploščinski grafikon" +#: superset/datasets/api.py:680 +#, python-format +msgid "Deleted %(num)d dataset" +msgid_plural "Deleted %(num)d datasets" +msgstr[0] "Izbrisan %(num)d podatkovni set" +msgstr[1] "Izbrisana %(num)d podatkovna niza" +msgstr[2] "Izbrisani %(num)d podatkovni nizi" +msgstr[3] "Izbrisanih %(num)d podatkovnih nizov" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:168 -msgid "Area chart" -msgstr "Ploščinski grafikon" +#: superset/datasets/filters.py:26 +msgid "Null or Empty" +msgstr "Nič (NULL) ali prazen" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:131 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:146 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:149 -msgid "Area chart opacity" -msgstr "Prosojnost ploščinskega grafikona" +#: superset/datasets/columns/commands/exceptions.py:23 +msgid "Dataset column not found." +msgstr "Stolpec podatkovnega seta ni najden." -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:238 -msgid "Arrow" -msgstr "Puščica" +#: superset/datasets/columns/commands/exceptions.py:27 +msgid "Dataset column delete failed." +msgstr "Brisanje stolpca podatkovnega seta neuspešno." -#: superset/connectors/druid/views.py:342 superset/connectors/sqla/views.py:487 -msgid "Associated Charts" -msgstr "Povezani grafikoni" +#: superset/datasets/columns/commands/exceptions.py:31 +#: superset/datasets/metrics/commands/exceptions.py:31 +msgid "Changing this dataset is forbidden." +msgstr "Spreminjanje tega podatkovnega seta ni dovoljeno." -#: superset/views/database/mixins.py:199 -msgid "Async Execution" -msgstr "Asinhrono izvajanje" +#: superset/datasets/commands/exceptions.py:32 +#, python-format +msgid "Dataset %(name)s already exists" +msgstr "Podatkovni set %(name)s že obstaja" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:236 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:401 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:285 -msgid "Asynchronous query execution" -msgstr "Asinhroni zagon poizvedb" +#: superset/datasets/commands/exceptions.py:50 +msgid "Database not allowed to change" +msgstr "Podatkovne baze ni dovoljeno spreminjati" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:73 -msgid "August" -msgstr "Avgust" +#: superset/datasets/commands/exceptions.py:70 +msgid "One or more columns do not exist" +msgstr "En ali več stolpcev ne obstaja" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:523 -msgid "Autocomplete" -msgstr "Samodokončaj" +#: superset/datasets/commands/exceptions.py:80 +msgid "One or more columns are duplicated" +msgstr "En ali več stolpcev je podvojenih" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:708 -msgid "Autocomplete filters" -msgstr "Samodokončaj filtre" +#: superset/datasets/commands/exceptions.py:90 +msgid "One or more columns already exist" +msgstr "En ali več stolpcev že obstaja" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:715 -msgid "Autocomplete query predicate" -msgstr "Predikat za samodokončanje poizvedb" +#: superset/datasets/commands/exceptions.py:99 +msgid "One or more metrics do not exist" +msgstr "Ena ali več mer ne obstaja" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:242 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:270 -msgid "Available sorting modes:" -msgstr "" +#: superset/datasets/commands/exceptions.py:109 +msgid "One or more metrics are duplicated" +msgstr "Ena ali več mer je podvojenih" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:200 -msgid "Axis" -msgstr "Os" +#: superset/datasets/commands/exceptions.py:119 +msgid "One or more metrics already exist" +msgstr "Ena ali več mer že obstaja" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:36 -msgid "Axis ascending" -msgstr "Naraščajoča os" +#: superset/datasets/commands/exceptions.py:130 +#, python-format +msgid "" +"Table [%(table_name)s] could not be found, please double check your database " +"connection, schema, and table name" +msgstr "" +"Tabele [%(table_name)s] ni mogoče najti. Preverite povezavo, shemo in ime " +"podatkovne baze" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:37 -msgid "Axis descending" -msgstr "Padajoča os" +#: superset/datasets/commands/exceptions.py:149 +msgid "Dataset does not exist" +msgstr "Podatkovni set ne obstaja" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:770 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:786 -msgid "Back" -msgstr "Nazaj" +#: superset/datasets/commands/exceptions.py:153 +msgid "Dataset parameters are invalid." +msgstr "Parametri podatkovnega seta so neveljavni." -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:227 -#: superset/views/database/mixins.py:204 -msgid "Backend" -msgstr "Vrsta" +#: superset/datasets/commands/exceptions.py:157 +msgid "Dataset could not be created." +msgstr "Podatkovnega niza ni mogoče ustvariti." -#: superset/viz.py:2472 superset/viz.py:2508 -msgid "Bad spatial key" -msgstr "Neustrezen prostorski ključ" +#: superset/datasets/commands/exceptions.py:161 +#: superset/datasets/commands/exceptions.py:173 +msgid "Dataset could not be updated." +msgstr "Podatkovnega niza ni mogoče posodobiti." -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:85 -msgid "Bar" -msgstr "Stolpec" +#: superset/datasets/commands/exceptions.py:165 +msgid "Dataset could not be deleted." +msgstr "Podatkovnega niza ni mogoče izbrisati." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:38 -msgid "Bar Chart" -msgstr "Stolpčni grafikon" +#: superset/datasets/commands/exceptions.py:169 +msgid "Dataset(s) could not be bulk deleted." +msgstr "Podatkovnih nizov ni mogoče množično izbrisati." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:294 -msgid "Bar Values" -msgstr "Vrednosti stolpcev" +#: superset/datasets/commands/exceptions.py:177 +msgid "Samples for dataset could not be retrieved." +msgstr "Vzorcev za podatkovni set ni bilo mogoče pridobiti." -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:227 -msgid "Base layer map style" -msgstr "Slog osnovnega sloja zemljevida" +#: superset/datasets/commands/exceptions.py:181 +msgid "Changing this dataset is forbidden" +msgstr "Spreminjanje tega podatkovnega seta ni dovoljeno" -#: superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx:165 -msgid "Based on a metric" -msgstr "Osnovan na meri" +#: superset/datasets/commands/exceptions.py:185 +msgid "Import dataset failed for an unknown reason" +msgstr "Uvoz podatkovnega seta ni uspel zaradi neznanega razloga" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:50 -msgid "Based on granularity, number of time periods to compare against" -msgstr "Na osnovi granulacije, število časovnih obdobij za primerjavo" +#: superset/datasets/commands/exceptions.py:189 +msgid "You don't have access to this dataset." +msgstr "Nimate dostopa do tega podatkovnega seta." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:686 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:263 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1034 -msgid "Basic" -msgstr "Osnovno" +#: superset/datasets/metrics/commands/exceptions.py:23 +msgid "Dataset metric not found." +msgstr "Mer podatkovnega seta ni najdena." -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:497 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:229 -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:288 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:243 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:237 -msgid "Basic information" -msgstr "Osnovne informacije" +#: superset/datasets/metrics/commands/exceptions.py:27 +msgid "Dataset metric delete failed." +msgstr "Brisanje mere podatkovnega seta ni uspelo." -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:486 +#: superset/db_engine_specs/athena.py:55 superset/db_engine_specs/bigquery.py:181 +#: superset/db_engine_specs/postgres.py:145 +#: superset/db_engine_specs/snowflake.py:105 #, python-format -msgid "Batch editing %d filters:" -msgstr "Skupinsko urejanje %d filtrov:" +msgid "" +"Please check your query for syntax errors at or near \"%(syntax_error)s\". Then, " +"try running your query again." +msgstr "" +"Preverite, če ima vaša poizvedba sintaktične napake pri \"%(syntax_error)s\". " +"Potem ponovno poženite poizvedbo." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:36 -msgid "Battery level over time" -msgstr "Napolnjenost baterije skozi čas" +#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:29 +#: superset-frontend/src/explore/components/DataTableControl/index.tsx:143 +#: superset/db_engine_specs/base.py:96 +msgid "Original value" +msgstr "Izvorna vrednost" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1175 -msgid "Be careful." -msgstr "Bodite previdni." +#: superset/db_engine_specs/base.py:97 +msgid "Second" +msgstr "Sekunda" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:76 -msgid "Before" -msgstr "PRED" +#: superset/db_engine_specs/base.py:98 +msgid "5 second" +msgstr "5 sekund" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:38 -#: superset/viz.py:1254 -msgid "Big Number" -msgstr "Velika številka" +#: superset/db_engine_specs/base.py:99 +msgid "30 second" +msgstr "30 sekund" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:28 -msgid "Big Number Font Size" -msgstr "Velikost pisave Velike številke" +#: superset/db_engine_specs/base.py:100 +msgid "Minute" +msgstr "Minuta" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:34 -#: superset/viz.py:1220 -msgid "Big Number with Trendline" -msgstr "Velika številka s trendno krivuljo" +#: superset/db_engine_specs/base.py:101 +msgid "5 minute" +msgstr "5 minut" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:290 -msgid "Bottom" -msgstr "Spodaj" +#: superset/db_engine_specs/base.py:102 +msgid "10 minute" +msgstr "10 minut" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:212 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:187 -msgid "Bottom Margin" -msgstr "Spodnji rob" +#: superset/db_engine_specs/base.py:103 +msgid "15 minute" +msgstr "15 minut" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:224 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:191 -msgid "Bottom margin, in pixels, allowing for more room for axis labels" -msgstr "Spodnji rob, v pikslih, s katerim povečamo prostor za oznake osi" +#: superset/db_engine_specs/base.py:104 +msgid "30 minute" +msgstr "30 minut" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:140 -msgid "Bottom to Top" -msgstr "Iz dna proti vrhu" +#: superset/db_engine_specs/base.py:105 +msgid "Hour" +msgstr "Ura" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:241 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:257 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:357 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:272 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:235 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:215 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:232 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:288 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:291 -msgid "" -"Bounds for the Y-axis. When left empty, the bounds are dynamically " -"defined based on the min/max of the data. Note that this feature will " -"only expand the axis range. It won't narrow the data's extent." -msgstr "" -"Meje Y-osi. Če je prazno, se meje nastavijo dinamično na podlagi " -"min./max. vrednosti podatkov. Funkcija omeji le prikaz, obseg podatkov pa" -" ostane enak." +#: superset/db_engine_specs/base.py:106 +msgid "6 hour" +msgstr "6 ur" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/BoxPlot/index.js:26 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:54 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/createMetadata.ts:27 -msgid "Box Plot" -msgstr "Box Plot" +#: superset/db_engine_specs/base.py:107 +msgid "Day" +msgstr "Dan" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:133 -msgid "Breakdowns" -msgstr "Razčlenitev" +#: superset/db_engine_specs/base.py:108 +msgid "Week" +msgstr "Teden" + +#: superset/db_engine_specs/base.py:109 +msgid "Month" +msgstr "Mesec" + +#: superset/db_engine_specs/base.py:110 +msgid "Quarter" +msgstr "Četrtletje" -#: superset/connectors/druid/views.py:237 -msgid "Broker Endpoint" -msgstr "Končna točka posrednika" +#: superset/db_engine_specs/base.py:111 +msgid "Year" +msgstr "Leto" -#: superset/connectors/druid/views.py:233 -msgid "Broker Host" -msgstr "Gostitelj posrednika" +#: superset/db_engine_specs/base.py:112 +msgid "Week starting Sunday" +msgstr "Teden z začetkom v nedeljo" -#: superset/connectors/druid/views.py:236 -msgid "Broker Password" -msgstr "Geslo posrednika" +#: superset/db_engine_specs/base.py:113 +msgid "Week starting Monday" +msgstr "Teden z začetkom v ponedeljek" -#: superset/connectors/druid/views.py:234 -msgid "Broker Port" -msgstr "Vrata posrednika" +#: superset/db_engine_specs/base.py:114 +msgid "Week ending Saturday" +msgstr "Teden s koncem v soboto" -#: superset/connectors/druid/views.py:235 -msgid "Broker Username" -msgstr "Uporabniško ime posrednika" +#: superset/db_engine_specs/base.py:115 +msgid "Week_ending Sunday" +msgstr "Teden s koncem v nedeljo" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:30 -#: superset/viz.py:1139 -msgid "Bubble Chart" -msgstr "Mehurčkasti grafikon" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:109 +#: superset/db_engine_specs/base.py:1544 +msgid "Username" +msgstr "Uporabniško ime" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:127 -msgid "Bubble Color" -msgstr "Barva mehurčka" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:130 +#: superset/db_engine_specs/base.py:1545 +msgid "Password" +msgstr "Geslo" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:141 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:420 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:123 -msgid "Bubble Size" -msgstr "Velikost mehurčka" +#: superset/db_engine_specs/base.py:1546 +msgid "Hostname or IP address" +msgstr "Ime gostitelja ali IP naslov" -#: superset-frontend/src/explore/controls.jsx:435 -msgid "Bubble size" -msgstr "Velikost mehurčka" +#: superset/db_engine_specs/base.py:1549 +msgid "Database port" +msgstr "Vrata podatkovne baze" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:362 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:212 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:277 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:597 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:262 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:572 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:495 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:169 -msgid "Bulk select" -msgstr "Izberi hkrati" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:89 +#: superset/db_engine_specs/base.py:1552 +msgid "Database name" +msgstr "Ime podatkovne baze" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:30 -#: superset/viz.py:1190 -msgid "Bullet Chart" -msgstr "'Bullet' grafikon" +#: superset/db_engine_specs/base.py:1554 +msgid "Additional parameters" +msgstr "Dodatni parametri" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:32 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:40 -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:35 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:41 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:31 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:54 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:45 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:55 -#: superset-frontend/plugins/plugin-chart-table/src/index.ts:44 -msgid "Business" -msgstr "Aktivnost" +#: superset/db_engine_specs/base.py:1557 +msgid "Use an encrypted connection to the database" +msgstr "Uporabite šifrirano povezavo s podatkovno bazo" -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:233 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:139 +#: superset/db_engine_specs/bigquery.py:151 msgid "" -"By default, each filter loads at most 1000 choices at the initial page " -"load. Check this box if you have more than 1000 filter values and want to" -" enable dynamically searching that loads filter values as users type (may" -" add stress to your database)." +"We were unable to connect to your database. Please confirm that your service " +"account has the Viewer and Job User roles on the project." msgstr "" -"Privzeto vsak filter pri nalaganju začetne strani naloži največ 1000 " -"možnosti. Označite polje, če imate več kot 1000 vrednosti filtra in " -"želite omogočiti dinamično iskanje, ki nalaga vrednosti filtra ko " -"uporabnik tipka (to lahko preobremeni vašo podatkovno bazo)." +"Povezava s podatkovno bazo ni uspela. Preverite, da ima vaš dostop dodeljeni " +"vlogi Viewer in Job User." -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:272 -msgid "By key: use column names as sorting key" +#: superset/db_engine_specs/bigquery.py:160 +#, python-format +msgid "" +"The table \"%(table)s\" does not exist. A valid table must be used to run this " +"query." msgstr "" +"Tabela \"%(table)s\" ne obstaja. V poizvedbi mora biti uporabljena veljavna " +"tabela." -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:244 -msgid "By key: use row names as sorting key" +#: superset/db_engine_specs/bigquery.py:168 +#, python-format +msgid "We can't seem to resolve column \"%(column)s\" at line %(location)s." msgstr "" +"Zdi se, da ni mogoče razrešiti stolpca \"%(column)s\" v vrstici %(location)s." -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:245 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:273 -msgid "By value: use metric values as sorting key" +#: superset/db_engine_specs/bigquery.py:173 +#, python-format +msgid "" +"The schema \"%(schema)s\" does not exist. A valid schema must be used to run this " +"query." msgstr "" +"Shema \"%(schema)s\" ne obstaja. Za poizvedbo mora biti uporabljena veljavna " +"shema." -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:334 -msgid "CANCEL" -msgstr "PREKINI" +#: superset/db_engine_specs/duckdb.py:56 superset/db_engine_specs/sqlite.py:65 +#, python-format +msgid "We can't seem to resolve the column \"%(column_name)s\"" +msgstr "Zdi se, da ni mogoče razrešiti stolpca \"%(column_name)s\"" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:601 -msgid "CREATE TABLE AS" -msgstr "CREATE TABLE AS" +#: superset/db_engine_specs/gsheets.py:74 superset/db_engine_specs/mysql.py:172 +#, python-format +msgid "" +"Please check your query for syntax errors near \"%(server_error)s\". Then, try " +"running your query again." +msgstr "" +"Preverite, če ima vaša poizvedba sintaktične napake pri \"%(server_error)s\". " +"Potem ponovno poženite poizvedbo." -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:614 -msgid "CREATE VIEW AS" -msgstr "CREATE VIEW AS" +#: superset/db_engine_specs/mssql.py:76 +#, python-format +msgid "" +"Either the username \"%(username)s\", password, or database name \"%(database)s\" " +"is incorrect." +msgstr "" +"Uporabniško ime \"%(username)s\", geslo ali ime podatkovne baze \"%(database)s\" " +"so napačni." -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:205 -msgid "CREATE VIEW statement" -msgstr "CREATE VIEW stavek" +#: superset/db_engine_specs/mssql.py:84 superset/db_engine_specs/postgres.py:114 +#: superset/db_engine_specs/presto.py:197 superset/db_engine_specs/redshift.py:68 +#, python-format +msgid "The hostname \"%(hostname)s\" cannot be resolved." +msgstr "Imena gostitelja \"%(hostname)s\" ni mogoče razrešiti." -#: superset-frontend/src/views/CRUD/alert/components/AlertReportCronScheduler.tsx:75 -msgid "CRON expression" -msgstr "Izraz CRON" +#: superset/db_engine_specs/mssql.py:89 superset/db_engine_specs/postgres.py:119 +#: superset/db_engine_specs/presto.py:210 superset/db_engine_specs/redshift.py:73 +#, python-format +msgid "Port %(port)s on hostname \"%(hostname)s\" refused the connection." +msgstr "Vrata %(port)s na gostitelju \"%(hostname)s\" niso sprejela povezave." -#: superset-frontend/src/dashboard/components/CssEditor/index.jsx:104 -#: superset/views/dashboard/mixin.py:88 -msgid "CSS" -msgstr "CSS" +#: superset/db_engine_specs/mssql.py:94 superset/db_engine_specs/postgres.py:124 +#: superset/db_engine_specs/presto.py:202 superset/db_engine_specs/redshift.py:78 +#, python-format +msgid "" +"The host \"%(hostname)s\" might be down, and can't be reached on port %(port)s." +msgstr "" +"Gostitelj \"%(hostname)s\" mogoče ne deluje in ga ni mogoče doseči na vratih " +"%(port)s." -#: superset/initialization/__init__.py:265 superset/views/css_templates.py:36 -msgid "CSS Templates" -msgstr "CSS predloge" +#: superset/db_engine_specs/mysql.py:152 superset/db_engine_specs/presto.py:192 +#: superset/db_engine_specs/redshift.py:63 +#, python-format +msgid "Either the username \"%(username)s\" or the password is incorrect." +msgstr "Uporabniško ime \"%(username)s\" ali geslo sta napačna." -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:249 -msgid "CSS template" -msgstr "CSS predloga" +#: superset/db_engine_specs/mysql.py:157 +#, python-format +msgid "Unknown MySQL server host \"%(hostname)s\"." +msgstr "Neznan MySQL strežnik \"%(hostname)s\"." -#: superset/css_templates/commands/exceptions.py:23 -msgid "CSS template could not be deleted." -msgstr "CSS predloge ni mogoče izbrisati." +#: superset/db_engine_specs/mysql.py:162 +#, python-format +msgid "The host \"%(hostname)s\" might be down and can't be reached." +msgstr "Gostitelj \"%(hostname)s\" mogoče ne deluje in ga ni mogoče doseči." -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:241 -msgid "CSS template name" -msgstr "Ime CSS predloge" +#: superset/db_engine_specs/mysql.py:167 superset/db_engine_specs/postgres.py:132 +#, python-format +msgid "Unable to connect to database \"%(database)s\"." +msgstr "Povezava s podatkovno bazo \"%(database)s\" ni uspela." -#: superset/css_templates/commands/exceptions.py:27 -msgid "CSS template not found." -msgstr "CSS predloga ni najdena." +#: superset/db_engine_specs/postgres.py:99 +#, python-format +msgid "The username \"%(username)s\" does not exist." +msgstr "Uporabniško ime \"%(username)s\" ne obstaja." -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:71 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:240 -msgid "CSS templates" -msgstr "CSS predloge" +#: superset/db_engine_specs/postgres.py:104 +#, python-format +msgid "The password provided for username \"%(username)s\" is incorrect." +msgstr "Geslo za uporabniško ime \"%(username)s\" je napačno." -#: superset/views/database/forms.py:101 -msgid "CSV File" -msgstr "CSV datoteka" +#: superset/db_engine_specs/postgres.py:109 +msgid "Please re-enter the password." +msgstr "Ponovno vpišite geslo." -#: superset/views/database/views.py:252 +#: superset/db_engine_specs/postgres.py:137 superset/db_engine_specs/presto.py:168 #, python-format msgid "" -"CSV file \"%(csv_filename)s\" uploaded to table \"%(table_name)s\" in " -"database \"%(db_name)s\"" +"We can't seem to resolve the column \"%(column_name)s\" at line %(location)s." msgstr "" -"CSV datoteka \"%(csv_filename)s\" naložena v tabelo \"%(table_name)s\" v " -"podatkovni bazi \"%(db_name)s\"" - -#: superset/views/database/views.py:118 -msgid "CSV to Database configuration" -msgstr "Nastavitve pretvorbe CSV v podatkovno bazo" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:271 -msgid "CSV upload" -msgstr "Nalaganje CSV" +"Zdi se, da ni mogoče razrešiti stolpca \"%(column_name)s\" v vrstici %(location)s." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:118 -msgid "CTAS & CVAS SCHEMA" -msgstr "CTAS & CVAS SHEMA" - -#: superset/sql_lab.py:405 +#: superset/db_engine_specs/presto.py:176 +#, python-format msgid "" -"CTAS (create table as select) can only be run with a query where the last" -" statement is a SELECT. Please make sure your query has a SELECT as its " -"last statement. Then, try running your query again." +"The table \"%(table_name)s\" does not exist. A valid table must be used to run " +"this query." msgstr "" -"CTAS (create table as select) lahko izvajate le v poizvedbah, kjer je " -"zadnji stavek SELECT. Poskrbite, da bo zadnji stavek v vaši poizvedbi " -"SELECT in poskusite ponovno zagnati poizvedbo." - -#: superset/views/database/mixins.py:190 -msgid "CTAS Schema" -msgstr "CTAS shema" +"Tabela \"%(table_name)s\" ne obstaja. V poizvedbi mora biti uporabljena veljavna " +"tabela." -#: superset/sql_lab.py:422 +#: superset/db_engine_specs/presto.py:184 +#, python-format msgid "" -"CVAS (create view as select) can only be run with a query with a single " -"SELECT statement. Please make sure your query has only a SELECT " -"statement. Then, try running your query again." +"The schema \"%(schema_name)s\" does not exist. A valid schema must be used to run " +"this query." msgstr "" -"CVAS (create view as select) lahko izvajate le v poizvedbah z enim SELECT" -" stavkom. Poskrbite, da bo v vaši poizvedbi le en SELECT stavek in " -"poskusite ponovno zagnati poizvedbo." - -#: superset/errors.py:123 -msgid "CVAS (create view as select) query has more than one statement." -msgstr "CVAS (create view as select) poizvedba ima več kot en stavek." - -#: superset/errors.py:124 -msgid "CVAS (create view as select) query is not a SELECT statement." -msgstr "CVAS (create view as select) poizvedba ni SELECT stavek." +"Shema \"%(schema_name)s\" ne obstaja. Za poizvedbo mora biti uporabljena veljavna " +"shema." -#: superset/connectors/druid/views.py:239 -#: superset/connectors/druid/views.py:351 superset/connectors/sqla/views.py:497 -#: superset/views/chart/mixin.py:77 -msgid "Cache Timeout" -msgstr "Trajanje predpomnilnika" +#: superset/db_engine_specs/presto.py:215 +#, python-format +msgid "Unable to connect to catalog named \"%(catalog_name)s\"." +msgstr "Povezava na katalog \"%(catalog_name)s\" ni uspela." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:67 -#: superset-frontend/src/explore/controlPanels/sections.tsx:51 -msgid "Cache Timeout (seconds)" -msgstr "Trajanje predpomnilnika (sekunde)" +#: superset/db_engine_specs/presto.py:1021 +msgid "Unknown Presto Error" +msgstr "Neznana Presto napaka" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:771 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:278 -msgid "Cache timeout" -msgstr "Časovna omejitev predpomnilnika" +#: superset/db_engine_specs/redshift.py:86 +#, python-format +msgid "" +"We were unable to connect to your database named \"%(database)s\". Please verify " +"your database name and try again." +msgstr "" +"Povezava s podatkovno bazo \"%(database)s\" ni uspela. Preverite ime podatkovne " +"baze in poskusite ponovno." -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:241 +#: superset/db_engine_specs/snowflake.py:100 #, python-format -msgid "Cached %s" -msgstr "Predpomnjeno %s" +msgid "%(object)s does not exist in this database." +msgstr "%(object)s ne obstaja v tej podatkovni bazi." -#: superset/viz.py:539 -msgid "Cached value not found" -msgstr "Predpomnjena vrednost ni najdena" +#: superset/embedded_dashboard/commands/exceptions.py:34 +msgid "You don't have access to this embedded dashboard config." +msgstr "Nimate dostopa do konfiguracije te vgrajene nadzorne plošče." -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:76 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:70 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:76 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:77 -msgid "Calculate contribution per series or total" -msgstr "Izračunaj delež za podatkovno serijo ali skupnega" +#: superset/initialization/__init__.py:221 +msgid "Home" +msgstr "Domov" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:667 -#, python-format -msgid "Calculated column [%s] requires an expression" -msgstr "Izračunan stolpec [%s] zahteva izraz" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/annotationsAndLayers.tsx:36 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:115 +#: superset/initialization/__init__.py:228 superset/views/annotations.py:113 +msgid "Annotation Layers" +msgstr "Sloji z oznakami" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1241 -msgid "Calculated columns" -msgstr "Izračunani stolpci" +#: superset/initialization/__init__.py:231 superset/initialization/__init__.py:255 +#: superset/initialization/__init__.py:267 superset/initialization/__init__.py:316 +#: superset/initialization/__init__.py:389 +msgid "Manage" +msgstr "Upravljaj" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:121 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:334 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:217 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:469 -#: superset-frontend/src/explore/controlPanels/sections.tsx:232 -msgid "Calculation type" -msgstr "Tip izračuna" +#: superset-frontend/src/profile/components/CreatedContent.tsx:84 +#: superset-frontend/src/profile/components/Favorites.tsx:85 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:630 +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:308 +#: superset/initialization/__init__.py:237 superset/views/chart/mixin.py:79 +#: superset/views/dashboard/mixin.py:25 +msgid "Dashboards" +msgstr "Nadzorne plošče" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:30 -#: superset/viz.py:1048 -msgid "Calendar Heatmap" -msgstr "Koledarska barvna lestvica" +#: superset-frontend/src/dashboard/components/BuilderComponentPane/index.tsx:106 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx:61 +#: superset-frontend/src/profile/components/CreatedContent.tsx:87 +#: superset-frontend/src/profile/components/Favorites.tsx:88 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:677 +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:320 +#: superset/initialization/__init__.py:245 superset/views/chart/mixin.py:26 +#: superset/views/dashboard/mixin.py:81 +msgid "Charts" +msgstr "Grafikoni" -#: superset-frontend/src/dashboard/actions/dashboardLayout.js:211 -msgid "Can not move top level tab into nested tabs" -msgstr "Najvišjega zavihka ni mogoče premakniti v gnezdene zavihke" +#: superset/initialization/__init__.py:253 +msgid "Plugins" +msgstr "Vtičniki" -#: superset/views/core.py:2010 -#, python-format -msgid "Can't find DruidCluster with cluster_name = '%(name)s'" -msgstr "Ni mogoče najti DruidCluster s cluster_name = '%(name)s'" +#: superset/initialization/__init__.py:264 superset/views/css_templates.py:35 +msgid "CSS Templates" +msgstr "CSS predloge" -#: superset/views/core.py:1998 -#, python-format -msgid "Can't find User '%(name)s', please ask your admin to create one." -msgstr "" -"Uporabnika '%(name)s' ni mogoče najti. Prosite administratorja, da ga " -"ustvari." +#: superset/initialization/__init__.py:273 +msgid "Row Level Security" +msgstr "Varnost na nivoju vrstic" -#: superset/viz.py:1778 -msgid "Can't have overlap between Series and Breakdowns" -msgstr "Ne sme imeti prekrivanja med podatkovnimi serijami in členitvami" +#: superset/initialization/__init__.py:275 superset/initialization/__init__.py:372 +#: superset/initialization/__init__.py:399 +msgid "Security" +msgstr "Varnost" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:173 -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:218 -#: superset-frontend/src/components/Modal/Modal.tsx:240 -#: superset-frontend/src/components/ReportModal/index.tsx:259 -#: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:80 -#: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:72 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:474 -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:151 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:137 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:76 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:62 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:194 -#: superset-frontend/src/explore/components/SaveModal.tsx:179 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:775 -#: superset/templates/superset/request_access.html:34 -msgid "Cancel" -msgstr "Prekliči" +#: superset/initialization/__init__.py:312 +msgid "Import Dashboards" +msgstr "Uvozi nadzorne plošče" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:304 -msgid "Cancel query on window unload event" -msgstr "Prekini poizvedbo pri dogodku zaprtja okna (window unload event)" +#: superset/initialization/__init__.py:324 +msgid "SQL Editor" +msgstr "SQL urejevalnik" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts:83 -msgid "Cannot create cyclic hierarchy" -msgstr "Ciklične hierarhije ni mogoče ustvariti" +#: superset/initialization/__init__.py:329 superset/initialization/__init__.py:344 +msgid "SQL Lab" +msgstr "SQL laboratorij" -#: superset/databases/commands/exceptions.py:109 -msgid "Cannot delete a database that has datasets attached" -msgstr "Podatkovne baze s povezanimi podatkovnimi viri ni mogoče izbrisati" +#: superset/initialization/__init__.py:332 +msgid "Saved Queries" +msgstr "Shranjene poizvedbe" -#: superset/views/core.py:700 -#, python-format -msgid "" -"Cannot import dashboard: %(db_error)s.\n" -"Make sure to create the database before importing the dashboard." -msgstr "" -"Nadzorne plošče ni mogoče uvoziti: %(db_error)s.\n" -"Pred uvozom poskrbite za ustvarjenje podatkovne baze." +#: superset/initialization/__init__.py:339 +msgid "Query History" +msgstr "Zgodovina poizvedb" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx:242 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:944 -msgid "Cannot load filter" -msgstr "Filtra ni mogoče naložiti" +#: superset-frontend/src/profile/components/Security.tsx:46 +#: superset-frontend/src/views/CRUD/data/common.ts:26 +#: superset/initialization/__init__.py:349 superset/views/database/mixins.py:33 +msgid "Databases" +msgstr "Podatkovne baze" -#: superset/charts/commands/exceptions.py:51 -#, python-format -msgid "Cannot parse time string [%(human_readable)s]" -msgstr "Ni mogoče razčleniti časovnega izraza [%(human_readable)s]" +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:492 +#: superset-frontend/src/views/CRUD/data/common.ts:22 +#: superset-frontend/src/views/components/MenuRight.tsx:132 +#: superset/initialization/__init__.py:352 superset/initialization/__init__.py:361 +msgid "Data" +msgstr "Podatki" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:38 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:42 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:41 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:41 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:59 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:42 -msgid "Categorical" -msgstr "Kategorični" +#: superset-frontend/src/profile/components/Security.tsx:60 +#: superset-frontend/src/views/CRUD/data/common.ts:32 +#: superset/initialization/__init__.py:357 +msgid "Datasets" +msgstr "Podatkovni seti" -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:129 -msgid "Categories to group by on the x-axis." -msgstr "Kategorije za združevanje po x-osi." +#: superset/initialization/__init__.py:370 +msgid "Action Log" +msgstr "Dnevnik aktivnosti" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:602 -msgid "Category" -msgstr "Kategorija" +#: superset/initialization/__init__.py:387 +msgid "Alerts & Reports" +msgstr "Opozorila in poročila" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:87 -msgid "Category of target nodes" -msgstr "Kategorija ciljnih vozlišč" +#: superset/initialization/__init__.py:397 +msgid "Access requests" +msgstr "Zahteve za dostop" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:103 -msgid "Cell Padding" -msgstr "Razmak med celicami" +#: superset/key_value/exceptions.py:30 +msgid "An error occurred while parsing the key." +msgstr "Pri branju ključa je prišlo do težave." -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:117 -msgid "Cell Radius" -msgstr "Polmer celice" +#: superset/key_value/exceptions.py:42 +#: superset/temporary_cache/commands/exceptions.py:37 +msgid "An error occurred while deleting the value." +msgstr "Pri brisanju vrednosti je prišlo do napake." -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:91 -msgid "Cell Size" -msgstr "Velikost celice" +#: superset/key_value/exceptions.py:46 +#: superset/temporary_cache/commands/exceptions.py:41 +msgid "An error occurred while updating the value." +msgstr "Pri posodabljanju vrednosti je prišlo do težave." -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:413 -msgid "Cell bars" -msgstr "Stolp. graf v celicah" +#: superset/key_value/exceptions.py:50 +#: superset/temporary_cache/commands/exceptions.py:45 +msgid "You don't have permission to modify the value." +msgstr "Nimate dovoljenja za spreminjanje vrednosti." -#: superset-frontend/src/components/FilterableTable/FilterableTable.tsx:319 -msgid "Cell content" -msgstr "Vsebina celice" +#: superset/key_value/utils.py:60 +msgid "Invalid permalink key" +msgstr "Neveljaven ključ povezave" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:112 -msgid "Center" -msgstr "Na sredino" +#: superset/queries/saved_queries/api.py:201 +#, python-format +msgid "Deleted %(num)d saved query" +msgid_plural "Deleted %(num)d saved queries" +msgstr[0] "Izbrisana %(num)d shranjena poizvedba" +msgstr[1] "Izbrisani %(num)d shranjeni poizvedbi" +msgstr[2] "Izbrisane %(num)d shranjene poizvedbe" +msgstr[3] "Izbrisanih %(num)d shranjenih poizvedb" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:533 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:252 -#, fuzzy -msgid "Certification" -msgstr "Podrobnosti certifikacije" +#: superset/queries/saved_queries/commands/exceptions.py:28 +msgid "Saved queries could not be deleted." +msgstr "Shranjenih poizvedb ni mogoče izbrisati." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:270 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:275 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1079 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1085 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:553 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:555 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:263 -msgid "Certification details" -msgstr "Podrobnosti certifikacije" +#: superset/queries/saved_queries/commands/exceptions.py:32 +msgid "Saved query not found." +msgstr "Shranjena poizvedba ni najdena." -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:530 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:504 -#, fuzzy -msgid "Certified" -msgstr "Certificiral/a" +#: superset/queries/saved_queries/commands/exceptions.py:36 +msgid "Import saved query failed for an unknown reason." +msgstr "Uvoz shranjene poizvedbe ni uspel zaradi neznanega razloga." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:259 -msgid "Certified By" -msgstr "Certificiral/a" +#: superset/queries/saved_queries/commands/exceptions.py:40 +msgid "Saved query parameters are invalid." +msgstr "Parametri shranjene poizvedbe so neveljavni." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:264 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1066 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1074 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:538 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:540 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:254 -msgid "Certified by" -msgstr "Certificiral/a" +#: superset/reports/api.py:492 +#, python-format +msgid "Deleted %(num)d report schedule" +msgid_plural "Deleted %(num)d report schedules" +msgstr[0] "Izbrisan %(num)d urnik poročanja" +msgstr[1] "Izbrisana %(num)d urnika poročanja" +msgstr[2] "Izbrisani %(num)d urniki poročanja" +msgstr[3] "Izbrisanih %(num)d urnikov poročanja" -#: superset-frontend/packages/superset-ui-chart-controls/src/components/CertifiedIconWithTooltip.tsx:46 -#: superset-frontend/src/components/CertifiedIcon/index.tsx:42 +#: superset/reports/schemas.py:186 superset/reports/schemas.py:192 +#: superset/reports/schemas.py:198 superset/reports/schemas.py:280 +#: superset/reports/schemas.py:286 superset/reports/schemas.py:293 +msgid "Value must be greater than 0" +msgstr "Vrednost mora biti večja od 0" + +#: superset/reports/commands/alert.py:96 #, python-format -msgid "Certified by %s" -msgstr "Certificiral/a %s" +msgid "Alert query returned more than one row. %s rows returned" +msgstr "" +"Poizvedba za opozorilo je vrnila več kot eno vrstico. Št. vrnjenih vrstic: %s" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:253 -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:195 -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:267 -msgid "Change dataset" -msgstr "Spremeni podatkovni set" +#: superset/reports/commands/alert.py:105 +#, python-format +msgid "Alert query returned more than one column. %s columns returned" +msgstr "" +"Poizvedba za opozorilo je vrnila več kot en stolpec. Število vrnjenih stolpcev: %s" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:269 -#, fuzzy -msgid "Change order of columns." -msgstr "Vrstni red stolpcev" +#: superset/reports/commands/exceptions.py:45 +msgid "Dashboard does not exist" +msgstr "Nadzorna plošča ne obstaja" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:241 -#, fuzzy -msgid "Change order of rows." -msgstr "Vrstni red vrstic" +#: superset/reports/commands/exceptions.py:54 +msgid "Chart does not exist" +msgstr "Grafikon ne obstaja" -#: superset/connectors/druid/views.py:354 superset/connectors/sqla/views.py:489 -msgid "Changed By" -msgstr "Spremenil" +#: superset/reports/commands/exceptions.py:63 +msgid "Database is required for alerts" +msgstr "Podatkovna baza je obvezna za opozorila" -#: superset/views/schedules.py:238 superset/views/schedules.py:318 -msgid "Changed On" -msgstr "Spremenjeno" +#: superset/reports/commands/exceptions.py:72 +msgid "Type is required" +msgstr "Tip je obvezen" -#: superset/views/sql_lab.py:75 -msgid "Changed on" -msgstr "Spremenjen" +#: superset/reports/commands/exceptions.py:81 +msgid "Choose a chart or dashboard not both" +msgstr "Izberite grafikon ali nadzorno ploščo, ne obojega" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:50 -msgid "" -"Changing the dataset may break the chart if the chart relies on columns " -"or metadata that does not exist in the target dataset" +#: superset/reports/commands/exceptions.py:91 +msgid "Please save your chart first, then try creating a new email report." msgstr "" -"Sprememba podatkovnega seta lahko pokvari grafikon, če se le-ta zanaša na" -" stolpce ali metapodatke, ki ne obstajajo v ciljnem podatkovnem nizu" +"Najprej shranite grafikon, potem pa poskusite ustvariti novo e-poštno poročilo." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1176 -msgid "" -"Changing these settings will affect all charts using this dataset, " -"including charts owned by other people." +#: superset/reports/commands/exceptions.py:103 +msgid "Please save your dashboard first, then try creating a new email report." msgstr "" -"Spreminjanje teh nastavitev bo vplivalo na vse grafikone, ki uporabljajo " -"ta podatkovni set, vključno z grafikoni v lasti drugih oseb." +"Najprej shranite nadzorno ploščo, potem pa poskusite ustvariti novo e-poštno " +"poročilo." -#: superset/dashboards/commands/exceptions.py:78 -msgid "Changing this Dashboard is forbidden" -msgstr "Spreminjanje te nadzorne plošče ni dovoljeno" +#: superset/reports/commands/exceptions.py:111 +msgid "Report Schedule parameters are invalid." +msgstr "Parametri urnika poročanja so neveljavni." -#: superset/charts/commands/exceptions.py:131 -msgid "Changing this chart is forbidden" -msgstr "Spreminjanje tega grafikona ni dovoljeno" +#: superset/reports/commands/exceptions.py:115 +msgid "Report Schedule could not be deleted." +msgstr "Urnika poročanja ni mogoče izbrisati." -#: superset-frontend/packages/superset-ui-chart-controls/src/components/ControlHeader.tsx:75 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:40 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:55 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:68 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:83 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:98 -#: superset-frontend/src/explore/components/ControlHeader.jsx:77 -msgid "Changing this control takes effect instantly" -msgstr "Sprememba tega kontrolnika se odrazi takoj" +#: superset/reports/commands/exceptions.py:119 +msgid "Report Schedule could not be created." +msgstr "Urnika poročanja ni mogoče ustvariti." -#: superset/datasets/commands/exceptions.py:177 -msgid "Changing this dataset is forbidden" -msgstr "Spreminjanje tega podatkovnega seta ni dovoljeno" +#: superset/reports/commands/exceptions.py:123 +msgid "Report Schedule could not be updated." +msgstr "Urnika poročanja ni mogoče posodobiti." -#: superset/datasets/columns/commands/exceptions.py:31 -#: superset/datasets/metrics/commands/exceptions.py:31 -msgid "Changing this dataset is forbidden." -msgstr "Spreminjanje tega podatkovnega seta ni dovoljeno." +#: superset/reports/commands/exceptions.py:127 +msgid "Report Schedule not found." +msgstr "Urnika poročanja ni najden." -#: superset/reports/commands/exceptions.py:238 -msgid "Changing this report is forbidden" -msgstr "Spreminjanje tega poročila ni dovoljeno" +#: superset/reports/commands/exceptions.py:131 +msgid "Report Schedule delete failed." +msgstr "Izbris urnika poročanja ni uspel." -#: superset/views/database/forms.py:216 superset/views/database/forms.py:349 -msgid "Character to interpret as decimal point." -msgstr "Znak, ki bo prepoznan kot decimalno ločilo." +#: superset/reports/commands/exceptions.py:135 +msgid "Report Schedule log prune failed." +msgstr "Krajšanje dnevnika urnika poročanja ni uspelo." -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:81 -msgid "Charge" -msgstr "Naboj" - -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:95 -msgid "Charge in the force layout" -msgstr "Naboj v postavitvi sil" - -#: superset-frontend/src/components/Menu/MenuRight.tsx:39 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:387 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1297 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1300 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:261 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:607 -#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:208 -#: superset/templates/appbuilder/navbar_right.html:39 -#: superset/views/chart/mixin.py:85 superset/views/chart/views.py:108 -#: superset/views/schedules.py:316 -msgid "Chart" -msgstr "Grafikon" +#: superset/reports/commands/exceptions.py:139 +msgid "Report Schedule execution failed when generating a screenshot." +msgstr "" +"Izvajanje urnika poročanja je bilo neuspešno pri ustvarjanju zaslonske slike." -#: superset/views/core.py:1748 -#, python-format -msgid "Chart %(id)s not found" -msgstr "Grafikon %(id)s ni najden" +#: superset/reports/commands/exceptions.py:143 +msgid "Report Schedule execution failed when generating a csv." +msgstr "Izvajanje urnika poročanja je bilo neuspešno pri ustvarjanju csv." -#: superset/views/database/mixins.py:195 -msgid "Chart Cache Timeout" -msgstr "Trajanje predpomnilnika grafikona" +#: superset/reports/commands/exceptions.py:147 +msgid "Report Schedule execution failed when generating a dataframe." +msgstr "" +"Izvajanje urnika poročanja je bilo neuspešno pri ustvarjanju podatkovnega okvira." -#: superset/initialization/__init__.py:453 -msgid "Chart Email Schedules" -msgstr "Urniki za e-pošto grafikonov" +#: superset/reports/commands/exceptions.py:151 +msgid "Report Schedule execution got an unexpected error." +msgstr "Pri izvajanju urnika poročanja je prišlo do nepričakovane napake." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:58 -#: superset-frontend/src/explore/controlPanels/sections.tsx:42 -msgid "Chart ID" -msgstr "ID grafikona" +#: superset/reports/commands/exceptions.py:155 +msgid "Report Schedule is still working, refusing to re-compute." +msgstr "Urnik poročanja se še vedno izvaja, ponovni izračun je zavrnjen." -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:77 -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:49 -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:54 -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:48 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:75 -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:61 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:140 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:65 -#: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:36 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:65 -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:49 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:53 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:139 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:88 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:42 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:48 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:77 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:31 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts:40 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:79 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:35 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:54 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:39 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:81 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:69 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:75 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:279 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:72 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:83 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:103 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:100 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:80 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:97 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:103 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:104 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:61 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:35 -msgid "Chart Options" -msgstr "Možnosti grafikona" +#: superset/reports/commands/exceptions.py:159 +msgid "Report Schedule reached a working timeout." +msgstr "Urnik poročanja je dosegel mejo časa izvedbe." -#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:70 -#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:83 +#: superset/reports/commands/exceptions.py:168 #, python-format -msgid "Chart Owner: %s" -msgstr "Lastnik grafikona: %s" +msgid "A report named \"%(name)s\" already exists" +msgstr "Poročilo poimenovano %(name)s že obstaja" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:27 -msgid "Chart Title" -msgstr "Naslov grafikona" +#: superset/reports/commands/exceptions.py:170 +#, python-format +msgid "An alert named \"%(name)s\" already exists" +msgstr "Opozorilo poimenovano %(name)s že obstaja" -#: superset/views/core.py:979 -msgid "Chart [{}] has been overwritten" -msgstr "Grafikon [{}] je bil prepisan" +#: superset/reports/commands/exceptions.py:176 +msgid "Resource already has an attached report." +msgstr "Vir že ima povezano poročilo." -#: superset/views/core.py:975 -msgid "Chart [{}] has been saved" -msgstr "Grafikon [{}] je bil shranjen" +#: superset/reports/commands/exceptions.py:181 +msgid "Alert query returned more than one row." +msgstr "Poizvedba za opozorilo je vrnila več kot eno vrstico." -#: superset/views/core.py:1006 -msgid "Chart [{}] was added to dashboard [{}]" -msgstr "Grafikon [{}] je bil dodan na nadzorno ploščo [{}]" +#: superset/reports/commands/exceptions.py:186 +msgid "Alert validator config error." +msgstr "Napaka nastavitev potrjevalnika opozoril." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:216 -msgid "Chart cache timeout" -msgstr "Trajanje predpomnilnika grafikona" +#: superset/reports/commands/exceptions.py:190 +msgid "Alert query returned more than one column." +msgstr "Poizvedba za opozorilo je vrnila več kot en stolpec." -#: superset-frontend/src/components/AlteredSliceTag/index.jsx:199 -msgid "Chart changes" -msgstr "Spremembe grafikona" +#: superset/reports/commands/exceptions.py:194 +msgid "Alert query returned a non-number value." +msgstr "Poizvedba za opozorilo je vrnila neštevilsko vrednost." -#: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:28 -#, fuzzy -msgid "" -"Chart component that lets you add a custom filter UI in your dashboard. " -"When added to dashboard, a filter box lets users specify specific values " -"or ranges to filter charts by. The charts that each filter box is applied" -" to can be fine tuned as well in the dashboard view.\n" -"\n" -" Note that this plugin is being replaced with the new Filters feature " -"that lives in the dashboard view itself. It's easier to use and has more " -"capabilities!" -msgstr "" -"Komponenta grafikona, ki omogoča dodajanje vmesnika filtrov po meri v " -"nadzorno ploščo. Ko je dodana na nadzorno ploščo, lahko uporabnik določi " -"poljubne vrednosti ali obsege filtrov. Grafikoni, na katere se nanašajo " -"filtri, so lahko precizno izbrani tudi v pogledu nadzorne plošče.\r\n" -"\r\n" -" Vedite, da bo ta vtičnik v prihodnosti zamenjan z novim konceptom " -"filtrov, ki bodo živeli v kontekstu same nadzorne plošče in bodo " -"zmogljivejši ter enostavnejši za uporabo!" +#: superset/reports/commands/exceptions.py:198 +msgid "Alert found an error while executing a query." +msgstr "Opozorilo je našlo napako pri izvajanju poizvedbe." -#: superset/charts/commands/exceptions.py:115 -msgid "Chart could not be created." -msgstr "Grafikona ni mogoče ustvariti." +#: superset/reports/commands/exceptions.py:202 +msgid "A timeout occurred while executing the query." +msgstr "Pri izvajanju poizvedbe je potekel čas." -#: superset/charts/commands/exceptions.py:123 -msgid "Chart could not be deleted." -msgstr "Grafikona ni mogoče izbrisati." +#: superset/reports/commands/exceptions.py:206 +msgid "A timeout occurred while taking a screenshot." +msgstr "Pri ustvarjanju zaslonske slike je potekel čas." -#: superset/charts/commands/exceptions.py:119 -msgid "Chart could not be updated." -msgstr "Grafikona ni mogoče posodobiti." +#: superset/reports/commands/exceptions.py:210 +msgid "A timeout occurred while generating a csv." +msgstr "Pri ustvarjanju csv je potekel čas." -#: superset/reports/commands/exceptions.py:53 -msgid "Chart does not exist" -msgstr "Grafikon ne obstaja" +#: superset/reports/commands/exceptions.py:214 +msgid "A timeout occurred while generating a dataframe." +msgstr "Pri ustvarjanju podatkovnega okvira je potekel čas." -#: superset/charts/data/api.py:125 -msgid "Chart has no query context saved. Please save the chart again." -msgstr "Grafikon nima shranjenega konteksta poizvedbe. Ponovno shranite grafikon." +#: superset/reports/commands/exceptions.py:218 +msgid "Alert fired during grace period." +msgstr "Opozorilo sproženo med obdobjem mirovanja." -#: superset-frontend/src/explore/components/SaveModal.tsx:247 -msgid "Chart name" -msgstr "Ime grafikona" +#: superset/reports/commands/exceptions.py:222 +msgid "Alert ended grace period." +msgstr "Opozorilo je končalo obdobje mirovanja." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:96 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:107 -msgid "Chart options" -msgstr "Možnosti grafikona" +#: superset/reports/commands/exceptions.py:226 +msgid "Alert on grace period" +msgstr "Opozorilo v obdobju mirovanja" -#: superset/charts/commands/exceptions.py:111 -msgid "Chart parameters are invalid." -msgstr "Parametri grafikona so neveljavni." +#: superset/reports/commands/exceptions.py:230 +msgid "Report Schedule sellenium user not found" +msgstr "Selenium uporabnik za urnik poročanja ni najden" -#: superset-frontend/src/explore/controlPanels/sections.tsx:32 -msgid "Chart type" -msgstr "Tip grafikona" +#: superset/reports/commands/exceptions.py:234 +msgid "Report Schedule state not found" +msgstr "Stanje urnika poročanj ni najdeno" -#: superset-frontend/src/dashboard/components/BuilderComponentPane.tsx:112 -#: superset-frontend/src/profile/components/CreatedContent.tsx:76 -#: superset-frontend/src/profile/components/Favorites.tsx:77 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:634 -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:306 -#: superset/initialization/__init__.py:246 superset/views/chart/mixin.py:26 -#: superset/views/dashboard/mixin.py:81 -msgid "Charts" -msgstr "Grafikoni" +#: superset/reports/commands/exceptions.py:238 +msgid "Report schedule unexpected error" +msgstr "Nepričakovana napaka urnika poročanja" -#: superset/charts/commands/exceptions.py:135 -msgid "Charts could not be deleted." -msgstr "Grafikonov ni mogoče izbrisati." - -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx:162 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:488 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:505 -msgid "Check configuration" -msgstr "Preveri nastavitve" +#: superset/reports/commands/exceptions.py:242 +msgid "Changing this report is forbidden" +msgstr "Spreminjanje tega poročila ni dovoljeno" -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:206 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:68 -msgid "Check for sorting ascending" -msgstr "Označi za naraščajoče razvrščanje" +#: superset/reports/commands/exceptions.py:246 +msgid "An error occurred while pruning logs " +msgstr "Pri krajšanju dnevnikov je prišlo do napake " -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:113 +#: superset/reports/notifications/email.py:62 +#, python-format msgid "" -"Check if the Rose Chart should use segment area instead of segment radius" -" for proportioning" +"\n" +" Error: %(text)s\n" +" " msgstr "" -"Če želite, da grafikon \"Rose\" uporablja površino segmenta namesto " -"radija za proporcioniranje" +"\n" +" Napaka: %(text)s\n" +" " -#: superset-frontend/src/components/AnchorLink/index.jsx:85 -msgid "Check out this chart in dashboard:" -msgstr "Preizkusite ta grafikon v nadzorni plošči:" +#: superset/reports/notifications/email.py:98 +msgid "Explore in Superset" +msgstr "Razišči v Supersetu" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:319 -msgid "Check out this chart: " -msgstr "Preizkusite ta grafikon: " +#: superset/reports/notifications/email.py:140 +#, python-format +msgid "%(name)s.csv" +msgstr "%(name)s.csv" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:220 -msgid "Check out this dashboard: " -msgstr "Preizkusite to nadzorno ploščo: " +#: superset/reports/notifications/email.py:144 +#, python-format +msgid "%(prefix)s %(title)s" +msgstr "%(prefix)s %(title)s" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:93 +#: superset/reports/notifications/slack.py:57 +#, python-format msgid "" -"Check to apply filters instantly as they change instead of displaying " -"[Apply] button" +"*%(name)s*\n" +"\n" +"%(description)s\n" +"\n" +"<%(url)s|Explore in Superset>\n" +"\n" +"%(table)s\n" msgstr "" -"Izberite za takojšnjo uporabo filtrov, ko se spremenijo, brez " -"prikazovanja gumba Uveljavi" +"*%(name)s*\n" +"\n" +"%(description)s\n" +"\n" +"<%(url)s|Razišči v Supersetu>\n" +"\n" +"%(table)s\n" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:219 -msgid "Check to force date partitions to have the same height" -msgstr "Če želite, da imajo datumske particije enako višino" +#: superset/reports/notifications/slack.py:74 +#, python-format +msgid "" +"*%(name)s*\n" +"\n" +"%(description)s\n" +"\n" +"Error: %(text)s\n" +msgstr "" +"*%(name)s*\n" +"\n" +"%(description)s\n" +"\n" +"napaka: %(text)s\n" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:35 -msgid "Check to include Druid granularity dropdown" -msgstr "Izberite za vključitev spustnega seznama za Druid granulacijo" +#: superset/security/analytics_db_safety.py:44 +#, python-format +msgid "%(dialect)s cannot be used as a data source for security reasons." +msgstr "" +"%(dialect)s ni mogoče uporabiti kot podatkovni vir zaradi varnostnih razlogov." -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:109 -msgid "Check to include SQL time grain dropdown" -msgstr "Izberite za vključitev spustnega seznama za časovno granulacijo SQL" +#: superset/sqllab/command.py:159 +msgid "" +"The database referenced in this query was not found. Please contact an " +"administrator for further assistance or try again." +msgstr "" +"Podatkovna baza, referencirana v tej poizvedbi, ni bila najdena. Kontaktirajte " +"administratorja za napotke ali pa poskusite znova." -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:123 -msgid "Check to include time column dropdown" -msgstr "Izberite za vključitev časovnega stolpca v spustni seznam" +#: superset/sqllab/query_render.py:97 +#, python-format +msgid "The parameter %(parameters)s in your query is undefined." +msgid_plural "The following parameters in your query are undefined: %(parameters)s." +msgstr[0] "V vaši poizvedbi ni definiranih naslednjih parametrov: %(parameters)s." +msgstr[1] "V vaši poizvedbi ni definiranih naslednjih parametrov: %(parameters)s." +msgstr[2] "V vaši poizvedbi ni definiranih naslednjih parametrov: %(parameters)s." +msgstr[3] "V vaši poizvedbi ni definiranih naslednjih parametrov: %(parameters)s." -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:110 -msgid "Check to include time grain dropdown" -msgstr "Izberite za vključitev spustnega seznama za časovno granullacijo" +#: superset/sqllab/query_render.py:118 +msgid "The query contains one or more malformed template parameters." +msgstr "Poizvedba vsebuje enega ali več parametrov predlog z napačno obliko." -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:46 -msgid "Check to include time origin dropdown" -msgstr "Izberi za vključitev spustnega seznama za časovno izhodišče" +#: superset/sqllab/query_render.py:121 +msgid "" +"Please check your query and confirm that all template parameters are surround by " +"double braces, for example, \"{{ ds }}\". Then, try running your query again." +msgstr "" +"V poizvedbi preverite, da so vsi parametri obdani z dvojnimi oklepaji, npr. " +"\"{{ ds }}\". Potem poskusite ponovno." -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:173 -msgid "Child label position" -msgstr "Položaj podrejene oznake" +#: superset/templates/appbuilder/navbar_right.html:35 +msgid "New" +msgstr "Nov" -#: superset/viz.py:2333 -msgid "Choice of [Label] must be present in [Group By]" -msgstr "Izbira [Oznaka] mora biti prisotna v [Združevanje]" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1168 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:288 +#: superset/templates/appbuilder/navbar_right.html:38 +msgid "SQL Query" +msgstr "SQL poizvedba" -#: superset/viz.py:2341 -msgid "Choice of [Point Radius] must be present in [Group By]" -msgstr "Izbran [Point Radius] mora biti prisoten v [Združevanje]" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:419 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1320 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1323 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:289 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:650 +#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:211 +#: superset-frontend/src/views/components/MenuRight.tsx:173 +#: superset/templates/appbuilder/navbar_right.html:39 +#: superset/views/chart/mixin.py:85 superset/views/chart/views.py:104 +msgid "Chart" +msgstr "Grafikon" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:150 -#: superset/templates/superset/import_dashboards.html:47 -msgid "Choose File" -msgstr "Izberite datoteko" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1319 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1340 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:603 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:219 +#: superset-frontend/src/views/components/MenuRight.tsx:182 +#: superset/templates/appbuilder/navbar_right.html:40 +#: superset/views/dashboard/mixin.py:78 superset/views/dashboard/views.py:194 +msgid "Dashboard" +msgstr "Nadzorna plošča" -#: superset/reports/commands/exceptions.py:80 -msgid "Choose a chart or dashboard not both" -msgstr "Izberite grafikon ali nadzorno ploščo, ne obojega" +#: superset-frontend/src/views/components/MenuRight.tsx:362 +#: superset/templates/appbuilder/navbar_right.html:109 +msgid "Profile" +msgstr "Profil" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:674 -#, fuzzy -msgid "Choose a database..." -msgstr "Izberite podatkovni set" +#: superset-frontend/src/views/components/MenuRight.tsx:367 +#: superset/templates/appbuilder/navbar_right.html:110 +msgid "Info" +msgstr "Informacije" -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:278 -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:288 -msgid "Choose a dataset" -msgstr "Izberite podatkovni set" +#: superset-frontend/src/views/components/MenuRight.tsx:371 +#: superset/templates/appbuilder/navbar_right.html:111 +msgid "Logout" +msgstr "Odjava" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:69 -msgid "Choose a metric for left axis" -msgstr "Izberite mero za levo os" +#: superset-frontend/src/views/components/MenuRight.tsx:434 +#: superset/templates/appbuilder/navbar_right.html:126 +msgid "Login" +msgstr "Prijava" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:120 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:185 -#: superset-frontend/src/explore/controls.jsx:217 -msgid "Choose a metric for right axis" -msgstr "Izberite mero za desno os" +#: superset/templates/appbuilder/general/widgets/base_list.html:55 +msgid "Record Count" +msgstr "Število zapisov" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:57 -msgid "Choose a number format" -msgstr "Izberite obliko zapisa števila" +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:166 +#: superset/templates/appbuilder/general/widgets/base_list.html:64 +msgid "No records found" +msgstr "Ni zapisov" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:63 -msgid "Choose a source" -msgstr "Izberite izvor" +#: superset/templates/appbuilder/general/widgets/search.html:24 +msgid "Filter List" +msgstr "Seznam filtrov" -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:105 -#: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:44 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:34 -msgid "Choose a source and a target" -msgstr "Izberite izhodišče in cilj" +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:122 +#: superset-frontend/src/explore/components/DataTableControl/index.tsx:107 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:453 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:304 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:575 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:292 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:524 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:474 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:532 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:463 +#: superset/templates/appbuilder/general/widgets/search.html:40 +msgid "Search" +msgstr "Iskanje" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:69 -msgid "Choose a target" -msgstr "Izberite cilj" +#: superset/templates/appbuilder/general/widgets/search.html:57 +msgid "Refresh" +msgstr "Osveži" -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:308 -msgid "Choose chart type" -msgstr "Izberite tip grafikona" +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:617 +#: superset/templates/superset/import_dashboards.html:21 +msgid "Import dashboards" +msgstr "Uvozi nadzorne plošče" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:100 -msgid "Choose one or more charts for left axis" -msgstr "Izberite enega ali več grafikonov za levo os" +#: superset/templates/superset/import_dashboards.html:26 +msgid "Import Dashboard(s)" +msgstr "Uvozi nadzorne plošče" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:135 -msgid "Choose one or more charts for right axis" -msgstr "Izberite enega ali več grafikonov za desno os" +#: superset/templates/superset/import_dashboards.html:37 +msgid "File" +msgstr "Datoteka" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:745 -msgid "Choose the annotation layer type" -msgstr "Izberite tip sloja z oznakami" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:150 +#: superset/templates/superset/import_dashboards.html:47 +msgid "Choose File" +msgstr "Izberite datoteko" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:757 -msgid "Choose the source of your annotations" -msgstr "Izberite vir svojih oznak" +#: superset/templates/superset/import_dashboards.html:63 +msgid "Upload" +msgstr "Naloži" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:34 -msgid "Chord Diagram" -msgstr "Tetivni grafikon" +#: superset/templates/superset/request_access.html:20 +msgid "No Access!" +msgstr "Ni dostopa!" -#: superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx:281 -msgid "Chosen non-numeric column" -msgstr "Izbran ne-numeričen stolpec" +#: superset/templates/superset/request_access.html:25 +#, python-format +msgid "You do not have permissions to access the datasource(s): %(name)s." +msgstr "Nimate dovoljenj za dostop do podatkovnih virov: %(name)s." -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:218 -msgid "Circle" -msgstr "Krog" +#: superset/templates/superset/request_access.html:31 +msgid "Request Permissions" +msgstr "Zahtevaj dovoljenja" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:130 -msgid "Circle -> Arrow" -msgstr "Krog -> Puščica" +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:179 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:220 +#: superset-frontend/src/components/Modal/Modal.tsx:253 +#: superset-frontend/src/components/ReportModal/index.tsx:214 +#: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:80 +#: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:72 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:513 +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:153 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:136 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:76 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:62 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:199 +#: superset-frontend/src/explore/components/SaveModal.tsx:192 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:813 +#: superset/templates/superset/request_access.html:34 +msgid "Cancel" +msgstr "Prekliči" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:131 -msgid "Circle -> Circle" -msgstr "Krog -> Krog" +#: superset/templates/superset/fab_overrides/list_with_checkboxes.html:82 +msgid "Use the edit button to change this field" +msgstr "Za spreminjanje tega polja uporabite gumb za urejanje" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:198 -msgid "Circle radar shape" -msgstr "Okrogla oblika radarja" +#: superset/templates/superset/models/database/macros.html:22 +msgid "Test Connection" +msgstr "Preizkusi povezavo" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:37 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:33 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:112 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:40 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:67 -msgid "Circular" -msgstr "Krožno" +#: superset/temporary_cache/commands/exceptions.py:49 +msgid "Resource was not found." +msgstr "Vir ni bil najden." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:32 -msgid "Classic chart that visualizes how metrics change over time." -msgstr "Standardni grafikon za prikaz spreminjanje mere skozi čas." +#: superset/utils/core.py:881 +#, python-format +msgid "[Superset] Access to the datasource %(name)s was granted" +msgstr "[Superset] dostop do podatkovnega vira %(name)s je odobren" -#: superset-frontend/plugins/plugin-chart-table/src/index.ts:37 -msgid "" -"Classic row-by-column spreadsheet like view of a dataset. Use tables to " -"showcase a view into the underlying data or to show aggregated metrics." -msgstr "Standardna razpredelnica za prikaz podatkovnega seta." +#: superset/utils/core.py:1068 +#, python-format +msgid "Unsupported clause type: %(clause)s" +msgstr "Nepodprt tip izraza: %(clause)s" -#: superset/connectors/sqla/views.py:369 -msgid "Clause" -msgstr "Stavek" +#: superset/utils/core.py:1306 +msgid "Invalid metric object" +msgstr "Neveljaven objekt mere" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:53 -msgid "Clear" -msgstr "Počisti" +#: superset/utils/date_parser.py:393 +#, python-format +msgid "Unable to find such a holiday: [%(holiday)s]" +msgstr "Ni mogoče najti takšnega praznika: [%(holiday)s]" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx:133 -msgid "Clear all" -msgstr "Počisti vse" +#: superset/utils/pandas_postprocessing/boxplot.py:88 +msgid "" +"percentiles must be a list or tuple with two numeric values, of which the first " +"is lower than the second value" +msgstr "" +"percentili morajo biti tipa list ali tuple z vsaj dvema numeričnima vrednostma, " +"pri čemer je prva manjša od druge" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:997 -msgid "Click the lock to make changes." -msgstr "Kliknite ključavnico, da omogočite spreminjanje." +#: superset/utils/pandas_postprocessing/compare.py:53 +msgid "`compare_columns` must have the same length as `source_columns`." +msgstr "`compare_columns` morajo imeti enako dolžino kot `source_columns`." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1000 -msgid "Click the lock to prevent further changes." -msgstr "Kliknite ključavnico, da onemogočite spreminjanje." +#: superset/utils/pandas_postprocessing/compare.py:57 +msgid "`compare_type` must be `difference`, `percentage` or `ratio`" +msgstr "`compare_type` mora biti `difference`, `percentage` ali `ratio`" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1306 +#: superset/utils/pandas_postprocessing/contribution.py:59 +#, python-format msgid "" -"Click this link to switch to an alternate form that allows you to input " -"the SQLAlchemy URL for this database manually." -msgstr "" -"Kliknite to povezavo za drugo vnosno formo, ki omogoča ročni vnos " -"SQLAlchemy URL-ja za to podatkovno bazo." +"Column \"%(column)s\" is not numeric or does not exists in the query results." +msgstr "Stolpec \"%(column)s\" ni numeričen ali ne obstaja v rezultatu poizvedbe." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1071 -msgid "" -"Click this link to switch to an alternate form that exposes only the " -"required fields needed to connect this database." -msgstr "" -"Kliknite to povezavo za drugo vnosno formo, ki prikaže samo zahtevana " -"polja za povezavo s podatkovno bazo." +#: superset/utils/pandas_postprocessing/contribution.py:69 +msgid "`rename_columns` must have the same length as `columns`." +msgstr "`rename_columns` morajo imeti enako dolžino kot `columns`." -#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:114 -msgid "Click to change visualization type" -msgstr "Kliknite za spremembo tipa vizualizacije" +#: superset/utils/pandas_postprocessing/cum.py:55 +#, python-format +msgid "Invalid cumulative operator: %(operator)s" +msgstr "Neveljaven kumulativni operand: %(operator)s" -#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:151 -msgid "Click to clear emitted filters" -msgstr "S klikom počistite oddane filtre" +#: superset/utils/pandas_postprocessing/geography.py:49 +msgid "Invalid geohash string" +msgstr "Neveljaven niz za geohash" -#: superset-frontend/src/components/EditableTitle/index.tsx:197 -msgid "Click to edit" -msgstr "Kliknite za urejanje" +#: superset/utils/pandas_postprocessing/geography.py:76 +msgid "Invalid longitude/latitude" +msgstr "Neveljavna zemljepisna dolžina/širina" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelectPopoverTitle.jsx:76 -#, fuzzy -msgid "Click to edit label" -msgstr "Kliknite za urejanje" +#: superset/utils/pandas_postprocessing/geography.py:118 +msgid "Invalid geodetic string" +msgstr "Neveljaven geodetski niz" -#: superset-frontend/src/components/FaveStar/index.tsx:81 -msgid "Click to favorite/unfavorite" -msgstr "Kliknite za priljubljeno/nepriljubljeno" +#: superset/utils/pandas_postprocessing/pivot.py:71 +msgid "Pivot operation requires at least one index" +msgstr "Vrtilna operacija zahteva vsaj en indeks" -#: superset-frontend/src/components/CachedLabel/TooltipContent.tsx:39 -msgid "Click to force-refresh" -msgstr "Kliknite za prisilno osvežitev" +#: superset/utils/pandas_postprocessing/pivot.py:75 +msgid "Pivot operation must include at least one aggregate" +msgstr "Vrtilna operacija mora vsebovati vsaj en agregat" -#: superset-frontend/src/components/AlteredSliceTag/index.jsx:177 -msgid "Click to see difference" -msgstr "Kliknite za prikaz razlike" +#: superset/utils/pandas_postprocessing/prophet.py:61 +msgid "`prophet` package not installed" +msgstr "Knjižnica `prophet` ni nameščena" -#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:192 -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:523 -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:307 -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:247 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:476 -#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:337 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:805 -msgid "Close" -msgstr "Zapri" +#: superset/utils/pandas_postprocessing/prophet.py:114 +msgid "Time grain missing" +msgstr "Časovna granulacija manjka" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:360 -msgid "Close all other tabs" -msgstr "Zapri vse ostale zavihke" +#: superset/utils/pandas_postprocessing/prophet.py:117 +#, python-format +msgid "Unsupported time grain: %(time_grain)s" +msgstr "Nepodprta časovna granulacija: %(time_grain)s" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:339 -msgid "Close tab" -msgstr "Zapri zavihek" +#: superset/utils/pandas_postprocessing/prophet.py:126 +msgid "Periods must be a whole number" +msgstr "Periode morajo biti celo število" -#: superset/connectors/druid/views.py:344 -msgid "Cluster" -msgstr "Gruča" +#: superset/utils/pandas_postprocessing/prophet.py:129 +msgid "Confidence interval must be between 0 and 1 (exclusive)" +msgstr "Interval zaupanja mora biti med 0 in 1 (odprt)" -#: superset/connectors/druid/views.py:232 -msgid "Cluster Name" -msgstr "Ime gruče" +#: superset/utils/pandas_postprocessing/prophet.py:132 +msgid "DataFrame must include temporal column" +msgstr "DataFrame mora vsebovati časovni stolpec" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:171 -msgid "Cluster label aggregator" -msgstr "Agregator za oznako gruče" +#: superset/utils/pandas_postprocessing/prophet.py:134 +msgid "DataFrame include at least one series" +msgstr "DataFrame vsebuje vsaj eno serijo" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:74 -msgid "Clustering Radius" -msgstr "Radij gručenja" +#: superset/utils/pandas_postprocessing/rename.py:53 +msgid "Label already exists" +msgstr "Oznaka že obstaja" -#: superset-frontend/src/explore/controlPanels/Separator.js:25 -#: superset-frontend/src/explore/controlPanels/Separator.js:46 -msgid "Code" -msgstr "Koda" +#: superset/utils/pandas_postprocessing/resample.py:43 +msgid "Resample operation requires DatetimeIndex" +msgstr "Prevzorčevalna operacija zahteva indeks tipa datumčas" -#: superset-frontend/src/dashboard/components/filterscope/treeIcons.jsx:39 -msgid "Collapse all" -msgstr "Skrči vse" +#: superset/utils/pandas_postprocessing/resample.py:46 +msgid "Resample method should in " +msgstr "Metoda za prevzorčenje v Pandas mora " -#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:152 -#, fuzzy -msgid "Collapse table preview" -msgstr "Odstrani predogled tabele" +#: superset/utils/pandas_postprocessing/rolling.py:67 +msgid "Undefined window for rolling operation" +msgstr "Nedefinirano okno za drsečo operacijo" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:648 -msgid "Color" -msgstr "Barva" +#: superset/utils/pandas_postprocessing/rolling.py:69 +msgid "Window must be > 0" +msgstr "Okno mora biti > 0" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:137 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:439 -msgid "Color +/-" -msgstr "Barva +/-" +#: superset/utils/pandas_postprocessing/rolling.py:84 +#, python-format +msgid "Invalid rolling_type: %(type)s" +msgstr "Neveljaven rolling_type: %(type)s" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:159 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:206 -msgid "Color Metric" -msgstr "Mera za barvo" +#: superset/utils/pandas_postprocessing/rolling.py:90 +#, python-format +msgid "Invalid options for %(rolling_type)s: %(options)s" +msgstr "Neveljavne možnosti za %(rolling_type)s: %(options)s" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:108 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:474 -msgid "Color Scheme" -msgstr "Barvna shema" +#: superset/utils/pandas_postprocessing/utils.py:141 +msgid "Referenced columns not available in DataFrame." +msgstr "Referencirani stolpci niso razpoložljivi v Dataframe-u." -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:129 -msgid "Color Steps" -msgstr "Barvni koraki" +#: superset/utils/pandas_postprocessing/utils.py:167 +#, python-format +msgid "Column referenced by aggregate is undefined: %(column)s" +msgstr "Stolpec referenciran z agregacijo ni definiran: %(column)s" -#: superset-frontend/src/explore/controls.jsx:235 -msgid "Color metric" -msgstr "P" +#: superset/utils/pandas_postprocessing/utils.py:174 +#, python-format +msgid "Operator undefined for aggregator: %(name)s" +msgstr "Operand ni definiran za agregatorja: %(name)s" -#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:50 -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:214 -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:218 -#: superset-frontend/src/explore/controlPanels/sections.tsx:79 -#: superset-frontend/src/explore/controls.jsx:480 -msgid "Color scheme" -msgstr "Barvna shema" +#: superset/utils/pandas_postprocessing/utils.py:186 +#, python-format +msgid "Invalid numpy function: %(operator)s" +msgstr "Neveljavna numpy funkcija: %(operator)s" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:172 -msgid "" -"Color will be rendered based on a ratio of the cell against the sum of " -"across this criteria" -msgstr "" -"Barva bo prikazana na osnovi razmerja med celico in vsoto glede na ta " -"kriterij" +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:275 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:365 +#: superset-frontend/src/views/components/MenuRight.tsx:359 +#: superset/views/access_requests.py:41 superset/views/log/__init__.py:30 +#: superset/views/sql_lab.py:74 +msgid "User" +msgstr "Uporabnik" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:374 -msgid "Colors" -msgstr "Barve" +#: superset/views/access_requests.py:42 +msgid "User Roles" +msgstr "Vloge uporabnikov" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:283 -#: superset-frontend/src/dashboard/components/gridComponents/new/NewColumn.jsx:31 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:109 -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:204 -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:227 -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:137 -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:140 -#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:194 -#: superset/connectors/druid/views.py:91 superset/connectors/sqla/views.py:143 -msgid "Column" -msgstr "Stolpec" +#: superset/views/access_requests.py:43 +msgid "Database URL" +msgstr "URL podatkovne baze" -#: superset/utils/pandas_postprocessing.py:712 -#, python-format -msgid "" -"Column \"%(column)s\" is not numeric or does not exists in the query " -"results." -msgstr "Stolpec \"%(column)s\" ni numeričen ali ne obstaja v rezultatu poizvedbe." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:177 +#: superset/views/access_requests.py:44 superset/views/chart/mixin.py:80 +msgid "Datasource" +msgstr "Podatkovni vir" -#: superset/views/database/forms.py:224 superset/views/database/forms.py:357 -#: superset/views/database/forms.py:445 -msgid "Column Label(s)" -msgstr "Naslovi stolpcev" +#: superset/views/access_requests.py:45 +msgid "Roles to grant" +msgstr "Vloge za dovoljevanje" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:79 -msgid "" -"Column containing ISO 3166-2 codes of region/province/department in your " -"table." -msgstr "" -"Stolpec, ki vsebuje ISO 3166-2 oznake regij/provinc/departmajev v vaši " -"tabeli." +#: superset/views/access_requests.py:46 +msgid "Created On" +msgstr "Ustvarjeno" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:64 -msgid "Column containing latitude data" -msgstr "Stolpec s podatki zemljepisne širine" +#: superset/views/annotations.py:39 +msgid "annotation start time or end time is required." +msgstr "začetni in končni čas oznake je obvezen." -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:54 -msgid "Column containing longitude data" -msgstr "Stolpec s podatki zemljepisne dolžine" +#: superset/views/annotations.py:46 +msgid "Annotation end time must be no earlier than start time." +msgstr "Končni čas oznake ne sem biti pred začetnim." -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:115 -msgid "Column is required" -msgstr "Zahtevan je stolpec" +#: superset/views/annotations.py:57 +msgid "Annotations" +msgstr "Oznake" -#: superset/views/database/forms.py:225 superset/views/database/forms.py:358 -#: superset/views/database/forms.py:446 -msgid "" -"Column label for index column(s). If None is given and Dataframe Index is" -" True, Index Names are used." -msgstr "" -"Naslovi stolpcev za indeksne stolpce. Če le-ti niso podani in indeksi " -"Dataframe-a obstajajo, se uporabijo imena indeksov." +#: superset/views/annotations.py:58 +msgid "Show Annotation" +msgstr "Prikaži oznako" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:652 -#, python-format -msgid "Column name [%s] is duplicated" -msgstr "Ime stolpca [%s] je podvojeno" +#: superset/views/annotations.py:59 +msgid "Add Annotation" +msgstr "Dodaj oznako" -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:139 -msgid "Column name(s) " -msgstr "Imena stolpcev " +#: superset/views/annotations.py:60 +msgid "Edit Annotation" +msgstr "Uredi oznako" -#: superset/utils/pandas_postprocessing.py:168 -#, python-format -msgid "Column referenced by aggregate is undefined: %(column)s" -msgstr "Stolpec referenciran z agregacijo ni definiran: %(column)s" +#: superset/views/annotations.py:75 +msgid "Layer" +msgstr "Sloj" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:130 -msgid "Column select" -msgstr "Izbira stolpca" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx:82 +#: superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx:111 +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:169 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:244 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:248 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1197 +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:157 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:157 +#: superset/views/annotations.py:76 superset/views/sql_lab.py:73 +msgid "Label" +msgstr "Naziv" -#: superset/views/database/forms.py:163 superset/views/database/forms.py:316 -msgid "" -"Column to use as the row labels of the dataframe. Leave empty if no index" -" column." -msgstr "" -"Stolpec, ki se uporabi za naslove vrstic v dataframe-u. Pustite prazno, " -"če ni indeksnega stolpca." +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:169 +#: superset/views/annotations.py:78 +msgid "Start" +msgstr "Začetek" -#: superset/views/database/forms.py:385 -msgid "Columnar File" -msgstr "Stoplčna datoteka" +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:178 +#: superset/views/annotations.py:79 +msgid "End" +msgstr "Konec" -#: superset/views/database/views.py:550 -#, python-format -msgid "" -"Columnar file \"%(columnar_filename)s\" uploaded to table " -"\"%(table_name)s\" in database \"%(db_name)s\"" -msgstr "" -"Stolpčna datoteka \"%(columnar_filename)s\" naložena v tabelo " -"\"%(table_name)s\" v podatkovni bazi \"%(db_name)s\"" +#: superset/views/annotations.py:80 superset/views/dashboard/mixin.py:89 +msgid "JSON Metadata" +msgstr "JSON metapodatki" -#: superset/views/database/views.py:414 -msgid "Columnar to Database configuration" -msgstr "Nastavitve pretvorbe Stolpci v Podatkovno bazo" +#: superset/views/annotations.py:114 +msgid "Show Annotation Layer" +msgstr "Prikaži sloj z oznakami" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:55 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:214 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:36 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:59 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:82 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:101 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:124 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1207 -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:334 -#: superset-frontend/src/explore/controls.jsx:245 -#: superset/connectors/druid/views.py:70 superset/connectors/sqla/views.py:63 -msgid "Columns" -msgstr "Stolpci" +#: superset/views/annotations.py:115 +msgid "Add Annotation Layer" +msgstr "Dodaj sloj z oznakami" -#: superset/common/query_context_processor.py:114 superset/viz.py:554 -#, python-format -msgid "Columns missing in datasource: %(invalid_columns)s" -msgstr "V podatkovnem viru manjkajo stolpci: %(invalid_columns)s" +#: superset/views/annotations.py:116 +msgid "Edit Annotation Layer" +msgstr "Uredi sloj z oznakami" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:302 -#, fuzzy -msgid "Columns subtotal position" -msgstr "Položaj vsot stolpcev" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:72 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:129 +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:212 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:242 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:244 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:759 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:232 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:130 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:131 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:311 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:275 +#: superset/views/annotations.py:122 superset/views/chart/mixin.py:86 +msgid "Name" +msgstr "Ime" -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:134 +#: superset/views/base.py:257 msgid "" -"Columns to calculate distribution across. Defaults to temporal column if " -"left empty." +"Table [%{table}s] could not be found, please double check your database " +"connection, schema, and table name, error: {}" msgstr "" -"Stolpci za izračun porazdelitve. Privzeto je izbran časovni stolpec (če " -"je prazno)." +"Tabela [%{table}s] ni najdena. Preverite povezavo, shemo in ime tabele v " +"podatkovni bazi. Napaka: {}" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:44 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:45 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:54 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:102 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:125 -msgid "Columns to display" -msgstr "Stolpci za prikaz" +#: superset/views/base.py:533 +msgid "json isn't valid" +msgstr "json ni veljaven" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:43 -msgid "Columns to group by" -msgstr "Stolpci za združevanje" +#: superset/views/base.py:544 +msgid "Export to YAML" +msgstr "Izvozi v YAML" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:60 -msgid "Columns to group by on the columns" -msgstr "Stolpci za združevanje stolpcev" +#: superset/views/base.py:544 +msgid "Export to YAML?" +msgstr "Izvozim v YAML?" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:50 -msgid "Columns to group by on the rows" -msgstr "Stolpci za združevanje vrstic" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:90 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:343 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:531 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:307 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:366 +#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:104 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:397 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:696 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:336 +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:132 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:370 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:643 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:394 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:675 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:510 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:239 +#: superset/views/base.py:601 +msgid "Delete" +msgstr "Izbriši" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:96 -msgid "Combine Metrics" -msgstr "Združuj mere" +#: superset/views/base.py:601 +msgid "Delete all Really?" +msgstr "Ali resnično vse izbrišem?" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:185 -msgid "Combine metrics" -msgstr "Združuj mere" +#: superset/views/base_api.py:135 +msgid "Is favorite" +msgstr "Je priljubljen" + +#: superset/views/core.py:189 +msgid "The data source seems to have been deleted" +msgstr "Zdi se, da je bil podatkovni vir izbrisan" + +#: superset/views/core.py:190 +msgid "The user seems to have been deleted" +msgstr "Zdi se, da je bil uporabnik izbrisan" + +#: superset/views/core.py:307 +msgid "Access was requested" +msgstr "Zahtevan je bil dostop" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:301 +#: superset/views/core.py:363 +msgid "The access requests seem to have been deleted" +msgstr "Zdi se, da je bila zahteva za dostop izbrisana" + +#: superset/views/core.py:375 +#, python-format msgid "" -"Comma-separated color picks for the intervals, e.g. 1,2,4. Integers " -"denote colors from the chosen color scheme and are 1-indexed. Length must" -" be matching that of interval bounds." +"%(user)s was granted the role %(role)s that gives access to the %(datasource)s" msgstr "" -"Z vejico ločene barve za intervale, npr. 1,2,4. Cela števila " -"predstavljajo barve iz barvne sheme (začnejo se z 1). Dolžina mora " -"ustrezati mejam intervala." +"Uporabniku %(user)s je bila dodeljena vloga %(role)s, ki omogoča dostop do " +"%(datasource)s" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:287 -msgid "" -"Comma-separated interval bounds, e.g. 2,4,5 for intervals 0-2, 2-4 and " -"4-5. Last number should match the value provided for MAX." +#: superset/views/core.py:398 +#, python-format +msgid "Role %(r)s was extended to provide the access to the datasource %(ds)s" msgstr "" -"Z vejico ločeni intervali, npr. 2,4,5 za intervale 0-2, 2-4 in 4-5. " -"Zadnja številka naj bo enaka vrednosti za MAX." +"Vloga %(r)s je bila razširjena za zagotovitev dostopa do podatkovnega vira %(ds)s" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:312 -msgid "Comparator option" -msgstr "Možnosti komparatorja" +#: superset/views/core.py:415 +msgid "You have no permission to approve this request" +msgstr "Nimate dovoljenja za odobritev te zahteve" -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:26 -msgid "" -"Compare multiple time series charts (as sparklines) and related metrics " -"quickly." -msgstr "" -"Hitra primerjava več grafikonov časovnih vrst (sparkline način) in " -"povezanih mer." +#: superset/views/core.py:633 superset/views/core.py:857 superset/views/core.py:863 +#: superset/views/core.py:1037 superset/views/core.py:1055 +msgid "You don't have the rights to " +msgstr "Nimate pravic za " -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:26 -msgid "Compare the same summarized metric across multiple groups." -msgstr "Primerja isto mero med različnimi skupinami." +#: superset/views/core.py:633 +msgid "download as csv" +msgstr "prenos kot csv" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:28 +#: superset/views/core.py:713 +#, python-format msgid "" -"Compares how a metric changes over time between different groups. Each " -"group is mapped to a row and change over time is visualized bar lengths " -"and color." +"Cannot import dashboard: %(db_error)s.\n" +"Make sure to create the database before importing the dashboard." msgstr "" -"Primerja kako se mera spreminja s časom med različnimi skupinami. Vsaka " -"skupina predstavlja eno vrstico, časovne spremembe pa so prikazane z " -"dolžino stolpcev in barvami." +"Nadzorne plošče ni mogoče uvoziti: %(db_error)s.\n" +"Pred uvozom poskrbite za ustvarjenje podatkovne baze." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:30 -msgid "" -"Compares metrics from different categories using bars. Bar lengths are " -"used to indicate the magnitude of each value and color is used to " -"differentiate groups." +#: superset/views/core.py:724 +msgid "An unknown error occurred. Please contact your Superset administrator" msgstr "" -"Primerjava mer različnih kategorij s pomočjo stolpcev. Dolžina stolpca " -"prestavlja višino vrednosti, z barvami pa so ločene skupine." +"Zgodila se je neznana napaka. Kontaktirajte svojega administratorja za Superset" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:26 -msgid "" -"Compares the lengths of time different activities take in a shared " -"timeline view." -msgstr "Primerja dolžine časovno različnih aktivnosti na skupni časovnici." +#: superset/views/core.py:766 +msgid "Error: permalink state not found" +msgstr "Napaka: stanje povezave ni najdeno" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:33 -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:33 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:37 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:34 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:36 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:42 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:35 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:46 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:41 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:68 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:56 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:60 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:43 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:31 -msgid "Comparison" -msgstr "Primerjava" +#: superset/views/core.py:769 superset/views/core.py:1980 +#, python-format +msgid "Error: %(msg)s" +msgstr "Napaka: %(msg)s" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:48 -msgid "Comparison Period Lag" -msgstr "Zaostanek obdobja za primerjavo" +#: superset/views/core.py:783 +msgid "Form data not found in cache, reverting to chart metadata." +msgstr "" +"Podatkov ni mogoče najti v predpomnilniku. Uporabljeni bodo metapodatki grafikona." -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:61 -msgid "Comparison suffix" -msgstr "Pripona za primerjavo" +#: superset/views/core.py:789 +msgid "Form data not found in cache, reverting to dataset metadata." +msgstr "" +"Podatkov ni mogoče najti v predpomnilniku. Uporabljeni bodo metapodatki " +"podatkovnega seta." -#: superset-frontend/src/dashboard/components/BuilderComponentPane.tsx:102 -msgid "Components" -msgstr "Komponente" +#: superset/views/core.py:817 +msgid "[Missing Dataset]" +msgstr "[Manjka podatkovni set]" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:53 -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:56 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:59 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:57 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:72 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:367 -#: superset-frontend/src/explore/controlPanels/sections.tsx:136 -msgid "Compute the contribution to the total" -msgstr "Izračunaj prispevek k celoti" +#: superset/views/core.py:857 superset/views/core.py:1038 +msgid "alter this " +msgstr "spreminjanje tega " -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1173 -msgid "Condition" -msgstr "Pogoj" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:167 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:742 +#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:84 +#: superset/views/core.py:857 superset/views/core.py:863 +msgid "chart" +msgstr "grafikona" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:320 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:473 -msgid "Conditional formatting" -msgstr "Pogojno oblikovanje" +#: superset/views/core.py:863 superset/views/core.py:1056 +msgid "create a " +msgstr "ustvarite " -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:70 -msgid "Confidence interval" -msgstr "Interval zaupanja" +#: superset/views/core.py:919 +#, python-format +msgid "Explore - %(table)s" +msgstr "Razišči - %(table)s" -#: superset/utils/pandas_postprocessing.py:827 -msgid "Confidence interval must be between 0 and 1 (exclusive)" -msgstr "Interval zaupanja mora biti med 0 in 1 (odprt)" +#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx:90 +#: superset/views/core.py:921 +msgid "Explore" +msgstr "Raziskovanje" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:252 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:276 -msgid "Configuration" -msgstr "Nastavitve" +#: superset/views/core.py:1013 +msgid "Chart [{}] has been saved" +msgstr "Grafikon [{}] je bil shranjen" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:58 -msgid "Configure Advanced Time Range " -msgstr "Nastavi napredno časovno obdobje " +#: superset/views/core.py:1017 +msgid "Chart [{}] has been overwritten" +msgstr "Grafikon [{}] je bil prepisan" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CommonFrame.tsx:41 -msgid "Configure Time Range: Last..." -msgstr "Nastavi časovno obdobje: Zadnji ..." +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:118 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:699 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:80 +#: superset/views/core.py:1039 superset/views/core.py:1057 +msgid "dashboard" +msgstr "nadzorna plošča" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CalendarFrame.tsx:46 -msgid "Configure Time Range: Previous..." -msgstr "Nastavi časovno obdobje: Prejšnji ..." +#: superset/views/core.py:1044 +msgid "Chart [{}] was added to dashboard [{}]" +msgstr "Grafikon [{}] je bil dodan na nadzorno ploščo [{}]" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:111 -msgid "Configure custom time range" -msgstr "Nastavi prilagojeno časovno obdobje" +#: superset/views/core.py:1066 +msgid "Dashboard [{}] just got created and chart [{}] was added to it" +msgstr "Nadzorna plošča [{}] je bila ravno ustvarjena in grafikon [{}] dodan nanjo" -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:500 -msgid "Configure filter scopes" -msgstr "Nastavi doseg filtrov" +#: superset/views/core.py:1292 +msgid "" +"This dashboard was changed recently. Please reload dashboard to get latest " +"version." +msgstr "" +"Nadzorna plošča je bila pred kratkim spremenjena. Ponovno jo naložite, da dobite " +"zadnjo verzijo." -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:718 -msgid "Configure the basics of your Annotation Layer." -msgstr "Osnovne nastavitve sloja z oznakami." +#: superset/views/core.py:1386 +#, python-format +msgid "Could not load database driver: %(driver_name)s" +msgstr "Gonilnika podatkovne baze ni mogoče naložiti: %(driver_name)s" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:616 -msgid "Configure your how you overlay is displayed here." -msgstr "Nastavite kako se tukaj prikazuje vrhnja plast." +#: superset/views/core.py:1395 +msgid "" +"Invalid connection string, a valid string usually follows:\n" +"'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'" +msgstr "" +"Neveljaven niz povezave, veljaven niz običajno sledi:\n" +"'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'" -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:179 -msgid "Confirm save" -msgstr "Potrdite shranjevanje" +#: superset/views/core.py:1788 +msgid "Malformed request. slice_id or table_name and db_name arguments are expected" +msgstr "" +"Deformirana zahteva. Pričakovani so argumenti slice_id ali table_name in db_name" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:777 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1006 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1193 -msgid "Connect" -msgstr "Poveži" +#: superset/views/core.py:1798 +#, python-format +msgid "Chart %(id)s not found" +msgstr "Grafikon %(id)s ni najden" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:41 -msgid "Connect Google Sheets as tables to this database" -msgstr "Googlove preglednice poveži s to podatkovno bazo kot tabele" +#: superset/views/core.py:1811 +#, python-format +msgid "Table %(table)s wasn't found in the database %(db)s" +msgstr "Tabela %(table)s ni bila najdena v podatkovni bazi %(db)s" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1011 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1197 -msgid "Connect a database" -msgstr "Poveži se s podatkovno bazo" +#: superset/views/core.py:1983 +msgid "permalink state not found" +msgstr "stanje povezave ni najdeno" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1068 -msgid "Connect this database using the dynamic form instead" +#: superset/views/core.py:2053 +msgid "" +"One or more required fields are missing in the request. Please try again, and if " +"the problem persists conctact your administrator." msgstr "" +"Eno ali več zahtevanih polj manjka v zahtevi. Poskusite znova, če težava ostane, " +"kontaktirajte administratorja." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1301 -msgid "Connect this database with a SQLAlchemy URI string instead" +#: superset/views/core.py:2063 +msgid "The database was not found." +msgstr "Podatkovna baza ni bila najdena." + +#: superset/views/core.py:2193 +msgid "" +"Data could not be retrieved from the results backend. You need to re-run the " +"original query." msgstr "" +"Podatkov ni bilo mogoče pridobiti iz zalednega sistema rezultatov. Ponovno morate " +"zagnati izvorno poizvedbo." -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:224 -msgid "Connection" -msgstr "Povezava" +#: superset/views/core.py:2207 +msgid "" +"The query associated with these results could not be found. You need to re-run the " +"original query." +msgstr "" +"Poizvedbe, povezane s temi rezultati, ni bilo mogoče najti. Ponovno morate " +"zagnati izvorno poizvedbo." -#: superset/databases/commands/exceptions.py:105 -#: superset/databases/commands/exceptions.py:122 superset/views/core.py:1383 -msgid "Connection failed, please check your connection settings" -msgstr "Povezava neuspešna. Preverite nastavitve povezave" +#: superset/views/core.py:2222 +msgid "" +"You are not authorized to see this query. If you think this is an error, please " +"reach out to your administrator." +msgstr "" +"Nimate dovoljenja za ogled te poizvedbe. Če menite, da je to napaka, " +"kontaktirajte administratorja." -#: superset-frontend/src/views/CRUD/hooks.ts:625 -msgid "Connection looks good!" -msgstr "Povezava izgleda v redu!" +#: superset/views/core.py:2240 +msgid "" +"Data could not be deserialized from the results backend. The storage format might " +"have changed, rendering the old data stake. You need to re-run the original query." +msgstr "" +"Podatkov ni bilo mogoče deserializirati iz zalednega sistema rezultatov. Lahko je " +"prišlo do spremembe oblike zapisa. Ponovno zaženite izvorno poizvedbo." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:46 -msgid "Continuous" -msgstr "Zvezno" +#: superset/views/core.py:2257 +msgid "The provided `rows` argument is not a valid integer." +msgstr "Podani argument `rows` ni veljavno celo število." -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:51 -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:54 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:57 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:55 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:70 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:365 -#: superset-frontend/src/explore/controlPanels/sections.tsx:134 -msgid "Contribution" -msgstr "Prispevek" +#: superset/views/core.py:2706 +#, python-format +msgid "%(user)s's profile" +msgstr "Profil uporabnika: %(user)s" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:69 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:69 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:70 -msgid "Contribution Mode" -msgstr "Način deležev" +#: superset/views/css_templates.py:36 +msgid "Show CSS Template" +msgstr "Prikaži CSS predlogo" -#: superset-frontend/src/explore/components/ExploreViewContainer.jsx:430 -msgid "Control labeled " -msgstr "Nastavitev " +#: superset/views/css_templates.py:37 +msgid "Add CSS Template" +msgstr "Dodaj CSS predlogo" -#: superset-frontend/src/explore/components/ExploreViewContainer.jsx:430 -msgid "Controls labeled " -msgstr "Kontrolniki imenovani " +#: superset/views/css_templates.py:38 +msgid "Edit CSS Template" +msgstr "Uredi CSS predlogo" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:57 -msgid "Coordinates" -msgstr "Koordinate" +#: superset/views/css_templates.py:43 +msgid "Template Name" +msgstr "Ime predloge" -#: superset-frontend/src/components/CopyToClipboard/index.jsx:75 -#: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:53 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:113 -msgid "Copied to clipboard!" -msgstr "Kopirano na odložišče!" +#: superset/views/dynamic_plugins.py:47 +msgid "A human-friendly name" +msgstr "Človeku prijazno ime" -#: superset-frontend/src/explore/components/DataTableControl/index.tsx:48 -msgid "Copy" -msgstr "Kopiraj" +#: superset/views/dynamic_plugins.py:48 +msgid "" +"Used internally to identify the plugin. Should be set to the package name from " +"the pluginʼs package.json" +msgstr "" +"Uporablja se za interno identifikacijo vtičnika. Naj bo nastavljeno na ime paketa " +"v vtičnikovem package.json" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:192 -msgid "Copy SELECT statement to the clipboard" -msgstr "Kopiraj stavek SELECT na odložišče" +#: superset/views/dynamic_plugins.py:52 +msgid "" +"A full URL pointing to the location of the built plugin (could be hosted on a CDN " +"for example)" +msgstr "" +"Celoten URL, ki kaže na lokacijo zgrajenega vtičnika (lahko gostuje npr. na CDN)" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:106 -msgid "Copy and Paste JSON credentials" -msgstr "Kopiraj in prilepi JSON prijavne podatke" +#: superset/views/dynamic_plugins.py:58 +msgid "Custom Plugins" +msgstr "Prilagojeni vtičniki" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:124 -msgid "Copy and paste the entire service account .json file here" -msgstr "Tukaj kopirajte in prilepite celotno json datoteko servisnega računa" +#: superset/views/dynamic_plugins.py:59 +msgid "Custom Plugin" +msgstr "Prilagojeni vtičnik" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:316 -msgid "Copy chart URL" -msgstr "Kopiraj URL grafikona" +#: superset/views/dynamic_plugins.py:60 +msgid "Add a Plugin" +msgstr "Dodaj vtičnik" -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:103 -msgid "Copy chart URL to clipboard" -msgstr "Kopiraj URL grafikona na odložišče" +#: superset/views/dynamic_plugins.py:61 +msgid "Edit Plugin" +msgstr "Uredi vtičnik" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:263 -msgid "Copy dashboard URL" -msgstr "Kopiraj URL nadzorne plošče" - -#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:98 -msgid "Copy link" -msgstr "Kopiraj povezavo" - -#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:184 -msgid "Copy message" -msgstr "Kopiraj sporočilo" - -#: superset-frontend/src/SqlLab/actions/sqlLab.js:548 -#: superset-frontend/src/SqlLab/reducers/sqlLab.js:74 -#, python-format -msgid "Copy of %s" -msgstr "Kopija %s" - -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:103 -msgid "Copy partition query to clipboard" -msgstr "Kopiraj particijsko poizvedbo na odložišče" - -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:390 -msgid "Copy query URL" -msgstr "Kopiraj URL poizvedbe" +#: superset/views/sql_lab.py:44 +msgid "List Saved Query" +msgstr "Seznam shranjenih poizvedb" -#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:88 -msgid "Copy query link to your clipboard" -msgstr "Kopiraj povezavo do poizvedbe v odložišče" +#: superset/views/sql_lab.py:45 +msgid "Show Saved Query" +msgstr "Prikaži shranjeno poizvedbo" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/ValidatedInputField.tsx:26 -msgid "Copy the account name of that database you are trying to connect to." -msgstr "Kopirajte ime računa podatkovne baze, s katero se skušate povezati." +#: superset/views/sql_lab.py:46 +msgid "Add Saved Query" +msgstr "Dodaj shranjeno poizvedbo" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:91 -msgid "Copy the name of the database you are trying to connect to." -msgstr "Kopirajte ime podatkovne baze, s katero se skušate povezati." +#: superset/views/sql_lab.py:47 +msgid "Edit Saved Query" +msgstr "Uredi shranjeno poizvedbo" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:552 -msgid "Copy to Clipboard" -msgstr "Kopiraj na odložišče" +#: superset/views/sql_lab.py:78 +msgid "End Time" +msgstr "Končni čas" -#: superset-frontend/src/components/CopyToClipboard/index.jsx:43 -#: superset-frontend/src/components/URLShortLinkButton/index.jsx:65 -#: superset-frontend/src/explore/components/EmbedCodeButton.jsx:106 -msgid "Copy to clipboard" -msgstr "Kopiraj na odložišče" +#: superset/views/sql_lab.py:79 +msgid "Pop Tab Link" +msgstr "Prikaži povezavo zavihka" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:25 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:28 -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:25 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:25 -msgid "Correlation" -msgstr "Korelacija" +#: superset/views/sql_lab.py:80 +msgid "Changed on" +msgstr "Spremenjen" -#: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:95 -msgid "Cost estimate" -msgstr "Ocena potratnosti" +#: superset-frontend/src/components/Chart/Chart.jsx:80 superset/views/utils.py:271 +msgid "The dataset associated with this chart no longer exists" +msgstr "Podatkovni set, povezan s tem grafikonom, ne obstaja več" -#: superset/views/utils.py:547 +#: superset/views/utils.py:500 msgid "Could not determine datasource type" msgstr "Ni mogoče določiti tipa podatkovnega vira" -#: superset-frontend/src/dashboard/actions/sliceEntities.js:116 -#: superset-frontend/src/dashboard/reducers/sliceEntities.js:65 -msgid "Could not fetch all saved charts" -msgstr "Vseh shranjenih grafikonov ni bilo mogoče pridobiti" - -#: superset/views/utils.py:563 +#: superset/views/utils.py:516 msgid "Could not find viz object" msgstr "Ni mogoče najti vizualizacijskega objekta" -#: superset/databases/commands/exceptions.py:130 -msgid "Could not load database driver" -msgstr "Ni mogoče naložiti gonilnika podatkovne baze" +#: superset/views/chart/mixin.py:27 +msgid "Show Chart" +msgstr "Prikaži grafikon" -#: superset/views/core.py:1366 -#, python-format -msgid "Could not load database driver: %(driver_name)s" -msgstr "Gonilnika podatkovne baze ni mogoče naložiti: %(driver_name)s" +#: superset/views/chart/mixin.py:28 +msgid "Add Chart" +msgstr "Dodaj grafikon" -#: superset/databases/commands/test_connection.py:99 -msgid "Could not load database driver: {}" -msgstr "Ni mogoče naložiti gonilnika podatkovne baze: {}" +#: superset/views/chart/mixin.py:29 +msgid "Edit Chart" +msgstr "Uredi grafikon" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:97 -msgid "Could not verify the host" +#: superset/views/chart/mixin.py:64 +msgid "" +"These parameters are generated dynamically when clicking the save or overwrite " +"button in the explore view. This JSON object is exposed here for reference and " +"for power users who may want to alter specific parameters." msgstr "" +"Ti parametri se ustvarijo dinamično s klikom gumba Shrani ali Prepiši v " +"raziskovalnem pogledu. Ta JSON objekt je prikazan kot vzorec za napredne " +"uporabnike, ki želijo spreminjati posamezne parametre." -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:40 -msgid "Country" -msgstr "Država" +#: superset/views/chart/mixin.py:70 +msgid "" +"Duration (in seconds) of the caching timeout for this chart. Note this defaults " +"to the datasource/table timeout if undefined." +msgstr "" +"Časovna veljavnost (v sekundah) predpomnjenja za ta grafikon. Če ni definirana, " +"je uporabljena vrednost za podatkovni vir/tabelo." -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:130 -msgid "Country Color Scheme" -msgstr "Barvna shema držav" +#: superset/views/chart/mixin.py:82 +msgid "Last Modified" +msgstr "Zadnja sprememba" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:115 -msgid "Country Column" -msgstr "Stolpec z državami" +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:56 +#: superset/views/chart/mixin.py:84 +msgid "Parameters" +msgstr "Parametri" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:39 -msgid "Country Field Type" -msgstr "Tip polja za države" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:189 +#: superset/views/chart/mixin.py:88 +msgid "Visualization Type" +msgstr "Tip vizualizacije" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:30 -#: superset/viz.py:2007 -msgid "Country Map" -msgstr "Zemljevid držav" +#: superset/views/dashboard/mixin.py:26 +msgid "Show Dashboard" +msgstr "Prikaži nadzorno ploščo" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:96 -msgid "Create" -msgstr "Ustvari" +#: superset/views/dashboard/mixin.py:27 +msgid "Add Dashboard" +msgstr "Dodaj nadzorno ploščo" -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:275 -msgid "Create a new chart" -msgstr "Ustvari nov grafikon" +#: superset/views/dashboard/mixin.py:28 +msgid "Edit Dashboard" +msgstr "Uredi nadzorno ploščo" -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:330 -msgid "Create new chart" -msgstr "Ustvari nov grafikon" +#: superset/views/dashboard/mixin.py:47 +msgid "" +"This json object describes the positioning of the widgets in the dashboard. It is " +"dynamically generated when adjusting the widgets size and positions by using drag " +"& drop in the dashboard view" +msgstr "" +"Ta JSON objekt opisuje postavitev pripomočkov na nadzorni plošči. Ustvari se " +"dinamično, ko prilagajamo velikost in postavitev pripomočkov z uporabo " +"povleci&spusti v pogledu nadzorne plošče" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:111 -msgid "Create new filter set" -msgstr "Ustvarite nov set filtrov" +#: superset/views/dashboard/mixin.py:53 +msgid "" +"The CSS for individual dashboards can be altered here, or in the dashboard view " +"where changes are immediately visible" +msgstr "" +"CSS za posamezne nadzorne plošče lahko spreminjamo tukaj ali pa v pogledu " +"nadzorne plošče, kjer so spremembe vidne takoj" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:124 -msgid "Create or select schema..." -msgstr "Ustvarite ali izberite shemo..." +#: superset/views/dashboard/mixin.py:58 +msgid "To get a readable URL for your dashboard" +msgstr "Za pridobitev berljivega URL-ja za nadzorno ploščo" -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:169 -msgid "Created" -msgstr "Ustvarjene" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:625 +#: superset/views/dashboard/mixin.py:59 +msgid "" +"This JSON object is generated dynamically when clicking the save or overwrite " +"button in the dashboard view. It is exposed here for reference and for power " +"users who may want to alter specific parameters." +msgstr "" +"Ta JSON objekt se ustvari dinamično s klikom gumba Shrani ali Prepiši v pogledu " +"nadzorne plošče. Tukaj je prikazan kot vzorec za napredne uporabnike, ki želijo " +"spreminjati posamezne parametre." -#: superset/views/access_requests.py:46 superset/views/schedules.py:237 -#: superset/views/schedules.py:317 -msgid "Created On" -msgstr "Ustvarjeno" +#: superset/views/dashboard/mixin.py:65 +msgid "Owners is a list of users who can alter the dashboard." +msgstr "\"Lastniki\" je seznam uporabnikov, ki lahko spreminjajo nadzorno ploščo." -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:383 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:212 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:286 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:333 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:474 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:192 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:273 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:323 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:471 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:292 -msgid "Created by" -msgstr "Ustvaril" +#: superset/views/dashboard/mixin.py:66 +msgid "" +"Roles is a list which defines access to the dashboard. Granting a role access to " +"a dashboard will bypass dataset level checks.If no roles defined then the " +"dashboard is available to all roles." +msgstr "" +"\"Vloge\" je seznam, ki definira dostop do nadzorne plošče. Dodelitev vloge za " +"dostop do nadzorne plošče bo obšlo preverjanje na nivoju podatkovnega seta. Če " +"vloga ni definirana, bo nadzorna plošča dostopna vsem vlogam." -#: superset-frontend/src/profile/components/App.tsx:62 -msgid "Created content" -msgstr "Ustvarjena vsebina" +#: superset/views/dashboard/mixin.py:71 +msgid "" +"Determines whether or not this dashboard is visible in the list of all dashboards" +msgstr "Določa ali je nadzorna plošča vidna na seznamu vseh nadzornih plošč" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:205 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:184 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:349 -msgid "Created on" -msgstr "Ustvarjeno" +#: superset-frontend/src/components/DynamicEditableTitle/index.tsx:186 +#: superset-frontend/src/components/DynamicEditableTitle/index.tsx:207 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:550 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:41 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:281 +#: superset/views/dashboard/mixin.py:79 superset/views/dashboard/views.py:195 +msgid "Title" +msgstr "Naslov" -#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:72 -msgid "Creating a data source and creating a new tab" -msgstr "Ustvarjanje podatkovnega vira in novega zavihka" +#: superset/views/dashboard/mixin.py:80 +msgid "Slug" +msgstr "Slug" -#: superset/connectors/sqla/views.py:370 superset/views/chart/mixin.py:78 -#: superset/views/dashboard/mixin.py:85 superset/views/dashboard/views.py:157 -#: superset/views/database/mixins.py:192 -msgid "Creator" -msgstr "Avtor" +#: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:101 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:304 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:506 +#: superset/views/dashboard/mixin.py:84 +msgid "Published" +msgstr "Objavljeno" -#: superset/views/schedules.py:241 superset/views/schedules.py:321 -msgid "Crontab" -msgstr "Crontab" +#: superset/views/dashboard/mixin.py:87 +msgid "Position JSON" +msgstr "JSON za postavitev" -#: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:65 -msgid "Cross Filter Scoping" -msgstr "Doseg medsebojnega filtra" +#: superset-frontend/src/dashboard/components/CssEditor/index.jsx:105 +#: superset/views/dashboard/mixin.py:88 +msgid "CSS" +msgstr "CSS" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:349 -msgid "Cross-filter scoping" -msgstr "Doseg medsebojnega filtra" +#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:117 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:416 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:704 +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:99 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:388 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:651 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:399 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:410 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:683 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:518 +#: superset/views/dashboard/views.py:66 +msgid "Export" +msgstr "Izvoz" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:153 -msgid "Cumulative" -msgstr "Kumulativno" +#: superset/views/dashboard/views.py:66 +msgid "Export dashboards?" +msgstr "Izvozim nadzorne plošče?" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:33 -msgid "Custom" -msgstr "Prilagojen" +#: superset/views/database/forms.py:96 +msgid "Name of table to be created from csv data." +msgstr "Ime tabele, ki bo ustvarjena iz CSV podatkov." -#: superset/views/dynamic_plugins.py:59 -msgid "Custom Plugin" -msgstr "Prilagojeni vtičnik" +#: superset/views/database/forms.py:99 superset/views/database/forms.py:253 +#: superset/views/database/forms.py:389 +msgid "Table name cannot contain a schema" +msgstr "Ime tabele ne sme vsebovati sheme" -#: superset/views/dynamic_plugins.py:58 -msgid "Custom Plugins" -msgstr "Prilagojeni vtičniki" +#: superset/views/database/forms.py:104 +msgid "CSV File" +msgstr "CSV datoteka" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:283 -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:226 -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:229 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:440 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:443 -msgid "Custom SQL" -msgstr "Prilagojen SQL" +#: superset/views/database/forms.py:105 +msgid "Select a CSV file to be uploaded to a database." +msgstr "Izberite CSV datoteko, ki bo naložena v podatkovno bazo." -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:222 -msgid "Custom SQL ad-hoc filters are not available for the native Druid connector" -msgstr "Ad-hoc SQL filtri po meri niso na voljo za nativni konektor za Druid" +#: superset/views/database/forms.py:114 superset/views/database/forms.py:268 +#: superset/views/database/forms.py:406 +#, python-format +msgid "Only the following file extensions are allowed: %(allowed_extensions)s" +msgstr "Dovoljene so le naslednje končnice: %(allowed_extensions)s" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:432 -msgid "Custom SQL ad-hoc metrics are not available for the native Druid connector" -msgstr "Ad-hoc SQL mere po meri niso na voljo za nativni konektor za Druid" +#: superset/views/database/forms.py:130 superset/views/database/forms.py:292 +#: superset/views/database/forms.py:423 +msgid "Specify a schema (if database flavor supports this)." +msgstr "Podajte shemo (če vrsta podatkovne baze to podpira)" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:435 -msgid "Custom SQL ad-hoc metrics are not enabled for this dataset" -msgstr "Ad-hoc SQL mere po meri za ta podatkovni set niso omogočene" +#: superset/views/database/forms.py:135 +msgid "Delimiter" +msgstr "Ločilnik" -#: superset-frontend/src/filters/components/Time/index.ts:28 -msgid "Custom time filter plugin" -msgstr "Prilagojeni vtičnik za časovni filter" +#: superset/views/database/forms.py:136 +msgid "Delimiter used by CSV file (for whitespace use \\s+)." +msgstr "Ločilnik, uporabljen v CSV datoteki (za presledek uporabi \\s+)." -#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:417 -msgid "Customize" -msgstr "Prilagodi" +#: superset/views/database/forms.py:141 superset/views/database/forms.py:297 +#: superset/views/database/forms.py:428 +msgid "Table Exists" +msgstr "Tabela obstaja" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:167 -msgid "Customize Metrics" -msgstr "Prilagodi mere" +#: superset/views/database/forms.py:142 superset/views/database/forms.py:298 +#: superset/views/database/forms.py:429 +msgid "" +"If table exists do one of the following: Fail (do nothing), Replace (drop and " +"recreate table) or Append (insert data)." +msgstr "" +"Če tabela obstaja, naredite nekaj od sledečega: Prekini (ne naredi nič), Zamenjaj " +"(zbriši in ponovno ustvari tabelo) ali Dodaj (vstavi podatke)." -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:453 -msgid "Customize columns" -msgstr "Prilagodi stolpce" +#: superset/views/database/forms.py:148 superset/views/database/forms.py:304 +#: superset/views/database/forms.py:435 +msgid "Fail" +msgstr "Prekini" -#: superset/connectors/sqla/views.py:261 -msgid "D3 Format" -msgstr "D3 zapis" +#: superset/views/database/forms.py:149 superset/views/database/forms.py:305 +#: superset/views/database/forms.py:436 +msgid "Replace" +msgstr "Zamenjaj" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:58 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:69 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1060 -msgid "D3 format" -msgstr "D3 format" +#: superset/views/database/forms.py:150 superset/views/database/forms.py:306 +#: superset/views/database/forms.py:437 +msgid "Append" +msgstr "Dodaj" -#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:22 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:150 -msgid "D3 format syntax: https://github.com/d3/d3-format" -msgstr "Sintaksa D3 formata: https://github.com/d3/d3-format" +#: superset/views/database/forms.py:155 superset/views/database/forms.py:311 +msgid "Header Row" +msgstr "Naslovna vrstica" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:154 +#: superset/views/database/forms.py:156 superset/views/database/forms.py:312 msgid "" -"D3 number format for numbers between -1.0 and 1.0, useful when you want " -"to have different siginificant digits for small and large numbers" +"Row containing the headers to use as column names (0 is first line of data). " +"Leave empty if there is no header row." msgstr "" -"D3 oblika zapisa za števila med -1.0 in 1.0. Uporabno, če želite različno" -" število števk za majhna in velika števila" +"Vrstica z naslovi, ki se uporabi za imena stolpcev (0 je prva vrstica podatkov). " +"Pustite prazno, če ni naslovne vrstice." -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:220 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:377 -msgid "D3 time format for datetime columns" -msgstr "D3 oblika zapisa za časovne stolpce" - -#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:44 -msgid "D3 time format syntax: https://github.com/d3/d3-time-format" -msgstr "Sintaksa D3 časovnega formata:: https://github.com/d3/d3-time-format" +#: superset/views/database/forms.py:165 superset/views/database/forms.py:321 +msgid "Index Column" +msgstr "Indeksni stolpec" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:102 -msgid "DEC" -msgstr "DEC" +#: superset/views/database/forms.py:166 superset/views/database/forms.py:322 +msgid "" +"Column to use as the row labels of the dataframe. Leave empty if no index column." +msgstr "" +"Stolpec, ki se uporabi za naslove vrstic v dataframe-u. Pustite prazno, če ni " +"indeksnega stolpca." -#: superset-frontend/src/components/DeleteModal/index.tsx:69 -msgid "DELETE" -msgstr "IZBRIŠI" +#: superset/views/database/forms.py:174 superset/views/database/forms.py:330 +msgid "Mangle Duplicate Columns" +msgstr "Odstrani podvojene stolpce" -#: superset-frontend/src/components/ReportModal/index.tsx:345 -msgid "DESCRIPTION ERROR" -msgstr "NAPAKA OPISA" +#: superset/views/database/forms.py:175 superset/views/database/forms.py:331 +msgid "Specify duplicate columns as \"X.0, X.1\"." +msgstr "Določite podvojene stolpce kot \"X.0, X.1\"." -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:259 -msgid "DML" -msgstr "DML" +#: superset/views/database/forms.py:178 superset/views/database/forms.py:442 +msgid "Use Columns" +msgstr "Uporabi stolpce" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:31 -msgid "Dark mode" -msgstr "Temni način" +#: superset/views/database/forms.py:180 superset/views/database/forms.py:444 +msgid "" +"Json list of the column names that should be read. If not None, only these " +"columns will be read from the file." +msgstr "" +"JSON seznam imen stolpcev, ki morajo biti prebrani. Če ni prazen, bodo iz " +"datoteke prebrani le ti stolpci." -#: superset-frontend/src/components/Menu/MenuRight.tsx:46 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1296 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1317 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:582 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:210 -#: superset/templates/appbuilder/navbar_right.html:40 -#: superset/views/dashboard/mixin.py:78 superset/views/dashboard/views.py:155 -#: superset/views/schedules.py:236 -msgid "Dashboard" -msgstr "Nadzorna plošča" +#: superset/views/database/forms.py:187 +msgid "Skip Initial Space" +msgstr "Izpusti začetni presledek" -#: superset/initialization/__init__.py:444 -msgid "Dashboard Emails" -msgstr "E-pošta za nadzorno ploščo" +#: superset/views/database/forms.py:187 +msgid "Skip spaces after delimiter." +msgstr "Izpusti presledek za ločilnikom." -#: superset/views/core.py:1028 -msgid "Dashboard [{}] just got created and chart [{}] was added to it" -msgstr "Nadzorna plošča [{}] je bila ravno ustvarjena in grafikon [{}] dodan nanjo" +#: superset/views/database/forms.py:190 superset/views/database/forms.py:334 +msgid "Skip Rows" +msgstr "Izpusti vrstice" -#: superset/dashboards/commands/exceptions.py:54 -msgid "Dashboard could not be created." -msgstr "Nadzorne plošče ni mogoče ustvariti." +#: superset/views/database/forms.py:191 superset/views/database/forms.py:335 +msgid "Number of rows to skip at start of file." +msgstr "Število vrstic, ki se izpustijo na začetku datoteke." -#: superset/dashboards/commands/exceptions.py:70 -msgid "Dashboard could not be deleted." -msgstr "Nadzorne plošče ni mogoče izbrisati." +#: superset/views/database/forms.py:196 superset/views/database/forms.py:340 +msgid "Rows to Read" +msgstr "Vrstice za branje" -#: superset/dashboards/commands/exceptions.py:66 -msgid "Dashboard could not be updated." -msgstr "Nadzorne plošče ni mogoče posodobiti." +#: superset/views/database/forms.py:197 superset/views/database/forms.py:341 +msgid "Number of rows of file to read." +msgstr "Število vrstic v datoteki za branje." -#: superset/reports/commands/exceptions.py:44 -msgid "Dashboard does not exist" -msgstr "Nadzorna plošča ne obstaja" +#: superset/views/database/forms.py:202 +msgid "Skip Blank Lines" +msgstr "Izpusti prazne vrstice" -#: superset/dashboards/commands/exceptions.py:43 -msgid "Dashboard parameters are invalid." -msgstr "Parametri nadzorne plošče so neveljavni." +#: superset/views/database/forms.py:203 +msgid "Skip blank lines rather than interpreting them as NaN values." +msgstr "Raje izpusti prazne vrstice, kot pa da so prepoznane kot NaN vrednosti." -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:464 -msgid "Dashboard properties" -msgstr "Lastnosti nadzorne plošče" +#: superset/views/database/forms.py:206 superset/views/database/forms.py:346 +msgid "Parse Dates" +msgstr "Prepoznaj datume" -#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:153 -#, fuzzy -msgid "Dashboard scheme" -msgstr "[ime nadzorne plošče]" +#: superset/views/database/forms.py:207 superset/views/database/forms.py:347 +msgid "A comma separated list of columns that should be parsed as dates." +msgstr "Z vejico ločen seznam stolpcev, v katerih bodo prepoznani datumi." -#: superset-frontend/src/profile/components/CreatedContent.tsx:73 -#: superset-frontend/src/profile/components/Favorites.tsx:74 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:609 -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:294 -#: superset/initialization/__init__.py:238 superset/views/chart/mixin.py:79 -#: superset/views/dashboard/mixin.py:25 -msgid "Dashboards" -msgstr "Nadzorne plošče" +#: superset/views/database/forms.py:213 +msgid "Infer Datetime Format" +msgstr "Prepoznaj obliko datuma/časa" -#: superset/dashboards/commands/exceptions.py:58 -msgid "Dashboards could not be deleted." -msgstr "Nadzornih plošč ni mogoče izbrisati." +#: superset/views/database/forms.py:214 +msgid "Use Pandas to interpret the datetime format automatically." +msgstr "Uporabi Pandas za samodejno prepoznavo oblike datumov/časov." -#: superset/charts/commands/exceptions.py:91 -msgid "Dashboards do not exist" -msgstr "Nadzorna plošča ne obstaja" +#: superset/views/database/forms.py:217 superset/views/database/forms.py:353 +msgid "Decimal Character" +msgstr "Decimalno ločilo" -#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:401 -#: superset-frontend/src/explore/components/DataTablesPane/index.tsx:388 -#: superset-frontend/src/views/CRUD/data/common.ts:22 -#: superset/initialization/__init__.py:354 -#: superset/initialization/__init__.py:363 -#: superset/initialization/__init__.py:373 -#: superset/initialization/__init__.py:387 -#: superset/initialization/__init__.py:404 -#: superset/initialization/__init__.py:509 -#: superset/initialization/__init__.py:519 -#: superset/initialization/__init__.py:532 -#: superset/initialization/__init__.py:545 -msgid "Data" -msgstr "Podatki" +#: superset/views/database/forms.py:219 superset/views/database/forms.py:355 +msgid "Character to interpret as decimal point." +msgstr "Znak, ki bo prepoznan kot decimalno ločilo." -#: superset/connectors/druid/views.py:343 -msgid "Data Source" -msgstr "Podatkovni vir" +#: superset/views/database/forms.py:224 superset/views/database/forms.py:360 +#: superset/views/database/forms.py:451 +msgid "Dataframe Index" +msgstr "Indeks dataframe-a" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:57 -msgid "Data Table" -msgstr "Tabela podatkov" +#: superset/views/database/forms.py:224 superset/views/database/forms.py:360 +#: superset/views/database/forms.py:451 +msgid "Write dataframe index as a column." +msgstr "Zapiši indeks dataframe-a kot stolpec." -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:290 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:181 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:142 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:122 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:139 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:197 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:200 -msgid "Data Zoom" -msgstr "Zoom funkcija" +#: superset/views/database/forms.py:227 superset/views/database/forms.py:363 +#: superset/views/database/forms.py:454 +msgid "Column Label(s)" +msgstr "Naslovi stolpcev" -#: superset/views/core.py:2313 +#: superset/views/database/forms.py:228 superset/views/database/forms.py:364 +#: superset/views/database/forms.py:455 msgid "" -"Data could not be deserialized from the results backend. The storage " -"format might have changed, rendering the old data stake. You need to re-" -"run the original query." +"Column label for index column(s). If None is given and Dataframe Index is True, " +"Index Names are used." msgstr "" -"Podatkov ni bilo mogoče deserializirati iz zalednega sistema rezultatov. " -"Lahko je prišlo do spremembe oblike zapisa. Ponovno zaženite izvorno " -"poizvedbo." +"Naslovi stolpcev za indeksne stolpce. Če le-ti niso podani in indeksi Dataframe-a " +"obstajajo, se uporabijo imena indeksov." + +#: superset/views/database/forms.py:236 superset/views/database/forms.py:372 +msgid "Null values" +msgstr "Prazne (Null) vrednosti" -#: superset/views/core.py:2266 +#: superset/views/database/forms.py:238 superset/views/database/forms.py:374 msgid "" -"Data could not be retrieved from the results backend. You need to re-run " -"the original query." +"Json list of the values that should be treated as null. Examples: [\"\"], [\"None" +"\", \"N/A\"], [\"nan\", \"null\"]. Warning: Hive database supports only single " +"value. Use [\"\"] for empty string." msgstr "" -"Podatkov ni bilo mogoče pridobiti iz zalednega sistema rezultatov. " -"Ponovno morate zagnati izvorno poizvedbo." +"JSON seznam vrednosti, ki naj bodo obravnavane kot prazne (Null). Primeri: " +"[\"\"], [\"None\", \"N/A\"], [\"nan\", \"null\"]. Opozorilo: Podatkovna baza Hive " +"podpira le eno vrednost. Uporabite [\"\"] za prazen znakovni niz." -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:219 -msgid "Data preview" -msgstr "Ogled podatkov" +#: superset/views/database/forms.py:250 +msgid "Name of table to be created from excel data." +msgstr "Ime tabele, ki bo ustvarjena iz Excel-ovih podatkov." -#: superset-frontend/src/dashboard/components/AddSliceCard.jsx:136 -msgid "Data source" -msgstr "Podatkovni vir" +#: superset/views/database/forms.py:258 +msgid "Excel File" +msgstr "Excel-ova datoteka" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:213 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:216 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:284 -msgid "Data type" -msgstr "Tip podatka" +#: superset/views/database/forms.py:259 +msgid "Select a Excel file to be uploaded to a database." +msgstr "Izberite Excel-ovo datoteko, ki bo naložena v podatkovno bazo." -#: superset/utils/pandas_postprocessing.py:832 -msgid "DataFrame include at least one series" -msgstr "DataFrame vsebuje vsaj eno serijo" +#: superset/views/database/forms.py:278 +msgid "Sheet Name" +msgstr "Ime zvezka" -#: superset/utils/pandas_postprocessing.py:830 -msgid "DataFrame must include temporal column" -msgstr "DataFrame mora vsebovati časovni stolpec" +#: superset/views/database/forms.py:279 +msgid "Strings used for sheet names (default is the first sheet)." +msgstr "" +"Znakovni nizi uporabljeni za imena preglednic (privzeto je prva preglednica)." -#: superset-frontend/src/components/DatabaseSelector/index.tsx:271 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1127 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1132 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:179 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:223 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:294 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:436 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:223 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:331 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:277 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:424 -#: superset/connectors/sqla/views.py:490 superset/connectors/sqla/views.py:491 -#: superset/templates/superset/import_dashboards.html:53 -#: superset/views/database/forms.py:120 superset/views/database/forms.py:279 -#: superset/views/database/forms.py:407 superset/views/database/mixins.py:191 -#: superset/views/sql_lab.py:70 -msgid "Database" -msgstr "Podatkovna baza" +#: superset/views/database/forms.py:386 +msgid "Name of table to be created from columnar data." +msgstr "Ime tabele, ki bo ustvarjena iz podatkov v stolpcih." -#: superset/views/database/views.py:452 -#, python-format +#: superset/views/database/forms.py:394 +msgid "Columnar File" +msgstr "Stoplčna datoteka" + +#: superset/views/database/forms.py:395 +msgid "Select a Columnar file to be uploaded to a database." +msgstr "Izberite stolpčno datoteko, ki bo naložena v podatkovno bazo." + +#: superset/views/database/mixins.py:34 +msgid "Show Database" +msgstr "Prikaži podatkovno bazo" + +#: superset/views/database/mixins.py:35 +msgid "Add Database" +msgstr "Dodaj podatkovno bazo" + +#: superset/views/database/mixins.py:36 +msgid "Edit Database" +msgstr "Uredi podatkovno bazo" + +#: superset/views/database/mixins.py:104 +msgid "Expose this DB in SQL Lab" +msgstr "Uporabi to podatkovno bazo v SQL laboratoriju" + +#: superset/views/database/mixins.py:105 msgid "" -"Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed " -"for columnar uploads. Please contact your Superset Admin." +"Operate the database in asynchronous mode, meaning that the queries are executed " +"on remote workers as opposed to on the web server itself. This assumes that you " +"have a Celery worker setup as well as a results backend. Refer to the " +"installation docs for more information." msgstr "" -"Shema \"%(schema_name)s\" podatkovne baze \"%(database_name)s\" ni " -"dovoljena za nalaganje stolpčnih datotek. Kontaktirajte administratorja " -"za Superset." +"Upravljanje podatkovne baze v asinhronem načinu pomeni, da se poizvedbe zaženejo " +"na oddaljenih »delavcih« in ne na samem spletnem strežniku. S tem je " +"predpostavljeno, da imate nastavljenega »delavca« za Celery in zaledni sistem za " +"rezultate. Več informacij je v navodilih za namestitev." -#: superset/views/database/views.py:136 -#, python-format +#: superset/views/database/mixins.py:113 +msgid "Allow CREATE TABLE AS option in SQL Lab" +msgstr "Dovoli opcijo CREATE TABLE AS v SQL laboratoriju" + +#: superset/views/database/mixins.py:114 +msgid "Allow CREATE VIEW AS option in SQL Lab" +msgstr "Dovoli opcijo CREATE VIEW AS v SQL laboratoriju" + +#: superset/views/database/mixins.py:115 msgid "" -"Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed " -"for csv uploads. Please contact your Superset Admin." +"Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in SQL Lab" msgstr "" -"Shema \"%(schema_name)s\" podatkovne baze \"%(database_name)s\" ni " -"dovoljena za nalaganje CSV. Kontaktirajte administratorja za Superset." +"Dovoli uporabnikom poganjanje ne-SELECT stavkov (UPDATE, DELETE, CREATE, ...) v " +"SQL laboratoriju" -#: superset/views/database/views.py:283 -#, python-format +#: superset/views/database/mixins.py:120 msgid "" -"Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed " -"for excel uploads. Please contact your Superset Admin." +"When allowing CREATE TABLE AS option in SQL Lab, this option forces the table to " +"be created in this schema" msgstr "" -"Shema \"%(schema_name)s\" podatkovne baze \"%(database_name)s\" ni " -"dovoljena za nalaganje Excel datotek. Kontaktirajte administratorja za " -"Superset." +"Z dovolitvijo opcije CREATE TABLE AS v SQL laboratoriju se tabele ustvarjajo s to " +"shemo" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:910 -#, fuzzy -msgid "Database Creation Error" -msgstr "Napaka podatkovne baze" +#: superset/views/database/mixins.py:166 +msgid "" +"If Presto, all the queries in SQL Lab are going to be executed as the currently " +"logged on user who must have permission to run them.<br/>If Hive and hive.server2." +"enable.doAs is enabled, will run the queries as service account, but impersonate " +"the currently logged on user via hive.server2.proxy.user property." +msgstr "" +"V primeru Presto se vse poizvedbe v SQL laboratoriju zaženejo pod trenutno " +"prijavljenim uporabnikom, ki mora imeti pravice za poganjanje.<br/>Če je omogočen " +"Hive in hive.server2.enable.doAs, poizvedbe tečejo pod servisnim računom, vendar " +"je trenutno prijavljen uporabnik predstavljen z lastnostjo hive.server2.proxy." +"user." -#: superset/views/access_requests.py:43 -msgid "Database URL" -msgstr "URL podatkovne baze" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:161 +#: superset/views/database/mixins.py:173 +msgid "" +"Allow SQL Lab to fetch a list of all tables and all views across all database " +"schemas. For large data warehouse with thousands of tables, this can be expensive " +"and put strain on the system." +msgstr "" +"Dovoli SQL laboratoriju, da pridobi seznam vseh tabel in pogledov iz vseh shem " +"podatkovne baze. Pri velikih podatkovnih skladiščih s tisoči tabel je to lahko " +"potratno in obremeni sistem." -#: superset/databases/commands/exceptions.py:95 -msgid "Database could not be created." -msgstr "Podatkovne baze ni mogoče ustvariti." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:245 +#: superset/views/database/mixins.py:178 +msgid "" +"Duration (in seconds) of the caching timeout for charts of this database. A " +"timeout of 0 indicates that the cache never expires. Note this defaults to the " +"global timeout if undefined." +msgstr "" +"Trajanje (v sekundah) predpomnjenja za grafikon v tej podatkovni bazi. Vrednost 0 " +"označuje, da predpomnilnik nikoli ne poteče. V primeru, da ni definirano, ima " +"globalno nastavitev." -#: superset/databases/commands/exceptions.py:113 -msgid "Database could not be deleted." -msgstr "Podatkovne baze ni mogoče izbrisati." +#: superset/views/database/mixins.py:183 +msgid "If selected, please set the schemas allowed for csv upload in Extra." +msgstr "Če je izbrano, nastavite dovoljene sheme za nalaganje CSV v Dodatno." -#: superset/databases/commands/exceptions.py:99 -msgid "Database could not be updated." -msgstr "Podatkovne baze ni mogoče posodobiti." +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:338 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:444 +#: superset/views/database/mixins.py:189 +msgid "Expose in SQL Lab" +msgstr "Uporabi v SQL laboratoriju" -#: superset/errors.py:117 -msgid "Database does not allow data manipulation." -msgstr "Podatkovna baza ne dovoljuje manipulacije podatkov." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:95 +#: superset/views/database/mixins.py:190 +msgid "Allow CREATE TABLE AS" +msgstr "Dovoli CREATE TABLE AS" -#: superset/charts/commands/exceptions.py:82 -#: superset/datasets/commands/exceptions.py:41 -#: superset/reports/commands/exceptions.py:35 -msgid "Database does not exist" -msgstr "Podatkovna baza ne obstaja" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:109 +#: superset/views/database/mixins.py:191 +msgid "Allow CREATE VIEW AS" +msgstr "Dovoli CREATE VIEW AS" -#: superset/connectors/sqla/models.py:1478 -msgid "Database does not support subqueries" -msgstr "Podatkovna baza ne podpira podpoizvedb" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:142 +#: superset/views/database/mixins.py:192 +msgid "Allow DML" +msgstr "Dovoli DML" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:688 -msgid "Database error" -msgstr "Napaka podatkovne baze" +#: superset/views/database/mixins.py:193 +msgid "CTAS Schema" +msgstr "CTAS shema" -#: superset/databases/commands/validate.py:136 -msgid "Database is offline." -msgstr "Podatkovna baza ni povezana." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:74 +#: superset/views/database/mixins.py:197 +msgid "SQLAlchemy URI" +msgstr "SQLAlchemy URI" -#: superset/reports/commands/exceptions.py:62 -msgid "Database is required for alerts" -msgstr "Podatkovna baza je obvezna za opozorila" +#: superset/views/database/mixins.py:198 +msgid "Chart Cache Timeout" +msgstr "Trajanje predpomnilnika grafikona" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:89 -#: superset/db_engine_specs/base.py:1396 -msgid "Database name" -msgstr "Ime podatkovne baze" +#: superset/views/database/mixins.py:200 +msgid "Secure Extra" +msgstr "Dodatna varnost" -#: superset/datasets/commands/exceptions.py:50 -msgid "Database not allowed to change" -msgstr "Podatkovne baze ni dovoljeno spreminjati" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:369 +#: superset/views/database/mixins.py:201 +msgid "Root certificate" +msgstr "Korenski certifikat" -#: superset/databases/commands/exceptions.py:91 -msgid "Database not found." -msgstr "Podatkovna baza ni najdena." +#: superset/views/database/mixins.py:202 +msgid "Async Execution" +msgstr "Asinhrono izvajanje" -#: superset/databases/commands/exceptions.py:32 -msgid "Database parameters are invalid." -msgstr "Parametri podatkovne baze so neveljavni." - -#: superset/db_engine_specs/base.py:1393 -msgid "Database port" -msgstr "Vrata podatkovne baze" +#: superset/views/database/mixins.py:203 +msgid "Impersonate the logged on user" +msgstr "Predstavljaj se kot prijavljeni uporabnik" -#: superset-frontend/src/profile/components/Security.tsx:46 -#: superset-frontend/src/views/CRUD/data/common.ts:26 -#: superset/initialization/__init__.py:351 superset/views/database/mixins.py:33 -msgid "Databases" -msgstr "Podatkovne baze" +#: superset/views/database/mixins.py:204 +msgid "Allow Csv Upload" +msgstr "Dovoli nalaganje CSV" -#: superset/views/database/forms.py:221 superset/views/database/forms.py:354 -#: superset/views/database/forms.py:442 -msgid "Dataframe Index" -msgstr "Indeks dataframe-a" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:158 +#: superset/views/database/mixins.py:206 +msgid "Allow Multi Schema Metadata Fetch" +msgstr "Dovoli pridobivanje metapodatkov z več shemami" -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:284 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx:89 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:833 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:862 -#: superset-frontend/src/explore/components/ExploreViewContainer.jsx:521 -#: superset-frontend/src/explore/controls.jsx:189 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:283 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:520 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:505 -msgid "Dataset" -msgstr "Podatkovni set" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:284 +#: superset/views/database/mixins.py:207 +msgid "Backend" +msgstr "Vrsta" -#: superset/datasets/commands/exceptions.py:32 +#: superset/views/database/mixins.py:247 superset/views/database/mixins.py:271 #, python-format -msgid "Dataset %(name)s already exists" -msgstr "Podatkovni set %(name)s že obstaja" - -#: superset/datasets/columns/commands/exceptions.py:27 -msgid "Dataset column delete failed." -msgstr "Brisanje stolpca podatkovnega seta neuspešno." - -#: superset/datasets/columns/commands/exceptions.py:23 -msgid "Dataset column not found." -msgstr "Stolpec podatkovnega seta ni najden." +msgid "Extra field cannot be decoded by JSON. %(msg)s" +msgstr "Dodatnega polja ni mogoče dekodirati z JSON. %(msg)s" -#: superset/datasets/commands/exceptions.py:157 -msgid "Dataset could not be created." -msgstr "Podatkovnega niza ni mogoče ustvariti." +#: superset/views/database/validators.py:40 +msgid "" +"Invalid connection string, a valid string usually follows:'DRIVER://USER:" +"PASSWORD@DB-HOST/DATABASE-NAME'<p>Example:'postgresql://user:password@your-" +"postgres-db/database'</p>" +msgstr "" +"Neveljaven niz povezave. Veljaven niz običajno sledi zapisu:'DRIVER://USER:" +"PASSWORD@DB-HOST/DATABASE-NAME'<p>Primer:'postgresql://user:password@your-" +"postgres-db/database'</p>" -#: superset/datasets/commands/exceptions.py:165 -msgid "Dataset could not be deleted." -msgstr "Podatkovnega niza ni mogoče izbrisati." +#: superset/views/database/views.py:115 +msgid "CSV to Database configuration" +msgstr "Nastavitve pretvorbe CSV v podatkovno bazo" -#: superset/datasets/commands/exceptions.py:161 -#: superset/datasets/commands/exceptions.py:173 -msgid "Dataset could not be updated." -msgstr "Podatkovnega niza ni mogoče posodobiti." +#: superset/views/database/views.py:133 +#, python-format +msgid "" +"Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for csv " +"uploads. Please contact your Superset Admin." +msgstr "" +"Shema \"%(schema_name)s\" podatkovne baze \"%(database_name)s\" ni dovoljena za " +"nalaganje CSV. Kontaktirajte administratorja za Superset." -#: superset/commands/exceptions.py:119 -#: superset/datasets/commands/exceptions.py:149 -msgid "Dataset does not exist" -msgstr "Podatkovni set ne obstaja" +#: superset/views/database/views.py:226 +#, python-format +msgid "" +"Unable to upload CSV file \"%(filename)s\" to table \"%(table_name)s\" in " +"database \"%(db_name)s\". Error message: %(error_msg)s" +msgstr "" +"CSV datoteke \"%(filename)s\" ni mogoče naložiti v tabelo \"%(table_name)s\" v " +"podatkovni bazi \"%(db_name)s\". Sporočilo napake: %(error_msg)s" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:843 -msgid "Dataset is required" -msgstr "Zahtevan je podatkovni set" +#: superset/views/database/views.py:238 +#, python-format +msgid "" +"CSV file \"%(csv_filename)s\" uploaded to table \"%(table_name)s\" in database " +"\"%(db_name)s\"" +msgstr "" +"CSV datoteka \"%(csv_filename)s\" naložena v tabelo \"%(table_name)s\" v " +"podatkovni bazi \"%(db_name)s\"" -#: superset/datasets/metrics/commands/exceptions.py:27 -msgid "Dataset metric delete failed." -msgstr "Brisanje mere podatkovnega seta ni uspelo." +#: superset/views/database/views.py:254 +msgid "Excel to Database configuration" +msgstr "Nastavitve pretvorbe Excel v Podatkovno bazo" -#: superset/datasets/metrics/commands/exceptions.py:23 -msgid "Dataset metric not found." -msgstr "Mer podatkovnega seta ni najdena." +#: superset/views/database/views.py:269 +#, python-format +msgid "" +"Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for " +"excel uploads. Please contact your Superset Admin." +msgstr "" +"Shema \"%(schema_name)s\" podatkovne baze \"%(database_name)s\" ni dovoljena za " +"nalaganje Excel datotek. Kontaktirajte administratorja za Superset." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:881 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:888 -msgid "Dataset name" -msgstr "Ime podatkovnega seta" +#: superset/views/database/views.py:363 +#, python-format +msgid "" +"Unable to upload Excel file \"%(filename)s\" to table \"%(table_name)s\" in " +"database \"%(db_name)s\". Error message: %(error_msg)s" +msgstr "" +"Excel datoteke \"%(filename)s\" ni mogoče naložiti v tabelo \"%(table_name)s\" v " +"podatkovni bazi \"%(db_name)s\". Sporočilo napake: %(error_msg)s" -#: superset/datasets/commands/exceptions.py:153 -msgid "Dataset parameters are invalid." -msgstr "Parametri podatkovnega seta so neveljavni." +#: superset/views/database/views.py:375 +#, python-format +msgid "" +"Excel file \"%(excel_filename)s\" uploaded to table \"%(table_name)s\" in " +"database \"%(db_name)s\"" +msgstr "" +"Excel datoteka \"%(excel_filename)s\" naložena v tabelo \"%(table_name)s\" v " +"podatkovni bazi \"%(db_name)s\"" -#: superset/datasets/commands/exceptions.py:169 -msgid "Dataset(s) could not be bulk deleted." -msgstr "Podatkovnih nizov ni mogoče množično izbrisati." +#: superset/views/database/views.py:391 +msgid "Columnar to Database configuration" +msgstr "Nastavitve pretvorbe Stolpci v Podatkovno bazo" -#: superset-frontend/src/profile/components/Security.tsx:60 -#: superset-frontend/src/views/CRUD/data/common.ts:32 -#: superset/initialization/__init__.py:359 -msgid "Datasets" -msgstr "Podatkovni seti" +#: superset/views/database/views.py:416 +msgid "" +"Multiple file extensions are not allowed for columnar uploads. Please make sure " +"all files are of the same extension." +msgstr "" +"Za nalaganje stolpčnih datotek niso dovoljene različne končnice. Poskrbite, da " +"imajo vse datoteke enake končnice." -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:809 -msgid "Datasets do not contain a temporal column" -msgstr "Podatkovni seti ne vsebujejo časovnega stolpca" +#: superset/views/database/views.py:429 +#, python-format +msgid "" +"Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for " +"columnar uploads. Please contact your Superset Admin." +msgstr "" +"Shema \"%(schema_name)s\" podatkovne baze \"%(database_name)s\" ni dovoljena za " +"nalaganje stolpčnih datotek. Kontaktirajte administratorja za Superset." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:157 -#: superset/connectors/druid/views.py:93 superset/views/access_requests.py:44 -#: superset/views/chart/mixin.py:80 -msgid "Datasource" -msgstr "Podatkovni vir" +#: superset/views/database/views.py:504 +#, python-format +msgid "" +"Unable to upload Columnar file \"%(filename)s\" to table \"%(table_name)s\" in " +"database \"%(db_name)s\". Error message: %(error_msg)s" +msgstr "" +"Stolpčne datoteke \"%(filename)s\" ni mogoče naložiti v tabelo \"%(table_name)s\" " +"v podatkovni bazi \"%(db_name)s\". Sporočilo napake: %(error_msg)s" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:48 -msgid "Datasource & Chart Type" -msgstr "Tip podatkovnega vira in grafikona" +#: superset/views/database/views.py:516 +#, python-format +msgid "" +"Columnar file \"%(columnar_filename)s\" uploaded to table \"%(table_name)s\" in " +"database \"%(db_name)s\"" +msgstr "" +"Stolpčna datoteka \"%(columnar_filename)s\" naložena v tabelo \"%(table_name)s\" " +"v podatkovni bazi \"%(db_name)s\"" -#: superset/connectors/druid/views.py:352 -msgid "Datasource Name" -msgstr "Ime podatkovnega vira" +#: superset/views/datasource/views.py:71 +msgid "Request missing data field." +msgstr "Zahtevaj manjkajoča podatkovna polja." -#: superset/connectors/connector_registry.py:99 +#: superset/views/datasource/views.py:105 #, python-format -msgid "Datasource id not found: %(id)s" -msgstr "ID podatkovnega vira ni bil najden: %(id)s" +msgid "Duplicate column name(s): %(columns)s" +msgstr "Podvojena imena stolpcev: %(columns)s" -#: superset/charts/commands/exceptions.py:101 -msgid "Datasource type is required when datasource_id is given" -msgstr "Ko se podaja datasource_id, je potreben tip podatkovnega vira" +#: superset/views/log/__init__.py:21 +msgid "Logs" +msgstr "Dnevniki" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:163 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:87 -msgid "Date Time Format" -msgstr "Oblika zapisa Datum-Časa" +#: superset/views/log/__init__.py:22 +msgid "Show Log" +msgstr "Prikaži dnevnik" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:79 -msgid "Date filter" -msgstr "Filter po datumu" +#: superset/views/log/__init__.py:23 +msgid "Add Log" +msgstr "Dodaj dnevnik" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:142 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:115 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:136 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:153 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:129 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:216 -msgid "Date format" -msgstr "Oblika zapisa datuma" +#: superset/views/log/__init__.py:24 +msgid "Edit Log" +msgstr "Uredi dnevnik" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:235 -msgid "Date/Time" -msgstr "Datum/Čas" +#: superset/views/log/__init__.py:31 +msgid "Action" +msgstr "Aktivnost" -#: superset/connectors/sqla/views.py:151 -msgid "Datetime Format" -msgstr "Oblika zapisa datuma,časa" +#: superset/views/log/__init__.py:32 +msgid "dttm" +msgstr "dttm" -#: superset/connectors/sqla/models.py:1062 -msgid "" -"Datetime column not provided as part table configuration and is required " -"by this type of chart" -msgstr "" -"Stolpec datum-čas ni podan kot del tabele, čeprav mora biti za ta tip " -"grafikona" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1095 +#: superset/views/log/__init__.py:33 +msgid "JSON" +msgstr "JSON" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:227 -msgid "Datetime format" -msgstr "Oblika datum-časa" +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:31 +msgid "Time Range" +msgstr "Časovno obdobje" -#: superset/db_engine_specs/base.py:96 -msgid "Day" -msgstr "Dan" +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:32 +msgid "Time Column" +msgstr "Časovni stolpec" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:66 -#, fuzzy, python-format -msgid "Days %s" -msgstr "Pretečeno %s" +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:33 +msgid "Time Grain" +msgstr "Granulacija časa" -#: superset/connectors/sqla/models.py:1593 -msgid "Db engine did not return all queried columns" -msgstr "Sitem podatkovne baze ni vrnil vse stolpcev poizvedbe" +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:34 +#: superset-frontend/src/explore/constants.ts:122 +msgid "Origin" +msgstr "Izhodišče" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:77 -msgid "December" -msgstr "December" +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:35 +msgid "Time Granularity" +msgstr "Granulacija časa" -#: superset/views/database/forms.py:214 superset/views/database/forms.py:347 -msgid "Decimal Character" -msgstr "Decimalno ločilo" +# SUPERSET UI +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:39 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:26 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:52 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:39 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:37 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:29 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:79 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:87 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:74 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:73 +#: superset-frontend/src/explore/controlPanels/sections.tsx:25 +#: superset-frontend/src/explore/controlPanels/sections.tsx:75 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:182 +msgid "Time" +msgstr "Čas" -#: superset/viz.py:2706 -msgid "Deck.gl - 3D Grid" -msgstr "Deck.gl - 3D mreža" +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:46 +#: superset-frontend/src/explore/controls.jsx:113 +msgid "A reference to the [Time] configuration, taking granularity into account" +msgstr "Sklic na nastavitve za [Čas], ki upošteva granulacijo" -#: superset/viz.py:2822 -msgid "Deck.gl - 3D HEX" -msgstr "Deck.gl - 3D HEX" +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:58 +msgid "Aggregate" +msgstr "Agregacija" -#: superset/viz.py:2862 -msgid "Deck.gl - Arc" -msgstr "Deck.gl - Arc" +#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:59 +msgid "Raw records" +msgstr "Surovi podatki" -#: superset/viz.py:2843 -msgid "Deck.gl - GeoJSON" -msgstr "Deck.gl - GeoJSON" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/CertifiedIconWithTooltip.tsx:46 +#: superset-frontend/src/components/CertifiedBadge/index.tsx:44 +#, python-format +msgid "Certified by %s" +msgstr "Certificiral/a %s" -#: superset/viz.py:2431 -msgid "Deck.gl - Multiple Layers" -msgstr "Deck.gl - Večplastni" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ControlHeader.tsx:64 +#: superset-frontend/src/explore/components/ControlHeader.tsx:82 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:327 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:262 +msgid "description" +msgstr "opis" -#: superset/viz.py:2738 -msgid "Deck.gl - Paths" -msgstr "Deck.gl - Poti" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ControlHeader.tsx:74 +#: superset-frontend/src/explore/components/ControlHeader.tsx:92 +msgid "bolt" +msgstr "vijak" -#: superset/viz.py:2789 -msgid "Deck.gl - Polygon" -msgstr "Deck.gl - Poligon" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ControlHeader.tsx:75 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:42 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:57 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:70 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:85 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:100 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:72 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:89 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:103 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:120 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:137 +#: superset-frontend/src/explore/components/ControlHeader.tsx:93 +msgid "Changing this control takes effect instantly" +msgstr "Sprememba tega kontrolnika se odrazi takoj" -#: superset/viz.py:2625 -msgid "Deck.gl - Scatter plot" -msgstr "Deck.gl - Raztreseni graf" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/InfoTooltipWithTrigger.tsx:52 +msgid "Show info tooltip" +msgstr "Prikaži opis orodja" -#: superset/viz.py:2677 -msgid "Deck.gl - Screen Grid" -msgstr "Deck.gl - Mreža" - -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:167 -msgid "Default" -msgstr "Privzeto" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/SQLPopover.tsx:64 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:233 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1198 +msgid "SQL expression" +msgstr "SQL izraz" -#: superset/connectors/druid/views.py:349 superset/connectors/sqla/views.py:495 -msgid "Default Endpoint" -msgstr "Privzeta končna točka" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx:80 +msgid "Column name" +msgstr "Ime stolpca" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:699 -msgid "Default URL" -msgstr "Privzeti URL" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/labelUtils.tsx:108 +msgid "Metric name" +msgstr "Ime mere" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:700 -msgid "Default URL to redirect to when accessing from the dataset list page" -msgstr "" -"Privzeti URL za preusmeritev, ko dostopate iz strani s seznamom " -"podatkovnih setov" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx:53 +msgid "unknown type icon" +msgstr "ikona neznanega tipa" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:907 -msgid "Default Value" -msgstr "Privzeta vrednost" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx:57 +msgid "function type icon" +msgstr "ikona funkcijskega tipa" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:290 -msgid "Default latitude" -msgstr "Privzeta širina" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx:59 +msgid "string type icon" +msgstr "ikona znakovnega tipa" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:276 -msgid "Default longitude" -msgstr "Privzeta dolžina" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx:61 +msgid "numeric type icon" +msgstr "ikona numeričnega tipa" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:91 -msgid "" -"Default minimal column width in pixels, actual width may still be larger " -"than this if other columns don't need much space" -msgstr "" -"Privzeta min. širina stolpca v pikslih. Dejanska širina bo lahko večja, " -"če drugi stolpci ne potrebujejo veliko prostora" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx:63 +msgid "boolean type icon" +msgstr "ikona binarnega tipa" -#: superset-frontend/src/filters/components/Select/controlPanel.ts:105 -msgid "Default to first item" -msgstr "Privzet prvi element" +#: superset-frontend/packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx:65 +msgid "temporal type icon" +msgstr "ikona časovnega tipa" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:936 -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:222 -msgid "Default value is required" -msgstr "Zahtevana je privzeta vrednost" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:25 +#: superset-frontend/src/explore/controlPanels/sections.tsx:127 +msgid "Advanced analytics" +msgstr "Napredna analitika" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:95 -msgid "Default value must be set when \"Filter has default value\" is checked" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:27 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:236 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:119 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:367 +#: superset-frontend/src/explore/controlPanels/sections.tsx:129 +msgid "" +"This section contains options that allow for advanced analytical post processing " +"of query results" msgstr "" -"Privzeta vrednost mora biti določena, če je izbrano \"Filter ima privzeto" -" vrednost\"" +"Ta sekcija vsebuje možnosti, ki omogočajo napredno analitično poprocesiranje " +"rezultatov poizvedb" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:93 -msgid "Default value must be set when \"Required\" is checked" -msgstr "Privzeta vrednost mora biti določena, če je izbrano \"Obvezno\"" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:33 +#: superset-frontend/src/explore/controlPanels/sections.tsx:135 +msgid "Rolling window" +msgstr "Drseče okno" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:89 -msgid "Default value set automatically when \"Default to first item\" is checked" -msgstr "" -"Privzeta vrednost je samodejno izbrana, če je izbrano \"Privzet prvi " -"element\"" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:39 +#: superset-frontend/src/explore/controlPanels/sections.tsx:141 +msgid "Rolling function" +msgstr "Drseča funkcija" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:41 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:242 +#: superset-frontend/plugins/plugin-chart-echarts/src/constants.ts:75 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:124 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx:77 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:120 +msgid "None" +msgstr "Brez" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:44 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:266 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:149 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:167 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:398 -#: superset-frontend/src/explore/controlPanels/sections.tsx:167 -msgid "" -"Defines a rolling window function to apply, works along with the " -"[Periods] text box" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:258 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:141 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:388 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:182 +#: superset-frontend/src/explore/controlPanels/sections.tsx:150 +msgid "" +"Defines a rolling window function to apply, works along with the [Periods] text " +"box" msgstr "Določi funkcijo drsečega okna. Dela skupaj s tekstovnim okvirjem [Obdobja]" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:134 -msgid "Defines how each series is broken down" -msgstr "Določa, kako se vsaka podatkovna serija razčleni" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:56 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:270 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:153 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:400 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:194 +#: superset-frontend/src/explore/controlPanels/sections.tsx:160 +msgid "Periods" +msgstr "Št. period" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:64 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:388 -#: superset-frontend/src/explore/controls.jsx:403 -msgid "" -"Defines the grouping of entities. Each series is shown as a specific " -"color on the chart and has a legend toggle" -msgstr "" -"Določa združevanje entitet. Vsak niz je na grafikonu prikazan z določeno " -"barvo in ima lahko prikazano legendo" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:58 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:272 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:155 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:402 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:196 +#: superset-frontend/src/explore/controlPanels/sections.tsx:162 +msgid "" +"Defines the size of the rolling window function, relative to the time granularity " +"selected" +msgstr "Določi velikost funkcije drsečega okna, glede na izbrano granulacijo časa" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:227 -#: superset-frontend/src/explore/controls.jsx:258 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:80 +#: superset-frontend/src/explore/controlPanels/sections.tsx:172 +msgid "Min periods" +msgstr "Min. št. period" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:82 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:284 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:167 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:416 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:210 +#: superset-frontend/src/explore/controlPanels/sections.tsx:174 +msgid "" +"The minimum number of rolling periods required to show a value. For instance if " +"you do a cumulative sum on 7 days you may want your \"Min Period\" to be 7, so " +"that all data points shown are the total of 7 periods. This will hide the \"ramp " +"up\" taking place over the first 7 periods" +msgstr "" +"Minimalno število drsečih obdobij, potrebnih za prikaz vrednosti. Če računate " +"kumulativno vsoto 7-dnevnega obdobja, boste nastavili \"Min. št. period\" na 7. " +"Tako bodo vse prikazane točke skupaj obsegale 7 obdobij. To bo prikrilo rampo, ki " +"bi trajala prvih 7 obdobij" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:102 +#: superset-frontend/src/explore/controlPanels/sections.tsx:184 +msgid "Time comparison" +msgstr "Časovna primerjava" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:110 +#: superset-frontend/src/explore/controlPanels/sections.tsx:192 +msgid "Time shift" +msgstr "Časovni zamik" + +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:123 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:316 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:199 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:447 +#: superset-frontend/src/explore/controlPanels/sections.tsx:205 msgid "" -"Defines the origin where time buckets start, accepts natural dates as in " -"`now`, `sunday` or `1970-01-01`" +"Overlay one or more timeseries from a relative time period. Expects relative time " +"deltas in natural language (example: 24 hours, 7 days, 52 weeks, 365 days). Free " +"text is supported." msgstr "" -"Določa izhodišče, kadar se začnejo časovni razdelki. Sprejema naravne " -"zapise kot so `zdaj`, `nedelja` ali `1970-01-01`" +"Zamaknite eno ali več časovnih vrst za relativno časovno obdobje. Vnaša se " +"relativne časovne razlike v naravnem jeziku (npr. 24 ur, 7 dni, 52 tednov, 365 " +"dni). Prosto besedilo je podprto." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:58 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:280 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:163 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:181 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:412 -#: superset-frontend/src/explore/controlPanels/sections.tsx:179 -msgid "" -"Defines the size of the rolling window function, relative to the time " -"granularity selected" -msgstr "Določi velikost funkcije drsečega okna, glede na izbrano granulacijo časa" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:137 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:328 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:211 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:461 +#: superset-frontend/src/explore/controlPanels/sections.tsx:217 +msgid "Calculation type" +msgstr "Tip izračuna" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:120 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:145 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:336 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:219 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:469 +#: superset-frontend/src/explore/controlPanels/sections.tsx:225 msgid "" -"Defines whether the step should appear at the beginning, middle or end " -"between two data points" +"How to display time shifts: as individual lines; as the difference between the " +"main time series and each time shift; as the percentage change; or as the ratio " +"between series and time shifts." msgstr "" -"Določa, če se na začetku, na sredini ali na koncu pojavi stopnica med " -"dvema točkama" +"Način prikaza časovnih zamikov: kot samostojne črte; kot razlike med osnovno " +"časovno vrsto in vsakim časovnim zamikom; kot procentualna sprememba; kot " +"razmerje med vrsto in časovnim zamikom." -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:82 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:325 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:497 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:310 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:374 -#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:103 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:369 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:653 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:336 -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:131 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:367 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:622 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:357 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:628 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:508 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:238 -#: superset/views/base.py:595 -msgid "Delete" -msgstr "Izbriši" - -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:481 -#, python-format -msgid "Delete %s?" -msgstr "Izbrišem %s?" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:153 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:344 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:227 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:477 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:220 +#: superset-frontend/src/explore/controlPanels/sections.tsx:233 +msgid "Resample" +msgstr "Prevzorči" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:296 -msgid "Delete Annotation?" -msgstr "Izbrišem oznako?" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:160 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:351 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:234 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:484 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:227 +#: superset-frontend/src/explore/controlPanels/sections.tsx:240 +msgid "Rule" +msgstr "Pravilo" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:453 -msgid "Delete Database?" -msgstr "Izbrišem podatkovno bazo?" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:172 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:361 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:244 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:487 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:239 +#: superset-frontend/src/explore/controlPanels/sections.tsx:243 +msgid "Pandas resample rule" +msgstr "Pravilo za prevzorčenje v Pandas" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:605 -msgid "Delete Dataset?" -msgstr "Izbrišem podatkovni set?" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:182 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:249 +msgid "Fill method" +msgstr "Način polnjenja" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:361 -msgid "Delete Layer?" -msgstr "Izbrišem sloj?" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:194 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:379 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:262 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:507 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:261 +#: superset-frontend/src/explore/controlPanels/sections.tsx:261 +msgid "Pandas resample method" +msgstr "Metoda za prevzorčenje v Pandas" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:485 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:261 -msgid "Delete Query?" -msgstr "Izbrišem poizvedbo?" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/annotationsAndLayers.tsx:25 +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:104 +msgid "Annotations and Layers" +msgstr "Oznake in sloji" -#: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:110 -msgid "Delete Report?" -msgstr "Izbrišem poročilo?" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:29 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:326 +msgid "Chart Title" +msgstr "Naslov grafikona" -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:321 -msgid "Delete Template?" -msgstr "Izbrišem predlogo?" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:33 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:162 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:449 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:69 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:99 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:83 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:97 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:69 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:77 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:90 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:327 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:214 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:330 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:355 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:123 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:140 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:198 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:201 +#: superset-frontend/src/explore/controls.jsx:417 +msgid "X Axis" +msgstr "X os" -#: superset/views/base.py:595 -msgid "Delete all Really?" -msgstr "Ali resnično vse izbrišem?" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:39 +msgid "X Axis Title" +msgstr "Naslov X osi" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:181 -msgid "Delete annotation" -msgstr "Izbriši oznako" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:53 +msgid "X AXIS TITLE BOTTOM MARGIN" +msgstr "SPODNJA OBROBA NASLOVA X OSI" -#: superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:202 -msgid "Delete dashboard tab?" -msgstr "Ali izbrišem zavihek nadzorne plošče?" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:61 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:168 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:456 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:79 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:111 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:115 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:80 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:109 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:256 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:351 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:249 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:332 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:358 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:160 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:176 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:233 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:236 +#: superset-frontend/src/explore/controls.jsx:424 +msgid "Y Axis" +msgstr "Y os" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:332 -msgid "Delete database" -msgstr "Izbriši podatkovno bazo" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:67 +msgid "Y Axis Title" +msgstr "Naslov Y osi" -#: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:78 -msgid "Delete email report" -msgstr "Izbriši e-poštno poročilo" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:81 +msgid "Y AXIS TITLE MARGIN" +msgstr "OBROBA NASLOVA Y OSI" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:404 -msgid "Delete query" -msgstr "Izbriši poizvedbo" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:96 +msgid "Y AXIS TITLE POSITION" +msgstr "POZICIJA NASLOVA Y OSI" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:239 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:219 -msgid "Delete template" -msgstr "Izbriši predlogo" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:36 +msgid "Predictive Analytics" +msgstr "Prediktivna analitika" -#: superset-frontend/src/dashboard/components/MissingChart.jsx:36 -msgid "Delete this container and save to remove this message." -msgstr "Izbrišite ta okvir in shranite za odpravo tega sporočila." +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:44 +msgid "Enable forecast" +msgstr "Omogoči napoved" -#: superset/annotation_layers/annotations/api.py:502 -#, python-format -msgid "Deleted %(num)d annotation" -msgid_plural "Deleted %(num)d annotations" -msgstr[0] "Izbrisana je %(num)d oznaka" -msgstr[1] "Izbrisani sta %(num)d oznaki" -msgstr[2] "Izbrisane so %(num)d oznake" -msgstr[3] "Izbrisanih je %(num)d oznak" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:47 +msgid "Enable forecasting" +msgstr "Omogoči napovedovanje" -#: superset/annotation_layers/api.py:353 -#, python-format -msgid "Deleted %(num)d annotation layer" -msgid_plural "Deleted %(num)d annotation layers" -msgstr[0] "Izbrisan je %(num)d sloj z oznakami" -msgstr[1] "Izbrisana sta %(num)d sloja z oznakami" -msgstr[2] "Izbrisanih so %(num)d sloji z oznakami" -msgstr[3] "Izbrisanih je %(num)d slojev z oznakami" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:56 +msgid "Forecast periods" +msgstr "Periode napovedi" -#: superset/charts/api.py:480 -#, python-format -msgid "Deleted %(num)d chart" -msgid_plural "Deleted %(num)d charts" -msgstr[0] "Izbrisan je %(num)d grafikon" -msgstr[1] "Izbrisana sta %(num)d grafikona" -msgstr[2] "Izbrisani so %(num)d grafikoni" -msgstr[3] "Izbrisanih je %(num)d grafikonov" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:59 +msgid "How many periods into the future do we want to predict" +msgstr "Za koliko period v prihodnosti želite napoved" -#: superset/css_templates/api.py:137 -#, python-format -msgid "Deleted %(num)d css template" -msgid_plural "Deleted %(num)d css templates" -msgstr[0] "Izbrisana %(num)d css predloga" -msgstr[1] "Izbrisani %(num)d css predlogi" -msgstr[2] "Izbrisane %(num)d css predloge" -msgstr[3] "Izbrisanih %(num)d css predlog" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:70 +msgid "Confidence interval" +msgstr "Interval zaupanja" -#: superset/dashboards/api.py:674 -#, python-format -msgid "Deleted %(num)d dashboard" -msgid_plural "Deleted %(num)d dashboards" -msgstr[0] "Izbrisana je %(num)d nadzorna plošča" -msgstr[1] "Izbrisani sta %(num)d nadzorni plošči" -msgstr[2] "Izbrisane so %(num)d nadzorne plošče" -msgstr[3] "Izbrisanih je %(num)d nadzornih plošč" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:73 +msgid "Width of the confidence interval. Should be between 0 and 1" +msgstr "Širina intervala zaupanja. Mora bit med 0 in 1" -#: superset/datasets/api.py:666 -#, python-format -msgid "Deleted %(num)d dataset" -msgid_plural "Deleted %(num)d datasets" -msgstr[0] "Izbrisan %(num)d podatkovni set" -msgstr[1] "Izbrisana %(num)d podatkovna niza" -msgstr[2] "Izbrisani %(num)d podatkovni nizi" -msgstr[3] "Izbrisanih %(num)d podatkovnih nizov" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:92 +msgid "" +"Should yearly seasonality be applied. An integer value will specify Fourier order " +"of seasonality." +msgstr "" +"Če želite letno sezonskost. Celo število določa Fourier-jev red sezonskosti." -#: superset/reports/api.py:452 -#, python-format -msgid "Deleted %(num)d report schedule" -msgid_plural "Deleted %(num)d report schedules" -msgstr[0] "Izbrisan %(num)d urnik poročanja" -msgstr[1] "Izbrisana %(num)d urnika poročanja" -msgstr[2] "Izbrisani %(num)d urniki poročanja" -msgstr[3] "Izbrisanih %(num)d urnikov poročanja" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:111 +msgid "" +"Should weekly seasonality be applied. An integer value will specify Fourier order " +"of seasonality." +msgstr "" +"Če želite tedensko sezonskost. Celo število določa Fourier-jev red sezonskosti." -#: superset/queries/saved_queries/api.py:197 -#, python-format -msgid "Deleted %(num)d saved query" -msgid_plural "Deleted %(num)d saved queries" -msgstr[0] "Izbrisana %(num)d shranjena poizvedba" -msgstr[1] "Izbrisani %(num)d shranjeni poizvedbi" -msgstr[2] "Izbrisane %(num)d shranjene poizvedbe" -msgstr[3] "Izbrisanih %(num)d shranjenih poizvedb" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:130 +msgid "" +"Should daily seasonality be applied. An integer value will specify Fourier order " +"of seasonality." +msgstr "" +"Če želite dnevno sezonskost. Celo število določa Fourier-jev red sezonskosti." -#: superset-frontend/src/reports/actions/reports.js:176 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:162 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:103 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:91 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:93 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:142 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:546 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:232 -#: superset-frontend/src/views/CRUD/utils.tsx:246 -#: superset-frontend/src/views/CRUD/utils.tsx:285 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:172 -#, python-format -msgid "Deleted: %s" -msgstr "Izbrisano: %s" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:28 +#: superset-frontend/src/explore/controlPanels/sections.tsx:27 +#: superset-frontend/src/explore/controlPanels/sections.tsx:76 +msgid "Time related form attributes" +msgstr "S časom povezani atributi prikaza" -#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:184 -msgid "Delimited long & lat single column" -msgstr "En stolpec z ločenima zemljepisno dolžino in širino" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:48 +msgid "Datasource & Chart Type" +msgstr "Tip podatkovnega vira in grafikona" -#: superset/views/database/forms.py:132 -msgid "Delimiter" -msgstr "Ločilnik" - -#: superset/views/database/forms.py:133 -msgid "Delimiter used by CSV file (for whitespace use \\s+)." -msgstr "Ločilnik, uporabljen v CSV datoteki (za presledek uporabi \\s+)." +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:58 +#: superset-frontend/src/explore/controlPanels/sections.tsx:42 +msgid "Chart ID" +msgstr "ID grafikona" -#: superset/views/schedules.py:244 superset/views/schedules.py:324 -msgid "Deliver As Group" -msgstr "Dostavi kot skupino" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:60 +#: superset-frontend/src/explore/controlPanels/sections.tsx:44 +msgid "The id of the active chart" +msgstr "Identifikator aktivnega grafikona" -#: superset/views/schedules.py:245 superset/views/schedules.py:325 -msgid "Delivery Type" -msgstr "Tip dostave" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:67 +#: superset-frontend/src/explore/controlPanels/sections.tsx:51 +msgid "Cache Timeout (seconds)" +msgstr "Trajanje predpomnilnika (sekunde)" -#: superset-frontend/src/views/CRUD/alert/components/NotificationMethod.tsx:124 -msgid "Delivery method" -msgstr "Način dostave" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:69 +#: superset-frontend/src/explore/controlPanels/sections.tsx:53 +msgid "The number of seconds before expiring the cache" +msgstr "Trajanje (v sekundah) do razveljavitve predpomnilnika" -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:33 -msgid "Demographics" -msgstr "Demografija" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:76 +msgid "URL Parameters" +msgstr "Parametri URL" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:43 -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:38 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:45 -msgid "Density" -msgstr "Gostota" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:78 +msgid "Extra url parameters for use in Jinja templated queries" +msgstr "Dodatni parametri za poizvedbe z Jinja predlogami" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:55 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:38 -msgid "Deprecated" -msgstr "Zastarelo" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:87 +msgid "Extra Parameters" +msgstr "Dodatni parametri" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:42 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:47 -#: superset-frontend/plugins/plugin-chart-table/src/index.ts:51 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:44 -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:131 -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:163 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:202 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:206 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:692 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1050 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1054 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:52 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:994 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:243 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1100 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1106 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:147 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:157 -#: superset/connectors/druid/views.py:188 -#: superset/connectors/druid/views.py:345 superset/connectors/sqla/views.py:145 -#: superset/connectors/sqla/views.py:256 superset/connectors/sqla/views.py:502 -#: superset/views/annotations.py:78 superset/views/annotations.py:126 -#: superset/views/chart/mixin.py:81 superset/views/sql_lab.py:71 -msgid "Description" -msgstr "Opis" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:89 +msgid "" +"Extra parameters that any plugins can choose to set for use in Jinja templated " +"queries" +msgstr "" +"Dodatni parametri, ki jih lahko uporabi kateri koli vtičnik za poizvedbe z Jinja " +"predlogami" -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:331 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:262 -msgid "Description (this can be seen in the list)" -msgstr "Opis (lahko je viden na seznamu)" +#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:99 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:525 +msgid "Color Scheme" +msgstr "Barvna shema" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:520 -msgid "Description Columns" -msgstr "Stolpci z opisi" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:34 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:74 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:116 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:428 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:128 +#: superset-frontend/src/explore/controls.jsx:123 +#: superset-frontend/src/explore/controls.jsx:396 +msgid "Dimensions" +msgstr "Dimenzije" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:48 -msgid "Description text that shows up below your Big Number" -msgstr "Besedilo, ki se prikaže pod veliko številko" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:36 +#: superset-frontend/src/explore/controls.jsx:126 +msgid "" +"One or many columns to group by. High cardinality groupings should include a " +"series limit to limit the number of fetched and rendered series." +msgstr "" +"Eden ali več stolpcev za združevanje. Združevanje z visoko kardinalnostjo naj " +"vsebuje omejitev serij, s čimer omejite število pridobljenih in prikazanih serij." -#: superset-frontend/src/components/ListView/ListView.tsx:348 -msgid "Deselect all" -msgstr "Počisti izbor" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:69 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:239 +msgid "One or many columns to pivot as columns" +msgstr "En ali več stolpcev za stolpčno vrtenje" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:271 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1081 -msgid "Details of the certification" -msgstr "Podrobnosti certifikacije" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:77 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:431 +#: superset-frontend/src/explore/controls.jsx:399 +msgid "" +"Defines the grouping of entities. Each series is shown as a specific color on the " +"chart and has a legend toggle" +msgstr "" +"Določa združevanje entitet. Vsak niz je na grafikonu prikazan z določeno barvo in " +"ima lahko prikazano legendo" -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:53 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:47 -msgid "Determines how whiskers and outliers are calculated." -msgstr "Določa kako so izračunani kvantili in izstopajoče vrednosti." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:86 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:440 +#: superset-frontend/src/explore/controls.jsx:408 +msgid "Entity" +msgstr "Entiteta" -#: superset/views/dashboard/mixin.py:71 -msgid "" -"Determines whether or not this dashboard is visible in the list of all " -"dashboards" -msgstr "Določa ali je nadzorna plošča vidna na seznamu vseh nadzornih plošč" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:90 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:444 +#: superset-frontend/src/explore/controls.jsx:412 +msgid "This defines the element to be plotted on the chart" +msgstr "Določa element, ki bo izrisan na grafikonu" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:230 -msgid "Diamond" -msgstr "Karo" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:122 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:165 +#: superset-frontend/src/explore/controls.jsx:162 +msgid "One or many metrics to display" +msgstr "Ena ali več mer za prikaz" -#: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:77 -msgid "Did you mean:" -msgstr "Ste mislili:" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:134 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:204 +msgid "Right Axis Metric" +msgstr "Mera desne osi" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:101 -msgid "Difference" -msgstr "Razlika" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:135 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:206 +#: superset-frontend/src/explore/controls.jsx:217 +msgid "Choose a metric for right axis" +msgstr "Izberite mero za desno os" -#: superset/viz.py:1968 -msgid "Directed Force Layout" -msgstr "Izgled usmerjene sile" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:140 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:412 +#: superset-frontend/src/dashboard/components/SliceAdder.jsx:307 +#: superset-frontend/src/explore/controls.jsx:380 +msgid "Sort by" +msgstr "Razvrščanje" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:39 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:42 -msgid "Directional" -msgstr "Usmerjeni" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:142 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:414 +#: superset-frontend/src/explore/controls.jsx:383 +msgid "" +"Metric used to define how the top series are sorted if a series or row limit is " +"present. If undefined reverts to the first metric (where appropriate)." +msgstr "" +"Mera, ki določa kako so razvrščene prve serije, če je določena omejitev serij ali " +"vrstic. Če ni določena, se uporabi prva mera (kjer je ustrezno)." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:165 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:185 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:274 -msgid "Disabled" -msgstr "Onemogočeno" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:156 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:463 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:138 +msgid "Bubble Size" +msgstr "Velikost mehurčka" -#: superset-frontend/src/dashboard/components/Header/index.jsx:579 -msgid "Discard changes" -msgstr "Zavrzi spremembe" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:157 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:464 +msgid "Metric used to calculate bubble size" +msgstr "Mera za izračun velikosti mehurčkov" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:43 -msgid "Discrete" -msgstr "Diskretno" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:163 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:450 +#: superset-frontend/src/explore/controls.jsx:418 +msgid "Metric assigned to the [X] axis" +msgstr "Mera za [X] os" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:149 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:42 -msgid "Display Name" -msgstr "Ime za prikaz" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:169 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:458 +#: superset-frontend/src/explore/controls.jsx:426 +msgid "Metric assigned to the [Y] axis" +msgstr "Mera za [Y] os" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:164 -msgid "Display column level total" -msgstr "Prikaži vsote na nivoju stolpcev" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:174 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:230 +msgid "Color Metric" +msgstr "Mera za barvo" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:615 -msgid "Display configuration" -msgstr "Prikaži nastavitve" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:176 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:233 +#: superset-frontend/src/explore/controls.jsx:238 +msgid "A metric to use for color" +msgstr "Mera za barvo" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:98 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:187 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:182 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:290 +#: superset-frontend/src/explore/controls.jsx:297 msgid "" -"Display metrics side by side within each column, as opposed to each " -"column being displayed side by side for each metric." +"The time column for the visualization. Note that you can define arbitrary " +"expression that return a DATETIME column in the table. Also note that the filter " +"below is applied against this column or expression" msgstr "" -"Prikazuj mere eno ob drugi ob vsakem stolpcu, drugače je vsak stolpec " -"prikazan en ob drugem za vsako mero." +"Časovni stolpec za vizualizacijo. Določite lahko poljuben izraz, ki vrne DATETIME " +"stolpec v tabeli. Spodnji filter se nanaša na ta stolpec ali izraz" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:152 -msgid "Display row level total" -msgstr "Prikaži vsote na nivoju vrstic" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:191 +msgid "Drop temporal column here" +msgstr "Spustite časovni stolpec sem" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:89 -msgid "Display total row/column" -msgstr "Pokaži vsote vrstic/stolpcev" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/emitFilterControl.tsx:30 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/emitFilterControl.tsx:33 +msgid "Enable dashboard cross filters" +msgstr "Omogoči medsebojne filtre nadzorne plošče" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:34 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:122 msgid "" -"Displays connections between entities in a graph structure. Useful for " -"mapping relationships and showing which nodes are important in a network." -" Graph charts can be configured to be force-directed or circulate. If " -"your data has a geospatial component, try the deck.gl Arc chart." +"One or many columns to group by. High cardinality groupings should include a sort " +"by metric and series limit to limit the number of fetched and rendered series." msgstr "" -"Prikaže povezave med entitetami v strukturi grafa. Uporabno za prikaz " -"razmerij in pomembnih točk v omrežju. Grafikon je lahko krožnega tipa ali" -" z usmerjenimi silami. Če imajo podatki geoprostorsko komponento, " -"poskusite grafikon decl.gl - Arc." +"Eden ali več stolpcev za združevanje. Združevanje z visoko kardinalnostjo naj " +"vsebuje mero za razvrščanje in omjitev serij, s čimer omejite število " +"pridobljenih in prikazanih serij." -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:132 -msgid "Distribute across" -msgstr "Porazdeli glede na" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:191 +#: superset-frontend/src/explore/controls.jsx:202 +msgid "The type of visualization to display" +msgstr "Tip vizualizacije za prikaz" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:28 -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:26 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:48 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/createMetadata.ts:25 -msgid "Distribution" -msgstr "Porazdelitev" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:196 +msgid "Fixed Color" +msgstr "Izbrana barva" -#: superset/viz.py:1769 -msgid "Distribution - Bar Chart" -msgstr "Porazdelitev - Stolpčni grafikon" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:197 +#: superset-frontend/src/explore/controls.jsx:207 +msgid "Use this to define a static color for all circles" +msgstr "S tem definirate določeno barvo za vse kroge" -#: superset-frontend/src/dashboard/components/gridComponents/new/NewDivider.jsx:31 -msgid "Divider" -msgstr "Ločilnik" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:211 +msgid "Linear Color Scheme" +msgstr "Linearna barvna shema" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:86 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:211 -msgid "Do you want a donut or a pie?" -msgstr "Želite kolobar ali torto?" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:251 +#: superset-frontend/src/explore/controls.jsx:258 +msgid "" +"Defines the origin where time buckets start, accepts natural dates as in `now`, " +"`sunday` or `1970-01-01`" +msgstr "" +"Določa izhodišče, kadar se začnejo časovni razdelki. Sprejema naravne zapise kot " +"so `zdaj`, `nedelja` ali `1970-01-01`" -#: superset-frontend/src/components/Menu/MenuRight.tsx:214 -msgid "Documentation" -msgstr "Dokumentacija" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:280 +#: superset-frontend/src/explore/controls.jsx:287 +msgid "" +"The time granularity for the visualization. Note that you can type and use simple " +"natural language as in `10 seconds`, `1 day` or `56 weeks`" +msgstr "" +"Granulacija časa za vizualizacijo. Uporabite lahko vnos z naravnim jezikom, kot " +"npr. `10 sekund`, `1 dni` ali `56 tednov`" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:40 -msgid "Domain" -msgstr "Domena" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:329 +#: superset-frontend/src/explore/controls.jsx:326 +msgid "" +"The time granularity for the visualization. This applies a date transformation to " +"alter your time column and defines a new time granularity. The options here are " +"defined on a per database engine basis in the Superset source code." +msgstr "" +"Granulacija časa za to vizualizacijo. Izvede transformacijo podatkov, ki spremeni " +"vaš časovni stolpec in določi novo časovno granulacija. Ta možnost je definirana " +"na ravni sistema podatkovne baze v izvorni kodi Superseta." -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:29 -msgid "Don't refresh" -msgstr "Ne osvežuj" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:345 +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:35 +#: superset-frontend/src/explore/controls.jsx:342 +msgid "No filter" +msgstr "Brez filtra" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:83 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:208 -msgid "Donut" -msgstr "Kolobar" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:346 +#: superset-frontend/src/explore/controls.jsx:343 +msgid "" +"The time range for the visualization. All relative times, e.g. \"Last month\", " +"\"Last 7 days\", \"now\", etc. are evaluated on the server using the server's " +"local time (sans timezone). All tooltips and placeholder times are expressed in " +"UTC (sans timezone). The timestamps are then evaluated by the database using the " +"engine's local timezone. Note one can explicitly set the timezone per the ISO " +"8601 format if specifying either the start and/or end time." +msgstr "" +"Časovno obdobje za vizualizacijo. Vsi relativni časi, kot npr. \"Zadnji mesec\", " +"Zadnjih 7 dni\", \"Zdaj\" so izračunani na strežniku z njegovim lokalnim časom. " +"Vsi opisi orodij in časi so izraženi v UTC. Časovne značke se nato izračunajo v " +"podatkovni bazi z njenim lokalnim časovnim pasom. Eksplicitno lahko nastavite " +"časovni pas v ISO 8601 formatu, če določite čas začetka ali konca." + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:362 +#: superset-frontend/src/explore/controls.jsx:356 +msgid "Row limit" +msgstr "Omejitev števila vrstic" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:319 -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:328 -#: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:105 -msgid "Download as image" -msgstr "Izvozi kot sliko" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:366 +#: superset-frontend/src/explore/controls.jsx:360 +msgid "Limits the number of rows that get displayed." +msgstr "Omeji število vrstic za prikaz." -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:543 -msgid "Download to CSV" -msgstr "Izvozi kot CSV" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:371 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:111 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:124 +msgid "Sort Descending" +msgstr "Razvrsti padajoče" -#: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:72 -#: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:83 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:301 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:499 -msgid "Draft" -msgstr "Osnutek" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:373 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:113 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/orderBy.tsx:47 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:126 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:357 +msgid "Whether to sort descending or ascending" +msgstr "Če želite padajoče ali naraščajoče razvrščanje" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:214 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:152 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:113 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:93 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:110 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:168 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:171 -msgid "Draw a marker on data points. Only applicable for line types." -msgstr "Nariši markerje na točke grafikona. Samo za črtne grafikone." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:384 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:399 +#: superset-frontend/src/explore/controls.jsx:366 +msgid "Series limit" +msgstr "Omejitev števila serij" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:171 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:135 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:138 -msgid "Draw area under curves. Only applicable for line types." -msgstr "Izriši površino pod krivuljo. Samo za črtne grafikone." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:388 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:402 +#: superset-frontend/src/explore/controls.jsx:370 +msgid "" +"Limits the number of series that get displayed. A joined subquery (or an extra " +"phase where subqueries are not supported) is applied to limit the number of " +"series that get fetched and rendered. This feature is useful when grouping by " +"high cardinality column(s) though does increase the query complexity and cost." +msgstr "" +"Omeji število časovnih vrst za prikaz. S podpoizvedbo (ali dodatno fazo, kjer " +"podpoizvedbe niso podprte) se omeji število časovnih vrst, ki bodo pridobljene za " +"prikaz. Ta funkcija je uporabna pri združevanju s stolpci z veliko " +"kardinalnostjo, vendar poveča kompleksnost poizvedbe." -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:178 -msgid "Draw line from Pie to label when labels outside?" -msgstr "Ali želite črto do oznake, ko so le-te zunaj?" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:472 +#: superset-frontend/src/explore/controls.jsx:438 +msgid "Y Axis Format" +msgstr "Oblika Y osi" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:331 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:246 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:209 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:189 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:206 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:262 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:265 -msgid "Draw split lines for minor y-axis ticks" -msgstr "Izriši ločilne črte za pomožne oznake y-osi" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:497 +msgid "Time format" +msgstr "Oblika zapisa časa" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx:217 -msgid "Drop a column here or click" -msgstr "Spustite stolpec sem ali kliknite" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:529 +#: superset-frontend/src/explore/controls.jsx:480 +msgid "The color scheme for rendering chart" +msgstr "Barvna shema za izris grafikona" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx:367 -msgid "Drop a column/metric here or click" -msgstr "Spustite stolpec/mero sem ali kliknite" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:538 +msgid "Truncate Metric" +msgstr "Odstrani mero" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx:222 -msgid "Drop column here" -msgstr "Spustite stolpec sem" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:540 +msgid "Whether to truncate metrics" +msgstr "Če želite odstraniti naziv mere" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx:372 -msgid "Drop column or metric here" -msgstr "Spustite stolpec ali mero sem" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/legacySortBy.tsx:29 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/orderBy.tsx:45 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:355 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1008 +msgid "Sort descending" +msgstr "Razvrsti padajoče" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndSelectLabel.tsx:80 -msgid "Drop columns here" -msgstr "Spustite stolpce sem" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/legacySortBy.tsx:31 +msgid "" +"Whether to sort descending or ascending. Takes effect only when \"Sort by\" is set" +msgstr "" +"Če želite padajoče ali naraščajoče razvrščanje. Učinkuje samo, ko je vključen " +"\"Sort by\"" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx:389 -msgid "Drop columns or metrics here" -msgstr "Spustite stolpce ali mere sem" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx:168 +msgid "Show less columns" +msgstr "Prikaži manj stolpcev" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx:388 -msgid "Drop columns/metrics here or click" -msgstr "Spustite stolpce/mere sem ali kliknite" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx:173 +msgid "Show all columns" +msgstr "Prikaži vse stolpce" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:176 -msgid "Drop temporal column here" -msgstr "Spustite časovni stolpec sem" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:47 +msgid "Emit Target" +msgstr "Cilj oddajanja" -#: superset/connectors/druid/views.py:213 -#: superset/initialization/__init__.py:516 -msgid "Druid Clusters" -msgstr "Druid gruče" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:48 +msgid "" +"If you wish to specify a different target column than the original column, it can " +"be entered here" +msgstr "" +"Če želite nastaviti drug ciljni stolpec od izvornega, ga lahko vnesete tukaj" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:58 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:69 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1215 +msgid "D3 format" +msgstr "D3 format" -#: superset/connectors/druid/views.py:192 -msgid "Druid Datasource" -msgstr "Podatkovni vir Druid" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:80 +msgid "Fraction digits" +msgstr "Število decimalk" + +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:81 +msgid "Number of decimal digits to round numbers to" +msgstr "Število decimalnih mest za zaokroževanje števil" -#: superset/connectors/druid/views.py:277 -#: superset/initialization/__init__.py:507 -msgid "Druid Datasources" -msgstr "Druid podatkovni viri" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:90 +msgid "Min Width" +msgstr "Min. širina" -#: superset/connectors/druid/views.py:248 -#: superset/connectors/druid/views.py:253 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:91 msgid "" -"Druid supports basic authentication. See " -"[auth](http://druid.io/docs/latest/design/auth.html) and druid-basic-" -"security extension" +"Default minimal column width in pixels, actual width may still be larger than " +"this if other columns don't need much space" msgstr "" -"Druid podpira osnovno avtentikacijo. Glejte " -"[auth](http://druid.io/docs/latest/design/auth.html) in razširitev druid-" -"basic-security" +"Privzeta min. širina stolpca v pikslih. Dejanska širina bo lahko večja, če drugi " +"stolpci ne potrebujejo veliko prostora" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:30 -msgid "Dual Line Chart" -msgstr "Grafikon z dvojno krivuljo" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:105 +msgid "Text align" +msgstr "Poravnava besedila" -#: superset/views/datasource/views.py:119 -#, python-format -msgid "Duplicate column name(s): %(columns)s" -msgstr "Podvojena imena stolpcev: %(columns)s" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:106 +msgid "Horizontal alignment" +msgstr "Vodoravna poravnava" -#: superset/common/query_object.py:284 -#, python-format -msgid "" -"Duplicate column/metric labels: %(labels)s. Please make sure all columns " -"and metrics have a unique label." -msgstr "" -"Podvojene oznake stolpcev/mer: %(labels)s. Poskrbite, da bodo imeli " -"stolpci in mere unikatne oznake." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:111 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:334 +msgid "Left" +msgstr "Levo" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:366 -msgid "Duplicate tab" -msgstr "Podvoji zavihek" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:112 +msgid "Center" +msgstr "Na sredino" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:135 -msgid "Duration" -msgstr "Trajanje" +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:113 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:335 +msgid "Right" +msgstr "Desno" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:227 -#: superset/views/database/mixins.py:175 -msgid "" -"Duration (in seconds) of the caching timeout for charts of this database." -" A timeout of 0 indicates that the cache never expires. Note this " -"defaults to the global timeout if undefined." -msgstr "" -"Trajanje (v sekundah) predpomnjenja za grafikon v tej podatkovni bazi. " -"Vrednost 0 označuje, da predpomnilnik nikoli ne poteče. V primeru, da ni " -"definirano, ima globalno nastavitev." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:119 +msgid "Show cell bars" +msgstr "Prikaži stolp. graf v celicah" -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:282 -msgid "" -"Duration (in seconds) of the caching timeout for this chart. Note this " -"defaults to the dataset's timeout if undefined." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:120 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:435 +msgid "Whether to display a bar chart background in table columns" msgstr "" -"Časovna veljavnost (v sekundah) predpomnjenja za ta grafikon. Če ni " -"definirana, je uporabljena vrednost za podatkovni set." +"Če želite omogočiti prikaz manjših stolpčnih grafikonov v ozadju stolpcev tabele" -#: superset/views/chart/mixin.py:70 -msgid "" -"Duration (in seconds) of the caching timeout for this chart. Note this " -"defaults to the datasource/table timeout if undefined." -msgstr "" -"Časovna veljavnost (v sekundah) predpomnjenja za ta grafikon. Če ni " -"definirana, je uporabljena vrednost za podatkovni vir/tabelo." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:127 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:446 +msgid "Align +/-" +msgstr "Poravnaj +/-" -#: superset/connectors/druid/views.py:243 -msgid "" -"Duration (in seconds) of the caching timeout for this cluster. A timeout " -"of 0 indicates that the cache never expires. Note this defaults to the " -"global timeout if undefined." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:128 +msgid "Whether to align positive and negative values in cell bar chart at 0" msgstr "" -"Trajanje (v sekundah) predpomnjenja za to gručo. Vrednost 0 označuje, da " -"predpomnilnik nikoli ne poteče. V primeru, da ni definirano, ima globalno" -" nastavitev trajanja." +"Če želite poravnati pozitivne in negativne vrednosti v stolpčnem grafikonu celic " +"pri 0" -#: superset/connectors/druid/views.py:334 -msgid "" -"Duration (in seconds) of the caching timeout for this datasource. A " -"timeout of 0 indicates that the cache never expires. Note this defaults " -"to the cluster timeout if undefined." -msgstr "" -"Trajanje (v sekundah) predpomnjenja za ta podatkovni vir. Vrednost 0 " -"označuje, da predpomnilnik nikoli ne poteče. V primeru, da ni definirano," -" ima nastavitev trajanja za gručo." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:137 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:458 +msgid "Color +/-" +msgstr "Barva +/-" -#: superset/connectors/sqla/views.py:473 -msgid "" -"Duration (in seconds) of the caching timeout for this table. A timeout of" -" 0 indicates that the cache never expires. Note this defaults to the " -"database timeout if undefined." -msgstr "" -"Trajanje (v sekundah) predpomnjenja za to tabelo. Vrednost 0 označuje, da" -" predpomnilnik nikoli ne poteče. V primeru, da ni definirano, ima " -"nastavitev trajanja za podatkovno bazo." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:138 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:461 +msgid "Whether to colorize numeric values by if they are positive or negative" +msgstr "Če želite obarvati številske vrednosti, ko so le-te pozitivne ali negativne" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:250 -msgid "" -"Duration (in seconds) of the metadata caching timeout for schemas of this" -" database. If left unset, the cache never expires." -msgstr "" -"Trajanje (v sekundah) predpomnilnika metapodatkov za sheme v tej " -"podatkovni bazi. Če ni nastavljeno, predpomnilnik ne poteče." +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:153 +msgid "Small number format" +msgstr "Oblika zapisa majhnih števil" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:272 +#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:154 msgid "" -"Duration (in seconds) of the metadata caching timeout for tables of this " -"database. If left unset, the cache never expires. " +"D3 number format for numbers between -1.0 and 1.0, useful when you want to have " +"different siginificant digits for small and large numbers" msgstr "" -"Trajanje (v sekundah) predpomnilnika metapodatkov za tabele v tej " -"podatkovni bazi. Če ni nastavljeno, predpomnilnik ne poteče. " +"D3 oblika zapisa za števila med -1.0 in 1.0. Uporabno, če želite različno število " +"števk za majhna in velika števila" -#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:41 -msgid "Duration in ms (1.40008 => 1ms 400µs 80ns)" -msgstr "Trajanje v ms (1.40008 => 1ms 400µs 80ns)" +#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:22 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:149 +msgid "D3 format syntax: https://github.com/d3/d3-format" +msgstr "Sintaksa D3 formata: https://github.com/d3/d3-format" + +#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:28 +#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:51 +msgid "Adaptive formatting" +msgstr "Adaptivno oblikovanje" -#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:40 +#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:42 msgid "Duration in ms (66000 => 1m 6s)" msgstr "Trajanje v ms (66000 => 1m 6s)" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:205 -#, python-format -msgid "Duration: %s" -msgstr "Trajanje: %s" - -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:55 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:55 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:47 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:43 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:71 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:72 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:61 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:77 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:77 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:72 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:71 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:71 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:62 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:42 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:61 -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:124 -msgid "ECharts" -msgstr "ECharts" +#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:43 +msgid "Duration in ms (1.40008 => 1ms 400µs 80ns)" +msgstr "Trajanje v ms (1.40008 => 1ms 400µs 80ns)" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:76 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:169 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:176 -msgid "END (EXCLUSIVE)" -msgstr "KONEC (NI VKLJUČEN)" +#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:46 +msgid "D3 time format syntax: https://github.com/d3/d3-time-format" +msgstr "Sintaksa D3 časovnega formata:: https://github.com/d3/d3-time-format" -#: superset-frontend/src/views/CRUD/hooks.ts:628 -#, python-format -msgid "ERROR: %s" +#: superset-frontend/packages/superset-ui-core/src/chart/components/NoResultsComponent.tsx:65 +msgid "" +"No results were returned for this query. If you expected results to be returned, " +"ensure any filters are configured properly and the datasource contains data for " +"the selected time range." msgstr "" +"Poizvedba ni vrnila rezultatov. Če ste pričakovali rezultate, poskrbite, da so " +"filtri pravilno nastavljeni in podatkovni vir vsebuje podatke za izbrano časovno " +"obdobje." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:241 -msgid "Edge length" -msgstr "Dolžina povezave" - -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:247 -msgid "Edge length between nodes" -msgstr "Dolžina povezave med vozlišči" - -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:124 -msgid "Edge symbols" -msgstr "Simboli povezav" +#: superset-frontend/packages/superset-ui-core/src/chart/components/NoResultsComponent.tsx:78 +msgid "No Results" +msgstr "Ni rezultatov" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:226 -msgid "Edge width" -msgstr "Debelina povezave" +#: superset-frontend/packages/superset-ui-core/src/query/extractQueryFields.ts:130 +msgid "Found invalid orderby options" +msgstr "Najdene so neveljavne možnosti razvrščanja" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:197 -#: superset-frontend/src/dashboard/components/menu/MarkdownModeDropdown.tsx:35 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:75 -#: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:121 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:316 -#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:128 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:404 -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:85 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:401 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:358 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:389 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:219 -msgid "Edit" -msgstr "Urejanje" +#: superset-frontend/packages/superset-ui-core/src/validator/legacyValidateInteger.ts:31 +#: superset-frontend/packages/superset-ui-core/src/validator/validateInteger.ts:32 +msgid "is expected to be an integer" +msgstr "pričakovano je celo število" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1053 -#, fuzzy -msgid "Edit Alert" -msgstr "Uredi tabelo" +#: superset-frontend/packages/superset-ui-core/src/validator/legacyValidateNumber.ts:28 +#: superset-frontend/packages/superset-ui-core/src/validator/validateNumber.ts:32 +msgid "is expected to be a number" +msgstr "pričakovano je število" -#: superset/views/annotations.py:61 -msgid "Edit Annotation" -msgstr "Uredi oznako" +#: superset-frontend/packages/superset-ui-core/src/validator/validateNonEmpty.ts:29 +msgid "cannot be empty" +msgstr "ne sme biti prazno" -#: superset/views/annotations.py:120 -msgid "Edit Annotation Layer" -msgstr "Uredi sloj z oznakami" +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:32 +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:26 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:32 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:90 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:65 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:60 +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:30 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:26 +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:26 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:36 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:33 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:34 +#: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:26 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:26 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:30 +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:31 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:31 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/controlPanel.js:63 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:44 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts:39 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:40 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/controlPanel.ts:41 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:56 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts:39 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:44 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:26 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:60 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:158 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:341 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:29 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:43 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:32 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:34 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:34 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:41 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:34 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:44 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:48 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:63 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:62 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:269 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:53 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:54 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:60 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:61 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:42 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:38 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controlPanel.tsx:56 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:42 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:185 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:26 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:30 +#: superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx:62 +#: superset-frontend/src/explore/controlPanels/sections.tsx:104 +#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:34 +#: superset-frontend/src/filters/components/Range/controlPanel.ts:31 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:41 +#: superset-frontend/src/filters/components/Time/controlPanel.ts:29 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:178 +#: superset-frontend/src/visualizations/TimeTable/controlPanel.js:26 +msgid "Query" +msgstr "Poizvedba" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:309 -msgid "Edit CSS" -msgstr "Uredi CSS" +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:40 +msgid "Domain" +msgstr "Domena" -#: superset/views/css_templates.py:39 -msgid "Edit CSS Template" -msgstr "Uredi CSS predlogo" +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:49 +msgid "The time unit used for the grouping of blocks" +msgstr "Časovna enota za združevanje blokov" -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:231 -msgid "Edit CSS template properties" -msgstr "Uredi lastnosti CSS predloge" +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:56 +msgid "Subdomain" +msgstr "Poddomena" -#: superset/views/chart/mixin.py:29 -msgid "Edit Chart" -msgstr "Uredi grafikon" +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:65 +msgid "" +"The time unit for each block. Should be a smaller unit than domain_granularity. " +"Should be larger or equal to Time Grain" +msgstr "" +"Časovna enota za vsak blok. Mora biti manjša enota kot domenska_granulacija. Mora " +"biti večja ali enaka Granulaciji časa" -#: superset/connectors/sqla/views.py:66 -msgid "Edit Column" -msgstr "Uredi stolpec" +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:77 +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:49 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:75 +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:53 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:132 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:57 +#: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:36 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:65 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:53 +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:43 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:42 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:84 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:77 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:31 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts:40 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:69 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:35 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:39 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:57 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:125 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:69 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:73 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:74 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:308 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:72 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:98 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:337 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:73 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:90 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:96 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:97 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:61 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:35 +#: superset-frontend/src/explore/fixtures.tsx:33 +#: superset-frontend/src/explore/fixtures.tsx:76 +#: superset-frontend/src/explore/fixtures.tsx:85 +msgid "Chart Options" +msgstr "Možnosti grafikona" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:91 +msgid "Cell Size" +msgstr "Velikost celice" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:92 +msgid "The size of the square cell, in pixels" +msgstr "Velikost kvadratne celice v pikslih" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:103 +msgid "Cell Padding" +msgstr "Razmak med celicami" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:104 +msgid "The distance between cells, in pixels" +msgstr "Razdalja med celicami v pikslih" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:117 +msgid "Cell Radius" +msgstr "Polmer celice" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:118 +msgid "The pixel radius" +msgstr "Polmer piksla" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:129 +msgid "Color Steps" +msgstr "Barvni koraki" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:130 +msgid "The number color \"steps\"" +msgstr "Število barvnih korakov" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:141 +msgid "Time Format" +msgstr "Oblika zapisa časa" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:154 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:275 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:129 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:149 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:104 +msgid "Legend" +msgstr "Legenda" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:157 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:278 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:132 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:152 +msgid "Whether to display the legend (toggles)" +msgstr "Preklapljanje prikaza legende" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:164 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:301 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:197 +msgid "Show Values" +msgstr "Pokaži vrednosti" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:167 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:304 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:200 +msgid "Whether to display the numerical values within the cells" +msgstr "Če želite v celicah prikazati numerične vrednosti" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:178 +msgid "Show Metric Names" +msgstr "Pokaži imena mer" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:181 +msgid "Whether to display the metric name as a title" +msgstr "Če želite prikazati ime mere kot naslov" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:191 +msgid "Number Format" +msgstr "Oblika zapisa števila" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:25 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:28 +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:25 +msgid "Correlation" +msgstr "Korelacija" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:27 +msgid "" +"Visualizes how a metric has changed over a time using a color scale and a " +"calendar view. Gray values are used to indicate missing values and the linear " +"color scheme is used to encode the magnitude of each day's value." +msgstr "" +"Prikaže kako se je mera spreminjala s časom s pomočjo barvne lestvice in " +"koledarskega pogleda. Sive vrednosti ponazarjajo manjkajoče vrednosti. Amplituda " +"dnevnih vrednosti je ponazorjena z linearno barvno shemo." + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:32 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:40 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:35 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:31 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:40 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:54 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:45 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:55 +#: superset-frontend/plugins/plugin-chart-table/src/index.ts:44 +msgid "Business" +msgstr "Aktivnost" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:33 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:33 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:37 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:35 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:35 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:34 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:43 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:35 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:46 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:41 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:68 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:56 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:60 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:43 +#: superset-frontend/src/visualizations/TimeTable/index.ts:32 +msgid "Comparison" +msgstr "Primerjava" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:34 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:41 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:36 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:38 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:39 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:36 +msgid "Intensity" +msgstr "Intenzivnost" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:35 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:35 +#: superset-frontend/plugins/plugin-chart-table/src/index.ts:46 +msgid "Pattern" +msgstr "Vzorec" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:36 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:31 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:45 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:43 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:57 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:48 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:59 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 +#: superset-frontend/plugins/plugin-chart-table/src/index.ts:48 +msgid "Report" +msgstr "Poročilo" + +#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:37 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:37 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:53 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:40 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:38 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:40 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:45 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:59 +#: superset-frontend/src/visualizations/TimeTable/index.ts:37 +msgid "Trend" +msgstr "Trend" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:39 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:94 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:55 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:43 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:63 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:63 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:64 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:62 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:49 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:38 +msgid "Sort by metric" +msgstr "Mera za razvrščanje" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:40 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:95 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:56 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:44 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:64 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:64 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:65 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:63 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:50 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:39 +msgid "Whether to sort results by the selected metric in descending order." +msgstr "Če želite padajoče razvrstiti rezultate z izbrano mero." + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:56 +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:64 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:143 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:118 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:67 +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:67 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:66 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:96 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:270 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:99 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:112 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:148 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:120 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:137 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:113 +msgid "Number format" +msgstr "Oblika zapisa števila" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:57 +msgid "Choose a number format" +msgstr "Izberite obliko zapisa števila" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:60 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:52 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1346 +msgid "Source" +msgstr "Izvor" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:63 +msgid "Choose a source" +msgstr "Izberite izvor" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:66 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:62 +msgid "Target" +msgstr "Cilj" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:69 +msgid "Choose a target" +msgstr "Izberite cilj" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:26 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:24 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:27 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:32 +msgid "Flow" +msgstr "Potek" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:28 +msgid "" +"Showcases the flow or link between categories using thickness of chords. The " +"value and corresponding thickness can be different for each side." +msgstr "" +"Prikaže potek ali povezave med kategorijami z debelino tetiv. Vrednost in " +"debelina sta lahko različni za vsako stran." + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:32 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:35 +msgid "Relationships between community channels" +msgstr "Razmerja med skupnostnimi kanali" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:34 +msgid "Chord Diagram" +msgstr "Tetivni grafikon" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:36 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:44 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:39 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:79 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:65 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:78 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:86 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:73 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:70 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:58 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:41 +msgid "Aesthetic" +msgstr "Estetika" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:37 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:33 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:112 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:40 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:67 +msgid "Circular" +msgstr "Krožno" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:38 +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:30 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:42 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:33 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:37 +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:30 +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:31 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:31 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:40 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:43 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:39 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:47 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:35 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:31 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:32 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:31 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:29 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:42 +#: superset-frontend/src/visualizations/TimeTable/index.ts:33 +msgid "Legacy" +msgstr "Staro" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:39 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:42 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:46 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:50 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:44 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:71 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:64 +msgid "Proportional" +msgstr "Proporcionalno" + +#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:40 +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:43 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:33 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:44 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:44 +msgid "Relational" +msgstr "Relacijsko" + +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:40 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:119 +msgid "Country" +msgstr "Država" + +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:43 +msgid "Which country to plot the map for?" +msgstr "Za katero državo želite grafikon?" + +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:78 +msgid "ISO 3166-2 Codes" +msgstr "Oznake po ISO 3166-2" + +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:79 +msgid "" +"Column containing ISO 3166-2 codes of region/province/department in your table." +msgstr "" +"Stolpec, ki vsebuje ISO 3166-2 oznake regij/provinc/departmajev v vaši tabeli." + +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:85 +msgid "Metric to display bottom title" +msgstr "Mera za prikaz spodnjega naslova" + +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:25 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:26 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:27 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/controlPanel.js:27 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:78 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/controlPanel.ts:64 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts:50 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:51 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/controlPanel.ts:67 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:94 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:63 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts:50 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:25 +msgid "Map" +msgstr "Zemljevid" + +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:27 +msgid "" +"Visualizes how a single metric varies across a country's principal subdivisions " +"(states, provinces, etc) on a chloropleth map. Each subdivision's value is " +"elevated when you hover over the corresponding geographic boundary." +msgstr "" +"Prikaže kako se posamezna mera spreminja glede na območja države (dežele, " +"province, itd.) na kloropletnem zemljevidu. Vsak podrazdelek se dvigne, ko z " +"miško preidete mejo njegovega območja." -#: superset/views/dashboard/mixin.py:28 -msgid "Edit Dashboard" -msgstr "Uredi nadzorno ploščo" +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:32 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:35 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:37 +msgid "2D" +msgstr "2D" -#: superset/views/database/mixins.py:36 -msgid "Edit Database" -msgstr "Uredi podatkovno bazo" +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:34 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:37 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:38 +msgid "Geo" +msgstr "Geo" -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:192 -msgid "Edit Dataset " -msgstr "Uredi podatkovni set " +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:35 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:55 +msgid "Range" +msgstr "Doseg" + +#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:37 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:51 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:41 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:48 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:89 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:76 +msgid "Stacked" +msgstr "Naložen" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/EventFlow.tsx:50 +msgid "Sorry, there appears to be no data" +msgstr "Ni podatkov" -#: superset/connectors/druid/views.py:216 -msgid "Edit Druid Cluster" -msgstr "Uredi Druid gručo" +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:36 +msgid "Event definition" +msgstr "Definicija dogodka" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:44 +msgid "Event Names" +msgstr "Imena dogodkov" -#: superset/connectors/druid/views.py:73 -msgid "Edit Druid Column" -msgstr "Uredi Druid stolpec" +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:45 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:45 +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:54 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx:39 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx:63 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:105 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:129 +#: superset-frontend/src/explore/fixtures.tsx:98 +msgid "Columns to display" +msgstr "Stolpci za prikaz" -#: superset/connectors/druid/views.py:280 -msgid "Edit Druid Datasource" -msgstr "Uredi podatkovni vir za Druid" +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:62 +msgid "Order by entity id" +msgstr "Uredi po ID entitete" -#: superset/connectors/druid/views.py:162 -msgid "Edit Druid Metric" -msgstr "Uredi Druid mere" +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:63 +msgid "" +"Important! Select this if the table is not already sorted by entity id, else " +"there is no guarantee that all events for each entity are returned." +msgstr "" +"Pomembno! Izberite, če tabela še ni razvrščena po ID entitete, v nasprotnem " +"primeru ni nujno, da bodo vrnjeni vsi dogodki za posamezno entiteto." -#: superset-frontend/src/components/ReportModal/index.tsx:251 -msgid "Edit Email Report" -msgstr "Uredi e-poštno poročilo" +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:77 +msgid "Minimum leaf node event count" +msgstr "Min. število dogodkov za list" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:80 +msgid "" +"Leaf nodes that represent fewer than this number of events will be initially " +"hidden in the visualization" +msgstr "" +"Listna vozlišča, ki predstavljajo manjše število dogodkov od te vrednosti, bodo v " +"vizualizaciji skrita" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:95 +msgid "Additional metadata" +msgstr "Dodatni metapodatki" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:104 +msgid "Metadata" +msgstr "Metapodatki" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:106 +msgid "Select any columns for metadata inspection" +msgstr "Izberite poljubne stolpce za pregled metapodatkov" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:124 +msgid "Entity ID" +msgstr "ID entitete" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:125 +msgid "e.g., a \"user id\" column" +msgstr "t.j. stolpec \"id uporabnika\"" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:128 +msgid "Max Events" +msgstr "Max. dogodkov" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:129 +msgid "The maximum number of events to return, equivalent to the number of rows" +msgstr "Največje število dogodkov, ki bodo vrnjeni - enako številu vrstic" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:26 +msgid "" +"Compares the lengths of time different activities take in a shared timeline view." +msgstr "Primerja dolžine časovno različnih aktivnosti na skupni časovnici." + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:29 +msgid "Event Flow" +msgstr "Potek dogodkov" + +#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:30 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:56 +msgid "Progressive" +msgstr "Progresivno" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:36 +msgid "Axis ascending" +msgstr "Naraščajoča os" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:37 +msgid "Axis descending" +msgstr "Padajoča os" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:38 +msgid "Metric ascending" +msgstr "Naraščajoča mera" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:39 +msgid "Metric descending" +msgstr "Padajoča mera" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:104 +msgid "Heatmap Options" +msgstr "Možnosti toplotnega prikaza" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:114 +msgid "XScale Interval" +msgstr "Interval X-osi" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:119 +msgid "Number of steps to take between ticks when displaying the X scale" +msgstr "Število korakov med oznakami pri prikazu X-osi" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:130 +msgid "YScale Interval" +msgstr "Interval Y-osi" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:135 +msgid "Number of steps to take between ticks when displaying the Y scale" +msgstr "Število korakov med oznakami pri prikazu Y-osi" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:146 +msgid "Rendering" +msgstr "Izris" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:153 +msgid "" +"image-rendering CSS attribute of the canvas object that defines how the browser " +"scales up the image" +msgstr "atribut CSS za izris objekta platna, ki določa, kako brskalnik poveča sliko" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:165 +msgid "Normalize Across" +msgstr "Normiraj glede na" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:172 +msgid "" +"Color will be rendered based on a ratio of the cell against the sum of across " +"this criteria" +msgstr "" +"Barva bo prikazana na osnovi razmerja med celico in vsoto glede na ta kriterij" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:187 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:77 +msgid "Left Margin" +msgstr "Levi rob" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:199 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:81 +msgid "Left margin, in pixels, allowing for more room for axis labels" +msgstr "Levi rob, v pikslih, s katerim povečamo prostor za oznake osi" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:212 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:187 +msgid "Bottom Margin" +msgstr "Spodnji rob" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:224 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:191 +msgid "Bottom margin, in pixels, allowing for more room for axis labels" +msgstr "Spodnji rob, v pikslih, s katerim povečamo prostor za oznake osi" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:235 +msgid "Value bounds" +msgstr "Meje vrednosti" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:238 +msgid "" +"Hard value bounds applied for color coding. Is only relevant and applied when the " +"normalization is applied against the whole heatmap." +msgstr "" +"Mejne vrednosti za barvno lestvico. Upošteva se le, če je normiranje uporabljeno " +"glede na celotni toplotni prikaz." + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:251 +msgid "Sort X Axis" +msgstr "Razvrsti X-os" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:263 +msgid "Sort Y Axis" +msgstr "Razvrsti Y-os" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:287 +msgid "Show percentage" +msgstr "Prikaži procente" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:289 +msgid "Whether to include the percentage in the tooltip" +msgstr "Če želite prikaz procentov v opisu orodja" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:315 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:141 +msgid "Normalized" +msgstr "Normiran" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:317 +msgid "Whether to apply a normal distribution based on rank on the color scale" +msgstr "" +"Če želite uporabiti normalno porazdelitev glede na stopnjo na barvni lestvici" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:329 +msgid "Value Format" +msgstr "Oblika zapisa vrednosti" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:30 +msgid "" +"Visualize a related metric across pairs of groups. Heatmaps excel at showcasing " +"the correlation or strength between two groups. Color is used to emphasize the " +"strength of the link between each pair of groups." +msgstr "Vizualizacija povezanih mer med pari skupin." + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:34 +msgid "Sizes of vehicles" +msgstr "Velikosti vozil" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:36 +msgid "Employment and education" +msgstr "Zaposlitev in izobrazba" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:43 +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:38 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:40 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:38 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:45 +msgid "Density" +msgstr "Gostota" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:44 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:39 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:76 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:71 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:72 +msgid "Predictive" +msgstr "Prediktivno" + +#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:45 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:46 +msgid "Single Metric" +msgstr "Ena mera" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:117 +msgid "count" +msgstr "število" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:121 +msgid "cumulative" +msgstr "kumulativno" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:125 +msgid "percentile (exclusive)" +msgstr "percentil (ekskluzivno)" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:38 +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:48 +msgid "Select the numeric columns to draw the histogram" +msgstr "Izberite numerične stolpce za izris histograma" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:86 +msgid "No of Bins" +msgstr "Št. razdelkov" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:98 +msgid "Select the number of bins for the histogram" +msgstr "Izberite število razdelkov za histogram" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:107 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:175 +msgid "X Axis Label" +msgstr "Naslov X osi" + +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:118 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:333 +msgid "Y Axis Label" +msgstr "Naslov Y osi" -#: superset/views/log/__init__.py:24 -msgid "Edit Log" -msgstr "Uredi dnevnik" +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:143 +msgid "Whether to normalize the histogram" +msgstr "Če želite normirati histogram" -#: superset/connectors/sqla/views.py:215 -msgid "Edit Metric" -msgstr "Uredi mero" +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:153 +msgid "Cumulative" +msgstr "Kumulativno" -#: superset/views/dynamic_plugins.py:61 -msgid "Edit Plugin" -msgstr "Uredi vtičnik" +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:155 +msgid "Whether to make the histogram cumulative" +msgstr "Če želite kumulativni histogram" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1051 -#, fuzzy -msgid "Edit Report" -msgstr "Uredi zapis" +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:28 +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:26 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:48 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/createMetadata.ts:25 +msgid "Distribution" +msgstr "Porazdelitev" -#: superset/connectors/sqla/views.py:317 -msgid "Edit Row level security filter" -msgstr "Uredi filter za varnost na nivoju vrstic" +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:29 +msgid "" +"Take your data points, and group them into \"bins\" to see where the densest " +"areas of information lie" +msgstr "" +"Vzame podatkovne točke in jih razporedi v razdelke, kjer se vidi območja z " +"največjo gostoto informacij" -#: superset/views/sql_lab.py:42 -msgid "Edit Saved Query" -msgstr "Uredi shranjeno poizvedbo" +#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:33 +msgid "Population age data" +msgstr "Podatki starosti populacije" -#: superset/connectors/sqla/views.py:398 -msgid "Edit Table" -msgstr "Uredi tabelo" +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:43 +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:46 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:49 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:47 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:60 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:355 +#: superset-frontend/src/explore/controlPanels/sections.tsx:117 +msgid "Contribution" +msgstr "Prispevek" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:174 -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:283 -msgid "Edit annotation" -msgstr "Uredi oznako" +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:45 +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:48 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:51 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:49 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:62 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:357 +#: superset-frontend/src/explore/controlPanels/sections.tsx:119 +msgid "Compute the contribution to the total" +msgstr "Izračunaj prispevek k celoti" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:170 -msgid "Edit annotation layer" -msgstr "Uredi sloj z oznakami" +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:63 +msgid "Series Height" +msgstr "Višina serije" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:237 -msgid "Edit annotation layer properties" -msgstr "Uredi lastnosti sloja z oznakami" +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:75 +msgid "Pixel height of each series" +msgstr "Višina vsake serije v pikslih" -#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:305 -#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:308 -msgid "Edit chart properties" -msgstr "Uredi lastnosti grafikona" +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:83 +msgid "Value Domain" +msgstr "Domena vrednosti" -#: superset-frontend/src/dashboard/components/Header/index.jsx:605 -msgid "Edit dashboard" -msgstr "Uredi nadzorno ploščo" +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:90 +msgid "" +"series: Treat each series independently; overall: All series use the same scale; " +"change: Show changes compared to the first data point in each series" +msgstr "" +"serije: Obravnavaj vsako podatkovno serijo neodvisno; skupno: Vse vrste " +"uporabljajo enako skalo; razlika: Pokaži razlike glede na prvo točko vsake serije" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:302 -msgid "Edit dashboard properties" -msgstr "Uredi lastnosti nadzorne plošče" +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:28 +msgid "" +"Compares how a metric changes over time between different groups. Each group is " +"mapped to a row and change over time is visualized bar lengths and color." +msgstr "" +"Primerja kako se mera spreminja s časom med različnimi skupinami. Vsaka skupina " +"predstavlja eno vrstico, časovne spremembe pa so prikazane z dolžino stolpcev in " +"barvami." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1011 -msgid "Edit database" -msgstr "Uredi podatkovno bazo" +#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:32 +msgid "Horizon Chart" +msgstr "Horizontni grafikon" -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:192 -msgid "Edit dataset" -msgstr "Uredi podatkovni set" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:62 +msgid "Longitude" +msgstr "Dolžina" -#: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:73 -msgid "Edit email report" -msgstr "Uredi e-poštno poročilo" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:63 +msgid "Column containing longitude data" +msgstr "Stolpec s podatki zemljepisne dolžine" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/ConditionalFormattingControl.tsx:151 -msgid "Edit formatter" -msgstr "Uredi oblikovanje" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:72 +msgid "Latitude" +msgstr "Širina" -#: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:80 -msgid "Edit properties" -msgstr "Uredi lastnosti" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:73 +msgid "Column containing latitude data" +msgstr "Stolpec s podatki zemljepisne širine" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:383 -msgid "Edit query" -msgstr "Uredi poizvedbo" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:83 +msgid "Clustering Radius" +msgstr "Radij gručenja" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:230 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:210 -msgid "Edit template" -msgstr "Uredi predlogo" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:96 +msgid "" +"The radius (in pixels) the algorithm uses to define a cluster. Choose 0 to turn " +"off clustering, but beware that a large number of points (>1000) will cause lag." +msgstr "" +"Radij (v pikslih), s katerim algoritem definira gručo. Izberite 0 za izklop " +"gručenja - veliko število točk (>1000) bo povzročilo upočasnitev." -#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:99 -msgid "Edit template parameters" -msgstr "Uredi parametre predloge" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:110 +msgid "Points" +msgstr "Točke" -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:353 -msgid "Edit time range" -msgstr "Uredi časovno obdobje" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:117 +msgid "Point Radius" +msgstr "Radij točk" -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:161 -msgid "Edited" -msgstr "Urejane" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:119 +msgid "" +"The radius of individual points (ones that are not in a cluster). Either a " +"numerical column or `Auto`, which scales the point based on the largest cluster" +msgstr "" +"Radij posameznih točk (tistih, ki niso v gruči). Numerični stolpec ali `Auto` " +"(skalira točke na osnovi največje gruče)" -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:484 -msgid "Editing 1 filter:" -msgstr "Urejanje enega filtra:" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:141 +msgid "Point Radius Unit" +msgstr "Enota radija točk" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:119 -msgid "Editing filter set:" -msgstr "Urejanje seta filtrov:" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:144 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:90 +msgid "The unit of measure for the specified point radius" +msgstr "Enota merila za definiran radij točk" -#: superset/errors.py:110 -msgid "Either the database is spelled incorrectly or does not exist." -msgstr "Ime podatkovne baze je zapisano napačno ali pa ne obstaja." +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:153 +msgid "Labelling" +msgstr "Oznake" -#: superset/db_engine_specs/mysql.py:124 superset/db_engine_specs/presto.py:195 -#: superset/db_engine_specs/redshift.py:63 -#, python-format -msgid "Either the username \"%(username)s\" or the password is incorrect." -msgstr "Uporabniško ime \"%(username)s\" ali geslo sta napačna." +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:161 +msgid "label" +msgstr "oznaka" -#: superset/db_engine_specs/mssql.py:74 -#, python-format +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:163 msgid "" -"Either the username \"%(username)s\", password, or database name " -"\"%(database)s\" is incorrect." +"`count` is COUNT(*) if a group by is used. Numerical columns will be aggregated " +"with the aggregator. Non-numerical columns will be used to label points. Leave " +"empty to get a count of points in each cluster." msgstr "" -"Uporabniško ime \"%(username)s\", geslo ali ime podatkovne baze " -"\"%(database)s\" so napačni." +"`število` je COUNT(*), če je uporabljeno združevanje (group by). Numerični " +"stolpci bodo agregirani z agregatorjem. Ne-numerični stolpci, bodo uporabljeni za " +"oznake točk. Pustite prazno, da dobite število točk v posamezni gruči." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:114 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:118 -#, fuzzy, python-format -msgid "Either the username or password is incorrect." -msgstr "Uporabniško ime \"%(username)s\" ali geslo sta napačna." +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:180 +msgid "Cluster label aggregator" +msgstr "Agregator za oznako gruče" -#: superset/errors.py:109 -msgid "Either the username or the password is wrong." -msgstr "Uporabniško ime ali/in geslo sta napačna." +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:191 +msgid "" +"Aggregate function applied to the list of points in each cluster to produce the " +"cluster label." +msgstr "" +"Agregacijska funkcija za seznam točk v vsaki gruči, s katero se ustvari oznaka " +"gruče." -#: superset/views/schedules.py:326 -msgid "Email Format" -msgstr "Oblika e-pošte" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:201 +msgid "Visual Tweaks" +msgstr "Nastavitve izgleda" -#: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:64 -msgid "Email reports active" -msgstr "E-poštna poročila aktivna" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:208 +msgid "Live render" +msgstr "Sprotni izris" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:47 -msgid "Emit Target" -msgstr "Cilj oddajanja" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:210 +msgid "Points and clusters will update as the viewport is being changed" +msgstr "Točke in gruče se bodo posodabljale, če se bo spremenil pogled" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/emitFilterControl.tsx:30 -msgid "Emit dashboard cross filters" -msgstr "Oddajaj medsebojne filtre nadzorne plošče" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:221 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:370 +msgid "Map Style" +msgstr "Slog zemljevida" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/emitFilterControl.tsx:33 -msgid "Emit dashboard cross filters." -msgstr "Oddajaj medsebojne filtre nadzorne plošče." +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:236 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:382 +msgid "Base layer map style" +msgstr "Slog osnovnega sloja zemljevida" -#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:95 -msgid "Emitted values" -msgstr "Oddane vrednosti" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:245 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:115 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:211 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:671 +msgid "Opacity" +msgstr "Prosojnost" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:191 -msgid "Emphasis" -msgstr "Poudari" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:248 +msgid "Opacity of all clusters, points, and labels. Between 0 and 1." +msgstr "Prosojnost vseh gruč, točk in oznak (vrednost med 0 in 1)." -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:36 -msgid "Employment and education" -msgstr "Zaposlitev in izobrazba" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:260 +msgid "RGB Color" +msgstr "RGB barva" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:214 -msgid "Empty circle" -msgstr "Prazen krog" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:263 +msgid "The color for points and clusters in RGB" +msgstr "Barva točk in gruč v RGB zapisu" -#: superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:59 -msgid "Empty collection" -msgstr "Prazen izbor" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:270 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:293 +msgid "Viewport" +msgstr "Pogled" -#: superset/connectors/sqla/models.py:1068 -msgid "Empty query?" -msgstr "Prazna poizvedba?" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:278 +msgid "Default longitude" +msgstr "Privzeta dolžina" -#: superset/connectors/druid/views.py:348 superset/connectors/sqla/views.py:493 -msgid "Enable Filter Select" -msgstr "Omogoči izbiro filtra" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:282 +msgid "Longitude of default viewport" +msgstr "Dolžina privzetega pogleda" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:293 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:184 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:145 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:125 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:142 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:200 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:203 -msgid "Enable data zooming controls" -msgstr "Omogoči kontrolnik za povečavo podatkov" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:292 +msgid "Default latitude" +msgstr "Privzeta širina" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:44 -msgid "Enable forecast" -msgstr "Omogoči napoved" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:296 +msgid "Latitude of default viewport" +msgstr "Širina privzetega pogleda" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:47 -msgid "Enable forecasting" -msgstr "Omogoči napovedovanje" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:308 +msgid "Zoom" +msgstr "Povečava" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:161 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:270 -msgid "Enable graph roaming" -msgstr "Omogoči preoblikovanje grafikona" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:312 +msgid "Zoom level of the map" +msgstr "Stopnja povečave zemljevida" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:141 -msgid "Enable node dragging" -msgstr "Omogoči premikanje vozlišč" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:325 +msgid "" +"One or many controls to group by. If grouping, latitude and longitude columns " +"must be present." +msgstr "" +"Eden ali več kontrolnikov za združevanje. Pri združevanju morata biti prisotna " +"stolpca širine in dolžine." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:176 -msgid "Enable query cost estimation" -msgstr "Omogoči ocenjevanje potratnosti poizvedbe" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:30 +msgid "Light mode" +msgstr "Svetli način" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:290 -msgid "Enable server side pagination of results (experimental feature)" -msgstr "" -"Omogoči številčenje strani rezultatov na strani strežnika (preizkusna " -"funkcija)" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:31 +msgid "Dark mode" +msgstr "Temni način" -#: superset/viz.py:2530 -msgid "" -"Encountered invalid NULL spatial entry," -" please consider filtering those " -"out" -msgstr "" -"Prišlo je do neveljavnega NULL prostorskega vnosa," -" poskusite ga izločiti s filtrom" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:33 +msgid "MapBox" +msgstr "MapBox" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:164 -#: superset/views/annotations.py:80 -msgid "End" -msgstr "Konec" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:39 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:43 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:36 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:85 +msgid "Scatter" +msgstr "Raztreseni" -#: superset/views/sql_lab.py:73 -msgid "End Time" -msgstr "Končni čas" +#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:40 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:46 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:85 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:88 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:85 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:75 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:74 +msgid "Transformable" +msgstr "Prilagodljiv" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:120 -msgid "End angle" -msgstr "Končni kot" +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:64 +msgid "Significance Level" +msgstr "Stopnja značilnosti" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:78 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:171 -msgid "End date excluded from time range" -msgstr "Končni datum ni vključen v časovno obdobje" +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:66 +msgid "Threshold alpha level for determining significance" +msgstr "Mejna vrednost alfa za določanje značilnosti" -#: superset/annotation_layers/annotations/commands/exceptions.py:35 -msgid "End date must be after start date" -msgstr "Končni datum mora biti za začetnim" +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:77 +msgid "p-value precision" +msgstr "točnost p-vrednosti" -#: superset/databases/commands/validate.py:71 -#, python-format -msgid "Engine \"%(engine)s\" cannot be configured through parameters." -msgstr "Podatkovne baze tipa \"%(engine)s\" ni mogoče konfigurirati s parametri." +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:79 +msgid "Number of decimal places with which to display p-values" +msgstr "Število decimalnih mest za prikaz p-vrednosti" -#: superset/databases/commands/validate.py:59 superset/databases/schemas.py:308 -#, python-format -msgid "Engine \"%(engine)s\" is not a valid engine." -msgstr "\"%(engine)s\" ni veljaven tip podatkovne baze." +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:90 +msgid "Lift percent precision" +msgstr "Točnost procentualnega dviga" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:459 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:464 -msgid "Engine Parameters" -msgstr "Parametri podatkovne baze" +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:92 +msgid "Number of decimal places with which to display lift values" +msgstr "Število decimalnih mest za prikaz vrednosti dviga" -#: superset/databases/schemas.py:272 +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:26 msgid "" -"Engine spec \"InvalidEngine\" does not support being configured via " -"individual parameters." +"Table that visualizes paired t-tests, which are used to understand statistical " +"differences between groups." msgstr "" -"Specifikacija baze \"InvalidEngine\" ne podpira konfiguracije s " -"posameznimi parametri." - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:356 -msgid "Enter CA_BUNDLE" -msgstr "Vnesite CA_BUNDLE" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:55 -msgid "Enter a name for this sheet" -msgstr "Vnesite ime te preglednice" +"Tabela, ki prikazuje uparjene t-teste, ki se uporabljajo za prikaz statističnih " +"razlik med skupinami." -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:238 -msgid "Enter a new title for the tab" -msgstr "Vnesite novo naslov zavihka" +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:29 +msgid "Paired t-test Table" +msgstr "Tabela t-testa za odvisne vzorce" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:222 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:244 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:266 -msgid "Enter duration in seconds" -msgstr "Vnesite trajanje v sekundah" +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:30 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:55 +msgid "Statistical" +msgstr "Statistično" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:327 -msgid "Enter fullscreen" -msgstr "Vklopi celozaslonski način" +#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:30 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 +#: superset-frontend/plugins/plugin-chart-table/src/index.ts:50 +#: superset-frontend/src/visualizations/TimeTable/index.ts:35 +msgid "Tabular" +msgstr "Tabelarično" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:73 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:397 -#: superset-frontend/src/explore/controls.jsx:412 -msgid "Entity" -msgstr "Entiteta" +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:39 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:67 +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:109 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:73 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:39 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controlPanel.tsx:73 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:133 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:226 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:382 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:48 +#: superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx:67 +msgid "Options" +msgstr "Možnosti" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:125 -msgid "Entity ID" -msgstr "ID entitete" +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:47 +msgid "Data Table" +msgstr "Tabela podatkov" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:216 -msgid "Equal Date Sizes" -msgstr "Enaki datumi" +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:50 +msgid "Whether to display the interactive data table" +msgstr "Če želite prikaz interaktivne podatkovne tabele" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:56 -#, fuzzy -msgid "Error" -msgstr "Operator" +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:57 +msgid "Include Series" +msgstr "Vključi serijo" -#: superset/views/alerts.py:83 -msgid "Error Message" -msgstr "Sporočilo napake" +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:60 +msgid "Include series name as an axis" +msgstr "Vključi ime podatkovne serije v naslov osi" -#: superset/connectors/sqla/models.py:1349 -#, python-format -msgid "Error in jinja expression in HAVING clause: %(msg)s" -msgstr "Napaka v jinja izrazu HAVING stavka: %(msg)s" +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:25 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:28 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:48 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:33 +msgid "Ranking" +msgstr "Rangiranje" -#: superset/connectors/sqla/models.py:976 -#, python-format -msgid "Error in jinja expression in RLS filters: %(msg)s" -msgstr "Napaka v jinja izrazu RLS filtrov: %(msg)s" +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:27 +msgid "" +"Plots the individual metrics for each row in the data vertically and links them " +"together as a line. This chart is useful for comparing multiple metrics across " +"all of the samples or rows in the data." +msgstr "" +"Izriše posamezne mere za vsako vrstico podatkov navpično in jih med seboj poveže " +"kot črto. Grafikon je uporaben za primerjavo več mer med vsemi vzorci ali " +"vrsticami podatkov." -#: superset/connectors/sqla/models.py:1337 -#, python-format -msgid "Error in jinja expression in WHERE clause: %(msg)s" -msgstr "Napaka v jinja izrazu WHERE stavka: %(msg)s" +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:57 +msgid "Coordinates" +msgstr "Koordinate" -#: superset/connectors/sqla/models.py:735 -#, python-format -msgid "Error in jinja expression in fetch values predicate: %(msg)s" -msgstr "Napaka v jinja izrazu za pridobivanje vrednosti predikatov: %(msg)s" +#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:39 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:42 +msgid "Directional" +msgstr "Usmerjeni" -#: superset-frontend/src/dashboard/containers/DashboardPage.tsx:190 -msgid "Error loading chart datasources. Filters may not work correctly." -msgstr "" -"Napaka pri nalaganju podatkovnih virov grafikona. Filtri lahko ne " -"delujejo pravilno." +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:59 +msgid "Time Series Options" +msgstr "Možnosti časovne vrste" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:144 -msgid "Error message" -msgstr "Sporočilo napake" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:73 +msgid "Not Time Series" +msgstr "Ni časovna vrsta" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:104 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:139 -msgid "Error while fetching charts" -msgstr "Napaka pri pridobivanju grafikonov" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:75 +msgid "Ignore time" +msgstr "Ne upoštevaj časa" -#: superset-frontend/src/explore/components/controls/SelectAsyncControl/index.tsx:89 -#, fuzzy, python-format -msgid "Error while fetching data: %s" -msgstr "Napaka pri pridobivanju grafikonov" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:78 +msgid "Time Series" +msgstr "Časovna vrsta" -#: superset/connectors/sqla/models.py:842 -#, python-format -msgid "Error while rendering virtual dataset query: %(msg)s" -msgstr "Napaka pri izvajanju poizvedbe virtualnega podatkovnega seta: %(msg)s" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:80 +msgid "Standard time series" +msgstr "Standardna časovna vrsta" -#: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:91 -msgid "Estimate cost" -msgstr "Oceni potratnost" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:83 +msgid "Aggregate Mean" +msgstr "Agregirano povprečje" -#: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:90 -msgid "Estimate selected query cost" -msgstr "Oceni potratnost izbrane poizvedbe" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:85 +msgid "Mean of values over specified period" +msgstr "Povprečna vrednost v dani periodi" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:648 -msgid "Estimate the cost before running a query" -msgstr "Oceni potratnost pred zagonom poizvedbe" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:88 +msgid "Aggregate Sum" +msgstr "Agregirana vsota" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:29 -msgid "Event Flow" -msgstr "Potek dogodkov" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:90 +msgid "Sum of values over specified period" +msgstr "Vsota vrednosti v dani periodi" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:43 -msgid "Event Names" -msgstr "Imena dogodkov" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:93 +msgid "Difference" +msgstr "Razlika" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:35 -msgid "Event definition" -msgstr "Definicija dogodka" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:95 +msgid "Metric change in value from `since` to `until`" +msgstr "Sprememba mere od vrednosti \"OD\" do \"DO\"" -#: superset/viz.py:2896 -msgid "Event flow" -msgstr "Potek dogodkov" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:100 +msgid "Percent Change" +msgstr "Procentualna sprememba" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:478 -msgid "Event time column" -msgstr "Stolpec časa dogodka" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:102 +msgid "Metric percent change in value from `since` to `until`" +msgstr "Procentualna sprememba mere od vrednosti \"OD\" do \"DO\"" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:43 -msgid "Every" -msgstr "Vsak" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:107 +msgid "Factor" +msgstr "Faktor" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:30 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:29 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:25 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:25 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:30 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:25 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:25 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:56 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:59 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:58 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:57 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:57 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:48 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:57 -msgid "Evolution" -msgstr "Evolucija" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:109 +msgid "Metric factor change from `since` to `until`" +msgstr "Sprememba faktorja mere od vrednosti \"OD\" do \"DO\"" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1263 -#, fuzzy -msgid "Exact" -msgstr "Besedilo" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:114 +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:234 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:117 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:365 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:163 +msgid "Advanced Analytics" +msgstr "Napredna analitika" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:34 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:49 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:67 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:81 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:95 -msgid "Example" -msgstr "Primer" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:116 +msgid "Use the Advanced Analytics options below" +msgstr "Uporabite spodnje možnosti napredne analitike" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:92 -#, fuzzy, python-format -msgid "Example %(tableName)s will appear here" -msgstr "Primer ${tableName.toLowerCase()} se bo prikazal tukaj" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:125 +msgid "Settings for time series" +msgstr "Nastavitve časovne vrste" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:759 -#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:180 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:178 -msgid "Examples" -msgstr "Vzorci" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:155 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:79 +msgid "Date Time Format" +msgstr "Oblika zapisa Datum-Časa" -#: superset/views/database/forms.py:252 -msgid "Excel File" -msgstr "Excel-ova datoteka" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:168 +msgid "Partition Limit" +msgstr "Omejitev particij" -#: superset/views/database/views.py:398 -#, python-format +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:171 msgid "" -"Excel file \"%(excel_filename)s\" uploaded to table \"%(table_name)s\" in" -" database \"%(db_name)s\"" +"The maximum number of subdivisions of each group; lower values are pruned first" msgstr "" -"Excel datoteka \"%(excel_filename)s\" naložena v tabelo " -"\"%(table_name)s\" v podatkovni bazi \"%(db_name)s\"" +"Največje število podrazdelkov posamezne skupine; nižje vrednosti so zanemarjene " +"prve" -#: superset/views/database/views.py:268 -msgid "Excel to Database configuration" -msgstr "Nastavitve pretvorbe Excel v Podatkovno bazo" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:181 +msgid "Partition Threshold" +msgstr "Prag particije" -#: superset-frontend/src/filters/components/Select/controlPanel.ts:126 -msgid "Exclude selected values" -msgstr "Izloči izbrane vrednosti" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:184 +msgid "" +"Partitions whose height to parent height proportions are below this value are " +"pruned" +msgstr "" +"Particije z nižjim razmerjem med njihovo višino in dolžino starša so zanemarjene" -#: superset-frontend/src/SqlLab/components/HighlightedSql/index.tsx:82 -msgid "Executed SQL" -msgstr "Izvedena poizvedba" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:196 +msgid "Log Scale" +msgstr "Logaritemska skala" -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:162 -msgid "Executed query" -msgstr "Zagnana poizvedba" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:199 +msgid "Use a log scale" +msgstr "Uporabi logaritemsko skalo" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:105 -msgid "Execution ID" -msgstr "ID izvedbe" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:208 +msgid "Equal Date Sizes" +msgstr "Enaki datumi" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:307 -msgid "Execution log" -msgstr "Dnevnik izvajanja" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:211 +msgid "Check to force date partitions to have the same height" +msgstr "Če želite, da imajo datumske particije enako višino" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:326 -msgid "Exit fullscreen" -msgstr "Izhod iz celozaslonskega načina" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:222 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:92 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:281 +msgid "Rich Tooltip" +msgstr "Podroben opis orodja" -#: superset-frontend/src/dashboard/components/filterscope/treeIcons.jsx:36 -msgid "Expand all" -msgstr "Razširi vse" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:225 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:95 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:284 +msgid "The rich tooltip shows a list of all series for that point in time" +msgstr "" +"Podroben opis orodja prikaže seznam vseh podatkovnih serij za posamezno časovno " +"točko" -#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:152 -#, fuzzy -msgid "Expand table preview" -msgstr "Odstrani predogled tabele" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:243 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:126 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:373 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:167 +msgid "Rolling Window" +msgstr "Drseče okno" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:351 -msgid "Expand tool bar" -msgstr "Razširi orodno vrstico" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:249 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:132 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:379 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:173 +msgid "Rolling Function" +msgstr "Drseča funkcija" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:72 -#: superset-frontend/src/filters/components/GroupBy/index.ts:31 -#: superset-frontend/src/filters/components/Range/index.ts:31 -#: superset-frontend/src/filters/components/Select/index.ts:32 -#: superset-frontend/src/filters/components/Time/index.ts:31 -#: superset-frontend/src/filters/components/TimeColumn/index.ts:31 -#: superset-frontend/src/filters/components/TimeGrain/index.ts:31 -msgid "Experimental" -msgstr "Eksperimentalno" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:282 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:165 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:414 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:208 +msgid "Min Periods" +msgstr "Min. št. period" -#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:98 -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:168 -#: superset/views/core.py:883 -msgid "Explore" -msgstr "Raziskovanje" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:295 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:178 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:426 +msgid "Time Comparison" +msgstr "Časovna primerjava" -#: superset/views/core.py:881 -#, python-format -msgid "Explore - %(table)s" -msgstr "Razišči - %(table)s" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:303 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:186 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:434 +msgid "Time Shift" +msgstr "Časovni zamik" -#: superset/reports/notifications/email.py:91 -msgid "Explore in Superset" -msgstr "Razišči v Supersetu" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:369 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:252 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:497 +#: superset-frontend/src/explore/controlPanels/sections.tsx:251 +msgid "Method" +msgstr "Metoda" -#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:91 -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:161 -msgid "Explore the result set in the data exploration view" -msgstr "Raziščite rezultate v pogledu raziskovanja podatkov" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:25 +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:26 +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:29 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:51 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:33 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:50 +msgid "Part of a Whole" +msgstr "Del celote" -#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:116 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:388 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:661 -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:98 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:385 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:630 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:342 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:373 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:636 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:516 -#: superset/views/dashboard/views.py:67 -msgid "Export" -msgstr "Izvoz" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:26 +msgid "Compare the same summarized metric across multiple groups." +msgstr "Primerja isto mero med različnimi skupinami." -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:333 -msgid "Export CSV" -msgstr "Izvozi CSV" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:27 +msgid "Partition Chart" +msgstr "Grafikon razdelkov" -#: superset/views/dashboard/views.py:67 -msgid "Export dashboards?" -msgstr "Izvozim nadzorne plošče?" +#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:38 +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:42 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:42 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:66 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:41 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:59 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:42 +msgid "Categorical" +msgstr "Kategorični" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:341 -msgid "Export full CSV" -msgstr "Izvozi celoten CSV" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:46 +msgid "Pivot Options" +msgstr "Vrtilne možnosti" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:397 -msgid "Export query" -msgstr "Izvozi poizvedbe" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:53 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:142 +msgid "Aggregation function" +msgstr "Agregacijska funkcija" -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:202 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:210 -msgid "Export to .CSV format" -msgstr "Izvozi v .csv format" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:64 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:165 +msgid "" +"Aggregate function to apply when pivoting and computing the total rows and columns" +msgstr "Agregacijska funkcija za vrtenje in izračun vseh vrstic in stolpcev" -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:182 -msgid "Export to .JSON format" -msgstr "Izvozi v .json format" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:77 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/metrics.tsx:105 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:368 +msgid "Show totals" +msgstr "Pokaži vsote" -#: superset/views/base.py:538 -msgid "Export to YAML" -msgstr "Izvozi v YAML" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:79 +msgid "Display total row/column" +msgstr "Pokaži vsote vrstic/stolpcev" -#: superset/views/base.py:538 -msgid "Export to YAML?" -msgstr "Izvozim v YAML?" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:86 +msgid "Combine Metrics" +msgstr "Združuj mere" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:76 -msgid "Expose database in SQL Lab" -msgstr "Razkrij podatkovno bazo v SQL laboratoriju" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:88 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:215 +msgid "" +"Display metrics side by side within each column, as opposed to each column being " +"displayed side by side for each metric." +msgstr "" +"Prikazuj mere eno ob drugi ob vsakem stolpcu, drugače je vsak stolpec prikazan en " +"ob drugem za vsako mero." -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:281 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:387 -#: superset/views/database/mixins.py:186 -msgid "Expose in SQL Lab" -msgstr "Uporabi v SQL laboratoriju" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:100 +msgid "Transpose Pivot" +msgstr "Transponirano vrtenje" -#: superset/views/database/mixins.py:104 -msgid "Expose this DB in SQL Lab" -msgstr "Uporabi to podatkovno bazo v SQL laboratoriju" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:102 +msgid "Swap Groups and Columns" +msgstr "Zamenjaj Skupine in Stolpce" -#: superset/connectors/sqla/views.py:149 -msgid "Expression" -msgstr "Izraz" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:132 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:69 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:138 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:115 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:136 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:153 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:129 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:244 +msgid "Date format" +msgstr "Oblika zapisa datuma" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:735 -#: superset/connectors/sqla/views.py:262 superset/connectors/sqla/views.py:505 -#: superset/views/database/mixins.py:196 -msgid "Extra" -msgstr "Dodatno" +#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:27 +msgid "" +"Used to summarize a set of data by grouping together multiple statistics along " +"two axes. Examples: Sales numbers by region and month, tasks by status and " +"assignee, active users by age and location.\n" +"\n" +" This chart is being deprecated and we recommend checking out Pivot Table V2 " +"instead!" +msgstr "" +"Uporablja se za predstavitev podatkov z združevanjem različnih statistik na dveh " +"oseh. Npr. Prodaja po regijah in mesecih, Naloge po statusih in izvajalcih, " +"aktivni uporabniki po starosti in lokaciji.\n" +"\n" +" Ta grafikon se opušča. Priporočamo uporabo Vrtilne tabele V2!" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:160 -msgid "Extra Controls" -msgstr "Dodatni kontrolniki" +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:104 +#: superset-frontend/src/explore/controlUtils/controlUtils.test.tsx:112 +#: superset-frontend/src/explore/fixtures.tsx:42 +msgid "Use Area Proportions" +msgstr "Uporabi razmerje površin" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:87 -msgid "Extra Parameters" -msgstr "Dodatni parametri" +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:105 +#: superset-frontend/src/explore/controlUtils/controlUtils.test.tsx:113 +#: superset-frontend/src/explore/fixtures.tsx:43 +msgid "" +"Check if the Rose Chart should use segment area instead of segment radius for " +"proportioning" +msgstr "" +"Če želite, da grafikon \"Rose\" uporablja površino segmenta namesto radija za " +"proporcioniranje" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:736 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:26 msgid "" -"Extra data to specify table metadata. Currently supports metadata of the " -"format: `{ \"certification\": { \"certified_by\": \"Data Platform Team\"," -" \"details\": \"This table is the source of truth.\" }, " -"\"warning_markdown\": \"This is a warning.\" }`." +"A polar coordinate chart where the circle is broken into wedges of equal angle, " +"and the value represented by any wedge is illustrated by its area, rather than " +"its radius or sweep angle." msgstr "" -"Dodatni podatki za tabelo metapodatkov. Trenutno je podprta naslednja " -"oblika zapisa metapodatkov: `{ \"certification\": { \"certified_by\": " -"\"Tim za razvoj\", \"details\": \"Ta tabela je vir resnice.\" }, " -"\"warning_markdown\": \"To je opozorilo.\" }`." +"Grafikon s polarnimi koordinatami, kjer je krog razdeljen na enakokotne izseke, " +"vrednosti pa so ponazorjene s ploščino izseka (namesto polmera ali kota)." -#: superset/views/database/mixins.py:244 superset/views/database/mixins.py:268 -#, python-format -msgid "Extra field cannot be decoded by JSON. %(msg)s" -msgstr "Dodatnega polja ni mogoče dekodirati z JSON. %(msg)s" +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:29 +msgid "Nightingale Rose Chart" +msgstr "Nightingale Rose grafikon" -#: superset-frontend/src/explore/controlPanels/sections.tsx:62 -msgid "Extra parameters for use in jinja templated queries" -msgstr "Dodatni parametri za poizvedbe z jinja predlogami" +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:32 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:35 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:38 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:78 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:77 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:85 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:72 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:69 +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:128 +msgid "Advanced-Analytics" +msgstr "Napredna analitika" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:89 +#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:34 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:41 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/index.js:31 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:37 +msgid "Multi-Layers" +msgstr "Večplastni" + +#: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:43 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:33 +msgid "Source / Target" +msgstr "Izhodišče/Cilj" + +#: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:44 +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:34 +msgid "Choose a source and a target" +msgstr "Izberite izhodišče in cilj" + +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:44 msgid "" -"Extra parameters that any plugins can choose to set for use in Jinja " -"templated queries" +"Limiting rows may result in incomplete data and misleading charts. Consider " +"filtering or grouping source/target names instead." msgstr "" -"Dodatni parametri, ki jih lahko uporabi kateri koli vtičnik za poizvedbe " -"z Jinja predlogami" +"Omejitev vrstic lahko povzroči nepopolne podatke in zavajajoč grafikon. " +"Premislite o uporabi filtriranja ali združevanja imen izvorov/ciljev." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:78 -msgid "Extra url parameters for use in Jinja templated queries" -msgstr "Dodatni parametri za poizvedbe z Jinja predlogami" +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:29 +msgid "" +"Visualizes the flow of different group's values through different stages of a " +"system. New stages in the pipeline are visualized as nodes or layers. The " +"thickness of the bars or edges represent the metric being visualized." +msgstr "" +"Prikaže potek vrednosti različnih skupin na različnih nivojih sistema. Novi " +"nivoji so prikazani kot točke ali plasti. Debelina stolpcev ali povezav " +"predstavlja prikazano mero." -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:92 -msgid "FEB" -msgstr "FEB" +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:33 +msgid "Demographics" +msgstr "Demografija" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:86 -msgid "FRI" -msgstr "PET" +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:34 +msgid "Survey Responses" +msgstr "Rezultati anket" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:115 -msgid "Factor" -msgstr "Faktor" +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:36 +msgid "Sankey Diagram" +msgstr "Sankey grafikon" -#: superset/views/database/forms.py:145 superset/views/database/forms.py:298 -#: superset/views/database/forms.py:426 -msgid "Fail" -msgstr "Prekini" +#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:41 +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:49 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:43 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:38 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:46 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:43 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:41 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:69 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:63 +#: superset-frontend/src/visualizations/TimeTable/index.ts:34 +msgid "Percentages" +msgstr "Procenti" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:69 -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:75 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:153 -msgid "Failed" -msgstr "Ni uspelo" +#: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/index.js:27 +msgid "Sankey Diagram with Loops" +msgstr "Sankey grafikon z zankami" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:194 -#: superset-frontend/src/SqlLab/actions/sqlLab.js:305 -msgid "Failed at retrieving results" -msgstr "Napaka pri pridobivanju rezultatov" +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:60 +msgid "Primary Metric" +msgstr "Primarna mera" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:409 -#, python-format -msgid "Failed at stopping query. %s" -msgstr "" +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:61 +msgid "The primary metric is used to define the arc segment sizes" +msgstr "Primarna mera določa velikost lokov segmentov" -#: superset/errors.py:137 superset/sqllab/sql_json_executer.py:194 -msgid "Failed to start remote query on a worker." -msgstr "Na delavcu ni bilo mogoče zagnati oddaljene poizvedbe." +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:66 +msgid "Secondary Metric" +msgstr "Sekundarna mera" -#: superset-frontend/src/explore/components/controls/withAsyncVerification.tsx:201 -#, python-format -msgid "Failed to verify select options: %s" -msgstr "Preverjanje možnosti izbire ni uspelo: %s" +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:68 +msgid "" +"[optional] this secondary metric is used to define the color as a ratio against " +"the primary metric. When omitted, the color is categorical and based on labels" +msgstr "" +"[opcijsko] sekundarna mera določa barvo kot razmerje do primarne mere. Če je " +"izpuščena, je barva določena kategorično na podlagi oznak" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:436 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:433 -#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:162 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:159 -msgid "Favorite" -msgstr "Priljubljene" +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:75 +msgid "When only a primary metric is provided, a categorical color scale is used." +msgstr "" +"Če je podana samo primarna metrika, je uporabljena kategorična barvna skala." -#: superset-frontend/src/profile/components/App.tsx:52 -msgid "Favorites" -msgstr "Priljubljene" +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:85 +msgid "When a secondary metric is provided, a linear color scale is used." +msgstr "Če je podana sekundarna metrika, je uporabljena linearna barvna skala." -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:67 -msgid "February" -msgstr "Februar" +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:95 +msgid "Hierarchy" +msgstr "Hierarhija" -#: superset/connectors/druid/views.py:353 -msgid "Fetch Values From" -msgstr "Pridobi vrednosti iz" +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:96 +msgid "This defines the level of the hierarchy" +msgstr "Določa stopnjo hierarhije" -#: superset/connectors/sqla/views.py:499 -msgid "Fetch Values Predicate" -msgstr "Pridobi vrednosti predikatov" +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:28 +msgid "" +"Uses circles to visualize the flow of data through different stages of a system. " +"Hover over individual paths in the visualization to understand the stages a value " +"took. Useful for multi-stage, multi-group visualizing funnels and pipelines." +msgstr "" +"S pomočjo krogov prikaže potek podatkov na različnih nivojih sistema. S premikom " +"kurzorja prikaže vrednosti na posameznem nivoju. Uporabno za večnivojsko, " +"večskupinsko vizualizacijo." -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:788 -msgid "Fetch data preview" -msgstr "Pridobi predogled podatkov" +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:32 +msgid "Sunburst Chart" +msgstr "Večnivojski tortni grafikon" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:244 -#, python-format -msgid "Fetched %s" -msgstr "Pridobljeno %s" +#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:44 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:43 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:62 +msgid "Multi-Levels" +msgstr "Večplastni" -#: superset/databases/commands/exceptions.py:62 -#, fuzzy, python-format -msgid "Field cannot be decoded by JSON. %(json_error)s" -msgstr "Polja ni mogoče dekodirati z JSON. %{json_error}s" +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:53 +msgid "Ratio" +msgstr "Razmerje" -#: superset/databases/schemas.py:183 superset/databases/schemas.py:198 -#, python-format -msgid "Field cannot be decoded by JSON. %(msg)s" -msgstr "Polja ni mogoče dekodirati z JSON. %(msg)s" +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:57 +msgid "Target aspect ratio for treemap tiles." +msgstr "Ciljno razmerje za razdelke drevesnega grafikona." -#: superset/databases/commands/exceptions.py:50 -msgid "Field is required" -msgstr "Polje je obvezno" +#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:31 +msgid "" +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " +"query." +msgstr "" +"Prikaže zgradbo podatkovnega seta na podlagi segmentacije danega pravokotnika na " +"manjše pravokotnike, pri čemer je ploščina sorazmerna vrednostim oz. deležem. " +"Pravokotniki se lahko dodatno hierarhično segmentirajo." -#: superset/templates/superset/import_dashboards.html:37 -msgid "File" -msgstr "Datoteka" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:40 +msgid "Country Field Type" +msgstr "Tip polja za države" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:982 -msgid "Fill all required fields to enable \"Default Value\"" -msgstr "Izpolnite vsa polja, da omogočite \"Privzeto vrednost\"" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:48 +msgid "" +"The country code standard that Superset should expect to find in the [country] " +"column" +msgstr "Standard za oznake držav, ki bodo podane v stolpcu z državami" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:166 -msgid "Fill method" -msgstr "Način polnjenja" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:81 +msgid "Show Bubbles" +msgstr "Prikaži mehurčke" -#: superset-frontend/src/components/ListView/Filters/Select.tsx:77 -msgid "Filter" -msgstr "Filter" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:84 +msgid "Whether to display bubbles on top of countries" +msgstr "Če želite prikaz mehurčkov nad državami" -#: superset/templates/appbuilder/general/widgets/search.html:24 -msgid "Filter List" -msgstr "Seznam filtrov" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:95 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:59 +msgid "Max Bubble Size" +msgstr "Max. velikost mehurčka" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:787 -msgid "Filter Type" -msgstr "Tip filtra" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:115 +msgid "Color by" +msgstr "Barva glede na" -#: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:26 -msgid "Filter box" -msgstr "Izbirnik za filtriranje" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:121 +msgid "" +"Choose whether a country should be shaded by the metric, or assigned a color " +"based on a categorical color palette" +msgstr "" +"Izberite, če želite barvanje držav glede na mero ali kategorično določeno barvno " +"paleto" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "Filtriraj po podatkovni bazi" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:134 +msgid "Country Column" +msgstr "Stolpec z državami" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "Filtriraj po statusu" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:135 +msgid "3 letter code of the country" +msgstr "Tričrkovna oznaka države" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "Filtriraj po uporabniku" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:139 +msgid "Metric that defines the size of the bubble" +msgstr "Mera, ki določa velikost mehurčka" -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 -msgid "Filter configuration" -msgstr "Nastavitve filtra" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:142 +msgid "Bubble Color" +msgstr "Barva mehurčka" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:66 -msgid "Filter configuration for the filter box" -msgstr "Nastavitve za polje filtra" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:145 +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:150 +msgid "Country Color Scheme" +msgstr "Barvna shema držav" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:895 -msgid "Filter has default value" -msgstr "Filter ima privzeto vrednost" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:29 +msgid "A map of the world, that can indicate values in different countries." +msgstr "Zemljevid sveta, ki lahko prikazuje vrednosti po državah." -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1010 -msgid "Filter is hierarchical" -msgstr "Filter je hierarhičen" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:40 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:36 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:32 +msgid "Multi-Dimensions" +msgstr "Večdimenzionalni" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:109 -msgid "Filter metadata changed in dashboard. It will not be applied." -msgstr "Metapodatki filtra so se spremenili v nadzorni plošči. Ne bo uveljavljen." +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:42 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:32 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:44 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:58 +#: superset-frontend/src/visualizations/TimeTable/index.ts:31 +msgid "Multi-Variables" +msgstr "Več spremenljivk" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:777 -msgid "Filter name" -msgstr "Ime filtra" +#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:44 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:47 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:44 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:42 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:70 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:92 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:85 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:86 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 +#: superset-frontend/plugins/plugin-chart-table/src/index.ts:47 +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:128 +msgid "Popular" +msgstr "Priljubljeni" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:563 -msgid "Filter results" -msgstr "Filtriraj rezultate" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/controlPanel.js:37 +msgid "deck.gl charts" +msgstr "grafikoni deck.gl" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:144 -msgid "Filter set already exists" -msgstr "Set filtrov že obstaja" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/controlPanel.js:40 +msgid "Pick a set of deck.gl charts to layer on top of one another" +msgstr "Izberite nabor deck.gl grafikonov, ki bodo nanizani en na drugem" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:143 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:83 -msgid "Filter set with this name already exists" -msgstr "Set filtrov z enakim imenom že obstaja" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/controlPanel.js:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:103 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:138 +msgid "Select charts" +msgstr "Izberi grafikone" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx:348 -#, python-format -msgid "Filter sets (%(filterSetCount)d)" -msgstr "" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/controlPanel.js:46 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:104 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:139 +msgid "Error while fetching charts" +msgstr "Napaka pri pridobivanju grafikonov" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:791 -msgid "Filter type" -msgstr "Tip filtra" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/index.js:27 +msgid "Compose multiple layers together to form complex visuals." +msgstr "Združi več plasti za oblikovanje kompleksnih vizualizacij." + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/index.js:28 +msgid "deck.gl Multiple Layers" +msgstr "deck.gl - večplastni grafikon" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/index.js:31 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/index.js:31 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:34 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:34 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:34 +msgid "deckGL" +msgstr "deckGL" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/components/PlaySlider.jsx:182 +msgid "Data has no time steps" +msgstr "Podatki nimajo časovnih korakov" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:52 +msgid "Start Longitude & Latitude" +msgstr "Začetna Dolž. in Širina" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:54 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:66 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:309 +msgid "Point to your spatial columns" +msgstr "Pokažite na stolpec z lokacijskimi podatki" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:64 +msgid "End Longitude & Latitude" +msgstr "Končna Dolž. in Širina" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:85 +msgid "Arc" +msgstr "Lok" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:92 +msgid "Target Color" +msgstr "Ciljna barva" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:93 +msgid "Color of the target location" +msgstr "Barva ciljne lokacije" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:105 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:142 +msgid "Categorical Color" +msgstr "Kategorična barva" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:106 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:143 +msgid "Pick a dimension from which categorical colors are defined" +msgstr "Izberite dimenzijo, ki bo določala kategorične barve" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:119 +msgid "Stroke Width" +msgstr "Debelina obrobe" + +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/controlPanel.ts:132 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/controlPanel.ts:91 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts:58 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:90 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/controlPanel.ts:76 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:182 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:153 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts:62 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:925 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:607 +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:34 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1375 +msgid "Advanced" +msgstr "Napredno" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:417 -msgid "Filter value (case sensitive)" -msgstr "Vrednost filtra (razlik. velikih/malih črk)" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:27 +msgid "Plot the distance (like flight paths) between origin and destination." +msgstr "Izriši razdalje (kot letalske koridorje) med izhodiščem in ciljem." -#: superset/connectors/sqla/models.py:1278 -msgid "Filter value list cannot be empty" -msgstr "Seznam vrednosti filtra ne sme biti prazen" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:30 +msgid "deck.gl Arc" +msgstr "deck.gl - grafikon lokov" -#: superset-frontend/src/dashboard/components/SliceAdder.jsx:245 -msgid "Filter your charts" -msgstr "Filtriraj grafikone" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:35 +msgid "3D" +msgstr "3D" -#: superset/connectors/druid/views.py:95 superset/connectors/sqla/views.py:147 -msgid "Filterable" -msgstr "Filtriranje" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Arc/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/index.js:31 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:60 +msgid "Web" +msgstr "Mreža" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:82 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:459 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx:103 -#: superset-frontend/src/explore/controls.jsx:466 superset/viz.py:2105 -msgid "Filters" -msgstr "Filtri" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/controlPanel.ts:68 +msgid "GeoJson Settings" +msgstr "GeoJson nastavitve" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:84 -#, python-format -msgid "Filters (%d)" -msgstr "Filtri (%d)" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/controlPanel.ts:80 +msgid "Point Radius Scale" +msgstr "Skaliranje radija točk" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:134 -msgid "Filters by columns" -msgstr "Filtrira po stolpcu" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/index.js:27 +msgid "" +"The GeoJsonLayer takes in GeoJSON formatted data and renders it as interactive " +"polygons, lines and points (circles, icons and/or texts)." +msgstr "" +"GeoJsonLayer uporablja podatke v formatu GeoJSON in jih izriše kot interaktivne " +"poligone, črte in točke (krogi, ikone in/ali besedila)." -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:136 -msgid "Filters by metrics" -msgstr "Filtrira po merah" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Geojson/index.js:30 +msgid "deck.gl Geojson" +msgstr "deck.gl - GeoJson grafikon" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:57 -msgid "Filters configuration" -msgstr "Nastavitve filtrov" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts:69 +msgid "Height" +msgstr "Višina" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx:467 -msgid "Filters configuration and scoping" -msgstr "Nastavitve in doseg filtrov" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/controlPanel.ts:70 +msgid "Metric used to control height" +msgstr "Mera za določanje višine" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx:159 -#, python-format -msgid "Filters out of scope (%d)" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:27 +msgid "" +"Visualize geospatial data like 3D buildings, landscapes, or objects in grid view." msgstr "" +"Prikaz geoprostorskih podatkov kot so 3D zgradbe, parcele ali objekti v mrežnem " +"pogledu." -#: superset/connectors/sqla/views.py:348 -msgid "" -"Filters with the same group key will be ORed together within the group, " -"while different filter groups will be ANDed together. Undefined group " -"keys are treated as unique groups, i.e. are not grouped together. For " -"example, if a table has three filters, of which two are for departments " -"Finance and Marketing (group key = 'department'), and one refers to the " -"region Europe (group key = 'region'), the filter clause would apply the " -"filter (department = 'Finance' OR department = 'Marketing') AND (region =" -" 'Europe')." -msgstr "" -"Filtri z enakim skupinskim ključem bodo znotraj skupine združeni z OR " -"funkcijo, medtem ko bodo različne skupine združene z AND funkcijo. " -"Nedefinirani skupinski ključi so obravnavani kot unikatne skupine in niso" -" združeni v svojo skupino. Npr., če ima tabela tri filtre, pri čemer sta " -"dva za oddelka marketinga in financ (skupinski ključ = 'oddelek') tretji " -"pa se nanaša na regijo Evropa (skupinski ključ = 'regija'), bo filtrski " -"izraz (oddelek = 'Finance' OR oddelek = 'Marketing') AND (regija = " -"'Evropa')." - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:794 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:808 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1193 -msgid "Finish" -msgstr "Končaj" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:30 +msgid "deck.gl Grid" +msgstr "deck.gl - grafikon mreže" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:124 -msgid "" -"Fix the trend line to the full time range specified in case filtered " -"results do not include the start or end dates" -msgstr "" -"Trendno črto nastavite na izbrano obdobje, v primeru, da filtrirani " -"rezultati ne vsebujejo začetnega in/ali končnega datuma" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Grid/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:33 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:38 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:37 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:81 +#: superset-frontend/src/filters/components/GroupBy/index.ts:31 +#: superset-frontend/src/filters/components/Range/index.ts:31 +#: superset-frontend/src/filters/components/Select/index.ts:32 +#: superset-frontend/src/filters/components/Time/index.ts:31 +#: superset-frontend/src/filters/components/TimeColumn/index.ts:31 +#: superset-frontend/src/filters/components/TimeGrain/index.ts:31 +msgid "Experimental" +msgstr "Eksperimentalno" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:123 -msgid "Fix to selected Time Range" -msgstr "Nastavi na izbrano časovno obdobje" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:63 +msgid "Dynamic Aggregation Function" +msgstr "Dinamična agregacijska funkcija" -#: superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx:149 -msgid "Fixed" -msgstr "Fiksno" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/controlPanel.ts:64 +msgid "The function to use when aggregating points into groups" +msgstr "Funkcija za agregacijo točk v skupine" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:175 -msgid "Fixed Color" -msgstr "Izbrana barva" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:27 +msgid "" +"Overlays a hexagonal grid on a map, and aggregates data within the boundary of " +"each cell." +msgstr "" +"Prikaže šestkotno mrežo na zemljevidu in agregira podatke znotraj meja vsake " +"celice." -#: superset-frontend/src/explore/controls.jsx:206 -msgid "Fixed color" -msgstr "Izbrana barva" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Hex/index.js:30 +msgid "deck.gl 3D Hexagon" +msgstr "deck.gl - grafikon 3D šestkotnikov" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:26 -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:24 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:27 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:32 -msgid "Flow" -msgstr "Potek" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/index.js:27 +msgid "Visualizes connected points, which form a path, on a map." +msgstr "Na zemljevidu prikaže povezane točke, ki tvorijo pot." -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:133 -msgid "Font size" -msgstr "Velikost pisave" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Path/index.js:28 +msgid "deck.gl Path" +msgstr "deck.gl - grafikon poti" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:134 -msgid "Font size for axis labels, detail value and other text elements" -msgstr "Velikost pisave za oznake osi, podrobnosti in druge besedilne elemente" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:64 +msgid "Polygon Column" +msgstr "Stolpec poligonov" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:71 -msgid "Font size for the biggest value in the list" -msgstr "Velikost pisave za največjo vrednost na seznamu" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:73 +msgid "Polygon Encoding" +msgstr "Kodiranje poligonov" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:60 -msgid "Font size for the smallest value in the list" -msgstr "Velikost pisave za najmanjšo vrednost na seznamu" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:84 +msgid "Elevation" +msgstr "Višina" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 -msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " -"query." -msgstr "" -"Za Presto in Postgres prikaže gumb za izračun potratnosti pred zagonom " -"poizvedbe." +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:102 +msgid "Polygon Settings" +msgstr "Nastavitve poligonov" -#: superset/connectors/sqla/views.py:342 -msgid "" -"For regular filters, these are the roles this filter will be applied to. " -"For base filters, these are the roles that the filter DOES NOT apply to, " -"e.g. Admin if admin should see all data." -msgstr "" -"Za regularne filtre so te vloge tiste, ki bodo filtrirane. Za osnovne " -"filtre, so te vloge tiste, ki NE bodo filtrirane, npr. Admin, če naj " -"administrator vidi vse podatke." +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:121 +msgid "Opacity, expects values between 0 and 100" +msgstr "Prosojnost, vnesite vrednosti med 0 in 100" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:111 -msgid "Force" -msgstr "Sila" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:132 +msgid "Number of buckets to group data" +msgstr "Število razdelkov za združevanje podatkov" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:129 -msgid "" -"Force all tables and views to be created in this schema when clicking " -"CTAS or CVAS in SQL Lab." -msgstr "" -"Vsilite, da bodo vse tabele in pogledi ustvarjeni s to shemo, ko kliknete" -" CTAS ali CVAS v SQL laboratoriju." +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:135 +msgid "How many buckets should the data be grouped in." +msgstr "V koliko razdelkov bodo razvrščeni podatki." -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:270 -msgid "Force refresh" -msgstr "Osveži" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:145 +msgid "Bucket break points" +msgstr "Točke za razčlenitev razdelkov" -#: superset-frontend/src/components/DatabaseSelector/index.tsx:287 -msgid "Force refresh schema list" -msgstr "Osveži seznam shem" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:147 +msgid "List of n+1 values for bucketing metric into n buckets." +msgstr "Seznam n+1 vrednosti za mero razvrščanja v n razdelkov." -#: superset-frontend/src/components/TableSelector/index.tsx:317 -msgid "Force refresh table list" -msgstr "Osveži seznam tabel" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:159 +msgid "Emit Filter Events" +msgstr "Oddajaj dogodke filtrov" -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/index.js:27 -msgid "Force-directed Graph" -msgstr "Graf usmerjenih sil" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:162 +msgid "Whether to apply filter when items are clicked" +msgstr "Če želite uporabiti filter, ko kliknete na elemente" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:56 -msgid "Forecast periods" -msgstr "Periode napovedi" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:169 +msgid "Multiple filtering" +msgstr "Večkratno filtriranje" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:37 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:42 -#: superset-frontend/plugins/plugin-chart-table/src/index.ts:45 -msgid "Formattable" -msgstr "Prilagodljiv" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/controlPanel.ts:172 +msgid "Allow sending multiple polygons as a filter event" +msgstr "Dovoli pošiljanje več poligonov kot dogodek filtra" -#: superset-frontend/src/components/ReportModal/index.tsx:296 -msgid "Formatted CSV attached in email" -msgstr "Oblikovan CSV pripet e-pošti" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:27 +msgid "" +"Visualizes geographic areas from your data as polygons on a Mapbox rendered map. " +"Polygons can be colored using a metric." +msgstr "" +"Prikaže geografsko območje kot poligone na zemljevidu zagotovljenim preko " +"storitve Mapbox. Poligoni so lahko obarvani glede na mero." -#: superset-frontend/packages/superset-ui-core/src/query/extractQueryFields.ts:130 -msgid "Found invalid orderby options" -msgstr "Najdene so neveljavne možnosti razvrščanja" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Polygon/index.js:30 +msgid "deck.gl Polygon" +msgstr "deck.gl - grafikon poligonov" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:80 -msgid "Fraction digits" -msgstr "Število decimalk" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:71 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:320 +msgid "Point Size" +msgstr "Velikost točke" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:53 -msgid "Frequency" -msgstr "Frekvenca" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:79 +msgid "Point Unit" +msgstr "Enota točke" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:304 -msgid "Friction" -msgstr "Trenje" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:101 +msgid "Minimum Radius" +msgstr "Min. polmer" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:310 -msgid "Friction between nodes" -msgstr "Trenje med vozlišči" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:106 +msgid "" +"Minimum radius size of the circle, in pixels. As the zoom level changes, this " +"insures that the circle respects this minimum radius." +msgstr "" +"Minimalni polmer kroga v pikslih. S tem je določen minimalni polmer kroga, ko se " +"spreminja stopnja povečave." -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:61 -msgid "Friday" -msgstr "Petek" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:116 +msgid "Maximum Radius" +msgstr "Max. polmer" -#: superset/utils/date_parser.py:264 superset/viz.py:370 -msgid "From date cannot be larger than to date" -msgstr "Začetni datum ne sme biti večji od končnega datuma" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:121 +msgid "" +"Maxium radius size of the circle, in pixels. As the zoom level changes, this " +"insures that the circle respects this maximum radius." +msgstr "" +"Maksimalni polmer kroga v pikslih. S tem je določen maksimalni polmer kroga, ko " +"se spreminja stopnja povečave." -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:52 -msgid "Funnel Chart" -msgstr "Lijakasti grafikon" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/controlPanel.ts:132 +msgid "Point Color" +msgstr "Barva točke" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:454 -msgid "Further customize how to display each column" -msgstr "Dodatne prilagoditve prikaza posameznih stolpcev" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:27 +msgid "" +"A map that takes rendering circles with a variable radius at latitude/longitude " +"coordinates" +msgstr "" +"Zemljevid, ki na zemljepisnih koordinatah prikazuje kroge s spremenljivim polmerom" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:168 -msgid "Further customize how to display each metric" -msgstr "Dodatne prilagoditve prikaza posameznih mer" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Scatter/index.js:30 +msgid "deck.gl Scatterplot" +msgstr "deck.gl - raztreseni grafikon" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:42 -msgid "Gauge Chart" -msgstr "Števčni grafikon" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts:57 +msgid "Grid" +msgstr "Mreža" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:78 -msgid "General" -msgstr "Splošno" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts:73 +msgid "Weight" +msgstr "Utež" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:34 -msgid "Geo" -msgstr "Geo" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/controlPanel.ts:74 +msgid "Metric used as a weight for the grid's coloring" +msgstr "Mera, ki služi kot utež za barvo mreže" -#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:203 -msgid "Geohash" -msgstr "Geohash" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:27 +msgid "" +"Aggregates data within the boundary of grid cells and maps the aggregated values " +"to a dynamic color scale" +msgstr "" +"Agregira podatke znotraj meja celic in agregirane vrednosti ponazori z dinamično " +"barvno lestvico" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:75 -msgid "Get the last date by the date unit." -msgstr "Pridobi zadnji datum glede na časovno enoto." +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/layers/Screengrid/index.js:30 +msgid "deck.gl Screen Grid" +msgstr "deck.gl - grafikon mreže" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:88 -msgid "Get the specify date for the holiday" -msgstr "Določi datum praznika" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:45 +msgid "" +"For more information about objects are in context in the scope of this function, " +"refer to the" +msgstr "Za dodatne informacije o objektih v kontekstu te funkcije si oglejte" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:47 -msgid "Google Sheet Name and URL" -msgstr "Ime Googlove preglednice in URL" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:48 +msgid " source code of Superset's sandboxed parser" +msgstr " izvorno kodo za Supersetov \"sandboxed parser\"" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1275 -msgid "Grace period" -msgstr "Obdobje mirovanja" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:75 +msgid "This functionality is disabled in your environment for security reasons." +msgstr "Ta funkcionalnost je v vašem okolju onemogočena zaradi varnosti." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:37 -msgid "Graph Chart" -msgstr "Graf" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:87 +msgid "Ignore null locations" +msgstr "Izpusti prazne lokacije" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:108 -msgid "Graph layout" -msgstr "Izgled grafikona" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:89 +msgid "Whether to ignore locations that are null" +msgstr "Če ne želite upoštevati praznih (NULL) lokacij" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:262 -msgid "Gravity" -msgstr "Gravitacija" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:97 +msgid "Auto Zoom" +msgstr "Samodejna povečava" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:299 -#: superset-frontend/src/filters/components/GroupBy/index.ts:28 -msgid "Group By" -msgstr "Združevanje (Group by)" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:100 +msgid "When checked, the map will zoom to your data after each query" +msgstr "Če želite, da se zemljevid prilagodi vašim podatkom po vsaki poizvedbi" -#: superset-frontend/src/filters/components/GroupBy/index.ts:29 -msgid "Group By filter plugin" -msgstr "Vtičnik za filter za združevanje" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:110 +msgid "Dimension" +msgstr "Dimenzija" -#: superset/viz.py:895 -msgid "Group By' and 'Columns' can't overlap" -msgstr "'Združevanje' in 'Stolpci' se ne smeta prekrivati" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:111 +msgid "Select a dimension" +msgstr "Izberite dimenzijo" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:83 -msgid "Group By, Metrics or Percentage Metrics must have a value" -msgstr "Združevanje, Mera ali Procentualna mera morajo imeti vrednost" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:121 +msgid "Extra data for JS" +msgstr "Dodatni podatki za JS" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:31 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:99 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:42 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:299 -#: superset-frontend/src/explore/controls.jsx:123 -msgid "Group by" -msgstr "Združevanje (Group by)" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:123 +msgid "List of extra columns made available in Javascript functions" +msgstr "Seznam dodatnih podatkov, ki so na razpolago v Javascript funkcijah" -#: superset/connectors/druid/views.py:94 superset/connectors/sqla/views.py:146 -msgid "Groupable" -msgstr "Združevanje" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:132 +msgid "Javascript data interceptor" +msgstr "Javascript prestreznik podatkov" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:238 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:133 msgid "" -"Hard value bounds applied for color coding. Is only relevant and applied " -"when the normalization is applied against the whole heatmap." +"Define a javascript function that receives the data array used in the " +"visualization and is expected to return a modified version of that array. This " +"can be used to alter properties of the data, filter, or enrich the array." msgstr "" -"Mejne vrednosti za barvno lestvico. Upošteva se le, če je normiranje " -"uporabljeno glede na celotni toplotni prikaz." +"Določite Javascript funkcijo, ki sprejme podatkovni niz za vizualizacijo in vrne " +"spremenjeno verzijo tega niza. Lahko se uporabi za spreminjanje lastnosti " +"podatkov, filtra ali obogatitve niza." -#: superset-frontend/src/dashboard/components/gridComponents/new/NewHeader.jsx:31 -msgid "Header" -msgstr "Glava" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:144 +msgid "Javascript tooltip generator" +msgstr "Javascript generator opisa orodja" -#: superset/views/database/forms.py:152 superset/views/database/forms.py:305 -msgid "Header Row" -msgstr "Naslovna vrstica" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:145 +msgid "" +"Define a function that receives the input and outputs the content for a tooltip" +msgstr "Določite funkcijo, ki sprejme vhodne podatke in vrne vsebino opisa orodja" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:38 -#: superset/viz.py:2212 -msgid "Heatmap" -msgstr "Toplotni prikaz" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:154 +msgid "Javascript onClick href" +msgstr "Javascript onClick href" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:104 -msgid "Heatmap Options" -msgstr "Možnosti toplotnega prikaza" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:155 +msgid "Define a function that returns a URL to navigate to when user clicks" +msgstr "Določite funkcijo, ki vrne URL za navigacijo, ko uporabnik klikne" -#: superset-frontend/src/explore/components/EmbedCodeButton.jsx:116 -msgid "Height" -msgstr "Višina" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:162 +msgid "Legend Format" +msgstr "Oblika legende" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:730 -msgid "Hide layer" -msgstr "Skrij sloj" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:163 +msgid "Choose the format for legend values" +msgstr "Izberite obliko vrednosti legende" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:351 -msgid "Hide tool bar" -msgstr "Skrij orodno vrstico" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:176 +msgid "Legend Position" +msgstr "Položaj legende" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:81 -msgid "Hierarchy" -msgstr "Hierarhija" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:177 +msgid "Choose the position of the legend" +msgstr "Izberite položaj legende" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:37 -#: superset/viz.py:1711 -msgid "Histogram" -msgstr "Histogram" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:196 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/sharedDndControls.jsx:27 +msgid "Lines column" +msgstr "Stolpec črt" -#: superset/initialization/__init__.py:222 -msgid "Home" -msgstr "Domov" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:198 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/sharedDndControls.jsx:28 +msgid "The database columns that contains lines information" +msgstr "Stolpec v podatkovni bazi, ki vsebuje podatke črt" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:32 -msgid "Horizon Chart" -msgstr "Horizontni grafikon" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:210 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:702 +msgid "Line width" +msgstr "Debelina črte" -#: superset/viz.py:2273 -msgid "Horizon Charts" -msgstr "Horizontni grafikon" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:214 +msgid "The width of the lines" +msgstr "Debelina črt" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:106 -msgid "Horizontal alignment" -msgstr "Vodoravna poravnava" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:221 +msgid "Fill Color" +msgstr "Barva polnila" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:47 -msgid "Host" -msgstr "" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:222 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:235 +msgid "" +" Set the opacity to 0 if you do not want to override the color specified in the " +"GeoJSON" +msgstr " Nastavite prosojnost na 0, če želite obdržati barvo določeno v GeoJSON" -#: superset/db_engine_specs/base.py:1390 -msgid "Hostname or IP address" -msgstr "Ime gostitelja ali IP naslov" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:234 +msgid "Stroke Color" +msgstr "Barva obrobe" -#: superset/db_engine_specs/base.py:94 -msgid "Hour" -msgstr "Ura" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:248 +msgid "Filled" +msgstr "Zapolnjeno" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:65 -#, fuzzy, python-format -msgid "Hours %s" -msgstr "ura" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:250 +msgid "Whether to fill the objects" +msgstr "Če želite zapolniti objekte" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:779 -msgid "Hours offset" -msgstr "Urni premik" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:259 +msgid "Stroked" +msgstr "Obrobljeno" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:94 -msgid "How do you want to enter service account credentials?" -msgstr "Kako želite vnesti prijavne podatke servisnega računa?" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:261 +msgid "Whether to display the stroke" +msgstr "Če želite prikazati obrobe" -#: superset/views/alerts.py:190 -msgid "How long to keep the logs around for this alert" -msgstr "Kako dolgo ohraniti dnevnike za to opozorilo" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:270 +msgid "Extruded" +msgstr "Relief" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:59 -msgid "How many periods into the future do we want to predict" -msgstr "Za koliko period v prihodnosti želite napoved" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:281 +msgid "Grid Size" +msgstr "Velikost mreže" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:129 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:342 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:225 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:477 -#: superset-frontend/src/explore/controlPanels/sections.tsx:240 -msgid "" -"How to display time shifts: as individual lines; as the difference " -"between the main time series and each time shift; as the percentage " -"change; or as the ratio between series and time shifts." -msgstr "" -"Način prikaza časovnih zamikov: kot samostojne črte; kot razlike med " -"osnovno časovno vrsto in vsakim časovnim zamikom; kot procentualna " -"sprememba; kot razmerje med vrsto in časovnim zamikom." +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:285 +msgid "Defines the grid size in pixels" +msgstr "Določa velikost mreže v pikslih" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:51 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:85 -msgid "Huge" -msgstr "Ogromna" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:295 +msgid "Parameters related to the view and perspective on the map" +msgstr "Parametri povezani s pogledom in perspektivo zemljevida" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:78 -msgid "ISO 3166-2 Codes" -msgstr "Oznake po ISO 3166-2" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:307 +msgid "Longitude & Latitude" +msgstr "Dolžina in širina" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:237 -msgid "ISO 8601" -msgstr "ISO 8601" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:322 +msgid "Fixed point radius" +msgstr "Fiksni radij točk" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:50 -msgid "Id" -msgstr "Id" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:333 +msgid "Multiplier" +msgstr "Množitelj" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:85 -msgid "Id of root node of the tree." -msgstr "Id korenskega vozlišča drevesa." +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:337 +msgid "Factor to multiply the metric by" +msgstr "Faktor, s katerim množite mero" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:400 -msgid "" -"If Presto or Trino, all the queries in SQL Lab are going to be executed " -"as the currently logged on user who must have permission to run them. If " -"Hive and hive.server2.enable.doAs is enabled, will run the queries as " -"service account, but impersonate the currently logged on user via " -"hive.server2.proxy.user property." -msgstr "" -"V primeru Presto ali Trino se vse poizvedbe v SQL laboratoriju zaženejo " -"pod trenutno prijavljenim uporabnikom, ki mora imeti pravice za " -"poganjanje. Če je omogočen Hive in hive.server2.enable.doAs, poizvedbe " -"tečejo pod servisnim računom, vendar je trenutno prijavljen uporabnik " -"predstavljen z lastnostjo hive.server2.proxy.user." +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:345 +msgid "Lines encoding" +msgstr "Kodiranje črt" -#: superset/views/database/mixins.py:163 -msgid "" -"If Presto, all the queries in SQL Lab are going to be executed as the " -"currently logged on user who must have permission to run them.<br/>If " -"Hive and hive.server2.enable.doAs is enabled, will run the queries as " -"service account, but impersonate the currently logged on user via " -"hive.server2.proxy.user property." -msgstr "" -"V primeru Presto se vse poizvedbe v SQL laboratoriju zaženejo pod " -"trenutno prijavljenim uporabnikom, ki mora imeti pravice za " -"poganjanje.<br/>Če je omogočen Hive in hive.server2.enable.doAs, " -"poizvedbe tečejo pod servisnim računom, vendar je trenutno prijavljen " -"uporabnik predstavljen z lastnostjo hive.server2.proxy.user." +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:348 +msgid "The encoding format of the lines" +msgstr "Oblika kodiranja črt" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1201 -msgid "If a metric is specified, sorting will be done based on the metric value" -msgstr "Če je določena mera, bo razvrščanje izvedeno na podlagi vrednosti mere" +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:361 +msgid "Reverse Lat & Long" +msgstr "Zamenjaj širino in dolžino" -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:121 -msgid "If activated you can use the " -msgstr "Če je aktivirana, lahko uporabite " +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:390 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/sharedDndControls.jsx:36 +msgid "GeoJson Column" +msgstr "GeoJson stolpec" -#: superset/views/database/mixins.py:180 -msgid "If selected, please set the schemas allowed for csv upload in Extra." -msgstr "Če je izbrano, nastavite dovoljene sheme za nalaganje CSV v Dodatno." +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/Shared_DeckGL.jsx:392 +#: superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/sharedDndControls.jsx:37 +msgid "Select the geojson column" +msgstr "Izberite geojson stolpec" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:420 -msgid "If selected, please set the schemas allowed for data upload in Extra." -msgstr "Če je izbrano, nastavite dovoljene sheme za nalaganje podatkov v Dodatno." +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:53 +msgid "Right Axis Format" +msgstr "Oblika desne osi" -#: superset/views/database/forms.py:139 superset/views/database/forms.py:292 -#: superset/views/database/forms.py:420 -msgid "" -"If table exists do one of the following: Fail (do nothing), Replace (drop" -" and recreate table) or Append (insert data)." -msgstr "" -"Če tabela obstaja, naredite nekaj od sledečega: Prekini (ne naredi nič), " -"Zamenjaj (zbriši in ponovno ustvari tabelo) ali Dodaj (vstavi podatke)." +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:64 +msgid "Show Markers" +msgstr "Prikaži markerje" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:48 -msgid "" -"If you wish to specify a different target column than the original " -"column, it can be entered here" -msgstr "" -"Če želite nastaviti drug ciljni stolpec od izvornega, ga lahko vnesete " -"tukaj" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:67 +msgid "Show data points as circle markers on the lines" +msgstr "Pokaži točke kot krožne markerje na krivuljah" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:83 -msgid "Ignore time" -msgstr "Ne upoštevaj časa" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:91 +msgid "Y bounds" +msgstr "Y meje" -#: superset-frontend/src/components/ReportModal/index.tsx:293 -msgid "Image (PNG) embedded in email" -msgstr "Slika (PNG) vključena v e-pošto" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:94 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:105 +msgid "Whether to display the min and max values of the Y-axis" +msgstr "Če želite prikaz min. in max. vrednosti Y-osi" -#: superset-frontend/src/utils/downloadAsImage.ts:63 -msgid "Image download failed, please refresh and try again." -msgstr "Prenos slike ni uspel. Osvežite in poskusite ponovno." +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:102 +msgid "Y 2 bounds" +msgstr "Meje Y 2" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:395 -msgid "Impersonate logged in user (Presto, Trino, Drill, Hive, and GSheets)" -msgstr "" -"Predstavljanje kot prijavljeni uporabnik (Presto, Trino, Drill, Hive in " -"GSheets)" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:113 +msgid "Line Style" +msgstr "Slog črte" -#: superset/views/database/mixins.py:200 -msgid "Impersonate the logged on user" -msgstr "Predstavljaj se kot prijavljeni uporabnik" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:124 +msgid "Line interpolation as defined by d3.js" +msgstr "Interpolacija krivulje na osnovi d3.js" -#: superset-frontend/src/components/ImportModal/index.tsx:282 -msgid "Import" -msgstr "Uvozi" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:132 +msgid "Show Range Filter" +msgstr "Pokaži filter obdobja" -#: superset-frontend/src/components/ImportModal/index.tsx:286 -#, python-format -msgid "Import %s" -msgstr "Uvozi %s" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:141 +msgid "Whether to display the time range interactive selector" +msgstr "Če želite prikaz interaktivnega izbirnika časovnega obdobja" -#: superset/templates/superset/import_dashboards.html:26 -msgid "Import Dashboard(s)" -msgstr "Uvozi nadzorne plošče" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:160 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:158 +msgid "Extra Controls" +msgstr "Dodatni kontrolniki" -#: superset/initialization/__init__.py:314 -msgid "Import Dashboards" -msgstr "Uvozi nadzorne plošče" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:163 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:161 +msgid "" +"Whether to show extra controls or not. Extra controls include things like making " +"mulitBar charts stacked or side by side." +msgstr "" +"Če želite prikaz dodatnih kontrolnikov. Dodatni kontrolniki vključujejo možnost " +"izdelave večstolpčnih grafikonov, naloženih ali drug ob drugem." -#: superset/connectors/sqla/views.py:397 -msgid "Import a table definition" -msgstr "Uvozi definicijo tabele" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:201 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:78 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:62 +msgid "X Tick Layout" +msgstr "Postavitev oznak na X-osi" -#: superset/charts/commands/exceptions.py:151 -msgid "Import chart failed for an unknown reason" -msgstr "Uvoz grafikona ni uspel zaradi neznanega razloga" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:206 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:89 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:72 +msgid "The way the ticks are laid out on the X-axis" +msgstr "Način razporeditve oznak na X-osi" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:621 -msgid "Import charts" -msgstr "Uvozi grafikone" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:215 +msgid "X Axis Format" +msgstr "Oblika X-osi" -#: superset/dashboards/commands/exceptions.py:82 -msgid "Import dashboard failed for an unknown reason" -msgstr "Uvoz nadzorne plošče ni uspel zaradi neznanega razloga" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:227 +msgid "Y Log Scale" +msgstr "Logaritemska Y-os" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:596 -#: superset/templates/superset/import_dashboards.html:21 -msgid "Import dashboards" -msgstr "Uvozi nadzorne plošče" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:230 +msgid "Use a log scale for the Y-axis" +msgstr "Uporabi logaritemsko skalo za Y-os" -#: superset/databases/commands/exceptions.py:139 -msgid "Import database failed for an unknown reason" -msgstr "Uvoz podatkovne baze ni uspel zaradi neznanega razloga" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:238 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:383 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:294 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:205 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:222 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:278 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:281 +msgid "Y Axis Bounds" +msgstr "Meje Y-osi" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:195 -msgid "Import databases" -msgstr "Uvozi podatkovne baze" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:241 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:257 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:386 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:297 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:208 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:225 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:281 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:284 +msgid "" +"Bounds for the Y-axis. When left empty, the bounds are dynamically defined based " +"on the min/max of the data. Note that this feature will only expand the axis " +"range. It won't narrow the data's extent." +msgstr "" +"Meje Y-osi. Če je prazno, se meje nastavijo dinamično na podlagi min./max. " +"vrednosti podatkov. Funkcija omeji le prikaz, obseg podatkov pa ostane enak." -#: superset/datasets/commands/exceptions.py:181 -msgid "Import dataset failed for an unknown reason" -msgstr "Uvoz podatkovnega seta ni uspel zaradi neznanega razloga" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:254 +msgid "Y Axis 2 Bounds" +msgstr "Meje Y 2-osi" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:517 -msgid "Import datasets" -msgstr "Uvozi podatkovne sete" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:270 +msgid "X bounds" +msgstr "Meje X-osi" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:273 +msgid "Whether to display the min and max values of the X-axis" +msgstr "Če želite prikaz min. in max. vrednosti X-osi" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:294 +msgid "Bar Values" +msgstr "Vrednosti stolpcev" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:297 +msgid "Show the value on top of the bar" +msgstr "Prikaži vrednosti na vrhu stolpcev" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:190 -msgid "Import queries" -msgstr "Uvozi poizvedbe" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:305 +msgid "Stacked Bars" +msgstr "Naloženi stolpci" -#: superset/queries/saved_queries/commands/exceptions.py:36 -msgid "Import saved query failed for an unknown reason." -msgstr "Uvoz shranjene poizvedbe ni uspel zaradi neznanega razloga." +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:316 +msgid "Reduce X ticks" +msgstr "Manj oznak X-osi" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:64 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:319 msgid "" -"Important! Select this if the table is not already sorted by entity id, " -"else there is no guarantee that all events for each entity are returned." +"Reduces the number of X-axis ticks to be rendered. If true, the x-axis will not " +"overflow and labels may be missing. If false, a minimum width will be applied to " +"columns and the width may overflow into an horizontal scroll." msgstr "" -"Pomembno! Izberite, če tabela še ni razvrščena po ID entitete, v " -"nasprotnem primeru ni nujno, da bodo vrnjeni vsi dogodki za posamezno " -"entiteto." +"Zmanjša število izrisanih oznak na X-osi. Če je vklopljeno, se x-os ne bo prelila " +"in lahko oznake manjkajo. Če je izklopljeno, bo upoštevana min. širina stolpcev, " +"ki pa se lahko prelije v horizontalni drsnik." -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:67 -msgid "Include Series" -msgstr "Vključi serijo" - -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:70 -msgid "Include series name as an axis" -msgstr "Vključi ime podatkovne serije v naslov osi" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Vis.js:367 +msgid "You cannot use 45° tick layout along with the time range filter" +msgstr "" +"Skupaj s filtriranjem časovnega obdobja ne morete uporabiti oznak pod 45° kotom" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:325 -msgid "Include time" -msgstr "Vključi čas" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:52 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:144 +#: superset-frontend/src/explore/fixtures.tsx:57 +msgid "Stacked Style" +msgstr "Slog nalaganja" -#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:231 -#, python-format -msgid "Incompatible Filters (%d)" -msgstr "Neskladni filtri (%d)" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:30 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:29 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:30 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:25 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:25 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:58 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:55 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:61 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:60 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:59 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:59 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:50 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:49 +msgid "Evolution" +msgstr "Evolucija" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:121 -msgid "Incorrect Fields" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:32 +msgid "" +"A time series chart that visualizes how a related metric from multiple groups " +"vary over time. Each group is visualized using a different color." msgstr "" +"Grafikon časovne vrste, ki prikaže kako se povezane mere skupin spreminjajo skozi " +"čas. Vsaka skupina je prikazana s svojo barvo." -#: superset/views/database/forms.py:162 superset/views/database/forms.py:315 -msgid "Index Column" -msgstr "Indeksni stolpec" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:36 +msgid "Stretched style" +msgstr "Raztegnjen slog" -#: superset/views/database/forms.py:210 -msgid "Infer Datetime Format" -msgstr "Prepoznaj obliko datuma/časa" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:37 +msgid "Stacked style" +msgstr "Naložen slog" -#: superset-frontend/src/components/Menu/MenuRight.tsx:166 -#: superset/templates/appbuilder/navbar_right.html:110 -msgid "Info" -msgstr "Informacije" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:38 +msgid "Video game consoles" +msgstr "Igralne konzole" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:220 -msgid "Inner Radius" -msgstr "Notranji polmer" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:39 +msgid "Vehicle Types" +msgstr "Vrste vozil" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:226 -msgid "Inner radius of donut hole" -msgstr "Notranji polmer kolobarja" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:41 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:125 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:128 +msgid "Area Chart" +msgstr "Ploščinski grafikon" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:314 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:216 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:177 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:158 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:174 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:232 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:235 -msgid "Input field supports custom rotation. e.g. 30 for 30°" -msgstr "Vnosno polje omogoča poljubno rotacijo (vnesite 30 za 30°)" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:46 +msgid "Continuous" +msgstr "Zvezno" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:90 -msgid "Instant filtering" -msgstr "Takojšnje filtriranje" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:48 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:37 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:40 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:84 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:71 +msgid "Line" +msgstr "Črta" -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:293 -msgid "Instructions to add a dataset are available in the Superset tutorial." -msgstr "Navodila za dodajanje podatkovnega seta so v vodiču za Superset." +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:54 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:46 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:39 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:31 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:34 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:50 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:31 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:34 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:29 +msgid "nvd3" +msgstr "nvd3" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:34 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:41 -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:36 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:38 -msgid "Intensity" -msgstr "Intenzivnost" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:55 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:38 +msgid "Deprecated" +msgstr "Zastarelo" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:495 -msgid "Interval End column" -msgstr "Stolpec konca intervala" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:53 +msgid "Series Limit Sort By" +msgstr "Razvrščanje omejitev serije" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:286 -msgid "Interval bounds" -msgstr "Meje intervalov" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:54 +msgid "" +"Metric used to order the limit if a series limit is present. If undefined reverts " +"to the first metric (where appropriate)." +msgstr "" +"Mera, ki določa kako je razvrščena meja, če je določena omejitev serij. Če ni " +"določena, se uporabi prva mera (kjer je to ustrezno)." -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:300 -msgid "Interval colors" -msgstr "Barve intervalov" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:72 +msgid "Series Limit Sort Descending" +msgstr "Razvrsti padajoče" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:477 -msgid "Interval start column" -msgstr "Stolpec začetka intervala" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:74 +msgid "Whether to sort descending or ascending if a series limit is present" +msgstr "" +"Če želite padajoče ali naraščajoče razvrščanje, ko je prisotna omejitev serije" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:280 -msgid "Intervals" -msgstr "Intervali" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:31 +msgid "" +"Visualize how a metric changes over time using bars. Add a group by column to " +"visualize group level metrics and how they change over time." +msgstr "" +"Prikaže spreminjanje mere skozi čas s pomočjo stolpcev. Z dodajanjem stolpcev za " +"združevanje prikaže mere skupin in njihovo spreminjanje." -#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:109 -msgid "Invalid JSON" -msgstr "Neveljaven JSON" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:35 +msgid "Time-series Bar Chart" +msgstr "Stolpčni grafikon za časovno vrsto" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:107 -#, fuzzy -msgid "Invalid Port Number" -msgstr "Število razdelitev" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:38 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:41 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:91 +msgid "Bar" +msgstr "Stolpec" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:113 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:117 -#, fuzzy -msgid "Invalid account information" -msgstr "Osnovne informacije" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:42 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:49 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:316 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:90 +msgid "Vertical" +msgstr "Navpično" -#: superset/databases/schemas.py:170 superset/exceptions.py:182 -msgid "Invalid certificate" -msgstr "Neveljaven certifikat" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/BoxPlot/index.js:26 +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:54 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/createMetadata.ts:27 +msgid "Box Plot" +msgstr "Box Plot" -#: superset/views/core.py:1375 -msgid "" -"Invalid connection string, a valid string usually follows:\n" -"'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'" -msgstr "" -"Neveljaven niz povezave, veljaven niz običajno sledi:\n" -"'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:104 +msgid "X Log Scale" +msgstr "Logaritemska X-os" -#: superset/databases/schemas.py:148 -msgid "" -"Invalid connection string, a valid string usually follows: " -"driver://user:password@database-host/database-name" -msgstr "" -"Neveljaven niz povezave - veljaven niz običajno sledi: " -"driver://user:password@database-host/database-name" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:107 +msgid "Use a log scale for the X-axis" +msgstr "Uporabi logaritemsko skalo za X-os" -#: superset/views/database/validators.py:40 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:27 msgid "" -"Invalid connection string, a valid string usually " -"follows:'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-" -"NAME'<p>Example:'postgresql://user:password@your-postgres-" -"db/database'</p>" +"Visualizes a metric across three dimensions of data in a single chart (X axis, Y " +"axis, and bubble size). Bubbles from the same group can be showcased using bubble " +"color." msgstr "" -"Neveljaven niz povezave. Veljaven niz običajno sledi " -"zapisu:'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-" -"NAME'<p>Primer:'postgresql://user:password@your-postgres-db/database'</p>" - -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:52 -msgid "Invalid cron expression" -msgstr "Neveljaven cron izraz" +"Prikaže mero v treh dimenzijah podatkov na istem grafikonu (x os, y os, velikost " +"mehurčka). Mehurčki v isti skupini so predstavljeni z barvo." -#: superset/utils/pandas_postprocessing.py:578 -#, python-format -msgid "Invalid cumulative operator: %(operator)s" -msgstr "Neveljaven kumulativni operand: %(operator)s" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:39 +msgid "Ranges" +msgstr "Razponi" -#: superset/connectors/sqla/views.py:168 superset/datasets/schemas.py:39 -msgid "Invalid date/timestamp format" -msgstr "Neveljaven zapis datuma/časa" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:41 +msgid "Ranges to highlight with shading" +msgstr "Razponi za označitev s senčenjem" -#: superset/viz.py:2123 -msgid "Invalid filter configuration, please select a column" -msgstr "Neveljavna nastavitev filtrov, izberite stolpec" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:48 +msgid "Range labels" +msgstr "Oznake razponov" -#: superset/connectors/sqla/models.py:1326 -#, python-format -msgid "Invalid filter operation type: %(op)s" -msgstr "Neveljaven tip operacije filtra: %(op)s" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:50 +msgid "Labels for the ranges" +msgstr "Oznake za razpone" -#: superset/utils/pandas_postprocessing.py:679 -msgid "Invalid geodetic string" -msgstr "Neveljaven geodetski niz" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:59 +msgid "Markers" +msgstr "Markerji" -#: superset/utils/pandas_postprocessing.py:614 -msgid "Invalid geohash string" -msgstr "Neveljaven niz za geohash" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:61 +msgid "List of values to mark with triangles" +msgstr "Seznam vrednosti, ki bodo markirane s trikotniki" -#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:82 -msgid "Invalid lat/long configuration." -msgstr "Neveljavna nastavitev zemljepisne dolžine/širine." +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:68 +msgid "Marker labels" +msgstr "Oznake markerjev" -#: superset/utils/pandas_postprocessing.py:637 -msgid "Invalid longitude/latitude" -msgstr "Neveljavna zemljepisna dolžina/širina" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:70 +msgid "Labels for the markers" +msgstr "Oznake za markerje" -#: superset/utils/core.py:1318 -msgid "Invalid metric object" -msgstr "Neveljaven objekt mere" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:79 +msgid "Marker lines" +msgstr "Markirne črtice" -#: superset/utils/pandas_postprocessing.py:184 -#, python-format -msgid "Invalid numpy function: %(operator)s" -msgstr "Neveljavna numpy funkcija: %(operator)s" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:81 +msgid "List of values to mark with lines" +msgstr "Seznam vrednosti, ki bodo markirane s črticami" -#: superset/utils/pandas_postprocessing.py:414 -#, python-format -msgid "Invalid options for %(rolling_type)s: %(options)s" -msgstr "Neveljavne možnosti za %(rolling_type)s: %(options)s" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:88 +msgid "Marker line labels" +msgstr "Oznake markirnih črtic" -#: superset/common/query_actions.py:192 -#, python-format -msgid "Invalid result type: %(result_type)s" -msgstr "Neveljaven tip rezultata: %(result_type)s" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:90 +msgid "Labels for the marker lines" +msgstr "Oznake za markirne črtice" -#: superset/utils/pandas_postprocessing.py:408 -#, python-format -msgid "Invalid rolling_type: %(type)s" -msgstr "Neveljaven rolling_type: %(type)s" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:25 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:29 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:31 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:47 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:37 +msgid "KPI" +msgstr "KPI" -#: superset/viz.py:2493 -#, python-format -msgid "Invalid spatial point encountered: %s" -msgstr "Neustrezna prostorska točka: %s" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:27 +msgid "" +"Showcases the progress of a single metric against a given target. The higher the " +"fill, the closer the metric is to the target." +msgstr "" +"Prikaže napredovanje posamezne mere glede na cilj. Večja napolnjenost, pomeni, da " +"je mera bližje cilju." -#: superset-frontend/src/filters/components/Select/controlPanel.ts:124 -msgid "Inverse selection" -msgstr "Invertiraj izbiro" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:27 +msgid "" +"Visualizes many different time-series objects in a single chart. This chart is " +"being deprecated and we recommend using the Time-series Chart instead." +msgstr "" +"Prikaže več različnih časovnih vrst na istem grafikonu. Grafikon se opušča, zato " +"priporočamo uporabo Grafikona časovne vrste." -#: superset/connectors/druid/views.py:347 -msgid "Is Hidden" -msgstr "Skrito" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:30 +msgid "Time-series Percent Change" +msgstr "Časovna vrsta - Procentualna sprememba" -#: superset/charts/filters.py:63 superset/dashboards/filters.py:168 -#, fuzzy -msgid "Is certified" -msgstr "Certificiral/a" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:82 +msgid "Sort Bars" +msgstr "Uredi stolpce" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:285 -msgid "Is dimension" -msgstr "Dimenzija" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:85 +msgid "Sort bars by x labels." +msgstr "Uredi stolpce po x-oznakah." -#: superset/views/base_api.py:107 -msgid "Is favorite" -msgstr "Je priljubljen" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:122 +msgid "Breakdowns" +msgstr "Razčlenitev" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:287 -msgid "Is filterable" -msgstr "Filtriranje" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:123 +msgid "Defines how each series is broken down" +msgstr "Določa, kako se vsaka podatkovna serija razčleni" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:286 -#: superset/connectors/sqla/views.py:150 -msgid "Is temporal" -msgstr "Časoven" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:30 +msgid "" +"Compares metrics from different categories using bars. Bar lengths are used to " +"indicate the magnitude of each value and color is used to differentiate groups." +msgstr "" +"Primerjava mer različnih kategorij s pomočjo stolpcev. Dolžina stolpca prestavlja " +"višino vrednosti, z barvami pa so ločene skupine." -#: superset-frontend/src/utils/getClientErrorObject.ts:112 -msgid "Issue 1000 - The dataset is too large to query." -msgstr "Težava 1000 - podatkovni vir je prevelik za poizvedbo." +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:38 +msgid "Bar Chart" +msgstr "Stolpčni grafikon" -#: superset-frontend/src/utils/getClientErrorObject.ts:118 -msgid "Issue 1001 - The database is under an unusual load." -msgstr "Težava 1001 - podatkovni vir je neobičajno obremenjen." +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:40 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:39 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 +#: superset-frontend/plugins/plugin-chart-table/src/index.ts:43 +msgid "Additive" +msgstr "Aditivno" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 -#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 -#: superset-frontend/src/components/DatabaseSelector/index.tsx:183 -msgid "It seems you don't have access to any database" -msgstr "Zdi se, da nimate dostopa do nobene podatkovne baz" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:44 +msgid "Discrete" +msgstr "Diskretno" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:221 -msgid "It’s not recommended to truncate y-axis in Bar chart." -msgstr "V stolpčnem grafikonu ni priporočljivo omejiti y-osi." +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:40 +msgid "Y Axis 1" +msgstr "Y-os 1" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:91 -msgid "JAN" -msgstr "JAN" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:50 +msgid "Y Axis 2" +msgstr "Y-os 2" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:918 -#: superset/connectors/druid/views.py:191 superset/views/log/__init__.py:33 -msgid "JSON" -msgstr "JSON" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:68 +msgid "Left Axis Metric" +msgstr "Mera za levo os" -#: superset/views/annotations.py:81 superset/views/dashboard/mixin.py:89 -msgid "JSON Metadata" -msgstr "JSON metapodatki" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:69 +msgid "Choose a metric for left axis" +msgstr "Izberite mero za levo os" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:584 -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:336 -msgid "JSON metadata" -msgstr "JSON metapodatki" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:72 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:166 +msgid "Left Axis Format" +msgstr "Oblika leve osi" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:341 +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:27 msgid "" -"JSON string containing additional connection configuration. This is used " -"to provide connection information for systems like Hive, Presto and " -"BigQuery which do not conform to the username:password syntax normally " -"used by SQLAlchemy." +"Visualizes 2 metrics as line plots using the same x-axis. This chart is useful " +"for comparing metrics across the same time range." msgstr "" -"JSON niz, ki vsebuje dodatno konfiguracijo povezave. Uporablja se za " -"zagotavljanje dodatnih informacij povezave za sisteme kot sta Presto in " -"BigQuery, ki nista skladna s sintakso username:password, ki jo običajno " -"uporablja SQLAlchemy." +"Prikaže dve meri na črtnem grafu z isto x-osjo. Grafikon je uporaben za " +"primerjavo mer v istem časovnem obdobju." -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:97 -msgid "JUL" -msgstr "JUL" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:30 +msgid "Dual Line Chart" +msgstr "Grafikon z dvojno krivuljo" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:96 -msgid "JUN" -msgstr "JUN" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:55 +msgid "Propagate" +msgstr "Razširi" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:66 -msgid "January" -msgstr "Januar" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:58 +msgid "Send range filter events to other charts" +msgstr "Pošlji dogodke filtra obdobja na druge grafikone" -#: superset/views/database/forms.py:177 superset/views/database/forms.py:435 -msgid "" -"Json list of the column names that should be read. If not None, only " -"these columns will be read from the file." -msgstr "" -"JSON seznam imen stolpcev, ki morajo biti prebrani. Če ni prazen, bodo iz" -" datoteke prebrani le ti stolpci." +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:32 +msgid "Classic chart that visualizes how metrics change over time." +msgstr "Standardni grafikon za prikaz spreminjanje mere skozi čas." -#: superset/views/database/forms.py:235 superset/views/database/forms.py:368 -msgid "" -"Json list of the values that should be treated as null. Examples: [\"\"]," -" [\"None\", \"N/A\"], [\"nan\", \"null\"]. Warning: Hive database " -"supports only single value. Use [\"\"] for empty string." -msgstr "" -"JSON seznam vrednosti, ki naj bodo obravnavane kot prazne (Null). " -"Primeri: [\"\"], [\"None\", \"N/A\"], [\"nan\", \"null\"]. Opozorilo: " -"Podatkovna baza Hive podpira le eno vrednost. Uporabite [\"\"] za prazen " -"znakovni niz." +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:36 +msgid "Battery level over time" +msgstr "Napolnjenost baterije skozi čas" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:72 -msgid "July" -msgstr "Julij" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:38 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:77 +#: superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts:26 +msgid "Line Chart" +msgstr "Črtni grafikon" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:71 -msgid "June" -msgstr "Junij" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:64 +msgid "Prefix metric name with slice name" +msgstr "Imenu mere pripni ime rezine" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:29 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:30 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:25 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:47 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:37 -msgid "KPI" -msgstr "KPI" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:88 +msgid "Y Axis Left" +msgstr "Y-os levo" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/CancelConfirmationAlert.tsx:56 -msgid "Keep editing" -msgstr "Nadaljuj z urejanjem" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:97 +msgid "Left Axis chart(s)" +msgstr "Grafikoni leve osi" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:157 -msgid "Keys for table" -msgstr "Ključi za tabele" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:100 +msgid "Choose one or more charts for left axis" +msgstr "Izberite enega ali več grafikonov za levo os" -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:149 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:192 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:196 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1037 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1045 -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:157 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:143 -#: superset/views/annotations.py:77 superset/views/sql_lab.py:68 -msgid "Label" -msgstr "Naziv" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:123 +msgid "Y Axis Right" +msgstr "Y-os desno" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:175 -msgid "Label Line" -msgstr "Črta oznake" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:132 +msgid "Right Axis chart(s)" +msgstr "Grafikoni desne osi" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:135 +msgid "Choose one or more charts for right axis" +msgstr "Izberite enega ali več grafikonov za desno os" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:27 +msgid "" +"Visualize two different time series using the same x-axis time range. This chart " +"is being deprecated and we recommend using the Mixed Timeseries Chart instead!" +msgstr "" +"Prikaže dve različni časovni vrsti z isto x-osjo oz. časovnim obdobjem. Grafikon " +"se opušča, zato priporočamo uporabo kombiniranega grafikona časovne vrste!" + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:30 +msgid "Multiple Line Charts" +msgstr "Veččrtni grafikon" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:47 #: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:85 @@ -6835,9025 +7849,8907 @@ msgstr "Črta oznake" msgid "Label Type" msgstr "Oblika oznake" -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:152 -msgid "Label for your query" -msgstr "Ime vaše poizvedbe" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:58 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:102 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:110 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:113 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:103 +msgid "What should be shown on the label?" +msgstr "Kaj bo prikazano na oznaki?" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:123 -msgid "Label position" -msgstr "Položaj oznake" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:220 +msgid "Donut" +msgstr "Kolobar" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:198 -msgid "Label threshold" -msgstr "Prag oznak" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:86 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:223 +msgid "Do you want a donut or a pie?" +msgstr "Želite kolobar ali torto?" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:144 -msgid "Labelling" -msgstr "Oznake" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:96 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:127 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:149 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:94 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:71 +msgid "Show Labels" +msgstr "Pokaži oznake" -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:79 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:93 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:88 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:65 -msgid "Labels" -msgstr "Oznake" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:99 +msgid "" +"Whether to display the labels. Note that the label only displays when the the 5% " +"threshold." +msgstr "" +"Če želite prikazati oznake. Oznake so prikazane le pri vsaj 5-odstotnem pragu." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:90 -msgid "Labels for the marker lines" -msgstr "Oznake za markirne črtice" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:109 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:161 +msgid "Put labels outside" +msgstr "Postavi oznake zunaj" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:70 -msgid "Labels for the markers" -msgstr "Oznake za markerje" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:112 +msgid "Put the labels outside the pie?" +msgstr "Postavim oznake zunaj torte?" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:50 -msgid "Labels for the ranges" -msgstr "Oznake za razpone" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/index.js:27 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:63 +msgid "Pie Chart" +msgstr "Tortni grafikon" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:47 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:81 -#: superset-frontend/src/dashboard/util/headerStyleOptions.ts:35 -msgid "Large" -msgstr "Veliko" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:53 +msgid "Frequency" +msgstr "Frekvenca" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:31 -msgid "Last" -msgstr "Zadnji" +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:65 +msgid "" +"The periodicity over which to pivot time. Users can provide\n" +" \"Pandas\" offset alias.\n" +" Click on the info bubble for more details on accepted \"freq\" " +"expressions." +msgstr "" +"Periodičnost za vrtenje časa. Uporabnik lahko poda\n" +" psevdonim za zamik v \"Pandas\".\n" +" Kliknite na mehurček za podrobnosti dovoljenih izrazov za \"freq\"." + +#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:28 +msgid "Time-series Period Pivot" +msgstr "Časovna serija - Vrtenje periode" + +#: superset-frontend/plugins/plugin-chart-echarts/src/constants.ts:76 +msgid "Stack" +msgstr "Naloži" + +#: superset-frontend/plugins/plugin-chart-echarts/src/constants.ts:77 +msgid "Expand" +msgstr "Razširi" + +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:44 +msgid "Show legend" +msgstr "Prikaži legendo" + +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:47 +msgid "Whether to display a legend for the chart" +msgstr "Če želite prikaz legende za grafikon" + +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:55 +msgid "Margin" +msgstr "Rob" + +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:59 +msgid "Additional padding for legend." +msgstr "Dodatni razmak za legendo." + +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:77 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:97 +msgid "Legend type" +msgstr "Tip legende" -#: superset/connectors/sqla/views.py:492 superset/views/database/mixins.py:193 -msgid "Last Changed" -msgstr "Zadnja sprememba" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:115 +msgid "Show Value" +msgstr "Prikaži vrednost" -#: superset/views/chart/mixin.py:82 -msgid "Last Modified" -msgstr "Zadnja sprememba" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:118 +msgid "Show series values on the chart" +msgstr "Na grafikonu prikaži vrednosti serij" -#: superset-frontend/src/components/LastUpdated/index.tsx:74 -#, python-format -msgid "Last Updated %s" -msgstr "Zadnja posodobitev %s" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:171 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:126 +msgid "Stack series" +msgstr "Nalagaj serije" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:149 -#, python-format -msgid "Last available value seen on %s" -msgstr "Zadnja razpoložljiva vrednost na %s" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:174 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:148 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:129 +msgid "Stack series on top of each other" +msgstr "Nalagaj serije eno na drugo" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:180 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:317 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:158 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:307 -msgid "Last modified" -msgstr "Zadnja sprememba" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:137 +msgid "Only Total" +msgstr "Samo vsota" -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:151 -#, python-format -msgid "Last modified by %s" -msgstr "Nazadnje spremenil %s" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:140 +msgid "" +"Only show the total value on the stacked chart, and not show on the selected " +"category" +msgstr "" +"Na naloženem grafikonu prikaži samo skupno vsoto, za izbrane kategorije pa ne" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:228 -msgid "Last run" -msgstr "Zadnji zagon" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:152 +msgid "X-axis" +msgstr "X-os" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:63 -msgid "Latitude" -msgstr "Širina" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:170 +msgid "Dimension to use on x-axis." +msgstr "Dimenzija z x-os." -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:294 -msgid "Latitude of default viewport" -msgstr "Širina privzetega pogleda" +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:81 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:179 +msgid "Percentage threshold" +msgstr "Procentualni prag" -#: superset/views/annotations.py:76 -msgid "Layer" -msgstr "Sloj" +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:85 +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:183 +msgid "Minimum threshold in percentage points for showing labels." +msgstr "Minimalni prag v odstotnih točkah za prikaz oznak." -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:717 -msgid "Layer configuration" -msgstr "Nastavitve sloja" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:209 +msgid "Rich tooltip" +msgstr "Podroben opis orodja" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:101 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:110 -msgid "Layout" -msgstr "Izgled" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:212 +msgid "Shows a list of all series available at that point in time" +msgstr "Prikaže seznam vseh razpoložljivih podatkovnih serij za istočasno točko" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:114 -msgid "Layout type of graph" -msgstr "Tip izgleda grafikona" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:222 +msgid "Tooltip time format" +msgstr "Oblika zapisa časa v opisu orodja" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:123 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:246 -msgid "Layout type of tree" -msgstr "Način izgleda drevesa" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:232 +msgid "Tooltip sort by metric" +msgstr "Mera za razvrščanje opisa orodja" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:81 -msgid "" -"Leaf nodes that represent fewer than this number of events will be " -"initially hidden in the visualization" -msgstr "" -"Listna vozlišča, ki predstavljajo manjše število dogodkov od te " -"vrednosti, bodo v vizualizaciji skrita" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:235 +msgid "Whether to sort tooltip by the selected metric in descending order." +msgstr "Če želite padajoče razvrstiti opis orodja z izbrano mero." -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:567 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:541 -msgid "Least recently modified" -msgstr "Zadnje spremenjeno" +#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:244 +msgid "Tooltip" +msgstr "Opis orodja" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:111 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:306 -msgid "Left" -msgstr "Levo" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx:109 +#, python-format +msgid "Last available value seen on %s" +msgstr "Zadnja razpoložljiva vrednost na %s" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:72 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:166 -msgid "Left Axis Format" -msgstr "Oblika leve osi" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx:112 +msgid "Not up to date" +msgstr "Ni posodobljeno" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:68 -msgid "Left Axis Metric" -msgstr "Mera za levo os" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx:149 +#: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:259 +#: superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx:93 +msgid "No data" +msgstr "Ni podatkov" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:97 -msgid "Left Axis chart(s)" -msgstr "Grafikoni leve osi" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx:179 +msgid "No data after filtering or data is NULL for the latest time record" +msgstr "" +"Ni podatkov po filtriranju ali pa imajo vrednost NULL za zadnji časovni zapis" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:187 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:77 -msgid "Left Margin" -msgstr "Levi rob" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx:182 +msgid "Try applying different filters or ensuring your datasource has data" +msgstr "" +"Poskusite uporabiti druge filtre oz. zagotovite, da so v podatkovnem viru podatki" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:199 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:81 -msgid "Left margin, in pixels, allowing for more room for axis labels" -msgstr "Levi rob, v pikslih, s katerim povečamo prostor za oznake osi" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:28 +msgid "Big Number Font Size" +msgstr "Velikost pisave Velike številke" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:137 -msgid "Left to Right" -msgstr "Iz leve proti desni" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:35 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:69 +msgid "Tiny" +msgstr "Drobna" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:147 -msgid "Left value" -msgstr "Leva vrednost" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:39 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:73 +#: superset-frontend/src/dashboard/util/headerStyleOptions.ts:25 +msgid "Small" +msgstr "Majhno" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:38 -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:30 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:42 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:33 -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:37 -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:30 -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:31 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:31 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:40 -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:43 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:39 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:43 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:47 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:35 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:31 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:32 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:44 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:31 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:33 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:29 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:32 -msgid "Legacy" -msgstr "Staro" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:43 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:77 +msgid "Normal" +msgstr "Normalna" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:154 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:275 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:129 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:149 -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:95 -msgid "Legend" -msgstr "Legenda" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:47 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:81 +#: superset-frontend/src/dashboard/util/headerStyleOptions.ts:35 +msgid "Large" +msgstr "Veliko" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:68 -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:88 -msgid "Legend type" -msgstr "Tip legende" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:51 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:85 +msgid "Huge" +msgstr "Ogromna" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:98 -msgid "Lift percent precision" -msgstr "Točnost procentualnega dviga" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/sharedControls.ts:62 +msgid "Subheader Font Size" +msgstr "Velikost pisave podnaslova" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:30 -msgid "Light mode" -msgstr "Svetli način" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:37 +msgid "Display settings" +msgstr "Nastavitve prikaza" -#: superset-frontend/src/explore/components/RowCountLabel.jsx:45 -msgid "Limit reached" -msgstr "Omejitev dosežena" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:46 +msgid "Subheader" +msgstr "Podnaslov" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:134 -msgid "Limit selector values" -msgstr "Omeji vrednosti izbirnikov" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:48 +msgid "Description text that shows up below your Big Number" +msgstr "Besedilo, ki se prikaže pod veliko številko" -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:44 -msgid "" -"Limiting rows may result in incomplete data and misleading charts. " -"Consider filtering or grouping source/target names instead." -msgstr "" -"Omejitev vrstic lahko povzroči nepopolne podatke in zavajajoč grafikon. " -"Premislite o uporabi filtriranja ali združevanja imen izvorov/ciljev." +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:82 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:151 +msgid "Force date format" +msgstr "Vsili obliko zapisa datuma" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:335 -#: superset-frontend/src/explore/controls.jsx:364 -msgid "Limits the number of rows that get displayed." -msgstr "Omeji število vrstic za prikaz." +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/controlPanel.ts:85 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:154 +msgid "Use date formatting even when metric value is not a timestamp" +msgstr "Oblikovanje datuma uporabi tudi, ko vrednost mere ni časovna značka" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:345 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:359 -#: superset-frontend/src/explore/controls.jsx:374 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:30 msgid "" -"Limits the number of series that get displayed. A joined subquery (or an " -"extra phase where subqueries are not supported) is applied to limit the " -"number of series that get fetched and rendered. This feature is useful " -"when grouping by high cardinality column(s) though does increase the " -"query complexity and cost." +"Showcases a single metric front-and-center. Big number is best used to call " +"attention to a KPI or the one thing you want your audience to focus on." msgstr "" -"Omeji število časovnih vrst za prikaz. S podpoizvedbo (ali dodatno fazo, " -"kjer podpoizvedbe niso podprte) se omeji število časovnih vrst, ki bodo " -"pridobljene za prikaz. Ta funkcija je uporabna pri združevanju s stolpci " -"z veliko kardinalnostjo, vendar poveča kompleksnost poizvedbe." - -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:38 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:48 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:37 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:82 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:76 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:76 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:73 -msgid "Line" -msgstr "Črta" - -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:38 -#: superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts:26 -msgid "Line Chart" -msgstr "Črtni grafikon" - -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:113 -msgid "Line Style" -msgstr "Slog črte" +"Prikaže eno vrednost. Velika številka je primerna za poudarek KPI-ja ali " +"vrednosti, na katero želite usmeriti pozornost." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:124 -msgid "Line interpolation as defined by d3.js" -msgstr "Interpolacija krivulje na osnovi d3.js" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:34 +msgid "A Big Number" +msgstr "Velika številka" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:667 -msgid "Line width" -msgstr "Debelina črte" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:35 +msgid "With a subheader" +msgstr "S podnaslovom" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:190 -msgid "Linear Color Scheme" -msgstr "Linearna barvna shema" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/index.ts:41 +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:39 +#: superset-frontend/plugins/plugin-chart-table/src/index.ts:45 +msgid "Formattable" +msgstr "Prilagodljiv" -#: superset-frontend/src/explore/controls.jsx:222 -msgid "Linear color scheme" -msgstr "Linearna barvna shema" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:48 +msgid "Comparison Period Lag" +msgstr "Zaostanek obdobja za primerjavo" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:216 -#: superset-frontend/src/views/CRUD/hooks.ts:601 -msgid "Link Copied!" -msgstr "Povezava kopirana!" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:50 +msgid "Based on granularity, number of time periods to compare against" +msgstr "Na osnovi granulacije, število časovnih obdobij za primerjavo" -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:58 -msgid "Link Length" -msgstr "Dolžina povezave" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:61 +msgid "Comparison suffix" +msgstr "Pripona za primerjavo" -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:70 -msgid "Link length in the force layout" -msgstr "Dolžina povezave v postavitvi sil" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:62 +msgid "Suffix to apply after the percentage display" +msgstr "Pripona za prikaz procenta" -#: superset/views/alerts.py:75 -msgid "List Observations" -msgstr "Naštej opažanja" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:71 +msgid "Show Timestamp" +msgstr "Prikaži časovno značko" -#: superset/views/sql_lab.py:39 -msgid "List Saved Query" -msgstr "Seznam shranjenih poizvedb" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:74 +msgid "Whether to display the timestamp" +msgstr "Če želite prikazati časovno značko" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:81 -msgid "List of values to mark with lines" -msgstr "Seznam vrednosti, ki bodo markirane s črticami" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:83 +msgid "Show Trend Line" +msgstr "Pokaži trendno črto" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:61 -msgid "List of values to mark with triangles" -msgstr "Seznam vrednosti, ki bodo markirane s trikotniki" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:86 +msgid "Whether to display the trend line" +msgstr "Če želite prikazati trendno črto" -#: superset-frontend/src/dashboard/components/CssEditor/index.jsx:108 -msgid "Live CSS editor" -msgstr "CSS urejevalnik v živo" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:95 +msgid "Start y-axis at 0" +msgstr "Začni y-os z 0" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:199 -msgid "Live render" -msgstr "Sprotni izris" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:98 +msgid "Start y-axis at zero. Uncheck to start y-axis at minimum value in the data." +msgstr "" +"Začni y-os z nič. Ne izberite, če želite, da se y-os začne z najmanjšo vrednostjo " +"podatkov." -#: superset-frontend/src/dashboard/components/CssEditor/index.jsx:93 -msgid "Load a CSS template" -msgstr "Naloži CSS predlogo" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:109 +msgid "Fix to selected Time Range" +msgstr "Nastavi na izbrano časovno obdobje" -#: superset-frontend/src/components/CachedLabel/TooltipContent.tsx:30 -msgid "Loaded data cached" -msgstr "Podatki so naloženi v predpomnilnik" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/controlPanel.tsx:110 +msgid "" +"Fix the trend line to the full time range specified in case filtered results do " +"not include the start or end dates" +msgstr "" +"Trendno črto nastavite na izbrano obdobje, v primeru, da filtrirani rezultati ne " +"vsebujejo začetnega in/ali končnega datuma" -#: superset-frontend/src/components/CachedLabel/TooltipContent.tsx:34 -msgid "Loaded from cache" -msgstr "Naloženo iz predpomnilnika" +#: superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/index.ts:32 +msgid "" +"Showcases a single number accompanied by a simple line chart, to call attention " +"to an important metric along with its change over time or other dimension." +msgstr "" +"Prikaže eno vrednost skupaj s preprostim črtnim grafikonom, za poudarek pomembne " +"mere skupaj z njeno časovno spremembo." -#: superset-frontend/src/components/Select/Select.tsx:603 -#: superset-frontend/src/components/Select/Select.tsx:714 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:110 -msgid "Loading..." -msgstr "Nalagam ..." +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:51 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:45 +msgid "Whisker/outlier options" +msgstr "Možnosti grafikona kvantilov" -#: superset/views/alerts.py:180 -msgid "Log Retentions (days)" -msgstr "Ohranjanje dnevnika (dnevi)" +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:53 +#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:47 +msgid "Determines how whiskers and outliers are calculated." +msgstr "Določa kako so izračunani kvantili in izstopajoče vrednosti." -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:204 -msgid "Log Scale" -msgstr "Logaritemska skala" +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:129 +msgid "Categories to group by on the x-axis." +msgstr "Kategorije za združevanje po x-osi." -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1238 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1243 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1244 -msgid "Log retention" -msgstr "Hranjenje dnevnikov" +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:132 +msgid "Distribute across" +msgstr "Porazdeli glede na" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:383 -msgid "Logarithmic scale on primary y-axis" -msgstr "Logaritemska skala na primarni y-osi" +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:134 +msgid "" +"Columns to calculate distribution across. Defaults to temporal column if left " +"empty." +msgstr "" +"Stolpci za izračun porazdelitve. Privzeto je izbran časovni stolpec (če je " +"prazno)." -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:416 -msgid "Logarithmic scale on secondary y-axis" -msgstr "Logaritemska skala na sekundarni y-osi" +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:50 +msgid "" +"Also known as a box and whisker plot, this visualization compares the " +"distributions of a related metric across multiple groups. The box in the middle " +"emphasizes the mean, median, and inner 2 quartiles. The whiskers around each box " +"visualize the min, max, range, and outer 2 quartiles." +msgstr "" +"Znan tudi kot grafikon škatla z brki. prikaže primerjavo porazdelitev povezanih " +"mer v različnih skupinah. Škatla na sredini predstavlja povprečje, mediano in " +"notranja 2 kvartila. Brki na vsaki škatli prikazujejo minimum, maksimum, območje " +"in zunanja dva kvartila." -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:380 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:404 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:413 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:231 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:234 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:194 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:197 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:174 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:177 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:191 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:194 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:247 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:250 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:250 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:253 -msgid "Logarithmic y-axis" -msgstr "Logaritemska y-os" +#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:55 +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:55 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:47 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:43 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:72 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:61 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:75 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:79 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:79 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:70 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:42 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:61 +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:128 +msgid "ECharts" +msgstr "ECharts" -#: superset-frontend/src/components/Menu/MenuRight.tsx:233 -#: superset/templates/appbuilder/navbar_right.html:126 -msgid "Login" -msgstr "Prijava" +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:79 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:93 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:88 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:65 +msgid "Labels" +msgstr "Oznake" -#: superset-frontend/src/components/Menu/MenuRight.tsx:170 -#: superset/templates/appbuilder/navbar_right.html:111 -msgid "Logout" -msgstr "Odjava" +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:130 +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:152 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:97 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:74 +msgid "Whether to display the labels." +msgstr "Če želite prikaz oznak." -#: superset/views/log/__init__.py:21 -msgid "Logs" -msgstr "Dnevniki" +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:49 +msgid "" +"Showcases how a metric changes as the funnel progresses. This classic chart is " +"useful for visualizing drop-off between stages in a pipeline or lifecycle." +msgstr "" +"Prikaže kako se mera spreminja, ko lijak napreduje. Standardni grafikon za prikaz " +"sprememb med nivoji v procesu ali življenjskem ciklu." -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:53 -msgid "Longitude" -msgstr "Dolžina" +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:52 +msgid "Funnel Chart" +msgstr "Lijakasti grafikon" -#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:168 -msgid "Longitude & Latitude columns" -msgstr "Stolpci zemljepisne dolžine in širine" +#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:58 +#: superset-frontend/plugins/plugin-chart-table/src/index.ts:49 +msgid "Sequential" +msgstr "Sekvenčni" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:280 -msgid "Longitude of default viewport" -msgstr "Dolžina privzetega pogleda" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:42 +msgid "Columns to group by" +msgstr "Stolpci za združevanje" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:93 -msgid "MAR" -msgstr "MAR" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:77 +msgid "General" +msgstr "Splošno" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:95 -msgid "MAY" -msgstr "MAJ" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:87 +#: superset-frontend/src/explore/components/controls/BoundsControl.tsx:88 +msgid "Min" +msgstr "Min" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:82 -msgid "MON" -msgstr "PON" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:88 +msgid "Minimum value on the gauge axis" +msgstr "Najmanjša vrednost na številčnici" -#: superset/connectors/sqla/views.py:501 -msgid "Main Datetime Column" -msgstr "Glavni stolpec Datum-Čas" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:99 +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:48 +#: superset-frontend/src/explore/components/controls/BoundsControl.tsx:96 +msgid "Max" +msgstr "Max" -#: superset/views/core.py:1738 -msgid "" -"Malformed request. slice_id or table_name and db_name arguments are " -"expected" -msgstr "" -"Deformirana zahteva. Pričakovani so argumenti slice_id ali table_name in " -"db_name" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:100 +msgid "Maximum value on the gauge axis" +msgstr "Največja vrednost na številčnici" -#: superset/initialization/__init__.py:232 -#: superset/initialization/__init__.py:256 -#: superset/initialization/__init__.py:268 -#: superset/initialization/__init__.py:318 -#: superset/initialization/__init__.py:446 -#: superset/initialization/__init__.py:455 -#: superset/initialization/__init__.py:470 -#: superset/initialization/__init__.py:482 -msgid "Manage" -msgstr "Upravljaj" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:109 +msgid "Start angle" +msgstr "Začetni kot" -#: superset/views/schedules.py:276 -msgid "Manage Email Reports for Charts" -msgstr "Upravljaj e-poštna poročila za grafikone" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:110 +msgid "Angle at which to start progress axis" +msgstr "Kot, pri katerem se začne os območja" -#: superset/views/schedules.py:198 -msgid "Manage Email Reports for Dashboards" -msgstr "Upravljaj e-poštna poročila za nadzorne plošče" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:119 +msgid "End angle" +msgstr "Končni kot" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:726 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:763 -msgid "Mandatory" -msgstr "Obvezno" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:120 +msgid "Angle at which to end progress axis" +msgstr "Kot, pri katerem se konča os območja" -#: superset/views/database/forms.py:171 superset/views/database/forms.py:324 -msgid "Mangle Duplicate Columns" -msgstr "Odstrani podvojene stolpce" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:132 +msgid "Font size" +msgstr "Velikost pisave" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:25 -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:26 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:27 -msgid "Map" -msgstr "Zemljevid" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:133 +msgid "Font size for axis labels, detail value and other text elements" +msgstr "Velikost pisave za oznake osi, podrobnosti in druge besedilne elemente" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:212 -msgid "Map Style" -msgstr "Slog zemljevida" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:164 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:234 +msgid "Value format" +msgstr "Oblika zapisa vrednosti" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:33 -msgid "MapBox" -msgstr "MapBox" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:165 +msgid "Additional text to add before or after the value, e.g. unit" +msgstr "Dodatno besedilo, ki ga dodate pred ali za vrednost, npr. enota" -#: superset/viz.py:2285 -msgid "Mapbox" -msgstr "Mapbox" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:178 +msgid "Show pointer" +msgstr "Prikaži kazalec" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:68 -msgid "March" -msgstr "Marec" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:179 +msgid "Whether to show the pointer" +msgstr "Če želite prikazati kazalec" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:46 -msgid "Margin" -msgstr "Rob" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:190 +msgid "Animation" +msgstr "Animacija" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:211 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:149 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:110 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:90 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:107 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:165 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:168 -msgid "Marker" -msgstr "Marker" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:191 +msgid "Whether to animate the progress and the value or just display them" +msgstr "Če želite animiran prikaz grafikona" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:163 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:124 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:104 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:121 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:179 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:182 -msgid "Marker Size" -msgstr "Velikost markerja" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:199 +msgid "Axis" +msgstr "Os" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:68 -msgid "Marker labels" -msgstr "Oznake markerjev" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:205 +msgid "Show axis line ticks" +msgstr "Prikaži oznake na X-osi" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:88 -msgid "Marker line labels" -msgstr "Oznake markirnih črtic" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:206 +msgid "Whether to show minor ticks on the axis" +msgstr "Če želite prikaz manjših oznak na osi" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:79 -msgid "Marker lines" -msgstr "Markirne črtice" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:217 +msgid "Show split lines" +msgstr "Prikaži razdelitvene črte" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:225 -msgid "Marker size" -msgstr "Velikost markerja" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:218 +msgid "Whether to show the split lines on the axis" +msgstr "Če želite prikazati razdelitvene črte na osi" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:59 -msgid "Markers" -msgstr "Markerji" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:229 +msgid "Split number" +msgstr "Število razdelitev" -#: superset-frontend/src/explore/controlPanels/Separator.js:32 -msgid "Markup type" -msgstr "Tip označevanja" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:230 +msgid "Number of split segments on the axis" +msgstr "Število razdelkov na osi" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:100 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:48 -#: superset-frontend/src/explore/components/controls/BoundsControl.jsx:118 -msgid "Max" -msgstr "Max" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:238 +msgid "Progress" +msgstr "Območje" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:94 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:59 -msgid "Max Bubble Size" -msgstr "Max. velikost mehurčka" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:244 +msgid "Show progress" +msgstr "Prikaži območje" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:129 -msgid "Max Events" -msgstr "Max. dogodkov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:245 +msgid "Whether to show the progress of gauge chart" +msgstr "Prikaži merilno območje števčnega grafikona" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:257 -msgid "Maximize chart" -msgstr "Povečaj grafikon" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:256 +msgid "Overlap" +msgstr "Prekrivanje" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1266 -msgid "Maximum" -msgstr "" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:257 +msgid "Whether the progress bar overlaps when there are multiple groups of data" +msgstr "Če želite prekrivanje območij, ko imate več skupin podatkov" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:68 -msgid "Maximum Font Size" -msgstr "Max. velikost pisave" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:270 +msgid "Round cap" +msgstr "Zaobljeni konci" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:271 +msgid "Style the ends of the progress bar with a round cap" +msgstr "Zaobljena oblika koncev območja" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:101 -msgid "Maximum value on the gauge axis" -msgstr "Največja vrednost na številčnici" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:279 +msgid "Intervals" +msgstr "Intervali" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:70 -msgid "May" -msgstr "Maj" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:285 +msgid "Interval bounds" +msgstr "Meje intervalov" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:93 -msgid "Mean of values over specified period" -msgstr "Povprečna vrednost v dani periodi" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:286 +msgid "" +"Comma-separated interval bounds, e.g. 2,4,5 for intervals 0-2, 2-4 and 4-5. Last " +"number should match the value provided for MAX." +msgstr "" +"Z vejico ločeni intervali, npr. 2,4,5 za intervale 0-2, 2-4 in 4-5. Zadnja " +"številka naj bo enaka vrednosti za MAX." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:230 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:299 +msgid "Interval colors" +msgstr "Barve intervalov" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:300 msgid "" -"Median edge width, the thickest edge will be 4 times thicker than the " -"thinnest." +"Comma-separated color picks for the intervals, e.g. 1,2,4. Integers denote colors " +"from the chosen color scheme and are 1-indexed. Length must be matching that of " +"interval bounds." msgstr "" -"Mediana debeline povezave. Najdebelejša povezava bo 4-krat debelejša od " -"najtanjše." +"Z vejico ločene barve za intervale, npr. 1,2,4. Cela števila predstavljajo barve " +"iz barvne sheme (začnejo se z 1). Dolžina mora ustrezati mejam intervala." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:217 +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:39 msgid "" -"Median node size, the largest node will be 4 times larger than the " -"smallest" +"Uses a gauge to showcase progress of a metric towards a target. The position of " +"the dial represents the progress and the terminal value in the gauge represents " +"the target value." msgstr "" -"Mediana velikosti vozlišča. Največje vozlišče bo 4-krat večje od " -"najmanjšega" +"Uporablja števec za prikaz napredovanja mere k ciljni vrednosti. Položaj kazalca " +"predstavlja napredek, končna vrednost na števcu pa ciljno vrednost." -#: superset-frontend/src/dashboard/util/headerStyleOptions.ts:30 -msgid "Medium" -msgstr "Srednje" +#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:42 +msgid "Gauge Chart" +msgstr "Števčni grafikon" -#: superset-frontend/src/components/ReportModal/index.tsx:275 -msgid "Message Content" -msgstr "Vsebina sporočila" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:53 +msgid "Name of the source nodes" +msgstr "Imena izvornih vozlišč" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1292 -msgid "Message content" -msgstr "Vsebina sporočila" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:63 +msgid "Name of the target nodes" +msgstr "Imena ciljnih vozlišč" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:105 -msgid "Metadata" -msgstr "Metapodatki" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:73 +msgid "Source category" +msgstr "Kategorija izvora" -#: superset/connectors/druid/views.py:240 -msgid "Metadata Last Refreshed" -msgstr "Meta-podatki nazadnje osveženi" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:74 +msgid "" +"The category of source nodes used to assign colors. If a node is associated with " +"more than one category, only the first will be used." +msgstr "" +"Kategorija izvornih vozlišč, na podlagi katere je določena barva. Če je vozlišče " +"povezano z več kot eno kategorijo, bo uporabljena samo prva." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:437 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:442 -msgid "Metadata Parameters" -msgstr "Parametri metapodatkov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:86 +msgid "Target category" +msgstr "Kategorija cilja" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:617 -msgid "Metadata has been synced" -msgstr "Metapodatki so sinhronizirani" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:87 +msgid "Category of target nodes" +msgstr "Kategorija ciljnih vozlišč" -#: superset/connectors/sqla/views.py:602 -#, python-format -msgid "Metadata refreshed for the following table(s): %(tables)s" -msgstr "Metapodatki osveženi za naslednje tabele: %(tables)s" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:96 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:107 +msgid "Chart options" +msgstr "Možnosti grafikona" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:378 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:261 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:506 -#: superset-frontend/src/explore/controlPanels/sections.tsx:268 -msgid "Method" -msgstr "Metoda" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:101 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:110 +msgid "Layout" +msgstr "Izgled" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:113 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:114 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:151 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:152 -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:84 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:97 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1036 -#: superset-frontend/src/explore/controls.jsx:167 -#: superset-frontend/src/explore/controls.jsx:168 -#: superset/connectors/druid/views.py:187 superset/connectors/sqla/views.py:255 -msgid "Metric" -msgstr "Mera" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:108 +msgid "Graph layout" +msgstr "Izgled grafikona" -#: superset/connectors/sqla/models.py:1079 -#: superset/connectors/sqla/models.py:1509 -#, python-format -msgid "Metric '%(metric)s' does not exist" -msgstr "Mera '%(metric)s' ne obstaja" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:111 +msgid "Force" +msgstr "Sila" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:38 -msgid "Metric ascending" -msgstr "Naraščajoča mera" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:114 +msgid "Layout type of graph" +msgstr "Tip izgleda grafikona" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:148 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:407 -#: superset-frontend/src/explore/controls.jsx:422 -msgid "Metric assigned to the [X] axis" -msgstr "Mera za [X] os" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:124 +msgid "Edge symbols" +msgstr "Simboli povezav" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:154 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:415 -#: superset-frontend/src/explore/controls.jsx:430 -msgid "Metric assigned to the [Y] axis" -msgstr "Mera za [Y] os" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:125 +msgid "Symbol of two ends of edge line" +msgstr "Simbol za konca povezave" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:103 -msgid "Metric change in value from `since` to `until`" -msgstr "Sprememba mere od vrednosti \"OD\" do \"DO\"" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:128 +msgid "None -> None" +msgstr "Brez -> Brez" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:39 -msgid "Metric descending" -msgstr "Padajoča mera" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:129 +msgid "None -> Arrow" +msgstr "Brez -> Puščica" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:117 -msgid "Metric factor change from `since` to `until`" -msgstr "Sprememba faktorja mere od vrednosti \"OD\" do \"DO\"" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:130 +msgid "Circle -> Arrow" +msgstr "Krog -> Puščica" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:119 -msgid "Metric for Color" -msgstr "Mera za barvo" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:131 +msgid "Circle -> Circle" +msgstr "Krog -> Krog" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:98 -msgid "Metric for node values" -msgstr "Mera za vrednosti vozlišč" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:141 +msgid "Enable node dragging" +msgstr "Omogoči premikanje vozlišč" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:658 -#, python-format -msgid "Metric name [%s] is duplicated" -msgstr "Ime mere [%s] je podvojeno" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:144 +msgid "Whether to enable node dragging in force layout mode." +msgstr "Če želite omogočiti premikanje vozlišč v načinu vsiljenega prikaza." -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:110 -msgid "Metric percent change in value from `since` to `until`" -msgstr "Procentualna sprememba mere od vrednosti \"OD\" do \"DO\"" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:161 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:270 +msgid "Enable graph roaming" +msgstr "Omogoči preoblikovanje grafikona" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:120 -msgid "Metric that defines the color of the country" -msgstr "Mera, ki določa barvo države" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:165 +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:185 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:274 +msgid "Disabled" +msgstr "Onemogočeno" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:124 -msgid "Metric that defines the size of the bubble" -msgstr "Mera, ki določa velikost mehurčka" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:166 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:275 +msgid "Scale only" +msgstr "Samo povečava" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:85 -msgid "Metric to display bottom title" -msgstr "Mera za prikaz spodnjega naslova" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:167 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:276 +msgid "Move only" +msgstr "Samo premikanje" -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:185 -msgid "Metric to sort the results by" -msgstr "Mera za razvrščanje rezultatov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:168 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:277 +msgid "Scale and Move" +msgstr "Povečava in premikanje" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:142 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:421 -msgid "Metric used to calculate bubble size" -msgstr "Mera za izračun velikosti mehurčkov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:170 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:279 +msgid "Whether to enable changing graph position and scaling." +msgstr "Če želite omogočiti premikanje in povečevanje/zmanjševanje grafikona." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:127 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:371 -#: superset-frontend/src/explore/controls.jsx:387 -msgid "" -"Metric used to define how the top series are sorted if a series or row " -"limit is present. If undefined reverts to the first metric (where " -"appropriate)." -msgstr "" -"Mera, ki določa kako so razvrščene prve serije, če je določena omejitev " -"serij ali vrstic. Če ni določena, se uporabi prva mera (kjer je " -"ustrezno)." +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:182 +msgid "Node select mode" +msgstr "Način izbire vozlišč" -#: superset/connectors/druid/models.py:1072 -msgid "Metric(s) {} must be aggregations." -msgstr "Mere {} morajo biti agregacije." +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:186 +msgid "Single" +msgstr "Posamezno" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:99 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:137 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1196 -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:301 -#: superset-frontend/src/explore/controls.jsx:152 -#: superset/connectors/druid/views.py:159 superset/connectors/sqla/views.py:212 -msgid "Metrics" -msgstr "Mere" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:187 +msgid "Multiple" +msgstr "Več" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:148 -msgid "" -"Metrics for which percentage of total are to be displayed. Calculated " -"from only data within the row limit." -msgstr "" -"Mera, za katero je prikazan odstotek od celote. Izračunan je samo iz " -"podatkov znotraj omejitve števila vrstic." +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:189 +msgid "Allow node selections" +msgstr "Dovoli izbiro vozlišča" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:93 -msgid "Midnight" -msgstr "Polnoč" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:198 +msgid "Label threshold" +msgstr "Prag oznak" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:88 -#: superset-frontend/src/explore/components/controls/BoundsControl.jsx:112 -msgid "Min" -msgstr "Min" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:202 +msgid "Minimum value for label to be displayed on graph." +msgstr "Najmanjša vrednost, za katero bo na grafikonu prikazana oznaka." -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:290 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:173 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:193 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:424 -msgid "Min Periods" -msgstr "Min. št. period" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:213 +msgid "Node size" +msgstr "Velikost vozlišča" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:90 -msgid "Min Width" -msgstr "Min. širina" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:217 +msgid "Median node size, the largest node will be 4 times larger than the smallest" +msgstr "" +"Mediana velikosti vozlišča. Največje vozlišče bo 4-krat večje od najmanjšega" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:73 -#: superset-frontend/src/explore/controlPanels/sections.tsx:189 -msgid "Min periods" -msgstr "Min. št. period" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:226 +msgid "Edge width" +msgstr "Debelina povezave" -#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:170 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:167 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:278 -msgid "Mine" -msgstr "Moje" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:230 +msgid "" +"Median edge width, the thickest edge will be 4 times thicker than the thinnest." +msgstr "" +"Mediana debeline povezave. Najdebelejša povezava bo 4-krat debelejša od najtanjše." -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:257 -msgid "Minimize chart" -msgstr "Pomanjšaj grafikon" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:241 +msgid "Edge length" +msgstr "Dolžina povezave" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1260 -#, fuzzy -msgid "Minimum" -msgstr "minuta" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:247 +msgid "Edge length between nodes" +msgstr "Dolžina povezave med vozlišči" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:57 -msgid "Minimum Font Size" -msgstr "Min. velikost pisave" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:262 +msgid "Gravity" +msgstr "Gravitacija" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:78 -msgid "Minimum leaf node event count" -msgstr "Min. število dogodkov za list" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:268 +msgid "Strength to pull the graph toward center" +msgstr "Sila privlačnosti med grafikonom in središčem" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:85 -msgid "Minimum threshold in percentage points for showing labels." -msgstr "Minimalni prag v odstotnih točkah za prikaz oznak." +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:283 +msgid "Repulsion" +msgstr "Odbijanje" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:202 -msgid "Minimum value for label to be displayed on graph." -msgstr "Najmanjša vrednost, za katero bo na grafikonu prikazana oznaka." +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:289 +msgid "Repulsion strength between nodes" +msgstr "Odbojna sila med vozlišči" + +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:304 +msgid "Friction" +msgstr "Trenje" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:89 -msgid "Minimum value on the gauge axis" -msgstr "Najmanjša vrednost na številčnici" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:310 +msgid "Friction between nodes" +msgstr "Trenje med vozlišči" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:328 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:243 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:206 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:186 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:203 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:259 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:262 -msgid "Minor Split Line" -msgstr "Manjša ločilna črta" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:34 +msgid "" +"Displays connections between entities in a graph structure. Useful for mapping " +"relationships and showing which nodes are important in a network. Graph charts " +"can be configured to be force-directed or circulate. If your data has a " +"geospatial component, try the deck.gl Arc chart." +msgstr "" +"Prikaže povezave med entitetami v strukturi grafa. Uporabno za prikaz razmerij in " +"pomembnih točk v omrežju. Grafikon je lahko krožnega tipa ali z usmerjenimi " +"silami. Če imajo podatki geoprostorsko komponento, poskusite grafikon decl.gl - " +"Arc." -#: superset/db_engine_specs/base.py:89 -msgid "Minute" -msgstr "Minuta" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:37 +msgid "Graph Chart" +msgstr "Graf" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:64 -#, fuzzy, python-format -msgid "Minutes %s" -msgstr "minuta" +#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:45 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:45 +msgid "Structural" +msgstr "Strukturni" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:93 -#, fuzzy -msgid "Missing Required Fields" -msgstr "Zahtevano je ime" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:150 +msgid "Series type" +msgstr "Tip serije" -#: superset-frontend/src/components/ErrorMessage/DatasetNotFoundErrorMessage.tsx:34 -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:251 -msgid "Missing dataset" -msgstr "Manjka podatkovni set" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:162 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:117 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:118 +msgid "Series chart type (line, bar etc)" +msgstr "Tip grafikona za posamezno podatkovno serijo (črtni, stolpčni, ...)" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:67 -msgid "Mixed Time-Series" -msgstr "Kombiniran grafikon časovne vrste" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:183 +msgid "Area chart" +msgstr "Ploščinski grafikon" -#: superset-frontend/src/dashboard/components/AddSliceCard.jsx:128 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:312 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:309 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:359 -#: superset/connectors/druid/views.py:355 superset/connectors/sqla/views.py:371 -#: superset/connectors/sqla/views.py:506 superset/views/dashboard/mixin.py:86 -#: superset/views/dashboard/views.py:158 superset/views/database/mixins.py:202 -#: superset/views/sql_lab.py:72 -msgid "Modified" -msgstr "Spremenjeno" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:186 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:128 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:131 +msgid "Draw area under curves. Only applicable for line types." +msgstr "Izriši površino pod krivuljo. Samo za črtne grafikone." -#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:155 -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:164 -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:130 -#, python-format -msgid "Modified %s" -msgstr "Zadnja sprememba %s" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:217 +msgid "Opacity of area chart." +msgstr "Prosojnost ploščinskega grafikona." -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:303 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:291 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:319 -msgid "Modified by" -msgstr "Spremenil" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:226 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:174 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:83 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:100 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:158 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:161 +msgid "Marker" +msgstr "Marker" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:604 -#, python-format -msgid "Modified columns: %s" -msgstr "Spremenjeni stolpci: %s" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:229 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:177 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:86 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:103 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:161 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:164 +msgid "Draw a marker on data points. Only applicable for line types." +msgstr "Nariši markerje na točke grafikona. Samo za črtne grafikone." -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:57 -msgid "Monday" -msgstr "Ponedeljek" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:240 +msgid "Marker size" +msgstr "Velikost markerja" -#: superset/db_engine_specs/base.py:98 -msgid "Month" -msgstr "Mesec" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:245 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:193 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:102 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:119 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:177 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:180 +msgid "Size of marker. Also applies to forecast observations." +msgstr "Velikost markerja. Upošteva se tudi za napovedi." -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:68 -#, fuzzy, python-format -msgid "Months %s" -msgstr "mesec" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:258 +msgid "Primary" +msgstr "Primarna" -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:238 -msgid "More dataset related options" -msgstr "Več nastavitev za podatkovni set" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:259 +msgid "Secondary" +msgstr "Sekundarna" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:167 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:276 -msgid "Move only" -msgstr "Samo premikanje" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:264 +msgid "Primary or secondary y-axis" +msgstr "Primarna ali sekundarna y-os" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:43 -msgid "Moves the given set of dates by a specified interval." -msgstr "Premakne dani nabor datumov za definirano obdobje." +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:296 +msgid "Shared query fields" +msgstr "Polja deljenih poizvedb" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:40 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:32 -msgid "Multi-Dimensions" -msgstr "Večdimenzionalni" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:301 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:312 +msgid "Query A" +msgstr "Poizvedba A" -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:34 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:41 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:37 -msgid "Multi-Layers" -msgstr "Večplastni" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:302 +msgid "Advanced analytics Query A" +msgstr "Poizvedba A za napredno analitiko" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:44 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:43 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:62 -msgid "Multi-Levels" -msgstr "Večplastni" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:303 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:313 +msgid "Query B" +msgstr "Poizvedba B" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:42 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:32 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:44 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:74 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:58 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:30 -msgid "Multi-Variables" -msgstr "Več spremenljivk" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:304 +msgid "Advanced analytics Query B" +msgstr "Poizvedba B za napredno analitiko" + +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:319 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:206 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:347 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:115 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:132 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:190 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:193 +msgid "Data Zoom" +msgstr "Zoom funkcija" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:187 -msgid "Multiple" -msgstr "Več" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:322 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:209 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:350 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:118 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:135 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:193 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:196 +msgid "Enable data zooming controls" +msgstr "Omogoči kontrolnik za povečavo podatkov" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:30 -msgid "Multiple Line Charts" -msgstr "Veččrtni grafikon" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:336 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:234 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:144 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:160 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:218 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:221 +msgid "Rotate x axis label" +msgstr "Zavrti oznako x-osi" -#: superset/views/database/views.py:439 -msgid "" -"Multiple file extensions are not allowed for columnar uploads. Please " -"make sure all files are of the same extension." -msgstr "" -"Za nalaganje stolpčnih datotek niso dovoljene različne končnice. " -"Poskrbite, da imajo vse datoteke enake končnice." +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:343 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:241 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:181 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:151 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:167 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:225 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:228 +msgid "Input field supports custom rotation. e.g. 30 for 30°" +msgstr "Vnosno polje omogoča poljubno rotacijo (vnesite 30 za 30°)" -#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:185 -msgid "" -"Multiple formats accepted, look the geopy.points Python library for more " -"details" -msgstr "" -"Sprejema različne zapise - podrobnosti najdete v Pythonovi knjižnici " -"geopy.points" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:357 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:268 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:219 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:179 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:196 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:252 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:255 +msgid "Minor Split Line" +msgstr "Manjša ločilna črta" -#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:59 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:77 -msgid "Multiple select" -msgstr "Več izborov" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:360 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:271 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:182 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:199 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:255 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:258 +msgid "Draw split lines for minor y-axis ticks" +msgstr "Izriši ločilne črte za pomožne oznake y-osi" -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:218 -msgid "Multiple selections allowed, otherwise filter is limited to a single value" -msgstr "Lahko izberete več elementov, drugače pa je filter omejen na eno vrednost" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:369 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:280 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:191 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:208 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:264 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:267 +msgid "Truncate Y Axis" +msgstr "Prireži Y-os" -#: superset/dashboards/commands/exceptions.py:39 -msgid "Must be unique" -msgstr "Mora biti unikaten" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:372 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:283 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:194 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:211 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:267 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:270 +msgid "Truncate Y Axis. Can be overridden by specifying a min or max bound." +msgstr "" +"Prireži Y-os. Če določite spodnjo ali zgornjo mejo, preprečite prirezovanje." -#: superset/viz.py:2309 -msgid "Must have a [Group By] column to have 'count' as the [Label]" -msgstr "Mora imeti stolpec [Združevanje], da ima število (count) kot [Oznaka]" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:400 +msgid "Primary y-axis format" +msgstr "Oblika primarne y-osi" -#: superset/viz.py:1720 -msgid "Must have at least one numeric column specified" -msgstr "Definiran mora biti vsaj en numerični stolpec" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:409 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:433 +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:442 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:256 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:259 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:167 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:170 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:184 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:187 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:240 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:243 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:243 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:246 +msgid "Logarithmic y-axis" +msgstr "Logaritemska y-os" -#: superset/connectors/sqla/models.py:1303 -msgid "Must specify a value for filters with comparison operators" -msgstr "Potrebno je podati vrednost za filter s primerjalnim operandom" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:412 +msgid "Logarithmic scale on primary y-axis" +msgstr "Logaritemska skala na primarni y-osi" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx:47 -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelectPopoverTitle.jsx:59 -#, fuzzy -msgid "My column" -msgstr "stolpec" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:421 +msgid "Secondary y-axis format" +msgstr "Oblika sekundarne y-osi" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.jsx:73 -msgid "My metric" -msgstr "Moja mera" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:430 +msgid "Secondary y-axis title" +msgstr "Naslov sekundarne y-osi" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:76 -msgid "N/A" -msgstr "N/A" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:445 +msgid "Logarithmic scale on secondary y-axis" +msgstr "Logaritemska skala na sekundarni y-osi" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:101 -msgid "NOV" -msgstr "NOV" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:61 +msgid "" +"Visualize two different series using the same x-axis. Note that both series can " +"be visualized with a different chart type (e.g. 1 using bars and 1 using a line)." +msgstr "" +"Prikaže dva različna niza na isti x-osi. Niza sta lahko prikazana z različnim " +"tipom grafikona (npr. en s stolpci in drug s črto)." -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:232 -msgid "NOW" -msgstr "ZDAJ" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:64 +msgid "" +"Visualize two different time series using the same x-axis. Note that each time " +"series can be visualized differently (e.g. 1 using bars and 1 using a line)." +msgstr "" +"Prikaže dve različni časovni vrsti na isti x-osi. Časovni vrsti sta lahko " +"prikazani različno (npr. ena s stolpci in druga s črto)." -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:72 -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:123 -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:211 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:230 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:232 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:722 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:233 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:131 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:131 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:279 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:273 -#: superset/views/annotations.py:126 superset/views/chart/mixin.py:86 -msgid "Name" -msgstr "Ime" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:74 +msgid "Mixed Chart" +msgstr "Kombinirani grafikon" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:779 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:785 -msgid "Name is required" -msgstr "Zahtevano je ime" +#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:75 +msgid "Mixed Time-Series" +msgstr "Kombiniran grafikon časovne vrste" -#: superset/annotation_layers/commands/exceptions.py:66 -#: superset/reports/commands/exceptions.py:167 -msgid "Name must be unique" -msgstr "Ime mora biti unikatno" +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:164 +msgid "Put the labels outside of the pie?" +msgstr "Postavim oznake zunaj torte?" -#: superset/views/database/forms.py:380 -msgid "Name of table to be created from columnar data." -msgstr "Ime tabele, ki bo ustvarjena iz podatkov v stolpcih." +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:175 +msgid "Label Line" +msgstr "Črta oznake" -#: superset/views/database/forms.py:96 -msgid "Name of table to be created from csv data." -msgstr "Ime tabele, ki bo ustvarjena iz CSV podatkov." +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:178 +msgid "Draw line from Pie to label when labels outside?" +msgstr "Ali želite črto do oznake, ko so le-te zunaj?" -#: superset/views/database/forms.py:247 -msgid "Name of table to be created from excel data." -msgstr "Ime tabele, ki bo ustvarjena iz Excel-ovih podatkov." +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:191 +msgid "Show Total" +msgstr "Pokaži vsoto" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:61 -msgid "Name of the column containing the id of the parent node" -msgstr "Ime stolpca, ki vsebuje id nadrejenega vozlišča" +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:194 +msgid "Whether to display the aggregate count" +msgstr "Če želite prikazati agregirano število" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:51 -msgid "Name of the id column" -msgstr "Naziv id-stolpca" +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:199 +msgid "Pie shape" +msgstr "Oblika torte" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:53 -msgid "Name of the source nodes" -msgstr "Imena izvornih vozlišč" +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:205 +msgid "Outer Radius" +msgstr "Zunanji polmer" -#: superset/connectors/sqla/views.py:439 -msgid "Name of the table that exists in the source database" -msgstr "Ime tabele, ki obstaja v izvorni podatkovni bazi" +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:211 +msgid "Outer edge of Pie chart" +msgstr "Zunanji rob tortnega grafikona" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:63 -msgid "Name of the target nodes" -msgstr "Imena ciljnih vozlišč" +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:232 +msgid "Inner Radius" +msgstr "Notranji polmer" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:51 -msgid "Name your database" -msgstr "Poimenujte podatkovno bazo" +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:238 +msgid "Inner radius of donut hole" +msgstr "Notranji polmer kolobarja" -#: superset-frontend/src/chart/chartReducer.ts:106 -#: superset-frontend/src/chart/chartReducer.ts:170 -msgid "Network error." -msgstr "Napaka omrežja." +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:54 +msgid "" +"The classic. Great for showing how much of a company each investor gets, what " +"demographics follow your blog, or what portion of the budget goes to the military " +"industrial complex.\n" +"\n" +" Pie charts can be difficult to interpret precisely. If clarity of " +"relative proportion is important, consider using a bar or other chart type " +"instead." +msgstr "" +"Standardni grafikon za prikaz deležev. Tortne grafikone je težje natančno " +"interpretirati, takrat lahko uporabite npr. stolpčni grafikon." -#: superset/templates/appbuilder/navbar_right.html:35 -msgid "New" -msgstr "Nov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/transformProps.ts:319 +#, python-format +msgid "Total: %s" +msgstr "Vsota: %s" -#: superset-frontend/src/components/ReportModal/index.tsx:251 -msgid "New Email Report" -msgstr "Novo e-poštno poročilo" +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:49 +msgid "The maximum value of metrics. It is an optional configuration" +msgstr "Največja vrednost mere. To je opcijska nastavitev" -#: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:61 -msgid "New chart" -msgstr "Nov grafikon" +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:123 +msgid "Label position" +msgstr "Položaj oznake" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:614 -#, python-format -msgid "New columns added: %s" -msgstr "Dodani novi stolpci: %s" +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:161 +msgid "Radar" +msgstr "Radar" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx:81 -msgid "New filter set" -msgstr "Nov set filtrov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:167 +msgid "Customize Metrics" +msgstr "Prilagodi mere" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:327 -msgid "New tab" -msgstr "Nov zavihek" +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:168 +msgid "Further customize how to display each metric" +msgstr "Dodatne prilagoditve prikaza posameznih mer" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:420 -msgid "New tab (Ctrl + q)" -msgstr "Nov zavihek (Ctrl + q)" +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:201 +msgid "Circle radar shape" +msgstr "Okrogla oblika radarja" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:421 -msgid "New tab (Ctrl + t)" -msgstr "Nov zavihek (Ctrl + t)" +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:204 +msgid "Radar render type, whether to display 'circle' shape." +msgstr "Način prikaza radarja - če se prikaže okrogla oblika." -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:133 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:113 -msgid "Next" -msgstr "Naslednji" +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:50 +msgid "" +"Visualize a parallel set of metrics across multiple groups. Each group is " +"visualized using its own line of points and each metric is represented as an edge " +"in the chart." +msgstr "" +"Prikaže vzporedni nabor mer za različne skupine. Vsaka skupina je prikazana s " +"svojim naborom točk in vsaka mera s povezavo na grafikonu." -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:29 -msgid "Nightingale Rose Chart" -msgstr "Nightingale Rose grafikon" +#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:53 +msgid "Radar Chart" +msgstr "Radarski grafikon" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:444 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:538 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:441 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:512 -msgid "No" -msgstr "Ne" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:73 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:280 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:65 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:71 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:72 +msgid "Contribution Mode" +msgstr "Način deležev" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:74 -#, python-format -msgid "No %(tableName)s yet" -msgstr "" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:80 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:287 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:72 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:78 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:79 +msgid "Calculate contribution per series or row" +msgstr "Izračunaj delež za serijo ali vrstico" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:376 -#, python-format -msgid "No %s yet" -msgstr "%s še ne obstajajo" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:107 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:106 +msgid "Series Style" +msgstr "Slog serije" -#: superset/templates/superset/request_access.html:20 -msgid "No Access!" -msgstr "Ni dostopa!" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:126 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:139 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:142 +msgid "Area chart opacity" +msgstr "Prosojnost ploščinskega grafikona" -#: superset-frontend/src/components/ListView/ListView.tsx:398 -msgid "No Data" -msgstr "Ni podatkov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:132 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:145 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:148 +msgid "Opacity of Area Chart. Also applies to confidence band." +msgstr "Prosojnost ploščinskega grafikona. Upošteva se tudi za interval zaupanja." -#: superset-frontend/packages/superset-ui-core/src/chart/components/NoResultsComponent.tsx:75 -msgid "No Results" -msgstr "Ni rezultatov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:188 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:97 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:114 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:172 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:175 +msgid "Marker Size" +msgstr "Velikost markerja" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:328 -msgid "No annotation layers yet" -msgstr "Slojev z oznakami še ni" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:52 +msgid "" +"Swiss army knife for visualizing data. Choose between step, line, scatter, and " +"bar charts. This viz type has many customization options as well." +msgstr "" +"Univerzalni grafikon za vizualizacijo podatkov. Izbirajte med stopničastimi, " +"črtnimi, raztresenimi in stolpčnimi grafikoni. Grafikon ima širok nabor " +"prilagoditev." -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:254 -msgid "No annotation yet" -msgstr "Oznak še ni" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:55 +msgid "" +"Swiss army knife for visualizing time series data. Choose between step, line, " +"scatter, and bar charts. This viz type has many customization options as well." +msgstr "" +"Univerzalni grafikon za prikaz časovnih vrst. Izbirajte med stopničnimi, črtnimi, " +"raztresenimi in stolpčnimi grafikoni. Grafikon ima širok nabor prilagoditev." -#: superset-frontend/src/profile/components/CreatedContent.tsx:45 -msgid "No charts" -msgstr "Ni grafikonov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:66 +msgid "Generic Chart" +msgstr "Generičen grafikon" -#: superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx:82 -msgid "No columns" -msgstr "Brez stolpcev" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:67 +msgid "Time-series Chart" +msgstr "Grafikon časovne vrste" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:134 -msgid "No compatible columns found" -msgstr "Ni najdenih skladnih stolpcev" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts:408 +msgid "zoom area" +msgstr "približaj območje" -#: superset-frontend/src/profile/components/CreatedContent.tsx:63 -msgid "No dashboards" -msgstr "Ni nadzornih plošč" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts:409 +msgid "restore zoom" +msgstr "ponastavi prikaz" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:189 -#: superset-frontend/src/explore/components/DataTablesPane/index.tsx:146 -#: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:255 -#: superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx:91 -msgid "No data" -msgstr "Ni podatkov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:58 +msgid "" +"Area charts are similar to line charts in that they represent variables with the " +"same scale, but area charts stack the metrics on top of each other." +msgstr "" +"Ploščinski grafikoni so podobni črtnim grafikonom, saj predstavljajo " +"spremenljivke v istem razmerju, vendar se pri ploščinskih grafikonih mere " +"nalagajo ena na drugo." -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:219 -msgid "No data after filtering or data is NULL for the latest time record" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:61 +msgid "" +"Time-series Area chart are similar to line chart in that they represent variables " +"with the same scale, but area charts stack the metrics on top of each other. An " +"area chart in Superset can be stream, stack, or expand." msgstr "" -"Ni podatkov po filtriranju ali pa imajo vrednost NULL za zadnji časovni " -"zapis" +"Ploščinski grafikoni časovne vrste so podobni črtnim grafikonom, saj " +"predstavljajo spremenljivke v istem razmerju, vendar se pri ploščinskih " +"grafikonih mere nalagajo ena na drugo." -#: superset/dashboards/commands/importers/v0.py:321 -msgid "No data in file" -msgstr "V datoteki ni podatkov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:72 +msgid "Area Chart v2" +msgstr "Ploščinski grafikon v2" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:752 -msgid "No description available." -msgstr "Opisa ni na razpolago." +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:73 +msgid "Time-series Area Chart" +msgstr "Ploščinski grafikon časovne vrste" -#: superset-frontend/src/profile/components/Favorites.tsx:46 -msgid "No favorite charts yet, go click on stars!" -msgstr "Priljubljenih grafikonov še ni. Kliknite na zvezdice!" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:69 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:100 +msgid "Axis Title" +msgstr "Naslov osi" -#: superset-frontend/src/profile/components/Favorites.tsx:64 -msgid "No favorite dashboards yet, go click on stars!" -msgstr "Priljubljenih nadzornih plošč še ni. Kliknite na zvezdice!" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:85 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:116 +msgid "AXIS TITLE MARGIN" +msgstr "OBROBA OZNAKE OSI" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:313 -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:35 -#: superset-frontend/src/explore/controls.jsx:342 -msgid "No filter" -msgstr "Brez filtra" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:133 +msgid "AXIS TITLE POSITION" +msgstr "POLOŽAJ OZNAKE OSI" -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:483 -msgid "No filter is selected." -msgstr "Noben filter ni izbran." +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:174 +msgid "Rotate axis label" +msgstr "Zavrti oznako osi" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:86 -msgid "No of Bins" -msgstr "Št. razdelkov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:194 +msgid "Axis Format" +msgstr "Oblika osi" -#: superset-frontend/src/SqlLab/components/QueryHistory/index.tsx:49 -msgid "No query history yet..." -msgstr "Zgodovine poizvedb še ni." +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:205 +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:208 +msgid "Logarithmic axis" +msgstr "Logaritemska os" -#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:494 -#: superset/templates/appbuilder/general/widgets/base_list.html:64 -msgid "No records found" -msgstr "Ni zapisov" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:222 +msgid "Draw split lines for minor axis ticks" +msgstr "Izriši ločilne črte za pomožne oznake osi" -#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:400 -msgid "No results found" -msgstr "Rezultati niso najdeni" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:233 +msgid "Truncate Axis" +msgstr "Prireži os" -#: superset-frontend/packages/superset-ui-core/src/chart/components/NoResultsComponent.tsx:63 -msgid "" -"No results were returned for this query. If you expected results to be " -"returned, ensure any filters are configured properly and the datasource " -"contains data for the selected time range." -msgstr "" -"Poizvedba ni vrnila rezultatov. Če ste pričakovali rezultate, poskrbite, " -"da so filtri pravilno nastavljeni in podatkovni vir vsebuje podatke za " -"izbrano časovno obdobje." +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:236 +msgid "It’s not recommended to truncate axis in Bar chart." +msgstr "V stolpčnem grafikonu ni priporočljivo omejiti osi." -#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:133 -msgid "No stored results found, you need to re-run your query" -msgstr "Rezultatov še ni shranjenih, ponovno morate zagnati poizvedbo" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:247 +msgid "Axis Bounds" +msgstr "Meje osi" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:268 -msgid "No such column found. To filter on a metric, try the Custom SQL tab." +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:250 +msgid "" +"Bounds for the axis. When left empty, the bounds are dynamically defined based on " +"the min/max of the data. Note that this feature will only expand the axis range. " +"It won't narrow the data's extent." msgstr "" -"Tak stolpec ni najden. Za filtriranje po meri uporabite prilagojen SQL " -"zavihek." - -#: superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx:81 -msgid "No time columns" -msgstr "Ni časovnih stolpcev" - -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:155 -msgid "Node label position" -msgstr "Položaj oznake vozlišča" +"Meje osi. Če je prazno, se meje nastavijo dinamično na podlagi min./max. " +"vrednosti podatkov. Funkcija omeji le prikaz, obseg podatkov pa ostane enak." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:182 -msgid "Node select mode" -msgstr "Način izbire vozlišč" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:304 +msgid "Chart Orientation" +msgstr "Orientacija grafikona" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:213 -msgid "Node size" -msgstr "Velikost vozlišča" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:313 +msgid "Bar orientation" +msgstr "Orientacija stolpcev" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:41 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:242 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:120 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:644 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:124 -msgid "None" -msgstr "Brez" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:317 +msgid "Horizontal" +msgstr "Vodoravno" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:129 -msgid "None -> Arrow" -msgstr "Brez -> Puščica" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:319 +msgid "Orientation of bar chart" +msgstr "Orientacija stolpčnega grafikona" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:128 -msgid "None -> None" -msgstr "Brez -> Brez" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:64 +msgid "Bar Charts are used to show metrics as a series of bars." +msgstr "Stolpčni grafikoni se uporabljajo za prikaz mer z nizi stolpcev." -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:43 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:77 -msgid "Normal" -msgstr "Normalna" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:65 +msgid "" +"Time-series Bar Charts are used to show the changes in a metric over time as a " +"series of bars." +msgstr "" +"Stolpčni grafikoni časovne vrste se uporabljajo za prikaz sprememb mere skozi čas " +"s pomočjo niza stolpcev." -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:165 -msgid "Normalize Across" -msgstr "Normiraj glede na" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:80 +msgid "Bar Chart v2" +msgstr "Stolpčni grafikon v2" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:315 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:141 -msgid "Normalized" -msgstr "Normiran" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:81 +msgid "Time-series Bar Chart v2" +msgstr "Stolpčni grafikon časovne vrste v2" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:81 -msgid "Not Time Series" -msgstr "Ni časovna vrsta" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:63 +msgid "" +"Line chart is used to visualize measurements taken over a given category. Line " +"chart is a type of chart which displays information as a series of data points " +"connected by straight line segments. It is a basic type of chart common in many " +"fields." +msgstr "" +"Črtni grafikon se uporablja se za vizualizacijo meritev zajetih skozi čas. " +"Posamezne točke so med seboj povezane z ravnimi črtami." -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:116 -msgid "Not null" -msgstr "Ni nič (null)" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:66 +msgid "" +"Time-series line chart is used to visualize repeated measurements taken over " +"regular time intervals. Line chart is a type of chart which displays information " +"as a series of data points connected by straight line segments. It is a basic " +"type of chart common in many fields." +msgstr "" +"Črtni grafikon časovne vrste je osnovni grafikon, ki se uporablja na različnih " +"področjih. Uporablja se za vizualizacijo meritev zajetih skozi čas. Posamezne " +"točke so med seboj povezane z ravnimi črtami." -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:57 -#, fuzzy -msgid "Not triggered" -msgstr "Ni ni sproženo" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:78 +msgid "Time-series Line Chart" +msgstr "Črtni grafikon časovne vrste" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:152 -msgid "Not up to date" -msgstr "Ni posodobljeno" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:62 +msgid "" +"Scatter Plot has the horizontal axis in linear units, and the points are " +"connected in order. It shows a statistical relationship between two variables." +msgstr "" +"Raztreseni grafikon ima vodoravno os v linearnih enotah, prikazuje podatkovne " +"točke v povezanem redu in prikazuje statistično razmerje med dvema " +"spremenljivkama." -#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:87 -#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:97 -msgid "Nothing triggered" -msgstr "Ni ni sproženo" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:65 +msgid "" +"Time-series Scatter Plot has time on the horizontal axis in linear units, and the " +"points are connected in order. It shows a statistical relationship between two " +"variables." +msgstr "" +"Raztreseni grafikon časovne vrste prikazuje podatkovne točke v povezanem redu in " +"prikazuje statistično razmerje med spremenljivkami." -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:260 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1348 -msgid "Notification method" -msgstr "Način obveščanja" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:76 +#: superset-frontend/plugins/preset-chart-xy/src/ScatterPlot/createMetadata.ts:26 +msgid "Scatter Plot" +msgstr "Raztreseni grafikon" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:76 -msgid "November" -msgstr "November" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:77 +msgid "Time-series Scatter Plot" +msgstr "Raztreseni grafikon časovne vrste" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:92 -msgid "Now" -msgstr "Zdaj" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:62 +msgid "" +"Smooth-line is a variation of the line chart. Without angles and hard edges, " +"Smooth-line sometimes looks smarter and more professional." +msgstr "" +"Zglajeni črtni grafikon je izpeljanka črtnega grafikona, ki zgladi ostre robove " +"krivulje." -#: superset/datasets/filters.py:26 -msgid "Null or Empty" -msgstr "Nič (NULL) ali prazen" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:65 +msgid "" +"Time-series Smooth-line is a variation of the line chart. Without angles and hard " +"edges, Smooth-line sometimes looks smarter and more professional." +msgstr "" +"Zglajeni grafikon časovne vrste je izpeljanka črtnega grafikona, ki zgladi ostre " +"robove krivulje." -#: superset/views/database/forms.py:233 superset/views/database/forms.py:366 -msgid "Null values" -msgstr "Prazne (Null) vrednosti" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:76 +msgid "Smooth Line" +msgstr "Zglajena črta" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:191 -msgid "Number Format" -msgstr "Oblika zapisa števila" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:77 +msgid "Time-series Smooth Line" +msgstr "Zglajeni črtni grafikon časovne vrste" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:56 -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:64 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:151 -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:128 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:75 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:77 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:210 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:95 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:99 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:112 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:149 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:120 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:137 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:113 -msgid "Number format" -msgstr "Oblika zapisa števila" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:105 +msgid "Step type" +msgstr "Stopnični tip" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:81 -msgid "Number of decimal digits to round numbers to" -msgstr "Število decimalnih mest za zaokroževanje števil" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:113 +msgid "" +"Defines whether the step should appear at the beginning, middle or end between " +"two data points" +msgstr "" +"Določa, če se na začetku, na sredini ali na koncu pojavi stopnica med dvema " +"točkama" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:100 -msgid "Number of decimal places with which to display lift values" -msgstr "Število decimalnih mest za prikaz vrednosti dviga" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:53 +msgid "" +"Stepped-line graph (also called step chart) is a variation of line chart but with " +"the line forming a series of steps between data points. A step chart can be " +"useful when you want to show the changes that occur at irregular intervals." +msgstr "" +"Stopničasti grafikon je izpeljanka črtnega grafikona, pri čemer krivuljo tvorijo " +"stopnice med posameznimi točkami. Koristen je za prikaz sprememb na posameznih " +"intervalih." -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:87 -msgid "Number of decimal places with which to display p-values" -msgstr "Število decimalnih mest za prikaz p-vrednosti" +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:56 +msgid "" +"Time-series Stepped-line graph (also called step chart) is a variation of line " +"chart but with the line forming a series of steps between data points. A step " +"chart can be useful when you want to show the changes that occur at irregular " +"intervals." +msgstr "" +"Stopnični grafikon časovne vrste je izpeljanka črtnega grafikona, pri čemer " +"krivuljo tvorijo stopnice med posameznimi točkami. Koristen je za prikaz sprememb " +"na posameznih intervalih." -#: superset/views/database/forms.py:194 superset/views/database/forms.py:335 -msgid "Number of rows of file to read." -msgstr "Število vrstic v datoteki za branje." +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:67 +msgid "Stepped Line" +msgstr "Stopničasta črta" -#: superset/views/database/forms.py:188 superset/views/database/forms.py:329 -msgid "Number of rows to skip at start of file." -msgstr "Število vrstic, ki se izpustijo na začetku datoteke." +#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:68 +msgid "Time-series Stepped Line" +msgstr "Stopnični črtni grafikon časovne vrste" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:231 -msgid "Number of split segments on the axis" -msgstr "Število razdelkov na osi" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:50 +msgid "Id" +msgstr "Id" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:119 -msgid "Number of steps to take between ticks when displaying the X scale" -msgstr "Število korakov med oznakami pri prikazu X-osi" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:51 +msgid "Name of the id column" +msgstr "Naziv id-stolpca" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:135 -msgid "Number of steps to take between ticks when displaying the Y scale" -msgstr "Število korakov med oznakami pri prikazu Y-osi" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:60 +msgid "Parent" +msgstr "Nadrejeni" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:295 -msgid "Numerical range" -msgstr "Številski obseg" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:61 +msgid "Name of the column containing the id of the parent node" +msgstr "Ime stolpca, ki vsebuje id nadrejenega vozlišča" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:100 -msgid "OCT" -msgstr "OKT" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:73 +msgid "Optional name of the data column." +msgstr "Opcijsko ime podatkovnega stolpca." -#: superset-frontend/src/components/Modal/Modal.tsx:198 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:797 -msgid "OK" -msgstr "OK" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:84 +msgid "Root node id" +msgstr "Id korenskega vozlišča" -#: superset-frontend/src/components/ImportModal/index.tsx:210 -msgid "OVERWRITE" -msgstr "OVERWRITE" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:85 +msgid "Id of root node of the tree." +msgstr "Id korenskega vozlišča drevesa." -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:75 -msgid "October" -msgstr "Oktober" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:98 +msgid "Metric for node values" +msgstr "Mera za vrednosti vozlišč" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:93 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:163 -msgid "Offline" -msgstr "Offline" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:117 +msgid "Tree layout" +msgstr "Oblika drevesa" -#: superset/connectors/sqla/views.py:496 -msgid "Offset" -msgstr "Odmik" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:120 +msgid "Orthogonal" +msgstr "Pravokotna" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:58 -#, fuzzy -msgid "On Grace" -msgstr "Sila" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:121 +msgid "Radial" +msgstr "Radialna" -#: superset/views/alerts.py:191 -msgid "" -"Once an alert is triggered, how long, in seconds, before Superset nags " -"you again." -msgstr "" -"Kako dolgo naj traja (v sekundah), da vas Superset ponovno opomni, ko je " -"opozorilo sproženo." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:123 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:246 +msgid "Layout type of tree" +msgstr "Način izgleda drevesa" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:33 -#: superset-frontend/src/explore/controls.jsx:126 -msgid "" -"One or many columns to group by. High cardinality groupings should " -"include a series limit to limit the number of fetched and rendered " -"series." -msgstr "" -"Eden ali več stolpcev za združevanje. Združevanje z visoko kardinalnostjo" -" naj vsebuje omejitev serij, s čimer omejite število pridobljenih in " -"prikazanih serij." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:134 +msgid "Tree orientation" +msgstr "Orientacija drevesa" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:105 -msgid "" -"One or many columns to group by. High cardinality groupings should " -"include a sort by metric and series limit to limit the number of fetched " -"and rendered series." -msgstr "" -"Eden ali več stolpcev za združevanje. Združevanje z visoko kardinalnostjo" -" naj vsebuje mero za razvrščanje in omjitev serij, s čimer omejite " -"število pridobljenih in prikazanih serij." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:137 +msgid "Left to Right" +msgstr "Iz leve proti desni" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:56 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:215 -msgid "One or many columns to pivot as columns" -msgstr "En ali več stolpcev za stolpčno vrtenje" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:138 +msgid "Right to Left" +msgstr "Iz desne proti levi" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:323 -msgid "" -"One or many controls to group by. If grouping, latitude and longitude " -"columns must be present." -msgstr "" -"Eden ali več kontrolnikov za združevanje. Pri združevanju morata biti " -"prisotna stolpca širine in dolžine." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:139 +msgid "Top to Bottom" +msgstr "Iz vrha proti dnu" -#: superset-frontend/src/explore/controls.jsx:246 -msgid "One or many controls to pivot as columns" -msgstr "En ali več kontrolnikov za stolpčno vrtenje" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:140 +msgid "Bottom to Top" +msgstr "Iz dna proti vrhu" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:107 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:145 -#: superset-frontend/src/explore/controls.jsx:162 -msgid "One or many metrics to display" -msgstr "Ena ali več mer za prikaz" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:142 +msgid "Orientation of tree" +msgstr "Orientacija drevesa" -#: superset/datasets/commands/exceptions.py:90 -msgid "One or more columns already exist" -msgstr "En ali več stolpcev že obstaja" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:155 +msgid "Node label position" +msgstr "Položaj oznake vozlišča" -#: superset/datasets/commands/exceptions.py:80 -msgid "One or more columns are duplicated" -msgstr "En ali več stolpcev je podvojenih" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:158 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:176 +msgid "left" +msgstr "levo" -#: superset/datasets/commands/exceptions.py:70 -msgid "One or more columns do not exist" -msgstr "En ali več stolpcev ne obstaja" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:159 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:177 +msgid "top" +msgstr "zgoraj" -#: superset/datasets/commands/exceptions.py:119 -msgid "One or more metrics already exist" -msgstr "Ena ali več mer že obstaja" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:160 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:178 +msgid "right" +msgstr "desno" -#: superset/datasets/commands/exceptions.py:109 -msgid "One or more metrics are duplicated" -msgstr "Ena ali več mer je podvojenih" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:161 +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:179 +msgid "bottom" +msgstr "spodaj" -#: superset/datasets/commands/exceptions.py:99 -msgid "One or more metrics do not exist" -msgstr "Ena ali več mer ne obstaja" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:163 +msgid "Position of intermidiate node label on tree" +msgstr "Položaj vmesne oznake vozlišča na drevesu" -#: superset/errors.py:113 -msgid "One or more parameters needed to configure a database are missing." -msgstr "En ali več parametrov, potrebnih za nastavitev podatkovne baze, manjka." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:173 +msgid "Child label position" +msgstr "Položaj podrejene oznake" -#: superset/errors.py:127 -msgid "One or more parameters specified in the query are malformatted." -msgstr "En ali več parametrov v SQL-poizvedbi ima napačno obliko." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:181 +msgid "Position of child node label on tree" +msgstr "Položaj oznake podrejenega vozlišča na drevesu" -#: superset/errors.py:101 -msgid "One or more parameters specified in the query are missing." -msgstr "En ali več parametrov v SQL-poizvedbi manjka." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:191 +msgid "Emphasis" +msgstr "Poudari" -#: superset/views/core.py:2075 -msgid "" -"One or more required fields are missing in the request. Please try again," -" and if the problem persists conctact your administrator." -msgstr "" -"Eno ali več zahtevanih polj manjka v zahtevi. Poskusite znova, če težava " -"ostane, kontaktirajte administratorja." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:194 +msgid "ancestor" +msgstr "nadrejeni" -#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:46 -msgid "One ore more annotation layers failed loading." -msgstr "Eden ali več slojev z oznakami se ni naložil." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:195 +msgid "descendant" +msgstr "podrejeni" -#: superset/sql_lab.py:201 -msgid "Only SELECT statements are allowed against this database." -msgstr "Za to podatkovno bazo so dovoljeni le `SELECT` stavki." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:197 +msgid "Which relatives to highlight on hover" +msgstr "Kateri element se poudari na prehodu z miško" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:128 -msgid "Only Total" -msgstr "Samo vsota" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:210 +msgid "Symbol" +msgstr "Simbol" -#: superset/connectors/sqla/utils.py:96 -msgid "Only `SELECT` statements are allowed" -msgstr "Dovoljeni so le `SELECT` stavki" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:214 +msgid "Empty circle" +msgstr "Prazen krog" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:131 -msgid "Only selected panels will be affected by this filter" -msgstr "Ta filter bo vplival le na izbrane panele" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:218 +msgid "Circle" +msgstr "Krog" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:131 -msgid "" -"Only show the total value on the stacked chart, and not show on the " -"selected category" -msgstr "" -"Na naloženem grafikonu prikaži samo skupno vsoto, za izbrane kategorije " -"pa ne" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:222 +msgid "Rectangle" +msgstr "Pravokotnik" -#: superset/connectors/sqla/utils.py:105 -msgid "Only single queries supported" -msgstr "Podprte so le enojne poizvedbe" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:226 +msgid "Triangle" +msgstr "Trikotnik" -#: superset/views/database/forms.py:111 superset/views/database/forms.py:262 -#: superset/views/database/forms.py:397 -#, python-format -msgid "Only the following file extensions are allowed: %(allowed_extensions)s" -msgstr "Dovoljene so le naslednje končnice: %(allowed_extensions)s" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:230 +msgid "Diamond" +msgstr "Karo" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:236 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:196 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:636 -msgid "Opacity" -msgstr "Prosojnost" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:234 +msgid "Pin" +msgstr "Žebljiček" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:137 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:152 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:155 -msgid "Opacity of Area Chart. Also applies to confidence band." -msgstr "Prosojnost ploščinskega grafikona. Upošteva se tudi za interval zaupanja." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:238 +msgid "Arrow" +msgstr "Puščica" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:239 -msgid "Opacity of all clusters, points, and labels. Between 0 and 1." -msgstr "Prosojnost vseh gruč, točk in oznak (vrednost med 0 in 1)." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:255 +msgid "Symbol size" +msgstr "Velikost simbola" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:202 -msgid "Opacity of area chart." -msgstr "Prosojnost ploščinskega grafikona." +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:261 +msgid "Size of edge symbols" +msgstr "Velikost simbola povezave" -#: superset-frontend/src/explore/components/ExploreViewContainer.jsx:550 -msgid "Open Datasource tab" -msgstr "Odpri zavihek s podatkovnim virom" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:35 +msgid "Visualize multiple levels of hierarchy using a familiar tree-like structure." +msgstr "Prikaz več hierarhičnih nivojev z drevesno strukturo." -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:141 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:121 -msgid "Open in SQL Lab" -msgstr "Odpri v SQL laboratoriju" +#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:39 +msgid "Tree Chart" +msgstr "Drevesni grafikon" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:317 -msgid "Open query in SQL Lab" -msgstr "Odpri poizvedbo v SQL laboratoriju" +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:83 +msgid "Show Upper Labels" +msgstr "Prikaži zgornje oznake" -#: superset/views/database/mixins.py:105 -msgid "" -"Operate the database in asynchronous mode, meaning that the queries are " -"executed on remote workers as opposed to on the web server itself. This " -"assumes that you have a Celery worker setup as well as a results backend." -" Refer to the installation docs for more information." -msgstr "" -"Upravljanje podatkovne baze v asinhronem načinu pomeni, da se poizvedbe " -"zaženejo na oddaljenih »delavcih« in ne na samem spletnem strežniku. S " -"tem je predpostavljeno, da imate nastavljenega »delavca« za Celery in " -"zaledni sistem za rezultate. Več informacij je v navodilih za namestitev." +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:86 +msgid "Show labels when the node has children." +msgstr "Prikaži oznake, ko ima vozlišče podrejene elemente." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:288 +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:52 msgid "" -"Operate the database in asynchronous mode, meaning that the queries are " -"executed on remote workers as opposed to on the web server itself. This " -"assumes that you have a Celery worker setup as well as a results backend." -" Refer to the installation docs for more information." +"Show hierarchical relationships of data, with with the value represented by area, " +"showing proportion and contribution to the whole." msgstr "" -"Upravljanje podatkovne baze v asinhronem načinu pomeni, da se poizvedbe " -"zaženejo na oddaljenih »delavcih« in ne na samem spletnem strežniku. S " -"tem je predpostavljeno, da imate nastavljenega »delavca« za Celery in " -"zaledni sistem za rezultate. Več informacij je v navodilih za namestitev." +"Prikaže hierarhična razmerja podatkov, pri čemer je vrednost ponazorjena s " +"ploščino, in deleže oz. prispevke k celoti." -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:125 -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:130 -msgid "Operator" -msgstr "Operator" +#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:56 +msgid "Treemap v2" +msgstr "Drevesni grafikon s pravokotniki v2" -#: superset/utils/pandas_postprocessing.py:175 -#, python-format -msgid "Operator undefined for aggregator: %(name)s" -msgstr "Operand ni definiran za agregatorja: %(name)s" +#: superset-frontend/plugins/plugin-chart-handlebars/src/consts.ts:27 +#: superset-frontend/plugins/plugin-chart-table/src/consts.ts:26 +msgid "page_size.all" +msgstr "page_size.all" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:361 -msgid "" -"Optional CA_BUNDLE contents to validate HTTPS requests. Only available on" -" certain database engines." -msgstr "" -"Opcijska CA_BUNDLE vsebina, za potrjevanje HTTPS zahtev. Razpoložljivo le" -" na določenih sistemih podatkovnih baz." +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/index.ts:39 +msgid "Handlebars" +msgstr "Handlebars" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:73 -msgid "Optional name of the data column." -msgstr "Opcijsko ime podatkovnega stolpca." +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx:53 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/columns.tsx:78 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:119 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:142 +msgid "must have a value" +msgstr "mora imeti vrednost" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1135 -msgid "" -"Optional time column if time range should apply to another column than " -"the default time column" -msgstr "" -"Izbirni časovni stolpec se mora nanašati na drug stolpec kot privzeti " -"časovni stolpec" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/handlebarTemplate.tsx:60 +msgid "Handlebars Template" +msgstr "Predloga za Handlebars" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1092 -msgid "Optional warning about use of this metric" -msgstr "Opcijsko opozorilo za uporabo te mere" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/handlebarTemplate.tsx:61 +msgid "A handlebars template that is applied to the data" +msgstr "Predloga za Handlebars, ki je uporabljena za podatke" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:49 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:75 -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:119 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:72 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:39 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:37 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:105 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:198 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:363 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:48 -msgid "Options" -msgstr "Možnosti" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/includeTime.ts:27 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:342 +msgid "Include time" +msgstr "Vključi čas" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:668 -msgid "Or choose from a list of other databases we support:" -msgstr "" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/includeTime.ts:28 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:343 +msgid "Whether to include the time granularity as defined in the time section" +msgstr "Če želite vključiti granulacijo časa, ki je določena v sekciji Čas" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:63 -msgid "Order by entity id" -msgstr "Uredi po ID entitete" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/metrics.tsx:33 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:152 +msgid "Percentage metrics" +msgstr "Procentualne mere" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:272 -msgid "Order results by selected columns" -msgstr "Razvrsti rezultate glede na izbrani stolpec" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/metrics.tsx:34 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:153 +msgid "" +"Metrics for which percentage of total are to be displayed. Calculated from only " +"data within the row limit." +msgstr "" +"Mera, za katero je prikazan odstotek od celote. Izračunan je samo iz podatkov " +"znotraj omejitve števila vrstic." + +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/metrics.tsx:107 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:370 +msgid "" +"Show total aggregations of selected metrics. Note that row limit does not apply " +"to the result." +msgstr "" +"Prikaži skupno agregacijo izbrane mere. Omejitev števila vrstic ne vpliva na " +"rezultat." -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:271 +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/orderBy.tsx:27 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:285 msgid "Ordering" msgstr "Razvrščanje" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:142 -msgid "Orientation of tree" -msgstr "Orientacija drevesa" - -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:27 -#: superset-frontend/src/explore/constants.ts:116 -msgid "Origin" -msgstr "Izhodišče" - -#: superset-frontend/src/explore/components/ExportToCSVDropdown/index.tsx:74 -#, fuzzy -msgid "Original" -msgstr "Izhodišče" - -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:183 -msgid "Original table column order" -msgstr "Vrstni red stolpcev izvorne tabele" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/orderBy.tsx:28 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:286 +msgid "Order results by selected columns" +msgstr "Razvrsti rezultate glede na izbrani stolpec" -#: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:29 -#: superset/db_engine_specs/base.py:85 -msgid "Original value" -msgstr "Izvorna vrednost" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/pagination.tsx:35 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:306 +msgid "Server pagination" +msgstr "Paginacija na strani strežnika" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:120 -msgid "Orthogonal" -msgstr "Pravokotna" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/pagination.tsx:36 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:307 +msgid "Enable server side pagination of results (experimental feature)" +msgstr "" +"Omogoči številčenje strani rezultatov na strani strežnika (preizkusna funkcija)" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:120 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:687 -msgid "Other" -msgstr "Ostali" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/pagination.tsx:50 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:328 +msgid "Server Page Length" +msgstr "Dolžina strani strežnika" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:193 -msgid "Outer Radius" -msgstr "Zunanji polmer" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/pagination.tsx:53 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:331 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:410 +msgid "Rows per page, 0 means no pagination" +msgstr "Vrstic na stran (0 pomeni brez številčenja strani)" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:199 -msgid "Outer edge of Pie chart" -msgstr "Zunanji rob tortnega grafikona" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/queryMode.tsx:29 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:92 +msgid "Query mode" +msgstr "Poizvedbeni način" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:257 -msgid "Overlap" -msgstr "Prekrivanje" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/shared.ts:59 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:86 +msgid "Group By, Metrics or Percentage Metrics must have a value" +msgstr "Združevanje, Mera ali Procentualna mera morajo imeti vrednost" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:107 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:322 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:205 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:455 -#: superset-frontend/src/explore/controlPanels/sections.tsx:220 -msgid "" -"Overlay one or more timeseries from a relative time period. Expects " -"relative time deltas in natural language (example: 24 hours, 7 days, 52 " -"weeks, 365 days). Free text is supported." -msgstr "" -"Zamaknite eno ali več časovnih vrst za relativno časovno obdobje. Vnaša " -"se relativne časovne razlike v naravnem jeziku (npr. 24 ur, 7 dni, 52 " -"tednov, 365 dni). Prosto besedilo je podprto." +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/style.tsx:59 +msgid "CSS Styles" +msgstr "CSS slogi" -#: superset-frontend/src/components/ImportModal/index.tsx:282 -msgid "Overwrite" -msgstr "Prepiši" +#: superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/style.tsx:60 +msgid "CSS applied to the chart" +msgstr "CSS slogi uporabljeni za grafikon" -#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:120 -msgid "Overwrite & Explore" -msgstr "Prepiši & Razišči" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:51 +msgid "Columns to group by on the columns" +msgstr "Stolpci za združevanje stolpcev" -#: superset-frontend/src/dashboard/components/SaveModal.tsx:191 -#, python-format -msgid "Overwrite Dashboard [%s]" -msgstr "Prepiši nadzorno ploščo [%s]" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:60 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:85 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:289 +msgid "Rows" +msgstr "Vrstice" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:264 -msgid "Overwrite text in the editor with a query on this table" -msgstr "Besedilo v urejevalniku prepišite s poizvedbo na to tabelo" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:61 +msgid "Columns to group by on the rows" +msgstr "Stolpci za združevanje vrstic" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:453 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:450 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:417 -msgid "Owner" -msgstr "Lastnik" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:81 +msgid "Apply metrics on" +msgstr "Uporabi mero na" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:234 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:399 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:355 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:358 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:402 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:405 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:168 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:276 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1079 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1084 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:334 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:334 -#: superset/connectors/druid/views.py:346 superset/connectors/sqla/views.py:500 -#: superset/views/chart/mixin.py:83 superset/views/dashboard/mixin.py:82 -msgid "Owners" -msgstr "Lastniki" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:87 +msgid "Use metrics as a top level group for columns or for rows" +msgstr "Uporabi mere kot vrhovni nivo grupiranja za stolpce ali vrstice" -#: superset/commands/exceptions.py:105 -#: superset/datasets/commands/exceptions.py:144 -msgid "Owners are invalid" -msgstr "Lastniki niso veljavni" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:101 +msgid "Cell limit" +msgstr "Omejitev celice" -#: superset/views/dashboard/mixin.py:65 -msgid "Owners is a list of users who can alter the dashboard." -msgstr "\"Lastniki\" je seznam uporabnikov, ki lahko spreminjajo nadzorno ploščo." +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:102 +msgid "Limits the number of cells that get retrieved." +msgstr "Omeji število pridobljenih celic." -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:367 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:414 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:112 msgid "" -"Owners is a list of users who can alter the dashboard. Searchable by name" -" or username." +"Metric used to define how the top series are sorted if a series or cell limit is " +"present. If undefined reverts to the first metric (where appropriate)." msgstr "" -"\"Lastniki\" je seznam uporabnikov, ki lahko spreminjajo nadzorno ploščo." -" Iskanje je možno po imenu ali uporabniškem imenu." +"Mera, ki določa kako so razvrščene prve serije, če je določena omejitev serij ali " +"vrstic. Če ni določena, se uporabi prva mera (kjer je ustrezno)." -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:388 -msgid "Page length" -msgstr "Dolžina strani" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:177 +msgid "Show rows total" +msgstr "Prikaži vsoto vrstic" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:29 -msgid "Paired t-test Table" -msgstr "Tabela t-testa za odvisne vzorce" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:180 +msgid "Display row level total" +msgstr "Prikaži vsote na nivoju vrstic" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:177 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:388 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:271 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:516 -#: superset-frontend/src/explore/controlPanels/sections.tsx:278 -msgid "Pandas resample method" -msgstr "Metoda za prevzorčenje v Pandas" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:189 +msgid "Show columns total" +msgstr "Prikaži vsoto stolpcev" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:156 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:370 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:253 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:496 -#: superset-frontend/src/explore/controlPanels/sections.tsx:260 -msgid "Pandas resample rule" -msgstr "Pravilo za prevzorčenje v Pandas" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:192 +msgid "Display column level total" +msgstr "Prikaži vsote na nivoju stolpcev" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:30 -#: superset/viz.py:2182 -msgid "Parallel Coordinates" -msgstr "Vzporedne koordinate" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:201 +msgid "Transpose pivot" +msgstr "Transponirano vrtenje" -#: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:116 -msgid "Parameter error" -msgstr "Napaka parametra" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:203 +msgid "Swap rows and columns" +msgstr "Zamenjaj vrstice in stolpce" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:64 -#: superset/views/chart/mixin.py:84 -msgid "Parameters" -msgstr "Parametri" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:213 +msgid "Combine metrics" +msgstr "Združuj mere" -#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:103 -#, fuzzy -msgid "Parameters " -msgstr "Parametri" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:248 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:396 +msgid "D3 time format for datetime columns" +msgstr "D3 oblika zapisa za časovne stolpce" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:60 -msgid "Parent" -msgstr "Nadrejeni" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:257 +msgid "Sort rows by" +msgstr "Razvrsti vrstice" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:643 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1037 -msgid "Parent filter" -msgstr "Nadrejeni filter" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:261 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:289 +msgid "key a-z" +msgstr "a - ž" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1045 -msgid "Parent filter is required" -msgstr "Zahtevan je nadrejeni filter" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:262 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:290 +msgid "key z-a" +msgstr "ž - a" -#: superset/views/database/forms.py:203 superset/views/database/forms.py:340 -msgid "Parse Dates" -msgstr "Prepoznaj datume" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:263 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:291 +msgid "value ascending" +msgstr "0 - 9" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:25 -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:26 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:29 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:51 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:33 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:50 -msgid "Part of a Whole" -msgstr "Del celote" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:264 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:292 +msgid "value descending" +msgstr "9 - 0" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:27 -msgid "Partition Chart" -msgstr "Grafikon razdelkov" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:269 +msgid "Change order of rows." +msgstr "Spremeni vrstni red vrstic." -#: superset/viz.py:3035 -msgid "Partition Diagram" -msgstr "Grafikon s pravokotniki" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:270 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:298 +msgid "Available sorting modes:" +msgstr "Razpoložljivi načini razvrščanja:" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:176 -msgid "Partition Limit" -msgstr "Omejitev particij" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:272 +msgid "By key: use row names as sorting key" +msgstr "Po ključu: za razvrščanje uporabite imena vrstic" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:189 -msgid "Partition Threshold" -msgstr "Prag particije" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:273 +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:301 +msgid "By value: use metric values as sorting key" +msgstr "Po vrednosti: za razvrščanje uporabite vrednosti mere" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:192 -msgid "" -"Partitions whose height to parent height proportions are below this value" -" are pruned" -msgstr "" -"Particije z nižjim razmerjem med njihovo višino in dolžino starša so " -"zanemarjene" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:285 +msgid "Sort columns by" +msgstr "Razvrsti stolpce" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:130 -#: superset/db_engine_specs/base.py:1389 -msgid "Password" -msgstr "Geslo" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:297 +msgid "Change order of columns." +msgstr "Spremeni vrstni red stolpcev." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:79 -msgid "Paste the shareable Google Sheet URL here" -msgstr "Prilepite deljeni URL Googlove preglednice sem" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:300 +msgid "By key: use column names as sorting key" +msgstr "Po ključu: za razvrščanje uporabite imena stolpcev" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:35 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:35 -#: superset-frontend/plugins/plugin-chart-table/src/index.ts:46 -msgid "Pattern" -msgstr "Vzorec" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:313 +msgid "Rows subtotal position" +msgstr "Položaj vsot vrstic" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:108 -msgid "Percent Change" -msgstr "Procentualna sprememba" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:317 +msgid "Top" +msgstr "Zgoraj" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:147 -msgid "Percentage metrics" -msgstr "Procentualne mere" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:318 +msgid "Bottom" +msgstr "Spodaj" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:81 -msgid "Percentage threshold" -msgstr "Procentualni prag" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:321 +msgid "Position of row level subtotal" +msgstr "Položaj vsot na nivoju vrstic" -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:41 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:45 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:39 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:44 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:49 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:42 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:38 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:45 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:69 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:63 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:33 -msgid "Percentages" -msgstr "Procenti" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:330 +msgid "Columns subtotal position" +msgstr "Položaj delnih vsot stolpcev" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:56 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:278 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:161 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:179 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:410 -#: superset-frontend/src/explore/controlPanels/sections.tsx:177 -msgid "Periods" -msgstr "Št. period" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:338 +msgid "Position of column level subtotal" +msgstr "Položaj vsot na nivoju stolpcev" -#: superset/utils/pandas_postprocessing.py:824 -msgid "Periods must be a positive integer value" -msgstr "Periode morajo biti pozitivno celo število" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:348 +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:509 +msgid "Conditional formatting" +msgstr "Pogojno oblikovanje" -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:258 -#, fuzzy -msgid "Person or group that has certified this chart." -msgstr "Oseba ali skupina, ki je certificirala to mero" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:349 +msgid "Apply conditional color formatting to metrics" +msgstr "Za mere uporabi pogojno oblikovanje z barvami" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:548 -#, fuzzy -msgid "Person or group that has certified this dashboard." -msgstr "Oseba ali skupina, ki je certificirala to mero" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:51 +msgid "" +"Used to summarize a set of data by grouping together multiple statistics along " +"two axes. Examples: Sales numbers by region and month, tasks by status and " +"assignee, active users by age and location. Not the most visually stunning " +"visualization, but highly informative and versatile." +msgstr "" +"Ponazori podatke na podlagi združevanja več statistik vzdolž dveh osi. Npr. " +"prodaja po regijah in mesecih, opravila po statusih in izvajalcih, itd." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:260 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1068 -msgid "Person or group that has certified this metric" -msgstr "Oseba ali skupina, ki je certificirala to mero" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:54 +msgid "Pivot Table v2" +msgstr "Vrtilna tabela v2" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:936 -msgid "Physical" -msgstr "Fizičen" +#: superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/utilities.js:842 +msgid "Unknown input format" +msgstr "Neznana oblika vnosa" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:132 -msgid "Physical (table or view)" -msgstr "Fizičen (tabela ali pogled)" +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:125 +msgid "search.num_records" +msgstr "search.num_records" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:223 -msgid "Physical dataset" -msgstr "Fizičen podatkovni set" +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:140 +msgid "page_size.show" +msgstr "page_size.show" -#: superset/viz.py:742 -msgid "Pick a granularity in the Time section or uncheck 'Include Time'" -msgstr "Izberite granulacijo v razdelku 'Čas' ali odstranite 'Vključi čas'" +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:160 +msgid "page_size.entries" +msgstr "page_size.entries" -#: superset/viz.py:1573 -msgid "Pick a metric for left axis!" -msgstr "Izberite mero za levo os!" +#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:462 +msgid "Totals" +msgstr "Vsote" -#: superset/viz.py:1575 -msgid "Pick a metric for right axis!" -msgstr "Izberite mero za desno os!" +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:391 +msgid "Timestamp format" +msgstr "Oblika zapisa časovne značke" -#: superset/viz.py:1163 -msgid "Pick a metric for x, y and size" -msgstr "Izberite mere za x, y in velikost" +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:407 +msgid "Page length" +msgstr "Dolžina strani" -#: superset/viz.py:1202 -msgid "Pick a metric to display" -msgstr "Izberite mero za prikaz" +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:422 +msgid "Search box" +msgstr "Iskalno polje" -#: superset/viz.py:1228 superset/viz.py:1262 -msgid "Pick a metric!" -msgstr "Izberite mero!" +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:425 +msgid "Whether to include a client-side search box" +msgstr "Če želite vključiti iskalno polje za uporabnika" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:56 -msgid "Pick a name to help you identify this database." -msgstr "Izberite ime za lažjo prepoznavo podatkovne baze." +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:432 +msgid "Cell bars" +msgstr "Stolp. graf v celicah" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:151 -msgid "Pick a nickname for this database to display as in Superset." -msgstr "Izberite vzdevek za to podatkovno bazo, ki bo prikazan v Supersetu." +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:449 +msgid "" +"Whether to align background charts with both positive and negative values at 0" +msgstr "" +"Če želite poravnati graf v ozadju celic za negativne in pozitivne vrednosti okrog " +"0" -#: superset/viz.py:1358 superset/viz.py:1621 -msgid "Pick a time granularity for your time series" -msgstr "Izberite granulacijo časa za časovno vrsto" +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:472 +msgid "Allow columns to be rearranged" +msgstr "Omogoči razvrščanje stolpcev" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:510 -msgid "Pick a title for you annotation." -msgstr "Izberite naslov za oznako." +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:475 +msgid "" +"Allow end user to drag-and-drop column headers to rearrange them. Note their " +"changes won't persist for the next time they open the chart." +msgstr "" +"Uporabniku omogočite, da s potegom razvrsti stolpce. Sprememba se ne bo ohranila, " +"ko bo grafikon ponovno naložen." -#: superset/viz.py:1783 -msgid "Pick at least one field for [Series]" -msgstr "Izberite vsaj eno polje za [Serije]" +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:486 +msgid "Customize columns" +msgstr "Prilagodi stolpce" -#: superset/viz.py:830 superset/viz.py:1781 -msgid "Pick at least one metric" -msgstr "Izberite vsaj eno mero" +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:487 +msgid "Further customize how to display each column" +msgstr "Dodatne prilagoditve prikaza posameznih stolpcev" -#: superset/viz.py:1911 -msgid "Pick exactly 2 columns as [Source / Target]" -msgstr "Izberite natanko dva stolpca za [Izvor / Cilj]" +#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:510 +msgid "Apply conditional color formatting to numeric columns" +msgstr "Za numerične stolpce uporabi pogojno oblikovanje z barvami" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:521 +#: superset-frontend/plugins/plugin-chart-table/src/index.ts:37 msgid "" -"Pick one or more columns that should be shown in the annotation. If you " -"don't select a column all of them will be shown." -msgstr "" -"Izberite enega ali več stolpcev, ki bodo prikazani v oznakah. Če ne " -"izberete stolpca, bodo prikazani vsi." +"Classic row-by-column spreadsheet like view of a dataset. Use tables to showcase " +"a view into the underlying data or to show aggregated metrics." +msgstr "Standardna razpredelnica za prikaz podatkovnega seta." -#: superset-frontend/src/explore/controlPanels/Separator.js:37 -msgid "Pick your favorite markup language" -msgstr "Izberite svoj priljubljen označevalni jezik" +#: superset-frontend/plugins/plugin-chart-word-cloud/src/legacyPlugin/index.ts:29 +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:39 +msgid "Word Cloud" +msgstr "Oblak besed" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/index.js:27 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:63 -msgid "Pie Chart" -msgstr "Tortni grafikon" +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:57 +msgid "Minimum Font Size" +msgstr "Min. velikost pisave" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:187 -msgid "Pie shape" -msgstr "Oblika torte" +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:60 +msgid "Font size for the smallest value in the list" +msgstr "Velikost pisave za najmanjšo vrednost na seznamu" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:234 -msgid "Pin" -msgstr "Žebljiček" +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:68 +msgid "Maximum Font Size" +msgstr "Max. velikost pisave" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:56 -msgid "Pivot Options" -msgstr "Vrtilne možnosti" +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:71 +msgid "Font size for the biggest value in the list" +msgstr "Velikost pisave za največjo vrednost na seznamu" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:30 -#: superset/viz.py:862 -msgid "Pivot Table" -msgstr "Vrtilna tabela" +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:80 +msgid "Word Rotation" +msgstr "Vrtenje besed" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:54 -msgid "Pivot Table v2" -msgstr "Vrtilna tabela v2" +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:89 +msgid "Rotation to apply to words in the cloud" +msgstr "Če želite vrtenje besed v oblaku" -#: superset/utils/pandas_postprocessing.py:260 -msgid "Pivot operation must include at least one aggregate" -msgstr "Vrtilna operacija mora vsebovati vsaj en agregat" +#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:35 +msgid "" +"Visualizes the words in a column that appear the most often. Bigger font " +"corresponds to higher frequency." +msgstr "" +"Prikaže besede v stolpcu, glede na pogostost pojavljanja. Večja pisava pomeni " +"večjo frekvenco." -#: superset/utils/pandas_postprocessing.py:256 -msgid "Pivot operation requires at least one index" -msgstr "Vrtilna operacija zahteva vsaj en indeks" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:106 +msgid "The query couldn't be loaded" +msgstr "Poizvedbe ni mogoče naložiti" -#: superset-frontend/src/explore/components/ExportToCSVDropdown/index.tsx:80 -#, fuzzy -msgid "Pivoted" -msgstr "priljubljeno" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:159 +msgid "" +"Your query has been scheduled. To see details of your query, navigate to Saved " +"queries" +msgstr "" +"Vaša poizvedba je v urniku. Za ogled podrobnosti poizvedbe pojdite na shranjene " +"poizvedbe" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:83 -msgid "Pixel height of each series" -msgstr "Višina vsake serije v pikslih" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:166 +msgid "Your query could not be scheduled" +msgstr "Vaše poizvedbe ni mogoče uvrstiti v urnik" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils/index.ts:28 -msgid "Please apply filter changes" -msgstr "Potrdite spremembe filtra" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:194 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:305 +msgid "Failed at retrieving results" +msgstr "Napaka pri pridobivanju rezultatov" -#: superset/sqllab/query_render.py:116 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:232 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:258 msgid "" -"Please check your query and confirm that all template parameters are " -"surround by double braces, for example, \"{{ ds }}\". Then, try running " -"your query again." +"An error occurred while storing the latest query id in the backend. Please " +"contact your administrator if this problem persists." msgstr "" -"V poizvedbi preverite, da so vsi parametri obdani z dvojnimi oklepaji, " -"npr. \"{{ ds }}\". Potem poskusite ponovno." +"Pri shranjevanju zadnjega id-ja poizvedbe v sistem je prišlo do napake. Če se " +"težava ponavlja, kontaktirajte administratorja." + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:350 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:385 +msgid "Unknown error" +msgstr "Neznana napaka" -#: superset/db_engine_specs/athena.py:55 -#: superset/db_engine_specs/bigquery.py:179 -#: superset/db_engine_specs/postgres.py:158 -#: superset/db_engine_specs/snowflake.py:104 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:403 +msgid "Query was stopped." +msgstr "Poizvedba je bila ustavljena." + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:405 #, python-format +msgid "Failed at stopping query. %s" +msgstr "Neuspešno ustavljanje poizvedbe. %s" + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:430 msgid "" -"Please check your query for syntax errors at or near " -"\"%(syntax_error)s\". Then, try running your query again." +"Unable to migrate table schema state to backend. Superset will retry later. " +"Please contact your administrator if this problem persists." msgstr "" -"Preverite, če ima vaša poizvedba sintaktične napake pri " -"\"%(syntax_error)s\". Potem ponovno poženite poizvedbo." +"Stanja sheme tabele ni mogoče prenesti v sistem. Superset bo ponovil poskus " +"kasneje. Če se težava ponavlja, kontaktirajte administratorja." -#: superset/db_engine_specs/gsheets.py:74 superset/db_engine_specs/mysql.py:144 -#, python-format +#: superset-frontend/src/SqlLab/actions/sqlLab.js:448 msgid "" -"Please check your query for syntax errors near \"%(server_error)s\". " -"Then, try running your query again." +"Unable to migrate query state to backend. Superset will retry later. Please " +"contact your administrator if this problem persists." msgstr "" -"Preverite, če ima vaša poizvedba sintaktične napake pri " -"\"%(server_error)s\". Potem ponovno poženite poizvedbo." +"Stanja poizvedbe ni mogoče prenesti v sistem. Superset bo ponovil poskus kasneje. " +"Če se težava ponavlja, kontaktirajte administratorja." -#: superset/viz.py:879 -msgid "Please choose at least one 'Group by' field " -msgstr "Izberite vsaj eno 'Group by' polje " +#: superset-frontend/src/SqlLab/actions/sqlLab.js:494 +msgid "" +"Unable to migrate query editor state to backend. Superset will retry later. " +"Please contact your administrator if this problem persists." +msgstr "" +"Stanja urejevalnika poizvedb ni mogoče prenesti v sistem. Superset bo ponovil " +"poskus kasneje. Če se težava ponavlja, kontaktirajte administratorja." -#: superset/viz.py:891 -msgid "Please choose at least one metric" -msgstr "Izberite vsaj eno mero" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:527 +msgid "Unable to add a new tab to the backend. Please contact your administrator." +msgstr "Novega zavihka ni mogoče dodati v sistem. Kontaktirajte administratorja." -#: superset/viz.py:1578 -msgid "Please choose different metrics on left and right axis" -msgstr "Izberite različni meri za levo in desno os" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:544 +#: superset-frontend/src/SqlLab/reducers/sqlLab.js:74 +#, python-format +msgid "Copy of %s" +msgstr "Kopija %s" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:94 -msgid "Please complete all required fields." +#: superset-frontend/src/SqlLab/actions/sqlLab.js:571 +msgid "" +"An error occurred while setting the active tab. Please contact your administrator." msgstr "" +"Pri določanju aktivnega zavihka je prišlo do napake. Kontaktirajte " +"administratorja." -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:485 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:300 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:365 -#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:77 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:357 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:644 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:325 -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:105 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:355 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:611 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:617 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:499 -msgid "Please confirm" -msgstr "Prosim, potrdite" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:659 +msgid "An error occurred while fetching tab state" +msgstr "Pri pridobivanju stanja zavihka je prišlo do napake" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:485 -msgid "Please enter a SQLAlchemy URI to test" -msgstr "Vnesite SQLAlchemy URI za test" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:695 +msgid "" +"An error occurred while hiding the left bar. Please contact your administrator." +msgstr "" +"Pri skrivanju leve vrstice je prišlo do napake. Kontaktirajte administratorja." -#: superset-frontend/src/explore/components/SaveModal.tsx:133 -msgid "Please enter a chart name" -msgstr "Vnesite ime grafikona" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:717 +msgid "An error occurred while removing tab. Please contact your administrator." +msgstr "" +"Pri odstranjevanju zavihka je prišlo do napake. Kontaktirajte administratorja." -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:81 -msgid "Please filter set name" -msgstr "Vnesite ime seta filtrov" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:741 +msgid "An error occurred while removing query. Please contact your administrator." +msgstr "" +"Pri odstranjevanju poizvedbe je prišlo do napake. Kontaktirajte administratorja." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:122 -msgid "Please make sure all fields are filled out correctly" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:764 +msgid "" +"An error occurred while setting the tab database ID. Please contact your " +"administrator." msgstr "" +"Pri določanju ID-ja v podatkovne baze za zavihek je prišlo do napake. " +"Kontaktirajte administratorja." -#: superset/db_engine_specs/postgres.py:122 -msgid "Please re-enter the password." -msgstr "Ponovno vpišite geslo." +#: superset-frontend/src/SqlLab/actions/sqlLab.js:795 +msgid "" +"An error occurred while setting the tab schema. Please contact your administrator." +msgstr "" +"Pri določanju sheme zavihka je prišlo do napake. Kontaktirajte administratorja." -#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:59 -#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:72 -msgid "Please reach out to the Chart Owner for assistance." -msgstr "Za pomoč se obrnite na lastnika grafikona." +#: superset-frontend/src/SqlLab/actions/sqlLab.js:828 +msgid "" +"An error occurred while setting the tab autorun. Please contact your " +"administrator." +msgstr "" +"Pri določanju samodejnega zagona zavihka je prišlo do napake. Kontaktirajte " +"administratorja." -#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:75 -msgid "Please save the query to enable sharing" -msgstr "Shranite poizvedbo za deljenje" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:853 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:967 +msgid "" +"An error occurred while setting the tab title. Please contact your administrator." +msgstr "" +"Pri določanju naslova zavihka je prišlo do napake. Kontaktirajte administratorja." -#: superset/reports/commands/exceptions.py:90 -msgid "Please save your chart first, then try creating a new email report." +#: superset-frontend/src/SqlLab/actions/sqlLab.js:880 +msgid "Your query could not be saved" +msgstr "Vaše poizvedbe ni mogoče shraniti" + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:895 +msgid "Your query was not properly saved" +msgstr "Vaša poizvedba ni bila pravilno shranjena" + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:898 +msgid "Your query was saved" +msgstr "Vaša poizvedba je shranjena" + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:910 +msgid "Your query was updated" +msgstr "Vaša poizvedba je posodobljena" + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:914 +msgid "Your query could not be updated" +msgstr "Vaše poizvedbe ni mogoče posodobiti" + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:934 +msgid "" +"An error occurred while storing your query in the backend. To avoid losing your " +"changes, please save your query using the \"Save Query\" button." msgstr "" -"Najprej shranite grafikon, potem pa poskusite ustvariti novo e-poštno " -"poročilo." +"Pri shranjevanju vaše poizvedbe v sistem je prišlo do napake. Da ne izgubite " +"sprememb, shranite poizvedbo z gumbom \"Shrani poizvedbo\"." -#: superset/reports/commands/exceptions.py:102 -msgid "Please save your dashboard first, then try creating a new email report." +#: superset-frontend/src/SqlLab/actions/sqlLab.js:993 +msgid "" +"An error occurred while setting the tab template parameters. Please contact your " +"administrator." msgstr "" -"Najprej shranite nadzorno ploščo, potem pa poskusite ustvariti novo " -"e-poštno poročilo." +"Pri določanju parametrov predloge zavihka je prišlo do napake. Kontaktirajte " +"administratorja." -#: superset-frontend/src/addSlice/AddSliceContainer.tsx:322 -msgid "Please select both a Dataset and a Chart type to proceed" -msgstr "Za nadaljevanje izberite podatkovni set in tip grafikona" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1038 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1063 +msgid "An error occurred while fetching table metadata" +msgstr "Pri pridobivanju metapodatkov tabele je prišlo do napake" + +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1134 +msgid "" +"An error occurred while fetching table metadata. Please contact your " +"administrator." +msgstr "" +"Pri pridobivanju metapodatkov tabele je prišlo do napake. Kontaktirajte " +"administratorja." -#: superset/viz.py:1161 -msgid "Please use 3 different metric labels" -msgstr "Uporabite 3 različne oznake mer" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1182 +msgid "" +"An error occurred while expanding the table schema. Please contact your " +"administrator." +msgstr "" +"Pri širitvi sheme tabele je prišlo do napake. Kontaktirajte administratorja." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:104 -msgid "Please verify that port is open to connect." +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1206 +msgid "" +"An error occurred while collapsing the table schema. Please contact your " +"administrator." msgstr "" +"Pri krčenju sheme tabele je prišlo do napake. Kontaktirajte administratorja." -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:27 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1229 msgid "" -"Plots the individual metrics for each row in the data vertically and " -"links them together as a line. This chart is useful for comparing " -"multiple metrics across all of the samples or rows in the data." +"An error occurred while removing the table schema. Please contact your " +"administrator." msgstr "" -"Izriše posamezne mere za vsako vrstico podatkov navpično in jih med seboj" -" poveže kot črto. Grafikon je uporaben za primerjavo več mer med vsemi " -"vzorci ali vrsticami podatkov." +"Pri odstranjevanju sheme tabele je prišlo do napake. Kontaktirajte " +"administratorja." -#: superset/initialization/__init__.py:254 -msgid "Plugins" -msgstr "Vtičniki" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1262 +msgid "Shared query" +msgstr "Deljene poizvedbe" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:108 -msgid "Point Radius" -msgstr "Radij točk" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1325 +msgid "The datasource couldn't be loaded" +msgstr "Podatkovnega vira ni mogoče naložiti" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:132 -msgid "Point Radius Unit" -msgstr "Enota radija točk" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1355 +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1377 +msgid "An error occurred while creating the data source" +msgstr "Pri ustvarjanju podatkovnega vira je prišlo do težave" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:101 -msgid "Points" -msgstr "Točke" +#: superset-frontend/src/SqlLab/actions/sqlLab.js:1407 +msgid "An error occurred while fetching function names." +msgstr "Pri pridobivanju imen funkcij je prišlo do napake." -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:201 -msgid "Points and clusters will update as the viewport is being changed" -msgstr "Točke in gruče se bodo posodabljale, če se bo spremenil pogled" +#: superset-frontend/src/SqlLab/components/App/index.jsx:89 +#, python-format +msgid "" +"SQL Lab uses your browser's local storage to store queries and results.\n" +"Currently, you are using %(currentUsage)s KB out of %(maxStorage)d KB storage " +"space.\n" +"To keep SQL Lab from crashing, please delete some query tabs.\n" +"You can re-access these queries by using the Save feature before you delete the " +"tab.\n" +"Note that you will need to close other SQL Lab windows before you do this." +msgstr "" +"SQL laboratorij uporablja lokalno shrambo brskalnika za shranjevanje poizvedb in " +"rezultatov.\n" +"Trenutno uporabljate %(currentUsage)s KB od %(maxStorage)d KB prostora.\n" +"Da preprečite sesutje SQL laba, izbrišite nekaj zavihkov s poizvedbami.\n" +"Poizvedbe lahko ponovno pridobite, če pred brisanjem uporabite funkcijo Shrani.\n" +"Pred tem morate zapreti druga okna SQL laboratorija." -#: superset/views/sql_lab.py:74 -msgid "Pop Tab Link" -msgstr "Prikaži povezavo zavihka" +#: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:84 +msgid "Estimate selected query cost" +msgstr "Oceni potratnost izbrane poizvedbe" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:44 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:40 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:46 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:70 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:85 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:86 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:77 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:78 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 -#: superset-frontend/plugins/plugin-chart-table/src/index.ts:47 -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:124 -msgid "Popular" -msgstr "Priljubljeni" +#: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:85 +msgid "Estimate cost" +msgstr "Oceni potratnost" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:170 -msgid "Populate \"Default value\" to enable this control" -msgstr "Izpolnite \"Privzeto vrednost\", da omogočite ta kontrolnik" +#: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:89 +msgid "Cost estimate" +msgstr "Ocena potratnosti" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:33 -msgid "Population age data" -msgstr "Podatki starosti populacije" +#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx:70 +msgid "Creating a data source and creating a new tab" +msgstr "Ustvarjanje podatkovnega vira in novega zavihka" -#: superset/db_engine_specs/mssql.py:87 -#: superset/db_engine_specs/postgres.py:132 -#: superset/db_engine_specs/presto.py:213 -#: superset/db_engine_specs/redshift.py:73 -#, python-format -msgid "Port %(port)s on hostname \"%(hostname)s\" refused the connection." -msgstr "Vrata %(port)s na gostitelju \"%(hostname)s\" niso sprejela povezave." +#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx:75 +#: superset-frontend/src/components/TableLoader/index.tsx:55 +#: superset-frontend/src/utils/getClientErrorObject.ts:161 +msgid "An error occurred" +msgstr "Prišlo je do napake" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:103 -#, fuzzy -msgid "Port is closed" -msgstr "Vrata so zaprta." +#: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.tsx:83 +#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx:41 +msgid "Explore the result set in the data exploration view" +msgstr "Raziščite rezultate v pogledu raziskovanja podatkov" -#: superset/views/dashboard/mixin.py:87 -msgid "Position JSON" -msgstr "JSON za postavitev" +#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.tsx:48 +msgid "Create Chart" +msgstr "Ustvarite grafikon" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:181 -msgid "Position of child node label on tree" -msgstr "Položaj oznake podrejenega vozlišča na drevesu" +#: superset-frontend/src/SqlLab/components/HighlightedSql/index.tsx:76 +msgid "Source SQL" +msgstr "Izvorni SQL" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:310 -msgid "Position of column level subtotal" -msgstr "Položaj vsot na nivoju stolpcev" +#: superset-frontend/src/SqlLab/components/HighlightedSql/index.tsx:82 +msgid "Executed SQL" +msgstr "Izvedena poizvedba" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:163 -msgid "Position of intermidiate node label on tree" -msgstr "Položaj vmesne oznake vozlišča na drevesu" +#: superset-frontend/src/SqlLab/components/HighlightedSql/index.tsx:101 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1074 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:294 +msgid "SQL" +msgstr "SQL" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:293 -msgid "Position of row level subtotal" -msgstr "Položaj vsot na nivoju vrstic" +#: superset-frontend/src/SqlLab/components/QueryHistory/index.tsx:74 +msgid "Run a query to display query history" +msgstr "Za prikaz zgodovine poizvedb zaženite poizvedbo" -#: superset-frontend/src/components/Menu/MenuRight.tsx:180 -msgid "Powered by Apache Superset" -msgstr "Omogoča Apache Superset" +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:121 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:53 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:142 +msgid "Success" +msgstr "Uspelo" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1096 -msgid "Pre-filter" -msgstr "Predfilter" +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:127 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:133 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:153 +msgid "Failed" +msgstr "Ni uspelo" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1061 -msgid "Pre-filter available values" -msgstr "Predfiltriraj razpoložljive vrednosti" +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:139 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:158 +msgid "Running" +msgstr "V teku" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:623 -msgid "Pre-filter is required" -msgstr "Zahtevan je predfilter" +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:145 +msgid "Fetching" +msgstr "Pridobivam" -#: superset/connectors/sqla/views.py:451 -msgid "" -"Predicate applied when fetching distinct value to populate the filter " -"control component. Supports jinja template syntax. Applies only when " -"`Enable Filter Select` is on." -msgstr "" -"Privzeta vrednost za pridobivanje različnih vrednost pri oblikovanju " -"filtrov. Podpira sintakso za jinja predloge. Potrebno le, ko je vključeno" -" `Omogoči izbiro filtra`." +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:151 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:163 +msgid "Offline" +msgstr "Offline" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:44 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:39 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:75 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:78 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:78 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:73 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:72 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:72 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:74 -msgid "Predictive" -msgstr "Prediktivno" +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:157 +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:163 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:168 +msgid "Scheduled" +msgstr "V urniku" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:36 -msgid "Predictive Analytics" -msgstr "Prediktivna analitika" +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:169 +msgid "Unknown Status" +msgstr "Neznan status" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:64 -msgid "Prefix metric name with slice name" -msgstr "Imenu mere pripni ime rezine" +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:218 +#: superset-frontend/src/dashboard/components/menu/MarkdownModeDropdown.tsx:35 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:83 +#: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:127 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:334 +#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:129 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:432 +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:86 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:404 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:415 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:428 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:220 +msgid "Edit" +msgstr "Urejanje" -#: superset-frontend/src/dashboard/components/menu/MarkdownModeDropdown.tsx:39 -msgid "Preview" -msgstr "Predogled" +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:237 +msgid "View" +msgstr "Pogled" -#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:166 -#, python-format -msgid "Preview: `%s`" -msgstr "Predogled: `%s`" +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:240 +msgid "Data preview" +msgstr "Ogled podatkov" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:32 -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:125 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:105 -msgid "Previous" -msgstr "Prejšnji" +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:280 +msgid "Overwrite text in the editor with a query on this table" +msgstr "Besedilo v urejevalniku prepišite s poizvedbo na to tabelo" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:243 -msgid "Primary" -msgstr "Primarna" +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:289 +msgid "Run query in a new tab" +msgstr "Zaženi poizvedbo v novem zavihku" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:56 -msgid "Primary Metric" -msgstr "Primarna mera" +#: superset-frontend/src/SqlLab/components/QueryTable/index.tsx:296 +msgid "Remove query from log" +msgstr "Odstrani poizvedbo iz dnevnika" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:248 -msgid "Primary or secondary y-axis" -msgstr "Primarna ali sekundarna y-os" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:228 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:397 +msgid "Save & Explore" +msgstr "Shrani & Razišči" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:371 -msgid "Primary y-axis format" -msgstr "Oblika primarne y-osi" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:229 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:398 +msgid "Overwrite & Explore" +msgstr "Prepiši & Razišči" -#: superset-frontend/src/components/Menu/MenuRight.tsx:161 -#: superset/templates/appbuilder/navbar_right.html:109 -msgid "Profile" -msgstr "Profil" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:230 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:399 +msgid "Save this query as a virtual dataset to continue exploring" +msgstr "Shranite poizvedbo kot virtualni podatkovni set" -#: superset-frontend/src/profile/components/UserInfo.tsx:44 -msgid "Profile picture provided by Gravatar" -msgstr "Profilno sliko je zagotovil Gravatar" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:245 +msgid "Download to CSV" +msgstr "Izvozi kot CSV" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:239 -msgid "Progress" -msgstr "Območje" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:254 +msgid "Copy to Clipboard" +msgstr "Kopiraj na odložišče" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:30 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:56 -msgid "Progressive" -msgstr "Progresivno" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:269 +msgid "Too many columns to filter" +msgstr "Preveč stolpcev za filtriranje" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:55 -msgid "Propagate" -msgstr "Razširi" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:270 +msgid "Filter results" +msgstr "Filtriraj rezultate" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:39 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:42 -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:46 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:50 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:43 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:71 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:64 -msgid "Proportional" -msgstr "Proporcionalno" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:289 +#, python-format +msgid "" +"The number of results displayed is limited to %(rows)d by the configuration " +"DISPLAY_MAX_ROWS. Please add additional limits/filters or download to csv to see " +"more rows up to the %(limit)d limit." +msgstr "" +"Število prikazanih rezultatov je omejeno na %(rows)d na podlagi parametra " +"DISPLAY_MAX_ROWS. V csv dodajte dodatne omejitve/filtre, da boste lahko videli " +"več vrstic do meje %(limit)d ." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:86 -msgid "Public and privately shared sheets" -msgstr "Javno in zasebno deljene preglednice" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:295 +#, python-format +msgid "" +"The number of results displayed is limited to %(rows)d. Please add additional " +"limits/filters, download to csv, or contact an admin to see more rows up to the " +"%(limit)d limit." +msgstr "" +"Število prikazanih rezultatov je omejeno na %(rows)d . V csv dodajte dodatne " +"omejitve/filtre, da boste lahko videli več vrstic do meje %(limit)d ." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:83 -msgid "Publicly shared sheets only" -msgstr "Samo javno deljene preglednice" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:307 +#, python-format +msgid "The number of rows displayed is limited to %(rows)d by the query" +msgstr "Število prikazanih vrstic je omejeno na %(rows)d s poizvedbo" -#: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:101 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:301 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:498 -#: superset/views/dashboard/mixin.py:84 -msgid "Published" -msgstr "Objavljeno" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:315 +#, python-format +msgid "The number of rows displayed is limited to %(rows)d by the limit dropdown." +msgstr "Število prikazanih rezultatov je omejeno na %(rows)d s poizvedbo." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:109 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:161 -msgid "Put labels outside" -msgstr "Postavi oznake zunaj" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:320 +#, python-format +msgid "" +"The number of rows displayed is limited to %(rows)d by the query and limit " +"dropdown." +msgstr "" +"Število prikazanih vrstic je omejeno na %(rows)d s poizvedbo in spustnim " +"izbirnikom omejitev." -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:164 -msgid "Put the labels outside of the pie?" -msgstr "Postavim oznake zunaj torte?" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:326 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:344 +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:358 +#, python-format +msgid "%(rows)d rows returned" +msgstr "%(rows)d vrnjenih vrstic" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:112 -msgid "Put the labels outside the pie?" -msgstr "Postavim oznake zunaj torte?" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:346 +#, python-format +msgid "The number of rows displayed is limited to %s by the dropdown." +msgstr "Število prikazanih vrstic je omejeno na %s s spustnim izbirnikom." -#: superset-frontend/src/explore/controlPanels/Separator.js:47 -msgid "Put your code here" -msgstr "Vstavite svojo kodo sem" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:383 +msgid "Query was stopped" +msgstr "Poizvedba je bila ustavljena" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:351 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:234 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:485 -msgid "Python Functions" -msgstr "Pythonove funkcije" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:389 +msgid "Database error" +msgstr "Napaka podatkovne baze" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:233 -msgid "Python datetime string pattern" -msgstr "Pythonov vzorec zapisa datum-časa" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:416 +msgid "was created" +msgstr "ustvarjeno" -#: superset-frontend/src/explore/controlPanels/sections.tsx:248 -msgid "Python functions" -msgstr "Pythonove funkcije" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:423 +msgid "Query in a new tab" +msgstr "Poizvedba v novem zavihku" -#: superset/db_engine_specs/base.py:99 -msgid "Quarter" -msgstr "Četrtletje" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:479 +msgid "The query returned no data" +msgstr "Poizvedba ni vrnila podatkov" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:69 -#, fuzzy, python-format -msgid "Quarters %s" -msgstr "Četrtletje" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:496 +msgid "Fetch data preview" +msgstr "Pridobi predogled podatkov" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:32 -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:32 -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:91 -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:65 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:60 -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:30 -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:45 -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:36 -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:33 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:34 -#: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:31 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:30 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:34 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:32 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:44 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:26 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:60 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:158 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:341 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:29 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:43 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:34 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:41 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:34 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:44 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:48 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:59 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:56 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:52 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:53 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:59 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:60 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:42 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:38 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:41 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:179 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:26 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:30 -#: superset-frontend/src/explore/controlPanels/TimeTable.js:26 -#: superset-frontend/src/explore/controlPanels/sections.tsx:113 -#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:34 -#: superset-frontend/src/filters/components/Range/controlPanel.ts:31 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:41 -#: superset-frontend/src/filters/components/Time/controlPanel.ts:29 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:178 -msgid "Query" -msgstr "Poizvedba" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:507 +msgid "Refetch results" +msgstr "Ponovno pridobi rezultate" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:253 -#, python-format -msgid "Query %s: %s" -msgstr "" +#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:528 +msgid "Track job" +msgstr "Sledi opravilom" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:258 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:283 -msgid "Query A" -msgstr "Poizvedba A" +#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:50 +#: superset-frontend/src/explore/components/RunQueryButton/index.tsx:45 +msgid "Stop" +msgstr "Ustavi" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:259 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:284 -msgid "Query B" -msgstr "Poizvedba B" +#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:55 +msgid "Run selection" +msgstr "Zaženi izbrano" -#: superset/initialization/__init__.py:341 -msgid "Query History" -msgstr "Zgodovina poizvedb" +#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:57 +msgid "Run" +msgstr "Zaženi" -#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:197 -#: superset-frontend/src/views/CRUD/data/common.ts:44 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:89 -msgid "Query history" -msgstr "Zgodovina poizvedb" +#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:113 +msgid "Stop running (Ctrl + x)" +msgstr "Ustavi (Ctrl + x)" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:722 -msgid "Query in a new tab" -msgstr "Poizvedba v novem zavihku" +#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:114 +msgid "Stop running (Ctrl + e)" +msgstr "Ustavi (Ctrl + e)" -#: superset/errors.py:125 -msgid "Query is too complex and takes too long to run." -msgstr "Poizvedba je prekompleksna in se izvaja predolgo." +#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:129 +msgid "Run query (Ctrl + Return)" +msgstr "Zaženi poizvedbo (Ctrl + Return)" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:89 -msgid "Query mode" -msgstr "Poizvedbeni način" +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:252 +msgid "An error occurred saving dataset" +msgstr "Pri shranjevanju podatkovnega seta je prišlo do napake" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:125 -msgid "Query name" -msgstr "Ime poizvedbe" +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:294 +msgid "Save or Overwrite Dataset" +msgstr "Shrani ali prepiši podatkovni set" -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:117 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:376 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:97 -msgid "Query preview" -msgstr "Predogled poizvedbe" +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:336 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:187 +msgid "Save as new" +msgstr "Shrani kot novo" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "Iskalni niz za poizvedbo" +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:345 +msgid "Overwrite existing" +msgstr "Prepiši obstoječe" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 -msgid "Query was stopped" -msgstr "Poizvedba je bila ustavljena" +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:355 +msgid "Select or type dataset name" +msgstr "Izberite ali vnesite naziv podatkovnega seta" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:407 -msgid "Query was stopped." -msgstr "Poizvedba je bila ustavljena." +#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:366 +msgid "Are you sure you want to overwrite this dataset?" +msgstr "Ali ste prepričani, da želite prepisati podatkovni set?" -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:292 -#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:294 -msgid "RANGE TYPE" -msgstr "TIP OBDOBJA" +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:76 +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:134 +msgid "Undefined" +msgstr "Ni definirano" -#: superset-frontend/src/components/ReportModal/index.tsx:327 -msgid "REPORT NAME ERROR" -msgstr "NAPAKA NAZIVA POROČILA" +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:166 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:172 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:187 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:240 +#: superset-frontend/src/components/ReportModal/index.tsx:223 +#: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:88 +#: superset-frontend/src/dashboard/components/Header/index.jsx:589 +#: superset-frontend/src/dashboard/components/Header/index.jsx:591 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:100 +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:150 +#: superset-frontend/src/dashboard/components/SaveModal.tsx:220 +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:532 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:156 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:71 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:446 +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:202 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:217 +#: superset-frontend/src/explore/components/SaveModal.tsx:219 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:354 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:271 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:498 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:345 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1057 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:273 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:230 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:220 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1235 +msgid "Save" +msgstr "Shrani" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:251 -msgid "RGB Color" -msgstr "RGB barva" +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:166 +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:172 +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:303 +msgid "Save as" +msgstr "Shrani kot" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:161 -msgid "Radar" -msgstr "Radar" +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:175 +msgid "Save query" +msgstr "Shrani poizvedbo" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:53 -msgid "Radar Chart" -msgstr "Radarski grafikon" +#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:196 +msgid "Update" +msgstr "Posodobi" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:201 -msgid "Radar render type, whether to display 'circle' shape." -msgstr "Način prikaza radarja - če se prikaže okrogla oblika." +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:172 +msgid "Label for your query" +msgstr "Ime vaše poizvedbe" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:121 -msgid "Radial" -msgstr "Radialna" +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:186 +msgid "Write a description for your query" +msgstr "Dodajte opis vaše poizvedbe" -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:318 -#, python-format -msgid "Ran %s" -msgstr "Pretečeno %s" +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:231 +msgid "Schedule query" +msgstr "Urnik poizvedb" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:35 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:55 -msgid "Range" -msgstr "Doseg" +#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:241 +#: superset-frontend/src/components/ReportModal/index.tsx:300 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:236 +msgid "Schedule" +msgstr "Urnik" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:295 -#: superset-frontend/src/filters/components/Range/index.ts:28 -msgid "Range filter" -msgstr "Filter obdobja" +#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:61 +msgid "There was an error with your request" +msgstr "Pri zahtevi je prišlo do napake" -#: superset-frontend/src/filters/components/Range/index.ts:29 -msgid "Range filter plugin using AntD" -msgstr "Vtičnik za filter obdobja z uporabo AntD" +#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:75 +msgid "Please save the query to enable sharing" +msgstr "Shranite poizvedbo za deljenje" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:48 -msgid "Range labels" -msgstr "Oznake razponov" +#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:88 +msgid "Copy query link to your clipboard" +msgstr "Kopiraj povezavo do poizvedbe v odložišče" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:39 -msgid "Ranges" -msgstr "Razponi" +#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:89 +msgid "Save the query to enable this feature" +msgstr "Za omogočenje te funkcije shranite poizvedbo" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:41 -msgid "Ranges to highlight with shading" -msgstr "Razponi za označitev s senčenjem" +#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:98 +msgid "Copy link" +msgstr "Kopiraj povezavo" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:25 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:25 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:28 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:48 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:33 -msgid "Ranking" -msgstr "Rangiranje" +#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:157 +msgid "No stored results found, you need to re-run your query" +msgstr "Rezultatov še ni shranjenih, ponovno morate zagnati poizvedbo" -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:63 -msgid "Ratio" -msgstr "Razmerje" +#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:183 +#: superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx:95 +msgid "Run a query to display results" +msgstr "Za prikaz rezultatov morate zagnati poizvedbo" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:46 -msgid "Raw records" -msgstr "Surovi podatki" +#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:195 +#, python-format +msgid "Preview: `%s`" +msgstr "Predogled: `%s`" -#: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:64 -msgid "Ready to review filters in this dashboard?" -msgstr "Ste pripravljeni za pregled filtrov v tej nadzorni plošči?" +#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:223 +#: superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx:200 +#: superset-frontend/src/explore/components/DataTablesPane/components/ResultsPaneOnDashboard.tsx:52 +msgid "Results" +msgstr "Rezultati" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:78 -msgid "Rebuild" -msgstr "Obnovi" +#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:226 +#: superset-frontend/src/views/CRUD/data/common.ts:44 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:89 +msgid "Query history" +msgstr "Zgodovina poizvedb" -#: superset-frontend/src/profile/components/App.tsx:72 -msgid "Recent activity" -msgstr "Nedavna aktivnost" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:326 +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:336 +msgid "Run query" +msgstr "Zaženi poizvedbo" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:86 -msgid "Recently created charts, dashboards, and saved queries will appear here" -msgstr "" -"Nedavno ustvarjeni grafikoni, nadzorne plošče in shranjene poizvedbe bodo" -" prikazane tukaj" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:346 +msgid "New tab" +msgstr "Nov zavihek" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:96 -msgid "Recently edited charts, dashboards, and saved queries will appear here" -msgstr "" -"Nedavno urejani grafikoni, nadzorne plošče in shranjene poizvedbe bodo " -"prikazane tukaj" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:358 +msgid "Stop query" +msgstr "Ustavi poizvedbo" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:561 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:535 -msgid "Recently modified" -msgstr "Nedavno spremenjeno" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:367 +msgid "Previous Line" +msgstr "Prejšnja linija" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:81 -msgid "Recently viewed charts, dashboards, and saved queries will appear here" -msgstr "" -"Nedavno ogledani grafikoni, nadzorne plošče in shranjene poizvedbe bodo " -"prikazane tukaj" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:560 +msgid "Schedule the query periodically" +msgstr "Periodično zaganjaj poizvedbo" -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:277 -msgid "Recents" -msgstr "Nedavno" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:561 +msgid "You must run the query successfully first" +msgstr "Najprej morate uspešno izvesti poizvedbo" -#: superset/views/schedules.py:242 superset/views/schedules.py:322 -msgid "Recipients" -msgstr "Prejemniki" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:566 +msgid "Autocomplete" +msgstr "Samodokončaj" -#: superset-frontend/src/views/CRUD/alert/components/NotificationMethod.tsx:160 -msgid "Recipients are separated by \",\" or \";\"" -msgstr "Prejemniki so ločeni z \",\" ali \";\"" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:647 +msgid "CREATE TABLE AS" +msgstr "CREATE TABLE AS" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:597 -msgid "Recommended tags" -msgstr "Priporočene značke" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:660 +msgid "CREATE VIEW AS" +msgstr "CREATE VIEW AS" -#: superset/templates/appbuilder/general/widgets/base_list.html:55 -msgid "Record Count" -msgstr "Število zapisov" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:692 +msgid "Estimate the cost before running a query" +msgstr "Oceni potratnost pred zagonom poizvedbe" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:222 -msgid "Rectangle" -msgstr "Pravokotnik" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:776 +msgid "Select a database to write a query" +msgstr "Izberite podatkovno bazo za poizvedbo" -#: superset/connectors/druid/views.py:330 -msgid "" -"Redirects to this endpoint when clicking on the datasource from the " -"datasource list" -msgstr "" -"Preusmeri v to končno točko, ko kliknete na podatkovni vir v seznamu " -"podatkovnih virov" +#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:777 +msgid "Choose one of the available databases from the panel on the left." +msgstr "Izberite eno od razpoložljivih podatkovnih baz v panelu na levi." -#: superset/connectors/sqla/views.py:457 -msgid "Redirects to this endpoint when clicking on the table from the table list" -msgstr "Preusmeri v to končno točko, ko kliknete na tabelo v seznamu tabel" +#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx:171 +msgid "Collapse table preview" +msgstr "Zapri predogled tabele" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:316 -msgid "Reduce X ticks" -msgstr "Manj oznak X-osi" +#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx:171 +msgid "Expand table preview" +msgstr "Odpri predogled tabele" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:319 -msgid "" -"Reduces the number of X-axis ticks to be rendered. If true, the x-axis " -"will not overflow and labels may be missing. If false, a minimum width " -"will be applied to columns and the width may overflow into an horizontal " -"scroll." -msgstr "" -"Zmanjša število izrisanih oznak na X-osi. Če je vklopljeno, se x-os ne bo" -" prelila in lahko oznake manjkajo. Če je izklopljeno, bo upoštevana min. " -"širina stolpcev, ki pa se lahko prelije v horizontalni drsnik." +#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx:191 +msgid "No databases match your search" +msgstr "Nobena podatkovna baza ne ustreza iskanju" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:78 -msgid "Refer to the" -msgstr "Obrnite se na" +#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx:192 +msgid "There are no databases available" +msgstr "Podatkovnih baz ni na voljo" -#: superset/utils/pandas_postprocessing.py:143 -msgid "Referenced columns not available in DataFrame." -msgstr "Referencirani stolpci niso razpoložljivi v Dataframe-u." +#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx:196 +msgid "Manage your databases" +msgstr "Upravljajte podatkovne baze" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:799 -msgid "Refetch results" -msgstr "Ponovno pridobi rezultate" +#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx:197 +#: superset-frontend/src/components/ImportModal/ErrorAlert.tsx:55 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:122 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:771 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1365 +msgid "here" +msgstr "tukaj" -#: superset/templates/appbuilder/general/widgets/search.html:57 -msgid "Refresh" -msgstr "Osveži" +#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx:266 +msgid "Reset state" +msgstr "Ponastavi stanje" -#: superset/initialization/__init__.py:542 -msgid "Refresh Druid Metadata" -msgstr "Osveži metapodatke za Druid" +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:241 +msgid "Enter a new title for the tab" +msgstr "Vnesite novo naslov zavihka" -#: superset/connectors/sqla/views.py:565 -msgid "Refresh Metadata" -msgstr "Osveži metapodatke" +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:262 +msgid "" +"-- Note: Unless you save your query, these tabs will NOT persist if you clear " +"your cookies or change browsers.\n" +"\n" +msgstr "" +"-- Opomba: Če ne shranite poizvedbe, se ti zavihki NE bodo ohranili, ko boste " +"počistili piškote ali zamenjali brskalnik.\n" +"\n" -#: superset/connectors/sqla/views.py:565 -msgid "Refresh column metadata" -msgstr "Osveži metapodatke stolpca" +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:345 +msgid "Close tab" +msgstr "Zapri zavihek" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:276 -msgid "Refresh dashboard" -msgstr "Osveži nadzorno ploščo" +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:351 +msgid "Rename tab" +msgstr "Preimenuj zavihek" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:117 -msgid "Refresh frequency" -msgstr "Frekvenca osveževanja" +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:357 +msgid "Expand tool bar" +msgstr "Razširi orodno vrstico" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:114 -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:119 -msgid "Refresh interval" -msgstr "Interval osveževanja" +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:357 +msgid "Hide tool bar" +msgstr "Skrij orodno vrstico" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:976 -msgid "Refresh the default values" -msgstr "Osveži privzete vrednosti" +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:366 +msgid "Close all other tabs" +msgstr "Zapri vse ostale zavihke" -#: superset/connectors/druid/views.py:420 -msgid "Refreshed metadata from cluster [{}]" -msgstr "Osveženi meta-podatki iz gruče [{}]" +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:372 +msgid "Duplicate tab" +msgstr "Podvoji zavihek" -#: superset/connectors/druid/models.py:259 -msgid "Refreshing datasource [{}]" -msgstr "Osveževanje podatkovnega vira [{}]" +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:410 +msgid "Add a new tab" +msgstr "Dodaj nov zavihek" -#: superset/connectors/sqla/views.py:335 -msgid "" -"Regular filters add where clauses to queries if a user belongs to a role " -"referenced in the filter. Base filters apply filters to all queries " -"except the roles defined in the filter, and can be used to define what " -"users can see if no RLS filters within a filter group apply to them." -msgstr "" -"Navadni filtri dodajo WHERE stavek v poizvedbe, če ima uporabnik vlogo " -"podano v filtru. Osnovni filtri filtrirajo vse poizvedbe, razen vlog, " -"definiranih v filtru, in jih je mogoče uporabiti za nastavitev tega kaj " -"uporabnik vidi, če v skupini filtrov ni RLS-filtrov, ki bi se nanašali " -"nanje." +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:416 +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:458 +msgid "New tab (Ctrl + q)" +msgstr "Nov zavihek (Ctrl + q)" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:40 -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:43 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:44 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:44 -msgid "Relational" -msgstr "Relacijsko" +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:417 +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:459 +msgid "New tab (Ctrl + t)" +msgstr "Nov zavihek (Ctrl + t)" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:32 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:35 -msgid "Relationships between community channels" -msgstr "Razmerja med skupnostnimi kanali" +#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:434 +msgid "Add a new tab to create SQL Query" +msgstr "Dodaj nov zavihek za SQL-poizvedbo" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:91 -msgid "Relative Date/Time" -msgstr "Relativen Datum/Čas" +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:103 +msgid "Copy partition query to clipboard" +msgstr "Kopiraj particijsko poizvedbo na odložišče" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:157 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:210 -msgid "Relative period" -msgstr "Relativno obdobje" +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:120 +msgid "latest partition:" +msgstr "zadnja particija:" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:145 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:198 -msgid "Relative quantity" -msgstr "Relativne vrednosti" +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:157 +msgid "Keys for table" +msgstr "Ključi za tabele" -#: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:69 -msgid "Remind me in 24 hours" -msgstr "Opomni me čez 24 ur" +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:166 +#, python-format +msgid "View keys & indexes (%s)" +msgstr "Ogled ključev in indeksov (%s)" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:779 -msgid "Remove" -msgstr "Odstrani" +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:183 +msgid "Original table column order" +msgstr "Vrstni red stolpcev izvorne tabele" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:77 -msgid "Remove invalid filters" -msgstr "Odstrani neveljavne filtre" +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:184 +msgid "Sort columns alphabetically" +msgstr "Razvrsti stolpce po abecedi" -#: superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:142 -msgid "Remove item" -msgstr "Odstrani element" +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:192 +msgid "Copy SELECT statement to the clipboard" +msgstr "Kopiraj stavek SELECT na odložišče" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:282 -msgid "Remove query from log" -msgstr "Odstrani poizvedbo iz dnevnika" +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:204 +msgid "Show CREATE VIEW statement" +msgstr "Prikaži CREATE VIEW stavek" + +#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:205 +msgid "CREATE VIEW statement" +msgstr "CREATE VIEW stavek" #: superset-frontend/src/SqlLab/components/TableElement/index.tsx:211 msgid "Remove table preview" msgstr "Odstrani predogled tabele" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:609 +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:98 +msgid "Edit template parameters" +msgstr "Uredi parametre predloge" + +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:102 +msgid "Parameters " +msgstr "Parametri " + +#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:108 +msgid "Invalid JSON" +msgstr "Neveljaven JSON" + +#: superset-frontend/src/SqlLab/reducers/getInitialState.js:44 +msgid "Untitled query" +msgstr "Neimenovana poizvedba" + +#: superset-frontend/src/SqlLab/utils/newQueryTabName.ts:43 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:124 #, python-format -msgid "Removed columns: %s" -msgstr "Odstranjeni stolpci: %s" +msgid "%s%s" +msgstr "%s%s" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:345 -msgid "Rename tab" -msgstr "Preimenuj zavihek" +#: superset-frontend/src/addSlice/AddSliceContainer.tsx:281 +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:168 +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:191 +msgid "Create a new chart" +msgstr "Ustvari nov grafikon" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:146 -msgid "Rendering" -msgstr "Izris" +#: superset-frontend/src/addSlice/AddSliceContainer.tsx:284 +#: superset-frontend/src/addSlice/AddSliceContainer.tsx:295 +msgid "Choose a dataset" +msgstr "Izberite podatkovni set" -#: superset/views/database/forms.py:146 superset/views/database/forms.py:299 -#: superset/views/database/forms.py:427 -msgid "Replace" -msgstr "Zamenjaj" +#: superset-frontend/src/addSlice/AddSliceContainer.tsx:290 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx:89 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:802 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:831 +#: superset-frontend/src/explore/components/ExploreViewContainer/index.jsx:606 +#: superset-frontend/src/explore/controls.jsx:189 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:311 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:553 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:560 +msgid "Dataset" +msgstr "Podatkovni set" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:36 -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:36 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:41 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:46 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:31 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:57 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:48 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:59 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 -#: superset-frontend/plugins/plugin-chart-table/src/index.ts:48 -msgid "Report" -msgstr "Poročilo" +#: superset-frontend/src/addSlice/AddSliceContainer.tsx:300 +msgid "Instructions to add a dataset are available in the Superset tutorial." +msgstr "Navodila za dodajanje podatkovnega seta so v vodiču za Superset." -#: superset/reports/commands/exceptions.py:118 -msgid "Report Schedule could not be created." -msgstr "Urnika poročanja ni mogoče ustvariti." +#: superset-frontend/src/addSlice/AddSliceContainer.tsx:315 +msgid "Choose chart type" +msgstr "Izberite tip grafikona" -#: superset/reports/commands/exceptions.py:114 -msgid "Report Schedule could not be deleted." -msgstr "Urnika poročanja ni mogoče izbrisati." +#: superset-frontend/src/addSlice/AddSliceContainer.tsx:329 +msgid "Please select both a Dataset and a Chart type to proceed" +msgstr "Za nadaljevanje izberite podatkovni set in tip grafikona" -#: superset/reports/commands/exceptions.py:122 -msgid "Report Schedule could not be updated." -msgstr "Urnika poročanja ni mogoče posodobiti." +#: superset-frontend/src/addSlice/AddSliceContainer.tsx:337 +#: superset-frontend/src/dashboard/components/SliceAdder.jsx:288 +msgid "Create new chart" +msgstr "Ustvari nov grafikon" -#: superset/reports/commands/exceptions.py:130 -msgid "Report Schedule delete failed." -msgstr "Izbris urnika poročanja ni uspel." +#: superset-frontend/src/components/AlteredSliceTag/index.jsx:201 +msgid "Click to see difference" +msgstr "Kliknite za prikaz razlike" -#: superset/reports/commands/exceptions.py:142 -msgid "Report Schedule execution failed when generating a csv." -msgstr "Izvajanje urnika poročanja je bilo neuspešno pri ustvarjanju csv." +#: superset-frontend/src/components/AlteredSliceTag/index.jsx:202 +msgid "Altered" +msgstr "Spremenjeno" -#: superset/reports/commands/exceptions.py:146 -msgid "Report Schedule execution failed when generating a dataframe." -msgstr "" -"Izvajanje urnika poročanja je bilo neuspešno pri ustvarjanju podatkovnega" -" okvira." +#: superset-frontend/src/components/AlteredSliceTag/index.jsx:218 +msgid "Chart changes" +msgstr "Spremembe grafikona" -#: superset/reports/commands/exceptions.py:138 -msgid "Report Schedule execution failed when generating a screenshot." -msgstr "" -"Izvajanje urnika poročanja je bilo neuspešno pri ustvarjanju zaslonske " -"slike." +#: superset-frontend/src/components/AsyncSelect/index.jsx:41 +#: superset-frontend/src/components/Select/Select.tsx:311 +#: superset-frontend/src/explore/components/controls/SelectAsyncControl/index.tsx:106 +#: superset-frontend/src/explore/components/controls/SelectControl.jsx:231 +msgid "Select ..." +msgstr "Izberite ..." -#: superset/reports/commands/exceptions.py:150 -msgid "Report Schedule execution got an unexpected error." -msgstr "Pri izvajanju urnika poročanja je prišlo do nepričakovane napake." +#: superset-frontend/src/components/CachedLabel/TooltipContent.tsx:30 +msgid "Loaded data cached" +msgstr "Podatki so naloženi v predpomnilnik" -#: superset/reports/commands/exceptions.py:154 -msgid "Report Schedule is still working, refusing to re-compute." -msgstr "Urnik poročanja se še vedno izvaja, ponovni izračun je zavrnjen." +#: superset-frontend/src/components/CachedLabel/TooltipContent.tsx:34 +msgid "Loaded from cache" +msgstr "Naloženo iz predpomnilnika" -#: superset/reports/commands/exceptions.py:134 -msgid "Report Schedule log prune failed." -msgstr "Krajšanje dnevnika urnika poročanja ni uspelo." +#: superset-frontend/src/components/CachedLabel/TooltipContent.tsx:39 +msgid "Click to force-refresh" +msgstr "Kliknite za prisilno osvežitev" -#: superset/reports/commands/exceptions.py:126 -msgid "Report Schedule not found." -msgstr "Urnika poročanja ni najden." +#: superset-frontend/src/components/CachedLabel/index.tsx:51 +msgid "Cached" +msgstr "Predpomnjeno" -#: superset/reports/commands/exceptions.py:110 -msgid "Report Schedule parameters are invalid." -msgstr "Parametri urnika poročanja so neveljavni." +#: superset-frontend/src/components/Chart/Chart.jsx:265 +msgid "Add required control values to preview chart" +msgstr "Dodaj potrebne parametre za predogled grafikona" -#: superset/reports/commands/exceptions.py:158 -msgid "Report Schedule reached a working timeout." -msgstr "Urnik poročanja je dosegel mejo časa izvedbe." +#: superset-frontend/src/components/Chart/Chart.jsx:281 +msgid "Your chart is ready to go!" +msgstr "Grafikon je pripravljen!" -#: superset/reports/commands/exceptions.py:226 -msgid "Report Schedule sellenium user not found" -msgstr "Selenium uporabnik za urnik poročanja ni najden" +#: superset-frontend/src/components/Chart/Chart.jsx:284 +msgid "" +"Click on \"Create chart\" button in the control panel on the left to preview a " +"visualization or" +msgstr "" +"Kliknite na gumb \"Ustvari grafikon\" v kontrolni plošči na levi za predogled ali" -#: superset/reports/commands/exceptions.py:230 -msgid "Report Schedule state not found" -msgstr "Stanje urnika poročanj ni najdeno" +#: superset-frontend/src/components/Chart/Chart.jsx:288 +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:305 +msgid "click here" +msgstr "kliknite tukaj" -#: superset-frontend/src/components/Menu/MenuRight.tsx:225 -msgid "Report a bug" -msgstr "Sporočite napako" +#: superset-frontend/src/components/Chart/ChartRenderer.jsx:227 +#: superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx:119 +msgid "No results were returned for this query" +msgstr "Poizvedba ni vrnila rezultatov" -#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:81 -msgid "Report failed" -msgstr "Poročilo ni uspelo" +#: superset-frontend/src/components/Chart/ChartRenderer.jsx:230 +msgid "" +"Make sure that the controls are configured properly and the datasource contains " +"data for the selected time range" +msgstr "" +"Poskrbite, da so kontrolniki pravilno nastavljeni in podatkovni vir vsebuje " +"podatke za izbrano časovno obdobje" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1064 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1072 -msgid "Report name" -msgstr "Naslov poročila" +#: superset-frontend/src/components/Chart/chartAction.js:571 +msgid "An error occurred while loading the SQL" +msgstr "Pri nalaganju SQL je prišlo do napake" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1214 -msgid "Report schedule" -msgstr "Urnik poročanja" +#: superset-frontend/src/components/Chart/chartAction.js:609 +#: superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx:75 +msgid "Sorry, an error occurred" +msgstr "Prišlo je do napake" -#: superset/reports/commands/exceptions.py:234 -msgid "Report schedule unexpected error" -msgstr "Nepričakovana napaka urnika poročanja" +#: superset-frontend/src/components/Chart/chartReducer.ts:82 +msgid "Updating chart was stopped" +msgstr "Posodabljanje grafikona je bilo ustavljeno" + +#: superset-frontend/src/components/Chart/chartReducer.ts:94 +#, python-format +msgid "An error occurred while rendering the visualization: %s" +msgstr "Pri prikazovanju vizualizacije je prišlo do napake: %s" -#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:74 -msgid "Report sending" -msgstr "Pošiljanje poročila" +#: superset-frontend/src/components/Chart/chartReducer.ts:106 +#: superset-frontend/src/components/Chart/chartReducer.ts:170 +msgid "Network error." +msgstr "Napaka omrežja." -#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:67 -msgid "Report sent" -msgstr "Poročilo poslano" +#: superset-frontend/src/components/CopyToClipboard/index.jsx:44 +#: superset-frontend/src/dashboard/components/URLShortLinkButton/index.tsx:73 +msgid "Copy to clipboard" +msgstr "Kopiraj na odložišče" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:443 -msgid "Reports" -msgstr "Poročila" +#: superset-frontend/src/components/CopyToClipboard/index.jsx:77 +#: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:68 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:172 +msgid "Copied to clipboard!" +msgstr "Kopirano na odložišče!" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:283 -msgid "Repulsion" -msgstr "Odbijanje" +#: superset-frontend/src/components/CopyToClipboard/index.jsx:81 +msgid "Sorry, your browser does not support copying. Use Ctrl / Cmd + C!" +msgstr "Vaš brskalnik ne podpira kopiranja. Uporabite Ctrl / Cmd + C!" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:289 -msgid "Repulsion strength between nodes" -msgstr "Odbojna sila med vozlišči" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:27 +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:35 +msgid "every" +msgstr "vsak" -#: superset/templates/superset/request_access.html:31 -msgid "Request Permissions" -msgstr "Zahtevaj dovoljenja" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:28 +msgid "every month" +msgstr "vsak mesec" -#: superset/charts/data/api.py:145 superset/charts/data/api.py:233 -#: superset/charts/data/api.py:297 -#, python-format -msgid "Request is incorrect: %(error)s" -msgstr "Zahtevek je napačen: %(error)s" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:29 +msgid "every day of the month" +msgstr "vsak dan v mesecu" -#: superset/charts/data/api.py:222 -msgid "Request is not JSON" -msgstr "Zahtevek ni JSON" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:30 +msgid "day of the month" +msgstr "dan v mesecu" -#: superset/views/datasource/views.py:71 -msgid "Request missing data field." -msgstr "Zahtevaj manjkajoča podatkovna polja." +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:31 +msgid "every day of the week" +msgstr "vsak dan v tednu" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:93 -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:97 -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:104 -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:252 -#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:73 -#: superset-frontend/src/filters/components/Range/controlPanel.ts:55 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:91 -#: superset-frontend/src/filters/components/Time/controlPanel.ts:53 -#: superset-frontend/src/filters/components/TimeColumn/controlPanel.ts:33 -#: superset-frontend/src/filters/components/TimeGrain/controlPanel.ts:33 -msgid "Required" -msgstr "Obvezno" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:32 +msgid "day of the week" +msgstr "dan v tednu" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:137 -msgid "Resample" -msgstr "Prevzorči" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:33 +msgid "every hour" +msgstr "vsako uro" -#: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:231 -msgid "Reset state" -msgstr "Ponastavi stanje" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:34 +msgid "every minute" +msgstr "vsako minuto" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/RemovedFilter.tsx:46 -msgid "Restore Filter" -msgstr "Povrni filter" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:36 +msgid "year" +msgstr "leto" -#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:194 -msgid "Results" -msgstr "Rezultati" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:37 +msgid "month" +msgstr "mesec" -#: superset/sql_lab.py:375 superset/views/core.py:2251 -msgid "Results backend is not configured." -msgstr "Zaledni sistem rezultatov ni konfiguriran." +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:38 +msgid "week" +msgstr "teden" -#: superset/errors.py:116 -msgid "Results backend needed for asynchronous queries is not configured." -msgstr "" -"Zaledni sistem za rezultate, potreben za asinhrone poizvedbe, ni " -"konfiguriran." +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:39 +msgid "day" +msgstr "dan" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:29 -msgid "Return to specific datetime." -msgstr "Vrne določen datum-čas." +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:40 +msgid "hour" +msgstr "ura" -#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:155 -msgid "Reverse lat/long " -msgstr "Zamenjaj zemljepisno dolžino/širino " +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:41 +msgid "minute" +msgstr "minuta" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:230 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:100 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:281 -msgid "Rich Tooltip" -msgstr "Podroben opis orodja" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:42 +msgid "reboot" +msgstr "ponovni zagon" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:149 -msgid "Rich tooltip" -msgstr "Podroben opis orodja" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:43 +msgid "Every" +msgstr "Vsak" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:113 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:307 -msgid "Right" -msgstr "Desno" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:44 +msgid "in" +msgstr "v" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:53 -msgid "Right Axis Format" -msgstr "Oblika desne osi" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:45 +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:46 +msgid "on" +msgstr "v" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:119 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:183 -msgid "Right Axis Metric" -msgstr "Mera desne osi" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:47 +msgid "and" +msgstr "in" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:132 -msgid "Right Axis chart(s)" -msgstr "Grafikoni desne osi" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:48 +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:50 +msgid "at" +msgstr "ob" -#: superset-frontend/src/explore/controls.jsx:215 -msgid "Right axis metric" -msgstr "Mera desne osi" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:49 +msgid ":" +msgstr ":" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:138 -msgid "Right to Left" -msgstr "Iz desne proti levi" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:51 +msgid "minute(s)" +msgstr "minuta/e" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:160 -msgid "Right value" -msgstr "Desna vrednost" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:52 +msgid "Invalid cron expression" +msgstr "Neveljaven cron izraz" -#: superset/dashboards/filters.py:153 -msgid "Role" -msgstr "Vloga" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:53 +msgid "Clear" +msgstr "Počisti" -#: superset/views/core.py:389 -#, python-format -msgid "Role %(r)s was extended to provide the access to the datasource %(ds)s" -msgstr "" -"Vloga %(r)s je bila razširjena za zagotovitev dostopa do podatkovnega " -"vira %(ds)s" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:56 +msgid "Sunday" +msgstr "Nedelja" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:421 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:424 -#: superset-frontend/src/profile/components/Security.tsx:35 -#: superset/connectors/sqla/views.py:368 superset/views/dashboard/mixin.py:83 -msgid "Roles" -msgstr "Vloge" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:57 +msgid "Monday" +msgstr "Ponedeljek" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:433 -msgid "" -"Roles is a list which defines access to the dashboard. Granting a role " -"access to a dashboard will bypass dataset level checks. If no roles " -"defined then the dashboard is available to all roles." -msgstr "" -"\"Vloge\" je seznam, ki definira dostop do nadzorne plošče. Dodelitev " -"vloge za dostop do nadzorne plošče bo obšlo preverjanje na nivoju " -"podatkovnega seta. Če vloga ni definirana, bo nadzorna plošča dostopna " -"vsem vlogam." +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:58 +msgid "Tuesday" +msgstr "Torek" -#: superset/views/dashboard/mixin.py:66 -msgid "" -"Roles is a list which defines access to the dashboard. Granting a role " -"access to a dashboard will bypass dataset level checks.If no roles " -"defined then the dashboard is available to all roles." -msgstr "" -"\"Vloge\" je seznam, ki definira dostop do nadzorne plošče. Dodelitev " -"vloge za dostop do nadzorne plošče bo obšlo preverjanje na nivoju " -"podatkovnega seta. Če vloga ni definirana, bo nadzorna plošča dostopna " -"vsem vlogam." +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:59 +msgid "Wednesday" +msgstr "Sreda" -#: superset/views/access_requests.py:45 -msgid "Roles to grant" -msgstr "Vloge za dovoljevanje" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:60 +msgid "Thursday" +msgstr "Četrtek" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:257 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:140 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:158 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:389 -msgid "Rolling Function" -msgstr "Drseča funkcija" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:61 +msgid "Friday" +msgstr "Petek" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:251 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:134 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:152 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:383 -msgid "Rolling Window" -msgstr "Drseče okno" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:62 +msgid "Saturday" +msgstr "Sobota" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:39 -#: superset-frontend/src/explore/controlPanels/sections.tsx:158 -msgid "Rolling function" -msgstr "Drseča funkcija" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:66 +msgid "January" +msgstr "Januar" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:33 -#: superset-frontend/src/explore/controlPanels/sections.tsx:152 -msgid "Rolling window" -msgstr "Drseče okno" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:67 +msgid "February" +msgstr "Februar" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:351 -#: superset/views/database/mixins.py:198 -msgid "Root certificate" -msgstr "Korenski certifikat" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:68 +msgid "March" +msgstr "Marec" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:84 -msgid "Root node id" -msgstr "Id korenskega vozlišča" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:69 +msgid "April" +msgstr "April" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:307 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:209 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:170 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:151 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:167 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:225 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:228 -msgid "Rotate x axis label" -msgstr "Zavrti oznako x-osi" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:70 +msgid "May" +msgstr "Maj" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:89 -msgid "Rotation to apply to words in the cloud" -msgstr "Če želite vrtenje besed v oblaku" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:71 +msgid "June" +msgstr "Junij" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:271 -msgid "Round cap" -msgstr "Zaobljeni konci" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:72 +msgid "July" +msgstr "Julij" -#: superset-frontend/src/dashboard/components/gridComponents/new/NewRow.jsx:31 -msgid "Row" -msgstr "Vrstica" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:73 +msgid "August" +msgstr "Avgust" + +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:74 +msgid "September" +msgstr "September" -#: superset/initialization/__init__.py:274 -msgid "Row Level Security" -msgstr "Varnost na nivoju vrstic" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:75 +msgid "October" +msgstr "Oktober" -#: superset/views/database/forms.py:153 superset/views/database/forms.py:306 -msgid "" -"Row containing the headers to use as column names (0 is first line of " -"data). Leave empty if there is no header row." -msgstr "" -"Vrstica z naslovi, ki se uporabi za imena stolpcev (0 je prva vrstica " -"podatkov). Pustite prazno, če ni naslovne vrstice." +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:76 +msgid "November" +msgstr "November" -#: superset/connectors/sqla/views.py:314 -msgid "Row level security filter" -msgstr "Filter za varnost na nivoju vrstic" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:77 +msgid "December" +msgstr "December" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:331 -#: superset-frontend/src/explore/controls.jsx:360 -msgid "Row limit" -msgstr "Omejitev št. vrstic" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:81 +msgid "SUN" +msgstr "NED" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:49 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:83 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:289 -msgid "Rows" -msgstr "Vrstice" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:82 +msgid "MON" +msgstr "PON" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:314 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:391 -msgid "Rows per page, 0 means no pagination" -msgstr "Vrstic na stran (0 pomeni brez številčenja strani)" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:83 +msgid "TUE" +msgstr "TOR" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:285 -msgid "Rows subtotal position" -msgstr "Položaj vsot vrstic" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:84 +msgid "WED" +msgstr "SRE" -#: superset/views/database/forms.py:193 superset/views/database/forms.py:334 -msgid "Rows to Read" -msgstr "Vrstice za branje" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:85 +msgid "THU" +msgstr "ČET" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:144 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:360 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:243 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:493 -#: superset-frontend/src/explore/controlPanels/sections.tsx:257 -msgid "Rule" -msgstr "Pravilo" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:86 +msgid "FRI" +msgstr "PET" -#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:56 -#: superset-frontend/src/explore/components/QueryAndSaveBtns.jsx:76 -msgid "Run" -msgstr "Zaženi" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:87 +msgid "SAT" +msgstr "SOB" -#: superset-frontend/src/SqlLab/components/SouthPane/index.tsx:157 -msgid "Run a query to display results here" -msgstr "Za prikaz rezultatov morate zagnati poizvedbo" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:91 +msgid "JAN" +msgstr "JAN" -#: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:101 -msgid "Run in SQL Lab" -msgstr "Zaženi v SQL laboratoriju" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:92 +msgid "FEB" +msgstr "FEB" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:307 -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:317 -#: superset-frontend/src/chart/Chart.jsx:280 -msgid "Run query" -msgstr "Zaženi poizvedbo" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:93 +msgid "MAR" +msgstr "MAR" -#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:116 -msgid "Run query (Ctrl + Return)" -msgstr "Zaženi poizvedbo (Ctrl + Return)" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:94 +msgid "APR" +msgstr "APR" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:273 -msgid "Run query in a new tab" -msgstr "Zaženi poizvedbo v novem zavihku" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:95 +msgid "MAY" +msgstr "MAJ" -#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:54 -msgid "Run selection" -msgstr "Zaženi izbrano" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:96 +msgid "JUN" +msgstr "JUN" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:81 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:158 -msgid "Running" -msgstr "V teku" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:97 +msgid "JUL" +msgstr "JUL" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:87 -msgid "SAT" -msgstr "SOB" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:98 +msgid "AUG" +msgstr "AVG" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:99 msgid "SEP" msgstr "SEP" -#: superset-frontend/src/SqlLab/components/HighlightedSql/index.tsx:101 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:897 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:294 -msgid "SQL" -msgstr "SQL" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:100 +msgid "OCT" +msgstr "OKT" -#: superset-frontend/src/views/CRUD/data/components/SyntaxHighlighterCopy/index.tsx:71 -msgid "SQL Copied!" -msgstr "SQL kopiran!" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:101 +msgid "NOV" +msgstr "NOV" -#: superset/initialization/__init__.py:326 -msgid "SQL Editor" -msgstr "SQL urejevalnik" +#: superset-frontend/src/components/CronPicker/CronPicker.tsx:102 +msgid "DEC" +msgstr "DEC" -#: superset/connectors/sqla/views.py:259 -msgid "SQL Expression" -msgstr "SQL izraz" +#: superset-frontend/src/components/DatabaseSelector/index.tsx:238 +msgid "There was an error loading the schemas" +msgstr "Napaka pri nalaganju shem" -#: superset/initialization/__init__.py:331 -#: superset/initialization/__init__.py:346 -msgid "SQL Lab" -msgstr "SQL laboratorij" +#: superset-frontend/src/components/DatabaseSelector/index.tsx:276 +#: superset-frontend/src/components/DatabaseSelector/index.tsx:284 +msgid "Select database or type database name" +msgstr "Izberite ali vnesite ime podatkovne baze" -#: superset/connectors/sqla/views.py:503 -msgid "SQL Lab View" -msgstr "Pogled SQL laboratorija" +#: superset-frontend/src/components/DatabaseSelector/index.tsx:296 +msgid "Force refresh schema list" +msgstr "Osveži seznam shem" -#: superset-frontend/src/SqlLab/components/App/index.jsx:91 -#, python-format +#: superset-frontend/src/components/DatabaseSelector/index.tsx:301 +#: superset-frontend/src/components/DatabaseSelector/index.tsx:308 +msgid "Select schema or type schema name" +msgstr "Izberite ali vnesite ime sheme" + +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:47 msgid "" -"SQL Lab uses your browser's local storage to store queries and results.\n" -"Currently, you are using %(currentUsage)s KB out of %(maxStorage)d KB " -"storage space.\n" -"To keep SQL Lab from crashing, please delete some query tabs.\n" -"You can re-access these queries by using the Save feature before you " -"delete the tab.\n" -"Note that you will need to close other SQL Lab windows before you do this." +"Warning! Changing the dataset may break the chart if the metadata does not exist." msgstr "" +"Opozorilo! Sprememba podatkovnega seta lahko pokvari grafikon, če metapodatki ne " +"obstajajo." -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1150 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:287 -#: superset/templates/appbuilder/navbar_right.html:38 -msgid "SQL Query" -msgstr "SQL poizvedba" +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:51 +msgid "" +"Changing the dataset may break the chart if the chart relies on columns or " +"metadata that does not exist in the target dataset" +msgstr "" +"Sprememba podatkovnega seta lahko pokvari grafikon, če se le-ta zanaša na stolpce " +"ali metapodatke, ki ne obstajajo v ciljnem podatkovnem nizu" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:181 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1038 -msgid "SQL expression" -msgstr "SQL izraz" +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:117 +#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:64 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:144 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:746 +msgid "dataset" +msgstr "podatkovni set" -#: superset-frontend/src/components/Menu/MenuRight.tsx:32 -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:124 -msgid "SQL query" -msgstr "SQL poizvedba" +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:225 +msgid "Connection" +msgstr "Povezava" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:61 -#: superset/views/database/mixins.py:194 -msgid "SQLAlchemy URI" -msgstr "SQLAlchemy URI" +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:254 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:267 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:369 +msgid "Change dataset" +msgstr "Spremeni podatkovni set" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:202 -msgid "SSL Mode \"require\" will be used." -msgstr "Uporabljen bo SSL način \"require\"." +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:286 +msgid "Warning!" +msgstr "Opozorilo!" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:64 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:115 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:122 -msgid "START (INCLUSIVE)" -msgstr "ZAČETEK (VKLJUČEN)" +#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:294 +msgid "Search / Filter" +msgstr "Iskanje / Filter" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:81 -msgid "SUN" -msgstr "NED" +#: superset-frontend/src/components/Datasource/CollectionTable.tsx:442 +msgid "Add item" +msgstr "Dodaj" -#: superset/viz.py:1903 -msgid "Sankey" -msgstr "Sankey" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:144 +msgid "Physical (table or view)" +msgstr "Fizičen (tabela ali pogled)" -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:36 -msgid "Sankey Diagram" -msgstr "Sankey grafikon" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:145 +msgid "Virtual (SQL)" +msgstr "Virtualen (SQL)" -#: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/index.js:27 -msgid "Sankey Diagram with Loops" -msgstr "Sankey grafikon z zankami" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:265 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:268 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:353 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:361 +msgid "Data type" +msgstr "Tip podatka" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:62 -msgid "Saturday" -msgstr "Sobota" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:280 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:352 +msgid "Advanced data type" +msgstr "Napredni podatkovni tip" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:160 -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:166 -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:181 -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:227 -#: superset-frontend/src/components/ReportModal/index.tsx:267 -#: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:88 -#: superset-frontend/src/dashboard/components/Header/index.jsx:588 -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:458 -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:148 -#: superset-frontend/src/dashboard/components/SaveModal.tsx:224 -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:531 -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:157 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:71 -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:205 -#: superset-frontend/src/explore/components/QueryAndSaveBtns.jsx:112 -#: superset-frontend/src/explore/components/SaveModal.tsx:202 -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:318 -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:260 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:488 -#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:345 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1039 -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:273 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:226 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:220 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1006 -msgid "Save" -msgstr "Shrani" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:284 +msgid "Advanced Data type" +msgstr "Napredni podatkovni tip" -#: superset-frontend/src/SqlLab/components/SaveDatasetModal/index.tsx:108 -msgid "Save & Explore" -msgstr "Shrani & Razišči" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:293 +msgid "Datetime format" +msgstr "Oblika datum-časa" -#: superset-frontend/src/explore/components/SaveModal.tsx:190 -msgid "Save & go to dashboard" -msgstr "Shrani in pojdi na nadzorno ploščo" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:297 +msgid "The pattern of timestamp format. For strings use " +msgstr "Vzorec zapisa časovne značke. Za znakovne nize uporabite " -#: superset-frontend/src/explore/components/SaveModal.tsx:234 -msgid "Save (Overwrite)" -msgstr "Shrani (prepiši)" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:299 +msgid "Python datetime string pattern" +msgstr "Pythonov vzorec zapisa datum-časa" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:160 -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:166 -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:254 -msgid "Save as" -msgstr "Shrani kot" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:301 +msgid " expression which needs to adhere to the " +msgstr " , ki mora upoštevati " -#: superset-frontend/src/explore/components/SaveModal.tsx:243 -msgid "Save as ..." -msgstr "Shrani kot ..." +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:303 +msgid "ISO 8601" +msgstr "ISO 8601" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:181 -msgid "Save as new" -msgstr "Shrani kot novo" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:305 +msgid "" +" standard to ensure that the lexicographical ordering\n" +" coincides with the chronological ordering. If the\n" +" timestamp format does not adhere to the ISO 8601 standard\n" +" you will need to define an expression and type for\n" +" transforming the string into a date or timestamp. Note\n" +" currently time zones are not supported. If time is stored\n" +" in epoch format, put `epoch_s` or `epoch_ms`. If no " +"pattern\n" +" is specified we fall back to using the optional defaults on " +"a per\n" +" database/column name level via the extra parameter." +msgstr "" +" standard, ki zagotavlja, de se leksikografsko razvrščanje\n" +" sklada s kronološkim razvrščanjem. Če oblika\n" +" časovne značke ni v skladu s standardom ISO 8601,\n" +" boste morali definirati izraz in tip za transformacijo\n" +" znakovnega niza v datum ali časovno značko.\n" +" Trenutno časovni pasovi niso podprti.\n" +" Če je čas shranjen v obliki epohe, dodajte `epoch_s` ali " +"`epoch_ms`.\n" +" Če ni podan vzorec, se uporabijo privzete vrednosti na " +"podlagi imena\n" +" podatkovne baze oz. stolpca s pomočjo dodatnega parametra." + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:325 +msgid "Certified By" +msgstr "Certificiral/a" -#: superset-frontend/src/explore/components/SaveModal.tsx:201 -msgid "Save as new chart" -msgstr "Shrani kot nov grafikon" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:326 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1223 +msgid "Person or group that has certified this metric" +msgstr "Oseba ali skupina, ki je certificirala to mero" -#: superset-frontend/src/dashboard/components/SaveModal.tsx:199 -msgid "Save as:" -msgstr "Shrani kot:" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:330 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1221 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1229 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:577 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:266 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:267 +msgid "Certified by" +msgstr "Certificiral/a" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:336 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:341 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1234 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1240 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:586 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:275 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:278 +msgid "Certification details" +msgstr "Podrobnosti certifikacije" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:337 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1236 +msgid "Details of the certification" +msgstr "Podrobnosti certifikacije" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:354 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:362 +msgid "Is dimension" +msgstr "Dimenzija" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:356 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:364 +msgid "Default datetime" +msgstr "Privzet datumčas" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:357 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:365 +msgid "Is filterable" +msgstr "Filtriranje" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:552 +msgid "Select owners" +msgstr "Izberite lastnike" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:764 +#, python-format +msgid "Modified columns: %s" +msgstr "Spremenjeni stolpci: %s" + +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:769 +#, python-format +msgid "Removed columns: %s" +msgstr "Odstranjeni stolpci: %s" -#: superset-frontend/src/explore/components/SaveModal.tsx:171 -msgid "Save chart" -msgstr "Shrani grafikon" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:774 +#, python-format +msgid "New columns added: %s" +msgstr "Dodani novi stolpci: %s" -#: superset-frontend/src/dashboard/components/SaveModal.tsx:182 -msgid "Save dashboard" -msgstr "Shrani nadzorno ploščo" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:777 +msgid "Metadata has been synced" +msgstr "Metapodatki so sinhronizirani" -#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:148 -msgid "Save for this session" -msgstr "Shranite za to sejo" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:783 +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:137 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:104 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:115 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx:46 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:67 +msgid "An error has occurred" +msgstr "Prišlo je do napake" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:169 -msgid "Save query" -msgstr "Shrani poizvedbo" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:812 +#, python-format +msgid "Column name [%s] is duplicated" +msgstr "Ime stolpca [%s] je podvojeno" -#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:89 -msgid "Save the query to enable this feature" -msgstr "Za omogočenje te funkcije shranite poizvedbo" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:818 +#, python-format +msgid "Metric name [%s] is duplicated" +msgstr "Ime mere [%s] je podvojeno" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:241 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:368 -msgid "Saved" -msgstr "Shranjeno" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:827 +#, python-format +msgid "Calculated column [%s] requires an expression" +msgstr "Izračunan stolpec [%s] zahteva izraz" -#: superset/initialization/__init__.py:334 -msgid "Saved Queries" -msgstr "Shranjene poizvedbe" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:846 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1263 +msgid "Basic" +msgstr "Osnovno" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:226 -msgid "Saved expressions" -msgstr "Shranjeni izrazi" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:859 +msgid "Default URL" +msgstr "Privzeti URL" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:369 -msgid "Saved metric" -msgstr "Shranjena mera" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:860 +msgid "Default URL to redirect to when accessing from the dataset list page" +msgstr "" +"Privzeti URL za preusmeritev, ko dostopate iz strani s seznamom podatkovnih setov" -#: superset-frontend/src/views/CRUD/data/common.ts:38 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:108 -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:318 -msgid "Saved queries" -msgstr "Shranjene poizvedbe" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:868 +msgid "Autocomplete filters" +msgstr "Samodokončaj filtre" -#: superset/queries/saved_queries/commands/exceptions.py:28 -msgid "Saved queries could not be deleted." -msgstr "Shranjenih poizvedb ni mogoče izbrisati." +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:869 +msgid "Whether to populate autocomplete filters options" +msgstr "Če želite napolniti možnosti za samodokončanje filtrov" -#: superset/queries/saved_queries/commands/exceptions.py:32 -msgid "Saved query not found." -msgstr "Shranjena poizvedba ni najdena." +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:875 +msgid "Autocomplete query predicate" +msgstr "Predikat za samodokončanje poizvedb" -#: superset/queries/saved_queries/commands/exceptions.py:40 -msgid "Saved query parameters are invalid." -msgstr "Parametri shranjene poizvedbe so neveljavni." +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:876 +msgid "" +"When using \"Autocomplete filters\", this can be used to improve performance of " +"the query fetching the values. Use this option to apply a predicate (WHERE " +"clause) to the query selecting the distinct values from the table. Typically the " +"intent would be to limit the scan by applying a relative time filter on a " +"partitioned or indexed time-related field." +msgstr "" +"Ko uporabljate \"Samodokončaj filtre\", lahko s tem izboljšate hitrost " +"pridobivanja rezultatov s poizvedbo. Z uporabo te možnosti dodate predikat (WHERE " +"stavek) k poizvedbi za izbiro različnih vrednosti iz tabele. Običajno je namen " +"omejiti poizvedbo z uporabo filtra za relativni čas na particioniranem ali " +"indeksiranem časovnem polju." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:168 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:277 -msgid "Scale and Move" -msgstr "Povečava in premikanje" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:896 +msgid "" +"Extra data to specify table metadata. Currently supports metadata of the format: " +"`{ \"certification\": { \"certified_by\": \"Data Platform Team\", \"details\": " +"\"This table is the source of truth.\" }, \"warning_markdown\": \"This is a " +"warning.\" }`." +msgstr "" +"Dodatni podatki za tabelo metapodatkov. Trenutno je podprta naslednja oblika " +"zapisa metapodatkov: `{ \"certification\": { \"certified_by\": \"Tim za razvoj\", " +"\"details\": \"Ta tabela je vir resnice.\" }, \"warning_markdown\": \"To je " +"opozorilo.\" }`." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:166 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:275 -msgid "Scale only" -msgstr "Samo povečava" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:931 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:290 +msgid "Cache timeout" +msgstr "Časovna omejitev predpomnilnika" -#: superset/initialization/__init__.py:529 -msgid "Scan New Datasources" -msgstr "Preišči nove podatkovne vire" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:932 +msgid "The duration of time in seconds before the cache is invalidated" +msgstr "Trajanje (v sekundah) do razveljavitve predpomnilnika" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:39 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:43 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:36 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:77 -msgid "Scatter" -msgstr "Raztreseni" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:939 +msgid "Hours offset" +msgstr "Urni premik" -#: superset-frontend/plugins/preset-chart-xy/src/ScatterPlot/createMetadata.ts:26 -msgid "Scatter Plot" -msgstr "Raztreseni grafikon" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:941 +msgid "" +"The number of hours, negative or positive, to shift the time column. This can be " +"used to move UTC time to local time." +msgstr "" +"Število ur, negativno ali pozitivno, za zamik časovnega stolpca. Na ta način je " +"mogoče UTC čas prestaviti na lokalni čas." -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:221 -#: superset-frontend/src/components/ReportModal/index.tsx:357 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:237 -msgid "Schedule" -msgstr "Urnik" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:964 +msgid "Spatial" +msgstr "Prostorski" -#: superset/views/schedules.py:274 -msgid "Schedule Email Reports for Charts" -msgstr "Razporedi e-poštna poročila za grafikone" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1004 +msgid "Click the lock to make changes." +msgstr "Kliknite ključavnico, da omogočite spreminjanje." -#: superset/views/schedules.py:196 -msgid "Schedule Email Reports for Dashboards" -msgstr "Razporedi e-poštna poročila za nadzorne plošče" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1007 +msgid "Click the lock to prevent further changes." +msgstr "Kliknite ključavnico, da onemogočite spreminjanje." -#: superset-frontend/src/dashboard/components/Header/index.jsx:423 -#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:218 -msgid "Schedule email report" -msgstr "Dodaj e-poštno poročilo na urnik" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1034 +msgid "virtual" +msgstr "virtualni" -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:211 -msgid "Schedule query" -msgstr "Urnik poizvedb" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1058 +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1065 +msgid "Dataset name" +msgstr "Ime podatkovnega seta" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1234 -msgid "Schedule settings" -msgstr "Nastavitve urnika" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1075 +msgid "" +"When specifying SQL, the datasource acts as a view. Superset will use this " +"statement as a subquery while grouping and filtering on the generated parent " +"queries." +msgstr "" +"Ko podajate SQL, se podatkovni vir obnaša kot pogled (view). Superset bo ta zapis " +"uporabil kot podpoizvedbo, pri čemer bo združeval in filtriral na podlagi " +"ustvarjenih starševskih poizvedb." -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:517 -msgid "Schedule the query periodically" -msgstr "Periodično zaganjaj poizvedbo" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1098 +msgid "The JSON metric or post aggregation definition." +msgstr "JSON mera ali po-agregacijska definicija." -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:99 -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:105 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:168 -msgid "Scheduled" -msgstr "V urniku" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1113 +msgid "Physical" +msgstr "Fizičen" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:117 -msgid "Scheduled at (UTC)" -msgstr "Izvede se ob (UTC)" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1154 +msgid "" +"The pointer to a physical table (or view). Keep in mind that the chart is " +"associated to this Superset logical table, and this logical table points the " +"physical table referenced here." +msgstr "" +"Kazalec na fizično tabelo (ali pogled). Grafikon je povezan s to Supersetovo " +"logično tabelo, ki kaže na tukaj referencirano fizično tabelo." -#: superset-frontend/src/components/ReportModal/index.tsx:359 -msgid "Scheduled reports will be sent to your email as a PNG" -msgstr "Poročila na urniku bodo poslana na vaš e-naslov kot PNG" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1245 +msgid "Warning" +msgstr "Opozorilo" -#: superset-frontend/src/components/DatabaseSelector/index.tsx:295 -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:220 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:299 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:451 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:232 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:287 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:444 -#: superset/connectors/sqla/views.py:494 superset/views/database/forms.py:126 -#: superset/views/database/forms.py:285 superset/views/database/forms.py:413 -msgid "Schema" -msgstr "Shema" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1247 +msgid "Optional warning about use of this metric" +msgstr "Opcijsko opozorilo za uporabo te mere" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:235 -msgid "Schema cache timeout" -msgstr "Trajanje prepomnilnika sheme" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1332 +msgid "Be careful." +msgstr "Bodite previdni." -#: superset/connectors/sqla/views.py:440 -msgid "Schema, as used only in some databases like Postgres, Redshift and DB2" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1333 +msgid "" +"Changing these settings will affect all charts using this dataset, including " +"charts owned by other people." msgstr "" -"Shema, ki se uporablja pri nekaterih podatkovnih bazah, kot so Postgres, " -"Redshift in DB2" - -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:369 -msgid "Schemas allowed for CSV upload" -msgstr "Dovoljene sheme za nalaganje CSV" +"Spreminjanje teh nastavitev bo vplivalo na vse grafikone, ki uporabljajo ta " +"podatkovni set, vključno z grafikoni v lasti drugih oseb." -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:256 -msgid "Scoping" -msgstr "Doseg" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1380 +msgid "Sync columns from source" +msgstr "Sinhroniziraj stolpce z virom" -#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 -#: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:542 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:292 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:516 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:417 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:477 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:461 -#: superset/templates/appbuilder/general/widgets/search.html:40 -msgid "Search" -msgstr "Iskanje" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1400 +msgid "Calculated columns" +msgstr "Izračunani stolpci" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:293 -msgid "Search / Filter" -msgstr "Iskanje / Filter" +#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1427 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:264 +#: superset-frontend/src/views/components/MenuRight.tsx:332 +msgid "Settings" +msgstr "Nastavitve" -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:291 -msgid "Search Metrics & Columns" -msgstr "Iskanje mer in stolpcev" +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:125 +#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:112 +msgid "The dataset has been saved" +msgstr "Podatkovni set je shranjen" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:703 -msgid "Search all charts" -msgstr "Išči vse grafikone" +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:164 +msgid "" +"The dataset configuration exposed here\n" +" affects all the charts using this dataset.\n" +" Be mindful that changing settings\n" +" here may affect other charts\n" +" in undesirable ways." +msgstr "" +"Tukaj prikazane nastavitve podatkovnega seta\n" +" vplivajo na vse grafikone, ki uporabljajo\n" +" ta podatkovni set. Spreminjanje\n" +" nastavitev lahko nezaželeno vpliva\n" +" na druge grafikone." -#: superset-frontend/src/components/OmniContainer/index.tsx:102 -msgid "Search all dashboards" -msgstr "Išči vse nadzorne plošče" +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:170 +msgid "Are you sure you want to save and apply changes?" +msgstr "Ali resnično želite shraniti in uporabiti spremembe?" -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:232 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:137 -msgid "Search all filter options" -msgstr "Poišči vse možnosti filtra" +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:176 +msgid "Confirm save" +msgstr "Potrdite shranjevanje" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:403 -msgid "Search box" -msgstr "Iskalno polje" +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:193 +msgid "Edit Dataset " +msgstr "Uredi podatkovni set " -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:388 -msgid "Search by query text" -msgstr "Išči z besedilom poizvedbe" +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:211 +msgid "Use legacy datasource editor" +msgstr "Uporabi starejši urejevalnik podatkovnega vira" -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:452 -msgid "Search..." -msgstr "Iskanje ..." +#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:234 +msgid "This dataset is managed externally, and can't be edited in Superset" +msgstr "Ta podatkovni set se ne ureja znotraj Superseta" -#: superset/db_engine_specs/base.py:86 -msgid "Second" -msgstr "Sekunda" +#: superset-frontend/src/components/DeleteModal/index.tsx:69 +msgid "DELETE" +msgstr "IZBRIŠI" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:244 -msgid "Secondary" -msgstr "Sekundarna" +#: superset-frontend/src/components/DeleteModal/index.tsx:84 +msgid "delete" +msgstr "izbriši" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:62 -msgid "Secondary Metric" -msgstr "Sekundarna mera" +#: superset-frontend/src/components/DeleteModal/index.tsx:92 +#: superset-frontend/src/components/ImportModal/index.tsx:252 +#, python-format +msgid "Type \"%s\" to confirm" +msgstr "Vnesite \"%s\" za potrditev" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:392 -msgid "Secondary y-axis format" -msgstr "Oblika sekundarne y-osi" +#: superset-frontend/src/components/EditableTitle/index.tsx:210 +msgid "Click to edit" +msgstr "Kliknite za urejanje" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:401 -msgid "Secondary y-axis title" -msgstr "Naslov sekundarne y-osi" +#: superset-frontend/src/components/EditableTitle/index.tsx:212 +msgid "You don't have the rights to alter this title." +msgstr "Nimate pravic za spreminjanje tega naslova." -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:63 -#, fuzzy, python-format -msgid "Seconds %s" -msgstr "sekunda" +#: superset-frontend/src/components/ErrorBoundary/index.jsx:51 +#: superset-frontend/src/components/ErrorMessage/ErrorMessageWithStackTrace.tsx:26 +msgid "Unexpected error" +msgstr "Nepričakovana napaka" -#: superset/views/database/mixins.py:197 -msgid "Secure Extra" -msgstr "Dodatna varnost" +#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:47 +#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:62 +msgid "This may be triggered by:" +msgstr "To je lahko sproženo z/s:" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:326 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:331 -msgid "Secure extra" -msgstr "Dodatna varnost" +#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:59 +#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:72 +msgid "Please reach out to the Chart Owner for assistance." +msgstr "Za pomoč se obrnite na lastnika grafikona." -#: superset/initialization/__init__.py:276 -#: superset/initialization/__init__.py:421 -#: superset/initialization/__init__.py:493 -msgid "Security" -msgstr "Varnost" +#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:70 +#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:83 +#, python-format +msgid "Chart Owner: %s" +msgstr "Lastnik grafikona: %s" -#: superset-frontend/src/profile/components/App.tsx:82 -msgid "Security & Access" -msgstr "Varnost in Dostopi" +#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:84 +#, python-format +msgid "" +"%(message)s\n" +"This may be triggered by: \n" +"%(issues)s" +msgstr "" +"%(message)s\n" +"To je lahko sproženo z/s: \n" +"%(issues)s" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:157 -#, fuzzy, python-format -msgid "See all %(tableName)s" -msgstr "Razišči - %(table)s" +#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:90 +#, python-format +msgid "%s Error" +msgstr "%s napaka" -#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:155 -msgid "See less" -msgstr "Oglejte si manj" +#: superset-frontend/src/components/ErrorMessage/DatasetNotFoundErrorMessage.tsx:34 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:353 +msgid "Missing dataset" +msgstr "Manjka podatkovni set" #: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:126 #: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:142 msgid "See more" msgstr "Oglejte si več" -#: superset-frontend/src/components/TableSelector/index.tsx:291 -msgid "See table schema" -msgstr "Ogled sheme tabele" +#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:155 +msgid "See less" +msgstr "Oglejte si manj" -#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:132 -msgid "Select" -msgstr "Izberi" +#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:184 +msgid "Copy message" +msgstr "Kopiraj sporočilo" -#: superset-frontend/src/components/AsyncSelect/index.jsx:41 -#: superset-frontend/src/components/Select/Select.tsx:290 -#: superset-frontend/src/explore/components/controls/SelectAsyncControl/index.tsx:106 -#: superset-frontend/src/explore/components/controls/SelectControl.jsx:227 -msgid "Select ..." -msgstr "Izberite ..." +#: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:192 +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:524 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:342 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:258 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:486 +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:337 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:882 +msgid "Close" +msgstr "Zapri" -#: superset-frontend/src/views/CRUD/alert/components/NotificationMethod.tsx:127 -msgid "Select Delivery Method" -msgstr "Izberite način dostave" +#: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:61 +msgid "This was triggered by:" +msgstr "To je bilo sproženo z/s:" -#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:106 -msgid "Select Viz Type" -msgstr "Izberite tip vizualizacije" +#: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:77 +msgid "Did you mean:" +msgstr "Ste mislili:" -#: superset/views/database/forms.py:102 -msgid "Select a CSV file to be uploaded to a database." -msgstr "Izberite CSV datoteko, ki bo naložena v podatkovno bazo." +#: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:88 +#, python-format +msgid "%(suggestion)s instead of \"%(undefinedParameter)s?\"" +msgstr "%(suggestion)s namesto \"%(undefinedParameter)s?\"" -#: superset/views/database/forms.py:386 -msgid "Select a Columnar file to be uploaded to a database." -msgstr "Izberite stolpčno datoteko, ki bo naložena v podatkovno bazo." +#: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:116 +msgid "Parameter error" +msgstr "Napaka parametra" -#: superset/views/database/forms.py:253 -msgid "Select a Excel file to be uploaded to a database." -msgstr "Izberite Excel-ovo datoteko, ki bo naložena v podatkovno bazo." +#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:46 +#, python-format +msgid "" +"We’re having trouble loading this visualization. Queries are set to timeout after " +"%s second." +msgstr "" +"Težava pri nalaganju vizualizacije. Časovni iztek poizvedb je nastavljen na %s " +"sekund." -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:133 -msgid "Select a column" -msgstr "Izberite stolpec" +#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:52 +#, python-format +msgid "" +"We’re having trouble loading these results. Queries are set to timeout after %s " +"second." +msgstr "" +"Težava pri nalaganju rezultatov. Časovni iztek poizvedb je nastavljen na %s " +"sekund." -#: superset-frontend/src/explore/components/SaveModal.tsx:264 -msgid "Select a dashboard" -msgstr "Izberite nadzorno ploščo" +#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:93 +#, python-format +msgid "" +"%(subtitle)s\n" +"This may be triggered by:\n" +" %(issue)s" +msgstr "" +"%(subtitle)s\n" +"To je lahko sproženo z/s: \n" +" %(issue)s" -#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:131 -msgid "Select a visualization type" -msgstr "Izberite tip vizualizacije" +#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:98 +msgid "Timeout error" +msgstr "Napaka pretečenega časa" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:310 -msgid "Select aggregate options" -msgstr "Izberite agregacijske možnosti" +#: superset-frontend/src/components/FaveStar/index.tsx:79 +msgid "Click to favorite/unfavorite" +msgstr "Kliknite za priljubljeno/nepriljubljeno" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:107 -msgid "Select any columns for metadata inspection" -msgstr "Izberite poljubne stolpce za pregled metapodatkov" +#: superset-frontend/src/components/FilterableTable/index.tsx:465 +msgid "Cell content" +msgstr "Vsebina celice" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:103 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:138 -msgid "Select charts" -msgstr "Izberi grafikone" +#: superset-frontend/src/components/ImportModal/ErrorAlert.tsx:46 +msgid "" +"Database driver for importing maybe not installed. Visit the Superset " +"documentation page for installation instructions:" +msgstr "" +"Gonilnik podatkovne baze za uvoz ni nameščen. Za navodila pojdite na " +"dokumentacijo Superseta:" -#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:188 -msgid "Select color scheme" -msgstr "Izberite barvno shemo" +#: superset-frontend/src/components/ImportModal/index.tsx:209 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1019 +msgid "OVERWRITE" +msgstr "OVERWRITE" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:208 -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:63 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:301 -msgid "Select column" -msgstr "Izberite stolpec" +#: superset-frontend/src/components/ImportModal/index.tsx:281 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:447 +msgid "Overwrite" +msgstr "Prepiši" -#: superset-frontend/src/components/DatabaseSelector/index.tsx:268 -#: superset-frontend/src/components/DatabaseSelector/index.tsx:275 -msgid "Select database or type database name" -msgstr "Izberite ali vnesite ime podatkovne baze" +#: superset-frontend/src/components/ImportModal/index.tsx:281 +msgid "Import" +msgstr "Uvozi" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1127 -msgid "" -"Select databases require additional fields to be completed in the " -"Advanced tab to successfully connect the database. Learn what " -"requirements your databases has " -msgstr "" +#: superset-frontend/src/components/ImportModal/index.tsx:285 +#, python-format +msgid "Import %s" +msgstr "Uvozi %s" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:294 -#: superset-frontend/src/filters/components/Select/index.ts:28 -msgid "Select filter" -msgstr "Izbirni filter" +#: superset-frontend/src/components/LastUpdated/index.tsx:74 +#, python-format +msgid "Last Updated %s" +msgstr "Zadnja posodobitev %s" -#: superset-frontend/src/filters/components/Select/index.ts:29 -msgid "Select filter plugin using AntD" -msgstr "Izberite Vtičnik za filter z uporabo AntD" +#: superset-frontend/src/components/ListView/CardSortSelect.tsx:82 +#: superset-frontend/src/components/ListView/CardSortSelect.tsx:83 +msgid "Sort" +msgstr "Razvrsti" -#: superset-frontend/src/filters/components/Select/controlPanel.ts:111 -msgid "" -"Select first item by default (when using this option, default value can’t" -" be set)" -msgstr "" -"Izberi prvi element kot privzet (ko uporabljate to možnost, privzete " -"vrednost ni mogoče nastaviti)" +#: superset-frontend/src/components/ListView/ListView.tsx:244 +#, python-format +msgid "%s Selected" +msgstr "Izbranih: %s" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:303 -msgid "Select operator" -msgstr "Izberite operator" +#: superset-frontend/src/components/ListView/ListView.tsx:358 +msgid "Deselect all" +msgstr "Počisti izbor" -#: superset-frontend/src/components/ListView/Filters/Select.tsx:84 -msgid "Select or type a value" -msgstr "Izberite ali vnesite vrednost" +#: superset-frontend/src/components/ListView/ListView.tsx:408 +msgid "No results match your filter criteria" +msgstr "Noben rezultat ne ustreza vašim kriterijem" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:393 -msgid "Select owners" -msgstr "Izberite lastnike" +#: superset-frontend/src/components/ListView/ListView.tsx:409 +msgid "Try different criteria to display results." +msgstr "Za prikaz rezultatov poskusite z drugačnimi kriteriji." -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadePopover/index.tsx:177 -msgid "Select parent filters" -msgstr "Izberi starševske filtre" +#: superset-frontend/src/components/ListView/ListView.tsx:412 +msgid "clear all filters" +msgstr "počisti vse filtre" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:319 -msgid "Select saved metrics" -msgstr "Izberite shranjene mere" +#: superset-frontend/src/components/ListView/ListView.tsx:417 +msgid "No Data" +msgstr "Ni podatkov" -#: superset-frontend/src/components/DatabaseSelector/index.tsx:293 -#: superset-frontend/src/components/DatabaseSelector/index.tsx:300 -msgid "Select schema or type schema name" -msgstr "Izberite ali vnesite ime sheme" +#: superset-frontend/src/components/ListView/ListView.tsx:438 +#: superset-frontend/src/components/TableView/TableView.tsx:240 +#, python-format +msgid "%s-%s of %s" +msgstr "%s-%s od %s" -#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:194 -#, fuzzy -msgid "Select scheme" -msgstr "Izberite barvno shemo" +#: superset-frontend/src/components/ListView/Filters/Search.tsx:75 +msgid "Type a value" +msgstr "Vnesite vrednost" -#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:273 -msgid "Select start and end date" -msgstr "Izberite začetni in končni datum" +#: superset-frontend/src/components/ListView/Filters/Select.tsx:91 +msgid "Filter" +msgstr "Filter" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:265 -msgid "Select subject" -msgstr "Izberite zadevo" +#: superset-frontend/src/components/ListView/Filters/Select.tsx:98 +msgid "Select or type a value" +msgstr "Izberite ali vnesite vrednost" -#: superset-frontend/src/components/TableSelector/index.tsx:298 -#: superset-frontend/src/components/TableSelector/index.tsx:308 -msgid "Select table or type table name" -msgstr "Izberite ali vnesite ime tabele" +#: superset-frontend/src/components/Modal/Modal.tsx:211 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:835 +msgid "OK" +msgstr "OK" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:98 -msgid "Select the number of bins for the histogram" -msgstr "Izberite število razdelkov za histogram" +#: superset-frontend/src/components/PageHeaderWithActions/index.tsx:154 +msgid "Menu actions trigger" +msgstr "Preklapljanje funkcionalnosti menijev" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:38 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:48 -msgid "Select the numeric columns to draw the histogram" -msgstr "Izberite numerične stolpce za izris histograma" +#: superset-frontend/src/components/ReportModal/index.tsx:119 +#, python-format +msgid "Weekly Report for %s" +msgstr "Tedensko poročilo za %s" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1340 -msgid "Send as CSV" -msgstr "Pošlji kot CSV" +#: superset-frontend/src/components/ReportModal/index.tsx:120 +msgid "Weekly Report" +msgstr "Tedensko poročilo" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1339 -msgid "Send as PNG" -msgstr "Pošlji kot PNG" +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:197 +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:225 +#: superset-frontend/src/components/ReportModal/index.tsx:206 +msgid "Edit email report" +msgstr "Uredi e-poštno poročilo" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1342 -msgid "Send as text" -msgstr "Pošlji kot besedilo" +#: superset-frontend/src/components/ReportModal/index.tsx:206 +msgid "Schedule a new email report" +msgstr "Dodaj novo e-poštno poročilo na urnik" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:58 -msgid "Send range filter events to other charts" -msgstr "Pošlji dogodke filtra obdobja na druge grafikone" +#: superset-frontend/src/components/ReportModal/index.tsx:223 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1057 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:273 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:230 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:220 +#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:123 +msgid "Add" +msgstr "Dodaj" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:74 -msgid "September" -msgstr "September" +#: superset-frontend/src/components/ReportModal/index.tsx:231 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1315 +msgid "Message content" +msgstr "Vsebina sporočila" -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:58 -#: superset-frontend/plugins/plugin-chart-table/src/index.ts:49 -msgid "Sequential" -msgstr "Sekvenčni" +#: superset-frontend/src/components/ReportModal/index.tsx:242 +msgid "Text embedded in email" +msgstr "Besedilo vključeno v e-pošto" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:61 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:385 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:119 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:128 -#: superset-frontend/src/explore/controls.jsx:400 -msgid "Series" -msgstr "Niz" +#: superset-frontend/src/components/ReportModal/index.tsx:246 +msgid "Image (PNG) embedded in email" +msgstr "Slika (PNG) vključena v e-pošto" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:71 -msgid "Series Height" -msgstr "Višina serije" +#: superset-frontend/src/components/ReportModal/index.tsx:249 +msgid "Formatted CSV attached in email" +msgstr "Oblikovan CSV pripet e-pošti" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:112 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:113 -msgid "Series Style" -msgstr "Slog serije" +#: superset-frontend/src/components/ReportModal/index.tsx:289 +msgid "Include a description that will be sent with your report" +msgstr "Vključite opis, ki bo vključen v poročilo" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:147 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:122 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:125 -msgid "Series chart type (line, bar etc)" -msgstr "Tip grafikona za posamezno podatkovno serijo (črtni, stolpčni, ...)" +#: superset-frontend/src/components/ReportModal/index.tsx:303 +msgid "A screenshot of the dashboard will be sent to your email at" +msgstr "Zaslonska slika nadzorne plošče bo poslana na vaš e-naslov ob" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:341 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:356 -#: superset-frontend/src/explore/controls.jsx:370 -msgid "Series limit" -msgstr "Omejitev št. serij" +#: superset-frontend/src/components/ReportModal/index.tsx:320 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1245 +msgid "Timezone" +msgstr "Časovni pas" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:135 -msgid "Series type" -msgstr "Tip serije" +#: superset-frontend/src/components/ReportModal/index.tsx:336 +msgid "Failed to update report" +msgstr "Posodabljanje poročila neuspešno" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:311 -msgid "Server Page Length" -msgstr "Dolžina strani strežnika" +#: superset-frontend/src/components/ReportModal/index.tsx:337 +msgid "Failed to create report" +msgstr "Ustvarjanje poročila nesupešno" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:289 -msgid "Server pagination" -msgstr "Paginacija na strani strežnika" +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:193 +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:215 +msgid "Email reports active" +msgstr "E-poštna poročila aktivna" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:115 -msgid "Service Account" -msgstr "Servisni račun" +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:200 +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:231 +msgid "Delete email report" +msgstr "Izbriši e-poštno poročilo" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:286 -msgid "Set auto-refresh interval" -msgstr "Nastavi interval samodejnega osveževanja" +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:207 +msgid "Set up an email report" +msgstr "Nastavite e-poštno poročilo" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:295 -msgid "Set filter mapping" -msgstr "Nastavi shemo filtrov" +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:258 +msgid "Schedule email report" +msgstr "Dodaj e-poštno poročilo na urnik" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1264 -#: superset-frontend/src/components/Menu/MenuRight.tsx:133 -msgid "Settings" -msgstr "Nastavitve" +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:285 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:504 +#, python-format +msgid "This action will permanently delete %s." +msgstr "S tem dejanjem boste trajno izbrisali %s." -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:133 -msgid "Settings for time series" -msgstr "Nastavitve časovne vrste" +#: superset-frontend/src/components/ReportModal/HeaderReportDropdown/index.tsx:296 +msgid "Delete Report?" +msgstr "Izbrišem poročilo?" -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:229 -msgid "Share" -msgstr "Deljenje" +#: superset-frontend/src/components/Select/Select.tsx:614 +#: superset-frontend/src/components/Select/Select.tsx:694 +#: superset-frontend/src/dashboard/components/gridComponents/DynamicComponent.tsx:165 +#: superset-frontend/src/explore/components/RowCountLabel/index.tsx:40 +msgid "Loading..." +msgstr "Nalagam ..." -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:317 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:175 -msgid "Share chart by email" -msgstr "Deli grafikon po e-pošti" +#: superset-frontend/src/components/TableLoader/index.tsx:91 +msgid "Access to user activity data is restricted" +msgstr "Dostop do aktivnosti uporabnikov je omejen" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:264 -msgid "Share dashboard by email" -msgstr "Deli nadzorno ploščo po e-pošti" +#: superset-frontend/src/components/TableSelector/index.tsx:240 +msgid "There was an error loading the tables" +msgstr "Napaka pri nalaganju tabel" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1221 -msgid "Shared query" -msgstr "Deljene poizvedbe" +#: superset-frontend/src/components/TableSelector/index.tsx:324 +msgid "See table schema" +msgstr "Ogled sheme tabele" -#: superset/views/database/forms.py:272 -msgid "Sheet Name" -msgstr "Ime zvezka" +#: superset-frontend/src/components/TableSelector/index.tsx:331 +#: superset-frontend/src/components/TableSelector/index.tsx:343 +msgid "Select table or type table name" +msgstr "Izberite ali vnesite ime tabele" -#: superset/annotation_layers/annotations/commands/exceptions.py:46 -msgid "Short description must be unique for this layer" -msgstr "Kratek opis mora biti za ta sloj unikaten" +#: superset-frontend/src/components/TableSelector/index.tsx:354 +msgid "Force refresh table list" +msgstr "Osveži seznam tabel" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:126 -msgid "" -"Should daily seasonality be applied. An integer value will specify " -"Fourier order of seasonality." -msgstr "" -"Če želite dnevno sezonskost. Celo število določa Fourier-jev red " -"sezonskosti." +#: superset-frontend/src/components/TimezoneSelector/index.tsx:129 +msgid "Timezone selector" +msgstr "Izbira časovnega pasa" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:109 +#: superset-frontend/src/dashboard/actions/dashboardLayout.js:182 msgid "" -"Should weekly seasonality be applied. An integer value will specify " -"Fourier order of seasonality." +"There is not enough space for this component. Try decreasing its width, or " +"increasing the destination width." msgstr "" -"Če želite tedensko sezonskost. Celo število določa Fourier-jev red " -"sezonskosti." +"Za to komponento ni dovolj prostora. Poskusite zmanjšati širino ali pa povečati " +"širino cilja." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:90 -msgid "" -"Should yearly seasonality be applied. An integer value will specify " -"Fourier order of seasonality." +#: superset-frontend/src/dashboard/actions/dashboardLayout.js:213 +msgid "Can not move top level tab into nested tabs" +msgstr "Najvišjega zavihka ni mogoče premakniti v gnezdene zavihke" + +#: superset-frontend/src/dashboard/actions/dashboardLayout.js:260 +msgid "This chart has been moved to a different filter scope." +msgstr "Ta grafikon je bil prestavljen v drug doseg filtrov." + +#: superset-frontend/src/dashboard/actions/dashboardState.js:98 +msgid "There was an issue fetching the favorite status of this dashboard." msgstr "" -"Če želite letno sezonskost. Celo število določa Fourier-jev red " -"sezonskosti." +"Pri pridobivanju statusa \"priljubljeno\" za to nadzorno ploščo je prišlo do " +"težave." -#: superset/views/annotations.py:59 -msgid "Show Annotation" -msgstr "Prikaži oznako" +#: superset-frontend/src/dashboard/actions/dashboardState.js:119 +msgid "There was an issue favoriting this dashboard." +msgstr "Pri uvrščanju nadzorne plošče med priljubljene je prišlo do težave." -#: superset/views/annotations.py:118 -msgid "Show Annotation Layer" -msgstr "Prikaži sloj z oznakami" +#: superset-frontend/src/dashboard/actions/dashboardState.js:143 +msgid "This dashboard is now published" +msgstr "Ta nadzorna plošča je sedaj objavljena" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:80 -msgid "Show Bubbles" -msgstr "Prikaži mehurčke" +#: superset-frontend/src/dashboard/actions/dashboardState.js:144 +msgid "This dashboard is now hidden" +msgstr "Ta nadzorna plošča je sedaj skrita" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:204 -msgid "Show CREATE VIEW statement" -msgstr "Prikaži CREATE VIEW stavek" +#: superset-frontend/src/dashboard/actions/dashboardState.js:152 +msgid "You do not have permissions to edit this dashboard." +msgstr "Nimate dovoljenj za urejanje te nadzorne plošče." -#: superset/views/css_templates.py:37 -msgid "Show CSS Template" -msgstr "Prikaži CSS predlogo" +#: superset-frontend/src/dashboard/actions/dashboardState.js:233 +msgid "[ untitled dashboard ]" +msgstr "[ neimenovana nadzorna plošča ]" -#: superset/views/chart/mixin.py:27 -msgid "Show Chart" -msgstr "Prikaži grafikon" +#: superset-frontend/src/dashboard/actions/dashboardState.js:284 +#: superset-frontend/src/dashboard/actions/dashboardState.js:322 +msgid "This dashboard was saved successfully." +msgstr "Nadzorna plošča je bila uspešno shranjena." -#: superset/connectors/sqla/views.py:64 -msgid "Show Column" -msgstr "Pokaži stolpec" +#: superset-frontend/src/dashboard/actions/dashboardState.js:328 +msgid "Sorry, an unknown error occured" +msgstr "Prišlo je do neznane napake" -#: superset/views/dashboard/mixin.py:26 -msgid "Show Dashboard" -msgstr "Prikaži nadzorno ploščo" +#: superset-frontend/src/dashboard/actions/dashboardState.js:331 +#, python-format +msgid "Sorry, there was an error saving this dashboard: %s" +msgstr "Prišlo je do napake pri shranjevanju nadzorne plošče: %s" -#: superset/views/database/mixins.py:34 -msgid "Show Database" -msgstr "Prikaži podatkovno bazo" +#: superset-frontend/src/dashboard/actions/dashboardState.js:337 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:111 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:117 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx:48 +msgid "You do not have permission to edit this dashboard" +msgstr "Nimate dovoljenja za urejanje te nadzorne plošče" -#: superset/connectors/druid/views.py:214 -msgid "Show Druid Cluster" -msgstr "Pokaži Druid gručo" +#: superset-frontend/src/dashboard/actions/sliceEntities.js:119 +#: superset-frontend/src/dashboard/reducers/sliceEntities.js:65 +msgid "Could not fetch all saved charts" +msgstr "Vseh shranjenih grafikonov ni bilo mogoče pridobiti" -#: superset/connectors/druid/views.py:71 -msgid "Show Druid Column" -msgstr "Pokaži Druid stolpec" +#: superset-frontend/src/dashboard/actions/sliceEntities.js:124 +msgid "Sorry there was an error fetching saved charts: " +msgstr "Prišlo je do napake pri pridobivanju shranjenih grafikonov: " -#: superset/connectors/druid/views.py:278 -msgid "Show Druid Datasource" -msgstr "Prikaži podatkovni vir za Druid" +#: superset-frontend/src/dashboard/components/AddSliceCard.jsx:131 +msgid "Visualization" +msgstr "Vizualizacija" -#: superset/connectors/druid/views.py:160 -msgid "Show Druid Metric" -msgstr "Prikaži Druid mere" +#: superset-frontend/src/dashboard/components/AddSliceCard.jsx:135 +msgid "Data source" +msgstr "Podatkovni vir" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:33 -msgid "Show Druid granularity dropdown" -msgstr "Prikaži spustni seznam za Druid granulacijo" +#: superset-frontend/src/dashboard/components/AddSliceCard.jsx:140 +msgid "Added" +msgstr "Dodano" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:44 -msgid "Show Druid time origin" -msgstr "Prikaži časovno izhodišče za Druid" +#: superset-frontend/src/dashboard/components/ColorSchemeControlWrapper.jsx:56 +msgid "" +"Any color palette selected here will override the colors applied to this " +"dashboard's individual charts" +msgstr "" +"Na tem mestu izbrana barvna shema bo nadomestila barve posameznih grafikonov v " +"tej nadzorni plošči" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:96 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:127 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:149 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:94 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:71 -msgid "Show Labels" -msgstr "Pokaži oznake" +#: superset-frontend/src/dashboard/components/Dashboard.jsx:87 +msgid "You have unsaved changes." +msgstr "Imate neshranjene spremembe." -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:359 -msgid "Show Less..." -msgstr "Prikaži manj..." +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:80 +msgid "Changes saved." +msgstr "Spremembe shranjene." -#: superset/views/log/__init__.py:22 -msgid "Show Log" -msgstr "Prikaži dnevnik" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:98 +msgid "Disable embedding?" +msgstr "Onemogočite vgrajevanje?" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:64 -msgid "Show Markers" -msgstr "Prikaži markerje" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:99 +msgid "This will remove your current embed configuration." +msgstr "To bo odstranilo trenutno konfiguracijo za vgrajevanje." -#: superset/connectors/sqla/views.py:213 -msgid "Show Metric" -msgstr "Pokaži mero" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:108 +msgid "Embedding deactivated." +msgstr "Vgrajevanje deaktivirano." -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:178 -msgid "Show Metric Names" -msgstr "Pokaži imena mer" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:114 +msgid "Sorry, something went wrong. Embedding could not be deactivated." +msgstr "Nekaj je šlo narobe. Vgrajevanja ni mogoče deaktivirati." -#: superset/views/alerts.py:76 -msgid "Show Observation" -msgstr "Prikaži opažanja" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:163 +msgid "" +"This dashboard is ready to embed. In your application, pass the following id to " +"the SDK:" +msgstr "" +"Nadzorna plošča je pripravljena za vgradnjo. V svoji aplikaciji v SDK vključite " +"naslednji ID:" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:132 -msgid "Show Range Filter" -msgstr "Pokaži filter obdobja" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:170 +msgid "Configure this dashboard to embed it into an external web application." +msgstr "Nastavite nadzorno ploščo za vgradnjo v zunanjo spletno aplikacijo." -#: superset/connectors/sqla/views.py:315 -msgid "Show Row level security filter" -msgstr "Prikaži filter za varnost na nivoju vrstic" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:176 +msgid "For further instructions, consult the" +msgstr "Za nadaljnja navodila se posvetujte z" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:120 -msgid "Show SQL time column" -msgstr "Prikaži stolpec SQL čas" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:180 +msgid "Superset Embedded SDK documentation." +msgstr "Dokumentacija SDK za vgrajevanje." -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:105 -msgid "Show SQL time grain dropdown" -msgstr "Prikaži SQL spustni seznam za časovno granulacijo" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:186 +msgid "Allowed Domains (comma separated)" +msgstr "Dovoljene domene (ločeno z vejico)" -#: superset/views/sql_lab.py:40 -msgid "Show Saved Query" -msgstr "Prikaži shranjeno poizvedbo" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:188 +msgid "" +"A list of domain names that can embed this dashboard. Leaving this field empty " +"will allow embedding from any domain." +msgstr "" +"Seznam imen domen, ki lahko vgradijo to nadzorno ploščo. Če polje ostane prazno, " +"je vgrajevanje dovoljeno iz vseh domen." -#: superset/connectors/sqla/views.py:396 -msgid "Show Table" -msgstr "Prikaži tabelo" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:208 +msgid "Deactivate" +msgstr "Deaktiviraj" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:85 -msgid "Show Timestamp" -msgstr "Prikaži časovno značko" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:216 +msgid "Save changes" +msgstr "Shrani spremembe" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:97 -msgid "Show Trend Line" -msgstr "Pokaži trendno črto" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:225 +msgid "Enable embedding" +msgstr "Omogoči vgrajevanje" -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:83 -msgid "Show Upper Labels" -msgstr "Prikaži zgornje oznake" +#: superset-frontend/src/dashboard/components/DashboardEmbedControls.tsx:237 +msgid "Embed" +msgstr "Vgradi" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:106 -msgid "Show Value" -msgstr "Prikaži vrednost" +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:161 +msgid "Drag and drop components and charts to the dashboard" +msgstr "Povlecite in spustite elemente in grafikone na nadzorno ploščo" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:164 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:301 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:182 -msgid "Show Values" -msgstr "Pokaži vrednosti" +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:162 +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:185 +msgid "You can create a new chart or use existing ones from the panel on the right" +msgstr "Ustvarite lahko nove grafikone ali uporabite obstoječe iz panela na desni" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx:173 -msgid "Show all columns" -msgstr "Prikaži vse stolpce" +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:184 +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:178 +msgid "Drag and drop components to this tab" +msgstr "Povlecite in spustite elemente na zavihek" -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:326 -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:359 -msgid "Show all..." -msgstr "Prikaži vse..." +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:205 +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:179 +msgid "There are no components added to this tab" +msgstr "Na zavihek niso bili dodani elementi" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:206 -msgid "Show axis line ticks" -msgstr "Prikaži oznake na X-osi" +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:207 +msgid "You can add the components in the edit mode." +msgstr "Elemente lahko dodate v načinu urejanja." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:119 -msgid "Show cell bars" -msgstr "Prikaži stolp. graf v celicah" +#: superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx:447 +#: superset-frontend/src/dashboard/components/DashboardGrid.jsx:209 +msgid "Edit the dashboard" +msgstr "Uredi nadzorno ploščo" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:161 -msgid "Show columns total" -msgstr "Prikaži vsoto stolpcev" +#: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:64 +msgid "Ready to review filters in this dashboard?" +msgstr "Ste pripravljeni za pregled filtrov v tej nadzorni plošči?" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:67 -msgid "Show data points as circle markers on the lines" -msgstr "Pokaži točke kot krožne markerje na krivuljah" +#: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:69 +msgid "Remind me in 24 hours" +msgstr "Opomni me čez 24 ur" -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:52 +#: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:79 +msgid "Start Review" +msgstr "Začetek pregleda" + +#: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:86 +#: superset-frontend/src/dashboard/containers/DashboardPage.tsx:169 msgid "" -"Show hierarchical relationships of data, with with the value represented " -"by area, showing proportion and contribution to the whole." +"filter_box will be deprecated in a future version of Superset. Please replace " +"filter_box by dashboard filter components." msgstr "" -"Prikaže hierarhična razmerja podatkov, pri čemer je vrednost ponazorjena " -"s ploščino, in deleže oz. prispevke k celoti." +"Element filter_box bo v prihodnjih verzijah Superseta opuščen. Nadomestite ga s " +"filtri nadzorne plošče." -#: superset-frontend/packages/superset-ui-chart-controls/src/components/InfoTooltipWithTrigger.tsx:50 -msgid "Show info tooltip" -msgstr "Prikaži opis orodja" +#: superset-frontend/src/dashboard/components/MissingChart.jsx:31 +msgid "" +"There is no chart definition associated with this component, could it have been " +"deleted?" +msgstr "" +"S to komponento ni povezana nobena definicija grafikona. Ali je bila izbrisana?" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:736 -#, fuzzy -msgid "Show label" -msgstr "Pokaži oznake" +#: superset-frontend/src/dashboard/components/MissingChart.jsx:36 +msgid "Delete this container and save to remove this message." +msgstr "Izbrišite ta okvir in shranite za odpravo tega sporočila." -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:86 -msgid "Show labels when the node has children." -msgstr "Prikaži oznake, ko ima vozlišče podrejene elemente." +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:29 +msgid "Don't refresh" +msgstr "Ne osvežuj" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:35 -msgid "Show legend" -msgstr "Prikaži legendo" +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:30 +msgid "10 seconds" +msgstr "10 sekund" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx:168 -msgid "Show less columns" -msgstr "Prikaži manj stolpcev" +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:31 +msgid "30 seconds" +msgstr "30 sekund" -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:326 -msgid "Show less..." -msgstr "Prikaži manj..." +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:32 +msgid "1 minute" +msgstr "1 minuta" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:287 -msgid "Show percentage" -msgstr "Prikaži procente" +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:33 +msgid "5 minutes" +msgstr "5 minut" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:179 -msgid "Show pointer" -msgstr "Prikaži kazalec" +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:34 +msgid "30 minutes" +msgstr "30 minut" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:245 -msgid "Show progress" -msgstr "Prikaži območje" +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:35 +msgid "1 hour" +msgstr "1 ura" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:149 -msgid "Show rows total" -msgstr "Prikaži vsoto vrstic" +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:36 +msgid "6 hours" +msgstr "6 ur" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:109 -msgid "Show series values on the chart" -msgstr "Na grafikonu prikaži vrednosti serij" +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:37 +msgid "12 hours" +msgstr "12 ur" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:218 -msgid "Show split lines" -msgstr "Prikaži razdelitvene črte" +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:38 +msgid "24 hours" +msgstr "24 ur" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:297 -msgid "Show the value on top of the bar" -msgstr "Prikaži vrednosti na vrhu stolpcev" +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:90 +msgid "Refresh interval saved" +msgstr "Interval osveževanja shranjen" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:121 -msgid "Show time column" -msgstr "Prikaži časovni stolpec" +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:116 +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:121 +msgid "Refresh interval" +msgstr "Interval osveževanja" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:106 -msgid "Show time grain dropdown" -msgstr "Prikaži spustni seznam za časovno granulacijo" +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:119 +msgid "Refresh frequency" +msgstr "Frekvenca osveževanja" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:351 -msgid "" -"Show total aggregations of selected metrics. Note that row limit does not" -" apply to the result." -msgstr "" -"Prikaži skupno agregacijo izbrane mere. Omejitev števila vrstic ne vpliva" -" na rezultat." +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:135 +msgid "Are you sure you want to proceed?" +msgstr "Ali želite nadaljevati?" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:87 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:349 -msgid "Show totals" -msgstr "Pokaži vsote" +#: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:150 +msgid "Save for this session" +msgstr "Shranite za to sejo" + +#: superset-frontend/src/dashboard/components/SaveModal.tsx:156 +msgid "You must pick a name for the new dashboard" +msgstr "Izbrati morate ime nove nadzorne plošče" + +#: superset-frontend/src/dashboard/components/SaveModal.tsx:178 +msgid "Save dashboard" +msgstr "Shrani nadzorno ploščo" + +#: superset-frontend/src/dashboard/components/SaveModal.tsx:187 +#, python-format +msgid "Overwrite Dashboard [%s]" +msgstr "Prepiši nadzorno ploščo [%s]" + +#: superset-frontend/src/dashboard/components/SaveModal.tsx:195 +msgid "Save as:" +msgstr "Shrani kot:" + +#: superset-frontend/src/dashboard/components/SaveModal.tsx:199 +msgid "[dashboard name]" +msgstr "[ime nadzorne plošče]" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:31 -msgid "" -"Showcases a single metric front-and-center. Big number is best used to " -"call attention to a KPI or the one thing you want your audience to focus " -"on." -msgstr "" -"Prikaže eno vrednost. Velika številka je primerna za poudarek KPI-ja ali " -"vrednosti, na katero želite usmeriti pozornost." +#: superset-frontend/src/dashboard/components/SaveModal.tsx:209 +msgid "also copy (duplicate) charts" +msgstr "kopiraj (podvoji) tudi grafikone" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:30 -msgid "" -"Showcases a single number accompanied by a simple line chart, to call " -"attention to an important metric along with its change over time or other" -" dimension." -msgstr "" -"Prikaže eno vrednost skupaj s preprostim črtnim grafikonom, za poudarek " -"pomembne mere skupaj z njeno časovno spremembo." +#: superset-frontend/src/dashboard/components/SliceAdder.jsx:293 +msgid "Filter your charts" +msgstr "Filtriraj grafikone" -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:49 -msgid "" -"Showcases how a metric changes as the funnel progresses. This classic " -"chart is useful for visualizing drop-off between stages in a pipeline or " -"lifecycle." -msgstr "" -"Prikaže kako se mera spreminja, ko lijak napreduje. Standardni grafikon " -"za prikaz sprememb med nivoji v procesu ali življenjskem ciklu." +#: superset-frontend/src/dashboard/components/SliceAdder.jsx:304 +#, python-format +msgid "Sort by %s" +msgstr "Razvrščanje po %s" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:28 -msgid "" -"Showcases the flow or link between categories using thickness of chords. " -"The value and corresponding thickness can be different for each side." -msgstr "" -"Prikaže potek ali povezave med kategorijami z debelino tetiv. Vrednost in" -" debelina sta lahko različni za vsako stran." +#: superset-frontend/src/dashboard/components/AnchorLink/index.tsx:71 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:388 +msgid "Superset chart" +msgstr "Superset grafikon" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:27 -msgid "" -"Showcases the progress of a single metric against a given target. The " -"higher the fill, the closer the metric is to the target." -msgstr "" -"Prikaže napredovanje posamezne mere glede na cilj. Večja napolnjenost, " -"pomeni, da je mera bližje cilju." +#: superset-frontend/src/dashboard/components/AnchorLink/index.tsx:72 +msgid "Check out this chart in dashboard:" +msgstr "Preizkusite ta grafikon v nadzorni plošči:" -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:305 -#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:338 -#, python-format -msgid "Showing %s of %s" -msgstr "Prikazanih %s od %s" +#: superset-frontend/src/dashboard/components/BuilderComponentPane/index.tsx:115 +msgid "Layout elements" +msgstr "Postavitev elementov" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:152 -msgid "Shows a list of all series available at that point in time" -msgstr "Prikaže seznam vseh razpoložljivih podatkovnih serij za istočasno točko" +#: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:65 +msgid "Cross Filter Scoping" +msgstr "Doseg medsebojnega filtra" -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:31 -msgid "" -"Shows the composition of a dataset by segmenting a given rectangle as " -"smaller rectangles with areas proportional to their value or contribution" -" to the whole. Those rectangles may also, in turn, be further segmented " -"hierarchically." -msgstr "" -"Prikaže zgradbo podatkovnega seta na podlagi segmentacije danega " -"pravokotnika na manjše pravokotnike, pri čemer je ploščina sorazmerna " -"vrednostim oz. deležem. Pravokotniki se lahko dodatno hierarhično " -"segmentirajo." +#: superset-frontend/src/dashboard/components/CssEditor/index.jsx:94 +msgid "Load a CSS template" +msgstr "Naloži CSS predlogo" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:72 -msgid "Significance Level" -msgstr "Stopnja značilnosti" +#: superset-frontend/src/dashboard/components/CssEditor/index.jsx:109 +msgid "Live CSS editor" +msgstr "CSS urejevalnik v živo" -#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:262 -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:201 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:394 -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:397 -msgid "Simple" -msgstr "Preprosto" +#: superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx:440 +msgid "There are no charts added to this dashboard" +msgstr "V nadzorni plošči ni grafikonov" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:390 -msgid "Simple ad-hoc metrics are not enabled for this dataset" -msgstr "Preproste ad-hoc mere za ta podatkovni set niso omogočene" +#: superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx:443 +msgid "Go to the edit mode to configure the dashboard and add charts" +msgstr "" +"Za nastavitve nadzorne plošče in dodajanje grafikonov pojdite v način urejanja" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:186 -msgid "Single" -msgstr "Posamezno" +#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:186 +#, python-format +msgid "Applied Cross Filters (%d)" +msgstr "Uporabljeni medsebojni filtri (%d)" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:45 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:46 -msgid "Single Metric" -msgstr "Ena mera" +#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:210 +#, python-format +msgid "Applied Filters (%d)" +msgstr "Uporabljeni filtri (%d)" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1234 -#, fuzzy -msgid "Single Value" -msgstr "Desna vrednost" +#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:231 +#, python-format +msgid "Incompatible Filters (%d)" +msgstr "Neskladni filtri (%d)" -#: superset-frontend/src/filters/components/Range/controlPanel.ts:65 -#, fuzzy -msgid "Single value" -msgstr "Desna vrednost" +#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:255 +#, python-format +msgid "Unset Filters (%d)" +msgstr "Neuporabljeni filtri (%d)" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1251 -msgid "Single value type" +#: superset-frontend/src/dashboard/components/Header/index.jsx:306 +#, python-format +msgid "" +"This dashboard is currently auto refreshing; the next auto refresh will be in %s." msgstr "" +"Nadzorna plošča se trenutno samodejno osvežuje. Naslednja samodejna osvežitev bo " +"čez %s." -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:261 -msgid "Size of edge symbols" -msgstr "Velikost simbola povezave" +#: superset-frontend/src/dashboard/components/Header/index.jsx:396 +msgid "Your dashboard is too large. Please reduce its size before saving it." +msgstr "Vaša nadzorna plošča je prevelika. Pred shranjevanjem jo zmanjšajte." -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:230 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:168 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:129 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:109 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:126 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:184 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:187 -msgid "Size of marker. Also applies to forecast observations." -msgstr "Velikost markerja. Upošteva se tudi za napovedi." +#: superset-frontend/src/dashboard/components/Header/index.jsx:497 +msgid "Add the name of the dashboard" +msgstr "Dodajte naziv nadzorne plošče" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:34 -msgid "Sizes of vehicles" -msgstr "Velikosti vozil" +#: superset-frontend/src/dashboard/components/Header/index.jsx:498 +msgid "Dashboard title" +msgstr "Naziv nadzorne plošče" -#: superset/views/database/forms.py:199 -msgid "Skip Blank Lines" -msgstr "Izpusti prazne vrstice" +#: superset-frontend/src/dashboard/components/Header/index.jsx:533 +msgid "Undo the action" +msgstr "Razveljavi dejanje" -#: superset/views/database/forms.py:184 -msgid "Skip Initial Space" -msgstr "Izpusti začetni presledek" +#: superset-frontend/src/dashboard/components/Header/index.jsx:553 +msgid "Redo the action" +msgstr "Ponovno uveljavi dejanje" -#: superset/views/database/forms.py:187 superset/views/database/forms.py:328 -msgid "Skip Rows" -msgstr "Izpusti vrstice" +#: superset-frontend/src/dashboard/components/Header/index.jsx:578 +#: superset-frontend/src/dashboard/components/Header/index.jsx:580 +msgid "Discard" +msgstr "Zavrzi" -#: superset/views/database/forms.py:200 -msgid "Skip blank lines rather than interpreting them as NaN values." -msgstr "Raje izpusti prazne vrstice, kot pa da so prepoznane kot NaN vrednosti." +#: superset-frontend/src/dashboard/components/Header/index.jsx:611 +#: superset-frontend/src/dashboard/components/Header/index.jsx:613 +msgid "Edit dashboard" +msgstr "Uredi nadzorno ploščo" -#: superset/views/database/forms.py:184 -msgid "Skip spaces after delimiter." -msgstr "Izpusti presledek za ločilnikom." +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:129 +msgid "An error occurred while fetching available CSS templates" +msgstr "Pri pridobivanju CSS predlog je prišlo do napake" -#: superset/views/schedules.py:243 superset/views/schedules.py:323 -msgid "Slack Channel" -msgstr "Slack Channel" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:162 +msgid "Refreshing charts" +msgstr "Osveževanje grafikonov" -#: superset/views/dashboard/mixin.py:80 -msgid "Slug" -msgstr "Slug" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:233 +msgid "Superset dashboard" +msgstr "Superset nadzorna plošča" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:39 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:73 -#: superset-frontend/src/dashboard/util/headerStyleOptions.ts:25 -msgid "Small" -msgstr "Majhno" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:235 +msgid "Check out this dashboard: " +msgstr "Preizkusite to nadzorno ploščo: " -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:153 -msgid "Small number format" -msgstr "Oblika zapisa majhnih števil" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:252 +msgid "Refresh dashboard" +msgstr "Osveži nadzorno ploščo" -#: superset/commands/exceptions.py:112 -msgid "Some roles do not exist" -msgstr "Nekatere vloge ne obstajajo" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:261 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:274 +msgid "Exit fullscreen" +msgstr "Izhod iz celozaslonskega načina" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:623 -#, python-format -msgid "Sorry there was an error fetching database information: %s" -msgstr "Pri pridobivanju informacij o podatkovni bazi je prišlo do napake: %s" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:262 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:275 +msgid "Enter fullscreen" +msgstr "Vklopi celozaslonski način" -#: superset-frontend/src/dashboard/actions/sliceEntities.js:121 -msgid "Sorry there was an error fetching saved charts: " -msgstr "Prišlo je do napake pri pridobivanju shranjenih grafikonov: " +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:270 +msgid "Edit properties" +msgstr "Uredi lastnosti" -#: superset-frontend/src/explore/components/DataTablesPane/index.tsx:273 -#: superset-frontend/src/explore/components/controls/ViewQueryModal.tsx:84 -msgid "Sorry, An error occurred" -msgstr "Prišlo je do napake" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:276 +msgid "Edit CSS" +msgstr "Uredi CSS" -#: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:65 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:126 -msgid "Sorry, something went wrong. Try again later." -msgstr "Nekaj je šlo narobe. Poskusite ponovno kasneje." +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:314 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:422 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:300 +msgid "Download as image" +msgstr "Izvozi kot sliko" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/EventFlow.tsx:50 -msgid "Sorry, there appears to be no data" -msgstr "Ni podatkov" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:322 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:382 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:303 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:230 +msgid "Share" +msgstr "Deljenje" -#: superset-frontend/src/dashboard/actions/dashboardState.js:238 -#, fuzzy, python-format -msgid "Sorry, there was an error saving this dashboard: %s" -msgstr "Prišlo je do napake pri pridobivanju shranjenih grafikonov: " +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:326 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:386 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:305 +msgid "Copy permalink to clipboard" +msgstr "Kopiraj povezavo v odložišče" -#: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:55 -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:115 -#: superset-frontend/src/views/CRUD/data/components/SyntaxHighlighterCopy/index.tsx:76 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:219 -#: superset-frontend/src/views/CRUD/hooks.ts:604 -msgid "Sorry, your browser does not support copying." -msgstr "Vaš brskalnik ne podpira kopiranja." +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:327 +msgid "Share permalink by email" +msgstr "Deli povezavo po e-pošti" -#: superset-frontend/src/components/CopyToClipboard/index.jsx:79 -msgid "Sorry, your browser does not support copying. Use Ctrl / Cmd + C!" -msgstr "Vaš brskalnik ne podpira kopiranja. Uporabite Ctrl / Cmd + C!" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:341 +msgid "Embed dashboard" +msgstr "Vgradi nadzorno ploščo" -#: superset-frontend/src/components/ListView/CardSortSelect.tsx:82 -#: superset-frontend/src/components/ListView/CardSortSelect.tsx:83 -msgid "Sort" -msgstr "Razvrsti" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:348 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:331 +msgid "Manage email report" +msgstr "Upravljaj e-poštno poročilo" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:92 -msgid "Sort Bars" -msgstr "Uredi stolpce" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:377 +msgid "Set filter mapping" +msgstr "Nastavi shemo filtrov" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:42 -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:45 -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:40 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:48 -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:47 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:46 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:44 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:59 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:354 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:105 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:89 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:86 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:83 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:89 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:90 -msgid "Sort Descending" -msgstr "Razvrsti padajoče" +#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:390 +msgid "Set auto-refresh interval" +msgstr "Nastavi interval samodejnega osveževanja" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1198 -msgid "Sort Metric" -msgstr "Mera za razvrščanje" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:100 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:826 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:228 +#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:484 +msgid "Apply" +msgstr "Uporabi" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:251 -msgid "Sort X Axis" -msgstr "Razvrsti X-os" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:272 +msgid "A valid color scheme is required" +msgstr "Zahtevana je veljavna barvna shema" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:263 -msgid "Sort Y Axis" -msgstr "Razvrsti Y-os" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:337 +msgid "Dashboard properties updated" +msgstr "Lastnosti nadzorne plošče posodobljene" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1188 -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:205 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:66 -msgid "Sort ascending" -msgstr "Razvrsti naraščajoče" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:355 +msgid "The dashboard has been saved" +msgstr "Nadzorna plošča je bila shranjena" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:95 -msgid "Sort bars by x labels." -msgstr "Uredi stolpce po x-oznakah." +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:371 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:414 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:299 +msgid "Access" +msgstr "Dostop" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:125 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:369 -#: superset-frontend/src/dashboard/components/SliceAdder.jsx:259 -#: superset-frontend/src/explore/controls.jsx:384 -msgid "Sort by" -msgstr "Razvrščanje" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:386 +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:433 +msgid "" +"Owners is a list of users who can alter the dashboard. Searchable by name or " +"username." +msgstr "" +"\"Lastniki\" je seznam uporabnikov, ki lahko spreminjajo nadzorno ploščo. Iskanje " +"je možno po imenu ali uporabniškem imenu." -#: superset-frontend/src/dashboard/components/SliceAdder.jsx:256 -#, fuzzy, python-format -msgid "Sort by %s" -msgstr "Razvrščanje" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:392 +msgid "Colors" +msgstr "Barve" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:39 -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:38 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:94 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:55 -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:39 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:62 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:65 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:62 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:49 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:38 -msgid "Sort by metric" -msgstr "Mera za razvrščanje" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:453 +msgid "" +"Roles is a list which defines access to the dashboard. Granting a role access to " +"a dashboard will bypass dataset level checks. If no roles are defined, then the " +"dashboard is available to all roles." +msgstr "" +"\"Vloge\" je seznam, ki definira dostop do nadzorne plošče. Dodelitev vloge za " +"dostop do nadzorne plošče bo obšlo preverjanje na nivoju podatkovnega seta. Če " +"vloga ni definirana, bo nadzorna plošča dostopna vsem vlogam." -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:184 -msgid "Sort columns alphabetically" -msgstr "Razvrsti stolpce po abecedi" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:503 +msgid "Dashboard properties" +msgstr "Lastnosti nadzorne plošče" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:257 -#, fuzzy -msgid "Sort columns by" -msgstr "Brez stolpcev" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:524 +msgid "This dashboard is managed externally, and can't be edited in Superset" +msgstr "Ta nadzorna plošča se ne ureja znotraj Superseta" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/legacySortBy.tsx:29 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:337 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1189 -#: superset-frontend/src/explore/controlPanels/sections.tsx:125 -msgid "Sort descending" -msgstr "Razvrsti padajoče" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:545 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:241 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:288 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:247 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:237 +msgid "Basic information" +msgstr "Osnovne informacije" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1167 -msgid "Sort filter values" -msgstr "Razvrsti vrednosti filtra" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:559 +msgid "URL slug" +msgstr "URL slug" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1211 -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:184 -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:188 -msgid "Sort metric" -msgstr "Mera za razvrščanje" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:563 +msgid "A readable URL for your dashboard" +msgstr "Berljiv URL za vašo nadzorno ploščo" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:229 -#, fuzzy -msgid "Sort rows by" -msgstr "Razvrščanje" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:572 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:264 +msgid "Certification" +msgstr "Certifikacija" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1181 -msgid "Sort type" -msgstr "Način razvrščanja" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:581 +msgid "Person or group that has certified this dashboard." +msgstr "Oseba ali skupina, ki je certificirala to nadzorno ploščo." -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:60 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:52 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1189 -msgid "Source" -msgstr "Izvor" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:592 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:281 +msgid "Any additional detail to show in the certification tooltip." +msgstr "Dodatne podrobnosti za prikaz v certifikacijskem orodju." -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:104 -#: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:43 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:33 -msgid "Source / Target" -msgstr "Izhodišče/Cilj" +#: superset-frontend/src/dashboard/components/PropertiesModal/index.tsx:612 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:336 +msgid "JSON metadata" +msgstr "JSON metapodatki" + +#: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:33 +msgid "" +"This dashboard is not published, it will not show up in the list of dashboards. " +"Click here to publish this dashboard." +msgstr "" +"Ta nadzorna plošča ni objavljena in se ne bo prikazala na seznamu nadzornih " +"plošč. Kliknite tukaj za njeno objavo." -#: superset-frontend/src/SqlLab/components/HighlightedSql/index.tsx:76 -msgid "Source SQL" -msgstr "Izvorni SQL" +#: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:38 +msgid "" +"This dashboard is not published which means it will not show up in the list of " +"dashboards. Favorite it to see it there or access it by using the URL directly." +msgstr "" +"Ta nadzorna plošča ni objavljena in se ne bo prikazala na seznamu nadzornih " +"plošč. Uvrstite jo med priljubljene, da jo boste videli tam, ali pa uporabite URL " +"za neposredni dostop." -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:73 -msgid "Source category" -msgstr "Kategorija izvora" +#: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:43 +msgid "This dashboard is published. Click to make it a draft." +msgstr "Ta nadzorna plošča je objavljena. Kliknite, da jo uvrstite med osnutke." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:804 -msgid "Spatial" -msgstr "Prostorski" +#: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:72 +#: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:83 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:304 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:507 +msgid "Draft" +msgstr "Osnutek" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:90 -msgid "Specific Date/Time" -msgstr "Fiksen Datum/Čas" +#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:48 +msgid "Annotation layers are still loading." +msgstr "Sloj z oznakami se še vedno nalaga." -#: superset/views/database/forms.py:127 superset/views/database/forms.py:286 -#: superset/views/database/forms.py:414 -msgid "Specify a schema (if database flavor supports this)." -msgstr "Podajte shemo (če vrsta podatkovne baze to podpira)" +#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:49 +msgid "One ore more annotation layers failed loading." +msgstr "Eden ali več slojev z oznakami se ni naložil." -#: superset/views/database/forms.py:172 superset/views/database/forms.py:325 -msgid "Specify duplicate columns as \"X.0, X.1\"." -msgstr "Določite podvojene stolpce kot \"X.0, X.1\"." +#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:102 +msgid "Emitted values" +msgstr "Oddane vrednosti" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:494 -msgid "" -"Specify the database version. This should be used with Presto in order to" -" enable query cost estimation." -msgstr "" -"Podajte verzijo podatkovne baze. Uporablja se s Presto, za potrebe " -"ocenjevanja potratnosti poizvedbe." +#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:115 +#, python-format +msgid "Click to edit %s in a new tab" +msgstr "Kliknite za urejanje %s v novem zavihku" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:230 -msgid "Split number" -msgstr "Število razdelitev" +#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:116 +msgid "Click to edit chart in a new tab" +msgstr "Kliknite za urejanje grafikona v novem zavihku" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:156 -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:117 -msgid "Stack series" -msgstr "Nalagaj serije" +#: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:183 +msgid "Click to clear emitted filters" +msgstr "S klikom počistite oddane filtre" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:159 -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:120 -msgid "Stack series on top of each other" -msgstr "Nalagaj serije eno na drugo" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:179 +msgid "Data refreshed" +msgstr "Podatki osveženi" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:37 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:51 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:40 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:47 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:84 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:83 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:68 -msgid "Stacked" -msgstr "Naložen" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:257 +#, python-format +msgid "Cached %s" +msgstr "Predpomnjeno %s" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:305 -msgid "Stacked Bars" -msgstr "Naloženi stolpci" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:260 +#, python-format +msgid "Fetched %s" +msgstr "Pridobljeno %s" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:52 -msgid "Stacked Style" -msgstr "Slog nalaganja" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:269 +#, python-format +msgid "Query %s: %s" +msgstr "Poizvedba %s: %s" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:37 -msgid "Stacked style" -msgstr "Naložen slog" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:288 +msgid "Force refresh" +msgstr "Osveži" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:88 -msgid "Standard time series" -msgstr "Standardna časovna vrsta" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:301 +msgid "Hide chart description" +msgstr "Skrij opis grafikona" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:155 -#: superset/views/annotations.py:79 -msgid "Start" -msgstr "Začetek" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:302 +msgid "Show chart description" +msgstr "Prikaži opis grafikona" -#: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:79 -msgid "Start Review" -msgstr "Začetek pregleda" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:311 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:356 +msgid "Edit chart" +msgstr "Uredi grafikon" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:110 -msgid "Start angle" -msgstr "Začetni kot" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:319 +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:321 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:357 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:359 +msgid "View query" +msgstr "Ogled poizvedbe" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:125 -msgid "Start at (UTC)" -msgstr "Zažene se ob (UTC)" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:337 +msgid "Drill to detail" +msgstr "Vrtaj v podrobnosti" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:66 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:117 -msgid "Start date included in time range" -msgstr "Začetni datum je vključen v časovno obdobje" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:340 +#, python-format +msgid "Chart Data: %s" +msgstr "Podatki grafikona: %s" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:109 -msgid "Start y-axis at 0" -msgstr "Začni y-os z 0" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:375 +msgid "Cross-filter scoping" +msgstr "Doseg medsebojnega filtra" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:112 -msgid "" -"Start y-axis at zero. Uncheck to start y-axis at minimum value in the " -"data." -msgstr "" -"Začni y-os z nič. Ne izberite, če želite, da se y-os začne z najmanjšo " -"vrednostjo podatkov." +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:387 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:308 +msgid "Share chart by email" +msgstr "Deli grafikon po e-pošti" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:94 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:348 -msgid "State" -msgstr "Status" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:389 +msgid "Check out this chart: " +msgstr "Preizkusite ta grafikon: " -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:30 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:55 -msgid "Statistical" -msgstr "Statistično" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:398 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:266 +msgid "Download" +msgstr "Prenos" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:399 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:302 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:492 -msgid "Status" -msgstr "Status" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:403 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:290 +msgid "Export to .CSV" +msgstr "Izvozi v .CSV" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:112 -msgid "Step type" -msgstr "Stopnični tip" +#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:414 +msgid "Export to full .CSV" +msgstr "Izvozi v celoten .CSV" -#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:49 -#: superset-frontend/src/explore/components/QueryAndSaveBtns.jsx:66 -msgid "Stop" -msgstr "Ustavi" +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:453 +msgid "Search..." +msgstr "Iskanje ..." -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:339 -msgid "Stop query" -msgstr "Ustavi poizvedbo" +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:484 +msgid "No filter is selected." +msgstr "Noben filter ni izbran." -#: superset-frontend/src/SqlLab/components/RunQueryActionButton/index.tsx:115 -msgid "Stop running (Ctrl + x)" -msgstr "Ustavi (Ctrl + x)" +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:485 +msgid "Editing 1 filter:" +msgstr "Urejanje enega filtra:" -#: superset/databases/commands/exceptions.py:126 -msgid "Stopped an unsafe database connection" -msgstr "Nevarna povezava s podatkovno bazo je bila ustavljena" +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:487 +#, python-format +msgid "Batch editing %d filters:" +msgstr "Skupinsko urejanje %d filtrov:" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:268 -msgid "Strength to pull the graph toward center" -msgstr "Sila privlačnosti med grafikonom in središčem" +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:501 +msgid "Configure filter scopes" +msgstr "Nastavi doseg filtrov" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:36 -msgid "Stretched style" -msgstr "Raztegnjen slog" +#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:508 +msgid "There are no filters in this dashboard." +msgstr "V nadzorni plošči ni filtrov." -#: superset/views/database/forms.py:273 -msgid "Strings used for sheet names (default is the first sheet)." -msgstr "" -"Znakovni nizi uporabljeni za imena preglednic (privzeto je prva " -"preglednica)." +#: superset-frontend/src/dashboard/components/filterscope/treeIcons.jsx:36 +msgid "Expand all" +msgstr "Razširi vse" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:45 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:45 -msgid "Structural" -msgstr "Strukturni" +#: superset-frontend/src/dashboard/components/filterscope/treeIcons.jsx:39 +msgid "Collapse all" +msgstr "Skrči vse" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:621 -msgid "Style" -msgstr "Slog" +#: superset-frontend/src/dashboard/components/gridComponents/Chart.jsx:293 +msgid "An error occurred while opening Explore" +msgstr "Pri odpiranju Raziskovalca je prišlo do napake" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:272 -msgid "Style the ends of the progress bar with a round cap" -msgstr "Zaobljena oblika koncev območja" +#: superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx:80 +msgid "This markdown component has an error." +msgstr "Markdown komponenta ima napako." -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:56 -msgid "Subdomain" -msgstr "Poddomena" +#: superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx:167 +msgid "This markdown component has an error. Please revert your recent changes." +msgstr "Markdown komponenta ima napako. Povrnite nedavne spremembe." -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:46 -msgid "Subheader" -msgstr "Podnaslov" +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:185 +msgid "You can" +msgstr "Lahko" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:62 -msgid "Subheader Font Size" -msgstr "Velikost pisave podnaslova" +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:191 +msgid "create a new chart" +msgstr "ustvarite nov grafikon" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:63 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:54 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:142 -msgid "Success" -msgstr "Uspelo" +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:193 +msgid "or use existing ones from the panel on the right" +msgstr "ali uporabite obstoječe iz panela na desni" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:62 -msgid "Suffix to apply after the percentage display" -msgstr "Pripona za prikaz procenta" +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:197 +msgid "You can add the components in the" +msgstr "Lahko dodate elemente v" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:98 -msgid "Sum of values over specified period" -msgstr "Vsota vrednosti v dani periodi" +#: superset-frontend/src/dashboard/components/gridComponents/Tab.jsx:203 +msgid "edit mode" +msgstr "načinu urejanja" -#: superset/viz.py:1856 -msgid "Sunburst" -msgstr "Sunburst" +#: superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:193 +msgid "Delete dashboard tab?" +msgstr "Ali izbrišem zavihek nadzorne plošče?" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:32 -msgid "Sunburst Chart" -msgstr "Večnivojski tortni grafikon" +#: superset-frontend/src/dashboard/components/gridComponents/new/NewDivider.jsx:31 +msgid "Divider" +msgstr "Ločilnik" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:56 -msgid "Sunday" -msgstr "Nedelja" +#: superset-frontend/src/dashboard/components/gridComponents/new/NewHeader.jsx:31 +msgid "Header" +msgstr "Glava" -#: superset-frontend/src/explore/components/ExploreActionButtons.tsx:121 -msgid "Superset Chart" -msgstr "Superset grafikon" +#: superset-frontend/src/dashboard/components/gridComponents/new/NewRow.jsx:31 +msgid "Row" +msgstr "Vrstica" -#: superset-frontend/src/components/AnchorLink/index.jsx:84 -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:318 -msgid "Superset chart" -msgstr "Superset grafikon" +#: superset-frontend/src/dashboard/components/gridComponents/new/NewTabs.jsx:31 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx:60 +msgid "Tabs" +msgstr "Zavihki" -#: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:218 -msgid "Superset dashboard" -msgstr "Superset nadzorna plošča" +#: superset-frontend/src/dashboard/components/menu/MarkdownModeDropdown.tsx:39 +msgid "Preview" +msgstr "Predogled" -#: superset/errors.py:105 -msgid "Superset encountered an error while running a command." -msgstr "Superset je naletel na napako pri izvajanju ukaza." +#: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:71 +#: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:84 +#: superset-frontend/src/explore/components/EmbedCodeContent.jsx:58 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:127 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:174 +msgid "Sorry, something went wrong. Try again later." +msgstr "Nekaj je šlo narobe. Poskusite ponovno kasneje." -#: superset/errors.py:106 -msgid "Superset encountered an unexpected error." -msgstr "Superset je naletel na nepričakovano napako." +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx:419 +#, python-format +msgid "All filters (%(filterCount)d)" +msgstr "Vsi filtri (%(filterCount)d)" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:670 -#, fuzzy -msgid "Supported databases" -msgstr "Uvozi podatkovne baze" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx:436 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx:476 +msgid "No filters are currently added" +msgstr "Trenutno ni dodanih filtrov" -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:34 -msgid "Survey Responses" -msgstr "Rezultati anket" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx:440 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx:480 +msgid "Click the button above to add a filter to the dashboard" +msgstr "S klikom gumba zgoraj dodate filter na nadzorno ploščo" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:112 -msgid "Swap Groups and Columns" -msgstr "Zamenjaj Skupine in Stolpce" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx:456 +#, python-format +msgid "Filter sets (%(filterSetCount)d)" +msgstr "Nastavljeni filtri (%(filterSetCount)d)" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:175 -msgid "Swap rows and columns" -msgstr "Zamenjaj vrstice in stolpce" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/index.tsx:115 +msgid "Apply filters" +msgstr "Uporabi filtre" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:59 -msgid "" -"Swiss army knife for visualizing time series data. Choose between step, " -"line, scatter, and bar charts. This viz type has many customization " -"options as well." -msgstr "" -"Univerzalni grafikon za prikaz časovnih vrst. Izbirajte med stopničnimi, " -"črtnimi, raztresenimi in stolpčnimi grafikoni. Grafikon ima širok nabor " -"prilagoditev." +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/ActionButtons/index.tsx:125 +msgid "Clear all" +msgstr "Počisti vse" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:210 -msgid "Symbol" -msgstr "Simbol" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx:152 +#, python-format +msgid "Filters out of scope (%d)" +msgstr "Filtri izven dosega (%d)" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:125 -msgid "Symbol of two ends of edge line" -msgstr "Simbol za konca povezave" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx:179 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:502 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:519 +msgid "Check configuration" +msgstr "Preveri nastavitve" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:255 -msgid "Symbol size" -msgstr "Velikost simbola" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx:257 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1170 +msgid "Cannot load filter" +msgstr "Filtra ni mogoče naložiti" + +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:118 +msgid "Editing filter set:" +msgstr "Urejanje seta filtrov:" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1223 -msgid "Sync columns from source" -msgstr "Sinhroniziraj stolpce z virom" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:142 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:83 +msgid "Filter set with this name already exists" +msgstr "Set filtrov z enakim imenom že obstaja" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:30 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:44 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:62 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:76 -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:89 -msgid "Syntax" -msgstr "Sintaksa" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:143 +msgid "Filter set already exists" +msgstr "Set filtrov že obstaja" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:250 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:305 -msgid "TABLES" -msgstr "TABELE" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:164 +#, python-format +msgid "This filter set is identical to: \"%s\"" +msgstr "Ta set filtrov je enak: \"%s\"" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:85 -msgid "THU" -msgstr "ČET" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:85 +msgid "Remove invalid filters" +msgstr "Odstrani neveljavne filtre" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:83 -msgid "TUE" -msgstr "TOR" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:86 +msgid "Rebuild" +msgstr "Obnovi" -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:218 -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:145 -msgid "Tab name" -msgstr "Naslov zavihka" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:88 +#, python-format +msgid "Filters (%d)" +msgstr "Filtri (%d)" -#: superset-frontend/src/dashboard/util/newComponentFactory.js:56 -#: superset-frontend/src/dashboard/util/newComponentFactory.js:57 -msgid "Tab title" -msgstr "Naslov zavihka" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:109 +msgid "This filter doesn't exist in dashboard. It will not be applied." +msgstr "Ta filter ne obstaja v nadzorni plošči in ne bo uveljavljen." -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:25 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:50 -#: superset-frontend/plugins/plugin-chart-table/src/index.ts:35 -#: superset-frontend/plugins/plugin-chart-table/src/index.ts:41 -#: superset-frontend/src/components/TableSelector/index.tsx:293 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:24 -#: superset/connectors/sqla/views.py:148 superset/connectors/sqla/views.py:260 -#: superset/connectors/sqla/views.py:488 superset/views/chart/mixin.py:87 -msgid "Table" -msgstr "Tabela" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:113 +msgid "Filter metadata changed in dashboard. It will not be applied." +msgstr "Metapodatki filtra so se spremenili v nadzorni plošči. Ne bo uveljavljen." -#: superset/views/core.py:1761 -#, python-format -msgid "Table %(table)s wasn't found in the database %(db)s" -msgstr "Tabela %(table)s ni bila najdena v podatkovni bazi %(db)s" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:81 +msgid "Please filter set name" +msgstr "Vnesite ime seta filtrov" -#: superset/views/database/forms.py:138 superset/views/database/forms.py:291 -#: superset/views/database/forms.py:419 -msgid "Table Exists" -msgstr "Tabela obstaja" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:96 +msgid "Create" +msgstr "Ustvari" -#: superset/connectors/sqla/views.py:498 superset/views/database/forms.py:95 -#: superset/views/database/forms.py:246 superset/views/database/forms.py:379 -msgid "Table Name" -msgstr "Ime tabele" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:111 +msgid "Create new filter set" +msgstr "Ustvarite nov set filtrov" -#: superset/viz.py:671 -msgid "Table View" -msgstr "Tabelarični pogled" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx:90 +msgid "New filter set" +msgstr "Nov set filtrov" -#: superset/datasets/commands/exceptions.py:130 -#, python-format -msgid "" -"Table [%(table_name)s] could not be found, please double check your " -"database connection, schema, and table name" -msgstr "" -"Tabele [%(table_name)s] ni mogoče najti. Preverite povezavo, shemo in ime" -" podatkovne baze" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils/index.ts:26 +msgid "Please apply filter changes" +msgstr "Potrdite spremembe filtra" -#: superset/views/base.py:251 -msgid "" -"Table [%{table}s] could not be found, please double check your database " -"connection, schema, and table name, error: {}" -msgstr "" -"Tabela [%{table}s] ni najdena. Preverite povezavo, shemo in ime tabele v " -"podatkovni bazi. Napaka: {}" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils/index.ts:43 +msgid "Unknown value" +msgstr "Neznana vrednost" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:257 -msgid "Table cache timeout" -msgstr "Trajanje predpomnilnika tabele" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx:104 +msgid "Add/Edit Filters" +msgstr "Dodaj/uredi filter" -#: superset/databases/decorators.py:46 -msgid "Table name undefined" -msgstr "Ime tabele ni definirano" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/DependenciesRow.tsx:86 +msgid "Dependent on" +msgstr "Odvisen od" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:26 -msgid "" -"Table that visualizes paired t-tests, which are used to understand " -"statistical differences between groups." -msgstr "" -"Tabela, ki prikazuje uparjene t-teste, ki se uporabljajo za prikaz " -"statističnih razlik med skupinami." +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/DependenciesRow.tsx:88 +msgid "Filter only displays values relevant to selections made in other filters." +msgstr "Filter prikazuje samo vrednosti vezane na izbire v drugih filtrih." -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:269 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:324 -#: superset/connectors/sqla/views.py:367 superset/connectors/sqla/views.py:395 -msgid "Tables" -msgstr "Tabele" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx:56 +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/useFilterScope.ts:70 +#: superset-frontend/src/dashboard/util/getFilterScopeNodesTree.js:85 +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:126 +msgid "All charts" +msgstr "Vsi grafikoni" -#: superset-frontend/src/dashboard/components/gridComponents/new/NewTabs.jsx:31 -msgid "Tabs" -msgstr "Zavihki" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/ScopeRow.tsx:68 +msgid "Scope" +msgstr "Doseg" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:30 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 -#: superset-frontend/plugins/plugin-chart-table/src/index.ts:50 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:34 -msgid "Tabular" -msgstr "Tabelarično" +#: superset-frontend/src/dashboard/components/nativeFilters/FilterCard/TypeRow.tsx:31 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:760 +msgid "Filter type" +msgstr "Tip filtra" -#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:607 -msgid "Tags" -msgstr "Značke" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:44 +msgid "Title is required" +msgstr "Naslov je obvezen" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:29 -msgid "" -"Take your data points, and group them into \"bins\" to see where the " -"densest areas of information lie" -msgstr "" -"Vzame podatkovne točke in jih razporedi v razdelke, kjer se vidi območja " -"z največjo gostoto informacij" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitleContainer.tsx:115 +msgid "(Removed)" +msgstr "(Odstranjeno)" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:62 -msgid "Target" -msgstr "Cilj" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitleContainer.tsx:131 +msgid "Undo?" +msgstr "Povrni?" -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:67 -msgid "Target aspect ratio for treemap tiles." -msgstr "Ciljno razmerje za razdelke drevesnega grafikona." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitlePane.tsx:109 +msgid "Add filters and dividers" +msgstr "Dodaj filtre in ločilnike" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:86 -msgid "Target category" -msgstr "Kategorija cilja" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx:245 +msgid "[untitled]" +msgstr "[neimenovana]" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:176 -msgid "Target value" -msgstr "Ciljna vrednost" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx:416 +msgid "Cyclic dependency detected" +msgstr "Zaznana krožna odvisnost" -#: superset/views/css_templates.py:44 -msgid "Template Name" -msgstr "Ime predloge" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx:500 +msgid "Add and edit filters" +msgstr "Dodaj in uredi filtre" -#: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:94 -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:788 -#: superset/connectors/sqla/views.py:504 -msgid "Template parameters" -msgstr "Parametri predlog" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:129 +msgid "Column select" +msgstr "Izbira stolpca" -#: superset-frontend/src/explore/controlPanels/TimeTable.js:52 -msgid "" -"Templated link, it's possible to include {{ metric }} or other values " -"coming from the controls." -msgstr "" -"Vzorčna povezava, vključiti je mogoče {{ metric }} ali drugo vrednost iz " -"kontrolnikov." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:132 +msgid "Select a column" +msgstr "Izberite stolpec" -#: superset/models/sql_types/base.py:54 -#, python-format -msgid "Temporal expression not supported for type: %(col_type)s" -msgstr "Časovni izraz ni podprt za podatkovne tipe: %(col_type)s" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:133 +msgid "No compatible columns found" +msgstr "Ni najdenih skladnih stolpcev" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:307 -msgid "" -"Terminate running queries when browser window closed or navigated to " -"another page. Available for Presto, Hive, MySQL, Postgres and Snowflake " -"databases." -msgstr "" -"Ustavi zagnane poizvedbe, ko se zapre okno brskalnika ali gre na drugo " -"stran. na razpolago za Presto, Hive, MySQL, Postgres in Snowflake " -"podatkovne baze." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx:75 +msgid "Value is required" +msgstr "Zahtevana je vrednost" -#: superset/templates/superset/models/database/macros.html:22 -msgid "Test Connection" -msgstr "Preizkusi povezavo" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:92 +msgid "(deleted or invalid type)" +msgstr "(izbrisan ali neveljaven tip)" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:95 -msgid "Test connection" -msgstr "Preizkus povezave" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:98 +msgid "Limit type" +msgstr "Tip omejitve" -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:35 -msgid "Text" -msgstr "Besedilo" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:148 +msgid "No available filters." +msgstr "Ni razpoložljivih filtrov." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:105 -msgid "Text align" -msgstr "Poravnava besedila" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:167 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterControl/index.jsx:367 +msgid "Add filter" +msgstr "Dodaj filter" -#: superset-frontend/src/components/ReportModal/index.tsx:289 -msgid "Text embedded in email" -msgstr "Besedilo vključeno v e-pošto" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:194 +msgid "Values are dependent on other filters" +msgstr "Vrednosti so odvisne od drugih filtrov" -#: superset/views/dashboard/mixin.py:53 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:197 msgid "" -"The CSS for individual dashboards can be altered here, or in the " -"dashboard view where changes are immediately visible" -msgstr "" -"CSS za posamezne nadzorne plošče lahko spreminjamo tukaj ali pa v pogledu" -" nadzorne plošče, kjer so spremembe vidne takoj" +"Values selected in other filters will affect the filter options to only show " +"relevant values" +msgstr "Vrednosti izbrane v drugih filtrih bodo vplivale na možnosti filtra" -#: superset/errors.py:118 -msgid "" -"The CTAS (create table as select) doesn't have a SELECT statement at the " -"end. Please make sure your query has a SELECT as its last statement. " -"Then, try running your query again." -msgstr "" -"CTAS (create table as select) na koncu nima SELECT stavka. Poskrbite, da " -"bo v poizvedbi SELECT zadnji stavek. Potem ponovno poženite poizvedbo." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DependencyList.tsx:201 +msgid "Values dependent on" +msgstr "Vrednosti so odvisne od" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:921 -msgid "The JSON metric or post aggregation definition." -msgstr "JSON mera ali po-agregacijska definicija." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:268 +msgid "Scoping" +msgstr "Doseg" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:126 -msgid "" -"The URL could not be identified. Please check for typos and make sure " -"that \"Type of google sheet allowed\" selection matches the input" -msgstr "" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:275 +msgid "Filter Configuration" +msgstr "Nastavitve filtra" -#: superset/views/core.py:354 -msgid "The access requests seem to have been deleted" -msgstr "Zdi se, da je bila zahteva za dostop izbrisana" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:279 +msgid "Filter Settings" +msgstr "Nastavitve filtra" -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:168 -msgid "The annotation has been saved" -msgstr "Označba je bila shranjena" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:302 +#: superset-frontend/src/filters/components/Select/index.ts:28 +msgid "Select filter" +msgstr "Izbirni filter" -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:152 -msgid "The annotation has been updated" -msgstr "Označba je bila posodobljena" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:302 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1203 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1224 +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:143 +msgid "Value" +msgstr "Vrednost" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:74 -msgid "" -"The category of source nodes used to assign colors. If a node is " -"associated with more than one category, only the first will be used." -msgstr "" -"Kategorija izvornih vozlišč, na podlagi katere je določena barva. Če je " -"vozlišče povezano z več kot eno kategorijo, bo uporabljena samo prva." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:303 +#: superset-frontend/src/filters/components/Range/index.ts:28 +msgid "Range filter" +msgstr "Filter obdobja" -#: superset/common/query_context_processor.py:449 -msgid "The chart does not exist" -msgstr "Grafikon ne obstaja" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:303 +msgid "Numerical range" +msgstr "Številski obseg" -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:54 -#, fuzzy -msgid "" -"The classic. Great for showing how much of a company each investor gets, " -"what demographics follow your blog, or what portion of the budget goes to" -" the military industrial complex.\n" -"\n" -" Pie charts can be difficult to interpret precisely. If clarity of" -" relative proportion is important, consider using a bar or other chart " -"type instead." -msgstr "" -"Standardni grafikon za prikaz deležev. Tortne grafikone je težje natančno" -" interpretirati, takrat lahko uporabite npr. stolpčni grafikon." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:304 +#: superset-frontend/src/filters/components/Time/index.ts:27 +msgid "Time filter" +msgstr "Časovni filter" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:261 -msgid "The color for points and clusters in RGB" -msgstr "Barva točk in gruč v RGB zapisu" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:304 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:925 +#: superset-frontend/src/explore/constants.ts:119 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:382 +msgid "Time range" +msgstr "Časovno obdobje" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:478 -#: superset-frontend/src/explore/controls.jsx:484 -msgid "The color scheme for rendering chart" -msgstr "Barvna shema za izris grafikona" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:305 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:951 +#: superset-frontend/src/explore/constants.ts:120 +#: superset-frontend/src/filters/components/TimeColumn/index.ts:28 +msgid "Time column" +msgstr "Časovni stolpec" -#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:66 -msgid "" -"The color scheme is determined by the related dashboard.\n" -" Edit the color scheme in the dashboard properties." -msgstr "" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:306 +#: superset-frontend/src/explore/constants.ts:121 +#: superset-frontend/src/filters/components/TimeGrain/index.ts:28 +msgid "Time grain" +msgstr "Granulacija časa" -#: superset/errors.py:99 -msgid "The column was deleted or renamed in the database." -msgstr "Stolpec je bil izbrisan ali preimenovan v podatkovni bazi." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:307 +#: superset-frontend/src/filters/components/GroupBy/index.ts:28 +msgid "Group By" +msgstr "Združevanje (Group by)" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:47 -msgid "" -"The country code standard that Superset should expect to find in the " -"[country] column" -msgstr "Standard za oznake držav, ki bodo podane v stolpcu z državami" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:307 +msgid "Group by" +msgstr "Združevanje (Group by)" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:327 -msgid "The dashboard has been saved" -msgstr "Nadzorna plošča je bila shranjena" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:638 +msgid "Pre-filter is required" +msgstr "Zahtevan je predfilter" -#: superset/views/core.py:182 -msgid "The data source seems to have been deleted" -msgstr "Zdi se, da je bil podatkovni vir izbrisan" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:746 +msgid "Filter name" +msgstr "Ime filtra" -#: superset/connectors/sqla/views.py:103 -msgid "" -"The data type that was inferred by the database. It may be necessary to " -"input a type manually for expression-defined columns in some cases. In " -"most case users should not need to alter this." -msgstr "" -"Podatkovni tip, ki izvira iz podatkovne baze. V nekaterih primerih je " -"potrebno ročno vnesti tip za stolpce, ki temeljijo na izrazih. V večini " -"primerov uporabniku tega ni potrebno spreminjati." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:748 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:754 +msgid "Name is required" +msgstr "Zahtevano je ime" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:756 +msgid "Filter Type" +msgstr "Tip filtra" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:778 +msgid "Datasets do not contain a temporal column" +msgstr "Podatkovni seti ne vsebujejo časovnega stolpca" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:439 -#, python-format -msgid "" -"The database %s is linked to %s charts that appear on %s dashboards and " -"users have %s SQL Lab tabs using this database open. Are you sure you " -"want to continue? Deleting the database will break those objects." -msgstr "" -"Podatkovna baza %s je povezana z grafikoni %s, ki so prisotni na nadzorni" -" plošči %s in uporabniki imajo odprtih %s zavihkov SQL laboratorija. Ali " -"želite nadaljevati? Izbris podatkovne baze bo pokvaril te objekte." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:812 +msgid "Dataset is required" +msgstr "Zahtevan je podatkovni set" -#: superset/errors.py:126 -msgid "The database is currently running too many queries." -msgstr "Podatkovna baza trenutno izvaja preveč poizvedb." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:881 +msgid "Pre-filter available values" +msgstr "Predfiltriraj razpoložljive vrednosti" -#: superset/errors.py:93 -msgid "The database is under an unusual load." -msgstr "Podatkovni vir je neobičajno obremenjen." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:916 +msgid "Pre-filter" +msgstr "Predfilter" -#: superset/sqllab/command.py:149 +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:954 msgid "" -"The database referenced in this query was not found. Please contact an " -"administrator for further assistance or try again." +"Optional time column if time range should apply to another column than the " +"default time column" msgstr "" -"Podatkovna baza, referencirana v tej poizvedbi, ni bila najdena. " -"Kontaktirajte administratorja za napotke ali pa poskusite znova." +"Izbirni časovni stolpec se mora nanašati na drug stolpec kot privzeti časovni " +"stolpec" -#: superset/errors.py:94 -msgid "The database returned an unexpected error." -msgstr "Podatkovna baza je vrnila nepričakovano napako." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:986 +msgid "Sort filter values" +msgstr "Razvrsti vrednosti filtra" -#: superset/errors.py:138 -msgid "The database was deleted." -msgstr "Podatkovna baza je bila izbrisana." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1000 +msgid "Sort type" +msgstr "Način razvrščanja" -#: superset/views/core.py:2085 superset/views/core.py:2155 -msgid "The database was not found." -msgstr "Podatkovna baza ni bila najdena." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1007 +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:205 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:66 +msgid "Sort ascending" +msgstr "Razvrsti naraščajoče" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:592 -#, python-format -msgid "" -"The dataset %s is linked to %s charts that appear on %s dashboards. Are " -"you sure you want to continue? Deleting the dataset will break those " -"objects." -msgstr "" -"Podatkovni set %s je povezan z grafikoni %s, ki so prisotni na nadzorni " -"plošči %s. Ali želite nadaljevati? Izbris podatkovnega seta bo pokvaril " -"te objekte." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1017 +msgid "Sort Metric" +msgstr "Mera za razvrščanje" -#: superset-frontend/src/chart/Chart.jsx:73 superset/views/utils.py:268 -msgid "The dataset associated with this chart no longer exists" -msgstr "Podatkovni set, povezan s tem grafikonom, ne obstaja več" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1020 +msgid "If a metric is specified, sorting will be done based on the metric value" +msgstr "Če je določena mera, bo razvrščanje izvedeno na podlagi vrednosti mere" -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:167 -#, fuzzy -msgid "" -"The dataset configuration exposed here\n" -" affects all the charts using this dataset.\n" -" Be mindful that changing settings\n" -" here may affect other charts\n" -" in undesirable ways." -msgstr "" -"Tukaj prikazane nastavitve podatkovnega seta\r\n" -" vplivajo na vse grafikone, ki uporabljajo\r\n" -" ta podatkovni set. Spreminjanje\r\n" -" nastavitev lahko nezaželeno vpliva\r\n" -" na druge grafikone." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1030 +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:184 +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:188 +msgid "Sort metric" +msgstr "Mera za razvrščanje" -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:128 -#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:109 -msgid "The dataset has been saved" -msgstr "Podatkovni set je shranjen" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1053 +msgid "Single Value" +msgstr "Ena vrednost" -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:256 -msgid "The dataset linked to this chart may have been deleted." -msgstr "Podatkovni set, povezan s tem grafikonom, je bil izbrisan." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1070 +msgid "Single value type" +msgstr "Tip z eno vrednostjo" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:1283 -msgid "The datasource couldn't be loaded" -msgstr "Podatkovnega vira ni mogoče naložiti" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1079 +msgid "Minimum" +msgstr "Minimum" -#: superset/errors.py:92 -msgid "The datasource is too large to query." -msgstr "Podatkovni vir je prevelik za poizvedbo." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1082 +msgid "Exact" +msgstr "Natančno" -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:247 -msgid "" -"The description can be displayed as widget headers in the dashboard view." -" Supports markdown." -msgstr "" -"Opis je lahko prikazan kot glava gradnika in pogledu nadzorne plošče. " -"Podpira markdown." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1085 +msgid "Maximum" +msgstr "Maksimum" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:104 -msgid "The distance between cells, in pixels" -msgstr "Razdalja med celicami v pikslih" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1116 +msgid "Filter has default value" +msgstr "Filter ima privzeto vrednost" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:772 -msgid "The duration of time in seconds before the cache is invalidated" -msgstr "Trajanje (v sekundah) do razveljavitve predpomnilnika" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1133 +msgid "Default Value" +msgstr "Privzeta vrednost" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:474 -msgid "" -"The engine_params object gets unpacked into the sqlalchemy.create_engine " -"call." -msgstr "Objekt engine_params se razširi v klic sqlalchemy.create_engine." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1162 +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:223 +msgid "Default value is required" +msgstr "Zahtevana je privzeta vrednost" -#: superset/common/query_object.py:295 -#, python-format -msgid "" -"The following entries in `series_columns` are missing in `columns`: " -"%(columns)s. " -msgstr "V 'columns' manjkajo naslednji vnosi iz 'series_columns': %(columns)s. " +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1202 +msgid "Refresh the default values" +msgstr "Osveži privzete vrednosti" -#: superset/connectors/sqla/views.py:612 -#, python-format -msgid "The following tables added new columns: %(tables)s" -msgstr "Nove stolpce so dodale naslednje tabele: %(tables)s" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1208 +msgid "Fill all required fields to enable \"Default Value\"" +msgstr "Izpolnite vsa polja, da omogočite \"Privzeto vrednost\"" -#: superset/connectors/sqla/views.py:623 -#, python-format -msgid "The following tables removed columns: %(tables)s" -msgstr "Stolpce so odstranile naslednje tabele: %(tables)s" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/RemovedFilter.tsx:39 +msgid "You have removed this filter." +msgstr "Odstranili ste ta filter." -#: superset/connectors/sqla/views.py:634 -#, python-format -msgid "The following tables update column metadata: %(tables)s" -msgstr "Metapodatke stolpcev so posodobile naslednje tabele: %(tables)s" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/RemovedFilter.tsx:46 +msgid "Restore Filter" +msgstr "Povrni filter" -#: superset/db_engine_specs/mysql.py:134 -#, python-format -msgid "The host \"%(hostname)s\" might be down and can't be reached." -msgstr "Gostitelj \"%(hostname)s\" mogoče ne deluje in ga ni mogoče doseči." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:118 +msgid "Column is required" +msgstr "Zahtevan je stolpec" -#: superset/db_engine_specs/mssql.py:92 -#: superset/db_engine_specs/postgres.py:137 -#: superset/db_engine_specs/presto.py:205 -#: superset/db_engine_specs/redshift.py:78 -#, python-format +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:173 +msgid "Populate \"Default value\" to enable this control" +msgstr "Izpolnite \"Privzeto vrednost\", da omogočite ta kontrolnik" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:88 msgid "" -"The host \"%(hostname)s\" might be down, and can't be reached on port " -"%(port)s." +"Default value set automatically when \"Select first filter value by default\" is " +"checked" msgstr "" -"Gostitelj \"%(hostname)s\" mogoče ne deluje in ga ni mogoče doseči na " -"vratih %(port)s." +"Privzeta vrednost je samodejno izbrana, če je izbrano \"Prvi element je izbran " +"kot privzet\"" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:98 -msgid "The host is invalid. Please verify that this field is entered correctly." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:92 +msgid "Default value must be set when \"Filter value is required\" is checked" msgstr "" +"Privzeta vrednost mora biti določena, če je izbrano \"Vrednost filtra obvezna\"" -#: superset/errors.py:104 -msgid "The host might be down, and can't be reached on the provided port." -msgstr "Gostitelj mogoče ne deluje in ga ni mogoče doseči preko podanih vrat." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:96 +msgid "Default value must be set when \"Filter has default value\" is checked" +msgstr "" +"Privzeta vrednost mora biti določena, če je izbrano \"Filter ima privzeto vrednost" +"\"" -#: superset/db_engine_specs/mssql.py:82 -#: superset/db_engine_specs/postgres.py:127 -#: superset/db_engine_specs/presto.py:200 -#: superset/db_engine_specs/redshift.py:68 -#, python-format -msgid "The hostname \"%(hostname)s\" cannot be resolved." -msgstr "Imena gostitelja \"%(hostname)s\" ni mogoče razrešiti." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:122 +msgid "Apply to all panels" +msgstr "Uporabi za vse panele" -#: superset/errors.py:102 -msgid "The hostname provided can't be resolved." -msgstr "Imena gostitelja ni mogoče razrešiti." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:124 +msgid "Apply to specific panels" +msgstr "Uporabi za določene panele" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:60 -#: superset-frontend/src/explore/controlPanels/sections.tsx:44 -msgid "The id of the active chart" -msgstr "Identifikator aktivnega grafikona" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:130 +msgid "Only selected panels will be affected by this filter" +msgstr "Ta filter bo vplival le na izbrane panele" -#: superset-frontend/src/components/ImportModal/index.tsx:187 -msgid "The import was successful" -msgstr "Uvoz je uspel" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:131 +msgid "All panels with this column will be affected by this filter" +msgstr "Ta filter bo vplival na vse panele s tem stolpcem" -#: superset/connectors/druid/views.py:303 superset/connectors/sqla/views.py:429 -msgid "" -"The list of charts associated with this table. By altering this " -"datasource, you may change how these associated charts behave. Also note " -"that charts need to point to a datasource, so this form will fail at " -"saving if removing charts from a datasource. If you want to change the " -"datasource for a chart, overwrite the chart from the 'explore view'" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/state.ts:49 +msgid "All panels" +msgstr "Vsi paneli" + +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.ts:55 +msgid "This chart might be incompatible with the filter (datasets don't match)" msgstr "" -"Seznam grafikonov, povezanih s to tabelo. S spreminjanjem podatkovnega " -"vira lahko spremenite, kako se povezani grafikoni obnašajo. Poleg tega " -"morajo biti grafikoni povezani s podatkovnim virom. Če odstranite " -"grafikon s podatkovnega vira ne bo mogoče shraniti tega vnosa. Če želite " -"spremeniti podatkovni vir grafikona, prepišite grafikon v raziskovalnem " -"pogledu." +"Ta grafikon je lahko nekompatibilen s filtrom (podatkovni seti se ne ujemajo)" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:130 -msgid "The maximum number of events to return, equivalent to the number of rows" -msgstr "Največje število dogodkov, ki bodo vrnjeni - enako številu vrstic" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/CancelConfirmationAlert.tsx:56 +msgid "Keep editing" +msgstr "Nadaljuj z urejanjem" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:179 -msgid "" -"The maximum number of subdivisions of each group; lower values are pruned" -" first" -msgstr "" -"Največje število podrazdelkov posamezne skupine; nižje vrednosti so " -"zanemarjene prve" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/CancelConfirmationAlert.tsx:64 +msgid "Yes, cancel" +msgstr "Da, prekini" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:49 -msgid "The maximum value of metrics. It is an optional configuration" -msgstr "Največja vrednost mere. To je opcijska nastavitev" +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:45 +msgid "There are unsaved changes." +msgstr "Imate neshranjene spremembe." -#: superset/databases/schemas.py:206 -#, python-format -msgid "" -"The metadata_params in Extra field is not configured correctly. The key " -"%(key)s is invalid." -msgstr "" -"Metadata_params v polju Dodatno niso pravilno nastavljeni. Ključ %(key)s " -"je neveljaven." +#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:49 +msgid "Are you sure you want to cancel?" +msgstr "Ali želite prekiniti?" -#: superset/databases/commands/exceptions.py:79 -#: superset/views/database/mixins.py:252 -msgid "" -"The metadata_params in Extra field is not configured correctly. The key " -"%{key}s is invalid." +#: superset-frontend/src/dashboard/containers/DashboardPage.tsx:257 +msgid "Error loading chart datasources. Filters may not work correctly." msgstr "" -"Metadata_params v polju Dodatno niso pravilno nastavljeni. Ključ %{key}s " -"je neveljaven." +"Napaka pri nalaganju podatkovnih virov grafikona. Filtri lahko ne delujejo " +"pravilno." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:452 -msgid "" -"The metadata_params object gets unpacked into the sqlalchemy.MetaData " -"call." -msgstr "Objekt metadata_params se razpakira v klic sqlalchemy.MetaData." +#: superset-frontend/src/dashboard/util/backgroundStyleOptions.ts:25 +msgid "Transparent" +msgstr "Prozorno" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:75 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:292 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:175 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:195 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:426 -#: superset-frontend/src/explore/controlPanels/sections.tsx:191 -msgid "" -"The minimum number of rolling periods required to show a value. For " -"instance if you do a cumulative sum on 7 days you may want your \"Min " -"Period\" to be 7, so that all data points shown are the total of 7 " -"periods. This will hide the \"ramp up\" taking place over the first 7 " -"periods" -msgstr "" -"Minimalno število drsečih obdobij, potrebnih za prikaz vrednosti. Če " -"računate kumulativno vsoto 7-dnevnega obdobja, boste nastavili \"Min. št." -" period\" na 7. Tako bodo vse prikazane točke skupaj obsegale 7 obdobij. " -"To bo prikrilo rampo, ki bi trajala prvih 7 obdobij" +#: superset-frontend/src/dashboard/util/backgroundStyleOptions.ts:30 +msgid "White" +msgstr "Belo" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:130 -msgid "The number color \"steps\"" -msgstr "Število barvnih korakov" +#: superset-frontend/src/dashboard/util/getFilterFieldNodesTree.js:44 +msgid "All filters" +msgstr "Vsi filtri" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:781 -msgid "" -"The number of hours, negative or positive, to shift the time column. This" -" can be used to move UTC time to local time." -msgstr "" -"Število ur, negativno ali pozitivno, za zamik časovnega stolpca. Na ta " -"način je mogoče UTC čas prestaviti na lokalni čas." +#: superset-frontend/src/dashboard/util/headerStyleOptions.ts:30 +msgid "Medium" +msgstr "Srednje" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:583 -#, python-format -msgid "" -"The number of results displayed is limited to %(rows)d by the " -"configuration DISPLAY_MAX_ROWS. Please add additional limits/filters or " -"download to csv to see more rows up to the %(limit)d limit." -msgstr "" +#: superset-frontend/src/dashboard/util/newComponentFactory.js:58 +#: superset-frontend/src/dashboard/util/newComponentFactory.js:59 +msgid "Tab title" +msgstr "Naslov zavihka" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:589 -#, python-format +#: superset-frontend/src/embedded/index.tsx:107 msgid "" -"The number of results displayed is limited to %(rows)d. Please add " -"additional limits/filters, download to csv, or contact an admin to see " -"more rows up to the %(limit)d limit." +"This session has encountered an interruption, and some controls may not work as " +"intended. If you are the developer of this app, please check that the guest token " +"is being generated correctly." msgstr "" +"Ta seja je bila prekinjena in nekateri kontrolniki mogoče ne delujejo kot bi " +"morali. Če ste razvijalec te aplikacije, preverite, da je žeton za gosta pravilno " +"generiran." -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:615 -#, python-format -msgid "The number of rows displayed is limited to %(rows)d by the limit dropdown." -msgstr "Število prikazanih rezultatov je omejeno na %(rows)d s poizvedbo." +#: superset-frontend/src/explore/constants.ts:123 +msgid "Time granularity" +msgstr "Granulacija časa" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:603 -#, python-format -msgid "The number of rows displayed is limited to %(rows)d by the query" -msgstr "Število prikazanih vrstic je omejeno na %(rows)d s poizvedbo" +#: superset-frontend/src/explore/controlPanels/sections.tsx:32 +#: superset-frontend/src/explore/controls.jsx:200 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:298 +msgid "Visualization type" +msgstr "Tip vizualizacije" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:624 -#, python-format +#: superset-frontend/src/explore/controls.jsx:206 +msgid "Fixed color" +msgstr "Izbrana barva" + +#: superset-frontend/src/explore/controls.jsx:215 +msgid "Right axis metric" +msgstr "Mera desne osi" + +#: superset-frontend/src/explore/controls.jsx:222 +msgid "Linear color scheme" +msgstr "Linearna barvna shema" + +#: superset-frontend/src/explore/controls.jsx:235 +msgid "Color metric" +msgstr "P" + +#: superset-frontend/src/explore/controls.jsx:246 +msgid "One or many controls to pivot as columns" +msgstr "En ali več kontrolnikov za stolpčno vrtenje" + +#: superset-frontend/src/explore/controls.jsx:431 +msgid "Bubble size" +msgstr "Velikost mehurčka" + +#: superset-frontend/src/explore/controls.jsx:450 msgid "" -"The number of rows displayed is limited to %(rows)d by the query and " -"limit dropdown." +"When `Calculation type` is set to \"Percentage change\", the Y Axis Format is " +"forced to `.1%`" msgstr "" -"Število prikazanih vrstic je omejeno na %(rows)d s poizvedbo in spustnim " -"izbirnikom omejitev." +"Če je `Vrsta izračuna` nastavljena na \"Procentualna sprememba\", bo oblika Y-osi " +"vsiljena na `.1%`" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:644 -#, python-format -msgid "The number of rows displayed is limited to %s by the dropdown." -msgstr "Število prikazanih vrstic je omejeno na %s s spustnim izbirnikom." +#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:50 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:214 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:218 +#: superset-frontend/src/explore/controlPanels/sections.tsx:70 +#: superset-frontend/src/explore/controls.jsx:476 +msgid "Color scheme" +msgstr "Barvna shema" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:69 -#: superset-frontend/src/explore/controlPanels/sections.tsx:53 -msgid "The number of seconds before expiring the cache" -msgstr "Trajanje (v sekundah) do razveljavitve predpomnilnika" +#: superset-frontend/src/explore/actions/exploreActions.ts:95 +msgid "An error occurred while starring this chart" +msgstr "Pri ocenjevanju grafikona je prišlo do napake" -#: superset/errors.py:128 -msgid "The object does not exist in the given database." -msgstr "Objekt ne obstaja v podani podatkovni bazi." +#: superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx:38 +msgid "GROUP BY" +msgstr "GROUP BY" -#: superset/sqllab/query_render.py:97 -#, python-format -msgid "The parameter %(parameters)s in your query is undefined." -msgid_plural "The following parameters in your query are undefined: %(parameters)s." -msgstr[0] "V vaši poizvedbi ni definiranih naslednjih parametrov: %(parameters)s." -msgstr[1] "V vaši poizvedbi ni definiranih naslednjih parametrov: %(parameters)s." -msgstr[2] "V vaši poizvedbi ni definiranih naslednjih parametrov: %(parameters)s." -msgstr[3] "V vaši poizvedbi ni definiranih naslednjih parametrov: %(parameters)s." +#: superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx:39 +msgid "Use this section if you want a query that aggregates" +msgstr "Ta sklop uporabite če želite poizvedbo za agregacijo" -#: superset/db_engine_specs/postgres.py:117 -#, python-format -msgid "The password provided for username \"%(username)s\" is incorrect." -msgstr "Geslo za uporabniško ime \"%(username)s\" je napačno." +#: superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx:52 +msgid "NOT GROUPED BY" +msgstr "NOT GROUPED BY" -#: superset/errors.py:108 -msgid "The password provided when connecting to a database is not valid." -msgstr "Geslo za povezavo s podatkovno bazo je neveljavno." +#: superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx:53 +msgid "Use this section if you want to query atomic rows" +msgstr "Ta sklop uporabite, če želite poizvedbo za posamezne vrstice" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:65 -msgid "" -"The passwords for the databases below are needed in order to import them " -"together with the charts. Please note that the \"Secure Extra\" and " -"\"Certificate\" sections of the database configuration are not present in" -" export files, and should be added manually after the import if they are " -"needed." -msgstr "" -"Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj z grafikoni. " -"Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne " -"baze nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno" -" po uvozu, če je to potrebno." +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:465 +msgid "Keep control settings?" +msgstr "Obdržim nastavitve kontrolnika?" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:57 +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:466 msgid "" -"The passwords for the databases below are needed in order to import them " -"together with the dashboards. Please note that the \"Secure Extra\" and " -"\"Certificate\" sections of the database configuration are not present in" -" export files, and should be added manually after the import if they are " -"needed." +"You've changed datasets. Any controls with data (columns, metrics) that match " +"this new dataset have been retained." msgstr "" -"Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj z nadzornimi " -"ploščami. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah " -"podatkovne baze nista prisotni v izvoženih datotekah in jih je potrebno " -"dodati ročno po uvozu, če je to potrebno." +"Spremenili ste podatkovne sete. Vsi kontrolniki nad podatki (stolpci, mere), ki " +"se ujemajo z novim podatkovnim setom, se bodo ohranili." -#: superset-frontend/src/views/CRUD/data/dataset/constants.ts:23 -msgid "" -"The passwords for the databases below are needed in order to import them " -"together with the datasets. Please note that the \"Secure Extra\" and " -"\"Certificate\" sections of the database configuration are not present in" -" export files, and should be added manually after the import if they are " -"needed." -msgstr "" -"Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj s " -"podatkovnimi seti. Sekciji \"Dodatna varnost\" in \"Certifikati\" v " -"nastavitvah podatkovne baze nista prisotni v izvoženih datotekah in jih " -"je potrebno dodati ročno po uvozu, če je to potrebno." +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:471 +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:482 +msgid "Continue" +msgstr "Nadaljuj" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:56 -msgid "" -"The passwords for the databases below are needed in order to import them " -"together with the saved queries. Please note that the \"Secure Extra\" " -"and \"Certificate\" sections of the database configuration are not " -"present in export files, and should be added manually after the import if" -" they are needed." -msgstr "" -"Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj s shranjenimi" -" poizvedbami. Sekciji \"Dodatna varnost\" in \"Certifikati\" v " -"nastavitvah podatkovne baze nista prisotni v izvoženih datotekah in jih " -"je potrebno dodati ročno po uvozu, če je to potrebno." +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:472 +msgid "Clear form" +msgstr "Počisti polja" + +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:477 +msgid "No form settings were maintained" +msgstr "Nastavitve forme se niso ohranile" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:39 +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:478 msgid "" -"The passwords for the databases below are needed in order to import them." -" Please note that the \"Secure Extra\" and \"Certificate\" sections of " -"the database configuration are not present in export files, and should be" -" added manually after the import if they are needed." -msgstr "" -"Gesla za spodnje podatkovne baze so potrebna za njihov uvoz. Sekciji " -"\"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze " -"nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po " -"uvozu, če je to potrebno." +"We were unable to carry over any controls when switching to this new dataset." +msgstr "Prenos kontrolnikov pri preklopu na nov podatkovni set ni bil uspešen." -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:231 -msgid "The pattern of timestamp format. For strings use " -msgstr "Vzorec zapisa časovne značke. Za znakovne nize uporabite " +#: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:544 +msgid "Customize" +msgstr "Prilagodi" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:65 -#, fuzzy -msgid "" -"The periodicity over which to pivot time. Users can provide\n" -" \"Pandas\" offset alias.\n" -" Click on the info bubble for more details on accepted " -"\"freq\" expressions." -msgstr "" -"Periodičnost za vrtenje časa. Uporabnik lahko poda\n" -" psevdonim za zamik v \"Pandas\".\n" -" Kliknite na mehurček za podrobnosti dovoljenih izrazov za " -"\"freq\"." +#: superset-frontend/src/explore/components/EmbedCodeContent.jsx:57 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:55 +msgid "Error" +msgstr "Napaka" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:118 -msgid "The pixel radius" -msgstr "Polmer piksla" +#: superset-frontend/src/explore/components/EmbedCodeContent.jsx:82 +msgid "Generating link, please wait.." +msgstr "Ustvarjam povezavo, prosim počakajte..." + +#: superset-frontend/src/explore/components/EmbedCodeContent.jsx:130 +msgid "Chart height" +msgstr "Višina grafikona" + +#: superset-frontend/src/explore/components/EmbedCodeContent.jsx:139 +msgid "Chart width" +msgstr "Širina grafikona" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:977 +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:293 +msgid "Required control values have been removed" +msgstr "Zahtevane kontrolne vrednosti so bile odstranjene" + +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:294 +msgid "Your chart is not up to date" +msgstr "Grafikon ni aktualen" + +#: superset-frontend/src/explore/components/ExploreChartPanel.jsx:301 msgid "" -"The pointer to a physical table (or view). Keep in mind that the chart is" -" associated to this Superset logical table, and this logical table points" -" the physical table referenced here." +"You updated the values in the control panel, but the chart was not updated " +"automatically. Run the query by clicking on the \"Update chart\" button or" msgstr "" -"Kazalec na fizično tabelo (ali pogled). Grafikon je povezan s to " -"Supersetovo logično tabelo, ki kaže na tukaj referencirano fizično " -"tabelo." +"Posodobili ste vrednosti v kontrolni plošči, vendar se grafikon ni samodejno " +"posodobil. Zaženite poizvedbo z gumbom \"Posodobi grafikon\" ali" -#: superset/errors.py:103 -msgid "The port is closed." -msgstr "Vrata so zaprta." +#: superset-frontend/src/explore/components/SaveModal.tsx:35 +msgid "**Select** a dashboard OR **create** a new one" +msgstr "**Izberite** nadzorno ploščo ALI **ustvarite** novo" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:108 -#, fuzzy -msgid "The port must be a whole number less than or equal to 65535." -msgstr "`row_limit` mora biti večja ali enaka 0" +#: superset-frontend/src/explore/components/SaveModal.tsx:141 +msgid "Please enter a chart name" +msgstr "Vnesite ime grafikona" -#: superset/errors.py:136 -msgid "The port number is invalid." -msgstr "Številka vrat je neveljavna." +#: superset-frontend/src/explore/components/SaveModal.tsx:184 +msgid "Save chart" +msgstr "Shrani grafikon" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:57 -msgid "The primary metric is used to define the arc segment sizes" -msgstr "Primarna mera določa velikost lokov segmentov" +#: superset-frontend/src/explore/components/SaveModal.tsx:204 +msgid "Save & go to new dashboard" +msgstr "Shrani in pojdi na novo nadzorno ploščo" -#: superset/views/core.py:2330 -msgid "The provided `rows` argument is not a valid integer." -msgstr "Podani argument `rows` ni veljavno celo število." +#: superset-frontend/src/explore/components/SaveModal.tsx:205 +msgid "Save & go to dashboard" +msgstr "Shrani in pojdi na nadzorno ploščo" -#: superset/errors.py:131 -msgid "The query associated with the results was deleted." -msgstr "Poizvedba, povezana z rezultati, je bila izbrisana." +#: superset-frontend/src/explore/components/SaveModal.tsx:216 +msgid "Save as new chart" +msgstr "Shrani kot nov grafikon" -#: superset/views/core.py:2280 -msgid "" -"The query associated with these results could not be find. You need to " -"re-run the original query." -msgstr "" -"Poizvedbe, povezane s temi rezultati, ni bilo mogoče najti. Ponovno " -"morate zagnati izvorno poizvedbo." +#: superset-frontend/src/explore/components/SaveModal.tsx:218 +msgid "Save to new dashboard" +msgstr "Shrani v novo nadzorno ploščo" -#: superset/sqllab/query_render.py:113 -msgid "The query contains one or more malformed template parameters." -msgstr "Poizvedba vsebuje enega ali več parametrov predlog z napačno obliko." +#: superset-frontend/src/explore/components/SaveModal.tsx:251 +msgid "Save (Overwrite)" +msgstr "Shrani (prepiši)" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:106 -msgid "The query couldn't be loaded" -msgstr "Poizvedbe ni mogoče naložiti" +#: superset-frontend/src/explore/components/SaveModal.tsx:259 +msgid "Save as..." +msgstr "Shrani kot ..." -#: superset/errors.py:129 -msgid "The query has a syntax error." -msgstr "Poizvedba ima sintaktično napako." +#: superset-frontend/src/explore/components/SaveModal.tsx:263 +msgid "Chart name" +msgstr "Ime grafikona" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:771 -msgid "The query returned no data" -msgstr "Poizvedba ni vrnila podatkov" +#: superset-frontend/src/explore/components/SaveModal.tsx:274 +msgid "Add to dashboard" +msgstr "Dodaj na nadzorno ploščo" -#: superset/sql_lab.py:265 -#, python-format -msgid "" -"The query was killed after %(sqllab_timeout)s seconds. It might be too " -"complex, or the database might be under heavy load." -msgstr "" -"Poizvedba je bila ustavljena po %(sqllab_timeout)s sekundah. Lahko je " -"prekompleksna ali pa je podatkovna baza preobremenjena." +#: superset-frontend/src/explore/components/SaveModal.tsx:280 +msgid "Select a dashboard" +msgstr "Izberite nadzorno ploščo" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:87 -msgid "" -"The radius (in pixels) the algorithm uses to define a cluster. Choose 0 " -"to turn off clustering, but beware that a large number of points (>1000) " -"will cause lag." -msgstr "" -"Radij (v pikslih), s katerim algoritem definira gručo. Izberite 0 za " -"izklop gručenja - veliko število točk (>1000) bo povzročilo upočasnitev." +#: superset-frontend/src/explore/components/DataTableControl/index.tsx:84 +msgid "Copy" +msgstr "Kopiraj" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:110 -msgid "" -"The radius of individual points (ones that are not in a cluster). Either " -"a numerical column or `Auto`, which scales the point based on the largest" -" cluster" -msgstr "" -"Radij posameznih točk (tistih, ki niso v gruči). Numerični stolpec ali " -"`Auto` (skalira točke na osnovi največje gruče)" +#: superset-frontend/src/explore/components/DataTableControl/index.tsx:142 +msgid "Formatted date" +msgstr "Oblikovan datum" -#: superset-frontend/src/reports/actions/reports.js:111 -msgid "The report has been created" -msgstr "Poročilo je bilo ustvarjeno" +#: superset-frontend/src/explore/components/DataTableControl/index.tsx:194 +msgid "Column Formatting" +msgstr "Oblikovanje stolpca" -#: superset/errors.py:130 -msgid "The results backend no longer has the data from the query." -msgstr "Zaledni sistem rezultatov nima več podatkov iz poizvedbe." +#: superset-frontend/src/explore/components/DataTableControl/index.tsx:239 +msgid "N/A" +msgstr "N/A" -#: superset/errors.py:132 -msgid "" -"The results stored in the backend were stored in a different format, and " -"no longer can be deserialized." -msgstr "" -"Rezultati v zalednem sistemu so bili shranjeni v drugačni obliki in jih " -"ni več mogoče deserializirati." +#: superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx:158 +msgid "Collapse data panel" +msgstr "Skrij podatkovni panel" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:233 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:103 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:284 -msgid "The rich tooltip shows a list of all series for that point in time" -msgstr "" -"Podroben opis orodja prikaže seznam vseh podatkovnih serij za posamezno " -"časovno točko" +#: superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx:163 +msgid "Expand data panel" +msgstr "Razširi podatkovni panel" -#: superset/db_engine_specs/bigquery.py:171 +#: superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx:208 +#: superset-frontend/src/explore/components/DataTablesPane/components/ResultsPaneOnDashboard.tsx:60 #, python-format -msgid "" -"The schema \"%(schema)s\" does not exist. A valid schema must be used to " -"run this query." -msgstr "" -"Shema \"%(schema)s\" ne obstaja. Za poizvedbo mora biti uporabljena " -"veljavna shema." +msgid "Results %s" +msgstr "Rezultati %s" -#: superset/db_engine_specs/presto.py:187 -#, python-format -msgid "" -"The schema \"%(schema_name)s\" does not exist. A valid schema must be " -"used to run this query." -msgstr "" -"Shema \"%(schema_name)s\" ne obstaja. Za poizvedbo mora biti uporabljena " -"veljavna shema." +#: superset-frontend/src/explore/components/DataTablesPane/DataTablesPane.tsx:227 +msgid "Samples" +msgstr "Vzorci" -#: superset/errors.py:111 -msgid "The schema was deleted or renamed in the database." -msgstr "Shema je bila izbrisana ali preimenovana v podatkovni bazi." +#: superset-frontend/src/explore/components/DataTablesPane/components/SamplesPane.tsx:119 +msgid "No samples were returned for this dataset" +msgstr "Za podatkovni set ni vrnjenih vzorcev" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:92 -msgid "The size of the square cell, in pixels" -msgstr "Velikost kvadratne celice v pikslih" +#: superset-frontend/src/explore/components/DataTablesPane/components/SamplesPane.tsx:137 +#: superset-frontend/src/explore/components/DataTablesPane/components/SingleQueryResultPane.tsx:64 +msgid "No results" +msgstr "Ni rezultatov" -#: superset/errors.py:114 -msgid "The submitted payload has the incorrect format." -msgstr "Podani podatki so v neustrezni obliki." +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:321 +msgid "Search Metrics & Columns" +msgstr "Iskanje mer in stolpcev" -#: superset/errors.py:115 -msgid "The submitted payload has the incorrect schema." -msgstr "Podani podatki imajo neustrezno shemo." +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:339 +msgid "Create a dataset" +msgstr "Ustvarite podatkovni set" -#: superset/db_engine_specs/bigquery.py:158 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:341 #, python-format -msgid "" -"The table \"%(table)s\" does not exist. A valid table must be used to run" -" this query." -msgstr "" -"Tabela \"%(table)s\" ne obstaja. V poizvedbi mora biti uporabljena " -"veljavna tabela." +msgid " to edit or add columns and metrics." +msgstr " za urejanje ali dodajanje stolpcev in mer." -#: superset/db_engine_specs/presto.py:179 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:357 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:393 #, python-format -msgid "" -"The table \"%(table_name)s\" does not exist. A valid table must be used " -"to run this query." -msgstr "" -"Tabela \"%(table_name)s\" ne obstaja. V poizvedbi mora biti uporabljena " -"veljavna tabela." +msgid "Showing %s of %s" +msgstr "Prikazanih %s od %s" -#: superset/connectors/sqla/views.py:540 -msgid "" -"The table was created. As part of this two-phase configuration process, " -"you should now click the edit button by the new table to configure it." -msgstr "" -"Tabela je ustvarjena. Sedaj morate v tem dvodelnem postopku klikniti gumb" -" za urejanje nove tabele." +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:381 +msgid "Show less..." +msgstr "Prikaži manj..." -#: superset/errors.py:100 -msgid "The table was deleted or renamed in the database." -msgstr "Tabela je bila izbrisana ali preimenovana v podatkovni bazi." +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:381 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:417 +msgid "Show all..." +msgstr "Prikaži vse..." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:167 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:266 -#: superset-frontend/src/explore/controls.jsx:297 +#: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:417 +msgid "Show Less..." +msgstr "Prikaži manj..." + +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:156 +msgid "Add the name of the chart" +msgstr "Dodajte naslov grafikona" + +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:157 +msgid "Chart title" +msgstr "Naslov grafikona" + +#: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:188 +msgid "Add required control values to save chart" +msgstr "Dodaj potrebne parametre za shranjenje grafikona" + +#: superset-frontend/src/explore/components/ExploreViewContainer/index.jsx:499 +msgid "Controls labeled " +msgstr "Kontrolniki imenovani " + +#: superset-frontend/src/explore/components/ExploreViewContainer/index.jsx:499 +msgid "Control labeled " +msgstr "Nastavitev " + +#: superset-frontend/src/explore/components/ExploreViewContainer/index.jsx:637 +msgid "Open Datasource tab" +msgstr "Odpri zavihek s podatkovnim virom" + +#: superset-frontend/src/explore/components/ExportToCSVDropdown/index.tsx:75 +msgid "Original" +msgstr "Izvoren" + +#: superset-frontend/src/explore/components/ExportToCSVDropdown/index.tsx:81 +msgid "Pivoted" +msgstr "Vrtilni" + +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:69 +msgid "You do not have permission to edit this chart" +msgstr "Nimate dovoljenja za urejanje tega grafikona" + +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:164 +msgid "Chart properties updated" +msgstr "Lastnosti grafikona posodobljene" + +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:210 +msgid "This chart is managed externally, and can't be edited in Superset" +msgstr "Ta grafikon se ne ureja znotraj Superseta" + +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:259 msgid "" -"The time column for the visualization. Note that you can define arbitrary" -" expression that return a DATETIME column in the table. Also note that " -"the filter below is applied against this column or expression" +"The description can be displayed as widget headers in the dashboard view. " +"Supports markdown." msgstr "" -"Časovni stolpec za vizualizacijo. Določite lahko poljuben izraz, ki vrne " -"DATETIME stolpec v tabeli. Spodnji filter se nanaša na ta stolpec ali " -"izraz" +"Opis je lahko prikazan kot glava gradnika in pogledu nadzorne plošče. Podpira " +"markdown." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:256 -#: superset-frontend/src/explore/controls.jsx:287 +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:270 +msgid "Person or group that has certified this chart." +msgstr "Oseba ali skupina, ki je certificirala ta grafikon." + +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:288 +msgid "Configuration" +msgstr "Nastavitve" + +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:294 msgid "" -"The time granularity for the visualization. Note that you can type and " -"use simple natural language as in `10 seconds`, `1 day` or `56 weeks`" +"Duration (in seconds) of the caching timeout for this chart. Note this defaults " +"to the dataset's timeout if undefined." msgstr "" -"Granulacija časa za vizualizacijo. Uporabite lahko vnos z naravnim " -"jezikom, kot npr. `10 sekund`, `1 dni` ali `56 tednov`" +"Časovna veljavnost (v sekundah) predpomnjenja za ta grafikon. Če ni definirana, " +"je uporabljena vrednost za podatkovni set." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:297 -#: superset-frontend/src/explore/controls.jsx:326 -msgid "" -"The time granularity for the visualization. This applies a date " -"transformation to alter your time column and defines a new time " -"granularity. The options here are defined on a per database engine basis " -"in the Superset source code." +#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:312 +msgid "A list of users who can alter the chart. Searchable by name or username." msgstr "" -"Granulacija časa za to vizualizacijo. Izvede transformacijo podatkov, ki " -"spremeni vaš časovni stolpec in določi novo časovno granulacija. Ta " -"možnost je definirana na ravni sistema podatkovne baze v izvorni kodi " -"Superseta." +"Seznam uporabnikov, ki lahko spreminjajo ta grafikon. Možno je iskanje po imenu " +"ali uporabniškem imenu." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:314 -#: superset-frontend/src/explore/controls.jsx:343 -msgid "" -"The time range for the visualization. All relative times, e.g. \"Last " -"month\", \"Last 7 days\", \"now\", etc. are evaluated on the server using" -" the server's local time (sans timezone). All tooltips and placeholder " -"times are expressed in UTC (sans timezone). The timestamps are then " -"evaluated by the database using the engine's local timezone. Note one can" -" explicitly set the timezone per the ISO 8601 format if specifying either" -" the start and/or end time." -msgstr "" -"Časovno obdobje za vizualizacijo. Vsi relativni časi, kot npr. \"Zadnji " -"mesec\", Zadnjih 7 dni\", \"Zdaj\" so izračunani na strežniku z njegovim " -"lokalnim časom. Vsi opisi orodij in časi so izraženi v UTC. Časovne " -"značke se nato izračunajo v podatkovni bazi z njenim lokalnim časovnim " -"pasom. Eksplicitno lahko nastavite časovni pas v ISO 8601 formatu, če " -"določite čas začetka ali konca." +#: superset-frontend/src/explore/components/RowCountLabel/index.tsx:41 +#, python-format +msgid "%s row" +msgstr "%s vrstica" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:65 -msgid "" -"The time unit for each block. Should be a smaller unit than " -"domain_granularity. Should be larger or equal to Time Grain" -msgstr "" -"Časovna enota za vsak blok. Mora biti manjša enota kot " -"domenska_granulacija. Mora biti večja ali enaka Granulaciji časa" +#: superset-frontend/src/explore/components/RowCountLabel/index.tsx:45 +msgid "Limit reached" +msgstr "Omejitev dosežena" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:49 -msgid "The time unit used for the grouping of blocks" -msgstr "Časovna enota za združevanje blokov" +#: superset-frontend/src/explore/components/RunQueryButton/index.tsx:54 +msgid "Create chart" +msgstr "Ustvari grafikon" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:170 -#: superset-frontend/src/explore/controls.jsx:202 -msgid "The type of visualization to display" -msgstr "Tip vizualizacije za prikaz" +#: superset-frontend/src/explore/components/RunQueryButton/index.tsx:54 +msgid "Update chart" +msgstr "Posodobi grafikon" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:135 -msgid "The unit of measure for the specified point radius" -msgstr "Enota merila za definiran radij točk" +#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:82 +msgid "Invalid lat/long configuration." +msgstr "Neveljavna nastavitev zemljepisne dolžine/širine." -#: superset/views/core.py:183 -msgid "The user seems to have been deleted" -msgstr "Zdi se, da je bil uporabnik izbrisan" +#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:155 +msgid "Reverse lat/long " +msgstr "Zamenjaj zemljepisno dolžino/širino " -#: superset/db_engine_specs/postgres.py:112 -#, python-format -msgid "The username \"%(username)s\" does not exist." -msgstr "Uporabniško ime \"%(username)s\" ne obstaja." +#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:168 +msgid "Longitude & Latitude columns" +msgstr "Stolpci zemljepisne dolžine in širine" -#: superset/errors.py:107 -msgid "The username provided when connecting to a database is not valid." -msgstr "Uporabniško ime za povezavo s podatkovno bazo je neveljavno." +#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:184 +msgid "Delimited long & lat single column" +msgstr "En stolpec z ločenima zemljepisno dolžino in širino" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:206 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:89 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:72 -msgid "The way the ticks are laid out on the X-axis" -msgstr "Način razporeditve oznak na X-osi" +#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:185 +msgid "" +"Multiple formats accepted, look the geopy.points Python library for more details" +msgstr "" +"Sprejema različne zapise - podrobnosti najdete v Pythonovi knjižnici geopy.points" -#: superset/charts/commands/exceptions.py:127 -#: superset/charts/commands/exceptions.py:147 -#: superset/dashboards/commands/exceptions.py:62 -#: superset/dashboards/commands/exceptions.py:74 -#: superset/databases/commands/exceptions.py:117 -msgid "There are associated alerts or reports" -msgstr "Prisotna so povezana opozorila in poročila" +#: superset-frontend/src/explore/components/controls/SpatialControl.jsx:203 +msgid "Geohash" +msgstr "Geohash" -#: superset/charts/commands/bulk_delete.py:64 -#: superset/charts/commands/delete.py:68 -#: superset/dashboards/commands/bulk_delete.py:65 -#: superset/dashboards/commands/delete.py:66 -#: superset/databases/commands/delete.py:65 -#, python-format -msgid "There are associated alerts or reports: %s," -msgstr "Prisotna so opozorila in poročila: %s," +#: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:98 +msgid "textarea" +msgstr "področje besedila" -#: superset-frontend/src/dashboard/components/filterscope/FilterScopeSelector.jsx:507 -msgid "There are no filters in this dashboard." -msgstr "V nadzorni plošči ni filtrov." +#: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:128 +msgid "in modal" +msgstr "v modalnem oknu" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:45 -msgid "There are unsaved changes." -msgstr "Imate neshranjene spremembe." +#: superset-frontend/src/explore/components/controls/ViewQueryModal.tsx:84 +msgid "Sorry, An error occurred" +msgstr "Prišlo je do napake" -#: superset/errors.py:95 -msgid "" -"There is a syntax error in the SQL query. Perhaps there was a misspelling" -" or a typo." -msgstr "V SQL-poizvedbi je sintaktična napaka. Mogoče ste se zatipkali." +#: superset-frontend/src/explore/components/controls/withAsyncVerification.tsx:201 +#, python-format +msgid "Failed to verify select options: %s" +msgstr "Preverjanje možnosti izbire ni uspelo: %s" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:113 +msgid "No annotation layers" +msgstr "Ni slojev z oznakami" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:116 +msgid "Add an annotation layer" +msgstr "Dodaj sloj z oznakami" -#: superset-frontend/src/dashboard/components/MissingChart.jsx:31 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:425 +#, python-format msgid "" -"There is no chart definition associated with this component, could it " -"have been deleted?" +"Use another existing chart as a source for annotations and overlays.\n" +" Your chart must be one of these visualization types: [%s]" msgstr "" -"S to komponento ni povezana nobena definicija grafikona. Ali je bila " -"izbrisana?" +"Uporabite enega izmed obstoječih grafikonov kot vir oznak.\n" +" Grafikon mora biti naslednjega tipa: [%s]" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:437 +msgid "Annotation layer value" +msgstr "Vrednost sloja z oznakami" + +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:500 +msgid "Annotation Slice Configuration" +msgstr "Nastavitve rezine z oznakami" -#: superset-frontend/src/dashboard/actions/dashboardLayout.js:180 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:501 msgid "" -"There is not enough space for this component. Try decreasing its width, " -"or increasing the destination width." +"This section allows you to configure how to use the slice\n" +" to generate annotations." msgstr "" -"Za to komponento ni dovolj prostora. Poskusite zmanjšati širino ali pa " -"povečati širino cilja." - -#: superset-frontend/src/views/CRUD/hooks.ts:522 -#, python-format -msgid "There was an error fetching the favorite status: %s" -msgstr "Napaka pri pridobivanju statusa \"Priljubljeno\": %s" +"V tem sklopu lahko nastavite način uporabe rezine\n" +" za ustvarjanje oznak." -#: superset-frontend/src/views/CRUD/utils.tsx:181 -msgid "There was an error fetching your recent activity:" -msgstr "Pri pridobivanju nedavnih aktivnosti je prišlo do napake:" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:507 +msgid "Annotation layer time column" +msgstr "Časovni stolpec sloja z oznakami" -#: superset-frontend/src/components/DatabaseSelector/index.tsx:230 -msgid "There was an error loading the schemas" -msgstr "Napaka pri nalaganju shem" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:512 +msgid "Interval start column" +msgstr "Stolpec začetka intervala" -#: superset-frontend/src/components/TableSelector/index.tsx:218 -msgid "There was an error loading the tables" -msgstr "Napaka pri nalaganju tabel" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:513 +msgid "Event time column" +msgstr "Stolpec časa dogodka" -#: superset-frontend/src/views/CRUD/hooks.ts:543 -#, python-format -msgid "There was an error saving the favorite status: %s" -msgstr "Napaka pri shranjevanju statusa \"Priljubljeno\": %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:515 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:531 +msgid "This column must contain date/time information." +msgstr "Ta stolpec mora vsebovati informacijo o datumu/času." -#: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:61 -msgid "There was an error with your request" -msgstr "Pri zahtevi je prišlo do napake" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:527 +msgid "Annotation layer interval end" +msgstr "Konec intervala sloja z oznakami" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:165 -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:107 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:94 -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:97 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:148 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:550 -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:235 -#: superset-frontend/src/views/CRUD/utils.tsx:289 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:175 -#, python-format -msgid "There was an issue deleting %s: %s" -msgstr "Težava pri brisanju %s: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:530 +msgid "Interval End column" +msgstr "Stolpec konca intervala" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:180 -#, python-format -msgid "There was an issue deleting the selected %s: %s" -msgstr "Težava pri brisanju izbranih %s: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:541 +msgid "Annotation layer title column" +msgstr "Stolpec z naslovom sloja z oznakami" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:127 -#, python-format -msgid "There was an issue deleting the selected annotations: %s" -msgstr "Pri brisanju izbranih oznak je prišlo do težave: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:544 +msgid "Title Column" +msgstr "Stolpec z naslovi" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:209 -#, python-format -msgid "There was an issue deleting the selected charts: %s" -msgstr "Pri brisanju izbranih grafikonov je prišlo do težave: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:545 +msgid "Pick a title for you annotation." +msgstr "Izberite naslov za oznako." -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:226 -msgid "There was an issue deleting the selected dashboards: " -msgstr "Pri brisanju izbranih nadzornih plošč je prišlo do težave: " +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:552 +msgid "Annotation layer description columns" +msgstr "Stolpci z opisi slojev z oznakami" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:568 -#, python-format -msgid "There was an issue deleting the selected datasets: %s" -msgstr "Pri brisanju izbranih podatkovnih setov je prišlo do težave: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:555 +msgid "Description Columns" +msgstr "Stolpci z opisi" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:111 -#, python-format -msgid "There was an issue deleting the selected layers: %s" -msgstr "Pri brisanju izbranih slojev je prišlo do težave: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:556 +msgid "" +"Pick one or more columns that should be shown in the annotation. If you don't " +"select a column all of them will be shown." +msgstr "" +"Izberite enega ali več stolpcev, ki bodo prikazani v oznakah. Če ne izberete " +"stolpca, bodo prikazani vsi." -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:262 -#, python-format -msgid "There was an issue deleting the selected queries: %s" -msgstr "Do težave je prišlo pri brisanju izbranih poizvedb: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:650 +msgid "Display configuration" +msgstr "Prikaži nastavitve" -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:115 -#, python-format -msgid "There was an issue deleting the selected templates: %s" -msgstr "Pri brisanju izbranih predlog je prišlo do težave: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:651 +msgid "Configure your how you overlay is displayed here." +msgstr "Nastavite kako se tukaj prikazuje vrhnja plast." -#: superset-frontend/src/views/CRUD/utils.tsx:249 -#, python-format -msgid "There was an issue deleting: %s" -msgstr "Težava pri brisanju: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:654 +msgid "Annotation layer stroke" +msgstr "Obroba sloja z oznakami" -#: superset-frontend/src/dashboard/actions/dashboardState.js:100 -msgid "There was an issue favoriting this dashboard." -msgstr "Pri uvrščanju nadzorne plošče med priljubljene je prišlo do težave." +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:656 +msgid "Style" +msgstr "Slog" -#: superset-frontend/src/reports/actions/reports.js:68 -msgid "There was an issue fetching reports attached to this dashboard." -msgstr "Pri pridobivanju poročil za to nadzorno ploščo je prišlo do težave." +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:669 +msgid "Annotation layer opacity" +msgstr "Prosojnost sloja z oznakami" -#: superset-frontend/src/dashboard/actions/dashboardState.js:79 -msgid "There was an issue fetching the favorite status of this dashboard." -msgstr "" -"Pri pridobivanju statusa \"priljubljeno\" za to nadzorno ploščo je prišlo" -" do težave." +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:683 +msgid "Color" +msgstr "Barva" -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:195 -#, python-format -msgid "There was an issue fetching your recent activity: %s" -msgstr "Pri pridobivanju vaše nedavne aktivnosti je prišlo do napake: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:754 +msgid "Layer configuration" +msgstr "Nastavitve sloja" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:152 -#, python-format -msgid "There was an issue previewing the selected query %s" -msgstr "Do težave je prišlo pri predogledu izbrane poizvedbe %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:755 +msgid "Configure the basics of your Annotation Layer." +msgstr "Osnovne nastavitve sloja z oznakami." -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:109 -#, python-format -msgid "There was an issue previewing the selected query. %s" -msgstr "Pri predogledu izbrane poizvedbe je prišlo do težave. %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:763 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:801 +msgid "Mandatory" +msgstr "Obvezno" -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:222 -#, python-format -msgid "There was an issues fetching your chart: %s" -msgstr "Prišlo je do napake pri pridobivanju grafikona: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:767 +msgid "Hide layer" +msgstr "Skrij sloj" -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:211 -#, python-format -msgid "There was an issues fetching your dashboards: %s" -msgstr "Prišlo je do napake pri pridobivanju nadzornih plošč: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:773 +msgid "Show label" +msgstr "Pokaži oznako" -#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:233 -#, python-format -msgid "There was an issues fetching your saved queries: %s" -msgstr "Prišlo je do napake pri pridobivanju shranjenih poizvedb: %s" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:776 +msgid "Whether to always show the annotation label" +msgstr "Če želite vedno prikazati naslov oznake" -#: superset/viz.py:1955 -msgid "" -"There's a loop in your Sankey, please provide a tree. Here's a faulty " -"link: {}" -msgstr "V 'Sankey' je zanka, določite drevo. To je okvarjena povezava: {}" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:780 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:783 +msgid "Annotation layer type" +msgstr "Tip sloja z oznakami" -#: superset/connectors/sqla/views.py:341 -msgid "These are the tables this filter will be applied to." -msgstr "To so tabele, na katere se nanaša ta filter." +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:782 +msgid "Choose the annotation layer type" +msgstr "Izberite tip sloja z oznakami" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:135 -msgid "These filters apply to the values available in the dropdowns" -msgstr "Ti filtri se nanašajo na vrednosti v spustnih seznamih" +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:792 +msgid "Annotation source type" +msgstr "Tip vira oznak" -#: superset/views/chart/mixin.py:64 -msgid "" -"These parameters are generated dynamically when clicking the save or " -"overwrite button in the explore view. This JSON object is exposed here " -"for reference and for power users who may want to alter specific " -"parameters." -msgstr "" -"Ti parametri se ustvarijo dinamično s klikom gumba Shrani ali Prepiši v " -"raziskovalnem pogledu. Ta JSON objekt je prikazan kot vzorec za napredne " -"uporabnike, ki želijo spreminjati posamezne parametre." +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:794 +msgid "Choose the source of your annotations" +msgstr "Izberite vir svojih oznak" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:597 -#: superset/views/dashboard/mixin.py:59 -msgid "" -"This JSON object is generated dynamically when clicking the save or " -"overwrite button in the dashboard view. It is exposed here for reference " -"and for power users who may want to alter specific parameters." -msgstr "" -"Ta JSON objekt se ustvari dinamično s klikom gumba Shrani ali Prepiši v " -"pogledu nadzorne plošče. Tukaj je prikazan kot vzorec za napredne " -"uporabnike, ki želijo spreminjati posamezne parametre." +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:795 +msgid "Annotation source" +msgstr "Vir oznak" -#: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:99 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:470 -#, python-format -msgid "This action will permanently delete %s." -msgstr "S tem dejanjem boste trajno izbrisali %s." +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:817 +msgid "Remove" +msgstr "Odstrani" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:353 -msgid "This action will permanently delete the layer." -msgstr "S tem dejanjem boste trajno izbrisali sloj." +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:177 +msgid "Edit annotation layer" +msgstr "Uredi sloj z oznakami" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:475 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:249 -msgid "This action will permanently delete the saved query." -msgstr "S tem dejanjem boste trajno izbrisali shranjeno poizvedbo." +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:207 +#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/index.jsx:219 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:242 +msgid "Add annotation layer" +msgstr "Dodaj sloj z oznakami" -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:313 -msgid "This action will permanently delete the template." -msgstr "S tem dejanjem boste trajno izbrisali predlogo." +#: superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:59 +msgid "Empty collection" +msgstr "Prazen izbor" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:40 -msgid "" -"This can be either an IP address (e.g. 127.0.0.1) or a domain name (e.g. " -"mydatabase.com)." -msgstr "" -"To je lahko bodisi IP naslov (npr. 127.0.0.1) bodisi ime domene (npr. " -"mydatabase.com)." +#: superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:63 +msgid "Add an item" +msgstr "Dodaj element" -#: superset-frontend/src/dashboard/actions/dashboardLayout.js:258 -msgid "This chart has been moved to a different filter scope." -msgstr "Ta grafikon je bil prestavljen v drug doseg filtrov." +#: superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:142 +msgid "Remove item" +msgstr "Odstrani element" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.ts:56 -msgid "This chart might be incompatible with the filter (datasets don't match)" +#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:66 +msgid "" +"The color scheme is determined by the related dashboard.\n" +" Edit the color scheme in the dashboard properties." msgstr "" -"Ta grafikon je lahko nekompatibilen s filtrom (podatkovni seti se ne " -"ujemajo)" +"Barvna shema je določena s povezano nadzorno ploščo.\n" +" Barvno shemo uredite v nastavitvah nadzorne plošče." #: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:127 msgid "" "This color scheme is being overriden by custom label colors.\n" " Check the JSON metadata in the Advanced settings" msgstr "" +"Barvna shema je bila preglasovana z barvo oznake po meri.\n" +" Preverite JSON metapodatke v naprednih nastavitvah" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:480 -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:496 -msgid "This column must contain date/time information." -msgstr "Ta stolpec mora vsebovati informacijo o datumu/času." +#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:153 +msgid "Dashboard scheme" +msgstr "Shema nadzorne plošče" -#: superset-frontend/src/dashboard/components/Header/index.jsx:303 -#, python-format -msgid "" -"This dashboard is currently auto refreshing; the next auto refresh will " -"be in %s." -msgstr "" -"Nadzorna plošča se trenutno samodejno osvežuje. Naslednja samodejna " -"osvežitev bo čez %s." +#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:188 +msgid "Select color scheme" +msgstr "Izberite barvno shemo" + +#: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:194 +msgid "Select scheme" +msgstr "Izberite shemo" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/ConditionalFormattingControl.tsx:151 +msgid "Edit formatter" +msgstr "Uredi oblikovanje" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/ConditionalFormattingControl.tsx:169 +msgid "Add new formatter" +msgstr "Dodaj novo oblikovanje" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/ConditionalFormattingControl.tsx:176 +msgid "Add new color formatter" +msgstr "Dodaj novo oblikovanje barve" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:42 +msgid "green" +msgstr "zelena" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:43 +msgid "yellow" +msgstr "rumena" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:44 +msgid "red" +msgstr "rdeča" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:80 +msgid "This value should be smaller than the right target value" +msgstr "Ta vrednost mora biti manjša od desne ciljne vrednosti" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:85 +msgid "This value should be greater than the left target value" +msgstr "Ta vrednost mora biti večja od leve ciljne vrednosti" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:94 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:98 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:105 +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:252 +msgid "Required" +msgstr "Obvezno" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:126 +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:130 +msgid "Operator" +msgstr "Operator" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:144 +msgid "Left value" +msgstr "Leva vrednost" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:157 +msgid "Right value" +msgstr "Desna vrednost" + +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:173 +msgid "Target value" +msgstr "Ciljna vrednost" -#: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:38 -msgid "" -"This dashboard is not published which means it will not show up in the " -"list of dashboards. Favorite it to see it there or access it by using the" -" URL directly." -msgstr "" -"Ta nadzorna plošča ni objavljena in se ne bo prikazala na seznamu " -"nadzornih plošč. Uvrstite jo med priljubljene, da jo boste videli tam, " -"ali pa uporabite URL za neposredni dostop." +#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:208 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:63 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:300 +msgid "Select column" +msgstr "Izberite stolpec" -#: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:33 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:244 +msgid "Edit dataset" +msgstr "Uredi podatkovni set" + +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:256 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:429 msgid "" -"This dashboard is not published, it will not show up in the list of " -"dashboards. Click here to publish this dashboard." +"You must be a dataset owner in order to edit. Please reach out to a dataset owner " +"to request modifications or edit access." msgstr "" -"Ta nadzorna plošča ni objavljena in se ne bo prikazala na seznamu " -"nadzornih plošč. Kliknite tukaj za njeno objavo." +"Za urejanje morate biti lastnik podatkovnega seta. Za dostop do urejanja " +"kontaktirajte lastnika podatkovnega seta." -#: superset-frontend/src/dashboard/actions/dashboardState.js:125 -#, fuzzy -msgid "This dashboard is now hidden" -msgstr "Spreminjanje te nadzorne plošče ni dovoljeno" +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:269 +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:277 +msgid "View in SQL Lab" +msgstr "Ogled v SQL laboratoriju" -#: superset-frontend/src/dashboard/actions/dashboardState.js:124 -#, fuzzy -msgid "This dashboard is now published" -msgstr "Ta nadzorna plošča je sedaj ${nowPublished}" +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:276 +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:117 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:378 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:97 +msgid "Query preview" +msgstr "Predogled poizvedbe" -#: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:43 -msgid "This dashboard is published. Click to make it a draft." -msgstr "Ta nadzorna plošča je objavljena. Kliknite, da jo uvrstite med osnutke." +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:278 +msgid "Save as dataset" +msgstr "Shrani kot podatkovni set" -#: superset/views/core.py:1273 -msgid "" -"This dashboard was changed recently. Please reload dashboard to get " -"latest version." -msgstr "" -"Nadzorna plošča je bila pred kratkim spremenjena. Ponovno jo naložite, da" -" dobite zadnjo verzijo." +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:322 +msgid "More dataset related options" +msgstr "Več nastavitev za podatkovni set" -#: superset-frontend/src/dashboard/actions/dashboardState.js:231 -msgid "This dashboard was saved successfully." -msgstr "Nadzorna plošča je bila uspešno shranjena." +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:335 +msgid "Missing URL parameters" +msgstr "Manjkajo parametri URL-ja" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:77 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:401 -#: superset-frontend/src/explore/controls.jsx:416 -msgid "This defines the element to be plotted on the chart" -msgstr "Določa element, ki bo izrisan na grafikonu" +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:340 +msgid "The URL is missing the dataset_id or slice_id parameters." +msgstr "V URL-ju manjkata parametra dataset_id ali slice_id." -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:82 -msgid "This defines the level of the hierarchy" -msgstr "Določa stopnjo hierarhije" +#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:358 +msgid "The dataset linked to this chart may have been deleted." +msgstr "Podatkovni set, povezan s tem grafikonom, je bil izbrisan." -#: superset/views/alerts.py:232 superset/views/schedules.py:253 -#: superset/views/schedules.py:334 -msgid "" -"This feature is deprecated and will be removed on 2.0. Take a look at the" -" replacement feature <a " -"href='https://superset.apache.org/docs/installation/alerts-" -"reports'>Alerts & Reports documentation</a>" -msgstr "" -"Ta funkcija je zastarela in bo odstranjena v verziji 2.0. Oglejte si " -"zamenjavo <a href='https://superset.apache.org/docs/installation/alerts-" -"reports'>Dokumentacija za Opozorila & Poročila</a>" +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:293 +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:295 +msgid "RANGE TYPE" +msgstr "TIP OBDOBJA" -#: superset/connectors/sqla/views.py:447 -msgid "" -"This fields acts a Superset view, meaning that Superset will run a query " -"against this string as a subquery." -msgstr "" -"To polje se obnaša kot Supersetov pogled, kar pomeni, da bo Superset " -"izvedel poizvedbo za ta niz kot podpoizvedbo." +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:316 +msgid "Actual time range" +msgstr "Dejansko časovno obdobje" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:105 -msgid "This filter doesn't exist in dashboard. It will not be applied." -msgstr "Ta filter ne obstaja v nadzorni plošči in ne bo uveljavljen." +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:334 +msgid "CANCEL" +msgstr "PREKINI" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:165 -#, python-format -msgid "This filter set is identical to: \"%s\"" -msgstr "Ta set filtrov je enak: \"%s\"" +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:344 +msgid "APPLY" +msgstr "UPORABI" -#: superset/connectors/sqla/views.py:358 -msgid "" -"This is the condition that will be added to the WHERE clause. For " -"example, to only return rows for a particular client, you might define a " -"regular filter with the clause `client_id = 9`. To display no rows unless" -" a user belongs to a RLS filter role, a base filter can be created with " -"the clause `1 = 0` (always false)." -msgstr "" -"To je pogoj, ki bo dodan WHERE stavku. Npr., če želite dobiti vrstice za " -"določeno stranko, lahko definirate regularni filter z izrazom 'id_stranke" -" = 9'. Če ne želimo prikazati vrstic, razen če uporabnik pripada RLS " -"vlogi, lahko filter ustvarimo z izrazom `1 = 0` (vedno neresnično)." +#: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:353 +msgid "Edit time range" +msgstr "Uredi časovno obdobje" -#: superset/views/dashboard/mixin.py:47 -msgid "" -"This json object describes the positioning of the widgets in the " -"dashboard. It is dynamically generated when adjusting the widgets size " -"and positions by using drag & drop in the dashboard view" -msgstr "" -"Ta JSON objekt opisuje postavitev pripomočkov na nadzorni plošči. Ustvari" -" se dinamično, ko prilagajamo velikost in postavitev pripomočkov z " -"uporabo povleci&spusti v pogledu nadzorne plošče" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:58 +msgid "Configure Advanced Time Range " +msgstr "Nastavi napredno časovno obdobje " -#: superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx:80 -msgid "This markdown component has an error." -msgstr "Markdown komponenta ima napako." +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:64 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:114 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:121 +msgid "START (INCLUSIVE)" +msgstr "ZAČETEK (VKLJUČEN)" -#: superset-frontend/src/dashboard/components/gridComponents/Markdown.jsx:167 -msgid "This markdown component has an error. Please revert your recent changes." -msgstr "Markdown komponenta ima napako. Povrnite nedavne spremembe." +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:66 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:116 +msgid "Start date included in time range" +msgstr "Začetni datum je vključen v časovno obdobje" -#: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:47 -#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:62 -msgid "This may be triggered by:" -msgstr "To je lahko sproženo z/s:" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:76 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:166 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:173 +msgid "END (EXCLUSIVE)" +msgstr "KONEC (NI VKLJUČEN)" -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:109 -#, python-format -msgid "This query took %s seconds to run, " -msgstr "Trajanje poizvedbe v sekundah: %s, " +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:78 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:168 +msgid "End date excluded from time range" +msgstr "Končni datum ni vključen v časovno obdobje" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:466 -#, fuzzy -msgid "" -"This section allows you to configure how to use the slice\n" -" to generate annotations." -msgstr "" -"V tem sklopu lahko nastavite način uporabe rezine\r\n" -" za ustvarjanje oznak." +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CalendarFrame.tsx:46 +msgid "Configure Time Range: Previous..." +msgstr "Nastavi časovno obdobje: Prejšnji ..." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:27 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:244 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:127 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:377 -#: superset-frontend/src/explore/controlPanels/sections.tsx:146 -msgid "" -"This section contains options that allow for advanced analytical post " -"processing of query results" -msgstr "" -"Ta sekcija vsebuje možnosti, ki omogočajo napredno analitično " -"poprocesiranje rezultatov poizvedb" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CommonFrame.tsx:41 +msgid "Configure Time Range: Last..." +msgstr "Nastavi časovno obdobje: Zadnji ..." -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:84 -msgid "This value should be greater than the left target value" -msgstr "Ta vrednost mora biti večja od leve ciljne vrednosti" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:110 +msgid "Configure custom time range" +msgstr "Nastavi prilagojeno časovno obdobje" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:79 -msgid "This value should be smaller than the right target value" -msgstr "Ta vrednost mora biti manjša od desne ciljne vrednosti" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:143 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:194 +msgid "Relative quantity" +msgstr "Relativne vrednosti" -#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:67 -msgid "This visualization type is not supported." -msgstr "Ta tip vizualizacije ni podprt." +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:155 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:206 +msgid "Relative period" +msgstr "Relativno obdobje" -#: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:61 -msgid "This was triggered by:" -msgstr "To je bilo sproženo z/s:" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:218 +msgid "Anchor to" +msgstr "Sidraj na" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:74 -msgid "Threshold alpha level for determining significance" -msgstr "Mejna vrednost alfa za določanje značilnosti" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:227 +msgid "NOW" +msgstr "ZDAJ" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:60 -msgid "Thursday" -msgstr "Četrtek" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:230 +msgid "Date/Time" +msgstr "Datum/Čas" -# SUPERSET UI -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:32 -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:26 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:36 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:52 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:38 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:37 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:33 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:36 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:29 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:76 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:81 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:81 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:75 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:75 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:75 -#: superset-frontend/src/explore/controlPanels/sections.tsx:25 -#: superset-frontend/src/explore/controlPanels/sections.tsx:84 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:182 -msgid "Time" -msgstr "Čas" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:29 +msgid "Return to specific datetime." +msgstr "Vrne določen datum-čas." -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:25 -msgid "Time Column" -msgstr "Časovni stolpec" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:30 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:44 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:62 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:76 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:89 +msgid "Syntax" +msgstr "Sintaksa" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:303 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:186 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:436 -msgid "Time Comparison" -msgstr "Časovna primerjava" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:34 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:49 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:67 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:81 +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:95 +msgid "Example" +msgstr "Primer" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:141 -msgid "Time Format" -msgstr "Oblika zapisa časa" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:43 +msgid "Moves the given set of dates by a specified interval." +msgstr "Premakne dani nabor datumov za definirano obdobje." -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:26 -msgid "Time Grain" -msgstr "Granulacija časa" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:58 +msgid "Truncates the specified date to the accuracy specified by the date unit." +msgstr "Zaokroži določen datum, glede na natančnost, definirano s časovno enoto." -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:28 -msgid "Time Granularity" -msgstr "Granulacija časa" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:75 +msgid "Get the last date by the date unit." +msgstr "Pridobi zadnji datum glede na časovno enoto." -#: superset/connectors/druid/views.py:350 -msgid "Time Offset" -msgstr "Časovni zamik" +#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:88 +msgid "Get the specify date for the holiday" +msgstr "Določi datum praznika" -#: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:24 -msgid "Time Range" -msgstr "Časovno obdobje" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:31 +msgid "Last" +msgstr "Zadnji" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:86 -msgid "Time Series" -msgstr "Časovna vrsta" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:32 +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:125 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:105 +msgid "Previous" +msgstr "Prejšnji" -#: superset/viz.py:1638 -msgid "Time Series - Bar Chart" -msgstr "Časovna vrsta - Stolpčni grafikon" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:33 +msgid "Custom" +msgstr "Prilagojen" -#: superset/viz.py:1564 -msgid "Time Series - Dual Axis Line Chart" -msgstr "Časovna vrsta - Črtni grafikon z dvojno osjo" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:39 +msgid "last day" +msgstr "zadnji dan" -#: superset/viz.py:1276 -msgid "Time Series - Line Chart" -msgstr "Časovna vrsta - Črtni grafikon" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:40 +msgid "last week" +msgstr "zadnji teden" -#: superset/viz.py:1486 -msgid "Time Series - Multiple Line Charts" -msgstr "Časovna vrsta - Veččrtni grafikon" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:41 +msgid "last month" +msgstr "zadnji mesec" -#: superset/viz.py:3000 -msgid "Time Series - Nightingale Rose Chart" -msgstr "Časovna vrsta - Nightingale Rose grafikon" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:42 +msgid "last quarter" +msgstr "zadnje četrletje" -#: superset/viz.py:2928 -msgid "Time Series - Paired t-test" -msgstr "Časovna vrsta - t-test za odvisne vzorce" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:43 +msgid "last year" +msgstr "zadnje leto" -#: superset/viz.py:1693 -msgid "Time Series - Percent Change" -msgstr "Časovna vrsta - Procentualna sprememba" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:50 +msgid "previous calendar week" +msgstr "prejšnji koledarski teden" -#: superset/viz.py:1647 -msgid "Time Series - Period Pivot" -msgstr "Časovna vrsta - Vrtenje period" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:53 +msgid "previous calendar month" +msgstr "prejšnji koledarski mesec" -#: superset/viz.py:1701 -msgid "Time Series - Stacked" -msgstr "Časovna vrsta - Naložen graf" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:55 +msgid "previous calendar year" +msgstr "prejšnje koledarsko leto" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:67 -msgid "Time Series Options" -msgstr "Možnosti časovne vrste" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:62 +#, python-format +msgid "Seconds %s" +msgstr "Sekunde %s" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:311 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:194 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:444 -msgid "Time Shift" -msgstr "Časovni zamik" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:63 +#, python-format +msgid "Minutes %s" +msgstr "Minute %s" -#: superset/viz.py:822 -msgid "Time Table View" -msgstr "Pogled urnika" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:64 +#, python-format +msgid "Hours %s" +msgstr "Ure %s" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:297 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1132 -#: superset-frontend/src/explore/constants.ts:114 -#: superset-frontend/src/filters/components/TimeColumn/index.ts:28 -msgid "Time column" -msgstr "Časovni stolpec" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:65 +#, python-format +msgid "Days %s" +msgstr "Dnevi %s" -#: superset/connectors/sqla/models.py:1173 +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:66 #, python-format -msgid "Time column \"%(col)s\" does not exist in dataset" -msgstr "Časovni stolpec \"%(col)s\" ne obstaja v podatkovnem setu" +msgid "Weeks %s" +msgstr "Tedni %s" -#: superset-frontend/src/filters/components/TimeColumn/index.ts:29 -msgid "Time column filter plugin" -msgstr "Vtičnik za časovni filter" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:67 +#, python-format +msgid "Months %s" +msgstr "Meseci %s" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:88 -#: superset-frontend/src/explore/controlPanels/sections.tsx:201 -msgid "Time comparison" -msgstr "Časovna primerjava" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:68 +#, python-format +msgid "Quarters %s" +msgstr "Četrtletja %s" -#: superset/charts/commands/exceptions.py:66 +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:69 #, python-format -msgid "" -"Time delta is ambiguous. Please specify [%(human_readable)s ago] or " -"[%(human_readable)s later]." -msgstr "" -"Časovna razlika je nejasna. Podajte [%(human_readable)s ago] ali " -"[%(human_readable)s later]." +msgid "Years %s" +msgstr "Leta %s" -#: superset/connectors/druid/views.py:317 -msgid "" -"Time expression to use as a predicate when retrieving distinct values to " -"populate the filter component. Only applies when `Enable Filter Select` " -"is on. If you enter `7 days ago`, the distinct list of values in the " -"filter will be populated based on the distinct value over the past week" -msgstr "" -"Prednastavljeni časovni izraz za pridobitev različnih vrednosti filtrirne" -" komponente. Upošteva se le v primeru, da je vključeno `Omogoči izbiro " -"filtra`. Če vnesete `7 days ago`, bo seznam vrednosti filtra napolnjen na" -" podlagi različnih vrednosti v prejšnjem tednu" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:75 +msgid "Before" +msgstr "PRED" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:296 -#: superset-frontend/src/filters/components/Time/index.ts:27 -msgid "Time filter" -msgstr "Časovni filter" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:82 +msgid "After" +msgstr "PO" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:450 -msgid "Time format" -msgstr "Oblika zapisa časa" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:87 +msgid "Specific Date/Time" +msgstr "Fiksen Datum/Čas" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:298 -#: superset-frontend/src/explore/constants.ts:115 -#: superset-frontend/src/filters/components/TimeGrain/index.ts:28 -msgid "Time grain" -msgstr "Granulacija časa" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:88 +msgid "Relative Date/Time" +msgstr "Relativen Datum/Čas" -#: superset-frontend/src/filters/components/TimeGrain/index.ts:29 -msgid "Time grain filter plugin" -msgstr "Vtičnik za filter časovne granulacije" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:89 +msgid "Now" +msgstr "Zdaj" -#: superset/utils/pandas_postprocessing.py:815 -msgid "Time grain missing" -msgstr "Časovna granulacija manjka" +#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:90 +msgid "Midnight" +msgstr "Polnoč" -#: superset-frontend/src/explore/constants.ts:117 -msgid "Time granularity" -msgstr "Granulacija časa" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:230 +msgid "Saved expressions" +msgstr "Shranjeni izrazi" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1267 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1282 -msgid "Time in seconds" -msgstr "Čas v sekundah" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:246 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:367 +msgid "Saved" +msgstr "Shranjeno" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:296 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1105 -#: superset-frontend/src/explore/constants.ts:113 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:382 -msgid "Time range" -msgstr "Časovno obdobje" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:255 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:305 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:330 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:301 +#, python-format +msgid "%s column(s)" +msgstr "Stolpci: %s" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:98 -#: superset-frontend/src/explore/controlPanels/sections.tsx:69 -msgid "Time range endpoints" -msgstr "Krajne točke časovnega obdobja" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:273 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:292 +msgid "No temporal columns found" +msgstr "Ni najdenih časovnih stolpcev" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:100 -#: superset-frontend/src/explore/controlPanels/sections.tsx:71 -msgid "Time range endpoints (SIP-15)" -msgstr "Krajne točke časovnega obdobja (SIP-15)" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:274 +msgid "No saved expressions found" +msgstr "Shranjeni izrazi niso najdeni" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:28 -#: superset-frontend/src/explore/controlPanels/sections.tsx:27 -#: superset-frontend/src/explore/controlPanels/sections.tsx:85 -msgid "Time related form attributes" -msgstr "S časom povezani atributi prikaza" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:278 +msgid "Add calculated temporal columns to dataset in \"Edit datasource\" modal" +msgstr "" +"Dodaj izračunan časovni stolpec v podatkovni set v oknu \"Uredi podatkovni vir\"" -#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:48 -#: superset-frontend/src/explore/controlPanels/TimeTable.js:38 -msgid "Time series columns" -msgstr "Stolpci s časovnimi vrstami" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:281 +msgid "Add calculated columns to dataset in \"Edit datasource\" modal" +msgstr "Dodaj izračunan stolpec v podatkovni set v oknu \"Uredi podatkovni vir\"" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:96 -#: superset-frontend/src/explore/controlPanels/sections.tsx:209 -msgid "Time shift" -msgstr "Časovni zamik" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:288 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:211 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:401 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:404 +msgid "Simple" +msgstr "Preprosto" -#: superset/charts/commands/exceptions.py:38 -#, python-format -msgid "" -"Time string is ambiguous. Please specify [%(human_readable)s ago] or " -"[%(human_readable)s later]." -msgstr "" -"Časovni niz je nejasen. Podajte [%(human_readable)s ago] ali " -"[%(human_readable)s later]." +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:293 +msgid "Mark a column as temporal in \"Edit datasource\" modal" +msgstr "Označite stolpec kot časoven preko okna \"Uredi podatkovni vir\"" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:75 -msgid "Time-series Area Chart" -msgstr "Ploščinski grafikon časovne vrste" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:319 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:237 +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:240 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:447 +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:450 +msgid "Custom SQL" +msgstr "Prilagojen SQL" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:65 -msgid "" -"Time-series Area chart are similar to line chart in that they represent " -"variables with the same scale, but area charts stack the metrics on top " -"of each other. An area chart in Superset can be stream, stack, or expand." -msgstr "" -"Ploščinski grafikoni časovne vrste so podobni črtnim grafikonom, saj " -"predstavljajo spremenljivke v istem razmerju, vendar se pri ploščinskih " -"grafikonih mere nalagajo ena na drugo." +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx:43 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelectPopoverTitle.jsx:65 +msgid "My column" +msgstr "Moj stolpec" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:35 -msgid "Time-series Bar Chart" -msgstr "Stolpčni grafikon za časovno vrsto" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx:211 +msgid "Drop a column here or click" +msgstr "Spustite stolpec sem ali kliknite" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:75 -msgid "Time-series Bar Chart v2" -msgstr "Stolpčni grafikon časovne vrste v2" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx:216 +msgid "Drop column here" +msgstr "Spustite stolpec sem" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:61 -msgid "" -"Time-series Bar Charts are used to show the changes in a metric over time" -" as a series of bars." -msgstr "" -"Stolpčni grafikoni časovne vrste se uporabljajo za prikaz sprememb mere " -"skozi čas s pomočjo niza stolpcev." +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelectPopoverTitle.jsx:81 +msgid "Click to edit label" +msgstr "Kliknite za urejanje oznake" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:69 -msgid "Time-series Chart" -msgstr "Grafikon časovne vrste" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx:388 +msgid "Drop columns/metrics here or click" +msgstr "Spustite stolpce/mere sem ali kliknite" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:70 -msgid "Time-series Line Chart" -msgstr "Črtni grafikon časovne vrste" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx:389 +msgid "Drop columns or metrics here" +msgstr "Spustite stolpce ali mere sem" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:30 -msgid "Time-series Percent Change" -msgstr "Časovna vrsta - Procentualna sprememba" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx:367 +msgid "Drop a column/metric here or click" +msgstr "Spustite stolpec/mero sem ali kliknite" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:28 -msgid "Time-series Period Pivot" -msgstr "Časovna serija - Vrtenje periode" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx:372 +msgid "Drop column or metric here" +msgstr "Spustite stolpec ali mero sem" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:69 -msgid "Time-series Scatter Plot" -msgstr "Raztreseni grafikon časovne vrste" +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndSelectLabel.tsx:83 +msgid "Drop columns here" +msgstr "Spustite stolpce sem" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:59 +#: superset-frontend/src/explore/components/controls/DndColumnSelectControl/Option.tsx:68 +#: superset-frontend/src/explore/components/controls/OptionControls/index.tsx:322 msgid "" -"Time-series Scatter Plot has time on the horizontal axis in linear units," -" and the points are connected in order. It shows a statistical " -"relationship between two variables." +"\n" +" This filter was inherited from the dashboard's context.\n" +" It won't be saved when saving the chart.\n" +" " msgstr "" -"Raztreseni grafikon časovne vrste prikazuje podatkovne točke v povezanem " -"redu in prikazuje statistično razmerje med spremenljivkami." +"\n" +" Ta filter izvira iz konteksta nadzorne plošče.\n" +" Pri shranjevanju grafikona se ne bo shranil.\n" +" " -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:69 -msgid "Time-series Smooth Line" -msgstr "Zglajeni črtni grafikon časovne vrste" +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:167 +msgid "Default" +msgstr "Privzeto" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:59 +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:168 msgid "" -"Time-series Smooth-line is a variation of line chart. Without angles and " -"hard edges, Smooth-line looks more smarter and more professional." +"(optional) default value for the filter, when using the multiple option, you can " +"use a semicolon-delimited list of options." msgstr "" -"Zglajeni grafikon časovne vrste je izpeljanka črtnega grafikona, ki " -"zgladi ostre robove krivulje." +"(opcijsko) privzeta vrednost za filter, če uporabite opcijo izbire večih , lahko " +"uporabite seznam nastavitev ločen s podpičji." -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:60 -msgid "Time-series Stepped Line" -msgstr "Stopnični črtni grafikon časovne vrste" +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:185 +msgid "Metric to sort the results by" +msgstr "Mera za razvrščanje rezultatov" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:50 -msgid "" -"Time-series Stepped-line graph (also called step chart) is a variation of" -" line chart but with the line forming a series of steps between data " -"points. A step chart can be useful when you want to show the changes that" -" occur at irregular intervals." -msgstr "" -"Stopnični grafikon časovne vrste je izpeljanka črtnega grafikona, pri " -"čemer krivuljo tvorijo stopnice med posameznimi točkami. Koristen je za " -"prikaz sprememb na posameznih intervalih." +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:206 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:68 +msgid "Check for sorting ascending" +msgstr "Označi za naraščajoče razvrščanje" -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:25 -msgid "Time-series Table" -msgstr "Tabela s časovno vrsto" +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:216 +msgid "Allow multiple selections" +msgstr "Dovoli več izbir" -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:60 +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:218 +msgid "Multiple selections allowed, otherwise filter is limited to a single value" +msgstr "Lahko izberete več elementov, drugače pa je filter omejen na eno vrednost" + +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:232 +msgid "Search all filter options" +msgstr "Poišči vse možnosti filtra" + +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:233 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:138 msgid "" -"Time-series line chart is used to visualize repeated measurements taken " -"over regular time intervals. Line chart is a type of chart which displays" -" information as a series of data points connected by straight line " -"segments. It is a basic type of chart common in many fields." +"By default, each filter loads at most 1000 choices at the initial page load. " +"Check this box if you have more than 1000 filter values and want to enable " +"dynamically searching that loads filter values as users type (may add stress to " +"your database)." msgstr "" -"Črtni grafikon časovne vrste je osnovni grafikon, ki se uporablja na " -"različnih področjih. Uporablja se za vizualizacijo meritev zajetih skozi " -"čas. Posamezne točke so med seboj povezane z ravnimi črtami." +"Privzeto vsak filter pri nalaganju začetne strani naloži največ 1000 možnosti. " +"Označite polje, če imate več kot 1000 vrednosti filtra in želite omogočiti " +"dinamično iskanje, ki nalaga vrednosti filtra ko uporabnik tipka (to lahko " +"preobremeni vašo podatkovno bazo)." -#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:98 -msgid "Timeout error" -msgstr "Napaka pretečenega časa" +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:253 +msgid "User must select a value for this filter" +msgstr "Uporabnik mora izbrati vrednost za ta filter" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:60 -msgid "Timestamp Format" -msgstr "Oblika časovne značke" +#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:281 +msgid "Filter configuration" +msgstr "Nastavitve filtra" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:73 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:372 -msgid "Timestamp format" -msgstr "Oblika zapisa časovne značke" +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:233 +msgid "Custom SQL ad-hoc filters are not available for the native Druid connector" +msgstr "Ad-hoc SQL filtri po meri niso na voljo za nativni konektor za Druid" -#: superset-frontend/src/components/ReportModal/index.tsx:378 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1223 -msgid "Timezone" -msgstr "Časovni pas" +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:296 +#, python-format +msgid "%s option(s)" +msgstr "Možnosti: %s" -#: superset/connectors/druid/views.py:312 superset/connectors/sqla/views.py:438 -msgid "Timezone offset (in hours) for this datasource" -msgstr "Razlika časovnega pasu (v urah) za ta podatkovni vir" +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:309 +msgid "Select subject" +msgstr "Izberite zadevo" -#: superset-frontend/src/components/TimezoneSelector/index.tsx:120 -msgid "Timezone selector" -msgstr "Izbira časovnega pasa" +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:312 +msgid "No such column found. To filter on a metric, try the Custom SQL tab." +msgstr "" +"Tak stolpec ni najden. Za filtriranje po meri uporabite prilagojen SQL zavihek." -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:35 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:69 -msgid "Tiny" -msgstr "Drobna" +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:320 +#, python-format +msgid "%s column(s) and metric(s)" +msgstr "Stolpcev in mer: %s" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:502 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:42 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:278 -#: superset/views/dashboard/mixin.py:79 superset/views/dashboard/views.py:156 -msgid "Title" -msgstr "Naslov" +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:331 +msgid "To filter on a metric, use Custom SQL tab." +msgstr "Za filtriranje po meri uporabite prilagojen SQL zavihek." -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:509 -msgid "Title Column" -msgstr "Stolpec z naslovi" +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:341 +#, python-format +msgid "%s operator(s)" +msgstr "Operatorji: %s" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:45 -#, fuzzy -msgid "Title is required" -msgstr "Zahtevana je vrednost" +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:347 +msgid "Select operator" +msgstr "Izberite operator" -#: superset/dashboards/filters.py:33 -msgid "Title or Slug" -msgstr "Naslov ali `Slug`" +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:356 +msgid "Comparator option" +msgstr "Možnosti komparatorja" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:287 -msgid "To filter on a metric, use Custom SQL tab." -msgstr "Za filtriranje po meri uporabite prilagojen SQL zavihek." +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:363 +msgid "Type a value here" +msgstr "Vnesite vrednost sem" -#: superset/views/dashboard/mixin.py:58 -msgid "To get a readable URL for your dashboard" -msgstr "Za pridobitev berljivega URL-ja za nadzorno ploščo" +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:496 +msgid "Filter value (case sensitive)" +msgstr "Vrednost filtra (razlik. velikih/malih črk)" + +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/useAdvancedDataTypes.ts:70 +msgid "Failed to retrieve advanced type" +msgstr "Napaka pri pridobivanju naprednega tipa" + +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:101 +msgid "choose WHERE or HAVING..." +msgstr "izberite WHERE ali HAVING..." -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:280 -msgid "Toggle chart description" -msgstr "Preklopi opis grafikona" +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:134 +msgid "Filters by columns" +msgstr "Filtrira po stolpcu" -#: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:25 -msgid "Tools" -msgstr "Orodja" +#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:136 +msgid "Filters by metrics" +msgstr "Filtrira po merah" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:184 -msgid "Tooltip" -msgstr "Opis orodja" +#: superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx:149 +msgid "Fixed" +msgstr "Fiksno" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:172 -msgid "Tooltip sort by metric" -msgstr "Mera za razvrščanje opisa orodja" +#: superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx:165 +msgid "Based on a metric" +msgstr "Osnovan na meri" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:162 -msgid "Tooltip time format" -msgstr "Oblika zapisa časa v opisu orodja" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.tsx:55 +msgid "My metric" +msgstr "Moja mera" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:289 -msgid "Top" -msgstr "Zgoraj" +#: superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.jsx:336 +msgid "Add metric" +msgstr "Dodaj mero" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:139 -msgid "Top to Bottom" -msgstr "Iz vrha proti dnu" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:309 +msgid "Select aggregate options" +msgstr "Izberite agregacijske možnosti" -#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:439 -msgid "Totals" -msgstr "Vsote" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:310 +#, python-format +msgid "%s aggregates(s)" +msgstr "Agreg. funkcije: %s" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:820 -msgid "Track job" -msgstr "Sledi opravilom" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:318 +msgid "Select saved metrics" +msgstr "Izberite shranjene mere" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:40 -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:46 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:77 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:83 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:82 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:76 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:77 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:67 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:76 -msgid "Transformable" -msgstr "Prilagodljiv" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:319 +#, python-format +msgid "%s saved metric(s)" +msgstr "Shranjene mere: %s" -#: superset-frontend/src/dashboard/util/backgroundStyleOptions.ts:25 -msgid "Transparent" -msgstr "Prozorno" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:369 +msgid "Saved metric" +msgstr "Shranjena mera" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:110 -msgid "Transpose Pivot" -msgstr "Transponirano vrtenje" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:385 +msgid "No saved metrics found" +msgstr "Shranjene mere niso najdene" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:173 -msgid "Transpose pivot" -msgstr "Transponirano vrtenje" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:386 +msgid "Add metrics to dataset in \"Edit datasource\" modal" +msgstr "Dodaj mero v podatkovni set v oknu \"Uredi podatkovni vir\"" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:39 -msgid "Tree Chart" -msgstr "Drevesni grafikon" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:397 +msgid "Simple ad-hoc metrics are not enabled for this dataset" +msgstr "Preproste ad-hoc mere za ta podatkovni set niso omogočene" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:117 -msgid "Tree layout" -msgstr "Oblika drevesa" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:409 +msgid "column" +msgstr "stolpec" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:134 -msgid "Tree orientation" -msgstr "Orientacija drevesa" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:420 +msgid "aggregate" +msgstr "agregacija" -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:40 -#: superset/viz.py:1003 -msgid "Treemap" -msgstr "Drevesni grafikon s pravokotniki" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:439 +msgid "Custom SQL ad-hoc metrics are not available for the native Druid connector" +msgstr "Ad-hoc SQL mere po meri niso na voljo za nativni konektor za Druid" -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:56 -msgid "Treemap v2" -msgstr "Drevesni grafikon s pravokotniki v2" +#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:442 +msgid "Custom SQL ad-hoc metrics are not enabled for this dataset" +msgstr "Ad-hoc SQL mere po meri za ta podatkovni set niso omogočene" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:37 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:37 -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:43 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:53 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:39 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:38 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:40 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:59 -#: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:36 -msgid "Trend" -msgstr "Trend" +#: superset-frontend/src/explore/components/controls/SelectAsyncControl/index.tsx:89 +#, python-format +msgid "Error while fetching data: %s" +msgstr "Napaka pri pridobivanju podatkov: %s" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:226 -msgid "Triangle" -msgstr "Trikotnik" +#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:48 +#: superset-frontend/src/visualizations/TimeTable/controlPanel.js:38 +msgid "Time series columns" +msgstr "Stolpci s časovnimi vrstami" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1168 -msgid "Trigger Alert If..." -msgstr "Sproži opozorilo v primeru ..." +#: superset-frontend/src/explore/components/controls/VizTypeControl/FastVizSwitcher.tsx:83 +msgid "Select Viz Type" +msgstr "Izberite tip vizualizacije" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:340 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:255 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:218 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:198 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:215 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:271 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:274 -msgid "Truncate Y Axis" -msgstr "Prireži Y-os" +#: superset-frontend/src/explore/components/controls/VizTypeControl/FastVizSwitcher.tsx:120 +#, python-format +msgid "Currently rendered: %s" +msgstr "Trenutno izrisano: %s" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:343 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:258 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:201 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:218 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:274 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:277 -msgid "Truncate Y Axis. Can be overridden by specifying a min or max bound." -msgstr "" -"Prireži Y-os. Če določite spodnjo ali zgornjo mejo, preprečite " -"prirezovanje." +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:124 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:734 +msgid "Other" +msgstr "Ostali" -#: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:58 -msgid "Truncates the specified date to the accuracy specified by the date unit." -msgstr "Zaokroži določen datum, glede na natančnost, definirano s časovno enoto." +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:666 +msgid "Recommended tags" +msgstr "Priporočene značke" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:222 -msgid "Try applying different filters or ensuring your datasource has data" -msgstr "" -"Poskusite uporabiti druge filtre oz. zagotovite, da so v podatkovnem viru" -" podatki" +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:671 +msgid "Category" +msgstr "Kategorija" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:58 -msgid "Tuesday" -msgstr "Torek" +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:676 +msgid "Tags" +msgstr "Značke" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:215 -#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:219 -#: superset-frontend/src/explore/components/controls/TimeSeriesColumnControl/index.jsx:276 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:288 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:466 -#: superset/connectors/druid/views.py:92 superset/connectors/druid/views.py:190 -#: superset/connectors/sqla/views.py:152 superset/connectors/sqla/views.py:258 -msgid "Type" -msgstr "Tip" +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:772 +msgid "Search all charts" +msgstr "Išči vse grafikone" -#: superset-frontend/src/components/DeleteModal/index.tsx:92 -#: superset-frontend/src/components/ImportModal/index.tsx:253 -#, python-format -msgid "Type \"%s\" to confirm" -msgstr "Vnesite \"%s\" za potrditev" +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:838 +msgid "No description available." +msgstr "Opisa ni na razpolago." -#: superset-frontend/src/components/ListView/Filters/Search.tsx:71 -msgid "Type a value" -msgstr "Vnesite vrednost" +#: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:845 +#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:183 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:197 +msgid "Examples" +msgstr "Vzorci" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:319 -msgid "Type a value here" -msgstr "Vnesite vrednost sem" +#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:63 +msgid "This visualization type is not supported." +msgstr "Ta tip vizualizacije ni podprt." -#: superset/reports/commands/exceptions.py:71 -msgid "Type is required" -msgstr "Tip je obvezen" +#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:125 +msgid "View all charts" +msgstr "Pokaži vse grafikone" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:73 -msgid "Type of Google Sheets allowed" -msgstr "Dovoljeni tipi Googlovih preglednic" +#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:131 +msgid "Select a visualization type" +msgstr "Izberite tip vizualizacije" -#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:379 -#, python-format -msgid "Type or Select [%s]" -msgstr "Vnesite ali izberite [%s]" +#: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:132 +msgid "Select" +msgstr "Izberi" -#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:51 -#: superset-frontend/src/filters/components/Range/controlPanel.ts:47 -#: superset-frontend/src/filters/components/Select/controlPanel.ts:57 -#: superset-frontend/src/filters/components/Time/controlPanel.ts:45 -#: superset-frontend/src/filters/components/TimeColumn/controlPanel.ts:25 -#: superset-frontend/src/filters/components/TimeGrain/controlPanel.ts:25 -msgid "UI Configuration" -msgstr "UI nastavitve" +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:122 +msgid "Superset Chart" +msgstr "Superset grafikon" -#: superset-frontend/src/explore/controlPanels/TimeTable.js:51 -msgid "URL" -msgstr "URL" +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:205 +msgid "New chart" +msgstr "Nov grafikon" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:76 -msgid "URL Parameters" -msgstr "Parametri URL" +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:261 +msgid "Edit chart properties" +msgstr "Uredi lastnosti grafikona" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:125 -#, fuzzy -msgid "URL could not be identified" -msgstr "Grafikona ni mogoče izbrisati." +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:274 +msgid "Export to original .CSV" +msgstr "Izvozi v izvorni .CSV" -#: superset-frontend/src/explore/controlPanels/sections.tsx:60 -msgid "URL parameters" -msgstr "Parametri URL" +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:281 +msgid "Export to pivoted .CSV" +msgstr "Izvozi v vrtilni .CSV" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:514 -msgid "URL slug" -msgstr "URL slug" +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:294 +msgid "Export to .JSON" +msgstr "Izvozi v .JSON" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:531 -msgid "Unable to add a new tab to the backend. Please contact your administrator." -msgstr "Novega zavihka ni mogoče dodati v sistem. Kontaktirajte administratorja." +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:313 +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:315 +msgid "Embed code" +msgstr "Vgradi kodo" -#: superset/db_engine_specs/presto.py:218 -#, python-format -msgid "Unable to connect to catalog named \"%(catalog_name)s\"." -msgstr "Povezava na katalog \"%(catalog_name)s\" ni uspela." +#: superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx:370 +msgid "Run in SQL Lab" +msgstr "Zaženi v SQL laboratoriju" -#: superset/db_engine_specs/mysql.py:139 -#: superset/db_engine_specs/postgres.py:145 -#, python-format -msgid "Unable to connect to database \"%(database)s\"." -msgstr "Povezava s podatkovno bazo \"%(database)s\" ni uspela." +#: superset-frontend/src/explore/controlPanels/Separator.js:25 +#: superset-frontend/src/explore/controlPanels/Separator.js:46 +msgid "Code" +msgstr "Koda" -#: superset/utils/date_parser.py:390 -#, python-format -msgid "Unable to find such a holiday: [%(holiday)s]" -msgstr "Ni mogoče najti takšnega praznika: [%(holiday)s]" +#: superset-frontend/src/explore/controlPanels/Separator.js:32 +msgid "Markup type" +msgstr "Tip označevanja" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:498 -msgid "" -"Unable to migrate query editor state to backend. Superset will retry " -"later. Please contact your administrator if this problem persists." -msgstr "" -"Stanja urejevalnika poizvedb ni mogoče prenesti v sistem. Superset bo " -"ponovil poskus kasneje. Če se težava ponavlja, kontaktirajte " -"administratorja." +#: superset-frontend/src/explore/controlPanels/Separator.js:37 +msgid "Pick your favorite markup language" +msgstr "Izberite svoj priljubljen označevalni jezik" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:452 -msgid "" -"Unable to migrate query state to backend. Superset will retry later. " -"Please contact your administrator if this problem persists." -msgstr "" -"Stanja poizvedbe ni mogoče prenesti v sistem. Superset bo ponovil poskus " -"kasneje. Če se težava ponavlja, kontaktirajte administratorja." +#: superset-frontend/src/explore/controlPanels/Separator.js:47 +msgid "Put your code here" +msgstr "Vstavite svojo kodo sem" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:434 -msgid "" -"Unable to migrate table schema state to backend. Superset will retry " -"later. Please contact your administrator if this problem persists." -msgstr "" -"Stanja sheme tabele ni mogoče prenesti v sistem. Superset bo ponovil " -"poskus kasneje. Če se težava ponavlja, kontaktirajte administratorja." +#: superset-frontend/src/explore/controlPanels/sections.tsx:60 +msgid "URL parameters" +msgstr "Parametri URL" -#: superset/connectors/sqla/views.py:641 -#, python-format -msgid "Unable to refresh metadata for the following table(s): %(tables)s" -msgstr "Ni mogoče osvežiti metapodatkov za naslednje tabele: %(tables)s" +#: superset-frontend/src/explore/controlPanels/sections.tsx:62 +msgid "Extra parameters for use in jinja templated queries" +msgstr "Dodatni parametri za poizvedbe z jinja predlogami" -#: superset/views/database/views.py:240 -#, python-format -msgid "" -"Unable to upload CSV file \"%(filename)s\" to table \"%(table_name)s\" in" -" database \"%(db_name)s\". Error message: %(error_msg)s" -msgstr "" -"CSV datoteke \"%(filename)s\" ni mogoče naložiti v tabelo " -"\"%(table_name)s\" v podatkovni bazi \"%(db_name)s\". Sporočilo napake: " -"%(error_msg)s" +#: superset-frontend/src/explore/controlPanels/sections.tsx:82 +msgid "Annotations and layers" +msgstr "Oznake in sloji" -#: superset/views/database/views.py:538 -#, python-format -msgid "" -"Unable to upload Columnar file \"%(filename)s\" to table " -"\"%(table_name)s\" in database \"%(db_name)s\". Error message: " -"%(error_msg)s" -msgstr "" -"Stolpčne datoteke \"%(filename)s\" ni mogoče naložiti v tabelo " -"\"%(table_name)s\" v podatkovni bazi \"%(db_name)s\". Sporočilo napake: " -"%(error_msg)s" +#: superset-frontend/src/explore/controlUtils/controlUtils.test.tsx:73 +msgid "My beautiful colors" +msgstr "Moje čudovite barve" + +#: superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx:84 +msgid "No columns" +msgstr "Brez stolpcev" -#: superset/views/database/views.py:386 +#: superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx:85 +#: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:260 +#: superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx:84 +#: superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx:94 #, python-format -msgid "" -"Unable to upload Excel file \"%(filename)s\" to table \"%(table_name)s\" " -"in database \"%(db_name)s\". Error message: %(error_msg)s" -msgstr "" -"Excel datoteke \"%(filename)s\" ni mogoče naložiti v tabelo " -"\"%(table_name)s\" v podatkovni bazi \"%(db_name)s\". Sporočilo napake: " -"%(error_msg)s" +msgid "%s option" +msgstr "%s možnost" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:75 -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:114 -msgid "Undefined" -msgstr "Ni definirano" +#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:51 +#: superset-frontend/src/filters/components/Range/controlPanel.ts:47 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:57 +#: superset-frontend/src/filters/components/Time/controlPanel.ts:45 +#: superset-frontend/src/filters/components/TimeColumn/controlPanel.ts:25 +#: superset-frontend/src/filters/components/TimeGrain/controlPanel.ts:25 +msgid "UI Configuration" +msgstr "UI nastavitve" -#: superset/utils/pandas_postprocessing.py:391 -msgid "Undefined window for rolling operation" -msgstr "Nedefinirano okno za drsečo operacijo" +#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:59 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:77 +msgid "Can select multiple values" +msgstr "Dovoli izbiro več vrednosti" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FilterTitleContainer.tsx:126 -msgid "Undo?" -msgstr "Povrni?" +#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:72 +#: superset-frontend/src/filters/components/Range/controlPanel.ts:55 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:90 +#: superset-frontend/src/filters/components/Time/controlPanel.ts:53 +#: superset-frontend/src/filters/components/TimeColumn/controlPanel.ts:33 +#: superset-frontend/src/filters/components/TimeGrain/controlPanel.ts:33 +msgid "Filter value is required" +msgstr "Vrednost filtra je obvezna" -#: superset-frontend/src/components/ErrorBoundary/index.jsx:51 -#: superset-frontend/src/components/ErrorMessage/ErrorMessageWithStackTrace.tsx:26 -msgid "Unexpected error" -msgstr "Nepričakovana napaka" +#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:75 +#: superset-frontend/src/filters/components/Range/controlPanel.ts:58 +#: superset-frontend/src/filters/components/Select/controlPanel.ts:93 +#: superset-frontend/src/filters/components/Time/controlPanel.ts:56 +#: superset-frontend/src/filters/components/TimeColumn/controlPanel.ts:36 +#: superset-frontend/src/filters/components/TimeGrain/controlPanel.ts:36 +msgid "User must select a value before applying the filter" +msgstr "Uporabnik mora izbrati vrednost pred uporabo filtra" -#: superset/databases/commands/exceptions.py:135 superset/views/core.py:1391 -msgid "Unexpected error occurred, please check your logs for details" -msgstr "Zgodila se je nepričakovana napaka. Podrobnosti preverite v dnevnikih" +#: superset-frontend/src/filters/components/GroupBy/index.ts:29 +msgid "Group By filter plugin" +msgstr "Vtičnik za filter za združevanje" -#: superset-frontend/src/utils/getClientErrorObject.ts:55 -msgid "Unexpected error: " -msgstr "Nepričakovana napaka: " +#: superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx:283 +msgid "Chosen non-numeric column" +msgstr "Izbran ne-numeričen stolpec" -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:95 -msgid "Unknown" -msgstr "Neznano" +#: superset-frontend/src/filters/components/Range/controlPanel.ts:67 +msgid "Single value" +msgstr "Ena vrednost" -#: superset/db_engine_specs/mysql.py:129 -#, python-format -msgid "Unknown MySQL server host \"%(hostname)s\"." -msgstr "Neznan MySQL strežnik \"%(hostname)s\"." +#: superset-frontend/src/filters/components/Range/controlPanel.ts:70 +msgid "Use only a single value." +msgstr "Uporabite le eno vrednost." -#: superset/db_engine_specs/presto.py:1005 -msgid "Unknown Presto Error" -msgstr "Neznana Presto napaka" +#: superset-frontend/src/filters/components/Range/index.ts:29 +msgid "Range filter plugin using AntD" +msgstr "Vtičnik za filter obdobja z uporabo AntD" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:111 -msgid "Unknown Status" -msgstr "Neznan status" +#: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:125 +msgid " (excluded)" +msgstr " (ni vključeno)" -#: superset/connectors/sqla/models.py:1121 -#, python-format -msgid "Unknown column used in orderby: %(col)s" -msgstr "Za razvrščanje je uporabljen neznan stolpec: %(col)s" +#: superset-frontend/src/filters/components/Select/controlPanel.ts:104 +msgid "Select first filter value by default" +msgstr "Izberi prvo vrednost kot privzeto" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:349 -#: superset-frontend/src/SqlLab/actions/sqlLab.js:389 -msgid "Unknown error" -msgstr "Neznana napaka" +#: superset-frontend/src/filters/components/Select/controlPanel.ts:110 +msgid "When using this option, default value can’t be set" +msgstr "Če uporabite to možnost, privzeta vrednost ne more biti nastavljena" -#: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils/index.ts:45 -msgid "Unknown value" -msgstr "Neznana vrednost" +#: superset-frontend/src/filters/components/Select/controlPanel.ts:123 +msgid "Inverse selection" +msgstr "Invertiraj izbiro" -#: superset/jinja_context.py:347 -#, python-format -msgid "Unsafe return type for function %(func)s: %(value_type)s" -msgstr "Nevaren tip rezultata, ki ga vrne funkcija %(func)s: %(value_type)s" +#: superset-frontend/src/filters/components/Select/controlPanel.ts:125 +msgid "Exclude selected values" +msgstr "Izloči izbrane vrednosti" -#: superset/jinja_context.py:371 -#, python-format -msgid "Unsafe template value for key %(key)s: %(value_type)s" -msgstr "Nevaren vzorec za ključ %(key)s: %(value_type)s" +#: superset-frontend/src/filters/components/Select/controlPanel.ts:136 +msgid "Dynamically search all filter values" +msgstr "Dinamično poišče vse možnosti filtra" -#: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:255 -#, python-format -msgid "Unset Filters (%d)" -msgstr "Neuporabljeni filtri (%d)" +#: superset-frontend/src/filters/components/Select/index.ts:29 +msgid "Select filter plugin using AntD" +msgstr "Izberite Vtičnik za filter z uporabo AntD" -#: superset/utils/core.py:1048 -#, python-format -msgid "Unsupported clause type: %(clause)s" -msgstr "Nepodprt tip izraza: %(clause)s" +#: superset-frontend/src/filters/components/Time/index.ts:28 +msgid "Custom time filter plugin" +msgstr "Prilagojeni vtičnik za časovni filter" -#: superset/connectors/druid/models.py:1492 -msgid "Unsupported extraction function: " -msgstr "Nepodprta ekstrakcijska funkcija: " +#: superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx:83 +msgid "No time columns" +msgstr "Ni časovnih stolpcev" -#: superset/common/query_object.py:392 -#, python-format -msgid "Unsupported post processing operation: %(operation)s" -msgstr "Nepodprta poprocesirna operacija: %(operation)s" +#: superset-frontend/src/filters/components/TimeColumn/index.ts:29 +msgid "Time column filter plugin" +msgstr "Vtičnik za časovni filter" -#: superset/jinja_context.py:358 -#, python-format -msgid "Unsupported return value for method %(name)s" -msgstr "Nepodprt rezultat vračanja za metodo %(name)s" +#: superset-frontend/src/filters/components/TimeGrain/index.ts:29 +msgid "Time grain filter plugin" +msgstr "Vtičnik za filter časovne granulacije" -#: superset/jinja_context.py:382 -#, python-format -msgid "Unsupported template value for key %(key)s" -msgstr "Nepodprta vrednost vzorca za ključ %(key)s" +#: superset-frontend/src/profile/components/App.tsx:52 +msgid "Favorites" +msgstr "Priljubljene" -#: superset/utils/pandas_postprocessing.py:818 -#, python-format -msgid "Unsupported time grain: %(time_grain)s" -msgstr "Nepodprta časovna granulacija: %(time_grain)s" +#: superset-frontend/src/profile/components/App.tsx:62 +msgid "Created content" +msgstr "Ustvarjena vsebina" -#: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:264 -#, python-format -msgid "Untitled Query %s" -msgstr "Neimenovana poizvedba %s" +#: superset-frontend/src/profile/components/App.tsx:72 +msgid "Recent activity" +msgstr "Nedavna aktivnost" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:331 -#: superset-frontend/src/SqlLab/reducers/getInitialState.js:44 -msgid "Untitled query" -msgstr "Neimenovana poizvedba" +#: superset-frontend/src/profile/components/App.tsx:82 +msgid "Security & Access" +msgstr "Varnost in Dostopi" -#: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:190 -msgid "Update" -msgstr "Posodobi" +#: superset-frontend/src/profile/components/CreatedContent.tsx:46 +msgid "No charts" +msgstr "Ni grafikonov" -#: superset-frontend/src/chart/chartReducer.ts:82 -msgid "Updating chart was stopped" -msgstr "Posodabljanje grafikona je bilo ustavljeno" +#: superset-frontend/src/profile/components/CreatedContent.tsx:74 +msgid "No dashboards" +msgstr "Ni nadzornih plošč" -#: superset/templates/superset/import_dashboards.html:63 -msgid "Upload" -msgstr "Naloži" +#: superset-frontend/src/profile/components/Favorites.tsx:47 +msgid "No favorite charts yet, go click on stars!" +msgstr "Priljubljenih grafikonov še ni. Kliknite na zvezdice!" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:134 -msgid "Upload Credentials" -msgstr "Naloži prijavne podatke" +#: superset-frontend/src/profile/components/Favorites.tsx:75 +msgid "No favorite dashboards yet, go click on stars!" +msgstr "Priljubljenih nadzornih plošč še ni. Kliknite na zvezdice!" -#: superset/initialization/__init__.py:400 -msgid "Upload Excel" -msgstr "Naloži Excel" +#: superset-frontend/src/profile/components/UserInfo.tsx:44 +msgid "Profile picture provided by Gravatar" +msgstr "Profilno sliko je zagotovil Gravatar" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:102 -msgid "Upload JSON file" -msgstr "Naloži JSON datoteko" +#: superset-frontend/src/profile/components/UserInfo.tsx:64 +msgid "joined" +msgstr "pridružen" -#: superset/initialization/__init__.py:369 -msgid "Upload a CSV" -msgstr "Naloži CSV" +#: superset-frontend/src/profile/components/UserInfo.tsx:75 +msgid "id:" +msgstr "id:" -#: superset/initialization/__init__.py:383 -msgid "Upload a Columnar File" -msgstr "Naloži datoteko s stolpci" +#: superset-frontend/src/reports/actions/reports.js:67 +msgid "There was an issue fetching reports attached to this dashboard." +msgstr "Pri pridobivanju poročil za to nadzorno ploščo je prišlo do težave." -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:112 -msgid "Use Area Proportions" -msgstr "Uporabi razmerje površin" +#: superset-frontend/src/reports/actions/reports.js:109 +msgid "The report has been created" +msgstr "Poročilo je bilo ustvarjeno" -#: superset/views/database/forms.py:175 superset/views/database/forms.py:433 -msgid "Use Columns" -msgstr "Uporabi stolpce" +#: superset-frontend/src/reports/actions/reports.js:120 +msgid "Report updated" +msgstr "Poročilo posodobljeno" -#: superset/views/database/forms.py:211 -msgid "Use Pandas to interpret the datetime format automatically." -msgstr "Uporabi Pandas za samodejno prepoznavo oblike datumov/časov." +#: superset-frontend/src/reports/actions/reports.js:135 +msgid "We were unable to active or deactivate this report." +msgstr "Aktiviranje ali deaktiviranje poročila ni uspelo." -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:207 -msgid "Use a log scale" -msgstr "Uporabi logaritemsko skalo" +#: superset-frontend/src/reports/actions/reports.js:151 +msgid "Your report could not be deleted" +msgstr "Vašega poročila ni mogoče izbrisati" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:107 -msgid "Use a log scale for the X-axis" -msgstr "Uporabi logaritemsko skalo za X-os" +#: superset-frontend/src/reports/actions/reports.js:155 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:161 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:117 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:90 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:93 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:153 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:601 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:234 +#: superset-frontend/src/views/CRUD/utils.tsx:274 +#: superset-frontend/src/views/CRUD/utils.tsx:313 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:173 +#, python-format +msgid "Deleted: %s" +msgstr "Izbrisano: %s" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:230 -msgid "Use a log scale for the Y-axis" -msgstr "Uporabi logaritemsko skalo za Y-os" +#: superset-frontend/src/utils/downloadAsImage.ts:62 +msgid "Image download failed, please refresh and try again." +msgstr "Prenos slike ni uspel. Osvežite in poskusite ponovno." -#: superset/db_engine_specs/base.py:1401 -msgid "Use an encrypted connection to the database" -msgstr "Uporabite šifrirano povezavo s podatkovno bazo" +#: superset-frontend/src/utils/getChartRequiredFieldsMissingMessage.ts:23 +#, python-format +msgid "" +"Select values in highlighted field(s) in the control panel. Then run the query by " +"clicking on the %s button." +msgstr "" +"Izberite vrednosti v osvetljenih poljih na levi strani kontrolnika in zaženite " +"poizvedbo z gumbom %s." -#: superset-frontend/src/components/Datasource/DatasourceModal.tsx:209 -msgid "Use legacy datasource editor" -msgstr "Uporabi starejši urejevalnik podatkovnega vira" +#: superset-frontend/src/utils/getClientErrorObject.ts:56 +msgid "Invalid input" +msgstr "Neveljaven vnos" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:85 -msgid "Use metrics as a top level group for columns or for rows" -msgstr "Uporabi mere kot vrhovni nivo grupiranja za stolpce ali vrstice" +#: superset-frontend/src/utils/getClientErrorObject.ts:62 +msgid "Unexpected error: " +msgstr "Nepričakovana napaka: " -#: superset-frontend/src/filters/components/Range/controlPanel.ts:68 -msgid "Use only a single value." -msgstr "" +#: superset-frontend/src/utils/getClientErrorObject.ts:63 +msgid "(no description, click to see stack trace)" +msgstr "(ni opisa, kliknite za ogled zapisov)" -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:124 -msgid "Use the Advanced Analytics options below" -msgstr "Uporabite spodnje možnosti napredne analitike" +#: superset-frontend/src/utils/getClientErrorObject.ts:96 +msgid "Network error" +msgstr "Napaka omrežja" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:136 -msgid "" -"Use the JSON file you automatically downloaded when creating your service" -" account." -msgstr "" -"Uporabite JSON datoteko, ki ste jo prenesli pri ustvarjanju servisnega " -"računa." +#: superset-frontend/src/utils/getClientErrorObject.ts:108 +msgid "Request timed out" +msgstr "Zahtevek pretečen" -#: superset/templates/superset/fab_overrides/list_with_checkboxes.html:82 -msgid "Use the edit buttom to change this field" -msgstr "Za spreminjanje tega polja uporabite gumb za urejanje" +#: superset-frontend/src/utils/getClientErrorObject.ts:117 +msgid "Issue 1000 - The dataset is too large to query." +msgstr "Težava 1000 - podatkovni vir je prevelik za poizvedbo." -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:176 -#: superset-frontend/src/explore/controls.jsx:207 -msgid "Use this to define a static color for all circles" -msgstr "S tem definirate določeno barvo za vse kroge" +#: superset-frontend/src/utils/getClientErrorObject.ts:121 +msgid "Issue 1001 - The database is under an unusual load." +msgstr "Težava 1001 - podatkovni vir je neobičajno obremenjen." -#: superset/views/dynamic_plugins.py:48 -msgid "" -"Used internally to identify the plugin. Should be set to the package name" -" from the pluginʼs package.json" -msgstr "" -"Uporablja se za interno identifikacijo vtičnika. Naj bo nastavljeno na " -"ime paketa v vtičnikovem package.json" +#: superset-frontend/src/views/CRUD/hooks.ts:103 +#, python-format +msgid "An error occurred while fetching %s info: %s" +msgstr "Napaka pri pridobivanju informacij za %s: %s" -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:27 -#, fuzzy -msgid "" -"Used to summarize a set of data by grouping together multiple statistics " -"along two axes. Examples: Sales numbers by region and month, tasks by " -"status and assignee, active users by age and location.\n" -"\n" -" This chart is being deprecated and we recommend checking out Pivot " -"Table V2 instead!" -msgstr "" -"Uporablja se za predstavitev podatkov z združevanjem različnih statistik " -"na dveh oseh. Npr. Prodaja po regijah in mesecih, Naloge po statusih in " -"izvajalcih, aktivni uporabniki po starosti in lokaciji.\r\n" -"\r\n" -" Ta grafikon se opušča. Priporočamo uporabo Vrtilne tabele V2!" +#: superset-frontend/src/views/CRUD/hooks.ts:171 +#: superset-frontend/src/views/CRUD/hooks.ts:258 +#: superset-frontend/src/views/CRUD/hooks.ts:344 +#, python-format +msgid "An error occurred while fetching %ss: %s" +msgstr "Napaka pri pridobivanju informacij za %s: %s" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:51 -msgid "" -"Used to summarize a set of data by grouping together multiple statistics " -"along two axes. Examples: Sales numbers by region and month, tasks by " -"status and assignee, active users by age and location. Not the most " -"visually stunning visualization, but highly informative and versatile." -msgstr "" -"Ponazori podatke na podlagi združevanja več statistik vzdolž dveh osi. " -"Npr. prodaja po regijah in mesecih, opravila po statusih in izvajalcih, " -"itd." +#: superset-frontend/src/views/CRUD/hooks.ts:301 +#, python-format +msgid "An error occurred while creating %ss: %s" +msgstr "Napaka pri ustvarjanju %s: %s" -#: superset-frontend/src/components/Menu/MenuRight.tsx:158 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:275 -#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:365 -#: superset/views/access_requests.py:41 superset/views/log/__init__.py:30 -#: superset/views/schedules.py:239 superset/views/schedules.py:319 -#: superset/views/sql_lab.py:69 -msgid "User" -msgstr "Uporabnik" +#: superset-frontend/src/views/CRUD/hooks.ts:451 +#: superset-frontend/src/views/CRUD/hooks.ts:467 +#, python-format +msgid "An error occurred while importing %s: %s" +msgstr "Napaka pri uvažanju %s: %s" -#: superset/views/access_requests.py:42 -msgid "User Roles" -msgstr "Vloge uporabnikov" +#: superset-frontend/src/views/CRUD/hooks.ts:538 +#, python-format +msgid "There was an error fetching the favorite status: %s" +msgstr "Napaka pri pridobivanju statusa \"Priljubljeno\": %s" + +#: superset-frontend/src/views/CRUD/hooks.ts:559 +#, python-format +msgid "There was an error saving the favorite status: %s" +msgstr "Napaka pri shranjevanju statusa \"Priljubljeno\": %s" -#: superset/errors.py:112 -msgid "User doesn't have the proper permissions." -msgstr "Uporabnik nima ustreznih dovoljenj." +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:218 +#: superset-frontend/src/views/CRUD/hooks.ts:620 +msgid "Link Copied!" +msgstr "Povezava kopirana!" -#: superset-frontend/src/filters/components/Select/controlPanel.ts:94 -msgid "User must select a value before applying the filter" -msgstr "Uporabnik mora izbrati vrednost pred uporabo filtra" +#: superset-frontend/src/views/CRUD/data/components/SyntaxHighlighterCopy/index.tsx:76 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:221 +#: superset-frontend/src/views/CRUD/hooks.ts:623 +msgid "Sorry, your browser does not support copying." +msgstr "Vaš brskalnik ne podpira kopiranja." -#: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:253 -msgid "User must select a value for this filter" -msgstr "Uporabnik mora izbrati vrednost za ta filter" +#: superset-frontend/src/views/CRUD/hooks.ts:644 +msgid "Connection looks good!" +msgstr "Povezava izgleda v redu!" -#: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:76 -#: superset-frontend/src/filters/components/Range/controlPanel.ts:58 -#: superset-frontend/src/filters/components/Time/controlPanel.ts:56 -#: superset-frontend/src/filters/components/TimeColumn/controlPanel.ts:36 -#: superset-frontend/src/filters/components/TimeGrain/controlPanel.ts:36 -msgid "User must select a value for this filter." -msgstr "Uporabnik mora izbrati vrednost za ta filter." +#: superset-frontend/src/views/CRUD/hooks.ts:647 +#, python-format +msgid "ERROR: %s" +msgstr "NAPAKA: %s" -#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:154 -msgid "User query" -msgstr "Uporabnikova poizvedba" +#: superset-frontend/src/views/CRUD/utils.tsx:209 +msgid "There was an error fetching your recent activity:" +msgstr "Pri pridobivanju nedavnih aktivnosti je prišlo do napake:" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:109 -#: superset/db_engine_specs/base.py:1388 -msgid "Username" -msgstr "Uporabniško ime" +#: superset-frontend/src/views/CRUD/utils.tsx:277 +#, python-format +msgid "There was an issue deleting: %s" +msgstr "Težava pri brisanju: %s" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:39 -msgid "" -"Uses a gauge to showcase progress of a metric towards a target. The " -"position of the dial represents the progress and the terminal value in " -"the gauge represents the target value." -msgstr "" -"Uporablja števec za prikaz napredovanja mere k ciljni vrednosti. Položaj " -"kazalca predstavlja napredek, končna vrednost na števcu pa ciljno " -"vrednost." +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:164 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:121 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:93 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:97 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:159 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:605 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:237 +#: superset-frontend/src/views/CRUD/utils.tsx:317 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:176 +#, python-format +msgid "There was an issue deleting %s: %s" +msgstr "Težava pri brisanju %s: %s" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:28 -msgid "" -"Uses circles to visualize the flow of data through different stages of a " -"system. Hover over individual paths in the visualization to understand " -"the stages a value took. Useful for multi-stage, multi-group visualizing " -"funnels and pipelines." -msgstr "" -"S pomočjo krogov prikaže potek podatkov na različnih nivojih sistema. S " -"premikom kurzorja prikaže vrednosti na posameznem nivoju. Uporabno za " -"večnivojsko, večskupinsko vizualizacijo." +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:54 +msgid "Working" +msgstr "Delam" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:294 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1186 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1202 -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:140 -msgid "Value" -msgstr "Vrednost" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:56 +msgid "Not triggered" +msgstr "Ni sproženo" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:91 -msgid "Value Domain" -msgstr "Domena vrednosti" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:57 +msgid "On Grace" +msgstr "V mirovanju" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:329 -msgid "Value Format" -msgstr "Oblika zapisa vrednosti" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:89 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:489 +msgid "report" +msgstr "poročilo" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:235 -msgid "Value bounds" -msgstr "Meje vrednosti" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:89 +msgid "alert" +msgstr "opozorilo" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:165 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:206 -msgid "Value format" -msgstr "Oblika zapisa vrednosti" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:90 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:116 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:125 +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:75 +msgid "reports" +msgstr "poročila" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx:75 -msgid "Value is required" -msgstr "Zahtevana je vrednost" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:90 +msgid "alerts" +msgstr "opozorila" -#: superset/reports/schemas.py:185 superset/reports/schemas.py:191 -#: superset/reports/schemas.py:197 superset/reports/schemas.py:275 -#: superset/reports/schemas.py:281 superset/reports/schemas.py:288 -msgid "Value must be greater than 0" -msgstr "Vrednost mora biti večja od 0" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:179 +#, python-format +msgid "There was an issue deleting the selected %s: %s" +msgstr "Težava pri brisanju izbranih %s: %s" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:39 -msgid "Vehicle Types" -msgstr "Vrste vozil" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:227 +msgid "Last run" +msgstr "Zadnji zagon" -#: superset/connectors/druid/views.py:189 -#: superset/connectors/druid/views.py:238 superset/connectors/sqla/views.py:144 -#: superset/connectors/sqla/views.py:257 -msgid "Verbose Name" -msgstr "Podrobno ime" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:262 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1387 +msgid "Notification method" +msgstr "Način obveščanja" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:482 -msgid "Version" -msgstr "Verzija" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:273 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:417 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:211 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:285 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:361 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:507 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:192 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:273 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:326 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:479 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:349 +msgid "Created by" +msgstr "Ustvaril" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:489 -msgid "Version number" -msgstr "Številka verzije" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:308 +msgid "Active" +msgstr "Aktiven" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:41 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:48 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:84 -msgid "Vertical" -msgstr "Navpično" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:325 +msgid "Execution log" +msgstr "Dnevnik izvajanja" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:38 -msgid "Video game consoles" -msgstr "Igralne konzole" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:353 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:203 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:248 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:448 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:229 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:420 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:432 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:448 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:309 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:415 +msgid "Actions" +msgstr "Aktivnosti" -#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:217 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:219 -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:296 -msgid "View All »" -msgstr "" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:380 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:226 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:276 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:640 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:262 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:593 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:550 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:169 +msgid "Bulk select" +msgstr "Izberi hkrati" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:287 -msgid "View chart in Explore" -msgstr "Ogled grafikona v Raziskovalcu" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:388 +#, python-format +msgid "No %s yet" +msgstr "%s še ne obstajajo" -#: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:197 -msgid "View in SQL Lab" -msgstr "Ogled v SQL laboratoriju" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:401 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:486 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:458 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:460 +msgid "Owner" +msgstr "Lastnik" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:166 +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:410 #, python-format -msgid "View keys & indexes (%s)" -msgstr "Ogled ključev in indeksov (%s)" +msgid "An error occurred while fetching owners values: %s" +msgstr "Pri pridobivanju polja lastnik je prišlo do napake: %s" -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:296 -#: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:298 -#: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:86 -#: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:88 -msgid "View query" -msgstr "Ogled poizvedbe" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:426 +#, python-format +msgid "An error occurred while fetching created by values: %s" +msgstr "Pri pridobivanju vrednosti \"Ustvaril\" je prišlo do napake: %s" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:216 -#: superset-frontend/src/explore/components/DataTablesPane/index.tsx:396 -msgid "View results" -msgstr "Ogled rezultatov" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:433 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:305 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:500 +msgid "Status" +msgstr "Status" -#: superset-frontend/src/explore/components/DataTablesPane/index.tsx:409 -msgid "View samples" -msgstr "Ogled vzorcev" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:466 +msgid "Alerts & reports" +msgstr "Opozorila in poročila" -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:180 -msgid "Viewed" -msgstr "Ogledane" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:470 +msgid "Alerts" +msgstr "Opozorila" -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:124 -#, fuzzy, python-format -msgid "Viewed %s" -msgstr "Ogledane" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:477 +msgid "Reports" +msgstr "Poročila" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:268 -msgid "Viewport" -msgstr "Pogled" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:515 +#, python-format +msgid "Delete %s?" +msgstr "Izbrišem %s?" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:133 -msgid "Virtual (SQL)" -msgstr "Virtualen (SQL)" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:519 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:297 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:357 +#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:78 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:385 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:687 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:325 +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:106 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:358 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:632 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:664 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:501 +msgid "Please confirm" +msgstr "Prosim, potrdite" -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:231 -msgid "Virtual dataset" -msgstr "Virtualen podatkovni set" +#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:520 +#, python-format +msgid "Are you sure you want to delete the selected %s?" +msgstr "Ali ste prepričani, da želite izbrisati izbrane %s?" -#: superset/connectors/sqla/models.py:849 superset/connectors/sqla/utils.py:83 -msgid "Virtual dataset query cannot be empty" -msgstr "Poizvedba na virtualnem podatkovnem setu ne sme biti prazna" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:89 +msgid "< (Smaller than)" +msgstr "< (manjše kot)" -#: superset/connectors/sqla/models.py:852 -msgid "Virtual dataset query cannot consist of multiple statements" -msgstr "" -"Poizvedba na virtualnem podatkovnem setu ne sme biti sestavljena iz več " -"stavkov" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:93 +msgid "> (Larger than)" +msgstr "> (večje kot)" -#: superset/connectors/sqla/models.py:825 -msgid "Virtual dataset query must be read-only" -msgstr "Poizvedba na virtualnem podatkovnem setu mora biti samo za branje" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:97 +msgid "<= (Smaller or equal)" +msgstr "<= (manjše ali enako)" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:192 -msgid "Visual Tweaks" -msgstr "Nastavitve izgleda" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:101 +msgid ">= (Larger or equal)" +msgstr ">= (večje ali enako)" -#: superset-frontend/src/dashboard/components/AddSliceCard.jsx:132 -msgid "Visualization" -msgstr "Vizualizacija" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:105 +msgid "== (Is equal)" +msgstr "== (je enako)" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:168 -#: superset/views/chart/mixin.py:88 -msgid "Visualization Type" -msgstr "Tip vizualizacije" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:109 +msgid "!= (Is not equal)" +msgstr "!= (ni enako)" -#: superset-frontend/src/explore/controls.jsx:200 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:270 -msgid "Visualization type" -msgstr "Tip vizualizacije" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:113 +msgid "Not null" +msgstr "Ni nič (null)" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:50 -msgid "" -"Visualize a parallel set of metrics across multiple groups. Each group is" -" visualized using its own line of points and each metric is represented " -"as an edge in the chart." -msgstr "" -"Prikaže vzporedni nabor mer za različne skupine. Vsaka skupina je " -"prikazana s svojim naborom točk in vsaka mera s povezavo na grafikonu." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:124 +msgid "30 days" +msgstr "30 dni" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:30 -msgid "" -"Visualize a related metric across pairs of groups. Heatmaps excel at " -"showcasing the correlation or strength between two groups. Color is used " -"to emphasize the strength of the link between each pair of groups." -msgstr "Vizualizacija povezanih mer med pari skupin." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:128 +msgid "60 days" +msgstr "60 dni" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:31 -msgid "" -"Visualize how a metric changes over time using bars. Add a group by " -"column to visualize group level metrics and how they change over time." -msgstr "" -"Prikaže spreminjanje mere skozi čas s pomočjo stolpcev. Z dodajanjem " -"stolpcev za združevanje prikaže mere skupin in njihovo spreminjanje." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:132 +msgid "90 days" +msgstr "90 dni" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:35 -msgid "" -"Visualize multiple levels of hierarchy using a familiar tree-like " -"structure." -msgstr "Prikaz več hierarhičnih nivojev z drevesno strukturo." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:389 +msgid "Add notification method" +msgstr "Dodajte način obveščanja" -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:58 -msgid "" -"Visualize two different time series using the same x-axis time range. " -"Note that each time series can be visualized differently (e.g. 1 using " -"bars and 1 using a line)." -msgstr "" -"Prikaže dve različni časovni vrsti na isti x-osi. Časovni vrsti sta lahko" -" prikazani različno (npr. ena s stolpci in druga s črto)." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:390 +msgid "Add delivery method" +msgstr "Dodajte način dostave" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:27 -msgid "" -"Visualize two different time series using the same x-axis time range. " -"This chart is being deprecated and we recommend using the Mixed " -"Timeseries Chart instead!" -msgstr "" -"Prikaže dve različni časovni vrsti z isto x-osjo oz. časovnim obdobjem. " -"Grafikon se opušča, zato priporočamo uporabo kombiniranega grafikona " -"časovne vrste!" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:562 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:578 +#, python-format +msgid "%s updated" +msgstr "%s posodobljeni" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:27 -msgid "" -"Visualizes 2 metrics as line plots using the same x-axis. This chart is " -"useful for comparing metrics across the same time range." -msgstr "" -"Prikaže dve meri na črtnem grafu z isto x-osjo. Grafikon je uporaben za " -"primerjavo mer v istem časovnem obdobju." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1069 +msgid "Edit Report" +msgstr "Uredi poročilo" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:27 -msgid "" -"Visualizes a metric across three dimensions of data in a single chart (X " -"axis, Y axis, and bubble size). Bubbles from the same group can be " -"showcased using bubble color." -msgstr "" -"Prikaže mero v treh dimenzijah podatkov na istem grafikonu (x os, y os, " -"velikost mehurčka). Mehurčki v isti skupini so predstavljeni z barvo." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1071 +msgid "Edit Alert" +msgstr "Uredi opozorilo" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:27 -msgid "" -"Visualizes how a metric has changed over a time using a color scale and a" -" calendar view. Gray values are used to indicate missing values and the " -"linear color scheme is used to encode the magnitude of each day's value." -msgstr "" -"Prikaže kako se je mera spreminjala s časom s pomočjo barvne lestvice in " -"koledarskega pogleda. Sive vrednosti ponazarjajo manjkajoče vrednosti. " -"Amplituda dnevnih vrednosti je ponazorjena z linearno barvno shemo." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1073 +msgid "Add Report" +msgstr "Dodaj poročilo" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:27 -msgid "" -"Visualizes how a single metric varies across a country's principal " -"subdivisions (states, provinces, etc) on a chloropleth map. Each " -"subdivision's value is elevated when you hover over the corresponding " -"geographic boundary." -msgstr "" -"Prikaže kako se posamezna mera spreminja glede na območja države (dežele," -" province, itd.) na kloropletnem zemljevidu. Vsak podrazdelek se dvigne, " -"ko z miško preidete mejo njegovega območja." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1074 +msgid "Add Alert" +msgstr "Dodaj opozorilo" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:27 -msgid "" -"Visualizes many different time-series objects in a single chart. This " -"chart is being deprecated and we recommend using the Time-series Chart " -"instead." -msgstr "" -"Prikaže več različnih časovnih vrst na istem grafikonu. Grafikon se " -"opušča, zato priporočamo uporabo Grafikona časovne vrste." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1082 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1090 +msgid "Report name" +msgstr "Naslov poročila" -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:29 -msgid "" -"Visualizes the flow of different group's values through different stages " -"of a system. New stages in the pipeline are visualized as nodes or " -"layers. The thickness of the bars or edges represent the metric being " -"visualized." -msgstr "" -"Prikaže potek vrednosti različnih skupin na različnih nivojih sistema. " -"Novi nivoji so prikazani kot točke ali plasti. Debelina stolpcev ali " -"povezav predstavlja prikazano mero." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1082 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1090 +msgid "Alert name" +msgstr "Naslov opozorila" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:35 -msgid "" -"Visualizes the words in a column that appear the most often. Bigger font " -"corresponds to higher frequency." -msgstr "" -"Prikaže besede v stolpcu, glede na pogostost pojavljanja. Večja pisava " -"pomeni večjo frekvenco." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1141 +msgid "Alert condition" +msgstr "Status opozorila" -#: superset/viz.py:133 -msgid "Viz is missing a datasource" -msgstr "Vizualizaciji manjka podatkovni vir" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1186 +msgid "Trigger Alert If..." +msgstr "Sproži opozorilo v primeru ..." -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:495 -msgid "Viz type" -msgstr "Tip vizualizacije" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1191 +msgid "Condition" +msgstr "Pogoj" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:84 -msgid "WED" -msgstr "SRE" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1205 +msgid "Threshold value should be double precision number" +msgstr "Mejna vrednost naj bo število z dvojno natančnostjo (double)" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:697 -msgid "Want to add a new database?" -msgstr "Želite dodati novo podatkovno bazo?" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1236 +msgid "Report schedule" +msgstr "Urnik poročanja" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1090 -msgid "Warning" -msgstr "Opozorilo" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1237 +msgid "Alert condition schedule" +msgstr "Urnik statusov opozoril" -#: superset/connectors/druid/views.py:193 superset/connectors/sqla/views.py:263 -msgid "Warning Message" -msgstr "Opozorilo" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1257 +msgid "Schedule settings" +msgstr "Nastavitve urnika" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:285 -msgid "Warning!" -msgstr "Opozorilo!" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1261 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1266 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1267 +msgid "Log retention" +msgstr "Hranjenje dnevnikov" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:46 -msgid "" -"Warning! Changing the dataset may break the chart if the metadata does " -"not exist." -msgstr "" -"Opozorilo! Sprememba podatkovnega seta lahko pokvari grafikon, če " -"metapodatki ne obstajajo." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1281 +msgid "Working timeout" +msgstr "Pretek delovanja" -#: superset/db_engine_specs/bigquery.py:166 -#, python-format -msgid "We can't seem to resolve column \"%(column)s\" at line %(location)s." -msgstr "" -"Zdi se, da ni mogoče razrešiti stolpca \"%(column)s\" v vrstici " -"%(location)s." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1290 +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1305 +msgid "Time in seconds" +msgstr "Čas v sekundah" -#: superset/db_engine_specs/sqlite.py:63 -#, python-format -msgid "We can't seem to resolve the column \"%(column_name)s\"" -msgstr "Zdi se, da ni mogoče razrešiti stolpca \"%(column_name)s\"" +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1298 +msgid "Grace period" +msgstr "Obdobje mirovanja" -#: superset/db_engine_specs/postgres.py:150 -#: superset/db_engine_specs/presto.py:171 -#, python-format -msgid "" -"We can't seem to resolve the column \"%(column_name)s\" at line " -"%(location)s." -msgstr "" -"Zdi se, da ni mogoče razrešiti stolpca \"%(column_name)s\" v vrstici " -"%(location)s." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1363 +msgid "Send as PNG" +msgstr "Pošlji kot PNG" -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:118 -msgid "We recommend your summarize your data further before following that flow. " -msgstr "Priporočamo, da zahtevane podatke pred nadaljevanjem strnete. " +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1364 +msgid "Send as CSV" +msgstr "Pošlji kot CSV" -#: superset-frontend/src/reports/actions/reports.js:156 -msgid "We were unable to active or deactivate this report." -msgstr "Aktiviranje ali deaktiviranje poročila ni uspelo." +#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1367 +msgid "Send as text" +msgstr "Pošlji kot besedilo" -#: superset/db_engine_specs/redshift.py:86 -#, python-format -msgid "" -"We were unable to connect to your database named \"%(database)s\". Please" -" verify your database name and try again." -msgstr "" -"Povezava s podatkovno bazo \"%(database)s\" ni uspela. Preverite ime " -"podatkovne baze in poskusite ponovno." +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:66 +msgid "log" +msgstr "dnevnik" -#: superset/db_engine_specs/bigquery.py:149 -msgid "" -"We were unable to connect to your database. Please confirm that your " -"service account has the Viewer and Job User roles on the project." -msgstr "" -"Povezava s podatkovno bazo ni uspela. Preverite, da ima vaš dostop " -"dodeljeni vlogi Viewer in Job User." +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:97 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:348 +msgid "State" +msgstr "Status" -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:60 -msgid "Web" -msgstr "Mreža" +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:108 +msgid "Execution ID" +msgstr "ID izvedbe" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:59 -msgid "Wednesday" -msgstr "Sreda" +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:120 +msgid "Scheduled at (UTC)" +msgstr "Izvede se ob (UTC)" -#: superset/db_engine_specs/base.py:97 -msgid "Week" -msgstr "Teden" +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:128 +msgid "Start at (UTC)" +msgstr "Zažene se ob (UTC)" -#: superset/db_engine_specs/base.py:103 -msgid "Week ending Saturday" -msgstr "Teden s koncem v soboto" +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:138 +msgid "Duration" +msgstr "Trajanje" -#: superset/db_engine_specs/base.py:102 -msgid "Week starting Monday" -msgstr "Teden z začetkom v ponedeljek" +#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:147 +msgid "Error message" +msgstr "Sporočilo napake" -#: superset/db_engine_specs/base.py:101 -msgid "Week starting Sunday" -msgstr "Teden z začetkom v nedeljo" +#: superset-frontend/src/views/CRUD/alert/components/AlertReportCronScheduler.tsx:94 +msgid "CRON expression" +msgstr "Izraz CRON" -#: superset/db_engine_specs/base.py:104 -msgid "Week_ending Sunday" -msgstr "Teden s koncem v nedeljo" +#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:67 +msgid "Report sent" +msgstr "Poročilo poslano" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:67 -#, fuzzy, python-format -msgid "Weeks %s" -msgstr "teden" +#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:68 +msgid "Alert triggered, notification sent" +msgstr "Opozorilo sproženo, obvestilo poslano" -#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:52 -#, python-format -msgid "" -"We’re having trouble loading these results. Queries are set to timeout " -"after %s second." -msgstr "" -"Težava pri nalaganju rezultatov. Časovni iztek poizvedb je nastavljen na " -"%s sekund." +#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:74 +msgid "Report sending" +msgstr "Pošiljanje poročila" -#: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:46 -#, python-format -msgid "" -"We’re having trouble loading this visualization. Queries are set to " -"timeout after %s second." -msgstr "" -"Težava pri nalaganju vizualizacije. Časovni iztek poizvedb je nastavljen " -"na %s sekund." +#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:75 +msgid "Alert running" +msgstr "Opozorilo aktivno" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:58 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:102 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:110 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:113 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:103 -msgid "What should be shown on the label?" -msgstr "Kaj bo prikazano na oznaki?" +#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:81 +msgid "Report failed" +msgstr "Poročilo ni uspelo" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:437 -#: superset-frontend/src/explore/controls.jsx:454 -msgid "" -"When `Calculation type` is set to \"Percentage change\", the Y Axis " -"Format is forced to `.1%`" -msgstr "" -"Če je `Vrsta izračuna` nastavljena na \"Procentualna sprememba\", bo " -"oblika Y-osi vsiljena na `.1%`" +#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:82 +msgid "Alert failed" +msgstr "Opozorilo ni uspelo" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:76 -msgid "When a secondary metric is provided, a linear color scale is used." -msgstr "Če je podana sekundarna metrika, je uporabljena linearna barvna skala." +#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:87 +#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:97 +msgid "Nothing triggered" +msgstr "Ni ni sproženo" -#: superset/views/database/mixins.py:120 -msgid "" -"When allowing CREATE TABLE AS option in SQL Lab, this option forces the " -"table to be created in this schema" -msgstr "" -"Z dovolitvijo opcije CREATE TABLE AS v SQL laboratoriju se tabele " -"ustvarjajo s to shemo" +#: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:92 +msgid "Alert Triggered, In Grace Period" +msgstr "Opozorilo sproženo, v obdobju mirovanja" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:195 -msgid "When enabled, users are able to visualize SQL Lab results in Explore." -msgstr "" -"Ko je omogočeno, lahko uporabniki prikazujejo rezultate SQL laboratorija " -"v raziskovalcu." +#: superset-frontend/src/views/CRUD/alert/components/NotificationMethod.tsx:124 +msgid "Delivery method" +msgstr "Način dostave" -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:71 -msgid "When only a primary metric is provided, a categorical color scale is used." -msgstr "" -"Če je podana samo primarna metrika, je uporabljena kategorična barvna " -"skala." +#: superset-frontend/src/views/CRUD/alert/components/NotificationMethod.tsx:127 +msgid "Select Delivery Method" +msgstr "Izberite način dostave" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:898 -msgid "" -"When specifying SQL, the datasource acts as a view. Superset will use " -"this statement as a subquery while grouping and filtering on the " -"generated parent queries." -msgstr "" -"Ko podajate SQL, se podatkovni vir obnaša kot pogled (view). Superset bo " -"ta zapis uporabil kot podpoizvedbo, pri čemer bo združeval in filtriral " -"na podlagi ustvarjenih starševskih poizvedb." +#: superset-frontend/src/views/CRUD/alert/components/NotificationMethod.tsx:160 +msgid "Recipients are separated by \",\" or \";\"" +msgstr "Prejemniki so ločeni z \",\" ali \";\"" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:716 -msgid "" -"When using \"Autocomplete filters\", this can be used to improve " -"performance of the query fetching the values. Use this option to apply a " -"predicate (WHERE clause) to the query selecting the distinct values from " -"the table. Typically the intent would be to limit the scan by applying a " -"relative time filter on a partitioned or indexed time-related field." -msgstr "" -"Ko uporabljate \"Samodokončaj filtre\", lahko s tem izboljšate hitrost " -"pridobivanja rezultatov s poizvedbo. Z uporabo te možnosti dodate " -"predikat (WHERE stavek) k poizvedbi za izbiro različnih vrednosti iz " -"tabele. Običajno je namen omejiti poizvedbo z uporabo filtra za relativni" -" čas na particioniranem ali indeksiranem časovnem polju." +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:78 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:106 +msgid "annotation" +msgstr "oznaka" -#: superset/viz.py:834 -msgid "When using 'Group By' you are limited to use a single metric" -msgstr "Ko uporabljate 'Group By', ste omejeni na uporabo ene mere" +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:141 +#, python-format +msgid "There was an issue deleting the selected annotations: %s" +msgstr "Pri brisanju izbranih oznak je prišlo do težave: %s" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:258 -msgid "Whether the progress bar overlaps when there are multiple groups of data" -msgstr "Če želite prekrivanje območij, ko imate več skupin podatkov" +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:188 +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:283 +msgid "Edit annotation" +msgstr "Uredi oznako" -#: superset/connectors/sqla/views.py:466 -msgid "Whether the table was generated by the 'Visualize' flow in SQL Lab" -msgstr "" -"Če želite, da je tabela ustvarjena s postopkom 'Vizualizacija' v SQL " -"laboratoriju" +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:195 +msgid "Delete annotation" +msgstr "Izbriši oznako" -#: superset/connectors/druid/views.py:98 superset/connectors/sqla/views.py:99 -msgid "" -"Whether this column is exposed in the `Filters` section of the explore " -"view." -msgstr "" -"Če želite, da je ta stolpec na voljo v sekciji `Filtri` v raziskovalnem " -"pogledu." +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:216 +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:249 +msgid "Annotation" +msgstr "Oznaka" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:430 -msgid "" -"Whether to align background charts with both positive and negative values" -" at 0" -msgstr "" -"Če želite poravnati graf v ozadju celic za negativne in pozitivne " -"vrednosti okrog 0" +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:242 +msgid "No annotation yet" +msgstr "Oznak še ni" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:128 -msgid "Whether to align positive and negative values in cell bar chart at 0" -msgstr "" -"Če želite poravnati pozitivne in negativne vrednosti v stolpčnem " -"grafikonu celic pri 0" +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:259 +#, python-format +msgid "Annotation Layer %s" +msgstr "Sloj z oznakami %s" -#: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:739 -#, fuzzy -msgid "Whether to always show the annotation label" -msgstr "Če želite prikazati kazalec" +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:282 +#, python-format +msgid "Are you sure you want to delete %s?" +msgstr "Ali ste prepričani, da želite izbrisati %s?" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:192 -msgid "Whether to animate the progress and the value or just display them" -msgstr "Če želite animiran prikaz grafikona" +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:293 +msgid "Delete Annotation?" +msgstr "Izbrišem oznako?" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:317 -msgid "Whether to apply a normal distribution based on rank on the color scale" -msgstr "" -"Če želite uporabiti normalno porazdelitev glede na stopnjo na barvni " -"lestvici" +#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:298 +msgid "Are you sure you want to delete the selected annotations?" +msgstr "Ali ste prepričani, da želite izbrisati izbrane oznake?" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:138 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:442 -msgid "Whether to colorize numeric values by if they are positive or negative" -msgstr "" -"Če želite obarvati številske vrednosti, ko so le-te pozitivne ali " -"negativne" +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:152 +msgid "The annotation has been updated" +msgstr "Označba je bila posodobljena" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:120 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:416 -msgid "Whether to display a bar chart background in table columns" -msgstr "" -"Če želite omogočiti prikaz manjših stolpčnih grafikonov v ozadju stolpcev" -" tabele" +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:168 +msgid "The annotation has been saved" +msgstr "Označba je bila shranjena" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:38 -msgid "Whether to display a legend for the chart" -msgstr "Če želite prikaz legende za grafikon" +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:283 +msgid "Add annotation" +msgstr "Dodaj oznako" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:83 -msgid "Whether to display bubbles on top of countries" -msgstr "Če želite prikaz mehurčkov nad državami" +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:292 +msgid "Annotation name" +msgstr "Ime oznake" -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:60 -msgid "Whether to display the interactive data table" -msgstr "Če želite prikaz interaktivne podatkovne tabele" +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:304 +msgid "date" +msgstr "datum" -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:130 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:152 -#: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:97 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:74 -msgid "Whether to display the labels." -msgstr "Če želite prikaz oznak." +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:324 +msgid "Additional information" +msgstr "Dodatne informacije" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:99 -msgid "" -"Whether to display the labels. Note that the label only displays when the" -" the 5% threshold." -msgstr "" -"Če želite prikazati oznake. Oznake so prikazane le pri vsaj 5-odstotnem " -"pragu." +#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:331 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:266 +msgid "Description (this can be seen in the list)" +msgstr "Opis (lahko je viden na seznamu)" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:157 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:278 -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:132 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:152 -msgid "Whether to display the legend (toggles)" -msgstr "Preklapljanje prikaza legende" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:104 +msgid "annotation_layer" +msgstr "annotation_layer" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:181 -msgid "Whether to display the metric name as a title" -msgstr "Če želite prikazati ime mere kot naslov" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:139 +msgid "Annotation template updated" +msgstr "Predloga oznake posodobljena" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:273 -msgid "Whether to display the min and max values of the X-axis" -msgstr "Če želite prikaz min. in max. vrednosti X-osi" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:154 +msgid "Annotation template created" +msgstr "Predloga oznake ustvarjena" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:94 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:105 -msgid "Whether to display the min and max values of the Y-axis" -msgstr "Če želite prikaz min. in max. vrednosti Y-osi" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:241 +msgid "Edit annotation layer properties" +msgstr "Uredi lastnosti sloja z oznakami" -#: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:167 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:304 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:185 -msgid "Whether to display the numerical values within the cells" -msgstr "Če želite v celicah prikazati numerične vrednosti" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:251 +msgid "Annotation layer name" +msgstr "Ime sloja z oznakami" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:141 -msgid "Whether to display the time range interactive selector" -msgstr "Če želite prikaz interaktivnega izbirnika časovnega obdobja" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:71 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:335 +msgid "Annotation layers" +msgstr "Sloji z oznakami" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:88 -msgid "Whether to display the timestamp" -msgstr "Če želite prikazati časovno značko" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:110 +#, python-format +msgid "There was an issue deleting the selected layers: %s" +msgstr "Pri brisanju izbranih slojev je prišlo do težave: %s" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:100 -msgid "Whether to display the trend line" -msgstr "Če želite prikazati trendno črto" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:179 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:345 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:158 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:364 +msgid "Last modified" +msgstr "Zadnja sprememba" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:170 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:279 -msgid "Whether to enable changing graph position and scaling." -msgstr "Če želite omogočiti premikanje in povečevanje/zmanjševanje grafikona." +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:204 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:184 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:351 +msgid "Created on" +msgstr "Ustvarjeno" -#: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:144 -msgid "Whether to enable node dragging in force layout mode." -msgstr "Če želite omogočiti premikanje vozlišč v načinu vsiljenega prikaza." +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:229 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:210 +msgid "Edit template" +msgstr "Uredi predlogo" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:63 -msgid "Whether to format the timestamp" -msgstr "Če želite oblikovati časovno značko" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:238 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:219 +msgid "Delete template" +msgstr "Izbriši predlogo" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:406 -msgid "Whether to include a client-side search box" -msgstr "Če želite vključiti iskalno polje za uporabnika" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:264 +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:319 +msgid "Annotation layer" +msgstr "Sloj z oznakami" -#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:81 -msgid "Whether to include a time filter" -msgstr "Če želite vključiti časovni filter" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:294 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:282 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:436 +#, python-format +msgid "An error occurred while fetching dataset datasource values: %s" +msgstr "" +"Pri pridobivanju vrednosti podatkovnega vira podatkovnega seta je prišlo do " +"napake: %s" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:289 -msgid "Whether to include the percentage in the tooltip" -msgstr "Če želite prikaz procentov v opisu orodja" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:314 +msgid "No annotation layers yet" +msgstr "Slojev z oznakami še ni" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:326 -msgid "Whether to include the time granularity as defined in the time section" -msgstr "Če želite vključiti granulacijo časa, ki je določena v sekciji Čas" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:345 +msgid "This action will permanently delete the layer." +msgstr "S tem dejanjem boste trajno izbrisali sloj." -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:155 -msgid "Whether to make the histogram cumulative" -msgstr "Če želite kumulativni histogram" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:353 +msgid "Delete Layer?" +msgstr "Izbrišem sloj?" -#: superset/connectors/sqla/views.py:94 -msgid "" -"Whether to make this column available as a [Time Granularity] option, " -"column has to be DATETIME or DATETIME-like" -msgstr "" -"Če želite, da bo ta stolpec na razpolago kot možnost [Granulacija časa]. " -"Stolpec mora biti tipa DATETIME ali DATETIME-like" +#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:358 +msgid "Are you sure you want to delete the selected layers?" +msgstr "Ali ste prepričani, da želite izbrisati izbrane sloje?" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:143 -msgid "Whether to normalize the histogram" -msgstr "Če želite normirati histogram" +#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:81 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:388 +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:109 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:361 +msgid "Are you sure you want to delete" +msgstr "Ali ste prepričani, da želite izbrisati" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:709 -msgid "Whether to populate autocomplete filters options" -msgstr "Če želite napolniti možnosti za samodokončanje filtrov" +#: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:156 +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:165 +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:129 +#, python-format +msgid "Modified %s" +msgstr "Zadnja sprememba %s" -#: superset/connectors/druid/views.py:325 superset/connectors/sqla/views.py:461 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:82 msgid "" -"Whether to populate the filter's dropdown in the explore view's filter " -"section with a list of distinct values fetched from the backend on the " -"fly" +"The passwords for the databases below are needed in order to import them together " +"with the charts. Please note that the \"Secure Extra\" and \"Certificate\" " +"sections of the database configuration are not present in export files, and " +"should be added manually after the import if they are needed." msgstr "" -"Če želite napolniti spustni seznam filtra v raziskovalnem pogledu " -"filtrske sekcije z različnimi vrednostmi, pridobljenimi sproti v ozadju" +"Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj z grafikoni. Sekciji " +"\"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze nista " +"prisotni v izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če je to " +"potrebno." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:163 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:89 msgid "" -"Whether to show extra controls or not. Extra controls include things like" -" making mulitBar charts stacked or side by side." +"You are importing one or more charts that already exist. Overwriting might cause " +"you to lose some of your work. Are you sure you want to overwrite?" msgstr "" -"Če želite prikaz dodatnih kontrolnikov. Dodatni kontrolniki vključujejo " -"možnost izdelave večstolpčnih grafikonov, naloženih ali drug ob drugem." +"Uvažate enega ali več grafikonov, ki že obstajajo. S prepisom lahko izgubite " +"podatke. Ali ste prepričani, da želite prepisati?" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:207 -msgid "Whether to show minor ticks on the axis" -msgstr "Če želite prikaz manjših oznak na osi" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:203 +msgid "Chart imported" +msgstr "Grafikon uvožen" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:180 -msgid "Whether to show the pointer" -msgstr "Če želite prikazati kazalec" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:233 +#, python-format +msgid "There was an issue deleting the selected charts: %s" +msgstr "Pri brisanju izbranih grafikonov je prišlo do težave: %s" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:246 -msgid "Whether to show the progress of gauge chart" -msgstr "Prikaži merilno območje števčnega grafikona" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:331 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:294 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:351 +msgid "Modified by" +msgstr "Spremenil" -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:219 -msgid "Whether to show the split lines on the axis" -msgstr "Če želite prikazati razdelitvene črte na osi" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:469 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:441 +#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:165 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:175 +msgid "Favorite" +msgstr "Priljubljene" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:44 -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:47 -#: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:42 -#: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:50 -#: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:49 -#: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:48 -#: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:46 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:61 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:356 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:107 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:91 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:88 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:68 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:85 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:91 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:92 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:339 -#: superset-frontend/src/explore/controlPanels/sections.tsx:127 -msgid "Whether to sort descending or ascending" -msgstr "Če želite padajoče ali naraščajoče razvrščanje" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:474 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:568 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:446 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:504 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:517 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:525 +msgid "Any" +msgstr "Katerikoli" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/legacySortBy.tsx:31 -msgid "" -"Whether to sort descending or ascending. Takes effect only when \"Sort " -"by\" is set" -msgstr "" -"Če želite padajoče ali naraščajoče razvrščanje. Učinkuje samo, ko je " -"vključen \"Sort by\"" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:476 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:570 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:448 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:519 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:527 +msgid "Yes" +msgstr "Da" -#: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:40 -#: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:39 -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:95 -#: superset-frontend/plugins/legacy-plugin-chart-sankey/src/controlPanel.ts:56 -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:40 -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/controlPanel.tsx:64 -#: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:66 -#: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:63 -#: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:50 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:39 -msgid "Whether to sort results by the selected metric in descending order." -msgstr "Če želite padajoče razvrstiti rezultate z izbrano mero." +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:477 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:571 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:449 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:520 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:528 +msgid "No" +msgstr "Ne" -#: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:175 -msgid "Whether to sort tooltip by the selected metric in descending order." -msgstr "Če želite padajoče razvrstiti opis orodja z izbrano mero." +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:490 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:511 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:532 +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:557 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:462 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:483 +msgid "All" +msgstr "Vsi" -#: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:43 -msgid "Which country to plot the map for?" -msgstr "Za katero državo želite grafikon?" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:496 +#, python-format +msgid "An error occurred while fetching chart owners values: %s" +msgstr "Pri pridobivanju polja lastnik grafikona je prišlo do napake: %s" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:197 -msgid "Which relatives to highlight on hover" -msgstr "Kateri element se poudari na prehodu z miško" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:517 +#, python-format +msgid "An error occurred while fetching chart created by values: %s" +msgstr "Pri pridobivanju polja Grafikon ustvaril je prišlo do napake: %s" -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:51 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:45 -msgid "Whisker/outlier options" -msgstr "Možnosti grafikona kvantilov" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:528 +msgid "Chart type" +msgstr "Tip grafikona" -#: superset-frontend/src/dashboard/util/backgroundStyleOptions.ts:30 -msgid "White" -msgstr "Belo" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:563 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:512 +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:520 +msgid "Certified" +msgstr "Certificirano" -#: superset-frontend/src/explore/components/EmbedCodeButton.jsx:130 -msgid "Width" -msgstr "Širina" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:588 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:537 +msgid "Alphabetical" +msgstr "Po abecedi" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:73 -msgid "Width of the confidence interval. Should be between 0 and 1" -msgstr "Širina intervala zaupanja. Mora bit med 0 in 1" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:594 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:543 +msgid "Recently modified" +msgstr "Nedavno spremenjeno" -#: superset/utils/pandas_postprocessing.py:393 -msgid "Window must be > 0" -msgstr "Okno mora biti > 0" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:600 +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:549 +msgid "Least recently modified" +msgstr "Zadnje spremenjeno" -#: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:36 -msgid "With a subheader" -msgstr "S podnaslovom" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:664 +msgid "Import charts" +msgstr "Uvozi grafikone" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/legacyPlugin/index.ts:29 -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:39 -msgid "Word Cloud" -msgstr "Oblak besed" +#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:688 +msgid "Are you sure you want to delete the selected charts?" +msgstr "Ali ste prepričani, da želite izbrisati izbrane grafikone?" -#: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:80 -msgid "Word Rotation" -msgstr "Vrtenje besed" +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:91 +msgid "css_template" +msgstr "css_template" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:55 -msgid "Working" -msgstr "" +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:231 +msgid "Edit CSS template properties" +msgstr "Uredi lastnosti CSS predloge" -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1258 -msgid "Working timeout" -msgstr "Pretek delovanja" +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:232 +msgid "Add CSS template" +msgstr "Dodaj CSS predlogo" -#: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:33 -#: superset/viz.py:2042 -msgid "World Map" -msgstr "Zemljevid sveta" +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:241 +msgid "CSS template name" +msgstr "Ime CSS predloge" + +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:253 +msgid "css" +msgstr "css" + +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:71 +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:240 +msgid "CSS templates" +msgstr "CSS predloge" + +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:115 +#, python-format +msgid "There was an issue deleting the selected templates: %s" +msgstr "Pri brisanju izbranih predlog je prišlo do težave: %s" + +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:151 +#, python-format +msgid "Last modified by %s" +msgstr "Nazadnje spremenil %s" + +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:249 +msgid "CSS template" +msgstr "CSS predloga" + +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:313 +msgid "This action will permanently delete the template." +msgstr "S tem dejanjem boste trajno izbrisali predlogo." + +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:321 +msgid "Delete Template?" +msgstr "Izbrišem predlogo?" + +#: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:326 +msgid "Are you sure you want to delete the selected templates?" +msgstr "Ali ste prepričani, da želite izbrisati izbrane predloge?" + +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:154 +msgid "published" +msgstr "objavljeno" -#: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:166 -msgid "Write a description for your query" -msgstr "Dodajte opis vaše poizvedbe" +#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:154 +msgid "draft" +msgstr "osnutek" -#: superset/views/database/forms.py:221 superset/views/database/forms.py:354 -#: superset/views/database/forms.py:442 -msgid "Write dataframe index as a column." -msgstr "Zapiši indeks dataframe-a kot stolpec." +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:56 +msgid "" +"The passwords for the databases below are needed in order to import them together " +"with the dashboards. Please note that the \"Secure Extra\" and \"Certificate\" " +"sections of the database configuration are not present in export files, and " +"should be added manually after the import if they are needed." +msgstr "" +"Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj z nadzornimi " +"ploščami. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne " +"baze nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po " +"uvozu, če je to potrebno." -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:51 -msgid "X AXIS TITLE BOTTOM MARGIN" -msgstr "SPODNJA OBROBA NASLOVA X OSI" +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:63 +msgid "" +"You are importing one or more dashboards that already exist. Overwriting might " +"cause you to lose some of your work. Are you sure you want to overwrite?" +msgstr "" +"Uvažate eno ali več nadzornih plošč, ki že obstajajo. S prepisom lahko izgubite " +"podatke. Ali ste prepričani, da želite prepisati?" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:31 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:147 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:406 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:69 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:63 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:83 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/controlPanel.ts:107 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:69 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:77 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:90 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:298 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:189 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:150 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:130 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:147 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:205 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:208 -#: superset-frontend/src/explore/controls.jsx:421 -msgid "X Axis" -msgstr "X os" +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:147 +msgid "Dashboard imported" +msgstr "Nadzorna plošča uvožena" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:215 -msgid "X Axis Format" -msgstr "Oblika X-osi" +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:205 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:167 +#, python-format +msgid "An error occurred while fetching dashboards: %s" +msgstr "Prišlo je do napake pri pridobivanju nadzornih plošč: %s" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:107 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:175 -msgid "X Axis Label" -msgstr "Naslov X osi" +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:231 +msgid "There was an issue deleting the selected dashboards: " +msgstr "Pri brisanju izbranih nadzornih plošč je prišlo do težave: " -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:37 -msgid "X Axis Title" -msgstr "Naslov X osi" +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:468 +#, python-format +msgid "An error occurred while fetching dashboard owner values: %s" +msgstr "Pri pridobivanju polja lastnik nadzorne plošče je prišlo do napake: %s" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:104 -msgid "X Log Scale" -msgstr "Logaritemska X-os" +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:489 +#, python-format +msgid "An error occurred while fetching dashboard created by values: %s" +msgstr "Pri pridobivanju polja Nadzorno ploščo ustvaril je prišlo do napake: %s" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:201 -#: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:78 -#: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:62 -msgid "X Tick Layout" -msgstr "Postavitev oznak na X-osi" +#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:633 +msgid "Are you sure you want to delete the selected dashboards?" +msgstr "Ali ste prepričani, da želite izbrisati izbrane nadzorne plošče?" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:270 -msgid "X bounds" -msgstr "Meje X-osi" +#: superset-frontend/src/views/CRUD/data/common.ts:38 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:107 +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:332 +msgid "Saved queries" +msgstr "Shranjene poizvedbe" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:114 -msgid "XScale Interval" -msgstr "Interval X-osi" +#: superset-frontend/src/views/CRUD/data/components/SyntaxHighlighterCopy/index.tsx:71 +msgid "SQL Copied!" +msgstr "SQL kopiran!" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:102 -msgid "Y 2 bounds" -msgstr "Meje Y 2" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:89 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:432 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:533 +msgid "database" +msgstr "podatkovna baza" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:79 -msgid "Y AXIS TITLE MARGIN" -msgstr "OBROBA NASLOVA Y OSI" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:140 +#, python-format +msgid "An error occurred while fetching database related data: %s" +msgstr "Pri pridobivanju podatkov iz podatkovne baze je prišlo do napake: %s" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:94 -msgid "Y AXIS TITLE POSITION" -msgstr "POZICIJA NASLOVA Y OSI" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:191 +msgid "Upload file to database" +msgstr "Naloži datoteko v podatkovno bazo" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:59 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:153 -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:413 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/controlPanel.ts:79 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/controlPanel.ts:75 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:115 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/controlPanel.ts:54 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:80 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:109 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:241 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:322 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:224 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:186 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:167 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:183 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:240 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:243 -#: superset-frontend/src/explore/controls.jsx:428 -msgid "Y Axis" -msgstr "Y os" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:194 +msgid "Upload CSV" +msgstr "Naloži CSV" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:40 -msgid "Y Axis 1" -msgstr "Y-os 1" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:201 +msgid "Upload columnar file" +msgstr "Naloži datoteko s stolpci" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:50 -msgid "Y Axis 2" -msgstr "Y-os 2" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:208 +msgid "Upload Excel file" +msgstr "Naloži Excel-ovo datoteko" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:254 -msgid "Y Axis 2 Bounds" -msgstr "Meje Y 2-osi" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:293 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:458 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:303 +msgid "Asynchronous query execution" +msgstr "Asinhroni zagon poizvedb" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:238 -#: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:354 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:269 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:232 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/controlPanel.tsx:212 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:229 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:285 -#: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:288 -msgid "Y Axis Bounds" -msgstr "Meje Y-osi" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:296 +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:461 +msgid "AQE" +msgstr "AQE" -#: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:428 -#: superset-frontend/src/explore/controls.jsx:442 -msgid "Y Axis Format" -msgstr "Oblika Y osi" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:313 +msgid "Allow data manipulation language" +msgstr "Dovoli jezik za manipulacijo podatkov (DML)" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:118 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:333 -msgid "Y Axis Label" -msgstr "Naslov Y osi" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:316 +msgid "DML" +msgstr "DML" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:88 -msgid "Y Axis Left" -msgstr "Y-os levo" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:328 +msgid "CSV upload" +msgstr "Nalaganje CSV" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:123 -msgid "Y Axis Right" -msgstr "Y-os desno" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:389 +msgid "Delete database" +msgstr "Izbriši podatkovno bazo" -#: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:65 -msgid "Y Axis Title" -msgstr "Naslov Y osi" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:496 +#, python-format +msgid "" +"The database %s is linked to %s charts that appear on %s dashboards and users " +"have %s SQL Lab tabs using this database open. Are you sure you want to continue? " +"Deleting the database will break those objects." +msgstr "" +"Podatkovna baza %s je povezana z grafikoni %s, ki so prisotni na nadzorni plošči " +"%s in uporabniki imajo odprtih %s zavihkov SQL laboratorija. Ali želite " +"nadaljevati? Izbris podatkovne baze bo pokvaril te objekte." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:227 -msgid "Y Log Scale" -msgstr "Logaritemska Y-os" +#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:510 +msgid "Delete Database?" +msgstr "Izbrišem podatkovno bazo?" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:91 -msgid "Y bounds" -msgstr "Y meje" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:76 +msgid "Expose database in SQL Lab" +msgstr "Razkrij podatkovno bazo v SQL laboratoriju" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:130 -msgid "YScale Interval" -msgstr "Interval Y-osi" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:79 +msgid "Allow this database to be queried in SQL Lab" +msgstr "Dovoli poizvedbo na to podatkovno bazo v SQL laboratoriju" -#: superset/db_engine_specs/base.py:100 -msgid "Year" -msgstr "Leto" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:98 +msgid "Allow creation of new tables based on queries" +msgstr "Dovoli ustvarjanje novih tabel s poizvedbami" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:70 -#, fuzzy, python-format -msgid "Years %s" -msgstr "leto" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:112 +msgid "Allow creation of new views based on queries" +msgstr "Dovoli ustvarjanje novih pogledov s poizvedbami" -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:443 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:537 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:440 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:511 -msgid "Yes" -msgstr "Da" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:118 +msgid "CTAS & CVAS SCHEMA" +msgstr "CTAS & CVAS SHEMA" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/CancelConfirmationAlert.tsx:64 -msgid "Yes, cancel" -msgstr "Da, prekini" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:124 +msgid "Create or select schema..." +msgstr "Ustvarite ali izberite shemo..." -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:72 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:129 msgid "" -"You are importing one or more charts that already exist. Overwriting " -"might cause you to lose some of your work. Are you sure you want to " -"overwrite?" +"Force all tables and views to be created in this schema when clicking CTAS or " +"CVAS in SQL Lab." msgstr "" -"Uvažate enega ali več grafikonov, ki že obstajajo. S prepisom lahko " -"izgubite podatke. Ali ste prepričani, da želite prepisati?" +"Vsilite, da bodo vse tabele in pogledi ustvarjeni s to shemo, ko kliknete CTAS " +"ali CVAS v SQL laboratoriju." -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:64 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:145 msgid "" -"You are importing one or more dashboards that already exist. Overwriting " -"might cause you to lose some of your work. Are you sure you want to " -"overwrite?" +"Allow manipulation of the database using non-SELECT statements such as UPDATE, " +"DELETE, CREATE, etc." msgstr "" -"Uvažate eno ali več nadzornih plošč, ki že obstajajo. S prepisom lahko " -"izgubite podatke. Ali ste prepričani, da želite prepisati?" +"Dovoli manipulacije podatkovne baze z uporabo ne-SELECT stavkov, kot so UPDATE, " +"DELETE, CREATE, itd." + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:176 +msgid "Enable query cost estimation" +msgstr "Omogoči ocenjevanje potratnosti poizvedbe" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:45 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 msgid "" -"You are importing one or more databases that already exist. Overwriting " -"might cause you to lose some of your work. Are you sure you want to " -"overwrite?" +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a query." msgstr "" -"Uvažate eno ali več podatkovnih baz, ki že obstajajo. S prepisom lahko " -"izgubite podatke. Ali ste prepričani, da želite prepisati?" +"Za Presto in Postgres prikaže gumb za izračun potratnosti pred zagonom poizvedbe." -#: superset-frontend/src/views/CRUD/data/dataset/constants.ts:30 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:192 +msgid "Allow this database to be explored" +msgstr "Dovoli raziskovanje te podatkovne baze" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:195 +msgid "When enabled, users are able to visualize SQL Lab results in Explore." +msgstr "" +"Ko je omogočeno, lahko uporabniki prikazujejo rezultate SQL laboratorija v " +"raziskovalcu." + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:208 +msgid "Disable SQL Lab data preview queries" +msgstr "Izključite poizvedbe za predogled podatkov v SQL Laboratoriju" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:211 msgid "" -"You are importing one or more datasets that already exist. Overwriting " -"might cause you to lose some of your work. Are you sure you want to " -"overwrite?" +"Disable data preview when fetching table metadata in SQL Lab. Useful to avoid " +"browser performance issues when using databases with very wide tables." msgstr "" -"Uvažate enega ali več podatkovnih setov, ki že obstajajo. S prepisom " -"lahko izgubite podatke. Ali ste prepričani, da želite prepisati?" +"Izključite predogled podatkov pri pridobivanju metapodatkov v SQL laboratoriju. S " +"tem se zmanjša obremenitev brskalnika pri podatkovnih bazah z zelo širokimi " +"tabelami." -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:63 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:234 +msgid "Chart cache timeout" +msgstr "Trajanje predpomnilnika grafikona" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:240 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:262 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:284 +msgid "Enter duration in seconds" +msgstr "Vnesite trajanje v sekundah" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:253 +msgid "Schema cache timeout" +msgstr "Trajanje prepomnilnika sheme" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:268 msgid "" -"You are importing one or more saved queries that already exist. " -"Overwriting might cause you to lose some of your work. Are you sure you " -"want to overwrite?" +"Duration (in seconds) of the metadata caching timeout for schemas of this " +"database. If left unset, the cache never expires." msgstr "" -"Uvažate eno ali več shranjenih poizvedb, ki že obstajajo. S prepisom " -"lahko izgubite podatke. Ali ste prepričani, da želite prepisati?" +"Trajanje (v sekundah) predpomnilnika metapodatkov za sheme v tej podatkovni bazi. " +"Če ni nastavljeno, predpomnilnik ne poteče." + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:275 +msgid "Table cache timeout" +msgstr "Trajanje predpomnilnika tabele" -#: superset/views/core.py:2175 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:290 msgid "" -"You are not authorized to fetch samples from this table. If you think " -"this is an error, please reach out to your administrator." +"Duration (in seconds) of the metadata caching timeout for tables of this " +"database. If left unset, the cache never expires. " msgstr "" -"Nimate dovoljenja za pridobitev vzorcev iz te tabele. Če menite, da je to" -" napaka, kontaktirajte administratorja." +"Trajanje (v sekundah) predpomnilnika metapodatkov za tabele v tej podatkovni " +"bazi. Če ni nastavljeno, predpomnilnik ne poteče. " -#: superset/views/core.py:2295 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:306 msgid "" -"You are not authorized to see this query. If you think this is an error, " -"please reach out to your administrator." +"Operate the database in asynchronous mode, meaning that the queries are executed " +"on remote workers as opposed to on the web server itself. This assumes that you " +"have a Celery worker setup as well as a results backend. Refer to the " +"installation docs for more information." msgstr "" -"Nimate dovoljenja za ogled te poizvedbe. Če menite, da je to napaka, " -"kontaktirajte administratorja." +"Upravljanje podatkovne baze v asinhronem načinu pomeni, da se poizvedbe zaženejo " +"na oddaljenih »delavcih« in ne na samem spletnem strežniku. S tem je " +"predpostavljeno, da imate nastavljenega »delavca« za Celery in zaledni sistem za " +"rezultate. Več informacij je v navodilih za namestitev." + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:322 +msgid "Cancel query on window unload event" +msgstr "Prekini poizvedbo pri dogodku zaprtja okna (window unload event)" -#: superset/views/database/views.py:463 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:325 msgid "" -"You cannot specify a namespace both in the name of the table: " -"\"%(columnar_table.table)s\" and in the schema field: " -"\"%(columnar_table.schema)s\". Please remove one" +"Terminate running queries when browser window closed or navigated to another " +"page. Available for Presto, Hive, MySQL, Postgres and Snowflake databases." msgstr "" -"Imenskega prostora ni mogoče podati hkrati v imenu tabele: " -"\"%(columnar_table.table)s\" in polju sheme: " -"\"%(columnar_table.schema)s\". Odstranite enega" +"Ustavi zagnane poizvedbe, ko se zapre okno brskalnika ali gre na drugo stran. na " +"razpolago za Presto, Hive, MySQL, Postgres in Snowflake podatkovne baze." + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:344 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:349 +msgid "Secure extra" +msgstr "Dodatna varnost" -#: superset/views/database/views.py:146 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:359 msgid "" -"You cannot specify a namespace both in the name of the table: " -"\"%(csv_table.table)s\" and in the schema field: " -"\"%(csv_table.schema)s\". Please remove one" +"JSON string containing additional connection configuration. This is used to " +"provide connection information for systems like Hive, Presto and BigQuery which " +"do not conform to the username:password syntax normally used by SQLAlchemy." msgstr "" -"Imenskega prostora ni mogoče podati hkrati v tabeli: " -"\"%(csv_table.table)s\" in polju sheme: \"%(csv_table.schema)s\". " -"Odstranite enega" +"JSON niz, ki vsebuje dodatno konfiguracijo povezave. Uporablja se za " +"zagotavljanje dodatnih informacij povezave za sisteme kot sta Presto in BigQuery, " +"ki nista skladna s sintakso username:password, ki jo običajno uporablja " +"SQLAlchemy." + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:374 +msgid "Enter CA_BUNDLE" +msgstr "Vnesite CA_BUNDLE" -#: superset/views/database/views.py:293 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:379 msgid "" -"You cannot specify a namespace both in the name of the table: " -"\"%(excel_table.table)s\" and in the schema field: " -"\"%(excel_table.schema)s\". Please remove one" +"Optional CA_BUNDLE contents to validate HTTPS requests. Only available on certain " +"database engines." msgstr "" -"Imenskega prostora ni mogoče podati hkrati v tabeli: " -"\"%(excel_table.table)s\" in polju sheme: \"%(excel_table.schema)s\". " -"Odstranite enega" +"Opcijska CA_BUNDLE vsebina, za potrjevanje HTTPS zahtev. Razpoložljivo le na " +"določenih sistemih podatkovnih baz." -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Vis.js:366 -msgid "You cannot use 45° tick layout along with the time range filter" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:387 +msgid "Schemas allowed for CSV upload" +msgstr "Dovoljene sheme za nalaganje CSV" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:401 +msgid "A comma-separated list of schemas that CSVs are allowed to upload to." +msgstr "Z vejicami ločen seznam shem, kjer je dovoljeno nalaganje CSV-jev." + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:413 +msgid "Impersonate logged in user (Presto, Trino, Drill, Hive, and GSheets)" msgstr "" -"Skupaj s filtriranjem časovnega obdobja ne morete uporabiti oznak pod 45°" -" kotom" +"Predstavljanje kot prijavljeni uporabnik (Presto, Trino, Drill, Hive in GSheets)" -#: superset/viz.py:696 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:418 msgid "" -"You cannot use [Columns] in combination with [Group " -"By]/[Metrics]/[Percentage Metrics]. Please choose one or the other." +"If Presto or Trino, all the queries in SQL Lab are going to be executed as the " +"currently logged on user who must have permission to run them. If Hive and hive." +"server2.enable.doAs is enabled, will run the queries as service account, but " +"impersonate the currently logged on user via hive.server2.proxy.user property." msgstr "" -"Ne smete uporabiti [Stolpci] v kombinaciji z " -"[Združevanje]/[Mere]/[Procentualne mere]. Izberite eno ali drugo." +"V primeru Presto ali Trino se vse poizvedbe v SQL laboratoriju zaženejo pod " +"trenutno prijavljenim uporabnikom, ki mora imeti pravice za poganjanje. Če je " +"omogočen Hive in hive.server2.enable.doAs, poizvedbe tečejo pod servisnim " +"računom, vendar je trenutno prijavljen uporabnik predstavljen z lastnostjo hive." +"server2.proxy.user." -#: superset-frontend/src/explore/components/PropertiesModal/index.tsx:66 -msgid "You do not have permission to edit this chart" -msgstr "Nimate dovoljenja za urejanje tega grafikona" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:435 +msgid "Allow data upload" +msgstr "Dovoli nalaganje podatkov" -#: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:77 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:118 -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DatasetSelect.tsx:48 -msgid "You do not have permission to edit this dashboard" -msgstr "Nimate dovoljenja za urejanje te nadzorne plošče" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:438 +msgid "If selected, please set the schemas allowed for data upload in Extra." +msgstr "Če je izbrano, nastavite dovoljene sheme za nalaganje podatkov v Dodatno." + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:455 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:460 +msgid "Metadata Parameters" +msgstr "Parametri metapodatkov" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:470 +msgid "The metadata_params object gets unpacked into the sqlalchemy.MetaData call." +msgstr "Objekt metadata_params se razpakira v klic sqlalchemy.MetaData." + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:477 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:482 +msgid "Engine Parameters" +msgstr "Parametri podatkovne baze" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:492 +msgid "" +"The engine_params object gets unpacked into the sqlalchemy.create_engine call." +msgstr "Objekt engine_params se razširi v klic sqlalchemy.create_engine." + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:500 +msgid "Version" +msgstr "Verzija" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:507 +msgid "Version number" +msgstr "Številka verzije" + +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:512 +msgid "" +"Specify the database version. This should be used with Presto in order to enable " +"query cost estimation." +msgstr "" +"Podajte verzijo podatkovne baze. Uporablja se s Presto, za potrebe ocenjevanja " +"potratnosti poizvedbe." -#: superset/templates/superset/request_access.html:25 -#, python-format -msgid "You do not have permissions to access the datasource(s): %(name)s." -msgstr "Nimate dovoljenj za dostop do podatkovnih virov: %(name)s." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:149 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:55 +msgid "Display Name" +msgstr "Ime za prikaz" -#: superset-frontend/src/dashboard/actions/dashboardState.js:133 -msgid "You do not have permissions to edit this dashboard." -msgstr "Nimate dovoljenj za urejanje te nadzorne plošče." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:64 +msgid "Name your database" +msgstr "Poimenujte podatkovno bazo" -#: superset/dashboards/commands/exceptions.py:86 -msgid "You don't have access to this dashboard." -msgstr "Nimate dostopa do te nadzorne plošče." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:69 +msgid "Pick a name to help you identify this database." +msgstr "Izberite ime za lažjo prepoznavo podatkovne baze." -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:144 -msgid "You don't have any favorites yet!" -msgstr "Priljubljenih še niste izbrali!" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:84 +msgid "dialect+driver://username:password@host:port/database" +msgstr "dialect+driver://username:password@host:port/database" -#: superset/key_value/commands/exceptions.py:45 -#, fuzzy -msgid "You don't have permission to modify the value." -msgstr "Nimate dovoljenja za urejanje tega grafikona" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:91 +msgid "Refer to the" +msgstr "Obrnite se na" -#: superset/views/core.py:618 superset/views/core.py:823 -#: superset/views/core.py:829 superset/views/core.py:999 -#: superset/views/core.py:1017 -msgid "You don't have the rights to " -msgstr "Nimate pravic za " +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:99 +msgid "for more information on how to structure your URI." +msgstr "za več informacij o oblikovanju URI." -#: superset-frontend/src/components/EditableTitle/index.tsx:199 -msgid "You don't have the rights to alter this title." -msgstr "Nimate pravic za spreminjanje tega naslova." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:109 +msgid "Test connection" +msgstr "Preizkus povezave" -#: superset/views/core.py:406 -msgid "You have no permission to approve this request" -msgstr "Nimate dovoljenja za odobritev te zahteve" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:480 +msgid "Please enter a SQLAlchemy URI to test" +msgstr "Vnesite SQLAlchemy URI za test" -#: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/RemovedFilter.tsx:39 -msgid "You have removed this filter." -msgstr "Odstranili ste ta filter." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:620 +msgid "Database settings updated" +msgstr "Nastavitve podatkovne baze posodobljene" -#: superset-frontend/src/dashboard/components/Dashboard.jsx:88 -msgid "You have unsaved changes." -msgstr "Imate neshranjene spremembe." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:636 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:655 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:919 +msgid "Database connected" +msgstr "Podatkovna baza povezana" -#: superset-frontend/src/dashboard/components/SaveModal.tsx:160 -msgid "You must pick a name for the new dashboard" -msgstr "Izbrati morate ime nove nadzorne plošče" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:669 +#, python-format +msgid "Sorry there was an error fetching database information: %s" +msgstr "Pri pridobivanju informacij o podatkovni bazi je prišlo do napake: %s" -#: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:518 -msgid "You must run the query successfully first" -msgstr "Najprej morate uspešno izvesti poizvedbo" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:714 +msgid "Or choose from a list of other databases we support:" +msgstr "Ali izberite iz seznama drugih podatkovnih baz, ki jih podpiramo:" -#: superset-frontend/src/dashboard/components/Header/index.jsx:382 -msgid "Your dashboard is too large. Please reduce its size before saving it." -msgstr "Vaša nadzorna plošča je prevelika. Pred shranjevanjem jo zmanjšajte." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:716 +msgid "Supported databases" +msgstr "Podprte podatkovne baze" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:876 -msgid "Your query could not be saved" -msgstr "Vaše poizvedbe ni mogoče shraniti" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:720 +msgid "Choose a database..." +msgstr "Izberite podatkovno bazo..." -#: superset-frontend/src/SqlLab/actions/sqlLab.js:166 -msgid "Your query could not be scheduled" -msgstr "Vaše poizvedbe ni mogoče uvrstiti v urnik" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:744 +msgid "Want to add a new database?" +msgstr "Želite dodati novo podatkovno bazo?" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:892 -msgid "Your query could not be updated" -msgstr "Vaše poizvedbe ni mogoče posodobiti" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:749 +msgid "Any databases that allow connections via SQL Alchemy URIs can be added. " +msgstr "" +"Dodate lahko katerokoli podatkovno bazo, ki podpira konekcije z SQL Alchemy URI-" +"ji. " -#: superset-frontend/src/SqlLab/actions/sqlLab.js:159 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:763 msgid "" -"Your query has been scheduled. To see details of your query, navigate to " -"Saved queries" +"Any databases that allow connections via SQL Alchemy URIs can be added. Learn " +"about how to connect a database driver " msgstr "" -"Vaša poizvedba je v urniku. Za ogled podrobnosti poizvedbe pojdite na " -"shranjene poizvedbe" +"Dodate lahko katerokoli podatkovno bazo, ki podpira konekcije z SQL Alchemy URI-" +"ji. Naučite se kako povezati gonilnik podatkovne baze " -#: superset-frontend/src/SqlLab/actions/sqlLab.js:872 -msgid "Your query was saved" -msgstr "Vaša poizvedba je shranjena" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:827 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:843 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:862 +msgid "Back" +msgstr "Nazaj" -#: superset-frontend/src/SqlLab/actions/sqlLab.js:888 -msgid "Your query was updated" -msgstr "Vaša poizvedba je posodobljena" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:834 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:870 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1199 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1235 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1422 +msgid "Connect" +msgstr "Poveži" -#: superset-frontend/src/reports/actions/reports.js:172 -msgid "Your report could not be deleted" -msgstr "Vašega poročila ni mogoče izbrisati" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:851 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:897 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1422 +msgid "Finish" +msgstr "Zaključi" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:306 -msgid "Zoom" -msgstr "Povečava" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:891 +msgid "This database is managed externally, and can't be edited in Superset" +msgstr "Ta podatkovna baza se ne ureja znotraj Superseta" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:310 -msgid "Zoom level of the map" -msgstr "Stopnja povečave zemljevida" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:995 +msgid "" +"The passwords for the databases below are needed in order to import them. Please " +"note that the \"Secure Extra\" and \"Certificate\" sections of the database " +"configuration are not present in explore files and should be added manually after " +"the import if they are needed." +msgstr "" +"Gesla za spodnje podatkovne baze so potrebna za njihov uvoz. Sekciji \"Dodatna " +"varnost\" in \"Certifikati\" v nastavitvah podatkovne baze nista prisotni v " +"izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če je to potrebno." -#: superset/tasks/schedules.py:658 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1010 #, python-format -msgid "[Alert] %(label)s" -msgstr "[Alert] %(label)s" +msgid "%s PASSWORD" +msgstr "%s GESLO" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "[Od]-" - -#: superset/viz.py:2349 -msgid "[Longitude] and [Latitude] columns must be present in [Group By]" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1034 +msgid "" +"You are importing one or more databases that already exist. Overwriting might " +"cause you to lose some of your work. Are you sure you want to overwrite?" msgstr "" -"Stolpca [Zemljepisna dolžina] in [Zemljepisna širina] morata biti " -"prisotna v [Združevanje]" +"Uvažate eno ali več podatkovnih baz, ki že obstajajo. S prepisom lahko izgubite " +"podatke. Ali ste prepričani, da želite prepisati?" -#: superset/viz.py:2299 -msgid "[Longitude] and [Latitude] must be set" -msgstr "[Zemljepisna dolžina] in [Zemljepisna širina] morata biti nastavljeni" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1045 +#, python-format +msgid "TYPE \"OVERWRITE\" TO CONFIRM" +msgstr "VNESITE \"PREPIŠI\" ZA POTRDITEV" -#: superset/views/core.py:783 -msgid "[Missing Dataset]" -msgstr "[Manjka podatkovni set]" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1102 +msgid "Database Creation Error" +msgstr "Napaka pri ustvarjanju podatkovne baze" -#: superset/utils/core.py:864 -#, python-format -msgid "[Superset] Access to the datasource %(name)s was granted" -msgstr "[Superset] dostop do podatkovnega vira %(name)s je odobren" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1203 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1240 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1426 +msgid "Connect a database" +msgstr "Poveži se s podatkovno bazo" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "[Do]-" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1240 +msgid "Edit database" +msgstr "Uredi podatkovno bazo" -#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 -msgid "[Untitled]" -msgstr "[Neimenovana]" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1297 +msgid "Connect this database using the dynamic form instead" +msgstr "S podatkovno bazo se povežite z dinamičnim obrazcem" -#: superset-frontend/src/dashboard/components/SaveModal.tsx:203 -msgid "[dashboard name]" -msgstr "[ime nadzorne plošče]" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1300 +msgid "" +"Click this link to switch to an alternate form that exposes only the required " +"fields needed to connect this database." +msgstr "" +"Kliknite to povezavo za drugo vnosno formo, ki prikaže samo zahtevana polja za " +"povezavo s podatkovno bazo." -#: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:64 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1356 msgid "" -"[optional] this secondary metric is used to define the color as a ratio " -"against the primary metric. When omitted, the color is categorical and " -"based on labels" +"Select databases require additional fields to be completed in the Advanced tab to " +"successfully connect the database. Learn what requirements your databases has " msgstr "" -"[opcijsko] sekundarna mera določa barvo kot razmerje do primarne mere. Če" -" je izpuščena, je barva določena kategorično na podlagi oznak" +"Izbira podatkovnih baz za uspešno povezavo zahteva izpolnitev dodatnih polj v " +"zavihku Napredno. Naučite se, kaj zahteva vaša podatkovna baza " -#: superset/utils/pandas_postprocessing.py:519 -msgid "`compare_columns` must have the same length as `source_columns`." -msgstr "`compare_columns` morajo imeti enako dolžino kot `source_columns`." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1476 +msgid "Import database from file" +msgstr "Uvozi podatkovno bazo iz datoteke" -#: superset/utils/pandas_postprocessing.py:523 -msgid "`compare_type` must be `difference`, `percentage` or `ratio`" -msgstr "`compare_type` mora biti `difference`, `percentage` ali `ratio`" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1552 +msgid "Connect this database with a SQLAlchemy URI string instead" +msgstr "S to podatkovno bazo se raje povežite z SQLAlchemy URI nizom" -#: superset/charts/schemas.py:557 -msgid "`confidence_interval` must be between 0 and 1 (exclusive)" -msgstr "`confidence_interval` mora biti med 0 in 1 (odprt)" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1557 +msgid "" +"Click this link to switch to an alternate form that allows you to input the " +"SQLAlchemy URL for this database manually." +msgstr "" +"Kliknite to povezavo za drugo vnosno formo, ki omogoča ročni vnos SQLAlchemy URL-" +"ja za to podatkovno bazo." -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:154 +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:40 msgid "" -"`count` is COUNT(*) if a group by is used. Numerical columns will be " -"aggregated with the aggregator. Non-numerical columns will be used to " -"label points. Leave empty to get a count of points in each cluster." +"This can be either an IP address (e.g. 127.0.0.1) or a domain name (e.g. " +"mydatabase.com)." msgstr "" -"`število` je COUNT(*), če je uporabljeno združevanje (group by). " -"Numerični stolpci bodo agregirani z agregatorjem. Ne-numerični stolpci, " -"bodo uporabljeni za oznake točk. Pustite prazno, da dobite število točk v" -" posamezni gruči." +"To je lahko bodisi IP naslov (npr. 127.0.0.1) bodisi ime domene (npr. mydatabase." +"com)." -#: superset/common/query_object.py:388 -msgid "`operation` property of post processing object undefined" -msgstr "Lastnost `operation` poprocesirnega objekta ni definirana" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:45 +msgid "e.g. 127.0.0.1" +msgstr "npr. 127.0.0.1" -#: superset/utils/pandas_postprocessing.py:765 -msgid "`prophet` package not installed" -msgstr "Knjižnica `prophet` ni nameščena" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:47 +msgid "Host" +msgstr "Gostitelj" -#: superset/utils/pandas_postprocessing.py:722 -msgid "`rename_columns` must have the same length as `columns`." -msgstr "`rename_columns` morajo imeti enako dolžino kot `columns`." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:67 +msgid "e.g. 5432" +msgstr "npr. 5432" -#: superset/charts/schemas.py:1070 -msgid "`row_limit` must be greater than or equal to 0" -msgstr "`row_limit` mora biti večja ali enaka 0" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:88 +msgid "e.g. world_population" +msgstr "npr. world_population" -#: superset/charts/schemas.py:1077 -msgid "`row_offset` must be greater than or equal to 0" -msgstr "`row_offset` mora biti večja ali enaka 1" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:91 +msgid "Copy the name of the database you are trying to connect to." +msgstr "Kopirajte ime podatkovne baze, s katero se skušate povezati." -#: superset/charts/schemas.py:932 -msgid "`width` must be greater or equal to 0" -msgstr "`width` mora biti večja ali enaka 0" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:108 +msgid "e.g. Analytics" +msgstr "npr. Analitika" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:413 -msgid "aggregate" -msgstr "agregacija" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:129 +msgid "e.g. ********" +msgstr "npr. ********" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:90 -msgid "alert" -msgstr "opozorilo" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:151 +msgid "Pick a nickname for this database to display as in Superset." +msgstr "Izberite vzdevek za to podatkovno bazo, ki bo prikazan v Supersetu." -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:91 -msgid "alerts" -msgstr "opozorila" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:172 +msgid "e.g. param1=value1¶m2=value2" +msgstr "npr. param1=value1¶m2=value2" -#: superset-frontend/src/dashboard/components/SaveModal.tsx:213 -msgid "also copy (duplicate) charts" -msgstr "kopiraj (podvoji) tudi grafikone" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:173 +msgid "Additional Parameters" +msgstr "Dodatni parametri" -#: superset/views/core.py:823 superset/views/core.py:1000 -msgid "alter this " -msgstr "spreminjanje tega " +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:175 +msgid "Add additional custom parameters" +msgstr "Dodaj dodatne parametre po meri" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:194 -msgid "ancestor" -msgstr "nadrejeni" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:202 +msgid "SSL Mode \"require\" will be used." +msgstr "Uporabljen bo SSL način tipa \"require\"." -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:47 -msgid "and" -msgstr "in" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:73 +msgid "Type of Google Sheets allowed" +msgstr "Dovoljeni tipi Googlovih preglednic" -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:111 -#, python-format -msgid "and the explore view times out at %s seconds " -msgstr "čas izteka raziskovalnega pogleda v sekundah: %s " +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:83 +msgid "Publicly shared sheets only" +msgstr "Samo javno deljene preglednice" -#: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:64 -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:106 -msgid "annotation" -msgstr "oznaka" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:86 +msgid "Public and privately shared sheets" +msgstr "Javno in zasebno deljene preglednice" -#: superset/views/annotations.py:40 -msgid "annotation start time or end time is required." -msgstr "začetni in končni čas oznake je obvezen." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:94 +msgid "How do you want to enter service account credentials?" +msgstr "Kako želite vnesti prijavne podatke servisnega računa?" -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:102 -msgid "annotation_layer" -msgstr "annotation_layer" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:102 +msgid "Upload JSON file" +msgstr "Naloži JSON datoteko" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:48 -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:50 -msgid "at" -msgstr "ob" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:106 +msgid "Copy and Paste JSON credentials" +msgstr "Kopiraj in prilepi JSON prijavne podatke" -#: superset-frontend/packages/superset-ui-chart-controls/src/components/ControlHeader.tsx:74 -#: superset-frontend/src/explore/components/ControlHeader.jsx:76 -msgid "bolt" -msgstr "vijak" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:115 +msgid "Service Account" +msgstr "Servisni račun" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:161 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:179 -msgid "bottom" -msgstr "spodaj" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:124 +msgid "Copy and paste the entire service account .json file here" +msgstr "Tukaj kopirajte in prilepite celotno json datoteko servisnega računa" -#: superset-frontend/src/components/CachedLabel/index.tsx:51 -msgid "cached" -msgstr "predpomnjen" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:134 +msgid "Upload Credentials" +msgstr "Naloži prijavne podatke" -#: superset-frontend/packages/superset-ui-core/src/validator/validateNonEmpty.ts:29 -msgid "cannot be empty" -msgstr "ne sme biti prazno" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:136 +msgid "" +"Use the JSON file you automatically downloaded when creating your service account." +msgstr "" +"Uporabite JSON datoteko, ki ste jo prenesli pri ustvarjanju servisnega računa." -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:143 -#, fuzzy -msgid "" -"cannot be used as a column name. The column name/alias \"__timestamp\"\n" -" is reserved for the main temporal expression, and column " -"aliases ending with\n" -" double underscores followed by a numeric value (e.g. " -"\"my_col__1\") are reserved\n" -" for deduplicating duplicate column names. Please use aliases to" -" rename the\n" -" invalid column names." -msgstr "" -"ni mogoče uporabiti kot imena stolpcev. Ime stolpca \"__timestamp\"\r\n" -" je rezervirano za glavni časovni izraz. Imena stolpcev, ki se " -"končajo z\r\n" -" dvojnim podčrtajem, ki mu sledi številska vrednost (npr. " -"\"moj_stolpec__1\") so rezervirana\r\n" -" za deduplikacijo duplikatov imen stolpcev. Za preimenovanje " -"neustreznih imen\r\n" -" uporabite psevdonime." - -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:146 -#: superset-frontend/src/views/CRUD/chart/ChartList.tsx:699 -#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:81 -#: superset/views/core.py:823 superset/views/core.py:829 -msgid "chart" -msgstr "grafikona" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:40 +msgid "Connect Google Sheets as tables to this database" +msgstr "Googlove preglednice poveži s to podatkovno bazo kot tabele" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:26 -#, fuzzy -msgid "charts" -msgstr "grafikona" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:46 +msgid "Google Sheet Name and URL" +msgstr "Ime Googlove preglednice in URL" -#: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:101 -msgid "choose WHERE or HAVING..." -msgstr "izberite WHERE ali HAVING..." +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:54 +msgid "Enter a name for this sheet" +msgstr "Vnesite ime te preglednice" -#: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:402 -msgid "column" -msgstr "stolpec" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:78 +msgid "Paste the shareable Google Sheet URL here" +msgstr "Prilepite deljeni URL Googlove preglednice sem" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:116 -msgid "count" -msgstr "število" +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:98 +msgid "Add sheet" +msgstr "Dodaj preglednico" -#: superset/views/core.py:829 superset/views/core.py:1018 -msgid "create a " -msgstr "ustvarite " +#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/ValidatedInputField.tsx:26 +msgid "Copy the account name of that database you are trying to connect to." +msgstr "Kopirajte ime računa podatkovne baze, s katero se skušate povezati." -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:253 -msgid "css" -msgstr "css" +#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:125 +msgid "Add dataset" +msgstr "Dodaj podatkovni set" -#: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:91 -msgid "css_template" -msgstr "css_template" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:171 +msgid "Dataset imported" +msgstr "Podatkovni set uvožen" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:120 -msgid "cumulative" -msgstr "kumulativno" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:207 +msgid "An error occurred while fetching dataset related data" +msgstr "Napaka pri pridobivanju podatkov iz podatkovnega seta" -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:115 -#: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:678 -#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:77 -#: superset/views/core.py:1001 superset/views/core.py:1019 -msgid "dashboard" -msgstr "nadzorna plošča" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:227 +#, python-format +msgid "An error occurred while fetching dataset related data: %s" +msgstr "Napaka pri pridobivanju podatkov iz podatkovnega seta: %s" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:27 -#, fuzzy -msgid "dashboards" -msgstr "nadzorna plošča" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:254 +msgid "Physical dataset" +msgstr "Fizičen podatkovni set" -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:89 -#: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:471 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:464 -msgid "database" -msgstr "podatkovna baza" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:262 +msgid "Virtual dataset" +msgstr "Virtualen podatkovni set" -#: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:116 -#: superset-frontend/src/views/CRUD/data/dataset/AddDatasetModal.tsx:61 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:123 -#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:699 -msgid "dataset" -msgstr "podatkovni set" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:469 +#, python-format +msgid "An error occurred while fetching dataset owner values: %s" +msgstr "Pri pridobivanju polja lastnik podatkovnega seta je prišlo do napake: %s" -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:304 -msgid "date" -msgstr "datum" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:488 +#, python-format +msgid "An error occurred while fetching datasets: %s" +msgstr "Prišlo je do napake pri pridobivanju podatkovnih setov: %s" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:39 -msgid "day" -msgstr "dan" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:503 +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:358 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:456 +#, python-format +msgid "An error occurred while fetching schema values: %s" +msgstr "Pri pridobivanju vrednosti shem je prišlo do napake: %s" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:30 -msgid "day of the month" -msgstr "dan v mesecu" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:572 +msgid "Import datasets" +msgstr "Uvozi podatkovne sete" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:32 -msgid "day of the week" -msgstr "dan v tednu" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:623 +#, python-format +msgid "There was an issue deleting the selected datasets: %s" +msgstr "Pri brisanju izbranih podatkovnih setov je prišlo do težave: %s" -#: superset-frontend/src/components/DeleteModal/index.tsx:84 -msgid "delete" -msgstr "izbriši" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:639 +#, python-format +msgid "" +"The dataset %s is linked to %s charts that appear on %s dashboards. Are you sure " +"you want to continue? Deleting the dataset will break those objects." +msgstr "" +"Podatkovni set %s je povezan z grafikoni %s, ki so prisotni na nadzorni plošči " +"%s. Ali želite nadaljevati? Izbris podatkovnega seta bo pokvaril te objekte." -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:195 -msgid "descendant" -msgstr "podrejeni" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:652 +msgid "Delete Dataset?" +msgstr "Izbrišem podatkovni set?" -#: superset-frontend/packages/superset-ui-chart-controls/src/components/ControlHeader.tsx:64 -#: superset-frontend/src/explore/components/ControlHeader.jsx:66 -#: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:327 -#: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:258 -msgid "description" -msgstr "opis" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:665 +msgid "Are you sure you want to delete the selected datasets?" +msgstr "Ali ste prepričani, da želite izbrisati izbrane podatkovne sete?" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:71 -msgid "dialect+driver://username:password@host:port/database" -msgstr "dialect+driver://username:password@host:port/database" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:715 +msgid "0 Selected" +msgstr "Izbranih: 0" -#: superset/views/core.py:618 -msgid "download as csv" -msgstr "prenos kot csv" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:718 +#, python-format +msgid "%s Selected (Virtual)" +msgstr "Izbranih: %s (virtualni)" -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:153 -msgid "draft" -msgstr "osnutek" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:725 +#, python-format +msgid "%s Selected (Physical)" +msgstr "Izbranih: %s (fizični)" -#: superset/views/log/__init__.py:32 -msgid "dttm" -msgstr "dttm" +#: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:732 +#, python-format +msgid "%s Selected (%s Physical, %s Virtual)" +msgstr "Izbranih: %s (fizični: %s, virtualni: %s)" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:129 -msgid "e.g. ********" +#: superset-frontend/src/views/CRUD/data/dataset/constants.ts:23 +msgid "" +"The passwords for the databases below are needed in order to import them together " +"with the datasets. Please note that the \"Secure Extra\" and \"Certificate\" " +"sections of the database configuration are not present in export files, and " +"should be added manually after the import if they are needed." msgstr "" +"Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj s podatkovnimi seti. " +"Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah podatkovne baze " +"nista prisotni v izvoženih datotekah in jih je potrebno dodati ročno po uvozu, če " +"je to potrebno." -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:45 -msgid "e.g. 127.0.0.1" +#: superset-frontend/src/views/CRUD/data/dataset/constants.ts:30 +msgid "" +"You are importing one or more datasets that already exist. Overwriting might " +"cause you to lose some of your work. Are you sure you want to overwrite?" msgstr "" +"Uvažate enega ali več podatkovnih setov, ki že obstajajo. S prepisom lahko " +"izgubite podatke. Ali ste prepričani, da želite prepisati?" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:67 -msgid "e.g. 5432" -msgstr "" +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:109 +#, python-format +msgid "There was an issue previewing the selected query. %s" +msgstr "Pri predogledu izbrane poizvedbe je prišlo do težave. %s" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:108 -#, fuzzy -msgid "e.g. Analytics" -msgstr "Napredna analitika" +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:205 +#, python-format +msgid "Duration: %s" +msgstr "Trajanje: %s" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:172 -msgid "e.g. param1=value1¶m2=value2" -msgstr "" +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:218 +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:145 +msgid "Tab name" +msgstr "Naslov zavihka" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:88 -msgid "e.g. world_population" -msgstr "" +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:250 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:307 +msgid "TABLES" +msgstr "TABELE" -#: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:126 -msgid "e.g., a \"user id\" column" -msgstr "t.j. stolpec \"id uporabnika\"" +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:317 +msgid "Open query in SQL Lab" +msgstr "Odpri poizvedbo v SQL laboratoriju" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:27 -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:35 -msgid "every" -msgstr "vsak" +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:341 +#, python-format +msgid "An error occurred while fetching database values: %s" +msgstr "Pri pridobivanju vrednosti podatkovne baze je prišlo do napake: %s" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:29 -msgid "every day of the month" -msgstr "vsak dan v mesecu" +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:375 +#, python-format +msgid "An error occurred while fetching user values: %s" +msgstr "Pri pridobivanju vrednosti uporabnika je prišlo do napake: %s" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:31 -msgid "every day of the week" -msgstr "vsak dan v tednu" +#: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:388 +msgid "Search by query text" +msgstr "Išči z besedilom poizvedbe" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:33 -msgid "every hour" -msgstr "vsako uro" +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:133 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:113 +msgid "Next" +msgstr "Naslednji" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:34 -msgid "every minute" -msgstr "vsako minuto" +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:141 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:121 +msgid "Open in SQL Lab" +msgstr "Odpri v SQL laboratoriju" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:28 -msgid "every month" -msgstr "vsak mesec" +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:154 +msgid "User query" +msgstr "Uporabnikova poizvedba" -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:123 -msgid "feature to store a summarized data set that you can then explore." -msgstr "funkcijo shranjevanja strnjenega podatkovnega seta, ki ga lahko raziščete." +#: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:162 +msgid "Executed query" +msgstr "Zagnana poizvedba" -#: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:87 -msgid "fetching" -msgstr "pridobivam" +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:56 +msgid "" +"The passwords for the databases below are needed in order to import them together " +"with the saved queries. Please note that the \"Secure Extra\" and \"Certificate\" " +"sections of the database configuration are not present in export files, and " +"should be added manually after the import if they are needed." +msgstr "" +"Gesla za spodnje podatkovne baze so potrebna za uvoz skupaj s shranjenimi " +"poizvedbami. Sekciji \"Dodatna varnost\" in \"Certifikati\" v nastavitvah " +"podatkovne baze nista prisotni v izvoženih datotekah in jih je potrebno dodati " +"ročno po uvozu, če je to potrebno." -#: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:86 -#: superset-frontend/src/dashboard/containers/DashboardPage.tsx:143 +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:63 msgid "" -"filter_box will be deprecated in a future version of Superset. Please " -"replace filter_box by dashboard filter components." +"You are importing one or more saved queries that already exist. Overwriting might " +"cause you to lose some of your work. Are you sure you want to overwrite?" msgstr "" -"Element filter_box bo v prihodnjih verzijah Superseta opuščen. " -"Nadomestite ga s filtri nadzorne plošče." +"Uvažate eno ali več shranjenih poizvedb, ki že obstajajo. S prepisom lahko " +"izgubite podatke. Ali ste prepričani, da želite prepisati?" -#: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:115 -msgid "following this flow will most likely lead to your query timing out. " -msgstr "s takšnim potekom, bo poizvedba najverjetneje potekla. " +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:129 +msgid "Query imported" +msgstr "Poizvedba uvožena" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:86 -msgid "for more information on how to structure your URI." -msgstr "za več informacij o oblikovanju URI." +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:152 +#, python-format +msgid "There was an issue previewing the selected query %s" +msgstr "Do težave je prišlo pri predogledu izbrane poizvedbe %s" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:41 -msgid "green" -msgstr "zelena" +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:190 +msgid "Import queries" +msgstr "Uvozi poizvedbe" -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:724 -#: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1136 -#, fuzzy -msgid "here" -msgstr "Deljenje" +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:264 +#, python-format +msgid "There was an issue deleting the selected queries: %s" +msgstr "Do težave je prišlo pri brisanju izbranih poizvedb: %s" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:40 -msgid "hour" -msgstr "ura" +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:385 +msgid "Edit query" +msgstr "Uredi poizvedbo" -#: superset-frontend/src/profile/components/UserInfo.tsx:75 -msgid "id:" -msgstr "id:" +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:392 +msgid "Copy query URL" +msgstr "Kopiraj URL poizvedbe" -#: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:153 -msgid "" -"image-rendering CSS attribute of the canvas object that defines how the " -"browser scales up the image" -msgstr "" -"atribut CSS za izris objekta platna, ki določa, kako brskalnik poveča " -"sliko" +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:399 +msgid "Export query" +msgstr "Izvozi poizvedbe" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:44 -msgid "in" -msgstr "v" +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:406 +msgid "Delete query" +msgstr "Izbriši poizvedbo" -#: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:122 -msgid "in modal" -msgstr "v modalnem" +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:477 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:250 +msgid "This action will permanently delete the saved query." +msgstr "S tem dejanjem boste trajno izbrisali shranjeno poizvedbo." -#: superset-frontend/packages/superset-ui-core/src/validator/legacyValidateNumber.ts:28 -#: superset-frontend/packages/superset-ui-core/src/validator/validateNumber.ts:32 -msgid "is expected to be a number" -msgstr "pričakovano je število" +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:487 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:262 +msgid "Delete Query?" +msgstr "Izbrišem poizvedbo?" -#: superset-frontend/packages/superset-ui-core/src/validator/legacyValidateInteger.ts:31 -#: superset-frontend/packages/superset-ui-core/src/validator/validateInteger.ts:32 -msgid "is expected to be an integer" -msgstr "pričakovano je celo število" +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:502 +msgid "Are you sure you want to delete the selected queries?" +msgstr "Ali ste prepričani, da želite izbrisati izbrane poizvedbe?" -#: superset-frontend/src/profile/components/UserInfo.tsx:64 -msgid "joined" -msgstr "pridružen" +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:545 +msgid "queries" +msgstr "poizvedbe" -#: superset/views/base.py:527 -msgid "json isn't valid" -msgstr "json ni veljaven" +#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryPreviewModal.tsx:125 +msgid "Query name" +msgstr "Ime poizvedbe" + +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:93 +msgid "[Untitled]" +msgstr "[Neimenovana]" + +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 +msgid "Unknown" +msgstr "Neznano" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:233 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:261 -msgid "key a-z" -msgstr "a - ž" +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:123 +#, python-format +msgid "Viewed %s" +msgstr "Ogledane %s" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:234 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:262 -msgid "key z-a" -msgstr "ž - a" +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:160 +msgid "Edited" +msgstr "Urejane" -#: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:152 -msgid "label" -msgstr "oznaka" +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:168 +msgid "Created" +msgstr "Ustvarjene" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:39 -msgid "last day" -msgstr "zadnji dan" +#: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:179 +msgid "Viewed" +msgstr "Ogledane" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:41 -msgid "last month" -msgstr "zadnji mesec" +#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:173 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:186 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:279 +msgid "Mine" +msgstr "Moje" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:42 -msgid "last quarter" -msgstr "zadnje četrletje" +#: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:220 +#: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:228 +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:297 +msgid "View All »" +msgstr "Poglejte vse »" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:40 -msgid "last week" -msgstr "zadnji teden" +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:26 +msgid "charts" +msgstr "grafikoni" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:43 -msgid "last year" -msgstr "zadnje leto" +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:27 +msgid "dashboards" +msgstr "nadzorne plošče" -#: superset-frontend/src/SqlLab/components/TableElement/index.tsx:120 -msgid "latest partition:" -msgstr "zadnja particija:" +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:28 +msgid "recents" +msgstr "nedavne" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:158 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:176 -msgid "left" -msgstr "levo" +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:29 +msgid "saved queries" +msgstr "shranjene poizvedbe" -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:63 -msgid "log" -msgstr "dnevnik" +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:74 +#, python-format +msgid "No %(tableName)s yet" +msgstr "%(tableName)s še ni" -#: superset/charts/schemas.py:624 -msgid "" -"lower percentile must be greater than 0 and less than 100. Must be lower " -"than upper percentile." +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:81 +msgid "Recently viewed charts, dashboards, and saved queries will appear here" msgstr "" -"spodnji percentil mora biti večji od 0 in manjši od 100 ter mora biti " -"manjši od zgornjega percentila." - -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:41 -msgid "minute" -msgstr "minuta" +"Nedavno ogledani grafikoni, nadzorne plošče in shranjene poizvedbe bodo prikazane " +"tukaj" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:51 -msgid "minute(s)" -msgstr "minuta/e" +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:86 +msgid "Recently created charts, dashboards, and saved queries will appear here" +msgstr "" +"Nedavno ustvarjeni grafikoni, nadzorne plošče in shranjene poizvedbe bodo " +"prikazane tukaj" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:37 -msgid "month" -msgstr "mesec" +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:92 +#, python-format +msgid "Example %(tableName)s will appear here" +msgstr "Primer %(tableName)s se bo prikazal tukaj" -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:116 -#: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:138 -msgid "must have a value" -msgstr "mora imeti vrednost" +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:96 +msgid "Recently edited charts, dashboards, and saved queries will appear here" +msgstr "" +"Nedavno urejani grafikoni, nadzorne plošče in shranjene poizvedbe bodo prikazane " +"tukaj" -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:54 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:39 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:31 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:34 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:49 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:34 -#: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:29 -msgid "nvd3" -msgstr "nvd3" +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:124 +#: superset-frontend/src/views/components/MenuRight.tsx:166 +msgid "SQL query" +msgstr "SQL poizvedba" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:45 -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:46 -msgid "on" -msgstr "v" +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:143 +msgid "You don't have any favorites yet!" +msgstr "Priljubljenih še niste izbrali!" -#: superset/charts/schemas.py:1098 -msgid "orderby column must be populated" -msgstr "stolpec za razvrščanje (orderby) mora biti izpolnjen" +#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:156 +#, python-format +msgid "See all %(tableName)s" +msgstr "Poglej vse %(tableName)s" -#: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:85 -msgid "p-value precision" -msgstr "točnost p-vrednosti" +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:130 +msgid "query" +msgstr "poizvedba" -#: superset-frontend/plugins/plugin-chart-table/src/consts.ts:26 -msgid "page_size.all" -msgstr "page_size.all" +#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:319 +#, python-format +msgid "Ran %s" +msgstr "Pretečeno %s" -#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:159 -msgid "page_size.entries" -msgstr "page_size.entries" +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:203 +#, python-format +msgid "There was an issue fetching your recent activity: %s" +msgstr "Pri pridobivanju vaše nedavne aktivnosti je prišlo do napake: %s" -#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:139 -msgid "page_size.show" -msgstr "page_size.show" +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:225 +#, python-format +msgid "There was an issue fetching your dashboards: %s" +msgstr "Prišlo je do napake pri pridobivanju nadzornih plošč: %s" -#: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:124 -msgid "percentile (exclusive)" -msgstr "percentil (ekskluzivno)" +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:236 +#, python-format +msgid "There was an issue fetching your chart: %s" +msgstr "Prišlo je do napake pri pridobivanju grafikona: %s" -#: superset/utils/pandas_postprocessing.py:921 -msgid "" -"percentiles must be a list or tuple with two numeric values, of which the" -" first is lower than the second value" -msgstr "" -"percentili morajo biti tipa list ali tuple z vsaj dvema numeričnima " -"vrednostma, pri čemer je prva manjša od druge" +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:247 +#, python-format +msgid "There was an issues fetching your saved queries: %s" +msgstr "Prišlo je do napake pri pridobivanju shranjenih poizvedb: %s" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:53 -msgid "previous calendar month" -msgstr "prejšnji koledarski mesec" +#: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:291 +msgid "Recents" +msgstr "Nedavno" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:50 -msgid "previous calendar week" -msgstr "prejšnji koledarski teden" +#: superset-frontend/src/views/components/MenuRight.tsx:136 +msgid "Connect database" +msgstr "Poveži se s podatkovno bazo" -#: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:56 -msgid "previous calendar year" -msgstr "prejšnje koledarsko leto" +#: superset-frontend/src/views/components/MenuRight.tsx:141 +msgid "Connect Google Sheet" +msgstr "Povežite Googlovo preglednico" -#: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:153 -msgid "published" -msgstr "objavljeno" +#: superset-frontend/src/views/components/MenuRight.tsx:146 +msgid "Upload CSV to database" +msgstr "Naloži CSV v podatkovno bazo" -#: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:543 -msgid "queries" -msgstr "poizvedbe" +#: superset-frontend/src/views/components/MenuRight.tsx:152 +msgid "Upload columnar file to database" +msgstr "Naloži datoteko s stolpci v podatkovno bazo" -#: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:129 -msgid "query" -msgstr "poizvedba" +#: superset-frontend/src/views/components/MenuRight.tsx:158 +msgid "Upload Excel file to database" +msgstr "Naloži Excel-ovo datoteko v podatkovno bazo" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:42 -msgid "reboot" -msgstr "ponovni zagon" +#: superset-frontend/src/views/components/MenuRight.tsx:232 +#: superset-frontend/src/views/components/SubMenu.tsx:301 +msgid "Enable 'Allow data upload' in any database's settings" +msgstr "Omogoči 'Dovoli nalaganje podatkov' za vse podatkovne baze" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:28 -#, fuzzy -msgid "recents" -msgstr "Nedavno" +#: superset-frontend/src/views/components/MenuRight.tsx:377 +msgid "About" +msgstr "O programu" -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:43 -msgid "red" -msgstr "rdeča" +#: superset-frontend/src/views/components/MenuRight.tsx:381 +msgid "Powered by Apache Superset" +msgstr "Omogoča Apache Superset" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:90 -#: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:484 -msgid "report" -msgstr "poročilo" +#: superset-frontend/src/views/components/MenuRight.tsx:415 +msgid "Documentation" +msgstr "Dokumentacija" -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:91 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:117 -#: superset-frontend/src/views/CRUD/alert/AlertList.tsx:126 -#: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:72 -msgid "reports" -msgstr "poročila" +#: superset-frontend/src/views/components/MenuRight.tsx:426 +msgid "Report a bug" +msgstr "Sporočite napako" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:160 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:178 -msgid "right" -msgstr "desno" +#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:305 +msgid "Select start and end date" +msgstr "Izberite začetni in končni datum" -#: superset-frontend/src/explore/components/RowCountLabel.jsx:35 -msgid "rows" -msgstr "vrstic" +#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:412 +#, python-format +msgid "Type or Select [%s]" +msgstr "Vnesite ali izberite [%s]" -#: superset-frontend/src/explore/components/DataTableControl/index.tsx:96 -msgid "rows retrieved" -msgstr "vrnjenih vrstic" +#: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:433 +msgid "No results found" +msgstr "Rezultati niso najdeni" -#: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:29 -#, fuzzy -msgid "saved queries" -msgstr "Shranjene poizvedbe" +#: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:25 +msgid "Tools" +msgstr "Orodja" -#: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:124 -msgid "search.num_records" -msgstr "search.num_records" +#: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:26 +msgid "Filter box" +msgstr "Izbirnik za filtriranje" -#: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:98 +#: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:28 msgid "" -"series: Treat each series independently; overall: All series use the same" -" scale; change: Show changes compared to the first data point in each " -"series" +"Chart component that lets you add a custom filter UI in your dashboard. When " +"added to dashboard, a filter box lets users specify specific values or ranges to " +"filter charts by. The charts that each filter box is applied to can be fine tuned " +"as well in the dashboard view.\n" +"\n" +" Note that this plugin is being replaced with the new Filters feature that " +"lives in the dashboard view itself. It's easier to use and has more capabilities!" msgstr "" -"serije: Obravnavaj vsako podatkovno serijo neodvisno; skupno: Vse vrste " -"uporabljajo enako skalo; razlika: Pokaži razlike glede na prvo točko " -"vsake serije" +"Komponenta grafikona, ki omogoča dodajanje vmesnika filtrov po meri v nadzorno " +"ploščo. Ko je dodana na nadzorno ploščo, lahko uporabnik določi poljubne " +"vrednosti ali obsege filtrov. Grafikoni, na katere se nanašajo filtri, so lahko " +"precizno izbrani tudi v pogledu nadzorne plošče.\n" +"\n" +" Vedite, da bo ta vtičnik v prihodnosti zamenjan z novim konceptom filtrov, ki " +"bodo živeli v kontekstu same nadzorne plošče in bodo zmogljivejši ter " +"enostavnejši za uporabo!" -#: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:92 -msgid "textarea" -msgstr "področje besedila" +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:27 +msgid "Filters configuration" +msgstr "Nastavitve filtrov" -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:159 -#: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:177 -msgid "top" -msgstr "zgoraj" +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:36 +msgid "Filter configuration for the filter box" +msgstr "Nastavitve za polje filtra" + +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:49 +msgid "Date filter" +msgstr "Filter po datumu" + +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:51 +msgid "Whether to include a time filter" +msgstr "Če želite vključiti časovni filter" -#: superset/charts/schemas.py:639 +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:60 +msgid "Instant filtering" +msgstr "Takojšnje filtriranje" + +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:63 msgid "" -"upper percentile must be greater than 0 and less than 100. Must be higher" -" than lower percentile." +"Check to apply filters instantly as they change instead of displaying [Apply] " +"button" msgstr "" -"zgornji percentil mora biti večji od 0 in manjši od 100 ter mora biti " -"večji od spodnjega percentila." +"Izberite za takojšnjo uporabo filtrov, ko se spremenijo, brez prikazovanja gumba " +"Uveljavi" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:235 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:263 -msgid "value ascending" -msgstr "0 - 9" +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:75 +msgid "Limit selector values" +msgstr "Omeji vrednosti izbirnikov" -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:236 -#: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:264 -msgid "value descending" -msgstr "9 - 0" +#: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:76 +msgid "These filters apply to the values available in the dropdowns" +msgstr "Ti filtri se nanašajo na vrednosti v spustnih seznamih" -#: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:857 -msgid "virtual" -msgstr "virtualni" +#: superset-frontend/src/visualizations/TimeTable/controlPanel.js:51 +msgid "URL" +msgstr "URL" -#: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:715 -msgid "was created" -msgstr "ustvarjeno" +#: superset-frontend/src/visualizations/TimeTable/controlPanel.js:52 +msgid "" +"Templated link, it's possible to include {{ metric }} or other values coming from " +"the controls." +msgstr "" +"Vzorčna povezava, vključiti je mogoče {{ metric }} ali drugo vrednost iz " +"kontrolnikov." -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:38 -msgid "week" -msgstr "teden" +#: superset-frontend/src/visualizations/TimeTable/index.ts:26 +msgid "Time-series Table" +msgstr "Tabela s časovno vrsto" -#: superset-frontend/src/components/CronPicker/CronPicker.tsx:36 -msgid "year" -msgstr "leto" +#: superset-frontend/src/visualizations/TimeTable/index.ts:27 +msgid "" +"Compare multiple time series charts (as sparklines) and related metrics quickly." +msgstr "" +"Hitra primerjava več grafikonov časovnih vrst (sparkline način) in povezanih mer." -#: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:42 -msgid "yellow" -msgstr "rumena" +#: superset-frontend/src/visualizations/TimeTable/index.ts:36 +msgid "Text" +msgstr "Besedilo" + +#: superset-frontend/src/visualizations/dashboardComponents/ExampleComponent/ExampleComponent.tsx:29 +#, python-format +msgid "We have the following keys: %s" +msgstr "Imamo naslednje ključe: %s" diff --git a/superset/translations/zh/LC_MESSAGES/messages.json b/superset/translations/zh/LC_MESSAGES/messages.json index b7fd50528ee2..f703ec251889 100644 --- a/superset/translations/zh/LC_MESSAGES/messages.json +++ b/superset/translations/zh/LC_MESSAGES/messages.json @@ -7,3119 +7,4534 @@ "plural_forms": "nplurals=1; plural=0", "lang": "zh" }, - "Home": ["主页"], - "Annotation Layers": ["注释层"], - "Manage": ["管理"], - "Databases": ["数据库"], - "Data": ["数据"], - "Datasets": ["数据集"], - "Charts": ["图表"], - "Dashboards": ["看板"], - "Plugins": ["插件"], - "CSS Templates": ["CSS 模板"], - "Row level security": ["行级安全"], - "Security": ["安全"], - "Import Dashboards": ["导入看板"], - "SQL Editor": ["SQL 编辑器"], - "SQL Lab": ["SQL 工具箱"], - "Saved Queries": ["已保存查询"], - "Query History": ["历史查询"], - "Upload a CSV": ["上传CSV文件"], - "Upload Excel": ["上传Excel"], - "Action Log": ["操作日志"], - "Dashboard Emails": ["看板"], - "Chart Email Schedules": ["图表电子邮件时间表"], - "Alerts": ["警报"], - "Alerts & Reports": ["警报和报告"], - "Access requests": ["访问请求"], - "Druid Datasources": ["Druid 数据源"], - "Druid Clusters": ["Druid 集群"], - "Scan New Datasources": ["扫描新的数据源"], - "Refresh Druid Metadata": ["刷新 Druid 元数据"], - "Issue 1000 - The datasource is too large to query.": [ - "Issue 1000 - 数据源太大,无法进行查询。" - ], - "Issue 1001 - The database is under an unusual load.": [ - "Issue 1001 - 数据库负载异常。" + "\n This filter was inherited from the dashboard's context.\n It won't be saved when saving the chart.\n ": [ + "此过滤条件是从看板上下文继承的。保存图表时不会保存。" ], - "Issue 1002 - The database returned an unexpected error.": [ - "Issue 1002 - 数据库返回意外错误。" + "\n <b><a href=\"%(url)s\">Explore in Superset</a></b><p></p>\n <img src=\"cid:%(msgid)s\">\n ": [ + "\n <b><a href=\"%(url)s\">探索 Superset</a></b><p></p>\n <img src=\"cid:%(msgid)s\">\n " ], - "Issue 1003 - There is a syntax error in the SQL query. Perhaps there was a misspelling or a typo.": [ - "Issue 1003 - SQL查询中存在语法错误。可能是拼写错误或是打错关键字。" + "\n Error: %(text)s\n ": [""], + "\n *%(name)s*\n\n <%(url)s|Explore in Superset>\n ": [ + "\n *%(name)s*\n\n <%(url)s|探索 Superset>\n " ], - "Issue 1004 - The column was deleted or renamed in the database.": [ - "Issue 1004 - 该列已在数据库中删除或重命名。" + "\n *%(slice_name)s*\n\n <%(slice_url_user_friendly)s|Explore in Superset>\n ": [ + "\n *%(slice_name)s*\n\n <%(slice_url_user_friendly)s|探索 Superset>\n " ], - "Issue 1005 - The table was deleted or renamed in the database.": [ - "Issue 1005 - 该表已在数据库中删除或重命名。" + " (excluded)": ["(不包含)"], + " expression which needs to adhere to the ": [" 表达式并基于 "], + " standard to ensure that the lexicographical ordering\n coincides with the chronological ordering. If the\n timestamp format does not adhere to the ISO 8601 standard\n you will need to define an expression and type for\n transforming the string into a date or timestamp. Note\n currently time zones are not supported. If time is stored\n in epoch format, put `epoch_s` or `epoch_ms`. If no pattern\n is specified we fall back to using the optional defaults on a per\n database/column name level via the extra parameter.": [ + "来确保字符的表达顺序与时间顺序一致的标准。如果时间戳格式不符合 ISO 8601 标准,则需要定义表达式和类型,以便将字符串转换为日期或时间戳。注意:当前不支持时区。如果时间以epoch格式存储,请输入 `epoch_s` or `epoch_ms` 。如果没有指定任何模式,我们可以通过额外的参数在每个数据库/列名级别上使用可选的默认值。" ], - "Issue 1006 - One or more parameters specified in the query are missing.": [ - "Issue 1006 - 查询中指定的一个或多个参数丢失。" + "!= (Is not equal)": ["!= (不等于)"], + "${tableName\n .split('')\n .slice(0, tableName.length - 1)\n .join('')}\n ": [ + "" ], - "Invalid certificate": ["无效认证"], - "Unsafe return type for function %(func)s: %(value_type)s": [ - "函数返回不安全的类型 %(func)s: %(value_type)s" + "%(dialect)s cannot be used as a data source for security reasons.": [ + "出于安全原因,%(dialect)s SQLite数据库不能用作数据源。" ], - "Unsupported return value for method %(name)s": [ - "方法的返回值不受支持 %(name)s" + "%(message)s\nThis may be triggered by: \n%(issues)s": [ + "%(message)s\n这可能由以下因素触发:%(issues)s" ], - "Unsafe template value for key %(key)s: %(value_type)s": [ - "键的模板值不安全 %(key)s: %(value_type)s" + "%(name)s.csv": [""], + "%(object)s does not exist in this database.": [ + "%(object)s 数据库中不存在。" ], - "Unsupported template value for key %(key)s": [ - "键的模板值不受支持 %(key)s" + "%(prefix)s %(title)s": [""], + "%(rows)d rows returned": ["%(rows)d行被检索到"], + "%(subtitle)s\nThis may be triggered by:\n %(issue)s": [ + "%(subtitle)s\n这可能由以下因素触发:%(issue)s" ], - "Only `SELECT` statements are allowed against this database": [ - "此数据库只允许使用 `SELECT` 语句" + "%(suggestion)s instead of \"%(undefinedParameter)s?\"": [ + "用 %(suggestion)s 替换 \"%(undefinedParameter)s\" 吗?" ], - "CTAS (create table as select) can only be run with a query where the last statement is a SELECT. Please make sure your query has a SELECT as its last statement. Then, try running your query again.": [ - "CTA(create table as select)只能与最后一条语句为SELECT的查询一起运行。请确保查询的最后一个语句是SELECT。然后再次尝试运行查询。" + "%(user)s was granted the role %(role)s that gives access to the %(datasource)s": [ + "授予 %(user)s %(role)s 角色来访问 %(datasource)s 数据库" ], - "CVAS (create view as select) can only be run with a query with a single SELECT statement. Please make sure your query has only a SELECT statement. Then, try running your query again.": [ - "CVAS(createview as select)只能与带有单个SELECT语句的查询一起运行。请确保您的查询只有SELECT语句。然后再次尝试运行查询。" + "%(user)s's profile": ["%(user)s 的信息"], + "%(validator)s was unable to check your query.\nPlease recheck your query.\nException: %(ex)s": [ + "%(validator)s 无法检查您的查询。\n请重新检查您的查询。\n异常: %(ex)s" ], - "Viz is missing a datasource": ["Viz 缺少一个数据源"], - "Applied rolling window did not return any data. Please make sure the source query satisfies the minimum periods defined in the rolling window.": [ - "应用的滚动窗口(rolling window)未返回任何数据。请确保源查询满足滚动窗口中定义的最小周期。" + "%s - untitled": ["%s - 无标题"], + "%s Error": ["%s 异常"], + "%s Selected": ["%s 已选定"], + "%s Selected (%s Physical, %s Virtual)": [ + "%s 个被选中 (%s 个物理, %s 个虚拟)" ], - "From date cannot be larger than to date": ["起始时间不可以大于当前时间"], - "Cached value not found": ["缓存的值未找到"], - "Columns missing in datasource: %(invalid_columns)s": [ - "数据源中缺少列:%(invalid_columns)s" + "%s Selected (Physical)": ["%s 个被选中(物理)"], + "%s Selected (Virtual)": ["%s 个被选中(虚拟)"], + "%s aggregates(s)": ["%s 聚合"], + "%s column(s)": ["%s 列"], + "%s column(s) and metric(s)": ["%s 列与计量指标"], + "%s operator(s)": ["%s 运算符"], + "%s option": ["%s 个选项"], + "%s option(s)": ["%s 个选项"], + "%s saved metric(s)": ["%s 列与计量指标"], + "%s%s": ["%s%s"], + "%s-%s of %s": ["%s-%s 总计 %s"], + "(Removed)": ["(已删除)"], + "(deleted)": ["删除"], + "(no description, click to see stack trace)": [ + "无描述,单击可查看堆栈跟踪" ], - "Table View": ["表视图"], - "You cannot use [Columns] in combination with [Group By]/[Metrics]/[Percentage Metrics]. Please choose one or the other.": [ - "不能将 [列] 与 [分组]/[指标]/[百分比度量] 结合使用。请选择其中一个。" + "(optional) default value for the filter, when using the multiple option, you can use a semicolon-delimited list of options.": [ + "过滤器的默认值,当使用多选框的时候,您可以使用带分号的分隔列表。" ], - "Pick a granularity in the Time section or uncheck 'Include Time'": [ - "在“时间”部分选择一个粒度,或取消选中“包含时间”" + "*%(name)s*\n\n%(description)s\n\n<%(url)s|Explore in Superset>\n\n%(table)s\n": [ + "" ], - "Time Table View": ["时间表视图"], - "Pick at least one metric": ["选择至少一个指标"], - "When using 'Group By' you are limited to use a single metric": [ - "当使用“Group by”时,只限于使用单个度量。" + "*%(name)s*\n\n%(description)s\n\nError: %(text)s\n": [""], + "**Select** a dashboard OR **create** a new one": [ + "**选择** 一个看板或者 **创建** 一个看板" ], - "Pivot Table": ["透视表"], - "Please choose at least one 'Group by' field ": [ - "请至少选择一个分组字段 " + "-- Note: Unless you save your query, these tabs will NOT persist if you clear your cookies or change browsers.\n\n": [ + "-- 注意:除非您保存查询,否则如果清除cookie或更改浏览器时,这些选项卡将不会保留。" ], - "Please choose at least one metric": ["请至少选择一个指标"], - "Group By' and 'Columns' can't overlap": ["“Group by”列和字段不能重叠"], - "Treemap": ["树状图"], - "Calendar Heatmap": ["时间热力图"], - "Bubble Chart": ["气泡图"], - "Please use 3 different metric labels": ["请在左右轴上选择不同的指标"], - "Pick a metric for x, y and size": ["为 x 轴,y 轴和大小选择一个指标"], - "Bullet Chart": ["子弹图"], - "Pick a metric to display": ["选择一个指标来显示"], - "Big Number with Trendline": ["数字和趋势线"], - "Pick a metric!": ["选择一个指标!"], - "Big Number": ["数字"], - "Time Series - Line Chart": ["时间序列-折线图"], - "Pick a time granularity for your time series": [ - "为您的时间序列选择一个时间粒度" + "0 Selected": ["0个被选中"], + "1 hour": ["1小时"], + "1 minute": ["1分钟"], + "10 minute": ["10分钟"], + "10 seconds": ["10秒钟"], + "12 hours": ["12小时"], + "15 minute": ["15分钟"], + "24 hours": ["24 小时"], + "2D": ["2D"], + "3 letter code of the country": ["国家3字码"], + "30 days": ["30天"], + "30 minute": ["30分钟"], + "30 minutes": ["30分钟"], + "30 second": ["30秒钟"], + "30 seconds": ["30秒钟"], + "5 minute": ["5分钟"], + "5 minutes": ["5分钟"], + "5 second": ["5秒"], + "6 hour": ["6小时"], + "6 hours": ["6小时"], + "60 days": ["60天"], + "90 days": ["90天"], + ":": [":"], + "< (Smaller than)": ["< (小于)"], + "<= (Smaller or equal)": ["<= (小于等于)"], + "<b><a href=\"%(url)s\">Explore in Superset</a></b><p></p>": [ + "<b><a href=\"%(url)s\">探索 Superset</a></b><p></p>" ], - "An enclosed time range (both start and end) must be specified when using a Time Comparison.": [ - "使用时间比较时,必须指定封闭的时间范围(有开始和结束)。" + "== (Is equal)": ["== (等于)"], + "> (Larger than)": ["> (大于)"], + ">= (Larger or equal)": [">= (大于等于)"], + "A Big Number": ["大数字"], + "A SQL statement that defines whether the alert should get triggered or not. The query is expected to return either NULL or a number value.": [ + "定义是否应触发警报的SQL语句。查询应返回NULL或数字值。" ], - "Time Series - Multiple Line Charts": ["时间序列-多线图"], - "Time Series - Dual Axis Line Chart": ["时间序列-双轴线图"], - "Pick a metric for left axis!": ["为左轴选择一个指标!"], - "Pick a metric for right axis!": ["为右轴选择一个指标!"], - "Please choose different metrics on left and right axis": [ - "请在左右轴上选择不同的指标" + "A comma separated list of columns that should be parsed as dates.": [ + "应作为日期解析的列的逗号分隔列表。" ], - "Time Series - Bar Chart": ["时间序列 - 柱状图"], - "Time Series - Period Pivot": ["时间序列 - 周期透视表"], - "Time Series - Percent Change": ["时间序列 - 百分比变化"], - "Time Series - Stacked": ["时间序列 - 堆积图"], - "Histogram": ["直方图"], - "Must have at least one numeric column specified": [ - "必须至少指明一个数值列" + "A comma-separated list of schemas that CSVs are allowed to upload to.": [ + "允许以逗号分割的CSV文件上传" ], - "Distribution - Bar Chart": ["分布 - 柱状图"], - "Can't have overlap between Series and Breakdowns": [ - "Series 和 Breakdown 之间不能有重叠" + "A database with the same name already exists.": ["已存在同名的数据库。"], + "A full URL pointing to the location of the built plugin (could be hosted on a CDN for example)": [ + "指向内置插件位置的完整URL(例如,可以托管在CDN上)" ], - "Pick at least one field for [Series]": ["为 [序列] 选择至少一个字段"], - "Sunburst": ["环状层次图"], - "Sankey": ["蛇形图"], - "Pick exactly 2 columns as [Source / Target]": [ - "为 [来源 / 目标] 选择两个列" + "A human-friendly name": ["人性化的名称"], + "A list of users who can alter the chart. Searchable by name or username.": [ + "有权处理该图表的用户列表。可按名称或用户名搜索。" ], - "There's a loop in your Sankey, please provide a tree. Here's a faulty link: {}": [ - "桑基图里面有一个循环,请提供一棵树。这是一个错误的链接:{}" + "A map of the world, that can indicate values in different countries.": [ + "一张世界地图,可以显示不同国家的价值观。" ], - "Directed Force Layout": ["有向图"], - "Pick exactly 2 columns to 'Group By'": ["为 “Group By” 选择两个列"], - "Country Map": ["国家地图"], - "World Map": ["世界地图"], - "Filters": ["过滤"], - "Invalid filter configuration, please select a column": [ - "过滤器配置无效,请选择一个列" + "A metric to use for color": ["用于颜色的指标"], + "A polar coordinate chart where the circle is broken into wedges of equal angle, and the value represented by any wedge is illustrated by its area, rather than its radius or sweep angle.": [ + "一种极坐标图表,其中圆被分成等角度的楔形,任何楔形表示的值由其面积表示,而不是其半径或扫掠角度。" ], - "Parallel Coordinates": ["平行坐标"], - "Heatmap": ["热力图"], - "Horizon Charts": ["水平图"], - "Mapbox": ["箱图"], - "[Longitude] and [Latitude] must be set": [ - "[经度] 和 [纬度] 的选择项必须出现在 [Group By]" + "A readable URL for your dashboard": ["为看板生成一个可读的 URL"], + "A reference to the [Time] configuration, taking granularity into account": [ + "对 [时间] 配置的引用,会将粒度考虑在内" ], - "Must have a [Group By] column to have 'count' as the [Label]": [ - "[Group By] 列必须要有 ‘count’字段作为 [标签]" + "A semicolon ';' delimited list of email addresses": [ + "以分号 ';' 分隔的电子邮件地址列表" ], - "Choice of [Label] must be present in [Group By]": [ - "[标签] 的选择项必须出现在 [Group By]" + "A set of parameters that become available in the query using Jinja templating syntax": [ + "在查询中可用的一组参数使用JINJA模板语法" ], - "Choice of [Point Radius] must be present in [Group By]": [ - "[点半径] 的选择项必须出现在 [Group By]" + "A time series chart that visualizes how a related metric from multiple groups vary over time. Each group is visualized using a different color.": [ + "时间序列图表,直观显示多个组中的相关指标随时间的变化情况。每组使用不同的颜色进行可视化" ], - "[Longitude] and [Latitude] columns must be present in [Group By]": [ - "[经度] 和 [纬度] 的选择项必须出现在 [Group By]" + "A timeout occurred while executing the query.": ["查询超时。"], + "A timeout occurred while generating a csv.": ["生成CSV时超时。"], + "A timeout occurred while generating a dataframe.": ["生成数据超时"], + "A timeout occurred while taking a screenshot.": ["截图超时"], + "A valid color scheme is required": ["需要有效的配色方案"], + "APPLY": ["应用"], + "APR": ["四月"], + "AQE": ["AQE(异步执行查询)"], + "AUG": ["八月"], + "About": ["关于"], + "Access": ["访问"], + "Access requests": ["访问请求"], + "Access was requested": ["请求访问"], + "Action": ["操作"], + "Action Log": ["操作日志"], + "Actions": ["操作"], + "Active": ["激活"], + "Actual time range": ["实际时间范围"], + "Adaptive formatting": ["自动匹配格式化"], + "Add": ["新增"], + "Add Alert": ["添加告警"], + "Add Annotation": ["添加注释"], + "Add Annotation Layer": ["添加注释层"], + "Add CSS Template": ["新增CSS模板"], + "Add CSS template": ["新增CSS模板"], + "Add Chart": ["添加图表"], + "Add Column": ["添加列"], + "Add Dashboard": ["添加看板"], + "Add Database": ["添加数据库"], + "Add Druid Cluster": ["添加 Druid 集群"], + "Add Druid Column": ["添加 Druid 列"], + "Add Druid Datasource": ["添加 Druid 数据源"], + "Add Druid Metric": ["添加 Druid 指标"], + "Add Log": ["新增日志"], + "Add Metric": ["添加指标"], + "Add Report": ["添加报告"], + "Add Row level security filter": ["添加行级安全过滤"], + "Add Saved Query": ["添加保存的查询"], + "Add a Plugin": ["添加插件"], + "Add additional custom parameters": ["添加其他自定义参数"], + "Add an item": ["新增一行"], + "Add annotation": ["添加注释"], + "Add annotation layer": ["添加注释层"], + "Add dataset": ["添加数据集"], + "Add delivery method": ["添加通知方法"], + "Add filter": ["增加过滤条件"], + "Add item": ["增加条件"], + "Add metric": ["添加指标"], + "Add new color formatter": ["添加新的颜色"], + "Add new formatter": ["新增格式化"], + "Add notification method": ["添加注释层"], + "Add sheet": ["添加sheet页"], + "Add to dashboard": ["添加到看板"], + "Added": ["已添加"], + "Adding new datasource [{}]": ["添加 Druid 数据源 [{}]"], + "Additional Parameters": ["附加参数"], + "Additional information": ["附加信息"], + "Additional metadata": ["附加元数据"], + "Additional padding for legend.": ["图示附加的padding值。"], + "Additional parameters": ["编辑模板参数"], + "Additional text to add before or after the value, e.g. unit": [ + "附加文本到数据前(后),例如:单位" ], - "Deck.gl - Multiple Layers": ["多图层"], - "Bad spatial key": ["错误的空间字段"], - "Invalid spatial point encountered: %s": ["遇到无效的空间点:%s"], - "Encountered invalid NULL spatial entry, please consider filtering those out": [ - "遇到无效的为 NULL 的空间条目,请考虑将其过滤掉" + "Additive": ["附加"], + "Advanced": ["进阶"], + "Advanced Analytics": ["高级分析"], + "Advanced analytics": ["高级分析"], + "Advanced-Analytics": ["高级分析"], + "Aesthetic": ["炫酷"], + "After": ["之后"], + "Aggregate": ["聚合"], + "Aggregate Mean": ["合计平均值"], + "Aggregate Sum": ["合计"], + "Aggregate function applied to the list of points in each cluster to produce the cluster label.": [ + "聚合函数应用于每个群集中的点列表以产生群集标签。" ], - "Deck.gl - Scatter plot": ["Deck.gl - 散点图"], - "Deck.gl - Screen Grid": ["Deck.gl - 屏幕网格"], - "Deck.gl - 3D Grid": ["Deck.gl - 3D网格"], - "Deck.gl - Paths": ["Deck.gl - 路径"], - "Deck.gl - Polygon": ["Deck.gl - 多角形"], - "Deck.gl - 3D HEX": ["Deck.gl - 3D六角曲面"], - "Deck.gl - GeoJSON": ["Deck.gl - GeoJson"], - "Deck.gl - Arc": ["Deck.gl - 弧度"], - "Event flow": ["事件流"], - "Time Series - Paired t-test": ["时间序列 - 配对t检验"], - "Time Series - Nightingale Rose Chart": ["时间序列 - 南丁格尔玫瑰图"], - "Partition Diagram": ["分区图"], - "Choose either fields to [Group By] and [Metrics] and/or [Percentage Metrics], or [Columns], not both": [ - "为[分组]和[指标]或[列]选择任何的字段,或者两个都不选" + "Aggregate function to apply when pivoting and computing the total rows and columns": [ + "在旋转和计算总的行和列时,应用聚合函数" ], - "Box Plot": ["箱线图"], - "Distribution - NVD3 - Pie Chart": ["分布 - NVD3 - 饼图"], - "iFrame": [""], - "Deleted %(num)d annotation layer": ["选择一个注释图层"], - "All Text": ["所有文本"], - "Deleted %(num)d annotation": ["选择一个注释图层"], - "End date must be after start date": ["起始时间不可以大于当前时间"], - "Short description must be unique for this layer": [ - "此层的简述必须是唯一的" + "Aggregation function": ["聚合功能"], + "Alert Triggered, In Grace Period": ["告警已触发,在宽限期内"], + "Alert condition": ["告警条件"], + "Alert condition schedule": ["告警条件计划"], + "Alert ended grace period.": ["告警已结束宽限期。"], + "Alert failed": ["告警失败"], + "Alert fired during grace period.": ["在宽限期内触发告警。"], + "Alert found an error while executing a query.": [ + "告警在执行查询时发现错误。" ], - "Annotations could not be deleted.": ["无法删除注释。"], - "Annotation not found.": ["注释不存在。"], - "Annotation parameters are invalid.": ["注释层仍在加载。"], - "Annotation could not be created.": ["注释无法创建。"], - "Annotation could not be updated.": ["注释无法更新。"], - "Annotation delete failed.": ["注释与注释层"], - "Annotation layer parameters are invalid.": ["注释层仍在加载。"], - "Annotation layer could not be deleted.": ["注释层仍在加载。"], - "Annotation layer could not be created.": ["您的查询无法保存"], - "Annotation layer could not be updated.": ["您的查询无法保存"], - "Annotation layer not found.": ["注释层仍在加载。"], - "Annotation layer delete failed.": ["注释层仍在加载。"], - "Annotation layer has associated annotations.": ["注释层仍在加载。"], - "Name must be unique": ["名称必须是唯一的"], - "Deleted %(num)d chart": ["删除了 %(num)d 个图表"], - "Request is not JSON": ["请求不是JSON"], - "Request is incorrect: %(error)s": ["请求不正确: %(error)s"], - "`confidence_interval` must be between 0 and 1 (exclusive)": [ - "`置信区间` 必须介于0和1之间(开区间)" + "Alert name": ["告警名称"], + "Alert on grace period": ["告警宽限期"], + "Alert query returned a non-number value.": ["告警查询返回非数字值。"], + "Alert query returned more than one column.": ["告警查询返回多个列。"], + "Alert query returned more than one column. %s columns returned": [ + "告警查询返回多个列。%s 列被返回" ], - "lower percentile must be greater than 0 and less than 100. Must be lower than upper percentile.": [ - "下百分位数必须大于0且小于100。而且必须低于上百分位" + "Alert query returned more than one row.": ["告警查询返回了多行。"], + "Alert query returned more than one row. %s rows returned": [ + "告警查询返回了多行。%s 行被返回" + ], + "Alert running": ["告警运行中"], + "Alert triggered, notification sent": ["告警已触发,通知已发送"], + "Alert validator config error.": ["告警验证器配置错误。"], + "Alerts": ["告警"], + "Alerts & Reports": ["告警和报告"], + "Alerts & reports": ["告警和报告"], + "Align +/-": ["对齐 +/-"], + "All": ["所有"], + "All Text": ["所有文本"], + "All charts": ["所有图表"], + "All filters": ["所有过滤"], + "All filters (%(filterCount)d)": ["所有过滤(%(filterCount)d)"], + "All panels": ["应用于所有面板"], + "All panels with this column will be affected by this filter": [ + "包含此列的所有面板都将受到此过滤条件的影响" ], - "upper percentile must be greater than 0 and less than 100. Must be higher than lower percentile.": [ - "上百分位数必须大于0且小于100。而且必须高于下百分位。" + "Allow CREATE TABLE AS": ["允许 CREATE TABLE AS"], + "Allow CREATE TABLE AS option in SQL Lab": [ + "在 SQL 编辑器中允许 CREATE TABLE AS 选项" ], - "`width` must be greater or equal to 0": ["`宽度` 必须大于或等于0"], - "`row_limit` must be greater than or equal to 1": [ - "`行限制` 必须大于或等于1" + "Allow CREATE VIEW AS": ["允许 CREATE VIEW AS"], + "Allow CREATE VIEW AS option in SQL Lab": [ + "在 SQL 编辑器中允许 CREATE VIEW AS 选项" ], - "`row_offset` must be greater than or equal to 0": [ - "`行偏移量` 必须大于或等于0" + "Allow Csv Upload": ["允许Csv上传"], + "Allow DML": ["允许 DML"], + "Allow Multi Schema Metadata Fetch": ["允许多Schema元数据获取"], + "Allow SQL Lab to fetch a list of all tables and all views across all database schemas. For large data warehouse with thousands of tables, this can be expensive and put strain on the system.": [ + "允许 sql lab 获取所有数据库架构中的所有表和所有视图的列表。对于具有数千个表的大型数据仓库, 这可能会很耗费性能, 并给系统带来压力。" ], - "There are associated alerts or reports: %s,": [ - "存在关联的警报或报告:%s," + "Allow creation of new tables based on queries": ["允许基于查询创建新表"], + "Allow creation of new views based on queries": [ + "允许基于查询创建新视图" ], - "Database does not exist": ["数据库不存在"], - "Dashboards do not exist": ["看板"], - "Datasource type is required when datasource_id is given": [ - "给定数据源id时,需要提供数据源类型" + "Allow data manipulation language": ["允许数据操作语言"], + "Allow data upload": ["允许数据上传"], + "Allow manipulation of the database using non-SELECT statements such as UPDATE, DELETE, CREATE, etc.": [ + "允许使用非SELECT语句(如UPDATE、DELETE、CREATE等)操作数据库。" ], - "Chart parameters are invalid.": ["图表参数无效。"], - "Chart could not be created.": ["您的查询无法保存。"], - "Chart could not be updated.": ["您的查询无法保存。"], - "Chart could not be deleted.": ["这个查询无法被加载。"], - "There are associated alerts or reports": ["存在关联的警报或报告"], - "Changing this chart is forbidden": ["禁止更改此图表"], - "Charts could not be deleted.": ["这个查询无法被加载"], - "Import chart failed for an unknown reason": ["导入图表失败,原因未知"], - "Owners are invalid": ["所有者无效"], - "Dataset does not exist": ["数据集不存在"], - "`operation` property of post processing object undefined": [ - "后处理必须指定操作类型(`operation`)" + "Allow multiple selections": ["允许多选"], + "Allow node selections": ["允许多节点选择"], + "Allow selecting multiple values": ["允许选择多个值"], + "Allow this database to be explored": ["允许浏览此数据库"], + "Allow this database to be queried in SQL Lab": [ + "允许在SQL工具箱中查询此数据库" ], - "Unsupported post processing operation: %(operation)s": [ - "不支持的处理操作:%(operation)s" + "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in SQL Lab": [ + "允许用户在 SQL 编辑器中运行非 SELECT 语句(UPDATE,DELETE,CREATE,...)" ], - "Adding new datasource [{}]": ["添加 Druid 数据源 [{}]"], - "Refreshing datasource [{}]": ["刷新数据源 [{}]"], - "Metric(s) {} must be aggregations.": ["度量(s) {} 必须是聚合。"], - "Unsupported extraction function: ": ["不支持的提取函数:"], - "Columns": ["列"], - "Show Druid Column": ["显示 Druid 列"], - "Add Druid Column": ["添加 Druid 列"], - "Edit Druid Column": ["编辑 Druid 列"], - "Column": ["列"], - "Type": ["类型"], - "Datasource": ["数据源"], - "Groupable": ["可分组"], - "Filterable": ["可过滤"], - "Whether this column is exposed in the `Filters` section of the explore view.": [ - "该列是否在浏览视图的`过滤器`部分显示。" + "Alphabetical": ["按字母顺序排列"], + "Also known as a box and whisker plot, this visualization compares the distributions of a related metric across multiple groups. The box in the middle emphasizes the mean, median, and inner 2 quartiles. The whiskers around each box visualize the min, max, range, and outer 2 quartiles.": [ + "也称为框须图,该可视化比较了一个相关指标在多个组中的分布。中间的框强调平均值、中值和内部2个四分位数。每个框周围的触须可视化了最小值、最大值、范围和外部2个四分区。" ], - "Metrics": ["指标"], - "Show Druid Metric": ["显示 Druid 指标"], - "Add Druid Metric": ["添加 Druid 指标"], - "Edit Druid Metric": ["编辑 Druid 指标"], - "Metric": ["指标"], - "Description": ["描述"], - "Verbose Name": ["全称"], - "JSON": ["JSON"], - "Druid Datasource": ["Druid 数据源"], - "Warning Message": ["告警信息"], - "Show Druid Cluster": ["显示 Druid 集群"], - "Add Druid Cluster": ["添加 Druid 集群"], - "Edit Druid Cluster": ["编辑 Druid 集群"], - "Cluster Name": ["群集名称"], - "Broker Host": ["Broker的地址"], - "Broker Port": ["Broker的端口"], - "Broker Username": ["Broker的用户名"], - "Broker Password": ["Broker的密码"], - "Broker Endpoint": ["Broker的Endpoint"], - "Cache Timeout": ["缓存超时"], - "Metadata Last Refreshed": ["上次刷新的元数据"], - "Duration (in seconds) of the caching timeout for this cluster. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.": [ - "此集群的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为全局超时。" + "Altered": ["已更改"], + "An enclosed time range (both start and end) must be specified when using a Time Comparison.": [ + "使用时间比较时,必须指定封闭的时间范围(有开始和结束)。" ], - "Druid supports basic authentication. See [auth](http://druid.io/docs/latest/design/auth.html) and druid-basic-security extension": [ - "Druid支持基本的身份验证。可以参考 [auth](http://druid.io/docs/latest/design/auth.html) 和 druid-basic-security 部分" + "An engine must be specified when passing individual parameters to a database.": [ + "向数据库传递单个参数时必须指定引擎。" ], - "Show Druid Datasource": ["显示 Druid 数据源"], - "Add Druid Datasource": ["添加 Druid 数据源"], - "Edit Druid Datasource": ["编辑 Druid 数据源"], - "The list of charts associated with this table. By altering this datasource, you may change how these associated charts behave. Also note that charts need to point to a datasource, so this form will fail at saving if removing charts from a datasource. If you want to change the datasource for a chart, overwrite the chart from the 'explore view'": [ - "与此表关联的图表列表。通过更改此数据源,您可以更改这些相关图表的行为。还要注意,图表需要指向数据源,如果从数据源中删除图表,则此窗体将无法保存。如果要为图表更改数据源,请从“浏览视图”更改该图表。" + "An error has occurred": ["发生了一个错误"], + "An error occurred": ["发生了一个错误"], + "An error occurred saving dataset": ["保存数据集时发生错误"], + "An error occurred when refreshing queries": ["创建数据源时发生错误"], + "An error occurred while accessing the value.": ["访问值时出错。"], + "An error occurred while collapsing the table schema. Please contact your administrator.": [ + "收起表结构时出错。请与管理员联系。" ], - "Timezone offset (in hours) for this datasource": [ - "数据源的时差(单位:小时)" + "An error occurred while creating %ss: %s": ["创建时出错:%ss: %s"], + "An error occurred while creating the data source": [ + "创建数据源时发生错误" ], - "Time expression to use as a predicate when retrieving distinct values to populate the filter component. Only applies when `Enable Filter Select` is on. If you enter `7 days ago`, the distinct list of values in the filter will be populated based on the distinct value over the past week": [ - "当检索不同的值以填充过滤器组件时,时间表达式用作条件。只适用于`启用过滤器选择`。如果您输入`7天前`,将根据过去一周的不同值来填充ilter中不同的值列表" + "An error occurred while creating the value.": ["创建值时出错。"], + "An error occurred while deleting the value.": ["删除值时出错。"], + "An error occurred while editing this report.": ["编辑此报告时出错。"], + "An error occurred while editing this report: %s": [ + "编辑此报告时出错:%s" ], - "Whether to populate the filter's dropdown in the explore view's filter section with a list of distinct values fetched from the backend on the fly": [ - "是否在浏览视图的过滤器部分中填充过滤器的下拉列表,并提供从后端获取的不同值的列表" + "An error occurred while expanding the table schema. Please contact your administrator.": [ + "展开表结构时出错。请与管理员联系。" ], - "Redirects to this endpoint when clicking on the datasource from the datasource list": [ - "在数据源列表中点击数据源将重定向到此端点" + "An error occurred while fetching %s info: %s": [ + "获取%s仪表板时出错:%s" ], - "Duration (in seconds) of the caching timeout for this datasource. A timeout of 0 indicates that the cache never expires. Note this defaults to the cluster timeout if undefined.": [ - "此数据源的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为集群超时。" + "An error occurred while fetching %ss: %s": ["抓取出错:%ss: %s"], + "An error occurred while fetching available CSS templates": [ + "获取可用的CSS模板时出错" ], - "Associated Charts": ["关联的图表"], - "Data Source": ["数据源"], - "Cluster": ["集群"], - "Owners": ["所有者"], - "Is Hidden": ["隐藏"], - "Enable Filter Select": ["启用过滤器选择"], - "Default Endpoint": ["默认端点"], - "Time Offset": ["时间偏移"], - "Datasource Name": ["数据库名称"], - "Fetch Values From": ["取值谓词"], - "Changed By": ["修改人"], - "Modified": ["已修改"], - "Refreshed metadata from cluster [{}]": ["从群集刷新元数据 [{}]"], - "Only `SELECT` statements are allowed": ["将 SELECT 语句复制到剪贴板"], - "Only single queries supported": ["仅支持单个查询"], - "Error in jinja expression in fetch values predicate: %(msg)s": [ - "获取jinja表达式中的谓词的值出错:%(msg)s" + "An error occurred while fetching chart created by values: %s": [ + "获取图表的创建人时出错:%s" ], - "Error in jinja expression in FROM clause: %(msg)s": [ - "jinja表达式中的FROM子句出错:%(msg)s" + "An error occurred while fetching chart owners values: %s": [ + "获取图表所有者时出错 %s" ], - "Virtual dataset query cannot consist of multiple statements": [ - "虚拟数据集查询不能由多个语句组成" + "An error occurred while fetching created by values: %s": [ + "获取创建人时出错:%s" ], - "Virtual dataset query must be read-only": ["虚拟数据集查询必须是只读的"], - "Error in jinja expression in RLS filters: %(msg)s": [ - "jinja表达式中的 RLS filters 出错:%(msg)s" + "An error occurred while fetching dashboard created by values: %s": [ + "获取仪表板创建者时出错:%s" ], - "Datetime column not provided as part table configuration and is required by this type of chart": [ - "没有提供该表配置的日期时间列,它是此类型图表所必需的" + "An error occurred while fetching dashboard owner values: %s": [ + "获取仪表板所有者时出错:%s" ], - "Empty query?": ["查询为空?"], - "Metric '%(metric)s' does not exist": ["指标 '%(metric)s' 不存在"], - "Invalid filter operation type: %(op)s": ["选择框的操作类型无效: %(op)s"], - "Error in jinja expression in WHERE clause: %(msg)s": [ - "jinja表达式中的WHERE子句出错:%(msg)s" + "An error occurred while fetching dashboards": ["获取看板时出错"], + "An error occurred while fetching dashboards: %s": [ + "获取仪表板时出错:%s" ], - "Error in jinja expression in HAVING clause: %(msg)s": [ - "jinja表达式中的HAVING子句出错:%(msg)s" + "An error occurred while fetching database related data: %s": [ + "获取数据库相关数据时出错:%s" ], - "Show Column": ["显示列"], - "Add Column": ["添加列"], - "Edit Column": ["编辑列"], - "Whether to make this column available as a [Time Granularity] option, column has to be DATETIME or DATETIME-like": [ - "是否将此列作为[时间粒度]选项, 列中的数据类型必须是DATETIME" + "An error occurred while fetching database values: %s": [ + "获取数据库信息时出错:%s" ], - "The data type that was inferred by the database. It may be necessary to input a type manually for expression-defined columns in some cases. In most case users should not need to alter this.": [ - "由数据库推断的数据类型。在某些情况下,可能需要为表达式定义的列手工输入一个类型。在大多数情况下,用户不需要修改这个数据类型。" + "An error occurred while fetching dataset datasource values: %s": [ + "获取数据集数据源信息时出错: %s" ], - "Table": ["表"], - "Expression": ["表达式"], - "Is temporal": ["时间条件"], - "Datetime Format": ["时间格式"], - "Invalid date/timestamp format": ["无效的日期/时间戳格式"], - "Show Metric": ["显示指标"], - "Add Metric": ["添加指标"], - "Edit Metric": ["编辑指标"], - "SQL Expression": ["SQL表达式"], - "D3 Format": ["D3 格式"], - "Extra": ["扩展"], - "Row level security filter": ["行级安全过滤"], - "Show Row level security filter": ["显示行级安全过滤"], - "Add Row level security filter": ["添加行级安全过滤"], - "Edit Row level security filter": ["编辑行级安全过滤"], - "Regular filters add where clauses to queries if a user belongs to a role referenced in the filter. Base filters apply filters to all queries except the roles defined in the filter, and can be used to define what users can see if no RLS filters within a filter group apply to them.": [ - "常规过滤将where子句添加到查询中,以确定用户是否属于过滤中引用的角色。基本过滤将应用于除过滤中定义的角色之外的所有查询,并且可以用于定义在没有应用RLS过滤组的情况下,哪些用户可以看到内容。" + "An error occurred while fetching dataset owner values: %s": [ + "获取数据集所有者值时出错:%s" ], - "These are the tables this filter will be applied to.": [ - "这些是将应用此过滤的表。" + "An error occurred while fetching dataset related data": [ + "获取数据集相关数据时出错" ], - "For regular filters, these are the roles this filter will be applied to. For base filters, these are the roles that the filter DOES NOT apply to, e.g. Admin if admin should see all data.": [ - "对于常规过滤,这些是此过滤将应用于的角色。对于基本过滤,这些是过滤不适用的角色,例如Admin代表admin应该查看所有数据。" + "An error occurred while fetching dataset related data: %s": [ + "获取数据集相关数据时出错:%s" ], - "Filters with the same group key will be ORed together within the group, while different filter groups will be ANDed together. Undefined group keys are treated as unique groups, i.e. are not grouped together. For example, if a table has three filters, of which two are for departments Finance and Marketing (group key = 'department'), and one refers to the region Europe (group key = 'region'), the filter clause would apply the filter (department = 'Finance' OR department = 'Marketing') AND (region = 'Europe').": [ - "具有相同组key的过滤将在组中一起进行\"OR\"运算,而不同的过滤组将一起进行\"AND\"运算。未定义的组的key被视为唯一组,即不分组在一起。例如,如果表有三个过滤,其中两个用于财务部门和市场营销 (group key = 'department'),其中一个表示欧洲地区(group key = 'region'),filter子句将应用过滤 (department = 'Finance' OR department = 'Marketing') 和 (region = 'Europe')" + "An error occurred while fetching datasets: %s": ["获取数据集时出错:%s"], + "An error occurred while fetching function names.": [ + "获取函数名称时出错。" ], - "This is the condition that will be added to the WHERE clause. For example, to only return rows for a particular client, you might define a regular filter with the clause `client_id = 9`. To display no rows unless a user belongs to a RLS filter role, a base filter can be created with the clause `1 = 0` (always false).": [ - "这是将会添加到WHERE子句的条件。例如,要仅返回特定客户端的行,可以使用子句 `client_id = 9` 定义常规过滤。若要在用户不属于RLS过滤角色的情况下不显示行,可以使用子句 `1 = 0`(始终为false)创建基本过滤。" + "An error occurred while fetching schema values: %s": [ + "获取结构信息时出错:%s" ], - "Tables": ["数据表"], - "Roles": ["角色"], - "Clause": ["从句"], - "Creator": ["作者"], - "Show Table": ["显示表"], - "Import a table definition": ["导入一个已定义的表"], - "Edit Table": ["编辑表"], - "Name of the table that exists in the source database": [ - "源数据库中存在的表的名称" + "An error occurred while fetching tab state": ["获取tab页状态时出错"], + "An error occurred while fetching table metadata": [ + "获取表格元数据时发生错误" ], - "Schema, as used only in some databases like Postgres, Redshift and DB2": [ - "模式,只在一些数据库中使用,比如Postgres、Redshift和DB2" + "An error occurred while fetching table metadata. Please contact your administrator.": [ + "获取表格元数据时发生错误。请与管理员联系。" ], - "This fields acts a Superset view, meaning that Superset will run a query against this string as a subquery.": [ - "这个字段执行Superset视图时,意味着Superset将以子查询的形式对字符串运行查询。" + "An error occurred while fetching user values: %s": [ + "获取用户信息出错:%s" ], - "Predicate applied when fetching distinct value to populate the filter control component. Supports jinja template syntax. Applies only when `Enable Filter Select` is on.": [ - "当获取不同的值来填充过滤器组件应用时。支持jinja的模板语法。只在`启用过滤器选择`时应用。" + "An error occurred while hiding the left bar. Please contact your administrator.": [ + "隐藏左栏时出错。请与管理员联系。" ], - "Redirects to this endpoint when clicking on the table from the table list": [ - "点击表列表中的表时将重定向到此端点" + "An error occurred while importing %s: %s": ["导入时出错 %s: %s"], + "An error occurred while loading the SQL": ["创建数据源时发生错误"], + "An error occurred while pruning logs ": ["精简日志时出错 "], + "An error occurred while removing query. Please contact your administrator.": [ + "删除查询时出错。请与管理员联系。" ], - "Whether the table was generated by the 'Visualize' flow in SQL Lab": [ - "表是否由 sql 实验室中的 \"可视化\" 流生成" + "An error occurred while removing tab. Please contact your administrator.": [ + "删除tab页时出错。请与管理员联系。" ], - "A set of parameters that become available in the query using Jinja templating syntax": [ - "在查询中可用的一组参数使用JINJA模板语法" + "An error occurred while removing the table schema. Please contact your administrator.": [ + "删除表结构时出错。请与管理员联系。" ], - "Duration (in seconds) of the caching timeout for this table. A timeout of 0 indicates that the cache never expires. Note this defaults to the database timeout if undefined.": [ - "此表的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为数据库的超时。" + "An error occurred while rendering the visualization: %s": [ + "渲染可视化时发生错误:%s" ], - "Database": ["数据库"], - "Last Changed": ["更新时间"], - "Schema": ["模式"], - "Offset": ["偏移"], - "Table Name": ["表名"], - "Fetch Values Predicate": ["取值谓词"], - "Main Datetime Column": ["主日期列"], - "SQL Lab View": ["SQL Lab 视图"], - "Template parameters": ["模板参数"], - "The table was created. As part of this two-phase configuration process, you should now click the edit button by the new table to configure it.": [ - "表被创建。作为这两个阶段配置过程的一部分,您现在应该单击新表的编辑按钮来配置它。" + "An error occurred while setting the active tab. Please contact your administrator.": [ + "设置活动tab页时出错。请与管理员联系。" ], - "Refresh Metadata": ["刷新元数据"], - "Refresh column metadata": ["刷新字段元数据"], - "Metadata refreshed for the following table(s): %(tables)s": [ - "为下表刷新元数据:%(tables)s" + "An error occurred while setting the tab autorun. Please contact your administrator.": [ + "设置tab页自动运行时出错。请与管理员联系。" ], - "The following tables added new columns: %(tables)s": [ - "下表添加了新列:%(tables)s" + "An error occurred while setting the tab database ID. Please contact your administrator.": [ + "设置tab页数据库ID时出错。请与管理员联系。" ], - "The following tables removed columns: %(tables)s": [ - "下表删除了列:%(tables)s" + "An error occurred while setting the tab schema. Please contact your administrator.": [ + "设置tab页结构时出错。请与管理员联系。" ], - "The following tables update column metadata: %(tables)s": [ - "下表更新列元数据:%(tables)s" + "An error occurred while setting the tab template parameters. Please contact your administrator.": [ + "设置tab页模板参数时出错。请与管理员联系。" ], - "Unable to refresh metadata for the following table(s): %(tables)s": [ - "为下表刷新元数据: %(tables)s" + "An error occurred while setting the tab title. Please contact your administrator.": [ + "设置tab页标题时出错。请与管理员联系。" ], - "Deleted %(num)d css template": ["删除了 %(num)d 个css模板"], - "CSS template could not be deleted.": ["CSS模板不能被删除"], - "CSS template not found.": ["CSS模板未找到"], - "Deleted %(num)d dashboard": ["删除了 %(num)d 个看板"], - "Title or Slug": ["标题或者Slug"], - "Must be unique": ["需要唯一"], - "Dashboard parameters are invalid.": ["看板参数无效。"], - "Dashboard not found.": ["看板没有找到"], - "Dashboard could not be created.": ["看板无法被创建"], - "Dashboards could not be deleted.": ["看板无法被删除。"], - "Dashboard could not be updated.": ["看板无法更新。"], - "Dashboard could not be deleted.": ["看板无法被删除。"], - "Changing this Dashboard is forbidden": ["无法修改该看板"], - "Import dashboard failed for an unknown reason": [ - "因为未知原因导入看板失败" + "An error occurred while starring this chart": ["以此字符开头时出错"], + "An error occurred while storing the latest query id in the backend. Please contact your administrator if this problem persists.": [ + "在后端存储最新查询id时出错。如果此问题仍然存在,请与管理员联系。" ], - "No data in file": ["文件中无数据"], - "Table name undefined": ["表名未定义"], - "Invalid connection string, a valid string usually follows: driver://user:password@database-host/database-name": [ - "连接字符串无效,有效字符串通常如下:driver://user:password@database-host/database-name" + "An error occurred while storing your query in the backend. To avoid losing your changes, please save your query using the \"Save Query\" button.": [ + "在后端存储查询时出错。为避免丢失更改,请使用 \"保存查询\" 按钮保存查询。" ], - "SQLite database cannot be used as a data source for security reasons.": [ - "出于安全原因,SQLite数据库不能用作数据源。" + "An error occurred while updating the value.": ["更新值时出错。"], + "An unknown error occurred. Please contact your Superset administrator": [ + "发生未知错误。请与管理员联系" ], - "Field cannot be decoded by JSON. %(msg)s": [ - "字段不能由JSON解码。%(msg)s" + "Anchor to": ["锚定到"], + "Angle at which to end progress axis": ["进度轴结束的角度"], + "Angle at which to start progress axis": ["开始进度轴的角度"], + "Animation": ["动画"], + "Annotation": ["注释"], + "Annotation Layer ${annotationLayerName}": [ + "注释层 ${annotationLayerName}" ], - "The metadata_params in Extra field is not configured correctly. The key %(key)s is invalid.": [ - "额外字段中的元数据参数配置不正确。键 %(key)s 无效。" + "Annotation Layers": ["注释层"], + "Annotation Slice Configuration": ["注释切片配置"], + "Annotation Source": ["注释来源"], + "Annotation could not be created.": ["注释无法创建。"], + "Annotation could not be updated.": ["注释无法更新。"], + "Annotation delete failed.": ["注释与注释层"], + "Annotation end time must be no earlier than start time.": [ + "注释的结束时间不能早于开始时间。" ], - "Database parameters are invalid.": ["数据库参数无效"], - "A database with the same name already exists": ["同名数据库已存在"], - "Field is required": ["字段是必需的"], - "Field cannot be decoded by JSON. %{json_error}s": [ - "字段不能由JSON解码。%{json_error}s" + "Annotation layer": ["注释层"], + "Annotation layer could not be created.": ["您的查询无法保存"], + "Annotation layer could not be deleted.": ["注释层仍在加载。"], + "Annotation layer could not be updated.": ["您的查询无法保存"], + "Annotation layer delete failed.": ["注释层仍在加载。"], + "Annotation layer description columns": ["注释层描述列。"], + "Annotation layer has associated annotations.": ["注释层仍在加载。"], + "Annotation layer interval end": ["注释层间隔结束"], + "Annotation layer name": ["注释层名称"], + "Annotation layer not found.": ["注释层仍在加载。"], + "Annotation layer opacity": ["注释层不透明度"], + "Annotation layer parameters are invalid.": ["注释层仍在加载。"], + "Annotation layer stroke": ["注释层混乱"], + "Annotation layer time column": ["注释层时间列"], + "Annotation layer title column": ["注释层标题列"], + "Annotation layer type": ["注释层类型"], + "Annotation layer value": ["注释层值"], + "Annotation layers": ["注解层"], + "Annotation layers are still loading.": ["注释层仍在加载。"], + "Annotation name": ["注释名称"], + "Annotation not found.": ["注释不存在。"], + "Annotation parameters are invalid.": ["注释层仍在加载。"], + "Annotation source type": ["注释数据源类型"], + "Annotations": ["注释"], + "Annotations and Layers": ["注释与注释层"], + "Annotations and layers": ["注释与注释层"], + "Annotations could not be deleted.": ["无法删除注释。"], + "Any": ["所有"], + "Any additional detail to show in the certification tooltip.": [ + "要在认证工具提示中显示详细信息。" ], - "The metadata_params in Extra field is not configured correctly. The key %{key}s is invalid.": [ - "额外字段中的元数据参数配置不正确。键 %{key}s 无效。" + "Any color palette selected here will override the colors applied to this dashboard's individual charts": [ + "此处选择的任何调色板都将覆盖应用于此看板的各个图表的颜色" ], - "Database not found.": ["数据库没有找到"], - "Database could not be created.": ["数据库无法被创建"], - "Database could not be updated.": ["数据库无法更新"], - "Connection failed, please check your connection settings": [ - "连接失败,请检查您的连接配置" + "Any databases that allow connections via SQL Alchemy URIs can be added. ": [ + "可以添加任何允许通过SQL AlChemy URI进行连接的数据库。" ], - "Cannot delete a database that has tables attached": [ - "无法删除已含有表的数据库" + "Any databases that allow connections via SQL Alchemy URIs can be added. Learn about how to connect a database driver ": [ + "可以添加任何允许通过SQL AlChemy URI进行连接的数据库。了解如何连接数据库驱动程序" ], - "Database could not be deleted.": ["数据库不能删除。"], - "Stopped an unsafe database connection": ["已停止不安全的数据库连接"], - "Could not load database driver": ["无法加载数据库驱动程序"], - "Unexpected error occurred, please check your logs for details": [ - "发生意外错误,请检查日志以了解详细信息" + "Append": ["追加"], + "Applied Cross Filters (%d)": ["应用的交叉条件 (%d)"], + "Applied Filters (%d)": ["应用的条件 (%d)"], + "Applied rolling window did not return any data. Please make sure the source query satisfies the minimum periods defined in the rolling window.": [ + "应用的滚动窗口(rolling window)未返回任何数据。请确保源查询满足滚动窗口中定义的最小周期。" ], - "Import database failed for an unknown reason": [ - "导入数据库失败,原因未知" + "Apply": ["应用"], + "Apply conditional color formatting to metrics": [ + "将条件颜色格式应用于指标" ], - "Could not load database driver: {}": ["无法加载数据库驱动程序:{}"], - "Deleted %(num)d dataset": ["已经删除 %(num)d 个数据集"], - "Null or Empty": ["Null或空"], - "Database not allowed to change": ["数据集不允许被修改"], - "One or more columns do not exist": ["一个或多个字段不存在"], - "One or more columns are duplicated": ["一个或多个列被复制"], - "One or more columns already exist": ["一个或多个列已存在"], - "One or more metrics do not exist": ["一个或多个指标不存在"], - "One or more metrics are duplicated": ["一个或多个指标重复"], - "One or more metrics already exist": ["一个或多个度量已存在"], - "Table [%(table_name)s] could not be found, please double check your database connection, schema, and table name": [ - "找不到 [%(table_name)s] 表,请仔细检查您的数据库连接、Schema 和 表名" + "Apply conditional color formatting to numeric columns": [ + "将条件颜色格式应用于数字列" ], - "Dataset parameters are invalid.": ["数据集参数无效。"], - "Dataset could not be created.": ["无法创建数据集。"], - "Dataset could not be updated.": ["无法更新数据集。"], - "Dataset could not be deleted.": ["无法删除数据集"], - "Dataset(s) could not be bulk deleted.": ["数据集无法批量删除"], - "Changing this dataset is forbidden": ["没有权限更新此数据集"], - "Import dataset failed for an unknown reason": [ - "因为未知的原因导入数据集失败" + "Apply metrics on": ["应用指标到"], + "Apply to all panels": ["应用于所有面板"], + "Apply to specific panels": ["应用于特定面板"], + "April": ["四月"], + "Are you sure you want to cancel?": ["您确定要取消吗?"], + "Are you sure you want to delete": ["确定要删除吗"], + "Are you sure you want to delete ${annotationCurrentlyDeleting?.short_descr}?": [ + "请确认您想删除 ${annotationCurrentlyDeleting?.short_descr}?" ], - "Unknown Presto Error": ["未知 Presto 错误"], - "We can't seem to resolve the column \"%(column_name)s\" at line %(location)s.": [ - "我们似乎无法解析行 %(location)s 所处的列 \"%(column_name)s\" 。" + "Are you sure you want to delete the selected %s?": [ + "确实要删除选定的 %s 吗?" ], - "The table \"%(table_name)s\" does not exist. A valid table must be used to run this query.": [ - "表 \"%(table_name)s\" 不存在。必须使用有效的表来运行此查询。" + "Are you sure you want to delete the selected annotations?": [ + "确实要删除选定的注释吗?" ], - "Deleted %(num)d saved query": ["已经删除 %(num)d 个保存的查询"], - "Saved queries could not be deleted.": ["保存的查询无法被删除"], - "Saved query not found.": ["保存的查询未找到"], - "Deleted %(num)d report schedule": ["已经删除了 %(num)d 个报告时间表"], - "Alert query returned more than one row. %s rows returned": [ - "警报查询返回了多行。%s 行被返回" + "Are you sure you want to delete the selected charts?": [ + "确实要删除所选图表吗?" ], - "Alert query returned more than one column. %s columns returned": [ - "警报查询返回多个列。%s 列被返回" + "Are you sure you want to delete the selected dashboards?": [ + "确实要删除选定的仪表板吗?" ], - "Dashboard does not exist": ["看板不存在"], - "Chart does not exist": ["图表没有找到"], - "Database is required for alerts": ["警报需要数据库"], - "Type is required": ["类型是必需的"], - "Choose a chart or dashboard not both": [ - "选择图表或看板,不能都全部选择" + "Are you sure you want to delete the selected datasets?": [ + "确实要删除选定的数据集吗?" ], - "Report Schedule parameters are invalid.": ["报表计划参数无效。"], - "Report Schedule could not be deleted.": ["无法删除报表计划。"], - "Report Schedule could not be created.": ["无法创建报表计划。"], - "Report Schedule could not be updated.": ["无法更新报表计划。"], - "Report Schedule not found.": ["找不到报表计划。"], - "Report Schedule delete failed.": ["报表计划删除失败。"], - "Report Schedule log prune failed.": ["报表计划日志精简失败。"], - "Report Schedule execution failed when generating a screenshot.": [ - "生成屏幕截图时报表计划执行失败。" + "Are you sure you want to delete the selected layers?": [ + "确实要删除选定的图层吗?" ], - "Report Schedule execution got an unexpected error.": [ - "报表计划执行遇到意外错误。" + "Are you sure you want to delete the selected queries?": [ + "您确实要删除选定的查询吗?" ], - "Report Schedule is still working, refusing to re-compute.": [ - "报表计划仍在运行,拒绝重新计算。" + "Are you sure you want to delete the selected templates?": [ + "确实要删除选定的模板吗?" ], - "Report Schedule reached a working timeout.": ["报表计划已超时。"], - "Alert query returned more than one row.": ["警报查询返回了多行。"], - "Alert validator config error.": ["错误的经纬度配置。"], - "Alert query returned more than one column.": ["警报查询返回多个列。"], - "Alert query returned a non-number value.": ["警报查询返回非数字值。"], - "Alert found an error while executing a query.": [ - "警报在执行查询时发现错误。" + "Are you sure you want to proceed?": ["您确定要继续执行吗?"], + "Are you sure you want to save and apply changes?": [ + "确实要保存并应用更改吗?" ], - "Alert fired during grace period.": ["在宽限期内触发警报。"], - "Alert ended grace period.": ["警报已结束宽限期。"], - "Alert on grace period": ["警报宽限期"], - "Report Schedule sellenium user not found": [ - "找不到报表计划sellenium用户" + "Area Chart": ["面积图"], + "Area chart": ["面积图"], + "Area chart opacity": ["面积图不透明度"], + "Arrow": ["箭头"], + "Associated Charts": ["关联的图表"], + "Async Execution": ["异步执行查询"], + "Asynchronous query execution": ["异步执行查询"], + "August": ["八月"], + "Autocomplete": ["自动补全"], + "Autocomplete filters": ["自适配过滤条件"], + "Autocomplete query predicate": ["自动补全查询谓词"], + "Available sorting modes:": ["可用分类模式:"], + "Axis": ["坐标轴"], + "Axis ascending": ["轴线升序"], + "Axis descending": ["轴线降序"], + "Back": ["返回"], + "Backend": ["后端"], + "Bad spatial key": ["错误的空间字段"], + "Bar": ["条形图"], + "Bar Chart": ["条形图"], + "Bar Values": ["条形栏的值"], + "Base layer map style": ["地图基本层样式"], + "Based on a metric": ["基于指标"], + "Based on granularity, number of time periods to compare against": [ + "根据粒度、要比较的时间阶段" ], - "Report Schedule state not found": ["未找到报表计划状态"], - "Report schedule unexpected error": ["报告计划意外错误。"], - "Changing this report is forbidden": ["禁止更改此报告"], - "An error occurred while pruning logs ": ["精简日志时出错 "], - "\n <b><a href=\"%(url)s\">Explore in Superset</a></b><p></p>\n <img src=\"cid:%(msgid)s\">\n ": [ - "\n <b><a href=\"%(url)s\">探索 Superset</a></b><p></p>\n <img src=\"cid:%(msgid)s\">\n " - ], - "%(prefix)s %(title)s": [""], - "\n *%(name)s*\n\n <%(url)s|Explore in Superset>\n ": [ - "\n *%(name)s*\n\n <%(url)s|探索 Superset>\n " + "Basic": ["基础"], + "Basic information": ["基本情况"], + "Batch editing %d filters:": ["批量编辑 %d 个过滤条件:"], + "Battery level over time": ["电池电量随时间变化"], + "Be careful.": ["小心。"], + "Before": ["之前"], + "Big Number": ["数字"], + "Big Number Font Size": ["数字的字体大小"], + "Big Number with Trendline": ["数字和趋势线"], + "Bottom": ["底端"], + "Bottom Margin": ["底部边距"], + "Bottom margin, in pixels, allowing for more room for axis labels": [ + "底部边距,以像素为单位,为轴标签留出更多空间" ], - "\n *%(name)s*\n\n <%(url)s|Explore in Superset>\n ": [ - "\n *%(name)s*\n\n <%(url)s|探索 Superset>\n " + "Bottom to Top": ["自下而上"], + "Bounds for the Y-axis. When left empty, the bounds are dynamically defined based on the min/max of the data. Note that this feature will only expand the axis range. It won't narrow the data's extent.": [ + "Y轴的边界。当空时,边界是根据数据的最小/最大值动态定义的。请注意,此功能只会扩展轴范围。它不会缩小数据范围。" ], - "<b><a href=\"%(url)s\">Explore in Superset</a></b><p></p>": [ - "<b><a href=\"%(url)s\">探索 Superset</a></b><p></p>" + "Box Plot": ["箱线图"], + "Breakdowns": ["分解"], + "Broker Endpoint": ["Broker的Endpoint"], + "Broker Host": ["Broker的地址"], + "Broker Password": ["Broker的密码"], + "Broker Port": ["Broker的端口"], + "Broker Username": ["Broker的用户名"], + "Bubble Chart": ["气泡图"], + "Bubble Color": ["气泡颜色"], + "Bubble Size": ["气泡大小"], + "Bubble size": ["气泡尺寸"], + "Bulk select": ["批量选择"], + "Bullet Chart": ["子弹图"], + "Business": ["商业"], + "By default, each filter loads at most 1000 choices at the initial page load. Check this box if you have more than 1000 filter values and want to enable dynamically searching that loads filter values as users type (may add stress to your database).": [ + "默认情况下,每个过滤器在初始页面加载时最多加载1000个选项。如果您有超过1000个过滤值,并且希望启用动态搜索,以便在键入时加载筛选值(可能会给数据库增加压力),请选中此框。" ], - "%(name)s.csv": [""], - "\n *%(slice_name)s*\n\n <%(slice_url_user_friendly)s|Explore in Superset>\n ": [ - "\n *%(slice_name)s*\n\n <%(slice_url_user_friendly)s|探索 Superset>\n " + "By key: use column names as sorting key": ["使用列名作为排序关键字"], + "By key: use row names as sorting key": ["使用行名作为排序关键字"], + "By value: use metric values as sorting key": [ + "使用度量值作为排序关键字" ], - "[Alert] %(label)s": ["[警报] %(label)s"], - "New": ["新增"], - "SQL Query": ["SQL查询"], - "Chart": ["图表"], - "Dashboard": ["看板"], - "Profile": ["用户信息"], - "Info": ["信息"], - "Logout": ["退出"], - "Login": ["登录"], - "Record Count": ["记录数"], - "No records found": ["没有找到任何记录"], - "Filter List": ["过滤"], - "Search": ["搜索"], - "Refresh": ["刷新间隔"], - "Import dashboards": ["导入看板"], - "Import Dashboard(s)": ["导入看板"], - "File": ["文件"], - "Choose File": ["选择文件"], - "Upload": ["上传"], - "No Access!": ["不能访问!"], - "You do not have permissions to access the datasource(s): %(name)s.": [ - "您没有权限访问该数据源: %(name)s。" + "CANCEL": ["取消"], + "CREATE TABLE AS": ["允许 CREATE TABLE AS"], + "CREATE VIEW AS": ["允许 CREATE VIEW AS"], + "CREATE VIEW statement": ["CREATE VIEW 语句"], + "CRON expression": ["CRON表达式"], + "CSS": ["CSS"], + "CSS Templates": ["CSS 模板"], + "CSS template": ["CSS 模板"], + "CSS template could not be deleted.": ["CSS模板不能被删除"], + "CSS template name": ["CSS模板名称"], + "CSS template not found.": ["CSS模板未找到"], + "CSS templates": ["CSS 模板"], + "CSV File": ["CSV文件"], + "CSV file \"%(csv_filename)s\" uploaded to table \"%(table_name)s\" in database \"%(db_name)s\"": [ + "csv 文件 \"%(csv_filename)s\" 上传到数据库 \"%(db_name)s\" 中的表 \"%(table_name)s\"" ], - "Request Permissions": ["请求权限"], - "Cancel": ["取消"], - "Use the edit buttom to change this field": ["使用编辑按钮更改此字段"], - "Test Connection": ["测试连接"], - "[Superset] Access to the datasource %(name)s was granted": [ - "[Superset] 允许访问数据源 %(name)s" + "CSV to Database configuration": ["csv 到数据库配置"], + "CSV upload": ["CSV上传"], + "CTAS & CVAS SCHEMA": ["CTAS和CVAS方案"], + "CTAS (create table as select) can only be run with a query where the last statement is a SELECT. Please make sure your query has a SELECT as its last statement. Then, try running your query again.": [ + "CTA(create table as select)只能与最后一条语句为SELECT的查询一起运行。请确保查询的最后一个语句是SELECT。然后再次尝试运行查询。" ], - "Unable to find such a holiday: [{}]": ["找不到这样的假期:[{}]"], - "Referenced columns not available in DataFrame.": [ - "引用的列在数据帧(DataFrame)中不可用。" + "CTAS Schema": ["CTAS 模式"], + "CVAS (create view as select) can only be run with a query with a single SELECT statement. Please make sure your query has only a SELECT statement. Then, try running your query again.": [ + "CVAS(createview as select)只能与带有单个SELECT语句的查询一起运行。请确保您的查询只有SELECT语句。然后再次尝试运行查询。" ], - "Column referenced by aggregate is undefined: %(column)s": [ - "聚合引用的列未定义:%(column)s" + "CVAS (create view as select) query has more than one statement.": [ + "CVAS (create view as select)查询有多条语句。" ], - "Operator undefined for aggregator: %(name)s": [ - "未定义聚合器的运算符:%(name)s" + "CVAS (create view as select) query is not a SELECT statement.": [ + "CVAS (create view as select)查询不是SELECT语句。" ], - "Invalid numpy function: %(operator)s": ["无效的numpy函数:%(operator)s"], - "Pivot operation requires at least one index": [ - "透视操作至少需要一个索引" + "Cache Timeout": ["缓存超时"], + "Cache Timeout (seconds)": ["缓存超时(秒)"], + "Cache timeout": ["缓存时间"], + "Cached %s": ["缓存于%s"], + "Cached value not found": ["缓存的值未找到"], + "Calculate contribution per series or total": [ + "计算每个系列或总计的贡献" ], - "Pivot operation must include at least one aggregate": [ - "数据透视操作必须至少包含一个聚合" + "Calculated column [%s] requires an expression": [ + "计算列 [%s] 需要一个表达式" ], - "Undefined window for rolling operation": ["未定义滚动操作窗口"], - "Invalid rolling_type: %(type)s": ["无效的滚动类型:%(type)s"], - "Invalid options for %(rolling_type)s: %(options)s": [ - "%(rolling_type)s 的选项无效:%(options)s" + "Calculated columns": ["计算列"], + "Calculation type": ["计算类型"], + "Calendar Heatmap": ["时间热力图"], + "Can not move top level tab into nested tabs": [ + "无法将顶级tab页移动到嵌套tab页中" ], - "Invalid cumulative operator: %(operator)s": [ - "累积运算符无效:%(operator)s" + "Can't find DruidCluster with cluster_name = '%(name)s'": [ + "不能找到具有 cluster_name = '%(name)s' 的 Druid 集群" ], - "Invalid geohash string": ["无效的geohash字符串"], - "Invalid longitude/latitude": ["无效的经度/纬度"], - "Invalid geodetic string": ["无效的 geodetic 字符串"], - "`fbprophet` package not installed": ["未安装程序包 `fbprophet`"], - "Time grain missing": ["时间粒度缺失"], - "Unsupported time grain: %(time_grain)s": [ - "不支持的时间粒度:%(time_grain)s" + "Can't find User '%(name)s', please ask your admin to create one.": [ + "用户’%(name)s’没有找到,请联系管理员创建。" ], - "Periods must be a positive integer value": ["句点必须是正整数值"], - "Confidence interval must be between 0 and 1 (exclusive)": [ - "置信区间必须介于0和1(不包含1)之间" + "Can't have overlap between Series and Breakdowns": [ + "Series 和 Breakdown 之间不能有重叠" ], - "DataFrame must include temporal column": [ - "数据帧(DataFrame)必须包含时间列" + "Cancel": ["取消"], + "Cancel query on window unload event": ["取消窗口上传事件的查询"], + "Cannot create cyclic hierarchy": ["无法创建循环层级"], + "Cannot delete a database that has datasets attached": [ + "无法删除附加了数据集的数据库" ], - "DataFrame include at least one series": [ - "数据帧(DataFrame)至少包括一个序列" + "Cannot import dashboard: %(db_error)s.\nMake sure to create the database before importing the dashboard.": [ + "无法导入看板:%(db_error)s 。\n请确保在导入看板之前创建数据库。" ], - "percentiles must be a list or tuple with two numeric values, of which the first is lower than the second value": [ - "百分位数必须是具有两个数值的列表或元组,其中第一个数值要小于第二个数值" + "Cannot load filter": ["无法加载筛选器"], + "Cannot parse time string [%(human_readable)s]": [ + "无法解析时间字符串[%(human_readable)s]" ], - "User": ["用户"], - "User Roles": ["用户角色"], - "Database URL": ["数据库URL"], - "Roles to grant": ["角色授权"], - "Created On": ["创建日期"], - "List Observations": ["观察结果列表"], - "Show Observation": ["显示观察结果"], - "Error Message": ["错误消息"], - "Log Retentions (days)": ["日志保留(天)"], - "A semicolon ';' delimited list of email addresses": [ - "以分号 ';' 分隔的电子邮件地址列表" + "Categorical": ["分类"], + "Categories to group by on the x-axis.": ["要在x轴上分组的类别。"], + "Category": ["分类"], + "Category of target nodes": ["目标节点类别"], + "Cell Padding": ["单元填充"], + "Cell Radius": ["单元格半径"], + "Cell Size": ["单元尺寸"], + "Cell bars": ["单元格柱状图"], + "Cell content": ["单元格内容"], + "Center": ["中心对齐"], + "Certification": ["认证"], + "Certification details": ["认证细节"], + "Certified": ["认证"], + "Certified By": ["认证"], + "Certified by": ["认证"], + "Certified by %s": ["认证人 %s"], + "Change dataset": ["修改数据集"], + "Change order of columns.": ["更改列的顺序。"], + "Change order of rows.": ["更改行的顺序。"], + "Changed By": ["修改人"], + "Changed On": ["改变为"], + "Changed on": ["改变为"], + "Changing the dataset may break the chart if the chart relies on columns or metadata that does not exist in the target dataset": [ + "如果图表依赖于目标数据集中不存在的列或元数据,则更改数据集可能会破坏图表" ], - "How long to keep the logs around for this alert": [ - "这个警报的日志要保存多久" + "Changing these settings will affect all charts using this dataset, including charts owned by other people.": [ + "更改这些设置将影响使用此数据集的所有图表,包括其他人拥有的图表。" ], - "Once an alert is triggered, how long, in seconds, before Superset nags you again.": [ - "在Superset再次提醒您之前需要多长时间--以秒为单位--来触发一个警报" + "Changing this Dashboard is forbidden": ["无法修改该看板"], + "Changing this chart is forbidden": ["禁止更改此图表"], + "Changing this control takes effect instantly": ["更改此控件立即生效。"], + "Changing this dataset is forbidden": ["没有权限更新此数据集"], + "Changing this dataset is forbidden.": ["禁止更改此数据集。"], + "Changing this report is forbidden": ["禁止更改此报告"], + "Character to interpret as decimal point.": [ + "将字符解释为小数点的字符。" ], - "A SQL statement that defines whether the alert should get triggered or not. The query is expected to return either NULL or a number value.": [ - "定义是否应触发警报的SQL语句。查询应返回NULL或数字值。" + "Charge": ["电荷数(作用力)"], + "Charge in the force layout": ["在力导向图中的电荷数(作用力)"], + "Chart": ["图表"], + "Chart %(id)s not found": ["图表 %(id)s 没有找到"], + "Chart Cache Timeout": ["表缓存超时"], + "Chart Email Schedules": ["图表电子邮件时间表"], + "Chart ID": ["图表 ID"], + "Chart Options": ["图表选项"], + "Chart Owner: %s": ["图表所有者:%s"], + "Chart Title": ["图表标题"], + "Chart [{}] has been overwritten": ["图表 [{}] 已经覆盖"], + "Chart [{}] has been saved": ["图表 [{}] 已经保存"], + "Chart [{}] was added to dashboard [{}]": [ + "图表 [{}] 已经添加到看板 [{}]" ], - "annotation start time or end time is required.": [ - "注释的开始时间或结束时间是必需的。" + "Chart cache timeout": ["图表缓存超时"], + "Chart changes": ["图表变化"], + "Chart component that lets you add a custom filter UI in your dashboard. When added to dashboard, a filter box lets users specify specific values or ranges to filter charts by. The charts that each filter box is applied to can be fine tuned as well in the dashboard view.\n\n Note that this plugin is being replaced with the new Filters feature that lives in the dashboard view itself. It's easier to use and has more capabilities!": [ + "图表组件,允许您在仪表板中添加自定义过滤器UI。当添加到仪表板时,过滤器框允许用户指定特定的值或范围来过滤图表。每个筛选框所应用的图表也可以在仪表板视图中进行微调。请注意,这个插件正在被仪表板视图中的新过滤器功能所取代。它更易于使用,功能更强大!" ], - "Annotation end time must be no earlier than start time.": [ - "注释的结束时间不能早于开始时间。" + "Chart could not be created.": ["您的查询无法保存。"], + "Chart could not be deleted.": ["这个查询无法被加载。"], + "Chart could not be updated.": ["您的查询无法保存。"], + "Chart does not exist": ["图表没有找到"], + "Chart has no query context saved. Please save the chart again.": [ + "图表未保存任何查询上下文。请重新保存图表。" ], - "Annotations": ["注释"], - "Show Annotation": ["查看注释"], - "Add Annotation": ["添加注释"], - "Edit Annotation": ["编辑注释"], - "Layer": ["层"], - "Label": ["标签"], - "Start": ["开始"], - "End": ["结束"], - "JSON Metadata": ["JSON 元数据"], - "Show Annotation Layer": ["查看注释层"], - "Add Annotation Layer": ["添加注释层"], - "Edit Annotation Layer": ["编辑注释层"], - "Name": ["名称"], - "Dataset %(name)s already exists": ["数据集 %(name)s 已存在"], - "Table [%{table}s] could not be found, please double check your database connection, schema, and table name, error: {}": [ - "找不到 [%{table}s] 表,请仔细检查您的数据库连接、Schema 和 表名" + "Chart name": ["图表名称"], + "Chart options": ["图表选项"], + "Chart parameters are invalid.": ["图表参数无效。"], + "Chart type": ["图表类型"], + "Charts": ["图表"], + "Charts could not be deleted.": ["这个查询无法被加载"], + "Check configuration": ["检查配置"], + "Check for sorting ascending": ["按照升序进行排序"], + "Check if the Rose Chart should use segment area instead of segment radius for proportioning": [ + "检查玫瑰图是否应该使用线段面积而不是线段半径来进行比例" ], - "json isn't valid": ["无效 JSON"], - "Export to YAML": ["导出到YAML"], - "Export to YAML?": ["导出到YAML?"], - "Delete": ["删除"], - "Delete all Really?": ["确定删除全部?"], - "Is favorite": ["收藏"], - "The data source seems to have been deleted": ["数据源已经被删除"], - "The user seems to have been deleted": ["用户已经被删除"], - "Access was requested": ["请求访问"], - "The access requests seem to have been deleted": ["访问请求已被删除"], - "%(user)s was granted the role %(role)s that gives access to the %(datasource)s": [ - "授予 %(user)s %(role)s 角色来访问 %(datasource)s 数据库" + "Check out this chart in dashboard:": ["在仪表盘中查看此图表"], + "Check out this chart: ": ["看看这张图表:"], + "Check out this dashboard: ": ["查看此看板:"], + "Check to apply filters instantly as they change instead of displaying [Apply] button": [ + "选中可在过滤条件更改时立即应用过滤,而不是使用 [应用] 按钮" ], - "Role %(r)s was extended to provide the access to the datasource %(ds)s": [ - "扩展角色 %(r)s 以提供对 datasource %(ds)s 的访问" + "Check to force date partitions to have the same height": [ + "选中以强制日期分区具有相同的高度" ], - "You have no permission to approve this request": [ - "您没有此请求的访问权限" + "Check to include Druid granularity dropdown": [ + "检查包含Druid时间粒度下拉列表" ], - "Cannot import dashboard: %(db_error)s.\nMake sure to create the database before importing the dashboard.": [ - "无法导入看板:%(db_error)s 。\n请确保在导入看板之前创建数据库。" + "Check to include SQL time grain dropdown": [ + "选中以包括SQL时间粒度下拉菜单" ], - "An unknown error occurred. Please contact your Superset administrator": [ - "发生未知错误。请与管理员联系" + "Check to include time column dropdown": ["检查包含时间列下拉列表"], + "Check to include time grain dropdown": ["选中以包括时间粒度下拉菜单"], + "Check to include time origin dropdown": ["检查包含时间原点的下拉列表"], + "Child label position": ["子标签位置"], + "Choice of [Label] must be present in [Group By]": [ + "[标签] 的选择项必须出现在 [Group By]" ], - "Error occurred when opening the chart: %(error)s": [ - "打开图表时出错: %(error)s" + "Choice of [Point Radius] must be present in [Group By]": [ + "[点半径] 的选择项必须出现在 [Group By]" ], - "You don't have the rights to ": ["您没有授权 "], - "alter this ": ["修改这个 "], - "chart": ["图表"], - "create a ": ["创建一个 "], - "Explore - %(table)s": ["查看 - %(table)s"], - "Chart [{}] has been saved": ["图表 [{}] 已经保存"], - "Chart [{}] has been overwritten": ["图表 [{}] 已经覆盖"], - "dashboard": ["看板"], - "Chart [{}] was added to dashboard [{}]": [ - "图表 [{}] 已经添加到看板 [{}]" + "Choose File": ["选择文件"], + "Choose a chart or dashboard not both": [ + "选择图表或看板,不能都全部选择" ], - "Dashboard [{}] just got created and chart [{}] was added to it": [ - "看板 [{}] 刚刚被创建,并且图表 [{}] 已被添加到其中" + "Choose a database...": ["选择数据库"], + "Choose a dataset": ["选择数据源"], + "Choose a metric for left axis": ["选择左轴的计量指标"], + "Choose a metric for right axis": ["为右轴选择一个指标"], + "Choose a number format": ["选择一种数字格式"], + "Choose a source": ["选择一个源"], + "Choose a source and a target": ["选择一个源和一个目标"], + "Choose a target": ["选择一个目标"], + "Choose chart type": ["选择图表类型"], + "Choose one or more charts for left axis": ["为左轴选择一个或多个图表"], + "Choose one or more charts for right axis": ["为右轴选择一个或多个图表"], + "Choose the annotation layer type": ["选择注释层类型"], + "Choose the source of your annotations": ["选择您的注释来源"], + "Chord Diagram": ["弦图"], + "Chosen non-numeric column": ["选定的非数字列"], + "Circle": ["圆"], + "Circle -> Arrow": ["圆 -> 箭头"], + "Circle -> Circle": ["圆 -> 圆"], + "Circle radar shape": ["圆形雷达图"], + "Circular": ["圆"], + "Classic chart that visualizes how metrics change over time.": [ + "直观显示指标随时间变化的经典图表。" + ], + "Classic row-by-column spreadsheet like view of a dataset. Use tables to showcase a view into the underlying data or to show aggregated metrics.": [ + "数据集的典型的逐行逐列电子表格视图。使用表格显示底层数据的视图或显示聚合指标。" ], - "This dashboard was changed recently. Please reload dashboard to get latest version.": [ - "此看板最近已更新。请重新加载看板以获取最新版本。" + "Clause": ["从句"], + "Clear": ["清除"], + "Clear all": ["清楚所有"], + "Click the lock to make changes.": ["单击锁以进行更改。"], + "Click the lock to prevent further changes.": [ + "单击锁定以防止进一步更改。" ], - "Could not load database driver: %(driver_name)s": [ - "无法加载数据库驱动程序:%(driver_name)s" + "Click this link to switch to an alternate form that allows you to input the SQLAlchemy URL for this database manually.": [ + "单击此链接可切换到备用表单,该表单允许您手动输入此数据库的SQLAlChemy URL。" ], - "Invalid connection string, a valid string usually follows:\n'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'": [ - "连接字符串无效,有效字符串的格式通常如下:\n'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'" + "Click this link to switch to an alternate form that exposes only the required fields needed to connect this database.": [ + "单击此链接可切换到仅显示连接此数据库所需的必填字段的备用表单。" ], - "Malformed request. slice_id or table_name and db_name arguments are expected": [ - "格式错误的请求。需要使用 slice_id 或 table_name 和 db_name 参数" + "Click to change visualization type": ["选择一个可视化类型"], + "Click to clear emitted filters": ["点击清除过滤"], + "Click to edit": ["点击编辑"], + "Click to edit label": ["单击以编辑标签"], + "Click to favorite/unfavorite": ["点击 收藏/取消收藏"], + "Click to force-refresh": ["点击强制刷新"], + "Click to see difference": ["点击查看差异"], + "Close": ["关闭"], + "Close all other tabs": ["关闭其他tab页"], + "Close tab": ["关闭标签"], + "Cluster": ["集群"], + "Cluster Name": ["群集名称"], + "Cluster label aggregator": ["集群标签聚合器"], + "Clustering Radius": ["簇半径"], + "Code": ["代码"], + "Collapse all": ["全部折叠"], + "Collapse table preview": ["折叠表的预览"], + "Color": ["颜色"], + "Color +/-": ["色彩 +/-"], + "Color Metric": ["颜色指标"], + "Color Scheme": ["配色方案"], + "Color Steps": ["色彩 Steps"], + "Color metric": ["颜色指标"], + "Color scheme": ["配色方案"], + "Color will be rendered based on a ratio of the cell against the sum of across this criteria": [ + "颜色将根据单元格与整个标准之和的比率来展示" ], - "Chart %(id)s not found": ["图表 %(id)s 没有找到"], - "Table %(table)s wasn't found in the database %(db)s": [ - "在数据库 %(db)s 中找不到表 %(table)s" + "Colors": ["颜色"], + "Column": ["列"], + "Column \"%(column)s\" is not numeric or does not exists in the query results.": [ + "列\"%(column)s\"不是数字或不在查询结果中" ], - "Can't find User '%(name)s', please ask your admin to create one.": [ - "用户’%(name)s’没有找到,请联系管理员创建。" + "Column Label(s)": ["字段标签"], + "Column containing ISO 3166-2 codes of region/province/department in your table.": [ + "表中包含地区/省/省的ISO 3166-2代码的列" ], - "Can't find DruidCluster with cluster_name = '%(name)s'": [ - "不能找到具有 cluster_name = '%(name)s' 的 Druid 集群" + "Column containing latitude data": ["包含纬度数据的列"], + "Column containing longitude data": ["包含经度数据的列"], + "Column is required": ["列是必填项"], + "Column label for index column(s). If None is given and Dataframe Index is True, Index Names are used.": [ + "索引列的列标签。如果为None, 并且数据框索引为 true, 则使用 \"索引名称\"。" ], - "Data could not be deserialized. You may want to re-run the query.": [ - "无法反序列化数据。您可能需要重新运行查询。" + "Column name [%s] is duplicated": ["列名 [%s] 重复"], + "Column name(s) ": ["列名"], + "Column referenced by aggregate is undefined: %(column)s": [ + "聚合引用的列未定义:%(column)s" ], - "%(validator)s was unable to check your query.\nPlease recheck your query.\nException: %(ex)s": [ - "%(validator)s 无法检查您的查询。\n请重新检查您的查询。\n异常: %(ex)s" + "Column select": ["选择列"], + "Column to use as the row labels of the dataframe. Leave empty if no index column.": [ + "字段作为数据文件的行标签使用。如果没有索引字段,则留空。" ], - "Failed to start remote query on a worker. Tell your administrator to verify the availability of the message queue.": [ - "无法对工作进程启动远程查询。请和管理员确认验证消息队列的可用性。" + "Columnar File": ["列式存储文件"], + "Columnar file \"%(columnar_filename)s\" uploaded to table \"%(table_name)s\" in database \"%(db_name)s\"": [ + "Excel 文件 \"%(columnar_filename)s\" 上传到数据库 \"%(db_name)s\" 中的表 \"%(table_name)s\"" ], - "Query record was not created as expected.": ["查询记录没有按预期创建。"], - "The parameter %(parameters)s in your query is undefined.": [ - "查询中的以下参数未定义:%(parameters)s 。" + "Columnar to Database configuration": ["列式存储文件到数据库配置"], + "Columns": ["列"], + "Columns missing in datasource: %(invalid_columns)s": [ + "数据源中缺少列:%(invalid_columns)s" ], - "%(user)s's profile": ["%(user)s 的信息"], - "Show CSS Template": ["查看CSS模板"], - "Add CSS Template": ["新增CSS模板"], - "Edit CSS Template": ["编辑CSS模板"], - "Template Name": ["模板名称"], - "A human-friendly name": ["人性化的名称"], - "Used internally to identify the plugin. Should be set to the package name from the pluginʼs package.json": [ - "在内部用于标识插件。应该在插件的 package.json 内被设置为包名。" + "Columns subtotal position": ["列的小计位置"], + "Columns to calculate distribution across. Defaults to temporal column if left empty.": [ + "计算分布的列。如果留空,则默认为临时列。" ], - "A full URL pointing to the location of the built plugin (could be hosted on a CDN for example)": [ - "指向内置插件位置的完整URL(例如,可以托管在CDN上)" + "Columns to display": ["要显示的字段"], + "Columns to group by": ["需要进行分组的一列或多列"], + "Columns to group by on the columns": ["必须是分组列"], + "Columns to group by on the rows": ["行上分组所依据的列"], + "Combine Metrics": ["整合指标"], + "Combine metrics": ["整合指标"], + "Comma-separated color picks for the intervals, e.g. 1,2,4. Integers denote colors from the chosen color scheme and are 1-indexed. Length must be matching that of interval bounds.": [ + "间隔的逗号分隔色选项,例如1、2、4。整数表示所选配色方案中的颜色,并以1为索引。长度必须与间隔界限匹配。" ], - "Custom Plugins": ["自定义插件"], - "Custom Plugin": ["自定义插件"], - "Add a Plugin": ["添加插件"], - "Edit Plugin": ["编辑插件"], - "Schedule Email Reports for Dashboards": ["为看板添加电子邮件报告"], - "Manage Email Reports for Dashboards": ["管理看板的电子邮件报告"], - "Changed On": ["改变为"], - "Active": ["激活"], - "Crontab": [""], - "Recipients": ["收件人"], - "Slack Channel": ["Slack 频道"], - "Deliver As Group": ["作为组交付"], - "Delivery Type": ["交付类型"], - "Schedule Email Reports for Charts": ["为图表配置电子邮件报告"], - "Manage Email Reports for Charts": ["管理图表的电子邮件报告"], - "Email Format": ["电子邮件格式"], - "List Saved Query": ["保存的查询列表"], - "Show Saved Query": ["显示保存的查询"], - "Add Saved Query": ["添加保存的查询"], - "Edit Saved Query": ["编辑保存的查询"], - "End Time": ["结束时间"], - "Pop Tab Link": ["流行标签链接"], - "Changed on": ["改变为"], - "Could not determine datasource type": ["无法确定数据源类型"], - "Could not find viz object": ["找不到可视化对象"], - "Show Chart": ["显示图表"], - "Add Chart": ["添加图表"], - "Edit Chart": ["编辑图表"], - "These parameters are generated dynamically when clicking the save or overwrite button in the explore view. This JSON object is exposed here for reference and for power users who may want to alter specific parameters.": [ - "这些参数是在浏览视图中单击保存或覆盖按钮时动态生成的。这个JSON对象在这里公开以供参考,并提供给可能希望更改特定参数的高级用户使用。" + "Comma-separated interval bounds, e.g. 2,4,5 for intervals 0-2, 2-4 and 4-5. Last number should match the value provided for MAX.": [ + "逗号分隔的区间界限,例如0-2、2-4和4-5区间的2、4、5。最后一个数字应与为Max提供的值匹配。" ], - "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.": [ - "此图表的缓存超时持续时间(以秒为单位)。注意,如果未定义,这默认为数据源/表超时。" + "Comparator option": ["比较器选项"], + "Compare multiple time series charts (as sparklines) and related metrics quickly.": [ + "快速比较多个时间序列图表和相关指标。" ], - "Last Modified": ["最后修改"], - "Parameters": ["参数"], - "Visualization Type": ["可视化类型"], - "Show Dashboard": ["显示看板"], - "Add Dashboard": ["添加看板"], - "Edit Dashboard": ["编辑看板"], - "This json object describes the positioning of the widgets in the dashboard. It is dynamically generated when adjusting the widgets size and positions by using drag & drop in the dashboard view": [ - "这个JSON对象描述了部件在看板中的位置。它是动态生成的,可以通过拖放,在看板中调整整部件的大小和位置" + "Compare the same summarized metric across multiple groups.": [ + "跨多个组比较相同的汇总指标" ], - "The CSS for individual dashboards can be altered here, or in the dashboard view where changes are immediately visible": [ - "可以在这里或者在看板视图修改单个看板的CSS样式" + "Compares how a metric changes over time between different groups. Each group is mapped to a row and change over time is visualized bar lengths and color.": [ + "比较指标在不同组之间随时间的变化情况。每一组被映射到一行,并且随着时间的变化被可视化地显示条的长度和颜色。" ], - "To get a readable URL for your dashboard": ["为看板生成一个可读的 URL"], - "This JSON object is generated dynamically when clicking the save or overwrite button in the dashboard view. It is exposed here for reference and for power users who may want to alter specific parameters.": [ - "这个JSON对象描述了部件在看板中的位置。它是动态生成的,可以通过拖放,在看板中调整整部件的大小和位置" + "Compares metrics from different categories using bars. Bar lengths are used to indicate the magnitude of each value and color is used to differentiate groups.": [ + "使用条形图比较不同类别的指标。条形长度用于指示每个值的大小,颜色用于区分组。" ], - "Owners is a list of users who can alter the dashboard.": [ - "所有者是可以更改看板的用户列表。" + "Compares the lengths of time different activities take in a shared timeline view.": [ + "比较不同活动在共享时间线视图中所花费的时间长度。" ], - "Determines whether or not this dashboard is visible in the list of all dashboards": [ - "确定此看板在所有看板列表中是否可见" + "Comparison": ["比较"], + "Comparison Period Lag": ["滞后比较"], + "Comparison suffix": ["比较前缀"], + "Components": ["组件"], + "Compute the contribution to the total": ["计算对总数的贡献值"], + "Condition": ["条件"], + "Conditional formatting": ["条件格式设置"], + "Confidence interval": ["信区间间隔"], + "Confidence interval must be between 0 and 1 (exclusive)": [ + "置信区间必须介于0和1(不包含1)之间" ], - "Title": ["标题"], - "Slug": ["Slug"], - "Published": ["已发布"], - "Position JSON": ["位置JSON"], - "CSS": ["CSS"], - "Underlying Tables": ["底层表"], - "Export": ["导出"], - "Export dashboards?": ["导出看板?"], - "Name of table to be created from csv data.": [ - "从CSV数据将创建的表的名称。" + "Configuration": ["配置"], + "Configure Advanced Time Range ": ["配置进阶时间范围"], + "Configure Time Range: Last...": ["配置时间范围:上一(Last).."], + "Configure Time Range: Previous...": ["配置时间范围:前一(Previous).."], + "Configure custom time range": ["配置自定义时间范围"], + "Configure filter scopes": ["配置过滤范围"], + "Configure the basics of your Annotation Layer.": ["注释层基本配置"], + "Configure your how you overlay is displayed here.": [ + "配置如何在这里显示您的覆盖。" ], - "CSV File": ["CSV文件"], - "Select a CSV file to be uploaded to a database.": [ - "选择一个CSV文件上传到数据库." + "Confirm save": ["确认保存"], + "Connect": ["连接"], + "Connect Google Sheets as tables to this database": [ + "将Google Sheet作为表格连接到此数据库" ], - "Only the following file extensions are allowed: %(allowed_extensions)s": [ - "仅允许以下文件扩展名:%(allowed_extensions)s" + "Connect a database": ["连接数据库"], + "Connect this database using the dynamic form instead": [ + "使用动态参数连接此数据库" ], - "Specify a schema (if database flavor supports this).": [ - "指定一个Schema(需要数据库支持)" + "Connect this database with a SQLAlchemy URI string instead": [ + "使用SQLAlchemy URI链接此数据库" ], - "Delimiter": ["分隔符"], - "Delimiter used by CSV file (for whitespace use \\s+).": [ - "CSV文件使用的分隔符 (空白请使用 \\s+)" + "Connection": ["连接"], + "Connection failed, please check your connection settings": [ + "连接失败,请检查您的连接配置" ], - "Table Exists": ["表已存在处理"], - "If table exists do one of the following: Fail (do nothing), Replace (drop and recreate table) or Append (insert data).": [ - "如果表已存在,执行其中一个:舍弃(什么都不做),替换(删除表并重建),或者追加(插入数据)" + "Connection looks good!": ["连接测试成功!"], + "Continuous": ["连续式"], + "Contribution": ["贡献"], + "Contribution Mode": ["贡献模式"], + "Control labeled ": ["控件已标记 "], + "Controls labeled ": ["控件已标记"], + "Coordinates": ["坐标"], + "Copied to clipboard!": ["复制到剪贴板!"], + "Copy": ["复制"], + "Copy SELECT statement to the clipboard": ["将 SELECT 语句复制到剪贴板"], + "Copy and Paste JSON credentials": ["复制和粘贴JSON凭据"], + "Copy and paste the entire service account .json file here": [ + "复制服务帐户的json文件复制并粘贴到此处" ], - "Fail": ["失败"], - "Replace": ["替换"], - "Append": ["追加"], - "Header Row": ["标题行"], - "Row containing the headers to use as column names (0 is first line of data). Leave empty if there is no header row.": [ - "作为列名的带有标题的行(0是第一行数据)。如果没有标题行则留空。" + "Copy chart URL": ["复制图表URL"], + "Copy chart URL to clipboard": ["复制图表URL到剪贴板"], + "Copy dashboard URL": ["复制仪表盘URL"], + "Copy link": ["复制链接"], + "Copy message": ["复制信息"], + "Copy of %s": ["%s 的副本"], + "Copy partition query to clipboard": ["将分区查询复制到剪贴板"], + "Copy query URL": ["复制查询URL"], + "Copy query link to your clipboard": ["将查询链接复制到剪贴板"], + "Copy the account name of that database you are trying to connect to.": [ + "复制尝试连接的数据库帐户名" ], - "Index Column": ["索引字段"], - "Column to use as the row labels of the dataframe. Leave empty if no index column.": [ - "字段作为数据文件的行标签使用。如果没有索引字段,则留空。" + "Copy the name of the database you are trying to connect to.": [ + "复制尝试连接的数据库名" ], - "Mangle Duplicate Columns": ["混合重复列"], - "Specify duplicate columns as \"X.0, X.1\".": [ - "将重复列指定为“x.0,x.1”。" + "Copy to Clipboard": ["复制到剪贴板"], + "Copy to clipboard": ["复制到剪贴板"], + "Correlation": ["相关性"], + "Cost estimate": ["成本估算"], + "Could not determine datasource type": ["无法确定数据源类型"], + "Could not fetch all saved charts": ["无法获取所有保存的图表"], + "Could not find viz object": ["找不到可视化对象"], + "Could not load database driver": ["无法加载数据库驱动程序"], + "Could not load database driver: %(driver_name)s": [ + "无法加载数据库驱动程序:%(driver_name)s" ], - "Skip Initial Space": ["跳过初始空格"], - "Skip spaces after delimiter.": ["在分隔符之后跳过空格。"], - "Skip Rows": ["跳过行"], - "Number of rows to skip at start of file.": ["在文件开始时跳过的行数。"], - "Rows to Read": ["读取的行"], - "Number of rows of file to read.": ["要读取的文件行数。"], - "Skip Blank Lines": ["跳过空白行"], - "Skip blank lines rather than interpreting them as NaN values.": [ - "跳过空白行而不是把它们解释为NaN值。" + "Could not load database driver: {}": ["无法加载数据库驱动程序:{}"], + "Could not verify the host": ["无法验证主机名(IP)"], + "Country": ["国家"], + "Country Color Scheme": ["国家颜色方案"], + "Country Column": ["国家字段"], + "Country Field Type": ["国家字段的类型"], + "Country Map": ["国家地图"], + "Create": ["创建"], + "Create a new chart": ["创建新图表"], + "Create new chart": ["创建新图表"], + "Create new filter set": ["创建新的过滤器"], + "Create or select schema...": ["创建或者选择模式"], + "Created": ["已创建"], + "Created On": ["创建日期"], + "Created by": ["创建人"], + "Created content": ["创建的内容"], + "Created on": ["创建日期"], + "Creating a data source and creating a new tab": [ + "创建数据源,并弹出一个新的标签页" ], - "Parse Dates": ["解析日期"], - "A comma separated list of columns that should be parsed as dates.": [ - "应作为日期解析的列的逗号分隔列表。" + "Creator": ["作者"], + "Crontab": ["定时任务"], + "Cross Filter Scoping": ["交叉筛选作用域"], + "Cross-filter scoping": ["交叉筛选作用域"], + "Cumulative": ["累计"], + "Custom": ["自定义"], + "Custom Plugin": ["自定义插件"], + "Custom Plugins": ["自定义插件"], + "Custom SQL": ["自定义SQL"], + "Custom SQL ad-hoc filters are not available for the native Druid connector": [ + "自定义SQL即席筛选器不适用于本机Druid连接器" ], - "Infer Datetime Format": ["日期时间格式"], - "Use Pandas to interpret the datetime format automatically.": [ - "使用Pandas自动解释日期时间格式。" + "Custom SQL ad-hoc metrics are not available for the native Druid connector": [ + "自定义SQL即席查询不适用于本机Druid连接器" ], - "Decimal Character": ["十进制字符"], - "Character to interpret as decimal point.": [ - "将字符解释为小数点的字符。" + "Custom SQL ad-hoc metrics are not enabled for this dataset": [ + "此数据集无法启用自定义SQL即席查询、" ], - "Dataframe Index": ["Dataframe索引"], - "Write dataframe index as a column.": ["将dataframe index 作为列."], - "Column Label(s)": ["字段标签"], - "Column label for index column(s). If None is given and Dataframe Index is True, Index Names are used.": [ - "索引列的列标签。如果为None, 并且数据框索引为 true, 则使用 \"索引名称\"。" - ], - "Null values": ["空值"], - "Json list of the values that should be treated as null. Examples: [\"\"], [\"None\", \"N/A\"], [\"nan\", \"null\"]. Warning: Hive database supports only single value. Use [\"\"] for empty string.": [ - "应视为null的值的Json列表。例如:[\"\"], [\"None\", \"N/A\"], [\"nan\", \"null\"]。警告:Hive数据库仅支持单个值。用 [\"\"] 代表空字符串。" - ], - "Name of table to be created from excel data.": [ - "从excel数据将创建的表的名称。" - ], - "Excel File": ["Excel文件"], - "Select a Excel file to be uploaded to a database.": [ - "选择要上传到数据库的Excel文件。" - ], - "Sheet Name": ["Sheet名称"], - "Strings used for sheet names (default is the first sheet).": [ - "用于sheet名称的字符串(默认为第一个sheet)。" - ], - "Show Database": ["显示数据库"], - "Add Database": ["添加数据库"], - "Edit Database": ["编辑数据库"], - "Expose this DB in SQL Lab": ["在 SQL 工具箱中公开这个数据库"], - "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.": [ - "以异步模式操作数据库,这意味着查询是在远程工作人员上执行的,而不是在web服务器本身上执行的, 这假设您有一个Celery worker setup以及一个结果后端。有关更多信息,请参考安装文档。" - ], - "Allow CREATE TABLE AS option in SQL Lab": [ - "在 SQL 编辑器中允许 CREATE TABLE AS 选项" - ], - "Allow CREATE VIEW AS option in SQL Lab": [ - "在 SQL 编辑器中允许 CREATE VIEW AS 选项" + "Custom time filter plugin": ["自定义时间过滤器插件"], + "Customize": ["定制化配置"], + "Customize Metrics": ["自定义指标"], + "Customize columns": ["自定义列"], + "D3 Format": ["D3 格式"], + "D3 format": ["D3 格式"], + "D3 format syntax: https://github.com/d3/d3-format": [ + "D3插件格式语法: https://github.com/d3/d3-time-format" ], - "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...) in SQL Lab": [ - "允许用户在 SQL 编辑器中运行非 SELECT 语句(UPDATE,DELETE,CREATE,...)" + "D3 number format for numbers between -1.0 and 1.0, useful when you want to have different siginificant digits for small and large numbers": [ + "D3数字格式,用于-1.0和1.0之间的数字,当您希望小数和大数有不同的符号数字时很有用" ], - "When allowing CREATE TABLE AS option in SQL Lab, this option forces the table to be created in this schema": [ - "当在 SQL 编辑器中允许 CREATE TABLE AS 选项时,此选项可以此模式中强制创建表" + "D3 time format for datetime columns": ["D3时间格式的时间列"], + "D3 time format syntax: https://github.com/d3/d3-time-format": [ + "D3时间插件格式语法: https://github.com/d3/d3-time-format" ], - "If Presto, Trino or Drill all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them.<br/>If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.": [ - "如果使用Presto,SQL 工具箱中的所有查询都将被当前登录的用户执行,并且这些用户必须拥有运行它们的权限。<br/>如果启用 Hive 和hive.server2.enable.doAs,将作为服务帐户运行查询,但会根据hive.server2.proxy.user的属性伪装当前登录用户。" + "DEC": ["十二月"], + "DELETE": ["删除"], + "DESCRIPTION ERROR": ["描述错误"], + "DML": ["DML(数据操作语言)"], + "Dark mode": ["黑暗模式"], + "Dashboard": ["看板"], + "Dashboard Emails": ["看板"], + "Dashboard [{}] just got created and chart [{}] was added to it": [ + "看板 [{}] 刚刚被创建,并且图表 [{}] 已被添加到其中" ], - "Allow SQL Lab to fetch a list of all tables and all views across all database schemas. For large data warehouse with thousands of tables, this can be expensive and put strain on the system.": [ - "允许 sql lab 获取所有数据库架构中的所有表和所有视图的列表。对于具有数千个表的大型数据仓库, 这可能会很耗费性能, 并给系统带来压力。" + "Dashboard could not be created.": ["看板无法被创建"], + "Dashboard could not be deleted.": ["看板无法被删除。"], + "Dashboard could not be updated.": ["看板无法更新。"], + "Dashboard does not exist": ["看板不存在"], + "Dashboard parameters are invalid.": ["看板参数无效。"], + "Dashboard properties": ["看板属性"], + "Dashboard scheme": ["仪表盘模式"], + "Dashboards": ["仪表盘"], + "Dashboards could not be deleted.": ["仪表盘无法被删除。"], + "Dashboards do not exist": ["仪表盘"], + "Data": ["数据"], + "Data Source": ["数据源"], + "Data Table": ["数据表"], + "Data Zoom": ["数据缩放"], + "Data could not be deserialized from the results backend. The storage format might have changed, rendering the old data stake. You need to re-run the original query.": [ + "无法从结果后端反序列化数据。存储格式可能已经改变,呈现了旧的数据桩。您需要重新运行原始查询。" ], - "Duration (in seconds) of the caching timeout for charts of this database. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.": [ - "此数据库图表的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为全局超时。" + "Data could not be retrieved from the results backend. You need to re-run the original query.": [ + "无法从结果后端检索数据。您需要重新运行原始查询。" ], - "If selected, please set the schemas allowed for csv upload in Extra.": [ - "如果选择,请额外设置csv上传允许的模式。" + "Data preview": ["数据预览"], + "Data source": ["数据源"], + "Data type": ["数据类型"], + "DataFrame include at least one series": [ + "数据帧(DataFrame)至少包括一个序列" ], - "Expose in SQL Lab": ["在 SQL 工具箱中公开"], - "Allow CREATE TABLE AS": ["允许 CREATE TABLE AS"], - "Allow CREATE VIEW AS": ["允许 CREATE VIEW AS"], - "Allow DML": ["允许 DML"], - "CTAS Schema": ["CTAS 模式"], - "SQLAlchemy URI": ["SQLAlchemy URI"], - "Chart Cache Timeout": ["表缓存超时"], - "Secure Extra": ["安全"], - "Root certificate": ["根证书"], - "Async Execution": ["异步执行查询"], - "Impersonate the logged on user": ["模拟登录用户"], - "Allow Csv Upload": ["允许Csv上传"], - "Allow Multi Schema Metadata Fetch": ["允许多Schema元数据获取"], - "Backend": ["后端"], - "Extra field cannot be decoded by JSON. %(msg)s": [ - "JSON无法解码额外字段。%(msg)s" + "DataFrame must include temporal column": [ + "数据帧(DataFrame)必须包含时间列" ], - "Invalid connection string, a valid string usually follows:'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'<p>Example:'postgresql://user:password@your-postgres-db/database'</p>": [ - "连接字符串无效,有效字符串格式通常如下:'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'<p>例如:'postgresql://user:password@your-postgres-db/database'</p>" + "Database": ["数据库"], + "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for columnar uploads. Please contact your Superset Admin.": [ + "数据库 \"%(database_name)s\" schema \"%(schema_name)s\" 不允许用于excel上传。请联系管理员。" ], - "CSV to Database configuration": ["csv 到数据库配置"], "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for csv uploads. Please contact your Superset Admin.": [ "数据库 \"%(database_name)s\" schema \"%(schema_name)s\" 不允许用于csv上传。请联系管理员。" ], - "You cannot specify a namespace both in the name of the table: \"%(csv_table.table)s\" and in the schema field: \"%(csv_table.schema)s\". Please remove one": [ - "不能同时在表名 \"%(csv_table.table)s\" 和schema字段 \"%(csv_table.schema)s\" 中指定命名空间。请删除一个。" - ], - "Unable to upload CSV file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ - "无法将CSV文件 \"%(filename)s\" 上传到数据库 \"%(db_name)s\" 中的表 \"%(table_name)s\" 内。错误消息:%(error_msg)s" - ], - "CSV file \"%(csv_filename)s\" uploaded to table \"%(table_name)s\" in database \"%(db_name)s\"": [ - "csv 文件 \"%(csv_filename)s\" 上传到数据库 \"%(db_name)s\" 中的表 \"%(table_name)s\"" - ], - "Excel to Database configuration": ["Excel 到数据库配置"], "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed for excel uploads. Please contact your Superset Admin.": [ "数据库 \"%(database_name)s\" schema \"%(schema_name)s\" 不允许用于excel上传。请联系管理员。" ], - "You cannot specify a namespace both in the name of the table: \"%(excel_table.table)s\" and in the schema field: \"%(excel_table.schema)s\". Please remove one": [ - "不能同时在表名 \"%(excel_table.table)s\" 和schema字段 \"%(excel_table.schema)s\" 中指定命名空间。请删除一个。" + "Database Creation Error": ["数据库创建错误"], + "Database URL": ["数据库URL"], + "Database could not be created.": ["数据库无法被创建"], + "Database could not be deleted.": ["数据库不能删除。"], + "Database could not be updated.": ["数据库无法更新"], + "Database does not allow data manipulation.": [ + "数据库不允许此数据操作。" ], - "Unable to upload Excel file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ - "无法将Excel文件 \"%(filename)s\" 上传到数据库 \"%(db_name)s\" 中的表 \"%(table_name)s\" 内。错误消息:%(error_msg)s" + "Database does not exist": ["数据库不存在"], + "Database does not support subqueries": ["数据库不支持子查询"], + "Database error": ["数据库错误"], + "Database is offline.": ["数据库已下线"], + "Database is required for alerts": ["警报需要数据库"], + "Database name": ["数据库名称"], + "Database not allowed to change": ["数据集不允许被修改"], + "Database not found.": ["数据库没有找到"], + "Database parameters are invalid.": ["数据库参数无效"], + "Database port": ["数据库端口"], + "Databases": ["数据库"], + "Dataframe Index": ["Dataframe索引"], + "Dataset": ["数据集"], + "Dataset %(name)s already exists": ["数据集 %(name)s 已存在"], + "Dataset column delete failed.": ["数据集列删除失败。"], + "Dataset column not found.": ["数据集行删除失败。"], + "Dataset could not be created.": ["无法创建数据集。"], + "Dataset could not be deleted.": ["无法删除数据集"], + "Dataset could not be updated.": ["无法更新数据集。"], + "Dataset does not exist": ["数据集不存在"], + "Dataset is required": ["需要数据集"], + "Dataset metric delete failed.": ["数据集指标删除失败"], + "Dataset metric not found.": ["数据集指标没找到"], + "Dataset name": ["数据集名称"], + "Dataset parameters are invalid.": ["数据集参数无效。"], + "Dataset(s) could not be bulk deleted.": ["数据集无法批量删除"], + "Datasets": ["数据集"], + "Datasets do not contain a temporal column": ["数据集不包含时间列"], + "Datasource": ["数据源"], + "Datasource & Chart Type": ["数据源 & 图表类型"], + "Datasource Name": ["数据库名称"], + "Datasource id not found: %(id)s": ["数据源id不存在:%(id)s"], + "Datasource type is required when datasource_id is given": [ + "给定数据源id时,需要提供数据源类型" ], - "Excel file \"%(excel_filename)s\" uploaded to table \"%(table_name)s\" in database \"%(db_name)s\"": [ - "Excel 文件 \"%(excel_filename)s\" 上传到数据库 \"%(db_name)s\" 中的表 \"%(table_name)s\"" + "Date Time Format": ["时间格式"], + "Date filter": ["日期过滤器"], + "Date format": ["日期格式化"], + "Date/Time": ["日期/时间"], + "Datetime Format": ["时间格式"], + "Datetime column not provided as part table configuration and is required by this type of chart": [ + "没有提供该表配置的日期时间列,它是此类型图表所必需的" ], - "Logs": ["日志"], - "Show Log": ["查看日志"], - "Add Log": ["新增日志"], - "Edit Log": ["编辑日志"], - "Action": ["操作"], - "dttm": ["dttm"], - "Add item": ["增加条件"], - "The query couldn't be loaded": ["这个查询无法被加载"], - "Your query has been scheduled. To see details of your query, navigate to Saved queries": [ - "您的查询已被调度。要查看查询的详细信息,请跳转到保存查询页面查看。" + "Datetime format": ["时间格式"], + "Day": ["天"], + "Days %s": ["%s天"], + "Db engine did not return all queried columns": [ + "数据库引擎未返回所有查询的列" ], - "Your query could not be scheduled": ["无法调度您的查询"], - "Failed at retrieving results": ["检索结果失败"], - "An error occurred while storing the latest query id in the backend. Please contact your administrator if this problem persists.": [ - "在后端存储最新查询id时出错。如果此问题仍然存在,请与管理员联系。" + "December": ["十二月"], + "Decimal Character": ["十进制字符"], + "Deck.gl - 3D Grid": ["Deck.gl - 3D网格"], + "Deck.gl - 3D HEX": ["Deck.gl - 3D六角曲面"], + "Deck.gl - Arc": ["Deck.gl - 弧度"], + "Deck.gl - GeoJSON": ["Deck.gl - 地理json"], + "Deck.gl - Multiple Layers": ["多图层"], + "Deck.gl - Paths": ["Deck.gl - 路径"], + "Deck.gl - Polygon": ["Deck.gl - 多角形"], + "Deck.gl - Scatter plot": ["Deck.gl - 散点图"], + "Deck.gl - Screen Grid": ["Deck.gl - 屏幕网格"], + "Default": ["默认"], + "Default Endpoint": ["默认端点"], + "Default URL": ["默认URL"], + "Default URL to redirect to when accessing from the dataset list page": [ + "从数据集列表页访问时重定向到的默认URL" ], - "Unknown error": ["未知错误"], - "Query was stopped.": ["查询被终止。"], - "Unable to migrate table schema state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ - "无法将表结构状态迁移到后端。系统将稍后重试。如果此问题仍然存在,请与管理员联系。" + "Default Value": ["缺省值"], + "Default latitude": ["默认纬度"], + "Default longitude": ["默认经度"], + "Default minimal column width in pixels, actual width may still be larger than this if other columns don't need much space": [ + "默认最小列宽(以像素为单位),如果其他列不需要太多空间,则实际宽度可能仍大于此值" ], - "Unable to migrate query state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ - "无法将查询状态迁移到后端。系统将稍后重试。如果此问题仍然存在,请与管理员联系。" + "Default to first item": ["默认为第一项"], + "Default value is required": ["需要默认值"], + "Default value must be set when \"Filter has default value\" is checked": [ + "选中筛选器具有默认值时,必须设置默认值" ], - "Unable to migrate query editor state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ - "无法将查询编辑器状态迁移到后端。系统将稍后重试。如果此问题仍然存在,请与管理员联系。" + "Default value must be set when \"Required\" is checked": [ + "当\"必填项\"被选中时默认值必须被设置" ], - "Unable to add a new tab to the backend. Please contact your administrator.": [ - "无法将新选项卡添加到后端。请与管理员联系。" + "Default value set automatically when \"Default to first item\" is checked": [ + "当\"默认为第一项\"被选中时默认值需要设置为自动" ], - "Copy of %s": ["%s 的副本"], - "An error occurred while setting the active tab. Please contact your administrator.": [ - "设置活动tab页时出错。请与管理员联系。" + "Defines a rolling window function to apply, works along with the [Periods] text box": [ + "定义要应用的滚动窗口函数,与 [期限] 文本框一起使用" ], - "An error occurred while fetching tab state": ["获取tab页状态时出错"], - "An error occurred while removing tab. Please contact your administrator.": [ - "删除tab页时出错。请与管理员联系。" + "Defines how each series is broken down": ["定义每个序列是如何被分解的"], + "Defines the grouping of entities. Each series is shown as a specific color on the chart and has a legend toggle": [ + "定义实体的分组。每个序列在图表上显示为特定颜色,并有一个可切换的图例" ], - "An error occurred while removing query. Please contact your administrator.": [ - "删除查询时出错。请与管理员联系。" + "Defines the origin where time buckets start, accepts natural dates as in `now`, `sunday` or `1970-01-01`": [ + "定义时间桶的起点,接受 `now`,`sunday` 或 `1970-01-01` 等格式的日期表达" ], - "An error occurred while setting the tab database ID. Please contact your administrator.": [ - "设置tab页数据库ID时出错。请与管理员联系。" + "Defines the size of the rolling window function, relative to the time granularity selected": [ + "定义滚动窗口函数的大小,相对于所选的时间粒度" ], - "An error occurred while setting the tab schema. Please contact your administrator.": [ - "设置tab页结构时出错。请与管理员联系。" + "Defines whether the step should appear at the beginning, middle or end between two data points": [ + "定义步骤应出现在两个数据点之间的开始、中间还是结束处" ], - "An error occurred while setting the tab autorun. Please contact your administrator.": [ - "设置tab页自动运行时出错。请与管理员联系。" + "Delete": ["删除"], + "Delete %s?": ["需要删除 %s 吗?"], + "Delete Annotation?": ["删除注释?"], + "Delete Database?": ["确定删除数据库?"], + "Delete Dataset?": ["确定删除数据集?"], + "Delete Layer?": ["确定删除图层?"], + "Delete Query?": ["确定删除查询?"], + "Delete Report?": ["删除报表?"], + "Delete Template?": ["删除模板?"], + "Delete all Really?": ["确定删除全部?"], + "Delete annotation": ["删除注释"], + "Delete dashboard tab?": ["是否删除仪表盘tab页?"], + "Delete database": ["删除数据库"], + "Delete email report": ["删除邮件报告"], + "Delete query": ["删除查询"], + "Delete template": ["删除模板"], + "Delete this container and save to remove this message.": [ + "删除此容器并保存以删除此邮件。" ], - "An error occurred while setting the tab title. Please contact your administrator.": [ - "设置tab页标题时出错。请与管理员联系。" + "Deleted %(num)d annotation": ["选择一个注释图层"], + "Deleted %(num)d annotation layer": ["选择一个注释图层"], + "Deleted %(num)d chart": ["删除了 %(num)d 个图表"], + "Deleted %(num)d css template": ["删除了 %(num)d 个css模板"], + "Deleted %(num)d dashboard": ["删除了 %(num)d 个看板"], + "Deleted %(num)d dataset": ["已经删除 %(num)d 个数据集"], + "Deleted %(num)d report schedule": ["已经删除了 %(num)d 个报告时间表"], + "Deleted %(num)d saved query": ["已经删除 %(num)d 个保存的查询"], + "Deleted: %s": ["已删除:%s"], + "Delimited long & lat single column": ["经度&纬度单列限定"], + "Delimiter": ["分隔符"], + "Delimiter used by CSV file (for whitespace use \\s+).": [ + "CSV文件使用的分隔符 (空白请使用 \\s+)" ], - "Your query was saved": ["您的查询已保存"], - "Your query could not be saved": ["您的查询无法保存"], - "Your query was updated": ["您的查询已保存"], - "Your query could not be updated": ["无法更新您的查询"], - "An error occurred while storing your query in the backend. To avoid losing your changes, please save your query using the \"Save Query\" button.": [ - "在后端存储查询时出错。为避免丢失更改,请使用 \"保存查询\" 按钮保存查询。" + "Deliver As Group": ["作为组交付"], + "Delivery Type": ["交付类型"], + "Delivery method": ["发送方式"], + "Demographics": ["人口统计"], + "Density": ["密度"], + "Deprecated": ["过时"], + "Description": ["描述"], + "Description (this can be seen in the list)": ["说明(见列表)"], + "Description Columns": ["列描述"], + "Description text that shows up below your Big Number": [ + "在大数字下面显示描述文本" ], - "An error occurred while setting the tab template parameters. Please contact your administrator.": [ - "设置tab页模板参数时出错。请与管理员联系。" + "Deselect all": ["反选所有"], + "Details of the certification": ["认证详情"], + "Determines how whiskers and outliers are calculated.": [ + "确定如何计算箱须和离群值。" ], - "An error occurred while fetching table metadata": [ - "获取表格元数据时发生错误" + "Determines whether or not this dashboard is visible in the list of all dashboards": [ + "确定此看板在所有看板列表中是否可见" ], - "An error occurred while fetching table metadata. Please contact your administrator.": [ - "获取表格元数据时发生错误。请与管理员联系。" + "Diamond": ["下钻"], + "Did you mean:": ["您的意思是:"], + "Difference": ["差异"], + "Directed Force Layout": ["有向图"], + "Directional": ["方向"], + "Disabled": ["禁用"], + "Discard changes": ["放弃更改"], + "Discrete": ["离散"], + "Display Name": ["显示名称"], + "Display column level total": ["显示列级别合计"], + "Display configuration": ["显示配置"], + "Display metrics side by side within each column, as opposed to each column being displayed side by side for each metric.": [ + "在每个列中并排显示指标,而不是每个指标并排显示每个列。" ], - "An error occurred while expanding the table schema. Please contact your administrator.": [ - "展开表结构时出错。请与管理员联系。" + "Display row level total": ["显示行级合计"], + "Display total row/column": ["显示总行 / 列"], + "Displays connections between entities in a graph structure. Useful for mapping relationships and showing which nodes are important in a network. Graph charts can be configured to be force-directed or circulate. If your data has a geospatial component, try the deck.gl Arc chart.": [ + "显示图形结构中实体之间的连接。用于映射关系和显示网络中哪些节点是重要的。图表可以配置为强制引导或循环。如果您的数据具有地理空间组件,请尝试使用deck.gl圆弧图表。" ], - "An error occurred while collapsing the table schema. Please contact your administrator.": [ - "收起表结构时出错。请与管理员联系。" + "Distribute across": ["基于某列进行分布"], + "Distribution": ["分布"], + "Distribution - Bar Chart": ["分布 - 柱状图"], + "Divider": ["分隔"], + "Do you want a donut or a pie?": ["是否用圆环圈替代饼图?"], + "Documentation": ["文档"], + "Domain": ["主域"], + "Don't refresh": ["不刷新"], + "Donut": ["圆环圈"], + "Download as image": ["下载为图片"], + "Download to CSV": ["下载到CSV"], + "Draft": ["草稿"], + "Draw a marker on data points. Only applicable for line types.": [ + "在数据点上绘制标记。仅适用于线型。" ], - "An error occurred while removing the table schema. Please contact your administrator.": [ - "删除表结构时出错。请与管理员联系。" + "Draw area under curves. Only applicable for line types.": [ + "在曲线下绘制区域。仅适用于线型。" ], - "Shared query": ["已分享的查询"], - "The datasource couldn't be loaded": ["这个查询无法被加载"], - "An error occurred while creating the data source": [ - "创建数据源时发生错误" + "Draw line from Pie to label when labels outside?": [ + "当标签在外侧时,是否在饼图到标签之间连线?" ], - "SQL Lab uses your browser's local storage to store queries and results.\n Currently, you are using ${currentUsage.toFixed(\n 2,\n )} KB out of ${LOCALSTORAGE_MAX_USAGE_KB} KB. storage space.\n To keep SQL Lab from crashing, please delete some query tabs.\n You can re-access these queries by using the Save feature before you delete the tab. Note that you will need to close other SQL Lab windows before you do this.": [ - "SQL Lab 使用浏览器的本地存储来存储查询和结果。\n目前,您正在使用${currentUsage.toFixed(\n 2,\n )} KB / ${LOCALSTORAGE_MAX_USAGE_KB} KB 的存储空间。\n为了防止SQLLab崩溃,请删除一些查询tab页。\n在删除tab页之前,可以使用 \"保存\" 功能重新访问这些查询。请注意,在执行此操作之前,需要关闭其他SQLLab窗口。" + "Draw split lines for minor y-axis ticks": ["绘制次要y轴记号的分割线"], + "Drop a column here or click": ["将列拖放到此处或单击"], + "Drop a column/metric here or click": ["将列/指标放在此处或单击"], + "Drop column here": ["将列拖放到此处"], + "Drop column or metric here": ["将列或指标放在此处"], + "Drop columns here": ["将列拖放到此处"], + "Drop columns or metrics here": ["将列或指标拖放到此处"], + "Drop columns/metrics here or click": ["将列/指标拖放到此处或单击"], + "Drop temporal column here": ["将时间列拖放到此处"], + "Druid Clusters": ["Druid 集群"], + "Druid Datasource": ["Druid 数据源"], + "Druid Datasources": ["Druid 数据源"], + "Druid supports basic authentication. See [auth](http://druid.io/docs/latest/design/auth.html) and druid-basic-security extension": [ + "Druid支持基本的身份验证。可以参考 [auth](http://druid.io/docs/latest/design/auth.html) 和 druid-basic-security 部分" ], - "Estimate selected query cost": ["运行选定的查询"], - "Estimate cost": ["运行选定的查询"], - "Cost estimate": ["成本估算"], - "Creating a data source and creating a new tab": [ - "创建数据源,并弹出一个新的标签页" + "Dual Line Chart": ["双线图"], + "Duplicate column name(s): %(columns)s": ["重复的列名%(columns)s"], + "Duplicate column/metric labels: %(labels)s. Please make sure all columns and metrics have a unique label.": [ + "重复的列/指标标签:%(labels)s。请确保所有列和指标都有唯一的标签。" ], - "An error occurred": ["发生了一个错误"], - "Explore the result set in the data exploration view": [ - "在数据探索视图中探索结果集" + "Duplicate tab": ["复制tab页"], + "Duration": ["持续时间"], + "Duration (in seconds) of the caching timeout for charts of this database. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.": [ + "此数据库图表的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为全局超时。" ], - "Explore": ["探索"], - "This query took %s seconds to run, ": ["这个查询使用了 %s 秒去执行,"], - "and the explore view times out at %s seconds ": [ - ",浏览视图在 %s 秒超时" + "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the dataset's timeout if undefined.": [ + "此图表的缓存超时前的持续时间(秒)。请注意,如果未定义则默认为数据集的超时时间。" ], - "following this flow will most likely lead to your query timing out. ": [ - "遵循此流程很可能会导致查询超时。" + "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the datasource/table timeout if undefined.": [ + "此图表的缓存超时持续时间(以秒为单位)。注意,如果未定义,这默认为数据源/表超时。" ], - "We recommend your summarize your data further before following that flow. ": [ - "我们建议您在遵循流程之前进一步总结数据。" + "Duration (in seconds) of the caching timeout for this cluster. A timeout of 0 indicates that the cache never expires. Note this defaults to the global timeout if undefined.": [ + "此集群的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为全局超时。" ], - "If activated you can use the ": ["如果激活,您可以使用 "], - "feature to store a summarized data set that you can then explore.": [ - "用于存储可供浏览的汇总数据集的功能。" + "Duration (in seconds) of the caching timeout for this datasource. A timeout of 0 indicates that the cache never expires. Note this defaults to the cluster timeout if undefined.": [ + "此数据源的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为集群超时。" ], - "Column name(s) ": ["列名"], - "cannot be used as a column name. The column name/alias \"__timestamp\"\n is reserved for the main temporal expression, and column aliases ending with\n double underscores followed by a numeric value (e.g. \"my_col__1\") are reserved\n for deduplicating duplicate column names. Please use aliases to rename the\n invalid column names.": [ - "不能作为一个列名称使用。列名/别名 \"__timestamp\"\n 是为主要的时间表达式保留的,列别名以双下划线结尾\n 并后跟一个数值(例如 \"my_col__1\")。 这是为了\n 保留用于消除重复的列名。请使用别名来\n 重命名无效的列名。" + "Duration (in seconds) of the caching timeout for this table. A timeout of 0 indicates that the cache never expires. Note this defaults to the database timeout if undefined.": [ + "此表的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为数据库的超时。" ], - "Raw SQL": ["行 SQL"], - "Source SQL": ["源 SQL"], - "SQL": ["SQL"], - "No query history yet...": ["暂无历史查询..."], - "It seems you don't have access to any database": [ - "貌似您没有访问到任何数据库" + "Duration (in seconds) of the metadata caching timeout for schemas of this database. If left unset, the cache never expires.": [ + "此数据库图表的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为永不过期。" ], - "An error occurred when refreshing queries": ["创建数据源时发生错误"], - "Filter by user": ["过滤用户"], - "Filter by database": ["过滤数据库"], - "Query search string": ["查询搜索字符串"], - "[From]-": ["[从]-"], - "[To]-": ["[至]-"], - "Filter by status": ["过滤状态"], + "Duration (in seconds) of the metadata caching timeout for tables of this database. If left unset, the cache never expires. ": [ + "此数据库图表的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,缓存为永不过期。" + ], + "Duration in ms (1.40008 => 1ms 400µs 80ns)": [ + "持续时间(毫秒)(1.40008 => 1ms 400µs 80ns)" + ], + "Duration in ms (66000 => 1m 6s)": ["持续时间(毫秒)(66000 => 1m 6s)"], + "Duration: %s": ["持续时间:%s"], + "ECharts": ["ECharts图表"], + "END (EXCLUSIVE)": ["结束"], + "ERROR: %s": ["错误: %s"], + "Edge length": ["边长"], + "Edge length between nodes": ["节点之间的边长"], + "Edge symbols": ["边符号"], + "Edge width": ["边缘宽度"], "Edit": ["编辑"], - "View results": ["展示结果"], - "Data preview": ["数据预览"], - "Overwrite text in the editor with a query on this table": [ - "使用该表上的查询覆盖编辑器中的文本" + "Edit Alert": ["编辑警报"], + "Edit Annotation": ["编辑注释"], + "Edit Annotation Layer": ["编辑注释层"], + "Edit CSS": ["编辑CSS"], + "Edit CSS Template": ["编辑CSS模板"], + "Edit CSS template properties": ["编辑CSS属性属性"], + "Edit Chart": ["编辑图表"], + "Edit Column": ["编辑列"], + "Edit Dashboard": ["编辑看板"], + "Edit Database": ["编辑数据库"], + "Edit Dataset ": ["编辑数据集"], + "Edit Druid Cluster": ["编辑 Druid 集群"], + "Edit Druid Column": ["编辑 Druid 列"], + "Edit Druid Datasource": ["编辑 Druid 数据源"], + "Edit Druid Metric": ["编辑 Druid 指标"], + "Edit Email Report": ["编辑邮件报告"], + "Edit Log": ["编辑日志"], + "Edit Metric": ["编辑指标"], + "Edit Plugin": ["编辑插件"], + "Edit Report": ["编辑报表"], + "Edit Row level security filter": ["编辑行级安全过滤"], + "Edit Saved Query": ["编辑保存的查询"], + "Edit Table": ["编辑表"], + "Edit annotation": ["编辑注释"], + "Edit annotation layer": ["添加注释层"], + "Edit annotation layer properties": ["编辑注释图层属性"], + "Edit chart properties": ["编辑图表属性"], + "Edit dashboard": ["编辑仪表盘"], + "Edit dashboard properties": ["编辑看板属性"], + "Edit database": ["编辑数据库"], + "Edit dataset": ["编辑数据集"], + "Edit email report": ["编辑邮件报告"], + "Edit formatter": ["日期格式化"], + "Edit properties": ["编辑属性"], + "Edit query": ["编辑查询"], + "Edit template": ["编辑模板"], + "Edit template parameters": ["编辑模板参数"], + "Edit time range": ["编辑时间范围"], + "Edited": ["已编辑"], + "Editing 1 filter:": ["编辑1个过滤条件:"], + "Editing filter set:": ["编辑过滤条件集合"], + "Either the database is spelled incorrectly or does not exist.": [ + "数据库拼写不正确或不存在。" ], - "Run query in a new tab": ["在新标签中运行查询"], - "Remove query from log": ["从日志中删除查询"], - "An error occurred saving dataset": ["保存数据集时发生错误"], - ".CSV": [".CSV"], - "Clipboard": ["复制到剪贴板"], - "Filter results": ["过滤结果"], - "Database error": ["数据库错误"], - "was created": ["已创建"], - "Query in a new tab": ["在新标签中查询"], - "The query returned no data": ["查询无结果"], - "Fetch data preview": ["获取数据预览"], - "Refetch results": ["重新获取结果"], - "Track job": ["跟踪任务"], - "Stop": ["停止"], - "Run selection": ["运行选定的查询"], - "Run": ["执行"], - "Stop running (Ctrl + x)": ["停止运行 (Ctrl + x)"], - "Stop running (Ctrl + e)": ["停止运行 (Ctrl + e)"], - "Run query (Ctrl + Return)": ["执行运行 (Ctrl + Return)"], - "Save & Explore": ["保存和浏览"], - "Overwrite & Explore": ["覆写和浏览"], - "Save or Overwrite Dataset": ["保存或覆盖数据集"], - "Save this query as a virtual dataset to continue exploring": [ - "将此查询另存为虚拟数据集以继续探索" + "Either the username \"%(username)s\" or the password is incorrect.": [ + "用户名\"%(username)s\"或密码不正确" ], - "Overwrite existing": ["覆盖已有"], - "Select or type dataset name": ["选择或者键入数据集名称"], - "Are you sure you want to overwrite this dataset?": [ - "您确定要覆盖此数据集吗?" + "Either the username \"%(username)s\", password, or database name \"%(database)s\" is incorrect.": [ + "用户名\"%(username)s\"、密码或数据库名称\"%(database)s\"不正确" ], - "Undefined": ["未命名"], - "Save": ["保存"], - "Save as": ["另存为"], - "Save query": ["保存查询"], - "Save as new": ["保存为新的"], - "Update": ["更新"], - "Label for your query": ["为您的查询设置标签"], - "Write a description for your query": ["为您的查询写一段描述"], - "Schedule query": ["分享查询"], - "Schedule": ["调度"], - "There was an error with your request": ["您的请求有错误"], - "Please save the query to enable sharing": ["请保存查询以启用共享"], - "Copy link": ["复制链接"], - "Copy query link to your clipboard": ["将查询链接复制到剪贴板"], - "Save the query to copy the link": ["保存查询以复制链接"], - "No stored results found, you need to re-run your query": [ - "找不到存储的结果,需要重新运行查询" + "Either the username or password is incorrect.": ["用户名或密码不正确。"], + "Either the username or the password is wrong.": ["用户名或密码错误。"], + "Email Format": ["电子邮件格式"], + "Email reports active": ["激活邮件报告"], + "Emit Target": ["发送目标"], + "Emit dashboard cross filters": ["发送仪表盘过滤"], + "Emit dashboard cross filters.": ["发送仪表盘过滤"], + "Emitted values": ["限制选择器值"], + "Emphasis": ["重点"], + "Employment and education": ["就业和教育"], + "Empty circle": ["空圈"], + "Empty collection": ["空集合"], + "Empty query?": ["查询为空?"], + "Enable Filter Select": ["启用过滤器选择"], + "Enable data zooming controls": ["启用数据缩放控件"], + "Enable forecast": ["启用预测"], + "Enable forecasting": ["启用预测中"], + "Enable graph roaming": ["启用图形漫游"], + "Enable node dragging": ["启用节点拖动"], + "Enable query cost estimation": ["启用查询成本估算"], + "Enable server side pagination of results (experimental feature)": [ + "支持服务器端结果分页(实验功能)" ], - "Run a query to display results here": ["运行一个查询,在此会显示结果"], - "Preview: `%s`": ["预览 %s"], - "Results": ["结果"], - "Query history": ["历史查询"], - "Run query": ["运行查询"], - "New tab": ["新Tab页"], - "Untitled query": ["未命名的查询"], - "Stop query": ["停止查询"], - "Schedule the query periodically": ["定期调度查询"], - "You must run the query successfully first": ["必须先成功运行查询"], - "It appears that the number of rows in the query results displayed\n was limited on the server side to\n the %s limit.": [ - "服务器端显示的查询结果中的行数似乎限制在 %s 以内。" + "Encountered invalid NULL spatial entry, please consider filtering those out": [ + "遇到无效的为 NULL 的空间条目,请考虑将其过滤掉" ], - "CREATE TABLE AS": ["允许 CREATE TABLE AS"], - "CREATE VIEW AS": ["允许 CREATE VIEW AS"], + "End": ["结束"], + "End Time": ["结束时间"], + "End angle": ["结束角度"], + "End date excluded from time range": ["从时间范围中排除的结束日期"], + "End date must be after start date": ["起始时间不可以大于当前时间"], + "Engine \"%(engine)s\" cannot be configured through parameters.": [ + "引擎 \"%(engine)s\" 不能通过参数配置。" + ], + "Engine \"%(engine)s\" is not a valid engine.": [ + "无效引擎\"%(engine)s\"" + ], + "Engine Parameters": ["引擎参数"], + "Engine spec \"InvalidEngine\" does not support being configured via individual parameters.": [ + "引擎\"InvalidEngine\"不支持通过单独的参数进行配置。" + ], + "Enter CA_BUNDLE": ["进入CA_BUNDLE"], + "Enter a name for this sheet": ["输入此工作表的名称"], + "Enter a new title for the tab": ["输入标签的新标题"], + "Enter duration in seconds": ["输入间隔时间(秒)"], + "Enter fullscreen": ["全屏"], + "Entity": ["实体"], + "Entity ID": ["实体ID"], + "Equal Date Sizes": ["相同的日期大小"], + "Error": ["错误"], + "Error Message": ["错误消息"], + "Error in jinja expression in HAVING clause: %(msg)s": [ + "jinja表达式中的HAVING子句出错:%(msg)s" + ], + "Error in jinja expression in RLS filters: %(msg)s": [ + "jinja表达式中的 RLS filters 出错:%(msg)s" + ], + "Error in jinja expression in WHERE clause: %(msg)s": [ + "jinja表达式中的WHERE子句出错:%(msg)s" + ], + "Error in jinja expression in fetch values predicate: %(msg)s": [ + "获取jinja表达式中的谓词的值出错:%(msg)s" + ], + "Error loading chart datasources. Filters may not work correctly.": [ + "加载图表数据源时出错。过滤器可能无法正常工作。" + ], + "Error message": ["错误信息"], + "Error while fetching charts": ["获取图表时出错"], + "Error while fetching data: %s": ["获取数据时出错:%s"], + "Error while rendering virtual dataset query: %(msg)s": [ + "保存查询时出错:%(msg)s" + ], + "Estimate cost": ["运行选定的查询"], + "Estimate selected query cost": ["运行选定的查询"], "Estimate the cost before running a query": [ "在运行查询之前计算执行计划" ], - "Reset state": ["状态重置"], - "Enter a new title for the tab": ["输入标签的新标题"], - "Untitled Query %s": ["未命名的查询 %s"], - "Close tab": ["关闭标签"], - "Rename tab": ["重命名标签"], - "Expand tool bar": ["展开工具栏"], - "Hide tool bar": ["隐藏工具栏"], - "Close all other tabs": ["关闭其他tab页"], - "Duplicate tab": ["复制tab页"], - "Copy partition query to clipboard": ["将分区查询复制到剪贴板"], - "latest partition:": ["最新分区:"], - "Keys for table": ["表的键"], - "View keys & indexes (%s)": ["查看键和索引(%s)"], - "Sort columns alphabetically": ["对列按字母顺序进行排列"], - "Original table column order": ["原始表列顺序"], - "Copy SELECT statement to the clipboard": ["将 SELECT 语句复制到剪贴板"], - "Show CREATE VIEW statement": ["显示 CREATE VIEW 语句"], - "CREATE VIEW statement": ["CREATE VIEW 语句"], - "Remove table preview": ["删除表格预览"], - "Assign a set of parameters as": ["将一组参数指定为"], - "below (example:": ["以下(例如:"], - "), and they become available in your SQL (example:": [ - "),通过使用(例如:" + "Event Flow": ["事件流"], + "Event Names": ["事件名称"], + "Event definition": ["事件定义"], + "Event flow": ["事件流"], + "Event time column": ["事件时间列"], + "Every": ["每个"], + "Evolution": ["演化"], + "Exact": ["精确"], + "Example": ["例子"], + "Example %(tableName)s will appear here": [ + "示例 %(tableName)s 将出现在此处" ], - ") by using": [") 让它在SQL中可用"], - "Edit template parameters": ["编辑模板参数"], - "Invalid JSON": ["无效的JSON"], - "Create a new chart": ["创建新图表"], - "Choose a dataset": ["选择数据源"], - "If the dataset you are looking for is not available in the list, follow the instructions on how to add it in the Superset tutorial.": [ - "如果您正在寻找的数据源在列表中不可用,请按照说明进行添加" + "Examples": ["示例"], + "Excel File": ["Excel文件"], + "Excel file \"%(excel_filename)s\" uploaded to table \"%(table_name)s\" in database \"%(db_name)s\"": [ + "Excel 文件 \"%(excel_filename)s\" 上传到数据库 \"%(db_name)s\" 中的表 \"%(table_name)s\"" ], - "Choose a visualization type": ["选择可视化类型"], - "Create new chart": ["创建新图表"], - "An error occurred while loading the SQL": ["创建数据源时发生错误"], - "Updating chart was stopped": ["更新图表已停止"], - "An error occurred while rendering the visualization: %s": [ - "渲染可视化时发生错误:%s" + "Excel to Database configuration": ["Excel 到数据库配置"], + "Exclude selected values": ["排除选定的值"], + "Executed SQL": ["已执行的SQL"], + "Executed query": ["已执行查询"], + "Execution ID": ["任务ID"], + "Execution log": ["操作日志"], + "Exit fullscreen": ["退出全屏"], + "Expand all": ["全部展开"], + "Expand table preview": ["展开表格预览"], + "Expand tool bar": ["展开工具栏"], + "Experimental": ["实验"], + "Explore": ["探索"], + "Explore - %(table)s": ["查看 - %(table)s"], + "Explore in Superset": ["探索"], + "Explore the result set in the data exploration view": [ + "在数据探索视图中探索结果集" ], - "Network error.": ["网络异常。"], - "every": ["任意"], - "every month": ["每个月"], - "every day of the month": ["每月的每一天"], - "day of the month": ["一个月中的天数"], - "every day of the week": ["一周的每一天"], - "day of the week": ["一周的天数"], - "every hour": ["每小时"], - "every minute UTC": ["每分钟 UTC"], - "year": ["年"], - "month": ["月"], - "week": ["周"], - "day": ["天"], - "hour": ["小时"], - "minute": ["分"], - "reboot": ["重启"], - "Every": ["每"], - "in": [""], - "on": [""], - "and": [""], - "at": [""], - ":": [""], - "minute(s) UTC": ["分钟 UTC"], - "Invalid cron expression": ["cron表达式无效"], - "Clear": ["清除"], - "Sunday": ["星期日"], - "Monday": ["星期一"], - "Tuesday": ["星期二"], - "Wednesday": ["星期三"], - "Thursday": ["星期四"], - "Friday": ["星期五"], - "Saturday": ["星期六"], - "January": ["一月"], - "February": ["二月"], - "March": ["三月"], - "April": ["四月"], - "May": ["五月"], - "June": ["六月"], - "July": ["七月"], - "August": ["八月"], - "September": ["九月"], - "October": ["十月"], - "November": ["十一月"], - "December": ["十二月"], - "SUN": ["星期日"], - "MON": ["星期一"], - "TUE": ["星期二"], - "WED": ["星期三"], - "THU": ["星期四"], + "Export": ["导出"], + "Export CSV": ["导出 CSV"], + "Export dashboards?": ["导出看板?"], + "Export full CSV": ["导出全量CSV"], + "Export query": ["导出查询"], + "Export to .CSV format": ["导出为CSV格式"], + "Export to .JSON format": ["导出为JSON格式"], + "Export to YAML": ["导出到YAML格式"], + "Export to YAML?": ["导出到YAML?"], + "Expose database in SQL Lab": ["在SQL工具箱中展示数据库"], + "Expose in SQL Lab": ["在 SQL 工具箱中公开"], + "Expose this DB in SQL Lab": ["在 SQL 工具箱中公开这个数据库"], + "Expression": ["表达式"], + "Extra": ["扩展"], + "Extra Controls": ["额外控件"], + "Extra Parameters": ["额外参数"], + "Extra data to specify table metadata. Currently supports metadata of the format: `{ \"certification\": { \"certified_by\": \"Data Platform Team\", \"details\": \"This table is the source of truth.\" }, \"warning_markdown\": \"This is a warning.\" }`.": [ + "指定表元数据的额外内容。目前支持的认证数据格式为:`{ \"certification\": { \"certified_by\": \"Data Platform Team\", \"details\": \"This table is the source of truth.\" } }`." + ], + "Extra field cannot be decoded by JSON. %(msg)s": [ + "JSON无法解码额外字段。%(msg)s" + ], + "Extra parameters for use in jinja templated queries": [ + "用于jinja模板化查询的额外参数" + ], + "Extra parameters that any plugins can choose to set for use in Jinja templated queries": [ + "用于jinja模板化查询的额外参数" + ], + "Extra url parameters for use in Jinja templated queries": [ + "用于jinja模板化查询的额外url" + ], + "FEB": ["二月"], "FRI": ["星期五"], - "SAT": ["星期六"], + "Factor": ["因素"], + "Fail": ["失败"], + "Failed": ["失败"], + "Failed at retrieving results": ["检索结果失败"], + "Failed at stopping query. %s": ["停止查询失败。 %s"], + "Failed to start remote query on a worker.": ["无法启动远程查询"], + "Failed to verify select options: %s": ["验证选择选项失败:%s"], + "Favorite": ["收藏"], + "Favorites": ["收藏"], + "February": ["二月"], + "Fetch Values From": ["取值谓词"], + "Fetch Values Predicate": ["取值谓词"], + "Fetch data preview": ["获取数据预览"], + "Fetched %s": ["刷新于 %s"], + "Field cannot be decoded by JSON. %(json_error)s": [ + "字段不能由JSON解码。%{json_error}s" + ], + "Field cannot be decoded by JSON. %(msg)s": [ + "字段不能由JSON解码。%(msg)s" + ], + "Field is required": ["字段是必需的"], + "File": ["文件"], + "Fill all required fields to enable \"Default Value\"": [ + "填写所有必填字段以启用默认值" + ], + "Fill method": ["填充方式"], + "Filter": ["过滤器"], + "Filter List": ["过滤"], + "Filter Type": ["过滤类型"], + "Filter box": ["过滤器"], + "Filter by database": ["过滤数据库"], + "Filter by status": ["过滤状态"], + "Filter by user": ["过滤用户"], + "Filter configuration": ["过滤配置"], + "Filter configuration for the filter box": ["过滤条件的过滤配置"], + "Filter has default value": ["过滤器默认值"], + "Filter is hierarchical": ["分层过滤"], + "Filter metadata changed in dashboard. It will not be applied.": [ + "仪表盘的过滤器已被更改,将不会被应用" + ], + "Filter name": ["过滤值"], + "Filter results": ["过滤结果"], + "Filter set already exists": ["过滤器已存在"], + "Filter set with this name already exists": ["过滤器已存在"], + "Filter sets (%(filterSetCount)d)": ["过滤器个数(%(filterSetCount)d)"], + "Filter type": ["过滤类型"], + "Filter value (case sensitive)": ["过滤值(区分大小写)"], + "Filter value list cannot be empty": ["不能为空"], + "Filter your charts": ["过滤您的图表"], + "Filterable": ["可过滤"], + "Filters": ["过滤"], + "Filters (%d)": ["过滤 (%d)"], + "Filters by columns": ["按列过滤"], + "Filters by metrics": ["按指标过滤"], + "Filters configuration": ["过滤配置"], + "Filters configuration and scoping": ["过滤配置和作用域"], + "Filters out of scope (%d)": ["筛选器超出范围(%d)"], + "Filters with the same group key will be ORed together within the group, while different filter groups will be ANDed together. Undefined group keys are treated as unique groups, i.e. are not grouped together. For example, if a table has three filters, of which two are for departments Finance and Marketing (group key = 'department'), and one refers to the region Europe (group key = 'region'), the filter clause would apply the filter (department = 'Finance' OR department = 'Marketing') AND (region = 'Europe').": [ + "具有相同组key的过滤将在组中一起进行\"OR\"运算,而不同的过滤组将一起进行\"AND\"运算。未定义的组的key被视为唯一组,即不分组在一起。例如,如果表有三个过滤,其中两个用于财务部门和市场营销 (group key = 'department'),其中一个表示欧洲地区(group key = 'region'),filter子句将应用过滤 (department = 'Finance' OR department = 'Marketing') 和 (region = 'Europe')" + ], + "Finish": ["完成"], + "Fix the trend line to the full time range specified in case filtered results do not include the start or end dates": [ + "将趋势线固定为指定的完整时间范围,以防过滤的结果不包括开始日期或结束日期" + ], + "Fix to selected Time Range": ["固定到选定的时间范围"], + "Fixed": ["固定值"], + "Fixed Color": ["固定颜色"], + "Fixed color": ["固定颜色"], + "Flow": ["流图"], + "Font size": ["字体大小"], + "Font size for axis labels, detail value and other text elements": [ + "轴标签、详图值和其他文本元素的字体大小" + ], + "Font size for the biggest value in the list": ["列表中最大值的字体大小"], + "Font size for the smallest value in the list": [ + "列表中最小值的字体大小" + ], + "For Presto and Postgres, shows a button to compute cost before running a query.": [ + "对于Presto和Postgres,显示计算成本按钮(查询后)" + ], + "For regular filters, these are the roles this filter will be applied to. For base filters, these are the roles that the filter DOES NOT apply to, e.g. Admin if admin should see all data.": [ + "对于常规过滤,这些是此过滤将应用于的角色。对于基本过滤,这些是过滤不适用的角色,例如Admin代表admin应该查看所有数据。" + ], + "Force": ["强制"], + "Force all tables and views to be created in this schema when clicking CTAS or CVAS in SQL Lab.": [ + "在SQL工具箱中点击CTAS or CVAS强制创建所有数据表或视图" + ], + "Force refresh": ["强制刷新"], + "Force refresh schema list": ["强制刷新数据"], + "Force refresh table list": ["强制刷新数据"], + "Force-directed Graph": ["力导向图"], + "Forecast periods": ["预测期"], + "Formattable": ["格式表"], + "Formatted CSV attached in email": ["在邮件中附件CSV"], + "Found invalid orderby options": ["发现无效的orderby选项"], + "Fraction digits": ["分数位"], + "Frequency": ["频率"], + "Friction": ["摩擦"], + "Friction between nodes": ["节点之间的摩擦"], + "Friday": ["星期五"], + "From date cannot be larger than to date": ["起始时间不可以大于当前时间"], + "Funnel Chart": ["漏斗图"], + "Further customize how to display each column": [ + "进一步自定义如何显示每列" + ], + "Further customize how to display each metric": [ + "进一步定制如何显示每个指标" + ], + "Gauge Chart": ["仪表图"], + "General": ["一般"], + "Geo": ["地理位置"], + "Geohash": ["Geo哈希"], + "Get the last date by the date unit.": ["按日期单位获取最后的日期。"], + "Get the specify date for the holiday": ["获取指定节假日的日期"], + "Google Sheet Name and URL": ["Google Sheet名称和URL"], + "Grace period": ["宽限期"], + "Graph Chart": ["圆点图"], + "Graph layout": ["图表布局"], + "Gravity": ["重力"], + "Group By": ["分组"], + "Group By filter plugin": ["分组过滤插件"], + "Group By' and 'Columns' can't overlap": ["“Group by”列和字段不能重叠"], + "Group By, Metrics or Percentage Metrics must have a value": [ + "分组、指标或百分比指标必须具有值" + ], + "Group by": ["分组"], + "Groupable": ["可分组"], + "Hard value bounds applied for color coding. Is only relevant and applied when the normalization is applied against the whole heatmap.": [ + "应用于颜色编码的硬值边界。只有当对整个热图应用标准化时才是相关的和应用的。" + ], + "Header": ["标题行"], + "Header Row": ["标题行"], + "Heatmap": ["热力图"], + "Heatmap Options": ["热图选项"], + "Height": ["高度"], + "Hide layer": ["隐藏Layer"], + "Hide tool bar": ["隐藏工具栏"], + "Hierarchy": ["层次"], + "Histogram": ["直方图"], + "Home": ["主页"], + "Horizon Chart": ["地平线图"], + "Horizon Charts": ["水平图"], + "Horizontal alignment": ["水平对齐"], + "Host": ["主机"], + "Hostname or IP address": ["主机名或IP"], + "Hour": ["小时"], + "Hours %s": ["%s小时"], + "Hours offset": ["小时偏移"], + "How do you want to enter service account credentials?": [ + "您希望如何输入服务帐户凭据?" + ], + "How long to keep the logs around for this alert": [ + "这个警报的日志要保存多久" + ], + "How many periods into the future do we want to predict": [ + "想要预测未来的多少个时期" + ], + "How to display time shifts: as individual lines; as the difference between the main time series and each time shift; as the percentage change; or as the ratio between series and time shifts.": [ + "如何显示时间偏移:作为单独的行显示;作为主时间序列与每次时间偏移之间的绝对差显示;作为百分比变化显示;或作为序列与时间偏移之间的比率显示。" + ], + "Huge": ["巨大"], + "ISO 3166-2 Codes": ["ISO 3166-2 代码"], + "ISO 8601": ["ISO 8601"], + "Id": ["Id"], + "Id of root node of the tree.": ["树的根节点的ID。"], + "If Presto or Trino, all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them. If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.": [ + "如果使用Presto,SQL 工具箱中的所有查询都将被当前登录的用户执行,并且这些用户必须拥有运行它们的权限。如果启用 Hive 和 hive.server2.enable.doAs,将作为服务帐户运行查询,但会根据 hive.server2.proxy.user 的属性伪装当前登录用户。" + ], + "If Presto, all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them.<br/>If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.": [ + "如果使用Presto,SQL 工具箱中的所有查询都将被当前登录的用户执行,并且这些用户必须拥有运行它们的权限。<br/>如果启用 Hive 和hive.server2.enable.doAs,将作为服务帐户运行查询,但会根据hive.server2.proxy.user的属性伪装当前登录用户。" + ], + "If a metric is specified, sorting will be done based on the metric value": [ + "如果指定了度量,则将根据该度量值进行排序" + ], + "If activated you can use the ": ["如果激活,您可以使用 "], + "If selected, please set the schemas allowed for csv upload in Extra.": [ + "如果选择,请额外设置csv上传允许的模式。" + ], + "If selected, please set the schemas allowed for data upload in Extra.": [ + "如果选中,请额外设置允许数据上传的schema。" + ], + "If table exists do one of the following: Fail (do nothing), Replace (drop and recreate table) or Append (insert data).": [ + "如果表已存在,执行其中一个:舍弃(什么都不做),替换(删除表并重建),或者追加(插入数据)" + ], + "If you wish to specify a different target column than the original column, it can be entered here": [ + "如果要指定与原始列不同的目标列,可以在此处输入" + ], + "Ignore time": ["忽略时间"], + "Image (PNG) embedded in email": ["使用邮箱发送图片(PNG)"], + "Image download failed, please refresh and try again.": [ + "图片发送失败,请刷新或重试" + ], + "Impersonate logged in user (Presto, Trino, Drill, Hive, and GSheets)": [ + "模拟登录用户 (Presto, Trino, Drill & Hive)" + ], + "Impersonate the logged on user": ["模拟登录用户"], + "Import": ["导入"], + "Import %s": ["导入 %s"], + "Import Dashboard(s)": ["导入看板"], + "Import Dashboards": ["导入看板"], + "Import a table definition": ["导入一个已定义的表"], + "Import chart failed for an unknown reason": ["导入图表失败,原因未知"], + "Import charts": ["导入图表"], + "Import dashboard failed for an unknown reason": [ + "因为未知原因导入看板失败" + ], + "Import dashboards": ["导入看板"], + "Import database failed for an unknown reason": [ + "导入数据库失败,原因未知" + ], + "Import databases": ["导入数据集"], + "Import dataset failed for an unknown reason": [ + "因为未知的原因导入数据集失败" + ], + "Import datasets": ["导入数据集"], + "Import queries": ["导入查询"], + "Import saved query failed for an unknown reason.": [ + "由于未知原因,导入保存的查询失败。" + ], + "Important! Select this if the table is not already sorted by entity id, else there is no guarantee that all events for each entity are returned.": [ + "很重要!如果表尚未按实体ID排序,则选择此项,否则无法保证返回每个实体的所有事件。" + ], + "Include Series": ["包含系列"], + "Include series name as an axis": ["包括系列名称作为轴"], + "Include time": ["包含时间"], + "Incompatible Filters (%d)": ["不兼容的条件 (%d)"], + "Incorrect Fields": ["不正确的字段"], + "Index Column": ["索引字段"], + "Infer Datetime Format": ["日期时间格式"], + "Info": ["信息"], + "Inner Radius": ["内半径"], + "Inner radius of donut hole": ["圆环圈内部空洞的内径"], + "Input field supports custom rotation. e.g. 30 for 30°": [ + "输入字段支持自定义。例如,30代表30°" + ], + "Instant filtering": ["即时过滤"], + "Instructions to add a dataset are available in the Superset tutorial.": [ + "有关添加数据集的说明,请参阅教程。" + ], + "Intensity": ["强度"], + "Interval End column": ["间隔结束列"], + "Interval bounds": ["区间间隔"], + "Interval colors": ["间隔颜色"], + "Interval start column": ["间隔开始列"], + "Intervals": ["间隔"], + "Invalid JSON": ["无效的JSON"], + "Invalid Port Number": ["无效端口号"], + "Invalid account information": ["无效账户信息"], + "Invalid certificate": ["无效认证"], + "Invalid connection string, a valid string usually follows:\n'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'": [ + "连接字符串无效,有效字符串的格式通常如下:\n'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'" + ], + "Invalid connection string, a valid string usually follows: driver://user:password@database-host/database-name": [ + "连接字符串无效,有效字符串通常如下:driver://user:password@database-host/database-name" + ], + "Invalid connection string, a valid string usually follows:'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'<p>Example:'postgresql://user:password@your-postgres-db/database'</p>": [ + "连接字符串无效,有效字符串格式通常如下:'DRIVER://USER:PASSWORD@DB-HOST/DATABASE-NAME'<p>例如:'postgresql://user:password@your-postgres-db/database'</p>" + ], + "Invalid cron expression": ["无效cron表达式"], + "Invalid cumulative operator: %(operator)s": [ + "累积运算符无效:%(operator)s" + ], + "Invalid date/timestamp format": ["无效的日期/时间戳格式"], + "Invalid filter configuration, please select a column": [ + "过滤器配置无效,请选择一个列" + ], + "Invalid filter operation type: %(op)s": ["选择框的操作类型无效: %(op)s"], + "Invalid geodetic string": ["无效的 geodetic 字符串"], + "Invalid geohash string": ["无效的geohash字符串"], + "Invalid lat/long configuration.": ["错误的经纬度配置。"], + "Invalid longitude/latitude": ["无效的经度/纬度"], + "Invalid metric object": ["无效的指标对象"], + "Invalid numpy function: %(operator)s": ["无效的numpy函数:%(operator)s"], + "Invalid options for %(rolling_type)s: %(options)s": [ + "%(rolling_type)s 的选项无效:%(options)s" + ], + "Invalid result type: %(result_type)s": [ + "无效的结果类型:%(result_type)s" + ], + "Invalid rolling_type: %(type)s": ["无效的滚动类型:%(type)s"], + "Invalid spatial point encountered: %s": ["遇到无效的空间点:%s"], + "Inverse selection": ["反选"], + "Is Hidden": ["隐藏"], + "Is certified": ["已认证"], + "Is dimension": ["维度"], + "Is favorite": ["收藏"], + "Is filterable": ["可被过滤"], + "Is temporal": ["时间条件"], + "Issue 1000 - The dataset is too large to query.": [ + "Issue 1000 - 数据集太大,无法进行查询。" + ], + "Issue 1001 - The database is under an unusual load.": [ + "Issue 1001 - 数据库负载异常。" + ], + "It seems you don't have access to any database": [ + "貌似您没有访问到任何数据库" + ], + "It’s not recommended to truncate y-axis in Bar chart.": [ + "不建议截断柱状图中的y轴。" + ], "JAN": ["一月"], - "FEB": ["二月"], - "MAR": ["三月"], - "APR": ["四月"], - "MAY": ["五月"], - "JUN": ["六月"], + "JSON": ["JSON"], + "JSON Metadata": ["JSON 元数据"], + "JSON metadata": ["JSON 元数据"], + "JSON string containing additional connection configuration. This is used to provide connection information for systems like Hive, Presto and BigQuery which do not conform to the username:password syntax normally used by SQLAlchemy.": [ + "包含附加连接配置的JSON字符串。它用于为配置单元、Presto和BigQuery等系统提供连接信息,这些系统不符合SQLAlChemy通常使用的用户名:密码语法。" + ], "JUL": ["七月"], - "AUG": ["八月"], - "SEP": ["九月"], - "OCT": ["十月"], - "NOV": ["十一月"], - "DEC": ["十二月"], - "OK": ["确认"], - "Click to see difference": ["点击查看差异"], - "Altered": ["已更改"], - "Chart changes": ["图表变化"], - "Superset chart": ["选择图表"], - "Check out this chart in dashboard:": ["查看这个看板:%s"], + "JUN": ["六月"], + "January": ["一月"], + "Json list of the column names that should be read. If not None, only these columns will be read from the file.": [ + "Json应读取的列名列表。如果不是“无”,则仅从文件中读取这些列" + ], + "Json list of the values that should be treated as null. Examples: [\"\"], [\"None\", \"N/A\"], [\"nan\", \"null\"]. Warning: Hive database supports only single value. Use [\"\"] for empty string.": [ + "应视为null的值的Json列表。例如:[\"\"], [\"None\", \"N/A\"], [\"nan\", \"null\"]。警告:Hive数据库仅支持单个值。用 [\"\"] 代表空字符串。" + ], + "July": ["七月"], + "June": ["六月"], + "KPI": ["指标"], + "Keep editing": ["继续编辑"], + "Keys for table": ["表的键"], + "Label": ["标签"], + "Label Line": ["标签线"], + "Label Type": ["标签类型"], + "Label for your query": ["为您的查询设置标签"], + "Label position": ["标签位置"], + "Label threshold": ["标签阈值"], + "Labelling": ["标签"], + "Labels": ["标签"], + "Labels for the marker lines": ["标记线的标签"], + "Labels for the markers": ["标记的标签"], + "Labels for the ranges": ["范围的标签"], + "Large": ["大"], + "Last": ["上一"], + "Last Changed": ["更新时间"], + "Last Modified": ["最后修改"], + "Last Updated %s": ["上次更新 %s"], + "Last available value seen on %s": [" %s 最后一个可用值"], + "Last modified": ["最后修改"], + "Last modified by %s": ["上次修改人 %s"], + "Last run": ["上次执行"], + "Latitude": ["纬度"], + "Latitude of default viewport": ["默认视口纬度"], + "Layer": ["层"], + "Layer configuration": ["配置Layer"], + "Layout": ["布局"], + "Layout type of graph": ["图形的布局类型"], + "Layout type of tree": ["树的布局类型"], + "Leaf nodes that represent fewer than this number of events will be initially hidden in the visualization": [ + "表示少于此数量的事件的叶节点最初将隐藏在可视化中" + ], + "Least recently modified": ["最远修改"], + "Left": ["左边"], + "Left Axis Format": ["左轴格式化"], + "Left Axis Metric": ["左轴指标"], + "Left Axis chart(s)": ["左轴图表"], + "Left Margin": ["左边距"], + "Left margin, in pixels, allowing for more room for axis labels": [ + "左边距,以像素为单位,为轴标签留出更多空间" + ], + "Left to Right": ["从左到右"], + "Left value": ["左值"], + "Legacy": ["遗产"], + "Legend": ["图示"], + "Legend type": ["图示类型"], + "Lift percent precision": ["提升百分比精度"], + "Light mode": ["光模式"], + "Limit reached": ["达到限制"], + "Limit selector values": ["限制选择器值"], + "Limiting rows may result in incomplete data and misleading charts. Consider filtering or grouping source/target names instead.": [ + "限制行数可能导致不完整的数据和误导性的图表。可以考虑过滤或分组源/目标名称。" + ], + "Limits the number of rows that get displayed.": ["限制显示的行数。"], + "Limits the number of series that get displayed. A joined subquery (or an extra phase where subqueries are not supported) is applied to limit the number of series that get fetched and rendered. This feature is useful when grouping by high cardinality column(s) though does increase the query complexity and cost.": [ + "限制显示的系列数。应用联接的子查询(或不支持子查询的额外阶段)来限制获取和呈现的序列数量。此功能在按高基数列分组时很有用,但会增加查询的复杂性和成本。" + ], + "Line": ["行"], + "Line Chart": ["多线图"], + "Line Style": ["线条样式"], + "Line interpolation as defined by d3.js": ["由 d3.js 定义的线插值"], + "Line width": ["线宽"], + "Linear Color Scheme": ["线性颜色方案"], + "Linear color scheme": ["线性颜色方案"], + "Link Copied!": ["链接成功!"], + "Link Length": ["连接长度"], + "Link length in the force layout": ["在力布局中的连接长度"], + "List Observations": ["观察结果列表"], + "List Saved Query": ["保存的查询列表"], + "List of values to mark with lines": ["要用行标记的值列表"], + "List of values to mark with triangles": ["要用三角形标记的值列表"], + "Live CSS editor": ["即时 CSS 编辑器"], + "Live render": ["实时渲染"], + "Load a CSS template": ["加载一个 CSS 模板"], + "Loaded data cached": ["数据缓存已加载"], + "Loaded from cache": ["从缓存中加载"], + "Loading...": ["加载中..."], + "Log Retentions (days)": ["日志保留(天)"], + "Log Scale": ["日志规模"], + "Log retention": ["日志保留"], + "Logarithmic scale on primary y-axis": ["对数刻度在主y轴上"], + "Logarithmic scale on secondary y-axis": ["二次y轴上的对数刻度"], + "Logarithmic y-axis": ["对数轴"], + "Login": ["登录"], + "Logout": ["退出"], + "Logs": ["日志"], + "Longitude": ["经度"], + "Longitude & Latitude columns": ["经纬度字段"], + "Longitude of default viewport": ["默认视口经度"], + "MAR": ["三月"], + "MAY": ["五月"], + "MON": ["星期一"], + "Main Datetime Column": ["主日期列"], + "Malformed request. slice_id or table_name and db_name arguments are expected": [ + "格式错误的请求。需要使用 slice_id 或 table_name 和 db_name 参数" + ], + "Manage": ["管理"], + "Manage Email Reports for Charts": ["管理图表的电子邮件报告"], + "Manage Email Reports for Dashboards": ["管理看板的电子邮件报告"], + "Mandatory": ["必填参数"], + "Mangle Duplicate Columns": ["混合重复列"], + "Map": ["地图"], + "Map Style": ["地图样式"], + "MapBox": ["MapBox地图"], + "Mapbox": ["箱图"], + "March": ["三月"], + "Margin": ["边距(margin)"], + "Marker": ["标记"], + "Marker Size": ["标记大小"], + "Marker labels": ["标记标签"], + "Marker line labels": ["标记线标签"], + "Marker lines": ["标记线"], + "Marker size": ["标记大小"], + "Markers": ["标记"], + "Markup type": ["Markup 类型"], + "Max": ["最大值"], + "Max Bubble Size": ["最大气泡的尺寸"], + "Max Events": ["最大事件数"], + "Maximize chart": ["最大化图表"], + "Maximum": ["最大"], + "Maximum Font Size": ["最大字体大小"], + "Maximum value on the gauge axis": ["量规轴上的最大值"], + "May": ["五月"], + "Mean of values over specified period": ["特定时期内的平均值"], + "Median edge width, the thickest edge will be 4 times thicker than the thinnest.": [ + "边缘宽度中间值,最厚的边缘将比最薄的边缘厚4倍" + ], + "Median node size, the largest node will be 4 times larger than the smallest": [ + "节点大小中位数,最大的节点将比最小的节点大4倍" + ], + "Medium": ["中"], + "Message Content": ["消息内容"], + "Message content": ["消息内容"], + "Metadata": ["元数据"], + "Metadata Last Refreshed": ["上次刷新的元数据"], + "Metadata Parameters": ["元数据参数"], + "Metadata has been synced": ["元数据已同步"], + "Metadata refreshed for the following table(s): %(tables)s": [ + "为下表刷新元数据:%(tables)s" + ], + "Method": ["方法"], + "Metric": ["指标"], + "Metric '%(metric)s' does not exist": ["指标 '%(metric)s' 不存在"], + "Metric ascending": ["指标升序"], + "Metric assigned to the [X] axis": ["分配给 [X] 轴的指标"], + "Metric assigned to the [Y] axis": ["分配给 [Y] 轴的指标"], + "Metric change in value from `since` to `until`": [ + "从 `since` 到 `until` 的度量值变化" + ], + "Metric descending": ["指标降序"], + "Metric factor change from `since` to `until`": [ + "度量因子从 `since` 到 `until` 的变化" + ], + "Metric for Color": ["颜色指标"], + "Metric for node values": ["节点值的度量"], + "Metric name [%s] is duplicated": ["指标名称 [%s] 重复"], + "Metric percent change in value from `since` to `until`": [ + "从 `since` 到 `until` 的价值变化百分比" + ], + "Metric that defines the color of the country": ["定义国家度量的颜色"], + "Metric that defines the size of the bubble": ["定义指标的气泡大小"], + "Metric to display bottom title": ["显示底部标题的度量值"], + "Metric to sort the results by": ["按照指标的结果进行排序"], + "Metric used to calculate bubble size": ["用来计算气泡大小的公制"], + "Metric used to define how the top series are sorted if a series or row limit is present. If undefined reverts to the first metric (where appropriate).": [ + "如果存在序列或行限制,则用于定义顶部序列的排序方式的度量。如果未定义,则返回第一个度量(如果适用)。" + ], + "Metric(s) {} must be aggregations.": ["度量(s) {} 必须是聚合。"], + "Metrics": ["指标"], + "Metrics for which percentage of total are to be displayed. Calculated from only data within the row limit.": [ + "要显示其占总数百分比的指标。只计算行限制内的只读存储器数据。" + ], + "Midnight": ["凌晨(当天)"], + "Min": ["最小值"], + "Min Periods": ["最小周期"], + "Min Width": ["最小宽度"], + "Min periods": ["最小周期"], + "Mine": ["我的编辑"], + "Minimize chart": ["最小化图表"], + "Minimum": ["最小"], + "Minimum Font Size": ["最小字体大小"], + "Minimum leaf node event count": ["节点最小事件数"], + "Minimum threshold in percentage points for showing labels.": [ + "标签显示百分比最小阈值" + ], + "Minimum value for label to be displayed on graph.": [ + "在图形上显示标签的最小值。" + ], + "Minimum value on the gauge axis": ["量规轴上的最小值"], + "Minor Split Line": ["小的分模线"], + "Minute": ["分钟"], + "Minutes %s": ["%s分钟"], + "Missing Required Fields": ["缺少必填字段"], + "Missing dataset": ["丢失数据集"], + "Mixed Time-Series": ["混和时间序列"], + "Modified": ["已修改"], + "Modified %s": ["最后修改 %s"], + "Modified by": ["修改人"], + "Modified columns: %s": ["修改的列:%s"], + "Monday": ["星期一"], + "Month": ["月"], + "Months %s": ["%s月"], + "More dataset related options": ["更多数据集相关选项"], + "Move only": ["移动"], + "Moves the given set of dates by a specified interval.": [ + "将给定的日期集以指定的间隔进行移动" + ], + "Multi-Dimensions": ["多维度"], + "Multi-Layers": ["多层"], + "Multi-Levels": ["多层次"], + "Multi-Variables": ["多元"], + "Multiple": ["多方"], + "Multiple Line Charts": ["复合折线图"], + "Multiple file extensions are not allowed for columnar uploads. Please make sure all files are of the same extension.": [ + "柱状上传不允许使用多个文件扩展名请确保所有文件的扩展名相同。" + ], + "Multiple formats accepted, look the geopy.points Python library for more details": [ + "接受多种格式,查看geopy.points库以获取更多细节" + ], + "Multiple select": ["多选"], + "Multiple selections allowed, otherwise filter is limited to a single value": [ + "允许多选下拉框,不勾选的话过滤器就是单选下拉框" + ], + "Must be unique": ["需要唯一"], + "Must have a [Group By] column to have 'count' as the [Label]": [ + "[Group By] 列必须要有 ‘count’字段作为 [标签]" + ], + "Must have at least one numeric column specified": [ + "必须至少指明一个数值列" + ], + "Must specify a value for filters with comparison operators": [ + "必须为带有比较操作符的过滤器指定一个值吗" + ], + "My column": ["我的列"], + "My metric": ["我的指标"], + "N/A": ["N/A"], + "NOV": ["十一月"], + "NOW": ["现在"], + "Name": ["名称"], + "Name is required": ["需要名称"], + "Name must be unique": ["名称必须是唯一的"], + "Name of table to be created from columnar data.": [ + "从列存储数据创建的表的名称。" + ], + "Name of table to be created from csv data.": [ + "从CSV数据将创建的表的名称。" + ], + "Name of table to be created from excel data.": [ + "从excel数据将创建的表的名称。" + ], + "Name of the column containing the id of the parent node": [ + "包含父节点id的列的名称" + ], + "Name of the id column": ["ID列名称"], + "Name of the source nodes": ["源节点名称"], + "Name of the table that exists in the source database": [ + "源数据库中存在的表名称" + ], + "Name of the target nodes": ["目标节点名称"], + "Name your database": ["您的数据集"], + "Network error.": ["网络异常。"], + "New": ["新增"], + "New Email Report": ["新的电子邮件报告"], + "New chart": ["新增图表"], + "New columns added: %s": ["新增的列:%s"], + "New filter set": ["新的过滤器"], + "New tab": ["关闭标签"], + "New tab (Ctrl + q)": ["新建Tab页 (Ctrl + q)"], + "New tab (Ctrl + t)": ["新建Tab页 (Ctrl + t)"], + "Next": ["之后"], + "Nightingale Rose Chart": ["南丁格尔玫瑰图"], + "No": ["否"], + "No %(tableName)s yet": ["还没有 %(tableName)s"], + "No %s yet": ["还没有 %s"], + "No Access!": ["不能访问!"], + "No Data": ["没有数据"], + "No Results": ["无结果"], + "No annotation layers yet": ["没有注释层"], + "No annotation yet": ["没有注释"], + "No charts": ["没有图表"], + "No columns": ["没有列"], + "No compatible columns found": ["找不到兼容的列"], + "No dashboards": ["没有看板"], + "No data": ["没有数据"], + "No data after filtering or data is NULL for the latest time record": [ + "过滤后没有数据,或者最新时间记录的数据为NULL" + ], + "No data in file": ["文件中无数据"], + "No description available.": ["没有可用的描述"], + "No favorite charts yet, go click on stars!": [ + "暂无收藏的图表,去点击星星吧!" + ], + "No favorite dashboards yet, go click on stars!": [ + "暂无收藏的看板,去点击星星吧!" + ], + "No filter": ["无筛选"], + "No filter is selected.": ["未选择过滤条件。"], + "No of Bins": ["直方图容器数"], + "No query history yet...": ["暂无历史查询..."], + "No records found": ["没有找到任何记录"], + "No results found": ["未找到结果"], + "No results were returned for this query. If you expected results to be returned, ensure any filters are configured properly and the datasource contains data for the selected time range.": [ + "此查询没有返回任何结果。如果希望返回结果,请确保所有过滤选择的配置正确,并且数据源包含所选时间范围的数据。" + ], + "No stored results found, you need to re-run your query": [ + "找不到存储的结果,需要重新运行查询" + ], + "No such column found. To filter on a metric, try the Custom SQL tab.": [ + "没有发现这样的列。若要在度量值上筛选,请尝试自定义SQL选项卡。" + ], + "No time columns": ["没有时间列"], + "Node label position": ["节点标签位置"], + "Node select mode": ["节点选择模式"], + "Node size": ["节点大小"], + "None": ["空"], + "None -> Arrow": ["无-> 箭头"], + "None -> None": ["无->无"], + "Normal": ["正常"], + "Normalize Across": ["标准化通过"], + "Normalized": ["标准化"], + "Not Time Series": ["美誉时间序列"], + "Not null": ["非空"], + "Not triggered": ["没有触发"], + "Not up to date": ["不是最新的"], + "Nothing triggered": ["无触发"], + "Notification method": ["通知方式"], + "November": ["十一月"], + "Now": ["现在"], + "Null or Empty": ["Null或空"], + "Null values": ["空值"], + "Number Format": ["数字格式"], + "Number format": ["数字格式化"], + "Number of decimal digits to round numbers to": [ + "要四舍五入的十进制位数" + ], + "Number of decimal places with which to display lift values": [ + "用于显示升力值的小数位数" + ], + "Number of decimal places with which to display p-values": [ + "用于显示p值的小数位数" + ], + "Number of rows of file to read.": ["要读取的文件行数。"], + "Number of rows to skip at start of file.": ["在文件开始时跳过的行数。"], + "Number of split segments on the axis": ["轴上分割段的数目"], + "Number of steps to take between ticks when displaying the X scale": [ + "显示 X 刻度时,在刻度之间表示的步骤数" + ], + "Number of steps to take between ticks when displaying the Y scale": [ + "显示 Y 刻度时,在刻度之间表示的步骤数" + ], + "Numerical range": ["数值范围"], + "OCT": ["十月"], + "OK": ["确认"], + "OVERWRITE": ["覆盖"], + "October": ["十月"], + "Offline": ["离线"], + "Offset": ["偏移"], + "On Grace": ["在宽限期内"], + "Once an alert is triggered, how long, in seconds, before Superset nags you again.": [ + "在Superset再次提醒您之前需要多长时间--以秒为单位--来触发一个警报" + ], + "One or many columns to group by. High cardinality groupings should include a series limit to limit the number of fetched and rendered series.": [ + "要分组的一列或多列。高基数分组应包括序列限制,以限制提取和呈现的序列数。" + ], + "One or many columns to group by. High cardinality groupings should include a sort by metric and series limit to limit the number of fetched and rendered series.": [ + "要分组的一列或多列。高基数分组应包括按度量排序和序列限制,以限制提取和呈现的序列数。" + ], + "One or many columns to pivot as columns": [ + "需要作为列属性进行透视的一列或多列" + ], + "One or many controls to group by. If grouping, latitude and longitude columns must be present.": [ + "使用一个或多个控件来分组。一旦分组,则纬度和经度列必须存在。" + ], + "One or many controls to pivot as columns": ["一个或多个控件作为主列"], + "One or many metrics to display": ["一个或多个指标显示"], + "One or more columns already exist": ["一个或多个列已存在"], + "One or more columns are duplicated": ["一个或多个列被复制"], + "One or more columns do not exist": ["一个或多个字段不存在"], + "One or more metrics already exist": ["一个或多个度量已存在"], + "One or more metrics are duplicated": ["一个或多个指标重复"], + "One or more metrics do not exist": ["一个或多个指标不存在"], + "One or more parameters needed to configure a database are missing.": [ + "数据库配置缺少所需的一个或多个参数。" + ], + "One or more parameters specified in the query are malformatted.": [ + "查询中指定的一个或多个参数的格式不正确。" + ], + "One or more parameters specified in the query are missing.": [ + "查询中指定的一个或多个参数丢失。" + ], + "One or more required fields are missing in the request. Please try again, and if the problem persists conctact your administrator.": [ + "请求中缺少一个或多个必填字段。请重试,如果问题仍然存在,请与管理员联系。" + ], + "One ore more annotation layers failed loading.": [ + "一个或多个注释层加载失败。" + ], + "Only SELECT statements are allowed against this database.": [ + "此数据库只允许使用 `SELECT` 语句" + ], + "Only Total": ["仅总计"], + "Only `SELECT` statements are allowed": ["将 SELECT 语句复制到剪贴板"], + "Only selected panels will be affected by this filter": [ + "只有选定的面板将受此过滤条件的影响" + ], + "Only show the total value on the stacked chart, and not show on the selected category": [ + "仅在堆积图上显示合计值,而不在所选类别上显示" + ], + "Only single queries supported": ["仅支持单个查询"], + "Only the following file extensions are allowed: %(allowed_extensions)s": [ + "仅允许以下文件扩展名:%(allowed_extensions)s" + ], + "Opacity": ["不透明度"], + "Opacity of Area Chart. Also applies to confidence band.": [ + "区域图的不透明度。也适用于置信带" + ], + "Opacity of all clusters, points, and labels. Between 0 and 1.": [ + "所有簇、点和标签的不透明度。在0到1之间。" + ], + "Opacity of area chart.": ["面积图的不透明度"], + "Open Datasource tab": ["打开数据源tab"], + "Open in SQL Lab": ["在 SQL 工具箱中打开"], + "Open query in SQL Lab": ["在 SQL 工具箱中打开查询"], + "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.": [ + "以异步模式操作数据库,这意味着查询是在远程工作人员上执行的,而不是在web服务器本身上执行的, 这假设您有一个Celery worker setup以及一个结果后端。有关更多信息,请参考安装文档。" + ], + "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.": [ + "以异步模式操作数据库,这意味着查询是在远程worker上执行的,而不是在web服务器本身上执行的, 这假设您有一个Celery worker setup以及一个执行后端。有关更多信息,请参考安装文档。" + ], + "Operator": ["运算符"], + "Operator undefined for aggregator: %(name)s": [ + "未定义聚合器的运算符:%(name)s" + ], + "Optional CA_BUNDLE contents to validate HTTPS requests. Only available on certain database engines.": [ + "用于验证HTTPS请求的可选 CA_BUNDLE 内容。仅在某些数据库引擎上可用。" + ], + "Optional name of the data column.": ["数据列的可选名称"], + "Optional time column if time range should apply to another column than the default time column": [ + "如果时间范围应应用于默认时间列以外的其他列,则可选时间列" + ], + "Optional warning about use of this metric": ["关于使用此指标的可选警告"], + "Options": ["设置"], + "Or choose from a list of other databases we support:": [ + "或者从我们支持的其他数据库列表中选择:" + ], + "Order by entity id": ["按实体ID排序"], + "Order results by selected columns": ["按选定列对结果进行排序"], + "Ordering": ["排序"], + "Orientation of tree": ["树的方向"], + "Origin": ["起点"], + "Original": ["起点"], + "Original table column order": ["原始表列顺序"], + "Original value": ["原始值"], + "Orthogonal": ["正交化"], + "Other": ["其他"], + "Outer Radius": ["外缘"], + "Outer edge of Pie chart": ["饼图外缘"], + "Overlap": ["重叠"], + "Overlay one or more timeseries from a relative time period. Expects relative time deltas in natural language (example: 24 hours, 7 days, 52 weeks, 365 days). Free text is supported.": [ + "从相对时间段覆盖一个或多个时间序列。期望自然语言中的相对时间增量(例如:24小时、7天、56周、365天)" + ], + "Overwrite": ["覆盖"], + "Overwrite & Explore": ["覆写和浏览"], + "Overwrite Dashboard [%s]": ["覆盖看板 [%s]"], + "Overwrite text in the editor with a query on this table": [ + "使用该表上的查询覆盖编辑器中的文本" + ], + "Owner": ["所有者"], + "Owners": ["所有者"], + "Owners are invalid": ["所有者无效"], + "Owners is a list of users who can alter the dashboard.": [ + "所有者是可以更改看板的用户列表。" + ], + "Owners is a list of users who can alter the dashboard. Searchable by name or username.": [ + "所有者是可以更改看板的用户列表。可按名称或用户名搜索。" + ], + "Page length": ["页长"], + "Paired t-test Table": ["配对T检测表"], + "Pandas resample method": ["Pandas 重新采样的填充方法"], + "Pandas resample rule": ["Pandas 重新采样的规则"], + "Parallel Coordinates": ["平行坐标"], + "Parameter error": ["参数错误"], + "Parameters": ["参数"], + "Parameters ": ["参数"], + "Parent": ["父类"], + "Parent filter": ["父级过滤"], + "Parent filter is required": ["需要父筛选器"], + "Parse Dates": ["解析日期"], + "Part of a Whole": ["占比"], + "Partition Chart": ["分区图"], + "Partition Diagram": ["分区图"], + "Partition Limit": ["分区限制"], + "Partition Threshold": ["分区阈值"], + "Partitions whose height to parent height proportions are below this value are pruned": [ + "高度与父高度的比例低于此值的分区将被修剪" + ], + "Password": ["密码"], + "Paste the shareable Google Sheet URL here": [ + "将可共享的Google Sheet URL粘贴到此处" + ], + "Pattern": ["规则"], + "Percent Change": ["百分比变化"], + "Percentage metrics": ["百分比指标"], + "Percentage threshold": ["百分比阈值"], + "Percentages": ["百分比"], + "Periods": ["周期"], + "Periods must be a positive integer value": ["句点必须是正整数值"], + "Person or group that has certified this chart.": [ + "对此图表进行认证的个人或团体。" + ], + "Person or group that has certified this dashboard.": [ + "已对此仪表板进行认证的个人或组。" + ], + "Person or group that has certified this metric": [ + "认证此指标的个人或团体" + ], + "Physical": ["物理信息"], + "Physical (table or view)": ["物理(表或视图)"], + "Physical dataset": ["物化数据集"], + "Pick a granularity in the Time section or uncheck 'Include Time'": [ + "在“时间”部分选择一个粒度,或取消选中“包含时间”" + ], + "Pick a metric for left axis!": ["为左轴选择一个指标!"], + "Pick a metric for right axis!": ["为右轴选择一个指标!"], + "Pick a metric for x, y and size": ["为 x 轴,y 轴和大小选择一个指标"], + "Pick a metric to display": ["选择一个指标来显示"], + "Pick a metric!": ["选择一个指标!"], + "Pick a name to help you identify this database.": [ + "选择一个名称来帮助您识别这个数据库。" + ], + "Pick a nickname for this database to display as in Superset.": [ + "为这个数据库选择一个昵称以在Superset中显示" + ], + "Pick a time granularity for your time series": [ + "为您的时间序列选择一个时间粒度" + ], + "Pick a title for you annotation.": ["为您的注释选择一个标题"], + "Pick at least one field for [Series]": ["为 [序列] 选择至少一个字段"], + "Pick at least one metric": ["选择至少一个指标"], + "Pick exactly 2 columns as [Source / Target]": [ + "为 [来源 / 目标] 选择两个列" + ], + "Pick one or more columns that should be shown in the annotation. If you don't select a column all of them will be shown.": [ + "选择注释中应该显示的一个或多个列如果您不选择一列,所有的选项都会显示出来。" + ], + "Pick your favorite markup language": ["选择您最爱的 Markup 语言"], + "Pie Chart": ["饼图"], + "Pie shape": ["饼图形状"], + "Pin": ["Pin"], + "Pivot Options": ["透视表选项"], + "Pivot Table": ["透视表"], + "Pivot Table v2": ["透视表 v2"], + "Pivot operation must include at least one aggregate": [ + "数据透视操作必须至少包含一个聚合" + ], + "Pivot operation requires at least one index": [ + "透视操作至少需要一个索引" + ], + "Pivoted": ["旋转"], + "Pixel height of each series": ["每个序列的像素高度"], + "Please apply filter changes": ["请应用滤镜更改"], + "Please check your query and confirm that all template parameters are surround by double braces, for example, \"{{ ds }}\". Then, try running your query again.": [ + "请检查查询并确认所有模板参数都用双大括号括起来,例如 \"{{ ds }}\"。然后,再次尝试运行查询" + ], + "Please check your query for syntax errors at or near \"%(syntax_error)s\". Then, try running your query again.": [ + "请检查查询中 \"%(syntax_error)s\" 处或附近的语法错误。然后,再次尝试运行查询。“" + ], + "Please check your query for syntax errors near \"%(server_error)s\". Then, try running your query again.": [ + "请检查查询中\"%(server_error)s\"附近的语法错误然后,再次尝试运行查询" + ], + "Please choose at least one 'Group by' field ": [ + "请至少选择一个分组字段 " + ], + "Please choose at least one metric": ["请至少选择一个指标"], + "Please choose different metrics on left and right axis": [ + "请在左右轴上选择不同的指标" + ], + "Please complete all required fields.": ["请填写所有必填项"], + "Please confirm": ["请确认"], + "Please enter a SQLAlchemy URI to test": ["请输入要测试的SQLAlchemy URI"], + "Please enter a chart name": ["请输入图表名称"], + "Please filter set name": ["请筛选集合名称"], + "Please make sure all fields are filled out correctly": [ + "请确保所有字段填写正确" + ], + "Please re-enter the password.": ["请重新输入密码。"], + "Please reach out to the Chart Owner for assistance.": [ + "请联系图表所有者寻求帮助。" + ], + "Please save the query to enable sharing": ["请保存查询以启用共享"], + "Please save your chart first, then try creating a new email report.": [ + "请先保存您的图表,然后尝试创建一个新的电子邮件报告。" + ], + "Please save your dashboard first, then try creating a new email report.": [ + "请先保存您的仪表盘,然后尝试创建一个新的电子邮件报告。" + ], + "Please select both a Dataset and a Chart type to proceed": [ + "请同时选择数据集和图表类型以继续" + ], + "Please use 3 different metric labels": ["请在左右轴上选择不同的指标"], + "Please verify that port is open to connect.": [ + "请检查端口是否打开以进行连接" + ], + "Plots the individual metrics for each row in the data vertically and links them together as a line. This chart is useful for comparing multiple metrics across all of the samples or rows in the data.": [ + "垂直地绘制数据中每一行的单个指标,并将它们链接成一行。此图表用于比较数据中所有样本或行中的多个指标。" + ], + "Plugins": ["插件"], + "Point Radius": ["点半径"], + "Point Radius Unit": ["点半径单位"], + "Points": ["点配置"], + "Points and clusters will update as the viewport is being changed": [ + "点和簇将随着视图改变而更新。" + ], + "Pop Tab Link": ["流行标签链接"], + "Popular": ["常用"], + "Populate \"Default value\" to enable this control": [ + "填充 \"Default value\" 以启用此控件" + ], + "Population age data": ["人口年龄数据"], + "Port %(port)s on hostname \"%(hostname)s\" refused the connection.": [ + "主机名 \"%(hostname)s\" 上的端口 %(port)s 拒绝连接。" + ], + "Port is closed": ["端口已关闭"], + "Position JSON": ["位置JSON"], + "Position of child node label on tree": ["子节点标签在树上的位置"], + "Position of column level subtotal": ["列级小计的位置"], + "Position of intermidiate node label on tree": [ + "中间节点标签在树中的位置" + ], + "Position of row level subtotal": ["行级小计的位置"], + "Powered by Apache Superset": ["由Apache Superset提供支持"], + "Pre-filter": ["预过滤"], + "Pre-filter available values": ["预滤器可用值"], + "Pre-filter is required": ["预过滤是必须的"], + "Predicate applied when fetching distinct value to populate the filter control component. Supports jinja template syntax. Applies only when `Enable Filter Select` is on.": [ + "当获取不同的值来填充过滤器组件应用时。支持jinja的模板语法。只在`启用过滤器选择`时应用。" + ], + "Predictive": ["预测"], + "Predictive Analytics": ["预测分析"], + "Prefix metric name with slice name": ["用图表名称作为指标名称的前缀"], + "Preview": ["预览"], + "Preview: `%s`": ["预览 %s"], + "Previous": ["之前"], + "Primary": ["主键"], + "Primary Metric": ["主计量指标"], + "Primary or secondary y-axis": ["主或次y轴"], + "Primary y-axis format": ["主轴格式"], + "Profile": ["用户信息"], + "Profile picture provided by Gravatar": ["资料图片由 Gravatar 提供"], + "Progress": ["进度"], + "Progressive": ["进度"], + "Propagate": ["传播"], + "Proportional": ["比例"], + "Public and privately shared sheets": ["公共和私人共享的表"], + "Publicly shared sheets only": ["仅公开共享表"], + "Published": ["已发布"], + "Put labels outside": ["外侧显示标签"], + "Put the labels outside of the pie?": ["是否将标签显示在饼图外侧?"], + "Put the labels outside the pie?": ["是否将标签显示在饼图外侧?"], + "Put your code here": ["把您的代码放在这里"], + "Python Functions": ["Python函数"], + "Python datetime string pattern": ["Python日期格式模板"], + "Python functions": ["Python函数"], + "Quarter": ["季度"], + "Quarters %s": [" %s 季度"], + "Query": ["查询"], + "Query %s: %s": ["查询 : %s "], + "Query A": ["查询 A"], + "Query B": ["查询 B"], + "Query History": ["历史查询"], + "Query history": ["历史查询"], + "Query in a new tab": ["在新标签中查询"], + "Query is too complex and takes too long to run.": [ + "查询太复杂,运行时间太长。" + ], + "Query mode": ["查询模式"], + "Query name": ["查询名称"], + "Query preview": ["查询预览"], + "Query search string": ["查询搜索字符串"], + "Query was stopped": ["查询被终止。"], + "Query was stopped.": ["查询被终止。"], + "RANGE TYPE": ["范围类型"], + "REPORT NAME ERROR": ["报告名称错误"], + "RGB Color": ["RGB颜色"], + "Radar": ["雷达"], + "Radar Chart": ["雷达图"], + "Radar render type, whether to display 'circle' shape.": [ + "雷达渲染类型,是否显示圆形" + ], + "Radial": ["径向"], + "Ran %s": ["持续时间:%s"], + "Range": ["范围"], + "Range filter": ["范围过滤"], + "Range filter plugin using AntD": ["范围过滤器"], + "Range labels": ["范围标签"], + "Ranges": ["管理"], + "Ranges to highlight with shading": ["突出阴影的范围"], + "Ranking": ["排名"], + "Ratio": ["比率"], + "Raw records": ["原始记录"], + "Ready to review filters in this dashboard?": [ + "准备查看此仪表板中的筛选器吗?" + ], + "Rebuild": ["重构"], + "Recent activity": ["近期活动"], + "Recently created charts, dashboards, and saved queries will appear here": [ + "最近创建的图表、看板和保存的查询将显示在此处" + ], + "Recently edited charts, dashboards, and saved queries will appear here": [ + "最近编辑的图表、看板和保存的查询将显示在此处" + ], + "Recently modified": ["最近修改"], + "Recently viewed charts, dashboards, and saved queries will appear here": [ + "最近查看的图表、看板和保存的查询将显示在此处" + ], + "Recents": ["最近"], + "Recipients": ["收件人"], + "Recipients are separated by \",\" or \";\"": [ + "收件人之间用 \",\" 或者 \";\" 隔开" + ], + "Recommended tags": ["推荐标签"], + "Record Count": ["记录数"], + "Rectangle": ["长方形"], + "Redirects to this endpoint when clicking on the datasource from the datasource list": [ + "在数据源列表中点击数据源将重定向到此端点" + ], + "Redirects to this endpoint when clicking on the table from the table list": [ + "点击表列表中的表时将重定向到此端点" + ], + "Reduce X ticks": ["减少 X 轴的刻度"], + "Reduces the number of X-axis ticks to be rendered. If true, the x-axis will not overflow and labels may be missing. If false, a minimum width will be applied to columns and the width may overflow into an horizontal scroll.": [ + "减少要渲染的X轴标记数。如果为true,x轴将不会溢出,但是标签可能丢失。如果为false,则对列应用最小宽度,宽度可能溢出到水平滚动条中。" + ], + "Refer to the": ["参考 "], + "Referenced columns not available in DataFrame.": [ + "引用的列在数据帧(DataFrame)中不可用。" + ], + "Refetch results": ["重新获取结果"], + "Refresh": ["刷新间隔"], + "Refresh Druid Metadata": ["刷新 Druid 元数据"], + "Refresh Metadata": ["刷新元数据"], + "Refresh column metadata": ["刷新字段元数据"], + "Refresh dashboard": ["刷新看板"], + "Refresh frequency": ["刷新频率"], + "Refresh interval": ["刷新间隔"], + "Refresh the default values": ["刷新默认值"], + "Refreshed metadata from cluster [{}]": ["从群集刷新元数据 [{}]"], + "Refreshing datasource [{}]": ["刷新数据源 [{}]"], + "Regular filters add where clauses to queries if a user belongs to a role referenced in the filter. Base filters apply filters to all queries except the roles defined in the filter, and can be used to define what users can see if no RLS filters within a filter group apply to them.": [ + "常规过滤将where子句添加到查询中,以确定用户是否属于过滤中引用的角色。基本过滤将应用于除过滤中定义的角色之外的所有查询,并且可以用于定义在没有应用RLS过滤组的情况下,哪些用户可以看到内容。" + ], + "Relational": ["执行时间"], + "Relationships between community channels": ["社区渠道之间的关系"], + "Relative Date/Time": ["相对日期/时间"], + "Relative period": ["宽限期"], + "Relative quantity": ["相对量"], + "Remind me in 24 hours": ["24小时后提醒我"], + "Remove": ["删除"], + "Remove invalid filters": ["删除该行"], + "Remove item": ["删除该行"], + "Remove query from log": ["从日志中删除查询"], + "Remove table preview": ["删除表格预览"], + "Removed columns: %s": ["删除的列:%s"], + "Rename tab": ["重命名标签"], + "Rendering": ["渲染"], + "Replace": ["替换"], + "Report": ["报表"], + "Report Schedule could not be created.": ["无法创建报表计划。"], + "Report Schedule could not be deleted.": ["无法删除报表计划。"], + "Report Schedule could not be updated.": ["无法更新报表计划。"], + "Report Schedule delete failed.": ["报表计划删除失败。"], + "Report Schedule execution failed when generating a csv.": [ + "生成屏幕截图时报表计划执行失败。" + ], + "Report Schedule execution failed when generating a dataframe.": [ + "生成屏幕截图时报表计划执行失败。" + ], + "Report Schedule execution failed when generating a screenshot.": [ + "生成屏幕截图时报表计划执行失败。" + ], + "Report Schedule execution got an unexpected error.": [ + "报表计划执行遇到意外错误。" + ], + "Report Schedule is still working, refusing to re-compute.": [ + "报表计划仍在运行,拒绝重新计算。" + ], + "Report Schedule log prune failed.": ["报表计划日志精简失败。"], + "Report Schedule not found.": ["找不到报表计划。"], + "Report Schedule parameters are invalid.": ["报表计划参数无效。"], + "Report Schedule reached a working timeout.": ["报表计划已超时。"], + "Report Schedule sellenium user not found": [ + "找不到报表计划sellenium用户" + ], + "Report Schedule state not found": ["未找到报表计划状态"], + "Report a bug": ["报告bug"], + "Report failed": ["报告失败"], + "Report name": ["报告名称"], + "Report schedule": ["报告时间表"], + "Report schedule unexpected error": ["报告计划意外错误。"], + "Report sending": ["报告发送"], + "Report sent": ["已发送报告"], + "Reports": ["报告"], + "Repulsion": ["表达式"], + "Repulsion strength between nodes": ["节点间的斥力"], + "Request Permissions": ["请求权限"], + "Request is incorrect: %(error)s": ["请求不正确: %(error)s"], + "Request is not JSON": ["请求不是JSON"], + "Request missing data field.": ["请求丢失的数据字段。"], + "Required": ["必填"], + "Resample": ["重新采样"], + "Reset state": ["状态重置"], + "Restore Filter": ["还原过滤条件"], + "Results": ["结果"], + "Results backend is not configured.": ["后端未配置结果"], + "Results backend needed for asynchronous queries is not configured.": [ + "后端未配置异步查询所需的结果" + ], + "Return to specific datetime.": ["返回指定的日期时间。"], + "Reverse lat/long ": ["经纬度互换"], + "Rich Tooltip": ["详细提示"], + "Rich tooltip": ["详细提示"], + "Right": ["高度"], + "Right Axis Format": ["右轴格式化"], + "Right Axis Metric": ["右轴指标"], + "Right Axis chart(s)": ["右轴图表"], + "Right axis metric": ["右轴指标"], + "Right to Left": ["右到左"], + "Right value": ["右侧的值"], + "Role": ["用户信息"], + "Role %(r)s was extended to provide the access to the datasource %(ds)s": [ + "扩展角色 %(r)s 以提供对 datasource %(ds)s 的访问" + ], + "Roles": ["角色"], + "Roles is a list which defines access to the dashboard. Granting a role access to a dashboard will bypass dataset level checks. If no roles defined then the dashboard is available to all roles.": [ + "角色是一个定义对仪表板访问权限的列表。授予角色对仪表板的访问权限将绕过数据集级别的检查。如果未定义角色,则仪表板对所有角色都可用。" + ], + "Roles is a list which defines access to the dashboard. Granting a role access to a dashboard will bypass dataset level checks.If no roles defined then the dashboard is available to all roles.": [ + "角色是一个定义对仪表板访问权限的列表。授予角色对仪表板的访问权限将绕过数据集级别的检查。如果未定义角色,则仪表板对所有角色都可用。" + ], + "Roles to grant": ["角色授权"], + "Rolling Function": ["滚动函数"], + "Rolling Window": ["滚动窗口"], + "Rolling function": ["滚动函数"], + "Rolling window": ["滚动窗口"], + "Root certificate": ["根证书"], + "Root node id": ["根节点id"], + "Rotate x axis label": ["旋转x轴标签"], + "Rotation to apply to words in the cloud": [ + "应用于词云中的单词的旋转方式" + ], + "Round cap": ["国家地图"], + "Row": ["行"], + "Row Level Security": ["行级安全"], + "Row containing the headers to use as column names (0 is first line of data). Leave empty if there is no header row.": [ + "作为列名的带有标题的行(0是第一行数据)。如果没有标题行则留空。" + ], + "Row level security filter": ["行级安全过滤"], + "Row limit": ["行限制"], + "Rows": ["行"], + "Rows per page, 0 means no pagination": ["每页行数,0 表示没有分页"], + "Rows subtotal position": ["行小计的位置"], + "Rows to Read": ["读取的行"], + "Rule": ["规则"], + "Run": ["执行"], + "Run a query to display results here": ["运行一个查询,在此会显示结果"], + "Run in SQL Lab": ["在 SQL 工具箱中执行"], + "Run query": ["运行查询"], + "Run query (Ctrl + Return)": ["执行运行 (Ctrl + Return)"], + "Run query in a new tab": ["在新标签中运行查询"], + "Run selection": ["运行选定的查询"], + "Running": ["正在执行"], + "SAT": ["星期六"], + "SEP": ["九月"], + "SQL": ["SQL"], + "SQL Copied!": ["SQL复制成功!"], + "SQL Editor": ["SQL 编辑器"], + "SQL Expression": ["SQL表达式"], + "SQL Lab": ["SQL 工具箱"], + "SQL Lab View": ["SQL Lab 视图"], + "SQL Lab uses your browser's local storage to store queries and results.\nCurrently, you are using %(currentUsage)s KB out of %(maxStorage)d KB storage space.\nTo keep SQL Lab from crashing, please delete some query tabs.\nYou can re-access these queries by using the Save feature before you delete the tab.\nNote that you will need to close other SQL Lab windows before you do this.": [ + "SQL Lab使用浏览器的本地存储来存储查询和结果" + ], + "SQL Query": ["SQL查询"], + "SQL expression": ["SQL表达式"], + "SQL query": ["SQL查询"], + "SQLAlchemy URI": ["SQLAlchemy URI"], + "SSL Mode \"require\" will be used.": ["SSL模式 \"require\" 将被使用。"], + "START (INCLUSIVE)": ["开始 (包含)"], + "SUN": ["星期日"], + "Sankey": ["蛇形图"], + "Sankey Diagram": ["桑基图"], + "Sankey Diagram with Loops": ["桑基图"], + "Saturday": ["星期六"], + "Save": ["保存"], + "Save & Explore": ["保存和浏览"], + "Save & go to dashboard": ["保存并转到看板"], + "Save (Overwrite)": ["保存(覆盖)"], + "Save as": ["另存为"], + "Save as ...": ["另存为 ..."], + "Save as new": ["保存为新的"], + "Save as new chart": ["创建新图表"], + "Save as:": ["另存为:"], + "Save chart": ["图表保存"], + "Save dashboard": ["保存看板"], + "Save for this session": ["保存此会话"], + "Save query": ["保存查询"], + "Save the query to enable this feature": ["请保存查询以启用共享"], + "Saved": ["保存"], + "Saved Queries": ["已保存查询"], + "Saved expressions": ["保存表达式"], + "Saved metric": ["保存的指标"], + "Saved queries": ["已保存查询"], + "Saved queries could not be deleted.": ["保存的查询无法被删除"], + "Saved query not found.": ["保存的查询未找到"], + "Saved query parameters are invalid.": ["保存的查询参数无效"], + "Scale and Move": ["缩放和移动"], + "Scale only": ["存在规模"], + "Scan New Datasources": ["扫描新的数据源"], + "Scatter": ["散点"], + "Scatter Plot": ["散点图"], + "Schedule": ["调度"], + "Schedule Email Reports for Charts": ["为图表配置电子邮件报告"], + "Schedule Email Reports for Dashboards": ["为看板添加电子邮件报告"], + "Schedule email report": ["为图表配置电子邮件报告"], + "Schedule query": ["分享查询"], + "Schedule settings": ["计划设置"], + "Schedule the query periodically": ["定期调度查询"], + "Scheduled": ["被调度"], + "Scheduled at (UTC)": ["计划时间"], + "Scheduled reports will be sent to your email as a PNG": [ + "计划的报告将作为PNG发送到您的电子邮件" + ], + "Schema": ["模式"], + "Schema cache timeout": ["图表缓存超时"], + "Schema, as used only in some databases like Postgres, Redshift and DB2": [ + "模式,只在一些数据库中使用,比如Postgres、Redshift和DB2" + ], + "Schemas allowed for CSV upload": ["模式允许使用CSV上传"], + "Scoping": ["范围"], + "Search": ["搜索"], + "Search / Filter": ["搜索 / 过滤"], + "Search Metrics & Columns": ["搜索指标和列"], + "Search all charts": ["搜索所有图表"], + "Search all dashboards": ["搜索所有看板"], + "Search all filter options": ["搜索所有过滤选项"], + "Search box": ["搜索框"], + "Search by query text": ["按查询文本搜索"], + "Search...": ["搜索..."], + "Second": ["秒"], + "Secondary": ["次要的"], + "Secondary Metric": ["次计量指标"], + "Secondary y-axis format": ["次级y轴格式"], + "Secondary y-axis title": ["二级轴标题"], + "Seconds %s": ["%s 秒"], + "Secure Extra": ["安全"], + "Secure extra": ["安全"], + "Security": ["安全"], + "Security & Access": ["安全 & 访问"], + "See all %(tableName)s": ["查看全部 - %(tableName)s"], + "See less": ["查看更少"], + "See more": ["查看更多"], + "See table schema": ["选择表"], + "Select": ["批量选择"], "Select ...": ["选择 ..."], - "Loaded data cached": ["数据缓存已加载"], - "Loaded from cache": ["从缓存中加载"], - "Click to force-refresh": ["点击强制刷新"], - "cached": ["已缓存"], - "Certified by %s": ["认证人 %s"], - "Copy to clipboard": ["复制到剪贴板"], - "Copied!": ["复制成功!"], + "Select Delivery Method": ["添加通知方法"], + "Select Viz Type": ["选择一个可视化类型"], + "Select a CSV file to be uploaded to a database.": [ + "选择一个CSV文件上传到数据库." + ], + "Select a Columnar file to be uploaded to a database.": [ + "选择要上传到数据库的Excel文件。" + ], + "Select a Excel file to be uploaded to a database.": [ + "选择要上传到数据库的Excel文件。" + ], + "Select a column": ["反选所有"], + "Select a dashboard": ["看板"], + "Select a visualization type": ["选择一个可视化类型"], + "Select aggregate options": ["选择总选项"], + "Select any columns for metadata inspection": [ + "选择任意列进行元数据巡检" + ], + "Select charts": ["所有图表"], + "Select color scheme": ["线性颜色方案"], + "Select column": ["时间列"], + "Select database or type database name": ["选择表或输入表名"], + "Select databases require additional fields to be completed in the Advanced tab to successfully connect the database. Learn what requirements your databases has ": [ + "选择数据库需要在Advanced选项卡中完成额外的字段才能成功连接数据库了解数据库的需求" + ], + "Select filter": ["选择过滤器"], + "Select filter plugin using AntD": ["选择过滤器"], + "Select first item by default (when using this option, default value can’t be set)": [ + "默认选择第一项(使用此选项时,不能“设置默认值”)" + ], + "Select operator": ["选择运营商"], + "Select or type a value": ["选择或者输入值"], + "Select owners": ["运行选定的查询"], + "Select parent filters": ["选择父级过滤"], + "Select saved metrics": ["选择保存指标"], + "Select schema or type schema name": ["选择表或输入表名"], + "Select scheme": ["选择表"], + "Select start and end date": ["选择开始和结束时间"], + "Select subject": ["选择主题"], + "Select table or type table name": ["选择表或输入表名"], + "Select the number of bins for the histogram": ["选择直方图的容器数"], + "Select the numeric columns to draw the histogram": [ + "选择直方图的容器数" + ], + "Send as CSV": ["发送为CSV"], + "Send as PNG": ["发送PNG"], + "Send as text": ["发送文本"], + "Send range filter events to other charts": [ + "将过滤条件的事件发送到其他图表" + ], + "September": ["九月"], + "Sequential": ["顺序"], + "Series": ["序列"], + "Series Height": ["序列高度"], + "Series Style": ["线条样式"], + "Series chart type (line, bar etc)": ["系列图表类型(折线,柱状图等)"], + "Series limit": ["序列限制"], + "Series type": ["图示类型"], + "Server Page Length": ["页面长度"], + "Server pagination": ["服务器分页"], + "Service Account": ["服务帐户"], + "Set auto-refresh interval": ["设置自动刷新"], + "Set filter mapping": ["设置过滤映射"], + "Settings": ["设置"], + "Settings for time series": ["时间序列设置"], + "Share": ["分享"], + "Share chart by email": ["通过电子邮件分享图表”"], + "Share dashboard by email": ["通过电子邮件分享仪表盘"], + "Shared query": ["已分享的查询"], + "Sheet Name": ["Sheet名称"], + "Short description must be unique for this layer": [ + "此层的简述必须是唯一的" + ], + "Should daily seasonality be applied. An integer value will specify Fourier order of seasonality.": [ + "一个整数值将指定季节性的傅立叶顺序。" + ], + "Should weekly seasonality be applied. An integer value will specify Fourier order of seasonality.": [ + "一个整数值将指定季节性的傅立叶顺序。" + ], + "Should yearly seasonality be applied. An integer value will specify Fourier order of seasonality.": [ + "一个整数值将指定“季节性的傅立叶顺序。" + ], + "Show Annotation": ["查看注释"], + "Show Annotation Layer": ["查看注释层"], + "Show Bubbles": ["显示气泡"], + "Show CREATE VIEW statement": ["显示 CREATE VIEW 语句"], + "Show CSS Template": ["查看CSS模板"], + "Show Chart": ["显示图表"], + "Show Column": ["显示列"], + "Show Dashboard": ["显示看板"], + "Show Database": ["显示数据库"], + "Show Druid Cluster": ["显示 Druid 集群"], + "Show Druid Column": ["显示 Druid 列"], + "Show Druid Datasource": ["显示 Druid 数据源"], + "Show Druid Metric": ["显示 Druid 指标"], + "Show Druid granularity dropdown": ["显示Druid时间粒度下拉列表"], + "Show Druid time origin": ["显示Druid原始时间"], + "Show Labels": ["显示标签"], + "Show Less...": ["显示. ."], + "Show Log": ["查看日志"], + "Show Markers": ["显示标记"], + "Show Metric": ["显示指标"], + "Show Metric Names": ["显示指标名"], + "Show Observation": ["显示观察结果"], + "Show Range Filter": ["显示范围过滤器"], + "Show Row level security filter": ["显示行级安全过滤"], + "Show SQL time column": ["显示SQL时间列"], + "Show SQL time grain dropdown": ["检查包含时间原点的下拉列表"], + "Show Saved Query": ["显示保存的查询"], + "Show Table": ["显示表"], + "Show Timestamp": ["显示时间戳"], + "Show Trend Line": ["显示趋势线"], + "Show Upper Labels": ["显示标签"], + "Show Value": ["显示值"], + "Show Values": ["显示值"], + "Show all columns": ["显示所有列"], + "Show all...": ["显示所有..."], + "Show axis line ticks": ["显示轴线刻度"], + "Show cell bars": ["显示单元格的栏"], + "Show columns total": ["显示总计"], + "Show data points as circle markers on the lines": [ + "将数据点显示为线条上的圆形标记" + ], + "Show hierarchical relationships of data, with with the value represented by area, showing proportion and contribution to the whole.": [ + "显示数据的层次关系与表示的值。按面积划分显示其占整体的比例" + ], + "Show info tooltip": ["显示信息提示"], + "Show label": ["显示标签"], + "Show labels when the node has children.": ["当节点有子节点时显示标签"], + "Show legend": ["显示图例"], + "Show less columns": ["显示较少时间列"], + "Show less...": ["显示..."], + "Show percentage": ["显示百分比"], + "Show pointer": ["显示鼠标"], + "Show progress": ["显示进度"], + "Show rows total": ["显示总计行数"], + "Show series values on the chart": ["显示栏上的值"], + "Show split lines": ["显示分割线"], + "Show the value on top of the bar": ["显示栏上的值"], + "Show time column": ["显示时间列"], + "Show time grain dropdown": ["显示Druid时间粒度下拉列表"], + "Show total aggregations of selected metrics. Note that row limit does not apply to the result.": [ + "显示所选指标的总聚合。注意行限制并不应用于结果" + ], + "Show totals": ["显示总计"], + "Showcases a single metric front-and-center. Big number is best used to call attention to a KPI or the one thing you want your audience to focus on.": [ + "显示单个公制正面和中间。大数字最好用来唤起人们对KPI或你希望观众关注的一件事的关注" + ], + "Showcases a single number accompanied by a simple line chart, to call attention to an important metric along with its change over time or other dimension.": [ + "显示一个数字和一个简单的折线图,以提醒注意一个重要指标及其随时间或其他维度的变化" + ], + "Showcases how a metric changes as the funnel progresses. This classic chart is useful for visualizing drop-off between stages in a pipeline or lifecycle.": [ + "显示指标如何随着漏斗的进展而变化。此经典图表对于可视化管道或生命周期中各阶段之间的下降非常有用。" + ], + "Showcases the flow or link between categories using thickness of chords. The value and corresponding thickness can be different for each side.": [ + "使用弦的厚度显示类别之间的流或链接。每一侧的值和相应厚度可能不同。" + ], + "Showcases the progress of a single metric against a given target. The higher the fill, the closer the metric is to the target.": [ + "显示单个指标相对于给定目标的进度。填充越高,度量越接近目标" + ], + "Showing %s of %s": ["显示 %s个 总计 %s个"], + "Shows a list of all series available at that point in time": [ + "详细提示显示了该时间点的所有序列的列表。" + ], + "Shows the composition of a dataset by segmenting a given rectangle as smaller rectangles with areas proportional to their value or contribution to the whole. Those rectangles may also, in turn, be further segmented hierarchically.": [ + "显示数据集的组成,方法是将给定矩形分割为较小的矩形,其面积与矩形的值或对整体的贡献成比例。这些矩形也可以按层次进一步分割" + ], + "Significance Level": ["显著性"], + "Simple": ["简单配置"], + "Simple ad-hoc metrics are not enabled for this dataset": [ + "此数据集没有启用简单的特别度量" + ], + "Single": ["我的编辑"], + "Single Metric": ["按指标过滤"], + "Single Value": ["空值"], + "Single value": ["空值"], + "Single value type": ["单值类型"], + "Size of edge symbols": ["边缘符号的大小"], + "Size of marker. Also applies to forecast observations.": [ + "标记的大小也适用于预测观察。”" + ], + "Sizes of vehicles": ["工具尺寸"], + "Skip Blank Lines": ["跳过空白行"], + "Skip Initial Space": ["跳过初始空格"], + "Skip Rows": ["跳过行"], + "Skip blank lines rather than interpreting them as NaN values.": [ + "跳过空白行而不是把它们解释为NaN值。" + ], + "Skip spaces after delimiter.": ["在分隔符之后跳过空格。"], + "Slack Channel": ["Slack 频道"], + "Slug": ["Slug"], + "Small": ["小"], + "Small number format": ["数字格式化"], + "Some roles do not exist": ["看板"], + "Sorry there was an error fetching database information: %s": [ + "抱歉,获取数据库信息时出错:%s" + ], + "Sorry there was an error fetching saved charts: ": [ + "抱歉,这个看板在获取图表时发生错误:" + ], + "Sorry, An error occurred": ["抱歉,发生错误"], + "Sorry, something went wrong. Try again later.": [ + "抱歉,出了点问题。请稍后再试。" + ], + "Sorry, there appears to be no data": ["抱歉,似乎没有数据"], + "Sorry, there was an error saving this dashboard: %s": [ + "抱歉,这个看板在获取图表时发生错误:%s" + ], + "Sorry, your browser does not support copying.": [ + "抱歉,您的浏览器不支持复制操作。使用 Ctrl / Cmd + C!" + ], "Sorry, your browser does not support copying. Use Ctrl / Cmd + C!": [ "抱歉,您的浏览器不支持复制操作。使用 Ctrl / Cmd + C!" ], - "Error while fetching schema list": ["获取schema列表时出错"], - "Error while fetching database list": ["获取数据库列表时出错"], - "Database:": ["数据库:"], - "Select a database": ["选择一个数据库"], - "Force refresh schema list": ["强制刷新数据"], - "Select a schema (%s)": ["选择一个schema(%s)"], - "Schema:": [""], - "datasource": ["数据源"], - "schema": ["模式"], - "delete": ["删除"], - "Type \"%s\" to confirm": ["键入 \"%s\" 来确认"], - "DELETE": ["删除"], - "Click to edit": ["点击编辑"], - "You don't have the rights to alter this title.": [ - "您没有权利修改这个标题。" + "Sort": ["排序:"], + "Sort Bars": ["排序条形栏"], + "Sort Descending": ["降序"], + "Sort Metric": ["排序指标"], + "Sort X Axis": ["排序X轴"], + "Sort Y Axis": ["排序Y轴"], + "Sort ascending": ["升序排序"], + "Sort bars by x labels.": ["按 x 标签排序。"], + "Sort by": ["排序 "], + "Sort by %s": ["排序 %s"], + "Sort by metric": ["排序指标"], + "Sort columns alphabetically": ["对列按字母顺序进行排列"], + "Sort columns by": ["对列按字母顺序进行排列"], + "Sort descending": ["降序"], + "Sort filter values": ["可被过滤"], + "Sort metric": ["排序指标"], + "Sort rows by": ["排序 "], + "Sort type": ["图表类型"], + "Source": ["来源"], + "Source / Target": ["源/目标"], + "Source SQL": ["源 SQL"], + "Source category": ["数据库名称"], + "Spatial": ["空间"], + "Specific Date/Time": ["具体日期/时间"], + "Specify a schema (if database flavor supports this).": [ + "指定一个Schema(需要数据库支持)" + ], + "Specify duplicate columns as \"X.0, X.1\".": [ + "将重复列指定为“x.0,x.1”。" + ], + "Specify the database version. This should be used with Presto in order to enable query cost estimation.": [ + "指定数据库版本。这应该与Presto一起使用,以便启用查询成本估算。" + ], + "Split number": ["数字"], + "Stack series": ["已保存查询"], + "Stack series on top of each other": ["叠加系列"], + "Stacked": ["堆叠"], + "Stacked Bars": ["堆叠条形图"], + "Stacked Style": ["堆积样式"], + "Stacked style": ["堆积样式"], + "Standard time series": ["时间序列"], + "Start": ["开始"], + "Start Review": ["数据预览"], + "Start angle": ["开始时间"], + "Start at (UTC)": ["由UTC开始"], + "Start date included in time range": ["开始日期包含在时间范围内"], + "Start y-axis at 0": ["y轴从0开始"], + "Start y-axis at zero. Uncheck to start y-axis at minimum value in the data.": [ + "从零开始y轴。取消选中以从数据中的最小值开始y轴 " + ], + "State": ["状态"], + "Statistical": ["统计"], + "Status": ["状态"], + "Step type": ["数据类型"], + "Stop": ["停止"], + "Stop query": ["停止查询"], + "Stop running (Ctrl + x)": ["停止运行 (Ctrl + x)"], + "Stopped an unsafe database connection": ["已停止不安全的数据库连接"], + "Strength to pull the graph toward center": ["将图形拉向中心"], + "Stretched style": ["堆积样式"], + "Strings used for sheet names (default is the first sheet).": [ + "用于sheet名称的字符串(默认为第一个sheet)。" + ], + "Structural": ["结构"], + "Style": ["风格"], + "Style the ends of the progress bar with a round cap": [ + "用圆帽设置进度条末端的样式" + ], + "Subdomain": ["子域"], + "Subheader": ["子标题"], + "Subheader Font Size": ["子标题的字体大小"], + "Success": ["成功"], + "Suffix to apply after the percentage display": [ + "百分比显示后要应用的后缀" + ], + "Sum of values over specified period": ["指定期间内的值总和"], + "Sunburst": ["环状层次图"], + "Sunburst Chart": ["旭日/太阳图"], + "Sunday": ["星期日"], + "Superset Chart": ["选择图表"], + "Superset chart": ["选择图表"], + "Superset dashboard": ["看板"], + "Superset encountered an error while running a command.": [ + "警报在执行查询时发现错误。" + ], + "Superset encountered an unexpected error.": ["报告计划意外错误。"], + "Supported databases": ["已支持数据库"], + "Survey Responses": ["调查结果"], + "Swap Groups and Columns": ["交换组和列"], + "Swap rows and columns": ["交换组和列"], + "Swiss army knife for visualizing time series data. Choose between step, line, scatter, and bar charts. This viz type has many customization options as well.": [ + "用于可视化时间序列数据。在步进图、折线图、散点图和条形图之间进行选择,也有许多自定义选项" + ], + "Symbol": ["符号"], + "Symbol of two ends of edge line": ["边线两端的符号"], + "Symbol size": ["符号的大小"], + "Sync columns from source": ["从源同步列"], + "Syntax": ["语法"], + "TABLES": ["表"], + "THU": ["星期四"], + "TUE": ["星期二"], + "Tab name": ["选项卡名字"], + "Tab title": ["选项卡标题"], + "Table": ["表"], + "Table %(table)s wasn't found in the database %(db)s": [ + "在数据库 %(db)s 中找不到表 %(table)s" + ], + "Table Exists": ["表已存在处理"], + "Table Name": ["表名"], + "Table View": ["表视图"], + "Table [%(table_name)s] could not be found, please double check your database connection, schema, and table name": [ + "找不到 [%(table_name)s] 表,请仔细检查您的数据库连接、Schema 和 表名" + ], + "Table [%{table}s] could not be found, please double check your database connection, schema, and table name, error: {}": [ + "找不到 [%{table}s] 表,请仔细检查您的数据库连接、Schema 和 表名" + ], + "Table cache timeout": ["图表缓存超时"], + "Table name undefined": ["表名未定义"], + "Table that visualizes paired t-tests, which are used to understand statistical differences between groups.": [ + "可视化检验的表格,用于了解各组之间的统计差异" + ], + "Tables": ["数据表"], + "Tabs": ["选项卡"], + "Tabular": ["表格"], + "Tags": ["标签"], + "Take your data points, and group them into \"bins\" to see where the densest areas of information lie": [ + "获取数据点,并将其分组,以查看信息最密集的区域" + ], + "Target": ["目标"], + "Target aspect ratio for treemap tiles.": ["树形图中图块的目标高宽比。"], + "Target category": ["目标类别"], + "Target value": ["目标值"], + "Template Name": ["模板名称"], + "Template parameters": ["模板参数"], + "Templated link, it's possible to include {{ metric }} or other values coming from the controls.": [ + "模板链接,可以包含{{度量}}或来自控件的其他值。" + ], + "Temporal expression not supported for type: %(col_type)s": [ + "%(col_type)s不支持时间表达式" + ], + "Terminate running queries when browser window closed or navigated to another page. Available for Presto, Hive, MySQL, Postgres and Snowflake databases.": [ + "当浏览器窗口关闭或导航到其他页面时,终止正在运行的查询。适用于Presto、Hive、MySQL、Postgres和Snowflake数据库" + ], + "Test Connection": ["测试连接"], + "Test connection": ["测试连接"], + "Text": ["文本"], + "Text align": ["文本对齐"], + "Text embedded in email": ["邮件中嵌入的文本"], + "The CSS for individual dashboards can be altered here, or in the dashboard view where changes are immediately visible": [ + "可以在这里或者在看板视图修改单个看板的CSS样式" + ], + "The CTAS (create table as select) doesn't have a SELECT statement at the end. Please make sure your query has a SELECT as its last statement. Then, try running your query again.": [ + "CTA(create table as select)只能与最后一条语句为SELECT的查询一起运行。请确保查询的最后一个语句是SELECT。然后再次尝试运行查询。" ], - "Unexpected error": ["意外错误。"], - "Click to favorite/unfavorite": ["点击 收藏/取消收藏"], - "An error occurred while fetching dashboards": ["获取看板时出错"], - "Error while fetching table list": ["获取表列表时出错"], - "Select table or type table name": ["选择表或输入表名"], - "Type to search ...": ["输入搜索条件 ..."], - "Select table ": ["选择表"], - "Force refresh table list": ["强制刷新数据"], - "See table schema": ["选择表"], - "%s%s": ["%s%s"], - "Share dashboard": ["分享看板"], - "This may be triggered by:": ["这可能由以下因素触发:"], - "Please reach out to the Chart Owner for assistance.": [ - "请联系图表所有者寻求帮助。" + "The JSON metric or post aggregation definition.": [ + "JSON指标或处理聚合定义。" ], - "Chart Owner: %s": ["图表所有者:%s"], - "%s Error": ["%s 异常"], - "See more": ["查看更多"], - "See less": ["查看更少"], - "Copy message": ["复制信息"], - "Close": ["关闭"], - "This was triggered by:": ["这是由以下因素引发的:"], - "Did you mean:": ["您的意思是:"], - "%(suggestion)s instead of \"%(undefinedParameter)s?\"": [ - "用 %(suggestion)s 替换 \"%(undefinedParameter)s\" 吗?" + "The URL could not be identified. Please check for typos and make sure that \"Type of google sheet allowed\" selection matches the input": [ + "无法识别URL。请检查拼写错误,并确保允许的谷歌工作表类型选择与输入匹配" ], - "Parameter error": ["参数错误"], - "We’re having trouble loading this visualization. Queries are set to timeout after %s second.": [ - "加载此可视化效果时遇到问题。查询设置为 %s 秒后超时。" + "The access requests seem to have been deleted": ["访问请求已被删除"], + "The annotation has been saved": ["注释已保存。"], + "The annotation has been updated": ["注释已更新。"], + "The category of source nodes used to assign colors. If a node is associated with more than one category, only the first will be used.": [ + "用于分配颜色的源节点类别。如果一个节点与多个类别关联,则只使用第一个类别" ], - "We’re having trouble loading these results. Queries are set to timeout after %s second.": [ - "加载结果时遇到问题。查询设置为 %s 秒后超时。" + "The chart does not exist": ["图表不存在"], + "The classic. Great for showing how much of a company each investor gets, what demographics follow your blog, or what portion of the budget goes to the military industrial complex.\n\n Pie charts can be difficult to interpret precisely. If clarity of relative proportion is important, consider using a bar or other chart type instead.": [ + "经典的,很好地展示了每个投资者获得了多少公司,“有多少人关注你的博客,或者预算的哪一部分流向了军事工业综合体饼状图很难精确解释。如果“相对比例”的清晰性很重要,可以考虑使用柱状图或其他图表来代替。" ], - "Timeout error": ["超时错误"], - "Cell content": ["单元格内容"], - "The import was successful": ["导入成功"], - "OVERWRITE": ["覆盖"], - "Overwrite": ["覆盖"], - "Import": ["导入"], - "Import %s": ["导入 %s"], - "Last Updated %s": ["上次更新 %s"], - "%s Selected": ["%s 已选定"], - "Deselect all": ["反选所有"], - "%s-%s of %s": ["%s-%s 总计 %s"], - "Settings": ["设置"], - "About": ["关于"], - "SQL query": ["SQL查询"], - "There is not enough space for this component. Try decreasing its width, or increasing the destination width.": [ - "此组件没有足够的空间。请尝试减小其宽度,或增加目标宽度。" + "The color for points and clusters in RGB": ["点和簇的颜色(RGB)"], + "The color scheme for rendering chart": ["绘制图表的配色方案"], + "The color scheme is determined by the related dashboard.\n Edit the color scheme in the dashboard properties.": [ + "配色方案由相关的仪表盘决定。在仪表板属性中编辑配色方案" ], - "Can not move top level tab into nested tabs": [ - "无法将顶级tab页移动到嵌套tab页中" + "The column was deleted or renamed in the database.": [ + "该列已在数据库中删除或重命名。" ], - "This chart has been moved to a different filter scope.": [ - "此图表已移至其他过滤器范围内。" + "The country code standard that Superset should expect to find in the [country] column": [ + "Superset 希望能够在 [国家] 栏中找到的 国家 / 地区 的标准代码" ], - "There was an issue fetching the favorite status of this dashboard.": [ - "获取此看板的收藏夹状态时出现问题。" + "The dashboard has been saved": ["该看板已成功保存。"], + "The data source seems to have been deleted": ["数据源已经被删除"], + "The data type that was inferred by the database. It may be necessary to input a type manually for expression-defined columns in some cases. In most case users should not need to alter this.": [ + "由数据库推断的数据类型。在某些情况下,可能需要为表达式定义的列手工输入一个类型。在大多数情况下,用户不需要修改这个数据类型。" ], - "There was an issue favoriting this dashboard.": [ - "收藏看板时候出现问题。" + "The database %s is linked to %s charts that appear on %s dashboards and users have %s SQL Lab tabs using this database open. Are you sure you want to continue? Deleting the database will break those objects.": [ + "数据库 %s 已经关联了 %s 图表和 %s 看板。确定要继续吗?删除数据库将破坏这些对象。" ], - "This dashboard is now ${nowPublished}": ["当前看板 ${nowPublished}"], - "You do not have permissions to edit this dashboard.": [ - "您没有编辑此看板的权限。" + "The database is currently running too many queries.": [ + "数据库当前运行的查询太多" ], - "This dashboard was saved successfully.": ["该看板已成功保存。"], - "Could not fetch all saved charts": ["无法获取所有保存的图表"], - "Sorry there was an error fetching saved charts: ": [ - "抱歉,这个看板在获取图表时发生错误:" + "The database is under an unusual load.": ["数据库负载异常。"], + "The database referenced in this query was not found. Please contact an administrator for further assistance or try again.": [ + "找不到此查询中引用的数据库。请与管理员联系以获得进一步帮助,或重试。" ], - "Visualization": ["可视化模式"], - "Data source": ["数据源"], - "Added": ["已添加"], - "Components": ["组件"], - "Any color palette selected here will override the colors applied to this dashboard's individual charts": [ - "此处选择的任何调色板都将覆盖应用于此看板的各个图表的颜色" + "The database returned an unexpected error.": ["数据库返回意外错误。"], + "The database was deleted.": ["数据集已保存"], + "The database was not found.": ["数据库没有找到"], + "The dataset %s is linked to %s charts that appear on %s dashboards. Are you sure you want to continue? Deleting the dataset will break those objects.": [ + "数据集 %s 已经链接到 %s 图表和 %s 看板内。确定要继续吗?删除数据集将破坏这些对象。" ], - "Color scheme": ["配色方案"], - "Load a template": ["加载一个模板"], - "Load a CSS template": ["加载一个 CSS 模板"], - "Live CSS editor": ["即时 CSS 编辑器"], - "You have unsaved changes.": ["您有一些未保存的修改。"], - "This dashboard is currently force refreshing; the next force refresh will be in %s.": [ - "此看板当前正在强制刷新;下一次强制刷新将在 %s 内执行。" + "The dataset associated with this chart no longer exists": [ + "这个图表所链接的数据集可能被删除了。" ], - "Your dashboard is too large. Please reduce the size before save it.": [ - "您的看板太大了。保存前请缩小尺寸。" + "The dataset configuration exposed here\n affects all the charts using this dataset.\n Be mindful that changing settings\n here may affect other charts\n in undesirable ways.": [ + "这里公开的数据集配置会影响使用此数据集的所有图表。请注意,更改此处的设置可能会以未预想的方式影响其他图表。" ], - "Discard changes": ["放弃更改"], - "An error occurred while fetching available CSS templates": [ - "获取可用的CSS模板时出错" + "The dataset has been saved": ["数据集已保存"], + "The dataset linked to this chart may have been deleted.": [ + "这个图表所链接的数据集可能被删除了。" ], - "Superset dashboard": ["看板"], - "Check out this dashboard: ": ["查看此看板:"], - "Refresh dashboard": ["刷新看板"], - "Set auto-refresh interval": ["设置自动刷新"], - "Set filter mapping": ["设置过滤映射"], - "Edit dashboard properties": ["编辑看板属性"], - "Edit CSS": ["编辑CSS"], - "Download as image": ["下载为图片"], - "Toggle fullscreen": ["切换全屏"], - "There is no chart definition associated with this component, could it have been deleted?": [ - "没有与此组件关联的图表定义,是否已将其删除?" + "The datasource couldn't be loaded": ["这个查询无法被加载"], + "The datasource is too large to query.": ["数据源太大,无法进行查询。"], + "The description can be displayed as widget headers in the dashboard view. Supports markdown.": [ + "作为为小部件标题可以在仪表板视图中显示的描述,支持markdown格式语法。" ], - "Delete this container and save to remove this message.": [ - "删除此容器并保存以删除此邮件。" + "The distance between cells, in pixels": [ + "单元格之间的距离,以像素为单位" ], - "An error has occurred": ["发生了一个错误"], - "You do not have permission to edit this dashboard": [ - "您没有编辑此看板的权限" + "The duration of time in seconds before the cache is invalidated": [ + "缓存失效前的持续时间(以秒为单位)" ], - "A valid color scheme is required": ["需要有效的配色方案"], - "The dashboard has been saved": ["该看板已成功保存。"], - "Apply": ["应用"], - "Dashboard properties": ["看板属性"], - "Basic information": ["基本情况"], - "URL slug": ["使用 Slug"], - "A readable URL for your dashboard": ["为看板生成一个可读的 URL"], - "Access": ["访问"], - "Owners is a list of users who can alter the dashboard. Searchable by name or username.": [ - "所有者是可以更改看板的用户列表。可按名称或用户名搜索。" + "The engine_params object gets unpacked into the sqlalchemy.create_engine call.": [ + "1. engine_params 对象在调用 sqlalchemy.create_engine 时被引用, metadata_params 在调用 sqlalchemy.MetaData 时被引用。" ], - "Colors": ["颜色"], - "Advanced": ["进阶"], - "JSON metadata": ["JSON 元数据"], - "This dashboard is not published, it will not show up in the list of dashboards. Click here to publish this dashboard.": [ - "此看板未发布,它将不会显示在看板列表中。单击此处以发布此看板。" + "The following entries in `series_columns` are missing in `columns`: %(columns)s. ": [ + " `series_columns`中的下列条目在 `columns` 中缺失: %(columns)s. " ], - "This dashboard is not published which means it will not show up in the list of dashboards. Favorite it to see it there or access it by using the URL directly.": [ - "此看板未发布,这意味着它不会显示在仪表板列表中。您可以进行收藏并在收藏栏中查看或直接使用URL访问它。" + "The following tables added new columns: %(tables)s": [ + "下表添加了新列:%(tables)s" ], - "This dashboard is published. Click to make it a draft.": [ - "此看板已发布。单击以使其成为草稿。" + "The following tables removed columns: %(tables)s": [ + "下表删除了列:%(tables)s" ], - "Draft": ["草稿"], - "Don't refresh": ["不要刷新"], - "10 seconds": ["10秒钟"], - "30 seconds": ["30秒钟"], - "1 minute": ["1分钟"], - "5 minutes": ["5分钟"], - "30 minutes": ["30分钟"], - "1 hour": ["1小时"], - "6 hours": ["6小时"], - "12 hours": ["12小时"], - "24 hours": ["24 小时"], - "Refresh interval": ["刷新间隔"], - "Refresh frequency": ["刷新频率"], - "Are you sure you want to proceed?": ["您确定要继续执行吗?"], - "Save for this session": ["保存此会话"], - "You must pick a name for the new dashboard": [ - "您必须为新的看板选择一个名称" + "The following tables update column metadata: %(tables)s": [ + "下表更新列元数据:%(tables)s" ], - "Save dashboard": ["保存看板"], - "Overwrite Dashboard [%s]": ["覆盖看板 [%s]"], - "Save as:": ["另存为:"], - "[dashboard name]": ["[看板名称]"], - "also copy (duplicate) charts": ["同时复制图表"], - "Filter your charts": ["过滤您的图表"], - "Annotation layers are still loading.": ["注释层仍在加载。"], - "One ore more annotation layers failed loading.": [ - "一个或多个注释层加载失败。" + "The host \"%(hostname)s\" might be down and can't be reached.": [ + "主机 \"%(hostname)s\" 可能已关闭,无法连接到" ], - "Cached %s": ["缓存于%s"], - "Fetched %s": ["刷新于 %s"], - "Minimize chart": ["最小化图表"], - "Maximize chart": ["最大化图表"], - "Force refresh": ["强制刷新"], - "Toggle chart description": ["切换图表说明"], - "View chart in Explore": ["查看图表"], - "Share chart": ["共享图表"], - "Export CSV": ["导出 CSV"], - "Applied Filters (%d)": ["应用的条件 (%d)"], - "Incompatible Filters (%d)": ["不兼容的条件 (%d)"], - "Unset Filters (%d)": ["未选择的条件 (%d)"], - "Search...": ["搜索..."], - "No filter is selected.": ["未选择过滤条件。"], - "Editing 1 filter:": ["编辑1个过滤条件:"], - "Batch editing %d filters:": ["批量编辑 %d 个过滤条件:"], - "Configure filter scopes": ["配置过滤范围"], - "There are no filters in this dashboard.": ["此看板中没有过滤条件。"], - "Expand all": ["全部展开"], - "Collapse all": ["全部折叠"], - "This markdown component has an error.": ["此 markdown 组件有错误。"], - "This markdown component has an error. Please revert your recent changes.": [ - "此 markdown 组件有错误。请还原最近的更改。" + "The host \"%(hostname)s\" might be down, and can't be reached on port %(port)s.": [ + "主机 \"%(hostname)s\" 可能已关闭,无法通过端口访问 " ], - "Delete dashboard tab?": ["是否删除tab页?"], - "Divider": ["分隔"], - "Header": ["标题行"], - "Row": ["行"], - "Tabs": [""], - "Preview": ["预览"], - "Yes, cancel": ["是的,取消"], - "Keep editing": ["继续编辑"], - "Select parent filters": ["选择父级过滤"], - "Reset all": ["全部重置"], - "You have removed this filter.": ["您已删除此过滤条件。"], - "Restore filter": ["还原过滤条件"], - "Filter name": ["过滤值"], - "Name is required": ["需要名称"], - "Datasource is required": ["需要数据源"], - "Field": ["字段"], - "Parent filter": ["父级过滤"], - "None": ["空"], - "Apply changes instantly": ["立即应用更改"], - "Allow multiple selections": ["允许多选"], - "Inverse selection": ["反选"], - "Required": ["必填"], - "Are you sure you want to cancel?": ["您确定要取消吗?"], - "will not be saved.": ["不会被保存。"], - "Filter configuration and scoping": ["过滤配置和范围"], - "Add filter": ["增加过滤条件"], - "(Removed)": ["(已删除)"], - "Undo?": ["撤消?"], - "Scoping": ["范围"], - "Apply to all panels": ["应用于所有面板"], - "Apply to specific panels": ["应用于特定面板"], - "Only selected panels will be affected by this filter": [ - "只有选定的面板将受此过滤条件的影响" + "The host is invalid. Please verify that this field is entered correctly.": [ + "主机无效。请检查此字段是否输入正确。" + ], + "The host might be down, and can't be reached on the provided port.": [ + "主机可能宕机了,无法在所提供的端口上连接到它" + ], + "The hostname \"%(hostname)s\" cannot be resolved.": [ + "无法解析主机名 \"%(hostname)s\" " + ], + "The hostname provided can't be resolved.": ["提供的主机名无法解析。"], + "The id of the active chart": ["活动图表的ID"], + "The import was successful": ["导入成功"], + "The list of charts associated with this table. By altering this datasource, you may change how these associated charts behave. Also note that charts need to point to a datasource, so this form will fail at saving if removing charts from a datasource. If you want to change the datasource for a chart, overwrite the chart from the 'explore view'": [ + "与此表关联的图表列表。通过更改此数据源,您可以更改这些相关图表的行为。还要注意,图表需要指向数据源,如果从数据源中删除图表,则此窗体将无法保存。如果要为图表更改数据源,请从“浏览视图”更改该图表。" + ], + "The maximum number of events to return, equivalent to the number of rows": [ + "返回的最大事件数,相当于行数" + ], + "The maximum number of subdivisions of each group; lower values are pruned first": [ + "每组的最大细分数;较低的值首先被删除" + ], + "The maximum value of metrics. It is an optional configuration": [ + "度量的最大值。这是一个可选配置" + ], + "The metadata_params in Extra field is not configured correctly. The key %(key)s is invalid.": [ + "额外字段中的元数据参数配置不正确。键 %(key)s 无效。" + ], + "The metadata_params in Extra field is not configured correctly. The key %{key}s is invalid.": [ + "额外字段中的元数据参数配置不正确。键 %{key}s 无效。" + ], + "The metadata_params object gets unpacked into the sqlalchemy.MetaData call.": [ + "metadata_params对象被解压缩到sqlalchemy.metadata调用中。" + ], + "The minimum number of rolling periods required to show a value. For instance if you do a cumulative sum on 7 days you may want your \"Min Period\" to be 7, so that all data points shown are the total of 7 periods. This will hide the \"ramp up\" taking place over the first 7 periods": [ + "显示值所需的滚动周期的最小值。例如,如果您想累积 7 天的总额,您可能希望您的“最小周期”为 7,以便显示的所有数据点都是 7 个区间的总和。这将隐藏掉前 7 个阶段的“加速”效果" + ], + "The number color \"steps\"": ["色彩 \"Steps\" 数字"], + "The number of hours, negative or positive, to shift the time column. This can be used to move UTC time to local time.": [ + "用于移动时间列的小时数(负数或正数)。这可用于将UTC时间移动到本地时间" + ], + "The number of results displayed is limited to %(rows)d by the configuration DISPLAY_MAX_ROWS. Please add additional limits/filters or download to csv to see more rows up to the %(limit)d limit.": [ + "显示的结果数由配置DISPLAY_MAX_rows限制为 %(rows)d 。请添加其他限制/筛选器或下载到csv以查看更多行数,限制为 %(limit)d " + ], + "The number of results displayed is limited to %(rows)d. Please add additional limits/filters, download to csv, or contact an admin to see more rows up to the %(limit)d limit.": [ + "显示的结果数限制为 %(rows)d。请添加其他筛选器,下载到csv,或与管理员联系以查看 %(limit)d 的更多行”" + ], + "The number of rows displayed is limited to %(rows)d by the limit dropdown.": [ + "显示的行数通过限制下拉框限制为 %(rows)d 。" + ], + "The number of rows displayed is limited to %(rows)d by the query": [ + "查询将显示的行数限制为 %(rows)d " + ], + "The number of rows displayed is limited to %(rows)d by the query and limit dropdown.": [ + "查询和限制下拉列表将显示的行数限制为 %(rows)d" + ], + "The number of rows displayed is limited to %s by the dropdown.": [ + "通过下拉菜单显示的行数限制为 %s " + ], + "The number of seconds before expiring the cache": [ + "终止缓存前的时间(秒)" + ], + "The object does not exist in the given database.": [ + "源数据库中存在的表的名称" + ], + "The parameter %(parameters)s in your query is undefined.": [ + "查询中的以下参数未定义:%(parameters)s 。" + ], + "The password provided for username \"%(username)s\" is incorrect.": [ + "用户名 \"%(username)s\" 提供的密码不正确。" + ], + "The password provided when connecting to a database is not valid.": [ + "连接数据库时提供的密码无效。" + ], + "The passwords for the databases below are needed in order to import them together with the charts. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "需要以下数据库的密码才能将其与图表一起导入。请注意,数据库配置的 \"Secure Extra\" 和 \"Certificate\" 部分不在导出文件中,如果需要,应在导入后手动添加。" ], - "All panels with this column will be affected by this filter": [ - "包含此列的所有面板都将受到此过滤条件的影响" + "The passwords for the databases below are needed in order to import them together with the dashboards. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "需要以下数据库的密码才能将它们与仪表板一起导入。请注意,数据库配置的 \"Secure Extra\" 和 \"Certificate\" 部分不在导出文件中,如果需要,应在导入后手动添加。" ], - "All filters": ["所有过滤"], - "All charts": ["所有图表"], - "Warning! Changing the dataset may break the chart if the metadata does not exist.": [ - "警告!如果元数据不存在,更改数据集可能会破坏图表。" + "The passwords for the databases below are needed in order to import them together with the datasets. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "需要以下数据库的密码才能将其与数据集一起导入。请注意,数据库配置的 \"Secure Extra\" 和 \"Certificate\" 部分不在导出文件中,如果需要,应在导入后手动添加。" ], - "Changing the dataset may break the chart if the chart relies on columns or metadata that does not exist in the target dataset": [ - "如果图表依赖于目标数据集中不存在的列或元数据,则更改数据集可能会破坏图表" + "The passwords for the databases below are needed in order to import them together with the saved queries. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "需要以下数据库的密码才能将其与图表一起导入。请注意,数据库配置的 \"Secure Extra\" 和 \"Certificate\" 部分不在导出文件中,如果需要,应在导入后手动添加。" + ], + "The passwords for the databases below are needed in order to import them. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ + "需要以下数据库的密码才能导入它们。请注意,数据库配置的 \"Secure Extra\" 和 \"Certificate\" 部分不在导出文件中。如果需要,应在导入后手动添加。" ], - "dataset": ["数据集"], - "Change dataset": ["修改数据集"], - "Warning!": ["警告!"], - "Search / Filter": ["搜索 / 过滤"], - "Physical (table or view)": ["物理(表或视图)"], - "Virtual (SQL)": ["虚拟(SQL)"], - "SQL expression": ["SQL表达式"], - "Data type": ["数据类型"], - "Datetime format": ["时间格式"], "The pattern of timestamp format. For strings use ": [ "时间戳格式的模式。供字符串使用 " ], - "Python datetime string pattern": ["Python日期格式模板"], - " expression which needs to adhere to the ": [" 表达式并基于 "], - "ISO 8601": [""], - " standard to ensure that the lexicographical ordering\n coincides with the chronological ordering. If the\n timestamp format does not adhere to the ISO 8601 standard\n you will need to define an expression and type for\n transforming the string into a date or timestamp. Note\n currently time zones are not supported. If time is stored\n in epoch format, put `epoch_s` or `epoch_ms`. If no pattern\n is specified we fall back to using the optional defaults on a per\n database/column name level via the extra parameter.": [ - "来确保字符的表达顺序与时间顺序一致的标准。如果时间戳格式不符合 ISO 8601 标准,则需要定义表达式和类型,以便将字符串转换为日期或时间戳。注意:当前不支持时区。如果时间以epoch格式存储,请输入 `epoch_s` or `epoch_ms` 。如果没有指定任何模式,我们可以通过额外的参数在每个数据库/列名级别上使用可选的默认值。" + "The periodicity over which to pivot time. Users can provide\n \"Pandas\" offset alias.\n Click on the info bubble for more details on accepted \"freq\" expressions.": [ + "旋转时间的周期性。" ], - "Is dimension": ["维度"], - "Is filterable": ["可被过滤"], - "Modified columns: %s": ["修改的列:%s"], - "Removed columns: %s": ["删除的列:%s"], - "New columns added: %s": ["新增的列:%s"], - "Metadata has been synced": ["元数据已同步"], - "Column name [%s] is duplicated": ["列名 [%s] 重复"], - "Metric name [%s] is duplicated": ["指标名称 [%s] 重复"], - "Calculated column [%s] requires an expression": [ - "计算列 [%s] 需要一个表达式" + "The pixel radius": ["像素半径"], + "The pointer to a physical table (or view). Keep in mind that the chart is associated to this Superset logical table, and this logical table points the physical table referenced here.": [ + "指向物理表(或视图)的指针。请记住,图表将与此逻辑表相关联,并且此逻辑表指向此处引用的物理表。" ], - "Basic": ["基础"], - "Default URL": ["默认URL"], - "Default URL to redirect to when accessing from the dataset list page": [ - "从数据集列表页访问时重定向到的默认URL" + "The port is closed.": ["报告失败"], + "The port must be a whole number less than or equal to 65535.": [ + "`行限制` 必须大于或等于1" ], - "Autocomplete filters": ["自适配过滤条件"], - "Whether to populate autocomplete filters options": [ - "是否填充自适配过滤条件选项" + "The port number is invalid.": ["数据库参数无效"], + "The primary metric is used to define the arc segment sizes": [ + "主计量指标用于定义弧段大小。" ], - "Autocomplete query predicate": ["自动补全查询谓词"], - "When using \"Autocomplete filters\", this can be used to improve performance of the query fetching the values. Use this option to apply a predicate (WHERE clause) to the query selecting the distinct values from the table. Typically the intent would be to limit the scan by applying a relative time filter on a partitioned or indexed time-related field.": [ - "当使用 \"自适配过滤条件\" 时,这可以用来提高获取查询数据的性能。使用此选项可将谓词(WHERE子句)应用于从表中进行选择不同值的查询。通常,这样做的目的是通过对分区或索引的相关时间字段配置相对应的过滤时间来限制扫描。" + "The provided `rows` argument is not a valid integer.": [ + "提供的 `rows` 参数不是有效整数。" ], - "Extra data to specify table metadata. Currently supports certification data of the format: `{ \"certification\": { \"certified_by\": \"Data Platform Team\", \"details\": \"This table is the source of truth.\" } }`.": [ - "指定表元数据的额外内容。目前支持的认证数据格式为:`{ \"certification\": { \"certified_by\": \"Data Platform Team\", \"details\": \"This table is the source of truth.\" } }`." + "The query associated with the results was deleted.": [ + "删除与结果关联的查询。" ], - "Owners of the dataset": ["数据集的所有者"], - "Cache timeout": ["缓存时间"], - "The duration of time in seconds before the cache is invalidated": [ - "缓存失效前的持续时间(以秒为单位)" + "The query associated with these results could not be find. You need to re-run the original query.": [ + "找不到与这些结果相关联的查询。你需要重新运行查询" ], - "Hours offset": ["小时偏移"], - "Spatial": ["空间"], - "virtual": ["虚拟信息"], - "Dataset name": ["数据集名称"], - "When specifying SQL, the datasource acts as a view. Superset will use this statement as a subquery while grouping and filtering on the generated parent queries.": [ - "指定SQL时,数据源会充当视图。在对生成的父查询进行分组和筛选时,系统将使用此语句作为子查询。" + "The query contains one or more malformed template parameters.": [ + "该查询包含一个或多个格式不正确的模板参数。" ], - "The JSON metric or post aggregation definition.": [ - "JSON指标或处理聚合定义。" + "The query couldn't be loaded": ["这个查询无法被加载"], + "The query has a syntax error.": ["查询有语法错误。"], + "The query returned no data": ["查询无结果"], + "The query was killed after %(sqllab_timeout)s seconds. It might be too complex, or the database might be under heavy load.": [ + "查询在 %(sqllab_timeout)s 秒后被终止。它可能太复杂,或者数据库可能负载过重。" ], - "Physical": ["物理信息"], - "The pointer to a physical table (or view). Keep in mind that the chart is associated to this Superset logical table, and this logical table points the physical table referenced here.": [ - "指向物理表(或视图)的指针。请记住,图表将与此逻辑表相关联,并且此逻辑表指向此处引用的物理表。" + "The radius (in pixels) the algorithm uses to define a cluster. Choose 0 to turn off clustering, but beware that a large number of points (>1000) will cause lag.": [ + "算法用来定义一个簇的半径(以像素为单位)。选择0关闭聚,但要注意大量的点(>1000)会导致处理时间变长。" ], - "Click the lock to make changes.": ["单击锁以进行更改。"], - "Click the lock to prevent further changes.": [ - "单击锁定以防止进一步更改。" + "The radius of individual points (ones that are not in a cluster). Either a numerical column or `Auto`, which scales the point based on the largest cluster": [ + "单个点的半径(不在簇中的点)。一个数值列或“AUTO”,它根据最大的聚类来缩放点。" ], - "D3 format": ["D3 格式"], - "Warning message": ["告警信息"], - "Warning message to display in the metric selector": [ - "要在指标选择器中显示的警告消息" + "The report has been created": ["数据集已保存"], + "The results backend no longer has the data from the query.": [ + "结果后端不再拥有来自查询的数据。" ], - "Certified by": ["认证"], - "Person or group that has certified this metric": [ - "认证此指标的个人或团体" + "The results stored in the backend were stored in a different format, and no longer can be deserialized.": [ + "后端存储的结果以不同的格式存储,而且不再可以反序列化" ], - "Certification details": ["认证细节"], - "Details of the certification": ["认证详情"], - "Be careful.": ["小心。"], - "Changing these settings will affect all charts using this dataset, including charts owned by other people.": [ - "更改这些设置将影响使用此数据集的所有图表,包括其他人拥有的图表。" + "The rich tooltip shows a list of all series for that point in time": [ + "详细提示显示了该时间点的所有序列的列表。" ], - "Source": ["来源"], - "Sync columns from source": ["从源同步列"], - "Calculated columns": ["计算列"], - "The dataset has been saved": ["数据集已保存"], - "The dataset configuration exposed here\n affects all the charts using this dataset.\n Be mindful that changing settings\n here may affect other charts\n in undesirable ways.": [ - "这里公开的数据集配置会影响使用此数据集的所有图表。请注意,更改此处的设置可能会以未预想的方式影响其他图表。" + "The schema \"%(schema)s\" does not exist. A valid schema must be used to run this query.": [ + "表 \"%(schema)s\" 不存在。必须使用有效的表来运行此查询。" ], - "Are you sure you want to save and apply changes?": [ - "确实要保存并应用更改吗?" + "The schema \"%(schema_name)s\" does not exist. A valid schema must be used to run this query.": [ + "表 \"%(schema_name)s\" 不存在。必须使用有效的表来运行此查询。" ], - "Confirm save": ["确认保存"], - "Edit Dataset ": ["编辑数据集"], - "Use legacy datasource editor": ["使用旧数据源编辑器"], - "Time range": ["时间范围"], - "Time column": ["时间列"], - "Time grain": ["时间粒度(grain)"], - "Origin": ["起点"], - "Time granularity": ["时间粒度(granularity)"], - "A reference to the [Time] configuration, taking granularity into account": [ - "对 [时间] 配置的引用,会将粒度考虑在内" + "The schema was deleted or renamed in the database.": [ + "该列已在数据库中删除或重命名。" ], - "Group by": ["分组"], - "One or many controls to group by": ["一个或多个控件来分组"], - "One or many metrics to display": ["一个或多个指标显示"], - "Dataset": ["数据集"], - "Visualization type": ["可视化类型"], - "The type of visualization to display": ["要显示的可视化类型"], - "Fixed color": ["固定颜色"], - "Use this to define a static color for all circles": [ - "使用此定义所有圆圈的静态颜色" + "The size of the square cell, in pixels": [ + "平方单元的大小,以像素为单位" ], - "Right axis metric": ["右轴指标"], - "Choose a metric for right axis": ["为右轴选择一个指标"], - "Linear color scheme": ["线性颜色方案"], - "Color metric": ["颜色指标"], - "A metric to use for color": ["用于颜色的指标"], - "One or many controls to pivot as columns": ["一个或多个控件作为主列"], - "Defines the origin where time buckets start, accepts natural dates as in `now`, `sunday` or `1970-01-01`": [ - "定义时间桶的起点,接受 `now`,`sunday` 或 `1970-01-01` 等格式的日期表达" + "The submitted payload has the incorrect format.": [ + "提交的有效载荷格式不正确" ], - "The time granularity for the visualization. Note that you can type and use simple natural language as in `10 seconds`, `1 day` or `56 weeks`": [ - "可视化的时间粒度。请注意,您可以输入和使用简单的日期表达方式,如 `10 seconds`, `1 day` or `56 weeks`" + "The submitted payload has the incorrect schema.": [ + "提交的有效负载的模式不正确。" + ], + "The table \"%(table)s\" does not exist. A valid table must be used to run this query.": [ + "表 \"%(table)s\" 不存在。必须使用有效的表来运行此查询。" + ], + "The table \"%(table_name)s\" does not exist. A valid table must be used to run this query.": [ + "表 \"%(table_name)s\" 不存在。必须使用有效的表来运行此查询。" + ], + "The table was created. As part of this two-phase configuration process, you should now click the edit button by the new table to configure it.": [ + "表被创建。作为这两个阶段配置过程的一部分,您现在应该单击新表的编辑按钮来配置它。" + ], + "The table was deleted or renamed in the database.": [ + "Issue 1005 - 该表已在数据库中删除或重命名。" ], "The time column for the visualization. Note that you can define arbitrary expression that return a DATETIME column in the table. Also note that the filter below is applied against this column or expression": [ "可视化的时间栏。注意,您可以定义返回表中的DATETIMLE列的任意表达式。还请注意下面的筛选器应用于该列或表达式。" ], + "The time granularity for the visualization. Note that you can type and use simple natural language as in `10 seconds`, `1 day` or `56 weeks`": [ + "可视化的时间粒度。请注意,您可以输入和使用简单的日期表达方式,如 `10 seconds`, `1 day` or `56 weeks`" + ], "The time granularity for the visualization. This applies a date transformation to alter your time column and defines a new time granularity. The options here are defined on a per database engine basis in the Superset source code.": [ "可视化的时间粒度。这将应用日期转换来更改时间列,并定义新的时间粒度。这里的选项是在 Superset 源代码中的每个数据库引擎基础上定义的。" ], - "Last week": ["上周"], "The time range for the visualization. All relative times, e.g. \"Last month\", \"Last 7 days\", \"now\", etc. are evaluated on the server using the server's local time (sans timezone). All tooltips and placeholder times are expressed in UTC (sans timezone). The timestamps are then evaluated by the database using the engine's local timezone. Note one can explicitly set the timezone per the ISO 8601 format if specifying either the start and/or end time.": [ "可视化的时间范围。所有相关的时间,例如\"上个月\"、\"过去7天\"、\"现在\"等,都在服务器上使用服务器的本地时间(sans时区)进行计算。所有工具提示和占位符时间均以UTC(无时区)表示。然后,数据库使用引擎的本地时区来评估时间戳。注:如果指定开始时间和、或者结束时间,可以根据ISO 8601格式显式设置时区。" ], - "Row limit": ["行限制"], - "Series limit": ["序列限制"], - "Limits the number of time series that get displayed. A sub query (or an extra phase where sub queries are not supported) is applied to limit the number of time series that get fetched and displayed. This feature is useful when grouping by high cardinality dimension(s).": [ - "限制显示的时间序列的数量。应用子查询(或者不支持子查询)来限制获取和显示的时间序列的数量。在高基数维度(S)分组时,此特性是有用的。" + "The time unit for each block. Should be a smaller unit than domain_granularity. Should be larger or equal to Time Grain": [ + "每个块的时间单位。应该是主域域粒度更小的单位。应该大于或等于时间粒度" ], - "Sort by": ["排序 "], - "Metric used to define the top series": ["用于定义顶级序列的指标"], - "Series": ["序列"], - "Defines the grouping of entities. Each series is shown as a specific color on the chart and has a legend toggle": [ - "定义实体的分组。每个序列在图表上显示为特定颜色,并有一个可切换的图例" + "The time unit used for the grouping of blocks": ["用于块分组的时间单位"], + "The type of visualization to display": ["要显示的可视化类型"], + "The unit of measure for the specified point radius": [ + "指定点半径的度量单位" ], - "Entity": ["实体"], - "This defines the element to be plotted on the chart": [ - "这定义了要在图表上绘制的元素" + "The user seems to have been deleted": ["用户已经被删除"], + "The username \"%(username)s\" does not exist.": [ + "指标 '%(username)s' 不存在" ], - "X Axis": ["X 轴"], - "Metric assigned to the [X] axis": ["分配给 [X] 轴的指标"], - "Y Axis": ["Y 轴"], - "Metric assigned to the [Y] axis": ["分配给 [Y] 轴的指标"], - "Bubble size": ["气泡尺寸"], - "Y Axis Format": ["Y 轴格式化"], - "When `Calculation type` is set to \"Percentage change\", the Y Axis Format is forced to `.1%`": [ - "当设置“周期比”时,y轴格式强制为“1%”。" + "The username provided when connecting to a database is not valid.": [ + "连接到数据库时提供的用户名无效。" ], - "The color scheme for rendering chart": ["绘制图表的配色方案"], - "Color map": ["彩色地图"], - "description": ["描述"], - "bolt": ["螺栓"], - "Changing this control takes effect instantly": ["更改此控件立即生效。"], - "Customize": ["定制化配置"], - "rows retrieved": ["行被检索到"], - "Sorry, An error occurred": ["抱歉,发生错误"], - "No data": ["没有数据"], - "View samples": ["查看样例"], - "Search Metrics & Columns": ["搜索指标和列"], - "Showing %s of %s": ["显示 %s个 总计 %s个"], - "New chart": ["新增图表"], - "Edit properties": ["编辑属性"], - "View query": ["检查查询"], - "Run in SQL Lab": ["在 SQL 工具箱中执行"], - "Height": ["高度"], - "Width": ["宽度"], - "Export to .json": ["导出到 .json"], - "Export to .csv format": ["导出为 .csv 格式"], - "%s - untitled": ["%s - 无标题"], - "Edit chart properties": ["编辑图表属性"], - "Control labeled ": ["控件名称为 "], - "Open Datasource tab": ["打开数据源tab"], - "You do not have permission to edit this chart": [ - "您没有编辑此图表的权限" + "The way the ticks are laid out on the X-axis": ["X轴记号的排列显示方式"], + "There are associated alerts or reports": ["存在关联的警报或报告"], + "There are associated alerts or reports: %s,": [ + "存在关联的警报或报告:%s," + ], + "There are no filters in this dashboard.": ["此看板中没有过滤条件。"], + "There are unsaved changes.": ["您有一些未保存的修改。"], + "There is a syntax error in the SQL query. Perhaps there was a misspelling or a typo.": [ + "Issue 1003 - SQL查询中存在语法错误。可能是拼写错误或是打错关键字。" + ], + "There is no chart definition associated with this component, could it have been deleted?": [ + "没有与此组件关联的图表定义,是否已将其删除?" + ], + "There is not enough space for this component. Try decreasing its width, or increasing the destination width.": [ + "此组件没有足够的空间。请尝试减小其宽度,或增加目标宽度。" + ], + "There was an error fetching the favorite status: %s": [ + "获取此看板的收藏夹状态时出现问题。" + ], + "There was an error fetching your recent activity:": [ + "获取您最近的活动时出错:" + ], + "There was an error loading the schemas": [ + "抱歉,这个看板在获取图表时发生错误:" + ], + "There was an error loading the tables": ["您的请求有错误"], + "There was an error saving the favorite status: %s": [ + "获取此看板的收藏夹状态时出现问题: %s" + ], + "There was an error with your request": ["您的请求有错误"], + "There was an issue deleting %s: %s": ["删除 %s 时出现问题:%s"], + "There was an issue deleting the selected %s: %s": [ + "删除所选 %s 时出现问题: %s" + ], + "There was an issue deleting the selected annotations: %s": [ + "删除所选注释时出现问题:%s" + ], + "There was an issue deleting the selected charts: %s": [ + "删除所选图表时出现问题:%s" + ], + "There was an issue deleting the selected dashboards: ": [ + "删除所选仪表板时出现问题:" + ], + "There was an issue deleting the selected datasets: %s": [ + "删除选定的数据集时出现问题:%s" + ], + "There was an issue deleting the selected layers: %s": [ + "删除所选图层时出现问题:%s" + ], + "There was an issue deleting the selected queries: %s": [ + "删除所选查询时出现问题:%s" + ], + "There was an issue deleting the selected templates: %s": [ + "删除所选模板时出现问题:%s" + ], + "There was an issue deleting: %s": ["删除时出现问题:%s"], + "There was an issue favoriting this dashboard.": [ + "收藏看板时候出现问题。" + ], + "There was an issue fetching reports attached to this dashboard.": [ + "获取此看板的收藏夹状态时出现问题。" + ], + "There was an issue fetching the favorite status of this dashboard.": [ + "获取此看板的收藏夹状态时出现问题。" + ], + "There was an issue fetching your recent activity: %s": [ + "获取您最近的活动时出错:" + ], + "There was an issue previewing the selected query %s": [ + "预览所选查询时出现问题 %s" + ], + "There was an issue previewing the selected query. %s": [ + "预览所选查询时出现问题。%s" + ], + "There was an issues fetching your chart: %s": ["删除时出现问题:%s"], + "There was an issues fetching your dashboards: %s": [ + "删除所选仪表板时出现问题:" + ], + "There was an issues fetching your saved queries: %s": [ + "删除所选查询时出现问题:%s" ], - "The description can be displayed as widget headers in the dashboard view. Supports markdown.": [ - "作为为小部件标题可以在仪表板视图中显示的描述,支持markdown格式语法。" + "There's a loop in your Sankey, please provide a tree. Here's a faulty link: {}": [ + "桑基图里面有一个循环,请提供一棵树。这是一个错误的链接:{}" ], - "Configuration": ["配置"], - "Duration (in seconds) of the caching timeout for this chart. Note this defaults to the dataset's timeout if undefined.": [ - "此图表的缓存超时前的持续时间(秒)。请注意,如果未定义则默认为数据集的超时时间。" + "These are the tables this filter will be applied to.": [ + "这些是将应用此过滤的表。" ], - "A list of users who can alter the chart. Searchable by name or username.": [ - "有权处理该图表的用户列表。可按名称或用户名搜索。" + "These filters apply to the values available in the dropdowns": [ + "这些过滤器应用于下拉列表中的可用值" ], - "rows": ["行"], - "Limit reached": ["达到限制"], - "**Select** a dashboard OR **create** a new one": [ - "**选择** 一个看板或者 **创建** 一个看板" + "These parameters are generated dynamically when clicking the save or overwrite button in the explore view. This JSON object is exposed here for reference and for power users who may want to alter specific parameters.": [ + "这些参数是在浏览视图中单击保存或覆盖按钮时动态生成的。这个JSON对象在这里公开以供参考,并提供给可能希望更改特定参数的高级用户使用。" ], - "Please enter a chart name": ["请输入图表名称"], - "Save chart": ["图表保存"], - "Save & go to dashboard": ["保存并转到看板"], - "Save as new chart": ["创建新图表"], - "Save (Overwrite)": ["保存(覆盖)"], - "Save as ...": ["另存为"], - "Chart name": ["图表名称"], - "Add to dashboard": ["添加到看板"], - "Display configuration": ["显示配置"], - "Configure your how you overlay is displayed here.": [ - "配置如何在这里显示您的覆盖。" + "This JSON object is generated dynamically when clicking the save or overwrite button in the dashboard view. It is exposed here for reference and for power users who may want to alter specific parameters.": [ + "这个JSON对象描述了部件在看板中的位置。它是动态生成的,可以通过拖放,在看板中调整整部件的大小和位置" ], - "Style": ["风格"], - "Opacity": ["不透明度"], - "Color": ["颜色"], - "Line width": ["线宽"], - "Layer configuration": ["配置Layer"], - "Configure the basics of your Annotation Layer.": ["注释层基本配置"], - "Mandatory": ["必填参数"], - "Hide layer": ["隐藏Layer"], - "Choose the annotation layer type": ["选择注释层类型"], - "Annotation layer type": ["注释层类型"], - "Remove": ["删除"], - "Edit annotation layer": ["添加注释层"], - "Add annotation layer": ["添加注释层"], - "`Min` value should be numeric or empty": ["最小值应该是数字或空的"], - "`Max` value should be numeric or empty": ["最大值应该是数字或空的"], - "Min": ["最小值"], - "Max": ["最大值"], - "Edit dataset": ["编辑数据集"], - "View in SQL Lab": ["在 SQL 工具箱中公开"], - "More dataset related options": ["更多数据集相关选项"], - "Superset supports smart date parsing. Strings like `3 weeks ago`, `last sunday`, or `2 weeks from now` can be used.": [ - "系统支持智能的时间格式化。文本类似 `last sunday` 或者 `last october`这样的语句也可以被识别。" + "This action will permanently delete %s.": ["此操作将永久删除 %s 。"], + "This action will permanently delete the layer.": [ + "此操作将永久删除图层。" ], - "Default": ["默认"], - "(optional) default value for the filter, when using the multiple option, you can use a semicolon-delimited list of options.": [ - "过滤器的默认值,当使用多选框的时候,您可以使用带分号的分隔列表。" + "This action will permanently delete the saved query.": [ + "此操作将永久删除保存的查询。" ], - "Sort metric": ["排序指标"], - "Metric to sort the results by": ["按照指标的结果进行排序"], - "Sort ascending": ["升序排序"], - "Check for sorting ascending": ["按照升序进行排序"], - "Multiple selections allowed, otherwise filter is limited to a single value": [ - "允许多选下拉框,不勾选的话过滤器就是单选下拉框" + "This action will permanently delete the template.": [ + "此操作将永久删除模板。" ], - "Search all filter options": ["搜索所有过滤选项"], - "By default, each filter loads at most 1000 choices at the initial page load. Check this box if you have more than 1000 filter values and want to enable dynamically searching that loads filter values as users type (may add stress to your database).": [ - "默认情况下,每个过滤器在初始页面加载时最多加载1000个选项。如果您有超过1000个过滤值,并且希望启用动态搜索,以便在键入时加载筛选值(可能会给数据库增加压力),请选中此框。" + "This can be either an IP address (e.g. 127.0.0.1) or a domain name (e.g. mydatabase.com).": [ + "这可以是一个IP地址(例如127.0.0.1)或一个域名(例如127.0.0.1)" ], - "User must select a value for this filter": [ - "用户必须给过滤器选择一个值" + "This chart has been moved to a different filter scope.": [ + "此图表已移至其他过滤器范围内。" ], - "Filter configuration": ["过滤配置"], - "Error while fetching data": ["获取数据时出错"], - "No results found": ["未找到结果"], - "%s option(s)": ["%s 个选项"], - "Invalid lat/long configuration.": ["错误的经纬度配置。"], - "Reverse lat/long ": ["经纬度互换"], - "Longitude & Latitude columns": ["经纬度字段"], - "Delimited long & lat single column": ["经度&纬度单列限定"], - "Multiple formats accepted, look the geopy.points Python library for more details": [ - "接受多种格式,查看geopy.points库以获取更多细节" + "This chart might be incompatible with the filter (datasets don't match)": [ + "此图表可能与过滤器不兼容(数据集不匹配)" ], - "Geohash": ["Geo哈希"], - "textarea": ["文本区域"], - "in modal": ["(在模型中)"], - "Time series columns": ["时间序列的列"], - "This visualization type is not supported.": ["选择可视化类型"], - "Click to change visualization type": ["选择一个可视化类型"], - "Select a visualization type": ["选择一个可视化类型"], - "Failed to verify select options: %s": ["验证选择选项失败:%s"], - "RANGE TYPE": ["范围类型"], - "Actual time range": ["实际时间范围"], - "CANCEL": ["取消"], - "APPLY": ["应用"], - "Edit time range": ["编辑时间范围"], - "Configure advanced time range": ["配置高级时间范围"], - "START": ["开始"], - "END": ["结束"], - "Configure Time Range: Previous...": ["配置时间范围:前一(Previous).."], - "Configure Time Range: Last...": ["配置时间范围:上一(Last).."], - "Configure custom time range": ["配置自定义时间范围"], - "Relative quantity": ["相对量"], - "Anchor to": ["锚定到"], - "NOW": ["现在"], - "Date/Time": ["日期/时间"], - "Simple": ["简单配置"], - "Custom SQL": ["自定义SQL"], - "No such column found. To filter on a metric, try the Custom SQL tab.": [ - "没有发现这样的列。若要在度量值上筛选,请尝试自定义SQL选项卡。" + "This color scheme is being overriden by custom label colors.\n Check the JSON metadata in the Advanced settings": [ + "此配色方案正被自定义标签颜色覆盖。" ], - "%s column(s) and metric(s)": ["%s 列与计量指标"], - "%s column(s)": ["%s 列"], - "To filter on a metric, use Custom SQL tab.": [ - "若要在计量值上筛选,请使用自定义SQL选项卡。" + "This column must contain date/time information.": [ + "包含行信息的数据库列" ], - "%s operators(s)": ["%s 运算符"], - "Type a value here": ["在这里键入一个值"], - "Filter value (case sensitive)": ["过滤值(区分大小写)"], - "choose WHERE or HAVING...": ["选择WHERE或HAVING子句..."], - "Filters by columns": ["按列过滤"], - "Filters by metrics": ["按指标过滤"], - "\n This filter was inherited from the dashboard's context.\n It won't be saved when saving the chart.\n ": [ - "此过滤条件是从看板上下文继承的。保存图表时不会保存。" + "This dashboard is currently auto refreshing; the next auto refresh will be in %s.": [ + "此看板当前正在强制刷新;下一次强制刷新将在 %s 内执行。" ], - "%s aggregates(s)": ["%s 聚合"], - "%s saved metric(s)": ["%s 列与计量指标"], - "Saved": ["保存"], - "Saved metric": ["保存的指标"], - "column": ["列"], - "aggregate": ["合计"], - "My metric": ["我的指标"], - "Add metric": ["添加指标"], - "Code": ["代码"], - "Markup type": ["Markup 格式"], - "Pick your favorite markup language": ["选择您最爱的 Markup 语言"], - "Put your code here": ["把您的代码放在这里"], - "Query": ["查询"], - "URL": ["URL 地址"], - "Templated link, it's possible to include {{ metric }} or other values coming from the controls.": [ - "模板链接,可以包含{{度量}}或来自控件的其他值。" + "This dashboard is not published which means it will not show up in the list of dashboards. Favorite it to see it there or access it by using the URL directly.": [ + "此看板未发布,这意味着它不会显示在仪表板列表中。您可以进行收藏并在收藏栏中查看或直接使用URL访问它。" ], - "Time": ["时间"], - "Time related form attributes": ["时间相关的表单属性"], - "Chart type": ["图表类型"], - "Chart ID": ["图表 ID"], - "The id of the active chart": ["活动图表的ID"], - "Cache Timeout (seconds)": ["缓存超时(秒)"], - "The number of seconds before expiring the cache": [ - "终止缓存前的时间(秒)" + "This dashboard is not published, it will not show up in the list of dashboards. Click here to publish this dashboard.": [ + "此看板未发布,它将不会显示在看板列表中。单击此处以发布此看板。" ], - "URL parameters": ["URL 参数"], - "Extra parameters for use in jinja templated queries": [ - "用于jinja模板化查询的额外参数" + "This dashboard is now hidden": ["无法修改该看板"], + "This dashboard is now published": ["当前看板 ${nowPublished}"], + "This dashboard is published. Click to make it a draft.": [ + "此看板已发布。单击以使其成为草稿。" ], - "Time range endpoints": ["时间范围端点"], - "Time range endpoints (SIP-15)": ["时间范围端点 (SIP-15)"], - "Annotations and layers": ["注释与注释层"], - "Sort descending": ["降序"], - "Whether to sort descending or ascending": ["是降序还是升序排序"], - "Contribution": ["贡献"], - "Compute the contribution to the total": ["计算对总数的贡献值"], - "Advanced analytics": ["高级分析"], - "This section contains options that allow for advanced analytical post processing of query results": [ - "本节包含允许对查询结果进行高级分析处理后的选项。" + "This dashboard was changed recently. Please reload dashboard to get latest version.": [ + "此看板最近已更新。请重新加载看板以获取最新版本。" ], - "Rolling window": ["滚动窗口"], - "Rolling function": ["滚动函数"], - "Defines a rolling window function to apply, works along with the [Periods] text box": [ - "定义要应用的滚动窗口函数,与 [期限] 文本框一起使用" + "This dashboard was saved successfully.": ["该看板已成功保存。"], + "This defines the element to be plotted on the chart": [ + "这定义了要在图表上绘制的元素" ], - "Periods": ["周期"], - "Defines the size of the rolling window function, relative to the time granularity selected": [ - "定义滚动窗口函数的大小,相对于所选的时间粒度" + "This defines the level of the hierarchy": ["该选项定义了层次级别"], + "This feature is deprecated and will be removed on 2.0. Take a look at the replacement feature <a href='https://superset.apache.org/docs/installation/alerts-reports'>Alerts & Reports documentation</a>": [ + "此功能已弃用,将在2.0中删除。" ], - "Min periods": ["最小周期"], - "The minimum number of rolling periods required to show a value. For instance if you do a cumulative sum on 7 days you may want your \"Min Period\" to be 7, so that all data points shown are the total of 7 periods. This will hide the \"ramp up\" taking place over the first 7 periods": [ - "显示值所需的滚动周期的最小值。例如,如果您想累积 7 天的总额,您可能希望您的“最小周期”为 7,以便显示的所有数据点都是 7 个区间的总和。这将隐藏掉前 7 个阶段的“加速”效果" + "This fields acts a Superset view, meaning that Superset will run a query against this string as a subquery.": [ + "这个字段执行Superset视图时,意味着Superset将以子查询的形式对字符串运行查询。" ], - "Time comparison": ["时间比较"], - "Time shift": ["时间偏移"], - "Overlay one or more timeseries from a relative time period. Expects relative time deltas in natural language (example: 24 hours, 7 days, 52 weeks, 365 days). Free text is supported.": [ - "从相对时间段覆盖一个或多个时间序列。期望自然语言中的相对时间增量(例如:24小时、7天、56周、365天)" + "This filter doesn't exist in dashboard. It will not be applied.": [ + "此过滤器在仪表板中不存在。它不会被应用。" ], - "Calculation type": ["计算类型"], - "How to display time shifts: as individual lines; as the absolute difference between the main time series and each time shift; as the percentage change; or as the ratio between series and time shifts.": [ - "如何显示时间偏移:作为单独的行显示;作为主时间序列与每次时间偏移之间的绝对差显示;作为百分比变化显示;或作为序列与时间偏移之间的比率显示。" + "This filter set is identical to: \"%s\"": ["此过滤器集等同于: \"%s\" "], + "This is the condition that will be added to the WHERE clause. For example, to only return rows for a particular client, you might define a regular filter with the clause `client_id = 9`. To display no rows unless a user belongs to a RLS filter role, a base filter can be created with the clause `1 = 0` (always false).": [ + "这是将会添加到WHERE子句的条件。例如,要仅返回特定客户端的行,可以使用子句 `client_id = 9` 定义常规过滤。若要在用户不属于RLS过滤角色的情况下不显示行,可以使用子句 `1 = 0`(始终为false)创建基本过滤。" ], - "Python functions": ["Python函数"], - "Rule": ["规则"], - "Pandas resample rule": ["Pandas 重新采样的规则"], - "Method": ["方法"], - "Pandas resample method": ["Pandas 重新采样的填充方法"], - "Favorites": ["收藏"], - "Created content": ["创建的内容"], - "Recent activity": ["近期活动"], - "Security & Access": ["安全 & 访问"], - "No charts": ["没有图表"], - "No dashboards": ["没有看板"], - "No favorite charts yet, go click on stars!": [ - "暂无收藏的图表,去点击星星吧!" + "This json object describes the positioning of the widgets in the dashboard. It is dynamically generated when adjusting the widgets size and positions by using drag & drop in the dashboard view": [ + "这个JSON对象描述了部件在看板中的位置。它是动态生成的,可以通过拖放,在看板中调整整部件的大小和位置" ], - "No favorite dashboards yet, go click on stars!": [ - "暂无收藏的看板,去点击星星吧!" + "This markdown component has an error.": ["此 markdown 组件有错误。"], + "This markdown component has an error. Please revert your recent changes.": [ + "此 markdown 组件有错误。请还原最近的更改。" ], - "Profile picture provided by Gravatar": ["资料图片由 Gravatar 提供"], - "joined": ["已加入"], - "id:": ["id:"], - "There was an error fetching your recent activity:": [ - "获取您最近的活动时出错:" + "This may be triggered by:": ["这可能由以下因素触发:"], + "This query took %s seconds to run, ": ["这个查询使用了 %s 秒去执行,"], + "This section allows you to configure how to use the slice\n to generate annotations.": [ + "此部分允许您配置如何使用切片生成注释。" ], - "Deleted: %s": ["已删除:%s"], - "There was an issue deleting: %s": ["删除时出现问题:%s"], - "There was an issue deleting %s: %s": ["删除 %s 时出现问题:%s"], - "report": ["报告"], - "alert": ["警报"], - "reports": ["报告"], - "alerts": ["警报"], - "There was an issue deleting the selected %s: %s": [ - "删除所选 %s 时出现问题: %s" + "This section contains options that allow for advanced analytical post processing of query results": [ + "本节包含允许对查询结果进行高级分析处理后的选项。" ], - "Last run": ["上次执行"], - "Notification method": ["通知方式"], - "Execution log": ["操作日志"], - "Actions": ["操作"], - "Bulk select": ["批量选择"], - "No %s yet": ["还没有相关的%s数据"], - "Created by": ["创建人"], - "An error occurred while fetching created by values: %s": [ - "获取创建人时出错:%s" + "This value should be greater than the left target value": [ + "这个值应该大于左边的目标值" + ], + "This value should be smaller than the right target value": [ + "这个值应该小于正确的目标值" + ], + "This visualization type is not supported.": ["选择可视化类型"], + "This was triggered by:": ["这是由以下因素引发的:"], + "Threshold alpha level for determining significance": [ + "确定重要性的阈值α水平" + ], + "Thursday": ["星期四"], + "Time": ["时间"], + "Time Column": ["时间列"], + "Time Comparison": ["时间比对"], + "Time Format": ["时间格式"], + "Time Grain": ["时间粒度(Grain)"], + "Time Granularity": ["时间粒度(Granularity)"], + "Time Offset": ["时间偏移"], + "Time Range": ["时间范围"], + "Time Series": ["时间序列"], + "Time Series - Bar Chart": ["时间序列 - 柱状图"], + "Time Series - Dual Axis Line Chart": ["时间序列-双轴线图"], + "Time Series - Line Chart": ["时间序列-折线图"], + "Time Series - Multiple Line Charts": ["时间序列-多线图"], + "Time Series - Nightingale Rose Chart": ["时间序列 - 南丁格尔玫瑰图"], + "Time Series - Paired t-test": ["时间序列 - 配对t检验"], + "Time Series - Percent Change": ["时间序列 - 百分比变化"], + "Time Series - Period Pivot": ["时间序列 - 周期透视表"], + "Time Series - Stacked": ["时间序列 - 堆积图"], + "Time Series Options": ["时间序列的列"], + "Time Shift": ["时间偏移"], + "Time Table View": ["时间表视图"], + "Time column": ["时间列"], + "Time column \"%(col)s\" does not exist in dataset": [ + "时间列 \"%(col)s\" 在数据集中不存在" ], - "Status": ["状态"], - "Working": ["正在执行"], - "Error": ["错误"], - "Not triggered": ["没有触发"], - "On Grace": ["在宽限期内"], - "Alerts & reports": ["警报和报告"], - "Reports": ["报告"], - "This action will permanently delete %s.": ["此操作将永久删除 %s 。"], - "Delete %s?": ["需要删除 %s 吗?"], - "Please confirm": ["请确认"], - "Are you sure you want to delete the selected %s?": [ - "确实要删除选定的 %s 吗?" + "Time column filter plugin": ["选择过滤器"], + "Time comparison": ["时间比较"], + "Time delta is ambiguous. Please specify [%(human_readable)s ago] or [%(human_readable)s later].": [ + "时间是模糊的。" ], - "< (Smaller than)": ["< (小于)"], - "> (Larger than)": ["> (大于)"], - "<= (Smaller or equal)": ["<= (小于等于)"], - ">= (Larger or equal)": [">= (大于等于)"], - "== (Is equal)": ["== (等于)"], - "!= (Is not equal)": ["!= (不等于)"], - "Not null": ["非空"], - "30 days": ["30天"], - "60 days": ["60天"], - "90 days": ["90天"], - "Add notification method": ["添加注释层"], - "Add delivery method": ["添加通知方法"], - "Recipients are separated by \",\" or \";\"": [ - "收件人之间用 \",\" 或者 \";\" 隔开" + "Time expression to use as a predicate when retrieving distinct values to populate the filter component. Only applies when `Enable Filter Select` is on. If you enter `7 days ago`, the distinct list of values in the filter will be populated based on the distinct value over the past week": [ + "当检索不同的值以填充过滤器组件时,时间表达式用作条件。只适用于`启用过滤器选择`。如果您输入`7天前`,将根据过去一周的不同值来填充ilter中不同的值列表" ], - "Add": ["新增"], - "Edit ${isReport ? 'Report' : 'Alert'}": [ - "编辑 ${isReport ? '报告' : '警报'}" + "Time filter": ["日期过滤器"], + "Time format": ["时间格式"], + "Time grain": ["时间粒度(grain)"], + "Time grain filter plugin": ["范围过滤器"], + "Time grain missing": ["时间粒度缺失"], + "Time granularity": ["时间粒度(granularity)"], + "Time in seconds": ["时间(秒)"], + "Time range": ["时间范围"], + "Time range endpoints": ["时间范围端点"], + "Time range endpoints (SIP-15)": ["时间范围端点 (SIP-15)"], + "Time related form attributes": ["时间相关的表单属性"], + "Time series columns": ["时间序列的列"], + "Time shift": ["时间偏移"], + "Time string is ambiguous. Please specify [%(human_readable)s ago] or [%(human_readable)s later].": [ + "时间字符串是模糊的。" ], - "Add ${isReport ? 'Report' : 'Alert'}": [ - "新增 ${isReport ? '报告' : '警报'}" + "Time-series Area Chart": ["时间序列条形图"], + "Time-series Area chart are similar to line chart in that they represent variables with the same scale, but area charts stack the metrics on top of each other. An area chart in Superset can be stream, stack, or expand.": [ + "时间序列面积图与折线图相似,因为它们表示具有相同比例的变量,但面积图将度量叠加在一起。超级集中的面积图可以是流式、堆栈式或展开式" ], - "Report name": ["报告名称"], - "Alert name": ["警报名称"], - "Alert condition": ["警报状态"], - "Trigger Alert If...": ["如果 ... 则触发警报"], - "Value": ["值"], - "Report schedule": ["报告时间表"], - "Alert condition schedule": ["警报条件计划"], - "Schedule settings": ["计划设置"], - "Log retention": ["日志保留"], - "Working timeout": ["执行超时"], - "Time in seconds": ["时间(秒)"], - "Grace period": ["宽限期"], - "Message content": ["消息内容"], - "log": ["日志"], - "State": ["状态"], - "Scheduled at": ["计划时间"], - "Start at": ["开始/从"], - "Duration": ["持续时间"], - "Error message": ["错误信息"], - "${alertResource?.type}": [""], - "CRON expression": ["CRON表达式"], - "Report sent": ["已发送报告"], - "Alert triggered, notification sent": ["警报已触发,通知已发送"], - "Report sending": ["报告发送"], - "Alert running": ["警报运行"], - "Report failed": ["报告失败"], - "Alert failed": ["警报失败"], - "Nothing triggered": ["无触发"], - "Alert Triggered, In Grace Period": ["警报已触发,在宽限期内"], - "Email": [""], - "Slack": [""], - "annotation": ["注释"], - "There was an issue deleting the selected annotations: %s": [ - "删除所选注释时出现问题:%s" + "Time-series Bar Chart": ["时间序列-条形图"], + "Time-series Bar Chart v2": ["时间序列条形图 v2"], + "Time-series Bar Charts are used to show the changes in a metric over time as a series of bars.": [ + "时间序列条形图用于显示指标随时间的变化" ], - "Edit annotation": ["编辑注释"], - "Delete annotation": ["删除注释"], - "Annotation": ["注释"], - "No annotation yet": ["没有注释"], - "Annotation Layer ${annotationLayerName}": [ - "注释层 ${annotationLayerName}" + "Time-series Chart": ["时间序列图"], + "Time-series Line Chart": ["时间序列折线图"], + "Time-series Percent Change": ["时间序列-百分比变化"], + "Time-series Period Pivot": ["时间序列-周期轴"], + "Time-series Scatter Plot": ["时间序列散点图"], + "Time-series Scatter Plot has time on the horizontal axis in linear units, and the points are connected in order. It shows a statistical relationship between two variables.": [ + "时间序列散点图在水平轴上以线性单位表示时间,点按顺序连接。它显示了两个变量之间的统计关系" ], - "Are you sure you want to delete ${annotationCurrentlyDeleting?.short_descr}?": [ - "请确认您想删除 ${annotationCurrentlyDeleting?.short_descr}?" + "Time-series Smooth Line": ["时间序列光滑曲线图"], + "Time-series Smooth-line is a variation of line chart. Without angles and hard edges, Smooth-line looks more smarter and more professional.": [ + "时间序列平滑线是折线图的变体。没有角度和硬边,平滑线看起来更聪明、更专业。" ], - "Delete Annotation?": ["删除注释?"], - "Are you sure you want to delete the selected annotations?": [ - "确实要删除选定的注释吗?" + "Time-series Stepped Line": ["时间序列阶梯图"], + "Time-series Stepped-line graph (also called step chart) is a variation of line chart but with the line forming a series of steps between data points. A step chart can be useful when you want to show the changes that occur at irregular intervals.": [ + "“时间序列步进折线图(也称为步进图)是折线图的一种变体,但线条在数据点之间形成一系列步进。当您希望显示不规则间隔发生的变化时,步进图可能很有用。”" ], - "Add annotation": ["添加注释"], - "Annotation name": ["注释名称"], - "date": ["日期"], - "Additional information": ["附加信息"], - "Description (this can be seen in the list)": ["说明(见列表)"], - "annotation_layer": ["注释层"], - "Edit annotation layer properties": ["编辑注释图层属性"], - "Annotation layer name": ["注释层名称"], - "Annotation layers": ["注解层"], - "There was an issue deleting the selected layers: %s": [ - "删除所选图层时出现问题:%s" + "Time-series Table": ["时间序列-表格"], + "Time-series line chart is used to visualize repeated measurements taken over regular time intervals. Line chart is a type of chart which displays information as a series of data points connected by straight line segments. It is a basic type of chart common in many fields.": [ + "时间序列折线图用于可视化在规则时间间隔内进行的重复测量。折线图是一种图表,它将信息显示为一系列由直线段连接的数据点。它是许多领域中常见的一种基本类型的图表。" ], - "Last modified": ["最后修改"], - "Created on": ["创建日期"], - "Edit template": ["编辑模板"], - "Delete template": ["删除模板"], - "Annotation layer": ["注释层"], - "An error occurred while fetching dataset datasource values: %s": [ - "获取数据集数据源信息时出错: %s" + "Timeout error": ["超时错误"], + "Timestamp Format": ["时间戳格式"], + "Timestamp format": ["时间戳格式"], + "Timezone": ["时区"], + "Timezone offset (in hours) for this datasource": [ + "数据源的时差(单位:小时)" ], - "No annotation layers yet": ["没有注释层"], - "This action will permanently delete the layer.": [ - "此操作将永久删除图层。" + "Timezone selector": ["时区选择"], + "Tiny": ["微小"], + "Title": ["标题"], + "Title Column": ["标题栏"], + "Title is required": ["标题是必填项"], + "Title or Slug": ["标题或者Slug"], + "To filter on a metric, use Custom SQL tab.": [ + "若要在计量值上筛选,请使用自定义SQL选项卡。" ], - "Delete Layer?": ["确定删除图层?"], - "Are you sure you want to delete the selected layers?": [ - "确实要删除选定的图层吗?" + "To get a readable URL for your dashboard": ["为看板生成一个可读的 URL"], + "Toggle chart description": ["切换图表说明"], + "Tools": ["工具"], + "Tooltip": ["详细提示"], + "Tooltip sort by metric": ["排序指标"], + "Tooltip time format": ["时间格式"], + "Top": ["顶部"], + "Top to Bottom": ["点击回顶部"], + "Totals": ["显示总计"], + "Track job": ["跟踪任务"], + "Transformable": ["转换"], + "Transparent": ["透明"], + "Transpose Pivot": ["转置透视图"], + "Transpose pivot": ["转置透视图"], + "Tree Chart": ["树状图"], + "Tree layout": ["布局"], + "Tree orientation": ["方向"], + "Treemap": ["树状地图"], + "Treemap v2": ["树状地图 v2"], + "Trend": ["趋势"], + "Triangle": ["三角形"], + "Trigger Alert If...": ["如果 ... 则触发警报"], + "Truncate Y Axis": ["截断Y轴"], + "Truncate Y Axis. Can be overridden by specifying a min or max bound.": [ + "截断Y轴。可以通过指定最小或最大界限来重写。" ], - "Are you sure you want to delete": ["确定要删除吗"], - "Last modified %s": ["最后修改 %s"], - "The passwords for the databases below are needed in order to import them together with the charts. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "需要以下数据库的密码才能将其与图表一起导入。请注意,数据库配置的 \"Secure Extra\" 和 \"Certificate\" 部分不在导出文件中,如果需要,应在导入后手动添加。" + "Truncates the specified date to the accuracy specified by the date unit.": [ + "将指定的日期截取为指定的日期单位精度。" ], - "You are importing one or more charts that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ - "您正在导入一个或多个已存在的图表。覆盖可能会导致您丢失一些工作。您确定要覆盖吗?" + "Try applying different filters or ensuring your datasource has data": [ + "尝试应用不同的筛选器或确保您的数据源包含数据。“" ], - "There was an issue deleting the selected charts: %s": [ - "删除所选图表时出现问题:%s" + "Tuesday": ["星期二"], + "Type": ["类型"], + "Type \"%s\" to confirm": ["键入 \"%s\" 来确认"], + "Type a value": ["请输入值"], + "Type a value here": ["请输入值"], + "Type is required": ["类型是必需的"], + "Type of Google Sheets allowed": ["接受Google Sheets的类型"], + "Type or Select [%s]": ["键入或选择 [%s]"], + "UI Configuration": ["UI 配置"], + "URL": ["URL 地址"], + "URL Parameters": ["URL参数"], + "URL could not be identified": ["无法识别的URL。"], + "URL parameters": ["URL 参数"], + "URL slug": ["使用 Slug"], + "Unable to add a new tab to the backend. Please contact your administrator.": [ + "无法将新选项卡添加到后端。请与管理员联系。" ], - "Modified by": ["修改人"], - "Owner": ["所有者"], - "An error occurred while fetching chart owners values: %s": [ - "获取图表所有者时出错 %s" + "Unable to connect to catalog named \"%(catalog_name)s\".": [ + "无法连接到名为%(catalog_name)s的目录。" ], - "An error occurred while fetching chart created by values: %s": [ - "获取图表的创建人时出错:%s" + "Unable to connect to database \"%(database)s\".": [ + "不能连接到数据库\"%(database)s\"" ], - "Viz type": ["可视化类型"], - "An error occurred while fetching chart dataset values: %s": [ - "获取图表数据集时出错:%s" + "Unable to find such a holiday: [%(holiday)s]": [ + "找不到这样的假期:[{}]" ], - "Favorite": ["收藏"], - "Yes": ["是"], - "No": ["否"], - "Are you sure you want to delete the selected charts?": [ - "确实要删除所选图表吗?" + "Unable to migrate query editor state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ + "无法将查询编辑器状态迁移到后端。系统将稍后重试。如果此问题仍然存在,请与管理员联系。" ], - "css_template": ["css模板"], - "Edit CSS template properties": ["编辑CSS属性属性"], - "Add CSS template": ["新增CSS模板"], - "CSS template name": ["CSS模板名称"], - "css": [""], - "CSS templates": ["CSS 模板"], - "There was an issue deleting the selected templates: %s": [ - "删除所选模板时出现问题:%s" + "Unable to migrate query state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ + "无法将查询状态迁移到后端。系统将稍后重试。如果此问题仍然存在,请与管理员联系。" ], - "Last modified by %s": ["上次修改人 %s"], - "CSS template": ["CSS 模板"], - "This action will permanently delete the template.": [ - "此操作将永久删除模板。" + "Unable to migrate table schema state to backend. Superset will retry later. Please contact your administrator if this problem persists.": [ + "无法将表结构状态迁移到后端。系统将稍后重试。如果此问题仍然存在,请与管理员联系。" ], - "Delete Template?": ["删除模板?"], - "Are you sure you want to delete the selected templates?": [ - "确实要删除选定的模板吗?" + "Unable to refresh metadata for the following table(s): %(tables)s": [ + "为下表刷新元数据: %(tables)s" ], - "The passwords for the databases below are needed in order to import them together with the dashboards. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "需要以下数据库的密码才能将它们与仪表板一起导入。请注意,数据库配置的 \"Secure Extra\" 和 \"Certificate\" 部分不在导出文件中,如果需要,应在导入后手动添加。" + "Unable to upload CSV file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ + "无法将CSV文件 \"%(filename)s\" 上传到数据库 \"%(db_name)s\" 中的表 \"%(table_name)s\" 内。错误消息:%(error_msg)s" ], - "You are importing one or more dashboards that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ - "您正在导入一个或多个已存在的仪表板。覆盖可能会导致您丢失一些工作。确定要覆盖吗?" + "Unable to upload Columnar file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ + "无法将Excel文件 \"%(filename)s\" 上传到数据库 \"%(db_name)s\" 中的表 \"%(table_name)s\" 内。错误消息:%(error_msg)s" ], - "An error occurred while fetching dashboards: %s": [ - "获取仪表板时出错:%s" + "Unable to upload Excel file \"%(filename)s\" to table \"%(table_name)s\" in database \"%(db_name)s\". Error message: %(error_msg)s": [ + "无法将Excel文件 \"%(filename)s\" 上传到数据库 \"%(db_name)s\" 中的表 \"%(table_name)s\" 内。错误消息:%(error_msg)s" ], - "There was an issue deleting the selected dashboards: ": [ - "删除所选仪表板时出现问题:" + "Undefined": ["未命名"], + "Undefined window for rolling operation": ["未定义滚动操作窗口"], + "Undo?": ["撤消?"], + "Unexpected error": ["意外错误。"], + "Unexpected error occurred, please check your logs for details": [ + "发生意外错误,请检查日志以了解详细信息" ], - "An error occurred while fetching dashboard owner values: %s": [ - "获取仪表板所有者时出错:%s" + "Unexpected error: ": ["意外错误。"], + "Unknown": ["未知"], + "Unknown MySQL server host \"%(hostname)s\".": [ + "未知MySQL服务器主机 \"%(hostname)s\"." ], - "An error occurred while fetching dashboard created by values: %s": [ - "获取仪表板创建者时出错:%s" + "Unknown Presto Error": ["未知 Presto 错误"], + "Unknown Status": ["未知状态"], + "Unknown column used in orderby: %(col)s": [ + "订单中使用的未知列: %(col)s" ], - "Unpublished": ["未发布"], - "Are you sure you want to delete the selected dashboards?": [ - "确实要删除选定的仪表板吗?" + "Unknown error": ["未知错误"], + "Unknown value": ["未知错误"], + "Unsafe return type for function %(func)s: %(value_type)s": [ + "函数返回不安全的类型 %(func)s: %(value_type)s" ], - "Sorry, your browser does not support copying.": [ - "抱歉,您的浏览器不支持复制操作。使用 Ctrl / Cmd + C!" + "Unsafe template value for key %(key)s: %(value_type)s": [ + "键的模板值不安全 %(key)s: %(value_type)s" ], - "SQL Copied!": ["SQL复制成功!"], - "The passwords for the databases below are needed in order to import them. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "需要以下数据库的密码才能导入它们。请注意,数据库配置的 \"Secure Extra\" 和 \"Certificate\" 部分不在导出文件中。如果需要,应在导入后手动添加。" + "Unset Filters (%d)": ["未选择的条件 (%d)"], + "Unsupported clause type: %(clause)s": ["不支持的条款类型: %(clause)s"], + "Unsupported extraction function: ": ["不支持的提取函数:"], + "Unsupported post processing operation: %(operation)s": [ + "不支持的处理操作:%(operation)s" ], - "You are importing one or more databases that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ - "您正在导入一个或多个已存在的数据库。覆盖可能会导致您丢失一些工作。您确定要覆盖吗?" + "Unsupported return value for method %(name)s": [ + "方法的返回值不受支持 %(name)s" ], - "database": ["数据库"], - "An error occurred while fetching database related data: %s": [ - "获取数据库相关数据时出错:%s" + "Unsupported template value for key %(key)s": [ + "键的模板值不受支持 %(key)s" ], - "Asynchronous query execution": ["异步执行查询"], - "AQE": ["AQE(异步执行查询)"], - "Allow data manipulation language": ["允许数据操作语言"], - "DML": ["DML(数据操作语言)"], - "CSV upload": ["CSV上传"], - "Delete database": ["删除数据库"], - "The database %s is linked to %s charts that appear on %s dashboards. Are you sure you want to continue? Deleting the database will break those objects.": [ - "数据库 %s 已经关联了 %s 图表和 %s 看板。确定要继续吗?删除数据库将破坏这些对象。" + "Unsupported time grain: %(time_grain)s": [ + "不支持的时间粒度:%(time_grain)s" ], - "Delete Database?": ["确定删除数据库?"], - "Please enter a SQLAlchemy URI to test": ["请输入要测试的SQLAlchemy URI"], - "Connection looks good!": ["连接测试成功!"], - "ERROR: Connection failed. ": ["错误:连接失败。"], - "Sorry there was an error fetching database information: %s": [ - "抱歉,获取数据库信息时出错:%s" + "Untitled Query %s": ["未命名的查询 %s"], + "Untitled query": ["未命名的查询"], + "Update": ["更新"], + "Updating chart was stopped": ["更新图表已停止"], + "Upload": ["上传"], + "Upload Credentials": ["上传验证文件"], + "Upload Excel file to database": ["上传Excel"], + "Upload JSON file": ["上传JSON文件"], + "Upload CSV to database": ["上传CSV文件"], + "Upload a Columnar File": ["上传列式存储文件"], + "Use Area Proportions": ["使用面积比例"], + "Use Columns": ["使用列"], + "Use Pandas to interpret the datetime format automatically.": [ + "使用Pandas自动解释日期时间格式。" ], - "Edit database": ["编辑数据库"], - "Add database": ["添加数据库"], - "Connection": ["测试连接"], - "Database name": ["数据库名称"], - "Name your dataset": ["命名数据集"], - "dialect+driver://username:password@host:port/database": [""], - "Test connection": ["测试连接"], - "Refer to the ": ["参考 "], - "SQLAlchemy docs": ["SQLAlchemy 文档"], - " for more information on how to structure your URI.": [ - " 来查询有关如何构造URI的更多信息。" + "Use a log scale": ["使用Y轴的对数刻度"], + "Use a log scale for the X-axis": ["使用Y轴的对数刻度"], + "Use a log scale for the Y-axis": ["使用Y轴的对数刻度"], + "Use an encrypted connection to the database": ["使用到数据库的加密连接"], + "Use legacy datasource editor": ["使用旧数据源编辑器"], + "Use metrics as a top level group for columns or for rows": [ + "将指标作为列或行的顶级组使用" ], - "Performance": ["性能"], - "Chart cache timeout": ["图表缓存超时"], - "Operate the database in asynchronous mode, meaning that the queries are executed on remote workers as opposed to on the web server itself. This assumes that you have a Celery worker setup as well as a results backend. Refer to the installation docs for more information.": [ - "以异步模式操作数据库,这意味着查询是在远程worker上执行的,而不是在web服务器本身上执行的, 这假设您有一个Celery worker setup以及一个执行后端。有关更多信息,请参考安装文档。" + "Use only a single value.": ["只使用一个值"], + "Use the Advanced Analytics options below": ["使用下面的高级分析选项"], + "Use the JSON file you automatically downloaded when creating your service account.": [ + "使用您在创建服务帐户时自动下载的JSON文件" ], - "SQL Lab settings": ["SQL Lab 设置"], - "Allow users to run non-SELECT statements (UPDATE, DELETE, CREATE, ...)": [ - "允许用户在 SQL 编辑器中运行非 SELECT 语句(UPDATE,DELETE,CREATE,...)" + "Use the edit buttom to change this field": ["使用编辑按钮更改此字段"], + "Use this to define a static color for all circles": [ + "使用此定义所有圆圈的静态颜色" ], - "Allow multi schema metadata fetch": ["允许多Schema元数据获取"], - "CTAS schema": ["CTAS 模式"], - "When allowing CREATE TABLE AS option in SQL Lab, this option forces the table to be created in this schema.": [ - "当在 SQL 编辑器中允许 CREATE TABLE AS 选项时,此选项可以此模式中强制创建表" + "Used internally to identify the plugin. Should be set to the package name from the pluginʼs package.json": [ + "在内部用于标识插件。应该在插件的 package.json 内被设置为包名。" ], - "Secure extra": ["安全"], - "JSON string containing additional connection configuration.": [ - "包含附加连接配置的JSON字符串。" + "Used to summarize a set of data by grouping together multiple statistics along two axes. Examples: Sales numbers by region and month, tasks by status and assignee, active users by age and location.\n\n This chart is being deprecated and we recommend checking out Pivot Table V2 instead!": [ + "用于通过将多个统计数据分组来总结一组数据" ], - "This is used to provide connection information for systems like Hive, Presto, and BigQuery, which do not conform to the username:password syntax normally used by SQLAlchemy.": [ - "这用于为SQLAlchemy提供Hive、Presto和BigQuery等不符合 用户名:密码 的语法规范。" + "Used to summarize a set of data by grouping together multiple statistics along two axes. Examples: Sales numbers by region and month, tasks by status and assignee, active users by age and location. Not the most visually stunning visualization, but highly informative and versatile.": [ + "用于通过将多个统计信息分组在一起来汇总一组数据" ], - "Optional CA_BUNDLE contents to validate HTTPS requests. Only available on certain database engines.": [ - "用于验证HTTPS请求的可选 CA_BUNDLE 内容。仅在某些数据库引擎上可用。" + "User": ["用户"], + "User Roles": ["用户角色"], + "User doesn't have the proper permissions.": ["您没有授权 "], + "User must select a value before applying the filter": [ + "用户必须给过滤器选择一个值" ], - "Impersonate Logged In User (Presto, Trino, Drill & Hive)": [ - "模拟登录用户 (Presto, Trino, Drill & Hive)" + "User must select a value for this filter": [ + "用户必须给过滤器选择一个值" ], - "If Presto, Trino or Drill all the queries in SQL Lab are going to be executed as the currently logged on user who must have permission to run them. If Hive and hive.server2.enable.doAs is enabled, will run the queries as service account, but impersonate the currently logged on user via hive.server2.proxy.user property.": [ - "如果使用Presto,SQL 工具箱中的所有查询都将被当前登录的用户执行,并且这些用户必须拥有运行它们的权限。如果启用 Hive 和 hive.server2.enable.doAs,将作为服务帐户运行查询,但会根据 hive.server2.proxy.user 的属性伪装当前登录用户。" + "User must select a value for this filter.": [ + "用户必须给过滤器选择一个值" ], - "Allow data upload": ["允许数据上传"], - "If selected, please set the schemas allowed for data upload in Extra.": [ - "如果选中,请额外设置允许数据上传的schema。" + "User query": ["用户查询"], + "Username": ["用户名"], + "Uses a gauge to showcase progress of a metric towards a target. The position of the dial represents the progress and the terminal value in the gauge represents the target value.": [ + "使用一个度量来展示实现目标的度量的进展" ], - "JSON string containing extra configuration elements.": [ - "包含额外配置元素的JSON字符串。" + "Uses circles to visualize the flow of data through different stages of a system. Hover over individual paths in the visualization to understand the stages a value took. Useful for multi-stage, multi-group visualizing funnels and pipelines.": [ + "使用圆圈来可视化系统不同阶段的数据流。" ], - "1. The engine_params object gets unpacked into the sqlalchemy.create_engine call, while the metadata_params gets unpacked into the sqlalchemy.MetaData call.": [ - "1. engine_params 对象在调用 sqlalchemy.create_engine 时被引用, metadata_params 在调用 sqlalchemy.MetaData 时被引用。" + "Value": ["值"], + "Value Domain": ["值域"], + "Value Format": ["数值格式"], + "Value bounds": ["值边界"], + "Value format": ["数值格式"], + "Value is required": ["需要名称"], + "Value must be greater than 0": ["`行偏移量` 必须大于或等于0"], + "Vehicle Types": ["类型"], + "Verbose Name": ["全称"], + "Version": ["版本"], + "Version number": ["版本"], + "Vertical": ["垂直"], + "Video game consoles": ["控制台"], + "View All »": ["查看所有 »"], + "View chart in Explore": ["查看图表"], + "View in SQL Lab": ["在 SQL 工具箱中公开"], + "View keys & indexes (%s)": ["查看键和索引(%s)"], + "View query": ["检查查询"], + "View results": ["展示结果"], + "View samples": ["查看样例"], + "Viewed": ["已查看"], + "Viewed %s": ["已查看"], + "Viewport": ["视口"], + "Virtual (SQL)": ["虚拟(SQL)"], + "Virtual dataset": ["虚拟数据集"], + "Virtual dataset query cannot be empty": ["虚拟数据集查询必须是只读的"], + "Virtual dataset query cannot consist of multiple statements": [ + "虚拟数据集查询不能由多个语句组成" ], - "2. The metadata_cache_timeout is a cache timeout setting in seconds for metadata fetch of this database. Specify it as \"metadata_cache_timeout\": {\"schema_cache_timeout\": 600, \"table_cache_timeout\": 600}. If unset, cache will not be enabled for the functionality. A timeout of 0 indicates that the cache never expires.": [ - "2. metadata_cache_timeout 是获取该数据库元数据的缓存超时设置(秒)。可以这样进行设置:\"metadata_cache_timeout\": {\"schema_cache_timeout\": 600, \"table_cache_timeout\": 600}。如果未设置,则不会为该功能启用缓存。如果超时时间设置为0,则表示缓存永不过期。" + "Virtual dataset query must be read-only": ["虚拟数据集查询必须是只读的"], + "Visual Tweaks": ["视觉调整"], + "Visualization": ["可视化模式"], + "Visualization Type": ["可视化类型"], + "Visualization type": ["可视化类型"], + "Visualize a parallel set of metrics across multiple groups. Each group is visualized using its own line of points and each metric is represented as an edge in the chart.": [ + "在多个组中可视化一组平行的度量。每个组都使用自己的点线进行可视化,每个度量在图表中表示为一条边。" ], - "3. The schemas_allowed_for_file_upload is a comma separated list of schemas that CSVs are allowed to upload to. Specify it as \"schemas_allowed_for_file_upload\": [\"public\", \"csv_upload\"]. If database flavor does not support schema or any schema is allowed to be accessed, just leave the list empty.": [ - "3. schemas_allowed_for_file_upload 是CSV文件允许上传的schema,该结构以逗号进行分割。 可以这样进行设置:\"schemas_allowed_for_file_upload\": [\"public\", \"csv_upload\"]。如果数据库风格不支持schema或任何schema都被允许,请将列表留空。" + "Visualize a related metric across pairs of groups. Heatmaps excel at showcasing the correlation or strength between two groups. Color is used to emphasize the strength of the link between each pair of groups.": [ + "可视化各组之间的相关指标。热图擅长显示两组之间的相关性或强度。颜色用于强调各组之间的联系强度。" ], - "4. The version field is a string specifying this db's version. This should be used with Presto DBs so that the syntax is correct.": [ - "4. version 字段是指定此数据库版本的字符串。这应该与Presto DBs一起使用,以便语法正确。" + "Visualize how a metric changes over time using bars. Add a group by column to visualize group level metrics and how they change over time.": [ + "使用条形图可视化指标随时间的变化。按列添加分组以可视化分组级别的指标及其随时间变化的方式。" ], - "5. The allows_virtual_table_explore field is a boolean specifying whether or not the Explore button in SQL Lab results is shown.": [ - "5. allows_virtual_table_explore 字段是一个布尔值,它指定是否显示 SQL Lab 结果中的explore按钮。" + "Visualize multiple levels of hierarchy using a familiar tree-like structure.": [ + "使用熟悉的树状结构可视化多层次结构。" ], - "Error while saving dataset: %s": ["保存数据集时出错:%s"], - "Add dataset": ["添加数据集"], - "The passwords for the databases below are needed in order to import them together with the datasets. Please note that the \"Secure Extra\" and \"Certificate\" sections of the database configuration are not present in export files, and should be added manually after the import if they are needed.": [ - "需要以下数据库的密码才能将其与数据集一起导入。请注意,数据库配置的 \"Secure Extra\" 和 \"Certificate\" 部分不在导出文件中,如果需要,应在导入后手动添加。" + "Visualize two different time series using the same x-axis time range. Note that each time series can be visualized differently (e.g. 1 using bars and 1 using a line).": [ + "使用相同的x轴时间范围可视化两个不同的时间序列。请注意,每个时间序列可以以不同的方式可视化(例如1个使用条形图,1个使用线条)。" ], - "You are importing one or more datasets that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ - "您正在导入一个或多个已存在的数据集。覆盖可能会导致您丢失一些工作。确定要覆盖吗?" + "Visualize two different time series using the same x-axis time range. This chart is being deprecated and we recommend using the Mixed Timeseries Chart instead!": [ + "使用相同的x轴时间范围可视化两个不同的时间序列。此图表已被弃用,我们建议使用混合改为时间序列图!" ], - "An error occurred while fetching dataset related data": [ - "获取数据集相关数据时出错" + "Visualizes 2 metrics as line plots using the same x-axis. This chart is useful for comparing metrics across the same time range.": [ + "使用相同的x轴将2个指标可视化为折线图。此图表可用于比较相同时间范围内的指标。" ], - "An error occurred while fetching dataset related data: %s": [ - "获取数据集相关数据时出错:%s" + "Visualizes a metric across three dimensions of data in a single chart (X axis, Y axis, and bubble size). Bubbles from the same group can be showcased using bubble color.": [ + "在单个图表中跨三维数据(X轴、Y轴和气泡大小)可视化度量。同一组中的气泡可以“使用气泡颜色显示" ], - "Physical dataset": ["物化数据集"], - "Virtual dataset": ["虚拟数据集"], - "An error occurred while fetching dataset owner values: %s": [ - "获取数据集所有者值时出错:%s" + "Visualizes how a metric has changed over a time using a color scale and a calendar view. Gray values are used to indicate missing values and the linear color scheme is used to encode the magnitude of each day's value.": [ + "使用色标和日历视图可视化指标在一段时间内的变化情况。灰色值用于指示缺少的值,线性配色方案用于编码每天值的大小。" ], - "An error occurred while fetching datasets: %s": ["获取数据集时出错:%s"], - "An error occurred while fetching schema values: %s": [ - "获取结构信息时出错:%s" + "Visualizes how a single metric varies across a country's principal subdivisions (states, provinces, etc) on a chloropleth map. Each subdivision's value is elevated when you hover over the corresponding geographic boundary.": [ + "在叶绿体地图上显示一个国家的主要分区(州、省等)之间单个指标的变化情况。当您悬停在相应的地理边界上时,每个分区的值都会升高" ], - "There was an issue deleting the selected datasets: %s": [ - "删除选定的数据集时出现问题:%s" + "Visualizes many different time-series objects in a single chart. This chart is being deprecated and we recommend using the Time-series Chart instead.": [ + "在一个图表中显示许多不同的时间序列对象。此图表已被弃用,建议改用时间序列图表" ], - "The dataset %s is linked to %s charts that appear on %s dashboards. Are you sure you want to continue? Deleting the dataset will break those objects.": [ - "数据集 %s 已经链接到 %s 图表和 %s 看板内。确定要继续吗?删除数据集将破坏这些对象。" + "Visualizes the flow of different group's values through different stages of a system. New stages in the pipeline are visualized as nodes or layers. The thickness of the bars or edges represent the metric being visualized.": [ + "可视化不同组的值在系统不同阶段的流动。管道中的新阶段被可视化为节点或层。条形或边缘的厚度表示正在可视化的度量。" ], - "Delete Dataset?": ["确定删除数据集?"], - "Are you sure you want to delete the selected datasets?": [ - "确实要删除选定的数据集吗?" + "Visualizes the words in a column that appear the most often. Bigger font corresponds to higher frequency.": [ + "可视化列中出现频率最高的单词。字体越大,出现频率越高。" ], - "0 Selected": ["0个被选中"], - "%s Selected (Virtual)": ["%s 个被选中(虚拟)"], - "%s Selected (Physical)": ["%s 个被选中(物理)"], - "%s Selected (%s Physical, %s Virtual)": [ - "%s 个被选中 (%s 个物理, %s 个虚拟)" + "Viz is missing a datasource": ["Viz 缺少一个数据源"], + "Viz type": ["可视化类型"], + "WED": ["星期三"], + "Want to add a new database?": ["添加一个新数据库?"], + "Warning": ["警告!"], + "Warning Message": ["告警信息"], + "Warning!": ["警告!"], + "Warning! Changing the dataset may break the chart if the metadata does not exist.": [ + "警告!如果元数据不存在,更改数据集可能会破坏图表。" ], - "There was an issue previewing the selected query. %s": [ - "预览所选查询时出现问题。%s" + "We can't seem to resolve column \"%(column)s\" at line %(location)s.": [ + "我们似乎无法解析行 %(location)s 所处的列 \"%(column_name)s\" 。" ], - "Success": ["成功"], - "Failed": ["失败"], - "Running": ["正在执行"], - "Offline": ["离线"], - "Scheduled": ["被调度"], - "Duration: %s": ["持续时间:%s"], - "Tab name": ["tab名"], - "TABLES": ["表"], - "Rows": ["行"], - "Open query in SQL Lab": ["在 SQL 工具箱中打开查询"], - "An error occurred while fetching database values: %s": [ - "获取数据库信息时出错:%s" + "We can't seem to resolve the column \"%(column_name)s\"": [ + "我们似乎无法解析行 %(location)s 所处的列 \"%(column_name)s\" 。" ], - "Search by query text": ["按查询文本搜索"], - "Query preview": ["查询预览"], - "Previous": ["之前"], - "Next": ["之后"], - "Open in SQL Lab": ["在 SQL 工具箱中打开"], - "User query": ["用户查询"], - "Executed query": ["已执行查询"], - "Saved queries": ["已保存查询"], - "There was an issue previewing the selected query %s": [ - "预览所选查询时出现问题 %s" + "We can't seem to resolve the column \"%(column_name)s\" at line %(location)s.": [ + "我们似乎无法解析行 %(location)s 所处的列 \"%(column_name)s\" 。" ], - "Link Copied!": ["链接成功!"], - "There was an issue deleting the selected queries: %s": [ - "删除所选查询时出现问题:%s" + "We recommend your summarize your data further before following that flow. ": [ + "我们建议您在遵循流程之前进一步总结数据。" ], - "Edit query": ["编辑查询"], - "Copy query URL": ["复制查询URL"], - "Delete query": ["删除查询"], - "This action will permanently delete the saved query.": [ - "此操作将永久删除保存的查询。" + "We were unable to active or deactivate this report.": [ + "“我们无法激活或禁用该报告。" ], - "Delete Query?": ["确定删除查询?"], - "Are you sure you want to delete the selected queries?": [ - "您确实要删除选定的查询吗?" + "We were unable to connect to your database named \"%(database)s\". Please verify your database name and try again.": [ + "我们无法连接到名为 \"%(database)s\" 的数据库。请确认您的数据库名字并重试" ], - "Query name": ["查询名称"], - "Edited": ["已编辑"], - "Created": ["已创建"], - "Viewed": ["已查看"], - "Examples": ["示例"], - "Mine": ["我的编辑"], - "Recently viewed charts, dashboards, and saved queries will appear here": [ - "最近查看的图表、看板和保存的查询将显示在此处" + "We were unable to connect to your database. Please confirm that your service account has the Viewer and Job User roles on the project.": [ + "我们无法连接到您的数据库。请确认您的服务帐户在项目中具有查看器和作业用户角色。" ], - "Recently created charts, dashboards, and saved queries will appear here": [ - "最近创建的图表、看板和保存的查询将显示在此处" + "Web": ["网络"], + "Wednesday": ["星期三"], + "Week": ["周"], + "Week ending Saturday": ["周一为一周结束"], + "Week starting Monday": ["周一为一周开始"], + "Week starting Sunday": ["周日为一周开始"], + "Week_ending Sunday": ["周日为一周结束"], + "Weeks %s": ["周 %s"], + "We’re having trouble loading these results. Queries are set to timeout after %s second.": [ + "加载结果时遇到问题。查询设置为 %s 秒后超时。" ], - "Recent example charts, dashboards, and saved queries will appear here": [ - "最近的示例图表、看板和保存的查询将显示在此处" + "We’re having trouble loading this visualization. Queries are set to timeout after %s second.": [ + "加载此可视化效果时遇到问题。查询设置为 %s 秒后超时。" ], - "Recently edited charts, dashboards, and saved queries will appear here": [ - "最近编辑的图表、看板和保存的查询将显示在此处" + "What should be shown on the label?": ["标签上需要显示的内容"], + "When `Calculation type` is set to \"Percentage change\", the Y Axis Format is forced to `.1%`": [ + "当设置“周期比”时,y轴格式强制为“1%”。" ], - "DASHBOARD": ["看板"], - "CHART": ["图表"], - "You don't have any favorites yet!": ["您还没有任何的收藏!"], - "SQL Lab queries": ["SQL工具箱查询"], - "See all": ["查看所有"], - "saved queries": ["已保存查询"], - "dashboards": ["看板"], - "charts": ["图表"], - "query": ["查询"], - "Share": ["分享"], - "Last run %s": ["上次执行 %s"], - "Recents": ["最近"], - "Select start and end date": ["选择开始和结束时间"], - "Type or Select [%s]": ["键入或选择 [%s]"], - "Filter box": ["过滤器"], - "Filters configuration": ["过滤配置"], - "Filter configuration for the filter box": ["过滤条件的过滤配置"], - "Date filter": ["日期过滤器"], - "Whether to include a time filter": ["是否包含时间过滤器"], - "Instant filtering": ["即时过滤"], - "Check to apply filters instantly as they change instead of displaying [Apply] button": [ - "选中可在过滤条件更改时立即应用过滤,而不是使用 [应用] 按钮" + "When a secondary metric is provided, a linear color scale is used.": [ + "当提供次计量指标时,会使用线性色阶。" ], - "Show SQL granularity dropdown": ["显示SQL时间粒度下拉列表"], - "Check to include SQL granularity dropdown": [ - "检查是否包含SQL时间粒度下拉列表" + "When allowing CREATE TABLE AS option in SQL Lab, this option forces the table to be created in this schema": [ + "当在 SQL 编辑器中允许 CREATE TABLE AS 选项时,此选项可以此模式中强制创建表" ], - "Show SQL time column": ["显示SQL时间列"], - "Check to include time column dropdown": ["检查包含时间列下拉列表"], - "Show Druid granularity dropdown": ["显示Druid时间粒度下拉列表"], - "Check to include Druid granularity dropdown": [ - "检查包含Druid时间粒度下拉列表" + "When enabled, users are able to visualize SQL Lab results in Explore.": [ + "启用后,用户可以在Explore中可视化SQL实验室结果。" ], - "Show Druid time origin": ["显示Druid原始时间"], - "Check to include time origin dropdown": ["检查包含时间原点的下拉列表"], - "Limit selector values": ["限制选择器值"], - "These filters apply to the values available in the dropdowns": [ - "这些过滤器应用于下拉列表中的可用值" + "When only a primary metric is provided, a categorical color scale is used.": [ + "如果只提供了一个主计量指标,则使用分类色阶。" ], - "Time-series Table": ["时间序列-表格"], - "All": ["所有"], - "Any": ["所有"], - "Line Chart": ["多线图"], - "Bar Chart": ["条形图"], - "Area Chart": ["面积图"], - "deck.gl Polygon": ["deck.gl 多边形图层"], - "deck.gl Scatterplot": ["deck.gl 散点图"], - "deck.gl 3D Hexagon": ["deck.gl 3D 六角图层"], - "Time-series Period Pivot": ["时间序列-周期轴"], - "deck.gl Arc": ["deck.gl 弧形图层"], - "deck.gl Grid": ["deck.gl 网格图层"], - "deck.gl Screen Grid": ["deck.gl 筛网图层"], - "Dual Line Chart": ["双线图"], - "Multiple Line Charts": ["复合折线图"], - "Sunburst Chart": ["旭日/太阳图"], - "Sankey Diagram": ["桑基图"], - "MapBox": ["MapBox地图"], - "Nightingale Rose Chart": ["南丁格尔玫瑰图"], - "deck.gl Geojson": ["deck.gl Geojson"], - "Horizon Chart": ["地平线图"], - "deck.gl Multiple Layers": ["deck.gl 复合图层"], - "Time-series Percent Change": ["时间序列-百分比变化"], - "Partition Chart": ["分区图"], - "Event Flow": ["事件流"], - "deck.gl Path": ["deck.gl 路线图层"], - "Force-directed Graph": ["力导向图"], - "Paired t-test Table": ["配对T检测表"], - "Time-series Chart": ["时间序列图"], - "Time-series Bar Chart": ["时间序列-条形图"], - "Word Cloud": ["词汇云"], - "Chord Diagram": ["弦图"], - "Pie Chart": ["饼图"], - "Range filter plugin": ["范围过滤器"], - "Select filter plugin": ["选择过滤器"], - "Anhui": ["安徽"], - "Beijing": ["北京"], - "Chongqing": ["重庆"], - "Fujian": ["福建"], - "Gansu": ["甘肃"], - "Guangdong": ["广东"], - "Guangxi": ["广西"], - "Guizhou": ["贵州"], - "Hainan": ["海南"], - "Hebei": ["河北"], - "Heilongjiang": ["黑龙江"], - "Henan": ["河南"], - "Hubei": ["湖北"], - "Hunan": ["湖南"], - "Jiangsu": ["江苏"], - "Jiangxi": ["江西"], - "Jilin": ["吉林"], - "Liaoning": ["辽宁"], - "Nei Mongol": ["内蒙古"], - "Ningxia Hui": ["宁夏"], - "Qinghai": ["青海"], - "Shaanxi": ["陕西"], - "Shandong": ["山东"], - "Shanghai": ["上海"], - "Shanxi": ["山西"], - "Sichuan": ["四川"], - "Tianjin": ["天津"], - "Xinjiang Uygur": ["新疆"], - "Xizang": ["西藏"], - "Yunnan": ["云南"], - "Zhejiang": ["浙江"], - "Taiwan": ["台湾"], - "Hong Kong": ["香港"], - "Macao": ["澳门"], - "Sort:": ["排序:"], - "Alphabetical": ["按字母顺序排列"], - "Recently modified": ["最近修改"], - "Least recently modified": ["最远修改"], - "[ untitled dashboard ]": ["[ 未命名看板 ]"], - "published": ["已发布"], - "draft": ["草稿"], - "Recent": ["最近"], - "Sort by %s": ["排序 %s"], - "Missing dataset": ["丢失数据集"], - "The dataset linked to this chart may have been deleted.": [ - "这个图表所链接的数据集可能被删除了。" + "When specifying SQL, the datasource acts as a view. Superset will use this statement as a subquery while grouping and filtering on the generated parent queries.": [ + "指定SQL时,数据源会充当视图。在对生成的父查询进行分组和筛选时,系统将使用此语句作为子查询。" ], - "Autocomplete": ["自动补全"], - "Failed at stopping query. ": ["停止查询时候出错。 "], - "-- Note: Unless you save your query, these tabs will NOT persist if you clear your cookies or change browsers.": [ - "-- 注意:除非您保存查询,否则如果清除cookie或更改浏览器时,这些选项卡将不会保留。" + "When using \"Autocomplete filters\", this can be used to improve performance of the query fetching the values. Use this option to apply a predicate (WHERE clause) to the query selecting the distinct values from the table. Typically the intent would be to limit the scan by applying a relative time filter on a partitioned or indexed time-related field.": [ + "当使用 \"自适配过滤条件\" 时,这可以用来提高获取查询数据的性能。使用此选项可将谓词(WHERE子句)应用于从表中进行选择不同值的查询。通常,这样做的目的是通过对分区或索引的相关时间字段配置相对应的过滤时间来限制扫描。" ], - "New tab (Ctrl + t)": ["新建Tab页 (Ctrl + t)"], - "Last Edited: %s": ["最后编辑时间:%s"], - "View All »": ["查看所有 »"], - "Add an item": ["新增一行"], - "remove item": ["删除该行"], - "last day": ["上一(昨)天"], - "last week": ["上一周"], - "last month": ["上一月"], - "last quarter": ["上一季度"], - "last year": ["上一年"], - "previous calendar week": ["前一周"], - "previous calendar month": ["前一月"], - "previous calendar year": ["前一年"], - "Configure Advanced Time Range ": ["配置进阶时间范围"], - "Specific Date/Time": ["具体日期/时间"], - "Relative Date/Time": ["相对日期/时间"], - "Now": ["现在"], - "Midnight": ["凌晨(当天)"], - "Seconds": ["秒"], - "Minutes": ["分钟"], - "Hours": ["小时"], - "Days": ["天"], - "Weeks": ["周"], - "Months": ["月"], - "Quarters": ["季度"], - "Years": ["年"], - "Before": ["之前"], - "Unexpected time range: %(error)s": ["时间范围异常: %(error)s"], - "Return to specific datetime.": ["返回指定的日期时间。"], - "Syntax": ["语法"], - "Example": ["例子"], - "Moves the given set of dates by a specified interval.": [ - "将给定的日期集以指定的间隔进行移动" + "When using 'Group By' you are limited to use a single metric": [ + "当使用“Group by”时,只限于使用单个度量。" ], - "Truncates the specified date to the accuracy specified by the date unit.": [ - "将指定的日期截取为指定的日期单位精度。" + "Whether the progress bar overlaps when there are multiple groups of data": [ + "当有多组数据时进度条是否重叠" ], - "Get the last date by the date unit.": ["按日期单位获取最后的日期。"], - "Get the specify date for the holiday": ["获取指定节假日的日期"], - "Loading...": ["加载中..."], - "Transparent": ["透明"], - "White": ["白色"], - "background": ["背景"], - "New header": ["新标题"], - "Fixed": ["固定值"], - "Based on a metric": ["基于指标"], - "week_start_sunday": ["周日为一周结束"], - "week_start_monday": ["周一为一周开始"], - "duration": ["执行时间"], - "state": ["状态"], - "started": ["开始时间"], - "progress": ["进度"], - "output": ["输出"], - "actions": ["操作"], - "success": ["成功"], - "failed": ["失败"], - "cannot be empty": ["不能为空"], - "Options": ["设置"], - "Time Column": ["时间列"], - "Time Range": ["时间范围"], - "Color Scheme": ["配色方案"], - "Datasource & Chart Type": ["数据源 & 图表类型"], - "URL Parameters": ["URL参数"], - "Annotations and Layers": ["注释与注释层"], - "Time Grain": ["时间粒度(Grain)"], - "Time Granularity": ["时间粒度(Granularity)"], - "Minimum Font Size": ["最小字体大小"], - "Maximum Font Size": ["最大字体大小"], - "Word Rotation": ["单词旋转"], - "Rotation to apply to words in the cloud": [ - "应用于词云中的单词的旋转方式" + "Whether the table was generated by the 'Visualize' flow in SQL Lab": [ + "表是否由 sql 实验室中的 \"可视化\" 流生成" ], - "Font size for the smallest value in the list": [ - "列表中最小值的字体大小" + "Whether this column is exposed in the `Filters` section of the explore view.": [ + "该列是否在浏览视图的`过滤器`部分显示。" ], - "Font size for the biggest value in the list": ["列表中最大值的字体大小"], - "D3 time format syntax: https://github.com/d3/d3-time-format": [ - "D3时间插件格式语法: https://github.com/d3/d3-time-format" + "Whether to align background charts with both positive and negative values at 0": [ + "是否 +/- 对齐背景图数值" ], - "D3 format syntax: https://github.com/d3/d3-format": [ - "D3插件格式语法: https://github.com/d3/d3-time-format" + "Whether to align positive and negative values in cell bar chart at 0": [ + "单元格条形图中的正负值是否按0对齐" ], - "Whether to apply filter to dashboards when table cells are clicked": [ - "单击表单元格时是否对看板应用过滤条件" + "Whether to always show the annotation label": ["是否显示标签。"], + "Whether to animate the progress and the value or just display them": [ + "是以动画形式显示进度和值,还是仅显示它们" ], - "Adaptive formatting": ["自动匹配格式化"], - "Aggregate": ["聚合"], - "Raw Records": ["原始记录"], - "Query Mode": ["查询模式"], - "Columns to display": ["要显示的字段"], - "Percentage Metrics": ["百分比度量"], - "Metrics for which percentage of total are to be displayed": [ - "要显示总数百分比的度量" + "Whether to apply a normal distribution based on rank on the color scale": [ + "是否应用基于色标等级的正态分布" ], - "Ordering": ["排序"], - "Include Time": ["包含时间"], - "Sort Descending": ["降序"], - "Table Timestamp Format": ["表时间戳格式"], - "Timestamp Format": ["时间戳格式"], - "Page Length": ["页面长度"], - "Rows per page, 0 means no pagination": ["每页行数,0 表示没有分页"], - "Search Box": ["搜索框"], - "Whether to include a client-side search box": ["是否包含客户端搜索框"], - "Emit Filter Events": ["触发筛选器事件"], - "Align +/-": ["对齐 +/-"], - "Whether to align the background chart for +/- values": [ - "是否 +/- 对齐背景图数值" + "Whether to colorize numeric values by if they are positive or negative": [ + "根据数值是正数还是负数来为其上色" ], - "Color +/-": ["色彩 +/-"], - "Whether to color +/- values": ["是否 +/- 颜色数值"], - "Show Cell Bars": ["显示单元格的栏"], - "Enable to display bar chart background elements in table columns": [ + "Whether to display a bar chart background in table columns": [ "为指标添加条状图背景" ], - "X Tick Layout": ["X轴记号图层"], - "The way the ticks are laid out on the X-axis": ["X轴记号的排列显示方式"], - "Number format": ["数字格式化"], - "Distribute across": ["基于某列进行分布"], - "Categories to group by on the x-axis.": ["要在x轴上分组的类别。"], - "Columns to calculate distribution across. Defaults to temporal column if left empty.": [ - "计算分布的列。如果留空,则默认为临时列。" + "Whether to display a legend for the chart": [ + "是否显示图表的图示(色块分布)" ], - "Determines how whiskers and outliers are calculated.": [ - "确定如何计算箱须和离群值。" + "Whether to display bubbles on top of countries": [ + "是否在国家之上展示气泡" ], - "Whisker/outlier options": ["箱须/离群值选项"], - "Chart Options": ["图表选项"], - "Sort By": ["排序"], - "Whether to include the time granularity as defined in the time section": [ - "是否包含时间段中定义的时间粒度" + "Whether to display the interactive data table": [ + "是否将指标名显示为标题" + ], + "Whether to display the labels.": ["是否显示标签。"], + "Whether to display the labels. Note that the label only displays when the the 5% threshold.": [ + "是否显示标签。" ], - "No filter": ["无筛选"], - "Last": ["上一"], - "Custom": ["自定义"], - "custom_start_end": ["自定义起始时间"], - "custom_range": ["自定义区间"], - "Legend": ["图示"], "Whether to display the legend (toggles)": ["是否显示图示(切换)"], - "Show Metric Names": ["显示指标名"], "Whether to display the metric name as a title": [ "是否将指标名显示为标题" ], - "Number Format": ["数字格式"], - "Pivot Options": ["透视表选项"], - "Domain": ["主域"], - "The time unit used for the grouping of blocks": ["用于块分组的时间单位"], - "Subdomain": ["子域"], - "The time unit for each block. Should be a smaller unit than domain_granularity. Should be larger or equal to Time Grain": [ - "每个块的时间单位。应该是主域域粒度更小的单位。应该大于或等于时间粒度" - ], - "Cell Size": ["单元尺寸"], - "The size of the square cell, in pixels": [ - "平方单元的大小,以像素为单位" + "Whether to display the min and max values of the X-axis": [ + "是否显示X轴的最小值和最大值" ], - "Cell Padding": ["单元填充"], - "The distance between cells, in pixels": [ - "单元格之间的距离,以像素为单位" + "Whether to display the min and max values of the Y-axis": [ + "是否显示Y轴的最小值和最大值" ], - "Cell Radius": ["单元格半径"], - "The pixel radius": ["像素半径"], - "Color Steps": ["色彩 Steps"], - "The number color \"steps\"": ["色彩 \"Steps\" 数字"], - "Time Format": ["时间格式"], - "Show Values": ["显示值"], "Whether to display the numerical values within the cells": [ "是否在单元格内显示数值" ], - "Aggregate function to apply when pivoting and computing the total rows and columns": [ - "在旋转和计算总的行和列时,应用聚合函数" - ], - "Show totals": ["显示总计"], - "Display total row/column": ["显示总行 / 列"], - "Combine Metrics": ["整合指标"], - "Display metrics side by side within each column, as opposed to each column being displayed side by side for each metric.": [ - "在每个列中并排显示指标,而不是每个指标并排显示每个列。" - ], - "Transpose Pivot": ["转置透视图"], - "Swap Groups and Columns": ["交换组和列"], - "Date format": ["日期格式化"], - "Labels": ["标签"], - "Label Type": ["标签类型"], - "Whether to display a legend for the chart": [ - "是否显示图表的图示(色块分布)" + "Whether to display the time range interactive selector": [ + "是否显示时间范围交互选择器" ], - "What should be shown on the label?": ["标签上需要显示的内容"], - "Only applies when \"Label Type\" is set to show values.": [ - "仅当\"标签类型\"设置为显示值时适用。" + "Whether to display the timestamp": ["是否显示笔划"], + "Whether to display the trend line": ["是否显示笔划"], + "Whether to enable changing graph position and scaling.": [ + "是否启用更改图形位置和缩放。" ], - "Show Labels": ["显示标签"], - "Whether to display the labels.": ["是否显示标签。"], - "Put labels outside": ["外侧显示标签"], - "Put the labels outside of the pie?": ["是否将标签显示在饼图外侧?"], - "Label Line": ["标签线"], - "Draw line from Pie to label when labels outside?": [ - "当标签在外侧时,是否在饼图到标签之间连线?" + "Whether to enable node dragging in force layout mode.": [ + "是否在强制布局模式下启用节点拖动。" ], - "Pie shape": ["饼图形状"], - "Outer Radius": ["外缘"], - "Outer edge of Pie chart": ["饼图外缘"], - "Donut": ["圆环圈"], - "Do you want a donut or a pie?": ["是否用圆环圈替代饼图?"], - "Inner Radius": ["内半径"], - "Inner radius of donut hole": ["圆环圈内部空洞的内径"], - "Show percentage": ["显示百分比"], + "Whether to format the timestamp": ["是否规范化直方图"], + "Whether to include a client-side search box": ["是否包含客户端搜索框"], + "Whether to include a time filter": ["是否包含时间过滤器"], "Whether to include the percentage in the tooltip": [ "是否在工具提示中包含百分比" ], - "Normalized": ["标准化"], + "Whether to include the time granularity as defined in the time section": [ + "是否包含时间段中定义的时间粒度" + ], + "Whether to make the histogram cumulative": ["是否规范化直方图"], + "Whether to make this column available as a [Time Granularity] option, column has to be DATETIME or DATETIME-like": [ + "是否将此列作为[时间粒度]选项, 列中的数据类型必须是DATETIME" + ], "Whether to normalize the histogram": ["是否规范化直方图"], - "Sort X Axis": ["排序X轴"], - "Sort Y Axis": ["排序Y轴"], - "Value Format": ["数值格式"], - "Value bounds": ["值边界"], - "Hard value bounds applied for color coding. Is only relevant and applied when the normalization is applied against the whole heatmap.": [ - "应用于颜色编码的硬值边界。只有当对整个热图应用标准化时才是相关的和应用的。" + "Whether to populate autocomplete filters options": [ + "是否填充自适配过滤条件选项" ], - "Bottom Margin": ["底部边距"], - "Bottom margin, in pixels, allowing for more room for axis labels": [ - "底部边距,以像素为单位,为轴标签留出更多空间" + "Whether to populate the filter's dropdown in the explore view's filter section with a list of distinct values fetched from the backend on the fly": [ + "是否在浏览视图的过滤器部分中填充过滤器的下拉列表,并提供从后端获取的不同值的列表" ], - "Left Margin": ["左边距"], - "Left margin, in pixels, allowing for more room for axis labels": [ - "左边距,以像素为单位,为轴标签留出更多空间" + "Whether to show extra controls or not. Extra controls include things like making mulitBar charts stacked or side by side.": [ + "是否显示额外的控件。额外的控制包括使多栏图表堆叠或并排。" ], - "Normalize Across": ["标准化通过"], - "Color will be rendered based on a ratio of the cell against the sum of across this criteria": [ - "颜色将根据单元格与整个标准之和的比率来展示" + "Whether to show minor ticks on the axis": ["是否忽略空位置"], + "Whether to show the pointer": ["是否显示笔划"], + "Whether to show the progress of gauge chart": ["是否显示量规图进度"], + "Whether to show the split lines on the axis": [ + "是否显示Y轴的最小值和最大值" ], - "Rendering": ["渲染"], - "image-rendering CSS attribute of the canvas object that defines how the browser scales up the image": [ - "图像渲染画布对象的 CSS 属性,它定义了浏览器如何放大图像" + "Whether to sort descending or ascending": ["是降序还是升序排序"], + "Whether to sort descending or ascending. Takes effect only when \"Sort by\" is set": [ + "是降序还是升序排序" ], - "YScale Interval": ["Y轴比例尺间隔"], - "Number of steps to take between ticks when displaying the Y scale": [ - "显示 Y 刻度时,在刻度之间表示的步骤数" + "Whether to sort results by the selected metric in descending order.": [ + "是否按所选指标按降序对结果进行排序。" + ], + "Whether to sort tooltip by the selected metric in descending order.": [ + "是否按所选指标按降序对结果进行排序。" + ], + "Which country to plot the map for?": ["为哪个国家绘制地图?"], + "Which relatives to highlight on hover": ["在悬停时突出显示哪些关系"], + "Whisker/outlier options": ["箱须/离群值选项"], + "White": ["白色"], + "Width": ["宽度"], + "Width of the confidence interval. Should be between 0 and 1": [ + "置信区间必须介于0和1(不包含1)之间" ], + "Window must be > 0": ["窗口必须大于0"], + "With a subheader": ["子标题"], + "Word Cloud": ["词汇云"], + "Word Rotation": ["单词旋转"], + "Working": ["正在执行"], + "Working timeout": ["执行超时"], + "World Map": ["世界地图"], + "Write a description for your query": ["为您的查询写一段描述"], + "Write dataframe index as a column.": ["将dataframe index 作为列."], + "X AXIS TITLE BOTTOM MARGIN": ["X 轴标题下边距"], + "X Axis": ["X 轴"], + "X Axis Format": ["X 轴格式化"], + "X Axis Label": ["X 轴标签"], + "X Axis Title": ["X轴标题"], + "X Log Scale": ["X经度标度"], + "X Tick Layout": ["X轴记号图层"], + "X bounds": ["X界限"], "XScale Interval": ["X轴比例尺间隔"], - "Number of steps to take between ticks when displaying the X scale": [ - "显示 X 刻度时,在刻度之间表示的步骤数" + "Y 2 bounds": ["Y界限"], + "Y AXIS TITLE MARGIN": ["Y轴标题页边距"], + "Y AXIS TITLE POSITION": ["Y轴标题位置"], + "Y Axis": ["Y 轴"], + "Y Axis 1": ["Y 轴 1"], + "Y Axis 2": ["Y 轴 2"], + "Y Axis 2 Bounds": ["Y 轴界限"], + "Y Axis Bounds": ["Y 轴界限"], + "Y Axis Format": ["Y 轴格式化"], + "Y Axis Label": ["Y 轴标签"], + "Y Axis Left": ["Y轴左侧"], + "Y Axis Right": ["Y轴右侧"], + "Y Axis Title": ["Y 轴标题"], + "Y Log Scale": ["Y经度标度"], + "Y bounds": ["Y界限"], + "YScale Interval": ["Y轴比例尺间隔"], + "Year": ["年"], + "Years %s": ["年"], + "Yes": ["是"], + "Yes, cancel": ["是的,取消"], + "You are importing one or more charts that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "您正在导入一个或多个已存在的图表。覆盖可能会导致您丢失一些工作。您确定要覆盖吗?" ], - "Margin": ["边距(margin)"], - "Additional padding for legend.": ["图示附加的padding值。"], - "Legend type": ["图示类型"], - "Orientation": ["方向"], - "Axis ascending": ["轴线升序"], - "Axis descending": ["轴线降序"], - "Metric ascending": ["指标升序"], - "Metric descending": ["指标降序"], - "Series Height": ["序列高度"], - "Pixel height of each series": ["每个序列的像素高度"], - "Value Domain": ["值域"], - "series: Treat each series independently; overall: All series use the same scale; change: Show changes compared to the first data point in each series": [ - "series:独立处理每个序列;overall:所有序列使用相同的比例;change:显示与每个序列中第一个数据点相比的更改" + "You are importing one or more dashboards that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "您正在导入一个或多个已存在的仪表板。覆盖可能会导致您丢失一些工作。确定要覆盖吗?" ], - "Ratio": ["比率"], - "Target aspect ratio for treemap tiles.": ["树形图中图块的目标高宽比。"], - "Country Field Type": ["国家字段的类型"], - "The country code standard that Superset should expect to find in the [country] column": [ - "Superset 希望能够在 [国家] 栏中找到的 国家 / 地区 的标准代码" + "You are importing one or more databases that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "您正在导入一个或多个已存在的数据库。覆盖可能会导致您丢失一些工作。您确定要覆盖吗?" ], - "Show Bubbles": ["显示气泡"], - "Whether to display bubbles on top of countries": [ - "是否在国家之上展示气泡" + "You are importing one or more datasets that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "您正在导入一个或多个已存在的数据集。覆盖可能会导致您丢失一些工作。确定要覆盖吗?" ], - "Max Bubble Size": ["最大气泡的尺寸"], - "Country Column": ["国家字段"], - "3 letter code of the country": ["国家3字母代码"], - "Metric for Color": ["颜色指标"], - "Metric that defines the color of the country": ["定义国家度量的颜色"], - "Bubble Size": ["气泡大小"], - "Metric that defines the size of the bubble": ["定义指标的气泡大小"], - "Bubble Color": ["气泡颜色"], - "Country Color Scheme": ["国家颜色方案"], - "Linear Color Scheme": ["线性颜色方案"], - "Heatmap Options": ["热图选项"], - "Advanced Analytics": ["高级分析"], - "Rolling Window": ["滚动窗口"], - "Rolling Function": ["滚动函数"], - "Min Periods": ["最小周期"], - "Time Comparison": ["时间比对"], - "Time Shift": ["时间偏移"], - "Python Functions": ["Python函数"], - "Bad formula.": ["错误公式。"], - "Select the Annotation Layer you would like to use.": [ - "选择要使用的注释图层。" + "You are importing one or more saved queries that already exist. Overwriting might cause you to lose some of your work. Are you sure you want to overwrite?": [ + "您正在导入一个或多个已存在的图表。覆盖可能会导致您丢失一些工作。您确定要覆盖吗?" ], - "Formula": ["公式"], - "Automatic Color": ["自动上色"], - "Choose the source of your annotations": ["选择您的注释来源"], - "Annotation Source": ["注释来源"], - "No options": ["没有选项"], - "Superset annotation": ["Superset注释"], - "Use another existing chart as a source for annotations and overlays. Your chart must be one of these visualization types: [%s]": [ - "使用预定义的图表作为注释和覆盖的源。图表必须是以下可视化类型之一: [%s]" + "You are not authorized to fetch samples from this table. If you think this is an error, please reach out to your administrator.": [ + "您无权从这个表中获取样本。" ], - "Expects a formula with depending time parameter 'x'\n in milliseconds since epoch. mathjs is used to evaluate the formulas.\n Example: '2x+5'": [ - "需要一个从Epoch(1970年1月1日00:00:00 UTC)时间点开始的时间参数“x”,并以此来计算的公式(以毫秒为单位)。我们使用“mathjs”来进行公式的计算。例如:'2x+5'" + "You are not authorized to see this query. If you think this is an error, please reach out to your administrator.": [ + "您无权查看此查询。" ], - "No of Bins": ["直方图容器数"], - "Select number of bins for the histogram": ["选择直方图的容器数"], - "X Axis Label": ["X 轴标签"], - "Y Axis Label": ["Y 轴标签"], - "Right Axis Format": ["右轴格式化"], - "Show Markers": ["显示标记"], - "Show data points as circle markers on the lines": [ - "将数据点显示为线条上的圆形标记" + "You cannot specify a namespace both in the name of the table: \"%(columnar_table.table)s\" and in the schema field: \"%(columnar_table.schema)s\". Please remove one": [ + "不能同时在表名 \"%(columnar_table.table)s\" 和schema字段 \"%(columnar_table.schema)s\" 中指定命名空间。请删除一个。" ], - "Y bounds": ["Y界限"], - "Whether to display the min and max values of the Y-axis": [ - "是否显示Y轴的最小值和最大值" + "You cannot specify a namespace both in the name of the table: \"%(csv_table.table)s\" and in the schema field: \"%(csv_table.schema)s\". Please remove one": [ + "不能同时在表名 \"%(csv_table.table)s\" 和schema字段 \"%(csv_table.schema)s\" 中指定命名空间。请删除一个。" + ], + "You cannot specify a namespace both in the name of the table: \"%(excel_table.table)s\" and in the schema field: \"%(excel_table.schema)s\". Please remove one": [ + "不能同时在表名 \"%(excel_table.table)s\" 和schema字段 \"%(excel_table.schema)s\" 中指定命名空间。请删除一个。" + ], + "You cannot use 45° tick layout along with the time range filter": [ + "不能将45°刻度线布局与时间范围过滤器一起使用" + ], + "You cannot use [Columns] in combination with [Group By]/[Metrics]/[Percentage Metrics]. Please choose one or the other.": [ + "不能将 [列] 与 [分组]/[指标]/[百分比度量] 结合使用。请选择其中一个。" + ], + "You do not have permission to edit this chart": [ + "您没有编辑此图表的权限" + ], + "You do not have permission to edit this dashboard": [ + "您没有编辑此看板的权限" + ], + "You do not have permissions to access the datasource(s): %(name)s.": [ + "您没有权限访问该数据源: %(name)s。" + ], + "You do not have permissions to edit this dashboard.": [ + "您没有编辑此看板的权限。" ], - "Line Style": ["线条样式"], - "Line interpolation as defined by d3.js": ["由 d3.js 定义的线插值"], - "Show Range Filter": ["显示范围过滤器"], - "Whether to display the time range interactiWhether to display the legend (toggles)ve selector": [ - "是否显示时间范围交互选择器" + "You don't have access to this dashboard.": ["您没有编辑此看板的权限。"], + "You don't have any favorites yet!": ["您还没有任何的收藏!"], + "You don't have permission to modify the value.": [ + "您没有编辑此图表的权限" ], - "Extra Controls": ["额外控件"], - "Whether to show extra controls or not. Extra controls include things like making mulitBar charts stacked or side by side.": [ - "是否显示额外的控件。额外的控制包括使多栏图表堆叠或并排。" + "You don't have the rights to ": ["您没有授权 "], + "You don't have the rights to alter this title.": [ + "您没有权利修改这个标题。" ], - "X Axis Format": ["X 轴格式化"], - "Y Log Scale": ["Y经度标度"], - "Use a log scale for the Y-axis": ["使用Y轴的对数刻度"], - "Y Axis Bounds": ["Y 轴界限"], - "Bounds for the Y axis. When left empty, the bounds are dynamically defined based on the min/max of the data. Note that this feature will only expand the axis range. It won't narrow the data's extent.": [ - "Y轴的边界。当空时,边界是根据数据的最小/最大值动态定义的。请注意,此功能只会扩展轴范围。它不会缩小数据范围。" + "You have no permission to approve this request": [ + "您没有此请求的访问权限" ], - "X bounds": ["X界限"], - "Whether to display the min and max values of the X-axis": [ - "是否显示X轴的最小值和最大值" + "You have removed this filter.": ["您已删除此过滤条件。"], + "You have unsaved changes.": ["您有一些未保存的修改。"], + "You must pick a name for the new dashboard": [ + "您必须为新的看板选择一个名称" ], - "Rich Tooltip": ["详细提示"], - "The rich tooltip shows a list of all series for that point in time": [ - "详细提示显示了该时间点的所有序列的列表。" + "You must run the query successfully first": ["必须先成功运行查询"], + "Your dashboard is too large. Please reduce its size before saving it.": [ + "您的看板太大了。保存前请缩小尺寸。" ], - "Bar Values": ["条形栏的值"], - "Show the value on top of the bar": ["显示栏上的值"], - "Stacked Bars": ["堆叠条形图"], - "Reduce X ticks": ["减少 X 轴的刻度"], - "Reduces the number of X-axis ticks to be rendered. If true, the x-axis will not overflow and labels may be missing. If false, a minimum width will be applied to columns and the width may overflow into an horizontal scroll.": [ - "减少要渲染的X轴标记数。如果为true,x轴将不会溢出,但是标签可能丢失。如果为false,则对列应用最小宽度,宽度可能溢出到水平滚动条中。" + "Your query could not be saved": ["您的查询无法保存"], + "Your query could not be scheduled": ["无法调度您的查询"], + "Your query could not be updated": ["无法更新您的查询"], + "Your query has been scheduled. To see details of your query, navigate to Saved queries": [ + "您的查询已被调度。要查看查询的详细信息,请跳转到保存查询页面查看。" ], - "Time series": ["时间序列"], - "Interval": ["间隔"], - "Event": ["事件"], - "Hierarchy": ["层次"], - "This defines the level of the hierarchy": ["该选项定义了层次级别"], - "Primary Metric": ["主计量指标"], - "The primary metric is used to define the arc segment sizes": [ - "主计量指标用于定义弧段大小。" + "Your query was saved": ["您的查询已保存"], + "Your query was updated": ["您的查询已保存"], + "Your report could not be deleted": ["这个查询无法被加载。"], + "Zoom": ["缩放"], + "Zoom level of the map": ["地图缩放等级"], + "[Alert] %(label)s": ["[警报] %(label)s"], + "[From]-": ["[从]-"], + "[Longitude] and [Latitude] columns must be present in [Group By]": [ + "[经度] 和 [纬度] 的选择项必须出现在 [Group By]" ], - "Secondary Metric": ["次计量指标"], - "When only a primary metric is provided, a categorical color scale is used.": [ - "如果只提供了一个主计量指标,则使用分类色阶。" + "[Longitude] and [Latitude] must be set": [ + "[经度] 和 [纬度] 的选择项必须出现在 [Group By]" ], - "When a secondary metric is provided, a linear color scale is used.": [ - "当提供次计量指标时,会使用线性色阶。" + "[Missing Dataset]": ["丢失数据集"], + "[Superset] Access to the datasource %(name)s was granted": [ + "[Superset] 允许访问数据源 %(name)s" ], + "[To]-": ["[至]-"], + "[Untitled]": ["无标题"], + "[dashboard name]": ["[看板名称]"], "[optional] this secondary metric is used to define the color as a ratio against the primary metric. When omitted, the color is categorical and based on labels": [ "次计量指标用来定义颜色与主度量的比率。如果两个度量匹配,则将颜色映射到级别组" ], - "Stacked Style": ["堆积样式"], - "Subheader": ["子标题"], - "Description text that shows up below your Big Number": [ - "在大数字下面显示描述文本" + "`compare_columns` must have the same length as `source_columns`.": [ + "长度必须保持一致" ], - "Big Number Font Size": ["数字的字体大小"], - "Subheader Font Size": ["子标题的字体大小"], - "Tiny": ["微小"], - "Small": ["小"], - "Normal": ["正常"], - "Large": ["大"], - "Medium": ["中"], - "Huge": ["巨大"], - "Breakdowns": ["分解"], - "Defines how each series is broken down": ["定义每个序列是如何被分解的"], - "Sort Bars": ["排序条形栏"], - "Sort bars by x labels.": ["按 x 标签排序。"], - "Source / Target": ["源/目标"], - "Choose a source and a target": ["选择一个源和一个目标"], - "Sort by metric": ["排序指标"], - "Whether to sort results by the selected metric in descending order.": [ - "是否按所选指标按降序对结果进行排序。" + "`compare_type` must be `difference`, `percentage` or `ratio`": [ + "`compare_type` 必须是 `difference`, `percentage` 或 `ratio`" ], - "Left Axis Metric": ["左轴指标"], - "Choose a metric for left axis": ["选择左轴的计量指标"], - "Left Axis Format": ["左轴格式化"], - "Right Axis Metric": ["右轴指标"], - "Propagate": ["传播"], - "Send range filter events to other charts": [ - "将过滤条件的事件发送到其他图表" + "`confidence_interval` must be between 0 and 1 (exclusive)": [ + "`置信区间` 必须介于0和1之间(开区间)" ], - "Aggregation function": ["聚合功能"], - "Y Axis Left": ["Y轴左侧"], - "Left Axis chart(s)": ["左轴图表"], - "Choose one or more charts for left axis": ["为左轴选择一个或多个图表"], - "Prefix metric name with slice name": ["用图表名称作为指标名称的前缀"], - "Y Axis Right": ["Y轴右侧"], - "Right Axis chart(s)": ["右轴图表"], - "Choose one or more charts for right axis": ["为右轴选择一个或多个图表"], - "X Log Scale": ["X经度标度"], - "Use a log scale for the X axis": ["X轴使用经度刻度"], - "Longitude": ["经度"], - "Column containing longitude data": ["包含经度数据的列"], - "Latitude": ["纬度"], - "Column containing latitude data": ["包含纬度数据的列"], - "Clustering Radius": ["簇半径"], - "The radius (in pixels) the algorithm uses to define a cluster. Choose 0 to turn off clustering, but beware that a large number of points (>1000) will cause lag.": [ - "算法用来定义一个簇的半径(以像素为单位)。选择0关闭聚,但要注意大量的点(>1000)会导致处理时间变长。" + "`count` is COUNT(*) if a group by is used. Numerical columns will be aggregated with the aggregator. Non-numerical columns will be used to label points. Leave empty to get a count of points in each cluster.": [ + "如果分组被使用 `count` 表示 COUNT(*)。数值列将与聚合器聚合。非数值列将用于维度列。留空以获得每个簇中的点计数。" ], - "Point Radius Scale": ["点半径比例尺"], - "The radius of individual points (ones that are not in a cluster). Either a numerical column or `Auto`, which scales the point based on the largest cluster": [ - "单个点的半径(不在簇中的点)。一个数值列或“AUTO”,它根据最大的聚类来缩放点。" + "`operation` property of post processing object undefined": [ + "后处理必须指定操作类型(`operation`)" ], - "Point Radius Unit": ["点半径单位"], - "The unit of measure for the specified point radius": [ - "指定点半径的度量单位" + "`prophet` package not installed": ["未安装程序包 `fbprophet`"], + "`rename_columns` must have the same length as `columns`.": [ + "长度必须保持一致" ], - "label": ["标签"], - "`count` is COUNT(*) if a group by is used. Numerical columns will be aggregated with the aggregator. Non-numerical columns will be used to label points. Leave empty to get a count of points in each cluster.": [ - "如果分组被使用 `count` 表示 COUNT(*)。数值列将与聚合器聚合。非数值列将用于维度列。留空以获得每个簇中的点计数。" + "`row_limit` must be greater than or equal to 0": [ + "`行限制` 必须大于或等于1" ], - "Cluster label aggregator": ["集群标签聚合器"], - "Aggregate function applied to the list of points in each cluster to produce the cluster label.": [ - "聚合函数应用于每个群集中的点列表以产生群集标签。" + "`row_offset` must be greater than or equal to 0": [ + "`行偏移量` 必须大于或等于0" ], - "Live render": ["实时渲染"], - "Points and clusters will update as viewport is being changed": [ - "点和簇将随着视图改变而更新。" + "`width` must be greater or equal to 0": ["`宽度` 必须大于或等于0"], + "aggregate": ["合计"], + "alert": ["警报"], + "alerts": ["警报"], + "also copy (duplicate) charts": ["同时复制图表"], + "alter this ": ["修改这个 "], + "ancestor": ["上一个"], + "and": ["和"], + "and the explore view times out at %s seconds ": [ + ",浏览视图在 %s 秒超时" ], - "Map Style": ["地图样式"], - "Base layer map style": ["地图基本层样式"], - "Opacity of all clusters, points, and labels. Between 0 and 1.": [ - "所有簇、点和标签的不透明度。在0到1之间。" + "annotation": ["注释"], + "annotation start time or end time is required.": [ + "注释的开始时间或结束时间是必需的。" ], - "RGB Color": ["RGB颜色"], - "The color for points and clusters in RGB": ["点和簇的颜色(RGB)"], - "Default longitude": ["默认经度"], - "Longitude of default viewport": ["默认视口经度"], - "Default latitude": ["默认纬度"], - "Latitude of default viewport": ["默认视口纬度"], - "Zoom": ["缩放"], - "Zoom level of the map": ["地图缩放等级"], - "One or many controls to group by. If grouping, latitude and longitude columns must be present.": [ - "使用一个或多个控件来分组。一旦分组,则纬度和经度列必须存在。" + "annotation_layer": ["注释层"], + "at": ["在"], + "bolt": ["螺栓"], + "bottom": ["底部"], + "cached": ["已缓存"], + "cannot be empty": ["不能为空"], + "cannot be used as a column name. The column name/alias \"__timestamp\"\n is reserved for the main temporal expression, and column aliases ending with\n double underscores followed by a numeric value (e.g. \"my_col__1\") are reserved\n for deduplicating duplicate column names. Please use aliases to rename the\n invalid column names.": [ + "不能作为一个列名称使用。列名/别名 \"__timestamp\"\n 是为主要的时间表达式保留的,列别名以双下划线结尾\n 并后跟一个数值(例如 \"my_col__1\")。 这是为了\n 保留用于消除重复的列名。请使用别名来\n 重命名无效的列名。" ], - "Visual Tweaks": ["视觉调整"], - "Labelling": ["标签"], - "Points": ["点配置"], - "Point Radius": ["点半径"], - "Link Length": ["连接长度"], - "Link length in the force layout": ["在力布局中的连接长度"], - "Charge": ["电荷数(作用力)"], - "Charge in the force layout": ["在力导向图中的电荷数(作用力)"], - "Longitude & Latitude": ["经纬度"], - "Ignore null locations": ["忽略空位置"], - "Whether to ignore locations that are null": ["是否忽略空位置"], - "Viewport": ["视口"], - "Parameters related to the view and perspective on the map": [ - "与视图和透视图相关的参数" + "chart": ["图表"], + "charts": ["图表"], + "choose WHERE or HAVING...": ["选择WHERE或HAVING子句..."], + "column": ["列"], + "count": ["列"], + "create a ": ["创建一个 "], + "css": ["css"], + "css_template": ["css模板"], + "cumulative": ["激活"], + "dashboard": ["看板"], + "dashboards": ["看板"], + "database": ["数据库"], + "dataset": ["数据集"], + "date": ["日期"], + "day": ["天"], + "day of the month": ["一个月中的天数"], + "day of the week": ["一周的天数"], + "delete": ["删除"], + "descendant": ["降序"], + "description": ["描述"], + "dialect+driver://username:password@host:port/database": [""], + "download as csv": ["下载为图片"], + "draft": ["草稿"], + "dttm": ["dttm"], + "e.g. ********": ["********"], + "e.g. 127.0.0.1": ["127.0.0.1"], + "e.g. 5432": ["5432"], + "e.g. Analytics": ["高级分析"], + "e.g. param1=value1¶m2=value2": ["例如:param1=value1¶m2=value2"], + "e.g. world_population": ["世界人口"], + "e.g., a \"user id\" column": ["时间序列的列"], + "every": ["任意"], + "every day of the month": ["每月的每一天"], + "every day of the week": ["一周的每一天"], + "every hour": ["每小时"], + "every minute": ["每分钟 UTC"], + "every month": ["每个月"], + "feature to store a summarized data set that you can then explore.": [ + "用于存储可供浏览的汇总数据集的功能。" ], - "Auto Zoom": ["自动缩放"], - "When checked, the map will zoom to your data after each query": [ - "选中后,地图将根据您的数据进行缩放。" + "fetching": ["抓取中"], + "filter_box will be deprecated in a future version of Superset. Please replace filter_box by dashboard filter components.": [ + "'filter_box将在Superset的未来版本中弃用。" ], - "Map": ["地图"], - "Point Size": ["点大小"], - "Fixed point radius": ["固定的点半径"], - "Point Unit": ["点单位"], - "Minimum Radius": ["最小半径"], - "Minimum radius size of the circle, in pixels. As the zoom level changes, this insures that the circle respects this minimum radius.": [ - "圆的最小半径大小,以像素为单位。随着缩放等级的变化,这保证了圆根据这个最小半径变化。" - ], - "Maximum Radius": ["最大半径"], - "Maxium radius size of the circle, in pixels. As the zoom level changes, this insures that the circle respects this maximum radius.": [ - "圆的最大半径大小,以像素为单位。随着缩放等级的变化,这保证了圆根据这个最大半径变化。" - ], - "Multiplier": ["乘数"], - "Factor to multiply the metric by": ["因子乘以度量指标"], - "Point Color": ["点颜色"], - "Categorical Color": ["分类颜色"], - "Fixed Color": ["固定颜色"], - "Legend Position": ["图示位置"], - "Choose the position of the legend": ["选择图示的位置"], - "Legend Format": ["图示格式化"], - "Choose the format for legend values": ["选择图示值的格式化方式"], - "Dimension": ["维度"], - "Select a dimension": ["选择一个维度"], - "Extra data for JS": ["额外的JS数据"], - "List of extra columns made available in Javascript functions": [ - "JavaScript函数中可用的额外列的列表" - ], - "Javascript tooltip generator": ["JavaScript工具提示生成器"], - "Define a function that receives the input and outputs the content for a tooltip": [ - "定义一个函数,接收输入输出工具提示的内容" - ], - "This functionality is disabled in your environment for security reasons.": [ - "出于安全原因,该功能在您的环境中被禁用。" - ], - "Javascript onClick href": ["Javascript onClick事件触发转跳地址"], - "Define a function that returns a URL to navigate to when user clicks": [ - "定义一个函数,当用户单击时返回导航URL" - ], - "Grid": ["网格"], - "Grid Size": ["网格大小"], - "Defines the grid size in pixels": ["定义网格像素大小"], - "GeoJson Column": ["GeoJson 列"], - "Select the geojson column": ["选择 GeoJson 列"], - "GeoJson Settings": ["GeoJson设置"], - "Fill Color": ["填充颜色"], - " Set the opacity to 0 if you do not want to override the color specified in the GeoJSON": [ - "如果不想重写GeoJSON中指定的颜色,则将不透明度设置为0。" - ], - "Stroke Color": ["笔划颜色"], - "Filled": ["填充"], - "Whether to fill the objects": ["是否填充对象"], - "Stroked": ["笔划"], - "Whether to display the stroke": ["是否显示笔划"], - "Extruded": ["突出"], - "Whether to make the grid 3D": ["是否将网格设置为3D"], - "Reverse Lat & Long": ["反向经纬度"], - "Lines column": ["线列"], - "The database columns that contains lines information": [ - "包含行信息的数据库列" + "following this flow will most likely lead to your query timing out. ": [ + "遵循此流程很可能会导致查询超时。" ], - "Lines encoding": ["线编码"], - "The encoding format of the lines": ["线的编码格式"], - "Polygon Settings": ["多边形设置"], - "Number of buckets to group data": ["分组数据的桶数量"], - "How many buckets should the data be grouped in.": [ - "应该将数据分组到多少个存储桶中。" - ], - "Bucket break points": ["桶断点"], - "List of n+1 values for bucketing metric into n buckets.": [ - "n+1个值的列表,用于将指标值放入n个桶中。" - ], - "Multiple filtering": ["多重过滤"], - "Allow sending multiple polygons as a filter event": [ - "允许将多个多边形作为过滤事件进行发送" - ], - "Whether to apply filter when items are clicked": [ - "单击选项时是否应用筛选器" - ], - "Start Longitude & Latitude": ["开始经纬度"], - "End Longitude & Latitude": ["经纬度结束"], - "Point to your spatial columns": ["指向您的空间列"], - "Arc": ["弧"], - "Target Color": ["目标颜色"], - "Color of the target location": ["目标位置的颜色"], - "Javascript data interceptor": ["JavaScript数据拦截器"], - "Define a javascript function that receives the data array used in the visualization and is expected to return a modified version of that array. This can be used to alter properties of the data, filter, or enrich the array.": [ - "定义一个JavaScript函数,该函数接收可视化中使用的数组数据,并返回修改版本的数组。这可用于更改数据、筛选或丰富数组的属性。" - ], - "No database is allowed for your csv upload": [ - "不允许将数据库用于csv上载" - ], - "Failed to fetch schemas allowed for csv upload in this database! Please contact your Superset Admin!": [ - "无法获取此数据库中允许csv上载的结构!请联系系统的管理员!" - ], - "One or many columns to group by": ["需要进行分组的一列或多列"], - "One or many columns to pivot as columns": [ - "需要作为列属性进行透视的一列或多列" + "for more information on how to structure your URI.": [ + " 来查询有关如何构造URI的更多信息。" ], - "Square meters": ["平方米"], - "Square kilometers": ["平方千米"], - "quarter": ["季度"], - "second": ["秒"], - "Last day": ["昨天"], - "Last month": ["上个月"], - "Last quarter": ["上个季度"], - "Last year": ["去年"], - "Defaults": ["默认"], - "Start / end": ["开始 / 结束"], - "Relative to today": ["相对于今天"], - "seconds": ["秒"], - "minutes": ["分钟"], - "hours": ["小时"], - "days": ["天"], - "weeks": ["周"], - "months": ["月"], - "years": ["年"], - "Ok": ["确认"], - "No Results": ["无结果"], - "No results were returned for this query. If you expected results to be returned, ensure any filters are configured properly and the datasource contains data for the selected time range.": [ - "此查询没有返回任何结果。如果希望返回结果,请确保所有过滤选择的配置正确,并且数据源包含所选时间范围的数据。" - ] + "green": ["绿色"], + "shere": ["分享"], + "hour": ["小时"], + "id:": ["id:"], + "image-rendering CSS attribute of the canvas object that defines how the browser scales up the image": [ + "图像渲染画布对象的 CSS 属性,它定义了浏览器如何放大图像" + ], + "in": ["在"], + "in modal": ["(在模型中)"], + "is expected to be a number": ["应该为数字"], + "is expected to be an integer": ["应该为为整数"], + "joined": ["已加入"], + "json isn't valid": ["无效 JSON"], + "key a-z": ["a-z"], + "key z-a": ["z-a"], + "label": ["标签"], + "last day": ["上一(昨)天"], + "last month": ["上一月"], + "last quarter": ["上一季度"], + "last week": ["上一周"], + "last year": ["上一年"], + "latest partition:": ["最新分区:"], + "left": ["警报"], + "log": ["日志"], + "lower percentile must be greater than 0 and less than 100. Must be lower than upper percentile.": [ + "下百分位数必须大于0且小于100。而且必须低于上百分位" + ], + "minute": ["分"], + "minute(s)": ["分钟"], + "month": ["月"], + "must have a value": ["必填"], + "nvd3": ["nvd3"], + "on": ["位于"], + "orderby column must be populated": ["无法更新您的查询"], + "p-value precision": ["假定值精度"], + "page_size.all": [""], + "page_size.entries": [""], + "page_size.show": [""], + "percentile (exclusive)": ["百分位数(独占)"], + "percentiles must be a list or tuple with two numeric values, of which the first is lower than the second value": [ + "百分位数必须是具有两个数值的列表或元组,其中第一个数值要小于第二个数值" + ], + "previous calendar month": ["前一月"], + "previous calendar week": ["前一周"], + "previous calendar year": ["前一年"], + "published": ["已发布"], + "queries": ["序列"], + "query": ["查询"], + "reboot": ["重启"], + "recents": ["最近"], + "red": ["红色"], + "report": ["报告"], + "reports": ["报告"], + "right": ["高度"], + "rows": ["行"], + "rows retrieved": ["行被检索到"], + "saved queries": ["已保存查询"], + "search.num_records": [""], + "series: Treat each series independently; overall: All series use the same scale; change: Show changes compared to the first data point in each series": [ + "series:独立处理每个序列;overall:所有序列使用相同的比例;change:显示与每个序列中第一个数据点相比的更改" + ], + "textarea": ["文本区域"], + "stop": ["停止"], + "upper percentile must be greater than 0 and less than 100. Must be higher than lower percentile.": [ + "上百分位数必须大于0且小于100。而且必须高于下百分位。" + ], + "value ascending": ["指标升序"], + "value descending": ["指标降序"], + "virtual": ["虚拟信息"], + "was created": ["已创建"], + "week": ["周"], + "year": ["年"], + "yellow": ["黄色"], + "Upload file to database": ["上传文件到数据库"], + "Connect database": ["连接数据库"], + "Upload columnar file to database": ["上传列级文件"], + "Upload CSV": ["上传CSV"], + "Upload columnar file": ["上传列级文件"], + "Upload Excel file": ["上传Excel"], + "Handlebars": ["句柄图"], + "deck.gl Arc": ["圆弧图"], + "Import database from file": ["从文件中导入数据库"], + "Select a database to connect": ["选择将要连接的数据库"], + "Select a database to write a query": ["选择要写入查询的数据库"], + "Choose one of the available databases from the panel on the left.": [ + "从左侧的面板中选择一个可用的数据库" + ], + "Add a new tab": ["添加新的标签页"], + "There are no databases available": ["没有可用的数据库"], + "No databases match your search": ["没有与您的搜索匹配的数据库"], + "Manage your databases": ["管理你的数据库"], + "here": ["这里"] } } } diff --git a/superset/translations/zh/LC_MESSAGES/messages.po b/superset/translations/zh/LC_MESSAGES/messages.po index ea3762b1c6c9..9ac344983a0e 100644 --- a/superset/translations/zh/LC_MESSAGES/messages.po +++ b/superset/translations/zh/LC_MESSAGES/messages.po @@ -91,7 +91,7 @@ msgstr "" #: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:122 msgid " (excluded)" -msgstr "" +msgstr "(不包含)" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:235 msgid " expression which needs to adhere to the " @@ -132,17 +132,17 @@ msgid "" msgstr "" #: superset/security/analytics_db_safety.py:44 -#, fuzzy, python-format +#, python-format msgid "%(dialect)s cannot be used as a data source for security reasons." -msgstr "出于安全原因,SQLite数据库不能用作数据源。" +msgstr "出于安全原因,%(dialect)s SQLite数据库不能用作数据源。" #: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:84 -#, fuzzy, python-format +#, python-format msgid "" "%(message)s\n" "This may be triggered by: \n" "%(issues)s" -msgstr "这可能由以下因素触发:" +msgstr "%(message)s\n这可能由以下因素触发:%(issues)s" #: superset/reports/notifications/email.py:122 superset/tasks/schedules.py:364 #, python-format @@ -152,7 +152,7 @@ msgstr "" #: superset/db_engine_specs/snowflake.py:99 #, python-format msgid "%(object)s does not exist in this database." -msgstr "" +msgstr "%(object)s 数据库中不存在。" #: superset/reports/notifications/email.py:126 superset/tasks/schedules.py:296 #: superset/tasks/schedules.py:465 @@ -163,17 +163,17 @@ msgstr "" #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:635 #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:642 #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:656 -#, fuzzy, python-format +#, python-format msgid "%(rows)d rows returned" -msgstr "行被检索到" +msgstr "%(rows)d行被检索到" #: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:93 -#, fuzzy, python-format +#, python-format msgid "" "%(subtitle)s\n" "This may be triggered by:\n" " %(issue)s" -msgstr "这可能由以下因素触发:" +msgstr "%(subtitle)s\n这可能由以下因素触发:%(issue)s" #: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:88 #, python-format @@ -252,7 +252,7 @@ msgid "%s column(s) and metric(s)" msgstr "%s 列与计量指标" #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:297 -#, fuzzy, python-format +#, python-format msgid "%s operator(s)" msgstr "%s 运算符" @@ -260,7 +260,7 @@ msgstr "%s 运算符" #: superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx:256 #: superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx:82 #: superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx:92 -#, fuzzy, python-format +#, python-format msgid "%s option" msgstr "%s 个选项" @@ -291,13 +291,12 @@ msgid "(Removed)" msgstr "(已删除)" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:637 -#, fuzzy msgid "(deleted)" msgstr "删除" #: superset-frontend/src/utils/getClientErrorObject.ts:56 msgid "(no description, click to see stack trace)" -msgstr "" +msgstr "无描述,单击可查看堆栈跟踪" #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:168 msgid "" @@ -332,7 +331,6 @@ msgid "**Select** a dashboard OR **create** a new one" msgstr "**选择** 一个看板或者 **创建** 一个看板" #: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:260 -#, fuzzy msgid "" "-- Note: Unless you save your query, these tabs will NOT persist if you " "clear your cookies or change browsers.\n" @@ -352,9 +350,8 @@ msgid "1 minute" msgstr "1分钟" #: superset/db_engine_specs/base.py:91 -#, fuzzy msgid "10 minute" -msgstr "1分钟" +msgstr "10分钟" #: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:30 msgid "10 seconds" @@ -365,9 +362,8 @@ msgid "12 hours" msgstr "12小时" #: superset/db_engine_specs/base.py:92 -#, fuzzy msgid "15 minute" -msgstr "1分钟" +msgstr "15分钟" #: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:38 msgid "24 hours" @@ -376,18 +372,17 @@ msgstr "24 小时" #: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:32 #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:35 msgid "2D" -msgstr "" +msgstr "2D" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:116 msgid "3 letter code of the country" -msgstr "国家3字母代码" +msgstr "国家3字码" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:128 msgid "30 days" msgstr "30天" #: superset/db_engine_specs/base.py:93 -#, fuzzy msgid "30 minute" msgstr "30分钟" @@ -396,7 +391,6 @@ msgid "30 minutes" msgstr "30分钟" #: superset/db_engine_specs/base.py:88 -#, fuzzy msgid "30 second" msgstr "30秒钟" @@ -405,7 +399,6 @@ msgid "30 seconds" msgstr "30秒钟" #: superset/db_engine_specs/base.py:90 -#, fuzzy msgid "5 minute" msgstr "5分钟" @@ -414,12 +407,10 @@ msgid "5 minutes" msgstr "5分钟" #: superset/db_engine_specs/base.py:87 -#, fuzzy msgid "5 second" -msgstr "秒" +msgstr "5秒" #: superset/db_engine_specs/base.py:95 -#, fuzzy msgid "6 hour" msgstr "6小时" @@ -437,7 +428,7 @@ msgstr "90天" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:49 msgid ":" -msgstr "" +msgstr ":" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:86 msgid "< (Smaller than)" @@ -465,9 +456,8 @@ msgid ">= (Larger or equal)" msgstr ">= (大于等于)" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:35 -#, fuzzy msgid "A Big Number" -msgstr "数字" +msgstr "大数字" #: superset/views/alerts.py:195 msgid "" @@ -480,14 +470,12 @@ msgid "A comma separated list of columns that should be parsed as dates." msgstr "应作为日期解析的列的逗号分隔列表。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:383 -#, fuzzy msgid "A comma-separated list of schemas that CSVs are allowed to upload to." -msgstr "应作为日期解析的列的逗号分隔列表。" +msgstr "允许以逗号分割的CSV文件上传" #: superset/databases/commands/exceptions.py:42 -#, fuzzy msgid "A database with the same name already exists." -msgstr "同名数据库已存在" +msgstr "已存在同名的数据库。" #: superset/views/dynamic_plugins.py:52 msgid "" @@ -505,7 +493,7 @@ msgstr "有权处理该图表的用户列表。可按名称或用户名搜索。 #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:29 msgid "A map of the world, that can indicate values in different countries." -msgstr "" +msgstr "一张世界地图,可以显示不同国家的价值观。" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:161 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:209 @@ -518,7 +506,7 @@ msgid "" "A polar coordinate chart where the circle is broken into wedges of equal " "angle, and the value represented by any wedge is illustrated by its area," " rather than its radius or sweep angle." -msgstr "" +msgstr "一种极坐标图表,其中圆被分成等角度的楔形,任何楔形表示的值由其面积表示,而不是其半径或扫掠角度。" #: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:523 msgid "A readable URL for your dashboard" @@ -544,27 +532,23 @@ msgstr "在查询中可用的一组参数使用JINJA模板语法" msgid "" "A time series chart that visualizes how a related metric from multiple " "groups vary over time. Each group is visualized using a different color." -msgstr "" +msgstr "时间序列图表,直观显示多个组中的相关指标随时间的变化情况。每组使用不同的颜色进行可视化" #: superset/reports/commands/exceptions.py:198 -#, fuzzy msgid "A timeout occurred while executing the query." -msgstr "警报在执行查询时发现错误。" +msgstr "查询超时。" #: superset/reports/commands/exceptions.py:206 -#, fuzzy msgid "A timeout occurred while generating a csv." -msgstr "获取tab页状态时出错" +msgstr "生成CSV时超时。" #: superset/reports/commands/exceptions.py:210 -#, fuzzy msgid "A timeout occurred while generating a dataframe." -msgstr "创建数据源时发生错误" +msgstr "生成数据超时" #: superset/reports/commands/exceptions.py:202 -#, fuzzy msgid "A timeout occurred while taking a screenshot." -msgstr "获取tab页状态时出错" +msgstr "截图超时" #: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:168 msgid "A valid color scheme is required" @@ -651,9 +635,8 @@ msgid "Add" msgstr "新增" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1056 -#, fuzzy msgid "Add Alert" -msgstr "警报" +msgstr "添加告警" #: superset/views/annotations.py:60 msgid "Add Annotation" @@ -712,9 +695,8 @@ msgid "Add Metric" msgstr "添加指标" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1055 -#, fuzzy msgid "Add Report" -msgstr "报告" +msgstr "添加报告" #: superset/connectors/sqla/views.py:316 msgid "Add Row level security filter" @@ -729,9 +711,8 @@ msgid "Add a Plugin" msgstr "添加插件" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:175 -#, fuzzy msgid "Add additional custom parameters" -msgstr "编辑模板参数" +msgstr "添加其他自定义参数" #: superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:63 msgid "Add an item" @@ -769,21 +750,19 @@ msgstr "添加指标" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/ConditionalFormattingControl.tsx:176 msgid "Add new color formatter" -msgstr "" +msgstr "添加新的颜色" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/ConditionalFormattingControl.tsx:169 -#, fuzzy msgid "Add new formatter" -msgstr "日期格式化" +msgstr "新增格式化" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:386 msgid "Add notification method" msgstr "添加注释层" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:99 -#, fuzzy msgid "Add sheet" -msgstr "添加数据集" +msgstr "添加sheet页" #: superset-frontend/src/explore/components/SaveModal.tsx:258 msgid "Add to dashboard" @@ -798,39 +777,35 @@ msgid "Adding new datasource [{}]" msgstr "添加 Druid 数据源 [{}]" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:173 -#, fuzzy msgid "Additional Parameters" -msgstr "编辑模板参数" +msgstr "附加参数" #: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:324 msgid "Additional information" msgstr "附加信息" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:96 -#, fuzzy msgid "Additional metadata" -msgstr "附加信息" +msgstr "附加元数据" #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:50 msgid "Additional padding for legend." msgstr "图示附加的padding值。" #: superset/db_engine_specs/base.py:1398 -#, fuzzy msgid "Additional parameters" msgstr "编辑模板参数" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:166 msgid "Additional text to add before or after the value, e.g. unit" -msgstr "" +msgstr "附加文本到数据前(后),例如:单位" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:40 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:40 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:43 -#, fuzzy msgid "Additive" -msgstr "增加条件" +msgstr "附加" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:765 #: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:580 @@ -865,7 +840,6 @@ msgstr "高级分析" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:64 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:71 #: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:124 -#, fuzzy msgid "Advanced-Analytics" msgstr "高级分析" @@ -888,24 +862,21 @@ msgstr "高级分析" #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:58 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:41 msgid "Aesthetic" -msgstr "" +msgstr "炫酷" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:84 -#, fuzzy msgid "After" -msgstr "季度" +msgstr "之后" #: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:45 msgid "Aggregate" msgstr "聚合" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:91 -#, fuzzy msgid "Aggregate Mean" -msgstr "合计" +msgstr "合计平均值" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:96 -#, fuzzy msgid "Aggregate Sum" msgstr "合计" @@ -929,87 +900,87 @@ msgstr "聚合功能" #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:92 msgid "Alert Triggered, In Grace Period" -msgstr "警报已触发,在宽限期内" +msgstr "告警已触发,在宽限期内" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1123 msgid "Alert condition" -msgstr "警报状态" +msgstr "告警条件" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1215 msgid "Alert condition schedule" -msgstr "警报条件计划" +msgstr "告警条件计划" #: superset/reports/commands/exceptions.py:218 msgid "Alert ended grace period." -msgstr "警报已结束宽限期。" +msgstr "告警已结束宽限期。" #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:82 msgid "Alert failed" -msgstr "警报失败" +msgstr "告警失败" #: superset/reports/commands/exceptions.py:214 msgid "Alert fired during grace period." -msgstr "在宽限期内触发警报。" +msgstr "在宽限期内触发告警。" #: superset/reports/commands/exceptions.py:194 msgid "Alert found an error while executing a query." -msgstr "警报在执行查询时发现错误。" +msgstr "告警在执行查询时发现错误。" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1064 #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1072 msgid "Alert name" -msgstr "警报名称" +msgstr "告警名称" #: superset/reports/commands/exceptions.py:222 msgid "Alert on grace period" -msgstr "警报宽限期" +msgstr "告警宽限期" #: superset/reports/commands/exceptions.py:190 msgid "Alert query returned a non-number value." -msgstr "警报查询返回非数字值。" +msgstr "告警查询返回非数字值。" #: superset/reports/commands/exceptions.py:186 msgid "Alert query returned more than one column." -msgstr "警报查询返回多个列。" +msgstr "告警查询返回多个列。" #: superset/reports/commands/alert.py:105 #, python-format msgid "Alert query returned more than one column. %s columns returned" -msgstr "警报查询返回多个列。%s 列被返回" +msgstr "告警查询返回多个列。%s 列被返回" #: superset/reports/commands/exceptions.py:177 msgid "Alert query returned more than one row." -msgstr "警报查询返回了多行。" +msgstr "告警查询返回了多行。" #: superset/reports/commands/alert.py:96 #, python-format msgid "Alert query returned more than one row. %s rows returned" -msgstr "警报查询返回了多行。%s 行被返回" +msgstr "告警查询返回了多行。%s 行被返回" #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:75 msgid "Alert running" -msgstr "警报运行" +msgstr "告警运行中" #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:68 msgid "Alert triggered, notification sent" -msgstr "警报已触发,通知已发送" +msgstr "告警已触发,通知已发送" #: superset/reports/commands/exceptions.py:182 msgid "Alert validator config error." -msgstr "错误的经纬度配置。" +msgstr "告警验证器配置错误。" #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:436 #: superset/initialization/__init__.py:468 msgid "Alerts" -msgstr "警报" +msgstr "告警" #: superset/initialization/__init__.py:480 msgid "Alerts & Reports" -msgstr "警报和报告" +msgstr "告警和报告" #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:432 msgid "Alerts & reports" -msgstr "警报和报告" +msgstr "告警和报告" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:127 #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:427 @@ -1044,10 +1015,9 @@ msgstr "所有过滤" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx:326 #, python-format msgid "All filters (%(filterCount)d)" -msgstr "" +msgstr "所有过滤(%(filterCount)d)" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/state.ts:49 -#, fuzzy msgid "All panels" msgstr "应用于所有面板" @@ -1097,11 +1067,11 @@ msgstr "允许 sql lab 获取所有数据库架构中的所有表和所有视图 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:98 msgid "Allow creation of new tables based on queries" -msgstr "" +msgstr "允许基于查询创建新表" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:112 msgid "Allow creation of new views based on queries" -msgstr "" +msgstr "允许基于查询创建新视图" #: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:256 msgid "Allow data manipulation language" @@ -1115,29 +1085,28 @@ msgstr "允许数据上传" msgid "" "Allow manipulation of the database using non-SELECT statements such as " "UPDATE, DELETE, CREATE, etc." -msgstr "" +msgstr "允许使用非SELECT语句(如UPDATE、DELETE、CREATE等)操作数据库。" #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:216 msgid "Allow multiple selections" msgstr "允许多选" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:189 -#, fuzzy msgid "Allow node selections" -msgstr "允许多选" +msgstr "允许多节点选择" #: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:64 #: superset-frontend/src/filters/components/Select/controlPanel.ts:82 msgid "Allow selecting multiple values" -msgstr "" +msgstr "允许选择多个值" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:192 msgid "Allow this database to be explored" -msgstr "" +msgstr "允许浏览此数据库" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:79 msgid "Allow this database to be queried in SQL Lab" -msgstr "" +msgstr "允许在SQL工具箱中查询此数据库" #: superset/views/database/mixins.py:115 msgid "" @@ -1156,7 +1125,7 @@ msgid "" "distributions of a related metric across multiple groups. The box in the " "middle emphasizes the mean, median, and inner 2 quartiles. The whiskers " "around each box visualize the min, max, range, and outer 2 quartiles." -msgstr "" +msgstr "也称为框须图,该可视化比较了一个相关指标在多个组中的分布。中间的框强调平均值、中值和内部2个四分位数。每个框周围的触须可视化了最小值、最大值、范围和外部2个四分区。" #: superset-frontend/src/components/AlteredSliceTag/index.jsx:182 msgid "Altered" @@ -1172,7 +1141,7 @@ msgstr "使用时间比较时,必须指定封闭的时间范围(有开始和 msgid "" "An engine must be specified when passing individual parameters to a " "database." -msgstr "" +msgstr "向数据库传递单个参数时必须指定引擎。" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:623 #: superset-frontend/src/components/Datasource/DatasourceModal.tsx:140 @@ -1193,14 +1162,9 @@ msgstr "发生了一个错误" msgid "An error occurred saving dataset" msgstr "保存数据集时发生错误" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:132 -msgid "An error occurred when refreshing queries" -msgstr "创建数据源时发生错误" - #: superset/key_value/commands/exceptions.py:33 -#, fuzzy msgid "An error occurred while accessing the value." -msgstr "创建数据源时发生错误" +msgstr "访问值时出错。" #: superset-frontend/src/SqlLab/actions/sqlLab.js:1165 msgid "" @@ -1209,9 +1173,9 @@ msgid "" msgstr "收起表结构时出错。请与管理员联系。" #: superset-frontend/src/views/CRUD/hooks.ts:301 -#, fuzzy, python-format +#, python-format msgid "An error occurred while creating %ss: %s" -msgstr "获取数据集时出错:%s" +msgstr "创建时出错:%ss: %s" #: superset-frontend/src/SqlLab/actions/sqlLab.js:1313 #: superset-frontend/src/SqlLab/actions/sqlLab.js:1335 @@ -1219,24 +1183,22 @@ msgid "An error occurred while creating the data source" msgstr "创建数据源时发生错误" #: superset/key_value/commands/exceptions.py:29 -#, fuzzy msgid "An error occurred while creating the value." -msgstr "创建数据源时发生错误" +msgstr "创建值时出错。" #: superset/key_value/commands/exceptions.py:37 -#, fuzzy, python-format +#, python-format msgid "An error occurred while deleting the value." -msgstr "获取结构信息时出错:%s" +msgstr "删除值时出错。" #: superset-frontend/src/reports/actions/reports.js:138 -#, fuzzy msgid "An error occurred while editing this report." -msgstr "创建数据源时发生错误" +msgstr "编辑此报告时出错。" #: superset-frontend/src/reports/actions/reports.js:120 -#, fuzzy, python-format +#, python-format msgid "An error occurred while editing this report: %s" -msgstr "获取数据集时出错:%s" +msgstr "编辑此报告时出错:%s" #: superset-frontend/src/SqlLab/actions/sqlLab.js:1141 msgid "" @@ -1245,16 +1207,16 @@ msgid "" msgstr "展开表结构时出错。请与管理员联系。" #: superset-frontend/src/views/CRUD/hooks.ts:103 -#, fuzzy, python-format +#, python-format msgid "An error occurred while fetching %s info: %s" -msgstr "获取仪表板时出错:%s" +msgstr "获取%s仪表板时出错:%s" #: superset-frontend/src/views/CRUD/hooks.ts:171 #: superset-frontend/src/views/CRUD/hooks.ts:258 #: superset-frontend/src/views/CRUD/hooks.ts:344 -#, fuzzy, python-format +#, python-format msgid "An error occurred while fetching %ss: %s" -msgstr "获取数据集时出错:%s" +msgstr "抓取出错:%ss: %s" #: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:132 msgid "An error occurred while fetching available CSS templates" @@ -1332,9 +1294,8 @@ msgid "An error occurred while fetching datasets: %s" msgstr "获取数据集时出错:%s" #: superset-frontend/src/SqlLab/actions/sqlLab.js:1356 -#, fuzzy msgid "An error occurred while fetching function names." -msgstr "获取tab页状态时出错" +msgstr "获取函数名称时出错。" #: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:460 #: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:358 @@ -1359,22 +1320,21 @@ msgid "" msgstr "获取表格元数据时发生错误。请与管理员联系。" #: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:375 -#, fuzzy, python-format +#, python-format msgid "An error occurred while fetching user values: %s" -msgstr "获取结构信息时出错:%s" +msgstr "获取用户信息出错:%s" #: superset-frontend/src/SqlLab/actions/sqlLab.js:698 -#, fuzzy msgid "" "An error occurred while hiding the left bar. Please contact your " "administrator." -msgstr "展开表结构时出错。请与管理员联系。" +msgstr "隐藏左栏时出错。请与管理员联系。" #: superset-frontend/src/views/CRUD/hooks.ts:438 #: superset-frontend/src/views/CRUD/hooks.ts:451 -#, fuzzy, python-format +#, python-format msgid "An error occurred while importing %s: %s" -msgstr "精简日志时出错 " +msgstr "导入时出错 %s: %s" #: superset-frontend/src/chart/chartAction.js:569 msgid "An error occurred while loading the SQL" @@ -1441,9 +1401,8 @@ msgid "" msgstr "设置tab页标题时出错。请与管理员联系。" #: superset-frontend/src/explore/actions/exploreActions.ts:95 -#, fuzzy msgid "An error occurred while starring this chart" -msgstr "创建数据源时发生错误" +msgstr "以此字符开头时出错" #: superset-frontend/src/SqlLab/actions/sqlLab.js:232 #: superset-frontend/src/SqlLab/actions/sqlLab.js:258 @@ -1460,9 +1419,8 @@ msgid "" msgstr "在后端存储查询时出错。为避免丢失更改,请使用 \"保存查询\" 按钮保存查询。" #: superset/key_value/commands/exceptions.py:41 -#, fuzzy msgid "An error occurred while updating the value." -msgstr "创建数据源时发生错误" +msgstr "更新值时出错。" #: superset/views/core.py:711 msgid "An unknown error occurred. Please contact your Superset administrator" @@ -1474,16 +1432,15 @@ msgstr "锚定到" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:121 msgid "Angle at which to end progress axis" -msgstr "" +msgstr "进度轴结束的角度" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:111 msgid "Angle at which to start progress axis" -msgstr "" +msgstr "开始进度轴的角度" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:191 -#, fuzzy msgid "Animation" -msgstr "注释" +msgstr "动画" #: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:202 #: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:248 @@ -1502,9 +1459,8 @@ msgid "Annotation Layers" msgstr "注释层" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:465 -#, fuzzy msgid "Annotation Slice Configuration" -msgstr "过滤配置" +msgstr "注释切片配置" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:758 msgid "Annotation Source" @@ -1548,9 +1504,8 @@ msgid "Annotation layer delete failed." msgstr "注释层仍在加载。" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:517 -#, fuzzy msgid "Annotation layer description columns" -msgstr "注释层仍在加载。" +msgstr "注释层描述列。" #: superset/annotation_layers/commands/exceptions.py:53 #: superset/annotation_layers/commands/exceptions.py:57 @@ -1558,9 +1513,8 @@ msgid "Annotation layer has associated annotations." msgstr "注释层仍在加载。" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:492 -#, fuzzy msgid "Annotation layer interval end" -msgstr "注释层名称" +msgstr "注释层间隔结束" #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayerModal.tsx:247 msgid "Annotation layer name" @@ -1571,28 +1525,25 @@ msgid "Annotation layer not found." msgstr "注释层仍在加载。" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:634 -#, fuzzy msgid "Annotation layer opacity" -msgstr "注释层类型" +msgstr "注释层不透明度" #: superset/annotation_layers/commands/exceptions.py:29 msgid "Annotation layer parameters are invalid." msgstr "注释层仍在加载。" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:619 -#, fuzzy +# stroke 中风??? msgid "Annotation layer stroke" -msgstr "注释层类型" +msgstr "注释层混乱" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:472 -#, fuzzy msgid "Annotation layer time column" -msgstr "注释层类型" +msgstr "注释层时间列" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:506 -#, fuzzy msgid "Annotation layer title column" -msgstr "注释层类型" +msgstr "注释层标题列" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:743 #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:746 @@ -1600,9 +1551,8 @@ msgid "Annotation layer type" msgstr "注释层类型" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:403 -#, fuzzy msgid "Annotation layer value" -msgstr "注释层名称" +msgstr "注释层值" #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:72 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:343 @@ -1626,9 +1576,8 @@ msgid "Annotation parameters are invalid." msgstr "注释层仍在加载。" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:755 -#, fuzzy msgid "Annotation source type" -msgstr "注释来源" +msgstr "注释数据源类型" #: superset/views/annotations.py:58 msgid "Annotations" @@ -1659,7 +1608,7 @@ msgstr "所有" #: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:563 #: superset-frontend/src/explore/components/PropertiesModal/index.tsx:269 msgid "Any additional detail to show in the certification tooltip." -msgstr "" +msgstr "要在认证工具提示中显示详细信息。" #: superset-frontend/src/dashboard/components/ColorSchemeControlWrapper.jsx:56 msgid "" @@ -1669,13 +1618,13 @@ msgstr "此处选择的任何调色板都将覆盖应用于此看板的各个图 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:702 msgid "Any databases that allow connections via SQL Alchemy URIs can be added. " -msgstr "" +msgstr "可以添加任何允许通过SQL AlChemy URI进行连接的数据库。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:716 msgid "" "Any databases that allow connections via SQL Alchemy URIs can be added. " "Learn about how to connect a database driver " -msgstr "" +msgstr "可以添加任何允许通过SQL AlChemy URI进行连接的数据库。了解如何连接数据库驱动程序" #: superset/views/database/forms.py:147 superset/views/database/forms.py:300 #: superset/views/database/forms.py:428 @@ -1683,9 +1632,9 @@ msgid "Append" msgstr "追加" #: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:186 -#, fuzzy, python-format +#, python-format msgid "Applied Cross Filters (%d)" -msgstr "应用的条件 (%d)" +msgstr "应用的交叉条件 (%d)" #: superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel/index.tsx:210 #, python-format @@ -1708,16 +1657,15 @@ msgstr "应用" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:321 msgid "Apply conditional color formatting to metrics" -msgstr "" +msgstr "将条件颜色格式应用于指标" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:474 msgid "Apply conditional color formatting to numeric columns" -msgstr "" +msgstr "将条件颜色格式应用于数字列" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:79 -#, fuzzy msgid "Apply metrics on" -msgstr "我的指标" +msgstr "应用指标到" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx:123 msgid "Apply to all panels" @@ -1796,21 +1744,18 @@ msgid "Area Chart" msgstr "面积图" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:168 -#, fuzzy msgid "Area chart" -msgstr "共享图表" +msgstr "面积图" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:131 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:146 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:149 -#, fuzzy msgid "Area chart opacity" -msgstr "共享图表" +msgstr "面积图不透明度" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:238 -#, fuzzy msgid "Arrow" -msgstr "行" +msgstr "箭头" #: superset/connectors/druid/views.py:342 superset/connectors/sqla/views.py:487 msgid "Associated Charts" @@ -1845,12 +1790,11 @@ msgstr "自动补全查询谓词" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:242 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:270 msgid "Available sorting modes:" -msgstr "" +msgstr "可用分类模式:" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:200 -#, fuzzy msgid "Axis" -msgstr "Y 轴" +msgstr "坐标轴" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:36 msgid "Axis ascending" @@ -1863,7 +1807,7 @@ msgstr "轴线降序" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:770 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:786 msgid "Back" -msgstr "" +msgstr "返回" #: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:227 #: superset/views/database/mixins.py:204 @@ -1876,7 +1820,7 @@ msgstr "错误的空间字段" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:85 msgid "Bar" -msgstr "" +msgstr "条形图" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:38 msgid "Bar Chart" @@ -1896,7 +1840,7 @@ msgstr "基于指标" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:50 msgid "Based on granularity, number of time periods to compare against" -msgstr "" +msgstr "根据粒度、要比较的时间阶段" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:686 #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:263 @@ -1919,7 +1863,7 @@ msgstr "批量编辑 %d 个过滤条件:" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:36 msgid "Battery level over time" -msgstr "" +msgstr "电池电量随时间变化" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1175 msgid "Be careful." @@ -1944,9 +1888,8 @@ msgid "Big Number with Trendline" msgstr "数字和趋势线" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:290 -#, fuzzy msgid "Bottom" -msgstr "dttm" +msgstr "底端" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:212 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:187 @@ -1960,7 +1903,7 @@ msgstr "底部边距,以像素为单位,为轴标签留出更多空间" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:140 msgid "Bottom to Top" -msgstr "" +msgstr "自下而上" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:241 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:257 @@ -1971,7 +1914,6 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:232 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:288 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:291 -#, fuzzy msgid "" "Bounds for the Y-axis. When left empty, the bounds are dynamically " "defined based on the min/max of the data. Note that this feature will " @@ -2053,7 +1995,7 @@ msgstr "子弹图" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:55 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:44 msgid "Business" -msgstr "" +msgstr "商业" #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:233 #: superset-frontend/src/filters/components/Select/controlPanel.ts:139 @@ -2066,16 +2008,16 @@ msgstr "默认情况下,每个过滤器在初始页面加载时最多加载100 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:272 msgid "By key: use column names as sorting key" -msgstr "" +msgstr "使用列名作为排序关键字" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:244 msgid "By key: use row names as sorting key" -msgstr "" +msgstr "使用行名作为排序关键字" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:245 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:273 msgid "By value: use metric values as sorting key" -msgstr "" +msgstr "使用度量值作为排序关键字" #: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:334 msgid "CANCEL" @@ -2148,7 +2090,7 @@ msgstr "CSV上传" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:118 msgid "CTAS & CVAS SCHEMA" -msgstr "" +msgstr "CTAS和CVAS方案" #: superset/sql_lab.py:405 msgid "" @@ -2174,11 +2116,11 @@ msgstr "" #: superset/errors.py:123 msgid "CVAS (create view as select) query has more than one statement." -msgstr "" +msgstr "CVAS (create view as select)查询有多条语句。" #: superset/errors.py:124 msgid "CVAS (create view as select) query is not a SELECT statement." -msgstr "" +msgstr "CVAS (create view as select)查询不是SELECT语句。" #: superset/connectors/druid/views.py:239 #: superset/connectors/druid/views.py:351 superset/connectors/sqla/views.py:497 @@ -2210,9 +2152,8 @@ msgstr "缓存的值未找到" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:70 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:76 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:77 -#, fuzzy msgid "Calculate contribution per series or total" -msgstr "计算对总数的贡献值" +msgstr "计算每个系列或总计的贡献" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:667 #, python-format @@ -2274,16 +2215,15 @@ msgstr "取消" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:304 msgid "Cancel query on window unload event" -msgstr "" +msgstr "取消窗口上传事件的查询" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts:83 msgid "Cannot create cyclic hierarchy" -msgstr "" +msgstr "无法创建循环层级" #: superset/databases/commands/exceptions.py:109 -#, fuzzy msgid "Cannot delete a database that has datasets attached" -msgstr "无法删除已含有表的数据库" +msgstr "无法删除附加了数据集的数据库" #: superset/views/core.py:700 #, python-format @@ -2296,14 +2236,13 @@ msgstr "" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx:242 #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:944 -#, fuzzy msgid "Cannot load filter" -msgstr "父级过滤" +msgstr "无法加载筛选器" #: superset/charts/commands/exceptions.py:51 #, python-format msgid "Cannot parse time string [%(human_readable)s]" -msgstr "" +msgstr "无法解析时间字符串[%(human_readable)s]" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:28 #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:38 @@ -2313,9 +2252,8 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:41 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:59 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:42 -#, fuzzy msgid "Categorical" -msgstr "分类颜色" +msgstr "分类" #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:129 msgid "Categories to group by on the x-axis." @@ -2323,11 +2261,11 @@ msgstr "要在x轴上分组的类别。" #: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:602 msgid "Category" -msgstr "" +msgstr "分类" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:87 msgid "Category of target nodes" -msgstr "" +msgstr "目标节点类别" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:103 msgid "Cell Padding" @@ -2342,24 +2280,21 @@ msgid "Cell Size" msgstr "单元尺寸" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:413 -#, fuzzy msgid "Cell bars" -msgstr "所有图表" +msgstr "单元格柱状图" #: superset-frontend/src/components/FilterableTable/FilterableTable.tsx:319 msgid "Cell content" msgstr "单元格内容" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:112 -#, fuzzy msgid "Center" -msgstr "最近" +msgstr "中心对齐" #: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:533 #: superset-frontend/src/explore/components/PropertiesModal/index.tsx:252 -#, fuzzy msgid "Certification" -msgstr "认证细节" +msgstr "认证" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:270 #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:275 @@ -2373,12 +2308,10 @@ msgstr "认证细节" #: superset-frontend/src/views/CRUD/chart/ChartList.tsx:530 #: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:504 -#, fuzzy msgid "Certified" msgstr "认证" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:259 -#, fuzzy msgid "Certified By" msgstr "认证" @@ -2405,11 +2338,11 @@ msgstr "修改数据集" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:269 msgid "Change order of columns." -msgstr "" +msgstr "更改列的顺序。" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:241 msgid "Change order of rows." -msgstr "" +msgstr "更改行的顺序。" #: superset/connectors/druid/views.py:354 superset/connectors/sqla/views.py:489 msgid "Changed By" @@ -2459,9 +2392,8 @@ msgstr "没有权限更新此数据集" #: superset/datasets/columns/commands/exceptions.py:31 #: superset/datasets/metrics/commands/exceptions.py:31 -#, fuzzy msgid "Changing this dataset is forbidden." -msgstr "没有权限更新此数据集" +msgstr "禁止更改此数据集。" #: superset/reports/commands/exceptions.py:238 msgid "Changing this report is forbidden" @@ -2559,9 +2491,8 @@ msgid "Chart Owner: %s" msgstr "图表所有者:%s" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:27 -#, fuzzy msgid "Chart Title" -msgstr "图表类型" +msgstr "图表标题" #: superset/views/core.py:979 msgid "Chart [{}] has been overwritten" @@ -2594,6 +2525,11 @@ msgid "" "that lives in the dashboard view itself. It's easier to use and has more " "capabilities!" msgstr "" +"图表组件,允许您在仪表板中添加自定义过滤器UI。" +"当添加到仪表板时,过滤器框允许用户指定特定的值或范围来过滤图表。每个筛选框所应用的图表也可以在仪表板视图中进行微调。" +"请注意,这个插件正在被仪表板视图中的新过滤器功能所取代。它更易于使用,功能更强大!" + + #: superset/charts/commands/exceptions.py:115 msgid "Chart could not be created." @@ -2613,7 +2549,7 @@ msgstr "图表没有找到" #: superset/charts/data/api.py:125 msgid "Chart has no query context saved. Please save the chart again." -msgstr "" +msgstr "图表未保存任何查询上下文。请重新保存图表。" #: superset-frontend/src/explore/components/SaveModal.tsx:247 msgid "Chart name" @@ -2621,7 +2557,6 @@ msgstr "图表名称" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:96 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:107 -#, fuzzy msgid "Chart options" msgstr "图表选项" @@ -2650,9 +2585,8 @@ msgstr "这个查询无法被加载" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx:162 #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:488 #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:505 -#, fuzzy msgid "Check configuration" -msgstr "配置Layer" +msgstr "检查配置" #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:206 #: superset-frontend/src/filters/components/Select/controlPanel.ts:68 @@ -2663,16 +2597,15 @@ msgstr "按照升序进行排序" msgid "" "Check if the Rose Chart should use segment area instead of segment radius" " for proportioning" -msgstr "" +msgstr "检查玫瑰图是否应该使用线段面积而不是线段半径来进行比例" #: superset-frontend/src/components/AnchorLink/index.jsx:85 msgid "Check out this chart in dashboard:" -msgstr "查看这个看板:%s" +msgstr "在仪表盘中查看此图表" #: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:319 -#, fuzzy msgid "Check out this chart: " -msgstr "查看此看板:" +msgstr "看看这张图表:" #: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:220 msgid "Check out this dashboard: " @@ -2686,25 +2619,23 @@ msgstr "选中可在过滤条件更改时立即应用过滤,而不是使用 [ #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:219 msgid "Check to force date partitions to have the same height" -msgstr "" +msgstr "选中以强制日期分区具有相同的高度" #: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:35 msgid "Check to include Druid granularity dropdown" msgstr "检查包含Druid时间粒度下拉列表" #: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:109 -#, fuzzy msgid "Check to include SQL time grain dropdown" -msgstr "检查包含时间原点的下拉列表" +msgstr "选中以包括SQL时间粒度下拉菜单" #: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:123 msgid "Check to include time column dropdown" msgstr "检查包含时间列下拉列表" #: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:110 -#, fuzzy msgid "Check to include time grain dropdown" -msgstr "检查包含时间原点的下拉列表" +msgstr "选中以包括时间粒度下拉菜单" #: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:46 msgid "Check to include time origin dropdown" @@ -2712,7 +2643,7 @@ msgstr "检查包含时间原点的下拉列表" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:173 msgid "Child label position" -msgstr "" +msgstr "子标签位置" #: superset/viz.py:2333 msgid "Choice of [Label] must be present in [Group By]" @@ -2732,9 +2663,8 @@ msgid "Choose a chart or dashboard not both" msgstr "选择图表或看板,不能都全部选择" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:674 -#, fuzzy msgid "Choose a database..." -msgstr "选择数据源" +msgstr "选择数据库" #: superset-frontend/src/addSlice/AddSliceContainer.tsx:278 #: superset-frontend/src/addSlice/AddSliceContainer.tsx:288 @@ -2752,14 +2682,12 @@ msgid "Choose a metric for right axis" msgstr "为右轴选择一个指标" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:57 -#, fuzzy msgid "Choose a number format" -msgstr "数字格式化" +msgstr "选择一种数字格式" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:63 -#, fuzzy msgid "Choose a source" -msgstr "选择一个源和一个目标" +msgstr "选择一个源" #: superset-frontend/plugins/legacy-plugin-chart-force-directed/src/controlPanel.ts:105 #: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/controlPanel.ts:44 @@ -2768,14 +2696,12 @@ msgid "Choose a source and a target" msgstr "选择一个源和一个目标" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:69 -#, fuzzy msgid "Choose a target" -msgstr "选择数据源" +msgstr "选择一个目标" #: superset-frontend/src/addSlice/AddSliceContainer.tsx:308 -#, fuzzy msgid "Choose chart type" -msgstr "图表类型" +msgstr "选择图表类型" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:100 msgid "Choose one or more charts for left axis" @@ -2799,24 +2725,23 @@ msgstr "弦图" #: superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx:281 msgid "Chosen non-numeric column" -msgstr "" +msgstr "选定的非数字列" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:218 -#, fuzzy msgid "Circle" -msgstr "文件" +msgstr "圆" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:130 msgid "Circle -> Arrow" -msgstr "" +msgstr "圆 -> 箭头" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:131 msgid "Circle -> Circle" -msgstr "" +msgstr "圆 -> 圆" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:198 msgid "Circle radar shape" -msgstr "" +msgstr "圆形雷达图" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:37 #: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:33 @@ -2824,17 +2749,17 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:40 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:67 msgid "Circular" -msgstr "" +msgstr "圆" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:32 msgid "Classic chart that visualizes how metrics change over time." -msgstr "" +msgstr "直观显示指标随时间变化的经典图表。" #: superset-frontend/plugins/plugin-chart-table/src/index.ts:37 msgid "" "Classic row-by-column spreadsheet like view of a dataset. Use tables to " "showcase a view into the underlying data or to show aggregated metrics." -msgstr "" +msgstr "数据集的典型的逐行逐列电子表格视图。使用表格显示底层数据的视图或显示聚合指标。" #: superset/connectors/sqla/views.py:369 msgid "Clause" @@ -2845,9 +2770,8 @@ msgid "Clear" msgstr "清除" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx:133 -#, fuzzy msgid "Clear all" -msgstr "查看所有" +msgstr "清楚所有" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:997 msgid "Click the lock to make changes." @@ -2861,31 +2785,29 @@ msgstr "单击锁定以防止进一步更改。" msgid "" "Click this link to switch to an alternate form that allows you to input " "the SQLAlchemy URL for this database manually." -msgstr "" +msgstr "单击此链接可切换到备用表单,该表单允许您手动输入此数据库的SQLAlChemy URL。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1071 msgid "" "Click this link to switch to an alternate form that exposes only the " "required fields needed to connect this database." -msgstr "" +msgstr "单击此链接可切换到仅显示连接此数据库所需的必填字段的备用表单。" #: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:114 msgid "Click to change visualization type" msgstr "选择一个可视化类型" #: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:151 -#, fuzzy msgid "Click to clear emitted filters" -msgstr "自适配过滤条件" +msgstr "点击清除过滤" #: superset-frontend/src/components/EditableTitle/index.tsx:197 msgid "Click to edit" msgstr "点击编辑" #: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelectPopoverTitle.jsx:76 -#, fuzzy msgid "Click to edit label" -msgstr "点击编辑" +msgstr "单击以编辑标签" #: superset-frontend/src/components/FaveStar/index.tsx:81 msgid "Click to favorite/unfavorite" @@ -2943,9 +2865,8 @@ msgid "Collapse all" msgstr "全部折叠" #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:152 -#, fuzzy msgid "Collapse table preview" -msgstr "删除表格预览" +msgstr "折叠表的预览" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:648 msgid "Color" @@ -2958,7 +2879,6 @@ msgstr "色彩 +/-" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:159 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:206 -#, fuzzy msgid "Color Metric" msgstr "颜色指标" @@ -3010,7 +2930,7 @@ msgstr "列" msgid "" "Column \"%(column)s\" is not numeric or does not exists in the query " "results." -msgstr "" +msgstr "列\"%(column)s\"不是数字或不在查询结果中" #: superset/views/database/forms.py:224 superset/views/database/forms.py:357 #: superset/views/database/forms.py:445 @@ -3021,7 +2941,7 @@ msgstr "字段标签" msgid "" "Column containing ISO 3166-2 codes of region/province/department in your " "table." -msgstr "" +msgstr "表中包含地区/省/省的ISO 3166-2代码的列" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:64 msgid "Column containing latitude data" @@ -3032,9 +2952,8 @@ msgid "Column containing longitude data" msgstr "包含经度数据的列" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:115 -#, fuzzy msgid "Column is required" -msgstr "需要名称" +msgstr "列是必填项" #: superset/views/database/forms.py:225 superset/views/database/forms.py:358 #: superset/views/database/forms.py:446 @@ -3058,9 +2977,8 @@ msgid "Column referenced by aggregate is undefined: %(column)s" msgstr "聚合引用的列未定义:%(column)s" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:130 -#, fuzzy msgid "Column select" -msgstr "运行选定的查询" +msgstr "选择列" #: superset/views/database/forms.py:163 superset/views/database/forms.py:316 msgid "" @@ -3069,12 +2987,10 @@ msgid "" msgstr "字段作为数据文件的行标签使用。如果没有索引字段,则留空。" #: superset/views/database/forms.py:385 -#, fuzzy msgid "Columnar File" msgstr "列式存储文件" #: superset/views/database/views.py:550 -#, fuzzy, python-format msgid "" "Columnar file \"%(columnar_filename)s\" uploaded to table " "\"%(table_name)s\" in database \"%(db_name)s\"" @@ -3083,7 +2999,6 @@ msgstr "" "\"%(table_name)s\"" #: superset/views/database/views.py:414 -#, fuzzy msgid "Columnar to Database configuration" msgstr "列式存储文件到数据库配置" @@ -3108,7 +3023,7 @@ msgstr "数据源中缺少列:%(invalid_columns)s" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:302 msgid "Columns subtotal position" -msgstr "" +msgstr "列的小计位置" #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:134 msgid "" @@ -3125,26 +3040,22 @@ msgid "Columns to display" msgstr "要显示的字段" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:43 -#, fuzzy msgid "Columns to group by" msgstr "需要进行分组的一列或多列" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:60 -#, fuzzy msgid "Columns to group by on the columns" -msgstr "要在x轴上分组的类别。" +msgstr "必须是分组列" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:50 -#, fuzzy msgid "Columns to group by on the rows" -msgstr "要在x轴上分组的类别。" +msgstr "行上分组所依据的列" #: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:96 msgid "Combine Metrics" msgstr "整合指标" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:185 -#, fuzzy msgid "Combine metrics" msgstr "整合指标" @@ -3153,48 +3064,47 @@ msgid "" "Comma-separated color picks for the intervals, e.g. 1,2,4. Integers " "denote colors from the chosen color scheme and are 1-indexed. Length must" " be matching that of interval bounds." -msgstr "" +msgstr "间隔的逗号分隔色选项,例如1、2、4。整数表示所选配色方案中的颜色,并以1为索引。长度必须与间隔界限匹配。" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:287 msgid "" "Comma-separated interval bounds, e.g. 2,4,5 for intervals 0-2, 2-4 and " "4-5. Last number should match the value provided for MAX." -msgstr "" +msgstr "逗号分隔的区间界限,例如0-2、2-4和4-5区间的2、4、5。最后一个数字应与为Max提供的值匹配。" #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:312 -#, fuzzy msgid "Comparator option" -msgstr "图表选项" +msgstr "比较器选项" #: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:26 msgid "" "Compare multiple time series charts (as sparklines) and related metrics " "quickly." -msgstr "" +msgstr "快速比较多个时间序列图表和相关指标。" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:26 msgid "Compare the same summarized metric across multiple groups." -msgstr "" +msgstr "跨多个组比较相同的汇总指标" #: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:28 msgid "" "Compares how a metric changes over time between different groups. Each " "group is mapped to a row and change over time is visualized bar lengths " "and color." -msgstr "" +msgstr "比较指标在不同组之间随时间的变化情况。每一组被映射到一行,并且随着时间的变化被可视化地显示条的长度和颜色。" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:30 msgid "" "Compares metrics from different categories using bars. Bar lengths are " "used to indicate the magnitude of each value and color is used to " "differentiate groups." -msgstr "" +msgstr "使用条形图比较不同类别的指标。条形长度用于指示每个值的大小,颜色用于区分组。" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:26 msgid "" "Compares the lengths of time different activities take in a shared " "timeline view." -msgstr "" +msgstr "比较不同活动在共享时间线视图中所花费的时间长度。" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:33 #: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:33 @@ -3213,18 +3123,16 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:60 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:43 #: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:31 -#, fuzzy msgid "Comparison" -msgstr "时间比较" +msgstr "比较" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:48 msgid "Comparison Period Lag" -msgstr "" +msgstr "滞后比较" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:61 -#, fuzzy msgid "Comparison suffix" -msgstr "时间比较" +msgstr "比较前缀" #: superset-frontend/src/dashboard/components/BuilderComponentPane.tsx:102 msgid "Components" @@ -3241,20 +3149,17 @@ msgid "Compute the contribution to the total" msgstr "计算对总数的贡献值" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1173 -#, fuzzy msgid "Condition" -msgstr "警报状态" +msgstr "条件" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:320 #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:473 -#, fuzzy msgid "Conditional formatting" -msgstr "附加信息" +msgstr "条件格式设置" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:70 -#, fuzzy msgid "Confidence interval" -msgstr "刷新间隔" +msgstr "信区间间隔" #: superset/utils/pandas_postprocessing.py:827 msgid "Confidence interval must be between 0 and 1 (exclusive)" @@ -3300,31 +3205,29 @@ msgstr "确认保存" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:777 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1006 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1193 -#, fuzzy msgid "Connect" -msgstr "测试连接" +msgstr "连接" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:41 msgid "Connect Google Sheets as tables to this database" -msgstr "" +msgstr "将Google Sheet作为表格连接到此数据库" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1011 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1197 -#, fuzzy msgid "Connect a database" -msgstr "选择一个数据库" +msgstr "连接数据库" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1068 msgid "Connect this database using the dynamic form instead" -msgstr "" +msgstr "使用动态参数连接此数据库" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1301 msgid "Connect this database with a SQLAlchemy URI string instead" -msgstr "" +msgstr "使用SQLAlchemy URI链接此数据库" #: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:224 msgid "Connection" -msgstr "测试连接" +msgstr "连接" #: superset/databases/commands/exceptions.py:105 #: superset/databases/commands/exceptions.py:122 superset/views/core.py:1383 @@ -3337,7 +3240,7 @@ msgstr "连接测试成功!" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:46 msgid "Continuous" -msgstr "" +msgstr "连续式" #: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:51 #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:54 @@ -3354,35 +3257,31 @@ msgstr "贡献" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:63 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:69 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:70 -#, fuzzy msgid "Contribution Mode" -msgstr "贡献" +msgstr "贡献模式" #: superset-frontend/src/explore/components/ExploreViewContainer.jsx:430 msgid "Control labeled " -msgstr "控件名称为 " +msgstr "控件已标记 " #: superset-frontend/src/explore/components/ExploreViewContainer.jsx:430 -#, fuzzy msgid "Controls labeled " -msgstr "控件名称为 " +msgstr "控件已标记" #: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:57 -#, fuzzy msgid "Coordinates" -msgstr "平行坐标" +msgstr "坐标" #: superset-frontend/src/components/CopyToClipboard/index.jsx:75 #: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:53 #: superset-frontend/src/explore/components/ExploreActionButtons.tsx:113 -#, fuzzy msgid "Copied to clipboard!" -msgstr "复制到剪贴板" +msgstr "复制到剪贴板!" #: superset-frontend/src/explore/components/DataTableControl/index.tsx:48 msgid "Copy" -msgstr "" +msgstr "复制" #: superset-frontend/src/SqlLab/components/TableElement/index.tsx:192 msgid "Copy SELECT statement to the clipboard" @@ -3390,26 +3289,23 @@ msgstr "将 SELECT 语句复制到剪贴板" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:106 msgid "Copy and Paste JSON credentials" -msgstr "" +msgstr "复制和粘贴JSON凭据" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:124 msgid "Copy and paste the entire service account .json file here" -msgstr "" +msgstr "复制服务帐户的json文件复制并粘贴到此处" #: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:316 -#, fuzzy msgid "Copy chart URL" -msgstr "没有图表" +msgstr "复制图表URL" #: superset-frontend/src/explore/components/ExploreActionButtons.tsx:103 -#, fuzzy msgid "Copy chart URL to clipboard" -msgstr "将分区查询复制到剪贴板" +msgstr "复制图表URL到剪贴板" #: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:263 -#, fuzzy msgid "Copy dashboard URL" -msgstr "没有看板" +msgstr "复制仪表盘URL" #: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:98 msgid "Copy link" @@ -3439,14 +3335,13 @@ msgstr "将查询链接复制到剪贴板" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/ValidatedInputField.tsx:26 msgid "Copy the account name of that database you are trying to connect to." -msgstr "" +msgstr "复制尝试连接的数据库帐户名" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:91 msgid "Copy the name of the database you are trying to connect to." -msgstr "" +msgstr "复制尝试连接的数据库名" #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:552 -#, fuzzy msgid "Copy to Clipboard" msgstr "复制到剪贴板" @@ -3460,9 +3355,8 @@ msgstr "复制到剪贴板" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:28 #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:25 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:25 -#, fuzzy msgid "Correlation" -msgstr "方向" +msgstr "相关性" #: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:95 msgid "Cost estimate" @@ -3496,12 +3390,11 @@ msgstr "无法加载数据库驱动程序:{}" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:97 msgid "Could not verify the host" -msgstr "" +msgstr "无法验证主机名(IP)" #: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:40 -#, fuzzy msgid "Country" -msgstr "国家地图" +msgstr "国家" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:130 msgid "Country Color Scheme" @@ -3521,9 +3414,8 @@ msgid "Country Map" msgstr "国家地图" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:96 -#, fuzzy msgid "Create" -msgstr "创建一个 " +msgstr "创建" #: superset-frontend/src/addSlice/AddSliceContainer.tsx:275 msgid "Create a new chart" @@ -3534,13 +3426,12 @@ msgid "Create new chart" msgstr "创建新图表" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:111 -#, fuzzy msgid "Create new filter set" -msgstr "创建新图表" +msgstr "创建新的过滤器" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:124 msgid "Create or select schema..." -msgstr "" +msgstr "创建或者选择模式" #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:169 msgid "Created" @@ -3586,21 +3477,19 @@ msgstr "作者" #: superset/views/schedules.py:241 superset/views/schedules.py:321 msgid "Crontab" -msgstr "" +msgstr "定时任务" #: superset-frontend/src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal.tsx:65 -#, fuzzy msgid "Cross Filter Scoping" -msgstr "设置过滤映射" +msgstr "交叉筛选作用域" #: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:349 msgid "Cross-filter scoping" -msgstr "" +msgstr "交叉筛选作用域" #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:153 -#, fuzzy msgid "Cumulative" -msgstr "激活" +msgstr "累计" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:33 msgid "Custom" @@ -3624,34 +3513,31 @@ msgstr "自定义SQL" #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:222 msgid "Custom SQL ad-hoc filters are not available for the native Druid connector" -msgstr "" +msgstr "自定义SQL即席筛选器不适用于本机Druid连接器" #: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:432 msgid "Custom SQL ad-hoc metrics are not available for the native Druid connector" -msgstr "" +msgstr "自定义SQL即席查询不适用于本机Druid连接器" #: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:435 msgid "Custom SQL ad-hoc metrics are not enabled for this dataset" -msgstr "" +msgstr "此数据集无法启用自定义SQL即席查询、" #: superset-frontend/src/filters/components/Time/index.ts:28 -#, fuzzy msgid "Custom time filter plugin" -msgstr "范围过滤器" +msgstr "自定义时间过滤器插件" #: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:417 msgid "Customize" msgstr "定制化配置" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:167 -#, fuzzy msgid "Customize Metrics" -msgstr "整合指标" +msgstr "自定义指标" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:453 -#, fuzzy msgid "Customize columns" -msgstr "计算列" +msgstr "自定义列" #: superset/connectors/sqla/views.py:261 msgid "D3 Format" @@ -3672,13 +3558,12 @@ msgstr "D3插件格式语法: https://github.com/d3/d3-time-format" msgid "" "D3 number format for numbers between -1.0 and 1.0, useful when you want " "to have different siginificant digits for small and large numbers" -msgstr "" +msgstr "D3数字格式,用于-1.0和1.0之间的数字,当您希望小数和大数有不同的符号数字时很有用" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:220 #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:377 -#, fuzzy msgid "D3 time format for datetime columns" -msgstr "选择图示值的格式化方式" +msgstr "D3时间格式的时间列" #: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:44 msgid "D3 time format syntax: https://github.com/d3/d3-time-format" @@ -3693,9 +3578,8 @@ msgid "DELETE" msgstr "删除" #: superset-frontend/src/components/ReportModal/index.tsx:345 -#, fuzzy msgid "DESCRIPTION ERROR" -msgstr "描述" +msgstr "描述错误" #: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:259 msgid "DML" @@ -3703,7 +3587,7 @@ msgstr "DML(数据操作语言)" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:31 msgid "Dark mode" -msgstr "" +msgstr "黑暗模式" #: superset-frontend/src/components/Menu/MenuRight.tsx:46 #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1296 @@ -3749,9 +3633,8 @@ msgid "Dashboard properties" msgstr "看板属性" #: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:153 -#, fuzzy msgid "Dashboard scheme" -msgstr "看板" +msgstr "仪表盘模式" #: superset-frontend/src/profile/components/CreatedContent.tsx:73 #: superset-frontend/src/profile/components/Favorites.tsx:74 @@ -3760,15 +3643,15 @@ msgstr "看板" #: superset/initialization/__init__.py:238 superset/views/chart/mixin.py:79 #: superset/views/dashboard/mixin.py:25 msgid "Dashboards" -msgstr "看板" +msgstr "仪表盘" #: superset/dashboards/commands/exceptions.py:58 msgid "Dashboards could not be deleted." -msgstr "看板无法被删除。" +msgstr "仪表盘无法被删除。" #: superset/charts/commands/exceptions.py:91 msgid "Dashboards do not exist" -msgstr "看板" +msgstr "仪表盘" #: superset-frontend/src/explore/components/ControlPanelsContainer.tsx:401 #: superset-frontend/src/explore/components/DataTablesPane/index.tsx:388 @@ -3790,9 +3673,8 @@ msgid "Data Source" msgstr "数据源" #: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:57 -#, fuzzy msgid "Data Table" -msgstr "编辑表" +msgstr "数据表" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:290 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:181 @@ -3802,21 +3684,20 @@ msgstr "编辑表" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:197 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:200 msgid "Data Zoom" -msgstr "" +msgstr "数据缩放" #: superset/views/core.py:2313 msgid "" "Data could not be deserialized from the results backend. The storage " "format might have changed, rendering the old data stake. You need to re-" "run the original query." -msgstr "" +msgstr "无法从结果后端反序列化数据。存储格式可能已经改变,呈现了旧的数据桩。您需要重新运行原始查询。" #: superset/views/core.py:2266 -#, fuzzy msgid "" "Data could not be retrieved from the results backend. You need to re-run " "the original query." -msgstr "无法反序列化数据。您可能需要重新运行查询。" +msgstr "无法从结果后端检索数据。您需要重新运行原始查询。" #: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:219 msgid "Data preview" @@ -3860,7 +3741,7 @@ msgid "Database" msgstr "数据库" #: superset/views/database/views.py:452 -#, fuzzy, python-format +#, python-format msgid "" "Database \"%(database_name)s\" schema \"%(schema_name)s\" is not allowed " "for columnar uploads. Please contact your Superset Admin." @@ -3881,9 +3762,8 @@ msgid "" msgstr "数据库 \"%(database_name)s\" schema \"%(schema_name)s\" 不允许用于excel上传。请联系管理员。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:910 -#, fuzzy msgid "Database Creation Error" -msgstr "数据库错误" +msgstr "数据库创建错误" #: superset/views/access_requests.py:43 msgid "Database URL" @@ -3903,7 +3783,7 @@ msgstr "数据库无法更新" #: superset/errors.py:117 msgid "Database does not allow data manipulation." -msgstr "" +msgstr "数据库不允许此数据操作。" #: superset/charts/commands/exceptions.py:82 #: superset/datasets/commands/exceptions.py:41 @@ -3912,18 +3792,16 @@ msgid "Database does not exist" msgstr "数据库不存在" #: superset/connectors/sqla/models.py:1478 -#, fuzzy msgid "Database does not support subqueries" -msgstr "数据库不存在" +msgstr "数据库不支持子查询" #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:688 msgid "Database error" msgstr "数据库错误" #: superset/databases/commands/validate.py:136 -#, fuzzy msgid "Database is offline." -msgstr "数据库名称" +msgstr "数据库已下线" #: superset/reports/commands/exceptions.py:62 msgid "Database is required for alerts" @@ -3947,9 +3825,8 @@ msgid "Database parameters are invalid." msgstr "数据库参数无效" #: superset/db_engine_specs/base.py:1393 -#, fuzzy msgid "Database port" -msgstr "数据库" +msgstr "数据库端口" #: superset-frontend/src/profile/components/Security.tsx:46 #: superset-frontend/src/views/CRUD/data/common.ts:26 @@ -3980,14 +3857,12 @@ msgid "Dataset %(name)s already exists" msgstr "数据集 %(name)s 已存在" #: superset/datasets/columns/commands/exceptions.py:27 -#, fuzzy msgid "Dataset column delete failed." -msgstr "注释与注释层" +msgstr "数据集列删除失败。" #: superset/datasets/columns/commands/exceptions.py:23 -#, fuzzy msgid "Dataset column not found." -msgstr "数据库没有找到" +msgstr "数据集行删除失败。" #: superset/datasets/commands/exceptions.py:157 msgid "Dataset could not be created." @@ -4008,19 +3883,16 @@ msgid "Dataset does not exist" msgstr "数据集不存在" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:843 -#, fuzzy msgid "Dataset is required" -msgstr "需要数据源" +msgstr "需要数据集" #: superset/datasets/metrics/commands/exceptions.py:27 -#, fuzzy msgid "Dataset metric delete failed." -msgstr "注释与注释层" +msgstr "数据集指标删除失败" #: superset/datasets/metrics/commands/exceptions.py:23 -#, fuzzy msgid "Dataset metric not found." -msgstr "数据库没有找到" +msgstr "数据集指标没找到" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:881 #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:888 @@ -4042,9 +3914,8 @@ msgid "Datasets" msgstr "数据集" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:809 -#, fuzzy msgid "Datasets do not contain a temporal column" -msgstr "数据帧(DataFrame)必须包含时间列" +msgstr "数据集不包含时间列" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:157 #: superset/connectors/druid/views.py:93 superset/views/access_requests.py:44 @@ -4061,9 +3932,9 @@ msgid "Datasource Name" msgstr "数据库名称" #: superset/connectors/connector_registry.py:99 -#, fuzzy, python-format +#, python-format msgid "Datasource id not found: %(id)s" -msgstr "数据库没有找到" +msgstr "数据源id不存在:%(id)s" #: superset/charts/commands/exceptions.py:101 msgid "Datasource type is required when datasource_id is given" @@ -4071,7 +3942,6 @@ msgstr "给定数据源id时,需要提供数据源类型" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:163 #: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:87 -#, fuzzy msgid "Date Time Format" msgstr "时间格式" @@ -4108,18 +3978,17 @@ msgid "Datetime format" msgstr "时间格式" #: superset/db_engine_specs/base.py:96 -#, fuzzy msgid "Day" msgstr "天" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:66 -#, fuzzy, python-format +#, python-format msgid "Days %s" -msgstr "天" +msgstr "%s天" #: superset/connectors/sqla/models.py:1593 msgid "Db engine did not return all queried columns" -msgstr "" +msgstr "数据库引擎未返回所有查询的列" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:77 msgid "December" @@ -4143,7 +4012,7 @@ msgstr "Deck.gl - 弧度" #: superset/viz.py:2843 msgid "Deck.gl - GeoJSON" -msgstr "Deck.gl - GeoJson" +msgstr "Deck.gl - 地理json" #: superset/viz.py:2431 msgid "Deck.gl - Multiple Layers" @@ -4182,9 +4051,8 @@ msgid "Default URL to redirect to when accessing from the dataset list page" msgstr "从数据集列表页访问时重定向到的默认URL" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:907 -#, fuzzy msgid "Default Value" -msgstr "默认纬度" +msgstr "缺省值" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:290 msgid "Default latitude" @@ -4198,29 +4066,28 @@ msgstr "默认经度" msgid "" "Default minimal column width in pixels, actual width may still be larger " "than this if other columns don't need much space" -msgstr "" +msgstr "默认最小列宽(以像素为单位),如果其他列不需要太多空间,则实际宽度可能仍大于此值" #: superset-frontend/src/filters/components/Select/controlPanel.ts:105 msgid "Default to first item" -msgstr "" +msgstr "默认为第一项" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:936 #: superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx:222 -#, fuzzy msgid "Default value is required" -msgstr "需要数据源" +msgstr "需要默认值" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:95 msgid "Default value must be set when \"Filter has default value\" is checked" -msgstr "" +msgstr "选中筛选器具有默认值时,必须设置默认值" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:93 msgid "Default value must be set when \"Required\" is checked" -msgstr "" +msgstr "当\"必填项\"被选中时默认值必须被设置" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts:89 msgid "Default value set automatically when \"Default to first item\" is checked" -msgstr "" +msgstr "当\"默认为第一项\"被选中时默认值需要设置为自动" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:44 #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:266 @@ -4267,7 +4134,7 @@ msgstr "定义滚动窗口函数的大小,相对于所选的时间粒度" msgid "" "Defines whether the step should appear at the beginning, middle or end " "between two data points" -msgstr "" +msgstr "定义步骤应出现在两个数据点之间的开始、中间还是结束处" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:82 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:325 @@ -4316,9 +4183,8 @@ msgid "Delete Query?" msgstr "确定删除查询?" #: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:110 -#, fuzzy msgid "Delete Report?" -msgstr "删除模板?" +msgstr "删除报表?" #: superset-frontend/src/views/CRUD/csstemplates/CssTemplatesList.tsx:321 msgid "Delete Template?" @@ -4334,16 +4200,15 @@ msgstr "删除注释" #: superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx:202 msgid "Delete dashboard tab?" -msgstr "是否删除tab页?" +msgstr "是否删除仪表盘tab页?" #: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:332 msgid "Delete database" msgstr "删除数据库" #: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:78 -#, fuzzy msgid "Delete email report" -msgstr "警报和报告" +msgstr "删除邮件报告" #: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:404 msgid "Delete query" @@ -4442,27 +4307,24 @@ msgid "Delivery Type" msgstr "交付类型" #: superset-frontend/src/views/CRUD/alert/components/NotificationMethod.tsx:124 -#, fuzzy msgid "Delivery method" -msgstr "添加通知方法" +msgstr "发送方式" #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:33 msgid "Demographics" -msgstr "" +msgstr "人口统计" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:43 #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:38 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:45 -#, fuzzy msgid "Density" -msgstr "实体" +msgstr "密度" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:55 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:45 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:38 -#, fuzzy msgid "Deprecated" -msgstr "已创建" +msgstr "过时" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:42 #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:47 @@ -4496,9 +4358,8 @@ msgid "Description (this can be seen in the list)" msgstr "说明(见列表)" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:520 -#, fuzzy msgid "Description Columns" -msgstr "描述" +msgstr "列描述" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:48 msgid "Description text that shows up below your Big Number" @@ -4526,16 +4387,15 @@ msgstr "确定此看板在所有看板列表中是否可见" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:230 msgid "Diamond" -msgstr "" +msgstr "下钻" #: superset-frontend/src/components/ErrorMessage/ParameterErrorMessage.tsx:77 msgid "Did you mean:" msgstr "您的意思是:" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:101 -#, fuzzy msgid "Difference" -msgstr "点击查看差异" +msgstr "差异" #: superset/viz.py:1968 msgid "Directed Force Layout" @@ -4544,35 +4404,31 @@ msgstr "有向图" #: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:31 #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:39 #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:42 -#, fuzzy msgid "Directional" -msgstr "描述" +msgstr "方向" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:165 #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:185 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:274 -#, fuzzy msgid "Disabled" -msgstr "编辑表" +msgstr "禁用" #: superset-frontend/src/dashboard/components/Header/index.jsx:579 msgid "Discard changes" msgstr "放弃更改" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:43 -#, fuzzy msgid "Discrete" -msgstr "已创建" +msgstr "离散" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:149 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:42 -#, fuzzy msgid "Display Name" -msgstr "过滤值" +msgstr "显示名称" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:164 msgid "Display column level total" -msgstr "" +msgstr "显示列级别合计" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:615 msgid "Display configuration" @@ -4587,7 +4443,7 @@ msgstr "在每个列中并排显示指标,而不是每个指标并排显示每 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:152 msgid "Display row level total" -msgstr "" +msgstr "显示行级合计" #: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:89 msgid "Display total row/column" @@ -4599,7 +4455,7 @@ msgid "" "mapping relationships and showing which nodes are important in a network." " Graph charts can be configured to be force-directed or circulate. If " "your data has a geospatial component, try the deck.gl Arc chart." -msgstr "" +msgstr "显示图形结构中实体之间的连接。用于映射关系和显示网络中哪些节点是重要的。图表可以配置为强制引导或循环。如果您的数据具有地理空间组件,请尝试使用deck.gl圆弧图表。" #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:132 msgid "Distribute across" @@ -4609,9 +4465,8 @@ msgstr "基于某列进行分布" #: superset-frontend/plugins/legacy-plugin-chart-horizon/src/index.js:26 #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:48 #: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/createMetadata.ts:25 -#, fuzzy msgid "Distribution" -msgstr "贡献" +msgstr "分布" #: superset/viz.py:1769 msgid "Distribution - Bar Chart" @@ -4627,9 +4482,8 @@ msgid "Do you want a donut or a pie?" msgstr "是否用圆环圈替代饼图?" #: superset-frontend/src/components/Menu/MenuRight.tsx:214 -#, fuzzy msgid "Documentation" -msgstr "执行时间" +msgstr "文档" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:40 msgid "Domain" @@ -4637,7 +4491,7 @@ msgstr "主域" #: superset-frontend/src/dashboard/components/RefreshIntervalModal.tsx:29 msgid "Don't refresh" -msgstr "不要刷新" +msgstr "不刷新" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:83 #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:208 @@ -4652,7 +4506,7 @@ msgstr "下载为图片" #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:543 msgid "Download to CSV" -msgstr "" +msgstr "下载到CSV" #: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:72 #: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:83 @@ -4669,13 +4523,13 @@ msgstr "草稿" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:168 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:171 msgid "Draw a marker on data points. Only applicable for line types." -msgstr "" +msgstr "在数据点上绘制标记。仅适用于线型。" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:171 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:135 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:138 msgid "Draw area under curves. Only applicable for line types." -msgstr "" +msgstr "在曲线下绘制区域。仅适用于线型。" #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:178 msgid "Draw line from Pie to label when labels outside?" @@ -4689,40 +4543,40 @@ msgstr "当标签在外侧时,是否在饼图到标签之间连线?" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:262 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:265 msgid "Draw split lines for minor y-axis ticks" -msgstr "" +msgstr "绘制次要y轴记号的分割线" #: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx:217 msgid "Drop a column here or click" -msgstr "" +msgstr "将列拖放到此处或单击" #: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx:367 msgid "Drop a column/metric here or click" -msgstr "" +msgstr "将列/指标放在此处或单击" #: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx:222 msgid "Drop column here" -msgstr "" +msgstr "将列拖放到此处" #: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndMetricSelect.tsx:372 msgid "Drop column or metric here" -msgstr "" +msgstr "将列或指标放在此处" #: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndSelectLabel.tsx:80 msgid "Drop columns here" -msgstr "" +msgstr "将列拖放到此处" #: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx:389 -#, fuzzy, python-format +#, python-format msgid "Drop columns or metrics here" -msgstr "%s 列与计量指标" +msgstr "将列或指标拖放到此处" #: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx:388 msgid "Drop columns/metrics here or click" -msgstr "" +msgstr "将列/指标拖放到此处或单击" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:176 msgid "Drop temporal column here" -msgstr "" +msgstr "将时间列拖放到此处" #: superset/connectors/druid/views.py:213 #: superset/initialization/__init__.py:516 @@ -4755,14 +4609,14 @@ msgstr "双线图" #: superset/views/datasource/views.py:119 #, python-format msgid "Duplicate column name(s): %(columns)s" -msgstr "" +msgstr "重复的列名%(columns)s" #: superset/common/query_object.py:284 #, python-format msgid "" "Duplicate column/metric labels: %(labels)s. Please make sure all columns " "and metrics have a unique label." -msgstr "" +msgstr "重复的列/指标标签:%(labels)s。请确保所有列和指标都有唯一的标签。" #: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:366 msgid "Duplicate tab" @@ -4814,26 +4668,24 @@ msgid "" msgstr "此表的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为数据库的超时。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:250 -#, fuzzy msgid "" "Duration (in seconds) of the metadata caching timeout for schemas of this" " database. If left unset, the cache never expires." -msgstr "此数据库图表的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为全局超时。" +msgstr "此数据库图表的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为永不过期。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:272 -#, fuzzy msgid "" "Duration (in seconds) of the metadata caching timeout for tables of this " "database. If left unset, the cache never expires. " -msgstr "此数据库图表的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,这默认为全局超时。" +msgstr "此数据库图表的缓存超时持续时间(以秒为单位)。超时为0表示缓存永远不会过期。注意,如果未定义,缓存为永不过期。" #: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:41 msgid "Duration in ms (1.40008 => 1ms 400µs 80ns)" -msgstr "" +msgstr "持续时间(毫秒)(1.40008 => 1ms 400µs 80ns)" #: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:40 msgid "Duration in ms (66000 => 1m 6s)" -msgstr "" +msgstr "持续时间(毫秒)(66000 => 1m 6s)" #: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:205 #, python-format @@ -4856,38 +4708,35 @@ msgstr "持续时间:%s" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:42 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:61 #: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:124 -#, fuzzy msgid "ECharts" -msgstr "图表" +msgstr "ECharts图表" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:76 #: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:169 #: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:176 msgid "END (EXCLUSIVE)" -msgstr "" +msgstr "结束" #: superset-frontend/src/views/CRUD/hooks.ts:628 #, python-format msgid "ERROR: %s" -msgstr "" +msgstr "错误: %s" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:241 -#, fuzzy msgid "Edge length" -msgstr "页面长度" +msgstr "边长" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:247 msgid "Edge length between nodes" -msgstr "" +msgstr "节点之间的边长" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:124 msgid "Edge symbols" -msgstr "" +msgstr "边符号" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:226 -#, fuzzy msgid "Edge width" -msgstr "线宽" +msgstr "边缘宽度" #: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:197 #: superset-frontend/src/dashboard/components/menu/MarkdownModeDropdown.tsx:35 @@ -4905,9 +4754,8 @@ msgid "Edit" msgstr "编辑" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1053 -#, fuzzy msgid "Edit Alert" -msgstr "编辑表" +msgstr "编辑警报" #: superset/views/annotations.py:61 msgid "Edit Annotation" @@ -4967,7 +4815,7 @@ msgstr "编辑 Druid 指标" #: superset-frontend/src/components/ReportModal/index.tsx:251 msgid "Edit Email Report" -msgstr "" +msgstr "编辑邮件报告" #: superset/views/log/__init__.py:24 msgid "Edit Log" @@ -4982,9 +4830,8 @@ msgid "Edit Plugin" msgstr "编辑插件" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1051 -#, fuzzy msgid "Edit Report" -msgstr "报告" +msgstr "编辑报表" #: superset/connectors/sqla/views.py:317 msgid "Edit Row level security filter" @@ -5017,9 +4864,8 @@ msgid "Edit chart properties" msgstr "编辑图表属性" #: superset-frontend/src/dashboard/components/Header/index.jsx:605 -#, fuzzy msgid "Edit dashboard" -msgstr "编辑看板" +msgstr "编辑仪表盘" #: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:302 msgid "Edit dashboard properties" @@ -5035,10 +4881,9 @@ msgstr "编辑数据集" #: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:73 msgid "Edit email report" -msgstr "" +msgstr "编辑邮件报告" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/ConditionalFormattingControl.tsx:151 -#, fuzzy msgid "Edit formatter" msgstr "日期格式化" @@ -5072,35 +4917,34 @@ msgid "Editing 1 filter:" msgstr "编辑1个过滤条件:" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:119 -#, fuzzy msgid "Editing filter set:" -msgstr "编辑1个过滤条件:" +msgstr "编辑过滤条件集合" #: superset/errors.py:110 msgid "Either the database is spelled incorrectly or does not exist." -msgstr "" +msgstr "数据库拼写不正确或不存在。" #: superset/db_engine_specs/mysql.py:124 superset/db_engine_specs/presto.py:195 #: superset/db_engine_specs/redshift.py:63 #, python-format msgid "Either the username \"%(username)s\" or the password is incorrect." -msgstr "" +msgstr "用户名\"%(username)s\"或密码不正确" #: superset/db_engine_specs/mssql.py:74 #, python-format msgid "" "Either the username \"%(username)s\", password, or database name " "\"%(database)s\" is incorrect." -msgstr "" +msgstr "用户名\"%(username)s\"、密码或数据库名称\"%(database)s\"不正确" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:114 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:118 msgid "Either the username or password is incorrect." -msgstr "" +msgstr "用户名或密码不正确。" #: superset/errors.py:109 msgid "Either the username or the password is wrong." -msgstr "" +msgstr "用户名或密码错误。" #: superset/views/schedules.py:326 msgid "Email Format" @@ -5108,44 +4952,39 @@ msgstr "电子邮件格式" #: superset-frontend/src/components/ReportModal/HeaderReportActionsDropdown/index.tsx:64 msgid "Email reports active" -msgstr "" +msgstr "激活邮件报告" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:47 -#, fuzzy msgid "Emit Target" -msgstr "编辑数据集" +msgstr "发送目标" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/emitFilterControl.tsx:30 -#, fuzzy msgid "Emit dashboard cross filters" -msgstr "编辑看板属性" +msgstr "发送仪表盘过滤" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/emitFilterControl.tsx:33 -#, fuzzy msgid "Emit dashboard cross filters." -msgstr "编辑看板属性" +msgstr "发送仪表盘过滤" #: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:95 -#, fuzzy msgid "Emitted values" msgstr "限制选择器值" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:191 msgid "Emphasis" -msgstr "" +msgstr "重点" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:36 msgid "Employment and education" -msgstr "" +msgstr "就业和教育" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:214 msgid "Empty circle" -msgstr "" +msgstr "空圈" #: superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:59 -#, fuzzy msgid "Empty collection" -msgstr "测试连接" +msgstr "空集合" #: superset/connectors/sqla/models.py:1068 msgid "Empty query?" @@ -5163,33 +5002,32 @@ msgstr "启用过滤器选择" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:200 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:203 msgid "Enable data zooming controls" -msgstr "" +msgstr "启用数据缩放控件" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:44 -#, fuzzy msgid "Enable forecast" -msgstr "日期格式化" +msgstr "启用预测" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:47 msgid "Enable forecasting" -msgstr "" +msgstr "启用预测中" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:161 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:270 msgid "Enable graph roaming" -msgstr "" +msgstr "启用图形漫游" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:141 msgid "Enable node dragging" -msgstr "" +msgstr "启用节点拖动" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:176 msgid "Enable query cost estimation" -msgstr "" +msgstr "启用查询成本估算" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:290 msgid "Enable server side pagination of results (experimental feature)" -msgstr "" +msgstr "支持服务器端结果分页(实验功能)" #: superset/viz.py:2530 msgid "" @@ -5208,15 +5046,13 @@ msgid "End Time" msgstr "结束时间" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:120 -#, fuzzy msgid "End angle" -msgstr "时间范围" +msgstr "结束角度" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:78 #: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:171 -#, fuzzy msgid "End date excluded from time range" -msgstr "配置自定义时间范围" +msgstr "从时间范围中排除的结束日期" #: superset/annotation_layers/annotations/commands/exceptions.py:35 msgid "End date must be after start date" @@ -5225,33 +5061,31 @@ msgstr "起始时间不可以大于当前时间" #: superset/databases/commands/validate.py:71 #, python-format msgid "Engine \"%(engine)s\" cannot be configured through parameters." -msgstr "" +msgstr "引擎 \"%(engine)s\" 不能通过参数配置。" #: superset/databases/commands/validate.py:59 superset/databases/schemas.py:308 #, python-format msgid "Engine \"%(engine)s\" is not a valid engine." -msgstr "" +msgstr "无效引擎\"%(engine)s\"" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:459 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:464 -#, fuzzy msgid "Engine Parameters" -msgstr "模板参数" +msgstr "引擎参数" #: superset/databases/schemas.py:272 msgid "" "Engine spec \"InvalidEngine\" does not support being configured via " "individual parameters." -msgstr "" +msgstr "引擎\"InvalidEngine\"不支持通过单独的参数进行配置。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:356 msgid "Enter CA_BUNDLE" -msgstr "" +msgstr "进入CA_BUNDLE" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:55 -#, fuzzy msgid "Enter a name for this sheet" -msgstr "输入标签的新标题" +msgstr "输入此工作表的名称" #: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:238 msgid "Enter a new title for the tab" @@ -5260,14 +5094,12 @@ msgstr "输入标签的新标题" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:222 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:244 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:266 -#, fuzzy msgid "Enter duration in seconds" -msgstr "时间(秒)" +msgstr "输入间隔时间(秒)" #: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:327 -#, fuzzy msgid "Enter fullscreen" -msgstr "切换全屏" +msgstr "全屏" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:73 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:397 @@ -5276,13 +5108,12 @@ msgid "Entity" msgstr "实体" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:125 -#, fuzzy msgid "Entity ID" -msgstr "实体" +msgstr "实体ID" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:216 msgid "Equal Date Sizes" -msgstr "" +msgstr "相同的日期大小" #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:56 msgid "Error" @@ -5314,7 +5145,7 @@ msgstr "获取jinja表达式中的谓词的值出错:%(msg)s" #: superset-frontend/src/dashboard/containers/DashboardPage.tsx:190 msgid "Error loading chart datasources. Filters may not work correctly." -msgstr "" +msgstr "加载图表数据源时出错。过滤器可能无法正常工作。" #: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:144 msgid "Error message" @@ -5322,19 +5153,18 @@ msgstr "错误信息" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:104 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:139 -#, fuzzy msgid "Error while fetching charts" -msgstr "获取数据时出错" +msgstr "获取图表时出错" #: superset-frontend/src/explore/components/controls/SelectAsyncControl/index.tsx:89 -#, fuzzy, python-format +#, python-format msgid "Error while fetching data: %s" -msgstr "获取数据时出错" +msgstr "获取数据时出错:%s" #: superset/connectors/sqla/models.py:842 -#, fuzzy, python-format +#, python-format msgid "Error while rendering virtual dataset query: %(msg)s" -msgstr "保存数据集时出错:%s" +msgstr "保存查询时出错:%(msg)s" #: superset-frontend/src/SqlLab/components/EstimateQueryCostButton/index.tsx:91 msgid "Estimate cost" @@ -5353,26 +5183,24 @@ msgid "Event Flow" msgstr "事件流" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:43 -#, fuzzy msgid "Event Names" -msgstr "Sheet名称" +msgstr "事件名称" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:35 msgid "Event definition" -msgstr "" +msgstr "事件定义" #: superset/viz.py:2896 msgid "Event flow" msgstr "事件流" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:478 -#, fuzzy msgid "Event time column" -msgstr "时间列" +msgstr "事件时间列" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:43 msgid "Every" -msgstr "每" +msgstr "每个" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:30 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:29 @@ -5390,12 +5218,11 @@ msgstr "每" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:48 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:57 msgid "Evolution" -msgstr "" +msgstr "演化" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1263 -#, fuzzy msgid "Exact" -msgstr "之后" +msgstr "精确" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:34 #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:49 @@ -5408,7 +5235,7 @@ msgstr "例子" #: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:92 #, python-format msgid "Example %(tableName)s will appear here" -msgstr "" +msgstr "示例 %(tableName)s 将出现在此处" #: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:759 #: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:180 @@ -5434,41 +5261,36 @@ msgid "Excel to Database configuration" msgstr "Excel 到数据库配置" #: superset-frontend/src/filters/components/Select/controlPanel.ts:126 -#, fuzzy msgid "Exclude selected values" -msgstr "限制选择器值" +msgstr "排除选定的值" #: superset-frontend/src/SqlLab/components/HighlightedSql/index.tsx:82 -#, fuzzy msgid "Executed SQL" -msgstr "已执行查询" +msgstr "已执行的SQL" #: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:162 msgid "Executed query" msgstr "已执行查询" #: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:105 -#, fuzzy msgid "Execution ID" -msgstr "操作日志" +msgstr "任务ID" #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:307 msgid "Execution log" msgstr "操作日志" #: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:326 -#, fuzzy msgid "Exit fullscreen" -msgstr "切换全屏" +msgstr "退出全屏" #: superset-frontend/src/dashboard/components/filterscope/treeIcons.jsx:36 msgid "Expand all" msgstr "全部展开" #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:152 -#, fuzzy msgid "Expand table preview" -msgstr "删除表格预览" +msgstr "展开表格预览" #: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:351 msgid "Expand tool bar" @@ -5482,7 +5304,7 @@ msgstr "展开工具栏" #: superset-frontend/src/filters/components/TimeColumn/index.ts:31 #: superset-frontend/src/filters/components/TimeGrain/index.ts:31 msgid "Experimental" -msgstr "" +msgstr "实验" #: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:98 #: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:168 @@ -5497,7 +5319,7 @@ msgstr "查看 - %(table)s" #: superset/reports/notifications/email.py:91 msgid "Explore in Superset" -msgstr "" +msgstr "探索" #: superset-frontend/src/SqlLab/components/ExploreCtasResultsButton/index.jsx:91 #: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:161 @@ -5528,27 +5350,24 @@ msgstr "导出看板?" #: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:341 msgid "Export full CSV" -msgstr "" +msgstr "导出全量CSV" #: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:397 -#, fuzzy msgid "Export query" -msgstr "用户查询" +msgstr "导出查询" #: superset-frontend/src/explore/components/ExploreActionButtons.tsx:202 #: superset-frontend/src/explore/components/ExploreActionButtons.tsx:210 -#, fuzzy msgid "Export to .CSV format" -msgstr "导出为 .csv 格式" +msgstr "导出为CSV格式" #: superset-frontend/src/explore/components/ExploreActionButtons.tsx:182 -#, fuzzy msgid "Export to .JSON format" -msgstr "导出为 .csv 格式" +msgstr "导出为JSON格式" #: superset/views/base.py:538 msgid "Export to YAML" -msgstr "导出到YAML" +msgstr "导出到YAML格式" #: superset/views/base.py:538 msgid "Export to YAML?" @@ -5556,7 +5375,7 @@ msgstr "导出到YAML?" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:76 msgid "Expose database in SQL Lab" -msgstr "" +msgstr "在SQL工具箱中展示数据库" #: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:281 #: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:387 @@ -5583,12 +5402,10 @@ msgid "Extra Controls" msgstr "额外控件" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:87 -#, fuzzy msgid "Extra Parameters" -msgstr "模板参数" +msgstr "额外参数" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:736 -#, fuzzy msgid "" "Extra data to specify table metadata. Currently supports metadata of the " "format: `{ \"certification\": { \"certified_by\": \"Data Platform Team\"," @@ -5609,16 +5426,14 @@ msgid "Extra parameters for use in jinja templated queries" msgstr "用于jinja模板化查询的额外参数" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:89 -#, fuzzy msgid "" "Extra parameters that any plugins can choose to set for use in Jinja " "templated queries" msgstr "用于jinja模板化查询的额外参数" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:78 -#, fuzzy msgid "Extra url parameters for use in Jinja templated queries" -msgstr "用于jinja模板化查询的额外参数" +msgstr "用于jinja模板化查询的额外url" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:92 msgid "FEB" @@ -5629,9 +5444,8 @@ msgid "FRI" msgstr "星期五" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:115 -#, fuzzy msgid "Factor" -msgstr "操作" +msgstr "因素" #: superset/views/database/forms.py:145 superset/views/database/forms.py:298 #: superset/views/database/forms.py:426 @@ -5650,13 +5464,13 @@ msgid "Failed at retrieving results" msgstr "检索结果失败" #: superset-frontend/src/SqlLab/actions/sqlLab.js:409 -#, fuzzy, python-format +#, python-format msgid "Failed at stopping query. %s" -msgstr "停止查询时候出错。 " +msgstr "停止查询失败。 %s" #: superset/errors.py:137 superset/sqllab/sql_json_executer.py:194 msgid "Failed to start remote query on a worker." -msgstr "" +msgstr "无法启动远程查询" #: superset-frontend/src/explore/components/controls/withAsyncVerification.tsx:201 #, python-format @@ -5696,7 +5510,7 @@ msgid "Fetched %s" msgstr "刷新于 %s" #: superset/databases/commands/exceptions.py:62 -#, fuzzy, python-format +#, python-format msgid "Field cannot be decoded by JSON. %(json_error)s" msgstr "字段不能由JSON解码。%{json_error}s" @@ -5715,43 +5529,28 @@ msgstr "文件" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:982 msgid "Fill all required fields to enable \"Default Value\"" -msgstr "" +msgstr "填写所有必填字段以启用默认值" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:166 -#, fuzzy msgid "Fill method" -msgstr "通知方式" +msgstr "填充方式" #: superset-frontend/src/components/ListView/Filters/Select.tsx:77 -#, fuzzy msgid "Filter" -msgstr "无筛选" +msgstr "过滤器" #: superset/templates/appbuilder/general/widgets/search.html:24 msgid "Filter List" msgstr "过滤" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:787 -#, fuzzy msgid "Filter Type" -msgstr "过滤用户" +msgstr "过滤类型" #: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:26 msgid "Filter box" msgstr "过滤器" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:204 -msgid "Filter by database" -msgstr "过滤数据库" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:240 -msgid "Filter by status" -msgstr "过滤状态" - -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:195 -msgid "Filter by user" -msgstr "过滤用户" - #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:282 msgid "Filter configuration" msgstr "过滤配置" @@ -5762,15 +5561,15 @@ msgstr "过滤条件的过滤配置" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:895 msgid "Filter has default value" -msgstr "" +msgstr "过滤器默认值" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1010 msgid "Filter is hierarchical" -msgstr "" +msgstr "分层过滤" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:109 msgid "Filter metadata changed in dashboard. It will not be applied." -msgstr "" +msgstr "仪表盘的过滤器已被更改,将不会被应用" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:777 msgid "Filter name" @@ -5781,32 +5580,29 @@ msgid "Filter results" msgstr "过滤结果" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:144 -#, fuzzy, python-format +#, python-format msgid "Filter set already exists" -msgstr "数据集 %(name)s 已存在" +msgstr "过滤器已存在" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:143 #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:83 -#, fuzzy msgid "Filter set with this name already exists" -msgstr "同名数据库已存在" +msgstr "过滤器已存在" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx:348 #, python-format msgid "Filter sets (%(filterSetCount)d)" -msgstr "" +msgstr "过滤器个数(%(filterSetCount)d)" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:791 -#, fuzzy msgid "Filter type" -msgstr "过滤用户" +msgstr "过滤类型" #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:417 msgid "Filter value (case sensitive)" msgstr "过滤值(区分大小写)" #: superset/connectors/sqla/models.py:1278 -#, fuzzy msgid "Filter value list cannot be empty" msgstr "不能为空" @@ -5826,9 +5622,9 @@ msgid "Filters" msgstr "过滤" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:84 -#, fuzzy, python-format +#, python-format msgid "Filters (%d)" -msgstr "未选择的条件 (%d)" +msgstr "过滤 (%d)" #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:134 msgid "Filters by columns" @@ -5843,14 +5639,13 @@ msgid "Filters configuration" msgstr "过滤配置" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx:467 -#, fuzzy msgid "Filters configuration and scoping" -msgstr "过滤配置和范围" +msgstr "过滤配置和作用域" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx:159 #, python-format msgid "Filters out of scope (%d)" -msgstr "" +msgstr "筛选器超出范围(%d)" #: superset/connectors/sqla/views.py:348 msgid "" @@ -5872,18 +5667,17 @@ msgstr "" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:808 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1193 msgid "Finish" -msgstr "" +msgstr "完成" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:124 msgid "" "Fix the trend line to the full time range specified in case filtered " "results do not include the start or end dates" -msgstr "" +msgstr "将趋势线固定为指定的完整时间范围,以防过滤的结果不包括开始日期或结束日期" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:123 -#, fuzzy msgid "Fix to selected Time Range" -msgstr "配置高级时间范围" +msgstr "固定到选定的时间范围" #: superset-frontend/src/explore/components/controls/FixedOrMetricControl/index.jsx:149 msgid "Fixed" @@ -5902,16 +5696,15 @@ msgstr "固定颜色" #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:27 #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:32 msgid "Flow" -msgstr "" +msgstr "流图" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:133 -#, fuzzy msgid "Font size" -msgstr "点大小" +msgstr "字体大小" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:134 msgid "Font size for axis labels, detail value and other text elements" -msgstr "" +msgstr "轴标签、详图值和其他文本元素的字体大小" #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:71 msgid "Font size for the biggest value in the list" @@ -5922,11 +5715,10 @@ msgid "Font size for the smallest value in the list" msgstr "列表中最小值的字体大小" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:179 -#, fuzzy msgid "" -"For Presto and Postgres, shows a button to compute cost before running a " +"For Bigquery, Presto and Postgres, shows a button to compute cost before running a " "query." -msgstr "在运行查询之前计算执行计划" +msgstr "对于Presto和Postgres,显示计算成本按钮(查询后)" #: superset/connectors/sqla/views.py:342 msgid "" @@ -5936,15 +5728,14 @@ msgid "" msgstr "对于常规过滤,这些是此过滤将应用于的角色。对于基本过滤,这些是过滤不适用的角色,例如Admin代表admin应该查看所有数据。" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:111 -#, fuzzy msgid "Force" -msgstr "来源" +msgstr "强制" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:129 msgid "" "Force all tables and views to be created in this schema when clicking " "CTAS or CVAS in SQL Lab." -msgstr "" +msgstr "在SQL工具箱中点击CTAS or CVAS强制创建所有数据表或视图" #: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:270 msgid "Force refresh" @@ -5963,43 +5754,38 @@ msgid "Force-directed Graph" msgstr "力导向图" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:56 -#, fuzzy msgid "Forecast periods" -msgstr "宽限期" +msgstr "预测期" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:37 #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:42 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:45 -#, fuzzy msgid "Formattable" -msgstr "表的键" +msgstr "格式表" #: superset-frontend/src/components/ReportModal/index.tsx:296 msgid "Formatted CSV attached in email" -msgstr "" +msgstr "在邮件中附件CSV" #: superset-frontend/packages/superset-ui-core/src/query/extractQueryFields.ts:130 msgid "Found invalid orderby options" -msgstr "" +msgstr "发现无效的orderby选项" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:80 -#, fuzzy msgid "Fraction digits" -msgstr "操作" +msgstr "分数位" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/controlPanel.ts:53 -#, fuzzy msgid "Frequency" -msgstr "刷新频率" +msgstr "频率" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:304 -#, fuzzy msgid "Friction" -msgstr "操作" +msgstr "摩擦" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:310 msgid "Friction between nodes" -msgstr "" +msgstr "节点之间的摩擦" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:61 msgid "Friday" @@ -6010,31 +5796,28 @@ msgid "From date cannot be larger than to date" msgstr "起始时间不可以大于当前时间" #: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:52 -#, fuzzy msgid "Funnel Chart" -msgstr "新增图表" +msgstr "漏斗图" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:454 msgid "Further customize how to display each column" -msgstr "" +msgstr "进一步自定义如何显示每列" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:168 msgid "Further customize how to display each metric" -msgstr "" +msgstr "进一步定制如何显示每个指标" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:42 -#, fuzzy msgid "Gauge Chart" -msgstr "图表保存" +msgstr "仪表图" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:78 -#, fuzzy msgid "General" -msgstr "间隔" +msgstr "一般" #: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:34 msgid "Geo" -msgstr "" +msgstr "地理位置" #: superset-frontend/src/explore/components/controls/SpatialControl.jsx:203 msgid "Geohash" @@ -6050,35 +5833,32 @@ msgstr "获取指定节假日的日期" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:47 msgid "Google Sheet Name and URL" -msgstr "" +msgstr "Google Sheet名称和URL" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1275 msgid "Grace period" msgstr "宽限期" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:37 -#, fuzzy msgid "Graph Chart" -msgstr "图表保存" +msgstr "圆点图" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:108 msgid "Graph layout" -msgstr "" +msgstr "图表布局" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:262 msgid "Gravity" -msgstr "" +msgstr "重力" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:299 #: superset-frontend/src/filters/components/GroupBy/index.ts:28 -#, fuzzy msgid "Group By" msgstr "分组" #: superset-frontend/src/filters/components/GroupBy/index.ts:29 -#, fuzzy msgid "Group By filter plugin" -msgstr "范围过滤器" +msgstr "分组过滤插件" #: superset/viz.py:895 msgid "Group By' and 'Columns' can't overlap" @@ -6086,7 +5866,7 @@ msgstr "“Group by”列和字段不能重叠" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:83 msgid "Group By, Metrics or Percentage Metrics must have a value" -msgstr "" +msgstr "分组、指标或百分比指标必须具有值" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:31 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:99 @@ -6158,26 +5938,24 @@ msgstr "水平图" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:106 msgid "Horizontal alignment" -msgstr "" +msgstr "水平对齐" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:47 -#, fuzzy msgid "Host" -msgstr "小时" +msgstr "主机" #: superset/db_engine_specs/base.py:1390 msgid "Hostname or IP address" -msgstr "" +msgstr "主机名或IP" #: superset/db_engine_specs/base.py:94 -#, fuzzy msgid "Hour" msgstr "小时" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:65 -#, fuzzy, python-format +#, python-format msgid "Hours %s" -msgstr "小时" +msgstr "%s小时" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:779 msgid "Hours offset" @@ -6185,7 +5963,7 @@ msgstr "小时偏移" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:94 msgid "How do you want to enter service account credentials?" -msgstr "" +msgstr "您希望如何输入服务帐户凭据?" #: superset/views/alerts.py:190 msgid "How long to keep the logs around for this alert" @@ -6193,14 +5971,13 @@ msgstr "这个警报的日志要保存多久" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:59 msgid "How many periods into the future do we want to predict" -msgstr "" +msgstr "想要预测未来的多少个时期" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:129 #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:342 #: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:225 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:477 #: superset-frontend/src/explore/controlPanels/sections.tsx:240 -#, fuzzy msgid "" "How to display time shifts: as individual lines; as the difference " "between the main time series and each time shift; as the percentage " @@ -6214,23 +5991,21 @@ msgstr "巨大" #: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:78 msgid "ISO 3166-2 Codes" -msgstr "" +msgstr "ISO 3166-2 代码" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:237 msgid "ISO 8601" -msgstr "" +msgstr "ISO 8601" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:50 -#, fuzzy msgid "Id" -msgstr "id:" +msgstr "Id" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:85 msgid "Id of root node of the tree." -msgstr "" +msgstr "树的根节点的ID。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:400 -#, fuzzy msgid "" "If Presto or Trino, all the queries in SQL Lab are going to be executed " "as the currently logged on user who must have permission to run them. If " @@ -6255,7 +6030,7 @@ msgstr "" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1201 msgid "If a metric is specified, sorting will be done based on the metric value" -msgstr "" +msgstr "如果指定了度量,则将根据该度量值进行排序" #: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:121 msgid "If activated you can use the " @@ -6280,22 +6055,21 @@ msgstr "如果表已存在,执行其中一个:舍弃(什么都不做), msgid "" "If you wish to specify a different target column than the original " "column, it can be entered here" -msgstr "" +msgstr "如果要指定与原始列不同的目标列,可以在此处输入" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:83 msgid "Ignore time" -msgstr "" +msgstr "忽略时间" #: superset-frontend/src/components/ReportModal/index.tsx:293 msgid "Image (PNG) embedded in email" -msgstr "" +msgstr "使用邮箱发送图片(PNG)" #: superset-frontend/src/utils/downloadAsImage.ts:63 msgid "Image download failed, please refresh and try again." -msgstr "" +msgstr "图片发送失败,请刷新或重试" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:395 -#, fuzzy msgid "Impersonate logged in user (Presto, Trino, Drill, Hive, and GSheets)" msgstr "模拟登录用户 (Presto, Trino, Drill & Hive)" @@ -6329,9 +6103,8 @@ msgid "Import chart failed for an unknown reason" msgstr "导入图表失败,原因未知" #: superset-frontend/src/views/CRUD/chart/ChartList.tsx:621 -#, fuzzy msgid "Import charts" -msgstr "没有图表" +msgstr "导入图表" #: superset/dashboards/commands/exceptions.py:82 msgid "Import dashboard failed for an unknown reason" @@ -6347,46 +6120,40 @@ msgid "Import database failed for an unknown reason" msgstr "导入数据库失败,原因未知" #: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:195 -#, fuzzy msgid "Import databases" -msgstr "编辑数据库" +msgstr "导入数据集" #: superset/datasets/commands/exceptions.py:181 msgid "Import dataset failed for an unknown reason" msgstr "因为未知的原因导入数据集失败" #: superset-frontend/src/views/CRUD/data/dataset/DatasetList.tsx:517 -#, fuzzy msgid "Import datasets" -msgstr "编辑数据集" +msgstr "导入数据集" #: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:190 -#, fuzzy msgid "Import queries" -msgstr "时间序列" +msgstr "导入查询" #: superset/queries/saved_queries/commands/exceptions.py:36 -#, fuzzy msgid "Import saved query failed for an unknown reason." -msgstr "导入图表失败,原因未知" +msgstr "由于未知原因,导入保存的查询失败。" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:64 msgid "" "Important! Select this if the table is not already sorted by entity id, " "else there is no guarantee that all events for each entity are returned." -msgstr "" +msgstr "很重要!如果表尚未按实体ID排序,则选择此项,否则无法保证返回每个实体的所有事件。" #: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:67 -#, fuzzy msgid "Include Series" -msgstr "时间序列" +msgstr "包含系列" #: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:70 msgid "Include series name as an axis" -msgstr "" +msgstr "包括系列名称作为轴" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:325 -#, fuzzy msgid "Include time" msgstr "包含时间" @@ -6397,7 +6164,7 @@ msgstr "不兼容的条件 (%d)" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:121 msgid "Incorrect Fields" -msgstr "" +msgstr "不正确的字段" #: superset/views/database/forms.py:162 superset/views/database/forms.py:315 msgid "Index Column" @@ -6428,7 +6195,7 @@ msgstr "圆环圈内部空洞的内径" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:232 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:235 msgid "Input field supports custom rotation. e.g. 30 for 30°" -msgstr "" +msgstr "输入字段支持自定义。例如,30代表30°" #: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:90 msgid "Instant filtering" @@ -6436,38 +6203,32 @@ msgstr "即时过滤" #: superset-frontend/src/addSlice/AddSliceContainer.tsx:293 msgid "Instructions to add a dataset are available in the Superset tutorial." -msgstr "" +msgstr "有关添加数据集的说明,请参阅教程。" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:34 #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:41 #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:36 #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:38 -#, fuzzy msgid "Intensity" -msgstr "实体" +msgstr "强度" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:495 -#, fuzzy msgid "Interval End column" -msgstr "按列过滤" +msgstr "间隔结束列" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:286 -#, fuzzy msgid "Interval bounds" -msgstr "值边界" +msgstr "区间间隔" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:300 -#, fuzzy msgid "Interval colors" -msgstr "线性颜色方案" +msgstr "间隔颜色" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:477 -#, fuzzy msgid "Interval start column" -msgstr "线列" +msgstr "间隔开始列" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:280 -#, fuzzy msgid "Intervals" msgstr "间隔" @@ -6477,13 +6238,12 @@ msgstr "无效的JSON" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:107 msgid "Invalid Port Number" -msgstr "" +msgstr "无效端口号" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:113 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:117 -#, fuzzy msgid "Invalid account information" -msgstr "基本情况" +msgstr "无效账户信息" #: superset/databases/schemas.py:170 superset/exceptions.py:182 msgid "Invalid certificate" @@ -6515,7 +6275,7 @@ msgstr "" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:52 msgid "Invalid cron expression" -msgstr "cron表达式无效" +msgstr "无效cron表达式" #: superset/utils/pandas_postprocessing.py:578 #, python-format @@ -6552,9 +6312,8 @@ msgid "Invalid longitude/latitude" msgstr "无效的经度/纬度" #: superset/utils/core.py:1318 -#, fuzzy msgid "Invalid metric object" -msgstr "无效认证" +msgstr "无效的指标对象" #: superset/utils/pandas_postprocessing.py:184 #, python-format @@ -6567,9 +6326,9 @@ msgid "Invalid options for %(rolling_type)s: %(options)s" msgstr "%(rolling_type)s 的选项无效:%(options)s" #: superset/common/query_actions.py:192 -#, fuzzy, python-format +#, python-format msgid "Invalid result type: %(result_type)s" -msgstr "无效的滚动类型:%(type)s" +msgstr "无效的结果类型:%(result_type)s" #: superset/utils/pandas_postprocessing.py:408 #, python-format @@ -6590,9 +6349,8 @@ msgid "Is Hidden" msgstr "隐藏" #: superset/charts/filters.py:63 superset/dashboards/filters.py:168 -#, fuzzy msgid "Is certified" -msgstr "认证" +msgstr "已认证" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:285 msgid "Is dimension" @@ -6612,15 +6370,13 @@ msgid "Is temporal" msgstr "时间条件" #: superset-frontend/src/utils/getClientErrorObject.ts:112 -#, fuzzy msgid "Issue 1000 - The dataset is too large to query." -msgstr "Issue 1000 - 数据源太大,无法进行查询。" +msgstr "Issue 1000 - 数据集太大,无法进行查询。" #: superset-frontend/src/utils/getClientErrorObject.ts:118 msgid "Issue 1001 - The database is under an unusual load." msgstr "Issue 1001 - 数据库负载异常。" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:180 #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:125 #: superset-frontend/src/components/DatabaseSelector/index.tsx:183 msgid "It seems you don't have access to any database" @@ -6628,7 +6384,7 @@ msgstr "貌似您没有访问到任何数据库" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:221 msgid "It’s not recommended to truncate y-axis in Bar chart." -msgstr "" +msgstr "不建议截断柱状图中的y轴。" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:91 msgid "JAN" @@ -6649,13 +6405,12 @@ msgid "JSON metadata" msgstr "JSON 元数据" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:341 -#, fuzzy msgid "" "JSON string containing additional connection configuration. This is used " "to provide connection information for systems like Hive, Presto and " "BigQuery which do not conform to the username:password syntax normally " "used by SQLAlchemy." -msgstr "这用于为SQLAlchemy提供Hive、Presto和BigQuery等不符合 用户名:密码 的语法规范。" +msgstr "包含附加连接配置的JSON字符串。它用于为配置单元、Presto和BigQuery等系统提供连接信息,这些系统不符合SQLAlChemy通常使用的用户名:密码语法。" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:97 msgid "JUL" @@ -6673,7 +6428,7 @@ msgstr "一月" msgid "" "Json list of the column names that should be read. If not None, only " "these columns will be read from the file." -msgstr "" +msgstr "Json应读取的列名列表。如果不是“无”,则仅从文件中读取这些列" #: superset/views/database/forms.py:235 superset/views/database/forms.py:368 msgid "" @@ -6698,7 +6453,7 @@ msgstr "六月" #: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:47 #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:37 msgid "KPI" -msgstr "" +msgstr "指标" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/CancelConfirmationAlert.tsx:56 msgid "Keep editing" @@ -6736,13 +6491,12 @@ msgid "Label for your query" msgstr "为您的查询设置标签" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:123 -#, fuzzy msgid "Label position" -msgstr "最新分区:" +msgstr "标签位置" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:198 msgid "Label threshold" -msgstr "" +msgstr "标签阈值" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:144 msgid "Labelling" @@ -6757,15 +6511,15 @@ msgstr "标签" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:90 msgid "Labels for the marker lines" -msgstr "" +msgstr "标记线的标签" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:70 msgid "Labels for the markers" -msgstr "" +msgstr "标记的标签" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:50 msgid "Labels for the ranges" -msgstr "" +msgstr "范围的标签" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:47 #: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:81 @@ -6793,7 +6547,7 @@ msgstr "上次更新 %s" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:149 #, python-format msgid "Last available value seen on %s" -msgstr "" +msgstr " %s 最后一个可用值" #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:180 #: superset-frontend/src/views/CRUD/chart/ChartList.tsx:317 @@ -6830,22 +6584,22 @@ msgstr "配置Layer" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:101 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:110 msgid "Layout" -msgstr "" +msgstr "布局" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:114 msgid "Layout type of graph" -msgstr "" +msgstr "图形的布局类型" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:123 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:246 msgid "Layout type of tree" -msgstr "" +msgstr "树的布局类型" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:81 msgid "" "Leaf nodes that represent fewer than this number of events will be " "initially hidden in the visualization" -msgstr "" +msgstr "表示少于此数量的事件的叶节点最初将隐藏在可视化中" #: superset-frontend/src/views/CRUD/chart/ChartList.tsx:567 #: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:541 @@ -6854,9 +6608,8 @@ msgstr "最远修改" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:111 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:306 -#, fuzzy msgid "Left" -msgstr "警报" +msgstr "左边" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:72 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:166 @@ -6883,12 +6636,11 @@ msgstr "左边距,以像素为单位,为轴标签留出更多空间" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:137 msgid "Left to Right" -msgstr "" +msgstr "从左到右" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:147 -#, fuzzy msgid "Left value" -msgstr "空值" +msgstr "左值" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:38 #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:30 @@ -6917,7 +6669,7 @@ msgstr "空值" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:29 #: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:32 msgid "Legacy" -msgstr "" +msgstr "遗产" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:154 #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:275 @@ -6934,11 +6686,11 @@ msgstr "图示类型" #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:98 msgid "Lift percent precision" -msgstr "" +msgstr "提升百分比精度" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/index.js:30 msgid "Light mode" -msgstr "" +msgstr "光模式" #: superset-frontend/src/explore/components/RowCountLabel.jsx:45 msgid "Limit reached" @@ -6953,23 +6705,24 @@ msgid "" "Limiting rows may result in incomplete data and misleading charts. " "Consider filtering or grouping source/target names instead." msgstr "" +"限制行数可能导致不完整的数据和误导性的图表。" +"可以考虑过滤或分组源/目标名称。" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:335 #: superset-frontend/src/explore/controls.jsx:364 msgid "Limits the number of rows that get displayed." -msgstr "" +msgstr "限制显示的行数。" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:345 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:359 #: superset-frontend/src/explore/controls.jsx:374 -#, fuzzy msgid "" "Limits the number of series that get displayed. A joined subquery (or an " "extra phase where subqueries are not supported) is applied to limit the " "number of series that get fetched and rendered. This feature is useful " "when grouping by high cardinality column(s) though does increase the " "query complexity and cost." -msgstr "限制显示的时间序列的数量。应用子查询(或者不支持子查询)来限制获取和显示的时间序列的数量。在高基数维度(S)分组时,此特性是有用的。" +msgstr "限制显示的系列数。应用联接的子查询(或不支持子查询的额外阶段)来限制获取和呈现的序列数量。此功能在按高基数列分组时很有用,但会增加查询的复杂性和成本。" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:38 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:48 @@ -6979,9 +6732,8 @@ msgstr "限制显示的时间序列的数量。应用子查询(或者不支持 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:76 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:76 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:73 -#, fuzzy msgid "Line" -msgstr "我的编辑" +msgstr "行" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/index.js:38 #: superset-frontend/plugins/preset-chart-xy/src/Line/createMetadata.ts:26 @@ -7031,11 +6783,11 @@ msgstr "保存的查询列表" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:81 msgid "List of values to mark with lines" -msgstr "" +msgstr "要用行标记的值列表" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:61 msgid "List of values to mark with triangles" -msgstr "" +msgstr "要用三角形标记的值列表" #: superset-frontend/src/dashboard/components/CssEditor/index.jsx:108 msgid "Live CSS editor" @@ -7068,9 +6820,8 @@ msgid "Log Retentions (days)" msgstr "日志保留(天)" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:204 -#, fuzzy msgid "Log Scale" -msgstr "Y经度标度" +msgstr "日志规模" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1238 #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1243 @@ -7080,11 +6831,11 @@ msgstr "日志保留" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:383 msgid "Logarithmic scale on primary y-axis" -msgstr "" +msgstr "对数刻度在主y轴上" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:416 msgid "Logarithmic scale on secondary y-axis" -msgstr "" +msgstr "二次y轴上的对数刻度" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:380 #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:404 @@ -7102,7 +6853,7 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:250 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:253 msgid "Logarithmic y-axis" -msgstr "" +msgstr "对数轴" #: superset-frontend/src/components/Menu/MenuRight.tsx:233 #: superset/templates/appbuilder/navbar_right.html:126 @@ -7213,9 +6964,8 @@ msgstr "边距(margin)" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/controlPanel.tsx:107 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:165 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:168 -#, fuzzy msgid "Marker" -msgstr "季度" +msgstr "标记" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:163 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/controlPanel.tsx:124 @@ -7224,33 +6974,32 @@ msgstr "季度" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:179 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:182 msgid "Marker Size" -msgstr "" +msgstr "标记大小" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:68 -#, fuzzy, python-format +#, python-format msgid "Marker labels" -msgstr "[警报] %(label)s" +msgstr "标记标签" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:88 msgid "Marker line labels" -msgstr "" +msgstr "标记线标签" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:79 msgid "Marker lines" -msgstr "" +msgstr "标记线" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:225 msgid "Marker size" -msgstr "" +msgstr "标记大小" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:59 -#, fuzzy msgid "Markers" -msgstr "季度" +msgstr "标记" #: superset-frontend/src/explore/controlPanels/Separator.js:32 msgid "Markup type" -msgstr "Markup 格式" +msgstr "Markup 类型" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:100 #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:48 @@ -7265,7 +7014,7 @@ msgstr "最大气泡的尺寸" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:129 msgid "Max Events" -msgstr "" +msgstr "最大事件数" #: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:257 msgid "Maximize chart" @@ -7273,7 +7022,7 @@ msgstr "最大化图表" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1266 msgid "Maximum" -msgstr "" +msgstr "最大" #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:68 msgid "Maximum Font Size" @@ -7281,7 +7030,7 @@ msgstr "最大字体大小" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:101 msgid "Maximum value on the gauge axis" -msgstr "" +msgstr "量规轴上的最大值" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:70 msgid "May" @@ -7289,26 +7038,25 @@ msgstr "五月" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:93 msgid "Mean of values over specified period" -msgstr "" +msgstr "特定时期内的平均值" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:230 msgid "" "Median edge width, the thickest edge will be 4 times thicker than the " "thinnest." -msgstr "" +msgstr "边缘宽度中间值,最厚的边缘将比最薄的边缘厚4倍" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:217 msgid "" "Median node size, the largest node will be 4 times larger than the " "smallest" -msgstr "" +msgstr "节点大小中位数,最大的节点将比最小的节点大4倍" #: superset-frontend/src/dashboard/util/headerStyleOptions.ts:30 msgid "Medium" msgstr "中" #: superset-frontend/src/components/ReportModal/index.tsx:275 -#, fuzzy msgid "Message Content" msgstr "消息内容" @@ -7317,9 +7065,8 @@ msgid "Message content" msgstr "消息内容" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:105 -#, fuzzy msgid "Metadata" -msgstr "JSON 元数据" +msgstr "元数据" #: superset/connectors/druid/views.py:240 msgid "Metadata Last Refreshed" @@ -7327,9 +7074,8 @@ msgstr "上次刷新的元数据" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:437 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:442 -#, fuzzy msgid "Metadata Parameters" -msgstr "模板参数" +msgstr "元数据参数" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:617 msgid "Metadata has been synced" @@ -7384,7 +7130,7 @@ msgstr "分配给 [Y] 轴的指标" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:103 msgid "Metric change in value from `since` to `until`" -msgstr "" +msgstr "从 `since` 到 `until` 的度量值变化" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:39 msgid "Metric descending" @@ -7392,16 +7138,15 @@ msgstr "指标降序" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:117 msgid "Metric factor change from `since` to `until`" -msgstr "" +msgstr "度量因子从 `since` 到 `until` 的变化" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:119 msgid "Metric for Color" msgstr "颜色指标" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:98 -#, fuzzy msgid "Metric for node values" -msgstr "颜色指标" +msgstr "节点值的度量" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:658 #, python-format @@ -7410,7 +7155,7 @@ msgstr "指标名称 [%s] 重复" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:110 msgid "Metric percent change in value from `since` to `until`" -msgstr "" +msgstr "从 `since` 到 `until` 的价值变化百分比" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:120 msgid "Metric that defines the color of the country" @@ -7421,9 +7166,8 @@ msgid "Metric that defines the size of the bubble" msgstr "定义指标的气泡大小" #: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:85 -#, fuzzy msgid "Metric to display bottom title" -msgstr "选择一个指标来显示" +msgstr "显示底部标题的度量值" #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:185 msgid "Metric to sort the results by" @@ -7432,7 +7176,7 @@ msgstr "按照指标的结果进行排序" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:142 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:421 msgid "Metric used to calculate bubble size" -msgstr "" +msgstr "用来计算气泡大小的公制" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:127 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:371 @@ -7441,7 +7185,7 @@ msgid "" "Metric used to define how the top series are sorted if a series or row " "limit is present. If undefined reverts to the first metric (where " "appropriate)." -msgstr "" +msgstr "如果存在序列或行限制,则用于定义顶部序列的排序方式的度量。如果未定义,则返回第一个度量(如果适用)。" #: superset/connectors/druid/models.py:1072 msgid "Metric(s) {} must be aggregations." @@ -7457,11 +7201,10 @@ msgid "Metrics" msgstr "指标" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:148 -#, fuzzy msgid "" "Metrics for which percentage of total are to be displayed. Calculated " "from only data within the row limit." -msgstr "要显示总数百分比的度量" +msgstr "要显示其占总数百分比的指标。只计算行限制内的只读存储器数据。" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:93 msgid "Midnight" @@ -7480,9 +7223,8 @@ msgid "Min Periods" msgstr "最小周期" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:90 -#, fuzzy msgid "Min Width" -msgstr "线宽" +msgstr "最小宽度" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:73 #: superset-frontend/src/explore/controlPanels/sections.tsx:189 @@ -7500,9 +7242,8 @@ msgid "Minimize chart" msgstr "最小化图表" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1260 -#, fuzzy msgid "Minimum" -msgstr "分" +msgstr "最小" #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:57 msgid "Minimum Font Size" @@ -7510,19 +7251,19 @@ msgstr "最小字体大小" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:78 msgid "Minimum leaf node event count" -msgstr "" +msgstr "节点最小事件数" #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:85 msgid "Minimum threshold in percentage points for showing labels." -msgstr "" +msgstr "标签显示百分比最小阈值" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:202 msgid "Minimum value for label to be displayed on graph." -msgstr "" +msgstr "在图形上显示标签的最小值。" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:89 msgid "Minimum value on the gauge axis" -msgstr "" +msgstr "量规轴上的最小值" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:328 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:243 @@ -7532,22 +7273,20 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:259 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:262 msgid "Minor Split Line" -msgstr "" +msgstr "小的分模线" #: superset/db_engine_specs/base.py:89 -#, fuzzy msgid "Minute" -msgstr "分" +msgstr "分钟" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:64 -#, fuzzy, python-format +#, python-format msgid "Minutes %s" -msgstr "分钟" +msgstr "%s分钟" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:93 -#, fuzzy msgid "Missing Required Fields" -msgstr "需要名称" +msgstr "缺少必填字段" #: superset-frontend/src/components/ErrorMessage/DatasetNotFoundErrorMessage.tsx:34 #: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:251 @@ -7555,9 +7294,8 @@ msgid "Missing dataset" msgstr "丢失数据集" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:67 -#, fuzzy msgid "Mixed Time-Series" -msgstr "时间序列" +msgstr "混和时间序列" #: superset-frontend/src/dashboard/components/AddSliceCard.jsx:128 #: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:312 @@ -7573,7 +7311,7 @@ msgstr "已修改" #: superset-frontend/src/views/CRUD/chart/ChartCard.tsx:155 #: superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx:164 #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:130 -#, fuzzy, python-format +#, python-format msgid "Modified %s" msgstr "最后修改 %s" @@ -7593,14 +7331,14 @@ msgid "Monday" msgstr "星期一" #: superset/db_engine_specs/base.py:98 -#, fuzzy +# msgid "Month" msgstr "月" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:68 -#, fuzzy, python-format +#, python-format msgid "Months %s" -msgstr "月" +msgstr "%s月" #: superset-frontend/src/explore/components/controls/DatasourceControl/index.jsx:238 msgid "More dataset related options" @@ -7609,7 +7347,7 @@ msgstr "更多数据集相关选项" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:167 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:276 msgid "Move only" -msgstr "" +msgstr "移动" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:43 msgid "Moves the given set of dates by a specified interval." @@ -7617,23 +7355,21 @@ msgstr "将给定的日期集以指定的间隔进行移动" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:40 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:32 -#, fuzzy msgid "Multi-Dimensions" -msgstr "选择一个维度" +msgstr "多维度" #: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:34 #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:41 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:37 -#, fuzzy msgid "Multi-Layers" -msgstr "乘数" +msgstr "多层" #: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:33 #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:44 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:43 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:62 msgid "Multi-Levels" -msgstr "" +msgstr "多层次" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:42 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:32 @@ -7642,12 +7378,11 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:58 #: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:30 msgid "Multi-Variables" -msgstr "" +msgstr "多元" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:187 -#, fuzzy msgid "Multiple" -msgstr "乘数" +msgstr "多方" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:30 msgid "Multiple Line Charts" @@ -7658,6 +7393,8 @@ msgid "" "Multiple file extensions are not allowed for columnar uploads. Please " "make sure all files are of the same extension." msgstr "" +"柱状上传不允许使用多个文件扩展名" +"请确保所有文件的扩展名相同。" #: superset-frontend/src/explore/components/controls/SpatialControl.jsx:185 msgid "" @@ -7667,9 +7404,8 @@ msgstr "接受多种格式,查看geopy.points库以获取更多细节" #: superset-frontend/src/filters/components/GroupBy/controlPanel.ts:59 #: superset-frontend/src/filters/components/Select/controlPanel.ts:77 -#, fuzzy msgid "Multiple select" -msgstr "允许多选" +msgstr "多选" #: superset-frontend/src/explore/components/controls/FilterBoxItemControl/index.jsx:218 msgid "Multiple selections allowed, otherwise filter is limited to a single value" @@ -7689,13 +7425,12 @@ msgstr "必须至少指明一个数值列" #: superset/connectors/sqla/models.py:1303 msgid "Must specify a value for filters with comparison operators" -msgstr "" +msgstr "必须为带有比较操作符的过滤器指定一个值吗" #: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopoverTrigger.tsx:47 #: superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelectPopoverTitle.jsx:59 -#, fuzzy msgid "My column" -msgstr "列" +msgstr "我的列" #: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopoverTitle.jsx:73 msgid "My metric" @@ -7703,7 +7438,7 @@ msgstr "我的指标" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:76 msgid "N/A" -msgstr "" +msgstr "N/A" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:101 msgid "NOV" @@ -7739,9 +7474,8 @@ msgid "Name must be unique" msgstr "名称必须是唯一的" #: superset/views/database/forms.py:380 -#, fuzzy msgid "Name of table to be created from columnar data." -msgstr "从excel数据将创建的表的名称。" +msgstr "从列存储数据创建的表的名称。" #: superset/views/database/forms.py:96 msgid "Name of table to be created from csv data." @@ -7753,30 +7487,27 @@ msgstr "从excel数据将创建的表的名称。" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:61 msgid "Name of the column containing the id of the parent node" -msgstr "" +msgstr "包含父节点id的列的名称" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:51 -#, fuzzy msgid "Name of the id column" -msgstr "时间序列的列" +msgstr "ID列名称" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:53 msgid "Name of the source nodes" -msgstr "" +msgstr "源节点名称" #: superset/connectors/sqla/views.py:439 msgid "Name of the table that exists in the source database" -msgstr "源数据库中存在的表的名称" +msgstr "源数据库中存在的表名称" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:63 -#, fuzzy msgid "Name of the target nodes" -msgstr "数据集的所有者" +msgstr "目标节点名称" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:51 -#, fuzzy msgid "Name your database" -msgstr "命名数据集" +msgstr "您的数据集" #: superset-frontend/src/chart/chartReducer.ts:106 #: superset-frontend/src/chart/chartReducer.ts:170 @@ -7789,7 +7520,7 @@ msgstr "新增" #: superset-frontend/src/components/ReportModal/index.tsx:251 msgid "New Email Report" -msgstr "" +msgstr "新的电子邮件报告" #: superset-frontend/src/explore/components/ExploreAdditionalActionsMenu/index.jsx:61 msgid "New chart" @@ -7801,18 +7532,16 @@ msgid "New columns added: %s" msgstr "新增的列:%s" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx:81 -#, fuzzy msgid "New filter set" -msgstr "配置过滤范围" +msgstr "新的过滤器" #: superset-frontend/src/SqlLab/components/SqlEditor/index.jsx:327 msgid "New tab" msgstr "关闭标签" #: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:420 -#, fuzzy msgid "New tab (Ctrl + q)" -msgstr "新建Tab页 (Ctrl + t)" +msgstr "新建Tab页 (Ctrl + q)" #: superset-frontend/src/SqlLab/components/TabbedSqlEditors/index.jsx:421 msgid "New tab (Ctrl + t)" @@ -7837,7 +7566,7 @@ msgstr "否" #: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:74 #, python-format msgid "No %(tableName)s yet" -msgstr "" +msgstr "还没有 %(tableName)s" #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:376 #, python-format @@ -7849,7 +7578,6 @@ msgid "No Access!" msgstr "不能访问!" #: superset-frontend/src/components/ListView/ListView.tsx:398 -#, fuzzy msgid "No Data" msgstr "没有数据" @@ -7870,14 +7598,13 @@ msgid "No charts" msgstr "没有图表" #: superset-frontend/src/filters/components/GroupBy/GroupByFilterPlugin.tsx:82 -#, fuzzy msgid "No columns" -msgstr "列" +msgstr "没有列" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:134 -#, fuzzy, python-format +#, python-format msgid "No compatible columns found" -msgstr "不兼容的条件 (%d)" +msgstr "找不到兼容的列" #: superset-frontend/src/profile/components/CreatedContent.tsx:63 msgid "No dashboards" @@ -7892,16 +7619,15 @@ msgstr "没有数据" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:219 msgid "No data after filtering or data is NULL for the latest time record" -msgstr "" +msgstr "过滤后没有数据,或者最新时间记录的数据为NULL" #: superset/dashboards/commands/importers/v0.py:321 msgid "No data in file" msgstr "文件中无数据" #: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:752 -#, fuzzy msgid "No description available." -msgstr "描述" +msgstr "没有可用的描述" #: superset-frontend/src/profile/components/Favorites.tsx:46 msgid "No favorite charts yet, go click on stars!" @@ -7954,24 +7680,20 @@ msgid "No such column found. To filter on a metric, try the Custom SQL tab." msgstr "没有发现这样的列。若要在度量值上筛选,请尝试自定义SQL选项卡。" #: superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx:81 -#, fuzzy msgid "No time columns" -msgstr "时间列" +msgstr "没有时间列" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:155 -#, fuzzy msgid "Node label position" -msgstr "忽略空位置" +msgstr "节点标签位置" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:182 -#, fuzzy msgid "Node select mode" -msgstr "运行选定的查询" +msgstr "节点选择模式" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:213 -#, fuzzy msgid "Node size" -msgstr "气泡尺寸" +msgstr "节点大小" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:41 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:242 @@ -7983,11 +7705,11 @@ msgstr "空" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:129 msgid "None -> Arrow" -msgstr "" +msgstr "无-> 箭头" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:128 msgid "None -> None" -msgstr "" +msgstr "无->无" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:43 #: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:77 @@ -8004,9 +7726,8 @@ msgid "Normalized" msgstr "标准化" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:81 -#, fuzzy msgid "Not Time Series" -msgstr "时间序列" +msgstr "美誉时间序列" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:116 msgid "Not null" @@ -8018,7 +7739,7 @@ msgstr "没有触发" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:152 msgid "Not up to date" -msgstr "" +msgstr "不是最新的" #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:87 #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:97 @@ -8070,15 +7791,15 @@ msgstr "数字格式化" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:81 msgid "Number of decimal digits to round numbers to" -msgstr "" +msgstr "要四舍五入的十进制位数" #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:100 msgid "Number of decimal places with which to display lift values" -msgstr "" +msgstr "用于显示升力值的小数位数" #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:87 msgid "Number of decimal places with which to display p-values" -msgstr "" +msgstr "用于显示p值的小数位数" #: superset/views/database/forms.py:194 superset/views/database/forms.py:335 msgid "Number of rows of file to read." @@ -8090,7 +7811,7 @@ msgstr "在文件开始时跳过的行数。" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:231 msgid "Number of split segments on the axis" -msgstr "" +msgstr "轴上分割段的数目" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:119 msgid "Number of steps to take between ticks when displaying the X scale" @@ -8101,9 +7822,8 @@ msgid "Number of steps to take between ticks when displaying the Y scale" msgstr "显示 Y 刻度时,在刻度之间表示的步骤数" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:295 -#, fuzzy msgid "Numerical range" -msgstr "时间范围" +msgstr "数值范围" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:100 msgid "OCT" @@ -8147,14 +7867,14 @@ msgid "" "One or many columns to group by. High cardinality groupings should " "include a series limit to limit the number of fetched and rendered " "series." -msgstr "" +msgstr "要分组的一列或多列。高基数分组应包括序列限制,以限制提取和呈现的序列数。" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:105 msgid "" "One or many columns to group by. High cardinality groupings should " "include a sort by metric and series limit to limit the number of fetched " "and rendered series." -msgstr "" +msgstr "要分组的一列或多列。高基数分组应包括按度量排序和序列限制,以限制提取和呈现的序列数。" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:56 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:215 @@ -8202,39 +7922,34 @@ msgid "One or more metrics do not exist" msgstr "一个或多个指标不存在" #: superset/errors.py:113 -#, fuzzy msgid "One or more parameters needed to configure a database are missing." -msgstr "Issue 1006 - 查询中指定的一个或多个参数丢失。" +msgstr "数据库配置缺少所需的一个或多个参数。" #: superset/errors.py:127 -#, fuzzy msgid "One or more parameters specified in the query are malformatted." -msgstr "Issue 1006 - 查询中指定的一个或多个参数丢失。" +msgstr "查询中指定的一个或多个参数的格式不正确。" #: superset/errors.py:101 -#, fuzzy msgid "One or more parameters specified in the query are missing." -msgstr "Issue 1006 - 查询中指定的一个或多个参数丢失。" +msgstr "查询中指定的一个或多个参数丢失。" #: superset/views/core.py:2075 msgid "" "One or more required fields are missing in the request. Please try again," " and if the problem persists conctact your administrator." -msgstr "" +msgstr "请求中缺少一个或多个必填字段。请重试,如果问题仍然存在,请与管理员联系。" #: superset-frontend/src/dashboard/components/SliceHeader/index.tsx:46 msgid "One ore more annotation layers failed loading." msgstr "一个或多个注释层加载失败。" #: superset/sql_lab.py:201 -#, fuzzy msgid "Only SELECT statements are allowed against this database." msgstr "此数据库只允许使用 `SELECT` 语句" #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:128 -#, fuzzy msgid "Only Total" -msgstr "显示总计" +msgstr "仅总计" #: superset/connectors/sqla/utils.py:96 msgid "Only `SELECT` statements are allowed" @@ -8248,7 +7963,7 @@ msgstr "只有选定的面板将受此过滤条件的影响" msgid "" "Only show the total value on the stacked chart, and not show on the " "selected category" -msgstr "" +msgstr "仅在堆积图上显示合计值,而不在所选类别上显示" #: superset/connectors/sqla/utils.py:105 msgid "Only single queries supported" @@ -8270,7 +7985,7 @@ msgstr "不透明度" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:152 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:155 msgid "Opacity of Area Chart. Also applies to confidence band." -msgstr "" +msgstr "区域图的不透明度。也适用于置信带" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:239 msgid "Opacity of all clusters, points, and labels. Between 0 and 1." @@ -8278,7 +7993,7 @@ msgstr "所有簇、点和标签的不透明度。在0到1之间。" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:202 msgid "Opacity of area chart." -msgstr "" +msgstr "面积图的不透明度" #: superset-frontend/src/explore/components/ExploreViewContainer.jsx:550 msgid "Open Datasource tab" @@ -8315,9 +8030,9 @@ msgstr "" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:125 #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:130 -#, fuzzy, python-format +#, python-format msgid "Operator" -msgstr "%s 运算符" +msgstr "运算符" #: superset/utils/pandas_postprocessing.py:175 #, python-format @@ -8332,17 +8047,17 @@ msgstr "用于验证HTTPS请求的可选 CA_BUNDLE 内容。仅在某些数据 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:73 msgid "Optional name of the data column." -msgstr "" +msgstr "数据列的可选名称" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1135 msgid "" "Optional time column if time range should apply to another column than " "the default time column" -msgstr "" +msgstr "如果时间范围应应用于默认时间列以外的其他列,则可选时间列" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1092 msgid "Optional warning about use of this metric" -msgstr "" +msgstr "关于使用此指标的可选警告" # 以下部分来源于 superset-ui 项目 #: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:49 @@ -8360,24 +8075,23 @@ msgstr "设置" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:668 msgid "Or choose from a list of other databases we support:" -msgstr "" +msgstr "或者从我们支持的其他数据库列表中选择:" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:63 msgid "Order by entity id" -msgstr "" +msgstr "按实体ID排序" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:272 msgid "Order results by selected columns" -msgstr "" +msgstr "按选定列对结果进行排序" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:271 msgid "Ordering" msgstr "排序" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:142 -#, fuzzy msgid "Orientation of tree" -msgstr "方向" +msgstr "树的方向" #: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:27 #: superset-frontend/src/explore/constants.ts:116 @@ -8385,7 +8099,6 @@ msgid "Origin" msgstr "起点" #: superset-frontend/src/explore/components/ExportToCSVDropdown/index.tsx:74 -#, fuzzy msgid "Original" msgstr "起点" @@ -8396,17 +8109,16 @@ msgstr "原始表列顺序" #: superset-frontend/packages/superset-ui-chart-controls/src/utils/D3Formatting.ts:29 #: superset/db_engine_specs/base.py:85 msgid "Original value" -msgstr "" +msgstr "原始值" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:120 msgid "Orthogonal" -msgstr "" +msgstr "正交化" #: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:120 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:687 -#, fuzzy msgid "Other" -msgstr "月" +msgstr "其他" #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:193 msgid "Outer Radius" @@ -8417,9 +8129,8 @@ msgid "Outer edge of Pie chart" msgstr "饼图外缘" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:257 -#, fuzzy msgid "Overlap" -msgstr "世界地图" +msgstr "重叠" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:107 #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:322 @@ -8489,9 +8200,8 @@ msgid "" msgstr "所有者是可以更改看板的用户列表。可按名称或用户名搜索。" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:388 -#, fuzzy msgid "Page length" -msgstr "页面长度" +msgstr "页长" #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:29 msgid "Paired t-test Table" @@ -8528,14 +8238,12 @@ msgid "Parameters" msgstr "参数" #: superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx:103 -#, fuzzy msgid "Parameters " msgstr "参数" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:60 -#, fuzzy msgid "Parent" -msgstr "透明" +msgstr "父类" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:643 #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1037 @@ -8543,9 +8251,8 @@ msgid "Parent filter" msgstr "父级过滤" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1045 -#, fuzzy msgid "Parent filter is required" -msgstr "类型是必需的" +msgstr "需要父筛选器" #: superset/views/database/forms.py:203 superset/views/database/forms.py:340 msgid "Parse Dates" @@ -8558,7 +8265,7 @@ msgstr "解析日期" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:33 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:50 msgid "Part of a Whole" -msgstr "" +msgstr "占比" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/index.js:27 msgid "Partition Chart" @@ -8569,53 +8276,46 @@ msgid "Partition Diagram" msgstr "分区图" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:176 -#, fuzzy msgid "Partition Limit" -msgstr "分区图" +msgstr "分区限制" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:189 -#, fuzzy msgid "Partition Threshold" -msgstr "分区图" +msgstr "分区阈值" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:192 msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" -msgstr "" +msgstr "高度与父高度的比例低于此值的分区将被修剪" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:130 #: superset/db_engine_specs/base.py:1389 -#, fuzzy msgid "Password" -msgstr "Broker的密码" +msgstr "密码" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx:79 msgid "Paste the shareable Google Sheet URL here" -msgstr "" +msgstr "将可共享的Google Sheet URL粘贴到此处" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:35 #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 #: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:35 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:46 -#, fuzzy msgid "Pattern" -msgstr "更新" +msgstr "规则" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:108 -#, fuzzy msgid "Percent Change" -msgstr "显示百分比" +msgstr "百分比变化" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:147 -#, fuzzy msgid "Percentage metrics" -msgstr "百分比度量" +msgstr "百分比指标" #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/controlPanel.tsx:81 -#, fuzzy msgid "Percentage threshold" -msgstr "百分比度量" +msgstr "百分比阈值" #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:41 #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:45 @@ -8628,9 +8328,8 @@ msgstr "百分比度量" #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:69 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:63 #: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:33 -#, fuzzy msgid "Percentages" -msgstr "显示百分比" +msgstr "百分比" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:56 #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:278 @@ -8646,14 +8345,12 @@ msgid "Periods must be a positive integer value" msgstr "句点必须是正整数值" #: superset-frontend/src/explore/components/PropertiesModal/index.tsx:258 -#, fuzzy msgid "Person or group that has certified this chart." -msgstr "认证此指标的个人或团体" +msgstr "对此图表进行认证的个人或团体。" #: superset-frontend/src/dashboard/components/PropertiesModal/index.jsx:548 -#, fuzzy msgid "Person or group that has certified this dashboard." -msgstr "认证此指标的个人或团体" +msgstr "已对此仪表板进行认证的个人或组。" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:260 #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1068 @@ -8698,11 +8395,11 @@ msgstr "选择一个指标!" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:56 msgid "Pick a name to help you identify this database." -msgstr "" +msgstr "选择一个名称来帮助您识别这个数据库。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:151 msgid "Pick a nickname for this database to display as in Superset." -msgstr "" +msgstr "为这个数据库选择一个昵称以在Superset中显示" #: superset/viz.py:1358 superset/viz.py:1621 msgid "Pick a time granularity for your time series" @@ -8710,7 +8407,7 @@ msgstr "为您的时间序列选择一个时间粒度" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:510 msgid "Pick a title for you annotation." -msgstr "" +msgstr "为您的注释选择一个标题" #: superset/viz.py:1783 msgid "Pick at least one field for [Series]" @@ -8729,6 +8426,8 @@ msgid "" "Pick one or more columns that should be shown in the annotation. If you " "don't select a column all of them will be shown." msgstr "" +"选择注释中应该显示的一个或多个列" +"如果您不选择一列,所有的选项都会显示出来。" #: superset-frontend/src/explore/controlPanels/Separator.js:37 msgid "Pick your favorite markup language" @@ -8744,9 +8443,8 @@ msgid "Pie shape" msgstr "饼图形状" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:234 -#, fuzzy msgid "Pin" -msgstr "最小值" +msgstr "Pin" #: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:56 msgid "Pivot Options" @@ -8758,9 +8456,8 @@ msgid "Pivot Table" msgstr "透视表" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:54 -#, fuzzy msgid "Pivot Table v2" -msgstr "透视表" +msgstr "透视表 v2" #: superset/utils/pandas_postprocessing.py:260 msgid "Pivot operation must include at least one aggregate" @@ -8771,9 +8468,8 @@ msgid "Pivot operation requires at least one index" msgstr "透视操作至少需要一个索引" #: superset-frontend/src/explore/components/ExportToCSVDropdown/index.tsx:80 -#, fuzzy msgid "Pivoted" -msgstr "已编辑" +msgstr "旋转" #: superset-frontend/plugins/legacy-plugin-chart-horizon/src/controlPanel.ts:83 msgid "Pixel height of each series" @@ -8781,14 +8477,14 @@ msgstr "每个序列的像素高度" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils/index.ts:28 msgid "Please apply filter changes" -msgstr "" +msgstr "请应用滤镜更改" #: superset/sqllab/query_render.py:116 msgid "" "Please check your query and confirm that all template parameters are " "surround by double braces, for example, \"{{ ds }}\". Then, try running " "your query again." -msgstr "" +msgstr "请检查查询并确认所有模板参数都用双大括号括起来,例如 \"{{ ds }}\"。然后,再次尝试运行查询" #: superset/db_engine_specs/athena.py:55 #: superset/db_engine_specs/bigquery.py:179 @@ -8798,14 +8494,14 @@ msgstr "" msgid "" "Please check your query for syntax errors at or near " "\"%(syntax_error)s\". Then, try running your query again." -msgstr "" +msgstr "请检查查询中 \"%(syntax_error)s\" 处或附近的语法错误。然后,再次尝试运行查询。“" #: superset/db_engine_specs/gsheets.py:74 superset/db_engine_specs/mysql.py:144 #, python-format msgid "" "Please check your query for syntax errors near \"%(server_error)s\". " "Then, try running your query again." -msgstr "" +msgstr "请检查查询中\"%(server_error)s\"附近的语法错误然后,再次尝试运行查询" #: superset/viz.py:879 msgid "Please choose at least one 'Group by' field " @@ -8821,7 +8517,7 @@ msgstr "请在左右轴上选择不同的指标" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:94 msgid "Please complete all required fields." -msgstr "" +msgstr "请填写所有必填项" #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:485 #: superset-frontend/src/views/CRUD/annotation/AnnotationList.tsx:300 @@ -8847,17 +8543,16 @@ msgid "Please enter a chart name" msgstr "请输入图表名称" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/Footer.tsx:81 -#, fuzzy msgid "Please filter set name" -msgstr "请输入图表名称" +msgstr "请筛选集合名称" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:122 msgid "Please make sure all fields are filled out correctly" -msgstr "" +msgstr "请确保所有字段填写正确" #: superset/db_engine_specs/postgres.py:122 msgid "Please re-enter the password." -msgstr "" +msgstr "请重新输入密码。" #: superset-frontend/src/components/ErrorMessage/DatabaseErrorMessage.tsx:59 #: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:72 @@ -8870,15 +8565,15 @@ msgstr "请保存查询以启用共享" #: superset/reports/commands/exceptions.py:90 msgid "Please save your chart first, then try creating a new email report." -msgstr "" +msgstr "请先保存您的图表,然后尝试创建一个新的电子邮件报告。" #: superset/reports/commands/exceptions.py:102 msgid "Please save your dashboard first, then try creating a new email report." -msgstr "" +msgstr "请先保存您的仪表盘,然后尝试创建一个新的电子邮件报告。" #: superset-frontend/src/addSlice/AddSliceContainer.tsx:322 msgid "Please select both a Dataset and a Chart type to proceed" -msgstr "" +msgstr "请同时选择数据集和图表类型以继续" #: superset/viz.py:1161 msgid "Please use 3 different metric labels" @@ -8886,14 +8581,14 @@ msgstr "请在左右轴上选择不同的指标" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:104 msgid "Please verify that port is open to connect." -msgstr "" +msgstr "请检查端口是否打开以进行连接" #: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:27 msgid "" "Plots the individual metrics for each row in the data vertically and " "links them together as a line. This chart is useful for comparing " "multiple metrics across all of the samples or rows in the data." -msgstr "" +msgstr "垂直地绘制数据中每一行的单个指标,并将它们链接成一行。此图表用于比较数据中所有样本或行中的多个指标。" #: superset/initialization/__init__.py:254 msgid "Plugins" @@ -8912,7 +8607,6 @@ msgid "Points" msgstr "点配置" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:201 -#, fuzzy msgid "Points and clusters will update as the viewport is being changed" msgstr "点和簇将随着视图改变而更新。" @@ -8933,15 +8627,15 @@ msgstr "流行标签链接" #: superset-frontend/plugins/plugin-chart-table/src/index.ts:47 #: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:124 msgid "Popular" -msgstr "" +msgstr "常用" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx:170 msgid "Populate \"Default value\" to enable this control" -msgstr "" +msgstr "填充 \"Default value\" 以启用此控件" #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:33 msgid "Population age data" -msgstr "" +msgstr "人口年龄数据" #: superset/db_engine_specs/mssql.py:87 #: superset/db_engine_specs/postgres.py:132 @@ -8949,12 +8643,11 @@ msgstr "" #: superset/db_engine_specs/redshift.py:73 #, python-format msgid "Port %(port)s on hostname \"%(hostname)s\" refused the connection." -msgstr "" +msgstr "主机名 \"%(hostname)s\" 上的端口 %(port)s 拒绝连接。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:103 -#, fuzzy msgid "Port is closed" -msgstr "报告失败" +msgstr "端口已关闭" #: superset/views/dashboard/mixin.py:87 msgid "Position JSON" @@ -8962,37 +8655,35 @@ msgstr "位置JSON" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:181 msgid "Position of child node label on tree" -msgstr "" +msgstr "子节点标签在树上的位置" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:310 msgid "Position of column level subtotal" -msgstr "" +msgstr "列级小计的位置" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:163 msgid "Position of intermidiate node label on tree" -msgstr "" +msgstr "中间节点标签在树中的位置" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:293 msgid "Position of row level subtotal" -msgstr "" +msgstr "行级小计的位置" #: superset-frontend/src/components/Menu/MenuRight.tsx:180 msgid "Powered by Apache Superset" -msgstr "" +msgstr "由Apache Superset提供支持" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1096 -#, fuzzy msgid "Pre-filter" -msgstr "父级过滤" +msgstr "预过滤" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1061 msgid "Pre-filter available values" -msgstr "" +msgstr "预滤器可用值" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:623 -#, fuzzy msgid "Pre-filter is required" -msgstr "类型是必需的" +msgstr "预过滤是必须的" #: superset/connectors/sqla/views.py:451 msgid "" @@ -9011,14 +8702,12 @@ msgstr "当获取不同的值来填充过滤器组件应用时。支持jinja的 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:72 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:63 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:74 -#, fuzzy msgid "Predictive" -msgstr "激活" +msgstr "预测" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:36 -#, fuzzy msgid "Predictive Analytics" -msgstr "高级分析" +msgstr "预测分析" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:64 msgid "Prefix metric name with slice name" @@ -9040,9 +8729,8 @@ msgid "Previous" msgstr "之前" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:243 -#, fuzzy msgid "Primary" -msgstr "星期五" +msgstr "主键" #: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:56 msgid "Primary Metric" @@ -9050,11 +8738,11 @@ msgstr "主计量指标" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:248 msgid "Primary or secondary y-axis" -msgstr "" +msgstr "主或次y轴" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:371 msgid "Primary y-axis format" -msgstr "" +msgstr "主轴格式" #: superset-frontend/src/components/Menu/MenuRight.tsx:161 #: superset/templates/appbuilder/navbar_right.html:109 @@ -9066,13 +8754,11 @@ msgid "Profile picture provided by Gravatar" msgstr "资料图片由 Gravatar 提供" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:239 -#, fuzzy msgid "Progress" msgstr "进度" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/index.ts:30 #: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:56 -#, fuzzy msgid "Progressive" msgstr "进度" @@ -9090,15 +8776,15 @@ msgstr "传播" #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:71 #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:64 msgid "Proportional" -msgstr "" +msgstr "比例" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:86 msgid "Public and privately shared sheets" -msgstr "" +msgstr "公共和私人共享的表" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:83 msgid "Publicly shared sheets only" -msgstr "" +msgstr "仅公开共享表" #: superset-frontend/src/dashboard/components/PublishedStatus/index.jsx:101 #: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:301 @@ -9117,7 +8803,6 @@ msgid "Put the labels outside of the pie?" msgstr "是否将标签显示在饼图外侧?" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Pie/controlPanel.ts:112 -#, fuzzy msgid "Put the labels outside the pie?" msgstr "是否将标签显示在饼图外侧?" @@ -9140,14 +8825,13 @@ msgid "Python functions" msgstr "Python函数" #: superset/db_engine_specs/base.py:99 -#, fuzzy msgid "Quarter" msgstr "季度" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:69 -#, fuzzy, python-format +#, python-format msgid "Quarters %s" -msgstr "季度" +msgstr " %s 季度" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:32 #: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:26 @@ -9209,19 +8893,17 @@ msgstr "查询" #: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:253 #, python-format msgid "Query %s: %s" -msgstr "" +msgstr "查询 : %s " #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:258 #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:283 -#, fuzzy msgid "Query A" -msgstr "查询" +msgstr "查询 A" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:259 #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:284 -#, fuzzy msgid "Query B" -msgstr "查询" +msgstr "查询 B" #: superset/initialization/__init__.py:341 msgid "Query History" @@ -9239,10 +8921,9 @@ msgstr "在新标签中查询" #: superset/errors.py:125 msgid "Query is too complex and takes too long to run." -msgstr "" +msgstr "查询太复杂,运行时间太长。" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:89 -#, fuzzy msgid "Query mode" msgstr "查询模式" @@ -9256,12 +8937,7 @@ msgstr "查询名称" msgid "Query preview" msgstr "查询预览" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:213 -msgid "Query search string" -msgstr "查询搜索字符串" - #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:682 -#, fuzzy msgid "Query was stopped" msgstr "查询被终止。" @@ -9275,9 +8951,8 @@ msgid "RANGE TYPE" msgstr "范围类型" #: superset-frontend/src/components/ReportModal/index.tsx:327 -#, fuzzy msgid "REPORT NAME ERROR" -msgstr "报告名称" +msgstr "报告名称错误" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:251 msgid "RGB Color" @@ -9285,84 +8960,75 @@ msgstr "RGB颜色" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:161 msgid "Radar" -msgstr "" +msgstr "雷达" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:53 -#, fuzzy msgid "Radar Chart" -msgstr "共享图表" +msgstr "雷达图" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:201 msgid "Radar render type, whether to display 'circle' shape." -msgstr "" +msgstr "雷达渲染类型,是否显示圆形" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:121 -#, fuzzy msgid "Radial" -msgstr "空间" +msgstr "径向" #: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:318 -#, fuzzy, python-format +#, python-format msgid "Ran %s" msgstr "持续时间:%s" #: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:35 #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:38 #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:55 -#, fuzzy msgid "Range" -msgstr "管理" +msgstr "范围" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:295 #: superset-frontend/src/filters/components/Range/index.ts:28 -#, fuzzy msgid "Range filter" -msgstr "日期过滤器" +msgstr "范围过滤" #: superset-frontend/src/filters/components/Range/index.ts:29 -#, fuzzy msgid "Range filter plugin using AntD" msgstr "范围过滤器" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:48 msgid "Range labels" -msgstr "" +msgstr "范围标签" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:39 -#, fuzzy msgid "Ranges" msgstr "管理" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/controlPanel.ts:41 msgid "Ranges to highlight with shading" -msgstr "" +msgstr "突出阴影的范围" #: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/index.js:25 #: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:25 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:28 #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:48 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:33 -#, fuzzy msgid "Ranking" -msgstr "正在执行" +msgstr "排名" #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:63 msgid "Ratio" msgstr "比率" #: superset-frontend/packages/superset-ui-chart-controls/src/constants.ts:46 -#, fuzzy msgid "Raw records" msgstr "原始记录" #: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:64 -#, fuzzy msgid "Ready to review filters in this dashboard?" -msgstr "此看板中没有过滤条件。" +msgstr "准备查看此仪表板中的筛选器吗?" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:78 msgid "Rebuild" -msgstr "" +msgstr "重构" #: superset-frontend/src/profile/components/App.tsx:72 msgid "Recent activity" @@ -9399,7 +9065,7 @@ msgstr "收件人之间用 \",\" 或者 \";\" 隔开" #: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:597 msgid "Recommended tags" -msgstr "" +msgstr "推荐标签" #: superset/templates/appbuilder/general/widgets/base_list.html:55 msgid "Record Count" @@ -9407,7 +9073,7 @@ msgstr "记录数" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:222 msgid "Rectangle" -msgstr "" +msgstr "长方形" #: superset/connectors/druid/views.py:330 msgid "" @@ -9432,7 +9098,6 @@ msgid "" msgstr "减少要渲染的X轴标记数。如果为true,x轴将不会溢出,但是标签可能丢失。如果为false,则对列应用最小宽度,宽度可能溢出到水平滚动条中。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:78 -#, fuzzy msgid "Refer to the" msgstr "参考 " @@ -9475,7 +9140,7 @@ msgstr "刷新间隔" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:976 msgid "Refresh the default values" -msgstr "" +msgstr "刷新默认值" #: superset/connectors/druid/views.py:420 msgid "Refreshed metadata from cluster [{}]" @@ -9498,14 +9163,13 @@ msgstr "常规过滤将where子句添加到查询中,以确定用户是否属 #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:43 #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:44 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:44 -#, fuzzy msgid "Relational" msgstr "执行时间" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:32 #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:35 msgid "Relationships between community channels" -msgstr "" +msgstr "社区渠道之间的关系" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:91 msgid "Relative Date/Time" @@ -9513,7 +9177,6 @@ msgstr "相对日期/时间" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:157 #: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:210 -#, fuzzy msgid "Relative period" msgstr "宽限期" @@ -9524,19 +9187,17 @@ msgstr "相对量" #: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:69 msgid "Remind me in 24 hours" -msgstr "" +msgstr "24小时后提醒我" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:779 msgid "Remove" msgstr "删除" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FilterSetUnit.tsx:77 -#, fuzzy msgid "Remove invalid filters" msgstr "删除该行" #: superset-frontend/src/explore/components/controls/CollectionControl/index.jsx:142 -#, fuzzy msgid "Remove item" msgstr "删除该行" @@ -9576,9 +9237,8 @@ msgstr "替换" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:59 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:48 -#, fuzzy msgid "Report" -msgstr "报告" +msgstr "报表" #: superset/reports/commands/exceptions.py:118 msgid "Report Schedule could not be created." @@ -9597,12 +9257,10 @@ msgid "Report Schedule delete failed." msgstr "报表计划删除失败。" #: superset/reports/commands/exceptions.py:142 -#, fuzzy msgid "Report Schedule execution failed when generating a csv." msgstr "生成屏幕截图时报表计划执行失败。" #: superset/reports/commands/exceptions.py:146 -#, fuzzy msgid "Report Schedule execution failed when generating a dataframe." msgstr "生成屏幕截图时报表计划执行失败。" @@ -9643,9 +9301,8 @@ msgid "Report Schedule state not found" msgstr "未找到报表计划状态" #: superset-frontend/src/components/Menu/MenuRight.tsx:225 -#, fuzzy msgid "Report a bug" -msgstr "报告" +msgstr "报告bug" #: superset-frontend/src/views/CRUD/alert/components/AlertStatusIcon.tsx:81 msgid "Report failed" @@ -9677,13 +9334,12 @@ msgid "Reports" msgstr "报告" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:283 -#, fuzzy msgid "Repulsion" msgstr "表达式" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:289 msgid "Repulsion strength between nodes" -msgstr "" +msgstr "节点间的斥力" #: superset/templates/superset/request_access.html:31 msgid "Request Permissions" @@ -9701,7 +9357,7 @@ msgstr "请求不是JSON" #: superset/views/datasource/views.py:71 msgid "Request missing data field." -msgstr "" +msgstr "请求丢失的数据字段。" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:93 #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:97 @@ -9717,16 +9373,14 @@ msgid "Required" msgstr "必填" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:137 -#, fuzzy msgid "Resample" -msgstr "查看样例" +msgstr "重新采样" #: superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.jsx:231 msgid "Reset state" msgstr "状态重置" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/RemovedFilter.tsx:46 -#, fuzzy msgid "Restore Filter" msgstr "还原过滤条件" @@ -9736,11 +9390,11 @@ msgstr "结果" #: superset/sql_lab.py:375 superset/views/core.py:2251 msgid "Results backend is not configured." -msgstr "" +msgstr "后端未配置结果" #: superset/errors.py:116 msgid "Results backend needed for asynchronous queries is not configured." -msgstr "" +msgstr "后端未配置异步查询所需的结果" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:29 msgid "Return to specific datetime." @@ -9757,13 +9411,11 @@ msgid "Rich Tooltip" msgstr "详细提示" #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:149 -#, fuzzy msgid "Rich tooltip" msgstr "详细提示" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:113 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:307 -#, fuzzy msgid "Right" msgstr "高度" @@ -9786,14 +9438,13 @@ msgstr "右轴指标" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:138 msgid "Right to Left" -msgstr "" +msgstr "右到左" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:160 msgid "Right value" -msgstr "" +msgstr "右侧的值" #: superset/dashboards/filters.py:153 -#, fuzzy msgid "Role" msgstr "用户信息" @@ -9814,14 +9465,14 @@ msgid "" "Roles is a list which defines access to the dashboard. Granting a role " "access to a dashboard will bypass dataset level checks. If no roles " "defined then the dashboard is available to all roles." -msgstr "" +msgstr "角色是一个定义对仪表板访问权限的列表。授予角色对仪表板的访问权限将绕过数据集级别的检查。如果未定义角色,则仪表板对所有角色都可用。" #: superset/views/dashboard/mixin.py:66 msgid "" "Roles is a list which defines access to the dashboard. Granting a role " "access to a dashboard will bypass dataset level checks.If no roles " "defined then the dashboard is available to all roles." -msgstr "" +msgstr "角色是一个定义对仪表板访问权限的列表。授予角色对仪表板的访问权限将绕过数据集级别的检查。如果未定义角色,则仪表板对所有角色都可用。" #: superset/views/access_requests.py:45 msgid "Roles to grant" @@ -9858,7 +9509,7 @@ msgstr "根证书" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:84 msgid "Root node id" -msgstr "" +msgstr "根节点id" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:307 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:209 @@ -9868,14 +9519,13 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:225 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:228 msgid "Rotate x axis label" -msgstr "" +msgstr "旋转x轴标签" #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controlPanel.ts:89 msgid "Rotation to apply to words in the cloud" msgstr "应用于词云中的单词的旋转方式" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:271 -#, fuzzy msgid "Round cap" msgstr "国家地图" @@ -9884,7 +9534,6 @@ msgid "Row" msgstr "行" #: superset/initialization/__init__.py:274 -#, fuzzy msgid "Row Level Security" msgstr "行级安全" @@ -9916,7 +9565,7 @@ msgstr "每页行数,0 表示没有分页" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:285 msgid "Rows subtotal position" -msgstr "" +msgstr "行小计的位置" #: superset/views/database/forms.py:193 superset/views/database/forms.py:334 msgid "Rows to Read" @@ -10011,7 +9660,7 @@ msgid "" "You can re-access these queries by using the Save feature before you " "delete the tab.\n" "Note that you will need to close other SQL Lab windows before you do this." -msgstr "" +msgstr "SQL Lab使用浏览器的本地存储来存储查询和结果" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1150 #: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:287 @@ -10036,13 +9685,13 @@ msgstr "SQLAlchemy URI" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:202 msgid "SSL Mode \"require\" will be used." -msgstr "" +msgstr "SSL模式 \"require\" 将被使用。" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:64 #: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:115 #: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:122 msgid "START (INCLUSIVE)" -msgstr "" +msgstr "开始 (包含)" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:81 msgid "SUN" @@ -10057,7 +9706,6 @@ msgid "Sankey Diagram" msgstr "桑基图" #: superset-frontend/plugins/legacy-plugin-chart-sankey-loop/src/index.js:27 -#, fuzzy msgid "Sankey Diagram with Loops" msgstr "桑基图" @@ -10113,7 +9761,7 @@ msgstr "另存为" #: superset-frontend/src/explore/components/SaveModal.tsx:243 msgid "Save as ..." -msgstr "另存为" +msgstr "另存为 ..." #: superset-frontend/src/SqlLab/components/SaveQuery/index.tsx:181 msgid "Save as new" @@ -10144,7 +9792,6 @@ msgid "Save query" msgstr "保存查询" #: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:89 -#, fuzzy msgid "Save the query to enable this feature" msgstr "请保存查询以启用共享" @@ -10158,9 +9805,8 @@ msgid "Saved Queries" msgstr "已保存查询" #: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:226 -#, fuzzy msgid "Saved expressions" -msgstr "SQL表达式" +msgstr "保存表达式" #: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:369 msgid "Saved metric" @@ -10181,19 +9827,18 @@ msgid "Saved query not found." msgstr "保存的查询未找到" #: superset/queries/saved_queries/commands/exceptions.py:40 -#, fuzzy msgid "Saved query parameters are invalid." -msgstr "图表参数无效。" +msgstr "保存的查询参数无效" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:168 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:277 msgid "Scale and Move" -msgstr "" +msgstr "缩放和移动" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:166 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:275 msgid "Scale only" -msgstr "" +msgstr "存在规模" #: superset/initialization/__init__.py:529 msgid "Scan New Datasources" @@ -10203,14 +9848,12 @@ msgstr "扫描新的数据源" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/index.js:43 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:36 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:77 -#, fuzzy msgid "Scatter" -msgstr "状态" +msgstr "散点" #: superset-frontend/plugins/preset-chart-xy/src/ScatterPlot/createMetadata.ts:26 -#, fuzzy msgid "Scatter Plot" -msgstr "Deck.gl - 散点图" +msgstr "散点图" #: superset-frontend/src/SqlLab/components/ScheduleQueryButton/index.tsx:221 #: superset-frontend/src/components/ReportModal/index.tsx:357 @@ -10228,7 +9871,6 @@ msgstr "为看板添加电子邮件报告" #: superset-frontend/src/dashboard/components/Header/index.jsx:423 #: superset-frontend/src/explore/components/ExploreChartHeader/index.jsx:218 -#, fuzzy msgid "Schedule email report" msgstr "为图表配置电子邮件报告" @@ -10251,13 +9893,12 @@ msgid "Scheduled" msgstr "被调度" #: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:117 -#, fuzzy msgid "Scheduled at (UTC)" msgstr "计划时间" #: superset-frontend/src/components/ReportModal/index.tsx:359 msgid "Scheduled reports will be sent to your email as a PNG" -msgstr "" +msgstr "计划的报告将作为PNG发送到您的电子邮件" #: superset-frontend/src/components/DatabaseSelector/index.tsx:295 #: superset-frontend/src/components/Datasource/ChangeDatasourceModal.tsx:220 @@ -10272,7 +9913,6 @@ msgid "Schema" msgstr "模式" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:235 -#, fuzzy msgid "Schema cache timeout" msgstr "图表缓存超时" @@ -10281,16 +9921,14 @@ msgid "Schema, as used only in some databases like Postgres, Redshift and DB2" msgstr "模式,只在一些数据库中使用,比如Postgres、Redshift和DB2" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:369 -#, fuzzy msgid "Schemas allowed for CSV upload" -msgstr "不允许将数据库用于csv上载" +msgstr "模式允许使用CSV上传" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:256 msgid "Scoping" msgstr "范围" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:121 -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:256 #: superset-frontend/src/explore/components/DataTableControl/index.tsx:77 #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:419 #: superset-frontend/src/views/CRUD/annotationlayers/AnnotationLayersList.tsx:305 @@ -10313,12 +9951,10 @@ msgid "Search Metrics & Columns" msgstr "搜索指标和列" #: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:703 -#, fuzzy msgid "Search all charts" msgstr "搜索所有图表" #: superset-frontend/src/components/OmniContainer/index.tsx:102 -#, fuzzy msgid "Search all dashboards" msgstr "搜索所有看板" @@ -10328,7 +9964,6 @@ msgid "Search all filter options" msgstr "搜索所有过滤选项" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:403 -#, fuzzy msgid "Search box" msgstr "搜索框" @@ -10341,14 +9976,12 @@ msgid "Search..." msgstr "搜索..." #: superset/db_engine_specs/base.py:86 -#, fuzzy msgid "Second" msgstr "秒" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:244 -#, fuzzy msgid "Secondary" -msgstr "秒" +msgstr "次要的" #: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:62 msgid "Secondary Metric" @@ -10356,16 +9989,16 @@ msgstr "次计量指标" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:392 msgid "Secondary y-axis format" -msgstr "" +msgstr "次级y轴格式" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:401 msgid "Secondary y-axis title" -msgstr "" +msgstr "二级轴标题" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:63 -#, fuzzy, python-format +#, python-format msgid "Seconds %s" -msgstr "秒" +msgstr "%s 秒" #: superset/views/database/mixins.py:197 msgid "Secure Extra" @@ -10387,9 +10020,9 @@ msgid "Security & Access" msgstr "安全 & 访问" #: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:157 -#, fuzzy, python-format +#, python-format msgid "See all %(tableName)s" -msgstr "查看 - %(table)s" +msgstr "查看全部 - %(tableName)s" #: superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx:155 msgid "See less" @@ -10405,7 +10038,6 @@ msgid "See table schema" msgstr "选择表" #: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:132 -#, fuzzy msgid "Select" msgstr "批量选择" @@ -10417,12 +10049,10 @@ msgid "Select ..." msgstr "选择 ..." #: superset-frontend/src/views/CRUD/alert/components/NotificationMethod.tsx:127 -#, fuzzy msgid "Select Delivery Method" msgstr "添加通知方法" #: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:106 -#, fuzzy msgid "Select Viz Type" msgstr "选择一个可视化类型" @@ -10431,7 +10061,6 @@ msgid "Select a CSV file to be uploaded to a database." msgstr "选择一个CSV文件上传到数据库." #: superset/views/database/forms.py:386 -#, fuzzy msgid "Select a Columnar file to be uploaded to a database." msgstr "选择要上传到数据库的Excel文件。" @@ -10440,12 +10069,10 @@ msgid "Select a Excel file to be uploaded to a database." msgstr "选择要上传到数据库的Excel文件。" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx:133 -#, fuzzy msgid "Select a column" msgstr "反选所有" #: superset-frontend/src/explore/components/SaveModal.tsx:264 -#, fuzzy msgid "Select a dashboard" msgstr "看板" @@ -10454,35 +10081,31 @@ msgid "Select a visualization type" msgstr "选择一个可视化类型" #: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:310 -#, fuzzy, python-format +#, python-format msgid "Select aggregate options" -msgstr "%s 聚合" +msgstr "选择总选项" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:107 msgid "Select any columns for metadata inspection" -msgstr "" +msgstr "选择任意列进行元数据巡检" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:103 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/controlPanel.ts:138 -#, fuzzy msgid "Select charts" msgstr "所有图表" #: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:188 -#, fuzzy msgid "Select color scheme" msgstr "线性颜色方案" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:208 #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSqlTabContent/index.jsx:63 #: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:301 -#, fuzzy msgid "Select column" msgstr "时间列" #: superset-frontend/src/components/DatabaseSelector/index.tsx:268 #: superset-frontend/src/components/DatabaseSelector/index.tsx:275 -#, fuzzy msgid "Select database or type database name" msgstr "选择表或输入表名" @@ -10491,16 +10114,14 @@ msgid "" "Select databases require additional fields to be completed in the " "Advanced tab to successfully connect the database. Learn what " "requirements your databases has " -msgstr "" +msgstr "选择数据库需要在Advanced选项卡中完成额外的字段才能成功连接数据库了解数据库的需求" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:294 #: superset-frontend/src/filters/components/Select/index.ts:28 -#, fuzzy msgid "Select filter" msgstr "选择过滤器" #: superset-frontend/src/filters/components/Select/index.ts:29 -#, fuzzy msgid "Select filter plugin using AntD" msgstr "选择过滤器" @@ -10508,20 +10129,18 @@ msgstr "选择过滤器" msgid "" "Select first item by default (when using this option, default value can’t" " be set)" -msgstr "" +msgstr "默认选择第一项(使用此选项时,不能“设置默认值”)" #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:303 -#, fuzzy, python-format +#,python-format msgid "Select operator" -msgstr "%s 运算符" +msgstr "选择运营商" #: superset-frontend/src/components/ListView/Filters/Select.tsx:84 -#, fuzzy msgid "Select or type a value" -msgstr "选择或者键入数据集名称" +msgstr "选择或键入一个值" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:393 -#, fuzzy msgid "Select owners" msgstr "运行选定的查询" @@ -10530,20 +10149,19 @@ msgid "Select parent filters" msgstr "选择父级过滤" #: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:319 -#, fuzzy, python-format +#, python-format msgid "Select saved metrics" -msgstr "%s 列与计量指标" +msgstr "选择保存指标" #: superset-frontend/src/components/DatabaseSelector/index.tsx:293 #: superset-frontend/src/components/DatabaseSelector/index.tsx:300 -#, fuzzy msgid "Select schema or type schema name" msgstr "选择表或输入表名" #: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:194 -#, fuzzy, python-format +#,python-format msgid "Select scheme" -msgstr "选择一个schema(%s)" +msgstr "选择表" #: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:273 msgid "Select start and end date" @@ -10551,7 +10169,7 @@ msgstr "选择开始和结束时间" #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:265 msgid "Select subject" -msgstr "" +msgstr "选择主题" #: superset-frontend/src/components/TableSelector/index.tsx:298 #: superset-frontend/src/components/TableSelector/index.tsx:308 @@ -10559,27 +10177,25 @@ msgid "Select table or type table name" msgstr "选择表或输入表名" #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:98 -#, fuzzy msgid "Select the number of bins for the histogram" msgstr "选择直方图的容器数" #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:38 #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:48 -#, fuzzy msgid "Select the numeric columns to draw the histogram" msgstr "选择直方图的容器数" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1340 msgid "Send as CSV" -msgstr "" +msgstr "发送为CSV" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1339 msgid "Send as PNG" -msgstr "" +msgstr "发送PNG" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1342 msgid "Send as text" -msgstr "" +msgstr "发送文本" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Line/controlPanel.ts:58 msgid "Send range filter events to other charts" @@ -10592,7 +10208,7 @@ msgstr "九月" #: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:58 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:49 msgid "Sequential" -msgstr "" +msgstr "顺序" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:61 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:385 @@ -10608,7 +10224,6 @@ msgstr "序列高度" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:112 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:113 -#, fuzzy msgid "Series Style" msgstr "线条样式" @@ -10616,7 +10231,7 @@ msgstr "线条样式" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:122 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:125 msgid "Series chart type (line, bar etc)" -msgstr "" +msgstr "系列图表类型(折线,柱状图等)" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:341 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:356 @@ -10625,23 +10240,20 @@ msgid "Series limit" msgstr "序列限制" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:135 -#, fuzzy msgid "Series type" msgstr "图示类型" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:311 -#, fuzzy msgid "Server Page Length" msgstr "页面长度" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:289 -#, fuzzy msgid "Server pagination" -msgstr "Superset注释" +msgstr "服务器分页" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:115 msgid "Service Account" -msgstr "" +msgstr "服务帐户" #: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:286 msgid "Set auto-refresh interval" @@ -10658,7 +10270,7 @@ msgstr "设置" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:133 msgid "Settings for time series" -msgstr "" +msgstr "时间序列设置" #: superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx:229 msgid "Share" @@ -10666,14 +10278,12 @@ msgstr "分享" #: superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx:317 #: superset-frontend/src/explore/components/ExploreActionButtons.tsx:175 -#, fuzzy msgid "Share chart by email" -msgstr "共享图表" +msgstr "通过电子邮件分享图表”" #: superset-frontend/src/dashboard/components/Header/HeaderActionsDropdown/index.jsx:264 -#, fuzzy msgid "Share dashboard by email" -msgstr "分享看板" +msgstr "通过电子邮件分享仪表盘" #: superset-frontend/src/SqlLab/actions/sqlLab.js:1221 msgid "Shared query" @@ -10691,19 +10301,19 @@ msgstr "此层的简述必须是唯一的" msgid "" "Should daily seasonality be applied. An integer value will specify " "Fourier order of seasonality." -msgstr "" +msgstr "一个整数值将指定季节性的傅立叶顺序。" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:109 msgid "" "Should weekly seasonality be applied. An integer value will specify " "Fourier order of seasonality." -msgstr "" +msgstr "一个整数值将指定季节性的傅立叶顺序。" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:90 msgid "" "Should yearly seasonality be applied. An integer value will specify " "Fourier order of seasonality." -msgstr "" +msgstr "一个整数值将指定“季节性的傅立叶顺序。" #: superset/views/annotations.py:59 msgid "Show Annotation" @@ -10774,9 +10384,8 @@ msgid "Show Labels" msgstr "显示标签" #: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:359 -#, fuzzy msgid "Show Less..." -msgstr "显示值" +msgstr "显示. ." #: superset/views/log/__init__.py:22 msgid "Show Log" @@ -10811,7 +10420,6 @@ msgid "Show SQL time column" msgstr "显示SQL时间列" #: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:105 -#, fuzzy msgid "Show SQL time grain dropdown" msgstr "检查包含时间原点的下拉列表" @@ -10825,19 +10433,17 @@ msgstr "显示表" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:85 msgid "Show Timestamp" -msgstr "" +msgstr "显示时间戳" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:97 msgid "Show Trend Line" -msgstr "" +msgstr "显示趋势线" #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:83 -#, fuzzy msgid "Show Upper Labels" msgstr "显示标签" #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:106 -#, fuzzy msgid "Show Value" msgstr "显示值" @@ -10848,26 +10454,23 @@ msgid "Show Values" msgstr "显示值" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx:173 -#, fuzzy msgid "Show all columns" -msgstr "显示列" +msgstr "显示所有列" #: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:326 #: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:359 msgid "Show all..." -msgstr "" +msgstr "显示所有..." #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:206 msgid "Show axis line ticks" -msgstr "" +msgstr "显示轴线刻度" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:119 -#, fuzzy msgid "Show cell bars" msgstr "显示单元格的栏" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:161 -#, fuzzy msgid "Show columns total" msgstr "显示总计" @@ -10879,34 +10482,31 @@ msgstr "将数据点显示为线条上的圆形标记" msgid "" "Show hierarchical relationships of data, with with the value represented " "by area, showing proportion and contribution to the whole." -msgstr "" +msgstr "显示数据的层次关系与表示的值。按面积划分显示其占整体的比例" #: superset-frontend/packages/superset-ui-chart-controls/src/components/InfoTooltipWithTrigger.tsx:50 msgid "Show info tooltip" -msgstr "" +msgstr "显示信息提示" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:736 -#, fuzzy msgid "Show label" msgstr "显示标签" #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/controlPanel.tsx:86 msgid "Show labels when the node has children." -msgstr "" +msgstr "当节点有子节点时显示标签" #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:35 msgid "Show legend" -msgstr "" +msgstr "显示图例" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/ColumnConfigControl.tsx:168 -#, fuzzy msgid "Show less columns" -msgstr "显示SQL时间列" +msgstr "显示较少时间列" #: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:326 -#, fuzzy msgid "Show less..." -msgstr "显示值" +msgstr "显示..." #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:287 msgid "Show percentage" @@ -10914,38 +10514,33 @@ msgstr "显示百分比" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:179 msgid "Show pointer" -msgstr "" +msgstr "显示鼠标" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:245 -#, fuzzy msgid "Show progress" -msgstr "进度" +msgstr "显示进度" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:149 -#, fuzzy msgid "Show rows total" -msgstr "显示总计" +msgstr "显示总计行数" #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:109 -#, fuzzy msgid "Show series values on the chart" msgstr "显示栏上的值" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:218 msgid "Show split lines" -msgstr "" +msgstr "显示分割线" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:297 msgid "Show the value on top of the bar" msgstr "显示栏上的值" #: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:121 -#, fuzzy msgid "Show time column" -msgstr "显示SQL时间列" +msgstr "显示时间列" #: superset-frontend/src/visualizations/FilterBox/controlPanel.jsx:106 -#, fuzzy msgid "Show time grain dropdown" msgstr "显示Druid时间粒度下拉列表" @@ -10953,7 +10548,7 @@ msgstr "显示Druid时间粒度下拉列表" msgid "" "Show total aggregations of selected metrics. Note that row limit does not" " apply to the result." -msgstr "" +msgstr "显示所选指标的总聚合。注意行限制并不应用于结果" #: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:87 #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:349 @@ -10965,33 +10560,33 @@ msgid "" "Showcases a single metric front-and-center. Big number is best used to " "call attention to a KPI or the one thing you want your audience to focus " "on." -msgstr "" +msgstr "显示单个公制正面和中间。大数字最好用来唤起人们对KPI或你希望观众关注的一件事的关注" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/index.ts:30 msgid "" "Showcases a single number accompanied by a simple line chart, to call " "attention to an important metric along with its change over time or other" " dimension." -msgstr "" +msgstr "显示一个数字和一个简单的折线图,以提醒注意一个重要指标及其随时间或其他维度的变化" #: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:49 msgid "" "Showcases how a metric changes as the funnel progresses. This classic " "chart is useful for visualizing drop-off between stages in a pipeline or " "lifecycle." -msgstr "" +msgstr "显示指标如何随着漏斗的进展而变化。此经典图表对于可视化管道或生命周期中各阶段之间的下降非常有用。" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/index.js:28 msgid "" "Showcases the flow or link between categories using thickness of chords. " "The value and corresponding thickness can be different for each side." -msgstr "" +msgstr "使用弦的厚度显示类别之间的流或链接。每一侧的值和相应厚度可能不同。" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bullet/index.js:27 msgid "" "Showcases the progress of a single metric against a given target. The " "higher the fill, the closer the metric is to the target." -msgstr "" +msgstr "显示单个指标相对于给定目标的进度。填充越高,度量越接近目标" #: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:305 #: superset-frontend/src/explore/components/DatasourcePanel/index.tsx:338 @@ -11000,7 +10595,6 @@ msgid "Showing %s of %s" msgstr "显示 %s个 总计 %s个" #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:152 -#, fuzzy msgid "Shows a list of all series available at that point in time" msgstr "详细提示显示了该时间点的所有序列的列表。" @@ -11010,11 +10604,11 @@ msgid "" "smaller rectangles with areas proportional to their value or contribution" " to the whole. Those rectangles may also, in turn, be further segmented " "hierarchically." -msgstr "" +msgstr "显示数据集的组成,方法是将给定矩形分割为较小的矩形,其面积与矩形的值或对整体的贡献成比例。这些矩形也可以按层次进一步分割" #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:72 msgid "Significance Level" -msgstr "" +msgstr "显著性" #: superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx:262 #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopover/index.jsx:201 @@ -11025,36 +10619,32 @@ msgstr "简单配置" #: superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.jsx:390 msgid "Simple ad-hoc metrics are not enabled for this dataset" -msgstr "" +msgstr "此数据集没有启用简单的特别度量" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:186 -#, fuzzy msgid "Single" msgstr "我的编辑" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:45 #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:46 -#, fuzzy msgid "Single Metric" msgstr "按指标过滤" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1234 -#, fuzzy msgid "Single Value" msgstr "空值" #: superset-frontend/src/filters/components/Range/controlPanel.ts:65 -#, fuzzy msgid "Single value" msgstr "空值" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1251 msgid "Single value type" -msgstr "" +msgstr "单值类型" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:261 msgid "Size of edge symbols" -msgstr "" +msgstr "边缘符号的大小" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:230 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:168 @@ -11064,11 +10654,11 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:184 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:187 msgid "Size of marker. Also applies to forecast observations." -msgstr "" +msgstr "标记的大小也适用于预测观察。”" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:34 msgid "Sizes of vehicles" -msgstr "" +msgstr "工具尺寸" #: superset/views/database/forms.py:199 msgid "Skip Blank Lines" @@ -11105,12 +10695,10 @@ msgid "Small" msgstr "小" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:153 -#, fuzzy msgid "Small number format" msgstr "数字格式化" #: superset/commands/exceptions.py:112 -#, fuzzy msgid "Some roles do not exist" msgstr "看板" @@ -11131,16 +10719,16 @@ msgstr "抱歉,发生错误" #: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:65 #: superset-frontend/src/explore/components/ExploreActionButtons.tsx:126 msgid "Sorry, something went wrong. Try again later." -msgstr "" +msgstr "抱歉,出了点问题。请稍后再试。" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/EventFlow.tsx:50 msgid "Sorry, there appears to be no data" -msgstr "" +msgstr "抱歉,似乎没有数据" #: superset-frontend/src/dashboard/actions/dashboardState.js:238 -#, fuzzy, python-format +#, python-format msgid "Sorry, there was an error saving this dashboard: %s" -msgstr "抱歉,这个看板在获取图表时发生错误:" +msgstr "抱歉,这个看板在获取图表时发生错误:%s" #: superset-frontend/src/dashboard/components/menu/ShareMenuItems/index.tsx:55 #: superset-frontend/src/explore/components/ExploreActionButtons.tsx:115 @@ -11156,7 +10744,6 @@ msgstr "抱歉,您的浏览器不支持复制操作。使用 Ctrl / Cmd + C! #: superset-frontend/src/components/ListView/CardSortSelect.tsx:82 #: superset-frontend/src/components/ListView/CardSortSelect.tsx:83 -#, fuzzy msgid "Sort" msgstr "排序:" @@ -11184,7 +10771,6 @@ msgid "Sort Descending" msgstr "降序" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1198 -#, fuzzy msgid "Sort Metric" msgstr "排序指标" @@ -11237,7 +10823,6 @@ msgid "Sort columns alphabetically" msgstr "对列按字母顺序进行排列" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:257 -#, fuzzy msgid "Sort columns by" msgstr "对列按字母顺序进行排列" @@ -11249,7 +10834,6 @@ msgid "Sort descending" msgstr "降序" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1167 -#, fuzzy msgid "Sort filter values" msgstr "可被过滤" @@ -11260,12 +10844,10 @@ msgid "Sort metric" msgstr "排序指标" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:229 -#, fuzzy msgid "Sort rows by" msgstr "排序 " #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:1181 -#, fuzzy msgid "Sort type" msgstr "图表类型" @@ -11286,7 +10868,6 @@ msgid "Source SQL" msgstr "源 SQL" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:73 -#, fuzzy msgid "Source category" msgstr "数据库名称" @@ -11311,23 +10892,21 @@ msgstr "将重复列指定为“x.0,x.1”。" msgid "" "Specify the database version. This should be used with Presto in order to" " enable query cost estimation." -msgstr "" +msgstr "指定数据库版本。这应该与Presto一起使用,以便启用查询成本估算。" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:230 -#, fuzzy msgid "Split number" msgstr "数字" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:156 #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:117 -#, fuzzy msgid "Stack series" msgstr "已保存查询" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:159 #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:120 msgid "Stack series on top of each other" -msgstr "" +msgstr "叠加系列" #: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:37 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:51 @@ -11336,9 +10915,8 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:84 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:83 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:68 -#, fuzzy msgid "Stacked" -msgstr "开始时间" +msgstr "堆叠" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:305 msgid "Stacked Bars" @@ -11349,12 +10927,10 @@ msgid "Stacked Style" msgstr "堆积样式" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:37 -#, fuzzy msgid "Stacked style" msgstr "堆积样式" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:88 -#, fuzzy msgid "Standard time series" msgstr "时间序列" @@ -11364,34 +10940,31 @@ msgid "Start" msgstr "开始" #: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:79 -#, fuzzy msgid "Start Review" msgstr "数据预览" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:110 -#, fuzzy msgid "Start angle" msgstr "开始时间" #: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:125 -#, fuzzy msgid "Start at (UTC)" -msgstr "开始/从" +msgstr "由UTC开始" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/AdvancedFrame.tsx:66 #: superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx:117 msgid "Start date included in time range" -msgstr "" +msgstr "开始日期包含在时间范围内" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:109 msgid "Start y-axis at 0" -msgstr "" +msgstr "y轴从0开始" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:112 msgid "" "Start y-axis at zero. Uncheck to start y-axis at minimum value in the " "data." -msgstr "" +msgstr "从零开始y轴。取消选中以从数据中的最小值开始y轴 " #: superset-frontend/src/views/CRUD/alert/ExecutionLog.tsx:94 #: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:348 @@ -11401,7 +10974,7 @@ msgstr "状态" #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:30 #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/index.ts:55 msgid "Statistical" -msgstr "" +msgstr "统计" #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:399 #: superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx:302 @@ -11410,7 +10983,6 @@ msgid "Status" msgstr "状态" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:112 -#, fuzzy msgid "Step type" msgstr "数据类型" @@ -11433,10 +11005,9 @@ msgstr "已停止不安全的数据库连接" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:268 msgid "Strength to pull the graph toward center" -msgstr "" +msgstr "将图形拉向中心" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:36 -#, fuzzy msgid "Stretched style" msgstr "堆积样式" @@ -11447,7 +11018,7 @@ msgstr "用于sheet名称的字符串(默认为第一个sheet)。" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/index.ts:45 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:45 msgid "Structural" -msgstr "" +msgstr "结构" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:621 msgid "Style" @@ -11455,7 +11026,7 @@ msgstr "风格" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:272 msgid "Style the ends of the progress bar with a round cap" -msgstr "" +msgstr "用圆帽设置进度条末端的样式" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:56 msgid "Subdomain" @@ -11477,11 +11048,11 @@ msgstr "成功" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:62 msgid "Suffix to apply after the percentage display" -msgstr "" +msgstr "百分比显示后要应用的后缀" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:98 msgid "Sum of values over specified period" -msgstr "" +msgstr "指定期间内的值总和" #: superset/viz.py:1856 msgid "Sunburst" @@ -11496,7 +11067,6 @@ msgid "Sunday" msgstr "星期日" #: superset-frontend/src/explore/components/ExploreActionButtons.tsx:121 -#, fuzzy msgid "Superset Chart" msgstr "选择图表" @@ -11510,30 +11080,26 @@ msgid "Superset dashboard" msgstr "看板" #: superset/errors.py:105 -#, fuzzy msgid "Superset encountered an error while running a command." msgstr "警报在执行查询时发现错误。" #: superset/errors.py:106 -#, fuzzy msgid "Superset encountered an unexpected error." msgstr "报告计划意外错误。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:670 -#, fuzzy msgid "Supported databases" msgstr "已支持数据库" #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:34 msgid "Survey Responses" -msgstr "" +msgstr "调查结果" #: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/controlPanel.ts:112 msgid "Swap Groups and Columns" msgstr "交换组和列" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:175 -#, fuzzy msgid "Swap rows and columns" msgstr "交换组和列" @@ -11542,21 +11108,19 @@ msgid "" "Swiss army knife for visualizing time series data. Choose between step, " "line, scatter, and bar charts. This viz type has many customization " "options as well." -msgstr "" +msgstr "用于可视化时间序列数据。在步进图、折线图、散点图和条形图之间进行选择,也有许多自定义选项" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:210 -#, fuzzy msgid "Symbol" -msgstr "螺栓" +msgstr "符号" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:125 msgid "Symbol of two ends of edge line" -msgstr "" +msgstr "边线两端的符号" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:255 -#, fuzzy msgid "Symbol size" -msgstr "气泡尺寸" +msgstr "符号的大小" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1223 msgid "Sync columns from source" @@ -11586,12 +11150,12 @@ msgstr "星期二" #: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:218 #: superset-frontend/src/views/CRUD/data/query/QueryPreviewModal.tsx:145 msgid "Tab name" -msgstr "tab名" +msgstr "选项卡名字" #: superset-frontend/src/dashboard/util/newComponentFactory.js:56 #: superset-frontend/src/dashboard/util/newComponentFactory.js:57 msgid "Tab title" -msgstr "" +msgstr "选项卡标题" #: superset-frontend/plugins/legacy-plugin-chart-pivot-table/src/index.js:25 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:50 @@ -11637,7 +11201,6 @@ msgid "" msgstr "找不到 [%{table}s] 表,请仔细检查您的数据库连接、Schema 和 表名" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:257 -#, fuzzy msgid "Table cache timeout" msgstr "图表缓存超时" @@ -11649,7 +11212,7 @@ msgstr "表名未定义" msgid "" "Table that visualizes paired t-tests, which are used to understand " "statistical differences between groups." -msgstr "" +msgstr "可视化检验的表格,用于了解各组之间的统计差异" #: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:269 #: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:324 @@ -11659,45 +11222,41 @@ msgstr "数据表" #: superset-frontend/src/dashboard/components/gridComponents/new/NewTabs.jsx:31 msgid "Tabs" -msgstr "" +msgstr "选项卡" #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/index.js:30 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:55 #: superset-frontend/plugins/plugin-chart-table/src/index.ts:50 #: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:34 msgid "Tabular" -msgstr "" +msgstr "表格" #: superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeGallery.tsx:607 -#, fuzzy msgid "Tags" -msgstr "状态" +msgstr "标签" #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/index.js:29 msgid "" "Take your data points, and group them into \"bins\" to see where the " "densest areas of information lie" -msgstr "" +msgstr "获取数据点,并将其分组,以查看信息最密集的区域" #: superset-frontend/plugins/legacy-plugin-chart-chord/src/controlPanel.ts:66 #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:62 -#, fuzzy msgid "Target" -msgstr "开始" +msgstr "目标" #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/controlPanel.ts:67 msgid "Target aspect ratio for treemap tiles." msgstr "树形图中图块的目标高宽比。" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:86 -#, fuzzy msgid "Target category" -msgstr "开始/从" +msgstr "目标类别" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:176 -#, fuzzy msgid "Target value" -msgstr "条形栏的值" +msgstr "目标值" #: superset/views/css_templates.py:44 msgid "Template Name" @@ -11718,14 +11277,14 @@ msgstr "模板链接,可以包含{{度量}}或来自控件的其他值。" #: superset/models/sql_types/base.py:54 #, python-format msgid "Temporal expression not supported for type: %(col_type)s" -msgstr "" +msgstr "%(col_type)s不支持时间表达式" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:307 msgid "" "Terminate running queries when browser window closed or navigated to " "another page. Available for Presto, Hive, MySQL, Postgres and Snowflake " "databases." -msgstr "" +msgstr "当浏览器窗口关闭或导航到其他页面时,终止正在运行的查询。适用于Presto、Hive、MySQL、Postgres和Snowflake数据库" #: superset/templates/superset/models/database/macros.html:22 msgid "Test Connection" @@ -11736,17 +11295,16 @@ msgid "Test connection" msgstr "测试连接" #: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:35 -#, fuzzy msgid "Text" -msgstr "之后" +msgstr "文本" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:105 msgid "Text align" -msgstr "" +msgstr "文本对齐" #: superset-frontend/src/components/ReportModal/index.tsx:289 msgid "Text embedded in email" -msgstr "" +msgstr "邮件中嵌入的文本" #: superset/views/dashboard/mixin.py:53 msgid "" @@ -11755,7 +11313,6 @@ msgid "" msgstr "可以在这里或者在看板视图修改单个看板的CSS样式" #: superset/errors.py:118 -#, fuzzy msgid "" "The CTAS (create table as select) doesn't have a SELECT statement at the " "end. Please make sure your query has a SELECT as its last statement. " @@ -11772,32 +11329,29 @@ msgstr "JSON指标或处理聚合定义。" msgid "" "The URL could not be identified. Please check for typos and make sure " "that \"Type of google sheet allowed\" selection matches the input" -msgstr "" +msgstr "无法识别URL。请检查拼写错误,并确保允许的谷歌工作表类型选择与输入匹配" #: superset/views/core.py:354 msgid "The access requests seem to have been deleted" msgstr "访问请求已被删除" #: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:168 -#, fuzzy msgid "The annotation has been saved" -msgstr "该看板已成功保存。" +msgstr "注释已保存。" #: superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx:152 -#, fuzzy msgid "The annotation has been updated" -msgstr "注释无法更新。" +msgstr "注释已更新。" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:74 msgid "" "The category of source nodes used to assign colors. If a node is " "associated with more than one category, only the first will be used." -msgstr "" +msgstr "用于分配颜色的源节点类别。如果一个节点与多个类别关联,则只使用第一个类别" #: superset/common/query_context_processor.py:449 -#, fuzzy msgid "The chart does not exist" -msgstr "图表没有找到" +msgstr "图表不存在" #: superset-frontend/plugins/plugin-chart-echarts/src/Pie/index.ts:54 msgid "" @@ -11809,6 +11363,8 @@ msgid "" " relative proportion is important, consider using a bar or other chart " "type instead." msgstr "" +"经典的,很好地展示了每个投资者获得了多少公司,“有多少人关注你的博客,或者预算的哪一部分流向了军事工业综合体" +"饼状图很难精确解释。如果“相对比例”的清晰性很重要,可以考虑使用柱状图或其他图表来代替。" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:261 msgid "The color for points and clusters in RGB" @@ -11824,11 +11380,12 @@ msgid "" "The color scheme is determined by the related dashboard.\n" " Edit the color scheme in the dashboard properties." msgstr "" +"配色方案由相关的仪表盘决定。" +"在仪表板属性中编辑配色方案" #: superset/errors.py:99 -#, fuzzy msgid "The column was deleted or renamed in the database." -msgstr "Issue 1004 - 该列已在数据库中删除或重命名。" +msgstr "该列已在数据库中删除或重命名。" #: superset-frontend/plugins/legacy-plugin-chart-world-map/src/controlPanel.ts:47 msgid "" @@ -11852,7 +11409,7 @@ msgid "" msgstr "由数据库推断的数据类型。在某些情况下,可能需要为表达式定义的列手工输入一个类型。在大多数情况下,用户不需要修改这个数据类型。" #: superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx:439 -#, fuzzy, python-format +#, python-format msgid "" "The database %s is linked to %s charts that appear on %s dashboards and " "users have %s SQL Lab tabs using this database open. Are you sure you " @@ -11861,31 +11418,27 @@ msgstr "数据库 %s 已经关联了 %s 图表和 %s 看板。确定要继续吗 #: superset/errors.py:126 msgid "The database is currently running too many queries." -msgstr "" +msgstr "数据库当前运行的查询太多" #: superset/errors.py:93 -#, fuzzy msgid "The database is under an unusual load." -msgstr "Issue 1001 - 数据库负载异常。" +msgstr "数据库负载异常。" #: superset/sqllab/command.py:149 msgid "" "The database referenced in this query was not found. Please contact an " "administrator for further assistance or try again." -msgstr "" +msgstr "找不到此查询中引用的数据库。请与管理员联系以获得进一步帮助,或重试。" #: superset/errors.py:94 -#, fuzzy msgid "The database returned an unexpected error." -msgstr "Issue 1002 - 数据库返回意外错误。" +msgstr "数据库返回意外错误。" #: superset/errors.py:138 -#, fuzzy msgid "The database was deleted." msgstr "数据集已保存" #: superset/views/core.py:2085 superset/views/core.py:2155 -#, fuzzy msgid "The database was not found." msgstr "数据库没有找到" @@ -11898,7 +11451,6 @@ msgid "" msgstr "数据集 %s 已经链接到 %s 图表和 %s 看板内。确定要继续吗?删除数据集将破坏这些对象。" #: superset-frontend/src/chart/Chart.jsx:73 superset/views/utils.py:268 -#, fuzzy msgid "The dataset associated with this chart no longer exists" msgstr "这个图表所链接的数据集可能被删除了。" @@ -11925,9 +11477,8 @@ msgid "The datasource couldn't be loaded" msgstr "这个查询无法被加载" #: superset/errors.py:92 -#, fuzzy msgid "The datasource is too large to query." -msgstr "Issue 1000 - 数据源太大,无法进行查询。" +msgstr "数据源太大,无法进行查询。" #: superset-frontend/src/explore/components/PropertiesModal/index.tsx:247 msgid "" @@ -11944,7 +11495,6 @@ msgid "The duration of time in seconds before the cache is invalidated" msgstr "缓存失效前的持续时间(以秒为单位)" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:474 -#, fuzzy msgid "" "The engine_params object gets unpacked into the sqlalchemy.create_engine " "call." @@ -11957,7 +11507,7 @@ msgstr "" msgid "" "The following entries in `series_columns` are missing in `columns`: " "%(columns)s. " -msgstr "" +msgstr " `series_columns`中的下列条目在 `columns` 中缺失: %(columns)s. " #: superset/connectors/sqla/views.py:612 #, python-format @@ -11977,7 +11527,7 @@ msgstr "下表更新列元数据:%(tables)s" #: superset/db_engine_specs/mysql.py:134 #, python-format msgid "The host \"%(hostname)s\" might be down and can't be reached." -msgstr "" +msgstr "主机 \"%(hostname)s\" 可能已关闭,无法连接到" #: superset/db_engine_specs/mssql.py:92 #: superset/db_engine_specs/postgres.py:137 @@ -11987,15 +11537,15 @@ msgstr "" msgid "" "The host \"%(hostname)s\" might be down, and can't be reached on port " "%(port)s." -msgstr "" +msgstr "主机 \"%(hostname)s\" 可能已关闭,无法通过端口访问 " #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:98 msgid "The host is invalid. Please verify that this field is entered correctly." -msgstr "" +msgstr "主机无效。请检查此字段是否输入正确。" #: superset/errors.py:104 msgid "The host might be down, and can't be reached on the provided port." -msgstr "" +msgstr "主机可能宕机了,无法在所提供的端口上连接到它" #: superset/db_engine_specs/mssql.py:82 #: superset/db_engine_specs/postgres.py:127 @@ -12003,11 +11553,11 @@ msgstr "" #: superset/db_engine_specs/redshift.py:68 #, python-format msgid "The hostname \"%(hostname)s\" cannot be resolved." -msgstr "" +msgstr "无法解析主机名 \"%(hostname)s\" " #: superset/errors.py:102 msgid "The hostname provided can't be resolved." -msgstr "" +msgstr "提供的主机名无法解析。" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:60 #: superset-frontend/src/explore/controlPanels/sections.tsx:44 @@ -12029,17 +11579,17 @@ msgstr "与此表关联的图表列表。通过更改此数据源,您可以更 #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:130 msgid "The maximum number of events to return, equivalent to the number of rows" -msgstr "" +msgstr "返回的最大事件数,相当于行数" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:179 msgid "" "The maximum number of subdivisions of each group; lower values are pruned" " first" -msgstr "" +msgstr "每组的最大细分数;较低的值首先被删除" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/controlPanel.tsx:49 msgid "The maximum value of metrics. It is an optional configuration" -msgstr "" +msgstr "度量的最大值。这是一个可选配置" #: superset/databases/schemas.py:206 #, python-format @@ -12059,7 +11609,7 @@ msgstr "额外字段中的元数据参数配置不正确。键 %{key}s 无效。 msgid "" "The metadata_params object gets unpacked into the sqlalchemy.MetaData " "call." -msgstr "" +msgstr "metadata_params对象被解压缩到sqlalchemy.metadata调用中。" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:75 #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:292 @@ -12085,7 +11635,7 @@ msgstr "色彩 \"Steps\" 数字" msgid "" "The number of hours, negative or positive, to shift the time column. This" " can be used to move UTC time to local time." -msgstr "" +msgstr "用于移动时间列的小时数(负数或正数)。这可用于将UTC时间移动到本地时间" #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:583 #, python-format @@ -12093,7 +11643,7 @@ msgid "" "The number of results displayed is limited to %(rows)d by the " "configuration DISPLAY_MAX_ROWS. Please add additional limits/filters or " "download to csv to see more rows up to the %(limit)d limit." -msgstr "" +msgstr "显示的结果数由配置DISPLAY_MAX_rows限制为 %(rows)d 。请添加其他限制/筛选器或下载到csv以查看更多行数,限制为 %(limit)d " #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:589 #, python-format @@ -12101,29 +11651,29 @@ msgid "" "The number of results displayed is limited to %(rows)d. Please add " "additional limits/filters, download to csv, or contact an admin to see " "more rows up to the %(limit)d limit." -msgstr "" +msgstr "显示的结果数限制为 %(rows)d。请添加其他筛选器,下载到csv,或与管理员联系以查看 %(limit)d 的更多行”" #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:615 #, python-format msgid "The number of rows displayed is limited to %(rows)d by the limit dropdown." -msgstr "" +msgstr "显示的行数通过限制下拉框限制为 %(rows)d 。" #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:603 #, python-format msgid "The number of rows displayed is limited to %(rows)d by the query" -msgstr "" +msgstr "查询将显示的行数限制为 %(rows)d " #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:624 #, python-format msgid "" "The number of rows displayed is limited to %(rows)d by the query and " "limit dropdown." -msgstr "" +msgstr "查询和限制下拉列表将显示的行数限制为 %(rows)d" #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:644 #, python-format msgid "The number of rows displayed is limited to %s by the dropdown." -msgstr "" +msgstr "通过下拉菜单显示的行数限制为 %s " #: superset-frontend/packages/superset-ui-chart-controls/src/sections/sections.tsx:69 #: superset-frontend/src/explore/controlPanels/sections.tsx:53 @@ -12131,7 +11681,6 @@ msgid "The number of seconds before expiring the cache" msgstr "终止缓存前的时间(秒)" #: superset/errors.py:128 -#, fuzzy msgid "The object does not exist in the given database." msgstr "源数据库中存在的表的名称" @@ -12144,11 +11693,11 @@ msgstr[0] "查询中的以下参数未定义:%(parameters)s 。" #: superset/db_engine_specs/postgres.py:117 #, python-format msgid "The password provided for username \"%(username)s\" is incorrect." -msgstr "" +msgstr "用户名 \"%(username)s\" 提供的密码不正确。" #: superset/errors.py:108 msgid "The password provided when connecting to a database is not valid." -msgstr "" +msgstr "连接数据库时提供的密码无效。" #: superset-frontend/src/views/CRUD/chart/ChartList.tsx:65 msgid "" @@ -12184,7 +11733,6 @@ msgstr "" "部分不在导出文件中,如果需要,应在导入后手动添加。" #: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:56 -#, fuzzy msgid "" "The passwords for the databases below are needed in order to import them " "together with the saved queries. Please note that the \"Secure Extra\" " @@ -12215,7 +11763,7 @@ msgid "" " \"Pandas\" offset alias.\n" " Click on the info bubble for more details on accepted " "\"freq\" expressions." -msgstr "" +msgstr "旋转时间的周期性。" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:118 msgid "The pixel radius" @@ -12229,17 +11777,14 @@ msgid "" msgstr "指向物理表(或视图)的指针。请记住,图表将与此逻辑表相关联,并且此逻辑表指向此处引用的物理表。" #: superset/errors.py:103 -#, fuzzy msgid "The port is closed." msgstr "报告失败" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:108 -#, fuzzy msgid "The port must be a whole number less than or equal to 65535." msgstr "`行限制` 必须大于或等于1" #: superset/errors.py:136 -#, fuzzy msgid "The port number is invalid." msgstr "数据库参数无效" @@ -12249,21 +11794,23 @@ msgstr "主计量指标用于定义弧段大小。" #: superset/views/core.py:2330 msgid "The provided `rows` argument is not a valid integer." -msgstr "" +msgstr "提供的 `rows` 参数不是有效整数。" #: superset/errors.py:131 msgid "The query associated with the results was deleted." -msgstr "" +msgstr "删除与结果关联的查询。" #: superset/views/core.py:2280 msgid "" -"The query associated with these results could not be find. You need to " +"The query associated with these results could not be found. You need to " "re-run the original query." msgstr "" +"找不到与这些结果相关联的查询。你需要" +"重新运行查询" #: superset/sqllab/query_render.py:113 msgid "The query contains one or more malformed template parameters." -msgstr "" +msgstr "该查询包含一个或多个格式不正确的模板参数。" #: superset-frontend/src/SqlLab/actions/sqlLab.js:106 msgid "The query couldn't be loaded" @@ -12271,7 +11818,7 @@ msgstr "这个查询无法被加载" #: superset/errors.py:129 msgid "The query has a syntax error." -msgstr "" +msgstr "查询有语法错误。" #: superset-frontend/src/SqlLab/components/ResultSet/index.tsx:771 msgid "The query returned no data" @@ -12282,7 +11829,7 @@ msgstr "查询无结果" msgid "" "The query was killed after %(sqllab_timeout)s seconds. It might be too " "complex, or the database might be under heavy load." -msgstr "" +msgstr "查询在 %(sqllab_timeout)s 秒后被终止。它可能太复杂,或者数据库可能负载过重。" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:87 msgid "" @@ -12299,19 +11846,20 @@ msgid "" msgstr "单个点的半径(不在簇中的点)。一个数值列或“AUTO”,它根据最大的聚类来缩放点。" #: superset-frontend/src/reports/actions/reports.js:111 -#, fuzzy msgid "The report has been created" msgstr "数据集已保存" #: superset/errors.py:130 msgid "The results backend no longer has the data from the query." -msgstr "" +msgstr "结果后端不再拥有来自查询的数据。" #: superset/errors.py:132 msgid "" "The results stored in the backend were stored in a different format, and " "no longer can be deserialized." msgstr "" +"后端存储的结果以不同的格式存储,而且" +"不再可以反序列化" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:233 #: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:103 @@ -12320,23 +11868,22 @@ msgid "The rich tooltip shows a list of all series for that point in time" msgstr "详细提示显示了该时间点的所有序列的列表。" #: superset/db_engine_specs/bigquery.py:171 -#, fuzzy, python-format +#, python-format msgid "" "The schema \"%(schema)s\" does not exist. A valid schema must be used to " "run this query." msgstr "表 \"%(schema)s\" 不存在。必须使用有效的表来运行此查询。" #: superset/db_engine_specs/presto.py:187 -#, fuzzy, python-format +#, python-format msgid "" "The schema \"%(schema_name)s\" does not exist. A valid schema must be " "used to run this query." msgstr "表 \"%(schema_name)s\" 不存在。必须使用有效的表来运行此查询。" #: superset/errors.py:111 -#, fuzzy msgid "The schema was deleted or renamed in the database." -msgstr "Issue 1004 - 该列已在数据库中删除或重命名。" +msgstr "该列已在数据库中删除或重命名。" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:92 msgid "The size of the square cell, in pixels" @@ -12344,14 +11891,14 @@ msgstr "平方单元的大小,以像素为单位" #: superset/errors.py:114 msgid "The submitted payload has the incorrect format." -msgstr "" +msgstr "提交的有效载荷格式不正确" #: superset/errors.py:115 msgid "The submitted payload has the incorrect schema." -msgstr "" +msgstr "提交的有效负载的模式不正确。" #: superset/db_engine_specs/bigquery.py:158 -#, fuzzy, python-format +#, python-format msgid "" "The table \"%(table)s\" does not exist. A valid table must be used to run" " this query." @@ -12371,7 +11918,6 @@ msgid "" msgstr "表被创建。作为这两个阶段配置过程的一部分,您现在应该单击新表的编辑按钮来配置它。" #: superset/errors.py:100 -#, fuzzy msgid "The table was deleted or renamed in the database." msgstr "Issue 1005 - 该表已在数据库中删除或重命名。" @@ -12438,13 +11984,13 @@ msgid "The user seems to have been deleted" msgstr "用户已经被删除" #: superset/db_engine_specs/postgres.py:112 -#, fuzzy, python-format +#, python-format msgid "The username \"%(username)s\" does not exist." -msgstr "指标 '%(metric)s' 不存在" +msgstr "指标 '%(username)s' 不存在" #: superset/errors.py:107 msgid "The username provided when connecting to a database is not valid." -msgstr "" +msgstr "连接到数据库时提供的用户名无效。" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:206 #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:89 @@ -12474,12 +12020,10 @@ msgid "There are no filters in this dashboard." msgstr "此看板中没有过滤条件。" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/Footer/Footer.tsx:45 -#, fuzzy msgid "There are unsaved changes." msgstr "您有一些未保存的修改。" #: superset/errors.py:95 -#, fuzzy msgid "" "There is a syntax error in the SQL query. Perhaps there was a misspelling" " or a typo." @@ -12498,7 +12042,7 @@ msgid "" msgstr "此组件没有足够的空间。请尝试减小其宽度,或增加目标宽度。" #: superset-frontend/src/views/CRUD/hooks.ts:522 -#, fuzzy, python-format +#, python-format msgid "There was an error fetching the favorite status: %s" msgstr "获取此看板的收藏夹状态时出现问题。" @@ -12507,19 +12051,17 @@ msgid "There was an error fetching your recent activity:" msgstr "获取您最近的活动时出错:" #: superset-frontend/src/components/DatabaseSelector/index.tsx:230 -#, fuzzy msgid "There was an error loading the schemas" msgstr "抱歉,这个看板在获取图表时发生错误:" #: superset-frontend/src/components/TableSelector/index.tsx:218 -#, fuzzy msgid "There was an error loading the tables" msgstr "您的请求有错误" #: superset-frontend/src/views/CRUD/hooks.ts:543 -#, fuzzy, python-format +#, python-format msgid "There was an error saving the favorite status: %s" -msgstr "获取此看板的收藏夹状态时出现问题。" +msgstr "获取此看板的收藏夹状态时出现问题: %s" #: superset-frontend/src/SqlLab/components/ShareSqlLabQuery/index.tsx:61 msgid "There was an error with your request" @@ -12587,7 +12129,6 @@ msgid "There was an issue favoriting this dashboard." msgstr "收藏看板时候出现问题。" #: superset-frontend/src/reports/actions/reports.js:68 -#, fuzzy msgid "There was an issue fetching reports attached to this dashboard." msgstr "获取此看板的收藏夹状态时出现问题。" @@ -12596,7 +12137,7 @@ msgid "There was an issue fetching the favorite status of this dashboard." msgstr "获取此看板的收藏夹状态时出现问题。" #: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:195 -#, fuzzy, python-format +#, python-format msgid "There was an issue fetching your recent activity: %s" msgstr "获取您最近的活动时出错:" @@ -12611,17 +12152,17 @@ msgid "There was an issue previewing the selected query. %s" msgstr "预览所选查询时出现问题。%s" #: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:222 -#, fuzzy, python-format +#, python-format msgid "There was an issues fetching your chart: %s" msgstr "删除时出现问题:%s" #: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:211 -#, fuzzy, python-format +#, python-format msgid "There was an issues fetching your dashboards: %s" msgstr "删除所选仪表板时出现问题:" #: superset-frontend/src/views/CRUD/welcome/Welcome.tsx:233 -#, fuzzy, python-format +#, python-format msgid "There was an issues fetching your saved queries: %s" msgstr "删除所选查询时出现问题:%s" @@ -12678,7 +12219,7 @@ msgstr "此操作将永久删除模板。" msgid "" "This can be either an IP address (e.g. 127.0.0.1) or a domain name (e.g. " "mydatabase.com)." -msgstr "" +msgstr "这可以是一个IP地址(例如127.0.0.1)或一个域名(例如127.0.0.1)" #: superset-frontend/src/dashboard/actions/dashboardLayout.js:258 msgid "This chart has been moved to a different filter scope." @@ -12686,22 +12227,21 @@ msgstr "此图表已移至其他过滤器范围内。" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/utils.ts:56 msgid "This chart might be incompatible with the filter (datasets don't match)" -msgstr "" +msgstr "此图表可能与过滤器不兼容(数据集不匹配)" #: superset-frontend/src/explore/components/controls/ColorSchemeControl/index.jsx:127 msgid "" "This color scheme is being overriden by custom label colors.\n" " Check the JSON metadata in the Advanced settings" -msgstr "" +msgstr "此配色方案正被自定义标签颜色覆盖。" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:480 #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:496 -#, fuzzy msgid "This column must contain date/time information." msgstr "包含行信息的数据库列" #: superset-frontend/src/dashboard/components/Header/index.jsx:303 -#, fuzzy, python-format +#, python-format msgid "" "This dashboard is currently auto refreshing; the next auto refresh will " "be in %s." @@ -12721,12 +12261,10 @@ msgid "" msgstr "此看板未发布,它将不会显示在看板列表中。单击此处以发布此看板。" #: superset-frontend/src/dashboard/actions/dashboardState.js:125 -#, fuzzy msgid "This dashboard is now hidden" msgstr "无法修改该看板" #: superset-frontend/src/dashboard/actions/dashboardState.js:124 -#, fuzzy msgid "This dashboard is now published" msgstr "当前看板 ${nowPublished}" @@ -12761,7 +12299,7 @@ msgid "" " replacement feature <a " "href='https://superset.apache.org/docs/installation/alerts-" "reports'>Alerts & Reports documentation</a>" -msgstr "" +msgstr "此功能已弃用,将在2.0中删除。" #: superset/connectors/sqla/views.py:447 msgid "" @@ -12771,12 +12309,12 @@ msgstr "这个字段执行Superset视图时,意味着Superset将以子查询 #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/FiltersHeader.tsx:105 msgid "This filter doesn't exist in dashboard. It will not be applied." -msgstr "" +msgstr "此过滤器在仪表板中不存在。它不会被应用。" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx:165 #, python-format msgid "This filter set is identical to: \"%s\"" -msgstr "" +msgstr "此过滤器集等同于: \"%s\" " #: superset/connectors/sqla/views.py:358 msgid "" @@ -12818,7 +12356,7 @@ msgstr "这个查询使用了 %s 秒去执行," msgid "" "This section allows you to configure how to use the slice\n" " to generate annotations." -msgstr "" +msgstr "此部分允许您配置如何使用切片生成注释。" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/advancedAnalytics.tsx:27 #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:244 @@ -12832,11 +12370,11 @@ msgstr "本节包含允许对查询结果进行高级分析处理后的选项。 #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:84 msgid "This value should be greater than the left target value" -msgstr "" +msgstr "这个值应该大于左边的目标值" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:79 msgid "This value should be smaller than the right target value" -msgstr "" +msgstr "这个值应该小于正确的目标值" #: superset-frontend/src/explore/components/controls/VizTypeControl/index.tsx:67 msgid "This visualization type is not supported." @@ -12848,7 +12386,7 @@ msgstr "这是由以下因素引发的:" #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:74 msgid "Threshold alpha level for determining significance" -msgstr "" +msgstr "确定重要性的阈值α水平" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:60 msgid "Thursday" @@ -12907,7 +12445,6 @@ msgid "Time Range" msgstr "时间范围" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:86 -#, fuzzy msgid "Time Series" msgstr "时间序列" @@ -12948,7 +12485,6 @@ msgid "Time Series - Stacked" msgstr "时间序列 - 堆积图" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:67 -#, fuzzy msgid "Time Series Options" msgstr "时间序列的列" @@ -12972,10 +12508,9 @@ msgstr "时间列" #: superset/connectors/sqla/models.py:1173 #, python-format msgid "Time column \"%(col)s\" does not exist in dataset" -msgstr "" +msgstr "时间列 \"%(col)s\" 在数据集中不存在" #: superset-frontend/src/filters/components/TimeColumn/index.ts:29 -#, fuzzy msgid "Time column filter plugin" msgstr "选择过滤器" @@ -12989,7 +12524,7 @@ msgstr "时间比较" msgid "" "Time delta is ambiguous. Please specify [%(human_readable)s ago] or " "[%(human_readable)s later]." -msgstr "" +msgstr "时间是模糊的。" #: superset/connectors/druid/views.py:317 msgid "" @@ -13001,12 +12536,10 @@ msgstr "当检索不同的值以填充过滤器组件时,时间表达式用作 #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:296 #: superset-frontend/src/filters/components/Time/index.ts:27 -#, fuzzy msgid "Time filter" msgstr "日期过滤器" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/index.tsx:450 -#, fuzzy msgid "Time format" msgstr "时间格式" @@ -13017,7 +12550,6 @@ msgid "Time grain" msgstr "时间粒度(grain)" #: superset-frontend/src/filters/components/TimeGrain/index.ts:29 -#, fuzzy msgid "Time grain filter plugin" msgstr "范围过滤器" @@ -13072,43 +12604,40 @@ msgstr "时间偏移" msgid "" "Time string is ambiguous. Please specify [%(human_readable)s ago] or " "[%(human_readable)s later]." -msgstr "" +msgstr "时间字符串是模糊的。" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:75 -#, fuzzy msgid "Time-series Area Chart" -msgstr "时间序列-条形图" +msgstr "时间序列条形图" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/index.ts:65 msgid "" "Time-series Area chart are similar to line chart in that they represent " "variables with the same scale, but area charts stack the metrics on top " "of each other. An area chart in Superset can be stream, stack, or expand." -msgstr "" +msgstr "时间序列面积图与折线图相似,因为它们表示具有相同比例的变量,但面积图将度量叠加在一起。超级集中的面积图可以是流式、堆栈式或展开式" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:35 msgid "Time-series Bar Chart" msgstr "时间序列-条形图" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:75 -#, fuzzy msgid "Time-series Bar Chart v2" -msgstr "时间序列-条形图" +msgstr "时间序列条形图 v2" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:61 msgid "" "Time-series Bar Charts are used to show the changes in a metric over time" " as a series of bars." -msgstr "" +msgstr "时间序列条形图用于显示指标随时间的变化" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:69 msgid "Time-series Chart" msgstr "时间序列图" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Line/index.ts:70 -#, fuzzy msgid "Time-series Line Chart" -msgstr "时间序列图" +msgstr "时间序列折线图" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:30 msgid "Time-series Percent Change" @@ -13119,32 +12648,29 @@ msgid "Time-series Period Pivot" msgstr "时间序列-周期轴" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:69 -#, fuzzy msgid "Time-series Scatter Plot" -msgstr "时间序列图" +msgstr "时间序列散点图" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Scatter/index.ts:59 msgid "" "Time-series Scatter Plot has time on the horizontal axis in linear units," " and the points are connected in order. It shows a statistical " "relationship between two variables." -msgstr "" +msgstr "时间序列散点图在水平轴上以线性单位表示时间,点按顺序连接。它显示了两个变量之间的统计关系" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:69 -#, fuzzy msgid "Time-series Smooth Line" -msgstr "时间序列-表格" +msgstr "时间序列光滑曲线图" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/SmoothLine/index.ts:59 msgid "" "Time-series Smooth-line is a variation of line chart. Without angles and " "hard edges, Smooth-line looks more smarter and more professional." -msgstr "" +msgstr "时间序列平滑线是折线图的变体。没有角度和硬边,平滑线看起来更聪明、更专业。" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:60 -#, fuzzy msgid "Time-series Stepped Line" -msgstr "时间序列-表格" +msgstr "时间序列阶梯图" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:50 msgid "" @@ -13152,7 +12678,7 @@ msgid "" " line chart but with the line forming a series of steps between data " "points. A step chart can be useful when you want to show the changes that" " occur at irregular intervals." -msgstr "" +msgstr "“时间序列步进折线图(也称为步进图)是折线图的一种变体,但线条在数据点之间形成一系列步进。当您希望显示不规则间隔发生的变化时,步进图可能很有用。”" #: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:25 msgid "Time-series Table" @@ -13164,7 +12690,7 @@ msgid "" "over regular time intervals. Line chart is a type of chart which displays" " information as a series of data points connected by straight line " "segments. It is a basic type of chart common in many fields." -msgstr "" +msgstr "时间序列折线图用于可视化在规则时间间隔内进行的重复测量。折线图是一种图表,它将信息显示为一系列由直线段连接的数据点。它是许多领域中常见的一种基本类型的图表。" #: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:98 msgid "Timeout error" @@ -13176,23 +12702,21 @@ msgstr "时间戳格式" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:73 #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:372 -#, fuzzy msgid "Timestamp format" msgstr "时间戳格式" #: superset-frontend/src/components/ReportModal/index.tsx:378 #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1223 msgid "Timezone" -msgstr "" +msgstr "时区" #: superset/connectors/druid/views.py:312 superset/connectors/sqla/views.py:438 msgid "Timezone offset (in hours) for this datasource" msgstr "数据源的时差(单位:小时)" #: superset-frontend/src/components/TimezoneSelector/index.tsx:120 -#, fuzzy msgid "Timezone selector" -msgstr "运行选定的查询" +msgstr "时区选择" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:35 #: superset-frontend/plugins/legacy-preset-chart-big-number/src/sharedControls.ts:69 @@ -13207,14 +12731,12 @@ msgid "Title" msgstr "标题" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:509 -#, fuzzy msgid "Title Column" -msgstr "时间列" +msgstr "标题栏" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/DividerConfigForm.tsx:45 -#, fuzzy msgid "Title is required" -msgstr "字段是必需的" +msgstr "标题是必填项" #: superset/dashboards/filters.py:33 msgid "Title or Slug" @@ -13233,36 +12755,30 @@ msgid "Toggle chart description" msgstr "切换图表说明" #: superset-frontend/src/visualizations/FilterBox/FilterBoxChartPlugin.js:25 -#, fuzzy msgid "Tools" -msgstr "角色" +msgstr "工具" #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:184 -#, fuzzy msgid "Tooltip" msgstr "详细提示" #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:172 -#, fuzzy msgid "Tooltip sort by metric" msgstr "排序指标" #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:162 -#, fuzzy msgid "Tooltip time format" msgstr "时间格式" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:289 -#, fuzzy msgid "Top" -msgstr "停止" +msgstr "顶部" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:139 msgid "Top to Bottom" -msgstr "" +msgstr "点击回顶部" #: superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx:439 -#, fuzzy msgid "Totals" msgstr "显示总计" @@ -13280,7 +12796,7 @@ msgstr "跟踪任务" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/index.ts:67 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/index.ts:76 msgid "Transformable" -msgstr "" +msgstr "转换" #: superset-frontend/src/dashboard/util/backgroundStyleOptions.ts:25 msgid "Transparent" @@ -13291,33 +12807,29 @@ msgid "Transpose Pivot" msgstr "转置透视图" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:173 -#, fuzzy msgid "Transpose pivot" msgstr "转置透视图" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:39 -#, fuzzy msgid "Tree Chart" -msgstr "共享图表" +msgstr "树状图" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:117 msgid "Tree layout" -msgstr "" +msgstr "布局" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:134 -#, fuzzy msgid "Tree orientation" msgstr "方向" #: superset-frontend/plugins/legacy-plugin-chart-treemap/src/index.js:40 #: superset/viz.py:1003 msgid "Treemap" -msgstr "树状图" +msgstr "树状地图" #: superset-frontend/plugins/plugin-chart-echarts/src/Treemap/index.ts:56 -#, fuzzy msgid "Treemap v2" -msgstr "树状图" +msgstr "树状地图 v2" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:37 #: superset-frontend/plugins/legacy-plugin-chart-rose/src/index.js:37 @@ -13328,14 +12840,12 @@ msgstr "树状图" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:40 #: superset-frontend/plugins/plugin-chart-echarts/src/Funnel/index.ts:59 #: superset-frontend/src/visualizations/TimeTable/TimeTableChartPlugin.ts:36 -#, fuzzy msgid "Trend" -msgstr "开始时间" +msgstr "趋势" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:226 -#, fuzzy msgid "Triangle" -msgstr "自定义区间" +msgstr "三角形" #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1168 msgid "Trigger Alert If..." @@ -13349,7 +12859,7 @@ msgstr "如果 ... 则触发警报" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:271 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:274 msgid "Truncate Y Axis" -msgstr "" +msgstr "截断Y轴" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx:343 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Area/controlPanel.tsx:258 @@ -13358,7 +12868,7 @@ msgstr "" #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Step/controlPanel.tsx:274 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/controlPanel.tsx:277 msgid "Truncate Y Axis. Can be overridden by specifying a min or max bound." -msgstr "" +msgstr "截断Y轴。可以通过指定最小或最大界限来重写。" #: superset-frontend/src/explore/components/controls/DateFilterControl/components/DateFunctionTooltip.tsx:58 msgid "Truncates the specified date to the accuracy specified by the date unit." @@ -13366,7 +12876,7 @@ msgstr "将指定的日期截取为指定的日期单位精度。" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/BigNumber.tsx:222 msgid "Try applying different filters or ensuring your datasource has data" -msgstr "" +msgstr "尝试应用不同的筛选器或确保您的数据源包含数据。“" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:58 msgid "Tuesday" @@ -13389,13 +12899,12 @@ msgid "Type \"%s\" to confirm" msgstr "键入 \"%s\" 来确认" #: superset-frontend/src/components/ListView/Filters/Search.tsx:71 -#, fuzzy msgid "Type a value" -msgstr "在这里键入一个值" +msgstr "请输入值" #: superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx:319 msgid "Type a value here" -msgstr "在这里键入一个值" +msgstr "请输入值" #: superset/reports/commands/exceptions.py:71 msgid "Type is required" @@ -13403,7 +12912,7 @@ msgstr "类型是必需的" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:73 msgid "Type of Google Sheets allowed" -msgstr "" +msgstr "接受Google Sheets的类型" #: superset-frontend/src/visualizations/FilterBox/FilterBox.jsx:379 #, python-format @@ -13416,9 +12925,8 @@ msgstr "键入或选择 [%s]" #: superset-frontend/src/filters/components/Time/controlPanel.ts:45 #: superset-frontend/src/filters/components/TimeColumn/controlPanel.ts:25 #: superset-frontend/src/filters/components/TimeGrain/controlPanel.ts:25 -#, fuzzy msgid "UI Configuration" -msgstr "过滤配置" +msgstr "UI 配置" #: superset-frontend/src/explore/controlPanels/TimeTable.js:51 msgid "URL" @@ -13429,9 +12937,8 @@ msgid "URL Parameters" msgstr "URL参数" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:125 -#, fuzzy msgid "URL could not be identified" -msgstr "这个查询无法被加载。" +msgstr "无法识别的URL。" #: superset-frontend/src/explore/controlPanels/sections.tsx:60 msgid "URL parameters" @@ -13448,16 +12955,16 @@ msgstr "无法将新选项卡添加到后端。请与管理员联系。" #: superset/db_engine_specs/presto.py:218 #, python-format msgid "Unable to connect to catalog named \"%(catalog_name)s\"." -msgstr "" +msgstr "无法连接到名为\%(catalog_name)s\的目录。" #: superset/db_engine_specs/mysql.py:139 #: superset/db_engine_specs/postgres.py:145 #, python-format msgid "Unable to connect to database \"%(database)s\"." -msgstr "" +msgstr "不能连接到数据库\"%(database)s\"" #: superset/utils/date_parser.py:390 -#, fuzzy, python-format +#, python-format msgid "Unable to find such a holiday: [%(holiday)s]" msgstr "找不到这样的假期:[{}]" @@ -13494,7 +13001,7 @@ msgstr "" "内。错误消息:%(error_msg)s" #: superset/views/database/views.py:538 -#, fuzzy, python-format +#, python-format msgid "" "Unable to upload Columnar file \"%(filename)s\" to table " "\"%(table_name)s\" in database \"%(db_name)s\". Error message: " @@ -13535,19 +13042,17 @@ msgid "Unexpected error occurred, please check your logs for details" msgstr "发生意外错误,请检查日志以了解详细信息" #: superset-frontend/src/utils/getClientErrorObject.ts:55 -#, fuzzy msgid "Unexpected error: " msgstr "意外错误。" #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:95 -#, fuzzy msgid "Unknown" -msgstr "云南" +msgstr "未知" #: superset/db_engine_specs/mysql.py:129 #, python-format msgid "Unknown MySQL server host \"%(hostname)s\"." -msgstr "" +msgstr "未知MySQL服务器主机 \"%(hostname)s\"." #: superset/db_engine_specs/presto.py:1005 msgid "Unknown Presto Error" @@ -13555,12 +13060,12 @@ msgstr "未知 Presto 错误" #: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:111 msgid "Unknown Status" -msgstr "" +msgstr "未知状态" #: superset/connectors/sqla/models.py:1121 #, python-format msgid "Unknown column used in orderby: %(col)s" -msgstr "" +msgstr "订单中使用的未知列: %(col)s" #: superset-frontend/src/SqlLab/actions/sqlLab.js:349 #: superset-frontend/src/SqlLab/actions/sqlLab.js:389 @@ -13568,7 +13073,6 @@ msgid "Unknown error" msgstr "未知错误" #: superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils/index.ts:45 -#, fuzzy msgid "Unknown value" msgstr "未知错误" @@ -13590,7 +13094,7 @@ msgstr "未选择的条件 (%d)" #: superset/utils/core.py:1048 #, python-format msgid "Unsupported clause type: %(clause)s" -msgstr "" +msgstr "不支持的条款类型: %(clause)s" #: superset/connectors/druid/models.py:1492 msgid "Unsupported extraction function: " @@ -13639,7 +13143,6 @@ msgid "Upload" msgstr "上传" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:134 -#, fuzzy msgid "Upload Credentials" msgstr "上传验证文件" @@ -13649,7 +13152,7 @@ msgstr "上传Excel" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:102 msgid "Upload JSON file" -msgstr "" +msgstr "上传JSON文件" #: superset/initialization/__init__.py:369 msgid "Upload CSV to database" @@ -13660,26 +13163,23 @@ msgid "Upload a Columnar File" msgstr "上传列式存储文件" #: superset-frontend/plugins/legacy-plugin-chart-rose/src/controlPanel.tsx:112 -#, fuzzy msgid "Use Area Proportions" -msgstr "桶断点" +msgstr "使用面积比例" #: superset/views/database/forms.py:175 superset/views/database/forms.py:433 -#, fuzzy, python-format +#, python-format msgid "Use Columns" -msgstr "%s 列" +msgstr "使用列" #: superset/views/database/forms.py:211 msgid "Use Pandas to interpret the datetime format automatically." msgstr "使用Pandas自动解释日期时间格式。" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:207 -#, fuzzy msgid "Use a log scale" msgstr "使用Y轴的对数刻度" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:107 -#, fuzzy msgid "Use a log scale for the X-axis" msgstr "使用Y轴的对数刻度" @@ -13689,7 +13189,7 @@ msgstr "使用Y轴的对数刻度" #: superset/db_engine_specs/base.py:1401 msgid "Use an encrypted connection to the database" -msgstr "" +msgstr "使用到数据库的加密连接" #: superset-frontend/src/components/Datasource/DatasourceModal.tsx:209 msgid "Use legacy datasource editor" @@ -13697,21 +13197,21 @@ msgstr "使用旧数据源编辑器" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:85 msgid "Use metrics as a top level group for columns or for rows" -msgstr "" +msgstr "将指标作为列或行的顶级组使用" #: superset-frontend/src/filters/components/Range/controlPanel.ts:68 msgid "Use only a single value." -msgstr "" +msgstr "只使用一个值" #: superset-frontend/plugins/legacy-plugin-chart-partition/src/controlPanel.tsx:124 msgid "Use the Advanced Analytics options below" -msgstr "" +msgstr "使用下面的高级分析选项" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx:136 msgid "" "Use the JSON file you automatically downloaded when creating your service" " account." -msgstr "" +msgstr "使用您在创建服务帐户时自动下载的JSON文件" #: superset/templates/superset/fab_overrides/list_with_checkboxes.html:82 msgid "Use the edit buttom to change this field" @@ -13736,7 +13236,7 @@ msgid "" "\n" " This chart is being deprecated and we recommend checking out Pivot " "Table V2 instead!" -msgstr "" +msgstr "用于通过将多个统计数据分组来总结一组数据" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/index.ts:51 msgid "" @@ -13744,7 +13244,7 @@ msgid "" "along two axes. Examples: Sales numbers by region and month, tasks by " "status and assignee, active users by age and location. Not the most " "visually stunning visualization, but highly informative and versatile." -msgstr "" +msgstr "用于通过将多个统计信息分组在一起来汇总一组数据" #: superset-frontend/src/components/Menu/MenuRight.tsx:158 #: superset-frontend/src/views/CRUD/data/query/QueryList.tsx:275 @@ -13760,12 +13260,10 @@ msgid "User Roles" msgstr "用户角色" #: superset/errors.py:112 -#, fuzzy msgid "User doesn't have the proper permissions." msgstr "您没有授权 " #: superset-frontend/src/filters/components/Select/controlPanel.ts:94 -#, fuzzy msgid "User must select a value before applying the filter" msgstr "用户必须给过滤器选择一个值" @@ -13778,7 +13276,6 @@ msgstr "用户必须给过滤器选择一个值" #: superset-frontend/src/filters/components/Time/controlPanel.ts:56 #: superset-frontend/src/filters/components/TimeColumn/controlPanel.ts:36 #: superset-frontend/src/filters/components/TimeGrain/controlPanel.ts:36 -#, fuzzy msgid "User must select a value for this filter." msgstr "用户必须给过滤器选择一个值" @@ -13788,16 +13285,15 @@ msgstr "用户查询" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:109 #: superset/db_engine_specs/base.py:1388 -#, fuzzy msgid "Username" -msgstr "查询名称" +msgstr "用户名" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/index.ts:39 msgid "" "Uses a gauge to showcase progress of a metric towards a target. The " "position of the dial represents the progress and the terminal value in " "the gauge represents the target value." -msgstr "" +msgstr "使用一个度量来展示实现目标的度量的进展" #: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/index.js:28 msgid "" @@ -13805,7 +13301,7 @@ msgid "" "system. Hover over individual paths in the visualization to understand " "the stages a value took. Useful for multi-stage, multi-group visualizing " "funnels and pipelines." -msgstr "" +msgstr "使用圆圈来可视化系统不同阶段的数据流。" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx:294 #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:1186 @@ -13828,25 +13324,22 @@ msgstr "值边界" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:165 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:206 -#, fuzzy msgid "Value format" msgstr "数值格式" #: superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx:75 -#, fuzzy msgid "Value is required" msgstr "需要名称" #: superset/reports/schemas.py:185 superset/reports/schemas.py:191 #: superset/reports/schemas.py:197 superset/reports/schemas.py:275 #: superset/reports/schemas.py:281 superset/reports/schemas.py:288 -#, fuzzy msgid "Value must be greater than 0" msgstr "`行偏移量` 必须大于或等于0" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:39 msgid "Vehicle Types" -msgstr "" +msgstr "类型" #: superset/connectors/druid/views.py:189 #: superset/connectors/druid/views.py:238 superset/connectors/sqla/views.py:144 @@ -13855,24 +13348,22 @@ msgid "Verbose Name" msgstr "全称" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:482 -#, fuzzy msgid "Version" -msgstr "维度" +msgstr "版本" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:489 msgid "Version number" -msgstr "" +msgstr "版本" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:41 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DistBar/index.js:48 #: superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/Regular/Bar/index.ts:84 -#, fuzzy msgid "Vertical" -msgstr "虚拟信息" +msgstr "垂直" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:38 msgid "Video game consoles" -msgstr "" +msgstr "控制台" #: superset-frontend/src/views/CRUD/welcome/ChartTable.tsx:217 #: superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx:219 @@ -13914,7 +13405,6 @@ msgid "Viewed" msgstr "已查看" #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:124 -#, fuzzy, python-format msgid "Viewed %s" msgstr "已查看" @@ -13931,7 +13421,6 @@ msgid "Virtual dataset" msgstr "虚拟数据集" #: superset/connectors/sqla/models.py:849 superset/connectors/sqla/utils.py:83 -#, fuzzy msgid "Virtual dataset query cannot be empty" msgstr "虚拟数据集查询必须是只读的" @@ -13966,33 +13455,33 @@ msgid "" "Visualize a parallel set of metrics across multiple groups. Each group is" " visualized using its own line of points and each metric is represented " "as an edge in the chart." -msgstr "" +msgstr "在多个组中可视化一组平行的度量。每个组都使用自己的点线进行可视化,每个度量在图表中表示为一条边。" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/index.js:30 msgid "" "Visualize a related metric across pairs of groups. Heatmaps excel at " "showcasing the correlation or strength between two groups. Color is used " "to emphasize the strength of the link between each pair of groups." -msgstr "" +msgstr "可视化各组之间的相关指标。热图擅长显示两组之间的相关性或强度。颜色用于强调各组之间的联系强度。" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bar/index.js:31 msgid "" "Visualize how a metric changes over time using bars. Add a group by " "column to visualize group level metrics and how they change over time." -msgstr "" +msgstr "使用条形图可视化指标随时间的变化。按列添加分组以可视化分组级别的指标及其随时间变化的方式。" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/index.ts:35 msgid "" "Visualize multiple levels of hierarchy using a familiar tree-like " "structure." -msgstr "" +msgstr "使用熟悉的树状结构可视化多层次结构。" #: superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/index.ts:58 msgid "" "Visualize two different time series using the same x-axis time range. " "Note that each time series can be visualized differently (e.g. 1 using " "bars and 1 using a line)." -msgstr "" +msgstr "使用相同的x轴时间范围可视化两个不同的时间序列。请注意,每个时间序列可以以不同的方式可视化(例如1个使用条形图,1个使用线条)。" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:27 msgid "" @@ -14000,26 +13489,29 @@ msgid "" "This chart is being deprecated and we recommend using the Mixed " "Timeseries Chart instead!" msgstr "" +"使用相同的x轴时间范围可视化两个不同的时间序列。" +"此图表已被弃用,我们建议使用混合" +"改为时间序列图!" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/index.js:27 msgid "" "Visualizes 2 metrics as line plots using the same x-axis. This chart is " "useful for comparing metrics across the same time range." -msgstr "" +msgstr "使用相同的x轴将2个指标可视化为折线图。此图表可用于比较相同时间范围内的指标。" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:27 msgid "" "Visualizes a metric across three dimensions of data in a single chart (X " "axis, Y axis, and bubble size). Bubbles from the same group can be " "showcased using bubble color." -msgstr "" +msgstr "在单个图表中跨三维数据(X轴、Y轴和气泡大小)可视化度量。同一组中的气泡可以“使用气泡颜色显示" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/index.js:27 msgid "" "Visualizes how a metric has changed over a time using a color scale and a" " calendar view. Gray values are used to indicate missing values and the " "linear color scheme is used to encode the magnitude of each day's value." -msgstr "" +msgstr "使用色标和日历视图可视化指标在一段时间内的变化情况。灰色值用于指示缺少的值,线性配色方案用于编码每天值的大小。" #: superset-frontend/plugins/legacy-plugin-chart-country-map/src/index.js:27 msgid "" @@ -14027,14 +13519,14 @@ msgid "" "subdivisions (states, provinces, etc) on a chloropleth map. Each " "subdivision's value is elevated when you hover over the corresponding " "geographic boundary." -msgstr "" +msgstr "在叶绿体地图上显示一个国家的主要分区(州、省等)之间单个指标的变化情况。当您悬停在相应的地理边界上时,每个分区的值都会升高" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Compare/index.js:27 msgid "" "Visualizes many different time-series objects in a single chart. This " "chart is being deprecated and we recommend using the Time-series Chart " "instead." -msgstr "" +msgstr "在一个图表中显示许多不同的时间序列对象。此图表已被弃用,建议改用时间序列图表" #: superset-frontend/plugins/legacy-plugin-chart-sankey/src/index.js:29 msgid "" @@ -14042,13 +13534,13 @@ msgid "" "of a system. New stages in the pipeline are visualized as nodes or " "layers. The thickness of the bars or edges represent the metric being " "visualized." -msgstr "" +msgstr "可视化不同组的值在系统不同阶段的流动。管道中的新阶段被可视化为节点或层。条形或边缘的厚度表示正在可视化的度量。" #: superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/index.ts:35 msgid "" "Visualizes the words in a column that appear the most often. Bigger font " "corresponds to higher frequency." -msgstr "" +msgstr "可视化列中出现频率最高的单词。字体越大,出现频率越高。" #: superset/viz.py:133 msgid "Viz is missing a datasource" @@ -14064,10 +13556,9 @@ msgstr "星期三" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:697 msgid "Want to add a new database?" -msgstr "" +msgstr "添加一个新数据库?" #: superset-frontend/src/components/Datasource/DatasourceEditor.jsx:1090 -#, fuzzy msgid "Warning" msgstr "警告!" @@ -14086,12 +13577,12 @@ msgid "" msgstr "警告!如果元数据不存在,更改数据集可能会破坏图表。" #: superset/db_engine_specs/bigquery.py:166 -#, fuzzy, python-format +#, python-format msgid "We can't seem to resolve column \"%(column)s\" at line %(location)s." msgstr "我们似乎无法解析行 %(location)s 所处的列 \"%(column_name)s\" 。" #: superset/db_engine_specs/sqlite.py:63 -#, fuzzy, python-format +#, python-format msgid "We can't seem to resolve the column \"%(column_name)s\"" msgstr "我们似乎无法解析行 %(location)s 所处的列 \"%(column_name)s\" 。" @@ -14109,57 +13600,53 @@ msgstr "我们建议您在遵循流程之前进一步总结数据。" #: superset-frontend/src/reports/actions/reports.js:156 msgid "We were unable to active or deactivate this report." -msgstr "" +msgstr "“我们无法激活或禁用该报告。" #: superset/db_engine_specs/redshift.py:86 #, python-format msgid "" "We were unable to connect to your database named \"%(database)s\". Please" " verify your database name and try again." -msgstr "" +msgstr "我们无法连接到名为 \"%(database)s\" 的数据库。请确认您的数据库名字并重试" #: superset/db_engine_specs/bigquery.py:149 msgid "" "We were unable to connect to your database. Please confirm that your " "service account has the Viewer and Job User roles on the project." -msgstr "" +msgstr "我们无法连接到您的数据库。请确认您的服务帐户在项目中具有查看器和作业用户角色。" #: superset-frontend/plugins/plugin-chart-echarts/src/Radar/index.ts:60 msgid "Web" -msgstr "" +msgstr "网络" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:59 msgid "Wednesday" msgstr "星期三" #: superset/db_engine_specs/base.py:97 -#, fuzzy msgid "Week" msgstr "周" #: superset/db_engine_specs/base.py:103 msgid "Week ending Saturday" -msgstr "" +msgstr "周一为一周结束" #: superset/db_engine_specs/base.py:102 -#, fuzzy msgid "Week starting Monday" msgstr "周一为一周开始" #: superset/db_engine_specs/base.py:101 -#, fuzzy msgid "Week starting Sunday" -msgstr "周日为一周结束" +msgstr "周日为一周开始" #: superset/db_engine_specs/base.py:104 -#, fuzzy msgid "Week_ending Sunday" msgstr "周日为一周结束" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:67 -#, fuzzy, python-format +#, python-format msgid "Weeks %s" -msgstr "周" +msgstr "周 %s" #: superset-frontend/src/components/ErrorMessage/TimeoutErrorMessage.tsx:52 #, python-format @@ -14202,7 +13689,7 @@ msgstr "当在 SQL 编辑器中允许 CREATE TABLE AS 选项时,此选项可 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/ExtraOptions.tsx:195 msgid "When enabled, users are able to visualize SQL Lab results in Explore." -msgstr "" +msgstr "启用后,用户可以在Explore中可视化SQL实验室结果。" #: superset-frontend/plugins/legacy-plugin-chart-sunburst/src/controlPanel.ts:71 msgid "When only a primary metric is provided, a categorical color scale is used." @@ -14232,7 +13719,7 @@ msgstr "当使用“Group by”时,只限于使用单个度量。" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:258 msgid "Whether the progress bar overlaps when there are multiple groups of data" -msgstr "" +msgstr "当有多组数据时进度条是否重叠" #: superset/connectors/sqla/views.py:466 msgid "Whether the table was generated by the 'Visualize' flow in SQL Lab" @@ -14245,7 +13732,6 @@ msgid "" msgstr "该列是否在浏览视图的`过滤器`部分显示。" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:430 -#, fuzzy msgid "" "Whether to align background charts with both positive and negative values" " at 0" @@ -14253,29 +13739,27 @@ msgstr "是否 +/- 对齐背景图数值" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:128 msgid "Whether to align positive and negative values in cell bar chart at 0" -msgstr "" +msgstr "单元格条形图中的正负值是否按0对齐" #: superset-frontend/src/explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx:739 -#, fuzzy msgid "Whether to always show the annotation label" msgstr "是否显示标签。" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:192 msgid "Whether to animate the progress and the value or just display them" -msgstr "" +msgstr "是以动画形式显示进度和值,还是仅显示它们" #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:317 msgid "Whether to apply a normal distribution based on rank on the color scale" -msgstr "" +msgstr "是否应用基于色标等级的正态分布" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:138 #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:442 msgid "Whether to colorize numeric values by if they are positive or negative" -msgstr "" +msgstr "根据数值是正数还是负数来为其上色" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/components/ColumnConfigControl/constants.tsx:120 #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:416 -#, fuzzy msgid "Whether to display a bar chart background in table columns" msgstr "为指标添加条状图背景" @@ -14288,7 +13772,6 @@ msgid "Whether to display bubbles on top of countries" msgstr "是否在国家之上展示气泡" #: superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/src/controlPanel.ts:60 -#, fuzzy msgid "Whether to display the interactive data table" msgstr "是否将指标名显示为标题" @@ -14303,7 +13786,7 @@ msgstr "是否显示标签。" msgid "" "Whether to display the labels. Note that the label only displays when the" " the 5% threshold." -msgstr "" +msgstr "是否显示标签。" #: superset-frontend/plugins/legacy-plugin-chart-calendar/src/controlPanel.ts:157 #: superset-frontend/plugins/legacy-plugin-chart-heatmap/src/controlPanel.ts:278 @@ -14332,31 +13815,27 @@ msgid "Whether to display the numerical values within the cells" msgstr "是否在单元格内显示数值" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:141 -#, fuzzy msgid "Whether to display the time range interactive selector" msgstr "是否显示时间范围交互选择器" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:88 -#, fuzzy msgid "Whether to display the timestamp" msgstr "是否显示笔划" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumber/controlPanel.tsx:100 -#, fuzzy msgid "Whether to display the trend line" msgstr "是否显示笔划" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:170 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:279 msgid "Whether to enable changing graph position and scaling." -msgstr "" +msgstr "是否启用更改图形位置和缩放。" #: superset-frontend/plugins/plugin-chart-echarts/src/Graph/controlPanel.tsx:144 msgid "Whether to enable node dragging in force layout mode." -msgstr "" +msgstr "是否在强制布局模式下启用节点拖动。" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/controlPanel.ts:63 -#, fuzzy msgid "Whether to format the timestamp" msgstr "是否规范化直方图" @@ -14377,7 +13856,6 @@ msgid "Whether to include the time granularity as defined in the time section" msgstr "是否包含时间段中定义的时间粒度" #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/controlPanel.ts:155 -#, fuzzy msgid "Whether to make the histogram cumulative" msgstr "是否规范化直方图" @@ -14409,21 +13887,18 @@ msgid "" msgstr "是否显示额外的控件。额外的控制包括使多栏图表堆叠或并排。" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:207 -#, fuzzy msgid "Whether to show minor ticks on the axis" msgstr "是否忽略空位置" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:180 -#, fuzzy msgid "Whether to show the pointer" msgstr "是否显示笔划" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:246 msgid "Whether to show the progress of gauge chart" -msgstr "" +msgstr "是否显示量规图进度" #: superset-frontend/plugins/plugin-chart-echarts/src/Gauge/controlPanel.tsx:219 -#, fuzzy msgid "Whether to show the split lines on the axis" msgstr "是否显示Y轴的最小值和最大值" @@ -14449,7 +13924,6 @@ msgid "Whether to sort descending or ascending" msgstr "是降序还是升序排序" #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/legacySortBy.tsx:31 -#, fuzzy msgid "" "Whether to sort descending or ascending. Takes effect only when \"Sort " "by\" is set" @@ -14470,17 +13944,16 @@ msgid "Whether to sort results by the selected metric in descending order." msgstr "是否按所选指标按降序对结果进行排序。" #: superset-frontend/plugins/plugin-chart-echarts/src/controls.tsx:175 -#, fuzzy msgid "Whether to sort tooltip by the selected metric in descending order." msgstr "是否按所选指标按降序对结果进行排序。" #: superset-frontend/plugins/legacy-plugin-chart-country-map/src/controlPanel.ts:43 msgid "Which country to plot the map for?" -msgstr "" +msgstr "为哪个国家绘制地图?" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:197 msgid "Which relatives to highlight on hover" -msgstr "" +msgstr "在悬停时突出显示哪些关系" #: superset-frontend/plugins/plugin-chart-echarts/src/BoxPlot/controlPanel.ts:51 #: superset-frontend/plugins/preset-chart-xy/src/BoxPlot/controlPanel.ts:45 @@ -14496,16 +13969,14 @@ msgid "Width" msgstr "宽度" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/forecastInterval.tsx:73 -#, fuzzy msgid "Width of the confidence interval. Should be between 0 and 1" msgstr "置信区间必须介于0和1(不包含1)之间" #: superset/utils/pandas_postprocessing.py:393 msgid "Window must be > 0" -msgstr "" +msgstr "窗口必须大于0" #: superset-frontend/plugins/legacy-preset-chart-big-number/src/BigNumberTotal/index.ts:36 -#, fuzzy msgid "With a subheader" msgstr "子标题" @@ -14542,7 +14013,7 @@ msgstr "将dataframe index 作为列." #: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:51 msgid "X AXIS TITLE BOTTOM MARGIN" -msgstr "" +msgstr "X 轴标题下边距" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:31 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:147 @@ -14577,7 +14048,7 @@ msgstr "X 轴标签" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:37 msgid "X Axis Title" -msgstr "" +msgstr "X轴标题" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/controlPanel.ts:104 msgid "X Log Scale" @@ -14598,17 +14069,16 @@ msgid "XScale Interval" msgstr "X轴比例尺间隔" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:102 -#, fuzzy msgid "Y 2 bounds" msgstr "Y界限" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:79 msgid "Y AXIS TITLE MARGIN" -msgstr "" +msgstr "Y轴标题页边距" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:94 msgid "Y AXIS TITLE POSITION" -msgstr "" +msgstr "Y轴标题位置" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:59 #: superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx:153 @@ -14633,14 +14103,13 @@ msgstr "Y 轴" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:40 msgid "Y Axis 1" -msgstr "" +msgstr "Y 轴 1" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/DualLine/controlPanel.ts:50 msgid "Y Axis 2" -msgstr "" +msgstr "Y 轴 2" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:254 -#, fuzzy msgid "Y Axis 2 Bounds" msgstr "Y 轴界限" @@ -14675,7 +14144,7 @@ msgstr "Y轴右侧" #: superset-frontend/packages/superset-ui-chart-controls/src/sections/chartTitle.tsx:65 msgid "Y Axis Title" -msgstr "" +msgstr "Y 轴标题" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Controls.tsx:227 msgid "Y Log Scale" @@ -14690,12 +14159,11 @@ msgid "YScale Interval" msgstr "Y轴比例尺间隔" #: superset/db_engine_specs/base.py:100 -#, fuzzy msgid "Year" msgstr "年" #: superset-frontend/src/explore/components/controls/DateFilterControl/utils/constants.ts:70 -#, fuzzy, python-format +#, python-format msgid "Years %s" msgstr "年" @@ -14739,7 +14207,6 @@ msgid "" msgstr "您正在导入一个或多个已存在的数据集。覆盖可能会导致您丢失一些工作。确定要覆盖吗?" #: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:63 -#, fuzzy msgid "" "You are importing one or more saved queries that already exist. " "Overwriting might cause you to lose some of your work. Are you sure you " @@ -14750,16 +14217,15 @@ msgstr "您正在导入一个或多个已存在的图表。覆盖可能会导致 msgid "" "You are not authorized to fetch samples from this table. If you think " "this is an error, please reach out to your administrator." -msgstr "" +msgstr "您无权从这个表中获取样本。" #: superset/views/core.py:2295 msgid "" "You are not authorized to see this query. If you think this is an error, " "please reach out to your administrator." -msgstr "" +msgstr "您无权查看此查询。" #: superset/views/database/views.py:463 -#, fuzzy msgid "" "You cannot specify a namespace both in the name of the table: " "\"%(columnar_table.table)s\" and in the schema field: " @@ -14788,7 +14254,7 @@ msgstr "" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Vis.js:366 msgid "You cannot use 45° tick layout along with the time range filter" -msgstr "" +msgstr "不能将45°刻度线布局与时间范围过滤器一起使用" #: superset/viz.py:696 msgid "" @@ -14816,7 +14282,6 @@ msgid "You do not have permissions to edit this dashboard." msgstr "您没有编辑此看板的权限。" #: superset/dashboards/commands/exceptions.py:86 -#, fuzzy msgid "You don't have access to this dashboard." msgstr "您没有编辑此看板的权限。" @@ -14825,7 +14290,6 @@ msgid "You don't have any favorites yet!" msgstr "您还没有任何的收藏!" #: superset/key_value/commands/exceptions.py:45 -#, fuzzy msgid "You don't have permission to modify the value." msgstr "您没有编辑此图表的权限" @@ -14860,7 +14324,6 @@ msgid "You must run the query successfully first" msgstr "必须先成功运行查询" #: superset-frontend/src/dashboard/components/Header/index.jsx:382 -#, fuzzy msgid "Your dashboard is too large. Please reduce its size before saving it." msgstr "您的看板太大了。保存前请缩小尺寸。" @@ -14891,7 +14354,6 @@ msgid "Your query was updated" msgstr "您的查询已保存" #: superset-frontend/src/reports/actions/reports.js:172 -#, fuzzy msgid "Your report could not be deleted" msgstr "这个查询无法被加载。" @@ -14908,10 +14370,6 @@ msgstr "地图缩放等级" msgid "[Alert] %(label)s" msgstr "[警报] %(label)s" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:219 -msgid "[From]-" -msgstr "[从]-" - #: superset/viz.py:2349 msgid "[Longitude] and [Latitude] columns must be present in [Group By]" msgstr "[经度] 和 [纬度] 的选择项必须出现在 [Group By]" @@ -14921,7 +14379,6 @@ msgid "[Longitude] and [Latitude] must be set" msgstr "[经度] 和 [纬度] 的选择项必须出现在 [Group By]" #: superset/views/core.py:783 -#, fuzzy msgid "[Missing Dataset]" msgstr "丢失数据集" @@ -14930,14 +14387,10 @@ msgstr "丢失数据集" msgid "[Superset] Access to the datasource %(name)s was granted" msgstr "[Superset] 允许访问数据源 %(name)s" -#: superset-frontend/src/SqlLab/components/QuerySearch/index.tsx:231 -msgid "[To]-" -msgstr "[至]-" - #: superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx:94 -#, fuzzy, python-format +#, python-format msgid "[Untitled]" -msgstr "%s - 无标题" +msgstr "无标题" #: superset-frontend/src/dashboard/components/SaveModal.tsx:203 msgid "[dashboard name]" @@ -14952,11 +14405,11 @@ msgstr "次计量指标用来定义颜色与主度量的比率。如果两个度 #: superset/utils/pandas_postprocessing.py:519 msgid "`compare_columns` must have the same length as `source_columns`." -msgstr "" +msgstr "长度必须保持一致" #: superset/utils/pandas_postprocessing.py:523 msgid "`compare_type` must be `difference`, `percentage` or `ratio`" -msgstr "" +msgstr "`compare_type` 必须是 `difference`, `percentage` 或 `ratio`" #: superset/charts/schemas.py:557 msgid "`confidence_interval` must be between 0 and 1 (exclusive)" @@ -14974,16 +14427,14 @@ msgid "`operation` property of post processing object undefined" msgstr "后处理必须指定操作类型(`operation`)" #: superset/utils/pandas_postprocessing.py:765 -#, fuzzy msgid "`prophet` package not installed" msgstr "未安装程序包 `fbprophet`" #: superset/utils/pandas_postprocessing.py:722 msgid "`rename_columns` must have the same length as `columns`." -msgstr "" +msgstr "长度必须保持一致" #: superset/charts/schemas.py:1070 -#, fuzzy msgid "`row_limit` must be greater than or equal to 0" msgstr "`行限制` 必须大于或等于1" @@ -15017,11 +14468,11 @@ msgstr "修改这个 " #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:194 msgid "ancestor" -msgstr "" +msgstr "上一个" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:47 msgid "and" -msgstr "" +msgstr "和" #: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:111 #, python-format @@ -15044,7 +14495,7 @@ msgstr "注释层" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:48 #: superset-frontend/src/components/CronPicker/CronPicker.tsx:50 msgid "at" -msgstr "" +msgstr "在" #: superset-frontend/packages/superset-ui-chart-controls/src/components/ControlHeader.tsx:74 #: superset-frontend/src/explore/components/ControlHeader.jsx:76 @@ -15053,9 +14504,8 @@ msgstr "螺栓" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:161 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:179 -#, fuzzy msgid "bottom" -msgstr "dttm" +msgstr "底部" #: superset-frontend/src/components/CachedLabel/index.tsx:51 msgid "cached" @@ -15102,7 +14552,6 @@ msgid "column" msgstr "列" #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:116 -#, fuzzy msgid "count" msgstr "列" @@ -15112,14 +14561,13 @@ msgstr "创建一个 " #: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:253 msgid "css" -msgstr "" +msgstr "css" #: superset-frontend/src/views/CRUD/csstemplates/CssTemplateModal.tsx:91 msgid "css_template" msgstr "css模板" #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:120 -#, fuzzy msgid "cumulative" msgstr "激活" @@ -15168,7 +14616,6 @@ msgid "delete" msgstr "删除" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:195 -#, fuzzy msgid "descendant" msgstr "降序" @@ -15184,7 +14631,6 @@ msgid "dialect+driver://username:password@host:port/database" msgstr "" #: superset/views/core.py:618 -#, fuzzy msgid "download as csv" msgstr "下载为图片" @@ -15198,31 +14644,29 @@ msgstr "dttm" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:129 msgid "e.g. ********" -msgstr "" +msgstr "********" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:45 msgid "e.g. 127.0.0.1" -msgstr "" +msgstr "127.0.0.1" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:67 msgid "e.g. 5432" -msgstr "" +msgstr "5432" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:108 -#, fuzzy msgid "e.g. Analytics" msgstr "高级分析" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:172 msgid "e.g. param1=value1¶m2=value2" -msgstr "" +msgstr "例如:param1=value1¶m2=value2" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/DatabaseConnectionForm/CommonParameters.tsx:88 msgid "e.g. world_population" -msgstr "" +msgstr "世界人口" #: superset-frontend/plugins/legacy-plugin-chart-event-flow/src/controlPanel.tsx:126 -#, fuzzy msgid "e.g., a \"user id\" column" msgstr "时间序列的列" @@ -15244,7 +14688,6 @@ msgid "every hour" msgstr "每小时" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:34 -#, fuzzy msgid "every minute" msgstr "每分钟 UTC" @@ -15257,34 +14700,31 @@ msgid "feature to store a summarized data set that you can then explore." msgstr "用于存储可供浏览的汇总数据集的功能。" #: superset-frontend/src/SqlLab/components/QueryTable/index.jsx:87 -#, fuzzy msgid "fetching" -msgstr "设置" +msgstr "抓取中" #: superset-frontend/src/dashboard/components/FilterBoxMigrationModal.tsx:86 #: superset-frontend/src/dashboard/containers/DashboardPage.tsx:143 msgid "" "filter_box will be deprecated in a future version of Superset. Please " "replace filter_box by dashboard filter components." -msgstr "" +msgstr "'filter_box将在Superset的未来版本中弃用。" #: superset-frontend/src/SqlLab/components/ExploreResultsButton/index.jsx:115 msgid "following this flow will most likely lead to your query timing out. " msgstr "遵循此流程很可能会导致查询超时。" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/SqlAlchemyForm.tsx:86 -#, fuzzy msgid "for more information on how to structure your URI." msgstr " 来查询有关如何构造URI的更多信息。" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:41 msgid "green" -msgstr "" +msgstr "绿色" #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:724 #: superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx:1136 -#, fuzzy -msgid "here" +msgid "shere" msgstr "分享" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:40 @@ -15303,7 +14743,7 @@ msgstr "图像渲染画布对象的 CSS 属性,它定义了浏览器如何放 #: superset-frontend/src/components/CronPicker/CronPicker.tsx:44 msgid "in" -msgstr "" +msgstr "在" #: superset-frontend/src/explore/components/controls/TextAreaControl.jsx:122 msgid "in modal" @@ -15312,12 +14752,12 @@ msgstr "(在模型中)" #: superset-frontend/packages/superset-ui-core/src/validator/legacyValidateNumber.ts:28 #: superset-frontend/packages/superset-ui-core/src/validator/validateNumber.ts:32 msgid "is expected to be a number" -msgstr "" +msgstr "应该为数字" #: superset-frontend/packages/superset-ui-core/src/validator/legacyValidateInteger.ts:31 #: superset-frontend/packages/superset-ui-core/src/validator/validateInteger.ts:32 msgid "is expected to be an integer" -msgstr "" +msgstr "应该为为整数" #: superset-frontend/src/profile/components/UserInfo.tsx:64 msgid "joined" @@ -15330,12 +14770,12 @@ msgstr "无效 JSON" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:233 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:261 msgid "key a-z" -msgstr "" +msgstr "a-z" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:234 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:262 msgid "key z-a" -msgstr "" +msgstr "z-a" #: superset-frontend/plugins/legacy-plugin-chart-map-box/src/controlPanel.ts:152 msgid "label" @@ -15367,7 +14807,6 @@ msgstr "最新分区:" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:158 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:176 -#, fuzzy msgid "left" msgstr "警报" @@ -15386,7 +14825,6 @@ msgid "minute" msgstr "分" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:51 -#, fuzzy msgid "minute(s)" msgstr "分钟" @@ -15397,7 +14835,7 @@ msgstr "月" #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:116 #: superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx:138 msgid "must have a value" -msgstr "" +msgstr "必填" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Area/index.js:54 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/Bubble/index.js:39 @@ -15408,21 +14846,20 @@ msgstr "" #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/LineMulti/index.js:34 #: superset-frontend/plugins/legacy-preset-chart-nvd3/src/TimePivot/index.js:29 msgid "nvd3" -msgstr "" +msgstr "nvd3" #: superset-frontend/src/components/CronPicker/CronPicker.tsx:45 #: superset-frontend/src/components/CronPicker/CronPicker.tsx:46 msgid "on" -msgstr "" +msgstr "位于" #: superset/charts/schemas.py:1098 -#, fuzzy msgid "orderby column must be populated" msgstr "无法更新您的查询" #: superset-frontend/plugins/legacy-plugin-chart-paired-t-test/src/controlPanel.ts:85 msgid "p-value precision" -msgstr "" +msgstr "假定值精度" #: superset-frontend/plugins/plugin-chart-table/src/consts.ts:26 msgid "page_size.all" @@ -15438,7 +14875,7 @@ msgstr "" #: superset-frontend/plugins/legacy-plugin-chart-histogram/src/Histogram.jsx:124 msgid "percentile (exclusive)" -msgstr "" +msgstr "百分位数(独占)" #: superset/utils/pandas_postprocessing.py:921 msgid "" @@ -15463,7 +14900,6 @@ msgid "published" msgstr "已发布" #: superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx:543 -#, fuzzy msgid "queries" msgstr "序列" @@ -15476,14 +14912,12 @@ msgid "reboot" msgstr "重启" #: superset-frontend/src/views/CRUD/welcome/EmptyState.tsx:28 -#, fuzzy msgid "recents" msgstr "最近" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:43 -#, fuzzy msgid "red" -msgstr "开始时间" +msgstr "红色" #: superset-frontend/src/views/CRUD/alert/AlertList.tsx:90 #: superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx:484 @@ -15499,7 +14933,6 @@ msgstr "报告" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:160 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:178 -#, fuzzy msgid "right" msgstr "高度" @@ -15532,8 +14965,7 @@ msgstr "文本区域" #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:159 #: superset-frontend/plugins/plugin-chart-echarts/src/Tree/controlPanel.tsx:177 -#, fuzzy -msgid "top" +msgid "stop" msgstr "停止" #: superset/charts/schemas.py:639 @@ -15544,13 +14976,11 @@ msgstr "上百分位数必须大于0且小于100。而且必须高于下百分 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:235 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:263 -#, fuzzy msgid "value ascending" msgstr "指标升序" #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:236 #: superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/controlPanel.tsx:264 -#, fuzzy msgid "value descending" msgstr "指标降序" @@ -15573,3 +15003,57 @@ msgstr "年" #: superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx:42 msgid "yellow" msgstr "黄色" + +msgid "Upload file to database" +msgstr "上传文件到数据库" + +msgid "Select or type a value" +msgstr "选择或者输入值" + +msgid "Connect database" +msgstr "连接数据库" + +msgid "Upload columnar file to database" +msgstr "上传列级文件" + +msgid "Upload CSV" +msgstr "上传CSV" + +msgid "Upload columnar file" +msgstr "上传列级文件" + +msgid "Upload Excel file" +msgstr "上传Excel" + +msgid "Handlebars" +msgstr "句柄图" + +msgid "deck.gl Arc" +msgstr "圆弧图" + +msgid "Import database from file" +msgstr "从文件中导入数据库" + +msgid "Select a database to connect" +msgstr "选择将要连接的数据库" + +msgid "Select a database to write a query" +msgstr "选择要写入查询的数据库" + +msgid "Choose one of the available databases from the panel on the left." +msgstr "从左侧的面板中选择一个可用的数据库" + +msgid "Add a new tab" +msgstr "添加新的标签页" + +msgid "There are no databases available" +msgstr "没有可用的数据库" + +msgid "No databases match your search" +msgstr "没有与您的搜索匹配的数据库" + +msgid "Manage your databases" +msgstr "管理你的数据库" + +msgid "here" +msgstr "这里" diff --git a/superset/utils/async_query_manager.py b/superset/utils/async_query_manager.py index f823fb394e9a..71559aaa3dcb 100644 --- a/superset/utils/async_query_manager.py +++ b/superset/utils/async_query_manager.py @@ -17,11 +17,13 @@ import json import logging import uuid -from typing import Any, Dict, List, Optional, Tuple +from typing import Any, Dict, List, Literal, Optional, Tuple import jwt import redis -from flask import Flask, g, request, Request, Response, session +from flask import Flask, request, Request, Response, session + +from superset.utils.core import get_user_id logger = logging.getLogger(__name__) @@ -35,12 +37,12 @@ class AsyncQueryJobException(Exception): def build_job_metadata( - channel_id: str, job_id: str, user_id: Optional[str], **kwargs: Any + channel_id: str, job_id: str, user_id: Optional[int], **kwargs: Any ) -> Dict[str, Any]: return { "channel_id": channel_id, "job_id": job_id, - "user_id": int(user_id) if user_id else None, + "user_id": user_id, "status": kwargs.get("status"), "errors": kwargs.get("errors", []), "result_url": kwargs.get("result_url"), @@ -75,9 +77,10 @@ def __init__(self) -> None: self._stream_prefix: str = "" self._stream_limit: Optional[int] self._stream_limit_firehose: Optional[int] - self._jwt_cookie_name: str + self._jwt_cookie_name: str = "" self._jwt_cookie_secure: bool = False self._jwt_cookie_domain: Optional[str] + self._jwt_cookie_samesite: Optional[Literal["None", "Lax", "Strict"]] = None self._jwt_secret: str def init_app(self, app: Flask) -> None: @@ -108,18 +111,13 @@ def init_app(self, app: Flask) -> None: ] self._jwt_cookie_name = config["GLOBAL_ASYNC_QUERIES_JWT_COOKIE_NAME"] self._jwt_cookie_secure = config["GLOBAL_ASYNC_QUERIES_JWT_COOKIE_SECURE"] + self._jwt_cookie_samesite = config["GLOBAL_ASYNC_QUERIES_JWT_COOKIE_SAMESITE"] self._jwt_cookie_domain = config["GLOBAL_ASYNC_QUERIES_JWT_COOKIE_DOMAIN"] self._jwt_secret = config["GLOBAL_ASYNC_QUERIES_JWT_SECRET"] @app.after_request def validate_session(response: Response) -> Response: - user_id = None - - try: - user_id = g.user.get_id() - user_id = int(user_id) - except Exception: # pylint: disable=broad-except - pass + user_id = get_user_id() reset_token = ( not request.cookies.get(self._jwt_cookie_name) @@ -146,6 +144,7 @@ def validate_session(response: Response) -> Response: httponly=True, secure=self._jwt_cookie_secure, domain=self._jwt_cookie_domain, + samesite=self._jwt_cookie_samesite, ) return response @@ -161,7 +160,7 @@ def parse_jwt_from_request(self, req: Request) -> Dict[str, Any]: logger.warning("Parse jwt failed", exc_info=True) raise AsyncQueryTokenException("Failed to parse token") from ex - def init_job(self, channel_id: str, user_id: Optional[str]) -> Dict[str, Any]: + def init_job(self, channel_id: str, user_id: Optional[int]) -> Dict[str, Any]: job_id = str(uuid.uuid4()) return build_job_metadata( channel_id, job_id, user_id, status=self.STATUS_PENDING diff --git a/superset/utils/core.py b/superset/utils/core.py index 76e566a895f8..6f86372f753f 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -16,6 +16,8 @@ # under the License. """Utility functions used across Superset""" # pylint: disable=too-many-lines +from __future__ import annotations + import _thread import collections import decimal @@ -34,6 +36,7 @@ import uuid import zlib from contextlib import contextmanager +from dataclasses import dataclass from datetime import date, datetime, time, timedelta from distutils.util import strtobool from email.mime.application import MIMEApplication @@ -71,9 +74,8 @@ import numpy as np import pandas as pd import sqlalchemy as sa -from cryptography import x509 from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.backends.openssl.x509 import _Certificate +from cryptography.x509 import Certificate, load_pem_x509_certificate from flask import current_app, flash, g, Markup, render_template, request from flask_appbuilder import SQLA from flask_appbuilder.security.sqla.models import Role, User @@ -93,6 +95,7 @@ EXTRA_FORM_DATA_APPEND_KEYS, EXTRA_FORM_DATA_OVERRIDE_EXTRA_KEYS, EXTRA_FORM_DATA_OVERRIDE_REGULAR_MAPPINGS, + NO_TIME_RANGE, ) from superset.errors import ErrorLevel, SupersetErrorType from superset.exceptions import ( @@ -112,6 +115,7 @@ Metric, ) from superset.utils.database import get_example_database +from superset.utils.date_parser import parse_human_timedelta from superset.utils.dates import datetime_to_epoch, EPOCH from superset.utils.hashing import md5_sha_from_dict, md5_sha_from_str @@ -128,14 +132,14 @@ DTTM_ALIAS = "__timestamp" -NO_TIME_RANGE = "No filter" - TIME_COMPARISON = "__" JS_MAX_INTEGER = 9007199254740991 # Largest int Java Script can handle 2^53-1 InputType = TypeVar("InputType") +ADHOC_FILTERS_REGEX = re.compile("^adhoc_filters") + class LenientEnum(Enum): """Enums with a `get` method that convert a enum value to `Enum` if it is a @@ -185,6 +189,21 @@ class DatasourceType(str, Enum): VIEW = "view" +class LoggerLevel(str, Enum): + INFO = "info" + WARNING = "warning" + EXCEPTION = "exception" + + +class HeaderDataType(TypedDict): + notification_format: str + owners: List[int] + notification_type: str + notification_source: Optional[str] + chart_id: Optional[int] + dashboard_id: Optional[int] + + class DatasourceDict(TypedDict): type: str # todo(hugh): update this to be DatasourceType id: int @@ -220,7 +239,6 @@ class ExtraFiltersTimeColumnType(str, Enum): class ExtraFiltersReasonType(str, Enum): NO_TEMPORAL_COLUMN = "no_temporal_column" COL_NOT_IN_DATASOURCE = "not_in_datasource" - NOT_DRUID_DATASOURCE = "not_druid_datasource" class FilterOperator(str, Enum): @@ -243,6 +261,7 @@ class FilterOperator(str, Enum): REGEX = "REGEX" IS_TRUE = "IS TRUE" IS_FALSE = "IS FALSE" + TEMPORAL_RANGE = "TEMPORAL_RANGE" class FilterStringOperators(str, Enum): @@ -345,24 +364,9 @@ class RowLevelSecurityFilterType(str, Enum): BASE = "Base" -class TemporalType(str, Enum): - """ - Supported temporal types - """ - - DATE = "DATE" - DATETIME = "DATETIME" - SMALLDATETIME = "SMALLDATETIME" - TEXT = "TEXT" - TIME = "TIME" - TIME_WITH_TIME_ZONE = "TIME WITH TIME ZONE" - TIMESTAMP = "TIMESTAMP" - TIMESTAMP_WITH_TIME_ZONE = "TIMESTAMP WITH TIME ZONE" - - class ColumnTypeSource(Enum): GET_TABLE = 1 - CURSOR_DESCRIPION = 2 + CURSOR_DESCRIPTION = 2 class ColumnSpec(NamedTuple): @@ -409,7 +413,7 @@ def parse_js_uri_path_item( :param item: a uri path component :param unquote: Perform unquoting of string using urllib.parse.unquote_plus() - :param eval_undefined: When set to True and item is either 'null' or 'undefined', + :param eval_undefined: When set to True and item is either 'null' or 'undefined', assume item is undefined and return None. :return: Either None, the original item or unquoted item """ @@ -542,9 +546,16 @@ def format_timedelta(time_delta: timedelta) -> str: return str(time_delta) -def base_json_conv( # pylint: disable=inconsistent-return-statements - obj: Any, -) -> Any: +def base_json_conv(obj: Any) -> Any: + """ + Tries to convert additional types to JSON compatible forms. + + :param obj: The serializable object + :returns: The JSON compatible form + :raises TypeError: If the object cannot be serialized + :see: https://docs.python.org/3/library/json.html#encoders-and-decoders + """ + if isinstance(obj, memoryview): obj = obj.tobytes() if isinstance(obj, np.int64): @@ -567,51 +578,65 @@ def base_json_conv( # pylint: disable=inconsistent-return-statements except Exception: # pylint: disable=broad-except return "[bytes]" + raise TypeError(f"Unserializable object {obj} of type {type(obj)}") -def json_iso_dttm_ser(obj: Any, pessimistic: bool = False) -> str: + +def json_iso_dttm_ser(obj: Any, pessimistic: bool = False) -> Any: """ - json serializer that deals with dates + A JSON serializer that deals with dates by serializing them to ISO 8601. + + >>> json.dumps({'dttm': datetime(1970, 1, 1)}, default=json_iso_dttm_ser) + '{"dttm": "1970-01-01T00:00:00"}' - >>> dttm = datetime(1970, 1, 1) - >>> json.dumps({'dttm': dttm}, default=json_iso_dttm_ser) - '{"dttm": "1970-01-01T00:00:00"}' + :param obj: The serializable object + :param pessimistic: Whether to be pessimistic regarding serialization + :returns: The JSON compatible form + :raises TypeError: If the non-pessimistic object cannot be serialized """ - val = base_json_conv(obj) - if val is not None: - return val + if isinstance(obj, (datetime, date, pd.Timestamp)): - obj = obj.isoformat() - else: + return obj.isoformat() + + try: + return base_json_conv(obj) + except TypeError as ex: if pessimistic: - return "Unserializable [{}]".format(type(obj)) + return f"Unserializable [{type(obj)}]" - raise TypeError("Unserializable object {} of type {}".format(obj, type(obj))) - return obj + raise ex -def pessimistic_json_iso_dttm_ser(obj: Any) -> str: +def pessimistic_json_iso_dttm_ser(obj: Any) -> Any: """Proxy to call json_iso_dttm_ser in a pessimistic way If one of object is not serializable to json, it will still succeed""" return json_iso_dttm_ser(obj, pessimistic=True) -def json_int_dttm_ser(obj: Any) -> float: - """json serializer that deals with dates""" - val = base_json_conv(obj) - if val is not None: - return val +def json_int_dttm_ser(obj: Any) -> Any: + """ + A JSON serializer that deals with dates by serializing them to EPOCH. + + >>> json.dumps({'dttm': datetime(1970, 1, 1)}, default=json_int_dttm_ser) + '{"dttm": 0.0}' + + :param obj: The serializable object + :returns: The JSON compatible form + :raises TypeError: If the object cannot be serialized + """ + if isinstance(obj, (datetime, pd.Timestamp)): - obj = datetime_to_epoch(obj) - elif isinstance(obj, date): - obj = (obj - EPOCH.date()).total_seconds() * 1000 - else: - raise TypeError("Unserializable object {} of type {}".format(obj, type(obj))) - return obj + return datetime_to_epoch(obj) + + if isinstance(obj, date): + return (obj - EPOCH.date()).total_seconds() * 1000 + return base_json_conv(obj) -def json_dumps_w_dates(payload: Dict[Any, Any]) -> str: - return json.dumps(payload, default=json_int_dttm_ser) + +def json_dumps_w_dates(payload: Dict[Any, Any], sort_keys: bool = False) -> str: + """Dumps payload to JSON with Datetime objects properly converted""" + return json.dumps(payload, default=json_int_dttm_ser, sort_keys=sort_keys) def error_msg_from_exception(ex: Exception) -> str: @@ -905,6 +930,7 @@ def send_email_smtp( # pylint: disable=invalid-name,too-many-arguments,too-many cc: Optional[str] = None, bcc: Optional[str] = None, mime_subtype: str = "mixed", + header_data: Optional[HeaderDataType] = None, ) -> None: """ Send an email with html content, eg: @@ -918,6 +944,7 @@ def send_email_smtp( # pylint: disable=invalid-name,too-many-arguments,too-many msg["Subject"] = subject msg["From"] = smtp_mail_from msg["To"] = ", ".join(smtp_mail_to) + msg.preamble = "This is a multi-part message in MIME format." recipients = smtp_mail_to @@ -964,8 +991,10 @@ def send_email_smtp( # pylint: disable=invalid-name,too-many-arguments,too-many image.add_header("Content-ID", "<%s>" % msgid) image.add_header("Content-Disposition", "inline") msg.attach(image) - - send_mime_email(smtp_mail_from, recipients, msg, config, dryrun=dryrun) + msg_mutator = config["EMAIL_HEADER_MUTATOR"] + # the base notification returns the message without any editing. + new_msg = msg_mutator(msg, **(header_data or {})) + send_mime_email(smtp_mail_from, recipients, new_msg, config, dryrun=dryrun) def send_mime_email( @@ -981,7 +1010,7 @@ def send_mime_email( smtp_password = config["SMTP_PASSWORD"] smtp_starttls = config["SMTP_STARTTLS"] smtp_ssl = config["SMTP_SSL"] - smpt_ssl_server_auth = config["SMTP_SSL_SERVER_AUTH"] + smtp_ssl_server_auth = config["SMTP_SSL_SERVER_AUTH"] if dryrun: logger.info("Dryrun enabled, email notification content is below:") @@ -990,7 +1019,7 @@ def send_mime_email( # Default ssl context is SERVER_AUTH using the default system # root CA certificates - ssl_context = ssl.create_default_context() if smpt_ssl_server_auth else None + ssl_context = ssl.create_default_context() if smtp_ssl_server_auth else None smtp = ( smtplib.SMTP_SSL(smtp_host, smtp_port, context=ssl_context) if smtp_ssl @@ -1137,8 +1166,7 @@ def merge_extra_filters(form_data: Dict[str, Any]) -> None: # that are external to the slice definition. We use those for dynamic # interactive filters like the ones emitted by the "Filter Box" visualization. # Note extra_filters only support simple filters. - applied_time_extras: Dict[str, str] = {} - form_data["applied_time_extras"] = applied_time_extras + form_data.setdefault("applied_time_extras", {}) adhoc_filters = form_data.get("adhoc_filters", []) form_data["adhoc_filters"] = adhoc_filters merge_extra_form_data(form_data) @@ -1151,7 +1179,6 @@ def merge_extra_filters(form_data: Dict[str, Any]) -> None: "__time_range": "time_range", "__time_col": "granularity_sqla", "__time_grain": "time_grain_sqla", - "__time_origin": "druid_time_origin", "__granularity": "granularity", } # Grab list of existing filters 'keyed' on the column and operator @@ -1182,7 +1209,7 @@ def get_filter_key(f: Dict[str, Any]) -> str: time_extra_value = filtr.get("val") if time_extra_value and time_extra_value != NO_TIME_RANGE: form_data[time_extra] = time_extra_value - applied_time_extras[filter_column] = time_extra_value + form_data["applied_time_extras"][filter_column] = time_extra_value elif filtr["val"]: # Merge column filters filter_key = get_filter_key(filtr) @@ -1240,8 +1267,8 @@ def get_example_default_schema() -> Optional[str]: Return the default schema of the examples database, if any. """ database = get_example_database() - engine = database.get_sqla_engine() - return inspect(engine).default_schema_name + with database.get_sqla_engine_with_context() as engine: + return inspect(engine).default_schema_name def backend() -> str: @@ -1267,6 +1294,11 @@ def get_base_axis_labels(columns: Optional[List[Column]]) -> Tuple[str, ...]: return tuple(get_column_name(col) for col in axis_cols) +def get_xaxis_label(columns: Optional[List[Column]]) -> Optional[str]: + labels = get_base_axis_labels(columns) + return labels[0] if labels else None + + def get_column_name( column: Column, verbose_map: Optional[Dict[str, Any]] = None ) -> str: @@ -1286,9 +1318,12 @@ def get_column_name( expr = column.get("sqlExpression") if expr: return expr - raise ValueError("Missing label") - verbose_map = verbose_map or {} - return verbose_map.get(column, column) + + if isinstance(column, str): + verbose_map = verbose_map or {} + return verbose_map.get(column, column) + + raise ValueError("Missing label") def get_metric_name( @@ -1312,7 +1347,7 @@ def get_metric_name( sql_expression = metric.get("sqlExpression") if sql_expression: return sql_expression - elif expression_type == "SIMPLE": + if expression_type == "SIMPLE": column: AdhocMetricColumn = metric.get("column") or {} column_name = column.get("column_name") aggregate = metric.get("aggregate") @@ -1320,10 +1355,12 @@ def get_metric_name( return f"{aggregate}({column_name})" if column_name: return column_name - raise ValueError(__("Invalid metric object")) - verbose_map = verbose_map or {} - return verbose_map.get(metric, metric) # type: ignore + if isinstance(metric, str): + verbose_map = verbose_map or {} + return verbose_map.get(metric, metric) + + raise ValueError(__("Invalid metric object: %(metric)s", metric=str(metric))) def get_column_names( @@ -1439,38 +1476,65 @@ def split_adhoc_filters_into_base_filters( # pylint: disable=invalid-name def get_username() -> Optional[str]: - """Get username if within the flask context, otherwise return noffin'""" + """ + Get username (if defined) associated with the current user. + + :returns: The username + """ + try: return g.user.username except Exception: # pylint: disable=broad-except return None +def get_user_id() -> Optional[int]: + """ + Get the user identifier (if defined) associated with the current user. + + Though the Flask-AppBuilder `User` and Flask-Login `AnonymousUserMixin` and + `UserMixin` models provide a convenience `get_id` method, for generality, the + identifier is encoded as a `str` whereas in Superset all identifiers are encoded as + an `int`. + + returns: The user identifier + """ + + try: + return g.user.id + except Exception: # pylint: disable=broad-except + return None + + @contextmanager -def override_user(user: Optional[User]) -> Iterator[Any]: +def override_user(user: Optional[User], force: bool = True) -> Iterator[Any]: """ - Temporarily override the current user (if defined) per `flask.g`. + Temporarily override the current user per `flask.g` with the specified user. Sometimes, often in the context of async Celery tasks, it is useful to switch the current user (which may be undefined) to different one, execute some SQLAlchemy - tasks and then revert back to the original one. + tasks et al. and then revert back to the original one. :param user: The override user + :param force: Whether to override the current user if set """ # pylint: disable=assigning-non-slot if hasattr(g, "user"): - current = g.user - g.user = user - yield - g.user = current + if force or g.user is None: + current = g.user + g.user = user + yield + g.user = current + else: + yield else: g.user = user yield delattr(g, "user") -def parse_ssl_cert(certificate: str) -> _Certificate: +def parse_ssl_cert(certificate: str) -> Certificate: """ Parses the contents of a certificate and returns a valid certificate object if valid. @@ -1480,9 +1544,7 @@ def parse_ssl_cert(certificate: str) -> _Certificate: :raises CertificateException: If certificate is not valid/unparseable """ try: - return x509.load_pem_x509_certificate( - certificate.encode("utf-8"), default_backend() - ) + return load_pem_x509_certificate(certificate.encode("utf-8"), default_backend()) except ValueError as ex: raise CertificateException("Invalid certificate") from ex @@ -1665,21 +1727,31 @@ def extract_dataframe_dtypes( "date": GenericDataType.TEMPORAL, } - columns_by_name = ( - {column.column_name: column for column in datasource.columns} - if datasource - else {} - ) + columns_by_name: Dict[str, Any] = {} + if datasource: + for column in datasource.columns: + if isinstance(column, dict): + columns_by_name[column.get("column_name")] = column + else: + columns_by_name[column.column_name] = column + generic_types: List[GenericDataType] = [] for column in df.columns: column_object = columns_by_name.get(column) series = df[column] inferred_type = infer_dtype(series) - generic_type = ( - GenericDataType.TEMPORAL - if column_object and column_object.is_dttm - else inferred_type_map.get(inferred_type, GenericDataType.STRING) - ) + if isinstance(column_object, dict): + generic_type = ( + GenericDataType.TEMPORAL + if column_object and column_object.get("is_dttm") + else inferred_type_map.get(inferred_type, GenericDataType.STRING) + ) + else: + generic_type = ( + GenericDataType.TEMPORAL + if column_object and column_object.is_dttm + else inferred_type_map.get(inferred_type, GenericDataType.STRING) + ) generic_types.append(generic_type) return generic_types @@ -1713,7 +1785,16 @@ def get_time_filter_status( datasource: "BaseDatasource", applied_time_extras: Dict[str, str], ) -> Tuple[List[Dict[str, str]], List[Dict[str, str]]]: - temporal_columns = {col.column_name for col in datasource.columns if col.is_dttm} + + temporal_columns: Set[Any] + if datasource.type == "query": + temporal_columns = { + col.get("column_name") for col in datasource.columns if col.get("is_dttm") + } + else: + temporal_columns = { + col.column_name for col in datasource.columns if col.is_dttm + } applied: List[Dict[str, str]] = [] rejected: List[Dict[str, str]] = [] time_column = applied_time_extras.get(ExtraFiltersTimeColumnType.TIME_COL) @@ -1753,28 +1834,6 @@ def get_time_filter_status( } ) - if ExtraFiltersTimeColumnType.TIME_ORIGIN in applied_time_extras: - if datasource.type == "druid": - applied.append({"column": ExtraFiltersTimeColumnType.TIME_ORIGIN}) - else: - rejected.append( - { - "reason": ExtraFiltersReasonType.NOT_DRUID_DATASOURCE, - "column": ExtraFiltersTimeColumnType.TIME_ORIGIN, - } - ) - - if ExtraFiltersTimeColumnType.GRANULARITY in applied_time_extras: - if datasource.type == "druid": - applied.append({"column": ExtraFiltersTimeColumnType.GRANULARITY}) - else: - rejected.append( - { - "reason": ExtraFiltersReasonType.NOT_DRUID_DATASOURCE, - "column": ExtraFiltersTimeColumnType.GRANULARITY, - } - ) - return applied, rejected @@ -1804,33 +1863,64 @@ def remove_duplicates( return result +@dataclass +class DateColumn: + col_label: str + timestamp_format: Optional[str] = None + offset: Optional[int] = None + time_shift: Optional[str] = None + + def __hash__(self) -> int: + return hash(self.col_label) + + def __eq__(self, other: object) -> bool: + return isinstance(other, DateColumn) and hash(self) == hash(other) + + @classmethod + def get_legacy_time_column( + cls, + timestamp_format: Optional[str], + offset: Optional[int], + time_shift: Optional[str], + ) -> DateColumn: + return cls( + timestamp_format=timestamp_format, + offset=offset, + time_shift=time_shift, + col_label=DTTM_ALIAS, + ) + + def normalize_dttm_col( df: pd.DataFrame, - timestamp_format: Optional[str], - offset: int, - time_shift: Optional[timedelta], + dttm_cols: Tuple[DateColumn, ...] = tuple(), ) -> None: - if DTTM_ALIAS not in df.columns: - return - if timestamp_format in ("epoch_s", "epoch_ms"): - dttm_col = df[DTTM_ALIAS] - if is_numeric_dtype(dttm_col): - # Column is formatted as a numeric value - unit = timestamp_format.replace("epoch_", "") - df[DTTM_ALIAS] = pd.to_datetime( - dttm_col, utc=False, unit=unit, origin="unix", errors="coerce" - ) + for _col in dttm_cols: + if _col.col_label not in df.columns: + continue + + if _col.timestamp_format in ("epoch_s", "epoch_ms"): + dttm_series = df[_col.col_label] + if is_numeric_dtype(dttm_series): + # Column is formatted as a numeric value + unit = _col.timestamp_format.replace("epoch_", "") + df[_col.col_label] = pd.to_datetime( + dttm_series, utc=False, unit=unit, origin="unix", errors="coerce" + ) + else: + # Column has already been formatted as a timestamp. + df[_col.col_label] = dttm_series.apply(pd.Timestamp) else: - # Column has already been formatted as a timestamp. - df[DTTM_ALIAS] = dttm_col.apply(pd.Timestamp) - else: - df[DTTM_ALIAS] = pd.to_datetime( - df[DTTM_ALIAS], utc=False, format=timestamp_format, errors="coerce" - ) - if offset: - df[DTTM_ALIAS] += timedelta(hours=offset) - if time_shift is not None: - df[DTTM_ALIAS] += time_shift + df[_col.col_label] = pd.to_datetime( + df[_col.col_label], + utc=False, + format=_col.timestamp_format, + errors="coerce", + ) + if _col.offset: + df[_col.col_label] += timedelta(hours=_col.offset) + if _col.time_shift is not None: + df[_col.col_label] += parse_human_timedelta(_col.time_shift) def parse_boolean_string(bool_str: Optional[str]) -> bool: @@ -1898,3 +1988,16 @@ def create_zip(files: Dict[str, Any]) -> BytesIO: fp.write(contents) buf.seek(0) return buf + + +def remove_extra_adhoc_filters(form_data: Dict[str, Any]) -> None: + """ + Remove filters from slice data that originate from a filter box or native filter + """ + adhoc_filters = { + key: value for key, value in form_data.items() if ADHOC_FILTERS_REGEX.match(key) + } + for key, value in adhoc_filters.items(): + form_data[key] = [ + filter_ for filter_ in value or [] if not filter_.get("isExtra") + ] diff --git a/superset/utils/csv.py b/superset/utils/csv.py index 914ab8cf5623..54f30362fede 100644 --- a/superset/utils/csv.py +++ b/superset/utils/csv.py @@ -14,6 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +import logging import re import urllib.request from typing import Any, Dict, Optional @@ -23,6 +24,10 @@ import pandas as pd import simplejson +from superset.utils.core import GenericDataType + +logger = logging.getLogger(__name__) + negative_number_re = re.compile(r"^-[0-9.]+$") # This regex will match if the string starts with: @@ -102,11 +107,22 @@ def get_chart_dataframe( return None result = simplejson.loads(content.decode("utf-8")) - # need to convert float value to string to show full long number pd.set_option("display.float_format", lambda x: str(x)) df = pd.DataFrame.from_dict(result["result"][0]["data"]) + try: + # if any column type is equal to 2, need to convert data into + # datetime timestamp for that column. + if GenericDataType.TEMPORAL in result["result"][0]["coltypes"]: + for i in range(len(result["result"][0]["coltypes"])): + if result["result"][0]["coltypes"][i] == GenericDataType.TEMPORAL: + df[result["result"][0]["colnames"][i]] = df[ + result["result"][0]["colnames"][i] + ].astype("datetime64[ms]") + except BaseException as err: + logger.error(err) + # rebuild hierarchical columns and index df.columns = pd.MultiIndex.from_tuples( tuple(colname) if isinstance(colname, list) else (colname,) diff --git a/superset/utils/dashboard_filter_scopes_converter.py b/superset/utils/dashboard_filter_scopes_converter.py index db897fa64c5a..3aeb32360a77 100644 --- a/superset/utils/dashboard_filter_scopes_converter.py +++ b/superset/utils/dashboard_filter_scopes_converter.py @@ -63,10 +63,6 @@ def add_filter_scope( add_filter_scope(filter_fields, "__time_col", filter_id) if slice_params.get("show_sqla_time_granularity"): add_filter_scope(filter_fields, "__time_grain", filter_id) - if slice_params.get("show_druid_time_granularity"): - add_filter_scope(filter_fields, "__granularity", filter_id) - if slice_params.get("show_druid_time_origin"): - add_filter_scope(filter_fields, "druid_time_origin", filter_id) for config in configs: add_filter_scope(filter_fields, config.get("column"), filter_id) diff --git a/superset/utils/database.py b/superset/utils/database.py index 1375611ab877..750d873d1c9c 100644 --- a/superset/utils/database.py +++ b/superset/utils/database.py @@ -39,10 +39,7 @@ def get_or_create_db( from superset.models import core as models database = ( - db.session.query(models.Database) - .filter_by(database_name=database_name) - .autoflush(False) - .first() + db.session.query(models.Database).filter_by(database_name=database_name).first() ) # databases with a fixed UUID @@ -56,8 +53,11 @@ def get_or_create_db( database_name=database_name, uuid=uuids.get(database_name) ) db.session.add(database) + database.set_sqlalchemy_uri(sqlalchemy_uri) + db.session.commit() - if database: + # todo: it's a bad idea to do an update in a get/create function + if database and database.sqlalchemy_uri_decrypted != sqlalchemy_uri: database.set_sqlalchemy_uri(sqlalchemy_uri) db.session.commit() diff --git a/superset/utils/date_parser.py b/superset/utils/date_parser.py index 69f7542cdeba..a300117a55a3 100644 --- a/superset/utils/date_parser.py +++ b/superset/utils/date_parser.py @@ -25,8 +25,9 @@ import parsedatetime from dateutil.parser import parse from dateutil.relativedelta import relativedelta +from flask import current_app as app from flask_babel import lazy_gettext as _ -from holidays import CountryHoliday +from holidays import country_holidays from pyparsing import ( CaselessKeyword, Forward, @@ -40,13 +41,12 @@ Suppress, ) -from superset import app from superset.charts.commands.exceptions import ( TimeDeltaAmbiguousError, TimeRangeAmbiguousError, TimeRangeParseFailError, ) -from superset.utils.core import NO_TIME_RANGE +from superset.constants import NO_TIME_RANGE from superset.utils.memoized import memoized ParserElement.enablePackrat() @@ -175,7 +175,7 @@ def get_since_until( # pylint: disable=too-many-arguments,too-many-locals,too-m - Next X seconds/minutes/hours/days/weeks/months/years """ - config = app.config # type: ignore + config = app.config default_relative_start = config["DEFAULT_RELATIVE_START_TIME"] default_relative_end = config["DEFAULT_RELATIVE_END_TIME"] @@ -183,7 +183,7 @@ def get_since_until( # pylint: disable=too-many-arguments,too-many-locals,too-m _relative_start = relative_start if relative_start else default_relative_start _relative_end = relative_end if relative_end else default_relative_end - if time_range == NO_TIME_RANGE: + if time_range == NO_TIME_RANGE or time_range == _(NO_TIME_RANGE): return None, None if time_range and time_range.startswith("Last") and separator not in time_range: @@ -390,7 +390,7 @@ def eval(self) -> datetime: holiday_year = dttm.year if dttm else parse_human_datetime("today").year country = country.eval() if country else "US" - holiday_lookup = CountryHoliday(country, years=[holiday_year], observed=False) + holiday_lookup = country_holidays(country, years=[holiday_year], observed=False) searched_result = holiday_lookup.get_named(holiday) if len(searched_result) == 1: return dttm_from_timetuple(searched_result[0].timetuple()) diff --git a/superset/utils/dates.py b/superset/utils/dates.py index 021ec7f07c60..b2b422a1f094 100644 --- a/superset/utils/dates.py +++ b/superset/utils/dates.py @@ -22,6 +22,7 @@ def datetime_to_epoch(dttm: datetime) -> float: + """Convert datetime to milliseconds to epoch""" if dttm.tzinfo: dttm = dttm.replace(tzinfo=pytz.utc) epoch_with_tz = pytz.utc.localize(EPOCH) diff --git a/superset/utils/decorators.py b/superset/utils/decorators.py index f14335f2cada..073139574cd6 100644 --- a/superset/utils/decorators.py +++ b/superset/utils/decorators.py @@ -45,7 +45,17 @@ def wrapped(*args: Any, **kwargs: Any) -> Any: current_app.config["STATS_LOGGER"].gauge(f"{metric_prefix_}.ok", 1) return result except Exception as ex: - current_app.config["STATS_LOGGER"].gauge(f"{metric_prefix_}.error", 1) + if ( + hasattr(ex, "status") + and ex.status < 500 # type: ignore # pylint: disable=no-member + ): + current_app.config["STATS_LOGGER"].gauge( + f"{metric_prefix_}.warning", 1 + ) + else: + current_app.config["STATS_LOGGER"].gauge( + f"{metric_prefix_}.error", 1 + ) raise ex return wrapped diff --git a/superset/utils/encrypt.py b/superset/utils/encrypt.py index 7c93764f691b..0c230c6cd924 100644 --- a/superset/utils/encrypt.py +++ b/superset/utils/encrypt.py @@ -19,8 +19,9 @@ from typing import Any, Dict, List, Optional from flask import Flask +from flask_babel import lazy_gettext as _ from sqlalchemy import text, TypeDecorator -from sqlalchemy.engine import Connection, Dialect, RowProxy +from sqlalchemy.engine import Connection, Dialect, Row from sqlalchemy_utils import EncryptedType logger = logging.getLogger(__name__) @@ -109,18 +110,24 @@ def _read_bytes(col_name: str, value: Any) -> Optional[bytes]: return bytes(value.encode("utf8")) # Just bail if we haven't seen this type before... - raise ValueError(f"DB column {col_name} has unknown type: {type(value)}") + raise ValueError( + _( + "DB column %(col_name)s has unknown type: %(value_type)s", + col_name=col_name, + value_type=type(value), + ) + ) @staticmethod def _select_columns_from_table( conn: Connection, column_names: List[str], table_name: str - ) -> RowProxy: + ) -> Row: return conn.execute(f"SELECT id, {','.join(column_names)} FROM {table_name}") def _re_encrypt_row( self, conn: Connection, - row: RowProxy, + row: Row, table_name: str, columns: Dict[str, EncryptedType], ) -> None: diff --git a/superset/utils/excel.py b/superset/utils/excel.py new file mode 100644 index 000000000000..1f68031b6497 --- /dev/null +++ b/superset/utils/excel.py @@ -0,0 +1,29 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import io +from typing import Any + +import pandas as pd + + +def df_to_excel(df: pd.DataFrame, **kwargs: Any) -> Any: + output = io.BytesIO() + # pylint: disable=abstract-class-instantiated + with pd.ExcelWriter(output, engine="xlsxwriter") as writer: + df.to_excel(writer, **kwargs) + + return output.getvalue() diff --git a/superset/utils/file.py b/superset/utils/file.py new file mode 100644 index 000000000000..f1bdac897eab --- /dev/null +++ b/superset/utils/file.py @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from werkzeug.utils import secure_filename + + +def get_filename(model_name: str, model_id: int, skip_id: bool = False) -> str: + slug = secure_filename(model_name) + filename = slug if skip_id else f"{slug}_{model_id}" + return filename if slug else str(model_id) diff --git a/superset/utils/log.py b/superset/utils/log.py index 4eafb669328f..f2379fe11c49 100644 --- a/superset/utils/log.py +++ b/superset/utils/log.py @@ -31,6 +31,7 @@ Dict, Iterator, Optional, + Tuple, Type, TYPE_CHECKING, Union, @@ -41,9 +42,14 @@ from sqlalchemy.exc import SQLAlchemyError from typing_extensions import Literal +from superset.extensions import stats_logger_manager +from superset.utils.core import get_user_id, LoggerLevel + if TYPE_CHECKING: from superset.stats_logger import BaseStatsLogger +logger = logging.getLogger(__name__) + def collect_request_payload() -> Dict[str, Any]: """Collect log payload identifiable from request context""" @@ -73,6 +79,24 @@ def collect_request_payload() -> Dict[str, Any]: return payload +def get_logger_from_status( + status: int, +) -> Tuple[Callable[..., None], str]: + """ + Return logger method by status of exception. + Maps logger level to status code level + """ + log_map = { + "2": LoggerLevel.INFO, + "3": LoggerLevel.INFO, + "4": LoggerLevel.WARNING, + "5": LoggerLevel.EXCEPTION, + } + log_level = log_map[str(status)[0]] + + return (getattr(logger, log_level), log_level) + + class AbstractEventLogger(ABC): def __call__( self, @@ -133,10 +157,7 @@ def log_with_context( # pylint: disable=too-many-locals duration_ms = int(duration.total_seconds() * 1000) if duration else None # Initial try and grab user_id via flask.g.user - try: - user_id = g.user.get_id() - except Exception: # pylint: disable=broad-except - user_id = None + user_id = get_user_id() # Whenever a user is not bounded to a session we # need to add them back before logging to capture user_id @@ -144,7 +165,7 @@ def log_with_context( # pylint: disable=too-many-locals try: session = current_app.appbuilder.get_session session.add(g.user) - user_id = g.user.get_id() + user_id = get_user_id() except Exception as ex: # pylint: disable=broad-except logging.warning(ex) user_id = None @@ -174,7 +195,7 @@ def log_with_context( # pylint: disable=too-many-locals slice_id = 0 if log_to_statsd: - self.stats_logger.incr(action) + stats_logger_manager.instance.incr(action) try: # bulk insert @@ -263,10 +284,6 @@ def log_this_with_extra_payload(self, f: Callable[..., Any]) -> Callable[..., An """Decorator that instrument `update_log_payload` to kwargs""" return self._wrapper(f, allow_extra_payload=True) - @property - def stats_logger(self) -> BaseStatsLogger: - return current_app.config["STATS_LOGGER"] - def get_event_logger_from_cfg_value(cfg_value: Any) -> AbstractEventLogger: """ diff --git a/superset/utils/machine_auth.py b/superset/utils/machine_auth.py index 01347f90f1c2..d58f739f7713 100644 --- a/superset/utils/machine_auth.py +++ b/superset/utils/machine_auth.py @@ -15,6 +15,8 @@ # specific language governing permissions and limitations # under the License. +from __future__ import annotations + import importlib import logging from typing import Callable, Dict, TYPE_CHECKING @@ -34,7 +36,7 @@ class MachineAuthProvider: def __init__( - self, auth_webdriver_func_override: Callable[[WebDriver, "User"], WebDriver] + self, auth_webdriver_func_override: Callable[[WebDriver, User], WebDriver] ): # This is here in order to allow for the authenticate_webdriver func to be # overridden via config, as opposed to the entire provider implementation @@ -43,7 +45,7 @@ def __init__( def authenticate_webdriver( self, driver: WebDriver, - user: "User", + user: User, ) -> WebDriver: """ Default AuthDriverFuncType type that sets a session cookie flask-login style @@ -69,7 +71,7 @@ def authenticate_webdriver( return driver @staticmethod - def get_auth_cookies(user: "User") -> Dict[str, str]: + def get_auth_cookies(user: User) -> Dict[str, str]: # Login with the user specified to get the reports with current_app.test_request_context("/login"): login_user(user) diff --git a/superset/utils/mock_data.py b/superset/utils/mock_data.py index ea83f7398251..4b156cc10c10 100644 --- a/superset/utils/mock_data.py +++ b/superset/utils/mock_data.py @@ -187,31 +187,29 @@ def add_data( database = get_example_database() table_exists = database.has_table_by_name(table_name) - engine = database.get_sqla_engine() - - if columns is None: - if not table_exists: - raise Exception( - f"The table {table_name} does not exist. To create it you need to " - "pass a list of column names and types." - ) - - inspector = inspect(engine) - columns = inspector.get_columns(table_name) - - # create table if needed - column_objects = get_column_objects(columns) - metadata = MetaData() - table = Table(table_name, metadata, *column_objects) - metadata.create_all(engine) - - if not append: - # pylint: disable=no-value-for-parameter # sqlalchemy/issues/4656 - engine.execute(table.delete()) - - data = generate_data(columns, num_rows) - # pylint: disable=no-value-for-parameter # sqlalchemy/issues/4656 - engine.execute(table.insert(), data) + + with database.get_sqla_engine_with_context() as engine: + if columns is None: + if not table_exists: + raise Exception( + f"The table {table_name} does not exist. To create it you need to " + "pass a list of column names and types." + ) + + inspector = inspect(engine) + columns = inspector.get_columns(table_name) + + # create table if needed + column_objects = get_column_objects(columns) + metadata = MetaData() + table = Table(table_name, metadata, *column_objects) + metadata.create_all(engine) + + if not append: + engine.execute(table.delete()) + + data = generate_data(columns, num_rows) + engine.execute(table.insert(), data) def get_column_objects(columns: List[ColumnInfo]) -> List[Column]: diff --git a/superset/utils/network.py b/superset/utils/network.py index 8079a96e203b..7a1aea5a7178 100644 --- a/superset/utils/network.py +++ b/superset/utils/network.py @@ -27,16 +27,19 @@ def is_port_open(host: str, port: int) -> bool: Test if a given port in a host is open. """ # pylint: disable=invalid-name - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.settimeout(PORT_TIMEOUT) - try: - s.connect((host, port)) - s.shutdown(socket.SHUT_RDWR) - return True - except socket.error: - return False - finally: - s.close() + for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): + af, _, _, _, sockaddr = res + s = socket.socket(af, socket.SOCK_STREAM) + try: + s.settimeout(PORT_TIMEOUT) + s.connect((sockaddr)) + s.shutdown(socket.SHUT_RDWR) + return True + except socket.error as _: + continue + finally: + s.close() + return False def is_hostname_valid(host: str) -> bool: @@ -44,7 +47,7 @@ def is_hostname_valid(host: str) -> bool: Test if a given hostname can be resolved. """ try: - socket.gethostbyname(host) + socket.getaddrinfo(host, None) return True except socket.gaierror: return False diff --git a/superset/utils/pandas_postprocessing/__init__.py b/superset/utils/pandas_postprocessing/__init__.py index 9755df984cc5..e66a52f6552e 100644 --- a/superset/utils/pandas_postprocessing/__init__.py +++ b/superset/utils/pandas_postprocessing/__init__.py @@ -33,7 +33,10 @@ from superset.utils.pandas_postprocessing.rolling import rolling from superset.utils.pandas_postprocessing.select import select from superset.utils.pandas_postprocessing.sort import sort -from superset.utils.pandas_postprocessing.utils import _flatten_column_after_pivot +from superset.utils.pandas_postprocessing.utils import ( + escape_separator, + unescape_separator, +) __all__ = [ "aggregate", @@ -53,5 +56,6 @@ "select", "sort", "flatten", - "_flatten_column_after_pivot", + "escape_separator", + "unescape_separator", ] diff --git a/superset/utils/pandas_postprocessing/boxplot.py b/superset/utils/pandas_postprocessing/boxplot.py index 40ce9200d358..d4c78bf15e8c 100644 --- a/superset/utils/pandas_postprocessing/boxplot.py +++ b/superset/utils/pandas_postprocessing/boxplot.py @@ -57,10 +57,10 @@ def boxplot( """ def quartile1(series: Series) -> float: - return np.nanpercentile(series, 25, interpolation="midpoint") + return np.nanpercentile(series, 25, method="midpoint") def quartile3(series: Series) -> float: - return np.nanpercentile(series, 75, interpolation="midpoint") + return np.nanpercentile(series, 75, method="midpoint") if whisker_type == PostProcessingBoxplotWhiskerType.TUKEY: @@ -99,8 +99,8 @@ def whisker_low(series: Series) -> float: return np.nanpercentile(series, low) else: - whisker_high = np.max - whisker_low = np.min + whisker_high = np.max # type: ignore + whisker_low = np.min # type: ignore def outliers(series: Series) -> Set[float]: above = series[series > whisker_high(series)] @@ -126,7 +126,7 @@ def outliers(series: Series) -> Set[float]: # nanpercentile needs numeric values, otherwise the isnan function # that's used in the underlying function will fail for column in metrics: - if df.dtypes[column] == np.object: + if df.dtypes[column] == np.object_: df[column] = to_numeric(df[column], errors="coerce") return aggregate(df, groupby=groupby, aggregates=aggregates) diff --git a/superset/utils/pandas_postprocessing/flatten.py b/superset/utils/pandas_postprocessing/flatten.py index 2874ac57970a..1026164e454e 100644 --- a/superset/utils/pandas_postprocessing/flatten.py +++ b/superset/utils/pandas_postprocessing/flatten.py @@ -22,6 +22,7 @@ from superset.utils.pandas_postprocessing.utils import ( _is_multi_index_on_columns, + escape_separator, FLAT_COLUMN_SEPARATOR, ) @@ -84,10 +85,10 @@ def flatten( _columns = [] for series in df.columns.to_flat_index(): _cells = [] - for cell in series if is_sequence(series) else [series]: + for cell in series if is_sequence(series) else [series]: # type: ignore if pd.notnull(cell): - # every cell should be converted to string - _cells.append(str(cell)) + # every cell should be converted to string and escape comma + _cells.append(escape_separator(str(cell))) _columns.append(FLAT_COLUMN_SEPARATOR.join(_cells)) df.columns = _columns diff --git a/superset/utils/pandas_postprocessing/pivot.py b/superset/utils/pandas_postprocessing/pivot.py index 89a187ce89c0..e18d58e28e4e 100644 --- a/superset/utils/pandas_postprocessing/pivot.py +++ b/superset/utils/pandas_postprocessing/pivot.py @@ -22,7 +22,6 @@ from superset.constants import NULL_STRING, PandasAxis from superset.exceptions import InvalidPostProcessingError from superset.utils.pandas_postprocessing.utils import ( - _flatten_column_after_pivot, _get_aggregate_funcs, validate_column_args, ) @@ -40,8 +39,6 @@ def pivot( # pylint: disable=too-many-arguments,too-many-locals combine_value_with_metric: bool = False, marginal_distributions: Optional[bool] = None, marginal_distribution_name: Optional[str] = None, - flatten_columns: bool = True, - reset_index: bool = True, ) -> DataFrame: """ Perform a pivot operation on a DataFrame. @@ -61,8 +58,6 @@ def pivot( # pylint: disable=too-many-arguments,too-many-locals :param marginal_distributions: Add totals for row/column. Default to False :param marginal_distribution_name: Name of row/column with marginal distribution. Default to 'All'. - :param flatten_columns: Convert column names to strings - :param reset_index: Convert index to column :return: A pivot table :raises InvalidPostProcessingError: If the request in incorrect """ @@ -114,12 +109,4 @@ def pivot( # pylint: disable=too-many-arguments,too-many-locals if combine_value_with_metric: df = df.stack(0).unstack() - # Make index regular column - if flatten_columns: - df.columns = [ - _flatten_column_after_pivot(col, aggregates) for col in df.columns - ] - # return index as regular column - if reset_index: - df.reset_index(level=0, inplace=True) return df diff --git a/superset/utils/pandas_postprocessing/sort.py b/superset/utils/pandas_postprocessing/sort.py index feacfb68ea1d..66041a7166b9 100644 --- a/superset/utils/pandas_postprocessing/sort.py +++ b/superset/utils/pandas_postprocessing/sort.py @@ -14,22 +14,34 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from typing import Dict +from typing import List, Optional, Union from pandas import DataFrame from superset.utils.pandas_postprocessing.utils import validate_column_args -@validate_column_args("columns") -def sort(df: DataFrame, columns: Dict[str, bool]) -> DataFrame: +# pylint: disable=invalid-name +@validate_column_args("by") +def sort( + df: DataFrame, + is_sort_index: bool = False, + by: Optional[Union[List[str], str]] = None, + ascending: Union[List[bool], bool] = True, +) -> DataFrame: """ Sort a DataFrame. :param df: DataFrame to sort. - :param columns: columns by by which to sort. The key specifies the column name, - value specifies if sorting in ascending order. + :param is_sort_index: Whether by index or value to sort + :param by: Name or list of names to sort by. + :param ascending: Sort ascending or descending. :return: Sorted DataFrame :raises InvalidPostProcessingError: If the request in incorrect """ - return df.sort_values(by=list(columns.keys()), ascending=list(columns.values())) + if not is_sort_index and not by: + return df + + if is_sort_index: + return df.sort_index(ascending=ascending) + return df.sort_values(by=by, ascending=ascending) diff --git a/superset/utils/pandas_postprocessing/utils.py b/superset/utils/pandas_postprocessing/utils.py index ab39135918b7..2b754fbbefae 100644 --- a/superset/utils/pandas_postprocessing/utils.py +++ b/superset/utils/pandas_postprocessing/utils.py @@ -15,16 +15,16 @@ # specific language governing permissions and limitations # under the License. from functools import partial -from typing import Any, Callable, Dict, Tuple, Union +from typing import Any, Callable, Dict, Sequence import numpy as np import pandas as pd from flask_babel import gettext as _ -from pandas import DataFrame, NamedAgg, Timestamp +from pandas import DataFrame, NamedAgg from superset.exceptions import InvalidPostProcessingError -NUMPY_FUNCTIONS = { +NUMPY_FUNCTIONS: Dict[str, Callable[..., Any]] = { "average": np.average, "argmin": np.argmin, "argmax": np.argmax, @@ -97,34 +97,18 @@ FLAT_COLUMN_SEPARATOR = ", " -def _flatten_column_after_pivot( - column: Union[float, Timestamp, str, Tuple[str, ...]], - aggregates: Dict[str, Dict[str, Any]], -) -> str: - """ - Function for flattening column names into a single string. This step is necessary - to be able to properly serialize a DataFrame. If the column is a string, return - element unchanged. For multi-element columns, join column elements with a comma, - with the exception of pivots made with a single aggregate, in which case the - aggregate column name is omitted. - - :param column: single element from `DataFrame.columns` - :param aggregates: aggregates - :return: - """ - if not isinstance(column, tuple): - column = (column,) - if len(aggregates) == 1 and len(column) > 1: - # drop aggregate for single aggregate pivots with multiple groupings - # from column name (aggregates always come first in column name) - column = column[1:] - return FLAT_COLUMN_SEPARATOR.join([str(col) for col in column]) - - def _is_multi_index_on_columns(df: DataFrame) -> bool: return isinstance(df.columns, pd.MultiIndex) +def scalar_to_sequence(val: Any) -> Sequence[str]: + if val is None: + return [] + if isinstance(val, str): + return [val] + return val + + def validate_column_args(*argnames: str) -> Callable[..., Any]: def wrapper(func: Callable[..., Any]) -> Callable[..., Any]: def wrapped(df: DataFrame, **options: Any) -> Any: @@ -135,7 +119,7 @@ def wrapped(df: DataFrame, **options: Any) -> Any: columns = df.columns.tolist() for name in argnames: if name in options and not all( - elem in columns for elem in options.get(name) or [] + elem in columns for elem in scalar_to_sequence(options.get(name)) ): raise InvalidPostProcessingError( _("Referenced columns not available in DataFrame.") @@ -222,3 +206,13 @@ def _append_columns( return _base_df append_df = append_df.rename(columns=columns) return pd.concat([base_df, append_df], axis="columns") + + +def escape_separator(plain_str: str, sep: str = FLAT_COLUMN_SEPARATOR) -> str: + char = sep.strip() + return plain_str.replace(char, "\\" + char) + + +def unescape_separator(escaped_str: str, sep: str = FLAT_COLUMN_SEPARATOR) -> str: + char = sep.strip() + return escaped_str.replace("\\" + char, char) diff --git a/superset/utils/screenshots.py b/superset/utils/screenshots.py index 7c4d372414fc..a904b7dc4384 100644 --- a/superset/utils/screenshots.py +++ b/superset/utils/screenshots.py @@ -14,6 +14,8 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +from __future__ import annotations + import logging from io import BytesIO from typing import Optional, TYPE_CHECKING, Union @@ -21,7 +23,13 @@ from flask import current_app from superset.utils.hashing import md5_sha_from_dict -from superset.utils.webdriver import WebDriverProxy, WindowSize +from superset.utils.urls import modify_url_query +from superset.utils.webdriver import ( + ChartStandaloneMode, + DashboardStandaloneMode, + WebDriverProxy, + WindowSize, +) logger = logging.getLogger(__name__) @@ -68,7 +76,7 @@ def cache_key( return md5_sha_from_dict(args) def get_screenshot( - self, user: "User", window_size: Optional[WindowSize] = None + self, user: User, window_size: Optional[WindowSize] = None ) -> Optional[bytes]: driver = self.driver(window_size) self.screenshot = driver.get_screenshot(self.url, self.element, user) @@ -76,8 +84,8 @@ def get_screenshot( def get( self, - user: "User" = None, - cache: "Cache" = None, + user: User = None, + cache: Cache = None, thumb_size: Optional[WindowSize] = None, ) -> Optional[BytesIO]: """ @@ -103,7 +111,7 @@ def get( def get_from_cache( self, - cache: "Cache", + cache: Cache, window_size: Optional[WindowSize] = None, thumb_size: Optional[WindowSize] = None, ) -> Optional[BytesIO]: @@ -111,7 +119,7 @@ def get_from_cache( return self.get_from_cache_key(cache, cache_key) @staticmethod - def get_from_cache_key(cache: "Cache", cache_key: str) -> Optional[BytesIO]: + def get_from_cache_key(cache: Cache, cache_key: str) -> Optional[BytesIO]: logger.info("Attempting to get from cache: %s", cache_key) payload = cache.get(cache_key) if payload: @@ -121,10 +129,10 @@ def get_from_cache_key(cache: "Cache", cache_key: str) -> Optional[BytesIO]: def compute_and_cache( # pylint: disable=too-many-arguments self, - user: "User" = None, + user: User = None, window_size: Optional[WindowSize] = None, thumb_size: Optional[WindowSize] = None, - cache: "Cache" = None, + cache: Cache = None, force: bool = True, ) -> Optional[bytes]: """ @@ -203,6 +211,11 @@ def __init__( window_size: Optional[WindowSize] = None, thumb_size: Optional[WindowSize] = None, ): + # Chart reports are in standalone="true" mode + url = modify_url_query( + url, + standalone=ChartStandaloneMode.HIDE_NAV.value, + ) super().__init__(url, digest) self.window_size = window_size or (800, 600) self.thumb_size = thumb_size or (800, 600) @@ -210,7 +223,7 @@ def __init__( class DashboardScreenshot(BaseScreenshot): thumbnail_type: str = "dashboard" - element: str = "grid-container" + element: str = "standalone" def __init__( self, @@ -219,6 +232,13 @@ def __init__( window_size: Optional[WindowSize] = None, thumb_size: Optional[WindowSize] = None, ): + # per the element above, dashboard screenshots + # should always capture in standalone + url = modify_url_query( + url, + standalone=DashboardStandaloneMode.REPORT.value, + ) + super().__init__(url, digest) self.window_size = window_size or (1600, 1200) self.thumb_size = thumb_size or (800, 600) diff --git a/superset/utils/ssh_tunnel.py b/superset/utils/ssh_tunnel.py new file mode 100644 index 000000000000..48ada98dccaa --- /dev/null +++ b/superset/utils/ssh_tunnel.py @@ -0,0 +1,43 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import Any, Dict + +from superset.constants import PASSWORD_MASK +from superset.databases.ssh_tunnel.models import SSHTunnel + + +def mask_password_info(ssh_tunnel: Dict[str, Any]) -> Dict[str, Any]: + if ssh_tunnel.pop("password", None) is not None: + ssh_tunnel["password"] = PASSWORD_MASK + if ssh_tunnel.pop("private_key", None) is not None: + ssh_tunnel["private_key"] = PASSWORD_MASK + if ssh_tunnel.pop("private_key_password", None) is not None: + ssh_tunnel["private_key_password"] = PASSWORD_MASK + return ssh_tunnel + + +def unmask_password_info( + ssh_tunnel: Dict[str, Any], model: SSHTunnel +) -> Dict[str, Any]: + if ssh_tunnel.get("password") == PASSWORD_MASK: + ssh_tunnel["password"] = model.password + if ssh_tunnel.get("private_key") == PASSWORD_MASK: + ssh_tunnel["private_key"] = model.private_key + if ssh_tunnel.get("private_key_password") == PASSWORD_MASK: + ssh_tunnel["private_key_password"] = model.private_key_password + return ssh_tunnel diff --git a/superset/utils/url_map_converters.py b/superset/utils/url_map_converters.py index c6a14f3fd804..c5eaf3b359f0 100644 --- a/superset/utils/url_map_converters.py +++ b/superset/utils/url_map_converters.py @@ -18,7 +18,7 @@ from werkzeug.routing import BaseConverter, Map -from superset.models.tags import ObjectTypes +from superset.tags.models import ObjectTypes class RegexConverter(BaseConverter): diff --git a/superset/utils/urls.py b/superset/utils/urls.py index c31bfb1a5103..31fbd89337af 100644 --- a/superset/utils/urls.py +++ b/superset/utils/urls.py @@ -48,7 +48,9 @@ def modify_url_query(url: str, **kwargs: Any) -> str: v = [v] params[k] = v - parts[3] = "&".join(f"{k}={urllib.parse.quote(v[0])}" for k, v in params.items()) + parts[3] = "&".join( + f"{k}={urllib.parse.quote(str(v[0]))}" for k, v in params.items() + ) return urllib.parse.urlunsplit(parts) diff --git a/superset/utils/webdriver.py b/superset/utils/webdriver.py index 5fdc0a213116..e678587029db 100644 --- a/superset/utils/webdriver.py +++ b/superset/utils/webdriver.py @@ -15,10 +15,12 @@ # specific language governing permissions and limitations # under the License. +from __future__ import annotations + import logging from enum import Enum from time import sleep -from typing import Any, Dict, Optional, Tuple, TYPE_CHECKING +from typing import Any, Dict, List, Optional, Tuple, TYPE_CHECKING from flask import current_app from selenium.common.exceptions import ( @@ -49,6 +51,67 @@ class DashboardStandaloneMode(Enum): REPORT = 3 +class ChartStandaloneMode(Enum): + HIDE_NAV = "true" + SHOW_NAV = 0 + + +def find_unexpected_errors(driver: WebDriver) -> List[str]: + error_messages = [] + + try: + alert_divs = driver.find_elements(By.XPATH, "//div[@role = 'alert']") + logger.debug( + "%i alert elements have been found in the screenshot", len(alert_divs) + ) + + for alert_div in alert_divs: + # See More button + alert_div.find_element(By.XPATH, ".//*[@role = 'button']").click() + + # wait for modal to show up + modal = WebDriverWait( + driver, current_app.config["SCREENSHOT_WAIT_FOR_ERROR_MODAL_VISIBLE"] + ).until( + EC.visibility_of_any_elements_located( + (By.CLASS_NAME, "ant-modal-content") + ) + )[ + 0 + ] + + err_msg_div = modal.find_element(By.CLASS_NAME, "ant-modal-body") + + # collect error message + error_messages.append(err_msg_div.text) + + # close modal after collecting error messages + modal.find_element(By.CLASS_NAME, "ant-modal-close").click() + + # wait until the modal becomes invisible + WebDriverWait( + driver, current_app.config["SCREENSHOT_WAIT_FOR_ERROR_MODAL_INVISIBLE"] + ).until(EC.invisibility_of_element(modal)) + + # Use HTML so that error messages are shown in the same style (color) + error_as_html = err_msg_div.get_attribute("innerHTML").replace("'", "\\'") + + try: + # Even if some errors can't be updated in the screenshot, + # keep all the errors in the server log and do not fail the loop + driver.execute_script( + f"arguments[0].innerHTML = '{error_as_html}'", alert_div + ) + except WebDriverException: + logger.warning( + "Failed to update error messages using alert_div", exc_info=True + ) + except WebDriverException: + logger.warning("Failed to capture unexpected errors", exc_info=True) + + return error_messages + + class WebDriverProxy: def __init__(self, driver_type: str, window: Optional[WindowSize] = None): self._driver_type = driver_type @@ -83,7 +146,7 @@ def create(self) -> WebDriver: return driver_class(**kwargs) - def auth(self, user: "User") -> WebDriver: + def auth(self, user: User) -> WebDriver: driver = self.create() return machine_auth_provider_factory.instance.authenticate_webdriver( driver, user @@ -104,7 +167,7 @@ def destroy(driver: WebDriver, tries: int = 2) -> None: pass def get_screenshot( - self, url: str, element_name: str, user: "User" + self, url: str, element_name: str, user: User ) -> Optional[bytes]: driver = self.auth(user) driver.set_window_size(*self._window) @@ -119,23 +182,42 @@ def get_screenshot( element = WebDriverWait(driver, self._screenshot_locate_wait).until( EC.presence_of_element_located((By.CLASS_NAME, element_name)) ) - logger.debug("Wait for .loading to be done") - WebDriverWait(driver, self._screenshot_load_wait).until_not( - EC.presence_of_all_elements_located((By.CLASS_NAME, "loading")) - ) - logger.debug("Wait for chart to have content") + + logger.debug("Wait for chart containers to draw") WebDriverWait(driver, self._screenshot_locate_wait).until( EC.visibility_of_all_elements_located( (By.CLASS_NAME, "slice_container") ) ) + + logger.debug("Wait for loading element of charts to be gone") + WebDriverWait(driver, self._screenshot_load_wait).until_not( + EC.presence_of_all_elements_located((By.CLASS_NAME, "loading")) + ) + selenium_animation_wait = current_app.config[ "SCREENSHOT_SELENIUM_ANIMATION_WAIT" ] logger.debug("Wait %i seconds for chart animation", selenium_animation_wait) sleep(selenium_animation_wait) - logger.info("Taking a PNG screenshot of url %s", url) + logger.info( + "Taking a PNG screenshot of url %s as user %s", + url, + user.username, + ) + + if current_app.config["SCREENSHOT_REPLACE_UNEXPECTED_ERRORS"]: + unexpected_errors = find_unexpected_errors(driver) + if unexpected_errors: + logger.warning( + "%i errors found in the screenshot. URL: %s. Errors are: %s", + len(unexpected_errors), + url, + unexpected_errors, + ) + img = element.screenshot_as_png + except TimeoutException: logger.warning("Selenium timed out requesting url %s", url, exc_info=True) except StaleElementReferenceException: diff --git a/superset/views/__init__.py b/superset/views/__init__.py index c33601f7278d..5247f215c187 100644 --- a/superset/views/__init__.py +++ b/superset/views/__init__.py @@ -17,7 +17,6 @@ from . import ( access_requests, alerts, - annotations, api, base, core, diff --git a/superset/views/access_requests.py b/superset/views/access_requests.py index e60662e36e70..063ef5e0be91 100644 --- a/superset/views/access_requests.py +++ b/superset/views/access_requests.py @@ -25,9 +25,10 @@ from superset.views.core import DAR -class AccessRequestsModelView( - SupersetModelView, DeleteMixin -): # pylint: disable=too-many-ancestors +class AccessRequestsModelView( # pylint: disable=too-many-ancestors + SupersetModelView, + DeleteMixin, +): datamodel = SQLAInterface(DAR) include_route_methods = RouteMethod.CRUD_SET list_columns = [ diff --git a/superset/views/annotations.py b/superset/views/annotations.py index 69718f5f5af5..cc8c58fe47f1 100644 --- a/superset/views/annotations.py +++ b/superset/views/annotations.py @@ -14,116 +14,27 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from typing import Any, Dict - -from flask_appbuilder import CompactCRUDMixin +from flask_appbuilder import permission_name from flask_appbuilder.api import expose -from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.security.decorators import has_access -from flask_babel import lazy_gettext as _ -from wtforms.validators import StopValidation -from superset.constants import MODEL_VIEW_RW_METHOD_PERMISSION_MAP, RouteMethod -from superset.models.annotations import Annotation, AnnotationLayer from superset.superset_typing import FlaskResponse -from superset.views.base import SupersetModelView - - -class StartEndDttmValidator: # pylint: disable=too-few-public-methods - """ - Validates dttm fields. - """ - def __call__(self, form: Dict[str, Any], field: Any) -> None: - if not form["start_dttm"].data and not form["end_dttm"].data: - raise StopValidation(_("annotation start time or end time is required.")) - if ( - form["end_dttm"].data - and form["start_dttm"].data - and form["end_dttm"].data < form["start_dttm"].data - ): - raise StopValidation( - _("Annotation end time must be no earlier than start time.") - ) +from .base import BaseSupersetView -class AnnotationModelView( - SupersetModelView, CompactCRUDMixin -): # pylint: disable=too-many-ancestors - datamodel = SQLAInterface(Annotation) - include_route_methods = RouteMethod.CRUD_SET | {"annotation"} - +class AnnotationLayerView(BaseSupersetView): + route_base = "/annotationlayer" class_permission_name = "Annotation" - method_permission_name = MODEL_VIEW_RW_METHOD_PERMISSION_MAP - - list_title = _("Annotations") - show_title = _("Show Annotation") - add_title = _("Add Annotation") - edit_title = _("Edit Annotation") - - list_columns = ["short_descr", "start_dttm", "end_dttm"] - edit_columns = [ - "layer", - "short_descr", - "long_descr", - "start_dttm", - "end_dttm", - "json_metadata", - ] - - add_columns = edit_columns - - label_columns = { - "layer": _("Layer"), - "short_descr": _("Label"), - "long_descr": _("Description"), - "start_dttm": _("Start"), - "end_dttm": _("End"), - "json_metadata": _("JSON Metadata"), - } - - description_columns = { - "json_metadata": "This JSON represents any additional metadata this \ - annotation needs to add more context." - } - - validators_columns = {"start_dttm": [StartEndDttmValidator()]} - - def pre_add(self, item: "AnnotationModelView") -> None: - if not item.start_dttm: - item.start_dttm = item.end_dttm - elif not item.end_dttm: - item.end_dttm = item.start_dttm - - def pre_update(self, item: "AnnotationModelView") -> None: - self.pre_add(item) - @expose("/<pk>/annotation/", methods=["GET"]) + @expose("/list/") @has_access - def annotation(self, pk: int) -> FlaskResponse: # pylint: disable=unused-argument + @permission_name("read") + def list(self) -> FlaskResponse: return super().render_app_template() - -class AnnotationLayerModelView(SupersetModelView): - datamodel = SQLAInterface(AnnotationLayer) - include_route_methods = RouteMethod.CRUD_SET | {RouteMethod.API_READ} - related_views = [AnnotationModelView] - - class_permission_name = "Annotation" - method_permission_name = MODEL_VIEW_RW_METHOD_PERMISSION_MAP - - list_title = _("Annotation Layers") - show_title = _("Show Annotation Layer") - add_title = _("Add Annotation Layer") - edit_title = _("Edit Annotation Layer") - - list_columns = ["id", "name", "descr"] - edit_columns = ["name", "descr"] - add_columns = edit_columns - - label_columns = {"name": _("Name"), "descr": _("Description")} - - @expose("/list/") + @expose("/<int:pk>/annotation") @has_access - def list(self) -> FlaskResponse: + @permission_name("read") + def get(self, pk: int) -> FlaskResponse: # pylint: disable=unused-argument return super().render_app_template() diff --git a/superset/views/api.py b/superset/views/api.py index bde25236460d..fc7c5b76d26c 100644 --- a/superset/views/api.py +++ b/superset/views/api.py @@ -23,6 +23,7 @@ from flask_appbuilder import expose from flask_appbuilder.api import rison from flask_appbuilder.security.decorators import has_access_api +from flask_babel import lazy_gettext as _ from superset import db, event_logger from superset.charts.commands.exceptions import ( @@ -105,7 +106,7 @@ def time_range(self, **kwargs: Any) -> FlaskResponse: } return self.json_response({"result": result}) except (ValueError, TimeRangeParseFailError, TimeRangeAmbiguousError) as error: - error_msg = {"message": f"Unexpected time range: {error}"} + error_msg = {"message": _("Unexpected time range: %s" % error)} return self.json_response(error_msg, 400) def get_query_context_factory(self) -> QueryContextFactory: diff --git a/superset/views/base.py b/superset/views/base.py index cd13972c93fe..bffb95ea3320 100644 --- a/superset/views/base.py +++ b/superset/views/base.py @@ -72,11 +72,13 @@ SupersetException, SupersetSecurityException, ) +from superset.extensions import cache_manager from superset.models.helpers import ImportExportMixin -from superset.models.reports import ReportRecipientType +from superset.reports.models import ReportRecipientType from superset.superset_typing import FlaskResponse from superset.translations.utils import get_language_pack from superset.utils import core as utils +from superset.utils.core import get_user_id from .utils import bootstrap_user_data @@ -101,13 +103,19 @@ "SQLALCHEMY_DISPLAY_TEXT", "GLOBAL_ASYNC_QUERIES_WEBSOCKET_URL", "DASHBOARD_AUTO_REFRESH_MODE", + "DASHBOARD_AUTO_REFRESH_INTERVALS", + "DASHBOARD_VIRTUALIZATION", "SCHEDULED_QUERIES", "EXCEL_EXTENSIONS", "CSV_EXTENSIONS", "COLUMNAR_EXTENSIONS", "ALLOWED_EXTENSIONS", + "SAMPLES_ROW_LIMIT", + "DEFAULT_TIME_FILTER", "HTML_SANITIZATION", "HTML_SANITIZATION_SCHEMA_EXTENSIONS", + "WELCOME_PAGE_LAST_TAB", + "VIZ_TYPE_DENYLIST", ) logger = logging.getLogger(__name__) @@ -178,6 +186,30 @@ def generate_download_headers( return headers +def deprecated( + eol_version: str = "3.0.0", +) -> Callable[[Callable[..., FlaskResponse]], Callable[..., FlaskResponse]]: + """ + A decorator to set an API endpoint from SupersetView has deprecated. + Issues a log warning + """ + + def _deprecated(f: Callable[..., FlaskResponse]) -> Callable[..., FlaskResponse]: + def wraps(self: "BaseSupersetView", *args: Any, **kwargs: Any) -> FlaskResponse: + logger.warning( + "%s.%s " + "This API endpoint is deprecated and will be removed in version %s", + self.__class__.__name__, + f.__name__, + eol_version, + ) + return f(self, *args, **kwargs) + + return functools.update_wrapper(wraps, f) + + return _deprecated + + def api(f: Callable[..., FlaskResponse]) -> Callable[..., FlaskResponse]: """ A decorator to label an endpoint as an API. Catches uncaught exceptions and @@ -267,17 +299,6 @@ def validate_sqlatable(table: models.SqlaTable) -> None: ) from ex -def create_table_permissions(table: models.SqlaTable) -> None: - security_manager.add_permission_view_menu("datasource_access", table.get_perm()) - if table.schema: - security_manager.add_permission_view_menu("schema_access", table.schema_perm) - - -def is_user_admin() -> bool: - user_roles = [role.name.lower() for role in list(security_manager.get_user_roles())] - return "admin" in user_roles - - class BaseSupersetView(BaseView): @staticmethod def json_response(obj: Any, status: int = 200) -> FlaskResponse: @@ -290,7 +311,7 @@ def json_response(obj: Any, status: int = 200) -> FlaskResponse: def render_app_template(self) -> FlaskResponse: payload = { "user": bootstrap_user_data(g.user, include_perms=True), - "common": common_bootstrap_payload(), + "common": common_bootstrap_payload(g.user), } return self.render_template( "superset/spa.html", @@ -301,7 +322,7 @@ def render_app_template(self) -> FlaskResponse: ) -def menu_data() -> Dict[str, Any]: +def menu_data(user: User) -> Dict[str, Any]: menu = appbuilder.menu.get_data() languages = {} @@ -314,16 +335,22 @@ def menu_data() -> Dict[str, Any]: if callable(brand_text): brand_text = brand_text() build_number = appbuilder.app.config["BUILD_NUMBER"] - environment_tag = ( - appbuilder.app.config["ENVIRONMENT_TAG_CONFIG"]["values"][ - os.environ.get(appbuilder.app.config["ENVIRONMENT_TAG_CONFIG"]["variable"]) - ] - or {} - ) + try: + environment_tag = ( + appbuilder.app.config["ENVIRONMENT_TAG_CONFIG"]["values"][ + os.environ.get( + appbuilder.app.config["ENVIRONMENT_TAG_CONFIG"]["variable"] + ) + ] + or {} + ) + except KeyError: + environment_tag = {} + return { "menu": menu, "brand": { - "path": appbuilder.app.config["LOGO_TARGET_PATH"] or "/", + "path": appbuilder.app.config["LOGO_TARGET_PATH"] or "/superset/welcome/", "icon": appbuilder.app_icon, "alt": appbuilder.app_name, "tooltip": appbuilder.app.config["LOGO_TOOLTIP"], @@ -331,32 +358,40 @@ def menu_data() -> Dict[str, Any]: }, "environment_tag": environment_tag, "navbar_right": { - # show the watermark if the default app icon has been overriden + # show the watermark if the default app icon has been overridden "show_watermark": ("superset-logo-horiz" not in appbuilder.app_icon), "bug_report_url": appbuilder.app.config["BUG_REPORT_URL"], + "bug_report_icon": appbuilder.app.config["BUG_REPORT_ICON"], + "bug_report_text": appbuilder.app.config["BUG_REPORT_TEXT"], "documentation_url": appbuilder.app.config["DOCUMENTATION_URL"], + "documentation_icon": appbuilder.app.config["DOCUMENTATION_ICON"], + "documentation_text": appbuilder.app.config["DOCUMENTATION_TEXT"], "version_string": appbuilder.app.config["VERSION_STRING"], "version_sha": appbuilder.app.config["VERSION_SHA"], "build_number": build_number, "languages": languages, "show_language_picker": len(languages.keys()) > 1, - "user_is_anonymous": g.user.is_anonymous, + "user_is_anonymous": user.is_anonymous, "user_info_url": None if appbuilder.app.config["MENU_HIDE_USER_INFO"] else appbuilder.get_url_for_userinfo, "user_logout_url": appbuilder.get_url_for_logout, "user_login_url": appbuilder.get_url_for_login, "user_profile_url": None - if g.user.is_anonymous or appbuilder.app.config["MENU_HIDE_USER_INFO"] - else f"/superset/profile/{g.user.username}", + if user.is_anonymous or appbuilder.app.config["MENU_HIDE_USER_INFO"] + else f"/superset/profile/{user.username}", "locale": session.get("locale", "en"), }, } -def common_bootstrap_payload() -> Dict[str, Any]: - """Common data always sent to the client""" - messages = get_flashed_messages(with_categories=True) +@cache_manager.cache.memoize(timeout=60) +def cached_common_bootstrap_data(user: User) -> Dict[str, Any]: + """Common data always sent to the client + + The function is memoized as the return value only changes when user permissions + or configuration values change. + """ locale = str(get_locale()) # should not expose API TOKEN to frontend @@ -380,7 +415,6 @@ def common_bootstrap_payload() -> Dict[str, Any]: frontend_config["HAS_GSHEETS_INSTALLED"] = bool(available_specs[GSheetsEngineSpec]) bootstrap_data = { - "flash_messages": messages, "conf": frontend_config, "locale": locale, "language_pack": get_language_pack(locale), @@ -388,7 +422,7 @@ def common_bootstrap_payload() -> Dict[str, Any]: "extra_sequential_color_schemes": conf["EXTRA_SEQUENTIAL_COLOR_SCHEMES"], "extra_categorical_color_schemes": conf["EXTRA_CATEGORICAL_COLOR_SCHEMES"], "theme_overrides": conf["THEME_OVERRIDES"], - "menu_data": menu_data(), + "menu_data": menu_data(user), "datahub_url": conf.get("DATAHUB_URL", ""), "advanced_data_types": list( map( @@ -406,6 +440,13 @@ def common_bootstrap_payload() -> Dict[str, Any]: return bootstrap_data +def common_bootstrap_payload(user: User) -> Dict[str, Any]: + return { + **(cached_common_bootstrap_data(user)), + "flash_messages": get_flashed_messages(with_categories=True), + } + + def get_error_level_from_status_code( # pylint: disable=invalid-name status: int, ) -> ErrorLevel: @@ -511,7 +552,7 @@ def show_unexpected_exception(ex: Exception) -> FlaskResponse: def get_common_bootstrap_data() -> Dict[str, Any]: def serialize_bootstrap_data() -> str: return json.dumps( - {"common": common_bootstrap_payload()}, + {"common": common_bootstrap_payload(g.user)}, default=utils.pessimistic_json_iso_dttm_ser, ) @@ -529,7 +570,7 @@ class SupersetModelView(ModelView): def render_app_template(self) -> FlaskResponse: payload = { "user": bootstrap_user_data(g.user, include_perms=True), - "common": common_bootstrap_payload(), + "common": common_bootstrap_payload(g.user), } return self.render_template( "superset/spa.html", @@ -583,7 +624,7 @@ def yaml_export( class DeleteMixin: # pylint: disable=too-few-public-methods def _delete(self: BaseView, primary_key: int) -> None: """ - Delete function logic, override to implement diferent logic + Delete function logic, override to implement different logic deletes the record with primary_key = primary_key :param primary_key: @@ -646,10 +687,7 @@ def apply(self, query: Query, value: Any) -> Query: owner_ids_query = ( db.session.query(models.SqlaTable.id) .join(models.SqlaTable.owners) - .filter( - security_manager.user_model.id - == security_manager.user_model.get_user_id() - ) + .filter(security_manager.user_model.id == get_user_id()) ) return query.filter( or_( @@ -669,51 +707,15 @@ class CsvResponse(Response): default_mimetype = "text/csv" -def check_ownership(obj: Any, raise_if_false: bool = True) -> bool: - """Meant to be used in `pre_update` hooks on models to enforce ownership - - Admin have all access, and other users need to be referenced on either - the created_by field that comes with the ``AuditMixin``, or in a field - named ``owners`` which is expected to be a one-to-many with the User - model. It is meant to be used in the ModelView's pre_update hook in - which raising will abort the update. +class XlsxResponse(Response): + """ + Override Response to use xlsx mimetype """ - if not obj: - return False - - security_exception = SupersetSecurityException( - SupersetError( - error_type=SupersetErrorType.MISSING_OWNERSHIP_ERROR, - message="You don't have the rights to alter [{}]".format(obj), - level=ErrorLevel.ERROR, - ) - ) - if g.user.is_anonymous: - if raise_if_false: - raise security_exception - return False - if is_user_admin(): - return True - scoped_session = db.create_scoped_session() - orig_obj = scoped_session.query(obj.__class__).filter_by(id=obj.id).first() - - # Making a list of owners that works across ORM models - owners: List[User] = [] - if hasattr(orig_obj, "owners"): - owners += orig_obj.owners - if hasattr(orig_obj, "owner"): - owners += [orig_obj.owner] - if hasattr(orig_obj, "created_by"): - owners += [orig_obj.created_by] - - owner_names = [o.username for o in owners if o] - - if g.user and hasattr(g.user, "username") and g.user.username in owner_names: - return True - if raise_if_false: - raise security_exception - return False + charset = "utf-8" + default_mimetype = ( + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + ) def bind_field( diff --git a/superset/views/base_api.py b/superset/views/base_api.py index 01b462bb321f..57d7e1736792 100644 --- a/superset/views/base_api.py +++ b/superset/views/base_api.py @@ -14,13 +14,15 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +from __future__ import annotations + import functools import logging from typing import Any, Callable, cast, Dict, List, Optional, Set, Tuple, Type, Union -from flask import Blueprint, g, request, Response -from flask_appbuilder import AppBuilder, Model, ModelRestApi -from flask_appbuilder.api import expose, protect, rison, safe +from flask import request, Response +from flask_appbuilder import Model, ModelRestApi +from flask_appbuilder.api import BaseApi, expose, protect, rison, safe from flask_appbuilder.models.filters import BaseFilter, Filters from flask_appbuilder.models.sqla.filters import FilterStartsWith from flask_appbuilder.models.sqla.interface import SQLAInterface @@ -30,15 +32,14 @@ from sqlalchemy.orm.query import Query from superset.exceptions import InvalidPayloadFormatError -from superset.extensions import db, event_logger, security_manager +from superset.extensions import db, event_logger, security_manager, stats_logger_manager from superset.models.core import FavStar from superset.models.dashboard import Dashboard from superset.models.slice import Slice from superset.schemas import error_payload_content from superset.sql_lab import Query as SqllabQuery -from superset.stats_logger import BaseStatsLogger from superset.superset_typing import FlaskResponse -from superset.utils.core import time_function +from superset.utils.core import get_user_id, time_function from superset.views.base import handle_api_exception logger = logging.getLogger(__name__) @@ -56,6 +57,7 @@ class RelatedResultResponseSchema(Schema): value = fields.Integer(description="The related item identifier") text = fields.String(description="The related item string representation") + extra = fields.Dict(description="The extra metadata for related item") class RelatedResponseSchema(Schema): @@ -90,7 +92,7 @@ def requires_form_data(f: Callable[..., Any]) -> Callable[..., Any]: Require 'multipart/form-data' as request MIME type """ - def wraps(self: "BaseSupersetModelRestApi", *args: Any, **kwargs: Any) -> Response: + def wraps(self: BaseSupersetApiMixin, *args: Any, **kwargs: Any) -> Response: if not request.mimetype == "multipart/form-data": raise InvalidPayloadFormatError( message="Request MIME type is not 'multipart/form-data'" @@ -105,14 +107,21 @@ def statsd_metrics(f: Callable[..., Any]) -> Callable[..., Any]: Handle sending all statsd metrics from the REST API """ - def wraps(self: "BaseSupersetModelRestApi", *args: Any, **kwargs: Any) -> Response: + def wraps(self: BaseSupersetApiMixin, *args: Any, **kwargs: Any) -> Response: + func_name = f.__name__ try: duration, response = time_function(f, self, *args, **kwargs) except Exception as ex: - self.incr_stats("error", f.__name__) + if ( + hasattr(ex, "status") + and ex.status < 500 # type: ignore # pylint: disable=no-member + ): + self.incr_stats("warning", func_name) + else: + self.incr_stats("error", func_name) raise ex - self.send_stats_metrics(response, f.__name__, duration) + self.send_stats_metrics(response, func_name, duration) return response return functools.update_wrapper(wraps, f) @@ -145,7 +154,7 @@ def apply(self, query: Query, value: Any) -> Query: return query users_favorite_query = db.session.query(FavStar.obj_id).filter( and_( - FavStar.user_id == g.user.get_id(), + FavStar.user_id == get_user_id(), FavStar.class_name == self.class_name, ) ) @@ -154,12 +163,71 @@ def apply(self, query: Query, value: Any) -> Query: return query.filter(and_(~self.model.id.in_(users_favorite_query))) -class BaseSupersetModelRestApi(ModelRestApi): +class BaseSupersetApiMixin: + csrf_exempt = False + + responses = { + "400": {"description": "Bad request", "content": error_payload_content}, + "401": {"description": "Unauthorized", "content": error_payload_content}, + "403": {"description": "Forbidden", "content": error_payload_content}, + "404": {"description": "Not found", "content": error_payload_content}, + "410": {"description": "Gone", "content": error_payload_content}, + "422": { + "description": "Could not process entity", + "content": error_payload_content, + }, + "500": {"description": "Fatal error", "content": error_payload_content}, + } + + def incr_stats(self, action: str, func_name: str) -> None: + """ + Proxy function for statsd.incr to impose a key structure for REST API's + :param action: String with an action name eg: error, success + :param func_name: The function name + """ + stats_logger_manager.instance.incr( + f"{self.__class__.__name__}.{func_name}.{action}" + ) + + def timing_stats(self, action: str, func_name: str, value: float) -> None: + """ + Proxy function for statsd.incr to impose a key structure for REST API's + :param action: String with an action name eg: error, success + :param func_name: The function name + :param value: A float with the time it took for the endpoint to execute + """ + stats_logger_manager.instance.timing( + f"{self.__class__.__name__}.{func_name}.{action}", value + ) + + def send_stats_metrics( + self, response: Response, key: str, time_delta: Optional[float] = None + ) -> None: + """ + Helper function to handle sending statsd metrics + :param response: flask response object, will evaluate if it was an error + :param key: The function name + :param time_delta: Optional time it took for the endpoint to execute + """ + if 200 <= response.status_code < 400: + self.incr_stats("success", key) + elif 400 <= response.status_code < 500: + self.incr_stats("warning", key) + else: + self.incr_stats("error", key) + if time_delta: + self.timing_stats("time", key, time_delta) + + +class BaseSupersetApi(BaseSupersetApiMixin, BaseApi): + ... + + +class BaseSupersetModelRestApi(ModelRestApi, BaseSupersetApiMixin): """ Extends FAB's ModelResApi to implement specific superset generic functionality """ - csrf_exempt = False method_permission_name = { "bulk_delete": "delete", "data": "list", @@ -194,21 +262,27 @@ class BaseSupersetModelRestApi(ModelRestApi): } """ - related_field_filters: Dict[str, Union[RelatedFieldFilter, str]] = {} + base_related_field_filters: Dict[str, BaseFilter] = {} """ - Declare the filters for related fields:: + This is used to specify a base filter for related fields + when they are accessed through the '/related/<column_name>' endpoint. + When combined with the `related_field_filters` attribute, + this filter will be applied in addition to the latest:: - related_fields = { - "<RELATED_FIELD>": <RelatedFieldFilter>) + base_related_field_filters = { + "<RELATED_FIELD>": "<FILTER>") } """ - filter_rel_fields: Dict[str, BaseFilter] = {} + related_field_filters: Dict[str, Union[RelatedFieldFilter, str]] = {} """ - Declare the related field base filter:: + Specify a filter for related fields when they are accessed + through the '/related/<column_name>' endpoint. + When combined with the `base_related_field_filters` attribute, + this filter will be applied in prior to the latest:: - filter_rel_fields_field = { - "<RELATED_FIELD>": "<FILTER>") + related_fields = { + "<RELATED_FIELD>": <RelatedFieldFilter>) } """ allowed_rel_fields: Set[str] = set() @@ -223,6 +297,15 @@ class BaseSupersetModelRestApi(ModelRestApi): } """ + extra_fields_rel_fields: Dict[str, List[str]] = {"owners": ["email", "active"]} + """ + Declare extra fields for the representation of the Model object:: + + extra_fields_rel_fields = { + "<RELATED_FIELD>": "[<RELATED_OBJECT_FIELD_1>, <RELATED_OBJECT_FIELD_2>]" + } + """ + allowed_distinct_fields: Set[str] = set() add_columns: List[str] @@ -230,22 +313,8 @@ class BaseSupersetModelRestApi(ModelRestApi): list_columns: List[str] show_columns: List[str] - responses = { - "400": {"description": "Bad request", "content": error_payload_content}, - "401": {"description": "Unauthorized", "content": error_payload_content}, - "403": {"description": "Forbidden", "content": error_payload_content}, - "404": {"description": "Not found", "content": error_payload_content}, - "422": { - "description": "Could not process entity", - "content": error_payload_content, - }, - "500": {"description": "Fatal error", "content": error_payload_content}, - } - def __init__(self) -> None: super().__init__() - # Setup statsd - self.stats_logger = BaseStatsLogger() # Add base API spec base query parameter schemas if self.apispec_parameter_schemas is None: # type: ignore self.apispec_parameter_schemas = {} @@ -257,12 +326,6 @@ def __init__(self) -> None: DistincResponseSchema, ) - def create_blueprint( - self, appbuilder: AppBuilder, *args: Any, **kwargs: Any - ) -> Blueprint: - self.stats_logger = self.appbuilder.get_app.config["STATS_LOGGER"] - return super().create_blueprint(appbuilder, *args, **kwargs) - def _init_properties(self) -> None: """ Lock down initial not configured REST API columns. We want to just expose @@ -289,7 +352,7 @@ def _get_related_filter( filter_field = cast(RelatedFieldFilter, filter_field) search_columns = [filter_field.field_name] if filter_field else None filters = datamodel.get_filters(search_columns) - base_filters = self.filter_rel_fields.get(column_name) + base_filters = self.base_related_field_filters.get(column_name) if base_filters: filters.add_filter_list(base_filters) if value and filter_field: @@ -317,6 +380,17 @@ def _get_text_for_model(self, model: Model, column_name: str) -> str: return getattr(model, model_column_name) return str(model) + def _get_extra_field_for_model( + self, model: Model, column_name: str + ) -> Dict[str, str]: + ret = {} + if column_name in self.extra_fields_rel_fields: + model_column_names = self.extra_fields_rel_fields.get(column_name) + if model_column_names: + for key in model_column_names: + ret[key] = getattr(model, key) + return ret + def _get_result_from_rows( self, datamodel: SQLAInterface, rows: List[Model], column_name: str ) -> List[Dict[str, Any]]: @@ -324,6 +398,7 @@ def _get_result_from_rows( { "value": datamodel.get_pk_value(row), "text": self._get_text_for_model(row, column_name), + "extra": self._get_extra_field_for_model(row, column_name), } for row in rows ] @@ -344,44 +419,6 @@ def _add_extra_ids_to_result( extra_rows = db.session.query(datamodel.obj).filter(pk_col.in_(ids)).all() result += self._get_result_from_rows(datamodel, extra_rows, column_name) - def incr_stats(self, action: str, func_name: str) -> None: - """ - Proxy function for statsd.incr to impose a key structure for REST API's - - :param action: String with an action name eg: error, success - :param func_name: The function name - """ - self.stats_logger.incr(f"{self.__class__.__name__}.{func_name}.{action}") - - def timing_stats(self, action: str, func_name: str, value: float) -> None: - """ - Proxy function for statsd.incr to impose a key structure for REST API's - - :param action: String with an action name eg: error, success - :param func_name: The function name - :param value: A float with the time it took for the endpoint to execute - """ - self.stats_logger.timing( - f"{self.__class__.__name__}.{func_name}.{action}", value - ) - - def send_stats_metrics( - self, response: Response, key: str, time_delta: Optional[float] = None - ) -> None: - """ - Helper function to handle sending statsd metrics - - :param response: flask response object, will evaluate if it was an error - :param key: The function name - :param time_delta: Optional time it took for the endpoint to execute - """ - if 200 <= response.status_code < 400: - self.incr_stats("success", key) - else: - self.incr_stats("error", key) - if time_delta: - self.timing_stats("time", key, time_delta) - @event_logger.log_this_with_context( action=lambda self, *args, **kwargs: f"{self.__class__.__name__}.info", object_ref=False, diff --git a/superset/views/base_schemas.py b/superset/views/base_schemas.py index b7ffc72223db..778f737fe09c 100644 --- a/superset/views/base_schemas.py +++ b/superset/views/base_schemas.py @@ -21,6 +21,8 @@ from marshmallow import post_load, pre_load, Schema, ValidationError from sqlalchemy.orm.exc import NoResultFound +from superset.utils.core import get_user_id + def validate_owner(value: int) -> None: try: @@ -113,8 +115,9 @@ def pre_load(self, data: Dict[Any, Any]) -> None: @staticmethod def set_owners(instance: Model, owners: List[int]) -> None: owner_objs = [] - if g.user.get_id() not in owners: - owners.append(g.user.get_id()) + user_id = get_user_id() + if user_id and user_id not in owners: + owners.append(user_id) for owner_id in owners: user = current_app.appbuilder.get_session.query( current_app.appbuilder.sm.user_model diff --git a/superset/views/chart/views.py b/superset/views/chart/views.py index 72058c32e7f3..250fa901e9a6 100644 --- a/superset/views/chart/views.py +++ b/superset/views/chart/views.py @@ -14,25 +14,17 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import json - -from flask import g from flask_appbuilder import expose, has_access from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_babel import lazy_gettext as _ +from superset import security_manager from superset.constants import MODEL_VIEW_RW_METHOD_PERMISSION_MAP, RouteMethod from superset.models.slice import Slice from superset.superset_typing import FlaskResponse from superset.utils import core as utils -from superset.views.base import ( - check_ownership, - common_bootstrap_payload, - DeleteMixin, - SupersetModelView, -) +from superset.views.base import DeleteMixin, SupersetModelView from superset.views.chart.mixin import SliceMixin -from superset.views.utils import bootstrap_user_data class SliceModelView( @@ -53,21 +45,15 @@ def pre_add(self, item: "SliceModelView") -> None: def pre_update(self, item: "SliceModelView") -> None: utils.validate_json(item.params) - check_ownership(item) + security_manager.raise_for_ownership(item) def pre_delete(self, item: "SliceModelView") -> None: - check_ownership(item) + security_manager.raise_for_ownership(item) @expose("/add", methods=["GET", "POST"]) @has_access def add(self) -> FlaskResponse: - payload = { - "common": common_bootstrap_payload(), - "user": bootstrap_user_data(g.user), - } - return self.render_template( - "superset/add_slice.html", bootstrap_data=json.dumps(payload) - ) + return super().render_app_template() @expose("/list/") @has_access diff --git a/superset/views/core.py b/superset/views/core.py index 83c0a33386ed..d602d88bce66 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -20,12 +20,11 @@ import logging import re from contextlib import closing -from datetime import datetime, timedelta +from datetime import datetime from typing import Any, Callable, cast, Dict, List, Optional, Union from urllib import parse import backoff -import humanize import pandas as pd import simplejson as json from flask import abort, flash, g, redirect, render_template, request, Response @@ -41,7 +40,6 @@ from sqlalchemy import and_, or_ from sqlalchemy.exc import DBAPIError, NoSuchModuleError, SQLAlchemyError from sqlalchemy.orm.session import Session -from sqlalchemy.sql import functions as func from superset import ( app, @@ -58,16 +56,17 @@ ) from superset.charts.commands.exceptions import ChartNotFoundError from superset.charts.dao import ChartDAO +from superset.charts.data.commands.get_data_command import ChartDataCommand from superset.common.chart_data import ChartDataResultFormat, ChartDataResultType from superset.common.db_query_status import QueryStatus from superset.connectors.base.models import BaseDatasource -from superset.connectors.connector_registry import ConnectorRegistry from superset.connectors.sqla.models import ( AnnotationDatasource, SqlaTable, SqlMetric, TableColumn, ) +from superset.constants import QUERY_EARLY_CANCEL_KEY from superset.dashboards.commands.importers.v0 import ImportDashboardsCommand from superset.dashboards.dao import DashboardDAO from superset.dashboards.permalink.commands.get import GetDashboardPermalinkCommand @@ -77,6 +76,7 @@ from superset.databases.filters import DatabaseFilter from superset.databases.utils import make_url_safe from superset.datasets.commands.exceptions import DatasetNotFoundError +from superset.datasource.dao import DatasourceDAO from superset.errors import ErrorLevel, SupersetError, SupersetErrorType from superset.exceptions import ( CacheLoadError, @@ -90,13 +90,14 @@ SupersetSecurityException, SupersetTimeoutException, ) +from superset.explore.form_data.commands.create import CreateFormDataCommand from superset.explore.form_data.commands.get import GetFormDataCommand from superset.explore.form_data.commands.parameters import CommandParameters from superset.explore.permalink.commands.get import GetExplorePermalinkCommand from superset.explore.permalink.exceptions import ExplorePermalinkGetFailedError from superset.extensions import async_query_manager, cache_manager from superset.jinja_context import get_template_processor -from superset.models.core import Database, FavStar, Log +from superset.models.core import Database, FavStar from superset.models.dashboard import Dashboard from superset.models.datasource_access_request import DatasourceAccessRequest from superset.models.slice import Slice @@ -107,8 +108,8 @@ from superset.sql_lab import get_sql_results from superset.sql_parse import ParsedQuery from superset.sql_validators import get_validator_by_name -from superset.sqllab.command import CommandResult, ExecuteSqlCommand from superset.sqllab.command_status import SqlJsonExecutionStatus +from superset.sqllab.commands.execute import CommandResult, ExecuteSqlCommand from superset.sqllab.exceptions import ( QueryIsForbiddenToAccessException, SqlLabException, @@ -129,17 +130,21 @@ from superset.utils import core as utils, csv from superset.utils.async_query_manager import AsyncQueryTokenException from superset.utils.cache import etag_cache -from superset.utils.core import apply_max_row_limit, ReservedUrlParameters +from superset.utils.core import ( + apply_max_row_limit, + DatasourceType, + get_user_id, + ReservedUrlParameters, +) from superset.utils.dates import now_as_float from superset.utils.decorators import check_dashboard_access from superset.views.base import ( api, BaseSupersetView, - check_ownership, common_bootstrap_payload, - create_table_permissions, CsvResponse, data_payload_response, + deprecated, generate_download_headers, get_error_msg, handle_api_exception, @@ -148,6 +153,8 @@ json_success, validate_sqlatable, ) +from superset.views.log.dao import LogDAO +from superset.views.sql_lab.schemas import SqlJsonPayloadSchema from superset.views.utils import ( _deserialize_results_payload, bootstrap_user_data, @@ -159,7 +166,7 @@ get_datasource_info, get_form_data, get_viz, - is_owner, + loads_request_json, sanitize_datasource_data, ) from superset.viz import BaseViz @@ -175,7 +182,6 @@ "allow_ctas", "allow_cvas", "allow_dml", - "allow_multi_schema_metadata_fetch", "allow_run_async", "allows_subquery", "backend", @@ -188,7 +194,7 @@ DATASOURCE_MISSING_ERR = __("The data source seems to have been deleted") USER_MISSING_ERR = __("The user seems to have been deleted") -PARAMETER_MISSING_ERR = ( +PARAMETER_MISSING_ERR = __( "Please check your template parameters for syntax errors and make sure " "they match across your SQL query and Set Parameters. Then, try running " "your query again." @@ -205,6 +211,7 @@ class Superset(BaseSupersetView): # pylint: disable=too-many-public-methods @has_access_api @event_logger.log_this @expose("/datasources/") + @deprecated() def datasources(self) -> FlaskResponse: return self.json_response( sorted( @@ -250,7 +257,7 @@ def override_role_permissions(self) -> FlaskResponse: ) db_ds_names.add(fullname) - existing_datasources = ConnectorRegistry.get_all_datasources(db.session) + existing_datasources = SqlaTable.get_all_datasources(db.session) datasources = [d for d in existing_datasources if d.full_name in db_ds_names] role = security_manager.find_role(role_name) # remove all permissions @@ -273,6 +280,7 @@ def override_role_permissions(self) -> FlaskResponse: @has_access @event_logger.log_this @expose("/request_access/", methods=["POST"]) + @deprecated() def request_access(self) -> FlaskResponse: logger.warning( "%s.approve " @@ -288,7 +296,7 @@ def request_access(self) -> FlaskResponse: datasource_id = request.args.get("datasource_id") datasource_type = request.args.get("datasource_type") if datasource_id and datasource_type: - ds_class = ConnectorRegistry.sources.get(datasource_type) + ds_class = DatasourceDAO.sources.get(datasource_type) datasource = ( db.session.query(ds_class).filter_by(id=int(datasource_id)).one() ) @@ -322,13 +330,12 @@ def request_access(self) -> FlaskResponse: @has_access @event_logger.log_this @expose("/approve", methods=["POST"]) - def approve(self) -> FlaskResponse: # pylint: disable=too-many-locals + @deprecated() + def approve(self) -> FlaskResponse: # pylint: disable=too-many-locals,no-self-use def clean_fulfilled_requests(session: Session) -> None: for dar in session.query(DAR).all(): - datasource = ConnectorRegistry.get_datasource( - dar.datasource_type, - dar.datasource_id, - session, + datasource = DatasourceDAO.get_datasource( + session, DatasourceType(dar.datasource_type), dar.datasource_id ) if not datasource or security_manager.can_access_datasource(datasource): # Dataset does not exist anymore @@ -348,8 +355,8 @@ def clean_fulfilled_requests(session: Session) -> None: role_to_extend = request.args.get("role_to_extend") session = db.session - datasource = ConnectorRegistry.get_datasource( - datasource_type, datasource_id, session + datasource = DatasourceDAO.get_datasource( + session, DatasourceType(datasource_type), int(datasource_id) ) if not datasource: @@ -377,8 +384,8 @@ def clean_fulfilled_requests(session: Session) -> None: return json_error_response(err) # check if you can approve - if security_manager.can_access_all_datasources() or check_ownership( - datasource, raise_if_false=False + if security_manager.can_access_all_datasources() or security_manager.is_owner( + datasource ): # can by done by admin only if role_to_grant: @@ -438,13 +445,13 @@ def slice(self, slice_id: int) -> FlaskResponse: # pylint: disable=no-self-use _, slc = get_form_data(slice_id, use_slice_data=True) if not slc: abort(404) - endpoint = "/superset/explore/?form_data={}".format( + endpoint = "/explore/?form_data={}".format( parse.quote(json.dumps({"slice_id": slice_id})) ) is_standalone_mode = ReservedUrlParameters.is_standalone_mode() if is_standalone_mode: - endpoint += f"&{ReservedUrlParameters.STANDALONE}={is_standalone_mode}" + endpoint += f"&{ReservedUrlParameters.STANDALONE}=true" return redirect(endpoint) def get_query_string_response(self, viz_obj: BaseViz) -> FlaskResponse: @@ -510,6 +517,7 @@ def generate_json( @expose("/slice_json/<int:slice_id>") @etag_cache() @check_resource_permissions(check_slice_perms) + @deprecated() def slice_json(self, slice_id: int) -> FlaskResponse: form_data, slc = get_form_data(slice_id, use_slice_data=True) if not slc: @@ -533,6 +541,7 @@ def slice_json(self, slice_id: int) -> FlaskResponse: @has_access_api @event_logger.log_this @expose("/annotation_json/<int:layer_id>") + @deprecated() def annotation_json( # pylint: disable=no-self-use self, layer_id: int ) -> FlaskResponse: @@ -642,7 +651,7 @@ def explore_json( and not security_manager.can_access("can_csv", "Superset") ): return json_error_response( - _("You don't have the rights to ") + _("download as csv"), + _("You don't have the rights to download as csv"), status=403, ) @@ -651,7 +660,6 @@ def explore_json( datasource_id, datasource_type = get_datasource_info( datasource_id, datasource_type, form_data ) - force = request.args.get("force") == "true" # TODO: support CSV, SQL query and other non-JSON types @@ -684,7 +692,7 @@ def explore_json( request )["channel"] job_metadata = async_query_manager.init_job( - async_channel_id, g.user.get_id() + async_channel_id, get_user_id() ) load_explore_json_into_cache.delay( job_metadata, form_data, response_type, force @@ -748,11 +756,49 @@ def import_dashboards(self) -> FlaskResponse: "superset/import_dashboards.html", databases=databases ) + @staticmethod + def get_redirect_url() -> str: + """Assembles the redirect URL to the new endpoint. It also replaces + the form_data param with a form_data_key by saving the original content + to the cache layer. + """ + redirect_url = request.url.replace("/superset/explore", "/explore") + form_data_key = None + request_form_data = request.args.get("form_data") + if request_form_data: + parsed_form_data = loads_request_json(request_form_data) + slice_id = parsed_form_data.get( + "slice_id", int(request.args.get("slice_id", 0)) + ) + datasource = parsed_form_data.get("datasource") + if datasource: + datasource_id, datasource_type = datasource.split("__") + parameters = CommandParameters( + datasource_id=datasource_id, + datasource_type=datasource_type, + chart_id=slice_id, + form_data=request_form_data, + ) + form_data_key = CreateFormDataCommand(parameters).run() + if form_data_key: + url = parse.urlparse(redirect_url) + query = parse.parse_qs(url.query) + query.pop("form_data") + query["form_data_key"] = [form_data_key] + url = url._replace(query=parse.urlencode(query, True)) + redirect_url = parse.urlunparse(url) + + # Return a relative URL + url = parse.urlparse(redirect_url) + if url.query: + return f"{url.path}?{url.query}" + return url.path + @has_access @event_logger.log_this @expose("/explore/<datasource_type>/<int:datasource_id>/", methods=["GET", "POST"]) @expose("/explore/", methods=["GET", "POST"]) - @expose("/explore/p/<key>/", methods=["GET"]) + @deprecated() # pylint: disable=too-many-locals,too-many-branches,too-many-statements def explore( self, @@ -760,11 +806,14 @@ def explore( datasource_id: Optional[int] = None, key: Optional[str] = None, ) -> FlaskResponse: + if request.method == "GET": + return redirect(Superset.get_redirect_url()) + initial_form_data = {} form_data_key = request.args.get("form_data_key") if key is not None: - command = GetExplorePermalinkCommand(g.user, key) + command = GetExplorePermalinkCommand(key) try: permalink_value = command.run() if permalink_value: @@ -781,7 +830,7 @@ def explore( flash(__("Error: %(msg)s", msg=ex.message), "danger") return redirect("/chart/list/") elif form_data_key: - parameters = CommandParameters(actor=g.user, key=form_data_key) + parameters = CommandParameters(key=form_data_key) value = GetFormDataCommand(parameters).run() initial_form_data = json.loads(value) if value else {} @@ -815,14 +864,16 @@ def explore( ) except SupersetException: datasource_id = None - # fallback unkonw datasource to table type + # fallback unknown datasource to table type datasource_type = SqlaTable.type datasource: Optional[BaseDatasource] = None if datasource_id is not None: try: - datasource = ConnectorRegistry.get_datasource( - cast(str, datasource_type), datasource_id, db.session + datasource = DatasourceDAO.get_datasource( + db.session, + DatasourceType("table"), + datasource_id, ) except DatasetNotFoundError: pass @@ -846,9 +897,22 @@ def explore( if not viz_type and datasource and datasource.default_endpoint: return redirect(datasource.default_endpoint) + selectedColumns = [] + + if "selectedColumns" in form_data: + selectedColumns = form_data.pop("selectedColumns") + + if "viz_type" not in form_data: + form_data["viz_type"] = app.config["DEFAULT_VIZ_TYPE"] + if app.config["DEFAULT_VIZ_TYPE"] == "table": + all_columns = [] + for x in selectedColumns: + all_columns.append(x["name"]) + form_data["all_columns"] = all_columns + # slc perms slice_add_perm = security_manager.can_access("can_write", "Chart") - slice_overwrite_perm = is_owner(slc, g.user) if slc else False + slice_overwrite_perm = security_manager.is_owner(slc) if slc else False slice_download_perm = security_manager.can_access("can_csv", "Superset") form_data["datasource"] = str(datasource_id) + "__" + cast(str, datasource_type) @@ -866,13 +930,13 @@ def explore( if action == "overwrite" and not slice_overwrite_perm: return json_error_response( - _("You don't have the rights to ") + _("alter this ") + _("chart"), + _("You don't have the rights to alter this chart"), status=403, ) if action == "saveas" and not slice_add_perm: return json_error_response( - _("You don't have the rights to ") + _("create a ") + _("chart"), + _("You don't have the rights to create a chart"), status=403, ) @@ -918,7 +982,7 @@ def explore( "force": force, "user": bootstrap_user_data(g.user, include_perms=True), "forced_height": request.args.get("height"), - "common": common_bootstrap_payload(), + "common": common_bootstrap_payload(g.user), } if slc: title = slc.slice_name @@ -947,6 +1011,7 @@ def explore( @has_access_api @event_logger.log_this @expose("/filter/<datasource_type>/<int:datasource_id>/<column>/") + @deprecated() def filter( # pylint: disable=no-self-use self, datasource_type: str, datasource_id: int, column: str ) -> FlaskResponse: @@ -960,10 +1025,8 @@ def filter( # pylint: disable=no-self-use :raises SupersetSecurityException: If the user cannot access the resource """ # TODO: Cache endpoint by user, datasource and column - datasource = ConnectorRegistry.get_datasource( - datasource_type, - datasource_id, - db.session, + datasource = DatasourceDAO.get_datasource( + db.session, DatasourceType(datasource_type), datasource_id ) if not datasource: return json_error_response(DATASOURCE_MISSING_ERR) @@ -978,14 +1041,8 @@ def filter( # pylint: disable=no-self-use return json_success(payload) @staticmethod - def remove_extra_filters(filters: List[Dict[str, Any]]) -> List[Dict[str, Any]]: - """Extra filters are ones inherited from the dashboard's temporary context - Those should not be saved when saving the chart""" - return [f for f in filters if not f.get("isExtra")] - def save_or_overwrite_slice( # pylint: disable=too-many-arguments,too-many-locals - self, slc: Optional[Slice], slice_add_perm: bool, slice_overwrite_perm: bool, @@ -1005,9 +1062,7 @@ def save_or_overwrite_slice( form_data.pop("slice_id") # don't save old slice_id slc = Slice(owners=[g.user] if g.user else []) - form_data["adhoc_filters"] = self.remove_extra_filters( - form_data.get("adhoc_filters") or [] - ) + utils.remove_extra_adhoc_filters(form_data) assert slc slc.params = json.dumps(form_data, indent=2, sort_keys=True) @@ -1043,12 +1098,10 @@ def save_or_overwrite_slice( .one(), ) # check edit dashboard permissions - dash_overwrite_perm = check_ownership(dash, raise_if_false=False) + dash_overwrite_perm = security_manager.is_owner(dash) if not dash_overwrite_perm: return json_error_response( - _("You don't have the rights to ") - + _("alter this ") - + _("dashboard"), + _("You don't have the rights to alter this dashboard"), status=403, ) @@ -1064,9 +1117,7 @@ def save_or_overwrite_slice( dash_add_perm = security_manager.can_access("can_write", "Dashboard") if not dash_add_perm: return json_error_response( - _("You don't have the rights to ") - + _("create a ") - + _("dashboard"), + _("You don't have the rights to create a dashboard"), status=403, ) @@ -1102,132 +1153,100 @@ def save_or_overwrite_slice( @api @has_access_api @event_logger.log_this - @expose("/tables/<int:db_id>/<schema>/<substr>/") - @expose("/tables/<int:db_id>/<schema>/<substr>/<force_refresh>/") - @expose("/tables/<int:db_id>/<schema>/<substr>/<force_refresh>/<exact_match>") - def tables( # pylint: disable=too-many-locals,no-self-use,too-many-arguments + @expose("/tables/<int:db_id>/<schema>/") + @expose("/tables/<int:db_id>/<schema>/<force_refresh>/") + @deprecated() + def tables( # pylint: disable=no-self-use self, db_id: int, schema: str, - substr: str, force_refresh: str = "false", - exact_match: str = "false", ) -> FlaskResponse: """Endpoint to fetch the list of tables for given database""" - # Guarantees database filtering by security access - query = db.session.query(Database) - query = DatabaseFilter("id", SQLAInterface(Database, db.session)).apply( - query, None - ) - database = query.filter_by(id=db_id).one_or_none() - if not database: - return json_error_response("Not found", 404) force_refresh_parsed = force_refresh.lower() == "true" - exact_match_parsed = exact_match.lower() == "true" schema_parsed = utils.parse_js_uri_path_item(schema, eval_undefined=True) - substr_parsed = utils.parse_js_uri_path_item(substr, eval_undefined=True) - - if schema_parsed: - tables = [ - utils.DatasourceName(*datasource_name) - for datasource_name in database.get_all_table_names_in_schema( - schema=schema_parsed, - force=force_refresh_parsed, - cache=database.table_cache_enabled, - cache_timeout=database.table_cache_timeout, - ) - ] or [] - views = [ - utils.DatasourceName(*datasource_name) - for datasource_name in database.get_all_view_names_in_schema( - schema=schema_parsed, - force=force_refresh_parsed, - cache=database.table_cache_enabled, - cache_timeout=database.table_cache_timeout, - ) - ] or [] - else: - tables = [ - utils.DatasourceName(*datasource_name) - for datasource_name in database.get_all_table_names_in_database( - cache=True, force=False, cache_timeout=24 * 60 * 60 - ) - ] - views = [ - utils.DatasourceName(*datasource_name) - for datasource_name in database.get_all_view_names_in_database( - cache=True, force=False, cache_timeout=24 * 60 * 60 - ) - ] - tables = security_manager.get_datasources_accessible_by_user( - database, tables, schema_parsed - ) - views = security_manager.get_datasources_accessible_by_user( - database, views, schema_parsed - ) - - def get_datasource_label(ds_name: utils.DatasourceName) -> str: - return ( - ds_name.table if schema_parsed else f"{ds_name.schema}.{ds_name.table}" - ) - def is_match(src: str, target: utils.DatasourceName) -> bool: - target_label = get_datasource_label(target) - if exact_match_parsed: - return src == target_label - return src in target_label + if not schema_parsed: + return json_error_response(_("Schema undefined"), status=422) - if substr_parsed: - tables = [tn for tn in tables if is_match(substr_parsed, tn)] - views = [vn for vn in views if is_match(substr_parsed, vn)] - - if not schema_parsed and database.default_schemas: - user_schemas = ( - [g.user.email.split("@")[0]] if hasattr(g.user, "email") else [] + # Guarantees database filtering by security access + database = ( + DatabaseFilter("id", SQLAInterface(Database, db.session)) + .apply( + db.session.query(Database), + None, ) - valid_schemas = set(database.default_schemas + user_schemas) + .filter_by(id=db_id) + .one_or_none() + ) - tables = [tn for tn in tables if tn.schema in valid_schemas] - views = [vn for vn in views if vn.schema in valid_schemas] + if not database: + return json_error_response( + __("Database not found: %(id)s", id=db_id), status=404 + ) - max_items = config["MAX_TABLE_NAMES"] or len(tables) - total_items = len(tables) + len(views) - max_tables = len(tables) - max_views = len(views) - if total_items and substr_parsed: - max_tables = max_items * len(tables) // total_items - max_views = max_items * len(views) // total_items + try: + tables = security_manager.get_datasources_accessible_by_user( + database=database, + schema=schema_parsed, + datasource_names=sorted( + utils.DatasourceName(*datasource_name) + for datasource_name in database.get_all_table_names_in_schema( + schema=schema_parsed, + force=force_refresh_parsed, + cache=database.table_cache_enabled, + cache_timeout=database.table_cache_timeout, + ) + ), + ) - dataset_tables = {table.name: table for table in database.tables} + views = security_manager.get_datasources_accessible_by_user( + database=database, + schema=schema_parsed, + datasource_names=sorted( + utils.DatasourceName(*datasource_name) + for datasource_name in database.get_all_view_names_in_schema( + schema=schema_parsed, + force=force_refresh_parsed, + cache=database.table_cache_enabled, + cache_timeout=database.table_cache_timeout, + ) + ), + ) + except SupersetException as ex: + return json_error_response(ex.message, ex.status) + + extra_dict_by_name = { + table.name: table.extra_dict + for table in ( + db.session.query(SqlaTable).filter( + SqlaTable.database_id == database.id, + SqlaTable.schema == schema_parsed, + ) + ).all() + } - table_options = [ - { - "value": tn.table, - "schema": tn.schema, - "label": get_datasource_label(tn), - "title": get_datasource_label(tn), - "type": "table", - "extra": dataset_tables[f"{tn.schema}.{tn.table}"].extra_dict - if (f"{tn.schema}.{tn.table}" in dataset_tables) - else None, - } - for tn in tables[:max_tables] - ] - table_options.extend( + options = sorted( [ { - "value": vn.table, - "schema": vn.schema, - "label": get_datasource_label(vn), - "title": get_datasource_label(vn), - "type": "view", + "value": table.table, + "type": "table", + "extra": extra_dict_by_name.get(table.table, None), } - for vn in views[:max_views] + for table in tables ] + + [ + { + "value": view.table, + "type": "view", + } + for view in views + ], + key=lambda item: item["value"], ) - table_options.sort(key=lambda value: value["label"]) - payload = {"tableLength": len(tables) + len(views), "options": table_options} + + payload = {"tableLength": len(tables) + len(views), "options": options} return json_success(json.dumps(payload)) @api @@ -1290,7 +1309,7 @@ def save_dash( # pylint: disable=no-self-use """Save a dashboard's metadata""" session = db.session() dash = session.query(Dashboard).get(dashboard_id) - check_ownership(dash, raise_if_false=True) + security_manager.raise_for_ownership(dash) data = json.loads(request.form["data"]) # client-side send back last_modified_time which was set when # the dashboard was open. it was use to avoid mid-air collision. @@ -1333,7 +1352,7 @@ def add_slices( # pylint: disable=no-self-use data = json.loads(request.form["data"]) session = db.session() dash = session.query(Dashboard).get(dashboard_id) - check_ownership(dash, raise_if_false=True) + security_manager.raise_for_ownership(dash) new_slices = session.query(Slice).filter(Slice.id.in_(data["slice_ids"])) dash.slices += new_slices session.merge(dash) @@ -1345,13 +1364,9 @@ def add_slices( # pylint: disable=no-self-use @has_access_api @event_logger.log_this @expose("/testconn", methods=["POST", "GET"]) - def testconn(self) -> FlaskResponse: + @deprecated() + def testconn(self) -> FlaskResponse: # pylint: disable=no-self-use """Tests a sqla connection""" - logger.warning( - "%s.testconn " - "This API endpoint is deprecated and will be removed in version 3.0.0", - self.__class__.__name__, - ) db_name = request.json.get("name") uri = request.json.get("uri") try: @@ -1381,11 +1396,11 @@ def testconn(self) -> FlaskResponse: ) database.set_sqlalchemy_uri(uri) database.db_engine_spec.mutate_db_for_connection_test(database) - engine = database.get_sqla_engine() - with closing(engine.raw_connection()) as conn: - if engine.dialect.do_ping(conn): - return json_success('"OK"') + with database.get_sqla_engine_with_context() as engine: + with closing(engine.raw_connection()) as conn: + if engine.dialect.do_ping(conn): + return json_success('"OK"') raise DBAPIError(None, None, None) except CertificateException as ex: @@ -1438,9 +1453,8 @@ def get_user_activity_access_error(user_id: int) -> Optional[FlaskResponse]: @has_access_api @event_logger.log_this @expose("/recent_activity/<int:user_id>/", methods=["GET"]) - def recent_activity( # pylint: disable=too-many-locals - self, user_id: int - ) -> FlaskResponse: + @deprecated() + def recent_activity(self, user_id: int) -> FlaskResponse: """Recent activity (actions) for a given user""" error_obj = self.get_user_activity_access_error(user_id) if error_obj: @@ -1452,102 +1466,15 @@ def recent_activity( # pylint: disable=too-many-locals # whether to get distinct subjects distinct = request.args.get("distinct") != "false" - has_subject_title = or_( - and_( - Dashboard.dashboard_title is not None, - Dashboard.dashboard_title != "", - ), - and_(Slice.slice_name is not None, Slice.slice_name != ""), - ) - - if distinct: - one_year_ago = datetime.today() - timedelta(days=365) - subqry = ( - db.session.query( - Log.dashboard_id, - Log.slice_id, - Log.action, - func.max(Log.dttm).label("dttm"), - ) - .group_by(Log.dashboard_id, Log.slice_id, Log.action) - .filter( - and_( - Log.action.in_(actions), - Log.user_id == user_id, - # limit to one year of data to improve performance - Log.dttm > one_year_ago, - or_(Log.dashboard_id.isnot(None), Log.slice_id.isnot(None)), - ) - ) - .subquery() - ) - qry = ( - db.session.query( - subqry, - Dashboard.slug.label("dashboard_slug"), - Dashboard.dashboard_title, - Slice.slice_name, - ) - .outerjoin(Dashboard, Dashboard.id == subqry.c.dashboard_id) - .outerjoin( - Slice, - Slice.id == subqry.c.slice_id, - ) - .filter(has_subject_title) - .order_by(subqry.c.dttm.desc()) - .limit(limit) - ) - else: - qry = ( - db.session.query( - Log.dttm, - Log.action, - Log.dashboard_id, - Log.slice_id, - Dashboard.slug.label("dashboard_slug"), - Dashboard.dashboard_title, - Slice.slice_name, - ) - .outerjoin(Dashboard, Dashboard.id == Log.dashboard_id) - .outerjoin(Slice, Slice.id == Log.slice_id) - .filter(has_subject_title) - .order_by(Log.dttm.desc()) - .limit(limit) - ) + payload = LogDAO.get_recent_activity(user_id, actions, distinct, 0, limit) - payload = [] - for log in qry.all(): - item_url = None - item_title = None - item_type = None - if log.dashboard_id: - item_type = "dashboard" - item_url = Dashboard(id=log.dashboard_id, slug=log.dashboard_slug).url - item_title = log.dashboard_title - elif log.slice_id: - slc = Slice(id=log.slice_id, slice_name=log.slice_name) - item_type = "slice" - item_url = slc.slice_url - item_title = slc.chart - - payload.append( - { - "action": log.action, - "item_type": item_type, - "item_url": item_url, - "item_title": item_title, - "time": log.dttm, - "time_delta_humanized": humanize.naturaltime( - datetime.now() - log.dttm - ), - } - ) return json_success(json.dumps(payload, default=utils.json_int_dttm_ser)) @api @has_access_api @event_logger.log_this @expose("/available_domains/", methods=["GET"]) + @deprecated() def available_domains(self) -> FlaskResponse: # pylint: disable=no-self-use """ Returns the list of available Superset Webserver domains (if any) @@ -1562,13 +1489,9 @@ def available_domains(self) -> FlaskResponse: # pylint: disable=no-self-use @has_access_api @event_logger.log_this @expose("/fave_dashboards_by_username/<username>/", methods=["GET"]) + @deprecated() def fave_dashboards_by_username(self, username: str) -> FlaskResponse: """This lets us use a user's username to pull favourite dashboards""" - logger.warning( - "%s.fave_dashboards_by_username " - "This API endpoint is deprecated and will be removed in version 3.0.0", - self.__class__.__name__, - ) user = security_manager.find_user(username=username) return self.fave_dashboards(user.id) @@ -1576,12 +1499,8 @@ def fave_dashboards_by_username(self, username: str) -> FlaskResponse: @has_access_api @event_logger.log_this @expose("/fave_dashboards/<int:user_id>/", methods=["GET"]) + @deprecated() def fave_dashboards(self, user_id: int) -> FlaskResponse: - logger.warning( - "%s.fave_dashboards " - "This API endpoint is deprecated and will be removed in version 3.0.0", - self.__class__.__name__, - ) error_obj = self.get_user_activity_access_error(user_id) if error_obj: return error_obj @@ -1617,13 +1536,8 @@ def fave_dashboards(self, user_id: int) -> FlaskResponse: @has_access_api @event_logger.log_this @expose("/created_dashboards/<int:user_id>/", methods=["GET"]) + @deprecated() def created_dashboards(self, user_id: int) -> FlaskResponse: - logger.warning( - "%s.created_dashboards " - "This API endpoint is deprecated and will be removed in version 3.0.0", - self.__class__.__name__, - ) - error_obj = self.get_user_activity_access_error(user_id) if error_obj: return error_obj @@ -1657,7 +1571,7 @@ def created_dashboards(self, user_id: int) -> FlaskResponse: def user_slices(self, user_id: Optional[int] = None) -> FlaskResponse: """List of slices a user owns, created, modified or faved""" if not user_id: - user_id = cast(int, g.user.id) + user_id = cast(int, get_user_id()) error_obj = self.get_user_activity_access_error(user_id) if error_obj: return error_obj @@ -1707,10 +1621,11 @@ def user_slices(self, user_id: Optional[int] = None) -> FlaskResponse: @event_logger.log_this @expose("/created_slices", methods=["GET"]) @expose("/created_slices/<int:user_id>/", methods=["GET"]) + @deprecated() def created_slices(self, user_id: Optional[int] = None) -> FlaskResponse: """List of slices created by this user""" if not user_id: - user_id = cast(int, g.user.id) + user_id = cast(int, get_user_id()) error_obj = self.get_user_activity_access_error(user_id) if error_obj: return error_obj @@ -1741,7 +1656,7 @@ def created_slices(self, user_id: Optional[int] = None) -> FlaskResponse: def fave_slices(self, user_id: Optional[int] = None) -> FlaskResponse: """Favorite slices for a user""" if user_id is None: - user_id = g.user.id + user_id = cast(int, get_user_id()) error_obj = self.get_user_activity_access_error(user_id) if error_obj: return error_obj @@ -1837,28 +1752,35 @@ def warm_up_cache( # pylint: disable=too-many-locals,no-self-use for slc in slices: try: - form_data = get_form_data(slc.id, use_slice_data=True)[0] - if dashboard_id: - form_data["extra_filters"] = ( - json.loads(extra_filters) - if extra_filters - else get_dashboard_extra_filters(slc.id, dashboard_id) - ) + query_context = slc.get_query_context() + if query_context: + query_context.force = True + command = ChartDataCommand(query_context) + command.validate() + payload = command.run() + else: + form_data = get_form_data(slc.id, use_slice_data=True)[0] + if dashboard_id: + form_data["extra_filters"] = ( + json.loads(extra_filters) + if extra_filters + else get_dashboard_extra_filters(slc.id, dashboard_id) + ) - if not slc.datasource: - raise Exception("Slice's datasource does not exist") + if not slc.datasource: + raise Exception("Slice's datasource does not exist") - obj = get_viz( - datasource_type=slc.datasource.type, - datasource_id=slc.datasource.id, - form_data=form_data, - force=True, - ) + obj = get_viz( + datasource_type=slc.datasource.type, + datasource_id=slc.datasource.id, + form_data=form_data, + force=True, + ) + # pylint: disable=assigning-non-slot + g.form_data = form_data + payload = obj.get_payload() + delattr(g, "form_data") - # pylint: disable=assigning-non-slot - g.form_data = form_data - payload = obj.get_payload() - delattr(g, "form_data") error = payload["errors"] or None status = payload["status"] except Exception as ex: # pylint: disable=broad-except @@ -1878,13 +1800,13 @@ def favstar( # pylint: disable=no-self-use self, class_name: str, obj_id: int, action: str ) -> FlaskResponse: """Toggle favorite stars on Slices and Dashboard""" - if not g.user.get_id(): + if not get_user_id(): return json_error_response("ERROR: Favstar toggling denied", status=403) session = db.session() count = 0 favs = ( session.query(FavStar) - .filter_by(class_name=class_name, obj_id=obj_id, user_id=g.user.get_id()) + .filter_by(class_name=class_name, obj_id=obj_id, user_id=get_user_id()) .all() ) if action == "select": @@ -1893,7 +1815,7 @@ def favstar( # pylint: disable=no-self-use FavStar( class_name=class_name, obj_id=obj_id, - user_id=g.user.get_id(), + user_id=get_user_id(), dttm=datetime.now(), ) ) @@ -1932,8 +1854,8 @@ def dashboard( if config["ENABLE_ACCESS_REQUEST"]: for datasource in dashboard.datasources: - datasource = ConnectorRegistry.get_datasource( - datasource_type=datasource.type, + datasource = DatasourceDAO.get_datasource( + datasource_type=DatasourceType(datasource.type), datasource_id=datasource.id, session=db.session(), ) @@ -1950,8 +1872,8 @@ def dashboard( f"/superset/request_access/?dashboard_id={dashboard.id}" ) - dash_edit_perm = check_ownership( - dashboard, raise_if_false=False + dash_edit_perm = security_manager.is_owner( + dashboard ) and security_manager.can_access("can_save_dash", "Superset") edit_mode = ( request.args.get(utils.ReservedUrlParameters.EDIT_MODE.value) == "true" @@ -1968,12 +1890,14 @@ def dashboard( bootstrap_data = { "user": bootstrap_user_data(g.user, include_perms=True), - "common": common_bootstrap_payload(), + "common": common_bootstrap_payload(g.user), } return self.render_template( "superset/spa.html", entry="spa", + # dashboard title is always visible + title=dashboard.dashboard_title, bootstrap_data=json.dumps( bootstrap_data, default=utils.pessimistic_json_iso_dttm_ser ), @@ -1987,19 +1911,19 @@ def dashboard_permalink( # pylint: disable=no-self-use key: str, ) -> FlaskResponse: try: - value = GetDashboardPermalinkCommand(g.user, key).run() + value = GetDashboardPermalinkCommand(key).run() except DashboardPermalinkGetFailedError as ex: flash(__("Error: %(msg)s", msg=ex.message), "danger") return redirect("/dashboard/list/") if not value: return json_error_response(_("permalink state not found"), status=404) - dashboard_id = value["dashboardId"] + dashboard_id, state = value["dashboardId"], value.get("state", {}) url = f"/superset/dashboard/{dashboard_id}?permalink_key={key}" - url_params = value["state"].get("urlParams") + url_params = state.get("urlParams") if url_params: params = parse.urlencode(url_params) url = f"{url}&{params}" - hash_ = value["state"].get("hash") + hash_ = state.get("anchor", state.get("hash")) if hash_: url = f"{url}#{hash_}" return redirect(url) @@ -2014,6 +1938,7 @@ def log(self) -> FlaskResponse: # pylint: disable=no-self-use @has_access @expose("/get_or_create_table/", methods=["POST"]) @event_logger.log_this + @deprecated() def sqllab_table_viz(self) -> FlaskResponse: # pylint: disable=no-self-use """Gets or creates a table object with attributes passed to the API. @@ -2043,11 +1968,11 @@ def sqllab_table_viz(self) -> FlaskResponse: # pylint: disable=no-self-use table.schema = data.get("schema") table.template_params = data.get("templateParams") # needed for the table validation. + # fn can be deleted when this endpoint is removed validate_sqlatable(table) db.session.add(table) table.fetch_metadata() - create_table_permissions(table) db.session.commit() return json_success(json.dumps({"table_id": table.id})) @@ -2083,8 +2008,20 @@ def sqllab_viz(self) -> FlaskResponse: # pylint: disable=no-self-use .filter_by(database_id=database_id, table_name=table_name) .one_or_none() ) - if not table: - table = SqlaTable(table_name=table_name, owners=[g.user]) + + if table: + return json_errors_response( + [ + SupersetError( + message=f"Dataset [{table_name}] already exists", + error_type=SupersetErrorType.GENERIC_BACKEND_ERROR, + level=ErrorLevel.WARNING, + ) + ], + status=422, + ) + + table = SqlaTable(table_name=table_name, owners=[g.user]) table.database = database table.schema = data.get("schema") table.template_params = data.get("templateParams") @@ -2106,20 +2043,20 @@ def sqllab_viz(self) -> FlaskResponse: # pylint: disable=no-self-use table.columns = cols table.metrics = [SqlMetric(metric_name="count", expression="count(*)")] db.session.commit() - return json_success(json.dumps({"table_id": table.id})) + + return json_success( + json.dumps( + {"table_id": table.id, "data": sanitize_datasource_data(table.data)} + ) + ) @has_access @expose("/extra_table_metadata/<int:database_id>/<table_name>/<schema>/") @event_logger.log_this - def extra_table_metadata( + @deprecated() + def extra_table_metadata( # pylint: disable=no-self-use self, database_id: int, table_name: str, schema: str ) -> FlaskResponse: - logger.warning( - "%s.extra_table_metadata " - "This API endpoint is deprecated and will be removed in version 3.0.0", - self.__class__.__name__, - ) - parsed_schema = utils.parse_js_uri_path_item(schema, eval_undefined=True) table_name = utils.parse_js_uri_path_item(table_name) # type: ignore mydb = db.session.query(Database).filter_by(id=database_id).one() @@ -2174,6 +2111,7 @@ def theme(self) -> FlaskResponse: @has_access_api @expose("/results/<key>/") @event_logger.log_this + @deprecated() def results(self, key: str) -> FlaskResponse: return self.results_exec(key) @@ -2217,7 +2155,7 @@ def results_exec(key: str) -> FlaskResponse: raise SupersetErrorException( SupersetError( message=__( - "The query associated with these results could not be find. " + "The query associated with these results could not be found. " "You need to re-run the original query." ), error_type=SupersetErrorType.RESULTS_BACKEND_ERROR, @@ -2295,6 +2233,7 @@ def results_exec(key: str) -> FlaskResponse: on_giveup=lambda details: db.session.rollback(), max_tries=5, ) + @deprecated() def stop_query(self) -> FlaskResponse: client_id = request.form.get("client_id") query = db.session.query(Query).filter_by(client_id=client_id).one() @@ -2312,6 +2251,10 @@ def stop_query(self) -> FlaskResponse: raise SupersetCancelQueryException("Could not cancel query") query.status = QueryStatus.STOPPED + # Add the stop identity attribute because the sqlalchemy thread is unsafe + # because of multiple updates to the status in the query table + query.set_extra_json_key(QUERY_EARLY_CANCEL_KEY, True) + query.end_time = now_as_float() db.session.commit() return self.json_response("OK") @@ -2319,19 +2262,14 @@ def stop_query(self) -> FlaskResponse: @has_access_api @event_logger.log_this @expose("/validate_sql_json/", methods=["POST", "GET"]) + @deprecated() def validate_sql_json( - # pylint: disable=too-many-locals + # pylint: disable=too-many-locals,no-self-use self, ) -> FlaskResponse: """Validates that arbitrary sql is acceptable for the given database. Returns a list of error/warning annotations as json. """ - logger.warning( - "%s.validate_sql_json " - "This API endpoint is deprecated and will be removed in version 3.0.0", - self.__class__.__name__, - ) - sql = request.form["sql"] database_id = request.form["database_id"] schema = request.form.get("schema") or None @@ -2397,7 +2335,12 @@ def validate_sql_json( @handle_api_exception @event_logger.log_this @expose("/sql_json/", methods=["POST"]) + @deprecated() def sql_json(self) -> FlaskResponse: + errors = SqlJsonPayloadSchema().validate(request.json) + if errors: + return json_error_response(status=400, payload=errors) + try: log_params = { "user_agent": cast(Optional[str], request.headers.get("USER_AGENT")) @@ -2432,7 +2375,7 @@ def _create_sql_json_command( SqlQueryRenderImpl(get_template_processor), sql_json_executor, execution_context_convertor, - config.get("SQLLAB_CTAS_NO_LIMIT"), # type: ignore + config["SQLLAB_CTAS_NO_LIMIT"], log_params, ) @@ -2470,9 +2413,8 @@ def _create_response_from_execution_context( # pylint: disable=invalid-name, no @has_access @event_logger.log_this @expose("/csv/<client_id>") - def csv( # pylint: disable=no-self-use,too-many-locals - self, client_id: str - ) -> FlaskResponse: + @deprecated() + def csv(self, client_id: str) -> FlaskResponse: # pylint: disable=no-self-use """Download the query results as csv.""" logger.info("Exporting CSV file [%s]", client_id) query = db.session.query(Query).filter_by(client_id=client_id).one() @@ -2495,8 +2437,13 @@ def csv( # pylint: disable=no-self-use,too-many-locals obj = _deserialize_results_payload( payload, query, cast(bool, results_backend_use_msgpack) ) - columns = [c["name"] for c in obj["columns"]] - df = pd.DataFrame.from_records(obj["data"], columns=columns) + + df = pd.DataFrame( + data=obj["data"], + dtype=object, + columns=[c["name"] for c in obj["columns"]], + ) + logger.info("Using pandas to convert to CSV") else: logger.info("Running a query to turn into CSV") @@ -2540,6 +2487,7 @@ def csv( # pylint: disable=no-self-use,too-many-locals @has_access @event_logger.log_this @expose("/fetch_datasource_metadata") + @deprecated() def fetch_datasource_metadata(self) -> FlaskResponse: # pylint: disable=no-self-use """ Fetch the datasource metadata. @@ -2547,12 +2495,9 @@ def fetch_datasource_metadata(self) -> FlaskResponse: # pylint: disable=no-self :returns: The Flask response :raises SupersetSecurityException: If the user cannot access the resource """ - datasource_id, datasource_type = request.args["datasourceKey"].split("__") - datasource = ConnectorRegistry.get_datasource( - datasource_type, - datasource_id, - db.session, + datasource = DatasourceDAO.get_datasource( + db.session, DatasourceType(datasource_type), int(datasource_id) ) # Check if datasource exists if not datasource: @@ -2565,6 +2510,7 @@ def fetch_datasource_metadata(self) -> FlaskResponse: # pylint: disable=no-self @event_logger.log_this @expose("/queries/<float:last_updated_ms>") @expose("/queries/<int:last_updated_ms>") + @deprecated() def queries(self, last_updated_ms: Union[float, int]) -> FlaskResponse: """ Get the updated queries. @@ -2577,7 +2523,7 @@ def queries(self, last_updated_ms: Union[float, int]) -> FlaskResponse: @staticmethod def queries_exec(last_updated_ms: Union[float, int]) -> FlaskResponse: stats_logger.incr("queries") - if not g.user.get_id(): + if not get_user_id(): return json_error_response( "Please login to access the queries.", status=403 ) @@ -2587,9 +2533,7 @@ def queries_exec(last_updated_ms: Union[float, int]) -> FlaskResponse: sql_queries = ( db.session.query(Query) - .filter( - Query.user_id == g.user.get_id(), Query.changed_on >= last_updated_dt - ) + .filter(Query.user_id == get_user_id(), Query.changed_on >= last_updated_dt) .all() ) dict_queries = {q.client_id: q.to_dict() for q in sql_queries} @@ -2598,6 +2542,7 @@ def queries_exec(last_updated_ms: Union[float, int]) -> FlaskResponse: @has_access @event_logger.log_this @expose("/search_queries") + @deprecated() def search_queries(self) -> FlaskResponse: # pylint: disable=no-self-use """ Search for previously run sqllab queries. Used for Sqllab Query Search @@ -2615,10 +2560,10 @@ def search_queries(self) -> FlaskResponse: # pylint: disable=no-self-use search_user_id = int(cast(int, request.args.get("user_id"))) except ValueError: return Response(status=400, mimetype="application/json") - if search_user_id != g.user.get_user_id(): + if search_user_id != get_user_id(): return Response(status=403, mimetype="application/json") else: - search_user_id = g.user.get_user_id() + search_user_id = get_user_id() database_id = request.args.get("database_id") search_text = request.args.get("search_text") status = request.args.get("status") @@ -2671,14 +2616,14 @@ def show_traceback(self) -> FlaskResponse: # pylint: disable=no-self-use @expose("/welcome/") def welcome(self) -> FlaskResponse: """Personalized welcome page""" - if not g.user or not g.user.get_id(): + if not g.user or not get_user_id(): if conf["PUBLIC_ROLE_LIKE"]: return self.render_template("superset/public_welcome.html") return redirect(appbuilder.get_url_for_login) welcome_dashboard_id = ( db.session.query(UserAttribute.welcome_dashboard_id) - .filter_by(user_id=g.user.get_id()) + .filter_by(user_id=get_user_id()) .scalar() ) if welcome_dashboard_id: @@ -2686,7 +2631,7 @@ def welcome(self) -> FlaskResponse: payload = { "user": bootstrap_user_data(g.user, include_perms=True), - "common": common_bootstrap_payload(), + "common": common_bootstrap_payload(g.user), } return self.render_template( @@ -2715,7 +2660,7 @@ def profile(self, username: str) -> FlaskResponse: payload = { "user": bootstrap_user_data(user, include_perms=True), - "common": common_bootstrap_payload(), + "common": common_bootstrap_payload(g.user), } return self.render_template( @@ -2728,7 +2673,7 @@ def profile(self, username: str) -> FlaskResponse: ) @staticmethod - def _get_sqllab_tabs(user_id: int) -> Dict[str, Any]: + def _get_sqllab_tabs(user_id: Optional[int]) -> Dict[str, Any]: # send list of tab state ids tabs_state = ( db.session.query(TabState.id, TabState.label) @@ -2779,8 +2724,8 @@ def sqllab(self) -> FlaskResponse: """SQL Editor""" payload = { "defaultDbId": config["SQLLAB_DEFAULT_DBID"], - "common": common_bootstrap_payload(), - **self._get_sqllab_tabs(g.user.get_id()), + "common": common_bootstrap_payload(g.user), + **self._get_sqllab_tabs(get_user_id()), } form_data = request.form.get("form_data") diff --git a/superset/views/css_templates.py b/superset/views/css_templates.py index 597f9efbd457..2041eaa94fc0 100644 --- a/superset/views/css_templates.py +++ b/superset/views/css_templates.py @@ -25,9 +25,10 @@ from superset.views.base import DeleteMixin, SupersetModelView -class CssTemplateModelView( - SupersetModelView, DeleteMixin -): # pylint: disable=too-many-ancestors +class CssTemplateModelView( # pylint: disable=too-many-ancestors + SupersetModelView, + DeleteMixin, +): datamodel = SQLAInterface(models.CssTemplate) include_route_methods = RouteMethod.CRUD_SET diff --git a/superset/views/dashboard/mixin.py b/superset/views/dashboard/mixin.py index 77748fdc3b10..d8838b26c9d3 100644 --- a/superset/views/dashboard/mixin.py +++ b/superset/views/dashboard/mixin.py @@ -16,8 +16,8 @@ # under the License. from flask_babel import lazy_gettext as _ -from ...dashboards.filters import DashboardAccessFilter -from ..base import check_ownership +from superset import security_manager +from superset.dashboards.filters import DashboardAccessFilter class DashboardMixin: # pylint: disable=too-few-public-methods @@ -66,7 +66,7 @@ class DashboardMixin: # pylint: disable=too-few-public-methods "roles": _( "Roles is a list which defines access to the dashboard. " "Granting a role access to a dashboard will bypass dataset level checks." - "If no roles defined then the dashboard is available to all roles." + "If no roles are defined then the dashboard is available to all roles." ), "published": _( "Determines whether or not this dashboard is " @@ -90,4 +90,4 @@ class DashboardMixin: # pylint: disable=too-few-public-methods } def pre_delete(self, item: "DashboardMixin") -> None: # pylint: disable=no-self-use - check_ownership(item) + security_manager.raise_for_ownership(item) diff --git a/superset/views/dashboard/views.py b/superset/views/dashboard/views.py index 256bb4c95c02..52cb2da82e91 100644 --- a/superset/views/dashboard/views.py +++ b/superset/views/dashboard/views.py @@ -24,7 +24,7 @@ from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.security.decorators import has_access from flask_babel import gettext as __, lazy_gettext as _ -from flask_login import AnonymousUserMixin, LoginManager +from flask_login import AnonymousUserMixin, login_user from superset import db, event_logger, is_feature_enabled, security_manager from superset.constants import MODEL_VIEW_RW_METHOD_PERMISSION_MAP, RouteMethod @@ -33,7 +33,6 @@ from superset.utils import core as utils from superset.views.base import ( BaseSupersetView, - check_ownership, common_bootstrap_payload, DeleteMixin, generate_download_headers, @@ -97,12 +96,11 @@ def pre_add(self, item: "DashboardModelView") -> None: item.owners.append(g.user) utils.validate_json(item.json_metadata) utils.validate_json(item.position_json) - owners = list(item.owners) for slc in item.slices: - slc.owners = list(set(owners) | set(slc.owners)) + slc.owners = list(set(item.owners) | set(slc.owners)) def pre_update(self, item: "DashboardModelView") -> None: - check_ownership(item) + security_manager.raise_for_ownership(item) self.pre_add(item) @@ -151,8 +149,7 @@ def embedded( # Log in as an anonymous user, just for this view. # This view needs to be visible to all users, # and building the page fails if g.user and/or ctx.user aren't present. - login_manager: LoginManager = security_manager.lm - login_manager.reload_user(AnonymousUserMixin()) + login_user(AnonymousUserMixin(), force=True) add_extra_log_payload( dashboard_id=dashboard_id_or_slug, @@ -160,7 +157,7 @@ def embedded( ) bootstrap_data = { - "common": common_bootstrap_payload(), + "common": common_bootstrap_payload(g.user), "embedded": {"dashboard_id": dashboard_id_or_slug}, } diff --git a/superset/views/database/forms.py b/superset/views/database/forms.py index 4cf594c48705..91ab38dc2fe5 100644 --- a/superset/views/database/forms.py +++ b/superset/views/database/forms.py @@ -52,6 +52,7 @@ def file_allowed_dbs() -> List[Database]: # type: ignore file_enabled_db for file_enabled_db in file_enabled_dbs if UploadToDatabaseForm.at_least_one_schema_is_allowed(file_enabled_db) + and UploadToDatabaseForm.is_engine_allowed_to_file_upl(file_enabled_db) ] @staticmethod @@ -89,20 +90,24 @@ def at_least_one_schema_is_allowed(database: Database) -> bool: return True return False + @staticmethod + def is_engine_allowed_to_file_upl(database: Database) -> bool: + """ + This method is mainly used for existing Gsheets and Clickhouse DBs + that have allow_file_upload set as True but they are no longer valid + DBs for file uploading. + New GSheets and Clickhouse DBs won't have the option to set + allow_file_upload set as True. + """ + if database.db_engine_spec.supports_file_upload: + return True + return False + class CsvToDatabaseForm(UploadToDatabaseForm): - name = StringField( - _("Table Name"), - description=_("Name of table to be created from csv data."), - validators=[ - DataRequired(), - Regexp(r"^[^\.]+$", message=_("Table name cannot contain a schema")), - ], - widget=BS3TextFieldWidget(), - ) csv_file = FileField( - _("CSV File"), - description=_("Select a CSV file to be uploaded to a database."), + _("CSV Upload"), + description=_("Select a file to be uploaded to the database"), validators=[ FileRequired(), FileAllowed( @@ -119,31 +124,45 @@ class CsvToDatabaseForm(UploadToDatabaseForm): ), ], ) - con = QuerySelectField( + table_name = StringField( + _("Table Name"), + description=_("Name of table to be created with CSV file"), + validators=[ + DataRequired(), + Regexp(r"^[^\.]+$", message=_("Table name cannot contain a schema")), + ], + widget=BS3TextFieldWidget(), + ) + database = QuerySelectField( _("Database"), + description=_("Select a database to upload the file to"), query_factory=UploadToDatabaseForm.file_allowed_dbs, get_pk=lambda a: a.id, get_label=lambda a: a.database_name, ) schema = StringField( _("Schema"), - description=_("Specify a schema (if database flavor supports this)."), + description=_("Select a schema if the database supports this"), validators=[Optional()], widget=BS3TextFieldWidget(), ) - sep = StringField( + delimiter = SelectField( _("Delimiter"), - description=_("Delimiter used by CSV file (for whitespace use \\s+)."), + description=_("Enter a delimiter for this data"), + choices=[ + (",", _(",")), + (".", _(".")), + ("other", _("Other")), + ], validators=[DataRequired()], - widget=BS3TextFieldWidget(), + default=[","], + ) + otherInput = StringField( + _("Other"), ) if_exists = SelectField( - _("Table Exists"), - description=_( - "If table exists do one of the following: " - "Fail (do nothing), Replace (drop and recreate table) " - "or Append (insert data)." - ), + _("If Table Already Exists"), + description=_("What should happen if the table already exists"), choices=[ ("fail", _("Fail")), ("replace", _("Replace")), @@ -151,97 +170,98 @@ class CsvToDatabaseForm(UploadToDatabaseForm): ], validators=[DataRequired()], ) - header = IntegerField( - _("Header Row"), - description=_( - "Row containing the headers to use as " - "column names (0 is first line of data). " - "Leave empty if there is no header row." - ), - validators=[Optional(), NumberRange(min=0)], - widget=BS3TextFieldWidget(), - ) - index_col = IntegerField( - _("Index Column"), - description=_( - "Column to use as the row labels of the " - "dataframe. Leave empty if no index column." - ), - validators=[Optional(), NumberRange(min=0)], - widget=BS3TextFieldWidget(), - ) - mangle_dupe_cols = BooleanField( - _("Mangle Duplicate Columns"), - description=_('Specify duplicate columns as "X.0, X.1".'), - ) - usecols = JsonListField( - _("Use Columns"), - default=None, - description=_( - "Json list of the column names that should be read. " - "If not None, only these columns will be read from the file." - ), - validators=[Optional()], - ) - skipinitialspace = BooleanField( - _("Skip Initial Space"), description=_("Skip spaces after delimiter.") - ) - skiprows = IntegerField( - _("Skip Rows"), - description=_("Number of rows to skip at start of file."), - validators=[Optional(), NumberRange(min=0)], - widget=BS3TextFieldWidget(), - ) - nrows = IntegerField( - _("Rows to Read"), - description=_("Number of rows of file to read."), - validators=[Optional(), NumberRange(min=0)], - widget=BS3TextFieldWidget(), + skip_initial_space = BooleanField( + _("Skip Initial Space"), description=_("Skip spaces after delimiter") ) skip_blank_lines = BooleanField( _("Skip Blank Lines"), - description=_("Skip blank lines rather than interpreting them as NaN values."), + description=_( + "Skip blank lines rather than interpreting them as Not A Number values" + ), ) parse_dates = CommaSeparatedListField( - _("Parse Dates"), + _("Columns To Be Parsed as Dates"), description=_( - "A comma separated list of columns that should be parsed as dates." + "A comma separated list of columns that should be parsed as dates" ), filters=[filter_not_empty_values], ) infer_datetime_format = BooleanField( - _("Infer Datetime Format"), - description=_("Use Pandas to interpret the datetime format automatically."), + _("Interpret Datetime Format Automatically"), + description=_("Interpret the datetime format automatically"), ) decimal = StringField( _("Decimal Character"), default=".", - description=_("Character to interpret as decimal point."), + description=_("Character to interpret as decimal point"), validators=[Optional(), Length(min=1, max=1)], widget=BS3TextFieldWidget(), ) - index = BooleanField( - _("Dataframe Index"), description=_("Write dataframe index as a column.") + null_values = JsonListField( + _("Null Values"), + default=config["CSV_DEFAULT_NA_NAMES"], + description=_( + "Json list of the values that should be treated as null. " + 'Examples: [""] for empty strings, ["None", "N/A"], ["nan", "null"]. ' + "Warning: Hive database supports only a single value" + ), + ) + index_col = IntegerField( + _("Index Column"), + description=_( + "Column to use as the row labels of the " + "dataframe. Leave empty if no index column" + ), + validators=[Optional(), NumberRange(min=0)], + widget=BS3TextFieldWidget(), + ) + dataframe_index = BooleanField( + _("Dataframe Index"), description=_("Write dataframe index as a column") ) index_label = StringField( _("Column Label(s)"), description=_( "Column label for index column(s). If None is given " - "and Dataframe Index is True, Index Names are used." + "and Dataframe Index is checked, Index Names are used" ), validators=[Optional()], widget=BS3TextFieldWidget(), ) - null_values = JsonListField( - _("Null values"), - default=config["CSV_DEFAULT_NA_NAMES"], + use_cols = JsonListField( + _("Columns To Read"), + default=None, + description=_("Json list of the column names that should be read"), + validators=[Optional()], + ) + overwrite_duplicate = BooleanField( + _("Overwrite Duplicate Columns"), description=_( - "Json list of the values that should be treated as null. " - 'Examples: [""], ["None", "N/A"], ["nan", "null"]. ' - "Warning: Hive database supports only single value. " - 'Use [""] for empty string.' + "If duplicate columns are not overridden, " + 'they will be presented as "X.1, X.2 ...X.x"' ), ) + header = IntegerField( + _("Header Row"), + description=_( + "Row containing the headers to use as " + "column names (0 is first line of data). " + "Leave empty if there is no header row" + ), + validators=[Optional(), NumberRange(min=0)], + widget=BS3TextFieldWidget(), + ) + nrows = IntegerField( + _("Rows to Read"), + description=_("Number of rows of file to read"), + validators=[Optional(), NumberRange(min=0)], + widget=BS3TextFieldWidget(), + ) + skiprows = IntegerField( + _("Skip Rows"), + description=_("Number of rows to skip at start of file"), + validators=[Optional(), NumberRange(min=0)], + widget=BS3TextFieldWidget(), + ) class ExcelToDatabaseForm(UploadToDatabaseForm): @@ -281,7 +301,7 @@ class ExcelToDatabaseForm(UploadToDatabaseForm): widget=BS3TextFieldWidget(), ) - con = QuerySelectField( + database = QuerySelectField( _("Database"), query_factory=UploadToDatabaseForm.file_allowed_dbs, get_pk=lambda a: a.id, @@ -412,7 +432,7 @@ class ColumnarToDatabaseForm(UploadToDatabaseForm): ], ) - con = QuerySelectField( + database = QuerySelectField( _("Database"), query_factory=UploadToDatabaseForm.file_allowed_dbs, get_pk=lambda a: a.id, diff --git a/superset/views/database/mixins.py b/superset/views/database/mixins.py index f6f7f1115e20..efd0b6c6eb25 100644 --- a/superset/views/database/mixins.py +++ b/superset/views/database/mixins.py @@ -63,7 +63,6 @@ class DatabaseMixin: "allow_dml", "force_ctas_schema", "impersonate_user", - "allow_multi_schema_metadata_fetch", "extra", "encrypted_extra", "server_cert", @@ -103,7 +102,7 @@ class DatabaseMixin: ), "expose_in_sqllab": _("Expose this DB in SQL Lab"), "allow_run_async": _( - "Operate the database in asynchronous mode, meaning " + "Operate the database in asynchronous mode, meaning " "that the queries are executed on remote workers as opposed " "to on the web server itself. " "This assumes that you have a Celery worker setup as well " @@ -170,11 +169,6 @@ class DatabaseMixin: "service account, but impersonate the currently logged on user " "via hive.server2.proxy.user property." ), - "allow_multi_schema_metadata_fetch": _( - "Allow SQL Lab to fetch a list of all tables and all views across " - "all database schemas. For large data warehouse with thousands of " - "tables, this can be expensive and put strain on the system." - ), "cache_timeout": _( "Duration (in seconds) of the caching timeout for charts of this database. " "A timeout of 0 indicates that the cache never expires. " @@ -203,7 +197,6 @@ class DatabaseMixin: "impersonate_user": _("Impersonate the logged on user"), "allow_file_upload": _("Allow Csv Upload"), "modified": _("Modified"), - "allow_multi_schema_metadata_fetch": _("Allow Multi Schema Metadata Fetch"), "backend": _("Backend"), } diff --git a/superset/views/database/views.py b/superset/views/database/views.py index e95f668353e7..62f7d45d3ab6 100644 --- a/superset/views/database/views.py +++ b/superset/views/database/views.py @@ -18,7 +18,7 @@ import os import tempfile import zipfile -from typing import TYPE_CHECKING +from typing import Any, TYPE_CHECKING import pandas as pd from flask import flash, g, redirect @@ -109,25 +109,71 @@ def list(self) -> FlaskResponse: return super().render_app_template() -class CsvToDatabaseView(SimpleFormView): +class CustomFormView(SimpleFormView): + """ + View for presenting your own forms + Inherit from this view to provide some base + processing for your customized form views. + + Notice that this class inherits from BaseView + so all properties from the parent class can be overridden also. + + Implement form_get and form_post to implement + your form pre-processing and post-processing + """ + + @expose("/form", methods=["GET"]) + @has_access + def this_form_get(self) -> Any: + self._init_vars() + form = self.form.refresh() + self.form_get(form) + self.update_redirect() + return self.render_template( + self.form_template, + title=self.form_title, + form=form, + appbuilder=self.appbuilder, + ) + + @expose("/form", methods=["POST"]) + @has_access + def this_form_post(self) -> Any: + self._init_vars() + form = self.form.refresh() + if form.validate_on_submit(): + response = self.form_post(form) # pylint: disable=assignment-from-no-return + if not response: + return redirect(self.get_redirect()) + return response + return self.render_template( + self.form_template, + title=self.form_title, + form=form, + appbuilder=self.appbuilder, + ) + + +class CsvToDatabaseView(CustomFormView): form = CsvToDatabaseForm form_template = "superset/form_view/csv_to_database_view/edit.html" form_title = _("CSV to Database configuration") add_columns = ["database", "schema", "table_name"] def form_get(self, form: CsvToDatabaseForm) -> None: - form.sep.data = "," + form.delimiter.data = "," form.header.data = 0 - form.mangle_dupe_cols.data = True - form.skipinitialspace.data = False + form.overwrite_duplicate.data = True + form.skip_initial_space.data = False form.skip_blank_lines.data = True form.infer_datetime_format.data = True form.decimal.data = "." form.if_exists.data = "fail" def form_post(self, form: CsvToDatabaseForm) -> Response: - database = form.con.data - csv_table = Table(table=form.name.data, schema=form.schema.data) + database = form.database.data + csv_table = Table(table=form.table_name.data, schema=form.schema.data) + delimiter_input = form.delimiter.data if not schema_allows_file_upload(database, csv_table.schema): message = __( @@ -139,6 +185,9 @@ def form_post(self, form: CsvToDatabaseForm) -> Response: flash(message, "danger") return redirect("/csvtodatabaseview/form") + if form.delimiter.data == "other": + delimiter_input = form.otherInput.data + try: df = pd.concat( pd.read_csv( @@ -150,21 +199,21 @@ def form_post(self, form: CsvToDatabaseForm) -> Response: infer_datetime_format=form.infer_datetime_format.data, iterator=True, keep_default_na=not form.null_values.data, - mangle_dupe_cols=form.mangle_dupe_cols.data, - usecols=form.usecols.data if form.usecols.data else None, + mangle_dupe_cols=form.overwrite_duplicate.data, + usecols=form.use_cols.data if form.use_cols.data else None, na_values=form.null_values.data if form.null_values.data else None, nrows=form.nrows.data, parse_dates=form.parse_dates.data, - sep=form.sep.data, + sep=delimiter_input, skip_blank_lines=form.skip_blank_lines.data, - skipinitialspace=form.skipinitialspace.data, + skipinitialspace=form.skip_initial_space.data, skiprows=form.skiprows.data, ) ) database = ( db.session.query(models.Database) - .filter_by(id=form.data.get("con").data.get("id")) + .filter_by(id=form.data.get("database").data.get("id")) .one() ) @@ -175,7 +224,7 @@ def form_post(self, form: CsvToDatabaseForm) -> Response: to_sql_kwargs={ "chunksize": 1000, "if_exists": form.if_exists.data, - "index": form.index.data, + "index": form.dataframe_index.data, "index_label": form.index_label.data, }, ) @@ -221,7 +270,7 @@ def form_post(self, form: CsvToDatabaseForm) -> Response: '"%(table_name)s" in database "%(db_name)s". ' "Error message: %(error_msg)s", filename=form.csv_file.data.filename, - table_name=form.name.data, + table_name=form.table_name.data, db_name=database.database_name, error_msg=str(ex), ) @@ -241,9 +290,9 @@ def form_post(self, form: CsvToDatabaseForm) -> Response: flash(message, "info") event_logger.log_with_context( action="successful_csv_upload", - database=form.con.data.name, + database=form.database.data.name, schema=form.schema.data, - table=form.name.data, + table=form.table_name.data, ) return redirect("/tablemodelview/list/") @@ -262,7 +311,7 @@ def form_get(self, form: ExcelToDatabaseForm) -> None: form.sheet_name.data = "" def form_post(self, form: ExcelToDatabaseForm) -> Response: - database = form.con.data + database = form.database.data excel_table = Table(table=form.name.data, schema=form.schema.data) if not schema_allows_file_upload(database, excel_table.schema): @@ -301,7 +350,7 @@ def form_post(self, form: ExcelToDatabaseForm) -> Response: database = ( db.session.query(models.Database) - .filter_by(id=form.data.get("con").data.get("id")) + .filter_by(id=form.data.get("database").data.get("id")) .one() ) @@ -378,7 +427,7 @@ def form_post(self, form: ExcelToDatabaseForm) -> Response: flash(message, "info") event_logger.log_with_context( action="successful_excel_upload", - database=form.con.data.name, + database=form.database.data.name, schema=form.schema.data, table=form.name.data, ) @@ -397,7 +446,7 @@ def form_get(self, form: ColumnarToDatabaseForm) -> None: def form_post( # pylint: disable=too-many-locals self, form: ColumnarToDatabaseForm ) -> Response: - database = form.con.data + database = form.database.data columnar_table = Table(table=form.name.data, schema=form.schema.data) files = form.columnar_file.data file_type = {file.filename.split(".")[-1] for file in files} @@ -442,7 +491,7 @@ def form_post( # pylint: disable=too-many-locals database = ( db.session.query(models.Database) - .filter_by(id=form.data.get("con").data.get("id")) + .filter_by(id=form.data.get("database").data.get("id")) .one() ) @@ -519,7 +568,7 @@ def form_post( # pylint: disable=too-many-locals flash(message, "info") event_logger.log_with_context( action="successful_columnar_upload", - database=form.con.data.name, + database=form.database.data.name, schema=form.schema.data, table=form.name.data, ) diff --git a/superset/views/datasource/schemas.py b/superset/views/datasource/schemas.py index 64b2b854bb14..f9be7a7d4e1f 100644 --- a/superset/views/datasource/schemas.py +++ b/superset/views/datasource/schemas.py @@ -14,11 +14,15 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from typing import Any +from typing import Any, Dict -from marshmallow import fields, post_load, Schema +from marshmallow import fields, post_load, pre_load, Schema, validate from typing_extensions import TypedDict +from superset import app +from superset.charts.schemas import ChartDataExtrasSchema, ChartDataFilterSchema +from superset.utils.core import DatasourceType + class ExternalMetadataParams(TypedDict): datasource_type: str @@ -54,3 +58,38 @@ def normalize( schema_name=data.get("schema_name", ""), table_name=data["table_name"], ) + + +class SamplesPayloadSchema(Schema): + filters = fields.List(fields.Nested(ChartDataFilterSchema), required=False) + granularity = fields.String( + allow_none=True, + ) + time_range = fields.String( + allow_none=True, + ) + extras = fields.Nested( + ChartDataExtrasSchema, + description="Extra parameters to add to the query.", + allow_none=True, + ) + + @pre_load + # pylint: disable=no-self-use, unused-argument + def handle_none(self, data: Dict[str, Any], **kwargs: Any) -> Dict[str, Any]: + if data is None: + return {} + return data + + +class SamplesRequestSchema(Schema): + datasource_type = fields.String( + validate=validate.OneOf([e.value for e in DatasourceType]), required=True + ) + datasource_id = fields.Integer(required=True) + force = fields.Boolean(load_default=False) + page = fields.Integer(load_default=1) + per_page = fields.Integer( + validate=validate.Range(min=1, max=app.config.get("SAMPLES_ROW_LIMIT", 1000)), + load_default=app.config.get("SAMPLES_ROW_LIMIT", 1000), + ) diff --git a/superset/views/datasource/utils.py b/superset/views/datasource/utils.py new file mode 100644 index 000000000000..42cddf416794 --- /dev/null +++ b/superset/views/datasource/utils.py @@ -0,0 +1,128 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from typing import Any, Dict, Optional + +from superset import app, db +from superset.common.chart_data import ChartDataResultType +from superset.common.query_context_factory import QueryContextFactory +from superset.common.utils.query_cache_manager import QueryCacheManager +from superset.constants import CacheRegion +from superset.datasets.commands.exceptions import DatasetSamplesFailedError +from superset.datasource.dao import DatasourceDAO +from superset.utils.core import QueryStatus +from superset.views.datasource.schemas import SamplesPayloadSchema + + +def get_limit_clause(page: Optional[int], per_page: Optional[int]) -> Dict[str, int]: + samples_row_limit = app.config.get("SAMPLES_ROW_LIMIT", 1000) + limit = samples_row_limit + offset = 0 + + if isinstance(page, int) and isinstance(per_page, int): + limit = int(per_page) + if limit < 0 or limit > samples_row_limit: + # reset limit value if input is invalid + limit = samples_row_limit + + offset = max((int(page) - 1) * limit, 0) + + return {"row_offset": offset, "row_limit": limit} + + +def get_samples( # pylint: disable=too-many-arguments,too-many-locals + datasource_type: str, + datasource_id: int, + force: bool = False, + page: int = 1, + per_page: int = 1000, + payload: Optional[SamplesPayloadSchema] = None, +) -> Dict[str, Any]: + datasource = DatasourceDAO.get_datasource( + session=db.session, + datasource_type=datasource_type, + datasource_id=datasource_id, + ) + + limit_clause = get_limit_clause(page, per_page) + + # todo(yongjie): Constructing count(*) and samples in the same query_context, + if payload is None: + # constructing samples query + samples_instance = QueryContextFactory().create( + datasource={ + "type": datasource.type, + "id": datasource.id, + }, + queries=[limit_clause], + result_type=ChartDataResultType.SAMPLES, + force=force, + ) + else: + # constructing drill detail query + # When query_type == 'samples' the `time filter` will be removed, + # so it is not applicable drill detail query + samples_instance = QueryContextFactory().create( + datasource={ + "type": datasource.type, + "id": datasource.id, + }, + queries=[{**payload, **limit_clause}], + result_type=ChartDataResultType.DRILL_DETAIL, + force=force, + ) + + # constructing count(*) query + count_star_metric = { + "metrics": [ + { + "expressionType": "SQL", + "sqlExpression": "COUNT(*)", + "label": "COUNT(*)", + } + ] + } + count_star_instance = QueryContextFactory().create( + datasource={ + "type": datasource.type, + "id": datasource.id, + }, + queries=[{**payload, **count_star_metric} if payload else count_star_metric], + result_type=ChartDataResultType.FULL, + force=force, + ) + samples_results = samples_instance.get_payload() + count_star_results = count_star_instance.get_payload() + + try: + sample_data = samples_results["queries"][0] + count_star_data = count_star_results["queries"][0] + failed_status = ( + sample_data.get("status") == QueryStatus.FAILED + or count_star_data.get("status") == QueryStatus.FAILED + ) + error_msg = sample_data.get("error") or count_star_data.get("error") + if failed_status and error_msg: + cache_key = sample_data.get("cache_key") + QueryCacheManager.delete(cache_key, region=CacheRegion.DATA) + raise DatasetSamplesFailedError(error_msg) + + sample_data["page"] = page + sample_data["per_page"] = per_page + sample_data["total_count"] = count_star_data["data"][0]["COUNT(*)"] + return sample_data + except (IndexError, KeyError) as exc: + raise DatasetSamplesFailedError from exc diff --git a/superset/views/datasource/views.py b/superset/views/datasource/views.py index e942296df757..4f158e836936 100644 --- a/superset/views/datasource/views.py +++ b/superset/views/datasource/views.py @@ -18,25 +18,25 @@ from collections import Counter from typing import Any -from flask import current_app, g, request -from flask_appbuilder import expose +from flask import current_app, redirect, request +from flask_appbuilder import expose, permission_name from flask_appbuilder.api import rison -from flask_appbuilder.security.decorators import has_access_api +from flask_appbuilder.security.decorators import has_access, has_access_api from flask_babel import _ from marshmallow import ValidationError from sqlalchemy.exc import NoSuchTableError from sqlalchemy.orm.exc import NoResultFound -from superset import db, event_logger +from superset import db, event_logger, security_manager from superset.commands.utils import populate_owners -from superset.connectors.connector_registry import ConnectorRegistry +from superset.connectors.sqla.models import SqlaTable from superset.connectors.sqla.utils import get_physical_table_metadata from superset.datasets.commands.exceptions import ( DatasetForbiddenError, DatasetNotFoundError, ) +from superset.datasource.dao import DatasourceDAO from superset.exceptions import SupersetException, SupersetSecurityException -from superset.extensions import security_manager from superset.models.core import Database from superset.superset_typing import FlaskResponse from superset.utils.core import DatasourceType @@ -44,7 +44,6 @@ from superset.views.base import ( api, BaseSupersetView, - check_ownership, handle_api_exception, json_error_response, ) @@ -52,7 +51,10 @@ ExternalMetadataParams, ExternalMetadataSchema, get_external_metadata_schema, + SamplesPayloadSchema, + SamplesRequestSchema, ) +from superset.views.datasource.utils import get_samples from superset.views.utils import sanitize_datasource_data @@ -90,21 +92,20 @@ def save(self) -> FlaskResponse: status=400, ) - orm_datasource = ConnectorRegistry.get_datasource( - DatasourceType(datasource_type), datasource_id, db.session + orm_datasource = DatasourceDAO.get_datasource( + db.session, DatasourceType(datasource_type), datasource_id ) orm_datasource.database_id = database_id if "owners" in datasource_dict and orm_datasource.owner_class is not None: # Check ownership try: - check_ownership(orm_datasource) + security_manager.raise_for_ownership(orm_datasource) except SupersetSecurityException as ex: raise DatasetForbiddenError() from ex - user = security_manager.get_user_by_id(g.user.id) datasource_dict["owners"] = populate_owners( - user, datasource_dict["owners"], default_to_user=False + datasource_dict["owners"], default_to_user=False ) duplicates = [ @@ -133,8 +134,8 @@ def save(self) -> FlaskResponse: @api @handle_api_exception def get(self, datasource_type: str, datasource_id: int) -> FlaskResponse: - datasource = ConnectorRegistry.get_datasource( - datasource_type, datasource_id, db.session + datasource = DatasourceDAO.get_datasource( + db.session, DatasourceType(datasource_type), datasource_id ) return self.json_response(sanitize_datasource_data(datasource.data)) @@ -146,8 +147,10 @@ def external_metadata( self, datasource_type: str, datasource_id: int ) -> FlaskResponse: """Gets column info from the source system""" - datasource = ConnectorRegistry.get_datasource( - datasource_type, datasource_id, db.session + datasource = DatasourceDAO.get_datasource( + db.session, + DatasourceType(datasource_type), + datasource_id, ) try: external_metadata = datasource.external_metadata() @@ -169,9 +172,8 @@ def external_metadata_by_name(self, **kwargs: Any) -> FlaskResponse: except ValidationError as err: return json_error_response(str(err), status=400) - datasource = ConnectorRegistry.get_datasource_by_name( + datasource = SqlaTable.get_datasource_by_name( session=db.session, - datasource_type=params["datasource_type"], database_name=params["database_name"], schema=params["schema_name"], datasource_name=params["table_name"], @@ -195,3 +197,45 @@ def external_metadata_by_name(self, **kwargs: Any) -> FlaskResponse: except (NoResultFound, NoSuchTableError) as ex: raise DatasetNotFoundError() from ex return self.json_response(external_metadata) + + @expose("/samples", methods=["POST"]) + @has_access_api + @api + @handle_api_exception + def samples(self) -> FlaskResponse: + try: + params = SamplesRequestSchema().load(request.args) + payload = SamplesPayloadSchema().load(request.json) + except ValidationError as err: + return json_error_response(err.messages, status=400) + + rv = get_samples( + datasource_type=params["datasource_type"], + datasource_id=params["datasource_id"], + force=params["force"], + page=params["page"], + per_page=params["per_page"], + payload=payload, + ) + return self.json_response({"result": rv}) + + +class DatasetEditor(BaseSupersetView): + route_base = "/dataset" + class_permission_name = "Dataset" + + @expose("/add/") + @has_access + @permission_name("read") + def root(self) -> FlaskResponse: + return super().render_app_template() + + @expose("/<pk>", methods=["GET"]) + @has_access + @permission_name("read") + # pylint: disable=unused-argument + def show(self, pk: int) -> FlaskResponse: + dev = request.args.get("testing") + if dev is not None: + return super().render_app_template() + return redirect("/") diff --git a/superset/views/explore.py b/superset/views/explore.py new file mode 100644 index 000000000000..8becaaba7035 --- /dev/null +++ b/superset/views/explore.py @@ -0,0 +1,49 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from flask_appbuilder import permission_name +from flask_appbuilder.api import expose +from flask_appbuilder.security.decorators import has_access + +from superset import event_logger +from superset.superset_typing import FlaskResponse + +from .base import BaseSupersetView + + +class ExploreView(BaseSupersetView): + route_base = "/explore" + class_permission_name = "Explore" + + @expose("/") + @has_access + @permission_name("read") + @event_logger.log_this + def root(self) -> FlaskResponse: + return super().render_app_template() + + +class ExplorePermalinkView(BaseSupersetView): + route_base = "/superset" + class_permission_name = "Explore" + + @expose("/explore/p/<key>/") + @has_access + @permission_name("read") + @event_logger.log_this + # pylint: disable=unused-argument + def permalink(self, key: str) -> FlaskResponse: + return super().render_app_template() diff --git a/superset/views/filters.py b/superset/views/filters.py index 3a503e66b614..625566b98828 100644 --- a/superset/views/filters.py +++ b/superset/views/filters.py @@ -14,15 +14,19 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +import logging from typing import Any, cast, Optional +from flask import current_app from flask_appbuilder.models.filters import BaseFilter from flask_babel import lazy_gettext -from sqlalchemy import or_ +from sqlalchemy import and_, or_ from sqlalchemy.orm import Query from superset import security_manager +logger = logging.getLogger(__name__) + class FilterRelatedOwners(BaseFilter): # pylint: disable=too-few-public-methods @@ -48,3 +52,55 @@ def apply(self, query: Query, value: Optional[Any]) -> Query: user_model.username.ilike(like_value), ) ) + + +class BaseFilterRelatedUsers(BaseFilter): # pylint: disable=too-few-public-methods + + """ + Filter to apply on related users. Will exclude users in EXCLUDE_USERS_FROM_LISTS + + Use in the api by adding something like: + ``` + base_related_field_filters = { + "owners": [["id", BaseFilterRelatedUsers, lambda: []]], + "created_by": [["id", BaseFilterRelatedUsers, lambda: []]], + } + ``` + """ + + name = lazy_gettext("username") + arg_name = "username" + + def apply(self, query: Query, value: Optional[Any]) -> Query: + if extra_filters := current_app.config["EXTRA_RELATED_QUERY_FILTERS"].get( + "user", + ): + query = extra_filters(query) + + exclude_users = ( + security_manager.get_exclude_users_from_lists() + if current_app.config["EXCLUDE_USERS_FROM_LISTS"] is None + else current_app.config["EXCLUDE_USERS_FROM_LISTS"] + ) + if exclude_users: + user_model = security_manager.user_model + return query.filter(and_(user_model.username.not_in(exclude_users))) + + return query + + +class BaseFilterRelatedRoles(BaseFilter): # pylint: disable=too-few-public-methods + """ + Filter to apply on related roles. + """ + + name = lazy_gettext("role") + arg_name = "role" + + def apply(self, query: Query, value: Optional[Any]) -> Query: + if extra_filters := current_app.config["EXTRA_RELATED_QUERY_FILTERS"].get( + "role", + ): + return extra_filters(query) + + return query diff --git a/superset/views/health.py b/superset/views/health.py index cf85b8927899..8b082ff88ffe 100644 --- a/superset/views/health.py +++ b/superset/views/health.py @@ -15,22 +15,15 @@ # specific language governing permissions and limitations # under the License. from superset import app, talisman +from superset.stats_logger import BaseStatsLogger from superset.superset_typing import FlaskResponse -@talisman(force_https=False) -@app.route("/ping") -def ping() -> FlaskResponse: - return "OK" - - -@talisman(force_https=False) -@app.route("/healthcheck") -def healthcheck() -> FlaskResponse: - return "OK" - - @talisman(force_https=False) @app.route("/health") +@app.route("/healthcheck") +@app.route("/ping") def health() -> FlaskResponse: + stats_logger: BaseStatsLogger = app.config["STATS_LOGGER"] + stats_logger.incr("health") return "OK" diff --git a/superset/views/log/api.py b/superset/views/log/api.py index a92626df49cb..5c73dba4a73e 100644 --- a/superset/views/log/api.py +++ b/superset/views/log/api.py @@ -14,12 +14,24 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +from typing import Any, Optional + from flask import current_app as app +from flask_appbuilder.api import expose, protect, rison, safe from flask_appbuilder.hooks import before_request from flask_appbuilder.models.sqla.interface import SQLAInterface import superset.models.core as models -from superset.views.base_api import BaseSupersetModelRestApi +from superset import event_logger, security_manager +from superset.exceptions import SupersetSecurityException +from superset.superset_typing import FlaskResponse +from superset.views.base_api import BaseSupersetModelRestApi, statsd_metrics +from superset.views.log.dao import LogDAO +from superset.views.log.schemas import ( + get_recent_activity_schema, + RecentActivityResponseSchema, + RecentActivitySchema, +) from ...constants import MODEL_API_RW_METHOD_PERMISSION_MAP from . import LogMixin @@ -27,7 +39,7 @@ class LogRestApi(LogMixin, BaseSupersetModelRestApi): datamodel = SQLAInterface(models.Log) - include_route_methods = {"get_list", "get", "post"} + include_route_methods = {"get_list", "get", "post", "recent_activity"} class_permission_name = "Log" method_permission_name = MODEL_API_RW_METHOD_PERMISSION_MAP resource_name = "log" @@ -44,13 +56,86 @@ class LogRestApi(LogMixin, BaseSupersetModelRestApi): "referrer", ] show_columns = list_columns + page_size = 20 + apispec_parameter_schemas = { + "get_recent_activity_schema": get_recent_activity_schema, + } + openapi_spec_component_schemas = ( + RecentActivityResponseSchema, + RecentActivitySchema, + ) @staticmethod def is_enabled() -> bool: return app.config["FAB_ADD_SECURITY_VIEWS"] and app.config["SUPERSET_LOG_VIEW"] - @before_request + @before_request(only=["get_list", "get", "post"]) def ensure_enabled(self) -> None: if not self.is_enabled(): return self.response_404() return None + + def get_user_activity_access_error(self, user_id: int) -> Optional[FlaskResponse]: + try: + security_manager.raise_for_user_activity_access(user_id) + except SupersetSecurityException as ex: + return self.response(403, message=ex.message) + return None + + @expose("/recent_activity/<int:user_id>/", methods=["GET"]) + @protect() + @safe + @statsd_metrics + @rison(get_recent_activity_schema) + @event_logger.log_this_with_context( + action=lambda self, *args, **kwargs: f"{self.__class__.__name__}" + f".recent_activity", + log_to_statsd=False, + ) + def recent_activity(self, user_id: int, **kwargs: Any) -> FlaskResponse: + """Get recent activity data for a user + --- + get: + summary: Get recent activity data for a user + parameters: + - in: path + schema: + type: integer + name: user_id + description: The id of the user + - in: query + name: q + content: + application/json: + schema: + $ref: '#/components/schemas/get_recent_activity_schema' + responses: + 200: + description: A List of recent activity objects + content: + application/json: + schema: + $ref: "#/components/schemas/RecentActivityResponseSchema" + 400: + $ref: '#/components/responses/400' + 401: + $ref: '#/components/responses/401' + 403: + $ref: '#/components/responses/403' + 500: + $ref: '#/components/responses/500' + """ + error_obj = self.get_user_activity_access_error(user_id) + if error_obj: + return error_obj + + args = kwargs["rison"] + page, page_size = self._sanitize_page_args(*self._handle_page_args(args)) + actions = args.get("actions", ["explore", "dashboard"]) + distinct = args.get("distinct", True) + + payload = LogDAO.get_recent_activity( + user_id, actions, distinct, page, page_size + ) + + return self.response(200, result=payload) diff --git a/superset/views/log/dao.py b/superset/views/log/dao.py new file mode 100644 index 000000000000..71d8a6234864 --- /dev/null +++ b/superset/views/log/dao.py @@ -0,0 +1,131 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from datetime import datetime, timedelta +from typing import Any, Dict, List + +import humanize +from sqlalchemy import and_, or_ +from sqlalchemy.sql import functions as func + +from superset import db +from superset.dao.base import BaseDAO +from superset.models.core import Log +from superset.models.dashboard import Dashboard +from superset.models.slice import Slice +from superset.utils.dates import datetime_to_epoch + + +class LogDAO(BaseDAO): + model_cls = Log + + @staticmethod + def get_recent_activity( + user_id: int, actions: List[str], distinct: bool, page: int, page_size: int + ) -> List[Dict[str, Any]]: + has_subject_title = or_( + and_( + Dashboard.dashboard_title is not None, + Dashboard.dashboard_title != "", + ), + and_(Slice.slice_name is not None, Slice.slice_name != ""), + ) + + if distinct: + one_year_ago = datetime.today() - timedelta(days=365) + subqry = ( + db.session.query( + Log.dashboard_id, + Log.slice_id, + Log.action, + func.max(Log.dttm).label("dttm"), + ) + .group_by(Log.dashboard_id, Log.slice_id, Log.action) + .filter( + and_( + Log.action.in_(actions), + Log.user_id == user_id, + # limit to one year of data to improve performance + Log.dttm > one_year_ago, + or_(Log.dashboard_id.isnot(None), Log.slice_id.isnot(None)), + ) + ) + .subquery() + ) + qry = ( + db.session.query( + subqry, + Dashboard.slug.label("dashboard_slug"), + Dashboard.dashboard_title, + Slice.slice_name, + ) + .outerjoin(Dashboard, Dashboard.id == subqry.c.dashboard_id) + .outerjoin( + Slice, + Slice.id == subqry.c.slice_id, + ) + .filter(has_subject_title) + .order_by(subqry.c.dttm.desc()) + .limit(page_size) + .offset(page * page_size) + ) + else: + qry = ( + db.session.query( + Log.dttm, + Log.action, + Log.dashboard_id, + Log.slice_id, + Dashboard.slug.label("dashboard_slug"), + Dashboard.dashboard_title, + Slice.slice_name, + ) + .outerjoin(Dashboard, Dashboard.id == Log.dashboard_id) + .outerjoin(Slice, Slice.id == Log.slice_id) + .filter(has_subject_title) + .filter(Log.action.in_(actions), Log.user_id == user_id) + .order_by(Log.dttm.desc()) + .limit(page_size) + .offset(page * page_size) + ) + + payload = [] + for log in qry.all(): + item_url = None + item_title = None + item_type = None + if log.dashboard_id: + item_type = "dashboard" + item_url = Dashboard.get_url(log.dashboard_id, log.dashboard_slug) + item_title = log.dashboard_title + elif log.slice_id: + item_type = "slice" + item_url = Slice.build_explore_url(log.slice_id) + item_title = log.slice_name or "<empty>" + + payload.append( + { + "action": log.action, + "item_type": item_type, + "item_url": item_url, + "item_title": item_title, + "time": datetime_to_epoch(log.dttm), + "time_delta_humanized": humanize.naturaltime( + datetime.utcnow() - log.dttm + ), + } + ) + return payload diff --git a/superset/views/log/schemas.py b/superset/views/log/schemas.py new file mode 100644 index 000000000000..bb4569893d74 --- /dev/null +++ b/superset/views/log/schemas.py @@ -0,0 +1,45 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from marshmallow import fields, Schema + +get_recent_activity_schema = { + "type": "object", + "properties": { + "page": {"type": "number"}, + "page_size": {"type": "number"}, + "actions": {"type": "array", "items": {"type": "string"}}, + "distinct": {"type": "boolean"}, + }, +} + + +class RecentActivitySchema(Schema): + action = fields.String(description="Action taken describing type of activity") + item_type = fields.String(description="Type of item, e.g. slice or dashboard") + item_url = fields.String(description="URL to item") + item_title = fields.String(description="Title of item") + time = fields.Float(description="Time of activity, in epoch milliseconds") + time_delta_humanized = fields.String( + description="Human-readable description of how long ago activity took place" + ) + + +class RecentActivityResponseSchema(Schema): + result = fields.List( + fields.Nested(RecentActivitySchema), + description="A list of recent activity objects", + ) diff --git a/superset/views/log/views.py b/superset/views/log/views.py index 6cc8d2ffd6a6..89623d8ec8c6 100644 --- a/superset/views/log/views.py +++ b/superset/views/log/views.py @@ -26,7 +26,10 @@ from . import LogMixin -class LogModelView(LogMixin, SupersetModelView): # pylint: disable=too-many-ancestors +class LogModelView( # pylint: disable=too-many-ancestors + LogMixin, + SupersetModelView, +): datamodel = SQLAInterface(models.Log) include_route_methods = {RouteMethod.LIST, RouteMethod.SHOW} class_permission_name = "Log" diff --git a/superset/views/redirects.py b/superset/views/redirects.py index 831fc978b947..93a433940310 100644 --- a/superset/views/redirects.py +++ b/superset/views/redirects.py @@ -34,25 +34,40 @@ class R(BaseSupersetView): # pylint: disable=invalid-name """used for short urls""" @staticmethod - def _validate_url(url: Optional[str] = None) -> bool: - if url and ( - url.startswith("//superset/dashboard/") - or url.startswith("//superset/explore/") - ): - return True - return False + def _validate_explore_url(url: str) -> Optional[str]: + if url.startswith("//superset/explore/p/"): + return url + + if url.startswith("//superset/explore"): + return "/" + url[10:] # Remove /superset from old Explore URLs + + if url.startswith("//explore"): + return url + + return None + + @staticmethod + def _validate_dashboard_url(url: str) -> Optional[str]: + if url.startswith("//superset/dashboard/"): + return url + + return None @event_logger.log_this @expose("/<int:url_id>") def index(self, url_id: int) -> FlaskResponse: url = db.session.query(models.Url).get(url_id) if url and url.url: - explore_url = "//superset/explore/?" - if url.url.startswith(explore_url): - explore_url += f"r={url_id}" + explore_url = self._validate_explore_url(url.url) + if explore_url: + if explore_url.startswith("//explore/?"): + explore_url = f"//explore/?r={url_id}" return redirect(explore_url[1:]) - if self._validate_url(url.url): - return redirect(url.url[1:]) + + dashboard_url = self._validate_dashboard_url(url.url) + if dashboard_url: + return redirect(dashboard_url[1:]) + return redirect("/") flash("URL to nowhere...", "danger") diff --git a/superset/views/sql_lab/__init__.py b/superset/views/sql_lab/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/superset/views/sql_lab/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/superset/views/sql_lab/schemas.py b/superset/views/sql_lab/schemas.py new file mode 100644 index 000000000000..399665afc1bf --- /dev/null +++ b/superset/views/sql_lab/schemas.py @@ -0,0 +1,35 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from marshmallow import fields, Schema + + +class SqlJsonPayloadSchema(Schema): + database_id = fields.Integer(required=True) + sql = fields.String(required=True) + client_id = fields.String(allow_none=True) + queryLimit = fields.Integer(allow_none=True) + sql_editor_id = fields.String(allow_none=True) + schema = fields.String(allow_none=True) + tab = fields.String(allow_none=True) + ctas_method = fields.String(allow_none=True) + templateParams = fields.String(allow_none=True) + tmp_table_name = fields.String(allow_none=True) + select_as_cta = fields.Boolean(allow_none=True) + json = fields.Boolean(allow_none=True) + runAsync = fields.Boolean(allow_none=True) + expand_data = fields.Boolean(allow_none=True) diff --git a/superset/views/sql_lab.py b/superset/views/sql_lab/views.py similarity index 91% rename from superset/views/sql_lab.py rename to superset/views/sql_lab/views.py index a75225da9117..99b57fe195bb 100644 --- a/superset/views/sql_lab.py +++ b/superset/views/sql_lab/views.py @@ -29,15 +29,21 @@ from superset.models.sql_lab import Query, SavedQuery, TableSchema, TabState from superset.superset_typing import FlaskResponse from superset.utils import core as utils - -from .base import BaseSupersetView, DeleteMixin, json_success, SupersetModelView +from superset.utils.core import get_user_id +from superset.views.base import ( + BaseSupersetView, + DeleteMixin, + json_success, + SupersetModelView, +) logger = logging.getLogger(__name__) -class SavedQueryView( - SupersetModelView, DeleteMixin -): # pylint: disable=too-many-ancestors +class SavedQueryView( # pylint: disable=too-many-ancestors + SupersetModelView, + DeleteMixin, +): datamodel = SQLAInterface(SavedQuery) include_route_methods = RouteMethod.CRUD_SET @@ -136,8 +142,10 @@ class TabStateView(BaseSupersetView): def post(self) -> FlaskResponse: # pylint: disable=no-self-use query_editor = json.loads(request.form["queryEditor"]) tab_state = TabState( - user_id=g.user.get_id(), - label=query_editor.get("title", "Untitled Query"), + user_id=get_user_id(), + # This is for backward compatibility + label=query_editor.get("name") + or query_editor.get("title", _("Untitled Query")), active=True, database_id=query_editor["dbId"], schema=query_editor.get("schema"), @@ -147,7 +155,7 @@ def post(self) -> FlaskResponse: # pylint: disable=no-self-use ) ( db.session.query(TabState) - .filter_by(user_id=g.user.get_id()) + .filter_by(user_id=get_user_id()) .update({"active": False}) ) db.session.add(tab_state) @@ -157,7 +165,7 @@ def post(self) -> FlaskResponse: # pylint: disable=no-self-use @has_access_api @expose("/<int:tab_state_id>", methods=["DELETE"]) def delete(self, tab_state_id: int) -> FlaskResponse: # pylint: disable=no-self-use - if _get_owner_id(tab_state_id) != int(g.user.get_id()): + if _get_owner_id(tab_state_id) != get_user_id(): return Response(status=403) db.session.query(TabState).filter(TabState.id == tab_state_id).delete( @@ -172,7 +180,7 @@ def delete(self, tab_state_id: int) -> FlaskResponse: # pylint: disable=no-self @has_access_api @expose("/<int:tab_state_id>", methods=["GET"]) def get(self, tab_state_id: int) -> FlaskResponse: # pylint: disable=no-self-use - if _get_owner_id(tab_state_id) != int(g.user.get_id()): + if _get_owner_id(tab_state_id) != get_user_id(): return Response(status=403) tab_state = db.session.query(TabState).filter_by(id=tab_state_id).first() @@ -190,12 +198,12 @@ def activate( # pylint: disable=no-self-use owner_id = _get_owner_id(tab_state_id) if owner_id is None: return Response(status=404) - if owner_id != int(g.user.get_id()): + if owner_id != get_user_id(): return Response(status=403) ( db.session.query(TabState) - .filter_by(user_id=g.user.get_id()) + .filter_by(user_id=get_user_id()) .update({"active": TabState.id == tab_state_id}) ) db.session.commit() @@ -204,7 +212,7 @@ def activate( # pylint: disable=no-self-use @has_access_api @expose("<int:tab_state_id>", methods=["PUT"]) def put(self, tab_state_id: int) -> FlaskResponse: # pylint: disable=no-self-use - if _get_owner_id(tab_state_id) != int(g.user.get_id()): + if _get_owner_id(tab_state_id) != get_user_id(): return Response(status=403) fields = {k: json.loads(v) for k, v in request.form.to_dict().items()} @@ -217,7 +225,7 @@ def put(self, tab_state_id: int) -> FlaskResponse: # pylint: disable=no-self-us def migrate_query( # pylint: disable=no-self-use self, tab_state_id: int ) -> FlaskResponse: - if _get_owner_id(tab_state_id) != int(g.user.get_id()): + if _get_owner_id(tab_state_id) != get_user_id(): return Response(status=403) client_id = json.loads(request.form["queryId"]) @@ -244,7 +252,7 @@ def delete_query( # pylint: disable=no-self-use .filter( and_( Query.client_id != client_id, - Query.user_id == g.user.get_id(), + Query.user_id == get_user_id(), Query.sql_editor_id == str(tab_state_id), ), ) @@ -257,7 +265,7 @@ def delete_query( # pylint: disable=no-self-use db.session.query(Query).filter_by( client_id=client_id, - user_id=g.user.get_id(), + user_id=get_user_id(), sql_editor_id=str(tab_state_id), ).delete(synchronize_session=False) db.session.commit() @@ -327,4 +335,4 @@ def my_queries(self) -> FlaskResponse: # pylint: disable=no-self-use logger.warning( "This endpoint is deprecated and will be removed in the next major release" ) - return redirect("/savedqueryview/list/?_flt_0_user={}".format(g.user.get_id())) + return redirect(f"/savedqueryview/list/?_flt_0_user={get_user_id()}") diff --git a/superset/views/tags.py b/superset/views/tags.py index 8ab2798f5d84..985d26179fe2 100644 --- a/superset/views/tags.py +++ b/superset/views/tags.py @@ -28,12 +28,13 @@ from werkzeug.exceptions import NotFound from superset import db, is_feature_enabled, utils +from superset.connectors.sqla.models import SqlaTable from superset.jinja_context import ExtraCache from superset.models.dashboard import Dashboard from superset.models.slice import Slice from superset.models.sql_lab import SavedQuery -from superset.models.tags import ObjectTypes, Tag, TaggedObject, TagTypes from superset.superset_typing import FlaskResponse +from superset.tags.models import ObjectTypes, Tag, TaggedObject, TagTypes from .base import BaseSupersetView, json_success @@ -238,4 +239,31 @@ def tagged_objects(self) -> FlaskResponse: # pylint: disable=no-self-use for obj in saved_queries ) + # datasets + if not types or "dataset" in types: + datasets = ( + db.session.query(SqlaTable) + .join( + TaggedObject, + and_( + TaggedObject.object_id == SqlaTable.id, + TaggedObject.object_type == ObjectTypes.dataset, + ), + ) + .join(Tag, TaggedObject.tag_id == Tag.id) + .filter(Tag.name.in_(tags)) + ) + results.extend( + { + "id": obj.id, + "type": ObjectTypes.dataset.name, + "name": obj.table_name, + "url": obj.sql_url(), + "changed_on": obj.changed_on, + "created_by": obj.created_by_fk, + "creator": obj.creator(), + } + for obj in datasets + ) + return json_success(json.dumps(results, default=utils.core.json_int_dttm_ser)) diff --git a/superset/views/users/api.py b/superset/views/users/api.py index 29d376935a77..675b918847c4 100644 --- a/superset/views/users/api.py +++ b/superset/views/users/api.py @@ -15,17 +15,17 @@ # specific language governing permissions and limitations # under the License. from flask import g, Response -from flask_appbuilder.api import BaseApi, expose, safe +from flask_appbuilder.api import expose, safe from flask_jwt_extended.exceptions import NoAuthorizationError +from superset.views.base_api import BaseSupersetApi +from superset.views.users.schemas import UserResponseSchema from superset.views.utils import bootstrap_user_data -from .schemas import UserResponseSchema - user_response_schema = UserResponseSchema() -class CurrentUserRestApi(BaseApi): +class CurrentUserRestApi(BaseSupersetApi): """An api to get information about the current user""" resource_name = "me" diff --git a/superset/views/utils.py b/superset/views/utils.py index 1f72324a9677..835c8eda0d8d 100644 --- a/superset/views/utils.py +++ b/superset/views/utils.py @@ -32,8 +32,7 @@ import superset.models.core as models from superset import app, dataframe, db, result_set, viz from superset.common.db_query_status import QueryStatus -from superset.connectors.connector_registry import ConnectorRegistry -from superset.connectors.sqla.models import SqlaTable +from superset.datasource.dao import DatasourceDAO from superset.errors import ErrorLevel, SupersetError, SupersetErrorType from superset.exceptions import ( CacheLoadError, @@ -48,6 +47,7 @@ from superset.models.slice import Slice from superset.models.sql_lab import Query from superset.superset_typing import FormData +from superset.utils.core import DatasourceType from superset.utils.decorators import stats_timing from superset.viz import BaseViz @@ -103,23 +103,20 @@ def bootstrap_user_data(user: User, include_perms: bool = False) -> Dict[str, An def get_permissions( user: User, -) -> Tuple[Dict[str, List[List[str]]], DefaultDict[str, List[str]]]: +) -> Tuple[Dict[str, List[Tuple[str]]], DefaultDict[str, List[str]]]: if not user.roles: raise AttributeError("User object does not have roles") - roles = defaultdict(list) - permissions = defaultdict(set) - - for role in user.roles: - permissions_ = security_manager.get_role_permissions(role) - for permission in permissions_: + data_permissions = defaultdict(set) + roles_permissions = security_manager.get_user_roles_permissions(user) + for _, permissions in roles_permissions.items(): + for permission in permissions: if permission[0] in ("datasource_access", "database_access"): - permissions[permission[0]].add(permission[1]) - roles[role.name].append([permission[0], permission[1]]) + data_permissions[permission[0]].add(permission[1]) transformed_permissions = defaultdict(list) - for perm in permissions: - transformed_permissions[perm] = list(permissions[perm]) - return roles, transformed_permissions + for perm in data_permissions: + transformed_permissions[perm] = list(data_permissions[perm]) + return roles_permissions, transformed_permissions def get_viz( @@ -130,8 +127,10 @@ def get_viz( force_cached: bool = False, ) -> BaseViz: viz_type = form_data.get("viz_type", "table") - datasource = ConnectorRegistry.get_datasource( - datasource_type, datasource_id, db.session + datasource = DatasourceDAO.get_datasource( + db.session, + DatasourceType(datasource_type), + datasource_id, ) viz_obj = viz.viz_types[viz_type]( datasource, form_data=form_data, force=force, force_cached=force_cached @@ -424,11 +423,6 @@ def is_slice_in_container( return False -def is_owner(obj: Union[Dashboard, Slice, SqlaTable], user: User) -> bool: - """Check if user is owner of the slice""" - return obj and user in obj.owners - - def check_resource_permissions( check_perms: Callable[..., Any], ) -> Callable[..., Any]: diff --git a/superset/viz.py b/superset/viz.py index e83e0127775c..1f4c795325b4 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -80,6 +80,7 @@ from superset.utils.cache import set_and_log_cache from superset.utils.core import ( apply_max_row_limit, + DateColumn, DTTM_ALIAS, ExtraFiltersReasonType, get_column_name, @@ -301,9 +302,15 @@ def get_df(self, query_obj: Optional[QueryObjectDict] = None) -> pd.DataFrame: if not df.empty: utils.normalize_dttm_col( df=df, - timestamp_format=timestamp_format, - offset=self.datasource.offset, - time_shift=self.time_shift, + dttm_cols=tuple( + [ + DateColumn.get_legacy_time_column( + timestamp_format=timestamp_format, + offset=self.datasource.offset, + time_shift=self.form_data.get("time_shift"), + ) + ] + ), ) if self.enforce_numerical_metrics: @@ -397,9 +404,7 @@ def query_obj(self) -> QueryObjectDict: # pylint: disable=too-many-locals # extras are used to query elements specific to a datasource type # for instance the extra where clause that applies only to Tables extras = { - "druid_time_origin": self.form_data.get("druid_time_origin", ""), "having": self.form_data.get("having", ""), - "having_druid": self.form_data.get("having_filters", []), "time_grain_sqla": self.form_data.get("time_grain_sqla"), "where": self.form_data.get("where", ""), } @@ -900,7 +905,7 @@ def query_obj(self) -> QueryObjectDict: groupby = [] if not groupby: raise QueryObjectValidationError( - _("Please choose at least one 'Group by' field ") + _("Please choose at least one 'Group by' field") ) if transpose and not columns: raise QueryObjectValidationError( @@ -2174,14 +2179,14 @@ def get_data(self, df: pd.DataFrame) -> VizData: if df is not None and not df.empty: if metric: df = df.sort_values( - utils.get_metric_name(metric), ascending=flt.get("asc") + utils.get_metric_name(metric), ascending=flt.get("asc", False) ) data[col] = [ {"id": row[0], "text": row[0], "metric": row[1]} for row in df.itertuples(index=False) ] else: - df = df.sort_values(col, ascending=flt.get("asc")) + df = df.sort_values(col, ascending=flt.get("asc", False)) data[col] = [ {"id": row[0], "text": row[0]} for row in df.itertuples(index=False) @@ -3219,7 +3224,7 @@ def get_data(self, df: pd.DataFrame) -> VizData: groups = get_column_names(self.form_data.get("groupby")) time_op = self.form_data.get("time_series_option", "not_time") if not groups: - raise ValueError("Please choose at least one groupby") + raise ValueError(_("Please choose at least one groupby")) if time_op == "not_time": levels = self.levels_for("agg_sum", groups, df) elif time_op in ["agg_sum", "agg_mean"]: diff --git a/tests/common/query_context_generator.py b/tests/common/query_context_generator.py index 8fddeb92ffda..15b013dc845c 100644 --- a/tests/common/query_context_generator.py +++ b/tests/common/query_context_generator.py @@ -22,7 +22,7 @@ from superset.utils.core import AnnotationType, DTTM_ALIAS query_birth_names = { - "extras": {"where": "", "time_grain_sqla": "P1D"}, + "extras": {"where": "", "time_grain_sqla": "P1D", "having_druid": []}, "columns": ["name"], "metrics": [{"label": "sum__num"}], "orderby": [("sum__num", False)], @@ -195,9 +195,7 @@ }, { "operation": "sort", - "options": { - "columns": {"q1": False, "name": True}, - }, + "options": {"by": ["q1", "name"], "ascending": [False, True]}, }, ] } diff --git a/tests/conftest.py b/tests/conftest.py index 2c129965f1bd..9d13e581704e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -28,7 +28,7 @@ from typing import Callable, TYPE_CHECKING from unittest.mock import MagicMock, Mock, PropertyMock -from flask import Flask +from flask import current_app, Flask from flask.ctx import AppContext from pytest import fixture @@ -40,6 +40,7 @@ from tests.example_data.data_loading.pandas.table_df_convertor import ( TableToDfConvertorImpl, ) +from tests.integration_tests.test_app import app SUPPORT_DATETIME_TYPE = "support_datetime_type" @@ -70,7 +71,9 @@ def mock_provider() -> Mock: @fixture(scope="session") def example_db_engine(example_db_provider: Callable[[], Database]) -> Engine: - return example_db_provider().get_sqla_engine() + with app.app_context(): + with example_db_provider().get_sqla_engine_with_context() as engine: + return engine @fixture(scope="session") diff --git a/tests/integration_tests/access_tests.py b/tests/integration_tests/access_tests.py index 64b09fb92652..38fd10524019 100644 --- a/tests/integration_tests/access_tests.py +++ b/tests/integration_tests/access_tests.py @@ -18,11 +18,12 @@ """Unit tests for Superset""" import json import unittest +from typing import Optional from unittest import mock import pytest -from flask import g from flask.ctx import AppContext +from pytest_mock import MockFixture from sqlalchemy import inspect from tests.integration_tests.fixtures.birth_names_dashboard import ( @@ -39,11 +40,10 @@ ) from tests.integration_tests.test_app import app # isort:skip from superset import db, security_manager -from superset.connectors.connector_registry import ConnectorRegistry from superset.connectors.sqla.models import SqlaTable from superset.models import core as models from superset.models.datasource_access_request import DatasourceAccessRequest -from superset.utils.core import get_username, override_user +from superset.utils.core import get_user_id, get_username, override_user from superset.utils.database import get_example_database from .base_tests import SupersetTestCase @@ -90,12 +90,12 @@ def create_access_request(session, ds_type, ds_name, role_name, username): - ds_class = ConnectorRegistry.sources[ds_type] # TODO: generalize datasource names if ds_type == "table": - ds = session.query(ds_class).filter(ds_class.table_name == ds_name).first() + ds = session.query(SqlaTable).filter(SqlaTable.table_name == ds_name).first() else: - ds = session.query(ds_class).filter(ds_class.datasource_name == ds_name).first() + # This function will only work for ds_type == "table" + raise NotImplementedError() ds_perm_view = security_manager.find_permission_view_menu( "datasource_access", ds.perm ) @@ -158,8 +158,8 @@ def test_override_role_permissions_is_admin_only(self): @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_override_role_permissions_1_table(self): database = get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name perm_data = ROLE_TABLES_PERM_DATA.copy() perm_data["database"][0]["schema"][0]["name"] = schema @@ -186,8 +186,8 @@ def test_override_role_permissions_1_table(self): ) def test_override_role_permissions_drops_absent_perms(self): database = get_example_database() - engine = database.get_sqla_engine() - schema = inspect(engine).default_schema_name + with database.get_sqla_engine_with_context() as engine: + schema = inspect(engine).default_schema_name override_me = security_manager.find_role("override_me") override_me.permissions.append( @@ -449,49 +449,6 @@ def test_approve(self, mock_send_mime): TEST_ROLE = security_manager.find_role(TEST_ROLE_NAME) self.assertIn(perm_view, TEST_ROLE.permissions) - # Case 3. Grant new role to the user to access the druid datasource. - - security_manager.add_role("druid_role") - access_request3 = create_access_request( - session, "druid", "druid_ds_1", "druid_role", "gamma" - ) - self.get_resp( - GRANT_ROLE_REQUEST.format( - "druid", access_request3.datasource_id, "gamma", "druid_role" - ) - ) - - # user was granted table_role - user_roles = [r.name for r in security_manager.find_user("gamma").roles] - self.assertIn("druid_role", user_roles) - - # Case 4. Extend the role to have access to the druid datasource - - access_request4 = create_access_request( - session, "druid", "druid_ds_2", "druid_role", "gamma" - ) - druid_ds_2_perm = access_request4.datasource.perm - - self.client.get( - EXTEND_ROLE_REQUEST.format( - "druid", access_request4.datasource_id, "gamma", "druid_role" - ) - ) - # druid_role was extended to grant access to the druid_access_ds_2 - druid_role = security_manager.find_role("druid_role") - perm_view = security_manager.find_permission_view_menu( - "datasource_access", druid_ds_2_perm - ) - self.assertIn(perm_view, druid_role.permissions) - - # cleanup - gamma_user = security_manager.find_user(username="gamma") - gamma_user.roles.remove(security_manager.find_role("druid_role")) - gamma_user.roles.remove(security_manager.find_role(TEST_ROLE_NAME)) - session.delete(security_manager.find_role("druid_role")) - session.delete(security_manager.find_role(TEST_ROLE_NAME)) - session.commit() - def test_request_access(self): if app.config["ENABLE_ACCESS_REQUEST"]: session = db.session @@ -569,44 +526,72 @@ def test_request_access(self): @pytest.mark.parametrize( - "username", + "username,user_id", [ - None, - "gamma", + (None, None), + ("alpha", 5), + ("gamma", 2), ], ) -def test_get_username(app_context: AppContext, username: str) -> None: - assert not hasattr(g, "user") - assert get_username() is None - - g.user = security_manager.find_user(username) - assert get_username() == username +def test_get_user_id( + app_context: AppContext, + mocker: MockFixture, + username: Optional[str], + user_id: Optional[int], +) -> None: + mock_g = mocker.patch("superset.utils.core.g", spec={}) + mock_g.user = security_manager.find_user(username) + assert get_user_id() == user_id @pytest.mark.parametrize( "username", [ None, + "alpha", "gamma", ], ) -def test_override_user(app_context: AppContext, username: str) -> None: +def test_get_username( + app_context: AppContext, + mocker: MockFixture, + username: Optional[str], +) -> None: + mock_g = mocker.patch("superset.utils.core.g", spec={}) + mock_g.user = security_manager.find_user(username) + assert get_username() == username + + +@pytest.mark.parametrize("username", [None, "alpha", "gamma"]) +@pytest.mark.parametrize("force", [False, True]) +def test_override_user( + app_context: AppContext, + mocker: MockFixture, + username: str, + force: bool, +) -> None: + mock_g = mocker.patch("superset.utils.core.g", spec={}) admin = security_manager.find_user(username="admin") user = security_manager.find_user(username) - assert not hasattr(g, "user") + with override_user(user, force): + assert mock_g.user == user + + assert not hasattr(mock_g, "user") + + mock_g.user = None - with override_user(user): - assert g.user == user + with override_user(user, force): + assert mock_g.user == user - assert not hasattr(g, "user") + assert mock_g.user is None - g.user = admin + mock_g.user = admin - with override_user(user): - assert g.user == user + with override_user(user, force): + assert mock_g.user == user if force else admin - assert g.user == admin + assert mock_g.user == admin if __name__ == "__main__": diff --git a/tests/integration_tests/advanced_data_type/api_tests.py b/tests/integration_tests/advanced_data_type/api_tests.py index 7daa5f0067dd..5bfe308e1683 100644 --- a/tests/integration_tests/advanced_data_type/api_tests.py +++ b/tests/integration_tests/advanced_data_type/api_tests.py @@ -18,17 +18,9 @@ """Unit tests for Superset""" import json import prison -from sqlalchemy import null -from superset.connectors.sqla.models import SqlaTable from superset.utils.core import get_example_default_schema -from tests.integration_tests.base_tests import ( - SupersetTestCase, - logged_in_admin, - test_client, -) -from tests.integration_tests.test_app import app from tests.integration_tests.utils.get_dashboards import get_dashboards_ids from unittest import mock from sqlalchemy import Column @@ -80,7 +72,7 @@ def translate_filter_func(col: Column, op: FilterOperator, values: List[Any]): "superset.advanced_data_type.api.ADVANCED_DATA_TYPES", {"type": 1}, ) -def test_types_type_request(logged_in_admin): +def test_types_type_request(test_client, login_as_admin): """ Advanced Data Type API: Test to see if the API call returns all the valid advanced data types """ @@ -91,7 +83,7 @@ def test_types_type_request(logged_in_admin): assert data == {"result": ["type"]} -def test_types_convert_bad_request_no_vals(logged_in_admin): +def test_types_convert_bad_request_no_vals(test_client, login_as_admin): """ Advanced Data Type API: Test request to see if it behaves as expected when no values are passed """ @@ -101,7 +93,7 @@ def test_types_convert_bad_request_no_vals(logged_in_admin): assert response_value.status_code == 400 -def test_types_convert_bad_request_no_type(logged_in_admin): +def test_types_convert_bad_request_no_type(test_client, login_as_admin): """ Advanced Data Type API: Test request to see if it behaves as expected when no type is passed """ @@ -115,7 +107,7 @@ def test_types_convert_bad_request_no_type(logged_in_admin): "superset.advanced_data_type.api.ADVANCED_DATA_TYPES", {"type": 1}, ) -def test_types_convert_bad_request_type_not_found(logged_in_admin): +def test_types_convert_bad_request_type_not_found(test_client, login_as_admin): """ Advanced Data Type API: Test request to see if it behaves as expected when passed in type is not found/not valid @@ -130,7 +122,7 @@ def test_types_convert_bad_request_type_not_found(logged_in_admin): "superset.advanced_data_type.api.ADVANCED_DATA_TYPES", {"type": test_type}, ) -def test_types_convert_request(logged_in_admin): +def test_types_convert_request(test_client, login_as_admin): """ Advanced Data Type API: Test request to see if it behaves as expected when a valid type and valid values are passed in diff --git a/tests/integration_tests/annotation_layers/fixtures.py b/tests/integration_tests/annotation_layers/fixtures.py index 52cb8ca2abf4..8243d7e474d5 100644 --- a/tests/integration_tests/annotation_layers/fixtures.py +++ b/tests/integration_tests/annotation_layers/fixtures.py @@ -73,7 +73,7 @@ def _insert_annotation( def create_annotation_layers(): """ Creates ANNOTATION_LAYERS_COUNT-1 layers with no annotations - and a final one with ANNOTATION_COUNT childs + and a final one with ANNOTATION_COUNT children :return: """ with app.app_context(): diff --git a/tests/integration_tests/available_domains/__init__.py b/tests/integration_tests/available_domains/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/integration_tests/available_domains/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/integration_tests/available_domains/api_tests.py b/tests/integration_tests/available_domains/api_tests.py new file mode 100644 index 000000000000..8838207d2909 --- /dev/null +++ b/tests/integration_tests/available_domains/api_tests.py @@ -0,0 +1,30 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import json + +from tests.integration_tests.test_app import app + + +def test_get_available_domains(test_client, login_as_admin): + cached = app.config["SUPERSET_WEBSERVER_DOMAINS"] + app.config["SUPERSET_WEBSERVER_DOMAINS"] = ["a", "b"] + resp = test_client.get("api/v1/available_domains/") + assert resp.status_code == 200 + data = json.loads(resp.data.decode("utf-8")) + result = data.get("result") + assert result == {"domains": ["a", "b"]} + app.config["SUPERSET_WEBSERVER_DOMAINS"] = cached diff --git a/tests/integration_tests/base_api_tests.py b/tests/integration_tests/base_api_tests.py index 8dbbb6862e3b..478fee0a0dca 100644 --- a/tests/integration_tests/base_api_tests.py +++ b/tests/integration_tests/base_api_tests.py @@ -16,6 +16,8 @@ # under the License. # isort:skip_file import json +from unittest.mock import patch + from tests.integration_tests.fixtures.world_bank_dashboard import ( load_world_bank_dashboard_with_slices, load_world_bank_data, @@ -32,6 +34,7 @@ from superset.views.base_api import BaseSupersetModelRestApi, requires_json from .base_tests import SupersetTestCase +from .conftest import with_config class Model1Api(BaseSupersetModelRestApi): @@ -216,6 +219,26 @@ def test_get_related_owners(self): for expected_user in expected_users: assert expected_user in response_users + def test_get_related_owners_with_extra_filters(self): + """ + API: Test get related owners with extra related query filters + """ + self.login(username="admin") + + def _base_filter(query): + return query.filter_by(username="alpha") + + with patch.dict( + "superset.views.filters.current_app.config", + {"EXTRA_RELATED_QUERY_FILTERS": {"user": _base_filter}}, + ): + uri = f"api/v1/{self.resource_name}/related/owners" + rv = self.client.get(uri) + assert rv.status_code == 200 + response = json.loads(rv.data.decode("utf-8")) + response_users = [result["text"] for result in response["result"]] + assert response_users == ["alpha user"] + def test_get_related_owners_paginated(self): """ API: Test get related owners with pagination @@ -264,14 +287,79 @@ def test_get_filter_related_owners(self): assert 4 == response["count"] sorted_results = sorted(response["result"], key=lambda value: value["text"]) expected_results = [ - {"text": "gamma user", "value": 2}, - {"text": "gamma2 user", "value": 3}, - {"text": "gamma_no_csv user", "value": 6}, - {"text": "gamma_sqllab user", "value": 4}, + { + "extra": {"active": True, "email": "gamma@fab.org"}, + "text": "gamma user", + "value": 2, + }, + { + "extra": {"active": True, "email": "gamma2@fab.org"}, + "text": "gamma2 user", + "value": 3, + }, + { + "extra": {"active": True, "email": "gamma_no_csv@fab.org"}, + "text": "gamma_no_csv user", + "value": 6, + }, + { + "extra": {"active": True, "email": "gamma_sqllab@fab.org"}, + "text": "gamma_sqllab user", + "value": 4, + }, ] # TODO Check me assert expected_results == sorted_results + @with_config({"EXCLUDE_USERS_FROM_LISTS": ["gamma"]}) + def test_get_base_filter_related_owners(self): + """ + API: Test get base filter related owners + """ + self.login(username="admin") + uri = f"api/v1/{self.resource_name}/related/owners" + gamma_user = ( + db.session.query(security_manager.user_model) + .filter(security_manager.user_model.username == "gamma") + .one_or_none() + ) + assert gamma_user is not None + users = db.session.query(security_manager.user_model).all() + + rv = self.client.get(uri) + assert rv.status_code == 200 + response = json.loads(rv.data.decode("utf-8")) + assert response["count"] == len(users) - 1 + response_users = [result["text"] for result in response["result"]] + assert "gamma user" not in response_users + + @patch( + "superset.security.SupersetSecurityManager.get_exclude_users_from_lists", + return_value=["gamma"], + ) + def test_get_base_filter_related_owners_on_sm( + self, mock_get_exclude_users_from_list + ): + """ + API: Test get base filter related owners using security manager + """ + self.login(username="admin") + uri = f"api/v1/{self.resource_name}/related/owners" + gamma_user = ( + db.session.query(security_manager.user_model) + .filter(security_manager.user_model.username == "gamma") + .one_or_none() + ) + assert gamma_user is not None + users = db.session.query(security_manager.user_model).all() + + rv = self.client.get(uri) + assert rv.status_code == 200 + response = json.loads(rv.data.decode("utf-8")) + assert response["count"] == len(users) - 1 + response_users = [result["text"] for result in response["result"]] + assert "gamma user" not in response_users + def test_get_ids_related_owners(self): """ API: Test get filter related owners @@ -286,8 +374,16 @@ def test_get_ids_related_owners(self): assert 2 == response["count"] sorted_results = sorted(response["result"], key=lambda value: value["text"]) expected_results = [ - {"text": "gamma user", "value": 2}, - {"text": "gamma_sqllab user", "value": 4}, + { + "extra": {"active": True, "email": "gamma@fab.org"}, + "text": "gamma user", + "value": 2, + }, + { + "extra": {"active": True, "email": "gamma_sqllab@fab.org"}, + "text": "gamma_sqllab user", + "value": 4, + }, ] assert expected_results == sorted_results @@ -305,8 +401,16 @@ def test_get_repeated_ids_related_owners(self): assert 2 == response["count"] sorted_results = sorted(response["result"], key=lambda value: value["text"]) expected_results = [ - {"text": "gamma user", "value": 2}, - {"text": "gamma_sqllab user", "value": 4}, + { + "extra": {"active": True, "email": "gamma@fab.org"}, + "text": "gamma user", + "value": 2, + }, + { + "extra": {"active": True, "email": "gamma_sqllab@fab.org"}, + "text": "gamma_sqllab user", + "value": 4, + }, ] assert expected_results == sorted_results diff --git a/tests/integration_tests/base_tests.py b/tests/integration_tests/base_tests.py index 280d58774ab0..f70f0f63bde3 100644 --- a/tests/integration_tests/base_tests.py +++ b/tests/integration_tests/base_tests.py @@ -24,17 +24,16 @@ from unittest.mock import Mock, patch, MagicMock import pandas as pd -import pytest from flask import Response from flask_appbuilder.security.sqla import models as ab_models from flask_testing import TestCase from sqlalchemy.engine.interfaces import Dialect -from sqlalchemy.ext.declarative.api import DeclarativeMeta +from sqlalchemy.ext.declarative import DeclarativeMeta from sqlalchemy.orm import Session from sqlalchemy.sql import func from sqlalchemy.dialects.mysql import dialect -from tests.integration_tests.test_app import app +from tests.integration_tests.test_app import app, login from superset.sql_parse import CtasMethod from superset import db, security_manager from superset.connectors.base.models import BaseDatasource @@ -52,11 +51,6 @@ test_client = app.test_client() -def login(client: Any, username: str = "admin", password: str = "general"): - resp = get_resp(client, "/login/", data=dict(username=username, password=password)) - assert "User confirmation needed" not in resp - - def get_resp( client: Any, url: str, @@ -96,20 +90,13 @@ def post_assert_metric( rv = client.post(uri, json=data) if 200 <= rv.status_code < 400: mock_method.assert_called_once_with("success", func_name) + elif 400 <= rv.status_code < 500: + mock_method.assert_called_once_with("warning", func_name) else: mock_method.assert_called_once_with("error", func_name) return rv -@pytest.fixture -def logged_in_admin(): - """Fixture with app context and logged in admin user.""" - with app.app_context(): - login(test_client, username="admin") - yield - test_client.get("/logout/", follow_redirects=True) - - class SupersetTestCase(TestCase): default_schema_backend_map = { "sqlite": "main", @@ -362,7 +349,7 @@ def run_sql( json_payload["schema"] = schema resp = self.get_json_resp( - "/superset/sql_json/", raise_on_error=False, json_=json_payload + "/api/v1/sqllab/execute/", raise_on_error=False, json_=json_payload ) if raise_on_error and "error" in resp: raise Exception("run_sql failed") @@ -470,6 +457,8 @@ def get_assert_metric(self, uri: str, func_name: str) -> Response: rv = self.client.get(uri) if 200 <= rv.status_code < 400: mock_method.assert_called_once_with("success", func_name) + elif 400 <= rv.status_code < 500: + mock_method.assert_called_once_with("warning", func_name) else: mock_method.assert_called_once_with("error", func_name) return rv @@ -489,6 +478,8 @@ def delete_assert_metric(self, uri: str, func_name: str) -> Response: rv = self.client.delete(uri) if 200 <= rv.status_code < 400: mock_method.assert_called_once_with("success", func_name) + elif 400 <= rv.status_code < 500: + mock_method.assert_called_once_with("warning", func_name) else: mock_method.assert_called_once_with("error", func_name) return rv @@ -516,6 +507,8 @@ def put_assert_metric( rv = self.client.put(uri, json=data) if 200 <= rv.status_code < 400: mock_method.assert_called_once_with("success", func_name) + elif 400 <= rv.status_code < 500: + mock_method.assert_called_once_with("warning", func_name) else: mock_method.assert_called_once_with("error", func_name) return rv diff --git a/tests/integration_tests/cachekeys/api_tests.py b/tests/integration_tests/cachekeys/api_tests.py index e994380e9d99..d3552bfc8df2 100644 --- a/tests/integration_tests/cachekeys/api_tests.py +++ b/tests/integration_tests/cachekeys/api_tests.py @@ -18,7 +18,7 @@ """Unit tests for Superset""" from typing import Dict, Any -from tests.integration_tests.test_app import app # noqa +import pytest from superset.extensions import cache_manager, db from superset.models.cache import CacheKey @@ -26,23 +26,25 @@ from tests.integration_tests.base_tests import ( SupersetTestCase, post_assert_metric, - test_client, - logged_in_admin, -) # noqa +) -def invalidate(params: Dict[str, Any]): - return post_assert_metric( - test_client, "api/v1/cachekey/invalidate", params, "invalidate" - ) +@pytest.fixture +def invalidate(test_client, login_as_admin): + def _invalidate(params: Dict[str, Any]): + return post_assert_metric( + test_client, "api/v1/cachekey/invalidate", params, "invalidate" + ) + + return _invalidate -def test_invalidate_cache(logged_in_admin): +def test_invalidate_cache(invalidate): rv = invalidate({"datasource_uids": ["3__table"]}) assert rv.status_code == 201 -def test_invalidate_existing_cache(logged_in_admin): +def test_invalidate_existing_cache(invalidate): db.session.add(CacheKey(cache_key="cache_key", datasource_uid="3__table")) db.session.commit() cache_manager.cache.set("cache_key", "value") @@ -56,7 +58,7 @@ def test_invalidate_existing_cache(logged_in_admin): ) -def test_invalidate_cache_empty_input(logged_in_admin): +def test_invalidate_cache_empty_input(invalidate): rv = invalidate({"datasource_uids": []}) assert rv.status_code == 201 @@ -67,7 +69,7 @@ def test_invalidate_cache_empty_input(logged_in_admin): assert rv.status_code == 201 -def test_invalidate_cache_bad_request(logged_in_admin): +def test_invalidate_cache_bad_request(invalidate): rv = invalidate( { "datasource_uids": [], @@ -93,7 +95,7 @@ def test_invalidate_cache_bad_request(logged_in_admin): assert rv.status_code == 400 -def test_invalidate_existing_caches(logged_in_admin): +def test_invalidate_existing_caches(invalidate): schema = get_example_default_schema() or "" bn = SupersetTestCase.get_birth_names_dataset() diff --git a/tests/integration_tests/celery_tests.py b/tests/integration_tests/celery_tests.py index 9a9447640f12..8693a888879d 100644 --- a/tests/integration_tests/celery_tests.py +++ b/tests/integration_tests/celery_tests.py @@ -17,7 +17,6 @@ # isort:skip_file """Unit tests for Superset Celery worker""" import datetime -import json import random import string import time @@ -33,9 +32,6 @@ import flask from flask import current_app -from tests.integration_tests.base_tests import login -from tests.integration_tests.conftest import CTAS_SCHEMA_NAME -from tests.integration_tests.test_app import app from superset import db, sql_lab from superset.common.db_query_status import QueryStatus from superset.result_set import SupersetResultSet @@ -46,6 +42,8 @@ from superset.sql_parse import ParsedQuery, CtasMethod from superset.utils.core import backend from superset.utils.database import get_example_database +from tests.integration_tests.conftest import CTAS_SCHEMA_NAME +from tests.integration_tests.test_app import app CELERY_SLEEP_TIME = 6 QUERY = "SELECT name FROM birth_names LIMIT 1" @@ -63,9 +61,6 @@ ] -test_client = app.test_client() - - def get_query_by_id(id: int): db.session.commit() query = db.session.query(Query).filter_by(id=id).first() @@ -74,10 +69,10 @@ def get_query_by_id(id: int): @pytest.fixture(autouse=True, scope="module") def setup_sqllab(): - + yield + # clean up after all tests are done + # use a new app context with app.app_context(): - yield - db.session.query(Query).delete() db.session.commit() for tbl in TMP_TABLES: @@ -92,12 +87,16 @@ def setup_sqllab(): def run_sql( - sql, cta=False, ctas_method=CtasMethod.TABLE, tmp_table="tmp", async_=False + test_client, + sql, + cta=False, + ctas_method=CtasMethod.TABLE, + tmp_table="tmp", + async_=False, ): - login(test_client, username="admin") db_id = get_example_database().id - resp = test_client.post( - "/superset/sql_json/", + return test_client.post( + "/api/v1/sqllab/execute/", json=dict( database_id=db_id, sql=sql, @@ -107,15 +106,15 @@ def run_sql( client_id="".join(random.choice(string.ascii_lowercase) for i in range(5)), ctas_method=ctas_method, ), - ) - test_client.get("/logout/", follow_redirects=True) - return json.loads(resp.data) + ).json def drop_table_if_exists(table_name: str, table_type: CtasMethod) -> None: """Drop table if it exists, works on any DB""" - sql = f"DROP {table_type} IF EXISTS {table_name}" - get_example_database().get_sqla_engine().execute(sql) + sql = f"DROP {table_type} IF EXISTS {table_name}" + database = get_example_database() + with database.get_sqla_engine_with_context() as engine: + engine.execute(sql) def quote_f(value: Optional[str]): @@ -144,12 +143,13 @@ def get_select_star(table: str, limit: int, schema: Optional[str] = None): return f"SELECT *\nFROM {table}\nLIMIT {limit}" +@pytest.mark.usefixtures("login_as_admin") @pytest.mark.parametrize("ctas_method", [CtasMethod.TABLE, CtasMethod.VIEW]) -def test_run_sync_query_dont_exist(setup_sqllab, ctas_method): +def test_run_sync_query_dont_exist(test_client, ctas_method): examples_db = get_example_database() engine_name = examples_db.db_engine_spec.engine_name sql_dont_exist = "SELECT name FROM table_dont_exist" - result = run_sql(sql_dont_exist, cta=True, ctas_method=ctas_method) + result = run_sql(test_client, sql_dont_exist, cta=True, ctas_method=ctas_method) if backend() == "sqlite" and ctas_method == CtasMethod.VIEW: assert QueryStatus.SUCCESS == result["status"], result elif backend() == "presto": @@ -188,27 +188,29 @@ def test_run_sync_query_dont_exist(setup_sqllab, ctas_method): } -@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") +@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices", "login_as_admin") @pytest.mark.parametrize("ctas_method", [CtasMethod.TABLE, CtasMethod.VIEW]) -def test_run_sync_query_cta(setup_sqllab, ctas_method): +def test_run_sync_query_cta(test_client, ctas_method): tmp_table_name = f"{TEST_SYNC}_{ctas_method.lower()}" - result = run_sql(QUERY, tmp_table=tmp_table_name, cta=True, ctas_method=ctas_method) + result = run_sql( + test_client, QUERY, tmp_table=tmp_table_name, cta=True, ctas_method=ctas_method + ) assert QueryStatus.SUCCESS == result["query"]["state"], result assert cta_result(ctas_method) == (result["data"], result["columns"]) # Check the data in the tmp table. select_query = get_query_by_id(result["query"]["serverId"]) - results = run_sql(select_query.select_sql) + results = run_sql(test_client, select_query.select_sql) assert QueryStatus.SUCCESS == results["status"], results assert len(results["data"]) > 0 delete_tmp_view_or_table(tmp_table_name, ctas_method) -@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") -def test_run_sync_query_cta_no_data(setup_sqllab): +@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices", "login_as_admin") +def test_run_sync_query_cta_no_data(test_client): sql_empty_result = "SELECT * FROM birth_names WHERE name='random'" - result = run_sql(sql_empty_result) + result = run_sql(test_client, sql_empty_result) assert QueryStatus.SUCCESS == result["query"]["state"] assert ([], []) == (result["data"], result["columns"]) @@ -216,18 +218,20 @@ def test_run_sync_query_cta_no_data(setup_sqllab): assert QueryStatus.SUCCESS == query.status -@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") +@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices", "login_as_admin") @pytest.mark.parametrize("ctas_method", [CtasMethod.TABLE, CtasMethod.VIEW]) @mock.patch( "superset.sqllab.sqllab_execution_context.get_cta_schema_name", lambda d, u, s, sql: CTAS_SCHEMA_NAME, ) -def test_run_sync_query_cta_config(setup_sqllab, ctas_method): +def test_run_sync_query_cta_config(test_client, ctas_method): if backend() == "sqlite": # sqlite doesn't support schemas return tmp_table_name = f"{TEST_SYNC_CTA}_{ctas_method.lower()}" - result = run_sql(QUERY, cta=True, ctas_method=ctas_method, tmp_table=tmp_table_name) + result = run_sql( + test_client, QUERY, cta=True, ctas_method=ctas_method, tmp_table=tmp_table_name + ) assert QueryStatus.SUCCESS == result["query"]["state"], result assert cta_result(ctas_method) == (result["data"], result["columns"]) @@ -239,24 +243,25 @@ def test_run_sync_query_cta_config(setup_sqllab, ctas_method): assert query.select_sql == get_select_star( tmp_table_name, limit=query.limit, schema=CTAS_SCHEMA_NAME ) - results = run_sql(query.select_sql) + results = run_sql(test_client, query.select_sql) assert QueryStatus.SUCCESS == results["status"], result delete_tmp_view_or_table(f"{CTAS_SCHEMA_NAME}.{tmp_table_name}", ctas_method) -@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") +@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices", "login_as_admin") @pytest.mark.parametrize("ctas_method", [CtasMethod.TABLE, CtasMethod.VIEW]) @mock.patch( "superset.sqllab.sqllab_execution_context.get_cta_schema_name", lambda d, u, s, sql: CTAS_SCHEMA_NAME, ) -def test_run_async_query_cta_config(setup_sqllab, ctas_method): +def test_run_async_query_cta_config(test_client, ctas_method): if backend() in {"sqlite", "mysql"}: # sqlite doesn't support schemas, mysql is flaky return tmp_table_name = f"{TEST_ASYNC_CTA_CONFIG}_{ctas_method.lower()}" result = run_sql( + test_client, QUERY, cta=True, ctas_method=ctas_method, @@ -279,16 +284,21 @@ def test_run_async_query_cta_config(setup_sqllab, ctas_method): delete_tmp_view_or_table(f"{CTAS_SCHEMA_NAME}.{tmp_table_name}", ctas_method) -@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") +@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices", "login_as_admin") @pytest.mark.parametrize("ctas_method", [CtasMethod.TABLE, CtasMethod.VIEW]) -def test_run_async_cta_query(setup_sqllab, ctas_method): +def test_run_async_cta_query(test_client, ctas_method): if backend() == "mysql": # failing return table_name = f"{TEST_ASYNC_CTA}_{ctas_method.lower()}" result = run_sql( - QUERY, cta=True, ctas_method=ctas_method, async_=True, tmp_table=table_name + test_client, + QUERY, + cta=True, + ctas_method=ctas_method, + async_=True, + tmp_table=table_name, ) query = wait_for_success(result) @@ -305,16 +315,21 @@ def test_run_async_cta_query(setup_sqllab, ctas_method): delete_tmp_view_or_table(table_name, ctas_method) -@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") +@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices", "login_as_admin") @pytest.mark.parametrize("ctas_method", [CtasMethod.TABLE, CtasMethod.VIEW]) -def test_run_async_cta_query_with_lower_limit(setup_sqllab, ctas_method): +def test_run_async_cta_query_with_lower_limit(test_client, ctas_method): if backend() == "mysql": # failing return tmp_table = f"{TEST_ASYNC_LOWER_LIMIT}_{ctas_method.lower()}" result = run_sql( - QUERY, cta=True, ctas_method=ctas_method, async_=True, tmp_table=tmp_table + test_client, + QUERY, + cta=True, + ctas_method=ctas_method, + async_=True, + tmp_table=tmp_table, ) query = wait_for_success(result) assert QueryStatus.SUCCESS == query.status diff --git a/tests/integration_tests/charts/api_tests.py b/tests/integration_tests/charts/api_tests.py index a37acf6eafc3..965a9c137ba8 100644 --- a/tests/integration_tests/charts/api_tests.py +++ b/tests/integration_tests/charts/api_tests.py @@ -17,6 +17,7 @@ # isort:skip_file """Unit tests for Superset""" import json +import logging from io import BytesIO from zipfile import is_zipfile, ZipFile @@ -30,7 +31,7 @@ from superset.extensions import cache_manager, db from superset.models.core import Database, FavStar, FavStarClassName from superset.models.dashboard import Dashboard -from superset.models.reports import ReportSchedule, ReportScheduleType +from superset.reports.models import ReportSchedule, ReportScheduleType from superset.models.slice import Slice from superset.utils.core import get_example_default_schema @@ -100,6 +101,19 @@ def create_charts(self): db.session.delete(fav_chart) db.session.commit() + @pytest.fixture() + def create_charts_created_by_gamma(self): + with self.create_app().app_context(): + charts = [] + user = self.get_user("gamma") + for cx in range(CHARTS_FIXTURE_COUNT - 1): + charts.append(self.insert_chart(f"gamma{cx}", [user.id], 1)) + yield charts + # rollback changes + for chart in charts: + db.session.delete(chart) + db.session.commit() + @pytest.fixture() def create_certified_charts(self): with self.create_app().app_context(): @@ -678,6 +692,61 @@ def test_update_chart_not_owned(self): db.session.delete(user_alpha2) db.session.commit() + def test_update_chart_linked_with_not_owned_dashboard(self): + """ + Chart API: Test update chart which is linked to not owned dashboard + """ + user_alpha1 = self.create_user( + "alpha1", "password", "Alpha", email="alpha1@superset.org" + ) + user_alpha2 = self.create_user( + "alpha2", "password", "Alpha", email="alpha2@superset.org" + ) + chart = self.insert_chart("title", [user_alpha1.id], 1) + + original_dashboard = Dashboard() + original_dashboard.dashboard_title = "Original Dashboard" + original_dashboard.slug = "slug" + original_dashboard.owners = [user_alpha1] + original_dashboard.slices = [chart] + original_dashboard.published = False + db.session.add(original_dashboard) + + new_dashboard = Dashboard() + new_dashboard.dashboard_title = "Cloned Dashboard" + new_dashboard.slug = "new_slug" + new_dashboard.owners = [user_alpha2] + new_dashboard.slices = [chart] + new_dashboard.published = False + db.session.add(new_dashboard) + + self.login(username="alpha1", password="password") + chart_data_with_invalid_dashboard = { + "slice_name": "title1_changed", + "dashboards": [original_dashboard.id, 0], + } + chart_data = { + "slice_name": "title1_changed", + "dashboards": [original_dashboard.id, new_dashboard.id], + } + uri = f"api/v1/chart/{chart.id}" + + rv = self.put_assert_metric(uri, chart_data_with_invalid_dashboard, "put") + self.assertEqual(rv.status_code, 422) + response = json.loads(rv.data.decode("utf-8")) + expected_response = {"message": {"dashboards": ["Dashboards do not exist"]}} + self.assertEqual(response, expected_response) + + rv = self.put_assert_metric(uri, chart_data, "put") + self.assertEqual(rv.status_code, 200) + + db.session.delete(chart) + db.session.delete(original_dashboard) + db.session.delete(new_dashboard) + db.session.delete(user_alpha1) + db.session.delete(user_alpha2) + db.session.commit() + def test_update_chart_validate_datasource(self): """ Chart API: Test update validate datasource @@ -762,7 +831,19 @@ def test_get_chart(self): "is_managed_externally": False, } data = json.loads(rv.data.decode("utf-8")) - self.assertEqual(data["result"], expected_result) + self.assertIn("changed_on_delta_humanized", data["result"]) + self.assertIn("id", data["result"]) + self.assertIn("thumbnail_url", data["result"]) + self.assertIn("url", data["result"]) + for key, value in data["result"].items(): + # We can't assert timestamp values or id/urls + if key not in ( + "changed_on_delta_humanized", + "id", + "thumbnail_url", + "url", + ): + self.assertEqual(value, expected_result[key]) db.session.delete(chart) db.session.commit() @@ -808,6 +889,51 @@ def test_get_charts(self): data = json.loads(rv.data.decode("utf-8")) self.assertEqual(data["count"], 34) + @pytest.mark.usefixtures("load_energy_table_with_slice", "add_dashboard_to_chart") + def test_get_charts_dashboards(self): + """ + Chart API: Test get charts with related dashboards + """ + self.login(username="admin") + arguments = { + "filters": [ + {"col": "slice_name", "opr": "eq", "value": self.chart.slice_name} + ] + } + uri = f"api/v1/chart/?q={prison.dumps(arguments)}" + rv = self.get_assert_metric(uri, "get_list") + self.assertEqual(rv.status_code, 200) + data = json.loads(rv.data.decode("utf-8")) + assert data["result"][0]["dashboards"] == [ + { + "id": self.original_dashboard.id, + "dashboard_title": self.original_dashboard.dashboard_title, + } + ] + + @pytest.mark.usefixtures("load_energy_table_with_slice", "add_dashboard_to_chart") + def test_get_charts_dashboard_filter(self): + """ + Chart API: Test get charts with dashboard filter + """ + self.login(username="admin") + arguments = { + "filters": [ + { + "col": "dashboards", + "opr": "rel_m_m", + "value": self.original_dashboard.id, + } + ] + } + uri = f"api/v1/chart/?q={prison.dumps(arguments)}" + rv = self.get_assert_metric(uri, "get_list") + self.assertEqual(rv.status_code, 200) + data = json.loads(rv.data.decode("utf-8")) + result = data["result"] + assert len(result) == 1 + assert result[0]["slice_name"] == self.chart.slice_name + def test_get_charts_changed_on(self): """ Dashboard API: Test get charts changed on @@ -933,15 +1059,27 @@ def test_admin_gets_filtered_energy_slices(self): } ], "keys": ["none"], - "columns": ["slice_name"], + "columns": ["slice_name", "description", "table.table_name"], } self.login(username="admin") uri = f"api/v1/chart/?q={prison.dumps(arguments)}" rv = self.get_assert_metric(uri, "get_list") - self.assertEqual(rv.status_code, 200) - data = json.loads(rv.data.decode("utf-8")) - self.assertEqual(data["count"], 8) + data = rv.json + assert rv.status_code == 200 + assert data["count"] > 0 + for chart in data["result"]: + print(chart) + assert ( + "energy" + in " ".join( + [ + chart["slice_name"] or "", + chart["description"] or "", + chart["table"]["table_name"] or "", + ] + ).lower() + ) @pytest.mark.usefixtures("create_certified_charts") def test_gets_certified_charts_filter(self): @@ -1054,6 +1192,33 @@ def test_get_charts_favorite_filter(self): assert rv.status_code == 200 assert len(expected_models) == data["count"] + @pytest.mark.usefixtures("create_charts_created_by_gamma") + def test_get_charts_created_by_me_filter(self): + """ + Chart API: Test get charts with created by me special filter + """ + gamma_user = self.get_user("gamma") + expected_models = ( + db.session.query(Slice).filter(Slice.created_by_fk == gamma_user.id).all() + ) + arguments = { + "filters": [ + {"col": "created_by", "opr": "chart_created_by_me", "value": "me"} + ], + "order_column": "slice_name", + "order_direction": "asc", + "keys": ["none"], + "columns": ["slice_name"], + } + self.login(username="gamma") + uri = f"api/v1/chart/?q={prison.dumps(arguments)}" + rv = self.client.get(uri) + data = json.loads(rv.data.decode("utf-8")) + assert rv.status_code == 200 + assert len(expected_models) == data["count"] + for i, expected_model in enumerate(expected_models): + assert expected_model.slice_name == data["result"][i]["slice_name"] + @pytest.mark.usefixtures("create_charts") def test_get_current_user_favorite_status(self): """ @@ -1205,9 +1370,10 @@ def test_import_chart(self): chart.owners = [] dataset.owners = [] - database.owners = [] db.session.delete(chart) + db.session.commit() db.session.delete(dataset) + db.session.commit() db.session.delete(database) db.session.commit() @@ -1277,9 +1443,10 @@ def test_import_chart_overwrite(self): chart.owners = [] dataset.owners = [] - database.owners = [] db.session.delete(chart) + db.session.commit() db.session.delete(dataset) + db.session.commit() db.session.delete(database) db.session.commit() @@ -1332,3 +1499,31 @@ def test_import_chart_invalid(self): } ] } + + def test_gets_created_by_user_charts_filter(self): + arguments = { + "filters": [{"col": "id", "opr": "chart_has_created_by", "value": True}], + "keys": ["none"], + "columns": ["slice_name"], + } + self.login(username="admin") + + uri = f"api/v1/chart/?q={prison.dumps(arguments)}" + rv = self.get_assert_metric(uri, "get_list") + self.assertEqual(rv.status_code, 200) + data = json.loads(rv.data.decode("utf-8")) + self.assertEqual(data["count"], 8) + + def test_gets_not_created_by_user_charts_filter(self): + arguments = { + "filters": [{"col": "id", "opr": "chart_has_created_by", "value": False}], + "keys": ["none"], + "columns": ["slice_name"], + } + self.login(username="admin") + + uri = f"api/v1/chart/?q={prison.dumps(arguments)}" + rv = self.get_assert_metric(uri, "get_list") + self.assertEqual(rv.status_code, 200) + data = json.loads(rv.data.decode("utf-8")) + self.assertEqual(data["count"], 8) diff --git a/tests/integration_tests/charts/commands_tests.py b/tests/integration_tests/charts/commands_tests.py index ec205b6a6abe..da9a7550acb4 100644 --- a/tests/integration_tests/charts/commands_tests.py +++ b/tests/integration_tests/charts/commands_tests.py @@ -72,6 +72,9 @@ def test_export_chart_command(self, mock_g): assert metadata == { "slice_name": "Energy Sankey", + "description": None, + "certified_by": None, + "certification_details": None, "viz_type": "sankey", "params": { "collapsed_fieldsets": "", @@ -85,49 +88,7 @@ def test_export_chart_command(self, mock_g): "dataset_uuid": str(example_chart.table.uuid), "uuid": str(example_chart.uuid), "version": "1.0.0", - } - - @patch("superset.security.manager.g") - @pytest.mark.usefixtures("load_energy_table_with_slice") - def test_export_chart_with_query_context(self, mock_g): - """Test that charts that have a query_context are exported correctly""" - - mock_g.user = security_manager.find_user("alpha") - example_chart = db.session.query(Slice).filter_by(slice_name="Heatmap").one() - command = ExportChartsCommand([example_chart.id]) - - contents = dict(command.run()) - - expected = [ - "metadata.yaml", - f"charts/Heatmap_{example_chart.id}.yaml", - "datasets/examples/energy_usage.yaml", - "databases/examples.yaml", - ] - assert expected == list(contents.keys()) - - metadata = yaml.safe_load(contents[f"charts/Heatmap_{example_chart.id}.yaml"]) - - assert metadata == { - "slice_name": "Heatmap", - "viz_type": "heatmap", - "params": { - "all_columns_x": "source", - "all_columns_y": "target", - "canvas_image_rendering": "pixelated", - "collapsed_fieldsets": "", - "linear_color_scheme": "blue_white_yellow", - "metric": "sum__value", - "normalize_across": "heatmap", - "slice_name": "Heatmap", - "viz_type": "heatmap", - "xscale_interval": "1", - "yscale_interval": "1", - }, - "cache_timeout": None, - "dataset_uuid": str(example_chart.table.uuid), - "uuid": str(example_chart.uuid), - "version": "1.0.0", + "query_context": None, } @patch("superset.security.manager.g") @@ -168,8 +129,12 @@ def test_export_chart_command_key_order(self, mock_g): ) assert list(metadata.keys()) == [ "slice_name", + "description", + "certified_by", + "certification_details", "viz_type", "params", + "query_context", "cache_timeout", "uuid", "version", @@ -350,58 +315,60 @@ def test_import_v1_chart_validation(self): class TestChartsCreateCommand(SupersetTestCase): - @patch("superset.views.base.g") + @patch("superset.utils.core.g") + @patch("superset.charts.commands.create.g") @patch("superset.security.manager.g") @pytest.mark.usefixtures("load_energy_table_with_slice") - def test_create_v1_response(self, mock_sm_g, mock_g): + def test_create_v1_response(self, mock_sm_g, mock_c_g, mock_u_g): """Test that the create chart command creates a chart""" - actor = security_manager.find_user(username="admin") - mock_g.user = mock_sm_g.user = actor + user = security_manager.find_user(username="admin") + mock_u_g.user = mock_c_g.user = mock_sm_g.user = user chart_data = { "slice_name": "new chart", "description": "new description", - "owners": [actor.id], + "owners": [user.id], "viz_type": "new_viz_type", "params": json.dumps({"viz_type": "new_viz_type"}), "cache_timeout": 1000, "datasource_id": 1, "datasource_type": "table", } - command = CreateChartCommand(actor, chart_data) + command = CreateChartCommand(chart_data) chart = command.run() chart = db.session.query(Slice).get(chart.id) assert chart.viz_type == "new_viz_type" json_params = json.loads(chart.params) assert json_params == {"viz_type": "new_viz_type"} assert chart.slice_name == "new chart" - assert chart.owners == [actor] + assert chart.owners == [user] db.session.delete(chart) db.session.commit() class TestChartsUpdateCommand(SupersetTestCase): - @patch("superset.views.base.g") + @patch("superset.charts.commands.update.g") + @patch("superset.utils.core.g") @patch("superset.security.manager.g") @pytest.mark.usefixtures("load_energy_table_with_slice") - def test_update_v1_response(self, mock_sm_g, mock_g): + def test_update_v1_response(self, mock_sm_g, mock_c_g, mock_u_g): """Test that a chart command updates properties""" pk = db.session.query(Slice).all()[0].id - actor = security_manager.find_user(username="admin") - mock_g.user = mock_sm_g.user = actor + user = security_manager.find_user(username="admin") + mock_u_g.user = mock_c_g.user = mock_sm_g.user = user model_id = pk json_obj = { "description": "test for update", "cache_timeout": None, - "owners": [actor.id], + "owners": [user.id], } - command = UpdateChartCommand(actor, model_id, json_obj) + command = UpdateChartCommand(model_id, json_obj) last_saved_before = db.session.query(Slice).get(pk).last_saved_at command.run() chart = db.session.query(Slice).get(pk) assert chart.last_saved_at != last_saved_before - assert chart.last_saved_by == actor + assert chart.last_saved_by == user - @patch("superset.views.base.g") + @patch("superset.utils.core.g") @patch("superset.security.manager.g") @pytest.mark.usefixtures("load_energy_table_with_slice") def test_query_context_update_command(self, mock_sm_g, mock_g): @@ -415,14 +382,14 @@ def test_query_context_update_command(self, mock_sm_g, mock_g): chart.owners = [admin] db.session.commit() - actor = security_manager.find_user(username="alpha") - mock_g.user = mock_sm_g.user = actor + user = security_manager.find_user(username="alpha") + mock_g.user = mock_sm_g.user = user query_context = json.dumps({"foo": "bar"}) json_obj = { "query_context_generation": True, "query_context": query_context, } - command = UpdateChartCommand(actor, pk, json_obj) + command = UpdateChartCommand(pk, json_obj) command.run() chart = db.session.query(Slice).get(pk) assert chart.query_context == query_context diff --git a/tests/integration_tests/charts/data/api_tests.py b/tests/integration_tests/charts/data/api_tests.py index d360b152be2a..66151362ff1d 100644 --- a/tests/integration_tests/charts/data/api_tests.py +++ b/tests/integration_tests/charts/data/api_tests.py @@ -185,7 +185,7 @@ def test_with_row_limit_bigger_then_sql_max_row__rowcount_as_sql_max_row(self): "superset.utils.core.current_app.config", {**app.config, "SQL_MAX_ROW": 5}, ) - def test_as_samples_with_row_limit_bigger_then_sql_max_row__rowcount_as_sql_max_row( + def test_as_samples_with_row_limit_bigger_then_sql_max_row_rowcount_as_sql_max_row( self, ): expected_row_count = app.config["SQL_MAX_ROW"] @@ -255,6 +255,16 @@ def test_empty_request_with_csv_result_format(self): rv = self.post_assert_metric(CHART_DATA_URI, self.query_context_payload, "data") assert rv.status_code == 400 + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") + def test_empty_request_with_excel_result_format(self): + """ + Chart data API: Test empty chart data with Excel result format + """ + self.query_context_payload["result_format"] = "xlsx" + self.query_context_payload["queries"] = [] + rv = self.post_assert_metric(CHART_DATA_URI, self.query_context_payload, "data") + assert rv.status_code == 400 + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_with_csv_result_format(self): """ @@ -265,6 +275,17 @@ def test_with_csv_result_format(self): assert rv.status_code == 200 assert rv.mimetype == "text/csv" + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") + def test_with_excel_result_format(self): + """ + Chart data API: Test chart data with Excel result format + """ + self.query_context_payload["result_format"] = "xlsx" + mimetype = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + rv = self.post_assert_metric(CHART_DATA_URI, self.query_context_payload, "data") + assert rv.status_code == 200 + assert rv.mimetype == mimetype + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_with_multi_query_csv_result_format(self): """ @@ -280,6 +301,21 @@ def test_with_multi_query_csv_result_format(self): zipfile = ZipFile(BytesIO(rv.data), "r") assert zipfile.namelist() == ["query_1.csv", "query_2.csv"] + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") + def test_with_multi_query_excel_result_format(self): + """ + Chart data API: Test chart data with multi-query Excel result format + """ + self.query_context_payload["result_format"] = "xlsx" + self.query_context_payload["queries"].append( + self.query_context_payload["queries"][0] + ) + rv = self.post_assert_metric(CHART_DATA_URI, self.query_context_payload, "data") + assert rv.status_code == 200 + assert rv.mimetype == "application/zip" + zipfile = ZipFile(BytesIO(rv.data), "r") + assert zipfile.namelist() == ["query_1.xlsx", "query_2.xlsx"] + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_with_csv_result_format_when_actor_not_permitted_for_csv__403(self): """ @@ -292,6 +328,18 @@ def test_with_csv_result_format_when_actor_not_permitted_for_csv__403(self): rv = self.post_assert_metric(CHART_DATA_URI, self.query_context_payload, "data") assert rv.status_code == 403 + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") + def test_with_excel_result_format_when_actor_not_permitted_for_excel__403(self): + """ + Chart data API: Test chart data with Excel result format + """ + self.logout() + self.login(username="gamma_no_csv") + self.query_context_payload["result_format"] = "xlsx" + + rv = self.post_assert_metric(CHART_DATA_URI, self.query_context_payload, "data") + assert rv.status_code == 403 + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_with_row_limit_and_offset__row_limit_and_offset_were_applied(self): """ @@ -339,12 +387,6 @@ def test_chart_data_applied_time_extras(self): {"column": "__time_range"}, ], ) - self.assertEqual( - data["result"][0]["rejected_filters"], - [ - {"column": "__time_origin", "reason": "not_druid_datasource"}, - ], - ) expected_row_count = self.get_expected_row_count("client_id_2") self.assertEqual(data["result"][0]["rowcount"], expected_row_count) @@ -457,7 +499,7 @@ def test_with_filter_suppose_to_return_empty_data__no_data_returned(self): def test_with_invalid_where_parameter__400(self): self.query_context_payload["queries"][0]["filters"] = [] - # erroneus WHERE-clause + # erroneous WHERE-clause self.query_context_payload["queries"][0]["extras"]["where"] = "(gender abc def)" rv = self.post_assert_metric(CHART_DATA_URI, self.query_context_payload, "data") @@ -843,7 +885,6 @@ def test_chart_data_get(self): "filters": [], "extras": { "having": "", - "having_druid": [], "where": "", }, "applied_time_extras": {}, @@ -869,6 +910,56 @@ def test_chart_data_get(self): assert data["result"][0]["status"] == "success" assert data["result"][0]["rowcount"] == 2 + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") + def test_chart_data_get_forced(self): + """ + Chart data API: Test GET endpoint with force cache parameter + """ + chart = db.session.query(Slice).filter_by(slice_name="Genders").one() + chart.query_context = json.dumps( + { + "datasource": {"id": chart.table.id, "type": "table"}, + "force": False, + "queries": [ + { + "time_range": "1900-01-01T00:00:00 : 2000-01-01T00:00:00", + "granularity": "ds", + "filters": [], + "extras": { + "having": "", + "having_druid": [], + "where": "", + }, + "applied_time_extras": {}, + "columns": ["gender"], + "metrics": ["sum__num"], + "orderby": [["sum__num", False]], + "annotation_layers": [], + "row_limit": 50000, + "timeseries_limit": 0, + "order_desc": True, + "url_params": {}, + "custom_params": {}, + "custom_form_data": {}, + } + ], + "result_format": "json", + "result_type": "full", + } + ) + + self.get_assert_metric(f"api/v1/chart/{chart.id}/data/?force=true", "get_data") + + # should burst cache + rv = self.get_assert_metric( + f"api/v1/chart/{chart.id}/data/?force=true", "get_data" + ) + assert rv.json["result"][0]["is_cached"] is None + + # should get response from the cache + rv = self.get_assert_metric(f"api/v1/chart/{chart.id}/data/", "get_data") + assert rv.json["result"][0]["is_cached"] + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @with_feature_flags(GLOBAL_ASYNC_QUERIES=True) @mock.patch("superset.charts.data.api.QueryContextCacheLoader") diff --git a/tests/integration_tests/cli_tests.py b/tests/integration_tests/cli_tests.py index f69efc625394..aaa682bee0f3 100644 --- a/tests/integration_tests/cli_tests.py +++ b/tests/integration_tests/cli_tests.py @@ -27,7 +27,9 @@ from freezegun import freeze_time import superset.cli.importexport -from superset import app +import superset.cli.thumbnails +from superset import app, db +from superset.models.dashboard import Dashboard from tests.integration_tests.fixtures.birth_names_dashboard import ( load_birth_names_dashboard_with_slices, load_birth_names_data, @@ -495,3 +497,23 @@ def test_failing_import_datasets_versioned_export( ) assert_cli_fails_properly(response, caplog) + + +@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") +@mock.patch("superset.tasks.thumbnails.cache_dashboard_thumbnail") +def test_compute_thumbnails(thumbnail_mock, app_context, fs): + + thumbnail_mock.return_value = None + runner = app.test_cli_runner() + dashboard = db.session.query(Dashboard).filter_by(slug="births").first() + response = runner.invoke( + superset.cli.thumbnails.compute_thumbnails, + ["-d", "-i", dashboard.id], + ) + + thumbnail_mock.assert_called_with( + None, + dashboard.id, + force=False, + ) + assert response.exit_code == 0 diff --git a/tests/integration_tests/config_tests.py b/tests/integration_tests/config_tests.py deleted file mode 100644 index 45528913effa..000000000000 --- a/tests/integration_tests/config_tests.py +++ /dev/null @@ -1,173 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# isort:skip_file - -import unittest -from typing import Any, Dict - -from tests.integration_tests.base_tests import SupersetTestCase -from tests.integration_tests.test_app import app - -from superset import db -from superset.connectors.sqla.models import SqlaTable -from superset.utils.database import get_or_create_db - -FULL_DTTM_DEFAULTS_EXAMPLE = { - "main_dttm_col": "id", - "dttm_columns": { - "dttm": { - "python_date_format": "epoch_s", - "expression": "CAST(dttm as INTEGER)", - }, - "id": {"python_date_format": "epoch_ms"}, - "month": { - "python_date_format": "%Y-%m-%d", - "expression": "CASE WHEN length(month) = 7 THEN month || '-01' ELSE month END", - }, - }, -} - - -def apply_dttm_defaults(table: SqlaTable, dttm_defaults: Dict[str, Any]): - """Applies dttm defaults to the table, mutates in place.""" - for dbcol in table.columns: - # Set is_dttm is column is listed in dttm_columns. - if dbcol.column_name in dttm_defaults.get("dttm_columns", {}): - dbcol.is_dttm = True - - # Skip non dttm columns. - if dbcol.column_name not in dttm_defaults.get("dttm_columns", {}): - continue - - # Set table main_dttm_col. - if dbcol.column_name == dttm_defaults.get("main_dttm_col"): - table.main_dttm_col = dbcol.column_name - - # Apply defaults if empty. - dttm_column_defaults = dttm_defaults.get("dttm_columns", {}).get( - dbcol.column_name, {} - ) - dbcol.is_dttm = True - if ( - not dbcol.python_date_format - and "python_date_format" in dttm_column_defaults - ): - dbcol.python_date_format = dttm_column_defaults["python_date_format"] - if not dbcol.expression and "expression" in dttm_column_defaults: - dbcol.expression = dttm_column_defaults["expression"] - - -class TestConfig(SupersetTestCase): - def setUp(self) -> None: - self.login(username="admin") - self._test_db_id = get_or_create_db( - "column_test_db", app.config["SQLALCHEMY_DATABASE_URI"] - ).id - self._old_sqla_table_mutator = app.config["SQLA_TABLE_MUTATOR"] - - def createTable(self, dttm_defaults): - app.config["SQLA_TABLE_MUTATOR"] = lambda t: apply_dttm_defaults( - t, dttm_defaults - ) - resp = self.client.post( - "/tablemodelview/add", - data=dict(database=self._test_db_id, table_name="logs"), - follow_redirects=True, - ) - self.assertEqual(resp.status_code, 200) - self._logs_table = ( - db.session.query(SqlaTable).filter_by(table_name="logs").one() - ) - - def tearDown(self): - app.config["SQLA_TABLE_MUTATOR"] = self._old_sqla_table_mutator - if hasattr(self, "_logs_table"): - db.session.delete(self._logs_table) - db.session.delete(self._logs_table.database) - db.session.commit() - - def test_main_dttm_col(self): - # Make sure that dttm column is set properly. - self.createTable({"main_dttm_col": "id", "dttm_columns": {"id": {}}}) - self.assertEqual(self._logs_table.main_dttm_col, "id") - - def test_main_dttm_col_nonexistent(self): - self.createTable({"main_dttm_col": "nonexistent"}) - # Column doesn't exist, falls back to dttm. - self.assertEqual(self._logs_table.main_dttm_col, "dttm") - - def test_main_dttm_col_nondttm(self): - self.createTable({"main_dttm_col": "duration_ms"}) - # duration_ms is not dttm column, falls back to dttm. - self.assertEqual(self._logs_table.main_dttm_col, "dttm") - - def test_python_date_format_by_column_name(self): - table_defaults = { - "dttm_columns": { - "id": {"python_date_format": "epoch_ms"}, - "dttm": {"python_date_format": "epoch_s"}, - "duration_ms": {"python_date_format": "invalid"}, - } - } - self.createTable(table_defaults) - id_col = [c for c in self._logs_table.columns if c.column_name == "id"][0] - self.assertTrue(id_col.is_dttm) - self.assertEqual(id_col.python_date_format, "epoch_ms") - dttm_col = [c for c in self._logs_table.columns if c.column_name == "dttm"][0] - self.assertTrue(dttm_col.is_dttm) - self.assertEqual(dttm_col.python_date_format, "epoch_s") - dms_col = [ - c for c in self._logs_table.columns if c.column_name == "duration_ms" - ][0] - self.assertTrue(dms_col.is_dttm) - self.assertEqual(dms_col.python_date_format, "invalid") - - def test_expression_by_column_name(self): - table_defaults = { - "dttm_columns": { - "dttm": {"expression": "CAST(dttm as INTEGER)"}, - "duration_ms": {"expression": "CAST(duration_ms as DOUBLE)"}, - } - } - self.createTable(table_defaults) - dttm_col = [c for c in self._logs_table.columns if c.column_name == "dttm"][0] - self.assertTrue(dttm_col.is_dttm) - self.assertEqual(dttm_col.expression, "CAST(dttm as INTEGER)") - dms_col = [ - c for c in self._logs_table.columns if c.column_name == "duration_ms" - ][0] - self.assertEqual(dms_col.expression, "CAST(duration_ms as DOUBLE)") - self.assertTrue(dms_col.is_dttm) - - def test_full_setting(self): - self.createTable(FULL_DTTM_DEFAULTS_EXAMPLE) - - self.assertEqual(self._logs_table.main_dttm_col, "id") - - id_col = [c for c in self._logs_table.columns if c.column_name == "id"][0] - self.assertTrue(id_col.is_dttm) - self.assertEqual(id_col.python_date_format, "epoch_ms") - self.assertIsNone(id_col.expression) - - dttm_col = [c for c in self._logs_table.columns if c.column_name == "dttm"][0] - self.assertTrue(dttm_col.is_dttm) - self.assertEqual(dttm_col.python_date_format, "epoch_s") - self.assertEqual(dttm_col.expression, "CAST(dttm as INTEGER)") - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/integration_tests/conftest.py b/tests/integration_tests/conftest.py index 3e2744d2b194..2cdfef984bf6 100644 --- a/tests/integration_tests/conftest.py +++ b/tests/integration_tests/conftest.py @@ -19,7 +19,7 @@ import contextlib import functools import os -from typing import Any, Callable, Optional, TYPE_CHECKING +from typing import Any, Callable, Dict, Optional, TYPE_CHECKING from unittest.mock import patch import pytest @@ -44,8 +44,75 @@ @pytest.fixture def app_context(): - with app.app_context(): - yield + with app.app_context() as ctx: + yield ctx + + +@pytest.fixture +def test_client(app_context: AppContext): + with app.test_client() as client: + yield client + + +@pytest.fixture +def login_as(test_client: "FlaskClient[Any]"): + """Fixture with app context and logged in admin user.""" + + def _login_as(username: str, password: str = "general"): + login(test_client, username=username, password=password) + + yield _login_as + # no need to log out as both app_context and test_client are + # function level fixtures anyway + + +@pytest.fixture +def login_as_admin(login_as: Callable[..., None]): + yield login_as("admin") + + +@pytest.fixture +def create_user(app_context: AppContext): + def _create_user(username: str, role: str = "Admin", password: str = "general"): + security_manager.add_user( + username, + "firstname", + "lastname", + "email@exaple.com", + security_manager.find_role(role), + password, + ) + return security_manager.find_user(username) + + return _create_user + + +@pytest.fixture +def get_user(app_context: AppContext): + def _get_user(username: str) -> ab_models.User: + return ( + db.session.query(security_manager.user_model) + .filter_by(username=username) + .one_or_none() + ) + + return _get_user + + +@pytest.fixture +def get_or_create_user(get_user, create_user) -> ab_models.User: + @contextlib.contextmanager + def _get_user(username: str) -> ab_models.User: + user = get_user(username) + if not user: + # if user is created by test, remove it after done + user = create_user(username) + yield user + db.session.delete(user) + else: + yield user + + return _get_user @pytest.fixture @@ -171,7 +238,7 @@ def __call__(self) -> Database: return self._db def _load_lazy_data_to_decouple_from_session(self) -> None: - self._db.get_sqla_engine() # type: ignore + self._db._get_sqla_engine() # type: ignore self._db.backend # type: ignore def remove(self) -> None: @@ -188,7 +255,11 @@ def remove(self) -> None: def setup_presto_if_needed(): - backend = app.config["SQLALCHEMY_EXAMPLES_URI"].split("://")[0] + db_uri = ( + app.config.get("SQLALCHEMY_EXAMPLES_URI") + or app.config["SQLALCHEMY_DATABASE_URI"] + ) + backend = db_uri.split("://")[0] database = get_example_database() extra = database.get_extra() @@ -208,14 +279,14 @@ def setup_presto_if_needed(): if backend in {"presto", "hive"}: database = get_example_database() - engine = database.get_sqla_engine() - drop_from_schema(engine, CTAS_SCHEMA_NAME) - engine.execute(f"DROP SCHEMA IF EXISTS {CTAS_SCHEMA_NAME}") - engine.execute(f"CREATE SCHEMA {CTAS_SCHEMA_NAME}") + with database.get_sqla_engine_with_context() as engine: + drop_from_schema(engine, CTAS_SCHEMA_NAME) + engine.execute(f"DROP SCHEMA IF EXISTS {CTAS_SCHEMA_NAME}") + engine.execute(f"CREATE SCHEMA {CTAS_SCHEMA_NAME}") - drop_from_schema(engine, ADMIN_SCHEMA_NAME) - engine.execute(f"DROP SCHEMA IF EXISTS {ADMIN_SCHEMA_NAME}") - engine.execute(f"CREATE SCHEMA {ADMIN_SCHEMA_NAME}") + drop_from_schema(engine, ADMIN_SCHEMA_NAME) + engine.execute(f"DROP SCHEMA IF EXISTS {ADMIN_SCHEMA_NAME}") + engine.execute(f"CREATE SCHEMA {ADMIN_SCHEMA_NAME}") def with_feature_flags(**mock_feature_flags): @@ -253,6 +324,83 @@ def wrapper(*args, **kwargs): return decorate +def with_config(override_config: Dict[str, Any]): + """ + Use this decorator to mock specific config keys. + + Usage: + + class TestYourFeature(SupersetTestCase): + + @with_config({"SOME_CONFIG": True}) + def test_your_config(self): + self.assertEqual(curren_app.config["SOME_CONFIG"), True) + + """ + + def decorate(test_fn): + config_backup = {} + + def wrapper(*args, **kwargs): + from flask import current_app + + for key, value in override_config.items(): + config_backup[key] = current_app.config[key] + current_app.config[key] = value + test_fn(*args, **kwargs) + for key, value in config_backup.items(): + current_app.config[key] = value + + return functools.update_wrapper(wrapper, test_fn) + + return decorate + + +@pytest.fixture +def virtual_dataset(): + from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn + + dataset = SqlaTable( + table_name="virtual_dataset", + sql=( + "SELECT 0 as col1, 'a' as col2, 1.0 as col3, NULL as col4, '2000-01-01 00:00:00' as col5 " + "UNION ALL " + "SELECT 1, 'b', 1.1, NULL, '2000-01-02 00:00:00' " + "UNION ALL " + "SELECT 2 as col1, 'c' as col2, 1.2, NULL, '2000-01-03 00:00:00' " + "UNION ALL " + "SELECT 3 as col1, 'd' as col2, 1.3, NULL, '2000-01-04 00:00:00' " + "UNION ALL " + "SELECT 4 as col1, 'e' as col2, 1.4, NULL, '2000-01-05 00:00:00' " + "UNION ALL " + "SELECT 5 as col1, 'f' as col2, 1.5, NULL, '2000-01-06 00:00:00' " + "UNION ALL " + "SELECT 6 as col1, 'g' as col2, 1.6, NULL, '2000-01-07 00:00:00' " + "UNION ALL " + "SELECT 7 as col1, 'h' as col2, 1.7, NULL, '2000-01-08 00:00:00' " + "UNION ALL " + "SELECT 8 as col1, 'i' as col2, 1.8, NULL, '2000-01-09 00:00:00' " + "UNION ALL " + "SELECT 9 as col1, 'j' as col2, 1.9, NULL, '2000-01-10 00:00:00' " + ), + database=get_example_database(), + ) + TableColumn(column_name="col1", type="INTEGER", table=dataset) + TableColumn(column_name="col2", type="VARCHAR(255)", table=dataset) + TableColumn(column_name="col3", type="DECIMAL(4,2)", table=dataset) + TableColumn(column_name="col4", type="VARCHAR(255)", table=dataset) + # Different database dialect datetime type is not consistent, so temporarily use varchar + TableColumn(column_name="col5", type="VARCHAR(255)", table=dataset) + + SqlMetric(metric_name="count", expression="count(*)", table=dataset) + db.session.merge(dataset) + + yield dataset + + db.session.delete(dataset) + db.session.commit() + + @pytest.fixture def physical_dataset(): from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn @@ -323,3 +471,46 @@ def physical_dataset(): for ds in dataset: db.session.delete(ds) db.session.commit() + + +@pytest.fixture +def virtual_dataset_comma_in_column_value(): + from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn + + dataset = SqlaTable( + table_name="virtual_dataset", + sql=( + "SELECT 'col1,row1' as col1, 'col2, row1' as col2 " + "UNION ALL " + "SELECT 'col1,row2' as col1, 'col2, row2' as col2 " + "UNION ALL " + "SELECT 'col1,row3' as col1, 'col2, row3' as col2 " + ), + database=get_example_database(), + ) + TableColumn(column_name="col1", type="VARCHAR(255)", table=dataset) + TableColumn(column_name="col2", type="VARCHAR(255)", table=dataset) + + SqlMetric(metric_name="count", expression="count(*)", table=dataset) + db.session.merge(dataset) + + yield dataset + + db.session.delete(dataset) + db.session.commit() + + +only_postgresql = pytest.mark.skipif( + "postgresql" not in os.environ.get("SUPERSET__SQLALCHEMY_DATABASE_URI", ""), + reason="Only run test case in Postgresql", +) + +only_sqlite = pytest.mark.skipif( + "sqlite" not in os.environ.get("SUPERSET__SQLALCHEMY_DATABASE_URI", ""), + reason="Only run test case in SQLite", +) + +only_mysql = pytest.mark.skipif( + "mysql" not in os.environ.get("SUPERSET__SQLALCHEMY_DATABASE_URI", ""), + reason="Only run test case in MySQL", +) diff --git a/tests/integration_tests/core_tests.py b/tests/integration_tests/core_tests.py index f0d79253345c..f036f18bf6aa 100644 --- a/tests/integration_tests/core_tests.py +++ b/tests/integration_tests/core_tests.py @@ -27,10 +27,12 @@ from urllib.parse import quote import superset.utils.database +from superset.utils.core import backend from tests.integration_tests.fixtures.birth_names_dashboard import ( load_birth_names_dashboard_with_slices, load_birth_names_data, ) +from sqlalchemy import Table import pytest import pytz @@ -62,7 +64,7 @@ from superset.db_engine_specs.base import BaseEngineSpec from superset.db_engine_specs.mssql import MssqlEngineSpec from superset.exceptions import SupersetException -from superset.extensions import async_query_manager +from superset.extensions import async_query_manager, cache_manager from superset.models import core as models from superset.models.annotations import Annotation, AnnotationLayer from superset.models.dashboard import Dashboard @@ -79,15 +81,22 @@ load_world_bank_dashboard_with_slices, load_world_bank_data, ) +from tests.integration_tests.conftest import CTAS_SCHEMA_NAME logger = logging.getLogger(__name__) +@pytest.fixture(scope="module") +def cleanup(): + db.session.query(Query).delete() + db.session.query(DatasourceAccessRequest).delete() + db.session.query(models.Log).delete() + db.session.commit() + yield + + class TestCore(SupersetTestCase): def setUp(self): - db.session.query(Query).delete() - db.session.query(DatasourceAccessRequest).delete() - db.session.query(models.Log).delete() self.table_ids = { tbl.table_name: tbl.id for tbl in (db.session.query(SqlaTable).all()) } @@ -117,15 +126,6 @@ def test_dashboard_endpoint(self): @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_slice_endpoint(self): self.login(username="admin") - slc = self.get_slice("Girls", db.session) - resp = self.get_resp("/superset/slice/{}/".format(slc.id)) - assert "Original value" in resp - assert "List Roles" in resp - - # Testing overrides - resp = self.get_resp("/superset/slice/{}/?standalone=true".format(slc.id)) - assert '<div class="navbar' not in resp - resp = self.client.get("/superset/slice/-1/") assert resp.status_code == 404 @@ -159,7 +159,7 @@ def test_get_superset_tables_not_allowed(self): example_db = superset.utils.database.get_example_database() schema_name = self.default_schema_backend_map[example_db.backend] self.login(username="gamma") - uri = f"superset/tables/{example_db.id}/{schema_name}/undefined/" + uri = f"superset/tables/{example_db.id}/{schema_name}/" rv = self.client.get(uri) self.assertEqual(rv.status_code, 404) @@ -188,7 +188,7 @@ def test_get_superset_tables_allowed(self): example_db = utils.get_example_database() schema_name = self.default_schema_backend_map[example_db.backend] - uri = f"superset/tables/{example_db.id}/{schema_name}/{table_name}/" + uri = f"superset/tables/{example_db.id}/{schema_name}/" rv = self.client.get(uri) self.assertEqual(rv.status_code, 200) @@ -200,7 +200,6 @@ def test_get_superset_tables_allowed(self): @pytest.mark.usefixtures("load_energy_table_with_slice") def test_get_superset_tables_not_allowed_with_out_permissions(self): session = db.session - table_name = "energy_usage" role_name = "dummy_role_no_table_access" self.logout() self.login(username="gamma") @@ -213,7 +212,7 @@ def test_get_superset_tables_not_allowed_with_out_permissions(self): example_db = utils.get_example_database() schema_name = self.default_schema_backend_map[example_db.backend] - uri = f"superset/tables/{example_db.id}/{schema_name}/{table_name}/" + uri = f"superset/tables/{example_db.id}/{schema_name}/" rv = self.client.get(uri) self.assertEqual(rv.status_code, 404) @@ -222,73 +221,18 @@ def test_get_superset_tables_not_allowed_with_out_permissions(self): gamma_user.roles.remove(security_manager.find_role(role_name)) session.commit() - def test_get_superset_tables_substr(self): - example_db = superset.utils.database.get_example_database() - if example_db.backend in {"presto", "hive"}: - # TODO: change table to the real table that is in examples. - return - self.login(username="admin") - schema_name = self.default_schema_backend_map[example_db.backend] - uri = f"superset/tables/{example_db.id}/{schema_name}/ab_role/" - rv = self.client.get(uri) - response = json.loads(rv.data.decode("utf-8")) - self.assertEqual(rv.status_code, 200) - - expected_response = { - "options": [ - { - "label": "ab_role", - "schema": schema_name, - "title": "ab_role", - "type": "table", - "value": "ab_role", - "extra": None, - } - ], - "tableLength": 1, - } - self.assertEqual(response, expected_response) - - def test_get_superset_tables_not_found(self): + def test_get_superset_tables_database_not_found(self): self.login(username="admin") - uri = f"superset/tables/invalid/public/undefined/" + uri = f"superset/tables/invalid/public/" rv = self.client.get(uri) self.assertEqual(rv.status_code, 404) - def test_annotation_json_endpoint(self): - # Set up an annotation layer and annotation - layer = AnnotationLayer(name="foo", descr="bar") - db.session.add(layer) - db.session.commit() - - annotation = Annotation( - layer_id=layer.id, - short_descr="my_annotation", - start_dttm=datetime.datetime(2020, 5, 20, 18, 21, 51), - end_dttm=datetime.datetime(2020, 5, 20, 18, 31, 51), - ) - - db.session.add(annotation) - db.session.commit() - - self.login() - resp_annotations = json.loads( - self.get_resp("annotationlayermodelview/api/read") - ) - # the UI needs id and name to function - self.assertIn("id", resp_annotations["result"][0]) - self.assertIn("name", resp_annotations["result"][0]) - - response = self.get_resp( - f"/superset/annotation_json/{layer.id}?form_data=" - + quote(json.dumps({"time_range": "100 years ago : now"})) - ) - assert "my_annotation" in response - - # Rollback changes - db.session.delete(annotation) - db.session.delete(layer) - db.session.commit() + def test_get_superset_tables_schema_undefined(self): + example_db = superset.utils.database.get_example_database() + self.login(username="gamma") + uri = f"superset/tables/{example_db.id}/undefined/" + rv = self.client.get(uri) + self.assertEqual(rv.status_code, 422) def test_admin_only_permissions(self): def assert_admin_permission_in(role_name, assert_func): @@ -381,21 +325,13 @@ def test_save_slice(self): @pytest.mark.usefixtures("load_energy_table_with_slice") def test_filter_endpoint(self): self.login(username="admin") - slice_name = "Energy Sankey" - slice_id = self.get_slice(slice_name, db.session).id - db.session.commit() tbl_id = self.table_ids.get("energy_usage") table = db.session.query(SqlaTable).filter(SqlaTable.id == tbl_id) table.filter_select_enabled = True - url = ( - "/superset/filter/table/{}/target/?viz_type=sankey&groupby=source" - "&metric=sum__value&flt_col_0=source&flt_op_0=in&flt_eq_0=&" - "slice_id={}&datasource_name=energy_usage&" - "datasource_id=1&datasource_type=table" - ) + url = "/superset/filter/table/{}/target/" # Changing name - resp = self.get_resp(url.format(tbl_id, slice_id)) + resp = self.get_resp(url.format(tbl_id)) assert len(resp) > 0 assert "energy_target0" in resp @@ -481,7 +417,7 @@ def test_get_user_slices(self): @pytest.mark.usefixtures("load_energy_table_with_slice") def test_slices_V2(self): # Add explore-v2-beta role to admin user - # Test all slice urls as user with with explore-v2-beta role + # Test all slice urls as user with explore-v2-beta role security_manager.add_role("explore-v2-beta") security_manager.add_user( @@ -685,7 +621,7 @@ def test_redirect_invalid(self): self.login(username="admin") response = self.client.get(f"/r/{model_url.id}") - assert response.headers["Location"] == "http://localhost/" + assert response.headers["Location"] == "/" db.session.delete(model_url) db.session.commit() @@ -766,6 +702,52 @@ def test_extra_table_metadata(self): f"/superset/extra_table_metadata/{example_db.id}/birth_names/{schema}/" ) + def test_required_params_in_sql_json(self): + self.login() + client_id = "{}".format(random.getrandbits(64))[:10] + + data = {"client_id": client_id} + rv = self.client.post( + "/superset/sql_json/", + json=data, + ) + failed_resp = { + "sql": ["Missing data for required field."], + "database_id": ["Missing data for required field."], + } + resp_data = json.loads(rv.data.decode("utf-8")) + self.assertDictEqual(resp_data, failed_resp) + self.assertEqual(rv.status_code, 400) + + data = {"sql": "SELECT 1", "client_id": client_id} + rv = self.client.post( + "/superset/sql_json/", + json=data, + ) + failed_resp = {"database_id": ["Missing data for required field."]} + resp_data = json.loads(rv.data.decode("utf-8")) + self.assertDictEqual(resp_data, failed_resp) + self.assertEqual(rv.status_code, 400) + + data = {"database_id": 1, "client_id": client_id} + rv = self.client.post( + "/superset/sql_json/", + json=data, + ) + failed_resp = {"sql": ["Missing data for required field."]} + resp_data = json.loads(rv.data.decode("utf-8")) + self.assertDictEqual(resp_data, failed_resp) + self.assertEqual(rv.status_code, 400) + + data = {"sql": "SELECT 1", "database_id": 1, "client_id": client_id} + rv = self.client.post( + "/superset/sql_json/", + json=data, + ) + resp_data = json.loads(rv.data.decode("utf-8")) + self.assertEqual(resp_data.get("status"), "success") + self.assertEqual(rv.status_code, 200) + def test_templated_sql_json(self): if superset.utils.database.get_example_database().backend == "presto": # TODO: make it work for presto @@ -887,11 +869,11 @@ def test_user_activity_access(self, username="gamma"): @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_slice_id_is_always_logged_correctly_on_web_request(self): - # superset/explore case + # explore case self.login("admin") slc = db.session.query(Slice).filter_by(slice_name="Girls").one() qry = db.session.query(models.Log).filter_by(slice_id=slc.id) - self.get_resp(slc.slice_url, {"form_data": json.dumps(slc.form_data)}) + self.get_resp(slc.slice_url) self.assertEqual(1, qry.count()) def create_sample_csvfile(self, filename: str, content: List[str]) -> None: @@ -1412,6 +1394,8 @@ def test_feature_flag_serialization(self): """ Functions in feature flags don't break bootstrap data serialization. """ + # feature flags are cached + cache_manager.cache.clear() self.login() encoded = json.dumps( @@ -1430,7 +1414,7 @@ def test_feature_flag_serialization(self): "/superset/welcome", f"/superset/dashboard/{dash_id}/", "/superset/profile/admin/", - f"/superset/explore/table/{tbl_id}", + f"/explore/?datasource_type=table&datasource_id={tbl_id}", ] for url in urls: data = self.get_resp(url) @@ -1483,6 +1467,38 @@ def test_sqllab_backend_persistence_payload(self): payload = views.Superset._get_sqllab_tabs(user_id=user_id) self.assertEqual(len(payload["queries"]), 1) + @mock.patch.dict( + "superset.extensions.feature_flag_manager._feature_flags", + {"SQLLAB_BACKEND_PERSISTENCE": True}, + clear=True, + ) + def test_tabstate_with_name(self): + """ + The tabstateview endpoint GET should be able to take name or title + for backward compatibility + """ + username = "admin" + self.login(username) + + # create a tab + data = { + "queryEditor": json.dumps( + { + "name": "Untitled Query foo", + "dbId": 1, + "schema": None, + "autorun": False, + "sql": "SELECT ...", + "queryLimit": 1000, + } + ) + } + resp = self.get_json_resp("/tabstateview/", data=data) + tab_state_id = resp["id"] + payload = self.get_json_resp(f"/tabstateview/{tab_state_id}") + + self.assertEqual(payload["label"], "Untitled Query foo") + def test_virtual_table_explore_visibility(self): # test that default visibility it set to True database = superset.utils.database.get_example_database() @@ -1572,7 +1588,7 @@ def test_explore_injected_exceptions(self, mock_db_connection_mutator): exception = SupersetException("Error message") mock_db_connection_mutator.side_effect = exception slice = db.session.query(Slice).first() - url = f"/superset/explore/?form_data=%7B%22slice_id%22%3A%20{slice.id}%7D" + url = f"/explore/?form_data=%7B%22slice_id%22%3A%20{slice.id}%7D" self.login() data = self.get_resp(url) @@ -1582,7 +1598,7 @@ def test_explore_injected_exceptions(self, mock_db_connection_mutator): exception = SQLAlchemyError("Error message") mock_db_connection_mutator.side_effect = exception slice = db.session.query(Slice).first() - url = f"/superset/explore/?form_data=%7B%22slice_id%22%3A%20{slice.id}%7D" + url = f"/explore/?form_data=%7B%22slice_id%22%3A%20{slice.id}%7D" self.login() data = self.get_resp(url) @@ -1595,7 +1611,7 @@ def test_dashboard_injected_exceptions(self, mock_db_connection_mutator): Handle injected exceptions from the db mutator """ - # Assert we can handle a custom excetion at the mutator level + # Assert we can handle a custom exception at the mutator level exception = SupersetException("Error message") mock_db_connection_mutator.side_effect = exception dash = db.session.query(Dashboard).first() @@ -1638,6 +1654,32 @@ def test_stop_query_not_implemented( assert rv.status_code == 422 + @pytest.mark.usefixtures("load_energy_table_with_slice") + @mock.patch("superset.explore.form_data.commands.create.CreateFormDataCommand.run") + def test_explore_redirect(self, mock_command: mock.Mock): + self.login(username="admin") + random_key = "random_key" + mock_command.return_value = random_key + slice_name = f"Energy Sankey" + slice_id = self.get_slice(slice_name, db.session).id + form_data = {"slice_id": slice_id, "viz_type": "line", "datasource": "1__table"} + rv = self.client.get( + f"/superset/explore/?form_data={quote(json.dumps(form_data))}" + ) + self.assertEqual( + rv.headers["Location"], f"/explore/?form_data_key={random_key}" + ) + + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") + def test_has_table_by_name(self): + if backend() in ("sqlite", "mysql"): + return + example_db = superset.utils.database.get_example_database() + assert ( + example_db.has_table_by_name(table_name="birth_names", schema="public") + is True + ) + if __name__ == "__main__": unittest.main() diff --git a/tests/integration_tests/csv_upload_tests.py b/tests/integration_tests/csv_upload_tests.py index c9bc11db9855..3e0200d18a26 100644 --- a/tests/integration_tests/csv_upload_tests.py +++ b/tests/integration_tests/csv_upload_tests.py @@ -29,13 +29,13 @@ import superset.utils.database from superset.sql_parse import Table -from superset import security_manager from tests.integration_tests.conftest import ADMIN_SCHEMA_NAME -from tests.integration_tests.test_app import app # isort:skip from superset import db +from superset import security_manager from superset.models.core import Database from superset.utils import core as utils -from tests.integration_tests.base_tests import get_resp, login, SupersetTestCase +from tests.integration_tests.test_app import app, login +from tests.integration_tests.base_tests import get_resp, SupersetTestCase logger = logging.getLogger(__name__) @@ -58,31 +58,39 @@ CSV_UPLOAD_TABLE_W_EXPLORE = "csv_upload_w_explore" -@pytest.fixture(scope="module") -def setup_csv_upload(): - with app.app_context(): - login(test_client, username="admin") - - upload_db = superset.utils.database.get_or_create_db( - CSV_UPLOAD_DATABASE, app.config["SQLALCHEMY_EXAMPLES_URI"] - ) - extra = upload_db.get_extra() - extra["explore_database_id"] = superset.utils.database.get_example_database().id - upload_db.extra = json.dumps(extra) - upload_db.allow_file_upload = True - db.session.commit() +def _setup_csv_upload(): + upload_db = superset.utils.database.get_or_create_db( + CSV_UPLOAD_DATABASE, app.config["SQLALCHEMY_EXAMPLES_URI"] + ) + extra = upload_db.get_extra() + extra["explore_database_id"] = superset.utils.database.get_example_database().id + upload_db.extra = json.dumps(extra) + upload_db.allow_file_upload = True + db.session.commit() - yield + yield - upload_db = get_upload_db() - engine = upload_db.get_sqla_engine() + upload_db = get_upload_db() + with upload_db.get_sqla_engine_with_context() as engine: engine.execute(f"DROP TABLE IF EXISTS {EXCEL_UPLOAD_TABLE}") engine.execute(f"DROP TABLE IF EXISTS {CSV_UPLOAD_TABLE}") engine.execute(f"DROP TABLE IF EXISTS {PARQUET_UPLOAD_TABLE}") engine.execute(f"DROP TABLE IF EXISTS {CSV_UPLOAD_TABLE_W_SCHEMA}") engine.execute(f"DROP TABLE IF EXISTS {CSV_UPLOAD_TABLE_W_EXPLORE}") - db.session.delete(upload_db) - db.session.commit() + db.session.delete(upload_db) + db.session.commit() + + +@pytest.fixture(scope="module") +def setup_csv_upload(login_as_admin): + yield from _setup_csv_upload() + + +@pytest.fixture(scope="module") +def setup_csv_upload_with_context(): + with app.app_context(): + login(test_client, username="admin") + yield from _setup_csv_upload() @pytest.fixture(scope="module") @@ -126,12 +134,12 @@ def upload_csv(filename: str, table_name: str, extra: Optional[Dict[str, str]] = schema = utils.get_example_default_schema() form_data = { "csv_file": open(filename, "rb"), - "sep": ",", - "name": table_name, - "con": csv_upload_db_id, + "delimiter": ",", + "table_name": table_name, + "database": csv_upload_db_id, "if_exists": "fail", "index_label": "test_label", - "mangle_dupe_cols": False, + "overwrite_duplicate": False, } if schema: form_data["schema"] = schema @@ -148,7 +156,7 @@ def upload_excel( form_data = { "excel_file": open(filename, "rb"), "name": table_name, - "con": excel_upload_db_id, + "database": excel_upload_db_id, "sheet_name": "Sheet1", "if_exists": "fail", "index_label": "test_label", @@ -169,7 +177,7 @@ def upload_columnar( form_data = { "columnar_file": open(filename, "rb"), "name": table_name, - "con": columnar_upload_db_id, + "database": columnar_upload_db_id, "if_exists": "fail", "index_label": "test_label", } @@ -201,5 +209,308 @@ def mock_upload_to_s3(filename: str, upload_prefix: str, table: Table) -> str: container.exec_run(f"hdfs dfs -mkdir -p {dest_dir}") dest = os.path.join(dest_dir, os.path.basename(filename)) container.exec_run(f"hdfs dfs -put {src} {dest}") - # hive external table expectes a directory for the location + # hive external table expects a directory for the location return dest_dir + + +def escaped_double_quotes(text): + return f"\"{text}\"" + + +def escaped_parquet(text): + return escaped_double_quotes(f"['{text}']") + + +@pytest.mark.usefixtures("setup_csv_upload_with_context") +@pytest.mark.usefixtures("create_csv_files") +@mock.patch( + "superset.models.core.config", + {**app.config, "ALLOWED_USER_CSV_SCHEMA_FUNC": lambda d, u: ["admin_database"]}, +) +@mock.patch("superset.db_engine_specs.hive.upload_to_s3", mock_upload_to_s3) +@mock.patch("superset.views.database.views.event_logger.log_with_context") +def test_import_csv_enforced_schema(mock_event_logger): + if utils.backend() == "sqlite": + pytest.skip("Sqlite doesn't support schema / database creation") + + full_table_name = f"admin_database.{CSV_UPLOAD_TABLE_W_SCHEMA}" + + # Invalid table name + resp = upload_csv(CSV_FILENAME1, full_table_name) + assert "Table name cannot contain a schema" in resp + + # no schema specified, fail upload + resp = upload_csv(CSV_FILENAME1, CSV_UPLOAD_TABLE_W_SCHEMA, extra={"schema": None}) + assert ( + f"Database {escaped_double_quotes(CSV_UPLOAD_DATABASE)} schema" + f" {escaped_double_quotes('None')} is not allowed for csv uploads" in resp + ) + + success_msg = f"CSV file {escaped_double_quotes(CSV_FILENAME1)} uploaded to table {escaped_double_quotes(full_table_name)}" + + resp = upload_csv( + CSV_FILENAME1, + CSV_UPLOAD_TABLE_W_SCHEMA, + extra={"schema": "admin_database", "if_exists": "replace"}, + ) + + assert success_msg in resp + mock_event_logger.assert_called_with( + action="successful_csv_upload", + database=get_upload_db().name, + schema="admin_database", + table=CSV_UPLOAD_TABLE_W_SCHEMA, + ) + + with get_upload_db().get_sqla_engine_with_context() as engine: + data = engine.execute( + f"SELECT * from {ADMIN_SCHEMA_NAME}.{CSV_UPLOAD_TABLE_W_SCHEMA}" + ).fetchall() + assert data == [("john", 1), ("paul", 2)] + + # user specified schema doesn't match, fail + resp = upload_csv( + CSV_FILENAME1, CSV_UPLOAD_TABLE_W_SCHEMA, extra={"schema": "gold"} + ) + assert ( + f'Database {escaped_double_quotes(CSV_UPLOAD_DATABASE)} schema {escaped_double_quotes("gold")} is not allowed for csv uploads' + in resp + ) + + # user specified schema matches the expected schema, append + if utils.backend() == "hive": + pytest.skip("Hive database doesn't support append csv uploads.") + resp = upload_csv( + CSV_FILENAME1, + CSV_UPLOAD_TABLE_W_SCHEMA, + extra={"schema": "admin_database", "if_exists": "append"}, + ) + assert success_msg in resp + + # Clean up + with get_upload_db().get_sqla_engine_with_context() as engine: + engine.execute(f"DROP TABLE {full_table_name}") + + +@mock.patch("superset.db_engine_specs.hive.upload_to_s3", mock_upload_to_s3) +def test_import_csv_explore_database(setup_csv_upload_with_context, create_csv_files): + schema = utils.get_example_default_schema() + full_table_name = ( + f"{schema}.{CSV_UPLOAD_TABLE_W_EXPLORE}" + if schema + else CSV_UPLOAD_TABLE_W_EXPLORE + ) + + if utils.backend() == "sqlite": + pytest.skip("Sqlite doesn't support schema / database creation") + + resp = upload_csv(CSV_FILENAME1, CSV_UPLOAD_TABLE_W_EXPLORE) + assert ( + f"CSV file {escaped_double_quotes(CSV_FILENAME1)} uploaded to table {escaped_double_quotes(full_table_name)}" + in resp + ) + table = SupersetTestCase.get_table(name=CSV_UPLOAD_TABLE_W_EXPLORE) + assert table.database_id == superset.utils.database.get_example_database().id + + +@pytest.mark.usefixtures("setup_csv_upload_with_context") +@pytest.mark.usefixtures("create_csv_files") +@mock.patch("superset.db_engine_specs.hive.upload_to_s3", mock_upload_to_s3) +@mock.patch("superset.views.database.views.event_logger.log_with_context") +def test_import_csv(mock_event_logger): + schema = utils.get_example_default_schema() + full_table_name = f"{schema}.{CSV_UPLOAD_TABLE}" if schema else CSV_UPLOAD_TABLE + success_msg_f1 = f"CSV file {escaped_double_quotes(CSV_FILENAME1)} uploaded to table {escaped_double_quotes(full_table_name)}" + + test_db = get_upload_db() + + # initial upload with fail mode + resp = upload_csv(CSV_FILENAME1, CSV_UPLOAD_TABLE) + assert success_msg_f1 in resp + + # upload again with fail mode; should fail + fail_msg = f"Unable to upload CSV file {escaped_double_quotes(CSV_FILENAME1)} to table {escaped_double_quotes(CSV_UPLOAD_TABLE)}" + resp = upload_csv(CSV_FILENAME1, CSV_UPLOAD_TABLE) + assert fail_msg in resp + + if utils.backend() != "hive": + # upload again with append mode + resp = upload_csv( + CSV_FILENAME1, CSV_UPLOAD_TABLE, extra={"if_exists": "append"} + ) + assert success_msg_f1 in resp + mock_event_logger.assert_called_with( + action="successful_csv_upload", + database=test_db.name, + schema=schema, + table=CSV_UPLOAD_TABLE, + ) + + # upload again with replace mode + resp = upload_csv(CSV_FILENAME1, CSV_UPLOAD_TABLE, extra={"if_exists": "replace"}) + assert success_msg_f1 in resp + + # try to append to table from file with different schema + resp = upload_csv(CSV_FILENAME2, CSV_UPLOAD_TABLE, extra={"if_exists": "append"}) + fail_msg_f2 = f"Unable to upload CSV file {escaped_double_quotes(CSV_FILENAME2)} to table {escaped_double_quotes(CSV_UPLOAD_TABLE)}" + assert fail_msg_f2 in resp + + # replace table from file with different schema + resp = upload_csv(CSV_FILENAME2, CSV_UPLOAD_TABLE, extra={"if_exists": "replace"}) + success_msg_f2 = f"CSV file {escaped_double_quotes(CSV_FILENAME2)} uploaded to table {escaped_double_quotes(full_table_name)}" + assert success_msg_f2 in resp + + table = SupersetTestCase.get_table(name=CSV_UPLOAD_TABLE) + # make sure the new column name is reflected in the table metadata + assert "d" in table.column_names + + # ensure user is assigned as an owner + assert security_manager.find_user("admin") in table.owners + + # null values are set + upload_csv( + CSV_FILENAME2, + CSV_UPLOAD_TABLE, + extra={"null_values": '["", "john"]', "if_exists": "replace"}, + ) + # make sure that john and empty string are replaced with None + with test_db.get_sqla_engine_with_context() as engine: + data = engine.execute(f"SELECT * from {CSV_UPLOAD_TABLE}").fetchall() + assert data == [(None, 1, "x"), ("paul", 2, None)] + # default null values + upload_csv(CSV_FILENAME2, CSV_UPLOAD_TABLE, extra={"if_exists": "replace"}) + # make sure that john and empty string are replaced with None + data = engine.execute(f"SELECT * from {CSV_UPLOAD_TABLE}").fetchall() + assert data == [("john", 1, "x"), ("paul", 2, None)] + + +@pytest.mark.usefixtures("setup_csv_upload_with_context") +@pytest.mark.usefixtures("create_excel_files") +@mock.patch("superset.db_engine_specs.hive.upload_to_s3", mock_upload_to_s3) +@mock.patch("superset.views.database.views.event_logger.log_with_context") +def test_import_excel(mock_event_logger): + if utils.backend() == "hive": + pytest.skip("Hive doesn't excel upload.") + + schema = utils.get_example_default_schema() + full_table_name = f"{schema}.{EXCEL_UPLOAD_TABLE}" if schema else EXCEL_UPLOAD_TABLE + test_db = get_upload_db() + + success_msg = f"Excel file {escaped_double_quotes(EXCEL_FILENAME)} uploaded to table {escaped_double_quotes(full_table_name)}" + + # initial upload with fail mode + resp = upload_excel(EXCEL_FILENAME, EXCEL_UPLOAD_TABLE) + assert success_msg in resp + mock_event_logger.assert_called_with( + action="successful_excel_upload", + database=test_db.name, + schema=schema, + table=EXCEL_UPLOAD_TABLE, + ) + + # ensure user is assigned as an owner + table = SupersetTestCase.get_table(name=EXCEL_UPLOAD_TABLE) + assert security_manager.find_user("admin") in table.owners + + # upload again with fail mode; should fail + fail_msg = f"Unable to upload Excel file {escaped_double_quotes(EXCEL_FILENAME)} to table {escaped_double_quotes(EXCEL_UPLOAD_TABLE)}" + resp = upload_excel(EXCEL_FILENAME, EXCEL_UPLOAD_TABLE) + assert fail_msg in resp + + if utils.backend() != "hive": + # upload again with append mode + resp = upload_excel( + EXCEL_FILENAME, EXCEL_UPLOAD_TABLE, extra={"if_exists": "append"} + ) + assert success_msg in resp + + # upload again with replace mode + resp = upload_excel( + EXCEL_FILENAME, EXCEL_UPLOAD_TABLE, extra={"if_exists": "replace"} + ) + assert success_msg in resp + mock_event_logger.assert_called_with( + action="successful_excel_upload", + database=test_db.name, + schema=schema, + table=EXCEL_UPLOAD_TABLE, + ) + + with test_db.get_sqla_engine_with_context() as engine: + data = engine.execute(f"SELECT * from {EXCEL_UPLOAD_TABLE}").fetchall() + assert data == [(0, "john", 1), (1, "paul", 2)] + + +@pytest.mark.usefixtures("setup_csv_upload_with_context") +@pytest.mark.usefixtures("create_columnar_files") +@mock.patch("superset.db_engine_specs.hive.upload_to_s3", mock_upload_to_s3) +@mock.patch("superset.views.database.views.event_logger.log_with_context") +def test_import_parquet(mock_event_logger): + if utils.backend() == "hive": + pytest.skip("Hive doesn't allow parquet upload.") + + schema = utils.get_example_default_schema() + full_table_name = ( + f"{schema}.{PARQUET_UPLOAD_TABLE}" if schema else PARQUET_UPLOAD_TABLE + ) + test_db = get_upload_db() + + success_msg_f1 = f"Columnar file {escaped_parquet(PARQUET_FILENAME1)} uploaded to table {escaped_double_quotes(full_table_name)}" + + # initial upload with fail mode + resp = upload_columnar(PARQUET_FILENAME1, PARQUET_UPLOAD_TABLE) + assert success_msg_f1 in resp + + # upload again with fail mode; should fail + fail_msg = f"Unable to upload Columnar file {escaped_parquet(PARQUET_FILENAME1)} to table {escaped_double_quotes(PARQUET_UPLOAD_TABLE)}" + resp = upload_columnar(PARQUET_FILENAME1, PARQUET_UPLOAD_TABLE) + assert fail_msg in resp + + if utils.backend() != "hive": + # upload again with append mode + resp = upload_columnar( + PARQUET_FILENAME1, PARQUET_UPLOAD_TABLE, extra={"if_exists": "append"} + ) + assert success_msg_f1 in resp + mock_event_logger.assert_called_with( + action="successful_columnar_upload", + database=test_db.name, + schema=schema, + table=PARQUET_UPLOAD_TABLE, + ) + + # upload again with replace mode and specific columns + resp = upload_columnar( + PARQUET_FILENAME1, + PARQUET_UPLOAD_TABLE, + extra={"if_exists": "replace", "usecols": '["a"]'}, + ) + assert success_msg_f1 in resp + + table = SupersetTestCase.get_table(name=PARQUET_UPLOAD_TABLE, schema=None) + # make sure only specified column name was read + assert "b" not in table.column_names + + # ensure user is assigned as an owner + assert security_manager.find_user("admin") in table.owners + + # upload again with replace mode + resp = upload_columnar( + PARQUET_FILENAME1, PARQUET_UPLOAD_TABLE, extra={"if_exists": "replace"} + ) + assert success_msg_f1 in resp + + with test_db.get_sqla_engine_with_context() as engine: + data = engine.execute(f"SELECT * from {PARQUET_UPLOAD_TABLE}").fetchall() + assert data == [("john", 1), ("paul", 2)] + + # replace table with zip file + resp = upload_columnar( + ZIP_FILENAME, PARQUET_UPLOAD_TABLE, extra={"if_exists": "replace"} + ) + success_msg_f2 = f"Columnar file {escaped_parquet(ZIP_FILENAME)} uploaded to table {escaped_double_quotes(full_table_name)}" + assert success_msg_f2 in resp + + with test_db.get_sqla_engine_with_context() as engine: + data = engine.execute(f"SELECT * from {PARQUET_UPLOAD_TABLE}").fetchall() + assert data == [("john", 1), ("paul", 2), ("max", 3), ("bob", 4)] diff --git a/tests/integration_tests/dashboard_tests.py b/tests/integration_tests/dashboard_tests.py index 3ad9b07e29c1..d54151db83c2 100644 --- a/tests/integration_tests/dashboard_tests.py +++ b/tests/integration_tests/dashboard_tests.py @@ -23,7 +23,7 @@ from random import random import pytest -from flask import escape, url_for +from flask import Response, escape, url_for from sqlalchemy import func from tests.integration_tests.test_app import app @@ -125,13 +125,12 @@ def get_mock_positions(self, dash): positions[id] = d return positions - def test_dashboard(self): + def test_get_dashboard(self): self.login(username="admin") - urls = {} - for dash in db.session.query(Dashboard).all(): - urls[dash.dashboard_title] = dash.url - for title, url in urls.items(): - assert escape(title) in self.client.get(url).data.decode("utf-8") + for dash in db.session.query(Dashboard): + assert escape(dash.dashboard_title) in self.client.get(dash.url).get_data( + as_text=True + ) def test_superset_dashboard_url(self): url_for("Superset.dashboard", dashboard_id_or_slug=1) @@ -144,7 +143,7 @@ def test_new_dashboard(self): dash_count_after = db.session.query(func.count(Dashboard.id)).first()[0] self.assertEqual(dash_count_before + 1, dash_count_after) group = re.match( - r"http:\/\/localhost\/superset\/dashboard\/([0-9]*)\/\?edit=true", + r"\/superset\/dashboard\/([0-9]*)\/\?edit=true", response.headers["Location"], ) assert group is not None @@ -424,8 +423,9 @@ def test_public_user_dashboard_access(self): # Cleanup self.revoke_public_access_to_table(table) - @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") - @pytest.mark.usefixtures("public_role_like_gamma") + @pytest.mark.usefixtures( + "load_birth_names_dashboard_with_slices", "public_role_like_gamma" + ) def test_dashboard_with_created_by_can_be_accessed_by_public_users(self): self.logout() table = db.session.query(SqlaTable).filter_by(table_name="birth_names").one() @@ -437,8 +437,9 @@ def test_dashboard_with_created_by_can_be_accessed_by_public_users(self): db.session.merge(dash) db.session.commit() - # this asserts a non-4xx response - self.get_resp("/superset/dashboard/births/") + res: Response = self.client.get("/superset/dashboard/births/") + assert res.status_code == 200 + # Cleanup self.revoke_public_access_to_table(table) @@ -486,13 +487,18 @@ def test_users_can_view_own_dashboard(self): hidden_dash.slices = [] hidden_dash.owners = [] - db.session.merge(dash) - db.session.merge(hidden_dash) + db.session.add(dash) + db.session.add(hidden_dash) db.session.commit() self.login(user.username) resp = self.get_resp("/api/v1/dashboard/") + + db.session.delete(dash) + db.session.delete(hidden_dash) + db.session.commit() + self.assertIn(f"/superset/dashboard/{my_dash_slug}/", resp) self.assertNotIn(f"/superset/dashboard/{not_my_dash_slug}/", resp) @@ -509,8 +515,8 @@ def test_users_can_view_favorited_dashboards(self): regular_dash.dashboard_title = "A Plain Ol Dashboard" regular_dash.slug = regular_dash_slug - db.session.merge(favorite_dash) - db.session.merge(regular_dash) + db.session.add(favorite_dash) + db.session.add(regular_dash) db.session.commit() dash = db.session.query(Dashboard).filter_by(slug=fav_dash_slug).first() @@ -520,12 +526,18 @@ def test_users_can_view_favorited_dashboards(self): favorites.class_name = "Dashboard" favorites.user_id = user.id - db.session.merge(favorites) + db.session.add(favorites) db.session.commit() self.login(user.username) resp = self.get_resp("/api/v1/dashboard/") + + db.session.delete(favorites) + db.session.delete(regular_dash) + db.session.delete(favorite_dash) + db.session.commit() + self.assertIn(f"/superset/dashboard/{fav_dash_slug}/", resp) def test_user_can_not_view_unpublished_dash(self): @@ -540,12 +552,16 @@ def test_user_can_not_view_unpublished_dash(self): dash.owners = [admin_user] dash.slices = [] dash.published = False - db.session.merge(dash) + db.session.add(dash) db.session.commit() # list dashboards as a gamma user self.login(gamma_user.username) resp = self.get_resp("/api/v1/dashboard/") + + db.session.delete(dash) + db.session.commit() + self.assertNotIn(f"/superset/dashboard/{slug}/", resp) diff --git a/tests/integration_tests/dashboard_utils.py b/tests/integration_tests/dashboard_utils.py index 41a34fa36edf..bea724dafc95 100644 --- a/tests/integration_tests/dashboard_utils.py +++ b/tests/integration_tests/dashboard_utils.py @@ -21,7 +21,7 @@ from pandas import DataFrame -from superset import ConnectorRegistry, db +from superset import db from superset.connectors.sqla.models import SqlaTable from superset.models.core import Database from superset.models.dashboard import Dashboard @@ -35,9 +35,8 @@ def get_table( schema: Optional[str] = None, ): schema = schema or get_example_default_schema() - table_source = ConnectorRegistry.sources["table"] return ( - db.session.query(table_source) + db.session.query(SqlaTable) .filter_by(database_id=database.id, schema=schema, table_name=table_name) .one_or_none() ) @@ -54,8 +53,7 @@ def create_table_metadata( table = get_table(table_name, database, schema) if not table: - table_source = ConnectorRegistry.sources["table"] - table = table_source(schema=schema, table_name=table_name) + table = SqlaTable(schema=schema, table_name=table_name) if fetch_values_predicate: table.fetch_values_predicate = fetch_values_predicate table.database = database @@ -82,8 +80,9 @@ def create_dashboard( slug: str, title: str, position: str, slices: List[Slice] ) -> Dashboard: dash = db.session.query(Dashboard).filter_by(slug=slug).one_or_none() - if not dash: - dash = Dashboard() + if dash: + return dash + dash = Dashboard() dash.dashboard_title = title if position is not None: js = position @@ -92,7 +91,7 @@ def create_dashboard( dash.slug = slug if slices is not None: dash.slices = slices - db.session.merge(dash) + db.session.add(dash) db.session.commit() return dash diff --git a/tests/integration_tests/dashboards/api_tests.py b/tests/integration_tests/dashboards/api_tests.py index a027dcffae60..725811ce5f68 100644 --- a/tests/integration_tests/dashboards/api_tests.py +++ b/tests/integration_tests/dashboards/api_tests.py @@ -34,7 +34,7 @@ from superset import db, security_manager from superset.models.dashboard import Dashboard from superset.models.core import FavStar, FavStarClassName -from superset.models.reports import ReportSchedule, ReportScheduleType +from superset.reports.models import ReportSchedule, ReportScheduleType from superset.models.slice import Slice from superset.utils.core import backend from superset.views.base import generate_download_headers @@ -72,7 +72,7 @@ class TestDashboardApi(SupersetTestCase, ApiOwnersTestCaseMixin, InsertChartMixi "slug": "slug1_changed", "position_json": '{"b": "B"}', "css": "css_changed", - "json_metadata": '{"refresh_frequency": 30, "timed_refresh_immune_slices": [], "expanded_slices": {}, "color_scheme": "", "label_colors": {}, "shared_label_colors": {}}', + "json_metadata": '{"refresh_frequency": 30, "timed_refresh_immune_slices": [], "expanded_slices": {}, "color_scheme": "", "label_colors": {}, "shared_label_colors": {}, "color_scheme_domain": [], "cross_filters_enabled": false}', "published": False, } @@ -161,16 +161,16 @@ def create_dashboards(self): db.session.commit() @pytest.fixture() - def create_created_by_admin_dashboards(self): + def create_created_by_gamma_dashboards(self): with self.create_app().app_context(): dashboards = [] - admin = self.get_user("admin") + gamma = self.get_user("gamma") for cx in range(2): dashboard = self.insert_dashboard( f"create_title{cx}", f"create_slug{cx}", - [admin.id], - created_by=admin, + [gamma.id], + created_by=gamma, ) sleep(1) dashboards.append(dashboard) @@ -225,15 +225,36 @@ def test_get_dashboard_datasets_not_found(self): response = self.get_assert_metric(uri, "get_datasets") self.assertEqual(response.status_code, 404) - @pytest.mark.usefixtures("load_world_bank_dashboard_with_slices") - def test_get_draft_dashboard_datasets(self): + @pytest.mark.usefixtures("create_dashboards") + def test_get_gamma_dashboard_datasets(self): """ - All users should have access to dashboards without roles + Check that a gamma user with data access can access dashboard/datasets """ + from superset.connectors.sqla.models import SqlaTable + + # Set correct role permissions + gamma_role = security_manager.find_role("Gamma") + fixture_dataset = db.session.query(SqlaTable).get(1) + data_access_pvm = security_manager.add_permission_view_menu( + "datasource_access", fixture_dataset.perm + ) + gamma_role.permissions.append(data_access_pvm) + db.session.commit() + self.login(username="gamma") - uri = "api/v1/dashboard/world_health/datasets" + dashboard = self.dashboards[0] + dashboard.published = True + db.session.commit() + + uri = f"api/v1/dashboard/{dashboard.id}/datasets" response = self.get_assert_metric(uri, "get_datasets") - self.assertEqual(response.status_code, 200) + assert response.status_code == 200 + + # rollback permission change + data_access_pvm = security_manager.find_permission_view_menu( + "datasource_access", fixture_dataset.perm + ) + security_manager.del_permission_role(gamma_role, data_access_pvm) @pytest.mark.usefixtures("create_dashboards") def get_dashboard_by_slug(self): @@ -275,10 +296,22 @@ def test_get_dashboard_charts(self): response = self.get_assert_metric(uri, "get_charts") self.assertEqual(response.status_code, 200) data = json.loads(response.data.decode("utf-8")) - self.assertEqual(len(data["result"]), 1) - self.assertEqual( - data["result"][0]["slice_name"], dashboard.slices[0].slice_name - ) + assert len(data["result"]) == 1 + result = data["result"][0] + assert set(result.keys()) == { + "cache_timeout", + "certification_details", + "certified_by", + "changed_on", + "description", + "description_markeddown", + "form_data", + "id", + "slice_name", + "slice_url", + } + assert result["id"] == dashboard.slices[0].id + assert result["slice_name"] == dashboard.slices[0].slice_name @pytest.mark.usefixtures("create_dashboards") def test_get_dashboard_charts_by_slug(self): @@ -307,17 +340,45 @@ def test_get_dashboard_charts_not_found(self): response = self.get_assert_metric(uri, "get_charts") self.assertEqual(response.status_code, 404) + @pytest.mark.usefixtures("load_world_bank_dashboard_with_slices") + def test_get_dashboard_datasets_not_allowed(self): + self.login(username="gamma") + uri = "api/v1/dashboard/world_health/datasets" + response = self.get_assert_metric(uri, "get_datasets") + self.assertEqual(response.status_code, 404) + @pytest.mark.usefixtures("create_dashboards") - def test_get_draft_dashboard_charts(self): + def test_get_gamma_dashboard_charts(self): """ - All users should have access to draft dashboards without roles + Check that a gamma user with data access can access dashboard/charts """ + from superset.connectors.sqla.models import SqlaTable + + # Set correct role permissions + gamma_role = security_manager.find_role("Gamma") + fixture_dataset = db.session.query(SqlaTable).get(1) + data_access_pvm = security_manager.add_permission_view_menu( + "datasource_access", fixture_dataset.perm + ) + gamma_role.permissions.append(data_access_pvm) + db.session.commit() + self.login(username="gamma") + dashboard = self.dashboards[0] + dashboard.published = True + db.session.commit() + uri = f"api/v1/dashboard/{dashboard.id}/charts" response = self.get_assert_metric(uri, "get_charts") assert response.status_code == 200 + # rollback permission change + data_access_pvm = security_manager.find_permission_view_menu( + "datasource_access", fixture_dataset.perm + ) + security_manager.del_permission_role(gamma_role, data_access_pvm) + @pytest.mark.usefixtures("create_dashboards") def test_get_dashboard_charts_empty(self): """ @@ -439,7 +500,7 @@ def test_get_dashboard_no_data_access(self): self.login(username="gamma") uri = f"api/v1/dashboard/{dashboard.id}" rv = self.client.get(uri) - assert rv.status_code == 200 + assert rv.status_code == 404 # rollback changes db.session.delete(dashboard) db.session.commit() @@ -695,23 +756,25 @@ def test_gets_not_certified_dashboards_filter(self): rv = self.get_assert_metric(uri, "get_list") self.assertEqual(rv.status_code, 200) data = json.loads(rv.data.decode("utf-8")) - self.assertEqual(data["count"], 5) + self.assertEqual(data["count"], 0) - @pytest.mark.usefixtures("create_created_by_admin_dashboards") + @pytest.mark.usefixtures("create_created_by_gamma_dashboards") def test_get_dashboards_created_by_me(self): """ Dashboard API: Test get dashboards created by current user """ query = { "columns": ["created_on_delta_humanized", "dashboard_title", "url"], - "filters": [{"col": "created_by", "opr": "created_by_me", "value": "me"}], + "filters": [ + {"col": "created_by", "opr": "dashboard_created_by_me", "value": "me"} + ], "order_column": "changed_on", "order_direction": "desc", "page": 0, "page_size": 100, } uri = f"api/v1/dashboard/?q={prison.dumps(query)}" - self.login(username="admin") + self.login(username="gamma") rv = self.client.get(uri) data = json.loads(rv.data.decode("utf-8")) assert rv.status_code == 200 @@ -801,6 +864,46 @@ def test_delete_bulk_dashboards(self): model = db.session.query(Dashboard).get(dashboard_id) self.assertEqual(model, None) + def test_delete_bulk_embedded_dashboards(self): + """ + Dashboard API: Test delete bulk embedded + """ + user = self.get_user("admin") + dashboard_count = 4 + dashboard_ids = list() + for dashboard_name_index in range(dashboard_count): + dashboard_ids.append( + self.insert_dashboard( + f"title{dashboard_name_index}", + None, + [user.id], + ).id + ) + self.login(username=user.username) + for dashboard_id in dashboard_ids: + # post succeeds and returns value + allowed_domains = ["test.example", "embedded.example"] + resp = self.post_assert_metric( + f"api/v1/dashboard/{dashboard_id}/embedded", + {"allowed_domains": allowed_domains}, + "set_embedded", + ) + self.assertEqual(resp.status_code, 200) + result = json.loads(resp.data.decode("utf-8"))["result"] + self.assertIsNotNone(result["uuid"]) + self.assertNotEqual(result["uuid"], "") + self.assertEqual(result["allowed_domains"], allowed_domains) + argument = dashboard_ids + uri = f"api/v1/dashboard/?q={prison.dumps(argument)}" + rv = self.delete_assert_metric(uri, "bulk_delete") + self.assertEqual(rv.status_code, 200) + response = json.loads(rv.data.decode("utf-8")) + expected_response = {"message": f"Deleted {dashboard_count} dashboards"} + self.assertEqual(response, expected_response) + for dashboard_id in dashboard_ids: + model = db.session.query(Dashboard).get(dashboard_id) + self.assertEqual(model, None) + def test_delete_bulk_dashboards_bad_request(self): """ Dashboard API: Test delete bulk bad request @@ -1244,6 +1347,65 @@ def test_update_dashboard_chart_owners(self): db.session.delete(user_alpha2) db.session.commit() + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") + def test_update_dashboard_chart_owners_propagation(self): + """ + Dashboard API: Test update chart owners propagation + """ + user_alpha1 = self.create_user( + "alpha1", + "password", + "Alpha", + email="alpha1@superset.org", + first_name="alpha1", + ) + admin = self.get_user("admin") + slices = [] + slices.append(db.session.query(Slice).filter_by(slice_name="Trends").one()) + slices.append(db.session.query(Slice).filter_by(slice_name="Boys").one()) + + # Insert dashboard with admin as owner + dashboard = self.insert_dashboard( + "title1", + "slug1", + [admin.id], + slices=slices, + ) + + # Updates dashboard without Boys in json_metadata positions + # and user_alpha1 as owner + dashboard_data = { + "owners": [user_alpha1.id], + "json_metadata": json.dumps( + { + "positions": { + f"{slices[0].id}": { + "type": "CHART", + "meta": {"chartId": slices[0].id}, + }, + } + } + ), + } + self.login(username="admin") + uri = f"api/v1/dashboard/{dashboard.id}" + rv = self.client.put(uri, json=dashboard_data) + self.assertEqual(rv.status_code, 200) + + # Check that chart named Boys does not contain alpha 1 in its owners + boys = db.session.query(Slice).filter_by(slice_name="Boys").one() + self.assertNotIn(user_alpha1, boys.owners) + + # Revert owners on slice + for slice in slices: + slice.owners = [] + db.session.commit() + + # Rollback changes + db.session.delete(dashboard) + db.session.delete(user_alpha1) + db.session.commit() + def test_update_partial_dashboard(self): """ Dashboard API: Test update partial @@ -1774,6 +1936,26 @@ def test_get_filter_related_roles(self): response_roles = [result["text"] for result in response["result"]] assert "Alpha" in response_roles + def test_get_all_related_roles_with_with_extra_filters(self): + """ + API: Test get filter related roles with extra related query filters + """ + self.login(username="admin") + + def _base_filter(query): + return query.filter_by(name="Alpha") + + with patch.dict( + "superset.views.filters.current_app.config", + {"EXTRA_RELATED_QUERY_FILTERS": {"role": _base_filter}}, + ): + uri = f"api/v1/dashboard/related/roles" + rv = self.client.get(uri) + assert rv.status_code == 200 + response = json.loads(rv.data.decode("utf-8")) + response_roles = [result["text"] for result in response["result"]] + assert response_roles == ["Alpha"] + @pytest.mark.usefixtures("load_world_bank_dashboard_with_slices") def test_embedded_dashboards(self): self.login(username="admin") @@ -1836,3 +2018,49 @@ def test_embedded_dashboards(self): # get returns 404 resp = self.get_assert_metric(uri, "get_embedded") self.assertEqual(resp.status_code, 404) + + @pytest.mark.usefixtures("create_created_by_gamma_dashboards") + def test_gets_created_by_user_dashboards_filter(self): + expected_models = ( + db.session.query(Dashboard) + .filter(Dashboard.created_by_fk.isnot(None)) + .all() + ) + + arguments = { + "filters": [ + {"col": "created_by", "opr": "dashboard_has_created_by", "value": True} + ], + "keys": ["none"], + "columns": ["dashboard_title"], + } + self.login(username="admin") + + uri = f"api/v1/dashboard/?q={prison.dumps(arguments)}" + rv = self.get_assert_metric(uri, "get_list") + self.assertEqual(rv.status_code, 200) + data = json.loads(rv.data.decode("utf-8")) + self.assertEqual(data["count"], len(expected_models)) + + def test_gets_not_created_by_user_dashboards_filter(self): + dashboard = self.insert_dashboard(f"title", f"slug", []) + expected_models = ( + db.session.query(Dashboard).filter(Dashboard.created_by_fk.is_(None)).all() + ) + + arguments = { + "filters": [ + {"col": "created_by", "opr": "dashboard_has_created_by", "value": False} + ], + "keys": ["none"], + "columns": ["dashboard_title"], + } + self.login(username="admin") + + uri = f"api/v1/dashboard/?q={prison.dumps(arguments)}" + rv = self.get_assert_metric(uri, "get_list") + self.assertEqual(rv.status_code, 200) + data = json.loads(rv.data.decode("utf-8")) + self.assertEqual(data["count"], len(expected_models)) + db.session.delete(dashboard) + db.session.commit() diff --git a/tests/integration_tests/dashboards/dao_tests.py b/tests/integration_tests/dashboards/dao_tests.py index e9d73764955f..672e930364f2 100644 --- a/tests/integration_tests/dashboards/dao_tests.py +++ b/tests/integration_tests/dashboards/dao_tests.py @@ -18,11 +18,11 @@ import copy import json import time - +from unittest.mock import patch import pytest import tests.integration_tests.test_app # pylint: disable=unused-import -from superset import db +from superset import db, security_manager from superset.dashboards.dao import DashboardDAO from superset.models.dashboard import Dashboard from tests.integration_tests.base_tests import SupersetTestCase @@ -88,37 +88,42 @@ def test_set_dash_metadata(self): DashboardDAO.set_dash_metadata(dash, original_data) @pytest.mark.usefixtures("load_world_bank_dashboard_with_slices") - def test_get_dashboard_changed_on(self): - self.login(username="admin") - session = db.session() - dashboard = session.query(Dashboard).filter_by(slug="world_health").first() + @patch("superset.utils.core.g") + @patch("superset.security.manager.g") + def test_get_dashboard_changed_on(self, mock_sm_g, mock_g): + mock_g.user = mock_sm_g.user = security_manager.find_user("admin") + with self.client.application.test_request_context(): + self.login(username="admin") + dashboard = ( + db.session.query(Dashboard).filter_by(slug="world_health").first() + ) - changed_on = dashboard.changed_on.replace(microsecond=0) - assert changed_on == DashboardDAO.get_dashboard_changed_on(dashboard) - assert changed_on == DashboardDAO.get_dashboard_changed_on("world_health") + changed_on = dashboard.changed_on.replace(microsecond=0) + assert changed_on == DashboardDAO.get_dashboard_changed_on(dashboard) + assert changed_on == DashboardDAO.get_dashboard_changed_on("world_health") - old_changed_on = dashboard.changed_on + old_changed_on = dashboard.changed_on - # freezegun doesn't work for some reason, so we need to sleep here :( - time.sleep(1) - data = dashboard.data - positions = data["position_json"] - data.update({"positions": positions}) - original_data = copy.deepcopy(data) + # freezegun doesn't work for some reason, so we need to sleep here :( + time.sleep(1) + data = dashboard.data + positions = data["position_json"] + data.update({"positions": positions}) + original_data = copy.deepcopy(data) - data.update({"foo": "bar"}) - DashboardDAO.set_dash_metadata(dashboard, data) - session.merge(dashboard) - session.commit() - new_changed_on = DashboardDAO.get_dashboard_changed_on(dashboard) - assert old_changed_on.replace(microsecond=0) < new_changed_on - assert new_changed_on == DashboardDAO.get_dashboard_and_datasets_changed_on( - dashboard - ) - assert new_changed_on == DashboardDAO.get_dashboard_and_slices_changed_on( - dashboard - ) + data.update({"foo": "bar"}) + DashboardDAO.set_dash_metadata(dashboard, data) + db.session.merge(dashboard) + db.session.commit() + new_changed_on = DashboardDAO.get_dashboard_changed_on(dashboard) + assert old_changed_on.replace(microsecond=0) < new_changed_on + assert new_changed_on == DashboardDAO.get_dashboard_and_datasets_changed_on( + dashboard + ) + assert new_changed_on == DashboardDAO.get_dashboard_and_slices_changed_on( + dashboard + ) - DashboardDAO.set_dash_metadata(dashboard, original_data) - session.merge(dashboard) - session.commit() + DashboardDAO.set_dash_metadata(dashboard, original_data) + db.session.merge(dashboard) + db.session.commit() diff --git a/tests/integration_tests/dashboards/filter_sets/create_api_tests.py b/tests/integration_tests/dashboards/filter_sets/create_api_tests.py index fcd2923fb869..b5d1919dd430 100644 --- a/tests/integration_tests/dashboards/filter_sets/create_api_tests.py +++ b/tests/integration_tests/dashboards/filter_sets/create_api_tests.py @@ -16,7 +16,9 @@ # under the License. from __future__ import annotations -from typing import Any, Dict, TYPE_CHECKING +from typing import Any, Dict + +from flask.testing import FlaskClient from superset.dashboards.filter_sets.consts import ( DASHBOARD_OWNER_TYPE, @@ -27,7 +29,6 @@ OWNER_TYPE_FIELD, USER_OWNER_TYPE, ) -from tests.integration_tests.base_tests import login from tests.integration_tests.dashboards.filter_sets.consts import ( ADMIN_USERNAME_FOR_TEST, DASHBOARD_OWNER_USERNAME, @@ -38,9 +39,7 @@ get_filter_set_by_dashboard_id, get_filter_set_by_name, ) - -if TYPE_CHECKING: - from flask.testing import FlaskClient +from tests.integration_tests.test_app import login def assert_filterset_was_not_created(filter_set_data: Dict[str, Any]) -> None: diff --git a/tests/integration_tests/dashboards/filter_sets/delete_api_tests.py b/tests/integration_tests/dashboards/filter_sets/delete_api_tests.py index 8e7e0bcb6004..7011cb578128 100644 --- a/tests/integration_tests/dashboards/filter_sets/delete_api_tests.py +++ b/tests/integration_tests/dashboards/filter_sets/delete_api_tests.py @@ -18,7 +18,6 @@ from typing import Any, Dict, List, TYPE_CHECKING -from tests.integration_tests.base_tests import login from tests.integration_tests.dashboards.filter_sets.consts import ( DASHBOARD_OWNER_USERNAME, FILTER_SET_OWNER_USERNAME, @@ -29,6 +28,7 @@ collect_all_ids, get_filter_set_by_name, ) +from tests.integration_tests.test_app import login if TYPE_CHECKING: from flask.testing import FlaskClient diff --git a/tests/integration_tests/dashboards/filter_sets/get_api_tests.py b/tests/integration_tests/dashboards/filter_sets/get_api_tests.py index 7be6f367dd6b..ad40d0e33c85 100644 --- a/tests/integration_tests/dashboards/filter_sets/get_api_tests.py +++ b/tests/integration_tests/dashboards/filter_sets/get_api_tests.py @@ -18,7 +18,6 @@ from typing import Any, Dict, List, Set, TYPE_CHECKING -from tests.integration_tests.base_tests import login from tests.integration_tests.dashboards.filter_sets.consts import ( DASHBOARD_OWNER_USERNAME, FILTER_SET_OWNER_USERNAME, @@ -28,6 +27,7 @@ call_get_filter_sets, collect_all_ids, ) +from tests.integration_tests.test_app import login if TYPE_CHECKING: from flask.testing import FlaskClient diff --git a/tests/integration_tests/dashboards/filter_sets/update_api_tests.py b/tests/integration_tests/dashboards/filter_sets/update_api_tests.py index 4096e100994f..07db98f61781 100644 --- a/tests/integration_tests/dashboards/filter_sets/update_api_tests.py +++ b/tests/integration_tests/dashboards/filter_sets/update_api_tests.py @@ -26,7 +26,6 @@ OWNER_TYPE_FIELD, PARAMS_PROPERTY, ) -from tests.integration_tests.base_tests import login from tests.integration_tests.dashboards.filter_sets.consts import ( DASHBOARD_OWNER_USERNAME, FILTER_SET_OWNER_USERNAME, @@ -37,6 +36,7 @@ collect_all_ids, get_filter_set_by_name, ) +from tests.integration_tests.test_app import login if TYPE_CHECKING: from flask.testing import FlaskClient diff --git a/tests/integration_tests/dashboards/filter_state/api_tests.py b/tests/integration_tests/dashboards/filter_state/api_tests.py index ea00f2e6714f..15b479686a4e 100644 --- a/tests/integration_tests/dashboards/filter_state/api_tests.py +++ b/tests/integration_tests/dashboards/filter_state/api_tests.py @@ -18,6 +18,7 @@ from unittest.mock import patch import pytest +from flask.ctx import AppContext from flask_appbuilder.security.sqla.models import User from sqlalchemy.orm import Session @@ -26,8 +27,6 @@ from superset.models.dashboard import Dashboard from superset.temporary_cache.commands.entry import Entry from superset.temporary_cache.utils import cache_key -from tests.integration_tests.base_tests import login -from tests.integration_tests.fixtures.client import client from tests.integration_tests.fixtures.world_bank_dashboard import ( load_world_bank_dashboard_with_slices, load_world_bank_data, @@ -40,19 +39,17 @@ @pytest.fixture -def dashboard_id(load_world_bank_dashboard_with_slices) -> int: - with app.app_context() as ctx: - session: Session = ctx.app.appbuilder.get_session - dashboard = session.query(Dashboard).filter_by(slug="world_health").one() - return dashboard.id +def dashboard_id(app_context: AppContext, load_world_bank_dashboard_with_slices) -> int: + session: Session = app_context.app.appbuilder.get_session + dashboard = session.query(Dashboard).filter_by(slug="world_health").one() + return dashboard.id @pytest.fixture -def admin_id() -> int: - with app.app_context() as ctx: - session: Session = ctx.app.appbuilder.get_session - admin = session.query(User).filter_by(username="admin").one_or_none() - return admin.id +def admin_id(app_context: AppContext) -> int: + session: Session = app_context.app.appbuilder.get_session + admin = session.query(User).filter_by(username="admin").one_or_none() + return admin.id @pytest.fixture(autouse=True) @@ -61,55 +58,59 @@ def cache(dashboard_id, admin_id): cache_manager.filter_state_cache.set(cache_key(dashboard_id, KEY), entry) -def test_post(client, dashboard_id: int): - login(client, "admin") - payload = { - "value": INITIAL_VALUE, - } - resp = client.post(f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload) +def test_post(test_client, login_as_admin, dashboard_id: int): + resp = test_client.post( + f"api/v1/dashboard/{dashboard_id}/filter_state", + json={ + "value": INITIAL_VALUE, + }, + ) assert resp.status_code == 201 -def test_post_bad_request_non_string(client, dashboard_id: int): - login(client, "admin") - payload = { - "value": 1234, - } - resp = client.post(f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload) +def test_post_bad_request_non_string(test_client, login_as_admin, dashboard_id: int): + resp = test_client.post( + f"api/v1/dashboard/{dashboard_id}/filter_state", + json={ + "value": 1234, + }, + ) assert resp.status_code == 400 -def test_post_bad_request_non_json_string(client, dashboard_id: int): - login(client, "admin") +def test_post_bad_request_non_json_string( + test_client, login_as_admin, dashboard_id: int +): payload = { "value": "foo", } - resp = client.post(f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload) + resp = test_client.post( + f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload + ) assert resp.status_code == 400 -@patch("superset.security.SupersetSecurityManager.raise_for_dashboard_access") -def test_post_access_denied(mock_raise_for_dashboard_access, client, dashboard_id: int): - login(client, "admin") - mock_raise_for_dashboard_access.side_effect = DashboardAccessDeniedError() +def test_post_access_denied(test_client, login_as, dashboard_id: int): + login_as("gamma") payload = { "value": INITIAL_VALUE, } - resp = client.post(f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload) - assert resp.status_code == 403 + resp = test_client.post( + f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload + ) + assert resp.status_code == 404 -def test_post_same_key_for_same_tab_id(client, dashboard_id: int): - login(client, "admin") +def test_post_same_key_for_same_tab_id(test_client, login_as_admin, dashboard_id: int): payload = { "value": INITIAL_VALUE, } - resp = client.post( + resp = test_client.post( f"api/v1/dashboard/{dashboard_id}/filter_state?tab_id=1", json=payload ) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.post( + resp = test_client.post( f"api/v1/dashboard/{dashboard_id}/filter_state?tab_id=1", json=payload ) data = json.loads(resp.data.decode("utf-8")) @@ -117,17 +118,18 @@ def test_post_same_key_for_same_tab_id(client, dashboard_id: int): assert first_key == second_key -def test_post_different_key_for_different_tab_id(client, dashboard_id: int): - login(client, "admin") +def test_post_different_key_for_different_tab_id( + test_client, login_as_admin, dashboard_id: int +): payload = { "value": INITIAL_VALUE, } - resp = client.post( + resp = test_client.post( f"api/v1/dashboard/{dashboard_id}/filter_state?tab_id=1", json=payload ) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.post( + resp = test_client.post( f"api/v1/dashboard/{dashboard_id}/filter_state?tab_id=2", json=payload ) data = json.loads(resp.data.decode("utf-8")) @@ -135,42 +137,45 @@ def test_post_different_key_for_different_tab_id(client, dashboard_id: int): assert first_key != second_key -def test_post_different_key_for_no_tab_id(client, dashboard_id: int): - login(client, "admin") +def test_post_different_key_for_no_tab_id( + test_client, login_as_admin, dashboard_id: int +): payload = { "value": INITIAL_VALUE, } - resp = client.post(f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload) + resp = test_client.post( + f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload + ) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.post(f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload) + resp = test_client.post( + f"api/v1/dashboard/{dashboard_id}/filter_state", json=payload + ) data = json.loads(resp.data.decode("utf-8")) second_key = data.get("key") assert first_key != second_key -def test_put(client, dashboard_id: int): - login(client, "admin") - payload = { - "value": UPDATED_VALUE, - } - resp = client.put( - f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload +def test_put(test_client, login_as_admin, dashboard_id: int): + resp = test_client.put( + f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", + json={ + "value": UPDATED_VALUE, + }, ) assert resp.status_code == 200 -def test_put_same_key_for_same_tab_id(client, dashboard_id: int): - login(client, "admin") +def test_put_same_key_for_same_tab_id(test_client, login_as_admin, dashboard_id: int): payload = { "value": INITIAL_VALUE, } - resp = client.put( + resp = test_client.put( f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}?tab_id=1", json=payload ) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.put( + resp = test_client.put( f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}?tab_id=1", json=payload ) data = json.loads(resp.data.decode("utf-8")) @@ -178,17 +183,18 @@ def test_put_same_key_for_same_tab_id(client, dashboard_id: int): assert first_key == second_key -def test_put_different_key_for_different_tab_id(client, dashboard_id: int): - login(client, "admin") +def test_put_different_key_for_different_tab_id( + test_client, login_as_admin, dashboard_id: int +): payload = { "value": INITIAL_VALUE, } - resp = client.put( + resp = test_client.put( f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}?tab_id=1", json=payload ) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.put( + resp = test_client.put( f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}?tab_id=2", json=payload ) data = json.loads(resp.data.decode("utf-8")) @@ -196,17 +202,18 @@ def test_put_different_key_for_different_tab_id(client, dashboard_id: int): assert first_key != second_key -def test_put_different_key_for_no_tab_id(client, dashboard_id: int): - login(client, "admin") +def test_put_different_key_for_no_tab_id( + test_client, login_as_admin, dashboard_id: int +): payload = { "value": INITIAL_VALUE, } - resp = client.put( + resp = test_client.put( f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload ) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.put( + resp = test_client.put( f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload ) data = json.loads(resp.data.decode("utf-8")) @@ -214,97 +221,74 @@ def test_put_different_key_for_no_tab_id(client, dashboard_id: int): assert first_key != second_key -def test_put_bad_request_non_string(client, dashboard_id: int): - login(client, "admin") - payload = { - "value": 1234, - } - resp = client.put( - f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload +def test_put_bad_request_non_string(test_client, login_as_admin, dashboard_id: int): + resp = test_client.put( + f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", + json={ + "value": 1234, + }, ) assert resp.status_code == 400 -def test_put_bad_request_non_json_string(client, dashboard_id: int): - login(client, "admin") - payload = { - "value": "foo", - } - resp = client.put( - f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload +def test_put_bad_request_non_json_string( + test_client, login_as_admin, dashboard_id: int +): + resp = test_client.put( + f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", + json={ + "value": "foo", + }, ) assert resp.status_code == 400 -@patch("superset.security.SupersetSecurityManager.raise_for_dashboard_access") -def test_put_access_denied(mock_raise_for_dashboard_access, client, dashboard_id: int): - login(client, "admin") - mock_raise_for_dashboard_access.side_effect = DashboardAccessDeniedError() - payload = { - "value": UPDATED_VALUE, - } - resp = client.put( - f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload +def test_put_access_denied(test_client, login_as, dashboard_id: int): + login_as("gamma") + resp = test_client.put( + f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", + json={ + "value": UPDATED_VALUE, + }, ) - assert resp.status_code == 403 - - -def test_put_not_owner(client, dashboard_id: int): - login(client, "gamma") - payload = { - "value": UPDATED_VALUE, - } - resp = client.put( - f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}", json=payload - ) - assert resp.status_code == 403 + assert resp.status_code == 404 -def test_get_key_not_found(client, dashboard_id: int): - login(client, "admin") - resp = client.get(f"api/v1/dashboard/{dashboard_id}/filter_state/unknown-key/") +def test_get_key_not_found(test_client, login_as_admin, dashboard_id: int): + resp = test_client.get(f"api/v1/dashboard/{dashboard_id}/filter_state/unknown-key/") assert resp.status_code == 404 -def test_get_dashboard_not_found(client): - login(client, "admin") - resp = client.get(f"api/v1/dashboard/{-1}/filter_state/{KEY}") +def test_get_dashboard_not_found(test_client, login_as_admin): + resp = test_client.get(f"api/v1/dashboard/{-1}/filter_state/{KEY}") assert resp.status_code == 404 -def test_get(client, dashboard_id: int): - login(client, "admin") - resp = client.get(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}") +def test_get_dashboard_filter_state(test_client, login_as_admin, dashboard_id: int): + resp = test_client.get(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}") assert resp.status_code == 200 data = json.loads(resp.data.decode("utf-8")) assert INITIAL_VALUE == data.get("value") -@patch("superset.security.SupersetSecurityManager.raise_for_dashboard_access") -def test_get_access_denied(mock_raise_for_dashboard_access, client, dashboard_id): - login(client, "admin") - mock_raise_for_dashboard_access.side_effect = DashboardAccessDeniedError() - resp = client.get(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}") - assert resp.status_code == 403 +def test_get_access_denied(test_client, login_as, dashboard_id): + login_as("gamma") + resp = test_client.get(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}") + assert resp.status_code == 404 -def test_delete(client, dashboard_id: int): - login(client, "admin") - resp = client.delete(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}") +def test_delete(test_client, login_as_admin, dashboard_id: int): + resp = test_client.delete(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}") assert resp.status_code == 200 -@patch("superset.security.SupersetSecurityManager.raise_for_dashboard_access") -def test_delete_access_denied( - mock_raise_for_dashboard_access, client, dashboard_id: int -): - login(client, "admin") - mock_raise_for_dashboard_access.side_effect = DashboardAccessDeniedError() - resp = client.delete(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}") - assert resp.status_code == 403 +def test_delete_access_denied(test_client, login_as, dashboard_id: int): + login_as("gamma") + resp = test_client.delete(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}") + assert resp.status_code == 404 -def test_delete_not_owner(client, dashboard_id: int): - login(client, "gamma") - resp = client.delete(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}") - assert resp.status_code == 403 +def test_delete_not_owner(test_client, login_as, dashboard_id: int): + login_as("gamma") + resp = test_client.delete(f"api/v1/dashboard/{dashboard_id}/filter_state/{KEY}") + assert resp.status_code == 404 diff --git a/tests/integration_tests/dashboards/permalink/api_tests.py b/tests/integration_tests/dashboards/permalink/api_tests.py index 33186131d559..40a312ef855a 100644 --- a/tests/integration_tests/dashboards/permalink/api_tests.py +++ b/tests/integration_tests/dashboards/permalink/api_tests.py @@ -29,8 +29,6 @@ from superset.key_value.types import KeyValueResource from superset.key_value.utils import decode_permalink_id from superset.models.dashboard import Dashboard -from tests.integration_tests.base_tests import login -from tests.integration_tests.fixtures.client import client from tests.integration_tests.fixtures.world_bank_dashboard import ( load_world_bank_dashboard_with_slices, load_world_bank_data, @@ -38,8 +36,8 @@ from tests.integration_tests.test_app import app STATE = { - "filterState": {"FILTER_1": "foo"}, - "hash": "my-anchor", + "dataMask": {"FILTER_1": "foo"}, + "activeTabs": ["my-anchor"], } @@ -67,43 +65,48 @@ def permalink_salt() -> Iterator[str]: db.session.commit() -def test_post(client, dashboard_id: int, permalink_salt: str) -> None: - login(client, "admin") - resp = client.post(f"api/v1/dashboard/{dashboard_id}/permalink", json=STATE) +def test_post( + test_client, login_as_admin, dashboard_id: int, permalink_salt: str +) -> None: + resp = test_client.post(f"api/v1/dashboard/{dashboard_id}/permalink", json=STATE) assert resp.status_code == 201 - data = json.loads(resp.data.decode("utf-8")) + data = resp.json key = data["key"] url = data["url"] assert key in url id_ = decode_permalink_id(key, permalink_salt) + + assert ( + data + == test_client.post( + f"api/v1/dashboard/{dashboard_id}/permalink", json=STATE + ).json + ), "Should always return the same permalink key for the same payload" + db.session.query(KeyValueEntry).filter_by(id=id_).delete() db.session.commit() -@patch("superset.security.SupersetSecurityManager.raise_for_dashboard_access") -def test_post_access_denied(mock_raise_for_dashboard_access, client, dashboard_id: int): - login(client, "admin") - mock_raise_for_dashboard_access.side_effect = DashboardAccessDeniedError() - resp = client.post(f"api/v1/dashboard/{dashboard_id}/permalink", json=STATE) - assert resp.status_code == 403 +def test_post_access_denied(test_client, login_as, dashboard_id: int): + login_as("gamma") + resp = test_client.post(f"api/v1/dashboard/{dashboard_id}/permalink", json=STATE) + assert resp.status_code == 404 -def test_post_invalid_schema(client, dashboard_id: int): - login(client, "admin") - resp = client.post( +def test_post_invalid_schema(test_client, login_as_admin, dashboard_id: int): + resp = test_client.post( f"api/v1/dashboard/{dashboard_id}/permalink", json={"foo": "bar"} ) assert resp.status_code == 400 -def test_get(client, dashboard_id: int, permalink_salt: str): - login(client, "admin") - resp = client.post(f"api/v1/dashboard/{dashboard_id}/permalink", json=STATE) - data = json.loads(resp.data.decode("utf-8")) - key = data["key"] - resp = client.get(f"api/v1/dashboard/permalink/{key}") +def test_get(test_client, login_as_admin, dashboard_id: int, permalink_salt: str): + key = test_client.post( + f"api/v1/dashboard/{dashboard_id}/permalink", json=STATE + ).json["key"] + resp = test_client.get(f"api/v1/dashboard/permalink/{key}") assert resp.status_code == 200 - result = json.loads(resp.data.decode("utf-8")) + result = resp.json assert result["dashboardId"] == str(dashboard_id) assert result["state"] == STATE id_ = decode_permalink_id(key, permalink_salt) diff --git a/tests/integration_tests/dashboards/security/security_dataset_tests.py b/tests/integration_tests/dashboards/security/security_dataset_tests.py index 34a5fedad0bf..2eafc4b53e0c 100644 --- a/tests/integration_tests/dashboards/security/security_dataset_tests.py +++ b/tests/integration_tests/dashboards/security/security_dataset_tests.py @@ -137,8 +137,8 @@ def test_get_dashboards__users_can_view_favorites_dashboards(self): regular_dash.dashboard_title = "A Plain Ol Dashboard" regular_dash.slug = regular_dash_slug - db.session.merge(favorite_dash) - db.session.merge(regular_dash) + db.session.add(favorite_dash) + db.session.add(regular_dash) db.session.commit() dash = db.session.query(Dashboard).filter_by(slug=fav_dash_slug).first() @@ -148,7 +148,7 @@ def test_get_dashboards__users_can_view_favorites_dashboards(self): favorites.class_name = "Dashboard" favorites.user_id = user.id - db.session.merge(favorites) + db.session.add(favorites) db.session.commit() self.login(user.username) @@ -156,6 +156,12 @@ def test_get_dashboards__users_can_view_favorites_dashboards(self): # act get_dashboards_response = self.get_resp(DASHBOARDS_API_URL) + # cleanup + db.session.delete(favorites) + db.session.delete(favorite_dash) + db.session.delete(regular_dash) + db.session.commit() + # assert self.assertIn(f"/superset/dashboard/{fav_dash_slug}/", get_dashboards_response) diff --git a/tests/integration_tests/databases/api_tests.py b/tests/integration_tests/databases/api_tests.py index 791705ee1e0b..c9d3855e5608 100644 --- a/tests/integration_tests/databases/api_tests.py +++ b/tests/integration_tests/databases/api_tests.py @@ -35,6 +35,8 @@ from superset import db, security_manager from superset.connectors.sqla.models import SqlaTable +from superset.databases.ssh_tunnel.models import SSHTunnel +from superset.databases.utils import make_url_safe from superset.db_engine_specs.mysql import MySQLEngineSpec from superset.db_engine_specs.postgres import PostgresEngineSpec from superset.db_engine_specs.redshift import RedshiftEngineSpec @@ -43,7 +45,7 @@ from superset.db_engine_specs.hana import HanaEngineSpec from superset.errors import SupersetError from superset.models.core import Database, ConfigurationMethod -from superset.models.reports import ReportSchedule, ReportScheduleType +from superset.reports.models import ReportSchedule, ReportScheduleType from superset.utils.database import get_example_database, get_main_database from tests.integration_tests.base_tests import SupersetTestCase from tests.integration_tests.fixtures.birth_names_dashboard import ( @@ -185,7 +187,6 @@ def test_get_items(self): "allow_cvas", "allow_dml", "allow_file_upload", - "allow_multi_schema_metadata_fetch", "allow_run_async", "allows_cost_estimate", "allows_preview_data", @@ -197,11 +198,13 @@ def test_get_items(self): "created_by", "database_name", "disable_data_preview", + "engine_information", "explore_database_id", "expose_in_sqllab", "extra", "force_ctas_schema", "id", + "uuid", ] self.assertGreater(response["count"], 0) @@ -280,6 +283,405 @@ def test_create_database(self): db.session.delete(model) db.session.commit() + @mock.patch( + "superset.databases.commands.test_connection.TestConnectionDatabaseCommand.run", + ) + @mock.patch("superset.databases.commands.create.is_feature_enabled") + @mock.patch( + "superset.models.core.Database.get_all_schema_names", + ) + def test_create_database_with_ssh_tunnel( + self, + mock_test_connection_database_command_run, + mock_create_is_feature_enabled, + mock_get_all_schema_names, + ): + """ + Database API: Test create with SSH Tunnel + """ + mock_create_is_feature_enabled.return_value = True + self.login(username="admin") + example_db = get_example_database() + if example_db.backend == "sqlite": + return + ssh_tunnel_properties = { + "server_address": "123.132.123.1", + "server_port": 8080, + "username": "foo", + "password": "bar", + } + database_data = { + "database_name": "test-db-with-ssh-tunnel", + "sqlalchemy_uri": example_db.sqlalchemy_uri_decrypted, + "ssh_tunnel": ssh_tunnel_properties, + } + uri = "api/v1/database/" + rv = self.client.post(uri, json=database_data) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(rv.status_code, 201) + model_ssh_tunnel = ( + db.session.query(SSHTunnel) + .filter(SSHTunnel.database_id == response.get("id")) + .one() + ) + self.assertEqual(response.get("result")["ssh_tunnel"]["password"], "XXXXXXXXXX") + self.assertEqual(model_ssh_tunnel.database_id, response.get("id")) + # Cleanup + model = db.session.query(Database).get(response.get("id")) + db.session.delete(model) + db.session.commit() + + @mock.patch( + "superset.databases.commands.test_connection.TestConnectionDatabaseCommand.run", + ) + @mock.patch("superset.databases.commands.create.is_feature_enabled") + @mock.patch("superset.databases.commands.update.is_feature_enabled") + @mock.patch( + "superset.models.core.Database.get_all_schema_names", + ) + def test_update_database_with_ssh_tunnel( + self, + mock_test_connection_database_command_run, + mock_create_is_feature_enabled, + mock_update_is_feature_enabled, + mock_get_all_schema_names, + ): + """ + Database API: Test update Database with SSH Tunnel + """ + mock_create_is_feature_enabled.return_value = True + mock_update_is_feature_enabled.return_value = True + self.login(username="admin") + example_db = get_example_database() + if example_db.backend == "sqlite": + return + ssh_tunnel_properties = { + "server_address": "123.132.123.1", + "server_port": 8080, + "username": "foo", + "password": "bar", + } + database_data = { + "database_name": "test-db-with-ssh-tunnel", + "sqlalchemy_uri": example_db.sqlalchemy_uri_decrypted, + } + database_data_with_ssh_tunnel = { + "database_name": "test-db-with-ssh-tunnel", + "sqlalchemy_uri": example_db.sqlalchemy_uri_decrypted, + "ssh_tunnel": ssh_tunnel_properties, + } + + uri = "api/v1/database/" + rv = self.client.post(uri, json=database_data) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(rv.status_code, 201) + + uri = "api/v1/database/{}".format(response.get("id")) + rv = self.client.put(uri, json=database_data_with_ssh_tunnel) + response_update = json.loads(rv.data.decode("utf-8")) + self.assertEqual(rv.status_code, 200) + + model_ssh_tunnel = ( + db.session.query(SSHTunnel) + .filter(SSHTunnel.database_id == response_update.get("id")) + .one() + ) + self.assertEqual(model_ssh_tunnel.database_id, response_update.get("id")) + # Cleanup + model = db.session.query(Database).get(response.get("id")) + db.session.delete(model) + db.session.commit() + + @mock.patch( + "superset.databases.commands.test_connection.TestConnectionDatabaseCommand.run", + ) + @mock.patch("superset.databases.commands.create.is_feature_enabled") + @mock.patch("superset.databases.commands.update.is_feature_enabled") + @mock.patch( + "superset.models.core.Database.get_all_schema_names", + ) + def test_update_ssh_tunnel_via_database_api( + self, + mock_test_connection_database_command_run, + mock_create_is_feature_enabled, + mock_update_is_feature_enabled, + mock_get_all_schema_names, + ): + """ + Database API: Test update SSH Tunnel via Database API + """ + mock_create_is_feature_enabled.return_value = True + mock_update_is_feature_enabled.return_value = True + self.login(username="admin") + example_db = get_example_database() + + if example_db.backend == "sqlite": + return + initial_ssh_tunnel_properties = { + "server_address": "123.132.123.1", + "server_port": 8080, + "username": "foo", + "password": "bar", + } + updated_ssh_tunnel_properties = { + "server_address": "123.132.123.1", + "server_port": 8080, + "username": "Test", + "password": "new_bar", + } + database_data_with_ssh_tunnel = { + "database_name": "test-db-with-ssh-tunnel", + "sqlalchemy_uri": example_db.sqlalchemy_uri_decrypted, + "ssh_tunnel": initial_ssh_tunnel_properties, + } + database_data_with_ssh_tunnel_update = { + "database_name": "test-db-with-ssh-tunnel", + "sqlalchemy_uri": example_db.sqlalchemy_uri_decrypted, + "ssh_tunnel": updated_ssh_tunnel_properties, + } + + uri = "api/v1/database/" + rv = self.client.post(uri, json=database_data_with_ssh_tunnel) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(rv.status_code, 201) + model_ssh_tunnel = ( + db.session.query(SSHTunnel) + .filter(SSHTunnel.database_id == response.get("id")) + .one() + ) + self.assertEqual(model_ssh_tunnel.database_id, response.get("id")) + self.assertEqual(model_ssh_tunnel.username, "foo") + uri = "api/v1/database/{}".format(response.get("id")) + rv = self.client.put(uri, json=database_data_with_ssh_tunnel_update) + response_update = json.loads(rv.data.decode("utf-8")) + self.assertEqual(rv.status_code, 200) + model_ssh_tunnel = ( + db.session.query(SSHTunnel) + .filter(SSHTunnel.database_id == response_update.get("id")) + .one() + ) + self.assertEqual(model_ssh_tunnel.database_id, response_update.get("id")) + self.assertEqual( + response_update.get("result")["ssh_tunnel"]["password"], "XXXXXXXXXX" + ) + self.assertEqual(model_ssh_tunnel.username, "Test") + self.assertEqual(model_ssh_tunnel.server_address, "123.132.123.1") + self.assertEqual(model_ssh_tunnel.server_port, 8080) + # Cleanup + model = db.session.query(Database).get(response.get("id")) + db.session.delete(model) + db.session.commit() + + @mock.patch( + "superset.databases.commands.test_connection.TestConnectionDatabaseCommand.run", + ) + @mock.patch( + "superset.models.core.Database.get_all_schema_names", + ) + @mock.patch("superset.databases.commands.create.is_feature_enabled") + def test_cascade_delete_ssh_tunnel( + self, + mock_test_connection_database_command_run, + mock_get_all_schema_names, + mock_create_is_feature_enabled, + ): + """ + Database API: SSH Tunnel gets deleted if Database gets deleted + """ + mock_create_is_feature_enabled.return_value = True + self.login(username="admin") + example_db = get_example_database() + if example_db.backend == "sqlite": + return + ssh_tunnel_properties = { + "server_address": "123.132.123.1", + "server_port": 8080, + "username": "foo", + "password": "bar", + } + database_data = { + "database_name": "test-db-with-ssh-tunnel", + "sqlalchemy_uri": example_db.sqlalchemy_uri_decrypted, + "ssh_tunnel": ssh_tunnel_properties, + } + + uri = "api/v1/database/" + rv = self.client.post(uri, json=database_data) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(rv.status_code, 201) + model_ssh_tunnel = ( + db.session.query(SSHTunnel) + .filter(SSHTunnel.database_id == response.get("id")) + .one() + ) + self.assertEqual(model_ssh_tunnel.database_id, response.get("id")) + # Cleanup + model = db.session.query(Database).get(response.get("id")) + db.session.delete(model) + db.session.commit() + model_ssh_tunnel = ( + db.session.query(SSHTunnel) + .filter(SSHTunnel.database_id == response.get("id")) + .one_or_none() + ) + assert model_ssh_tunnel is None + + @mock.patch( + "superset.databases.commands.test_connection.TestConnectionDatabaseCommand.run", + ) + @mock.patch("superset.databases.commands.create.is_feature_enabled") + @mock.patch( + "superset.models.core.Database.get_all_schema_names", + ) + def test_do_not_create_database_if_ssh_tunnel_creation_fails( + self, + mock_test_connection_database_command_run, + mock_create_is_feature_enabled, + mock_get_all_schema_names, + ): + """ + Database API: Test Database is not created if SSH Tunnel creation fails + """ + mock_create_is_feature_enabled.return_value = True + self.login(username="admin") + example_db = get_example_database() + if example_db.backend == "sqlite": + return + ssh_tunnel_properties = { + "server_address": "123.132.123.1", + } + database_data = { + "database_name": "test-db-failure-ssh-tunnel", + "sqlalchemy_uri": example_db.sqlalchemy_uri_decrypted, + "ssh_tunnel": ssh_tunnel_properties, + } + fail_message = {"message": "SSH Tunnel parameters are invalid."} + + uri = "api/v1/database/" + rv = self.client.post(uri, json=database_data) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(rv.status_code, 422) + model_ssh_tunnel = ( + db.session.query(SSHTunnel) + .filter(SSHTunnel.database_id == response.get("id")) + .one_or_none() + ) + assert model_ssh_tunnel is None + self.assertEqual(response, fail_message) + # Cleanup + model = ( + db.session.query(Database) + .filter(Database.database_name == "test-db-failure-ssh-tunnel") + .one_or_none() + ) + # the DB should not be created + assert model is None + + @mock.patch( + "superset.databases.commands.test_connection.TestConnectionDatabaseCommand.run", + ) + @mock.patch("superset.databases.commands.create.is_feature_enabled") + @mock.patch( + "superset.models.core.Database.get_all_schema_names", + ) + def test_get_database_returns_related_ssh_tunnel( + self, + mock_test_connection_database_command_run, + mock_create_is_feature_enabled, + mock_get_all_schema_names, + ): + """ + Database API: Test GET Database returns its related SSH Tunnel + """ + mock_create_is_feature_enabled.return_value = True + self.login(username="admin") + example_db = get_example_database() + if example_db.backend == "sqlite": + return + ssh_tunnel_properties = { + "server_address": "123.132.123.1", + "server_port": 8080, + "username": "foo", + "password": "bar", + } + database_data = { + "database_name": "test-db-with-ssh-tunnel", + "sqlalchemy_uri": example_db.sqlalchemy_uri_decrypted, + "ssh_tunnel": ssh_tunnel_properties, + } + response_ssh_tunnel = { + "server_address": "123.132.123.1", + "server_port": 8080, + "username": "foo", + "password": "XXXXXXXXXX", + } + + uri = "api/v1/database/" + rv = self.client.post(uri, json=database_data) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(rv.status_code, 201) + model_ssh_tunnel = ( + db.session.query(SSHTunnel) + .filter(SSHTunnel.database_id == response.get("id")) + .one() + ) + self.assertEqual(model_ssh_tunnel.database_id, response.get("id")) + self.assertEqual(response.get("result")["ssh_tunnel"], response_ssh_tunnel) + # Cleanup + model = db.session.query(Database).get(response.get("id")) + db.session.delete(model) + db.session.commit() + + @mock.patch( + "superset.databases.commands.test_connection.TestConnectionDatabaseCommand.run", + ) + @mock.patch( + "superset.models.core.Database.get_all_schema_names", + ) + def test_if_ssh_tunneling_flag_is_not_active_it_raises_new_exception( + self, + mock_test_connection_database_command_run, + mock_get_all_schema_names, + ): + """ + Database API: Test raises SSHTunneling feature flag not enabled + """ + self.login(username="admin") + example_db = get_example_database() + if example_db.backend == "sqlite": + return + ssh_tunnel_properties = { + "server_address": "123.132.123.1", + "server_port": 8080, + "username": "foo", + "password": "bar", + } + database_data = { + "database_name": "test-db-with-ssh-tunnel-7", + "sqlalchemy_uri": example_db.sqlalchemy_uri_decrypted, + "ssh_tunnel": ssh_tunnel_properties, + } + + uri = "api/v1/database/" + rv = self.client.post(uri, json=database_data) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(rv.status_code, 400) + self.assertEqual(response, {"message": "SSH Tunneling is not enabled"}) + model_ssh_tunnel = ( + db.session.query(SSHTunnel) + .filter(SSHTunnel.database_id == response.get("id")) + .one_or_none() + ) + assert model_ssh_tunnel is None + # Cleanup + model = ( + db.session.query(Database) + .filter(Database.database_name == "test-db-with-ssh-tunnel-7") + .one_or_none() + ) + # the DB should not be created + assert model is None + def test_create_database_invalid_configuration_method(self): """ Database API: Test create with an invalid configuration method. @@ -375,7 +777,7 @@ def test_create_database_json_validate(self): "database_name": "test-create-database-invalid-json", "sqlalchemy_uri": example_db.sqlalchemy_uri_decrypted, "configuration_method": ConfigurationMethod.SQLALCHEMY_FORM, - "encrypted_extra": '{"A": "a", "B", "C"}', + "masked_encrypted_extra": '{"A": "a", "B", "C"}', "extra": '["A": "a", "B", "C"]', } @@ -384,7 +786,7 @@ def test_create_database_json_validate(self): response = json.loads(rv.data.decode("utf-8")) expected_response = { "message": { - "encrypted_extra": [ + "masked_encrypted_extra": [ "Field cannot be decoded by JSON. Expecting ':' " "delimiter: line 1 column 15 (char 14)" ], @@ -526,11 +928,55 @@ def test_create_database_conn_fail(self): self.login(username="admin") response = self.client.post(uri, json=database_data) response_data = json.loads(response.data.decode("utf-8")) - expected_response = { - "message": "Connection failed, please check your connection settings" + superset_error_mysql = SupersetError( + message='Either the username "superset" or the password is incorrect.', + error_type="CONNECTION_ACCESS_DENIED_ERROR", + level="error", + extra={ + "engine_name": "MySQL", + "invalid": ["username", "password"], + "issue_codes": [ + { + "code": 1014, + "message": ( + "Issue 1014 - Either the username or the password is wrong." + ), + }, + { + "code": 1015, + "message": ( + "Issue 1015 - Issue 1015 - Either the database is spelled incorrectly or does not exist." + ), + }, + ], + }, + ) + superset_error_postgres = SupersetError( + message='The password provided for username "superset" is incorrect.', + error_type="CONNECTION_INVALID_PASSWORD_ERROR", + level="error", + extra={ + "engine_name": "PostgreSQL", + "invalid": ["username", "password"], + "issue_codes": [ + { + "code": 1013, + "message": ( + "Issue 1013 - The password provided when connecting to a database is not valid." + ), + } + ], + }, + ) + expected_response_mysql = {"errors": [dataclasses.asdict(superset_error_mysql)]} + expected_response_postgres = { + "errors": [dataclasses.asdict(superset_error_postgres)] } - self.assertEqual(response.status_code, 422) - self.assertEqual(response_data, expected_response) + self.assertEqual(response.status_code, 500) + if example_db.backend == "mysql": + self.assertEqual(response_data, expected_response_mysql) + else: + self.assertEqual(response_data, expected_response_postgres) def test_update_database(self): """ @@ -1337,6 +1783,66 @@ def test_database_schemas_invalid_query(self): ) self.assertEqual(rv.status_code, 400) + def test_database_tables(self): + """ + Database API: Test database tables + """ + self.login(username="admin") + database = db.session.query(Database).filter_by(database_name="examples").one() + + schema_name = self.default_schema_backend_map[database.backend] + rv = self.client.get( + f"api/v1/database/{database.id}/tables/?q={prison.dumps({'schema_name': schema_name})}" + ) + + self.assertEqual(rv.status_code, 200) + if database.backend == "postgresql": + response = json.loads(rv.data.decode("utf-8")) + schemas = [ + s[0] for s in database.get_all_table_names_in_schema(schema_name) + ] + self.assertEquals(response["count"], len(schemas)) + for option in response["result"]: + self.assertEquals(option["extra"], None) + self.assertEquals(option["type"], "table") + self.assertTrue(option["value"] in schemas) + + def test_database_tables_not_found(self): + """ + Database API: Test database tables not found + """ + self.logout() + self.login(username="gamma") + example_db = get_example_database() + uri = f"api/v1/database/{example_db.id}/tables/?q={prison.dumps({'schema_name': 'non_existent'})}" + rv = self.client.get(uri) + self.assertEqual(rv.status_code, 404) + + def test_database_tables_invalid_query(self): + """ + Database API: Test database tables with invalid query + """ + self.login("admin") + database = db.session.query(Database).first() + rv = self.client.get( + f"api/v1/database/{database.id}/tables/?q={prison.dumps({'force': 'nop'})}" + ) + self.assertEqual(rv.status_code, 400) + + @mock.patch("superset.security.manager.SupersetSecurityManager.can_access_database") + def test_database_tables_unexpected_error(self, mock_can_access_database): + """ + Database API: Test database tables with unexpected error + """ + self.login(username="admin") + database = db.session.query(Database).filter_by(database_name="examples").one() + mock_can_access_database.side_effect = Exception("Test Error") + + rv = self.client.get( + f"api/v1/database/{database.id}/tables/?q={prison.dumps({'schema_name': 'main'})}" + ) + self.assertEqual(rv.status_code, 422) + def test_test_connection(self): """ Database API: Test test connection @@ -1354,13 +1860,13 @@ def test_test_connection(self): # validate that the endpoint works with the password-masked sqlalchemy uri data = { "database_name": "examples", - "encrypted_extra": "{}", + "masked_encrypted_extra": "{}", "extra": json.dumps(extra), "impersonate_user": False, "sqlalchemy_uri": example_db.safe_sqlalchemy_uri(), "server_cert": None, } - url = "api/v1/database/test_connection" + url = "api/v1/database/test_connection/" rv = self.post_assert_metric(url, data, "test_connection") self.assertEqual(rv.status_code, 200) self.assertEqual(rv.headers["Content-Type"], "application/json; charset=utf-8") @@ -1389,7 +1895,7 @@ def test_test_connection_failed(self): "impersonate_user": False, "server_cert": None, } - url = "api/v1/database/test_connection" + url = "api/v1/database/test_connection/" rv = self.post_assert_metric(url, data, "test_connection") self.assertEqual(rv.status_code, 422) self.assertEqual(rv.headers["Content-Type"], "application/json; charset=utf-8") @@ -1426,7 +1932,7 @@ def test_test_connection_failed(self): expected_response = { "errors": [ { - "message": "Could not load database driver: AzureSynapseSpec", + "message": "Could not load database driver: MssqlEngineSpec", "error_type": "GENERIC_COMMAND_ERROR", "level": "warning", "extra": { @@ -1455,7 +1961,7 @@ def test_test_connection_unsafe_uri(self): "impersonate_user": False, "server_cert": None, } - url = "api/v1/database/test_connection" + url = "api/v1/database/test_connection/" rv = self.post_assert_metric(url, data, "test_connection") self.assertEqual(rv.status_code, 400) response = json.loads(rv.data.decode("utf-8")) @@ -1514,10 +2020,10 @@ def test_test_connection_failed_invalid_hostname( "impersonate_user": False, "server_cert": None, } - url = "api/v1/database/test_connection" + url = "api/v1/database/test_connection/" rv = self.post_assert_metric(url, data, "test_connection") - assert rv.status_code == 422 + assert rv.status_code == 500 assert rv.headers["Content-Type"] == "application/json; charset=utf-8" response = json.loads(rv.data.decode("utf-8")) expected_response = {"errors": [dataclasses.asdict(superset_error)]} @@ -1628,8 +2134,8 @@ def test_import_database(self): assert str(dataset.uuid) == dataset_config["uuid"] dataset.owners = [] - database.owners = [] db.session.delete(dataset) + db.session.commit() db.session.delete(database) db.session.commit() @@ -1699,8 +2205,8 @@ def test_import_database_overwrite(self): ) dataset = database.tables[0] dataset.owners = [] - database.owners = [] db.session.delete(dataset) + db.session.commit() db.session.delete(database) db.session.commit() @@ -1943,6 +2449,10 @@ def test_available(self, app, get_available_engine_specs): }, "preferred": True, "sqlalchemy_uri_placeholder": "postgresql://user:password@host:port/dbname[?key=value&key=value...]", + "engine_information": { + "supports_file_upload": True, + "disable_ssh_tunneling": False, + }, }, { "available_drivers": ["bigquery"], @@ -1962,6 +2472,10 @@ def test_available(self, app, get_available_engine_specs): }, "preferred": True, "sqlalchemy_uri_placeholder": "bigquery://{project_id}", + "engine_information": { + "supports_file_upload": True, + "disable_ssh_tunneling": True, + }, }, { "available_drivers": ["psycopg2"], @@ -2010,6 +2524,10 @@ def test_available(self, app, get_available_engine_specs): }, "preferred": False, "sqlalchemy_uri_placeholder": "redshift+psycopg2://user:password@host:port/dbname[?key=value&key=value...]", + "engine_information": { + "supports_file_upload": True, + "disable_ssh_tunneling": False, + }, }, { "available_drivers": ["apsw"], @@ -2029,6 +2547,10 @@ def test_available(self, app, get_available_engine_specs): }, "preferred": False, "sqlalchemy_uri_placeholder": "gsheets://", + "engine_information": { + "supports_file_upload": False, + "disable_ssh_tunneling": True, + }, }, { "available_drivers": ["mysqlconnector", "mysqldb"], @@ -2077,12 +2599,20 @@ def test_available(self, app, get_available_engine_specs): }, "preferred": False, "sqlalchemy_uri_placeholder": "mysql://user:password@host:port/dbname[?key=value&key=value...]", + "engine_information": { + "supports_file_upload": True, + "disable_ssh_tunneling": False, + }, }, { "available_drivers": [""], "engine": "hana", "name": "SAP HANA", "preferred": False, + "engine_information": { + "supports_file_upload": True, + "disable_ssh_tunneling": False, + }, }, ] } @@ -2110,19 +2640,27 @@ def test_available_no_default(self, app, get_available_engine_specs): "engine": "mysql", "name": "MySQL", "preferred": True, + "engine_information": { + "supports_file_upload": True, + "disable_ssh_tunneling": False, + }, }, { "available_drivers": [""], "engine": "hana", "name": "SAP HANA", "preferred": False, + "engine_information": { + "supports_file_upload": True, + "disable_ssh_tunneling": False, + }, }, ] } def test_validate_parameters_invalid_payload_format(self): self.login(username="admin") - url = "api/v1/database/validate_parameters" + url = "api/v1/database/validate_parameters/" rv = self.client.post(url, data="INVALID", content_type="text/plain") response = json.loads(rv.data.decode("utf-8")) @@ -2147,7 +2685,7 @@ def test_validate_parameters_invalid_payload_format(self): def test_validate_parameters_invalid_payload_schema(self): self.login(username="admin") - url = "api/v1/database/validate_parameters" + url = "api/v1/database/validate_parameters/" payload = {"foo": "bar"} rv = self.client.post(url, json=payload) response = json.loads(rv.data.decode("utf-8")) @@ -2191,7 +2729,7 @@ def test_validate_parameters_invalid_payload_schema(self): def test_validate_parameters_missing_fields(self): self.login(username="admin") - url = "api/v1/database/validate_parameters" + url = "api/v1/database/validate_parameters/" payload = { "configuration_method": ConfigurationMethod.SQLALCHEMY_FORM, "engine": "postgresql", @@ -2242,7 +2780,7 @@ def test_validate_parameters_valid_payload( is_port_open.return_value = True self.login(username="admin") - url = "api/v1/database/validate_parameters" + url = "api/v1/database/validate_parameters/" payload = { "engine": "postgresql", "parameters": defaultdict(dict), @@ -2266,7 +2804,7 @@ def test_validate_parameters_valid_payload( def test_validate_parameters_invalid_port(self): self.login(username="admin") - url = "api/v1/database/validate_parameters" + url = "api/v1/database/validate_parameters/" payload = { "engine": "postgresql", "parameters": defaultdict(dict), @@ -2325,7 +2863,7 @@ def test_validate_parameters_invalid_host(self, is_hostname_valid): is_hostname_valid.return_value = False self.login(username="admin") - url = "api/v1/database/validate_parameters" + url = "api/v1/database/validate_parameters/" payload = { "engine": "postgresql", "parameters": defaultdict(dict), @@ -2385,7 +2923,7 @@ def test_validate_parameters_invalid_port_range(self, is_hostname_valid): is_hostname_valid.return_value = True self.login(username="admin") - url = "api/v1/database/validate_parameters" + url = "api/v1/database/validate_parameters/" payload = { "engine": "postgresql", "parameters": defaultdict(dict), @@ -2468,7 +3006,7 @@ def test_validate_sql(self): pytest.skip("Only presto and PG are implemented") self.login(username="admin") - uri = f"api/v1/database/{example_db.id}/validate_sql" + uri = f"api/v1/database/{example_db.id}/validate_sql/" rv = self.client.post(uri, json=request_payload) response = json.loads(rv.data.decode("utf-8")) self.assertEqual(rv.status_code, 200) @@ -2494,7 +3032,7 @@ def test_validate_sql_errors(self): pytest.skip("Only presto and PG are implemented") self.login(username="admin") - uri = f"api/v1/database/{example_db.id}/validate_sql" + uri = f"api/v1/database/{example_db.id}/validate_sql/" rv = self.client.post(uri, json=request_payload) response = json.loads(rv.data.decode("utf-8")) self.assertEqual(rv.status_code, 200) @@ -2526,7 +3064,7 @@ def test_validate_sql_not_found(self): } self.login(username="admin") uri = ( - f"api/v1/database/{self.get_nonexistent_numeric_id(Database)}/validate_sql" + f"api/v1/database/{self.get_nonexistent_numeric_id(Database)}/validate_sql/" ) rv = self.client.post(uri, json=request_payload) self.assertEqual(rv.status_code, 404) @@ -2547,7 +3085,7 @@ def test_validate_sql_validation_fails(self): } self.login(username="admin") uri = ( - f"api/v1/database/{self.get_nonexistent_numeric_id(Database)}/validate_sql" + f"api/v1/database/{self.get_nonexistent_numeric_id(Database)}/validate_sql/" ) rv = self.client.post(uri, json=request_payload) response = json.loads(rv.data.decode("utf-8")) @@ -2572,7 +3110,7 @@ def test_validate_sql_endpoint_noconfig(self): example_db = get_example_database() - uri = f"api/v1/database/{example_db.id}/validate_sql" + uri = f"api/v1/database/{example_db.id}/validate_sql/" rv = self.client.post(uri, json=request_payload) response = json.loads(rv.data.decode("utf-8")) self.assertEqual(rv.status_code, 422) @@ -2625,7 +3163,7 @@ def test_validate_sql_endpoint_failure(self, get_validator_by_name): example_db = get_example_database() - uri = f"api/v1/database/{example_db.id}/validate_sql" + uri = f"api/v1/database/{example_db.id}/validate_sql/" rv = self.client.post(uri, json=request_payload) response = json.loads(rv.data.decode("utf-8")) diff --git a/tests/integration_tests/databases/commands_tests.py b/tests/integration_tests/databases/commands_tests.py index 7f9daedea743..7e4fcaad789e 100644 --- a/tests/integration_tests/databases/commands_tests.py +++ b/tests/integration_tests/databases/commands_tests.py @@ -31,18 +31,20 @@ DatabaseInvalidError, DatabaseNotFoundError, DatabaseSecurityUnsafeError, + DatabaseTablesUnexpectedError, DatabaseTestConnectionDriverError, - DatabaseTestConnectionFailedError, DatabaseTestConnectionUnexpectedError, ) from superset.databases.commands.export import ExportDatabasesCommand from superset.databases.commands.importers.v1 import ImportDatabasesCommand +from superset.databases.commands.tables import TablesDatabaseCommand from superset.databases.commands.test_connection import TestConnectionDatabaseCommand from superset.databases.commands.validate import ValidateDatabaseParametersCommand from superset.databases.schemas import DatabaseTestConnectionSchema from superset.errors import ErrorLevel, SupersetError, SupersetErrorType from superset.exceptions import ( SupersetErrorsException, + SupersetException, SupersetSecurityException, SupersetTimeoutException, ) @@ -70,10 +72,11 @@ class TestCreateDatabaseCommand(SupersetTestCase): @mock.patch( "superset.databases.commands.test_connection.event_logger.log_with_context" ) - def test_create_duplicate_error(self, mock_logger): + @mock.patch("superset.utils.core.g") + def test_create_duplicate_error(self, mock_g, mock_logger): example_db = get_example_database() + mock_g.user = security_manager.find_user("admin") command = CreateDatabaseCommand( - security_manager.find_user("admin"), {"database_name": example_db.database_name}, ) with pytest.raises(DatabaseInvalidError) as excinfo: @@ -90,8 +93,10 @@ def test_create_duplicate_error(self, mock_logger): @mock.patch( "superset.databases.commands.test_connection.event_logger.log_with_context" ) - def test_multiple_error_logging(self, mock_logger): - command = CreateDatabaseCommand(security_manager.find_user("admin"), {}) + @mock.patch("superset.utils.core.g") + def test_multiple_error_logging(self, mock_g, mock_logger): + mock_g.user = security_manager.find_user("admin") + command = CreateDatabaseCommand({}) with pytest.raises(DatabaseInvalidError) as excinfo: command.run() assert str(excinfo.value) == ("Database parameters are invalid.") @@ -157,6 +162,7 @@ def test_export_database_command(self, mock_g): "allow_csv_upload": True, "allow_ctas": True, "allow_cvas": True, + "allow_dml": True, "allow_run_async": False, "cache_timeout": None, "database_name": "examples", @@ -360,6 +366,7 @@ def test_export_database_command_key_order(self, mock_g): "allow_run_async", "allow_ctas", "allow_cvas", + "allow_dml", "allow_csv_upload", "extra", "uuid", @@ -403,6 +410,7 @@ def test_import_v1_database(self): assert database.allow_file_upload assert database.allow_ctas assert database.allow_cvas + assert database.allow_dml assert not database.allow_run_async assert database.cache_timeout is None assert database.database_name == "imported_database" @@ -438,6 +446,7 @@ def test_import_v1_database_broken_csv_fields(self): assert database.allow_file_upload assert database.allow_ctas assert database.allow_cvas + assert database.allow_dml assert not database.allow_run_async assert database.cache_timeout is None assert database.database_name == "imported_database" @@ -639,19 +648,21 @@ def test_import_v1_rollback(self, mock_import_dataset): class TestTestConnectionDatabaseCommand(SupersetTestCase): - @mock.patch("superset.databases.dao.Database.get_sqla_engine") + @mock.patch("superset.databases.dao.Database._get_sqla_engine") @mock.patch( "superset.databases.commands.test_connection.event_logger.log_with_context" ) - def test_connection_db_exception(self, mock_event_logger, mock_get_sqla_engine): + @mock.patch("superset.utils.core.g") + def test_connection_db_exception( + self, mock_g, mock_event_logger, mock_get_sqla_engine + ): """Test to make sure event_logger is called when an exception is raised""" database = get_example_database() + mock_g.user = security_manager.find_user("admin") mock_get_sqla_engine.side_effect = Exception("An error has occurred!") db_uri = database.sqlalchemy_uri_decrypted json_payload = {"sqlalchemy_uri": db_uri} - command_without_db_name = TestConnectionDatabaseCommand( - security_manager.find_user("admin"), json_payload - ) + command_without_db_name = TestConnectionDatabaseCommand(json_payload) with pytest.raises(DatabaseTestConnectionUnexpectedError) as excinfo: command_without_db_name.run() @@ -660,25 +671,25 @@ def test_connection_db_exception(self, mock_event_logger, mock_get_sqla_engine): ) mock_event_logger.assert_called() - @mock.patch("superset.databases.dao.Database.get_sqla_engine") + @mock.patch("superset.databases.dao.Database._get_sqla_engine") @mock.patch( "superset.databases.commands.test_connection.event_logger.log_with_context" ) + @mock.patch("superset.utils.core.g") def test_connection_do_ping_exception( - self, mock_event_logger, mock_get_sqla_engine + self, mock_g, mock_event_logger, mock_get_sqla_engine ): """Test to make sure do_ping exceptions gets captured""" database = get_example_database() + mock_g.user = security_manager.find_user("admin") mock_get_sqla_engine.return_value.dialect.do_ping.side_effect = Exception( "An error has occurred!" ) db_uri = database.sqlalchemy_uri_decrypted json_payload = {"sqlalchemy_uri": db_uri} - command_without_db_name = TestConnectionDatabaseCommand( - security_manager.find_user("admin"), json_payload - ) + command_without_db_name = TestConnectionDatabaseCommand(json_payload) - with pytest.raises(DatabaseTestConnectionFailedError) as excinfo: + with pytest.raises(SupersetErrorsException) as excinfo: command_without_db_name.run() assert ( excinfo.value.errors[0].error_type @@ -689,15 +700,17 @@ def test_connection_do_ping_exception( @mock.patch( "superset.databases.commands.test_connection.event_logger.log_with_context" ) - def test_connection_do_ping_timeout(self, mock_event_logger, mock_func_timeout): + @mock.patch("superset.utils.core.g") + def test_connection_do_ping_timeout( + self, mock_g, mock_event_logger, mock_func_timeout + ): """Test to make sure do_ping exceptions gets captured""" database = get_example_database() + mock_g.user = security_manager.find_user("admin") mock_func_timeout.side_effect = FunctionTimedOut("Time out") db_uri = database.sqlalchemy_uri_decrypted json_payload = {"sqlalchemy_uri": db_uri} - command_without_db_name = TestConnectionDatabaseCommand( - security_manager.find_user("admin"), json_payload - ) + command_without_db_name = TestConnectionDatabaseCommand(json_payload) with pytest.raises(SupersetTimeoutException) as excinfo: command_without_db_name.run() @@ -707,24 +720,24 @@ def test_connection_do_ping_timeout(self, mock_event_logger, mock_func_timeout): == SupersetErrorType.CONNECTION_DATABASE_TIMEOUT ) - @mock.patch("superset.databases.dao.Database.get_sqla_engine") + @mock.patch("superset.databases.dao.Database._get_sqla_engine") @mock.patch( "superset.databases.commands.test_connection.event_logger.log_with_context" ) + @mock.patch("superset.utils.core.g") def test_connection_superset_security_connection( - self, mock_event_logger, mock_get_sqla_engine + self, mock_g, mock_event_logger, mock_get_sqla_engine ): """Test to make sure event_logger is called when security connection exc is raised""" database = get_example_database() + mock_g.user = security_manager.find_user("admin") mock_get_sqla_engine.side_effect = SupersetSecurityException( SupersetError(error_type=500, message="test", level="info") ) db_uri = database.sqlalchemy_uri_decrypted json_payload = {"sqlalchemy_uri": db_uri} - command_without_db_name = TestConnectionDatabaseCommand( - security_manager.find_user("admin"), json_payload - ) + command_without_db_name = TestConnectionDatabaseCommand(json_payload) with pytest.raises(DatabaseSecurityUnsafeError) as excinfo: command_without_db_name.run() @@ -732,23 +745,25 @@ def test_connection_superset_security_connection( mock_event_logger.assert_called() - @mock.patch("superset.databases.dao.Database.get_sqla_engine") + @mock.patch("superset.databases.dao.Database._get_sqla_engine") @mock.patch( "superset.databases.commands.test_connection.event_logger.log_with_context" ) - def test_connection_db_api_exc(self, mock_event_logger, mock_get_sqla_engine): + @mock.patch("superset.utils.core.g") + def test_connection_db_api_exc( + self, mock_g, mock_event_logger, mock_get_sqla_engine + ): """Test to make sure event_logger is called when DBAPIError is raised""" database = get_example_database() + mock_g.user = security_manager.find_user("admin") mock_get_sqla_engine.side_effect = DBAPIError( statement="error", params={}, orig={} ) db_uri = database.sqlalchemy_uri_decrypted json_payload = {"sqlalchemy_uri": db_uri} - command_without_db_name = TestConnectionDatabaseCommand( - security_manager.find_user("admin"), json_payload - ) + command_without_db_name = TestConnectionDatabaseCommand(json_payload) - with pytest.raises(DatabaseTestConnectionFailedError) as excinfo: + with pytest.raises(SupersetErrorsException) as excinfo: command_without_db_name.run() assert str(excinfo.value) == ( "Connection failed, please check your connection settings" @@ -778,7 +793,7 @@ def test_validate(DatabaseDAO, is_port_open, is_hostname_valid, app_context): "query": {}, }, } - command = ValidateDatabaseParametersCommand(None, payload) + command = ValidateDatabaseParametersCommand(payload) command.run() @@ -802,7 +817,7 @@ def test_validate_partial(is_port_open, is_hostname_valid, app_context): "query": {}, }, } - command = ValidateDatabaseParametersCommand(None, payload) + command = ValidateDatabaseParametersCommand(payload) with pytest.raises(SupersetErrorsException) as excinfo: command.run() assert excinfo.value.errors == [ @@ -841,7 +856,7 @@ def test_validate_partial_invalid_hostname(is_hostname_valid, app_context): "query": {}, }, } - command = ValidateDatabaseParametersCommand(None, payload) + command = ValidateDatabaseParametersCommand(payload) with pytest.raises(SupersetErrorsException) as excinfo: command.run() assert excinfo.value.errors == [ @@ -874,3 +889,74 @@ def test_validate_partial_invalid_hostname(is_hostname_valid, app_context): }, ), ] + + +class TestTablesDatabaseCommand(SupersetTestCase): + @mock.patch("superset.databases.dao.DatabaseDAO.find_by_id") + def test_database_tables_list_with_unknown_database(self, mock_find_by_id): + mock_find_by_id.return_value = None + command = TablesDatabaseCommand(1, "test", False) + + with pytest.raises(DatabaseNotFoundError) as excinfo: + command.run() + assert str(excinfo.value) == ("Database not found.") + + @mock.patch("superset.databases.dao.DatabaseDAO.find_by_id") + @mock.patch("superset.security.manager.SupersetSecurityManager.can_access_database") + @mock.patch("superset.utils.core.g") + def test_database_tables_superset_exception( + self, mock_g, mock_can_access_database, mock_find_by_id + ): + database = get_example_database() + if database.backend == "mysql": + return + + mock_find_by_id.return_value = database + mock_can_access_database.side_effect = SupersetException("Test Error") + mock_g.user = security_manager.find_user("admin") + + command = TablesDatabaseCommand(database.id, "main", False) + with pytest.raises(SupersetException) as excinfo: + command.run() + assert str(excinfo.value) == "Test Error" + + @mock.patch("superset.databases.dao.DatabaseDAO.find_by_id") + @mock.patch("superset.security.manager.SupersetSecurityManager.can_access_database") + @mock.patch("superset.utils.core.g") + def test_database_tables_exception( + self, mock_g, mock_can_access_database, mock_find_by_id + ): + database = get_example_database() + mock_find_by_id.return_value = database + mock_can_access_database.side_effect = Exception("Test Error") + mock_g.user = security_manager.find_user("admin") + + command = TablesDatabaseCommand(database.id, "main", False) + with pytest.raises(DatabaseTablesUnexpectedError) as excinfo: + command.run() + assert ( + str(excinfo.value) + == "Unexpected error occurred, please check your logs for details" + ) + + @mock.patch("superset.databases.dao.DatabaseDAO.find_by_id") + @mock.patch("superset.security.manager.SupersetSecurityManager.can_access_database") + @mock.patch("superset.utils.core.g") + def test_database_tables_list_tables( + self, mock_g, mock_can_access_database, mock_find_by_id + ): + database = get_example_database() + mock_find_by_id.return_value = database + mock_can_access_database.return_value = True + mock_g.user = security_manager.find_user("admin") + + schema_name = self.default_schema_backend_map[database.backend] + if database.backend == "postgresql" or database.backend == "mysql": + return + + command = TablesDatabaseCommand(database.id, schema_name, False) + result = command.run() + + assert result["count"] > 0 + assert len(result["result"]) > 0 + assert len(result["result"]) == result["count"] diff --git a/tests/integration_tests/databases/schema_tests.py b/tests/integration_tests/databases/schema_tests.py deleted file mode 100644 index 1f8ca067f6b0..000000000000 --- a/tests/integration_tests/databases/schema_tests.py +++ /dev/null @@ -1,153 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -from unittest import mock - -from marshmallow import fields, Schema, ValidationError - -from superset.databases.schemas import DatabaseParametersSchemaMixin -from superset.db_engine_specs.base import BasicParametersMixin -from superset.models.core import ConfigurationMethod - - -class DummySchema(Schema, DatabaseParametersSchemaMixin): - sqlalchemy_uri = fields.String() - - -class DummyEngine(BasicParametersMixin): - engine = "dummy" - default_driver = "dummy" - - -class InvalidEngine: - pass - - -@mock.patch("superset.databases.schemas.get_engine_specs") -def test_database_parameters_schema_mixin(get_engine_specs): - get_engine_specs.return_value = {"dummy_engine": DummyEngine} - payload = { - "engine": "dummy_engine", - "configuration_method": ConfigurationMethod.DYNAMIC_FORM, - "parameters": { - "username": "username", - "password": "password", - "host": "localhost", - "port": 12345, - "database": "dbname", - }, - } - schema = DummySchema() - result = schema.load(payload) - assert result == { - "configuration_method": ConfigurationMethod.DYNAMIC_FORM, - "sqlalchemy_uri": "dummy+dummy://username:password@localhost:12345/dbname", - } - - -def test_database_parameters_schema_mixin_no_engine(): - payload = { - "configuration_method": ConfigurationMethod.DYNAMIC_FORM, - "parameters": { - "username": "username", - "password": "password", - "host": "localhost", - "port": 12345, - "dbname": "dbname", - }, - } - schema = DummySchema() - try: - schema.load(payload) - except ValidationError as err: - assert err.messages == { - "_schema": [ - "An engine must be specified when passing individual parameters to a database." - ] - } - - -@mock.patch("superset.databases.schemas.get_engine_specs") -def test_database_parameters_schema_mixin_invalid_engine(get_engine_specs): - get_engine_specs.return_value = {} - payload = { - "engine": "dummy_engine", - "configuration_method": ConfigurationMethod.DYNAMIC_FORM, - "parameters": { - "username": "username", - "password": "password", - "host": "localhost", - "port": 12345, - "dbname": "dbname", - }, - } - schema = DummySchema() - try: - schema.load(payload) - except ValidationError as err: - assert err.messages == { - "_schema": ['Engine "dummy_engine" is not a valid engine.'] - } - - -@mock.patch("superset.databases.schemas.get_engine_specs") -def test_database_parameters_schema_no_mixin(get_engine_specs): - get_engine_specs.return_value = {"invalid_engine": InvalidEngine} - payload = { - "engine": "invalid_engine", - "configuration_method": ConfigurationMethod.DYNAMIC_FORM, - "parameters": { - "username": "username", - "password": "password", - "host": "localhost", - "port": 12345, - "database": "dbname", - }, - } - schema = DummySchema() - try: - schema.load(payload) - except ValidationError as err: - assert err.messages == { - "_schema": [ - ( - 'Engine spec "InvalidEngine" does not support ' - "being configured via individual parameters." - ) - ] - } - - -@mock.patch("superset.databases.schemas.get_engine_specs") -def test_database_parameters_schema_mixin_invalid_type(get_engine_specs): - get_engine_specs.return_value = {"dummy_engine": DummyEngine} - payload = { - "engine": "dummy_engine", - "configuration_method": ConfigurationMethod.DYNAMIC_FORM, - "parameters": { - "username": "username", - "password": "password", - "host": "localhost", - "port": "badport", - "database": "dbname", - }, - } - schema = DummySchema() - try: - schema.load(payload) - except ValidationError as err: - assert err.messages == {"port": ["Not a valid integer."]} diff --git a/tests/integration_tests/databases/ssh_tunnel/__init__.py b/tests/integration_tests/databases/ssh_tunnel/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/integration_tests/databases/ssh_tunnel/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/integration_tests/databases/ssh_tunnel/commands/__init__.py b/tests/integration_tests/databases/ssh_tunnel/commands/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/integration_tests/databases/ssh_tunnel/commands/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/integration_tests/databases/ssh_tunnel/commands/commands_tests.py b/tests/integration_tests/databases/ssh_tunnel/commands/commands_tests.py new file mode 100644 index 000000000000..86c280b9bb1c --- /dev/null +++ b/tests/integration_tests/databases/ssh_tunnel/commands/commands_tests.py @@ -0,0 +1,78 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from unittest import mock, skip +from unittest.mock import patch + +import pytest + +from superset import security_manager +from superset.databases.ssh_tunnel.commands.create import CreateSSHTunnelCommand +from superset.databases.ssh_tunnel.commands.delete import DeleteSSHTunnelCommand +from superset.databases.ssh_tunnel.commands.exceptions import ( + SSHTunnelInvalidError, + SSHTunnelNotFoundError, +) +from superset.databases.ssh_tunnel.commands.update import UpdateSSHTunnelCommand +from tests.integration_tests.base_tests import SupersetTestCase + + +class TestCreateSSHTunnelCommand(SupersetTestCase): + @mock.patch("superset.utils.core.g") + def test_create_invalid_database_id(self, mock_g): + mock_g.user = security_manager.find_user("admin") + command = CreateSSHTunnelCommand( + None, + { + "server_address": "127.0.0.1", + "server_port": 5432, + "username": "test_user", + }, + ) + with pytest.raises(SSHTunnelInvalidError) as excinfo: + command.run() + assert str(excinfo.value) == ("SSH Tunnel parameters are invalid.") + + +class TestUpdateSSHTunnelCommand(SupersetTestCase): + @mock.patch("superset.utils.core.g") + def test_update_ssh_tunnel_not_found(self, mock_g): + mock_g.user = security_manager.find_user("admin") + # We have not created a SSH Tunnel yet so id = 1 is invalid + command = UpdateSSHTunnelCommand( + 1, + { + "server_address": "127.0.0.1", + "server_port": 5432, + "username": "test_user", + }, + ) + with pytest.raises(SSHTunnelNotFoundError) as excinfo: + command.run() + assert str(excinfo.value) == ("SSH Tunnel not found.") + + +class TestDeleteSSHTunnelCommand(SupersetTestCase): + @mock.patch("superset.utils.core.g") + @mock.patch("superset.databases.ssh_tunnel.commands.delete.is_feature_enabled") + def test_delete_ssh_tunnel_not_found(self, mock_g, mock_delete_is_feature_enabled): + mock_g.user = security_manager.find_user("admin") + mock_delete_is_feature_enabled.return_value = True + # We have not created a SSH Tunnel yet so id = 1 is invalid + command = DeleteSSHTunnelCommand(1) + with pytest.raises(SSHTunnelNotFoundError) as excinfo: + command.run() + assert str(excinfo.value) == ("SSH Tunnel not found.") diff --git a/tests/integration_tests/datasets/api_tests.py b/tests/integration_tests/datasets/api_tests.py index 24c48845a110..1331a20dc492 100644 --- a/tests/integration_tests/datasets/api_tests.py +++ b/tests/integration_tests/datasets/api_tests.py @@ -25,16 +25,16 @@ import prison import pytest import yaml +from sqlalchemy.orm import joinedload from sqlalchemy.sql import func -from superset.common.utils.query_cache_manager import QueryCacheManager from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn -from superset.constants import CacheRegion from superset.dao.exceptions import ( DAOCreateFailedError, DAODeleteFailedError, DAOUpdateFailedError, ) +from superset.datasets.commands.exceptions import DatasetCreateFailedError from superset.datasets.models import Dataset from superset.extensions import db, security_manager from superset.models.core import Database @@ -97,13 +97,25 @@ def insert_default_dataset(self): def get_fixture_datasets(self) -> List[SqlaTable]: return ( db.session.query(SqlaTable) + .options(joinedload(SqlaTable.database)) .filter(SqlaTable.table_name.in_(self.fixture_tables_names)) .all() ) + def get_fixture_virtual_datasets(self) -> List[SqlaTable]: + return ( + db.session.query(SqlaTable) + .filter(SqlaTable.table_name.in_(self.fixture_virtual_table_names)) + .all() + ) + @pytest.fixture() def create_virtual_datasets(self): with self.create_app().app_context(): + if backend() == "sqlite": + yield + return + datasets = [] admin = self.get_user("admin") main_db = get_main_database() @@ -126,6 +138,10 @@ def create_virtual_datasets(self): @pytest.fixture() def create_datasets(self): with self.create_app().app_context(): + if backend() == "sqlite": + yield + return + datasets = [] admin = self.get_user("admin") main_db = get_main_database() @@ -172,6 +188,9 @@ def test_get_dataset_list(self): """ Dataset API: Test get dataset list """ + if backend() == "sqlite": + return + example_db = get_example_database() self.login(username="admin") arguments = { @@ -210,6 +229,9 @@ def test_get_dataset_list_gamma(self): """ Dataset API: Test get dataset list gamma """ + if backend() == "sqlite": + return + self.login(username="gamma") uri = "api/v1/dataset/" rv = self.get_assert_metric(uri, "get_list") @@ -221,6 +243,9 @@ def test_get_dataset_list_gamma_owned(self): """ Dataset API: Test get dataset list owned by gamma """ + if backend() == "sqlite": + return + main_db = get_main_database() owned_dataset = self.insert_dataset( "ab_user", [self.get_user("gamma").id], main_db @@ -242,6 +267,18 @@ def test_get_dataset_related_database_gamma(self): """ Dataset API: Test get dataset related databases gamma """ + if backend() == "sqlite": + return + + # Add main database access to gamma role + main_db = get_main_database() + main_db_pvm = security_manager.find_permission_view_menu( + "database_access", main_db.perm + ) + gamma_role = security_manager.find_role("Gamma") + gamma_role.permissions.append(main_db_pvm) + db.session.commit() + self.login(username="gamma") uri = "api/v1/dataset/related/database" rv = self.client.get(uri) @@ -252,11 +289,18 @@ def test_get_dataset_related_database_gamma(self): main_db = get_main_database() assert filter(lambda x: x.text == main_db, response["result"]) != [] + # revert gamma permission + gamma_role.permissions.remove(main_db_pvm) + db.session.commit() + @pytest.mark.usefixtures("load_energy_table_with_slice") def test_get_dataset_item(self): """ Dataset API: Test get dataset item """ + if backend() == "sqlite": + return + table = self.get_energy_usage_dataset() main_db = get_main_database() self.login(username="admin") @@ -297,6 +341,8 @@ def test_get_dataset_distinct_schema(self): """ Dataset API: Test get dataset distinct schema """ + if backend() == "sqlite": + return def pg_test_query_parameter(query_parameter, expected_response): uri = f"api/v1/dataset/distinct/schema?q={prison.dumps(query_parameter)}" @@ -321,12 +367,18 @@ def pg_test_query_parameter(query_parameter, expected_response): schema="information_schema", ) ) - schema_values = [ - "information_schema", - "public", - ] + all_datasets = db.session.query(SqlaTable).all() + schema_values = sorted( + set( + [ + dataset.schema + for dataset in all_datasets + if dataset.schema is not None + ] + ) + ) expected_response = { - "count": 2, + "count": len(schema_values), "result": [{"text": val, "value": val} for val in schema_values], } self.login(username="admin") @@ -352,10 +404,8 @@ def pg_test_query_parameter(query_parameter, expected_response): pg_test_query_parameter( query_parameter, { - "count": 2, - "result": [ - {"text": "information_schema", "value": "information_schema"} - ], + "count": len(schema_values), + "result": [expected_response["result"][0]], }, ) @@ -367,6 +417,9 @@ def test_get_dataset_distinct_not_allowed(self): """ Dataset API: Test get dataset distinct not allowed """ + if backend() == "sqlite": + return + self.login(username="admin") uri = "api/v1/dataset/distinct/table_name" rv = self.client.get(uri) @@ -376,6 +429,9 @@ def test_get_dataset_distinct_gamma(self): """ Dataset API: Test get dataset distinct with gamma """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="gamma") @@ -393,6 +449,9 @@ def test_get_dataset_info(self): """ Dataset API: Test get dataset info """ + if backend() == "sqlite": + return + self.login(username="admin") uri = "api/v1/dataset/_info" rv = self.get_assert_metric(uri, "info") @@ -402,18 +461,30 @@ def test_info_security_dataset(self): """ Dataset API: Test info security """ + if backend() == "sqlite": + return + self.login(username="admin") params = {"keys": ["permissions"]} uri = f"api/v1/dataset/_info?q={prison.dumps(params)}" rv = self.get_assert_metric(uri, "info") data = json.loads(rv.data.decode("utf-8")) assert rv.status_code == 200 - assert set(data["permissions"]) == {"can_read", "can_write", "can_export"} + assert set(data["permissions"]) == { + "can_read", + "can_write", + "can_export", + "can_duplicate", + "can_get_or_create_dataset", + } def test_create_dataset_item(self): """ Dataset API: Test create dataset item """ + if backend() == "sqlite": + return + main_db = get_main_database() self.login(username="admin") table_data = { @@ -456,6 +527,9 @@ def test_create_dataset_item_gamma(self): """ Dataset API: Test create dataset item gamma """ + if backend() == "sqlite": + return + self.login(username="gamma") main_db = get_main_database() table_data = { @@ -471,6 +545,9 @@ def test_create_dataset_item_owner(self): """ Dataset API: Test create item owner """ + if backend() == "sqlite": + return + main_db = get_main_database() self.login(username="alpha") admin = self.get_user("admin") @@ -496,6 +573,9 @@ def test_create_dataset_item_owners_invalid(self): """ Dataset API: Test create dataset item owner invalid """ + if backend() == "sqlite": + return + admin = self.get_user("admin") main_db = get_main_database() self.login(username="admin") @@ -517,6 +597,9 @@ def test_create_dataset_validate_uniqueness(self): """ Dataset API: Test create dataset validate table uniqueness """ + if backend() == "sqlite": + return + schema = get_example_default_schema() energy_usage_ds = self.get_energy_usage_dataset() self.login(username="admin") @@ -533,6 +616,61 @@ def test_create_dataset_validate_uniqueness(self): "message": {"table_name": ["Dataset energy_usage already exists"]} } + @pytest.mark.usefixtures("load_energy_table_with_slice") + def test_create_dataset_with_sql_validate_uniqueness(self): + """ + Dataset API: Test create dataset with sql + """ + if backend() == "sqlite": + return + + schema = get_example_default_schema() + energy_usage_ds = self.get_energy_usage_dataset() + self.login(username="admin") + table_data = { + "database": energy_usage_ds.database_id, + "table_name": energy_usage_ds.table_name, + "sql": "select * from energy_usage", + } + if schema: + table_data["schema"] = schema + rv = self.post_assert_metric("/api/v1/dataset/", table_data, "post") + assert rv.status_code == 422 + data = json.loads(rv.data.decode("utf-8")) + assert data == { + "message": {"table_name": ["Dataset energy_usage already exists"]} + } + + @pytest.mark.usefixtures("load_energy_table_with_slice") + def test_create_dataset_with_sql(self): + """ + Dataset API: Test create dataset with sql + """ + if backend() == "sqlite": + return + + schema = get_example_default_schema() + energy_usage_ds = self.get_energy_usage_dataset() + self.login(username="alpha") + admin = self.get_user("admin") + alpha = self.get_user("alpha") + table_data = { + "database": energy_usage_ds.database_id, + "table_name": "energy_usage_virtual", + "sql": "select * from energy_usage", + "owners": [admin.id], + } + if schema: + table_data["schema"] = schema + rv = self.post_assert_metric("/api/v1/dataset/", table_data, "post") + assert rv.status_code == 201 + data = json.loads(rv.data.decode("utf-8")) + model = db.session.query(SqlaTable).get(data.get("id")) + assert admin in model.owners + assert alpha in model.owners + db.session.delete(model) + db.session.commit() + @unittest.skip("test is failing stochastically") def test_create_dataset_same_name_different_schema(self): if backend() == "sqlite": @@ -540,9 +678,10 @@ def test_create_dataset_same_name_different_schema(self): return example_db = get_example_database() - example_db.get_sqla_engine().execute( - f"CREATE TABLE {CTAS_SCHEMA_NAME}.birth_names AS SELECT 2 as two" - ) + with example_db.get_sqla_engine_with_context() as engine: + engine.execute( + f"CREATE TABLE {CTAS_SCHEMA_NAME}.birth_names AS SELECT 2 as two" + ) self.login(username="admin") table_data = { @@ -560,14 +699,16 @@ def test_create_dataset_same_name_different_schema(self): uri = f'api/v1/dataset/{data.get("id")}' rv = self.client.delete(uri) assert rv.status_code == 200 - example_db.get_sqla_engine().execute( - f"DROP TABLE {CTAS_SCHEMA_NAME}.birth_names" - ) + with example_db.get_sqla_engine_with_context() as engine: + engine.execute(f"DROP TABLE {CTAS_SCHEMA_NAME}.birth_names") def test_create_dataset_validate_database(self): """ Dataset API: Test create dataset validate database exists """ + if backend() == "sqlite": + return + self.login(username="admin") dataset_data = {"database": 1000, "schema": "", "table_name": "birth_names"} uri = "api/v1/dataset/" @@ -580,6 +721,9 @@ def test_create_dataset_validate_tables_exists(self): """ Dataset API: Test create dataset validate table exists """ + if backend() == "sqlite": + return + example_db = get_example_database() self.login(username="admin") table_data = { @@ -593,13 +737,20 @@ def test_create_dataset_validate_tables_exists(self): @patch("superset.models.core.Database.get_columns") @patch("superset.models.core.Database.has_table_by_name") + @patch("superset.models.core.Database.has_view_by_name") @patch("superset.models.core.Database.get_table") def test_create_dataset_validate_view_exists( - self, mock_get_table, mock_has_table_by_name, mock_get_columns + self, + mock_get_table, + mock_has_table_by_name, + mock_has_view_by_name, + mock_get_columns, ): """ Dataset API: Test create dataset validate view exists """ + if backend() == "sqlite": + return mock_get_columns.return_value = [ { @@ -611,16 +762,18 @@ def test_create_dataset_validate_view_exists( ] mock_has_table_by_name.return_value = False + mock_has_view_by_name.return_value = True mock_get_table.return_value = None example_db = get_example_database() - engine = example_db.get_sqla_engine() - dialect = engine.dialect + with example_db.get_sqla_engine_with_context() as engine: + engine = engine + dialect = engine.dialect - with patch.object( - dialect, "get_view_names", wraps=dialect.get_view_names - ) as patch_get_view_names: - patch_get_view_names.return_value = ["test_case_view"] + with patch.object( + dialect, "get_view_names", wraps=dialect.get_view_names + ) as patch_get_view_names: + patch_get_view_names.return_value = {"test_case_view"} self.login(username="admin") table_data = { @@ -644,6 +797,9 @@ def test_create_dataset_sqlalchemy_error(self, mock_dao_create): """ Dataset API: Test create dataset sqlalchemy error """ + if backend() == "sqlite": + return + mock_dao_create.side_effect = DAOCreateFailedError() self.login(username="admin") main_db = get_main_database() @@ -662,6 +818,9 @@ def test_update_dataset_item(self): """ Dataset API: Test update dataset item """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="admin") dataset_data = {"description": "changed_description"} @@ -678,6 +837,9 @@ def test_update_dataset_item_w_override_columns(self): """ Dataset API: Test update dataset with override columns """ + if backend() == "sqlite": + return + # Add default dataset dataset = self.insert_default_dataset() self.login(username="admin") @@ -706,10 +868,63 @@ def test_update_dataset_item_w_override_columns(self): db.session.delete(dataset) db.session.commit() + def test_update_dataset_item_w_override_columns_same_columns(self): + """ + Dataset API: Test update dataset with override columns + """ + if backend() == "sqlite": + return + + # Add default dataset + main_db = get_main_database() + dataset = self.insert_default_dataset() + prev_col_len = len(dataset.columns) + + cols = [ + { + "column_name": c.column_name, + "description": c.description, + "expression": c.expression, + "type": c.type, + "advanced_data_type": c.advanced_data_type, + "verbose_name": c.verbose_name, + } + for c in dataset.columns + ] + + cols.append( + { + "column_name": "new_col", + "description": "description", + "expression": "expression", + "type": "INTEGER", + "advanced_data_type": "ADVANCED_DATA_TYPE", + "verbose_name": "New Col", + } + ) + + self.login(username="admin") + dataset_data = { + "columns": cols, + } + uri = f"api/v1/dataset/{dataset.id}?override_columns=true" + rv = self.put_assert_metric(uri, dataset_data, "put") + + assert rv.status_code == 200 + + columns = db.session.query(TableColumn).filter_by(table_id=dataset.id).all() + assert len(columns) != prev_col_len + assert len(columns) == 3 + db.session.delete(dataset) + db.session.commit() + def test_update_dataset_create_column_and_metric(self): """ Dataset API: Test update dataset create column """ + if backend() == "sqlite": + return + # create example dataset by Command dataset = self.insert_default_dataset() @@ -805,6 +1020,9 @@ def test_update_dataset_delete_column(self): """ Dataset API: Test update dataset delete column """ + if backend() == "sqlite": + return + # create example dataset by Command dataset = self.insert_default_dataset() @@ -854,6 +1072,9 @@ def test_update_dataset_update_column(self): """ Dataset API: Test update dataset columns """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="admin") @@ -890,6 +1111,9 @@ def test_update_dataset_delete_metric(self): """ Dataset API: Test update dataset delete metric """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() metrics_query = ( db.session.query(SqlMetric) @@ -933,6 +1157,9 @@ def test_update_dataset_update_column_uniqueness(self): """ Dataset API: Test update dataset columns uniqueness """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="admin") @@ -953,6 +1180,9 @@ def test_update_dataset_update_metric_uniqueness(self): """ Dataset API: Test update dataset metric uniqueness """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="admin") @@ -973,6 +1203,9 @@ def test_update_dataset_update_column_duplicate(self): """ Dataset API: Test update dataset columns duplicate """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="admin") @@ -998,6 +1231,9 @@ def test_update_dataset_update_metric_duplicate(self): """ Dataset API: Test update dataset metric duplicate """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="admin") @@ -1023,6 +1259,9 @@ def test_update_dataset_item_gamma(self): """ Dataset API: Test update dataset item gamma """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="gamma") table_data = {"description": "changed_description"} @@ -1036,6 +1275,9 @@ def test_update_dataset_item_not_owned(self): """ Dataset API: Test update dataset item not owned """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="alpha") table_data = {"description": "changed_description"} @@ -1049,6 +1291,9 @@ def test_update_dataset_item_owners_invalid(self): """ Dataset API: Test update dataset item owner invalid """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="admin") table_data = {"description": "changed_description", "owners": [1000]} @@ -1062,6 +1307,9 @@ def test_update_dataset_item_uniqueness(self): """ Dataset API: Test update dataset uniqueness """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="admin") ab_user = self.insert_dataset( @@ -1085,6 +1333,9 @@ def test_update_dataset_sqlalchemy_error(self, mock_dao_update): """ Dataset API: Test update dataset sqlalchemy error """ + if backend() == "sqlite": + return + mock_dao_update.side_effect = DAOUpdateFailedError() dataset = self.insert_default_dataset() @@ -1103,6 +1354,9 @@ def test_delete_dataset_item(self): """ Dataset API: Test delete dataset item """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() view_menu = security_manager.find_view_menu(dataset.get_perm()) assert view_menu is not None @@ -1120,6 +1374,9 @@ def test_delete_item_dataset_not_owned(self): """ Dataset API: Test delete item not owned """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="alpha") uri = f"api/v1/dataset/{dataset.id}" @@ -1132,6 +1389,9 @@ def test_delete_dataset_item_not_authorized(self): """ Dataset API: Test delete item not authorized """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="gamma") uri = f"api/v1/dataset/{dataset.id}" @@ -1145,6 +1405,9 @@ def test_delete_dataset_sqlalchemy_error(self, mock_dao_delete): """ Dataset API: Test delete dataset sqlalchemy error """ + if backend() == "sqlite": + return + mock_dao_delete.side_effect = DAODeleteFailedError() dataset = self.insert_default_dataset() @@ -1162,6 +1425,9 @@ def test_delete_dataset_column(self): """ Dataset API: Test delete dataset column """ + if backend() == "sqlite": + return + dataset = self.get_fixture_datasets()[0] column_id = dataset.columns[0].id self.login(username="admin") @@ -1175,6 +1441,9 @@ def test_delete_dataset_column_not_found(self): """ Dataset API: Test delete dataset column not found """ + if backend() == "sqlite": + return + dataset = self.get_fixture_datasets()[0] non_id = self.get_nonexistent_numeric_id(TableColumn) @@ -1196,6 +1465,9 @@ def test_delete_dataset_column_not_owned(self): """ Dataset API: Test delete dataset column not owned """ + if backend() == "sqlite": + return + dataset = self.get_fixture_datasets()[0] column_id = dataset.columns[0].id @@ -1210,6 +1482,9 @@ def test_delete_dataset_column_fail(self, mock_dao_delete): """ Dataset API: Test delete dataset column """ + if backend() == "sqlite": + return + mock_dao_delete.side_effect = DAODeleteFailedError() dataset = self.get_fixture_datasets()[0] column_id = dataset.columns[0].id @@ -1225,6 +1500,9 @@ def test_delete_dataset_metric(self): """ Dataset API: Test delete dataset metric """ + if backend() == "sqlite": + return + dataset = self.get_fixture_datasets()[0] test_metric = SqlMetric( metric_name="metric1", expression="COUNT(*)", table=dataset @@ -1243,6 +1521,9 @@ def test_delete_dataset_metric_not_found(self): """ Dataset API: Test delete dataset metric not found """ + if backend() == "sqlite": + return + dataset = self.get_fixture_datasets()[0] non_id = self.get_nonexistent_numeric_id(SqlMetric) @@ -1264,6 +1545,9 @@ def test_delete_dataset_metric_not_owned(self): """ Dataset API: Test delete dataset metric not owned """ + if backend() == "sqlite": + return + dataset = self.get_fixture_datasets()[0] metric_id = dataset.metrics[0].id @@ -1278,6 +1562,9 @@ def test_delete_dataset_metric_fail(self, mock_dao_delete): """ Dataset API: Test delete dataset metric """ + if backend() == "sqlite": + return + mock_dao_delete.side_effect = DAODeleteFailedError() dataset = self.get_fixture_datasets()[0] column_id = dataset.metrics[0].id @@ -1293,6 +1580,9 @@ def test_bulk_delete_dataset_items(self): """ Dataset API: Test bulk delete dataset items """ + if backend() == "sqlite": + return + datasets = self.get_fixture_datasets() dataset_ids = [dataset.id for dataset in datasets] @@ -1322,6 +1612,9 @@ def test_bulk_delete_item_dataset_not_owned(self): """ Dataset API: Test bulk delete item not owned """ + if backend() == "sqlite": + return + datasets = self.get_fixture_datasets() dataset_ids = [dataset.id for dataset in datasets] @@ -1335,6 +1628,9 @@ def test_bulk_delete_item_not_found(self): """ Dataset API: Test bulk delete item not found """ + if backend() == "sqlite": + return + datasets = self.get_fixture_datasets() dataset_ids = [dataset.id for dataset in datasets] dataset_ids.append(db.session.query(func.max(SqlaTable.id)).scalar()) @@ -1349,6 +1645,9 @@ def test_bulk_delete_dataset_item_not_authorized(self): """ Dataset API: Test bulk delete item not authorized """ + if backend() == "sqlite": + return + datasets = self.get_fixture_datasets() dataset_ids = [dataset.id for dataset in datasets] @@ -1362,6 +1661,9 @@ def test_bulk_delete_dataset_item_incorrect(self): """ Dataset API: Test bulk delete item incorrect request """ + if backend() == "sqlite": + return + datasets = self.get_fixture_datasets() dataset_ids = [dataset.id for dataset in datasets] dataset_ids.append("Wrong") @@ -1375,6 +1677,9 @@ def test_dataset_item_refresh(self): """ Dataset API: Test item refresh """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() # delete a column id_column = ( @@ -1403,6 +1708,9 @@ def test_dataset_item_refresh_not_found(self): """ Dataset API: Test item refresh not found dataset """ + if backend() == "sqlite": + return + max_id = db.session.query(func.max(SqlaTable.id)).scalar() self.login(username="admin") @@ -1414,6 +1722,9 @@ def test_dataset_item_refresh_not_owned(self): """ Dataset API: Test item refresh not owned dataset """ + if backend() == "sqlite": + return + dataset = self.insert_default_dataset() self.login(username="alpha") uri = f"api/v1/dataset/{dataset.id}/refresh" @@ -1428,6 +1739,9 @@ def test_export_dataset(self): """ Dataset API: Test export dataset """ + if backend() == "sqlite": + return + birth_names_dataset = self.get_birth_names_dataset() # TODO: fix test for presto # debug with dump: https://github.com/apache/superset/runs/1092546855 @@ -1460,6 +1774,9 @@ def test_export_dataset_not_found(self): """ Dataset API: Test export dataset not found """ + if backend() == "sqlite": + return + max_id = db.session.query(func.max(SqlaTable.id)).scalar() # Just one does not exist and we get 404 argument = [max_id + 1, 1] @@ -1473,6 +1790,9 @@ def test_export_dataset_gamma(self): """ Dataset API: Test export dataset has gamma """ + if backend() == "sqlite": + return + dataset = self.get_fixture_datasets()[0] argument = [dataset.id] @@ -1488,7 +1808,7 @@ def test_export_dataset_gamma(self): "datasource_access", dataset.perm ) - # add perissions to allow export + access to query this dataset + # add permissions to allow export + access to query this dataset gamma_role = security_manager.find_role("Gamma") security_manager.add_permission_role(gamma_role, perm1) security_manager.add_permission_role(gamma_role, perm2) @@ -1501,6 +1821,9 @@ def test_export_dataset_bundle(self): """ Dataset API: Test export dataset """ + if backend() == "sqlite": + return + birth_names_dataset = self.get_birth_names_dataset() # TODO: fix test for presto # debug with dump: https://github.com/apache/superset/runs/1092546855 @@ -1522,6 +1845,9 @@ def test_export_dataset_bundle_not_found(self): """ Dataset API: Test export dataset not found """ + if backend() == "sqlite": + return + # Just one does not exist and we get 404 argument = [-1, 1] uri = f"api/v1/dataset/export/?q={prison.dumps(argument)}" @@ -1535,6 +1861,9 @@ def test_export_dataset_bundle_gamma(self): """ Dataset API: Test export dataset has gamma """ + if backend() == "sqlite": + return + dataset = self.get_fixture_datasets()[0] argument = [dataset.id] @@ -1552,6 +1881,9 @@ def test_get_dataset_related_objects(self): Dataset API: Test get chart and dashboard count related to a dataset :return: """ + if backend() == "sqlite": + return + self.login(username="admin") table = self.get_birth_names_dataset() uri = f"api/v1/dataset/{table.id}/related_objects" @@ -1565,6 +1897,9 @@ def test_get_dataset_related_objects_not_found(self): """ Dataset API: Test related objects not found """ + if backend() == "sqlite": + return + max_id = db.session.query(func.max(SqlaTable.id)).scalar() # id does not exist and we get 404 invalid_id = max_id + 1 @@ -1573,6 +1908,7 @@ def test_get_dataset_related_objects_not_found(self): rv = self.client.get(uri) assert rv.status_code == 404 self.logout() + self.login(username="gamma") table = self.get_birth_names_dataset() uri = f"api/v1/dataset/{table.id}/related_objects" @@ -1584,6 +1920,9 @@ def test_get_datasets_custom_filter_sql(self): """ Dataset API: Test custom dataset_is_null_or_empty filter for sql """ + if backend() == "sqlite": + return + arguments = { "filters": [ {"col": "sql", "opr": "dataset_is_null_or_empty", "value": False} @@ -1617,12 +1956,17 @@ def test_import_dataset(self): """ Dataset API: Test import dataset """ + if backend() == "sqlite": + return + self.login(username="admin") uri = "api/v1/dataset/import/" buf = self.create_dataset_import() form_data = { "formData": (buf, "dataset_export.zip"), + "sync_columns": "true", + "sync_metrics": "true", } rv = self.client.post(uri, data=form_data, content_type="multipart/form-data") response = json.loads(rv.data.decode("utf-8")) @@ -1633,25 +1977,24 @@ def test_import_dataset(self): database = ( db.session.query(Database).filter_by(uuid=database_config["uuid"]).one() ) - shadow_dataset = ( - db.session.query(Dataset).filter_by(uuid=dataset_config["uuid"]).one() - ) + assert database.database_name == "imported_database" assert len(database.tables) == 1 dataset = database.tables[0] assert dataset.table_name == "imported_dataset" assert str(dataset.uuid) == dataset_config["uuid"] - assert str(shadow_dataset.uuid) == dataset_config["uuid"] dataset.owners = [] - database.owners = [] db.session.delete(dataset) - db.session.delete(shadow_dataset) + db.session.commit() db.session.delete(database) db.session.commit() def test_import_dataset_v0_export(self): + if backend() == "sqlite": + return + num_datasets = db.session.query(SqlaTable).count() self.login(username="admin") @@ -1662,6 +2005,8 @@ def test_import_dataset_v0_export(self): buf.seek(0) form_data = { "formData": (buf, "dataset_export.zip"), + "sync_columns": "true", + "sync_metrics": "true", } rv = self.client.post(uri, data=form_data, content_type="multipart/form-data") response = json.loads(rv.data.decode("utf-8")) @@ -1680,6 +2025,9 @@ def test_import_dataset_overwrite(self): """ Dataset API: Test import existing dataset """ + if backend() == "sqlite": + return + self.login(username="admin") uri = "api/v1/dataset/import/" @@ -1740,8 +2088,8 @@ def test_import_dataset_overwrite(self): dataset = database.tables[0] dataset.owners = [] - database.owners = [] db.session.delete(dataset) + db.session.commit() db.session.delete(database) db.session.commit() @@ -1749,6 +2097,9 @@ def test_import_dataset_invalid(self): """ Dataset API: Test import invalid dataset """ + if backend() == "sqlite": + return + self.login(username="admin") uri = "api/v1/dataset/import/" @@ -1799,6 +2150,9 @@ def test_import_dataset_invalid_v0_validation(self): """ Dataset API: Test import invalid dataset """ + if backend() == "sqlite": + return + self.login(username="admin") uri = "api/v1/dataset/import/" @@ -1844,6 +2198,9 @@ def test_get_datasets_is_certified_filter(self): """ Dataset API: Test custom dataset_is_certified filter """ + if backend() == "sqlite": + return + table_w_certification = SqlaTable( table_name="foo", schema=None, @@ -1869,92 +2226,164 @@ def test_get_datasets_is_certified_filter(self): db.session.delete(table_w_certification) db.session.commit() - @pytest.mark.usefixtures("create_datasets") - def test_get_dataset_samples(self): + @pytest.mark.usefixtures("create_virtual_datasets") + def test_duplicate_virtual_dataset(self): """ - Dataset API: Test get dataset samples + Dataset API: Test duplicate virtual dataset """ - dataset = self.get_fixture_datasets()[0] + if backend() == "sqlite": + return - self.login(username="admin") - uri = f"api/v1/dataset/{dataset.id}/samples" + dataset = self.get_fixture_virtual_datasets()[0] - # 1. should cache data - # feeds data - self.client.get(uri) - # get from cache - rv = self.client.get(uri) + self.login(username="admin") + uri = f"api/v1/dataset/duplicate" + table_data = {"base_model_id": dataset.id, "table_name": "Dupe1"} + rv = self.post_assert_metric(uri, table_data, "duplicate") + assert rv.status_code == 201 rv_data = json.loads(rv.data) - assert rv.status_code == 200 - assert "result" in rv_data - assert rv_data["result"]["cached_dttm"] is not None - cache_key1 = rv_data["result"]["cache_key"] - assert QueryCacheManager.has(cache_key1, region=CacheRegion.DATA) - - # 2. should through cache - uri2 = f"api/v1/dataset/{dataset.id}/samples?force=true" - # feeds data - self.client.get(uri2) - # force query - rv2 = self.client.get(uri2) - rv_data2 = json.loads(rv2.data) - assert rv_data2["result"]["cached_dttm"] is None - cache_key2 = rv_data2["result"]["cache_key"] - assert QueryCacheManager.has(cache_key2, region=CacheRegion.DATA) - - # 3. data precision - assert "colnames" in rv_data2["result"] - assert "coltypes" in rv_data2["result"] - assert "data" in rv_data2["result"] - - eager_samples = dataset.database.get_df( - f"select * from {dataset.table_name}" - f' limit {self.app.config["SAMPLES_ROW_LIMIT"]}' - ).to_dict(orient="records") - assert eager_samples == rv_data2["result"]["data"] + new_dataset: SqlaTable = ( + db.session.query(SqlaTable).filter_by(id=rv_data["id"]).one_or_none() + ) + assert new_dataset is not None + assert new_dataset.id != dataset.id + assert new_dataset.table_name == "Dupe1" + assert len(new_dataset.columns) == 2 + assert new_dataset.columns[0].column_name == "id" + assert new_dataset.columns[1].column_name == "name" @pytest.mark.usefixtures("create_datasets") - def test_get_dataset_samples_with_failed_cc(self): + def test_duplicate_physical_dataset(self): + """ + Dataset API: Test duplicate physical dataset + """ + if backend() == "sqlite": + return + dataset = self.get_fixture_datasets()[0] self.login(username="admin") - failed_column = TableColumn( - column_name="DUMMY CC", - type="VARCHAR(255)", - table=dataset, - expression="INCORRECT SQL", + uri = f"api/v1/dataset/duplicate" + table_data = {"base_model_id": dataset.id, "table_name": "Dupe2"} + rv = self.post_assert_metric(uri, table_data, "duplicate") + assert rv.status_code == 422 + + @pytest.mark.usefixtures("create_virtual_datasets") + def test_duplicate_existing_dataset(self): + """ + Dataset API: Test duplicate dataset with existing name + """ + if backend() == "sqlite": + return + + dataset = self.get_fixture_virtual_datasets()[0] + + self.login(username="admin") + uri = f"api/v1/dataset/duplicate" + table_data = { + "base_model_id": dataset.id, + "table_name": "sql_virtual_dataset_2", + } + rv = self.post_assert_metric(uri, table_data, "duplicate") + assert rv.status_code == 422 + + def test_duplicate_invalid_dataset(self): + """ + Dataset API: Test duplicate invalid dataset + """ + + self.login(username="admin") + uri = f"api/v1/dataset/duplicate" + table_data = { + "base_model_id": -1, + "table_name": "Dupe3", + } + rv = self.post_assert_metric(uri, table_data, "duplicate") + assert rv.status_code == 422 + + @pytest.mark.usefixtures("app_context", "virtual_dataset") + def test_get_or_create_dataset_already_exists(self): + """ + Dataset API: Test get or create endpoint when table already exists + """ + self.login(username="admin") + rv = self.client.post( + "api/v1/dataset/get_or_create/", + json={ + "table_name": "virtual_dataset", + "database_id": get_example_database().id, + }, ) - uri = f"api/v1/dataset/{dataset.id}/samples" - dataset.columns.append(failed_column) - rv = self.client.get(uri) - assert rv.status_code == 400 - rv_data = json.loads(rv.data) - assert "message" in rv_data - if dataset.database.db_engine_spec.engine_name == "PostgreSQL": - assert "INCORRECT SQL" in rv_data.get("message") - - def test_get_dataset_samples_on_virtual_dataset(self): - virtual_dataset = SqlaTable( - table_name="virtual_dataset", - sql=("SELECT 'foo' as foo, 'bar' as bar"), - database=get_example_database(), + self.assertEqual(rv.status_code, 200) + response = json.loads(rv.data.decode("utf-8")) + dataset = ( + db.session.query(SqlaTable) + .filter(SqlaTable.table_name == "virtual_dataset") + .one() ) - TableColumn(column_name="foo", type="VARCHAR(255)", table=virtual_dataset) - TableColumn(column_name="bar", type="VARCHAR(255)", table=virtual_dataset) - SqlMetric(metric_name="count", expression="count(*)", table=virtual_dataset) + self.assertEqual(response["result"], {"table_id": dataset.id}) + def test_get_or_create_dataset_database_not_found(self): + """ + Dataset API: Test get or create endpoint when database doesn't exist + """ self.login(username="admin") - uri = f"api/v1/dataset/{virtual_dataset.id}/samples" - rv = self.client.get(uri) - assert rv.status_code == 200 - rv_data = json.loads(rv.data) - cache_key = rv_data["result"]["cache_key"] - assert QueryCacheManager.has(cache_key, region=CacheRegion.DATA) + rv = self.client.post( + "api/v1/dataset/get_or_create/", + json={"table_name": "virtual_dataset", "database_id": 999}, + ) + self.assertEqual(rv.status_code, 422) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(response["message"], {"database": ["Database does not exist"]}) - # remove original column in dataset - virtual_dataset.sql = "SELECT 'foo' as foo" - rv = self.client.get(uri) - assert rv.status_code == 400 + @patch("superset.datasets.commands.create.CreateDatasetCommand.run") + def test_get_or_create_dataset_create_fails(self, command_run_mock): + """ + Dataset API: Test get or create endpoint when create fails + """ + command_run_mock.side_effect = DatasetCreateFailedError + self.login(username="admin") + rv = self.client.post( + "api/v1/dataset/get_or_create/", + json={ + "table_name": "virtual_dataset", + "database_id": get_example_database().id, + }, + ) + self.assertEqual(rv.status_code, 422) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(response["message"], "Dataset could not be created.") + + def test_get_or_create_dataset_creates_table(self): + """ + Dataset API: Test get or create endpoint when table is created + """ + self.login(username="admin") + + examples_db = get_example_database() + with examples_db.get_sqla_engine_with_context() as engine: + engine.execute("DROP TABLE IF EXISTS test_create_sqla_table_api") + engine.execute("CREATE TABLE test_create_sqla_table_api AS SELECT 2 as col") + + rv = self.client.post( + "api/v1/dataset/get_or_create/", + json={ + "table_name": "test_create_sqla_table_api", + "database_id": examples_db.id, + "template_params": '{"param": 1}', + }, + ) + self.assertEqual(rv.status_code, 200) + response = json.loads(rv.data.decode("utf-8")) + table = ( + db.session.query(SqlaTable) + .filter_by(table_name="test_create_sqla_table_api") + .one() + ) + self.assertEqual(response["result"], {"table_id": table.id}) + self.assertEqual(table.template_params, '{"param": 1}') - db.session.delete(virtual_dataset) + db.session.delete(table) + with examples_db.get_sqla_engine_with_context() as engine: + engine.execute("DROP TABLE test_create_sqla_table_api") db.session.commit() diff --git a/tests/integration_tests/datasets/commands_tests.py b/tests/integration_tests/datasets/commands_tests.py index 9498c911f266..0ce98477a0b2 100644 --- a/tests/integration_tests/datasets/commands_tests.py +++ b/tests/integration_tests/datasets/commands_tests.py @@ -20,13 +20,18 @@ import pytest import yaml +from sqlalchemy.exc import SQLAlchemyError from superset import db, security_manager from superset.commands.exceptions import CommandInvalidError from superset.commands.importers.exceptions import IncorrectVersionError from superset.connectors.sqla.models import SqlaTable from superset.databases.commands.importers.v1 import ImportDatabasesCommand -from superset.datasets.commands.exceptions import DatasetNotFoundError +from superset.datasets.commands.create import CreateDatasetCommand +from superset.datasets.commands.exceptions import ( + DatasetInvalidError, + DatasetNotFoundError, +) from superset.datasets.commands.export import ExportDatasetsCommand from superset.datasets.commands.importers import v0, v1 from superset.models.core import Database @@ -72,7 +77,7 @@ def test_export_dataset_command(self, mock_g): metadata = yaml.safe_load(contents["datasets/examples/energy_usage.yaml"]) - # sort columns for deterministc comparison + # sort columns for deterministic comparison metadata["columns"] = sorted(metadata["columns"], key=itemgetter("column_name")) metadata["metrics"] = sorted(metadata["metrics"], key=itemgetter("metric_name")) @@ -519,3 +524,47 @@ def _get_table_from_list_by_name(name: str, tables: List[Any]): if table.table_name == name: return table raise ValueError(f"Table {name} does not exists in database") + + +class TestCreateDatasetCommand(SupersetTestCase): + def test_database_not_found(self): + self.login(username="admin") + with self.assertRaises(DatasetInvalidError): + CreateDatasetCommand({"table_name": "table", "database": 9999}).run() + + @patch("superset.models.core.Database.get_table") + def test_get_table_from_database_error(self, get_table_mock): + self.login(username="admin") + get_table_mock.side_effect = SQLAlchemyError + with self.assertRaises(DatasetInvalidError): + CreateDatasetCommand( + {"table_name": "table", "database": get_example_database().id} + ).run() + + @patch("superset.security.manager.g") + @patch("superset.commands.utils.g") + def test_create_dataset_command(self, mock_g, mock_g2): + mock_g.user = security_manager.find_user("admin") + mock_g2.user = mock_g.user + examples_db = get_example_database() + with examples_db.get_sqla_engine_with_context() as engine: + engine.execute("DROP TABLE IF EXISTS test_create_dataset_command") + engine.execute( + "CREATE TABLE test_create_dataset_command AS SELECT 2 as col" + ) + + table = CreateDatasetCommand( + {"table_name": "test_create_dataset_command", "database": examples_db.id} + ).run() + fetched_table = ( + db.session.query(SqlaTable) + .filter_by(table_name="test_create_dataset_command") + .one() + ) + self.assertEqual(table, fetched_table) + self.assertEqual([owner.username for owner in table.owners], ["admin"]) + + db.session.delete(table) + with examples_db.get_sqla_engine_with_context() as engine: + engine.execute("DROP TABLE test_create_dataset_command") + db.session.commit() diff --git a/tests/integration_tests/datasets/model_tests.py b/tests/integration_tests/datasets/model_tests.py deleted file mode 100644 index 3bcc4c079310..000000000000 --- a/tests/integration_tests/datasets/model_tests.py +++ /dev/null @@ -1,87 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from unittest import mock - -import pytest -from sqlalchemy import inspect -from sqlalchemy.orm.exc import NoResultFound - -from superset.columns.models import Column -from superset.connectors.sqla.models import SqlaTable, TableColumn -from superset.extensions import db -from tests.integration_tests.base_tests import SupersetTestCase -from tests.integration_tests.fixtures.datasource import load_dataset_with_columns - - -class SqlaTableModelTest(SupersetTestCase): - @pytest.mark.usefixtures("load_dataset_with_columns") - def test_dual_update_column(self) -> None: - """ - Test that when updating a sqla ``TableColumn`` - That the shadow ``Column`` is also updated - """ - dataset = db.session.query(SqlaTable).filter_by(table_name="students").first() - column = dataset.columns[0] - column_name = column.column_name - column.column_name = "new_column_name" - SqlaTable.update_column(None, None, target=column) - - # refetch - dataset = db.session.query(SqlaTable).filter_by(id=dataset.id).one() - assert dataset.columns[0].column_name == "new_column_name" - - # reset - column.column_name = column_name - SqlaTable.update_column(None, None, target=column) - - @pytest.mark.usefixtures("load_dataset_with_columns") - @mock.patch("superset.columns.models.Column") - def test_dual_update_column_not_found(self, column_mock) -> None: - """ - Test that when updating a sqla ``TableColumn`` - That the shadow ``Column`` is also updated - """ - dataset = db.session.query(SqlaTable).filter_by(table_name="students").first() - column = dataset.columns[0] - column_uuid = column.uuid - with mock.patch("sqlalchemy.orm.query.Query.one", side_effect=NoResultFound): - SqlaTable.update_column(None, None, target=column) - - session = inspect(column).session - - session.flush() - - # refetch - dataset = db.session.query(SqlaTable).filter_by(id=dataset.id).one() - # it should create a new uuid - assert dataset.columns[0].uuid != column_uuid - - # reset - column.uuid = column_uuid - SqlaTable.update_column(None, None, target=column) - - @pytest.mark.usefixtures("load_dataset_with_columns") - def test_to_sl_column_no_known_columns(self) -> None: - """ - Test that the function returns a new column - """ - dataset = db.session.query(SqlaTable).filter_by(table_name="students").first() - column = dataset.columns[0] - new_column = column.to_sl_column() - - # it should use the same uuid - assert column.uuid == new_column.uuid diff --git a/tests/integration_tests/datasource/__init__.py b/tests/integration_tests/datasource/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/integration_tests/datasource/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/integration_tests/datasource/api_tests.py b/tests/integration_tests/datasource/api_tests.py new file mode 100644 index 000000000000..522aa33383e6 --- /dev/null +++ b/tests/integration_tests/datasource/api_tests.py @@ -0,0 +1,137 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import json +from unittest.mock import Mock, patch + +import pytest + +from superset import db, security_manager +from superset.connectors.sqla.models import SqlaTable +from superset.dao.exceptions import DatasourceTypeNotSupportedError +from tests.integration_tests.base_tests import SupersetTestCase + + +class TestDatasourceApi(SupersetTestCase): + def get_virtual_dataset(self): + return ( + db.session.query(SqlaTable) + .filter(SqlaTable.table_name == "virtual_dataset") + .one() + ) + + @pytest.mark.usefixtures("app_context", "virtual_dataset") + def test_get_column_values_ints(self): + self.login(username="admin") + table = self.get_virtual_dataset() + rv = self.client.get(f"api/v1/datasource/table/{table.id}/column/col1/values/") + self.assertEqual(rv.status_code, 200) + response = json.loads(rv.data.decode("utf-8")) + for val in range(10): + assert val in response["result"] + + @pytest.mark.usefixtures("app_context", "virtual_dataset") + def test_get_column_values_strs(self): + self.login(username="admin") + table = self.get_virtual_dataset() + rv = self.client.get(f"api/v1/datasource/table/{table.id}/column/col2/values/") + self.assertEqual(rv.status_code, 200) + response = json.loads(rv.data.decode("utf-8")) + for val in ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]: + assert val in response["result"] + + @pytest.mark.usefixtures("app_context", "virtual_dataset") + def test_get_column_values_floats(self): + self.login(username="admin") + table = self.get_virtual_dataset() + rv = self.client.get(f"api/v1/datasource/table/{table.id}/column/col3/values/") + self.assertEqual(rv.status_code, 200) + response = json.loads(rv.data.decode("utf-8")) + for val in [1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9]: + assert val in response["result"] + + @pytest.mark.usefixtures("app_context", "virtual_dataset") + def test_get_column_values_nulls(self): + self.login(username="admin") + table = self.get_virtual_dataset() + rv = self.client.get(f"api/v1/datasource/table/{table.id}/column/col4/values/") + self.assertEqual(rv.status_code, 200) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(response["result"], [None]) + + @pytest.mark.usefixtures("app_context", "virtual_dataset") + def test_get_column_values_invalid_datasource_type(self): + self.login(username="admin") + table = self.get_virtual_dataset() + rv = self.client.get( + f"api/v1/datasource/not_table/{table.id}/column/col1/values/" + ) + self.assertEqual(rv.status_code, 400) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(response["message"], "Invalid datasource type: not_table") + + @patch("superset.datasource.api.DatasourceDAO.get_datasource") + def test_get_column_values_datasource_type_not_supported(self, get_datasource_mock): + get_datasource_mock.side_effect = DatasourceTypeNotSupportedError + self.login(username="admin") + rv = self.client.get("api/v1/datasource/table/1/column/col1/values/") + self.assertEqual(rv.status_code, 400) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual( + response["message"], "DAO datasource query source type is not supported" + ) + + def test_get_column_values_datasource_not_found(self): + self.login(username="admin") + rv = self.client.get("api/v1/datasource/table/999/column/col1/values/") + self.assertEqual(rv.status_code, 404) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(response["message"], "Datasource does not exist") + + @pytest.mark.usefixtures("app_context", "virtual_dataset") + def test_get_column_values_no_datasource_access(self): + # Allow gamma user to use this endpoint, but does not have datasource access + perm = security_manager.find_permission_view_menu( + "can_get_column_values", "Datasource" + ) + gamma_role = security_manager.find_role("Gamma") + security_manager.add_permission_role(gamma_role, perm) + + self.login(username="gamma") + table = self.get_virtual_dataset() + rv = self.client.get(f"api/v1/datasource/table/{table.id}/column/col1/values/") + self.assertEqual(rv.status_code, 403) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual( + response["message"], + "This endpoint requires the datasource virtual_dataset, " + "database or `all_datasource_access` permission", + ) + + @patch("superset.datasource.api.DatasourceDAO.get_datasource") + def test_get_column_values_not_implemented_error(self, get_datasource_mock): + datasource = Mock() + datasource.values_for_column.side_effect = NotImplementedError + get_datasource_mock.return_value = datasource + + self.login(username="admin") + rv = self.client.get("api/v1/datasource/sl_table/1/column/col1/values/") + self.assertEqual(rv.status_code, 400) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual( + response["message"], + "Unable to get column values for datasource type: sl_table", + ) diff --git a/tests/integration_tests/datasource_tests.py b/tests/integration_tests/datasource_tests.py index 19cc35c5c1bc..52bd9ec244cc 100644 --- a/tests/integration_tests/datasource_tests.py +++ b/tests/integration_tests/datasource_tests.py @@ -22,13 +22,16 @@ import prison import pytest -from superset import app, ConnectorRegistry, db -from superset.connectors.sqla.models import SqlaTable +from superset import app, db +from superset.common.utils.query_cache_manager import QueryCacheManager +from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn +from superset.constants import CacheRegion +from superset.dao.exceptions import DatasourceNotFound, DatasourceTypeNotSupportedError from superset.datasets.commands.exceptions import DatasetNotFoundError from superset.exceptions import SupersetGenericDBErrorException from superset.models.core import Database -from superset.utils.core import get_example_default_schema -from superset.utils.database import get_example_database +from superset.utils.core import backend, get_example_default_schema +from superset.utils.database import get_example_database, get_main_database from tests.integration_tests.base_tests import db_insert_temp_object, SupersetTestCase from tests.integration_tests.fixtures.birth_names_dashboard import ( load_birth_names_dashboard_with_slices, @@ -42,18 +45,17 @@ def create_test_table_context(database: Database): schema = get_example_default_schema() full_table_name = f"{schema}.test_table" if schema else "test_table" - database.get_sqla_engine().execute( - f"CREATE TABLE IF NOT EXISTS {full_table_name} AS SELECT 1 as first, 2 as second" - ) - database.get_sqla_engine().execute( - f"INSERT INTO {full_table_name} (first, second) VALUES (1, 2)" - ) - database.get_sqla_engine().execute( - f"INSERT INTO {full_table_name} (first, second) VALUES (3, 4)" - ) + with database.get_sqla_engine_with_context() as engine: + engine.execute( + f"CREATE TABLE IF NOT EXISTS {full_table_name} AS SELECT 1 as first, 2 as second" + ) + engine.execute(f"INSERT INTO {full_table_name} (first, second) VALUES (1, 2)") + engine.execute(f"INSERT INTO {full_table_name} (first, second) VALUES (3, 4)") yield db.session - database.get_sqla_engine().execute(f"DROP TABLE {full_table_name}") + + with database.get_sqla_engine_with_context() as engine: + engine.execute(f"DROP TABLE {full_table_name}") class TestDatasource(SupersetTestCase): @@ -231,7 +233,7 @@ def test_external_metadata_for_malicious_virtual_table(self): resp = self.get_json_resp(url) self.assertEqual(resp["error"], "Only `SELECT` statements are allowed") - def test_external_metadata_for_mutistatement_virtual_table(self): + def test_external_metadata_for_multistatement_virtual_table(self): self.login(username="admin") table = SqlaTable( table_name="multistatement_sql_table", @@ -256,9 +258,10 @@ def test_external_metadata_error_return_400(self, mock_get_datasource): pytest.raises( SupersetGenericDBErrorException, - lambda: ConnectorRegistry.get_datasource( - "table", tbl.id, db.session - ).external_metadata(), + lambda: db.session.query(SqlaTable) + .filter_by(id=tbl.id) + .one_or_none() + .external_metadata(), ) resp = self.client.get(url) @@ -288,6 +291,8 @@ def test_save(self): self.compare_lists(datasource_post[k], resp[k], "metric_name") elif k == "database": self.assertEqual(resp[k]["id"], datasource_post[k]["id"]) + elif k == "owners": + self.assertEqual([o["id"] for o in resp[k]], datasource_post["owners"]) else: print(k) self.assertEqual(resp[k], datasource_post[k]) @@ -423,21 +428,262 @@ def my_check(datasource): app.config["DATASET_HEALTH_CHECK"] = my_check self.login(username="admin") tbl = self.get_table(name="birth_names") - datasource = ConnectorRegistry.get_datasource("table", tbl.id, db.session) + datasource = db.session.query(SqlaTable).filter_by(id=tbl.id).one_or_none() assert datasource.health_check_message == "Warning message!" app.config["DATASET_HEALTH_CHECK"] = None def test_get_datasource_failed(self): + from superset.datasource.dao import DatasourceDAO + pytest.raises( - DatasetNotFoundError, - lambda: ConnectorRegistry.get_datasource("table", 9999999, db.session), + DatasourceNotFound, + lambda: DatasourceDAO.get_datasource(db.session, "table", 9999999), ) self.login(username="admin") - resp = self.get_json_resp("/datasource/get/druid/500000/", raise_on_error=False) - self.assertEqual(resp.get("error"), "Dataset does not exist") + resp = self.get_json_resp("/datasource/get/table/500000/", raise_on_error=False) + self.assertEqual(resp.get("error"), "Datasource does not exist") + + def test_get_datasource_invalid_datasource_failed(self): + from superset.datasource.dao import DatasourceDAO - resp = self.get_json_resp( - "/datasource/get/invalid-datasource-type/500000/", raise_on_error=False + pytest.raises( + DatasourceTypeNotSupportedError, + lambda: DatasourceDAO.get_datasource(db.session, "druid", 9999999), ) - self.assertEqual(resp.get("error"), "Dataset does not exist") + + self.login(username="admin") + resp = self.get_json_resp("/datasource/get/druid/500000/", raise_on_error=False) + self.assertEqual(resp.get("error"), "'druid' is not a valid DatasourceType") + + +def test_get_samples(test_client, login_as_admin, virtual_dataset): + """ + Dataset API: Test get dataset samples + """ + # 1. should cache data + uri = ( + f"/datasource/samples?datasource_id={virtual_dataset.id}&datasource_type=table" + ) + # feeds data + test_client.post(uri, json={}) + # get from cache + rv = test_client.post(uri, json={}) + assert rv.status_code == 200 + assert len(rv.json["result"]["data"]) == 10 + assert QueryCacheManager.has( + rv.json["result"]["cache_key"], + region=CacheRegion.DATA, + ) + assert rv.json["result"]["is_cached"] + + # 2. should read through cache data + uri2 = f"/datasource/samples?datasource_id={virtual_dataset.id}&datasource_type=table&force=true" + # feeds data + test_client.post(uri2, json={}) + # force query + rv2 = test_client.post(uri2, json={}) + assert rv2.status_code == 200 + assert len(rv2.json["result"]["data"]) == 10 + assert QueryCacheManager.has( + rv2.json["result"]["cache_key"], + region=CacheRegion.DATA, + ) + assert not rv2.json["result"]["is_cached"] + + # 3. data precision + assert "colnames" in rv2.json["result"] + assert "coltypes" in rv2.json["result"] + assert "data" in rv2.json["result"] + + eager_samples = virtual_dataset.database.get_df( + f"select * from ({virtual_dataset.sql}) as tbl" + f' limit {app.config["SAMPLES_ROW_LIMIT"]}' + ) + # the col3 is Decimal + eager_samples["col3"] = eager_samples["col3"].apply(float) + eager_samples = eager_samples.to_dict(orient="records") + assert eager_samples == rv2.json["result"]["data"] + + +def test_get_samples_with_incorrect_cc(test_client, login_as_admin, virtual_dataset): + TableColumn( + column_name="DUMMY CC", + type="VARCHAR(255)", + table=virtual_dataset, + expression="INCORRECT SQL", + ) + db.session.merge(virtual_dataset) + + uri = ( + f"/datasource/samples?datasource_id={virtual_dataset.id}&datasource_type=table" + ) + rv = test_client.post(uri, json={}) + assert rv.status_code == 422 + + assert "error" in rv.json + if virtual_dataset.database.db_engine_spec.engine_name == "PostgreSQL": + assert "INCORRECT SQL" in rv.json.get("error") + + +def test_get_samples_on_physical_dataset(test_client, login_as_admin, physical_dataset): + uri = ( + f"/datasource/samples?datasource_id={physical_dataset.id}&datasource_type=table" + ) + rv = test_client.post(uri, json={}) + assert rv.status_code == 200 + assert QueryCacheManager.has( + rv.json["result"]["cache_key"], region=CacheRegion.DATA + ) + assert len(rv.json["result"]["data"]) == 10 + + +def test_get_samples_with_filters(test_client, login_as_admin, virtual_dataset): + uri = ( + f"/datasource/samples?datasource_id={virtual_dataset.id}&datasource_type=table" + ) + rv = test_client.post(uri, json=None) + assert rv.status_code == 400 + + rv = test_client.post(uri, json={}) + assert rv.status_code == 200 + + rv = test_client.post(uri, json={"foo": "bar"}) + assert rv.status_code == 400 + + rv = test_client.post( + uri, json={"filters": [{"col": "col1", "op": "INVALID", "val": 0}]} + ) + assert rv.status_code == 400 + + rv = test_client.post( + uri, + json={ + "filters": [ + {"col": "col2", "op": "==", "val": "a"}, + {"col": "col1", "op": "==", "val": 0}, + ] + }, + ) + assert rv.status_code == 200 + assert rv.json["result"]["colnames"] == ["col1", "col2", "col3", "col4", "col5"] + assert rv.json["result"]["rowcount"] == 1 + + # empty results + rv = test_client.post( + uri, + json={ + "filters": [ + {"col": "col2", "op": "==", "val": "x"}, + ] + }, + ) + assert rv.status_code == 200 + assert rv.json["result"]["colnames"] == [] + assert rv.json["result"]["rowcount"] == 0 + + +def test_get_samples_with_time_filter(test_client, login_as_admin, physical_dataset): + uri = ( + f"/datasource/samples?datasource_id={physical_dataset.id}&datasource_type=table" + ) + payload = { + "granularity": "col5", + "time_range": "2000-01-02 : 2000-01-04", + } + rv = test_client.post(uri, json=payload) + assert len(rv.json["result"]["data"]) == 2 + if physical_dataset.database.backend != "sqlite": + assert [row["col5"] for row in rv.json["result"]["data"]] == [ + 946771200000.0, # 2000-01-02 00:00:00 + 946857600000.0, # 2000-01-03 00:00:00 + ] + assert rv.json["result"]["page"] == 1 + assert rv.json["result"]["per_page"] == app.config["SAMPLES_ROW_LIMIT"] + assert rv.json["result"]["total_count"] == 2 + + +def test_get_samples_with_multiple_filters( + test_client, login_as_admin, physical_dataset +): + # 1. empty response + uri = ( + f"/datasource/samples?datasource_id={physical_dataset.id}&datasource_type=table" + ) + payload = { + "granularity": "col5", + "time_range": "2000-01-02 : 2000-01-04", + "filters": [ + {"col": "col4", "op": "IS NOT NULL"}, + ], + } + rv = test_client.post(uri, json=payload) + assert len(rv.json["result"]["data"]) == 0 + + # 2. adhoc filters, time filters, and custom where + payload = { + "granularity": "col5", + "time_range": "2000-01-02 : 2000-01-04", + "filters": [ + {"col": "col2", "op": "==", "val": "c"}, + ], + "extras": {"where": "col3 = 1.2 and col4 is null"}, + } + rv = test_client.post(uri, json=payload) + assert len(rv.json["result"]["data"]) == 1 + assert rv.json["result"]["total_count"] == 1 + assert "2000-01-02" in rv.json["result"]["query"] + assert "2000-01-04" in rv.json["result"]["query"] + assert "col3 = 1.2" in rv.json["result"]["query"] + assert "col4 is null" in rv.json["result"]["query"] + assert "col2 = 'c'" in rv.json["result"]["query"] + + +def test_get_samples_pagination(test_client, login_as_admin, virtual_dataset): + # 1. default page, per_page and total_count + uri = ( + f"/datasource/samples?datasource_id={virtual_dataset.id}&datasource_type=table" + ) + rv = test_client.post(uri, json={}) + assert rv.json["result"]["page"] == 1 + assert rv.json["result"]["per_page"] == app.config["SAMPLES_ROW_LIMIT"] + assert rv.json["result"]["total_count"] == 10 + + # 2. incorrect per_page + per_pages = (app.config["SAMPLES_ROW_LIMIT"] + 1, 0, "xx") + for per_page in per_pages: + uri = f"/datasource/samples?datasource_id={virtual_dataset.id}&datasource_type=table&per_page={per_page}" + rv = test_client.post(uri, json={}) + assert rv.status_code == 400 + + # 3. incorrect page or datasource_type + uri = f"/datasource/samples?datasource_id={virtual_dataset.id}&datasource_type=table&page=xx" + rv = test_client.post(uri, json={}) + assert rv.status_code == 400 + + uri = f"/datasource/samples?datasource_id={virtual_dataset.id}&datasource_type=xx" + rv = test_client.post(uri, json={}) + assert rv.status_code == 400 + + # 4. turning pages + uri = f"/datasource/samples?datasource_id={virtual_dataset.id}&datasource_type=table&per_page=2&page=1" + rv = test_client.post(uri, json={}) + assert rv.json["result"]["page"] == 1 + assert rv.json["result"]["per_page"] == 2 + assert rv.json["result"]["total_count"] == 10 + assert [row["col1"] for row in rv.json["result"]["data"]] == [0, 1] + + uri = f"/datasource/samples?datasource_id={virtual_dataset.id}&datasource_type=table&per_page=2&page=2" + rv = test_client.post(uri, json={}) + assert rv.json["result"]["page"] == 2 + assert rv.json["result"]["per_page"] == 2 + assert rv.json["result"]["total_count"] == 10 + assert [row["col1"] for row in rv.json["result"]["data"]] == [2, 3] + + # 5. Exceeding the maximum pages + uri = f"/datasource/samples?datasource_id={virtual_dataset.id}&datasource_type=table&per_page=2&page=6" + rv = test_client.post(uri, json={}) + assert rv.json["result"]["page"] == 6 + assert rv.json["result"]["per_page"] == 2 + assert rv.json["result"]["total_count"] == 10 + assert [row["col1"] for row in rv.json["result"]["data"]] == [] diff --git a/tests/integration_tests/db_engine_specs/base_engine_spec_tests.py b/tests/integration_tests/db_engine_specs/base_engine_spec_tests.py index c4432e3ad1f9..87de98db1c1d 100644 --- a/tests/integration_tests/db_engine_specs/base_engine_spec_tests.py +++ b/tests/integration_tests/db_engine_specs/base_engine_spec_tests.py @@ -20,7 +20,7 @@ import pytest from superset.connectors.sqla.models import TableColumn -from superset.db_engine_specs import get_engine_specs +from superset.db_engine_specs import load_engine_specs from superset.db_engine_specs.base import ( BaseEngineSpec, BasicParametersMixin, @@ -195,7 +195,7 @@ class DummyEngineSpec(BaseEngineSpec): def test_engine_time_grain_validity(self): time_grains = set(builtin_time_grains.keys()) # loop over all subclasses of BaseEngineSpec - for engine in get_engine_specs().values(): + for engine in load_engine_specs(): if engine is not BaseEngineSpec: # make sure time grain functions have been defined self.assertGreater(len(engine.get_time_grain_expressions()), 0) @@ -229,11 +229,11 @@ def test_get_table_names(self): """ Make sure base engine spec removes schema name from table name ie. when try_remove_schema_from_table_name == True. """ - base_result_expected = ["table", "table_2"] + base_result_expected = {"table", "table_2"} base_result = BaseEngineSpec.get_table_names( database=mock.ANY, schema="schema", inspector=inspector ) - self.assertListEqual(base_result_expected, base_result) + assert base_result_expected == base_result @pytest.mark.usefixtures("load_energy_table_with_slice") def test_column_datatype_to_string(self): @@ -293,8 +293,8 @@ def test_calculated_column_in_order_by_base_engine_spec(self): table=table, expression=""" case - when gender=true then "male" - else "female" + when gender='boy' then 'male' + else 'female' end """, ) @@ -309,8 +309,8 @@ def test_calculated_column_in_order_by_base_engine_spec(self): sql = table.get_query_str(query_obj) assert ( """ORDER BY case - when gender=true then "male" - else "female" + when gender='boy' then 'male' + else 'female' end ASC;""" in sql ) @@ -395,7 +395,7 @@ def test_get_time_grain_with_config(): app.config = config -def test_get_time_grain_with_unkown_values(): +def test_get_time_grain_with_unknown_values(): """Should concatenate from configs and then sort in the proper order putting unknown patterns at the end""" config = app.config.copy() @@ -421,28 +421,32 @@ def test_validate(is_port_open, is_hostname_valid): is_hostname_valid.return_value = True is_port_open.return_value = True - parameters = { - "host": "localhost", - "port": 5432, - "username": "username", - "password": "password", - "database": "dbname", - "query": {"sslmode": "verify-full"}, + properties = { + "parameters": { + "host": "localhost", + "port": 5432, + "username": "username", + "password": "password", + "database": "dbname", + "query": {"sslmode": "verify-full"}, + } } - errors = BasicParametersMixin.validate_parameters(parameters) + errors = BasicParametersMixin.validate_parameters(properties) assert errors == [] def test_validate_parameters_missing(): - parameters = { - "host": "", - "port": None, - "username": "", - "password": "", - "database": "", - "query": {}, + properties = { + "parameters": { + "host": "", + "port": None, + "username": "", + "password": "", + "database": "", + "query": {}, + } } - errors = BasicParametersMixin.validate_parameters(parameters) + errors = BasicParametersMixin.validate_parameters(properties) assert errors == [ SupersetError( message=( @@ -459,15 +463,17 @@ def test_validate_parameters_missing(): def test_validate_parameters_invalid_host(is_hostname_valid): is_hostname_valid.return_value = False - parameters = { - "host": "localhost", - "port": None, - "username": "username", - "password": "password", - "database": "dbname", - "query": {"sslmode": "verify-full"}, + properties = { + "parameters": { + "host": "localhost", + "port": None, + "username": "username", + "password": "password", + "database": "dbname", + "query": {"sslmode": "verify-full"}, + } } - errors = BasicParametersMixin.validate_parameters(parameters) + errors = BasicParametersMixin.validate_parameters(properties) assert errors == [ SupersetError( message="One or more parameters are missing: port", @@ -490,15 +496,17 @@ def test_validate_parameters_port_closed(is_port_open, is_hostname_valid): is_hostname_valid.return_value = True is_port_open.return_value = False - parameters = { - "host": "localhost", - "port": 5432, - "username": "username", - "password": "password", - "database": "dbname", - "query": {"sslmode": "verify-full"}, + properties = { + "parameters": { + "host": "localhost", + "port": 5432, + "username": "username", + "password": "password", + "database": "dbname", + "query": {"sslmode": "verify-full"}, + } } - errors = BasicParametersMixin.validate_parameters(parameters) + errors = BasicParametersMixin.validate_parameters(properties) assert errors == [ SupersetError( message="The port is closed.", diff --git a/tests/integration_tests/db_engine_specs/base_tests.py b/tests/integration_tests/db_engine_specs/base_tests.py index 6496d4609ab8..e20ea35ae413 100644 --- a/tests/integration_tests/db_engine_specs/base_tests.py +++ b/tests/integration_tests/db_engine_specs/base_tests.py @@ -22,7 +22,6 @@ from tests.integration_tests.base_tests import SupersetTestCase from superset.db_engine_specs.base import BaseEngineSpec from superset.models.core import Database -from superset.utils.core import GenericDataType class TestDbEngineSpec(SupersetTestCase): @@ -37,16 +36,3 @@ def sql_limit_regex( main = Database(database_name="test_database", sqlalchemy_uri="sqlite://") limited = engine_spec_class.apply_limit_to_sql(sql, limit, main, force) self.assertEqual(expected_sql, limited) - - -def assert_generic_types( - spec: Type[BaseEngineSpec], - type_expectations: Tuple[Tuple[str, GenericDataType], ...], -) -> None: - for type_str, expected_type in type_expectations: - column_spec = spec.get_column_spec(type_str) - assert column_spec is not None - actual_type = column_spec.generic_type - assert ( - actual_type == expected_type - ), f"{type_str} should be {expected_type.name} but is {actual_type.name}" diff --git a/tests/integration_tests/db_engine_specs/bigquery_tests.py b/tests/integration_tests/db_engine_specs/bigquery_tests.py index 549b1109529e..574a2b75e32c 100644 --- a/tests/integration_tests/db_engine_specs/bigquery_tests.py +++ b/tests/integration_tests/db_engine_specs/bigquery_tests.py @@ -48,23 +48,6 @@ def test_bigquery_sqla_column_label(self): actual = BigQueryEngineSpec.make_label_compatible(column(original).name) self.assertEqual(actual, expected) - def test_convert_dttm(self): - """ - DB Eng Specs (bigquery): Test conversion to date time - """ - dttm = self.get_dttm() - test_cases = { - "DATE": "CAST('2019-01-02' AS DATE)", - "DATETIME": "CAST('2019-01-02T03:04:05.678900' AS DATETIME)", - "TIMESTAMP": "CAST('2019-01-02T03:04:05.678900' AS TIMESTAMP)", - "TIME": "CAST('03:04:05.678900' AS TIME)", - "UNKNOWNTYPE": None, - } - - for target_type, expected in test_cases.items(): - actual = BigQueryEngineSpec.convert_dttm(target_type, dttm) - self.assertEqual(actual, expected) - def test_timegrain_expressions(self): """ DB Eng Specs (bigquery): Test time grain expressions @@ -77,8 +60,9 @@ def test_timegrain_expressions(self): "TIMESTAMP": "TIMESTAMP_TRUNC(temporal, HOUR)", } for type_, expected in test_cases.items(): + col.type = type_ actual = BigQueryEngineSpec.get_timestamp_expr( - col=col, pdf=None, time_grain="PT1H", type_=type_ + col=col, pdf=None, time_grain="PT1H" ) self.assertEqual(str(actual), expected) @@ -99,8 +83,9 @@ def test_custom_minute_timegrain_expressions(self): ") AS TIMESTAMP)", } for type_, expected in test_cases.items(): + col.type = type_ actual = BigQueryEngineSpec.get_timestamp_expr( - col=col, pdf=None, time_grain="PT5M", type_=type_ + col=col, pdf=None, time_grain="PT5M" ) assert str(actual) == expected @@ -225,8 +210,10 @@ def test_df_to_sql(self, mock_get_engine): return_value="account_info" ) - mock_get_engine.return_value.url.host = "google-host" - mock_get_engine.return_value.dialect.credentials_info = "secrets" + mock_get_engine.return_value.__enter__.return_value.url.host = "google-host" + mock_get_engine.return_value.__enter__.return_value.dialect.credentials_info = ( + "secrets" + ) BigQueryEngineSpec.df_to_sql( database=database, @@ -244,11 +231,11 @@ def test_df_to_sql(self, mock_get_engine): ) def test_extract_errors(self): - msg = "403 POST https://bigquery.googleapis.com/bigquery/v2/projects/test-keel-310804/jobs?prettyPrint=false: Access Denied: Project User does not have bigquery.jobs.create permission in project profound-keel-310804" + msg = "403 POST https://bigquery.googleapis.com/bigquery/v2/projects/test-keel-310804/jobs?prettyPrint=false: Access Denied: Project profound-keel-310804: User does not have bigquery.jobs.create permission in project profound-keel-310804" result = BigQueryEngineSpec.extract_errors(Exception(msg)) assert result == [ SupersetError( - message="We were unable to connect to your database. Please confirm that your service account has the Viewer and Job User roles on the project.", + message='Unable to connect. Verify that the following roles are set on the service account: "BigQuery Data Viewer", "BigQuery Metadata Viewer", "BigQuery Job User" and the following permissions are set "bigquery.readsessions.create", "bigquery.readsessions.getData"', error_type=SupersetErrorType.CONNECTION_DATABASE_PERMISSIONS_ERROR, level=ErrorLevel.ERROR, extra={ @@ -352,7 +339,7 @@ def test_extract_errors(self): ] @mock.patch("superset.models.core.Database.db_engine_spec", BigQueryEngineSpec) - @mock.patch("pybigquery._helpers.create_bigquery_client", mock.Mock) + @mock.patch("sqlalchemy_bigquery._helpers.create_bigquery_client", mock.Mock) @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_calculated_column_in_order_by(self): table = self.get_table(name="birth_names") @@ -362,8 +349,8 @@ def test_calculated_column_in_order_by(self): table=table, expression=""" case - when gender=true then "male" - else "female" + when gender='boy' then 'male' + else 'female' end """, ) diff --git a/tests/integration_tests/db_engine_specs/clickhouse_tests.py b/tests/integration_tests/db_engine_specs/clickhouse_tests.py deleted file mode 100644 index c8019a8758db..000000000000 --- a/tests/integration_tests/db_engine_specs/clickhouse_tests.py +++ /dev/null @@ -1,47 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from unittest import mock - -import pytest - -from superset.db_engine_specs.clickhouse import ClickHouseEngineSpec -from superset.db_engine_specs.exceptions import SupersetDBAPIDatabaseError -from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec - - -class TestClickHouseDbEngineSpec(TestDbEngineSpec): - def test_convert_dttm(self): - dttm = self.get_dttm() - - self.assertEqual( - ClickHouseEngineSpec.convert_dttm("DATE", dttm), "toDate('2019-01-02')" - ) - - self.assertEqual( - ClickHouseEngineSpec.convert_dttm("DATETIME", dttm), - "toDateTime('2019-01-02 03:04:05')", - ) - - def test_execute_connection_error(self): - from urllib3.exceptions import NewConnectionError - - cursor = mock.Mock() - cursor.execute.side_effect = NewConnectionError( - "Dummypool", message="Exception with sensitive data" - ) - with pytest.raises(SupersetDBAPIDatabaseError) as ex: - ClickHouseEngineSpec.execute(cursor, "SELECT col1 from table1") diff --git a/tests/integration_tests/db_engine_specs/crate_tests.py b/tests/integration_tests/db_engine_specs/crate_tests.py deleted file mode 100644 index 7c86b34b335f..000000000000 --- a/tests/integration_tests/db_engine_specs/crate_tests.py +++ /dev/null @@ -1,53 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from superset.connectors.sqla.models import SqlaTable, TableColumn -from superset.db_engine_specs.crate import CrateEngineSpec -from superset.models.core import Database -from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec - - -class TestCrateDbEngineSpec(TestDbEngineSpec): - def test_convert_dttm(self): - """ - DB Eng Specs (crate): Test conversion to date time - """ - dttm = self.get_dttm() - assert CrateEngineSpec.convert_dttm("TIMESTAMP", dttm) == str( - dttm.timestamp() * 1000 - ) - - def test_epoch_to_dttm(self): - """ - DB Eng Specs (crate): Test epoch to dttm - """ - assert CrateEngineSpec.epoch_to_dttm() == "{col} * 1000" - - def test_epoch_ms_to_dttm(self): - """ - DB Eng Specs (crate): Test epoch ms to dttm - """ - assert CrateEngineSpec.epoch_ms_to_dttm() == "{col}" - - def test_alter_new_orm_column(self): - """ - DB Eng Specs (crate): Test alter orm column - """ - database = Database(database_name="crate", sqlalchemy_uri="crate://db") - tbl = SqlaTable(table_name="druid_tbl", database=database) - col = TableColumn(column_name="ts", type="TIMESTAMP", table=tbl) - CrateEngineSpec.alter_new_orm_column(col) - assert col.python_date_format == "epoch_ms" diff --git a/tests/integration_tests/db_engine_specs/databricks_tests.py b/tests/integration_tests/db_engine_specs/databricks_tests.py new file mode 100644 index 000000000000..5ff20b7347af --- /dev/null +++ b/tests/integration_tests/db_engine_specs/databricks_tests.py @@ -0,0 +1,61 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from unittest import mock + +from superset.db_engine_specs import get_engine_spec +from superset.db_engine_specs.databricks import DatabricksNativeEngineSpec +from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec +from tests.integration_tests.fixtures.certificates import ssl_certificate +from tests.integration_tests.fixtures.database import default_db_extra + + +class TestDatabricksDbEngineSpec(TestDbEngineSpec): + def test_get_engine_spec(self): + """ + DB Eng Specs (databricks): Test "databricks" in engine spec + """ + assert get_engine_spec("databricks", "connector").engine == "databricks" + assert get_engine_spec("databricks", "pyodbc").engine == "databricks" + assert get_engine_spec("databricks", "pyhive").engine == "databricks" + + def test_extras_without_ssl(self): + db = mock.Mock() + db.extra = default_db_extra + db.server_cert = None + extras = DatabricksNativeEngineSpec.get_extra_params(db) + assert extras == { + "engine_params": { + "connect_args": { + "_user_agent_entry": "Apache Superset", + "http_headers": [("User-Agent", "Apache Superset")], + }, + }, + "metadata_cache_timeout": {}, + "metadata_params": {}, + "schemas_allowed_for_file_upload": [], + } + + def test_extras_with_ssl_custom(self): + db = mock.Mock() + db.extra = default_db_extra.replace( + '"engine_params": {}', + '"engine_params": {"connect_args": {"ssl": "1"}}', + ) + db.server_cert = ssl_certificate + extras = DatabricksNativeEngineSpec.get_extra_params(db) + connect_args = extras["engine_params"]["connect_args"] + assert connect_args["ssl"] == "1" diff --git a/tests/integration_tests/db_engine_specs/druid_tests.py b/tests/integration_tests/db_engine_specs/druid_tests.py deleted file mode 100644 index 232787ba6185..000000000000 --- a/tests/integration_tests/db_engine_specs/druid_tests.py +++ /dev/null @@ -1,78 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from unittest import mock - -from sqlalchemy import column - -from superset.db_engine_specs.druid import DruidEngineSpec -from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec -from tests.integration_tests.fixtures.certificates import ssl_certificate -from tests.integration_tests.fixtures.database import default_db_extra - - -class TestDruidDbEngineSpec(TestDbEngineSpec): - def test_convert_dttm(self): - dttm = self.get_dttm() - - self.assertEqual( - DruidEngineSpec.convert_dttm("DATETIME", dttm), - "TIME_PARSE('2019-01-02T03:04:05')", - ) - - self.assertEqual( - DruidEngineSpec.convert_dttm("TIMESTAMP", dttm), - "TIME_PARSE('2019-01-02T03:04:05')", - ) - - self.assertEqual( - DruidEngineSpec.convert_dttm("DATE", dttm), - "CAST(TIME_PARSE('2019-01-02') AS DATE)", - ) - - def test_timegrain_expressions(self): - """ - DB Eng Specs (druid): Test time grain expressions - """ - col = "__time" - sqla_col = column(col) - test_cases = { - "PT1S": f"TIME_FLOOR(CAST({col} AS TIMESTAMP), 'PT1S')", - "PT5M": f"TIME_FLOOR(CAST({col} AS TIMESTAMP), 'PT5M')", - "P1W/1970-01-03T00:00:00Z": f"TIME_SHIFT(TIME_FLOOR(TIME_SHIFT(CAST({col} AS TIMESTAMP), 'P1D', 1), 'P1W'), 'P1D', 5)", - "1969-12-28T00:00:00Z/P1W": f"TIME_SHIFT(TIME_FLOOR(TIME_SHIFT(CAST({col} AS TIMESTAMP), 'P1D', 1), 'P1W'), 'P1D', -1)", - } - for grain, expected in test_cases.items(): - actual = DruidEngineSpec.get_timestamp_expr( - col=sqla_col, pdf=None, time_grain=grain - ) - self.assertEqual(str(actual), expected) - - def test_extras_without_ssl(self): - db = mock.Mock() - db.extra = default_db_extra - db.server_cert = None - extras = DruidEngineSpec.get_extra_params(db) - assert "connect_args" not in extras["engine_params"] - - def test_extras_with_ssl(self): - db = mock.Mock() - db.extra = default_db_extra - db.server_cert = ssl_certificate - extras = DruidEngineSpec.get_extra_params(db) - connect_args = extras["engine_params"]["connect_args"] - assert connect_args["scheme"] == "https" - assert "ssl_verify_cert" in connect_args diff --git a/tests/integration_tests/db_engine_specs/elasticsearch_tests.py b/tests/integration_tests/db_engine_specs/elasticsearch_tests.py deleted file mode 100644 index 7dd5157792ac..000000000000 --- a/tests/integration_tests/db_engine_specs/elasticsearch_tests.py +++ /dev/null @@ -1,104 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from unittest.mock import MagicMock - -import pytest -from sqlalchemy import column - -from superset.db_engine_specs.elasticsearch import ( - ElasticSearchEngineSpec, - OpenDistroEngineSpec, -) -from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec - - -class TestElasticSearchDbEngineSpec(TestDbEngineSpec): - @pytest.fixture(autouse=True) - def inject_fixtures(self, caplog): - self._caplog = caplog - - def test_convert_dttm(self): - dttm = self.get_dttm() - - self.assertEqual( - ElasticSearchEngineSpec.convert_dttm("DATETIME", dttm, db_extra=None), - "CAST('2019-01-02T03:04:05' AS DATETIME)", - ) - - def test_convert_dttm2(self): - """ - ES 7.8 and above versions need to use the DATETIME_PARSE function to - solve the time zone problem - """ - dttm = self.get_dttm() - db_extra = {"version": "7.8"} - - self.assertEqual( - ElasticSearchEngineSpec.convert_dttm("DATETIME", dttm, db_extra=db_extra), - "DATETIME_PARSE('2019-01-02 03:04:05', 'yyyy-MM-dd HH:mm:ss')", - ) - - def test_convert_dttm3(self): - dttm = self.get_dttm() - db_extra = {"version": 7.8} - - self.assertEqual( - ElasticSearchEngineSpec.convert_dttm("DATETIME", dttm, db_extra=db_extra), - "CAST('2019-01-02T03:04:05' AS DATETIME)", - ) - - self.assertNotEqual( - ElasticSearchEngineSpec.convert_dttm("DATETIME", dttm, db_extra=db_extra), - "DATETIME_PARSE('2019-01-02 03:04:05', 'yyyy-MM-dd HH:mm:ss')", - ) - - self.assertIn("Unexpected error while convert es_version", self._caplog.text) - - def test_opendistro_convert_dttm(self): - """ - DB Eng Specs (opendistro): Test convert_dttm - """ - dttm = self.get_dttm() - - self.assertEqual( - OpenDistroEngineSpec.convert_dttm("DATETIME", dttm, db_extra=None), - "'2019-01-02T03:04:05'", - ) - - def test_opendistro_sqla_column_label(self): - """ - DB Eng Specs (opendistro): Test column label - """ - test_cases = { - "Col": "Col", - "Col.keyword": "Col_keyword", - } - for original, expected in test_cases.items(): - actual = OpenDistroEngineSpec.make_label_compatible(column(original).name) - self.assertEqual(actual, expected) - - def test_opendistro_strip_comments(self): - """ - DB Eng Specs (opendistro): Test execute sql strip comments - """ - mock_cursor = MagicMock() - mock_cursor.execute.return_value = [] - - OpenDistroEngineSpec.execute( - mock_cursor, "-- some comment \nSELECT 1\n --other comment" - ) - mock_cursor.execute.assert_called_once_with("SELECT 1\n") diff --git a/tests/integration_tests/db_engine_specs/firebird_tests.py b/tests/integration_tests/db_engine_specs/firebird_tests.py deleted file mode 100644 index 5e00e2ed4d9a..000000000000 --- a/tests/integration_tests/db_engine_specs/firebird_tests.py +++ /dev/null @@ -1,81 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from datetime import datetime -from unittest import mock - -import pytest - -from superset.db_engine_specs.firebird import FirebirdEngineSpec - -grain_expressions = { - None: "timestamp_column", - "PT1S": ( - "CAST(CAST(timestamp_column AS DATE) " - "|| ' ' " - "|| EXTRACT(HOUR FROM timestamp_column) " - "|| ':' " - "|| EXTRACT(MINUTE FROM timestamp_column) " - "|| ':' " - "|| FLOOR(EXTRACT(SECOND FROM timestamp_column)) AS TIMESTAMP)" - ), - "PT1M": ( - "CAST(CAST(timestamp_column AS DATE) " - "|| ' ' " - "|| EXTRACT(HOUR FROM timestamp_column) " - "|| ':' " - "|| EXTRACT(MINUTE FROM timestamp_column) " - "|| ':00' AS TIMESTAMP)" - ), - "P1D": "CAST(timestamp_column AS DATE)", - "P1M": ( - "CAST(EXTRACT(YEAR FROM timestamp_column) " - "|| '-' " - "|| EXTRACT(MONTH FROM timestamp_column) " - "|| '-01' AS DATE)" - ), - "P1Y": "CAST(EXTRACT(YEAR FROM timestamp_column) || '-01-01' AS DATE)", -} - - -@pytest.mark.parametrize("grain,expected", grain_expressions.items()) -def test_time_grain_expressions(grain, expected): - assert ( - FirebirdEngineSpec._time_grain_expressions[grain].format(col="timestamp_column") - == expected - ) - - -def test_epoch_to_dttm(): - assert ( - FirebirdEngineSpec.epoch_to_dttm().format(col="timestamp_column") - == "DATEADD(second, timestamp_column, CAST('00:00:00' AS TIMESTAMP))" - ) - - -def test_convert_dttm(): - dttm = datetime(2021, 1, 1) - assert ( - FirebirdEngineSpec.convert_dttm("timestamp", dttm) - == "CAST('2021-01-01 00:00:00' AS TIMESTAMP)" - ) - assert ( - FirebirdEngineSpec.convert_dttm("TIMESTAMP", dttm) - == "CAST('2021-01-01 00:00:00' AS TIMESTAMP)" - ) - assert FirebirdEngineSpec.convert_dttm("TIME", dttm) == "CAST('00:00:00' AS TIME)" - assert FirebirdEngineSpec.convert_dttm("DATE", dttm) == "CAST('2021-01-01' AS DATE)" - assert FirebirdEngineSpec.convert_dttm("STRING", dttm) is None diff --git a/tests/integration_tests/db_engine_specs/firebolt_tests.py b/tests/integration_tests/db_engine_specs/firebolt_tests.py deleted file mode 100644 index 793b32970bdd..000000000000 --- a/tests/integration_tests/db_engine_specs/firebolt_tests.py +++ /dev/null @@ -1,39 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from superset.db_engine_specs.firebolt import FireboltEngineSpec -from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec - - -class TestFireboltDbEngineSpec(TestDbEngineSpec): - def test_convert_dttm(self): - dttm = self.get_dttm() - test_cases = { - "DATE": "CAST('2019-01-02' AS DATE)", - "DATETIME": "CAST('2019-01-02T03:04:05' AS DATETIME)", - "TIMESTAMP": "CAST('2019-01-02T03:04:05' AS TIMESTAMP)", - "UNKNOWNTYPE": None, - } - - for target_type, expected in test_cases.items(): - actual = FireboltEngineSpec.convert_dttm(target_type, dttm) - self.assertEqual(actual, expected) - - def test_epoch_to_dttm(self): - assert ( - FireboltEngineSpec.epoch_to_dttm().format(col="timestamp_column") - == "from_unixtime(timestamp_column)" - ) diff --git a/tests/integration_tests/db_engine_specs/hive_tests.py b/tests/integration_tests/db_engine_specs/hive_tests.py index ad80f8397ffe..b63f64ab03cb 100644 --- a/tests/integration_tests/db_engine_specs/hive_tests.py +++ b/tests/integration_tests/db_engine_specs/hive_tests.py @@ -150,19 +150,6 @@ def test_hive_error_msg(): ) -def test_hive_get_view_names_return_empty_list(): # pylint: disable=invalid-name - assert HiveEngineSpec.get_view_names(mock.ANY, mock.ANY, mock.ANY) == [] - - -def test_convert_dttm(): - dttm = datetime.strptime("2019-01-02 03:04:05.678900", "%Y-%m-%d %H:%M:%S.%f") - assert HiveEngineSpec.convert_dttm("DATE", dttm) == "CAST('2019-01-02' AS DATE)" - assert ( - HiveEngineSpec.convert_dttm("TIMESTAMP", dttm) - == "CAST('2019-01-02 03:04:05.678900' AS TIMESTAMP)" - ) - - def test_df_to_csv() -> None: with pytest.raises(SupersetException): HiveEngineSpec.df_to_sql( @@ -208,7 +195,9 @@ def test_df_to_sql_if_exists_replace(mock_upload_to_s3, mock_g): mock_database = mock.MagicMock() mock_database.get_df.return_value.empty = False mock_execute = mock.MagicMock(return_value=True) - mock_database.get_sqla_engine.return_value.execute = mock_execute + mock_database.get_sqla_engine_with_context.return_value.__enter__.return_value.execute = ( + mock_execute + ) table_name = "foobar" with app.app_context(): @@ -233,7 +222,9 @@ def test_df_to_sql_if_exists_replace_with_schema(mock_upload_to_s3, mock_g): mock_database = mock.MagicMock() mock_database.get_df.return_value.empty = False mock_execute = mock.MagicMock(return_value=True) - mock_database.get_sqla_engine.return_value.execute = mock_execute + mock_database.get_sqla_engine_with_context.return_value.__enter__.return_value.execute = ( + mock_execute + ) table_name = "foobar" schema = "schema" @@ -403,3 +394,41 @@ def is_correct_result(data: List, result: List) -> bool: ["ds=01-01-19/hour=1", "ds=01-03-19/hour=1", "ds=01-02-19/hour=2"], ["01-03-19", "1"], ) + + +def test_get_view_names_with_schema(): + database = mock.MagicMock() + mock_execute = mock.MagicMock() + database.get_raw_connection().__enter__().cursor().execute = mock_execute + database.get_raw_connection().__enter__().cursor().fetchall = mock.MagicMock( + return_value=[["a", "b,", "c"], ["d", "e"]] + ) + + schema = "schema" + result = HiveEngineSpec.get_view_names(database, mock.Mock(), schema) + mock_execute.assert_called_once_with(f"SHOW VIEWS IN `{schema}`") + assert result == {"a", "d"} + + +def test_get_view_names_without_schema(): + database = mock.MagicMock() + mock_execute = mock.MagicMock() + database.get_raw_connection().__enter__().cursor().execute = mock_execute + database.get_raw_connection().__enter__().cursor().fetchall = mock.MagicMock( + return_value=[["a", "b,", "c"], ["d", "e"]] + ) + result = HiveEngineSpec.get_view_names(database, mock.Mock(), None) + mock_execute.assert_called_once_with("SHOW VIEWS") + assert result == {"a", "d"} + + +@mock.patch("superset.db_engine_specs.base.BaseEngineSpec.get_table_names") +@mock.patch("superset.db_engine_specs.hive.HiveEngineSpec.get_view_names") +def test_get_table_names( + mock_get_view_names, + mock_get_table_names, +): + mock_get_view_names.return_value = {"view1", "view2"} + mock_get_table_names.return_value = {"table1", "table2", "view1", "view2"} + tables = HiveEngineSpec.get_table_names(mock.Mock(), mock.Mock(), None) + assert tables == {"table1", "table2"} diff --git a/tests/integration_tests/db_engine_specs/mysql_tests.py b/tests/integration_tests/db_engine_specs/mysql_tests.py index b069bba69047..36b41222b3cc 100644 --- a/tests/integration_tests/db_engine_specs/mysql_tests.py +++ b/tests/integration_tests/db_engine_specs/mysql_tests.py @@ -21,12 +21,7 @@ from superset.db_engine_specs.mysql import MySQLEngineSpec from superset.errors import ErrorLevel, SupersetError, SupersetErrorType -from superset.models.sql_lab import Query -from superset.utils.core import GenericDataType -from tests.integration_tests.db_engine_specs.base_tests import ( - assert_generic_types, - TestDbEngineSpec, -) +from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec class TestMySQLEngineSpecsDbEngineSpec(TestDbEngineSpec): @@ -38,19 +33,6 @@ def test_get_datatype_mysql(self): self.assertEqual("TINY", MySQLEngineSpec.get_datatype(1)) self.assertEqual("VARCHAR", MySQLEngineSpec.get_datatype(15)) - def test_convert_dttm(self): - dttm = self.get_dttm() - - self.assertEqual( - MySQLEngineSpec.convert_dttm("DATE", dttm), - "STR_TO_DATE('2019-01-02', '%Y-%m-%d')", - ) - - self.assertEqual( - MySQLEngineSpec.convert_dttm("DATETIME", dttm), - "STR_TO_DATE('2019-01-02 03:04:05.678900', '%Y-%m-%d %H:%i:%s.%f')", - ) - def test_column_datatype_to_string(self): test_cases = ( (DATE(), "DATE"), @@ -69,32 +51,6 @@ def test_column_datatype_to_string(self): ) self.assertEqual(actual, expected) - def test_generic_type(self): - type_expectations = ( - # Numeric - ("TINYINT", GenericDataType.NUMERIC), - ("SMALLINT", GenericDataType.NUMERIC), - ("MEDIUMINT", GenericDataType.NUMERIC), - ("INT", GenericDataType.NUMERIC), - ("BIGINT", GenericDataType.NUMERIC), - ("DECIMAL", GenericDataType.NUMERIC), - ("FLOAT", GenericDataType.NUMERIC), - ("DOUBLE", GenericDataType.NUMERIC), - ("BIT", GenericDataType.NUMERIC), - # String - ("CHAR", GenericDataType.STRING), - ("VARCHAR", GenericDataType.STRING), - ("TINYTEXT", GenericDataType.STRING), - ("MEDIUMTEXT", GenericDataType.STRING), - ("LONGTEXT", GenericDataType.STRING), - # Temporal - ("DATE", GenericDataType.TEMPORAL), - ("DATETIME", GenericDataType.TEMPORAL), - ("TIMESTAMP", GenericDataType.TEMPORAL), - ("TIME", GenericDataType.TEMPORAL), - ) - assert_generic_types(MySQLEngineSpec, type_expectations) - def test_extract_error_message(self): from MySQLdb._exceptions import OperationalError @@ -239,22 +195,3 @@ def test_extract_errors(self): }, ) ] - - @unittest.mock.patch("sqlalchemy.engine.Engine.connect") - def test_get_cancel_query_id(self, engine_mock): - query = Query() - cursor_mock = engine_mock.return_value.__enter__.return_value - cursor_mock.fetchone.return_value = [123] - assert MySQLEngineSpec.get_cancel_query_id(cursor_mock, query) == 123 - - @unittest.mock.patch("sqlalchemy.engine.Engine.connect") - def test_cancel_query(self, engine_mock): - query = Query() - cursor_mock = engine_mock.return_value.__enter__.return_value - assert MySQLEngineSpec.cancel_query(cursor_mock, query, 123) is True - - @unittest.mock.patch("sqlalchemy.engine.Engine.connect") - def test_cancel_query_failed(self, engine_mock): - query = Query() - cursor_mock = engine_mock.raiseError.side_effect = Exception() - assert MySQLEngineSpec.cancel_query(cursor_mock, query, 123) is False diff --git a/tests/integration_tests/db_engine_specs/oracle_tests.py b/tests/integration_tests/db_engine_specs/oracle_tests.py deleted file mode 100644 index b2f4f9f23120..000000000000 --- a/tests/integration_tests/db_engine_specs/oracle_tests.py +++ /dev/null @@ -1,87 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from unittest import mock - -import pytest -from sqlalchemy import column -from sqlalchemy.dialects import oracle -from sqlalchemy.dialects.oracle import DATE, NVARCHAR, VARCHAR - -from superset.db_engine_specs.oracle import OracleEngineSpec -from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec - - -class TestOracleDbEngineSpec(TestDbEngineSpec): - def test_oracle_sqla_column_name_length_exceeded(self): - col = column("This_Is_32_Character_Column_Name") - label = OracleEngineSpec.make_label_compatible(col.name) - self.assertEqual(label.quote, True) - label_expected = "3b26974078683be078219674eeb8f5" - self.assertEqual(label, label_expected) - - def test_oracle_time_expression_reserved_keyword_1m_grain(self): - col = column("decimal") - expr = OracleEngineSpec.get_timestamp_expr(col, None, "P1M") - result = str(expr.compile(dialect=oracle.dialect())) - self.assertEqual(result, "TRUNC(CAST(\"decimal\" as DATE), 'MONTH')") - dttm = self.get_dttm() - - def test_column_datatype_to_string(self): - test_cases = ( - (DATE(), "DATE"), - (VARCHAR(length=255), "VARCHAR(255 CHAR)"), - (VARCHAR(length=255, collation="utf8"), "VARCHAR(255 CHAR)"), - (NVARCHAR(length=128), "NVARCHAR2(128)"), - ) - - for original, expected in test_cases: - actual = OracleEngineSpec.column_datatype_to_string( - original, oracle.dialect() - ) - self.assertEqual(actual, expected) - - def test_fetch_data_no_description(self): - cursor = mock.MagicMock() - cursor.description = [] - assert OracleEngineSpec.fetch_data(cursor) == [] - - def test_fetch_data(self): - cursor = mock.MagicMock() - result = ["a", "b"] - cursor.fetchall.return_value = result - assert OracleEngineSpec.fetch_data(cursor) == result - - -@pytest.mark.parametrize( - "date_format,expected", - [ - ("DATE", "TO_DATE('2019-01-02', 'YYYY-MM-DD')"), - ("DATETIME", """TO_DATE('2019-01-02T03:04:05', 'YYYY-MM-DD"T"HH24:MI:SS')"""), - ( - "TIMESTAMP", - """TO_TIMESTAMP('2019-01-02T03:04:05.678900', 'YYYY-MM-DD"T"HH24:MI:SS.ff6')""", - ), - ( - "timestamp", - """TO_TIMESTAMP('2019-01-02T03:04:05.678900', 'YYYY-MM-DD"T"HH24:MI:SS.ff6')""", - ), - ("Other", None), - ], -) -def test_convert_dttm(date_format, expected): - dttm = TestOracleDbEngineSpec.get_dttm() - assert OracleEngineSpec.convert_dttm(date_format, dttm) == expected diff --git a/tests/integration_tests/db_engine_specs/postgres_tests.py b/tests/integration_tests/db_engine_specs/postgres_tests.py index e6eb4fc1d13e..a6145432c2a1 100644 --- a/tests/integration_tests/db_engine_specs/postgres_tests.py +++ b/tests/integration_tests/db_engine_specs/postgres_tests.py @@ -20,15 +20,11 @@ from sqlalchemy import column, literal_column from sqlalchemy.dialects import postgresql -from superset.db_engine_specs import get_engine_specs +from superset.db_engine_specs import load_engine_specs from superset.db_engine_specs.postgres import PostgresEngineSpec from superset.errors import ErrorLevel, SupersetError, SupersetErrorType from superset.models.sql_lab import Query -from superset.utils.core import GenericDataType -from tests.integration_tests.db_engine_specs.base_tests import ( - assert_generic_types, - TestDbEngineSpec, -) +from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec from tests.integration_tests.fixtures.certificates import ssl_certificate from tests.integration_tests.fixtures.database import default_db_extra @@ -45,11 +41,11 @@ def test_get_table_names(self): inspector.get_table_names = mock.Mock(return_value=["schema.table", "table_2"]) inspector.get_foreign_table_names = mock.Mock(return_value=["table_3"]) - pg_result_expected = ["schema.table", "table_2", "table_3"] + pg_result_expected = {"schema.table", "table_2", "table_3"} pg_result = PostgresEngineSpec.get_table_names( database=mock.ANY, schema="schema", inspector=inspector ) - self.assertListEqual(pg_result_expected, pg_result) + assert pg_result_expected == pg_result def test_time_exp_literal_no_grain(self): """ @@ -100,29 +96,6 @@ def test_time_exp_mixd_case_col_1y(self): result = str(expr.compile(None, dialect=postgresql.dialect())) self.assertEqual(result, "DATE_TRUNC('year', \"MixedCase\")") - def test_convert_dttm(self): - """ - DB Eng Specs (postgres): Test conversion to date time - """ - dttm = self.get_dttm() - - self.assertEqual( - PostgresEngineSpec.convert_dttm("DATE", dttm), - "TO_DATE('2019-01-02', 'YYYY-MM-DD')", - ) - - self.assertEqual( - PostgresEngineSpec.convert_dttm("TIMESTAMP", dttm), - "TO_TIMESTAMP('2019-01-02 03:04:05.678900', 'YYYY-MM-DD HH24:MI:SS.US')", - ) - - self.assertEqual( - PostgresEngineSpec.convert_dttm("DATETIME", dttm), - "TO_TIMESTAMP('2019-01-02 03:04:05.678900', 'YYYY-MM-DD HH24:MI:SS.US')", - ) - - self.assertEqual(PostgresEngineSpec.convert_dttm("TIME", dttm), None) - def test_empty_dbapi_cursor_description(self): """ DB Eng Specs (postgres): Test empty cursor description (no columns) @@ -137,7 +110,11 @@ def test_engine_alias_name(self): """ DB Eng Specs (postgres): Test "postgres" in engine spec """ - self.assertIn("postgres", get_engine_specs()) + backends = set() + for engine in load_engine_specs(): + backends.add(engine.engine) + backends.update(engine.engine_aliases) + assert "postgres" in backends def test_extras_without_ssl(self): db = mock.Mock() @@ -174,7 +151,7 @@ def test_estimate_statement_cost_select_star(self): cursor = mock.Mock() cursor.fetchone.return_value = ( - "Seq Scan on birth_names (cost=0.00..1537.91 rows=75691 width=46)", + "Seq Scan on birth_names (cost=0.00..1537.91 rows=75691 width=46)", ) sql = "SELECT * FROM birth_names" results = PostgresEngineSpec.estimate_statement_cost(sql, cursor) @@ -500,7 +477,15 @@ def test_base_parameters_mixin(): ) parameters_from_uri = PostgresEngineSpec.get_parameters_from_uri(sqlalchemy_uri) - assert parameters_from_uri == parameters + assert parameters_from_uri == { + "username": "username", + "password": "password", + "host": "localhost", + "port": 5432, + "database": "dbname", + "query": {"foo": "bar"}, + "encryption": True, + } json_schema = PostgresEngineSpec.parameters_json_schema() assert json_schema == { @@ -529,28 +514,3 @@ def test_base_parameters_mixin(): }, "required": ["database", "host", "port", "username"], } - - -def test_generic_type(): - type_expectations = ( - # Numeric - ("SMALLINT", GenericDataType.NUMERIC), - ("INTEGER", GenericDataType.NUMERIC), - ("BIGINT", GenericDataType.NUMERIC), - ("DECIMAL", GenericDataType.NUMERIC), - ("NUMERIC", GenericDataType.NUMERIC), - ("REAL", GenericDataType.NUMERIC), - ("DOUBLE PRECISION", GenericDataType.NUMERIC), - ("MONEY", GenericDataType.NUMERIC), - # String - ("CHAR", GenericDataType.STRING), - ("VARCHAR", GenericDataType.STRING), - ("TEXT", GenericDataType.STRING), - # Temporal - ("DATE", GenericDataType.TEMPORAL), - ("TIMESTAMP", GenericDataType.TEMPORAL), - ("TIME", GenericDataType.TEMPORAL), - # Boolean - ("BOOLEAN", GenericDataType.BOOLEAN), - ) - assert_generic_types(PostgresEngineSpec, type_expectations) diff --git a/tests/integration_tests/db_engine_specs/presto_tests.py b/tests/integration_tests/db_engine_specs/presto_tests.py index 954f8d660a97..78b552ecb863 100644 --- a/tests/integration_tests/db_engine_specs/presto_tests.py +++ b/tests/integration_tests/db_engine_specs/presto_tests.py @@ -15,17 +15,16 @@ # specific language governing permissions and limitations # under the License. from collections import namedtuple +from textwrap import dedent from unittest import mock, skipUnless import pandas as pd from sqlalchemy import types -from sqlalchemy.engine.result import RowProxy from sqlalchemy.sql import select from superset.db_engine_specs.presto import PrestoEngineSpec from superset.errors import ErrorLevel, SupersetError, SupersetErrorType from superset.sql_parse import ParsedQuery -from superset.utils.core import DatasourceName, GenericDataType from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec @@ -34,62 +33,53 @@ class TestPrestoDbEngineSpec(TestDbEngineSpec): def test_get_datatype_presto(self): self.assertEqual("STRING", PrestoEngineSpec.get_datatype("string")) - def test_presto_get_view_names_return_empty_list( - self, - ): # pylint: disable=invalid-name - self.assertEqual( - [], PrestoEngineSpec.get_view_names(mock.ANY, mock.ANY, mock.ANY) - ) - - @mock.patch("superset.db_engine_specs.presto.is_feature_enabled") - def test_get_view_names(self, mock_is_feature_enabled): - mock_is_feature_enabled.return_value = True - mock_execute = mock.MagicMock() - mock_fetchall = mock.MagicMock(return_value=[["a", "b,", "c"], ["d", "e"]]) + def test_get_view_names_with_schema(self): database = mock.MagicMock() - database.get_sqla_engine.return_value.raw_connection.return_value.cursor.return_value.execute = ( - mock_execute - ) - database.get_sqla_engine.return_value.raw_connection.return_value.cursor.return_value.fetchall = ( - mock_fetchall + mock_execute = mock.MagicMock() + database.get_raw_connection().__enter__().cursor().execute = mock_execute + database.get_raw_connection().__enter__().cursor().fetchall = mock.MagicMock( + return_value=[["a", "b,", "c"], ["d", "e"]] ) - result = PrestoEngineSpec.get_view_names(database, mock.Mock(), None) + + schema = "schema" + result = PrestoEngineSpec.get_view_names(database, mock.Mock(), schema) mock_execute.assert_called_once_with( - "SELECT table_name FROM information_schema.views", {} + dedent( + """ + SELECT table_name FROM information_schema.tables + WHERE table_schema = %(schema)s + AND table_type = 'VIEW' + """ + ).strip(), + {"schema": schema}, ) - assert result == ["a", "d"] + assert result == {"a", "d"} - @mock.patch("superset.db_engine_specs.presto.is_feature_enabled") - def test_get_view_names_with_schema(self, mock_is_feature_enabled): - mock_is_feature_enabled.return_value = True - mock_execute = mock.MagicMock() - mock_fetchall = mock.MagicMock(return_value=[["a", "b,", "c"], ["d", "e"]]) + def test_get_view_names_without_schema(self): database = mock.MagicMock() - database.get_sqla_engine.return_value.raw_connection.return_value.cursor.return_value.execute = ( - mock_execute - ) - database.get_sqla_engine.return_value.raw_connection.return_value.cursor.return_value.fetchall = ( - mock_fetchall + mock_execute = mock.MagicMock() + database.get_raw_connection().__enter__().cursor().execute = mock_execute + database.get_raw_connection().__enter__().cursor().fetchall = mock.MagicMock( + return_value=[["a", "b,", "c"], ["d", "e"]] ) - schema = "schema" - result = PrestoEngineSpec.get_view_names(database, mock.Mock(), schema) + result = PrestoEngineSpec.get_view_names(database, mock.Mock(), None) mock_execute.assert_called_once_with( - "SELECT table_name FROM information_schema.views " - "WHERE table_schema=%(schema)s", - {"schema": schema}, + dedent( + """ + SELECT table_name FROM information_schema.tables + WHERE table_type = 'VIEW' + """ + ).strip(), + {}, ) - assert result == ["a", "d"] + assert result == {"a", "d"} def verify_presto_column(self, column, expected_results): inspector = mock.Mock() inspector.engine.dialect.identifier_preparer.quote_identifier = mock.Mock() - keymap = { - "Column": (None, None, 0), - "Type": (None, None, 1), - "Null": (None, None, 2), - } - row = RowProxy(mock.Mock(), column, [None, None, None, None], keymap) - inspector.bind.execute = mock.Mock(return_value=[row]) + row = mock.Mock() + row.Column, row.Type, row.Null = column + inspector.bind.execute.return_value.fetchall = mock.Mock(return_value=[row]) results = PrestoEngineSpec.get_columns(inspector, "", "") self.assertEqual(len(expected_results), len(results)) for expected_result, result in zip(expected_results, results): @@ -497,7 +487,8 @@ def test_presto_extra_table_metadata(self): db.get_df = mock.Mock(return_value=df) PrestoEngineSpec.get_create_view = mock.Mock(return_value=None) result = PrestoEngineSpec.extra_table_metadata(db, "test_table", "test_schema") - self.assertEqual({"ds": "01-01-19", "hour": 1}, result["partitions"]["latest"]) + assert result["partitions"]["cols"] == ["ds", "hour"] + assert result["partitions"]["latest"] == {"ds": "01-01-19", "hour": 1} def test_presto_where_latest_partition(self): db = mock.Mock() @@ -632,86 +623,17 @@ def test_presto_expand_data_array(self): self.assertEqual(actual_data, expected_data) self.assertEqual(actual_expanded_cols, expected_expanded_cols) - def test_get_sqla_column_type(self): - column_spec = PrestoEngineSpec.get_column_spec("varchar(255)") - assert isinstance(column_spec.sqla_type, types.VARCHAR) - assert column_spec.sqla_type.length == 255 - self.assertEqual(column_spec.generic_type, GenericDataType.STRING) - - column_spec = PrestoEngineSpec.get_column_spec("varchar") - assert isinstance(column_spec.sqla_type, types.String) - assert column_spec.sqla_type.length is None - self.assertEqual(column_spec.generic_type, GenericDataType.STRING) - - column_spec = PrestoEngineSpec.get_column_spec("char(10)") - assert isinstance(column_spec.sqla_type, types.CHAR) - assert column_spec.sqla_type.length == 10 - self.assertEqual(column_spec.generic_type, GenericDataType.STRING) - - column_spec = PrestoEngineSpec.get_column_spec("char") - assert isinstance(column_spec.sqla_type, types.CHAR) - assert column_spec.sqla_type.length is None - self.assertEqual(column_spec.generic_type, GenericDataType.STRING) - - column_spec = PrestoEngineSpec.get_column_spec("integer") - assert isinstance(column_spec.sqla_type, types.Integer) - self.assertEqual(column_spec.generic_type, GenericDataType.NUMERIC) - - column_spec = PrestoEngineSpec.get_column_spec("time") - assert isinstance(column_spec.sqla_type, types.Time) - self.assertEqual(column_spec.generic_type, GenericDataType.TEMPORAL) - - column_spec = PrestoEngineSpec.get_column_spec("timestamp") - assert isinstance(column_spec.sqla_type, types.TIMESTAMP) - self.assertEqual(column_spec.generic_type, GenericDataType.TEMPORAL) - - sqla_type = PrestoEngineSpec.get_sqla_column_type(None) - assert sqla_type is None - - @mock.patch( - "superset.utils.feature_flag_manager.FeatureFlagManager.is_feature_enabled" - ) - @mock.patch("superset.db_engine_specs.base.BaseEngineSpec.get_table_names") - @mock.patch("superset.db_engine_specs.presto.PrestoEngineSpec.get_view_names") - def test_get_table_names_no_split_views_from_tables( - self, mock_get_view_names, mock_get_table_names, mock_is_feature_enabled - ): - mock_get_view_names.return_value = ["view1", "view2"] - table_names = ["table1", "table2", "view1", "view2"] - mock_get_table_names.return_value = table_names - mock_is_feature_enabled.return_value = False - tables = PrestoEngineSpec.get_table_names(mock.Mock(), mock.Mock(), None) - assert tables == table_names - - @mock.patch( - "superset.utils.feature_flag_manager.FeatureFlagManager.is_feature_enabled" - ) - @mock.patch("superset.db_engine_specs.base.BaseEngineSpec.get_table_names") - @mock.patch("superset.db_engine_specs.presto.PrestoEngineSpec.get_view_names") - def test_get_table_names_split_views_from_tables( - self, mock_get_view_names, mock_get_table_names, mock_is_feature_enabled - ): - mock_get_view_names.return_value = ["view1", "view2"] - table_names = ["table1", "table2", "view1", "view2"] - mock_get_table_names.return_value = table_names - mock_is_feature_enabled.return_value = True - tables = PrestoEngineSpec.get_table_names(mock.Mock(), mock.Mock(), None) - assert sorted(tables) == sorted(table_names) - - @mock.patch( - "superset.utils.feature_flag_manager.FeatureFlagManager.is_feature_enabled" - ) @mock.patch("superset.db_engine_specs.base.BaseEngineSpec.get_table_names") @mock.patch("superset.db_engine_specs.presto.PrestoEngineSpec.get_view_names") - def test_get_table_names_split_views_from_tables_no_tables( - self, mock_get_view_names, mock_get_table_names, mock_is_feature_enabled + def test_get_table_names( + self, + mock_get_view_names, + mock_get_table_names, ): - mock_get_view_names.return_value = [] - table_names = [] - mock_get_table_names.return_value = table_names - mock_is_feature_enabled.return_value = True + mock_get_view_names.return_value = {"view1", "view2"} + mock_get_table_names.return_value = {"table1", "table2", "view1", "view2"} tables = PrestoEngineSpec.get_table_names(mock.Mock(), mock.Mock(), None) - assert tables == [] + assert tables == {"table1", "table2"} def test_get_full_name(self): names = [ @@ -749,25 +671,29 @@ def test_show_columns(self): inspector.engine.dialect.identifier_preparer.quote_identifier = ( lambda x: f'"{x}"' ) - mock_execute = mock.MagicMock(return_value=["a", "b"]) - inspector.bind.execute = mock_execute + inspector.bind.execute.return_value.fetchall = mock.MagicMock( + return_value=["a", "b"] + ) table_name = "table_name" result = PrestoEngineSpec._show_columns(inspector, table_name, None) assert result == ["a", "b"] - mock_execute.assert_called_once_with(f'SHOW COLUMNS FROM "{table_name}"') + inspector.bind.execute.assert_called_once_with( + f'SHOW COLUMNS FROM "{table_name}"' + ) def test_show_columns_with_schema(self): inspector = mock.MagicMock() inspector.engine.dialect.identifier_preparer.quote_identifier = ( lambda x: f'"{x}"' ) - mock_execute = mock.MagicMock(return_value=["a", "b"]) - inspector.bind.execute = mock_execute + inspector.bind.execute.return_value.fetchall = mock.MagicMock( + return_value=["a", "b"] + ) table_name = "table_name" schema = "schema" result = PrestoEngineSpec._show_columns(inspector, table_name, schema) assert result == ["a", "b"] - mock_execute.assert_called_once_with( + inspector.bind.execute.assert_called_once_with( f'SHOW COLUMNS FROM "{schema}"."{table_name}"' ) @@ -852,32 +778,13 @@ def test_estimate_statement_cost_invalid_syntax(self): "DROP TABLE brth_names", mock_cursor ) - def test_get_all_datasource_names(self): - df = pd.DataFrame.from_dict( - {"table_schema": ["schema1", "schema2"], "table_name": ["name1", "name2"]} - ) - database = mock.MagicMock() - database.get_df.return_value = df - result = PrestoEngineSpec.get_all_datasource_names(database, "table") - expected_result = [ - DatasourceName(schema="schema1", table="name1"), - DatasourceName(schema="schema2", table="name2"), - ] - assert result == expected_result - def test_get_create_view(self): mock_execute = mock.MagicMock() mock_fetchall = mock.MagicMock(return_value=[["a", "b,", "c"], ["d", "e"]]) database = mock.MagicMock() - database.get_sqla_engine.return_value.raw_connection.return_value.cursor.return_value.execute = ( - mock_execute - ) - database.get_sqla_engine.return_value.raw_connection.return_value.cursor.return_value.fetchall = ( - mock_fetchall - ) - database.get_sqla_engine.return_value.raw_connection.return_value.cursor.return_value.poll.return_value = ( - False - ) + database.get_raw_connection().__enter__().cursor().execute = mock_execute + database.get_raw_connection().__enter__().cursor().fetchall = mock_fetchall + database.get_raw_connection().__enter__().cursor().return_value = False schema = "schema" table = "table" result = PrestoEngineSpec.get_create_view(database, schema=schema, table=table) @@ -887,9 +794,7 @@ def test_get_create_view(self): def test_get_create_view_exception(self): mock_execute = mock.MagicMock(side_effect=Exception()) database = mock.MagicMock() - database.get_sqla_engine.return_value.raw_connection.return_value.cursor.return_value.execute = ( - mock_execute - ) + database.get_raw_connection().__enter__().cursor().execute = mock_execute schema = "schema" table = "table" with self.assertRaises(Exception): @@ -900,9 +805,7 @@ def test_get_create_view_database_error(self): mock_execute = mock.MagicMock(side_effect=DatabaseError()) database = mock.MagicMock() - database.get_sqla_engine.return_value.raw_connection.return_value.cursor.return_value.execute = ( - mock_execute - ) + database.get_raw_connection().__enter__().cursor().execute = mock_execute schema = "schema" table = "table" result = PrestoEngineSpec.get_create_view(database, schema=schema, table=table) diff --git a/tests/integration_tests/db_engine_specs/trino_tests.py b/tests/integration_tests/db_engine_specs/trino_tests.py deleted file mode 100644 index fc83b8c64c3d..000000000000 --- a/tests/integration_tests/db_engine_specs/trino_tests.py +++ /dev/null @@ -1,150 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -import json -from typing import Any, Dict -from unittest.mock import Mock, patch - -import pytest -from sqlalchemy.engine.url import URL - -import superset.config -from superset.db_engine_specs.trino import TrinoEngineSpec -from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec - - -class TestTrinoDbEngineSpec(TestDbEngineSpec): - def test_get_extra_params(self): - database = Mock() - - database.extra = json.dumps({}) - database.server_cert = None - extra = TrinoEngineSpec.get_extra_params(database) - expected = {"engine_params": {"connect_args": {}}} - self.assertEqual(extra, expected) - - expected = { - "first": 1, - "engine_params": {"second": "two", "connect_args": {"third": "three"}}, - } - database.extra = json.dumps(expected) - database.server_cert = None - extra = TrinoEngineSpec.get_extra_params(database) - self.assertEqual(extra, expected) - - @patch("superset.utils.core.create_ssl_cert_file") - def test_get_extra_params_with_server_cert(self, create_ssl_cert_file_func: Mock): - database = Mock() - - database.extra = json.dumps({}) - database.server_cert = "TEST_CERT" - create_ssl_cert_file_func.return_value = "/path/to/tls.crt" - extra = TrinoEngineSpec.get_extra_params(database) - - connect_args = extra.get("engine_params", {}).get("connect_args", {}) - self.assertEqual(connect_args.get("http_scheme"), "https") - self.assertEqual(connect_args.get("verify"), "/path/to/tls.crt") - create_ssl_cert_file_func.assert_called_once_with(database.server_cert) - - @patch("trino.auth.BasicAuthentication") - def test_auth_basic(self, auth: Mock): - database = Mock() - - auth_params = {"username": "username", "password": "password"} - database.encrypted_extra = json.dumps( - {"auth_method": "basic", "auth_params": auth_params} - ) - - params: Dict[str, Any] = {} - TrinoEngineSpec.update_encrypted_extra_params(database, params) - connect_args = params.setdefault("connect_args", {}) - self.assertEqual(connect_args.get("http_scheme"), "https") - auth.assert_called_once_with(**auth_params) - - @patch("trino.auth.KerberosAuthentication") - def test_auth_kerberos(self, auth: Mock): - database = Mock() - - auth_params = { - "service_name": "superset", - "mutual_authentication": False, - "delegate": True, - } - database.encrypted_extra = json.dumps( - {"auth_method": "kerberos", "auth_params": auth_params} - ) - - params: Dict[str, Any] = {} - TrinoEngineSpec.update_encrypted_extra_params(database, params) - connect_args = params.setdefault("connect_args", {}) - self.assertEqual(connect_args.get("http_scheme"), "https") - auth.assert_called_once_with(**auth_params) - - @patch("trino.auth.JWTAuthentication") - def test_auth_jwt(self, auth: Mock): - database = Mock() - - auth_params = {"token": "jwt-token-string"} - database.encrypted_extra = json.dumps( - {"auth_method": "jwt", "auth_params": auth_params} - ) - - params: Dict[str, Any] = {} - TrinoEngineSpec.update_encrypted_extra_params(database, params) - connect_args = params.setdefault("connect_args", {}) - self.assertEqual(connect_args.get("http_scheme"), "https") - auth.assert_called_once_with(**auth_params) - - def test_auth_custom_auth(self): - database = Mock() - auth_class = Mock() - - auth_method = "custom_auth" - auth_params = {"params1": "params1", "params2": "params2"} - database.encrypted_extra = json.dumps( - {"auth_method": auth_method, "auth_params": auth_params} - ) - - with patch.dict( - "superset.config.ALLOWED_EXTRA_AUTHENTICATIONS", - {"trino": {"custom_auth": auth_class}}, - clear=True, - ): - params: Dict[str, Any] = {} - TrinoEngineSpec.update_encrypted_extra_params(database, params) - - connect_args = params.setdefault("connect_args", {}) - self.assertEqual(connect_args.get("http_scheme"), "https") - - auth_class.assert_called_once_with(**auth_params) - - def test_auth_custom_auth_denied(self): - database = Mock() - auth_method = "my.module:TrinoAuthClass" - auth_params = {"params1": "params1", "params2": "params2"} - database.encrypted_extra = json.dumps( - {"auth_method": auth_method, "auth_params": auth_params} - ) - - superset.config.ALLOWED_EXTRA_AUTHENTICATIONS = {} - - with pytest.raises(ValueError) as excinfo: - TrinoEngineSpec.update_encrypted_extra_params(database, {}) - - assert str(excinfo.value) == ( - f"For security reason, custom authentication '{auth_method}' " - f"must be listed in 'ALLOWED_EXTRA_AUTHENTICATIONS' config" - ) diff --git a/tests/integration_tests/email_tests.py b/tests/integration_tests/email_tests.py index 68e4aaf71e3f..723901b74fb5 100644 --- a/tests/integration_tests/email_tests.py +++ b/tests/integration_tests/email_tests.py @@ -59,6 +59,37 @@ def test_send_smtp(self, mock_send_mime): mimeapp = MIMEApplication("attachment") assert msg.get_payload()[-1].get_payload() == mimeapp.get_payload() + @mock.patch("superset.utils.core.send_mime_email") + def test_send_smtp_with_email_mutator(self, mock_send_mime): + attachment = tempfile.NamedTemporaryFile() + attachment.write(b"attachment") + attachment.seek(0) + + # putting this into a variable so that we can reset after the test + base_email_mutator = app.config["EMAIL_HEADER_MUTATOR"] + + def mutator(msg, **kwargs): + msg["foo"] = "bar" + return msg + + app.config["EMAIL_HEADER_MUTATOR"] = mutator + utils.send_email_smtp( + "to", "subject", "content", app.config, files=[attachment.name] + ) + assert mock_send_mime.called + call_args = mock_send_mime.call_args[0] + logger.debug(call_args) + assert call_args[0] == app.config["SMTP_MAIL_FROM"] + assert call_args[1] == ["to"] + msg = call_args[2] + assert msg["Subject"] == "subject" + assert msg["From"] == app.config["SMTP_MAIL_FROM"] + assert msg["foo"] == "bar" + assert len(msg.get_payload()) == 2 + mimeapp = MIMEApplication("attachment") + assert msg.get_payload()[-1].get_payload() == mimeapp.get_payload() + app.config["EMAIL_HEADER_MUTATOR"] = base_email_mutator + @mock.patch("superset.utils.core.send_mime_email") def test_send_smtp_data(self, mock_send_mime): utils.send_email_smtp( @@ -174,6 +205,32 @@ def test_send_mime_tls_server_auth(self, mock_smtp): called_context = mock_smtp.return_value.starttls.call_args.kwargs["context"] self.assertEqual(called_context.verify_mode, ssl.CERT_REQUIRED) + @mock.patch("smtplib.SMTP_SSL") + @mock.patch("smtplib.SMTP") + def test_send_mime_ssl_server_auth(self, mock_smtp, mock_smtp_ssl): + app.config["SMTP_SSL"] = True + app.config["SMTP_SSL_SERVER_AUTH"] = True + mock_smtp.return_value = mock.Mock() + mock_smtp_ssl.return_value = mock.Mock() + utils.send_mime_email("from", "to", MIMEMultipart(), app.config, dryrun=False) + assert not mock_smtp.called + mock_smtp_ssl.assert_called_with( + app.config["SMTP_HOST"], app.config["SMTP_PORT"], context=mock.ANY + ) + called_context = mock_smtp_ssl.call_args.kwargs["context"] + self.assertEqual(called_context.verify_mode, ssl.CERT_REQUIRED) + + @mock.patch("smtplib.SMTP") + def test_send_mime_tls_server_auth(self, mock_smtp): + app.config["SMTP_STARTTLS"] = True + app.config["SMTP_SSL_SERVER_AUTH"] = True + mock_smtp.return_value = mock.Mock() + mock_smtp.return_value.starttls.return_value = mock.Mock() + utils.send_mime_email("from", "to", MIMEMultipart(), app.config, dryrun=False) + mock_smtp.return_value.starttls.assert_called_with(context=mock.ANY) + called_context = mock_smtp.return_value.starttls.call_args.kwargs["context"] + self.assertEqual(called_context.verify_mode, ssl.CERT_REQUIRED) + @mock.patch("smtplib.SMTP_SSL") @mock.patch("smtplib.SMTP") def test_send_mime_noauth(self, mock_smtp, mock_smtp_ssl): diff --git a/tests/integration_tests/embedded/test_view.py b/tests/integration_tests/embedded/test_view.py new file mode 100644 index 000000000000..9f524e9c09e2 --- /dev/null +++ b/tests/integration_tests/embedded/test_view.py @@ -0,0 +1,72 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from __future__ import annotations + +from typing import TYPE_CHECKING +from unittest import mock + +import pytest + +from superset import db +from superset.embedded.dao import EmbeddedDAO +from superset.models.dashboard import Dashboard +from tests.integration_tests.fixtures.birth_names_dashboard import ( + load_birth_names_dashboard_with_slices, + load_birth_names_data, +) +from tests.integration_tests.fixtures.client import client + +if TYPE_CHECKING: + from typing import Any + + from flask.testing import FlaskClient + + +@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") +@mock.patch.dict( + "superset.extensions.feature_flag_manager._feature_flags", + EMBEDDED_SUPERSET=True, +) +def test_get_embedded_dashboard(client: FlaskClient[Any]): + dash = db.session.query(Dashboard).filter_by(slug="births").first() + embedded = EmbeddedDAO.upsert(dash, []) + uri = f"embedded/{embedded.uuid}" + response = client.get(uri) + assert response.status_code == 200 + + +@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") +@mock.patch.dict( + "superset.extensions.feature_flag_manager._feature_flags", + EMBEDDED_SUPERSET=True, +) +def test_get_embedded_dashboard_referrer_not_allowed(client: FlaskClient[Any]): + dash = db.session.query(Dashboard).filter_by(slug="births").first() + embedded = EmbeddedDAO.upsert(dash, ["test.example.com"]) + uri = f"embedded/{embedded.uuid}" + response = client.get(uri) + assert response.status_code == 403 + + +@mock.patch.dict( + "superset.extensions.feature_flag_manager._feature_flags", + EMBEDDED_SUPERSET=True, +) +def test_get_embedded_dashboard_non_found(client: FlaskClient[Any]): + uri = f"embedded/bad-uuid" + response = client.get(uri) + assert response.status_code == 404 diff --git a/tests/integration_tests/event_logger_tests.py b/tests/integration_tests/event_logger_tests.py index ddbe42bb4fc5..4553bb9dc789 100644 --- a/tests/integration_tests/event_logger_tests.py +++ b/tests/integration_tests/event_logger_tests.py @@ -112,7 +112,7 @@ def test_func(arg1, add_extra_log_payload, karg1=1): ) self.assertGreaterEqual(payload["duration_ms"], 100) - @patch("superset.utils.log.g", spec={}) + @patch("superset.utils.core.g", spec={}) @freeze_time("Jan 14th, 2020", auto_tick_seconds=15) def test_context_manager_log(self, mock_g): class DummyEventLogger(AbstractEventLogger): @@ -144,12 +144,12 @@ def log( assert logger.records == [ { "records": [{"path": "/", "engine": "bar"}], - "user_id": "2", + "user_id": 2, "duration": 15000.0, } ] - @patch("superset.utils.log.g", spec={}) + @patch("superset.utils.core.g", spec={}) def test_context_manager_log_with_context(self, mock_g): class DummyEventLogger(AbstractEventLogger): def __init__(self): @@ -191,12 +191,12 @@ def log( "payload_override": {"engine": "sqllite"}, } ], - "user_id": "2", + "user_id": 2, "duration": 5558756000, } ] - @patch("superset.utils.log.g", spec={}) + @patch("superset.utils.core.g", spec={}) def test_log_with_context_user_null(self, mock_g): class DummyEventLogger(AbstractEventLogger): def __init__(self): diff --git a/tests/integration_tests/explore/api_tests.py b/tests/integration_tests/explore/api_tests.py new file mode 100644 index 000000000000..af5bd8813753 --- /dev/null +++ b/tests/integration_tests/explore/api_tests.py @@ -0,0 +1,240 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import json +from unittest.mock import patch + +import pytest +from flask_appbuilder.security.sqla.models import User +from sqlalchemy.orm import Session + +from superset.connectors.sqla.models import SqlaTable +from superset.explore.exceptions import DatasetAccessDeniedError +from superset.explore.form_data.commands.state import TemporaryExploreState +from superset.extensions import cache_manager +from superset.models.slice import Slice +from tests.integration_tests.fixtures.world_bank_dashboard import ( + load_world_bank_dashboard_with_slices, + load_world_bank_data, +) +from tests.integration_tests.test_app import app + +FORM_DATA_KEY = "form_data_key" +FORM_DATA = {"test": "test value"} + + +@pytest.fixture +def chart_id(load_world_bank_dashboard_with_slices) -> int: + with app.app_context() as ctx: + session: Session = ctx.app.appbuilder.get_session + chart = session.query(Slice).filter_by(slice_name="World's Population").one() + return chart.id + + +@pytest.fixture +def admin_id() -> int: + with app.app_context() as ctx: + session: Session = ctx.app.appbuilder.get_session + admin = session.query(User).filter_by(username="admin").one() + return admin.id + + +@pytest.fixture +def dataset() -> int: + with app.app_context() as ctx: + session: Session = ctx.app.appbuilder.get_session + dataset = ( + session.query(SqlaTable) + .filter_by(table_name="wb_health_population") + .first() + ) + return dataset + + +@pytest.fixture(autouse=True) +def cache(chart_id, admin_id, dataset): + entry: TemporaryExploreState = { + "owner": admin_id, + "datasource_id": dataset.id, + "datasource_type": dataset.type, + "chart_id": chart_id, + "form_data": json.dumps(FORM_DATA), + } + cache_manager.explore_form_data_cache.set(FORM_DATA_KEY, entry) + + +# partially match the dataset using the most important attributes +def assert_dataset(result, dataset_id): + dataset = result["dataset"] + assert dataset["id"] == dataset_id + assert dataset["datasource_name"] == "wb_health_population" + assert dataset["is_sqllab_view"] == False + assert dataset["main_dttm_col"] == "year" + assert dataset["sql"] == None + assert dataset["type"] == "table" + assert dataset["uid"] == f"{dataset_id}__table" + + +# partially match the slice using the most important attributes +def assert_slice(result, chart_id, dataset_id): + slice = result["slice"] + assert slice["edit_url"] == f"/chart/edit/{chart_id}" + assert slice["is_managed_externally"] == False + assert slice["slice_id"] == chart_id + assert slice["slice_name"] == "World's Population" + assert slice["form_data"]["datasource"] == f"{dataset_id}__table" + assert slice["form_data"]["viz_type"] == "big_number" + + +def test_no_params_provided(test_client, login_as_admin): + resp = test_client.get(f"api/v1/explore/") + assert resp.status_code == 200 + data = json.loads(resp.data.decode("utf-8")) + result = data.get("result") + assert result["dataset"]["name"] == "[Missing Dataset]" + assert result["form_data"]["datasource"] == "None__table" + assert result["message"] == None + assert result["slice"] == None + + +def test_get_from_cache(test_client, login_as_admin, dataset): + resp = test_client.get( + f"api/v1/explore/?form_data_key={FORM_DATA_KEY}&datasource_id={dataset.id}&datasource_type={dataset.type}" + ) + assert resp.status_code == 200 + data = json.loads(resp.data.decode("utf-8")) + result = data.get("result") + assert_dataset(result, dataset.id) + assert result["form_data"]["datasource"] == f"{dataset.id}__table" + assert result["form_data"]["test"] == "test value" + assert result["message"] == None + assert result["slice"] == None + + +def test_get_from_cache_unknown_key_chart_id( + test_client, login_as_admin, chart_id, dataset +): + unknown_key = "unknown_key" + resp = test_client.get( + f"api/v1/explore/?form_data_key={unknown_key}&slice_id={chart_id}" + ) + assert resp.status_code == 200 + data = json.loads(resp.data.decode("utf-8")) + result = data.get("result") + assert_dataset(result, dataset.id) + assert_slice(result, chart_id, dataset.id) + assert result["form_data"]["datasource"] == f"{dataset.id}__table" + assert ( + result["message"] + == "Form data not found in cache, reverting to chart metadata." + ) + + +def test_get_from_cache_unknown_key_dataset(test_client, login_as_admin, dataset): + unknown_key = "unknown_key" + resp = test_client.get( + f"api/v1/explore/?form_data_key={unknown_key}&datasource_id={dataset.id}&datasource_type={dataset.type}" + ) + assert resp.status_code == 200 + data = json.loads(resp.data.decode("utf-8")) + result = data.get("result") + assert_dataset(result, dataset.id) + assert result["form_data"]["datasource"] == f"{dataset.id}__table" + assert ( + result["message"] + == "Form data not found in cache, reverting to dataset metadata." + ) + assert result["slice"] == None + + +def test_get_from_cache_unknown_key_no_extra_parameters(test_client, login_as_admin): + unknown_key = "unknown_key" + resp = test_client.get(f"api/v1/explore/?form_data_key={unknown_key}") + assert resp.status_code == 200 + data = json.loads(resp.data.decode("utf-8")) + result = data.get("result") + assert result["dataset"]["name"] == "[Missing Dataset]" + assert result["form_data"]["datasource"] == "None__table" + assert result["message"] == None + assert result["slice"] == None + + +def test_get_from_permalink(test_client, login_as_admin, chart_id, dataset): + form_data = { + "chart_id": chart_id, + "datasource": f"{dataset.id}__{dataset.type}", + **FORM_DATA, + } + resp = test_client.post(f"api/v1/explore/permalink", json={"formData": form_data}) + data = json.loads(resp.data.decode("utf-8")) + permalink_key = data["key"] + resp = test_client.get(f"api/v1/explore/?permalink_key={permalink_key}") + assert resp.status_code == 200 + data = json.loads(resp.data.decode("utf-8")) + result = data.get("result") + assert_dataset(result, dataset.id) + assert result["form_data"]["datasource"] == f"{dataset.id}__table" + assert result["form_data"]["test"] == "test value" + assert result["message"] == None + assert result["slice"] == None + + +def test_get_from_permalink_unknown_key(test_client, login_as_admin): + unknown_key = "unknown_key" + resp = test_client.get(f"api/v1/explore/?permalink_key={unknown_key}") + assert resp.status_code == 404 + + +@patch("superset.security.SupersetSecurityManager.can_access_datasource") +def test_get_dataset_access_denied( + mock_can_access_datasource, test_client, login_as_admin, dataset +): + message = "Dataset access denied" + mock_can_access_datasource.side_effect = DatasetAccessDeniedError( + message=message, datasource_id=dataset.id, datasource_type=dataset.type + ) + resp = test_client.get( + f"api/v1/explore/?form_data_key={FORM_DATA_KEY}&datasource_id={dataset.id}&datasource_type={dataset.type}" + ) + data = json.loads(resp.data.decode("utf-8")) + assert resp.status_code == 403 + assert data["datasource_id"] == dataset.id + assert data["datasource_type"] == dataset.type + assert data["message"] == message + + +@patch("superset.datasource.dao.DatasourceDAO.get_datasource") +def test_wrong_endpoint(mock_get_datasource, test_client, login_as_admin, dataset): + dataset.default_endpoint = "another_endpoint" + mock_get_datasource.return_value = dataset + resp = test_client.get( + f"api/v1/explore/?datasource_id={dataset.id}&datasource_type={dataset.type}" + ) + data = json.loads(resp.data.decode("utf-8")) + assert resp.status_code == 302 + assert data["redirect"] == dataset.default_endpoint + + +def test_get_url_params(test_client, login_as_admin, chart_id): + resp = test_client.get(f"api/v1/explore/?slice_id={chart_id}&foo=bar") + assert resp.status_code == 200 + data = json.loads(resp.data.decode("utf-8")) + result = data.get("result") + + assert result["form_data"]["url_params"] == { + "foo": "bar", + "slice_id": str(chart_id), + } diff --git a/tests/integration_tests/explore/form_data/api_tests.py b/tests/integration_tests/explore/form_data/api_tests.py index 8b375df56ae3..0e73d0b51656 100644 --- a/tests/integration_tests/explore/form_data/api_tests.py +++ b/tests/integration_tests/explore/form_data/api_tests.py @@ -26,8 +26,7 @@ from superset.explore.form_data.commands.state import TemporaryExploreState from superset.extensions import cache_manager from superset.models.slice import Slice -from tests.integration_tests.base_tests import login -from tests.integration_tests.fixtures.client import client +from superset.utils.core import DatasourceType from tests.integration_tests.fixtures.world_bank_dashboard import ( load_world_bank_dashboard_with_slices, load_world_bank_data, @@ -79,82 +78,85 @@ def cache(chart_id, admin_id, datasource): cache_manager.explore_form_data_cache.set(KEY, entry) -def test_post(client, chart_id: int, datasource: SqlaTable): - login(client, "admin") +def test_post(test_client, login_as_admin, chart_id: int, datasource: SqlaTable): payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": INITIAL_FORM_DATA, } - resp = client.post("api/v1/explore/form_data", json=payload) + resp = test_client.post("api/v1/explore/form_data", json=payload) assert resp.status_code == 201 -def test_post_bad_request_non_string(client, chart_id: int, datasource: SqlaTable): - login(client, "admin") +def test_post_bad_request_non_string( + test_client, login_as_admin, chart_id: int, datasource: SqlaTable +): payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": 1234, } - resp = client.post("api/v1/explore/form_data", json=payload) + resp = test_client.post("api/v1/explore/form_data", json=payload) assert resp.status_code == 400 -def test_post_bad_request_non_json_string(client, chart_id: int, datasource: SqlaTable): - login(client, "admin") +def test_post_bad_request_non_json_string( + test_client, login_as_admin, chart_id: int, datasource: SqlaTable +): payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": "foo", } - resp = client.post("api/v1/explore/form_data", json=payload) + resp = test_client.post("api/v1/explore/form_data", json=payload) assert resp.status_code == 400 -def test_post_access_denied(client, chart_id: int, datasource: SqlaTable): - login(client, "gamma") +def test_post_access_denied( + test_client, login_as, chart_id: int, datasource: SqlaTable +): + login_as("gamma") payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": INITIAL_FORM_DATA, } - resp = client.post("api/v1/explore/form_data", json=payload) - assert resp.status_code == 404 + resp = test_client.post("api/v1/explore/form_data", json=payload) + assert resp.status_code == 403 -def test_post_same_key_for_same_context(client, chart_id: int, datasource: SqlaTable): - login(client, "admin") +def test_post_same_key_for_same_context( + test_client, login_as_admin, chart_id: int, datasource: SqlaTable +): payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": UPDATED_FORM_DATA, } - resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload) + resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload) + resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload) data = json.loads(resp.data.decode("utf-8")) second_key = data.get("key") assert first_key == second_key def test_post_different_key_for_different_context( - client, chart_id: int, datasource: SqlaTable + test_client, login_as_admin, chart_id: int, datasource: SqlaTable ): - login(client, "admin") payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": UPDATED_FORM_DATA, } - resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload) + resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") payload = { @@ -162,241 +164,244 @@ def test_post_different_key_for_different_context( "datasource_type": datasource.type, "form_data": json.dumps({"test": "initial value"}), } - resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload) + resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload) data = json.loads(resp.data.decode("utf-8")) second_key = data.get("key") assert first_key != second_key -def test_post_same_key_for_same_tab_id(client, chart_id: int, datasource: SqlaTable): - login(client, "admin") +def test_post_same_key_for_same_tab_id( + test_client, login_as_admin, chart_id: int, datasource: SqlaTable +): payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": json.dumps({"test": "initial value"}), } - resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload) + resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload) + resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload) data = json.loads(resp.data.decode("utf-8")) second_key = data.get("key") assert first_key == second_key def test_post_different_key_for_different_tab_id( - client, chart_id: int, datasource: SqlaTable + test_client, login_as_admin, chart_id: int, datasource: SqlaTable ): - login(client, "admin") payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": json.dumps({"test": "initial value"}), } - resp = client.post("api/v1/explore/form_data?tab_id=1", json=payload) + resp = test_client.post("api/v1/explore/form_data?tab_id=1", json=payload) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.post("api/v1/explore/form_data?tab_id=2", json=payload) + resp = test_client.post("api/v1/explore/form_data?tab_id=2", json=payload) data = json.loads(resp.data.decode("utf-8")) second_key = data.get("key") assert first_key != second_key -def test_post_different_key_for_no_tab_id(client, chart_id: int, datasource: SqlaTable): - login(client, "admin") +def test_post_different_key_for_no_tab_id( + test_client, login_as_admin, chart_id: int, datasource: SqlaTable +): payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": INITIAL_FORM_DATA, } - resp = client.post("api/v1/explore/form_data", json=payload) + resp = test_client.post("api/v1/explore/form_data", json=payload) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.post("api/v1/explore/form_data", json=payload) + resp = test_client.post("api/v1/explore/form_data", json=payload) data = json.loads(resp.data.decode("utf-8")) second_key = data.get("key") assert first_key != second_key -def test_put(client, chart_id: int, datasource: SqlaTable): - login(client, "admin") +def test_put(test_client, login_as_admin, chart_id: int, datasource: SqlaTable): payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": UPDATED_FORM_DATA, } - resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload) + resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload) assert resp.status_code == 200 -def test_put_same_key_for_same_tab_id(client, chart_id: int, datasource: SqlaTable): - login(client, "admin") +def test_put_same_key_for_same_tab_id( + test_client, login_as_admin, chart_id: int, datasource: SqlaTable +): payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": UPDATED_FORM_DATA, } - resp = client.put(f"api/v1/explore/form_data/{KEY}?tab_id=1", json=payload) + resp = test_client.put(f"api/v1/explore/form_data/{KEY}?tab_id=1", json=payload) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.put(f"api/v1/explore/form_data/{KEY}?tab_id=1", json=payload) + resp = test_client.put(f"api/v1/explore/form_data/{KEY}?tab_id=1", json=payload) data = json.loads(resp.data.decode("utf-8")) second_key = data.get("key") assert first_key == second_key def test_put_different_key_for_different_tab_id( - client, chart_id: int, datasource: SqlaTable + test_client, login_as_admin, chart_id: int, datasource: SqlaTable ): - login(client, "admin") payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": UPDATED_FORM_DATA, } - resp = client.put(f"api/v1/explore/form_data/{KEY}?tab_id=1", json=payload) + resp = test_client.put(f"api/v1/explore/form_data/{KEY}?tab_id=1", json=payload) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.put(f"api/v1/explore/form_data/{KEY}?tab_id=2", json=payload) + resp = test_client.put(f"api/v1/explore/form_data/{KEY}?tab_id=2", json=payload) data = json.loads(resp.data.decode("utf-8")) second_key = data.get("key") assert first_key != second_key -def test_put_different_key_for_no_tab_id(client, chart_id: int, datasource: SqlaTable): - login(client, "admin") +def test_put_different_key_for_no_tab_id( + test_client, login_as_admin, chart_id: int, datasource: SqlaTable +): payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": UPDATED_FORM_DATA, } - resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload) + resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload) data = json.loads(resp.data.decode("utf-8")) first_key = data.get("key") - resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload) + resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload) data = json.loads(resp.data.decode("utf-8")) second_key = data.get("key") assert first_key != second_key -def test_put_bad_request(client, chart_id: int, datasource: SqlaTable): - login(client, "admin") +def test_put_bad_request( + test_client, login_as_admin, chart_id: int, datasource: SqlaTable +): payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": 1234, } - resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload) + resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload) assert resp.status_code == 400 -def test_put_bad_request_non_string(client, chart_id: int, datasource: SqlaTable): - login(client, "admin") +def test_put_bad_request_non_string( + test_client, login_as_admin, chart_id: int, datasource: SqlaTable +): payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": 1234, } - resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload) + resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload) assert resp.status_code == 400 -def test_put_bad_request_non_json_string(client, chart_id: int, datasource: SqlaTable): - login(client, "admin") +def test_put_bad_request_non_json_string( + test_client, login_as_admin, chart_id: int, datasource: SqlaTable +): payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": "foo", } - resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload) + resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload) assert resp.status_code == 400 -def test_put_access_denied(client, chart_id: int, datasource: SqlaTable): - login(client, "gamma") +def test_put_access_denied(test_client, login_as, chart_id: int, datasource: SqlaTable): + login_as("gamma") payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": UPDATED_FORM_DATA, } - resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload) - assert resp.status_code == 404 + resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload) + assert resp.status_code == 403 -def test_put_not_owner(client, chart_id: int, datasource: SqlaTable): - login(client, "gamma") +def test_put_not_owner(test_client, login_as, chart_id: int, datasource: SqlaTable): + login_as("gamma") payload = { "datasource_id": datasource.id, "datasource_type": datasource.type, "chart_id": chart_id, "form_data": UPDATED_FORM_DATA, } - resp = client.put(f"api/v1/explore/form_data/{KEY}", json=payload) - assert resp.status_code == 404 + resp = test_client.put(f"api/v1/explore/form_data/{KEY}", json=payload) + assert resp.status_code == 403 -def test_get_key_not_found(client): - login(client, "admin") - resp = client.get(f"api/v1/explore/form_data/unknown-key") +def test_get_key_not_found(test_client, login_as_admin): + resp = test_client.get(f"api/v1/explore/form_data/unknown-key") assert resp.status_code == 404 -def test_get(client): - login(client, "admin") - resp = client.get(f"api/v1/explore/form_data/{KEY}") +def test_get(test_client, login_as_admin): + resp = test_client.get(f"api/v1/explore/form_data/{KEY}") assert resp.status_code == 200 data = json.loads(resp.data.decode("utf-8")) assert INITIAL_FORM_DATA == data.get("form_data") -def test_get_access_denied(client): - login(client, "gamma") - resp = client.get(f"api/v1/explore/form_data/{KEY}") - assert resp.status_code == 404 +def test_get_access_denied(test_client, login_as): + login_as("gamma") + resp = test_client.get(f"api/v1/explore/form_data/{KEY}") + assert resp.status_code == 403 @patch("superset.security.SupersetSecurityManager.can_access_datasource") -def test_get_dataset_access_denied(mock_can_access_datasource, client): +def test_get_dataset_access_denied( + mock_can_access_datasource, test_client, login_as_admin +): mock_can_access_datasource.side_effect = DatasetAccessDeniedError() - login(client, "admin") - resp = client.get(f"api/v1/explore/form_data/{KEY}") + resp = test_client.get(f"api/v1/explore/form_data/{KEY}") assert resp.status_code == 403 -def test_delete(client): - login(client, "admin") - resp = client.delete(f"api/v1/explore/form_data/{KEY}") +def test_delete(test_client, login_as_admin): + resp = test_client.delete(f"api/v1/explore/form_data/{KEY}") assert resp.status_code == 200 -def test_delete_access_denied(client): - login(client, "gamma") - resp = client.delete(f"api/v1/explore/form_data/{KEY}") - assert resp.status_code == 404 +def test_delete_access_denied(test_client, login_as): + login_as("gamma") + resp = test_client.delete(f"api/v1/explore/form_data/{KEY}") + assert resp.status_code == 403 -def test_delete_not_owner(client, chart_id: int, datasource: SqlaTable, admin_id: int): +def test_delete_not_owner( + test_client, login_as_admin, chart_id: int, datasource: SqlaTable, admin_id: int +): another_key = "another_key" another_owner = admin_id + 1 entry: TemporaryExploreState = { "owner": another_owner, "datasource_id": datasource.id, - "datasource_type": datasource.type, + "datasource_type": DatasourceType(datasource.type), "chart_id": chart_id, "form_data": INITIAL_FORM_DATA, } cache_manager.explore_form_data_cache.set(another_key, entry) - login(client, "admin") - resp = client.delete(f"api/v1/explore/form_data/{another_key}") + resp = test_client.delete(f"api/v1/explore/form_data/{another_key}") assert resp.status_code == 403 diff --git a/tests/integration_tests/explore/form_data/commands_tests.py b/tests/integration_tests/explore/form_data/commands_tests.py index 4db48cfa7973..18dd8415f6c6 100644 --- a/tests/integration_tests/explore/form_data/commands_tests.py +++ b/tests/integration_tests/explore/form_data/commands_tests.py @@ -110,7 +110,6 @@ def test_create_form_data_command(self, mock_g): datasource = f"{dataset.id}__{DatasourceType.TABLE}" args = CommandParameters( - actor=mock_g.user, datasource_id=dataset.id, datasource_type=DatasourceType.TABLE, chart_id=slice.id, @@ -136,7 +135,6 @@ def test_create_form_data_command_invalid_type(self, mock_g): datasource = f"{dataset.id}__{DatasourceType.TABLE}" create_args = CommandParameters( - actor=mock_g.user, datasource_id=dataset.id, datasource_type="InvalidType", chart_id=slice.id, @@ -163,7 +161,6 @@ def test_create_form_data_command_type_as_string(self, mock_g): datasource = f"{dataset.id}__{DatasourceType.TABLE}" create_args = CommandParameters( - actor=mock_g.user, datasource_id=dataset.id, datasource_type="table", chart_id=slice.id, @@ -189,7 +186,6 @@ def test_get_form_data_command(self, mock_g): datasource = f"{dataset.id}__{DatasourceType.TABLE}" create_args = CommandParameters( - actor=mock_g.user, datasource_id=dataset.id, datasource_type=DatasourceType.TABLE, chart_id=slice.id, @@ -198,7 +194,7 @@ def test_get_form_data_command(self, mock_g): ) key = CreateFormDataCommand(create_args).run() - key_args = CommandParameters(actor=mock_g.user, key=key) + key_args = CommandParameters(key=key) get_command = GetFormDataCommand(key_args) cache_data = json.loads(get_command.run()) @@ -221,7 +217,6 @@ def test_update_form_data_command(self, mock_g): datasource = f"{dataset.id}__{DatasourceType.TABLE}" create_args = CommandParameters( - actor=mock_g.user, datasource_id=dataset.id, datasource_type=DatasourceType.TABLE, chart_id=slice.id, @@ -232,7 +227,6 @@ def test_update_form_data_command(self, mock_g): query_datasource = f"{dataset.id}__{DatasourceType.TABLE}" update_args = CommandParameters( - actor=mock_g.user, datasource_id=query.id, datasource_type=DatasourceType.QUERY, chart_id=slice.id, @@ -249,7 +243,7 @@ def test_update_form_data_command(self, mock_g): # the updated key returned should be different from the old one assert new_key != key - key_args = CommandParameters(actor=mock_g.user, key=key) + key_args = CommandParameters(key=key) get_command = GetFormDataCommand(key_args) cache_data = json.loads(get_command.run()) @@ -271,7 +265,6 @@ def test_update_form_data_command_same_form_data(self, mock_g): datasource = f"{dataset.id}__{DatasourceType.TABLE}" create_args = CommandParameters( - actor=mock_g.user, datasource_id=dataset.id, datasource_type=DatasourceType.TABLE, chart_id=slice.id, @@ -281,7 +274,6 @@ def test_update_form_data_command_same_form_data(self, mock_g): key = CreateFormDataCommand(create_args).run() update_args = CommandParameters( - actor=mock_g.user, datasource_id=dataset.id, datasource_type=DatasourceType.TABLE, chart_id=slice.id, @@ -299,7 +291,7 @@ def test_update_form_data_command_same_form_data(self, mock_g): # the updated key returned should be the same as the old one assert new_key == key - key_args = CommandParameters(actor=mock_g.user, key=key) + key_args = CommandParameters(key=key) get_command = GetFormDataCommand(key_args) cache_data = json.loads(get_command.run()) @@ -321,7 +313,6 @@ def test_delete_form_data_command(self, mock_g): datasource = f"{dataset.id}__{DatasourceType.TABLE}" create_args = CommandParameters( - actor=mock_g.user, datasource_id=dataset.id, datasource_type=DatasourceType.TABLE, chart_id=slice.id, @@ -331,7 +322,6 @@ def test_delete_form_data_command(self, mock_g): key = CreateFormDataCommand(create_args).run() delete_args = CommandParameters( - actor=mock_g.user, key=key, ) @@ -349,7 +339,6 @@ def test_delete_form_data_command_key_expired(self, mock_g): } delete_args = CommandParameters( - actor=mock_g.user, key="some_expired_key", ) diff --git a/tests/integration_tests/explore/permalink/api_tests.py b/tests/integration_tests/explore/permalink/api_tests.py index b5228ab301b2..22a36f41e1be 100644 --- a/tests/integration_tests/explore/permalink/api_tests.py +++ b/tests/integration_tests/explore/permalink/api_tests.py @@ -28,8 +28,6 @@ from superset.key_value.utils import decode_permalink_id, encode_permalink_key from superset.models.slice import Slice from superset.utils.core import DatasourceType -from tests.integration_tests.base_tests import login -from tests.integration_tests.fixtures.client import client from tests.integration_tests.fixtures.world_bank_dashboard import ( load_world_bank_dashboard_with_slices, load_world_bank_data, @@ -38,11 +36,10 @@ @pytest.fixture -def chart(load_world_bank_dashboard_with_slices) -> Slice: - with app.app_context() as ctx: - session: Session = ctx.app.appbuilder.get_session - chart = session.query(Slice).filter_by(slice_name="World's Population").one() - return chart +def chart(app_context, load_world_bank_dashboard_with_slices) -> Slice: + session: Session = app_context.app.appbuilder.get_session + chart = session.query(Slice).filter_by(slice_name="World's Population").one() + return chart @pytest.fixture @@ -70,9 +67,10 @@ def permalink_salt() -> Iterator[str]: db.session.commit() -def test_post(client, form_data: Dict[str, Any], permalink_salt: str): - login(client, "admin") - resp = client.post(f"api/v1/explore/permalink", json={"formData": form_data}) +def test_post( + test_client, login_as_admin, form_data: Dict[str, Any], permalink_salt: str +): + resp = test_client.post(f"api/v1/explore/permalink", json={"formData": form_data}) assert resp.status_code == 201 data = json.loads(resp.data.decode("utf-8")) key = data["key"] @@ -83,13 +81,15 @@ def test_post(client, form_data: Dict[str, Any], permalink_salt: str): db.session.commit() -def test_post_access_denied(client, form_data): - login(client, "gamma") - resp = client.post(f"api/v1/explore/permalink", json={"formData": form_data}) - assert resp.status_code == 404 +def test_post_access_denied(test_client, login_as, form_data): + login_as("gamma") + resp = test_client.post(f"api/v1/explore/permalink", json={"formData": form_data}) + assert resp.status_code == 403 -def test_get_missing_chart(client, chart, permalink_salt: str) -> None: +def test_get_missing_chart( + test_client, login_as_admin, chart, permalink_salt: str +) -> None: from superset.key_value.models import KeyValueEntry chart_id = 1234 @@ -110,25 +110,24 @@ def test_get_missing_chart(client, chart, permalink_salt: str) -> None: db.session.add(entry) db.session.commit() key = encode_permalink_key(entry.id, permalink_salt) - login(client, "admin") - resp = client.get(f"api/v1/explore/permalink/{key}") + resp = test_client.get(f"api/v1/explore/permalink/{key}") assert resp.status_code == 404 db.session.delete(entry) db.session.commit() -def test_post_invalid_schema(client) -> None: - login(client, "admin") - resp = client.post(f"api/v1/explore/permalink", json={"abc": 123}) +def test_post_invalid_schema(test_client, login_as_admin) -> None: + resp = test_client.post(f"api/v1/explore/permalink", json={"abc": 123}) assert resp.status_code == 400 -def test_get(client, form_data: Dict[str, Any], permalink_salt: str) -> None: - login(client, "admin") - resp = client.post(f"api/v1/explore/permalink", json={"formData": form_data}) +def test_get( + test_client, login_as_admin, form_data: Dict[str, Any], permalink_salt: str +) -> None: + resp = test_client.post(f"api/v1/explore/permalink", json={"formData": form_data}) data = json.loads(resp.data.decode("utf-8")) key = data["key"] - resp = client.get(f"api/v1/explore/permalink/{key}") + resp = test_client.get(f"api/v1/explore/permalink/{key}") assert resp.status_code == 200 result = json.loads(resp.data.decode("utf-8")) assert result["state"]["formData"] == form_data diff --git a/tests/integration_tests/explore/permalink/commands_tests.py b/tests/integration_tests/explore/permalink/commands_tests.py index 2bb44bb068ed..63ed02cd7bd9 100644 --- a/tests/integration_tests/explore/permalink/commands_tests.py +++ b/tests/integration_tests/explore/permalink/commands_tests.py @@ -109,7 +109,7 @@ def test_create_permalink_command(self, mock_g): datasource = f"{dataset.id}__{DatasourceType.TABLE}" command = CreateExplorePermalinkCommand( - mock_g.user, {"formData": {"datasource": datasource, "slice_id": slice.id}} + {"formData": {"datasource": datasource, "slice_id": slice.id}} ) assert isinstance(command.run(), str) @@ -130,10 +130,10 @@ def test_get_permalink_command(self, mock_g): datasource = f"{dataset.id}__{DatasourceType.TABLE}" key = CreateExplorePermalinkCommand( - mock_g.user, {"formData": {"datasource": datasource, "slice_id": slice.id}} + {"formData": {"datasource": datasource, "slice_id": slice.id}} ).run() - get_command = GetExplorePermalinkCommand(mock_g.user, key) + get_command = GetExplorePermalinkCommand(key) cache_data = get_command.run() assert cache_data.get("datasource") == datasource @@ -166,7 +166,7 @@ def test_get_permalink_command_with_old_dataset_key( "formData": {"datasource": datasource_string, "slice_id": slice.id} }, } - get_command = GetExplorePermalinkCommand(mock_g.user, "thisisallmocked") + get_command = GetExplorePermalinkCommand("thisisallmocked") cache_data = get_command.run() assert cache_data.get("datasource") == datasource_string diff --git a/tests/integration_tests/fixtures/birth_names_dashboard.py b/tests/integration_tests/fixtures/birth_names_dashboard.py index ef71803aa5db..be680a720dd8 100644 --- a/tests/integration_tests/fixtures/birth_names_dashboard.py +++ b/tests/integration_tests/fixtures/birth_names_dashboard.py @@ -18,7 +18,7 @@ import pytest -from superset import ConnectorRegistry, db +from superset import db from superset.connectors.sqla.models import SqlaTable from superset.models.core import Database from superset.models.dashboard import Dashboard @@ -68,7 +68,7 @@ def _create_dashboards(): from superset.examples.birth_names import create_dashboard, create_slices - slices, _ = create_slices(table, admin_owner=False) + slices, _ = create_slices(table) dash = create_dashboard(slices) slices_ids_to_delete = [slice.id for slice in slices] dash_id_to_delete = dash.id @@ -93,27 +93,16 @@ def _create_table( return table -def _cleanup(dash_id: int, slices_ids: List[int]) -> None: +def _cleanup(dash_id: int, slice_ids: List[int]) -> None: schema = get_example_default_schema() - - table_id = ( - db.session.query(SqlaTable) - .filter_by(table_name="birth_names", schema=schema) - .one() - .id - ) - datasource = ConnectorRegistry.get_datasource("table", table_id, db.session) - columns = [column for column in datasource.columns] - metrics = [metric for metric in datasource.metrics] - - for column in columns: - db.session.delete(column) - for metric in metrics: - db.session.delete(metric) - - dash = db.session.query(Dashboard).filter_by(id=dash_id).first() - - db.session.delete(dash) - for slice_id in slices_ids: - db.session.query(Slice).filter_by(id=slice_id).delete() + for datasource in db.session.query(SqlaTable).filter_by( + table_name="birth_names", schema=schema + ): + for col in datasource.columns + datasource.metrics: + db.session.delete(col) + + for dash in db.session.query(Dashboard).filter_by(id=dash_id): + db.session.delete(dash) + for slc in db.session.query(Slice).filter(Slice.id.in_(slice_ids)): + db.session.delete(slc) db.session.commit() diff --git a/tests/integration_tests/fixtures/datasource.py b/tests/integration_tests/fixtures/datasource.py index 574f43d52bbc..f394d68a0e76 100644 --- a/tests/integration_tests/fixtures/datasource.py +++ b/tests/integration_tests/fixtures/datasource.py @@ -19,7 +19,7 @@ import pytest from sqlalchemy import Column, create_engine, Date, Integer, MetaData, String, Table -from sqlalchemy.ext.declarative.api import declarative_base +from sqlalchemy.ext.declarative import declarative_base from superset.columns.models import Column as Sl_Column from superset.connectors.sqla.models import SqlaTable, TableColumn diff --git a/tests/integration_tests/fixtures/deck_geojson_form_data.json b/tests/integration_tests/fixtures/deck_geojson_form_data.json index 422197a2855c..e8258c7d443a 100644 --- a/tests/integration_tests/fixtures/deck_geojson_form_data.json +++ b/tests/integration_tests/fixtures/deck_geojson_form_data.json @@ -43,5 +43,5 @@ "granularity_sqla": null, "autozoom": true, "url_params": {}, - "size": 100 + "size": "100" } diff --git a/tests/integration_tests/fixtures/deck_path_form_data.json b/tests/integration_tests/fixtures/deck_path_form_data.json index 39cc2007f85b..ac2e404d83fb 100644 --- a/tests/integration_tests/fixtures/deck_path_form_data.json +++ b/tests/integration_tests/fixtures/deck_path_form_data.json @@ -45,5 +45,5 @@ "granularity_sqla": null, "autozoom": true, "url_params": {}, - "size": 100 + "size": "100" } diff --git a/tests/integration_tests/fixtures/energy_dashboard.py b/tests/integration_tests/fixtures/energy_dashboard.py index 73f2f1e239ae..202f494aa2d1 100644 --- a/tests/integration_tests/fixtures/energy_dashboard.py +++ b/tests/integration_tests/fixtures/energy_dashboard.py @@ -39,17 +39,18 @@ def load_energy_table_data(): with app.app_context(): database = get_example_database() - df = _get_dataframe() - df.to_sql( - ENERGY_USAGE_TBL_NAME, - database.get_sqla_engine(), - if_exists="replace", - chunksize=500, - index=False, - dtype={"source": String(255), "target": String(255), "value": Float()}, - method="multi", - schema=get_example_default_schema(), - ) + with database.get_sqla_engine_with_context() as engine: + df = _get_dataframe() + df.to_sql( + ENERGY_USAGE_TBL_NAME, + engine, + if_exists="replace", + chunksize=500, + index=False, + dtype={"source": String(255), "target": String(255), "value": Float()}, + method="multi", + schema=get_example_default_schema(), + ) yield with app.app_context(): with get_example_database().get_sqla_engine_with_context() as engine: @@ -82,7 +83,6 @@ def _create_energy_table() -> List[Slice]: table.metrics.append( SqlMetric(metric_name="sum__value", expression=f"SUM({col})") ) - db.session.merge(table) db.session.commit() table.fetch_metadata() diff --git a/tests/integration_tests/fixtures/importexport.py b/tests/integration_tests/fixtures/importexport.py index 18bec4f17995..b624f3e63ced 100644 --- a/tests/integration_tests/fixtures/importexport.py +++ b/tests/integration_tests/fixtures/importexport.py @@ -350,6 +350,7 @@ "allow_csv_upload": True, "allow_ctas": True, "allow_cvas": True, + "allow_dml": True, "allow_run_async": False, "cache_timeout": None, "database_name": "imported_database", diff --git a/tests/integration_tests/fixtures/tabbed_dashboard.py b/tests/integration_tests/fixtures/tabbed_dashboard.py index 4f9c4465c2d0..15a871c7aea9 100644 --- a/tests/integration_tests/fixtures/tabbed_dashboard.py +++ b/tests/integration_tests/fixtures/tabbed_dashboard.py @@ -20,16 +20,16 @@ from superset import db from superset.models.dashboard import Dashboard -from tests.integration_tests.dashboard_utils import create_dashboard -from tests.integration_tests.test_app import app +from superset.utils.core import shortid +from tests.integration_tests.dashboards.superset_factory_util import create_dashboard -@pytest.fixture(scope="session") -def tabbed_dashboard(): +@pytest.fixture +def tabbed_dashboard(app_context): position_json = { "DASHBOARD_VERSION_KEY": "v2", "GRID_ID": { - "children": ["TABS-IpViLohnyP"], + "children": ["TABS-L1A", "TABS-L1B"], "id": "GRID_ID", "parents": ["ROOT_ID"], "type": "GRID", @@ -40,38 +40,102 @@ def tabbed_dashboard(): "type": "HEADER", }, "ROOT_ID": {"children": ["GRID_ID"], "id": "ROOT_ID", "type": "ROOT"}, - "TAB-j53G4gtKGF": { + "TAB-L1AA": { "children": [], - "id": "TAB-j53G4gtKGF", + "id": "TAB-L1AA", "meta": { "defaultText": "Tab title", "placeholder": "Tab title", - "text": "Tab 1", + "text": "Tab L1AA", }, - "parents": ["ROOT_ID", "GRID_ID", "TABS-IpViLohnyP"], + "parents": ["ROOT_ID", "GRID_ID", "TABS-L1A"], "type": "TAB", }, - "TAB-nerWR09Ju": { + "TAB-L1AB": { "children": [], - "id": "TAB-nerWR09Ju", + "id": "TAB-L1AB", + "meta": { + "defaultText": "Tab title", + "placeholder": "Tab title", + "text": "Tab L1AB", + }, + "parents": ["ROOT_ID", "GRID_ID", "TABS-L1A"], + "type": "TAB", + }, + "TABS-L1A": { + "children": ["TAB-L1AA", "TAB-L1AB"], + "id": "TABS-L1A", + "meta": {}, + "parents": ["ROOT_ID", "GRID_ID"], + "type": "TABS", + }, + "TAB-L1BA": { + "children": [], + "id": "TAB-L1BA", + "meta": { + "defaultText": "Tab title", + "placeholder": "Tab title", + "text": "Tab L1B", + }, + "parents": ["ROOT_ID", "GRID_ID", "TABS-L1B"], + "type": "TAB", + }, + "TAB-L1BB": { + "children": ["TABS-L2A"], + "id": "TAB-L1BB", "meta": { "defaultText": "Tab title", "placeholder": "Tab title", "text": "Tab 2", }, - "parents": ["ROOT_ID", "GRID_ID", "TABS-IpViLohnyP"], + "parents": ["ROOT_ID", "GRID_ID", "TABS-L1B"], "type": "TAB", }, - "TABS-IpViLohnyP": { - "children": ["TAB-j53G4gtKGF", "TAB-nerWR09Ju"], - "id": "TABS-IpViLohnyP", + "TABS-L1B": { + "children": ["TAB-L1BA", "TAB-L1BB"], + "id": "TABS-L1B", "meta": {}, "parents": ["ROOT_ID", "GRID_ID"], "type": "TABS", }, + "TAB-L2AA": { + "children": [], + "id": "TAB-L2AA", + "meta": { + "defaultText": "Tab title", + "placeholder": "Tab title", + "text": "Tab L2AA", + }, + "parents": ["ROOT_ID", "GRID_ID", "TABS-L2A"], + "type": "TAB", + }, + "TAB-L2AB": { + "children": [], + "id": "TAB-L2AB", + "meta": { + "defaultText": "Tab title", + "placeholder": "Tab title", + "text": "Tab L2AB", + }, + "parents": ["ROOT_ID", "GRID_ID", "TABS-L2A"], + "type": "TAB", + }, + "TABS-L2A": { + "children": ["TAB-L2AA", "TAB-L2AB"], + "id": "TABS-L2A", + "meta": {}, + "parents": ["ROOT_ID", "GRID_ID", "TABS-L1BB"], + "type": "TABS", + }, } - with app.app_context(): - dash = create_dashboard( - "tabbed-dash-test", "Tabbed Dash Test", json.dumps(position_json), [] - ) + dash = create_dashboard( + slug=f"tabbed-dash-{shortid()}", + dashboard_title="Test tabbed dash", + position_json=json.dumps(position_json), + slices=[], + ) + db.session.add(dash) + db.session.commit() yield dash + db.session.query(Dashboard).filter_by(id=dash.id).delete() + db.session.commit() diff --git a/tests/integration_tests/db_engine_specs/dremio_tests.py b/tests/integration_tests/fixtures/tags.py similarity index 57% rename from tests/integration_tests/db_engine_specs/dremio_tests.py rename to tests/integration_tests/fixtures/tags.py index 5d678c947bb2..57fd4ec7196e 100644 --- a/tests/integration_tests/db_engine_specs/dremio_tests.py +++ b/tests/integration_tests/fixtures/tags.py @@ -14,20 +14,20 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from superset.db_engine_specs.dremio import DremioEngineSpec -from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec +import pytest -class TestDremioDbEngineSpec(TestDbEngineSpec): - def test_convert_dttm(self): - dttm = self.get_dttm() +from superset.tags.core import clear_sqla_event_listeners, register_sqla_event_listeners +from tests.integration_tests.test_app import app - self.assertEqual( - DremioEngineSpec.convert_dttm("DATE", dttm), - "TO_DATE('2019-01-02', 'YYYY-MM-DD')", - ) - self.assertEqual( - DremioEngineSpec.convert_dttm("TIMESTAMP", dttm), - "TO_TIMESTAMP('2019-01-02 03:04:05.678', 'YYYY-MM-DD HH24:MI:SS.FFF')", - ) +@pytest.fixture +def with_tagging_system_feature(): + with app.app_context(): + is_enabled = app.config["DEFAULT_FEATURE_FLAGS"]["TAGGING_SYSTEM"] + if not is_enabled: + app.config["DEFAULT_FEATURE_FLAGS"]["TAGGING_SYSTEM"] = True + register_sqla_event_listeners() + yield + app.config["DEFAULT_FEATURE_FLAGS"]["TAGGING_SYSTEM"] = False + clear_sqla_event_listeners() diff --git a/tests/integration_tests/fixtures/unicode_dashboard.py b/tests/integration_tests/fixtures/unicode_dashboard.py index c7b828176f2c..78178bcde755 100644 --- a/tests/integration_tests/fixtures/unicode_dashboard.py +++ b/tests/integration_tests/fixtures/unicode_dashboard.py @@ -37,21 +37,22 @@ @pytest.fixture(scope="session") def load_unicode_data(): with app.app_context(): - _get_dataframe().to_sql( - UNICODE_TBL_NAME, - get_example_database().get_sqla_engine(), - if_exists="replace", - chunksize=500, - dtype={"phrase": String(500)}, - index=False, - method="multi", - schema=get_example_default_schema(), - ) + with get_example_database().get_sqla_engine_with_context() as engine: + _get_dataframe().to_sql( + UNICODE_TBL_NAME, + engine, + if_exists="replace", + chunksize=500, + dtype={"phrase": String(500)}, + index=False, + method="multi", + schema=get_example_default_schema(), + ) yield with app.app_context(): - engine = get_example_database().get_sqla_engine() - engine.execute("DROP TABLE IF EXISTS unicode_test") + with get_example_database().get_sqla_engine_with_context() as engine: + engine.execute("DROP TABLE IF EXISTS unicode_test") @pytest.fixture() diff --git a/tests/integration_tests/fixtures/world_bank_dashboard.py b/tests/integration_tests/fixtures/world_bank_dashboard.py index 2c6fb2c3e26e..561bbe10b270 100644 --- a/tests/integration_tests/fixtures/world_bank_dashboard.py +++ b/tests/integration_tests/fixtures/world_bank_dashboard.py @@ -50,21 +50,22 @@ def load_world_bank_data(): "country_name": String(255), "region": String(255), } - _get_dataframe(database).to_sql( - WB_HEALTH_POPULATION, - get_example_database().get_sqla_engine(), - if_exists="replace", - chunksize=500, - dtype=dtype, - index=False, - method="multi", - schema=get_example_default_schema(), - ) + with database.get_sqla_engine_with_context() as engine: + _get_dataframe(database).to_sql( + WB_HEALTH_POPULATION, + engine, + if_exists="replace", + chunksize=500, + dtype=dtype, + index=False, + method="multi", + schema=get_example_default_schema(), + ) yield with app.app_context(): - engine = get_example_database().get_sqla_engine() - engine.execute("DROP TABLE IF EXISTS wb_health_population") + with get_example_database().get_sqla_engine_with_context() as engine: + engine.execute("DROP TABLE IF EXISTS wb_health_population") @pytest.fixture() diff --git a/tests/integration_tests/import_export_tests.py b/tests/integration_tests/import_export_tests.py index 81acda80185c..5bbc985a3667 100644 --- a/tests/integration_tests/import_export_tests.py +++ b/tests/integration_tests/import_export_tests.py @@ -50,33 +50,31 @@ from .base_tests import SupersetTestCase +def delete_imports(): + with app.app_context(): + # Imported data clean up + session = db.session + for slc in session.query(Slice): + if "remote_id" in slc.params_dict: + session.delete(slc) + for dash in session.query(Dashboard): + if "remote_id" in dash.params_dict: + session.delete(dash) + for table in session.query(SqlaTable): + if "remote_id" in table.params_dict: + session.delete(table) + session.commit() + + +@pytest.fixture(autouse=True, scope="module") +def clean_imports(): + yield + delete_imports() + + class TestImportExport(SupersetTestCase): """Testing export import functionality for dashboards""" - @classmethod - def delete_imports(cls): - with app.app_context(): - # Imported data clean up - session = db.session - for slc in session.query(Slice): - if "remote_id" in slc.params_dict: - session.delete(slc) - for dash in session.query(Dashboard): - if "remote_id" in dash.params_dict: - session.delete(dash) - for table in session.query(SqlaTable): - if "remote_id" in table.params_dict: - session.delete(table) - session.commit() - - @classmethod - def setUpClass(cls): - cls.delete_imports() - - @classmethod - def tearDownClass(cls): - cls.delete_imports() - def create_slice( self, name, diff --git a/tests/integration_tests/insert_chart_mixin.py b/tests/integration_tests/insert_chart_mixin.py index 8fcb33067e35..da05d0c49d04 100644 --- a/tests/integration_tests/insert_chart_mixin.py +++ b/tests/integration_tests/insert_chart_mixin.py @@ -16,7 +16,8 @@ # under the License. from typing import List, Optional -from superset import ConnectorRegistry, db, security_manager +from superset import db, security_manager +from superset.connectors.sqla.models import SqlaTable from superset.models.slice import Slice @@ -43,8 +44,8 @@ def insert_chart( for owner in owners: user = db.session.query(security_manager.user_model).get(owner) obj_owners.append(user) - datasource = ConnectorRegistry.get_datasource( - datasource_type, datasource_id, db.session + datasource = ( + db.session.query(SqlaTable).filter_by(id=datasource_id).one_or_none() ) slice = Slice( cache_timeout=cache_timeout, diff --git a/tests/integration_tests/key_value/commands/create_test.py b/tests/integration_tests/key_value/commands/create_test.py index 2718aa822c3e..0e789026baff 100644 --- a/tests/integration_tests/key_value/commands/create_test.py +++ b/tests/integration_tests/key_value/commands/create_test.py @@ -23,6 +23,7 @@ from flask_appbuilder.security.sqla.models import User from superset.extensions import db +from superset.utils.core import override_user from tests.integration_tests.key_value.commands.fixtures import ( admin, ID_KEY, @@ -36,19 +37,23 @@ def test_create_id_entry(app_context: AppContext, admin: User) -> None: from superset.key_value.commands.create import CreateKeyValueCommand from superset.key_value.models import KeyValueEntry - key = CreateKeyValueCommand(actor=admin, resource=RESOURCE, value=VALUE).run() - entry = db.session.query(KeyValueEntry).filter_by(id=key.id).autoflush(False).one() - assert pickle.loads(entry.value) == VALUE - assert entry.created_by_fk == admin.id - db.session.delete(entry) - db.session.commit() + with override_user(admin): + key = CreateKeyValueCommand(resource=RESOURCE, value=VALUE).run() + entry = ( + db.session.query(KeyValueEntry).filter_by(id=key.id).autoflush(False).one() + ) + assert pickle.loads(entry.value) == VALUE + assert entry.created_by_fk == admin.id + db.session.delete(entry) + db.session.commit() def test_create_uuid_entry(app_context: AppContext, admin: User) -> None: from superset.key_value.commands.create import CreateKeyValueCommand from superset.key_value.models import KeyValueEntry - key = CreateKeyValueCommand(actor=admin, resource=RESOURCE, value=VALUE).run() + with override_user(admin): + key = CreateKeyValueCommand(resource=RESOURCE, value=VALUE).run() entry = ( db.session.query(KeyValueEntry).filter_by(uuid=key.uuid).autoflush(False).one() ) diff --git a/tests/integration_tests/key_value/commands/update_test.py b/tests/integration_tests/key_value/commands/update_test.py index 3b24ecdf0a30..8eb03b4eda9e 100644 --- a/tests/integration_tests/key_value/commands/update_test.py +++ b/tests/integration_tests/key_value/commands/update_test.py @@ -24,6 +24,7 @@ from flask_appbuilder.security.sqla.models import User from superset.extensions import db +from superset.utils.core import override_user from tests.integration_tests.key_value.commands.fixtures import ( admin, ID_KEY, @@ -47,12 +48,12 @@ def test_update_id_entry( from superset.key_value.commands.update import UpdateKeyValueCommand from superset.key_value.models import KeyValueEntry - key = UpdateKeyValueCommand( - actor=admin, - resource=RESOURCE, - key=ID_KEY, - value=NEW_VALUE, - ).run() + with override_user(admin): + key = UpdateKeyValueCommand( + resource=RESOURCE, + key=ID_KEY, + value=NEW_VALUE, + ).run() assert key is not None assert key.id == ID_KEY entry = db.session.query(KeyValueEntry).filter_by(id=ID_KEY).autoflush(False).one() @@ -68,12 +69,12 @@ def test_update_uuid_entry( from superset.key_value.commands.update import UpdateKeyValueCommand from superset.key_value.models import KeyValueEntry - key = UpdateKeyValueCommand( - actor=admin, - resource=RESOURCE, - key=UUID_KEY, - value=NEW_VALUE, - ).run() + with override_user(admin): + key = UpdateKeyValueCommand( + resource=RESOURCE, + key=UUID_KEY, + value=NEW_VALUE, + ).run() assert key is not None assert key.uuid == UUID_KEY entry = ( @@ -86,10 +87,10 @@ def test_update_uuid_entry( def test_update_missing_entry(app_context: AppContext, admin: User) -> None: from superset.key_value.commands.update import UpdateKeyValueCommand - key = UpdateKeyValueCommand( - actor=admin, - resource=RESOURCE, - key=456, - value=NEW_VALUE, - ).run() + with override_user(admin): + key = UpdateKeyValueCommand( + resource=RESOURCE, + key=456, + value=NEW_VALUE, + ).run() assert key is None diff --git a/tests/integration_tests/key_value/commands/upsert_test.py b/tests/integration_tests/key_value/commands/upsert_test.py index 1970a1fc2c29..e5cd27e3a6cc 100644 --- a/tests/integration_tests/key_value/commands/upsert_test.py +++ b/tests/integration_tests/key_value/commands/upsert_test.py @@ -24,6 +24,7 @@ from flask_appbuilder.security.sqla.models import User from superset.extensions import db +from superset.utils.core import override_user from tests.integration_tests.key_value.commands.fixtures import ( admin, ID_KEY, @@ -47,12 +48,12 @@ def test_upsert_id_entry( from superset.key_value.commands.upsert import UpsertKeyValueCommand from superset.key_value.models import KeyValueEntry - key = UpsertKeyValueCommand( - actor=admin, - resource=RESOURCE, - key=ID_KEY, - value=NEW_VALUE, - ).run() + with override_user(admin): + key = UpsertKeyValueCommand( + resource=RESOURCE, + key=ID_KEY, + value=NEW_VALUE, + ).run() assert key is not None assert key.id == ID_KEY entry = ( @@ -70,12 +71,12 @@ def test_upsert_uuid_entry( from superset.key_value.commands.upsert import UpsertKeyValueCommand from superset.key_value.models import KeyValueEntry - key = UpsertKeyValueCommand( - actor=admin, - resource=RESOURCE, - key=UUID_KEY, - value=NEW_VALUE, - ).run() + with override_user(admin): + key = UpsertKeyValueCommand( + resource=RESOURCE, + key=UUID_KEY, + value=NEW_VALUE, + ).run() assert key is not None assert key.uuid == UUID_KEY entry = ( @@ -89,12 +90,12 @@ def test_upsert_missing_entry(app_context: AppContext, admin: User) -> None: from superset.key_value.commands.upsert import UpsertKeyValueCommand from superset.key_value.models import KeyValueEntry - key = UpsertKeyValueCommand( - actor=admin, - resource=RESOURCE, - key=456, - value=NEW_VALUE, - ).run() + with override_user(admin): + key = UpsertKeyValueCommand( + resource=RESOURCE, + key=456, + value=NEW_VALUE, + ).run() assert key is not None assert key.id == 456 db.session.query(KeyValueEntry).filter_by(id=456).delete() diff --git a/tests/integration_tests/log_api_tests.py b/tests/integration_tests/log_api_tests.py index 089ac07921c5..83a7f5fd84b3 100644 --- a/tests/integration_tests/log_api_tests.py +++ b/tests/integration_tests/log_api_tests.py @@ -16,16 +16,20 @@ # under the License. # isort:skip_file """Unit tests for Superset""" +from datetime import datetime, timedelta import json from typing import Optional +from unittest.mock import ANY -import prison from flask_appbuilder.security.sqla.models import User +import prison from unittest.mock import patch from superset import db from superset.models.core import Log from superset.views.log.api import LogRestApi +from tests.integration_tests.dashboard_utils import create_dashboard +from tests.integration_tests.test_app import app from .base_tests import SupersetTestCase @@ -106,6 +110,8 @@ def test_get_list_not_allowed(self): self.login(username="alpha") rv = self.client.get(uri) self.assertEqual(rv.status_code, 403) + db.session.delete(log) + db.session.commit() def test_get_item(self): """ @@ -152,3 +158,178 @@ def test_update_log(self): self.assertEqual(rv.status_code, 405) db.session.delete(log) db.session.commit() + + def test_get_recent_activity_no_broad_access(self): + """ + Log API: Test recent activity not visible for other users without + ENABLE_BROAD_ACTIVITY_ACCESS flag on + """ + admin_user = self.get_user("admin") + self.login(username="admin") + app.config["ENABLE_BROAD_ACTIVITY_ACCESS"] = False + + uri = f"api/v1/log/recent_activity/{admin_user.id + 1}/" + rv = self.client.get(uri) + self.assertEqual(rv.status_code, 403) + app.config["ENABLE_BROAD_ACTIVITY_ACCESS"] = True + + def test_get_recent_activity(self): + """ + Log API: Test recent activity endpoint + """ + admin_user = self.get_user("admin") + self.login(username="admin") + dash = create_dashboard("dash_slug", "dash_title", "{}", []) + log1 = self.insert_log("dashboard", admin_user, dashboard_id=dash.id) + log2 = self.insert_log("dashboard", admin_user, dashboard_id=dash.id) + + uri = f"api/v1/log/recent_activity/{admin_user.id}/" + rv = self.client.get(uri) + self.assertEqual(rv.status_code, 200) + response = json.loads(rv.data.decode("utf-8")) + + db.session.delete(log1) + db.session.delete(log2) + db.session.delete(dash) + db.session.commit() + + self.assertEqual( + response, + { + "result": [ + { + "action": "dashboard", + "item_type": "dashboard", + "item_url": "/superset/dashboard/dash_slug/", + "item_title": "dash_title", + "time": ANY, + "time_delta_humanized": ANY, + } + ] + }, + ) + + def test_get_recent_activity_actions_filter(self): + """ + Log API: Test recent activity actions argument + """ + admin_user = self.get_user("admin") + self.login(username="admin") + dash = create_dashboard("dash_slug", "dash_title", "{}", []) + log = self.insert_log("dashboard", admin_user, dashboard_id=dash.id) + log2 = self.insert_log("explore", admin_user, dashboard_id=dash.id) + + arguments = {"actions": ["dashboard"]} + uri = f"api/v1/log/recent_activity/{admin_user.id}/?q={prison.dumps(arguments)}" + rv = self.client.get(uri) + + db.session.delete(log) + db.session.delete(log2) + db.session.delete(dash) + db.session.commit() + + self.assertEqual(rv.status_code, 200) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(len(response["result"]), 1) + + def test_get_recent_activity_distinct_false(self): + """ + Log API: Test recent activity when distinct is false + """ + db.session.query(Log).delete(synchronize_session=False) + db.session.commit() + admin_user = self.get_user("admin") + self.login(username="admin") + dash = create_dashboard("dash_slug", "dash_title", "{}", []) + log = self.insert_log("dashboard", admin_user, dashboard_id=dash.id) + log2 = self.insert_log("dashboard", admin_user, dashboard_id=dash.id) + + arguments = {"distinct": False} + uri = f"api/v1/log/recent_activity/{admin_user.id}/?q={prison.dumps(arguments)}" + rv = self.client.get(uri) + + db.session.delete(log) + db.session.delete(log2) + db.session.delete(dash) + db.session.commit() + self.assertEqual(rv.status_code, 200) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual(len(response["result"]), 2) + + def test_get_recent_activity_pagination(self): + """ + Log API: Test recent activity pagination arguments + """ + admin_user = self.get_user("admin") + self.login(username="admin") + dash = create_dashboard("dash_slug", "dash_title", "{}", []) + dash2 = create_dashboard("dash2_slug", "dash2_title", "{}", []) + dash3 = create_dashboard("dash3_slug", "dash3_title", "{}", []) + log = self.insert_log("dashboard", admin_user, dashboard_id=dash.id) + log2 = self.insert_log("dashboard", admin_user, dashboard_id=dash2.id) + log3 = self.insert_log("dashboard", admin_user, dashboard_id=dash3.id) + + now = datetime.now() + log3.dttm = now + log2.dttm = now - timedelta(days=1) + log.dttm = now - timedelta(days=2) + + arguments = {"page": 0, "page_size": 2} + uri = f"api/v1/log/recent_activity/{admin_user.id}/?q={prison.dumps(arguments)}" + rv = self.client.get(uri) + + self.assertEqual(rv.status_code, 200) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual( + response, + { + "result": [ + { + "action": "dashboard", + "item_type": "dashboard", + "item_url": "/superset/dashboard/dash3_slug/", + "item_title": "dash3_title", + "time": ANY, + "time_delta_humanized": ANY, + }, + { + "action": "dashboard", + "item_type": "dashboard", + "item_url": "/superset/dashboard/dash2_slug/", + "item_title": "dash2_title", + "time": ANY, + "time_delta_humanized": ANY, + }, + ] + }, + ) + + arguments = {"page": 1, "page_size": 2} + uri = f"api/v1/log/recent_activity/{admin_user.id}/?q={prison.dumps(arguments)}" + rv = self.client.get(uri) + + db.session.delete(log) + db.session.delete(log2) + db.session.delete(log3) + db.session.delete(dash) + db.session.delete(dash2) + db.session.delete(dash3) + db.session.commit() + + self.assertEqual(rv.status_code, 200) + response = json.loads(rv.data.decode("utf-8")) + self.assertEqual( + response, + { + "result": [ + { + "action": "dashboard", + "item_type": "dashboard", + "item_url": "/superset/dashboard/dash_slug/", + "item_title": "dash_title", + "time": ANY, + "time_delta_humanized": ANY, + } + ] + }, + ) diff --git a/tests/integration_tests/migrations/06e1e70058c7_migrate_legacy_area__tests.py b/tests/integration_tests/migrations/06e1e70058c7_migrate_legacy_area__tests.py new file mode 100644 index 000000000000..f02d069b2baf --- /dev/null +++ b/tests/integration_tests/migrations/06e1e70058c7_migrate_legacy_area__tests.py @@ -0,0 +1,99 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import json + +from superset.app import SupersetApp +from superset.migrations.shared.migrate_viz import MigrateAreaChart + +area_form_data = """{ + "adhoc_filters": [], + "annotation_layers": [], + "bottom_margin": "auto", + "color_scheme": "lyftColors", + "comparison_type": "values", + "contribution": true, + "datasource": "2__table", + "extra_form_data": {}, + "granularity_sqla": "ds", + "groupby": [ + "gender" + ], + "line_interpolation": "linear", + "metrics": [ + "sum__num" + ], + "order_desc": true, + "rich_tooltip": true, + "rolling_type": "None", + "row_limit": 10000, + "show_brush": "auto", + "show_controls": true, + "show_legend": true, + "slice_id": 165, + "stacked_style": "stack", + "time_grain_sqla": "P1D", + "time_range": "No filter", + "viz_type": "area", + "x_axis_format": "smart_date", + "x_axis_label": "x asix label", + "x_axis_showminmax": false, + "x_ticks_layout": "auto", + "y_axis_bounds": [ + null, + null + ], + "y_axis_format": "SMART_NUMBER" +} +""" + + +def test_area_migrate(app_context: SupersetApp) -> None: + from superset.models.slice import Slice + + slc = Slice( + viz_type=MigrateAreaChart.source_viz_type, + datasource_type="table", + params=area_form_data, + query_context=f'{{"form_data": {area_form_data}}}', + ) + + slc = MigrateAreaChart.upgrade_slice(slc) + assert slc.viz_type == MigrateAreaChart.target_viz_type + # verify form_data + new_form_data = json.loads(slc.params) + assert new_form_data["contributionMode"] == "row" + assert "contribution" not in new_form_data + assert new_form_data["show_extra_controls"] is True + assert new_form_data["stack"] == "Stack" + assert new_form_data["x_axis_title"] == "x asix label" + assert new_form_data["x_axis_title_margin"] == 30 + assert json.dumps(new_form_data["form_data_bak"], sort_keys=True) == json.dumps( + json.loads(area_form_data), sort_keys=True + ) + + # verify query_context + new_query_context = json.loads(slc.query_context) + assert ( + new_query_context["form_data"]["viz_type"] == MigrateAreaChart.target_viz_type + ) + + # downgrade + slc = MigrateAreaChart.downgrade_slice(slc) + assert slc.viz_type == MigrateAreaChart.source_viz_type + assert json.dumps(json.loads(slc.params), sort_keys=True) == json.dumps( + json.loads(area_form_data), sort_keys=True + ) diff --git a/tests/integration_tests/migrations/c747c78868b6_migrating_legacy_treemap__tests.py b/tests/integration_tests/migrations/c747c78868b6_migrating_legacy_treemap__tests.py new file mode 100644 index 000000000000..3e9ef330924c --- /dev/null +++ b/tests/integration_tests/migrations/c747c78868b6_migrating_legacy_treemap__tests.py @@ -0,0 +1,91 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import json + +from superset.app import SupersetApp +from superset.migrations.shared.migrate_viz import MigrateTreeMap + +treemap_form_data = """{ + "adhoc_filters": [ + { + "clause": "WHERE", + "comparator": [ + "Edward" + ], + "expressionType": "SIMPLE", + "filterOptionName": "filter_xhbus6irfa_r10k9nwmwy", + "isExtra": false, + "isNew": false, + "operator": "IN", + "operatorId": "IN", + "sqlExpression": null, + "subject": "name" + } + ], + "color_scheme": "bnbColors", + "datasource": "2__table", + "extra_form_data": {}, + "granularity_sqla": "ds", + "groupby": [ + "state", + "gender" + ], + "metrics": [ + "sum__num" + ], + "number_format": ",d", + "order_desc": true, + "row_limit": 10, + "time_range": "No filter", + "timeseries_limit_metric": "sum__num", + "treemap_ratio": 1.618033988749895, + "viz_type": "treemap" +} +""" + + +def test_treemap_migrate(app_context: SupersetApp) -> None: + from superset.models.slice import Slice + + slc = Slice( + viz_type=MigrateTreeMap.source_viz_type, + datasource_type="table", + params=treemap_form_data, + query_context=f'{{"form_data": {treemap_form_data}}}', + ) + + slc = MigrateTreeMap.upgrade_slice(slc) + assert slc.viz_type == MigrateTreeMap.target_viz_type + # verify form_data + new_form_data = json.loads(slc.params) + assert new_form_data["metric"] == "sum__num" + assert new_form_data["viz_type"] == "treemap_v2" + assert "metrics" not in new_form_data + assert json.dumps(new_form_data["form_data_bak"], sort_keys=True) == json.dumps( + json.loads(treemap_form_data), sort_keys=True + ) + + # verify query_context + new_query_context = json.loads(slc.query_context) + assert new_query_context["form_data"]["viz_type"] == "treemap_v2" + + # downgrade + slc = MigrateTreeMap.downgrade_slice(slc) + assert slc.viz_type == MigrateTreeMap.source_viz_type + assert json.dumps(json.loads(slc.params), sort_keys=True) == json.dumps( + json.loads(treemap_form_data), sort_keys=True + ) diff --git a/tests/integration_tests/model_tests.py b/tests/integration_tests/model_tests.py index a1791db34bff..da6c5e6a3c25 100644 --- a/tests/integration_tests/model_tests.py +++ b/tests/integration_tests/model_tests.py @@ -57,30 +57,36 @@ def test_database_schema_presto(self): sqlalchemy_uri = "presto://presto.airbnb.io:8080/hive/default" model = Database(database_name="test_database", sqlalchemy_uri=sqlalchemy_uri) - db = make_url(model.get_sqla_engine().url).database - self.assertEqual("hive/default", db) + with model.get_sqla_engine_with_context() as engine: + db = make_url(engine.url).database + self.assertEqual("hive/default", db) - db = make_url(model.get_sqla_engine(schema="core_db").url).database - self.assertEqual("hive/core_db", db) + with model.get_sqla_engine_with_context(schema="core_db") as engine: + db = make_url(engine.url).database + self.assertEqual("hive/core_db", db) sqlalchemy_uri = "presto://presto.airbnb.io:8080/hive" model = Database(database_name="test_database", sqlalchemy_uri=sqlalchemy_uri) - db = make_url(model.get_sqla_engine().url).database - self.assertEqual("hive", db) + with model.get_sqla_engine_with_context() as engine: + db = make_url(engine.url).database + self.assertEqual("hive", db) - db = make_url(model.get_sqla_engine(schema="core_db").url).database - self.assertEqual("hive/core_db", db) + with model.get_sqla_engine_with_context(schema="core_db") as engine: + db = make_url(engine.url).database + self.assertEqual("hive/core_db", db) def test_database_schema_postgres(self): sqlalchemy_uri = "postgresql+psycopg2://postgres.airbnb.io:5439/prod" model = Database(database_name="test_database", sqlalchemy_uri=sqlalchemy_uri) - db = make_url(model.get_sqla_engine().url).database - self.assertEqual("prod", db) + with model.get_sqla_engine_with_context() as engine: + db = make_url(engine.url).database + self.assertEqual("prod", db) - db = make_url(model.get_sqla_engine(schema="foo").url).database - self.assertEqual("prod", db) + with model.get_sqla_engine_with_context(schema="foo") as engine: + db = make_url(engine.url).database + self.assertEqual("prod", db) @unittest.skipUnless( SupersetTestCase.is_module_installed("thrift"), "thrift not installed" @@ -91,11 +97,14 @@ def test_database_schema_postgres(self): def test_database_schema_hive(self): sqlalchemy_uri = "hive://hive@hive.airbnb.io:10000/default?auth=NOSASL" model = Database(database_name="test_database", sqlalchemy_uri=sqlalchemy_uri) - db = make_url(model.get_sqla_engine().url).database - self.assertEqual("default", db) - db = make_url(model.get_sqla_engine(schema="core_db").url).database - self.assertEqual("core_db", db) + with model.get_sqla_engine_with_context() as engine: + db = make_url(engine.url).database + self.assertEqual("default", db) + + with model.get_sqla_engine_with_context(schema="core_db") as engine: + db = make_url(engine.url).database + self.assertEqual("core_db", db) @unittest.skipUnless( SupersetTestCase.is_module_installed("MySQLdb"), "mysqlclient not installed" @@ -104,11 +113,13 @@ def test_database_schema_mysql(self): sqlalchemy_uri = "mysql://root@localhost/superset" model = Database(database_name="test_database", sqlalchemy_uri=sqlalchemy_uri) - db = make_url(model.get_sqla_engine().url).database - self.assertEqual("superset", db) + with model.get_sqla_engine_with_context() as engine: + db = make_url(engine.url).database + self.assertEqual("superset", db) - db = make_url(model.get_sqla_engine(schema="staging").url).database - self.assertEqual("staging", db) + with model.get_sqla_engine_with_context(schema="staging") as engine: + db = make_url(engine.url).database + self.assertEqual("staging", db) @unittest.skipUnless( SupersetTestCase.is_module_installed("MySQLdb"), "mysqlclient not installed" @@ -120,12 +131,14 @@ def test_database_impersonate_user(self): with override_user(example_user): model.impersonate_user = True - username = make_url(model.get_sqla_engine().url).username - self.assertEqual(example_user.username, username) + with model.get_sqla_engine_with_context() as engine: + username = make_url(engine.url).username + self.assertEqual(example_user.username, username) model.impersonate_user = False - username = make_url(model.get_sqla_engine().url).username - self.assertNotEqual(example_user.username, username) + with model.get_sqla_engine_with_context() as engine: + username = make_url(engine.url).username + self.assertNotEqual(example_user.username, username) @mock.patch("superset.models.core.create_engine") def test_impersonate_user_presto(self, mocked_create_engine): @@ -151,7 +164,7 @@ def test_impersonate_user_presto(self, mocked_create_engine): database_name="test_database", sqlalchemy_uri=uri, extra=extra ) model.impersonate_user = True - model.get_sqla_engine() + model._get_sqla_engine() call_args = mocked_create_engine.call_args assert str(call_args[0][0]) == "presto://gamma@localhost" @@ -164,7 +177,7 @@ def test_impersonate_user_presto(self, mocked_create_engine): } model.impersonate_user = False - model.get_sqla_engine() + model._get_sqla_engine() call_args = mocked_create_engine.call_args assert str(call_args[0][0]) == "presto://localhost" @@ -184,11 +197,11 @@ def test_impersonate_user_trino(self, mocked_create_engine): database_name="test_database", sqlalchemy_uri="trino://localhost" ) model.impersonate_user = True - model.get_sqla_engine() + model._get_sqla_engine() call_args = mocked_create_engine.call_args assert str(call_args[0][0]) == "trino://localhost" - assert call_args[1]["connect_args"] == {"user": "gamma"} + assert call_args[1]["connect_args"]["user"] == "gamma" model = Database( database_name="test_database", @@ -196,11 +209,14 @@ def test_impersonate_user_trino(self, mocked_create_engine): ) model.impersonate_user = True - model.get_sqla_engine() + model._get_sqla_engine() call_args = mocked_create_engine.call_args - assert str(call_args[0][0]) == "trino://original_user@localhost" - assert call_args[1]["connect_args"] == {"user": "gamma"} + assert ( + str(call_args[0][0]) + == "trino://original_user:original_user_password@localhost" + ) + assert call_args[1]["connect_args"]["user"] == "gamma" @mock.patch("superset.models.core.create_engine") def test_impersonate_user_hive(self, mocked_create_engine): @@ -226,7 +242,7 @@ def test_impersonate_user_hive(self, mocked_create_engine): database_name="test_database", sqlalchemy_uri=uri, extra=extra ) model.impersonate_user = True - model.get_sqla_engine() + model._get_sqla_engine() call_args = mocked_create_engine.call_args assert str(call_args[0][0]) == "hive://localhost" @@ -239,7 +255,7 @@ def test_impersonate_user_hive(self, mocked_create_engine): } model.impersonate_user = False - model.get_sqla_engine() + model._get_sqla_engine() call_args = mocked_create_engine.call_args assert str(call_args[0][0]) == "hive://localhost" @@ -364,7 +380,7 @@ def test_get_sqla_engine(self, mocked_create_engine): ) mocked_create_engine.side_effect = Exception() with self.assertRaises(SupersetException): - model.get_sqla_engine() + model._get_sqla_engine() class TestSqlaTableModel(SupersetTestCase): @@ -460,15 +476,15 @@ def test_query_with_expr_groupby_timeseries(self): # TODO(bkyryliuk): make it work for presto. return - def cannonicalize_df(df): + def canonicalize_df(df): ret = df.sort_values(by=list(df.columns.values), inplace=False) ret.reset_index(inplace=True, drop=True) return ret df1 = self.query_with_expr_helper(is_timeseries=True, inner_join=True) - name_list1 = cannonicalize_df(df1).name.values.tolist() + name_list1 = canonicalize_df(df1).name.values.tolist() df2 = self.query_with_expr_helper(is_timeseries=True, inner_join=False) - name_list2 = cannonicalize_df(df1).name.values.tolist() + name_list2 = canonicalize_df(df1).name.values.tolist() self.assertFalse(df2.empty) assert name_list2 == name_list1 @@ -589,7 +605,9 @@ def test_data_for_slices_with_query_context(self): assert len(data_for_slices["metrics"]) == 1 assert len(data_for_slices["columns"]) == 2 assert data_for_slices["metrics"][0]["metric_name"] == "sum__num" - assert data_for_slices["columns"][0]["column_name"] == "name" + column_names = [col["column_name"] for col in data_for_slices["columns"]] + assert "name" in column_names + assert "state" in column_names assert set(data_for_slices["verbose_map"].keys()) == { "__timestamp", "sum__num", diff --git a/tests/integration_tests/queries/api_tests.py b/tests/integration_tests/queries/api_tests.py index eaf4e0057657..b491cf8498b0 100644 --- a/tests/integration_tests/queries/api_tests.py +++ b/tests/integration_tests/queries/api_tests.py @@ -17,6 +17,7 @@ # isort:skip_file """Unit tests for Superset""" from datetime import datetime, timedelta +from unittest import mock import json import random import string @@ -51,6 +52,7 @@ def insert_query( rows: int = 100, tab_name: str = "", status: str = "success", + changed_on: datetime = datetime(2020, 1, 1), ) -> Query: database = db.session.query(Database).get(database_id) user = db.session.query(security_manager.user_model).get(user_id) @@ -66,7 +68,7 @@ def insert_query( rows=rows, tab_name=tab_name, status=status, - changed_on=datetime(2020, 1, 1), + changed_on=changed_on, ) db.session.add(query) db.session.commit() @@ -392,3 +394,108 @@ def test_get_list_query_no_data_access(self): # rollback changes db.session.delete(query) db.session.commit() + + def test_get_updated_since(self): + """ + Query API: Test get queries updated since timestamp + """ + now = datetime.utcnow() + client_id = self.get_random_string() + + admin = self.get_user("admin") + example_db = get_example_database() + + old_query = self.insert_query( + example_db.id, + admin.id, + self.get_random_string(), + sql="SELECT col1, col2 from table1", + select_sql="SELECT col1, col2 from table1", + executed_sql="SELECT col1, col2 from table1 LIMIT 100", + changed_on=now - timedelta(days=3), + ) + updated_query = self.insert_query( + example_db.id, + admin.id, + client_id, + sql="SELECT col1, col2 from table1", + select_sql="SELECT col1, col2 from table1", + executed_sql="SELECT col1, col2 from table1 LIMIT 100", + changed_on=now - timedelta(days=1), + ) + + self.login(username="admin") + timestamp = datetime.timestamp(now - timedelta(days=2)) * 1000 + uri = f"api/v1/query/updated_since?q={prison.dumps({'last_updated_ms': timestamp})}" + rv = self.client.get(uri) + self.assertEqual(rv.status_code, 200) + + expected_result = updated_query.to_dict() + data = json.loads(rv.data.decode("utf-8")) + self.assertEqual(len(data["result"]), 1) + for key, value in data["result"][0].items(): + # We can't assert timestamp + if key not in ( + "changedOn", + "changed_on", + "end_time", + "start_running_time", + "start_time", + "id", + ): + self.assertEqual(value, expected_result[key]) + # rollback changes + db.session.delete(old_query) + db.session.delete(updated_query) + db.session.commit() + + @mock.patch("superset.sql_lab.cancel_query") + @mock.patch("superset.views.core.db.session") + def test_stop_query_not_found( + self, mock_superset_db_session, mock_sql_lab_cancel_query + ): + """ + Handles stop query when the DB engine spec does not + have a cancel query method (with invalid client_id). + """ + form_data = {"client_id": "foo2"} + query_mock = mock.Mock() + query_mock.return_value = None + self.login(username="admin") + mock_superset_db_session.query().filter_by().one_or_none = query_mock + mock_sql_lab_cancel_query.return_value = True + rv = self.client.post( + "/api/v1/query/stop", + data=json.dumps(form_data), + content_type="application/json", + ) + + assert rv.status_code == 404 + data = json.loads(rv.data.decode("utf-8")) + assert data["message"] == "Query with client_id foo2 not found" + + @mock.patch("superset.sql_lab.cancel_query") + @mock.patch("superset.views.core.db.session") + def test_stop_query(self, mock_superset_db_session, mock_sql_lab_cancel_query): + """ + Handles stop query when the DB engine spec does not + have a cancel query method. + """ + form_data = {"client_id": "foo"} + query_mock = mock.Mock() + query_mock.client_id = "foo" + query_mock.status = QueryStatus.RUNNING + self.login(username="admin") + mock_superset_db_session.query().filter_by().one_or_none().return_value = ( + query_mock + ) + mock_sql_lab_cancel_query.return_value = True + rv = self.client.post( + "/api/v1/query/stop", + data=json.dumps(form_data), + content_type="application/json", + ) + + assert rv.status_code == 200 + data = json.loads(rv.data.decode("utf-8")) + assert data["result"] == "OK" diff --git a/tests/integration_tests/queries/saved_queries/api_tests.py b/tests/integration_tests/queries/saved_queries/api_tests.py index 2659bc224ff3..91843b0085dd 100644 --- a/tests/integration_tests/queries/saved_queries/api_tests.py +++ b/tests/integration_tests/queries/saved_queries/api_tests.py @@ -98,7 +98,7 @@ def create_saved_queries(self): self.insert_default_saved_query( label=f"label{SAVED_QUERIES_FIXTURE_COUNT}", schema=f"schema{SAVED_QUERIES_FIXTURE_COUNT}", - username="gamma", + username="gamma_sqllab", ) ) @@ -157,12 +157,12 @@ def test_get_list_saved_query_gamma(self): """ Saved Query API: Test get list saved query """ - gamma = self.get_user("gamma") + user = self.get_user("gamma_sqllab") saved_queries = ( - db.session.query(SavedQuery).filter(SavedQuery.created_by == gamma).all() + db.session.query(SavedQuery).filter(SavedQuery.created_by == user).all() ) - self.login(username="gamma") + self.login(username=user.username) uri = f"api/v1/saved_query/" rv = self.get_assert_metric(uri, "get_list") assert rv.status_code == 200 @@ -445,7 +445,8 @@ def test_related_saved_query(self): expected_result = { "count": len(databases), "result": [ - {"text": str(database), "value": database.id} for database in databases + {"extra": {}, "text": str(database), "value": database.id} + for database in databases ], } @@ -523,10 +524,13 @@ def test_get_saved_query(self): "sql_tables": [{"catalog": None, "schema": None, "table": "table1"}], "schema": "schema1", "label": "label1", + "template_parameters": None, } data = json.loads(rv.data.decode("utf-8")) + self.assertIn("changed_on_delta_humanized", data["result"]) for key, value in data["result"].items(): - assert value == expected_result[key] + if key not in ("changed_on_delta_humanized",): + assert value == expected_result[key] def test_get_saved_query_not_found(self): """ diff --git a/tests/integration_tests/query_context_tests.py b/tests/integration_tests/query_context_tests.py index 816267678f9e..5e5beae345b8 100644 --- a/tests/integration_tests/query_context_tests.py +++ b/tests/integration_tests/query_context_tests.py @@ -18,6 +18,8 @@ import time from typing import Any, Dict +import numpy as np +import pandas as pd import pytest from pandas import DateOffset @@ -25,12 +27,21 @@ from superset.charts.schemas import ChartDataQueryContextSchema from superset.common.chart_data import ChartDataResultFormat, ChartDataResultType from superset.common.query_context import QueryContext +from superset.common.query_context_factory import QueryContextFactory from superset.common.query_object import QueryObject -from superset.connectors.connector_registry import ConnectorRegistry from superset.connectors.sqla.models import SqlMetric +from superset.datasource.dao import DatasourceDAO from superset.extensions import cache_manager -from superset.utils.core import AdhocMetricExpressionType, backend, QueryStatus +from superset.superset_typing import AdhocColumn +from superset.utils.core import ( + AdhocMetricExpressionType, + backend, + DatasourceType, + QueryStatus, +) +from superset.utils.pandas_postprocessing.utils import FLAT_COLUMN_SEPARATOR from tests.integration_tests.base_tests import SupersetTestCase +from tests.integration_tests.conftest import only_postgresql, only_sqlite from tests.integration_tests.fixtures.birth_names_dashboard import ( load_birth_names_dashboard_with_slices, load_birth_names_data, @@ -63,7 +74,7 @@ def test_schema_deserialization(self): for query_idx, query in enumerate(query_context.queries): payload_query = payload["queries"][query_idx] - # check basic properies + # check basic properties self.assertEqual(query.extras, payload_query["extras"]) self.assertEqual(query.filter, payload_query["filters"]) self.assertEqual(query.columns, payload_query["columns"]) @@ -132,10 +143,10 @@ def test_query_cache_key_changes_when_datasource_is_updated(self): cache_key_original = query_context.query_cache_key(query_object) # make temporary change and revert it to refresh the changed_on property - datasource = ConnectorRegistry.get_datasource( - datasource_type=payload["datasource"]["type"], - datasource_id=payload["datasource"]["id"], + datasource = DatasourceDAO.get_datasource( session=db.session, + datasource_type=DatasourceType(payload["datasource"]["type"]), + datasource_id=payload["datasource"]["id"], ) description_original = datasource.description datasource.description = "temporary description" @@ -156,10 +167,10 @@ def test_query_cache_key_changes_when_metric_is_updated(self): payload = get_query_context("birth_names") # make temporary change and revert it to refresh the changed_on property - datasource = ConnectorRegistry.get_datasource( - datasource_type=payload["datasource"]["type"], - datasource_id=payload["datasource"]["id"], + datasource = DatasourceDAO.get_datasource( session=db.session, + datasource_type=DatasourceType(payload["datasource"]["type"]), + datasource_id=payload["datasource"]["id"], ) datasource.metrics.append(SqlMetric(metric_name="foo", expression="select 1;")) @@ -278,7 +289,6 @@ def test_convert_deprecated_fields(self): self.assertEqual(query_object.columns, columns) self.assertEqual(query_object.series_limit, 99) self.assertEqual(query_object.series_limit_metric, "sum__num") - self.assertIn("having_druid", query_object.extras) @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_csv_response_format(self): @@ -289,7 +299,7 @@ def test_csv_response_format(self): payload = get_query_context("birth_names") payload["result_format"] = ChartDataResultFormat.CSV.value payload["queries"][0]["row_limit"] = 10 - query_context = ChartDataQueryContextSchema().load(payload) + query_context: QueryContext = ChartDataQueryContextSchema().load(payload) responses = query_context.get_payload() self.assertEqual(len(responses), 1) data = responses["queries"][0]["data"] @@ -679,3 +689,414 @@ def test_time_offsets_accuracy(self): row["sum__num__3 years later"] == df_3_years_later.loc[index]["sum__num"] ) + + +def test_get_label_map(app_context, virtual_dataset_comma_in_column_value): + qc = QueryContextFactory().create( + datasource={ + "type": virtual_dataset_comma_in_column_value.type, + "id": virtual_dataset_comma_in_column_value.id, + }, + queries=[ + { + "columns": ["col1", "col2"], + "metrics": ["count"], + "post_processing": [ + { + "operation": "pivot", + "options": { + "aggregates": {"count": {"operator": "mean"}}, + "columns": ["col2"], + "index": ["col1"], + }, + }, + {"operation": "flatten"}, + ], + } + ], + result_type=ChartDataResultType.FULL, + force=True, + ) + query_object = qc.queries[0] + df = qc.get_df_payload(query_object)["df"] + label_map = qc.get_df_payload(query_object)["label_map"] + assert list(df.columns.values) == [ + "col1", + "count" + FLAT_COLUMN_SEPARATOR + "col2, row1", + "count" + FLAT_COLUMN_SEPARATOR + "col2, row2", + "count" + FLAT_COLUMN_SEPARATOR + "col2, row3", + ] + assert label_map == { + "col1": ["col1"], + "count, col2, row1": ["count", "col2, row1"], + "count, col2, row2": ["count", "col2, row2"], + "count, col2, row3": ["count", "col2, row3"], + } + + +def test_time_column_with_time_grain(app_context, physical_dataset): + column_on_axis: AdhocColumn = { + "label": "I_AM_AN_ORIGINAL_COLUMN", + "sqlExpression": "col5", + "timeGrain": "P1Y", + } + adhoc_column: AdhocColumn = { + "label": "I_AM_A_TRUNC_COLUMN", + "sqlExpression": "col6", + "columnType": "BASE_AXIS", + "timeGrain": "P1Y", + } + qc = QueryContextFactory().create( + datasource={ + "type": physical_dataset.type, + "id": physical_dataset.id, + }, + queries=[ + { + "columns": ["col1", column_on_axis, adhoc_column], + "metrics": ["count"], + "orderby": [["col1", True]], + } + ], + result_type=ChartDataResultType.FULL, + force=True, + ) + query_object = qc.queries[0] + df = qc.get_df_payload(query_object)["df"] + if query_object.datasource.database.backend == "sqlite": + # sqlite returns string as timestamp column + assert df["I_AM_AN_ORIGINAL_COLUMN"][0] == "2000-01-01 00:00:00" + assert df["I_AM_AN_ORIGINAL_COLUMN"][1] == "2000-01-02 00:00:00" + assert df["I_AM_A_TRUNC_COLUMN"][0] == "2002-01-01 00:00:00" + assert df["I_AM_A_TRUNC_COLUMN"][1] == "2002-01-01 00:00:00" + else: + assert df["I_AM_AN_ORIGINAL_COLUMN"][0].strftime("%Y-%m-%d") == "2000-01-01" + assert df["I_AM_AN_ORIGINAL_COLUMN"][1].strftime("%Y-%m-%d") == "2000-01-02" + assert df["I_AM_A_TRUNC_COLUMN"][0].strftime("%Y-%m-%d") == "2002-01-01" + assert df["I_AM_A_TRUNC_COLUMN"][1].strftime("%Y-%m-%d") == "2002-01-01" + + +def test_non_time_column_with_time_grain(app_context, physical_dataset): + qc = QueryContextFactory().create( + datasource={ + "type": physical_dataset.type, + "id": physical_dataset.id, + }, + queries=[ + { + "columns": [ + "col1", + { + "label": "COL2 ALIAS", + "sqlExpression": "col2", + "columnType": "BASE_AXIS", + "timeGrain": "P1Y", + }, + ], + "metrics": ["count"], + "orderby": [["col1", True]], + "row_limit": 1, + } + ], + result_type=ChartDataResultType.FULL, + force=True, + ) + + query_object = qc.queries[0] + df = qc.get_df_payload(query_object)["df"] + assert df["COL2 ALIAS"][0] == "a" + + +def test_special_chars_in_column_name(app_context, physical_dataset): + qc = QueryContextFactory().create( + datasource={ + "type": physical_dataset.type, + "id": physical_dataset.id, + }, + queries=[ + { + "columns": [ + "col1", + "time column with spaces", + { + "label": "I_AM_A_TRUNC_COLUMN", + "sqlExpression": "time column with spaces", + "columnType": "BASE_AXIS", + "timeGrain": "P1Y", + }, + ], + "metrics": ["count"], + "orderby": [["col1", True]], + "row_limit": 1, + } + ], + result_type=ChartDataResultType.FULL, + force=True, + ) + + query_object = qc.queries[0] + df = qc.get_df_payload(query_object)["df"] + if query_object.datasource.database.backend == "sqlite": + # sqlite returns string as timestamp column + assert df["time column with spaces"][0] == "2002-01-03 00:00:00" + assert df["I_AM_A_TRUNC_COLUMN"][0] == "2002-01-01 00:00:00" + else: + assert df["time column with spaces"][0].strftime("%Y-%m-%d") == "2002-01-03" + assert df["I_AM_A_TRUNC_COLUMN"][0].strftime("%Y-%m-%d") == "2002-01-01" + + +@only_postgresql +def test_date_adhoc_column(app_context, physical_dataset): + # sql expression returns date type + column_on_axis: AdhocColumn = { + "label": "ADHOC COLUMN", + "sqlExpression": "col6 + interval '20 year'", + "columnType": "BASE_AXIS", + "timeGrain": "P1Y", + } + qc = QueryContextFactory().create( + datasource={ + "type": physical_dataset.type, + "id": physical_dataset.id, + }, + queries=[ + { + "columns": [column_on_axis], + "metrics": ["count"], + } + ], + result_type=ChartDataResultType.FULL, + force=True, + ) + query_object = qc.queries[0] + df = qc.get_df_payload(query_object)["df"] + # ADHOC COLUMN count + # 0 2022-01-01 10 + assert df["ADHOC COLUMN"][0].strftime("%Y-%m-%d") == "2022-01-01" + assert df["count"][0] == 10 + + +@only_postgresql +def test_non_date_adhoc_column(app_context, physical_dataset): + # sql expression returns non-date type + column_on_axis: AdhocColumn = { + "label": "ADHOC COLUMN", + "sqlExpression": "col1 * 10", + "columnType": "BASE_AXIS", + "timeGrain": "P1Y", + } + qc = QueryContextFactory().create( + datasource={ + "type": physical_dataset.type, + "id": physical_dataset.id, + }, + queries=[ + { + "columns": [column_on_axis], + "metrics": ["count"], + "orderby": [ + [ + { + "expressionType": "SQL", + "sqlExpression": '"ADHOC COLUMN"', + }, + True, + ] + ], + } + ], + result_type=ChartDataResultType.FULL, + force=True, + ) + query_object = qc.queries[0] + df = qc.get_df_payload(query_object)["df"] + assert df["ADHOC COLUMN"][0] == 0 + assert df["ADHOC COLUMN"][1] == 10 + + +@only_sqlite +def test_time_grain_and_time_offset_with_base_axis(app_context, physical_dataset): + column_on_axis: AdhocColumn = { + "label": "col6", + "sqlExpression": "col6", + "columnType": "BASE_AXIS", + "timeGrain": "P3M", + } + qc = QueryContextFactory().create( + datasource={ + "type": physical_dataset.type, + "id": physical_dataset.id, + }, + queries=[ + { + "columns": [column_on_axis], + "metrics": [ + { + "label": "SUM(col1)", + "expressionType": "SQL", + "sqlExpression": "SUM(col1)", + } + ], + "time_offsets": ["3 month ago"], + "granularity": "col6", + "time_range": "2002-01 : 2003-01", + } + ], + result_type=ChartDataResultType.FULL, + force=True, + ) + query_object = qc.queries[0] + df = qc.get_df_payload(query_object)["df"] + # todo: MySQL returns integer and float column as object type + """ + col6 SUM(col1) SUM(col1)__3 month ago +0 2002-01-01 3 NaN +1 2002-04-01 12 3.0 +2 2002-07-01 21 12.0 +3 2002-10-01 9 21.0 + """ + assert df.equals( + pd.DataFrame( + data={ + "col6": pd.to_datetime( + ["2002-01-01", "2002-04-01", "2002-07-01", "2002-10-01"] + ), + "SUM(col1)": [3, 12, 21, 9], + "SUM(col1)__3 month ago": [np.nan, 3, 12, 21], + } + ) + ) + + +@only_sqlite +def test_time_grain_and_time_offset_on_legacy_query(app_context, physical_dataset): + qc = QueryContextFactory().create( + datasource={ + "type": physical_dataset.type, + "id": physical_dataset.id, + }, + queries=[ + { + "columns": [], + "extras": { + "time_grain_sqla": "P3M", + }, + "metrics": [ + { + "label": "SUM(col1)", + "expressionType": "SQL", + "sqlExpression": "SUM(col1)", + } + ], + "time_offsets": ["3 month ago"], + "granularity": "col6", + "time_range": "2002-01 : 2003-01", + "is_timeseries": True, + } + ], + result_type=ChartDataResultType.FULL, + force=True, + ) + query_object = qc.queries[0] + df = qc.get_df_payload(query_object)["df"] + # todo: MySQL returns integer and float column as object type + """ + __timestamp SUM(col1) SUM(col1)__3 month ago +0 2002-01-01 3 NaN +1 2002-04-01 12 3.0 +2 2002-07-01 21 12.0 +3 2002-10-01 9 21.0 + """ + assert df.equals( + pd.DataFrame( + data={ + "__timestamp": pd.to_datetime( + ["2002-01-01", "2002-04-01", "2002-07-01", "2002-10-01"] + ), + "SUM(col1)": [3, 12, 21, 9], + "SUM(col1)__3 month ago": [np.nan, 3, 12, 21], + } + ) + ) + + +def test_time_offset_with_temporal_range_filter(app_context, physical_dataset): + qc = QueryContextFactory().create( + datasource={ + "type": physical_dataset.type, + "id": physical_dataset.id, + }, + queries=[ + { + "columns": [ + { + "label": "col6", + "sqlExpression": "col6", + "columnType": "BASE_AXIS", + "timeGrain": "P3M", + } + ], + "metrics": [ + { + "label": "SUM(col1)", + "expressionType": "SQL", + "sqlExpression": "SUM(col1)", + } + ], + "time_offsets": ["3 month ago"], + "filters": [ + { + "col": "col6", + "op": "TEMPORAL_RANGE", + "val": "2002-01 : 2003-01", + } + ], + } + ], + result_type=ChartDataResultType.FULL, + force=True, + ) + query_payload = qc.get_df_payload(qc.queries[0]) + df = query_payload["df"] + """ + col6 SUM(col1) SUM(col1)__3 month ago +0 2002-01-01 3 NaN +1 2002-04-01 12 3.0 +2 2002-07-01 21 12.0 +3 2002-10-01 9 21.0 + """ + assert df["SUM(col1)"].to_list() == [3, 12, 21, 9] + # df["SUM(col1)__3 month ago"].dtype is object so have to convert to float first + assert df["SUM(col1)__3 month ago"].astype("float").astype("Int64").to_list() == [ + pd.NA, + 3, + 12, + 21, + ] + + sqls = query_payload["query"].split(";") + """ + SELECT DATE_TRUNC('quarter', col6) AS col6, + SUM(col1) AS "SUM(col1)" + FROM physical_dataset + WHERE col6 >= TO_TIMESTAMP('2002-01-01 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.US') + AND col6 < TO_TIMESTAMP('2003-01-01 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.US') + GROUP BY DATE_TRUNC('quarter', col6) + LIMIT 10000; + + SELECT DATE_TRUNC('quarter', col6) AS col6, + SUM(col1) AS "SUM(col1)" + FROM physical_dataset + WHERE col6 >= TO_TIMESTAMP('2001-10-01 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.US') + AND col6 < TO_TIMESTAMP('2002-10-01 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.US') + GROUP BY DATE_TRUNC('quarter', col6) + LIMIT 10000; + """ + assert ( + re.search(r"WHERE col6 >= .*2002-01-01", sqls[0]) + and re.search(r"AND col6 < .*2003-01-01", sqls[0]) + ) is not None + assert ( + re.search(r"WHERE col6 >= .*2001-10-01", sqls[1]) + and re.search(r"AND col6 < .*2002-10-01", sqls[1]) + ) is not None diff --git a/tests/integration_tests/reports/alert_tests.py b/tests/integration_tests/reports/alert_tests.py index d868aaea232d..6c5c41a81ff2 100644 --- a/tests/integration_tests/reports/alert_tests.py +++ b/tests/integration_tests/reports/alert_tests.py @@ -15,10 +15,91 @@ # specific language governing permissions and limitations # under the License. # pylint: disable=invalid-name, unused-argument, import-outside-toplevel +from contextlib import nullcontext +from typing import List, Optional, Tuple, Union import pandas as pd +import pytest from pytest_mock import MockFixture +from superset.reports.commands.exceptions import AlertQueryError +from superset.reports.models import ReportCreationMethod, ReportScheduleType +from superset.tasks.types import ExecutorType +from superset.utils.database import get_example_database +from tests.integration_tests.test_app import app + + +@pytest.mark.parametrize( + "owner_names,creator_name,config,expected_result", + [ + (["gamma"], None, [ExecutorType.SELENIUM], "admin"), + (["gamma"], None, [ExecutorType.OWNER], "gamma"), + ( + ["alpha", "gamma"], + "gamma", + [ExecutorType.CREATOR_OWNER], + "gamma", + ), + ( + ["alpha", "gamma"], + "alpha", + [ExecutorType.CREATOR_OWNER], + "alpha", + ), + ( + ["alpha", "gamma"], + "admin", + [ExecutorType.CREATOR_OWNER], + AlertQueryError(), + ), + (["gamma"], None, [ExecutorType.CURRENT_USER], AlertQueryError()), + ], +) +def test_execute_query_as_report_executor( + owner_names: List[str], + creator_name: Optional[str], + config: List[ExecutorType], + expected_result: Union[Tuple[ExecutorType, str], Exception], + mocker: MockFixture, + app_context: None, + get_user, +) -> None: + + from superset.reports.commands.alert import AlertCommand + from superset.reports.models import ReportSchedule + + with app.app_context(): + original_config = app.config["ALERT_REPORTS_EXECUTE_AS"] + app.config["ALERT_REPORTS_EXECUTE_AS"] = config + owners = [get_user(owner_name) for owner_name in owner_names] + report_schedule = ReportSchedule( + created_by=get_user(creator_name) if creator_name else None, + owners=owners, + type=ReportScheduleType.ALERT, + description="description", + crontab="0 9 * * *", + creation_method=ReportCreationMethod.ALERTS_REPORTS, + sql="SELECT 1", + grace_period=14400, + working_timeout=3600, + database=get_example_database(), + validator_config_json='{"op": "==", "threshold": 1}', + ) + command = AlertCommand(report_schedule=report_schedule) + override_user_mock = mocker.patch( + "superset.reports.commands.alert.override_user" + ) + cm = ( + pytest.raises(type(expected_result)) + if isinstance(expected_result, Exception) + else nullcontext() + ) + with cm: + command.run() + assert override_user_mock.call_args[0][0].username == expected_result + + app.config["ALERT_REPORTS_EXECUTE_AS"] = original_config + def test_execute_query_succeeded_no_retry( mocker: MockFixture, app_context: None diff --git a/tests/integration_tests/reports/api_tests.py b/tests/integration_tests/reports/api_tests.py index 2ca41610a2e4..22b9be9990b7 100644 --- a/tests/integration_tests/reports/api_tests.py +++ b/tests/integration_tests/reports/api_tests.py @@ -23,13 +23,14 @@ import pytest import prison +from parameterized import parameterized from sqlalchemy.sql import func -from superset import db +from superset import db, security_manager from superset.models.core import Database from superset.models.slice import Slice from superset.models.dashboard import Dashboard -from superset.models.reports import ( +from superset.reports.models import ( ReportSchedule, ReportCreationMethod, ReportRecipients, @@ -45,15 +46,98 @@ load_birth_names_dashboard_with_slices, load_birth_names_data, ) -from tests.integration_tests.fixtures.tabbed_dashboard import tabbed_dashboard from tests.integration_tests.reports.utils import insert_report_schedule REPORTS_COUNT = 10 +REPORTS_ROLE_NAME = "reports_role" +REPORTS_GAMMA_USER = "reports_gamma" class TestReportSchedulesApi(SupersetTestCase): @pytest.fixture() - def create_working_report_schedule(self): + def gamma_user_with_alerts_role(self): + with self.create_app().app_context(): + user = self.create_user( + REPORTS_GAMMA_USER, + "general", + "Gamma", + email=f"{REPORTS_GAMMA_USER}@superset.org", + ) + + security_manager.add_role(REPORTS_ROLE_NAME) + read_perm = security_manager.find_permission_view_menu( + "can_read", + "ReportSchedule", + ) + write_perm = security_manager.find_permission_view_menu( + "can_write", + "ReportSchedule", + ) + reports_role = security_manager.find_role(REPORTS_ROLE_NAME) + security_manager.add_permission_role(reports_role, read_perm) + security_manager.add_permission_role(reports_role, write_perm) + user.roles.append(reports_role) + + yield user + + # rollback changes (assuming cascade delete) + db.session.delete(reports_role) + db.session.delete(user) + db.session.commit() + + @pytest.fixture() + def create_working_admin_report_schedule(self): + with self.create_app().app_context(): + + admin_user = self.get_user("admin") + chart = db.session.query(Slice).first() + example_db = get_example_database() + + report_schedule = insert_report_schedule( + type=ReportScheduleType.ALERT, + name="name_admin_working", + crontab="* * * * *", + sql="SELECT value from table", + description="Report working", + chart=chart, + database=example_db, + owners=[admin_user], + last_state=ReportState.WORKING, + ) + + yield + + db.session.delete(report_schedule) + db.session.commit() + + @pytest.mark.usefixtures("gamma_user_with_alerts_role") + @pytest.fixture() + def create_working_gamma_report_schedule(self, gamma_user_with_alerts_role): + with self.create_app().app_context(): + + chart = db.session.query(Slice).first() + example_db = get_example_database() + + report_schedule = insert_report_schedule( + type=ReportScheduleType.ALERT, + name="name_gamma_working", + crontab="* * * * *", + sql="SELECT value from table", + description="Report working", + chart=chart, + database=example_db, + owners=[gamma_user_with_alerts_role], + last_state=ReportState.WORKING, + ) + + yield + + db.session.delete(report_schedule) + db.session.commit() + + @pytest.mark.usefixtures("gamma_user_with_alerts_role") + @pytest.fixture() + def create_working_shared_report_schedule(self, gamma_user_with_alerts_role): with self.create_app().app_context(): admin_user = self.get_user("admin") @@ -63,13 +147,13 @@ def create_working_report_schedule(self): report_schedule = insert_report_schedule( type=ReportScheduleType.ALERT, - name="name_working", + name="name_shared_working", crontab="* * * * *", sql="SELECT value from table", description="Report working", chart=chart, database=example_db, - owners=[admin_user, alpha_user], + owners=[admin_user, alpha_user, gamma_user_with_alerts_role], last_state=ReportState.WORKING, ) @@ -281,6 +365,7 @@ def test_get_list_report_schedule(self): "crontab_humanized", "dashboard_id", "description", + "extra", "id", "last_eval_dttm", "last_state", @@ -305,6 +390,61 @@ def test_get_list_report_schedule(self): data_keys = sorted(list(data["result"][1]["recipients"][0].keys())) assert expected_recipients_fields == data_keys + @parameterized.expand( + [ + ( + "admin", + { + "name_admin_working", + "name_gamma_working", + "name_shared_working", + }, + ), + ( + "alpha", + { + "name_admin_working", + "name_gamma_working", + "name_shared_working", + }, + ), + ( + REPORTS_GAMMA_USER, + { + "name_gamma_working", + "name_shared_working", + }, + ), + ], + ) + @pytest.mark.usefixtures( + "create_working_admin_report_schedule", + "create_working_gamma_report_schedule", + "create_working_shared_report_schedule", + "gamma_user_with_alerts_role", + ) + def test_get_list_report_schedule_perms(self, username, report_names): + """ + ReportSchedule Api: Test get list report schedules for different roles + """ + self.login(username=username) + uri = f"api/v1/report/" + rv = self.get_assert_metric(uri, "get_list") + + assert rv.status_code == 200 + data = json.loads(rv.data.decode("utf-8")) + assert {report["name"] for report in data["result"]} == report_names + + def test_get_list_report_schedule_gamma(self): + """ + ReportSchedule Api: Test get list report schedules for regular gamma user + """ + self.login(username="gamma") + uri = f"api/v1/report/" + rv = self.client.get(uri) + + assert rv.status_code == 403 + @pytest.mark.usefixtures("create_report_schedules") def test_get_list_report_schedule_sorting(self): """ @@ -431,7 +571,7 @@ def test_get_list_report_schedule_filter_type(self): @pytest.mark.usefixtures("create_report_schedules") def test_get_related_report_schedule(self): """ - ReportSchedule Api: Test get releated report schedule + ReportSchedule Api: Test get related report schedule """ self.login(username="admin") related_columns = ["created_by", "chart", "dashboard", "database"] @@ -1159,14 +1299,14 @@ def test_update_report_schedule(self): assert updated_model.chart_id == report_schedule_data["chart"] assert updated_model.database_id == report_schedule_data["database"] - @pytest.mark.usefixtures("create_working_report_schedule") + @pytest.mark.usefixtures("create_working_shared_report_schedule") def test_update_report_schedule_state_working(self): """ ReportSchedule Api: Test update state in a working report """ report_schedule = ( db.session.query(ReportSchedule) - .filter(ReportSchedule.name == "name_working") + .filter(ReportSchedule.name == "name_shared_working") .one_or_none() ) @@ -1177,7 +1317,7 @@ def test_update_report_schedule_state_working(self): assert rv.status_code == 200 report_schedule = ( db.session.query(ReportSchedule) - .filter(ReportSchedule.name == "name_working") + .filter(ReportSchedule.name == "name_shared_working") .one_or_none() ) assert report_schedule.last_state == ReportState.NOOP @@ -1528,84 +1668,3 @@ def test_report_schedule_logs_no_mutations(self): assert rv.status_code == 405 rv = self.client.delete(uri) assert rv.status_code == 405 - - @pytest.mark.usefixtures("create_report_schedules") - @pytest.mark.usefixtures("tabbed_dashboard") - def test_when_invalid_tab_ids_are_given_it_raises_bad_request(self): - """ - when tab ids are specified in the extra argument, make sure that the - tab ids are valid. - """ - self.login(username="admin") - dashboard = ( - db.session.query(Dashboard) - .filter(Dashboard.slug == "tabbed-dash-test") - .first() - ) - example_db = get_example_database() - report_schedule_data = { - "type": ReportScheduleType.ALERT, - "name": "new3", - "description": "description", - "crontab": "0 9 * * *", - "creation_method": ReportCreationMethod.ALERTS_REPORTS, - "recipients": [ - { - "type": ReportRecipientType.EMAIL, - "recipient_config_json": {"target": "target@superset.org"}, - }, - ], - "grace_period": 14400, - "working_timeout": 3600, - "chart": None, - "dashboard": dashboard.id, - "database": example_db.id, - "extra": {"dashboard_tab_ids": ["INVALID-TAB-ID-1", "TABS-IpViLohnyP"]}, - } - response = self.post_assert_metric( - "api/v1/report/", report_schedule_data, "post" - ) - assert response.status_code == 422 - assert response.json == { - "message": {"extra": ["Invalid tab IDs selected: ['INVALID-TAB-ID-1']"]} - } - - @pytest.mark.usefixtures("create_report_schedules") - @pytest.mark.usefixtures("tabbed_dashboard") - def test_when_tab_ids_are_given_it_gets_added_to_extra(self): - self.login(username="admin") - dashboard = ( - db.session.query(Dashboard) - .filter(Dashboard.slug == "tabbed-dash-test") - .first() - ) - example_db = get_example_database() - report_schedule_data = { - "type": ReportScheduleType.ALERT, - "name": "new3", - "description": "description", - "crontab": "0 9 * * *", - "creation_method": ReportCreationMethod.ALERTS_REPORTS, - "recipients": [ - { - "type": ReportRecipientType.EMAIL, - "recipient_config_json": {"target": "target@superset.org"}, - }, - ], - "grace_period": 14400, - "working_timeout": 3600, - "chart": None, - "dashboard": dashboard.id, - "database": example_db.id, - "extra": {"dashboard_tab_ids": ["TABS-IpViLohnyP"]}, - } - response = self.post_assert_metric( - "api/v1/report/", report_schedule_data, "post" - ) - assert response.status_code == 201 - assert json.loads( - db.session.query(ReportSchedule) - .filter(ReportSchedule.id == response.json["id"]) - .first() - .extra - ) == {"dashboard_tab_ids": ["TABS-IpViLohnyP"]} diff --git a/tests/integration_tests/reports/commands/create_dashboard_report_tests.py b/tests/integration_tests/reports/commands/create_dashboard_report_tests.py new file mode 100644 index 000000000000..81945c18a9ab --- /dev/null +++ b/tests/integration_tests/reports/commands/create_dashboard_report_tests.py @@ -0,0 +1,91 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import pytest + +from superset import db +from superset.models.dashboard import Dashboard +from superset.reports.commands.create import CreateReportScheduleCommand +from superset.reports.commands.exceptions import ReportScheduleInvalidError +from superset.reports.models import ( + ReportCreationMethod, + ReportRecipientType, + ReportScheduleType, +) +from tests.integration_tests.fixtures.tabbed_dashboard import tabbed_dashboard + +DASHBOARD_REPORT_SCHEDULE_DEFAULTS = { + "type": ReportScheduleType.REPORT, + "description": "description", + "crontab": "0 9 * * *", + "creation_method": ReportCreationMethod.ALERTS_REPORTS, + "recipients": [ + { + "type": ReportRecipientType.EMAIL, + "recipient_config_json": {"target": "target@example.com"}, + }, + ], + "grace_period": 14400, + "working_timeout": 3600, +} + + +@pytest.mark.usefixtures("login_as_admin") +def test_accept_valid_tab_ids(tabbed_dashboard: Dashboard) -> None: + report_schedule = CreateReportScheduleCommand( + { + **DASHBOARD_REPORT_SCHEDULE_DEFAULTS, + "name": "tabbed dashboard report (valid tabs id)", + "dashboard": tabbed_dashboard.id, + "extra": {"dashboard": {"activeTabs": ["TAB-L1AA", "TAB-L2AB"]}}, + } + ).run() + assert report_schedule.extra == { + "dashboard": {"activeTabs": ["TAB-L1AA", "TAB-L2AB"]} + } + db.session.delete(report_schedule) + db.session.commit() + + +@pytest.mark.usefixtures("login_as_admin") +def test_raise_exception_for_invalid_tab_ids(tabbed_dashboard: Dashboard) -> None: + with pytest.raises(ReportScheduleInvalidError) as exc_info: + CreateReportScheduleCommand( + { + **DASHBOARD_REPORT_SCHEDULE_DEFAULTS, + "name": "tabbed dashboard report (invalid tab ids)", + "dashboard": tabbed_dashboard.id, + "extra": {"dashboard": {"activeTabs": ["TAB-INVALID_ID"]}}, + } + ).run() + assert "Invalid tab ids" in str(exc_info.value.normalized_messages()) + + with pytest.raises(ReportScheduleInvalidError) as exc_info: + CreateReportScheduleCommand( + { + **DASHBOARD_REPORT_SCHEDULE_DEFAULTS, + "name": "tabbed dashboard report (invalid tab ids in anchor)", + "dashboard": tabbed_dashboard.id, + "extra": { + "dashboard": { + "activeTabs": ["TAB-L1AA"], + "anchor": "TAB-INVALID_ID", + } + }, + } + ).run() + assert "Invalid tab ids" in str(exc_info.value.normalized_messages()) diff --git a/tests/integration_tests/reports/commands/execute_dashboard_report_tests.py b/tests/integration_tests/reports/commands/execute_dashboard_report_tests.py new file mode 100644 index 000000000000..0027738fd980 --- /dev/null +++ b/tests/integration_tests/reports/commands/execute_dashboard_report_tests.py @@ -0,0 +1,113 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from datetime import datetime +from unittest.mock import MagicMock, patch +from uuid import uuid4 + +from flask import current_app + +from superset.dashboards.permalink.commands.create import ( + CreateDashboardPermalinkCommand, +) +from superset.models.dashboard import Dashboard +from superset.reports.commands.execute import AsyncExecuteReportScheduleCommand +from superset.reports.models import ReportSourceFormat +from tests.integration_tests.fixtures.tabbed_dashboard import tabbed_dashboard +from tests.integration_tests.reports.utils import create_dashboard_report + + +@patch("superset.reports.notifications.email.send_email_smtp") +@patch( + "superset.reports.commands.execute.DashboardScreenshot", +) +@patch( + "superset.dashboards.permalink.commands.create.CreateDashboardPermalinkCommand.run" +) +def test_report_for_dashboard_with_tabs( + create_dashboard_permalink_mock: MagicMock, + dashboard_screenshot_mock: MagicMock, + send_email_smtp_mock: MagicMock, + tabbed_dashboard: Dashboard, +) -> None: + create_dashboard_permalink_mock.return_value = "permalink" + dashboard_screenshot_mock.get_screenshot.return_value = b"test-image" + current_app.config["ALERT_REPORTS_NOTIFICATION_DRY_RUN"] = False + + with create_dashboard_report( + dashboard=tabbed_dashboard, + extra={"active_tabs": ["TAB-L1B", "TAB-L2BB"]}, + name="test report tabbed dashboard", + ) as report_schedule: + dashboard: Dashboard = report_schedule.dashboard + AsyncExecuteReportScheduleCommand( + str(uuid4()), report_schedule.id, datetime.utcnow() + ).run() + dashboard_state = report_schedule.extra.get("dashboard", {}) + permalink_key = CreateDashboardPermalinkCommand( + dashboard.id, dashboard_state + ).run() + + assert dashboard_screenshot_mock.call_count == 1 + (url, digest) = dashboard_screenshot_mock.call_args.args + assert url.endswith(f"/superset/dashboard/p/{permalink_key}/") + assert digest == dashboard.digest + assert send_email_smtp_mock.call_count == 1 + assert len(send_email_smtp_mock.call_args.kwargs["images"]) == 1 + + +@patch("superset.reports.notifications.email.send_email_smtp") +@patch( + "superset.reports.commands.execute.DashboardScreenshot", +) +@patch( + "superset.dashboards.permalink.commands.create.CreateDashboardPermalinkCommand.run" +) +def test_report_with_header_data( + create_dashboard_permalink_mock: MagicMock, + dashboard_screenshot_mock: MagicMock, + send_email_smtp_mock: MagicMock, + tabbed_dashboard: Dashboard, +) -> None: + create_dashboard_permalink_mock.return_value = "permalink" + dashboard_screenshot_mock.get_screenshot.return_value = b"test-image" + current_app.config["ALERT_REPORTS_NOTIFICATION_DRY_RUN"] = False + + with create_dashboard_report( + dashboard=tabbed_dashboard, + extra={"active_tabs": ["TAB-L1B"]}, + name="test report tabbed dashboard", + ) as report_schedule: + dashboard: Dashboard = report_schedule.dashboard + AsyncExecuteReportScheduleCommand( + str(uuid4()), report_schedule.id, datetime.utcnow() + ).run() + dashboard_state = report_schedule.extra.get("dashboard", {}) + permalink_key = CreateDashboardPermalinkCommand( + dashboard.id, dashboard_state + ).run() + + assert dashboard_screenshot_mock.call_count == 1 + (url, digest) = dashboard_screenshot_mock.call_args.args + assert url.endswith(f"/superset/dashboard/p/{permalink_key}/") + assert digest == dashboard.digest + assert send_email_smtp_mock.call_count == 1 + header_data = send_email_smtp_mock.call_args.kwargs["header_data"] + assert header_data.get("dashboard_id") == dashboard.id + assert header_data.get("notification_format") == report_schedule.report_format + assert header_data.get("notification_source") == ReportSourceFormat.DASHBOARD + assert header_data.get("notification_type") == report_schedule.type + assert len(send_email_smtp_mock.call_args.kwargs["header_data"]) == 6 diff --git a/tests/integration_tests/reports/commands_tests.py b/tests/integration_tests/reports/commands_tests.py index 8163f48abd26..8d6a76c14f67 100644 --- a/tests/integration_tests/reports/commands_tests.py +++ b/tests/integration_tests/reports/commands_tests.py @@ -16,70 +16,89 @@ # under the License. import json from contextlib import contextmanager -from datetime import datetime, timedelta -from typing import Any, Dict, List, Optional -from unittest.mock import Mock, patch +from datetime import datetime, timedelta, timezone +from typing import List, Optional +from unittest.mock import call, Mock, patch from uuid import uuid4 import pytest from flask import current_app +from flask_appbuilder.security.sqla.models import User from flask_sqlalchemy import BaseQuery from freezegun import freeze_time +from slack_sdk.errors import ( + BotUserAccessError, + SlackApiError, + SlackClientConfigurationError, + SlackClientError, + SlackClientNotConnectedError, + SlackObjectFormationError, + SlackRequestError, + SlackTokenRotationError, +) from sqlalchemy.sql import func -from superset import db, security_manager +from superset import db +from superset.exceptions import SupersetException from superset.models.core import Database from superset.models.dashboard import Dashboard -from superset.models.reports import ( - ReportDataFormat, - ReportExecutionLog, - ReportRecipients, - ReportRecipientType, - ReportSchedule, - ReportScheduleType, - ReportScheduleValidatorType, - ReportState, -) from superset.models.slice import Slice from superset.reports.commands.exceptions import ( AlertQueryError, AlertQueryInvalidTypeError, AlertQueryMultipleColumnsError, AlertQueryMultipleRowsError, + ReportScheduleClientErrorsException, ReportScheduleCsvFailedError, ReportScheduleCsvTimeout, ReportScheduleNotFoundError, - ReportScheduleNotificationError, ReportSchedulePreviousWorkingError, ReportScheduleScreenshotFailedError, ReportScheduleScreenshotTimeout, + ReportScheduleSystemErrorsException, ReportScheduleWorkingTimeoutError, ) -from superset.reports.commands.execute import AsyncExecuteReportScheduleCommand +from superset.reports.commands.execute import ( + AsyncExecuteReportScheduleCommand, + BaseReportState, +) from superset.reports.commands.log_prune import AsyncPruneReportScheduleLogCommand +from superset.reports.models import ( + ReportDataFormat, + ReportExecutionLog, + ReportSchedule, + ReportScheduleType, + ReportScheduleValidatorType, + ReportState, +) +from superset.reports.notifications.exceptions import ( + NotificationError, + NotificationParamException, +) +from superset.tasks.types import ExecutorType from superset.utils.database import get_example_database from tests.integration_tests.fixtures.birth_names_dashboard import ( load_birth_names_dashboard_with_slices, load_birth_names_data, ) -from tests.integration_tests.fixtures.tabbed_dashboard import tabbed_dashboard from tests.integration_tests.fixtures.world_bank_dashboard import ( load_world_bank_dashboard_with_slices_module_scope, load_world_bank_data, ) -from tests.integration_tests.reports.utils import insert_report_schedule +from tests.integration_tests.reports.utils import ( + cleanup_report_schedule, + create_report_notification, + CSV_FILE, + DEFAULT_OWNER_EMAIL, + SCREENSHOT_FILE, + TEST_ID, +) from tests.integration_tests.test_app import app -from tests.integration_tests.utils import read_fixture pytestmark = pytest.mark.usefixtures( "load_world_bank_dashboard_with_slices_module_scope" ) -TEST_ID = str(uuid4()) -CSV_FILE = read_fixture("trends.csv") -SCREENSHOT_FILE = read_fixture("sample.png") -OWNER_EMAIL = "admin@fab.org" - def get_target_from_report_schedule(report_schedule: ReportSchedule) -> List[str]: return [ @@ -129,92 +148,16 @@ def assert_log(state: str, error_message: Optional[str] = None): assert log.value_row_json is None -def create_report_notification( - email_target: Optional[str] = None, - slack_channel: Optional[str] = None, - chart: Optional[Slice] = None, - dashboard: Optional[Dashboard] = None, - database: Optional[Database] = None, - sql: Optional[str] = None, - report_type: Optional[str] = None, - validator_type: Optional[str] = None, - validator_config_json: Optional[str] = None, - grace_period: Optional[int] = None, - report_format: Optional[ReportDataFormat] = None, - name: Optional[str] = None, - extra: Optional[Dict[str, Any]] = None, - force_screenshot: bool = False, -) -> ReportSchedule: - report_type = report_type or ReportScheduleType.REPORT - target = email_target or slack_channel - config_json = {"target": target} - owner = ( - db.session.query(security_manager.user_model) - .filter_by(email=OWNER_EMAIL) - .one_or_none() - ) - - if slack_channel: - recipient = ReportRecipients( - type=ReportRecipientType.SLACK, - recipient_config_json=json.dumps(config_json), - ) - else: - recipient = ReportRecipients( - type=ReportRecipientType.EMAIL, - recipient_config_json=json.dumps(config_json), - ) - - if name is None: - name = "report_with_csv" if report_format else "report" - - report_schedule = insert_report_schedule( - type=report_type, - name=name, - crontab="0 9 * * *", - description="Daily report", - sql=sql, - chart=chart, - dashboard=dashboard, - database=database, - recipients=[recipient], - owners=[owner], - validator_type=validator_type, - validator_config_json=validator_config_json, - grace_period=grace_period, - report_format=report_format or ReportDataFormat.VISUALIZATION, - extra=extra, - force_screenshot=force_screenshot, - ) - return report_schedule - - -def cleanup_report_schedule(report_schedule: ReportSchedule) -> None: - db.session.query(ReportExecutionLog).filter( - ReportExecutionLog.report_schedule == report_schedule - ).delete() - db.session.query(ReportRecipients).filter( - ReportRecipients.report_schedule == report_schedule - ).delete() - - db.session.delete(report_schedule) - db.session.commit() - - @contextmanager def create_test_table_context(database: Database): - database.get_sqla_engine().execute( - "CREATE TABLE test_table AS SELECT 1 as first, 2 as second" - ) - database.get_sqla_engine().execute( - "INSERT INTO test_table (first, second) VALUES (1, 2)" - ) - database.get_sqla_engine().execute( - "INSERT INTO test_table (first, second) VALUES (3, 4)" - ) + with database.get_sqla_engine_with_context() as engine: + engine.execute("CREATE TABLE test_table AS SELECT 1 as first, 2 as second") + engine.execute("INSERT INTO test_table (first, second) VALUES (1, 2)") + engine.execute("INSERT INTO test_table (first, second) VALUES (3, 4)") yield db.session - database.get_sqla_engine().execute("DROP TABLE test_table") + with database.get_sqla_engine_with_context() as engine: + engine.execute("DROP TABLE test_table") @pytest.fixture() @@ -229,6 +172,19 @@ def create_report_email_chart(): cleanup_report_schedule(report_schedule) +@pytest.fixture() +def create_report_email_chart_alpha_owner(get_user): + with app.app_context(): + owners = [get_user("alpha")] + chart = db.session.query(Slice).first() + report_schedule = create_report_notification( + email_target="target@email.com", chart=chart, owners=owners + ) + yield report_schedule + + cleanup_report_schedule(report_schedule) + + @pytest.fixture() def create_report_email_chart_force_screenshot(): with app.app_context(): @@ -308,23 +264,6 @@ def create_report_email_dashboard_force_screenshot(): cleanup_report_schedule(report_schedule) -@pytest.fixture() -def create_report_email_tabbed_dashboard(tabbed_dashboard): - with app.app_context(): - report_schedule = create_report_notification( - email_target="target@email.com", - dashboard=tabbed_dashboard, - extra={ - "dashboard_tab_ids": [ - "TAB-j53G4gtKGF", - "TAB-nerWR09Ju", - ] - }, - ) - yield report_schedule - cleanup_report_schedule(report_schedule) - - @pytest.fixture() def create_report_slack_chart(): with app.app_context(): @@ -724,11 +663,64 @@ def test_email_chart_report_schedule( ) # assert that the link sent is correct assert ( - '<a href="http://0.0.0.0:8080/superset/explore/?' - "form_data=%7B%22slice_id%22%3A%20" - f"{create_report_email_chart.chart.id}%7D&" - 'standalone=0&force=false">Explore in Superset</a>' - in email_mock.call_args[0][2] + '<a href="http://0.0.0.0:8080/explore/?form_data=%7B%22slice_id%22%3A+' + f"{create_report_email_chart.chart.id}" + '%7D&force=false">Explore in Superset</a>' in email_mock.call_args[0][2] + ) + # Assert the email smtp address + assert email_mock.call_args[0][0] == notification_targets[0] + # Assert the email inline screenshot + smtp_images = email_mock.call_args[1]["images"] + assert smtp_images[list(smtp_images.keys())[0]] == SCREENSHOT_FILE + # Assert logs are correct + assert_log(ReportState.SUCCESS) + + +@pytest.mark.usefixtures( + "load_birth_names_dashboard_with_slices", "create_report_email_chart_alpha_owner" +) +@patch("superset.reports.notifications.email.send_email_smtp") +@patch("superset.utils.screenshots.ChartScreenshot.get_screenshot") +def test_email_chart_report_schedule_alpha_owner( + screenshot_mock, + email_mock, + create_report_email_chart_alpha_owner, +): + """ + ExecuteReport Command: Test chart email report schedule with screenshot + executed as the chart owner + """ + config_key = "ALERT_REPORTS_EXECUTE_AS" + original_config_value = app.config[config_key] + app.config[config_key] = [ExecutorType.OWNER] + + # setup screenshot mock + username = "" + + def _screenshot_side_effect(user: User) -> Optional[bytes]: + nonlocal username + username = user.username + + return SCREENSHOT_FILE + + screenshot_mock.side_effect = _screenshot_side_effect + + with freeze_time("2020-01-01T00:00:00Z"): + AsyncExecuteReportScheduleCommand( + TEST_ID, create_report_email_chart_alpha_owner.id, datetime.utcnow() + ).run() + + notification_targets = get_target_from_report_schedule( + create_report_email_chart_alpha_owner + ) + # assert that the screenshot is executed as the chart owner + assert username == "alpha" + + # assert that the link sent is correct + assert ( + '<a href="http://0.0.0.0:8080/explore/?form_data=%7B%22slice_id%22%3A+' + f"{create_report_email_chart_alpha_owner.chart.id}" + '%7D&force=false">Explore in Superset</a>' in email_mock.call_args[0][2] ) # Assert the email smtp address assert email_mock.call_args[0][0] == notification_targets[0] @@ -738,6 +730,8 @@ def test_email_chart_report_schedule( # Assert logs are correct assert_log(ReportState.SUCCESS) + app.config[config_key] = original_config_value + @pytest.mark.usefixtures( "load_birth_names_dashboard_with_slices", @@ -769,11 +763,9 @@ def test_email_chart_report_schedule_force_screenshot( ) # assert that the link sent is correct assert ( - '<a href="http://0.0.0.0:8080/superset/explore/?' - "form_data=%7B%22slice_id%22%3A%20" - f"{create_report_email_chart_force_screenshot.chart.id}%7D&" - 'standalone=0&force=true">Explore in Superset</a>' - in email_mock.call_args[0][2] + '<a href="http://0.0.0.0:8080/explore/?form_data=%7B%22slice_id%22%3A+' + f"{create_report_email_chart_force_screenshot.chart.id}" + '%7D&force=true">Explore in Superset</a>' in email_mock.call_args[0][2] ) # Assert the email smtp address assert email_mock.call_args[0][0] == notification_targets[0] @@ -808,11 +800,9 @@ def test_email_chart_alert_schedule( notification_targets = get_target_from_report_schedule(create_alert_email_chart) # assert that the link sent is correct assert ( - '<a href="http://0.0.0.0:8080/superset/explore/?' - "form_data=%7B%22slice_id%22%3A%20" - f"{create_alert_email_chart.chart.id}%7D&" - 'standalone=0&force=true">Explore in Superset</a>' - in email_mock.call_args[0][2] + '<a href="http://0.0.0.0:8080/explore/?form_data=%7B%22slice_id%22%3A+' + f"{create_alert_email_chart.chart.id}" + '%7D&force=true">Explore in Superset</a>' in email_mock.call_args[0][2] ) # Assert the email smtp address assert email_mock.call_args[0][0] == notification_targets[0] @@ -882,11 +872,9 @@ def test_email_chart_report_schedule_with_csv( ) # assert that the link sent is correct assert ( - '<a href="http://0.0.0.0:8080/superset/explore/?' - "form_data=%7B%22slice_id%22%3A%20" + '<a href="http://0.0.0.0:8080/explore/?form_data=%7B%22slice_id%22%3A+' f"{create_report_email_chart_with_csv.chart.id}%7D&" - 'standalone=0&force=false">Explore in Superset</a>' - in email_mock.call_args[0][2] + 'force=false">Explore in Superset</a>' in email_mock.call_args[0][2] ) # Assert the email smtp address assert email_mock.call_args[0][0] == notification_targets[0] @@ -960,6 +948,8 @@ def test_email_chart_report_schedule_with_text( mock_open.return_value = response mock_urlopen.return_value = response mock_urlopen.return_value.getcode.return_value = 200 + + # test without date type. response.read.return_value = json.dumps( { "result": [ @@ -971,6 +961,7 @@ def test_email_chart_report_schedule_with_text( }, "colnames": [("t1",), ("t2",), ("t3__sum",)], "indexnames": [(0,), (1,)], + "coltypes": [1, 1], }, ], } @@ -1011,6 +1002,59 @@ def test_email_chart_report_schedule_with_text( # Assert logs are correct assert_log(ReportState.SUCCESS) + # test with date type. + dt = datetime(2022, 1, 1).replace(tzinfo=timezone.utc) + ts = datetime.timestamp(dt) * 1000 + response.read.return_value = json.dumps( + { + "result": [ + { + "data": { + "t1": {0: "c11", 1: "c21"}, + "t2__date": {0: ts, 1: ts}, + "t3__sum": {0: "c13", 1: "c23"}, + }, + "colnames": [("t1",), ("t2__date",), ("t3__sum",)], + "indexnames": [(0,), (1,)], + "coltypes": [1, 2], + }, + ], + } + ).encode("utf-8") + + with freeze_time("2020-01-01T00:00:00Z"): + AsyncExecuteReportScheduleCommand( + TEST_ID, create_report_email_chart_with_text.id, datetime.utcnow() + ).run() + + # assert that the data is embedded correctly + table_html = """<table border="1" class="dataframe"> + <thead> + <tr> + <th></th> + <th>t1</th> + <th>t2__date</th> + <th>t3__sum</th> + </tr> + </thead> + <tbody> + <tr> + <th>0</th> + <td>c11</td> + <td>2022-01-01</td> + <td>c13</td> + </tr> + <tr> + <th>1</th> + <td>c21</td> + <td>2022-01-01</td> + <td>c23</td> + </tr> + </tbody> +</table>""" + + assert table_html in email_mock.call_args[0][2] + @pytest.mark.usefixtures( "load_birth_names_dashboard_with_slices", "create_report_email_dashboard" @@ -1116,6 +1160,61 @@ def test_slack_chart_report_schedule( statsd_mock.assert_called_once_with("reports.slack.send.ok", 1) +@pytest.mark.usefixtures( + "load_birth_names_dashboard_with_slices", "create_report_slack_chart" +) +@patch("superset.reports.notifications.slack.WebClient") +@patch("superset.utils.screenshots.ChartScreenshot.get_screenshot") +def test_slack_chart_report_schedule_with_errors( + screenshot_mock, + web_client_mock, + create_report_slack_chart, +): + """ + ExecuteReport Command: Test that all slack errors will + properly log something + """ + # setup screenshot mock + screenshot_mock.return_value = SCREENSHOT_FILE + + slack_errors = [ + BotUserAccessError(), + SlackRequestError(), + SlackClientConfigurationError(), + SlackObjectFormationError(), + SlackTokenRotationError(api_error="foo"), + SlackClientNotConnectedError(), + SlackClientError(), + SlackApiError(message="foo", response="bar"), + ] + + for idx, er in enumerate(slack_errors): + web_client_mock.side_effect = er + + with pytest.raises(ReportScheduleClientErrorsException): + + AsyncExecuteReportScheduleCommand( + TEST_ID, create_report_slack_chart.id, datetime.utcnow() + ).run() + + db.session.commit() + + # Assert errors are being logged + + # Only one notification log is sent because it's in grace period + # for the rest of the reports + notification_logs_count = get_notification_error_sent_count( + create_report_slack_chart + ) + error_logs = get_error_logs_query(create_report_slack_chart) + + # check that we have two logs for each error + assert error_logs.count() == (len(slack_errors) + notification_logs_count) * 2 + + # check that each error has a message + assert len([log.error_message for log in error_logs]) == error_logs.count() + + @pytest.mark.usefixtures( "load_birth_names_dashboard_with_slices", "create_report_slack_chart_with_csv" ) @@ -1204,7 +1303,7 @@ def test_slack_chart_report_schedule_with_text( | 1 | c21 | c22 | c23 |""" assert table_markdown in post_message_mock.call_args[1]["text"] assert ( - f"<http://0.0.0.0:8080/superset/explore/?form_data=%7B%22slice_id%22%3A%20{create_report_slack_chart_with_text.chart.id}%7D&standalone=0&force=false|Explore in Superset>" + f"<http://0.0.0.0:8080/explore/?form_data=%7B%22slice_id%22%3A+{create_report_slack_chart_with_text.chart.id}%7D&force=false|Explore in Superset>" in post_message_mock.call_args[1]["text"] ) @@ -1356,7 +1455,7 @@ def test_email_dashboard_report_fails( screenshot_mock.return_value = SCREENSHOT_FILE email_mock.side_effect = SMTPException("Could not connect to SMTP XPTO") - with pytest.raises(ReportScheduleNotificationError): + with pytest.raises(ReportScheduleSystemErrorsException): AsyncExecuteReportScheduleCommand( TEST_ID, create_report_email_dashboard.id, datetime.utcnow() ).run() @@ -1364,6 +1463,32 @@ def test_email_dashboard_report_fails( assert_log(ReportState.ERROR, error_message="Could not connect to SMTP XPTO") +@pytest.mark.usefixtures( + "load_birth_names_dashboard_with_slices", "create_report_email_dashboard" +) +@patch("superset.reports.notifications.email.send_email_smtp") +@patch("superset.utils.screenshots.DashboardScreenshot.get_screenshot") +def test_email_dashboard_report_fails_uncaught_exception( + screenshot_mock, email_mock, create_report_email_dashboard +): + """ + ExecuteReport Command: Test dashboard email report schedule notification fails + and logs with uncaught exception + """ + # setup screenshot mock + from smtplib import SMTPException + + screenshot_mock.return_value = SCREENSHOT_FILE + email_mock.side_effect = Exception("Uncaught exception") + + with pytest.raises(Exception): + AsyncExecuteReportScheduleCommand( + TEST_ID, create_report_email_dashboard.id, datetime.utcnow() + ).run() + + assert_log(ReportState.ERROR, error_message="Uncaught exception") + + @pytest.mark.usefixtures( "load_birth_names_dashboard_with_slices", "create_alert_email_chart" ) @@ -1503,7 +1628,7 @@ def test_soft_timeout_alert(email_mock, create_alert_email_chart): notification_targets = get_target_from_report_schedule(create_alert_email_chart) # Assert the email smtp address, asserts a notification was sent with the error - assert email_mock.call_args[0][0] == OWNER_EMAIL + assert email_mock.call_args[0][0] == DEFAULT_OWNER_EMAIL assert_log( ReportState.ERROR, error_message="A timeout occurred while executing the query." @@ -1532,7 +1657,7 @@ def test_soft_timeout_screenshot(screenshot_mock, email_mock, create_alert_email ).run() # Assert the email smtp address, asserts a notification was sent with the error - assert email_mock.call_args[0][0] == OWNER_EMAIL + assert email_mock.call_args[0][0] == DEFAULT_OWNER_EMAIL assert_log( ReportState.ERROR, error_message="A timeout occurred while taking a screenshot." @@ -1572,7 +1697,7 @@ def test_soft_timeout_csv( create_report_email_chart_with_csv ) # Assert the email smtp address, asserts a notification was sent with the error - assert email_mock.call_args[0][0] == OWNER_EMAIL + assert email_mock.call_args[0][0] == DEFAULT_OWNER_EMAIL assert_log( ReportState.ERROR, @@ -1612,7 +1737,7 @@ def test_generate_no_csv( create_report_email_chart_with_csv ) # Assert the email smtp address, asserts a notification was sent with the error - assert email_mock.call_args[0][0] == OWNER_EMAIL + assert email_mock.call_args[0][0] == DEFAULT_OWNER_EMAIL assert_log( ReportState.ERROR, @@ -1641,7 +1766,7 @@ def test_fail_screenshot(screenshot_mock, email_mock, create_report_email_chart) notification_targets = get_target_from_report_schedule(create_report_email_chart) # Assert the email smtp address, asserts a notification was sent with the error - assert email_mock.call_args[0][0] == OWNER_EMAIL + assert email_mock.call_args[0][0] == DEFAULT_OWNER_EMAIL assert_log( ReportState.ERROR, error_message="Failed taking a screenshot Unexpected error" @@ -1674,7 +1799,7 @@ def test_fail_csv( get_target_from_report_schedule(create_report_email_chart_with_csv) # Assert the email smtp address, asserts a notification was sent with the error - assert email_mock.call_args[0][0] == OWNER_EMAIL + assert email_mock.call_args[0][0] == DEFAULT_OWNER_EMAIL assert_log( ReportState.ERROR, error_message="Failed generating csv <urlopen error 500>" @@ -1719,11 +1844,9 @@ def test_invalid_sql_alert(email_mock, create_invalid_sql_alert_email_chart): TEST_ID, create_invalid_sql_alert_email_chart.id, datetime.utcnow() ).run() - notification_targets = get_target_from_report_schedule( - create_invalid_sql_alert_email_chart - ) # Assert the email smtp address, asserts a notification was sent with the error - assert email_mock.call_args[0][0] == OWNER_EMAIL + assert email_mock.call_args[0][0] == DEFAULT_OWNER_EMAIL + assert_log(ReportState.ERROR) @pytest.mark.usefixtures("create_invalid_sql_alert_email_chart") @@ -1740,11 +1863,9 @@ def test_grace_period_error(email_mock, create_invalid_sql_alert_email_chart): # Only needed for MySQL, understand why db.session.commit() - notification_targets = get_target_from_report_schedule( - create_invalid_sql_alert_email_chart - ) + # Assert the email smtp address, asserts a notification was sent with the error - assert email_mock.call_args[0][0] == OWNER_EMAIL + assert email_mock.call_args[0][0] == DEFAULT_OWNER_EMAIL assert ( get_notification_error_sent_count(create_invalid_sql_alert_email_chart) == 1 ) @@ -1844,8 +1965,6 @@ def test_grace_period_error_flap( ) @patch("superset.reports.dao.ReportScheduleDAO.bulk_delete_logs") def test_prune_log_soft_time_out(bulk_delete_logs, create_report_email_dashboard): - from datetime import datetime, timedelta - from celery.exceptions import SoftTimeLimitExceeded bulk_delete_logs.side_effect = SoftTimeLimitExceeded() @@ -1854,31 +1973,64 @@ def test_prune_log_soft_time_out(bulk_delete_logs, create_report_email_dashboard assert str(excinfo.value) == "SoftTimeLimitExceeded()" -@pytest.mark.usefixtures( - "create_report_email_tabbed_dashboard", -) -@patch("superset.reports.notifications.email.send_email_smtp") -@patch( - "superset.reports.commands.execute.DashboardScreenshot", -) -def test_when_tabs_are_selected_it_takes_screenshots_for_every_tabs( - dashboard_screenshot_mock, - send_email_smtp_mock, - create_report_email_tabbed_dashboard, -): - dashboard_screenshot_mock.get_screenshot.return_value = b"test-image" - dashboard = create_report_email_tabbed_dashboard.dashboard +@patch("superset.reports.commands.execute.logger") +@patch("superset.reports.commands.execute.create_notification") +def test__send_with_client_errors(notification_mock, logger_mock): + notification_content = "I am some content" + recipients = ["test@foo.com"] + notification_mock.return_value.send.side_effect = NotificationParamException() + with pytest.raises(ReportScheduleClientErrorsException) as excinfo: + BaseReportState._send(BaseReportState, notification_content, recipients) + + assert excinfo.errisinstance(SupersetException) + logger_mock.warning.assert_called_with( + ( + "SupersetError(message='', error_type=<SupersetErrorType.REPORT_NOTIFICATION_ERROR: 'REPORT_NOTIFICATION_ERROR'>, level=<ErrorLevel.WARNING: 'warning'>, extra=None)" + ) + ) - AsyncExecuteReportScheduleCommand( - TEST_ID, create_report_email_tabbed_dashboard.id, datetime.utcnow() - ).run() - tabs = json.loads(create_report_email_tabbed_dashboard.extra)["dashboard_tab_ids"] - assert dashboard_screenshot_mock.call_count == 2 - for index, tab in enumerate(tabs): - assert dashboard_screenshot_mock.call_args_list[index].args == ( - f"http://0.0.0.0:8081/superset/dashboard/{dashboard.id}/?standalone=3&force=false#{tab}", - f"{dashboard.digest}", +@patch("superset.reports.commands.execute.logger") +@patch("superset.reports.commands.execute.create_notification") +def test__send_with_multiple_errors(notification_mock, logger_mock): + notification_content = "I am some content" + recipients = ["test@foo.com", "test2@bar.com"] + notification_mock.return_value.send.side_effect = [ + NotificationParamException(), + NotificationError(), + ] + # it raises the error with a 500 status if present + with pytest.raises(ReportScheduleSystemErrorsException) as excinfo: + BaseReportState._send(BaseReportState, notification_content, recipients) + + assert excinfo.errisinstance(SupersetException) + # it logs both errors as warnings + logger_mock.warning.assert_has_calls( + [ + call( + "SupersetError(message='', error_type=<SupersetErrorType.REPORT_NOTIFICATION_ERROR: 'REPORT_NOTIFICATION_ERROR'>, level=<ErrorLevel.WARNING: 'warning'>, extra=None)" + ), + call( + "SupersetError(message='', error_type=<SupersetErrorType.REPORT_NOTIFICATION_ERROR: 'REPORT_NOTIFICATION_ERROR'>, level=<ErrorLevel.ERROR: 'error'>, extra=None)" + ), + ] + ) + + +@patch("superset.reports.commands.execute.logger") +@patch("superset.reports.commands.execute.create_notification") +def test__send_with_server_errors(notification_mock, logger_mock): + + notification_content = "I am some content" + recipients = ["test@foo.com"] + notification_mock.return_value.send.side_effect = NotificationError() + with pytest.raises(ReportScheduleSystemErrorsException) as excinfo: + BaseReportState._send(BaseReportState, notification_content, recipients) + + assert excinfo.errisinstance(SupersetException) + # it logs the error + logger_mock.warning.assert_called_with( + ( + "SupersetError(message='', error_type=<SupersetErrorType.REPORT_NOTIFICATION_ERROR: 'REPORT_NOTIFICATION_ERROR'>, level=<ErrorLevel.ERROR: 'error'>, extra=None)" ) - assert send_email_smtp_mock.called is True - assert len(send_email_smtp_mock.call_args.kwargs["images"]) == 2 + ) diff --git a/tests/integration_tests/reports/scheduler_tests.py b/tests/integration_tests/reports/scheduler_tests.py index 77894a6d2ef3..3dd6e72941e2 100644 --- a/tests/integration_tests/reports/scheduler_tests.py +++ b/tests/integration_tests/reports/scheduler_tests.py @@ -14,22 +14,31 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. + +from random import randint from typing import List from unittest.mock import patch import pytest +from flask_appbuilder.security.sqla.models import User from freezegun import freeze_time from freezegun.api import FakeDatetime # type: ignore from superset.extensions import db -from superset.models.reports import ReportScheduleType -from superset.tasks.scheduler import scheduler +from superset.reports.models import ReportScheduleType +from superset.tasks.scheduler import execute, scheduler from tests.integration_tests.reports.utils import insert_report_schedule from tests.integration_tests.test_app import app +@pytest.fixture +def owners(get_user) -> List[User]: + return [get_user("admin")] + + +@pytest.mark.usefixtures("owners") @patch("superset.tasks.scheduler.execute.apply_async") -def test_scheduler_celery_timeout_ny(execute_mock): +def test_scheduler_celery_timeout_ny(execute_mock, owners): """ Reports scheduler: Test scheduler setting celery soft and hard timeout """ @@ -40,6 +49,7 @@ def test_scheduler_celery_timeout_ny(execute_mock): name="report", crontab="0 4 * * *", timezone="America/New_York", + owners=owners, ) with freeze_time("2020-01-01T09:00:00Z"): @@ -50,8 +60,9 @@ def test_scheduler_celery_timeout_ny(execute_mock): db.session.commit() +@pytest.mark.usefixtures("owners") @patch("superset.tasks.scheduler.execute.apply_async") -def test_scheduler_celery_no_timeout_ny(execute_mock): +def test_scheduler_celery_no_timeout_ny(execute_mock, owners): """ Reports scheduler: Test scheduler setting celery soft and hard timeout """ @@ -62,6 +73,7 @@ def test_scheduler_celery_no_timeout_ny(execute_mock): name="report", crontab="0 4 * * *", timezone="America/New_York", + owners=owners, ) with freeze_time("2020-01-01T09:00:00Z"): @@ -72,8 +84,9 @@ def test_scheduler_celery_no_timeout_ny(execute_mock): app.config["ALERT_REPORTS_WORKING_TIME_OUT_KILL"] = True +@pytest.mark.usefixtures("owners") @patch("superset.tasks.scheduler.execute.apply_async") -def test_scheduler_celery_timeout_utc(execute_mock): +def test_scheduler_celery_timeout_utc(execute_mock, owners): """ Reports scheduler: Test scheduler setting celery soft and hard timeout """ @@ -84,19 +97,20 @@ def test_scheduler_celery_timeout_utc(execute_mock): name="report", crontab="0 9 * * *", timezone="UTC", + owners=owners, ) with freeze_time("2020-01-01T09:00:00Z"): scheduler() - print(execute_mock.call_args) assert execute_mock.call_args[1]["soft_time_limit"] == 3601 assert execute_mock.call_args[1]["time_limit"] == 3610 db.session.delete(report_schedule) db.session.commit() +@pytest.mark.usefixtures("owners") @patch("superset.tasks.scheduler.execute.apply_async") -def test_scheduler_celery_no_timeout_utc(execute_mock): +def test_scheduler_celery_no_timeout_utc(execute_mock, owners): """ Reports scheduler: Test scheduler setting celery soft and hard timeout """ @@ -107,6 +121,7 @@ def test_scheduler_celery_no_timeout_utc(execute_mock): name="report", crontab="0 9 * * *", timezone="UTC", + owners=owners, ) with freeze_time("2020-01-01T09:00:00Z"): @@ -117,9 +132,10 @@ def test_scheduler_celery_no_timeout_utc(execute_mock): app.config["ALERT_REPORTS_WORKING_TIME_OUT_KILL"] = True +@pytest.mark.usefixtures("owners") @patch("superset.tasks.scheduler.is_feature_enabled") @patch("superset.tasks.scheduler.execute.apply_async") -def test_scheduler_feature_flag_off(execute_mock, is_feature_enabled): +def test_scheduler_feature_flag_off(execute_mock, is_feature_enabled, owners): """ Reports scheduler: Test scheduler with feature flag off """ @@ -130,6 +146,7 @@ def test_scheduler_feature_flag_off(execute_mock, is_feature_enabled): name="report", crontab="0 9 * * *", timezone="UTC", + owners=owners, ) with freeze_time("2020-01-01T09:00:00Z"): @@ -137,3 +154,60 @@ def test_scheduler_feature_flag_off(execute_mock, is_feature_enabled): execute_mock.assert_not_called() db.session.delete(report_schedule) db.session.commit() + + +@pytest.mark.usefixtures("owners") +@patch("superset.reports.commands.execute.AsyncExecuteReportScheduleCommand.__init__") +@patch("superset.reports.commands.execute.AsyncExecuteReportScheduleCommand.run") +@patch("superset.tasks.scheduler.execute.update_state") +def test_execute_task(update_state_mock, command_mock, init_mock, owners): + from superset.reports.commands.exceptions import ReportScheduleUnexpectedError + + with app.app_context(): + report_schedule = insert_report_schedule( + type=ReportScheduleType.ALERT, + name=f"report-{randint(0,1000)}", + crontab="0 4 * * *", + timezone="America/New_York", + owners=owners, + ) + init_mock.return_value = None + command_mock.side_effect = ReportScheduleUnexpectedError("Unexpected error") + with freeze_time("2020-01-01T09:00:00Z"): + execute(report_schedule.id, "2020-01-01T09:00:00Z") + update_state_mock.assert_called_with(state="FAILURE") + + db.session.delete(report_schedule) + db.session.commit() + + +@pytest.mark.usefixtures("owners") +@patch("superset.reports.commands.execute.AsyncExecuteReportScheduleCommand.__init__") +@patch("superset.reports.commands.execute.AsyncExecuteReportScheduleCommand.run") +@patch("superset.tasks.scheduler.execute.update_state") +@patch("superset.utils.log.logger") +def test_execute_task_with_command_exception( + logger_mock, update_state_mock, command_mock, init_mock, owners +): + from superset.commands.exceptions import CommandException + + with app.app_context(): + report_schedule = insert_report_schedule( + type=ReportScheduleType.ALERT, + name=f"report-{randint(0,1000)}", + crontab="0 4 * * *", + timezone="America/New_York", + owners=owners, + ) + init_mock.return_value = None + command_mock.side_effect = CommandException("Unexpected error") + with freeze_time("2020-01-01T09:00:00Z"): + execute(report_schedule.id, "2020-01-01T09:00:00Z") + update_state_mock.assert_called_with(state="FAILURE") + logger_mock.exception.assert_called_with( + "A downstream exception occurred while generating a report: None. Unexpected error", + exc_info=True, + ) + + db.session.delete(report_schedule) + db.session.commit() diff --git a/tests/integration_tests/reports/utils.py b/tests/integration_tests/reports/utils.py index 1f04f0798860..3801beb1a328 100644 --- a/tests/integration_tests/reports/utils.py +++ b/tests/integration_tests/reports/utils.py @@ -15,34 +15,47 @@ # specific language governing permissions and limitations # under the License. +import json +from contextlib import contextmanager from typing import Any, Dict, List, Optional +from uuid import uuid4 from flask_appbuilder.security.sqla.models import User -from superset import db +from superset import db, security_manager from superset.models.core import Database from superset.models.dashboard import Dashboard -from superset.models.reports import ( +from superset.models.slice import Slice +from superset.reports.models import ( ReportDataFormat, ReportExecutionLog, ReportRecipients, + ReportRecipientType, ReportSchedule, + ReportScheduleType, ReportState, ) -from superset.models.slice import Slice +from superset.utils.core import override_user +from tests.integration_tests.test_app import app +from tests.integration_tests.utils import read_fixture + +TEST_ID = str(uuid4()) +CSV_FILE = read_fixture("trends.csv") +SCREENSHOT_FILE = read_fixture("sample.png") +DEFAULT_OWNER_EMAIL = "admin@fab.org" def insert_report_schedule( type: str, name: str, crontab: str, + owners: List[User], timezone: Optional[str] = None, sql: Optional[str] = None, description: Optional[str] = None, chart: Optional[Slice] = None, dashboard: Optional[Dashboard] = None, database: Optional[Database] = None, - owners: Optional[List[User]] = None, validator_type: Optional[str] = None, validator_config_json: Optional[str] = None, log_retention: Optional[int] = None, @@ -58,28 +71,131 @@ def insert_report_schedule( recipients = recipients or [] logs = logs or [] last_state = last_state or ReportState.NOOP - report_schedule = ReportSchedule( - type=type, + + with override_user(owners[0]): + report_schedule = ReportSchedule( + type=type, + name=name, + crontab=crontab, + timezone=timezone, + sql=sql, + description=description, + chart=chart, + dashboard=dashboard, + database=database, + owners=owners, + validator_type=validator_type, + validator_config_json=validator_config_json, + log_retention=log_retention, + grace_period=grace_period, + recipients=recipients, + logs=logs, + last_state=last_state, + report_format=report_format, + extra=extra, + force_screenshot=force_screenshot, + ) + db.session.add(report_schedule) + db.session.commit() + return report_schedule + + +def create_report_notification( + email_target: Optional[str] = None, + slack_channel: Optional[str] = None, + chart: Optional[Slice] = None, + dashboard: Optional[Dashboard] = None, + database: Optional[Database] = None, + sql: Optional[str] = None, + report_type: ReportScheduleType = ReportScheduleType.REPORT, + validator_type: Optional[str] = None, + validator_config_json: Optional[str] = None, + grace_period: Optional[int] = None, + report_format: Optional[ReportDataFormat] = None, + name: Optional[str] = None, + extra: Optional[Dict[str, Any]] = None, + force_screenshot: bool = False, + owners: Optional[List[User]] = None, +) -> ReportSchedule: + if not owners: + owners = [ + ( + db.session.query(security_manager.user_model) + .filter_by(email=DEFAULT_OWNER_EMAIL) + .one_or_none() + ) + ] + + if slack_channel: + recipient = ReportRecipients( + type=ReportRecipientType.SLACK, + recipient_config_json=json.dumps( + { + "target": slack_channel, + } + ), + ) + else: + recipient = ReportRecipients( + type=ReportRecipientType.EMAIL, + recipient_config_json=json.dumps({"target": email_target}), + ) + + if name is None: + name = "report_with_csv" if report_format else "report" + + report_schedule = insert_report_schedule( + report_type, name=name, - crontab=crontab, - timezone=timezone, + crontab="0 9 * * *", + description="Daily report", sql=sql, - description=description, chart=chart, dashboard=dashboard, database=database, + recipients=[recipient], owners=owners, validator_type=validator_type, validator_config_json=validator_config_json, - log_retention=log_retention, grace_period=grace_period, - recipients=recipients, - logs=logs, - last_state=last_state, - report_format=report_format, + report_format=report_format or ReportDataFormat.VISUALIZATION, extra=extra, force_screenshot=force_screenshot, ) - db.session.add(report_schedule) - db.session.commit() return report_schedule + + +def cleanup_report_schedule(report_schedule: ReportSchedule) -> None: + db.session.query(ReportExecutionLog).filter( + ReportExecutionLog.report_schedule == report_schedule + ).delete() + db.session.query(ReportRecipients).filter( + ReportRecipients.report_schedule == report_schedule + ).delete() + + db.session.delete(report_schedule) + db.session.commit() + + +@contextmanager +def create_dashboard_report(dashboard, extra, **kwargs): + report_schedule = create_report_notification( + email_target="target@example.com", + dashboard=dashboard, + extra={ + "dashboard": extra, + }, + **kwargs + ) + error = None + + try: + yield report_schedule + except Exception as ex: # pylint: disable=broad-except + error = ex + + # make sure to clean up in case of yield exceptions + cleanup_report_schedule(report_schedule) + + if error: + raise error diff --git a/tests/integration_tests/result_set_tests.py b/tests/integration_tests/result_set_tests.py index 626468fc5aae..18135c486dbe 100644 --- a/tests/integration_tests/result_set_tests.py +++ b/tests/integration_tests/result_set_tests.py @@ -169,13 +169,13 @@ def test_nested_types(self): "id": 4, "dict_arr": '[{"table_name": "unicode_test", "database_id": 1}]', "num_arr": "[1, 2, 3]", - "map_col": '{"chart_name": "scatter"}', + "map_col": "{'chart_name': 'scatter'}", }, { "id": 3, "dict_arr": '[{"table_name": "birth_names", "database_id": 1}]', "num_arr": "[4, 5, 6]", - "map_col": '{"chart_name": "plot"}', + "map_col": "{'chart_name': 'plot'}", }, ], ) diff --git a/tests/integration_tests/security/migrate_roles_tests.py b/tests/integration_tests/security/migrate_roles_tests.py index ad8d01691a59..a541f0095277 100644 --- a/tests/integration_tests/security/migrate_roles_tests.py +++ b/tests/integration_tests/security/migrate_roles_tests.py @@ -76,7 +76,7 @@ def create_old_role(pvm_map: PvmMigrationMapType, external_pvms): @pytest.mark.parametrize( - "descriptiom, new_pvms, pvm_map, external_pvms, deleted_views, deleted_permissions", + "description, new_pvms, pvm_map, external_pvms, deleted_views, deleted_permissions", [ ( "Many to one readonly", @@ -178,7 +178,7 @@ def create_old_role(pvm_map: PvmMigrationMapType, external_pvms): (), ), ( - "Many to one with with old permission that gets deleted", + "Many to one with old permission that gets deleted", { "NewDummy": ( "can_read", @@ -239,12 +239,12 @@ def create_old_role(pvm_map: PvmMigrationMapType, external_pvms): ], ) def test_migrate_role( - descriptiom, new_pvms, pvm_map, external_pvms, deleted_views, deleted_permissions + description, new_pvms, pvm_map, external_pvms, deleted_views, deleted_permissions ): """ Permission migration: generic tests """ - logger.info(descriptiom) + logger.info(description) with create_old_role(pvm_map, external_pvms) as old_role: role_name = old_role.name session = db.session diff --git a/tests/integration_tests/security/row_level_security_tests.py b/tests/integration_tests/security/row_level_security_tests.py index 1e46bfb996c5..ebd95cae39bd 100644 --- a/tests/integration_tests/security/row_level_security_tests.py +++ b/tests/integration_tests/security/row_level_security_tests.py @@ -25,7 +25,6 @@ from superset import db, security_manager from superset.connectors.sqla.models import RowLevelSecurityFilter, SqlaTable from superset.security.guest_token import ( - GuestTokenRlsRule, GuestTokenResourceType, GuestUser, ) @@ -82,6 +81,7 @@ def setUp(self): # Create regular RowLevelSecurityFilter (energy_usage, unicode_test) self.rls_entry1 = RowLevelSecurityFilter() + self.rls_entry1.name = "rls_entry1" self.rls_entry1.tables.extend( session.query(SqlaTable) .filter(SqlaTable.table_name.in_(["energy_usage", "unicode_test"])) @@ -96,6 +96,7 @@ def setUp(self): # Create regular RowLevelSecurityFilter (birth_names name starts with A or B) self.rls_entry2 = RowLevelSecurityFilter() + self.rls_entry2.name = "rls_entry2" self.rls_entry2.tables.extend( session.query(SqlaTable) .filter(SqlaTable.table_name.in_(["birth_names"])) @@ -109,6 +110,7 @@ def setUp(self): # Create Regular RowLevelSecurityFilter (birth_names name starts with Q) self.rls_entry3 = RowLevelSecurityFilter() + self.rls_entry3.name = "rls_entry3" self.rls_entry3.tables.extend( session.query(SqlaTable) .filter(SqlaTable.table_name.in_(["birth_names"])) @@ -122,6 +124,7 @@ def setUp(self): # Create Base RowLevelSecurityFilter (birth_names boys) self.rls_entry4 = RowLevelSecurityFilter() + self.rls_entry4.name = "rls_entry4" self.rls_entry4.tables.extend( session.query(SqlaTable) .filter(SqlaTable.table_name.in_(["birth_names"])) @@ -146,6 +149,94 @@ def tearDown(self): session.delete(self.get_user("NoRlsRoleUser")) session.commit() + @pytest.fixture() + def create_dataset(self): + with self.create_app().app_context(): + + dataset = SqlaTable(database_id=1, schema=None, table_name="table1") + db.session.add(dataset) + db.session.flush() + db.session.commit() + + yield dataset + + # rollback changes (assuming cascade delete) + db.session.delete(dataset) + db.session.commit() + + def _get_test_dataset(self): + return ( + db.session.query(SqlaTable).filter(SqlaTable.table_name == "table1") + ).one_or_none() + + @pytest.mark.usefixtures("create_dataset") + def test_model_view_rls_add_success(self): + self.login(username="admin") + test_dataset = self._get_test_dataset() + rv = self.client.post( + "/rowlevelsecurityfiltersmodelview/add", + data=dict( + name="rls1", + description="Some description", + filter_type="Regular", + tables=[test_dataset.id], + roles=[security_manager.find_role("Alpha").id], + group_key="group_key_1", + clause="client_id=1", + ), + follow_redirects=True, + ) + self.assertEqual(rv.status_code, 200) + rls1 = ( + db.session.query(RowLevelSecurityFilter).filter_by(name="rls1") + ).one_or_none() + assert rls1 is not None + + # Revert data changes + db.session.delete(rls1) + db.session.commit() + + @pytest.mark.usefixtures("create_dataset") + def test_model_view_rls_add_name_unique(self): + self.login(username="admin") + test_dataset = self._get_test_dataset() + rv = self.client.post( + "/rowlevelsecurityfiltersmodelview/add", + data=dict( + name="rls_entry1", + description="Some description", + filter_type="Regular", + tables=[test_dataset.id], + roles=[security_manager.find_role("Alpha").id], + group_key="group_key_1", + clause="client_id=1", + ), + follow_redirects=True, + ) + self.assertEqual(rv.status_code, 200) + data = rv.data.decode("utf-8") + assert "Already exists." in data + + @pytest.mark.usefixtures("create_dataset") + def test_model_view_rls_add_tables_required(self): + self.login(username="admin") + rv = self.client.post( + "/rowlevelsecurityfiltersmodelview/add", + data=dict( + name="rls1", + description="Some description", + filter_type="Regular", + tables=[], + roles=[security_manager.find_role("Alpha").id], + group_key="group_key_1", + clause="client_id=1", + ), + follow_redirects=True, + ) + self.assertEqual(rv.status_code, 200) + data = rv.data.decode("utf-8") + assert "This field is required." in data + @pytest.mark.usefixtures("load_energy_table_with_slice") def test_rls_filter_alters_energy_query(self): g.user = self.get_user(username="alpha") diff --git a/tests/integration_tests/security_tests.py b/tests/integration_tests/security_tests.py index 9de83f665a9f..6ee6bc6524c5 100644 --- a/tests/integration_tests/security_tests.py +++ b/tests/integration_tests/security_tests.py @@ -20,7 +20,7 @@ import unittest from collections import namedtuple from unittest import mock -from unittest.mock import Mock, patch +from unittest.mock import Mock, patch, call, ANY from typing import Any import jwt @@ -28,10 +28,10 @@ import pytest from flask import current_app - +from flask_appbuilder.security.sqla.models import Role +from superset.datasource.dao import DatasourceDAO from superset.models.dashboard import Dashboard - -from superset import app, appbuilder, db, security_manager, viz, ConnectorRegistry +from superset import app, appbuilder, db, security_manager, viz from superset.connectors.sqla.models import SqlaTable from superset.errors import ErrorLevel, SupersetError, SupersetErrorType from superset.exceptions import SupersetSecurityException @@ -155,12 +155,92 @@ def tearDown(self): session.delete(security_manager.find_role(SCHEMA_ACCESS_ROLE)) session.commit() - def test_set_perm_sqla_table(self): + def test_after_insert_dataset(self): + security_manager.on_view_menu_after_insert = Mock() + security_manager.on_permission_view_after_insert = Mock() + + session = db.session + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + + table = SqlaTable( + schema="tmp_schema", + table_name="tmp_perm_table", + database=tmp_db1, + ) + session.add(table) + session.commit() + + table = session.query(SqlaTable).filter_by(table_name="tmp_perm_table").one() + self.assertEqual(table.perm, f"[tmp_db1].[tmp_perm_table](id:{table.id})") + + pvm_dataset = security_manager.find_permission_view_menu( + "datasource_access", table.perm + ) + pvm_schema = security_manager.find_permission_view_menu( + "schema_access", table.schema_perm + ) + + # Assert dataset permission is created and local perms are ok + self.assertIsNotNone(pvm_dataset) + self.assertEqual(table.perm, f"[tmp_db1].[tmp_perm_table](id:{table.id})") + self.assertEqual(table.schema_perm, "[tmp_db1].[tmp_schema]") + self.assertIsNotNone(pvm_schema) + + # assert on permission hooks + call_args = security_manager.on_permission_view_after_insert.call_args + assert call_args.args[2].id == pvm_schema.id + + security_manager.on_permission_view_after_insert.assert_has_calls( + [ + call(ANY, ANY, ANY), + call(ANY, ANY, ANY), + ] + ) + + # Cleanup + session.delete(table) + session.delete(tmp_db1) + session.commit() + + def test_after_insert_dataset_rollback(self): + session = db.session + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + session.commit() + + table = SqlaTable( + schema="tmp_schema", + table_name="tmp_table", + database=tmp_db1, + ) + session.add(table) + session.flush() + + pvm_dataset = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db1].[tmp_table](id:{table.id})" + ) + self.assertIsNotNone(pvm_dataset) + table_id = table.id + session.rollback() + + table = session.query(SqlaTable).filter_by(table_name="tmp_table").one_or_none() + self.assertIsNone(table) + pvm_dataset = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db1].[tmp_table](id:{table_id})" + ) + self.assertIsNone(pvm_dataset) + + session.delete(tmp_db1) + session.commit() + + def test_after_insert_dataset_table_none(self): session = db.session table = SqlaTable( schema="tmp_schema", table_name="tmp_perm_table", - database=get_example_database(), + # Setting database_id instead of database will skip permission creation + database_id=get_example_database().id, ) session.add(table) session.commit() @@ -168,168 +248,854 @@ def test_set_perm_sqla_table(self): stored_table = ( session.query(SqlaTable).filter_by(table_name="tmp_perm_table").one() ) - self.assertEqual( - stored_table.perm, f"[examples].[tmp_perm_table](id:{stored_table.id})" - ) + # Assert permission is created self.assertIsNotNone( security_manager.find_permission_view_menu( "datasource_access", stored_table.perm ) ) - self.assertEqual(stored_table.schema_perm, "[examples].[tmp_schema]") - self.assertIsNotNone( + # Assert no bogus permission is created + self.assertIsNone( security_manager.find_permission_view_menu( - "schema_access", stored_table.schema_perm + "datasource_access", f"[None].[tmp_perm_table](id:{stored_table.id})" ) ) - # table name change - stored_table.table_name = "tmp_perm_table_v2" + # Cleanup + session.delete(table) session.commit() - stored_table = ( - session.query(SqlaTable).filter_by(table_name="tmp_perm_table_v2").one() + + def test_after_insert_database(self): + security_manager.on_permission_view_after_insert = Mock() + + session = db.session + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + + tmp_db1 = session.query(Database).filter_by(database_name="tmp_db1").one() + self.assertEqual(tmp_db1.perm, f"[tmp_db1].(id:{tmp_db1.id})") + tmp_db1_pvm = security_manager.find_permission_view_menu( + "database_access", tmp_db1.perm ) - self.assertEqual( - stored_table.perm, f"[examples].[tmp_perm_table_v2](id:{stored_table.id})" + self.assertIsNotNone(tmp_db1_pvm) + + # Assert the hook is called + security_manager.on_permission_view_after_insert.assert_has_calls( + [ + call(ANY, ANY, ANY), + ] + ) + call_args = security_manager.on_permission_view_after_insert.call_args + assert call_args.args[2].id == tmp_db1_pvm.id + session.delete(tmp_db1) + session.commit() + + def test_after_insert_database_rollback(self): + session = db.session + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + session.flush() + + pvm_database = security_manager.find_permission_view_menu( + "database_access", f"[tmp_db1].(id:{tmp_db1.id})" + ) + self.assertIsNotNone(pvm_database) + session.rollback() + + pvm_database = security_manager.find_permission_view_menu( + "database_access", f"[tmp_db1](id:{tmp_db1.id})" ) + self.assertIsNone(pvm_database) + + def test_after_update_database__perm_database_access(self): + security_manager.on_view_menu_after_update = Mock() + + session = db.session + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + session.commit() + tmp_db1 = session.query(Database).filter_by(database_name="tmp_db1").one() + self.assertIsNotNone( + security_manager.find_permission_view_menu("database_access", tmp_db1.perm) + ) + + tmp_db1.database_name = "tmp_db2" + session.commit() + + # Assert that the old permission was updated + self.assertIsNone( security_manager.find_permission_view_menu( - "datasource_access", stored_table.perm + "database_access", f"[tmp_db1].(id:{tmp_db1.id})" ) ) - # no changes in schema - self.assertEqual(stored_table.schema_perm, "[examples].[tmp_schema]") + # Assert that the db permission was updated self.assertIsNotNone( security_manager.find_permission_view_menu( - "schema_access", stored_table.schema_perm + "database_access", f"[tmp_db2].(id:{tmp_db1.id})" ) ) - # schema name change - stored_table.schema = "tmp_schema_v2" - session.commit() - stored_table = ( - session.query(SqlaTable).filter_by(table_name="tmp_perm_table_v2").one() + # Assert the hook is called + tmp_db1_view_menu = security_manager.find_view_menu( + f"[tmp_db2].(id:{tmp_db1.id})" ) - self.assertEqual( - stored_table.perm, f"[examples].[tmp_perm_table_v2](id:{stored_table.id})" + security_manager.on_view_menu_after_update.assert_has_calls( + [ + call(ANY, ANY, tmp_db1_view_menu), + ] ) + + session.delete(tmp_db1) + session.commit() + + def test_after_update_database_rollback(self): + session = db.session + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + session.commit() + tmp_db1 = session.query(Database).filter_by(database_name="tmp_db1").one() + self.assertIsNotNone( + security_manager.find_permission_view_menu("database_access", tmp_db1.perm) + ) + + tmp_db1.database_name = "tmp_db2" + session.flush() + + # Assert that the old permission was updated + self.assertIsNone( security_manager.find_permission_view_menu( - "datasource_access", stored_table.perm + "database_access", f"[tmp_db1].(id:{tmp_db1.id})" ) ) - # no changes in schema - self.assertEqual(stored_table.schema_perm, "[examples].[tmp_schema_v2]") + # Assert that the db permission was updated self.assertIsNotNone( security_manager.find_permission_view_menu( - "schema_access", stored_table.schema_perm + "database_access", f"[tmp_db2].(id:{tmp_db1.id})" ) ) - # database change - new_db = Database(sqlalchemy_uri="sqlite://", database_name="tmp_db") - session.add(new_db) - stored_table.database = ( - session.query(Database).filter_by(database_name="tmp_db").one() - ) - session.commit() - stored_table = ( - session.query(SqlaTable).filter_by(table_name="tmp_perm_table_v2").one() - ) - self.assertEqual( - stored_table.perm, f"[tmp_db].[tmp_perm_table_v2](id:{stored_table.id})" - ) + session.rollback() self.assertIsNotNone( security_manager.find_permission_view_menu( - "datasource_access", stored_table.perm + "database_access", f"[tmp_db1].(id:{tmp_db1.id})" ) ) - # no changes in schema - self.assertEqual(stored_table.schema_perm, "[tmp_db].[tmp_schema_v2]") - self.assertIsNotNone( + # Assert that the db permission was updated + self.assertIsNone( security_manager.find_permission_view_menu( - "schema_access", stored_table.schema_perm + "database_access", f"[tmp_db2].(id:{tmp_db1.id})" ) ) - # no schema - stored_table.schema = None + session.delete(tmp_db1) session.commit() - stored_table = ( - session.query(SqlaTable).filter_by(table_name="tmp_perm_table_v2").one() + + def test_after_update_database__perm_database_access_exists(self): + security_manager.on_permission_view_after_delete = Mock() + + session = db.session + # Add a bogus existing permission before the change + + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + session.commit() + tmp_db1 = session.query(Database).filter_by(database_name="tmp_db1").one() + security_manager.add_permission_view_menu( + "database_access", f"[tmp_db2].(id:{tmp_db1.id})" ) - self.assertEqual( - stored_table.perm, f"[tmp_db].[tmp_perm_table_v2](id:{stored_table.id})" + + self.assertIsNotNone( + security_manager.find_permission_view_menu("database_access", tmp_db1.perm) ) + + tmp_db1.database_name = "tmp_db2" + session.commit() + + # Assert that the old permission was updated + self.assertIsNone( + security_manager.find_permission_view_menu( + "database_access", f"[tmp_db1].(id:{tmp_db1.id})" + ) + ) + # Assert that the db permission was updated self.assertIsNotNone( security_manager.find_permission_view_menu( - "datasource_access", stored_table.perm + "database_access", f"[tmp_db2].(id:{tmp_db1.id})" ) ) - self.assertIsNone(stored_table.schema_perm) - session.delete(new_db) - session.delete(stored_table) + security_manager.on_permission_view_after_delete.assert_has_calls( + [ + call(ANY, ANY, ANY), + ] + ) + + session.delete(tmp_db1) session.commit() - def test_set_perm_sqla_table_none(self): + def test_after_update_database__perm_datasource_access(self): + security_manager.on_view_menu_after_update = Mock() + session = db.session - table = SqlaTable( + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + session.commit() + + table1 = SqlaTable( schema="tmp_schema", - table_name="tmp_perm_table", - # Setting database_id instead of database will skip permission creation - database_id=get_example_database().id, + table_name="tmp_table1", + database=tmp_db1, ) - session.add(table) + session.add(table1) + table2 = SqlaTable( + schema="tmp_schema", + table_name="tmp_table2", + database=tmp_db1, + ) + session.add(table2) + session.commit() + slice1 = Slice( + datasource_id=table1.id, + datasource_type=DatasourceType.TABLE, + datasource_name="tmp_table1", + slice_name="tmp_slice1", + ) + session.add(slice1) session.commit() + slice1 = session.query(Slice).filter_by(slice_name="tmp_slice1").one() + table1 = session.query(SqlaTable).filter_by(table_name="tmp_table1").one() + table2 = session.query(SqlaTable).filter_by(table_name="tmp_table2").one() - stored_table = ( - session.query(SqlaTable).filter_by(table_name="tmp_perm_table").one() + # assert initial perms + self.assertIsNotNone( + security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db1].[tmp_table1](id:{table1.id})" + ) ) - # Assert no permission is created + self.assertIsNotNone( + security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db1].[tmp_table2](id:{table2.id})" + ) + ) + self.assertEqual(slice1.perm, f"[tmp_db1].[tmp_table1](id:{table1.id})") + self.assertEqual(table1.perm, f"[tmp_db1].[tmp_table1](id:{table1.id})") + self.assertEqual(table2.perm, f"[tmp_db1].[tmp_table2](id:{table2.id})") + + # Refresh and update the database name + tmp_db1 = session.query(Database).filter_by(database_name="tmp_db1").one() + tmp_db1.database_name = "tmp_db2" + session.commit() + + # Assert that the old permissions were updated self.assertIsNone( security_manager.find_permission_view_menu( - "datasource_access", stored_table.perm + "datasource_access", f"[tmp_db1].[tmp_table1](id:{table1.id})" ) ) - # Assert no bogus permission is created self.assertIsNone( security_manager.find_permission_view_menu( - "datasource_access", f"[None].[tmp_perm_table](id:{stored_table.id})" + "datasource_access", f"[tmp_db1].[tmp_table2](id:{table2.id})" ) ) - session.delete(table) + + # Assert that the db permission was updated + self.assertIsNotNone( + security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db2].[tmp_table1](id:{table1.id})" + ) + ) + self.assertIsNotNone( + security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db2].[tmp_table2](id:{table2.id})" + ) + ) + self.assertEqual(slice1.perm, f"[tmp_db2].[tmp_table1](id:{table1.id})") + self.assertEqual(table1.perm, f"[tmp_db2].[tmp_table1](id:{table1.id})") + self.assertEqual(table2.perm, f"[tmp_db2].[tmp_table2](id:{table2.id})") + + # Assert hooks are called + tmp_db1_view_menu = security_manager.find_view_menu( + f"[tmp_db2].(id:{tmp_db1.id})" + ) + table1_view_menu = security_manager.find_view_menu( + f"[tmp_db2].[tmp_table1](id:{table1.id})" + ) + table2_view_menu = security_manager.find_view_menu( + f"[tmp_db2].[tmp_table2](id:{table2.id})" + ) + security_manager.on_view_menu_after_update.assert_has_calls( + [ + call(ANY, ANY, tmp_db1_view_menu), + call(ANY, ANY, table1_view_menu), + call(ANY, ANY, table2_view_menu), + ] + ) + + session.delete(slice1) + session.delete(table1) + session.delete(table2) + session.delete(tmp_db1) session.commit() - def test_set_perm_database(self): + def test_after_delete_database(self): session = db.session - database = Database(database_name="tmp_database", sqlalchemy_uri="sqlite://") - session.add(database) + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + session.commit() + tmp_db1 = session.query(Database).filter_by(database_name="tmp_db1").one() - stored_db = ( - session.query(Database).filter_by(database_name="tmp_database").one() + database_pvm = security_manager.find_permission_view_menu( + "database_access", tmp_db1.perm ) - self.assertEqual(stored_db.perm, f"[tmp_database].(id:{stored_db.id})") - self.assertIsNotNone( + self.assertIsNotNone(database_pvm) + role1 = Role(name="tmp_role1") + role1.permissions.append(database_pvm) + session.add(role1) + session.commit() + + session.delete(tmp_db1) + session.commit() + + # Assert that PVM is removed from Role + role1 = security_manager.find_role("tmp_role1") + self.assertEqual(role1.permissions, []) + + # Assert that the old permission was updated + self.assertIsNone( security_manager.find_permission_view_menu( - "database_access", stored_db.perm + "database_access", f"[tmp_db1].(id:{tmp_db1.id})" ) ) - stored_db.database_name = "tmp_database2" + # Cleanup + session.delete(role1) + session.commit() + + def test_after_delete_database_rollback(self): + session = db.session + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) session.commit() - stored_db = ( - session.query(Database).filter_by(database_name="tmp_database2").one() + tmp_db1 = session.query(Database).filter_by(database_name="tmp_db1").one() + + database_pvm = security_manager.find_permission_view_menu( + "database_access", tmp_db1.perm ) - self.assertEqual(stored_db.perm, f"[tmp_database2].(id:{stored_db.id})") - self.assertIsNotNone( + self.assertIsNotNone(database_pvm) + role1 = Role(name="tmp_role1") + role1.permissions.append(database_pvm) + session.add(role1) + session.commit() + + session.delete(tmp_db1) + session.flush() + + role1 = security_manager.find_role("tmp_role1") + self.assertEqual(role1.permissions, []) + + self.assertIsNone( security_manager.find_permission_view_menu( - "database_access", stored_db.perm + "database_access", f"[tmp_db1].(id:{tmp_db1.id})" ) ) - session.delete(stored_db) + session.rollback() + + # Test a rollback reverts everything + database_pvm = security_manager.find_permission_view_menu( + "database_access", f"[tmp_db1].(id:{tmp_db1.id})" + ) + + role1 = security_manager.find_role("tmp_role1") + self.assertEqual(role1.permissions, [database_pvm]) + + # Cleanup + session.delete(role1) + session.delete(tmp_db1) + session.commit() + + def test_after_delete_dataset(self): + security_manager.on_permission_view_after_delete = Mock() + + session = db.session + tmp_db = Database(database_name="tmp_db", sqlalchemy_uri="sqlite://") + session.add(tmp_db) + session.commit() + + table1 = SqlaTable( + schema="tmp_schema", + table_name="tmp_table1", + database=tmp_db, + ) + session.add(table1) + session.commit() + + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db].[tmp_table1](id:{table1.id})" + ) + self.assertIsNotNone(table1_pvm) + + role1 = Role(name="tmp_role1") + role1.permissions.append(table1_pvm) + session.add(role1) + session.commit() + + # refresh + table1 = session.query(SqlaTable).filter_by(table_name="tmp_table1").one() + + # Test delete + session.delete(table1) + session.commit() + + role1 = security_manager.find_role("tmp_role1") + self.assertEqual(role1.permissions, []) + + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db].[tmp_table1](id:{table1.id})" + ) + self.assertIsNone(table1_pvm) + table1_view_menu = security_manager.find_view_menu( + f"[tmp_db].[tmp_table1](id:{table1.id})" + ) + self.assertIsNone(table1_view_menu) + + # Assert the hook is called + security_manager.on_permission_view_after_delete.assert_has_calls( + [ + call(ANY, ANY, ANY), + ] + ) + + # cleanup + session.delete(role1) + session.delete(tmp_db) + session.commit() + + def test_after_delete_dataset_rollback(self): + session = db.session + tmp_db = Database(database_name="tmp_db", sqlalchemy_uri="sqlite://") + session.add(tmp_db) + session.commit() + + table1 = SqlaTable( + schema="tmp_schema", + table_name="tmp_table1", + database=tmp_db, + ) + session.add(table1) + session.commit() + + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db].[tmp_table1](id:{table1.id})" + ) + self.assertIsNotNone(table1_pvm) + + role1 = Role(name="tmp_role1") + role1.permissions.append(table1_pvm) + session.add(role1) + session.commit() + + # refresh + table1 = session.query(SqlaTable).filter_by(table_name="tmp_table1").one() + + # Test delete, permissions are correctly deleted + session.delete(table1) + session.flush() + + role1 = security_manager.find_role("tmp_role1") + self.assertEqual(role1.permissions, []) + + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db].[tmp_table1](id:{table1.id})" + ) + self.assertIsNone(table1_pvm) + + # Test rollback, permissions exist everything is correctly rollback + session.rollback() + role1 = security_manager.find_role("tmp_role1") + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db].[tmp_table1](id:{table1.id})" + ) + self.assertIsNotNone(table1_pvm) + self.assertEqual(role1.permissions, [table1_pvm]) + + # cleanup + session.delete(table1) + session.delete(role1) + session.delete(tmp_db) + session.commit() + + def test_after_update_dataset__name_changes(self): + security_manager.on_view_menu_after_update = Mock() + + session = db.session + tmp_db = Database(database_name="tmp_db", sqlalchemy_uri="sqlite://") + session.add(tmp_db) + session.commit() + + table1 = SqlaTable( + schema="tmp_schema", + table_name="tmp_table1", + database=tmp_db, + ) + session.add(table1) + session.commit() + + slice1 = Slice( + datasource_id=table1.id, + datasource_type=DatasourceType.TABLE, + datasource_name="tmp_table1", + slice_name="tmp_slice1", + ) + session.add(slice1) + session.commit() + + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db].[tmp_table1](id:{table1.id})" + ) + self.assertIsNotNone(table1_pvm) + + # refresh + table1 = session.query(SqlaTable).filter_by(table_name="tmp_table1").one() + # Test update + table1.table_name = "tmp_table1_changed" + session.commit() + + # Test old permission does not exist + old_table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db].[tmp_table1](id:{table1.id})" + ) + self.assertIsNone(old_table1_pvm) + + # Test new permission exist + new_table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db].[tmp_table1_changed](id:{table1.id})" + ) + self.assertIsNotNone(new_table1_pvm) + + # test dataset permission changed + changed_table1 = ( + session.query(SqlaTable).filter_by(table_name="tmp_table1_changed").one() + ) + self.assertEqual( + changed_table1.perm, f"[tmp_db].[tmp_table1_changed](id:{table1.id})" + ) + + # Test Chart permission changed + slice1 = session.query(Slice).filter_by(slice_name="tmp_slice1").one() + self.assertEqual(slice1.perm, f"[tmp_db].[tmp_table1_changed](id:{table1.id})") + + # Assert hook is called + view_menu_dataset = security_manager.find_view_menu( + f"[tmp_db].[tmp_table1_changed](id:{table1.id})" + ) + security_manager.on_view_menu_after_update.assert_has_calls( + [ + call(ANY, ANY, view_menu_dataset), + ] + ) + # cleanup + session.delete(slice1) + session.delete(table1) + session.delete(tmp_db) + session.commit() + + def test_after_update_dataset_rollback(self): + session = db.session + tmp_db = Database(database_name="tmp_db", sqlalchemy_uri="sqlite://") + session.add(tmp_db) + session.commit() + + table1 = SqlaTable( + schema="tmp_schema", + table_name="tmp_table1", + database=tmp_db, + ) + session.add(table1) + session.commit() + + slice1 = Slice( + datasource_id=table1.id, + datasource_type=DatasourceType.TABLE, + datasource_name="tmp_table1", + slice_name="tmp_slice1", + ) + session.add(slice1) + session.commit() + + # refresh + table1 = session.query(SqlaTable).filter_by(table_name="tmp_table1").one() + # Test update + table1.table_name = "tmp_table1_changed" + session.flush() + + # Test old permission does not exist + old_table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db].[tmp_table1](id:{table1.id})" + ) + self.assertIsNone(old_table1_pvm) + + # Test new permission exist + new_table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db].[tmp_table1_changed](id:{table1.id})" + ) + self.assertIsNotNone(new_table1_pvm) + + # Test rollback + session.rollback() + + old_table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db].[tmp_table1](id:{table1.id})" + ) + self.assertIsNotNone(old_table1_pvm) + + # cleanup + session.delete(slice1) + session.delete(table1) + session.delete(tmp_db) + session.commit() + + def test_after_update_dataset__db_changes(self): + session = db.session + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + tmp_db2 = Database(database_name="tmp_db2", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + session.add(tmp_db2) + session.commit() + + table1 = SqlaTable( + schema="tmp_schema", + table_name="tmp_table1", + database=tmp_db1, + ) + session.add(table1) + session.commit() + + slice1 = Slice( + datasource_id=table1.id, + datasource_type=DatasourceType.TABLE, + datasource_name="tmp_table1", + slice_name="tmp_slice1", + ) + session.add(slice1) + session.commit() + + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db1].[tmp_table1](id:{table1.id})" + ) + self.assertIsNotNone(table1_pvm) + + # refresh + table1 = session.query(SqlaTable).filter_by(table_name="tmp_table1").one() + # Test update + table1.database = tmp_db2 + session.commit() + + # Test old permission does not exist + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db1].[tmp_table1](id:{table1.id})" + ) + self.assertIsNone(table1_pvm) + + # Test new permission exist + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db2].[tmp_table1](id:{table1.id})" + ) + self.assertIsNotNone(table1_pvm) + + # test dataset permission and schema permission changed + changed_table1 = ( + session.query(SqlaTable).filter_by(table_name="tmp_table1").one() + ) + self.assertEqual(changed_table1.perm, f"[tmp_db2].[tmp_table1](id:{table1.id})") + self.assertEqual(changed_table1.schema_perm, f"[tmp_db2].[tmp_schema]") + + # Test Chart permission changed + slice1 = session.query(Slice).filter_by(slice_name="tmp_slice1").one() + self.assertEqual(slice1.perm, f"[tmp_db2].[tmp_table1](id:{table1.id})") + self.assertEqual(slice1.schema_perm, f"[tmp_db2].[tmp_schema]") + + # cleanup + session.delete(slice1) + session.delete(table1) + session.delete(tmp_db1) + session.delete(tmp_db2) + session.commit() + + def test_after_update_dataset__schema_changes(self): + session = db.session + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + session.commit() + + table1 = SqlaTable( + schema="tmp_schema", + table_name="tmp_table1", + database=tmp_db1, + ) + session.add(table1) + session.commit() + + slice1 = Slice( + datasource_id=table1.id, + datasource_type=DatasourceType.TABLE, + datasource_name="tmp_table1", + slice_name="tmp_slice1", + ) + session.add(slice1) + session.commit() + + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db1].[tmp_table1](id:{table1.id})" + ) + self.assertIsNotNone(table1_pvm) + + # refresh + table1 = session.query(SqlaTable).filter_by(table_name="tmp_table1").one() + # Test update + table1.schema = "tmp_schema_changed" + session.commit() + + # Test permission still exists + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db1].[tmp_table1](id:{table1.id})" + ) + self.assertIsNotNone(table1_pvm) + + # test dataset schema permission changed + changed_table1 = ( + session.query(SqlaTable).filter_by(table_name="tmp_table1").one() + ) + self.assertEqual(changed_table1.perm, f"[tmp_db1].[tmp_table1](id:{table1.id})") + self.assertEqual(changed_table1.schema_perm, f"[tmp_db1].[tmp_schema_changed]") + + # Test Chart schema permission changed + slice1 = session.query(Slice).filter_by(slice_name="tmp_slice1").one() + self.assertEqual(slice1.perm, f"[tmp_db1].[tmp_table1](id:{table1.id})") + self.assertEqual(slice1.schema_perm, f"[tmp_db1].[tmp_schema_changed]") + + # cleanup + session.delete(slice1) + session.delete(table1) + session.delete(tmp_db1) + session.commit() + + def test_after_update_dataset__schema_none(self): + session = db.session + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + session.commit() + + table1 = SqlaTable( + schema="tmp_schema", + table_name="tmp_table1", + database=tmp_db1, + ) + session.add(table1) + session.commit() + + slice1 = Slice( + datasource_id=table1.id, + datasource_type=DatasourceType.TABLE, + datasource_name="tmp_table1", + slice_name="tmp_slice1", + ) + session.add(slice1) + session.commit() + + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db1].[tmp_table1](id:{table1.id})" + ) + self.assertIsNotNone(table1_pvm) + + # refresh + table1 = session.query(SqlaTable).filter_by(table_name="tmp_table1").one() + # Test update + table1.schema = None + session.commit() + + # refresh + table1 = session.query(SqlaTable).filter_by(table_name="tmp_table1").one() + + self.assertEqual(table1.perm, f"[tmp_db1].[tmp_table1](id:{table1.id})") + self.assertIsNone(table1.schema_perm) + + # cleanup + session.delete(slice1) + session.delete(table1) + session.delete(tmp_db1) + session.commit() + + def test_after_update_dataset__name_db_changes(self): + session = db.session + tmp_db1 = Database(database_name="tmp_db1", sqlalchemy_uri="sqlite://") + tmp_db2 = Database(database_name="tmp_db2", sqlalchemy_uri="sqlite://") + session.add(tmp_db1) + session.add(tmp_db2) + session.commit() + + table1 = SqlaTable( + schema="tmp_schema", + table_name="tmp_table1", + database=tmp_db1, + ) + session.add(table1) + session.commit() + + slice1 = Slice( + datasource_id=table1.id, + datasource_type=DatasourceType.TABLE, + datasource_name="tmp_table1", + slice_name="tmp_slice1", + ) + session.add(slice1) + session.commit() + + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db1].[tmp_table1](id:{table1.id})" + ) + self.assertIsNotNone(table1_pvm) + + # refresh + table1 = session.query(SqlaTable).filter_by(table_name="tmp_table1").one() + # Test update + table1.table_name = "tmp_table1_changed" + table1.database = tmp_db2 + session.commit() + + # Test old permission does not exist + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db1].[tmp_table1](id:{table1.id})" + ) + self.assertIsNone(table1_pvm) + + # Test new permission exist + table1_pvm = security_manager.find_permission_view_menu( + "datasource_access", f"[tmp_db2].[tmp_table1_changed](id:{table1.id})" + ) + self.assertIsNotNone(table1_pvm) + + # test dataset permission and schema permission changed + changed_table1 = ( + session.query(SqlaTable).filter_by(table_name="tmp_table1_changed").one() + ) + self.assertEqual( + changed_table1.perm, f"[tmp_db2].[tmp_table1_changed](id:{table1.id})" + ) + self.assertEqual(changed_table1.schema_perm, f"[tmp_db2].[tmp_schema]") + + # Test Chart permission changed + slice1 = session.query(Slice).filter_by(slice_name="tmp_slice1").one() + self.assertEqual(slice1.perm, f"[tmp_db2].[tmp_table1_changed](id:{table1.id})") + self.assertEqual(slice1.schema_perm, f"[tmp_db2].[tmp_schema]") + + # cleanup + session.delete(slice1) + session.delete(table1) + session.delete(tmp_db1) + session.delete(tmp_db2) session.commit() def test_hybrid_perm_database(self): @@ -382,23 +1148,14 @@ def test_set_perm_slice(self): table.schema = "tmp_perm_schema" table.table_name = "tmp_perm_table_v2" session.commit() - # TODO(bogdan): modify slice permissions on the table update. - self.assertNotEqual(slice.perm, table.perm) - self.assertEqual(slice.perm, f"[tmp_database].[tmp_perm_table](id:{table.id})") - self.assertEqual( - table.perm, f"[tmp_database].[tmp_perm_table_v2](id:{table.id})" - ) - # TODO(bogdan): modify slice schema permissions on the table update. - self.assertNotEqual(slice.schema_perm, table.schema_perm) - self.assertIsNone(slice.schema_perm) - - # updating slice refreshes the permissions - slice.slice_name = "slice_name_v2" - session.commit() + table = session.query(SqlaTable).filter_by(table_name="tmp_perm_table_v2").one() self.assertEqual(slice.perm, table.perm) self.assertEqual( slice.perm, f"[tmp_database].[tmp_perm_table_v2](id:{table.id})" ) + self.assertEqual( + table.perm, f"[tmp_database].[tmp_perm_table_v2](id:{table.id})" + ) self.assertEqual(slice.schema_perm, table.schema_perm) self.assertEqual(slice.schema_perm, "[tmp_database].[tmp_perm_schema]") @@ -408,11 +1165,10 @@ def test_set_perm_slice(self): session.commit() - # TODO test slice permission - + @patch("superset.utils.core.g") @patch("superset.security.manager.g") - def test_schemas_accessible_by_user_admin(self, mock_g): - mock_g.user = security_manager.find_user("admin") + def test_schemas_accessible_by_user_admin(self, mock_sm_g, mock_g): + mock_g.user = mock_sm_g.user = security_manager.find_user("admin") with self.client.application.test_request_context(): database = get_example_database() schemas = security_manager.get_schemas_accessible_by_user( @@ -420,11 +1176,12 @@ def test_schemas_accessible_by_user_admin(self, mock_g): ) self.assertEqual(schemas, ["1", "2", "3"]) # no changes + @patch("superset.utils.core.g") @patch("superset.security.manager.g") - def test_schemas_accessible_by_user_schema_access(self, mock_g): + def test_schemas_accessible_by_user_schema_access(self, mock_sm_g, mock_g): # User has schema access to the schema 1 create_schema_perm("[examples].[1]") - mock_g.user = security_manager.find_user("gamma") + mock_g.user = mock_sm_g.user = security_manager.find_user("gamma") with self.client.application.test_request_context(): database = get_example_database() schemas = security_manager.get_schemas_accessible_by_user( @@ -434,10 +1191,11 @@ def test_schemas_accessible_by_user_schema_access(self, mock_g): self.assertEqual(schemas, ["1"]) delete_schema_perm("[examples].[1]") + @patch("superset.utils.core.g") @patch("superset.security.manager.g") - def test_schemas_accessible_by_user_datasource_access(self, mock_g): + def test_schemas_accessible_by_user_datasource_access(self, mock_sm_g, mock_g): # User has schema access to the datasource temp_schema.wb_health_population in examples DB. - mock_g.user = security_manager.find_user("gamma") + mock_g.user = mock_sm_g.user = security_manager.find_user("gamma") with self.client.application.test_request_context(): database = get_example_database() schemas = security_manager.get_schemas_accessible_by_user( @@ -445,11 +1203,14 @@ def test_schemas_accessible_by_user_datasource_access(self, mock_g): ) self.assertEqual(schemas, ["temp_schema"]) + @patch("superset.utils.core.g") @patch("superset.security.manager.g") - def test_schemas_accessible_by_user_datasource_and_schema_access(self, mock_g): + def test_schemas_accessible_by_user_datasource_and_schema_access( + self, mock_sm_g, mock_g + ): # User has schema access to the datasource temp_schema.wb_health_population in examples DB. create_schema_perm("[examples].[2]") - mock_g.user = security_manager.find_user("gamma") + mock_g.user = mock_sm_g.user = security_manager.find_user("gamma") with self.client.application.test_request_context(): database = get_example_database() schemas = security_manager.get_schemas_accessible_by_user( @@ -567,13 +1328,26 @@ def assert_can_all(self, view_menu, permissions_set): def assert_can_menu(self, view_menu, permissions_set): self.assertIn(("menu_access", view_menu), permissions_set) + def assert_cannot_menu(self, view_menu, permissions_set): + self.assertNotIn(("menu_access", view_menu), permissions_set) + + def assert_cannot_gamma(self, perm_set): + self.assert_cannot_write("CssTemplate", perm_set) + self.assert_cannot_menu("CSS Templates", perm_set) + self.assert_cannot_menu("Manage", perm_set) + self.assert_cannot_menu("Queries", perm_set) + self.assert_cannot_menu("Import dashboards", perm_set) + self.assert_cannot_menu("Upload a CSV", perm_set) + self.assert_cannot_menu("ReportSchedule", perm_set) + self.assert_cannot_menu("Alerts & Report", perm_set) + def assert_can_gamma(self, perm_set): + self.assert_can_read("CssTemplate", perm_set) self.assert_can_read("Dataset", perm_set) # make sure that user can create slices and dashboards self.assert_can_all("Dashboard", perm_set) self.assert_can_all("Chart", perm_set) - self.assertIn(("can_add_slices", "Superset"), perm_set) self.assertIn(("can_copy_dash", "Superset"), perm_set) self.assertIn(("can_created_dashboards", "Superset"), perm_set) @@ -716,6 +1490,7 @@ def test_is_gamma_pvm(self): def test_gamma_permissions_basic(self): self.assert_can_gamma(get_perm_tuples("Gamma")) self.assert_cannot_alpha(get_perm_tuples("Gamma")) + self.assert_cannot_gamma(get_perm_tuples("Gamma")) @pytest.mark.usefixtures("public_role_like_gamma") def test_public_permissions_basic(self): @@ -876,9 +1651,9 @@ def test_can_access_table(self, mock_raise_for_access): self.assertFalse(security_manager.can_access_table(database, table)) + @patch("superset.security.SupersetSecurityManager.is_owner") @patch("superset.security.SupersetSecurityManager.can_access") @patch("superset.security.SupersetSecurityManager.can_access_schema") - @patch("superset.views.utils.is_owner") def test_raise_for_access_datasource( self, mock_can_access_schema, mock_can_access, mock_is_owner ): @@ -894,8 +1669,8 @@ def test_raise_for_access_datasource( with self.assertRaises(SupersetSecurityException): security_manager.raise_for_access(datasource=datasource) + @patch("superset.security.SupersetSecurityManager.is_owner") @patch("superset.security.SupersetSecurityManager.can_access") - @patch("superset.views.utils.is_owner") def test_raise_for_access_query(self, mock_can_access, mock_is_owner): query = Mock( database=get_example_database(), schema="bar", sql="SELECT * FROM foo" @@ -910,10 +1685,11 @@ def test_raise_for_access_query(self, mock_can_access, mock_is_owner): with self.assertRaises(SupersetSecurityException): security_manager.raise_for_access(query=query) + @patch("superset.security.SupersetSecurityManager.is_owner") @patch("superset.security.SupersetSecurityManager.can_access") @patch("superset.security.SupersetSecurityManager.can_access_schema") def test_raise_for_access_query_context( - self, mock_can_access_schema, mock_can_access + self, mock_can_access_schema, mock_can_access, mock_is_owner ): query_context = Mock(datasource=self.get_datasource_mock()) @@ -922,6 +1698,7 @@ def test_raise_for_access_query_context( mock_can_access.return_value = False mock_can_access_schema.return_value = False + mock_is_owner.return_value = False with self.assertRaises(SupersetSecurityException): security_manager.raise_for_access(query_context=query_context) @@ -939,9 +1716,12 @@ def test_raise_for_access_table(self, mock_can_access): with self.assertRaises(SupersetSecurityException): security_manager.raise_for_access(database=database, table=table) + @patch("superset.security.SupersetSecurityManager.is_owner") @patch("superset.security.SupersetSecurityManager.can_access") @patch("superset.security.SupersetSecurityManager.can_access_schema") - def test_raise_for_access_viz(self, mock_can_access_schema, mock_can_access): + def test_raise_for_access_viz( + self, mock_can_access_schema, mock_can_access, mock_is_owner + ): test_viz = viz.TableViz(self.get_datasource_mock(), form_data={}) mock_can_access_schema.return_value = True @@ -949,6 +1729,7 @@ def test_raise_for_access_viz(self, mock_can_access_schema, mock_can_access): mock_can_access.return_value = False mock_can_access_schema.return_value = False + mock_is_owner.return_value = False with self.assertRaises(SupersetSecurityException): security_manager.raise_for_access(viz=test_viz) @@ -996,7 +1777,7 @@ def test_get_user_datasources_admin( mock_get_session.query.return_value.filter.return_value.all.return_value = [] with mock.patch.object( - ConnectorRegistry, "get_all_datasources" + SqlaTable, "get_all_datasources" ) as mock_get_all_datasources: mock_get_all_datasources.return_value = [ Datasource("database1", "schema1", "table1"), @@ -1024,7 +1805,7 @@ def test_get_user_datasources_gamma( mock_get_session.query.return_value.filter.return_value.all.return_value = [] with mock.patch.object( - ConnectorRegistry, "get_all_datasources" + SqlaTable, "get_all_datasources" ) as mock_get_all_datasources: mock_get_all_datasources.return_value = [ Datasource("database1", "schema1", "table1"), @@ -1052,7 +1833,7 @@ def test_get_user_datasources_gamma_with_schema( ] with mock.patch.object( - ConnectorRegistry, "get_all_datasources" + SqlaTable, "get_all_datasources" ) as mock_get_all_datasources: mock_get_all_datasources.return_value = [ Datasource("database1", "schema1", "table1"), diff --git a/tests/integration_tests/sql_lab/__init__.py b/tests/integration_tests/sql_lab/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/integration_tests/sql_lab/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/integration_tests/sql_lab/api_tests.py b/tests/integration_tests/sql_lab/api_tests.py new file mode 100644 index 000000000000..93beb380f0db --- /dev/null +++ b/tests/integration_tests/sql_lab/api_tests.py @@ -0,0 +1,215 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# isort:skip_file +"""Unit tests for Superset""" +import datetime +import json +import random +import csv +import pandas as pd +import io + +import pytest +import prison +from sqlalchemy.sql import func +from unittest import mock + +from tests.integration_tests.test_app import app +from superset import db, sql_lab +from superset.common.db_query_status import QueryStatus +from superset.models.core import Database +from superset.utils.database import get_example_database, get_main_database +from superset.utils import core as utils +from superset.models.sql_lab import Query + +from tests.integration_tests.base_tests import SupersetTestCase + +QUERIES_FIXTURE_COUNT = 10 + + +class TestSqlLabApi(SupersetTestCase): + @mock.patch("superset.sqllab.commands.results.results_backend_use_msgpack", False) + def test_execute_required_params(self): + self.login() + client_id = "{}".format(random.getrandbits(64))[:10] + + data = {"client_id": client_id} + rv = self.client.post( + "/api/v1/sqllab/execute/", + json=data, + ) + failed_resp = { + "message": { + "sql": ["Missing data for required field."], + "database_id": ["Missing data for required field."], + } + } + resp_data = json.loads(rv.data.decode("utf-8")) + self.assertDictEqual(resp_data, failed_resp) + self.assertEqual(rv.status_code, 400) + + data = {"sql": "SELECT 1", "client_id": client_id} + rv = self.client.post( + "/api/v1/sqllab/execute/", + json=data, + ) + failed_resp = {"message": {"database_id": ["Missing data for required field."]}} + resp_data = json.loads(rv.data.decode("utf-8")) + self.assertDictEqual(resp_data, failed_resp) + self.assertEqual(rv.status_code, 400) + + data = {"database_id": 1, "client_id": client_id} + rv = self.client.post( + "/api/v1/sqllab/execute/", + json=data, + ) + failed_resp = {"message": {"sql": ["Missing data for required field."]}} + resp_data = json.loads(rv.data.decode("utf-8")) + self.assertDictEqual(resp_data, failed_resp) + self.assertEqual(rv.status_code, 400) + + @mock.patch("superset.sqllab.commands.results.results_backend_use_msgpack", False) + def test_execute_valid_request(self) -> None: + from superset import sql_lab as core + + core.results_backend = mock.Mock() + core.results_backend.get.return_value = {} + + self.login() + client_id = "{}".format(random.getrandbits(64))[:10] + + data = {"sql": "SELECT 1", "database_id": 1, "client_id": client_id} + rv = self.client.post( + "/api/v1/sqllab/execute/", + json=data, + ) + resp_data = json.loads(rv.data.decode("utf-8")) + self.assertEqual(resp_data.get("status"), "success") + self.assertEqual(rv.status_code, 200) + + @mock.patch( + "tests.integration_tests.superset_test_custom_template_processors.datetime" + ) + @mock.patch("superset.sqllab.api.get_sql_results") + def test_execute_custom_templated(self, sql_lab_mock, mock_dt) -> None: + mock_dt.utcnow = mock.Mock(return_value=datetime.datetime(1970, 1, 1)) + self.login() + sql = "SELECT '$DATE()' as test" + resp = { + "status": QueryStatus.SUCCESS, + "query": {"rows": 1}, + "data": [{"test": "'1970-01-01'"}], + } + sql_lab_mock.return_value = resp + + dbobj = self.create_fake_db_for_macros() + json_payload = dict(database_id=dbobj.id, sql=sql) + self.get_json_resp( + "/api/v1/sqllab/execute/", raise_on_error=False, json_=json_payload + ) + assert sql_lab_mock.called + self.assertEqual(sql_lab_mock.call_args[0][1], "SELECT '1970-01-01' as test") + + self.delete_fake_db_for_macros() + + @mock.patch("superset.sqllab.commands.results.results_backend_use_msgpack", False) + def test_get_results_with_display_limit(self): + from superset.sqllab.commands import results as command + + command.results_backend = mock.Mock() + self.login() + + data = [{"col_0": i} for i in range(100)] + payload = { + "status": QueryStatus.SUCCESS, + "query": {"rows": 100}, + "data": data, + } + # limit results to 1 + expected_key = {"status": "success", "query": {"rows": 100}, "data": data} + limited_data = data[:1] + expected_limited = { + "status": "success", + "query": {"rows": 100}, + "data": limited_data, + "displayLimitReached": True, + } + + query_mock = mock.Mock() + query_mock.sql = "SELECT *" + query_mock.database = 1 + query_mock.schema = "superset" + + # do not apply msgpack serialization + use_msgpack = app.config["RESULTS_BACKEND_USE_MSGPACK"] + app.config["RESULTS_BACKEND_USE_MSGPACK"] = False + serialized_payload = sql_lab._serialize_payload(payload, False) + compressed = utils.zlib_compress(serialized_payload) + command.results_backend.get.return_value = compressed + + with mock.patch("superset.sqllab.commands.results.db") as mock_superset_db: + mock_superset_db.session.query().filter_by().one_or_none.return_value = ( + query_mock + ) + # get all results + arguments = {"key": "key"} + result_key = json.loads( + self.get_resp(f"/api/v1/sqllab/results/?q={prison.dumps(arguments)}") + ) + arguments = {"key": "key", "rows": 1} + result_limited = json.loads( + self.get_resp(f"/api/v1/sqllab/results/?q={prison.dumps(arguments)}") + ) + + self.assertEqual(result_key, expected_key) + self.assertEqual(result_limited, expected_limited) + + app.config["RESULTS_BACKEND_USE_MSGPACK"] = use_msgpack + + @mock.patch("superset.models.sql_lab.Query.raise_for_access", lambda _: None) + @mock.patch("superset.models.core.Database.get_df") + def test_export_results(self, get_df_mock: mock.Mock) -> None: + self.login() + + database = get_example_database() + query_obj = Query( + client_id="test", + database=database, + tab_name="test_tab", + sql_editor_id="test_editor_id", + sql="select * from bar", + select_sql=None, + executed_sql="select * from bar limit 2", + limit=100, + select_as_cta=False, + rows=104, + error_message="none", + results_key="test_abc", + ) + + db.session.add(query_obj) + db.session.commit() + + get_df_mock.return_value = pd.DataFrame({"foo": [1, 2, 3]}) + + resp = self.get_resp("/api/v1/sqllab/export/test/") + data = csv.reader(io.StringIO(resp)) + expected_data = csv.reader(io.StringIO("foo\n1\n2")) + + self.assertEqual(list(expected_data), list(data)) + db.session.delete(query_obj) + db.session.commit() diff --git a/tests/integration_tests/sql_lab/commands_tests.py b/tests/integration_tests/sql_lab/commands_tests.py new file mode 100644 index 000000000000..cf0aebf001e0 --- /dev/null +++ b/tests/integration_tests/sql_lab/commands_tests.py @@ -0,0 +1,293 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from unittest import mock, skip +from unittest.mock import Mock, patch + +import pandas as pd +import pytest + +from superset import db, sql_lab +from superset.common.db_query_status import QueryStatus +from superset.errors import ErrorLevel, SupersetErrorType +from superset.exceptions import ( + SerializationError, + SupersetError, + SupersetErrorException, + SupersetSecurityException, +) +from superset.models.core import Database +from superset.models.sql_lab import Query +from superset.sqllab.commands import export, results +from superset.sqllab.limiting_factor import LimitingFactor +from superset.utils import core as utils +from superset.utils.database import get_example_database +from tests.integration_tests.base_tests import SupersetTestCase + + +class TestSqlResultExportCommand(SupersetTestCase): + @pytest.fixture() + def create_database_and_query(self): + with self.create_app().app_context(): + database = get_example_database() + query_obj = Query( + client_id="test", + database=database, + tab_name="test_tab", + sql_editor_id="test_editor_id", + sql="select * from bar", + select_sql="select * from bar", + executed_sql="select * from bar", + limit=100, + select_as_cta=False, + rows=104, + error_message="none", + results_key="abc_query", + ) + + db.session.add(query_obj) + db.session.commit() + + yield + + db.session.delete(query_obj) + db.session.commit() + + @pytest.mark.usefixtures("create_database_and_query") + def test_validation_query_not_found(self) -> None: + command = export.SqlResultExportCommand("asdf") + + with pytest.raises(SupersetErrorException) as ex_info: + command.run() + assert ex_info.value.error.error_type == SupersetErrorType.RESULTS_BACKEND_ERROR + + @pytest.mark.usefixtures("create_database_and_query") + def test_validation_invalid_access(self) -> None: + command = export.SqlResultExportCommand("test") + + with mock.patch( + "superset.security_manager.raise_for_access", + side_effect=SupersetSecurityException( + SupersetError( + "dummy", + SupersetErrorType.DATASOURCE_SECURITY_ACCESS_ERROR, + ErrorLevel.ERROR, + ) + ), + ): + with pytest.raises(SupersetErrorException) as ex_info: + command.run() + assert ( + ex_info.value.error.error_type + == SupersetErrorType.QUERY_SECURITY_ACCESS_ERROR + ) + + @pytest.mark.usefixtures("create_database_and_query") + @patch("superset.models.sql_lab.Query.raise_for_access", lambda _: None) + @patch("superset.models.core.Database.get_df") + def test_run_no_results_backend_select_sql(self, get_df_mock: Mock) -> None: + command = export.SqlResultExportCommand("test") + + get_df_mock.return_value = pd.DataFrame({"foo": [1, 2, 3]}) + result = command.run() + + assert result["data"] == "foo\n1\n2\n3\n" + assert result["count"] == 3 + assert result["query"].client_id == "test" + + @pytest.mark.usefixtures("create_database_and_query") + @patch("superset.models.sql_lab.Query.raise_for_access", lambda _: None) + @patch("superset.models.core.Database.get_df") + def test_run_no_results_backend_executed_sql(self, get_df_mock: Mock) -> None: + query_obj = db.session.query(Query).filter_by(client_id="test").one() + query_obj.executed_sql = "select * from bar limit 2" + query_obj.select_sql = None + db.session.commit() + + command = export.SqlResultExportCommand("test") + + get_df_mock.return_value = pd.DataFrame({"foo": [1, 2, 3]}) + result = command.run() + + assert result["data"] == "foo\n1\n2\n" + assert result["count"] == 2 + assert result["query"].client_id == "test" + + @pytest.mark.usefixtures("create_database_and_query") + @patch("superset.models.sql_lab.Query.raise_for_access", lambda _: None) + @patch("superset.models.core.Database.get_df") + def test_run_no_results_backend_executed_sql_limiting_factor( + self, get_df_mock: Mock + ) -> None: + query_obj = db.session.query(Query).filter_by(results_key="abc_query").one() + query_obj.executed_sql = "select * from bar limit 2" + query_obj.select_sql = None + query_obj.limiting_factor = LimitingFactor.DROPDOWN + db.session.commit() + + command = export.SqlResultExportCommand("test") + + get_df_mock.return_value = pd.DataFrame({"foo": [1, 2, 3]}) + + result = command.run() + + assert result["data"] == "foo\n1\n" + assert result["count"] == 1 + assert result["query"].client_id == "test" + + @pytest.mark.usefixtures("create_database_and_query") + @patch("superset.models.sql_lab.Query.raise_for_access", lambda _: None) + @patch("superset.sqllab.commands.export.results_backend_use_msgpack", False) + def test_run_with_results_backend(self) -> None: + command = export.SqlResultExportCommand("test") + + data = [{"foo": i} for i in range(5)] + payload = { + "columns": [{"name": "foo"}], + "data": data, + } + serialized_payload = sql_lab._serialize_payload(payload, False) + compressed = utils.zlib_compress(serialized_payload) + + export.results_backend = mock.Mock() + export.results_backend.get.return_value = compressed + + result = command.run() + + assert result["data"] == "foo\n0\n1\n2\n3\n4\n" + assert result["count"] == 5 + assert result["query"].client_id == "test" + + +class TestSqlExecutionResultsCommand(SupersetTestCase): + @pytest.fixture() + def create_database_and_query(self): + with self.create_app().app_context(): + database = get_example_database() + query_obj = Query( + client_id="test", + database=database, + tab_name="test_tab", + sql_editor_id="test_editor_id", + sql="select * from bar", + select_sql="select * from bar", + executed_sql="select * from bar", + limit=100, + select_as_cta=False, + rows=104, + error_message="none", + results_key="abc_query", + ) + + db.session.add(query_obj) + db.session.commit() + + yield + + db.session.delete(query_obj) + db.session.commit() + + @patch("superset.sqllab.commands.results.results_backend_use_msgpack", False) + @patch("superset.sqllab.commands.results.results_backend", None) + def test_validation_no_results_backend(self) -> None: + command = results.SqlExecutionResultsCommand("test", 1000) + + with pytest.raises(SupersetErrorException) as ex_info: + command.run() + assert ( + ex_info.value.error.error_type + == SupersetErrorType.RESULTS_BACKEND_NOT_CONFIGURED_ERROR + ) + + @patch("superset.sqllab.commands.results.results_backend_use_msgpack", False) + def test_validation_data_cannot_be_retrieved(self) -> None: + results.results_backend = mock.Mock() + results.results_backend.get.return_value = None + + command = results.SqlExecutionResultsCommand("test", 1000) + + with pytest.raises(SupersetErrorException) as ex_info: + command.run() + assert ex_info.value.error.error_type == SupersetErrorType.RESULTS_BACKEND_ERROR + + @patch("superset.sqllab.commands.results.results_backend_use_msgpack", False) + def test_validation_data_not_found(self) -> None: + data = [{"col_0": i} for i in range(100)] + payload = { + "status": QueryStatus.SUCCESS, + "query": {"rows": 100}, + "data": data, + } + serialized_payload = sql_lab._serialize_payload(payload, False) + compressed = utils.zlib_compress(serialized_payload) + + results.results_backend = mock.Mock() + results.results_backend.get.return_value = compressed + + command = results.SqlExecutionResultsCommand("test", 1000) + + with pytest.raises(SupersetErrorException) as ex_info: + command.run() + assert ex_info.value.error.error_type == SupersetErrorType.RESULTS_BACKEND_ERROR + + @pytest.mark.usefixtures("create_database_and_query") + @patch("superset.sqllab.commands.results.results_backend_use_msgpack", False) + def test_validation_query_not_found(self) -> None: + data = [{"col_0": i} for i in range(104)] + payload = { + "status": QueryStatus.SUCCESS, + "query": {"rows": 104}, + "data": data, + } + serialized_payload = sql_lab._serialize_payload(payload, False) + compressed = utils.zlib_compress(serialized_payload) + + results.results_backend = mock.Mock() + results.results_backend.get.return_value = compressed + + with mock.patch( + "superset.views.utils._deserialize_results_payload", + side_effect=SerializationError(), + ): + with pytest.raises(SupersetErrorException) as ex_info: + command = results.SqlExecutionResultsCommand("test_other", 1000) + command.run() + assert ( + ex_info.value.error.error_type + == SupersetErrorType.RESULTS_BACKEND_ERROR + ) + + @pytest.mark.usefixtures("create_database_and_query") + @patch("superset.sqllab.commands.results.results_backend_use_msgpack", False) + def test_run_succeeds(self) -> None: + data = [{"col_0": i} for i in range(104)] + payload = { + "status": QueryStatus.SUCCESS, + "query": {"rows": 104}, + "data": data, + } + serialized_payload = sql_lab._serialize_payload(payload, False) + compressed = utils.zlib_compress(serialized_payload) + + results.results_backend = mock.Mock() + results.results_backend.get.return_value = compressed + + command = results.SqlExecutionResultsCommand("abc_query", 1000) + result = command.run() + + assert result.get("status") == "success" + assert result["query"].get("rows") == 104 + assert result.get("data") == data diff --git a/tests/integration_tests/sql_lab/conftest.py b/tests/integration_tests/sql_lab/conftest.py new file mode 100644 index 000000000000..8b4a0e63a5aa --- /dev/null +++ b/tests/integration_tests/sql_lab/conftest.py @@ -0,0 +1,71 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from typing import Callable, ContextManager + +import pytest +from flask_appbuilder.security.sqla import models as ab_models + +from superset import db +from superset.models.sql_lab import Query +from superset.utils.core import shortid +from superset.utils.database import get_example_database + + +def force_async_run(allow_run_async: bool): + example_db = get_example_database() + orig_allow_run_async = example_db.allow_run_async + + example_db.allow_run_async = allow_run_async + db.session.commit() + + yield example_db + + example_db.allow_run_async = orig_allow_run_async + db.session.commit() + + +@pytest.fixture +def non_async_example_db(app_context): + gen = force_async_run(False) + yield next(gen) + try: + next(gen) + except StopIteration: + pass + + +@pytest.fixture +def async_example_db(app_context): + gen = force_async_run(True) + yield next(gen) + try: + next(gen) + except StopIteration: + pass + + +@pytest.fixture +def example_query(get_or_create_user: Callable[..., ContextManager[ab_models.User]]): + with get_or_create_user("sqllab-test-user") as user: + query = Query( + client_id=shortid()[:10], database=get_example_database(), user=user + ) + db.session.add(query) + db.session.commit() + yield query + db.session.delete(query) + db.session.commit() diff --git a/tests/integration_tests/sql_lab/test_execute_sql_statements.py b/tests/integration_tests/sql_lab/test_execute_sql_statements.py new file mode 100644 index 000000000000..48fcfe31f03c --- /dev/null +++ b/tests/integration_tests/sql_lab/test_execute_sql_statements.py @@ -0,0 +1,56 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from superset import app, db +from superset.common.db_query_status import QueryStatus +from superset.models.core import Database +from superset.models.sql_lab import Query +from superset.sql_lab import execute_sql_statements +from superset.utils.dates import now_as_float + + +def test_non_async_execute(non_async_example_db: Database, example_query: Query): + """Test query.tracking_url is attached for Presto and Hive queries""" + result = execute_sql_statements( + example_query.id, + "select 1 as foo;", + store_results=False, + return_results=True, + session=db.session, + start_time=now_as_float(), + expand_data=True, + log_params=dict(), + ) + assert result + assert result["query_id"] == example_query.id + assert result["status"] == QueryStatus.SUCCESS + assert result["data"] == [{"foo": 1}] + + # should attach apply tracking URL for Presto & Hive + if non_async_example_db.db_engine_spec.engine == "presto": + assert example_query.tracking_url + assert "/ui/query.html?" in example_query.tracking_url + + app.config["TRACKING_URL_TRANSFORMER"] = lambda url, query: url.replace( + "/ui/query.html?", f"/{query.client_id}/" + ) + assert f"/{example_query.client_id}/" in example_query.tracking_url + + app.config["TRACKING_URL_TRANSFORMER"] = lambda url: url + "&foo=bar" + assert example_query.tracking_url.endswith("&foo=bar") + + if non_async_example_db.db_engine_spec.engine_name == "hive": + assert example_query.tracking_url_raw diff --git a/tests/integration_tests/sql_validator_tests.py b/tests/integration_tests/sql_validator_tests.py index ff4c74fa45fb..d2f6e7108d42 100644 --- a/tests/integration_tests/sql_validator_tests.py +++ b/tests/integration_tests/sql_validator_tests.py @@ -174,7 +174,9 @@ class TestPrestoValidator(SupersetTestCase): def setUp(self): self.validator = PrestoDBSQLValidator self.database = MagicMock() - self.database_engine = self.database.get_sqla_engine.return_value + self.database_engine = ( + self.database.get_sqla_engine_with_context.return_value.__enter__.return_value + ) self.database_conn = self.database_engine.raw_connection.return_value self.database_cursor = self.database_conn.cursor.return_value self.database_cursor.poll.return_value = None diff --git a/tests/integration_tests/sqla_models_tests.py b/tests/integration_tests/sqla_models_tests.py index 5614ad263a4f..4003913516fe 100644 --- a/tests/integration_tests/sqla_models_tests.py +++ b/tests/integration_tests/sqla_models_tests.py @@ -23,7 +23,6 @@ import numpy as np import pandas as pd -import sqlalchemy as sa from flask import Flask from pytest_mock import MockFixture from sqlalchemy.sql import text @@ -40,8 +39,6 @@ AdhocMetricExpressionType, FilterOperator, GenericDataType, - TemporalType, - backend, ) from superset.utils.database import get_example_database from tests.integration_tests.fixtures.birth_names_dashboard import ( @@ -51,6 +48,7 @@ from tests.integration_tests.test_app import app from .base_tests import SupersetTestCase +from .conftest import only_postgresql VIRTUAL_TABLE_INT_TYPES: Dict[str, Pattern[str]] = { "hive": re.compile(r"^INT_TYPE$"), @@ -70,6 +68,7 @@ class FilterTestCase(NamedTuple): + column: str operator: str value: Union[float, int, List[Any], str] expected: Union[str, List[str]] @@ -201,22 +200,34 @@ def test_jinja_metrics_and_calc_columns(self, flask_g): "granularity": None, "from_dttm": None, "to_dttm": None, - "groupby": ["user", "expr"], + "columns": [ + "user", + "expr", + { + "hasCustomLabel": True, + "label": "adhoc_column", + "sqlExpression": "'{{ 'foo_' + time_grain }}'", + }, + ], "metrics": [ { + "hasCustomLabel": True, + "label": "adhoc_metric", "expressionType": AdhocMetricExpressionType.SQL, - "sqlExpression": "SUM(case when user = '{{ current_username() }}' " - "then 1 else 0 end)", - "label": "SUM(userid)", - } + "sqlExpression": "SUM(case when user = '{{ 'user_' + " + "current_username() }}' then 1 else 0 end)", + }, + "count_timegrain", ], "is_timeseries": False, "filter": [], + "extras": {"time_grain_sqla": "P1D"}, } table = SqlaTable( table_name="test_has_jinja_metric_and_expr", - sql="SELECT '{{ current_username() }}' as user", + sql="SELECT '{{ 'user_' + current_username() }}' as user, " + "'{{ 'xyz_' + time_grain }}' as time_grain", database=get_example_database(), ) TableColumn( @@ -226,14 +237,25 @@ def test_jinja_metrics_and_calc_columns(self, flask_g): type="VARCHAR(100)", table=table, ) + SqlMetric( + metric_name="count_timegrain", + expression="count('{{ 'bar_' + time_grain }}')", + table=table, + ) db.session.commit() sqla_query = table.get_sqla_query(**base_query_obj) query = table.database.compile_sqla_query(sqla_query.sqla_query) - # assert expression - assert "case when 'abc' = 'abc' then 'yes' else 'no' end" in query - # assert metric - assert "SUM(case when user = 'abc' then 1 else 0 end)" in query + # assert virtual dataset + assert "SELECT 'user_abc' as user, 'xyz_P1D' as time_grain" in query + # assert dataset calculated column + assert "case when 'abc' = 'abc' then 'yes' else 'no' end AS expr" in query + # assert adhoc column + assert "'foo_P1D'" in query + # assert dataset saved metric + assert "count('bar_P1D')" in query + # assert adhoc metric + assert "SUM(case when user = 'user_abc' then 1 else 0 end)" in query # Cleanup db.session.delete(table) db.session.commit() @@ -270,19 +292,22 @@ def test_adhoc_metrics_and_calc_columns(self): @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_where_operators(self): filters: Tuple[FilterTestCase, ...] = ( - FilterTestCase(FilterOperator.IS_NULL, "", "IS NULL"), - FilterTestCase(FilterOperator.IS_NOT_NULL, "", "IS NOT NULL"), + FilterTestCase("num", FilterOperator.IS_NULL, "", "IS NULL"), + FilterTestCase("num", FilterOperator.IS_NOT_NULL, "", "IS NOT NULL"), # Some db backends translate true/false to 1/0 - FilterTestCase(FilterOperator.IS_TRUE, "", ["IS 1", "IS true"]), - FilterTestCase(FilterOperator.IS_FALSE, "", ["IS 0", "IS false"]), - FilterTestCase(FilterOperator.GREATER_THAN, 0, "> 0"), - FilterTestCase(FilterOperator.GREATER_THAN_OR_EQUALS, 0, ">= 0"), - FilterTestCase(FilterOperator.LESS_THAN, 0, "< 0"), - FilterTestCase(FilterOperator.LESS_THAN_OR_EQUALS, 0, "<= 0"), - FilterTestCase(FilterOperator.EQUALS, 0, "= 0"), - FilterTestCase(FilterOperator.NOT_EQUALS, 0, "!= 0"), - FilterTestCase(FilterOperator.IN, ["1", "2"], "IN (1, 2)"), - FilterTestCase(FilterOperator.NOT_IN, ["1", "2"], "NOT IN (1, 2)"), + FilterTestCase("num", FilterOperator.IS_TRUE, "", ["IS 1", "IS true"]), + FilterTestCase("num", FilterOperator.IS_FALSE, "", ["IS 0", "IS false"]), + FilterTestCase("num", FilterOperator.GREATER_THAN, 0, "> 0"), + FilterTestCase("num", FilterOperator.GREATER_THAN_OR_EQUALS, 0, ">= 0"), + FilterTestCase("num", FilterOperator.LESS_THAN, 0, "< 0"), + FilterTestCase("num", FilterOperator.LESS_THAN_OR_EQUALS, 0, "<= 0"), + FilterTestCase("num", FilterOperator.EQUALS, 0, "= 0"), + FilterTestCase("num", FilterOperator.NOT_EQUALS, 0, "!= 0"), + FilterTestCase("num", FilterOperator.IN, ["1", "2"], "IN (1, 2)"), + FilterTestCase("num", FilterOperator.NOT_IN, ["1", "2"], "NOT IN (1, 2)"), + FilterTestCase( + "ds", FilterOperator.TEMPORAL_RANGE, "2020 : 2021", "2020-01-01" + ), ) table = self.get_table(name="birth_names") for filter_ in filters: @@ -294,7 +319,11 @@ def test_where_operators(self): "metrics": ["count"], "is_timeseries": False, "filter": [ - {"col": "num", "op": filter_.operator, "val": filter_.value} + { + "col": filter_.column, + "op": filter_.operator, + "val": filter_.value, + } ], "extras": {}, } @@ -379,9 +408,8 @@ def test_query_format_strip_trailing_semicolon(self): "extras": {}, } - # Table with Jinja callable. table = SqlaTable( - table_name="test_table", + table_name="another_test_table", sql="SELECT * from test_table;", database=get_example_database(), ) @@ -454,7 +482,8 @@ def test_fetch_metadata_for_updated_virtual_table(self): # make sure the columns have been mapped properly assert len(table.columns) == 4 - table.fetch_metadata(commit=False) + with db.session.no_autoflush: + table.fetch_metadata(commit=False) # assert that the removed column has been dropped and # the physical and calculated columns are present @@ -466,15 +495,13 @@ def test_fetch_metadata_for_updated_virtual_table(self): } cols: Dict[str, TableColumn] = {col.column_name: col for col in table.columns} # assert that the type for intcol has been updated (asserting CI types) - backend = get_example_database().backend + backend = table.database.backend assert VIRTUAL_TABLE_INT_TYPES[backend].match(cols["intcol"].type) # assert that the expression has been replaced with the new physical column assert cols["mycase"].expression == "" assert VIRTUAL_TABLE_STRING_TYPES[backend].match(cols["mycase"].type) assert cols["expr"].expression == "case when 1 then 1 else 0 end" - db.session.delete(table) - @patch("superset.models.core.Database.db_engine_spec", BigQueryEngineSpec) def test_labels_expected_on_mutated_query(self): query_obj = { @@ -661,51 +688,90 @@ def test_filter_on_text_column(text_column_table): assert result_object.df["count"][0] == 1 -def test_should_generate_closed_and_open_time_filter_range(): - with app.app_context(): - if backend() != "postgresql": - pytest.skip(f"{backend()} has different dialect for datetime column") - - table = SqlaTable( - table_name="temporal_column_table", - sql=( - "SELECT '2021-12-31'::timestamp as datetime_col " - "UNION SELECT '2022-01-01'::timestamp " - "UNION SELECT '2022-03-10'::timestamp " - "UNION SELECT '2023-01-01'::timestamp " - "UNION SELECT '2023-03-10'::timestamp " - ), - database=get_example_database(), - ) - TableColumn( - column_name="datetime_col", - type="TIMESTAMP", - table=table, - is_dttm=True, - ) - SqlMetric(metric_name="count", expression="count(*)", table=table) - result_object = table.query( +@only_postgresql +def test_should_generate_closed_and_open_time_filter_range(login_as_admin): + table = SqlaTable( + table_name="temporal_column_table", + sql=( + "SELECT '2021-12-31'::timestamp as datetime_col " + "UNION SELECT '2022-01-01'::timestamp " + "UNION SELECT '2022-03-10'::timestamp " + "UNION SELECT '2023-01-01'::timestamp " + "UNION SELECT '2023-03-10'::timestamp " + ), + database=get_example_database(), + ) + TableColumn( + column_name="datetime_col", + type="TIMESTAMP", + table=table, + is_dttm=True, + ) + SqlMetric(metric_name="count", expression="count(*)", table=table) + result_object = table.query( + { + "metrics": ["count"], + "is_timeseries": False, + "filter": [], + "from_dttm": datetime(2022, 1, 1), + "to_dttm": datetime(2023, 1, 1), + "granularity": "datetime_col", + } + ) + """ >>> result_object.query + SELECT count(*) AS count + FROM + (SELECT '2021-12-31'::timestamp as datetime_col + UNION SELECT '2022-01-01'::timestamp + UNION SELECT '2022-03-10'::timestamp + UNION SELECT '2023-01-01'::timestamp + UNION SELECT '2023-03-10'::timestamp) AS virtual_table + WHERE datetime_col >= TO_TIMESTAMP('2022-01-01 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.US') + AND datetime_col < TO_TIMESTAMP('2023-01-01 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.US') + """ + assert result_object.df.iloc[0]["count"] == 2 + + +def test_none_operand_in_filter(login_as_admin, physical_dataset): + expected_results = [ + { + "operator": FilterOperator.EQUALS.value, + "count": 10, + "sql_should_contain": "COL4 IS NULL", + }, + { + "operator": FilterOperator.NOT_EQUALS.value, + "count": 0, + "sql_should_contain": "COL4 IS NOT NULL", + }, + ] + for expected in expected_results: + result = physical_dataset.query( { "metrics": ["count"], + "filter": [{"col": "col4", "val": None, "op": expected["operator"]}], "is_timeseries": False, - "filter": [], - "from_dttm": datetime(2022, 1, 1), - "to_dttm": datetime(2023, 1, 1), - "granularity": "datetime_col", } ) - """ >>> result_object.query - SELECT count(*) AS count - FROM - (SELECT '2021-12-31'::timestamp as datetime_col - UNION SELECT '2022-01-01'::timestamp - UNION SELECT '2022-03-10'::timestamp - UNION SELECT '2023-01-01'::timestamp - UNION SELECT '2023-03-10'::timestamp) AS virtual_table - WHERE datetime_col >= TO_TIMESTAMP('2022-01-01 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.US') - AND datetime_col < TO_TIMESTAMP('2023-01-01 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.US') - """ - assert result_object.df.iloc[0]["count"] == 2 + assert result.df["count"][0] == expected["count"] + assert expected["sql_should_contain"] in result.query.upper() + + with pytest.raises(QueryObjectValidationError): + for flt in [ + FilterOperator.GREATER_THAN, + FilterOperator.LESS_THAN, + FilterOperator.GREATER_THAN_OR_EQUALS, + FilterOperator.LESS_THAN_OR_EQUALS, + FilterOperator.LIKE, + FilterOperator.ILIKE, + ]: + physical_dataset.query( + { + "metrics": ["count"], + "filter": [{"col": "col4", "val": None, "op": flt.value}], + "is_timeseries": False, + } + ) @pytest.mark.parametrize( @@ -738,7 +804,7 @@ def test__normalize_prequery_result_type( def _convert_dttm( target_type: str, dttm: datetime, db_extra: Optional[Dict[str, Any]] = None ) -> Optional[str]: - if target_type.upper() == TemporalType.TIMESTAMP: + if target_type.upper() == "TIMESTAMP": return f"""TIME_PARSE('{dttm.isoformat(timespec="seconds")}')""" return None @@ -797,3 +863,26 @@ def _convert_dttm( assert str(normalized) == str(result) else: assert normalized == result + + +def test__temporal_range_operator_in_adhoc_filter(app_context, physical_dataset): + result = physical_dataset.query( + { + "columns": ["col1", "col2"], + "filter": [ + { + "col": "col5", + "val": "2000-01-05 : 2000-01-06", + "op": FilterOperator.TEMPORAL_RANGE.value, + }, + { + "col": "col6", + "val": "2002-05-11 : 2002-05-12", + "op": FilterOperator.TEMPORAL_RANGE.value, + }, + ], + "is_timeseries": False, + } + ) + df = pd.DataFrame(index=[0], data={"col1": 4, "col2": "e"}) + assert df.equals(result.df) diff --git a/tests/integration_tests/sqllab_tests.py b/tests/integration_tests/sqllab_tests.py index 7ded842ef7af..19e397e8f696 100644 --- a/tests/integration_tests/sqllab_tests.py +++ b/tests/integration_tests/sqllab_tests.py @@ -18,6 +18,7 @@ """Unit tests for Sql Lab""" import json from datetime import datetime, timedelta +from math import ceil, floor import pytest from celery.exceptions import SoftTimeLimitExceeded @@ -65,12 +66,13 @@ class TestSqlLab(SupersetTestCase): """Testings for Sql Lab""" + @pytest.mark.usefixtures("load_birth_names_data") def run_some_queries(self): db.session.query(Query).delete() db.session.commit() self.run_sql(QUERY_1, client_id="client_id_1", username="admin") - self.run_sql(QUERY_2, client_id="client_id_3", username="admin") - self.run_sql(QUERY_3, client_id="client_id_2", username="gamma_sqllab") + self.run_sql(QUERY_2, client_id="client_id_2", username="admin") + self.run_sql(QUERY_3, client_id="client_id_3", username="gamma_sqllab") self.logout() def tearDown(self): @@ -89,7 +91,7 @@ def test_sql_json(self): data = self.run_sql("SELECT * FROM birth_names LIMIT 10", "1") self.assertLess(0, len(data["data"])) - data = self.run_sql("SELECT * FROM unexistant_table", "2") + data = self.run_sql("SELECT * FROM nonexistent_table", "2") if backend() == "presto": assert ( data["errors"][0]["error_type"] @@ -205,19 +207,21 @@ def test_sql_json_cta_dynamic_db(self, ctas_method): # assertions db.session.commit() examples_db = get_example_database() - engine = examples_db.get_sqla_engine() - data = engine.execute( - f"SELECT * FROM admin_database.{tmp_table_name}" - ).fetchall() - names_count = engine.execute(f"SELECT COUNT(*) FROM birth_names").first() - self.assertEqual( - names_count[0], len(data) - ) # SQL_MAX_ROW not applied due to the SQLLAB_CTAS_NO_LIMIT set to True - - # cleanup - engine.execute(f"DROP {ctas_method} admin_database.{tmp_table_name}") - examples_db.allow_ctas = old_allow_ctas - db.session.commit() + with examples_db.get_sqla_engine_with_context() as engine: + data = engine.execute( + f"SELECT * FROM admin_database.{tmp_table_name}" + ).fetchall() + names_count = engine.execute( + f"SELECT COUNT(*) FROM birth_names" + ).first() + self.assertEqual( + names_count[0], len(data) + ) # SQL_MAX_ROW not applied due to the SQLLAB_CTAS_NO_LIMIT set to True + + # cleanup + engine.execute(f"DROP {ctas_method} admin_database.{tmp_table_name}") + examples_db.allow_ctas = old_allow_ctas + db.session.commit() @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") def test_multi_sql(self): @@ -253,6 +257,22 @@ def test_sql_json_has_access(self): db.session.commit() self.assertLess(0, len(data["data"])) + def test_sqllab_has_access(self): + for username in ("admin", "gamma_sqllab"): + self.login(username) + for endpoint in ("/superset/sqllab/", "/superset/sqllab/history/"): + resp = self.client.get(endpoint) + self.assertEqual(200, resp.status_code) + + self.logout() + + def test_sqllab_no_access(self): + self.login("gamma") + for endpoint in ("/superset/sqllab/", "/superset/sqllab/history/"): + resp = self.client.get(endpoint) + # Redirects to the main page + self.assertEqual(302, resp.status_code) + def test_sql_json_schema_access(self): examples_db = get_example_database() db_backend = examples_db.backend @@ -273,9 +293,10 @@ def test_sql_json_schema_access(self): "SchemaUser", ["SchemaPermission", "Gamma", "sql_lab"] ) - examples_db.get_sqla_engine().execute( - f"CREATE TABLE IF NOT EXISTS {CTAS_SCHEMA_NAME}.test_table AS SELECT 1 as c1, 2 as c2" - ) + with examples_db.get_sqla_engine_with_context() as engine: + engine.execute( + f"CREATE TABLE IF NOT EXISTS {CTAS_SCHEMA_NAME}.test_table AS SELECT 1 as c1, 2 as c2" + ) data = self.run_sql( f"SELECT * FROM {CTAS_SCHEMA_NAME}.test_table", "3", username="SchemaUser" @@ -301,9 +322,8 @@ def test_sql_json_schema_access(self): self.assertEqual(1, len(data["data"])) db.session.query(Query).delete() - get_example_database().get_sqla_engine().execute( - f"DROP TABLE IF EXISTS {CTAS_SCHEMA_NAME}.test_table" - ) + with get_example_database().get_sqla_engine_with_context() as engine: + engine.execute(f"DROP TABLE IF EXISTS {CTAS_SCHEMA_NAME}.test_table") db.session.commit() def test_queries_endpoint(self): @@ -405,22 +425,17 @@ def test_search_query_on_text(self): self.assertEqual(2, len(data)) self.assertIn("birth", data[0]["sql"]) - def test_search_query_on_time(self): + def test_search_query_filter_by_time(self): self.run_some_queries() self.login("admin") - first_query_time = ( - db.session.query(Query).filter_by(sql=QUERY_1).one() - ).start_time - second_query_time = ( - db.session.query(Query).filter_by(sql=QUERY_3).one() - ).start_time - # Test search queries on time filter - from_time = "from={}".format(int(first_query_time)) - to_time = "to={}".format(int(second_query_time)) - params = [from_time, to_time] - resp = self.get_resp("/superset/search_queries?" + "&".join(params)) - data = json.loads(resp) - self.assertEqual(2, len(data)) + from_time = floor( + (db.session.query(Query).filter_by(sql=QUERY_1).one()).start_time + ) + to_time = ceil( + (db.session.query(Query).filter_by(sql=QUERY_2).one()).start_time + ) + url = f"/superset/search_queries?from={from_time}&to={to_time}" + assert len(self.client.get(url).json) == 2 def test_search_query_only_owned(self) -> None: """ @@ -523,12 +538,10 @@ def test_sqllab_viz_bad_payload(self): def test_sqllab_table_viz(self): self.login("admin") examples_db = get_example_database() - examples_db.get_sqla_engine().execute( - "DROP TABLE IF EXISTS test_sqllab_table_viz" - ) - examples_db.get_sqla_engine().execute( - "CREATE TABLE test_sqllab_table_viz AS SELECT 2 as col" - ) + with examples_db.get_sqla_engine_with_context() as engine: + engine.execute("DROP TABLE IF EXISTS test_sqllab_table_viz") + engine.execute("CREATE TABLE test_sqllab_table_viz AS SELECT 2 as col") + examples_dbid = examples_db.id payload = { @@ -546,9 +559,9 @@ def test_sqllab_table_viz(self): table = db.session.query(SqlaTable).filter_by(id=table_id).one() self.assertEqual([owner.username for owner in table.owners], ["admin"]) db.session.delete(table) - get_example_database().get_sqla_engine().execute( - "DROP TABLE test_sqllab_table_viz" - ) + + with get_example_database().get_sqla_engine_with_context() as engine: + engine.execute("DROP TABLE test_sqllab_table_viz") db.session.commit() @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @@ -736,7 +749,7 @@ def test_execute_sql_statements(self, mock_execute_sql_statement, mock_get_query mock_query = mock.MagicMock() mock_query.database.allow_run_async = False mock_cursor = mock.MagicMock() - mock_query.database.get_sqla_engine.return_value.raw_connection.return_value.cursor.return_value = ( + mock_query.database.get_raw_connection().__enter__().cursor.return_value = ( mock_cursor ) mock_query.database.db_engine_spec.run_multiple_statements_as_one = False @@ -789,7 +802,7 @@ def test_execute_sql_statements_no_results_backend( mock_query = mock.MagicMock() mock_query.database.allow_run_async = True mock_cursor = mock.MagicMock() - mock_query.database.get_sqla_engine.return_value.raw_connection.return_value.cursor.return_value = ( + mock_query.database.get_raw_connection().__enter__().cursor.return_value = ( mock_cursor ) mock_query.database.db_engine_spec.run_multiple_statements_as_one = False @@ -839,7 +852,7 @@ def test_execute_sql_statements_ctas( mock_query = mock.MagicMock() mock_query.database.allow_run_async = False mock_cursor = mock.MagicMock() - mock_query.database.get_sqla_engine.return_value.raw_connection.return_value.cursor.return_value = ( + mock_query.database.get_raw_connection().__enter__().cursor.return_value = ( mock_cursor ) mock_query.database.db_engine_spec.run_multiple_statements_as_one = False diff --git a/tests/integration_tests/strategy_tests.py b/tests/integration_tests/strategy_tests.py index f31489bb0456..e54ae865e3c1 100644 --- a/tests/integration_tests/strategy_tests.py +++ b/tests/integration_tests/strategy_tests.py @@ -35,7 +35,7 @@ from superset import db from superset.models.core import Log -from superset.models.tags import get_tag, ObjectTypes, TaggedObject, TagTypes +from superset.tags.models import get_tag, ObjectTypes, TaggedObject, TagTypes from superset.tasks.cache import ( DashboardTagsStrategy, TopNDashboardsStrategy, diff --git a/tests/integration_tests/superset_test_config.py b/tests/integration_tests/superset_test_config.py index 10d81a2cf198..19c2cc000f54 100644 --- a/tests/integration_tests/superset_test_config.py +++ b/tests/integration_tests/superset_test_config.py @@ -15,6 +15,7 @@ # specific language governing permissions and limitations # under the License. # type: ignore +import logging import math from copy import copy from datetime import timedelta @@ -24,6 +25,12 @@ CustomPrestoTemplateProcessor, ) +logging.getLogger("flask_appbuilder.baseviews").setLevel(logging.WARNING) +logging.getLogger("flask_appbuilder.base").setLevel(logging.WARNING) +logging.getLogger("flask_appbuilder.api").setLevel(logging.WARNING) +logging.getLogger("flask_appbuilder.security.sqla.manager").setLevel(logging.WARNING) +logging.getLogger("sqlalchemy.engine.Engine").setLevel(logging.WARNING) + AUTH_USER_REGISTRATION_ROLE = "alpha" SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join( DATA_DIR, "unittests.integration_tests.db" @@ -63,6 +70,8 @@ "ENABLE_TEMPLATE_PROCESSING": True, "ALERT_REPORTS": True, "DASHBOARD_NATIVE_FILTERS": True, + "DRILL_TO_DETAIL": True, + "HORIZONTAL_FILTER_BAR": True, } WEBDRIVER_BASEURL = "http://0.0.0.0:8081/" diff --git a/tests/integration_tests/tagging_tests.py b/tests/integration_tests/tagging_tests.py index 9ae8764d40d5..4ee10041d2c5 100644 --- a/tests/integration_tests/tagging_tests.py +++ b/tests/integration_tests/tagging_tests.py @@ -15,11 +15,33 @@ # specific language governing permissions and limitations # under the License. +from unittest import mock + +import pytest + +from superset.connectors.sqla.models import SqlaTable +from superset.extensions import db +from superset.models.core import FavStar +from superset.models.dashboard import Dashboard +from superset.models.slice import Slice +from superset.models.sql_lab import SavedQuery +from superset.tags.models import TaggedObject +from superset.utils.core import DatasourceType +from superset.utils.database import get_main_database from tests.integration_tests.base_tests import SupersetTestCase from tests.integration_tests.conftest import with_feature_flags +from tests.integration_tests.fixtures.tags import with_tagging_system_feature class TestTagging(SupersetTestCase): + def query_tagged_object_table(self): + query = db.session.query(TaggedObject).all() + return query + + def clear_tagged_object_table(self): + db.session.query(TaggedObject).delete() + db.session.commit() + @with_feature_flags(TAGGING_SYSTEM=False) def test_tag_view_disabled(self): self.login("admin") @@ -31,3 +53,257 @@ def test_tag_view_enabled(self): self.login("admin") response = self.client.get("/tagview/tags/suggestions/") self.assertNotEqual(404, response.status_code) + + @pytest.mark.usefixtures("with_tagging_system_feature") + def test_dataset_tagging(self): + """ + Test to make sure that when a new dataset is created, + a corresponding tag in the tagged_objects table + is created + """ + + # Remove all existing rows in the tagged_object table + self.clear_tagged_object_table() + + # Test to make sure nothing is in the tagged_object table + self.assertEqual([], self.query_tagged_object_table()) + + # Create a dataset and add it to the db + test_dataset = SqlaTable( + table_name="foo", + schema=None, + owners=[], + database=get_main_database(), + sql=None, + extra='{"certification": 1}', + ) + db.session.add(test_dataset) + db.session.commit() + + # Test to make sure that a dataset tag was added to the tagged_object table + tags = self.query_tagged_object_table() + self.assertEqual(1, len(tags)) + self.assertEqual("ObjectTypes.dataset", str(tags[0].object_type)) + self.assertEqual(test_dataset.id, tags[0].object_id) + + # Cleanup the db + db.session.delete(test_dataset) + db.session.commit() + + # Test to make sure the tag is deleted when the associated object is deleted + self.assertEqual([], self.query_tagged_object_table()) + + @pytest.mark.usefixtures("with_tagging_system_feature") + def test_chart_tagging(self): + """ + Test to make sure that when a new chart is created, + a corresponding tag in the tagged_objects table + is created + """ + + # Remove all existing rows in the tagged_object table + self.clear_tagged_object_table() + + # Test to make sure nothing is in the tagged_object table + self.assertEqual([], self.query_tagged_object_table()) + + # Create a chart and add it to the db + test_chart = Slice( + slice_name="test_chart", + datasource_type=DatasourceType.TABLE, + viz_type="bubble", + datasource_id=1, + id=1, + ) + db.session.add(test_chart) + db.session.commit() + + # Test to make sure that a chart tag was added to the tagged_object table + tags = self.query_tagged_object_table() + self.assertEqual(1, len(tags)) + self.assertEqual("ObjectTypes.chart", str(tags[0].object_type)) + self.assertEqual(test_chart.id, tags[0].object_id) + + # Cleanup the db + db.session.delete(test_chart) + db.session.commit() + + # Test to make sure the tag is deleted when the associated object is deleted + self.assertEqual([], self.query_tagged_object_table()) + + @pytest.mark.usefixtures("with_tagging_system_feature") + def test_dashboard_tagging(self): + """ + Test to make sure that when a new dashboard is created, + a corresponding tag in the tagged_objects table + is created + """ + + # Remove all existing rows in the tagged_object table + self.clear_tagged_object_table() + + # Test to make sure nothing is in the tagged_object table + self.assertEqual([], self.query_tagged_object_table()) + + # Create a dashboard and add it to the db + test_dashboard = Dashboard() + test_dashboard.dashboard_title = "test_dashboard" + test_dashboard.slug = "test_slug" + test_dashboard.slices = [] + test_dashboard.published = True + + db.session.add(test_dashboard) + db.session.commit() + + # Test to make sure that a dashboard tag was added to the tagged_object table + tags = self.query_tagged_object_table() + self.assertEqual(1, len(tags)) + self.assertEqual("ObjectTypes.dashboard", str(tags[0].object_type)) + self.assertEqual(test_dashboard.id, tags[0].object_id) + + # Cleanup the db + db.session.delete(test_dashboard) + db.session.commit() + + # Test to make sure the tag is deleted when the associated object is deleted + self.assertEqual([], self.query_tagged_object_table()) + + @pytest.mark.usefixtures("with_tagging_system_feature") + def test_saved_query_tagging(self): + """ + Test to make sure that when a new saved query is + created, a corresponding tag in the tagged_objects + table is created + """ + + # Remove all existing rows in the tagged_object table + self.clear_tagged_object_table() + + # Test to make sure nothing is in the tagged_object table + self.assertEqual([], self.query_tagged_object_table()) + + # Create a saved query and add it to the db + test_saved_query = SavedQuery(id=1, label="test saved query") + db.session.add(test_saved_query) + db.session.commit() + + # Test to make sure that a saved query tag was added to the tagged_object table + tags = self.query_tagged_object_table() + + self.assertEqual(2, len(tags)) + + self.assertEqual("ObjectTypes.query", str(tags[0].object_type)) + self.assertEqual("owner:None", str(tags[0].tag.name)) + self.assertEqual("TagTypes.owner", str(tags[0].tag.type)) + self.assertEqual(test_saved_query.id, tags[0].object_id) + + self.assertEqual("ObjectTypes.query", str(tags[1].object_type)) + self.assertEqual("type:query", str(tags[1].tag.name)) + self.assertEqual("TagTypes.type", str(tags[1].tag.type)) + self.assertEqual(test_saved_query.id, tags[1].object_id) + + # Cleanup the db + db.session.delete(test_saved_query) + db.session.commit() + + # Test to make sure the tag is deleted when the associated object is deleted + self.assertEqual([], self.query_tagged_object_table()) + + @pytest.mark.usefixtures("with_tagging_system_feature") + def test_favorite_tagging(self): + """ + Test to make sure that when a new favorite object is + created, a corresponding tag in the tagged_objects + table is created + """ + + # Remove all existing rows in the tagged_object table + self.clear_tagged_object_table() + + # Test to make sure nothing is in the tagged_object table + self.assertEqual([], self.query_tagged_object_table()) + + # Create a favorited object and add it to the db + test_saved_query = FavStar(user_id=1, class_name="slice", obj_id=1) + db.session.add(test_saved_query) + db.session.commit() + + # Test to make sure that a favorited object tag was added to the tagged_object table + tags = self.query_tagged_object_table() + self.assertEqual(1, len(tags)) + self.assertEqual("ObjectTypes.chart", str(tags[0].object_type)) + self.assertEqual(test_saved_query.obj_id, tags[0].object_id) + + # Cleanup the db + db.session.delete(test_saved_query) + db.session.commit() + + # Test to make sure the tag is deleted when the associated object is deleted + self.assertEqual([], self.query_tagged_object_table()) + + @with_feature_flags(TAGGING_SYSTEM=False) + def test_tagging_system(self): + """ + Test to make sure that when the TAGGING_SYSTEM + feature flag is false, that no tags are created + """ + + # Remove all existing rows in the tagged_object table + self.clear_tagged_object_table() + + # Test to make sure nothing is in the tagged_object table + self.assertEqual([], self.query_tagged_object_table()) + + # Create a dataset and add it to the db + test_dataset = SqlaTable( + table_name="foo", + schema=None, + owners=[], + database=get_main_database(), + sql=None, + extra='{"certification": 1}', + ) + + # Create a chart and add it to the db + test_chart = Slice( + slice_name="test_chart", + datasource_type=DatasourceType.TABLE, + viz_type="bubble", + datasource_id=1, + id=1, + ) + + # Create a dashboard and add it to the db + test_dashboard = Dashboard() + test_dashboard.dashboard_title = "test_dashboard" + test_dashboard.slug = "test_slug" + test_dashboard.slices = [] + test_dashboard.published = True + + # Create a saved query and add it to the db + test_saved_query = SavedQuery(id=1, label="test saved query") + + # Create a favorited object and add it to the db + test_favorited_object = FavStar(user_id=1, class_name="slice", obj_id=1) + + db.session.add(test_dataset) + db.session.add(test_chart) + db.session.add(test_dashboard) + db.session.add(test_saved_query) + db.session.add(test_favorited_object) + db.session.commit() + + # Test to make sure that no tags were added to the tagged_object table + tags = self.query_tagged_object_table() + self.assertEqual(0, len(tags)) + + # Cleanup the db + db.session.delete(test_dataset) + db.session.delete(test_chart) + db.session.delete(test_dashboard) + db.session.delete(test_saved_query) + db.session.delete(test_favorited_object) + db.session.commit() + + # Test to make sure all the tags are deleted when the associated objects are deleted + self.assertEqual([], self.query_tagged_object_table()) diff --git a/tests/integration_tests/tasks/async_queries_tests.py b/tests/integration_tests/tasks/async_queries_tests.py index 596505a32a48..20d0f39eea0f 100644 --- a/tests/integration_tests/tasks/async_queries_tests.py +++ b/tests/integration_tests/tasks/async_queries_tests.py @@ -28,10 +28,10 @@ from superset.extensions import async_query_manager, security_manager from superset.tasks import async_queries from superset.tasks.async_queries import ( - ensure_user_is_set, load_chart_data_into_cache, load_explore_json_into_cache, ) +from superset.utils.core import get_user_id from tests.integration_tests.base_tests import SupersetTestCase from tests.integration_tests.fixtures.birth_names_dashboard import ( load_birth_names_dashboard_with_slices, @@ -57,12 +57,7 @@ def test_load_chart_data_into_cache(self, mock_set_form_data, mock_update_job): "errors": [], } - with mock.patch.object( - async_queries, "ensure_user_is_set" - ) as ensure_user_is_set: - load_chart_data_into_cache(job_metadata, query_context) - - ensure_user_is_set.assert_called_once_with(user.id) + load_chart_data_into_cache(job_metadata, query_context) mock_set_form_data.assert_called_once_with(query_context) mock_update_job.assert_called_once_with( job_metadata, "done", result_url=mock.ANY @@ -84,11 +79,7 @@ def test_load_chart_data_into_cache_error(self, mock_update_job, mock_run_comman "errors": [], } with pytest.raises(ChartDataQueryFailedError): - with mock.patch.object( - async_queries, "ensure_user_is_set" - ) as ensure_user_is_set: - load_chart_data_into_cache(job_metadata, query_context) - ensure_user_is_set.assert_called_once_with(user.id) + load_chart_data_into_cache(job_metadata, query_context) mock_run_command.assert_called_once_with(cache=True) errors = [{"message": "Error: foo"}] @@ -114,11 +105,11 @@ def test_soft_timeout_load_chart_data_into_cache( with pytest.raises(SoftTimeLimitExceeded): with mock.patch.object( async_queries, - "ensure_user_is_set", - ) as ensure_user_is_set: - ensure_user_is_set.side_effect = SoftTimeLimitExceeded() + "set_form_data", + ) as set_form_data: + set_form_data.side_effect = SoftTimeLimitExceeded() load_chart_data_into_cache(job_metadata, form_data) - ensure_user_is_set.assert_called_once_with(user.id, "error", errors=errors) + set_form_data.assert_called_once_with(form_data, "error", errors=errors) @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @mock.patch.object(async_query_manager, "update_job") @@ -144,12 +135,7 @@ def test_load_explore_json_into_cache(self, mock_update_job): "errors": [], } - with mock.patch.object( - async_queries, "ensure_user_is_set" - ) as ensure_user_is_set: - load_explore_json_into_cache(job_metadata, form_data) - - ensure_user_is_set.assert_called_once_with(user.id) + load_explore_json_into_cache(job_metadata, form_data) mock_update_job.assert_called_once_with( job_metadata, "done", result_url=mock.ANY ) @@ -171,11 +157,7 @@ def test_load_explore_json_into_cache_error( } with pytest.raises(SupersetException): - with mock.patch.object( - async_queries, "ensure_user_is_set" - ) as ensure_user_is_set: - load_explore_json_into_cache(job_metadata, form_data) - ensure_user_is_set.assert_called_once_with(user.id) + load_explore_json_into_cache(job_metadata, form_data) mock_set_form_data.assert_called_once_with(form_data) errors = ["The dataset associated with this chart no longer exists"] @@ -201,49 +183,8 @@ def test_soft_timeout_load_explore_json_into_cache( with pytest.raises(SoftTimeLimitExceeded): with mock.patch.object( async_queries, - "ensure_user_is_set", - ) as ensure_user_is_set: - ensure_user_is_set.side_effect = SoftTimeLimitExceeded() + "set_form_data", + ) as set_form_data: + set_form_data.side_effect = SoftTimeLimitExceeded() load_explore_json_into_cache(job_metadata, form_data) - ensure_user_is_set.assert_called_once_with(user.id, "error", errors=errors) - - def test_ensure_user_is_set(self): - g_user_is_set = hasattr(g, "user") - original_g_user = g.user if g_user_is_set else None - - if g_user_is_set: - del g.user - - self.assertFalse(hasattr(g, "user")) - ensure_user_is_set(1) - self.assertTrue(hasattr(g, "user")) - self.assertFalse(g.user.is_anonymous) - self.assertEqual("1", g.user.get_id()) - - del g.user - - self.assertFalse(hasattr(g, "user")) - ensure_user_is_set(None) - self.assertTrue(hasattr(g, "user")) - self.assertTrue(g.user.is_anonymous) - self.assertEqual(None, g.user.get_id()) - - del g.user - - g.user = security_manager.get_user_by_id(2) - self.assertEqual("2", g.user.get_id()) - - ensure_user_is_set(1) - self.assertTrue(hasattr(g, "user")) - self.assertFalse(g.user.is_anonymous) - self.assertEqual("2", g.user.get_id()) - - ensure_user_is_set(None) - self.assertTrue(hasattr(g, "user")) - self.assertFalse(g.user.is_anonymous) - self.assertEqual("2", g.user.get_id()) - - if g_user_is_set: - g.user = original_g_user - else: - del g.user + set_form_data.assert_called_once_with(form_data, "error", errors=errors) diff --git a/tests/integration_tests/test_app.py b/tests/integration_tests/test_app.py index 2ca39ba16bbc..fb7b47b67cb9 100644 --- a/tests/integration_tests/test_app.py +++ b/tests/integration_tests/test_app.py @@ -14,11 +14,6 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. - -""" -Here is where we create the app which ends up being shared across all tests.integration_tests. A future -optimization will be to create a separate app instance for each test class. -""" from typing import TYPE_CHECKING from superset.app import create_app @@ -27,7 +22,6 @@ from typing import Any from flask.testing import FlaskClient -from superset.app import create_app app = create_app() diff --git a/tests/integration_tests/thumbnails_tests.py b/tests/integration_tests/thumbnails_tests.py index 5eabc4da0009..efa0d73cb49f 100644 --- a/tests/integration_tests/thumbnails_tests.py +++ b/tests/integration_tests/thumbnails_tests.py @@ -16,11 +16,15 @@ # under the License. # from superset import db # from superset.models.dashboard import Dashboard + +import json import urllib.request from io import BytesIO +from typing import Tuple from unittest import skipUnless -from unittest.mock import ANY, call, patch +from unittest.mock import ANY, call, MagicMock, patch +import pytest from flask_testing import LiveServerTestCase from sqlalchemy.sql import func @@ -28,14 +32,22 @@ from superset.extensions import machine_auth_provider_factory from superset.models.dashboard import Dashboard from superset.models.slice import Slice +from superset.tasks.types import ExecutorType from superset.utils.screenshots import ChartScreenshot, DashboardScreenshot -from superset.utils.urls import get_url_host, get_url_path -from superset.utils.webdriver import WebDriverProxy +from superset.utils.urls import get_url_path +from superset.utils.webdriver import find_unexpected_errors, WebDriverProxy from tests.integration_tests.conftest import with_feature_flags +from tests.integration_tests.fixtures.birth_names_dashboard import ( + load_birth_names_dashboard_with_slices, + load_birth_names_data, +) from tests.integration_tests.test_app import app from .base_tests import SupersetTestCase +CHART_URL = "/api/v1/chart/" +DASHBOARD_URL = "/api/v1/dashboard/" + class TestThumbnailsSeleniumLive(LiveServerTestCase): def create_app(self): @@ -53,15 +65,83 @@ def test_get_async_dashboard_screenshot(self): """ Thumbnails: Simple get async dashboard screenshot """ - dashboard = db.session.query(Dashboard).all()[0] with patch("superset.dashboards.api.DashboardRestApi.get") as mock_get: + rv = self.client.get(DASHBOARD_URL) + resp = json.loads(rv.data.decode("utf-8")) + thumbnail_url = resp["result"][0]["thumbnail_url"] + response = self.url_open_auth( "admin", - f"api/v1/dashboard/{dashboard.id}/thumbnail/{dashboard.digest}/", + thumbnail_url, ) self.assertEqual(response.getcode(), 202) +class TestWebDriverScreenshotErrorDetector(SupersetTestCase): + @patch("superset.utils.webdriver.WebDriverWait") + @patch("superset.utils.webdriver.firefox") + @patch("superset.utils.webdriver.find_unexpected_errors") + def test_not_call_find_unexpected_errors_if_feature_disabled( + self, mock_find_unexpected_errors, mock_firefox, mock_webdriver_wait + ): + webdriver_proxy = WebDriverProxy("firefox") + user = security_manager.get_user_by_username( + app.config["THUMBNAIL_SELENIUM_USER"] + ) + url = get_url_path("Superset.dashboard", dashboard_id_or_slug=1) + webdriver_proxy.get_screenshot(url, "grid-container", user=user) + + assert not mock_find_unexpected_errors.called + + @patch("superset.utils.webdriver.WebDriverWait") + @patch("superset.utils.webdriver.firefox") + @patch("superset.utils.webdriver.find_unexpected_errors") + def test_call_find_unexpected_errors_if_feature_enabled( + self, mock_find_unexpected_errors, mock_firefox, mock_webdriver_wait + ): + app.config["SCREENSHOT_REPLACE_UNEXPECTED_ERRORS"] = True + webdriver_proxy = WebDriverProxy("firefox") + user = security_manager.get_user_by_username( + app.config["THUMBNAIL_SELENIUM_USER"] + ) + url = get_url_path("Superset.dashboard", dashboard_id_or_slug=1) + webdriver_proxy.get_screenshot(url, "grid-container", user=user) + + assert mock_find_unexpected_errors.called + + app.config["SCREENSHOT_REPLACE_UNEXPECTED_ERRORS"] = False + + def test_find_unexpected_errors_no_alert(self): + webdriver = MagicMock() + + webdriver.find_elements.return_value = [] + + unexpected_errors = find_unexpected_errors(driver=webdriver) + assert len(unexpected_errors) == 0 + + assert "alert" in webdriver.find_elements.call_args_list[0][0][1] + + @patch("superset.utils.webdriver.WebDriverWait") + def test_find_unexpected_errors(self, mock_webdriver_wait): + webdriver = MagicMock() + alert_div = MagicMock() + + webdriver.find_elements.return_value = [alert_div] + alert_div.find_elements.return_value = MagicMock() + + unexpected_errors = find_unexpected_errors(driver=webdriver) + assert len(unexpected_errors) == 1 + + # attempt to find alerts + assert "alert" in webdriver.find_elements.call_args_list[0][0][1] + # attempt to click on "See more" buttons + assert "button" in alert_div.find_element.call_args_list[0][0][1] + # Wait for error modal to show up and to hide + assert 2 == len(mock_webdriver_wait.call_args_list) + # replace the text in alert div, eg, "unexpected errors" + assert alert_div == webdriver.execute_script.call_args_list[0][0][1] + + class TestWebDriverProxy(SupersetTestCase): @patch("superset.utils.webdriver.WebDriverWait") @patch("superset.utils.webdriver.firefox") @@ -100,7 +180,7 @@ def test_screenshot_selenium_load_wait(self, mock_webdriver, mock_webdriver_wait ) url = get_url_path("Superset.slice", slice_id=1, standalone="true") webdriver.get_screenshot(url, "chart-container", user=user) - assert mock_webdriver_wait.call_args_list[1] == call(ANY, 15) + assert mock_webdriver_wait.call_args_list[2] == call(ANY, 15) @patch("superset.utils.webdriver.WebDriverWait") @patch("superset.utils.webdriver.firefox") @@ -121,50 +201,82 @@ def test_screenshot_selenium_animation_wait( class TestThumbnails(SupersetTestCase): mock_image = b"bytes mock image" + digest_return_value = "foo_bar" + digest_hash = "5c7d96a3dd7a87850a2ef34087565a6e" + def _get_id_and_thumbnail_url(self, url: str) -> Tuple[int, str]: + rv = self.client.get(url) + resp = json.loads(rv.data.decode("utf-8")) + obj = resp["result"][0] + return obj["id"], obj["thumbnail_url"] + + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @with_feature_flags(THUMBNAILS=False) def test_dashboard_thumbnail_disabled(self): """ Thumbnails: Dashboard thumbnail disabled """ - dashboard = db.session.query(Dashboard).all()[0] self.login(username="admin") - uri = f"api/v1/dashboard/{dashboard.id}/thumbnail/{dashboard.digest}/" - rv = self.client.get(uri) + _, thumbnail_url = self._get_id_and_thumbnail_url(DASHBOARD_URL) + rv = self.client.get(thumbnail_url) self.assertEqual(rv.status_code, 404) + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @with_feature_flags(THUMBNAILS=False) def test_chart_thumbnail_disabled(self): """ Thumbnails: Chart thumbnail disabled """ - chart = db.session.query(Slice).all()[0] self.login(username="admin") - uri = f"api/v1/chart/{chart}/thumbnail/{chart.digest}/" - rv = self.client.get(uri) + _, thumbnail_url = self._get_id_and_thumbnail_url(CHART_URL) + rv = self.client.get(thumbnail_url) self.assertEqual(rv.status_code, 404) + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @with_feature_flags(THUMBNAILS=True) - def test_get_async_dashboard_screenshot(self): + def test_get_async_dashboard_screenshot_as_selenium(self): """ - Thumbnails: Simple get async dashboard screenshot + Thumbnails: Simple get async dashboard screenshot as selenium user """ - dashboard = db.session.query(Dashboard).all()[0] - self.login(username="admin") - uri = f"api/v1/dashboard/{dashboard.id}/thumbnail/{dashboard.digest}/" + self.login(username="alpha") with patch( - "superset.tasks.thumbnails.cache_dashboard_thumbnail.delay" - ) as mock_task: - rv = self.client.get(uri) + "superset.thumbnails.digest._adjust_string_for_executor" + ) as mock_adjust_string: + mock_adjust_string.return_value = self.digest_return_value + _, thumbnail_url = self._get_id_and_thumbnail_url(DASHBOARD_URL) + assert self.digest_hash in thumbnail_url + assert mock_adjust_string.call_args[0][1] == ExecutorType.SELENIUM + assert mock_adjust_string.call_args[0][2] == "admin" + + rv = self.client.get(thumbnail_url) self.assertEqual(rv.status_code, 202) - expected_uri = f"{get_url_host()}superset/dashboard/{dashboard.id}/" - expected_digest = dashboard.digest - expected_kwargs = {"force": True} - mock_task.assert_called_with( - expected_uri, expected_digest, **expected_kwargs - ) + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") + @with_feature_flags(THUMBNAILS=True) + def test_get_async_dashboard_screenshot_as_current_user(self): + """ + Thumbnails: Simple get async dashboard screenshot as current user + """ + username = "alpha" + self.login(username=username) + with patch.dict( + "superset.thumbnails.digest.current_app.config", + { + "THUMBNAIL_EXECUTE_AS": [ExecutorType.CURRENT_USER], + }, + ), patch( + "superset.thumbnails.digest._adjust_string_for_executor" + ) as mock_adjust_string: + mock_adjust_string.return_value = self.digest_return_value + _, thumbnail_url = self._get_id_and_thumbnail_url(DASHBOARD_URL) + assert self.digest_hash in thumbnail_url + assert mock_adjust_string.call_args[0][1] == ExecutorType.CURRENT_USER + assert mock_adjust_string.call_args[0][2] == username + rv = self.client.get(thumbnail_url) + self.assertEqual(rv.status_code, 202) + + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @with_feature_flags(THUMBNAILS=True) def test_get_async_dashboard_notfound(self): """ @@ -176,37 +288,62 @@ def test_get_async_dashboard_notfound(self): rv = self.client.get(uri) self.assertEqual(rv.status_code, 404) + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @skipUnless((is_feature_enabled("THUMBNAILS")), "Thumbnails feature") def test_get_async_dashboard_not_allowed(self): """ Thumbnails: Simple get async dashboard not allowed """ - dashboard = db.session.query(Dashboard).all()[0] self.login(username="gamma") - uri = f"api/v1/dashboard/{dashboard.id}/thumbnail/{dashboard.digest}/" - rv = self.client.get(uri) + _, thumbnail_url = self._get_id_and_thumbnail_url(DASHBOARD_URL) + rv = self.client.get(thumbnail_url) self.assertEqual(rv.status_code, 404) + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @with_feature_flags(THUMBNAILS=True) - def test_get_async_chart_screenshot(self): + def test_get_async_chart_screenshot_as_selenium(self): """ - Thumbnails: Simple get async chart screenshot + Thumbnails: Simple get async chart screenshot as selenium user """ - chart = db.session.query(Slice).all()[0] - self.login(username="admin") - uri = f"api/v1/chart/{chart.id}/thumbnail/{chart.digest}/" + self.login(username="alpha") with patch( - "superset.tasks.thumbnails.cache_chart_thumbnail.delay" - ) as mock_task: - rv = self.client.get(uri) + "superset.thumbnails.digest._adjust_string_for_executor" + ) as mock_adjust_string: + mock_adjust_string.return_value = self.digest_return_value + _, thumbnail_url = self._get_id_and_thumbnail_url(CHART_URL) + assert self.digest_hash in thumbnail_url + assert mock_adjust_string.call_args[0][1] == ExecutorType.SELENIUM + assert mock_adjust_string.call_args[0][2] == "admin" + + rv = self.client.get(thumbnail_url) self.assertEqual(rv.status_code, 202) - expected_uri = f"{get_url_host()}superset/slice/{chart.id}/?standalone=true" - expected_digest = chart.digest - expected_kwargs = {"force": True} - mock_task.assert_called_with( - expected_uri, expected_digest, **expected_kwargs - ) + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") + @with_feature_flags(THUMBNAILS=True) + def test_get_async_chart_screenshot_as_current_user(self): + """ + Thumbnails: Simple get async chart screenshot as current user + """ + username = "alpha" + self.login(username=username) + with patch.dict( + "superset.thumbnails.digest.current_app.config", + { + "THUMBNAIL_EXECUTE_AS": [ExecutorType.CURRENT_USER], + }, + ), patch( + "superset.thumbnails.digest._adjust_string_for_executor" + ) as mock_adjust_string: + mock_adjust_string.return_value = self.digest_return_value + _, thumbnail_url = self._get_id_and_thumbnail_url(CHART_URL) + assert self.digest_hash in thumbnail_url + assert mock_adjust_string.call_args[0][1] == ExecutorType.CURRENT_USER + assert mock_adjust_string.call_args[0][2] == username + + rv = self.client.get(thumbnail_url) + self.assertEqual(rv.status_code, 202) + + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @with_feature_flags(THUMBNAILS=True) def test_get_async_chart_notfound(self): """ @@ -218,66 +355,62 @@ def test_get_async_chart_notfound(self): rv = self.client.get(uri) self.assertEqual(rv.status_code, 404) + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @with_feature_flags(THUMBNAILS=True) def test_get_cached_chart_wrong_digest(self): """ Thumbnails: Simple get chart with wrong digest """ - chart = db.session.query(Slice).all()[0] with patch.object( ChartScreenshot, "get_from_cache", return_value=BytesIO(self.mock_image) ): self.login(username="admin") - uri = f"api/v1/chart/{chart.id}/thumbnail/1234/" - rv = self.client.get(uri) + id_, thumbnail_url = self._get_id_and_thumbnail_url(CHART_URL) + rv = self.client.get(f"api/v1/chart/{id_}/thumbnail/1234/") self.assertEqual(rv.status_code, 302) - self.assertRedirects( - rv, f"api/v1/chart/{chart.id}/thumbnail/{chart.digest}/" - ) + self.assertEqual(rv.headers["Location"], thumbnail_url) + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @with_feature_flags(THUMBNAILS=True) def test_get_cached_dashboard_screenshot(self): """ Thumbnails: Simple get cached dashboard screenshot """ - dashboard = db.session.query(Dashboard).all()[0] with patch.object( DashboardScreenshot, "get_from_cache", return_value=BytesIO(self.mock_image) ): self.login(username="admin") - uri = f"api/v1/dashboard/{dashboard.id}/thumbnail/{dashboard.digest}/" - rv = self.client.get(uri) + _, thumbnail_url = self._get_id_and_thumbnail_url(DASHBOARD_URL) + rv = self.client.get(thumbnail_url) self.assertEqual(rv.status_code, 200) self.assertEqual(rv.data, self.mock_image) + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @with_feature_flags(THUMBNAILS=True) def test_get_cached_chart_screenshot(self): """ Thumbnails: Simple get cached chart screenshot """ - chart = db.session.query(Slice).all()[0] with patch.object( ChartScreenshot, "get_from_cache", return_value=BytesIO(self.mock_image) ): self.login(username="admin") - uri = f"api/v1/chart/{chart.id}/thumbnail/{chart.digest}/" - rv = self.client.get(uri) + id_, thumbnail_url = self._get_id_and_thumbnail_url(CHART_URL) + rv = self.client.get(thumbnail_url) self.assertEqual(rv.status_code, 200) self.assertEqual(rv.data, self.mock_image) + @pytest.mark.usefixtures("load_birth_names_dashboard_with_slices") @with_feature_flags(THUMBNAILS=True) def test_get_cached_dashboard_wrong_digest(self): """ Thumbnails: Simple get dashboard with wrong digest """ - dashboard = db.session.query(Dashboard).all()[0] with patch.object( DashboardScreenshot, "get_from_cache", return_value=BytesIO(self.mock_image) ): self.login(username="admin") - uri = f"api/v1/dashboard/{dashboard.id}/thumbnail/1234/" - rv = self.client.get(uri) + id_, thumbnail_url = self._get_id_and_thumbnail_url(DASHBOARD_URL) + rv = self.client.get(f"api/v1/dashboard/{id_}/thumbnail/1234/") self.assertEqual(rv.status_code, 302) - self.assertRedirects( - rv, f"api/v1/dashboard/{dashboard.id}/thumbnail/{dashboard.digest}/" - ) + self.assertEqual(rv.headers["Location"], thumbnail_url) diff --git a/tests/integration_tests/utils/decorators_tests.py b/tests/integration_tests/utils/decorators_tests.py deleted file mode 100644 index d0ab6f98434b..000000000000 --- a/tests/integration_tests/utils/decorators_tests.py +++ /dev/null @@ -1,61 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from unittest.mock import call, Mock, patch - -import pytest -from flask import current_app - -from superset.utils import decorators -from tests.integration_tests.base_tests import SupersetTestCase - - -class UtilsDecoratorsTests(SupersetTestCase): - def test_debounce(self): - mock = Mock() - - @decorators.debounce() - def myfunc(arg1: int, arg2: int, kwarg1: str = "abc", kwarg2: int = 2): - mock(arg1, kwarg1) - return arg1 + arg2 + kwarg2 - - # should be called only once when arguments don't change - myfunc(1, 1) - myfunc(1, 1) - result = myfunc(1, 1) - mock.assert_called_once_with(1, "abc") - self.assertEqual(result, 4) - - # kwarg order shouldn't matter - myfunc(1, 0, kwarg2=2, kwarg1="haha") - result = myfunc(1, 0, kwarg1="haha", kwarg2=2) - mock.assert_has_calls([call(1, "abc"), call(1, "haha")]) - self.assertEqual(result, 3) - - def test_statsd_gauge(self): - @decorators.statsd_gauge("custom.prefix") - def my_func(fail: bool, *args, **kwargs): - if fail: - raise ValueError("Error") - return "OK" - - with patch.object(current_app.config["STATS_LOGGER"], "gauge") as mock: - my_func(False, 1, 2) - mock.assert_called_once_with("custom.prefix.ok", 1) - - with pytest.raises(ValueError): - my_func(True, 1, 2) - mock.assert_called_once_with("custom.prefix.error", 1) diff --git a/tests/integration_tests/utils_tests.py b/tests/integration_tests/utils_tests.py index 9b2a288964a7..967a4e9388cf 100644 --- a/tests/integration_tests/utils_tests.py +++ b/tests/integration_tests/utils_tests.py @@ -39,6 +39,7 @@ import tests.integration_tests.test_app from superset import app, db, security_manager +from superset.constants import NO_TIME_RANGE from superset.exceptions import CertificateException, SupersetException from superset.models.core import Database, Log from superset.models.dashboard import Dashboard @@ -62,7 +63,6 @@ merge_extra_filters, merge_extra_form_data, merge_request_params, - NO_TIME_RANGE, normalize_dttm_col, parse_ssl_cert, parse_js_uri_path_item, @@ -70,6 +70,7 @@ validate_json, zlib_compress, zlib_decompress, + DateColumn, ) from superset.utils.database import get_or_create_db from superset.utils import schema @@ -93,9 +94,10 @@ def test_json_int_dttm_ser(self): assert json_int_dttm_ser(datetime(1970, 1, 1)) == 0 assert json_int_dttm_ser(date(1970, 1, 1)) == 0 assert json_int_dttm_ser(dttm + timedelta(milliseconds=1)) == (ts + 1) + assert json_int_dttm_ser(np.int64(1)) == 1 with self.assertRaises(TypeError): - json_int_dttm_ser("this is not a date") + json_int_dttm_ser(np.datetime64()) def test_json_iso_dttm_ser(self): dttm = datetime(2020, 1, 1) @@ -104,19 +106,31 @@ def test_json_iso_dttm_ser(self): assert json_iso_dttm_ser(dttm) == dttm.isoformat() assert json_iso_dttm_ser(dt) == dt.isoformat() assert json_iso_dttm_ser(t) == t.isoformat() + assert json_iso_dttm_ser(np.int64(1)) == 1 + + assert ( + json_iso_dttm_ser(np.datetime64(), pessimistic=True) + == "Unserializable [<class 'numpy.datetime64'>]" + ) with self.assertRaises(TypeError): - json_iso_dttm_ser("this is not a date") + json_iso_dttm_ser(np.datetime64()) def test_base_json_conv(self): - assert isinstance(base_json_conv(np.bool_(1)), bool) is True - assert isinstance(base_json_conv(np.int64(1)), int) is True - assert isinstance(base_json_conv(np.array([1, 2, 3])), list) is True - assert isinstance(base_json_conv(set([1])), list) is True - assert isinstance(base_json_conv(Decimal("1.0")), float) is True - assert isinstance(base_json_conv(uuid.uuid4()), str) is True - assert isinstance(base_json_conv(time()), str) is True - assert isinstance(base_json_conv(timedelta(0)), str) is True + assert isinstance(base_json_conv(np.bool_(1)), bool) + assert isinstance(base_json_conv(np.int64(1)), int) + assert isinstance(base_json_conv(np.array([1, 2, 3])), list) + assert base_json_conv(np.array(None)) is None + assert isinstance(base_json_conv(set([1])), list) + assert isinstance(base_json_conv(Decimal("1.0")), float) + assert isinstance(base_json_conv(uuid.uuid4()), str) + assert isinstance(base_json_conv(time()), str) + assert isinstance(base_json_conv(timedelta(0)), str) + assert isinstance(base_json_conv(bytes()), str) + assert base_json_conv(bytes("", encoding="utf-16")) == "[bytes]" + + with pytest.raises(TypeError): + base_json_conv(np.datetime64()) def test_zlib_compression(self): json_str = '{"test": 1}' @@ -228,7 +242,6 @@ def test_merge_extra_filters(self): {"col": "__time_col", "op": "in", "val": "birth_year"}, {"col": "__time_grain", "op": "in", "val": "years"}, {"col": "A", "op": "like", "val": "hello"}, - {"col": "__time_origin", "op": "in", "val": "now"}, {"col": "__granularity", "op": "in", "val": "90 seconds"}, ] } @@ -248,12 +261,10 @@ def test_merge_extra_filters(self): "granularity_sqla": "birth_year", "time_grain_sqla": "years", "granularity": "90 seconds", - "druid_time_origin": "now", "applied_time_extras": { "__time_range": "1 year ago :", "__time_col": "birth_year", "__time_grain": "years", - "__time_origin": "now", "__granularity": "90 seconds", }, } @@ -528,6 +539,18 @@ def test_merge_extra_filters_adds_unequal_lists(self): merge_extra_filters(form_data) self.assertEqual(form_data, expected) + def test_merge_extra_filters_when_applied_time_extras_predefined(self): + form_data = {"applied_time_extras": {"__time_range": "Last week"}} + merge_extra_filters(form_data) + + self.assertEqual( + form_data, + { + "applied_time_extras": {"__time_range": "Last week"}, + "adhoc_filters": [], + }, + ) + def test_merge_request_params_when_url_params_undefined(self): form_data = {"since": "2000", "until": "now"} url_params = {"form_data": form_data, "dashboard_ids": "(1,2,3,4,5)"} @@ -887,7 +910,6 @@ def test_merge_extra_filters_with_extras(self): def test_ssl_certificate_parse(self): parsed_certificate = parse_ssl_cert(ssl_certificate) self.assertEqual(parsed_certificate.serial_number, 12355228710836649848) - self.assertRaises(CertificateException, parse_ssl_cert, "abc" + ssl_certificate) def test_ssl_certificate_file_creation(self): path = create_ssl_cert_file(ssl_certificate) @@ -1062,10 +1084,21 @@ def normalize_col( df: pd.DataFrame, timestamp_format: Optional[str], offset: int, - time_shift: Optional[timedelta], + time_shift: Optional[str], ) -> pd.DataFrame: df = df.copy() - normalize_dttm_col(df, timestamp_format, offset, time_shift) + normalize_dttm_col( + df, + tuple( + [ + DateColumn.get_legacy_time_column( + timestamp_format=timestamp_format, + offset=offset, + time_shift=time_shift, + ) + ] + ), + ) return df ts = pd.Timestamp(2021, 2, 15, 19, 0, 0, 0) @@ -1082,9 +1115,9 @@ def normalize_col( ) # test offset and timedelta - assert normalize_col(df, None, 1, timedelta(minutes=30))[DTTM_ALIAS][ - 0 - ] == pd.Timestamp(2021, 2, 15, 20, 30, 0, 0) + assert normalize_col(df, None, 1, "30 minutes")[DTTM_ALIAS][0] == pd.Timestamp( + 2021, 2, 15, 20, 30, 0, 0 + ) # test numeric epoch_s format df = pd.DataFrame([{"__timestamp": ts.timestamp(), "a": 1}]) diff --git a/tests/integration_tests/viz_tests.py b/tests/integration_tests/viz_tests.py index 6eb3f8c61148..137e2a474c34 100644 --- a/tests/integration_tests/viz_tests.py +++ b/tests/integration_tests/viz_tests.py @@ -288,13 +288,6 @@ def test_parse_adhoc_filters(self): "operator": ">", "comparator": "100", }, - { - "expressionType": "SIMPLE", - "clause": "HAVING", - "subject": "SUM(value1)", - "operator": "<", - "comparator": "10", - }, { "expressionType": "SQL", "clause": "HAVING", @@ -313,10 +306,6 @@ def test_parse_adhoc_filters(self): self.assertEqual( [{"col": "value2", "val": "100", "op": ">"}], query_obj["filter"] ) - self.assertEqual( - [{"op": "<", "val": "10", "col": "SUM(value1)"}], - query_obj["extras"]["having_druid"], - ) self.assertEqual("(value3 in ('North America'))", query_obj["extras"]["where"]) self.assertEqual("(SUM(value1) > 5)", query_obj["extras"]["having"]) @@ -352,7 +341,6 @@ def test_adhoc_filters_overwrite_legacy_filters(self): self.assertEqual( [{"col": "value2", "val": "100", "op": ">"}], query_obj["filter"] ) - self.assertEqual([], query_obj["extras"]["having_druid"]) self.assertEqual("(value3 in ('North America'))", query_obj["extras"]["where"]) self.assertEqual("", query_obj["extras"]["having"]) @@ -728,7 +716,7 @@ def test_get_data_transforms_dataframe(self): self.assertEqual(data, expected) def test_get_data_empty_null_keys(self): - form_data = {"groupby": [], "metrics": ["", None]} + form_data = {"groupby": [], "metrics": [""]} datasource = self.get_datasource_mock() # Test data raw = {} @@ -751,19 +739,13 @@ def test_get_data_empty_null_keys(self): "group": "All", } ], - "NULL": [ - { - "values": [ - {"x": 100, "y": 10}, - {"x": 200, "y": 20}, - {"x": 300, "y": 30}, - ], - "group": "All", - } - ], } self.assertEqual(data, expected) + form_data = {"groupby": [], "metrics": [None]} + with self.assertRaises(ValueError): + viz.viz_types["paired_ttest"](datasource, form_data) + class TestPartitionViz(SupersetTestCase): @patch("superset.viz.BaseViz.query_obj") diff --git a/tests/unit_tests/advanced_data_type/types_tests.py b/tests/unit_tests/advanced_data_type/types_tests.py index 82c9d8b29ad9..189b9e1aab22 100644 --- a/tests/unit_tests/advanced_data_type/types_tests.py +++ b/tests/unit_tests/advanced_data_type/types_tests.py @@ -17,11 +17,8 @@ # isort:skip_file """Unit tests for Superset""" -from ipaddress import ip_address import sqlalchemy -from flask.ctx import AppContext from sqlalchemy import Column, Integer -from tests.integration_tests.base_tests import SupersetTestCase from superset.advanced_data_type.types import ( AdvancedDataTypeRequest, AdvancedDataTypeResponse, @@ -36,7 +33,7 @@ # tox -e py38 -- tests/unit_tests/advanced_data_type/types_tests.py -def test_ip_func_valid_ip(app_context: None): +def test_ip_func_valid_ip(): """Test to see if the cidr_func behaves as expected when a valid IP is passed in""" cidr_request: AdvancedDataTypeRequest = { "advanced_data_type": "cidr", @@ -59,7 +56,7 @@ def test_ip_func_valid_ip(app_context: None): assert internet_address.translate_type(cidr_request) == cidr_response -def test_cidr_func_invalid_ip(app_context: None): +def test_cidr_func_invalid_ip(): """Test to see if the cidr_func behaves as expected when an invalid IP is passed in""" cidr_request: AdvancedDataTypeRequest = { "advanced_data_type": "cidr", @@ -82,7 +79,7 @@ def test_cidr_func_invalid_ip(app_context: None): assert internet_address.translate_type(cidr_request) == cidr_response -def test_port_translation_func_valid_port_number(app_context: None): +def test_port_translation_func_valid_port_number(): """Test to see if the port_translation_func behaves as expected when a valid port number is passed in""" port_request: AdvancedDataTypeRequest = { @@ -106,7 +103,7 @@ def test_port_translation_func_valid_port_number(app_context: None): assert port.translate_type(port_request) == port_response -def test_port_translation_func_valid_port_name(app_context: None): +def test_port_translation_func_valid_port_name(): """Test to see if the port_translation_func behaves as expected when a valid port name is passed in""" port_request: AdvancedDataTypeRequest = { @@ -130,7 +127,7 @@ def test_port_translation_func_valid_port_name(app_context: None): assert port.translate_type(port_request) == port_response -def test_port_translation_func_invalid_port_name(app_context: None): +def test_port_translation_func_invalid_port_name(): """Test to see if the port_translation_func behaves as expected when an invalid port name is passed in""" port_request: AdvancedDataTypeRequest = { @@ -154,7 +151,7 @@ def test_port_translation_func_invalid_port_name(app_context: None): assert port.translate_type(port_request) == port_response -def test_port_translation_func_invalid_port_number(app_context: None): +def test_port_translation_func_invalid_port_number(): """Test to see if the port_translation_func behaves as expected when an invalid port number is passed in""" port_request: AdvancedDataTypeRequest = { @@ -178,7 +175,7 @@ def test_port_translation_func_invalid_port_number(app_context: None): assert port.translate_type(port_request) == port_response -def test_cidr_translate_filter_func_equals(app_context: None): +def test_cidr_translate_filter_func_equals(): """Test to see if the cidr_translate_filter_func behaves as expected when the EQUALS operator is used""" @@ -193,7 +190,7 @@ def test_cidr_translate_filter_func_equals(app_context: None): ).compare(cidr_translate_filter_response) -def test_cidr_translate_filter_func_not_equals(app_context: None): +def test_cidr_translate_filter_func_not_equals(): """Test to see if the cidr_translate_filter_func behaves as expected when the NOT_EQUALS operator is used""" @@ -208,7 +205,7 @@ def test_cidr_translate_filter_func_not_equals(app_context: None): ).compare(cidr_translate_filter_response) -def test_cidr_translate_filter_func_greater_than_or_equals(app_context: None): +def test_cidr_translate_filter_func_greater_than_or_equals(): """Test to see if the cidr_translate_filter_func behaves as expected when the GREATER_THAN_OR_EQUALS operator is used""" @@ -225,7 +222,7 @@ def test_cidr_translate_filter_func_greater_than_or_equals(app_context: None): ).compare(cidr_translate_filter_response) -def test_cidr_translate_filter_func_greater_than(app_context: None): +def test_cidr_translate_filter_func_greater_than(): """Test to see if the cidr_translate_filter_func behaves as expected when the GREATER_THAN operator is used""" @@ -242,7 +239,7 @@ def test_cidr_translate_filter_func_greater_than(app_context: None): ).compare(cidr_translate_filter_response) -def test_cidr_translate_filter_func_less_than(app_context: None): +def test_cidr_translate_filter_func_less_than(): """Test to see if the cidr_translate_filter_func behaves as expected when the LESS_THAN operator is used""" @@ -259,7 +256,7 @@ def test_cidr_translate_filter_func_less_than(app_context: None): ).compare(cidr_translate_filter_response) -def test_cidr_translate_filter_func_less_than_or_equals(app_context: None): +def test_cidr_translate_filter_func_less_than_or_equals(): """Test to see if the cidr_translate_filter_func behaves as expected when the LESS_THAN_OR_EQUALS operator is used""" @@ -276,7 +273,7 @@ def test_cidr_translate_filter_func_less_than_or_equals(app_context: None): ).compare(cidr_translate_filter_response) -def test_cidr_translate_filter_func_in_single(app_context: None): +def test_cidr_translate_filter_func_in_single(): """Test to see if the cidr_translate_filter_func behaves as expected when the IN operator is used with a single IP""" @@ -293,7 +290,7 @@ def test_cidr_translate_filter_func_in_single(app_context: None): ).compare(cidr_translate_filter_response) -def test_cidr_translate_filter_func_in_double(app_context: None): +def test_cidr_translate_filter_func_in_double(): """Test to see if the cidr_translate_filter_func behaves as expected when the IN operator is used with two IP's""" @@ -312,7 +309,7 @@ def test_cidr_translate_filter_func_in_double(app_context: None): ).compare(cidr_translate_filter_response) -def test_cidr_translate_filter_func_not_in_single(app_context: None): +def test_cidr_translate_filter_func_not_in_single(): """Test to see if the cidr_translate_filter_func behaves as expected when the NOT_IN operator is used with a single IP""" @@ -329,7 +326,7 @@ def test_cidr_translate_filter_func_not_in_single(app_context: None): ).compare(cidr_translate_filter_response) -def test_cidr_translate_filter_func_not_in_double(app_context: None): +def test_cidr_translate_filter_func_not_in_double(): """Test to see if the cidr_translate_filter_func behaves as expected when the NOT_IN operator is used with two IP's""" @@ -348,7 +345,7 @@ def test_cidr_translate_filter_func_not_in_double(app_context: None): ).compare(cidr_translate_filter_response) -def test_port_translate_filter_func_equals(app_context: None): +def test_port_translate_filter_func_equals(): """Test to see if the port_translate_filter_func behaves as expected when the EQUALS operator is used""" @@ -365,7 +362,7 @@ def test_port_translate_filter_func_equals(app_context: None): ) -def test_port_translate_filter_func_not_equals(app_context: None): +def test_port_translate_filter_func_not_equals(): """Test to see if the port_translate_filter_func behaves as expected when the NOT_EQUALS operator is used""" @@ -382,7 +379,7 @@ def test_port_translate_filter_func_not_equals(app_context: None): ) -def test_port_translate_filter_func_greater_than_or_equals(app_context: None): +def test_port_translate_filter_func_greater_than_or_equals(): """Test to see if the port_translate_filter_func behaves as expected when the GREATER_THAN_OR_EQUALS operator is used""" @@ -399,7 +396,7 @@ def test_port_translate_filter_func_greater_than_or_equals(app_context: None): ) -def test_port_translate_filter_func_greater_than(app_context: None): +def test_port_translate_filter_func_greater_than(): """Test to see if the port_translate_filter_func behaves as expected when the GREATER_THAN operator is used""" @@ -416,7 +413,7 @@ def test_port_translate_filter_func_greater_than(app_context: None): ) -def test_port_translate_filter_func_less_than_or_equals(app_context: None): +def test_port_translate_filter_func_less_than_or_equals(): """Test to see if the port_translate_filter_func behaves as expected when the LESS_THAN_OR_EQUALS operator is used""" @@ -433,7 +430,7 @@ def test_port_translate_filter_func_less_than_or_equals(app_context: None): ) -def test_port_translate_filter_func_less_than(app_context: None): +def test_port_translate_filter_func_less_than(): """Test to see if the port_translate_filter_func behaves as expected when the LESS_THAN operator is used""" @@ -450,7 +447,7 @@ def test_port_translate_filter_func_less_than(app_context: None): ) -def test_port_translate_filter_func_in_single(app_context: None): +def test_port_translate_filter_func_in_single(): """Test to see if the port_translate_filter_func behaves as expected when the IN operator is used with a single port""" @@ -467,7 +464,7 @@ def test_port_translate_filter_func_in_single(app_context: None): ) -def test_port_translate_filter_func_in_double(app_context: None): +def test_port_translate_filter_func_in_double(): """Test to see if the port_translate_filter_func behaves as expected when the IN operator is used with two ports""" @@ -484,7 +481,7 @@ def test_port_translate_filter_func_in_double(app_context: None): ) -def test_port_translate_filter_func_not_in_single(app_context: None): +def test_port_translate_filter_func_not_in_single(): """Test to see if the port_translate_filter_func behaves as expected when the NOT_IN operator is used with a single port""" @@ -501,7 +498,7 @@ def test_port_translate_filter_func_not_in_single(app_context: None): ) -def test_port_translate_filter_func_not_in_double(app_context: None): +def test_port_translate_filter_func_not_in_double(): """Test to see if the port_translate_filter_func behaves as expected when the NOT_IN operator is used with two ports""" diff --git a/tests/unit_tests/charts/commands/importers/v1/import_test.py b/tests/unit_tests/charts/commands/importers/v1/import_test.py index e8687036394c..e29fd70fb8a7 100644 --- a/tests/unit_tests/charts/commands/importers/v1/import_test.py +++ b/tests/unit_tests/charts/commands/importers/v1/import_test.py @@ -21,7 +21,7 @@ from sqlalchemy.orm.session import Session -def test_import_chart(app_context: None, session: Session) -> None: +def test_import_chart(session: Session) -> None: """ Test importing a chart. """ @@ -45,7 +45,7 @@ def test_import_chart(app_context: None, session: Session) -> None: assert chart.external_url is None -def test_import_chart_managed_externally(app_context: None, session: Session) -> None: +def test_import_chart_managed_externally(session: Session) -> None: """ Test importing a chart that is managed externally. """ diff --git a/tests/unit_tests/charts/dao/__init__.py b/tests/unit_tests/charts/dao/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/unit_tests/charts/dao/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/unit_tests/charts/dao/dao_tests.py b/tests/unit_tests/charts/dao/dao_tests.py new file mode 100644 index 000000000000..15310712a5f8 --- /dev/null +++ b/tests/unit_tests/charts/dao/dao_tests.py @@ -0,0 +1,67 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import Iterator + +import pytest +from sqlalchemy.orm.session import Session + +from superset.utils.core import DatasourceType + + +@pytest.fixture +def session_with_data(session: Session) -> Iterator[Session]: + from superset.models.slice import Slice + + engine = session.get_bind() + Slice.metadata.create_all(engine) # pylint: disable=no-member + + slice_obj = Slice( + id=1, + datasource_id=1, + datasource_type=DatasourceType.TABLE, + datasource_name="tmp_perm_table", + slice_name="slice_name", + ) + + session.add(slice_obj) + session.commit() + yield session + session.rollback() + + +def test_slice_find_by_id_skip_base_filter(session_with_data: Session) -> None: + from superset.charts.dao import ChartDAO + from superset.models.slice import Slice + + result = ChartDAO.find_by_id(1, session=session_with_data, skip_base_filter=True) + + assert result + assert 1 == result.id + assert "slice_name" == result.slice_name + assert isinstance(result, Slice) + + +def test_datasource_find_by_id_skip_base_filter_not_found( + session_with_data: Session, +) -> None: + from superset.charts.dao import ChartDAO + + result = ChartDAO.find_by_id( + 125326326, session=session_with_data, skip_base_filter=True + ) + assert result is None diff --git a/tests/unit_tests/charts/test_post_processing.py b/tests/unit_tests/charts/test_post_processing.py index f8586be1ff95..be28aba92203 100644 --- a/tests/unit_tests/charts/test_post_processing.py +++ b/tests/unit_tests/charts/test_post_processing.py @@ -15,9 +15,17 @@ # specific language governing permissions and limitations # under the License. +import json + import pandas as pd +from flask_babel import lazy_gettext as _ +from numpy import True_ +from pytest import raises +from sqlalchemy.orm.session import Session -from superset.charts.post_processing import pivot_df, table +from superset.charts.post_processing import apply_post_process, pivot_df, table +from superset.common.chart_data import ChartDataResultFormat +from superset.utils.core import GenericDataType def test_pivot_df_no_cols_no_rows_single_metric(): @@ -50,14 +58,14 @@ def test_pivot_df_no_cols_no_rows_single_metric(): ) assert ( pivoted.to_markdown() - == """ + == f""" | | ('SUM(num)',) | |:-----------------|----------------:| -| ('Total (Sum)',) | 8.06797e+07 | +| ('{_("Total")} (Sum)',) | 8.06797e+07 | """.strip() ) - # tranpose_pivot and combine_metrics do nothing in this case + # transpose_pivot and combine_metrics do nothing in this case pivoted = pivot_df( df, rows=[], @@ -72,10 +80,10 @@ def test_pivot_df_no_cols_no_rows_single_metric(): ) assert ( pivoted.to_markdown() - == """ + == f""" | | ('SUM(num)',) | |:-----------------|----------------:| -| ('Total (Sum)',) | 8.06797e+07 | +| ('{_("Total")} (Sum)',) | 8.06797e+07 | """.strip() ) @@ -95,8 +103,8 @@ def test_pivot_df_no_cols_no_rows_single_metric(): ) assert ( pivoted.to_markdown() - == """ -| | ('Total (Sum)',) | + == f""" +| | ('{_("Total")} (Sum)',) | |:--------------|-------------------:| | ('SUM(num)',) | 8.06797e+07 | """.strip() @@ -117,10 +125,10 @@ def test_pivot_df_no_cols_no_rows_single_metric(): ) assert ( pivoted.to_markdown() - == """ + == f""" | | ('SUM(num)',) | ('Total (Sum)',) | |:-----------------|----------------:|-------------------:| -| ('Total (Sum)',) | 8.06797e+07 | 8.06797e+07 | +| ('{_("Total")} (Sum)',) | 8.06797e+07 | 8.06797e+07 | """.strip() ) @@ -155,14 +163,14 @@ def test_pivot_df_no_cols_no_rows_two_metrics(): ) assert ( pivoted.to_markdown() - == """ + == f""" | | ('SUM(num)',) | ('MAX(num)',) | |:-----------------|----------------:|----------------:| -| ('Total (Sum)',) | 8.06797e+07 | 37296 | +| ('{_("Total")} (Sum)',) | 8.06797e+07 | 37296 | """.strip() ) - # tranpose_pivot and combine_metrics do nothing in this case + # transpose_pivot and combine_metrics do nothing in this case pivoted = pivot_df( df, rows=[], @@ -200,8 +208,8 @@ def test_pivot_df_no_cols_no_rows_two_metrics(): ) assert ( pivoted.to_markdown() - == """ -| | ('Total (Sum)',) | + == f""" +| | ('{_("Total")} (Sum)',) | |:--------------|-------------------:| | ('SUM(num)',) | 8.06797e+07 | | ('MAX(num)',) | 37296 | @@ -224,10 +232,10 @@ def test_pivot_df_no_cols_no_rows_two_metrics(): ) assert ( pivoted.to_markdown() - == """ -| | ('SUM(num)',) | ('MAX(num)',) | ('Total (Sum)',) | + == f""" +| | ('SUM(num)',) | ('MAX(num)',) | ('{_("Total")} (Sum)',) | |:-----------------|----------------:|----------------:|-------------------:| -| ('Total (Sum)',) | 8.06797e+07 | 37296 | 8.0717e+07 | +| ('{_("Total")} (Sum)',) | 8.06797e+07 | 37296 | 8.0717e+07 | """.strip() ) @@ -290,10 +298,10 @@ def test_pivot_df_single_row_two_metrics(): ) assert ( pivoted.to_markdown() - == """ + == f""" | | ('SUM(num)', 'boy') | ('SUM(num)', 'girl') | ('MAX(num)', 'boy') | ('MAX(num)', 'girl') | |:-----------------|----------------------:|-----------------------:|----------------------:|-----------------------:| -| ('Total (Sum)',) | 47123 | 118065 | 1280 | 2588 | +| ('{_("Total")} (Sum)',) | 47123 | 118065 | 1280 | 2588 | """.strip() ) @@ -335,12 +343,12 @@ def test_pivot_df_single_row_two_metrics(): ) assert ( pivoted.to_markdown() - == """ -| | ('SUM(num)',) | ('MAX(num)',) | ('Total (Sum)',) | + == f""" +| | ('SUM(num)',) | ('MAX(num)',) | ('{_("Total")} (Sum)',) | |:-----------------|----------------:|----------------:|-------------------:| | ('boy',) | 47123 | 1280 | 48403 | | ('girl',) | 118065 | 2588 | 120653 | -| ('Total (Sum)',) | 165188 | 3868 | 169056 | +| ('{_("Total")} (Sum)',) | 165188 | 3868 | 169056 | """.strip() ) @@ -359,8 +367,8 @@ def test_pivot_df_single_row_two_metrics(): ) assert ( pivoted.to_markdown() - == """ -| | ('Total (Sum)',) | + == f""" +| | ('{_("Total")} (Sum)',) | |:-------------------------|-------------------:| | ('SUM(num)', 'boy') | 47123 | | ('SUM(num)', 'girl') | 118065 | @@ -368,7 +376,7 @@ def test_pivot_df_single_row_two_metrics(): | ('MAX(num)', 'boy') | 1280 | | ('MAX(num)', 'girl') | 2588 | | ('MAX(num)', 'Subtotal') | 3868 | -| ('Total (Sum)', '') | 169056 | +| ('{_("Total")} (Sum)', '') | 169056 | """.strip() ) @@ -387,8 +395,8 @@ def test_pivot_df_single_row_two_metrics(): ) assert ( pivoted.to_markdown() - == """ -| | ('Total (Sum)',) | + == f""" +| | ('{_("Total")} (Sum)',) | |:---------------------|-------------------:| | ('boy', 'SUM(num)') | 47123 | | ('boy', 'MAX(num)') | 1280 | @@ -396,7 +404,7 @@ def test_pivot_df_single_row_two_metrics(): | ('girl', 'SUM(num)') | 118065 | | ('girl', 'MAX(num)') | 2588 | | ('girl', 'Subtotal') | 120653 | -| ('Total (Sum)', '') | 169056 | +| ('{_("Total")} (Sum)', '') | 169056 | """.strip() ) @@ -1363,3 +1371,661 @@ def test_table(): | 0 | 80,679,663 | """.strip() ) + + +def test_apply_post_process_no_form_invalid_viz_type(): + """ + Test with invalid viz type. It should just return the result + """ + result = {"foo": "bar"} + form_data = {"viz_type": "baz"} + assert apply_post_process(result, form_data) == result + + +def test_apply_post_process_without_result_format(): + """ + A query without result_format should raise an exception + """ + result = {"queries": [{"result_format": "foo"}]} + form_data = {"viz_type": "pivot_table"} + + with raises(Exception) as ex: + apply_post_process(result, form_data) + + assert ex.match("Result format foo not supported") == True + + +def test_apply_post_process_json_format(): + """ + It should be able to process json results + """ + + result = { + "queries": [ + { + "result_format": ChartDataResultFormat.JSON, + "data": { + "result": [ + { + "data": [{"COUNT(is_software_dev)": 4725}], + "colnames": ["COUNT(is_software_dev)"], + "coltypes": [0], + } + ] + }, + } + ] + } + form_data = { + "datasource": "19__table", + "viz_type": "pivot_table_v2", + "slice_id": 69, + "url_params": {}, + "granularity_sqla": "time_start", + "time_grain_sqla": "P1D", + "time_range": "No filter", + "groupbyColumns": [], + "groupbyRows": [], + "metrics": [ + { + "aggregate": "COUNT", + "column": { + "column_name": "is_software_dev", + "description": None, + "expression": None, + "filterable": True, + "groupby": True, + "id": 1463, + "is_dttm": False, + "python_date_format": None, + "type": "DOUBLE PRECISION", + "verbose_name": None, + }, + "expressionType": "SIMPLE", + "hasCustomLabel": False, + "isNew": False, + "label": "COUNT(is_software_dev)", + "optionName": "metric_9i1kctig9yr_sizo6ihd2o", + "sqlExpression": None, + } + ], + "metricsLayout": "COLUMNS", + "adhoc_filters": [ + { + "clause": "WHERE", + "comparator": "Currently A Developer", + "expressionType": "SIMPLE", + "filterOptionName": "filter_fvi0jg9aii_2lekqrhy7qk", + "isExtra": False, + "isNew": False, + "operator": "==", + "sqlExpression": None, + "subject": "developer_type", + } + ], + "row_limit": 10000, + "order_desc": True, + "aggregateFunction": "Sum", + "valueFormat": "SMART_NUMBER", + "date_format": "smart_date", + "rowOrder": "key_a_to_z", + "colOrder": "key_a_to_z", + "extra_form_data": {}, + "force": False, + "result_format": "json", + "result_type": "results", + } + + assert apply_post_process(result, form_data) == { + "queries": [ + { + "result_format": ChartDataResultFormat.JSON, + "data": { + "result": { + "Total (Sum)": { + "data": [{"COUNT(is_software_dev)": 4725}], + "colnames": ["COUNT(is_software_dev)"], + "coltypes": [0], + } + } + }, + "colnames": [("result",)], + "indexnames": [("Total (Sum)",)], + "coltypes": [GenericDataType.STRING], + "rowcount": 1, + } + ] + } + + +def test_apply_post_process_csv_format(): + """ + It should be able to process csv results + """ + + result = { + "queries": [ + { + "result_format": ChartDataResultFormat.CSV, + "data": """ +COUNT(is_software_dev) +4725 +""", + } + ] + } + form_data = { + "datasource": "19__table", + "viz_type": "pivot_table_v2", + "slice_id": 69, + "url_params": {}, + "granularity_sqla": "time_start", + "time_grain_sqla": "P1D", + "time_range": "No filter", + "groupbyColumns": [], + "groupbyRows": [], + "metrics": [ + { + "aggregate": "COUNT", + "column": { + "column_name": "is_software_dev", + "description": None, + "expression": None, + "filterable": True, + "groupby": True, + "id": 1463, + "is_dttm": False, + "python_date_format": None, + "type": "DOUBLE PRECISION", + "verbose_name": None, + }, + "expressionType": "SIMPLE", + "hasCustomLabel": False, + "isNew": False, + "label": "COUNT(is_software_dev)", + "optionName": "metric_9i1kctig9yr_sizo6ihd2o", + "sqlExpression": None, + } + ], + "metricsLayout": "COLUMNS", + "adhoc_filters": [ + { + "clause": "WHERE", + "comparator": "Currently A Developer", + "expressionType": "SIMPLE", + "filterOptionName": "filter_fvi0jg9aii_2lekqrhy7qk", + "isExtra": False, + "isNew": False, + "operator": "==", + "sqlExpression": None, + "subject": "developer_type", + } + ], + "row_limit": 10000, + "order_desc": True, + "aggregateFunction": "Sum", + "valueFormat": "SMART_NUMBER", + "date_format": "smart_date", + "rowOrder": "key_a_to_z", + "colOrder": "key_a_to_z", + "extra_form_data": {}, + "force": False, + "result_format": "json", + "result_type": "results", + } + + assert apply_post_process(result, form_data) == { + "queries": [ + { + "result_format": ChartDataResultFormat.CSV, + "data": ",COUNT(is_software_dev)\nTotal (Sum),4725\n", + "colnames": [("COUNT(is_software_dev)",)], + "indexnames": [("Total (Sum)",)], + "coltypes": [GenericDataType.NUMERIC], + "rowcount": 1, + } + ] + } + + +def test_apply_post_process_csv_format_empty_string(): + """ + It should be able to process csv results with no data + """ + + result = {"queries": [{"result_format": ChartDataResultFormat.CSV, "data": ""}]} + form_data = { + "datasource": "19__table", + "viz_type": "pivot_table_v2", + "slice_id": 69, + "url_params": {}, + "granularity_sqla": "time_start", + "time_grain_sqla": "P1D", + "time_range": "No filter", + "groupbyColumns": [], + "groupbyRows": [], + "metrics": [ + { + "aggregate": "COUNT", + "column": { + "column_name": "is_software_dev", + "description": None, + "expression": None, + "filterable": True, + "groupby": True, + "id": 1463, + "is_dttm": False, + "python_date_format": None, + "type": "DOUBLE PRECISION", + "verbose_name": None, + }, + "expressionType": "SIMPLE", + "hasCustomLabel": False, + "isNew": False, + "label": "COUNT(is_software_dev)", + "optionName": "metric_9i1kctig9yr_sizo6ihd2o", + "sqlExpression": None, + } + ], + "metricsLayout": "COLUMNS", + "adhoc_filters": [ + { + "clause": "WHERE", + "comparator": "Currently A Developer", + "expressionType": "SIMPLE", + "filterOptionName": "filter_fvi0jg9aii_2lekqrhy7qk", + "isExtra": False, + "isNew": False, + "operator": "==", + "sqlExpression": None, + "subject": "developer_type", + } + ], + "row_limit": 10000, + "order_desc": True, + "aggregateFunction": "Sum", + "valueFormat": "SMART_NUMBER", + "date_format": "smart_date", + "rowOrder": "key_a_to_z", + "colOrder": "key_a_to_z", + "extra_form_data": {}, + "force": False, + "result_format": "json", + "result_type": "results", + } + + assert apply_post_process(result, form_data) == { + "queries": [{"result_format": ChartDataResultFormat.CSV, "data": ""}] + } + + +def test_apply_post_process_csv_format_no_data(): + """ + It should be able to process csv results with no data + """ + + result = {"queries": [{"result_format": ChartDataResultFormat.CSV, "data": None}]} + form_data = { + "datasource": "19__table", + "viz_type": "pivot_table_v2", + "slice_id": 69, + "url_params": {}, + "granularity_sqla": "time_start", + "time_grain_sqla": "P1D", + "time_range": "No filter", + "groupbyColumns": [], + "groupbyRows": [], + "metrics": [ + { + "aggregate": "COUNT", + "column": { + "column_name": "is_software_dev", + "description": None, + "expression": None, + "filterable": True, + "groupby": True, + "id": 1463, + "is_dttm": False, + "python_date_format": None, + "type": "DOUBLE PRECISION", + "verbose_name": None, + }, + "expressionType": "SIMPLE", + "hasCustomLabel": False, + "isNew": False, + "label": "COUNT(is_software_dev)", + "optionName": "metric_9i1kctig9yr_sizo6ihd2o", + "sqlExpression": None, + } + ], + "metricsLayout": "COLUMNS", + "adhoc_filters": [ + { + "clause": "WHERE", + "comparator": "Currently A Developer", + "expressionType": "SIMPLE", + "filterOptionName": "filter_fvi0jg9aii_2lekqrhy7qk", + "isExtra": False, + "isNew": False, + "operator": "==", + "sqlExpression": None, + "subject": "developer_type", + } + ], + "row_limit": 10000, + "order_desc": True, + "aggregateFunction": "Sum", + "valueFormat": "SMART_NUMBER", + "date_format": "smart_date", + "rowOrder": "key_a_to_z", + "colOrder": "key_a_to_z", + "extra_form_data": {}, + "force": False, + "result_format": "json", + "result_type": "results", + } + + assert apply_post_process(result, form_data) == { + "queries": [{"result_format": ChartDataResultFormat.CSV, "data": None}] + } + + +def test_apply_post_process_csv_format_no_data_multiple_queries(): + """ + It should be able to process csv results multiple queries if one query has no data + """ + + result = { + "queries": [ + {"result_format": ChartDataResultFormat.CSV, "data": ""}, + { + "result_format": ChartDataResultFormat.CSV, + "data": """ +COUNT(is_software_dev) +4725 +""", + }, + ] + } + form_data = { + "datasource": "19__table", + "viz_type": "pivot_table_v2", + "slice_id": 69, + "url_params": {}, + "granularity_sqla": "time_start", + "time_grain_sqla": "P1D", + "time_range": "No filter", + "groupbyColumns": [], + "groupbyRows": [], + "metrics": [ + { + "aggregate": "COUNT", + "column": { + "column_name": "is_software_dev", + "description": None, + "expression": None, + "filterable": True, + "groupby": True, + "id": 1463, + "is_dttm": False, + "python_date_format": None, + "type": "DOUBLE PRECISION", + "verbose_name": None, + }, + "expressionType": "SIMPLE", + "hasCustomLabel": False, + "isNew": False, + "label": "COUNT(is_software_dev)", + "optionName": "metric_9i1kctig9yr_sizo6ihd2o", + "sqlExpression": None, + } + ], + "metricsLayout": "COLUMNS", + "adhoc_filters": [ + { + "clause": "WHERE", + "comparator": "Currently A Developer", + "expressionType": "SIMPLE", + "filterOptionName": "filter_fvi0jg9aii_2lekqrhy7qk", + "isExtra": False, + "isNew": False, + "operator": "==", + "sqlExpression": None, + "subject": "developer_type", + } + ], + "row_limit": 10000, + "order_desc": True, + "aggregateFunction": "Sum", + "valueFormat": "SMART_NUMBER", + "date_format": "smart_date", + "rowOrder": "key_a_to_z", + "colOrder": "key_a_to_z", + "extra_form_data": {}, + "force": False, + "result_format": "json", + "result_type": "results", + } + + assert apply_post_process(result, form_data) == { + "queries": [ + {"result_format": ChartDataResultFormat.CSV, "data": ""}, + { + "result_format": ChartDataResultFormat.CSV, + "data": ",COUNT(is_software_dev)\nTotal (Sum),4725\n", + "colnames": [("COUNT(is_software_dev)",)], + "indexnames": [("Total (Sum)",)], + "coltypes": [GenericDataType.NUMERIC], + "rowcount": 1, + }, + ] + } + + +def test_apply_post_process_json_format_empty_string(): + """ + It should be able to process json results with no data + """ + + result = {"queries": [{"result_format": ChartDataResultFormat.JSON, "data": ""}]} + form_data = { + "datasource": "19__table", + "viz_type": "pivot_table_v2", + "slice_id": 69, + "url_params": {}, + "granularity_sqla": "time_start", + "time_grain_sqla": "P1D", + "time_range": "No filter", + "groupbyColumns": [], + "groupbyRows": [], + "metrics": [ + { + "aggregate": "COUNT", + "column": { + "column_name": "is_software_dev", + "description": None, + "expression": None, + "filterable": True, + "groupby": True, + "id": 1463, + "is_dttm": False, + "python_date_format": None, + "type": "DOUBLE PRECISION", + "verbose_name": None, + }, + "expressionType": "SIMPLE", + "hasCustomLabel": False, + "isNew": False, + "label": "COUNT(is_software_dev)", + "optionName": "metric_9i1kctig9yr_sizo6ihd2o", + "sqlExpression": None, + } + ], + "metricsLayout": "COLUMNS", + "adhoc_filters": [ + { + "clause": "WHERE", + "comparator": "Currently A Developer", + "expressionType": "SIMPLE", + "filterOptionName": "filter_fvi0jg9aii_2lekqrhy7qk", + "isExtra": False, + "isNew": False, + "operator": "==", + "sqlExpression": None, + "subject": "developer_type", + } + ], + "row_limit": 10000, + "order_desc": True, + "aggregateFunction": "Sum", + "valueFormat": "SMART_NUMBER", + "date_format": "smart_date", + "rowOrder": "key_a_to_z", + "colOrder": "key_a_to_z", + "extra_form_data": {}, + "force": False, + "result_format": "json", + "result_type": "results", + } + + assert apply_post_process(result, form_data) == { + "queries": [{"result_format": ChartDataResultFormat.JSON, "data": ""}] + } + + +def test_apply_post_process_json_format_data_is_none(): + """ + It should be able to process json results with no data + """ + + result = {"queries": [{"result_format": ChartDataResultFormat.JSON, "data": None}]} + form_data = { + "datasource": "19__table", + "viz_type": "pivot_table_v2", + "slice_id": 69, + "url_params": {}, + "granularity_sqla": "time_start", + "time_grain_sqla": "P1D", + "time_range": "No filter", + "groupbyColumns": [], + "groupbyRows": [], + "metrics": [ + { + "aggregate": "COUNT", + "column": { + "column_name": "is_software_dev", + "description": None, + "expression": None, + "filterable": True, + "groupby": True, + "id": 1463, + "is_dttm": False, + "python_date_format": None, + "type": "DOUBLE PRECISION", + "verbose_name": None, + }, + "expressionType": "SIMPLE", + "hasCustomLabel": False, + "isNew": False, + "label": "COUNT(is_software_dev)", + "optionName": "metric_9i1kctig9yr_sizo6ihd2o", + "sqlExpression": None, + } + ], + "metricsLayout": "COLUMNS", + "adhoc_filters": [ + { + "clause": "WHERE", + "comparator": "Currently A Developer", + "expressionType": "SIMPLE", + "filterOptionName": "filter_fvi0jg9aii_2lekqrhy7qk", + "isExtra": False, + "isNew": False, + "operator": "==", + "sqlExpression": None, + "subject": "developer_type", + } + ], + "row_limit": 10000, + "order_desc": True, + "aggregateFunction": "Sum", + "valueFormat": "SMART_NUMBER", + "date_format": "smart_date", + "rowOrder": "key_a_to_z", + "colOrder": "key_a_to_z", + "extra_form_data": {}, + "force": False, + "result_format": "json", + "result_type": "results", + } + + assert apply_post_process(result, form_data) == { + "queries": [{"result_format": ChartDataResultFormat.JSON, "data": None}] + } + + +def test_apply_post_process_verbose_map(session: Session): + from superset.connectors.sqla.models import SqlaTable, SqlMetric + from superset.models.core import Database + + engine = session.get_bind() + SqlaTable.metadata.create_all(engine) # pylint: disable=no-member + db = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + sqla_table = SqlaTable( + table_name="my_sqla_table", + columns=[], + metrics=[ + SqlMetric( + metric_name="count", + verbose_name="COUNT(*)", + metric_type="count", + expression="COUNT(*)", + ) + ], + database=db, + ) + + result = { + "queries": [ + { + "result_format": ChartDataResultFormat.JSON, + "data": [{"count": 4725}], + } + ] + } + form_data = { + "datasource": "19__table", + "viz_type": "pivot_table_v2", + "slice_id": 69, + "url_params": {}, + "granularity_sqla": "time_start", + "time_grain_sqla": "P1D", + "time_range": "No filter", + "groupbyColumns": [], + "groupbyRows": [], + "metrics": ["COUNT(*)"], + "metricsLayout": "COLUMNS", + "row_limit": 10000, + "order_desc": True, + "valueFormat": "SMART_NUMBER", + "date_format": "smart_date", + "rowOrder": "key_a_to_z", + "colOrder": "key_a_to_z", + "extra_form_data": {}, + "force": False, + "result_format": "json", + "result_type": "results", + } + + assert apply_post_process(result, form_data, datasource=sqla_table) == { + "queries": [ + { + "result_format": ChartDataResultFormat.JSON, + "data": {"COUNT(*)": {"Total (Sum)": 4725}}, + "colnames": [("COUNT(*)",)], + "indexnames": [("Total (Sum)",)], + "coltypes": [GenericDataType.NUMERIC], + "rowcount": 1, + } + ] + } diff --git a/tests/unit_tests/columns/test_models.py b/tests/unit_tests/columns/test_models.py index 40cc2075d380..068557e7a6a7 100644 --- a/tests/unit_tests/columns/test_models.py +++ b/tests/unit_tests/columns/test_models.py @@ -20,7 +20,7 @@ from sqlalchemy.orm.session import Session -def test_column_model(app_context: None, session: Session) -> None: +def test_column_model(session: Session) -> None: """ Test basic attributes of a ``Column``. """ diff --git a/tests/unit_tests/commands/export_test.py b/tests/unit_tests/commands/export_test.py index 91aebf1b684e..24fa49166404 100644 --- a/tests/unit_tests/commands/export_test.py +++ b/tests/unit_tests/commands/export_test.py @@ -20,7 +20,7 @@ from pytest_mock import MockFixture -def test_export_assets_command(mocker: MockFixture, app_context: None) -> None: +def test_export_assets_command(mocker: MockFixture) -> None: """ Test that all assets are exported correctly. """ diff --git a/tests/unit_tests/commands/importers/__init__.py b/tests/unit_tests/commands/importers/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/unit_tests/commands/importers/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/unit_tests/commands/importers/v1/__init__.py b/tests/unit_tests/commands/importers/v1/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/unit_tests/commands/importers/v1/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/unit_tests/commands/importers/v1/assets_test.py b/tests/unit_tests/commands/importers/v1/assets_test.py new file mode 100644 index 000000000000..1a345ff2b913 --- /dev/null +++ b/tests/unit_tests/commands/importers/v1/assets_test.py @@ -0,0 +1,131 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import copy + +from sqlalchemy.orm.session import Session +from sqlalchemy.sql import select + +from tests.unit_tests.fixtures.assets_configs import ( + charts_config_1, + charts_config_2, + dashboards_config_1, + dashboards_config_2, + databases_config, + datasets_config, +) + + +def test_import_new_assets(session: Session) -> None: + """ + Test that all new assets are imported correctly. + """ + from superset.commands.importers.v1.assets import ImportAssetsCommand + from superset.models.dashboard import dashboard_slices + from superset.models.slice import Slice + + engine = session.get_bind() + Slice.metadata.create_all(engine) # pylint: disable=no-member + configs = { + **copy.deepcopy(databases_config), + **copy.deepcopy(datasets_config), + **copy.deepcopy(charts_config_1), + **copy.deepcopy(dashboards_config_1), + } + expected_number_of_dashboards = len(dashboards_config_1) + expected_number_of_charts = len(charts_config_1) + + ImportAssetsCommand._import(session, configs) + dashboard_ids = session.scalars( + select(dashboard_slices.c.dashboard_id).distinct() + ).all() + chart_ids = session.scalars(select(dashboard_slices.c.slice_id)).all() + + assert len(chart_ids) == expected_number_of_charts + assert len(dashboard_ids) == expected_number_of_dashboards + + +def test_import_adds_dashboard_charts(session: Session) -> None: + """ + Test that existing dashboards are updated with new charts. + """ + from superset.commands.importers.v1.assets import ImportAssetsCommand + from superset.models.dashboard import dashboard_slices + from superset.models.slice import Slice + + engine = session.get_bind() + Slice.metadata.create_all(engine) # pylint: disable=no-member + base_configs = { + **copy.deepcopy(databases_config), + **copy.deepcopy(datasets_config), + **copy.deepcopy(charts_config_2), + **copy.deepcopy(dashboards_config_2), + } + new_configs = { + **copy.deepcopy(databases_config), + **copy.deepcopy(datasets_config), + **copy.deepcopy(charts_config_1), + **copy.deepcopy(dashboards_config_1), + } + expected_number_of_dashboards = len(dashboards_config_1) + expected_number_of_charts = len(charts_config_1) + + ImportAssetsCommand._import(session, base_configs) + ImportAssetsCommand._import(session, new_configs) + dashboard_ids = session.scalars( + select(dashboard_slices.c.dashboard_id).distinct() + ).all() + chart_ids = session.scalars(select(dashboard_slices.c.slice_id)).all() + + assert len(chart_ids) == expected_number_of_charts + assert len(dashboard_ids) == expected_number_of_dashboards + + +def test_import_removes_dashboard_charts(session: Session) -> None: + """ + Test that existing dashboards are updated without old charts. + """ + from superset.commands.importers.v1.assets import ImportAssetsCommand + from superset.models.dashboard import dashboard_slices + from superset.models.slice import Slice + + engine = session.get_bind() + Slice.metadata.create_all(engine) # pylint: disable=no-member + base_configs = { + **copy.deepcopy(databases_config), + **copy.deepcopy(datasets_config), + **copy.deepcopy(charts_config_1), + **copy.deepcopy(dashboards_config_1), + } + new_configs = { + **copy.deepcopy(databases_config), + **copy.deepcopy(datasets_config), + **copy.deepcopy(charts_config_2), + **copy.deepcopy(dashboards_config_2), + } + expected_number_of_dashboards = len(dashboards_config_2) + expected_number_of_charts = len(charts_config_2) + + ImportAssetsCommand._import(session, base_configs) + ImportAssetsCommand._import(session, new_configs) + dashboard_ids = session.scalars( + select(dashboard_slices.c.dashboard_id).distinct() + ).all() + chart_ids = session.scalars(select(dashboard_slices.c.slice_id)).all() + + assert len(chart_ids) == expected_number_of_charts + assert len(dashboard_ids) == expected_number_of_dashboards diff --git a/tests/unit_tests/common/test_dataframe_utils.py b/tests/unit_tests/common/test_dataframe_utils.py new file mode 100644 index 000000000000..01fa4224c3c8 --- /dev/null +++ b/tests/unit_tests/common/test_dataframe_utils.py @@ -0,0 +1,50 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import datetime + +import pandas as pd + +from superset.common.utils import dataframe_utils + + +def test_is_datetime_series(): + assert not dataframe_utils.is_datetime_series(None) + assert not dataframe_utils.is_datetime_series(pd.DataFrame({"foo": [1]})) + assert not dataframe_utils.is_datetime_series(pd.Series([1, 2, 3])) + assert not dataframe_utils.is_datetime_series(pd.Series(["1", "2", "3"])) + assert not dataframe_utils.is_datetime_series(pd.Series()) + assert not dataframe_utils.is_datetime_series(pd.Series([None, None])) + assert dataframe_utils.is_datetime_series( + pd.Series([datetime.date(2018, 1, 1), datetime.date(2018, 1, 2), None]) + ) + assert dataframe_utils.is_datetime_series( + pd.Series([datetime.date(2018, 1, 1), datetime.date(2018, 1, 2)]) + ) + assert dataframe_utils.is_datetime_series( + pd.Series([datetime.datetime(2018, 1, 1), datetime.datetime(2018, 1, 2), None]) + ) + assert dataframe_utils.is_datetime_series( + pd.Series([datetime.datetime(2018, 1, 1), datetime.datetime(2018, 1, 2)]) + ) + assert dataframe_utils.is_datetime_series( + pd.date_range(datetime.date(2018, 1, 1), datetime.date(2018, 2, 1)).to_series() + ) + assert dataframe_utils.is_datetime_series( + pd.date_range( + datetime.datetime(2018, 1, 1), datetime.datetime(2018, 2, 1) + ).to_series() + ) diff --git a/tests/unit_tests/common/test_time_range_utils.py b/tests/unit_tests/common/test_time_range_utils.py new file mode 100644 index 000000000000..bde1bd4befc0 --- /dev/null +++ b/tests/unit_tests/common/test_time_range_utils.py @@ -0,0 +1,94 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from datetime import datetime +from unittest import mock + +import pytest + +from superset.common.utils.time_range_utils import ( + get_since_until_from_query_object, + get_since_until_from_time_range, +) + + +def test__get_since_until_from_time_range(): + assert get_since_until_from_time_range(time_range="2001 : 2002") == ( + datetime(2001, 1, 1), + datetime(2002, 1, 1), + ) + assert get_since_until_from_time_range( + time_range="2001 : 2002", time_shift="8 hours ago" + ) == ( + datetime(2000, 12, 31, 16, 0, 0), + datetime(2001, 12, 31, 16, 0, 0), + ) + with mock.patch( + "superset.utils.date_parser.EvalDateTruncFunc.eval", + return_value=datetime(2000, 1, 1, 0, 0, 0), + ): + assert ( + get_since_until_from_time_range( + time_range="Last year", + extras={ + "relative_end": "2100", + }, + ) + )[1] == datetime(2100, 1, 1, 0, 0) + with mock.patch( + "superset.utils.date_parser.EvalDateTruncFunc.eval", + return_value=datetime(2000, 1, 1, 0, 0, 0), + ): + assert ( + get_since_until_from_time_range( + time_range="Next year", + extras={ + "relative_start": "2000", + }, + ) + )[0] == datetime(2000, 1, 1, 0, 0) + + +@pytest.mark.query_object( + { + "time_range": "2001 : 2002", + "time_shift": "8 hours ago", + } +) +def test__since_until_from_time_range(dummy_query_object): + assert get_since_until_from_query_object(dummy_query_object) == ( + datetime(2000, 12, 31, 16, 0, 0), + datetime(2001, 12, 31, 16, 0, 0), + ) + + +@pytest.mark.query_object( + { + "filters": [{"col": "dttm", "op": "TEMPORAL_RANGE", "val": "2001 : 2002"}], + "columns": [ + { + "columnType": "BASE_AXIS", + "label": "dttm", + "sqlExpression": "dttm", + } + ], + } +) +def test__since_until_from_adhoc_filters(dummy_query_object): + assert get_since_until_from_query_object(dummy_query_object) == ( + datetime(2001, 1, 1, 0, 0, 0), + datetime(2002, 1, 1, 0, 0, 0), + ) diff --git a/tests/unit_tests/config_test.py b/tests/unit_tests/config_test.py new file mode 100644 index 000000000000..021193a6cd36 --- /dev/null +++ b/tests/unit_tests/config_test.py @@ -0,0 +1,330 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# pylint: disable=import-outside-toplevel, unused-argument, redefined-outer-name, invalid-name + +from functools import partial +from typing import Any, Dict, TYPE_CHECKING + +import pytest +from pytest_mock import MockerFixture +from sqlalchemy.orm.session import Session + +if TYPE_CHECKING: + from superset.connectors.sqla.models import SqlaTable + +FULL_DTTM_DEFAULTS_EXAMPLE = { + "main_dttm_col": "id", + "dttm_columns": { + "dttm": { + "python_date_format": "epoch_s", + "expression": "CAST(dttm as INTEGER)", + }, + "id": {"python_date_format": "epoch_ms"}, + "month": { + "python_date_format": "%Y-%m-%d", + "expression": ( + "CASE WHEN length(month) = 7 THEN month || '-01' ELSE month END" + ), + }, + }, +} + + +def apply_dttm_defaults(table: "SqlaTable", dttm_defaults: Dict[str, Any]) -> None: + """Applies dttm defaults to the table, mutates in place.""" + for dbcol in table.columns: + # Set is_dttm is column is listed in dttm_columns. + if dbcol.column_name in dttm_defaults.get("dttm_columns", {}): + dbcol.is_dttm = True + + # Skip non dttm columns. + if dbcol.column_name not in dttm_defaults.get("dttm_columns", {}): + continue + + # Set table main_dttm_col. + if dbcol.column_name == dttm_defaults.get("main_dttm_col"): + table.main_dttm_col = dbcol.column_name + + # Apply defaults if empty. + dttm_column_defaults = dttm_defaults.get("dttm_columns", {}).get( + dbcol.column_name, {} + ) + dbcol.is_dttm = True + if ( + not dbcol.python_date_format + and "python_date_format" in dttm_column_defaults + ): + dbcol.python_date_format = dttm_column_defaults["python_date_format"] + if not dbcol.expression and "expression" in dttm_column_defaults: + dbcol.expression = dttm_column_defaults["expression"] + + +@pytest.fixture +def test_table(session: Session) -> "SqlaTable": + """ + Fixture that generates an in-memory table. + """ + from superset.connectors.sqla.models import SqlaTable, TableColumn + from superset.models.core import Database + + engine = session.get_bind() + SqlaTable.metadata.create_all(engine) # pylint: disable=no-member + + columns = [ + TableColumn(column_name="ds", is_dttm=1, type="TIMESTAMP"), + TableColumn(column_name="event_time", is_dttm=1, type="TIMESTAMP"), + TableColumn(column_name="id", type="INTEGER"), + TableColumn(column_name="dttm", type="INTEGER"), + TableColumn(column_name="duration_ms", type="INTEGER"), + ] + + return SqlaTable( + table_name="test_table", + columns=columns, + metrics=[], + main_dttm_col=None, + database=Database(database_name="my_database", sqlalchemy_uri="sqlite://"), + ) + + +def test_main_dttm_col(mocker: MockerFixture, test_table: "SqlaTable") -> None: + """ + Test the ``SQLA_TABLE_MUTATOR`` config. + """ + dttm_defaults = { + "main_dttm_col": "event_time", + "dttm_columns": {"ds": {}, "event_time": {}}, + } + mocker.patch( + "superset.connectors.sqla.models.config", + new={ + "SQLA_TABLE_MUTATOR": partial( + apply_dttm_defaults, + dttm_defaults=dttm_defaults, + ) + }, + ) + mocker.patch( + "superset.connectors.sqla.models.get_physical_table_metadata", + return_value=[ + {"name": "ds", "type": "TIMESTAMP", "is_dttm": True}, + {"name": "event_time", "type": "TIMESTAMP", "is_dttm": True}, + {"name": "id", "type": "INTEGER", "is_dttm": False}, + ], + ) + + assert test_table.main_dttm_col is None + test_table.fetch_metadata() + assert test_table.main_dttm_col == "event_time" + + +def test_main_dttm_col_nonexistent( + mocker: MockerFixture, + test_table: "SqlaTable", +) -> None: + """ + Test the ``SQLA_TABLE_MUTATOR`` config when main datetime column doesn't exist. + """ + dttm_defaults = { + "main_dttm_col": "nonexistent", + } + mocker.patch( + "superset.connectors.sqla.models.config", + new={ + "SQLA_TABLE_MUTATOR": partial( + apply_dttm_defaults, + dttm_defaults=dttm_defaults, + ) + }, + ) + mocker.patch( + "superset.connectors.sqla.models.get_physical_table_metadata", + return_value=[ + {"name": "ds", "type": "TIMESTAMP", "is_dttm": True}, + {"name": "event_time", "type": "TIMESTAMP", "is_dttm": True}, + {"name": "id", "type": "INTEGER", "is_dttm": False}, + ], + ) + + assert test_table.main_dttm_col is None + test_table.fetch_metadata() + # fall back to ds + assert test_table.main_dttm_col == "ds" + + +def test_main_dttm_col_nondttm( + mocker: MockerFixture, + test_table: "SqlaTable", +) -> None: + """ + Test the ``SQLA_TABLE_MUTATOR`` config when main datetime column has wrong type. + """ + dttm_defaults = { + "main_dttm_col": "id", + } + mocker.patch( + "superset.connectors.sqla.models.config", + new={ + "SQLA_TABLE_MUTATOR": partial( + apply_dttm_defaults, + dttm_defaults=dttm_defaults, + ) + }, + ) + mocker.patch( + "superset.connectors.sqla.models.get_physical_table_metadata", + return_value=[ + {"name": "ds", "type": "TIMESTAMP", "is_dttm": True}, + {"name": "event_time", "type": "TIMESTAMP", "is_dttm": True}, + {"name": "id", "type": "INTEGER", "is_dttm": False}, + ], + ) + + assert test_table.main_dttm_col is None + test_table.fetch_metadata() + # fall back to ds + assert test_table.main_dttm_col == "ds" + + +def test_python_date_format_by_column_name( + mocker: MockerFixture, + test_table: "SqlaTable", +) -> None: + """ + Test the ``SQLA_TABLE_MUTATOR`` setting for "python_date_format". + """ + table_defaults = { + "dttm_columns": { + "id": {"python_date_format": "epoch_ms"}, + "dttm": {"python_date_format": "epoch_s"}, + "duration_ms": {"python_date_format": "invalid"}, + }, + } + mocker.patch( + "superset.connectors.sqla.models.config", + new={ + "SQLA_TABLE_MUTATOR": partial( + apply_dttm_defaults, + dttm_defaults=table_defaults, + ) + }, + ) + mocker.patch( + "superset.connectors.sqla.models.get_physical_table_metadata", + return_value=[ + {"name": "id", "type": "INTEGER", "is_dttm": False}, + {"name": "dttm", "type": "INTEGER", "is_dttm": False}, + {"name": "duration_ms", "type": "INTEGER", "is_dttm": False}, + ], + ) + + test_table.fetch_metadata() + + id_col = [c for c in test_table.columns if c.column_name == "id"][0] + assert id_col.is_dttm + assert id_col.python_date_format == "epoch_ms" + + dttm_col = [c for c in test_table.columns if c.column_name == "dttm"][0] + assert dttm_col.is_dttm + assert dttm_col.python_date_format == "epoch_s" + + duration_ms_col = [c for c in test_table.columns if c.column_name == "duration_ms"][ + 0 + ] + assert duration_ms_col.is_dttm + assert duration_ms_col.python_date_format == "invalid" + + +def test_expression_by_column_name( + mocker: MockerFixture, + test_table: "SqlaTable", +) -> None: + """ + Test the ``SQLA_TABLE_MUTATOR`` setting for expression. + """ + table_defaults = { + "dttm_columns": { + "dttm": {"expression": "CAST(dttm as INTEGER)"}, + "duration_ms": {"expression": "CAST(duration_ms as DOUBLE)"}, + }, + } + mocker.patch( + "superset.connectors.sqla.models.config", + new={ + "SQLA_TABLE_MUTATOR": partial( + apply_dttm_defaults, + dttm_defaults=table_defaults, + ) + }, + ) + mocker.patch( + "superset.connectors.sqla.models.get_physical_table_metadata", + return_value=[ + {"name": "dttm", "type": "INTEGER", "is_dttm": False}, + {"name": "duration_ms", "type": "INTEGER", "is_dttm": False}, + ], + ) + + test_table.fetch_metadata() + + dttm_col = [c for c in test_table.columns if c.column_name == "dttm"][0] + assert dttm_col.is_dttm + assert dttm_col.expression == "CAST(dttm as INTEGER)" + + duration_ms_col = [c for c in test_table.columns if c.column_name == "duration_ms"][ + 0 + ] + assert duration_ms_col.is_dttm + assert duration_ms_col.expression == "CAST(duration_ms as DOUBLE)" + + +def test_full_setting( + mocker: MockerFixture, + test_table: "SqlaTable", +) -> None: + """ + Test the ``SQLA_TABLE_MUTATOR`` with full settings. + """ + mocker.patch( + "superset.connectors.sqla.models.config", + new={ + "SQLA_TABLE_MUTATOR": partial( + apply_dttm_defaults, + dttm_defaults=FULL_DTTM_DEFAULTS_EXAMPLE, + ) + }, + ) + mocker.patch( + "superset.connectors.sqla.models.get_physical_table_metadata", + return_value=[ + {"name": "id", "type": "INTEGER", "is_dttm": False}, + {"name": "dttm", "type": "INTEGER", "is_dttm": False}, + {"name": "duration_ms", "type": "INTEGER", "is_dttm": False}, + ], + ) + + test_table.fetch_metadata() + + id_col = [c for c in test_table.columns if c.column_name == "id"][0] + assert id_col.is_dttm + assert id_col.python_date_format == "epoch_ms" + assert id_col.expression == "" + + dttm_col = [c for c in test_table.columns if c.column_name == "dttm"][0] + assert dttm_col.is_dttm + assert dttm_col.python_date_format == "epoch_s" + assert dttm_col.expression == "CAST(dttm as INTEGER)" diff --git a/tests/unit_tests/conftest.py b/tests/unit_tests/conftest.py index 274aff819446..52c372ea5928 100644 --- a/tests/unit_tests/conftest.py +++ b/tests/unit_tests/conftest.py @@ -17,9 +17,12 @@ # pylint: disable=redefined-outer-name, import-outside-toplevel import importlib +import os +import unittest.mock from typing import Any, Callable, Iterator import pytest +from _pytest.fixtures import SubRequest from pytest_mock import MockFixture from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker @@ -27,6 +30,8 @@ from superset import security_manager from superset.app import SupersetApp +from superset.common.chart_data import ChartDataResultType +from superset.common.query_object_factory import QueryObjectFactory from superset.extensions import appbuilder from superset.initialization import SupersetAppInitializer @@ -46,10 +51,15 @@ def get_session(): in_memory_session.remove = lambda: None # patch session - mocker.patch( + get_session = mocker.patch( "superset.security.SupersetSecurityManager.get_session", - return_value=in_memory_session, ) + get_session.return_value = in_memory_session + # FAB calls get_session.get_bind() to get a handler to the engine + get_session.get_bind.return_value = engine + # Allow for queries on security manager + get_session.query = in_memory_session.query + mocker.patch("superset.db.session", in_memory_session) return in_memory_session @@ -62,17 +72,25 @@ def session(get_session) -> Iterator[Session]: @pytest.fixture(scope="module") -def app() -> Iterator[SupersetApp]: +def app(request: SubRequest) -> Iterator[SupersetApp]: """ A fixture that generates a Superset app. """ app = SupersetApp(__name__) app.config.from_object("superset.config") - app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite://" + app.config["SQLALCHEMY_DATABASE_URI"] = ( + os.environ.get("SUPERSET__SQLALCHEMY_DATABASE_URI") or "sqlite://" + ) app.config["WTF_CSRF_ENABLED"] = False + app.config["PREVENT_UNSAFE_DB_CONNECTIONS"] = False app.config["TESTING"] = True + # loop over extra configs passed in by tests + if request and hasattr(request, "param"): + for key, val in request.param.items(): + app.config[key] = val + # ``superset.extensions.appbuilder`` is a singleton, and won't rebuild the # routes when this fixture is called multiple times; we need to clear the # registered views to ensure the initialization can happen more than once. @@ -96,7 +114,7 @@ def client(app: SupersetApp) -> Any: yield client -@pytest.fixture +@pytest.fixture(autouse=True) def app_context(app: SupersetApp) -> Iterator[None]: """ A fixture that yields and application context. @@ -120,3 +138,27 @@ def full_api_access(mocker: MockFixture) -> Iterator[None]: mocker.patch.object(security_manager, "can_access_all_databases", return_value=True) yield + + +@pytest.fixture +def dummy_query_object(request, app_context): + query_obj_marker = request.node.get_closest_marker("query_object") + result_type_marker = request.node.get_closest_marker("result_type") + + if query_obj_marker is None: + query_object = {} + else: + query_object = query_obj_marker.args[0] + + if result_type_marker is None: + result_type = ChartDataResultType.FULL + else: + result_type = result_type_marker.args[0] + + yield QueryObjectFactory( + app_configurations={ + "ROW_LIMIT": 100, + }, + _datasource_dao=unittest.mock.Mock(), + session_maker=unittest.mock.Mock(), + ).create(parent_result_type=result_type, **query_object) diff --git a/tests/unit_tests/core_tests.py b/tests/unit_tests/core_tests.py index f7a0047157bb..1473f1838295 100644 --- a/tests/unit_tests/core_tests.py +++ b/tests/unit_tests/core_tests.py @@ -30,7 +30,6 @@ get_metric_names, get_time_filter_status, is_adhoc_metric, - NO_TIME_RANGE, ) from tests.unit_tests.fixtures.datasets import get_dataset_mock @@ -105,6 +104,18 @@ def test_get_metric_name_invalid_metric(): with pytest.raises(ValueError): get_metric_name(metric) + metric = deepcopy(SQL_ADHOC_METRIC) + del metric["expressionType"] + with pytest.raises(ValueError): + get_metric_name(metric) + + with pytest.raises(ValueError): + get_metric_name(None) + with pytest.raises(ValueError): + get_metric_name(0) + with pytest.raises(ValueError): + get_metric_name({}) + def test_get_metric_names(): assert get_metric_names( diff --git a/tests/unit_tests/dao/queries_test.py b/tests/unit_tests/dao/queries_test.py index 8df6d2066aac..62eeff31065e 100644 --- a/tests/unit_tests/dao/queries_test.py +++ b/tests/unit_tests/dao/queries_test.py @@ -15,13 +15,17 @@ # specific language governing permissions and limitations # under the License. import json -from typing import Iterator +from datetime import datetime, timedelta +from typing import Any, Iterator import pytest +from pytest_mock import MockFixture from sqlalchemy.orm.session import Session +from superset.exceptions import QueryNotFoundException, SupersetCancelQueryException -def test_query_dao_save_metadata(app_context: None, session: Session) -> None: + +def test_query_dao_save_metadata(session: Session) -> None: from superset.models.core import Database from superset.models.sql_lab import Query @@ -53,3 +57,218 @@ def test_query_dao_save_metadata(app_context: None, session: Session) -> None: query = session.query(Query).one() QueryDAO.save_metadata(query=query, payload={"columns": []}) assert query.extra.get("columns", None) == [] + + +def test_query_dao_get_queries_changed_after(session: Session) -> None: + from superset.models.core import Database + from superset.models.sql_lab import Query + + engine = session.get_bind() + Query.metadata.create_all(engine) # pylint: disable=no-member + + db = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + + now = datetime.utcnow() + + old_query_obj = Query( + client_id="foo", + database=db, + tab_name="test_tab", + sql_editor_id="test_editor_id", + sql="select * from bar", + select_sql="select * from bar", + executed_sql="select * from bar", + limit=100, + select_as_cta=False, + rows=100, + error_message="none", + results_key="abc", + changed_on=now - timedelta(days=3), + ) + + updated_query_obj = Query( + client_id="updated_foo", + database=db, + tab_name="test_tab", + sql_editor_id="test_editor_id", + sql="select * from foo", + select_sql="select * from foo", + executed_sql="select * from foo", + limit=100, + select_as_cta=False, + rows=100, + error_message="none", + results_key="abc", + changed_on=now - timedelta(days=1), + ) + + session.add(db) + session.add(old_query_obj) + session.add(updated_query_obj) + + from superset.queries.dao import QueryDAO + + timestamp = datetime.timestamp(now - timedelta(days=2)) * 1000 + result = QueryDAO.get_queries_changed_after(timestamp) + assert len(result) == 1 + assert result[0].client_id == "updated_foo" + + +def test_query_dao_stop_query_not_found( + mocker: MockFixture, app: Any, session: Session +) -> None: + from superset.common.db_query_status import QueryStatus + from superset.models.core import Database + from superset.models.sql_lab import Query + + engine = session.get_bind() + Query.metadata.create_all(engine) # pylint: disable=no-member + + db = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + + query_obj = Query( + client_id="foo", + database=db, + tab_name="test_tab", + sql_editor_id="test_editor_id", + sql="select * from bar", + select_sql="select * from bar", + executed_sql="select * from bar", + limit=100, + select_as_cta=False, + rows=100, + error_message="none", + results_key="abc", + status=QueryStatus.RUNNING, + ) + + session.add(db) + session.add(query_obj) + + mocker.patch("superset.sql_lab.cancel_query", return_value=False) + + from superset.queries.dao import QueryDAO + + with pytest.raises(QueryNotFoundException): + QueryDAO.stop_query("foo2") + + query = session.query(Query).one() + assert query.status == QueryStatus.RUNNING + + +def test_query_dao_stop_query_not_running( + mocker: MockFixture, app: Any, session: Session +) -> None: + from superset.common.db_query_status import QueryStatus + from superset.models.core import Database + from superset.models.sql_lab import Query + + engine = session.get_bind() + Query.metadata.create_all(engine) # pylint: disable=no-member + + db = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + + query_obj = Query( + client_id="foo", + database=db, + tab_name="test_tab", + sql_editor_id="test_editor_id", + sql="select * from bar", + select_sql="select * from bar", + executed_sql="select * from bar", + limit=100, + select_as_cta=False, + rows=100, + error_message="none", + results_key="abc", + status=QueryStatus.FAILED, + ) + + session.add(db) + session.add(query_obj) + + from superset.queries.dao import QueryDAO + + QueryDAO.stop_query(query_obj.client_id) + query = session.query(Query).one() + assert query.status == QueryStatus.FAILED + + +def test_query_dao_stop_query_failed( + mocker: MockFixture, app: Any, session: Session +) -> None: + from superset.common.db_query_status import QueryStatus + from superset.models.core import Database + from superset.models.sql_lab import Query + + engine = session.get_bind() + Query.metadata.create_all(engine) # pylint: disable=no-member + + db = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + + query_obj = Query( + client_id="foo", + database=db, + tab_name="test_tab", + sql_editor_id="test_editor_id", + sql="select * from bar", + select_sql="select * from bar", + executed_sql="select * from bar", + limit=100, + select_as_cta=False, + rows=100, + error_message="none", + results_key="abc", + status=QueryStatus.RUNNING, + ) + + session.add(db) + session.add(query_obj) + + mocker.patch("superset.sql_lab.cancel_query", return_value=False) + + from superset.queries.dao import QueryDAO + + with pytest.raises(SupersetCancelQueryException): + QueryDAO.stop_query(query_obj.client_id) + + query = session.query(Query).one() + assert query.status == QueryStatus.RUNNING + + +def test_query_dao_stop_query(mocker: MockFixture, app: Any, session: Session) -> None: + from superset.common.db_query_status import QueryStatus + from superset.models.core import Database + from superset.models.sql_lab import Query + + engine = session.get_bind() + Query.metadata.create_all(engine) # pylint: disable=no-member + + db = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + + query_obj = Query( + client_id="foo", + database=db, + tab_name="test_tab", + sql_editor_id="test_editor_id", + sql="select * from bar", + select_sql="select * from bar", + executed_sql="select * from bar", + limit=100, + select_as_cta=False, + rows=100, + error_message="none", + results_key="abc", + status=QueryStatus.RUNNING, + ) + + session.add(db) + session.add(query_obj) + + mocker.patch("superset.sql_lab.cancel_query", return_value=True) + + from superset.queries.dao import QueryDAO + + QueryDAO.stop_query(query_obj.client_id) + query = session.query(Query).one() + assert query.status == QueryStatus.STOPPED diff --git a/tests/unit_tests/dashboards/commands/importers/v1/import_test.py b/tests/unit_tests/dashboards/commands/importers/v1/import_test.py index 651e5dc10b7c..08f681d916b3 100644 --- a/tests/unit_tests/dashboards/commands/importers/v1/import_test.py +++ b/tests/unit_tests/dashboards/commands/importers/v1/import_test.py @@ -21,7 +21,7 @@ from sqlalchemy.orm.session import Session -def test_import_dashboard(app_context: None, session: Session) -> None: +def test_import_dashboard(session: Session) -> None: """ Test importing a dashboard. """ @@ -43,9 +43,7 @@ def test_import_dashboard(app_context: None, session: Session) -> None: assert dashboard.external_url is None -def test_import_dashboard_managed_externally( - app_context: None, session: Session -) -> None: +def test_import_dashboard_managed_externally(session: Session) -> None: """ Test importing a dashboard that is managed externally. """ diff --git a/tests/unit_tests/dashboards/commands/importers/v1/utils_test.py b/tests/unit_tests/dashboards/commands/importers/v1/utils_test.py index bddc96eda36e..0392acb31596 100644 --- a/tests/unit_tests/dashboards/commands/importers/v1/utils_test.py +++ b/tests/unit_tests/dashboards/commands/importers/v1/utils_test.py @@ -82,7 +82,7 @@ def test_update_id_refs_immune_missing( # pylint: disable=invalid-name } -def test_update_native_filter_config_scope_excluded(app_context: None): +def test_update_native_filter_config_scope_excluded(): from superset.dashboards.commands.importers.v1.utils import update_id_refs config = { diff --git a/tests/unit_tests/databases/api_test.py b/tests/unit_tests/databases/api_test.py index 2d20e5346f43..68a9add12e9a 100644 --- a/tests/unit_tests/databases/api_test.py +++ b/tests/unit_tests/databases/api_test.py @@ -17,10 +17,147 @@ # pylint: disable=unused-argument, import-outside-toplevel, line-too-long +import json from io import BytesIO from typing import Any +from uuid import UUID import pytest +from pytest_mock import MockFixture +from sqlalchemy.orm.session import Session + + +def test_post_with_uuid( + session: Session, + client: Any, + full_api_access: None, +) -> None: + """ + Test that we can set the database UUID when creating it. + """ + from superset.models.core import Database + + # create table for databases + Database.metadata.create_all(session.get_bind()) # pylint: disable=no-member + + response = client.post( + "/api/v1/database/", + json={ + "database_name": "my_db", + "sqlalchemy_uri": "sqlite://", + "uuid": "7c1b7880-a59d-47cd-8bf1-f1eb8d2863cb", + }, + ) + assert response.status_code == 201 + + database = session.query(Database).one() + assert database.uuid == UUID("7c1b7880-a59d-47cd-8bf1-f1eb8d2863cb") + + +def test_password_mask( + mocker: MockFixture, + app: Any, + session: Session, + client: Any, + full_api_access: None, +) -> None: + """ + Test that sensitive information is masked. + """ + from superset.databases.api import DatabaseRestApi + from superset.models.core import Database + + DatabaseRestApi.datamodel.session = session + + # create table for databases + Database.metadata.create_all(session.get_bind()) # pylint: disable=no-member + + database = Database( + database_name="my_database", + sqlalchemy_uri="gsheets://", + encrypted_extra=json.dumps( + { + "service_account_info": { + "type": "service_account", + "project_id": "black-sanctum-314419", + "private_key_id": "259b0d419a8f840056158763ff54d8b08f7b8173", + "private_key": "SECRET", + "client_email": "google-spreadsheets-demo-servi@black-sanctum-314419.iam.gserviceaccount.com", + "client_id": "114567578578109757129", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/google-spreadsheets-demo-servi%40black-sanctum-314419.iam.gserviceaccount.com", + }, + } + ), + ) + session.add(database) + session.commit() + + # mock the lookup so that we don't need to include the driver + mocker.patch("sqlalchemy.engine.URL.get_driver_name", return_value="gsheets") + mocker.patch("superset.utils.log.DBEventLogger.log") + + response = client.get("/api/v1/database/1") + assert ( + response.json["result"]["parameters"]["service_account_info"]["private_key"] + == "XXXXXXXXXX" + ) + assert "encrypted_extra" not in response.json["result"] + + +@pytest.mark.skip(reason="Works locally but fails on CI") +def test_update_with_password_mask( + app: Any, + session: Session, + client: Any, + full_api_access: None, +) -> None: + """ + Test that an update with a masked password doesn't overwrite the existing password. + """ + from superset.databases.api import DatabaseRestApi + from superset.models.core import Database + + DatabaseRestApi.datamodel.session = session + + # create table for databases + Database.metadata.create_all(session.get_bind()) # pylint: disable=no-member + + database = Database( + database_name="my_database", + sqlalchemy_uri="gsheets://", + encrypted_extra=json.dumps( + { + "service_account_info": { + "project_id": "black-sanctum-314419", + "private_key": "SECRET", + }, + } + ), + ) + session.add(database) + session.commit() + + client.put( + "/api/v1/database/1", + json={ + "encrypted_extra": json.dumps( + { + "service_account_info": { + "project_id": "yellow-unicorn-314419", + "private_key": "XXXXXXXXXX", + }, + } + ), + }, + ) + database = session.query(Database).one() + assert ( + database.encrypted_extra + == '{"service_account_info": {"project_id": "yellow-unicorn-314419", "private_key": "SECRET"}}' + ) def test_non_zip_import(client: Any, full_api_access: None) -> None: @@ -54,3 +191,155 @@ def test_non_zip_import(client: Any, full_api_access: None) -> None: } ] } + + +def test_delete_ssh_tunnel( + mocker: MockFixture, + app: Any, + session: Session, + client: Any, + full_api_access: None, +) -> None: + """ + Test that we can delete SSH Tunnel + """ + with app.app_context(): + from superset.databases.api import DatabaseRestApi + from superset.databases.dao import DatabaseDAO + from superset.databases.ssh_tunnel.models import SSHTunnel + from superset.models.core import Database + + DatabaseRestApi.datamodel.session = session + + # create table for databases + Database.metadata.create_all(session.get_bind()) # pylint: disable=no-member + + # Create our Database + database = Database( + database_name="my_database", + sqlalchemy_uri="gsheets://", + encrypted_extra=json.dumps( + { + "service_account_info": { + "type": "service_account", + "project_id": "black-sanctum-314419", + "private_key_id": "259b0d419a8f840056158763ff54d8b08f7b8173", + "private_key": "SECRET", + "client_email": "google-spreadsheets-demo-servi@black-sanctum-314419.iam.gserviceaccount.com", + "client_id": "SSH_TUNNEL_CREDENTIALS_CLIENT", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/google-spreadsheets-demo-servi%40black-sanctum-314419.iam.gserviceaccount.com", + }, + } + ), + ) + session.add(database) + session.commit() + + # mock the lookup so that we don't need to include the driver + mocker.patch("sqlalchemy.engine.URL.get_driver_name", return_value="gsheets") + mocker.patch("superset.utils.log.DBEventLogger.log") + mocker.patch( + "superset.databases.ssh_tunnel.commands.delete.is_feature_enabled", + return_value=True, + ) + + # Create our SSHTunnel + tunnel = SSHTunnel( + database_id=1, + database=database, + ) + + session.add(tunnel) + session.commit() + + # Get our recently created SSHTunnel + response_tunnel = DatabaseDAO.get_ssh_tunnel(1) + assert response_tunnel + assert isinstance(response_tunnel, SSHTunnel) + assert 1 == response_tunnel.database_id + + # Delete the recently created SSHTunnel + response_delete_tunnel = client.delete("/api/v1/database/1/ssh_tunnel/") + assert response_delete_tunnel.json["message"] == "OK" + + response_tunnel = DatabaseDAO.get_ssh_tunnel(1) + assert response_tunnel is None + + +def test_delete_ssh_tunnel_not_found( + mocker: MockFixture, + app: Any, + session: Session, + client: Any, + full_api_access: None, +) -> None: + """ + Test that we cannot delete a tunnel that does not exist + """ + with app.app_context(): + from superset.databases.api import DatabaseRestApi + from superset.databases.dao import DatabaseDAO + from superset.databases.ssh_tunnel.models import SSHTunnel + from superset.models.core import Database + + DatabaseRestApi.datamodel.session = session + + # create table for databases + Database.metadata.create_all(session.get_bind()) # pylint: disable=no-member + + # Create our Database + database = Database( + database_name="my_database", + sqlalchemy_uri="gsheets://", + encrypted_extra=json.dumps( + { + "service_account_info": { + "type": "service_account", + "project_id": "black-sanctum-314419", + "private_key_id": "259b0d419a8f840056158763ff54d8b08f7b8173", + "private_key": "SECRET", + "client_email": "google-spreadsheets-demo-servi@black-sanctum-314419.iam.gserviceaccount.com", + "client_id": "SSH_TUNNEL_CREDENTIALS_CLIENT", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/google-spreadsheets-demo-servi%40black-sanctum-314419.iam.gserviceaccount.com", + }, + } + ), + ) + session.add(database) + session.commit() + + # mock the lookup so that we don't need to include the driver + mocker.patch("sqlalchemy.engine.URL.get_driver_name", return_value="gsheets") + mocker.patch("superset.utils.log.DBEventLogger.log") + mocker.patch( + "superset.databases.ssh_tunnel.commands.delete.is_feature_enabled", + return_value=True, + ) + + # Create our SSHTunnel + tunnel = SSHTunnel( + database_id=1, + database=database, + ) + + session.add(tunnel) + session.commit() + + # Delete the recently created SSHTunnel + response_delete_tunnel = client.delete("/api/v1/database/2/ssh_tunnel/") + assert response_delete_tunnel.json["message"] == "Not found" + + # Get our recently created SSHTunnel + response_tunnel = DatabaseDAO.get_ssh_tunnel(1) + assert response_tunnel + assert isinstance(response_tunnel, SSHTunnel) + assert 1 == response_tunnel.database_id + + response_tunnel = DatabaseDAO.get_ssh_tunnel(2) + assert response_tunnel is None diff --git a/tests/unit_tests/databases/commands/importers/v1/import_test.py b/tests/unit_tests/databases/commands/importers/v1/import_test.py index 622aa27fc3d5..e665bcb505d5 100644 --- a/tests/unit_tests/databases/commands/importers/v1/import_test.py +++ b/tests/unit_tests/databases/commands/importers/v1/import_test.py @@ -21,7 +21,7 @@ from sqlalchemy.orm.session import Session -def test_import_database(app_context: None, session: Session) -> None: +def test_import_database(session: Session) -> None: """ Test importing a database. """ @@ -41,16 +41,24 @@ def test_import_database(app_context: None, session: Session) -> None: assert database.allow_run_async is False assert database.allow_ctas is True assert database.allow_cvas is True + assert database.allow_dml is True assert database.allow_file_upload is True assert database.extra == "{}" assert database.uuid == "b8a1ccd3-779d-4ab7-8ad8-9ab119d7fe89" assert database.is_managed_externally is False assert database.external_url is None + # ``allow_dml`` was initially not exported; the import should work if the field is + # missing + config = copy.deepcopy(database_config) + del config["allow_dml"] + session.delete(database) + session.flush() + database = import_database(session, config) + assert database.allow_dml is False + -def test_import_database_managed_externally( - app_context: None, session: Session -) -> None: +def test_import_database_managed_externally(session: Session) -> None: """ Test importing a database that is managed externally. """ diff --git a/tests/unit_tests/databases/commands/test_connection_test.py b/tests/unit_tests/databases/commands/test_connection_test.py new file mode 100644 index 000000000000..8e86cfd1cfe9 --- /dev/null +++ b/tests/unit_tests/databases/commands/test_connection_test.py @@ -0,0 +1,32 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from parameterized import parameterized + +from superset.databases.commands.test_connection import get_log_connection_action +from superset.databases.ssh_tunnel.models import SSHTunnel + + +@parameterized.expand( + [ + ("foo", None, None, "foo"), + ("foo", SSHTunnel, None, "foo.ssh_tunnel"), + ("foo", SSHTunnel, Exception("oops"), "foo.Exception.ssh_tunnel"), + ], +) +def test_get_log_connection_action(action, tunnel, exc, expected_result): + assert expected_result == get_log_connection_action(action, tunnel, exc) diff --git a/tests/unit_tests/databases/dao/__init__.py b/tests/unit_tests/databases/dao/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/unit_tests/databases/dao/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/unit_tests/databases/dao/dao_tests.py b/tests/unit_tests/databases/dao/dao_tests.py new file mode 100644 index 000000000000..47db402670de --- /dev/null +++ b/tests/unit_tests/databases/dao/dao_tests.py @@ -0,0 +1,69 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import Iterator + +import pytest +from sqlalchemy.orm.session import Session + + +@pytest.fixture +def session_with_data(session: Session) -> Iterator[Session]: + from superset.connectors.sqla.models import SqlaTable + from superset.databases.ssh_tunnel.models import SSHTunnel + from superset.models.core import Database + + engine = session.get_bind() + SqlaTable.metadata.create_all(engine) # pylint: disable=no-member + + db = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + sqla_table = SqlaTable( + table_name="my_sqla_table", + columns=[], + metrics=[], + database=db, + ) + ssh_tunnel = SSHTunnel( + database_id=db.id, + database=db, + ) + + session.add(db) + session.add(sqla_table) + session.add(ssh_tunnel) + session.flush() + yield session + session.rollback() + + +def test_database_get_ssh_tunnel(session_with_data: Session) -> None: + from superset.databases.dao import DatabaseDAO + from superset.databases.ssh_tunnel.models import SSHTunnel + + result = DatabaseDAO.get_ssh_tunnel(1) + + assert result + assert isinstance(result, SSHTunnel) + assert 1 == result.database_id + + +def test_database_get_ssh_tunnel_not_found(session_with_data: Session) -> None: + from superset.databases.dao import DatabaseDAO + + result = DatabaseDAO.get_ssh_tunnel(2) + + assert result is None diff --git a/tests/unit_tests/databases/schema_tests.py b/tests/unit_tests/databases/schema_tests.py new file mode 100644 index 000000000000..c9fca22d1b28 --- /dev/null +++ b/tests/unit_tests/databases/schema_tests.py @@ -0,0 +1,227 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# pylint: disable=import-outside-toplevel, invalid-name, unused-argument, redefined-outer-name + +from typing import TYPE_CHECKING + +import pytest +from marshmallow import fields, Schema, ValidationError +from pytest_mock import MockFixture + +if TYPE_CHECKING: + from superset.databases.schemas import DatabaseParametersSchemaMixin + from superset.db_engine_specs.base import BasicParametersMixin + + +# pylint: disable=too-few-public-methods +class InvalidEngine: + """ + An invalid DB engine spec. + """ + + +@pytest.fixture +def dummy_schema() -> "DatabaseParametersSchemaMixin": + """ + Fixture providing a dummy schema. + """ + from superset.databases.schemas import DatabaseParametersSchemaMixin + + class DummySchema(Schema, DatabaseParametersSchemaMixin): + sqlalchemy_uri = fields.String() + + return DummySchema() + + +@pytest.fixture +def dummy_engine(mocker: MockFixture) -> None: + """ + Fixture proving a dummy DB engine spec. + """ + from superset.db_engine_specs.base import BasicParametersMixin + + class DummyEngine(BasicParametersMixin): + engine = "dummy" + default_driver = "dummy" + + mocker.patch("superset.databases.schemas.get_engine_spec", return_value=DummyEngine) + + +def test_database_parameters_schema_mixin( + dummy_engine: None, + dummy_schema: "Schema", +) -> None: + from superset.models.core import ConfigurationMethod + + payload = { + "engine": "dummy_engine", + "configuration_method": ConfigurationMethod.DYNAMIC_FORM, + "parameters": { + "username": "username", + "password": "password", + "host": "localhost", + "port": 12345, + "database": "dbname", + }, + } + result = dummy_schema.load(payload) + assert result == { + "configuration_method": ConfigurationMethod.DYNAMIC_FORM, + "sqlalchemy_uri": "dummy+dummy://username:password@localhost:12345/dbname", + } + + +def test_database_parameters_schema_mixin_no_engine( + dummy_schema: "Schema", +) -> None: + from superset.models.core import ConfigurationMethod + + payload = { + "configuration_method": ConfigurationMethod.DYNAMIC_FORM, + "parameters": { + "username": "username", + "password": "password", + "host": "localhost", + "port": 12345, + "database": "dbname", + }, + } + try: + dummy_schema.load(payload) + except ValidationError as err: + assert err.messages == { + "_schema": [ + ( + "An engine must be specified when passing individual parameters to " + "a database." + ), + ] + } + + +def test_database_parameters_schema_mixin_invalid_engine( + dummy_engine: None, + dummy_schema: "Schema", +) -> None: + from superset.models.core import ConfigurationMethod + + payload = { + "engine": "dummy_engine", + "configuration_method": ConfigurationMethod.DYNAMIC_FORM, + "parameters": { + "username": "username", + "password": "password", + "host": "localhost", + "port": 12345, + "database": "dbname", + }, + } + try: + dummy_schema.load(payload) + except ValidationError as err: + assert err.messages == { + "_schema": ['Engine "dummy_engine" is not a valid engine.'] + } + + +def test_database_parameters_schema_no_mixin( + dummy_engine: None, + dummy_schema: "Schema", +) -> None: + from superset.models.core import ConfigurationMethod + + payload = { + "engine": "invalid_engine", + "configuration_method": ConfigurationMethod.DYNAMIC_FORM, + "parameters": { + "username": "username", + "password": "password", + "host": "localhost", + "port": 12345, + "database": "dbname", + }, + } + try: + dummy_schema.load(payload) + except ValidationError as err: + assert err.messages == { + "_schema": [ + ( + 'Engine spec "InvalidEngine" does not support ' + "being configured via individual parameters." + ) + ] + } + + +def test_database_parameters_schema_mixin_invalid_type( + dummy_engine: None, + dummy_schema: "Schema", +) -> None: + from superset.models.core import ConfigurationMethod + + payload = { + "engine": "dummy_engine", + "configuration_method": ConfigurationMethod.DYNAMIC_FORM, + "parameters": { + "username": "username", + "password": "password", + "host": "localhost", + "port": "badport", + "database": "dbname", + }, + } + try: + dummy_schema.load(payload) + except ValidationError as err: + assert err.messages == {"port": ["Not a valid integer."]} + + +def test_rename_encrypted_extra() -> None: + """ + Test that ``encrypted_extra`` gets renamed to ``masked_encrypted_extra``. + """ + from superset.databases.schemas import ConfigurationMethod, DatabasePostSchema + + schema = DatabasePostSchema() + + # current schema + payload = schema.load( + { + "database_name": "My database", + "masked_encrypted_extra": "{}", + } + ) + assert payload == { + "database_name": "My database", + "configuration_method": ConfigurationMethod.SQLALCHEMY_FORM, + "masked_encrypted_extra": "{}", + } + + # previous schema + payload = schema.load( + { + "database_name": "My database", + "encrypted_extra": "{}", + } + ) + assert payload == { + "database_name": "My database", + "configuration_method": ConfigurationMethod.SQLALCHEMY_FORM, + "masked_encrypted_extra": "{}", + } diff --git a/tests/unit_tests/databases/ssh_tunnel/__init__.py b/tests/unit_tests/databases/ssh_tunnel/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/unit_tests/databases/ssh_tunnel/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/unit_tests/databases/ssh_tunnel/commands/__init__.py b/tests/unit_tests/databases/ssh_tunnel/commands/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/unit_tests/databases/ssh_tunnel/commands/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/unit_tests/databases/ssh_tunnel/commands/create_test.py b/tests/unit_tests/databases/ssh_tunnel/commands/create_test.py new file mode 100644 index 000000000000..2a5738ebd396 --- /dev/null +++ b/tests/unit_tests/databases/ssh_tunnel/commands/create_test.py @@ -0,0 +1,68 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import Iterator + +import pytest +from sqlalchemy.orm.session import Session + +from superset.databases.ssh_tunnel.commands.exceptions import SSHTunnelInvalidError + + +def test_create_ssh_tunnel_command() -> None: + from superset.databases.ssh_tunnel.commands.create import CreateSSHTunnelCommand + from superset.databases.ssh_tunnel.models import SSHTunnel + from superset.models.core import Database + + db = Database(id=1, database_name="my_database", sqlalchemy_uri="sqlite://") + + properties = { + "database_id": db.id, + "server_address": "123.132.123.1", + "server_port": "3005", + "username": "foo", + "password": "bar", + } + + result = CreateSSHTunnelCommand(db.id, properties).run() + + assert result is not None + assert isinstance(result, SSHTunnel) + + +def test_create_ssh_tunnel_command_invalid_params() -> None: + from superset.databases.ssh_tunnel.commands.create import CreateSSHTunnelCommand + from superset.databases.ssh_tunnel.models import SSHTunnel + from superset.models.core import Database + + db = Database(id=1, database_name="my_database", sqlalchemy_uri="sqlite://") + + # If we are trying to create a tunnel with a private_key_password + # then a private_key is mandatory + properties = { + "database_id": db.id, + "server_address": "123.132.123.1", + "server_port": "3005", + "username": "foo", + "private_key_password": "bar", + } + + command = CreateSSHTunnelCommand(db.id, properties) + + with pytest.raises(SSHTunnelInvalidError) as excinfo: + command.run() + assert str(excinfo.value) == ("SSH Tunnel parameters are invalid.") diff --git a/tests/unit_tests/databases/ssh_tunnel/commands/delete_test.py b/tests/unit_tests/databases/ssh_tunnel/commands/delete_test.py new file mode 100644 index 000000000000..b5adf765fa5a --- /dev/null +++ b/tests/unit_tests/databases/ssh_tunnel/commands/delete_test.py @@ -0,0 +1,73 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import Iterator + +import pytest +from pytest_mock import MockFixture +from sqlalchemy.orm.session import Session + + +@pytest.fixture +def session_with_data(session: Session) -> Iterator[Session]: + from superset.connectors.sqla.models import SqlaTable + from superset.databases.ssh_tunnel.models import SSHTunnel + from superset.models.core import Database + + engine = session.get_bind() + SqlaTable.metadata.create_all(engine) # pylint: disable=no-member + + db = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + sqla_table = SqlaTable( + table_name="my_sqla_table", + columns=[], + metrics=[], + database=db, + ) + ssh_tunnel = SSHTunnel( + database_id=db.id, + database=db, + ) + + session.add(db) + session.add(sqla_table) + session.add(ssh_tunnel) + session.flush() + yield session + session.rollback() + + +def test_delete_ssh_tunnel_command( + mocker: MockFixture, session_with_data: Session +) -> None: + from superset.databases.dao import DatabaseDAO + from superset.databases.ssh_tunnel.commands.delete import DeleteSSHTunnelCommand + from superset.databases.ssh_tunnel.models import SSHTunnel + + result = DatabaseDAO.get_ssh_tunnel(1) + + assert result + assert isinstance(result, SSHTunnel) + assert 1 == result.database_id + mocker.patch( + "superset.databases.ssh_tunnel.commands.delete.is_feature_enabled", + return_value=True, + ) + DeleteSSHTunnelCommand(1).run() + result = DatabaseDAO.get_ssh_tunnel(1) + + assert result is None diff --git a/tests/unit_tests/databases/ssh_tunnel/commands/update_test.py b/tests/unit_tests/databases/ssh_tunnel/commands/update_test.py new file mode 100644 index 000000000000..58f90054ccd1 --- /dev/null +++ b/tests/unit_tests/databases/ssh_tunnel/commands/update_test.py @@ -0,0 +1,93 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import Iterator + +import pytest +from sqlalchemy.orm.session import Session + +from superset.databases.ssh_tunnel.commands.exceptions import SSHTunnelInvalidError + + +@pytest.fixture +def session_with_data(session: Session) -> Iterator[Session]: + from superset.connectors.sqla.models import SqlaTable + from superset.databases.ssh_tunnel.models import SSHTunnel + from superset.models.core import Database + + engine = session.get_bind() + SqlaTable.metadata.create_all(engine) # pylint: disable=no-member + + db = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + sqla_table = SqlaTable( + table_name="my_sqla_table", + columns=[], + metrics=[], + database=db, + ) + ssh_tunnel = SSHTunnel(database_id=db.id, database=db, server_address="Test") + + session.add(db) + session.add(sqla_table) + session.add(ssh_tunnel) + session.flush() + yield session + session.rollback() + + +def test_update_shh_tunnel_command(session_with_data: Session) -> None: + from superset.databases.dao import DatabaseDAO + from superset.databases.ssh_tunnel.commands.update import UpdateSSHTunnelCommand + from superset.databases.ssh_tunnel.models import SSHTunnel + + result = DatabaseDAO.get_ssh_tunnel(1) + + assert result + assert isinstance(result, SSHTunnel) + assert 1 == result.database_id + assert "Test" == result.server_address + + update_payload = {"server_address": "Test2"} + UpdateSSHTunnelCommand(1, update_payload).run() + + result = DatabaseDAO.get_ssh_tunnel(1) + + assert result + assert isinstance(result, SSHTunnel) + assert "Test2" == result.server_address + + +def test_update_shh_tunnel_invalid_params(session_with_data: Session) -> None: + from superset.databases.dao import DatabaseDAO + from superset.databases.ssh_tunnel.commands.update import UpdateSSHTunnelCommand + from superset.databases.ssh_tunnel.models import SSHTunnel + + result = DatabaseDAO.get_ssh_tunnel(1) + + assert result + assert isinstance(result, SSHTunnel) + assert 1 == result.database_id + assert "Test" == result.server_address + + # If we are trying to update a tunnel with a private_key_password + # then a private_key is mandatory + update_payload = {"private_key_password": "pass"} + command = UpdateSSHTunnelCommand(1, update_payload) + + with pytest.raises(SSHTunnelInvalidError) as excinfo: + command.run() + assert str(excinfo.value) == ("SSH Tunnel parameters are invalid.") diff --git a/tests/unit_tests/databases/ssh_tunnel/dao_tests.py b/tests/unit_tests/databases/ssh_tunnel/dao_tests.py new file mode 100644 index 000000000000..ae5b6e9bd3c3 --- /dev/null +++ b/tests/unit_tests/databases/ssh_tunnel/dao_tests.py @@ -0,0 +1,43 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import Iterator + +import pytest +from sqlalchemy.orm.session import Session + + +def test_create_ssh_tunnel(): + from superset.databases.dao import DatabaseDAO + from superset.databases.ssh_tunnel.dao import SSHTunnelDAO + from superset.databases.ssh_tunnel.models import SSHTunnel + from superset.models.core import Database + + db = Database(id=1, database_name="my_database", sqlalchemy_uri="sqlite://") + + properties = { + "database_id": db.id, + "server_address": "123.132.123.1", + "server_port": "3005", + "username": "foo", + "password": "bar", + } + + result = SSHTunnelDAO.create(properties) + + assert result is not None + assert isinstance(result, SSHTunnel) diff --git a/tests/unit_tests/databases/utils_test.py b/tests/unit_tests/databases/utils_test.py index 8dbc11a3b7a7..e402ced2a529 100644 --- a/tests/unit_tests/databases/utils_test.py +++ b/tests/unit_tests/databases/utils_test.py @@ -21,7 +21,7 @@ from superset.databases.utils import make_url_safe -def test_make_url_safe_string(app_context: None, session: Session) -> None: +def test_make_url_safe_string(session: Session) -> None: """ Test converting a string to a safe uri """ @@ -31,7 +31,7 @@ def test_make_url_safe_string(app_context: None, session: Session) -> None: assert uri_safe == make_url(uri_string) -def test_make_url_safe_url(app_context: None, session: Session) -> None: +def test_make_url_safe_url(session: Session) -> None: """ Test converting a url to a safe uri """ diff --git a/tests/unit_tests/dataframe_test.py b/tests/unit_tests/dataframe_test.py index 8785ee1d7b3e..f0d9bc31b064 100644 --- a/tests/unit_tests/dataframe_test.py +++ b/tests/unit_tests/dataframe_test.py @@ -19,12 +19,13 @@ import pytest from pandas import Timestamp +from pandas._libs.tslibs import NaT from superset.dataframe import df_to_records from superset.superset_typing import DbapiDescription -def test_df_to_records(app_context: None) -> None: +def test_df_to_records() -> None: from superset.db_engine_specs import BaseEngineSpec from superset.result_set import SupersetResultSet @@ -41,7 +42,104 @@ def test_df_to_records(app_context: None) -> None: ] -def test_js_max_int(app_context: None) -> None: +def test_df_to_records_NaT_type() -> None: + from superset.db_engine_specs import BaseEngineSpec + from superset.result_set import SupersetResultSet + + data = [(NaT,), (Timestamp("2023-01-06 20:50:31.749000+0000", tz="UTC"),)] + cursor_descr: DbapiDescription = [ + ("date", "timestamp with time zone", None, None, None, None, False) + ] + results = SupersetResultSet(data, cursor_descr, BaseEngineSpec) + df = results.to_pandas_df() + + assert df_to_records(df) == [ + {"date": None}, + {"date": "2023-01-06 20:50:31.749000+00:00"}, + ] + + +def test_df_to_records_mixed_emoji_type() -> None: + from superset.db_engine_specs import BaseEngineSpec + from superset.result_set import SupersetResultSet + + data = [ + ("What's up?", "This is a string text", 1), + ("What's up?", "This is a string with an 😍 added", 2), + ("What's up?", NaT, 3), + ("What's up?", "Last emoji 😁", 4), + ] + + cursor_descr: DbapiDescription = [ + ("question", "varchar", None, None, None, None, False), + ("response", "varchar", None, None, None, None, False), + ("count", "integer", None, None, None, None, False), + ] + + results = SupersetResultSet(data, cursor_descr, BaseEngineSpec) + df = results.to_pandas_df() + + assert df_to_records(df) == [ + {"question": "What's up?", "response": "This is a string text", "count": 1}, + { + "question": "What's up?", + "response": "This is a string with an 😍 added", + "count": 2, + }, + { + "question": "What's up?", + "response": None, + "count": 3, + }, + { + "question": "What's up?", + "response": "Last emoji 😁", + "count": 4, + }, + ] + + +def test_df_to_records_mixed_accent_type() -> None: + from superset.db_engine_specs import BaseEngineSpec + from superset.result_set import SupersetResultSet + + data = [ + ("What's up?", "This is a string text", 1), + ("What's up?", "This is a string with áccent", 2), + ("What's up?", NaT, 3), + ("What's up?", "móre áccent", 4), + ] + + cursor_descr: DbapiDescription = [ + ("question", "varchar", None, None, None, None, False), + ("response", "varchar", None, None, None, None, False), + ("count", "integer", None, None, None, None, False), + ] + + results = SupersetResultSet(data, cursor_descr, BaseEngineSpec) + df = results.to_pandas_df() + + assert df_to_records(df) == [ + {"question": "What's up?", "response": "This is a string text", "count": 1}, + { + "question": "What's up?", + "response": "This is a string with áccent", + "count": 2, + }, + { + "question": "What's up?", + "response": None, + "count": 3, + }, + { + "question": "What's up?", + "response": "móre áccent", + "count": 4, + }, + ] + + +def test_js_max_int() -> None: from superset.db_engine_specs import BaseEngineSpec from superset.result_set import SupersetResultSet diff --git a/tests/unit_tests/datasets/commands/export_test.py b/tests/unit_tests/datasets/commands/export_test.py index c7e6da8649e7..c3ad4f764c4f 100644 --- a/tests/unit_tests/datasets/commands/export_test.py +++ b/tests/unit_tests/datasets/commands/export_test.py @@ -21,7 +21,7 @@ from sqlalchemy.orm.session import Session -def test_export(app_context: None, session: Session) -> None: +def test_export(session: Session) -> None: """ Test exporting a dataset. """ @@ -194,6 +194,7 @@ def test_export(app_context: None, session: Session) -> None: allow_run_async: false allow_ctas: false allow_cvas: false +allow_dml: false allow_file_upload: false extra: metadata_params: {{}} diff --git a/tests/unit_tests/datasets/commands/importers/v1/import_test.py b/tests/unit_tests/datasets/commands/importers/v1/import_test.py index 07ea8c49d04d..5b52ac7f1da9 100644 --- a/tests/unit_tests/datasets/commands/importers/v1/import_test.py +++ b/tests/unit_tests/datasets/commands/importers/v1/import_test.py @@ -18,19 +18,25 @@ import copy import json +import re import uuid from typing import Any, Dict +from unittest.mock import Mock, patch +import pytest +from flask import current_app from sqlalchemy.orm.session import Session +from superset.datasets.commands.exceptions import DatasetForbiddenDataURI +from superset.datasets.commands.importers.v1.utils import validate_data_uri -def test_import_dataset(app_context: None, session: Session) -> None: + +def test_import_dataset(session: Session) -> None: """ Test importing a dataset. """ - from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn + from superset.connectors.sqla.models import SqlaTable from superset.datasets.commands.importers.v1.utils import import_dataset - from superset.datasets.schemas import ImportV1DatasetSchema from superset.models.core import Database engine = session.get_bind() @@ -124,11 +130,11 @@ def test_import_dataset(app_context: None, session: Session) -> None: assert len(sqla_table.columns) == 1 assert sqla_table.columns[0].column_name == "profit" assert sqla_table.columns[0].verbose_name is None - assert sqla_table.columns[0].is_dttm is None - assert sqla_table.columns[0].is_active is None + assert sqla_table.columns[0].is_dttm is False + assert sqla_table.columns[0].is_active is True assert sqla_table.columns[0].type == "INTEGER" - assert sqla_table.columns[0].groupby is None - assert sqla_table.columns[0].filterable is None + assert sqla_table.columns[0].groupby is True + assert sqla_table.columns[0].filterable is True assert sqla_table.columns[0].expression == "revenue-expenses" assert sqla_table.columns[0].description is None assert sqla_table.columns[0].python_date_format is None @@ -137,7 +143,130 @@ def test_import_dataset(app_context: None, session: Session) -> None: assert sqla_table.database.id == database.id -def test_import_column_extra_is_string(app_context: None, session: Session) -> None: +def test_import_dataset_duplicate_column(session: Session) -> None: + """ + Test importing a dataset with a column that already exists. + """ + from superset.columns.models import Column as NewColumn + from superset.connectors.sqla.models import SqlaTable, TableColumn + from superset.datasets.commands.importers.v1.utils import import_dataset + from superset.models.core import Database + + engine = session.get_bind() + SqlaTable.metadata.create_all(engine) # pylint: disable=no-member + + dataset_uuid = uuid.uuid4() + + database = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + + session.add(database) + session.flush() + + dataset = SqlaTable( + uuid=dataset_uuid, table_name="existing_dataset", database_id=database.id + ) + column = TableColumn(column_name="existing_column") + session.add(dataset) + session.add(column) + session.flush() + + config = { + "table_name": dataset.table_name, + "main_dttm_col": "ds", + "description": "This is the description", + "default_endpoint": None, + "offset": -8, + "cache_timeout": 3600, + "schema": "my_schema", + "sql": None, + "params": { + "remote_id": 64, + "database_name": "examples", + "import_time": 1606677834, + }, + "template_params": { + "answer": "42", + }, + "filter_select_enabled": True, + "fetch_values_predicate": "foo IN (1, 2)", + "extra": {"warning_markdown": "*WARNING*"}, + "uuid": dataset_uuid, + "metrics": [ + { + "metric_name": "cnt", + "verbose_name": None, + "metric_type": None, + "expression": "COUNT(*)", + "description": None, + "d3format": None, + "extra": {"warning_markdown": None}, + "warning_text": None, + } + ], + "columns": [ + { + "column_name": column.column_name, + "verbose_name": None, + "is_dttm": None, + "is_active": None, + "type": "INTEGER", + "groupby": None, + "filterable": None, + "expression": "revenue-expenses", + "description": None, + "python_date_format": None, + "extra": { + "certified_by": "User", + }, + } + ], + "database_uuid": database.uuid, + "database_id": database.id, + } + + sqla_table = import_dataset(session, config, overwrite=True) + assert sqla_table.table_name == dataset.table_name + assert sqla_table.main_dttm_col == "ds" + assert sqla_table.description == "This is the description" + assert sqla_table.default_endpoint is None + assert sqla_table.offset == -8 + assert sqla_table.cache_timeout == 3600 + assert sqla_table.schema == "my_schema" + assert sqla_table.sql is None + assert sqla_table.params == json.dumps( + {"remote_id": 64, "database_name": "examples", "import_time": 1606677834} + ) + assert sqla_table.template_params == json.dumps({"answer": "42"}) + assert sqla_table.filter_select_enabled is True + assert sqla_table.fetch_values_predicate == "foo IN (1, 2)" + assert sqla_table.extra == '{"warning_markdown": "*WARNING*"}' + assert sqla_table.uuid == dataset_uuid + assert len(sqla_table.metrics) == 1 + assert sqla_table.metrics[0].metric_name == "cnt" + assert sqla_table.metrics[0].verbose_name is None + assert sqla_table.metrics[0].metric_type is None + assert sqla_table.metrics[0].expression == "COUNT(*)" + assert sqla_table.metrics[0].description is None + assert sqla_table.metrics[0].d3format is None + assert sqla_table.metrics[0].extra == '{"warning_markdown": null}' + assert sqla_table.metrics[0].warning_text is None + assert len(sqla_table.columns) == 1 + assert sqla_table.columns[0].column_name == column.column_name + assert sqla_table.columns[0].verbose_name is None + assert sqla_table.columns[0].is_dttm is False + assert sqla_table.columns[0].is_active is True + assert sqla_table.columns[0].type == "INTEGER" + assert sqla_table.columns[0].groupby is True + assert sqla_table.columns[0].filterable is True + assert sqla_table.columns[0].expression == "revenue-expenses" + assert sqla_table.columns[0].description is None + assert sqla_table.columns[0].python_date_format is None + assert sqla_table.columns[0].extra == '{"certified_by": "User"}' + assert sqla_table.database.uuid == database.uuid + assert sqla_table.database.id == database.id + + +def test_import_column_extra_is_string(session: Session) -> None: """ Test importing a dataset when the column extra is a string. """ @@ -217,15 +346,19 @@ def test_import_column_extra_is_string(app_context: None, session: Session) -> N assert sqla_table.extra == '{"warning_markdown": "*WARNING*"}' -def test_import_dataset_managed_externally(app_context: None, session: Session) -> None: +@patch("superset.datasets.commands.importers.v1.utils.request") +def test_import_column_allowed_data_url(request: Mock, session: Session) -> None: """ - Test importing a dataset that is managed externally. + Test importing a dataset when using data key to fetch data from a URL. """ - from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn + import io + + from superset.connectors.sqla.models import SqlaTable from superset.datasets.commands.importers.v1.utils import import_dataset from superset.datasets.schemas import ImportV1DatasetSchema from superset.models.core import Database - from tests.integration_tests.fixtures.importexport import dataset_config + + request.urlopen.return_value = io.StringIO("col1\nvalue1\nvalue2\n") engine = session.get_bind() SqlaTable.metadata.create_all(engine) # pylint: disable=no-member @@ -235,6 +368,73 @@ def test_import_dataset_managed_externally(app_context: None, session: Session) session.flush() dataset_uuid = uuid.uuid4() + yaml_config: Dict[str, Any] = { + "version": "1.0.0", + "table_name": "my_table", + "main_dttm_col": "ds", + "description": "This is the description", + "default_endpoint": None, + "offset": -8, + "cache_timeout": 3600, + "schema": None, + "sql": None, + "params": { + "remote_id": 64, + "database_name": "examples", + "import_time": 1606677834, + }, + "template_params": None, + "filter_select_enabled": True, + "fetch_values_predicate": None, + "extra": None, + "uuid": dataset_uuid, + "metrics": [], + "columns": [ + { + "column_name": "col1", + "verbose_name": None, + "is_dttm": False, + "is_active": True, + "type": "TEXT", + "groupby": False, + "filterable": False, + "expression": None, + "description": None, + "python_date_format": None, + "extra": None, + } + ], + "database_uuid": database.uuid, + "data": "https://some-external-url.com/data.csv", + } + + # the Marshmallow schema should convert strings to objects + schema = ImportV1DatasetSchema() + dataset_config = schema.load(yaml_config) + dataset_config["database_id"] = database.id + _ = import_dataset(session, dataset_config, force_data=True) + session.connection() + assert [("value1",), ("value2",)] == session.execute( + "SELECT * FROM my_table" + ).fetchall() + + +def test_import_dataset_managed_externally(session: Session) -> None: + """ + Test importing a dataset that is managed externally. + """ + from superset.connectors.sqla.models import SqlaTable + from superset.datasets.commands.importers.v1.utils import import_dataset + from superset.models.core import Database + from tests.integration_tests.fixtures.importexport import dataset_config + + engine = session.get_bind() + SqlaTable.metadata.create_all(engine) # pylint: disable=no-member + + database = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + session.add(database) + session.flush() + config = copy.deepcopy(dataset_config) config["is_managed_externally"] = True config["external_url"] = "https://example.org/my_table" @@ -243,3 +443,44 @@ def test_import_dataset_managed_externally(app_context: None, session: Session) sqla_table = import_dataset(session, config) assert sqla_table.is_managed_externally is True assert sqla_table.external_url == "https://example.org/my_table" + + +@pytest.mark.parametrize( + "allowed_urls, data_uri, expected, exception_class", + [ + ([r".*"], "https://some-url/data.csv", True, None), + ( + [r"^https://.+\.domain1\.com\/?.*", r"^https://.+\.domain2\.com\/?.*"], + "https://host1.domain1.com/data.csv", + True, + None, + ), + ( + [r"^https://.+\.domain1\.com\/?.*", r"^https://.+\.domain2\.com\/?.*"], + "https://host2.domain1.com/data.csv", + True, + None, + ), + ( + [r"^https://.+\.domain1\.com\/?.*", r"^https://.+\.domain2\.com\/?.*"], + "https://host1.domain2.com/data.csv", + True, + None, + ), + ( + [r"^https://.+\.domain1\.com\/?.*", r"^https://.+\.domain2\.com\/?.*"], + "https://host1.domain3.com/data.csv", + False, + DatasetForbiddenDataURI, + ), + ([], "https://host1.domain3.com/data.csv", False, DatasetForbiddenDataURI), + (["*"], "https://host1.domain3.com/data.csv", False, re.error), + ], +) +def test_validate_data_uri(allowed_urls, data_uri, expected, exception_class): + current_app.config["DATASET_IMPORT_ALLOWED_DATA_URLS"] = allowed_urls + if expected: + validate_data_uri(data_uri) + else: + with pytest.raises(exception_class): + validate_data_uri(data_uri) diff --git a/tests/unit_tests/datasets/dao/__init__.py b/tests/unit_tests/datasets/dao/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/unit_tests/datasets/dao/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/unit_tests/datasets/dao/dao_tests.py b/tests/unit_tests/datasets/dao/dao_tests.py new file mode 100644 index 000000000000..350425d08e89 --- /dev/null +++ b/tests/unit_tests/datasets/dao/dao_tests.py @@ -0,0 +1,103 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import Iterator + +import pytest +from sqlalchemy.orm.session import Session + + +@pytest.fixture +def session_with_data(session: Session) -> Iterator[Session]: + from superset.connectors.sqla.models import SqlaTable + from superset.models.core import Database + + engine = session.get_bind() + SqlaTable.metadata.create_all(engine) # pylint: disable=no-member + + db = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + sqla_table = SqlaTable( + table_name="my_sqla_table", + columns=[], + metrics=[], + database=db, + ) + + session.add(db) + session.add(sqla_table) + session.flush() + yield session + session.rollback() + + +def test_datasource_find_by_id_skip_base_filter(session_with_data: Session) -> None: + from superset.connectors.sqla.models import SqlaTable + from superset.datasets.dao import DatasetDAO + + result = DatasetDAO.find_by_id( + 1, + session=session_with_data, + skip_base_filter=True, + ) + + assert result + assert 1 == result.id + assert "my_sqla_table" == result.table_name + assert isinstance(result, SqlaTable) + + +def test_datasource_find_by_id_skip_base_filter_not_found( + session_with_data: Session, +) -> None: + from superset.datasets.dao import DatasetDAO + + result = DatasetDAO.find_by_id( + 125326326, + session=session_with_data, + skip_base_filter=True, + ) + assert result is None + + +def test_datasource_find_by_ids_skip_base_filter(session_with_data: Session) -> None: + from superset.connectors.sqla.models import SqlaTable + from superset.datasets.dao import DatasetDAO + + result = DatasetDAO.find_by_ids( + [1, 125326326], + session=session_with_data, + skip_base_filter=True, + ) + + assert result + assert [1] == list(map(lambda x: x.id, result)) + assert ["my_sqla_table"] == list(map(lambda x: x.table_name, result)) + assert isinstance(result[0], SqlaTable) + + +def test_datasource_find_by_ids_skip_base_filter_not_found( + session_with_data: Session, +) -> None: + from superset.datasets.dao import DatasetDAO + + result = DatasetDAO.find_by_ids( + [125326326, 125326326125326326], + session=session_with_data, + skip_base_filter=True, + ) + + assert len(result) == 0 diff --git a/tests/unit_tests/datasets/test_models.py b/tests/unit_tests/datasets/test_models.py deleted file mode 100644 index cacaef5ef53f..000000000000 --- a/tests/unit_tests/datasets/test_models.py +++ /dev/null @@ -1,1154 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -import json -from typing import Any, Callable, Dict, List, TYPE_CHECKING - -from pytest_mock import MockFixture -from sqlalchemy.orm.session import Session - -from tests.unit_tests.utils.db import get_test_user - -if TYPE_CHECKING: - from superset.connectors.sqla.models import SqlMetric, TableColumn - - -def test_dataset_model(app_context: None, session: Session) -> None: - """ - Test basic attributes of a ``Dataset``. - """ - from superset.columns.models import Column - from superset.datasets.models import Dataset - from superset.models.core import Database - from superset.tables.models import Table - - engine = session.get_bind() - Dataset.metadata.create_all(engine) # pylint: disable=no-member - - table = Table( - name="my_table", - schema="my_schema", - catalog="my_catalog", - database=Database(database_name="my_database", sqlalchemy_uri="sqlite://"), - columns=[ - Column(name="longitude", expression="longitude"), - Column(name="latitude", expression="latitude"), - ], - ) - session.add(table) - session.flush() - - dataset = Dataset( - database=table.database, - name="positions", - expression=""" -SELECT array_agg(array[longitude,latitude]) AS position -FROM my_catalog.my_schema.my_table -""", - tables=[table], - columns=[ - Column( - name="position", - expression="array_agg(array[longitude,latitude])", - ), - ], - ) - session.add(dataset) - session.flush() - - assert dataset.id == 1 - assert dataset.uuid is not None - - assert dataset.name == "positions" - assert ( - dataset.expression - == """ -SELECT array_agg(array[longitude,latitude]) AS position -FROM my_catalog.my_schema.my_table -""" - ) - - assert [table.name for table in dataset.tables] == ["my_table"] - assert [column.name for column in dataset.columns] == ["position"] - - -def test_cascade_delete_table(app_context: None, session: Session) -> None: - """ - Test that deleting ``Table`` also deletes its columns. - """ - from superset.columns.models import Column - from superset.models.core import Database - from superset.tables.models import Table - - engine = session.get_bind() - Table.metadata.create_all(engine) # pylint: disable=no-member - - table = Table( - name="my_table", - schema="my_schema", - catalog="my_catalog", - database=Database(database_name="my_database", sqlalchemy_uri="sqlite://"), - columns=[ - Column(name="longitude", expression="longitude"), - Column(name="latitude", expression="latitude"), - ], - ) - session.add(table) - session.flush() - - columns = session.query(Column).all() - assert len(columns) == 2 - - session.delete(table) - session.flush() - - # test that columns were deleted - columns = session.query(Column).all() - assert len(columns) == 0 - - -def test_cascade_delete_dataset(app_context: None, session: Session) -> None: - """ - Test that deleting ``Dataset`` also deletes its columns. - """ - from superset.columns.models import Column - from superset.datasets.models import Dataset - from superset.models.core import Database - from superset.tables.models import Table - - engine = session.get_bind() - Dataset.metadata.create_all(engine) # pylint: disable=no-member - - table = Table( - name="my_table", - schema="my_schema", - catalog="my_catalog", - database=Database(database_name="my_database", sqlalchemy_uri="sqlite://"), - columns=[ - Column(name="longitude", expression="longitude"), - Column(name="latitude", expression="latitude"), - ], - ) - session.add(table) - session.flush() - - dataset = Dataset( - name="positions", - expression=""" -SELECT array_agg(array[longitude,latitude]) AS position -FROM my_catalog.my_schema.my_table -""", - database=table.database, - tables=[table], - columns=[ - Column( - name="position", - expression="array_agg(array[longitude,latitude])", - ), - ], - ) - session.add(dataset) - session.flush() - - columns = session.query(Column).all() - assert len(columns) == 3 - - session.delete(dataset) - session.flush() - - # test that dataset columns were deleted (but not table columns) - columns = session.query(Column).all() - assert len(columns) == 2 - - -def test_dataset_attributes(app_context: None, session: Session) -> None: - """ - Test that checks attributes in the dataset. - - If this check fails it means new attributes were added to ``SqlaTable``, and - ``SqlaTable.after_insert`` should be updated to handle them! - """ - from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn - from superset.models.core import Database - - engine = session.get_bind() - SqlaTable.metadata.create_all(engine) # pylint: disable=no-member - - columns = [ - TableColumn(column_name="ds", is_dttm=1, type="TIMESTAMP"), - TableColumn(column_name="num_boys", type="INTEGER"), - TableColumn(column_name="revenue", type="INTEGER"), - TableColumn(column_name="expenses", type="INTEGER"), - TableColumn( - column_name="profit", type="INTEGER", expression="revenue-expenses" - ), - ] - metrics = [ - SqlMetric(metric_name="cnt", expression="COUNT(*)"), - ] - - sqla_table = SqlaTable( - table_name="old_dataset", - columns=columns, - metrics=metrics, - main_dttm_col="ds", - default_endpoint="https://www.youtube.com/watch?v=dQw4w9WgXcQ", # not used - database=Database(database_name="my_database", sqlalchemy_uri="sqlite://"), - offset=-8, - description="This is the description", - is_featured=1, - cache_timeout=3600, - schema="my_schema", - sql=None, - params=json.dumps( - { - "remote_id": 64, - "database_name": "examples", - "import_time": 1606677834, - } - ), - perm=None, - filter_select_enabled=1, - fetch_values_predicate="foo IN (1, 2)", - is_sqllab_view=0, # no longer used? - template_params=json.dumps({"answer": "42"}), - schema_perm=None, - extra=json.dumps({"warning_markdown": "*WARNING*"}), - ) - - session.add(sqla_table) - session.flush() - - dataset = session.query(SqlaTable).one() - # If this test fails because attributes changed, make sure to update - # ``SqlaTable.after_insert`` accordingly. - assert sorted(dataset.__dict__.keys()) == [ - "_sa_instance_state", - "cache_timeout", - "changed_by_fk", - "changed_on", - "columns", - "created_by_fk", - "created_on", - "database", - "database_id", - "default_endpoint", - "description", - "external_url", - "extra", - "fetch_values_predicate", - "filter_select_enabled", - "id", - "is_featured", - "is_managed_externally", - "is_sqllab_view", - "main_dttm_col", - "metrics", - "offset", - "owners", - "params", - "perm", - "schema", - "schema_perm", - "sql", - "table_name", - "template_params", - "uuid", - ] - - -def test_create_physical_sqlatable( - app_context: None, - session: Session, - sample_columns: Dict["TableColumn", Dict[str, Any]], - sample_metrics: Dict["SqlMetric", Dict[str, Any]], - columns_default: Dict[str, Any], -) -> None: - """ - Test shadow write when creating a new ``SqlaTable``. - - When a new physical ``SqlaTable`` is created, new models should also be created for - ``Dataset``, ``Table``, and ``Column``. - """ - from superset.columns.models import Column - from superset.columns.schemas import ColumnSchema - from superset.connectors.sqla.models import SqlaTable - from superset.datasets.models import Dataset - from superset.datasets.schemas import DatasetSchema - from superset.models.core import Database - from superset.tables.models import Table - from superset.tables.schemas import TableSchema - - engine = session.get_bind() - Dataset.metadata.create_all(engine) # pylint: disable=no-member - user1 = get_test_user(1, "abc") - columns = list(sample_columns.keys()) - metrics = list(sample_metrics.keys()) - expected_table_columns = list(sample_columns.values()) - expected_metric_columns = list(sample_metrics.values()) - - sqla_table = SqlaTable( - table_name="old_dataset", - columns=columns, - metrics=metrics, - main_dttm_col="ds", - default_endpoint="https://www.youtube.com/watch?v=dQw4w9WgXcQ", # not used - database=Database(database_name="my_database", sqlalchemy_uri="sqlite://"), - offset=-8, - description="This is the description", - is_featured=1, - cache_timeout=3600, - schema="my_schema", - sql=None, - params=json.dumps( - { - "remote_id": 64, - "database_name": "examples", - "import_time": 1606677834, - } - ), - created_by=user1, - changed_by=user1, - owners=[user1], - perm=None, - filter_select_enabled=1, - fetch_values_predicate="foo IN (1, 2)", - is_sqllab_view=0, # no longer used? - template_params=json.dumps({"answer": "42"}), - schema_perm=None, - extra=json.dumps({"warning_markdown": "*WARNING*"}), - ) - session.add(sqla_table) - session.flush() - - # ignore these keys when comparing results - ignored_keys = {"created_on", "changed_on"} - - # check that columns were created - column_schema = ColumnSchema() - actual_columns = [ - {k: v for k, v in column_schema.dump(column).items() if k not in ignored_keys} - for column in session.query(Column).all() - ] - num_physical_columns = len( - [col for col in expected_table_columns if col.get("is_physical") == True] - ) - num_dataset_table_columns = len(columns) - num_dataset_metric_columns = len(metrics) - assert ( - len(actual_columns) - == num_physical_columns + num_dataset_table_columns + num_dataset_metric_columns - ) - - # table columns are created before dataset columns are created - offset = 0 - for i in range(num_physical_columns): - assert actual_columns[i + offset] == { - **columns_default, - **expected_table_columns[i], - "id": i + offset + 1, - # physical columns for table have its own uuid - "uuid": actual_columns[i + offset]["uuid"], - "is_physical": True, - # table columns do not have creators - "created_by": None, - "tables": [1], - } - - offset += num_physical_columns - for i, column in enumerate(sqla_table.columns): - assert actual_columns[i + offset] == { - **columns_default, - **expected_table_columns[i], - "id": i + offset + 1, - # columns for dataset reuses the same uuid of TableColumn - "uuid": str(column.uuid), - "datasets": [1], - } - - offset += num_dataset_table_columns - for i, metric in enumerate(sqla_table.metrics): - assert actual_columns[i + offset] == { - **columns_default, - **expected_metric_columns[i], - "id": i + offset + 1, - "uuid": str(metric.uuid), - "datasets": [1], - } - - # check that table was created - table_schema = TableSchema() - tables = [ - { - k: v - for k, v in table_schema.dump(table).items() - if k not in (ignored_keys | {"uuid"}) - } - for table in session.query(Table).all() - ] - assert len(tables) == 1 - assert tables[0] == { - "id": 1, - "database": 1, - "created_by": 1, - "changed_by": 1, - "datasets": [1], - "columns": [1, 2, 3], - "extra_json": "{}", - "catalog": None, - "schema": "my_schema", - "name": "old_dataset", - "is_managed_externally": False, - "external_url": None, - } - - # check that dataset was created - dataset_schema = DatasetSchema() - datasets = [ - {k: v for k, v in dataset_schema.dump(dataset).items() if k not in ignored_keys} - for dataset in session.query(Dataset).all() - ] - assert len(datasets) == 1 - assert datasets[0] == { - "id": 1, - "uuid": str(sqla_table.uuid), - "created_by": 1, - "changed_by": 1, - "owners": [1], - "name": "old_dataset", - "columns": [4, 5, 6, 7, 8, 9], - "is_physical": True, - "database": 1, - "tables": [1], - "extra_json": "{}", - "expression": "old_dataset", - "is_managed_externally": False, - "external_url": None, - } - - -def test_create_virtual_sqlatable( - app_context: None, - mocker: MockFixture, - session: Session, - sample_columns: Dict["TableColumn", Dict[str, Any]], - sample_metrics: Dict["SqlMetric", Dict[str, Any]], - columns_default: Dict[str, Any], -) -> None: - """ - Test shadow write when creating a new ``SqlaTable``. - - When a new virtual ``SqlaTable`` is created, new models should also be created for - ``Dataset`` and ``Column``. - """ - # patch session - mocker.patch( - "superset.security.SupersetSecurityManager.get_session", return_value=session - ) - - from superset.columns.models import Column - from superset.columns.schemas import ColumnSchema - from superset.connectors.sqla.models import SqlaTable - from superset.datasets.models import Dataset - from superset.datasets.schemas import DatasetSchema - from superset.models.core import Database - from superset.tables.models import Table - - engine = session.get_bind() - Dataset.metadata.create_all(engine) # pylint: disable=no-member - user1 = get_test_user(1, "abc") - physical_table_columns: List[Dict[str, Any]] = [ - dict( - name="ds", - is_temporal=True, - type="TIMESTAMP", - advanced_data_type=None, - expression="ds", - is_physical=True, - ), - dict( - name="num_boys", - type="INTEGER", - advanced_data_type=None, - expression="num_boys", - is_physical=True, - ), - dict( - name="revenue", - type="INTEGER", - advanced_data_type=None, - expression="revenue", - is_physical=True, - ), - dict( - name="expenses", - type="INTEGER", - advanced_data_type=None, - expression="expenses", - is_physical=True, - ), - ] - # create a physical ``Table`` that the virtual dataset points to - database = Database(database_name="my_database", sqlalchemy_uri="sqlite://") - table = Table( - name="some_table", - schema="my_schema", - catalog=None, - database=database, - columns=[ - Column(**props, created_by=user1, changed_by=user1) - for props in physical_table_columns - ], - ) - session.add(table) - session.commit() - - assert session.query(Table).count() == 1 - assert session.query(Dataset).count() == 0 - - # create virtual dataset - columns = list(sample_columns.keys()) - metrics = list(sample_metrics.keys()) - expected_table_columns = list(sample_columns.values()) - expected_metric_columns = list(sample_metrics.values()) - - sqla_table = SqlaTable( - created_by=user1, - changed_by=user1, - owners=[user1], - table_name="old_dataset", - columns=columns, - metrics=metrics, - main_dttm_col="ds", - default_endpoint="https://www.youtube.com/watch?v=dQw4w9WgXcQ", # not used - database=database, - offset=-8, - description="This is the description", - is_featured=1, - cache_timeout=3600, - schema="my_schema", - sql=""" -SELECT - ds, - num_boys, - revenue, - expenses, - revenue - expenses AS profit -FROM - some_table""", - params=json.dumps( - { - "remote_id": 64, - "database_name": "examples", - "import_time": 1606677834, - } - ), - perm=None, - filter_select_enabled=1, - fetch_values_predicate="foo IN (1, 2)", - is_sqllab_view=0, # no longer used? - template_params=json.dumps({"answer": "42"}), - schema_perm=None, - extra=json.dumps({"warning_markdown": "*WARNING*"}), - ) - session.add(sqla_table) - session.flush() - - # should not add a new table - assert session.query(Table).count() == 1 - assert session.query(Dataset).count() == 1 - - # ignore these keys when comparing results - ignored_keys = {"created_on", "changed_on"} - column_schema = ColumnSchema() - actual_columns = [ - {k: v for k, v in column_schema.dump(column).items() if k not in ignored_keys} - for column in session.query(Column).all() - ] - num_physical_columns = len(physical_table_columns) - num_dataset_table_columns = len(columns) - num_dataset_metric_columns = len(metrics) - assert ( - len(actual_columns) - == num_physical_columns + num_dataset_table_columns + num_dataset_metric_columns - ) - - for i, column in enumerate(table.columns): - assert actual_columns[i] == { - **columns_default, - **physical_table_columns[i], - "id": i + 1, - "uuid": str(column.uuid), - "tables": [1], - } - - offset = num_physical_columns - for i, column in enumerate(sqla_table.columns): - assert actual_columns[i + offset] == { - **columns_default, - **expected_table_columns[i], - "id": i + offset + 1, - "uuid": str(column.uuid), - "is_physical": False, - "datasets": [1], - } - - offset = num_physical_columns + num_dataset_table_columns - for i, metric in enumerate(sqla_table.metrics): - assert actual_columns[i + offset] == { - **columns_default, - **expected_metric_columns[i], - "id": i + offset + 1, - "uuid": str(metric.uuid), - "datasets": [1], - } - - # check that dataset was created, and has a reference to the table - dataset_schema = DatasetSchema() - datasets = [ - {k: v for k, v in dataset_schema.dump(dataset).items() if k not in ignored_keys} - for dataset in session.query(Dataset).all() - ] - assert len(datasets) == 1 - assert datasets[0] == { - "id": 1, - "database": 1, - "uuid": str(sqla_table.uuid), - "name": "old_dataset", - "changed_by": 1, - "created_by": 1, - "owners": [1], - "columns": [5, 6, 7, 8, 9, 10], - "is_physical": False, - "tables": [1], - "extra_json": "{}", - "external_url": None, - "is_managed_externally": False, - "expression": """ -SELECT - ds, - num_boys, - revenue, - expenses, - revenue - expenses AS profit -FROM - some_table""", - } - - -def test_delete_sqlatable(app_context: None, session: Session) -> None: - """ - Test that deleting a ``SqlaTable`` also deletes the corresponding ``Dataset``. - """ - from superset.columns.models import Column - from superset.connectors.sqla.models import SqlaTable, TableColumn - from superset.datasets.models import Dataset - from superset.models.core import Database - from superset.tables.models import Table - - engine = session.get_bind() - Dataset.metadata.create_all(engine) # pylint: disable=no-member - - columns = [ - TableColumn(column_name="ds", is_dttm=1, type="TIMESTAMP"), - ] - sqla_table = SqlaTable( - table_name="old_dataset", - columns=columns, - metrics=[], - database=Database(database_name="my_database", sqlalchemy_uri="sqlite://"), - ) - session.add(sqla_table) - session.flush() - - assert session.query(Dataset).count() == 1 - assert session.query(Table).count() == 1 - assert session.query(Column).count() == 2 - - session.delete(sqla_table) - session.flush() - - # test that dataset and dataset columns are also deleted - # but the physical table and table columns are kept - assert session.query(Dataset).count() == 0 - assert session.query(Table).count() == 1 - assert session.query(Column).count() == 1 - - -def test_update_physical_sqlatable_columns( - mocker: MockFixture, app_context: None, session: Session -) -> None: - """ - Test that updating a ``SqlaTable`` also updates the corresponding ``Dataset``. - """ - # patch session - mocker.patch( - "superset.security.SupersetSecurityManager.get_session", return_value=session - ) - - from superset.columns.models import Column - from superset.connectors.sqla.models import SqlaTable, TableColumn - from superset.datasets.models import Dataset - from superset.models.core import Database - from superset.tables.models import Table - - engine = session.get_bind() - Dataset.metadata.create_all(engine) # pylint: disable=no-member - - columns = [ - TableColumn(column_name="ds", is_dttm=1, type="TIMESTAMP"), - ] - sqla_table = SqlaTable( - table_name="old_dataset", - columns=columns, - metrics=[], - database=Database(database_name="my_database", sqlalchemy_uri="sqlite://"), - ) - - session.add(sqla_table) - session.flush() - - assert session.query(Table).count() == 1 - assert session.query(Dataset).count() == 1 - assert session.query(Column).count() == 2 # 1 for table, 1 for dataset - - dataset = session.query(Dataset).one() - assert len(dataset.columns) == 1 - - # add a column to the original ``SqlaTable`` instance - sqla_table.columns.append(TableColumn(column_name="num_boys", type="INTEGER")) - session.flush() - - assert session.query(Column).count() == 3 - dataset = session.query(Dataset).one() - assert len(dataset.columns) == 2 - - # check that both lists have the same uuids - assert [col.uuid for col in sqla_table.columns].sort() == [ - col.uuid for col in dataset.columns - ].sort() - - # delete the column in the original instance - sqla_table.columns = sqla_table.columns[1:] - session.flush() - - # check that the column was added to the dataset and the added columns have - # the correct uuid. - assert session.query(TableColumn).count() == 1 - # the extra Dataset.column is deleted, but Table.column is kept - assert session.query(Column).count() == 2 - - # check that the column was also removed from the dataset - dataset = session.query(Dataset).one() - assert len(dataset.columns) == 1 - - # modify the attribute in a column - sqla_table.columns[0].is_dttm = True - session.flush() - - # check that the dataset column was modified - dataset = session.query(Dataset).one() - assert dataset.columns[0].is_temporal is True - - -def test_update_physical_sqlatable_schema( - mocker: MockFixture, app_context: None, session: Session -) -> None: - """ - Test that updating a ``SqlaTable`` schema also updates the corresponding ``Dataset``. - """ - # patch session - mocker.patch( - "superset.security.SupersetSecurityManager.get_session", return_value=session - ) - mocker.patch("superset.datasets.dao.db.session", session) - - from superset.columns.models import Column - from superset.connectors.sqla.models import SqlaTable, TableColumn - from superset.datasets.models import Dataset - from superset.models.core import Database - from superset.tables.models import Table - - engine = session.get_bind() - Dataset.metadata.create_all(engine) # pylint: disable=no-member - - columns = [ - TableColumn(column_name="ds", is_dttm=1, type="TIMESTAMP"), - ] - sqla_table = SqlaTable( - table_name="old_dataset", - schema="old_schema", - columns=columns, - metrics=[], - database=Database(database_name="my_database", sqlalchemy_uri="sqlite://"), - ) - session.add(sqla_table) - session.flush() - - dataset = session.query(Dataset).one() - assert dataset.tables[0].schema == "old_schema" - assert dataset.tables[0].id == 1 - - sqla_table.schema = "new_schema" - session.flush() - - new_dataset = session.query(Dataset).one() - assert new_dataset.tables[0].schema == "new_schema" - assert new_dataset.tables[0].id == 2 - - -def test_update_physical_sqlatable_metrics( - mocker: MockFixture, - app_context: None, - session: Session, - get_session: Callable[[], Session], -) -> None: - """ - Test that updating a ``SqlaTable`` also updates the corresponding ``Dataset``. - - For this test we check that updating the SQL expression in a metric belonging to a - ``SqlaTable`` is reflected in the ``Dataset`` metric. - """ - # patch session - mocker.patch( - "superset.security.SupersetSecurityManager.get_session", return_value=session - ) - - from superset.columns.models import Column - from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn - from superset.datasets.models import Dataset - from superset.models.core import Database - from superset.tables.models import Table - - engine = session.get_bind() - Dataset.metadata.create_all(engine) # pylint: disable=no-member - - columns = [ - TableColumn(column_name="ds", is_dttm=1, type="TIMESTAMP"), - ] - metrics = [ - SqlMetric(metric_name="cnt", expression="COUNT(*)"), - ] - sqla_table = SqlaTable( - table_name="old_dataset", - columns=columns, - metrics=metrics, - database=Database(database_name="my_database", sqlalchemy_uri="sqlite://"), - ) - session.add(sqla_table) - session.flush() - - # check that the metric was created - # 1 physical column for table + (1 column + 1 metric for datasets) - assert session.query(Column).count() == 3 - - column = session.query(Column).filter_by(is_physical=False).one() - assert column.expression == "COUNT(*)" - - # change the metric definition - sqla_table.metrics[0].expression = "MAX(ds)" - session.flush() - - assert column.expression == "MAX(ds)" - - # in a new session, update new columns and metrics at the same time - # reload the sqla_table so we can test the case that accessing an not already - # loaded attribute (`sqla_table.metrics`) while there are updates on the instance - # may trigger `after_update` before the attribute is loaded - session = get_session() - sqla_table = session.query(SqlaTable).filter(SqlaTable.id == sqla_table.id).one() - sqla_table.columns.append( - TableColumn( - column_name="another_column", - is_dttm=0, - type="TIMESTAMP", - expression="concat('a', 'b')", - ) - ) - # Here `SqlaTable.after_update` is triggered - # before `sqla_table.metrics` is loaded - sqla_table.metrics.append( - SqlMetric(metric_name="another_metric", expression="COUNT(*)") - ) - # `SqlaTable.after_update` will trigger again at flushing - session.flush() - assert session.query(Column).count() == 5 - - -def test_update_physical_sqlatable_database( - mocker: MockFixture, - app_context: None, - session: Session, - get_session: Callable[[], Session], -) -> None: - """ - Test updating the table on a physical dataset. - - When updating the table on a physical dataset by pointing it somewhere else (change - in database ID, schema, or table name) we should point the ``Dataset`` to an - existing ``Table`` if possible, and create a new one otherwise. - """ - # patch session - mocker.patch( - "superset.security.SupersetSecurityManager.get_session", return_value=session - ) - mocker.patch("superset.datasets.dao.db.session", session) - - from superset.columns.models import Column - from superset.connectors.sqla.models import SqlaTable, TableColumn - from superset.datasets.models import Dataset, dataset_column_association_table - from superset.models.core import Database - from superset.tables.models import Table, table_column_association_table - from superset.tables.schemas import TableSchema - - engine = session.get_bind() - Dataset.metadata.create_all(engine) # pylint: disable=no-member - - columns = [ - TableColumn(column_name="a", type="INTEGER"), - ] - - original_database = Database( - database_name="my_database", sqlalchemy_uri="sqlite://" - ) - sqla_table = SqlaTable( - table_name="original_table", - columns=columns, - metrics=[], - database=original_database, - ) - session.add(sqla_table) - session.flush() - - assert session.query(Table).count() == 1 - assert session.query(Dataset).count() == 1 - assert session.query(Column).count() == 2 # 1 for table, 1 for dataset - - # check that the table was created, and that the created dataset points to it - table = session.query(Table).one() - assert table.id == 1 - assert table.name == "original_table" - assert table.schema is None - assert table.database_id == 1 - - dataset = session.query(Dataset).one() - assert dataset.tables == [table] - - # point ``SqlaTable`` to a different database - new_database = Database( - database_name="my_other_database", sqlalchemy_uri="sqlite://" - ) - session.add(new_database) - session.flush() - sqla_table.database = new_database - sqla_table.table_name = "new_table" - session.flush() - - assert session.query(Dataset).count() == 1 - assert session.query(Table).count() == 2 - # <Column:id=1> is kept for the old table - # <Column:id=2> is kept for the updated dataset - # <Column:id=3> is created for the new table - assert session.query(Column).count() == 3 - - # ignore these keys when comparing results - ignored_keys = {"created_on", "changed_on", "uuid"} - - # check that the old table still exists, and that the dataset points to the newly - # created table, column and dataset - table_schema = TableSchema() - tables = [ - {k: v for k, v in table_schema.dump(table).items() if k not in ignored_keys} - for table in session.query(Table).all() - ] - assert tables[0] == { - "id": 1, - "database": 1, - "columns": [1], - "datasets": [], - "created_by": None, - "changed_by": None, - "extra_json": "{}", - "catalog": None, - "schema": None, - "name": "original_table", - "external_url": None, - "is_managed_externally": False, - } - assert tables[1] == { - "id": 2, - "database": 2, - "datasets": [1], - "columns": [3], - "created_by": None, - "changed_by": None, - "catalog": None, - "schema": None, - "name": "new_table", - "is_managed_externally": False, - "extra_json": "{}", - "external_url": None, - } - - # check that dataset now points to the new table - assert dataset.tables[0].database_id == 2 - # and a new column is created - assert len(dataset.columns) == 1 - assert dataset.columns[0].id == 2 - - # point ``SqlaTable`` back - sqla_table.database = original_database - sqla_table.table_name = "original_table" - session.flush() - - # should not create more table and datasets - assert session.query(Dataset).count() == 1 - assert session.query(Table).count() == 2 - # <Column:id=1> is deleted for the old table - # <Column:id=2> is kept for the updated dataset - # <Column:id=3> is kept for the new table - assert session.query(Column.id).order_by(Column.id).all() == [ - (1,), - (2,), - (3,), - ] - assert session.query(dataset_column_association_table).all() == [(1, 2)] - assert session.query(table_column_association_table).all() == [(1, 1), (2, 3)] - assert session.query(Dataset).filter_by(id=1).one().columns[0].id == 2 - assert session.query(Table).filter_by(id=2).one().columns[0].id == 3 - assert session.query(Table).filter_by(id=1).one().columns[0].id == 1 - - # the dataset points back to the original table - assert dataset.tables[0].database_id == 1 - assert dataset.tables[0].name == "original_table" - - # kept the original column - assert dataset.columns[0].id == 2 - session.commit() - session.close() - - # querying in a new session should still return the same result - session = get_session() - assert session.query(table_column_association_table).all() == [(1, 1), (2, 3)] - - -def test_update_virtual_sqlatable_references( - mocker: MockFixture, app_context: None, session: Session -) -> None: - """ - Test that changing the SQL of a virtual ``SqlaTable`` updates ``Dataset``. - - When the SQL is modified the list of referenced tables should be updated in the new - ``Dataset`` model. - """ - # patch session - mocker.patch( - "superset.security.SupersetSecurityManager.get_session", return_value=session - ) - - from superset.columns.models import Column - from superset.connectors.sqla.models import SqlaTable, TableColumn - from superset.datasets.models import Dataset - from superset.models.core import Database - from superset.tables.models import Table - - engine = session.get_bind() - Dataset.metadata.create_all(engine) # pylint: disable=no-member - - database = Database(database_name="my_database", sqlalchemy_uri="sqlite://") - table1 = Table( - name="table_a", - schema="my_schema", - catalog=None, - database=database, - columns=[Column(name="a", type="INTEGER")], - ) - table2 = Table( - name="table_b", - schema="my_schema", - catalog=None, - database=database, - columns=[Column(name="b", type="INTEGER")], - ) - session.add(table1) - session.add(table2) - session.commit() - - # create virtual dataset - columns = [TableColumn(column_name="a", type="INTEGER")] - - sqla_table = SqlaTable( - table_name="old_dataset", - columns=columns, - database=database, - schema="my_schema", - sql="SELECT a FROM table_a", - ) - session.add(sqla_table) - session.flush() - - # check that new dataset has table1 - dataset: Dataset = session.query(Dataset).one() - assert dataset.tables == [table1] - - # change SQL - sqla_table.sql = "SELECT a, b FROM table_a JOIN table_b" - session.flush() - - # check that new dataset has both tables - new_dataset: Dataset = session.query(Dataset).one() - assert new_dataset.tables == [table1, table2] - assert new_dataset.expression == "SELECT a, b FROM table_a JOIN table_b" - - # automatically add new referenced table - sqla_table.sql = "SELECT a, b, c FROM table_a JOIN table_b JOIN table_c" - session.flush() - - new_dataset = session.query(Dataset).one() - assert len(new_dataset.tables) == 3 - assert new_dataset.tables[2].name == "table_c" - - -def test_quote_expressions(app_context: None, session: Session) -> None: - """ - Test that expressions are quoted appropriately in columns and datasets. - """ - from superset.connectors.sqla.models import SqlaTable, TableColumn - from superset.datasets.models import Dataset - from superset.models.core import Database - - engine = session.get_bind() - Dataset.metadata.create_all(engine) # pylint: disable=no-member - - columns = [ - TableColumn(column_name="has space", type="INTEGER"), - TableColumn(column_name="no_need", type="INTEGER"), - ] - - sqla_table = SqlaTable( - table_name="old dataset", - columns=columns, - metrics=[], - database=Database(database_name="my_database", sqlalchemy_uri="sqlite://"), - ) - session.add(sqla_table) - session.flush() - - dataset = session.query(Dataset).one() - assert dataset.expression == '"old dataset"' - assert dataset.columns[0].expression == '"has space"' - assert dataset.columns[1].expression == "no_need" diff --git a/tests/unit_tests/dao/datasource_test.py b/tests/unit_tests/datasource/dao_tests.py similarity index 68% rename from tests/unit_tests/dao/datasource_test.py rename to tests/unit_tests/datasource/dao_tests.py index a15684d71e69..16334066d7ba 100644 --- a/tests/unit_tests/dao/datasource_test.py +++ b/tests/unit_tests/datasource/dao_tests.py @@ -99,11 +99,9 @@ def session_with_data(session: Session) -> Iterator[Session]: yield session -def test_get_datasource_sqlatable( - app_context: None, session_with_data: Session -) -> None: +def test_get_datasource_sqlatable(session_with_data: Session) -> None: from superset.connectors.sqla.models import SqlaTable - from superset.dao.datasource.dao import DatasourceDAO + from superset.datasource.dao import DatasourceDAO result = DatasourceDAO.get_datasource( datasource_type=DatasourceType.TABLE, @@ -116,8 +114,8 @@ def test_get_datasource_sqlatable( assert isinstance(result, SqlaTable) -def test_get_datasource_query(app_context: None, session_with_data: Session) -> None: - from superset.dao.datasource.dao import DatasourceDAO +def test_get_datasource_query(session_with_data: Session) -> None: + from superset.datasource.dao import DatasourceDAO from superset.models.sql_lab import Query result = DatasourceDAO.get_datasource( @@ -128,10 +126,8 @@ def test_get_datasource_query(app_context: None, session_with_data: Session) -> assert isinstance(result, Query) -def test_get_datasource_saved_query( - app_context: None, session_with_data: Session -) -> None: - from superset.dao.datasource.dao import DatasourceDAO +def test_get_datasource_saved_query(session_with_data: Session) -> None: + from superset.datasource.dao import DatasourceDAO from superset.models.sql_lab import SavedQuery result = DatasourceDAO.get_datasource( @@ -144,44 +140,73 @@ def test_get_datasource_saved_query( assert isinstance(result, SavedQuery) -def test_get_datasource_sl_table(app_context: None, session_with_data: Session) -> None: - from superset.dao.datasource.dao import DatasourceDAO +def test_get_datasource_sl_table(session_with_data: Session) -> None: + from superset.datasource.dao import DatasourceDAO from superset.tables.models import Table - # todo(hugh): This will break once we remove the dual write - # update the datsource_id=1 and this will pass again result = DatasourceDAO.get_datasource( datasource_type=DatasourceType.SLTABLE, - datasource_id=2, + datasource_id=1, session=session_with_data, ) - assert result.id == 2 + assert result.id == 1 assert isinstance(result, Table) -def test_get_datasource_sl_dataset( - app_context: None, session_with_data: Session -) -> None: - from superset.dao.datasource.dao import DatasourceDAO +def test_get_datasource_sl_dataset(session_with_data: Session) -> None: from superset.datasets.models import Dataset + from superset.datasource.dao import DatasourceDAO - # todo(hugh): This will break once we remove the dual write - # update the datsource_id=1 and this will pass again result = DatasourceDAO.get_datasource( datasource_type=DatasourceType.DATASET, - datasource_id=2, + datasource_id=1, session=session_with_data, ) - assert result.id == 2 + assert result.id == 1 assert isinstance(result, Dataset) -def test_get_all_sqlatables_datasources( - app_context: None, session_with_data: Session -) -> None: - from superset.dao.datasource.dao import DatasourceDAO +def test_get_datasource_w_str_param(session_with_data: Session) -> None: + from superset.connectors.sqla.models import SqlaTable + from superset.datasets.models import Dataset + from superset.datasource.dao import DatasourceDAO + from superset.tables.models import Table + + assert isinstance( + DatasourceDAO.get_datasource( + datasource_type="table", + datasource_id=1, + session=session_with_data, + ), + SqlaTable, + ) - result = DatasourceDAO.get_all_sqlatables_datasources(session=session_with_data) + assert isinstance( + DatasourceDAO.get_datasource( + datasource_type="sl_table", + datasource_id=1, + session=session_with_data, + ), + Table, + ) + + +def test_get_all_datasources(session_with_data: Session) -> None: + from superset.connectors.sqla.models import SqlaTable + + result = SqlaTable.get_all_datasources(session=session_with_data) assert len(result) == 1 + + +def test_not_found_datasource(session_with_data: Session) -> None: + from superset.dao.exceptions import DatasourceNotFound + from superset.datasource.dao import DatasourceDAO + + with pytest.raises(DatasourceNotFound): + DatasourceDAO.get_datasource( + datasource_type="table", + datasource_id=500000, + session=session_with_data, + ) diff --git a/tests/unit_tests/db_engine_specs/test_athena.py b/tests/unit_tests/db_engine_specs/test_athena.py index d7c1a3f606fc..51ec6656aa7f 100644 --- a/tests/unit_tests/db_engine_specs/test_athena.py +++ b/tests/unit_tests/db_engine_specs/test_athena.py @@ -17,10 +17,12 @@ # pylint: disable=unused-argument, import-outside-toplevel, protected-access import re from datetime import datetime +from typing import Optional -from flask.ctx import AppContext +import pytest from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm from tests.unit_tests.fixtures.common import dttm SYNTAX_ERROR_REGEX = re.compile( @@ -28,22 +30,23 @@ ) -def test_convert_dttm(app_context: AppContext, dttm: datetime) -> None: - """ - Test that date objects are converted correctly. - """ - - from superset.db_engine_specs.athena import AthenaEngineSpec - - assert AthenaEngineSpec.convert_dttm("DATE", dttm) == "DATE '2019-01-02'" +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "DATE '2019-01-02'"), + ("TimeStamp", "TIMESTAMP '2019-01-02 03:04:05.678'"), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.athena import AthenaEngineSpec as spec - assert ( - AthenaEngineSpec.convert_dttm("TIMESTAMP", dttm) - == "TIMESTAMP '2019-01-02 03:04:05.678'" - ) + assert_convert_dttm(spec, target_type, expected_result, dttm) -def test_extract_errors(app_context: AppContext) -> None: +def test_extract_errors() -> None: """ Test that custom error messages are extracted correctly. """ @@ -70,7 +73,7 @@ def test_extract_errors(app_context: AppContext) -> None: ] -def test_get_text_clause_with_colon(app_context: AppContext) -> None: +def test_get_text_clause_with_colon() -> None: """ Make sure text clauses don't escape the colon character """ diff --git a/tests/unit_tests/db_engine_specs/test_base.py b/tests/unit_tests/db_engine_specs/test_base.py index b112e2cec8ef..868a6bbdc3fe 100644 --- a/tests/unit_tests/db_engine_specs/test_base.py +++ b/tests/unit_tests/db_engine_specs/test_base.py @@ -17,13 +17,16 @@ # pylint: disable=unused-argument, import-outside-toplevel, protected-access from textwrap import dedent +from typing import Any, Dict, Optional, Type import pytest -from flask.ctx import AppContext -from sqlalchemy.types import TypeEngine +from sqlalchemy import types +from superset.utils.core import GenericDataType +from tests.unit_tests.db_engine_specs.utils import assert_column_spec -def test_get_text_clause_with_colon(app_context: AppContext) -> None: + +def test_get_text_clause_with_colon() -> None: """ Make sure text clauses are correctly escaped """ @@ -36,7 +39,7 @@ def test_get_text_clause_with_colon(app_context: AppContext) -> None: assert text_clause.text == "SELECT foo FROM tbl WHERE foo = '123\\:456')" -def test_parse_sql_single_statement(app_context: AppContext) -> None: +def test_parse_sql_single_statement() -> None: """ `parse_sql` should properly strip leading and trailing spaces and semicolons """ @@ -47,7 +50,7 @@ def test_parse_sql_single_statement(app_context: AppContext) -> None: assert queries == ["SELECT foo FROM tbl"] -def test_parse_sql_multi_statement(app_context: AppContext) -> None: +def test_parse_sql_multi_statement() -> None: """ For string with multiple SQL-statements `parse_sql` method should return list where each element represents the single SQL-statement @@ -95,10 +98,43 @@ def test_parse_sql_multi_statement(app_context: AppContext) -> None: ), ], ) -def test_cte_query_parsing( - app_context: AppContext, original: TypeEngine, expected: str -) -> None: +def test_cte_query_parsing(original: types.TypeEngine, expected: str) -> None: from superset.db_engine_specs.base import BaseEngineSpec actual = BaseEngineSpec.get_cte_query(original) assert actual == expected + + +@pytest.mark.parametrize( + "native_type,sqla_type,attrs,generic_type,is_dttm", + [ + ("SMALLINT", types.SmallInteger, None, GenericDataType.NUMERIC, False), + ("INTEGER", types.Integer, None, GenericDataType.NUMERIC, False), + ("BIGINT", types.BigInteger, None, GenericDataType.NUMERIC, False), + ("DECIMAL", types.Numeric, None, GenericDataType.NUMERIC, False), + ("NUMERIC", types.Numeric, None, GenericDataType.NUMERIC, False), + ("REAL", types.REAL, None, GenericDataType.NUMERIC, False), + ("DOUBLE PRECISION", types.Float, None, GenericDataType.NUMERIC, False), + ("MONEY", types.Numeric, None, GenericDataType.NUMERIC, False), + # String + ("CHAR", types.String, None, GenericDataType.STRING, False), + ("VARCHAR", types.String, None, GenericDataType.STRING, False), + ("TEXT", types.String, None, GenericDataType.STRING, False), + # Temporal + ("DATE", types.Date, None, GenericDataType.TEMPORAL, True), + ("TIMESTAMP", types.TIMESTAMP, None, GenericDataType.TEMPORAL, True), + ("TIME", types.Time, None, GenericDataType.TEMPORAL, True), + # Boolean + ("BOOLEAN", types.Boolean, None, GenericDataType.BOOLEAN, False), + ], +) +def test_get_column_spec( + native_type: str, + sqla_type: Type[types.TypeEngine], + attrs: Optional[Dict[str, Any]], + generic_type: GenericDataType, + is_dttm: bool, +) -> None: + from superset.db_engine_specs.databricks import DatabricksNativeEngineSpec as spec + + assert_column_spec(spec, native_type, sqla_type, attrs, generic_type, is_dttm) diff --git a/tests/unit_tests/db_engine_specs/test_bigquery.py b/tests/unit_tests/db_engine_specs/test_bigquery.py index a4a6f706ceab..5b9c6a95636d 100644 --- a/tests/unit_tests/db_engine_specs/test_bigquery.py +++ b/tests/unit_tests/db_engine_specs/test_bigquery.py @@ -14,16 +14,24 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -# pylint: disable=unused-argument, import-outside-toplevel, protected-access -from flask.ctx import AppContext -from pybigquery.sqlalchemy_bigquery import BigQueryDialect +# pylint: disable=line-too-long, import-outside-toplevel, protected-access, invalid-name + +import json +from datetime import datetime +from typing import Optional + +import pytest from pytest_mock import MockFixture from sqlalchemy import select from sqlalchemy.sql import sqltypes +from sqlalchemy_bigquery import BigQueryDialect + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm -def test_get_fields(app_context: AppContext) -> None: +def test_get_fields() -> None: """ Test the custom ``_get_fields`` method. @@ -66,7 +74,7 @@ def test_get_fields(app_context: AppContext) -> None: ) -def test_select_star(mocker: MockFixture, app_context: AppContext) -> None: +def test_select_star(mocker: MockFixture) -> None: """ Test the ``select_star`` method. @@ -145,3 +153,162 @@ def test_select_star(mocker: MockFixture, app_context: AppContext) -> None: FROM `my_table` LIMIT :param_1""" ) + + +def test_get_parameters_from_uri_serializable() -> None: + """ + Test that the result from ``get_parameters_from_uri`` is JSON serializable. + """ + from superset.db_engine_specs.bigquery import BigQueryEngineSpec + + parameters = BigQueryEngineSpec.get_parameters_from_uri( + "bigquery://dbt-tutorial-347100/", + {"access_token": "TOP_SECRET"}, + ) + assert parameters == {"access_token": "TOP_SECRET", "query": {}} + assert json.loads(json.dumps(parameters)) == parameters + + +def test_unmask_encrypted_extra() -> None: + """ + Test that the private key can be reused from the previous ``encrypted_extra``. + """ + from superset.db_engine_specs.bigquery import BigQueryEngineSpec + + old = json.dumps( + { + "credentials_info": { + "project_id": "black-sanctum-314419", + "private_key": "SECRET", + }, + } + ) + new = json.dumps( + { + "credentials_info": { + "project_id": "yellow-unicorn-314419", + "private_key": "XXXXXXXXXX", + }, + } + ) + + assert json.loads(str(BigQueryEngineSpec.unmask_encrypted_extra(old, new))) == { + "credentials_info": { + "project_id": "yellow-unicorn-314419", + "private_key": "SECRET", + }, + } + + +def test_unmask_encrypted_extra_when_empty() -> None: + """ + Test that a None value works for ``encrypted_extra``. + """ + from superset.db_engine_specs.bigquery import BigQueryEngineSpec + + old = None + new = json.dumps( + { + "credentials_info": { + "project_id": "yellow-unicorn-314419", + "private_key": "XXXXXXXXXX", + }, + } + ) + + assert json.loads(str(BigQueryEngineSpec.unmask_encrypted_extra(old, new))) == { + "credentials_info": { + "project_id": "yellow-unicorn-314419", + "private_key": "XXXXXXXXXX", + }, + } + + +def test_unmask_encrypted_extra_when_new_is_empty() -> None: + """ + Test that a None value works for ``encrypted_extra``. + """ + from superset.db_engine_specs.bigquery import BigQueryEngineSpec + + old = json.dumps( + { + "credentials_info": { + "project_id": "black-sanctum-314419", + "private_key": "SECRET", + }, + } + ) + new = None + + assert BigQueryEngineSpec.unmask_encrypted_extra(old, new) is None + + +def test_mask_encrypted_extra_when_empty() -> None: + """ + Test that the encrypted extra will return a none value if the field is empty. + """ + from superset.db_engine_specs.bigquery import BigQueryEngineSpec + + assert BigQueryEngineSpec.mask_encrypted_extra(None) is None + + +def test_parse_error_message() -> None: + """ + Test that we parse a received message and just extract the useful information. + + Example errors: + bigquery error: 400 Syntax error: Table \"case_detail_all_suites\" must be qualified with a dataset (e.g. dataset.table). + + (job ID: ddf30b05-44e8-4fbf-aa29-40bfccaed886) + -----Query Job SQL Follows----- + | . | . | . |\n 1:select * from case_detail_all_suites\n 2:LIMIT 1001\n | . | . | . | + """ + from superset.db_engine_specs.bigquery import BigQueryEngineSpec + + message = 'bigquery error: 400 Syntax error: Table "case_detail_all_suites" must be qualified with a dataset (e.g. dataset.table).\n\n(job ID: ddf30b05-44e8-4fbf-aa29-40bfccaed886)\n\n -----Query Job SQL Follows----- \n\n | . | . | . |\n 1:select * from case_detail_all_suites\n 2:LIMIT 1001\n | . | . | . |' + expected_result = 'bigquery error: 400 Syntax error: Table "case_detail_all_suites" must be qualified with a dataset (e.g. dataset.table).' + assert ( + str(BigQueryEngineSpec.parse_error_exception(Exception(message))) + == expected_result + ) + + +def test_parse_error_raises_exception() -> None: + """ + Test that we handle any exception we might get from calling the parse_error_exception method. + + Example errors: + 400 Syntax error: Expected "(" or keyword UNNEST but got "@" at [4:80] + bigquery error: 400 Table \"case_detail_all_suites\" must be qualified with a dataset (e.g. dataset.table). + """ + from superset.db_engine_specs.bigquery import BigQueryEngineSpec + + message = 'bigquery error: 400 Syntax error: Table "case_detail_all_suites" must be qualified with a dataset (e.g. dataset.table).' + message_2 = "6" + expected_result = 'bigquery error: 400 Syntax error: Table "case_detail_all_suites" must be qualified with a dataset (e.g. dataset.table).' + assert ( + str(BigQueryEngineSpec.parse_error_exception(Exception(message))) + == expected_result + ) + assert str(BigQueryEngineSpec.parse_error_exception(Exception(message_2))) == "6" + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "CAST('2019-01-02' AS DATE)"), + ("DateTime", "CAST('2019-01-02T03:04:05.678900' AS DATETIME)"), + ("TimeStamp", "CAST('2019-01-02T03:04:05.678900' AS TIMESTAMP)"), + ("Time", "CAST('03:04:05.678900' AS TIME)"), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + """ + DB Eng Specs (bigquery): Test conversion to date time + """ + from superset.db_engine_specs.bigquery import BigQueryEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_clickhouse.py b/tests/unit_tests/db_engine_specs/test_clickhouse.py new file mode 100644 index 000000000000..9a52b04616af --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_clickhouse.py @@ -0,0 +1,55 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from datetime import datetime +from typing import Optional +from unittest.mock import Mock + +import pytest + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "toDate('2019-01-02')"), + ("DateTime", "toDateTime('2019-01-02 03:04:05')"), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.clickhouse import ClickHouseEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) + + +def test_execute_connection_error() -> None: + from urllib3.exceptions import NewConnectionError + + from superset.db_engine_specs.clickhouse import ClickHouseEngineSpec + from superset.db_engine_specs.exceptions import SupersetDBAPIDatabaseError + + cursor = Mock() + cursor.execute.side_effect = NewConnectionError( + "Dummypool", "Exception with sensitive data" + ) + with pytest.raises(SupersetDBAPIDatabaseError) as ex: + ClickHouseEngineSpec.execute(cursor, "SELECT col1 from table1") diff --git a/tests/unit_tests/db_engine_specs/test_crate.py b/tests/unit_tests/db_engine_specs/test_crate.py new file mode 100644 index 000000000000..2cb1cd78966d --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_crate.py @@ -0,0 +1,71 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from datetime import datetime +from typing import Optional + +import pytest + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +def test_epoch_to_dttm() -> None: + """ + DB Eng Specs (crate): Test epoch to dttm + """ + from superset.db_engine_specs.crate import CrateEngineSpec + + assert CrateEngineSpec.epoch_to_dttm() == "{col} * 1000" + + +def test_epoch_ms_to_dttm() -> None: + """ + DB Eng Specs (crate): Test epoch ms to dttm + """ + from superset.db_engine_specs.crate import CrateEngineSpec + + assert CrateEngineSpec.epoch_ms_to_dttm() == "{col}" + + +def test_alter_new_orm_column() -> None: + """ + DB Eng Specs (crate): Test alter orm column + """ + from superset.connectors.sqla.models import SqlaTable, TableColumn + from superset.db_engine_specs.crate import CrateEngineSpec + from superset.models.core import Database + + database = Database(database_name="crate", sqlalchemy_uri="crate://db") + tbl = SqlaTable(table_name="tbl", database=database) + col = TableColumn(column_name="ts", type="TIMESTAMP", table=tbl) + CrateEngineSpec.alter_new_orm_column(col) + assert col.python_date_format == "epoch_ms" + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("TimeStamp", "1546398245678.9"), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.crate import CrateEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_databricks.py b/tests/unit_tests/db_engine_specs/test_databricks.py new file mode 100644 index 000000000000..49d65b324b0b --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_databricks.py @@ -0,0 +1,246 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# pylint: disable=unused-argument, import-outside-toplevel, protected-access + +import json +from datetime import datetime +from typing import Optional + +import pytest +from pytest_mock import MockerFixture + +from superset.db_engine_specs.databricks import DatabricksNativeEngineSpec +from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +def test_get_parameters_from_uri() -> None: + """ + Test that the result from ``get_parameters_from_uri`` is JSON serializable. + """ + from superset.db_engine_specs.databricks import ( + DatabricksNativeEngineSpec, + DatabricksParametersType, + ) + + parameters = DatabricksNativeEngineSpec.get_parameters_from_uri( + "databricks+connector://token:abc12345@my_hostname:1234/test" + ) + assert parameters == DatabricksParametersType( + { + "access_token": "abc12345", + "host": "my_hostname", + "port": 1234, + "database": "test", + "encryption": False, + } + ) + assert json.loads(json.dumps(parameters)) == parameters + + +def test_build_sqlalchemy_uri() -> None: + """ + test that the parameters are can correctly be compiled into a + sqlalchemy_uri + """ + from superset.db_engine_specs.databricks import ( + DatabricksNativeEngineSpec, + DatabricksParametersType, + ) + + parameters = DatabricksParametersType( + { + "access_token": "abc12345", + "host": "my_hostname", + "port": 1234, + "database": "test", + "encryption": False, + } + ) + encrypted_extra = None + sqlalchemy_uri = DatabricksNativeEngineSpec.build_sqlalchemy_uri( + parameters, encrypted_extra + ) + assert sqlalchemy_uri == ( + "databricks+connector://token:abc12345@my_hostname:1234/test" + ) + + +def test_parameters_json_schema() -> None: + """ + test that the parameters schema can be converted to json + """ + from superset.db_engine_specs.databricks import DatabricksNativeEngineSpec + + json_schema = DatabricksNativeEngineSpec.parameters_json_schema() + + assert json_schema == { + "type": "object", + "properties": { + "access_token": {"type": "string"}, + "database": {"type": "string"}, + "encryption": { + "description": "Use an encrypted connection to the database", + "type": "boolean", + }, + "host": {"type": "string"}, + "http_path": {"type": "string"}, + "port": { + "description": "Database port", + "format": "int32", + "maximum": 65536, + "minimum": 0, + "type": "integer", + }, + }, + "required": ["access_token", "database", "host", "http_path", "port"], + } + + +def test_get_extra_params(mocker: MockerFixture) -> None: + """ + Test the ``get_extra_params`` method. + """ + from superset.db_engine_specs.databricks import DatabricksNativeEngineSpec + + database = mocker.MagicMock() + + database.extra = {} + assert DatabricksNativeEngineSpec.get_extra_params(database) == { + "engine_params": { + "connect_args": { + "http_headers": [("User-Agent", "Apache Superset")], + "_user_agent_entry": "Apache Superset", + } + } + } + + database.extra = json.dumps( + { + "engine_params": { + "connect_args": { + "http_headers": [("User-Agent", "Custom user agent")], + "_user_agent_entry": "Custom user agent", + "foo": "bar", + } + } + } + ) + assert DatabricksNativeEngineSpec.get_extra_params(database) == { + "engine_params": { + "connect_args": { + "http_headers": [["User-Agent", "Custom user agent"]], + "_user_agent_entry": "Custom user agent", + "foo": "bar", + } + } + } + + # it should also remove whitespace from http_path + database.extra = json.dumps( + { + "engine_params": { + "connect_args": { + "http_headers": [("User-Agent", "Custom user agent")], + "_user_agent_entry": "Custom user agent", + "http_path": "/some_path_here_with_whitespace ", + } + } + } + ) + assert DatabricksNativeEngineSpec.get_extra_params(database) == { + "engine_params": { + "connect_args": { + "http_headers": [["User-Agent", "Custom user agent"]], + "_user_agent_entry": "Custom user agent", + "http_path": "/some_path_here_with_whitespace", + } + } + } + + +def test_extract_errors() -> None: + """ + Test that custom error messages are extracted correctly. + """ + + msg = ": mismatched input 'fromm'. Expecting: " + result = DatabricksNativeEngineSpec.extract_errors(Exception(msg)) + + assert result == [ + SupersetError( + message=": mismatched input 'fromm'. Expecting: ", + error_type=SupersetErrorType.GENERIC_DB_ENGINE_ERROR, + level=ErrorLevel.ERROR, + extra={ + "engine_name": "Databricks", + "issue_codes": [ + { + "code": 1002, + "message": "Issue 1002 - The database returned an unexpected error.", + } + ], + }, + ) + ] + + +def test_extract_errors_with_context() -> None: + """ + Test that custom error messages are extracted correctly with context. + """ + + msg = ": mismatched input 'fromm'. Expecting: " + context = {"hostname": "foo"} + result = DatabricksNativeEngineSpec.extract_errors(Exception(msg), context) + + assert result == [ + SupersetError( + message=": mismatched input 'fromm'. Expecting: ", + error_type=SupersetErrorType.GENERIC_DB_ENGINE_ERROR, + level=ErrorLevel.ERROR, + extra={ + "engine_name": "Databricks", + "issue_codes": [ + { + "code": 1002, + "message": "Issue 1002 - The database returned an unexpected error.", + } + ], + }, + ) + ] + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "CAST('2019-01-02' AS DATE)"), + ( + "TimeStamp", + "CAST('2019-01-02 03:04:05.678900' AS TIMESTAMP)", + ), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.databricks import DatabricksNativeEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_dremio.py b/tests/unit_tests/db_engine_specs/test_dremio.py new file mode 100644 index 000000000000..6b1e8203b5df --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_dremio.py @@ -0,0 +1,42 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from datetime import datetime +from typing import Optional + +import pytest + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "TO_DATE('2019-01-02', 'YYYY-MM-DD')"), + ( + "TimeStamp", + "TO_TIMESTAMP('2019-01-02 03:04:05.678', 'YYYY-MM-DD HH24:MI:SS.FFF')", + ), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.dremio import DremioEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_drill.py b/tests/unit_tests/db_engine_specs/test_drill.py index ad7254870f6e..e56df5d47cc4 100644 --- a/tests/unit_tests/db_engine_specs/test_drill.py +++ b/tests/unit_tests/db_engine_specs/test_drill.py @@ -16,13 +16,18 @@ # under the License. # pylint: disable=unused-argument, import-outside-toplevel, protected-access -from flask.ctx import AppContext -from pytest import raises +from datetime import datetime +from typing import Optional +import pytest -def test_odbc_impersonation(app_context: AppContext) -> None: +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +def test_odbc_impersonation() -> None: """ - Test ``modify_url_for_impersonation`` method when driver == odbc. + Test ``get_url_for_impersonation`` method when driver == odbc. The method adds the parameter ``DelegationUID`` to the query string. """ @@ -32,13 +37,13 @@ def test_odbc_impersonation(app_context: AppContext) -> None: url = URL("drill+odbc") username = "DoAsUser" - DrillEngineSpec.modify_url_for_impersonation(url, True, username) + url = DrillEngineSpec.get_url_for_impersonation(url, True, username) assert url.query["DelegationUID"] == username -def test_jdbc_impersonation(app_context: AppContext) -> None: +def test_jdbc_impersonation() -> None: """ - Test ``modify_url_for_impersonation`` method when driver == jdbc. + Test ``get_url_for_impersonation`` method when driver == jdbc. The method adds the parameter ``impersonation_target`` to the query string. """ @@ -48,13 +53,13 @@ def test_jdbc_impersonation(app_context: AppContext) -> None: url = URL("drill+jdbc") username = "DoAsUser" - DrillEngineSpec.modify_url_for_impersonation(url, True, username) + url = DrillEngineSpec.get_url_for_impersonation(url, True, username) assert url.query["impersonation_target"] == username -def test_sadrill_impersonation(app_context: AppContext) -> None: +def test_sadrill_impersonation() -> None: """ - Test ``modify_url_for_impersonation`` method when driver == sadrill. + Test ``get_url_for_impersonation`` method when driver == sadrill. The method adds the parameter ``impersonation_target`` to the query string. """ @@ -64,13 +69,13 @@ def test_sadrill_impersonation(app_context: AppContext) -> None: url = URL("drill+sadrill") username = "DoAsUser" - DrillEngineSpec.modify_url_for_impersonation(url, True, username) + url = DrillEngineSpec.get_url_for_impersonation(url, True, username) assert url.query["impersonation_target"] == username -def test_invalid_impersonation(app_context: AppContext) -> None: +def test_invalid_impersonation() -> None: """ - Test ``modify_url_for_impersonation`` method when driver == foobar. + Test ``get_url_for_impersonation`` method when driver == foobar. The method raises an exception because impersonation is not supported for drill+foobar. @@ -83,5 +88,21 @@ def test_invalid_impersonation(app_context: AppContext) -> None: url = URL("drill+foobar") username = "DoAsUser" - with raises(SupersetDBAPIProgrammingError): - DrillEngineSpec.modify_url_for_impersonation(url, True, username) + with pytest.raises(SupersetDBAPIProgrammingError): + DrillEngineSpec.get_url_for_impersonation(url, True, username) + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "TO_DATE('2019-01-02', 'yyyy-MM-dd')"), + ("TimeStamp", "TO_TIMESTAMP('2019-01-02 03:04:05', 'yyyy-MM-dd HH:mm:ss')"), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.drill import DrillEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_druid.py b/tests/unit_tests/db_engine_specs/test_druid.py new file mode 100644 index 000000000000..d090dffcde04 --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_druid.py @@ -0,0 +1,95 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from datetime import datetime +from typing import Optional +from unittest import mock + +import pytest +from sqlalchemy import column + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "CAST(TIME_PARSE('2019-01-02') AS DATE)"), + ("DateTime", "TIME_PARSE('2019-01-02T03:04:05')"), + ("TimeStamp", "TIME_PARSE('2019-01-02T03:04:05')"), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.druid import DruidEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) + + +@pytest.mark.parametrize( + "time_grain,expected_result", + [ + ("PT1S", "TIME_FLOOR(CAST(col AS TIMESTAMP), 'PT1S')"), + ("PT5M", "TIME_FLOOR(CAST({col} AS TIMESTAMP), 'PT5M')"), + ( + "P1W/1970-01-03T00:00:00Z", + "TIME_SHIFT(TIME_FLOOR(TIME_SHIFT(CAST(col AS TIMESTAMP), 'P1D', 1), 'P1W'), 'P1D', 5)", + ), + ( + "1969-12-28T00:00:00Z/P1W", + "TIME_SHIFT(TIME_FLOOR(TIME_SHIFT(CAST(col AS TIMESTAMP), 'P1D', 1), 'P1W'), 'P1D', -1)", + ), + ], +) +def test_timegrain_expressions(time_grain: str, expected_result: str) -> None: + """ + DB Eng Specs (druid): Test time grain expressions + """ + from superset.db_engine_specs.druid import DruidEngineSpec + + assert str( + DruidEngineSpec.get_timestamp_expr( + col=column("col"), pdf=None, time_grain=time_grain + ) + ) + + +def test_extras_without_ssl() -> None: + from superset.db_engine_specs.druid import DruidEngineSpec + from tests.integration_tests.fixtures.database import default_db_extra + + db = mock.Mock() + db.extra = default_db_extra + db.server_cert = None + extras = DruidEngineSpec.get_extra_params(db) + assert "connect_args" not in extras["engine_params"] + + +def test_extras_with_ssl() -> None: + from superset.db_engine_specs.druid import DruidEngineSpec + from tests.integration_tests.fixtures.certificates import ssl_certificate + from tests.integration_tests.fixtures.database import default_db_extra + + db = mock.Mock() + db.extra = default_db_extra + db.server_cert = ssl_certificate + extras = DruidEngineSpec.get_extra_params(db) + connect_args = extras["engine_params"]["connect_args"] + assert connect_args["scheme"] == "https" + assert "ssl_verify_cert" in connect_args diff --git a/tests/unit_tests/db_engine_specs/test_duckdb.py b/tests/unit_tests/db_engine_specs/test_duckdb.py new file mode 100644 index 000000000000..72d018f4fcdc --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_duckdb.py @@ -0,0 +1,40 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from datetime import datetime +from typing import Optional + +import pytest + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Text", "'2019-01-02 03:04:05.678900'"), + ("DateTime", "'2019-01-02 03:04:05.678900'"), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.duckdb import DuckDBEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_dynamodb.py b/tests/unit_tests/db_engine_specs/test_dynamodb.py new file mode 100644 index 000000000000..26196f5b459e --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_dynamodb.py @@ -0,0 +1,40 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from datetime import datetime +from typing import Optional + +import pytest + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("text", "'2019-01-02 03:04:05'"), + ("dateTime", "'2019-01-02 03:04:05'"), + ("unknowntype", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.dynamodb import DynamoDBEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_elasticsearch.py b/tests/unit_tests/db_engine_specs/test_elasticsearch.py new file mode 100644 index 000000000000..de55c63426b7 --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_elasticsearch.py @@ -0,0 +1,106 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from datetime import datetime +from typing import Any, Dict, Optional +from unittest.mock import MagicMock + +import pytest +from sqlalchemy import column + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,db_extra,expected_result", + [ + ("DateTime", None, "CAST('2019-01-02T03:04:05' AS DATETIME)"), + ( + "DateTime", + {"version": "7.7"}, + "CAST('2019-01-02T03:04:05' AS DATETIME)", + ), + ( + "DateTime", + {"version": "7.8"}, + "DATETIME_PARSE('2019-01-02 03:04:05', 'yyyy-MM-dd HH:mm:ss')", + ), + ( + "DateTime", + {"version": "unparseable semver version"}, + "CAST('2019-01-02T03:04:05' AS DATETIME)", + ), + ("Unknown", None, None), + ], +) +def test_elasticsearch_convert_dttm( + target_type: str, + db_extra: Optional[Dict[str, Any]], + expected_result: Optional[str], + dttm: datetime, +) -> None: + from superset.db_engine_specs.elasticsearch import ElasticSearchEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm, db_extra) + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("DateTime", "'2019-01-02T03:04:05'"), + ("Unknown", None), + ], +) +def test_opendistro_convert_dttm( + target_type: str, + expected_result: Optional[str], + dttm: datetime, +) -> None: + from superset.db_engine_specs.elasticsearch import OpenDistroEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) + + +@pytest.mark.parametrize( + "original,expected", + [ + ("Col", "Col"), + ("Col.keyword", "Col_keyword"), + ], +) +def test_opendistro_sqla_column_label(original: str, expected: str) -> None: + """ + DB Eng Specs (opendistro): Test column label + """ + from superset.db_engine_specs.elasticsearch import OpenDistroEngineSpec + + assert OpenDistroEngineSpec.make_label_compatible(original) == expected + + +def test_opendistro_strip_comments() -> None: + """ + DB Eng Specs (opendistro): Test execute sql strip comments + """ + from superset.db_engine_specs.elasticsearch import OpenDistroEngineSpec + + mock_cursor = MagicMock() + mock_cursor.execute.return_value = [] + + OpenDistroEngineSpec.execute( + mock_cursor, "-- some comment \nSELECT 1\n --other comment" + ) + mock_cursor.execute.assert_called_once_with("SELECT 1\n") diff --git a/tests/unit_tests/db_engine_specs/test_firebird.py b/tests/unit_tests/db_engine_specs/test_firebird.py new file mode 100644 index 000000000000..c1add91678ab --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_firebird.py @@ -0,0 +1,102 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from datetime import datetime +from typing import Optional + +import pytest + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "time_grain,expected", + [ + (None, "timestamp_column"), + ( + "PT1S", + ( + "CAST(CAST(timestamp_column AS DATE) " + "|| ' ' " + "|| EXTRACT(HOUR FROM timestamp_column) " + "|| ':' " + "|| EXTRACT(MINUTE FROM timestamp_column) " + "|| ':' " + "|| FLOOR(EXTRACT(SECOND FROM timestamp_column)) AS TIMESTAMP)" + ), + ), + ( + "PT1M", + ( + "CAST(CAST(timestamp_column AS DATE) " + "|| ' ' " + "|| EXTRACT(HOUR FROM timestamp_column) " + "|| ':' " + "|| EXTRACT(MINUTE FROM timestamp_column) " + "|| ':00' AS TIMESTAMP)" + ), + ), + ("P1D", "CAST(timestamp_column AS DATE)"), + ( + "P1M", + ( + "CAST(EXTRACT(YEAR FROM timestamp_column) " + "|| '-' " + "|| EXTRACT(MONTH FROM timestamp_column) " + "|| '-01' AS DATE)" + ), + ), + ("P1Y", "CAST(EXTRACT(YEAR FROM timestamp_column) || '-01-01' AS DATE)"), + ], +) +def test_time_grain_expressions(time_grain: Optional[str], expected: str) -> None: + from superset.db_engine_specs.firebird import FirebirdEngineSpec + + assert ( + FirebirdEngineSpec._time_grain_expressions[time_grain].format( + col="timestamp_column", + ) + == expected + ) + + +def test_epoch_to_dttm() -> None: + from superset.db_engine_specs.firebird import FirebirdEngineSpec + + assert ( + FirebirdEngineSpec.epoch_to_dttm().format(col="timestamp_column") + == "DATEADD(second, timestamp_column, CAST('00:00:00' AS TIMESTAMP))" + ) + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "CAST('2019-01-02' AS DATE)"), + ("DateTime", "CAST('2019-01-02 03:04:05.6789' AS TIMESTAMP)"), + ("TimeStamp", "CAST('2019-01-02 03:04:05.6789' AS TIMESTAMP)"), + ("Time", "CAST('03:04:05.678900' AS TIME)"), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.firebird import FirebirdEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_firebolt.py b/tests/unit_tests/db_engine_specs/test_firebolt.py new file mode 100644 index 000000000000..eb84bb14b3ca --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_firebolt.py @@ -0,0 +1,57 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + +from datetime import datetime +from typing import Optional + +import pytest + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "CAST('2019-01-02' AS DATE)"), + ( + "DateTime", + "CAST('2019-01-02T03:04:05' AS DATETIME)", + ), + ( + "TimeStamp", + "CAST('2019-01-02T03:04:05' AS TIMESTAMP)", + ), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.firebolt import FireboltEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) + + +def test_epoch_to_dttm() -> None: + from superset.db_engine_specs.firebolt import FireboltEngineSpec + + assert ( + FireboltEngineSpec.epoch_to_dttm().format(col="timestamp_column") + == "from_unixtime(timestamp_column)" + ) diff --git a/tests/unit_tests/db_engine_specs/test_gsheets.py b/tests/unit_tests/db_engine_specs/test_gsheets.py index c2e8346c3c7a..042e486642bd 100644 --- a/tests/unit_tests/db_engine_specs/test_gsheets.py +++ b/tests/unit_tests/db_engine_specs/test_gsheets.py @@ -14,7 +14,11 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from flask.ctx import AppContext + +# pylint: disable=import-outside-toplevel, invalid-name, line-too-long + +import json + from pytest_mock import MockFixture from superset.errors import ErrorLevel, SupersetError, SupersetErrorType @@ -26,20 +30,44 @@ class ProgrammingError(Exception): """ -def test_validate_parameters_simple( - mocker: MockFixture, - app_context: AppContext, -) -> None: +def test_validate_parameters_simple() -> None: from superset.db_engine_specs.gsheets import ( GSheetsEngineSpec, - GSheetsParametersType, + GSheetsPropertiesType, ) - parameters: GSheetsParametersType = { - "service_account_info": "", + properties: GSheetsPropertiesType = { + "parameters": { + "service_account_info": "", + "catalog": {}, + }, "catalog": {}, } - errors = GSheetsEngineSpec.validate_parameters(parameters) + errors = GSheetsEngineSpec.validate_parameters(properties) + assert errors == [ + SupersetError( + message="Sheet name is required", + error_type=SupersetErrorType.CONNECTION_MISSING_PARAMETERS_ERROR, + level=ErrorLevel.WARNING, + extra={"catalog": {"idx": 0, "name": True}}, + ), + ] + + +def test_validate_parameters_simple_with_in_root_catalog() -> None: + from superset.db_engine_specs.gsheets import ( + GSheetsEngineSpec, + GSheetsPropertiesType, + ) + + properties: GSheetsPropertiesType = { + "parameters": { + "service_account_info": "", + "catalog": {}, + }, + "catalog": {}, + } + errors = GSheetsEngineSpec.validate_parameters(properties) assert errors == [ SupersetError( message="Sheet name is required", @@ -52,11 +80,10 @@ def test_validate_parameters_simple( def test_validate_parameters_catalog( mocker: MockFixture, - app_context: AppContext, ) -> None: from superset.db_engine_specs.gsheets import ( GSheetsEngineSpec, - GSheetsParametersType, + GSheetsPropertiesType, ) g = mocker.patch("superset.db_engine_specs.gsheets.g") @@ -71,15 +98,15 @@ def test_validate_parameters_catalog( ProgrammingError("Unsupported table: https://www.google.com/"), ] - parameters: GSheetsParametersType = { - "service_account_info": "", + properties: GSheetsPropertiesType = { + "parameters": {"service_account_info": "", "catalog": None}, "catalog": { "private_sheet": "https://docs.google.com/spreadsheets/d/1/edit", "public_sheet": "https://docs.google.com/spreadsheets/d/1/edit#gid=1", "not_a_sheet": "https://www.google.com/", }, } - errors = GSheetsEngineSpec.validate_parameters(parameters) # ignore: type + errors = GSheetsEngineSpec.validate_parameters(properties) # ignore: type assert errors == [ SupersetError( @@ -143,11 +170,10 @@ def test_validate_parameters_catalog( def test_validate_parameters_catalog_and_credentials( mocker: MockFixture, - app_context: AppContext, ) -> None: from superset.db_engine_specs.gsheets import ( GSheetsEngineSpec, - GSheetsParametersType, + GSheetsPropertiesType, ) g = mocker.patch("superset.db_engine_specs.gsheets.g") @@ -162,15 +188,18 @@ def test_validate_parameters_catalog_and_credentials( ProgrammingError("Unsupported table: https://www.google.com/"), ] - parameters: GSheetsParametersType = { - "service_account_info": "", + properties: GSheetsPropertiesType = { + "parameters": { + "service_account_info": "", + "catalog": None, + }, "catalog": { "private_sheet": "https://docs.google.com/spreadsheets/d/1/edit", "public_sheet": "https://docs.google.com/spreadsheets/d/1/edit#gid=1", "not_a_sheet": "https://www.google.com/", }, } - errors = GSheetsEngineSpec.validate_parameters(parameters) # ignore: type + errors = GSheetsEngineSpec.validate_parameters(properties) # ignore: type assert errors == [ SupersetError( message=( @@ -204,3 +233,77 @@ def test_validate_parameters_catalog_and_credentials( service_account_info={}, subject="admin@example.com", ) + + +def test_unmask_encrypted_extra() -> None: + """ + Test that the private key can be reused from the previous ``encrypted_extra``. + """ + from superset.db_engine_specs.gsheets import GSheetsEngineSpec + + old = json.dumps( + { + "service_account_info": { + "project_id": "black-sanctum-314419", + "private_key": "SECRET", + }, + } + ) + new = json.dumps( + { + "service_account_info": { + "project_id": "yellow-unicorn-314419", + "private_key": "XXXXXXXXXX", + }, + } + ) + + assert json.loads(str(GSheetsEngineSpec.unmask_encrypted_extra(old, new))) == { + "service_account_info": { + "project_id": "yellow-unicorn-314419", + "private_key": "SECRET", + }, + } + + +def test_unmask_encrypted_extra_when_old_is_none() -> None: + """ + Test that a None value works for ``encrypted_extra``. + """ + from superset.db_engine_specs.gsheets import GSheetsEngineSpec + + old = None + new = json.dumps( + { + "service_account_info": { + "project_id": "yellow-unicorn-314419", + "private_key": "XXXXXXXXXX", + }, + } + ) + + assert json.loads(str(GSheetsEngineSpec.unmask_encrypted_extra(old, new))) == { + "service_account_info": { + "project_id": "yellow-unicorn-314419", + "private_key": "XXXXXXXXXX", + }, + } + + +def test_unmask_encrypted_extra_when_new_is_none() -> None: + """ + Test that a None value works for ``encrypted_extra``. + """ + from superset.db_engine_specs.gsheets import GSheetsEngineSpec + + old = json.dumps( + { + "service_account_info": { + "project_id": "yellow-unicorn-314419", + "private_key": "XXXXXXXXXX", + }, + } + ) + new = None + + assert GSheetsEngineSpec.unmask_encrypted_extra(old, new) is None diff --git a/tests/integration_tests/db_engine_specs/hana_tests.py b/tests/unit_tests/db_engine_specs/test_hana.py similarity index 57% rename from tests/integration_tests/db_engine_specs/hana_tests.py rename to tests/unit_tests/db_engine_specs/test_hana.py index 06eee032e8d2..1d1ac6390839 100644 --- a/tests/integration_tests/db_engine_specs/hana_tests.py +++ b/tests/unit_tests/db_engine_specs/test_hana.py @@ -14,20 +14,30 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from superset.db_engine_specs.hana import HanaEngineSpec -from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec +from datetime import datetime +from typing import Optional -class TestHanaDbEngineSpec(TestDbEngineSpec): - def test_convert_dttm(self): - dttm = self.get_dttm() +import pytest - self.assertEqual( - HanaEngineSpec.convert_dttm("DATE", dttm), - "TO_DATE('2019-01-02', 'YYYY-MM-DD')", - ) +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm - self.assertEqual( - HanaEngineSpec.convert_dttm("TIMESTAMP", dttm), + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "TO_DATE('2019-01-02', 'YYYY-MM-DD')"), + ( + "TimeStamp", "TO_TIMESTAMP('2019-01-02T03:04:05.678900', 'YYYY-MM-DD\"T\"HH24:MI:SS.ff6')", - ) + ), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.hana import HanaEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_hive.py b/tests/unit_tests/db_engine_specs/test_hive.py new file mode 100644 index 000000000000..3a5cb91405bd --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_hive.py @@ -0,0 +1,44 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + +from datetime import datetime +from typing import Optional + +import pytest + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "CAST('2019-01-02' AS DATE)"), + ( + "TimeStamp", + "CAST('2019-01-02 03:04:05.678900' AS TIMESTAMP)", + ), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.hive import HiveEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_impala.py b/tests/unit_tests/db_engine_specs/test_impala.py new file mode 100644 index 000000000000..8a42440529ae --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_impala.py @@ -0,0 +1,40 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from datetime import datetime +from typing import Optional + +import pytest + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "CAST('2019-01-02' AS DATE)"), + ("TimeStamp", "CAST('2019-01-02T03:04:05.678900' AS TIMESTAMP)"), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.impala import ImpalaEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_init.py b/tests/unit_tests/db_engine_specs/test_init.py new file mode 100644 index 000000000000..3189256c70f1 --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_init.py @@ -0,0 +1,80 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + +import pytest +from pkg_resources import EntryPoint +from pytest_mock import MockFixture + +from superset.db_engine_specs import get_available_engine_specs + + +def test_get_available_engine_specs(mocker: MockFixture) -> None: + """ + get_available_engine_specs should return all engine specs + """ + from superset.db_engine_specs.databricks import ( + DatabricksHiveEngineSpec, + DatabricksNativeEngineSpec, + DatabricksODBCEngineSpec, + ) + + mocker.patch( + "superset.db_engine_specs.load_engine_specs", + return_value=iter( + [ + DatabricksHiveEngineSpec, + DatabricksNativeEngineSpec, + DatabricksODBCEngineSpec, + ] + ), + ) + + assert list(get_available_engine_specs().keys()) == [ + DatabricksHiveEngineSpec, + DatabricksNativeEngineSpec, + DatabricksODBCEngineSpec, + ] + + +@pytest.mark.parametrize( + "app", + [{"DBS_AVAILABLE_DENYLIST": {"databricks": {"pyhive", "pyodbc"}}}], + indirect=True, +) +def test_get_available_engine_specs_with_denylist(mocker: MockFixture) -> None: + """ + The denylist removes items from the db engine spec list + """ + from superset.db_engine_specs.databricks import ( + DatabricksHiveEngineSpec, + DatabricksNativeEngineSpec, + DatabricksODBCEngineSpec, + ) + + mocker.patch( + "superset.db_engine_specs.load_engine_specs", + return_value=iter( + [ + DatabricksHiveEngineSpec, + DatabricksNativeEngineSpec, + DatabricksODBCEngineSpec, + ] + ), + ) + available = get_available_engine_specs() + assert list(available.keys()) == [DatabricksNativeEngineSpec] diff --git a/tests/unit_tests/db_engine_specs/test_kusto.py b/tests/unit_tests/db_engine_specs/test_kusto.py index fca6ee5817de..538eafc6b176 100644 --- a/tests/unit_tests/db_engine_specs/test_kusto.py +++ b/tests/unit_tests/db_engine_specs/test_kusto.py @@ -16,10 +16,11 @@ # under the License. # pylint: disable=unused-argument, import-outside-toplevel, protected-access from datetime import datetime +from typing import Optional import pytest -from flask.ctx import AppContext +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm from tests.unit_tests.fixtures.common import dttm @@ -32,9 +33,7 @@ ("INSERT INTO tbl (foo) VALUES (1)", False), ], ) -def test_sql_is_readonly_query( - app_context: AppContext, sql: str, expected: bool -) -> None: +def test_sql_is_readonly_query(sql: str, expected: bool) -> None: """ Make sure that SQL dialect consider only SELECT statements as read-only """ @@ -56,7 +55,7 @@ def test_sql_is_readonly_query( (".show tables", False), ], ) -def test_kql_is_select_query(app_context: AppContext, kql: str, expected: bool) -> None: +def test_kql_is_select_query(kql: str, expected: bool) -> None: """ Make sure that KQL dialect consider only statements that do not start with "." (dot) as a SELECT statements @@ -83,9 +82,7 @@ def test_kql_is_select_query(app_context: AppContext, kql: str, expected: bool) (".set-or-append table foo <| bar", False), ], ) -def test_kql_is_readonly_query( - app_context: AppContext, kql: str, expected: bool -) -> None: +def test_kql_is_readonly_query(kql: str, expected: bool) -> None: """ Make sure that KQL dialect consider only SELECT statements as read-only """ @@ -99,7 +96,7 @@ def test_kql_is_readonly_query( assert expected == is_readonly -def test_kql_parse_sql(app_context: AppContext) -> None: +def test_kql_parse_sql() -> None: """ parse_sql method should always return a list with a single element which is an original query @@ -113,47 +110,35 @@ def test_kql_parse_sql(app_context: AppContext) -> None: @pytest.mark.parametrize( - "target_type,expected_dttm", + "target_type,expected_result", [ - ("DATETIME", "datetime(2019-01-02T03:04:05.678900)"), - ("TIMESTAMP", "datetime(2019-01-02T03:04:05.678900)"), - ("DATE", "datetime(2019-01-02)"), + ("DateTime", "datetime(2019-01-02T03:04:05.678900)"), + ("TimeStamp", "datetime(2019-01-02T03:04:05.678900)"), + ("Date", "datetime(2019-01-02)"), + ("UnknownType", None), ], ) def test_kql_convert_dttm( - app_context: AppContext, - target_type: str, - expected_dttm: str, - dttm: datetime, + target_type: str, expected_result: Optional[str], dttm: datetime ) -> None: - """ - Test that date objects are converted correctly. - """ - - from superset.db_engine_specs.kusto import KustoKqlEngineSpec + from superset.db_engine_specs.kusto import KustoKqlEngineSpec as spec - assert expected_dttm == KustoKqlEngineSpec.convert_dttm(target_type, dttm) + assert_convert_dttm(spec, target_type, expected_result, dttm) @pytest.mark.parametrize( - "target_type,expected_dttm", + "target_type,expected_result", [ - ("DATETIME", "CONVERT(DATETIME, '2019-01-02T03:04:05.678', 126)"), - ("DATE", "CONVERT(DATE, '2019-01-02', 23)"), - ("SMALLDATETIME", "CONVERT(SMALLDATETIME, '2019-01-02 03:04:05', 20)"), - ("TIMESTAMP", "CONVERT(TIMESTAMP, '2019-01-02 03:04:05', 20)"), + ("Date", "CONVERT(DATE, '2019-01-02', 23)"), + ("DateTime", "CONVERT(DATETIME, '2019-01-02T03:04:05.678', 126)"), + ("SmallDateTime", "CONVERT(SMALLDATETIME, '2019-01-02 03:04:05', 20)"), + ("TimeStamp", "CONVERT(TIMESTAMP, '2019-01-02 03:04:05', 20)"), + ("UnknownType", None), ], ) def test_sql_convert_dttm( - app_context: AppContext, - target_type: str, - expected_dttm: str, - dttm: datetime, + target_type: str, expected_result: Optional[str], dttm: datetime ) -> None: - """ - Test that date objects are converted correctly. - """ - - from superset.db_engine_specs.kusto import KustoSqlEngineSpec + from superset.db_engine_specs.kusto import KustoSqlEngineSpec as spec - assert expected_dttm == KustoSqlEngineSpec.convert_dttm(target_type, dttm) + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_kylin.py b/tests/unit_tests/db_engine_specs/test_kylin.py new file mode 100644 index 000000000000..cbc8c9133de7 --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_kylin.py @@ -0,0 +1,40 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from datetime import datetime +from typing import Optional + +import pytest + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "CAST('2019-01-02' AS DATE)"), + ("TimeStamp", "CAST('2019-01-02 03:04:05' AS TIMESTAMP)"), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.kylin import KylinEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_mssql.py b/tests/unit_tests/db_engine_specs/test_mssql.py index ddade3bfdb38..63a315c14c87 100644 --- a/tests/unit_tests/db_engine_specs/test_mssql.py +++ b/tests/unit_tests/db_engine_specs/test_mssql.py @@ -17,10 +17,10 @@ import unittest.mock as mock from datetime import datetime from textwrap import dedent +from typing import Any, Dict, Optional, Type import pytest -from flask.ctx import AppContext -from sqlalchemy import column, table +from sqlalchemy import column, table, types from sqlalchemy.dialects import mssql from sqlalchemy.dialects.mssql import DATE, NTEXT, NVARCHAR, TEXT, VARCHAR from sqlalchemy.sql import select @@ -28,52 +28,51 @@ from superset.errors import ErrorLevel, SupersetError, SupersetErrorType from superset.utils.core import GenericDataType +from tests.unit_tests.db_engine_specs.utils import ( + assert_column_spec, + assert_convert_dttm, +) from tests.unit_tests.fixtures.common import dttm @pytest.mark.parametrize( - "type_string,type_expected,generic_type_expected", + "native_type,sqla_type,attrs,generic_type,is_dttm", [ - ("STRING", String, GenericDataType.STRING), - ("CHAR(10)", String, GenericDataType.STRING), - ("VARCHAR(10)", String, GenericDataType.STRING), - ("TEXT", String, GenericDataType.STRING), - ("NCHAR(10)", UnicodeText, GenericDataType.STRING), - ("NVARCHAR(10)", UnicodeText, GenericDataType.STRING), - ("NTEXT", UnicodeText, GenericDataType.STRING), + ("CHAR", String, None, GenericDataType.STRING, False), + ("CHAR(10)", String, None, GenericDataType.STRING, False), + ("VARCHAR", String, None, GenericDataType.STRING, False), + ("VARCHAR(10)", String, None, GenericDataType.STRING, False), + ("TEXT", String, None, GenericDataType.STRING, False), + ("NCHAR(10)", UnicodeText, None, GenericDataType.STRING, False), + ("NVARCHAR(10)", UnicodeText, None, GenericDataType.STRING, False), + ("NTEXT", UnicodeText, None, GenericDataType.STRING, False), ], ) -def test_mssql_column_types( - app_context: AppContext, - type_string: str, - type_expected: TypeEngine, - generic_type_expected: GenericDataType, +def test_get_column_spec( + native_type: str, + sqla_type: Type[types.TypeEngine], + attrs: Optional[Dict[str, Any]], + generic_type: GenericDataType, + is_dttm: bool, ) -> None: - from superset.db_engine_specs.mssql import MssqlEngineSpec + from superset.db_engine_specs.mssql import MssqlEngineSpec as spec - if type_expected is None: - type_assigned = MssqlEngineSpec.get_sqla_column_type(type_string) - assert type_assigned is None - else: - column_spec = MssqlEngineSpec.get_column_spec(type_string) - if column_spec is not None: - assert isinstance(column_spec.sqla_type, type_expected) - assert column_spec.generic_type == generic_type_expected + assert_column_spec(spec, native_type, sqla_type, attrs, generic_type, is_dttm) -def test_where_clause_n_prefix(app_context: AppContext) -> None: +def test_where_clause_n_prefix() -> None: from superset.db_engine_specs.mssql import MssqlEngineSpec dialect = mssql.dialect() # non-unicode col - sqla_column_type = MssqlEngineSpec.get_sqla_column_type("VARCHAR(10)") + sqla_column_type = MssqlEngineSpec.get_column_types("VARCHAR(10)") assert sqla_column_type is not None type_, _ = sqla_column_type str_col = column("col", type_=type_) # unicode col - sqla_column_type = MssqlEngineSpec.get_sqla_column_type("NTEXT") + sqla_column_type = MssqlEngineSpec.get_column_types("NTEXT") assert sqla_column_type is not None type_, _ = sqla_column_type unicode_col = column("unicode_col", type_=type_) @@ -95,7 +94,7 @@ def test_where_clause_n_prefix(app_context: AppContext) -> None: assert query == query_expected -def test_time_exp_mixd_case_col_1y(app_context: AppContext) -> None: +def test_time_exp_mixd_case_col_1y() -> None: from superset.db_engine_specs.mssql import MssqlEngineSpec col = column("MixedCase") @@ -105,34 +104,34 @@ def test_time_exp_mixd_case_col_1y(app_context: AppContext) -> None: @pytest.mark.parametrize( - "actual,expected", + "target_type,expected_result", [ ( - "DATE", + "date", "CONVERT(DATE, '2019-01-02', 23)", ), ( - "DATETIME", + "datetime", "CONVERT(DATETIME, '2019-01-02T03:04:05.678', 126)", ), ( - "SMALLDATETIME", + "smalldatetime", "CONVERT(SMALLDATETIME, '2019-01-02 03:04:05', 20)", ), + ("Other", None), ], ) def test_convert_dttm( - app_context: AppContext, - actual: str, - expected: str, + target_type: str, + expected_result: Optional[str], dttm: datetime, ) -> None: - from superset.db_engine_specs.mssql import MssqlEngineSpec + from superset.db_engine_specs.mssql import MssqlEngineSpec as spec - assert MssqlEngineSpec.convert_dttm(actual, dttm) == expected + assert_convert_dttm(spec, target_type, expected_result, dttm) -def test_extract_error_message(app_context: AppContext) -> None: +def test_extract_error_message() -> None: from superset.db_engine_specs.mssql import MssqlEngineSpec test_mssql_exception = Exception( @@ -158,7 +157,7 @@ def test_extract_error_message(app_context: AppContext) -> None: assert expected_message == error_message -def test_fetch_data(app_context: AppContext) -> None: +def test_fetch_data() -> None: from superset.db_engine_specs.base import BaseEngineSpec from superset.db_engine_specs.mssql import MssqlEngineSpec @@ -185,9 +184,7 @@ def test_fetch_data(app_context: AppContext) -> None: (NTEXT(collation="utf8_general_ci"), "NTEXT"), ], ) -def test_column_datatype_to_string( - app_context: AppContext, original: TypeEngine, expected: str -) -> None: +def test_column_datatype_to_string(original: TypeEngine, expected: str) -> None: from superset.db_engine_specs.mssql import MssqlEngineSpec actual = MssqlEngineSpec.column_datatype_to_string(original, mssql.dialect()) @@ -239,9 +236,7 @@ def test_column_datatype_to_string( ), ], ) -def test_cte_query_parsing( - app_context: AppContext, original: TypeEngine, expected: str -) -> None: +def test_cte_query_parsing(original: TypeEngine, expected: str) -> None: from superset.db_engine_specs.mssql import MssqlEngineSpec actual = MssqlEngineSpec.get_cte_query(original) @@ -270,16 +265,14 @@ def test_cte_query_parsing( ), ], ) -def test_top_query_parsing( - app_context: AppContext, original: TypeEngine, expected: str, top: int -) -> None: +def test_top_query_parsing(original: TypeEngine, expected: str, top: int) -> None: from superset.db_engine_specs.mssql import MssqlEngineSpec actual = MssqlEngineSpec.apply_top_to_sql(original, top) assert actual == expected -def test_extract_errors(app_context: AppContext) -> None: +def test_extract_errors() -> None: """ Test that custom error messages are extracted correctly. """ diff --git a/tests/unit_tests/db_engine_specs/test_mysql.py b/tests/unit_tests/db_engine_specs/test_mysql.py new file mode 100644 index 000000000000..4562e497c6e6 --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_mysql.py @@ -0,0 +1,130 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from datetime import datetime +from typing import Any, Dict, Optional, Type +from unittest.mock import Mock, patch + +import pytest +from sqlalchemy import types +from sqlalchemy.dialects.mysql import ( + BIT, + DECIMAL, + DOUBLE, + FLOAT, + INTEGER, + LONGTEXT, + MEDIUMINT, + MEDIUMTEXT, + TINYINT, + TINYTEXT, +) + +from superset.utils.core import GenericDataType +from tests.unit_tests.db_engine_specs.utils import ( + assert_column_spec, + assert_convert_dttm, +) +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "native_type,sqla_type,attrs,generic_type,is_dttm", + [ + # Numeric + ("TINYINT", TINYINT, None, GenericDataType.NUMERIC, False), + ("SMALLINT", types.SmallInteger, None, GenericDataType.NUMERIC, False), + ("MEDIUMINT", MEDIUMINT, None, GenericDataType.NUMERIC, False), + ("INT", INTEGER, None, GenericDataType.NUMERIC, False), + ("BIGINT", types.BigInteger, None, GenericDataType.NUMERIC, False), + ("DECIMAL", DECIMAL, None, GenericDataType.NUMERIC, False), + ("FLOAT", FLOAT, None, GenericDataType.NUMERIC, False), + ("DOUBLE", DOUBLE, None, GenericDataType.NUMERIC, False), + ("BIT", BIT, None, GenericDataType.NUMERIC, False), + # String + ("CHAR", types.String, None, GenericDataType.STRING, False), + ("VARCHAR", types.String, None, GenericDataType.STRING, False), + ("TINYTEXT", TINYTEXT, None, GenericDataType.STRING, False), + ("MEDIUMTEXT", MEDIUMTEXT, None, GenericDataType.STRING, False), + ("LONGTEXT", LONGTEXT, None, GenericDataType.STRING, False), + # Temporal + ("DATE", types.Date, None, GenericDataType.TEMPORAL, True), + ("DATETIME", types.DateTime, None, GenericDataType.TEMPORAL, True), + ("TIMESTAMP", types.TIMESTAMP, None, GenericDataType.TEMPORAL, True), + ("TIME", types.Time, None, GenericDataType.TEMPORAL, True), + ], +) +def test_get_column_spec( + native_type: str, + sqla_type: Type[types.TypeEngine], + attrs: Optional[Dict[str, Any]], + generic_type: GenericDataType, + is_dttm: bool, +) -> None: + from superset.db_engine_specs.mysql import MySQLEngineSpec as spec + + assert_column_spec(spec, native_type, sqla_type, attrs, generic_type, is_dttm) + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "STR_TO_DATE('2019-01-02', '%Y-%m-%d')"), + ( + "DateTime", + "STR_TO_DATE('2019-01-02 03:04:05.678900', '%Y-%m-%d %H:%i:%s.%f')", + ), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.mysql import MySQLEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) + + +@patch("sqlalchemy.engine.Engine.connect") +def test_get_cancel_query_id(engine_mock: Mock) -> None: + from superset.db_engine_specs.mysql import MySQLEngineSpec + from superset.models.sql_lab import Query + + query = Query() + cursor_mock = engine_mock.return_value.__enter__.return_value + cursor_mock.fetchone.return_value = ["123"] + assert MySQLEngineSpec.get_cancel_query_id(cursor_mock, query) == "123" + + +@patch("sqlalchemy.engine.Engine.connect") +def test_cancel_query(engine_mock: Mock) -> None: + from superset.db_engine_specs.mysql import MySQLEngineSpec + from superset.models.sql_lab import Query + + query = Query() + cursor_mock = engine_mock.return_value.__enter__.return_value + assert MySQLEngineSpec.cancel_query(cursor_mock, query, "123") is True + + +@patch("sqlalchemy.engine.Engine.connect") +def test_cancel_query_failed(engine_mock: Mock) -> None: + from superset.db_engine_specs.mysql import MySQLEngineSpec + from superset.models.sql_lab import Query + + query = Query() + cursor_mock = engine_mock.raiseError.side_effect = Exception() + assert MySQLEngineSpec.cancel_query(cursor_mock, query, "123") is False diff --git a/tests/unit_tests/db_engine_specs/test_oracle.py b/tests/unit_tests/db_engine_specs/test_oracle.py new file mode 100644 index 000000000000..0dce95697061 --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_oracle.py @@ -0,0 +1,113 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from datetime import datetime +from typing import Optional, Union +from unittest import mock + +import pytest +from sqlalchemy import column, types +from sqlalchemy.dialects import oracle +from sqlalchemy.dialects.oracle import DATE, NVARCHAR, VARCHAR +from sqlalchemy.sql import quoted_name + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "column_name,expected_result", + [ + ("This_Is_32_Character_Column_Name", "3b26974078683be078219674eeb8f5"), + ("snake_label", "snake_label"), + ("camelLabel", "camelLabel"), + ], +) +def test_oracle_sqla_column_name_length_exceeded( + column_name: str, expected_result: Union[str, quoted_name] +) -> None: + from superset.db_engine_specs.oracle import OracleEngineSpec + + label = OracleEngineSpec.make_label_compatible(column_name) + assert isinstance(label, quoted_name) + assert label.quote is True + assert label == expected_result + + +def test_oracle_time_expression_reserved_keyword_1m_grain() -> None: + from superset.db_engine_specs.oracle import OracleEngineSpec + + col = column("decimal") + expr = OracleEngineSpec.get_timestamp_expr(col, None, "P1M") + result = str(expr.compile(dialect=oracle.dialect())) + assert result == "TRUNC(CAST(\"decimal\" as DATE), 'MONTH')" + + +@pytest.mark.parametrize( + "sqla_type,expected_result", + [ + (DATE(), "DATE"), + (VARCHAR(length=255), "VARCHAR(255 CHAR)"), + (VARCHAR(length=255, collation="utf8"), "VARCHAR(255 CHAR)"), + (NVARCHAR(length=128), "NVARCHAR2(128)"), + ], +) +def test_column_datatype_to_string( + sqla_type: types.TypeEngine, expected_result: str +) -> None: + from superset.db_engine_specs.oracle import OracleEngineSpec + + assert ( + OracleEngineSpec.column_datatype_to_string(sqla_type, oracle.dialect()) + == expected_result + ) + + +def test_fetch_data_no_description() -> None: + from superset.db_engine_specs.oracle import OracleEngineSpec + + cursor = mock.MagicMock() + cursor.description = [] + assert OracleEngineSpec.fetch_data(cursor) == [] + + +def test_fetch_data() -> None: + from superset.db_engine_specs.oracle import OracleEngineSpec + + cursor = mock.MagicMock() + result = ["a", "b"] + cursor.fetchall.return_value = result + assert OracleEngineSpec.fetch_data(cursor) == result + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "TO_DATE('2019-01-02', 'YYYY-MM-DD')"), + ("DateTime", """TO_DATE('2019-01-02T03:04:05', 'YYYY-MM-DD"T"HH24:MI:SS')"""), + ( + "TimeStamp", + """TO_TIMESTAMP('2019-01-02T03:04:05.678900', 'YYYY-MM-DD"T"HH24:MI:SS.ff6')""", + ), + ("Other", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.oracle import OracleEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_postgres.py b/tests/unit_tests/db_engine_specs/test_postgres.py new file mode 100644 index 000000000000..088ce2747834 --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_postgres.py @@ -0,0 +1,91 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from datetime import datetime +from typing import Any, Dict, Optional, Type + +import pytest +from sqlalchemy import types +from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION, ENUM, JSON + +from superset.utils.core import GenericDataType +from tests.unit_tests.db_engine_specs.utils import ( + assert_column_spec, + assert_convert_dttm, +) +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "TO_DATE('2019-01-02', 'YYYY-MM-DD')"), + ( + "DateTime", + "TO_TIMESTAMP('2019-01-02 03:04:05.678900', 'YYYY-MM-DD HH24:MI:SS.US')", + ), + ( + "TimeStamp", + "TO_TIMESTAMP('2019-01-02 03:04:05.678900', 'YYYY-MM-DD HH24:MI:SS.US')", + ), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.postgres import PostgresEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) + + +@pytest.mark.parametrize( + "native_type,sqla_type,attrs,generic_type,is_dttm", + [ + ("SMALLINT", types.SmallInteger, None, GenericDataType.NUMERIC, False), + ("INTEGER", types.Integer, None, GenericDataType.NUMERIC, False), + ("BIGINT", types.BigInteger, None, GenericDataType.NUMERIC, False), + ("DECIMAL", types.Numeric, None, GenericDataType.NUMERIC, False), + ("NUMERIC", types.Numeric, None, GenericDataType.NUMERIC, False), + ("REAL", types.REAL, None, GenericDataType.NUMERIC, False), + ("DOUBLE PRECISION", DOUBLE_PRECISION, None, GenericDataType.NUMERIC, False), + ("MONEY", types.Numeric, None, GenericDataType.NUMERIC, False), + # String + ("CHAR", types.String, None, GenericDataType.STRING, False), + ("VARCHAR", types.String, None, GenericDataType.STRING, False), + ("TEXT", types.String, None, GenericDataType.STRING, False), + ("ARRAY", types.String, None, GenericDataType.STRING, False), + ("ENUM", ENUM, None, GenericDataType.STRING, False), + ("JSON", JSON, None, GenericDataType.STRING, False), + # Temporal + ("DATE", types.Date, None, GenericDataType.TEMPORAL, True), + ("TIMESTAMP", types.TIMESTAMP, None, GenericDataType.TEMPORAL, True), + ("TIME", types.Time, None, GenericDataType.TEMPORAL, True), + # Boolean + ("BOOLEAN", types.Boolean, None, GenericDataType.BOOLEAN, False), + ], +) +def test_get_column_spec( + native_type: str, + sqla_type: Type[types.TypeEngine], + attrs: Optional[Dict[str, Any]], + generic_type: GenericDataType, + is_dttm: bool, +) -> None: + from superset.db_engine_specs.postgres import PostgresEngineSpec as spec + + assert_column_spec(spec, native_type, sqla_type, attrs, generic_type, is_dttm) diff --git a/tests/unit_tests/db_engine_specs/test_presto.py b/tests/unit_tests/db_engine_specs/test_presto.py index 228427c9caa7..fbae251fdc63 100644 --- a/tests/unit_tests/db_engine_specs/test_presto.py +++ b/tests/unit_tests/db_engine_specs/test_presto.py @@ -15,15 +15,21 @@ # specific language governing permissions and limitations # under the License. from datetime import datetime -from typing import Optional +from typing import Any, Dict, Optional, Type import pytest import pytz -from flask.ctx import AppContext +from sqlalchemy import types + +from superset.utils.core import GenericDataType +from tests.unit_tests.db_engine_specs.utils import ( + assert_column_spec, + assert_convert_dttm, +) @pytest.mark.parametrize( - "target_type,dttm,result", + "target_type,dttm,expected_result", [ ("VARCHAR", datetime(2022, 1, 1), None), ("DATE", datetime(2022, 1, 1), "DATE '2022-01-01'"), @@ -45,12 +51,34 @@ ], ) def test_convert_dttm( - app_context: AppContext, target_type: str, dttm: datetime, - result: Optional[str], + expected_result: Optional[str], +) -> None: + from superset.db_engine_specs.presto import PrestoEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) + + +@pytest.mark.parametrize( + "native_type,sqla_type,attrs,generic_type,is_dttm", + [ + ("varchar(255)", types.VARCHAR, {"length": 255}, GenericDataType.STRING, False), + ("varchar", types.String, None, GenericDataType.STRING, False), + ("char(255)", types.CHAR, {"length": 255}, GenericDataType.STRING, False), + ("char", types.String, None, GenericDataType.STRING, False), + ("integer", types.Integer, None, GenericDataType.NUMERIC, False), + ("time", types.Time, None, GenericDataType.TEMPORAL, True), + ("timestamp", types.TIMESTAMP, None, GenericDataType.TEMPORAL, True), + ], +) +def test_get_column_spec( + native_type: str, + sqla_type: Type[types.TypeEngine], + attrs: Optional[Dict[str, Any]], + generic_type: GenericDataType, + is_dttm: bool, ) -> None: - from superset.db_engine_specs.presto import PrestoEngineSpec + from superset.db_engine_specs.presto import PrestoEngineSpec as spec - for case in (str.lower, str.upper): - assert PrestoEngineSpec.convert_dttm(case(target_type), dttm) == result + assert_column_spec(spec, native_type, sqla_type, attrs, generic_type, is_dttm) diff --git a/tests/unit_tests/db_engine_specs/test_rockset.py b/tests/unit_tests/db_engine_specs/test_rockset.py new file mode 100644 index 000000000000..c501dccf2e39 --- /dev/null +++ b/tests/unit_tests/db_engine_specs/test_rockset.py @@ -0,0 +1,41 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from datetime import datetime +from typing import Optional + +import pytest + +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm +from tests.unit_tests.fixtures.common import dttm + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Date", "DATE '2019-01-02'"), + ("DateTime", "DATETIME '2019-01-02 03:04:05.678900'"), + ("Timestamp", "TIMESTAMP '2019-01-02T03:04:05.678900'"), + ("UnknownType", None), + ], +) +def test_convert_dttm( + target_type: str, expected_result: Optional[str], dttm: datetime +) -> None: + from superset.db_engine_specs.rockset import RocksetEngineSpec as spec + + assert_convert_dttm(spec, target_type, expected_result, dttm) diff --git a/tests/unit_tests/db_engine_specs/test_snowflake.py b/tests/unit_tests/db_engine_specs/test_snowflake.py index 961b92f62614..9689428d2565 100644 --- a/tests/unit_tests/db_engine_specs/test_snowflake.py +++ b/tests/unit_tests/db_engine_specs/test_snowflake.py @@ -14,34 +14,51 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. + +# pylint: disable=import-outside-toplevel + import json from datetime import datetime +from typing import Optional from unittest import mock import pytest -from flask.ctx import AppContext +from pytest_mock import MockerFixture from superset.errors import ErrorLevel, SupersetError, SupersetErrorType +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm from tests.unit_tests.fixtures.common import dttm @pytest.mark.parametrize( - "actual,expected", + "target_type,expected_result", [ - ("DATE", "TO_DATE('2019-01-02')"), - ("DATETIME", "CAST('2019-01-02T03:04:05.678900' AS DATETIME)"), - ("TIMESTAMP", "TO_TIMESTAMP('2019-01-02T03:04:05.678900')"), + ("Date", "TO_DATE('2019-01-02')"), + ("DateTime", "CAST('2019-01-02T03:04:05.678900' AS DATETIME)"), + ("TimeStamp", "TO_TIMESTAMP('2019-01-02T03:04:05.678900')"), + ("TIMESTAMP_NTZ", "TO_TIMESTAMP('2019-01-02T03:04:05.678900')"), + ("TIMESTAMP_LTZ", "TO_TIMESTAMP('2019-01-02T03:04:05.678900')"), + ("TIMESTAMP_TZ", "TO_TIMESTAMP('2019-01-02T03:04:05.678900')"), + ("TIMESTAMPLTZ", "TO_TIMESTAMP('2019-01-02T03:04:05.678900')"), + ("TIMESTAMPNTZ", "TO_TIMESTAMP('2019-01-02T03:04:05.678900')"), + ("TIMESTAMPTZ", "TO_TIMESTAMP('2019-01-02T03:04:05.678900')"), + ( + "TIMESTAMP WITH LOCAL TIME ZONE", + "TO_TIMESTAMP('2019-01-02T03:04:05.678900')", + ), + ("TIMESTAMP WITHOUT TIME ZONE", "TO_TIMESTAMP('2019-01-02T03:04:05.678900')"), + ("UnknownType", None), ], ) def test_convert_dttm( - app_context: AppContext, actual: str, expected: str, dttm: datetime + target_type: str, expected_result: Optional[str], dttm: datetime ) -> None: - from superset.db_engine_specs.snowflake import SnowflakeEngineSpec + from superset.db_engine_specs.snowflake import SnowflakeEngineSpec as spec - assert SnowflakeEngineSpec.convert_dttm(actual, dttm) == expected + assert_convert_dttm(spec, target_type, expected_result, dttm) -def test_database_connection_test_mutator(app_context: AppContext) -> None: +def test_database_connection_test_mutator() -> None: from superset.db_engine_specs.snowflake import SnowflakeEngineSpec from superset.models.core import Database @@ -54,7 +71,7 @@ def test_database_connection_test_mutator(app_context: AppContext) -> None: } == engine_params -def test_extract_errors(app_context: AppContext) -> None: +def test_extract_errors() -> None: from superset.db_engine_specs.snowflake import SnowflakeEngineSpec msg = "Object dumbBrick does not exist or not authorized." @@ -76,11 +93,11 @@ def test_extract_errors(app_context: AppContext) -> None: ) ] - msg = "syntax error line 1 at position 10 unexpected 'limmmited'." + msg = "syntax error line 1 at position 10 unexpected 'limited'." result = SnowflakeEngineSpec.extract_errors(Exception(msg)) assert result == [ SupersetError( - message='Please check your query for syntax errors at or near "limmmited". Then, try running your query again.', + message='Please check your query for syntax errors at or near "limited". Then, try running your query again.', error_type=SupersetErrorType.SYNTAX_ERROR, level=ErrorLevel.ERROR, extra={ @@ -125,3 +142,30 @@ def test_cancel_query_failed(engine_mock: mock.Mock) -> None: query = Query() cursor_mock = engine_mock.raiseError.side_effect = Exception() assert SnowflakeEngineSpec.cancel_query(cursor_mock, query, "123") is False + + +def test_get_extra_params(mocker: MockerFixture) -> None: + """ + Test the ``get_extra_params`` method. + """ + from superset.db_engine_specs.snowflake import SnowflakeEngineSpec + + database = mocker.MagicMock() + + database.extra = {} + assert SnowflakeEngineSpec.get_extra_params(database) == { + "engine_params": {"connect_args": {"application": "Apache Superset"}} + } + + database.extra = json.dumps( + { + "engine_params": { + "connect_args": {"application": "Custom user agent", "foo": "bar"} + } + } + ) + assert SnowflakeEngineSpec.get_extra_params(database) == { + "engine_params": { + "connect_args": {"application": "Custom user agent", "foo": "bar"} + } + } diff --git a/tests/unit_tests/db_engine_specs/test_sqlite.py b/tests/unit_tests/db_engine_specs/test_sqlite.py index 1ce574abe39c..11ce174c0f4e 100644 --- a/tests/unit_tests/db_engine_specs/test_sqlite.py +++ b/tests/unit_tests/db_engine_specs/test_sqlite.py @@ -16,80 +16,32 @@ # under the License. # pylint: disable=invalid-name, unused-argument, import-outside-toplevel, redefined-outer-name from datetime import datetime -from unittest import mock +from typing import Optional import pytest -from flask.ctx import AppContext from sqlalchemy.engine import create_engine +from tests.unit_tests.db_engine_specs.utils import assert_convert_dttm from tests.unit_tests.fixtures.common import dttm -def test_convert_dttm(app_context: AppContext, dttm: datetime) -> None: - from superset.db_engine_specs.sqlite import SqliteEngineSpec - - assert SqliteEngineSpec.convert_dttm("TEXT", dttm) == "'2019-01-02 03:04:05.678900'" - - -def test_convert_dttm_lower(app_context: AppContext, dttm: datetime) -> None: - from superset.db_engine_specs.sqlite import SqliteEngineSpec - - assert SqliteEngineSpec.convert_dttm("text", dttm) == "'2019-01-02 03:04:05.678900'" - - -def test_convert_dttm_invalid_type(app_context: AppContext, dttm: datetime) -> None: - from superset.db_engine_specs.sqlite import SqliteEngineSpec - - assert SqliteEngineSpec.convert_dttm("other", dttm) is None - - -def test_get_all_datasource_names_table(app_context: AppContext) -> None: - from superset.db_engine_specs.sqlite import SqliteEngineSpec - - database = mock.MagicMock() - database.get_all_schema_names.return_value = ["schema1"] - table_names = [("table1", "schema1"), ("table2", "schema1")] - get_tables = mock.MagicMock(return_value=table_names) - database.get_all_table_names_in_schema = get_tables - result = SqliteEngineSpec.get_all_datasource_names(database, "table") - - assert result == table_names - get_tables.assert_called_once_with( - schema="schema1", - force=True, - cache=database.table_cache_enabled, - cache_timeout=database.table_cache_timeout, - ) - - -def test_get_all_datasource_names_view(app_context: AppContext) -> None: - from superset.db_engine_specs.sqlite import SqliteEngineSpec - - database = mock.MagicMock() - database.get_all_schema_names.return_value = ["schema1"] - views_names = [("view1", "schema1"), ("view2", "schema1")] - get_views = mock.MagicMock(return_value=views_names) - database.get_all_view_names_in_schema = get_views - result = SqliteEngineSpec.get_all_datasource_names(database, "view") - - assert result == views_names - get_views.assert_called_once_with( - schema="schema1", - force=True, - cache=database.table_cache_enabled, - cache_timeout=database.table_cache_timeout, - ) - - -def test_get_all_datasource_names_invalid_type(app_context: AppContext) -> None: - from superset.db_engine_specs.sqlite import SqliteEngineSpec - - database = mock.MagicMock() - database.get_all_schema_names.return_value = ["schema1"] - invalid_type = "asdf" +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("Text", "'2019-01-02 03:04:05'"), + ("DateTime", "'2019-01-02 03:04:05'"), + ("TimeStamp", "'2019-01-02 03:04:05'"), + ("Other", None), + ], +) +def test_convert_dttm( + target_type: str, + expected_result: Optional[str], + dttm: datetime, +) -> None: + from superset.db_engine_specs.sqlite import SqliteEngineSpec as spec - with pytest.raises(Exception): - SqliteEngineSpec.get_all_datasource_names(database, invalid_type) + assert_convert_dttm(spec, target_type, expected_result, dttm) @pytest.mark.parametrize( @@ -132,9 +84,7 @@ def test_get_all_datasource_names_invalid_type(app_context: AppContext) -> None: ("2022-12-04T05:06:07.89Z", "P3M", "2022-10-01 00:00:00"), ], ) -def test_time_grain_expressions( - dttm: str, grain: str, expected: str, app_context: AppContext -) -> None: +def test_time_grain_expressions(dttm: str, grain: str, expected: str) -> None: from superset.db_engine_specs.sqlite import SqliteEngineSpec engine = create_engine("sqlite://") diff --git a/tests/unit_tests/db_engine_specs/test_teradata.py b/tests/unit_tests/db_engine_specs/test_teradata.py index 5887a9317c7f..eab03e040d56 100644 --- a/tests/unit_tests/db_engine_specs/test_teradata.py +++ b/tests/unit_tests/db_engine_specs/test_teradata.py @@ -16,7 +16,6 @@ # under the License. # pylint: disable=unused-argument, import-outside-toplevel, protected-access import pytest -from flask.ctx import AppContext @pytest.mark.parametrize( @@ -32,7 +31,6 @@ ], ) def test_apply_top_to_sql_limit( - app_context: AppContext, limit: int, original: str, expected: str, diff --git a/tests/unit_tests/db_engine_specs/test_trino.py b/tests/unit_tests/db_engine_specs/test_trino.py index 9962a0f66d0d..0ea296a075e7 100644 --- a/tests/unit_tests/db_engine_specs/test_trino.py +++ b/tests/unit_tests/db_engine_specs/test_trino.py @@ -14,43 +14,355 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +# pylint: disable=unused-argument, import-outside-toplevel, protected-access +import json from datetime import datetime -from typing import Optional +from typing import Any, Dict, Optional, Type +from unittest.mock import Mock, patch +import pandas as pd import pytest -import pytz -from flask.ctx import AppContext +from pytest_mock import MockerFixture +from sqlalchemy import types + +import superset.config +from superset.constants import QUERY_CANCEL_KEY, QUERY_EARLY_CANCEL_KEY, USER_AGENT +from superset.utils.core import GenericDataType +from tests.unit_tests.db_engine_specs.utils import ( + assert_column_spec, + assert_convert_dttm, +) +from tests.unit_tests.fixtures.common import dttm @pytest.mark.parametrize( - "target_type,dttm,result", + "extra,expected", [ - ("VARCHAR", datetime(2022, 1, 1), None), - ("DATE", datetime(2022, 1, 1), "from_iso8601_date('2022-01-01')"), + ({}, {"engine_params": {"connect_args": {"source": USER_AGENT}}}), ( - "TIMESTAMP", - datetime(2022, 1, 1, 1, 23, 45, 600000), - "from_iso8601_timestamp('2022-01-01T01:23:45.600000')", + { + "first": 1, + "engine_params": { + "second": "two", + "connect_args": {"source": "foobar", "third": "three"}, + }, + }, + { + "first": 1, + "engine_params": { + "second": "two", + "connect_args": {"source": "foobar", "third": "three"}, + }, + }, ), + ], +) +def test_get_extra_params(extra: Dict[str, Any], expected: Dict[str, Any]) -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + + database = Mock() + + database.extra = json.dumps(extra) + database.server_cert = None + assert TrinoEngineSpec.get_extra_params(database) == expected + + +@patch("superset.utils.core.create_ssl_cert_file") +def test_get_extra_params_with_server_cert(mock_create_ssl_cert_file: Mock) -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + + database = Mock() + + database.extra = json.dumps({}) + database.server_cert = "TEST_CERT" + mock_create_ssl_cert_file.return_value = "/path/to/tls.crt" + extra = TrinoEngineSpec.get_extra_params(database) + + connect_args = extra.get("engine_params", {}).get("connect_args", {}) + assert connect_args.get("http_scheme") == "https" + assert connect_args.get("verify") == "/path/to/tls.crt" + mock_create_ssl_cert_file.assert_called_once_with(database.server_cert) + + +@patch("trino.auth.BasicAuthentication") +def test_auth_basic(mock_auth: Mock) -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + + database = Mock() + + auth_params = {"username": "username", "password": "password"} + database.encrypted_extra = json.dumps( + {"auth_method": "basic", "auth_params": auth_params} + ) + + params: Dict[str, Any] = {} + TrinoEngineSpec.update_params_from_encrypted_extra(database, params) + connect_args = params.setdefault("connect_args", {}) + assert connect_args.get("http_scheme") == "https" + mock_auth.assert_called_once_with(**auth_params) + + +@patch("trino.auth.KerberosAuthentication") +def test_auth_kerberos(mock_auth: Mock) -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + + database = Mock() + + auth_params = { + "service_name": "superset", + "mutual_authentication": False, + "delegate": True, + } + database.encrypted_extra = json.dumps( + {"auth_method": "kerberos", "auth_params": auth_params} + ) + + params: Dict[str, Any] = {} + TrinoEngineSpec.update_params_from_encrypted_extra(database, params) + connect_args = params.setdefault("connect_args", {}) + assert connect_args.get("http_scheme") == "https" + mock_auth.assert_called_once_with(**auth_params) + + +@patch("trino.auth.CertificateAuthentication") +def test_auth_certificate(mock_auth: Mock) -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + + database = Mock() + auth_params = {"cert": "/path/to/cert.pem", "key": "/path/to/key.pem"} + database.encrypted_extra = json.dumps( + {"auth_method": "certificate", "auth_params": auth_params} + ) + + params: Dict[str, Any] = {} + TrinoEngineSpec.update_params_from_encrypted_extra(database, params) + connect_args = params.setdefault("connect_args", {}) + assert connect_args.get("http_scheme") == "https" + mock_auth.assert_called_once_with(**auth_params) + + +@patch("trino.auth.JWTAuthentication") +def test_auth_jwt(mock_auth: Mock) -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + + database = Mock() + + auth_params = {"token": "jwt-token-string"} + database.encrypted_extra = json.dumps( + {"auth_method": "jwt", "auth_params": auth_params} + ) + + params: Dict[str, Any] = {} + TrinoEngineSpec.update_params_from_encrypted_extra(database, params) + connect_args = params.setdefault("connect_args", {}) + assert connect_args.get("http_scheme") == "https" + mock_auth.assert_called_once_with(**auth_params) + + +def test_auth_custom_auth() -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + + database = Mock() + auth_class = Mock() + + auth_method = "custom_auth" + auth_params = {"params1": "params1", "params2": "params2"} + database.encrypted_extra = json.dumps( + {"auth_method": auth_method, "auth_params": auth_params} + ) + + with patch.dict( + "superset.config.ALLOWED_EXTRA_AUTHENTICATIONS", + {"trino": {"custom_auth": auth_class}}, + clear=True, + ): + params: Dict[str, Any] = {} + TrinoEngineSpec.update_params_from_encrypted_extra(database, params) + + connect_args = params.setdefault("connect_args", {}) + assert connect_args.get("http_scheme") == "https" + + auth_class.assert_called_once_with(**auth_params) + + +def test_auth_custom_auth_denied() -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + + database = Mock() + auth_method = "my.module:TrinoAuthClass" + auth_params = {"params1": "params1", "params2": "params2"} + database.encrypted_extra = json.dumps( + {"auth_method": auth_method, "auth_params": auth_params} + ) + + superset.config.ALLOWED_EXTRA_AUTHENTICATIONS = {} + + with pytest.raises(ValueError) as excinfo: + TrinoEngineSpec.update_params_from_encrypted_extra(database, {}) + + assert str(excinfo.value) == ( + f"For security reason, custom authentication '{auth_method}' " + f"must be listed in 'ALLOWED_EXTRA_AUTHENTICATIONS' config" + ) + + +@pytest.mark.parametrize( + "native_type,sqla_type,attrs,generic_type,is_dttm", + [ + ("BOOLEAN", types.Boolean, None, GenericDataType.BOOLEAN, False), + ("TINYINT", types.Integer, None, GenericDataType.NUMERIC, False), + ("SMALLINT", types.SmallInteger, None, GenericDataType.NUMERIC, False), + ("INTEGER", types.Integer, None, GenericDataType.NUMERIC, False), + ("BIGINT", types.BigInteger, None, GenericDataType.NUMERIC, False), + ("REAL", types.FLOAT, None, GenericDataType.NUMERIC, False), + ("DOUBLE", types.FLOAT, None, GenericDataType.NUMERIC, False), + ("DECIMAL", types.DECIMAL, None, GenericDataType.NUMERIC, False), + ("VARCHAR", types.String, None, GenericDataType.STRING, False), + ("VARCHAR(20)", types.VARCHAR, {"length": 20}, GenericDataType.STRING, False), + ("CHAR", types.String, None, GenericDataType.STRING, False), + ("CHAR(2)", types.CHAR, {"length": 2}, GenericDataType.STRING, False), + ("JSON", types.JSON, None, GenericDataType.STRING, False), + ("TIMESTAMP", types.TIMESTAMP, None, GenericDataType.TEMPORAL, True), + ("TIMESTAMP(3)", types.TIMESTAMP, None, GenericDataType.TEMPORAL, True), ( "TIMESTAMP WITH TIME ZONE", - datetime(2022, 1, 1, 1, 23, 45, 600000), - "from_iso8601_timestamp('2022-01-01T01:23:45.600000')", + types.TIMESTAMP, + None, + GenericDataType.TEMPORAL, + True, ), ( - "TIMESTAMP WITH TIME ZONE", - datetime(2022, 1, 1, 1, 23, 45, 600000, tzinfo=pytz.UTC), - "from_iso8601_timestamp('2022-01-01T01:23:45.600000+00:00')", + "TIMESTAMP(3) WITH TIME ZONE", + types.TIMESTAMP, + None, + GenericDataType.TEMPORAL, + True, ), + ("DATE", types.Date, None, GenericDataType.TEMPORAL, True), + ], +) +def test_get_column_spec( + native_type: str, + sqla_type: Type[types.TypeEngine], + attrs: Optional[Dict[str, Any]], + generic_type: GenericDataType, + is_dttm: bool, +) -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec as spec + + assert_column_spec( + spec, + native_type, + sqla_type, + attrs, + generic_type, + is_dttm, + ) + + +@pytest.mark.parametrize( + "target_type,expected_result", + [ + ("TimeStamp", "TIMESTAMP '2019-01-02 03:04:05.678900'"), + ("TimeStamp(3)", "TIMESTAMP '2019-01-02 03:04:05.678900'"), + ("TimeStamp With Time Zone", "TIMESTAMP '2019-01-02 03:04:05.678900'"), + ("TimeStamp(3) With Time Zone", "TIMESTAMP '2019-01-02 03:04:05.678900'"), + ("Date", "DATE '2019-01-02'"), + ("Other", None), ], ) def test_convert_dttm( - app_context: AppContext, target_type: str, + expected_result: Optional[str], dttm: datetime, - result: Optional[str], ) -> None: from superset.db_engine_specs.trino import TrinoEngineSpec - for case in (str.lower, str.upper): - assert TrinoEngineSpec.convert_dttm(case(target_type), dttm) == result + assert_convert_dttm(TrinoEngineSpec, target_type, expected_result, dttm) + + +def test_extra_table_metadata() -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + + db_mock = Mock() + db_mock.get_indexes = Mock( + return_value=[{"column_names": ["ds", "hour"], "name": "partition"}] + ) + db_mock.get_extra = Mock(return_value={}) + db_mock.has_view_by_name = Mock(return_value=None) + db_mock.get_df = Mock(return_value=pd.DataFrame({"ds": ["01-01-19"], "hour": [1]})) + result = TrinoEngineSpec.extra_table_metadata(db_mock, "test_table", "test_schema") + assert result["partitions"]["cols"] == ["ds", "hour"] + assert result["partitions"]["latest"] == {"ds": "01-01-19", "hour": 1} + + +@patch("sqlalchemy.engine.Engine.connect") +def test_cancel_query_success(engine_mock: Mock) -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + from superset.models.sql_lab import Query + + query = Query() + cursor_mock = engine_mock.return_value.__enter__.return_value + assert TrinoEngineSpec.cancel_query(cursor_mock, query, "123") is True + + +@patch("sqlalchemy.engine.Engine.connect") +def test_cancel_query_failed(engine_mock: Mock) -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + from superset.models.sql_lab import Query + + query = Query() + cursor_mock = engine_mock.raiseError.side_effect = Exception() + assert TrinoEngineSpec.cancel_query(cursor_mock, query, "123") is False + + +@pytest.mark.parametrize( + "initial_extra,final_extra", + [ + ({}, {QUERY_EARLY_CANCEL_KEY: True}), + ({QUERY_CANCEL_KEY: "my_key"}, {QUERY_CANCEL_KEY: "my_key"}), + ], +) +def test_prepare_cancel_query( + initial_extra: Dict[str, Any], + final_extra: Dict[str, Any], + mocker: MockerFixture, +) -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + from superset.models.sql_lab import Query + + session_mock = mocker.MagicMock() + query = Query(extra_json=json.dumps(initial_extra)) + TrinoEngineSpec.prepare_cancel_query(query=query, session=session_mock) + assert query.extra == final_extra + + +@pytest.mark.parametrize("cancel_early", [True, False]) +@patch("superset.db_engine_specs.trino.TrinoEngineSpec.cancel_query") +@patch("sqlalchemy.engine.Engine.connect") +def test_handle_cursor_early_cancel( + engine_mock: Mock, + cancel_query_mock: Mock, + cancel_early: bool, + mocker: MockerFixture, +) -> None: + from superset.db_engine_specs.trino import TrinoEngineSpec + from superset.models.sql_lab import Query + + query_id = "myQueryId" + + cursor_mock = engine_mock.return_value.__enter__.return_value + cursor_mock.stats = {"queryId": query_id} + session_mock = mocker.MagicMock() + + query = Query() + + if cancel_early: + TrinoEngineSpec.prepare_cancel_query(query=query, session=session_mock) + + TrinoEngineSpec.handle_cursor(cursor=cursor_mock, query=query, session=session_mock) + + if cancel_early: + assert cancel_query_mock.call_args[1]["cancel_query_id"] == query_id + else: + assert cancel_query_mock.call_args is None diff --git a/tests/unit_tests/db_engine_specs/utils.py b/tests/unit_tests/db_engine_specs/utils.py new file mode 100644 index 000000000000..13ae7a34d293 --- /dev/null +++ b/tests/unit_tests/db_engine_specs/utils.py @@ -0,0 +1,67 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from __future__ import annotations + +from datetime import datetime +from typing import Any, Dict, Optional, Type, TYPE_CHECKING + +from sqlalchemy import types + +from superset.utils.core import GenericDataType + +if TYPE_CHECKING: + from superset.db_engine_specs.base import BaseEngineSpec + + +def assert_convert_dttm( + db_engine_spec: Type[BaseEngineSpec], + target_type: str, + expected_result: Optional[str], + dttm: datetime, + db_extra: Optional[Dict[str, Any]] = None, +) -> None: + for target in ( + target_type, + target_type.upper(), + target_type.lower(), + target_type.capitalize(), + ): + assert ( + result := db_engine_spec.convert_dttm( + target_type=target, + dttm=dttm, + db_extra=db_extra, + ) + ) == expected_result, result + + +def assert_column_spec( + db_engine_spec: Type[BaseEngineSpec], + native_type: str, + sqla_type: Type[types.TypeEngine], + attrs: Optional[Dict[str, Any]], + generic_type: GenericDataType, + is_dttm: bool, +) -> None: + assert (column_spec := db_engine_spec.get_column_spec(native_type)) is not None + assert isinstance(column_spec.sqla_type, sqla_type) + + for key, value in (attrs or {}).items(): + assert getattr(column_spec.sqla_type, key) == value + + assert column_spec.generic_type == generic_type + assert column_spec.is_dttm == is_dttm diff --git a/tests/unit_tests/explore/api_test.py b/tests/unit_tests/explore/api_test.py new file mode 100644 index 000000000000..147790844dcd --- /dev/null +++ b/tests/unit_tests/explore/api_test.py @@ -0,0 +1,30 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import Any + +import pytest + + +def test_explore_datasource_not_found(client: Any, full_api_access: None) -> None: + # validating the payload for a dataset that doesn't exist + # user should be expecting missing_datasource view + response = client.get( + "/api/v1/explore/?datasource_id=50000&datasource_type=table", + ) + response.json["result"]["dataset"]["name"] == "[Missing Dataset]" + assert response.status_code == 200 diff --git a/tests/unit_tests/explore/utils_test.py b/tests/unit_tests/explore/utils_test.py index b902e9cd040a..41441254191c 100644 --- a/tests/unit_tests/explore/utils_test.py +++ b/tests/unit_tests/explore/utils_test.py @@ -14,7 +14,6 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from flask.ctx import AppContext from flask_appbuilder.security.sqla.models import User from pytest import raises from pytest_mock import MockFixture @@ -28,7 +27,7 @@ DatasetNotFoundError, ) from superset.exceptions import SupersetSecurityException -from superset.utils.core import DatasourceType +from superset.utils.core import DatasourceType, override_user dataset_find_by_id = "superset.datasets.dao.DatasetDAO.find_by_id" query_find_by_id = "superset.queries.dao.QueryDAO.find_by_id" @@ -44,49 +43,79 @@ "superset.connectors.sqla.models.SqlaTable.query_datasources_by_name" ) -def test_unsaved_chart_no_dataset_id(app_context: AppContext) -> None: - from superset.explore.utils import check_access - with raises(DatasetNotFoundError): - check_access(dataset_id=0, chart_id=0, actor=User()) +def test_unsaved_chart_no_dataset_id() -> None: + from superset.explore.utils import check_access as check_chart_access + with raises(DatasourceNotFoundValidationError): + with override_user(User()): + check_chart_access( + datasource_id=0, + chart_id=0, + datasource_type=DatasourceType.TABLE, + ) -def test_unsaved_chart_unknown_dataset_id( - mocker: MockFixture, app_context: AppContext -) -> None: - from superset.explore.utils import check_access + +def test_unsaved_chart_unknown_dataset_id(mocker: MockFixture) -> None: + from superset.explore.utils import check_access as check_chart_access with raises(DatasetNotFoundError): mocker.patch(dataset_find_by_id, return_value=None) - check_access(dataset_id=1, chart_id=0, actor=User()) + with override_user(User()): + check_chart_access( + datasource_id=1, + chart_id=0, + datasource_type=DatasourceType.TABLE, + ) + + +def test_unsaved_chart_unknown_query_id(mocker: MockFixture) -> None: + from superset.explore.utils import check_access as check_chart_access + + with raises(QueryNotFoundValidationError): + mocker.patch(query_find_by_id, return_value=None) + + with override_user(User()): + check_chart_access( + datasource_id=1, + chart_id=0, + datasource_type=DatasourceType.QUERY, + ) -def test_unsaved_chart_unauthorized_dataset( - mocker: MockFixture, app_context: AppContext -) -> None: + +def test_unsaved_chart_unauthorized_dataset(mocker: MockFixture) -> None: from superset.connectors.sqla.models import SqlaTable from superset.explore import utils with raises(DatasetAccessDeniedError): mocker.patch(dataset_find_by_id, return_value=SqlaTable()) mocker.patch(can_access_datasource, return_value=False) - utils.check_access(dataset_id=1, chart_id=0, actor=User()) + + with override_user(User()): + check_chart_access( + datasource_id=1, + chart_id=0, + datasource_type=DatasourceType.TABLE, + ) -def test_unsaved_chart_authorized_dataset( - mocker: MockFixture, app_context: AppContext -) -> None: +def test_unsaved_chart_authorized_dataset(mocker: MockFixture) -> None: from superset.connectors.sqla.models import SqlaTable from superset.explore.utils import check_access mocker.patch(dataset_find_by_id, return_value=SqlaTable()) mocker.patch(can_access_datasource, return_value=True) - assert check_access(dataset_id=1, chart_id=0, actor=User()) == True + with override_user(User()): + check_chart_access( + datasource_id=1, + chart_id=0, + datasource_type=DatasourceType.TABLE, + ) -def test_saved_chart_unknown_chart_id( - mocker: MockFixture, app_context: AppContext -) -> None: + +def test_saved_chart_unknown_chart_id(mocker: MockFixture) -> None: from superset.connectors.sqla.models import SqlaTable from superset.explore.utils import check_access @@ -94,22 +123,32 @@ def test_saved_chart_unknown_chart_id( mocker.patch(dataset_find_by_id, return_value=SqlaTable()) mocker.patch(can_access_datasource, return_value=True) mocker.patch(chart_find_by_id, return_value=None) - check_access(dataset_id=1, chart_id=1, actor=User()) + + with override_user(User()): + check_chart_access( + datasource_id=1, + chart_id=1, + datasource_type=DatasourceType.TABLE, + ) -def test_saved_chart_unauthorized_dataset( - mocker: MockFixture, app_context: AppContext -) -> None: +def test_saved_chart_unauthorized_dataset(mocker: MockFixture) -> None: from superset.connectors.sqla.models import SqlaTable from superset.explore import utils with raises(DatasetAccessDeniedError): mocker.patch(dataset_find_by_id, return_value=SqlaTable()) mocker.patch(can_access_datasource, return_value=False) - utils.check_access(dataset_id=1, chart_id=1, actor=User()) + + with override_user(User()): + check_chart_access( + datasource_id=1, + chart_id=1, + datasource_type=DatasourceType.TABLE, + ) -def test_saved_chart_is_admin(mocker: MockFixture, app_context: AppContext) -> None: +def test_saved_chart_is_admin(mocker: MockFixture) -> None: from superset.connectors.sqla.models import SqlaTable from superset.explore.utils import check_access from superset.models.slice import Slice @@ -118,10 +157,16 @@ def test_saved_chart_is_admin(mocker: MockFixture, app_context: AppContext) -> N mocker.patch(can_access_datasource, return_value=True) mocker.patch(is_admin, return_value=True) mocker.patch(chart_find_by_id, return_value=Slice()) - assert check_access(dataset_id=1, chart_id=1, actor=User()) is True + + with override_user(User()): + check_chart_access( + datasource_id=1, + chart_id=1, + datasource_type=DatasourceType.TABLE, + ) -def test_saved_chart_is_owner(mocker: MockFixture, app_context: AppContext) -> None: +def test_saved_chart_is_owner(mocker: MockFixture) -> None: from superset.connectors.sqla.models import SqlaTable from superset.explore.utils import check_access from superset.models.slice import Slice @@ -131,10 +176,16 @@ def test_saved_chart_is_owner(mocker: MockFixture, app_context: AppContext) -> N mocker.patch(is_admin, return_value=False) mocker.patch(is_owner, return_value=True) mocker.patch(chart_find_by_id, return_value=Slice()) - assert check_access(dataset_id=1, chart_id=1, actor=User()) == True + with override_user(User()): + check_chart_access( + datasource_id=1, + chart_id=1, + datasource_type=DatasourceType.TABLE, + ) -def test_saved_chart_has_access(mocker: MockFixture, app_context: AppContext) -> None: + +def test_saved_chart_has_access(mocker: MockFixture) -> None: from superset.connectors.sqla.models import SqlaTable from superset.explore.utils import check_access from superset.models.slice import Slice @@ -145,10 +196,16 @@ def test_saved_chart_has_access(mocker: MockFixture, app_context: AppContext) -> mocker.patch(is_owner, return_value=False) mocker.patch(can_access, return_value=True) mocker.patch(chart_find_by_id, return_value=Slice()) - assert check_access(dataset_id=1, chart_id=1, actor=User()) == True + + with override_user(User()): + check_chart_access( + datasource_id=1, + chart_id=1, + datasource_type=DatasourceType.TABLE, + ) -def test_saved_chart_no_access(mocker: MockFixture, app_context: AppContext) -> None: +def test_saved_chart_no_access(mocker: MockFixture) -> None: from superset.connectors.sqla.models import SqlaTable from superset.explore.utils import check_access as check_chart_access from superset.models.slice import Slice @@ -160,15 +217,16 @@ def test_saved_chart_no_access(mocker: MockFixture, app_context: AppContext) -> mocker.patch(is_owner, return_value=False) mocker.patch(can_access, return_value=False) mocker.patch(chart_find_by_id, return_value=Slice()) - check_chart_access( - datasource_id=1, - chart_id=1, - actor=User(), - datasource_type=DatasourceType.TABLE, - ) + + with override_user(User()): + check_chart_access( + datasource_id=1, + chart_id=1, + datasource_type=DatasourceType.TABLE, + ) -def test_dataset_has_access(mocker: MockFixture, app_context: AppContext) -> None: +def test_dataset_has_access(mocker: MockFixture) -> None: from superset.connectors.sqla.models import SqlaTable from superset.explore.utils import check_datasource_access @@ -186,7 +244,7 @@ def test_dataset_has_access(mocker: MockFixture, app_context: AppContext) -> Non ) -def test_query_has_access(mocker: MockFixture, app_context: AppContext) -> None: +def test_query_has_access(mocker: MockFixture) -> None: from superset.explore.utils import check_datasource_access from superset.models.sql_lab import Query @@ -204,7 +262,7 @@ def test_query_has_access(mocker: MockFixture, app_context: AppContext) -> None: ) -def test_query_no_access(mocker: MockFixture, client, app_context: AppContext) -> None: +def test_query_no_access(mocker: MockFixture, client) -> None: from superset.connectors.sqla.models import SqlaTable from superset.explore.utils import check_datasource_access from superset.models.core import Database @@ -215,9 +273,7 @@ def test_query_no_access(mocker: MockFixture, client, app_context: AppContext) - query_find_by_id, return_value=Query(database=Database(), sql="select * from foo"), ) - table = SqlaTable() - table.owners = [] - mocker.patch(query_datasources_by_name, return_value=[table]) + mocker.patch(query_datasources_by_name, return_value=[SqlaTable()]) mocker.patch(is_admin, return_value=False) mocker.patch(is_owner, return_value=False) mocker.patch(can_access, return_value=False) diff --git a/tests/unit_tests/fixtures/__init__.py b/tests/unit_tests/fixtures/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/unit_tests/fixtures/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/unit_tests/fixtures/assets_configs.py b/tests/unit_tests/fixtures/assets_configs.py new file mode 100644 index 000000000000..6e78d9e562d1 --- /dev/null +++ b/tests/unit_tests/fixtures/assets_configs.py @@ -0,0 +1,260 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from typing import Any, Dict + +databases_config: Dict[str, Any] = { + "databases/examples.yaml": { + "database_name": "examples", + "sqlalchemy_uri": "sqlite:///test.db", + "cache_timeout": None, + "expose_in_sqllab": True, + "allow_run_async": False, + "allow_ctas": False, + "allow_cvas": False, + "extra": {}, + "uuid": "a2dc77af-e654-49bb-b321-40f6b559a1ee", + "version": "1.0.0", + "password": None, + "allow_csv_upload": False, + }, +} +datasets_config: Dict[str, Any] = { + "datasets/examples/video_game_sales.yaml": { + "table_name": "video_game_sales", + "main_dttm_col": None, + "description": None, + "default_endpoint": None, + "offset": 0, + "cache_timeout": None, + "schema": "main", + "sql": "", + "params": {}, + "template_params": None, + "filter_select_enabled": True, + "fetch_values_predicate": None, + "extra": None, + "uuid": "53d47c0c-c03d-47f0-b9ac-81225f808283", + "metrics": [ + { + "metric_name": "count", + "verbose_name": "COUNT(*)", + "metric_type": None, + "expression": "COUNT(*)", + "description": None, + "d3format": None, + "extra": None, + "warning_text": None, + } + ], + "columns": [ + { + "column_name": "genre", + "verbose_name": None, + "is_dttm": False, + "is_active": None, + "type": "STRING", + "advanced_data_type": None, + "groupby": True, + "filterable": True, + "expression": None, + "description": None, + "python_date_format": None, + "extra": None, + }, + ], + "version": "1.0.0", + "database_uuid": "a2dc77af-e654-49bb-b321-40f6b559a1ee", + }, +} +charts_config_1: Dict[str, Any] = { + "charts/Games_per_Genre_over_time_95.yaml": { + "slice_name": "Games per Genre over time", + "viz_type": "line", + "params": {}, + "cache_timeout": None, + "uuid": "0f8976aa-7bb4-40c7-860b-64445a51aaaf", + "version": "1.0.0", + "dataset_uuid": "53d47c0c-c03d-47f0-b9ac-81225f808283", + }, + "charts/Games_per_Genre_131.yaml": { + "slice_name": "Games per Genre", + "viz_type": "treemap", + "params": {}, + "cache_timeout": None, + "uuid": "0499bdec-0837-44f3-ae8a-8c670de81afd", + "version": "1.0.0", + "dataset_uuid": "53d47c0c-c03d-47f0-b9ac-81225f808283", + }, +} +dashboards_config_1: Dict[str, Any] = { + "dashboards/Video_Game_Sales_11.yaml": { + "dashboard_title": "Video Game Sales", + "description": None, + "css": "", + "slug": None, + "uuid": "c7bc10f4-6a2d-7569-caae-bbc91864ee11", + "position": { + "CHART-1L7NIcXvVN": { + "children": [], + "id": "CHART-1L7NIcXvVN", + "meta": { + "chartId": 95, + "height": 79, + "sliceName": "Games per Genre over time", + "uuid": "0f8976aa-7bb4-40c7-860b-64445a51aaaf", + "width": 6, + }, + "parents": [ + "ROOT_ID", + "GRID_ID", + "ROW-0F99WDC-sz", + ], + "type": "CHART", + }, + "CHART-7mKdnU7OUJ": { + "children": [], + "id": "CHART-7mKdnU7OUJ", + "meta": { + "chartId": 131, + "height": 80, + "sliceName": "Games per Genre", + "uuid": "0499bdec-0837-44f3-ae8a-8c670de81afd", + "width": 3, + }, + "parents": [ + "ROOT_ID", + "GRID_ID", + "ROW-0F99WDC-sz", + ], + "type": "CHART", + }, + "DASHBOARD_VERSION_KEY": "v2", + "GRID_ID": { + "children": ["ROW-0F99WDC-sz"], + "id": "GRID_ID", + "parents": ["ROOT_ID"], + "type": "GRID", + }, + "HEADER_ID": { + "id": "HEADER_ID", + "meta": {"text": "Video Game Sales"}, + "type": "HEADER", + }, + "ROOT_ID": { + "children": ["GRID_ID"], + "id": "ROOT_ID", + "type": "ROOT", + }, + "ROW-0F99WDC-sz": { + "children": ["CHART-1L7NIcXvVN", "CHART-7mKdnU7OUJ"], + "id": "ROW-0F99WDC-sz", + "meta": {"0": "ROOT_ID", "background": "BACKGROUND_TRANSPARENT"}, + "parents": ["ROOT_ID", "GRID_ID"], + "type": "ROW", + }, + }, + "metadata": { + "timed_refresh_immune_slices": [], + "expanded_slices": {}, + "refresh_frequency": 0, + "default_filters": "{}", + "color_scheme": "supersetColors", + "label_colors": {}, + "show_native_filters": True, + "color_scheme_domain": [], + "shared_label_colors": {}, + "cross_filters_enabled": False, + }, + "version": "1.0.0", + }, +} + +charts_config_2: Dict[str, Any] = { + "charts/Games_per_Genre_131.yaml": { + "slice_name": "Games per Genre", + "viz_type": "treemap", + "params": {}, + "cache_timeout": None, + "uuid": "0499bdec-0837-44f3-ae8a-8c670de81afd", + "version": "1.0.0", + "dataset_uuid": "53d47c0c-c03d-47f0-b9ac-81225f808283", + }, +} +dashboards_config_2: Dict[str, Any] = { + "dashboards/Video_Game_Sales_11.yaml": { + "dashboard_title": "Video Game Sales", + "description": None, + "css": "", + "slug": None, + "uuid": "c7bc10f4-6a2d-7569-caae-bbc91864ee11", + "position": { + "CHART-7mKdnU7OUJ": { + "children": [], + "id": "CHART-7mKdnU7OUJ", + "meta": { + "chartId": 131, + "height": 80, + "sliceName": "Games per Genre", + "uuid": "0499bdec-0837-44f3-ae8a-8c670de81afd", + "width": 3, + }, + "parents": [ + "ROOT_ID", + "GRID_ID", + "ROW-0F99WDC-sz", + ], + "type": "CHART", + }, + "DASHBOARD_VERSION_KEY": "v2", + "GRID_ID": { + "children": ["ROW-0F99WDC-sz"], + "id": "GRID_ID", + "parents": ["ROOT_ID"], + "type": "GRID", + }, + "HEADER_ID": { + "id": "HEADER_ID", + "meta": {"text": "Video Game Sales"}, + "type": "HEADER", + }, + "ROOT_ID": { + "children": ["GRID_ID"], + "id": "ROOT_ID", + "type": "ROOT", + }, + "ROW-0F99WDC-sz": { + "children": ["CHART-7mKdnU7OUJ"], + "id": "ROW-0F99WDC-sz", + "meta": {"0": "ROOT_ID", "background": "BACKGROUND_TRANSPARENT"}, + "parents": ["ROOT_ID", "GRID_ID"], + "type": "ROW", + }, + }, + "metadata": { + "timed_refresh_immune_slices": [], + "expanded_slices": {}, + "refresh_frequency": 0, + "default_filters": "{}", + "color_scheme": "supersetColors", + "label_colors": {}, + "show_native_filters": True, + "color_scheme_domain": [], + "shared_label_colors": {}, + }, + "version": "1.0.0", + }, +} diff --git a/tests/unit_tests/importexport/api_test.py b/tests/unit_tests/importexport/api_test.py index 1ef4309fc21b..a65a682018ed 100644 --- a/tests/unit_tests/importexport/api_test.py +++ b/tests/unit_tests/importexport/api_test.py @@ -28,18 +28,16 @@ from superset import security_manager -def test_export_assets(mocker: MockFixture, client: Any) -> None: +def test_export_assets( + mocker: MockFixture, + client: Any, + full_api_access: None, +) -> None: """ Test exporting assets. """ from superset.commands.importers.v1.utils import get_contents_from_bundle - # grant access - mocker.patch( - "flask_appbuilder.security.decorators.verify_jwt_in_request", return_value=True - ) - mocker.patch.object(security_manager, "has_access", return_value=True) - mocked_contents = [ ( "metadata.yaml", @@ -63,16 +61,14 @@ def test_export_assets(mocker: MockFixture, client: Any) -> None: assert contents == dict(mocked_contents) -def test_import_assets(mocker: MockFixture, client: Any) -> None: +def test_import_assets( + mocker: MockFixture, + client: Any, + full_api_access: None, +) -> None: """ Test importing assets. """ - # grant access - mocker.patch( - "flask_appbuilder.security.decorators.verify_jwt_in_request", return_value=True - ) - mocker.patch.object(security_manager, "has_access", return_value=True) - mocked_contents = { "metadata.yaml": ( "version: 1.0.0\ntype: assets\ntimestamp: '2022-01-01T00:00:00+00:00'\n" @@ -106,16 +102,14 @@ def test_import_assets(mocker: MockFixture, client: Any) -> None: ImportAssetsCommand.assert_called_with(mocked_contents, passwords=passwords) -def test_import_assets_not_zip(mocker: MockFixture, client: Any) -> None: +def test_import_assets_not_zip( + mocker: MockFixture, + client: Any, + full_api_access: None, +) -> None: """ Test error message when the upload is not a ZIP file. """ - # grant access - mocker.patch( - "flask_appbuilder.security.decorators.verify_jwt_in_request", return_value=True - ) - mocker.patch.object(security_manager, "has_access", return_value=True) - buf = BytesIO(b"definitely_not_a_zip_file") form_data = { "bundle": (buf, "broken.txt"), @@ -146,14 +140,14 @@ def test_import_assets_not_zip(mocker: MockFixture, client: Any) -> None: } -def test_import_assets_no_form_data(mocker: MockFixture, client: Any) -> None: +def test_import_assets_no_form_data( + mocker: MockFixture, + client: Any, + full_api_access: None, +) -> None: """ Test error message when the upload has no form data. """ - # grant access - mocker.patch( - "flask_appbuilder.security.decorators.verify_jwt_in_request", return_value=True - ) mocker.patch.object(security_manager, "has_access", return_value=True) response = client.post("/api/v1/assets/import/", data="some_content") @@ -180,16 +174,14 @@ def test_import_assets_no_form_data(mocker: MockFixture, client: Any) -> None: } -def test_import_assets_incorrect_form_data(mocker: MockFixture, client: Any) -> None: +def test_import_assets_incorrect_form_data( + mocker: MockFixture, + client: Any, + full_api_access: None, +) -> None: """ Test error message when the upload form data has the wrong key. """ - # grant access - mocker.patch( - "flask_appbuilder.security.decorators.verify_jwt_in_request", return_value=True - ) - mocker.patch.object(security_manager, "has_access", return_value=True) - buf = BytesIO(b"definitely_not_a_zip_file") form_data = { "wrong": (buf, "broken.txt"), @@ -201,16 +193,14 @@ def test_import_assets_incorrect_form_data(mocker: MockFixture, client: Any) -> assert response.json == {"message": "Arguments are not correct"} -def test_import_assets_no_contents(mocker: MockFixture, client: Any) -> None: +def test_import_assets_no_contents( + mocker: MockFixture, + client: Any, + full_api_access: None, +) -> None: """ Test error message when the ZIP bundle has no contents. """ - # grant access - mocker.patch( - "flask_appbuilder.security.decorators.verify_jwt_in_request", return_value=True - ) - mocker.patch.object(security_manager, "has_access", return_value=True) - mocked_contents = { "README.txt": "Something is wrong", } diff --git a/tests/unit_tests/jinja_context_test.py b/tests/unit_tests/jinja_context_test.py index 75c49f0977bf..13b3ae9e9c94 100644 --- a/tests/unit_tests/jinja_context_test.py +++ b/tests/unit_tests/jinja_context_test.py @@ -34,7 +34,7 @@ def test_where_in() -> None: assert where_in(["O'Malley's"]) == "('O''Malley''s')" -def test_dataset_macro(mocker: MockFixture, app_context: None) -> None: +def test_dataset_macro(mocker: MockFixture) -> None: """ Test the ``dataset_macro`` macro. """ diff --git a/tests/unit_tests/models/__init__.py b/tests/unit_tests/models/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/unit_tests/models/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/unit_tests/models/core_test.py b/tests/unit_tests/models/core_test.py new file mode 100644 index 000000000000..5eb60dc6f93e --- /dev/null +++ b/tests/unit_tests/models/core_test.py @@ -0,0 +1,147 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# pylint: disable=import-outside-toplevel + +from typing import List, Optional + +from pytest_mock import MockFixture +from sqlalchemy.engine.reflection import Inspector + + +def test_get_metrics(mocker: MockFixture) -> None: + """ + Tests for ``get_metrics``. + """ + from superset.db_engine_specs.base import MetricType + from superset.db_engine_specs.sqlite import SqliteEngineSpec + from superset.models.core import Database + + database = Database(database_name="my_database", sqlalchemy_uri="sqlite://") + assert database.get_metrics("table") == [ + { + "expression": "COUNT(*)", + "metric_name": "count", + "metric_type": "count", + "verbose_name": "COUNT(*)", + } + ] + + class CustomSqliteEngineSpec(SqliteEngineSpec): + @classmethod + def get_metrics( + cls, + database: Database, + inspector: Inspector, + table_name: str, + schema: Optional[str], + ) -> List[MetricType]: + return [ + { + "expression": "COUNT(DISTINCT user_id)", + "metric_name": "count_distinct_user_id", + "metric_type": "count_distinct", + "verbose_name": "COUNT(DISTINCT user_id)", + }, + ] + + database.get_db_engine_spec = mocker.MagicMock( # type: ignore + return_value=CustomSqliteEngineSpec + ) + assert database.get_metrics("table") == [ + { + "expression": "COUNT(DISTINCT user_id)", + "metric_name": "count_distinct_user_id", + "metric_type": "count_distinct", + "verbose_name": "COUNT(DISTINCT user_id)", + }, + ] + + +def test_get_db_engine_spec(mocker: MockFixture) -> None: + """ + Tests for ``get_db_engine_spec``. + """ + from superset.db_engine_specs import BaseEngineSpec + from superset.models.core import Database + + # pylint: disable=abstract-method + class PostgresDBEngineSpec(BaseEngineSpec): + """ + A DB engine spec with drivers and a default driver. + """ + + engine = "postgresql" + engine_aliases = {"postgres"} + drivers = { + "psycopg2": "The default Postgres driver", + "asyncpg": "An async Postgres driver", + } + default_driver = "psycopg2" + + # pylint: disable=abstract-method + class OldDBEngineSpec(BaseEngineSpec): + """ + And old DB engine spec without drivers nor a default driver. + """ + + engine = "mysql" + + load_engine_specs = mocker.patch("superset.db_engine_specs.load_engine_specs") + load_engine_specs.return_value = [ + PostgresDBEngineSpec, + OldDBEngineSpec, + ] + + assert ( + Database(database_name="db", sqlalchemy_uri="postgresql://").db_engine_spec + == PostgresDBEngineSpec + ) + assert ( + Database( + database_name="db", sqlalchemy_uri="postgresql+psycopg2://" + ).db_engine_spec + == PostgresDBEngineSpec + ) + assert ( + Database( + database_name="db", sqlalchemy_uri="postgresql+asyncpg://" + ).db_engine_spec + == PostgresDBEngineSpec + ) + assert ( + Database( + database_name="db", sqlalchemy_uri="postgresql+fancynewdriver://" + ).db_engine_spec + == PostgresDBEngineSpec + ) + assert ( + Database(database_name="db", sqlalchemy_uri="mysql://").db_engine_spec + == OldDBEngineSpec + ) + assert ( + Database( + database_name="db", sqlalchemy_uri="mysql+mysqlconnector://" + ).db_engine_spec + == OldDBEngineSpec + ) + assert ( + Database( + database_name="db", sqlalchemy_uri="mysql+fancynewdriver://" + ).db_engine_spec + == OldDBEngineSpec + ) diff --git a/tests/unit_tests/notifications/email_tests.py b/tests/unit_tests/notifications/email_tests.py new file mode 100644 index 000000000000..4ce34b99cac4 --- /dev/null +++ b/tests/unit_tests/notifications/email_tests.py @@ -0,0 +1,54 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import pandas as pd + + +def test_render_description_with_html() -> None: + # `superset.models.helpers`, a dependency of following imports, + # requires app context + from superset.reports.models import ReportRecipients, ReportRecipientType + from superset.reports.notifications.base import NotificationContent + from superset.reports.notifications.email import EmailNotification + + content = NotificationContent( + name="test alert", + embedded_data=pd.DataFrame( + { + "A": [1, 2, 3], + "B": [4, 5, 6], + "C": ["111", "222", '<a href="http://www.example.com">333</a>'], + } + ), + description='<p>This is <a href="#">a test</a> alert</p><br />', + header_data={ + "notification_format": "PNG", + "notification_type": "Alert", + "owners": [1], + "notification_source": None, + "chart_id": None, + "dashboard_id": None, + }, + ) + email_body = ( + EmailNotification( + recipient=ReportRecipients(type=ReportRecipientType.EMAIL), content=content + ) + ._get_content() + .body + ) + assert '<p>This is <a href="#">a test</a> alert</p><br>' in email_body + assert '<td><a href="http://www.example.com">333</a></td>' in email_body diff --git a/tests/unit_tests/pandas_postprocessing/test_compare.py b/tests/unit_tests/pandas_postprocessing/test_compare.py index 4f742bae1613..9da8a3153547 100644 --- a/tests/unit_tests/pandas_postprocessing/test_compare.py +++ b/tests/unit_tests/pandas_postprocessing/test_compare.py @@ -188,8 +188,6 @@ def test_compare_after_pivot(): "sum_metric": {"operator": "sum"}, "count_metric": {"operator": "sum"}, }, - flatten_columns=False, - reset_index=False, ) """ count_metric sum_metric diff --git a/tests/unit_tests/pandas_postprocessing/test_cum.py b/tests/unit_tests/pandas_postprocessing/test_cum.py index 17cd3c0efc8a..130e0602520a 100644 --- a/tests/unit_tests/pandas_postprocessing/test_cum.py +++ b/tests/unit_tests/pandas_postprocessing/test_cum.py @@ -83,8 +83,6 @@ def test_cum_after_pivot_with_single_metric(): index=["dttm"], columns=["country"], aggregates={"sum_metric": {"operator": "sum"}}, - flatten_columns=False, - reset_index=False, ) """ sum_metric @@ -127,8 +125,6 @@ def test_cum_after_pivot_with_multiple_metrics(): "sum_metric": {"operator": "sum"}, "count_metric": {"operator": "sum"}, }, - flatten_columns=False, - reset_index=False, ) """ count_metric sum_metric diff --git a/tests/unit_tests/pandas_postprocessing/test_flatten.py b/tests/unit_tests/pandas_postprocessing/test_flatten.py index 78a2e3eea442..fea84f7b9f5b 100644 --- a/tests/unit_tests/pandas_postprocessing/test_flatten.py +++ b/tests/unit_tests/pandas_postprocessing/test_flatten.py @@ -156,3 +156,22 @@ def test_flat_integer_column_name(): } ) ) + + +def test_escape_column_name(): + index = pd.to_datetime(["2021-01-01", "2021-01-02", "2021-01-03"]) + index.name = "__timestamp" + columns = pd.MultiIndex.from_arrays( + [ + ["level1,value1", "level1,value2", "level1,value3"], + ["level2, value1", "level2, value2", "level2, value3"], + ], + names=["level1", "level2"], + ) + df = pd.DataFrame(index=index, columns=columns, data=1) + assert list(pp.flatten(df).columns.values) == [ + "__timestamp", + "level1\\,value1" + FLAT_COLUMN_SEPARATOR + "level2\\, value1", + "level1\\,value2" + FLAT_COLUMN_SEPARATOR + "level2\\, value2", + "level1\\,value3" + FLAT_COLUMN_SEPARATOR + "level2\\, value3", + ] diff --git a/tests/unit_tests/pandas_postprocessing/test_pivot.py b/tests/unit_tests/pandas_postprocessing/test_pivot.py index 658cb4edcda8..8efd20390607 100644 --- a/tests/unit_tests/pandas_postprocessing/test_pivot.py +++ b/tests/unit_tests/pandas_postprocessing/test_pivot.py @@ -17,86 +17,12 @@ import numpy as np import pytest -from pandas import DataFrame, Timestamp, to_datetime +from pandas import DataFrame, to_datetime from superset.exceptions import InvalidPostProcessingError -from superset.utils.pandas_postprocessing import _flatten_column_after_pivot, pivot -from tests.unit_tests.fixtures.dataframes import categories_df, single_metric_df -from tests.unit_tests.pandas_postprocessing.utils import ( - AGGREGATES_MULTIPLE, - AGGREGATES_SINGLE, -) - - -def test_flatten_column_after_pivot(): - """ - Test pivot column flattening function - """ - # single aggregate cases - assert ( - _flatten_column_after_pivot( - aggregates=AGGREGATES_SINGLE, - column="idx_nulls", - ) - == "idx_nulls" - ) - - assert ( - _flatten_column_after_pivot( - aggregates=AGGREGATES_SINGLE, - column=1234, - ) - == "1234" - ) - - assert ( - _flatten_column_after_pivot( - aggregates=AGGREGATES_SINGLE, - column=Timestamp("2020-09-29T00:00:00"), - ) - == "2020-09-29 00:00:00" - ) - - assert ( - _flatten_column_after_pivot( - aggregates=AGGREGATES_SINGLE, - column="idx_nulls", - ) - == "idx_nulls" - ) - - assert ( - _flatten_column_after_pivot( - aggregates=AGGREGATES_SINGLE, - column=("idx_nulls", "col1"), - ) - == "col1" - ) - - assert ( - _flatten_column_after_pivot( - aggregates=AGGREGATES_SINGLE, - column=("idx_nulls", "col1", 1234), - ) - == "col1, 1234" - ) - - # Multiple aggregate cases - assert ( - _flatten_column_after_pivot( - aggregates=AGGREGATES_MULTIPLE, - column=("idx_nulls", "asc_idx", "col1"), - ) - == "idx_nulls, asc_idx, col1" - ) - - assert ( - _flatten_column_after_pivot( - aggregates=AGGREGATES_MULTIPLE, - column=("idx_nulls", "asc_idx", "col1", 1234), - ) - == "idx_nulls, asc_idx, col1, 1234" - ) +from superset.utils.pandas_postprocessing import flatten, pivot +from tests.unit_tests.fixtures.dataframes import categories_df +from tests.unit_tests.pandas_postprocessing.utils import AGGREGATES_SINGLE def test_pivot_without_columns(): @@ -108,9 +34,9 @@ def test_pivot_without_columns(): index=["name"], aggregates=AGGREGATES_SINGLE, ) - assert df.columns.tolist() == ["name", "idx_nulls"] + assert df.columns.tolist() == ["idx_nulls"] assert len(df) == 101 - assert df.sum()[1] == 1050 + assert df["idx_nulls"].sum() == 1050 def test_pivot_with_single_column(): @@ -123,9 +49,13 @@ def test_pivot_with_single_column(): columns=["category"], aggregates=AGGREGATES_SINGLE, ) - assert df.columns.tolist() == ["name", "cat0", "cat1", "cat2"] + assert df.columns.tolist() == [ + ("idx_nulls", "cat0"), + ("idx_nulls", "cat1"), + ("idx_nulls", "cat2"), + ] assert len(df) == 101 - assert df.sum()[1] == 315 + assert df["idx_nulls"]["cat0"].sum() == 315 df = pivot( df=categories_df, @@ -133,7 +63,11 @@ def test_pivot_with_single_column(): columns=["category"], aggregates=AGGREGATES_SINGLE, ) - assert df.columns.tolist() == ["dept", "cat0", "cat1", "cat2"] + assert df.columns.tolist() == [ + ("idx_nulls", "cat0"), + ("idx_nulls", "cat1"), + ("idx_nulls", "cat2"), + ] assert len(df) == 5 @@ -147,6 +81,7 @@ def test_pivot_with_multiple_columns(): columns=["category", "dept"], aggregates=AGGREGATES_SINGLE, ) + df = flatten(df) assert len(df.columns) == 1 + 3 * 5 # index + possible permutations @@ -161,7 +96,7 @@ def test_pivot_fill_values(): metric_fill_value=1, aggregates={"idx_nulls": {"operator": "sum"}}, ) - assert df.sum()[1] == 382 + assert df["idx_nulls"]["cat0"].sum() == 382 def test_pivot_fill_column_values(): @@ -177,7 +112,7 @@ def test_pivot_fill_column_values(): aggregates={"idx_nulls": {"operator": "sum"}}, ) assert len(df) == 101 - assert df.columns.tolist() == ["name", "<NULL>"] + assert df.columns.tolist() == [("idx_nulls", "<NULL>")] def test_pivot_exceptions(): @@ -234,8 +169,9 @@ def test_pivot_eliminate_cartesian_product_columns(): aggregates={"metric": {"operator": "mean"}}, drop_missing_columns=False, ) - assert list(df.columns) == ["dttm", "0, 0", "1, 1"] - assert np.isnan(df["1, 1"][0]) + df = flatten(df) + assert list(df.columns) == ["dttm", "metric, 0, 0", "metric, 1, 1"] + assert np.isnan(df["metric, 1, 1"][0]) # multiple metrics mock_df = DataFrame( @@ -258,6 +194,7 @@ def test_pivot_eliminate_cartesian_product_columns(): }, drop_missing_columns=False, ) + df = flatten(df) assert list(df.columns) == [ "dttm", "metric, 0, 0", @@ -266,21 +203,3 @@ def test_pivot_eliminate_cartesian_product_columns(): "metric2, 1, 1", ] assert np.isnan(df["metric, 1, 1"][0]) - - -def test_pivot_without_flatten_columns_and_reset_index(): - df = pivot( - df=single_metric_df, - index=["dttm"], - columns=["country"], - aggregates={"sum_metric": {"operator": "sum"}}, - flatten_columns=False, - reset_index=False, - ) - # metric - # country UK US - # dttm - # 2019-01-01 5 6 - # 2019-01-02 7 8 - assert df.columns.to_list() == [("sum_metric", "UK"), ("sum_metric", "US")] - assert df.index.to_list() == to_datetime(["2019-01-01", "2019-01-02"]).to_list() diff --git a/tests/unit_tests/pandas_postprocessing/test_resample.py b/tests/unit_tests/pandas_postprocessing/test_resample.py index 9f1aaef3e62f..b1414c5fe8fd 100644 --- a/tests/unit_tests/pandas_postprocessing/test_resample.py +++ b/tests/unit_tests/pandas_postprocessing/test_resample.py @@ -110,8 +110,6 @@ def test_resample_after_pivot(): aggregates={ "val": {"operator": "sum"}, }, - flatten_columns=False, - reset_index=False, ) """ val diff --git a/tests/unit_tests/pandas_postprocessing/test_rolling.py b/tests/unit_tests/pandas_postprocessing/test_rolling.py index 4d4c4341b895..b72a8bee4482 100644 --- a/tests/unit_tests/pandas_postprocessing/test_rolling.py +++ b/tests/unit_tests/pandas_postprocessing/test_rolling.py @@ -113,8 +113,6 @@ def test_rolling_should_empty_df(): index=["dttm"], columns=["country"], aggregates={"sum_metric": {"operator": "sum"}}, - flatten_columns=False, - reset_index=False, ) rolling_df = pp.rolling( df=pivot_df, @@ -132,8 +130,6 @@ def test_rolling_after_pivot_with_single_metric(): index=["dttm"], columns=["country"], aggregates={"sum_metric": {"operator": "sum"}}, - flatten_columns=False, - reset_index=False, ) """ sum_metric @@ -182,8 +178,6 @@ def test_rolling_after_pivot_with_multiple_metrics(): "sum_metric": {"operator": "sum"}, "count_metric": {"operator": "sum"}, }, - flatten_columns=False, - reset_index=False, ) """ count_metric sum_metric diff --git a/tests/unit_tests/pandas_postprocessing/test_sort.py b/tests/unit_tests/pandas_postprocessing/test_sort.py index c489381ff16f..e19da38efc1e 100644 --- a/tests/unit_tests/pandas_postprocessing/test_sort.py +++ b/tests/unit_tests/pandas_postprocessing/test_sort.py @@ -15,16 +15,39 @@ # specific language governing permissions and limitations # under the License. import pytest +from dateutil.parser import parse from superset.exceptions import InvalidPostProcessingError from superset.utils.pandas_postprocessing import sort -from tests.unit_tests.fixtures.dataframes import categories_df +from tests.unit_tests.fixtures.dataframes import categories_df, timeseries_df from tests.unit_tests.pandas_postprocessing.utils import series_to_list def test_sort(): - df = sort(df=categories_df, columns={"category": True, "asc_idx": False}) + df = sort(df=categories_df, by=["category", "asc_idx"], ascending=[True, False]) assert series_to_list(df["asc_idx"])[1] == 96 + df = sort(df=categories_df.set_index("name"), is_sort_index=True) + assert df.index[0] == "person0" + + df = sort(df=categories_df.set_index("name"), is_sort_index=True, ascending=False) + assert df.index[0] == "person99" + + df = sort(df=categories_df.set_index("name"), by="asc_idx") + assert df["asc_idx"][0] == 0 + + df = sort(df=categories_df.set_index("name"), by="asc_idx", ascending=False) + assert df["asc_idx"][0] == 100 + + df = sort(df=timeseries_df, is_sort_index=True) + assert df.index[0] == parse("2019-01-01") + + df = sort(df=timeseries_df, is_sort_index=True, ascending=False) + assert df.index[0] == parse("2019-01-07") + + df = sort(df=timeseries_df) + assert df.equals(timeseries_df) + with pytest.raises(InvalidPostProcessingError): - sort(df=df, columns={"abc": True}) + sort(df=df, by="abc", ascending=False) + sort(df=df, by=["abc", "def"]) diff --git a/tests/unit_tests/pandas_postprocessing/test_utils.py b/tests/unit_tests/pandas_postprocessing/test_utils.py new file mode 100644 index 000000000000..058cefcd6c72 --- /dev/null +++ b/tests/unit_tests/pandas_postprocessing/test_utils.py @@ -0,0 +1,30 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from superset.utils.pandas_postprocessing import escape_separator, unescape_separator + + +def test_escape_separator(): + assert escape_separator(r" hell \world ") == r" hell \world " + assert unescape_separator(r" hell \world ") == r" hell \world " + + escape_string = escape_separator("hello, world") + assert escape_string == r"hello\, world" + assert unescape_separator(escape_string) == "hello, world" + + escape_string = escape_separator("hello,world") + assert escape_string == r"hello\,world" + assert unescape_separator(escape_string) == "hello,world" diff --git a/tests/unit_tests/result_set_test.py b/tests/unit_tests/result_set_test.py index 80d7ced61ecd..331810bb1ed6 100644 --- a/tests/unit_tests/result_set_test.py +++ b/tests/unit_tests/result_set_test.py @@ -18,7 +18,14 @@ # pylint: disable=import-outside-toplevel, unused-argument -def test_column_names_as_bytes(app_context: None) -> None: +import numpy as np +import pandas as pd +from numpy.core.multiarray import array + +from superset.result_set import stringify_values + + +def test_column_names_as_bytes() -> None: """ Test that we can handle column names as bytes. """ @@ -65,3 +72,71 @@ def test_column_names_as_bytes(app_context: None) -> None: | 1 | 2016-01-27 | 392.444 | 396.843 | 391.782 | 394.972 | 394.972 | 47424400 | """.strip() ) + + +def test_stringify_with_null_integers(): + """ + Test that we can safely handle type errors when an integer column has a null value + """ + + data = [ + ("foo", "bar", pd.NA, None), + ("foo", "bar", pd.NA, True), + ("foo", "bar", pd.NA, None), + ] + numpy_dtype = [ + ("id", "object"), + ("value", "object"), + ("num", "object"), + ("bool", "object"), + ] + + array2 = np.array(data, dtype=numpy_dtype) + column_names = ["id", "value", "num", "bool"] + + result_set = np.array([stringify_values(array2[column]) for column in column_names]) + + expected = np.array( + [ + array(["foo", "foo", "foo"], dtype=object), + array(["bar", "bar", "bar"], dtype=object), + array([None, None, None], dtype=object), + array([None, "True", None], dtype=object), + ] + ) + + assert np.array_equal(result_set, expected) + + +def test_stringify_with_null_timestamps(): + """ + Test that we can safely handle type errors when a timestamp column has a null value + """ + + data = [ + ("foo", "bar", pd.NaT, None), + ("foo", "bar", pd.NaT, True), + ("foo", "bar", pd.NaT, None), + ] + numpy_dtype = [ + ("id", "object"), + ("value", "object"), + ("num", "object"), + ("bool", "object"), + ] + + array2 = np.array(data, dtype=numpy_dtype) + column_names = ["id", "value", "num", "bool"] + + result_set = np.array([stringify_values(array2[column]) for column in column_names]) + + expected = np.array( + [ + array(["foo", "foo", "foo"], dtype=object), + array(["bar", "bar", "bar"], dtype=object), + array([None, None, None], dtype=object), + array([None, "True", None], dtype=object), + ] + ) + + assert np.array_equal(result_set, expected) diff --git a/tests/unit_tests/sql_lab_test.py b/tests/unit_tests/sql_lab_test.py index 9950fb9fedda..29f45eab682a 100644 --- a/tests/unit_tests/sql_lab_test.py +++ b/tests/unit_tests/sql_lab_test.py @@ -63,7 +63,6 @@ def test_execute_sql_statement(mocker: MockerFixture, app: None) -> None: def test_execute_sql_statement_with_rls( mocker: MockerFixture, - app_context: None, ) -> None: """ Test for `execute_sql_statement` when an RLS rule is in place. @@ -118,7 +117,6 @@ def test_execute_sql_statement_with_rls( def test_sql_lab_insert_rls( mocker: MockerFixture, session: Session, - app_context: None, ) -> None: """ Integration test for `insert_rls`. @@ -186,6 +184,7 @@ def test_sql_lab_insert_rls( # now with RLS rls = RowLevelSecurityFilter( + name="sqllab_rls1", filter_type=RowLevelSecurityFilterType.REGULAR, tables=[SqlaTable(database_id=1, schema=None, table_name="t")], roles=[admin.roles[0]], diff --git a/tests/unit_tests/sql_parse_tests.py b/tests/unit_tests/sql_parse_tests.py index 1d2c788496af..ba3da69aaefa 100644 --- a/tests/unit_tests/sql_parse_tests.py +++ b/tests/unit_tests/sql_parse_tests.py @@ -266,13 +266,9 @@ def test_extract_tables_illdefined() -> None: assert extract_tables("SELECT * FROM catalogname..tbname") == set() -@unittest.skip("Requires sqlparse>=3.1") def test_extract_tables_show_tables_from() -> None: """ Test ``SHOW TABLES FROM``. - - This is currently broken in the pinned version of sqlparse, and fixed in - ``sqlparse>=3.1``. However, ``sqlparse==3.1`` breaks some sql formatting. """ assert extract_tables("SHOW TABLES FROM s1 like '%order%'") == set() @@ -679,7 +675,7 @@ def test_extract_tables_nested_select() -> None: """ select (extractvalue(1,concat(0x7e,(select GROUP_CONCAT(COLUMN_NAME) from INFORMATION_SCHEMA.COLUMNS -WHERE TABLE_NAME="bi_achivement_daily"),0x7e))); +WHERE TABLE_NAME="bi_achievement_daily"),0x7e))); """ ) == {Table("COLUMNS", "INFORMATION_SCHEMA")} @@ -1017,15 +1013,15 @@ def test_unknown_select() -> None: Test that `is_select` works when sqlparse fails to identify the type. """ sql = "WITH foo AS(SELECT 1) SELECT 1" - assert sqlparse.parse(sql)[0].get_type() == "UNKNOWN" + assert sqlparse.parse(sql)[0].get_type() == "SELECT" assert ParsedQuery(sql).is_select() sql = "WITH foo AS(SELECT 1) INSERT INTO my_table (a) VALUES (1)" - assert sqlparse.parse(sql)[0].get_type() == "UNKNOWN" + assert sqlparse.parse(sql)[0].get_type() == "INSERT" assert not ParsedQuery(sql).is_select() sql = "WITH foo AS(SELECT 1) DELETE FROM my_table" - assert sqlparse.parse(sql)[0].get_type() == "UNKNOWN" + assert sqlparse.parse(sql)[0].get_type() == "DELETE" assert not ParsedQuery(sql).is_select() @@ -1108,15 +1104,6 @@ def test_messy_breakdown_statements() -> None: def test_sqlparse_formatting(): """ Test that ``from_unixtime`` is formatted correctly. - - ``sqlparse==0.3.1`` has a bug and removes space between ``from`` and - ``from_unixtime``, resulting in:: - - SELECT extract(HOUR - fromfrom_unixtime(hour_ts) - AT TIME ZONE 'America/Los_Angeles') - from table - """ assert sqlparse.format( "SELECT extract(HOUR from from_unixtime(hour_ts) " @@ -1409,7 +1396,6 @@ def get_rls_for_table( candidate: Token, database_id: int, default_schema: str, - username: Optional[str] = None, ) -> Optional[TokenList]: """ Return the RLS ``condition`` if ``candidate`` matches ``table``. @@ -1446,7 +1432,7 @@ def test_add_table_name(rls: str, table: str, expected: str) -> None: assert str(condition) == expected -def test_get_rls_for_table(mocker: MockerFixture, app_context: None) -> None: +def test_get_rls_for_table(mocker: MockerFixture) -> None: """ Tests for ``get_rls_for_table``. """ diff --git a/tests/unit_tests/tables/test_models.py b/tests/unit_tests/tables/test_models.py index 56ca5ba82fbf..7705dba6aa09 100644 --- a/tests/unit_tests/tables/test_models.py +++ b/tests/unit_tests/tables/test_models.py @@ -20,7 +20,7 @@ from sqlalchemy.orm.session import Session -def test_table_model(app_context: None, session: Session) -> None: +def test_table_model(session: Session) -> None: """ Test basic attributes of a ``Table``. """ diff --git a/tests/unit_tests/tasks/__init__.py b/tests/unit_tests/tasks/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/unit_tests/tasks/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/unit_tests/tasks/test_cron_util.py b/tests/unit_tests/tasks/test_cron_util.py index 9042ccad5853..d0f9ae21705e 100644 --- a/tests/unit_tests/tasks/test_cron_util.py +++ b/tests/unit_tests/tasks/test_cron_util.py @@ -20,7 +20,6 @@ import pytest import pytz from dateutil import parser -from flask.ctx import AppContext from freezegun import freeze_time from freezegun.api import FakeDatetime # type: ignore @@ -50,7 +49,7 @@ ], ) def test_cron_schedule_window_los_angeles( - app_context: AppContext, current_dttm: str, cron: str, expected: List[FakeDatetime] + current_dttm: str, cron: str, expected: List[FakeDatetime] ) -> None: """ Reports scheduler: Test cron schedule window for "America/Los_Angeles" @@ -87,7 +86,7 @@ def test_cron_schedule_window_los_angeles( ], ) def test_cron_schedule_window_invalid_timezone( - app_context: AppContext, current_dttm: str, cron: str, expected: List[FakeDatetime] + current_dttm: str, cron: str, expected: List[FakeDatetime] ) -> None: """ Reports scheduler: Test cron schedule window for "invalid timezone" @@ -125,7 +124,7 @@ def test_cron_schedule_window_invalid_timezone( ], ) def test_cron_schedule_window_new_york( - app_context: AppContext, current_dttm: str, cron: str, expected: List[FakeDatetime] + current_dttm: str, cron: str, expected: List[FakeDatetime] ) -> None: """ Reports scheduler: Test cron schedule window for "America/New_York" @@ -162,7 +161,7 @@ def test_cron_schedule_window_new_york( ], ) def test_cron_schedule_window_chicago( - app_context: AppContext, current_dttm: str, cron: str, expected: List[FakeDatetime] + current_dttm: str, cron: str, expected: List[FakeDatetime] ) -> None: """ Reports scheduler: Test cron schedule window for "America/Chicago" @@ -199,7 +198,7 @@ def test_cron_schedule_window_chicago( ], ) def test_cron_schedule_window_chicago_daylight( - app_context: AppContext, current_dttm: str, cron: str, expected: List[FakeDatetime] + current_dttm: str, cron: str, expected: List[FakeDatetime] ) -> None: """ Reports scheduler: Test cron schedule window for "America/Chicago" diff --git a/tests/unit_tests/tasks/test_utils.py b/tests/unit_tests/tasks/test_utils.py new file mode 100644 index 000000000000..785471720122 --- /dev/null +++ b/tests/unit_tests/tasks/test_utils.py @@ -0,0 +1,323 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from contextlib import nullcontext +from dataclasses import dataclass +from enum import Enum +from typing import Any, Dict, List, Optional, Tuple, Type, Union + +import pytest +from flask_appbuilder.security.sqla.models import User + +from superset.tasks.exceptions import ExecutorNotFoundError +from superset.tasks.types import ExecutorType + +SELENIUM_USER_ID = 1234 +SELENIUM_USERNAME = "admin" + + +def _get_users( + params: Optional[Union[int, List[int]]] +) -> Optional[Union[User, List[User]]]: + if params is None: + return None + if isinstance(params, int): + return User(id=params, username=str(params)) + return [User(id=user, username=str(user)) for user in params] + + +@dataclass +class ModelConfig: + owners: List[int] + creator: Optional[int] = None + modifier: Optional[int] = None + + +class ModelType(int, Enum): + DASHBOARD = 1 + CHART = 2 + REPORT_SCHEDULE = 3 + + +@pytest.mark.parametrize( + "model_type,executor_types,model_config,current_user,expected_result", + [ + ( + ModelType.REPORT_SCHEDULE, + [ExecutorType.SELENIUM], + ModelConfig( + owners=[1, 2], + creator=3, + modifier=4, + ), + None, + (ExecutorType.SELENIUM, SELENIUM_USER_ID), + ), + ( + ModelType.REPORT_SCHEDULE, + [ + ExecutorType.CREATOR, + ExecutorType.CREATOR_OWNER, + ExecutorType.OWNER, + ExecutorType.MODIFIER, + ExecutorType.MODIFIER_OWNER, + ExecutorType.SELENIUM, + ], + ModelConfig(owners=[]), + None, + (ExecutorType.SELENIUM, SELENIUM_USER_ID), + ), + ( + ModelType.REPORT_SCHEDULE, + [ + ExecutorType.CREATOR, + ExecutorType.CREATOR_OWNER, + ExecutorType.OWNER, + ExecutorType.MODIFIER, + ExecutorType.MODIFIER_OWNER, + ExecutorType.SELENIUM, + ], + ModelConfig(owners=[], modifier=1), + None, + (ExecutorType.MODIFIER, 1), + ), + ( + ModelType.REPORT_SCHEDULE, + [ + ExecutorType.CREATOR, + ExecutorType.CREATOR_OWNER, + ExecutorType.OWNER, + ExecutorType.MODIFIER, + ExecutorType.MODIFIER_OWNER, + ExecutorType.SELENIUM, + ], + ModelConfig(owners=[2], modifier=1), + None, + (ExecutorType.OWNER, 2), + ), + ( + ModelType.REPORT_SCHEDULE, + [ + ExecutorType.CREATOR, + ExecutorType.CREATOR_OWNER, + ExecutorType.OWNER, + ExecutorType.MODIFIER, + ExecutorType.MODIFIER_OWNER, + ExecutorType.SELENIUM, + ], + ModelConfig(owners=[2], creator=3, modifier=1), + None, + (ExecutorType.CREATOR, 3), + ), + ( + ModelType.REPORT_SCHEDULE, + [ + ExecutorType.OWNER, + ], + ModelConfig(owners=[1, 2, 3, 4, 5, 6, 7], creator=3, modifier=4), + None, + (ExecutorType.OWNER, 4), + ), + ( + ModelType.REPORT_SCHEDULE, + [ + ExecutorType.OWNER, + ], + ModelConfig(owners=[1, 2, 3, 4, 5, 6, 7], creator=3, modifier=8), + None, + (ExecutorType.OWNER, 3), + ), + ( + ModelType.REPORT_SCHEDULE, + [ + ExecutorType.MODIFIER_OWNER, + ], + ModelConfig(owners=[1, 2, 3, 4, 5, 6, 7], creator=8, modifier=9), + None, + ExecutorNotFoundError(), + ), + ( + ModelType.REPORT_SCHEDULE, + [ + ExecutorType.MODIFIER_OWNER, + ], + ModelConfig(owners=[1, 2, 3, 4, 5, 6, 7], creator=8, modifier=4), + None, + (ExecutorType.MODIFIER_OWNER, 4), + ), + ( + ModelType.REPORT_SCHEDULE, + [ + ExecutorType.CREATOR_OWNER, + ], + ModelConfig(owners=[1, 2, 3, 4, 5, 6, 7], creator=8, modifier=9), + None, + ExecutorNotFoundError(), + ), + ( + ModelType.REPORT_SCHEDULE, + [ + ExecutorType.CREATOR_OWNER, + ], + ModelConfig(owners=[1, 2, 3, 4, 5, 6, 7], creator=4, modifier=8), + None, + (ExecutorType.CREATOR_OWNER, 4), + ), + ( + ModelType.REPORT_SCHEDULE, + [ + ExecutorType.CURRENT_USER, + ], + ModelConfig(owners=[1, 2, 3, 4, 5, 6, 7], creator=4, modifier=8), + None, + ExecutorNotFoundError(), + ), + ( + ModelType.DASHBOARD, + [ + ExecutorType.CURRENT_USER, + ], + ModelConfig(owners=[1], creator=2, modifier=3), + 4, + (ExecutorType.CURRENT_USER, 4), + ), + ( + ModelType.DASHBOARD, + [ + ExecutorType.SELENIUM, + ], + ModelConfig(owners=[1], creator=2, modifier=3), + 4, + (ExecutorType.SELENIUM, SELENIUM_USER_ID), + ), + ( + ModelType.DASHBOARD, + [ + ExecutorType.CURRENT_USER, + ], + ModelConfig(owners=[1], creator=2, modifier=3), + None, + ExecutorNotFoundError(), + ), + ( + ModelType.DASHBOARD, + [ + ExecutorType.CREATOR_OWNER, + ExecutorType.MODIFIER_OWNER, + ExecutorType.CURRENT_USER, + ExecutorType.SELENIUM, + ], + ModelConfig(owners=[1], creator=2, modifier=3), + None, + (ExecutorType.SELENIUM, SELENIUM_USER_ID), + ), + ( + ModelType.CHART, + [ + ExecutorType.CURRENT_USER, + ], + ModelConfig(owners=[1], creator=2, modifier=3), + 4, + (ExecutorType.CURRENT_USER, 4), + ), + ( + ModelType.CHART, + [ + ExecutorType.SELENIUM, + ], + ModelConfig(owners=[1], creator=2, modifier=3), + 4, + (ExecutorType.SELENIUM, SELENIUM_USER_ID), + ), + ( + ModelType.CHART, + [ + ExecutorType.CURRENT_USER, + ], + ModelConfig(owners=[1], creator=2, modifier=3), + None, + ExecutorNotFoundError(), + ), + ( + ModelType.CHART, + [ + ExecutorType.CREATOR_OWNER, + ExecutorType.MODIFIER_OWNER, + ExecutorType.CURRENT_USER, + ExecutorType.SELENIUM, + ], + ModelConfig(owners=[1], creator=2, modifier=3), + None, + (ExecutorType.SELENIUM, SELENIUM_USER_ID), + ), + ], +) +def test_get_executor( + model_type: ModelType, + executor_types: List[ExecutorType], + model_config: ModelConfig, + current_user: Optional[int], + expected_result: Tuple[int, ExecutorNotFoundError], +) -> None: + from superset.models.dashboard import Dashboard + from superset.models.slice import Slice + from superset.reports.models import ReportSchedule + from superset.tasks.utils import get_executor + + model: Type[Union[Dashboard, ReportSchedule, Slice]] + model_kwargs: Dict[str, Any] = {} + if model_type == ModelType.REPORT_SCHEDULE: + model = ReportSchedule + model_kwargs = { + "type": "report", + "name": "test_report", + } + elif model_type == ModelType.DASHBOARD: + model = Dashboard + elif model_type == ModelType.CHART: + model = Slice + else: + raise Exception(f"Unsupported model type: {model_type}") + + obj = model( + id=1, + owners=_get_users(model_config.owners), + created_by=_get_users(model_config.creator), + changed_by=_get_users(model_config.modifier), + **model_kwargs, + ) + if isinstance(expected_result, Exception): + cm = pytest.raises(type(expected_result)) + expected_executor_type = None + expected_executor = None + else: + cm = nullcontext() + expected_executor_type = expected_result[0] + expected_executor = ( + SELENIUM_USERNAME + if expected_executor_type == ExecutorType.SELENIUM + else str(expected_result[1]) + ) + + with cm: + executor_type, executor = get_executor( + executor_types=executor_types, + model=obj, + current_user=str(current_user) if current_user else None, + ) + assert executor_type == expected_executor_type + assert executor == expected_executor diff --git a/tests/unit_tests/test_jinja_context.py b/tests/unit_tests/test_jinja_context.py index 7c301c88ea3e..8704b1d65c21 100644 --- a/tests/unit_tests/test_jinja_context.py +++ b/tests/unit_tests/test_jinja_context.py @@ -18,7 +18,6 @@ from typing import Any import pytest -from flask.ctx import AppContext from sqlalchemy.dialects.postgresql import dialect from superset import app @@ -26,30 +25,30 @@ from superset.jinja_context import ExtraCache, safe_proxy -def test_filter_values_default(app_context: AppContext) -> None: +def test_filter_values_default() -> None: cache = ExtraCache() assert cache.filter_values("name", "foo") == ["foo"] assert cache.removed_filters == [] -def test_filter_values_remove_not_present(app_context: AppContext) -> None: +def test_filter_values_remove_not_present() -> None: cache = ExtraCache() assert cache.filter_values("name", remove_filter=True) == [] assert cache.removed_filters == [] -def test_get_filters_remove_not_present(app_context: AppContext) -> None: +def test_get_filters_remove_not_present() -> None: cache = ExtraCache() assert cache.get_filters("name", remove_filter=True) == [] assert cache.removed_filters == [] -def test_filter_values_no_default(app_context: AppContext) -> None: +def test_filter_values_no_default() -> None: cache = ExtraCache() assert cache.filter_values("name") == [] -def test_filter_values_adhoc_filters(app_context: AppContext) -> None: +def test_filter_values_adhoc_filters() -> None: with app.test_request_context( data={ "form_data": json.dumps( @@ -93,7 +92,7 @@ def test_filter_values_adhoc_filters(app_context: AppContext) -> None: assert cache.applied_filters == ["name"] -def test_get_filters_adhoc_filters(app_context: AppContext) -> None: +def test_get_filters_adhoc_filters() -> None: with app.test_request_context( data={ "form_data": json.dumps( @@ -167,7 +166,7 @@ def test_get_filters_adhoc_filters(app_context: AppContext) -> None: assert cache.applied_filters == ["name"] -def test_filter_values_extra_filters(app_context: AppContext) -> None: +def test_filter_values_extra_filters() -> None: with app.test_request_context( data={ "form_data": json.dumps( @@ -180,25 +179,25 @@ def test_filter_values_extra_filters(app_context: AppContext) -> None: assert cache.applied_filters == ["name"] -def test_url_param_default(app_context: AppContext) -> None: +def test_url_param_default() -> None: with app.test_request_context(): cache = ExtraCache() assert cache.url_param("foo", "bar") == "bar" -def test_url_param_no_default(app_context: AppContext) -> None: +def test_url_param_no_default() -> None: with app.test_request_context(): cache = ExtraCache() assert cache.url_param("foo") is None -def test_url_param_query(app_context: AppContext) -> None: +def test_url_param_query() -> None: with app.test_request_context(query_string={"foo": "bar"}): cache = ExtraCache() assert cache.url_param("foo") == "bar" -def test_url_param_form_data(app_context: AppContext) -> None: +def test_url_param_form_data() -> None: with app.test_request_context( query_string={"form_data": json.dumps({"url_params": {"foo": "bar"}})} ): @@ -206,7 +205,7 @@ def test_url_param_form_data(app_context: AppContext) -> None: assert cache.url_param("foo") == "bar" -def test_url_param_escaped_form_data(app_context: AppContext) -> None: +def test_url_param_escaped_form_data() -> None: with app.test_request_context( query_string={"form_data": json.dumps({"url_params": {"foo": "O'Brien"}})} ): @@ -214,7 +213,7 @@ def test_url_param_escaped_form_data(app_context: AppContext) -> None: assert cache.url_param("foo") == "O''Brien" -def test_url_param_escaped_default_form_data(app_context: AppContext) -> None: +def test_url_param_escaped_default_form_data() -> None: with app.test_request_context( query_string={"form_data": json.dumps({"url_params": {"foo": "O'Brien"}})} ): @@ -222,7 +221,7 @@ def test_url_param_escaped_default_form_data(app_context: AppContext) -> None: assert cache.url_param("bar", "O'Malley") == "O''Malley" -def test_url_param_unescaped_form_data(app_context: AppContext) -> None: +def test_url_param_unescaped_form_data() -> None: with app.test_request_context( query_string={"form_data": json.dumps({"url_params": {"foo": "O'Brien"}})} ): @@ -230,7 +229,7 @@ def test_url_param_unescaped_form_data(app_context: AppContext) -> None: assert cache.url_param("foo", escape_result=False) == "O'Brien" -def test_url_param_unescaped_default_form_data(app_context: AppContext) -> None: +def test_url_param_unescaped_default_form_data() -> None: with app.test_request_context( query_string={"form_data": json.dumps({"url_params": {"foo": "O'Brien"}})} ): @@ -238,21 +237,21 @@ def test_url_param_unescaped_default_form_data(app_context: AppContext) -> None: assert cache.url_param("bar", "O'Malley", escape_result=False) == "O'Malley" -def test_safe_proxy_primitive(app_context: AppContext) -> None: +def test_safe_proxy_primitive() -> None: def func(input_: Any) -> Any: return input_ assert safe_proxy(func, "foo") == "foo" -def test_safe_proxy_dict(app_context: AppContext) -> None: +def test_safe_proxy_dict() -> None: def func(input_: Any) -> Any: return input_ assert safe_proxy(func, {"foo": "bar"}) == {"foo": "bar"} -def test_safe_proxy_lambda(app_context: AppContext) -> None: +def test_safe_proxy_lambda() -> None: def func(input_: Any) -> Any: return input_ @@ -260,7 +259,7 @@ def func(input_: Any) -> Any: safe_proxy(func, lambda: "bar") -def test_safe_proxy_nested_lambda(app_context: AppContext) -> None: +def test_safe_proxy_nested_lambda() -> None: def func(input_: Any) -> Any: return input_ diff --git a/tests/unit_tests/thumbnails/__init__.py b/tests/unit_tests/thumbnails/__init__.py new file mode 100644 index 000000000000..13a83393a912 --- /dev/null +++ b/tests/unit_tests/thumbnails/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/tests/unit_tests/thumbnails/test_digest.py b/tests/unit_tests/thumbnails/test_digest.py new file mode 100644 index 000000000000..04f244e629b5 --- /dev/null +++ b/tests/unit_tests/thumbnails/test_digest.py @@ -0,0 +1,258 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from __future__ import annotations + +from contextlib import nullcontext +from typing import Any, Dict, List, Optional, TYPE_CHECKING, Union +from unittest.mock import patch + +import pytest +from flask_appbuilder.security.sqla.models import User + +from superset.tasks.exceptions import ExecutorNotFoundError +from superset.tasks.types import ExecutorType +from superset.utils.core import override_user + +if TYPE_CHECKING: + from superset.models.dashboard import Dashboard + from superset.models.slice import Slice + +_DEFAULT_DASHBOARD_KWARGS: Dict[str, Any] = { + "id": 1, + "dashboard_title": "My Title", + "slices": [{"id": 1, "slice_name": "My Chart"}], + "position_json": '{"a": "b"}', + "css": "background-color: lightblue;", + "json_metadata": '{"c": "d"}', +} + +_DEFAULT_CHART_KWARGS = { + "id": 2, + "params": {"a": "b"}, +} + + +def CUSTOM_DASHBOARD_FUNC( + dashboard: Dashboard, + executor_type: ExecutorType, + executor: str, +) -> str: + return f"{dashboard.id}.{executor_type.value}.{executor}" + + +def CUSTOM_CHART_FUNC( + chart: Slice, + executor_type: ExecutorType, + executor: str, +) -> str: + return f"{chart.id}.{executor_type.value}.{executor}" + + +@pytest.mark.parametrize( + "dashboard_overrides,execute_as,has_current_user,use_custom_digest,expected_result", + [ + ( + None, + [ExecutorType.SELENIUM], + False, + False, + "71452fee8ffbd8d340193d611bcd4559", + ), + ( + None, + [ExecutorType.CURRENT_USER], + True, + False, + "209dc060ac19271b8708731e3b8280f5", + ), + ( + { + "dashboard_title": "My Other Title", + }, + [ExecutorType.CURRENT_USER], + True, + False, + "209dc060ac19271b8708731e3b8280f5", + ), + ( + { + "id": 2, + }, + [ExecutorType.CURRENT_USER], + True, + False, + "06a4144466dbd5ffad0c3c2225e96296", + ), + ( + { + "slices": [{"id": 2, "slice_name": "My Other Chart"}], + }, + [ExecutorType.CURRENT_USER], + True, + False, + "a823ece9563895ccb14f3d9095e84f7a", + ), + ( + { + "position_json": {"b": "c"}, + }, + [ExecutorType.CURRENT_USER], + True, + False, + "33c5475f92a904925ab3ef493526e5b5", + ), + ( + { + "css": "background-color: darkblue;", + }, + [ExecutorType.CURRENT_USER], + True, + False, + "cec57345e6402c0d4b3caee5cfaa0a03", + ), + ( + { + "json_metadata": {"d": "e"}, + }, + [ExecutorType.CURRENT_USER], + True, + False, + "5380dcbe94621a0759b09554404f3d02", + ), + ( + None, + [ExecutorType.CURRENT_USER], + True, + True, + "1.current_user.1", + ), + ( + None, + [ExecutorType.CURRENT_USER], + False, + False, + ExecutorNotFoundError(), + ), + ], +) +def test_dashboard_digest( + dashboard_overrides: Optional[Dict[str, Any]], + execute_as: List[ExecutorType], + has_current_user: bool, + use_custom_digest: bool, + expected_result: Union[str, Exception], +) -> None: + from superset import app + from superset.models.dashboard import Dashboard + from superset.models.slice import Slice + from superset.thumbnails.digest import get_dashboard_digest + + kwargs = { + **_DEFAULT_DASHBOARD_KWARGS, + **(dashboard_overrides or {}), + } + slices = [Slice(**slice_kwargs) for slice_kwargs in kwargs.pop("slices")] + dashboard = Dashboard(**kwargs, slices=slices) + user: Optional[User] = None + if has_current_user: + user = User(id=1, username="1") + func = CUSTOM_DASHBOARD_FUNC if use_custom_digest else None + + with patch.dict( + app.config, + { + "THUMBNAIL_EXECUTE_AS": execute_as, + "THUMBNAIL_DASHBOARD_DIGEST_FUNC": func, + }, + ), override_user(user): + cm = ( + pytest.raises(type(expected_result)) + if isinstance(expected_result, Exception) + else nullcontext() + ) + with cm: + assert get_dashboard_digest(dashboard=dashboard) == expected_result + + +@pytest.mark.parametrize( + "chart_overrides,execute_as,has_current_user,use_custom_digest,expected_result", + [ + ( + None, + [ExecutorType.SELENIUM], + False, + False, + "47d852b5c4df211c115905617bb722c1", + ), + ( + None, + [ExecutorType.CURRENT_USER], + True, + False, + "4f8109d3761e766e650af514bb358f10", + ), + ( + None, + [ExecutorType.CURRENT_USER], + True, + True, + "2.current_user.1", + ), + ( + None, + [ExecutorType.CURRENT_USER], + False, + False, + ExecutorNotFoundError(), + ), + ], +) +def test_chart_digest( + chart_overrides: Optional[Dict[str, Any]], + execute_as: List[ExecutorType], + has_current_user: bool, + use_custom_digest: bool, + expected_result: Union[str, Exception], +) -> None: + from superset import app + from superset.models.slice import Slice + from superset.thumbnails.digest import get_chart_digest + + kwargs = { + **_DEFAULT_CHART_KWARGS, + **(chart_overrides or {}), + } + chart = Slice(**kwargs) + user: Optional[User] = None + if has_current_user: + user = User(id=1, username="1") + func = CUSTOM_CHART_FUNC if use_custom_digest else None + + with patch.dict( + app.config, + { + "THUMBNAIL_EXECUTE_AS": execute_as, + "THUMBNAIL_CHART_DIGEST_FUNC": func, + }, + ), override_user(user): + cm = ( + pytest.raises(type(expected_result)) + if isinstance(expected_result, Exception) + else nullcontext() + ) + with cm: + assert get_chart_digest(chart=chart) == expected_result diff --git a/tests/unit_tests/utils/cache_test.py b/tests/unit_tests/utils/cache_test.py index 7c1354aa3cb3..53650e1d2032 100644 --- a/tests/unit_tests/utils/cache_test.py +++ b/tests/unit_tests/utils/cache_test.py @@ -21,7 +21,7 @@ from pytest_mock import MockerFixture -def test_memoized_func(app_context: None, mocker: MockerFixture) -> None: +def test_memoized_func(mocker: MockerFixture) -> None: """ Test the ``memoized_func`` decorator. """ diff --git a/tests/unit_tests/utils/date_parser_tests.py b/tests/unit_tests/utils/date_parser_tests.py index e5b3eebd99ba..f3c8b6968077 100644 --- a/tests/unit_tests/utils/date_parser_tests.py +++ b/tests/unit_tests/utils/date_parser_tests.py @@ -163,7 +163,7 @@ def test_datetime_eval() -> None: expected = datetime(2016, 11, 7, 9, 30, 10) assert result == expected - result = datetime_eval("datetime('today' )") + result = datetime_eval("datetime('today')") expected = datetime(2016, 11, 7) assert result == expected @@ -308,7 +308,7 @@ def test_get_past_or_future() -> None: def test_parse_human_datetime() -> None: with pytest.raises(TimeRangeAmbiguousError): - parse_human_datetime(" 2 days ") + parse_human_datetime("2 days") with pytest.raises(TimeRangeAmbiguousError): parse_human_datetime("2 day") diff --git a/tests/integration_tests/db_engine_specs/impala_tests.py b/tests/unit_tests/utils/log_tests.py similarity index 62% rename from tests/integration_tests/db_engine_specs/impala_tests.py rename to tests/unit_tests/utils/log_tests.py index 936ace98be39..5b031b577887 100644 --- a/tests/integration_tests/db_engine_specs/impala_tests.py +++ b/tests/unit_tests/utils/log_tests.py @@ -14,19 +14,24 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -from superset.db_engine_specs.impala import ImpalaEngineSpec -from tests.integration_tests.db_engine_specs.base_tests import TestDbEngineSpec -class TestImpalaDbEngineSpec(TestDbEngineSpec): - def test_convert_dttm(self): - dttm = self.get_dttm() +from superset.utils.log import get_logger_from_status - self.assertEqual( - ImpalaEngineSpec.convert_dttm("DATE", dttm), "CAST('2019-01-02' AS DATE)" - ) - self.assertEqual( - ImpalaEngineSpec.convert_dttm("TIMESTAMP", dttm), - "CAST('2019-01-02T03:04:05.678900' AS TIMESTAMP)", - ) +def test_log_from_status_exception() -> None: + (func, log_level) = get_logger_from_status(500) + assert func.__name__ == "exception" + assert log_level == "exception" + + +def test_log_from_status_warning() -> None: + (func, log_level) = get_logger_from_status(422) + assert func.__name__ == "warning" + assert log_level == "warning" + + +def test_log_from_status_info() -> None: + (func, log_level) = get_logger_from_status(300) + assert func.__name__ == "info" + assert log_level == "info" diff --git a/tests/unit_tests/utils/test_core.py b/tests/unit_tests/utils/test_core.py new file mode 100644 index 000000000000..6845bb2fc154 --- /dev/null +++ b/tests/unit_tests/utils/test_core.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from typing import Any, Dict + +import pytest + +from superset.utils.core import QueryObjectFilterClause, remove_extra_adhoc_filters + +ADHOC_FILTER: QueryObjectFilterClause = { + "col": "foo", + "op": "==", + "val": "bar", +} + +EXTRA_FILTER: QueryObjectFilterClause = { + "col": "foo", + "op": "==", + "val": "bar", + "isExtra": True, +} + + +@pytest.mark.parametrize( + "original,expected", + [ + ({"foo": "bar"}, {"foo": "bar"}), + ( + {"foo": "bar", "adhoc_filters": [ADHOC_FILTER]}, + {"foo": "bar", "adhoc_filters": [ADHOC_FILTER]}, + ), + ( + {"foo": "bar", "adhoc_filters": [EXTRA_FILTER]}, + {"foo": "bar", "adhoc_filters": []}, + ), + ( + { + "foo": "bar", + "adhoc_filters": [ADHOC_FILTER, EXTRA_FILTER], + }, + {"foo": "bar", "adhoc_filters": [ADHOC_FILTER]}, + ), + ( + { + "foo": "bar", + "adhoc_filters_b": [ADHOC_FILTER, EXTRA_FILTER], + }, + {"foo": "bar", "adhoc_filters_b": [ADHOC_FILTER]}, + ), + ( + { + "foo": "bar", + "custom_adhoc_filters": [ + ADHOC_FILTER, + EXTRA_FILTER, + ], + }, + { + "foo": "bar", + "custom_adhoc_filters": [ + ADHOC_FILTER, + EXTRA_FILTER, + ], + }, + ), + ], +) +def test_remove_extra_adhoc_filters( + original: Dict[str, Any], expected: Dict[str, Any] +) -> None: + remove_extra_adhoc_filters(original) + assert expected == original diff --git a/tests/unit_tests/utils/test_decorators.py b/tests/unit_tests/utils/test_decorators.py new file mode 100644 index 000000000000..3aafc7a91db2 --- /dev/null +++ b/tests/unit_tests/utils/test_decorators.py @@ -0,0 +1,87 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + +from contextlib import nullcontext +from enum import Enum +from inspect import isclass +from typing import Any, Optional +from unittest.mock import call, Mock, patch + +import pytest + +from superset import app +from superset.utils import decorators + + +class ResponseValues(str, Enum): + FAIL = "fail" + WARN = "warn" + OK = "ok" + + +def test_debounce() -> None: + mock = Mock() + + @decorators.debounce() + def myfunc(arg1: int, arg2: int, kwarg1: str = "abc", kwarg2: int = 2) -> int: + mock(arg1, kwarg1) + return arg1 + arg2 + kwarg2 + + # should be called only once when arguments don't change + myfunc(1, 1) + myfunc(1, 1) + result = myfunc(1, 1) + mock.assert_called_once_with(1, "abc") + assert result == 4 + + # kwarg order shouldn't matter + myfunc(1, 0, kwarg2=2, kwarg1="haha") + result = myfunc(1, 0, kwarg1="haha", kwarg2=2) + mock.assert_has_calls([call(1, "abc"), call(1, "haha")]) + assert result == 3 + + +@pytest.mark.parametrize( + "response_value, expected_exception, expected_result", + [ + (ResponseValues.OK, None, "custom.prefix.ok"), + (ResponseValues.FAIL, ValueError, "custom.prefix.error"), + (ResponseValues.WARN, FileNotFoundError, "custom.prefix.warn"), + ], +) +def test_statsd_gauge( + response_value: str, expected_exception: Optional[Exception], expected_result: str +) -> None: + @decorators.statsd_gauge("custom.prefix") + def my_func(response: ResponseValues, *args: Any, **kwargs: Any) -> str: + if response == ResponseValues.FAIL: + raise ValueError("Error") + if response == ResponseValues.WARN: + raise FileNotFoundError("Not found") + return "OK" + + with patch.object(app.config["STATS_LOGGER"], "gauge") as mock: + cm = ( + pytest.raises(expected_exception) + if isclass(expected_exception) and issubclass(expected_exception, Exception) + else nullcontext() + ) + + with cm: + my_func(response_value, 1, 2) + mock.assert_called_once_with(expected_result, 1) diff --git a/tests/unit_tests/utils/test_file.py b/tests/unit_tests/utils/test_file.py new file mode 100644 index 000000000000..de20402e5c21 --- /dev/null +++ b/tests/unit_tests/utils/test_file.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import pytest + +from superset.utils.file import get_filename + + +@pytest.mark.parametrize( + "model_name,model_id,skip_id,expected_filename", + [ + ("Energy Sankey", 132, False, "Energy_Sankey_132"), + ("Energy Sankey", 132, True, "Energy_Sankey"), + ("folder1/Energy Sankey", 132, True, "folder1_Energy_Sankey"), + ("D:\\Charts\\Energy Sankey", 132, True, "DChartsEnergy_Sankey"), + ("🥴🥴🥴", 4751, False, "4751"), + ("🥴🥴🥴", 4751, True, "4751"), + ("Energy Sankey 🥴🥴🥴", 4751, False, "Energy_Sankey_4751"), + ("Energy Sankey 🥴🥴🥴", 4751, True, "Energy_Sankey"), + ("你好", 475, False, "475"), + ("你好", 475, True, "475"), + ("Energy Sankey 你好", 475, False, "Energy_Sankey_475"), + ("Energy Sankey 你好", 475, True, "Energy_Sankey"), + ], +) +def test_get_filename( + model_name: str, model_id: int, skip_id: bool, expected_filename: str +) -> None: + original_filename = get_filename(model_name, model_id, skip_id) + assert expected_filename == original_filename diff --git a/tests/unit_tests/utils/urls_tests.py b/tests/unit_tests/utils/urls_tests.py index 59c7841b5d90..208d6caea437 100644 --- a/tests/unit_tests/utils/urls_tests.py +++ b/tests/unit_tests/utils/urls_tests.py @@ -19,7 +19,7 @@ from superset.utils.urls import modify_url_query -EXPLORE_CHART_LINK = "http://localhost:9000/superset/explore/?form_data=%7B%22slice_id%22%3A+76%7D&standalone=true&force=false" +EXPLORE_CHART_LINK = "http://localhost:9000/explore/?form_data=%7B%22slice_id%22%3A+76%7D&standalone=true&force=false" EXPLORE_DASHBOARD_LINK = "http://localhost:9000/superset/dashboard/3/?standalone=3" @@ -28,7 +28,7 @@ def test_convert_chart_link() -> None: test_url = modify_url_query(EXPLORE_CHART_LINK, standalone="0") assert ( test_url - == "http://localhost:9000/superset/explore/?form_data=%7B%22slice_id%22%3A%2076%7D&standalone=0&force=false" + == "http://localhost:9000/explore/?form_data=%7B%22slice_id%22%3A%2076%7D&standalone=0&force=false" ) @@ -37,6 +37,11 @@ def test_convert_dashboard_link() -> None: assert test_url == "http://localhost:9000/superset/dashboard/3/?standalone=0" +def test_convert_dashboard_link_with_integer() -> None: + test_url = modify_url_query(EXPLORE_DASHBOARD_LINK, standalone=0) + assert test_url == "http://localhost:9000/superset/dashboard/3/?standalone=0" + + @pytest.mark.parametrize( "url,is_safe", [ @@ -53,7 +58,7 @@ def test_convert_dashboard_link() -> None: ("xpto://localhost:[3/1/", False), ], ) -def test_is_safe_url(app_context: None, url: str, is_safe: bool) -> None: +def test_is_safe_url(url: str, is_safe: bool) -> None: from superset import app from superset.utils.urls import is_safe_url